ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5MWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsOTMgQEAKKyMKKyMgICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCwgSW5jLgorIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBUaGlzIGRvY3VtZW50IGlzIHRoZSBwcm9wZXJ0eSBvZiBOZXN0LiBJdCBpcyBjb25zaWRlcmVkCisjICAgIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24uCisjCisjICAgIFRoaXMgZG9jdW1lbnQgbWF5IG5vdCBiZSByZXByb2R1Y2VkIG9yIHRyYW5zbWl0dGVkIGluIGFueSBmb3JtLAorIyAgICBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZgorIyAgICBOZXN0LgorIworIyAgICBEZXNjcmlwdGlvbjoKKyMgICAgICBUaGlzIGZpbGUgaXMgdGhlIG1ha2VmaWxlIGZvciBlbWJlZGRlZCBMaW51eCAiU3dpc3MgQXJteSBLbmlmZSIKKyMgICAgICBhcHBsaWNhdGlvbiwgQnVzeUJveC4KKyMKKworaW5jbHVkZSBwcmUubWFrCisKK1BhY2thZ2VOYW1lCQk6PSBidXN5Ym94CisKK1BhY2thZ2VFeHRlbnNpb24JOj0gdGFyLmJ6MgorUGFja2FnZVNlcGFyYXRvcgk6PSAtCisKK1BhY2thZ2VQYXRjaEFyZ3MJOj0gLXAxCisKK1BhY2thZ2VBcmNoaXZlCQk6PSAkKFBhY2thZ2VOYW1lKS4kKFBhY2thZ2VFeHRlbnNpb24pCitQYWNrYWdlU291cmNlRGlyCTo9ICQoUGFja2FnZU5hbWUpJChQYWNrYWdlU2VwYXJhdG9yKSQoUGFja2FnZVZlcnNpb24pCisKK1BhY2thZ2VCdWlsZE1ha2VmaWxlCT0gJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxNYWtlZmlsZSkKKworQ2xlYW5QYXRocwkJKz0gJChQYWNrYWdlTGljZW5zZUZpbGUpCisKK2FsbDogJChQYWNrYWdlRGVmYXVsdEdvYWwpCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgbGljZW5zZSBjb250ZW50cy4KKworJChQYWNrYWdlU291cmNlRGlyKS9MSUNFTlNFOiBzb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL0xJQ0VOU0UKKwkkKGNvcHktcmVzdWx0KQorCisjIEV4dHJhY3QgdGhlIHNvdXJjZSBmcm9tIHRoZSBhcmNoaXZlIGFuZCBhcHBseSBwYXRjaGVzLCBpZiBhbnkuCisKKyQoUGFja2FnZVNvdXJjZURpcik6ICQoUGFja2FnZUFyY2hpdmUpICQoUGFja2FnZVBhdGNoUGF0aHMpCisJJChleHBhbmQtYW5kLXBhdGNoLXBhY2thZ2UpCisKKyMgUHJlcGFyZSB0aGUgc291cmNlcy4KKworLlBIT05ZOiBzb3VyY2UKK3NvdXJjZTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpCisKKyMgUGF0Y2ggdGhlIHNvdXJjZXMsIGlmIG5lY2Vzc2FyeS4KKworLlBIT05ZOiBwYXRjaAorcGF0Y2g6IHNvdXJjZQorCisjIEJ1c3lCb3ggaGFzIG5vIHdheSBvZiBleHBsaWNpdGx5IHNldHRpbmcgQ0MsIExELCBPQkpDT1BZLCBldCBhbCBhbmQKKyMgaW5zdGVhZCByZWxpZXMgb24gdGhlIHZhbHVlIG9mIENST1NTX0NPTVBJTEUuIENvbnNlcXVlbnRseSwgd2UgaGF2ZQorIyB0byBlbnN1cmUgdGhhdCAnVG9vbEJpbkRpcicgaXMgaW4gJ1BBVEgnIHNvIHRoYXQgdGhlIGtlcm5lbCBidWlsZAorIyBpbmZyYXN0cnVjdHVyZSBjYW4gZmluZCAkKENST1NTX0NPTVBJTEUpZ2NjLCAkKENST1NTX0NPTVBJTEUpbGQsIGV0CisjIGFsLgorCitjb25maWd1cmUgYnVpbGQgc3RhZ2U6IFBBVEggOj0gJChQQVRIKTokKFRvb2xCaW5EaXIpCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgYnVpbGQgbWFrZWZpbGUgYW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbiBiYXNlZAorIyBvbiB0aGUgYnVpbGQgY29uZmlndXJhdGlvbi4KKworJChQYWNrYWdlQnVpbGRNYWtlZmlsZSk6ICQoQ1VSRElSKS9jb25maWdzLyQoQnVpbGRDb25maWcpX2RlZmNvbmZpZyB8ICQoUGFja2FnZVNvdXJjZURpcikgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKFBhY2thZ2VTb3VyY2VEaXIpIE89JChDVVJESVIpLyQoQnVpbGREaXJlY3RvcnkpICQ8CisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCisuUEhPTlk6IGNvbmZpZ3VyZQorY29uZmlndXJlOiBzb3VyY2UgJChQYWNrYWdlQnVpbGRNYWtlZmlsZSkKKworIyBCdWlsZCB0aGUgc291cmNlLgorCisuUEhPTlk6IGJ1aWxkCitidWlsZDogY29uZmlndXJlCisJJChWZXJib3NlKSQoTUFLRSkgJChKT0JTRkxBRykgLUMgJChCdWlsZERpcmVjdG9yeSkgYnVzeWJveAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKworLlBIT05ZOiBzdGFnZQorc3RhZ2U6IGJ1aWxkIHwgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKSQoTUFLRSkgJChKT0JTRkxBRykgLUMgJChCdWlsZERpcmVjdG9yeSkgSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIENPTkZJR19QUkVGSVg9JChSZXN1bHREaXJlY3RvcnkpIGluc3RhbGwKKworY2xlYW46CisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChQYWNrYWdlU291cmNlRGlyKQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoQnVpbGREaXJlY3RvcnkpCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChSZXN1bHREaXJlY3RvcnkpCisKK2luY2x1ZGUgcG9zdC5tYWsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zLy5pbmRlbnQucHJvIGIvYnVzeWJveC0xLjE5LjMvLmluZGVudC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyZWNmMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zLy5pbmRlbnQucHJvCkBAIC0wLDAgKzEsMzMgQEAKKy0tYmxhbmstbGluZXMtYWZ0ZXItZGVjbGFyYXRpb25zCistLWJsYW5rLWxpbmVzLWFmdGVyLXByb2NlZHVyZXMKKy0tYnJlYWstYmVmb3JlLWJvb2xlYW4tb3BlcmF0b3IKKy0tbm8tYmxhbmstbGluZXMtYWZ0ZXItY29tbWFzCistLWJyYWNlcy1vbi1pZi1saW5lCistLWJyYWNlcy1vbi1zdHJ1Y3QtZGVjbC1saW5lCistLWNvbW1lbnQtaW5kZW50YXRpb24yNQorLS1kZWNsYXJhdGlvbi1jb21tZW50LWNvbHVtbjI1CistLW5vLWNvbW1lbnQtZGVsaW1pdGVycy1vbi1ibGFuay1saW5lcworLS1jdWRkbGUtZWxzZQorLS1jb250aW51YXRpb24taW5kZW50YXRpb240CistLWNhc2UtaW5kZW50YXRpb24wCistLWVsc2UtZW5kaWYtY29sdW1uMzMKKy0tc3BhY2UtYWZ0ZXItY2FzdAorLS1saW5lLWNvbW1lbnRzLWluZGVudGF0aW9uMAorLS1kZWNsYXJhdGlvbi1pbmRlbnRhdGlvbjEKKy0tZG9udC1mb3JtYXQtZmlyc3QtY29sdW1uLWNvbW1lbnRzCistLWRvbnQtZm9ybWF0LWNvbW1lbnRzCistLWhvbm91ci1uZXdsaW5lcworLS1pbmRlbnQtbGV2ZWw0CisvKiBjaGFuZ2VkIGZyb20gMCB0byA0ICovCistLXBhcmFtZXRlci1pbmRlbnRhdGlvbjQKKy0tbGluZS1sZW5ndGg3OCAvKiBjaGFuZ2VkIGZyb20gNzUgKi8KKy0tY29udGludWUtYXQtcGFyZW50aGVzZXMKKy0tbm8tc3BhY2UtYWZ0ZXItZnVuY3Rpb24tY2FsbC1uYW1lcworLS1kb250LWJyZWFrLXByb2NlZHVyZS10eXBlCistLWRvbnQtc3Rhci1jb21tZW50cworLS1sZWF2ZS1vcHRpb25hbC1ibGFuay1saW5lcworLS1kb250LXNwYWNlLXNwZWNpYWwtc2VtaWNvbG9uCistLXRhYi1zaXplNAorLyogYWRkaXRpb25zIGJ5IE1hcmsgKi8KKy0tY2FzZS1icmFjZS1pbmRlbnRhdGlvbjAKKy0tbGVhdmUtcHJlcHJvY2Vzc29yLXNwYWNlCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9BVVRIT1JTIGIvYnVzeWJveC0xLjE5LjMvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA4ZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvQVVUSE9SUwpAQCAtMCwwICsxLDE3NiBAQAorTGlzdCBvZiB0aGUgYXV0aG9ycyBvZiBjb2RlIGNvbnRhaW5lZCBpbiBCdXN5Qm94LgorCitJZiB5b3UgaGF2ZSBjb2RlIGluIEJ1c3lCb3gsIHlvdSBzaG91bGQgYmUgbGlzdGVkIGhlcmUuICBJZiB5b3Ugc2hvdWxkIGJlCitsaXN0ZWQsIG9yIHRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHlvdSBoYXZlIGRvbmUgbmVlZHMgbW9yZSBkZXRhaWwsIG9yIGlzCitpbmNvcnJlY3QsIF9wbGVhc2VfIGxldCBtZSBrbm93LgorCisgLUVyaWsKKworLS0tLS0tLS0tLS0KKworUGV0ZXIgV2lsbGlzIDxwc3lwaHJlYWtAcGhyZWFrZXIubmV0PgorICAgIGVqZWN0CisKK0VtYW51ZWxlIEFpbmEgPGVtYW51ZWxlLmFpbmFAdGlzY2FsaS5pdD4KKyAgICBydW4tcGFydHMKKworRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICAgIFRvbnMgb2YgbmV3IHN0dWZmLCBtYWpvciByZXdyaXRlIG9mIG1vc3Qgb2YgdGhlCisgICAgY29yZSBhcHBzLCB0b25zIG9mIG5ldyBhcHBzIGFzIG5vdGVkIGluIGhlYWRlciBmaWxlcy4KKyAgICBMb3RzIG9mIHRlZGlvdXMgZWZmb3J0IHdyaXRpbmcgdGhlc2UgYm9yaW5nIGRvY3MgdGhhdAorICAgIG5vYm9keSBpcyBnb2luZyB0byBhY3R1YWxseSByZWFkLgorCitMYXVyZW5jZSBBbmRlcnNvbiA8bC5kLmFuZGVyc29uQHdhcndpY2suYWMudWs+CisgICAgcnBtMmNwaW8sIHVuemlwLCBnZXRfaGVhZGVyX2NwaW8sIHJlYWRfZ3ogaW50ZXJmYWNlLCBycG0KKworSmVmZiBBbmdpZWxza2kgPGplZmZAdGhlcHRyZ3JvdXAuY29tPgorICAgIGZ0cHB1dCwgZnRwZ2V0CisKK0VucmlrIEJlcmtoYW4gPEVucmlrLkJlcmtoYW5AaW5rYS5kZT4KKyAgICBzZXRjb25zb2xlCisKK0ppbSBCYXVlciA8amZiYXVlckBuZnIuY29tPgorICAgIG1vZHByb2JlIHNoZWxsIGRlcGVuZGVuY3kKKworRWR3YXJkIEJldHRzIDxlZHdhcmRAZGViaWFuLm9yZz4KKyAgICBleHByLCBob3N0aWQsIGxvZ25hbWUsIHdob2FtaQorCitKb2huIEJlcHB1IDxiZXBwdUBjb2RlcG9ldC5vcmc+CisgICAgZHUsIG5zbG9va3VwLCBzb3J0CisKK0RhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgIHpjaXAKKworQnJpYW4gQ2FuZGxlciA8Qi5DYW5kbGVyQHBvYm94LmNvbT4KKyAgICB0aW55LWxzKGxzKQorCitSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKyAgICBmYnNldCwgcGluZywgaG9zdG5hbWUKKworRGF2ZSBDaW5lZ2UgPGRjaW5lZ2VAcHN5Y2hvc2lzLmNvbT4KKyAgICBtb3JlKHYyKSwgbWFrZWRldnMsIGR1dG1wLCBtb2R1bGFyaXphdGlvbiwgYXV0byBsaW5rcyBmaWxlLAorICAgIHZhcmlvdXMgZml4ZXMsIExpbnV4IFJvdXRlciBQcm9qZWN0IG1haW50ZW5hbmNlCisKK0pvcmRhbiBDcm91c2UgPGpvcmRhbkBjb3NtaWNwZW5ndWluLm5ldD4KKyAgICBpcGNhbGMKKworTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4KKyAgICB0ZnRwIGNsaWVudAorICAgIGluc21vZCBwb3dlcnBjIHN1cHBvcnQKKworTGFycnkgRG9vbGl0dGxlIDxsZG9vbGl0dEByZWN5Y2xlLmxibC5nb3Y+CisgICAgcHJpc3RpbmUgc291cmNlIGRpcmVjdG9yeSBjb21waWxhdGlvbiwgbG90cyBvZiBwYXRjaGVzIGFuZCBmaXhlcy4KKworR2xlbm4gRW5nZWwgPGdsZW5uZUBlbmdlbC5vcmc+CisgICAgaHR0cGQKKworR2VubmFkeSBGZWxkbWFuIDxnZmVsZG1hbkBnZW5hMDEuY29tPgorICAgIFN5c2tsb2dkIChzaW5nbGUgdGhyZWFkZWQgc3lzbG9nZCwgSVBDIENpcmN1bGFyIGJ1ZmZlciBzdXBwb3J0LAorICAgIGxvZ3JlYWQpLCB2YXJpb3VzIGZpeGVzLgorCitSb2JlcnQgR3JpZWJsIDxzYW5kbWFuQGhhbmRoZWxkcy5vcmc+CisgICAgbW9kcHJvYmUsIGh3Y2xvY2ssIHN1aWQvc2dpZCBoYW5kbGluZywgdGlueWxvZ2luIGludGVncmF0aW9uCisgICAgbWFueSBidWdmaXhlcyBhbmQgZW5oYW5jZW1lbnRzCisKK0thcmwgTS4gSGVnYmxvb20gPGthcmxoZWdAZGViaWFuLm9yZz4KKyAgICBjcF9tdi5jLCB0aGUgdGVzdCBzdWl0ZSwgdmFyaW91cyBmaXhlcyB0byB1dGlsaXR5LmMsICZjLgorCitEYW5pZWwgSmFjb2Jvd2l0eiA8ZGFuQGRlYmlhbi5vcmc+CisgICAgbWt0ZW1wLmMKKworTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNtdS5lZHU+CisgICAgZG9jdW1lbnRhdGlvbiwgYnVnZml4ZXMsIHRlc3Qgc3VpdGUKKworUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAgICBCZWNhbWUgYnVzeWJveCBtYWludGFpbmVyIGluIDIwMDYuCisKKyAgICBzZWQgKG1ham9yIHJld3JpdGUgaW4gMjAwMywgYW5kIEkgbm93IG1haW50YWluIHRoZSB0aGluZykKKyAgICBidW56aXAyIChjb21wbGV0ZSBmcm9tLXNjcmF0Y2ggcmV3cml0ZSwgdGhlbiBtam4zIG9wdGltaXplZCB0aGUgcmVzdWx0KQorICAgIHNvcnQgKG1vcmUgb3IgbGVzcyBmcm9tIHNjcmF0Y2ggcmV3cml0ZSBpbiAyMDA0LCBJIG5vdyBtYWludGFpbiBpdCkKKyAgICBtb3VudCAocmV3cml0ZSBpbiAyMDA1LCBJIG1haW50YWluIHRoZSBuZXcgb25lKQorCitTdGVwaGFuIExpbnogPGxpbnpAbGktcHJvLm5ldD4KKyAgICBpcGNhbGMsIFJlZCBIYXQgZXF1aXZhbGVuY2UKKworSm9obiBMb21iYXJkbyA8am9obkBkZWx0YW5ldC5jb20+CisgICAgdHIKKworR2xlbm4gTWNHcmF0aCA8Z2xlbm4ubC5tY2dyYXRoQGdtYWlsLmNvbT4KKyAgICBDb21tb24gdW5hcmNoaXZpbmcgY29kZSBhbmQgdW5hcmNoaXZpbmcgYXBwbGV0cywgaWZ1cGRvd24sIGZ0cGdldHB1dCwKKyAgICBuYW1laWYsIHNlZCwgcGF0Y2gsIGZvbGQsIGluc3RhbGwsIHV1ZGVjb2RlLgorICAgIFZhcmlvdXMgYnVnZml4ZXMsIHJldmlldyBhbmQgYXBwbHkgbnVtZXJvdXMgcGF0Y2hlcy4KKworTWFudWVsIE5vdm9hIElJSSA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgICAgY2F0LCBoZWFkLCBta2ZpZm8sIG1rbm9kLCBybWRpciwgc2xlZXAsIHRlZSwgdHR5LCB1bmlxLCB1c2xlZXAsIHdjLCB5ZXMsCisgICAgbWVzZywgdmNvbmZpZywgbmljZSwgcmVuaWNlLAorICAgIG1ha2VfZGlyZWN0b3J5LCBwYXJzZV9tb2RlLCBkaXJuYW1lLCBtb2RlX3N0cmluZywKKyAgICBnZXRfbGFzdF9wYXRoX2NvbXBvbmVudCwgc2ltcGxpZnlfcGF0aCwgYW5kIGEgbnVtYmVyIHRyaXZpYWwgbGliYmIgcm91dGluZXMKKworICAgIGFsc28gYnVnIGZpeGVzLCBwYXJ0aWFsIHJld3JpdGVzLCBhbmQgc2l6ZSBvcHRpbWl6YXRpb25zIGluCisgICAgYXNoLCBiYXNlbmFtZSwgY2FsLCBjbXAsIGNwLCBkZiwgZHUsIGVjaG8sIGVudiwgbG4sIGxvZ25hbWUsIG1kNXN1bSwgbWtkaXIsCisgICAgbXYsIHJlYWxwYXRoLCBybSwgc29ydCwgdGFpbCwgdG91Y2gsIHVuYW1lLCB3YXRjaCwgYXJpdGgsIGh1bWFuX3JlYWRhYmxlLAorICAgIGludGVyZmFjZSwgZHV0bXAsIGlmY29uZmlnLCByb3V0ZQorCitWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgICAgY21kZWRpdDsgYmJfbWtkZXAsIHhhcmdzKGN1cnJlbnQpLCBodHRwZChjdXJyZW50KTsKKyAgICBwb3J0czogYXNoLCBjcm9uZCwgZmRpc2sgKGluaXRpYWwsIHVubWFpbnRhaW5lZCBub3cpLCBpbmV0ZCwgc3R0eSwgdHJhY2Vyb3V0ZSwKKyAgICB0b3A7CisgICAgbG9jYWxlLCB2YXJpb3VzIGZpeGVzCisgICAgYW5kIGlycmVjb25jaWxhYmxlIGNyaXRpYyBvZiBldmVyeXRoaW5nIG5vdCBwZXJmZWN0LgorCitCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4KKyAgICBPcmlnaW5hbCBhdXRob3Igb2YgQnVzeUJveCBpbiAxOTk1LCAxOTk2LiBTb21lIG9mIGhpcyBjb2RlIGNhbgorICAgIHN0aWxsIGJlIGZvdW5kIGhpZGluZyBoZXJlIGFuZCB0aGVyZS4uLgorCitSb2RuZXkgUmFkZm9yZCA8cnJhZGZvcmRAbWluZHNwcmluZy5jb20+CisgICAgaXBjcywgaXBjcm0KKworVGltIFJpa2VyIDxUaW1AUmlrZXJzLm9yZz4KKyAgICBidWcgZml4ZXMsIG1lbWJlciBvZiBmYW4gY2x1YgorCitLZW50IFJvYm90dGkgPHJvYm90dGlAbWV0Y29ubmVjdC5jb20+CisgICAgcmVzZXQsIHRvbnMgYW5kIHRvbnMgb2YgYnVnIHJlcG9ydHMgYW5kIHBhdGNoZXMuCisKK0NoaXAgUm9zZW50aGFsIDxjaGlwQHVuaWNvbS5jb20+LCA8Y3Jvc2VudGhAY292YWQuY29tPgorICAgIHdnZXQgLSBDb250cmlidXRlZCBieSBwZXJtaXNzaW9uIG9mIENvdmFkIENvbW11bmljYXRpb25zCisKK1BhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisgICAgTG90cyBvZiBidWdzIGZpeGVzIGFuZCBwYXRjaGVzLgorCitHeWVwaSBTYW0gPGd5ZXBpQHByYXhpcy1zdy5jb20+CisgICAgUmVtb3RlIGxvZ2dpbmcgZmVhdHVyZSBmb3Igc3lzbG9nZAorCitSb2IgU3VsbGl2YW4gPGNvZ2l0by5lcmdvLmNvZ2l0b0BnbWFpbC5jb20+CisgICAgY29tbQorCitMaW51cyBUb3J2YWxkcworICAgIG1rc3dhcCwgZnNjay5taW5peCwgbWtmcy5taW5peAorCitNYXJrIFdoaXRsZXkgPG1hcmt3QGNvZGVwb2V0Lm9yZz4KKyAgICBncmVwLCBzZWQsIGN1dCwgeGFyZ3MocHJldmlvdXMpLAorICAgIHN0eWxlLWd1aWRlLCBuZXctYXBwbGV0LUhPV1RPLCBidWcgZml4ZXMsIGV0Yy4KKworQ2hhcmxlcyBQLiBXcmlnaHQgPGNwd3JpZ2h0QHZpbGxhZ2VuZXQuY29tPgorICAgIGd6aXAsIG1pbmktbmV0Y2F0KG5jKQorCitFbnJpcXVlIFphbmFyZGkgPGV6YW5hcmRpQHVsbC5lcz4KKyAgICB0YXJjYXQgKHNpbmNlIHJlbW92ZWQpLCBsb2Fka21hcCwgdmFyaW91cyBmaXhlcywgRGViaWFuIG1haW50ZW5hbmNlCisKK1RpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAgICBkZXZmc2QgYW5kIHNpemUgb3B0aW1pemF0aW9ucyBpbiBzdHJpbmdzLCBvcGVudnQsIGNodnQsIGRlYWxsb2N2dCwgaGRwYXJtLAorICAgIGZkZm9ybWF0LCBsc2F0dHIsIGNoYXR0ciwgaWQgYW5kIGVqZWN0LgorCitQYXVsIEZveCA8cGdmQGZveGhhcnAuYm9zdG9uLm1hLnVzPgorICAgIHZpIGVkaXRpbmcgbW9kZSBmb3IgYXNoLCB2YXJpb3VzIG90aGVyIHBhdGNoZXMvZml4ZXMKKworUm9iZXJ0byBBLiBGb2dsaWV0dGEgPG1lQHJvYmVydG8uZm9nbGlldHRhLm5hbWU+CisgICAgcG9ydDogZG5zZAorCitCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIgPHJlcC5kb3Qubm9wQGdtYWlsLmNvbT4KKyAgICBtaXNjCisKK01pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KKyAgICBpbml0aWFsIGUyZnNwcm9ncywgcHJpbnRlbnYsIHNldGFyY2gsIHN1bSwgbWlzYworCitKaWUgWmhhbmcgPGppZS56aGFuZ0BhbmFsb2cuY29tPgorICAgIGZpeGVkIHR3byBidWdzIGluIG1zaCBhbmQgaHVzaCAoZXhpdGNvZGUgb2Yga2lsbGVkIHByb2Nlc3NlcykKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL0NvbmZpZy5pbiBiL2J1c3lib3gtMS4xOS4zL0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTcxODEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvQ29uZmlnLmluCkBAIC0wLDAgKzEsNzc5IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittYWlubWVudSAiQnVzeUJveCBDb25maWd1cmF0aW9uIgorCitjb25maWcgSEFWRV9ET1RfQ09ORklHCisJYm9vbAorCWRlZmF1bHQgeQorCittZW51ICJCdXN5Ym94IFNldHRpbmdzIgorCittZW51ICJHZW5lcmFsIENvbmZpZ3VyYXRpb24iCisKK2NvbmZpZyBERVNLVE9QCisJYm9vbCAiRW5hYmxlIG9wdGlvbnMgZm9yIGZ1bGwtYmxvd24gZGVza3RvcCBzeXN0ZW1zIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSBvcHRpb25zIGFuZCBmZWF0dXJlcyB3aGljaCBhcmUgbm90IGVzc2VudGlhbC4KKwkgIFNlbGVjdCB0aGlzIG9ubHkgaWYgeW91IHBsYW4gdG8gdXNlIGJ1c3lib3ggb24gZnVsbC1ibG93bgorCSAgZGVza3RvcCBtYWNoaW5lIHdpdGggY29tbW9uIExpbnV4IGRpc3Rybywgbm90IG9uIGFuIGVtYmVkZGVkIGJveC4KKworY29uZmlnIEVYVFJBX0NPTVBBVAorCWJvb2wgIlByb3ZpZGUgY29tcGF0aWJsZSBiZWhhdmlvciBmb3IgcmFyZSBjb3JuZXIgY2FzZXMgKGJpZ2dlciBjb2RlKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBtYWtlcyBncmVwLCBzZWQgZXRjIGhhbmRsZSByYXJlIGNvcm5lciBjYXNlcworCSAgKGVtYmVkZGVkIE5VTCBieXRlcyBhbmQgc3VjaCkuIFRoaXMgbWFrZXMgY29kZSBiaWdnZXIgYW5kIHVzZXMKKwkgIHNvbWUgR05VIGV4dGVuc2lvbnMgaW4gbGliYy4gWW91IHByb2JhYmx5IG9ubHkgbmVlZCB0aGlzIG9wdGlvbgorCSAgaWYgeW91IHBsYW4gdG8gcnVuIGJ1c3lib3ggb24gZGVza3RvcC4KKworY29uZmlnIElOQ0xVREVfU1VTdjIKKwlib29sICJFbmFibGUgb2Jzb2xldGUgZmVhdHVyZXMgcmVtb3ZlZCBiZWZvcmUgU1VTdjMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBlbmFibGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBTdVN2MiwKKwkgIHNwZWNpZmljYWxseSwgb2xkLXN0eWxlIG51bWVyaWMgb3B0aW9ucyAoJ2NvbW1hbmQgLTEgPGZpbGU+JykKKwkgIHdpbGwgYmUgc3VwcG9ydGVkIGluIGhlYWQsIHRhaWwsIGFuZCBmb2xkLiAoTm90ZTogc2hvdWxkCisJICBhZmZlY3QgcmVuaWNlIHRvby4pCisKK2NvbmZpZyBVU0VfUE9SVEFCTEVfQ09ERQorCWJvb2wgIkF2b2lkIHVzaW5nIEdDQy1zcGVjaWZpYyBjb2RlIGNvbnN0cnVjdHMiCisJZGVmYXVsdCBuCisJaGVscAorCSAgVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIGNvbXBpbGUgYnVzeWJveCB3aXRoCisJICBjb21waWxlciBvdGhlciB0aGFuIGdjYy4KKwkgIElmIHlvdSBkbyB1c2UgZ2NjLCB0aGlzIG9wdGlvbiBtYXkgbmVlZGxlc3NseSBpbmNyZWFzZSBjb2RlIHNpemUuCisKK2NvbmZpZyBQTEFURk9STV9MSU5VWAorCWJvb2wgIkVuYWJsZSBMaW51eC1zcGVjaWZpYyBhcHBsZXRzIGFuZCBmZWF0dXJlcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBGb3IgdGhlIG1vc3QgcGFydCwgYnVzeWJveCByZXF1aXJlcyBvbmx5IFBPU0lYIGNvbXBhdGliaWxpdHkKKwkgIGZyb20gdGhlIHRhcmdldCBzeXN0ZW0sIGJ1dCBzb21lIGFwcGxldHMgYW5kIGZlYXR1cmVzIHVzZQorCSAgTGludXgtc3BlY2lmaWMgaW50ZXJmYWNlcy4KKworCSAgQW5zd2VyaW5nICdOJyBoZXJlIHdpbGwgZGlzYWJsZSBzdWNoIGFwcGxldHMgYW5kIGhpZGUgdGhlCisJICBjb3JyZXNwb25kaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKworY2hvaWNlCisJcHJvbXB0ICJCdWZmZXIgYWxsb2NhdGlvbiBwb2xpY3kiCisJZGVmYXVsdCBGRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQworCWhlbHAKKwkgIFRoZXJlIGFyZSAzIHdheXMgQnVzeUJveCBjYW4gaGFuZGxlIGJ1ZmZlciBhbGxvY2F0aW9uczoKKwkgIC0gVXNlIG1hbGxvYy4gVGhpcyBjb3N0cyBjb2RlIHNpemUgZm9yIHRoZSBjYWxsIHRvIHhtYWxsb2MuCisJICAtIFB1dCB0aGVtIG9uIHN0YWNrLiBGb3Igc29tZSB2ZXJ5IHNtYWxsIG1hY2hpbmVzIHdpdGggbGltaXRlZCBzdGFjaworCSAgICBzcGFjZSwgdGhpcyBjYW4gYmUgZGVhZGx5LiBGb3IgbW9zdCBmb2xrcywgdGhpcyB3b3JrcyBqdXN0IGZpbmUuCisJICAtIFB1dCB0aGVtIGluIEJTUy4gVGhpcyB3b3JrcyBiZWF1dGlmdWxseSBmb3IgY29tcHV0ZXJzIHdpdGggYSByZWFsCisJICAgIE1NVSAoYW5kIE9TIHN1cHBvcnQpLCBidXQgd2FzdGVzIHJ1bnRpbWUgUkFNIGZvciB1Q0xpbnV4LiBUaGlzCisJICAgIGJlaGF2aW9yIHdhcyB0aGUgb25seSBvbmUgYXZhaWxhYmxlIGZvciBCdXN5Qm94IHZlcnNpb25zIDAuNDggYW5kCisJICAgIGVhcmxpZXIuCisKK2NvbmZpZyBGRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQworCWJvb2wgIkFsbG9jYXRlIHdpdGggTWFsbG9jIgorCitjb25maWcgRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLCisJYm9vbCAiQWxsb2NhdGUgb24gdGhlIFN0YWNrIgorCitjb25maWcgRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUworCWJvb2wgIkFsbG9jYXRlIGluIHRoZSAuYnNzIHNlY3Rpb24iCisKK2VuZGNob2ljZQorCitjb25maWcgU0hPV19VU0FHRQorCWJvb2wgIlNob3cgdGVyc2UgYXBwbGV0IHVzYWdlIG1lc3NhZ2VzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEFsbCBCdXN5Qm94IGFwcGxldHMgd2lsbCBzaG93IGhlbHAgbWVzc2FnZXMgd2hlbiBpbnZva2VkIHdpdGgKKwkgIHdyb25nIGFyZ3VtZW50cy4gWW91IGNhbiB0dXJuIG9mZiBwcmludGluZyB0aGVzZSB0ZXJzZSB1c2FnZQorCSAgbWVzc2FnZXMgaWYgeW91IHNheSBubyBoZXJlLgorCSAgVGhpcyB3aWxsIHNhdmUgeW91IHVwIHRvIDdrLgorCitjb25maWcgRkVBVFVSRV9WRVJCT1NFX1VTQUdFCisJYm9vbCAiU2hvdyB2ZXJib3NlIGFwcGxldCB1c2FnZSBtZXNzYWdlcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNIT1dfVVNBR0UKKwloZWxwCisJICBBbGwgQnVzeUJveCBhcHBsZXRzIHdpbGwgc2hvdyBtb3JlIHZlcmJvc2UgaGVscCBtZXNzYWdlcyB3aGVuCisJICBidXN5Ym94IGlzIGludm9rZWQgd2l0aCAtLWhlbHAuIFRoaXMgd2lsbCBhZGQgYSBsb3Qgb2YgdGV4dCB0byB0aGUKKwkgIGJ1c3lib3ggYmluYXJ5LiBJbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCB0aGlzIHdpbGwgYWRkIGFib3V0CisJICAxM2ssIGJ1dCBpdCBjYW4gYWRkIG11Y2ggbW9yZSBkZXBlbmRpbmcgb24geW91ciBjb25maWd1cmF0aW9uLgorCitjb25maWcgRkVBVFVSRV9DT01QUkVTU19VU0FHRQorCWJvb2wgIlN0b3JlIGFwcGxldCB1c2FnZSBtZXNzYWdlcyBpbiBjb21wcmVzc2VkIGZvcm0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTSE9XX1VTQUdFCisJaGVscAorCSAgU3RvcmUgdXNhZ2UgbWVzc2FnZXMgaW4gY29tcHJlc3NlZCBmb3JtLCB1bmNvbXByZXNzIHRoZW0gb24tdGhlLWZseQorCSAgd2hlbiA8YXBwbGV0PiAtLWhlbHAgaXMgY2FsbGVkLgorCisJICBJZiB5b3UgaGF2ZSBhIHJlYWxseSB0aW55IGJ1c3lib3ggd2l0aCBmZXcgYXBwbGV0cyBlbmFibGVkIChhbmQKKwkgIGJ1bnppcDIgaXNuJ3Qgb25lIG9mIHRoZW0pLCB0aGUgb3ZlcmhlYWQgb2YgdGhlIGRlY29tcHJlc3NvciBtaWdodAorCSAgYmUgbm90aWNlYWJsZS4gQWxzbywgaWYgeW91IHJ1biBleGVjdXRhYmxlcyBkaXJlY3RseSBmcm9tIFJPTQorCSAgYW5kIGhhdmUgdmVyeSBsaXR0bGUgbWVtb3J5LCB0aGlzIG1pZ2h0IG5vdCBiZSBhIHdpbi4gT3RoZXJ3aXNlLAorCSAgeW91IHByb2JhYmx5IHdhbnQgdGhpcy4KKworY29uZmlnIEZFQVRVUkVfSU5TVEFMTEVSCisJYm9vbCAiU3VwcG9ydCAtLWluc3RhbGwgWy1zXSB0byBpbnN0YWxsIGFwcGxldCBsaW5rcyBhdCBydW50aW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSAnYnVzeWJveCAtLWluc3RhbGwgWy1zXScgc3VwcG9ydC4gVGhpcyB3aWxsIGFsbG93IHlvdSB0byB1c2UKKwkgIGJ1c3lib3ggYXQgcnVudGltZSB0byBjcmVhdGUgaGFyZCBsaW5rcyBvciBzeW1saW5rcyBmb3IgYWxsIHRoZQorCSAgYXBwbGV0cyB0aGF0IGFyZSBjb21waWxlZCBpbnRvIGJ1c3lib3guCisKK2NvbmZpZyBJTlNUQUxMX05PX1VTUgorCWJvb2wgIkRvbid0IHVzZSAvdXNyIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIERpc2FibGUgdXNlIG9mIC91c3IuIGJ1c3lib3ggLS1pbnN0YWxsIGFuZCAibWFrZSBpbnN0YWxsIgorCSAgd2lsbCBpbnN0YWxsIGFwcGxldHMgb25seSB0byAvYmluIGFuZCAvc2JpbiwKKwkgIG5ldmVyIHRvIC91c3IvYmluIG9yIC91c3Ivc2Jpbi4KKworY29uZmlnIExPQ0FMRV9TVVBQT1JUCisJYm9vbCAiRW5hYmxlIGxvY2FsZSBzdXBwb3J0IChzeXN0ZW0gbmVlZHMgbG9jYWxlIGZvciB0aGlzIHRvIHdvcmspIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGhhcyBsb2NhbGUgc3VwcG9ydCBhbmQgeW91IHdvdWxkIGxpa2UKKwkgIGJ1c3lib3ggdG8gc3VwcG9ydCBsb2NhbGUgc2V0dGluZ3MuCisKK2NvbmZpZyBVTklDT0RFX1NVUFBPUlQKKwlib29sICJTdXBwb3J0IFVuaWNvZGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBtYWtlcyB2YXJpb3VzIGFwcGxldHMgYXdhcmUgdGhhdCBvbmUgYnl0ZSBpcyBub3QKKwkgIG9uZSBjaGFyYWN0ZXIgb24gc2NyZWVuLgorCisJICBCdXN5Ym94IGFpbXMgdG8gZXZlbnR1YWxseSB3b3JrIGNvcnJlY3RseSB3aXRoIFVuaWNvZGUgZGlzcGxheXMuCisJICBBbnkgb2xkZXIgZW5jb2RpbmdzIGFyZSBub3QgZ3VhcmFudGVlZCB0byB3b3JrLgorCSAgUHJvYmFibHkgYnkgdGhlIHRpbWUgd2hlbiBidXN5Ym94IHdpbGwgYmUgZnVsbHkgVW5pY29kZS1jbGVhbiwKKwkgIG90aGVyIGVuY29kaW5ncyB3aWxsIGJlIG1haW5seSBvZiBoaXN0b3JpYyBpbnRlcmVzdC4KKworY29uZmlnIFVOSUNPREVfVVNJTkdfTE9DQUxFCisJYm9vbCAiVXNlIGxpYmMgcm91dGluZXMgZm9yIFVuaWNvZGUgKGVsc2UgdXNlcyBpbnRlcm5hbCBvbmVzKSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVCAmJiBMT0NBTEVfU1VQUE9SVAorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb24sIFVuaWNvZGUgc3VwcG9ydCBpcyBpbXBsZW1lbnRlZCB1c2luZyBsaWJjCisJICByb3V0aW5lcy4gT3RoZXJ3aXNlLCBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLgorCSAgSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gaXMgc21hbGxlci4KKworY29uZmlnIEZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYKKwlib29sICJDaGVjayAkTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVCAmJiAhVU5JQ09ERV9VU0lOR19MT0NBTEUKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIG9uLCBVbmljb2RlIHN1cHBvcnQgaXMgYWN0aXZhdGVkCisJICBvbmx5IGlmIExBTkcgdmFyaWFibGUgaGFzIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSAieHh4eC51dGY4IgorCisJICBPdGhlcndpc2UsIFVuaWNvZGUgc3VwcG9ydCB3aWxsIGJlIGFsd2F5cyBlbmFibGVkIGFuZCBhY3RpdmUuCisKK2NvbmZpZyBTVUJTVF9XQ0hBUgorCWludCAiQ2hhcmFjdGVyIGNvZGUgdG8gc3Vic3RpdHV0ZSB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIHdpdGgiCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQKKwlkZWZhdWx0IDYzCisJaGVscAorCSAgVHlwaWNhbCB2YWx1ZXMgYXJlIDYzIGZvciAnPycgKHdvcmtzIHdpdGggYW55IG91dHB1dCBkZXZpY2UpLAorCSAgMzAgZm9yIEFTQ0lJIHN1YnN0aXR1dGUgY29udHJvbCBjb2RlLAorCSAgNjU1MzMgKDB4ZmZmZCkgZm9yIFVuaWNvZGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyLgorCitjb25maWcgTEFTVF9TVVBQT1JURURfV0NIQVIKKwlpbnQgIlJhbmdlIG9mIHN1cHBvcnRlZCBVbmljb2RlIGNoYXJhY3RlcnMiCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQKKwlkZWZhdWx0IDc2NworCWhlbHAKKwkgIEFueSBjaGFyYWN0ZXIgd2l0aCBVbmljb2RlIHZhbHVlIGJpZ2dlciB0aGFuIHRoaXMgaXMgYXNzdW1lZAorCSAgdG8gYmUgbm9uLXByaW50YWJsZSBvbiBvdXRwdXQgZGV2aWNlLiBNYW55IGFwcGxldHMgcmVwbGFjZQorCSAgc3VjaCBjaGFycyB3aXRoIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIuCisKKwkgIFRoZSBpZGVhIGlzIHRoYXQgbWFueSB2YWxpZCBwcmludGFibGUgVW5pY29kZSBjaGFycyBhcmUKKwkgIG5ldmVydGhlbGVzcyBhcmUgbm90IGRpc3BsYXllZCBjb3JyZWN0bHkuIFRoaW5rIGFib3V0CisJICBjb21iaW5pbmcgY2hhcmFjaGVycywgZG91YmxlLXdpZGUgaGllcm9nbHlwaHMsIG9ic2N1cmUKKwkgIGNoYXJhY3RlcnMgaW4gZG96ZW5zIG9mIGFuY2llbnQgc2NyaXB0cy4uLgorCSAgTWFueSB0ZXJtaW5hbHMsIHRlcm1pbmFsIGVtdWxhdG9ycywgeHRlcm1zIGV0YyB3aWxsIGZhaWwKKwkgIHRvIGhhbmRsZSB0aGVtIGNvcnJlY3RseS4gQ2hvb3NlIHRoZSBzbWFsbGVzdCB2YWx1ZQorCSAgd2hpY2ggc3VpdHMgeW91ciBuZWVkcy4KKworCSAgVHlwaWNhbCB2YWx1ZXMgYXJlOgorCSAgMTI2IC0gQVNDSUkgb25seQorCSAgNzY3ICgweDJmZikgLSB0aGVyZSBhcmUgbm8gY29tYmluaW5nIGNoYXJzIGluIFswLi43NjddIHJhbmdlCisJCQkodGhlIHJhbmdlIGluY2x1ZGVzIExhdGluIDEsIExhdGluIEV4dC4gQSBhbmQgQiksCisJCQljb2RlIGlzIH43MDAgYnl0ZXMgc21hbGxlciBmb3IgdGhpcyBjYXNlLgorCSAgNDM1MSAoMHgxMGZmKSAtIHRoZXJlIGFyZSBubyBkb3VibGUtd2lkZSBjaGFycyBpbiBbMC4uNDM1MV0gcmFuZ2UsCisJCQljb2RlIGlzIH4zMDAgYnl0ZXMgc21hbGxlciBmb3IgdGhpcyBjYXNlLgorCSAgMTI3OTkgKDB4MzFmZikgLSBuZWFybHkgYWxsIG5vbi1pZGVvZ3JhcGhpYyBjaGFyYWN0ZXJzIGFyZQorCQkJYXZhaWxhYmxlIGluIFswLi4xMjc5OV0gcmFuZ2UsIGluY2x1ZGluZworCQkJRWFzdCBBc2lhbiBzY3JpcHRzIGxpa2Uga2F0YWthbmEsIGhpcmFnYW5hLCBoYW5ndWwsCisJCQlib3BvbW9mby4uLgorCSAgMCAtIG9mZiwgYW55IHZhbGlkIHByaW50YWJsZSBVbmljb2RlIGNoYXJhY3RlciB3aWxsIGJlIHByaW50ZWQuCisKK2NvbmZpZyBVTklDT0RFX0NPTUJJTklOR19XQ0hBUlMKKwlib29sICJBbGxvdyB6ZXJvLXdpZHRoIFVuaWNvZGUgY2hhcmFjdGVycyBvbiBvdXRwdXQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIG9mZiwgYW55IFVuaWNvZGUgY2hhciB3aXRoIHdpZHRoIG9mIDAKKwkgIGlzIHN1YnN0aXR1dGVkIG9uIG91dHB1dC4KKworY29uZmlnIFVOSUNPREVfV0lERV9XQ0hBUlMKKwlib29sICJBbGxvdyB3aWRlIFVuaWNvZGUgY2hhcmFjdGVycyBvbiBvdXRwdXQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIG9mZiwgYW55IFVuaWNvZGUgY2hhciB3aXRoIHdpZHRoID4gMQorCSAgaXMgc3Vic3RpdHV0ZWQgb24gb3V0cHV0LgorCitjb25maWcgVU5JQ09ERV9CSURJX1NVUFBPUlQKKwlib29sICJCaWRpcmVjdGlvbmFsIGNoYXJhY3Rlci1hd2FyZSBsaW5lIGlucHV0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVU5JQ09ERV9TVVBQT1JUICYmICFVTklDT0RFX1VTSU5HX0xPQ0FMRQorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb24sIHJpZ2h0LXRvLWxlZnQgVW5pY29kZSBjaGFyYWN0ZXJzCisJICBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSBvbiBpbnB1dCAoZS5nLiBjdXJzb3IgbW92ZW1lbnQpLgorCitjb25maWcgVU5JQ09ERV9ORVVUUkFMX1RBQkxFCisJYm9vbCAiSW4gYmlkaSBpbnB1dCwgc3VwcG9ydCBub24tQVNDSUkgbmV1dHJhbCBjaGFycyB0b28iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVTklDT0RFX0JJRElfU1VQUE9SVAorCWhlbHAKKwkgIEluIG1vc3QgY2FzZXMgaXQncyBlbm91Z2ggdG8gdHJlYXQgb25seSBBU0NJSSBub24tbGV0dGVycworCSAgKGkuZS4gcHVuY3R1YXRpb24sIG51bWJlcnMgYW5kIHNwYWNlKSBhcyBjaGFyYWN0ZXJzCisJICB3aXRoIG5ldXRyYWwgZGlyZWN0aW9uYWxpdHkuCisJICBXaXRoIHRoaXMgb3B0aW9uIG9uLCBtb3JlIGV4dGVuc2l2ZSAoYW5kIGJpZ2dlcikgdGFibGUKKwkgIG9mIG5ldXRyYWwgY2hhcnMgd2lsbCBiZSB1c2VkLgorCitjb25maWcgVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4KKwlib29sICJNYWtlIGl0IHBvc3NpYmxlIHRvIGVudGVyIHNlcXVlbmNlcyBvZiBjaGFycyB3aGljaCBhcmUgbm90IFVuaWNvZGUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIG9uLCBvbiBsaW5lLWVkaXRpbmcgaW5wdXQgKHN1Y2ggYXMgdXNlZCBieSBzaGVsbHMpCisJICBpbnZhbGlkIFVURi04IGJ5dGVzIGFyZSBub3Qgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQKKwkgIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIuCisJICBGb3IgZXhhbXBsZSwgdGhpcyBtZWFucyB0aGF0IGVudGVyaW5nICdsJywgJ3MnLCAnICcsIDB4ZmYsIFtFbnRlcl0KKwkgIGF0IHNoZWxsIHByb21wdCB3aWxsIGxpc3QgZmlsZSBuYW1lZCAweGZmIChzaW5nbGUgY2hhciBuYW1lCisJICB3aXRoIGNoYXIgdmFsdWUgMjU1KSwgbm90IGZpbGUgbmFtZWQgJz8nLgorCitjb25maWcgTE9OR19PUFRTCisJYm9vbCAiU3VwcG9ydCBmb3IgLS1sb25nLW9wdGlvbnMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHRoaXMgaWYgeW91IHdhbnQgYnVzeWJveCBhcHBsZXRzIHRvIHVzZSB0aGUgZ251IC0tbG9uZy1vcHRpb24KKwkgIHN0eWxlLCBpbiBhZGRpdGlvbiB0byBzaW5nbGUgY2hhcmFjdGVyIC1hIC1iIC1jIHN0eWxlIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX0RFVlBUUworCWJvb2wgIlVzZSB0aGUgZGV2cHRzIGZpbGVzeXN0ZW0gZm9yIFVuaXg5OCBQVFlzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSBpZiB5b3Ugd2FudCBCdXN5Qm94IHRvIHVzZSBVbml4OTggUFRZIHN1cHBvcnQuIElmIGVuYWJsZWQsCisJICBidXN5Ym94IHdpbGwgdXNlIC9kZXYvcHRteCBmb3IgdGhlIG1hc3RlciBzaWRlIG9mIHRoZSBwc2V1ZG90ZXJtaW5hbAorCSAgYW5kIC9kZXYvcHRzLzxudW1iZXI+IGZvciB0aGUgc2xhdmUgc2lkZS4gT3RoZXJ3aXNlLCBCU0Qgc3R5bGUKKwkgIC9kZXYvdHR5cDxudW1iZXI+IHdpbGwgYmUgdXNlZC4gVG8gdXNlIHRoaXMgb3B0aW9uLCB5b3Ugc2hvdWxkIGhhdmUKKwkgIGRldnB0cyBtb3VudGVkLgorCitjb25maWcgRkVBVFVSRV9DTEVBTl9VUAorCWJvb2wgIkNsZWFuIHVwIGFsbCBtZW1vcnkgYmVmb3JlIGV4aXRpbmcgKHVzdWFsbHkgbm90IG5lZWRlZCkiCisJZGVmYXVsdCBuCisJaGVscAorCSAgQXMgYSBzaXplIG9wdGltaXphdGlvbiwgYnVzeWJveCBub3JtYWxseSBleGl0cyB3aXRob3V0IGV4cGxpY2l0bHkKKwkgIGZyZWVpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSBvciBjbG9zaW5nIGZpbGVzLiBUaGlzIHNhdmVzCisJICBzcGFjZSBzaW5jZSB0aGUgT1Mgd2lsbCBjbGVhbiB1cCBmb3IgdXMsIGJ1dCBpdCBjYW4gY29uZnVzZSBkZWJ1Z2dlcnMKKwkgIGxpa2UgdmFsZ3JpbmQsIHdoaWNoIHJlcG9ydCB0b25zIG9mIG1lbW9yeSBhbmQgcmVzb3VyY2UgbGVha3MuCisKKwkgIERvbid0IGVuYWJsZSB0aGlzIHVubGVzcyB5b3UgaGF2ZSBhIHJlYWxseSBnb29kIHJlYXNvbiB0byBjbGVhbgorCSAgdGhpbmdzIHVwIG1hbnVhbGx5LgorCitjb25maWcgRkVBVFVSRV9VVE1QCisJYm9vbCAiU3VwcG9ydCB1dG1wIGZpbGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIGZpbGUgL3Zhci9ydW4vdXRtcCBpcyB1c2VkIHRvIHRyYWNrIHdobyBpcyBjdXJyZW50bHkgbG9nZ2VkIGluLgorCSAgV2l0aCB0aGlzIG9wdGlvbiBvbiwgY2VydGFpbiBhcHBsZXRzIChnZXR0eSwgbG9naW4sIHRlbG5ldGQgZXRjKQorCSAgd2lsbCBjcmVhdGUgYW5kIGRlbGV0ZSBlbnRyaWVzIHRoZXJlLgorCSAgIndobyIgYXBwbGV0IHJlcXVpcmVzIHRoaXMgb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9XVE1QCisJYm9vbCAiU3VwcG9ydCB3dG1wIGZpbGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKwloZWxwCisJICBUaGUgZmlsZSAvdmFyL3J1bi93dG1wIGlzIHVzZWQgdG8gdHJhY2sgd2hlbiB1c2VycyBoYXZlIGxvZ2dlZCBpbnRvCisJICBhbmQgbG9nZ2VkIG91dCBvZiB0aGUgc3lzdGVtLgorCSAgV2l0aCB0aGlzIG9wdGlvbiBvbiwgY2VydGFpbiBhcHBsZXRzIChnZXR0eSwgbG9naW4sIHRlbG5ldGQgZXRjKQorCSAgd2lsbCBhcHBlbmQgbmV3IGVudHJpZXMgdGhlcmUuCisJICAibGFzdCIgYXBwbGV0IHJlcXVpcmVzIHRoaXMgb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9QSURGSUxFCisJYm9vbCAiU3VwcG9ydCB3cml0aW5nIHBpZGZpbGVzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIHNvbWUgYXBwbGV0cyAoZS5nLiBjcm9uZCwgc3lzbG9nZCwgaW5ldGQpIHdyaXRlCisJICBhIHBpZGZpbGUgaW4gL3Zhci9ydW4uIFNvbWUgYXBwbGljYXRpb25zIHJlbHkgb24gdGhlbS4KKworY29uZmlnIEZFQVRVUkVfU1VJRAorCWJvb2wgIlN1cHBvcnQgZm9yIFNVSUQvU0dJRCBoYW5kbGluZyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIHlvdSBjYW4gaW5zdGFsbCB0aGUgYnVzeWJveCBiaW5hcnkgYmVsb25naW5nCisJICB0byByb290IHdpdGggdGhlIHN1aWQgYml0IHNldCwgZW5hYmxpbmcgc29tZSBhcHBsZXRzIHRvIHBlcmZvcm0KKwkgIHJvb3QtbGV2ZWwgb3BlcmF0aW9ucyBldmVuIHdoZW4gcnVuIGJ5IG9yZGluYXJ5IHVzZXJzCisJICAoZm9yIGV4YW1wbGUsIG1vdW50aW5nIG9mIHVzZXIgbW91bnRzIGluIGZzdGFiIG5lZWRzIHRoaXMpLgorCisJICBCdXN5Ym94IHdpbGwgYXV0b21hdGljYWxseSBkcm9wIHByaXZpbGVkZ2VzIGZvciBhcHBsZXRzCisJICB0aGF0IGRvbid0IG5lZWQgcm9vdCBhY2Nlc3MuCisKKwkgIElmIHlvdSBhcmUgcmVhbGx5IHBhcmFub2lkIGFuZCBkb24ndCB3YW50IHRvIGRvIHRoaXMsIGJ1aWxkIHR3bworCSAgYnVzeWJveCBiaW5hcmllcyB3aXRoIGRpZmZlcmVudCBhcHBsZXRzIGluIHRoZW0gKGFuZCB0aGUgYXBwcm9wcmlhdGUKKwkgIHN5bWxpbmtzIHBvaW50aW5nIHRvIGVhY2ggYmluYXJ5KSwgYW5kIG9ubHkgc2V0IHRoZSBzdWlkIGJpdCBvbiB0aGUKKwkgIG9uZSB0aGF0IG5lZWRzIGl0LgorCisJICBUaGUgYXBwbGV0cyB3aGljaCByZXF1aXJlIHJvb3QgcmlnaHRzIChuZWVkIHN1aWQgYml0IG9yCisJICB0byBiZSBydW4gYnkgcm9vdCkgYW5kIHdpbGwgcmVmdXNlIHRvIGV4ZWN1dGUgb3RoZXJ3aXNlOgorCSAgY3JvbnRhYiwgbG9naW4sIHBhc3N3ZCwgc3UsIHZsb2NrLCB3YWxsLgorCisJICBUaGUgYXBwbGV0cyB3aGljaCB3aWxsIHVzZSByb290IHJpZ2h0cyBpZiB0aGV5IGhhdmUgdGhlbQorCSAgKHZpYSBzdWlkIGJpdCwgb3IgYmVjYXVzZSBydW4gYnkgcm9vdCksIGJ1dCB3b3VsZCB0cnkgdG8gd29yaworCSAgd2l0aG91dCByb290IHJpZ2h0IG5ldmVydGhlbGVzczoKKwkgIGZpbmRmcywgcGluZ1s2XSwgdHJhY2Vyb3V0ZVs2XSwgbW91bnQuCisKKwkgIE5vdGUgdGhhdCBpZiB5b3UgRE9OVCBzZWxlY3QgdGhpcyBvcHRpb24sIGJ1dCBETyBtYWtlIGJ1c3lib3gKKwkgIHN1aWQgcm9vdCwgQUxMIGFwcGxldHMgd2lsbCBydW4gdW5kZXIgcm9vdCwgd2hpY2ggaXMgYSBodWdlCisJICBzZWN1cml0eSBob2xlICh0aGluayAiY3AgL3NvbWUvZmlsZSAvZXRjL3Bhc3N3ZCIpLgorCitjb25maWcgRkVBVFVSRV9TVUlEX0NPTkZJRworCWJvb2wgIlJ1bnRpbWUgU1VJRC9TR0lEIGNvbmZpZ3VyYXRpb24gdmlhIC9ldGMvYnVzeWJveC5jb25mIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9TVUlECisJaGVscAorCSAgQWxsb3cgdGhlIFNVSUQgLyBTR0lEIHN0YXRlIG9mIGFuIGFwcGxldCB0byBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUKKwkgIGJ5IGNoZWNraW5nIC9ldGMvYnVzeWJveC5jb25mLiAoVGhpcyBpcyBzb3J0IG9mIGEgcG9vciBtYW4ncyBzdWRvLikKKwkgIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGFzIGZvbGxvd3M6CisKKwkgIEFQUExFVCA9IFtTc3gtXVtTc3gtXVt4LV0gW1VTRVIuR1JPVVBdCisKKwkgIHM6IFVTRVIgb3IgR1JPVVAgaXMgYWxsb3dlZCB0byBleGVjdXRlIEFQUExFVC4KKwkgICAgIEFQUExFVCB3aWxsIHJ1biB1bmRlciBVU0VSIG9yIEdST1VQCisJICAgICAocmVhZ2FyZGxlc3Mgb2Ygd2hvJ3MgcnVubmluZyBpdCkuCisJICBTOiBVU0VSIG9yIEdST1VQIGlzIE5PVCBhbGxvd2VkIHRvIGV4ZWN1dGUgQVBQTEVULgorCSAgICAgQVBQTEVUIHdpbGwgcnVuIHVuZGVyIFVTRVIgb3IgR1JPVVAuCisJICAgICBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSBzZW5zaWNhbC4KKwkgIHg6IFVTRVIvR1JPVVAvb3RoZXJzIGFyZSBhbGxvd2VkIHRvIGV4ZWN1dGUgQVBQTEVULgorCSAgICAgTm8gVUlEL0dJRCBjaGFuZ2Ugd2lsbCBiZSBkb25lIHdoZW4gaXQgaXMgcnVuLgorCSAgLTogVVNFUi9HUk9VUC9vdGhlcnMgYXJlIG5vdCBhbGxvd2VkIHRvIGV4ZWN1dGUgQVBQTEVULgorCisJICBBbiBleGFtcGxlIG1pZ2h0IGhlbHA6CisKKwkgIFtTVUlEXQorCSAgc3UgPSBzc3ggcm9vdC4wICMgYXBwbGV0IHN1IGNhbiBiZSBydW4gYnkgYW55b25lIGFuZCBydW5zIHdpdGgKKwkgICAgICAgICAgICAgICAgICAjIGV1aWQ9MC9lZ2lkPTAKKwkgIHN1ID0gc3N4ICAgICAgICAjIGV4YWN0bHkgdGhlIHNhbWUKKworCSAgbW91bnQgPSBzeC0gcm9vdC5kaXNrICMgYXBwbGV0IG1vdW50IGNhbiBiZSBydW4gYnkgcm9vdCBhbmQgbWVtYmVycworCSAgICAgICAgICAgICAgICAgICAgICAgICMgb2YgZ3JvdXAgZGlzayAoYnV0IG5vdCBhbnlvbmUgZWxzZSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBydW5zIHdpdGggZXVpZD0wIChlZ2lkIGlzIG5vdCBjaGFuZ2VkKQorCisJICBjcCA9IC0tLSAjIGRpc2FibGUgYXBwbGV0IGNwIGZvciBldmVyeW9uZQorCisJICBUaGUgZmlsZSBoYXMgdG8gYmUgb3duZWQgYnkgdXNlciByb290LCBncm91cCByb290IGFuZCBoYXMgdG8gYmUKKwkgIHdyaXRlYWJsZSBvbmx5IGJ5IHJvb3Q6CisJICAgICAgICAoY2hvd24gMC4wIC9ldGMvYnVzeWJveC5jb25mOyBjaG1vZCA2MDAgL2V0Yy9idXN5Ym94LmNvbmYpCisJICBUaGUgYnVzeWJveCBleGVjdXRhYmxlIGhhcyB0byBiZSBvd25lZCBieSB1c2VyIHJvb3QsIGdyb3VwCisJICByb290IGFuZCBoYXMgdG8gYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgdG8gd29yazoKKwkgICAgICAgIChjaG93biAwLjAgL2Jpbi9idXN5Ym94OyBjaG1vZCA0NzU1IC9iaW4vYnVzeWJveCkKKworCSAgUm9iZXJ0ICdzYW5kbWFuJyBHcmllYmwgaGFzIG1vcmUgaW5mb3JtYXRpb24gaGVyZToKKwkgIDx1cmw6IGh0dHA6Ly93d3cuc29mdGZvcmdlLmRlL2JiL3N1aWQuaHRtbCA+LgorCitjb25maWcgRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVAorCWJvb2wgIlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZSBpZiAvZXRjL2J1c3lib3guY29uZiBpcyBub3QgcmVhZGFibGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1NVSURfQ09ORklHCisJaGVscAorCSAgL2V0Yy9idXN5Ym94LmNvbmYgc2hvdWxkIGJlIHJlYWRhYmxlIGJ5IHRoZSB1c2VyIG5lZWRpbmcgdGhlIFNVSUQsCisJICBjaGVjayB0aGlzIG9wdGlvbiB0byBhdm9pZCB1c2VycyB0byBiZSBub3RpZmllZCBhYm91dCBtaXNzaW5nCisJICBwZXJtaXNzaW9ucy4KKworY29uZmlnIFNFTElOVVgKKwlib29sICJTdXBwb3J0IE5TQSBTZWN1cml0eSBFbmhhbmNlZCBMaW51eCIKKwlkZWZhdWx0IG4KKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgU0VMaW51eCBpbiBhcHBsZXRzIGxzLCBwcywgYW5kIGlkLiBBbHNvIHByb3ZpZGUKKwkgIHRoZSBvcHRpb24gb2YgY29tcGlsaW5nIGluIFNFTGludXggYXBwbGV0cy4KKworCSAgSWYgeW91IGRvIG5vdCBoYXZlIGEgY29tcGxldGUgU0VMaW51eCB1c2VybGFuZCBpbnN0YWxsZWQsIHRoaXMgc3R1ZmYKKwkgIHdpbGwgbm90IGNvbXBpbGUuIEdvIHZpc2l0CisJCWh0dHA6Ly93d3cubnNhLmdvdi9zZWxpbnV4L2luZGV4Lmh0bWwKKwkgIHRvIGRvd25sb2FkIHRoZSBuZWNlc3Nhcnkgc3R1ZmYgdG8gYWxsb3cgYnVzeWJveCB0byBjb21waWxlIHdpdGgKKwkgIHRoaXMgb3B0aW9uIGVuYWJsZWQuIFNwZWNpZmlhbGx5LCBsaWJzZWxpbnV4IDEuMjggb3IgYmV0dGVyIGlzCisJICBkaXJlY3RseSByZXF1aXJlZCBieSBidXN5Ym94LiBJZiB0aGUgaW5zdGFsbGF0aW9uIGlzIGxvY2F0ZWQgaW4gYQorCSAgbm9uLXN0YW5kYXJkIGRpcmVjdG9yeSwgcHJvdmlkZSBpdCBieSBpbnZva2luZyBtYWtlIGFzIGZvbGxvd3M6CisJCUNGTEFHUz0tSTxsaWJzZWxpbnV4LWluY2x1ZGUtcGF0aD4gXAorCQlMREZMQUdTPS1MPGxpYnNlbGludXgtbGliLXBhdGg+IFwKKwkJbWFrZQorCisJICBNb3N0IHBlb3BsZSB3aWxsIGxlYXZlIHRoaXMgc2V0IHRvICdOJy4KKworY29uZmlnIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwlib29sICJleGVjIHByZWZlcnMgYXBwbGV0cyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBvcHRpb24gd2hpY2ggZGlyZWN0cyBhcHBsZXRzIGFib3V0IHRvCisJICBjYWxsICdleGVjJyB0byB0cnkgYW5kIGZpbmQgYW4gYXBwbGljYWJsZSBidXN5Ym94IGFwcGxldCBiZWZvcmUKKwkgIHNlYXJjaGluZyB0aGUgUEFUSC4gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBieSBleGVjJ2luZworCSAgL3Byb2Mvc2VsZi9leGUuCisJICBUaGlzIG1heSBhZmZlY3Qgc2hlbGwsIGZpbmQgLWV4ZWMsIHhhcmdzIGFuZCBzaW1pbGFyIGFwcGxldHMuCisJICBUaGV5IHdpbGwgdXNlIGFwcGxldHMgZXZlbiBpZiAvYmluLzxhcHBsZXQ+IC0+IGJ1c3lib3ggbGluaworCSAgaXMgbWlzc2luZyAob3IgaXMgbm90IGEgbGluayB0byBidXN5Ym94KS4gSG93ZXZlciwgdGhpcyBjYXVzZXMKKwkgIHByb2JsZW1zIGluIGNocm9vdCBqYWlscyB3aXRob3V0IG1vdW50ZWQgL3Byb2MgYW5kIHdpdGggcHMvdG9wCisJICAoY29tbWFuZCBuYW1lIGNhbiBiZSBzaG93biBhcyAnZXhlJyBmb3IgYXBwbGV0cyBzdGFydGVkIHRoaXMgd2F5KS4KKworY29uZmlnIEJVU1lCT1hfRVhFQ19QQVRICisJc3RyaW5nICJQYXRoIHRvIEJ1c3lCb3ggZXhlY3V0YWJsZSIKKwlkZWZhdWx0ICIvcHJvYy9zZWxmL2V4ZSIKKwloZWxwCisJICBXaGVuIEJ1c3lib3ggYXBwbGV0cyBuZWVkIHRvIHJ1biBvdGhlciBidXN5Ym94IGFwcGxldHMsIEJ1c3lCb3gKKwkgIHNvbWV0aW1lcyBuZWVkcyB0byBleGVjKCkgaXRzZWxmLiBXaGVuIHRoZSAvcHJvYyBmaWxlc3lzdGVtIGlzCisJICBtb3VudGVkLCAvcHJvYy9zZWxmL2V4ZSBhbHdheXMgcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgcnVubmluZworCSAgZXhlY3V0YWJsZS4gSWYgeW91IGhhdmVuJ3QgZ290IC9wcm9jLCBzZXQgdGhpcyB0byB3aGVyZXZlciB5b3UKKwkgIHdhbnQgdG8gcnVuIEJ1c3lCb3ggZnJvbS4KKworIyBUaGVzZSBhcmUgYXV0by1zZWxlY3RlZCBieSBvdGhlciBvcHRpb25zCisKK2NvbmZpZyBGRUFUVVJFX1NZU0xPRworCWJvb2wgI05vIGRlc2NyaXB0aW9uIG1ha2VzIGl0IGEgaGlkZGVuIG9wdGlvbgorCWRlZmF1bHQgbgorCSNoZWxwCisJIyAgVGhpcyBvcHRpb24gaXMgYXV0by1zZWxlY3RlZCB3aGVuIHlvdSBzZWxlY3QgYW55IGFwcGxldCB3aGljaCBtYXkKKwkjICBzZW5kIGl0cyBvdXRwdXQgdG8gc3lzbG9nLiBZb3UgZG8gbm90IG5lZWQgdG8gc2VsZWN0IGl0IG1hbnVhbGx5LgorCitjb25maWcgRkVBVFVSRV9IQVZFX1JQQworCWJvb2wgI05vIGRlc2NyaXB0aW9uIG1ha2VzIGl0IGEgaGlkZGVuIG9wdGlvbgorCWRlZmF1bHQgbgorCSNoZWxwCisJIyAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIGlmIGFueSBvZiBlbmFibGVkIGFwcGxldHMgbmVlZCBpdC4KKwkjICBZb3UgZG8gbm90IG5lZWQgdG8gc2VsZWN0IGl0IG1hbnVhbGx5LgorCitlbmRtZW51CisKK21lbnUgJ0J1aWxkIE9wdGlvbnMnCisKK2NvbmZpZyBTVEFUSUMKKwlib29sICJCdWlsZCBCdXN5Qm94IGFzIGEgc3RhdGljIGJpbmFyeSAobm8gc2hhcmVkIGxpYnMpIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3RhdGljIEJ1c3lCb3ggYmluYXJ5LCB3aGljaCBkb2VzIG5vdAorCSAgdXNlIG9yIHJlcXVpcmUgYW55IHNoYXJlZCBsaWJyYXJpZXMsIHRoZW4gZW5hYmxlIHRoaXMgb3B0aW9uLgorCSAgVGhpcyBjYW4gY2F1c2UgQnVzeUJveCB0byBiZSBjb25zaWRlcmFibHkgbGFyZ2VyLCBzbyB5b3Ugc2hvdWxkCisJICBsZWF2ZSB0aGlzIG9wdGlvbiBmYWxzZSB1bmxlc3MgeW91IGhhdmUgYSBnb29kIHJlYXNvbiAoaS5lLgorCSAgeW91ciB0YXJnZXQgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLCBvcgorCSAgeW91IGFyZSBidWlsZGluZyBhbiBpbml0cmQgd2hpY2ggZG9lc24ndCBuZWVkIGFueXRoaW5nIGJ1dAorCSAgQnVzeUJveCwgZXRjKS4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBsZWF2ZSB0aGlzIHNldCB0byAnTicuCisKK2NvbmZpZyBQSUUKKwlib29sICJCdWlsZCBCdXN5Qm94IGFzIGEgcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFTVEFUSUMKKwloZWxwCisJICBIYXJkZW5lZCBjb2RlIG9wdGlvbi4gUElFIGJpbmFyaWVzIGFyZSBsb2FkZWQgYXQgYSBkaWZmZXJlbnQKKwkgIGFkZHJlc3MgYXQgZWFjaCBpbnZvY2F0aW9uLiBUaGlzIGhhcyBzb21lIG92ZXJoZWFkLAorCSAgcGFydGljdWxhcmx5IG9uIHg4Ni0zMiB3aGljaCBpcyBzaG9ydCBvbiByZWdpc3RlcnMuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgbGVhdmUgdGhpcyBzZXQgdG8gJ04nLgorCitjb25maWcgTk9NTVUKKwlib29sICJGb3JjZSBOT01NVSBidWlsZCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBCdXN5Ym94IHRyaWVzIHRvIGRldGVjdCB3aGV0aGVyIGFyY2hpdGVjdHVyZSBpdCBpcyBiZWluZworCSAgYnVpbHQgYWdhaW5zdCBzdXBwb3J0cyBNTVUgb3Igbm90LiBJZiB0aGlzIGRldGVjdGlvbiBmYWlscywKKwkgIG9yIGlmIHlvdSB3YW50IHRvIGJ1aWxkIE5PTU1VIHZlcnNpb24gb2YgYnVzeWJveCBmb3IgdGVzdGluZywKKwkgIHlvdSBtYXkgZm9yY2UgTk9NTVUgYnVpbGQgaGVyZS4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBsZWF2ZSB0aGlzIHNldCB0byAnTicuCisKKyMgUElFIGNhbiBiZSBtYWRlIHRvIHdvcmsgd2l0aCBCVUlMRF9MSUJCVVNZQk9YLCBidXQgY3VycmVudGx5CisjIGJ1aWxkIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IHRoYXQKK2NvbmZpZyBCVUlMRF9MSUJCVVNZQk9YCisJYm9vbCAiQnVpbGQgc2hhcmVkIGxpYmJ1c3lib3giCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAhRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyAmJiAhUElFICYmICFTVEFUSUMKKwloZWxwCisJICBCdWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGxpYmJ1c3lib3guc28uTi5OLk4gd2hpY2ggY29udGFpbnMgYWxsCisJICBidXN5Ym94IGNvZGUuCisKKwkgIFRoaXMgZmVhdHVyZSBhbGxvd3MgZXZlcnkgYXBwbGV0IHRvIGJlIGJ1aWx0IGFzIGEgdGlueQorCSAgc2VwYXJhdGUgZXhlY3V0YWJsZS4gRW5hYmxpbmcgaXQgZm9yICJvbmUgYmlnIGJ1c3lib3ggYmluYXJ5IgorCSAgYXBwcm9hY2ggc2VydmVzIG5vIHB1cnBvc2UgYW5kIGluY3JlYXNlcyBjb2RlIHNpemUuCisJICBZb3Ugc2hvdWxkIGFsbW9zdCBjZXJ0YWlubHkgc2F5ICJubyIgdG8gdGhpcy4KKworIyMjIGNvbmZpZyBGRUFUVVJFX0ZVTExfTElCQlVTWUJPWAorIyMjCWJvb2wgIkZlYXR1cmUtY29tcGxldGUgbGliYnVzeWJveCIKKyMjIwlkZWZhdWx0IG4gaWYgIUZFQVRVUkVfU0hBUkVEX0JVU1lCT1gKKyMjIwlkZXBlbmRzIG9uIEJVSUxEX0xJQkJVU1lCT1gKKyMjIwloZWxwCisjIyMJICBCdWlsZCBhIGxpYmJ1c3lib3ggd2l0aCB0aGUgY29tcGxldGUgZmVhdHVyZS1zZXQsIGRpc3JlZ2FyZGluZworIyMjCSAgdGhlIGFjdHVhbGx5IHNlbGVjdGVkIGNvbmZpZy4KKyMjIworIyMjCSAgTm9ybWFsbHksIGxpYmJ1c3lib3ggd2lsbCBvbmx5IGNvbnRhaW4gdGhlIGZlYXR1cmVzIHdoaWNoIGFyZQorIyMjCSAgdXNlZCBieSBidXN5Ym94IGl0c2VsZi4gSWYgeW91IHBsYW4gdG8gd3JpdGUgYSBzZXBhcmF0ZQorIyMjCSAgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiB3aGljaCB1c2VzIGxpYmJ1c3lib3ggc2F5ICdZJy4KKyMjIworIyMjCSAgTm90ZTogbGliYnVzeWJveCBpcyBHUEwsIG5vdCBMR1BMLCBhbmQgZXhwb3J0cyBubyBzdGFibGUgQVBJIHRoYXQKKyMjIwkgIG1pZ2h0IGFjdCBhcyBhIGNvcHlyaWdodCBiYXJyaWVyLiBXZSBjYW4gYW5kIHdpbGwgbW9kaWZ5IHRoZQorIyMjCSAgZXhwb3J0ZWQgZnVuY3Rpb24gc2V0IGJldHdlZW4gcmVsZWFzZXMgKGV2ZW4gbWlub3IgdmVyc2lvbiBudW1iZXIKKyMjIwkgIGNoYW5nZXMpLCBhbmQgaGFwcGlseSBicmVhayBvdXQtb2YtdHJlZSBmZWF0dXJlcy4KKyMjIworIyMjCSAgU2F5ICdOJyBpZiBpbiBkb3VidC4KKworY29uZmlnIEZFQVRVUkVfSU5ESVZJRFVBTAorCWJvb2wgIlByb2R1Y2UgYSBiaW5hcnkgZm9yIGVhY2ggYXBwbGV0LCBsaW5rZWQgYWdhaW5zdCBsaWJidXN5Ym94IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQlVJTERfTElCQlVTWUJPWAorCWhlbHAKKwkgIElmIHlvdXIgQ1BVIGFyY2hpdGVjdHVyZSBkb2Vzbid0IGFsbG93IGZvciBzaGFyaW5nIHRleHQvcm9kYXRhCisJICBzZWN0aW9ucyBvZiBydW5uaW5nIGJpbmFyaWVzLCBidXQgYWxsb3dzIGZvciBydW50aW1lIGR5bmFtaWMKKwkgIGxpYnJhcmllcywgdGhpcyBvcHRpb24gd2lsbCBhbGxvdyB5b3UgdG8gcmVkdWNlIG1lbW9yeSBmb290cHJpbnQKKwkgIHdoZW4geW91IGhhdmUgbWFueSBkaWZmZXJlbnQgYXBwbGV0cyBydW5uaW5nIGF0IG9uY2UuCisKKwkgIElmIHlvdXIgQ1BVIGFyY2hpdGVjdHVyZSBhbGxvd3MgZm9yIHNoYXJpbmcgdGV4dC9yb2RhdGEsCisJICBoYXZpbmcgc2luZ2xlIGJpbmFyeSBpcyBtb3JlIG9wdGltYWwuCisKKwkgIEVhY2ggYXBwbGV0IHdpbGwgYmUgYSB0aW55IHByb2dyYW0sIGR5bmFtaWNhbGx5IGxpbmtlZAorCSAgYWdhaW5zdCBsaWJidXN5Ym94LnNvLk4uTi5OLgorCisJICBZb3UgbmVlZCB0byBoYXZlIGEgd29ya2luZyBkeW5hbWljIGxpbmtlci4KKworY29uZmlnIEZFQVRVUkVfU0hBUkVEX0JVU1lCT1gKKwlib29sICJQcm9kdWNlIGFkZGl0aW9uYWwgYnVzeWJveCBiaW5hcnkgbGlua2VkIGFnYWluc3QgbGliYnVzeWJveCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJVSUxEX0xJQkJVU1lCT1gKKwloZWxwCisJICBCdWlsZCBidXN5Ym94LCBkeW5hbWljYWxseSBsaW5rZWQgYWdhaW5zdCBsaWJidXN5Ym94LnNvLk4uTi5OLgorCisJICBZb3UgbmVlZCB0byBoYXZlIGEgd29ya2luZyBkeW5hbWljIGxpbmtlci4KKworIyMjIGNvbmZpZyBCVUlMRF9BVF9PTkNFCisjIyMJYm9vbCAiQ29tcGlsZSBhbGwgc291cmNlcyBhdCBvbmNlIgorIyMjCWRlZmF1bHQgbgorIyMjCWhlbHAKKyMjIwkgIE5vcm1hbGx5IGVhY2ggc291cmNlLWZpbGUgaXMgY29tcGlsZWQgd2l0aCBvbmUgaW52b2NhdGlvbiBvZgorIyMjCSAgdGhlIGNvbXBpbGVyLgorIyMjCSAgSWYgeW91IHNldCB0aGlzIG9wdGlvbiwgYWxsIHNvdXJjZXMgYXJlIGNvbXBpbGVkIGF0IG9uY2UuCisjIyMJICBUaGlzIGdpdmVzIHRoZSBjb21waWxlciBtb3JlIG9wcG9ydHVuaXRpZXMgdG8gb3B0aW1pemUgd2hpY2ggY2FuCisjIyMJICByZXN1bHQgaW4gc21hbGxlciBhbmQvb3IgZmFzdGVyIGJpbmFyaWVzLgorIyMjCisjIyMJICBTZXR0aW5nIHRoaXMgb3B0aW9uIHdpbGwgY29uc3VtZSBhbG90IG9mIG1lbW9yeSwgZS5nLiBpZiB5b3UKKyMjIwkgIGVuYWJsZSBhbGwgYXBwbGV0cyB3aXRoIGFsbCBmZWF0dXJlcywgZ2NjIHVzZXMgbW9yZSB0aGFuIDMwME1CCisjIyMJICBSQU0gZHVyaW5nIGNvbXBpbGF0aW9uIG9mIGJ1c3lib3guCisjIyMKKyMjIwkgIFRoaXMgb3B0aW9uIGlzIG1vc3QgbGlrZWx5IG9ubHkgYmVuZWZpY2lhbCBmb3IgbmV3ZXIgY29tcGlsZXJzCisjIyMJICBzdWNoIGFzIGdjYy00LjEgYW5kIGFib3ZlLgorIyMjCisjIyMJICBTYXkgJ04nIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisKK2NvbmZpZyBMRlMKKwlib29sICJCdWlsZCB3aXRoIExhcmdlIEZpbGUgU3VwcG9ydCAoZm9yIGFjY2Vzc2luZyBmaWxlcyA+IDIgR0IpIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGJ1aWxkIEJ1c3lCb3ggd2l0aCBsYXJnZSBmaWxlIHN1cHBvcnQsIHRoZW4gZW5hYmxlCisJICB0aGlzIG9wdGlvbi4gVGhpcyB3aWxsIGhhdmUgbm8gZWZmZWN0IGlmIHlvdXIga2VybmVsIG9yIHlvdXIgQworCSAgbGlicmFyeSBsYWNrcyBsYXJnZSBmaWxlIHN1cHBvcnQgZm9yIGxhcmdlIGZpbGVzLiBTb21lIG9mIHRoZQorCSAgcHJvZ3JhbXMgdGhhdCBjYW4gYmVuZWZpdCBmcm9tIGxhcmdlIGZpbGUgc3VwcG9ydCBpbmNsdWRlIGRkLCBnemlwLAorCSAgY3AsIG1vdW50LCB0YXIsIGFuZCBtYW55IG90aGVycy4gSWYgeW91IHdhbnQgdG8gYWNjZXNzIGZpbGVzIGxhcmdlcgorCSAgdGhhbiAyIEdpZ2FieXRlcywgZW5hYmxlIHRoaXMgb3B0aW9uLiBPdGhlcndpc2UsIGxlYXZlIGl0IHNldCB0byAnTicuCisKK2NvbmZpZyBDUk9TU19DT01QSUxFUl9QUkVGSVgKKwlzdHJpbmcgIkNyb3NzIENvbXBpbGVyIHByZWZpeCIKKwlkZWZhdWx0ICIiCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gYnVpbGQgQnVzeUJveCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIsIHRoZW4geW91CisJICB3aWxsIG5lZWQgdG8gc2V0IHRoaXMgdG8gdGhlIGNyb3NzLWNvbXBpbGVyIHByZWZpeCwgZm9yIGV4YW1wbGUsCisJICAiaTM4Ni11Y2xpYmMtIi4KKworCSAgTm90ZSB0aGF0IENST1NTX0NPTVBJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IKKwkgICJtYWtlIENST1NTX0NPTVBJTEU9eHh4IC4uLiIgd2lsbCBvdmVycmlkZSB0aGlzIHNlbGVjdGlvbi4KKworCSAgTmF0aXZlIGJ1aWxkcyBsZWF2ZSB0aGlzIGVtcHR5LgorCitjb25maWcgRVhUUkFfQ0ZMQUdTCisJc3RyaW5nICJBZGRpdGlvbmFsIENGTEFHUyIKKwlkZWZhdWx0ICIiCisJaGVscAorCSAgQWRkaXRpb25hbCBDRkxBR1MgdG8gcGFzcyB0byB0aGUgY29tcGlsZXIgdmVyYmF0aW0uCisKK2VuZG1lbnUKKworbWVudSAnRGVidWdnaW5nIE9wdGlvbnMnCisKK2NvbmZpZyBERUJVRworCWJvb2wgIkJ1aWxkIEJ1c3lCb3ggd2l0aCBleHRyYSBEZWJ1Z2dpbmcgc3ltYm9scyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3aXNoIHRvIGV4YW1pbmUgQnVzeUJveCBpbnRlcm5hbHMgd2hpbGUgYXBwbGV0cyBhcmUKKwkgIHJ1bm5pbmcuIFRoaXMgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBiaW5hcnkgY29uc2lkZXJhYmx5LCBhbmQKKwkgIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBkb2luZyBkZXZlbG9wbWVudC4gSWYgeW91IGFyZSBkb2luZworCSAgZGV2ZWxvcG1lbnQgYW5kIHdhbnQgdG8gZGVidWcgQnVzeUJveCwgYW5zd2VyIFkuCisKKwkgIE1vc3QgcGVvcGxlIHNob3VsZCBhbnN3ZXIgTi4KKworY29uZmlnIERFQlVHX1BFU1NJTUlaRQorCWJvb2wgIkRpc2FibGUgY29tcGlsZXIgb3B0aW1pemF0aW9ucyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIERFQlVHCisJaGVscAorCSAgVGhlIGNvbXBpbGVyJ3Mgb3B0aW1pemF0aW9uIG9mIHNvdXJjZSBjb2RlIGNhbiBlbGltaW5hdGUgYW5kIHJlb3JkZXIKKwkgIGNvZGUsIHJlc3VsdGluZyBpbiBhbiBleGVjdXRhYmxlIHRoYXQncyBoYXJkIHRvIHVuZGVyc3RhbmQgd2hlbgorCSAgc3RlcHBpbmcgdGhyb3VnaCBpdCB3aXRoIGEgZGVidWdnZXIuIFRoaXMgc3dpdGNoZXMgaXQgb2ZmLCByZXN1bHRpbmcKKwkgIGluIGEgbXVjaCBiaWdnZXIgZXhlY3V0YWJsZSB0aGF0IG1vcmUgY2xvc2VseSBtYXRjaGVzIHRoZSBzb3VyY2UKKwkgIGNvZGUuCisKK2NvbmZpZyBXRVJST1IKKwlib29sICJBYm9ydCBjb21waWxhdGlvbiBvbiBhbnkgd2FybmluZyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTZWxlY3RpbmcgdGhpcyB3aWxsIGFkZCAtV2Vycm9yIHRvIGdjYyBjb21tYW5kIGxpbmUuCisKKwkgIE1vc3QgcGVvcGxlIHNob3VsZCBhbnN3ZXIgTi4KKworY2hvaWNlCisJcHJvbXB0ICJBZGRpdGlvbmFsIGRlYnVnZ2luZyBsaWJyYXJ5IgorCWRlZmF1bHQgTk9fREVCVUdfTElCCisJaGVscAorCSAgVXNpbmcgYW4gYWRkaXRpb25hbCBkZWJ1Z2dpbmcgbGlicmFyeSB3aWxsIG1ha2UgQnVzeUJveCBiZWNvbWUKKwkgIGNvbnNpZGVyYWJsZSBsYXJnZXIgYW5kIHdpbGwgY2F1c2UgaXQgdG8gcnVuIG1vcmUgc2xvd2x5LiBZb3UKKwkgIHNob3VsZCBhbHdheXMgbGVhdmUgdGhpcyBvcHRpb24gZGlzYWJsZWQgZm9yIHByb2R1Y3Rpb24gdXNlLgorCisJICBkbWFsbG9jIHN1cHBvcnQ6CisJICAtLS0tLS0tLS0tLS0tLS0tCisJICBUaGlzIGVuYWJsZXMgY29tcGlsaW5nIHdpdGggZG1hbGxvYyAoIGh0dHA6Ly9kbWFsbG9jLmNvbS8gKQorCSAgd2hpY2ggaXMgYW4gZXhjZWxsZW50IHB1YmxpYyBkb21haW4gbWVtIGxlYWsgYW5kIG1hbGxvYyBwcm9ibGVtCisJICBkZXRlY3Rvci4gVG8gZW5hYmxlIGRtYWxsb2MsIGJlZm9yZSBydW5uaW5nIGJ1c3lib3ggeW91IHdpbGwKKwkgIHdhbnQgdG8gcHJvcGVybHkgc2V0IHlvdXIgZW52aXJvbm1lbnQsIGZvciBleGFtcGxlOgorCSAgICBleHBvcnQgRE1BTExPQ19PUFRJT05TPWRlYnVnPTB4MzRmNDdkODMsaW50ZXI9MTAwLGxvZz1sb2dmaWxlCisJICBUaGUgJ2RlYnVnPScgdmFsdWUgaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZAorCSAgICBkbWFsbG9jIC1wIGxvZy1zdGF0cyAtcCBsb2ctbm9uLWZyZWUgLXAgbG9nLWJhZC1zcGFjZSBcCisJICAgICAgIC1wIGxvZy1lbGFwc2VkLXRpbWUgLXAgY2hlY2stZmVuY2UgLXAgY2hlY2staGVhcCBcCisJICAgICAgIC1wIGNoZWNrLWxpc3RzIC1wIGNoZWNrLWJsYW5rIC1wIGNoZWNrLWZ1bmNzIC1wIHJlYWxsb2MtY29weSBcCisJICAgICAgIC1wIGFsbG93LWZyZWUtbnVsbAorCisJICBFbGVjdHJpYy1mZW5jZSBzdXBwb3J0OgorCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgIFRoaXMgZW5hYmxlcyBjb21waWxpbmcgd2l0aCBFbGVjdHJpYy1mZW5jZSBzdXBwb3J0LiBFbGVjdHJpYworCSAgZmVuY2UgaXMgYW5vdGhlciB2ZXJ5IHVzZWZ1bCBtYWxsb2MgZGVidWdnaW5nIGxpYnJhcnkgd2hpY2ggdXNlcworCSAgeW91ciBjb21wdXRlcidzIHZpcnR1YWwgbWVtb3J5IGhhcmR3YXJlIHRvIGRldGVjdCBpbGxlZ2FsIG1lbW9yeQorCSAgYWNjZXNzZXMuIFRoaXMgc3VwcG9ydCB3aWxsIG1ha2UgQnVzeUJveCBiZSBjb25zaWRlcmFibGUgbGFyZ2VyCisJICBhbmQgcnVuIHNsb3dlciwgc28geW91IHNob3VsZCBsZWF2ZSB0aGlzIG9wdGlvbiBkaXNhYmxlZCB1bmxlc3MKKwkgIHlvdSBhcmUgaHVudGluZyBhIGhhcmQgdG8gZmluZCBtZW1vcnkgcHJvYmxlbS4KKworCitjb25maWcgTk9fREVCVUdfTElCCisJYm9vbCAiTm9uZSIKKworY29uZmlnIERNQUxMT0MKKwlib29sICJEbWFsbG9jIgorCitjb25maWcgRUZFTkNFCisJYm9vbCAiRWxlY3RyaWMtZmVuY2UiCisKK2VuZGNob2ljZQorCitlbmRtZW51CisKK21lbnUgJ0luc3RhbGxhdGlvbiBPcHRpb25zICgibWFrZSBpbnN0YWxsIiBiZWhhdmlvciknCisKK2Nob2ljZQorCXByb21wdCAiV2hhdCBraW5kIG9mIGFwcGxldCBsaW5rcyB0byBpbnN0YWxsIgorCWRlZmF1bHQgSU5TVEFMTF9BUFBMRVRfU1lNTElOS1MKKwloZWxwCisJICBDaG9vc2Ugd2hhdCBraW5kIG9mIGxpbmtzIHRvIGFwcGxldHMgYXJlIGNyZWF0ZWQgYnkgIm1ha2UgaW5zdGFsbCIuCisKK2NvbmZpZyBJTlNUQUxMX0FQUExFVF9TWU1MSU5LUworCWJvb2wgImFzIHNvZnQtbGlua3MiCisJaGVscAorCSAgSW5zdGFsbCBhcHBsZXRzIGFzIHNvZnQtbGlua3MgdG8gdGhlIGJ1c3lib3ggYmluYXJ5LiBUaGlzIG5lZWRzIHNvbWUKKwkgIGZyZWUgaW5vZGVzIG9uIHRoZSBmaWxlc3lzdGVtLCBidXQgbWlnaHQgaGVscCB3aXRoIGZpbGVzeXN0ZW0KKwkgIGdlbmVyYXRvcnMgdGhhdCBjYW4ndCBjb3BlIHdpdGggaGFyZC1saW5rcy4KKworY29uZmlnIElOU1RBTExfQVBQTEVUX0hBUkRMSU5LUworCWJvb2wgImFzIGhhcmQtbGlua3MiCisJaGVscAorCSAgSW5zdGFsbCBhcHBsZXRzIGFzIGhhcmQtbGlua3MgdG8gdGhlIGJ1c3lib3ggYmluYXJ5LiBUaGlzIG1pZ2h0CisJICBjb3VudCBvbiBhIGZpbGVzeXN0ZW0gd2l0aCBmZXcgaW5vZGVzLgorCitjb25maWcgSU5TVEFMTF9BUFBMRVRfU0NSSVBUX1dSQVBQRVJTCisJYm9vbCAiYXMgc2NyaXB0IHdyYXBwZXJzIgorCWhlbHAKKwkgIEluc3RhbGwgYXBwbGV0cyBhcyBzY3JpcHQgd3JhcHBlcnMgdGhhdCBjYWxsIHRoZSBidXN5Ym94IGJpbmFyeS4KKworY29uZmlnIElOU1RBTExfQVBQTEVUX0RPTlQKKwlib29sICJub3QgaW5zdGFsbGVkIgorCWhlbHAKKwkgIERvIG5vdCBpbnN0YWxsIGFwcGxldCBsaW5rcy4gVXNlZnVsIHdoZW4geW91IHBsYW4gdG8gdXNlCisJICBidXN5Ym94IC0taW5zdGFsbCBmb3IgaW5zdGFsbGluZyBsaW5rcywgb3IgcGxhbiB0byB1c2UKKwkgIGEgc3RhbmRhbG9uZSBzaGVsbCBhbmQgdGh1cyBkb24ndCBuZWVkIGFwcGxldCBsaW5rcy4KKworZW5kY2hvaWNlCisKK2Nob2ljZQorCXByb21wdCAiL2Jpbi9zaCBhcHBsZXQgbGluayIKKwlkZWZhdWx0IElOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksKKwlkZXBlbmRzIG9uIElOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUworCWhlbHAKKwkgIENob29zZSBob3cgeW91IGluc3RhbGwgL2Jpbi9zaCBhcHBsZXQgbGluay4KKworY29uZmlnIElOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksKKwlib29sICJhcyBzb2Z0LWxpbmsiCisJaGVscAorCSAgSW5zdGFsbCAvYmluL3NoIGFwcGxldCBhcyBzb2Z0LWxpbmsgdG8gdGhlIGJ1c3lib3ggYmluYXJ5LgorCitjb25maWcgSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksKKwlib29sICJhcyBoYXJkLWxpbmsiCisJaGVscAorCSAgSW5zdGFsbCAvYmluL3NoIGFwcGxldCBhcyBoYXJkLWxpbmsgdG8gdGhlIGJ1c3lib3ggYmluYXJ5LgorCitjb25maWcgSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIKKwlib29sICJhcyBzY3JpcHQgd3JhcHBlciIKKwloZWxwCisJICBJbnN0YWxsIC9iaW4vc2ggYXBwbGV0IGFzIHNjcmlwdCB3cmFwcGVyIHRoYXQgY2FsbHMKKwkgIHRoZSBidXN5Ym94IGJpbmFyeS4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBQUkVGSVgKKwlzdHJpbmcgIkJ1c3lCb3ggaW5zdGFsbGF0aW9uIHByZWZpeCIKKwlkZWZhdWx0ICIuL19pbnN0YWxsIgorCWhlbHAKKwkgIERlZmluZSB5b3VyIGRpcmVjdG9yeSB0byBpbnN0YWxsIEJ1c3lCb3ggZmlsZXMvc3ViZGlycyBpbi4KKworZW5kbWVudQorCitzb3VyY2UgbGliYmIvQ29uZmlnLmluCisKK2VuZG1lbnUKKworY29tbWVudCAiQXBwbGV0cyIKKworc291cmNlIGFyY2hpdmFsL0NvbmZpZy5pbgorc291cmNlIGNvcmV1dGlscy9Db25maWcuaW4KK3NvdXJjZSBjb25zb2xlLXRvb2xzL0NvbmZpZy5pbgorc291cmNlIGRlYmlhbnV0aWxzL0NvbmZpZy5pbgorc291cmNlIGVkaXRvcnMvQ29uZmlnLmluCitzb3VyY2UgZmluZHV0aWxzL0NvbmZpZy5pbgorc291cmNlIGluaXQvQ29uZmlnLmluCitzb3VyY2UgbG9naW51dGlscy9Db25maWcuaW4KK3NvdXJjZSBlMmZzcHJvZ3MvQ29uZmlnLmluCitzb3VyY2UgbW9kdXRpbHMvQ29uZmlnLmluCitzb3VyY2UgdXRpbC1saW51eC9Db25maWcuaW4KK3NvdXJjZSBtaXNjdXRpbHMvQ29uZmlnLmluCitzb3VyY2UgbmV0d29ya2luZy9Db25maWcuaW4KK3NvdXJjZSBwcmludHV0aWxzL0NvbmZpZy5pbgorc291cmNlIG1haWx1dGlscy9Db25maWcuaW4KK3NvdXJjZSBwcm9jcHMvQ29uZmlnLmluCitzb3VyY2UgcnVuaXQvQ29uZmlnLmluCitzb3VyY2Ugc2VsaW51eC9Db25maWcuaW4KK3NvdXJjZSBzaGVsbC9Db25maWcuaW4KK3NvdXJjZSBzeXNrbG9nZC9Db25maWcuaW4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL0lOU1RBTEwgYi9idXN5Ym94LTEuMTkuMy9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2U1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9JTlNUQUxMCkBAIC0wLDAgKzEsMTM5IEBACitCdWlsZGluZzoKKz09PT09PT09PQorCitUaGUgQnVzeUJveCBidWlsZCBwcm9jZXNzIGlzIHNpbWlsYXIgdG8gdGhlIExpbnV4IGtlcm5lbCBidWlsZDoKKworICBtYWtlIG1lbnVjb25maWcgICAgICMgVGhpcyBjcmVhdGVzIGEgZmlsZSBjYWxsZWQgIi5jb25maWciCisgIG1ha2UgICAgICAgICAgICAgICAgIyBUaGlzIGNyZWF0ZXMgdGhlICJidXN5Ym94IiBleGVjdXRhYmxlCisgIG1ha2UgaW5zdGFsbCAgICAgICAgIyBvciBtYWtlIENPTkZJR19QUkVGSVg9L3BhdGgvZnJvbS9yb290IGluc3RhbGwKKworVGhlIGZ1bGwgbGlzdCBvZiBjb25maWd1cmF0aW9uIGFuZCBpbnN0YWxsIG9wdGlvbnMgaXMgYXZhaWxhYmxlIGJ5IHR5cGluZzoKKworICBtYWtlIGhlbHAKKworUXVpY2sgU3RhcnQ6Cis9PT09PT09PT09PT0KKworVGhlIGVhc3kgd2F5IHRvIHRyeSBvdXQgQnVzeUJveCBmb3IgdGhlIGZpcnN0IHRpbWUsIHdpdGhvdXQgaGF2aW5nIHRvIGluc3RhbGwKK2l0LCBpcyB0byBlbmFibGUgYWxsIGZlYXR1cmVzIGFuZCB0aGVuIHVzZSAic3RhbmRhbG9uZSBzaGVsbCIgbW9kZSB3aXRoIGEKK2JsYW5rIGNvbW1hbmQgJFBBVEguCisKK1RvIGVuYWJsZSBhbGwgZmVhdHVyZXMsIHVzZSAibWFrZSBkZWZjb25maWciLCB3aGljaCBwcm9kdWNlcyB0aGUgbGFyZ2VzdAorZ2VuZXJhbC1wdXJwb3NlIGNvbmZpZ3VyYXRpb24uICBJdCdzIGFsbHllc2NvbmZpZyBtaW51cyBkZWJ1Z2dpbmcgb3B0aW9ucywKK29wdGlvbmFsIHBhY2thZ2luZyBjaG9pY2VzLCBhbmQgYSBmZXcgc3BlY2lhbC1wdXJwb3NlIGZlYXR1cmVzIHJlcXVpcmluZworZXh0cmEgY29uZmlndXJhdGlvbiB0byB1c2UuICBUaGVuIGVuYWJsZSAic3RhbmRhbG9uZSBzaGVsbCIgZmVhdHVyZToKKworICBtYWtlIGRlZmNvbmZpZworICBtYWtlIG1lbnVjb25maWcKKyAgIyBzZWxlY3QgQnVzeWJveCBTZXR0aW5ncworICAjICAgdGhlbiBHZW5lcmFsIENvbmZpZ3VyYXRpb24KKyAgIyAgICAgdGhlbiBleGVjIHByZWZlcnMgYXBwbGV0cworICAjICAgZXhpdCBiYWNrIHRvIHRvcCBsZXZlbCBtZW51CisgICMgICBzZWxlY3QgU2hlbGxzCisgICMgICAgIHRoZW4gU3RhbmRhbG9uZSBzaGVsbAorICAjICAgZXhpdCBiYWNrIHRvIHRvcCBsZXZlbCBtZW51CisgICMgZXhpdCBhbmQgc2F2ZSBuZXcgY29uZmlndXJhdGlvbgorICAjICAgT1IKKyAgIyB1c2UgdGhlc2UgY29tbWFuZHMgdG8gbW9kaWZ5IC5jb25maWcgZGlyZWN0bHk6CisgIHNlZCAtZSAncy8uKkZFQVRVUkVfUFJFRkVSX0FQUExFVFMuKi9DT05GSUdfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUz15LycgLWkgLmNvbmZpZworICBzZWQgLWUgJ3MvLipGRUFUVVJFX1NIX1NUQU5EQUxPTkUuKi9DT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FPXkvJyAtaSAuY29uZmlnCisgIG1ha2UKKyAgUEFUSD0gLi9idXN5Ym94IGFzaAorCitTdGFuZGFsb25lIHNoZWxsIG1vZGUgY2F1c2VzIGJ1c3lib3gncyBidWlsdC1pbiBjb21tYW5kIHNoZWxsIHRvIHJ1bgorYW55IGJ1aWx0LWluIGJ1c3lib3ggYXBwbGV0cyBkaXJlY3RseSwgd2l0aG91dCBsb29raW5nIGZvciBleHRlcm5hbAorcHJvZ3JhbXMgYnkgdGhhdCBuYW1lLiAgU3VwcGx5aW5nIGFuIGVtcHR5IGNvbW1hbmQgcGF0aCAoYXMgYWJvdmUpIG1lYW5zCit0aGUgb25seSBjb21tYW5kcyBidXN5Ym94IGNhbiBmaW5kIGFyZSB0aGUgYnVpbHQtaW4gb25lcy4KKworTm90ZSB0aGF0IHRoZSBzdGFuZGFsb25lIHNoZWxsIHJlcXVpcmVzIENPTkZJR19CVVNZQk9YX0VYRUNfUEFUSAordG8gYmUgc2V0IGFwcHJvcHJpYXRlbHksIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCAvcHJvYy9zZWxmL2V4ZSBpcworYXZhaWxhYmxlIG9yIG5vdC4gSWYgeW91IGRvIG5vdCBoYXZlIC9wcm9jLCB0aGVuIHBvaW50IHRoYXQgY29uZmlnIG9wdGlvbgordG8gdGhlIGxvY2F0aW9uIG9mIHlvdXIgYnVzeWJveCBiaW5hcnksIHVzdWFsbHkgL2Jpbi9idXN5Ym94LgorCitDb25maWd1cmluZyBCdXN5Ym94OgorPT09PT09PT09PT09PT09PT09PT0KKworQnVzeWJveCBpcyBvcHRpbWl6ZWQgZm9yIHNpemUsIGJ1dCBlbmFibGluZyB0aGUgZnVsbCBzZXQgb2YgZnVuY3Rpb25hbGl0eQorc3RpbGwgcmVzdWx0cyBpbiBhIGZhaXJseSBsYXJnZSBleGVjdXRhYmxlIC0tIG1vcmUgdGhhbiAxIG1lZ2FieXRlIHdoZW4KK3N0YXRpY2FsbHkgbGlua2VkLiAgVG8gc2F2ZSBzcGFjZSwgYnVzeWJveCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIG9ubHkgdGhlCitzZXQgb2YgYXBwbGV0cyBuZWVkZWQgZm9yIGVhY2ggZW52aXJvbm1lbnQuICBUaGUgbWluaW1hbCBjb25maWd1cmF0aW9uLCB3aXRoCithbGwgYXBwbGV0cyBkaXNhYmxlZCwgcHJvZHVjZXMgYSA0ayBleGVjdXRhYmxlLiAgKEl0J3MgdXNlbGVzcywgYnV0IHZlcnkgc21hbGwuKQorCitUaGUgbWFudWFsIGNvbmZpZ3VyYXRvciAibWFrZSBtZW51Y29uZmlnIiBtb2RpZmllcyB0aGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbi4KKyhGb3Igc3lzdGVtcyB3aXRob3V0IG5jdXJzZXMsIHRyeSAibWFrZSBjb25maWciIGluc3RlYWQuKSBUaGUgdHdvIG1vc3QKK2ludGVyZXN0aW5nIHN0YXJ0aW5nIGNvbmZpZ3VyYXRpb25zIGFyZSAibWFrZSBhbGxub2NvbmZpZyIgKHRvIHN0YXJ0IHdpdGgKK2V2ZXJ5dGhpbmcgZGlzYWJsZWQgYW5kIGFkZCBqdXN0IHdoYXQgeW91IG5lZWQpLCBhbmQgIm1ha2UgZGVmY29uZmlnIiAodG8KK3N0YXJ0IHdpdGggZXZlcnl0aGluZyBlbmFibGVkIGFuZCByZW1vdmUgd2hhdCB5b3UgZG9uJ3QgbmVlZCkuICBJZiBtZW51Y29uZmlnCitpcyBydW4gd2l0aG91dCBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLCBtYWtlIGRlZmNvbmZpZyB3aWxsIHJ1biBmaXJzdCB0bworY3JlYXRlIGEga25vd24gc3RhcnRpbmcgcG9pbnQuCisKK090aGVyIHN0YXJ0aW5nIGNvbmZpZ3VyYXRpb25zIChtb3N0bHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3NlcykgaW5jbHVkZQorIm1ha2UgYWxsYmFyZWNvbmZpZyIgKGVuYWJsZXMgYWxsIGFwcGxldHMgYnV0IGRpc2FibGVzIGFsbCBvcHRpb25hbCBmZWF0dXJlcyksCisibWFrZSBhbGx5ZXNjb25maWciIChlbmFibGVzIGFic29sdXRlbHkgZXZlcnl0aGluZyBpbmNsdWRpbmcgZGVidWcgZmVhdHVyZXMpLAorYW5kICJtYWtlIHJhbmRjb25maWciIChwcm9kdWNlIGEgcmFuZG9tIGNvbmZpZ3VyYXRpb24pLiAgVGhlIGNvbmZpZ3MvIGRpcmVjdG9yeQorY29udGFpbnMgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZpbGVzIGVuZGluZyBpbiBfZGVmY29uZmlnIHdoaWNoCithcmUgdXNlZnVsIGluIHNwZWNpZmljIGNhc2VzLiAgIm1ha2UgaGVscCIgd2lsbCBsaXN0IHRoZW0uCisKK0NvbmZpZ3VyaW5nIEJ1c3lCb3ggcHJvZHVjZXMgYSBmaWxlICIuY29uZmlnIiwgd2hpY2ggY2FuIGJlIHNhdmVkIGZvciBmdXR1cmUKK3VzZS4gIFJ1biAibWFrZSBvbGRjb25maWciIHRvIGJyaW5nIGEgLmNvbmZpZyBmaWxlIGZyb20gYW4gb2xkZXIgdmVyc2lvbiBvZgorYnVzeWJveCB1cCB0byBkYXRlLgorCitJbnN0YWxsaW5nIEJ1c3lib3g6Cis9PT09PT09PT09PT09PT09PT09CisKK0J1c3lib3ggaXMgYSBzaW5nbGUgZXhlY3V0YWJsZSB0aGF0IGNhbiBiZWhhdmUgbGlrZSBtYW55IGRpZmZlcmVudCBjb21tYW5kcywKK2FuZCBCdXN5Qm94IHVzZXMgdGhlIG5hbWUgaXQgd2FzIGludm9rZWQgdW5kZXIgdG8gZGV0ZXJtaW5lIHRoZSBkZXNpcmVkCitiZWhhdmlvci4gIChUcnkgIm12IGJ1c3lib3ggbHMiIGFuZCB0aGVuICIuL2xzIC1sIi4pCisKK0luc3RhbGxpbmcgYnVzeWJveCBjb25zaXN0cyBvZiBjcmVhdGluZyBzeW1saW5rcyAob3IgaGFyZGxpbmtzKSB0byB0aGUgYnVzeWJveAorYmluYXJ5IGZvciBlYWNoIGFwcGxldCBlbmFibGVkIGluIGJ1c3lib3gsIGFuZCBtYWtpbmcgc3VyZSB0aGVzZSBzeW1saW5rcyBhcmUKK2luIHRoZSBzaGVsbCdzIGNvbW1hbmQgJFBBVEguICBSdW5uaW5nICJtYWtlIGluc3RhbGwiIGNyZWF0ZXMgdGhlc2Ugc3ltbGlua3MsCitvciAibWFrZSBpbnN0YWxsLWhhcmRsaW5rcyIgY3JlYXRlcyBoYXJkbGlua3MgaW5zdGVhZCAodXNlZnVsIG9uIHN5c3RlbXMgd2l0aAorYSBsaW1pdGVkIG51bWJlciBvZiBpbm9kZXMpLiAgVGhpcyBpbnN0YWxsIHByb2Nlc3MgdXNlcyB0aGUgZmlsZQorImJ1c3lib3gubGlua3MiIChjcmVhdGVkIGJ5IG1ha2UpLCB3aGljaCBjb250YWlucyB0aGUgbGlzdCBvZiBlbmFibGVkIGFwcGxldHMKK2FuZCB0aGUgcGF0aCBhdCB3aGljaCB0byBpbnN0YWxsIHRoZW0uCisKK0luc3RhbGxpbmcgbGlua3MgdG8gYnVzeWJveCBpcyBub3QgYWx3YXlzIG5lY2Vzc2FyeS4gIFRoZSBzcGVjaWFsIGFwcGxldCBuYW1lCisiYnVzeWJveCIgKG9yIHdpdGggYW55IG9wdGlvbmFsIHN1ZmZpeCwgc3VjaCBhcyAiYnVzeWJveC1zdGF0aWMiKSB1c2VzIHRoZQorZmlyc3QgYXJndW1lbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIGFwcGxldCB0byBiZWhhdmUgYXMsIGZvciBleGFtcGxlCisiLi9idXN5Ym94IGNhdCBMSUNFTlNFIi4gIChSdW5uaW5nIHRoZSBidXN5Ym94IGFwcGxldCB3aXRoIG5vIGFyZ3VtZW50cyBnaXZlcworYSBsaXN0IG9mIGFsbCBlbmFibGVkIGFwcGxldHMuKSBUaGUgc3RhbmRhbG9uZSBzaGVsbCBjYW4gYWxzbyBjYWxsIGJ1c3lib3gKK2FwcGxldHMgd2l0aG91dCBsaW5rcyB0byBidXN5Ym94IHVuZGVyIG90aGVyIG5hbWVzIGluIHRoZSBmaWxlc3lzdGVtLiAgWW91IGNhbgorYWxzbyBjb25maWd1cmUgYSBzdGFuZGFsb25lIGluc3RhbGwgY2FwYWJpbGl0eSBpbnRvIHRoZSBidXN5Ym94IGJhc2UgYXBwbGV0LAorYW5kIHRoZW4gaW5zdGFsbCBzdWNoIGxpbmtzIGF0IHJ1bnRpbWUgd2l0aCBvbmUgb2YgImJ1c3lib3ggLS1pbnN0YWxsIiAoZm9yCitoYXJkbGlua3MpIG9yICJidXN5Ym94IC0taW5zdGFsbCAtcyIgKGZvciBzeW1saW5rcykuCisKK0lmIHlvdSBlbmFibGVkIHRoZSBidXN5Ym94IHNoYXJlZCBsaWJyYXJ5IGZlYXR1cmUgKGxpYmJ1c3lib3guc28pIGFuZCB3YW50Cit0byBydW4gdGVzdHMgd2l0aG91dCBpbnN0YWxsaW5nLCBzZXQgeW91ciBMRF9MSUJSQVJZX1BBVEggYWNjb3JkaW5nbHkgd2hlbgorcnVubmluZyB0aGUgZXhlY3V0YWJsZToKKworICBMRF9MSUJSQVJZX1BBVEg9YHB3ZGAgLi9idXN5Ym94CisKK0J1aWxkaW5nIG91dC1vZi10cmVlOgorPT09PT09PT09PT09PT09PT09PT09CisKK0J5IGRlZmF1bHQsIHRoZSBCdXN5Qm94IGJ1aWxkIHB1dHMgaXRzIHRlbXBvcmFyeSBmaWxlcyBpbiB0aGUgc291cmNlIHRyZWUuCitCdWlsZGluZyBmcm9tIGEgcmVhZC1vbmx5IHNvdXJjZSB0cmVlLCBvciBidWlsZGluZyBtdWx0aXBsZSBjb25maWd1cmF0aW9ucyBmcm9tCit0aGUgc2FtZSBzb3VyY2UgZGlyZWN0b3J5LCByZXF1aXJlcyB0aGUgYWJpbGl0eSB0byBwdXQgdGhlIHRlbXBvcmFyeSBmaWxlcworc29tZXdoZXJlIGVsc2UuCisKK1RvIGJ1aWxkIG91dCBvZiB0cmVlLCBjZCB0byBhbiBlbXB0eSBkaXJlY3RvcnkgYW5kIGNvbmZpZ3VyZSBidXN5Ym94IGZyb20gdGhlcmU6CisKKyAgbWFrZSBLQlVJTERfU1JDPS9wYXRoL3RvL3NvdXJjZSAtZiAvcGF0aC90by9zb3VyY2UvTWFrZWZpbGUgZGVmY29uZmlnCisgIG1ha2UKKyAgbWFrZSBpbnN0YWxsCisKK0FsdGVybmF0ZWx5LCB1c2UgdGhlIE89JEJVSUxEUEFUSCBvcHRpb24gKHdpdGggYW4gYWJzb2x1dGUgcGF0aCkgZHVyaW5nIHRoZQorY29uZmlndXJhdGlvbiBzdGVwLCBhcyBpbjoKKworICBtYWtlIE89L3NvbWUvZW1wdHkvZGlyZWN0b3J5IGFsbHllc2NvbmZpZworICBjZCAvc29tZS9lbXB0eS9kaXJlY3RvcnkKKyAgbWFrZQorICBtYWtlIENPTkZJR19QUkVGSVg9LiBpbnN0YWxsCisKK01vcmUgSW5mb3JtYXRpb246Cis9PT09PT09PT09PT09PT09PQorCitTZSBhbHNvIHRoZSBidXN5Ym94IEZBUSwgdW5kZXIgdGhlIHF1ZXN0aW9ucyAiSG93IGNhbiBJIGdldCBzdGFydGVkIHVzaW5nCitCdXN5Qm94IiBhbmQgIkhvdyBkbyBJIGJ1aWxkIGEgQnVzeUJveC1iYXNlZCBzeXN0ZW0/IiAgVGhlIEJ1c3lCb3ggRkFRIGlzCithdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LmJ1c3lib3gubmV0L0ZBUS5odG1sCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9MSUNFTlNFIGIvYnVzeWJveC0xLjE5LjMvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjUwYTcxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvTElDRU5TRQpAQCAtMCwwICsxLDM0OCBAQAorLS0tIEEgbm90ZSBvbiBHUEwgdmVyc2lvbnMKKworQnVzeUJveCBpcyBkaXN0cmlidXRlZCB1bmRlciB2ZXJzaW9uIDIgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGluY2x1ZGVkCitpbiBpdHMgZW50aXJldHksIGJlbG93KS4gIFZlcnNpb24gMiBpcyB0aGUgb25seSB2ZXJzaW9uIG9mIHRoaXMgbGljZW5zZSB3aGljaAordGhpcyB2ZXJzaW9uIG9mIEJ1c3lCb3ggKG9yIG1vZGlmaWVkIHZlcnNpb25zIGRlcml2ZWQgZnJvbSB0aGlzIG9uZSkgbWF5IGJlCitkaXN0cmlidXRlZCB1bmRlci4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvTWFrZWZpbGUgYi9idXN5Ym94LTEuMTkuMy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQ4YzljCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMzQxIEBACitWRVJTSU9OID0gMQorUEFUQ0hMRVZFTCA9IDE5CitTVUJMRVZFTCA9IDMKK0VYVFJBVkVSU0lPTiA9CitOQU1FID0gVW5uYW1lZAorCisjICpET0NVTUVOVEFUSU9OKgorIyBUbyBzZWUgYSBsaXN0IG9mIHR5cGljYWwgdGFyZ2V0cyBleGVjdXRlICJtYWtlIGhlbHAiCisjIE1vcmUgaW5mbyBjYW4gYmUgbG9jYXRlZCBpbiAuL1JFQURNRQorIyBDb21tZW50cyBpbiB0aGlzIGZpbGUgYXJlIHRhcmdldGVkIG9ubHkgdG8gdGhlIGRldmVsb3BlciwgZG8gbm90CisjIGV4cGVjdCB0byBsZWFybiBob3cgdG8gYnVpbGQgdGhlIGtlcm5lbCByZWFkaW5nIHRoaXMgZmlsZS4KKworIyBEbyBub3QgcHJpbnQgIkVudGVyaW5nIGRpcmVjdG9yeSAuLi4iCitNQUtFRkxBR1MgKz0gLS1uby1wcmludC1kaXJlY3RvcnkKKworIyBXZSBhcmUgdXNpbmcgYSByZWN1cnNpdmUgYnVpbGQsIHNvIHdlIG5lZWQgdG8gZG8gYSBsaXR0bGUgdGhpbmtpbmcKKyMgdG8gZ2V0IHRoZSBvcmRlcmluZyByaWdodC4KKyMKKyMgTW9zdCBpbXBvcnRhbnRseTogc3ViLU1ha2VmaWxlcyBzaG91bGQgb25seSBldmVyIG1vZGlmeSBmaWxlcyBpbgorIyB0aGVpciBvd24gZGlyZWN0b3J5LiBJZiBpbiBzb21lIGRpcmVjdG9yeSB3ZSBoYXZlIGEgZGVwZW5kZW5jeSBvbgorIyBhIGZpbGUgaW4gYW5vdGhlciBkaXIgKHdoaWNoIGRvZXNuJ3QgaGFwcGVuIG9mdGVuLCBidXQgaXQncyBvZnRlbgorIyB1bmF2b2lkYWJsZSB3aGVuIGxpbmtpbmcgdGhlIGJ1aWx0LWluLm8gdGFyZ2V0cyB3aGljaCBmaW5hbGx5CisjIHR1cm4gaW50byBidXN5Ym94KSwgd2Ugd2lsbCBjYWxsIGEgc3ViIG1ha2UgaW4gdGhhdCBvdGhlciBkaXIsIGFuZAorIyBhZnRlciB0aGF0IHdlIGFyZSBzdXJlIHRoYXQgZXZlcnl0aGluZyB3aGljaCBpcyBpbiB0aGF0IG90aGVyIGRpcgorIyBpcyBub3cgdXAgdG8gZGF0ZS4KKyMKKyMgVGhlIG9ubHkgY2FzZXMgd2hlcmUgd2UgbmVlZCB0byBtb2RpZnkgZmlsZXMgd2hpY2ggaGF2ZSBnbG9iYWwKKyMgZWZmZWN0cyBhcmUgdGh1cyBzZXBhcmF0ZWQgb3V0IGFuZCBkb25lIGJlZm9yZSB0aGUgcmVjdXJzaXZlCisjIGRlc2NlbmRpbmcgaXMgc3RhcnRlZC4gVGhleSBhcmUgbm93IGV4cGxpY2l0bHkgbGlzdGVkIGFzIHRoZQorIyBwcmVwYXJlIHJ1bGUuCisKKyMgVG8gcHV0IG1vcmUgZm9jdXMgb24gd2FybmluZ3MsIGJlIGxlc3MgdmVyYm9zZSBhcyBkZWZhdWx0CisjIFVzZSAnbWFrZSBWPTEnIHRvIHNlZSB0aGUgZnVsbCBjb21tYW5kcworCitpZmRlZiBWCisgIGlmZXEgKCIkKG9yaWdpbiBWKSIsICJjb21tYW5kIGxpbmUiKQorICAgIEtCVUlMRF9WRVJCT1NFID0gJChWKQorICBlbmRpZgorZW5kaWYKK2lmbmRlZiBLQlVJTERfVkVSQk9TRQorICBLQlVJTERfVkVSQk9TRSA9IDAKK2VuZGlmCisKKyMgQ2FsbCBzcGFyc2UgYXMgcGFydCBvZiBjb21waWxhdGlvbiBvZiBDIGZpbGVzCisjIFVzZSAnbWFrZSBDPTEnIHRvIGVuYWJsZSBzcGFyc2UgY2hlY2tpbmcKKworaWZkZWYgQworICBpZmVxICgiJChvcmlnaW4gQykiLCAiY29tbWFuZCBsaW5lIikKKyAgICBLQlVJTERfQ0hFQ0tTUkMgPSAkKEMpCisgIGVuZGlmCitlbmRpZgoraWZuZGVmIEtCVUlMRF9DSEVDS1NSQworICBLQlVJTERfQ0hFQ0tTUkMgPSAwCitlbmRpZgorCisjIFVzZSBtYWtlIE09ZGlyIHRvIHNwZWNpZnkgZGlyZWN0b3J5IG9mIGV4dGVybmFsIG1vZHVsZSB0byBidWlsZAorIyBPbGQgc3ludGF4IG1ha2UgLi4uIFNVQkRJUlM9JFBXRCBpcyBzdGlsbCBzdXBwb3J0ZWQKKyMgU2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgS0JVSUxEX0VYVE1PRCB0YWtlIHByZWNlZGVuY2UKK2lmZGVmIFNVQkRJUlMKKyAgS0JVSUxEX0VYVE1PRCA/PSAkKFNVQkRJUlMpCitlbmRpZgoraWZkZWYgTQorICBpZmVxICgiJChvcmlnaW4gTSkiLCAiY29tbWFuZCBsaW5lIikKKyAgICBLQlVJTERfRVhUTU9EIDo9ICQoTSkKKyAgZW5kaWYKK2VuZGlmCisKKworIyBrYnVpbGQgc3VwcG9ydHMgc2F2aW5nIG91dHB1dCBmaWxlcyBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeS4KKyMgVG8gbG9jYXRlIG91dHB1dCBmaWxlcyBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSB0d28gc3ludGF4ZXMgYXJlIHN1cHBvcnRlZC4KKyMgSW4gYm90aCBjYXNlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgbXVzdCBiZSB0aGUgcm9vdCBvZiB0aGUga2VybmVsIHNyYy4KKyMgMSkgTz0KKyMgVXNlICJtYWtlIE89ZGlyL3RvL3N0b3JlL291dHB1dC9maWxlcy8iCisjCisjIDIpIFNldCBLQlVJTERfT1VUUFVUCisjIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgS0JVSUxEX09VVFBVVCB0byBwb2ludCB0byB0aGUgZGlyZWN0b3J5CisjIHdoZXJlIHRoZSBvdXRwdXQgZmlsZXMgc2hhbGwgYmUgcGxhY2VkLgorIyBleHBvcnQgS0JVSUxEX09VVFBVVD1kaXIvdG8vc3RvcmUvb3V0cHV0L2ZpbGVzLworIyBtYWtlCisjCisjIFRoZSBPPSBhc3NpZ25tZW50IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgS0JVSUxEX09VVFBVVCBlbnZpcm9ubWVudAorIyB2YXJpYWJsZS4KKworCisjIEtCVUlMRF9TUkMgaXMgc2V0IG9uIGludm9jYXRpb24gb2YgbWFrZSBpbiBPQkogZGlyZWN0b3J5CisjIEtCVUlMRF9TUkMgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHJlZ3VsYXIgdXNlciAoZm9yIG5vdykKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorCisjIE9LLCBNYWtlIGNhbGxlZCBpbiBkaXJlY3Rvcnkgd2hlcmUga2VybmVsIHNyYyByZXNpZGVzCisjIERvIHdlIHdhbnQgdG8gbG9jYXRlIG91dHB1dCBmaWxlcyBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeT8KK2lmZGVmIE8KKyAgaWZlcSAoIiQob3JpZ2luIE8pIiwgImNvbW1hbmQgbGluZSIpCisgICAgS0JVSUxEX09VVFBVVCA6PSAkKE8pCisgIGVuZGlmCitlbmRpZgorCisjIFRoYXQncyBvdXIgZGVmYXVsdCB0YXJnZXQgd2hlbiBub25lIGlzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUKK1BIT05ZIDo9IF9hbGwKK19hbGw6CisKK2lmbmVxICgkKEtCVUlMRF9PVVRQVVQpLCkKKyMgSW52b2tlIGEgc2Vjb25kIG1ha2UgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnksIHBhc3NpbmcgcmVsZXZhbnQgdmFyaWFibGVzCisjIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgYWN0dWFsbHkgZXhpc3RzCitzYXZlZC1vdXRwdXQgOj0gJChLQlVJTERfT1VUUFVUKQorS0JVSUxEX09VVFBVVCA6PSAkKHNoZWxsIGNkICQoS0JVSUxEX09VVFBVVCkgJiYgL2Jpbi9wd2QpCiskKGlmICQoS0JVSUxEX09VVFBVVCksLCBcCisgICAgICQoZXJyb3Igb3V0cHV0IGRpcmVjdG9yeSAiJChzYXZlZC1vdXRwdXQpIiBkb2VzIG5vdCBleGlzdCkpCisKK1BIT05ZICs9ICQoTUFLRUNNREdPQUxTKQorCiskKGZpbHRlci1vdXQgX2FsbCwkKE1BS0VDTURHT0FMUykpIF9hbGw6CisJJChpZiAkKEtCVUlMRF9WRVJCT1NFOjE9KSxAKSQoTUFLRSkgLUMgJChLQlVJTERfT1VUUFVUKSBcCisJS0JVSUxEX1NSQz0kKENVUkRJUikgXAorCUtCVUlMRF9FWFRNT0Q9IiQoS0JVSUxEX0VYVE1PRCkiIC1mICQoQ1VSRElSKS9NYWtlZmlsZSAkQAorCisjIExlYXZlIHByb2Nlc3NpbmcgdG8gYWJvdmUgaW52b2NhdGlvbiBvZiBtYWtlCitza2lwLW1ha2VmaWxlIDo9IDEKK2VuZGlmICMgaWZuZXEgKCQoS0JVSUxEX09VVFBVVCksKQorZW5kaWYgIyBpZmVxICgkKEtCVUlMRF9TUkMpLCkKKworIyBXZSBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBNYWtlZmlsZSBpZiB0aGlzIGlzIHRoZSBmaW5hbCBpbnZvY2F0aW9uIG9mIG1ha2UKK2lmZXEgKCQoc2tpcC1tYWtlZmlsZSksKQorCisjIElmIGJ1aWxkaW5nIGFuIGV4dGVybmFsIG1vZHVsZSB3ZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgYWxsOiBydWxlCisjIGJ1dCBpbnN0ZWFkIF9hbGwgZGVwZW5kIG9uIG1vZHVsZXMKK1BIT05ZICs9IGFsbAoraWZlcSAoJChLQlVJTERfRVhUTU9EKSwpCitfYWxsOiBhbGwKK2Vsc2UKK19hbGw6IG1vZHVsZXMKK2VuZGlmCisKK3NyY3RyZWUJCTo9ICQoaWYgJChLQlVJTERfU1JDKSwkKEtCVUlMRF9TUkMpLCQoQ1VSRElSKSkKK1RPUERJUgkJOj0gJChzcmN0cmVlKQorIyBGSVhNRSAtIFRPUERJUiBpcyBvYnNvbGV0ZSwgdXNlIHNyY3RyZWUvb2JqdHJlZQorb2JqdHJlZQkJOj0gJChDVVJESVIpCitzcmMJCTo9ICQoc3JjdHJlZSkKK29iagkJOj0gJChvYmp0cmVlKQorCitWUEFUSAkJOj0gJChzcmN0cmVlKSQoaWYgJChLQlVJTERfRVhUTU9EKSw6JChLQlVJTERfRVhUTU9EKSkKKworZXhwb3J0IHNyY3RyZWUgb2JqdHJlZSBWUEFUSCBUT1BESVIKKworCisjIENyb3NzIGNvbXBpbGluZyBhbmQgc2VsZWN0aW5nIGRpZmZlcmVudCBzZXQgb2YgZ2NjL2Jpbi11dGlscworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgV2hlbiBwZXJmb3JtaW5nIGNyb3NzIGNvbXBpbGF0aW9uIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIEFSQ0ggc2hhbGwgYmUgc2V0CisjIHRvIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAoU2VlIGFyY2gvKiBmb3IgdGhlIHBvc3NpYmlsaXRpZXMpLgorIyBBUkNIIGNhbiBiZSBzZXQgZHVyaW5nIGludm9jYXRpb24gb2YgbWFrZToKKyMgbWFrZSBBUkNIPWlhNjQKKyMgQW5vdGhlciB3YXkgaXMgdG8gaGF2ZSBBUkNIIHNldCBpbiB0aGUgZW52aXJvbm1lbnQuCisjIFRoZSBkZWZhdWx0IEFSQ0ggaXMgdGhlIGhvc3Qgd2hlcmUgbWFrZSBpcyBleGVjdXRlZC4KKworIyBDUk9TU19DT01QSUxFIHNwZWNpZnkgdGhlIHByZWZpeCB1c2VkIGZvciBhbGwgZXhlY3V0YWJsZXMgdXNlZAorIyBkdXJpbmcgY29tcGlsYXRpb24uIE9ubHkgZ2NjIGFuZCByZWxhdGVkIGJpbi11dGlscyBleGVjdXRhYmxlcworIyBhcmUgcHJlZml4ZWQgd2l0aCAkKENST1NTX0NPTVBJTEUpLgorIyBDUk9TU19DT01QSUxFIGNhbiBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZQorIyBtYWtlIENST1NTX0NPTVBJTEU9aWE2NC1saW51eC0KKyMgQWx0ZXJuYXRpdmVseSBDUk9TU19DT01QSUxFIGNhbiBiZSBzZXQgaW4gdGhlIGVudmlyb25tZW50LgorIyBEZWZhdWx0IHZhbHVlIGZvciBDUk9TU19DT01QSUxFIGlzIG5vdCB0byBwcmVmaXggZXhlY3V0YWJsZXMKKyMgTm90ZTogU29tZSBhcmNoaXRlY3R1cmVzIGFzc2lnbiBDUk9TU19DT01QSUxFIGluIHRoZWlyIGFyY2gvKi9NYWtlZmlsZQorCitDUk9TU19DT01QSUxFID89CisjIGJib3g6IHdlIG1heSBoYXZlIENPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVggaW4gLmNvbmZpZywKKyMgYW5kIGl0IGhhcyBub3QgYmVlbiBpbmNsdWRlZCB5ZXQuLi4gdGh1cyB1c2luZyBhbiBhd2t3YXJkIHN5bnRheC4KK2lmZXEgKCQoQ1JPU1NfQ09NUElMRSksKQorQ1JPU1NfQ09NUElMRSA6PSAkKHNoZWxsIGdyZXAgXkNPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVggLmNvbmZpZyAyPi9kZXYvbnVsbCkKK0NST1NTX0NPTVBJTEUgOj0gJChzdWJzdCBDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYPSwsJChDUk9TU19DT01QSUxFKSkKK0NST1NTX0NPTVBJTEUgOj0gJChzdWJzdCAiLCwkKENST1NTX0NPTVBJTEUpKQorIyIpCitlbmRpZgorCisjIFNVQkFSQ0ggdGVsbHMgdGhlIHVzZXJtb2RlIGJ1aWxkIHdoYXQgdGhlIHVuZGVybHlpbmcgYXJjaCBpcy4gIFRoYXQgaXMgc2V0CisjIGZpcnN0LCBhbmQgaWYgYSB1c2VybW9kZSBidWlsZCBpcyBoYXBwZW5pbmcsIHRoZSAiQVJDSD11bSIgb24gdGhlIGNvbW1hbmQKKyMgbGluZSBvdmVycmlkZXMgdGhlIHNldHRpbmcgb2YgQVJDSCBiZWxvdy4gIElmIGEgbmF0aXZlIGJ1aWxkIGlzIGhhcHBlbmluZywKKyMgdGhlbiBBUkNIIGlzIGFzc2lnbmVkLCBnZXR0aW5nIHdoYXRldmVyIHZhbHVlIGl0IGdldHMgbm9ybWFsbHksIGFuZAorIyBTVUJBUkNIIGlzIHN1YnNlcXVlbnRseSBpZ25vcmVkLgorCitpZm5lcSAoJChDUk9TU19DT01QSUxFKSwpCitTVUJBUkNIIDo9ICQoc2hlbGwgZWNobyAkKENST1NTX0NPTVBJTEUpIHwgY3V0IC1kLSAtZjEpCitlbHNlCitTVUJBUkNIIDo9ICQoc2hlbGwgdW5hbWUgLW0pCitlbmRpZgorU1VCQVJDSCA6PSAkKHNoZWxsIGVjaG8gJChTVUJBUkNIKSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8gLWUgcy9zdW40dS9zcGFyYzY0LyBcCisJCQkJCSAtZSBzL2FybS4qL2FybS8gLWUgcy9zYTExMC9hcm0vIFwKKwkJCQkJIC1lIHMvczM5MHgvczM5MC8gLWUgcy9wYXJpc2M2NC9wYXJpc2MvIFwKKwkJCQkJIC1lIHMvcHBjLiovcG93ZXJwYy8gLWUgcy9taXBzLiovbWlwcy8gKQorCitBUkNIID89ICQoU1VCQVJDSCkKKworIyBBcmNoaXRlY3R1cmUgYXMgcHJlc2VudCBpbiBjb21waWxlLmgKK1VUU19NQUNISU5FIDo9ICQoQVJDSCkKKworIyBTSEVMTCB1c2VkIGJ5IGtidWlsZAorQ09ORklHX1NIRUxMIDo9ICQoc2hlbGwgaWYgWyAteCAiJCRCQVNIIiBdOyB0aGVuIGVjaG8gJCRCQVNIOyBcCisJICBlbHNlIGlmIFsgLXggL2Jpbi9iYXNoIF07IHRoZW4gZWNobyAvYmluL2Jhc2g7IFwKKwkgIGVsc2UgZWNobyBzaDsgZmkgOyBmaSkKKworIyAJRGVjaWRlIHdoZXRoZXIgdG8gYnVpbGQgYnVpbHQtaW4sIG1vZHVsYXIsIG9yIGJvdGguCisjCU5vcm1hbGx5LCBqdXN0IGRvIGJ1aWx0LWluLgorCitLQlVJTERfTU9EVUxFUyA6PQorS0JVSUxEX0JVSUxUSU4gOj0gMQorCisjCUlmIHdlIGhhdmUgb25seSAibWFrZSBtb2R1bGVzIiwgZG9uJ3QgY29tcGlsZSBidWlsdC1pbiBvYmplY3RzLgorIwlXaGVuIHdlJ3JlIGJ1aWxkaW5nIG1vZHVsZXMgd2l0aCBtb2R2ZXJzaW9ucywgd2UgbmVlZCB0byBjb25zaWRlcgorIwl0aGUgYnVpbHQtaW4gb2JqZWN0cyBkdXJpbmcgdGhlIGRlc2NlbmQgYXMgd2VsbCwgaW4gb3JkZXIgdG8KKyMJbWFrZSBzdXJlIHRoZSBjaGVja3N1bXMgYXJlIHVwdG9kYXRlIGJlZm9yZSB3ZSByZWNvcmQgdGhlbS4KKworaWZlcSAoJChNQUtFQ01ER09BTFMpLG1vZHVsZXMpCisgIEtCVUlMRF9CVUlMVElOIDo9ICQoaWYgJChDT05GSUdfTU9EVkVSU0lPTlMpLDEpCitlbmRpZgorCisjCUlmIHdlIGhhdmUgIm1ha2UgPHdoYXRldmVyPiBtb2R1bGVzIiwgY29tcGlsZSBtb2R1bGVzCisjCWluIGFkZGl0aW9uIHRvIHdoYXRldmVyIHdlIGRvIGFueXdheS4KKyMJSnVzdCAibWFrZSIgb3IgIm1ha2UgYWxsIiBzaGFsbCBidWlsZCBtb2R1bGVzIGFzIHdlbGwKKworaWZuZXEgKCQoZmlsdGVyIGFsbCBfYWxsIG1vZHVsZXMsJChNQUtFQ01ER09BTFMpKSwpCisgIEtCVUlMRF9NT0RVTEVTIDo9IDEKK2VuZGlmCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSwpCisgIEtCVUlMRF9NT0RVTEVTIDo9IDEKK2VuZGlmCisKK2V4cG9ydCBLQlVJTERfTU9EVUxFUyBLQlVJTERfQlVJTFRJTgorZXhwb3J0IEtCVUlMRF9DSEVDS1NSQyBLQlVJTERfU1JDIEtCVUlMRF9FWFRNT0QKKworIyBCZWF1dGlmeSBvdXRwdXQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIE5vcm1hbGx5LCB3ZSBlY2hvIHRoZSB3aG9sZSBjb21tYW5kIGJlZm9yZSBleGVjdXRpbmcgaXQuIEJ5IG1ha2luZworIyB0aGF0IGVjaG8gJCgkKHF1aWV0KSQoY21kKSksIHdlIG5vdyBoYXZlIHRoZSBwb3NzaWJpbGl0eSB0byBzZXQKKyMgJChxdWlldCkgdG8gY2hvb3NlIG90aGVyIGZvcm1zIG9mIG91dHB1dCBpbnN0ZWFkLCBlLmcuCisjCisjICAgICAgICAgcXVpZXRfY21kX2NjX29fYyA9IENvbXBpbGluZyAkKFJFTERJUikvJEAKKyMgICAgICAgICBjbWRfY2Nfb19jICAgICAgID0gJChDQykgJChjX2ZsYWdzKSAtYyAtbyAkQCAkPAorIworIyBJZiAkKHF1aWV0KSBpcyBlbXB0eSwgdGhlIHdob2xlIGNvbW1hbmQgd2lsbCBiZSBwcmludGVkLgorIyBJZiBpdCBpcyBzZXQgdG8gInF1aWV0XyIsIG9ubHkgdGhlIHNob3J0IHZlcnNpb24gd2lsbCBiZSBwcmludGVkLgorIyBJZiBpdCBpcyBzZXQgdG8gInNpbGVudF8iLCBub3RoaW5nIHdpbCBiZSBwcmludGVkIGF0IGFsbCwgc2luY2UKKyMgdGhlIHZhcmlhYmxlICQoc2lsZW50X2NtZF9jY19vX2MpIGRvZXNuJ3QgZXhpc3QuCisjCisjIEEgc2ltcGxlIHZhcmlhbnQgaXMgdG8gcHJlZml4IGNvbW1hbmRzIHdpdGggJChRKSAtIHRoYXQncyB1c2VmdWwKKyMgZm9yIGNvbW1hbmRzIHRoYXQgc2hhbGwgYmUgaGlkZGVuIGluIG5vbi12ZXJib3NlIG1vZGUuCisjCisjCSQoUSlsbiAkQCA6PAorIworIyBJZiBLQlVJTERfVkVSQk9TRSBlcXVhbHMgMCB0aGVuIHRoZSBhYm92ZSBjb21tYW5kIHdpbGwgYmUgaGlkZGVuLgorIyBJZiBLQlVJTERfVkVSQk9TRSBlcXVhbHMgMSB0aGVuIHRoZSBhYm92ZSBjb21tYW5kIGlzIGRpc3BsYXllZC4KKworaWZlcSAoJChLQlVJTERfVkVSQk9TRSksMSkKKyAgcXVpZXQgPQorICBRID0KK2Vsc2UKKyAgcXVpZXQ9cXVpZXRfCisgIFEgPSBACitlbmRpZgorCisjIElmIHRoZSB1c2VyIGlzIHJ1bm5pbmcgbWFrZSAtcyAoc2lsZW50IG1vZGUpLCBzdXBwcmVzcyBlY2hvaW5nIG9mCisjIGNvbW1hbmRzCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgcywkKE1BS0VGTEFHUykpLCkKKyAgcXVpZXQ9c2lsZW50XworZW5kaWYKKworZXhwb3J0IHF1aWV0IFEgS0JVSUxEX1ZFUkJPU0UKKworCisjIExvb2sgZm9yIG1ha2UgaW5jbHVkZSBmaWxlcyByZWxhdGl2ZSB0byByb290IG9mIGtlcm5lbCBzcmMKK01BS0VGTEFHUyArPSAtLWluY2x1ZGUtZGlyPSQoc3JjdHJlZSkKKworSE9TVENDICAJPSBnY2MKK0hPU1RDWFggIAk9IGcrKworSE9TVENGTEFHUwk6PQorSE9TVENYWEZMQUdTCTo9CisjIFdlIG5lZWQgc29tZSBnZW5lcmljIGRlZmluaXRpb25zCitpbmNsdWRlICQoc3JjdHJlZSkvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQorCitIT1NUQ0ZMQUdTCSs9ICQoY2FsbCBob3N0Y2Mtb3B0aW9uLC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyLCkKK0hPU1RDWFhGTEFHUwkrPSAtTzIKKworIyBGb3IgbWF4aW11bSBwZXJmb3JtYW5jZSAoKyBwb3NzaWJseSByYW5kb20gYnJlYWthZ2UsIHVuY29tbWVudAorIyB0aGUgZm9sbG93aW5nKQorCitNQUtFRkxBR1MgKz0gLXJSCisKKyMgTWFrZSB2YXJpYWJsZXMgKENDLCBldGMuLi4pCisKK0FTCQk9ICQoQ1JPU1NfQ09NUElMRSlhcworQ0MJCT0gJChDUk9TU19DT01QSUxFKWdjYworTEQJCT0gJChDQykgLW5vc3RkbGliCitDUFAJCT0gJChDQykgLUUKK0FSCQk9ICQoQ1JPU1NfQ09NUElMRSlhcgorTk0JCT0gJChDUk9TU19DT01QSUxFKW5tCitTVFJJUAkJPSAkKENST1NTX0NPTVBJTEUpc3RyaXAKK09CSkNPUFkJCT0gJChDUk9TU19DT01QSUxFKW9iamNvcHkKK09CSkRVTVAJCT0gJChDUk9TU19DT01QSUxFKW9iamR1bXAKK0FXSwkJPSBhd2sKK0dFTktTWU1TCT0gc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcworREVQTU9ECQk9IC9zYmluL2RlcG1vZAorS0FMTFNZTVMJPSBzY3JpcHRzL2thbGxzeW1zCitQRVJMCQk9IHBlcmwKK0NIRUNLCQk9IHNwYXJzZQorCitDSEVDS0ZMQUdTICAgICA6PSAtRF9fbGludXhfXyAtRGxpbnV4IC1EX19TVERDX18gLUR1bml4IC1EX191bml4X18gLVdiaXR3aXNlICQoQ0YpCitNT0RGTEFHUwk9IC1ETU9EVUxFCitDRkxBR1NfTU9EVUxFICAgPSAkKE1PREZMQUdTKQorQUZMQUdTX01PRFVMRSAgID0gJChNT0RGTEFHUykKK0xERkxBR1NfTU9EVUxFICA9IC1yCitDRkxBR1NfS0VSTkVMCT0KK0FGTEFHU19LRVJORUwJPQorCisKKyMgVXNlIExJTlVYSU5DTFVERSB3aGVuIHlvdSBtdXN0IHJlZmVyZW5jZSB0aGUgaW5jbHVkZS8gZGlyZWN0b3J5LgorIyBOZWVkZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBPPSBvcHRpb24KK0NGTEFHUwkJOj0gJChDRkxBR1MpCisjIEFkZGVkIG9ubHkgdG8gZmluYWwgbGluayBzdGFnZSBvZiBidXN5Ym94IGJpbmFyeQorQ0ZMQUdTX2J1c3lib3gJOj0gJChDRkxBR1NfYnVzeWJveCkKK0NQUEZMQUdTCTo9ICQoQ1BQRkxBR1MpCitBRkxBR1MJCTo9ICQoQUZMQUdTKQorTERGTEFHUwkJOj0gJChMREZMQUdTKQorTERMSUJTCQk6PQorCisjIFJlYWQgS0VSTkVMUkVMRUFTRSBmcm9tIC5rZXJuZWxyZWxlYXNlIChpZiBpdCBleGlzdHMpCitLRVJORUxSRUxFQVNFID0gJChzaGVsbCBjYXQgLmtlcm5lbHJlbGVhc2UgMj4gL2Rldi9udWxsKQorS0VSTkVMVkVSU0lPTiA9ICQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKQorCitleHBvcnQJVkVSU0lPTiBQQVRDSExFVkVMIFNVQkxFVkVMIEtFUk5FTFJFTEVBU0UgS0VSTkVMVkVSU0lPTiBcCisJQVJDSCBDT05GSUdfU0hFTEwgSE9TVENDIEhPU1RDRkxBR1MgQ1JPU1NfQ09NUElMRSBBUyBMRCBDQyBcCisJQ1BQIEFSIE5NIFNUUklQIE9CSkNPUFkgT0JKRFVNUCBNQUtFIEFXSyBHRU5LU1lNUyBQRVJMIFVUU19NQUNISU5FIFwKKwlIT1NUQ1hYIEhPU1RDWFhGTEFHUyBMREZMQUdTX01PRFVMRSBDSEVDSyBDSEVDS0ZMQUdTCisKK2V4cG9ydCBDUFBGTEFHUyBOT1NURElOQ19GTEFHUyBMSU5VWElOQ0xVREUgT0JKQ09QWUZMQUdTIExERkxBR1MKK2V4cG9ydCBDRkxBR1MgQ0ZMQUdTX0tFUk5FTCBDRkxBR1NfTU9EVUxFCitleHBvcnQgQUZMQUdTIEFGTEFHU19LRVJORUwgQUZMQUdTX01PRFVMRQorZXhwb3J0IEZMVEZMQUdTCisKKyMgV2hlbiBjb21waWxpbmcgb3V0LW9mLXRyZWUgbW9kdWxlcywgcHV0IE1PRFZFUkRJUiBpbiB0aGUgbW9kdWxlCisjIHRyZWUgcmF0aGVyIHRoYW4gaW4gdGhlIGtlcm5lbCB0cmVlLiBUaGUga2VybmVsIHRyZWUgbWlnaHQKKyMgZXZlbiBiZSByZWFkLW9ubHkuCitleHBvcnQgTU9EVkVSRElSIDo9ICQoaWYgJChLQlVJTERfRVhUTU9EKSwkKGZpcnN0d29yZCAkKEtCVUlMRF9FWFRNT0QpKS8pLnRtcF92ZXJzaW9ucworCisjIEZpbGVzIHRvIGlnbm9yZSBpbiBmaW5kIC4uLiBzdGF0ZW1lbnRzCisKK1JDU19GSU5EX0lHTk9SRSA6PSBcKCAtbmFtZSBTQ0NTIC1vIC1uYW1lIEJpdEtlZXBlciAtbyAtbmFtZSAuc3ZuIC1vIC1uYW1lIENWUyAtbyAtbmFtZSAucGMgLW8gLW5hbWUgLmhnIC1vIC1uYW1lIC5naXQgXCkgLXBydW5lIC1vCitleHBvcnQgUkNTX1RBUl9JR05PUkUgOj0gLS1leGNsdWRlIFNDQ1MgLS1leGNsdWRlIEJpdEtlZXBlciAtLWV4Y2x1ZGUgLnN2biAtLWV4Y2x1ZGUgQ1ZTIC0tZXhjbHVkZSAucGMgLS1leGNsdWRlIC5oZyAtLWV4Y2x1ZGUgLmdpdAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBSdWxlcyBzaGFyZWQgYmV0d2VlbiAqY29uZmlnIHRhcmdldHMgYW5kIGJ1aWxkIHRhcmdldHMKKworIyBCYXNpYyBoZWxwZXJzIGJ1aWx0IGluIHNjcmlwdHMvCitQSE9OWSArPSBzY3JpcHRzX2Jhc2ljCitzY3JpcHRzX2Jhc2ljOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMvYmFzaWMKKworIyBUbyBhdm9pZCBhbnkgaW1wbGljaXQgcnVsZSB0byBraWNrIGluLCBkZWZpbmUgYW4gZW1wdHkgY29tbWFuZC4KK3NjcmlwdHMvYmFzaWMvJTogc2NyaXB0c19iYXNpYyA7CisKKyMgVGhpcyB0YXJnZXQgZ2VuZXJhdGVzIEtidWlsZCdzIGFuZCBDb25maWcuaW4ncyBmcm9tICouYyBmaWxlcworUEhPTlkgKz0gZ2VuX2J1aWxkX2ZpbGVzCitnZW5fYnVpbGRfZmlsZXM6ICQod2lsZGNhcmQgJChzcmN0cmVlKS8qLyouYykgJCh3aWxkY2FyZCAkKHNyY3RyZWUpLyovKi8qLmMpCisJJChRKSQoc3JjdHJlZSkvc2NyaXB0cy9nZW5fYnVpbGRfZmlsZXMuc2ggJChzcmN0cmVlKSAkKG9ianRyZWUpCisKKyMgYmJveDogd2UgaGF2ZSBoZWxwZXJzIGluIGFwcGxldHMvCisjIHdlIGRlcGVuZCBvbiBzY3JpcHRzX2Jhc2ljLCBzaW5jZSBzY3JpcHRzL2Jhc2ljL2ZpeGRlcAorIyBtdXN0IGJlIGJ1aWx0IGJlZm9yZSBhbnkgb3RoZXIgaG9zdCBwcm9nCitQSE9OWSArPSBhcHBsZXRzX2RpcgorYXBwbGV0c19kaXI6IHNjcmlwdHNfYmFzaWMgZ2VuX2J1aWxkX2ZpbGVzCisJJChRKSQoTUFLRSkgJChidWlsZCk9YXBwbGV0cworCithcHBsZXRzLyU6IGFwcGxldHNfZGlyIDsKKworUEhPTlkgKz0gb3V0cHV0bWFrZWZpbGUKKyMgb3V0cHV0bWFrZWZpbGUgZ2VuZXJhdGVzIGEgTWFrZWZpbGUgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnksIGlmIHVzaW5nIGEKKyMgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeS4gVGhpcyBhbGxvd3MgY29udmVuaWVudCB1c2Ugb2YgbWFrZSBpbiB0aGUKKyMgb3V0cHV0IGRpcmVjdG9yeS4KK291dHB1dG1ha2VmaWxlOgoraWZuZXEgKCQoS0JVSUxEX1NSQyksKQorCSQoUSkkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL21rbWFrZWZpbGUgXAorCSAgICAkKHNyY3RyZWUpICQob2JqdHJlZSkgJChWRVJTSU9OKSAkKFBBVENITEVWRUwpCitlbmRpZgorCisjIFRvIG1ha2Ugc3VyZSB3ZSBkbyBub3QgaW5jbHVkZSAuY29uZmlnIGZvciBhbnkgb2YgdGhlICpjb25maWcgdGFyZ2V0cworIyBjYXRjaCB0aGVtIGVhcmx5LCBhbmQgaGFuZCB0aGVtIG92ZXIgdG8gc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCisjIEl0IGlzIGFsbG93ZWQgdG8gc3BlY2lmeSBtb3JlIHRhcmdldHMgd2hlbiBjYWxsaW5nIG1ha2UsIGluY2x1ZGluZworIyBtaXhpbmcgKmNvbmZpZyB0YXJnZXRzIGFuZCBidWlsZCB0YXJnZXRzLgorIyBGb3IgZXhhbXBsZSAnbWFrZSBvbGRjb25maWcgYWxsJy4KKyMgRGV0ZWN0IHdoZW4gbWl4ZWQgdGFyZ2V0cyBpcyBzcGVjaWZpZWQsIGFuZCBtYWtlIGEgc2Vjb25kIGludm9jYXRpb24KKyMgb2YgbWFrZSBzbyAuY29uZmlnIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGNhc2UgZWl0aGVyIChmb3IgKmNvbmZpZykuCisKK25vLWRvdC1jb25maWctdGFyZ2V0cyA6PSBjbGVhbiBtcnByb3BlciBkaXN0Y2xlYW4gXAorCQkJIGNzY29wZSBUQUdTIHRhZ3MgaGVscCAlZG9jcworI2Jib3gjIGNoZWNrJSBpcyByZW1vdmVkIGZyb20gYWJvdmUKKworY29uZmlnLXRhcmdldHMgOj0gMAorbWl4ZWQtdGFyZ2V0cyAgOj0gMAorZG90LWNvbmZpZyAgICAgOj0gMQorCitpZm5lcSAoJChmaWx0ZXIgJChuby1kb3QtY29uZmlnLXRhcmdldHMpLCAkKE1BS0VDTURHT0FMUykpLCkKKwlpZmVxICgkKGZpbHRlci1vdXQgJChuby1kb3QtY29uZmlnLXRhcmdldHMpLCAkKE1BS0VDTURHT0FMUykpLCkKKwkJZG90LWNvbmZpZyA6PSAwCisJZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoS0JVSUxEX0VYVE1PRCksKQorICAgICAgICBpZm5lcSAoJChmaWx0ZXIgY29uZmlnICVjb25maWcsJChNQUtFQ01ER09BTFMpKSwpCisgICAgICAgICAgICAgICAgY29uZmlnLXRhcmdldHMgOj0gMQorICAgICAgICAgICAgICAgIGlmbmVxICgkKGZpbHRlci1vdXQgY29uZmlnICVjb25maWcsJChNQUtFQ01ER09BTFMpKSwpCisgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZC10YXJnZXRzIDo9IDEKKyAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorZW5kaWYKKworaWZlcSAoJChtaXhlZC10YXJnZXRzKSwxKQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV2UncmUgY2FsbGVkIHdpdGggbWl4ZWQgdGFyZ2V0cyAoKmNvbmZpZyBhbmQgYnVpbGQgdGFyZ2V0cykuCisjIEhhbmRsZSB0aGVtIG9uZSBieSBvbmUuCisKKyU6OiBGT1JDRQorCSQoUSkkKE1BS0UpIC1DICQoc3JjdHJlZSkgS0JVSUxEX1NSQz0gJEAKKworZWxzZQoraWZlcSAoJChjb25maWctdGFyZ2V0cyksMSkKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICpjb25maWcgdGFyZ2V0cyBvbmx5IC0gbWFrZSBzdXJlIHByZXJlcXVpc2l0ZXMgYXJlIHVwZGF0ZWQsIGFuZCBkZXNjZW5kCisjIGluIHNjcmlwdHMva2NvbmZpZyB0byBtYWtlIHRoZSAqY29uZmlnIHRhcmdldAorCisjIFJlYWQgYXJjaCBzcGVjaWZpYyBNYWtlZmlsZSB0byBzZXQgS0JVSUxEX0RFRkNPTkZJRyBhcyBuZWVkZWQuCisjIEtCVUlMRF9ERUZDT05GSUcgbWF5IHBvaW50IG91dCBhbiBhbHRlcm5hdGl2ZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyMgdXNlZCBmb3IgJ21ha2UgZGVmY29uZmlnJworLWluY2x1ZGUgJChzcmN0cmVlKS9hcmNoLyQoQVJDSCkvTWFrZWZpbGUKK2V4cG9ydCBLQlVJTERfREVGQ09ORklHCisKK2NvbmZpZzogc2NyaXB0c19iYXNpYyBvdXRwdXRtYWtlZmlsZSBnZW5fYnVpbGRfZmlsZXMgRk9SQ0UKKwkkKFEpbWtkaXIgLXAgaW5jbHVkZQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMva2NvbmZpZyAkQAorCSQoUSkkKE1BS0UpIC1DICQoc3JjdHJlZSkgS0JVSUxEX1NSQz0gLmtlcm5lbHJlbGVhc2UKKworJWNvbmZpZzogc2NyaXB0c19iYXNpYyBvdXRwdXRtYWtlZmlsZSBnZW5fYnVpbGRfZmlsZXMgRk9SQ0UKKwkkKFEpbWtkaXIgLXAgaW5jbHVkZQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMva2NvbmZpZyAkQAorCSQoUSkkKE1BS0UpIC1DICQoc3JjdHJlZSkgS0JVSUxEX1NSQz0gLmtlcm5lbHJlbGVhc2UKKworZWxzZQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGQgdGFyZ2V0cyBvbmx5IC0gdGhpcyBpbmNsdWRlcyBidXN5Ym94LCBhcmNoIHNwZWNpZmljIHRhcmdldHMsIGNsZWFuCisjIHRhcmdldHMgYW5kIG90aGVycy4gSW4gZ2VuZXJhbCBhbGwgdGFyZ2V0cyBleGNlcHQgKmNvbmZpZyB0YXJnZXRzLgorCitpZmVxICgkKEtCVUlMRF9FWFRNT0QpLCkKKyMgQWRkaXRpb25hbCBoZWxwZXJzIGJ1aWx0IGluIHNjcmlwdHMvCisjIENhcmVmdWxseSBsaXN0IGRlcGVuZGVuY2llcyBzbyB3ZSBkbyBub3QgdHJ5IHRvIGJ1aWxkIHNjcmlwdHMgdHdpY2UKKyMgaW4gcGFyYWxsZWwKK1BIT05ZICs9IHNjcmlwdHMKK3NjcmlwdHM6IGdlbl9idWlsZF9maWxlcyBzY3JpcHRzX2Jhc2ljIGluY2x1ZGUvY29uZmlnL01BUktFUgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoQCkKKworc2NyaXB0c19iYXNpYzogaW5jbHVkZS9hdXRvY29uZi5oCisKKyMgT2JqZWN0cyB3ZSB3aWxsIGxpbmsgaW50byBidXN5Ym94IC8gc3ViZGlycyB3ZSBuZWVkIHRvIHZpc2l0Citjb3JlLXkJCTo9IFwKKwkJYXBwbGV0cy8gXAorCitsaWJzLXkJCTo9IFwKKwkJYXJjaGl2YWwvIFwKKwkJYXJjaGl2YWwvbGliYXJjaGl2ZS8gXAorCQljb25zb2xlLXRvb2xzLyBcCisJCWNvcmV1dGlscy8gXAorCQljb3JldXRpbHMvbGliY29yZXV0aWxzLyBcCisJCWRlYmlhbnV0aWxzLyBcCisJCWUyZnNwcm9ncy8gXAorCQllZGl0b3JzLyBcCisJCWZpbmR1dGlscy8gXAorCQlpbml0LyBcCisJCWxpYmJiLyBcCisJCWxpYnB3ZGdycC8gXAorCQlsb2dpbnV0aWxzLyBcCisJCW1haWx1dGlscy8gXAorCQltaXNjdXRpbHMvIFwKKwkJbW9kdXRpbHMvIFwKKwkJbmV0d29ya2luZy8gXAorCQluZXR3b3JraW5nL2xpYmlwcm91dGUvIFwKKwkJbmV0d29ya2luZy91ZGhjcC8gXAorCQlwcmludHV0aWxzLyBcCisJCXByb2Nwcy8gXAorCQlydW5pdC8gXAorCQlzZWxpbnV4LyBcCisJCXNoZWxsLyBcCisJCXN5c2tsb2dkLyBcCisJCXV0aWwtbGludXgvIFwKKwkJdXRpbC1saW51eC92b2x1bWVfaWQvIFwKKworZW5kaWYgIyBLQlVJTERfRVhUTU9ECisKK2lmZXEgKCQoZG90LWNvbmZpZyksMSkKKyMgSW4gdGhpcyBzZWN0aW9uLCB3ZSBuZWVkIC5jb25maWcKKworIyBSZWFkIGluIGRlcGVuZGVuY2llcyB0byBhbGwgS2NvbmZpZyogZmlsZXMsIG1ha2Ugc3VyZSB0byBydW4KKyMgb2xkY29uZmlnIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkLgorLWluY2x1ZGUgLmtjb25maWcuZAorCistaW5jbHVkZSAuY29uZmlnCisKKyMgSWYgLmNvbmZpZyBuZWVkcyB0byBiZSB1cGRhdGVkLCBpdCB3aWxsIGJlIGRvbmUgdmlhIHRoZSBkZXBlbmRlbmN5CisjIHRoYXQgYXV0b2NvbmYgaGFzIG9uIC5jb25maWcuCisjIFRvIGF2b2lkIGFueSBpbXBsaWNpdCBydWxlIHRvIGtpY2sgaW4sIGRlZmluZSBhbiBlbXB0eSBjb21tYW5kCisuY29uZmlnIC5rY29uZmlnLmQ6IDsKKworIyBOb3cgd2UgY2FuIGRlZmluZSBDRkxBR1MgZXRjIGFjY29yZGluZyB0byAuY29uZmlnCitpbmNsdWRlICQoc3JjdHJlZSkvTWFrZWZpbGUuZmxhZ3MKKworIyBJZiAuY29uZmlnIGlzIG5ld2VyIHRoYW4gaW5jbHVkZS9hdXRvY29uZi5oLCBzb21lb25lIHRpbmtlcmVkCisjIHdpdGggaXQgYW5kIGZvcmdvdCB0byBydW4gbWFrZSBvbGRjb25maWcuCisjIElmIGtjb25maWcuZCBpcyBtaXNzaW5nIHRoZW4gd2UgYXJlIHByb2Jhcmx5IGluIGEgY2xlYW5lZCB0cmVlIHNvCisjIHdlIGV4ZWN1dGUgdGhlIGNvbmZpZyBzdGVwIHRvIGJlIHN1cmUgdG8gY2F0Y2ggdXBkYXRlZCBLY29uZmlnIGZpbGVzCitpbmNsdWRlL2F1dG9jb25mLmg6IC5rY29uZmlnLmQgLmNvbmZpZyAkKHdpbGRjYXJkICQoc3JjdHJlZSkvKi8qLmMpICQod2lsZGNhcmQgJChzcmN0cmVlKS8qLyovKi5jKSB8IGdlbl9idWlsZF9maWxlcworCSQoUSkkKE1BS0UpIC1mICQoc3JjdHJlZSkvTWFrZWZpbGUgc2lsZW50b2xkY29uZmlnCisKK2luY2x1ZGUvdXNhZ2UuaDogZ2VuX2J1aWxkX2ZpbGVzCisKK2Vsc2UKKyMgRHVtbXkgdGFyZ2V0IG5lZWRlZCwgYmVjYXVzZSB1c2VkIGFzIHByZXJlcXVpc2l0ZQoraW5jbHVkZS9hdXRvY29uZi5oOiA7CitlbmRpZgorCisjIFRoZSBhbGw6IHRhcmdldCBpcyB0aGUgZGVmYXVsdCB3aGVuIG5vIHRhcmdldCBpcyBnaXZlbiBvbiB0aGUKKyMgY29tbWFuZCBsaW5lLgorIyBUaGlzIGFsbG93IGEgdXNlciB0byBpc3N1ZSBvbmx5ICdtYWtlJyB0byBidWlsZCBhIGtlcm5lbCBpbmNsdWRpbmcgbW9kdWxlcworIyBEZWZhdWx0cyBidXN5Ym94IGJ1dCBpdCBpcyB1c3VhbGx5IG92ZXJyaWRkZW4gaW4gdGhlIGFyY2ggbWFrZWZpbGUKK2FsbDogYnVzeWJveCBkb2MKKworLWluY2x1ZGUgJChzcmN0cmVlKS9hcmNoLyQoQVJDSCkvTWFrZWZpbGUKKworIyBhcmNoIE1ha2VmaWxlIG1heSBvdmVycmlkZSBDQyBzbyBrZWVwIHRoaXMgYWZ0ZXIgYXJjaCBNYWtlZmlsZSBpcyBpbmNsdWRlZAorI2Jib3gjIE5PU1RESU5DX0ZMQUdTICs9IC1ub3N0ZGluYyAtaXN5c3RlbSAkKHNoZWxsICQoQ0MpIC1wcmludC1maWxlLW5hbWU9aW5jbHVkZSkKK0NIRUNLRkxBR1MgKz0gJChOT1NURElOQ19GTEFHUykKKworIyBEZWZhdWx0IGtlcm5lbCBpbWFnZSB0byBidWlsZCB3aGVuIG5vIHNwZWNpZmljIHRhcmdldCBpcyBnaXZlbi4KKyMgS0JVSUxEX0lNQUdFIG1heSBiZSBvdmVycnVsZWQgb24gdGhlIGNvbW1hbmRsaW5lIG9yCisjIHNldCBpbiB0aGUgZW52aXJvbm1lbnQKKyMgQWxzbyBhbnkgYXNzaWdubWVudHMgaW4gYXJjaC8kKEFSQ0gpL01ha2VmaWxlIHRha2UgcHJlY2VkZW5jZSBvdmVyCisjIHRoaXMgZGVmYXVsdCB2YWx1ZQorZXhwb3J0IEtCVUlMRF9JTUFHRSA/PSBidXN5Ym94CisKKyMKKyMgSU5TVEFMTF9QQVRIIHNwZWNpZmllcyB3aGVyZSB0byBwbGFjZSB0aGUgdXBkYXRlZCBrZXJuZWwgYW5kIHN5c3RlbSBtYXAKKyMgaW1hZ2VzLiBEZWZhdWx0IGlzIC9ib290LCBidXQgeW91IGNhbiBzZXQgaXQgdG8gb3RoZXIgdmFsdWVzCitleHBvcnQJSU5TVEFMTF9QQVRIID89IC9ib290CisKKyMKKyMgSU5TVEFMTF9NT0RfUEFUSCBzcGVjaWZpZXMgYSBwcmVmaXggdG8gTU9ETElCIGZvciBtb2R1bGUgZGlyZWN0b3J5CisjIHJlbG9jYXRpb25zIHJlcXVpcmVkIGJ5IGJ1aWxkIHJvb3RzLiAgVGhpcyBpcyBub3QgZGVmaW5lZCBpbiB0aGUKKyMgbWFrZWZpbGUgYnV0IHRoZSBhcmd1ZW1lbnQgY2FuIGJlIHBhc3NlZCB0byBtYWtlIGlmIG5lZWRlZC4KKyMKKworTU9ETElCCT0gJChJTlNUQUxMX01PRF9QQVRIKS9saWIvbW9kdWxlcy8kKEtFUk5FTFJFTEVBU0UpCitleHBvcnQgTU9ETElCCisKKworaWZlcSAoJChLQlVJTERfRVhUTU9EKSwpCitidXN5Ym94LWRpcnMJOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKGNvcmUteSkgJChjb3JlLW0pICQobGlicy15KSAkKGxpYnMtbSkpKQorCitidXN5Ym94LWFsbGRpcnMJOj0gJChzb3J0ICQoYnVzeWJveC1kaXJzKSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sIFwKKwkJICAgICAkKGNvcmUtbikgJChjb3JlLSkgJChsaWJzLW4pICQobGlicy0pIFwKKwkJKSkpCisKK2NvcmUteQkJOj0gJChwYXRzdWJzdCAlLywgJS9idWlsdC1pbi5vLCAkKGNvcmUteSkpCitsaWJzLXkxCQk6PSAkKHBhdHN1YnN0ICUvLCAlL2xpYi5hLCAkKGxpYnMteSkpCitsaWJzLXkyCQk6PSAkKHBhdHN1YnN0ICUvLCAlL2J1aWx0LWluLm8sICQobGlicy15KSkKK2xpYnMteQkJOj0gJChsaWJzLXkxKSAkKGxpYnMteTIpCisKKyMgQnVpbGQgYnVzeWJveAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgYnVzeWJveCBpcyBidWlsZCBmcm9tIHRoZSBvYmplY3RzIHNlbGVjdGVkIGJ5ICQoYnVzeWJveC1pbml0KSBhbmQKKyMgJChidXN5Ym94LW1haW4pLiBNb3N0IGFyZSBidWlsdC1pbi5vIGZpbGVzIGZyb20gdG9wLWxldmVsIGRpcmVjdG9yaWVzCisjIGluIHRoZSBrZXJuZWwgdHJlZSwgb3RoZXJzIGFyZSBzcGVjaWZpZWQgaW4gYXJjaC8kKEFSQ0gpTWFrZWZpbGUuCisjIE9yZGVyaW5nIHdoZW4gbGlua2luZyBpcyBpbXBvcnRhbnQsIGFuZCAkKGJ1c3lib3gtaW5pdCkgbXVzdCBiZSBmaXJzdC4KKyMKKyMgYnVzeWJveAorIyAgIF4KKyMgICB8CisjICAgKy08ICQoYnVzeWJveC1pbml0KQorIyAgIHwgICArLS08IGluaXQvdmVyc2lvbi5vICsgbW9yZQorIyAgIHwKKyMgICArLS08ICQoYnVzeWJveC1tYWluKQorIyAgIHwgICAgKy0tPCBkcml2ZXIvYnVpbHQtaW4ubyBtbS9idWlsdC1pbi5vICsgbW9yZQorIyAgIHwKKyMgICArLTwga2FsbHN5bXMubyAoc2VlIGRlc2NyaXB0aW9uIGluIENPTkZJR19LQUxMU1lNUyBzZWN0aW9uKQorIworIyBidXN5Ym94IHZlcnNpb24gKHVuYW1lIC12KSBjYW5ub3QgYmUgdXBkYXRlZCBkdXJpbmcgbm9ybWFsCisjIGRlc2NlbmRpbmctaW50by1zdWJkaXJzIHBoYXNlIHNpbmNlIHdlIGRvIG5vdCB5ZXQga25vdyBpZiB3ZSBuZWVkIHRvCisjIHVwZGF0ZSBidXN5Ym94LgorIyBUaGVyZWZvcmUgdGhpcyBzdGVwIGlzIGRlbGF5ZWQgdW50aWwganVzdCBiZWZvcmUgZmluYWwgbGluayBvZiBidXN5Ym94IC0KKyMgZXhjZXB0IGluIHRoZSBrYWxsc3ltcyBjYXNlIHdoZXJlIGl0IGlzIGRvbmUganVzdCBiZWZvcmUgYWRkaW5nIHRoZQorIyBzeW1ib2xzIHRvIHRoZSBrZXJuZWwuCisjCisjIFN5c3RlbS5tYXAgaXMgZ2VuZXJhdGVkIHRvIGRvY3VtZW50IGFkZHJlc3NlcyBvZiBhbGwga2VybmVsIHN5bWJvbHMKKworYnVzeWJveC1hbGwgIDo9ICQoY29yZS15KSAkKGxpYnMteSkKKworIyBSdWxlIHRvIGxpbmsgYnVzeWJveCAtIGFsc28gdXNlZCBkdXJpbmcgQ09ORklHX0tBTExTWU1TCisjIE1heSBiZSBvdmVycmlkZGVuIGJ5IGFyY2gvJChBUkNIKS9NYWtlZmlsZQorcXVpZXRfY21kX2J1c3lib3hfXyA/PSBMSU5LICAgICRACisgICAgICBjbWRfYnVzeWJveF9fID89ICQoc3JjdHJlZSkvc2NyaXB0cy90cnlsaW5rIFwKKyAgICAgICIkQCIgXAorICAgICAgIiQoQ0MpIiBcCisgICAgICAiJChDRkxBR1MpICQoQ0ZMQUdTX2J1c3lib3gpIiBcCisgICAgICAiJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpIiBcCisgICAgICAiJChjb3JlLXkpIiBcCisgICAgICAiJChsaWJzLXkpIiBcCisgICAgICAiJChMRExJQlMpIgorCisjIEdlbmVyYXRlIFN5c3RlbS5tYXAKK3F1aWV0X2NtZF9zeXNtYXAgPSBTWVNNQVAKKyAgICAgIGNtZF9zeXNtYXAgPSAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL21rc3lzbWFwCisKKyMgTGluayBvZiBidXN5Ym94CisjIElmIENPTkZJR19LQUxMU1lNUyBpcyBzZXQgLnZlcnNpb24gaXMgYWxyZWFkeSB1cGRhdGVkCisjIEdlbmVyYXRlIFN5c3RlbS5tYXAgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb250ZW50IGlzIGNvbnNpc3RlbnQKKyMgVXNlICsgaW4gZnJvbnQgb2YgdGhlIGJ1c3lib3hfdmVyc2lvbiBydWxlIHRvIHNpbGVudCB3YXJuaW5nIHdpdGggbWFrZSAtajIKKyMgRmlyc3QgY29tbWFuZCBpcyAnOicgdG8gYWxsb3cgdXMgdG8gdXNlICsgaW4gZnJvbnQgb2YgdGhlIHJ1bGUKK2RlZmluZSBydWxlX2J1c3lib3hfXworCToKKwkkKGNhbGwgY21kLGJ1c3lib3hfXykKKwkkKFEpZWNobyAnY21kXyRAIDo9ICQoY21kX2J1c3lib3hfXyknID4gJChARCkvLiQoQEYpLmNtZAorZW5kZWYKKworCitpZmRlZiBDT05GSUdfS0FMTFNZTVMKKyMgR2VuZXJhdGUgc2VjdGlvbiBsaXN0aW5nIGFsbCBzeW1ib2xzIGFuZCBhZGQgaXQgaW50byBidXN5Ym94ICQoa2FsbHN5bXMubykKKyMgSXQncyBhIHRocmVlIHN0YWdlIHByb2Nlc3M6CisjIG8gLnRtcF9idXN5Ym94MSBoYXMgYWxsIHN5bWJvbHMgYW5kIHNlY3Rpb25zLCBidXQgX19rYWxsc3ltcyBpcworIyAgIGVtcHR5CisjICAgUnVubmluZyBrYWxsc3ltcyBvbiB0aGF0IGdpdmVzIHVzIC50bXBfa2FsbHN5bXMxLm8gd2l0aAorIyAgIHRoZSByaWdodCBzaXplIC0gYnVzeWJveCB2ZXJzaW9uICh1bmFtZSAtdikgaXMgdXBkYXRlZCBkdXJpbmcgdGhpcyBzdGVwCisjIG8gLnRtcF9idXN5Ym94MiBub3cgaGFzIGEgX19rYWxsc3ltcyBzZWN0aW9uIG9mIHRoZSByaWdodCBzaXplLAorIyAgIGJ1dCBkdWUgdG8gdGhlIGFkZGVkIHNlY3Rpb24sIHNvbWUgYWRkcmVzc2VzIGhhdmUgc2hpZnRlZC4KKyMgICBGcm9tIGhlcmUsIHdlIGdlbmVyYXRlIGEgY29ycmVjdCAudG1wX2thbGxzeW1zMi5vCisjIG8gVGhlIGNvcnJlY3QgLnRtcF9rYWxsc3ltczIubyBpcyBsaW5rZWQgaW50byB0aGUgZmluYWwgYnVzeWJveC4KKyMgbyBWZXJpZnkgdGhhdCB0aGUgU3lzdGVtLm1hcCBmcm9tIGJ1c3lib3ggbWF0Y2hlcyB0aGUgbWFwIGZyb20KKyMgICAudG1wX2J1c3lib3gyLCBqdXN0IGluIGNhc2Ugd2UgZGlkIG5vdCBnZW5lcmF0ZSBrYWxsc3ltcyBjb3JyZWN0bHkuCisjIG8gSWYgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgc2V0LCBkbyBhbiBleHRyYSBwYXNzIHVzaW5nCisjICAgLnRtcF9idXN5Ym94MyBhbmQgLnRtcF9rYWxsc3ltczMuby4gIFRoaXMgaXMgb25seSBtZWFudCBhcyBhCisjICAgdGVtcG9yYXJ5IGJ5cGFzcyB0byBhbGxvdyB0aGUga2VybmVsIHRvIGJlIGJ1aWx0IHdoaWxlIHRoZQorIyAgIG1haW50YWluZXJzIHdvcmsgb3V0IHdoYXQgd2VudCB3cm9uZyB3aXRoIGthbGxzeW1zLgorCitpZmRlZiBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUworbGFzdF9rYWxsc3ltcyA6PSAzCitlbHNlCitsYXN0X2thbGxzeW1zIDo9IDIKK2VuZGlmCisKK2thbGxzeW1zLm8gOj0gLnRtcF9rYWxsc3ltcyQobGFzdF9rYWxsc3ltcykubworCitkZWZpbmUgdmVyaWZ5X2thbGxzeW1zCisJJChRKSQoaWYgJCgkKHF1aWV0KWNtZF9zeXNtYXApLCAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgZWNobyAnICAkKCQocXVpZXQpY21kX3N5c21hcCkgLnRtcF9TeXN0ZW0ubWFwJyAmJikgIFwKKwkgICQoY21kX3N5c21hcCkgLnRtcF9idXN5Ym94JChsYXN0X2thbGxzeW1zKSAudG1wX1N5c3RlbS5tYXAKKwkkKFEpY21wIC1zIFN5c3RlbS5tYXAgLnRtcF9TeXN0ZW0ubWFwIHx8ICAgICAgICAgICAgICBcCisJCShlY2hvIEluY29uc2lzdGVudCBrYWxsc3ltcyBkYXRhOyAgICAgICAgICAgICBcCisJCSBlY2hvIFRyeSBzZXR0aW5nIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTOyBcCisJCSBybSAudG1wX2thbGxzeW1zKiA7IC9iaW4vZmFsc2UgKQorZW5kZWYKKworIyBVcGRhdGUgYnVzeWJveCB2ZXJzaW9uIGJlZm9yZSBsaW5rCisjIFVzZSArIGluIGZyb250IG9mIHRoaXMgcnVsZSB0byBzaWxlbnQgd2FybmluZyBhYm91dCBtYWtlIC1qMQorIyBGaXJzdCBjb21tYW5kIGlzICc6JyB0byBhbGxvdyB1cyB0byB1c2UgKyBpbiBmcm9udCBvZiB0aGlzIHJ1bGUKK2NtZF9rc3ltX2xkID0gJChjbWRfYnVzeWJveF9fKQorZGVmaW5lIHJ1bGVfa3N5bV9sZAorCToKKwkrJChjYWxsIGNtZCxidXN5Ym94X3ZlcnNpb24pCisJJChjYWxsIGNtZCxidXN5Ym94X18pCisJJChRKWVjaG8gJ2NtZF8kQCA6PSAkKGNtZF9idXN5Ym94X18pJyA+ICQoQEQpLy4kKEBGKS5jbWQKK2VuZGVmCisKKyMgR2VuZXJhdGUgLlMgZmlsZSB3aXRoIGFsbCBrZXJuZWwgc3ltYm9scworcXVpZXRfY21kX2thbGxzeW1zID0gS1NZTSAgICAkQAorICAgICAgY21kX2thbGxzeW1zID0gJChOTSkgLW4gJDwgfCAkKEtBTExTWU1TKSBcCisgICAgICAgICAgICAgICAgICAgICAkKGlmICQoQ09ORklHX0tBTExTWU1TX0FMTCksLS1hbGwtc3ltYm9scykgPiAkQAorCisudG1wX2thbGxzeW1zMS5vIC50bXBfa2FsbHN5bXMyLm8gLnRtcF9rYWxsc3ltczMubzogJS5vOiAlLlMgc2NyaXB0cyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxhc19vX1MpCisKKy50bXBfa2FsbHN5bXMlLlM6IC50bXBfYnVzeWJveCUgJChLQUxMU1lNUykKKwkkKGNhbGwgY21kLGthbGxzeW1zKQorCisjIC50bXBfYnVzeWJveDEgbXVzdCBiZSBjb21wbGV0ZSBleGNlcHQga2FsbHN5bXMsIHNvIHVwZGF0ZSBidXN5Ym94IHZlcnNpb24KKy50bXBfYnVzeWJveDE6ICQoYnVzeWJveC1sZHMpICQoYnVzeWJveC1hbGwpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxrc3ltX2xkKQorCisudG1wX2J1c3lib3gyOiAkKGJ1c3lib3gtbGRzKSAkKGJ1c3lib3gtYWxsKSAudG1wX2thbGxzeW1zMS5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsYnVzeWJveF9fKQorCisudG1wX2J1c3lib3gzOiAkKGJ1c3lib3gtbGRzKSAkKGJ1c3lib3gtYWxsKSAudG1wX2thbGxzeW1zMi5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsYnVzeWJveF9fKQorCisjIE5lZWRzIHRvIHZpc2l0IHNjcmlwdHMvIGJlZm9yZSAkKEtBTExTWU1TKSBjYW4gYmUgdXNlZC4KKyQoS0FMTFNZTVMpOiBzY3JpcHRzIDsKKworIyBHZW5lcmF0ZSBzb21lIGRhdGEgZm9yIGRlYnVnZ2luZyBzdHJhbmdlIGthbGxzeW1zIHByb2JsZW1zCitkZWJ1Z19rYWxsc3ltczogLnRtcF9tYXAkKGxhc3Rfa2FsbHN5bXMpCisKKy50bXBfbWFwJTogLnRtcF9idXN5Ym94JSBGT1JDRQorCSgkKE9CSkRVTVApIC1oICQ8IHwgJChBV0spICcvXiArWzAtOV0ve3ByaW50ICQkNCAiIDAgIiAkJDJ9JzsgJChOTSkgJDwpIHwgc29ydCA+ICRACisKKy50bXBfbWFwMzogLnRtcF9tYXAyCisKKy50bXBfbWFwMjogLnRtcF9tYXAxCisKK2VuZGlmICMgaWZkZWYgQ09ORklHX0tBTExTWU1TCisKKyMgYnVzeWJveCBpbWFnZSAtIGluY2x1ZGluZyB1cGRhdGVkIGtlcm5lbCBzeW1ib2xzCitidXN5Ym94X3Vuc3RyaXBwZWQ6ICQoYnVzeWJveC1hbGwpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxidXN5Ym94X18pCisJJChRKXJtIC1mIC5vbGRfdmVyc2lvbgorCitidXN5Ym94OiBidXN5Ym94X3Vuc3RyaXBwZWQKK2lmZXEgKCQoU0tJUF9TVFJJUCkseSkKKwkkKFEpY3AgJDwgJEAKK2Vsc2UKKwkkKFEpJChTVFJJUCkgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50IFwKKwkJYnVzeWJveF91bnN0cmlwcGVkIC1vICRACisjIHN0cmlwIGlzIGNvbmZ1c2VkIGJ5IFBJRSBleGVjdXRhYmxlIGFuZCBkb2VzIG5vdCBzZXQgZXhlYyBiaXRzCisJJChRKWNobW9kIGEreCAkQAorZW5kaWYKKworIyBUaGUgYWN0dWFsIG9iamVjdHMgYXJlIGdlbmVyYXRlZCB3aGVuIGRlc2NlbmRpbmcsCisjIG1ha2Ugc3VyZSBubyBpbXBsaWNpdCBydWxlIGtpY2tzIGluCiskKHNvcnQgJChidXN5Ym94LWFsbCkpOiAkKGJ1c3lib3gtZGlycykgOworCisjIEhhbmRsZSBkZXNjZW5kaW5nIGludG8gc3ViZGlyZWN0b3JpZXMgbGlzdGVkIGluICQoYnVzeWJveC1kaXJzKQorIyBQcmVzZXQgbG9jYWxlIHZhcmlhYmxlcyB0byBzcGVlZCB1cCB0aGUgYnVpbGQgcHJvY2Vzcy4gTGltaXQgbG9jYWxlCisjIHR3ZWFrcyB0byB0aGlzIHNwb3QgdG8gYXZvaWQgd3JvbmcgbGFuZ3VhZ2Ugc2V0dGluZ3Mgd2hlbiBydW5uaW5nCisjIG1ha2UgbWVudWNvbmZpZyBldGMuCisjIEVycm9yIG1lc3NhZ2VzIHN0aWxsIGFwcGVhcnMgaW4gdGhlIG9yaWdpbmFsIGxhbmd1YWdlCisKK1BIT05ZICs9ICQoYnVzeWJveC1kaXJzKQorJChidXN5Ym94LWRpcnMpOiBwcmVwYXJlIHNjcmlwdHMKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kQAorCisjIEJ1aWxkIHRoZSBrZXJuZWwgcmVsZWFzZSBzdHJpbmcKKyMgVGhlIEtFUk5FTFJFTEVBU0UgaXMgc3RvcmVkIGluIGEgZmlsZSBuYW1lZCAua2VybmVscmVsZWFzZQorIyB0byBiZSB1c2VkIHdoZW4gZXhlY3V0aW5nIGZvciBleGFtcGxlIG1ha2UgaW5zdGFsbCBvciBtYWtlIG1vZHVsZXNfaW5zdGFsbAorIworIyBUYWtlIHRoZSBjb250ZW50cyBvZiBhbnkgZmlsZXMgY2FsbGVkIGxvY2FsdmVyc2lvbiogYW5kIHRoZSBjb25maWcKKyMgdmFyaWFibGUgQ09ORklHX0xPQ0FMVkVSU0lPTiBhbmQgYXBwZW5kIHRoZW0gdG8gS0VSTkVMUkVMRUFTRS4KKyMgTE9DQUxWRVJTSU9OIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvdmVycmlkZSBhbGwgb2YgdGhpcworCitudWxsc3RyaW5nIDo9CitzcGFjZSAgICAgIDo9ICQobnVsbHN0cmluZykgIyBlbmQgb2YgbGluZQorCitfX19sb2NhbHZlciA9ICQob2JqdHJlZSkvbG9jYWx2ZXJzaW9uKiAkKHNyY3RyZWUpL2xvY2FsdmVyc2lvbioKK19fbG9jYWx2ZXIgID0gJChzb3J0ICQod2lsZGNhcmQgJChfX19sb2NhbHZlcikpKQorIyBza2lwIGJhY2t1cCBmaWxlcyAoY29udGFpbmluZyAnficpCitfbG9jYWx2ZXIgPSAkKGZvcmVhY2ggZiwgJChfX2xvY2FsdmVyKSwgJChpZiAkKGZpbmRzdHJpbmcgfiwgJChmKSksLCQoZikpKQorCitsb2NhbHZlciA9ICQoc3Vic3QgJChzcGFjZSksLCBcCisJICAgJChzaGVsbCBjYXQgL2Rldi9udWxsICQoX2xvY2FsdmVyKSkgXAorCSAgICQocGF0c3Vic3QgIiUiLCUsJChDT05GSUdfTE9DQUxWRVJTSU9OKSkpCisKKyMgSWYgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIHNldCBzY3JpcHRzL3NldGxvY2FsdmVyc2lvbiBpcyBjYWxsZWQKKyMgYW5kIGlmIHRoZSBTQ00gaXMga25vdyBhIHRhZyBmcm9tIHRoZSBTQ00gaXMgYXBwZW5kZWQuCisjIFRoZSBhcHBlbmRlZCB0YWcgaXMgZGV0ZXJtaW5kZWQgYnkgdGhlIFNDTSB1c2VkLgorIworIyBDdXJyZW50bHksIG9ubHkgZ2l0IGlzIHN1cHBvcnRlZC4KKyMgT3RoZXIgU0NNcyBjYW4gZWRpdCBzY3JpcHRzL3NldGxvY2FsdmVyc2lvbiBhbmQgYWRkIHRoZSBhcHByb3ByaWF0ZQorIyBjaGVja3MgYXMgbmVlZGVkLgoraWZkZWYgX0JCX0RJU0FCTEVEX0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTworCV9sb2NhbHZlci1hdXRvID0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgXAorCSAgICAgICAgICAgICAgICAgICQoc3JjdHJlZSkvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24gJChzcmN0cmVlKSkKKwlsb2NhbHZlci1hdXRvICA9ICQoTE9DQUxWRVJTSU9OKSQoX2xvY2FsdmVyLWF1dG8pCitlbmRpZgorCitsb2NhbHZlci1mdWxsID0gJChsb2NhbHZlcikkKGxvY2FsdmVyLWF1dG8pCisKKyMgU3RvcmUgKG5ldykgS0VSTkVMUkVMQVNFIHN0cmluZyBpbiAua2VybmVscmVsZWFzZQora2VybmVscmVsZWFzZSA9ICQoS0VSTkVMVkVSU0lPTikkKGxvY2FsdmVyLWZ1bGwpCisua2VybmVscmVsZWFzZTogRk9SQ0UKKwkkKFEpcm0gLWYgJEAKKwkkKFEpZWNobyAkKGtlcm5lbHJlbGVhc2UpID4gJEAKKworCisjIFRoaW5ncyB3ZSBuZWVkIHRvIGRvIGJlZm9yZSB3ZSByZWN1cnNpdmVseSBzdGFydCBidWlsZGluZyB0aGUga2VybmVsCisjIG9yIHRoZSBtb2R1bGVzIGFyZSBsaXN0ZWQgaW4gInByZXBhcmUiLgorIyBBIG11bHRpIGxldmVsIGFwcHJvYWNoIGlzIHVzZWQuIHByZXBhcmVOIGlzIHByb2Nlc3NlZCBiZWZvcmUgcHJlcGFyZU4tMS4KKyMgYXJjaHByZXBhcmUgaXMgdXNlZCBpbiBhcmNoIE1ha2VmaWxlcyBhbmQgd2hlbiBwcm9jZXNzZWQgYXNtIHN5bWxpbmssCisjIHZlcnNpb24uaCBhbmQgc2NyaXB0c19iYXNpYyBpcyBwcm9jZXNzZWQgLyBjcmVhdGVkLgorCisjIExpc3RlZCBpbiBkZXBlbmRlbmN5IG9yZGVyCitQSE9OWSArPSBwcmVwYXJlIGFyY2hwcmVwYXJlIHByZXBhcmUwIHByZXBhcmUxIHByZXBhcmUyIHByZXBhcmUzCisKKyMgcHJlcGFyZS1hbGwgaXMgZGVwcmVjYXRlZCwgdXNlIHByZXBhcmUgYXMgdmFsaWQgcmVwbGFjZW1lbnQKK1BIT05ZICs9IHByZXBhcmUtYWxsCisKKyMgcHJlcGFyZTMgaXMgdXNlZCB0byBjaGVjayBpZiB3ZSBhcmUgYnVpbGRpbmcgaW4gYSBzZXBhcmF0ZSBvdXRwdXQgZGlyZWN0b3J5LAorIyBhbmQgaWYgc28gZG86CisjIDEpIENoZWNrIHRoYXQgbWFrZSBoYXMgbm90IGJlZW4gZXhlY3V0ZWQgaW4gdGhlIGtlcm5lbCBzcmMgJChzcmN0cmVlKQorIyAyKSBDcmVhdGUgdGhlIGluY2x1ZGUyIGRpcmVjdG9yeSwgdXNlZCBmb3IgdGhlIHNlY29uZCBhc20gc3ltbGluaworcHJlcGFyZTM6IC5rZXJuZWxyZWxlYXNlCitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisJQGVjaG8gJyAgVXNpbmcgJChzcmN0cmVlKSBhcyBzb3VyY2UgZm9yIGJ1c3lib3gnCisJJChRKWlmIFsgLWYgJChzcmN0cmVlKS8uY29uZmlnIF07IHRoZW4gXAorCQllY2hvICIgICQoc3JjdHJlZSkgaXMgbm90IGNsZWFuLCBwbGVhc2UgcnVuICdtYWtlIG1ycHJvcGVyJyI7XAorCQllY2hvICIgIGluIHRoZSAnJChzcmN0cmVlKScgZGlyZWN0b3J5LiI7XAorCQkvYmluL2ZhbHNlOyBcCisJZmk7CisJJChRKWlmIFsgISAtZCBpbmNsdWRlMiBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUyOyBmaTsKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoQVJDSCkgaW5jbHVkZTIvYXNtCitlbmRpZgorCisjIHByZXBhcmUyIGNyZWF0ZXMgYSBtYWtlZmlsZSBpZiB1c2luZyBhIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKK3ByZXBhcmUyOiBwcmVwYXJlMyBvdXRwdXRtYWtlZmlsZQorCitwcmVwYXJlMTogcHJlcGFyZTIgaW5jbHVkZS9jb25maWcvTUFSS0VSCitpZm5lcSAoJChLQlVJTERfTU9EVUxFUyksKQorCSQoUSlta2RpciAtcCAkKE1PRFZFUkRJUikKKwkkKFEpcm0gLWYgJChNT0RWRVJESVIpLyoKK2VuZGlmCisKK2FyY2hwcmVwYXJlOiBwcmVwYXJlMSBzY3JpcHRzX2Jhc2ljIGFwcGxldHNfZGlyCisKK3ByZXBhcmUwOiBhcmNocHJlcGFyZSBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPS4KKworIyBBbGwgdGhlIHByZXBhcmluZy4uCitwcmVwYXJlIHByZXBhcmUtYWxsOiBwcmVwYXJlMAorCisjCUxlYXZlIHRoaXMgYXMgZGVmYXVsdCBmb3IgcHJlcHJvY2Vzc2luZyBidXN5Ym94Lmxkcy5TLCB3aGljaCBpcyBub3cKKyMJZG9uZSBpbiBhcmNoLyQoQVJDSCkva2VybmVsL01ha2VmaWxlCisKK2V4cG9ydCBDUFBGTEFHU19idXN5Ym94LmxkcyArPSAtUCAtQyAtVSQoQVJDSCkKKworIyAJRklYTUU6IFRoZSBhc20gc3ltbGluayBjaGFuZ2VzIHdoZW4gJChBUkNIKSBjaGFuZ2VzLiBUaGF0J3MKKyMJaGFyZCB0byBkZXRlY3QsIGJ1dCBJIHN1cHBvc2UgIm1ha2UgbXJwcm9wZXIiIGlzIGEgZ29vZCBpZGVhCisjCWJlZm9yZSBzd2l0Y2hpbmcgYmV0d2VlbiBhcmNocyBhbnl3YXkuCisKKyNiYm94IyBpbmNsdWRlL2FzbToKKyNiYm94IyAJQGVjaG8gJyAgU1lNTElOSyAkQCAtPiBpbmNsdWRlL2FzbS0kKEFSQ0gpJworI2Jib3gjIAkkKFEpaWYgWyAhIC1kIGluY2x1ZGUgXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlOyBmaTsKKyNiYm94IyAJQGxuIC1mc24gYXNtLSQoQVJDSCkgJEAKKworIyAJU3BsaXQgYXV0b2NvbmYuaCBpbnRvIGluY2x1ZGUvbGludXgvY29uZmlnLyoKK3F1aWV0X2NtZF9nZW5fYmJjb25maWdvcHRzID0gR0VOICAgICBpbmNsdWRlL2JiY29uZmlnb3B0cy5oCisgICAgICBjbWRfZ2VuX2JiY29uZmlnb3B0cyA9ICQoc3JjdHJlZSkvc2NyaXB0cy9ta2NvbmZpZ3MgaW5jbHVkZS9iYmNvbmZpZ29wdHMuaCBpbmNsdWRlL2JiY29uZmlnb3B0c19iejIuaAorcXVpZXRfY21kX3NwbGl0X2F1dG9jb25mICAgPSBTUExJVCAgIGluY2x1ZGUvYXV0b2NvbmYuaCAtPiBpbmNsdWRlL2NvbmZpZy8qCisgICAgICBjbWRfc3BsaXRfYXV0b2NvbmYgICA9IHNjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZSBpbmNsdWRlL2F1dG9jb25mLmggaW5jbHVkZS9jb25maWcKKyNiYm94IyBwaWdneWJhY2tlZCBnZW5lcmF0aW9uIG9mIGZldyAuaCBmaWxlcworaW5jbHVkZS9jb25maWcvTUFSS0VSOiBzY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUgaW5jbHVkZS9hdXRvY29uZi5oCisJJChjYWxsIGNtZCxzcGxpdF9hdXRvY29uZikKKwkkKGNhbGwgY21kLGdlbl9iYmNvbmZpZ29wdHMpCisJQHRvdWNoICRACisKKyMgR2VuZXJhdGUgc29tZSBmaWxlcworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBLRVJORUxSRUxFQVNFIGNhbiBjaGFuZ2UgZnJvbSBhIGZldyBkaWZmZXJlbnQgcGxhY2VzLCBtZWFuaW5nIHZlcnNpb24uaAorIyBuZWVkcyB0byBiZSB1cGRhdGVkLCBzbyB0aGlzIGNoZWNrIGlzIGZvcmNlZCBvbiBhbGwgYnVpbGRzCisKK3V0c19sZW4gOj0gNjQKKworZGVmaW5lIGZpbGVjaGtfdmVyc2lvbi5oCisJaWYgWyBgZWNobyAtbiAiJChLRVJORUxSRUxFQVNFKSIgfCB3YyAtYyBgIC1ndCAkKHV0c19sZW4pIF07IHRoZW4gXAorCSAgZWNobyAnIiQoS0VSTkVMUkVMRUFTRSkiIGV4Y2VlZHMgJCh1dHNfbGVuKSBjaGFyYWN0ZXJzJyA+JjI7IFwKKwkgIGV4aXQgMTsgXAorCWZpOyBcCisJKGVjaG8gXCNkZWZpbmUgVVRTX1JFTEVBU0UgXCIkKEtFUk5FTFJFTEVBU0UpXCI7IFwKKwkgIGVjaG8gXCNkZWZpbmUgTElOVVhfVkVSU0lPTl9DT0RFIGBleHByICQoVkVSU0lPTikgXFwqIDY1NTM2ICsgJChQQVRDSExFVkVMKSBcXCogMjU2ICsgJChTVUJMRVZFTClgOyBcCisJIGVjaG8gJyNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpJzsgXAorCSkKK2VuZGVmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BIT05ZICs9IGRlcGVuZCBkZXAKK2RlcGVuZCBkZXA6CisJQGVjaG8gJyoqKiBXYXJuaW5nOiBtYWtlICRAIGlzIHVubmVjZXNzYXJ5IG5vdy4nCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1vZHVsZXMKKworaWZkZWYgX0JCX0RJU0FCTEVEX0NPTkZJR19NT0RVTEVTCisKKyMgCUJ5IGRlZmF1bHQsIGJ1aWxkIG1vZHVsZXMgYXMgd2VsbAorCithbGw6IG1vZHVsZXMKKworIwlCdWlsZCBtb2R1bGVzCisKK1BIT05ZICs9IG1vZHVsZXMKK21vZHVsZXM6ICQoYnVzeWJveC1kaXJzKSAkKGlmICQoS0JVSUxEX0JVSUxUSU4pLGJ1c3lib3gpCisJQGVjaG8gJyAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2UgMi4nOworCSQoUSkkKE1BS0UpIC1yUiAtZiAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAorCisKKyMgVGFyZ2V0IHRvIHByZXBhcmUgYnVpbGRpbmcgZXh0ZXJuYWwgbW9kdWxlcworUEhPTlkgKz0gbW9kdWxlc19wcmVwYXJlCittb2R1bGVzX3ByZXBhcmU6IHByZXBhcmUgc2NyaXB0cworCisjIFRhcmdldCB0byBpbnN0YWxsIG1vZHVsZXMKK1BIT05ZICs9IG1vZHVsZXNfaW5zdGFsbAorbW9kdWxlc19pbnN0YWxsOiBfbW9kaW5zdF8gX21vZGluc3RfcG9zdAorCitQSE9OWSArPSBfbW9kaW5zdF8KK19tb2RpbnN0XzoKKwlAaWYgWyAteiAiYCQoREVQTU9EKSAtViAyPi9kZXYvbnVsbCB8IGdyZXAgbW9kdWxlLWluaXQtdG9vbHNgIiBdOyB0aGVuIFwKKwkJZWNobyAiV2FybmluZzogeW91IG1heSBuZWVkIHRvIGluc3RhbGwgbW9kdWxlLWluaXQtdG9vbHMiOyBcCisJCWVjaG8gIlNlZSBodHRwOi8vd3d3LmNvZGVtb25rZXkub3JnLnVrL2RvY3MvcG9zdC1oYWxsb3dlZW4tMi42LnR4dCI7XAorCQlzbGVlcCAxOyBcCisJZmkKKwlAcm0gLXJmICQoTU9ETElCKS9rZXJuZWwKKwlAcm0gLWYgJChNT0RMSUIpL3NvdXJjZQorCUBta2RpciAtcCAkKE1PRExJQikva2VybmVsCisJQGxuIC1zICQoc3JjdHJlZSkgJChNT0RMSUIpL3NvdXJjZQorCUBpZiBbICEgJChvYmp0cmVlKSAtZWYgICQoTU9ETElCKS9idWlsZCBdOyB0aGVuIFwKKwkJcm0gLWYgJChNT0RMSUIpL2J1aWxkIDsgXAorCQlsbiAtcyAkKG9ianRyZWUpICQoTU9ETElCKS9idWlsZCA7IFwKKwlmaQorCSQoUSkkKE1BS0UpIC1yUiAtZiAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUubW9kaW5zdAorCisjIElmIFN5c3RlbS5tYXAgZXhpc3RzLCBydW4gZGVwbW9kLiAgVGhpcyBkZWxpYmVyYXRlbHkgZG9lcyBub3QgaGF2ZSBhCisjIGRlcGVuZGVuY3kgb24gU3lzdGVtLm1hcCBzaW5jZSB0aGF0IHdvdWxkIHJ1biB0aGUgZGVwZW5kZW5jeSB0cmVlIG9uCisjIGJ1c3lib3guICBUaGlzIGRlcG1vZCBpcyBvbmx5IGZvciBjb252ZW5pZW5jZSB0byBnaXZlIHRoZSBpbml0aWFsCisjIGJvb3QgYSBtb2R1bGVzLmRlcCBldmVuIGJlZm9yZSAvIGlzIG1vdW50ZWQgcmVhZC13cml0ZS4gIEhvd2V2ZXIgdGhlCisjIGJvb3Qgc2NyaXB0IGRlcG1vZCBpcyB0aGUgbWFzdGVyIHZlcnNpb24uCitpZmVxICIkKHN0cmlwICQoSU5TVEFMTF9NT0RfUEFUSCkpIiAiIgorZGVwbW9kX29wdHMJOj0KK2Vsc2UKK2RlcG1vZF9vcHRzCTo9IC1iICQoSU5TVEFMTF9NT0RfUEFUSCkgLXIKK2VuZGlmCitQSE9OWSArPSBfbW9kaW5zdF9wb3N0CitfbW9kaW5zdF9wb3N0OiBfbW9kaW5zdF8KKwlpZiBbIC1yIFN5c3RlbS5tYXAgLWEgLXggJChERVBNT0QpIF07IHRoZW4gJChERVBNT0QpIC1hZSAtRiBTeXN0ZW0ubWFwICQoZGVwbW9kX29wdHMpICQoS0VSTkVMUkVMRUFTRSk7IGZpCisKK2Vsc2UgIyBDT05GSUdfTU9EVUxFUworCisjIE1vZHVsZXMgbm90IGNvbmZpZ3VyZWQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21vZHVsZXMgbW9kdWxlc19pbnN0YWxsOiBGT1JDRQorCUBlY2hvCisJQGVjaG8gIlRoZSBwcmVzZW50IGJ1c3lib3ggY29uZmlndXJhdGlvbiBoYXMgbW9kdWxlcyBkaXNhYmxlZC4iCisJQGVjaG8gIlR5cGUgJ21ha2UgY29uZmlnJyBhbmQgZW5hYmxlIGxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0LiIKKwlAZWNobyAiVGhlbiBidWlsZCBhIGtlcm5lbCB3aXRoIG1vZHVsZSBzdXBwb3J0IGVuYWJsZWQuIgorCUBlY2hvCisJQGV4aXQgMQorCitlbmRpZiAjIENPTkZJR19NT0RVTEVTCisKKyMjIworIyBDbGVhbmluZyBpcyBkb25lIG9uIHRocmVlIGxldmVscy4KKyMgbWFrZSBjbGVhbiAgICAgRGVsZXRlIG1vc3QgZ2VuZXJhdGVkIGZpbGVzCisjICAgICAgICAgICAgICAgIExlYXZlIGVub3VnaCB0byBidWlsZCBleHRlcm5hbCBtb2R1bGVzCisjIG1ha2UgbXJwcm9wZXIgIERlbGV0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCBhbmQgYWxsIGdlbmVyYXRlZCBmaWxlcworIyBtYWtlIGRpc3RjbGVhbiBSZW1vdmUgZWRpdG9yIGJhY2t1cCBmaWxlcywgcGF0Y2ggbGVmdG92ZXIgZmlsZXMgYW5kIHRoZSBsaWtlCisKKyMgRGlyZWN0b3JpZXMgJiBmaWxlcyByZW1vdmVkIHdpdGggJ21ha2UgY2xlYW4nCitDTEVBTl9ESVJTICArPSAkKE1PRFZFUkRJUikgX2luc3RhbGwgMF9saWIKK0NMRUFOX0ZJTEVTICs9CWJ1c3lib3ggYnVzeWJveF91bnN0cmlwcGVkKiBidXN5Ym94LmxpbmtzIFwKKyAgICAgICAgICAgICAgICBTeXN0ZW0ubWFwIC5rZXJuZWxyZWxlYXNlIFwKKyAgICAgICAgICAgICAgICAudG1wX2thbGxzeW1zKiAudG1wX3ZlcnNpb24gLnRtcF9idXN5Ym94KiAudG1wX1N5c3RlbS5tYXAKKworIyBEaXJlY3RvcmllcyAmIGZpbGVzIHJlbW92ZWQgd2l0aCAnbWFrZSBtcnByb3BlcicKK01SUFJPUEVSX0RJUlMgICs9IGluY2x1ZGUvY29uZmlnIGluY2x1ZGUyCitNUlBST1BFUl9GSUxFUyArPSAuY29uZmlnIC5jb25maWcub2xkIGluY2x1ZGUvYXNtIC52ZXJzaW9uIC5vbGRfdmVyc2lvbiBcCisJCSAgaW5jbHVkZS9OVU1fQVBQTEVUUy5oIFwKKwkJICBpbmNsdWRlL2F1dG9jb25mLmggXAorCQkgIGluY2x1ZGUvYmJjb25maWdvcHRzLmggXAorCQkgIGluY2x1ZGUvYmJjb25maWdvcHRzX2J6Mi5oIFwKKwkJICBpbmNsdWRlL3VzYWdlX2NvbXByZXNzZWQuaCBcCisJCSAgaW5jbHVkZS9hcHBsZXRfdGFibGVzLmggXAorCQkgIGluY2x1ZGUvYXBwbGV0cy5oIFwKKwkJICBpbmNsdWRlL3VzYWdlLmggXAorCQkgIGFwcGxldHMvdXNhZ2UgXAorCQkgIC5rZXJuZWxyZWxlYXNlIE1vZHVsZS5zeW12ZXJzIHRhZ3MgVEFHUyBjc2NvcGUqIFwKKwkJICBidXN5Ym94X29sZAorCisjIGNsZWFuIC0gRGVsZXRlIG1vc3QsIGJ1dCBsZWF2ZSBlbm91Z2ggdG8gYnVpbGQgZXh0ZXJuYWwgbW9kdWxlcworIworY2xlYW46IHJtLWRpcnMgIDo9ICQoQ0xFQU5fRElSUykKK2NsZWFuOiBybS1maWxlcyA6PSAkKENMRUFOX0ZJTEVTKQorY2xlYW4tZGlycyAgICAgIDo9ICQoYWRkcHJlZml4IF9jbGVhbl8sJChzcmN0cmVlKSAkKGJ1c3lib3gtYWxsZGlycykpCisKK1BIT05ZICs9ICQoY2xlYW4tZGlycykgY2xlYW4gYXJjaGNsZWFuCiskKGNsZWFuLWRpcnMpOgorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQocGF0c3Vic3QgX2NsZWFuXyUsJSwkQCkKKworY2xlYW46IGFyY2hjbGVhbiAkKGNsZWFuLWRpcnMpCisJJChjYWxsIGNtZCxybWRpcnMpCisJJChjYWxsIGNtZCxybWZpbGVzKQorCUBmaW5kIC4gJChSQ1NfRklORF9JR05PUkUpIFwKKwkJXCggLW5hbWUgJyouW29hc10nIC1vIC1uYW1lICcqLmtvJyAtbyAtbmFtZSAnLiouY21kJyBcCisJCS1vIC1uYW1lICcuKi5kJyAtbyAtbmFtZSAnLioudG1wJyAtbyAtbmFtZSAnKi5tb2QuYycgXCkgXAorCQktdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCisKK1BIT05ZICs9IGRvYy1jbGVhbgorZG9jLWNsZWFuOiBybS1maWxlcyA6PSBkb2NzL2J1c3lib3gucG9kIFwKKwkJICBkb2NzL0J1c3lCb3guaHRtbCBkb2NzL2J1c3lib3guMSBkb2NzL0J1c3lCb3gudHh0Citkb2MtY2xlYW46CisJJChjYWxsIGNtZCxybWZpbGVzKQorCisjIG1ycHJvcGVyIC0gRGVsZXRlIGFsbCBnZW5lcmF0ZWQgZmlsZXMsIGluY2x1ZGluZyAuY29uZmlnCisjCittcnByb3Blcjogcm0tZGlycyAgOj0gJCh3aWxkY2FyZCAkKE1SUFJPUEVSX0RJUlMpKQorbXJwcm9wZXI6IHJtLWZpbGVzIDo9ICQod2lsZGNhcmQgJChNUlBST1BFUl9GSUxFUykpCittcnByb3Blci1kaXJzICAgICAgOj0gJChhZGRwcmVmaXggX21ycHJvcGVyXyxzY3JpcHRzKQorCitQSE9OWSArPSAkKG1ycHJvcGVyLWRpcnMpIG1ycHJvcGVyIGFyY2htcnByb3BlcgorJChtcnByb3Blci1kaXJzKToKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKHBhdHN1YnN0IF9tcnByb3Blcl8lLCUsJEApCisKK21ycHJvcGVyOiBjbGVhbiBhcmNobXJwcm9wZXIgJChtcnByb3Blci1kaXJzKQorCSQoY2FsbCBjbWQscm1kaXJzKQorCSQoY2FsbCBjbWQscm1maWxlcykKKwlAZmluZCAuIC1uYW1lIENvbmZpZy5zcmMgfCBzZWQgJ3MvLnNyYyQkLy5pbi8nIHwgeGFyZ3MgLXIgcm0gLWYKKwlAZmluZCAuIC1uYW1lIEtidWlsZC5zcmMgfCBzZWQgJ3MvLnNyYyQkLy8nIHwgeGFyZ3MgLXIgcm0gLWYKKworIyBkaXN0Y2xlYW4KKyMKK1BIT05ZICs9IGRpc3RjbGVhbgorCitkaXN0Y2xlYW46IG1ycHJvcGVyCisJQGZpbmQgJChzcmN0cmVlKSAkKFJDU19GSU5EX0lHTk9SRSkgXAorCQlcKCAtbmFtZSAnKi5vcmlnJyAtbyAtbmFtZSAnKi5yZWonIC1vIC1uYW1lICcqficgXAorCQktbyAtbmFtZSAnKi5iYWsnIC1vIC1uYW1lICcjKiMnIC1vIC1uYW1lICcuKi5vcmlnJyBcCisJCS1vIC1uYW1lICcuKi5yZWonIC1vIC1uYW1lICcqLnRtcCcgLW8gLXNpemUgMCBcCisJCS1vIC1uYW1lICcqJScgLW8gLW5hbWUgJy4qLmNtZCcgLW8gLW5hbWUgJ2NvcmUnIFwpIFwKKwkJLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBybSAtZgorCisKKyMgUGFja2FnaW5nIG9mIHRoZSBrZXJuZWwgdG8gdmFyaW91cyBmb3JtYXRzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBycG0gdGFyZ2V0IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKK3BhY2thZ2UtZGlyCTo9ICQoc3JjdHJlZSkvc2NyaXB0cy9wYWNrYWdlCisKKyVwa2c6IEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChwYWNrYWdlLWRpcikgJEAKK3JwbTogRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKHBhY2thZ2UtZGlyKSAkQAorCisKKyMgQnJpZWYgZG9jdW1lbnRhdGlvbiBvZiB0aGUgdHlwaWNhbCB0YXJnZXRzIHVzZWQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2JvYXJkcyA6PSAkKHdpbGRjYXJkICQoc3JjdHJlZSkvY29uZmlncy8qX2RlZmNvbmZpZykKK2JvYXJkcyA6PSAkKG5vdGRpciAkKGJvYXJkcykpCisKKy1pbmNsdWRlICQoc3JjdHJlZSkvTWFrZWZpbGUuaGVscAorCisjIERvY3VtZW50YXRpb24gdGFyZ2V0cworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVkb2NzOiBzY3JpcHRzX2Jhc2ljIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9RG9jdW1lbnRhdGlvbi9Eb2NCb29rICRACisKK2Vsc2UgIyBLQlVJTERfRVhUTU9ECisKKyMjIworIyBFeHRlcm5hbCBtb2R1bGUgc3VwcG9ydC4KKyMgV2hlbiBidWlsZGluZyBleHRlcm5hbCBtb2R1bGVzIHRoZSBrZXJuZWwgdXNlZCBhcyBiYXNpcyBpcyBjb25zaWRlcmVkCisjIHJlYWQtb25seSwgYW5kIG5vIGNvbnNpc3RlbmN5IGNoZWNrcyBhcmUgbWFkZSBhbmQgdGhlIG1ha2UKKyMgc3lzdGVtIGlzIG5vdCB1c2VkIG9uIHRoZSBiYXNpcyBrZXJuZWwuIElmIHVwZGF0ZXMgYXJlIHJlcXVpcmVkCisjIGluIHRoZSBiYXNpcyBrZXJuZWwgb3JkaW5hcnkgbWFrZSBjb21tYW5kcyAod2l0aG91dCBNPS4uLikgbXVzdAorIyBiZSB1c2VkLgorIworIyBUaGUgZm9sbG93aW5nIGFyZSB0aGUgb25seSB2YWxpZCB0YXJnZXRzIHdoZW4gYnVpbGRpbmcgZXh0ZXJuYWwKKyMgbW9kdWxlcy4KKyMgbWFrZSBNPWRpciBjbGVhbiAgICAgRGVsZXRlIGFsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlcworIyBtYWtlIE09ZGlyIG1vZHVsZXMgICBNYWtlIGFsbCBtb2R1bGVzIGluIHNwZWNpZmllZCBkaXIKKyMgbWFrZSBNPWRpcgkgICAgICAgU2FtZSBhcyAnbWFrZSBNPWRpciBtb2R1bGVzJworIyBtYWtlIE09ZGlyIG1vZHVsZXNfaW5zdGFsbAorIyAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIHRoZSBtb2R1bGVzIGJ1aWxkIGluIHRoZSBtb2R1bGUgZGlyZWN0b3J5CisjICAgICAgICAgICAgICAgICAgICAgIEFzc3VtZXMgaW5zdGFsbCBkaXJlY3RvcnkgaXMgYWxyZWFkeSBjcmVhdGVkCisKKyMgV2UgYXJlIGFsd2F5cyBidWlsZGluZyBtb2R1bGVzCitLQlVJTERfTU9EVUxFUyA6PSAxCitQSE9OWSArPSBjcm1vZHZlcmRpcgorY3Jtb2R2ZXJkaXI6CisJJChRKW1rZGlyIC1wICQoTU9EVkVSRElSKQorCSQoUSlybSAtZiAkKE1PRFZFUkRJUikvKgorCitQSE9OWSArPSAkKG9ianRyZWUpL01vZHVsZS5zeW12ZXJzCiskKG9ianRyZWUpL01vZHVsZS5zeW12ZXJzOgorCUB0ZXN0IC1lICQob2JqdHJlZSkvTW9kdWxlLnN5bXZlcnMgfHwgKCBcCisJZWNobzsgXAorCWVjaG8gIiAgV0FSTklORzogU3ltYm9sIHZlcnNpb24gZHVtcCAkKG9ianRyZWUpL01vZHVsZS5zeW12ZXJzIjsgXAorCWVjaG8gIiAgICAgICAgICAgaXMgbWlzc2luZzsgbW9kdWxlcyB3aWxsIGhhdmUgbm8gZGVwZW5kZW5jaWVzIGFuZCBtb2R2ZXJzaW9ucy4iOyBcCisJZWNobyApCisKK21vZHVsZS1kaXJzIDo9ICQoYWRkcHJlZml4IF9tb2R1bGVfLCQoS0JVSUxEX0VYVE1PRCkpCitQSE9OWSArPSAkKG1vZHVsZS1kaXJzKSBtb2R1bGVzCiskKG1vZHVsZS1kaXJzKTogY3Jtb2R2ZXJkaXIgJChvYmp0cmVlKS9Nb2R1bGUuc3ltdmVycworCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQocGF0c3Vic3QgX21vZHVsZV8lLCUsJEApCisKK21vZHVsZXM6ICQobW9kdWxlLWRpcnMpCisJQGVjaG8gJyAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2UgMi4nOworCSQoUSkkKE1BS0UpIC1yUiAtZiAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAorCitQSE9OWSArPSBtb2R1bGVzX2luc3RhbGwKK21vZHVsZXNfaW5zdGFsbDogX2Vtb2RpbnN0XyBfZW1vZGluc3RfcG9zdAorCitpbnN0YWxsLWRpciA6PSAkKGlmICQoSU5TVEFMTF9NT0RfRElSKSwkKElOU1RBTExfTU9EX0RJUiksZXh0cmEpCitQSE9OWSArPSBfZW1vZGluc3RfCitfZW1vZGluc3RfOgorCSQoUSlta2RpciAtcCAkKE1PRExJQikvJChpbnN0YWxsLWRpcikKKwkkKFEpJChNQUtFKSAtclIgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLm1vZGluc3QKKworIyBSdW4gZGVwbW9kIG9ubHkgaXMgd2UgaGF2ZSBTeXN0ZW0ubWFwIGFuZCBkZXBtb2QgaXMgZXhlY3V0YWJsZQorcXVpZXRfY21kX2RlcG1vZCA9IERFUE1PRCAgJChLRVJORUxSRUxFQVNFKQorICAgICAgY21kX2RlcG1vZCA9IGlmIFsgLXIgU3lzdGVtLm1hcCAtYSAteCAkKERFUE1PRCkgXTsgdGhlbiBcCisgICAgICAgICAgICAgICAgICAgICAgJChERVBNT0QpIC1hZSAtRiBTeXN0ZW0ubWFwICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoc3RyaXAgJChJTlNUQUxMX01PRF9QQVRIKSksICAgICAgXAorCQkgICAgICAtYiAkKElOU1RBTExfTU9EX1BBVEgpIC1yKSAgICAgICAgICAgICAgXAorCQkgICAgICAkKEtFUk5FTFJFTEVBU0UpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGZpCisKK1BIT05ZICs9IF9lbW9kaW5zdF9wb3N0CitfZW1vZGluc3RfcG9zdDogX2Vtb2RpbnN0XworCSQoY2FsbCBjbWQsZGVwbW9kKQorCitjbGVhbi1kaXJzIDo9ICQoYWRkcHJlZml4IF9jbGVhbl8sJChLQlVJTERfRVhUTU9EKSkKKworUEhPTlkgKz0gJChjbGVhbi1kaXJzKSBjbGVhbgorJChjbGVhbi1kaXJzKToKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKHBhdHN1YnN0IF9jbGVhbl8lLCUsJEApCisKK2NsZWFuOglybS1kaXJzIDo9ICQoTU9EVkVSRElSKQorY2xlYW46ICQoY2xlYW4tZGlycykKKwkkKGNhbGwgY21kLHJtZGlycykKKwlAZmluZCAkKEtCVUlMRF9FWFRNT0QpICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJCVwoIC1uYW1lICcqLltvYXNdJyAtbyAtbmFtZSAnKi5rbycgLW8gLW5hbWUgJy4qLmNtZCcgXAorCQktbyAtbmFtZSAnLiouZCcgLW8gLW5hbWUgJy4qLnRtcCcgLW8gLW5hbWUgJyoubW9kLmMnIFwpIFwKKwkJLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBybSAtZgorCisjIER1bW1pZXMuLi4KK1BIT05ZICs9IHByZXBhcmUgc2NyaXB0cworcHJlcGFyZTogOworc2NyaXB0czogOworZW5kaWYgIyBLQlVJTERfRVhUTU9ECisKKyMgR2VuZXJhdGUgdGFncyBmb3IgZWRpdG9ycworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI1dlIHdhbnQgX19zcmN0cmVlIHRvIHRvdGFsbHkgdmFuaXNoIG91dCB3aGVuIEtCVUlMRF9PVVRQVVQgaXMgbm90IHNldAorIyh3aGljaCBpcyB0aGUgbW9zdCBjb21tb24gY2FzZSBJTUhPKSB0byBhdm9pZCB1bm5lZWRlZCBjbHV0dGVyIGluIHRoZSBiaWcgdGFncyBmaWxlLgorI0FkZGluZyAkKHNyY3RyZWUpIGFkZHMgYWJvdXQgMjBNIG9uIGkzODYgdG8gdGhlIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlIQorCitpZmVxICgkKHNyYyksJChvYmopKQorX19zcmN0cmVlID0KK2Vsc2UKK19fc3JjdHJlZSA9ICQoc3JjdHJlZSkvCitlbmRpZgorCitpZmVxICgkKEFMTFNPVVJDRV9BUkNIUyksKQoraWZlcSAoJChBUkNIKSx1bSkKK0FMTElOQ0xVREVfQVJDSFMgOj0gJChBUkNIKSAkKFNVQkFSQ0gpCitlbHNlCitBTExJTkNMVURFX0FSQ0hTIDo9ICQoQVJDSCkKK2VuZGlmCitlbHNlCisjQWxsb3cgdXNlciB0byBzcGVjaWZ5IG9ubHkgQUxMU09VUkNFX1BBVEhTIG9uIHRoZSBjb21tYW5kIGxpbmUsIGtlZXBpbmcgZXhpc3RpbmcgYmVoYXZpb3VyLgorQUxMSU5DTFVERV9BUkNIUyA6PSAkKEFMTFNPVVJDRV9BUkNIUykKK2VuZGlmCisKK0FMTFNPVVJDRV9BUkNIUyA6PSAkKEFSQ0gpCisKK2RlZmluZSBhbGwtc291cmNlcworCSggZmluZCAkKF9fc3JjdHJlZSkgJChSQ1NfRklORF9JR05PUkUpIFwKKwkgICAgICAgXCggLW5hbWUgaW5jbHVkZSAtbyAtbmFtZSBhcmNoIFwpIC1wcnVuZSAtbyBcCisJICAgICAgIC1uYW1lICcqLltjaFNdJyAtcHJpbnQ7IFwKKwkgIGZvciBBUkNIIGluICQoQUxMU09VUkNFX0FSQ0hTKSA7IGRvIFwKKwkgICAgICAgZmluZCAkKF9fc3JjdHJlZSlhcmNoLyQke0FSQ0h9ICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJICAgICAgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludDsgXAorCSAgZG9uZSA7IFwKKwkgIGZpbmQgJChfX3NyY3RyZWUpc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJICAgICAgIC1uYW1lICcqLltjaFNdJyAtcHJpbnQ7IFwKKwkgIGZpbmQgJChfX3NyY3RyZWUpaW5jbHVkZSAkKFJDU19GSU5EX0lHTk9SRSkgXAorCSAgICAgICBcKCAtbmFtZSBjb25maWcgLW8gLW5hbWUgJ2FzbS0qJyBcKSAtcHJ1bmUgXAorCSAgICAgICAtbyAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICBmb3IgQVJDSCBpbiAkKEFMTElOQ0xVREVfQVJDSFMpIDsgZG8gXAorCSAgICAgICBmaW5kICQoX19zcmN0cmVlKWluY2x1ZGUvYXNtLSQke0FSQ0h9ICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJICAgICAgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludDsgXAorCSAgZG9uZSA7IFwKKwkgIGZpbmQgJChfX3NyY3RyZWUpaW5jbHVkZS9hc20tZ2VuZXJpYyAkKFJDU19GSU5EX0lHTk9SRSkgXAorCSAgICAgICAtbmFtZSAnKi5bY2hTXScgLXByaW50ICkKK2VuZGVmCisKK3F1aWV0X2NtZF9jc2NvcGUtZmlsZSA9IEZJTEVMU1QgY3Njb3BlLmZpbGVzCisgICAgICBjbWRfY3Njb3BlLWZpbGUgPSAoZWNobyBcLWs7IGVjaG8gXC1xOyAkKGFsbC1zb3VyY2VzKSkgPiBjc2NvcGUuZmlsZXMKKworcXVpZXRfY21kX2NzY29wZSA9IE1BS0UgICAgY3Njb3BlLm91dAorICAgICAgY21kX2NzY29wZSA9IGNzY29wZSAtYgorCitjc2NvcGU6IEZPUkNFCisJJChjYWxsIGNtZCxjc2NvcGUtZmlsZSkKKwkkKGNhbGwgY21kLGNzY29wZSkKKworcXVpZXRfY21kX1RBR1MgPSBNQUtFICAgJEAKK2RlZmluZSBjbWRfVEFHUworCXJtIC1mICRAOyBcCisJRVRBR1NGPWBldGFncyAtLXZlcnNpb24gfCBncmVwIC1pIGV4dWJlcmFudCA+L2Rldi9udWxsICYmICAgICBcCisgICAgICAgICAgICAgICAgZWNobyAiLUkgX19pbml0ZGF0YSxfX2V4aXRkYXRhLF9fYWNxdWlyZXMsX19yZWxlYXNlcyAgXAorICAgICAgICAgICAgICAgICAgICAgIC1JIEVYUE9SVF9TWU1CT0wsRVhQT1JUX1NZTUJPTF9HUEwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLWV4dHJhPStmIC0tYy1raW5kcz0rcHgiYDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJChhbGwtc291cmNlcykgfCB4YXJncyBldGFncyAkJEVUQUdTRiAtYQorZW5kZWYKKworVEFHUzogRk9SQ0UKKwkkKGNhbGwgY21kLFRBR1MpCisKKworcXVpZXRfY21kX3RhZ3MgPSBNQUtFICAgJEAKK2RlZmluZSBjbWRfdGFncworCXJtIC1mICRAOyBcCisJQ1RBR1NGPWBjdGFncyAtLXZlcnNpb24gfCBncmVwIC1pIGV4dWJlcmFudCA+L2Rldi9udWxsICYmICAgICBcCisgICAgICAgICAgICAgICAgZWNobyAiLUkgX19pbml0ZGF0YSxfX2V4aXRkYXRhLF9fYWNxdWlyZXMsX19yZWxlYXNlcyAgXAorICAgICAgICAgICAgICAgICAgICAgIC1JIEVYUE9SVF9TWU1CT0wsRVhQT1JUX1NZTUJPTF9HUEwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLWV4dHJhPStmIC0tYy1raW5kcz0rcHgiYDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJChhbGwtc291cmNlcykgfCB4YXJncyBjdGFncyAkJENUQUdTRiAtYQorZW5kZWYKKwordGFnczogRk9SQ0UKKwkkKGNhbGwgY21kLHRhZ3MpCisKKworIyBTY3JpcHRzIHRvIGNoZWNrIHZhcmlvdXMgdGhpbmdzIGZvciBjb25zaXN0ZW5jeQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5jbHVkZWNoZWNrOgorCWZpbmQgKiAkKFJDU19GSU5EX0lHTk9SRSkgXAorCQktbmFtZSAnKi5baGNTXScgLXR5cGUgZiAtcHJpbnQgfCBzb3J0IFwKKwkJfCB4YXJncyAkKFBFUkwpIC13IHNjcmlwdHMvY2hlY2tpbmNsdWRlcy5wbAorCit2ZXJzaW9uY2hlY2s6CisJZmluZCAqICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJCS1uYW1lICcqLltoY1NdJyAtdHlwZSBmIC1wcmludCB8IHNvcnQgXAorCQl8IHhhcmdzICQoUEVSTCkgLXcgc2NyaXB0cy9jaGVja3ZlcnNpb24ucGwKKworbmFtZXNwYWNlY2hlY2s6CisJJChQRVJMKSAkKHNyY3RyZWUpL3NjcmlwdHMvbmFtZXNwYWNlLnBsCisKK2VuZGlmICNpZmVxICgkKGNvbmZpZy10YXJnZXRzKSwxKQorZW5kaWYgI2lmZXEgKCQobWl4ZWQtdGFyZ2V0cyksMSkKKworUEhPTlkgKz0gY2hlY2tzdGFjaworY2hlY2tzdGFjazoKKwkkKE9CSkRVTVApIC1kIGJ1c3lib3ggJCQoZmluZCAuIC1uYW1lICcqLmtvJykgfCBcCisJJChQRVJMKSAkKHNyYykvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQVJDSCkKKwora2VybmVscmVsZWFzZToKKwkkKGlmICQod2lsZGNhcmQgLmtlcm5lbHJlbGVhc2UpLCAkKFEpZWNobyAkKEtFUk5FTFJFTEVBU0UpLCBcCisJJChlcnJvciBrZXJuZWxyZWxlYXNlIG5vdCB2YWxpZCAtIHJ1biAnbWFrZSAqY29uZmlnJyB0byB1cGRhdGUgaXQpKQora2VybmVsdmVyc2lvbjoKKwlAZWNobyAkKEtFUk5FTFZFUlNJT04pCisKKyMgU2luZ2xlIHRhcmdldHMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNpbmdsZSB0YXJnZXRzIGFyZSBjb21wYXRpYmxlIHdpdGg6CisjIC0gYnVpbGQgd2hpdGggbWl4ZWQgc291cmNlIGFuZCBvdXRwdXQKKyMgLSBidWlsZCB3aXRoIHNlcGFyYXRlIG91dHB1dCBkaXIgJ21ha2UgTz0uLi4nCisjIC0gZXh0ZXJuYWwgbW9kdWxlcworIworIyAgdGFyZ2V0LWRpciA9PiB3aGVyZSB0byBzdG9yZSBvdXRwdXRmaWxlCisjICBidWlsZC1kaXIgID0+IGRpcmVjdG9yeSBpbiBrZXJuZWwgc291cmNlIHRyZWUgdG8gdXNlCisKK2lmZXEgKCQoS0JVSUxEX0VYVE1PRCksKQorICAgICAgICBidWlsZC1kaXIgID0gJChwYXRzdWJzdCAlLywlLCQoZGlyICRAKSkKKyAgICAgICAgdGFyZ2V0LWRpciA9ICQoZGlyICRAKQorZWxzZQorICAgICAgICB6YXAtc2xhc2g9JChmaWx0ZXItb3V0IC4sJChwYXRzdWJzdCAlLywlLCQoZGlyICRAKSkpCisgICAgICAgIGJ1aWxkLWRpciAgPSAkKEtCVUlMRF9FWFRNT0QpJChpZiAkKHphcC1zbGFzaCksLyQoemFwLXNsYXNoKSkKKyAgICAgICAgdGFyZ2V0LWRpciA9ICQoaWYgJChLQlVJTERfRVhUTU9EKSwkKGRpciAkPCksJChkaXIgJEApKQorZW5kaWYKKworJS5zOiAlLmMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKyUuaTogJS5jIHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCislLm86ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorJS5sc3Q6ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorJS5zOiAlLlMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKyUubzogJS5TIHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCisKKyMgTW9kdWxlcworJS86IHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgXAorCSQoYnVpbGQpPSQoYnVpbGQtZGlyKQorLzogcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgS0JVSUxEX01PRFVMRVM9JChpZiAkKENPTkZJR19NT0RVTEVTKSwxKSBcCisJJChidWlsZCk9JChidWlsZC1kaXIpCisKKyUua286IHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgICBcCisJJChidWlsZCk9JChidWlsZC1kaXIpICQoQDoua289Lm8pCisJJChRKSQoTUFLRSkgLXJSIC1mICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CisKKyMgRklYTUUgU2hvdWxkIGdvIGludG8gYSBtYWtlLmxpYiBvciBzb21ldGhpbmcKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3F1aWV0X2NtZF9ybWRpcnMgPSAkKGlmICQod2lsZGNhcmQgJChybS1kaXJzKSksQ0xFQU4gICAkKHdpbGRjYXJkICQocm0tZGlycykpKQorICAgICAgY21kX3JtZGlycyA9IHJtIC1yZiAkKHJtLWRpcnMpCisKK3F1aWV0X2NtZF9ybWZpbGVzID0gJChpZiAkKHdpbGRjYXJkICQocm0tZmlsZXMpKSxDTEVBTiAgICQod2lsZGNhcmQgJChybS1maWxlcykpKQorICAgICAgY21kX3JtZmlsZXMgPSBybSAtZiAkKHJtLWZpbGVzKQorCisKK2FfZmxhZ3MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChBRkxBR1MpICQoQUZMQUdTX0tFUk5FTCkgXAorCSAgJChOT1NURElOQ19GTEFHUykgJChDUFBGTEFHUykgXAorCSAgJChtb2RrZXJuX2FmbGFncykgJChFWFRSQV9BRkxBR1MpICQoQUZMQUdTXyQoKkYpLm8pCisKK3F1aWV0X2NtZF9hc19vX1MgPSBBUyAgICAgICRACitjbWRfYXNfb19TICAgICAgID0gJChDQykgJChhX2ZsYWdzKSAtYyAtbyAkQCAkPAorCisjIHJlYWQgYWxsIHNhdmVkIGNvbW1hbmQgbGluZXMKKwordGFyZ2V0cyA6PSAkKHdpbGRjYXJkICQoc29ydCAkKHRhcmdldHMpKSkKK2NtZF9maWxlcyA6PSAkKHdpbGRjYXJkIC4qLmNtZCAkKGZvcmVhY2ggZiwkKHRhcmdldHMpLCQoZGlyICQoZikpLiQobm90ZGlyICQoZikpLmNtZCkpCisKK2lmbmVxICgkKGNtZF9maWxlcyksKQorICAkKGNtZF9maWxlcyk6IDsJIyBEbyBub3QgdHJ5IHRvIHVwZGF0ZSBpbmNsdWRlZCBkZXBlbmRlbmN5IGZpbGVzCisgIGluY2x1ZGUgJChjbWRfZmlsZXMpCitlbmRpZgorCisjIFNob3J0aGFuZCBmb3IgJChRKSQoTUFLRSkgLWYgc2NyaXB0cy9NYWtlZmlsZS5jbGVhbiBvYmo9ZGlyCisjIFVzYWdlOgorIyAkKFEpJChNQUtFKSAkKGNsZWFuKT1kaXIKK2NsZWFuIDo9IC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iagorCitlbmRpZgkjIHNraXAtbWFrZWZpbGUKKworUEhPTlkgKz0gRk9SQ0UKK0ZPUkNFOgorCistaW5jbHVkZSAkKHNyY3RyZWUpL01ha2VmaWxlLmN1c3RvbQorCisjIERlY2xhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSAuUEhPTlkgdmFyaWFibGUgYXMgcGhvbnkuICBXZSBrZWVwIHRoYXQKKyMgaW5mb3JtYXRpb24gaW4gYSB2YXJpYWJsZSBzZSB3ZSBjYW4gdXNlIGl0IGluIGlmX2NoYW5nZWQgYW5kIGZyaWVuZHMuCisuUEhPTlk6ICQoUEhPTlkpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9NYWtlZmlsZS5jdXN0b20gYi9idXN5Ym94LTEuMTkuMy9NYWtlZmlsZS5jdXN0b20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhNzllNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL01ha2VmaWxlLmN1c3RvbQpAQCAtMCwwICsxLDE3OCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZCBzeXN0ZW0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYnVzeWJveC5saW5rczogJChzcmN0cmVlKS9hcHBsZXRzL2J1c3lib3gubWtsbCAkKG9ianRyZWUpL2luY2x1ZGUvYXV0b2NvbmYuaCBpbmNsdWRlL2FwcGxldHMuaAorCSQoUSktJChTSEVMTCkgJF4gPiRACisKKy5QSE9OWTogaW5zdGFsbAoraWZlcSAoJChDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1MpLHkpCitJTlNUQUxMX09QVFM6PSAtLXN5bWxpbmtzCitlbmRpZgoraWZlcSAoJChDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTKSx5KQorSU5TVEFMTF9PUFRTOj0gLS1oYXJkbGlua3MKK2VuZGlmCitpZmVxICgkKENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMpLHkpCitpZmVxICgkKENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LKSx5KQorSU5TVEFMTF9PUFRTOj0gLS1zdy1zaC1zeW0KK2VuZGlmCitpZmVxICgkKENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9IQVJETElOSykseSkKK0lOU1RBTExfT1BUUzo9IC0tc3ctc2gtaGFyZAorZW5kaWYKK2lmZXEgKCQoQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSKSx5KQorSU5TVEFMTF9PUFRTOj0gLS1zY3JpcHR3cmFwcGVyCitlbmRpZgorZW5kaWYKK2luc3RhbGw6ICQoc3JjdHJlZSkvYXBwbGV0cy9pbnN0YWxsLnNoIGJ1c3lib3ggYnVzeWJveC5saW5rcworCSQoUSlET19JTlNUQUxMX0xJQlM9IiQoc3RyaXAgJChMSUJCVVNZQk9YX1NPTkFNRSkgJChET19JTlNUQUxMX0xJQlMpKSIgXAorCQkkKFNIRUxMKSAkPCAkKENPTkZJR19QUkVGSVgpICQoSU5TVEFMTF9PUFRTKQoraWZlcSAoJChzdHJpcCAkKENPTkZJR19GRUFUVVJFX1NVSUQpKSx5KQorCUBlY2hvCisJQGVjaG8KKwlAZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUBlY2hvIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gbWFrZSB5b3VyIGJ1c3lib3ggYmluYXJ5CisJQGVjaG8gc2V0dWlkIHJvb3QgdG8gZW5zdXJlIGFsbCBjb25maWd1cmVkIGFwcGxldHMgd2lsbAorCUBlY2hvIHdvcmsgcHJvcGVybHkuCisJQGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlAZWNobworZW5kaWYKKwordW5pbnN0YWxsOiBidXN5Ym94LmxpbmtzCisJcm0gLWYgJChDT05GSUdfUFJFRklYKS9iaW4vYnVzeWJveAorCWZvciBpIGluIGBjYXQgYnVzeWJveC5saW5rc2AgOyBkbyBybSAtZiAkKENPTkZJR19QUkVGSVgpJCRpOyBkb25lCitpZm5lcSAoJChzdHJpcCAkKERPX0lOU1RBTExfTElCUykpLG4pCisJZm9yIGkgaW4gJChMSUJCVVNZQk9YX1NPTkFNRSkgJChET19JTlNUQUxMX0xJQlMpOyBkbyBcCisJCXJtIC1mICQoQ09ORklHX1BSRUZJWCkkJGk7IFwKKwlkb25lCitlbmRpZgorCisjIE5vdCB2ZXJ5IGVsZWdhbnQ6IGNvcGllcyB0ZXN0c3VpdGUgdG8gb2JqZGlyLi4uCisjIChjcCAtcFBSIGlzIFBPU0lYLWNvbXBsaWFudCAoY3AgLWRwUiBvciBjcCAtYSB3b3VsZCBub3QgYmUpKQorLlBIT05ZOiBjaGVjaworLlBIT05ZOiB0ZXN0CitjaGVjayB0ZXN0OiBidXN5Ym94IGJ1c3lib3gubGlua3MKKwl0ZXN0IC1kICQob2JqdHJlZSkvdGVzdHN1aXRlIHx8IGNwIC1wUFIgJChzcmN0cmVlKS90ZXN0c3VpdGUgJChvYmp0cmVlKQorCWJpbmRpcj0kKG9ianRyZWUpIHNyY2Rpcj0kKHNyY3RyZWUpL3Rlc3RzdWl0ZSBcCisJJChTSEVMTCkgLWMgImNkICQob2JqdHJlZSkvdGVzdHN1aXRlICYmICQoc3JjdHJlZSkvdGVzdHN1aXRlL3J1bnRlc3QgJChpZiAkKEtCVUlMRF9WRVJCT1NFOjA9KSwtdikiCisKKy5QSE9OWTogcmVsZWFzZQorcmVsZWFzZTogZGlzdGNsZWFuCisJY2QgLi47IFwKKwlybSAtciAtZiBidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKTsgXAorCWNwIC1wUFIgYnVzeWJveCBidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKSAmJiB7IFwKKwlmaW5kIGJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pLyAtdHlwZSBkIFwKKwkJLW5hbWUgLnN2biBcCisJCS1wcmludCBcCisJCS1leGVjIHJtIC1yIC1mIHt9IFw7IDsgXAorCWZpbmQgYnVzeWJveC0kKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikvIC10eXBlIGQgXAorCQktbmFtZSAuZ2l0IFwKKwkJLXByaW50IFwKKwkJLWV4ZWMgcm0gLXIgLWYge30gXDsgOyBcCisJZmluZCBidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKS8gLXR5cGUgZiBcCisJCS1uYW1lIC5cIyogXAorCQktcHJpbnQgXAorCQktZXhlYyBybSAtZiB7fSBcOyA7IFwKKwl0YXIgLWN6ZiBidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKS50YXIuZ3ogXAorCQlidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKS8gOyB9CisKKy5QSE9OWTogY2hlY2toZWxwCitjaGVja2hlbHA6CisJJChRKSQoc3JjdHJlZSkvc2NyaXB0cy9jaGVja2hlbHAuYXdrIFwKKwkJJChwYXRzdWJzdCAlLCQoc3JjdHJlZSkvJSwkKHdpbGRjYXJkICQocGF0c3Vic3QgJSwlL0NvbmZpZy5pbiwkKGJ1c3lib3gtZGlycykgLi8pKSkKKworLlBIT05ZOiBzaXplcworc2l6ZXM6IGJ1c3lib3hfdW5zdHJpcHBlZAorCSQoTk0pIC0tc2l6ZS1zb3J0ICQoPCkKKworLlBIT05ZOiBibG9hdGNoZWNrCitibG9hdGNoZWNrOiBidXN5Ym94X29sZCBidXN5Ym94X3Vuc3RyaXBwZWQKKwlAJChzcmN0cmVlKS9zY3JpcHRzL2Jsb2F0LW8tbWV0ZXIgYnVzeWJveF9vbGQgYnVzeWJveF91bnN0cmlwcGVkCisJQCQoQ1JPU1NfQ09NUElMRSlzaXplIGJ1c3lib3hfb2xkIGJ1c3lib3hfdW5zdHJpcHBlZAorCisuUEhPTlk6IGJhc2VsaW5lCitiYXNlbGluZTogYnVzeWJveF91bnN0cmlwcGVkCisJQG12IGJ1c3lib3hfdW5zdHJpcHBlZCBidXN5Ym94X29sZAorCisuUEhPTlk6IG9ianNpemVzCitvYmpzaXplczogYnVzeWJveF91bnN0cmlwcGVkCisJJChzcmN0cmVlKS9zY3JpcHRzL29ianNpemVzCisKKy5QSE9OWTogc3Rrc2l6ZXMKK3N0a3NpemVzOiBidXN5Ym94X3Vuc3RyaXBwZWQKKwkkKENST1NTX0NPTVBJTEUpb2JqZHVtcCAtZCBidXN5Ym94X3Vuc3RyaXBwZWQgfCAkKHNyY3RyZWUpL3NjcmlwdHMvY2hlY2tzdGFjay5wbCAkKEFSQ0gpIHwgdW5pcQorCisuUEhPTlk6IGJpZ2RhdGEKK2JpZ2RhdGE6IGJ1c3lib3hfdW5zdHJpcHBlZAorCSQoQ1JPU1NfQ09NUElMRSlubSAtLXNpemUtc29ydCBidXN5Ym94X3Vuc3RyaXBwZWQgfCBncmVwIC12aSAnIFt0cnddICcKKworIyBEb2N1bWVudGF0aW9uIFRhcmdldHMKKy5QSE9OWTogZG9jCitkb2M6IGRvY3MvYnVzeWJveC5wb2QgZG9jcy9CdXN5Qm94LnR4dCBkb2NzL2J1c3lib3guMSBkb2NzL0J1c3lCb3guaHRtbAorCisjIEZJWE1FOiBEb2Vzbid0IGJlbG9uZyBoZXJlCisgICAgICAgY21kX2RvYyA9CisgcXVpZXRfY21kX2RvYyA9ICQoUSllY2hvICIgIERPQyAgICAgJChARikiCitzaWxlbnRfY21kX2RvYyA9CitkaXNwX2RvYyAgICAgICA9ICQoJChxdWlldCljbWRfZG9jKQorCisjIHNlZCBhZGRzIG5ld2xpbmVzIGFmdGVyICJPcHRpb25zOiIgZXRjLAorIyB0aGlzIGlzIG5lZWRlZCBpbiBvcmRlciB0byBnZXQgZ29vZCBCdXN5Qm94LnsxLHR4dCxodG1sfQorZG9jcy9idXN5Ym94LnBvZDogJChzcmN0cmVlKS9kb2NzL2J1c3lib3hfaGVhZGVyLnBvZCBcCisJCWluY2x1ZGUvdXNhZ2UuaCBcCisJCSQoc3JjdHJlZSkvZG9jcy9idXN5Ym94X2Zvb3Rlci5wb2QgXAorCQlhcHBsZXRzL3VzYWdlX3BvZAorCSQoZGlzcF9kb2MpCisJJChRKS1ta2RpciAtcCBkb2NzCisJJChRKS0oIFwKKwkgICAgY2F0ICQoc3JjdHJlZSkvZG9jcy9idXN5Ym94X2hlYWRlci5wb2Q7IFwKKwkgICAgZWNobzsgXAorCSAgICBhcHBsZXRzL3VzYWdlX3BvZCB8IHNlZCAncy9eW0EtWmEtel1bQS1aYS16IF0qW2Etel06JCQvJlxuLyc7IFwKKwkgICAgY2F0ICQoc3JjdHJlZSkvZG9jcy9idXN5Ym94X2Zvb3Rlci5wb2Q7IFwKKwkgICAgKSA+IGRvY3MvYnVzeWJveC5wb2QKKworZG9jcy9CdXN5Qm94LnR4dDogZG9jcy9idXN5Ym94LnBvZAorCSQoZGlzcF9kb2MpCisJJChRKS1ta2RpciAtcCBkb2NzCisJJChRKS1wb2QydGV4dCAkPCA+ICRACisKK2RvY3MvYnVzeWJveC4xOiBkb2NzL2J1c3lib3gucG9kCisJJChkaXNwX2RvYykKKwkkKFEpLW1rZGlyIC1wIGRvY3MKKwkkKFEpLXBvZDJtYW4gLS1jZW50ZXI9YnVzeWJveCAtLXJlbGVhc2U9InZlcnNpb24gJChLRVJORUxWRVJTSU9OKSIgJDwgPiAkQAorCitkb2NzL0J1c3lCb3guaHRtbDogZG9jcy9idXN5Ym94Lm5ldC9CdXN5Qm94Lmh0bWwKKwkkKGRpc3BfZG9jKQorCSQoUSktbWtkaXIgLXAgZG9jcworCSQoUSktcm0gLWYgZG9jcy9CdXN5Qm94Lmh0bWwKKwkkKFEpLWNwIGRvY3MvYnVzeWJveC5uZXQvQnVzeUJveC5odG1sIGRvY3MvQnVzeUJveC5odG1sCisKK2RvY3MvYnVzeWJveC5uZXQvQnVzeUJveC5odG1sOiBkb2NzL2J1c3lib3gucG9kCisJJChRKS1ta2RpciAtcCBkb2NzL2J1c3lib3gubmV0CisJJChRKS1wb2QyaHRtbCAtLW5vaW5kZXggJDwgPiAkQAorCSQoUSktcm0gLWYgcG9kMmh0bSoKKworIyBkb2N1bWVudGF0aW9uLCBjcm9zcy1yZWZlcmVuY2UKKyMgTW9kZXJuIGRpc3RyaWJ1dGlvbnMgYWxyZWFkeSBzaGlwIHN5bm9wc2lzIHBhY2thZ2VzIChlLmcuIGRlYmlhbikKKyMgSWYgeW91IGhhdmUgYW4gb2xkIGRpc3RyaWJ1dGlvbiBnbyB0byBodHRwOi8vc3lub3BzaXMuZnJlc2NvLm9yZy8KK3N5bl90Z3QgPSAkKHdpbGRjYXJkICQocGF0c3Vic3QgJSwlLyouYywkKGJ1c3lib3gtYWxsZGlycykpKQorc3luICAgICA9ICQocGF0c3Vic3QgJS5jLCAlLnN5biwgJChzeW5fdGd0KSkKKworY29tbWE6PSAsCiticmFjZV9vcGVuOj0gKAorYnJhY2VfY2xvc2U6PSApCisKK1NZTl9DUFBGTEFHUyA6PSAkKHN0cmlwICQoQ1BQRkxBR1MpICQoRVhUUkFfQ1BQRkxBR1MpKQorU1lOX0NQUEZMQUdTIDo9ICQoc3Vic3QgJChicmFjZV9vcGVuKSxcJChicmFjZV9vcGVuKSwkKFNZTl9DUFBGTEFHUykpCitTWU5fQ1BQRkxBR1MgOj0gJChzdWJzdCAkKGJyYWNlX2Nsb3NlKSxcJChicmFjZV9jbG9zZSksJChTWU5fQ1BQRkxBR1MpKQorI1NZTl9DUFBGTEFHUyA6PSAkKHN1YnN0ICIsXCIsJChTWU5fQ1BQRkxBR1MpKQorIyIpCisjU1lOX0NQUEZMQUdTIDo9IFskKHBhdHN1YnN0ICUsJyUnJChjb21tYSksJChTWU5fQ1BQRkxBR1MpKScnXQorCislLnN5bjogJS5jCisJc3lub3BzaXMgLXAgQyAtbCBDb21tZW50cy5TU0RGaWx0ZXIsQ29tbWVudHMuUHJldmlvdXMgLVdwLHByZXByb2Nlc3M9VHJ1ZSxjcHBmbGFncz0iJyQoU1lOX0NQUEZMQUdTKSciIC1vICRAICQ8CisKKy5QSE9OWTogaHRtbAoraHRtbDogJChzeW4pCisJc3lub3BzaXMgLWYgSFRNTCAtV2YsdGl0bGU9IidCdXN5Qm94IERvY3VtZW50YXRpb24nIiAtbyAkQCAkXgorCistaW5jbHVkZSAkKHNyY3RyZWUpL01ha2VmaWxlLmxvY2FsCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9NYWtlZmlsZS5mbGFncyBiL2J1c3lib3gtMS4xOS4zL01ha2VmaWxlLmZsYWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZjUzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9NYWtlZmlsZS5mbGFncwpAQCAtMCwwICsxLDEzMiBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZCBzeXN0ZW0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQkJfVkVSID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pCitleHBvcnQgQkJfVkVSCitTS0lQX1NUUklQID89IG4KKworIyAtc3RkPWdudTk5IG5lZWRlZCBmb3IgW1VdTExPTkdfTUFYIG9uIHNvbWUgc3lzdGVtcworQ1BQRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtc3RkPWdudTk5LCkKKworQ1BQRkxBR1MgKz0gXAorCS1JaW5jbHVkZSAtSWxpYmJiIFwKKwkkKGlmICQoS0JVSUxEX1NSQyksLUlpbmNsdWRlMiAtSSQoc3JjdHJlZSkvaW5jbHVkZSAtSSQoc3JjdHJlZSkvbGliYmIpIFwKKwktaW5jbHVkZSBpbmNsdWRlL2F1dG9jb25mLmggXAorCS1EX0dOVV9TT1VSQ0UgLUROREVCVUcgXAorCSQoaWYgJChDT05GSUdfTEZTKSwtRF9MQVJHRUZJTEVfU09VUkNFIC1EX0xBUkdFRklMRTY0X1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0KSBcCisJLUQiQkJfVkVSPUtCVUlMRF9TVFIoJChCQl9WRVIpKSIgLURCQl9CVD1BVVRPQ09ORl9USU1FU1RBTVAKKworQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVdhbGwsKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVdzaGFkb3csKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVd3cml0ZS1zdHJpbmdzLCkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1XdW5kZWYsKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVdzdHJpY3QtcHJvdG90eXBlcywpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3VudXNlZCAtV3VudXNlZC1wYXJhbWV0ZXIsKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVd1bnVzZWQtZnVuY3Rpb24gLVd1bnVzZWQtdmFsdWUsKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucywpCisjIHdhcm4gYWJvdXQgQzk5IGRlY2xhcmF0aW9uIGFmdGVyIHN0YXRlbWVudAorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQsKQorIyBJZiB5b3Ugd2FudCB0byBhZGQgbW9yZSAtV3NvbWV0aGluZyBhYm92ZSwgbWFrZSBzdXJlIHRoYXQgaXQgaXMKKyMgc3RpbGwgcG9zc2libGUgdG8gYnVpbGQgYmJveCB3aXRob3V0IHdhcm5pbmdzLgorCitpZmVxICgkKENPTkZJR19XRVJST1IpLHkpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV2Vycm9yLCkKKyMjIFRPRE86CisjIyBnY2MgdmVyc2lvbiA0LjQuMCAyMDA5MDUwNiAoUmVkIEhhdCA0LjQuMC00KSAoR0NDKSBpcyBhIFBJVEE6CisjIyBjb25zdCBjaGFyICpwdHI7IC4uLiBvZmZfdCB2ID0gKihvZmZfdCopcHRyOyAtPiBCT09NCisjIyBhbmQgbm8gZWFzeSB3YXkgdG8gY29udmluY2UgaXQgdG8gc2h1dCB0aGUgaGVsbCB1cC4KKyMjIFdlIGhhdmUgYSBsb3Qgb2Ygc3VjaCB0aGluZ3MgYWxsIG92ZXIgdGhlIHBsYWNlLgorIyMgQ2xhc3NpYyAqKG9mZl90Kikodm9pZCopcHRyIGRvZXMgbm90IHdvcmssCisjIyBhbmQgSSBhbSB1bndpbGxpbmcgdG8gZG8gY3JhenkgZ2NjIHNwZWNpZmljICh7IHZvaWQgKnBwcCA9IC4uLjsgfSkKKyMjIHN0dWZmIGluIG1hY3Jvcy4gVGhpcyB3b3VsZCBvYmZ1c2NhdGUgdGhlIGNvZGUgdG9vIG11Y2guCisjIyBNYXliZSB0cnkgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpPworQ0ZMQUdTICs9ICQoY2FsbCBjYy1pZnZlcnNpb24sIC1nZSwgMDQwNCwgLWZuby1zdHJpY3QtYWxpYXNpbmcpCitlbmRpZgorIyBnY2MgMy54IGVtaXRzIGJvZ3VzICJvbGQgc3R5bGUgcHJvdG8iIHdhcm5pbmcgb24gZmluZC5jOmFsbG9jX2FjdGlvbigpCitDRkxBR1MgKz0gJChjYWxsIGNjLWlmdmVyc2lvbiwgLWdlLCAwNDAwLCAtV29sZC1zdHlsZS1kZWZpbml0aW9uKQorCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLWJ1aWx0aW4tc3RybGVuIC1maW5saW5lLWxpbWl0PTAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMsKQorIyAtZm5vLWd1ZXNzLWJyYW5jaC1wcm9iYWJpbGl0eTogcHJvaGliaXQgcHNldWRvLXJhbmRvbSBndWVzc2luZworIyBvZiBicmFuY2ggcHJvYmFiaWxpdGllcyAoaG9wZWZ1bGx5IG1ha2VzIGJsb2F0Y2hlY2sgbW9yZSBzdGFibGUpOgorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby1ndWVzcy1icmFuY2gtcHJvYmFiaWxpdHksKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZ1bnNpZ25lZC1jaGFyIC1zdGF0aWMtbGliZ2NjLCkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mYWxpZ24tZnVuY3Rpb25zPTEgLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbGFiZWxzPTEgLWZhbGlnbi1sb29wcz0xLCkKKworIyBGSVhNRTogVGhlc2Ugd2FybmluZ3MgYXJlIGF0IGxlYXN0IHBhcnRpYWxseSB0byBiZSBjb25jZXJuZWQgYWJvdXQgYW5kIHNob3VsZAorIyBiZSBmaXhlZC4uCisjQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVdjb252ZXJzaW9uLCkKKworaWZuZXEgKCQoQ09ORklHX0RFQlVHKSx5KQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLU9zLCQoY2FsbCBjYy1vcHRpb24sLU8yLCkpCitlbHNlCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZywpCisjQ0ZMQUdTICs9ICItRF9GT1JUSUZZX1NPVVJDRT0yIgoraWZlcSAoJChDT05GSUdfREVCVUdfUEVTU0lNSVpFKSx5KQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLU8wLCkKK2Vsc2UKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1PcywkKGNhbGwgY2Mtb3B0aW9uLC1PMiwpKQorZW5kaWYKK2VuZGlmCisKKyMgSWYgYXJjaC8kKEFSQ0gpL01ha2VmaWxlIGRpZCBub3Qgb3ZlcnJpZGUgaXQgKHdpdGgsIHNheSwgLWZQSUMpLi4uCitBUkNIX0ZQSUMgPz0gLWZwaWMKK0FSQ0hfRlBJRSA/PSAtZnBpZQorQVJDSF9QSUUgPz0gLXBpZQorCitpZmVxICgkKENPTkZJR19CVUlMRF9MSUJCVVNZQk9YKSx5KQorIyBvbiBpMzg2OiAxNCUgc21hbGxlciBsaWJidXN5Ym94LnNvCisjIChjb2RlIGl0c2VsZiBpcyA5JSBiaWdnZXIsIHdlIHNhdmUgb24gcmVsb2NzL1BMVC9HT1QpCitDRkxBR1MgKz0gJChBUkNIX0ZQSUMpCisjIGFuZCBhbm90aGVyIDQlIHJlZHVjdGlvbiBvZiBsaWJidXN5Ym94LnNvOgorIyAoZXh0ZXJuYWwgZW50cnkgcG9pbnRzIG11c3QgYmUgbWFya2VkIEVYVEVSTkFMTFlfVklTSUJMRSkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mdmlzaWJpbGl0eT1oaWRkZW4pCitlbmRpZgorCitpZmVxICgkKENPTkZJR19TVEFUSUMpLHkpCitDRkxBR1NfYnVzeWJveCArPSAtc3RhdGljCitlbmRpZgorCitpZmVxICgkKENPTkZJR19QSUUpLHkpCitDRkxBR1NfYnVzeWJveCArPSAkKEFSQ0hfUElFKQorQ0ZMQUdTICs9ICQoQVJDSF9GUElFKQorZW5kaWYKKworaWZuZXEgKCQoQ09ORklHX0VYVFJBX0NGTEFHUyksKQorQ0ZMQUdTICs9ICQoc3RyaXAgJChzdWJzdCAiLCwkKENPTkZJR19FWFRSQV9DRkxBR1MpKSkKKyMiKSkKK2VuZGlmCisKK0xETElCUyArPSBtIGNyeXB0CisKK2lmZXEgKCQoQ09ORklHX1BBTSkseSkKK0xETElCUyArPSBwYW0gcGFtX21pc2MKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1NFTElOVVgpLHkpCitMRExJQlMgKz0gc2VsaW51eCBzZXBvbAorZW5kaWYKKworaWZlcSAoJChDT05GSUdfRUZFTkNFKSx5KQorTERMSUJTICs9IGVmZW5jZQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfRE1BTExPQykseSkKK0xETElCUyArPSBkbWFsbG9jCitlbmRpZgorCisjIElmIGEgZmxhdCBiaW5hcnkgc2hvdWxkIGJlIGJ1aWx0LCBDRkxBR1NfYnVzeWJveD0iLWVsZjJmbHQiCisjIGVudiB2YXIgc2hvdWxkIGJlIHNldCBmb3IgbWFrZSBpbnZvY2F0aW9uLgorIyBIZXJlIHdlIGNoZWNrIHdoZXRoZXIgQ0ZMQUdTX2J1c3lib3ggaW5kZWVkIGNvbnRhaW5zIHRoYXQgZmxhZy4KKyMgKEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHdlIGFsc28gY2hlY2sgTERGTEFHUywgd2hpY2ggZG9lc24ndAorIyBzZWVtIHRvIGJlIGVudGlyZWx5IGNvcnJlY3QgdmFyaWFibGUgdG8gcHV0ICItZWxmMmZsdCIgaW50bykuCitXX0VMRjJGTFQgPSAtZWxmMmZsdAoraWZuZXEgKCwkKGZpbmRzdHJpbmcgJChXX0VMRjJGTFQpLCQoTERGTEFHUykgJChDRkxBR1NfYnVzeWJveCkpKQorU0tJUF9TVFJJUCA9IHkKK2VuZGlmCisKKyMgQnVzeWJveCBpcyBhIHN0YWNrLWZhdHR5IHNvIG1ha2Ugc3VyZSB3ZSBpbmNyZWFzZSBkZWZhdWx0IHNpemUKKyMgVE9ETzogdXNlICJtYWtlIHN0a3NpemVzIiB0byBmaW5kICYgZml4IGJpZyBzdGFjayB1c2VycworIyAod2Ugc3RvbGUgc2NyaXB0cy9jaGVja3N0YWNrLnBsIGZyb20gdGhlIGtlcm5lbC4uLiB0aGFua3MgZ3V5cyEpCisjIFJlZHVjZWQgZnJvbSAyMGsgdG8gMTZrIGluIDEuOS4wLgorRkxURkxBR1MgKz0gLXMgMTYwMDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL01ha2VmaWxlLmhlbHAgYi9idXN5Ym94LTEuMTkuMy9NYWtlZmlsZS5oZWxwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWRkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9NYWtlZmlsZS5oZWxwCkBAIC0wLDAgKzEsNDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGQgc3lzdGVtCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2hlbHA6CisJQGVjaG8gJ0NsZWFuaW5nOicKKwlAZWNobyAnICBjbGVhbgkJCS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIGJ5IGJ1aWxkJworCUBlY2hvICcgIGRpc3RjbGVhbgkJLSBkZWxldGUgYWxsIG5vbi1zb3VyY2UgZmlsZXMgKGluY2x1ZGluZyAuY29uZmlnKScKKwlAZWNobyAnICBkb2MtY2xlYW4JCS0gZGVsZXRlIGFsbCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicKKwlAZWNobworCUBlY2hvICdCdWlsZDonCisJQGVjaG8gJyAgYWxsCQkJLSBFeGVjdXRhYmxlIGFuZCBkb2N1bWVudGF0aW9uJworCUBlY2hvICcgIGJ1c3lib3gJCS0gdGhlIHN3aXNzLWFybXkgZXhlY3V0YWJsZScKKwlAZWNobyAnICBkb2MJCQktIGRvY3MvQnVzeUJveC57dHh0LGh0bWwsMX0nCisJQGVjaG8gJyAgaHRtbAkJCS0gY3JlYXRlIGh0bWwtYmFzZWQgY3Jvc3MtcmVmZXJlbmNlJworCUBlY2hvCisJQGVjaG8gJ0NvbmZpZ3VyYXRpb246JworCUBlY2hvICcgIGFsbG5vY29uZmlnCQktIGRpc2FibGUgYWxsIHN5bWJvbHMgaW4gLmNvbmZpZycKKwlAZWNobyAnICBhbGx5ZXNjb25maWcJCS0gZW5hYmxlIGFsbCBzeW1ib2xzIGluIC5jb25maWcgKHNlZSBkZWZjb25maWcpJworCUBlY2hvICcgIGNvbmZpZwkJLSB0ZXh0IGJhc2VkIGNvbmZpZ3VyYXRvciAob2YgbGFzdCByZXNvcnQpJworCUBlY2hvICcgIGRlZmNvbmZpZwkJLSBzZXQgLmNvbmZpZyB0byBsYXJnZXN0IGdlbmVyaWMgY29uZmlndXJhdGlvbicKKwlAZWNobyAnICBtZW51Y29uZmlnCQktIGludGVyYWN0aXZlIGN1cnNlcy1iYXNlZCBjb25maWd1cmF0b3InCisJQGVjaG8gJyAgb2xkY29uZmlnCQktIHJlc29sdmUgYW55IHVucmVzb2x2ZWQgc3ltYm9scyBpbiAuY29uZmlnJworCUBlY2hvICcgIGhvc3R0b29scyAgCQktIGJ1aWxkIHNlZCBmb3IgdGhlIGhvc3QuJworCUBlY2hvICcgIAkJCSAgWW91IGNhbiB1c2UgdGhlc2UgY29tbWFuZHMgaWYgdGhlIGNvbW1hbmRzIG9uIHRoZSBob3N0JworCUBlY2hvICcgIAkJCSAgaXMgdW51c2FibGUuIEFmdGVyd2FyZHMgdXNlIGl0IGxpa2U6JworCUBlY2hvICcgIAkJCSAgbWFrZSBTRUQ9IiQob2JqdHJlZSkvc2VkIicKKwlAJChpZiAkKGJvYXJkcyksIFwKKwkJJChmb3JlYWNoIGIsICQoYm9hcmRzKSwgXAorCQlwcmludGYgIiAgJS0yMXMgLSBCdWlsZCBmb3IgJXNcXG4iICQoYikgJChzdWJzdCBfZGVmY29uZmlnLCwkKGIpKTspIFwKKwkJZWNobyAnJykKKwlAZWNobworCUBlY2hvICdJbnN0YWxsYXRpb246JworCUBlY2hvICcgIGluc3RhbGwJCS0gaW5zdGFsbCBidXN5Ym94IGludG8gQ09ORklHX1BSRUZJWCcKKwlAZWNobyAnICB1bmluc3RhbGwnCisJQGVjaG8KKwlAZWNobyAnRGV2ZWxvcG1lbnQ6JworCUBlY2hvICcgIGJhc2VsaW5lCQktIGNyZWF0ZSBidXN5Ym94X29sZCBmb3IgYmxvYXRjaGVjay4nCisJQGVjaG8gJyAgYmxvYXRjaGVjawkJLSBzaG93IHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IHZlcnNpb25zJworCUBlY2hvICcgIGNoZWNrCQkJLSBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIGFsbCBhcHBsZXRzJworCUBlY2hvICcgIGNoZWNraGVscAkJLSBjaGVjayBmb3IgbWlzc2luZyBoZWxwLWVudHJpZXMgaW4gQ29uZmlnLmluJworCUBlY2hvICcgIHJhbmRjb25maWcJCS0gZ2VuZXJhdGUgYSByYW5kb20gY29uZmlndXJhdGlvbicKKwlAZWNobyAnICByZWxlYXNlCQktIGNyZWF0ZSBhIGRpc3RyaWJ1dGlvbiB0YXJiYWxsJworCUBlY2hvICcgIHNpemVzCQkJLSBzaG93IHNpemUgb2YgYWxsIGVuYWJsZWQgYnVzeWJveCBzeW1ib2xzJworCUBlY2hvICcgIG9ianNpemVzCQktIHNob3cgc2l6ZSBvZiBlYWNoIC5vIG9iamVjdCBidWlsdCcKKwlAZWNobyAnICBiaWdkYXRhCQktIHNob3cgZGF0YSBvYmplY3RzLCBiaWdnZXN0IGZpcnN0JworCUBlY2hvICcgIHN0a3NpemVzCQktIHNob3cgc3RhY2sgdXNlcnMsIGJpZ2dlc3QgZmlyc3QnCisJQGVjaG8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL1JFQURNRSBiL2J1c3lib3gtMS4xOS4zL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQwZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvUkVBRE1FCkBAIC0wLDAgKzEsMjA0IEBACitQbGVhc2Ugc2VlIHRoZSBMSUNFTlNFIGZpbGUgZm9yIGRldGFpbHMgb24gY29weWluZyBhbmQgdXNhZ2UuCitQbGVhc2UgcmVmZXIgdG8gdGhlIElOU1RBTEwgZmlsZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBidWlsZC4KKworV2hhdCBpcyBidXN5Ym94OgorCisgIEJ1c3lCb3ggY29tYmluZXMgdGlueSB2ZXJzaW9ucyBvZiBtYW55IGNvbW1vbiBVTklYIHV0aWxpdGllcyBpbnRvIGEgc2luZ2xlCisgIHNtYWxsIGV4ZWN1dGFibGUuICBJdCBwcm92aWRlcyBtaW5pbWFsaXN0IHJlcGxhY2VtZW50cyBmb3IgbW9zdCBvZiB0aGUKKyAgdXRpbGl0aWVzIHlvdSB1c3VhbGx5IGZpbmQgaW4gYnppcDIsIGNvcmV1dGlscywgZGhjcCwgZGlmZnV0aWxzLCBlMmZzcHJvZ3MsCisgIGZpbGUsIGZpbmR1dGlscywgZ2F3aywgZ3JlcCwgaW5ldHV0aWxzLCBsZXNzLCBtb2R1dGlscywgbmV0LXRvb2xzLCBwcm9jcHMsCisgIHNlZCwgc2hhZG93LCBzeXNrbG9nZCwgc3lzdmluaXQsIHRhciwgdXRpbC1saW51eCwgYW5kIHZpbS4gIFRoZSB1dGlsaXRpZXMKKyAgaW4gQnVzeUJveCBvZnRlbiBoYXZlIGZld2VyIG9wdGlvbnMgdGhhbiB0aGVpciBmdWxsLWZlYXR1cmVkIGNvdXNpbnM7CisgIGhvd2V2ZXIsIHRoZSBvcHRpb25zIHRoYXQgYXJlIGluY2x1ZGVkIHByb3ZpZGUgdGhlIGV4cGVjdGVkIGZ1bmN0aW9uYWxpdHkKKyAgYW5kIGJlaGF2ZSB2ZXJ5IG11Y2ggbGlrZSB0aGVpciBsYXJnZXIgY291bnRlcnBhcnRzLgorCisgIEJ1c3lCb3ggaGFzIGJlZW4gd3JpdHRlbiB3aXRoIHNpemUtb3B0aW1pemF0aW9uIGFuZCBsaW1pdGVkIHJlc291cmNlcyBpbgorICBtaW5kLCBib3RoIHRvIHByb2R1Y2Ugc21hbGwgYmluYXJpZXMgYW5kIHRvIHJlZHVjZSBydW4tdGltZSBtZW1vcnkgdXNhZ2UuCisgIEJ1c3lib3ggaXMgYWxzbyBleHRyZW1lbHkgbW9kdWxhciBzbyB5b3UgY2FuIGVhc2lseSBpbmNsdWRlIG9yIGV4Y2x1ZGUKKyAgY29tbWFuZHMgKG9yIGZlYXR1cmVzKSBhdCBjb21waWxlIHRpbWUuICBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gY3VzdG9taXplCisgIGVtYmVkZGVkIHN5c3RlbXM7IHRvIGNyZWF0ZSBhIHdvcmtpbmcgc3lzdGVtLCBqdXN0IGFkZCAvZGV2LCAvZXRjLCBhbmQgYQorICBMaW51eCBrZXJuZWwuICBCdXN5Ym94ICh1c3VhbGx5IHRvZ2V0aGVyIHdpdGggdUNsaWJjKSBoYXMgYWxzbyBiZWVuIHVzZWQgYXMKKyAgYSBjb21wb25lbnQgb2YgInRoaW4gY2xpZW50IiBkZXNrdG9wIHN5c3RlbXMsIGxpdmUtQ0QgZGlzdHJpYnV0aW9ucywgcmVzY3VlCisgIGRpc2tzLCBpbnN0YWxsZXJzLCBhbmQgc28gb24uCisKKyAgQnVzeUJveCBwcm92aWRlcyBhIGZhaXJseSBjb21wbGV0ZSBQT1NJWCBlbnZpcm9ubWVudCBmb3IgYW55IHNtYWxsIHN5c3RlbSwKKyAgYm90aCBlbWJlZGRlZCBlbnZpcm9ubWVudHMgYW5kIG1vcmUgZnVsbCBmZWF0dXJlZCBzeXN0ZW1zIGNvbmNlcm5lZCBhYm91dAorICBzcGFjZS4gIEJ1c3lib3ggaXMgc2xvd2x5IHdvcmtpbmcgdG93YXJkcyBpbXBsZW1lbnRpbmcgdGhlIGZ1bGwgU2luZ2xlIFVuaXgKKyAgU3BlY2lmaWNhdGlvbiBWMyAoaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5LyksIGJ1dCBpc24ndAorICB0aGVyZSB5ZXQgKGFuZCBmb3Igc2l6ZSByZWFzb25zIHdpbGwgcHJvYmFibHkgc3VwcG9ydCBhdCBtb3N0IFVURi04IGZvcgorICBpbnRlcm5hdGlvbmFsaXphdGlvbikuICBXZSBhcmUgYWxzbyBpbnRlcmVzdGVkIGluIHBhc3NpbmcgdGhlIExpbnV4IFRlc3QKKyAgUHJvamVjdCAoaHR0cDovL2x0cC5zb3VyY2Vmb3JnZS5uZXQpLgorCistLS0tLS0tLS0tLS0tLS0tCisKK1VzaW5nIGJ1c3lib3g6CisKKyAgQnVzeUJveCBpcyBleHRyZW1lbHkgY29uZmlndXJhYmxlLiAgVGhpcyBhbGxvd3MgeW91IHRvIGluY2x1ZGUgb25seSB0aGUKKyAgY29tcG9uZW50cyBhbmQgb3B0aW9ucyB5b3UgbmVlZCwgdGhlcmVieSByZWR1Y2luZyBiaW5hcnkgc2l6ZS4gIFJ1biAnbWFrZQorICBjb25maWcnIG9yICdtYWtlIG1lbnVjb25maWcnIHRvIHNlbGVjdCB0aGUgZnVuY3Rpb25hbGl0eSB0aGF0IHlvdSB3aXNoIHRvCisgIGVuYWJsZS4gIChTZWUgJ21ha2UgaGVscCcgZm9yIG1vcmUgY29tbWFuZHMuKQorCisgIFRoZSBiZWhhdmlvciBvZiBidXN5Ym94IGlzIGRldGVybWluZWQgYnkgdGhlIG5hbWUgaXQncyBjYWxsZWQgdW5kZXI6IGFzCisgICJjcCIgaXQgYmVoYXZlcyBsaWtlIGNwLCBhcyAic2VkIiBpdCBiZWhhdmVzIGxpa2Ugc2VkLCBhbmQgc28gb24uICBDYWxsZWQKKyAgYXMgImJ1c3lib3giIGl0IHRha2VzIHRoZSBzZWNvbmQgYXJndW1lbnQgYXMgdGhlIG5hbWUgb2YgdGhlIGFwcGxldCB0bworICBydW4gKEkuRS4gIi4vYnVzeWJveCBscyAtbCAvcHJvYyIpLgorCisgIFRoZSAic3RhbmRhbG9uZSBzaGVsbCIgbW9kZSBpcyBhbiBlYXN5IHdheSB0byB0cnkgb3V0IGJ1c3lib3g7IHRoaXMgaXMgYQorICBjb21tYW5kIHNoZWxsIHRoYXQgY2FsbHMgdGhlIGJ1aWx0LWluIGFwcGxldHMgd2l0aG91dCBuZWVkaW5nIHRoZW0gdG8gYmUKKyAgaW5zdGFsbGVkIGluIHRoZSBwYXRoLiAgKE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIC9wcm9jIHRvIGJlIG1vdW50ZWQsIGlmCisgIHRlc3RpbmcgZnJvbSBhIGJvb3QgZmxvcHB5IG9yIGluIGEgY2hyb290IGVudmlyb25tZW50LikKKworICBUaGUgYnVpbGQgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgYSBmaWxlICJidXN5Ym94LmxpbmtzIiwgd2hpY2ggaXMgdXNlZCBieQorICAnbWFrZSBpbnN0YWxsJyB0byBjcmVhdGUgc3ltbGlua3MgdG8gdGhlIEJ1c3lCb3ggYmluYXJ5IGZvciBhbGwgY29tcGlsZWQgaW4KKyAgY29tbWFuZHMuICBUaGlzIHVzZXMgdGhlIENPTkZJR19QUkVGSVggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc3BlY2lmeQorICB3aGVyZSB0byBpbnN0YWxsLCBhbmQgaW5zdGFsbHMgaGFyZGxpbmtzIG9yIHN5bWxpbmtzIGRlcGVuZGluZworICBvbiB0aGUgY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlcy4gIChZb3UgY2FuIGFsc28gbWFudWFsbHkgcnVuCisgIHRoZSBpbnN0YWxsIHNjcmlwdCBhdCAiYXBwbGV0cy9pbnN0YWxsLnNoIikuCisKKy0tLS0tLS0tLS0tLS0tLS0KKworRG93bmxvYWRpbmcgdGhlIGN1cnJlbnQgc291cmNlIGNvZGU6CisKKyAgU291cmNlIGZvciB0aGUgbGF0ZXN0IHJlbGVhc2VkIHZlcnNpb24sIGFzIHdlbGwgYXMgZGFpbHkgc25hcHNob3RzLCBjYW4gYWx3YXlzCisgIGJlIGRvd25sb2FkZWQgZnJvbQorCisgICAgaHR0cDovL2J1c3lib3gubmV0L2Rvd25sb2Fkcy8KKworICBZb3UgY2FuIGJyb3dzZSB0aGUgdXAgdG8gdGhlIG1pbnV0ZSBzb3VyY2UgY29kZSBhbmQgY2hhbmdlIGhpc3Rvcnkgb25saW5lLgorCisgICAgaHR0cDovL2dpdC5idXN5Ym94Lm5ldC9idXN5Ym94LworCisgIEFub255bW91cyBHSVQgYWNjZXNzIGlzIGF2YWlsYWJsZS4gIEZvciBpbnN0cnVjdGlvbnMsIGNoZWNrIG91dDoKKworICAgIGh0dHA6Ly93d3cuYnVzeWJveC5uZXQvc291cmNlLmh0bWwKKworICBGb3IgdGhvc2UgdGhhdCBhcmUgYWN0aXZlbHkgY29udHJpYnV0aW5nIGFuZCB3b3VsZCBsaWtlIHRvIGNoZWNrIGZpbGVzIGluLAorICBzZWU6CisKKyAgICBodHRwOi8vYnVzeWJveC5uZXQvZGV2ZWxvcGVyLmh0bWwKKworICBUaGUgZGV2ZWxvcGVycyBhbHNvIGhhdmUgYSBidWcgYW5kIHBhdGNoIHRyYWNraW5nIHN5c3RlbQorICAoaHR0cHM6Ly9idWdzLmJ1c3lib3gubmV0KSBhbHRob3VnaCBwb3N0aW5nIGEgYnVnL3BhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QKKyAgaXMgZ2VuZXJhbGx5IGEgZmFzdGVyIHdheSBvZiBnZXR0aW5nIGl0IGZpeGVkLCBhbmQgdGhlIGNvbXBsZXRlIGFyY2hpdmUgb2YKKyAgd2hhdCBoYXBwZW5lZCBpcyB0aGUgZ2l0IGNoYW5nZWxvZy4KKworICBOb3RlOiBpZiB5b3Ugd2FudCB0byBjb21waWxlIGJ1c3lib3ggaW4gYSBidXN5Ym94IGVudmlyb25tZW50IHlvdSBtdXN0CisgIHNlbGVjdCBDT05GSUdfREVTS1RPUC4KKworLS0tLS0tLS0tLS0tLS0tLQorCitHZXR0aW5nIGhlbHA6CisKKyAgd2hlbiB5b3UgZmluZCB5b3UgbmVlZCBoZWxwLCB5b3UgY2FuIGNoZWNrIG91dCB0aGUgYnVzeWJveCBtYWlsaW5nIGxpc3QKKyAgYXJjaGl2ZXMgYXQgaHR0cDovL2J1c3lib3gubmV0L2xpc3RzL2J1c3lib3gvIG9yIGV2ZW4gam9pbgorICB0aGUgbWFpbGluZyBsaXN0IGlmIHlvdSBhcmUgaW50ZXJlc3RlZC4KKworLS0tLS0tLS0tLS0tLS0tLQorCitCdWdzOgorCisgIGlmIHlvdSBmaW5kIGJ1Z3MsIHBsZWFzZSBzdWJtaXQgYSBkZXRhaWxlZCBidWcgcmVwb3J0IHRvIHRoZSBidXN5Ym94IG1haWxpbmcKKyAgbGlzdCBhdCBidXN5Ym94QGJ1c3lib3gubmV0LiAgYSB3ZWxsLXdyaXR0ZW4gYnVnIHJlcG9ydCBzaG91bGQgaW5jbHVkZSBhCisgIHRyYW5zY3JpcHQgb2YgYSBzaGVsbCBzZXNzaW9uIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBiYWQgYmVoYXZpb3IgYW5kIGVuYWJsZXMKKyAgYW55b25lIGVsc2UgdG8gZHVwbGljYXRlIHRoZSBidWcgb24gdGhlaXIgb3duIG1hY2hpbmUuIHRoZSBmb2xsb3dpbmcgaXMgc3VjaAorICBhbiBleGFtcGxlOgorCisgICAgdG86IGJ1c3lib3hAYnVzeWJveC5uZXQKKyAgICBmcm9tOiBkaWxpZ2VudEB0ZXN0aW5nLmxpbnV4Lm9yZworICAgIHN1YmplY3Q6IC9iaW4vZGF0ZSBkb2Vzbid0IHdvcmsKKworICAgIHBhY2thZ2U6IGJ1c3lib3gKKyAgICB2ZXJzaW9uOiAxLjAwCisKKyAgICB3aGVuIGkgZXhlY3V0ZSBidXN5Ym94ICdkYXRlJyBpdCBwcm9kdWNlcyB1bmV4cGVjdGVkIHJlc3VsdHMuCisgICAgd2l0aCBnbnUgZGF0ZSBpIGdldCB0aGUgZm9sbG93aW5nIG91dHB1dDoKKworCSQgZGF0ZQorCWZyaSBvY3QgIDggMTQ6MTk6NDEgbWR0IDIwMDQKKworICAgIGJ1dCB3aGVuIGkgdXNlIGJ1c3lib3ggZGF0ZSBpIGdldCB0aGlzIGluc3RlYWQ6CisKKwkkIGRhdGUKKwlpbGxlZ2FsIGluc3RydWN0aW9uCisKKyAgICBpIGFtIHVzaW5nIGRlYmlhbiB1bnN0YWJsZSwga2VybmVsIHZlcnNpb24gMi40LjI1LXZyczIgb24gYSBuZXR3aW5kZXIsCisgICAgYW5kIHRoZSBsYXRlc3QgdWNsaWJjIGZyb20gY3ZzLgorCisJLWRpbGlnZW50CisKKyAgbm90ZSB0aGUgY2FyZWZ1bCBkZXNjcmlwdGlvbiBhbmQgdXNlIG9mIGV4YW1wbGVzIHNob3dpbmcgbm90IG9ubHkgd2hhdAorICBidXN5Ym94IGRvZXMsIGJ1dCBhbHNvIGEgY291bnRlciBleGFtcGxlIHNob3dpbmcgd2hhdCBhbiBlcXVpdmFsZW50IGFwcAorICBkb2VzIChvciBwb2ludGluZyB0byB0aGUgdGV4dCBvZiBhIHJlbGV2YW50IHN0YW5kYXJkKS4gIEJ1ZyByZXBvcnRzIGxhY2tpbmcKKyAgc3VjaCBkZXRhaWwgbWF5IG5ldmVyIGJlIGZpeGVkLi4uICBUaGFua3MgZm9yIHVuZGVyc3RhbmRpbmcuCisKKy0tLS0tLS0tLS0tLS0tLS0KKworUG9ydGFiaWxpdHk6CisKKyAgQnVzeWJveCBpcyBkZXZlbG9wZWQgYW5kIHRlc3RlZCBvbiBMaW51eCAyLjQgYW5kIDIuNiBrZXJuZWxzLCBjb21waWxlZAorICB3aXRoIGdjYyAodGhlIHVuaXQtYXQtYS10aW1lIG9wdGltaXphdGlvbnMgaW4gdmVyc2lvbiAzLjQgYW5kIGxhdGVyIGFyZQorICB3b3J0aCB1cGdyYWRpbmcgdG8gZ2V0LCBidXQgb2xkZXIgdmVyc2lvbnMgc2hvdWxkIHdvcmspLCBhbmQgbGlua2VkIGFnYWluc3QKKyAgdUNsaWJjICgwLjkuMjcgb3IgZ3JlYXRlcikgb3IgZ2xpYmMgKDIuMiBvciBncmVhdGVyKS4gIEluIHN1Y2ggYW4KKyAgZW52aXJvbm1lbnQsIHRoZSBmdWxsIHNldCBvZiBidXN5Ym94IGZlYXR1cmVzIHNob3VsZCB3b3JrLCBhbmQgaWYKKyAgYW55dGhpbmcgZG9lc24ndCB3ZSB3YW50IHRvIGtub3cgYWJvdXQgaXQgc28gd2UgY2FuIGZpeCBpdC4KKworICBUaGVyZSBhcmUgbWFueSBvdGhlciBlbnZpcm9ubWVudHMgb3V0IHRoZXJlLCBpbiB3aGljaCBidXN5Ym94IG1heSBidWlsZAorICBhbmQgcnVuIGp1c3QgZmluZS4gIFdlIGp1c3QgZG9uJ3QgdGVzdCB0aGVtLiAgU2luY2UgYnVzeWJveCBjb25zaXN0cyBvZiBhCisgIGxhcmdlIG51bWJlciBvZiBtb3JlIG9yIGxlc3MgaW5kZXBlbmRlbnQgYXBwbGV0cywgcG9ydGFiaWxpdHkgaXMgYSBxdWVzdGlvbgorICBvZiB3aGljaCBmZWF0dXJlcyB3b3JrIHdoZXJlLiAgU29tZSBidXN5Ym94IGFwcGxldHMgKHN1Y2ggYXMgY2F0IGFuZCBybSkgYXJlCisgIGhpZ2hseSBwb3J0YWJsZSBhbmQgbGlrZWx5IHRvIHdvcmsganVzdCBhYm91dCBhbnl3aGVyZSwgd2hpbGUgb3RoZXJzIChzdWNoIGFzCisgIGluc21vZCBhbmQgbG9zZXR1cCkgcmVxdWlyZSByZWNlbnQgTGludXgga2VybmVscyB3aXRoIHJlY2VudCBDIGxpYnJhcmllcy4KKworICBFYXJsaWVyIHZlcnNpb25zIG9mIExpbnV4IGFuZCBnbGliYyBtYXkgb3IgbWF5IG5vdCB3b3JrLCBmb3IgYW55IGdpdmVuCisgIGNvbmZpZ3VyYXRpb24uICBMaW51eCAyLjIgb3IgZWFybGllciBzaG91bGQgbW9zdGx5IHdvcmsgKHRoZXJlJ3Mgc3RpbGwKKyAgc29tZSBzdXBwb3J0IGNvZGUgaW4gdGhpbmdzIGxpa2UgbW91bnQuYykgYnV0IHRoaXMgaXMgbm8gbG9uZ2VyIHJlZ3VsYXJseQorICB0ZXN0ZWQsIGFuZCBpbmhlcmVudGx5IHdvbid0IHN1cHBvcnQgY2VydGFpbiBmZWF0dXJlcyAoc3VjaCBhcyBsb25nIGZpbGVzCisgIGFuZCAtLWJpbmQgbW91bnRzKS4gIFRoZSBzYW1lIGlzIHRydWUgZm9yIGdsaWJjIDIuMCBhbmQgMi4xOiBleHBlY3QgYSBoaWdoZXIKKyAgdGVzdGluZyBhbmQgZGVidWdnaW5nIGJ1cmRlbiB1c2luZyBzdWNoIG9sZCBpbmZyYXN0cnVjdHVyZS4gIChUaGUgYnVzeWJveAorICBkZXZlbG9wZXJzIGFyZSBub3QgdmVyeSBpbnRlcmVzdGVkIGluIHN1cHBvcnRpbmcgdGhlc2Ugb2xkZXIgdmVyc2lvbnMsIGJ1dAorICB3aWxsIHByb2JhYmx5IGFjY2VwdCBzbWFsbCBzZWxmLWNvbnRhaW5lZCBwYXRjaGVzIHRvIGZpeCBzaW1wbGUgcHJvYmxlbXMuKQorCisgIFNvbWUgZW52aXJvbm1lbnRzIGFyZSBub3QgcmVjb21tZW5kZWQuICBFYXJseSB2ZXJzaW9ucyBvZiB1Q2xpYmMgd2VyZSBidWdneQorICBhbmQgbWlzc2luZyBtYW55IGZlYXR1cmVzOiB1cGdyYWRlLiAgTGlua2luZyBhZ2FpbnN0IGxpYmM1IG9yIGRpZXRsaWJjIGlzCisgIG5vdCBzdXBwb3J0ZWQgYW5kIG5vdCBpbnRlcmVzdGluZyB0byB0aGUgYnVzeWJveCBkZXZlbG9wZXJzLiAgKFRoZSBmaXJzdCBpcworICBvYnNvbGV0ZSBhbmQgaGFzIG5vIGtub3duIHNpemUgb3IgZmVhdHVyZSBhZHZhbnRhZ2VzIG92ZXIgdUNsaWJjLCB0aGUgc2Vjb25kCisgIGhhcyBrbm93biBidWdzIHRoYXQgaXRzIGRldmVsb3BlcnMgaGF2ZSBhY3RpdmVseSByZWZ1c2VkIHRvIGZpeC4pICBBbmNpZW50CisgIExpbnV4IGtlcm5lbHMgKDIuMC54IGFuZCBlYXJsaWVyKSBhcmUgc2ltaWxhcmx5IHVuaW50ZXJlc3RpbmcuCisKKyAgSW4gdGhlb3J5IGl0J3MgcG9zc2libGUgdG8gdXNlIEJ1c3lib3ggdW5kZXIgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgKHN1Y2ggYXMKKyAgTWFjT1MgWCwgU29sYXJpcywgQ3lnd2luLCBvciB0aGUgQlNEIEZvcmsgRHUgSm91cikuICBUaGlzIGdlbmVyYWxseSBpbnZvbHZlcworICBhIGRpZmZlcmVudCBrZXJuZWwgYW5kIGEgZGlmZmVyZW50IEMgbGlicmFyeSBhdCB0aGUgc2FtZSB0aW1lLiAgV2hpbGUgaXQKKyAgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHBvcnQgdGhlIG1ham9yaXR5IG9mIHRoZSBjb2RlIHRvIHdvcmsgaW4gb25lIG9mCisgIHRoZXNlIGVudmlyb25tZW50cywgZG9uJ3QgYmUgc3VycHJpc2VkIGlmIGl0IGRvZXNuJ3Qgd29yayBvdXQgb2YgdGhlIGJveC4gIElmCisgIHlvdSdyZSBpbnRvIHRoYXQgc29ydCBvZiB0aGluZywgc3RhcnQgc21hbGwgKHNlbGVjdGluZyBqdXN0IGEgZmV3IGFwcGxldHMpCisgIGFuZCB3b3JrIHlvdXIgd2F5IHVwLgorCisgIEluIDIwMDUgU2hhdW4gSmFja21hbiBoYXMgcG9ydGVkIGJ1c3lib3ggdG8gYSBjb21iaW5hdGlvbiBvZiBuZXdsaWIKKyAgYW5kIGxpYmdsb3NzLCBhbmQgc29tZSBvZiBoaXMgcGF0Y2hlcyBoYXZlIGJlZW4gaW50ZWdyYXRlZC4KKworU3VwcG9ydGVkIGhhcmR3YXJlOgorCisgIEJ1c3lCb3ggaW4gZ2VuZXJhbCB3aWxsIGJ1aWxkIG9uIGFueSBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkIGJ5IGdjYy4gIFdlCisgIHN1cHBvcnQgYm90aCAzMiBhbmQgNjQgYml0IHBsYXRmb3JtcywgYW5kIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuCisgIHN5c3RlbXMuCisKKyAgVW5kZXIgMi40IExpbnV4IGtlcm5lbHMsIGtlcm5lbCBtb2R1bGUgbG9hZGluZyB3YXMgaW1wbGVtZW50ZWQgaW4gYQorICBwbGF0Zm9ybS1zcGVjaWZpYyBtYW5uZXIuICBCdXN5Ym94J3MgaW5zbW9kIHV0aWxpdHkgaGFzIGJlZW4gcmVwb3J0ZWQgdG8KKyAgd29yayB1bmRlciBBUk0sIENSSVMsIEg4LzMwMCwgeDg2LCBpYTY0LCB4ODZfNjQsIG02OGssIE1JUFMsIFBvd2VyUEMsIFMzOTAsCisgIFNIMy80LzUsIFNwYXJjLCB2ODUwZSwgYW5kIHg4Nl82NC4gIEFueXRoaW5nIGVsc2UgcHJvYmFibHkgd29uJ3Qgd29yay4KKworICBUaGUgbW9kdWxlIGxvYWRpbmcgbWVjaGFuaXNtIGZvciB0aGUgMi42IGtlcm5lbCBpcyBtdWNoIG1vcmUgZ2VuZXJpYywgYW5kCisgIHdlIGJlbGlldmUgMi42Lngga2VybmVsIG1vZHVsZSBsb2FkaW5nIHN1cHBvcnQgc2hvdWxkIHdvcmsgb24gYWxsCisgIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwuCisKKy0tLS0tLS0tLS0tLS0tLS0KKworUGxlYXNlIGZlZWQgc3VnZ2VzdGlvbnMsIGJ1ZyByZXBvcnRzLCBpbnN1bHRzLCBhbmQgYnJpYmVzIGJhY2sgdG8gdGhlIGJ1c3lib3gKK21haWxpbmcgbGlzdDoKKworCWJ1c3lib3hAYnVzeWJveC5uZXQKKworYW5kL29yIG1haW50YWluZXI6CisKKwlEZW55cyBWbGFzZW5rbworCTx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9UT0RPIGIvYnVzeWJveC0xLjE5LjMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjlmODdmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvVE9ETwpAQCAtMCwwICsxLDI3NiBAQAorQnVzeWJveCBUT0RPCisKK0hhcnZlc3QgcGF0Y2hlcyBmcm9tCitodHRwOi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvY2dpdC5jZ2kvb3BlbmVtYmVkZGVkL3RyZWUvcmVjaXBlcy9idXN5Ym94LworCitTdHVmZiB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuICBUaGlzIGlzIG9yZ2FuaXplZCBieSB3aG8gcGxhbnMgdG8gZ2V0IGFyb3VuZCB0bworZG9pbmcgaXQgZXZlbnR1YWxseSwgYnV0IHRoYXQgZG9lc24ndCBtZWFuIHRoZXkgIm93biIgdGhlIGl0ZW0uICBJZiB5b3Ugd2FudCB0bworZG8gb25lIG9mIHRoZXNlIGJvdW5jZSBhbiBlbWFpbCBvZmYgdGhlIHBlcnNvbiBpdCdzIGxpc3RlZCB1bmRlciB0byBzZWUgaWYgdGhleQoraGF2ZSBhbnkgc3VnZ2VzdGlvbnMgaG93IHRoZXkgcGxhbiB0byBnbyBhYm91dCBpdCwgYW5kIHRvIG1pbmltaXplIGNvbmZsaWN0cworYmV0d2VlbiB5b3VyIHdvcmsgYW5kIHRoZWlycy4gIEJ1dCBvdGhlcndpc2UsIGFsbCBvZiB0aGVzZSBhcmUgZmFpciBnYW1lLgorCitSb2IgTGFuZGxleSBzdWdnZXN0ZWQgdGhpczoKKyAgSW1wbGVtZW50IGJiX3JlYWxwYXRoKCkgdGhhdCBjYW4gaGFuZGxlIE5VTEwgb24gbm9uLWdsaWJjLgorCisgIHNoCisgICAgVGhlIGNvbW1hbmQgc2hlbGwgc2l0dWF0aW9uIGlzIGEgbWVzcy4gIFdlIGhhdmUgdHdvIGRpZmZlcmVudAorICAgIHNoZWxscyB0aGF0IGRvbid0IHJlYWxseSBzaGFyZSBhbnkgY29kZSwgYW5kIHRoZSAic3RhbmRhbG9uZSBzaGVsbCIgZG9lc24ndAorICAgIHdvcmsgYWxsIHRoYXQgd2VsbCAoZXNwZWNpYWxseSBub3QgaW4gYSBjaHJvb3QgZW52aXJvbm1lbnQpLCBkdWUgdG8gYXBwcyBub3QKKyAgICBiZWluZyByZWVudHJhbnQuCisKKyAgRG8gYSBTVVN2MyBhdWRpdAorICAgIExvb2sgYXQgdGhlIGZ1bGwgU2luZ2xlIFVuaXggU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDMgKGF2YWlsYWJsZSBvbmxpbmUgYXQKKyAgICAiaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L25maW5kZXguaHRtbCIpIGFuZAorICAgIGZpZ3VyZSBvdXQgd2hpY2ggb2Ygb3VyIGFwcHMgYXJlIGNvbXBsaWFudCwgYW5kIHdoYXQgd2UncmUgbWlzc2luZyB0aGF0CisgICAgd2UgbWlnaHQgYWN0dWFsbHkgY2FyZSBhYm91dC4KKworICAgIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIHNvbWUga2luZCBvZiBhdXRvbWF0ZWQgY29tcGxpYW5jZSB0ZXN0IGhhcm5lc3MgdGhhdAorICAgIGV4ZXJjaXNlcyBlYWNoIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIHRoZSB2YXJpb3VzIGNvcm5lciBjYXNlcy4KKworICBJbnRlcm5hdGlvbmFsaXphdGlvbgorICAgIEhvdyBtdWNoIGludGVybmF0aW9uYWxpemF0aW9uIHNob3VsZCB3ZSBkbz8KKworICAgIFRoZSBsb3cgaGFuZ2luZyBmcnVpdCBpcyBVVEYtOCBjaGFyYWN0ZXIgc2V0IHN1cHBvcnQuICBXZSBzaG91bGQgZG8gdGhpcy4KKyAgICBTZWUgVE9ET191bmljb2RlIGZpbGUuCisKKyAgICBXZSBhbHNvIGhhdmUgbG90cyBvZiBoYXJkd2lyZWQgZW5nbGlzaCB0ZXh0IG1lc3NhZ2VzLiAgQ29uc29saWRhdGluZyB0aGlzCisgICAgaW50byBzb21lIGtpbmQgb2YgbWVzc2FnZSB0YWJsZSBub3Qgb25seSBtYWtlcyB0cmFuc2xhdGlvbiBlYXNpZXIsIGJ1dAorICAgIGFsc28gYWxsb3dzIHVzIHRvIGNvbnNvbGlkYXRlIHJlZHVuZGFudCAob3IgY2xvc2UpIHN0cmluZ3MuCisKKyAgICBXZSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGJlIGJsb2F0ZWQgd2l0aCBsb2NhbGUgc3VwcG9ydC4gIChOb3QgdW5sZXNzIHdlCisgICAgY2FuIGNsZWFubHkgZXhwb3J0IGl0IGZyb20gb3VyIHVuZGVybHlpbmcgQyBsaWJyYXJ5IHdpdGhvdXQgaGF2aW5nIHRvCisgICAgY29uY2VybiBvdXJzZWx2ZXMgd2l0aCBpdCBkaXJlY3RseS4gIFBlcmhhcHMgYSBmZXcgc3BlY2lmaWMgdGhpbmdzIGxpa2UgYQorICAgIGNvbmZpZyBvcHRpb24gZm9yICJkYXRlIiBhcmUgbG93IGhhbmdpbmcgZnJ1aXQgaGVyZT8pCisKKyAgICBXaGF0IGxldmVsIHNob3VsZCB0aGluZ3MgaGFwcGVuIGF0PyAgSG93IG11Y2ggZG8gd2UgY2FyZSBhYm91dAorICAgIGludGVybmF0aW9uYWxpemluZyB0aGUgdGV4dCBjb25zb2xlIHdoZW4gWDExIGFuZCB4dGVybXMgYXJlIHNvIG11Y2ggYmV0dGVyCisgICAgYXQgaXQ/ICAoVGhlcmUncyBzb21lIGluZnJhc3RydWN0dXJlIGhlcmUgd2UgZG9uJ3QgaW1wbGVtZW50OiBUaGUKKyAgICAidW5pY29kZV9zdGFydCIgYW5kICJ1bmljb2RlX3N0b3AiIHNoZWxsIHNjcmlwdHMgbmVlZCAidnQtaXMtVVRGOCIgYW5kIGEKKyAgICAtLXVuaWNvZGUgb3B0aW9uIHRvIGxvYWRrZXlzLiAgVGhhdCBpbXBsaWVzIGEgcmVhbCBsb2Fka2V5cy9kdW1wa2V5cworICAgIGltcGxlbWVudGF0aW9uIHRvIHJlcGxhY2UgbG9hZGttYXAvZHVtcGttYXAuICBQbHVzIG1lc3Npbmcgd2l0aCBjb25zb2xlIGZvbnQKKyAgICBsb2FkaW5nLiAgSXMgaXQgd29ydGggaXQsIG9yIGRvIHdlIGp1c3Qgc2F5ICJ1c2UgWCI/KQorCisgIEluZGl2aWR1YWwgY29tcGlsYXRpb24gb2YgYXBwbGV0cy4KKyAgICBJdCB3b3VsZCBiZSBuaWNlIGlmIGJ1c3lib3ggaGFkIHRoZSBvcHRpb24gdG8gY29tcGlsZSB0byBpbmRpdmlkdWFsIGFwcGxldHMsCisgICAgZm9yIHBlb3BsZSB3aG8gd2FudCBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gbGVzcyBibG9hdGVkIHRoYW4gdGhlIGdudQorICAgIHV0aWxzIChvciBzaW1wbHkgd2l0aCBsZXNzIHBvbGl0aWNhbCBiYWdnYWdlKSwgYnV0IHdpdGhvdXQgaXQgYmVpbmcgb25lIGJpZworICAgIGV4ZWN1dGFibGUuCisKKyAgICBUdXJuaW5nIGxpYmJiIGludG8gYSByZWFsIGRsbCBpcyBhbm90aGVyIHBvc3NpYmlsaXR5LCBlc3BlY2lhbGx5IGlmIGxpYmJiCisgICAgY291bGQgZXhwb3J0IHNvbWUgb2YgdGhlIG90aGVyIGxpYnJhcnkgaW50ZXJmYWNlcyB3ZSd2ZSBhbHJlYWR5IG1vcmUgb3IgbGVzcworICAgIGdvdCB0aGUgY29kZSBmb3IgKGxpa2UgemxpYikuCisKKyAgYnVpbGRyb290IC0gTWFrZSBhICJkb2dmb29kIiBvcHRpb24KKyAgICBCdXN5Ym94IDEuMSB3aWxsIGJlIGNhcGFibGUgb2YgcmVwbGFjaW5nIG1vc3QgZ251IHBhY2thZ2VzIGZvciByZWFsIHdvcmxkCisgICAgdXNlLCBzdWNoIGFzIGRldmVsb3Bpbmcgc29mdHdhcmUgb3IgaW4gYSBsaXZlIENELiAgSXQgbmVlZHMgd2lkZXIgdGVzdGluZy4KKworICAgIEJ1c3lib3ggc2hvdWxkIG5vdyBiZSBhYmxlIHRvIHJlcGxhY2UgYnppcDIsIGNvcmV1dGlscywgZTJmc3Byb2dzLCBmaWxlLAorICAgIGZpbmR1dGlscywgZ2F3aywgZ3JlcCwgaW5ldHV0aWxzLCBsZXNzLCBtb2R1dGlscywgbmV0LXRvb2xzLCBwYXRjaCwgcHJvY3BzLAorICAgIHNlZCwgc2hhZG93LCBzeXNrbG9nZCwgc3lzdmluaXQsIHRhciwgdXRpbC1saW51eCwgYW5kIHZpbS4gIFRoZSByZXN1bHRpbmcKKyAgICBzeXN0ZW0gc2hvdWxkIGJlIHNlbGYtaG9zdGluZyAoSS5FLiBhYmxlIHRvIHJlYnVpbGQgaXRzZWxmIGZyb20gc291cmNlCisgICAgY29kZSkuICBUaGlzIG1lYW5zIGl0IHdvdWxkIG5lZWQgKGF0IGxlYXN0KSBiaW51dGlscywgZ2NjLCBhbmQgbWFrZSwgb3IKKyAgICBlcXVpdmFsZW50cy4KKworICAgIEl0IHdvdWxkIGJlIGEgZ29vZCAiZWF0aW5nIG91ciBvd24gZG9nZm9vZCIgdGVzdCBpZiBidWlsZHJvb3QgaGFkIHRoZSBvcHRpb24KKyAgICBvZiB1c2luZyBhICJtYWtlIGFsbHllc2NvbmZpZyIgYnVzeWJveCBpbnN0ZWFkIG9mIHRoZSBhbGwgb2YgdGhlIGFib3ZlCisgICAgcGFja2FnZXMuICBBbnl0aGluZyB0aGF0J3Mgd3Jvbmcgd2l0aCB0aGUgcmVzdWx0aW5nIHN5c3RlbSwgd2UgY2FuIGZpeC4gIChJdAorICAgIHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byB1cGdyYWRlIGJ1c3lib3ggdG8gYmUgYWJsZSB0byByZXBsYWNlIGJhc2ggYW5kCisgICAgZGlmZnV0aWxzIGFzIHdlbGwsIGJ1dCB3ZSdyZSBub3QgdGhlcmUgeWV0LikKKworICAgIE9uZSBleGFtcGxlIG9mIGFuIGV4aXN0aW5nIHN5c3RlbSB0aGF0IGRvZXMgdGhpcyBhbHJlYWR5IGlzIEZpcm13YXJlIExpbnV4OgorICAgICAgaHR0cDovL3d3dy5sYW5kbGV5Lm5ldC9jb2RlL2Zpcm13YXJlCisKKyAgaW5pdHJhbWZzCisgICAgQnVzeWJveCBzaG91bGQgaGF2ZSBhIHNhbXBsZSBpbml0cmFtZnMgYnVpbGQgc2NyaXB0LiAgVGhpcyBkZXBlbmRzIG9uCisgICAgc2hlbGwsIG1kZXYsIGFuZCBzd2l0Y2hfcm9vdC4KKworICBta2RlcAorICAgIFdyaXRlIGEgbWtkZXAgdGhhdCBkb2Vzbid0IHNlZ2ZhdWx0IGlmIHRoZXJlJ3MgYSBkaXJlY3RvcnkgaXQgZG9lc24ndAorICAgIGhhdmUgcGVybWlzc2lvbiB0byByZWFkLCBpc24ndCBiYXNlZCBvbiBtYW51YWxseSBlZGl0aW5nIHRoZSBvdXRwdXQgb2YKKyAgICBsZXh4IGFuZCB5YWNjLCBkb2Vzbid0IG1ha2Ugc3VjaCBhIG1lc3MgdW5kZXIgaW5jbHVkZS9jb25maWcsIGV0Yy4KKworICBHcm91cCBnbG9iYWxzIGludG8gdW5pb25zIG9mIHN0cnVjdHVyZXMuCisgICAgR28gdGhyb3VnaCBhbmQgdHVybiBhbGwgdGhlIGdsb2JhbCBhbmQgc3RhdGljIHZhcmlhYmxlcyBpbnRvIHN0cnVjdHVyZXMsCisgICAgYW5kIGhhdmUgYWxsIHRob3NlIHN0cnVjdHVyZXMgYmUgaW4gYSBiaWcgdW5pb24gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzLAorICAgIHNvIGJ1c3lib3ggdXNlcyBsZXNzIGJzcy4gIChUaGlzIGlzIGEgYmlnIHdpbiBvbiBub21tdSBtYWNoaW5lcy4pICBTZWUKKyAgICBzZWQuYyBhbmQgbWRldi5jIGZvciBleGFtcGxlcy4KKworICBHbyB0aHJvdWdoIGJ1Z3MuYnVzeWJveC5uZXQgYW5kIGNsb3NlIG91dCBhbGwgb2YgdGhhdCBzb21laG93LgorICAgIFRoaXMgb25lJ3Mgb3BlbiB0byBldmVyeWJvZHksIGJ1dCBJJ2xsIHdpbmQgdXAgZG9pbmcgaXQuLi4KKworQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIDxidXN5Ym94QGJ1c3lib3gubmV0PiBzdWdnZXN0cyB0byBsb29rIGF0IHRoZXNlOgorICBOZXcgZGVidWcgb3B0aW9uczoKKyAgICAtV2xhcmdlci10aGFuLTEyNworICAgIENsZWFudXAgYW55IGJpZyB1c2VycworICBDb2xsYXRlIEJVRlNJWiBJT0JVRl9TSVpFIE1ZX0JVRl9TSVpFIFBJUEVfUFJPR1JFU1NfU0laRSBCVUZTSVpFIFBJUEVTSVpFCisgICAgbWFrZSBiYl9jb21tb25fYnVmc2l6MSBjb25maWd1cmFibGUsIHNpemUgd2lzZS4KKyAgICBtYWtlIHBpcGVzaXplIGNvbmZpZ3VyYWJsZSwgc2l6ZSB3aXNlLgorICAgIFVzZSBiYl9jb21tb25fYnVmc2l6MSB0aHJvdWdob3V0IGFwcGxldHMhCisKK0FzIHlldCB1bmNsYWltZWQ6CisKKy0tLS0KK2RpZmYKKyAgTWFrZSBzdXJlIHdlIGhhbmRsZSBlbXB0eSBmaWxlcyBwcm9wZXJseToKKyAgICBGcm9tIHRoZSBwYXRjaCBtYW4gcGFnZToKKworICAgIHlvdSBjYW4gcmVtb3ZlIGEgZmlsZSBieSBzZW5kaW5nIG91dCBhIGNvbnRleHQgZGlmZiB0aGF0IGNvbXBhcmVzCisgICAgdGhlIGZpbGUgdG8gYmUgZGVsZXRlZCB3aXRoIGFuIGVtcHR5IGZpbGUgZGF0ZWQgdGhlIEVwb2NoLiAgVGhlCisgICAgZmlsZSB3aWxsIGJlIHJlbW92ZWQgdW5sZXNzIHBhdGNoIGlzIGNvbmZvcm1pbmcgdG8gUE9TSVggYW5kIHRoZQorICAgIC1FIG9yIC0tcmVtb3ZlLWVtcHR5LWZpbGVzIG9wdGlvbiBpcyBub3QgZ2l2ZW4uCistLS0KK3BhdGNoCisgIFNob3VsZCBoYXZlIHNpbXBsZSBmdXp6IGZhY3RvciBzdXBwb3J0IHRvIGFwcGx5IHBhdGNoZXMgYXQgYW4gb2Zmc2V0IHdoaWNoCisgIHNob3VsZG4ndCB0YWtlIHVwIHRvbyBtdWNoIHNwYWNlLgorCisgIEFuZCB3aGlsZSB3ZSdyZSBhdCBpdCwgYSBuZXcgcGF0Y2ggZmlsZW5hbWUgcXVvdGluZyBmb3JtYXQgaXMgYXBwYXJlbnRseQorICBjb21pbmcgc29vbjogIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9Z2l0Jm09MTEyOTI3MzE2NDA4NjkwJnc9MgorLS0tCitzdHR5IC8gY2F0dgorICBzdHR5J3MgdmlzaWJsZSgpIGZ1bmN0aW9uIGFuZCBjYXR2J3MgZ3V0cyBhcmUgaWRlbnRpY2FsLiBNZXJnZSB0aGVtIGludG8KKyAgYW4gYXBwcm9wcmlhdGUgbGliYmIgZnVuY3Rpb24uCistLS0KK3N0cnVjdCBzdWZmaXhfbXVsdAorICBTZXZlcmFsIGR1cGxpY2F0ZSB1c2VycyBvZjogZ3JlcCAtciAiMTAyNFwqMTAyNCIgKiAtQjIgLUExCisgIE1lcmdlIHRvIGEgc2luZ2xlIHNpemVfc3VmZml4ZXNbXSBpbiBsaWJiYi4KKyAgVXNlcnM6IGhlYWQgdGFpbCBvZF9ibG9hdHkgaGV4ZHVtcCBhbmQgKHBhcnRpYWxseSBhcyBpdCB3b3VsZG4ndCBodXJ0KSBzdmxvZ2QKKy0tLQordGFpbAorICAuL2J1c3lib3ggdGFpbCAtZiBmb28uY34gVE9ETworICBzaG91bGQgbm90IHByaW50IGZtdD1oZWFkZXJfZm10IGZvciBzdWJzZXF1ZW50IGRhdGUgPj4gVE9ETzsgaS5lLiBvbmx5CisgIGZtdCsgaWYgYW5vdGhlciAobm90IHRoZSBjdXJyZW50KSBmaWxlIGRpZCBjaGFuZ2UKKworQXJjaGl0ZWN0dXJhbCBpc3N1ZXM6CisKK2JiX2Nsb3NlKCkgd2l0aCBmc3luYygpCisgIFdlIHNob3VsZCBoYXZlIGEgYmJfY2xvc2UoKSBpbiBwbGFjZSBvZiBub3JtYWwgY2xvc2UsIHdpdGggYSBDT05GSUdfIG9wdGlvbgorICB0byBub3QganVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGNsb3NlKCkgZm9yIGFuIGVycm9yLCBidXQgZnN5bmMoKS4KKyAgQ2xvc2UgY2FuJ3QgcmVsaWFibHkgcmVwb3J0IGFueXRoaW5nIHVzZWZ1bCBiZWNhdXNlIGlmIHdyaXRlKCkgYWNjZXB0ZWQgdGhlCisgIGRhdGEgdGhlbiBpdCBlaXRoZXIgd2VudCBvdXQgdG8gdGhlIG5ldHdvcmsgb3IgaXQncyBpbiBjYWNoZSBvciBhIHBpcGUKKyAgYnVmZmVyLiAgRWl0aGVyIHdheSwgdGhlcmUncyBubyBndWFyYW50ZWUgaXQnbGwgbWFrZSBpdCB0byBpdHMgZmluYWwKKyAgZGVzdGluYXRpb24gYmVmb3JlIGNsb3NlKCkgZ2V0cyBjYWxsZWQsIHNvIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYW55CisgIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQuCisKKyAgWW91IG5lZWQgdG8gY2FsbCBmc3luYygpIGlmIHlvdSBjYXJlIGFib3V0IGVycm9ycyB0aGF0IG9jY3VyIGFmdGVyIHdyaXRlKCksCisgIGJ1dCB0aGF0IGNhbiBoYXZlIGEgYmlnIHBlcmZvcm1hbmNlIGltcGFjdC4gIFNvIG1ha2UgaXQgYSBjb25maWcgb3B0aW9uLgorLS0tCitVbmlmeSBhcmNoaXZlcnMKKyAgTG90cyBvZiBhcmNoaXZlcnMgaGF2ZSB0aGUgc2FtZSBnZW5lcmFsIGluZnJhc3RydWN0dXJlLiAgVGhlIGRpcmVjdG9yeQorICB0cmF2ZXJzYWwgY29kZSBzaG91bGQgYmUgZmFjdG9yZWQgb3V0LCBhbmQgdGhlIGd1dHMgb2YgZWFjaCBhcmNoaXZlciBjb3VsZAorICBiZSBzb21lIHNldHVwIGNvZGUgYW5kIGEgc2VyaWVzIG9mIGNhbGxiYWNrcyBmb3IgImFkZCB0aGlzIGZpbGUiLAorICAiYWRkIHRoaXMgZGlyZWN0b3J5IiwgImFkZCB0aGlzIHN5bWxpbmsiIGFuZCBzbyBvbi4KKworICBUaGlzIGNvdWxkIGNsZWFuIHVwIHRhciBhbmQgemlwLCBhbmQgbWFrZSBpdCBjaGVhcGVyIHRvIGFkZCBjcGlvIGFuZCBhcgorICB3cml0ZSBzdXBwb3J0LCBhbmQgcG9zc2libHkgZXZlbiBjaGVhcGx5IGFkZCB0aGluZ3MgbGlrZSBta2lzb2ZzIG9yCisgIG1rc3F1YXNoZnMgc29tZWRheSwgaWYgdGhleSBiZWNvbWUgcmVsZXZhbnQuCistLS0KK1RleHQgYnVmZmVyIHN1cHBvcnQuCisgIFNldmVyYWwgZXhpc3RpbmcgYXBwbGV0cyAoc29ydCwgdmksIGxlc3MuLi4pIHJlYWQKKyAgYSB3aG9sZSBmaWxlIGludG8gbWVtb3J5IGFuZCBhY3Qgb24gaXQuICBVc2Ugb3Blbl9yZWFkX2Nsb3NlKCkuCistLS0KK01lbW9yeSBBbGxvY2F0aW9uCisgIFdlIGhhdmUgYSBDT05GSUdfQlVGRkVSIG1lY2hhbmlzbSB0aGF0IGxldHMgdXMgc2VsZWN0IHdoZXRoZXIgdG8gZG8gbWVtb3J5CisgIGFsbG9jYXRpb24gb24gdGhlIHN0YWNrIG9yIHRoZSBoZWFwLiAgVW5mb3J0dW5hdGVseSwgd2UncmUgbm90IHVzaW5nIGl0IG11Y2guCisgIFdlIG5lZWQgdG8gYXVkaXQgb3VyIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgdHVybiBhIGxvdCBvZiBtYWxsb2MvZnJlZSBjYWxscworICBpbnRvIFJFU0VSVkVfQ09ORklHX0JVRkZFUi9SRUxFQVNFX0NPTkZJR19CVUZGRVIuCisgIEZvciBhIHN0YXJ0LCBzZWUgZS5nLiBtYWtlIEVYVFJBX0NGTEFHUz0tV2xhcmdlci10aGFuLTY0CisKKyAgQW5kIHdoaWxlIHdlJ3JlIGF0IGl0LCBtYW55IG9mIHRoZSBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCAjaWZkZWZzIHdpbGwgYmUKKyAgb3B0aW1pemVkIG91dCBieSB0aGUgY29tcGlsZXIgaW4gdGhlIHN0YWNrIGFsbG9jYXRpb24gY2FzZSAoc2luY2UgdGhlcmUncyBubworICBmcmVlIGZvciBhbiBhbGxvY2EoKSksIGFuZCB0aGlzIG1lYW5zIHRoYXQgdmFyaW91cyBjbGVhbnVwIGxvb3BzIHRoYXQganVzdAorICBjYWxsIGZyZWUgbWlnaHQgYWxzbyBiZSBvcHRpbWl6ZWQgb3V0IGJ5IHRoZSBjb21waWxlciBpZiB3cml0dGVuIHJpZ2h0LCBzbworICB3ZSBjYW4geWFuayB0aG9zZSAjaWZkZWZzIHRvbywgYW5kIGdlbmVyYWxseSBjbGVhbiB1cCB0aGUgY29kZS4KKy0tLQorRkVBVFVSRV9DTEVBTl9VUAorICBUaGlzIGlzIG1vcmUgYW4gdW5yZXNvbHZlZCBpc3N1ZSB0aGFuIGEgdG8tZG8gaXRlbS4gIE1vcmUgdGhvdWdodCBpcyBuZWVkZWQuCisKKyAgTm9ybWFsbHkgd2UgcmVseSBvbiBleGl0KCkgdG8gZnJlZSBtZW1vcnksIGNsb3NlIGZpbGVzIGFuZCB1bm1hcCBzZWdtZW50cworICBmb3IgdXMuICBUaGlzIG1ha2VzIG1vc3QgY2FsbHMgdG8gZnJlZSgpLCBjbG9zZSgpLCBhbmQgdW5tYXAoKSBvcHRpb25hbCBpbgorICBidXN5Ym94IGFwcGxldHMgdGhhdCBkb24ndCBpbnRlbmQgdG8gcnVuIGZvciB2ZXJ5IGxvbmcsIGFuZCBvcHRpb25hbCBzdHVmZgorICBjYW4gYmUgb21pdHRlZCB0byBzYXZlIHNpemUuCisKKyAgVGhlIGlkZWEgd2FzIHJhaXNlZCB0aGF0IHdlIGNvdWxkIHNpbXVsYXRlIGZvcmsvZXhpdCB3aXRoIHNldGptcC9sb25nam1wCisgIGZvciBfcmVhbGx5XyBicmFpbmxlc3MgZW1iZWRkZWQgc3lzdGVtcywgb3Igc3BlZWQgdXAgdGhlIHN0YW5kYWxvbmUgc2hlbGwKKyAgYnkgbm90IGZvcmtpbmcuICBEb2luZyBzbyB3b3VsZCByZXF1aXJlIGEgcmVsaWFibGUgRkVBVFVSRV9DTEVBTl9VUC4KKyAgVW5mb3J0dW5hdGVseSwgdGhpcyBpc24ndCBhcyBlYXN5IGFzIGl0IHNvdW5kcy4KKworICBUaGUgcHJvYmxlbSBpcywgbG90cyBvZiB0aGluZ3MgZXhpdCgpLCBzb21ldGltZXMgdW5leHBlY3RlZGx5ICh4bWFsbG9jKCkpCisgIGFuZCBzb21ldGltZXMgcmVsaWFibHkgKGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgpIG9yIHNob3dfdXNhZ2UoKSkuICBUaGlzCisgIGp1bXBzIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgY29udHJvbCBhbmQgYnlwYXNzZXMgYW55IGNsZWFudXAgY29kZSB3ZQorICBwdXQgYXQgdGhlIGVuZCBvZiBvdXIgYXBwbGV0cy4KKworICBJdCdzIHBvc3NpYmxlIHRvIGFkZCBob29rcyB0byBsaWJiYiBmdW5jdGlvbnMgbGlrZSB4bWFsbG9jKCkgYW5kIHhvcGVuKCkKKyAgdG8gYWRkIHRoZWlyIGVudHJpZXMgdG8gYSBsaW5rZWQgbGlzdCwgd2hpY2ggY291bGQgYmUgdHJhdmVyc2VkIGFuZAorICBmcmVlZC9jbG9zZWQgYXV0b21hdGljYWxseS4gIChUaGlzIHdvdWxkIG5lZWQgdG8gYmUgYWJsZSB0byBmcmVlIGp1c3QgdGhlCisgIGVudHJpZXMgYWZ0ZXIgYSBjaGVja3BvaW50IHRvIGJlIHVzYWJsZSBmb3IgYSBmb3JrbGVzcyBzdGFuZGFsb25lIHNoZWxsLgorICBZb3UgZG9uJ3Qgd2FudCB0byBmcmVlIHRoZSBzaGVsbCdzIG93biByZXNvdXJjZXMuKQorCisgIFJpZ2h0IG5vdywgRkVBVFVSRV9DTEVBTl9VUCBpcyBtb3JlIG9yIGxlc3MgYSBkZWJ1Z2dpbmcgYWlkLCB0byBtYWtlIHRoaW5ncworICBsaWtlIHZhbGdyaW5kIGhhcHB5LiAgSXQncyBhbHNvIGRvY3VtZW50YXRpb24gb2YgX3doYXRfIHdlJ3JlIHRydXN0aW5nCisgIGV4aXQoKSB0byBjbGVhbiB1cCBmb3IgdXMuICBCdXQgbmV3IGluZnJhc3RydWN0dXJlIHRvIGF1dG8tZnJlZSBzdHVmZiB3b3VsZAorICByZW5kZXIgdGhlIGV4aXN0aW5nIEZFQVRVUkVfQ0xFQU5fVVAgY29kZSByZWR1bmRhbnQuCisKKyAgRm9yIHJpZ2h0IG5vdywgZXhpdCgpIGhhbmRsZXMgaXQganVzdCBmaW5lLgorCisKK01pbm9yIHN0dWZmOgorICB3YXRjaGRvZy5jIGNvdWxkIGF1dG9kZXRlY3QgdGhlIHRpbWVyIGR1cmF0aW9uIHZpYToKKyAgICBpZighaW9jdGwgKGZkLCBXRElPQ19HRVRUSU1FT1VULCAmdG1vKSkgdGltZXJfZHVyYXRpb24gPSAxICsgKHRtbyAvIDIpOworICBVbmZvcnR1bmF0ZWx5LCB0aGF0IG5lZWRzIGxpbnV4L3dhdGNoZG9nLmggYW5kIHRoYXQgY29udGFpbnMgdW5maWx0ZXJlZAorICBrZXJuZWwgdHlwZXMgb24gc29tZSBkaXN0cm9zLCB3aGljaCBicmVha3MgdGhlIGJ1aWxkLgorLS0tCisgIHVzZSBiYl9lcnJvcl9tc2cgd2hlcmUgYXBwcm9wcmlhdGU6IFNlZQorICBlZ3JlcCAiKHByaW50Zi4qXChbWzpzcGFjZTpdXSooc3RkZXJyfDIpfFteX113cml0ZS4qXChbWzpzcGFjZTpdXSooc3RkZXJyfDIpKSIKKy0tLQorICB1c2UgYmJfcGVycm9yX21zZyB3aGVyZSBhcHByb3ByaWF0ZTogU2VlCisgIGVncmVwICJbXl9dcGVycm9yIgorLS0tCisgIHBvc3NpYmxlIGNvZGUgZHVwbGljYXRpb24gaW5ncm91cCgpIGFuZCBpc19hX2dyb3VwX21lbWJlcigpCistLS0KKyAgTW92ZSBfX2dldF9oeigpIHRvIGEgYmV0dGVyIHBsYWNlIGFuZCAocmUpdXNlIGl0IGluIHJvdXRlLmMsIGFzaC5jCistLS0KKyAgU2VlIGdyZXAgLXIgc3RydG9kCisgIEFsb3Qgb2YgZHVwbGljYXRpb24gdGhhdCB3YW50cyBjbGVhbnVwLgorLS0tCisgIGluX2V0aGVyIGR1cGxpY2F0ZWQgaW4gbmV0d29yay97aW50ZXJmYWNlLGlmY29uZmlnfS5jCistLS0KKyAgdW5pZnkgcHJvZ3Jlc3NfbWV0ZXIuIHdnZXQsIGZsYXNoX2VyYXNlYWxsLCBwaXBlX3Byb2dyZXNzLCBmYnNwbGFzaCwgc2V0ZmlsZXMuCistLS0KKyAgc3VwcG9ydCBzdGFydC1zdG9wLWRhZW1vbiAtZCA8Y2hkaXItcGF0aD4KKy0tLQordmRwcmludGYoKSAtPiBzaW1pbGFyIHNpemVkIGZ1bmN0aW9uYWxpdHkKKy0tLQorCisoVE9ETyBsaXN0IGFmdGVyIGRpc2N1c3Npb24gMTEuMDUuMjAwOSkKKworKiBzaHJpbmsgdGMvYnJjdGwvaXAKKyAgdGMvYnJjdGwgc2VlbSBsaWtlIGZhaXJseSBsYXJnZSB0aGluZ3MgdG8gdHJ5IGFuZCB0YWNrbGUgaW4geW91ciB0aW1lZnJhbWUsCisgIGFuZCBpIHRoaW5rIHBlb3BsZSBoYXZlIHBvc3RlZCBhdHRlbXB0cyBpbiB0aGUgcGFzdC4gQWRkaW5nIGFkZGl0aW9uYWwKKyAgb3B0aW9ucyB0byBpcCB0aG91Z2ggc2VlbXMgcmVhc29uYWJsZS4KKworKiBhZGQgdGVzdHMgZm9yIHNvbWUgYXBwbGV0cworCisqIGltcGxlbWVudCBQT1NJWCB1dGlsaXRpZXMgYW5kIGF1ZGl0IHRoZW0gZm9yIFBPU0lYIGNvbmZvcm1hbmNlLiB0aGVuCisgIGF1ZGl0IHRoZW0gZm9yIEdOVSBjb25mb3JtYW5jZS4gdGhlbiBkb2N1bWVudCBhbGwgeW91ciBmaW5kaW5ncyBpbiBhIG5ldworICBkb2MvY29uZm9ybWFuY2UudHh0IGZpbGUgd2hpbGUgcGVyaGFwcyBpbXBsZW1lbnRpbmcgc29tZSBvZiB0aGUgbWlzc2luZworICBmZWF0dXJlcy4KKyAgeW91IGNhbiBmaW5kIHRoZSBsYXRlc3QgUE9TSVggZG9jdW1lbnRhdGlvbiAoMTAwMy4xLTIwMDgpIGhlcmU6CisgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvCisgIGFuZCB0aGUgY29tcGxldGUgbGlzdCBvZiBhbGwgdXRpbGl0aWVzIHRoYXQgUE9TSVggY292ZXJzOgorICBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L2lkeC91dGlsaXRpZXMuaHRtbAorICBUaGUgZmlyc3Qgc3RlcCB3b3VsZCB0byBnZW5lcmF0ZSBhIGZpbGUvbWF0cml4IHdoYXQgaXMgYWxyZWFkeSBhcmNoaXZlZAorICAoYWxzbyBJUFY2KQorCisqIGltcGxlbWVudCAnYXQnCisKKyogcnBjYmluZCAoZm9ybWVyIHBvcnRtYXApIG9yIGVxdWl2YWxlbnQKKyAgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHVzZSAtbyBub2xvY2sgb24gbmZzIG1vdW50cworCisqIGNoZWNrIElQVjYgY29tcGxpYW5jZQorCisqIGdlbmVyYXRlIGEgbWluaSBleGFtcGxlIHVzaW5nIGtlcm5lbCtidXN5Ym94IG9ubHkgKCtsaWJjKSBmb3IgZXhhbXBsZQorCisqIG1vcmUgc3VwcG9ydCBmb3IgYWR2YW5jZWQgbGludXggMi42LnggZmVhdHVyZXMsIHNlZTogaW90b3AKKyAgbW9zdCBsaWtlbHkgdGhlcmUgaXMgbW9yZQorCisqIGV2ZW4gbW9yZSBzdXBwb3J0IGZvciBzdGF0aXN0aWNzOiBtcHN0YXQsIGlvc3RhdCwgcG93ZXJ0b3AuLi4uCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9UT0RPX3VuaWNvZGUgYi9idXN5Ym94LTEuMTkuMy9UT0RPX3VuaWNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxMGU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL1RPRE9fdW5pY29kZQpAQCAtMCwwICsxLDQ1IEBACitBbHJlYWR5IGZpeGVkIGFwcGxldHM6CitjYWwKK2xzbW9kCitkZgorZHVtcGxlYXNlcworCitBcHBsZXRzIHdoaWNoIG1heSBuZWVkIHVuaWNvZGUgaGFuZGxpbmcgKG1vcmUgZXh0ZW5zaXZlIHRoYW4gc2FuaXRpemluZworb2YgZmlsZW5hbWVzIGluIGVycm9yIG1lc3NhZ2VzKToKKworbHMgLSB3b3JrIGluIHByb2dyZXNzCitleHBhbmQsIHVuZXhwYW5kIC0gdXNlcyB1bmljb2RlX3N0cmxlbiwgbm90IHNjcmxlbgorYXNoLCBodXNoIHRocm91Z2ggbGluZWVkaXQgLSB1c2VzIHVuaWNvZGVfc3RybGVuLCBub3Qgc2NybGVuCit0b3AgLSBuZWVkIHRvIHNhbml0aXplIHByb2Nlc3MgYXJncworcHMgLSBuZWVkIHRvIHNhbml0aXplIHByb2Nlc3MgYXJncworbGVzcworbW9yZQordmkKK2VkCitjdXQKK2F3aworc2VkCit0cgorZ3JlcCBlZ3JlcCBmZ3JlcAorZm9sZAorc29ydAoraGVhZCwgdGFpbAorY2F0diAtICJkaXNwbGF5IG5vbnByaW50aW5nIGNoYXJzIiAtIHdoYXQgdGhpcyBjb3VsZCBtZWFuIGZvciB1bmljb2RlPword2MKK2NoYXQKK2R1bXBrbWFwCitsYXN0IC0ganVzdCBsaW5lIHVwIGNvbHVtbnMKK21hbgorbWljcm9jb20KK3N0cmluZ3MKK3dhdGNoCisKK1Vuc3VyZSwgbWF5IG5lZWQgZml4aW5nOgorCitob3N0bmFtZSAtIGRvIHdlIHJlYWxseSB3YW50IHRvIHByb3RlY3QgYWdhaW5zdCBiYWQgY2hhcnMgaW4gaXQ/CitwYXRjaAorYWRkZ3JvdXAsIGFkZHVzZXIsIGRlbGdyb3VwLCBkZWx1c2VyCit0ZWxuZXQKK3RlbG5ldGQKK29kCitwcmludGYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FwcGxldHMvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL2FwcGxldHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjEyMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNDcgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitvYmoteSA6PQorb2JqLXkgKz0gYXBwbGV0cy5vCisKK2hvc3Rwcm9ncy15Oj0KK2hvc3Rwcm9ncy15ICs9IHVzYWdlIHVzYWdlX3BvZCBhcHBsZXRfdGFibGVzCisKK2Fsd2F5czo9ICQoaG9zdHByb2dzLXkpCisKKyMgR2VuZXJhdGVkIGZpbGVzIG5lZWQgYWRkaXRpb25hbCBsb3ZlCisKKyMgVGhpcyB0cmljayBkZWNyZWFzZXMgYW1vdW50IG9mIHJlYnVpbGRzCisjIGlmIHRyZWUgaXMgbWVyZWx5IHJlbmFtZWQvY29waWVkCitpZmVxICgkKHNyY3RyZWUpLCQob2JqdHJlZSkpCitzcmN0cmVlX3NsYXNoID0KK2Vsc2UKK3NyY3RyZWVfc2xhc2ggPSAkKHNyY3RyZWUpLworZW5kaWYKKworSE9TVENGTEFHU191c2FnZS5vID0gLUkkKHNyY3RyZWVfc2xhc2gpaW5jbHVkZSAtSWluY2x1ZGUKK0hPU1RDRkxBR1NfdXNhZ2VfcG9kLm8gPSAtSSQoc3JjdHJlZV9zbGFzaClpbmNsdWRlIC1JaW5jbHVkZQorCithcHBsZXRzL2FwcGxldHMubzogaW5jbHVkZS91c2FnZV9jb21wcmVzc2VkLmggaW5jbHVkZS9hcHBsZXRfdGFibGVzLmgKKworYXBwbGV0cy9hcHBsZXRfdGFibGVzOiAuY29uZmlnIGluY2x1ZGUvYXBwbGV0cy5oCithcHBsZXRzL3VzYWdlOiAgICAgICAgIC5jb25maWcgaW5jbHVkZS9hcHBsZXRzLmgKK2FwcGxldHMvdXNhZ2VfcG9kOiAgICAgLmNvbmZpZyBpbmNsdWRlL2FwcGxldF90YWJsZXMuaCBpbmNsdWRlL2FwcGxldHMuaAorCitxdWlldF9jbWRfZ2VuX3VzYWdlX2NvbXByZXNzZWQgPSBHRU4gICAgIGluY2x1ZGUvdXNhZ2VfY29tcHJlc3NlZC5oCisgICAgICBjbWRfZ2VuX3VzYWdlX2NvbXByZXNzZWQgPSAkKHNyY3RyZWVfc2xhc2gpYXBwbGV0cy91c2FnZV9jb21wcmVzc2VkIGluY2x1ZGUvdXNhZ2VfY29tcHJlc3NlZC5oIGFwcGxldHMKKworaW5jbHVkZS91c2FnZV9jb21wcmVzc2VkLmg6IGFwcGxldHMvdXNhZ2UgJChzcmN0cmVlX3NsYXNoKWFwcGxldHMvdXNhZ2VfY29tcHJlc3NlZAorCSQoY2FsbCBjbWQsZ2VuX3VzYWdlX2NvbXByZXNzZWQpCisKK3F1aWV0X2NtZF9nZW5fYXBwbGV0X3RhYmxlcyA9IEdFTiAgICAgaW5jbHVkZS9hcHBsZXRfdGFibGVzLmgKKyAgICAgIGNtZF9nZW5fYXBwbGV0X3RhYmxlcyA9IGFwcGxldHMvYXBwbGV0X3RhYmxlcyBpbmNsdWRlL2FwcGxldF90YWJsZXMuaCBpbmNsdWRlL05VTV9BUFBMRVRTLmgKKworaW5jbHVkZS9hcHBsZXRfdGFibGVzLmg6IGFwcGxldHMvYXBwbGV0X3RhYmxlcworCSQoY2FsbCBjbWQsZ2VuX2FwcGxldF90YWJsZXMpCisKK2luY2x1ZGUvTlVNX0FQUExFVFMuaDogYXBwbGV0cy9hcHBsZXRfdGFibGVzCisJJChjYWxsIGNtZCxnZW5fYXBwbGV0X3RhYmxlcykKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FwcGxldHMvYXBwbGV0X3RhYmxlcy5jIGIvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9hcHBsZXRfdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3NTc0NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FwcGxldHMvYXBwbGV0X3RhYmxlcy5jCkBAIC0wLDAgKzEsMTY0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBcHBsZXQgdGFibGUgZ2VuZXJhdG9yLgorICogUnVucyBvbiBob3N0IGFuZCBwcm9kdWNlcyBpbmNsdWRlL2FwcGxldF90YWJsZXMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI3VuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoKHVuc2lnbmVkKShzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkpCisKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2F1dG9jb25mLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9hcHBsZXRfbWV0YWRhdGEuaCIKKworc3RydWN0IGJiX2FwcGxldCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICptYWluOworCWVudW0gYmJfaW5zdGFsbF9sb2NfdCBpbnN0YWxsX2xvYzsKKwllbnVtIGJiX3N1aWRfdCBuZWVkX3N1aWQ7CisJLyogdHJ1ZSBpZiBpbnN0ZWFkIG9mIGZvcmsoKTsgZXhlYygiYXBwbGV0Iik7IHdhaXRwaWQoKTsKKwkgKiBvbmUgY2FuIGRvIGZvcmsoKTsgZXhpdChhcHBsZXRfbWFpbihhcmdjLGFyZ3YpKTsgd2FpdHBpZCgpOyAqLworCXVuc2lnbmVkIGNoYXIgbm9leGVjOworCS8qIEV2ZW4gbmljZXIgKi8KKwkvKiB0cnVlIGlmIGluc3RlYWQgb2YgZm9yaygpOyBleGVjKCJhcHBsZXQiKTsgd2FpdHBpZCgpOworCSAqIG9uZSBjYW4gc2ltcGx5IGNhbGwgYXBwbGV0X21haW4oYXJnYyxhcmd2KTsgKi8KKwl1bnNpZ25lZCBjaGFyIG5vZm9yazsKK307CisKKy8qIERlZmluZSBzdHJ1Y3QgYmJfYXBwbGV0IGFwcGxldHNbXSAqLworI2luY2x1ZGUgIi4uL2luY2x1ZGUvYXBwbGV0cy5oIgorCitlbnVtIHsgTlVNX0FQUExFVFMgPSBBUlJBWV9TSVpFKGFwcGxldHMpIH07CisKK3N0YXRpYyBpbnQgb2Zmc2V0W05VTV9BUFBMRVRTXTsKKworc3RhdGljIGludCBjbXBfbmFtZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBiYl9hcHBsZXQgKmFhID0gYTsKKwljb25zdCBzdHJ1Y3QgYmJfYXBwbGV0ICpiYiA9IGI7CisJcmV0dXJuIHN0cmNtcChhYS0+bmFtZSwgYmItPm5hbWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJaW50IG9mczsKKwl1bnNpZ25lZCBNQVhfQVBQTEVUX05BTUVfTEVOID0gMTsKKworCXFzb3J0KGFwcGxldHMsIE5VTV9BUFBMRVRTLCBzaXplb2YoYXBwbGV0c1swXSksIGNtcF9uYW1lKTsKKworCW9mcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BUFBMRVRTOyBpKyspIHsKKwkJb2Zmc2V0W2ldID0gb2ZzOworCQlvZnMgKz0gc3RybGVuKGFwcGxldHNbaV0ubmFtZSkgKyAxOworCX0KKwkvKiBXZSByZXVzZSA0IGhpZ2gtb3JkZXIgYml0cyBvZiBvZmZzZXQgYXJyYXkgZm9yIG90aGVyIHB1cnBvc2VzLAorCSAqIHNvIGlmIHRoZXkgYXJlIGluZGVlZCBuZWVkZWQsIHJlZnVzZSB0byBwcm9jZWVkICovCisJaWYgKG9mcyA+IDB4ZmZmKQorCQlyZXR1cm4gMTsKKwlpZiAoIWFyZ3ZbMV0pCisJCXJldHVybiAxOworCisJaSA9IG9wZW4oYXJndlsxXSwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgMDY2Nik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gMTsKKwlkdXAyKGksIDEpOworCisJLyogS2VlcCBpbiBzeW5jIHdpdGggaW5jbHVkZS9idXN5Ym94LmghICovCisKKwlwcmludGYoIi8qIFRoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZSwgZG9uJ3QgZWRpdCAqL1xuXG4iKTsKKworCXByaW50ZigiI2RlZmluZSBOVU1fQVBQTEVUUyAldVxuIiwgTlVNX0FQUExFVFMpOworCWlmIChOVU1fQVBQTEVUUyA9PSAxKSB7CisJCWNoYXIgKmRhc2hfdG9fdW5kZXJzY29yZSwgKnA7CisJCXByaW50ZigiI2RlZmluZSBTSU5HTEVfQVBQTEVUX1NUUiBcIiVzXCJcbiIsIGFwcGxldHNbMF0ubmFtZSk7CisJCS8qIEV4YW1wbGU6ICJldGhlci13YWtlIiAtPiAiZXRoZXJfd2FrZSIgKi8KKwkJcCA9IGRhc2hfdG9fdW5kZXJzY29yZSA9IHN0cmR1cChhcHBsZXRzWzBdLm5hbWUpOworCQlwLS07CisJCXdoaWxlICgqKytwKQorCQkJaWYgKCpwID09ICctJykKKwkJCQkqcCA9ICdfJzsKKwkJcHJpbnRmKCIjZGVmaW5lIFNJTkdMRV9BUFBMRVRfTUFJTiAlc19tYWluXG4iLCBkYXNoX3RvX3VuZGVyc2NvcmUpOworCX0KKwlwcmludGYoIlxuIik7CisKKwkvL3ByaW50ZigiI2lmbmRlZiBTS0lQX2RlZmluaXRpb25zXG4iKTsKKwlwcmludGYoImNvbnN0IGNoYXIgYXBwbGV0X25hbWVzW10gQUxJR04xID0gXCJcIlxuIik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BUFBMRVRTOyBpKyspIHsKKwkJcHJpbnRmKCJcIiVzXCIgXCJcXDBcIlxuIiwgYXBwbGV0c1tpXS5uYW1lKTsKKwkJaWYgKE1BWF9BUFBMRVRfTkFNRV9MRU4gPCBzdHJsZW4oYXBwbGV0c1tpXS5uYW1lKSkKKwkJCU1BWF9BUFBMRVRfTkFNRV9MRU4gPSBzdHJsZW4oYXBwbGV0c1tpXS5uYW1lKTsKKwl9CisJcHJpbnRmKCI7XG5cbiIpOworCisJcHJpbnRmKCIjaWZuZGVmIFNLSVBfYXBwbGV0X21haW5cbiIpOworCXByaW50ZigiaW50ICgqY29uc3QgYXBwbGV0X21haW5bXSkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSA9IHtcbiIpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVBQTEVUUzsgaSsrKSB7CisJCXByaW50ZigiJXNfbWFpbixcbiIsIGFwcGxldHNbaV0ubWFpbik7CisJfQorCXByaW50ZigifTtcbiIpOworCXByaW50ZigiI2VuZGlmXG5cbiIpOworCisJcHJpbnRmKCJjb25zdCB1aW50MTZfdCBhcHBsZXRfbmFtZW9mc1tdIEFMSUdOMiA9IHtcbiIpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVBQTEVUUzsgaSsrKSB7CisJCXByaW50ZigiMHglMDR4LFxuIiwKKwkJCW9mZnNldFtpXQorI2lmIEVOQUJMRV9GRUFUVVJFX1BSRUZFUl9BUFBMRVRTCisJCQkrIChhcHBsZXRzW2ldLm5vZm9yayA8PCAxMikKKwkJCSsgKGFwcGxldHNbaV0ubm9leGVjIDw8IDEzKQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRAorCQkJKyAoYXBwbGV0c1tpXS5uZWVkX3N1aWQgPDwgMTQpIC8qIDIgYml0cyAqLworI2VuZGlmCisJCSk7CisJfQorCXByaW50ZigifTtcblxuIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNUQUxMRVIKKwlwcmludGYoImNvbnN0IHVpbnQ4X3QgYXBwbGV0X2luc3RhbGxfbG9jW10gQUxJR04xID0ge1xuIik7CisJaSA9IDA7CisJd2hpbGUgKGkgPCBOVU1fQVBQTEVUUykgeworCQlpbnQgdiA9IGFwcGxldHNbaV0uaW5zdGFsbF9sb2M7IC8qIDMgYml0cyAqLworCQlpZiAoKytpIDwgTlVNX0FQUExFVFMpCisJCQl2IHw9IGFwcGxldHNbaV0uaW5zdGFsbF9sb2MgPDwgNDsgLyogMyBiaXRzICovCisJCXByaW50ZigiMHglMDJ4LFxuIiwgdik7CisJCWkrKzsKKwl9CisJcHJpbnRmKCJ9O1xuIik7CisjZW5kaWYKKwkvL3ByaW50ZigiI2VuZGlmIC8qIFNLSVBfZGVmaW5pdGlvbnMgKi9cbiIpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIiNkZWZpbmUgTUFYX0FQUExFVF9OQU1FX0xFTiAldVxuIiwgTUFYX0FQUExFVF9OQU1FX0xFTik7CisKKwlpZiAoYXJndlsyXSkgeworCQljaGFyIGxpbmVfb2xkWzgwXTsKKwkJY2hhciBsaW5lX25ld1s4MF07CisJCUZJTEUgKmZwOworCisJCWxpbmVfb2xkWzBdID0gMDsKKwkJZnAgPSBmb3Blbihhcmd2WzJdLCAiciIpOworCQlpZiAoZnApIHsKKwkJCWZnZXRzKGxpbmVfb2xkLCBzaXplb2YobGluZV9vbGQpLCBmcCk7CisJCQlmY2xvc2UoZnApOworCQl9CisJCXNwcmludGYobGluZV9uZXcsICIjZGVmaW5lIE5VTV9BUFBMRVRTICV1XG4iLCBOVU1fQVBQTEVUUyk7CisJCWlmIChzdHJjbXAobGluZV9vbGQsIGxpbmVfbmV3KSAhPSAwKSB7CisJCQlmcCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7CisJCQlpZiAoIWZwKQorCQkJCXJldHVybiAxOworCQkJZnB1dHMobGluZV9uZXcsIGZwKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9hcHBsZXRzLmMgYi9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL2FwcGxldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGMyYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9hcHBsZXRzLmMKQEAgLTAsMCArMSwxNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3R1YiBmb3IgbGlua2luZyBidXN5Ym94IGJpbmFyeSBhZ2FpbnN0IGxpYmJ1c3lib3guCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImJ1c3lib3guaCIKKworI2lmIEVOQUJMRV9CVUlMRF9MSUJCVVNZQk9YCitpbnQgbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBsYmJfbWFpbihhcmd2KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9idXN5Ym94Lm1rbGwgYi9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL2J1c3lib3gubWtsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGRiZjIxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9idXN5Ym94Lm1rbGwKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL3NoCisjIE1ha2UgYnVzeWJveCBsaW5rcyBsaXN0IGZpbGUuCisKKyMgaW5wdXQgJDE6IGZ1bGwgcGF0aCB0byBDb25maWcuaAorIyBpbnB1dCAkMjogZnVsbCBwYXRoIHRvIGFwcGxldHMuaAorIyBvdXRwdXQgKHN0ZG91dCk6IGxpc3Qgb2YgcGF0aG5hbWVzIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCB0byBidXN5Ym94CisKKyMgTWFpbnRhaW5lcjogTGFycnkgRG9vbGl0dGxlIDxsZG9vbGl0dEByZWN5Y2xlLmxibC5nb3Y+CisKK2V4cG9ydCBMQ19BTEw9UE9TSVgKK2V4cG9ydCBMQ19DVFlQRT1QT1NJWAorCitDT05GSUdfSD0kezE6LWluY2x1ZGUvYXV0b2NvbmYuaH0KK0FQUExFVFNfSD0kezI6LWluY2x1ZGUvYXBwbGV0cy5ofQorJEhPU1RDQyAtRSAtRE1BS0VfTElOS1MgLWluY2x1ZGUgJENPTkZJR19IICRBUFBMRVRTX0ggfAorICBhd2sgJy9eWyBcdF0qTElOSy97CisJZGlyPXN1YnN0cigkMiw3KQorCWdzdWIoIl8iLCIvIixkaXIpCisJaWYoZGlyPT0iL1JPT1QiKSBkaXI9IiIKKwlmaWxlPSQzCisJZ3N1YigiXCIiLCIiLGZpbGUpCisJaWYgKGZpbGU9PSJidXN5Ym94IikgbmV4dAorCXByaW50IHRvbG93ZXIoZGlyKSAiLyIgZmlsZQorICB9JwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9pbmRpdmlkdWFsLmMgYi9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL2luZGl2aWR1YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc0ZTRjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9pbmRpdmlkdWFsLmMKQEAgLTAsMCArMSwyNCBAQAorLyogTWluaW1hbCB3cmFwcGVyIHRvIGJ1aWxkIGFuIGluZGl2aWR1YWwgYnVzeWJveCBhcHBsZXQuCisgKgorICogQ29weXJpZ2h0IDIwMDUgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworY29uc3QgY2hhciAqYXBwbGV0X25hbWU7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInVzYWdlLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlhcHBsZXRfbmFtZSA9IGFyZ3ZbMF07CisJcmV0dXJuIEFQUExFVF9tYWluKGFyZ2MsYXJndik7Cit9CisKK3ZvaWQgYmJfc2hvd191c2FnZSh2b2lkKQoreworCWZwdXRzKEFQUExFVF9mdWxsX3VzYWdlICJcbiIsIHN0ZG91dCk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9pbnN0YWxsLnNoIGIvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy9pbnN0YWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1YjQ3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL2luc3RhbGwuc2gKQEAgLTAsMCArMSwxMTMgQEAKKyMhL2Jpbi9zaAorCitleHBvcnQgTENfQUxMPVBPU0lYCitleHBvcnQgTENfQ1RZUEU9UE9TSVgKKworcHJlZml4PSQxCitpZiBbIC16ICIkcHJlZml4IiBdOyB0aGVuCisJZWNobyAidXNhZ2U6IGFwcGxldHMvaW5zdGFsbC5zaCBERVNUSU5BVElPTiBbLS1zeW1saW5rcy8tLWhhcmRsaW5rcy8tLXNjcmlwdHdyYXBwZXJdIgorCWV4aXQgMQorZmkKKworaD1gc29ydCBidXN5Ym94LmxpbmtzIHwgdW5pcWAKKworbGlua29wdHM9IiIKK3NjcmlwdHdyYXBwZXI9Im4iCitjbGVhbnVwPSIwIgorbm9jbG9iYmVyPSIwIgorY2FzZSAiJDIiIGluCisJLS1oYXJkbGlua3MpICAgICBsaW5rb3B0cz0iLWYiOzsKKwktLXN5bWxpbmtzKSAgICAgIGxpbmtvcHRzPSItZnMiOzsKKwktLXNjcmlwdHdyYXBwZXIpIHNjcmlwdHdyYXBwZXI9InkiO3N3cmFwYWxsPSJ5Ijs7CisJLS1zdy1zaC1oYXJkKSAgICBzY3JpcHR3cmFwcGVyPSJ5IjtsaW5rb3B0cz0iLWYiOzsKKwktLXN3LXNoLXN5bSkgICAgIHNjcmlwdHdyYXBwZXI9InkiO2xpbmtvcHRzPSItZnMiOzsKKwktLWNsZWFudXApICAgICAgIGNsZWFudXA9IjEiOzsKKwktLW5vY2xvYmJlcikgICAgIG5vY2xvYmJlcj0iMSI7OworCSIiKSAgICAgICAgICAgICAgaD0iIjs7CisJKikgICAgICAgICAgICAgICBlY2hvICJVbmtub3duIGluc3RhbGwgb3B0aW9uOiAkMiI7IGV4aXQgMTs7Citlc2FjCisKK2lmIFsgLW4gIiRET19JTlNUQUxMX0xJQlMiIF0gJiYgWyAiJERPX0lOU1RBTExfTElCUyIgIT0gIm4iIF07IHRoZW4KKwkjIGdldCB0aGUgdGFyZ2V0IGRpciBmb3IgdGhlIGxpYnMKKwkjIGFzc3VtZSBpdCBzdGFydHMgd2l0aCBsaWIKKwlsaWJkaXI9JCgkQ0MgLXByaW50LWZpbGUtbmFtZT1saWJjLnNvIHwgXAorCQkgc2VkIC1uICdzJV4uKlwoL2xpYlteXC9dKlwpL2xpYmMuc28lXDElcCcpCisJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJbGliZGlyPS9saWIKKwlmaQorCisJbWtkaXIgLXAgIiRwcmVmaXgvJGxpYmRpciIgfHwgZXhpdCAxCisJZm9yIGkgaW4gJERPX0lOU1RBTExfTElCUzsgZG8KKwkJcm0gLWYgIiRwcmVmaXgvJGxpYmRpci8kaSIgfHwgZXhpdCAxCisJCWlmIFsgLWYgIiRpIiBdOyB0aGVuCisJCQljcCAtcFBSICIkaSIgIiRwcmVmaXgvJGxpYmRpci8iIHx8IGV4aXQgMQorCQkJY2htb2QgMDY0NCAiJHByZWZpeC8kbGliZGlyLyRpIiB8fCBleGl0IDEKKwkJZmkKKwlkb25lCitmaQorCitpZiBbICIkY2xlYW51cCIgPSAiMSIgXSAmJiBbIC1lICIkcHJlZml4L2Jpbi9idXN5Ym94IiBdOyB0aGVuCisJaW5vZGU9YGxzIC1pICIkcHJlZml4L2Jpbi9idXN5Ym94IiB8IGF3ayAne3ByaW50ICQxfSdgCisJc3ViX3NoZWxsX2l0PWAKKwkJY2QgIiRwcmVmaXgiCisJCWZvciBkIGluIHVzci9zYmluIHVzci9iaW4gc2JpbiBiaW47IGRvCisJCQlwZD0kUFdECisJCQlpZiBbIC1kICIkZCIgXTsgdGhlbgorCQkJCWNkICIkZCIKKwkJCQlscyAtaUwgLiB8IGdyZXAgIl4gKiRpbm9kZSIgfCBhd2sgJ3twcmludCAkMn0nIHwgZW52IC1pIHhhcmdzIHJtIC1mCisJCQlmaQorCQkJY2QgIiRwZCIKKwkJZG9uZQorCQlgCisJZXhpdCAwCitmaQorCitybSAtZiAiJHByZWZpeC9iaW4vYnVzeWJveCIgfHwgZXhpdCAxCitta2RpciAtcCAiJHByZWZpeC9iaW4iIHx8IGV4aXQgMQoraW5zdGFsbCAtbSA3NTUgYnVzeWJveCAiJHByZWZpeC9iaW4vYnVzeWJveCIgfHwgZXhpdCAxCisKK2ZvciBpIGluICRoOyBkbworCWFwcGRpcj1gZGlybmFtZSAiJGkiYAorCW1rZGlyIC1wICIkcHJlZml4LyRhcHBkaXIiIHx8IGV4aXQgMQorCWlmIFsgIiRzY3JpcHR3cmFwcGVyIiA9ICJ5IiBdOyB0aGVuCisJCWlmIFsgIiRzd3JhcGFsbCIgIT0gInkiIF0gJiYgWyAiJGkiID0gIi9iaW4vc2giIF07IHRoZW4KKwkJCWxuICRsaW5rb3B0cyBidXN5Ym94ICIkcHJlZml4LyRpIiB8fCBleGl0IDEKKwkJZWxzZQorCQkJcm0gLWYgIiRwcmVmaXgvJGkiCisJCQllY2hvICIjIS9iaW4vYnVzeWJveCIgPiIkcHJlZml4LyRpIgorCQkJY2htb2QgK3ggIiRwcmVmaXgvJGkiCisJCWZpCisJCWVjaG8gIgkkcHJlZml4LyRpIgorCWVsc2UKKwkJaWYgWyAiJDIiID0gIi0taGFyZGxpbmtzIiBdOyB0aGVuCisJCQliYl9wYXRoPSIkcHJlZml4L2Jpbi9idXN5Ym94IgorCQllbHNlCisJCQljYXNlICIkYXBwZGlyIiBpbgorCQkJLykKKwkJCQliYl9wYXRoPSJiaW4vYnVzeWJveCIKKwkJCTs7CisJCQkvYmluKQorCQkJCWJiX3BhdGg9ImJ1c3lib3giCisJCQk7OworCQkJL3NiaW4pCisJCQkJYmJfcGF0aD0iLi4vYmluL2J1c3lib3giCisJCQk7OworCQkJL3Vzci9iaW4gfCAvdXNyL3NiaW4pCisJCQkJYmJfcGF0aD0iLi4vLi4vYmluL2J1c3lib3giCisJCQk7OworCQkJKikKKwkJCQllY2hvICJVbmtub3duIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnk6ICRhcHBkaXIiCisJCQkJZXhpdCAxCisJCQk7OworCQkJZXNhYworCQlmaQorCQlpZiBbICIkbm9jbG9iYmVyIiA9ICIwIiBdIHx8IFsgISAtZSAiJHByZWZpeC8kaSIgXTsgdGhlbgorCQkJZWNobyAiICAkcHJlZml4LyRpIC0+ICRiYl9wYXRoIgorCQkJbG4gJGxpbmtvcHRzICIkYmJfcGF0aCIgIiRwcmVmaXgvJGkiIHx8IGV4aXQgMQorCQllbHNlCisJCQllY2hvICIgICRwcmVmaXgvJGkgYWxyZWFkeSBleGlzdHMiCisJCWZpCisJZmkKK2RvbmUKKworZXhpdCAwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL3VzYWdlLmMgYi9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL3VzYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1MjBmZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FwcGxldHMvdXNhZ2UuYwpAQCAtMCwwICsxLDU1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXV0b2NvbmYuaCIKKworLyogU2luY2Ugd2UgY2FuJ3QgdXNlIHBsYXRmb3JtLmgsIGhhdmUgdG8gZG8gdGhpcyBhZ2FpbiBieSBoYW5kOiAqLworI2lmIEVOQUJMRV9OT01NVQorIyBkZWZpbmUgQkJfTU1VIDAKKyMgZGVmaW5lIFVTRV9GT1JfTk9NTVUoLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgVVNFX0ZPUl9NTVUoLi4uKQorI2Vsc2UKKyMgZGVmaW5lIEJCX01NVSAxCisjIGRlZmluZSBVU0VfRk9SX05PTU1VKC4uLikKKyMgZGVmaW5lIFVTRV9GT1JfTU1VKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisjaW5jbHVkZSAidXNhZ2UuaCIKKyNkZWZpbmUgTUFLRV9VU0FHRShhbmFtZSwgdXNhZ2UpIHsgYW5hbWUsIHVzYWdlIH0sCitzdGF0aWMgc3RydWN0IHVzYWdlX2RhdGEgeworCWNvbnN0IGNoYXIgKmFuYW1lOworCWNvbnN0IGNoYXIgKnVzYWdlOworfSB1c2FnZV9hcnJheVtdID0geworI2luY2x1ZGUgImFwcGxldHMuaCIKK307CisKK3N0YXRpYyBpbnQgY29tcGFyZV9mdW5jKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IHVzYWdlX2RhdGEgKnVhID0gYTsKKwljb25zdCBzdHJ1Y3QgdXNhZ2VfZGF0YSAqdWIgPSBiOworCXJldHVybiBzdHJjbXAodWEtPmFuYW1lLCB1Yi0+YW5hbWUpOworfQorCitpbnQgbWFpbih2b2lkKQoreworCWludCBpOworCWludCBudW1fbWVzc2FnZXMgPSBzaXplb2YodXNhZ2VfYXJyYXkpIC8gc2l6ZW9mKHVzYWdlX2FycmF5WzBdKTsKKworCWlmIChudW1fbWVzc2FnZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlxc29ydCh1c2FnZV9hcnJheSwKKwkJbnVtX21lc3NhZ2VzLCBzaXplb2YodXNhZ2VfYXJyYXlbMF0pLAorCQljb21wYXJlX2Z1bmMpOworCWZvciAoaSA9IDA7IGkgPCBudW1fbWVzc2FnZXM7IGkrKykKKwkJd3JpdGUoU1RET1VUX0ZJTEVOTywgdXNhZ2VfYXJyYXlbaV0udXNhZ2UsIHN0cmxlbih1c2FnZV9hcnJheVtpXS51c2FnZSkgKyAxKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy91c2FnZV9jb21wcmVzc2VkIGIvYnVzeWJveC0xLjE5LjMvYXBwbGV0cy91c2FnZV9jb21wcmVzc2VkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmNjZiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL3VzYWdlX2NvbXByZXNzZWQKQEAgLTAsMCArMSw1MCBAQAorIyEvYmluL3NoCisKK3RhcmdldD0iJDEiCitsb2M9IiQyIgorCit0ZXN0ICIkdGFyZ2V0IiB8fCBleGl0IDEKK3Rlc3QgIiRsb2MiIHx8IGxvYz0uCit0ZXN0IC14ICIkbG9jL3VzYWdlIiB8fCBleGl0IDEKK3Rlc3QgIiRTRUQiIHx8IFNFRD1zZWQKK3Rlc3QgIiRERCIgfHwgREQ9ZGQKKworIyBTb21lIHBlb3BsZSB3ZXJlIGJpdHRlbiBieSB0aGVpciBzeXN0ZW0gbGFja2luZyBhIChwcm9wZXIpIG9kCitvZCAtdiAtdCB4MSA8L2Rldi9udWxsID4vZGV2L251bGwKK2lmIHRlc3QgJD8gIT0gMDsgdGhlbgorCWVjaG8gJ29kIHRvb2wgaXMgbm90IGluc3RhbGxlZCBvciBjYW5ub3QgYWNjZXB0ICItdiAtdCB4MSIgb3B0aW9ucycKKwlleGl0IDEKK2ZpCisKK2V4ZWMgPiIkdGFyZ2V0LiQkIgorCitlY2hvICcjZGVmaW5lIFVOUEFDS0VEX1VTQUdFICIiIFwnCisiJGxvYy91c2FnZSIgfCBvZCAtdiAtdCB4MSBcCit8ICRTRUQgLWUgJ3MvXlteIF0qLy8nIFwKKwktZSAncy8gLy9nJyBcCisJLWUgJy9eJC9kJyBcCisJLWUgJ3MvXCguLlwpL1xceFwxL2cnIFwKKwktZSAncy9eLyIvJyBcCisJLWUgJ3MvJC8iIFxcLycKK2VjaG8gJycKKworZWNobyAnI2RlZmluZSBQQUNLRURfVVNBR0UgXCcKKyMjIEJyZWFrcyBvbiBiaWctZW5kaWFuIHN5c3RlbXMhCisjIyAjIEV4dHJhIGVmZm9ydCB0byBhdm9pZCB1c2luZyAib2QgLXQgeDEiOiAtdCBpcyBub3QgYXZhaWxhYmxlCisjIyAjIGluIG5vbi1DT05GSUdfREVTS1RPUGVkIGJ1c3lib3ggb2QKKyMjCisjIyAiJGxvYy91c2FnZSIgfCBiemlwMiAtMSB8IG9kIC12IC14IFwKKyMjIHwgJFNFRCAtZSAncy9eW14gXSovLycgXAorIyMJLWUgJ3MvIC8vZycgXAorIyMJLWUgJy9eJC9kJyBcCisjIwktZSAncy9cKC4uXClcKC4uXCkvMHhcMiwweFwxLC9nJworIyMJLWUgJ3MvJC8gXFwvJworIiRsb2MvdXNhZ2UiIHwgYnppcDIgLTEgfCAkREQgYnM9MiBza2lwPTEgMj4vZGV2L251bGwgfCBvZCAtdiAtdCB4MSBcCit8ICRTRUQgLWUgJ3MvXlteIF0qLy8nIFwKKwktZSAncy8gLy9nJyBcCisJLWUgJy9eJC9kJyBcCisJLWUgJ3MvXCguLlwpLzB4XDEsL2cnIFwKKwktZSAncy8kLyBcXC8nCitlY2hvICcnCisKK212IC0tICIkdGFyZ2V0LiQkIiAiJHRhcmdldCIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FwcGxldHMvdXNhZ2VfcG9kLmMgYi9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL3VzYWdlX3BvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWM0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcHBsZXRzL3VzYWdlX3BvZC5jCkBAIC0wLDAgKzEsMTExIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhdXRvY29uZi5oIgorCisjZGVmaW5lIFNLSVBfYXBwbGV0X21haW4KKyNkZWZpbmUgQUxJR04xIC8qIG5vdGhpbmcsIGp1c3QgdG8gcGxhY2F0ZSBhcHBsZXRfdGFibGVzLmggKi8KKyNkZWZpbmUgQUxJR04yIC8qIG5vdGhpbmcsIGp1c3QgdG8gcGxhY2F0ZSBhcHBsZXRfdGFibGVzLmggKi8KKyNpbmNsdWRlICJhcHBsZXRfdGFibGVzLmgiCisKKy8qIFNpbmNlIHdlIGNhbid0IHVzZSBwbGF0Zm9ybS5oLCBoYXZlIHRvIGRvIHRoaXMgYWdhaW4gYnkgaGFuZDogKi8KKyNpZiBFTkFCTEVfTk9NTVUKKyMgZGVmaW5lIEJCX01NVSAwCisjIGRlZmluZSBVU0VfRk9SX05PTU1VKC4uLikgX19WQV9BUkdTX18KKyMgZGVmaW5lIFVTRV9GT1JfTU1VKC4uLikKKyNlbHNlCisjIGRlZmluZSBCQl9NTVUgMQorIyBkZWZpbmUgVVNFX0ZPUl9OT01NVSguLi4pCisjIGRlZmluZSBVU0VfRk9SX01NVSguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworI2luY2x1ZGUgInVzYWdlLmgiCisjZGVmaW5lIE1BS0VfVVNBR0UoYW5hbWUsIHVzYWdlKSB7IGFuYW1lLCB1c2FnZSB9LAorc3RhdGljIHN0cnVjdCB1c2FnZV9kYXRhIHsKKwljb25zdCBjaGFyICphbmFtZTsKKwljb25zdCBjaGFyICp1c2FnZTsKK30gdXNhZ2VfYXJyYXlbXSA9IHsKKyNpbmNsdWRlICJhcHBsZXRzLmgiCit9OworCitzdGF0aWMgaW50IGNvbXBhcmVfZnVuYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCB1c2FnZV9kYXRhICp1YSA9IGE7CisJY29uc3Qgc3RydWN0IHVzYWdlX2RhdGEgKnViID0gYjsKKwlyZXR1cm4gc3RyY21wKHVhLT5hbmFtZSwgdWItPmFuYW1lKTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlpbnQgY29sLCBsZW4yOworCisJaW50IGk7CisJaW50IG51bV9tZXNzYWdlcyA9IHNpemVvZih1c2FnZV9hcnJheSkgLyBzaXplb2YodXNhZ2VfYXJyYXlbMF0pOworCisJaWYgKG51bV9tZXNzYWdlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXFzb3J0KHVzYWdlX2FycmF5LAorCQludW1fbWVzc2FnZXMsIHNpemVvZih1c2FnZV9hcnJheVswXSksCisJCWNvbXBhcmVfZnVuYyk7CisKKwljb2wgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fbWVzc2FnZXM7IGkrKykgeworCQlsZW4yID0gc3RybGVuKHVzYWdlX2FycmF5W2ldLmFuYW1lKSArIDI7CisJCWlmIChjb2wgPj0gNzYgLSBsZW4yKSB7CisJCQlwcmludGYoIixcbiIpOworCQkJY29sID0gMDsKKwkJfQorCQlpZiAoY29sID09IDApIHsKKwkJCWNvbCA9IDY7CisJCQlwcmludGYoIlx0Iik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiwgIik7CisJCX0KKwkJcHJpbnRmKHVzYWdlX2FycmF5W2ldLmFuYW1lKTsKKwkJY29sICs9IGxlbjI7CisJfQorCXByaW50ZigiXG5cbiIpOworCisJcHJpbnRmKCI9aGVhZDEgQ09NTUFORCBERVNDUklQVElPTlNcblxuIik7CisJcHJpbnRmKCI9b3ZlciA0XG5cbiIpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tZXNzYWdlczsgaSsrKSB7CisJCWlmICh1c2FnZV9hcnJheVtpXS5hbmFtZVswXSA+PSAnYScgJiYgdXNhZ2VfYXJyYXlbaV0uYW5hbWVbMF0gPD0gJ3onCisJCSAmJiB1c2FnZV9hcnJheVtpXS51c2FnZVswXSAhPSBOT1VTQUdFX1NUUlswXQorCQkpIHsKKwkJCXByaW50ZigiPWl0ZW0gQjwlcz5cblxuIiwgdXNhZ2VfYXJyYXlbaV0uYW5hbWUpOworCQkJaWYgKHVzYWdlX2FycmF5W2ldLnVzYWdlWzBdKQorCQkJCXByaW50ZigiJXMgJXNcblxuIiwgdXNhZ2VfYXJyYXlbaV0uYW5hbWUsIHVzYWdlX2FycmF5W2ldLnVzYWdlKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiVzXG5cbiIsIHVzYWdlX2FycmF5W2ldLmFuYW1lKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogVE9ETzogd2UgdXNlZCB0byBtYWtlIG9wdGlvbnMgYm9sZCB3aXRoIEI8PiBhbmQgb3V0cHV0IGFuIGV4YW1wbGUgdG9vOgorCis9aXRlbSBCPGNhdD4KKworY2F0IFtCPC11Pl0gW0ZJTEVdLi4uCisKK0NvbmNhdGVuYXRlIEZJTEUocykgYW5kIHByaW50IHRoZW0gdG8gc3Rkb3V0CisKK09wdGlvbnM6CisgICAgICAgIC11ICAgICAgVXNlIHVuYnVmZmVyZWQgaS9vIChpZ25vcmVkKQorCitFeGFtcGxlOgorICAgICAgICAkIGNhdCAvcHJvYy91cHRpbWUKKyAgICAgICAgMTEwNzE2LjcyIDE3LjY3CisKKyovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoL2kzODYvTWFrZWZpbGUgYi9idXN5Ym94LTEuMTkuMy9hcmNoL2kzODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjOTljNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGQgc3lzdGVtCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiBpcyBlc3NlbnRpYWwgaW4gcHJldmVudGluZyBnY2MgNC4yLngKKyMgZnJvbSBhbGlnbmluZyBzdGFjayB0byAxNiBieXRlcy4gKFdoaWNoIGlzIGdjYydzIHdheSBvZiBzdXBwb3J0aW5nIFNTRSkuCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9aTM4NiAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yLCkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzg4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9Db25maWcuc3JjCkBAIC0wLDAgKzEsMzc5IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJBcmNoaXZhbCBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgRkVBVFVSRV9TRUFNTEVTU19YWgorCWJvb2wgIk1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC54eiBkYXRhIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC54eiBkYXRhLgorCitjb25maWcgRkVBVFVSRV9TRUFNTEVTU19MWk1BCisJYm9vbCAiTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLmx6bWEgZGF0YSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAubHptYSBkYXRhLgorCitjb25maWcgRkVBVFVSRV9TRUFNTEVTU19CWjIKKwlib29sICJNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAuYnoyIGRhdGEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLmJ6MiBkYXRhLgorCitjb25maWcgRkVBVFVSRV9TRUFNTEVTU19HWgorCWJvb2wgIk1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC5neiBkYXRhIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC5neiBkYXRhLgorCitjb25maWcgRkVBVFVSRV9TRUFNTEVTU19aCisJYm9vbCAiTWFrZSB0YXIgYW5kIGd1bnppcCB1bmRlcnN0YW5kIC5aIGRhdGEiCisJZGVmYXVsdCBuCisJaGVscAorCSAgTWFrZSB0YXIgYW5kIGd1bnppcCB1bmRlcnN0YW5kIC5aIGRhdGEuCisKK2NvbmZpZyBBUgorCWJvb2wgImFyIgorCWRlZmF1bHQgbiAgIyBuZWVkcyB0byBiZSBpbXByb3ZlZCB0byBiZSBhYmxlIHRvIHJlcGxhY2UgYmludXRpbHMgYXIKKwloZWxwCisJICBhciBpcyBhbiBhcmNoaXZhbCB1dGlsaXR5IHByb2dyYW0gdXNlZCB0byBjcmVhdGUsIG1vZGlmeSwgYW5kCisJICBleHRyYWN0IGNvbnRlbnRzIGZyb20gYXJjaGl2ZXMuIEFuIGFyY2hpdmUgaXMgYSBzaW5nbGUgZmlsZSBob2xkaW5nCisJICBhIGNvbGxlY3Rpb24gb2Ygb3RoZXIgZmlsZXMgaW4gYSBzdHJ1Y3R1cmUgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0bworCSAgcmV0cmlldmUgdGhlIG9yaWdpbmFsIGluZGl2aWR1YWwgZmlsZXMgKGNhbGxlZCBhcmNoaXZlIG1lbWJlcnMpLgorCSAgVGhlIG9yaWdpbmFsIGZpbGVzJyBjb250ZW50cywgbW9kZSAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLAorCSAgYW5kIGdyb3VwIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIGFyY2hpdmUsIGFuZCBjYW4gYmUgcmVzdG9yZWQgb24KKwkgIGV4dHJhY3Rpb24uCisKKwkgIFRoZSBzdG9yZWQgZmlsZW5hbWUgaXMgbGltaXRlZCB0byAxNSBjaGFyYWN0ZXJzLiAoZm9yIG1vcmUgaW5mb3JtYXRpb24KKwkgIHNlZSBsb25nIGZpbGVuYW1lIHN1cHBvcnQpLgorCSAgYXIgaGFzIDYwIGJ5dGVzIG9mIG92ZXJoZWFkcyBmb3IgZXZlcnkgc3RvcmVkIGZpbGUuCisKKwkgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYXIgY2FuIGV4dHJhY3QgYXJjaGl2ZXMsIGl0IGNhbm5vdCBjcmVhdGUgb3IKKwkgIG1vZGlmeSB0aGVtLgorCSAgT24gYW4geDg2IHN5c3RlbSwgdGhlIGFyIGFwcGxldCBhZGRzIGFib3V0IDFLLgorCisJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBhciwgeW91IHNob3VsZAorCSAgcHJvYmFibHkgc2F5IE4gaGVyZS4KKworY29uZmlnIEZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMKKwlib29sICJTdXBwb3J0IGZvciBsb25nIGZpbGVuYW1lcyAobm90IG5lZWRlZCBmb3IgZGVicykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBUgorCWhlbHAKKwkgIEJ5IGRlZmF1bHQgdGhlIGFyIGZvcm1hdCBjYW4gb25seSBzdG9yZSB0aGUgZmlyc3QgMTUgY2hhcmFjdGVycworCSAgb2YgdGhlIGZpbGVuYW1lLCB0aGlzIG9wdGlvbiByZW1vdmVzIHRoYXQgbGltaXRhdGlvbi4KKwkgIEl0IHN1cHBvcnRzIHRoZSBHTlUgYXIgbG9uZyBmaWxlbmFtZSBtZXRob2Qgd2hpY2ggbW92ZXMgbXVsdGlwbGUgbG9uZworCSAgZmlsZW5hbWVzIGludG8gYSB0aGUgZGF0YSBzZWN0aW9uIG9mIGEgbmV3IGFyIGVudHJ5LgorCitjb25maWcgRkVBVFVSRV9BUl9DUkVBVEUKKwlib29sICJTdXBwb3J0IGFyY2hpdmUgY3JlYXRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBUgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBhcmNoaXZlIGNyZWF0aW9uICgtYyBhbmQgLXIpIHdpdGggYnVzeWJveCBhci4KKworY29uZmlnIEJVTlpJUDIKKwlib29sICJidW56aXAyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGJ1bnppcDIgaXMgYSBjb21wcmVzc2lvbiB1dGlsaXR5IHVzaW5nIHRoZSBCdXJyb3dzLVdoZWVsZXIgYmxvY2sKKwkgIHNvcnRpbmcgdGV4dCBjb21wcmVzc2lvbiBhbGdvcml0aG0sIGFuZCBIdWZmbWFuIGNvZGluZy4gQ29tcHJlc3Npb24KKwkgIGlzIGdlbmVyYWxseSBjb25zaWRlcmFibHkgYmV0dGVyIHRoYW4gdGhhdCBhY2hpZXZlZCBieSBtb3JlCisJICBjb252ZW50aW9uYWwgTFo3Ny9MWjc4LWJhc2VkIGNvbXByZXNzb3JzLCBhbmQgYXBwcm9hY2hlcyB0aGUKKwkgIHBlcmZvcm1hbmNlIG9mIHRoZSBQUE0gZmFtaWx5IG9mIHN0YXRpc3RpY2FsIGNvbXByZXNzb3JzLgorCisJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBidW56aXAyLCB5b3UKKwkgIHNob3VsZCBwcm9iYWJseSBzYXkgTiBoZXJlLgorCitjb25maWcgQlpJUDIKKwlib29sICJiemlwMiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBiemlwMiBpcyBhIGNvbXByZXNzaW9uIHV0aWxpdHkgdXNpbmcgdGhlIEJ1cnJvd3MtV2hlZWxlciBibG9jaworCSAgc29ydGluZyB0ZXh0IGNvbXByZXNzaW9uIGFsZ29yaXRobSwgYW5kIEh1ZmZtYW4gY29kaW5nLiBDb21wcmVzc2lvbgorCSAgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyYWJseSBiZXR0ZXIgdGhhbiB0aGF0IGFjaGlldmVkIGJ5IG1vcmUKKwkgIGNvbnZlbnRpb25hbCBMWjc3L0xaNzgtYmFzZWQgY29tcHJlc3NvcnMsIGFuZCBhcHByb2FjaGVzIHRoZQorCSAgcGVyZm9ybWFuY2Ugb2YgdGhlIFBQTSBmYW1pbHkgb2Ygc3RhdGlzdGljYWwgY29tcHJlc3NvcnMuCisKKwkgIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoaWNoIHJlcXVpcmVzIGJ6aXAyLCB5b3UKKwkgIHNob3VsZCBwcm9iYWJseSBzYXkgTiBoZXJlLgorCitjb25maWcgQ1BJTworCWJvb2wgImNwaW8iCisJZGVmYXVsdCB5CisJaGVscAorCSAgY3BpbyBpcyBhbiBhcmNoaXZhbCB1dGlsaXR5IHByb2dyYW0gdXNlZCB0byBjcmVhdGUsIG1vZGlmeSwgYW5kCisJICBleHRyYWN0IGNvbnRlbnRzIGZyb20gYXJjaGl2ZXMuCisJICBjcGlvIGhhcyAxMTAgYnl0ZXMgb2Ygb3ZlcmhlYWRzIGZvciBldmVyeSBzdG9yZWQgZmlsZS4KKworCSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBjcGlvIGNhbiBleHRyYWN0IGNwaW8gYXJjaGl2ZXMgY3JlYXRlZCBpbiB0aGUKKwkgICJuZXdjIiBvciAiY3JjIiBmb3JtYXQsIGl0IGNhbm5vdCBjcmVhdGUgb3IgbW9kaWZ5IHRoZW0uCisKKwkgIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoaWNoIHJlcXVpcmVzIGNwaW8sIHlvdQorCSAgc2hvdWxkIHByb2JhYmx5IHNheSBOIGhlcmUuCisKK2NvbmZpZyBGRUFUVVJFX0NQSU9fTworCWJvb2wgIlN1cHBvcnQgZm9yIGFyY2hpdmUgY3JlYXRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDUElPCisJaGVscAorCSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBjcGlvIGNhbiBjcmVhdGUgY3BpbyBhcmNoaXZlcyBpbiB0aGUgIm5ld2MiCisJICBmb3JtYXQgb25seS4KKworY29uZmlnIEZFQVRVUkVfQ1BJT19QCisJYm9vbCAiU3VwcG9ydCBmb3IgcGFzc3Rocm91Z2ggbW9kZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfQ1BJT19PCisJaGVscAorCSAgUGFzc3Rocm91Z2ggbW9kZS4gUmFyZWx5IHVzZWQuCisKK2NvbmZpZyBEUEtHCisJYm9vbCAiZHBrZyIKKwlkZWZhdWx0IG4KKwlzZWxlY3QgRkVBVFVSRV9TRUFNTEVTU19HWgorCWhlbHAKKwkgIGRwa2cgaXMgYSBtZWRpdW0tbGV2ZWwgdG9vbCB0byBpbnN0YWxsLCBidWlsZCwgcmVtb3ZlIGFuZCBtYW5hZ2UKKwkgIERlYmlhbiBwYWNrYWdlcy4KKworCSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBkcGtnIGhhcyBhIG51bWJlciBvZiBsaW1pdGF0aW9ucywKKwkgIHlvdSBzaG91bGQgdXNlIHRoZSBvZmZpY2lhbCBkcGtnIGlmIHBvc3NpYmxlLgorCitjb25maWcgRFBLR19ERUIKKwlib29sICJkcGtnX2RlYiIKKwlkZWZhdWx0IG4KKwlzZWxlY3QgRkVBVFVSRV9TRUFNTEVTU19HWgorCWhlbHAKKwkgIGRwa2ctZGViIHVucGFja3MgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IERlYmlhbiBhcmNoaXZlcy4KKworCSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBkcGtnLWRlYiBjYW5ub3QgcGFjayBhcmNoaXZlcy4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgZHBrZy1kZWIsCisJICBzYXkgTiBoZXJlLgorCitjb25maWcgRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkKKwlib29sICJFeHRyYWN0IG9ubHkgKC14KSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIERQS0dfREVCCisJaGVscAorCSAgVGhpcyByZWR1Y2VzIGRwa2ctZGViIHRvIHRoZSBlcXVpdmFsZW50IG9mCisJICAiYXIgLXAgPGRlYj4gZGF0YS50YXIuZ3ogfCB0YXIgLXp4Ii4gSG93ZXZlciBpdCBzYXZlcyBzcGFjZSBhcyBub25lCisJICBvZiB0aGUgZXh0cmEgZHBrZy1kZWIsIGFyIG9yIHRhciBvcHRpb25zIGFyZSBuZWVkZWQsIHRoZXkgYXJlIGxpbmtlZAorCSAgdG8gaW50ZXJuYWxseS4KKworY29uZmlnIEdVTlpJUAorCWJvb2wgImd1bnppcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBndW56aXAgaXMgdXNlZCB0byBkZWNvbXByZXNzIGFyY2hpdmVzIGNyZWF0ZWQgYnkgZ3ppcC4KKwkgIFlvdSBjYW4gdXNlIHRoZSBgLXQnIG9wdGlvbiB0byB0ZXN0IHRoZSBpbnRlZ3JpdHkgb2YKKwkgIGFuIGFyY2hpdmUsIHdpdGhvdXQgZGVjb21wcmVzc2luZyBpdC4KKworY29uZmlnIEdaSVAKKwlib29sICJnemlwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGd6aXAgaXMgdXNlZCB0byBjb21wcmVzcyBmaWxlcy4KKwkgIEl0J3MgcHJvYmFibHkgdGhlIG1vc3Qgd2lkZWx5IHVzZWQgVU5JWCBjb21wcmVzc2lvbiBwcm9ncmFtLgorCitjb25maWcgRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBHWklQICYmIExPTkdfT1BUUworCWhlbHAKKwkgIEVuYWJsZSB1c2Ugb2YgbG9uZyBvcHRpb25zLCBpbmNyZWFzZXMgc2l6ZSBieSBhYm91dCAxMDYgQnl0ZXMKKworY29uZmlnIExaT1AKKwlib29sICJsem9wIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEx6b3AgY29tcHJlc3Npb24vZGVjb21wcmVzaW9uLgorCitjb25maWcgTFpPUF9DT01QUl9ISUdICisJYm9vbCAibHpvcCBjb21wcmVzc2lvbiBsZXZlbHMgNyw4LDkgKG5vdCB2ZXJ5IHVzZWZ1bCkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBMWk9QCisJaGVscAorCSAgSGlnaCBsZXZlbHMgKDcsOCw5KSBvZiBsem9wIGNvbXByZXNzaW9uLiBUaGVzZSBsZXZlbHMKKwkgIGFyZSBhY3R1YWxseSBzbG93ZXIgdGhhbiBnemlwIGF0IGVxdWl2YWxlbnQgY29tcHJlc3Npb24gcmF0aW9zCisJICBhbmQgdGFrZSB1cCAzLjJLIG9mIGNvZGUuCisKK2NvbmZpZyBSUE0yQ1BJTworCWJvb2wgInJwbTJjcGlvIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvbnZlcnRzIGEgUlBNIGZpbGUgaW50byBhIENQSU8gYXJjaGl2ZS4KKworY29uZmlnIFJQTQorCWJvb2wgInJwbSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNaW5pIFJQTSBhcHBsZXQgLSBxdWVyaWVzIGFuZCBleHRyYWN0cyBSUE0gcGFja2FnZXMuCisKK2NvbmZpZyBUQVIKKwlib29sICJ0YXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdGFyIGlzIGFuIGFyY2hpdmluZyBwcm9ncmFtLiBJdCdzIGNvbW1vbmx5IHVzZWQgd2l0aCBnemlwIHRvCisJICBjcmVhdGUgY29tcHJlc3NlZCBhcmNoaXZlcy4gSXQncyBwcm9iYWJseSB0aGUgbW9zdCB3aWRlbHkgdXNlZAorCSAgVU5JWCBhcmNoaXZlIHByb2dyYW0uCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9DUkVBVEUKKwlib29sICJFbmFibGUgYXJjaGl2ZSBjcmVhdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUgorCWhlbHAKKwkgIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24geW91J2xsIGJlIGFibGUgdG8gY3JlYXRlCisJICB0YXIgYXJjaGl2ZXMgdXNpbmcgdGhlIGAtYycgb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9UQVJfQVVUT0RFVEVDVAorCWJvb2wgIkF1dG9kZXRlY3QgY29tcHJlc3NlZCB0YXJiYWxscyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUiAmJiAoRkVBVFVSRV9TRUFNTEVTU19aIHx8IEZFQVRVUkVfU0VBTUxFU1NfR1ogfHwgRkVBVFVSRV9TRUFNTEVTU19CWjIgfHwgRkVBVFVSRV9TRUFNTEVTU19MWk1BIHx8IEZFQVRVUkVfU0VBTUxFU1NfWFopCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiB0YXIgY2FuIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNvbXByZXNzZWQKKwkgIHRhcmJhbGxzLiBDdXJyZW50bHkgaXQgd29ya3Mgb25seSBvbiBmaWxlcyAobm90IHBpcGVzIGV0YykuCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9GUk9NCisJYm9vbCAiRW5hYmxlIC1YIChleGNsdWRlIGZyb20pIGFuZCAtVCAoaW5jbHVkZSBmcm9tKSBvcHRpb25zKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUgorCWhlbHAKKwkgIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24geW91J2xsIGJlIGFibGUgdG8gc3BlY2lmeQorCSAgYSBsaXN0IG9mIGZpbGVzIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBmcm9tIGFuIGFyY2hpdmUuCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWQorCWJvb2wgIlN1cHBvcnQgZm9yIG9sZCB0YXIgaGVhZGVyIGZvcm1hdCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUiB8fCBEUEtHCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgdG8gdW5wYWNrIGFyY2hpdmVzIGNyZWF0ZWQgaW4KKwkgIHRoZSBvbGQgR05VIGZvcm1hdDsgaGVscCB0byBraWxsIHRoaXMgb2xkIGZvcm1hdCBieQorCSAgcmVwYWNraW5nIHlvdXIgYW5jaWVudCBhcmNoaXZlcyB3aXRoIHRoZSBuZXcgZm9ybWF0LgorCitjb25maWcgRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkKKwlib29sICJFbmFibGUgdW50YXJyaW5nIG9mIHRhcmJhbGxzIHdpdGggY2hlY2tzdW1zIHByb2R1Y2VkIGJ5IGJ1Z2d5IFN1biB0YXIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIgfHwgRFBLRworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHVucGFjayBhcmNoaXZlcyBjcmVhdGVkIGJ5IHNvbWUgb2xkCisJICB2ZXJzaW9uIG9mIFN1bidzIHRhciAoaXQgd2FzIGNhbGN1bGF0aW5nIGNoZWNrc3VtIHVzaW5nIHNpZ25lZAorCSAgYXJpdGhtZXRpYykuIEl0IGlzIHNhaWQgdG8gYmUgZml4ZWQgaW4gbmV3ZXIgU3VuIHRhciwgYnV0ICJvbGQiCisJICB0YXJiYWxscyBzdGlsbCBleGlzdC4KKworY29uZmlnIEZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisJYm9vbCAiU3VwcG9ydCBmb3IgR05VIHRhciBleHRlbnNpb25zIChsb25nIGZpbGVuYW1lcykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIgfHwgRFBLRworCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gYnVzeWJveCBzdXBwb3J0cyBHTlUgbG9uZyBmaWxlbmFtZXMgYW5kCisJICBsaW5rbmFtZXMuCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSICYmIExPTkdfT1BUUworCWhlbHAKKwkgIEVuYWJsZSB1c2Ugb2YgbG9uZyBvcHRpb25zLCBpbmNyZWFzZXMgc2l6ZSBieSBhYm91dCA0MDAgQnl0ZXMKKworY29uZmlnIEZFQVRVUkVfVEFSX1RPX0NPTU1BTkQKKwlib29sICJTdXBwb3J0IGZvciB3cml0aW5nIHRvIGFuIGV4dGVybmFsIHByb2dyYW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIgJiYgRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TCisJaGVscAorCSAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiB5b3UnbGwgYmUgYWJsZSB0byBpbnN0cnVjdCB0YXIgdG8gc2VuZAorCSAgdGhlIGNvbnRlbnRzIG9mIGVhY2ggZXh0cmFjdGVkIGZpbGUgdG8gdGhlIHN0YW5kYXJkIGlucHV0IG9mIGFuCisJICBleHRlcm5hbCBwcm9ncmFtLgorCitjb25maWcgRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwlib29sICJFbmFibGUgdXNlIG9mIHVzZXIgYW5kIGdyb3VwIG5hbWVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSCisJaGVscAorCSAgRW5hYmxlcyB1c2Ugb2YgdXNlciBhbmQgZ3JvdXAgbmFtZXMgaW4gdGFyLiBUaGlzIGFmZmVjdHMgY29udGVudHMKKwkgIGxpc3RpbmdzICgtdCkgYW5kIHByZXNlcnZpbmcgcGVybWlzc2lvbnMgd2hlbiB1bnBhY2tpbmcgKC1wKS4KKwkgICsyMDAgYnl0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUKKwlib29sICJFbmFibGUgLW0gKGRvIG5vdCBwcmVzZXJ2ZSB0aW1lKSBvcHRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIGJ1c3lib3ggc3VwcG9ydHMgR05VIHRhciAtbQorCSAgKGRvIG5vdCBwcmVzZXJ2ZSB0aW1lKSBvcHRpb24uCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9TRUxJTlVYCisJYm9vbCAiU3VwcG9ydCBmb3IgZXh0cmFjdGluZyBTRUxpbnV4IGxhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFRBUiAmJiBTRUxJTlVYCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBidXN5Ym94IHN1cHBvcnRzIHJlc3RvcmluZyBTRUxpbnV4IGxhYmVscworCSAgd2hlbiBleHRyYWN0aW5nIGZpbGVzIGZyb20gdGFyIGFyY2hpdmVzLgorCitjb25maWcgVU5DT01QUkVTUworCWJvb2wgInVuY29tcHJlc3MiCisJZGVmYXVsdCBuCisJaGVscAorCSAgdW5jb21wcmVzcyBpcyB1c2VkIHRvIGRlY29tcHJlc3MgYXJjaGl2ZXMgY3JlYXRlZCBieSBjb21wcmVzcy4KKwkgIE5vdCBtdWNoIHVzZWQgYW55bW9yZSwgcmVwbGFjZWQgYnkgZ3ppcC9ndW56aXAuCisKK2NvbmZpZyBVTkxaTUEKKwlib29sICJ1bmx6bWEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdW5sem1hIGlzIGEgY29tcHJlc3Npb24gdXRpbGl0eSB1c2luZyB0aGUgTGVtcGVsLVppdi1NYXJrb3YgY2hhaW4KKwkgIGNvbXByZXNzaW9uIGFsZ29yaXRobSwgYW5kIHJhbmdlIGNvZGluZy4gQ29tcHJlc3Npb24KKwkgIGlzIGdlbmVyYWxseSBjb25zaWRlcmFibHkgYmV0dGVyIHRoYW4gdGhhdCBhY2hpZXZlZCBieSB0aGUgYnppcDIKKwkgIGNvbXByZXNzb3JzLgorCisJICBUaGUgQnVzeUJveCB1bmx6bWEgYXBwbGV0IGlzIGxpbWl0ZWQgdG8gZGUtY29tcHJlc3Npb24gb25seS4KKwkgIE9uIGFuIHg4NiBzeXN0ZW0sIHRoaXMgYXBwbGV0IGFkZHMgYWJvdXQgNEsuCisKKwkgIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoaWNoIHJlcXVpcmVzIHVubHptYSwgeW91CisJICBzaG91bGQgcHJvYmFibHkgc2F5IE4gaGVyZS4KKworY29uZmlnIEZFQVRVUkVfTFpNQV9GQVNUCisJYm9vbCAiT3B0aW1pemUgdW5sem1hIGZvciBzcGVlZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVOTFpNQQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHJlZHVjZXMgZGVjb21wcmVzc2lvbiB0aW1lIGJ5IGFib3V0IDI1JSBhdCB0aGUgY29zdCBvZgorCSAgYSAxSyBiaWdnZXIgYmluYXJ5LgorCitjb25maWcgTFpNQQorCWJvb2wgIlByb3ZpZGUgbHptYSBhbGlhcyB3aGljaCBzdXBwb3J0cyBvbmx5IHVucGFja2luZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVOTFpNQQorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCBjb21tYW5kcyBsaWtlICJsem1hIC1kIiB0byB3b3JrLgorCSAgSU9XOiB5b3UnbGwgZ2V0IGx6bWEgYXBwbGV0LCBidXQgaXQgd2lsbCBhbHdheXMgcmVxdWlyZSAtZCBvcHRpb24uCisKK2NvbmZpZyBVTlhaCisJYm9vbCAidW54eiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1bnh6IGlzIGEgdW5sem1hIHN1Y2Nlc3Nvci4KKworY29uZmlnIFhaCisJYm9vbCAiUHJvdmlkZSB4eiBhbGlhcyB3aGljaCBzdXBwb3J0cyBvbmx5IHVucGFja2luZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVOWFoKKwloZWxwCisJICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgY29tbWFuZHMgbGlrZSAieHogLWQiIHRvIHdvcmsuCisJICBJT1c6IHlvdSdsbCBnZXQgeHogYXBwbGV0LCBidXQgaXQgd2lsbCBhbHdheXMgcmVxdWlyZSAtZCBvcHRpb24uCisKK2NvbmZpZyBVTlpJUAorCWJvb2wgInVuemlwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVuemlwIHdpbGwgbGlzdCBvciBleHRyYWN0IGZpbGVzIGZyb20gYSBaSVAgYXJjaGl2ZSwKKwkgIGNvbW1vbmx5IGZvdW5kIG9uIERPUy9XSU4gc3lzdGVtcy4gVGhlIGRlZmF1bHQgYmVoYXZpb3IKKwkgICh3aXRoIG5vIG9wdGlvbnMpIGlzIHRvIGV4dHJhY3QgdGhlIGFyY2hpdmUgaW50byB0aGUKKwkgIGN1cnJlbnQgZGlyZWN0b3J5LiBVc2UgdGhlIGAtZCcgb3B0aW9uIHRvIGV4dHJhY3QgdG8gYQorCSAgZGlyZWN0b3J5IG9mIHlvdXIgY2hvaWNlLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY2NDUyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDMwIEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGlicy15CQkJCSs9IGxpYmFyY2hpdmUvCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19BUikJCSs9IGFyLm8KK2xpYi0kKENPTkZJR19DUElPKQkJKz0gY3Bpby5vCitsaWItJChDT05GSUdfRFBLRykJCSs9IGRwa2cubworbGliLSQoQ09ORklHX0RQS0dfREVCKQkJKz0gZHBrZ19kZWIubworbGliLSQoQ09ORklHX1JQTTJDUElPKQkJKz0gcnBtMmNwaW8ubworbGliLSQoQ09ORklHX1JQTSkJCSs9IHJwbS5vCitsaWItJChDT05GSUdfVEFSKQkJKz0gdGFyLm8KK2xpYi0kKENPTkZJR19VTlpJUCkJCSs9IHVuemlwLm8KKworbGliLSQoQ09ORklHX0xaT1ApCQkrPSBsem9wLm8gYmJ1bnppcC5vCitsaWItJChDT05GSUdfR1pJUCkJCSs9IGd6aXAubyBiYnVuemlwLm8KK2xpYi0kKENPTkZJR19CWklQMikJCSs9IGJ6aXAyLm8gYmJ1bnppcC5vCisKK2xpYi0kKENPTkZJR19VTlhaKQkJKz0gYmJ1bnppcC5vCitsaWItJChDT05GSUdfVU5MWk1BKQkJKz0gYmJ1bnppcC5vCitsaWItJChDT05GSUdfQlVOWklQMikJCSs9IGJidW56aXAubworbGliLSQoQ09ORklHX0dVTlpJUCkJCSs9IGJidW56aXAubworbGliLSQoQ09ORklHX1VOQ09NUFJFU1MpCSs9IGJidW56aXAubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvYXIuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhZDIwZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2FyLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgYXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIEJhc2VkIGluIHBhcnQgb24gQnVzeUJveCB0YXIsIERlYmlhbiBkcGtnLWRlYiBhbmQgR05VIGFyLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXJjaGl2ZSBjcmVhdGlvbiBzdXBwb3J0OgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV3JpdHRlbiBieSBBbGV4YW5kZXIgU2hpc2hraW4uCisgKgorICogVGhlcmUgaXMgbm8gc2luZ2xlIHN0YW5kYXJkIHRvIGFkaGVyZSB0byBzbyBhciBtYXkgbm90IHBvcnRhYmxlCisgKiBiZXR3ZWVuIGRpZmZlcmVudCBzeXN0ZW1zCisgKiBodHRwOi8vd3d3LnVuaXgtc3lzdGVtcy5vcmcvc2luZ2xlX3VuaXhfc3BlY2lmaWNhdGlvbl92Mi94Y3UvYXIuaHRtbAorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1vXSBbLXZdIFstcF0gWy10XSBbLXhdIEFSQ0hJVkUgRklMRVMiCisvL3VzYWdlOiNkZWZpbmUgYXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFeHRyYWN0IG9yIGxpc3QgRklMRVMgZnJvbSBhbiBhciBhcmNoaXZlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1vCVByZXNlcnZlIG9yaWdpbmFsIGRhdGVzIgorLy91c2FnZTogICAgICJcbgktcAlFeHRyYWN0IHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJTGlzdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJRXh0cmFjdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorI2luY2x1ZGUgImFyLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BUl9DUkVBVEUKKy8qIGZpbHRlciBvdXQgZW50cmllcyB3aXRoIHNhbWUgbmFtZXMgYXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KK3N0YXRpYyBjaGFyIEZBU1RfRlVOQyBmaWx0ZXJfcmVwbGFjZWFibGUoYXJjaGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQoreworCWlmIChmaW5kX2xpc3RfZW50cnkoaGFuZGxlLT5hY2NlcHQsIGhhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUpKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgb3V0cHV0X2FyX2hlYWRlcihhcmNoaXZlX2hhbmRsZV90ICpoYW5kbGUpCit7CisJLyogR05VIGFyIDIuMTkuNTEuMC4xNCBjcmVhdGVzIG1hbGZvcm1lZCBhcmNoaXZlcworCSAqIGlmIGlucHV0IGZpbGVzIGFyZSA+MTBHLiBJdCBhbHNvIHRydW5jYXRlcyBmaWxlcyA+NEdCCisJICogKHVzZXMgInNpemUgbW9kIDRHIikuIFdlIGFib3J0IGluIHRoaXMgY2FzZToKKwkgKiBXZSBjb3VsZCBhZGQgc3VwcG9ydCBmb3IgdXAgdG8gMTBHIGZpbGVzLCBidXQgdGhpcyBpcyB1bmxpa2VseSB0byBiZSB1c2VmdWwuCisJICogTm90ZSB0aGF0IHVucGFja2luZyBzaWRlIGxpbWl0cyBhbGwgZmllbGRzIHRvICJ1bnNpZ25lZCBpbnQiIGRhdGEgdHlwZSwKKwkgKiBhbmQgdHJlYXRzICJhbGwgb25lcyIgYXMgYW4gZXJyb3IgaW5kaWNhdG9yLiBUaHVzIG1heCB3ZSBhbGxvdyBoZXJlIGlzIFVJTlRfTUFYLTEuCisJICovCisJZW51bSB7CisJCS8qIGZvciAybmQgZmllbGQ6IG10aW1lICovCisJCU1BWDExQ0hBUlMgPSBVSU5UX01BWCA+IDB4ZmZmZmZmZmYgPyAodW5zaWduZWQpOTk5OTk5OTk5OTkgOiBVSU5UX01BWC0xLAorCQkvKiBmb3IgbGFzdCBmaWVsZDogZmlsZXNpemUgKi8KKwkJTUFYMTBDSEFSUyA9IFVJTlRfTUFYID4gMHhmZmZmZmZmZiA/ICh1bnNpZ25lZCk5OTk5OTk5OTk5IDogVUlOVF9NQVgtMSwKKwl9OworCisJc3RydWN0IGZpbGVfaGVhZGVyX3QgKmZoID0gaGFuZGxlLT5maWxlX2hlYWRlcjsKKworCWlmIChoYW5kbGUtPm9mZnNldCAmIDEpIHsKKwkJeHdyaXRlKGhhbmRsZS0+c3JjX2ZkLCAiXG4iLCAxKTsKKwkJaGFuZGxlLT5vZmZzZXQrKzsKKwl9CisKKwkvKiBDYXJlZnVsISBUaGUgd2lkdGhzIHNob3VsZCBiZSBleGFjdC4gRmllbGRzIG11c3QgYmUgc2VwYXJhdGVkICovCisJaWYgKHNpemVvZihvZmZfdCkgPiA0ICYmIGZoLT5zaXplID4gKG9mZl90KU1BWDEwQ0hBUlMpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgaXMgYmlnZ2VyIHRoYW4gYXIgY2FuIGhhbmRsZSIsIGZoLT5uYW1lKTsKKwl9CisJZmRwcmludGYoaGFuZGxlLT5zcmNfZmQsICIlLTE2LjE2cyUtMTJsdSUtNnUlLTZ1JS04byUtMTAiT0ZGX0ZNVCJ1YFxuIiwKKwkJCWZoLT5uYW1lLAorCQkJKHNpemVvZih0aW1lX3QpID4gNCAmJiBmaC0+bXRpbWUgPiBNQVgxMUNIQVJTKSA/IChsb25nKTAgOiAobG9uZylmaC0+bXRpbWUsCisJCQlmaC0+dWlkID4gOTk5OTkgPyAwIDogKGludClmaC0+dWlkLAorCQkJZmgtPmdpZCA+IDk5OTk5ID8gMCA6IChpbnQpZmgtPmdpZCwKKwkJCShpbnQpZmgtPm1vZGUgJiAwNzc3Nzc3NywKKwkJCWZoLT5zaXplCisJKTsKKworCWhhbmRsZS0+b2Zmc2V0ICs9IEFSX0hFQURFUl9MRU47Cit9CisKKy8qCisgKiB3aGVuIHJlcGxhY2luZyBmaWxlcyBpbiBhbiBleGlzdGluZyBhcmNoaXZlLCBjb3B5IGZyb20gdGhlCisgKiBvcmlnaW5hbCBhcmNoaXZlIHRob3NlIGZpbGVzIHRoYXQgYXJlIHRvIGJlIGxlZnQgaW50YWN0CisgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb3B5X2RhdGEoYXJjaGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQoreworCWFyY2hpdmVfaGFuZGxlX3QgKm91dF9oYW5kbGUgPSBoYW5kbGUtPmFyX19vdXQ7CisJc3RydWN0IGZpbGVfaGVhZGVyX3QgKmZoID0gaGFuZGxlLT5maWxlX2hlYWRlcjsKKworCW91dF9oYW5kbGUtPmZpbGVfaGVhZGVyID0gZmg7CisJb3V0cHV0X2FyX2hlYWRlcihvdXRfaGFuZGxlKTsKKworCWJiX2NvcHlmZF9leGFjdF9zaXplKGhhbmRsZS0+c3JjX2ZkLCBvdXRfaGFuZGxlLT5zcmNfZmQsIGZoLT5zaXplKTsKKwlvdXRfaGFuZGxlLT5vZmZzZXQgKz0gZmgtPnNpemU7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfYXJfaGVhZGVyKGFyY2hpdmVfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwljaGFyICpmbjsKKwljaGFyIGZuX2hbMTddOyAvKiAxNSArICIvIiArIE5VTCAqLworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKworCWZuID0gbGxpc3RfcG9wKCZoYW5kbGUtPmFjY2VwdCk7CisJaWYgKCFmbikKKwkJcmV0dXJuIC0xOworCisJeHN0YXQoZm4sICZzdCk7CisKKwloYW5kbGUtPmZpbGVfaGVhZGVyLT5tdGltZSA9IHN0LnN0X210aW1lOworCWhhbmRsZS0+ZmlsZV9oZWFkZXItPnVpZCA9IHN0LnN0X3VpZDsKKwloYW5kbGUtPmZpbGVfaGVhZGVyLT5naWQgPSBzdC5zdF9naWQ7CisJaGFuZGxlLT5maWxlX2hlYWRlci0+bW9kZSA9IHN0LnN0X21vZGU7CisJaGFuZGxlLT5maWxlX2hlYWRlci0+c2l6ZSA9IHN0LnN0X3NpemU7CisJaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSA9IGZuX2g7CisvL1RPRE86IGlmIEVOQUJMRV9GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTLi4uCisJc3ByaW50Zihmbl9oLCAiJS4xNXMvIiwgYmJfYmFzZW5hbWUoZm4pKTsKKworCW91dHB1dF9hcl9oZWFkZXIoaGFuZGxlKTsKKworCWZkID0geG9wZW4oZm4sIE9fUkRPTkxZKTsKKwliYl9jb3B5ZmRfZXhhY3Rfc2l6ZShmZCwgaGFuZGxlLT5zcmNfZmQsIHN0LnN0X3NpemUpOworCWNsb3NlKGZkKTsKKwloYW5kbGUtPm9mZnNldCArPSBzdC5zdF9zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfYXJfYXJjaGl2ZShhcmNoaXZlX2hhbmRsZV90ICpoYW5kbGUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJYXJjaGl2ZV9oYW5kbGVfdCAqb3V0X2hhbmRsZTsKKworCXhmc3RhdChoYW5kbGUtPnNyY19mZCwgJnN0LCBoYW5kbGUtPmFyX19uYW1lKTsKKworCS8qIGlmIGFyY2hpdmUgZXhpc3RzLCBjcmVhdGUgYSBuZXcgaGFuZGxlIGZvciBvdXRwdXQuCisJICogd2UgY3JlYXRlIGl0IGluIHBsYWNlIG9mIHRoZSBvbGQgb25lLgorCSAqLworCWlmIChzdC5zdF9zaXplICE9IDApIHsKKwkJb3V0X2hhbmRsZSA9IGluaXRfaGFuZGxlKCk7CisJCXh1bmxpbmsoaGFuZGxlLT5hcl9fbmFtZSk7CisJCW91dF9oYW5kbGUtPnNyY19mZCA9IHhvcGVuKGhhbmRsZS0+YXJfX25hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpOworCQlvdXRfaGFuZGxlLT5hY2NlcHQgPSBoYW5kbGUtPmFjY2VwdDsKKwl9IGVsc2UgeworCQlvdXRfaGFuZGxlID0gaGFuZGxlOworCX0KKworCWhhbmRsZS0+YXJfX291dCA9IG91dF9oYW5kbGU7CisKKwl4d3JpdGUob3V0X2hhbmRsZS0+c3JjX2ZkLCBBUl9NQUdJQyAiXG4iLCBBUl9NQUdJQ19MRU4gKyAxKTsKKwlvdXRfaGFuZGxlLT5vZmZzZXQgKz0gQVJfTUFHSUNfTEVOICsgMTsKKworCS8qIHNraXAgdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSBpZiB3ZSBoYXZlIHRvIGFwcGVuZCBzdHVmZiAqLworCWlmIChzdC5zdF9zaXplICE9IDApIHsKKwkJaGFuZGxlLT5maWx0ZXIgPSBmaWx0ZXJfcmVwbGFjZWFibGU7CisJCWhhbmRsZS0+YWN0aW9uX2RhdGEgPSBjb3B5X2RhdGE7CisJCXVucGFja19hcl9hcmNoaXZlKGhhbmRsZSk7CisJfQorCisJd2hpbGUgKHdyaXRlX2FyX2hlYWRlcihvdXRfaGFuZGxlKSA9PSAwKQorCQljb250aW51ZTsKKworCS8qIG9wdGlvbmFsLCBzaW5jZSB3ZSBleGl0IHJpZ2h0IGFmdGVyIHdlIHJldHVybiAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShoYW5kbGUtPnNyY19mZCk7CisJCWlmIChvdXRfaGFuZGxlLT5zcmNfZmQgIT0gaGFuZGxlLT5zcmNfZmQpCisJCQljbG9zZShvdXRfaGFuZGxlLT5zcmNfZmQpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9BUl9DUkVBVEUgKi8KKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGhlYWRlcl92ZXJib3NlX2xpc3RfYXIoY29uc3QgZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIpCit7CisJY29uc3QgY2hhciAqbW9kZSA9IGJiX21vZGVfc3RyaW5nKGZpbGVfaGVhZGVyLT5tb2RlKTsKKwljaGFyICptdGltZTsKKworCW10aW1lID0gY3RpbWUoJmZpbGVfaGVhZGVyLT5tdGltZSk7CisJbXRpbWVbMTZdID0gJyAnOworCW1lbW1vdmUoJm10aW1lWzE3XSwgJm10aW1lWzIwXSwgNCk7CisJbXRpbWVbMjFdID0gJ1wwJzsKKwlwcmludGYoIiVzICV1LyV1JTciT0ZGX0ZNVCJ1ICVzICVzXG4iLCAmbW9kZVsxXSwKKwkJCShpbnQpZmlsZV9oZWFkZXItPnVpZCwgKGludClmaWxlX2hlYWRlci0+Z2lkLAorCQkJZmlsZV9oZWFkZXItPnNpemUsCisJCQkmbXRpbWVbNF0sIGZpbGVfaGVhZGVyLT5uYW1lCisJKTsKK30KKworI2RlZmluZSBBUl9PUFRfVkVSQk9TRSAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBBUl9PUFRfUFJFU0VSVkVfREFURSAgICAoMSA8PCAxKQorLyogImFyIHIiIGltcGxpZXMgY3JlYXRlLCBidXQgd2FybnMgYWJvdXQgaXQuIGMgc3VwcHJlc3NlcyB3YXJuaW5nLgorICogYmJveCBhY2NlcHRzIGJ1dCBpZ25vcmVzIGl0OiAqLworI2RlZmluZSBBUl9PUFRfQ1JFQVRFICAgICAgICAgICAoMSA8PCAyKQorCisjZGVmaW5lIEFSX0NNRF9QUklOVCAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEZJUlNUX0NNRCAgICAgICAgICAgICAgIEFSX0NNRF9QUklOVAorI2RlZmluZSBBUl9DTURfTElTVCAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBBUl9DTURfRVhUUkFDVCAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBBUl9DTURfSU5TRVJUICAgICAgICAgICAoMSA8PCA2KQorCitpbnQgYXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZTsKKwl1bnNpZ25lZCBvcHQsIHQ7CisKKwlhcmNoaXZlX2hhbmRsZSA9IGluaXRfaGFuZGxlKCk7CisKKwkvKiAtLTogcHJlcGVuZCAnLScgdG8gdGhlIGZpcnN0IGFyZ3VtZW50IGlmIHJlcXVpcmVkICovCisJLyogLTE6IGF0IGxlYXN0IG9uZSBwYXJhbSBpcyByZXFkICovCisJLyogb25lIG9mIHAsdCx4WyxyXSBpcyByZXF1aXJlZCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0tOi0xOnA6dDp4IklGX0ZFQVRVUkVfQVJfQ1JFQVRFKCI6ciIpOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJ2b2MiInB0eCJJRl9GRUFUVVJFX0FSX0NSRUFURSgiciIpKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXQgPSBvcHQgLyBGSVJTVF9DTUQ7CisJaWYgKHQgJiAodC0xKSkgLyogbW9yZSB0aGFuIG9uZSBvZiBwLHQseFsscl0gYXJlIHNwZWNpZmllZCAqLworCQliYl9zaG93X3VzYWdlKCk7CisKKwlpZiAob3B0ICYgQVJfQ01EX1BSSU5UKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF90b19zdGRvdXQ7CisJfQorCWlmIChvcHQgJiBBUl9DTURfTElTVCkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl9saXN0OworCX0KKwlpZiAob3B0ICYgQVJfQ01EX0VYVFJBQ1QpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X2FsbDsKKwl9CisJaWYgKG9wdCAmIEFSX09QVF9QUkVTRVJWRV9EQVRFKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyB8PSBBUkNISVZFX1JFU1RPUkVfREFURTsKKwl9CisJaWYgKG9wdCAmIEFSX09QVF9WRVJCT1NFKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX3ZlcmJvc2VfbGlzdF9hcjsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfQVJfQ1JFQVRFCisJYXJjaGl2ZV9oYW5kbGUtPmFyX19uYW1lID0gKmFyZ3Y7CisjZW5kaWYKKwlhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkID0geG9wZW4oKmFyZ3YrKywKKwkJCShvcHQgJiBBUl9DTURfSU5TRVJUKQorCQkJCT8gT19SRFdSIHwgT19DUkVBVAorCQkJCTogT19SRE9OTFkKKwkpOworCisJaWYgKCphcmd2KQorCQlhcmNoaXZlX2hhbmRsZS0+ZmlsdGVyID0gZmlsdGVyX2FjY2VwdF9saXN0OworCXdoaWxlICgqYXJndikgeworCQlsbGlzdF9hZGRfdG9fZW5kKCZhcmNoaXZlX2hhbmRsZS0+YWNjZXB0LCAqYXJndisrKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BUl9DUkVBVEUKKwlpZiAob3B0ICYgQVJfQ01EX0lOU0VSVCkKKwkJcmV0dXJuIHdyaXRlX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGUpOworI2VuZGlmCisKKwl1bnBhY2tfYXJfYXJjaGl2ZShhcmNoaXZlX2hhbmRsZSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvYmJ1bnppcC5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvYmJ1bnppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMWVjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9iYnVuemlwLmMKQEAgLTAsMCArMSw0NzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvbW1vbiBjb2RlIGZvciBndW56aXAtbGlrZSBhcHBsZXRzCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCitlbnVtIHsKKwlPUFRfU1RET1VUICAgICA9IDEgPDwgMCwKKwlPUFRfRk9SQ0UgICAgICA9IDEgPDwgMSwKKwkvKiBvbmx5IHNvbWUgZGVjb21wcmVzc29yczogKi8KKwlPUFRfVkVSQk9TRSAgICA9IDEgPDwgMiwKKwlPUFRfREVDT01QUkVTUyA9IDEgPDwgMywKKwlPUFRfVEVTVCAgICAgICA9IDEgPDwgNCwKK307CisKK3N0YXRpYworaW50IG9wZW5fdG9fb3Jfd2FybihpbnQgdG9fZmQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQoreworCWludCBmZCA9IG9wZW4zX29yX3dhcm4oZmlsZW5hbWUsIGZsYWdzLCBtb2RlKTsKKwlpZiAoZmQgPCAwKSB7CisJCXJldHVybiAxOworCX0KKwl4bW92ZV9mZChmZCwgdG9fZmQpOworCXJldHVybiAwOworfQorCitjaGFyKiBGQVNUX0ZVTkMgYXBwZW5kX2V4dChjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXhwZWN0ZWRfZXh0KQoreworCXJldHVybiB4YXNwcmludGYoIiVzLiVzIiwgZmlsZW5hbWUsIGV4cGVjdGVkX2V4dCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgYmJ1bnBhY2soY2hhciAqKmFyZ3YsCisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp1bnBhY2tlcikodW5wYWNrX2luZm9fdCAqaW5mbyksCisJY2hhciogRkFTVF9GVU5DICgqbWFrZV9uZXdfbmFtZSkoY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dCksCisJY29uc3QgY2hhciAqZXhwZWN0ZWRfZXh0CispCit7CisJc3RydWN0IHN0YXQgc3RhdF9idWY7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBzdGF0dXM7CisJY2hhciAqZmlsZW5hbWUsICpuZXdfbmFtZTsKKwlzbWFsbGludCBleGl0Y29kZSA9IDA7CisJdW5wYWNrX2luZm9fdCBpbmZvOworCisJZG8geworCQkvKiBOQjogbmV3X25hbWUgaXMgKm1heWJlKiBtYWxsb2MnZWQhICovCisJCW5ld19uYW1lID0gTlVMTDsKKwkJZmlsZW5hbWUgPSAqYXJndjsgLyogY2FuIGJlIE5VTEwgLSAnc3RyZWFtaW5nJyBidW56aXAyICovCisKKwkJaWYgKGZpbGVuYW1lICYmIExPTkVfREFTSChmaWxlbmFtZSkpCisJCQlmaWxlbmFtZSA9IE5VTEw7CisKKwkJLyogT3BlbiBzcmMgKi8KKwkJaWYgKGZpbGVuYW1lKSB7CisJCQlpZiAoc3RhdChmaWxlbmFtZSwgJnN0YXRfYnVmKSAhPSAwKSB7CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZW5hbWUpOworIGVycjoKKwkJCQlleGl0Y29kZSA9IDE7CisJCQkJZ290byBmcmVlX25hbWU7CisJCQl9CisJCQlpZiAob3Blbl90b19vcl93YXJuKFNURElOX0ZJTEVOTywgZmlsZW5hbWUsIE9fUkRPTkxZLCAwKSkKKwkJCQlnb3RvIGVycjsKKwkJfQorCisJCS8qIFNwZWNpYWwgY2FzZXM6IHRlc3QsIHN0ZG91dCAqLworCQlpZiAob3B0aW9uX21hc2szMiAmIChPUFRfU1RET1VUfE9QVF9URVNUKSkgeworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVTVCkKKwkJCQlpZiAob3Blbl90b19vcl93YXJuKFNURE9VVF9GSUxFTk8sIGJiX2Rldl9udWxsLCBPX1dST05MWSwgMCkpCisJCQkJCWdvdG8gZXJyOworCQkJZmlsZW5hbWUgPSBOVUxMOworCQl9CisKKwkJLyogT3BlbiBkc3QgaWYgd2UgYXJlIGdvaW5nIHRvIHVucGFjayB0byBmaWxlICovCisJCWlmIChmaWxlbmFtZSkgeworCQkJbmV3X25hbWUgPSBtYWtlX25ld19uYW1lKGZpbGVuYW1lLCBleHBlY3RlZF9leHQpOworCQkJaWYgKCFuZXdfbmFtZSkgeworCQkJCWJiX2Vycm9yX21zZygiJXM6IHVua25vd24gc3VmZml4IC0gaWdub3JlZCIsIGZpbGVuYW1lKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJLyogLWY6IG92ZXJ3cml0ZSBleGlzdGluZyBvdXRwdXQgZmlsZXMgKi8KKwkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0ZPUkNFKSB7CisJCQkJdW5saW5rKG5ld19uYW1lKTsKKwkJCX0KKworCQkJLyogT19FWENMOiAicmVhbCIgYnVuemlwMiBkb2Vzbid0IG92ZXJ3cml0ZSBmaWxlcyAqLworCQkJLyogR05VIGd1bnppcCBkb2VzIG5vdCBiYWlsIG91dCwgYnV0IGdvZXMgdG8gbmV4dCBmaWxlICovCisJCQlpZiAob3Blbl90b19vcl93YXJuKFNURE9VVF9GSUxFTk8sIG5ld19uYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsCisJCQkJCXN0YXRfYnVmLnN0X21vZGUpKQorCQkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgaW5wdXQgaXMgc2FuZSAqLworCQlpZiAoaXNhdHR5KFNURElOX0ZJTEVOTykgJiYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfRk9SQ0UpID09IDApIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb21wcmVzc2VkIGRhdGEgbm90IHJlYWQgZnJvbSB0ZXJtaW5hbCwgIgorCQkJCQkidXNlIC1mIHRvIGZvcmNlIGl0Iik7CisJCX0KKworCQkvKiBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7ICovCisJCWluZm8ubXRpbWUgPSAwOyAvKiBzbyBmYXIgaXQgaGFzIG9uZSBtZW1iZXIgb25seSAqLworCQlzdGF0dXMgPSB1bnBhY2tlcigmaW5mbyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZXhpdGNvZGUgPSAxOworCQl4Y2xvc2UoU1RET1VUX0ZJTEVOTyk7IC8qIHdpdGggZXJyb3IgY2hlY2shICovCisKKwkJaWYgKGZpbGVuYW1lKSB7CisJCQljaGFyICpkZWwgPSBuZXdfbmFtZTsKKwkJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJCS8qIFRPRE86IHJlc3RvcmUgb3RoZXIgdGhpbmdzPyAqLworCQkJCWlmIChpbmZvLm10aW1lKSB7CisJCQkJCXN0cnVjdCB0aW1ldmFsIHRpbWVzWzJdOworCisJCQkJCXRpbWVzWzFdLnR2X3NlYyA9IHRpbWVzWzBdLnR2X3NlYyA9IGluZm8ubXRpbWU7CisJCQkJCXRpbWVzWzFdLnR2X3VzZWMgPSB0aW1lc1swXS50dl91c2VjID0gMDsKKwkJCQkJLyogTm90ZTogd2UgY2xvc2VkIGl0IGZpcnN0LgorCQkJCQkgKiBPbiBzb21lIHN5c3RlbXMgY2FsbGluZyB1dGltZXMKKwkJCQkJICogdGhlbiBjbG9zaW5nIHJlc2V0cyB0aGUgbXRpbWUKKwkJCQkJICogYmFjayB0byBjdXJyZW50IHRpbWUuICovCisJCQkJCXV0aW1lcyhuZXdfbmFtZSwgdGltZXMpOyAvKiBpZ25vcmluZyBlcnJvcnMgKi8KKwkJCQl9CisKKwkJCQkvKiBEZWxldGUgX2NvbXByZXNzZWRfIGZpbGUgKi8KKwkJCQlkZWwgPSBmaWxlbmFtZTsKKwkJCQkvKiByZXN0b3JlIGV4dGVuc2lvbiAodW5sZXNzIHRneiAtPiB0YXIgY2FzZSkgKi8KKwkJCQlpZiAobmV3X25hbWUgPT0gZmlsZW5hbWUpCisJCQkJCWZpbGVuYW1lW3N0cmxlbihmaWxlbmFtZSldID0gJy4nOworCQkJfQorCQkJeHVubGluayhkZWwpOworCisjaWYgMCAvKiBDdXJyZW50bHkgYnVnZ3kgLSB3cm9uZyBuYW1lOiAiYS5nejogMjYxJSAtIHJlcGxhY2VkIHdpdGggYS5neiIgKi8KKwkJCS8qIEV4dHJlbWUgYmxvYXQgZm9yIGd1bnppcCBjb21wYXQgKi8KKwkJCWlmIChFTkFCTEVfREVTS1RPUCAmJiAob3B0aW9uX21hc2szMiAmIE9QVF9WRVJCT1NFKSAmJiBzdGF0dXMgPj0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6ICV1JSUgLSByZXBsYWNlZCB3aXRoICVzXG4iLAorCQkJCQlmaWxlbmFtZSwgKHVuc2lnbmVkKShzdGF0X2J1Zi5zdF9zaXplKjEwMCAvIChzdGF0dXMrMSkpLCBuZXdfbmFtZSk7CisJCQl9CisjZW5kaWYKKworIGZyZWVfbmFtZToKKwkJCWlmIChuZXdfbmFtZSAhPSBmaWxlbmFtZSkKKwkJCQlmcmVlKG5ld19uYW1lKTsKKwkJfQorCX0gd2hpbGUgKCphcmd2ICYmICorK2FyZ3YpOworCisJcmV0dXJuIGV4aXRjb2RlOworfQorCisjaWYgRU5BQkxFX1VOQ09NUFJFU1MgfHwgRU5BQkxFX0JVTlpJUDIgfHwgRU5BQkxFX1VOTFpNQSB8fCBFTkFCTEVfVU5YWgorc3RhdGljCitjaGFyKiBGQVNUX0ZVTkMgbWFrZV9uZXdfbmFtZV9nZW5lcmljKGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHBlY3RlZF9leHQpCit7CisJY2hhciAqZXh0ZW5zaW9uID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKKwlpZiAoIWV4dGVuc2lvbiB8fCBzdHJjbXAoZXh0ZW5zaW9uICsgMSwgZXhwZWN0ZWRfZXh0KSAhPSAwKSB7CisJCS8qIE1pbWljIEdOVSBndW56aXAgLSAicmVhbCIgYnVuemlwMiB0cmllcyB0byAqLworCQkvKiB1bnBhY2sgZmlsZSBhbnl3YXksIHRvIGZpbGUub3V0ICovCisJCXJldHVybiBOVUxMOworCX0KKwkqZXh0ZW5zaW9uID0gJ1wwJzsKKwlyZXR1cm4gZmlsZW5hbWU7Cit9CisjZW5kaWYKKworCisvKgorICogVW5jb21wcmVzcyBhcHBsZXQgZm9yIGJ1c3lib3ggKGMpIDIwMDIgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHVuY29tcHJlc3NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB1bmNvbXByZXNzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyAuWiBmaWxlW3NdXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJT3ZlcndyaXRlIgorCisjaWYgRU5BQkxFX1VOQ09NUFJFU1MKK3N0YXRpYworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgdW5wYWNrX3VuY29tcHJlc3ModW5wYWNrX2luZm9fdCAqaW5mbyBVTlVTRURfUEFSQU0pCit7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBzdGF0dXMgPSAtMTsKKworCWlmICgoeHJlYWRfY2hhcihTVERJTl9GSUxFTk8pICE9IDB4MWYpIHx8ICh4cmVhZF9jaGFyKFNURElOX0ZJTEVOTykgIT0gMHg5ZCkpIHsKKwkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG1hZ2ljIik7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gdW5wYWNrX1pfc3RyZWFtKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CitpbnQgdW5jb21wcmVzc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdW5jb21wcmVzc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZ2V0b3B0MzIoYXJndiwgImNmIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgdW5wYWNrX3VuY29tcHJlc3MsIG1ha2VfbmV3X25hbWVfZ2VuZXJpYywgIloiKTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBHemlwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQmFzZWQgb24gR05VIGd6aXAgdjEuMi40IENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkuCisgKgorICogT3JpZ2luYWxseSBhZGp1c3RlZCBmb3IgYnVzeWJveCBieSBTdmVuIFJ1ZG9scGggPHNyMUBpbmYudHUtZHJlc2Rlbi5kZT4KKyAqIGJhc2VkIG9uIGd6aXAgc291cmNlcworICoKKyAqIEFkanVzdGVkIGZ1cnRoZXIgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiB0byBzdXBwb3J0IGZpbGVzIGFzCisgKiB3ZWxsIGFzIHN0ZGluL3N0ZG91dCwgYW5kIHRvIGdlbmVyYWxseSBiZWhhdmUgaXRzZWxmIHdydCBjb21tYW5kIGxpbmUKKyAqIGhhbmRsaW5nLgorICoKKyAqIEdlbmVyYWwgY2xlYW51cCB0byBiZXR0ZXIgYWRoZXJlIHRvIHRoZSBzdHlsZSBndWlkZSBhbmQgbWFrZSB1c2Ugb2Ygc3RhbmRhcmQKKyAqIGJ1c3lib3ggZnVuY3Rpb25zIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIGd6aXAgKEdOVSB6aXApIC0tIGNvbXByZXNzIGZpbGVzIHdpdGggemlwIGFsZ29yaXRobSBhbmQgJ2NvbXByZXNzJyBpbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkKKyAqIFRoZSB1bnppcCBjb2RlIHdhcyB3cml0dGVuIGFuZCBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgTWFyayBBZGxlci4KKyAqIFBvcnRpb25zIG9mIHRoZSBsencgY29kZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBwdWJsaWMgZG9tYWluICdjb21wcmVzcycKKyAqIHdyaXR0ZW4gYnkgU3BlbmNlciBUaG9tYXMsIEpvZSBPcm9zdCwgSmFtZXMgV29vZHMsIEppbSBNY0tpZSwgU3RldmUgRGF2aWVzLAorICogS2VuIFR1cmtvd3NraSwgRGF2ZSBNYWNrIGFuZCBQZXRlciBKYW5uZXNlbi4KKyAqCisgKiBTZWUgdGhlIGxpY2Vuc2VfbXNnIGJlbG93IGFuZCB0aGUgZmlsZSBDT1BZSU5HIGZvciB0aGUgc29mdHdhcmUgbGljZW5zZS4KKyAqIFNlZSB0aGUgZmlsZSBhbGdvcml0aG0uZG9jIGZvciB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhbmQgZmlsZSBmb3JtYXRzLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBndW56aXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2Z0XSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgZ3VuemlwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyBGSUxFcyAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOiAgICAgIlxuCS10CVRlc3QgZmlsZSBpbnRlZ3JpdHkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGd1bnppcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBscyAtbGEgL3RtcC9CdXN5Qm94KlxuIgorLy91c2FnZTogICAgICAgIi1ydy1ydy1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgIDU1NzAwOSBBcHIgMTEgMTA6NTUgL3RtcC9CdXN5Qm94LTAuNDMudGFyLmd6XG4iCisvL3VzYWdlOiAgICAgICAiJCBndW56aXAgL3RtcC9CdXN5Qm94LTAuNDMudGFyLmd6XG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbGEgL3RtcC9CdXN5Qm94KlxuIgorLy91c2FnZTogICAgICAgIi1ydy1ydy1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgMTc2MTI4MCBBcHIgMTQgMTc6NDcgL3RtcC9CdXN5Qm94LTAuNDMudGFyXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHpjYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEUiCisvL3VzYWdlOiNkZWZpbmUgemNhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgdG8gc3Rkb3V0IgorCisjaWYgRU5BQkxFX0dVTlpJUAorc3RhdGljCitjaGFyKiBGQVNUX0ZVTkMgbWFrZV9uZXdfbmFtZV9ndW56aXAoY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dCBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqZXh0ZW5zaW9uID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKKworCWlmICghZXh0ZW5zaW9uKQorCQlyZXR1cm4gTlVMTDsKKworCWV4dGVuc2lvbisrOworCWlmIChzdHJjbXAoZXh0ZW5zaW9uLCAidGd6IiArIDEpID09IDAKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19aCisJIHx8IChleHRlbnNpb25bMF0gPT0gJ1onICYmIGV4dGVuc2lvblsxXSA9PSAnXDAnKQorI2VuZGlmCisJKSB7CisJCWV4dGVuc2lvblstMV0gPSAnXDAnOworCX0gZWxzZSBpZiAoc3RyY21wKGV4dGVuc2lvbiwgInRneiIpID09IDApIHsKKwkJZmlsZW5hbWUgPSB4c3RyZHVwKGZpbGVuYW1lKTsKKwkJZXh0ZW5zaW9uID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKKwkJZXh0ZW5zaW9uWzJdID0gJ2EnOworCQlleHRlbnNpb25bM10gPSAncic7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBmaWxlbmFtZTsKK30KK3N0YXRpYworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgdW5wYWNrX2d1bnppcCh1bnBhY2tfaW5mb190ICppbmZvKQoreworCUlGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgc3RhdHVzID0gLTE7CisKKwkvKiBkbyB0aGUgZGVjb21wcmVzc2lvbiwgYW5kIGNsZWFudXAgKi8KKwlpZiAoeHJlYWRfY2hhcihTVERJTl9GSUxFTk8pID09IDB4MWYpIHsKKwkJdW5zaWduZWQgY2hhciBtYWdpYzI7CisKKwkJbWFnaWMyID0geHJlYWRfY2hhcihTVERJTl9GSUxFTk8pOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWiAmJiBtYWdpYzIgPT0gMHg5ZCkgeworCQkJc3RhdHVzID0gdW5wYWNrX1pfc3RyZWFtKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7CisJCX0gZWxzZSBpZiAobWFnaWMyID09IDB4OGIpIHsKKwkJCXN0YXR1cyA9IHVucGFja19nel9zdHJlYW1fd2l0aF9pbmZvKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTywgaW5mbyk7CisJCX0gZWxzZSB7CisJCQlnb3RvIGJhZF9tYWdpYzsKKwkJfQorCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnKCJlcnJvciBpbmZsYXRpbmciKTsKKwkJfQorCX0gZWxzZSB7CisgYmFkX21hZ2ljOgorCQliYl9lcnJvcl9tc2coImludmFsaWQgbWFnaWMiKTsKKwkJLyogc3RhdHVzIGlzIHN0aWxsID09IC0xICovCisJfQorCXJldHVybiBzdGF0dXM7Cit9CisvKgorICogTGludXgga2VybmVsIGJ1aWxkIHVzZXMgZ3ppcCAtZCAtbi4gV2UgYWNjZXB0IGFuZCBpZ25vcmUgaXQuCisgKiBNYW4gcGFnZSBzYXlzOgorICogLW4gLS1uby1uYW1lCisgKiBnemlwOiBkbyBub3Qgc2F2ZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lIGFuZCB0aW1lIHN0YW1wLgorICogKFRoZSBvcmlnaW5hbCBuYW1lIGlzIGFsd2F5cyBzYXZlZCBpZiB0aGUgbmFtZSBoYWQgdG8gYmUgdHJ1bmNhdGVkLikKKyAqIGd1bnppcDogZG8gbm90IHJlc3RvcmUgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZS90aW1lIGV2ZW4gaWYgcHJlc2VudAorICogKHJlbW92ZSBvbmx5IHRoZSBnemlwIHN1ZmZpeCBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgbmFtZSkuCisgKiBUaGlzIG9wdGlvbiBpcyB0aGUgZGVmYXVsdCB3aGVuIGRlY29tcHJlc3NpbmcuCisgKiAtTiAtLW5hbWUKKyAqIGd6aXA6IGFsd2F5cyBzYXZlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgYW5kIHRpbWUgc3RhbXAgKHRoaXMgaXMgdGhlIGRlZmF1bHQpCisgKiBndW56aXA6IHJlc3RvcmUgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBhbmQgdGltZSBzdGFtcCBpZiBwcmVzZW50LgorICovCitpbnQgZ3VuemlwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBndW56aXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsICJjZnZkdG4iKTsKKwlhcmd2ICs9IG9wdGluZDsKKwkvKiBpZiBjYWxsZWQgYXMgemNhdCAqLworCWlmIChhcHBsZXRfbmFtZVsxXSA9PSAnYycpCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX1NURE9VVDsKKworCXJldHVybiBiYnVucGFjayhhcmd2LCB1bnBhY2tfZ3VuemlwLCBtYWtlX25ld19uYW1lX2d1bnppcCwgLyp1bnVzZWQ6Ki8gTlVMTCk7Cit9CisjZW5kaWYKKworCisvKgorICogTW9kaWZpZWQgZm9yIGJ1c3lib3ggYnkgR2xlbm4gTWNHcmF0aAorICogQWRkZWQgc3VwcG9ydCBvdXRwdXQgdG8gc3Rkb3V0IGJ5IFRob21hcyBMdW5kcXVpc3QgPHRob21hc2V6QHplbG93Lm5vPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8vdXNhZ2U6I2RlZmluZSBidW56aXAyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgYnVuemlwMl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgRklMRXMgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTojZGVmaW5lIGJ6Y2F0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFIgorLy91c2FnZTojZGVmaW5lIGJ6Y2F0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyB0byBzdGRvdXQiCisvL2FwcGxldDpJRl9CVU5aSVAyKEFQUExFVChidW56aXAyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX0JVTlpJUDIoQVBQTEVUX09ERE5BTUUoYnpjYXQsIGJ1bnppcDIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGJ6Y2F0KSkKKyNpZiBFTkFCTEVfQlVOWklQMgorc3RhdGljCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyB1bnBhY2tfYnVuemlwMih1bnBhY2tfaW5mb190ICppbmZvIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gdW5wYWNrX2J6Ml9zdHJlYW1fcHJpbWUoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKK30KK2ludCBidW56aXAyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBidW56aXAyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlnZXRvcHQzMihhcmd2LCAiY2Z2ZHQiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoYXBwbGV0X25hbWVbMl0gPT0gJ2MnKSAvKiBiemNhdCAqLworCQlvcHRpb25fbWFzazMyIHw9IE9QVF9TVERPVVQ7CisKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgdW5wYWNrX2J1bnppcDIsIG1ha2VfbmV3X25hbWVfZ2VuZXJpYywgImJ6MiIpOworfQorI2VuZGlmCisKKworLyoKKyAqIFNtYWxsIGx6bWEgZGVmbGF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIEJhc2VkIG9uIGJ1bnppcC5jIGZyb20gYnVzeWJveAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHVubHptYV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHVubHptYV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgRklMRSAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGx6bWFfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi1kIFstY2ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsem1hX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyBGSUxFIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVjb21wcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbHpjYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEUiCisvL3VzYWdlOiNkZWZpbmUgbHpjYXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW54el90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHVueHpfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIEZJTEUgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB4el90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLWQgWy1jZl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHh6X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyBGSUxFIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVjb21wcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgeHpjYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEUiCisvL3VzYWdlOiNkZWZpbmUgeHpjYXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIHRvIHN0ZG91dCIKKworI2lmIEVOQUJMRV9VTkxaTUEKK3N0YXRpYworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgdW5wYWNrX3VubHptYSh1bnBhY2tfaW5mb190ICppbmZvIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gdW5wYWNrX2x6bWFfc3RyZWFtKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7Cit9CitpbnQgdW5sem1hX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1bmx6bWFfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUlGX0xaTUEoaW50IG9wdHMgPSkgZ2V0b3B0MzIoYXJndiwgImNmdmR0Iik7CisjIGlmIEVOQUJMRV9MWk1BCisJLyogbHptYSB3aXRob3V0IC1kIG9yIC10PyAqLworCWlmIChhcHBsZXRfbmFtZVsyXSA9PSAnbScgJiYgIShvcHRzICYgKE9QVF9ERUNPTVBSRVNTfE9QVF9URVNUKSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKyMgZW5kaWYKKwkvKiBsemNhdD8gKi8KKwlpZiAoYXBwbGV0X25hbWVbMl0gPT0gJ2MnKQorCQlvcHRpb25fbWFzazMyIHw9IE9QVF9TVERPVVQ7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgdW5wYWNrX3VubHptYSwgbWFrZV9uZXdfbmFtZV9nZW5lcmljLCAibHptYSIpOworfQorI2VuZGlmCisKKworI2lmIEVOQUJMRV9VTlhaCitzdGF0aWMKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DIHVucGFja191bnh6KHVucGFja19pbmZvX3QgKmluZm8gVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB7CisJCXVpbnQzMl90IHYxOworCQl1aW50MTZfdCB2MjsKKwl9IG1hZ2ljOworCXhyZWFkKFNURElOX0ZJTEVOTywgJm1hZ2ljLCA2KTsKKwlpZiAobWFnaWMudjEgIT0gWFpfTUFHSUMxYSB8fCBtYWdpYy52MiAhPSBYWl9NQUdJQzJhKSB7CisJCWJiX2Vycm9yX21zZygiaW52YWxpZCBtYWdpYyIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiB1bnBhY2tfeHpfc3RyZWFtKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7Cit9CitpbnQgdW54el9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdW54el9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJSUZfWFooaW50IG9wdHMgPSkgZ2V0b3B0MzIoYXJndiwgImNmdmR0Iik7CisjIGlmIEVOQUJMRV9YWgorCS8qIHh6IHdpdGhvdXQgLWQgb3IgLXQ/ICovCisJaWYgKGFwcGxldF9uYW1lWzJdID09ICdcMCcgJiYgIShvcHRzICYgKE9QVF9ERUNPTVBSRVNTfE9QVF9URVNUKSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKyMgZW5kaWYKKwkvKiB4emNhdD8gKi8KKwlpZiAoYXBwbGV0X25hbWVbMl0gPT0gJ2MnKQorCQlvcHRpb25fbWFzazMyIHw9IE9QVF9TVERPVVQ7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgdW5wYWNrX3VueHosIG1ha2VfbmV3X25hbWVfZ2VuZXJpYywgInh6Iik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2JidW56aXBfdGVzdC5zaCBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2JidW56aXBfdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGUzMWJmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvYmJ1bnppcF90ZXN0LnNoCkBAIC0wLDAgKzEsNjEgQEAKKyMhL2Jpbi9zaAorIyBUZXN0IHRoYXQgY29uY2F0ZW5hdGVkIGd6IGZpbGVzIGFyZSB1bnBhY2tpbmcgY29ycmVjdGx5LgorIyBJdCBhbHNvIHRlc3RzIHRoYXQgdW5wYWNraW5nIGluIGdlbmVyYWwgaXMgd29ya2luZyByaWdodC4KKyMgU2luY2UgemlwIGNvZGUgaGFzIG1hbnkgY29ybmVyIGNhc2VzLCBydW4gaXQgZm9yIGEgZmV3IGhvdXJzCisjIHRvIGdldCBhIGRlY2VudCBjb3ZlcmFnZSAoMjAwMDAwIHRlc3RzIG9yIG1vcmUpLgorCitnemlwPSJnemlwIgorZ3VuemlwPSIuLi9idXN5Ym94IGd1bnppcCIKKyMgT3IgdGhlIG90aGVyIHdheSBhcm91bmQ6CisjZ3ppcD0iLi4vYnVzeWJveCBnemlwIgorI2d1bnppcD0iZ3VuemlwIgorCitjPTAKK2k9JFBJRAord2hpbGUgdHJ1ZTsgZG8KKyAgICBjPSQoKGMrMSkpCisKKyAgICAjIFJBTkRPTSBpcyBub3QgdmVyeSByYW5kb20gb24gc29tZSBzaGVsbHMuIFNwaWNlIGl0IHVwLgorICAgICMgMTAwMDAzIGlzIHByaW1lCisgICAgbGVuMT0kKCggKCgoUkFORE9NKlJBTkRPTSleaSkgJiAweDdmZmZmZmYpICUgMTAwMDAzICkpCisgICAgaT0kKChpICogMTY2NDUyNSArIDEwMTM5MDQyMjMpKQorICAgIGxlbjI9JCgoICgoKFJBTkRPTSpSQU5ET00pXmkpICYgMHg3ZmZmZmZmKSAlIDEwMDAwMyApKQorCisgICAgIyBKdXN0IHVzaW5nIHVyYW5kb20gd2lsbCBtYWtlIGd6aXAgdXNlIG1ldGhvZCAwIChzdG9yZSkgLQorICAgICMgbm90IGdvb2QgZm9yIHRlc3QgY292ZXJhZ2UhCisgICAgY2F0IC9kZXYvdXJhbmRvbSB8IHdoaWxlIHRydWU7IGRvIHJlYWQganVuazsgZWNobyAianVuayAkYyAkaSAkanVuayI7IGRvbmUgXAorICAgIHwgZGQgYnM9JGxlbjEgY291bnQ9MSA+ejEgMj4vZGV2L251bGwKKyAgICBjYXQgL2Rldi91cmFuZG9tIHwgd2hpbGUgdHJ1ZTsgZG8gcmVhZCBqdW5rOyBlY2hvICJqdW5rICRjICRpICRqdW5rIjsgZG9uZSBcCisgICAgfCBkZCBicz0kbGVuMiBjb3VudD0xID56MiAyPi9kZXYvbnVsbAorCisgICAgJGd6aXAgPHoxID56ei5negorICAgICRnemlwIDx6MiA+Pnp6Lmd6CisgICAgJGd1bnppcCAtYyB6ei5neiA+ejkgfHwgeworCWVjaG8gIkV4aXRjb2RlICQ/IgorCWV4aXQKKyAgICB9CisgICAgc3VtPWBjYXQgejEgejIgfCBtZDVzdW1gCisgICAgc3VtOT1gbWQ1c3VtIDx6OWAKKyAgICB0ZXN0ICIkc3VtIiA9PSAiJHN1bTkiIHx8IHsKKwllY2hvICJtZDVzdW1zIGRvbid0IG1hdGNoIgorCWV4aXQKKyAgICB9CisgICAgZWNobyAiVGVzdCAkYyBvazogbGVuMT0kbGVuMSBsZW4yPSRsZW4yIHN1bT0kc3VtIgorCisgICAgc3VtPWBjYXQgejEgejIgejEgejIgfCBtZDVzdW1gCisgICAgcm0gejEuZ3ogejIuZ3ogMj4vZGV2L251bGwKKyAgICAkZ3ppcCB6MQorICAgICRnemlwIHoyCisgICAgY2F0IHoxLmd6IHoyLmd6IHoxLmd6IHoyLmd6ID56ei5negorICAgICRndW56aXAgLWMgenouZ3ogPno5IHx8IHsKKwllY2hvICJFeGl0Y29kZSAkPyAoMikiCisJZXhpdAorICAgIH0KKyAgICBzdW05PWBtZDVzdW0gPHo5YAorICAgIHRlc3QgIiRzdW0iID09ICIkc3VtOSIgfHwgeworCWVjaG8gIm1kNXN1bXMgZG9uJ3QgbWF0Y2ggKDEpIgorCWV4aXQKKyAgICB9CisKKyAgICBlY2hvICJUZXN0ICRjIG9rOiBsZW4xPSRsZW4xIGxlbjI9JGxlbjIgc3VtPSRzdW0gKDIpIgorZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvYmJ1bnppcF90ZXN0Mi5zaCBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2JidW56aXBfdGVzdDIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3ZTgzZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2JidW56aXBfdGVzdDIuc2gKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL3NoCisjIExlYWsgdGVzdCBmb3IgZ3VuemlwLiBXYXRjaCB0b3AgZm9yIGdyb3dpbmcgcHJvY2VzcyBzaXplLgorCisjIEp1c3QgdXNpbmcgdXJhbmRvbSB3aWxsIG1ha2UgZ3ppcCB1c2UgbWV0aG9kIDAgKHN0b3JlKSAtCisjIG5vdCBnb29kIGZvciB0ZXN0IGNvdmVyYWdlIQorCitjYXQgL2Rldi91cmFuZG9tIFwKK3wgd2hpbGUgdHJ1ZTsgZG8gcmVhZCBqdW5rOyBlY2hvICJqdW5rICRSQU5ET00gJGp1bmsiOyBkb25lIFwKK3wgLi4vYnVzeWJveCBnemlwIFwKK3wgLi4vYnVzeWJveCBndW56aXAgLWMgPi9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvYmJ1bnppcF90ZXN0My5zaCBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2JidW56aXBfdGVzdDMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjNGFmZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2JidW56aXBfdGVzdDMuc2gKQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCisjIExlYWsgdGVzdCBmb3IgZ3VuemlwLiBXYXRjaCB0b3AgZm9yIGdyb3dpbmcgcHJvY2VzcyBzaXplLgorIyBJbiB0aGlzIGNhc2Ugd2UgbG9vayBmb3IgbGVha3MgaW4gImNvbmNhdGVuYXRlZCAuZ3oiIGNvZGUgLQorIyB3ZSBmZWVkIGd1bnppcCB3aXRoIGEgc3RyZWFtIG9mIC5neiBmaWxlcy4KKworaT0kUElECitjPTAKK3doaWxlIHRydWU7IGRvCisgICAgYz0kKChjICsgMSkpCisgICAgZWNobyAiQmxvY2sjICRjIiA+JjIKKyAgICAjIFJBTkRPTSBpcyBub3QgdmVyeSByYW5kb20gb24gc29tZSBzaGVsbHMuIFNwaWNlIGl0IHVwLgorICAgIGk9JCgoaSAqIDE2NjQ1MjUgKyAxMDEzOTA0MjIzKSkKKyAgICAjIDEwMDAwMyBpcyBwcmltZQorICAgIGxlbj0kKCggKCgoUkFORE9NKlJBTkRPTSleaSkgJiAweDdmZmZmZmYpICUgMTAwMDAzICkpCisKKyAgICAjIEp1c3QgdXNpbmcgdXJhbmRvbSB3aWxsIG1ha2UgZ3ppcCB1c2UgbWV0aG9kIDAgKHN0b3JlKSAtCisgICAgIyBub3QgZ29vZCBmb3IgdGVzdCBjb3ZlcmFnZSEKKyAgICBjYXQgL2Rldi91cmFuZG9tIFwKKyAgICB8IHdoaWxlIHRydWU7IGRvIHJlYWQganVuazsgZWNobyAianVuayAkYyAkaSAkanVuayI7IGRvbmUgXAorICAgIHwgZGQgYnM9JGxlbiBjb3VudD0xIDI+L2Rldi9udWxsIFwKKyAgICB8IGd6aXAgPnh4eC5negorICAgIGNhdCB4eHguZ3ogeHh4Lmd6IHh4eC5neiB4eHguZ3ogeHh4Lmd6IHh4eC5neiB4eHguZ3ogeHh4Lmd6Citkb25lIHwgLi4vYnVzeWJveCBndW56aXAgLWMgPi9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvYnppcDIuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2J6aXAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5ZDdmNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2J6aXAyLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgdXNlcyBiemlwMiBsaWJyYXJ5IGNvZGUgd2hpY2ggaXMgd3JpdHRlbgorICogYnkgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4uCisgKiBTZWUgUkVBRE1FIGFuZCBMSUNFTlNFIGZpbGVzIGluIGJ6LyBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqIGFib3V0IGJ6aXAyIGxpYnJhcnkgY29kZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYnppcDJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgYnppcDJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21wcmVzcyBGSUxFcyAob3Igc3RkaW4pIHdpdGggYnppcDIgYWxnb3JpdGhtXG4iCisvL3VzYWdlOiAgICAgIlxuCS0xLi45CUNvbXByZXNzaW9uIGxldmVsIgorLy91c2FnZTogICAgICJcbgktZAlEZWNvbXByZXNzIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKyNkZWZpbmUgQ09ORklHX0JaSVAyX0ZFQVRVUkVfU1BFRUQgMQorCisvKiBTcGVlZCB0ZXN0OgorICogQ29tcGlsZWQgd2l0aCBnY2MgNC4yLjEsIHJ1biBvbiBBdGhsb24gNjQgMTgwMCBNSHogKDUxMksgTDIgY2FjaGUpLgorICogU3RvY2sgYnppcDIgaXMgMjYuNCUgc2xvd2VyIHRoYW4gYmJveCBiemlwMiBhdCBTUEVFRCAxCisgKiAodGltZSB0byBjb21wcmVzcyBnY2MtNC4yLjEudGFyIGlzIDEyNi40JSBjb21wYXJlZCB0byBiYm94KS4KKyAqIEF0IFNQRUVEIDUgZGlmZmVyZW5jZSBpcyAzMi43JS4KKyAqCisgKiBUZXN0IHJ1biBvZiBhbGwgQ09ORklHX0JaSVAyX0ZFQVRVUkVfU1BFRUQgdmFsdWVzIG9uIGEgMTFNYiB0ZXh0IGZpbGU6CisgKiAgICAgU2l6ZSAgIFRpbWUgKDMgcnVucykKKyAqIDA6ICAxMDgyOCAgNC4xNDUgNC4xNDYgNC4xNDgKKyAqIDE6ICAxMTA5NyAgMy44NDUgMy44NjAgMy44NjEKKyAqIDI6ICAxMTM5MiAgMy43NjMgMy43NjcgMy43NjgKKyAqIDM6ICAxMTg5MiAgMy43MjIgMy43MjQgMy43MjcKKyAqIDQ6ICAxMjc0MCAgMy42MzcgMy42NDAgMy42NDQKKyAqIDU6ICAxNzI3MyAgMy40OTcgMy41MDkgMy41MDkKKyAqLworCisKKyNkZWZpbmUgQlpfREVCVUcgMAorLyogVGFrZXMgfjMwMCBieXRlcywgZGV0ZWN0cyBjb3JydXB0aW9uIGNhdXNlZCBieSBiYWQgUkFNIGV0YyAqLworI2RlZmluZSBCWl9MSUdIVF9ERUJVRyAwCisKKyNpbmNsdWRlICJsaWJhcmNoaXZlL2J6L2J6bGliLmgiCisKKyNpbmNsdWRlICJsaWJhcmNoaXZlL2J6L2J6bGliX3ByaXZhdGUuaCIKKworI2luY2x1ZGUgImxpYmFyY2hpdmUvYnovYmxvY2tzb3J0LmMiCisjaW5jbHVkZSAibGliYXJjaGl2ZS9iei9iemxpYi5jIgorI2luY2x1ZGUgImxpYmFyY2hpdmUvYnovY29tcHJlc3MuYyIKKyNpbmNsdWRlICJsaWJhcmNoaXZlL2J6L2h1ZmZtYW4uYyIKKworLyogTm8gcG9pbnQgaW4gYmVpbmcgc2h5IGFuZCBoYXZpbmcgdmVyeSBzbWFsbCBidWZmZXIgaGVyZS4KKyAqIGJ6aXAyIGludGVybmFsIGJ1ZmZlcnMgYXJlIG11Y2ggYmlnZ2VyIGFueXdheSwgaHVuZHJlZHMgb2Yga2J5dGVzLgorICogSWYgaW9idWYgaXMgc2V2ZXJhbCBwYWdlcyBsb25nLCBtYWxsb2MoKSBtYXkgdXNlIG1tYXAsCisgKiBtYWtpbmcgaW9idWYgaXMgcGFnZSBhbGlnbmVkIGFuZCB0aHVzIChtYXliZSkgaGF2ZSBvbmUgbWVtY3B5IGxlc3MKKyAqIGlmIGtlcm5lbCBpcyBjbGV2ZXIgZW5vdWdoLgorICovCitlbnVtIHsKKwlJT0JVRl9TSVpFID0gOCAqIDEwMjQKK307CisKK3N0YXRpYyB1aW50OF90IGxldmVsOworCisvKiBOQjogY29tcHJlc3NTdHJlYW0oKSBoYXMgdG8gcmV0dXJuIC0xIG9uIGVycm9ycywgbm90IGRpZS4KKyAqIGJidW5wYWNrKCkgd2lsbCBjb3JyZWN0bHkgY2xlYW4gdXAgaW4gdGhpcyBjYXNlCisgKiAoZGVsZXRlIGluY29tcGxldGUgLmJ6MiBmaWxlKQorICovCisKKy8qIFJldHVybnM6CisgKiAtMSBvbiBlcnJvcnMKKyAqIHRvdGFsIHdyaXR0ZW4gYnl0ZXMgc28gZmFyIG90aGVyd2lzZQorICovCitzdGF0aWMKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgYnpfd3JpdGUoYnpfc3RyZWFtICpzdHJtLCB2b2lkKiByYnVmLCBzc2l6ZV90IHJsZW4sIHZvaWQgKndidWYpCit7CisJaW50IG4sIG4yLCByZXQ7CisKKwlzdHJtLT5hdmFpbF9pbiA9IHJsZW47CisJc3RybS0+bmV4dF9pbiA9IHJidWY7CisJd2hpbGUgKDEpIHsKKwkJc3RybS0+YXZhaWxfb3V0ID0gSU9CVUZfU0laRTsKKwkJc3RybS0+bmV4dF9vdXQgPSB3YnVmOworCisJCXJldCA9IEJaMl9iekNvbXByZXNzKHN0cm0sIHJsZW4gPyBCWl9SVU4gOiBCWl9GSU5JU0gpOworCQlpZiAocmV0ICE9IEJaX1JVTl9PSyAvKiBCWl9SVU5uaW5nICovCisJCSAmJiByZXQgIT0gQlpfRklOSVNIX09LIC8qIEJaX0ZJTklTSGluZywgYnV0IG5vdCBkb25lIHlldCAqLworCQkgJiYgcmV0ICE9IEJaX1NUUkVBTV9FTkQgLyogQlpfRklOSVNIZWQgKi8KKwkJKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW50ZXJuYWwgZXJyb3IgJWQiLCByZXQpOworCQl9CisKKwkJbiA9IElPQlVGX1NJWkUgLSBzdHJtLT5hdmFpbF9vdXQ7CisJCWlmIChuKSB7CisJCQluMiA9IGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgd2J1Ziwgbik7CisJCQlpZiAobjIgIT0gbikgeworCQkJCWlmIChuMiA+PSAwKQorCQkJCQllcnJubyA9IDA7IC8qIHByZXZlbnQgYm9ndXMgZXJyb3IgbWVzc2FnZSAqLworCQkJCWJiX3BlcnJvcl9tc2cobjIgPj0gMCA/ICJzaG9ydCB3cml0ZSIgOiBiYl9tc2dfd3JpdGVfZXJyb3IpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisJCWlmIChyZXQgPT0gQlpfU1RSRUFNX0VORCkKKwkJCWJyZWFrOworCQlpZiAocmxlbiAmJiBzdHJtLT5hdmFpbF9pbiA9PSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwIElGX0RFU0tUT1AoICsgc3RybS0+dG90YWxfb3V0ICk7Cit9CisKK3N0YXRpYworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgY29tcHJlc3NTdHJlYW0odW5wYWNrX2luZm9fdCAqaW5mbyBVTlVTRURfUEFSQU0pCit7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB0b3RhbDsKKwlzc2l6ZV90IGNvdW50OworCWJ6X3N0cmVhbSBienM7IC8qIGl0J3Mgc21hbGwgKi8KKyNkZWZpbmUgc3RybSAoJmJ6cykKKwljaGFyICppb2J1ZjsKKyNkZWZpbmUgcmJ1ZiBpb2J1ZgorI2RlZmluZSB3YnVmIChpb2J1ZiArIElPQlVGX1NJWkUpCisKKwlpb2J1ZiA9IHhtYWxsb2MoMiAqIElPQlVGX1NJWkUpOworCUJaMl9iekNvbXByZXNzSW5pdChzdHJtLCBsZXZlbCk7CisKKwl3aGlsZSAoMSkgeworCQljb3VudCA9IGZ1bGxfcmVhZChTVERJTl9GSUxFTk8sIHJidWYsIElPQlVGX1NJWkUpOworCQlpZiAoY291bnQgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCXRvdGFsID0gLTE7CisJCQlicmVhazsKKwkJfQorCQkvKiBpZiBjb3VudCA9PSAwLCBiel93cml0ZSBmaW5hbGl6ZXMgY29tcHJlc3Npb24gKi8KKwkJdG90YWwgPSBiel93cml0ZShzdHJtLCByYnVmLCBjb3VudCwgd2J1Zik7CisJCWlmIChjb3VudCA9PSAwIHx8IHRvdGFsIDwgMCkKKwkJCWJyZWFrOworCX0KKworCS8qIENhbid0IGJlIGNvbmRpdGlvbmFsIG9uIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQIC0KKwkgKiB3ZSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkKKwkgKi8KKwlCWjJfYnpDb21wcmVzc0VuZChzdHJtKTsKKwlmcmVlKGlvYnVmKTsKKworCXJldHVybiB0b3RhbDsKK30KKworaW50IGJ6aXAyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBiemlwMl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCisJLyogc3RhbmRhcmQgYnppcDIgZmxhZ3MKKwkgKiAtZCAtLWRlY29tcHJlc3MgZm9yY2UgZGVjb21wcmVzc2lvbgorCSAqIC16IC0tY29tcHJlc3MgZm9yY2UgY29tcHJlc3Npb24KKwkgKiAtayAtLWtlZXAgICAgIGtlZXAgKGRvbid0IGRlbGV0ZSkgaW5wdXQgZmlsZXMKKwkgKiAtZiAtLWZvcmNlICAgIG92ZXJ3cml0ZSBleGlzdGluZyBvdXRwdXQgZmlsZXMKKwkgKiAtdCAtLXRlc3QgICAgIHRlc3QgY29tcHJlc3NlZCBmaWxlIGludGVncml0eQorCSAqIC1jIC0tc3Rkb3V0ICAgb3V0cHV0IHRvIHN0YW5kYXJkIG91dAorCSAqIC1xIC0tcXVpZXQgICAgc3VwcHJlc3Mgbm9uY3JpdGljYWwgZXJyb3IgbWVzc2FnZXMKKwkgKiAtdiAtLXZlcmJvc2UgIGJlIHZlcmJvc2UgKGEgMm5kIC12IGdpdmVzIG1vcmUpCisJICogLXMgLS1zbWFsbCAgICB1c2UgbGVzcyBtZW1vcnkgKGF0IG1vc3QgMjUwMGspCisJICogLTEgLi4gLTkgICAgICBzZXQgYmxvY2sgc2l6ZSB0byAxMDBrIC4uIDkwMGsKKwkgKiAtLWZhc3QgICAgICAgIGFsaWFzIGZvciAtMQorCSAqIC0tYmVzdCAgICAgICAgYWxpYXMgZm9yIC05CisJICovCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJzMiI7IC8qIC1zIG1lYW5zIC0yIChjb21wYXRpYmlsaXR5KSAqLworCS8qIE11c3QgbWF0Y2ggYmJ1bnppcCdzIGNvbnN0YW50cyBPUFRfU1RET1VULCBPUFRfRk9SQ0UhICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNmdiIgSUZfQlVOWklQMigiZHQiKSAiMTIzNDU2Nzg5cXpzIik7CisjaWYgRU5BQkxFX0JVTlpJUDIgLyogYnVuemlwMl9tYWluIG1heSBub3QgYmUgdmlzaWJsZS4uLiAqLworCWlmIChvcHQgJiAweDE4KSAvLyAtZCBhbmQvb3IgLXQKKwkJcmV0dXJuIGJ1bnppcDJfbWFpbihhcmdjLCBhcmd2KTsKKwlvcHQgPj49IDU7CisjZWxzZQorCW9wdCA+Pj0gMzsKKyNlbmRpZgorCW9wdCA9ICh1aW50OF90KW9wdDsgLyogaXNvbGF0ZSBiaXRzIGZvciAtMS4uLTggKi8KKwlvcHQgfD0gMHgxMDA7IC8qIGlmIG5vdGhpbmcgZWxzZSwgYXNzdW1lIC05ICovCisJbGV2ZWwgPSAxOworCXdoaWxlICghKG9wdCAmIDEpKSB7CisJCWxldmVsKys7CisJCW9wdCA+Pj0gMTsKKwl9CisKKwlhcmd2ICs9IG9wdGluZDsKKwlvcHRpb25fbWFzazMyICY9IDB4NzsgLyogaWdub3JlIGFsbCBleGNlcHQgLWNmdiAqLworCXJldHVybiBiYnVucGFjayhhcmd2LCBjb21wcmVzc1N0cmVhbSwgYXBwZW5kX2V4dCwgImJ6MiIpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvY3Bpby5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvY3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzRhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9jcGlvLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgY3BpbyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBMaW1pdGF0aW9uczoKKyAqIERvZXNuJ3QgY2hlY2sgQ1JDJ3MKKyAqIE9ubHkgc3VwcG9ydHMgbmV3IEFTQ0lJIGFuZCBDUkMgZm9ybWF0cworICoKKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisvL3VzYWdlOiNkZWZpbmUgY3Bpb190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kbXZ1XSBbLUYgRklMRV0iIElGX0ZFQVRVUkVfQ1BJT19PKCIgWy1IIG5ld2NdIikKKy8vdXNhZ2U6ICAgICAgICIgWy10aSJJRl9GRUFUVVJFX0NQSU9fTygibyIpIl0iIElGX0ZFQVRVUkVfQ1BJT19QKCIgWy1wIERJUl0iKQorLy91c2FnZTogICAgICAgIiBbRVhUUl9GSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBjcGlvX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRXh0cmFjdCBvciBsaXN0IGZpbGVzIGZyb20gYSBjcGlvIGFyY2hpdmUiCisvL3VzYWdlOglJRl9GRUFUVVJFX0NQSU9fTygiLCBvciIKKy8vdXNhZ2U6ICAgICAiXG5jcmVhdGUgYW4gYXJjaGl2ZSIgSUZfRkVBVFVSRV9DUElPX1AoIiAoLW8pIG9yIGNvcHkgZmlsZXMgKC1wKSIpCisvL3VzYWdlOgkJIiB1c2luZyBmaWxlIGxpc3Qgb24gc3RkaW4iCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk1haW4gb3BlcmF0aW9uIG1vZGU6IgorLy91c2FnZTogICAgICJcbgktdAlMaXN0IgorLy91c2FnZTogICAgICJcbgktaQlFeHRyYWN0IEVYVFJfRklMRXMgKG9yIGFsbCkiCisvL3VzYWdlOglJRl9GRUFUVVJFX0NQSU9fTygKKy8vdXNhZ2U6ICAgICAiXG4JLW8JQ3JlYXRlIChyZXF1aXJlcyAtSCBuZXdjKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQ1BJT19QKAorLy91c2FnZTogICAgICJcbgktcCBESVIJQ29weSBmaWxlcyB0byBESVIiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1kCU1ha2UgbGVhZGluZyBkaXJlY3RvcmllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JUHJlc2VydmUgbXRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS11CU92ZXJ3cml0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLUYgRklMRQlJbnB1dCAoLXQsLWksLXApIG9yIG91dHB1dCAoLW8pIGZpbGUiCisvL3VzYWdlOglJRl9GRUFUVVJFX0NQSU9fTygKKy8vdXNhZ2U6ICAgICAiXG4JLUggbmV3YwlBcmNoaXZlIGZvcm1hdCIKKy8vdXNhZ2U6CSkKKworLyogR05VIGNwaW8gMi45IC0taGVscCAoYWJyaWRnZWQpOgorCisgTW9kZXM6CisgIC10LCAtLWxpc3QgICAgICAgICAgICAgICAgIExpc3QgdGhlIGFyY2hpdmUKKyAgLWksIC0tZXh0cmFjdCAgICAgICAgICAgICAgRXh0cmFjdCBmaWxlcyBmcm9tIGFuIGFyY2hpdmUKKyAgLW8sIC0tY3JlYXRlICAgICAgICAgICAgICAgQ3JlYXRlIHRoZSBhcmNoaXZlCisgIC1wLCAtLXBhc3MtdGhyb3VnaCAgICAgICAgIENvcHktcGFzcyBtb2RlCisKKyBPcHRpb25zIHZhbGlkIGluIGFueSBtb2RlOgorICAgICAgLS1ibG9jay1zaXplPVNJWkUgICAgICBJL08gYmxvY2sgc2l6ZSA9IFNJWkUgKiA1MTIgYnl0ZXMKKyAgLUIgICAgICAgICAgICAgICAgICAgICAgICAgSS9PIGJsb2NrIHNpemUgPSA1MTIwIGJ5dGVzCisgIC1jICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgb2xkIHBvcnRhYmxlIChBU0NJSSkgYXJjaGl2ZSBmb3JtYXQKKyAgLUMsIC0taW8tc2l6ZT1OVU1CRVIgICAgICAgSS9PIGJsb2NrIHNpemUgaW4gYnl0ZXMKKyAgLWYsIC0tbm9ubWF0Y2hpbmcgICAgICAgICAgT25seSBjb3B5IGZpbGVzIHRoYXQgZG8gbm90IG1hdGNoIGdpdmVuIHBhdHRlcm4KKyAgLUYsIC0tZmlsZT1GSUxFICAgICAgICAgICAgVXNlIEZJTEUgaW5zdGVhZCBvZiBzdGFuZGFyZCBpbnB1dCBvciBvdXRwdXQKKyAgLUgsIC0tZm9ybWF0PUZPUk1BVCAgICAgICAgVXNlIGdpdmVuIGFyY2hpdmUgRk9STUFUCisgIC1NLCAtLW1lc3NhZ2U9U1RSSU5HICAgICAgIFByaW50IFNUUklORyB3aGVuIHRoZSBlbmQgb2YgYSB2b2x1bWUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cCBtZWRpYSBpcyByZWFjaGVkCisgIC1uLCAtLW51bWVyaWMtdWlkLWdpZCAgICAgIElmIC12LCBzaG93IG51bWVyaWMgVUlEIGFuZCBHSUQKKyAgICAgIC0tcXVpZXQgICAgICAgICAgICAgICAgRG8gbm90IHByaW50IHRoZSBudW1iZXIgb2YgYmxvY2tzIGNvcGllZAorICAgICAgLS1yc2gtY29tbWFuZD1DT01NQU5EICBVc2UgcmVtb3RlIENPTU1BTkQgaW5zdGVhZCBvZiByc2gKKyAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgICAgVmVyYm9zZWx5IGxpc3QgdGhlIGZpbGVzIHByb2Nlc3NlZAorICAtViwgLS1kb3QgICAgICAgICAgICAgICAgICBQcmludCBhICIuIiBmb3IgZWFjaCBmaWxlIHByb2Nlc3NlZAorICAtVywgLS13YXJuaW5nPUZMQUcgICAgICAgICBDb250cm9sIHdhcm5pbmcgZGlzcGxheTogJ25vbmUnLCd0cnVuY2F0ZScsJ2FsbCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIG9wdGlvbnMgYWNjdW11bGF0ZQorCisgT3B0aW9ucyB2YWxpZCBvbmx5IGluIC0tZXh0cmFjdCBtb2RlOgorICAtYiwgLS1zd2FwICAgICAgICAgICAgICAgICBTd2FwIGJvdGggaGFsZndvcmRzIG9mIHdvcmRzIGFuZCBieXRlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxmd29yZHMgaW4gdGhlIGRhdGEgKGVxdWl2YWxlbnQgdG8gLXNTKQorICAtciwgLS1yZW5hbWUgICAgICAgICAgICAgICBJbnRlcmFjdGl2ZWx5IHJlbmFtZSBmaWxlcworICAtcywgLS1zd2FwLWJ5dGVzICAgICAgICAgICBTd2FwIHRoZSBieXRlcyBvZiBlYWNoIGhhbGZ3b3JkIGluIHRoZSBmaWxlcworICAtUywgLS1zd2FwLWhhbGZ3b3JkcyAgICAgICBTd2FwIHRoZSBoYWxmd29yZHMgb2YgZWFjaCB3b3JkICg0IGJ5dGVzKQorICAgICAgLS10by1zdGRvdXQgICAgICAgICAgICBFeHRyYWN0IGZpbGVzIHRvIHN0YW5kYXJkIG91dHB1dAorICAtRSwgLS1wYXR0ZXJuLWZpbGU9RklMRSAgICBSZWFkIGFkZGl0aW9uYWwgcGF0dGVybnMgc3BlY2lmeWluZyBmaWxlbmFtZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdCBvciBsaXN0IGZyb20gRklMRQorICAgICAgLS1vbmx5LXZlcmlmeS1jcmMgICAgICBWZXJpZnkgQ1JDJ3MsIGRvbid0IGFjdHVhbGx5IGV4dHJhY3QgdGhlIGZpbGVzCisKKyBPcHRpb25zIHZhbGlkIG9ubHkgaW4gLS1jcmVhdGUgbW9kZToKKyAgLUEsIC0tYXBwZW5kICAgICAgICAgICAgICAgQXBwZW5kIHRvIGFuIGV4aXN0aW5nIGFyY2hpdmUKKyAgLU8gRklMRSAgICAgICAgICAgICAgICAgICAgRmlsZSB0byB1c2UgaW5zdGVhZCBvZiBzdGFuZGFyZCBvdXRwdXQKKworIE9wdGlvbnMgdmFsaWQgb25seSBpbiAtLXBhc3MtdGhyb3VnaCBtb2RlOgorICAtbCwgLS1saW5rICAgICAgICAgICAgICAgICBMaW5rIGZpbGVzIGluc3RlYWQgb2YgY29weWluZyB0aGVtLCB3aGVuIHBvc3NpYmxlCisKKyBPcHRpb25zIHZhbGlkIGluIC0tZXh0cmFjdCBhbmQgLS1jcmVhdGUgbW9kZXM6CisgICAgICAtLWFic29sdXRlLWZpbGVuYW1lcyAgIERvIG5vdCBzdHJpcCBmaWxlIHN5c3RlbSBwcmVmaXggY29tcG9uZW50cyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIG5hbWVzCisgICAgICAtLW5vLWFic29sdXRlLWZpbGVuYW1lcyBDcmVhdGUgYWxsIGZpbGVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcgorCisgT3B0aW9ucyB2YWxpZCBpbiAtLWNyZWF0ZSBhbmQgLS1wYXNzLXRocm91Z2ggbW9kZXM6CisgIC0wLCAtLW51bGwgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBmaWxlbmFtZXMgaXMgdGVybWluYXRlZCBieSBhIE5VTAorICAtYSwgLS1yZXNldC1hY2Nlc3MtdGltZSAgICBSZXNldCB0aGUgYWNjZXNzIHRpbWVzIG9mIGZpbGVzIGFmdGVyIHJlYWRpbmcgdGhlbQorICAtSSBGSUxFICAgICAgICAgICAgICAgICAgICBGaWxlIHRvIHVzZSBpbnN0ZWFkIG9mIHN0YW5kYXJkIGlucHV0CisgIC1MLCAtLWRlcmVmZXJlbmNlICAgICAgICAgIERlcmVmZXJlbmNlIHN5bWJvbGljIGxpbmtzIChjb3B5IHRoZSBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZXkgcG9pbnQgdG8gaW5zdGVhZCBvZiBjb3B5aW5nIHRoZSBsaW5rcykKKyAgLVIsIC0tb3duZXI9W1VTRVJdWzouXVtHUk9VUF0gU2V0IG93bmVyIG9mIGNyZWF0ZWQgZmlsZXMKKworIE9wdGlvbnMgdmFsaWQgaW4gLS1leHRyYWN0IGFuZCAtLXBhc3MtdGhyb3VnaCBtb2RlczoKKyAgLWQsIC0tbWFrZS1kaXJlY3RvcmllcyAgICAgQ3JlYXRlIGxlYWRpbmcgZGlyZWN0b3JpZXMgd2hlcmUgbmVlZGVkCisgIC1tLCAtLXByZXNlcnZlLW1vZGlmaWNhdGlvbi10aW1lICBSZXRhaW4gbXRpbWUgd2hlbiBjcmVhdGluZyBmaWxlcworICAgICAgLS1uby1wcmVzZXJ2ZS1vd25lciAgICBEbyBub3QgY2hhbmdlIHRoZSBvd25lcnNoaXAgb2YgdGhlIGZpbGVzCisgICAgICAtLXNwYXJzZSAgICAgICAgICAgICAgIFdyaXRlIGZpbGVzIHdpdGggYmxvY2tzIG9mIHplcm9zIGFzIHNwYXJzZSBmaWxlcworICAtdSwgLS11bmNvbmRpdGlvbmFsICAgICAgICBSZXBsYWNlIGFsbCBmaWxlcyB1bmNvbmRpdGlvbmFsbHkKKyAqLworCitlbnVtIHsKKwlPUFRfRVhUUkFDVCAgICAgICAgICAgID0gKDEgPDwgMCksCisJT1BUX1RFU1QgICAgICAgICAgICAgICA9ICgxIDw8IDEpLAorCU9QVF9OVUxfVEVSTUlOQVRFRCAgICAgPSAoMSA8PCAyKSwKKwlPUFRfVU5DT05ESVRJT05BTCAgICAgID0gKDEgPDwgMyksCisJT1BUX1ZFUkJPU0UgICAgICAgICAgICA9ICgxIDw8IDQpLAorCU9QVF9DUkVBVEVfTEVBRElOR19ESVIgPSAoMSA8PCA1KSwKKwlPUFRfUFJFU0VSVkVfTVRJTUUgICAgID0gKDEgPDwgNiksCisJT1BUX0RFUkVGICAgICAgICAgICAgICA9ICgxIDw8IDcpLAorCU9QVF9GSUxFICAgICAgICAgICAgICAgPSAoMSA8PCA4KSwKKwlPUFRCSVRfRklMRSA9IDgsCisJSUZfRkVBVFVSRV9DUElPX08oT1BUQklUX0NSRUFURSAgICAgLCkKKwlJRl9GRUFUVVJFX0NQSU9fTyhPUFRCSVRfRk9STUFUICAgICAsKQorCUlGX0ZFQVRVUkVfQ1BJT19QKE9QVEJJVF9QQVNTVEhST1VHSCwpCisJSUZfTE9OR19PUFRTKCAgICAgT1BUQklUX1FVSUVUICAgICAgLCkKKwlJRl9MT05HX09QVFMoICAgICBPUFRCSVRfMlNURE9VVCAgICAsKQorCU9QVF9DUkVBVEUgICAgICAgICAgICAgPSBJRl9GRUFUVVJFX0NQSU9fTygoMSA8PCBPUFRCSVRfQ1JFQVRFICAgICApKSArIDAsCisJT1BUX0ZPUk1BVCAgICAgICAgICAgICA9IElGX0ZFQVRVUkVfQ1BJT19PKCgxIDw8IE9QVEJJVF9GT1JNQVQgICAgICkpICsgMCwKKwlPUFRfUEFTU1RIUk9VR0ggICAgICAgID0gSUZfRkVBVFVSRV9DUElPX1AoKDEgPDwgT1BUQklUX1BBU1NUSFJPVUdIKSkgKyAwLAorCU9QVF9RVUlFVCAgICAgICAgICAgICAgPSBJRl9MT05HX09QVFMoICAgICAoMSA8PCBPUFRCSVRfUVVJRVQgICAgICApKSArIDAsCisJT1BUXzJTVERPVVQgICAgICAgICAgICA9IElGX0xPTkdfT1BUUyggICAgICgxIDw8IE9QVEJJVF8yU1RET1VUICAgICkpICsgMCwKK307CisKKyNkZWZpbmUgT1BUSU9OX1NUUiAiaXQwdXZkbUxGOiIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NQSU9fTworc3RhdGljIG9mZl90IGNwaW9fcGFkNChvZmZfdCBzaXplKQoreworCWludCBpOworCisJaSA9ICgtIHNpemUpICYgMzsKKwlzaXplICs9IGk7CisJd2hpbGUgKC0taSA+PSAwKQorCQliYl9wdXRjaGFyKCdcMCcpOworCXJldHVybiBzaXplOworfQorCisvKiBSZXR1cm4gdmFsdWUgd2lsbCBiZWNvbWUgZXhpdCBjb2RlLgorICogSXQncyBvayB0byBleGl0IGluc3RlYWQgb2YgcmV0dXJuLiAqLworc3RhdGljIE5PSU5MSU5FIGludCBjcGlvX28odm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciB0cmFpbGVyW10gQUxJR04xID0gIlRSQUlMRVIhISEiOworCXN0cnVjdCBuYW1lX3MgeworCQlzdHJ1Y3QgbmFtZV9zICpuZXh0OworCQljaGFyIG5hbWVbMV07CisJfTsKKwlzdHJ1Y3QgaW5vZGVzX3MgeworCQlzdHJ1Y3QgaW5vZGVzX3MgKm5leHQ7CisJCXN0cnVjdCBuYW1lX3MgKm5hbWVzOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwl9OworCisJc3RydWN0IGlub2Rlc19zICpsaW5rcyA9IE5VTEw7CisJb2ZmX3QgYnl0ZXMgPSAwOyAvKiBvdXRwdXQgYnl0ZXMgY291bnQgKi8KKworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWNoYXIgKmxpbmU7CisJCXN0cnVjdCBzdGF0IHN0OworCisJCWxpbmUgPSAob3B0aW9uX21hc2szMiAmIE9QVF9OVUxfVEVSTUlOQVRFRCkKKwkJCQk/IGJiX2dldF9jaHVua19mcm9tX2ZpbGUoc3RkaW4sIE5VTEwpCisJCQkJOiB4bWFsbG9jX2ZnZXRsaW5lKHN0ZGluKTsKKworCQlpZiAobGluZSkgeworCQkJLyogU3RyaXAgbGVhZGluZyAiLi9bLi9dLi4uIiBmcm9tIHRoZSBmaWxlbmFtZSAqLworCQkJbmFtZSA9IGxpbmU7CisJCQl3aGlsZSAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLycpIHsKKwkJCQl3aGlsZSAoKisrbmFtZSA9PSAnLycpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCEqbmFtZSkgeyAvKiBsaW5lIGlzIGVtcHR5ICovCisJCQkJZnJlZShsaW5lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9ERVJFRikKKwkJCQkJPyBzdGF0KG5hbWUsICZzdCkKKwkJCQkJOiBsc3RhdChuYW1lLCAmc3QpCisJCQkpIHsKKyBhYm9ydF9jcGlvX286CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShuYW1lKTsKKwkJCX0KKworCQkJaWYgKCEoU19JU0xOSyhzdC5zdF9tb2RlKSB8fCBTX0lTUkVHKHN0LnN0X21vZGUpKSkKKwkJCQlzdC5zdF9zaXplID0gMDsgLyogcGFyYW5vaWEgKi8KKworCQkJLyogU3RvcmUgaGFyZGxpbmtzIGZvciBsYXRlciBwcm9jZXNzaW5nLCBkb250IG91dHB1dCB0aGVtICovCisJCQlpZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkgJiYgc3Quc3RfbmxpbmsgPiAxKSB7CisJCQkJc3RydWN0IG5hbWVfcyAqbjsKKwkJCQlzdHJ1Y3QgaW5vZGVzX3MgKmw7CisKKwkJCQkvKiBEbyB3ZSBoYXZlIHRoaXMgaGFyZGxpbmsgcmVtZW1iZXJlZD8gKi8KKwkJCQlsID0gbGlua3M7CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJaWYgKGwgPT0gTlVMTCkgeworCQkJCQkJLyogTm90IGZvdW5kOiBhZGQgbmV3IGl0ZW0gdG8gImxpbmtzIiBsaXN0ICovCisJCQkJCQlsID0geHphbGxvYyhzaXplb2YoKmwpKTsKKwkJCQkJCWwtPnN0ID0gc3Q7CisJCQkJCQlsLT5uZXh0ID0gbGlua3M7CisJCQkJCQlsaW5rcyA9IGw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAobC0+c3Quc3RfaW5vID09IHN0LnN0X2lubykgeworCQkJCQkJLyogZm91bmQgKi8KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWwgPSBsLT5uZXh0OworCQkJCX0KKwkJCQkvKiBBZGQgbmV3IG5hbWUgdG8gImwtPm5hbWVzIiBsaXN0ICovCisJCQkJbiA9IHhtYWxsb2Moc2l6ZW9mKCpuKSArIHN0cmxlbihuYW1lKSk7CisJCQkJc3RyY3B5KG4tPm5hbWUsIG5hbWUpOworCQkJCW4tPm5leHQgPSBsLT5uYW1lczsKKwkJCQlsLT5uYW1lcyA9IG47CisKKwkJCQlmcmVlKGxpbmUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCX0gZWxzZSB7IC8qIGxpbmUgPT0gTlVMTDogRU9GICovCisgbmV4dF9saW5rOgorCQkJaWYgKGxpbmtzKSB7CisJCQkJLyogT3V0cHV0IGhhcmRsaW5rJ3MgZGF0YSAqLworCQkJCXN0ID0gbGlua3MtPnN0OworCQkJCW5hbWUgPSBsaW5rcy0+bmFtZXMtPm5hbWU7CisJCQkJbGlua3MtPm5hbWVzID0gbGlua3MtPm5hbWVzLT5uZXh0OworCQkJCS8qIEdOVSBjcGlvIGlzIHJlcG9ydGVkIHRvIGVtaXQgZmlsZSBkYXRhCisJCQkJICogb25seSBmb3IgdGhlIGxhc3QgaW5zdGFuY2UuIE1pbWljIHRoYXQuICovCisJCQkJaWYgKGxpbmtzLT5uYW1lcyA9PSBOVUxMKQorCQkJCQlsaW5rcyA9IGxpbmtzLT5uZXh0OworCQkJCWVsc2UKKwkJCQkJc3Quc3Rfc2l6ZSA9IDA7CisJCQkJLyogTkI6IHdlIGxlYWsgbGlua3MtPm5hbWVzIGFuZC9vciBsaW5rcywKKwkJCQkgKiB0aGlzIGlzIGludGVuZGVkICh3ZSBleGl0IHNvb24gYW55d2F5KSAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBJZiBubyAobW9yZSkgaGFyZGxpbmtzIHRvIG91dHB1dCwKKwkJCQkgKiBvdXRwdXQgInRyYWlsZXIiIGVudHJ5ICovCisJCQkJbmFtZSA9IHRyYWlsZXI7CisJCQkJLyogc3Quc3Rfc2l6ZSA9PSAwIGlzIGEgbXVzdCwgYnV0IGZvciB1bmlmb3JtaXR5CisJCQkJICogaW4gdGhlIG91dHB1dCwgd2UgemVybyBvdXQgZXZlcnl0aGluZyAqLworCQkJCW1lbXNldCgmc3QsIDAsIHNpemVvZihzdCkpOworCQkJCS8qIHN0LnN0X25saW5rID0gMTsgLSBHTlUgY3BpbyBkb2VzIHRoaXMgKi8KKwkJCX0KKwkJfQorCisJCWJ5dGVzICs9IHByaW50ZigiMDcwNzAxIgorCQkgICAgICAgICAgICAgICAgIiUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFgiCisJCSAgICAgICAgICAgICAgICAiJTA4WCUwOFglMDhYJTA4WCIgLyogR05VIGNwaW8gdXNlcyB1cHBlcmNhc2UgaGV4ICovCisJCQkJLyogc3RybGVuKzE6ICovICIlMDhYIgorCQkJCS8qIGNoa3N1bTogKi8gICAiMDAwMDAwMDAiIC8qIChvbmx5IGZvciAiMDcwNzAyIiBmaWxlcykgKi8KKwkJCQkvKiBuYW1lLE5VTDogKi8gIiVzJWMiLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgc3Quc3RfaW5vLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgc3Quc3RfbW9kZSwKKwkJICAgICAgICAgICAgICAgICh1bnNpZ25lZCkodWludDMyX3QpIHN0LnN0X3VpZCwKKwkJICAgICAgICAgICAgICAgICh1bnNpZ25lZCkodWludDMyX3QpIHN0LnN0X2dpZCwKKwkJICAgICAgICAgICAgICAgICh1bnNpZ25lZCkodWludDMyX3QpIHN0LnN0X25saW5rLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgc3Quc3RfbXRpbWUsCisJCSAgICAgICAgICAgICAgICAodW5zaWduZWQpKHVpbnQzMl90KSBzdC5zdF9zaXplLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgbWFqb3Ioc3Quc3RfZGV2KSwKKwkJICAgICAgICAgICAgICAgICh1bnNpZ25lZCkodWludDMyX3QpIG1pbm9yKHN0LnN0X2RldiksCisJCSAgICAgICAgICAgICAgICAodW5zaWduZWQpKHVpbnQzMl90KSBtYWpvcihzdC5zdF9yZGV2KSwKKwkJICAgICAgICAgICAgICAgICh1bnNpZ25lZCkodWludDMyX3QpIG1pbm9yKHN0LnN0X3JkZXYpLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKShzdHJsZW4obmFtZSkgKyAxKSwKKwkJICAgICAgICAgICAgICAgIG5hbWUsICdcMCcpOworCQlieXRlcyA9IGNwaW9fcGFkNChieXRlcyk7CisKKwkJaWYgKHN0LnN0X3NpemUpIHsKKwkJCWlmIChTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisJCQkJY2hhciAqbHBhdGggPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4obmFtZSk7CisJCQkJaWYgKCFscGF0aCkKKwkJCQkJZ290byBhYm9ydF9jcGlvX287CisJCQkJYnl0ZXMgKz0gcHJpbnRmKCIlcyIsIGxwYXRoKTsKKwkJCQlmcmVlKGxwYXRoKTsKKwkJCX0gZWxzZSB7IC8qIFNfSVNSRUcgKi8KKwkJCQlpbnQgZmQgPSB4b3BlbihuYW1lLCBPX1JET05MWSk7CisJCQkJZmZsdXNoX2FsbCgpOworCQkJCS8qIFdlIG11c3QgYWJvcnQgaWYgZmlsZSBnb3Qgc2hvcnRlciB0b28hICovCisJCQkJYmJfY29weWZkX2V4YWN0X3NpemUoZmQsIFNURE9VVF9GSUxFTk8sIHN0LnN0X3NpemUpOworCQkJCWJ5dGVzICs9IHN0LnN0X3NpemU7CisJCQkJY2xvc2UoZmQpOworCQkJfQorCQkJYnl0ZXMgPSBjcGlvX3BhZDQoYnl0ZXMpOworCQl9CisKKwkJaWYgKCFsaW5lKSB7CisJCQlpZiAobmFtZSAhPSB0cmFpbGVyKQorCQkJCWdvdG8gbmV4dF9saW5rOworCQkJLyogVE9ETzogR05VIGNwaW8gcGFkcyB0cmFpbGVyIHRvIDUxMiBieXRlcywgZG8gd2Ugd2FudCB0aGF0PyAqLworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCisJCWZyZWUobGluZSk7CisJfSAvKiBlbmQgb2YgIndoaWxlICgxKSIgKi8KK30KKyNlbmRpZgorCitpbnQgY3Bpb19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY3Bpb19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGU7CisJY2hhciAqY3Bpb19maWxlbmFtZTsKKwlJRl9GRUFUVVJFX0NQSU9fTyhjb25zdCBjaGFyICpjcGlvX2ZtdCA9ICIiOykKKwl1bnNpZ25lZCBvcHQ7CisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9CisJCSJleHRyYWN0XDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgImkiCisJCSJsaXN0XDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1BJT19PCisJCSJjcmVhdGVcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm8iCisJCSJmb3JtYXRcMCIgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkgiCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1BJT19QCisJCSJwYXNzLXRocm91Z2hcMCIgTm9fYXJndW1lbnQgICAgICAgInAiCisjZW5kaWYKKyNlbmRpZgorCQkidmVyYm9zZVwwIiAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ2IgorCQkicXVpZXRcMCIgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJceGZmIgorCQkidG8tc3Rkb3V0XDAiICAgIE5vX2FyZ3VtZW50ICAgICAgICJceGZlIgorCQk7CisjZW5kaWYKKworCWFyY2hpdmVfaGFuZGxlID0gaW5pdF9oYW5kbGUoKTsKKwkvKiBhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkID0gU1RESU5fRklMRU5POyAtIGRvbmUgYnkgaW5pdF9oYW5kbGUgKi8KKwlhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgPSBBUkNISVZFX0VYVFJBQ1RfTkVXRVI7CisKKwkvKiBBcyBvZiBub3cgd2UgZG8gbm90IGVuZm9yY2UgdGhpczogKi8KKwkvKiAtaSwtdCwtbywtcCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisJLyogLXUsLWQsLW0gbWFrZSBzZW5zZSBvbmx5IHdpdGggLWkgb3IgLXAgKi8KKwkvKiAtTCBtYWtlcyBzZW5zZSBvbmx5IHdpdGggLW8gb3IgLXAgKi8KKworI2lmICFFTkFCTEVfRkVBVFVSRV9DUElPX08KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBPUFRJT05fU1RSLCAmY3Bpb19maWxlbmFtZSk7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIE9QVF9GSUxFKSB7IC8qIC1GICovCisJCXhtb3ZlX2ZkKHhvcGVuKGNwaW9fZmlsZW5hbWUsIE9fUkRPTkxZKSwgU1RESU5fRklMRU5PKTsKKwl9CisjZWxzZQorCW9wdCA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIgIm9IOiIgSUZfRkVBVFVSRV9DUElPX1AoInAiKSwgJmNwaW9fZmlsZW5hbWUsICZjcGlvX2ZtdCk7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKChvcHQgJiAoT1BUX0ZJTEV8T1BUX0NSRUFURSkpID09IE9QVF9GSUxFKSB7IC8qIC1GIHdpdGhvdXQgLW8gKi8KKwkJeG1vdmVfZmQoeG9wZW4oY3Bpb19maWxlbmFtZSwgT19SRE9OTFkpLCBTVERJTl9GSUxFTk8pOworCX0KKwlpZiAob3B0ICYgT1BUX1BBU1NUSFJPVUdIKSB7CisJCXBpZF90IHBpZDsKKwkJc3RydWN0IGZkX3BhaXIgcHA7CisKKwkJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJaWYgKG9wdCAmIE9QVF9DUkVBVEVfTEVBRElOR19ESVIpCisJCQlta2Rpcihhcmd2WzBdLCAwNzc3KTsKKwkJLyogQ3J1ZGUgZXhpc3RlbmNlIGNoZWNrOgorCQkgKiBjbG9zZSh4b3Blbihhcmd2WzBdLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKSk7CisJCSAqIFdlIGNhbiBhbHNvIHhvcGVuLCBmc3RhdCwgSVNfRElSLCBsYXRlciBmY2hkaXIuCisJCSAqIFRoaXMgd291bGQgY2hlY2sgZm9yIGV4aXN0ZW5jZSBlYXJsaWVyIGFuZCBjbGVhbmVyLgorCQkgKiBBcyBpdCBzdGFuZHMgbm93LCBpZiB3ZSBmYWlsIHhjaGRpciBsYXRlciwKKwkJICogY2hpbGQgZGllcyBvbiBFUElQRSwgdW5sZXNzIGl0IGNhdWdodAorCQkgKiBhIGRpZmZyZXJlbnQgcHJvYmxlbSBlYXJsaWVyLgorCQkgKiBUaGlzIGlzIGdvb2QgZW5vdWdoIGZvciBub3cuCisJCSAqLworI2lmICFCQl9NTVUKKwkJcHAucmQgPSAzOworCQlwcC53ciA9IDQ7CisJCWlmICghcmVfZXhlY2VkKSB7CisJCQljbG9zZSgzKTsKKwkJCWNsb3NlKDQpOworCQkJeHBpcGVkX3BhaXIocHApOworCQl9CisjZWxzZQorCQl4cGlwZWRfcGFpcihwcCk7CisjZW5kaWYKKwkJcGlkID0gZm9ya19vcl9yZXhlYyhhcmd2IC0gb3B0aW5kKTsKKwkJaWYgKHBpZCA9PSAwKSB7IC8qIGNoaWxkICovCisJCQljbG9zZShwcC5yZCk7CisJCQl4bW92ZV9mZChwcC53ciwgU1RET1VUX0ZJTEVOTyk7CisJCQlnb3RvIGR1bXA7CisJCX0KKwkJLyogcGFyZW50ICovCisJCXhjaGRpcigqYXJndisrKTsKKwkJY2xvc2UocHAud3IpOworCQl4bW92ZV9mZChwcC5yZCwgU1RESU5fRklMRU5PKTsKKwkJLy9vcHQgJj0gfk9QVF9QQVNTVEhST1VHSDsKKwkJb3B0IHw9IE9QVF9FWFRSQUNUOworCQlnb3RvIHNraXA7CisJfQorCS8qIC1vICovCisJaWYgKG9wdCAmIE9QVF9DUkVBVEUpIHsKKwkJaWYgKGNwaW9fZm10WzBdICE9ICduJykgLyogd2UgX3JlcXVpcmVfICItSCBuZXdjIiAqLworCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAob3B0ICYgT1BUX0ZJTEUpIHsKKwkJCXhtb3ZlX2ZkKHhvcGVuKGNwaW9fZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCBTVERPVVRfRklMRU5PKTsKKwkJfQorIGR1bXA6CisJCXJldHVybiBjcGlvX28oKTsKKwl9Cisgc2tpcDoKKyNlbmRpZgorCisJLyogT25lIG9mIGVpdGhlciBleHRyYWN0IG9yIHRlc3Qgb3B0aW9ucyBtdXN0IGJlIGdpdmVuICovCisJaWYgKChvcHQgJiAoT1BUX1RFU1QgfCBPUFRfRVhUUkFDVCkpID09IDApIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmIChvcHQgJiBPUFRfVEVTVCkgeworCQkvKiBpZiBib3RoIGV4dHJhY3QgYW5kIHRlc3Qgb3B0aW9ucyBhcmUgZ2l2ZW4sIGlnbm9yZSBleHRyYWN0IG9wdGlvbiAqLworCQlvcHQgJj0gfk9QVF9FWFRSQUNUOworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl9saXN0OworCX0KKwlpZiAob3B0ICYgT1BUX0VYVFJBQ1QpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X2FsbDsKKwkJaWYgKG9wdCAmIE9QVF8yU1RET1VUKQorCQkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X3RvX3N0ZG91dDsKKwl9CisJaWYgKG9wdCAmIE9QVF9VTkNPTkRJVElPTkFMKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyB8PSBBUkNISVZFX1VOTElOS19PTEQ7CisJCWFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmPSB+QVJDSElWRV9FWFRSQUNUX05FV0VSOworCX0KKwlpZiAob3B0ICYgT1BUX1ZFUkJPU0UpIHsKKwkJaWYgKGFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID09IGhlYWRlcl9saXN0KSB7CisJCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl92ZXJib3NlX2xpc3Q7CisJCX0gZWxzZSB7CisJCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl9saXN0OworCQl9CisJfQorCWlmIChvcHQgJiBPUFRfQ1JFQVRFX0xFQURJTkdfRElSKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyB8PSBBUkNISVZFX0NSRUFURV9MRUFESU5HX0RJUlM7CisJfQorCWlmIChvcHQgJiBPUFRfUFJFU0VSVkVfTVRJTUUpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfUkVTVE9SRV9EQVRFOworCX0KKworCXdoaWxlICgqYXJndikgeworCQlhcmNoaXZlX2hhbmRsZS0+ZmlsdGVyID0gZmlsdGVyX2FjY2VwdF9saXN0OworCQlsbGlzdF9hZGRfdG8oJmFyY2hpdmVfaGFuZGxlLT5hY2NlcHQsICphcmd2KTsKKwkJYXJndisrOworCX0KKworCS8qIHNlZSBnZXRfaGVhZGVyX2NwaW8gKi8KKwlhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fYmxvY2tzID0gKG9mZl90KS0xOworCXdoaWxlIChnZXRfaGVhZGVyX2NwaW8oYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJY29udGludWU7CisKKwlpZiAoYXJjaGl2ZV9oYW5kbGUtPmNwaW9fX2Jsb2NrcyAhPSAob2ZmX3QpLTEKKwkgJiYgIShvcHQgJiBPUFRfUVVJRVQpCisJKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJSJPRkZfRk1UInUgYmxvY2tzXG4iLCBhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fYmxvY2tzKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvZHBrZy5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvZHBrZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmE3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9kcGtnLmMKQEAgLTAsMCArMSwxOTIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgbWluaSBkcGtnIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94LgorICogIHRoaXMgaXMgbm90IG1lYW50IGFzIGEgcmVwbGFjZW1lbnQgZm9yIGRwa2cKKyAqCisgKiAgd3JpdHRlbiBieSBnbGVubiBtY2dyYXRoIHdpdGggdGhlIGhlbHAgb2Ygb3RoZXJzCisgKiAgY29weXJpZ2h0IChjKSAyMDAxIGJ5IGdsZW5uIG1jZ3JhdGgKKyAqCisgKiAgcGFydHMgb2YgdGhlIHZlcnNpb24gY29tcGFyaXNvbiBjb2RlIGlzIHBsdWNrZWQgZnJvbSB0aGUgcmVhbCBkcGtnCisgKiAgYXBwbGljYXRpb24gd2hpY2ggaXMgbGljZW5zZWQgR1BMdjIgYW5kCisgKiAgY29weXJpZ2h0IChjKSAxOTk1IElhbiBKYWNrc29uIDxpYW5AY2hpYXJrLmdyZWVuZW5kLm9yZy51az4KKyAqCisgKiAgc3RhcnRlZCBsaWZlIGFzIGEgYnVzeWJveCBpbXBsZW1lbnRhdGlvbiBvZiB1ZHBrZworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIGtub3duIGRpZmZlcmVuY2UgYmV0d2VlbiBidXN5Ym94IGRwa2cgYW5kIHRoZSBvZmZpY2lhbCBkcGtnIHRoYXQgaSBkb24ndAorICogY29uc2lkZXIgaW1wb3J0YW50LCBpdHMgd29ydGgga2VlcGluZyBhIG5vdGUgb2YgZGlmZmVyZW5jZXMgYW55d2F5LCBqdXN0IHRvCisgKiBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbi4KKyAqICAtIHRoZSBmaXJzdCB2YWx1ZSBmb3IgdGhlIGNvbmZmbGlsZTogZmllbGQgaXNudCBwbGFjZWQgb24gYSBuZXcgbGluZS4KKyAqICAtIHdoZW4gaW5zdGFsbGluZyBhIHBhY2thZ2UgdGhlIHN0YXR1czogZmllbGQgaXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlCisgKiAgICAgIHNlY3Rpb24sIHJhdGhlciB0aGFuIGp1c3QgYWZ0ZXIgdGhlIHBhY2thZ2U6IGZpZWxkLgorICoKKyAqIGJ1Z3MgdGhhdCBuZWVkIHRvIGJlIGZpeGVkCisgKiAgLSAodW5rbm93biwgcGxlYXNlIGxldCBtZSBrbm93IHdoZW4geW91IGZpbmQgYW55KQorICoKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZHBrZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1pbENQcnVdIFstRiBPUFRdIFBBQ0tBR0UiCisvL3VzYWdlOiNkZWZpbmUgZHBrZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkluc3RhbGwsIHJlbW92ZSBhbmQgbWFuYWdlIERlYmlhbiBwYWNrYWdlc1xuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktaSwtLWluc3RhbGwJSW5zdGFsbCB0aGUgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwsLS1saXN0CUxpc3Qgb2YgaW5zdGFsbGVkIHBhY2thZ2VzIgorLy91c2FnZTogICAgICJcbgktLWNvbmZpZ3VyZQlDb25maWd1cmUgYW4gdW5wYWNrYWdlZCBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktUCwtLXB1cmdlCVB1cmdlIGFsbCBmaWxlcyBvZiBhIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1yLC0tcmVtb3ZlCVJlbW92ZSBhbGwgYnV0IHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBhIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS0tdW5wYWNrCVVucGFjayBhIHBhY2thZ2UsIGJ1dCBkb24ndCBjb25maWd1cmUgaXQiCisvL3VzYWdlOiAgICAgIlxuCS0tZm9yY2UtZGVwZW5kcwlJZ25vcmUgZGVwZW5kZW5jeSBwcm9ibGVtcyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1mb3JjZS1jb25mbmV3CU92ZXJ3cml0ZSBleGlzdGluZyBjb25maWcgZmlsZXMgd2hlbiBpbnN0YWxsaW5nIgorLy91c2FnZTogICAgICJcbgktLWZvcmNlLWNvbmZvbGQJS2VlcCBvbGQgY29uZmlnIGZpbGVzIHdoZW4gaW5zdGFsbGluZyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1pCQlJbnN0YWxsIHRoZSBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktbAkJTGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMiCisvL3VzYWdlOiAgICAgIlxuCS1DCQlDb25maWd1cmUgYW4gdW5wYWNrYWdlZCBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktUAkJUHVyZ2UgYWxsIGZpbGVzIG9mIGEgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJCVJlbW92ZSBhbGwgYnV0IHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBhIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS11CQlVbnBhY2sgYSBwYWNrYWdlLCBidXQgZG9uJ3QgY29uZmlndXJlIGl0IgorLy91c2FnZTogICAgICJcbgktRiBkZXBlbmRzCUlnbm9yZSBkZXBlbmRlbmN5IHByb2JsZW1zIgorLy91c2FnZTogICAgICJcbgktRiBjb25mbmV3CU92ZXJ3cml0ZSBleGlzdGluZyBjb25maWcgZmlsZXMgd2hlbiBpbnN0YWxsaW5nIgorLy91c2FnZTogICAgICJcbgktRiBjb25mb2xkCUtlZXAgb2xkIGNvbmZpZyBmaWxlcyB3aGVuIGluc3RhbGxpbmciCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKy8qIG5vdGU6IGlmIHlvdSB2YXJ5IGhhc2hfcHJpbWUgc2l6ZXMgYmUgYXdhcmUsCisgKiAxKSB0d2Vha2luZyB0aGVzZSB3aWxsIGhhdmUgYSBiaWcgZWZmZWN0IG9uIGhvdyBtdWNoIG1lbW9yeSB0aGlzIHByb2dyYW0gdXNlcy4KKyAqIDIpIGZvciBjb21wdXRhdGlvbmFsIGVmZmljaWVuY3kgdGhlc2UgaGFzaCB0YWJsZXMgc2hvdWxkIGJlIGF0IGxlYXN0IDIwJQorICogICAgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHN0b3JlZCBpbiBpdC4KKyAqIDMpIGFsbCBfaGFzaF9wcmltZSdzIG11c3QgYmUgYSBwcmltZSBudW1iZXIgb3IgY2hhb3MgaXMgYXNzdXJlZCwgaWYgeW91ciBsb29raW5nCisgKiAgICBmb3IgYSBwcmltZSwgdHJ5IGh0dHA6Ly93d3cudXRtLmVkdS9yZXNlYXJjaC9wcmltZXMvbGlzdHMvc21hbGwvMTAwMDAudHh0CisgKiA0KSBpZiB5b3UgZ28gYmlnZ2VyIHRoYW4gMTUgYml0cyB5b3UgbWF5IGdldCBpbnRvIHRyb3VibGUgKHVudGVzdGVkKSBhcyBpdHMKKyAqICAgIHNvbWV0aW1lcyBjYXN0IHRvIGFuIHVuc2lnbmVkLCBpZiB5b3UgZ28gdG8gMTYgYml0IHlvdSB3aWxsIG92ZXJsYXAKKyAqICAgIGludCdzIGFuZCBjaGFvcyBpcyBhc3N1cmVkLCAxNjM4MSBpcyB0aGUgbWF4IHByaW1lIGZvciAxNCBiaXQgZmllbGQKKyAqLworCisvKiBOQU1FX0hBU0hfUFJJTUUsIFN0b3JlcyBwYWNrYWdlIG5hbWVzIGFuZCB2ZXJzaW9ucywKKyAqIEkgZXN0aW1hdGUgaXQgc2hvdWxkIGJlIGF0IGxlYXN0IDUwJSBiaWdnZXIgdGhhbiBQQUNLQUdFX0hBU0hfUFJJTUUsCisgKiBhcyB0aGVyZSBhIGxvdCBvZiBkdXBsaWNhdGUgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIE5BTUVfSEFTSF9QUklNRSAxNjM4MQorCisvKiBQQUNLQUdFX0hBU0hfUFJJTUUsIE1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSBwYWNrYWdlcywKKyAqIEl0IG11c3Qgbm90IGJlIHNtYWxsZXIgdGhhbiBTVEFUVVNfSEFTSF9QUklNRSwKKyAqIEN1cnJlbnRseSBvbmx5IHBhY2thZ2VzIGZyb20gc3RhdHVzX2hhc2h0YWJsZSBhcmUgc3RvcmVkIGluIGhlcmUsIGJ1dCBpbgorICogZnV0dXJlIHRoaXMgbWF5IGJlIHVzZWQgdG8gc3RvcmUgcGFja2FnZXMgbm90IG9ubHkgZnJvbSBhIHN0YXR1cyBmaWxlLAorICogYnV0IGFuIGF2YWlsYWJsZV9oYXNodGFibGUsIGFuZCBldmVuIG11bHRpcGxlIHBhY2thZ2VzIGZpbGVzLgorICogUGFja2FnZSBjYW4gYmUgc3RvcmVkIG1vcmUgdGhhbiBvbmNlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbnMuCisgKiBlLmcuIFRoZSBzYW1lIHBhY2thZ2UgbWF5IGhhdmUgZGlmZmVyZW50IHZlcnNpb25zIGluIHRoZSBzdGF0dXMgZmlsZQorICogICAgICBhbmQgYXZhaWxhYmxlIGZpbGUgKi8KKyNkZWZpbmUgUEFDS0FHRV9IQVNIX1BSSU1FIDEwMDA3Cit0eXBlZGVmIHN0cnVjdCBlZGdlX3MgeworCXVuc2lnbmVkIG9wZXJhdG9yOjQ7IC8qIHdhczozICovCisJdW5zaWduZWQgdHlwZTo0OworCXVuc2lnbmVkIG5hbWU6MTY7IC8qIHdhczoxNCAqLworCXVuc2lnbmVkIHZlcnNpb246MTY7IC8qIHdhczoxNCAqLworfSBlZGdlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNvbW1vbl9ub2RlX3MgeworCXVuc2lnbmVkIG5hbWU6MTY7IC8qIHdhczoxNCAqLworCXVuc2lnbmVkIHZlcnNpb246MTY7IC8qIHdhczoxNCAqLworCXVuc2lnbmVkIG51bV9vZl9lZGdlczoxNjsgLyogd2FzOjE0ICovCisJZWRnZV90ICoqZWRnZTsKK30gY29tbW9uX25vZGVfdDsKKworLyogQ3VycmVudGx5IGl0IGRvZXNudCBzdG9yZSBwYWNrYWdlcyB0aGF0IGhhdmUgc3RhdGUtc3RhdHVzIG9mIG5vdC1pbnN0YWxsZWQKKyAqIFNvIGl0IG9ubHkgcmVhbGx5IGhhcyB0byBiZSB0aGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2FnZXMKKyAqIGxpa2VseSB0byBiZSBpbnN0YWxsZWQgYXQgYW55IG9uZSB0aW1lLCBzbyB0aGVyZSBpcyBhIGJpdCBvZiBsZWV3YXkgaGVyZSAqLworI2RlZmluZSBTVEFUVVNfSEFTSF9QUklNRSA4MTkxCit0eXBlZGVmIHN0cnVjdCBzdGF0dXNfbm9kZV9zIHsKKwl1bnNpZ25lZCBwYWNrYWdlOjE2OyAvKiB3YXM6MTQgKi8gICAgICAgLyogaGFzIHRvIGZpdCBQQUNLQUdFX0hBU0hfUFJJTUUgKi8KKwl1bnNpZ25lZCBzdGF0dXM6MTY7IC8qIHdhczoxNCAqLyAgICAgICAgLyogaGFzIHRvIGZpdCBTVEFUVVNfSEFTSF9QUklNRSAqLworfSBzdGF0dXNfbm9kZV90OworCisKKy8qIEdsb2JhbHMgKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICAgICAgICAgICpuYW1lX2hhc2h0YWJsZVtOQU1FX0hBU0hfUFJJTUUgKyAxXTsKKwljb21tb25fbm9kZV90ICpwYWNrYWdlX2hhc2h0YWJsZVtQQUNLQUdFX0hBU0hfUFJJTUUgKyAxXTsKKwlzdGF0dXNfbm9kZV90ICpzdGF0dXNfaGFzaHRhYmxlW1NUQVRVU19IQVNIX1BSSU1FICsgMV07Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIG5hbWVfaGFzaHRhYmxlICAgIChHLm5hbWVfaGFzaHRhYmxlICAgKQorI2RlZmluZSBwYWNrYWdlX2hhc2h0YWJsZSAoRy5wYWNrYWdlX2hhc2h0YWJsZSkKKyNkZWZpbmUgc3RhdHVzX2hhc2h0YWJsZSAgKEcuc3RhdHVzX2hhc2h0YWJsZSApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisKKy8qIEV2ZW4gbnVtYmVycyBhcmUgZm9yICdleHRyYXMnLCBsaWtlIG9yZWQgZGVwZW5kZW5jaWVzIG9yIG51bGwgKi8KK2VudW0gZWRnZV90eXBlX2UgeworCUVER0VfTlVMTCA9IDAsCisJRURHRV9QUkVfREVQRU5EUyA9IDEsCisJRURHRV9PUl9QUkVfREVQRU5EUyA9IDIsCisJRURHRV9ERVBFTkRTID0gMywKKwlFREdFX09SX0RFUEVORFMgPSA0LAorCUVER0VfUkVQTEFDRVMgPSA1LAorCUVER0VfUFJPVklERVMgPSA3LAorCUVER0VfQ09ORkxJQ1RTID0gOSwKKwlFREdFX1NVR0dFU1RTID0gMTEsCisJRURHRV9SRUNPTU1FTkRTID0gMTMsCisJRURHRV9FTkhBTkNFUyA9IDE1Cit9OworZW51bSBvcGVyYXRvcl9lIHsKKwlWRVJfTlVMTCA9IDAsCisJVkVSX0VRVUFMID0gMSwKKwlWRVJfTEVTUyA9IDIsCisJVkVSX0xFU1NfRVFVQUwgPSAzLAorCVZFUl9NT1JFID0gNCwKKwlWRVJfTU9SRV9FUVVBTCA9IDUsCisJVkVSX0FOWSA9IDYKK307CisKK3R5cGVkZWYgc3RydWN0IGRlYl9maWxlX3MgeworCWNoYXIgKmNvbnRyb2xfZmlsZTsKKwljaGFyICpmaWxlbmFtZTsKKwl1bnNpZ25lZCBwYWNrYWdlOjE2OyAvKiB3YXM6MTQgKi8KK30gZGViX2ZpbGVfdDsKKworCitzdGF0aWMgdm9pZCBtYWtlX2hhc2goY29uc3QgY2hhciAqa2V5LCB1bnNpZ25lZCAqc3RhcnQsIHVuc2lnbmVkICpkZWNyZW1lbnQsIGNvbnN0IGludCBoYXNoX3ByaW1lKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaF9udW0gPSBrZXlbMF07CisJaW50IGxlbiA9IHN0cmxlbihrZXkpOworCWludCBpOworCisJLyogTWF5YmUgaSBzaG91bGQgaGF2ZSB1c2VzIGEgInByb3BlciIgaGFzaGluZyBhbGdvcml0aG0gaGVyZSBpbnN0ZWFkCisJICogb2YgbWFraW5nIG9uZSB1cCBteXNlbGYsIHNlZW1zIHRvIGJlIHdvcmtpbmcgb2sgdGhvdWdoLiAqLworCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQkvKiBzaGlmdHMgdGhlIGFzY2lpIGJhc2VkIHZhbHVlIGFuZCBhZGRzIGl0IHRvIHByZXZpb3VzIHZhbHVlCisJCSAqIHNoaWZ0IGFtb3VudCBpcyBtb2QgMjQgYmVjYXVzZSBsb25nIGludCBpcyAzMiBiaXQgYW5kIGRhdGEKKwkJICogdG8gYmUgc2hpZnRlZCBpcyA4LCBkb24ndCB3YW50IHRvIHNoaWZ0IGRhdGEgdG8gd2hlcmUgaXQgaGFzCisJCSAqIG5vIGVmZmVjdCAqLworCQloYXNoX251bSArPSAoa2V5W2ldICsga2V5W2ktMV0pIDw8ICgoa2V5W2ldICogaSkgJSAyNCk7CisJfQorCSpzdGFydCA9ICh1bnNpZ25lZCkgaGFzaF9udW0gJSBoYXNoX3ByaW1lOworCSpkZWNyZW1lbnQgPSAodW5zaWduZWQpIDEgKyAoaGFzaF9udW0gJSAoaGFzaF9wcmltZSAtIDEpKTsKK30KKworLyogdGhpcyBhZGRzIHRoZSBrZXkgdG8gdGhlIGhhc2ggdGFibGUgKi8KK3N0YXRpYyBpbnQgc2VhcmNoX25hbWVfaGFzaHRhYmxlKGNvbnN0IGNoYXIgKmtleSkKK3sKKwl1bnNpZ25lZCBwcm9iZV9hZGRyZXNzOworCXVuc2lnbmVkIHByb2JlX2RlY3JlbWVudDsKKworCW1ha2VfaGFzaChrZXksICZwcm9iZV9hZGRyZXNzLCAmcHJvYmVfZGVjcmVtZW50LCBOQU1FX0hBU0hfUFJJTUUpOworCXdoaWxlIChuYW1lX2hhc2h0YWJsZVtwcm9iZV9hZGRyZXNzXSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAobmFtZV9oYXNodGFibGVbcHJvYmVfYWRkcmVzc10sIGtleSkgPT0gMCkgeworCQkJcmV0dXJuIHByb2JlX2FkZHJlc3M7CisJCX0KKwkJcHJvYmVfYWRkcmVzcyAtPSBwcm9iZV9kZWNyZW1lbnQ7CisJCWlmICgoaW50KXByb2JlX2FkZHJlc3MgPCAwKSB7CisJCQlwcm9iZV9hZGRyZXNzICs9IE5BTUVfSEFTSF9QUklNRTsKKwkJfQorCX0KKwluYW1lX2hhc2h0YWJsZVtwcm9iZV9hZGRyZXNzXSA9IHhzdHJkdXAoa2V5KTsKKwlyZXR1cm4gcHJvYmVfYWRkcmVzczsKK30KKworLyogdGhpcyBET0VTTlQgYWRkIHRoZSBrZXkgdG8gdGhlIGhhc2h0YWJsZQorICogVE9ETyBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCBzZWFyY2hfbmFtZV9oYXNodGFibGUKKyAqLworc3RhdGljIHVuc2lnbmVkIHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKGNvbnN0IGNoYXIgKmtleSkKK3sKKwl1bnNpZ25lZCBwcm9iZV9hZGRyZXNzOworCXVuc2lnbmVkIHByb2JlX2RlY3JlbWVudDsKKworCW1ha2VfaGFzaChrZXksICZwcm9iZV9hZGRyZXNzLCAmcHJvYmVfZGVjcmVtZW50LCBTVEFUVVNfSEFTSF9QUklNRSk7CisJd2hpbGUgKHN0YXR1c19oYXNodGFibGVbcHJvYmVfYWRkcmVzc10gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKGtleSwgbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbc3RhdHVzX2hhc2h0YWJsZVtwcm9iZV9hZGRyZXNzXS0+cGFja2FnZV0tPm5hbWVdKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCQlwcm9iZV9hZGRyZXNzIC09IHByb2JlX2RlY3JlbWVudDsKKwkJaWYgKChpbnQpcHJvYmVfYWRkcmVzcyA8IDApIHsKKwkJCXByb2JlX2FkZHJlc3MgKz0gU1RBVFVTX0hBU0hfUFJJTUU7CisJCX0KKwl9CisJcmV0dXJuIHByb2JlX2FkZHJlc3M7Cit9CisKK3N0YXRpYyBpbnQgb3JkZXIoY2hhciB4KQoreworCXJldHVybiAoeCA9PSAnficgPyAtMQorCQk6IHggPT0gJ1wwJyA/IDAKKwkJOiBpc2RpZ2l0KHgpID8gMAorCQk6IGlzYWxwaGEoeCkgPyB4CisJCTogKHVuc2lnbmVkIGNoYXIpeCArIDI1NgorCSk7Cit9CisKKy8qIFRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIGRwa2cgYW5kIG1vZGlmaWVkIHNsaWdodGx5IHRvIHdvcmsgd2l0aCBidXN5Ym94ICovCitzdGF0aWMgaW50IHZlcnNpb25fY29tcGFyZV9wYXJ0KGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqcmVmKQoreworCWlmICghdmFsKSB2YWwgPSAiIjsKKwlpZiAoIXJlZikgcmVmID0gIiI7CisKKwl3aGlsZSAoKnZhbCB8fCAqcmVmKSB7CisJCWludCBmaXJzdF9kaWZmOworCisJCXdoaWxlICgoKnZhbCAmJiAhaXNkaWdpdCgqdmFsKSkgfHwgKCpyZWYgJiYgIWlzZGlnaXQoKnJlZikpKSB7CisJCQlpbnQgdmMgPSBvcmRlcigqdmFsKTsKKwkJCWludCByYyA9IG9yZGVyKCpyZWYpOworCQkJaWYgKHZjICE9IHJjKQorCQkJCXJldHVybiB2YyAtIHJjOworCQkJdmFsKys7CisJCQlyZWYrKzsKKwkJfQorCisJCXdoaWxlICgqdmFsID09ICcwJykKKwkJCXZhbCsrOworCQl3aGlsZSAoKnJlZiA9PSAnMCcpCisJCQlyZWYrKzsKKworCQlmaXJzdF9kaWZmID0gMDsKKwkJd2hpbGUgKGlzZGlnaXQoKnZhbCkgJiYgaXNkaWdpdCgqcmVmKSkgeworCQkJaWYgKGZpcnN0X2RpZmYgPT0gMCkKKwkJCQlmaXJzdF9kaWZmID0gKnZhbCAtICpyZWY7CisJCQl2YWwrKzsKKwkJCXJlZisrOworCQl9CisJCWlmIChpc2RpZ2l0KCp2YWwpKQorCQkJcmV0dXJuIDE7CisJCWlmIChpc2RpZ2l0KCpyZWYpKQorCQkJcmV0dXJuIC0xOworCQlpZiAoZmlyc3RfZGlmZikKKwkJCXJldHVybiBmaXJzdF9kaWZmOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogaWYgdmVyMSA8IHZlcjIgcmV0dXJuIC0xLAorICogaWYgdmVyMSA9IHZlcjIgcmV0dXJuIDAsCisgKiBpZiB2ZXIxID4gdmVyMiByZXR1cm4gMSwKKyAqLworc3RhdGljIGludCB2ZXJzaW9uX2NvbXBhcmUoY29uc3QgdW5zaWduZWQgdmVyMSwgY29uc3QgdW5zaWduZWQgdmVyMikKK3sKKwljaGFyICpjaF92ZXIxID0gbmFtZV9oYXNodGFibGVbdmVyMV07CisJY2hhciAqY2hfdmVyMiA9IG5hbWVfaGFzaHRhYmxlW3ZlcjJdOworCXVuc2lnbmVkIGVwb2NoMSA9IDAsIGVwb2NoMiA9IDA7CisJY2hhciAqY29sb247CisJY2hhciAqZGViX3ZlcjEsICpkZWJfdmVyMjsKKwljaGFyICp1cHN0cmVhbV92ZXIxOworCWNoYXIgKnVwc3RyZWFtX3ZlcjI7CisJaW50IHJlc3VsdDsKKworCS8qIENvbXBhcmUgZXBvY2ggKi8KKwljb2xvbiA9IHN0cmNocihjaF92ZXIxLCAnOicpOworCWlmIChjb2xvbikgeworCQllcG9jaDEgPSBhdG9pKGNoX3ZlcjEpOworCQljaF92ZXIxID0gY29sb24gKyAxOworCX0KKwljb2xvbiA9IHN0cmNocihjaF92ZXIyLCAnOicpOworCWlmIChjb2xvbikgeworCQllcG9jaDIgPSBhdG9pKGNoX3ZlcjIpOworCQljaF92ZXIyID0gY29sb24gKyAxOworCX0KKwlpZiAoZXBvY2gxIDwgZXBvY2gyKSB7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGVwb2NoMSA+IGVwb2NoMikgeworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBDb21wYXJlIHVwc3RyZWFtIHZlcnNpb24gKi8KKwl1cHN0cmVhbV92ZXIxID0geHN0cmR1cChjaF92ZXIxKTsKKwl1cHN0cmVhbV92ZXIyID0geHN0cmR1cChjaF92ZXIyKTsKKworCS8qIENob3Agb2ZmIGRlYmlhbiB2ZXJzaW9uLCBhbmQgc3RvcmUgZm9yIGxhdGVyIHVzZSAqLworCWRlYl92ZXIxID0gc3RycmNocih1cHN0cmVhbV92ZXIxLCAnLScpOworCWRlYl92ZXIyID0gc3RycmNocih1cHN0cmVhbV92ZXIyLCAnLScpOworCWlmIChkZWJfdmVyMSkgeworCQkqZGViX3ZlcjErKyA9ICdcMCc7CisJfQorCWlmIChkZWJfdmVyMikgeworCQkqZGViX3ZlcjIrKyA9ICdcMCc7CisJfQorCXJlc3VsdCA9IHZlcnNpb25fY29tcGFyZV9wYXJ0KHVwc3RyZWFtX3ZlcjEsIHVwc3RyZWFtX3ZlcjIpOworCWlmIChyZXN1bHQgPT0gMCkgeworCQkvKiBDb21wYXJlIGRlYmlhbiB2ZXJzaW9ucyAqLworCQlyZXN1bHQgPSB2ZXJzaW9uX2NvbXBhcmVfcGFydChkZWJfdmVyMSwgZGViX3ZlcjIpOworCX0KKworCWZyZWUodXBzdHJlYW1fdmVyMSk7CisJZnJlZSh1cHN0cmVhbV92ZXIyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHRlc3RfdmVyc2lvbihjb25zdCB1bnNpZ25lZCB2ZXJzaW9uMSwgY29uc3QgdW5zaWduZWQgdmVyc2lvbjIsIGNvbnN0IHVuc2lnbmVkIG9wZXJhdG9yKQoreworCWNvbnN0IGludCB2ZXJzaW9uX3Jlc3VsdCA9IHZlcnNpb25fY29tcGFyZSh2ZXJzaW9uMSwgdmVyc2lvbjIpOworCXN3aXRjaCAob3BlcmF0b3IpIHsKKwljYXNlIFZFUl9BTlk6CisJCXJldHVybiBUUlVFOworCWNhc2UgVkVSX0VRVUFMOgorCQlyZXR1cm4gKHZlcnNpb25fcmVzdWx0ID09IDApOworCWNhc2UgVkVSX0xFU1M6CisJCXJldHVybiAodmVyc2lvbl9yZXN1bHQgPCAwKTsKKwljYXNlIFZFUl9MRVNTX0VRVUFMOgorCQlyZXR1cm4gKHZlcnNpb25fcmVzdWx0IDw9IDApOworCWNhc2UgVkVSX01PUkU6CisJCXJldHVybiAodmVyc2lvbl9yZXN1bHQgPiAwKTsKKwljYXNlIFZFUl9NT1JFX0VRVUFMOgorCQlyZXR1cm4gKHZlcnNpb25fcmVzdWx0ID49IDApOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgc2VhcmNoX3BhY2thZ2VfaGFzaHRhYmxlKGNvbnN0IHVuc2lnbmVkIG5hbWUsIGNvbnN0IHVuc2lnbmVkIHZlcnNpb24sIGNvbnN0IHVuc2lnbmVkIG9wZXJhdG9yKQoreworCXVuc2lnbmVkIHByb2JlX2FkZHJlc3M7CisJdW5zaWduZWQgcHJvYmVfZGVjcmVtZW50OworCisJbWFrZV9oYXNoKG5hbWVfaGFzaHRhYmxlW25hbWVdLCAmcHJvYmVfYWRkcmVzcywgJnByb2JlX2RlY3JlbWVudCwgUEFDS0FHRV9IQVNIX1BSSU1FKTsKKwl3aGlsZSAocGFja2FnZV9oYXNodGFibGVbcHJvYmVfYWRkcmVzc10gIT0gTlVMTCkgeworCQlpZiAocGFja2FnZV9oYXNodGFibGVbcHJvYmVfYWRkcmVzc10tPm5hbWUgPT0gbmFtZSkgeworCQkJaWYgKG9wZXJhdG9yID09IFZFUl9BTlkpIHsKKwkJCQlyZXR1cm4gcHJvYmVfYWRkcmVzczsKKwkJCX0KKwkJCWlmICh0ZXN0X3ZlcnNpb24ocGFja2FnZV9oYXNodGFibGVbcHJvYmVfYWRkcmVzc10tPnZlcnNpb24sIHZlcnNpb24sIG9wZXJhdG9yKSkgeworCQkJCXJldHVybiBwcm9iZV9hZGRyZXNzOworCQkJfQorCQl9CisJCXByb2JlX2FkZHJlc3MgLT0gcHJvYmVfZGVjcmVtZW50OworCQlpZiAoKGludClwcm9iZV9hZGRyZXNzIDwgMCkgeworCQkJcHJvYmVfYWRkcmVzcyArPSBQQUNLQUdFX0hBU0hfUFJJTUU7CisJCX0KKwl9CisJcmV0dXJuIHByb2JlX2FkZHJlc3M7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRocm91Z2ggdGhlIGVudGlyZSBwYWNrYWdlX2hhc2h0YWJsZSBsb29raW5nCisgKiBmb3IgYSBwYWNrYWdlIHdoaWNoIHByb3ZpZGVzICJuZWVkbGUiLiBJdCByZXR1cm5zIHRoZSBpbmRleCBpbnRvCisgKiB0aGUgcGFja2FnZV9oYXNodGFibGUgZm9yIHRoZSBwcm92aWRpbmcgcGFja2FnZS4KKyAqCisgKiBuZWVkbGUgaXMgdGhlIGluZGV4IGludG8gbmFtZV9oYXNodGFibGUgb2YgdGhlIHBhY2thZ2Ugd2UgYXJlCisgKiBsb29raW5nIGZvci4KKyAqCisgKiBzdGFydF9hdCBpcyB0aGUgaW5kZXggaW4gdGhlIHBhY2thZ2VfaGFzaHRhYmxlIHRvIHN0YXJ0IGxvb2tpbmcKKyAqIGF0LiBJZiBzdGFydF9hdCBpcyAtMSB0aGVuIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuIFRoaXMgaXMgdG8gYWxsb3cKKyAqIGZvciByZXBlYXRlZCBzZWFyY2hlcyBzaW5jZSBtb3JlIHRoYW4gb25lIHBhY2thZ2UgbWlnaHQgcHJvdmlkZQorICogbmVlZGxlLgorICoKKyAqIEZJWE1FOiBJIGRvbid0IHRoaW5rIHRoaXMgaXMgdmVyeSBlZmZpY2llbnQsIGJ1dCBJIHRob3VnaHQgSSdkIGtlZXAKKyAqIGl0IHNpbXBsZSBmb3Igbm93IHVudGlsIGl0IHByb3ZlcyB0byBiZSBhIHByb2JsZW0uCisgKi8KK3N0YXRpYyBpbnQgc2VhcmNoX2Zvcl9wcm92aWRlcyhpbnQgbmVlZGxlLCBpbnQgc3RhcnRfYXQpCit7CisJaW50IGksIGo7CisJY29tbW9uX25vZGVfdCAqcDsKKwlmb3IgKGkgPSBzdGFydF9hdCArIDE7IGkgPCBQQUNLQUdFX0hBU0hfUFJJTUU7IGkrKykgeworCQlwID0gcGFja2FnZV9oYXNodGFibGVbaV07CisJCWlmIChwID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgaiA8IHAtPm51bV9vZl9lZGdlczsgaisrKQorCQkJaWYgKHAtPmVkZ2Vbal0tPnR5cGUgPT0gRURHRV9QUk9WSURFUyAmJiBwLT5lZGdlW2pdLT5uYW1lID09IG5lZWRsZSkKKwkJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogQWRkIGFuIGVkZ2UgdG8gYSBub2RlCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9lZGdlX3RvX25vZGUoY29tbW9uX25vZGVfdCAqbm9kZSwgZWRnZV90ICplZGdlKQoreworCW5vZGUtPmVkZ2UgPSB4cmVhbGxvY192ZWN0b3Iobm9kZS0+ZWRnZSwgMiwgbm9kZS0+bnVtX29mX2VkZ2VzKTsKKwlub2RlLT5lZGdlW25vZGUtPm51bV9vZl9lZGdlcysrXSA9IGVkZ2U7Cit9CisKKy8qCisgKiBDcmVhdGUgb25lIG5ldyBub2RlIGFuZCBvbmUgbmV3IGVkZ2UgZm9yIGV2ZXJ5IGRlcGVuZGVuY3kuCisgKgorICogRGVwZW5kZW5jaWVzIHdoaWNoIGNvbnRhaW4gbXVsdGlwbGUgYWx0ZXJuYXRpdmVzIGFyZSByZXByZXNlbnRlZCBhcworICogYW4gRURHRV9PUl9QUkVfREVQRU5EUyBvciBFREdFX09SX0RFUEVORFMgbm9kZSwgZm9sbG93ZWQgYnkgYQorICogbnVtYmVyIG9mIEVER0VfUFJFX0RFUEVORFMgb3IgRURHRV9ERVBFTkRTIG5vZGVzLiBUaGUgbmFtZSBmaWVsZCBvZgorICogdGhlIE9SIGVkZ2UgY29udGFpbnMgdGhlIGZ1bGwgZGVwZW5kZW5jeSBzdHJpbmcgd2hpbGUgdGhlIHZlcnNpb24KKyAqIGZpZWxkIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgRURHRSBub2RlcyB3aGljaCBmb2xsb3cgYXMgcGFydCBvZgorICogdGhpcyBhbHRlcm5hdGl2ZS4KKyAqLworc3RhdGljIHZvaWQgYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhjb21tb25fbm9kZV90ICpwYXJlbnRfbm9kZSwgY29uc3QgY2hhciAqd2hvbGVfbGluZSwgdW5zaWduZWQgZWRnZV90eXBlKQoreworCWNoYXIgKmxpbmUgPSB4c3RyZHVwKHdob2xlX2xpbmUpOworCWNoYXIgKmxpbmUyOworCWNoYXIgKmxpbmVfcHRyMSA9IE5VTEw7CisJY2hhciAqbGluZV9wdHIyID0gTlVMTDsKKwljaGFyICpmaWVsZDsKKwljaGFyICpmaWVsZDI7CisJY2hhciAqdmVyc2lvbjsKKwllZGdlX3QgKmVkZ2U7CisJZWRnZV90ICpvcl9lZGdlOworCWludCBvZmZzZXRfY2g7CisKKwlmaWVsZCA9IHN0cnRva19yKGxpbmUsICIsIiwgJmxpbmVfcHRyMSk7CisJZG8geworCQkvKiBza2lwIGxlYWRpbmcgc3BhY2VzICovCisJCWZpZWxkICs9IHN0cnNwbihmaWVsZCwgIiAiKTsKKwkJbGluZTIgPSB4c3RyZHVwKGZpZWxkKTsKKwkJZmllbGQyID0gc3RydG9rX3IobGluZTIsICJ8IiwgJmxpbmVfcHRyMik7CisJCW9yX2VkZ2UgPSBOVUxMOworCQlpZiAoKGVkZ2VfdHlwZSA9PSBFREdFX0RFUEVORFMgfHwgZWRnZV90eXBlID09IEVER0VfUFJFX0RFUEVORFMpCisJCSAmJiAoc3RyY21wKGZpZWxkLCBmaWVsZDIpICE9IDApCisJCSkgeworCQkJb3JfZWRnZSA9IHh6YWxsb2Moc2l6ZW9mKGVkZ2VfdCkpOworCQkJb3JfZWRnZS0+dHlwZSA9IGVkZ2VfdHlwZSArIDE7CisJCQlvcl9lZGdlLT5uYW1lID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKGZpZWxkKTsKKwkJCS8vb3JfZWRnZS0+dmVyc2lvbiA9IDA7IC8vIHRyYWNrcyB0aGUgbnVtYmVyIG9mIGFsdGVybmF0aXZlcworCQkJYWRkX2VkZ2VfdG9fbm9kZShwYXJlbnRfbm9kZSwgb3JfZWRnZSk7CisJCX0KKworCQlkbyB7CisJCQllZGdlID0geG1hbGxvYyhzaXplb2YoZWRnZV90KSk7CisJCQllZGdlLT50eXBlID0gZWRnZV90eXBlOworCisJCQkvKiBTa2lwIGFueSBleHRyYSBsZWFkaW5nIHNwYWNlcyAqLworCQkJZmllbGQyICs9IHN0cnNwbihmaWVsZDIsICIgIik7CisKKwkJCS8qIEdldCBkZXBlbmRlbmN5IHZlcnNpb24gaW5mbyAqLworCQkJdmVyc2lvbiA9IHN0cmNocihmaWVsZDIsICcoJyk7CisJCQlpZiAodmVyc2lvbiA9PSBOVUxMKSB7CisJCQkJZWRnZS0+b3BlcmF0b3IgPSBWRVJfQU5ZOworCQkJCS8qIEdldCB0aGUgdmVyc2lvbnMgaGFzaCBudW1iZXIsIGFkZGluZyBpdCBpZiB0aGUgbnVtYmVyIGlzbnQgYWxyZWFkeSBpbiB0aGVyZSAqLworCQkJCWVkZ2UtPnZlcnNpb24gPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoIkFOWSIpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTa2lwIGxlYWRpbmcgJyAnIG9yICcoJyAqLworCQkJCXZlcnNpb24gKz0gc3Ryc3BuKHZlcnNpb24sICIgKCIpOworCQkJCS8qIENhbGN1bGF0ZSBsZW5ndGggb2YgYW55IG9wZXJhdG9yIGNoYXJhY3RlcnMgKi8KKwkJCQlvZmZzZXRfY2ggPSBzdHJzcG4odmVyc2lvbiwgIjw9PiIpOworCQkJCS8qIERldGVybWluZSBvcGVyYXRvciAqLworCQkJCWlmIChvZmZzZXRfY2ggPiAwKSB7CisJCQkJCWlmIChzdHJuY21wKHZlcnNpb24sICI9Iiwgb2Zmc2V0X2NoKSA9PSAwKSB7CisJCQkJCQllZGdlLT5vcGVyYXRvciA9IFZFUl9FUVVBTDsKKwkJCQkJfSBlbHNlIGlmIChzdHJuY21wKHZlcnNpb24sICI8PCIsIG9mZnNldF9jaCkgPT0gMCkgeworCQkJCQkJZWRnZS0+b3BlcmF0b3IgPSBWRVJfTEVTUzsKKwkJCQkJfSBlbHNlIGlmIChzdHJuY21wKHZlcnNpb24sICI8PSIsIG9mZnNldF9jaCkgPT0gMCkgeworCQkJCQkJZWRnZS0+b3BlcmF0b3IgPSBWRVJfTEVTU19FUVVBTDsKKwkJCQkJfSBlbHNlIGlmIChzdHJuY21wKHZlcnNpb24sICI+PiIsIG9mZnNldF9jaCkgPT0gMCkgeworCQkJCQkJZWRnZS0+b3BlcmF0b3IgPSBWRVJfTU9SRTsKKwkJCQkJfSBlbHNlIGlmIChzdHJuY21wKHZlcnNpb24sICI+PSIsIG9mZnNldF9jaCkgPT0gMCkgeworCQkJCQkJZWRnZS0+b3BlcmF0b3IgPSBWRVJfTU9SRV9FUVVBTDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbGxlZ2FsIG9wZXJhdG9yIik7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogc2tpcCB0byBzdGFydCBvZiB2ZXJzaW9uIG51bWJlcnMgKi8KKwkJCQl2ZXJzaW9uICs9IG9mZnNldF9jaDsKKwkJCQl2ZXJzaW9uICs9IHN0cnNwbih2ZXJzaW9uLCAiICIpOworCisJCQkJLyogVHJ1bmNhdGUgdmVyc2lvbiBhdCB0cmFpbGluZyAnICcgb3IgJyknICovCisJCQkJdmVyc2lvbltzdHJjc3BuKHZlcnNpb24sICIgKSIpXSA9ICdcMCc7CisJCQkJLyogR2V0IHRoZSB2ZXJzaW9ucyBoYXNoIG51bWJlciwgYWRkaW5nIGl0IGlmIHRoZSBudW1iZXIgaXNudCBhbHJlYWR5IGluIHRoZXJlICovCisJCQkJZWRnZS0+dmVyc2lvbiA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSh2ZXJzaW9uKTsKKwkJCX0KKworCQkJLyogR2V0IHRoZSBkZXBlbmRlbmN5IG5hbWUgKi8KKwkJCWZpZWxkMltzdHJjc3BuKGZpZWxkMiwgIiAoIildID0gJ1wwJzsKKwkJCWVkZ2UtPm5hbWUgPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoZmllbGQyKTsKKworCQkJaWYgKG9yX2VkZ2UpCisJCQkJb3JfZWRnZS0+dmVyc2lvbisrOworCisJCQlhZGRfZWRnZV90b19ub2RlKHBhcmVudF9ub2RlLCBlZGdlKTsKKwkJCWZpZWxkMiA9IHN0cnRva19yKE5VTEwsICJ8IiwgJmxpbmVfcHRyMik7CisJCX0gd2hpbGUgKGZpZWxkMiAhPSBOVUxMKTsKKworCQlmcmVlKGxpbmUyKTsKKwkJZmllbGQgPSBzdHJ0b2tfcihOVUxMLCAiLCIsICZsaW5lX3B0cjEpOworCX0gd2hpbGUgKGZpZWxkICE9IE5VTEwpOworCisJZnJlZShsaW5lKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYWNrYWdlKGNvbW1vbl9ub2RlX3QgKm5vZGUpCit7CisJdW5zaWduZWQgaTsKKwlpZiAobm9kZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bnVtX29mX2VkZ2VzOyBpKyspIHsKKwkJCWZyZWUobm9kZS0+ZWRnZVtpXSk7CisJCX0KKwkJZnJlZShub2RlLT5lZGdlKTsKKwkJZnJlZShub2RlKTsKKwl9Cit9CisKKy8qCisgKiBHZXRzIHRoZSBuZXh0IHBhY2thZ2UgZmllbGQgZnJvbSBwYWNrYWdlX2J1ZmZlciwgc2VwYXJhdGVkIGludG8gdGhlIGZpZWxkIG5hbWUKKyAqIGFuZCBmaWVsZCB2YWx1ZSwgaXQgcmV0dXJucyB0aGUgaW50IG9mZnNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBuZXh0IGZpZWxkCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9wYWNrYWdlX2ZpZWxkKGNvbnN0IGNoYXIgKnBhY2thZ2VfYnVmZmVyLCBjaGFyICoqZmllbGRfbmFtZSwgY2hhciAqKmZpZWxkX3ZhbHVlKQoreworCWludCBvZmZzZXRfbmFtZV9zdGFydCA9IDA7CisJaW50IG9mZnNldF9uYW1lX2VuZCA9IDA7CisJaW50IG9mZnNldF92YWx1ZV9zdGFydCA9IDA7CisJaW50IG9mZnNldF92YWx1ZV9lbmQgPSAwOworCWludCBvZmZzZXQgPSAwOworCWludCBuZXh0X29mZnNldDsKKwlpbnQgbmFtZV9sZW5ndGg7CisJaW50IHZhbHVlX2xlbmd0aDsKKwlpbnQgZXhpdF9mbGFnID0gRkFMU0U7CisKKwlpZiAocGFja2FnZV9idWZmZXIgPT0gTlVMTCkgeworCQkqZmllbGRfbmFtZSA9IE5VTEw7CisJCSpmaWVsZF92YWx1ZSA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisJd2hpbGUgKDEpIHsKKwkJbmV4dF9vZmZzZXQgPSBvZmZzZXQgKyAxOworCQlzd2l0Y2ggKHBhY2thZ2VfYnVmZmVyW29mZnNldF0pIHsKKwkJCWNhc2UgJ1wwJzoKKwkJCQlleGl0X2ZsYWcgPSBUUlVFOworCQkJCWJyZWFrOworCQkJY2FzZSAnOic6CisJCQkJaWYgKG9mZnNldF9uYW1lX2VuZCA9PSAwKSB7CisJCQkJCW9mZnNldF9uYW1lX2VuZCA9IG9mZnNldDsKKwkJCQkJb2Zmc2V0X3ZhbHVlX3N0YXJ0ID0gbmV4dF9vZmZzZXQ7CisJCQkJfQorCQkJCS8qIFRPRE86IE5hbWUgbWlnaHQgc3RpbGwgaGF2ZSB0cmFpbGluZyBzcGFjZXMgaWYgJzonIGlzbnQKKwkJCQkgKiBpbW1lZGlhdGVseSBhZnRlciBuYW1lICovCisJCQkJYnJlYWs7CisJCQljYXNlICdcbic6CisJCQkJLyogVE9ETzogVGhlIGNoYXIgbmV4dF9vZmZzZXQgbWF5IGJlIG91dCBvZiBib3VuZHMgKi8KKwkJCQlpZiAocGFja2FnZV9idWZmZXJbbmV4dF9vZmZzZXRdICE9ICcgJykgeworCQkJCQlleGl0X2ZsYWcgPSBUUlVFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQljYXNlICdcdCc6CisJCQljYXNlICcgJzoKKwkJCQkvKiBpbmNyZW1lbnQgdGhlIHZhbHVlIHN0YXJ0IHBvaW50IGlmIGl0cyBhIGp1c3QgZmlsbGVyICovCisJCQkJaWYgKG9mZnNldF9uYW1lX3N0YXJ0ID09IG9mZnNldCkgeworCQkJCQlvZmZzZXRfbmFtZV9zdGFydCsrOworCQkJCX0KKwkJCQlpZiAob2Zmc2V0X3ZhbHVlX3N0YXJ0ID09IG9mZnNldCkgeworCQkJCQlvZmZzZXRfdmFsdWVfc3RhcnQrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGV4aXRfZmxhZykgeworCQkJLyogQ2hlY2sgdGhhdCB0aGUgbmFtZXMgYXJlIHZhbGlkICovCisJCQlvZmZzZXRfdmFsdWVfZW5kID0gb2Zmc2V0OworCQkJbmFtZV9sZW5ndGggPSBvZmZzZXRfbmFtZV9lbmQgLSBvZmZzZXRfbmFtZV9zdGFydDsKKwkJCXZhbHVlX2xlbmd0aCA9IG9mZnNldF92YWx1ZV9lbmQgLSBvZmZzZXRfdmFsdWVfc3RhcnQ7CisJCQlpZiAobmFtZV9sZW5ndGggPT0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKChuYW1lX2xlbmd0aCA+IDApICYmICh2YWx1ZV9sZW5ndGggPiAwKSkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBJZiBub3QgdmFsaWQsIHN0YXJ0IGZyZXNoIHdpdGggbmV4dCBmaWVsZCAqLworCQkJZXhpdF9mbGFnID0gRkFMU0U7CisJCQlvZmZzZXRfbmFtZV9zdGFydCA9IG9mZnNldCArIDE7CisJCQlvZmZzZXRfbmFtZV9lbmQgPSAwOworCQkJb2Zmc2V0X3ZhbHVlX3N0YXJ0ID0gb2Zmc2V0ICsgMTsKKwkJCW9mZnNldF92YWx1ZV9lbmQgPSBvZmZzZXQgKyAxOworCQkJb2Zmc2V0Kys7CisJCX0KKwkJb2Zmc2V0Kys7CisJfQorCSpmaWVsZF9uYW1lID0gTlVMTDsKKwlpZiAobmFtZV9sZW5ndGgpIHsKKwkJKmZpZWxkX25hbWUgPSB4c3RybmR1cCgmcGFja2FnZV9idWZmZXJbb2Zmc2V0X25hbWVfc3RhcnRdLCBuYW1lX2xlbmd0aCk7CisJfQorCSpmaWVsZF92YWx1ZSA9IE5VTEw7CisJaWYgKHZhbHVlX2xlbmd0aCA+IDApIHsKKwkJKmZpZWxkX3ZhbHVlID0geHN0cm5kdXAoJnBhY2thZ2VfYnVmZmVyW29mZnNldF92YWx1ZV9zdGFydF0sIHZhbHVlX2xlbmd0aCk7CisJfQorCXJldHVybiBuZXh0X29mZnNldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGZpbGxfcGFja2FnZV9zdHJ1Y3QoY2hhciAqY29udHJvbF9idWZmZXIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgZmllbGRfbmFtZXNbXSBBTElHTjEgPQorCQkiUGFja2FnZVwwIiJWZXJzaW9uXDAiCisJCSJQcmUtRGVwZW5kc1wwIiJEZXBlbmRzXDAiIlJlcGxhY2VzXDAiIlByb3ZpZGVzXDAiCisJCSJDb25mbGljdHNcMCIiU3VnZ2VzdHNcMCIiUmVjb21tZW5kc1wwIiJFbmhhbmNlc1wwIjsKKworCWNvbW1vbl9ub2RlX3QgKm5ld19ub2RlID0geHphbGxvYyhzaXplb2YoY29tbW9uX25vZGVfdCkpOworCWNoYXIgKmZpZWxkX25hbWU7CisJY2hhciAqZmllbGRfdmFsdWU7CisJaW50IGZpZWxkX3N0YXJ0ID0gMDsKKwlpbnQgbnVtID0gLTE7CisJaW50IGJ1ZmZlcl9sZW5ndGggPSBzdHJsZW4oY29udHJvbF9idWZmZXIpOworCisJbmV3X25vZGUtPnZlcnNpb24gPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoInVua25vd24iKTsKKwl3aGlsZSAoZmllbGRfc3RhcnQgPCBidWZmZXJfbGVuZ3RoKSB7CisJCXVuc2lnbmVkIGZpZWxkX251bTsKKworCQlmaWVsZF9zdGFydCArPSByZWFkX3BhY2thZ2VfZmllbGQoJmNvbnRyb2xfYnVmZmVyW2ZpZWxkX3N0YXJ0XSwKKwkJCQkmZmllbGRfbmFtZSwgJmZpZWxkX3ZhbHVlKTsKKworCQlpZiAoZmllbGRfbmFtZSA9PSBOVUxMKSB7CisJCQlnb3RvIGZpbGxfcGFja2FnZV9zdHJ1Y3RfY2xlYW51cDsKKwkJfQorCisJCWZpZWxkX251bSA9IGluZGV4X2luX3N0cmluZ3MoZmllbGRfbmFtZXMsIGZpZWxkX25hbWUpOworCQlzd2l0Y2ggKGZpZWxkX251bSkgeworCQljYXNlIDA6IC8qIFBhY2thZ2UgKi8KKwkJCW5ld19ub2RlLT5uYW1lID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKGZpZWxkX3ZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qIFZlcnNpb24gKi8KKwkJCW5ld19ub2RlLT52ZXJzaW9uID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKGZpZWxkX3ZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8qIFByZS1EZXBlbmRzICovCisJCQlhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKG5ld19ub2RlLCBmaWVsZF92YWx1ZSwgRURHRV9QUkVfREVQRU5EUyk7CisJCQlicmVhazsKKwkJY2FzZSAzOiAvKiBEZXBlbmRzICovCisJCQlhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKG5ld19ub2RlLCBmaWVsZF92YWx1ZSwgRURHRV9ERVBFTkRTKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6IC8qIFJlcGxhY2VzICovCisJCQlhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKG5ld19ub2RlLCBmaWVsZF92YWx1ZSwgRURHRV9SRVBMQUNFUyk7CisJCQlicmVhazsKKwkJY2FzZSA1OiAvKiBQcm92aWRlcyAqLworCQkJYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhuZXdfbm9kZSwgZmllbGRfdmFsdWUsIEVER0VfUFJPVklERVMpOworCQkJYnJlYWs7CisJCWNhc2UgNjogLyogQ29uZmxpY3RzICovCisJCQlhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKG5ld19ub2RlLCBmaWVsZF92YWx1ZSwgRURHRV9DT05GTElDVFMpOworCQkJYnJlYWs7CisJCWNhc2UgNzogLyogU3VnZ2VzdHMgKi8KKwkJCWFkZF9zcGxpdF9kZXBlbmRlbmNpZXMobmV3X25vZGUsIGZpZWxkX3ZhbHVlLCBFREdFX1NVR0dFU1RTKTsKKwkJCWJyZWFrOworCQljYXNlIDg6IC8qIFJlY29tbWVuZHMgKi8KKwkJCWFkZF9zcGxpdF9kZXBlbmRlbmNpZXMobmV3X25vZGUsIGZpZWxkX3ZhbHVlLCBFREdFX1JFQ09NTUVORFMpOworCQkJYnJlYWs7CisJCWNhc2UgOTogLyogRW5oYW5jZXMgKi8KKwkJCWFkZF9zcGxpdF9kZXBlbmRlbmNpZXMobmV3X25vZGUsIGZpZWxkX3ZhbHVlLCBFREdFX0VOSEFOQ0VTKTsKKwkJCWJyZWFrOworCQl9CisgZmlsbF9wYWNrYWdlX3N0cnVjdF9jbGVhbnVwOgorCQlmcmVlKGZpZWxkX25hbWUpOworCQlmcmVlKGZpZWxkX3ZhbHVlKTsKKwl9CisKKwlpZiAobmV3X25vZGUtPnZlcnNpb24gPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJ1bmtub3duIikpIHsKKwkJZnJlZV9wYWNrYWdlKG5ld19ub2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKwludW0gPSBzZWFyY2hfcGFja2FnZV9oYXNodGFibGUobmV3X25vZGUtPm5hbWUsIG5ld19ub2RlLT52ZXJzaW9uLCBWRVJfRVFVQUwpOworCWZyZWVfcGFja2FnZShwYWNrYWdlX2hhc2h0YWJsZVtudW1dKTsKKwlwYWNrYWdlX2hhc2h0YWJsZVtudW1dID0gbmV3X25vZGU7CisJcmV0dXJuIG51bTsKK30KKworLyogaWYgbnVtID0gMSwgaXQgcmV0dXJucyB0aGUgd2FudCBzdGF0dXMsIDIgcmV0dXJucyBmbGFnLCAzIHJldHVybnMgc3RhdHVzICovCitzdGF0aWMgdW5zaWduZWQgZ2V0X3N0YXR1cyhjb25zdCB1bnNpZ25lZCBzdGF0dXNfbm9kZSwgY29uc3QgaW50IG51bSkKK3sKKwljaGFyICpzdGF0dXNfc3RyaW5nID0gbmFtZV9oYXNodGFibGVbc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbm9kZV0tPnN0YXR1c107CisJY2hhciAqc3RhdGVfc3ViX3N0cmluZzsKKwl1bnNpZ25lZCBzdGF0ZV9zdWJfbnVtOworCWludCBsZW47CisJaW50IGk7CisKKwkvKiBzZXQgdG1wX3N0cmluZyB0byBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIHdvcmQgbnVtYmVyICovCisJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKSB7CisJCS8qIHNraXAgcGFzdCBhIHdvcmQgKi8KKwkJc3RhdHVzX3N0cmluZyArPSBzdHJjc3BuKHN0YXR1c19zdHJpbmcsICIgIik7CisJCS8qIHNraXAgcGFzdCB0aGUgc2VwYXJhdGluZyBzcGFjZXMgKi8KKwkJc3RhdHVzX3N0cmluZyArPSBzdHJzcG4oc3RhdHVzX3N0cmluZywgIiAiKTsKKwl9CisJbGVuID0gc3RyY3NwbihzdGF0dXNfc3RyaW5nLCAiIFxuIik7CisJc3RhdGVfc3ViX3N0cmluZyA9IHhzdHJuZHVwKHN0YXR1c19zdHJpbmcsIGxlbik7CisJc3RhdGVfc3ViX251bSA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShzdGF0ZV9zdWJfc3RyaW5nKTsKKwlmcmVlKHN0YXRlX3N1Yl9zdHJpbmcpOworCXJldHVybiBzdGF0ZV9zdWJfbnVtOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3RhdHVzKGNvbnN0IHVuc2lnbmVkIHN0YXR1c19ub2RlX251bSwgY29uc3QgY2hhciAqbmV3X3ZhbHVlLCBjb25zdCBpbnQgcG9zaXRpb24pCit7CisJY29uc3QgdW5zaWduZWQgbmV3X3ZhbHVlX251bSA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShuZXdfdmFsdWUpOworCXVuc2lnbmVkIHdhbnQgPSBnZXRfc3RhdHVzKHN0YXR1c19ub2RlX251bSwgMSk7CisJdW5zaWduZWQgZmxhZyA9IGdldF9zdGF0dXMoc3RhdHVzX25vZGVfbnVtLCAyKTsKKwl1bnNpZ25lZCBzdGF0dXMgPSBnZXRfc3RhdHVzKHN0YXR1c19ub2RlX251bSwgMyk7CisJY2hhciAqbmV3X3N0YXR1czsKKworCXN3aXRjaCAocG9zaXRpb24pIHsKKwkJY2FzZSAxOgorCQkJd2FudCA9IG5ld192YWx1ZV9udW07CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZmxhZyA9IG5ld192YWx1ZV9udW07CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJc3RhdHVzID0gbmV3X3ZhbHVlX251bTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkRFQlVHIE9OTFk6IHRoaXMgc2hvdWxkbnQgaGFwcGVuIik7CisJfQorCisJbmV3X3N0YXR1cyA9IHhhc3ByaW50ZigiJXMgJXMgJXMiLCBuYW1lX2hhc2h0YWJsZVt3YW50XSwgbmFtZV9oYXNodGFibGVbZmxhZ10sIG5hbWVfaGFzaHRhYmxlW3N0YXR1c10pOworCXN0YXR1c19oYXNodGFibGVbc3RhdHVzX25vZGVfbnVtXS0+c3RhdHVzID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKG5ld19zdGF0dXMpOworCWZyZWUobmV3X3N0YXR1cyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXNjcmliZV9zdGF0dXMoaW50IHN0YXR1c19udW0pCit7CisJaW50IHN0YXR1c193YW50LCBzdGF0dXNfc3RhdGU7CisJaWYgKHN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0gPT0gTlVMTCB8fCBzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dLT5zdGF0dXMgPT0gMCkKKwkJcmV0dXJuICJpcyBub3QgaW5zdGFsbGVkIG9yIGZsYWdnZWQgdG8gYmUgaW5zdGFsbGVkIjsKKworCXN0YXR1c193YW50ID0gZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAxKTsKKwlzdGF0dXNfc3RhdGUgPSBnZXRfc3RhdHVzKHN0YXR1c19udW0sIDMpOworCisJaWYgKHN0YXR1c19zdGF0ZSA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGxlZCIpKSB7CisJCWlmIChzdGF0dXNfd2FudCA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGwiKSkKKwkJCXJldHVybiAiaXMgaW5zdGFsbGVkIjsKKwkJaWYgKHN0YXR1c193YW50ID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiZGVpbnN0YWxsIikpCisJCQlyZXR1cm4gImlzIG1hcmtlZCB0byBiZSByZW1vdmVkIjsKKwkJaWYgKHN0YXR1c193YW50ID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgicHVyZ2UiKSkKKwkJCXJldHVybiAiaXMgbWFya2VkIHRvIGJlIHB1cmdlZCI7CisJfQorCWlmIChzdGF0dXNfd2FudCA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoInVua25vd24iKSkKKwkJcmV0dXJuICJpcyBpbiBhbiBpbmRldGVybWluYXRlIHN0YXRlIjsKKwlpZiAoc3RhdHVzX3dhbnQgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsIikpCisJCXJldHVybiAiaXMgbWFya2VkIHRvIGJlIGluc3RhbGxlZCI7CisKKwlyZXR1cm4gImlzIG5vdCBpbnN0YWxsZWQgb3IgZmxhZ2dlZCB0byBiZSBpbnN0YWxsZWQiOworfQorCitzdGF0aWMgdm9pZCBpbmRleF9zdGF0dXNfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlGSUxFICpzdGF0dXNfZmlsZTsKKwljaGFyICpjb250cm9sX2J1ZmZlcjsKKwljaGFyICpzdGF0dXNfbGluZTsKKwlzdGF0dXNfbm9kZV90ICpzdGF0dXNfbm9kZSA9IE5VTEw7CisJdW5zaWduZWQgc3RhdHVzX251bTsKKworCXN0YXR1c19maWxlID0geGZvcGVuX2Zvcl9yZWFkKGZpbGVuYW1lKTsKKwl3aGlsZSAoKGNvbnRyb2xfYnVmZmVyID0geG1hbGxvY19mZ2V0bGluZV9zdHIoc3RhdHVzX2ZpbGUsICJcblxuIikpICE9IE5VTEwpIHsKKwkJY29uc3QgdW5zaWduZWQgcGFja2FnZV9udW0gPSBmaWxsX3BhY2thZ2Vfc3RydWN0KGNvbnRyb2xfYnVmZmVyKTsKKwkJaWYgKHBhY2thZ2VfbnVtICE9IC0xKSB7CisJCQlzdGF0dXNfbm9kZSA9IHhtYWxsb2Moc2l6ZW9mKHN0YXR1c19ub2RlX3QpKTsKKwkJCS8qIGZpbGxfcGFja2FnZV9zdHJ1Y3QgZG9lc250IGhhbmRsZSB0aGUgc3RhdHVzIGZpZWxkICovCisJCQlzdGF0dXNfbGluZSA9IHN0cnN0cihjb250cm9sX2J1ZmZlciwgIlN0YXR1czoiKTsKKwkJCWlmIChzdGF0dXNfbGluZSAhPSBOVUxMKSB7CisJCQkJc3RhdHVzX2xpbmUgKz0gNzsKKwkJCQlzdGF0dXNfbGluZSArPSBzdHJzcG4oc3RhdHVzX2xpbmUsICIgXG5cdCIpOworCQkJCXN0YXR1c19saW5lID0geHN0cm5kdXAoc3RhdHVzX2xpbmUsIHN0cmNzcG4oc3RhdHVzX2xpbmUsICJcbiIpKTsKKwkJCQlzdGF0dXNfbm9kZS0+c3RhdHVzID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKHN0YXR1c19saW5lKTsKKwkJCQlmcmVlKHN0YXR1c19saW5lKTsKKwkJCX0KKwkJCXN0YXR1c19ub2RlLT5wYWNrYWdlID0gcGFja2FnZV9udW07CisJCQlzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUobmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbc3RhdHVzX25vZGUtPnBhY2thZ2VdLT5uYW1lXSk7CisJCQlzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dID0gc3RhdHVzX25vZGU7CisJCX0KKwkJZnJlZShjb250cm9sX2J1ZmZlcik7CisJfQorCWZjbG9zZShzdGF0dXNfZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2J1ZmZlcl9ub19zdGF0dXMoRklMRSAqbmV3X3N0YXR1c19maWxlLCBjb25zdCBjaGFyICpjb250cm9sX2J1ZmZlcikKK3sKKwljaGFyICpuYW1lOworCWNoYXIgKnZhbHVlOworCWludCBzdGFydCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RhcnQgKz0gcmVhZF9wYWNrYWdlX2ZpZWxkKCZjb250cm9sX2J1ZmZlcltzdGFydF0sICZuYW1lLCAmdmFsdWUpOworCQlpZiAobmFtZSA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3RyY21wKG5hbWUsICJTdGF0dXMiKSAhPSAwKSB7CisJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIiVzOiAlc1xuIiwgbmFtZSwgdmFsdWUpOworCQl9CisJfQorfQorCisvKiBUaGlzIGNvdWxkIGRvIHdpdGggYSBjbGVhbnVwICovCitzdGF0aWMgdm9pZCB3cml0ZV9zdGF0dXNfZmlsZShkZWJfZmlsZV90ICoqZGViX2ZpbGUpCit7CisJRklMRSAqb2xkX3N0YXR1c19maWxlID0geGZvcGVuX2Zvcl9yZWFkKCIvdmFyL2xpYi9kcGtnL3N0YXR1cyIpOworCUZJTEUgKm5ld19zdGF0dXNfZmlsZSA9IHhmb3Blbl9mb3Jfd3JpdGUoIi92YXIvbGliL2Rwa2cvc3RhdHVzLnVkZWIiKTsKKwljaGFyICpwYWNrYWdlX25hbWU7CisJY2hhciAqc3RhdHVzX2Zyb21fZmlsZTsKKwljaGFyICpjb250cm9sX2J1ZmZlciA9IE5VTEw7CisJY2hhciAqdG1wX3N0cmluZzsKKwlpbnQgc3RhdHVzX251bTsKKwlpbnQgZmllbGRfc3RhcnQgPSAwOworCWludCB3cml0ZV9mbGFnOworCWludCBpID0gMDsKKworCS8qIFVwZGF0ZSBwcmV2aW91c2x5IGtub3duIHBhY2thZ2VzICovCisJd2hpbGUgKChjb250cm9sX2J1ZmZlciA9IHhtYWxsb2NfZmdldGxpbmVfc3RyKG9sZF9zdGF0dXNfZmlsZSwgIlxuXG4iKSkgIT0gTlVMTCkgeworCQl0bXBfc3RyaW5nID0gc3Ryc3RyKGNvbnRyb2xfYnVmZmVyLCAiUGFja2FnZToiKTsKKwkJaWYgKHRtcF9zdHJpbmcgPT0gTlVMTCkgeworCQkJY29udGludWU7CisJCX0KKworCQl0bXBfc3RyaW5nICs9IDg7CisJCXRtcF9zdHJpbmcgKz0gc3Ryc3BuKHRtcF9zdHJpbmcsICIgXG5cdCIpOworCQlwYWNrYWdlX25hbWUgPSB4c3RybmR1cCh0bXBfc3RyaW5nLCBzdHJjc3BuKHRtcF9zdHJpbmcsICJcbiIpKTsKKwkJd3JpdGVfZmxhZyA9IEZBTFNFOworCQl0bXBfc3RyaW5nID0gc3Ryc3RyKGNvbnRyb2xfYnVmZmVyLCAiU3RhdHVzOiIpOworCQlpZiAodG1wX3N0cmluZyAhPSBOVUxMKSB7CisJCQkvKiBTZXBhcmF0ZSB0aGUgc3RhdHVzIHZhbHVlIGZyb20gdGhlIGNvbnRyb2wgYnVmZmVyICovCisJCQl0bXBfc3RyaW5nICs9IDc7CisJCQl0bXBfc3RyaW5nICs9IHN0cnNwbih0bXBfc3RyaW5nLCAiIFxuXHQiKTsKKwkJCXN0YXR1c19mcm9tX2ZpbGUgPSB4c3RybmR1cCh0bXBfc3RyaW5nLCBzdHJjc3BuKHRtcF9zdHJpbmcsICJcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1c19mcm9tX2ZpbGUgPSBOVUxMOworCQl9CisKKwkJLyogRmluZCB0aGlzIHBhY2thZ2UgaW4gdGhlIHN0YXR1cyBoYXNodGFibGUgKi8KKwkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKHBhY2thZ2VfbmFtZSk7CisJCWlmIChzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dICE9IE5VTEwpIHsKKwkJCWNvbnN0IGNoYXIgKnN0YXR1c19mcm9tX2hhc2h0YWJsZSA9IG5hbWVfaGFzaHRhYmxlW3N0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0tPnN0YXR1c107CisJCQlpZiAoc3RyY21wKHN0YXR1c19mcm9tX2ZpbGUsIHN0YXR1c19mcm9tX2hhc2h0YWJsZSkgIT0gMCkgeworCQkJCS8qIE5ldyBzdGF0dXMgaXNudCBleGFjdGx5IHRoZSBzYW1lIGFzIG9sZCBzdGF0dXMgKi8KKwkJCQljb25zdCBpbnQgc3RhdGVfc3RhdHVzID0gZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAzKTsKKwkJCQlpZiAoKHN0cmNtcCgiaW5zdGFsbGVkIiwgbmFtZV9oYXNodGFibGVbc3RhdGVfc3RhdHVzXSkgPT0gMCkKKwkJCQkgfHwgKHN0cmNtcCgidW5wYWNrZWQiLCBuYW1lX2hhc2h0YWJsZVtzdGF0ZV9zdGF0dXNdKSA9PSAwKQorCQkJCSkgeworCQkJCQkvKiBXZSBuZWVkIHRvIGFkZCB0aGUgY29udHJvbCBmaWxlIGZyb20gdGhlIHBhY2thZ2UgKi8KKwkJCQkJaSA9IDA7CisJCQkJCXdoaWxlIChkZWJfZmlsZVtpXSAhPSBOVUxMKSB7CisJCQkJCQlpZiAoc3RyY21wKHBhY2thZ2VfbmFtZSwgbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGVbaV0tPnBhY2thZ2VdLT5uYW1lXSkgPT0gMCkgeworCQkJCQkJCS8qIFdyaXRlIGEgc3RhdHVzIGZpbGUgZW50cnkgd2l0aCBhIG1vZGlmaWVkIHN0YXR1cyAqLworCQkJCQkJCS8qIHJlbW92ZSB0cmFpbGluZyBcbidzICovCisJCQkJCQkJd3JpdGVfYnVmZmVyX25vX3N0YXR1cyhuZXdfc3RhdHVzX2ZpbGUsIGRlYl9maWxlW2ldLT5jb250cm9sX2ZpbGUpOworCQkJCQkJCXNldF9zdGF0dXMoc3RhdHVzX251bSwgIm9rIiwgMik7CisJCQkJCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICJTdGF0dXM6ICVzXG5cbiIsCisJCQkJCQkJCQluYW1lX2hhc2h0YWJsZVtzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dLT5zdGF0dXNdKTsKKwkJCQkJCQl3cml0ZV9mbGFnID0gVFJVRTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWkrKzsKKwkJCQkJfQorCQkJCQkvKiBUaGlzIGlzIHRlbXBlcmFyeSwgZGVidWdnaW5nIG9ubHkgKi8KKwkJCQkJaWYgKGRlYl9maWxlW2ldID09IE5VTEwpIHsKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJBTEVSVDogY2Fubm90IGZpbmQgYSBjb250cm9sIGZpbGUsICIKKwkJCQkJCQkieW91ciBzdGF0dXMgZmlsZSBtYXkgYmUgYnJva2VuLCBzdGF0dXMgbWF5IGJlICIKKwkJCQkJCQkiaW5jb3JyZWN0IGZvciAlcyIsIHBhY2thZ2VfbmFtZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAoc3RyY21wKCJub3QtaW5zdGFsbGVkIiwgbmFtZV9oYXNodGFibGVbc3RhdGVfc3RhdHVzXSkgPT0gMCkgeworCQkJCQkvKiBPbmx5IHdyaXRlIHRoZSBQYWNrYWdlLCBTdGF0dXMsIFByaW9yaXR5IGFuZCBTZWN0aW9uIGxpbmVzICovCisJCQkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiUGFja2FnZTogJXNcbiIsIHBhY2thZ2VfbmFtZSk7CisJCQkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiU3RhdHVzOiAlc1xuIiwgc3RhdHVzX2Zyb21faGFzaHRhYmxlKTsKKworCQkJCQl3aGlsZSAoMSkgeworCQkJCQkJY2hhciAqZmllbGRfbmFtZTsKKwkJCQkJCWNoYXIgKmZpZWxkX3ZhbHVlOworCQkJCQkJZmllbGRfc3RhcnQgKz0gcmVhZF9wYWNrYWdlX2ZpZWxkKCZjb250cm9sX2J1ZmZlcltmaWVsZF9zdGFydF0sICZmaWVsZF9uYW1lLCAmZmllbGRfdmFsdWUpOworCQkJCQkJaWYgKGZpZWxkX25hbWUgPT0gTlVMTCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKChzdHJjbXAoZmllbGRfbmFtZSwgIlByaW9yaXR5IikgPT0gMCkKKwkJCQkJCSB8fCAoc3RyY21wKGZpZWxkX25hbWUsICJTZWN0aW9uIikgPT0gMCkKKwkJCQkJCSkgeworCQkJCQkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiJXM6ICVzXG4iLCBmaWVsZF9uYW1lLCBmaWVsZF92YWx1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJd3JpdGVfZmxhZyA9IFRSVUU7CisJCQkJCWZwdXRzKCJcbiIsIG5ld19zdGF0dXNfZmlsZSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKHN0cmNtcCgiY29uZmlnLWZpbGVzIiwgbmFtZV9oYXNodGFibGVbc3RhdGVfc3RhdHVzXSkgPT0gMCkgeworCQkJCQkvKiBvbmx5IGNoYW5nZSB0aGUgc3RhdHVzIGxpbmUgKi8KKwkJCQkJd2hpbGUgKDEpIHsKKwkJCQkJCWNoYXIgKmZpZWxkX25hbWU7CisJCQkJCQljaGFyICpmaWVsZF92YWx1ZTsKKwkJCQkJCWZpZWxkX3N0YXJ0ICs9IHJlYWRfcGFja2FnZV9maWVsZCgmY29udHJvbF9idWZmZXJbZmllbGRfc3RhcnRdLCAmZmllbGRfbmFtZSwgJmZpZWxkX3ZhbHVlKTsKKwkJCQkJCWlmIChmaWVsZF9uYW1lID09IE5VTEwpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCS8qIFNldHVwIHN0YXJ0IHBvaW50IGZvciBuZXh0IGZpZWxkICovCisJCQkJCQlpZiAoc3RyY21wKGZpZWxkX25hbWUsICJTdGF0dXMiKSA9PSAwKSB7CisJCQkJCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICJTdGF0dXM6ICVzXG4iLCBzdGF0dXNfZnJvbV9oYXNodGFibGUpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIiVzOiAlc1xuIiwgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXdyaXRlX2ZsYWcgPSBUUlVFOworCQkJCQlmcHV0cygiXG4iLCBuZXdfc3RhdHVzX2ZpbGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBJZiB0aGUgcGFja2FnZSBmcm9tIHRoZSBzdGF0dXMgZmlsZSB3YXNudCBoYW5kbGUgYWJvdmUsIGRvIGl0IG5vdyovCisJCWlmICghd3JpdGVfZmxhZykgeworCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICIlc1xuXG4iLCBjb250cm9sX2J1ZmZlcik7CisJCX0KKworCQlmcmVlKHN0YXR1c19mcm9tX2ZpbGUpOworCQlmcmVlKHBhY2thZ2VfbmFtZSk7CisJCWZyZWUoY29udHJvbF9idWZmZXIpOworCX0KKworCS8qIFdyaXRlIGFueSBuZXcgcGFja2FnZXMgKi8KKwlmb3IgKGkgPSAwOyBkZWJfZmlsZVtpXSAhPSBOVUxMOyBpKyspIHsKKwkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlW2ldLT5wYWNrYWdlXS0+bmFtZV0pOworCQlpZiAoc3RyY21wKCJyZWluc3RyZXEiLCBuYW1lX2hhc2h0YWJsZVtnZXRfc3RhdHVzKHN0YXR1c19udW0sIDIpXSkgPT0gMCkgeworCQkJd3JpdGVfYnVmZmVyX25vX3N0YXR1cyhuZXdfc3RhdHVzX2ZpbGUsIGRlYl9maWxlW2ldLT5jb250cm9sX2ZpbGUpOworCQkJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAib2siLCAyKTsKKwkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiU3RhdHVzOiAlc1xuXG4iLCBuYW1lX2hhc2h0YWJsZVtzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dLT5zdGF0dXNdKTsKKwkJfQorCX0KKwlmY2xvc2Uob2xkX3N0YXR1c19maWxlKTsKKwlmY2xvc2UobmV3X3N0YXR1c19maWxlKTsKKworCS8qIENyZWF0ZSBhIHNlcGFyYXRlIGJhY2tmaWxlIHRvIGRwa2cgKi8KKwlpZiAocmVuYW1lKCIvdmFyL2xpYi9kcGtnL3N0YXR1cyIsICIvdmFyL2xpYi9kcGtnL3N0YXR1cy51ZGViLmJhayIpID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY3JlYXRlIGJhY2t1cCBzdGF0dXMgZmlsZSIpOworCQkvKiBJdHMgb2sgaWYgcmVuYW1pbmcgdGhlIHN0YXR1cyBmaWxlIGZhaWxzIGJlY2F1c2Ugc3RhdHVzCisJCSAqIGZpbGUgZG9lc250IGV4aXN0LCBtYXliZSB3ZSBhcmUgc3RhcnRpbmcgZnJvbSBzY3JhdGNoICovCisJCWJiX2Vycm9yX21zZygibm8gc3RhdHVzIGZpbGUgZm91bmQsIGNyZWF0aW5nIG5ldyBvbmUiKTsKKwl9CisKKwl4cmVuYW1lKCIvdmFyL2xpYi9kcGtnL3N0YXR1cy51ZGViIiwgIi92YXIvbGliL2Rwa2cvc3RhdHVzIik7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWNrYWdlIGNhbiBzYXRpc2Z5IGEKKyAqIGRlcGVuZGVuY3kgb2YgdHlwZSBkZXBlbmRfdHlwZS4KKyAqCisgKiBBIHByZS1kZXBlbmRzIGlzIHNhdGlzZmllZCBvbmx5IGlmIGEgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZCwKKyAqIHdoaWNoIGEgcmVndWxhciBkZXBlbmRzIGNhbiBiZSBzYXRpc2ZpZWQgYnkgYSBwYWNrYWdlIHdoaWNoIHdlIHdhbnQKKyAqIHRvIGluc3RhbGwuCisgKi8KK3N0YXRpYyBpbnQgcGFja2FnZV9zYXRpc2ZpZXNfZGVwZW5kZW5jeShpbnQgcGFja2FnZSwgaW50IGRlcGVuZF90eXBlKQoreworCWludCBzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUobmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV0tPm5hbWVdKTsKKworCS8qIHN0YXR1cyBjb3VsZCBiZSB1bmtub3duIGlmIHBhY2thZ2UgaXMgYSBwdXJlIHZpcnR1YWwKKwkgKiBwcm92aWRlcyB3aGljaCBjYW5ub3Qgc2F0aXNmeSBhbnkgZGVwZW5kZW5jeSBieSBpdHNlbGYuCisJICovCisJaWYgKHN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGRlcGVuZF90eXBlKSB7CisJY2FzZSBFREdFX1BSRV9ERVBFTkRTOiByZXR1cm4gZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAzKSA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGxlZCIpOworCWNhc2UgRURHRV9ERVBFTkRTOiAgICAgcmV0dXJuIGdldF9zdGF0dXMoc3RhdHVzX251bSwgMSkgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsIik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RlcHMoZGViX2ZpbGVfdCAqKmRlYl9maWxlLCBpbnQgZGViX3N0YXJ0IC8qLCBpbnQgZGVwX21heF9jb3VudCAtID8/ICovKQoreworCWludCAqY29uZmxpY3RzID0gTlVMTDsKKwlpbnQgY29uZmxpY3RzX251bSA9IDA7CisJaW50IGkgPSBkZWJfc3RhcnQ7CisJaW50IGo7CisKKwkvKiBDaGVjayBmb3IgY29uZmxpY3RzCisJICogVE9ETzogVEVTVCBpZiBjb25mbGljdHMgd2l0aCBvdGhlciBwYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQKKwkgKgorCSAqIEFkZCBpbnN0YWxsIHBhY2thZ2VzIGFuZCB0aGUgcGFja2FnZXMgdGhleSBwcm92aWRlCisJICogdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gY2hlY2sgY29uZmxpY3RzIGZvcgorCSAqLworCisJLyogQ3JlYXRlIGFycmF5IG9mIHBhY2thZ2UgbnVtYmVycyB0byBjaGVjayBhZ2FpbnN0CisJICogaW5zdGFsbGVkIHBhY2thZ2UgZm9yIGNvbmZsaWN0cyovCisJd2hpbGUgKGRlYl9maWxlW2ldICE9IE5VTEwpIHsKKwkJY29uc3QgdW5zaWduZWQgcGFja2FnZV9udW0gPSBkZWJfZmlsZVtpXS0+cGFja2FnZTsKKwkJY29uZmxpY3RzID0geHJlYWxsb2NfdmVjdG9yKGNvbmZsaWN0cywgMiwgY29uZmxpY3RzX251bSk7CisJCWNvbmZsaWN0c1tjb25mbGljdHNfbnVtXSA9IHBhY2thZ2VfbnVtOworCQljb25mbGljdHNfbnVtKys7CisJCS8qIGFkZCBwcm92aWRlcyB0byBjb25mbGljdHMgbGlzdCAqLworCQlmb3IgKGogPSAwOyBqIDwgcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5udW1fb2ZfZWRnZXM7IGorKykgeworCQkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+ZWRnZVtqXS0+dHlwZSA9PSBFREdFX1BST1ZJREVTKSB7CisJCQkJY29uc3QgaW50IGNvbmZsaWN0c19wYWNrYWdlX251bSA9IHNlYXJjaF9wYWNrYWdlX2hhc2h0YWJsZSgKKwkJCQkJcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5lZGdlW2pdLT5uYW1lLAorCQkJCQlwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPmVkZ2Vbal0tPnZlcnNpb24sCisJCQkJCXBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+ZWRnZVtqXS0+b3BlcmF0b3IpOworCQkJCWlmIChwYWNrYWdlX2hhc2h0YWJsZVtjb25mbGljdHNfcGFja2FnZV9udW1dID09IE5VTEwpIHsKKwkJCQkJLyogY3JlYXRlIGEgbmV3IHBhY2thZ2UgKi8KKwkJCQkJY29tbW9uX25vZGVfdCAqbmV3X25vZGUgPSB4emFsbG9jKHNpemVvZihjb21tb25fbm9kZV90KSk7CisJCQkJCW5ld19ub2RlLT5uYW1lID0gcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5lZGdlW2pdLT5uYW1lOworCQkJCQluZXdfbm9kZS0+dmVyc2lvbiA9IHBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+ZWRnZVtqXS0+dmVyc2lvbjsKKwkJCQkJcGFja2FnZV9oYXNodGFibGVbY29uZmxpY3RzX3BhY2thZ2VfbnVtXSA9IG5ld19ub2RlOworCQkJCX0KKwkJCQljb25mbGljdHMgPSB4cmVhbGxvY192ZWN0b3IoY29uZmxpY3RzLCAyLCBjb25mbGljdHNfbnVtKTsKKwkJCQljb25mbGljdHNbY29uZmxpY3RzX251bV0gPSBjb25mbGljdHNfcGFja2FnZV9udW07CisJCQkJY29uZmxpY3RzX251bSsrOworCQkJfQorCQl9CisJCWkrKzsKKwl9CisKKwkvKiBDaGVjayBjb25mbGljdHMgKi8KKwlpID0gMDsKKwl3aGlsZSAoZGViX2ZpbGVbaV0gIT0gTlVMTCkgeworCQljb25zdCBjb21tb25fbm9kZV90ICpwYWNrYWdlX25vZGUgPSBwYWNrYWdlX2hhc2h0YWJsZVtkZWJfZmlsZVtpXS0+cGFja2FnZV07CisJCWludCBzdGF0dXNfbnVtID0gMDsKKwkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2Vfbm9kZS0+bmFtZV0pOworCisJCWlmIChnZXRfc3RhdHVzKHN0YXR1c19udW0sIDMpID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbGVkIikpIHsKKwkJCWkrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IHBhY2thZ2Vfbm9kZS0+bnVtX29mX2VkZ2VzOyBqKyspIHsKKwkJCWNvbnN0IGVkZ2VfdCAqcGFja2FnZV9lZGdlID0gcGFja2FnZV9ub2RlLT5lZGdlW2pdOworCisJCQlpZiAocGFja2FnZV9lZGdlLT50eXBlID09IEVER0VfQ09ORkxJQ1RTKSB7CisJCQkJY29uc3QgdW5zaWduZWQgcGFja2FnZV9udW0gPQorCQkJCQlzZWFyY2hfcGFja2FnZV9oYXNodGFibGUocGFja2FnZV9lZGdlLT5uYW1lLAorCQkJCQkJCQkgcGFja2FnZV9lZGdlLT52ZXJzaW9uLAorCQkJCQkJCQkgcGFja2FnZV9lZGdlLT5vcGVyYXRvcik7CisJCQkJaW50IHJlc3VsdCA9IDA7CisJCQkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXSAhPSBOVUxMKSB7CisJCQkJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPm5hbWVdKTsKKworCQkJCQlpZiAoZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAxKSA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGwiKSkgeworCQkJCQkJcmVzdWx0ID0gdGVzdF92ZXJzaW9uKHBhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlW2ldLT5wYWNrYWdlXS0+dmVyc2lvbiwKKwkJCQkJCQlwYWNrYWdlX2VkZ2UtPnZlcnNpb24sIHBhY2thZ2VfZWRnZS0+b3BlcmF0b3IpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHJlc3VsdCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicGFja2FnZSAlcyBjb25mbGljdHMgd2l0aCAlcyIsCisJCQkJCQluYW1lX2hhc2h0YWJsZVtwYWNrYWdlX25vZGUtPm5hbWVdLAorCQkJCQkJbmFtZV9oYXNodGFibGVbcGFja2FnZV9lZGdlLT5uYW1lXSk7CisJCQkJfQorCQkJfQorCQl9CisJCWkrKzsKKwl9CisKKworCS8qIENoZWNrIGRlcGVuZGVuZGNpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUEFDS0FHRV9IQVNIX1BSSU1FOyBpKyspIHsKKwkJaW50IHN0YXR1c19udW0gPSAwOworCQlpbnQgbnVtYmVyX29mX2FsdGVybmF0aXZlcyA9IDA7CisJCWNvbnN0IGVkZ2VfdCAqIHJvb3Rfb2ZfYWx0ZXJuYXRpdmVzID0gTlVMTDsKKwkJY29uc3QgY29tbW9uX25vZGVfdCAqcGFja2FnZV9ub2RlID0gcGFja2FnZV9oYXNodGFibGVbaV07CisKKwkJLyogSWYgdGhlIHBhY2thZ2Ugbm9kZSBkb2VzIG5vdCBleGlzdCB0aGVuIHRoaXMKKwkJICogcGFja2FnZSBpcyBhIHZpcnR1YWwgb25lLiBJbiB3aGljaCBjYXNlIHRoZXJlIGFyZQorCQkgKiBubyBkZXBlbmRlbmNpZXMgdG8gY2hlY2suCisJCSAqLworCQlpZiAocGFja2FnZV9ub2RlID09IE5VTEwpIGNvbnRpbnVlOworCisJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX25vZGUtPm5hbWVdKTsKKworCQkvKiBJZiB0aGVyZSBpcyBubyBzdGF0dXMgdGhlbiB0aGlzIHBhY2thZ2UgaXMgYQorCQkgKiB2aXJ0dWFsIG9uZSBwcm92aWRlZCBieSBzb21ldGhpbmcgZWxzZS4gSW4gd2hpY2gKKwkJICogY2FzZSB0aGVyZSBhcmUgbm8gZGVwZW5kZW5jaWVzIHRvIGNoZWNrLgorCQkgKi8KKwkJaWYgKHN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0gPT0gTlVMTCkgY29udGludWU7CisKKwkJLyogSWYgd2UgZG9uJ3Qgd2FudCB0aGlzIHBhY2thZ2UgaW5zdGFsbGVkIHRoZW4gd2UgbWF5CisJCSAqIGFzIHdlbGwgaWdub3JlIGl0J3MgZGVwZW5kZW5jaWVzLgorCQkgKi8KKwkJaWYgKGdldF9zdGF0dXMoc3RhdHVzX251bSwgMSkgIT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsIikpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhpcyBjb2RlIGlzIHRlc3RlZCBvbmx5IGZvciBFREdFX0RFUEVORFMsIHNpbmNlIEkKKwkJICogaGF2ZSBubyBzdWl0YWJsZSBwcmUtZGVwZW5kcyBhdmFpbGFibGUuIFRoZXJlIGlzIG5vCisJCSAqIHJlYXNvbiB0aGF0IGl0IHNob3VsZG4ndCB3b3JrIHRob3VnaCA6LSkKKwkJICovCisJCWZvciAoaiA9IDA7IGogPCBwYWNrYWdlX25vZGUtPm51bV9vZl9lZGdlczsgaisrKSB7CisJCQljb25zdCBlZGdlX3QgKnBhY2thZ2VfZWRnZSA9IHBhY2thZ2Vfbm9kZS0+ZWRnZVtqXTsKKwkJCXVuc2lnbmVkIHBhY2thZ2VfbnVtOworCisJCQlpZiAocGFja2FnZV9lZGdlLT50eXBlID09IEVER0VfT1JfUFJFX0RFUEVORFMKKwkJCSB8fCBwYWNrYWdlX2VkZ2UtPnR5cGUgPT0gRURHRV9PUl9ERVBFTkRTCisJCQkpIHsKKwkJCQkvKiBzdGFydCBhbiBFREdFX09SXyBsaXN0ICovCisJCQkJbnVtYmVyX29mX2FsdGVybmF0aXZlcyA9IHBhY2thZ2VfZWRnZS0+dmVyc2lvbjsKKwkJCQlyb290X29mX2FsdGVybmF0aXZlcyA9IHBhY2thZ2VfZWRnZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChudW1iZXJfb2ZfYWx0ZXJuYXRpdmVzID09IDApIHsgIC8qIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGFuIEVER0VfT1JfIGxpc3QgKi8KKwkJCQludW1iZXJfb2ZfYWx0ZXJuYXRpdmVzID0gMTsKKwkJCQlyb290X29mX2FsdGVybmF0aXZlcyA9IE5VTEw7CisJCQl9CisKKwkJCXBhY2thZ2VfbnVtID0gc2VhcmNoX3BhY2thZ2VfaGFzaHRhYmxlKHBhY2thZ2VfZWRnZS0+bmFtZSwgcGFja2FnZV9lZGdlLT52ZXJzaW9uLCBwYWNrYWdlX2VkZ2UtPm9wZXJhdG9yKTsKKworCQkJaWYgKHBhY2thZ2VfZWRnZS0+dHlwZSA9PSBFREdFX1BSRV9ERVBFTkRTCisJCQkgfHwgcGFja2FnZV9lZGdlLT50eXBlID09IEVER0VfREVQRU5EUworCQkJKSB7CisJCQkJaW50IHJlc3VsdD0xOworCQkJCXN0YXR1c19udW0gPSAwOworCisJCQkJLyogSWYgd2UgYXJlIGluc2lkZSBhbiBhbHRlcm5hdGl2ZSB0aGVuIGNoZWNrCisJCQkJICogdGhpcyBlZGdlIGlzIHRoZSByaWdodCB0eXBlLgorCQkJCSAqCisJCQkJICogRURHRV9ERVBFTkRTID09IE9SX0RFUEVORFMgLTEKKwkJCQkgKiBFREdFX1BSRV9ERVBFTkRTID09IE9SX1BSRV9ERVBFTkRTIC0xCisJCQkJICovCisJCQkJaWYgKHJvb3Rfb2ZfYWx0ZXJuYXRpdmVzICYmIHBhY2thZ2VfZWRnZS0+dHlwZSAhPSByb290X29mX2FsdGVybmF0aXZlcy0+dHlwZSAtIDEpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmYXRhbCBlcnJvciwgcGFja2FnZSBkZXBlbmRlbmNpZXMgY29ycnVwdDogJWQgIT0gJWQgLSAxIiwKKwkJCQkJCQkgICAgIHBhY2thZ2VfZWRnZS0+dHlwZSwgcm9vdF9vZl9hbHRlcm5hdGl2ZXMtPnR5cGUpOworCisJCQkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXSAhPSBOVUxMKQorCQkJCQlyZXN1bHQgPSAhcGFja2FnZV9zYXRpc2ZpZXNfZGVwZW5kZW5jeShwYWNrYWdlX251bSwgcGFja2FnZV9lZGdlLT50eXBlKTsKKworCQkJCWlmIChyZXN1bHQpIHsgLyogY2hlY2sgZm9yIG90aGVyIHBhY2thZ2Ugd2hpY2ggcHJvdmlkZSB3aGF0IHdlIGFyZSBsb29raW5nIGZvciAqLworCQkJCQlpbnQgcHJvdmlkZXIgPSAtMTsKKworCQkJCQl3aGlsZSAoKHByb3ZpZGVyID0gc2VhcmNoX2Zvcl9wcm92aWRlcyhwYWNrYWdlX2VkZ2UtPm5hbWUsIHByb3ZpZGVyKSkgPiAtMSkgeworCQkJCQkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW3Byb3ZpZGVyXSA9PSBOVUxMKSB7CisJCQkJCQkJcHV0cygiSGF2ZSBhIHByb3ZpZGVyIGJ1dCBubyBwYWNrYWdlIGluZm9ybWF0aW9uIGZvciBpdCIpOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJcmVzdWx0ID0gIXBhY2thZ2Vfc2F0aXNmaWVzX2RlcGVuZGVuY3kocHJvdmlkZXIsIHBhY2thZ2VfZWRnZS0+dHlwZSk7CisKKwkJCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIEl0IG11c3QgYmUgYWxyZWFkeSBpbnN0YWxsZWQsIG9yIHRvIGJlIGluc3RhbGxlZCAqLworCQkJCW51bWJlcl9vZl9hbHRlcm5hdGl2ZXMtLTsKKwkJCQlpZiAocmVzdWx0ICYmIG51bWJlcl9vZl9hbHRlcm5hdGl2ZXMgPT0gMCkgeworCQkJCQlpZiAocm9vdF9vZl9hbHRlcm5hdGl2ZXMpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJCQkJCQkicGFja2FnZSAlcyAlc2RlcGVuZHMgb24gJXMsICIKKwkJCQkJCQkid2hpY2ggY2Fubm90IGJlIHNhdGlzZmllZCIsCisJCQkJCQkJbmFtZV9oYXNodGFibGVbcGFja2FnZV9ub2RlLT5uYW1lXSwKKwkJCQkJCQlwYWNrYWdlX2VkZ2UtPnR5cGUgPT0gRURHRV9QUkVfREVQRU5EUyA/ICJwcmUtIiA6ICIiLAorCQkJCQkJCW5hbWVfaGFzaHRhYmxlW3Jvb3Rfb2ZfYWx0ZXJuYXRpdmVzLT5uYW1lXSk7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCQkJInBhY2thZ2UgJXMgJXNkZXBlbmRzIG9uICVzLCB3aGljaCAlc1xuIiwKKwkJCQkJCW5hbWVfaGFzaHRhYmxlW3BhY2thZ2Vfbm9kZS0+bmFtZV0sCisJCQkJCQlwYWNrYWdlX2VkZ2UtPnR5cGUgPT0gRURHRV9QUkVfREVQRU5EUyA/ICJwcmUtIiA6ICIiLAorCQkJCQkJbmFtZV9oYXNodGFibGVbcGFja2FnZV9lZGdlLT5uYW1lXSwKKwkJCQkJCWRlc2NyaWJlX3N0YXR1cyhzdGF0dXNfbnVtKSk7CisJCQkJfQorCQkJCWlmIChyZXN1bHQgPT0gMCAmJiBudW1iZXJfb2ZfYWx0ZXJuYXRpdmVzKSB7CisJCQkJCS8qIHdlJ3ZlIGZvdW5kIGEgcGFja2FnZSB3aGljaAorCQkJCQkgKiBzYXRpc2ZpZXMgdGhlIGRlcGVuZGVuY3ksCisJCQkJCSAqIHNvIHNraXAgb3ZlciB0aGUgcmVzdCBvZgorCQkJCQkgKiB0aGUgYWx0ZXJuYXRpdmVzLgorCQkJCQkgKi8KKwkJCQkJaiArPSBudW1iZXJfb2ZfYWx0ZXJuYXRpdmVzOworCQkJCQludW1iZXJfb2ZfYWx0ZXJuYXRpdmVzID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZnJlZShjb25mbGljdHMpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgY2hhciAqKmNyZWF0ZV9saXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCUZJTEUgKmxpc3Rfc3RyZWFtOworCWNoYXIgKipmaWxlX2xpc3Q7CisJY2hhciAqbGluZTsKKwlpbnQgY291bnQ7CisKKwkvKiBkb24ndCB1c2UgW3h3XWZvcGVuIGhlcmUsIGhhbmRsZSBlcnJvciBvdXJzZWxmICovCisJbGlzdF9zdHJlYW0gPSBmb3Blbl9mb3JfcmVhZChmaWxlbmFtZSk7CisJaWYgKGxpc3Rfc3RyZWFtID09IE5VTEwpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZmlsZV9saXN0ID0gTlVMTDsKKwljb3VudCA9IDA7CisJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShsaXN0X3N0cmVhbSkpICE9IE5VTEwpIHsKKwkJZmlsZV9saXN0ID0geHJlYWxsb2NfdmVjdG9yKGZpbGVfbGlzdCwgMiwgY291bnQpOworCQlmaWxlX2xpc3RbY291bnQrK10gPSBsaW5lOworCQkvKmZpbGVfbGlzdFtjb3VudF0gPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKwl9CisJZmNsb3NlKGxpc3Rfc3RyZWFtKTsKKworCXJldHVybiBmaWxlX2xpc3Q7Cit9CisKKy8qIG1heWJlIGkgc2hvdWxkIHRyeSBhbmQgaG9vayB0aGlzIGludG8gcmVtb3ZlX2ZpbGUuYyBzb21laG93ICovCitzdGF0aWMgaW50IHJlbW92ZV9maWxlX2FycmF5KGNoYXIgKipyZW1vdmVfbmFtZXMsIGNoYXIgKipleGNsdWRlX25hbWVzKQoreworCXN0cnVjdCBzdGF0IHBhdGhfc3RhdDsKKwlpbnQgcmVtb3ZlX2ZsYWcgPSAxOyAvKiBub3QgcmVtb3ZlZCBhbnl0aGluZyB5ZXQgKi8KKwlpbnQgaSwgajsKKworCWlmIChyZW1vdmVfbmFtZXMgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMDsgcmVtb3ZlX25hbWVzW2ldICE9IE5VTEw7IGkrKykgeworCQlpZiAoZXhjbHVkZV9uYW1lcyAhPSBOVUxMKSB7CisJCQlmb3IgKGogPSAwOyBleGNsdWRlX25hbWVzW2pdICE9IE5VTEw7IGorKykgeworCQkJCWlmIChzdHJjbXAocmVtb3ZlX25hbWVzW2ldLCBleGNsdWRlX25hbWVzW2pdKSA9PSAwKSB7CisJCQkJCWdvdG8gc2tpcDsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogVE9ETzogd2h5IHdlIGFyZSBjaGVja2luZyBsc3RhdD8gd2UgY2FuIGp1c3QgdHJ5IHJtL3JtZGlyICovCisJCWlmIChsc3RhdChyZW1vdmVfbmFtZXNbaV0sICZwYXRoX3N0YXQpIDwgMCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKFNfSVNESVIocGF0aF9zdGF0LnN0X21vZGUpKSB7CisJCQlyZW1vdmVfZmxhZyAmPSBybWRpcihyZW1vdmVfbmFtZXNbaV0pOyAvKiAwIGlmIG5vIGVycm9yICovCisJCX0gZWxzZSB7CisJCQlyZW1vdmVfZmxhZyAmPSB1bmxpbmsocmVtb3ZlX25hbWVzW2ldKTsgLyogMCBpZiBubyBlcnJvciAqLworCQl9Cisgc2tpcDoKKwkJY29udGludWU7CisJfQorCXJldHVybiAocmVtb3ZlX2ZsYWcgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9wYWNrYWdlX3NjcmlwdF9vcl9kaWUoY29uc3QgY2hhciAqcGFja2FnZV9uYW1lLCBjb25zdCBjaGFyICpzY3JpcHRfdHlwZSkKK3sKKwljaGFyICpzY3JpcHRfcGF0aDsKKwlpbnQgcmVzdWx0OworCisJc2NyaXB0X3BhdGggPSB4YXNwcmludGYoIi92YXIvbGliL2Rwa2cvaW5mby8lcy4lcyIsIHBhY2thZ2VfbmFtZSwgc2NyaXB0X3R5cGUpOworCisJLyogSWYgdGhlIGZpbGUgZG9lc250IGV4aXN0IGlzIGlzbnQgZmF0YWwgKi8KKwlyZXN1bHQgPSBhY2Nlc3Moc2NyaXB0X3BhdGgsIEZfT0spID8gRVhJVF9TVUNDRVNTIDogc3lzdGVtKHNjcmlwdF9wYXRoKTsKKwlmcmVlKHNjcmlwdF9wYXRoKTsKKwlpZiAocmVzdWx0KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgZmFpbGVkLCBleGl0IGNvZGUgJWQiLCBzY3JpcHRfdHlwZSwgcmVzdWx0KTsKK30KKworLyoKK1RoZSBwb2xpY3kgbWFudWFsIGRlZmluZXMgd2hhdCBzY3JpcHRzIGdldCBjYWxsZWQgd2hlbiBhbmQgd2l0aAord2hhdCBhcmd1bWVudHMuIEkgcmVhbGl6ZSB0aGF0IGJ1c3lib3ggZG9lcyBub3Qgc3VwcG9ydCBhbGwgb2YKK3RoZXNlIHNjZW5hcmlvcywgYnV0IGl0IGRvZXMgc3VwcG9ydCBzb21lIG9mIHRoZW07IGl0IGRvZXMgbm90LAoraG93ZXZlciwgcnVuIHRoZW0gd2l0aCBhbnkgcGFyYW1ldGVycyBpbiBydW5fcGFja2FnZV9zY3JpcHRfb3JfZGllKCkuCitIZXJlIGFyZSB0aGUgc2NyaXB0czoKKworcHJlaW5zdCBpbnN0YWxsCitwcmVpbnN0IGluc3RhbGwgPG9sZF92ZXJzaW9uPgorcHJlaW5zdCB1cGdyYWRlIDxvbGRfdmVyc2lvbj4KK3ByZWluc3QgYWJvcnRfdXBncmFkZSA8bmV3X3ZlcnNpb24+Citwb3N0aW5zdCBjb25maWd1cmUgPG1vc3RfcmVjZW50X3ZlcnNpb24+Citwb3N0aW5zdCBhYm9ydC11cGdhZGUgPG5ld192ZXJzaW9uPgorcG9zdGluc3QgYWJvcnQtcmVtb3ZlCitwb3N0aW5zdCBhYm9ydC1yZW1vdmUgaW4tZmF2b3VyIDxwYWNrYWdlPiA8dmVyc2lvbj4KK3Bvc3RpbnN0IGFib3J0LWRlY29uZmlndXJlIGluLWZhdm9yIDxmYWlsZWRfaW5zdGFsbF9wYWNrYWdlPiByZW1vdmluZyA8Y29uZmxpY3RpbmdfcGFja2FnZT4gPHZlcnNpb24+CitwcmVybSByZW1vdmUKK3ByZXJtIHVwZ3JhZGUgPG5ld192ZXJzaW9uPgorcHJlcm0gZmFpbGVkLXVwZ3JhZGUgPG9sZF92ZXJzaW9uPgorcHJlcm0gcmVtb3ZlIGluLWZhdm9yIDxwYWNrYWdlPiA8bmV3X3ZlcnNpb24+CitwcmVybSBkZWNvbmZpZ3VyZSBpbi1mYXZvdXIgPHBhY2thZ2U+IDx2ZXJzaW9uPiByZW1vdmluZyA8cGFja2FnZT4gPHZlcnNpb24+Citwb3N0cm0gcmVtb3ZlCitwb3N0cm0gcHVyZ2UKK3Bvc3RybSB1cGdyYWRlIDxuZXdfdmVyc2lvbj4KK3Bvc3RybSBmYWlsZWQtdXBncmFkZSA8b2xkX3ZlcnNpb24+Citwb3N0cm0gYWJvcnQtaW5zdGFsbAorcG9zdHJtIGFib3J0LWluc3RhbGwgPG9sZF92ZXJzaW9uPgorcG9zdHJtIGFib3J0LXVwZ3JhZGUgPG9sZF92ZXJzaW9uPgorcG9zdHJtIGRpc2FwcGVhciA8b3ZlcndyaXRlcj4gPHZlcnNpb24+CisqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFsbF9jb250cm9sX2ZpbGVzW10gPSB7CisJInByZWluc3QiLCAicG9zdGluc3QiLCAicHJlcm0iLCAicG9zdHJtIiwKKwkibGlzdCIsICJtZDVzdW1zIiwgInNobGlicyIsICJjb25mZmlsZXMiLAorCSJjb25maWciLCAidGVtcGxhdGVzIgorfTsKKworc3RhdGljIGNoYXIgKiphbGxfY29udHJvbF9saXN0KGNvbnN0IGNoYXIgKnBhY2thZ2VfbmFtZSkKK3sKKwl1bnNpZ25lZCBpID0gMDsKKwljaGFyICoqcmVtb3ZlX2ZpbGVzOworCisJLyogQ3JlYXRlIGEgbGlzdCBvZiBhbGwgL3Zhci9saWIvZHBrZy9pbmZvLzxwYWNrYWdlPiBmaWxlcyAqLworCXJlbW92ZV9maWxlcyA9IHh6YWxsb2Moc2l6ZW9mKGFsbF9jb250cm9sX2ZpbGVzKSArIHNpemVvZihjaGFyKikpOworCXdoaWxlIChpIDwgQVJSQVlfU0laRShhbGxfY29udHJvbF9maWxlcykpIHsKKwkJcmVtb3ZlX2ZpbGVzW2ldID0geGFzcHJpbnRmKCIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLAorCQkJCXBhY2thZ2VfbmFtZSwgYWxsX2NvbnRyb2xfZmlsZXNbaV0pOworCQlpKys7CisJfQorCisJcmV0dXJuIHJlbW92ZV9maWxlczsKK30KKworc3RhdGljIHZvaWQgZnJlZV9hcnJheShjaGFyICoqYXJyYXkpCit7CisJaWYgKGFycmF5KSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQl3aGlsZSAoYXJyYXlbaV0pIHsKKwkJCWZyZWUoYXJyYXlbaV0pOworCQkJaSsrOworCQl9CisJCWZyZWUoYXJyYXkpOworCX0KK30KKworLyogVGhpcyBmdW5jdGlvbiBsaXN0cyBpbmZvcm1hdGlvbiBvbiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzLiBJdCBsb29wcyB0aHJvdWdoCisgKiB0aGUgc3RhdHVzX2hhc2h0YWJsZSB0byByZXRyaWV2ZSB0aGUgaW5mby4gVGhpcyByZXN1bHRzIGluIHNtYWxsZXIgY29kZSB0aGFuCisgKiBzY2FubmluZyB0aGUgc3RhdHVzIGZpbGUuIFRoZSByZXN1bHRpbmcgbGlzdCwgaG93ZXZlciwgaXMgdW5zb3J0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGxpc3RfcGFja2FnZXMoY29uc3QgY2hhciAqcGF0dGVybikKK3sKKwlpbnQgaTsKKworCXB1dHMoIiAgICBOYW1lICAgICAgICAgICBWZXJzaW9uIik7CisJcHV0cygiKysrLT09PT09PT09PT09PT09LT09PT09PT09PT09PT09Iik7CisKKwkvKiBnbyB0aHJvdWdoIHN0YXR1cyBoYXNoLCBkZXJlZmVyZW5jZSBwYWNrYWdlIGhhc2ggYW5kIGZpbmFsbHkgc3RyaW5ncyAqLworCWZvciAoaSA9IDA7IGkgPCBTVEFUVVNfSEFTSF9QUklNRSsxOyBpKyspIHsKKwkJaWYgKHN0YXR1c19oYXNodGFibGVbaV0pIHsKKwkJCWNvbnN0IGNoYXIgKnN0YXRfc3RyOyAgLyogc3RhdHVzIHN0cmluZyAqLworCQkJY29uc3QgY2hhciAqbmFtZV9zdHI7ICAvKiBwYWNrYWdlIG5hbWUgKi8KKwkJCWNvbnN0IGNoYXIgKnZlcnNfc3RyOyAgLyogdmVyc2lvbiAqLworCQkJY2hhciAgczEsIHMyOyAgICAgICAgICAvKiBzdGF0dXMgYWJicmV2aWF0aW9ucyAqLworCQkJaW50ICAgc3BjY250OyAgICAgICAgICAvKiBzcGFjZSBjb3VudCAqLworCQkJaW50ICAgajsKKworCQkJc3RhdF9zdHIgPSBuYW1lX2hhc2h0YWJsZVtzdGF0dXNfaGFzaHRhYmxlW2ldLT5zdGF0dXNdOworCQkJbmFtZV9zdHIgPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtzdGF0dXNfaGFzaHRhYmxlW2ldLT5wYWNrYWdlXS0+bmFtZV07CisJCQl2ZXJzX3N0ciA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3N0YXR1c19oYXNodGFibGVbaV0tPnBhY2thZ2VdLT52ZXJzaW9uXTsKKworCQkJaWYgKHBhdHRlcm4gJiYgZm5tYXRjaChwYXR0ZXJuLCBuYW1lX3N0ciwgMCkgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJLyogZ2V0IGFiYnJldmlhdGlvbiBmb3Igc3RhdHVzIGZpZWxkIDEgKi8KKwkJCXMxID0gc3RhdF9zdHJbMF0gPT0gJ2knID8gJ2knIDogJ3InOworCisJCQkvKiBnZXQgYWJicmV2aWF0aW9uIGZvciBzdGF0dXMgZmllbGQgMiAqLworCQkJZm9yIChqID0gMCwgc3BjY250ID0gMDsgc3RhdF9zdHJbal0gJiYgc3BjY250IDwgMjsgaisrKSB7CisJCQkJaWYgKHN0YXRfc3RyW2pdID09ICcgJykgc3BjY250Kys7CisJCQl9CisJCQlzMiA9IHN0YXRfc3RyW2pdOworCisJCQkvKiBwcmludCBvdXQgdGhlIGxpbmUgZm9ybWF0dGVkIGxpa2UgRGViaWFuIGRwa2cgKi8KKwkJCXByaW50ZigiJWMlYyAgJS0xNHMgJXNcbiIsIHMxLCBzMiwgbmFtZV9zdHIsIHZlcnNfc3RyKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3BhY2thZ2UoY29uc3QgdW5zaWduZWQgcGFja2FnZV9udW0sIGludCBub2lzeSkKK3sKKwljb25zdCBjaGFyICpwYWNrYWdlX25hbWUgPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPm5hbWVdOworCWNvbnN0IGNoYXIgKnBhY2thZ2VfdmVyc2lvbiA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+dmVyc2lvbl07CisJY29uc3QgdW5zaWduZWQgc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKHBhY2thZ2VfbmFtZSk7CisJY29uc3QgaW50IHBhY2thZ2VfbmFtZV9sZW5ndGggPSBzdHJsZW4ocGFja2FnZV9uYW1lKTsKKwljaGFyICoqcmVtb3ZlX2ZpbGVzOworCWNoYXIgKipleGNsdWRlX2ZpbGVzOworCWNoYXIgbGlzdF9uYW1lW3BhY2thZ2VfbmFtZV9sZW5ndGggKyAyNV07CisJY2hhciBjb25mZmlsZV9uYW1lW3BhY2thZ2VfbmFtZV9sZW5ndGggKyAzMF07CisKKwlpZiAobm9pc3kpCisJCXByaW50ZigiUmVtb3ZpbmcgJXMgKCVzKS4uLlxuIiwgcGFja2FnZV9uYW1lLCBwYWNrYWdlX3ZlcnNpb24pOworCisJLyogUnVuIHByZXJtIHNjcmlwdCAqLworCXJ1bl9wYWNrYWdlX3NjcmlwdF9vcl9kaWUocGFja2FnZV9uYW1lLCAicHJlcm0iKTsKKworCS8qIENyZWF0ZSBhIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLCBhbmQgYSBzZXBhcmF0ZSBsaXN0IG9mIHRob3NlIHRvIGtlZXAgKi8KKwlzcHJpbnRmKGxpc3RfbmFtZSwgIi92YXIvbGliL2Rwa2cvaW5mby8lcy4lcyIsIHBhY2thZ2VfbmFtZSwgImxpc3QiKTsKKwlyZW1vdmVfZmlsZXMgPSBjcmVhdGVfbGlzdChsaXN0X25hbWUpOworCisJc3ByaW50Zihjb25mZmlsZV9uYW1lLCAiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAiY29uZmZpbGVzIik7CisJZXhjbHVkZV9maWxlcyA9IGNyZWF0ZV9saXN0KGNvbmZmaWxlX25hbWUpOworCisJLyogU29tZSBkaXJlY3RvcmllcyBjYW4ndCBiZSByZW1vdmVkIHN0cmFpZ2h0IGF3YXksIHNvIGRvIG11bHRpcGxlIHBhc3NlcyAqLworCXdoaWxlIChyZW1vdmVfZmlsZV9hcnJheShyZW1vdmVfZmlsZXMsIGV4Y2x1ZGVfZmlsZXMpKQorCQljb250aW51ZTsKKwlmcmVlX2FycmF5KGV4Y2x1ZGVfZmlsZXMpOworCWZyZWVfYXJyYXkocmVtb3ZlX2ZpbGVzKTsKKworCS8qIENyZWF0ZSBhIGxpc3Qgb2YgZmlsZXMgaW4gL3Zhci9saWIvZHBrZy9pbmZvLzxwYWNrYWdlPi4qIHRvIGtlZXAgKi8KKwlleGNsdWRlX2ZpbGVzID0geHphbGxvYyhzaXplb2YoZXhjbHVkZV9maWxlc1swXSkgKiAzKTsKKwlleGNsdWRlX2ZpbGVzWzBdID0geHN0cmR1cChjb25mZmlsZV9uYW1lKTsKKwlleGNsdWRlX2ZpbGVzWzFdID0geGFzcHJpbnRmKCIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsICJwb3N0cm0iKTsKKworCS8qIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIC92YXIvbGliL2Rwa2cvaW5mby88cGFja2FnZT4gZmlsZXMgKi8KKwlyZW1vdmVfZmlsZXMgPSBhbGxfY29udHJvbF9saXN0KHBhY2thZ2VfbmFtZSk7CisKKwlyZW1vdmVfZmlsZV9hcnJheShyZW1vdmVfZmlsZXMsIGV4Y2x1ZGVfZmlsZXMpOworCWZyZWVfYXJyYXkocmVtb3ZlX2ZpbGVzKTsKKwlmcmVlX2FycmF5KGV4Y2x1ZGVfZmlsZXMpOworCisJLyogcmVuYW1lIDxwYWNrYWdlPi5jb25mZmlsZXMgdG8gPHBhY2thZ2U+Lmxpc3QKKwkgKiBUaGUgY29uZmZpbGVzIGNvbnRyb2wgZmlsZSBpc24ndCByZXF1aXJlZCBpbiBEZWJpYW4gcGFja2FnZXMsIHNvIGRvbid0CisJICogZXJyb3Igb3V0IGlmIGl0J3MgbWlzc2luZy4gICovCisJcmVuYW1lKGNvbmZmaWxlX25hbWUsIGxpc3RfbmFtZSk7CisKKwkvKiBDaGFuZ2UgcGFja2FnZSBzdGF0dXMgKi8KKwlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJjb25maWctZmlsZXMiLCAzKTsKK30KKworc3RhdGljIHZvaWQgcHVyZ2VfcGFja2FnZShjb25zdCB1bnNpZ25lZCBwYWNrYWdlX251bSkKK3sKKwljb25zdCBjaGFyICpwYWNrYWdlX25hbWUgPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPm5hbWVdOworCWNvbnN0IGNoYXIgKnBhY2thZ2VfdmVyc2lvbiA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+dmVyc2lvbl07CisJY29uc3QgdW5zaWduZWQgc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKHBhY2thZ2VfbmFtZSk7CisJY2hhciAqKnJlbW92ZV9maWxlczsKKwljaGFyICoqZXhjbHVkZV9maWxlczsKKwljaGFyIGxpc3RfbmFtZVtzdHJsZW4ocGFja2FnZV9uYW1lKSArIDI1XTsKKworCXByaW50ZigiUHVyZ2luZyAlcyAoJXMpLi4uXG4iLCBwYWNrYWdlX25hbWUsIHBhY2thZ2VfdmVyc2lvbik7CisKKwkvKiBSdW4gcHJlcm0gc2NyaXB0ICovCisJcnVuX3BhY2thZ2Vfc2NyaXB0X29yX2RpZShwYWNrYWdlX25hbWUsICJwcmVybSIpOworCisJLyogQ3JlYXRlIGEgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUgKi8KKwlzcHJpbnRmKGxpc3RfbmFtZSwgIi92YXIvbGliL2Rwa2cvaW5mby8lcy4lcyIsIHBhY2thZ2VfbmFtZSwgImxpc3QiKTsKKwlyZW1vdmVfZmlsZXMgPSBjcmVhdGVfbGlzdChsaXN0X25hbWUpOworCisJLyogU29tZSBkaXJlY3RvcmllcyBjYW50IGJlIHJlbW92ZWQgc3RyYWlnaHQgYXdheSwgc28gZG8gbXVsdGlwbGUgcGFzc2VzICovCisJd2hpbGUgKHJlbW92ZV9maWxlX2FycmF5KHJlbW92ZV9maWxlcywgTlVMTCkpCisJCWNvbnRpbnVlOworCWZyZWVfYXJyYXkocmVtb3ZlX2ZpbGVzKTsKKworCS8qIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIC92YXIvbGliL2Rwa2cvaW5mby88cGFja2FnZT4gZmlsZXMgKi8KKwlyZW1vdmVfZmlsZXMgPSBhbGxfY29udHJvbF9saXN0KHBhY2thZ2VfbmFtZSk7CisKKwkvKiBEZWxldGUgYWxsIG9mIHRoZW0gZXhjZXB0IHRoZSBwb3N0cm0gc2NyaXB0ICovCisJZXhjbHVkZV9maWxlcyA9IHh6YWxsb2Moc2l6ZW9mKGV4Y2x1ZGVfZmlsZXNbMF0pICogMik7CisJZXhjbHVkZV9maWxlc1swXSA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAicG9zdHJtIik7CisJcmVtb3ZlX2ZpbGVfYXJyYXkocmVtb3ZlX2ZpbGVzLCBleGNsdWRlX2ZpbGVzKTsKKwlmcmVlX2FycmF5KGV4Y2x1ZGVfZmlsZXMpOworCisJLyogUnVuIGFuZCByZW1vdmUgcG9zdHJtIHNjcmlwdCAqLworCXJ1bl9wYWNrYWdlX3NjcmlwdF9vcl9kaWUocGFja2FnZV9uYW1lLCAicG9zdHJtIik7CisJcmVtb3ZlX2ZpbGVfYXJyYXkocmVtb3ZlX2ZpbGVzLCBOVUxMKTsKKworCWZyZWVfYXJyYXkocmVtb3ZlX2ZpbGVzKTsKKworCS8qIENoYW5nZSBwYWNrYWdlIHN0YXR1cyAqLworCXNldF9zdGF0dXMoc3RhdHVzX251bSwgIm5vdC1pbnN0YWxsZWQiLCAzKTsKK30KKworc3RhdGljIGFyY2hpdmVfaGFuZGxlX3QgKmluaXRfYXJjaGl2ZV9kZWJfYXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqYXJfaGFuZGxlOworCisJLyogU2V0dXAgYW4gYXIgYXJjaGl2ZSBoYW5kbGUgdGhhdCByZWZlcnMgdG8gdGhlIGd6aXAgc3ViIGFyY2hpdmUgKi8KKwlhcl9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCWFyX2hhbmRsZS0+ZmlsdGVyID0gZmlsdGVyX2FjY2VwdF9saXN0X3JlYXNzaWduOworCWFyX2hhbmRsZS0+c3JjX2ZkID0geG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKworCXJldHVybiBhcl9oYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfYXJjaGl2ZV9kZWJfY29udHJvbChhcmNoaXZlX2hhbmRsZV90ICphcl9oYW5kbGUpCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqdGFyX2hhbmRsZTsKKworCS8qIFNldHVwIHRoZSB0YXIgYXJjaGl2ZSBoYW5kbGUgKi8KKwl0YXJfaGFuZGxlID0gaW5pdF9oYW5kbGUoKTsKKwl0YXJfaGFuZGxlLT5zcmNfZmQgPSBhcl9oYW5kbGUtPnNyY19mZDsKKworCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgZGF0YS50YXIuKiBvciBkZWJpYW4tYmluYXJ5LCBqdXN0IGNvbnRyb2wudGFyLiogKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorCWxsaXN0X2FkZF90bygmKGFyX2hhbmRsZS0+YWNjZXB0KSwgKGNoYXIqKSJjb250cm9sLnRhci5neiIpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJbGxpc3RfYWRkX3RvKCYoYXJfaGFuZGxlLT5hY2NlcHQpLCAoY2hhciopImNvbnRyb2wudGFyLmJ6MiIpOworI2VuZGlmCisKKwkvKiBBc3NpZ24gdGhlIHRhciBoYW5kbGUgYXMgYSBzdWJhcmNoaXZlIG9mIHRoZSBhciBoYW5kbGUgKi8KKwlhcl9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlID0gdGFyX2hhbmRsZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9hcmNoaXZlX2RlYl9kYXRhKGFyY2hpdmVfaGFuZGxlX3QgKmFyX2hhbmRsZSkKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICp0YXJfaGFuZGxlOworCisJLyogU2V0dXAgdGhlIHRhciBhcmNoaXZlIGhhbmRsZSAqLworCXRhcl9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCXRhcl9oYW5kbGUtPnNyY19mZCA9IGFyX2hhbmRsZS0+c3JjX2ZkOworCisJLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBjb250cm9sLnRhci4qIG9yIGRlYmlhbi1iaW5hcnksIGp1c3QgZGF0YS50YXIuKiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daCisJbGxpc3RfYWRkX3RvKCYoYXJfaGFuZGxlLT5hY2NlcHQpLCAoY2hhciopImRhdGEudGFyLmd6Iik7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwlsbGlzdF9hZGRfdG8oJihhcl9oYW5kbGUtPmFjY2VwdCksIChjaGFyKikiZGF0YS50YXIuYnoyIik7CisjZW5kaWYKKworCS8qIEFzc2lnbiB0aGUgdGFyIGhhbmRsZSBhcyBhIHN1YmFyY2hpdmUgb2YgdGhlIGFyIGhhbmRsZSAqLworCWFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUgPSB0YXJfaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGF0YV9leHRyYWN0X3RvX2J1ZmZlcihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwl1bnNpZ25lZCBzaXplID0gYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5zaXplOworCisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX2J1ZmZlciA9IHh6YWxsb2Moc2l6ZSArIDEpOworCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGFyY2hpdmVfaGFuZGxlLT5kcGtnX19idWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgY2hhciAqZGViX2V4dHJhY3RfY29udHJvbF9maWxlX3RvX2J1ZmZlcihhcmNoaXZlX2hhbmRsZV90ICphcl9oYW5kbGUsIGxsaXN0X3QgKm15YWNjZXB0KQoreworCWFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X3RvX2J1ZmZlcjsKKwlhcl9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5hY2NlcHQgPSBteWFjY2VwdDsKKwlhcl9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3Q7CisKKwl1bnBhY2tfYXJfYXJjaGl2ZShhcl9oYW5kbGUpOworCWNsb3NlKGFyX2hhbmRsZS0+c3JjX2ZkKTsKKworCXJldHVybiBhcl9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5kcGtnX19idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9jb250cm9sX2ZpbGVfdG9fbGxpc3QoY29uc3QgY2hhciAqcGFja2FnZV9uYW1lLCBjb25zdCBjaGFyICpjb250cm9sX25hbWUsIGxsaXN0X3QgKipsbCkKK3sKKwlGSUxFICpmcDsKKwljaGFyICpmaWxlbmFtZSwgKmxpbmU7CisKKwlmaWxlbmFtZSA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCBjb250cm9sX25hbWUpOworCWZwID0gZm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCWZyZWUoZmlsZW5hbWUpOworCWlmIChmcCAhPSBOVUxMKSB7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoZnApKSAhPSBOVUxMKQorCQkJbGxpc3RfYWRkX3RvKGxsLCBsaW5lKTsKKwkJZmNsb3NlKGZwKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyIEZBU1RfRlVOQyBmaWx0ZXJfcmVuYW1lX2NvbmZpZyhhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlpbnQgZmQ7CisJY2hhciAqbmFtZV9wdHIgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUgKyAxOworCisJLyogSXMgdGhpcyBmaWxlIG1hcmtlZCBhcyBjb25maWcgZmlsZT8gKi8KKwlpZiAoIWZpbmRfbGlzdF9lbnRyeShhcmNoaXZlX2hhbmRsZS0+YWNjZXB0LCBuYW1lX3B0cikpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7IC8qIG5vICovCisKKwlmZCA9IG9wZW4obmFtZV9wdHIsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPj0gMCkgeworCQltZDVfY3R4X3QgbWQ1OworCQljaGFyICptZDVsaW5lLCAqYnVmOworCQlpbnQgY291bnQ7CisKKwkJLyogQ2FsY3VsYXRlIE1ENSBvZiBleGlzdGluZyBmaWxlICovCisJCWJ1ZiA9IHhtYWxsb2MoNDA5Nik7CisJCW1kNV9iZWdpbigmbWQ1KTsKKwkJd2hpbGUgKChjb3VudCA9IHNhZmVfcmVhZChmZCwgYnVmLCA0MDk2KSkgPiAwKQorCQkJbWQ1X2hhc2goJm1kNSwgYnVmLCBjb3VudCk7CisJCW1kNV9lbmQoJm1kNSwgYnVmKTsgLyogdXNpbmcgYnVmIGFzIHJlc3VsdCBzdG9yYWdlICovCisJCWNsb3NlKGZkKTsKKworCQltZDVsaW5lID0geG1hbGxvYygxNiAqIDIgKyAyICsgc3RybGVuKG5hbWVfcHRyKSArIDEpOworCQlzcHJpbnRmKGJpbjJoZXgobWQ1bGluZSwgYnVmLCAxNiksICIgICVzIiwgbmFtZV9wdHIpOworCQlmcmVlKGJ1Zik7CisKKwkJLyogSXMgaXQgY2hhbmdlZCBhZnRlciBpbnN0YWxsPyAqLworCQlpZiAoZmluZF9saXN0X2VudHJ5KGFyY2hpdmVfaGFuZGxlLT5hY2NlcHQsIG1kNWxpbmUpID09IE5VTEwpIHsKKwkJCXByaW50ZigiV2FybmluZzogQ3JlYXRpbmcgJXMgYXMgJXMuZHBrZy1uZXdcbiIsIG5hbWVfcHRyLCBuYW1lX3B0cik7CisJCQlhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUgPSB4YXNwcmludGYoIiVzLmRwa2ctbmV3IiwgYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJfQorCQlmcmVlKG1kNWxpbmUpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGF0YV9leHRyYWN0X2FsbF9wcmVmaXgoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJY2hhciAqbmFtZV9wdHIgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWU7CisKKwkvKiBTa2lwIGFsbCBsZWFkaW5nICIvIiAqLworCXdoaWxlICgqbmFtZV9wdHIgPT0gJy8nKQorCQluYW1lX3B0cisrOworCS8qIFNraXAgYWxsIGxlYWRpbmcgIi4vIiBhbmQgIi4uLyIgKi8KKwl3aGlsZSAobmFtZV9wdHJbMF0gPT0gJy4nKSB7CisJCWlmIChuYW1lX3B0clsxXSA9PSAnLicpCisJCQluYW1lX3B0cisrOworCQlpZiAobmFtZV9wdHJbMV0gIT0gJy8nKQorCQkJYnJlYWs7CisJCW5hbWVfcHRyICs9IDI7CisJfQorCisJaWYgKG5hbWVfcHRyWzBdICE9ICdcMCcpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lID0geGFzcHJpbnRmKCIlcyVzIiwgYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX2J1ZmZlciwgbmFtZV9wdHIpOworCQlkYXRhX2V4dHJhY3RfYWxsKGFyY2hpdmVfaGFuZGxlKTsKKwkJaWYgKGZubWF0Y2goIiouZHBrZy1uZXciLCBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUsIDApID09IDApIHsKKwkJCS8qIHJlbW92ZSAuZHBrZy1uZXcgc3VmZml4ICovCisJCQlhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWVbc3RybGVuKGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSkgLSA5XSA9ICdcMCc7CisJCX0KKwl9Cit9CisKK2VudW0geworCS8qIENvbW1hbmRzICovCisJT1BUX2NvbmZpZ3VyZSAgICAgICAgICAgID0gKDEgPDwgMCksCisJT1BUX2luc3RhbGwgICAgICAgICAgICAgID0gKDEgPDwgMSksCisJT1BUX2xpc3RfaW5zdGFsbGVkICAgICAgID0gKDEgPDwgMiksCisJT1BUX3B1cmdlICAgICAgICAgICAgICAgID0gKDEgPDwgMyksCisJT1BUX3JlbW92ZSAgICAgICAgICAgICAgID0gKDEgPDwgNCksCisJT1BUX3VucGFjayAgICAgICAgICAgICAgID0gKDEgPDwgNSksCisJT1BUTUFTS19jbWQgICAgICAgICAgICAgID0gKDEgPDwgNikgLSAxLAorCS8qIE9wdGlvbnMgKi8KKwlPUFRfZm9yY2UgICAgICAgICAgICAgICAgPSAoMSA8PCA2KSwKKwlPUFRfZm9yY2VfaWdub3JlX2RlcGVuZHMgPSAoMSA8PCA3KSwKKwlPUFRfZm9yY2VfY29uZm5ldyAgICAgICAgPSAoMSA8PCA4KSwKKwlPUFRfZm9yY2VfY29uZm9sZCAgICAgICAgPSAoMSA8PCA5KSwKK307CisKK3N0YXRpYyB2b2lkIHVucGFja19wYWNrYWdlKGRlYl9maWxlX3QgKmRlYl9maWxlKQoreworCWNvbnN0IGNoYXIgKnBhY2thZ2VfbmFtZSA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlLT5wYWNrYWdlXS0+bmFtZV07CisJY29uc3QgdW5zaWduZWQgc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKHBhY2thZ2VfbmFtZSk7CisJY29uc3QgdW5zaWduZWQgc3RhdHVzX3BhY2thZ2VfbnVtID0gc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXS0+cGFja2FnZTsKKwljaGFyICppbmZvX3ByZWZpeDsKKwljaGFyICpsaXN0X2ZpbGVuYW1lOworCWFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlOworCUZJTEUgKm91dF9zdHJlYW07CisJbGxpc3RfdCAqYWNjZXB0X2xpc3Q7CisJbGxpc3RfdCAqY29uZmZpbGVfbGlzdDsKKwlpbnQgaTsKKworCS8qIElmIGV4aXN0aW5nIHZlcnNpb24sIHJlbW92ZSBpdCBmaXJzdCAqLworCWNvbmZmaWxlX2xpc3QgPSBOVUxMOworCWlmIChzdHJjbXAobmFtZV9oYXNodGFibGVbZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAzKV0sICJpbnN0YWxsZWQiKSA9PSAwKSB7CisJCS8qIFBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIHJlbW92ZSBvbGQgdmVyc2lvbiBmaXJzdCAqLworCQlwcmludGYoIlByZXBhcmluZyB0byByZXBsYWNlICVzICVzICh1c2luZyAlcykuLi5cbiIsIHBhY2thZ2VfbmFtZSwKKwkJCW5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3N0YXR1c19wYWNrYWdlX251bV0tPnZlcnNpb25dLAorCQkJZGViX2ZpbGUtPmZpbGVuYW1lKTsKKworCQkvKiBSZWFkIG1kNXN1bXMgZnJvbSBvbGQgcGFja2FnZSAqLworCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX2ZvcmNlX2NvbmZvbGQpKQorCQkJYXBwZW5kX2NvbnRyb2xfZmlsZV90b19sbGlzdChwYWNrYWdlX25hbWUsICJtZDVzdW1zIiwgJmNvbmZmaWxlX2xpc3QpOworCisJCXJlbW92ZV9wYWNrYWdlKHN0YXR1c19wYWNrYWdlX251bSwgMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJVbnBhY2tpbmcgJXMgKGZyb20gJXMpLi4uXG4iLCBwYWNrYWdlX25hbWUsIGRlYl9maWxlLT5maWxlbmFtZSk7CisJfQorCisJLyogRXh0cmFjdCBjb250cm9sLnRhci5neiB0byAvdmFyL2xpYi9kcGtnL2luZm8vPHBhY2thZ2U+LmZpbGVuYW1lICovCisJaW5mb19wcmVmaXggPSB4YXNwcmludGYoIi92YXIvbGliL2Rwa2cvaW5mby8lcy4lcyIsIHBhY2thZ2VfbmFtZSwgIiIpOworCWFyY2hpdmVfaGFuZGxlID0gaW5pdF9hcmNoaXZlX2RlYl9hcihkZWJfZmlsZS0+ZmlsZW5hbWUpOworCWluaXRfYXJjaGl2ZV9kZWJfY29udHJvbChhcmNoaXZlX2hhbmRsZSk7CisKKwlhY2NlcHRfbGlzdCA9IE5VTEw7CisJaSA9IDA7CisJd2hpbGUgKGkgPCBBUlJBWV9TSVpFKGFsbF9jb250cm9sX2ZpbGVzKSkgeworCQljaGFyICpjID0geGFzcHJpbnRmKCIuLyVzIiwgYWxsX2NvbnRyb2xfZmlsZXNbaV0pOworCQlsbGlzdF9hZGRfdG8oJmFjY2VwdF9saXN0LCBjKTsKKwkJaSsrOworCX0KKwlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmFjY2VwdCA9IGFjY2VwdF9saXN0OworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+ZmlsdGVyID0gZmlsdGVyX2FjY2VwdF9saXN0OworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfYWxsX3ByZWZpeDsKKwlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmRwa2dfX2J1ZmZlciA9IGluZm9fcHJlZml4OworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9VTkxJTktfT0xEOworCXVucGFja19hcl9hcmNoaXZlKGFyY2hpdmVfaGFuZGxlKTsKKworCS8qIFJ1biB0aGUgcHJlaW5zdCBwcmlvciB0byBleHRyYWN0aW5nICovCisJcnVuX3BhY2thZ2Vfc2NyaXB0X29yX2RpZShwYWNrYWdlX25hbWUsICJwcmVpbnN0Iik7CisKKwkvKiBEb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlnIGZpbGVzICovCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9mb3JjZV9jb25mbmV3KSkKKwkJYXBwZW5kX2NvbnRyb2xfZmlsZV90b19sbGlzdChwYWNrYWdlX25hbWUsICJjb25mZmlsZXMiLCAmY29uZmZpbGVfbGlzdCk7CisKKwkvKiBFeHRyYWN0IGRhdGEudGFyLmd6IHRvIHRoZSByb290IGRpcmVjdG9yeSAqLworCWFyY2hpdmVfaGFuZGxlID0gaW5pdF9hcmNoaXZlX2RlYl9hcihkZWJfZmlsZS0+ZmlsZW5hbWUpOworCWluaXRfYXJjaGl2ZV9kZWJfZGF0YShhcmNoaXZlX2hhbmRsZSk7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5hY2NlcHQgPSBjb25mZmlsZV9saXN0OworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+ZmlsdGVyID0gZmlsdGVyX3JlbmFtZV9jb25maWc7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGxfcHJlZml4OworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+ZHBrZ19fYnVmZmVyID0gKGNoYXIqKSIvIjsgLyogaHVoPyAqLworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9VTkxJTktfT0xEOworCXVucGFja19hcl9hcmNoaXZlKGFyY2hpdmVfaGFuZGxlKTsKKworCS8qIENyZWF0ZSB0aGUgbGlzdCBmaWxlICovCisJbGlzdF9maWxlbmFtZSA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAibGlzdCIpOworCW91dF9zdHJlYW0gPSB4Zm9wZW5fZm9yX3dyaXRlKGxpc3RfZmlsZW5hbWUpOworCXdoaWxlIChhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPnBhc3NlZCkgeworCQkvKiB0aGUgbGVhZGluZyAuIGhhcyBiZWVuIHN0cmlwcGVkIGJ5IGRhdGFfZXh0cmFjdF9hbGxfcHJlZml4IGFscmVhZHkgKi8KKwkJZnB1dHMoYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5wYXNzZWQtPmRhdGEsIG91dF9zdHJlYW0pOworCQlmcHV0YygnXG4nLCBvdXRfc3RyZWFtKTsKKwkJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5wYXNzZWQgPSBhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPnBhc3NlZC0+bGluazsKKwl9CisJZmNsb3NlKG91dF9zdHJlYW0pOworCisJLyogY2hhbmdlIHN0YXR1cyAqLworCXNldF9zdGF0dXMoc3RhdHVzX251bSwgImluc3RhbGwiLCAxKTsKKwlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJ1bnBhY2tlZCIsIDMpOworCisJZnJlZShpbmZvX3ByZWZpeCk7CisJZnJlZShsaXN0X2ZpbGVuYW1lKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlndXJlX3BhY2thZ2UoZGViX2ZpbGVfdCAqZGViX2ZpbGUpCit7CisJY29uc3QgY2hhciAqcGFja2FnZV9uYW1lID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGUtPnBhY2thZ2VdLT5uYW1lXTsKKwljb25zdCBjaGFyICpwYWNrYWdlX3ZlcnNpb24gPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtkZWJfZmlsZS0+cGFja2FnZV0tPnZlcnNpb25dOworCWNvbnN0IGludCBzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUocGFja2FnZV9uYW1lKTsKKworCXByaW50ZigiU2V0dGluZyB1cCAlcyAoJXMpLi4uXG4iLCBwYWNrYWdlX25hbWUsIHBhY2thZ2VfdmVyc2lvbik7CisKKwkvKiBSdW4gdGhlIHBvc3RpbnN0IHNjcmlwdCAqLworCS8qIFRPRE86IGhhbmRsZSBmYWlsdXJlIGdyYWNlZnVsbHkgKi8KKwlydW5fcGFja2FnZV9zY3JpcHRfb3JfZGllKHBhY2thZ2VfbmFtZSwgInBvc3RpbnN0Iik7CisKKwkvKiBDaGFuZ2Ugc3RhdHVzIHRvIHJlZmxlY3Qgc3VjY2VzcyAqLworCXNldF9zdGF0dXMoc3RhdHVzX251bSwgImluc3RhbGwiLCAxKTsKKwlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJpbnN0YWxsZWQiLCAzKTsKK30KKworaW50IGRwa2dfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRwa2dfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWRlYl9maWxlX3QgKipkZWJfZmlsZSA9IE5VTEw7CisJc3RhdHVzX25vZGVfdCAqc3RhdHVzX25vZGU7CisJY2hhciAqc3RyX2Y7CisJaW50IG9wdDsKKwlpbnQgcGFja2FnZV9udW07CisJaW50IGRlYl9jb3VudCA9IDA7CisJaW50IHN0YXRlX3N0YXR1czsKKwlpbnQgc3RhdHVzX251bTsKKwlpbnQgaTsKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgZHBrZ19sb25nb3B0c1tdIEFMSUdOMSA9CisvLyBGSVhNRTogd2UgdXNlIC1DIG5vbi1jb21wYXRpYmx5LCBzaG91bGQgYmU6CisvLyAiLUN8LS1hdWRpdCBDaGVjayBmb3IgYnJva2VuIHBhY2thZ2UocykiCisJCSJjb25maWd1cmVcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAgIkMiCisJCSJmb3JjZVwwIiAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAgIkYiCisJCSJpbnN0YWxsXDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAgImkiCisJCSJsaXN0XDAiICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAgImwiCisJCSJwdXJnZVwwIiAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAgIlAiCisJCSJyZW1vdmVcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAgInIiCisJCSJ1bnBhY2tcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAgInUiCisJCSJmb3JjZS1kZXBlbmRzXDAiICBOb19hcmd1bWVudCAgICAgICAgIlx4ZmYiCisJCSJmb3JjZS1jb25mbmV3XDAiICBOb19hcmd1bWVudCAgICAgICAgIlx4ZmUiCisJCSJmb3JjZS1jb25mb2xkXDAiICBOb19hcmd1bWVudCAgICAgICAgIlx4ZmQiCisJCTsKKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKwlJRl9MT05HX09QVFMoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGRwa2dfbG9uZ29wdHMpOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJDaWxQcnVGOiIsICZzdHJfZik7CisJYXJndiArPSBvcHRpbmQ7CisJLy9pZiAob3B0ICYgT1BUX2NvbmZpZ3VyZSkgLi4uIC8vIC1DCisJaWYgKG9wdCAmIE9QVF9mb3JjZSkgeyAvLyAtRiAoLS1mb3JjZSBpbiBvZmZpY2lhbCBkcGtnKQorCQlpZiAoc3RyY21wKHN0cl9mLCAiZGVwZW5kcyIpID09IDApCisJCQlvcHQgfD0gT1BUX2ZvcmNlX2lnbm9yZV9kZXBlbmRzOworCQllbHNlIGlmIChzdHJjbXAoc3RyX2YsICJjb25mbmV3IikgPT0gMCkKKwkJCW9wdCB8PSBPUFRfZm9yY2VfY29uZm5ldzsKKwkJZWxzZSBpZiAoc3RyY21wKHN0cl9mLCAiY29uZm9sZCIpID09IDApCisJCQlvcHQgfD0gT1BUX2ZvcmNlX2NvbmZvbGQ7CisJCWVsc2UKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJb3B0aW9uX21hc2szMiA9IG9wdDsKKwl9CisJLy9pZiAob3B0ICYgT1BUX2luc3RhbGwpIC4uLiAvLyAtaQorCS8vaWYgKG9wdCAmIE9QVF9saXN0X2luc3RhbGxlZCkgLi4uIC8vIC1sCisJLy9pZiAob3B0ICYgT1BUX3B1cmdlKSAuLi4gLy8gLVAKKwkvL2lmIChvcHQgJiBPUFRfcmVtb3ZlKSAuLi4gLy8gLXIKKwkvL2lmIChvcHQgJiBPUFRfdW5wYWNrKSAuLi4gLy8gLXUgKC0tdW5wYWNrIGluIG9mZmljaWFsIGRwa2cpCisJaWYgKCEob3B0ICYgT1BUTUFTS19jbWQpIC8qIG5vIGNtZCAqLworCSB8fCAoKG9wdCAmIE9QVE1BU0tfY21kKSAmICgob3B0ICYgT1BUTUFTS19jbWQpLTEpKSAvKiBtb3JlIHRoYW4gb25lIGNtZCAqLworCSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisvKglwdXRzKCIoUmVhZGluZyBkYXRhYmFzZSAuLi4geHh4eHggZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZC4pIik7ICovCisJaW5kZXhfc3RhdHVzX2ZpbGUoIi92YXIvbGliL2Rwa2cvc3RhdHVzIik7CisKKwkvKiBpZiB0aGUgbGlzdCBhY3Rpb24gd2FzIGdpdmVuIHByaW50IHRoZSBpbnN0YWxsZWQgcGFja2FnZXMgYW5kIGV4aXQgKi8KKwlpZiAob3B0ICYgT1BUX2xpc3RfaW5zdGFsbGVkKSB7CisJCWxpc3RfcGFja2FnZXMoYXJndlswXSk7IC8qIHBhcmFtIGNhbiBiZSBOVUxMICovCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyogUmVhZCBhcmd1bWVudHMgYW5kIHN0b3JlIHJlbGV2YW50IGluZm8gaW4gc3RydWN0cyAqLworCXdoaWxlICgqYXJndikgeworCQkvKiBkZWJfY291bnQgPSBuYl9lbGVtIC0gMSBhbmQgd2UgbmVlZCBuYl9lbGVtICsgMSB0byBhbGxvY2F0ZSB0ZXJtaW5hbCBub2RlIFtOVUxMIHBvaW50ZXJdICovCisJCWRlYl9maWxlID0geHJlYWxsb2NfdmVjdG9yKGRlYl9maWxlLCAyLCBkZWJfY291bnQpOworCQlkZWJfZmlsZVtkZWJfY291bnRdID0geHphbGxvYyhzaXplb2YoZGViX2ZpbGVbMF1bMF0pKTsKKwkJaWYgKG9wdCAmIChPUFRfaW5zdGFsbCB8IE9QVF91bnBhY2spKSB7CisJCQkvKiAtaS8tdTogcmVxdWlyZSBmaWxlbmFtZSAqLworCQkJYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGU7CisJCQlsbGlzdF90ICpjb250cm9sX2xpc3QgPSBOVUxMOworCisJCQkvKiBFeHRyYWN0IHRoZSBjb250cm9sIGZpbGUgKi8KKwkJCWxsaXN0X2FkZF90bygmY29udHJvbF9saXN0LCAoY2hhciopIi4vY29udHJvbCIpOworCQkJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2FyY2hpdmVfZGViX2FyKGFyZ3ZbMF0pOworCQkJaW5pdF9hcmNoaXZlX2RlYl9jb250cm9sKGFyY2hpdmVfaGFuZGxlKTsKKwkJCWRlYl9maWxlW2RlYl9jb3VudF0tPmNvbnRyb2xfZmlsZSA9IGRlYl9leHRyYWN0X2NvbnRyb2xfZmlsZV90b19idWZmZXIoYXJjaGl2ZV9oYW5kbGUsIGNvbnRyb2xfbGlzdCk7CisJCQlpZiAoZGViX2ZpbGVbZGViX2NvdW50XS0+Y29udHJvbF9maWxlID09IE5VTEwpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXh0cmFjdCBjb250cm9sIGZpbGUiKTsKKwkJCX0KKwkJCWRlYl9maWxlW2RlYl9jb3VudF0tPmZpbGVuYW1lID0geHN0cmR1cChhcmd2WzBdKTsKKwkJCXBhY2thZ2VfbnVtID0gZmlsbF9wYWNrYWdlX3N0cnVjdChkZWJfZmlsZVtkZWJfY291bnRdLT5jb250cm9sX2ZpbGUpOworCisJCQlpZiAocGFja2FnZV9udW0gPT0gLTEpIHsKKwkJCQliYl9lcnJvcl9tc2coImludmFsaWQgY29udHJvbCBmaWxlIGluICVzIiwgYXJndlswXSk7CisJCQkJYXJndisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGViX2ZpbGVbZGViX2NvdW50XS0+cGFja2FnZSA9ICh1bnNpZ25lZCkgcGFja2FnZV9udW07CisKKwkJCS8qIEFkZCB0aGUgcGFja2FnZSB0byB0aGUgc3RhdHVzIGhhc2h0YWJsZSAqLworCQkJaWYgKG9wdCAmIChPUFRfdW5wYWNrIHwgT1BUX2luc3RhbGwpKSB7CisJCQkJLyogVHJ5IGFuZCBmaW5kIGEgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZSAqLworCQkJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtkZWJfZmlsZVtkZWJfY291bnRdLT5wYWNrYWdlXS0+bmFtZV0pOworCQkJCS8qIElmIG5vIHByZXZpb3VzIGVudHJ5IHdhcyBmb3VuZCBpbml0aWFsaXNlIGEgbmV3IGVudHJ5ICovCisJCQkJaWYgKHN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0gPT0gTlVMTAorCQkJCSB8fCBzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dLT5zdGF0dXMgPT0gMAorCQkJCSkgeworCQkJCQlzdGF0dXNfbm9kZSA9IHhtYWxsb2Moc2l6ZW9mKHN0YXR1c19ub2RlX3QpKTsKKwkJCQkJc3RhdHVzX25vZGUtPnBhY2thZ2UgPSBkZWJfZmlsZVtkZWJfY291bnRdLT5wYWNrYWdlOworCQkJCQkvKiByZWluc3RyZXEgaXNudCBjaGFuZ2VkIHRvICJvayIgdW50aWwgdGhlIHBhY2thZ2UgY29udHJvbCBpbmZvCisJCQkJCSAqIGlzIHdyaXR0ZW4gdG8gdGhlIHN0YXR1cyBmaWxlKi8KKwkJCQkJc3RhdHVzX25vZGUtPnN0YXR1cyA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbCByZWluc3RyZXEgbm90LWluc3RhbGxlZCIpOworCQkJCQlzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dID0gc3RhdHVzX25vZGU7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAiaW5zdGFsbCIsIDEpOworCQkJCQlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJyZWluc3RyZXEiLCAyKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAob3B0ICYgKE9QVF9jb25maWd1cmUgfCBPUFRfcHVyZ2UgfCBPUFRfcmVtb3ZlKSkgeworCQkJLyogLUMvLXAvLXI6IHJlcXVpcmUgcGFja2FnZSBuYW1lICovCisJCQlkZWJfZmlsZVtkZWJfY291bnRdLT5wYWNrYWdlID0gc2VhcmNoX3BhY2thZ2VfaGFzaHRhYmxlKAorCQkJCQlzZWFyY2hfbmFtZV9oYXNodGFibGUoYXJndlswXSksCisJCQkJCXNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiQU5ZIiksIFZFUl9BTlkpOworCQkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlW2RlYl9jb3VudF0tPnBhY2thZ2VdID09IE5VTEwpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicGFja2FnZSAlcyBpcyB1bmluc3RhbGxlZCBvciB1bmtub3duIiwgYXJndlswXSk7CisJCQl9CisJCQlwYWNrYWdlX251bSA9IGRlYl9maWxlW2RlYl9jb3VudF0tPnBhY2thZ2U7CisJCQlzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUobmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5uYW1lXSk7CisJCQlzdGF0ZV9zdGF0dXMgPSBnZXRfc3RhdHVzKHN0YXR1c19udW0sIDMpOworCisJCQkvKiBjaGVjayBwYWNrYWdlIHN0YXR1cyBpcyAiaW5zdGFsbGVkIiAqLworCQkJaWYgKG9wdCAmIE9QVF9yZW1vdmUpIHsKKwkJCQlpZiAoc3RyY21wKG5hbWVfaGFzaHRhYmxlW3N0YXRlX3N0YXR1c10sICJub3QtaW5zdGFsbGVkIikgPT0gMAorCQkJCSB8fCBzdHJjbXAobmFtZV9oYXNodGFibGVbc3RhdGVfc3RhdHVzXSwgImNvbmZpZy1maWxlcyIpID09IDAKKwkJCQkpIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGlzIGFscmVhZHkgcmVtb3ZlZCIsIG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+bmFtZV0pOworCQkJCX0KKwkJCQlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJkZWluc3RhbGwiLCAxKTsKKwkJCX0gZWxzZSBpZiAob3B0ICYgT1BUX3B1cmdlKSB7CisJCQkJLyogaWYgcGFja2FnZSBzdGF0dXMgaXMgImNvbmYtZmlsZXMiIHRoZW4gaXRzIG9rICovCisJCQkJaWYgKHN0cmNtcChuYW1lX2hhc2h0YWJsZVtzdGF0ZV9zdGF0dXNdLCAibm90LWluc3RhbGxlZCIpID09IDApIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGlzIGFscmVhZHkgcHVyZ2VkIiwgbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5uYW1lXSk7CisJCQkJfQorCQkJCXNldF9zdGF0dXMoc3RhdHVzX251bSwgInB1cmdlIiwgMSk7CisJCQl9CisJCX0KKwkJZGViX2NvdW50Kys7CisJCWFyZ3YrKzsKKwl9CisJaWYgKCFkZWJfY291bnQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBwYWNrYWdlIGZpbGVzIHNwZWNpZmllZCIpOworCWRlYl9maWxlW2RlYl9jb3VudF0gPSBOVUxMOworCisJLyogQ2hlY2sgdGhhdCB0aGUgZGViIGZpbGUgYXJndW1lbnRzIGFyZSBpbnN0YWxsYWJsZSAqLworCWlmICghKG9wdCAmIE9QVF9mb3JjZV9pZ25vcmVfZGVwZW5kcykpIHsKKwkJaWYgKCFjaGVja19kZXBzKGRlYl9maWxlLCAwIC8qLCBkZWJfY291bnQqLykpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkZXBlbmRlbmN5IGNoZWNrIGZhaWxlZCIpOworCQl9CisJfQorCisJLyogVE9ETzogaW5zdGFsbCBvciByZW1vdmUgcGFja2FnZXMgaW4gdGhlIGNvcnJlY3QgZGVwZW5kZW5jeSBvcmRlciAqLworCWZvciAoaSA9IDA7IGkgPCBkZWJfY291bnQ7IGkrKykgeworCQkvKiBSZW1vdmUgb3IgcHVyZ2UgcGFja2FnZXMgKi8KKwkJaWYgKG9wdCAmIE9QVF9yZW1vdmUpIHsKKwkJCXJlbW92ZV9wYWNrYWdlKGRlYl9maWxlW2ldLT5wYWNrYWdlLCAxKTsKKwkJfQorCQllbHNlIGlmIChvcHQgJiBPUFRfcHVyZ2UpIHsKKwkJCXB1cmdlX3BhY2thZ2UoZGViX2ZpbGVbaV0tPnBhY2thZ2UpOworCQl9CisJCWVsc2UgaWYgKG9wdCAmIE9QVF91bnBhY2spIHsKKwkJCXVucGFja19wYWNrYWdlKGRlYl9maWxlW2ldKTsKKwkJfQorCQllbHNlIGlmIChvcHQgJiBPUFRfaW5zdGFsbCkgeworCQkJdW5wYWNrX3BhY2thZ2UoZGViX2ZpbGVbaV0pOworCQkJLyogcGFja2FnZSBpcyBjb25maWd1cmVkIGluIHNlY29uZCBwYXNzIGJlbG93ICovCisJCX0KKwkJZWxzZSBpZiAob3B0ICYgT1BUX2NvbmZpZ3VyZSkgeworCQkJY29uZmlndXJlX3BhY2thZ2UoZGViX2ZpbGVbaV0pOworCQl9CisJfQorCS8qIGNvbmZpZ3VyZSBpbnN0YWxsZWQgcGFja2FnZXMgKi8KKwlpZiAob3B0ICYgT1BUX2luc3RhbGwpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRlYl9jb3VudDsgaSsrKQorCQkJY29uZmlndXJlX3BhY2thZ2UoZGViX2ZpbGVbaV0pOworCX0KKworCXdyaXRlX3N0YXR1c19maWxlKGRlYl9maWxlKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGViX2NvdW50OyBpKyspIHsKKwkJCWZyZWUoZGViX2ZpbGVbaV0tPmNvbnRyb2xfZmlsZSk7CisJCQlmcmVlKGRlYl9maWxlW2ldLT5maWxlbmFtZSk7CisJCQlmcmVlKGRlYl9maWxlW2ldKTsKKwkJfQorCisJCWZyZWUoZGViX2ZpbGUpOworCisJCWZvciAoaSA9IDA7IGkgPCBOQU1FX0hBU0hfUFJJTUU7IGkrKykgeworCQkJZnJlZShuYW1lX2hhc2h0YWJsZVtpXSk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgUEFDS0FHRV9IQVNIX1BSSU1FOyBpKyspIHsKKwkJCWZyZWVfcGFja2FnZShwYWNrYWdlX2hhc2h0YWJsZVtpXSk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgU1RBVFVTX0hBU0hfUFJJTUU7IGkrKykgeworCQkJZnJlZShzdGF0dXNfaGFzaHRhYmxlW2ldKTsKKwkJfQorCisJCWZyZWUoc3RhdHVzX2hhc2h0YWJsZSk7CisJCWZyZWUocGFja2FnZV9oYXNodGFibGUpOworCQlmcmVlKG5hbWVfaGFzaHRhYmxlKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvZHBrZ19kZWIuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2Rwa2dfZGViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4MTRkNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2Rwa2dfZGViLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRwa2ctZGViIHBhY2tzLCB1bnBhY2tzIGFuZCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBEZWJpYW4gYXJjaGl2ZXMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZHBrZ19kZWJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2VmeFhdIEZJTEUgW2FyZ3VtZW50IgorLy91c2FnZTojZGVmaW5lIGRwa2dfZGViX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUGVyZm9ybSBhY3Rpb25zIG9uIERlYmlhbiBwYWNrYWdlcyAoLmRlYnMpXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCUxpc3QgY29udGVudHMgb2YgZmlsZXN5c3RlbSB0cmVlIgorLy91c2FnZTogICAgICJcbgktZQlFeHRyYWN0IGNvbnRyb2wgZmlsZXMgdG8gW2FyZ3VtZW50XSBkaXJlY3RvcnkiCisvL3VzYWdlOiAgICAgIlxuCS1mCURpc3BsYXkgY29udHJvbCBmaWVsZCBuYW1lIHN0YXJ0aW5nIHdpdGggW2FyZ3VtZW50XSIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJRXh0cmFjdCBwYWNrYWdlcyBmaWxlc3lzdGVtIHRyZWUgdG8gZGlyZWN0b3J5IgorLy91c2FnZTogICAgICJcbgktWAlWZXJib3NlIGV4dHJhY3QiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRwa2dfZGViX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRwa2ctZGViIC1YIC4vYnVzeWJveF8wLjQ4LTFfaTM4Ni5kZWIgL3RtcFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKyNkZWZpbmUgRFBLR19ERUJfT1BUX0NPTlRFTlRTICAgICAgICAgMQorI2RlZmluZSBEUEtHX0RFQl9PUFRfQ09OVFJPTCAgICAgICAgICAyCisjZGVmaW5lIERQS0dfREVCX09QVF9GSUVMRCAgICAgICAgICAgIDQKKyNkZWZpbmUgRFBLR19ERUJfT1BUX0VYVFJBQ1QgICAgICAgICAgOAorI2RlZmluZSBEUEtHX0RFQl9PUFRfRVhUUkFDVF9WRVJCT1NFIDE2CisKK2ludCBkcGtnX2RlYl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZHBrZ19kZWJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqYXJfYXJjaGl2ZTsKKwlhcmNoaXZlX2hhbmRsZV90ICp0YXJfYXJjaGl2ZTsKKwlsbGlzdF90ICpjb250cm9sX3Rhcl9sbGlzdCA9IE5VTEw7CisJdW5zaWduZWQgb3B0OworCWNvbnN0IGNoYXIgKmV4dHJhY3RfZGlyOworCWludCBuZWVkX2FyZ3M7CisKKwkvKiBTZXR1cCB0aGUgdGFyIGFyY2hpdmUgaGFuZGxlICovCisJdGFyX2FyY2hpdmUgPSBpbml0X2hhbmRsZSgpOworCisJLyogU2V0dXAgYW4gYXIgYXJjaGl2ZSBoYW5kbGUgdGhhdCByZWZlcnMgdG8gdGhlIGd6aXAgc3ViIGFyY2hpdmUgKi8KKwlhcl9hcmNoaXZlID0gaW5pdF9oYW5kbGUoKTsKKwlhcl9hcmNoaXZlLT5kcGtnX19zdWJfYXJjaGl2ZSA9IHRhcl9hcmNoaXZlOworCWFyX2FyY2hpdmUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbjsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daCisJbGxpc3RfYWRkX3RvKCZhcl9hcmNoaXZlLT5hY2NlcHQsIChjaGFyKikiZGF0YS50YXIuZ3oiKTsKKwlsbGlzdF9hZGRfdG8oJmNvbnRyb2xfdGFyX2xsaXN0LCAoY2hhciopImNvbnRyb2wudGFyLmd6Iik7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwlsbGlzdF9hZGRfdG8oJmFyX2FyY2hpdmUtPmFjY2VwdCwgKGNoYXIqKSJkYXRhLnRhci5iejIiKTsKKwlsbGlzdF9hZGRfdG8oJmNvbnRyb2xfdGFyX2xsaXN0LCAoY2hhciopImNvbnRyb2wudGFyLmJ6MiIpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQQorCWxsaXN0X2FkZF90bygmYXJfYXJjaGl2ZS0+YWNjZXB0LCAoY2hhciopImRhdGEudGFyLmx6bWEiKTsKKwlsbGlzdF9hZGRfdG8oJmNvbnRyb2xfdGFyX2xsaXN0LCAoY2hhciopImNvbnRyb2wudGFyLmx6bWEiKTsKKyNlbmRpZgorCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiYy0tZWZYeDplLS1jZlh4OmYtLWNlWHg6WC0tY2VmeDp4LS1jZWZYIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiY2VmWHgiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlhcmdjIC09IG9wdGluZDsKKworCWlmIChvcHQgJiBEUEtHX0RFQl9PUFRfQ09OVEVOVFMpIHsKKwkJdGFyX2FyY2hpdmUtPmFjdGlvbl9oZWFkZXIgPSBoZWFkZXJfdmVyYm9zZV9saXN0OworCX0KKwlleHRyYWN0X2RpciA9IE5VTEw7CisJbmVlZF9hcmdzID0gMTsKKwlpZiAob3B0ICYgRFBLR19ERUJfT1BUX0NPTlRST0wpIHsKKwkJYXJfYXJjaGl2ZS0+YWNjZXB0ID0gY29udHJvbF90YXJfbGxpc3Q7CisJCXRhcl9hcmNoaXZlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGw7CisJCWlmICgxID09IGFyZ2MpIHsKKwkJCWV4dHJhY3RfZGlyID0gIi4vREVCSUFOIjsKKwkJfSBlbHNlIHsKKwkJCW5lZWRfYXJncysrOworCQl9CisJfQorCWlmIChvcHQgJiBEUEtHX0RFQl9PUFRfRklFTEQpIHsKKwkJLyogUHJpbnQgdGhlIGVudGlyZSBjb250cm9sIGZpbGUKKwkJICogaXQgc2hvdWxkIGFjY2VwdCBhIHNlY29uZCBhcmd1bWVudCB3aGljaCBzcGVjaWZpZXMgYQorCQkgKiBzcGVjaWZpYyBmaWVsZCB0byBwcmludCAqLworCQlhcl9hcmNoaXZlLT5hY2NlcHQgPSBjb250cm9sX3Rhcl9sbGlzdDsKKwkJbGxpc3RfYWRkX3RvKCYodGFyX2FyY2hpdmUtPmFjY2VwdCksIChjaGFyKikiLi9jb250cm9sIik7CisJCXRhcl9hcmNoaXZlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3Q7CisJCXRhcl9hcmNoaXZlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF90b19zdGRvdXQ7CisJfQorCWlmIChvcHQgJiBEUEtHX0RFQl9PUFRfRVhUUkFDVCkgeworCQl0YXJfYXJjaGl2ZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl9saXN0OworCX0KKwlpZiAob3B0ICYgKERQS0dfREVCX09QVF9FWFRSQUNUX1ZFUkJPU0UgfCBEUEtHX0RFQl9PUFRfRVhUUkFDVCkpIHsKKwkJdGFyX2FyY2hpdmUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X2FsbDsKKwkJbmVlZF9hcmdzID0gMjsKKwl9CisKKwlpZiAobmVlZF9hcmdzICE9IGFyZ2MpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXRhcl9hcmNoaXZlLT5zcmNfZmQgPSBhcl9hcmNoaXZlLT5zcmNfZmQgPSB4b3Blbihhcmd2WzBdLCBPX1JET05MWSk7CisKKwkvKiBXb3JrIG91dCB3aGVyZSB0byBleHRyYWN0IHRoZSBmaWxlcyAqLworCS8qIDJuZCBhcmd1bWVudCBpcyBhIGRpciBuYW1lICovCisJaWYgKGFyZ3ZbMV0pIHsKKwkJZXh0cmFjdF9kaXIgPSBhcmd2WzFdOworCX0KKwlpZiAoZXh0cmFjdF9kaXIpIHsKKwkJbWtkaXIoZXh0cmFjdF9kaXIsIDA3NzcpOyAvKiBiYl9tYWtlX2RpcmVjdG9yeShleHRyYWN0X2RpciwgMDc3NywgMCkgKi8KKwkJeGNoZGlyKGV4dHJhY3RfZGlyKTsKKwl9CisKKwkvKiBEbyBpdCAqLworCXVucGFja19hcl9hcmNoaXZlKGFyX2FyY2hpdmUpOworCisJLyogQ2xlYW51cCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoYXJfYXJjaGl2ZS0+c3JjX2ZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9nemlwLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9nemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzZWI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2d6aXAuYwpAQCAtMCwwICsxLDIxMjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEd6aXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBCYXNlZCBvbiBHTlUgZ3ppcCBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5LgorICoKKyAqIE9yaWdpbmFsbHkgYWRqdXN0ZWQgZm9yIGJ1c3lib3ggYnkgQ2hhcmxlcyBQLiBXcmlnaHQgPGNwd0B1bml4LmFzYi5jb20+CisgKiAidGhpcyBpcyBhIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiBnemlwIEkgcHV0IGludG8gYnVzeWJveCwgaXQgZG9lcworICogb25seSBzdGFuZGFyZCBpbiB0byBzdGFuZGFyZCBvdXQgd2l0aCAtOSBjb21wcmVzc2lvbi4gIEl0IGFsc28gcmVxdWlyZXMKKyAqIHRoZSB6Y2F0IG1vZHVsZSBmb3Igc29tZSBpbXBvcnRhbnQgZnVuY3Rpb25zLiIKKyAqCisgKiBBZGp1c3RlZCBmdXJ0aGVyIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gdG8gc3VwcG9ydAorICogZmlsZXMgYXMgd2VsbCBhcyBzdGRpbi9zdGRvdXQsIGFuZCB0byBnZW5lcmFsbHkgYmVoYXZlIGl0c2VsZiB3cnQKKyAqIGNvbW1hbmQgbGluZSBoYW5kbGluZy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIGJpZyBvYmplY3RzIGluIGJzczoKKyAqIDAwMDAwMDIwIGIgYmxfY291bnQKKyAqIDAwMDAwMDc0IGIgYmFzZV9sZW5ndGgKKyAqIDAwMDAwMDc4IGIgYmFzZV9kaXN0CisgKiAwMDAwMDA3OCBiIHN0YXRpY19kdHJlZQorICogMDAwMDAwOWMgYiBibF90cmVlCisgKiAwMDAwMDBmNCBiIGR5bl9kdHJlZQorICogMDAwMDAxMDAgYiBsZW5ndGhfY29kZQorICogMDAwMDAyMDAgYiBkaXN0X2NvZGUKKyAqIDAwMDAwMjNkIGIgZGVwdGgKKyAqIDAwMDAwNDAwIGIgZmxhZ19idWYKKyAqIDAwMDAwNDdhIGIgaGVhcAorICogMDAwMDA0ODAgYiBzdGF0aWNfbHRyZWUKKyAqIDAwMDAwOGY0IGIgZHluX2x0cmVlCisgKi8KKworLyogVE9ETzogZnVsbCBzdXBwb3J0IGZvciAtdiBmb3IgREVTS1RPUAorICogIi91c3IvYmluL2d6aXAgLXYgYSBib2d1cyBhYSIgc2hvdWxkIHNheToKK2E6ICAgICAgIDg1LjElIC0tIHJlcGxhY2VkIHdpdGggYS5negorZ3ppcDogYm9ndXM6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2FhOiAgICAgIDg1LjElIC0tIHJlcGxhY2VkIHdpdGggYWEuZ3oKKyovCisKKy8vdXNhZ2U6I2RlZmluZSBnemlwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmZF0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGd6aXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21wcmVzcyBGSUxFcyAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kCURlY29tcHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGd6aXBfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbHMgLWxhIC90bXAvYnVzeWJveCpcbiIKKy8vdXNhZ2U6ICAgICAgICItcnctcnctci0tICAgIDEgYW5kZXJzZW4gYW5kZXJzZW4gIDE3NjEyODAgQXByIDE0IDE3OjQ3IC90bXAvYnVzeWJveC50YXJcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGd6aXAgL3RtcC9idXN5Ym94LnRhclxuIgorLy91c2FnZTogICAgICAgIiQgbHMgLWxhIC90bXAvYnVzeWJveCpcbiIKKy8vdXNhZ2U6ICAgICAgICItcnctcnctci0tICAgIDEgYW5kZXJzZW4gYW5kZXJzZW4gICA1NTQwNTggQXByIDE0IDE3OjQ5IC90bXAvYnVzeWJveC50YXIuZ3pcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLyNkZWZpbmUgREVCVUcgMQorLyogRGlhZ25vc3RpYyBmdW5jdGlvbnMgKi8KKyNpZmRlZiBERUJVRworIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykgeyBpZiAoIShjb25kKSkgYmJfZXJyb3JfbXNnKG1zZyk7IH0KKyMgIGRlZmluZSBUcmFjZSh4KSBmcHJpbnRmIHgKKyMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh2ZXJib3NlKSBmcHJpbnRmIHg7IH0KKyMgIGRlZmluZSBUcmFjZXZ2KHgpIHtpZiAodmVyYm9zZSA+IDEpIGZwcmludGYgeDsgfQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpIHtpZiAodmVyYm9zZSAmJiAoYykpIGZwcmludGYgeDsgfQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHZlcmJvc2UgPiAxICYmIChjKSkgZnByaW50ZiB4OyB9CisjZWxzZQorIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKKyMgIGRlZmluZSBUcmFjZSh4KQorIyAgZGVmaW5lIFRyYWNldih4KQorIyAgZGVmaW5lIFRyYWNldnYoeCkKKyMgIGRlZmluZSBUcmFjZWMoYyx4KQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNkZWZpbmUgU01BTExfTUVNCisKKyNpZm5kZWYgSU5CVUZTSVoKKyMgIGlmZGVmIFNNQUxMX01FTQorIyAgICBkZWZpbmUgSU5CVUZTSVogIDB4MjAwMAkvKiBpbnB1dCBidWZmZXIgc2l6ZSAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgSU5CVUZTSVogIDB4ODAwMAkvKiBpbnB1dCBidWZmZXIgc2l6ZSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9VVEJVRlNJWgorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBPVVRCVUZTSVogICA4MTkyCS8qIG91dHB1dCBidWZmZXIgc2l6ZSAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgT1VUQlVGU0laICAxNjM4NAkvKiBvdXRwdXQgYnVmZmVyIHNpemUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBESVNUX0JVRlNJWkUKKyMgIGlmZGVmIFNNQUxMX01FTQorIyAgICBkZWZpbmUgRElTVF9CVUZTSVpFIDB4MjAwMAkvKiBidWZmZXIgZm9yIGRpc3RhbmNlcywgc2VlIHRyZWVzLmMgKi8KKyMgIGVsc2UKKyMgICAgZGVmaW5lIERJU1RfQlVGU0laRSAweDgwMDAJLyogYnVmZmVyIGZvciBkaXN0YW5jZXMsIHNlZSB0cmVlcy5jICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIGd6aXAgZmxhZyBieXRlICovCisjZGVmaW5lIEFTQ0lJX0ZMQUcgICAweDAxCS8qIGJpdCAwIHNldDogZmlsZSBwcm9iYWJseSBhc2NpaSB0ZXh0ICovCisjZGVmaW5lIENPTlRJTlVBVElPTiAweDAyCS8qIGJpdCAxIHNldDogY29udGludWF0aW9uIG9mIG11bHRpLXBhcnQgZ3ppcCBmaWxlICovCisjZGVmaW5lIEVYVFJBX0ZJRUxEICAweDA0CS8qIGJpdCAyIHNldDogZXh0cmEgZmllbGQgcHJlc2VudCAqLworI2RlZmluZSBPUklHX05BTUUgICAgMHgwOAkvKiBiaXQgMyBzZXQ6IG9yaWdpbmFsIGZpbGUgbmFtZSBwcmVzZW50ICovCisjZGVmaW5lIENPTU1FTlQgICAgICAweDEwCS8qIGJpdCA0IHNldDogZmlsZSBjb21tZW50IHByZXNlbnQgKi8KKyNkZWZpbmUgUkVTRVJWRUQgICAgIDB4QzAJLyogYml0IDYsNzogICByZXNlcnZlZCAqLworCisvKiBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBVTktOT1dOIDB4ZmZmZgorI2RlZmluZSBCSU5BUlkgIDAKKyNkZWZpbmUgQVNDSUkgICAxCisKKyNpZm5kZWYgV1NJWkUKKyMgIGRlZmluZSBXU0laRSAweDgwMDAgIC8qIHdpbmRvdyBzaXplLS1tdXN0IGJlIGEgcG93ZXIgb2YgdHdvLCBhbmQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgIC8qICBhdCBsZWFzdCAzMksgZm9yIHppcCdzIGRlZmxhdGUgbWV0aG9kICovCisKKyNkZWZpbmUgTUlOX01BVENIICAzCisjZGVmaW5lIE1BWF9NQVRDSCAgMjU4CisvKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovCisKKyNkZWZpbmUgTUlOX0xPT0tBSEVBRCAoTUFYX01BVENIK01JTl9NQVRDSCsxKQorLyogTWluaW11bSBhbW91bnQgb2YgbG9va2FoZWFkLCBleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4KKyAqIFNlZSBkZWZsYXRlLmMgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBNSU5fTUFUQ0grMS4KKyAqLworCisjZGVmaW5lIE1BWF9ESVNUICAoV1NJWkUtTUlOX0xPT0tBSEVBRCkKKy8qIEluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBwYXJ0aWN1bGFybHkgb24gMTYgYml0IG1hY2hpbmVzLCBtYXRjaAorICogZGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIE1BWF9ESVNUIGluc3RlYWQgb2YgV1NJWkUuCisgKi8KKworI2lmbmRlZiBNQVhfUEFUSF9MRU4KKyMgIGRlZmluZSBNQVhfUEFUSF9MRU4gICAxMDI0CS8qIG1heCBwYXRobmFtZSBsZW5ndGggKi8KKyNlbmRpZgorCisjZGVmaW5lIHNlZWthYmxlKCkgICAgMAkvKiBmb3JjZSBzZXF1ZW50aWFsIG91dHB1dCAqLworI2RlZmluZSB0cmFuc2xhdGVfZW9sIDAJLyogbm8gb3B0aW9uIC1hIHlldCAqLworCisjaWZuZGVmIEJJVFMKKyMgIGRlZmluZSBCSVRTIDE2CisjZW5kaWYKKyNkZWZpbmUgSU5JVF9CSVRTIDkJCS8qIEluaXRpYWwgbnVtYmVyIG9mIGJpdHMgcGVyIGNvZGUgKi8KKworI2RlZmluZSBCSVRfTUFTSyAgICAweDFmCS8qIE1hc2sgZm9yICdudW1iZXIgb2YgY29tcHJlc3Npb24gYml0cycgKi8KKy8qIE1hc2sgMHgyMCBpcyByZXNlcnZlZCB0byBtZWFuIGEgZm91cnRoIGhlYWRlciBieXRlLCBhbmQgMHg0MCBpcyBmcmVlLgorICogSXQncyBhIHBpdHkgdGhhdCBvbGQgdW5jb21wcmVzcyBkb2VzIG5vdCBjaGVjayBiaXQgMHgyMC4gVGhhdCBtYWtlcworICogZXh0ZW5zaW9uIG9mIHRoZSBmb3JtYXQgYWN0dWFsbHkgdW5kZXNpcmFibGUgYmVjYXVzZSBvbGQgY29tcHJlc3MKKyAqIHdvdWxkIGp1c3QgY3Jhc2ggb24gdGhlIG5ldyBmb3JtYXQgaW5zdGVhZCBvZiBnaXZpbmcgYSBtZWFuaW5nZnVsCisgKiBlcnJvciBtZXNzYWdlLiBJdCBkb2VzIGNoZWNrIHRoZSBudW1iZXIgb2YgYml0cywgYnV0IGl0J3MgbW9yZQorICogaGVscGZ1bCB0byBzYXkgInVuc3VwcG9ydGVkIGZvcm1hdCwgZ2V0IGEgbmV3IHZlcnNpb24iIHRoYW4KKyAqICJjYW4gb25seSBoYW5kbGUgMTYgYml0cyIuCisgKi8KKworI2lmZGVmIE1BWF9FWFRfQ0hBUlMKKyMgIGRlZmluZSBNQVhfU1VGRklYICBNQVhfRVhUX0NIQVJTCisjZWxzZQorIyAgZGVmaW5lIE1BWF9TVUZGSVggIDMwCisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXBpbGUgd2l0aCBNRURJVU1fTUVNIHRvIHJlZHVjZSB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBvcgorICogd2l0aCBTTUFMTF9NRU0gdG8gdXNlIGFzIGxpdHRsZSBtZW1vcnkgYXMgcG9zc2libGUuIFVzZSBCSUdfTUVNIGlmIHRoZQorICogZW50aXJlIGlucHV0IGZpbGUgY2FuIGJlIGhlbGQgaW4gbWVtb3J5IChub3QgcG9zc2libGUgb24gMTYgYml0IHN5c3RlbXMpLgorICogV2FybmluZzogZGVmaW5pbmcgdGhlc2Ugc3ltYm9scyBhZmZlY3RzIEhBU0hfQklUUyAoc2VlIGJlbG93KSBhbmQgdGh1cworICogYWZmZWN0cyB0aGUgY29tcHJlc3Npb24gcmF0aW8uIFRoZSBjb21wcmVzc2VkIG91dHB1dAorICogaXMgc3RpbGwgY29ycmVjdCwgYW5kIG1pZ2h0IGV2ZW4gYmUgc21hbGxlciBpbiBzb21lIGNhc2VzLgorICovCisKKyNpZmRlZiBTTUFMTF9NRU0KKyMgICBkZWZpbmUgSEFTSF9CSVRTICAxMwkvKiBOdW1iZXIgb2YgYml0cyB1c2VkIHRvIGhhc2ggc3RyaW5ncyAqLworI2VuZGlmCisjaWZkZWYgTUVESVVNX01FTQorIyAgIGRlZmluZSBIQVNIX0JJVFMgIDE0CisjZW5kaWYKKyNpZm5kZWYgSEFTSF9CSVRTCisjICAgZGVmaW5lIEhBU0hfQklUUyAgMTUKKyAgIC8qIEZvciBwb3J0YWJpbGl0eSB0byAxNiBiaXQgbWFjaGluZXMsIGRvIG5vdCB1c2UgdmFsdWVzIGFib3ZlIDE1LiAqLworI2VuZGlmCisKKyNkZWZpbmUgSEFTSF9TSVpFICh1bnNpZ25lZCkoMTw8SEFTSF9CSVRTKQorI2RlZmluZSBIQVNIX01BU0sgKEhBU0hfU0laRS0xKQorI2RlZmluZSBXTUFTSyAgICAgKFdTSVpFLTEpCisvKiBIQVNIX1NJWkUgYW5kIFdTSVpFIG11c3QgYmUgcG93ZXJzIG9mIHR3byAqLworI2lmbmRlZiBUT09fRkFSCisjICBkZWZpbmUgVE9PX0ZBUiA0MDk2CisjZW5kaWYKKy8qIE1hdGNoZXMgb2YgbGVuZ3RoIDMgYXJlIGRpc2NhcmRlZCBpZiB0aGVpciBkaXN0YW5jZSBleGNlZWRzIFRPT19GQVIgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoZXNlIHR5cGVzIGFyZSBub3QgcmVhbGx5ICdjaGFyJywgJ3Nob3J0JyBhbmQgJ2xvbmcnCisgKi8KK3R5cGVkZWYgdWludDhfdCB1Y2g7Cit0eXBlZGVmIHVpbnQxNl90IHVzaDsKK3R5cGVkZWYgdWludDMyX3QgdWxnOwordHlwZWRlZiBpbnQzMl90IGxuZzsKKwordHlwZWRlZiB1c2ggUG9zOwordHlwZWRlZiB1bnNpZ25lZCBJUG9zOworLyogQSBQb3MgaXMgYW4gaW5kZXggaW4gdGhlIGNoYXJhY3RlciB3aW5kb3cuIFdlIHVzZSBzaG9ydCBpbnN0ZWFkIG9mIGludCB0bworICogc2F2ZSBzcGFjZSBpbiB0aGUgdmFyaW91cyB0YWJsZXMuIElQb3MgaXMgdXNlZCBvbmx5IGZvciBwYXJhbWV0ZXIgcGFzc2luZy4KKyAqLworCitlbnVtIHsKKwlXSU5ET1dfU0laRSA9IDIgKiBXU0laRSwKKy8qIHdpbmRvdyBzaXplLCAyKldTSVpFIGV4Y2VwdCBmb3IgTU1BUCBvciBCSUdfTUVNLCB3aGVyZSBpdCBpcyB0aGUKKyAqIGlucHV0IGZpbGUgbGVuZ3RoIHBsdXMgTUlOX0xPT0tBSEVBRC4KKyAqLworCisJbWF4X2NoYWluX2xlbmd0aCA9IDQwOTYsCisvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpcyBsZW5ndGguCisgKiBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlIHNwZWVkLgorICovCisKKwltYXhfbGF6eV9tYXRjaCA9IDI1OCwKKy8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHkKKyAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uCisgKiBsZXZlbHMgPj0gNC4KKyAqLworCisJbWF4X2luc2VydF9sZW5ndGggPSBtYXhfbGF6eV9tYXRjaCwKKy8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGgKKyAqIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLgorICovCisKKwlnb29kX21hdGNoID0gMzIsCisvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi8KKworLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uCisgKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG8KKyAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZQorICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLgorICovCisKKwluaWNlX21hdGNoID0gMjU4LAkvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovCisvKiBOb3RlOiB0aGUgZGVmbGF0ZSgpIGNvZGUgcmVxdWlyZXMgbWF4X2xhenkgPj0gTUlOX01BVENIIGFuZCBtYXhfY2hhaW4gPj0gNAorICogRm9yIGRlZmxhdGVfZmFzdCgpIChsZXZlbHMgPD0gMykgZ29vZCBpcyBpZ25vcmVkIGFuZCBsYXp5IGhhcyBhIGRpZmZlcmVudAorICogbWVhbmluZy4KKyAqLworfTsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisKKwlsbmcgYmxvY2tfc3RhcnQ7CisKKy8qIHdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0cworICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy4KKyAqLworCXVuc2lnbmVkIGluc19oOwkvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqLworCisjZGVmaW5lIEhfU0hJRlQgICgoSEFTSF9CSVRTK01JTl9NQVRDSC0xKSAvIE1JTl9NQVRDSCkKKy8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIGFuZCBkZWxfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaAorICogaW5wdXQgc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0CisgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczoKKyAqIEhfU0hJRlQgKiBNSU5fTUFUQ0ggPj0gSEFTSF9CSVRTCisgKi8KKworCXVuc2lnbmVkIHByZXZfbGVuZ3RoOworCisvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXMKKyAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLgorICovCisKKwl1bnNpZ25lZCBzdHJzdGFydDsJLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqLworCXVuc2lnbmVkIG1hdGNoX3N0YXJ0OwkvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi8KKwl1bnNpZ25lZCBsb29rYWhlYWQ7CS8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNkZWZpbmUgREVDTEFSRSh0eXBlLCBhcnJheSwgc2l6ZSkgXAorCXR5cGUgKiBhcnJheQorI2RlZmluZSBBTExPQyh0eXBlLCBhcnJheSwgc2l6ZSkgXAorCWFycmF5ID0geHphbGxvYygoc2l6ZV90KSgoKHNpemUpKzFMKS8yKSAqIDIqc2l6ZW9mKHR5cGUpKQorI2RlZmluZSBGUkVFKGFycmF5KSBcCisJZG8geyBmcmVlKGFycmF5KTsgYXJyYXkgPSBOVUxMOyB9IHdoaWxlICgwKQorCisJLyogZ2xvYmFsIGJ1ZmZlcnMgKi8KKworCS8qIGJ1ZmZlciBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqLworCS8qIERFQ0xBUkUodWNoLCBsX2J1ZiwgTElUX0JVRlNJWkUpOyAqLworCURFQ0xBUkUodWNoLCBsX2J1ZiwgSU5CVUZTSVopOworCisJREVDTEFSRSh1c2gsIGRfYnVmLCBESVNUX0JVRlNJWkUpOworCURFQ0xBUkUodWNoLCBvdXRidWYsIE9VVEJVRlNJWik7CisKKy8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LAorICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3QgV1NJWkUKKyAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2YKKyAqIFdTSVpFLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5cworICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuIEFsc28sIGl0IGxpbWl0cworICogdGhlIHdpbmRvdyBzaXplIHRvIDY0Sywgd2hpY2ggaXMgcXVpdGUgdXNlZnVsIG9uIE1TRE9TLgorICogVG8gZG86IGxpbWl0IHRoZSB3aW5kb3cgc2l6ZSB0byBXU0laRStCU1ogaWYgU01BTExfTUVNICh0aGUgY29kZSB3b3VsZAorICogYmUgbGVzcyBlZmZpY2llbnQpLgorICovCisJREVDTEFSRSh1Y2gsIHdpbmRvdywgMkwgKiBXU0laRSk7CisKKy8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzCisgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLgorICogQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuCisgKi8KKwkvKiBERUNMQVJFKFBvcywgcHJldiwgV1NJWkUpOyAqLworCURFQ0xBUkUodXNoLCBwcmV2LCAxTCA8PCBCSVRTKTsKKworLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIDAuICovCisJLyogREVDTEFSRShQb3MsIGhlYWQsIDE8PEhBU0hfQklUUyk7ICovCisjZGVmaW5lIGhlYWQgKEcxLnByZXYgKyBXU0laRSkgLyogaGFzaCBoZWFkIChzZWUgZGVmbGF0ZS5jKSAqLworCisvKiBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgKi8KKwl1bGcgaXNpemU7CQkvKiBvbmx5IDMyIGJpdHMgc3RvcmVkIGluIC5neiBmaWxlICovCisKKy8qIGJib3ggYWx3YXlzIHVzZSBzdGRpbi9zdGRvdXQgKi8KKyNkZWZpbmUgaWZkIFNURElOX0ZJTEVOTwkvKiBpbnB1dCBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgb2ZkIFNURE9VVF9GSUxFTk8JLyogb3V0cHV0IGZpbGUgZGVzY3JpcHRvciAqLworCisjaWZkZWYgREVCVUcKKwl1bnNpZ25lZCBpbnNpemU7CS8qIHZhbGlkIGJ5dGVzIGluIGxfYnVmICovCisjZW5kaWYKKwl1bnNpZ25lZCBvdXRjbnQ7CS8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKworCXNtYWxsaW50IGVvZmlsZTsJLyogZmxhZyBzZXQgYXQgZW5kIG9mIGlucHV0IGZpbGUgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCBkYXRhIHVzZWQgYnkgdGhlICJiaXQgc3RyaW5nIiByb3V0aW5lcy4KKyAqLworCisJdW5zaWduZWQgc2hvcnQgYmlfYnVmOworCisvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdCBzaWduaWZpY2FudAorICogYml0cykuCisgKi8KKworI3VuZGVmIEJVRl9TSVpFCisjZGVmaW5lIEJVRl9TSVpFICg4ICogc2l6ZW9mKEcxLmJpX2J1ZikpCisvKiBOdW1iZXIgb2YgYml0cyB1c2VkIHdpdGhpbiBiaV9idWYuIChiaV9idWYgbWlnaHQgYmUgaW1wbGVtZW50ZWQgb24KKyAqIG1vcmUgdGhhbiAxNiBiaXRzIG9uIHNvbWUgc3lzdGVtcy4pCisgKi8KKworCWludCBiaV92YWxpZDsKKworLyogQ3VycmVudCBpbnB1dCBmdW5jdGlvbi4gU2V0IHRvIG1lbV9yZWFkIGZvciBpbi1tZW1vcnkgY29tcHJlc3Npb24gKi8KKworI2lmZGVmIERFQlVHCisJdWxnIGJpdHNfc2VudDsJCQkvKiBiaXQgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKi8KKyNlbmRpZgorCisJLyp1aW50MzJfdCAqY3JjXzMyX3RhYjsqLworCXVpbnQzMl90IGNyYzsJLyogc2hpZnQgcmVnaXN0ZXIgY29udGVudHMgKi8KK307CisKKyNkZWZpbmUgRzEgKCoocHRyX3RvX2dsb2JhbHMgLSAxKSkKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFdyaXRlIHRoZSBvdXRwdXQgYnVmZmVyIG91dGJ1ZlswLi5vdXRjbnQtMV0gYW5kIHVwZGF0ZSBieXRlc19vdXQuCisgKiAodXNlZCBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSBvbmx5KQorICovCitzdGF0aWMgdm9pZCBmbHVzaF9vdXRidWYodm9pZCkKK3sKKwlpZiAoRzEub3V0Y250ID09IDApCisJCXJldHVybjsKKworCXh3cml0ZShvZmQsIChjaGFyICopIEcxLm91dGJ1ZiwgRzEub3V0Y250KTsKKwlHMS5vdXRjbnQgPSAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKiBwdXRfOGJpdCBpcyB1c2VkIGZvciB0aGUgY29tcHJlc3NlZCBvdXRwdXQgKi8KKyNkZWZpbmUgcHV0XzhiaXQoYykgXAorZG8geyBcCisJRzEub3V0YnVmW0cxLm91dGNudCsrXSA9IChjKTsgXAorCWlmIChHMS5vdXRjbnQgPT0gT1VUQlVGU0laKSBmbHVzaF9vdXRidWYoKTsgXAorfSB3aGlsZSAoMCkKKworLyogT3V0cHV0IGEgMTYgYml0IHZhbHVlLCBsc2IgZmlyc3QgKi8KK3N0YXRpYyB2b2lkIHB1dF8xNmJpdCh1c2ggdykKK3sKKwlpZiAoRzEub3V0Y250IDwgT1VUQlVGU0laIC0gMikgeworCQlHMS5vdXRidWZbRzEub3V0Y250KytdID0gdzsKKwkJRzEub3V0YnVmW0cxLm91dGNudCsrXSA9IHcgPj4gODsKKwl9IGVsc2UgeworCQlwdXRfOGJpdCh3KTsKKwkJcHV0XzhiaXQodyA+PiA4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF8zMmJpdCh1bGcgbikKK3sKKwlwdXRfMTZiaXQobik7CisJcHV0XzE2Yml0KG4gPj4gMTYpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJ1biBhIHNldCBvZiBieXRlcyB0aHJvdWdoIHRoZSBjcmMgc2hpZnQgcmVnaXN0ZXIuICBJZiBzIGlzIGEgTlVMTAorICogcG9pbnRlciwgdGhlbiBpbml0aWFsaXplIHRoZSBjcmMgc2hpZnQgcmVnaXN0ZXIgY29udGVudHMgaW5zdGVhZC4KKyAqIFJldHVybiB0aGUgY3VycmVudCBjcmMgaW4gZWl0aGVyIGNhc2UuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGNyYyh1Y2ggKiBzLCB1bnNpZ25lZCBuKQoreworCUcxLmNyYyA9IGNyYzMyX2Jsb2NrX2VuZGlhbjAoRzEuY3JjLCBzLCBuLCBnbG9iYWxfY3JjMzJfdGFibGUgLypHMS5jcmNfMzJfdGFiKi8pOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBmaWxlLCBwZXJmb3JtIGVuZC1vZi1saW5lCisgKiB0cmFuc2xhdGlvbiwgYW5kIHVwZGF0ZSB0aGUgY3JjIGFuZCBpbnB1dCBmaWxlIHNpemUuCisgKiBJTiBhc3NlcnRpb246IHNpemUgPj0gMiAoZm9yIGVuZC1vZi1saW5lIHRyYW5zbGF0aW9uKQorICovCitzdGF0aWMgdW5zaWduZWQgZmlsZV9yZWFkKHZvaWQgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsZW47CisKKwlBc3NlcnQoRzEuaW5zaXplID09IDAsICJsX2J1ZiBub3QgZW1wdHkiKTsKKworCWxlbiA9IHNhZmVfcmVhZChpZmQsIGJ1Ziwgc2l6ZSk7CisJaWYgKGxlbiA9PSAodW5zaWduZWQpKC0xKSB8fCBsZW4gPT0gMCkKKwkJcmV0dXJuIGxlbjsKKworCXVwZGNyYyhidWYsIGxlbik7CisJRzEuaXNpemUgKz0gbGVuOworCXJldHVybiBsZW47Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy4KKyAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLgorICovCitzdGF0aWMgdm9pZCBzZW5kX2JpdHMoaW50IHZhbHVlLCBpbnQgbGVuZ3RoKQoreworI2lmZGVmIERFQlVHCisJVHJhY2V2KChzdGRlcnIsICIgbCAlMmQgdiAlNHggIiwgbGVuZ3RoLCB2YWx1ZSkpOworCUFzc2VydChsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAxNSwgImludmFsaWQgbGVuZ3RoIik7CisJRzEuYml0c19zZW50ICs9IGxlbmd0aDsKKyNlbmRpZgorCS8qIElmIG5vdCBlbm91Z2ggcm9vbSBpbiBiaV9idWYsIHVzZSAodmFsaWQpIGJpdHMgZnJvbSBiaV9idWYgYW5kCisJICogKDE2IC0gYmlfdmFsaWQpIGJpdHMgZnJvbSB2YWx1ZSwgbGVhdmluZyAod2lkdGggLSAoMTYtYmlfdmFsaWQpKQorCSAqIHVudXNlZCBiaXRzIGluIHZhbHVlLgorCSAqLworCWlmIChHMS5iaV92YWxpZCA+IChpbnQpIEJVRl9TSVpFIC0gbGVuZ3RoKSB7CisJCUcxLmJpX2J1ZiB8PSAodmFsdWUgPDwgRzEuYmlfdmFsaWQpOworCQlwdXRfMTZiaXQoRzEuYmlfYnVmKTsKKwkJRzEuYmlfYnVmID0gKHVzaCkgdmFsdWUgPj4gKEJVRl9TSVpFIC0gRzEuYmlfdmFsaWQpOworCQlHMS5iaV92YWxpZCArPSBsZW5ndGggLSBCVUZfU0laRTsKKwl9IGVsc2UgeworCQlHMS5iaV9idWYgfD0gdmFsdWUgPDwgRzEuYmlfdmFsaWQ7CisJCUcxLmJpX3ZhbGlkICs9IGxlbmd0aDsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlcgorICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKQorICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNQorICovCitzdGF0aWMgdW5zaWduZWQgYmlfcmV2ZXJzZSh1bnNpZ25lZCBjb2RlLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHJlcyA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlyZXMgfD0gY29kZSAmIDE7CisJCWlmICgtLWxlbiA8PSAwKSByZXR1cm4gcmVzOworCQljb2RlID4+PSAxOworCQlyZXMgPDw9IDE7CisJfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdGUgb3V0IGFueSByZW1haW5pbmcgYml0cyBpbiBhbiBpbmNvbXBsZXRlIGJ5dGUuCisgKi8KK3N0YXRpYyB2b2lkIGJpX3dpbmR1cCh2b2lkKQoreworCWlmIChHMS5iaV92YWxpZCA+IDgpIHsKKwkJcHV0XzE2Yml0KEcxLmJpX2J1Zik7CisJfSBlbHNlIGlmIChHMS5iaV92YWxpZCA+IDApIHsKKwkJcHV0XzhiaXQoRzEuYmlfYnVmKTsKKwl9CisJRzEuYmlfYnVmID0gMDsKKwlHMS5iaV92YWxpZCA9IDA7CisjaWZkZWYgREVCVUcKKwlHMS5iaXRzX3NlbnQgPSAoRzEuYml0c19zZW50ICsgNykgJiB+NzsKKyNlbmRpZgorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSBhIHN0b3JlZCBibG9jayB0byB0aGUgemlwIGZpbGUsIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzCisgKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC4KKyAqLworc3RhdGljIHZvaWQgY29weV9ibG9jayhjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgaW50IGhlYWRlcikKK3sKKwliaV93aW5kdXAoKTsJCS8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi8KKworCWlmIChoZWFkZXIpIHsKKwkJcHV0XzE2Yml0KGxlbik7CisJCXB1dF8xNmJpdCh+bGVuKTsKKyNpZmRlZiBERUJVRworCQlHMS5iaXRzX3NlbnQgKz0gMiAqIDE2OworI2VuZGlmCisJfQorI2lmZGVmIERFQlVHCisJRzEuYml0c19zZW50ICs9ICh1bGcpIGxlbiA8PCAzOworI2VuZGlmCisJd2hpbGUgKGxlbi0tKSB7CisJCXB1dF84Yml0KCpidWYrKyk7CisJfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC4KKyAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZCwgYW5kIHNldHMgZW9maWxlIGlmIGVuZCBvZiBpbnB1dCBmaWxlLgorICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHN0cnN0YXJ0ICsgbG9va2FoZWFkID4gMAorICogT1VUIGFzc2VydGlvbnM6IGF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGVvZmlsZSBpcyBzZXQ7CisgKiAgICBmaWxlIHJlYWRzIGFyZSBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZQorICogICAgdHJhbnNsYXRlX2VvbCBvcHRpb24pLgorICovCitzdGF0aWMgdm9pZCBmaWxsX3dpbmRvdyh2b2lkKQoreworCXVuc2lnbmVkIG4sIG07CisJdW5zaWduZWQgbW9yZSA9CVdJTkRPV19TSVpFIC0gRzEubG9va2FoZWFkIC0gRzEuc3Ryc3RhcnQ7CisJLyogQW1vdW50IG9mIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LiAqLworCisJLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCwKKwkgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLgorCSAqLworCWlmIChtb3JlID09ICh1bnNpZ25lZCkgLTEpIHsKKwkJLyogVmVyeSB1bmxpa2VseSwgYnV0IHBvc3NpYmxlIG9uIDE2IGJpdCBtYWNoaW5lIGlmIHN0cnN0YXJ0ID09IDAKKwkJICogYW5kIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIG9uZSBieXRlIGF0IHRpbWUpCisJCSAqLworCQltb3JlLS07CisJfSBlbHNlIGlmIChHMS5zdHJzdGFydCA+PSBXU0laRSArIE1BWF9ESVNUKSB7CisJCS8qIEJ5IHRoZSBJTiBhc3NlcnRpb24sIHRoZSB3aW5kb3cgaXMgbm90IGVtcHR5IHNvIHdlIGNhbid0IGNvbmZ1c2UKKwkJICogbW9yZSA9PSAwIHdpdGggbW9yZSA9PSA2NEsgb24gYSAxNiBiaXQgbWFjaGluZS4KKwkJICovCisJCUFzc2VydChXSU5ET1dfU0laRSA9PSAyICogV1NJWkUsICJubyBzbGlkaW5nIHdpdGggQklHX01FTSIpOworCisJCW1lbWNweShHMS53aW5kb3csIEcxLndpbmRvdyArIFdTSVpFLCBXU0laRSk7CisJCUcxLm1hdGNoX3N0YXJ0IC09IFdTSVpFOworCQlHMS5zdHJzdGFydCAtPSBXU0laRTsJLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1Q6ICovCisKKwkJRzEuYmxvY2tfc3RhcnQgLT0gV1NJWkU7CisKKwkJZm9yIChuID0gMDsgbiA8IEhBU0hfU0laRTsgbisrKSB7CisJCQltID0gaGVhZFtuXTsKKwkJCWhlYWRbbl0gPSAoUG9zKSAobSA+PSBXU0laRSA/IG0gLSBXU0laRSA6IDApOworCQl9CisJCWZvciAobiA9IDA7IG4gPCBXU0laRTsgbisrKSB7CisJCQltID0gRzEucHJldltuXTsKKwkJCUcxLnByZXZbbl0gPSAoUG9zKSAobSA+PSBXU0laRSA/IG0gLSBXU0laRSA6IDApOworCQkJLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXQKKwkJCSAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuCisJCQkgKi8KKwkJfQorCQltb3JlICs9IFdTSVpFOworCX0KKwkvKiBBdCB0aGlzIHBvaW50LCBtb3JlID49IDIgKi8KKwlpZiAoIUcxLmVvZmlsZSkgeworCQluID0gZmlsZV9yZWFkKEcxLndpbmRvdyArIEcxLnN0cnN0YXJ0ICsgRzEubG9va2FoZWFkLCBtb3JlKTsKKwkJaWYgKG4gPT0gMCB8fCBuID09ICh1bnNpZ25lZCkgLTEpIHsKKwkJCUcxLmVvZmlsZSA9IDE7CisJCX0gZWxzZSB7CisJCQlHMS5sb29rYWhlYWQgKz0gbjsKKwkJfQorCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZAorICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpcworICogZ2FyYmFnZS4KKyAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnQKKyAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDEKKyAqLworCisvKiBGb3IgTVNET1MsIE9TLzIgYW5kIDM4NiBVbml4LCBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBpcyBpbiBtYXRjaC5hc20gb3IKKyAqIG1hdGNoLnMuIFRoZSBjb2RlIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LCBzbyB5b3UgY2FuIHVzZSB0aGUgQyB2ZXJzaW9uCisgKiBpZiBkZXNpcmVkLgorICovCitzdGF0aWMgaW50IGxvbmdlc3RfbWF0Y2goSVBvcyBjdXJfbWF0Y2gpCit7CisJdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gbWF4X2NoYWluX2xlbmd0aDsJLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovCisJdWNoICpzY2FuID0gRzEud2luZG93ICsgRzEuc3Ryc3RhcnQ7CS8qIGN1cnJlbnQgc3RyaW5nICovCisJdWNoICptYXRjaDsJLyogbWF0Y2hlZCBzdHJpbmcgKi8KKwlpbnQgbGVuOwkvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLworCWludCBiZXN0X2xlbiA9IEcxLnByZXZfbGVuZ3RoOwkvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi8KKwlJUG9zIGxpbWl0ID0gRzEuc3Ryc3RhcnQgPiAoSVBvcykgTUFYX0RJU1QgPyBHMS5zdHJzdGFydCAtIChJUG9zKSBNQVhfRElTVCA6IDA7CisJLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSwKKwkgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLgorCSAqLworCisvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KKyAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCisgKi8KKyNpZiBIQVNIX0JJVFMgPCA4IHx8IE1BWF9NQVRDSCAhPSAyNTgKKyMgIGVycm9yIENvZGUgdG9vIGNsZXZlcgorI2VuZGlmCisJdWNoICpzdHJlbmQgPSBHMS53aW5kb3cgKyBHMS5zdHJzdGFydCArIE1BWF9NQVRDSDsKKwl1Y2ggc2Nhbl9lbmQxID0gc2NhbltiZXN0X2xlbiAtIDFdOworCXVjaCBzY2FuX2VuZCA9IHNjYW5bYmVzdF9sZW5dOworCisJLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi8KKwlpZiAoRzEucHJldl9sZW5ndGggPj0gZ29vZF9tYXRjaCkgeworCQljaGFpbl9sZW5ndGggPj49IDI7CisJfQorCUFzc2VydChHMS5zdHJzdGFydCA8PSBXSU5ET1dfU0laRSAtIE1JTl9MT09LQUhFQUQsICJpbnN1ZmZpY2llbnQgbG9va2FoZWFkIik7CisKKwlkbyB7CisJCUFzc2VydChjdXJfbWF0Y2ggPCBHMS5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOworCQltYXRjaCA9IEcxLndpbmRvdyArIGN1cl9tYXRjaDsKKworCQkvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKKwkJICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMjoKKwkJICovCisJCWlmIChtYXRjaFtiZXN0X2xlbl0gIT0gc2Nhbl9lbmQKKwkJIHx8IG1hdGNoW2Jlc3RfbGVuIC0gMV0gIT0gc2Nhbl9lbmQxCisJCSB8fCAqbWF0Y2ggIT0gKnNjYW4gfHwgKisrbWF0Y2ggIT0gc2NhblsxXQorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKKwkJICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLikKKwkJICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkKKwkJICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAorCQkgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4KKwkJICovCisJCXNjYW4gKz0gMiwgbWF0Y2grKzsKKworCQkvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworCQkgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4KKwkJICovCisJCWRvIHsKKwkJfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisJCQkJICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorCQkJCSAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKwkJCQkgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmIHNjYW4gPCBzdHJlbmQpOworCisJCWxlbiA9IE1BWF9NQVRDSCAtIChpbnQpIChzdHJlbmQgLSBzY2FuKTsKKwkJc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDsKKworCQlpZiAobGVuID4gYmVzdF9sZW4pIHsKKwkJCUcxLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOworCQkJYmVzdF9sZW4gPSBsZW47CisJCQlpZiAobGVuID49IG5pY2VfbWF0Y2gpCisJCQkJYnJlYWs7CisJCQlzY2FuX2VuZDEgPSBzY2FuW2Jlc3RfbGVuIC0gMV07CisJCQlzY2FuX2VuZCA9IHNjYW5bYmVzdF9sZW5dOworCQl9CisJfSB3aGlsZSAoKGN1cl9tYXRjaCA9IEcxLnByZXZbY3VyX21hdGNoICYgV01BU0tdKSA+IGxpbWl0CisJCQkgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7CisKKwlyZXR1cm4gYmVzdF9sZW47Cit9CisKKworI2lmZGVmIERFQlVHCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRoYXQgdGhlIG1hdGNoIGF0IG1hdGNoX3N0YXJ0IGlzIGluZGVlZCBhIG1hdGNoLgorICovCitzdGF0aWMgdm9pZCBjaGVja19tYXRjaChJUG9zIHN0YXJ0LCBJUG9zIG1hdGNoLCBpbnQgbGVuZ3RoKQoreworCS8qIGNoZWNrIHRoYXQgdGhlIG1hdGNoIGlzIGluZGVlZCBhIG1hdGNoICovCisJaWYgKG1lbWNtcChHMS53aW5kb3cgKyBtYXRjaCwgRzEud2luZG93ICsgc3RhcnQsIGxlbmd0aCkgIT0gMCkgeworCQliYl9lcnJvcl9tc2coIiBzdGFydCAlZCwgbWF0Y2ggJWQsIGxlbmd0aCAlZCIsIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKTsKKwkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG1hdGNoIik7CisJfQorCWlmICh2ZXJib3NlID4gMSkgeworCQliYl9lcnJvcl9tc2coIlxcWyVkLCVkXSIsIHN0YXJ0IC0gbWF0Y2gsIGxlbmd0aCk7CisJCWRvIHsKKwkJCWJiX3B1dGNoYXJfc3RkZXJyKEcxLndpbmRvd1tzdGFydCsrXSk7CisJCX0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOworCX0KK30KKyNlbHNlCisjICBkZWZpbmUgY2hlY2tfbWF0Y2goc3RhcnQsIG1hdGNoLCBsZW5ndGgpICgodm9pZCkwKQorI2VuZGlmCisKKworLyogdHJlZXMuYyAtLSBvdXRwdXQgZGVmbGF0ZWQgZGF0YSB1c2luZyBIdWZmbWFuIGNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseQorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisvKiAgUFVSUE9TRQorICogICAgICBFbmNvZGUgdmFyaW91cyBzZXRzIG9mIHNvdXJjZSB2YWx1ZXMgdXNpbmcgdmFyaWFibGUtbGVuZ3RoCisgKiAgICAgIGJpbmFyeSBjb2RlIHRyZWVzLgorICoKKyAqICBESVNDVVNTSU9OCisgKiAgICAgIFRoZSBQS1pJUCAiZGVmbGF0aW9uIiBwcm9jZXNzIHVzZXMgc2V2ZXJhbCBIdWZmbWFuIHRyZWVzLiBUaGUgbW9yZQorICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBiaXQgc2VxdWVuY2VzLgorICoKKyAqICAgICAgRWFjaCBjb2RlIHRyZWUgaXMgc3RvcmVkIGluIHRoZSBaSVAgZmlsZSBpbiBhIGNvbXByZXNzZWQgZm9ybQorICogICAgICB3aGljaCBpcyBpdHNlbGYgYSBIdWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mCisgKiAgICAgIGFsbCB0aGUgY29kZSBzdHJpbmdzIChpbiBhc2NlbmRpbmcgb3JkZXIgYnkgc291cmNlIHZhbHVlcykuCisgKiAgICAgIFRoZSBhY3R1YWwgY29kZSBzdHJpbmdzIGFyZSByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGxlbmd0aHMgaW4KKyAqICAgICAgdGhlIFVOWklQIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiB0aGUgImFwcGxpY2F0aW9uIG5vdGUiCisgKiAgICAgIChBUFBOT1RFLlRYVCkgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBQS1dBUkUncyBQS1pJUCBwcm9ncmFtLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKiAgICAgIEx5bmNoLCBUaG9tYXMgSi4KKyAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBUZWNobmlxdWVzIGFuZCBBcHBsaWNhdGlvbnMsIHBwLiA1My01NS4KKyAqICAgICAgICAgIExpZmV0aW1lIExlYXJuaW5nIFB1YmxpY2F0aW9ucywgMTk4NS4gIElTQk4gMC01MzQtMDM0MTgtNy4KKyAqCisgKiAgICAgIFN0b3JlciwgSmFtZXMgQS4KKyAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVvcnksIHBwLiA0OS01MC4KKyAqICAgICAgICAgIENvbXB1dGVyIFNjaWVuY2UgUHJlc3MsIDE5ODguICBJU0JOIDAtNzE2Ny04MTU2LTUuCisgKgorICogICAgICBTZWRnZXdpY2ssIFIuCisgKiAgICAgICAgICBBbGdvcml0aG1zLCBwMjkwLgorICogICAgICAgICAgQWRkaXNvbi1XZXNsZXksIDE5ODMuIElTQk4gMC0yMDEtMDY2NzItNi4KKyAqCisgKiAgSU5URVJGQUNFCisgKiAgICAgIHZvaWQgY3RfaW5pdCgpCisgKiAgICAgICAgICBBbGxvY2F0ZSB0aGUgbWF0Y2ggYnVmZmVyLCBpbml0aWFsaXplIHRoZSB2YXJpb3VzIHRhYmxlcyBbYW5kIHNhdmUKKyAqICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGUgKGFzY2lpL2JpbmFyeSkgYW5kCisgKiAgICAgICAgICBtZXRob2QgKERFRkxBVEUvU1RPUkUpIC0tIGRlbGV0ZWQgaW4gYmJveF0KKyAqCisgKiAgICAgIHZvaWQgY3RfdGFsbHkoaW50IGRpc3QsIGludCBsYyk7CisgKiAgICAgICAgICBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4KKyAqCisgKiAgICAgIHVsZyBmbHVzaF9ibG9jayhjaGFyICpidWYsIHVsZyBzdG9yZWRfbGVuLCBpbnQgZW9mKQorICogICAgICAgICAgRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywKKyAqICAgICAgICAgIHN0YXRpYyB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwCisgKiAgICAgICAgICBmaWxlLiBSZXR1cm5zIHRoZSB0b3RhbCBjb21wcmVzc2VkIGxlbmd0aCBmb3IgdGhlIGZpbGUgc28gZmFyLgorICovCisKKyNkZWZpbmUgTUFYX0JJVFMgMTUKKy8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqLworCisjZGVmaW5lIE1BWF9CTF9CSVRTIDcKKy8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi8KKworI2RlZmluZSBMRU5HVEhfQ09ERVMgMjkKKy8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqLworCisjZGVmaW5lIExJVEVSQUxTICAyNTYKKy8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqLworCisjZGVmaW5lIEVORF9CTE9DSyAyNTYKKy8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi8KKworI2RlZmluZSBMX0NPREVTIChMSVRFUkFMUysxK0xFTkdUSF9DT0RFUykKKy8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqLworCisjZGVmaW5lIERfQ09ERVMgICAzMAorLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisKKyNkZWZpbmUgQkxfQ09ERVMgIDE5CisvKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi8KKworLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXh0cmFfbGJpdHNbTEVOR1RIX0NPREVTXSBBTElHTjEgPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgNCwgNCwKKwk0LCA0LCA1LCA1LCA1LCA1LCAwCit9OworCisvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGV4dHJhX2RiaXRzW0RfQ09ERVNdIEFMSUdOMSA9IHsKKwkwLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCA5LCA5LAorCTEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMworfTsKKworLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGV4dHJhX2JsYml0c1tCTF9DT0RFU10gQUxJR04xID0geworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDcgfTsKKworLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCitzdGF0aWMgY29uc3QgdWludDhfdCBibF9vcmRlcltCTF9DT0RFU10gQUxJR04xID0geworCTE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTUgfTsKKworI2RlZmluZSBTVE9SRURfQkxPQ0sgMAorI2RlZmluZSBTVEFUSUNfVFJFRVMgMQorI2RlZmluZSBEWU5fVFJFRVMgICAgMgorLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi8KKworI2lmbmRlZiBMSVRfQlVGU0laRQorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBMSVRfQlVGU0laRSAgMHgyMDAwCisjICBlbHNlCisjICBpZmRlZiBNRURJVU1fTUVNCisjICAgIGRlZmluZSBMSVRfQlVGU0laRSAgMHg0MDAwCisjICBlbHNlCisjICAgIGRlZmluZSBMSVRfQlVGU0laRSAgMHg4MDAwCisjICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBESVNUX0JVRlNJWkUKKyMgIGRlZmluZSBESVNUX0JVRlNJWkUgIExJVF9CVUZTSVpFCisjZW5kaWYKKy8qIFNpemVzIG9mIG1hdGNoIGJ1ZmZlcnMgZm9yIGxpdGVyYWxzL2xlbmd0aHMgYW5kIGRpc3RhbmNlcy4gIFRoZXJlIGFyZQorICogNCByZWFzb25zIGZvciBsaW1pdGluZyBMSVRfQlVGU0laRSB0byA2NEs6CisgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzCisgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0IGRhdGEgaXMKKyAqICAgICBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW4gd2hlbiBpbnB1dAorICogICAgIGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvciBhbGwgYmxvY2tzIGlmCisgKiAgICAgTElUX0JVRlNJWkUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKQorICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuCisgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLgorICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAorICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3IKKyAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnkKKyAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZQorICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZyB0cmVlcworICogICAgIG1vcmUgZnJlcXVlbnRseS4KKyAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKKyAqIFRoZSBjdXJyZW50IGNvZGUgaXMgZ2VuZXJhbCBhbmQgYWxsb3dzIERJU1RfQlVGU0laRSA8IExJVF9CVUZTSVpFICh0byBzYXZlCisgKiBtZW1vcnkgYXQgdGhlIGV4cGVuc2Ugb2YgY29tcHJlc3Npb24pLiBTb21lIG9wdGltaXphdGlvbnMgd291bGQgYmUgcG9zc2libGUKKyAqIGlmIHdlIHJlbHkgb24gRElTVF9CVUZTSVpFID09IExJVF9CVUZTSVpFLgorICovCisjZGVmaW5lIFJFUF8zXzYgICAgICAxNgorLyogcmVwZWF0IHByZXZpb3VzIGJpdCBsZW5ndGggMy02IHRpbWVzICgyIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworI2RlZmluZSBSRVBaXzNfMTAgICAgMTcKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworI2RlZmluZSBSRVBaXzExXzEzOCAgMTgKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKy8qIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSBzaW5nbGUgdmFsdWUgYW5kIGl0cyBjb2RlIHN0cmluZy4gKi8KK3R5cGVkZWYgc3RydWN0IGN0X2RhdGEgeworCXVuaW9uIHsKKwkJdXNoIGZyZXE7CQkvKiBmcmVxdWVuY3kgY291bnQgKi8KKwkJdXNoIGNvZGU7CQkvKiBiaXQgc3RyaW5nICovCisJfSBmYzsKKwl1bmlvbiB7CisJCXVzaCBkYWQ7CQkvKiBmYXRoZXIgbm9kZSBpbiBIdWZmbWFuIHRyZWUgKi8KKwkJdXNoIGxlbjsJCS8qIGxlbmd0aCBvZiBiaXQgc3RyaW5nICovCisJfSBkbDsKK30gY3RfZGF0YTsKKworI2RlZmluZSBGcmVxIGZjLmZyZXEKKyNkZWZpbmUgQ29kZSBmYy5jb2RlCisjZGVmaW5lIERhZCAgZGwuZGFkCisjZGVmaW5lIExlbiAgZGwubGVuCisKKyNkZWZpbmUgSEVBUF9TSVpFICgyKkxfQ09ERVMgKyAxKQorLyogbWF4aW11bSBoZWFwIHNpemUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdHJlZV9kZXNjIHsKKwljdF9kYXRhICpkeW5fdHJlZTsJLyogdGhlIGR5bmFtaWMgdHJlZSAqLworCWN0X2RhdGEgKnN0YXRpY190cmVlOwkvKiBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KKwljb25zdCB1aW50OF90ICpleHRyYV9iaXRzOwkvKiBleHRyYSBiaXRzIGZvciBlYWNoIGNvZGUgb3IgTlVMTCAqLworCWludCBleHRyYV9iYXNlOwkJLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqLworCWludCBlbGVtczsJCQkvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovCisJaW50IG1heF9sZW5ndGg7CQkvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovCisJaW50IG1heF9jb2RlOwkJLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCit9IHRyZWVfZGVzYzsKKworc3RydWN0IGdsb2JhbHMyIHsKKworCXVzaCBoZWFwW0hFQVBfU0laRV07ICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KKwlpbnQgaGVhcF9sZW47ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovCisJaW50IGhlYXBfbWF4OyAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KKworLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC4KKyAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuCisgKi8KKworCWN0X2RhdGEgZHluX2x0cmVlW0hFQVBfU0laRV07CS8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCisJY3RfZGF0YSBkeW5fZHRyZWVbMiAqIERfQ09ERVMgKyAxXTsJLyogZGlzdGFuY2UgdHJlZSAqLworCisJY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUyArIDJdOworCisvKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBubworICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXIKKyAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBjdF9pbml0CisgKiBiZWxvdykuCisgKi8KKworCWN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdOworCisvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlCisgKiA1IGJpdHMuKQorICovCisKKwljdF9kYXRhIGJsX3RyZWVbMiAqIEJMX0NPREVTICsgMV07CisKKy8qIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzICovCisKKwl0cmVlX2Rlc2MgbF9kZXNjOworCXRyZWVfZGVzYyBkX2Rlc2M7CisJdHJlZV9kZXNjIGJsX2Rlc2M7CisKKwl1c2ggYmxfY291bnRbTUFYX0JJVFMgKyAxXTsKKworLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZworICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuCisgKi8KKworCXVjaCBkZXB0aFsyICogTF9DT0RFUyArIDFdOworCisvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5ICovCisKKwl1Y2ggbGVuZ3RoX2NvZGVbTUFYX01BVENIIC0gTUlOX01BVENIICsgMV07CisKKy8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi8KKworCXVjaCBkaXN0X2NvZGVbNTEyXTsKKworLyogZGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlcworICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgorICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuCisgKi8KKworCWludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdOworCisvKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqLworCisJaW50IGJhc2VfZGlzdFtEX0NPREVTXTsKKworLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi8KKworCXVjaCBmbGFnX2J1ZltMSVRfQlVGU0laRSAvIDhdOworCisvKiBmbGFnX2J1ZiBpcyBhIGJpdCBhcnJheSBkaXN0aW5ndWlzaGluZyBsaXRlcmFscyBmcm9tIGxlbmd0aHMgaW4KKyAqIGxfYnVmLCB0aHVzIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYSBkaXN0YW5jZS4KKyAqLworCisJdW5zaWduZWQgbGFzdF9saXQ7ICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KKwl1bnNpZ25lZCBsYXN0X2Rpc3Q7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBkX2J1ZiAqLworCXVuc2lnbmVkIGxhc3RfZmxhZ3M7ICAgICAvKiBydW5uaW5nIGluZGV4IGluIGZsYWdfYnVmICovCisJdWNoIGZsYWdzOyAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZmxhZ3Mgbm90IHlldCBzYXZlZCBpbiBmbGFnX2J1ZiAqLworCXVjaCBmbGFnX2JpdDsgICAgICAgICAgICAvKiBjdXJyZW50IGJpdCB1c2VkIGluIGZsYWdzICovCisKKy8qIGJpdHMgYXJlIGZpbGxlZCBpbiBmbGFncyBzdGFydGluZyBhdCBiaXQgMCAobGVhc3Qgc2lnbmlmaWNhbnQpLgorICogTm90ZTogdGhlc2UgZmxhZ3MgYXJlIG92ZXJraWxsIGluIHRoZSBjdXJyZW50IGNvZGUgc2luY2Ugd2UgZG9uJ3QKKyAqIHRha2UgYWR2YW50YWdlIG9mIERJU1RfQlVGU0laRSA9PSBMSVRfQlVGU0laRS4KKyAqLworCisJdWxnIG9wdF9sZW47ICAgICAgICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi8KKwl1bGcgc3RhdGljX2xlbjsgICAgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovCisKKwl1bGcgY29tcHJlc3NlZF9sZW47ICAgICAgLyogdG90YWwgYml0IGxlbmd0aCBvZiBjb21wcmVzc2VkIGZpbGUgKi8KK307CisKKyNkZWZpbmUgRzJwdHIgKChzdHJ1Y3QgZ2xvYmFsczIqKShwdHJfdG9fZ2xvYmFscykpCisjZGVmaW5lIEcyICgqRzJwdHIpCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyB2b2lkIGdlbl9jb2RlcyhjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKTsKK3N0YXRpYyB2b2lkIGJ1aWxkX3RyZWUodHJlZV9kZXNjICogZGVzYyk7CitzdGF0aWMgdm9pZCBzY2FuX3RyZWUoY3RfZGF0YSAqIHRyZWUsIGludCBtYXhfY29kZSk7CitzdGF0aWMgdm9pZCBzZW5kX3RyZWUoY3RfZGF0YSAqIHRyZWUsIGludCBtYXhfY29kZSk7CitzdGF0aWMgaW50IGJ1aWxkX2JsX3RyZWUodm9pZCk7CitzdGF0aWMgdm9pZCBzZW5kX2FsbF90cmVlcyhpbnQgbGNvZGVzLCBpbnQgZGNvZGVzLCBpbnQgYmxjb2Rlcyk7CitzdGF0aWMgdm9pZCBjb21wcmVzc19ibG9jayhjdF9kYXRhICogbHRyZWUsIGN0X2RhdGEgKiBkdHJlZSk7CisKKworI2lmbmRlZiBERUJVRworLyogU2VuZCBhIGNvZGUgb2YgdGhlIGdpdmVuIHRyZWUuIGMgYW5kIHRyZWUgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKyMgIGRlZmluZSBTRU5EX0NPREUoYywgdHJlZSkgc2VuZF9iaXRzKHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pCisjZWxzZQorIyAgZGVmaW5lIFNFTkRfQ09ERShjLCB0cmVlKSBcCit7IFwKKwlpZiAodmVyYm9zZSA+IDEpIGJiX2Vycm9yX21zZygiXG5jZCAlM2QgIiwgKGMpKTsgXAorCXNlbmRfYml0cyh0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKTsgXAorfQorI2VuZGlmCisKKyNkZWZpbmUgRF9DT0RFKGRpc3QpIFwKKwkoKGRpc3QpIDwgMjU2ID8gRzIuZGlzdF9jb2RlW2Rpc3RdIDogRzIuZGlzdF9jb2RlWzI1NiArICgoZGlzdCk+PjcpXSkKKy8qIE1hcHBpbmcgZnJvbSBhIGRpc3RhbmNlIHRvIGEgZGlzdGFuY2UgY29kZS4gZGlzdCBpcyB0aGUgZGlzdGFuY2UgLSAxIGFuZAorICogbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuIGRpc3RfY29kZVsyNTZdIGFuZCBkaXN0X2NvZGVbMjU3XSBhcmUgbmV2ZXIKKyAqIHVzZWQuCisgKiBUaGUgYXJndW1lbnRzIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLgorICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLgorICovCitzdGF0aWMgdm9pZCBpbml0X2Jsb2NrKHZvaWQpCit7CisJaW50IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovCisJZm9yIChuID0gMDsgbiA8IExfQ09ERVM7IG4rKykKKwkJRzIuZHluX2x0cmVlW25dLkZyZXEgPSAwOworCWZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspCisJCUcyLmR5bl9kdHJlZVtuXS5GcmVxID0gMDsKKwlmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykKKwkJRzIuYmxfdHJlZVtuXS5GcmVxID0gMDsKKworCUcyLmR5bl9sdHJlZVtFTkRfQkxPQ0tdLkZyZXEgPSAxOworCUcyLm9wdF9sZW4gPSBHMi5zdGF0aWNfbGVuID0gMDsKKwlHMi5sYXN0X2xpdCA9IEcyLmxhc3RfZGlzdCA9IEcyLmxhc3RfZmxhZ3MgPSAwOworCUcyLmZsYWdzID0gMDsKKwlHMi5mbGFnX2JpdCA9IDE7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgaywKKyAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nCisgKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzCisgKiB0d28gc29ucykuCisgKi8KKworLyogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KKyAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLiAqLworI2RlZmluZSBTTUFMTEVSKHRyZWUsIG4sIG0pIFwKKwkodHJlZVtuXS5GcmVxIDwgdHJlZVttXS5GcmVxIFwKKwl8fCAodHJlZVtuXS5GcmVxID09IHRyZWVbbV0uRnJlcSAmJiBHMi5kZXB0aFtuXSA8PSBHMi5kZXB0aFttXSkpCisKK3N0YXRpYyB2b2lkIHBxZG93bmhlYXAoY3RfZGF0YSAqIHRyZWUsIGludCBrKQoreworCWludCB2ID0gRzIuaGVhcFtrXTsKKwlpbnQgaiA9IGsgPDwgMTsJCS8qIGxlZnQgc29uIG9mIGsgKi8KKworCXdoaWxlIChqIDw9IEcyLmhlYXBfbGVuKSB7CisJCS8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCisJCWlmIChqIDwgRzIuaGVhcF9sZW4gJiYgU01BTExFUih0cmVlLCBHMi5oZWFwW2ogKyAxXSwgRzIuaGVhcFtqXSkpCisJCQlqKys7CisKKwkJLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi8KKwkJaWYgKFNNQUxMRVIodHJlZSwgdiwgRzIuaGVhcFtqXSkpCisJCQlicmVhazsKKworCQkvKiBFeGNoYW5nZSB2IHdpdGggdGhlIHNtYWxsZXN0IHNvbiAqLworCQlHMi5oZWFwW2tdID0gRzIuaGVhcFtqXTsKKwkJayA9IGo7CisKKwkJLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqLworCQlqIDw8PSAxOworCX0KKwlHMi5oZWFwW2tdID0gdjsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoCisgKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZAorICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGUKKyAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC4KKyAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMKKyAqICAgICBub3QgbnVsbC4KKyAqLworc3RhdGljIHZvaWQgZ2VuX2JpdGxlbih0cmVlX2Rlc2MgKiBkZXNjKQoreworCWN0X2RhdGEgKnRyZWUgPSBkZXNjLT5keW5fdHJlZTsKKwljb25zdCB1aW50OF90ICpleHRyYSA9IGRlc2MtPmV4dHJhX2JpdHM7CisJaW50IGJhc2UgPSBkZXNjLT5leHRyYV9iYXNlOworCWludCBtYXhfY29kZSA9IGRlc2MtPm1heF9jb2RlOworCWludCBtYXhfbGVuZ3RoID0gZGVzYy0+bWF4X2xlbmd0aDsKKwljdF9kYXRhICpzdHJlZSA9IGRlc2MtPnN0YXRpY190cmVlOworCWludCBoOwkJCQkvKiBoZWFwIGluZGV4ICovCisJaW50IG4sIG07CQkJLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovCisJaW50IGJpdHM7CQkJLyogYml0IGxlbmd0aCAqLworCWludCB4Yml0czsJCQkvKiBleHRyYSBiaXRzICovCisJdXNoIGY7CQkJCS8qIGZyZXF1ZW5jeSAqLworCWludCBvdmVyZmxvdyA9IDA7CS8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovCisKKwlmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspCisJCUcyLmJsX2NvdW50W2JpdHNdID0gMDsKKworCS8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5CisJICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuCisJICovCisJdHJlZVtHMi5oZWFwW0cyLmhlYXBfbWF4XV0uTGVuID0gMDsJLyogcm9vdCBvZiB0aGUgaGVhcCAqLworCisJZm9yIChoID0gRzIuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHsKKwkJbiA9IEcyLmhlYXBbaF07CisJCWJpdHMgPSB0cmVlW3RyZWVbbl0uRGFkXS5MZW4gKyAxOworCQlpZiAoYml0cyA+IG1heF9sZW5ndGgpIHsKKwkJCWJpdHMgPSBtYXhfbGVuZ3RoOworCQkJb3ZlcmZsb3crKzsKKwkJfQorCQl0cmVlW25dLkxlbiA9ICh1c2gpIGJpdHM7CisJCS8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovCisKKwkJaWYgKG4gPiBtYXhfY29kZSkKKwkJCWNvbnRpbnVlOwkvKiBub3QgYSBsZWFmIG5vZGUgKi8KKworCQlHMi5ibF9jb3VudFtiaXRzXSsrOworCQl4Yml0cyA9IDA7CisJCWlmIChuID49IGJhc2UpCisJCQl4Yml0cyA9IGV4dHJhW24gLSBiYXNlXTsKKwkJZiA9IHRyZWVbbl0uRnJlcTsKKwkJRzIub3B0X2xlbiArPSAodWxnKSBmICooYml0cyArIHhiaXRzKTsKKworCQlpZiAoc3RyZWUpCisJCQlHMi5zdGF0aWNfbGVuICs9ICh1bGcpIGYgKiAoc3RyZWVbbl0uTGVuICsgeGJpdHMpOworCX0KKwlpZiAob3ZlcmZsb3cgPT0gMCkKKwkJcmV0dXJuOworCisJVHJhY2UoKHN0ZGVyciwgIlxuYml0IGxlbmd0aCBvdmVyZmxvd1xuIikpOworCS8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovCisKKwkvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqLworCWRvIHsKKwkJYml0cyA9IG1heF9sZW5ndGggLSAxOworCQl3aGlsZSAoRzIuYmxfY291bnRbYml0c10gPT0gMCkKKwkJCWJpdHMtLTsKKwkJRzIuYmxfY291bnRbYml0c10tLTsJLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovCisJCUcyLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOwkvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovCisJCUcyLmJsX2NvdW50W21heF9sZW5ndGhdLS07CisJCS8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsCisJCSAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXQorCQkgKi8KKwkJb3ZlcmZsb3cgLT0gMjsKKwl9IHdoaWxlIChvdmVyZmxvdyA+IDApOworCisJLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LgorCSAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGwKKwkgKiBsZW5ndGhzIGluc3RlYWQgb2YgZml4aW5nIG9ubHkgdGhlIHdyb25nIG9uZXMuIFRoaXMgaWRlYSBpcyB0YWtlbgorCSAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKQorCSAqLworCWZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT0gMDsgYml0cy0tKSB7CisJCW4gPSBHMi5ibF9jb3VudFtiaXRzXTsKKwkJd2hpbGUgKG4gIT0gMCkgeworCQkJbSA9IEcyLmhlYXBbLS1oXTsKKwkJCWlmIChtID4gbWF4X2NvZGUpCisJCQkJY29udGludWU7CisJCQlpZiAodHJlZVttXS5MZW4gIT0gKHVuc2lnbmVkKSBiaXRzKSB7CisJCQkJVHJhY2UoKHN0ZGVyciwgImNvZGUgJWQgYml0cyAlZC0+JWRcbiIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7CisJCQkJRzIub3B0X2xlbiArPSAoKGludDMyX3QpIGJpdHMgLSB0cmVlW21dLkxlbikgKiB0cmVlW21dLkZyZXE7CisJCQkJdHJlZVttXS5MZW4gPSBiaXRzOworCQkJfQorCQkJbi0tOworCQl9CisJfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlCisgKiBvcHRpbWFsKS4KKyAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yCisgKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLgorICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub24KKyAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLgorICovCitzdGF0aWMgdm9pZCBnZW5fY29kZXMoY3RfZGF0YSAqIHRyZWUsIGludCBtYXhfY29kZSkKK3sKKwl1c2ggbmV4dF9jb2RlW01BWF9CSVRTICsgMV07CS8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovCisJdXNoIGNvZGUgPSAwOwkJLyogcnVubmluZyBjb2RlIHZhbHVlICovCisJaW50IGJpdHM7CQkJLyogYml0IGluZGV4ICovCisJaW50IG47CQkJCS8qIGNvZGUgaW5kZXggKi8KKworCS8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlcworCSAqIHdpdGhvdXQgYml0IHJldmVyc2FsLgorCSAqLworCWZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgeworCQluZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUgKyBHMi5ibF9jb3VudFtiaXRzIC0gMV0pIDw8IDE7CisJfQorCS8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGUKKwkgKiBtdXN0IGJlIGFsbCBvbmVzLgorCSAqLworCUFzc2VydChjb2RlICsgRzIuYmxfY291bnRbTUFYX0JJVFNdIC0gMSA9PSAoMSA8PCBNQVhfQklUUykgLSAxLAorCQkgICAiaW5jb25zaXN0ZW50IGJpdCBjb3VudHMiKTsKKwlUcmFjZXYoKHN0ZGVyciwgIlxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCAiLCBtYXhfY29kZSkpOworCisJZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisJCWludCBsZW4gPSB0cmVlW25dLkxlbjsKKworCQlpZiAobGVuID09IDApCisJCQljb250aW51ZTsKKwkJLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi8KKwkJdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pOworCisJCVRyYWNlYyh0cmVlICE9IEcyLnN0YXRpY19sdHJlZSwKKwkJCSAgIChzdGRlcnIsICJcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgIiwgbiwKKwkJCQkobiA+ICcgJyA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwKKwkJCQluZXh0X2NvZGVbbGVuXSAtIDEpKTsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy4KKyAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoCisgKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMKKyAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCisgKi8KKworLyogUmVtb3ZlIHRoZSBzbWFsbGVzdCBlbGVtZW50IGZyb20gdGhlIGhlYXAgYW5kIHJlY3JlYXRlIHRoZSBoZWFwIHdpdGgKKyAqIG9uZSBsZXNzIGVsZW1lbnQuIFVwZGF0ZXMgaGVhcCBhbmQgaGVhcF9sZW4uICovCisKKyNkZWZpbmUgU01BTExFU1QgMQorLyogSW5kZXggd2l0aGluIHRoZSBoZWFwIGFycmF5IG9mIGxlYXN0IGZyZXF1ZW50IG5vZGUgaW4gdGhlIEh1ZmZtYW4gdHJlZSAqLworCisjZGVmaW5lIFBRUkVNT1ZFKHRyZWUsIHRvcCkgXAorZG8geyBcCisJdG9wID0gRzIuaGVhcFtTTUFMTEVTVF07IFwKKwlHMi5oZWFwW1NNQUxMRVNUXSA9IEcyLmhlYXBbRzIuaGVhcF9sZW4tLV07IFwKKwlwcWRvd25oZWFwKHRyZWUsIFNNQUxMRVNUKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgYnVpbGRfdHJlZSh0cmVlX2Rlc2MgKiBkZXNjKQoreworCWN0X2RhdGEgKnRyZWUgPSBkZXNjLT5keW5fdHJlZTsKKwljdF9kYXRhICpzdHJlZSA9IGRlc2MtPnN0YXRpY190cmVlOworCWludCBlbGVtcyA9IGRlc2MtPmVsZW1zOworCWludCBuLCBtOwkJCS8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovCisJaW50IG1heF9jb2RlID0gLTE7CS8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworCWludCBub2RlID0gZWxlbXM7CS8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLworCisJLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgorCSAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgorCSAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCisJICovCisJRzIuaGVhcF9sZW4gPSAwOworCUcyLmhlYXBfbWF4ID0gSEVBUF9TSVpFOworCisJZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHsKKwkJaWYgKHRyZWVbbl0uRnJlcSAhPSAwKSB7CisJCQlHMi5oZWFwWysrRzIuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuOworCQkJRzIuZGVwdGhbbl0gPSAwOworCQl9IGVsc2UgeworCQkJdHJlZVtuXS5MZW4gPSAwOworCQl9CisJfQorCisJLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKKwkgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUKKwkgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdAorCSAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCisJICovCisJd2hpbGUgKEcyLmhlYXBfbGVuIDwgMikgeworCQlpbnQgbmV3ID0gRzIuaGVhcFsrK0cyLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7CisKKwkJdHJlZVtuZXddLkZyZXEgPSAxOworCQlHMi5kZXB0aFtuZXddID0gMDsKKwkJRzIub3B0X2xlbi0tOworCQlpZiAoc3RyZWUpCisJCQlHMi5zdGF0aWNfbGVuIC09IHN0cmVlW25ld10uTGVuOworCQkvKiBuZXcgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqLworCX0KKwlkZXNjLT5tYXhfY29kZSA9IG1heF9jb2RlOworCisJLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLAorCSAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgorCSAqLworCWZvciAobiA9IEcyLmhlYXBfbGVuIC8gMjsgbiA+PSAxOyBuLS0pCisJCXBxZG93bmhlYXAodHJlZSwgbik7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvCisJICogZnJlcXVlbnQgbm9kZXMuCisJICovCisJZG8geworCQlQUVJFTU9WRSh0cmVlLCBuKTsJLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovCisJCW0gPSBHMi5oZWFwW1NNQUxMRVNUXTsJLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi8KKworCQlHMi5oZWFwWy0tRzIuaGVhcF9tYXhdID0gbjsJLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqLworCQlHMi5oZWFwWy0tRzIuaGVhcF9tYXhdID0gbTsKKworCQkvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqLworCQl0cmVlW25vZGVdLkZyZXEgPSB0cmVlW25dLkZyZXEgKyB0cmVlW21dLkZyZXE7CisJCUcyLmRlcHRoW25vZGVdID0gTUFYKEcyLmRlcHRoW25dLCBHMi5kZXB0aFttXSkgKyAxOworCQl0cmVlW25dLkRhZCA9IHRyZWVbbV0uRGFkID0gKHVzaCkgbm9kZTsKKyNpZmRlZiBEVU1QX0JMX1RSRUUKKwkJaWYgKHRyZWUgPT0gRzIuYmxfdHJlZSkgeworCQkJYmJfZXJyb3JfbXNnKCJcbm5vZGUgJWQoJWQpLCBzb25zICVkKCVkKSAlZCglZCkiLAorCQkJCQlub2RlLCB0cmVlW25vZGVdLkZyZXEsIG4sIHRyZWVbbl0uRnJlcSwgbSwgdHJlZVttXS5GcmVxKTsKKwkJfQorI2VuZGlmCisJCS8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovCisJCUcyLmhlYXBbU01BTExFU1RdID0gbm9kZSsrOworCQlwcWRvd25oZWFwKHRyZWUsIFNNQUxMRVNUKTsKKworCX0gd2hpbGUgKEcyLmhlYXBfbGVuID49IDIpOworCisJRzIuaGVhcFstLUcyLmhlYXBfbWF4XSA9IEcyLmhlYXBbU01BTExFU1RdOworCisJLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vdworCSAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy4KKwkgKi8KKwlnZW5fYml0bGVuKCh0cmVlX2Rlc2MgKikgZGVzYyk7CisKKwkvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovCisJZ2VuX2NvZGVzKChjdF9kYXRhICopIHRyZWUsIG1heF9jb2RlKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXMKKyAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuIFVwZGF0ZXMgb3B0X2xlbiB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgcmVwZWF0CisgKiBjb3VudHMuIChUaGUgY29udHJpYnV0aW9uIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIHdpbGwgYmUgYWRkZWQgbGF0ZXIKKyAqIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIGJsX3RyZWUuKQorICovCitzdGF0aWMgdm9pZCBzY2FuX3RyZWUoY3RfZGF0YSAqIHRyZWUsIGludCBtYXhfY29kZSkKK3sKKwlpbnQgbjsJCQkJLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLworCWludCBwcmV2bGVuID0gLTE7CS8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi8KKwlpbnQgY3VybGVuOwkJCS8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKwlpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOwkvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisJaW50IGNvdW50ID0gMDsJCS8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovCisJaW50IG1heF9jb3VudCA9IDc7CS8qIG1heCByZXBlYXQgY291bnQgKi8KKwlpbnQgbWluX2NvdW50ID0gNDsJLyogbWluIHJlcGVhdCBjb3VudCAqLworCisJaWYgKG5leHRsZW4gPT0gMCkgeworCQltYXhfY291bnQgPSAxMzg7CisJCW1pbl9jb3VudCA9IDM7CisJfQorCXRyZWVbbWF4X2NvZGUgKyAxXS5MZW4gPSAweGZmZmY7IC8qIGd1YXJkICovCisKKwlmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKwkJY3VybGVuID0gbmV4dGxlbjsKKwkJbmV4dGxlbiA9IHRyZWVbbiArIDFdLkxlbjsKKwkJaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09IG5leHRsZW4pCisJCQljb250aW51ZTsKKworCQlpZiAoY291bnQgPCBtaW5fY291bnQpIHsKKwkJCUcyLmJsX3RyZWVbY3VybGVuXS5GcmVxICs9IGNvdW50OworCQl9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CisJCQlpZiAoY3VybGVuICE9IHByZXZsZW4pCisJCQkJRzIuYmxfdHJlZVtjdXJsZW5dLkZyZXErKzsKKwkJCUcyLmJsX3RyZWVbUkVQXzNfNl0uRnJlcSsrOworCQl9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CisJCQlHMi5ibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOworCQl9IGVsc2UgeworCQkJRzIuYmxfdHJlZVtSRVBaXzExXzEzOF0uRnJlcSsrOworCQl9CisJCWNvdW50ID0gMDsKKwkJcHJldmxlbiA9IGN1cmxlbjsKKworCQltYXhfY291bnQgPSA3OworCQltaW5fY291bnQgPSA0OworCQlpZiAobmV4dGxlbiA9PSAwKSB7CisJCQltYXhfY291bnQgPSAxMzg7CisJCQltaW5fY291bnQgPSAzOworCQl9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7CisJCQltYXhfY291bnQgPSA2OworCQkJbWluX2NvdW50ID0gMzsKKwkJfQorCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW4KKyAqIGJsX3RyZWUuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfdHJlZShjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKQoreworCWludCBuOwkJCQkvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisJaW50IHByZXZsZW4gPSAtMTsJLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworCWludCBjdXJsZW47CQkJLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworCWludCBuZXh0bGVuID0gdHJlZVswXS5MZW47CS8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKwlpbnQgY291bnQgPSAwOwkJLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKwlpbnQgbWF4X2NvdW50ID0gNzsJLyogbWF4IHJlcGVhdCBjb3VudCAqLworCWludCBtaW5fY291bnQgPSA0OwkvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKy8qIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gLTE7ICovLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi8KKwlpZiAobmV4dGxlbiA9PSAwKQorCQltYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisKKwlmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKwkJY3VybGVuID0gbmV4dGxlbjsKKwkJbmV4dGxlbiA9IHRyZWVbbiArIDFdLkxlbjsKKwkJaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CisJCQlkbyB7CisJCQkJU0VORF9DT0RFKGN1cmxlbiwgRzIuYmxfdHJlZSk7CisJCQl9IHdoaWxlICgtLWNvdW50KTsKKwkJfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworCQkJaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSB7CisJCQkJU0VORF9DT0RFKGN1cmxlbiwgRzIuYmxfdHJlZSk7CisJCQkJY291bnQtLTsKKwkJCX0KKwkJCUFzc2VydChjb3VudCA+PSAzICYmIGNvdW50IDw9IDYsICIgM182PyIpOworCQkJU0VORF9DT0RFKFJFUF8zXzYsIEcyLmJsX3RyZWUpOworCQkJc2VuZF9iaXRzKGNvdW50IC0gMywgMik7CisJCX0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKwkJCVNFTkRfQ09ERShSRVBaXzNfMTAsIEcyLmJsX3RyZWUpOworCQkJc2VuZF9iaXRzKGNvdW50IC0gMywgMyk7CisJCX0gZWxzZSB7CisJCQlTRU5EX0NPREUoUkVQWl8xMV8xMzgsIEcyLmJsX3RyZWUpOworCQkJc2VuZF9iaXRzKGNvdW50IC0gMTEsIDcpOworCQl9CisJCWNvdW50ID0gMDsKKwkJcHJldmxlbiA9IGN1cmxlbjsKKwkJaWYgKG5leHRsZW4gPT0gMCkgeworCQkJbWF4X2NvdW50ID0gMTM4OworCQkJbWluX2NvdW50ID0gMzsKKwkJfSBlbHNlIGlmIChjdXJsZW4gPT0gbmV4dGxlbikgeworCQkJbWF4X2NvdW50ID0gNjsKKwkJCW1pbl9jb3VudCA9IDM7CisJCX0gZWxzZSB7CisJCQltYXhfY291bnQgPSA3OworCQkJbWluX2NvdW50ID0gNDsKKwkJfQorCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW4KKyAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorICovCitzdGF0aWMgaW50IGJ1aWxkX2JsX3RyZWUodm9pZCkKK3sKKwlpbnQgbWF4X2JsaW5kZXg7CS8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworCS8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKwlzY2FuX3RyZWUoRzIuZHluX2x0cmVlLCBHMi5sX2Rlc2MubWF4X2NvZGUpOworCXNjYW5fdHJlZShHMi5keW5fZHRyZWUsIEcyLmRfZGVzYy5tYXhfY29kZSk7CisKKwkvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqLworCWJ1aWxkX3RyZWUoJkcyLmJsX2Rlc2MpOworCS8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHQKKwkgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLgorCSAqLworCisJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0CisJICogcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXMKKwkgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pCisJICovCisJZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTIC0gMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkgeworCQlpZiAoRzIuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKQorCQkJYnJlYWs7CisJfQorCS8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovCisJRzIub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7CisJVHJhY2V2KChzdGRlcnIsICJcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGQiLCBHMi5vcHRfbGVuLCBHMi5zdGF0aWNfbGVuKSk7CisKKwlyZXR1cm4gbWF4X2JsaW5kZXg7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGUKKyAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLgorICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LgorICovCitzdGF0aWMgdm9pZCBzZW5kX2FsbF90cmVlcyhpbnQgbGNvZGVzLCBpbnQgZGNvZGVzLCBpbnQgYmxjb2RlcykKK3sKKwlpbnQgcmFuazsJCQkvKiBpbmRleCBpbiBibF9vcmRlciAqLworCisJQXNzZXJ0KGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCAibm90IGVub3VnaCBjb2RlcyIpOworCUFzc2VydChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUworCQkgICAmJiBibGNvZGVzIDw9IEJMX0NPREVTLCAidG9vIG1hbnkgY29kZXMiKTsKKwlUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY291bnRzOiAiKSk7CisJc2VuZF9iaXRzKGxjb2RlcyAtIDI1NywgNSk7CS8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqLworCXNlbmRfYml0cyhkY29kZXMgLSAxLCA1KTsKKwlzZW5kX2JpdHMoYmxjb2RlcyAtIDQsIDQpOwkvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCisJZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykgeworCQlUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsKKwkJc2VuZF9iaXRzKEcyLmJsX3RyZWVbYmxfb3JkZXJbcmFua11dLkxlbiwgMyk7CisJfQorCVRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIEcxLmJpdHNfc2VudCkpOworCisJc2VuZF90cmVlKChjdF9kYXRhICopIEcyLmR5bl9sdHJlZSwgbGNvZGVzIC0gMSk7CS8qIHNlbmQgdGhlIGxpdGVyYWwgdHJlZSAqLworCVRyYWNldigoc3RkZXJyLCAiXG5saXQgdHJlZTogc2VudCAlbGQiLCBHMS5iaXRzX3NlbnQpKTsKKworCXNlbmRfdHJlZSgoY3RfZGF0YSAqKSBHMi5keW5fZHRyZWUsIGRjb2RlcyAtIDEpOwkvKiBzZW5kIHRoZSBkaXN0YW5jZSB0cmVlICovCisJVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgdHJlZTogc2VudCAlbGQiLCBHMS5iaXRzX3NlbnQpKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgorICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLgorICovCitzdGF0aWMgaW50IGN0X3RhbGx5KGludCBkaXN0LCBpbnQgbGMpCit7CisJRzEubF9idWZbRzIubGFzdF9saXQrK10gPSBsYzsKKwlpZiAoZGlzdCA9PSAwKSB7CisJCS8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqLworCQlHMi5keW5fbHRyZWVbbGNdLkZyZXErKzsKKwl9IGVsc2UgeworCQkvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisJCWRpc3QtLTsJCQkvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovCisJCUFzc2VydCgodXNoKSBkaXN0IDwgKHVzaCkgTUFYX0RJU1QKKwkJICYmICh1c2gpIGxjIDw9ICh1c2gpIChNQVhfTUFUQ0ggLSBNSU5fTUFUQ0gpCisJCSAmJiAodXNoKSBEX0NPREUoZGlzdCkgPCAodXNoKSBEX0NPREVTLCAiY3RfdGFsbHk6IGJhZCBtYXRjaCIKKwkJKTsKKworCQlHMi5keW5fbHRyZWVbRzIubGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxXS5GcmVxKys7CisJCUcyLmR5bl9kdHJlZVtEX0NPREUoZGlzdCldLkZyZXErKzsKKworCQlHMS5kX2J1ZltHMi5sYXN0X2Rpc3QrK10gPSBkaXN0OworCQlHMi5mbGFncyB8PSBHMi5mbGFnX2JpdDsKKwl9CisJRzIuZmxhZ19iaXQgPDw9IDE7CisKKwkvKiBPdXRwdXQgdGhlIGZsYWdzIGlmIHRoZXkgZmlsbCBhIGJ5dGU6ICovCisJaWYgKChHMi5sYXN0X2xpdCAmIDcpID09IDApIHsKKwkJRzIuZmxhZ19idWZbRzIubGFzdF9mbGFncysrXSA9IEcyLmZsYWdzOworCQlHMi5mbGFncyA9IDA7CisJCUcyLmZsYWdfYml0ID0gMTsKKwl9CisJLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovCisJaWYgKChHMi5sYXN0X2xpdCAmIDB4ZmZmKSA9PSAwKSB7CisJCS8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLworCQl1bGcgb3V0X2xlbmd0aCA9IEcyLmxhc3RfbGl0ICogOEw7CisJCXVsZyBpbl9sZW5ndGggPSAodWxnKSBHMS5zdHJzdGFydCAtIEcxLmJsb2NrX3N0YXJ0OworCQlpbnQgZGNvZGU7CisKKwkJZm9yIChkY29kZSA9IDA7IGRjb2RlIDwgRF9DT0RFUzsgZGNvZGUrKykgeworCQkJb3V0X2xlbmd0aCArPSBHMi5keW5fZHRyZWVbZGNvZGVdLkZyZXEgKiAoNUwgKyBleHRyYV9kYml0c1tkY29kZV0pOworCQl9CisJCW91dF9sZW5ndGggPj49IDM7CisJCVRyYWNlKChzdGRlcnIsCisJCQkgICAiXG5sYXN0X2xpdCAldSwgbGFzdF9kaXN0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSAiLAorCQkJICAgRzIubGFzdF9saXQsIEcyLmxhc3RfZGlzdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLAorCQkJICAgMTAwTCAtIG91dF9sZW5ndGggKiAxMDBMIC8gaW5fbGVuZ3RoKSk7CisJCWlmIChHMi5sYXN0X2Rpc3QgPCBHMi5sYXN0X2xpdCAvIDIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aCAvIDIpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIChHMi5sYXN0X2xpdCA9PSBMSVRfQlVGU0laRSAtIDEgfHwgRzIubGFzdF9kaXN0ID09IERJU1RfQlVGU0laRSk7CisJLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBMSVRfQlVGU0laRSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLCisJICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG8KKwkgKiA2NEstMSBieXRlcy4KKwkgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXMKKyAqLworc3RhdGljIHZvaWQgY29tcHJlc3NfYmxvY2soY3RfZGF0YSAqIGx0cmVlLCBjdF9kYXRhICogZHRyZWUpCit7CisJdW5zaWduZWQgZGlzdDsgICAgICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KKwlpbnQgbGM7ICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi8KKwl1bnNpZ25lZCBseCA9IDA7ICAgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCisJdW5zaWduZWQgZHggPSAwOyAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBkX2J1ZiAqLworCXVuc2lnbmVkIGZ4ID0gMDsgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gZmxhZ19idWYgKi8KKwl1Y2ggZmxhZyA9IDA7ICAgICAgICAgICAvKiBjdXJyZW50IGZsYWdzICovCisJdW5zaWduZWQgY29kZTsgICAgICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqLworCWludCBleHRyYTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi8KKworCWlmIChHMi5sYXN0X2xpdCAhPSAwKSBkbyB7CisJCWlmICgobHggJiA3KSA9PSAwKQorCQkJZmxhZyA9IEcyLmZsYWdfYnVmW2Z4KytdOworCQlsYyA9IEcxLmxfYnVmW2x4KytdOworCQlpZiAoKGZsYWcgJiAxKSA9PSAwKSB7CisJCQlTRU5EX0NPREUobGMsIGx0cmVlKTsJLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqLworCQkJVHJhY2VjdihsYyA+ICcgJywgKHN0ZGVyciwgIiAnJWMnICIsIGxjKSk7CisJCX0gZWxzZSB7CisJCQkvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisJCQljb2RlID0gRzIubGVuZ3RoX2NvZGVbbGNdOworCQkJU0VORF9DT0RFKGNvZGUgKyBMSVRFUkFMUyArIDEsIGx0cmVlKTsJLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi8KKwkJCWV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07CisJCQlpZiAoZXh0cmEgIT0gMCkgeworCQkJCWxjIC09IEcyLmJhc2VfbGVuZ3RoW2NvZGVdOworCQkJCXNlbmRfYml0cyhsYywgZXh0cmEpOwkvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqLworCQkJfQorCQkJZGlzdCA9IEcxLmRfYnVmW2R4KytdOworCQkJLyogSGVyZSwgZGlzdCBpcyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovCisJCQljb2RlID0gRF9DT0RFKGRpc3QpOworCQkJQXNzZXJ0KGNvZGUgPCBEX0NPREVTLCAiYmFkIGRfY29kZSIpOworCisJCQlTRU5EX0NPREUoY29kZSwgZHRyZWUpOwkvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCisJCQlleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdOworCQkJaWYgKGV4dHJhICE9IDApIHsKKwkJCQlkaXN0IC09IEcyLmJhc2VfZGlzdFtjb2RlXTsKKwkJCQlzZW5kX2JpdHMoZGlzdCwgZXh0cmEpOwkvKiBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzICovCisJCQl9CisJCX0JCQkvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLworCQlmbGFnID4+PSAxOworCX0gd2hpbGUgKGx4IDwgRzIubGFzdF9saXQpOworCisJU0VORF9DT0RFKEVORF9CTE9DSywgbHRyZWUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljCisgKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuIFRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgdGhlIHRvdGFsIGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0aGUgZmlsZSBzbyBmYXIuCisgKi8KK3N0YXRpYyB1bGcgZmx1c2hfYmxvY2soY2hhciAqYnVmLCB1bGcgc3RvcmVkX2xlbiwgaW50IGVvZikKK3sKKwl1bGcgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAgICAgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi8KKwlpbnQgbWF4X2JsaW5kZXg7ICAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworCUcyLmZsYWdfYnVmW0cyLmxhc3RfZmxhZ3NdID0gRzIuZmxhZ3M7ICAgLyogU2F2ZSB0aGUgZmxhZ3MgZm9yIHRoZSBsYXN0IDggaXRlbXMgKi8KKworCS8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKwlidWlsZF90cmVlKCZHMi5sX2Rlc2MpOworCVRyYWNldigoc3RkZXJyLCAiXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBHMi5vcHRfbGVuLCBHMi5zdGF0aWNfbGVuKSk7CisKKwlidWlsZF90cmVlKCZHMi5kX2Rlc2MpOworCVRyYWNldigoc3RkZXJyLCAiXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgRzIub3B0X2xlbiwgRzIuc3RhdGljX2xlbikpOworCS8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZgorCSAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuCisJICovCisKKwkvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleAorCSAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorCSAqLworCW1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZSgpOworCisJLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIGZpcnN0IHRoZSBibG9jayBsZW5ndGggaW4gYnl0ZXMgKi8KKwlvcHRfbGVuYiA9IChHMi5vcHRfbGVuICsgMyArIDcpID4+IDM7CisJc3RhdGljX2xlbmIgPSAoRzIuc3RhdGljX2xlbiArIDMgKyA3KSA+PiAzOworCisJVHJhY2UoKHN0ZGVyciwKKwkJICAgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgZGlzdCAldSAiLAorCQkgICBvcHRfbGVuYiwgRzIub3B0X2xlbiwgc3RhdGljX2xlbmIsIEcyLnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCisJCSAgIEcyLmxhc3RfbGl0LCBHMi5sYXN0X2Rpc3QpKTsKKworCWlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikKKwkJb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsKKworCS8qIElmIGNvbXByZXNzaW9uIGZhaWxlZCBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgYmxvY2ssCisJICogYW5kIGlmIHRoZSB6aXAgZmlsZSBjYW4gYmUgc2Vla2VkICh0byByZXdyaXRlIHRoZSBsb2NhbCBoZWFkZXIpLAorCSAqIHRoZSB3aG9sZSBmaWxlIGlzIHRyYW5zZm9ybWVkIGludG8gYSBzdG9yZWQgZmlsZToKKwkgKi8KKwlpZiAoc3RvcmVkX2xlbiA8PSBvcHRfbGVuYiAmJiBlb2YgJiYgRzIuY29tcHJlc3NlZF9sZW4gPT0gMEwgJiYgc2Vla2FibGUoKSkgeworCQkvKiBTaW5jZSBMSVRfQlVGU0laRSA8PSAyKldTSVpFLCB0aGUgaW5wdXQgZGF0YSBtdXN0IGJlIHRoZXJlOiAqLworCQlpZiAoYnVmID09IE5VTEwpCisJCQliYl9lcnJvcl9tc2coImJsb2NrIHZhbmlzaGVkIik7CisKKwkJY29weV9ibG9jayhidWYsICh1bnNpZ25lZCkgc3RvcmVkX2xlbiwgMCk7CS8qIHdpdGhvdXQgaGVhZGVyICovCisJCUcyLmNvbXByZXNzZWRfbGVuID0gc3RvcmVkX2xlbiA8PCAzOworCisJfSBlbHNlIGlmIChzdG9yZWRfbGVuICsgNCA8PSBvcHRfbGVuYiAmJiBidWYgIT0gTlVMTCkgeworCQkvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovCisJCS8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuCisJCSAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2UKKwkJICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuCisJCSAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bworCQkgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLgorCQkgKi8KKwkJc2VuZF9iaXRzKChTVE9SRURfQkxPQ0sgPDwgMSkgKyBlb2YsIDMpOwkvKiBzZW5kIGJsb2NrIHR5cGUgKi8KKwkJRzIuY29tcHJlc3NlZF9sZW4gPSAoRzIuY29tcHJlc3NlZF9sZW4gKyAzICsgNykgJiB+N0w7CisJCUcyLmNvbXByZXNzZWRfbGVuICs9IChzdG9yZWRfbGVuICsgNCkgPDwgMzsKKworCQljb3B5X2Jsb2NrKGJ1ZiwgKHVuc2lnbmVkKSBzdG9yZWRfbGVuLCAxKTsJLyogd2l0aCBoZWFkZXIgKi8KKworCX0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPT0gb3B0X2xlbmIpIHsKKwkJc2VuZF9iaXRzKChTVEFUSUNfVFJFRVMgPDwgMSkgKyBlb2YsIDMpOworCQljb21wcmVzc19ibG9jaygoY3RfZGF0YSAqKSBHMi5zdGF0aWNfbHRyZWUsIChjdF9kYXRhICopIEcyLnN0YXRpY19kdHJlZSk7CisJCUcyLmNvbXByZXNzZWRfbGVuICs9IDMgKyBHMi5zdGF0aWNfbGVuOworCX0gZWxzZSB7CisJCXNlbmRfYml0cygoRFlOX1RSRUVTIDw8IDEpICsgZW9mLCAzKTsKKwkJc2VuZF9hbGxfdHJlZXMoRzIubF9kZXNjLm1heF9jb2RlICsgMSwgRzIuZF9kZXNjLm1heF9jb2RlICsgMSwKKwkJCQkJICAgbWF4X2JsaW5kZXggKyAxKTsKKwkJY29tcHJlc3NfYmxvY2soKGN0X2RhdGEgKikgRzIuZHluX2x0cmVlLCAoY3RfZGF0YSAqKSBHMi5keW5fZHRyZWUpOworCQlHMi5jb21wcmVzc2VkX2xlbiArPSAzICsgRzIub3B0X2xlbjsKKwl9CisJQXNzZXJ0KEcyLmNvbXByZXNzZWRfbGVuID09IEcxLmJpdHNfc2VudCwgImJhZCBjb21wcmVzc2VkIHNpemUiKTsKKwlpbml0X2Jsb2NrKCk7CisKKwlpZiAoZW9mKSB7CisJCWJpX3dpbmR1cCgpOworCQlHMi5jb21wcmVzc2VkX2xlbiArPSA3OwkvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCisJfQorCVRyYWNldigoc3RkZXJyLCAiXG5jb21wcmxlbiAlbHUoJWx1KSAiLCBHMi5jb21wcmVzc2VkX2xlbiA+PiAzLAorCQkJRzIuY29tcHJlc3NlZF9sZW4gLSA3ICogZW9mKSk7CisKKwlyZXR1cm4gRzIuY29tcHJlc3NlZF9sZW4gPj4gMzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQorICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0hBU0goaCwgYykgKGggPSAoKChoKTw8SF9TSElGVCkgXiAoYykpICYgSEFTSF9NQVNLKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eQorICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpcworICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi4KKyAqCisgKiBQcm9jZXNzZXMgYSBuZXcgaW5wdXQgZmlsZSBhbmQgcmV0dXJuIGl0cyBjb21wcmVzc2VkIGxlbmd0aC4gU2V0cworICogdGhlIGNvbXByZXNzZWQgbGVuZ3RoLCBjcmMsIGRlZmxhdGUgZmxhZ3MgYW5kIGludGVybmFsIGZpbGUKKyAqIGF0dHJpYnV0ZXMuCisgKi8KKworLyogRmx1c2ggdGhlIGN1cnJlbnQgYmxvY2ssIHdpdGggZ2l2ZW4gZW5kLW9mLWZpbGUgZmxhZy4KKyAqIElOIGFzc2VydGlvbjogc3Ryc3RhcnQgaXMgc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWF0Y2guICovCisjZGVmaW5lIEZMVVNIX0JMT0NLKGVvZikgXAorCWZsdXNoX2Jsb2NrKCBcCisJCUcxLmJsb2NrX3N0YXJ0ID49IDBMIFwKKwkJCT8gKGNoYXIqKSZHMS53aW5kb3dbKHVuc2lnbmVkKUcxLmJsb2NrX3N0YXJ0XSBcCisJCQk6IChjaGFyKilOVUxMLCBcCisJCSh1bGcpRzEuc3Ryc3RhcnQgLSBHMS5ibG9ja19zdGFydCwgXAorCQkoZW9mKSBcCisJKQorCisvKiBJbnNlcnQgc3RyaW5nIHMgaW4gdGhlIGRpY3Rpb25hcnkgYW5kIHNldCBtYXRjaF9oZWFkIHRvIHRoZSBwcmV2aW91cyBoZWFkCisgKiBvZiB0aGUgaGFzaCBjaGFpbiAodGhlIG1vc3QgcmVjZW50IHN0cmluZyB3aXRoIHNhbWUgaGFzaCBrZXkpLiBSZXR1cm4KKyAqIHRoZSBwcmV2aW91cyBsZW5ndGggb2YgdGhlIGhhc2ggY2hhaW4uCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHMgYXJlIHZhbGlkCisgKiAgICAoZXhjZXB0IGZvciB0aGUgbGFzdCBNSU5fTUFUQ0gtMSBieXRlcyBvZiB0aGUgaW5wdXQgZmlsZSkuICovCisjZGVmaW5lIElOU0VSVF9TVFJJTkcocywgbWF0Y2hfaGVhZCkgXAorZG8geyBcCisJVVBEQVRFX0hBU0goRzEuaW5zX2gsIEcxLndpbmRvd1socykgKyBNSU5fTUFUQ0gtMV0pOyBcCisJRzEucHJldlsocykgJiBXTUFTS10gPSBtYXRjaF9oZWFkID0gaGVhZFtHMS5pbnNfaF07IFwKKwloZWFkW0cxLmluc19oXSA9IChzKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHVsZyBkZWZsYXRlKHZvaWQpCit7CisJSVBvcyBoYXNoX2hlYWQ7CQkvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi8KKwlJUG9zIHByZXZfbWF0Y2g7CS8qIHByZXZpb3VzIG1hdGNoICovCisJaW50IGZsdXNoOwkJCS8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCWludCBtYXRjaF9hdmFpbGFibGUgPSAwOwkvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovCisJdW5zaWduZWQgbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsJLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi8KKworCS8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqLworCXdoaWxlIChHMS5sb29rYWhlYWQgIT0gMCkgeworCQkvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisJCSAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorCQkgKi8KKwkJSU5TRVJUX1NUUklORyhHMS5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKworCQkvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorCQkgKi8KKwkJRzEucHJldl9sZW5ndGggPSBtYXRjaF9sZW5ndGg7CisJCXByZXZfbWF0Y2ggPSBHMS5tYXRjaF9zdGFydDsKKwkJbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKKworCQlpZiAoaGFzaF9oZWFkICE9IDAgJiYgRzEucHJldl9sZW5ndGggPCBtYXhfbGF6eV9tYXRjaAorCQkgJiYgRzEuc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QKKwkJKSB7CisJCQkvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworCQkJICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisJCQkgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisJCQkgKi8KKwkJCW1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2goaGFzaF9oZWFkKTsKKwkJCS8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisJCQlpZiAobWF0Y2hfbGVuZ3RoID4gRzEubG9va2FoZWFkKQorCQkJCW1hdGNoX2xlbmd0aCA9IEcxLmxvb2thaGVhZDsKKworCQkJLyogSWdub3JlIGEgbGVuZ3RoIDMgbWF0Y2ggaWYgaXQgaXMgdG9vIGRpc3RhbnQ6ICovCisJCQlpZiAobWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJiBHMS5zdHJzdGFydCAtIEcxLm1hdGNoX3N0YXJ0ID4gVE9PX0ZBUikgeworCQkJCS8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIEcxLm1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKKwkJCQkgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgorCQkJCSAqLworCQkJCW1hdGNoX2xlbmd0aC0tOworCQkJfQorCQl9CisJCS8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAorCQkgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgorCQkgKi8KKwkJaWYgKEcxLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBtYXRjaF9sZW5ndGggPD0gRzEucHJldl9sZW5ndGgpIHsKKwkJCWNoZWNrX21hdGNoKEcxLnN0cnN0YXJ0IC0gMSwgcHJldl9tYXRjaCwgRzEucHJldl9sZW5ndGgpOworCQkJZmx1c2ggPSBjdF90YWxseShHMS5zdHJzdGFydCAtIDEgLSBwcmV2X21hdGNoLCBHMS5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7CisKKwkJCS8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorCQkJICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuCisJCQkgKi8KKwkJCUcxLmxvb2thaGVhZCAtPSBHMS5wcmV2X2xlbmd0aCAtIDE7CisJCQlHMS5wcmV2X2xlbmd0aCAtPSAyOworCQkJZG8geworCQkJCUcxLnN0cnN0YXJ0Kys7CisJCQkJSU5TRVJUX1NUUklORyhHMS5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKwkJCQkvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCisJCQkJICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC4gSWYgbG9va2FoZWFkIDwgTUlOX01BVENICisJCQkJICogdGhlc2UgYnl0ZXMgYXJlIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdCBtYXR0ZXIgc2luY2UgdGhlCisJCQkJICogbmV4dCBsb29rYWhlYWQgYnl0ZXMgd2lsbCBhbHdheXMgYmUgZW1pdHRlZCBhcyBsaXRlcmFscy4KKwkJCQkgKi8KKwkJCX0gd2hpbGUgKC0tRzEucHJldl9sZW5ndGggIT0gMCk7CisJCQltYXRjaF9hdmFpbGFibGUgPSAwOworCQkJbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKKwkJCUcxLnN0cnN0YXJ0Kys7CisJCQlpZiAoZmx1c2gpIHsKKwkJCQlGTFVTSF9CTE9DSygwKTsKKwkJCQlHMS5ibG9ja19zdGFydCA9IEcxLnN0cnN0YXJ0OworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoX2F2YWlsYWJsZSkgeworCQkJLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGEKKwkJCSAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2gKKwkJCSAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuCisJCQkgKi8KKwkJCVRyYWNldnYoKHN0ZGVyciwgIiVjIiwgRzEud2luZG93W0cxLnN0cnN0YXJ0IC0gMV0pKTsKKwkJCWlmIChjdF90YWxseSgwLCBHMS53aW5kb3dbRzEuc3Ryc3RhcnQgLSAxXSkpIHsKKwkJCQlGTFVTSF9CTE9DSygwKTsKKwkJCQlHMS5ibG9ja19zdGFydCA9IEcxLnN0cnN0YXJ0OworCQkJfQorCQkJRzEuc3Ryc3RhcnQrKzsKKwkJCUcxLmxvb2thaGVhZC0tOworCQl9IGVsc2UgeworCQkJLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvcgorCQkJICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuCisJCQkgKi8KKwkJCW1hdGNoX2F2YWlsYWJsZSA9IDE7CisJCQlHMS5zdHJzdGFydCsrOworCQkJRzEubG9va2FoZWFkLS07CisJCX0KKwkJQXNzZXJ0KEcxLnN0cnN0YXJ0IDw9IEcxLmlzaXplICYmIGxvb2thaGVhZCA8PSBHMS5pc2l6ZSwgImEgYml0IHRvbyBmYXIiKTsKKworCQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKwkJICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKwkJICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisJCSAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisJCSAqLworCQl3aGlsZSAoRzEubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiAhRzEuZW9maWxlKQorCQkJZmlsbF93aW5kb3coKTsKKwl9CisJaWYgKG1hdGNoX2F2YWlsYWJsZSkKKwkJY3RfdGFsbHkoMCwgRzEud2luZG93W0cxLnN0cnN0YXJ0IC0gMV0pOworCisJcmV0dXJuIEZMVVNIX0JMT0NLKDEpOwkvKiBlb2YgKi8KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIGJpdCBzdHJpbmcgcm91dGluZXMuCisgKi8KK3N0YXRpYyB2b2lkIGJpX2luaXQodm9pZCkKK3sKKwlHMS5iaV9idWYgPSAwOworCUcxLmJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVRworCUcxLmJpdHNfc2VudCA9IDBMOworI2VuZGlmCit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSAibG9uZ2VzdCBtYXRjaCIgcm91dGluZXMgZm9yIGEgbmV3IGZpbGUKKyAqLworc3RhdGljIHZvaWQgbG1faW5pdCh1c2ggKiBmbGFnc3ApCit7CisJdW5zaWduZWQgajsKKworCS8qIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUuICovCisJbWVtc2V0KGhlYWQsIDAsIEhBU0hfU0laRSAqIHNpemVvZigqaGVhZCkpOworCS8qIHByZXYgd2lsbCBiZSBpbml0aWFsaXplZCBvbiB0aGUgZmx5ICovCisKKwkvKiBzcGVlZCBvcHRpb25zIGZvciB0aGUgZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICovCisJKmZsYWdzcCB8PSAyOwkvKiBGQVNUIDQsIFNMT1cgMiAqLworCS8qID8/PyByZWR1Y2UgbWF4X2NoYWluX2xlbmd0aCBmb3IgYmluYXJ5IGZpbGVzICovCisKKwlHMS5zdHJzdGFydCA9IDA7CisJRzEuYmxvY2tfc3RhcnQgPSAwTDsKKworCUcxLmxvb2thaGVhZCA9IGZpbGVfcmVhZChHMS53aW5kb3csCisJCQlzaXplb2YoaW50KSA8PSAyID8gKHVuc2lnbmVkKSBXU0laRSA6IDIgKiBXU0laRSk7CisKKwlpZiAoRzEubG9va2FoZWFkID09IDAgfHwgRzEubG9va2FoZWFkID09ICh1bnNpZ25lZCkgLTEpIHsKKwkJRzEuZW9maWxlID0gMTsKKwkJRzEubG9va2FoZWFkID0gMDsKKwkJcmV0dXJuOworCX0KKwlHMS5lb2ZpbGUgPSAwOworCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQuIFRoaXMgaXMgaW1wb3J0YW50CisJICogaWYgaW5wdXQgY29tZXMgZnJvbSBhIGRldmljZSBzdWNoIGFzIGEgdHR5LgorCSAqLworCXdoaWxlIChHMS5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmICFHMS5lb2ZpbGUpCisJCWZpbGxfd2luZG93KCk7CisKKwlHMS5pbnNfaCA9IDA7CisJZm9yIChqID0gMDsgaiA8IE1JTl9NQVRDSCAtIDE7IGorKykKKwkJVVBEQVRFX0hBU0goRzEuaW5zX2gsIEcxLndpbmRvd1tqXSk7CisJLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgdGhpcyBpcworCSAqIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC4KKwkgKi8KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEFsbG9jYXRlIHRoZSBtYXRjaCBidWZmZXIsIGluaXRpYWxpemUgdGhlIHZhcmlvdXMgdGFibGVzIGFuZCBzYXZlIHRoZQorICogbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlIChhc2NpaS9iaW5hcnkpIGFuZCBtZXRob2QKKyAqIChERUZMQVRFL1NUT1JFKS4KKyAqIE9uZSBjYWxsc2l0ZSBpbiB6aXAoKQorICovCitzdGF0aWMgdm9pZCBjdF9pbml0KHZvaWQpCit7CisJaW50IG47CQkJCS8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCWludCBsZW5ndGg7CQkJLyogbGVuZ3RoIHZhbHVlICovCisJaW50IGNvZGU7CQkJLyogY29kZSB2YWx1ZSAqLworCWludCBkaXN0OwkJCS8qIGRpc3RhbmNlIGluZGV4ICovCisKKwlHMi5jb21wcmVzc2VkX2xlbiA9IDBMOworCisjaWZkZWYgTk9UX05FRURFRAorCWlmIChHMi5zdGF0aWNfZHRyZWVbMF0uTGVuICE9IDApCisJCXJldHVybjsJCQkvKiBjdF9pbml0IGFscmVhZHkgY2FsbGVkICovCisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi8KKwlsZW5ndGggPSAwOworCWZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHsKKwkJRzIuYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7CisJCWZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykgeworCQkJRzIubGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTsKKwkJfQorCX0KKwlBc3NlcnQobGVuZ3RoID09IDI1NiwgImN0X2luaXQ6IGxlbmd0aCAhPSAyNTYiKTsKKwkvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAorCSAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlCisJICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOgorCSAqLworCUcyLmxlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTsKKworCS8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqLworCWRpc3QgPSAwOworCWZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7CisJCUcyLmJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7CisJCWZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykgeworCQkJRzIuZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlOworCQl9CisJfQorCUFzc2VydChkaXN0ID09IDI1NiwgImN0X2luaXQ6IGRpc3QgIT0gMjU2Iik7CisJZGlzdCA+Pj0gNzsJCQkvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KKwlmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykgeworCQlHMi5iYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7CisJCWZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykgeworCQkJRzIuZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSBjb2RlOworCQl9CisJfQorCUFzc2VydChkaXN0ID09IDI1NiwgImN0X2luaXQ6IDI1NitkaXN0ICE9IDUxMiIpOworCisJLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqLworCS8qIGFscmVhZHkgemVyb2VkIC0gaXQncyBpbiBic3MKKwlmb3IgKG4gPSAwOyBuIDw9IE1BWF9CSVRTOyBuKyspCisJCUcyLmJsX2NvdW50W25dID0gMDsgKi8KKworCW4gPSAwOworCXdoaWxlIChuIDw9IDE0MykgeworCQlHMi5zdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4OworCQlHMi5ibF9jb3VudFs4XSsrOworCX0KKwl3aGlsZSAobiA8PSAyNTUpIHsKKwkJRzIuc3RhdGljX2x0cmVlW24rK10uTGVuID0gOTsKKwkJRzIuYmxfY291bnRbOV0rKzsKKwl9CisJd2hpbGUgKG4gPD0gMjc5KSB7CisJCUcyLnN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDc7CisJCUcyLmJsX2NvdW50WzddKys7CisJfQorCXdoaWxlIChuIDw9IDI4NykgeworCQlHMi5zdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4OworCQlHMi5ibF9jb3VudFs4XSsrOworCX0KKwkvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUKKwkgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGUKKwkgKiBhbGwgb25lcykKKwkgKi8KKwlnZW5fY29kZXMoKGN0X2RhdGEgKikgRzIuc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSk7CisKKwkvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi8KKwlmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7CisJCUcyLnN0YXRpY19kdHJlZVtuXS5MZW4gPSA1OworCQlHMi5zdGF0aWNfZHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UobiwgNSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovCisJaW5pdF9ibG9jaygpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVmbGF0ZSBpbiB0byBvdXQuCisgKiBJTiBhc3NlcnRpb25zOiB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBjbGVhcmVkLgorICovCisKK3N0YXRpYyB2b2lkIHppcCh1bGcgdGltZV9zdGFtcCkKK3sKKwl1c2ggZGVmbGF0ZV9mbGFncyA9IDA7ICAvKiBwa3ppcCAtZXMsIC1lbiBvciAtZXggZXF1aXZhbGVudCAqLworCisJRzEub3V0Y250ID0gMDsKKworCS8qIFdyaXRlIHRoZSBoZWFkZXIgdG8gdGhlIGd6aXAgZmlsZS4gU2VlIGFsZ29yaXRobS5kb2MgZm9yIHRoZSBmb3JtYXQgKi8KKwkvKiBtYWdpYyBoZWFkZXIgZm9yIGd6aXAgZmlsZXM6IDFGIDhCICovCisJLyogY29tcHJlc3Npb24gbWV0aG9kOiA4IChERUZMQVRFRCkgKi8KKwkvKiBnZW5lcmFsIGZsYWdzOiAwICovCisJcHV0XzMyYml0KDB4MDAwODhiMWYpOworCXB1dF8zMmJpdCh0aW1lX3N0YW1wKTsKKworCS8qIFdyaXRlIGRlZmxhdGVkIGZpbGUgdG8gemlwIGZpbGUgKi8KKwlHMS5jcmMgPSB+MDsKKworCWJpX2luaXQoKTsKKwljdF9pbml0KCk7CisJbG1faW5pdCgmZGVmbGF0ZV9mbGFncyk7CisKKwlwdXRfOGJpdChkZWZsYXRlX2ZsYWdzKTsJLyogZXh0cmEgZmxhZ3MgKi8KKwlwdXRfOGJpdCgzKTsJLyogT1MgaWRlbnRpZmllciA9IDMgKFVuaXgpICovCisKKwlkZWZsYXRlKCk7CisKKwkvKiBXcml0ZSB0aGUgY3JjIGFuZCB1bmNvbXByZXNzZWQgc2l6ZSAqLworCXB1dF8zMmJpdCh+RzEuY3JjKTsKKwlwdXRfMzJiaXQoRzEuaXNpemUpOworCisJZmx1c2hfb3V0YnVmKCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DIHBhY2tfZ3ppcCh1bnBhY2tfaW5mb190ICppbmZvIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCisJLyogQ2xlYXIgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzICovCisJRzEub3V0Y250ID0gMDsKKyNpZmRlZiBERUJVRworCUcxLmluc2l6ZSA9IDA7CisjZW5kaWYKKwlHMS5pc2l6ZSA9IDA7CisKKwkvKiBSZWluaXQgRzIueHh4ICovCisJbWVtc2V0KCZHMiwgMCwgc2l6ZW9mKEcyKSk7CisJRzIubF9kZXNjLmR5bl90cmVlICAgICA9IEcyLmR5bl9sdHJlZTsKKwlHMi5sX2Rlc2Muc3RhdGljX3RyZWUgID0gRzIuc3RhdGljX2x0cmVlOworCUcyLmxfZGVzYy5leHRyYV9iaXRzICAgPSBleHRyYV9sYml0czsKKwlHMi5sX2Rlc2MuZXh0cmFfYmFzZSAgID0gTElURVJBTFMgKyAxOworCUcyLmxfZGVzYy5lbGVtcyAgICAgICAgPSBMX0NPREVTOworCUcyLmxfZGVzYy5tYXhfbGVuZ3RoICAgPSBNQVhfQklUUzsKKwkvL0cyLmxfZGVzYy5tYXhfY29kZSAgICAgPSAwOworCUcyLmRfZGVzYy5keW5fdHJlZSAgICAgPSBHMi5keW5fZHRyZWU7CisJRzIuZF9kZXNjLnN0YXRpY190cmVlICA9IEcyLnN0YXRpY19kdHJlZTsKKwlHMi5kX2Rlc2MuZXh0cmFfYml0cyAgID0gZXh0cmFfZGJpdHM7CisJLy9HMi5kX2Rlc2MuZXh0cmFfYmFzZSAgID0gMDsKKwlHMi5kX2Rlc2MuZWxlbXMgICAgICAgID0gRF9DT0RFUzsKKwlHMi5kX2Rlc2MubWF4X2xlbmd0aCAgID0gTUFYX0JJVFM7CisJLy9HMi5kX2Rlc2MubWF4X2NvZGUgICAgID0gMDsKKwlHMi5ibF9kZXNjLmR5bl90cmVlICAgID0gRzIuYmxfdHJlZTsKKwkvL0cyLmJsX2Rlc2Muc3RhdGljX3RyZWUgPSBOVUxMOworCUcyLmJsX2Rlc2MuZXh0cmFfYml0cyAgPSBleHRyYV9ibGJpdHMsCisJLy9HMi5ibF9kZXNjLmV4dHJhX2Jhc2UgID0gMDsKKwlHMi5ibF9kZXNjLmVsZW1zICAgICAgID0gQkxfQ09ERVM7CisJRzIuYmxfZGVzYy5tYXhfbGVuZ3RoICA9IE1BWF9CTF9CSVRTOworCS8vRzIuYmxfZGVzYy5tYXhfY29kZSAgICA9IDA7CisKKwlzLnN0X2N0aW1lID0gMDsKKwlmc3RhdChTVERJTl9GSUxFTk8sICZzKTsKKwl6aXAocy5zdF9jdGltZSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgZ3ppcF9sb25nb3B0c1tdIEFMSUdOMSA9CisJInN0ZG91dFwwIiAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImMiCisJInRvLXN0ZG91dFwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImMiCisJImZvcmNlXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJInZlcmJvc2VcMCIgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisjaWYgRU5BQkxFX0dVTlpJUAorCSJkZWNvbXByZXNzXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJkIgorCSJ1bmNvbXByZXNzXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJkIgorCSJ0ZXN0XDAiICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ0IgorI2VuZGlmCisJInF1aWV0XDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInEiCisJImZhc3RcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIjEiCisJImJlc3RcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIjkiCisJOworI2VuZGlmCisKKy8qCisgKiBMaW51eCBrZXJuZWwgYnVpbGQgdXNlcyBnemlwIC1kIC1uLiBXZSBhY2NlcHQgYW5kIGlnbm9yZSAtbi4KKyAqIE1hbiBwYWdlIHNheXM6CisgKiAtbiAtLW5vLW5hbWUKKyAqIGd6aXA6IGRvIG5vdCBzYXZlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgYW5kIHRpbWUgc3RhbXAuCisgKiAoVGhlIG9yaWdpbmFsIG5hbWUgaXMgYWx3YXlzIHNhdmVkIGlmIHRoZSBuYW1lIGhhZCB0byBiZSB0cnVuY2F0ZWQuKQorICogZ3VuemlwOiBkbyBub3QgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lL3RpbWUgZXZlbiBpZiBwcmVzZW50CisgKiAocmVtb3ZlIG9ubHkgdGhlIGd6aXAgc3VmZml4IGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSBuYW1lKS4KKyAqIFRoaXMgb3B0aW9uIGlzIHRoZSBkZWZhdWx0IHdoZW4gZGVjb21wcmVzc2luZy4KKyAqIC1OIC0tbmFtZQorICogZ3ppcDogYWx3YXlzIHNhdmUgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBhbmQgdGltZSBzdGFtcCAodGhpcyBpcyB0aGUgZGVmYXVsdCkKKyAqIGd1bnppcDogcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lIGFuZCB0aW1lIHN0YW1wIGlmIHByZXNlbnQuCisgKi8KKworaW50IGd6aXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworI2lmIEVOQUJMRV9HVU5aSVAKK2ludCBnemlwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorI2Vsc2UKK2ludCBnemlwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKKyNlbmRpZgoreworCXVuc2lnbmVkIG9wdDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGd6aXBfbG9uZ29wdHM7CisjZW5kaWYKKwkvKiBNdXN0IG1hdGNoIGJidW56aXAncyBjb25zdGFudHMgT1BUX1NURE9VVCwgT1BUX0ZPUkNFISAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJjZnYiIElGX0dVTlpJUCgiZHQiKSAicTEyMzQ1Njc4OW4iKTsKKyNpZiBFTkFCTEVfR1VOWklQIC8qIGd1bnppcF9tYWluIG1heSBub3QgYmUgdmlzaWJsZS4uLiAqLworCWlmIChvcHQgJiAweDE4KSAvLyAtZCBhbmQvb3IgLXQKKwkJcmV0dXJuIGd1bnppcF9tYWluKGFyZ2MsIGFyZ3YpOworI2VuZGlmCisJb3B0aW9uX21hc2szMiAmPSAweDc7IC8qIGlnbm9yZSAtcSwgLTAuLjkgKi8KKwkvL2lmIChvcHQgJiAweDEpIC8vIC1jCisJLy9pZiAob3B0ICYgMHgyKSAvLyAtZgorCS8vaWYgKG9wdCAmIDB4NCkgLy8gLXYKKwlhcmd2ICs9IG9wdGluZDsKKworCVNFVF9QVFJfVE9fR0xPQkFMUygoY2hhciAqKXh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnbG9iYWxzKStzaXplb2Yoc3RydWN0IGdsb2JhbHMyKSkKKwkJCSsgc2l6ZW9mKHN0cnVjdCBnbG9iYWxzKSk7CisKKwkvKiBBbGxvY2F0ZSBhbGwgZ2xvYmFsIGJ1ZmZlcnMgKGZvciBEWU5fQUxMT0Mgb3B0aW9uKSAqLworCUFMTE9DKHVjaCwgRzEubF9idWYsIElOQlVGU0laKTsKKwlBTExPQyh1Y2gsIEcxLm91dGJ1ZiwgT1VUQlVGU0laKTsKKwlBTExPQyh1c2gsIEcxLmRfYnVmLCBESVNUX0JVRlNJWkUpOworCUFMTE9DKHVjaCwgRzEud2luZG93LCAyTCAqIFdTSVpFKTsKKwlBTExPQyh1c2gsIEcxLnByZXYsIDFMIDw8IEJJVFMpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgQ1JDMzIgdGFibGUgKi8KKwlnbG9iYWxfY3JjMzJfdGFibGUgPSBjcmMzMl9maWxsdGFibGUoTlVMTCwgMCk7CisKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgcGFja19nemlwLCBhcHBlbmRfZXh0LCAiZ3oiKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGJjNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNjQgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0NPTU1PTl9GSUxFUzo9IFwKK1wKKwlkYXRhX3NraXAubyBcCisJZGF0YV9leHRyYWN0X2FsbC5vIFwKKwlkYXRhX2V4dHJhY3RfdG9fc3Rkb3V0Lm8gXAorXAorCWZpbHRlcl9hY2NlcHRfYWxsLm8gXAorCWZpbHRlcl9hY2NlcHRfbGlzdC5vIFwKKwlmaWx0ZXJfYWNjZXB0X3JlamVjdF9saXN0Lm8gXAorXAorCWhlYWRlcl9za2lwLm8gXAorCWhlYWRlcl9saXN0Lm8gXAorCWhlYWRlcl92ZXJib3NlX2xpc3QubyBcCitcCisJc2Vla19ieV9yZWFkLm8gXAorCXNlZWtfYnlfanVtcC5vIFwKK1wKKwlkYXRhX2FsaWduLm8gXAorCWZpbmRfbGlzdF9lbnRyeS5vIFwKKwlpbml0X2hhbmRsZS5vCisKK0RQS0dfRklMRVM6PSBcCisJZ2V0X2hlYWRlcl9hci5vIFwKKwl1bnBhY2tfYXJfYXJjaGl2ZS5vIFwKKwlnZXRfaGVhZGVyX3Rhci5vIFwKKwlmaWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ24ubworCitJTlNFUlQKKworbGliLSQoQ09ORklHX0FSKSAgICAgICAgICAgICAgICAgICAgICAgICs9IGdldF9oZWFkZXJfYXIubyB1bnBhY2tfYXJfYXJjaGl2ZS5vCitsaWItJChDT05GSUdfQlVOWklQMikgICAgICAgICAgICAgICAgICAgKz0gZGVjb21wcmVzc19idW56aXAyLm8KK2xpYi0kKENPTkZJR19VTkxaTUEpICAgICAgICAgICAgICAgICAgICArPSBkZWNvbXByZXNzX3VubHptYS5vCitsaWItJChDT05GSUdfVU5YWikgICAgICAgICAgICAgICAgICAgICAgKz0gZGVjb21wcmVzc191bnh6Lm8KK2xpYi0kKENPTkZJR19DUElPKSAgICAgICAgICAgICAgICAgICAgICArPSBnZXRfaGVhZGVyX2NwaW8ubworbGliLSQoQ09ORklHX0RQS0cpICAgICAgICAgICAgICAgICAgICAgICs9ICQoRFBLR19GSUxFUykKK2xpYi0kKENPTkZJR19EUEtHX0RFQikgICAgICAgICAgICAgICAgICArPSAkKERQS0dfRklMRVMpCitsaWItJChDT05GSUdfR1VOWklQKSAgICAgICAgICAgICAgICAgICAgKz0gZGVjb21wcmVzc191bnppcC5vCitsaWItJChDT05GSUdfUlBNMkNQSU8pICAgICAgICAgICAgICAgICAgKz0gZGVjb21wcmVzc191bnppcC5vIGdldF9oZWFkZXJfY3Bpby5vCitsaWItJChDT05GSUdfUlBNKSAgICAgICAgICAgICAgICAgICAgICAgKz0gb3Blbl90cmFuc2Zvcm1lci5vIGRlY29tcHJlc3NfdW56aXAubyBnZXRfaGVhZGVyX2NwaW8ubworbGliLSQoQ09ORklHX1RBUikgICAgICAgICAgICAgICAgICAgICAgICs9IGdldF9oZWFkZXJfdGFyLm8KK2xpYi0kKENPTkZJR19VTkNPTVBSRVNTKSAgICAgICAgICAgICAgICArPSBkZWNvbXByZXNzX3VuY29tcHJlc3MubworbGliLSQoQ09ORklHX1VOWklQKSAgICAgICAgICAgICAgICAgICAgICs9IGRlY29tcHJlc3NfdW56aXAubworbGliLSQoQ09ORklHX0xaT1ApICAgICAgICAgICAgICAgICAgICAgICs9IGx6bzF4XzEubyBsem8xeF8xby5vIGx6bzF4X2QubworbGliLSQoQ09ORklHX0xaT1BfQ09NUFJfSElHSCkgICAgICAgICAgICs9IGx6bzF4Xzl4Lm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1opICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc191bmNvbXByZXNzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0daKSAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc191bnppcC5vIGdldF9oZWFkZXJfdGFyX2d6Lm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMikgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc19idW56aXAyLm8gZ2V0X2hlYWRlcl90YXJfYnoyLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0xaTUEpICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc191bmx6bWEubyBnZXRfaGVhZGVyX3Rhcl9sem1hLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1haKSAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc191bnh6Lm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFKSAgICArPSBkZWNvbXByZXNzX2J1bnppcDIubworbGliLSQoQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfQkJDT05GSUcpICs9IGRlY29tcHJlc3NfYnVuemlwMi5vCitsaWItJChDT05GSUdfRkVBVFVSRV9UQVJfVE9fQ09NTUFORCkgICAgKz0gZGF0YV9leHRyYWN0X3RvX2NvbW1hbmQubworCitpZm5lcSAoJChsaWIteSksKQorbGliLXkgKz0gJChDT01NT05fRklMRVMpCitlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9MSUNFTlNFIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDM0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L0xJQ0VOU0UKQEAgLTAsMCArMSw0NCBAQAorYnppcDIgYXBwbGV0IGluIGJ1c3lib3ggaXMgYmFzZWQgb24gbGlnaHRseS1tb2RpZmllZCBzb3VyY2UKK29mIGJ6aXAyIHZlcnNpb24gMS4wLjQuIGJ6aXAyIHNvdXJjZSBpcyBkaXN0cmlidXRlZAordW5kZXIgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIChjb3BpZWQgdmVyYmF0aW0gZnJvbSBMSUNFTlNFIGZpbGUpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1RoaXMgcHJvZ3JhbSwgImJ6aXAyIiwgdGhlIGFzc29jaWF0ZWQgbGlicmFyeSAibGliYnppcDIiLCBhbmQgYWxsCitkb2N1bWVudGF0aW9uLCBhcmUgY29weXJpZ2h0IChDKSAxOTk2LTIwMDYgSnVsaWFuIFIgU2V3YXJkLiAgQWxsCityaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0CisgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgSWYgeW91IHVzZSB0aGlzCisgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0CisgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisKKzMuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3QKKyAgIG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisKKzQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgICBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCitHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCitJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworSnVsaWFuIFNld2FyZCwgQ2FtYnJpZGdlLCBVSy4KK2pzZXdhcmRAYnppcC5vcmcKK2J6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMS4wLjQgb2YgMjAgRGVjZW1iZXIgMjAwNgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9SRUFETUUgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmZkNDdiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9SRUFETUUKQEAgLTAsMCArMSw5MCBAQAorVGhpcyBmaWxlIGlzIGFuIGFicmlkZ2VkIHZlcnNpb24gb2YgUkVBRE1FIGZyb20gYnppcDIgMS4wLjQKK0J1aWxkIGluc3RydWN0aW9ucyAod2hpY2ggYXJlIG5vdCByZWxldmFudCB0byBidXN5Ym94ZWQgYnppcDIpCithcmUgcmVtb3ZlZC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworVGhpcyBpcyB0aGUgUkVBRE1FIGZvciBiemlwMi9saWJ6aXAyLgorVGhpcyB2ZXJzaW9uIGlzIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMgcHVibGljIHJlbGVhc2VzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIGJ6aXAyL2xpYmJ6aXAyLCBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yCitsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKK0NvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+CisKK1BsZWFzZSByZWFkIHRoZSBXQVJOSU5HLCBESVNDTEFJTUVSIGFuZCBQQVRFTlRTIHNlY3Rpb25zIGluIHRoaXMgZmlsZS4KKworVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBjb250YWluZWQKK2luIHRoZSBmaWxlIExJQ0VOU0UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUGxlYXNlIHJlYWQgYW5kIGJlIGF3YXJlIG9mIHRoZSBmb2xsb3dpbmc6CisKKworV0FSTklORzoKKworICAgVGhpcyBwcm9ncmFtIGFuZCBsaWJyYXJ5IChhdHRlbXB0cyB0bykgY29tcHJlc3MgZGF0YSBieQorICAgcGVyZm9ybWluZyBzZXZlcmFsIG5vbi10cml2aWFsIHRyYW5zZm9ybWF0aW9ucyBvbiBpdC4KKyAgIFVubGVzcyB5b3UgYXJlIDEwMCUgZmFtaWxpYXIgd2l0aCAqYWxsKiB0aGUgYWxnb3JpdGhtcworICAgY29udGFpbmVkIGhlcmVpbiwgYW5kIHdpdGggdGhlIGNvbnNlcXVlbmNlcyBvZiBtb2RpZnlpbmcgdGhlbSwKKyAgIHlvdSBzaG91bGQgTk9UIG1lZGRsZSB3aXRoIHRoZSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uCisgICBtYWNoaW5lcnkuICBJbmNvcnJlY3QgY2hhbmdlcyBjYW4gYW5kIHZlcnkgbGlrZWx5ICp3aWxsKgorICAgbGVhZCB0byBkaXNhc3Ryb3VzIGxvc3Mgb2YgZGF0YS4KKworCitESVNDTEFJTUVSOgorCisgICBJIFRBS0UgTk8gUkVTUE9OU0lCSUxJVFkgRk9SIEFOWSBMT1NTIE9GIERBVEEgQVJJU0lORyBGUk9NIFRIRQorICAgVVNFIE9GIFRISVMgUFJPR1JBTS9MSUJSQVJZLCBIT1dTT0VWRVIgQ0FVU0VELgorCisgICBFdmVyeSBjb21wcmVzc2lvbiBvZiBhIGZpbGUgaW1wbGllcyBhbiBhc3N1bXB0aW9uIHRoYXQgdGhlCisgICBjb21wcmVzc2VkIGZpbGUgY2FuIGJlIGRlY29tcHJlc3NlZCB0byByZXByb2R1Y2UgdGhlIG9yaWdpbmFsLgorICAgR3JlYXQgZWZmb3J0cyBpbiBkZXNpZ24sIGNvZGluZyBhbmQgdGVzdGluZyBoYXZlIGJlZW4gbWFkZSB0bworICAgZW5zdXJlIHRoYXQgdGhpcyBwcm9ncmFtIHdvcmtzIGNvcnJlY3RseS4gIEhvd2V2ZXIsIHRoZSBjb21wbGV4aXR5CisgICBvZiB0aGUgYWxnb3JpdGhtcywgYW5kLCBpbiBwYXJ0aWN1bGFyLCB0aGUgcHJlc2VuY2Ugb2YgdmFyaW91cworICAgc3BlY2lhbCBjYXNlcyBpbiB0aGUgY29kZSB3aGljaCBvY2N1ciB3aXRoIHZlcnkgbG93IGJ1dCBub24temVybworICAgcHJvYmFiaWxpdHkgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIHJ1bGUgb3V0IHRoZSBwb3NzaWJpbGl0eSBvZiBidWdzCisgICByZW1haW5pbmcgaW4gdGhlIHByb2dyYW0uICBETyBOT1QgQ09NUFJFU1MgQU5ZIERBVEEgV0lUSCBUSElTCisgICBQUk9HUkFNIFVOTEVTUyBZT1UgQVJFIFBSRVBBUkVEIFRPIEFDQ0VQVCBUSEUgUE9TU0lCSUxJVFksIEhPV0VWRVIKKyAgIFNNQUxMLCBUSEFUIFRIRSBEQVRBIFdJTEwgTk9UIEJFIFJFQ09WRVJBQkxFLgorCisgICBUaGF0IGlzIG5vdCB0byBzYXkgdGhpcyBwcm9ncmFtIGlzIGluaGVyZW50bHkgdW5yZWxpYWJsZS4KKyAgIEluZGVlZCwgSSB2ZXJ5IG11Y2ggaG9wZSB0aGUgb3Bwb3NpdGUgaXMgdHJ1ZS4gIGJ6aXAyL2xpYmJ6aXAyCisgICBoYXMgYmVlbiBjYXJlZnVsbHkgY29uc3RydWN0ZWQgYW5kIGV4dGVuc2l2ZWx5IHRlc3RlZC4KKworCitQQVRFTlRTOgorCisgICBUbyB0aGUgYmVzdCBvZiBteSBrbm93bGVkZ2UsIGJ6aXAyL2xpYmJ6aXAyIGRvZXMgbm90IHVzZSBhbnkKKyAgIHBhdGVudGVkIGFsZ29yaXRobXMuICBIb3dldmVyLCBJIGRvIG5vdCBoYXZlIHRoZSByZXNvdXJjZXMKKyAgIHRvIGNhcnJ5IG91dCBhIHBhdGVudCBzZWFyY2guICBUaGVyZWZvcmUgSSBjYW5ub3QgZ2l2ZSBhbnkKKyAgIGd1YXJhbnRlZSBvZiB0aGUgYWJvdmUgc3RhdGVtZW50LgorCisKK0kgaG9wZSB5b3UgZmluZCBiemlwMiB1c2VmdWwuICBGZWVsIGZyZWUgdG8gY29udGFjdCBtZSBhdAorICAganNld2FyZEBiemlwLm9yZworaWYgeW91IGhhdmUgYW55IHN1Z2dlc3Rpb25zIG9yIHF1ZXJpZXMuICBNYW55IHBlb3BsZSBtYWlsZWQgbWUgd2l0aAorY29tbWVudHMsIHN1Z2dlc3Rpb25zIGFuZCBwYXRjaGVzIGFmdGVyIHRoZSByZWxlYXNlcyBvZiBiemlwLTAuMTUsCitiemlwLTAuMjEsIGFuZCBiemlwMiB2ZXJzaW9ucyAwLjFwbDIsIDAuOS4wLCAwLjkuNSwgMS4wLjAsIDEuMC4xLAorMS4wLjIgYW5kIDEuMC4zLCBhbmQgdGhlIGNoYW5nZXMgaW4gYnppcDIgYXJlIGxhcmdlbHkgYSByZXN1bHQgb2YgdGhpcworZmVlZGJhY2suICBJIHRoYW5rIHlvdSBmb3IgeW91ciBjb21tZW50cy4KKworYnppcDIncyAiaG9tZSIgaXMgaHR0cDovL3d3dy5iemlwLm9yZy8KKworSnVsaWFuIFNld2FyZAoranNld2FyZEBiemlwLm9yZworQ2FtYnJpZGdlLCBVSy4KKworMTggICAgIEp1bHkgMTk5NiAodmVyc2lvbiAwLjE1KQorMjUgICBBdWd1c3QgMTk5NiAodmVyc2lvbiAwLjIxKQorIDcgICBBdWd1c3QgMTk5NyAoYnppcDIsIHZlcnNpb24gMC4xKQorMjkgICBBdWd1c3QgMTk5NyAoYnppcDIsIHZlcnNpb24gMC4xcGwyKQorMjMgICBBdWd1c3QgMTk5OCAoYnppcDIsIHZlcnNpb24gMC45LjApCisgOCAgICAgSnVuZSAxOTk5IChiemlwMiwgdmVyc2lvbiAwLjkuNSkKKyA0ICAgICBTZXB0IDE5OTkgKGJ6aXAyLCB2ZXJzaW9uIDAuOS41ZCkKKyA1ICAgICAgTWF5IDIwMDAgKGJ6aXAyLCB2ZXJzaW9uIDEuMHByZTgpCiszMCBEZWNlbWJlciAyMDAxIChiemlwMiwgdmVyc2lvbiAxLjAuMnByZTEpCisxNSBGZWJydWFyeSAyMDA1IChiemlwMiwgdmVyc2lvbiAxLjAuMykKKzIwIERlY2VtYmVyIDIwMDYgKGJ6aXAyLCB2ZXJzaW9uIDEuMC40KQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9ibG9ja3NvcnQuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYmxvY2tzb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwYzM3MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYmxvY2tzb3J0LmMKQEAgLTAsMCArMSwxMDcyIEBACisvKgorICogYnppcDIgaXMgd3JpdHRlbiBieSBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPi4KKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4uCisgKiBTZWUgUkVBRE1FIGFuZCBMSUNFTlNFIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBCbG9jayBzb3J0aW5nIG1hY2hpbmVyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzb3J0LmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgYnppcDIvbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQgbGlicmFyeSBmb3IKK2xvc3NsZXNzLCBibG9jay1zb3J0aW5nIGRhdGEgY29tcHJlc3Npb24uCisKK2J6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMS4wLjQgb2YgMjAgRGVjZW1iZXIgMjAwNgorQ29weXJpZ2h0IChDKSAxOTk2LTIwMDYgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4KKworUGxlYXNlIHJlYWQgdGhlIFdBUk5JTkcsIERJU0NMQUlNRVIgYW5kIFBBVEVOVFMgc2VjdGlvbnMgaW4gdGhlCitSRUFETUUgZmlsZS4KKworVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBjb250YWluZWQKK2luIHRoZSBmaWxlIExJQ0VOU0UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogI2luY2x1ZGUgImJ6bGliX3ByaXZhdGUuaCIgKi8KKworI2RlZmluZSBtc3dhcCh6ejEsIHp6MikgXAoreyBcCisJaW50MzJfdCB6enRtcCA9IHp6MTsgXAorCXp6MSA9IHp6MjsgXAorCXp6MiA9IHp6dG1wOyBcCit9CisKK3N0YXRpYworLyogTm8gbWVhc3VyYWJsZSBzcGVlZCBnYWluIHdpdGggaW5saW5pbmcgKi8KKy8qIEFMV0FZU19JTkxJTkUgKi8KK3ZvaWQgbXZzd2FwKHVpbnQzMl90KiBwdHIsIGludDMyX3QgenpwMSwgaW50MzJfdCB6enAyLCBpbnQzMl90IHp6bikKK3sKKwl3aGlsZSAoenpuID4gMCkgeworCQltc3dhcChwdHJbenpwMV0sIHB0clt6enAyXSk7CisJCXp6cDErKzsKKwkJenpwMisrOworCQl6em4tLTsKKwl9Cit9CisKK3N0YXRpYworQUxXQVlTX0lOTElORQoraW50MzJfdCBtbWluKGludDMyX3QgYSwgaW50MzJfdCBiKQoreworCXJldHVybiAoYSA8IGIpID8gYSA6IGI7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gRmFsbGJhY2sgTyhOIGxvZyhOKV4yKSBzb3J0aW5nICAgICAgICAtLS0qLworLyotLS0gYWxnb3JpdGhtLCBmb3IgcmVwZXRpdGl2ZSBibG9ja3MgICAgICAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK2lubGluZQordm9pZCBmYWxsYmFja1NpbXBsZVNvcnQodWludDMyX3QqIGZtYXAsCisJCXVpbnQzMl90KiBlY2xhc3MsCisJCWludDMyX3QgICBsbywKKwkJaW50MzJfdCAgIGhpKQoreworCWludDMyX3QgaSwgaiwgdG1wOworCXVpbnQzMl90IGVjX3RtcDsKKworCWlmIChsbyA9PSBoaSkgcmV0dXJuOworCisJaWYgKGhpIC0gbG8gPiAzKSB7CisJCWZvciAoaSA9IGhpLTQ7IGkgPj0gbG87IGktLSkgeworCQkJdG1wID0gZm1hcFtpXTsKKwkJCWVjX3RtcCA9IGVjbGFzc1t0bXBdOworCQkJZm9yIChqID0gaSs0OyBqIDw9IGhpICYmIGVjX3RtcCA+IGVjbGFzc1tmbWFwW2pdXTsgaiArPSA0KQorCQkJCWZtYXBbai00XSA9IGZtYXBbal07CisJCQlmbWFwW2otNF0gPSB0bXA7CisJCX0KKwl9CisKKwlmb3IgKGkgPSBoaS0xOyBpID49IGxvOyBpLS0pIHsKKwkJdG1wID0gZm1hcFtpXTsKKwkJZWNfdG1wID0gZWNsYXNzW3RtcF07CisJCWZvciAoaiA9IGkrMTsgaiA8PSBoaSAmJiBlY190bXAgPiBlY2xhc3NbZm1hcFtqXV07IGorKykKKwkJCWZtYXBbai0xXSA9IGZtYXBbal07CisJCWZtYXBbai0xXSA9IHRtcDsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBmcHVzaChseixoeikgeyBcCisJc3RhY2tMb1tzcF0gPSBsejsgXAorCXN0YWNrSGlbc3BdID0gaHo7IFwKKwlzcCsrOyBcCit9CisKKyNkZWZpbmUgZnBvcChseixoeikgeyBcCisJc3AtLTsgXAorCWx6ID0gc3RhY2tMb1tzcF07IFwKKwloeiA9IHN0YWNrSGlbc3BdOyBcCit9CisKKyNkZWZpbmUgRkFMTEJBQ0tfUVNPUlRfU01BTExfVEhSRVNIIDEwCisjZGVmaW5lIEZBTExCQUNLX1FTT1JUX1NUQUNLX1NJWkUgICAxMDAKKworc3RhdGljCit2b2lkIGZhbGxiYWNrUVNvcnQzKHVpbnQzMl90KiBmbWFwLAorCQl1aW50MzJfdCogZWNsYXNzLAorCQlpbnQzMl90ICAgbG9TdCwKKwkJaW50MzJfdCAgIGhpU3QpCit7CisJaW50MzJfdCB1bkxvLCB1bkhpLCBsdExvLCBndEhpLCBuLCBtOworCWludDMyX3Qgc3AsIGxvLCBoaTsKKwl1aW50MzJfdCBtZWQsIHIsIHIzOworCWludDMyX3Qgc3RhY2tMb1tGQUxMQkFDS19RU09SVF9TVEFDS19TSVpFXTsKKwlpbnQzMl90IHN0YWNrSGlbRkFMTEJBQ0tfUVNPUlRfU1RBQ0tfU0laRV07CisKKwlyID0gMDsKKworCXNwID0gMDsKKwlmcHVzaChsb1N0LCBoaVN0KTsKKworCXdoaWxlIChzcCA+IDApIHsKKwkJQXNzZXJ0SChzcCA8IEZBTExCQUNLX1FTT1JUX1NUQUNLX1NJWkUgLSAxLCAxMDA0KTsKKworCQlmcG9wKGxvLCBoaSk7CisJCWlmIChoaSAtIGxvIDwgRkFMTEJBQ0tfUVNPUlRfU01BTExfVEhSRVNIKSB7CisJCQlmYWxsYmFja1NpbXBsZVNvcnQoZm1hcCwgZWNsYXNzLCBsbywgaGkpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBSYW5kb20gcGFydGl0aW9uaW5nLiAgTWVkaWFuIG9mIDMgc29tZXRpbWVzIGZhaWxzIHRvCisJCSAqIGF2b2lkIGJhZCBjYXNlcy4gIE1lZGlhbiBvZiA5IHNlZW1zIHRvIGhlbHAgYnV0CisJCSAqIGxvb2tzIHJhdGhlciBleHBlbnNpdmUuICBUaGlzIHRvbyBzZWVtcyB0byB3b3JrIGJ1dAorCQkgKiBpcyBjaGVhcGVyLiAgR3VpZGFuY2UgZm9yIHRoZSBtYWdpYyBjb25zdGFudHMKKwkJICogNzYyMSBhbmQgMzI3NjggaXMgdGFrZW4gZnJvbSBTZWRnZXdpY2sncyBhbGdvcml0aG1zCisJCSAqIGJvb2ssIGNoYXB0ZXIgMzUuCisJCSAqLworCQlyID0gKChyICogNzYyMSkgKyAxKSAlIDMyNzY4OworCQlyMyA9IHIgJSAzOworCQlpZiAocjMgPT0gMCkKKwkJCW1lZCA9IGVjbGFzc1tmbWFwW2xvXV07CisJCWVsc2UgaWYgKHIzID09IDEpCisJCQltZWQgPSBlY2xhc3NbZm1hcFsobG8raGkpPj4xXV07CisJCWVsc2UKKwkJCW1lZCA9IGVjbGFzc1tmbWFwW2hpXV07CisKKwkJdW5MbyA9IGx0TG8gPSBsbzsKKwkJdW5IaSA9IGd0SGkgPSBoaTsKKworCQl3aGlsZSAoMSkgeworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAodW5MbyA+IHVuSGkpIGJyZWFrOworCQkJCW4gPSAoaW50MzJfdCllY2xhc3NbZm1hcFt1bkxvXV0gLSAoaW50MzJfdCltZWQ7CisJCQkJaWYgKG4gPT0gMCkgeworCQkJCQltc3dhcChmbWFwW3VuTG9dLCBmbWFwW2x0TG9dKTsKKwkJCQkJbHRMbysrOworCQkJCQl1bkxvKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX07CisJCQkJaWYgKG4gPiAwKSBicmVhazsKKwkJCQl1bkxvKys7CisJCQl9CisJCQl3aGlsZSAoMSkgeworCQkJCWlmICh1bkxvID4gdW5IaSkgYnJlYWs7CisJCQkJbiA9IChpbnQzMl90KWVjbGFzc1tmbWFwW3VuSGldXSAtIChpbnQzMl90KW1lZDsKKwkJCQlpZiAobiA9PSAwKSB7CisJCQkJCW1zd2FwKGZtYXBbdW5IaV0sIGZtYXBbZ3RIaV0pOworCQkJCQlndEhpLS07IHVuSGktLTsKKwkJCQkJY29udGludWU7CisJCQkJfTsKKwkJCQlpZiAobiA8IDApIGJyZWFrOworCQkJCXVuSGktLTsKKwkJCX0KKwkJCWlmICh1bkxvID4gdW5IaSkgYnJlYWs7CisJCQltc3dhcChmbWFwW3VuTG9dLCBmbWFwW3VuSGldKTsgdW5MbysrOyB1bkhpLS07CisJCX0KKworCQlBc3NlcnREKHVuSGkgPT0gdW5Mby0xLCAiZmFsbGJhY2tRU29ydDMoMikiKTsKKworCQlpZiAoZ3RIaSA8IGx0TG8pIGNvbnRpbnVlOworCisJCW4gPSBtbWluKGx0TG8tbG8sIHVuTG8tbHRMbyk7IG12c3dhcChmbWFwLCBsbywgdW5Mby1uLCBuKTsKKwkJbSA9IG1taW4oaGktZ3RIaSwgZ3RIaS11bkhpKTsgbXZzd2FwKGZtYXAsIHVuTG8sIGhpLW0rMSwgbSk7CisKKwkJbiA9IGxvICsgdW5MbyAtIGx0TG8gLSAxOworCQltID0gaGkgLSAoZ3RIaSAtIHVuSGkpICsgMTsKKworCQlpZiAobiAtIGxvID4gaGkgLSBtKSB7CisJCQlmcHVzaChsbywgbik7CisJCQlmcHVzaChtLCBoaSk7CisJCX0gZWxzZSB7CisJCQlmcHVzaChtLCBoaSk7CisJCQlmcHVzaChsbywgbik7CisJCX0KKwl9Cit9CisKKyN1bmRlZiBmcHVzaAorI3VuZGVmIGZwb3AKKyN1bmRlZiBGQUxMQkFDS19RU09SVF9TTUFMTF9USFJFU0gKKyN1bmRlZiBGQUxMQkFDS19RU09SVF9TVEFDS19TSVpFCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJlOgorICoJbmJsb2NrID4gMAorICoJZWNsYXNzIGV4aXN0cyBmb3IgWzAgLi4gbmJsb2NrLTFdCisgKgkoKHVpbnQ4X3QqKWVjbGFzcykgWzAgLi4gbmJsb2NrLTFdIGhvbGRzIGJsb2NrCisgKglwdHIgZXhpc3RzIGZvciBbMCAuLiBuYmxvY2stMV0KKyAqCisgKiBQb3N0OgorICoJKCh1aW50OF90KillY2xhc3MpIFswIC4uIG5ibG9jay0xXSBob2xkcyBibG9jaworICoJQWxsIG90aGVyIGFyZWFzIG9mIGVjbGFzcyBkZXN0cm95ZWQKKyAqCWZtYXAgWzAgLi4gbmJsb2NrLTFdIGhvbGRzIHNvcnRlZCBvcmRlcgorICoJYmh0YWJbMCAuLiAyKyhuYmxvY2svMzIpXSBkZXN0cm95ZWQKKyovCisKKyNkZWZpbmUgICAgICAgU0VUX0JIKHp6KSAgYmh0YWJbKHp6KSA+PiA1XSB8PSAoMSA8PCAoKHp6KSAmIDMxKSkKKyNkZWZpbmUgICAgIENMRUFSX0JIKHp6KSAgYmh0YWJbKHp6KSA+PiA1XSAmPSB+KDEgPDwgKCh6eikgJiAzMSkpCisjZGVmaW5lICAgICBJU1NFVF9CSCh6eikgIChiaHRhYlsoenopID4+IDVdICYgKDEgPDwgKCh6eikgJiAzMSkpKQorI2RlZmluZSAgICAgIFdPUkRfQkgoenopICBiaHRhYlsoenopID4+IDVdCisjZGVmaW5lIFVOQUxJR05FRF9CSCh6eikgICgoenopICYgMHgwMWYpCisKK3N0YXRpYwordm9pZCBmYWxsYmFja1NvcnQodWludDMyX3QqIGZtYXAsCisJCXVpbnQzMl90KiBlY2xhc3MsCisJCXVpbnQzMl90KiBiaHRhYiwKKwkJaW50MzJfdCAgIG5ibG9jaykKK3sKKwlpbnQzMl90IGZ0YWJbMjU3XTsKKwlpbnQzMl90IGZ0YWJDb3B5WzI1Nl07CisJaW50MzJfdCBILCBpLCBqLCBrLCBsLCByLCBjYywgY2MxOworCWludDMyX3Qgbk5vdERvbmU7CisJaW50MzJfdCBuQmh0YWI7CisJdWludDhfdCogZWNsYXNzOCA9ICh1aW50OF90KillY2xhc3M7CisKKwkvKgorCSAqIEluaXRpYWwgMS1jaGFyIHJhZGl4IHNvcnQgdG8gZ2VuZXJhdGUKKwkgKiBpbml0aWFsIGZtYXAgYW5kIGluaXRpYWwgQkggYml0cy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU3OyAgICBpKyspIGZ0YWJbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBuYmxvY2s7IGkrKykgZnRhYltlY2xhc3M4W2ldXSsrOworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICAgIGkrKykgZnRhYkNvcHlbaV0gPSBmdGFiW2ldOworCisJaiA9IGZ0YWJbMF07ICAvKiBiYm94OiBvcHRpbWl6ZWQgKi8KKwlmb3IgKGkgPSAxOyBpIDwgMjU3OyAgICBpKyspIHsKKwkJaiArPSBmdGFiW2ldOworCQlmdGFiW2ldID0gajsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspIHsKKwkJaiA9IGVjbGFzczhbaV07CisJCWsgPSBmdGFiW2pdIC0gMTsKKwkJZnRhYltqXSA9IGs7CisJCWZtYXBba10gPSBpOworCX0KKworCW5CaHRhYiA9IDIgKyAoKHVpbnQzMl90KW5ibG9jayAvIDMyKTsgLyogYmJveDogdW5zaWduZWQgZGl2IGlzIGVhc2llciAqLworCWZvciAoaSA9IDA7IGkgPCBuQmh0YWI7IGkrKykgYmh0YWJbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgU0VUX0JIKGZ0YWJbaV0pOworCisJLyoKKwkgKiBJbmR1Y3RpdmVseSByZWZpbmUgdGhlIGJ1Y2tldHMuICBLaW5kLW9mIGFuCisJICogImV4cG9uZW50aWFsIHJhZGl4IHNvcnQiICghKSwgaW5zcGlyZWQgYnkgdGhlCisJICogTWFuYmVyLU15ZXJzIHN1ZmZpeCBhcnJheSBjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLgorCSAqLworCisJLyotLSBzZXQgc2VudGluZWwgYml0cyBmb3IgYmxvY2stZW5kIGRldGVjdGlvbiAtLSovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJU0VUX0JIKG5ibG9jayArIDIqaSk7CisJCUNMRUFSX0JIKG5ibG9jayArIDIqaSArIDEpOworCX0KKworCS8qLS0gdGhlIGxvZyhOKSBsb29wIC0tKi8KKwlIID0gMTsKKwl3aGlsZSAoMSkgeworCQlqID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG5ibG9jazsgaSsrKSB7CisJCQlpZiAoSVNTRVRfQkgoaSkpCisJCQkJaiA9IGk7CisJCQlrID0gZm1hcFtpXSAtIEg7CisJCQlpZiAoayA8IDApCisJCQkJayArPSBuYmxvY2s7CisJCQllY2xhc3Nba10gPSBqOworCQl9CisKKwkJbk5vdERvbmUgPSAwOworCQlyID0gLTE7CisJCXdoaWxlICgxKSB7CisKKwkJLyotLSBmaW5kIHRoZSBuZXh0IG5vbi1zaW5nbGV0b24gYnVja2V0IC0tKi8KKwkJCWsgPSByICsgMTsKKwkJCXdoaWxlIChJU1NFVF9CSChrKSAmJiBVTkFMSUdORURfQkgoaykpCisJCQkJaysrOworCQkJaWYgKElTU0VUX0JIKGspKSB7CisJCQkJd2hpbGUgKFdPUkRfQkgoaykgPT0gMHhmZmZmZmZmZikgayArPSAzMjsKKwkJCQl3aGlsZSAoSVNTRVRfQkgoaykpIGsrKzsKKwkJCX0KKwkJCWwgPSBrIC0gMTsKKwkJCWlmIChsID49IG5ibG9jaykKKwkJCQlicmVhazsKKwkJCXdoaWxlICghSVNTRVRfQkgoaykgJiYgVU5BTElHTkVEX0JIKGspKQorCQkJCWsrKzsKKwkJCWlmICghSVNTRVRfQkgoaykpIHsKKwkJCQl3aGlsZSAoV09SRF9CSChrKSA9PSAweDAwMDAwMDAwKSBrICs9IDMyOworCQkJCXdoaWxlICghSVNTRVRfQkgoaykpIGsrKzsKKwkJCX0KKwkJCXIgPSBrIC0gMTsKKwkJCWlmIChyID49IG5ibG9jaykKKwkJCQlicmVhazsKKworCQkJLyotLSBub3cgW2wsIHJdIGJyYWNrZXQgY3VycmVudCBidWNrZXQgLS0qLworCQkJaWYgKHIgPiBsKSB7CisJCQkJbk5vdERvbmUgKz0gKHIgLSBsICsgMSk7CisJCQkJZmFsbGJhY2tRU29ydDMoZm1hcCwgZWNsYXNzLCBsLCByKTsKKworCQkJCS8qLS0gc2NhbiBidWNrZXQgYW5kIGdlbmVyYXRlIGhlYWRlciBiaXRzLS0gKi8KKwkJCQljYyA9IC0xOworCQkJCWZvciAoaSA9IGw7IGkgPD0gcjsgaSsrKSB7CisJCQkJCWNjMSA9IGVjbGFzc1tmbWFwW2ldXTsKKwkJCQkJaWYgKGNjICE9IGNjMSkgeworCQkJCQkJU0VUX0JIKGkpOworCQkJCQkJY2MgPSBjYzE7CisJCQkJCX07CisJCQkJfQorCQkJfQorCQl9CisKKwkJSCAqPSAyOworCQlpZiAoSCA+IG5ibG9jayB8fCBuTm90RG9uZSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBSZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgYmxvY2sgaW4KKwkgKiBlY2xhc3M4IFswIC4uIG5ibG9jay0xXSwgc2luY2UgdGhlCisJICogcHJldmlvdXMgcGhhc2UgZGVzdHJveWVkIGl0LgorCSAqLworCWogPSAwOworCWZvciAoaSA9IDA7IGkgPCBuYmxvY2s7IGkrKykgeworCQl3aGlsZSAoZnRhYkNvcHlbal0gPT0gMCkKKwkJCWorKzsKKwkJZnRhYkNvcHlbal0tLTsKKwkJZWNsYXNzOFtmbWFwW2ldXSA9ICh1aW50OF90KWo7CisJfQorCUFzc2VydEgoaiA8IDI1NiwgMTAwNSk7Cit9CisKKyN1bmRlZiAgICAgICBTRVRfQkgKKyN1bmRlZiAgICAgQ0xFQVJfQkgKKyN1bmRlZiAgICAgSVNTRVRfQkgKKyN1bmRlZiAgICAgIFdPUkRfQkgKKyN1bmRlZiBVTkFMSUdORURfQkgKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBUaGUgbWFpbiwgTyhOXjIgbG9nKE4pKSBzb3J0aW5nICAgICAgIC0tLSovCisvKi0tLSBhbGdvcml0aG0uICBGYXN0ZXIgZm9yICJub3JtYWwiICAgICAgIC0tLSovCisvKi0tLSBub24tcmVwZXRpdGl2ZSBibG9ja3MuICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworTk9JTkxJTkUKK2ludCBtYWluR3RVKAorCQl1aW50MzJfdCAgaTEsCisJCXVpbnQzMl90ICBpMiwKKwkJdWludDhfdCogIGJsb2NrLAorCQl1aW50MTZfdCogcXVhZHJhbnQsCisJCXVpbnQzMl90ICBuYmxvY2ssCisJCWludDMyX3QqICBidWRnZXQpCit7CisJaW50MzJfdCAgazsKKwl1aW50OF90ICBjMSwgYzI7CisJdWludDE2X3QgczEsIHMyOworCisvKiBMb29wIHVucm9sbGluZyBoZXJlIGlzIGFjdHVhbGx5IHZlcnkgdXNlZnVsCisgKiAoZ2VuZXJhdGVkIGNvZGUgaXMgbXVjaCBzaW1wbGVyKSwKKyAqIGNvZGUgc2l6ZSBpbmNyZWFzZSBpcyBvbmx5IDI3MCBieXRlcyAoaTM4NikKKyAqIGJ1dCBzcGVlZHMgdXAgY29tcHJlc3Npb24gMTAlIG92ZXJhbGwKKyAqLworCisjaWYgQ09ORklHX0JaSVAyX0ZFQVRVUkVfU1BFRUQgPj0gMQorCisjZGVmaW5lIFRJTUVTXzgoY29kZSkgXAorCWNvZGU7IGNvZGU7IGNvZGU7IGNvZGU7IFwKKwljb2RlOyBjb2RlOyBjb2RlOyBjb2RlOworI2RlZmluZSBUSU1FU18xMihjb2RlKSBcCisJY29kZTsgY29kZTsgY29kZTsgY29kZTsgXAorCWNvZGU7IGNvZGU7IGNvZGU7IGNvZGU7IFwKKwljb2RlOyBjb2RlOyBjb2RlOyBjb2RlOworCisjZWxzZQorCisjZGVmaW5lIFRJTUVTXzgoY29kZSkgXAoreyBcCisJaW50IG5uID0gODsgXAorCWRvIHsgXAorCQljb2RlOyBcCisJfSB3aGlsZSAoLS1ubik7IFwKK30KKyNkZWZpbmUgVElNRVNfMTIoY29kZSkgXAoreyBcCisJaW50IG5uID0gMTI7IFwKKwlkbyB7IFwKKwkJY29kZTsgXAorCX0gd2hpbGUgKC0tbm4pOyBcCit9CisKKyNlbmRpZgorCisJQXNzZXJ0RChpMSAhPSBpMiwgIm1haW5HdFUiKTsKKwlUSU1FU18xMigKKwkJYzEgPSBibG9ja1tpMV07IGMyID0gYmxvY2tbaTJdOworCQlpZiAoYzEgIT0gYzIpIHJldHVybiAoYzEgPiBjMik7CisJCWkxKys7IGkyKys7CisJKQorCisJayA9IG5ibG9jayArIDg7CisKKwlkbyB7CisJCVRJTUVTXzgoCisJCQljMSA9IGJsb2NrW2kxXTsgYzIgPSBibG9ja1tpMl07CisJCQlpZiAoYzEgIT0gYzIpIHJldHVybiAoYzEgPiBjMik7CisJCQlzMSA9IHF1YWRyYW50W2kxXTsgczIgPSBxdWFkcmFudFtpMl07CisJCQlpZiAoczEgIT0gczIpIHJldHVybiAoczEgPiBzMik7CisJCQlpMSsrOyBpMisrOworCQkpCisKKwkJaWYgKGkxID49IG5ibG9jaykgaTEgLT0gbmJsb2NrOworCQlpZiAoaTIgPj0gbmJsb2NrKSBpMiAtPSBuYmxvY2s7CisKKwkJKCpidWRnZXQpLS07CisJCWsgLT0gODsKKwl9IHdoaWxlIChrID49IDApOworCisJcmV0dXJuIEZhbHNlOworfQorI3VuZGVmIFRJTUVTXzgKKyN1bmRlZiBUSU1FU18xMgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogS251dGgncyBpbmNyZW1lbnRzIHNlZW0gdG8gd29yayBiZXR0ZXIKKyAqIHRoYW4gSW5jZXJwaS1TZWRnZXdpY2sgaGVyZS4gIFBvc3NpYmx5CisgKiBiZWNhdXNlIHRoZSBudW1iZXIgb2YgZWxlbXMgdG8gc29ydCBpcworICogdXN1YWxseSBzbWFsbCwgdHlwaWNhbGx5IDw9IDIwLgorICovCitzdGF0aWMKK2NvbnN0IGludDMyX3QgaW5jc1sxNF0gPSB7CisJMSwgNCwgMTMsIDQwLCAxMjEsIDM2NCwgMTA5MywgMzI4MCwKKwk5ODQxLCAyOTUyNCwgODg1NzMsIDI2NTcyMCwKKwk3OTcxNjEsIDIzOTE0ODQKK307CisKK3N0YXRpYwordm9pZCBtYWluU2ltcGxlU29ydCh1aW50MzJfdCogcHRyLAorCQl1aW50OF90KiAgYmxvY2ssCisJCXVpbnQxNl90KiBxdWFkcmFudCwKKwkJaW50MzJfdCAgIG5ibG9jaywKKwkJaW50MzJfdCAgIGxvLAorCQlpbnQzMl90ICAgaGksCisJCWludDMyX3QgICBkLAorCQlpbnQzMl90KiAgYnVkZ2V0KQoreworCWludDMyX3QgaSwgaiwgaCwgYmlnTiwgaHA7CisJdWludDMyX3QgdjsKKworCWJpZ04gPSBoaSAtIGxvICsgMTsKKwlpZiAoYmlnTiA8IDIpIHJldHVybjsKKworCWhwID0gMDsKKwl3aGlsZSAoaW5jc1tocF0gPCBiaWdOKSBocCsrOworCWhwLS07CisKKwlmb3IgKDsgaHAgPj0gMDsgaHAtLSkgeworCQloID0gaW5jc1tocF07CisKKwkJaSA9IGxvICsgaDsKKwkJd2hpbGUgKDEpIHsKKwkJCS8qLS0gY29weSAxIC0tKi8KKwkJCWlmIChpID4gaGkpIGJyZWFrOworCQkJdiA9IHB0cltpXTsKKwkJCWogPSBpOworCQkJd2hpbGUgKG1haW5HdFUocHRyW2otaF0rZCwgditkLCBibG9jaywgcXVhZHJhbnQsIG5ibG9jaywgYnVkZ2V0KSkgeworCQkJCXB0cltqXSA9IHB0cltqLWhdOworCQkJCWogPSBqIC0gaDsKKwkJCQlpZiAoaiA8PSAobG8gKyBoIC0gMSkpIGJyZWFrOworCQkJfQorCQkJcHRyW2pdID0gdjsKKwkJCWkrKzsKKworLyogMS41JSBvdmVyYWxsIHNwZWVkdXAsICsyOTAgYnl0ZXMgKi8KKyNpZiBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCA+PSAzCisJCQkvKi0tIGNvcHkgMiAtLSovCisJCQlpZiAoaSA+IGhpKSBicmVhazsKKwkJCXYgPSBwdHJbaV07CisJCQlqID0gaTsKKwkJCXdoaWxlIChtYWluR3RVKHB0cltqLWhdK2QsIHYrZCwgYmxvY2ssIHF1YWRyYW50LCBuYmxvY2ssIGJ1ZGdldCkpIHsKKwkJCQlwdHJbal0gPSBwdHJbai1oXTsKKwkJCQlqID0gaiAtIGg7CisJCQkJaWYgKGogPD0gKGxvICsgaCAtIDEpKSBicmVhazsKKwkJCX0KKwkJCXB0cltqXSA9IHY7CisJCQlpKys7CisKKwkJCS8qLS0gY29weSAzIC0tKi8KKwkJCWlmIChpID4gaGkpIGJyZWFrOworCQkJdiA9IHB0cltpXTsKKwkJCWogPSBpOworCQkJd2hpbGUgKG1haW5HdFUocHRyW2otaF0rZCwgditkLCBibG9jaywgcXVhZHJhbnQsIG5ibG9jaywgYnVkZ2V0KSkgeworCQkJCXB0cltqXSA9IHB0cltqLWhdOworCQkJCWogPSBqIC0gaDsKKwkJCQlpZiAoaiA8PSAobG8gKyBoIC0gMSkpIGJyZWFrOworCQkJfQorCQkJcHRyW2pdID0gdjsKKwkJCWkrKzsKKyNlbmRpZgorCQkJaWYgKCpidWRnZXQgPCAwKSByZXR1cm47CisJCX0KKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAqIGFuIGVsZWdhbnQgMy13YXkgcXVpY2tzb3J0IGZvciBzdHJpbmdzLAorICogZGVzY3JpYmVkIGluIGEgcGFwZXIgIkZhc3QgQWxnb3JpdGhtcyBmb3IKKyAqIFNvcnRpbmcgYW5kIFNlYXJjaGluZyBTdHJpbmdzIiwgYnkgUm9iZXJ0CisgKiBTZWRnZXdpY2sgYW5kIEpvbiBMLiBCZW50bGV5LgorICovCisKK3N0YXRpYworQUxXQVlTX0lOTElORQordWludDhfdCBtbWVkMyh1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjKQoreworCXVpbnQ4X3QgdDsKKwlpZiAoYSA+IGIpIHsKKwkJdCA9IGE7CisJCWEgPSBiOworCQliID0gdDsKKwl9OworCS8qIGhlcmUgYiA+PSBhICovCisJaWYgKGIgPiBjKSB7CisJCWIgPSBjOworCQlpZiAoYSA+IGIpCisJCQliID0gYTsKKwl9CisJcmV0dXJuIGI7Cit9CisKKyNkZWZpbmUgbXB1c2gobHosaHosZHopIFwKK3sgXAorCXN0YWNrTG9bc3BdID0gbHo7IFwKKwlzdGFja0hpW3NwXSA9IGh6OyBcCisJc3RhY2tEIFtzcF0gPSBkejsgXAorCXNwKys7IFwKK30KKworI2RlZmluZSBtcG9wKGx6LGh6LGR6KSBcCit7IFwKKwlzcC0tOyBcCisJbHogPSBzdGFja0xvW3NwXTsgXAorCWh6ID0gc3RhY2tIaVtzcF07IFwKKwlkeiA9IHN0YWNrRCBbc3BdOyBcCit9CisKKyNkZWZpbmUgbW5leHRzaXplKGF6KSAobmV4dEhpW2F6XSAtIG5leHRMb1thel0pCisKKyNkZWZpbmUgbW5leHRzd2FwKGF6LGJ6KSBcCit7IFwKKwlpbnQzMl90IHR6OyBcCisJdHogPSBuZXh0TG9bYXpdOyBuZXh0TG9bYXpdID0gbmV4dExvW2J6XTsgbmV4dExvW2J6XSA9IHR6OyBcCisJdHogPSBuZXh0SGlbYXpdOyBuZXh0SGlbYXpdID0gbmV4dEhpW2J6XTsgbmV4dEhpW2J6XSA9IHR6OyBcCisJdHogPSBuZXh0RCBbYXpdOyBuZXh0RCBbYXpdID0gbmV4dEQgW2J6XTsgbmV4dEQgW2J6XSA9IHR6OyBcCit9CisKKyNkZWZpbmUgTUFJTl9RU09SVF9TTUFMTF9USFJFU0ggMjAKKyNkZWZpbmUgTUFJTl9RU09SVF9ERVBUSF9USFJFU0ggKEJaX05fUkFESVggKyBCWl9OX1FTT1JUKQorI2RlZmluZSBNQUlOX1FTT1JUX1NUQUNLX1NJWkUgICAxMDAKKworc3RhdGljIE5PSU5MSU5FCit2b2lkIG1haW5RU29ydDModWludDMyX3QqIHB0ciwKKwkJdWludDhfdCogIGJsb2NrLAorCQl1aW50MTZfdCogcXVhZHJhbnQsCisJCWludDMyX3QgICBuYmxvY2ssCisJCWludDMyX3QgICBsb1N0LAorCQlpbnQzMl90ICAgaGlTdCwKKwkJaW50MzJfdCAgIGRTdCwKKwkJaW50MzJfdCogIGJ1ZGdldCkKK3sKKwlpbnQzMl90IHVuTG8sIHVuSGksIGx0TG8sIGd0SGksIG4sIG0sIG1lZDsKKwlpbnQzMl90IHNwLCBsbywgaGksIGQ7CisKKwlpbnQzMl90IHN0YWNrTG9bTUFJTl9RU09SVF9TVEFDS19TSVpFXTsKKwlpbnQzMl90IHN0YWNrSGlbTUFJTl9RU09SVF9TVEFDS19TSVpFXTsKKwlpbnQzMl90IHN0YWNrRCBbTUFJTl9RU09SVF9TVEFDS19TSVpFXTsKKworCWludDMyX3QgbmV4dExvWzNdOworCWludDMyX3QgbmV4dEhpWzNdOworCWludDMyX3QgbmV4dEQgWzNdOworCisJc3AgPSAwOworCW1wdXNoKGxvU3QsIGhpU3QsIGRTdCk7CisKKwl3aGlsZSAoc3AgPiAwKSB7CisJCUFzc2VydEgoc3AgPCBNQUlOX1FTT1JUX1NUQUNLX1NJWkUgLSAyLCAxMDAxKTsKKworCQltcG9wKGxvLCBoaSwgZCk7CisJCWlmIChoaSAtIGxvIDwgTUFJTl9RU09SVF9TTUFMTF9USFJFU0gKKwkJIHx8IGQgPiBNQUlOX1FTT1JUX0RFUFRIX1RIUkVTSAorCQkpIHsKKwkJCW1haW5TaW1wbGVTb3J0KHB0ciwgYmxvY2ssIHF1YWRyYW50LCBuYmxvY2ssIGxvLCBoaSwgZCwgYnVkZ2V0KTsKKwkJCWlmICgqYnVkZ2V0IDwgMCkKKwkJCQlyZXR1cm47CisJCQljb250aW51ZTsKKwkJfQorCQltZWQgPSAoaW50MzJfdCkJbW1lZDMoYmxvY2tbcHRyW2xvICAgICAgICAgIF0gKyBkXSwKKwkJICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW3B0cltoaSAgICAgICAgICBdICsgZF0sCisJCSAgICAgICAgICAgICAgICAgICAgICBibG9ja1twdHJbKGxvK2hpKSA+PiAxXSArIGRdKTsKKworCQl1bkxvID0gbHRMbyA9IGxvOworCQl1bkhpID0gZ3RIaSA9IGhpOworCisJCXdoaWxlICgxKSB7CisJCQl3aGlsZSAoMSkgeworCQkJCWlmICh1bkxvID4gdW5IaSkKKwkJCQkJYnJlYWs7CisJCQkJbiA9ICgoaW50MzJfdClibG9ja1twdHJbdW5Mb10rZF0pIC0gbWVkOworCQkJCWlmIChuID09IDApIHsKKwkJCQkJbXN3YXAocHRyW3VuTG9dLCBwdHJbbHRMb10pOworCQkJCQlsdExvKys7CisJCQkJCXVuTG8rKzsKKwkJCQkJY29udGludWU7CisJCQkJfTsKKwkJCQlpZiAobiA+ICAwKSBicmVhazsKKwkJCQl1bkxvKys7CisJCQl9CisJCQl3aGlsZSAoMSkgeworCQkJCWlmICh1bkxvID4gdW5IaSkKKwkJCQkJYnJlYWs7CisJCQkJbiA9ICgoaW50MzJfdClibG9ja1twdHJbdW5IaV0rZF0pIC0gbWVkOworCQkJCWlmIChuID09IDApIHsKKwkJCQkJbXN3YXAocHRyW3VuSGldLCBwdHJbZ3RIaV0pOworCQkJCQlndEhpLS07CisJCQkJCXVuSGktLTsKKwkJCQkJY29udGludWU7CisJCQkJfTsKKwkJCQlpZiAobiA8ICAwKSBicmVhazsKKwkJCQl1bkhpLS07CisJCQl9CisJCQlpZiAodW5MbyA+IHVuSGkpCisJCQkJYnJlYWs7CisJCQltc3dhcChwdHJbdW5Mb10sIHB0clt1bkhpXSk7CisJCQl1bkxvKys7CisJCQl1bkhpLS07CisJCX0KKworCQlBc3NlcnREKHVuSGkgPT0gdW5Mby0xLCAibWFpblFTb3J0MygyKSIpOworCisJCWlmIChndEhpIDwgbHRMbykgeworCQkJbXB1c2gobG8sIGhpLCBkICsgMSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCW4gPSBtbWluKGx0TG8tbG8sIHVuTG8tbHRMbyk7IG12c3dhcChwdHIsIGxvLCB1bkxvLW4sIG4pOworCQltID0gbW1pbihoaS1ndEhpLCBndEhpLXVuSGkpOyBtdnN3YXAocHRyLCB1bkxvLCBoaS1tKzEsIG0pOworCisJCW4gPSBsbyArIHVuTG8gLSBsdExvIC0gMTsKKwkJbSA9IGhpIC0gKGd0SGkgLSB1bkhpKSArIDE7CisKKwkJbmV4dExvWzBdID0gbG87ICBuZXh0SGlbMF0gPSBuOyAgIG5leHREWzBdID0gZDsKKwkJbmV4dExvWzFdID0gbTsgICBuZXh0SGlbMV0gPSBoaTsgIG5leHREWzFdID0gZDsKKwkJbmV4dExvWzJdID0gbisxOyBuZXh0SGlbMl0gPSBtLTE7IG5leHREWzJdID0gZCsxOworCisJCWlmIChtbmV4dHNpemUoMCkgPCBtbmV4dHNpemUoMSkpIG1uZXh0c3dhcCgwLCAxKTsKKwkJaWYgKG1uZXh0c2l6ZSgxKSA8IG1uZXh0c2l6ZSgyKSkgbW5leHRzd2FwKDEsIDIpOworCQlpZiAobW5leHRzaXplKDApIDwgbW5leHRzaXplKDEpKSBtbmV4dHN3YXAoMCwgMSk7CisKKwkJQXNzZXJ0RCAobW5leHRzaXplKDApID49IG1uZXh0c2l6ZSgxKSwgIm1haW5RU29ydDMoOCkiKTsKKwkJQXNzZXJ0RCAobW5leHRzaXplKDEpID49IG1uZXh0c2l6ZSgyKSwgIm1haW5RU29ydDMoOSkiKTsKKworCQltcHVzaChuZXh0TG9bMF0sIG5leHRIaVswXSwgbmV4dERbMF0pOworCQltcHVzaChuZXh0TG9bMV0sIG5leHRIaVsxXSwgbmV4dERbMV0pOworCQltcHVzaChuZXh0TG9bMl0sIG5leHRIaVsyXSwgbmV4dERbMl0pOworCX0KK30KKworI3VuZGVmIG1wdXNoCisjdW5kZWYgbXBvcAorI3VuZGVmIG1uZXh0c2l6ZQorI3VuZGVmIG1uZXh0c3dhcAorI3VuZGVmIE1BSU5fUVNPUlRfU01BTExfVEhSRVNICisjdW5kZWYgTUFJTl9RU09SVF9ERVBUSF9USFJFU0gKKyN1bmRlZiBNQUlOX1FTT1JUX1NUQUNLX1NJWkUKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcmU6CisgKgluYmxvY2sgPiBOX09WRVJTSE9PVAorICoJYmxvY2szMiBleGlzdHMgZm9yIFswIC4uIG5ibG9jay0xICtOX09WRVJTSE9PVF0KKyAqCSgodWludDhfdCopYmxvY2szMikgWzAgLi4gbmJsb2NrLTFdIGhvbGRzIGJsb2NrCisgKglwdHIgZXhpc3RzIGZvciBbMCAuLiBuYmxvY2stMV0KKyAqCisgKiBQb3N0OgorICoJKCh1aW50OF90KilibG9jazMyKSBbMCAuLiBuYmxvY2stMV0gaG9sZHMgYmxvY2sKKyAqCUFsbCBvdGhlciBhcmVhcyBvZiBibG9jazMyIGRlc3Ryb3llZAorICoJZnRhYlswIC4uIDY1NTM2XSBkZXN0cm95ZWQKKyAqCXB0ciBbMCAuLiBuYmxvY2stMV0gaG9sZHMgc29ydGVkIG9yZGVyCisgKglpZiAoKmJ1ZGdldCA8IDApLCBzb3J0aW5nIHdhcyBhYmFuZG9uZWQKKyAqLworCisjZGVmaW5lIEJJR0ZSRVEoYikgKGZ0YWJbKChiKSsxKSA8PCA4XSAtIGZ0YWJbKGIpIDw8IDhdKQorI2RlZmluZSBTRVRNQVNLICgxIDw8IDIxKQorI2RlZmluZSBDTEVBUk1BU0sgKH4oU0VUTUFTSykpCisKK3N0YXRpYyBOT0lOTElORQordm9pZCBtYWluU29ydChFU3RhdGUqIHN0YXRlLAorCQl1aW50MzJfdCogcHRyLAorCQl1aW50OF90KiAgYmxvY2ssCisJCXVpbnQxNl90KiBxdWFkcmFudCwKKwkJdWludDMyX3QqIGZ0YWIsCisJCWludDMyX3QgICBuYmxvY2ssCisJCWludDMyX3QqICBidWRnZXQpCit7CisJaW50MzJfdCAgaSwgaiwgaywgc3MsIHNiOworCXVpbnQ4X3QgIGMxOworCWludDMyX3QgIG51bVFTb3J0ZWQ7CisJdWludDE2X3QgczsKKwlCb29sICAgICBiaWdEb25lWzI1Nl07CisJLyogYmJveDogbW92ZWQgdG8gRVN0YXRlIHRvIHNhdmUgc3RhY2sKKwlpbnQzMl90ICBydW5uaW5nT3JkZXJbMjU2XTsKKwlpbnQzMl90ICBjb3B5U3RhcnRbMjU2XTsKKwlpbnQzMl90ICBjb3B5RW5kICBbMjU2XTsKKwkqLworI2RlZmluZSBydW5uaW5nT3JkZXIgKHN0YXRlLT5tYWluU29ydF9fcnVubmluZ09yZGVyKQorI2RlZmluZSBjb3B5U3RhcnQgICAgKHN0YXRlLT5tYWluU29ydF9fY29weVN0YXJ0KQorI2RlZmluZSBjb3B5RW5kICAgICAgKHN0YXRlLT5tYWluU29ydF9fY29weUVuZCkKKworCS8qLS0gc2V0IHVwIHRoZSAyLWJ5dGUgZnJlcXVlbmN5IHRhYmxlIC0tKi8KKwkvKiB3YXM6IGZvciAoaSA9IDY1NTM2OyBpID49IDA7IGktLSkgZnRhYltpXSA9IDA7ICovCisJbWVtc2V0KGZ0YWIsIDAsIDY1NTM3ICogc2l6ZW9mKGZ0YWJbMF0pKTsKKworCWogPSBibG9ja1swXSA8PCA4OworCWkgPSBuYmxvY2sgLSAxOworLyogMyUsICszMDAgYnl0ZXMgKi8KKyNpZiBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCA+PSAyCisJZm9yICg7IGkgPj0gMzsgaSAtPSA0KSB7CisJCXF1YWRyYW50W2ldID0gMDsKKwkJaiA9IChqID4+IDgpIHwgKCgodWludDE2X3QpYmxvY2tbaV0pIDw8IDgpOworCQlmdGFiW2pdKys7CisJCXF1YWRyYW50W2ktMV0gPSAwOworCQlqID0gKGogPj4gOCkgfCAoKCh1aW50MTZfdClibG9ja1tpLTFdKSA8PCA4KTsKKwkJZnRhYltqXSsrOworCQlxdWFkcmFudFtpLTJdID0gMDsKKwkJaiA9IChqID4+IDgpIHwgKCgodWludDE2X3QpYmxvY2tbaS0yXSkgPDwgOCk7CisJCWZ0YWJbal0rKzsKKwkJcXVhZHJhbnRbaS0zXSA9IDA7CisJCWogPSAoaiA+PiA4KSB8ICgoKHVpbnQxNl90KWJsb2NrW2ktM10pIDw8IDgpOworCQlmdGFiW2pdKys7CisJfQorI2VuZGlmCisJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCXF1YWRyYW50W2ldID0gMDsKKwkJaiA9IChqID4+IDgpIHwgKCgodWludDE2X3QpYmxvY2tbaV0pIDw8IDgpOworCQlmdGFiW2pdKys7CisJfQorCisJLyotLSAoZW1waGFzaXNlcyBjbG9zZSByZWxhdGlvbnNoaXAgb2YgYmxvY2sgJiBxdWFkcmFudCkgLS0qLworCWZvciAoaSA9IDA7IGkgPCBCWl9OX09WRVJTSE9PVDsgaSsrKSB7CisJCWJsb2NrICAgW25ibG9jaytpXSA9IGJsb2NrW2ldOworCQlxdWFkcmFudFtuYmxvY2sraV0gPSAwOworCX0KKworCS8qLS0gQ29tcGxldGUgdGhlIGluaXRpYWwgcmFkaXggc29ydCAtLSovCisJaiA9IGZ0YWJbMF07IC8qIGJib3g6IG9wdGltaXplZCAqLworCWZvciAoaSA9IDE7IGkgPD0gNjU1MzY7IGkrKykgeworCQlqICs9IGZ0YWJbaV07CisJCWZ0YWJbaV0gPSBqOworCX0KKworCXMgPSBibG9ja1swXSA8PCA4OworCWkgPSBuYmxvY2sgLSAxOworI2lmIENPTkZJR19CWklQMl9GRUFUVVJFX1NQRUVEID49IDIKKwlmb3IgKDsgaSA+PSAzOyBpIC09IDQpIHsKKwkJcyA9IChzID4+IDgpIHwgKGJsb2NrW2ldIDw8IDgpOworCQlqID0gZnRhYltzXSAtIDE7CisJCWZ0YWJbc10gPSBqOworCQlwdHJbal0gPSBpOworCQlzID0gKHMgPj4gOCkgfCAoYmxvY2tbaS0xXSA8PCA4KTsKKwkJaiA9IGZ0YWJbc10gLSAxOworCQlmdGFiW3NdID0gajsKKwkJcHRyW2pdID0gaS0xOworCQlzID0gKHMgPj4gOCkgfCAoYmxvY2tbaS0yXSA8PCA4KTsKKwkJaiA9IGZ0YWJbc10gLSAxOworCQlmdGFiW3NdID0gajsKKwkJcHRyW2pdID0gaS0yOworCQlzID0gKHMgPj4gOCkgfCAoYmxvY2tbaS0zXSA8PCA4KTsKKwkJaiA9IGZ0YWJbc10gLSAxOworCQlmdGFiW3NdID0gajsKKwkJcHRyW2pdID0gaS0zOworCX0KKyNlbmRpZgorCWZvciAoOyBpID49IDA7IGktLSkgeworCQlzID0gKHMgPj4gOCkgfCAoYmxvY2tbaV0gPDwgOCk7CisJCWogPSBmdGFiW3NdIC0gMTsKKwkJZnRhYltzXSA9IGo7CisJCXB0cltqXSA9IGk7CisJfQorCisJLyoKKwkgKiBOb3cgZnRhYiBjb250YWlucyB0aGUgZmlyc3QgbG9jIG9mIGV2ZXJ5IHNtYWxsIGJ1Y2tldC4KKwkgKiBDYWxjdWxhdGUgdGhlIHJ1bm5pbmcgb3JkZXIsIGZyb20gc21hbGxlc3QgdG8gbGFyZ2VzdAorCSAqIGJpZyBidWNrZXQuCisJICovCisJZm9yIChpID0gMDsgaSA8PSAyNTU7IGkrKykgeworCQliaWdEb25lICAgICBbaV0gPSBGYWxzZTsKKwkJcnVubmluZ09yZGVyW2ldID0gaTsKKwl9CisKKwl7CisJCWludDMyX3QgdnY7CisJCS8qIGJib3g6IHdhczogaW50MzJfdCBoID0gMTsgKi8KKwkJLyogZG8gaCA9IDMgKiBoICsgMTsgd2hpbGUgKGggPD0gMjU2KTsgKi8KKwkJdWludDMyX3QgaCA9IDM2NDsKKworCQlkbyB7CisJCQkvKmggPSBoIC8gMzsqLworCQkJaCA9IChoICogMTcxKSA+PiA5OyAvKiBiYm94OiBmYXN0IGgvMyAqLworCQkJZm9yIChpID0gaDsgaSA8PSAyNTU7IGkrKykgeworCQkJCXZ2ID0gcnVubmluZ09yZGVyW2ldOworCQkJCWogPSBpOworCQkJCXdoaWxlIChCSUdGUkVRKHJ1bm5pbmdPcmRlcltqLWhdKSA+IEJJR0ZSRVEodnYpKSB7CisJCQkJCXJ1bm5pbmdPcmRlcltqXSA9IHJ1bm5pbmdPcmRlcltqLWhdOworCQkJCQlqID0gaiAtIGg7CisJCQkJCWlmIChqIDw9IChoIC0gMSkpCisJCQkJCQlnb3RvIHplcm87CisJCQkJfQorIHplcm86CisJCQkJcnVubmluZ09yZGVyW2pdID0gdnY7CisJCQl9CisJCX0gd2hpbGUgKGggIT0gMSk7CisJfQorCisJLyoKKwkgKiBUaGUgbWFpbiBzb3J0aW5nIGxvb3AuCisJICovCisKKwludW1RU29ydGVkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPD0gMjU1OyBpKyspIHsKKworCQkvKgorCQkgKiBQcm9jZXNzIGJpZyBidWNrZXRzLCBzdGFydGluZyB3aXRoIHRoZSBsZWFzdCBmdWxsLgorCQkgKiBCYXNpY2FsbHkgdGhpcyBpcyBhIDMtc3RlcCBwcm9jZXNzIGluIHdoaWNoIHdlIGNhbGwKKwkJICogbWFpblFTb3J0MyB0byBzb3J0IHRoZSBzbWFsbCBidWNrZXRzIFtzcywgal0sIGJ1dAorCQkgKiBhbHNvIG1ha2UgYSBiaWcgZWZmb3J0IHRvIGF2b2lkIHRoZSBjYWxscyBpZiB3ZSBjYW4uCisJCSAqLworCQlzcyA9IHJ1bm5pbmdPcmRlcltpXTsKKworCQkvKgorCQkgKiBTdGVwIDE6CisJCSAqIENvbXBsZXRlIHRoZSBiaWcgYnVja2V0IFtzc10gYnkgcXVpY2tzb3J0aW5nCisJCSAqIGFueSB1bnNvcnRlZCBzbWFsbCBidWNrZXRzIFtzcywgal0sIGZvciBqICE9IHNzLgorCQkgKiBIb3BlZnVsbHkgcHJldmlvdXMgcG9pbnRlci1zY2FubmluZyBwaGFzZXMgaGF2ZSBhbHJlYWR5CisJCSAqIGNvbXBsZXRlZCBtYW55IG9mIHRoZSBzbWFsbCBidWNrZXRzIFtzcywgal0sIHNvCisJCSAqIHdlIGRvbid0IGhhdmUgdG8gc29ydCB0aGVtIGF0IGFsbC4KKwkJICovCisJCWZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspIHsKKwkJCWlmIChqICE9IHNzKSB7CisJCQkJc2IgPSAoc3MgPDwgOCkgKyBqOworCQkJCWlmICghKGZ0YWJbc2JdICYgU0VUTUFTSykpIHsKKwkJCQkJaW50MzJfdCBsbyA9ICBmdGFiW3NiXSAgICYgQ0xFQVJNQVNLOworCQkJCQlpbnQzMl90IGhpID0gKGZ0YWJbc2IrMV0gJiBDTEVBUk1BU0spIC0gMTsKKwkJCQkJaWYgKGhpID4gbG8pIHsKKwkJCQkJCW1haW5RU29ydDMoCisJCQkJCQkJcHRyLCBibG9jaywgcXVhZHJhbnQsIG5ibG9jaywKKwkJCQkJCQlsbywgaGksIEJaX05fUkFESVgsIGJ1ZGdldAorCQkJCQkJKTsKKwkJCQkJCWlmICgqYnVkZ2V0IDwgMCkgcmV0dXJuOworCQkJCQkJbnVtUVNvcnRlZCArPSAoaGkgLSBsbyArIDEpOworCQkJCQl9CisJCQkJfQorCQkJCWZ0YWJbc2JdIHw9IFNFVE1BU0s7CisJCQl9CisJCX0KKworCQlBc3NlcnRIKCFiaWdEb25lW3NzXSwgMTAwNik7CisKKwkJLyoKKwkJICogU3RlcCAyOgorCQkgKiBOb3cgc2NhbiB0aGlzIGJpZyBidWNrZXQgW3NzXSBzbyBhcyB0byBzeW50aGVzaXNlIHRoZQorCQkgKiBzb3J0ZWQgb3JkZXIgZm9yIHNtYWxsIGJ1Y2tldHMgW3QsIHNzXSBmb3IgYWxsIHQsCisJCSAqIGluY2x1ZGluZywgbWFnaWNhbGx5LCB0aGUgYnVja2V0IFtzcyxzc10gdG9vLgorCQkgKiBUaGlzIHdpbGwgYXZvaWQgZG9pbmcgUmVhbCBXb3JrIGluIHN1YnNlcXVlbnQgU3RlcCAxJ3MuCisJCSAqLworCQl7CisJCQlmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKSB7CisJCQkJY29weVN0YXJ0W2pdID0gIGZ0YWJbKGogPDwgOCkgKyBzc10gICAgICYgQ0xFQVJNQVNLOworCQkJCWNvcHlFbmQgIFtqXSA9IChmdGFiWyhqIDw8IDgpICsgc3MgKyAxXSAmIENMRUFSTUFTSykgLSAxOworCQkJfQorCQkJZm9yIChqID0gZnRhYltzcyA8PCA4XSAmIENMRUFSTUFTSzsgaiA8IGNvcHlTdGFydFtzc107IGorKykgeworCQkJCWsgPSBwdHJbal0gLSAxOworCQkJCWlmIChrIDwgMCkKKwkJCQkJayArPSBuYmxvY2s7CisJCQkJYzEgPSBibG9ja1trXTsKKwkJCQlpZiAoIWJpZ0RvbmVbYzFdKQorCQkJCQlwdHJbY29weVN0YXJ0W2MxXSsrXSA9IGs7CisJCQl9CisJCQlmb3IgKGogPSAoZnRhYlsoc3MrMSkgPDwgOF0gJiBDTEVBUk1BU0spIC0gMTsgaiA+IGNvcHlFbmRbc3NdOyBqLS0pIHsKKwkJCQlrID0gcHRyW2pdLTE7CisJCQkJaWYgKGsgPCAwKQorCQkJCQlrICs9IG5ibG9jazsKKwkJCQljMSA9IGJsb2NrW2tdOworCQkJCWlmICghYmlnRG9uZVtjMV0pCisJCQkJCXB0cltjb3B5RW5kW2MxXS0tXSA9IGs7CisJCQl9CisJCX0KKworCQkvKiBFeHRyZW1lbHkgcmFyZSBjYXNlIG1pc3NpbmcgaW4gYnppcDItMS4wLjAgYW5kIDEuMC4xLgorCQkgKiBOZWNlc3NpdHkgZm9yIHRoaXMgY2FzZSBpcyBkZW1vbnN0cmF0ZWQgYnkgY29tcHJlc3NpbmcKKwkJICogYSBzZXF1ZW5jZSBvZiBhcHByb3hpbWF0ZWx5IDQ4LjUgbWlsbGlvbiBvZiBjaGFyYWN0ZXIKKwkJICogMjUxOyAxLjAuMC8xLjAuMSB3aWxsIHRoZW4gZGllIGhlcmUuICovCisJCUFzc2VydEgoKGNvcHlTdGFydFtzc10tMSA9PSBjb3B5RW5kW3NzXSkgXAorCQkgICAgIHx8IChjb3B5U3RhcnRbc3NdID09IDAgJiYgY29weUVuZFtzc10gPT0gbmJsb2NrLTEpLCAxMDA3KTsKKworCQlmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKQorCQkJZnRhYlsoaiA8PCA4KSArIHNzXSB8PSBTRVRNQVNLOworCisJCS8qCisJCSAqIFN0ZXAgMzoKKwkJICogVGhlIFtzc10gYmlnIGJ1Y2tldCBpcyBub3cgZG9uZS4gIFJlY29yZCB0aGlzIGZhY3QsCisJCSAqIGFuZCB1cGRhdGUgdGhlIHF1YWRyYW50IGRlc2NyaXB0b3JzLiAgUmVtZW1iZXIgdG8KKwkJICogdXBkYXRlIHF1YWRyYW50cyBpbiB0aGUgb3ZlcnNob290IGFyZWEgdG9vLCBpZgorCQkgKiBuZWNlc3NhcnkuICBUaGUgImlmIChpIDwgMjU1KSIgdGVzdCBtZXJlbHkgc2tpcHMKKwkJICogdGhpcyB1cGRhdGluZyBmb3IgdGhlIGxhc3QgYnVja2V0IHByb2Nlc3NlZCwgc2luY2UKKwkJICogdXBkYXRpbmcgZm9yIHRoZSBsYXN0IGJ1Y2tldCBpcyBwb2ludGxlc3MuCisJCSAqCisJCSAqIFRoZSBxdWFkcmFudCBhcnJheSBwcm92aWRlcyBhIHdheSB0byBpbmNyZW1lbnRhbGx5CisJCSAqIGNhY2hlIHNvcnQgb3JkZXJpbmdzLCBhcyB0aGV5IGFwcGVhciwgc28gYXMgdG8KKwkJICogbWFrZSBzdWJzZXF1ZW50IGNvbXBhcmlzb25zIGluIGZ1bGxHdFUoKSBjb21wbGV0ZQorCQkgKiBmYXN0ZXIuICBGb3IgcmVwZXRpdGl2ZSBibG9ja3MgdGhpcyBtYWtlcyBhIGJpZworCQkgKiBkaWZmZXJlbmNlIChidXQgbm90IGJpZyBlbm91Z2ggdG8gYmUgYWJsZSB0byBhdm9pZAorCQkgKiB0aGUgZmFsbGJhY2sgc29ydGluZyBtZWNoYW5pc20sIGV4cG9uZW50aWFsIHJhZGl4IHNvcnQpLgorCQkgKgorCQkgKiBUaGUgcHJlY2lzZSBtZWFuaW5nIGlzOiBhdCBhbGwgdGltZXM6CisJCSAqCisJCSAqCWZvciAwIDw9IGkgPCBuYmxvY2sgYW5kIDAgPD0gaiA8PSBuYmxvY2sKKwkJICoKKwkJICoJaWYgYmxvY2tbaV0gIT0gYmxvY2tbal0sCisJCSAqCisJCSAqCQl0aGVuIHRoZSByZWxhdGl2ZSB2YWx1ZXMgb2YgcXVhZHJhbnRbaV0gYW5kCisJCSAqCQkJICBxdWFkcmFudFtqXSBhcmUgbWVhbmluZ2xlc3MuCisJCSAqCisJCSAqCQllbHNlIHsKKwkJICoJCQlpZiBxdWFkcmFudFtpXSA8IHF1YWRyYW50W2pdCisJCSAqCQkJCXRoZW4gdGhlIHN0cmluZyBzdGFydGluZyBhdCBpIGxleGljb2dyYXBoaWNhbGx5CisJCSAqCQkJCXByZWNlZGVzIHRoZSBzdHJpbmcgc3RhcnRpbmcgYXQgagorCQkgKgorCQkgKgkJCWVsc2UgaWYgcXVhZHJhbnRbaV0gPiBxdWFkcmFudFtqXQorCQkgKgkJCQl0aGVuIHRoZSBzdHJpbmcgc3RhcnRpbmcgYXQgaiBsZXhpY29ncmFwaGljYWxseQorCQkgKgkJCQlwcmVjZWRlcyB0aGUgc3RyaW5nIHN0YXJ0aW5nIGF0IGkKKwkJICoKKwkJICoJCQllbHNlCisJCSAqCQkJCXRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiB0aGUgc3RyaW5ncyBzdGFydGluZworCQkgKgkJCQlhdCBpIGFuZCBqIGhhcyBub3QgeWV0IGJlZW4gZGV0ZXJtaW5lZC4KKwkJICoJCX0KKwkJICovCisJCWJpZ0RvbmVbc3NdID0gVHJ1ZTsKKworCQlpZiAoaSA8IDI1NSkgeworCQkJaW50MzJfdCBiYlN0YXJ0ID0gZnRhYltzcyA8PCA4XSAmIENMRUFSTUFTSzsKKwkJCWludDMyX3QgYmJTaXplICA9IChmdGFiWyhzcysxKSA8PCA4XSAmIENMRUFSTUFTSykgLSBiYlN0YXJ0OworCQkJaW50MzJfdCBzaGlmdHMgID0gMDsKKworCQkJd2hpbGUgKChiYlNpemUgPj4gc2hpZnRzKSA+IDY1NTM0KSBzaGlmdHMrKzsKKworCQkJZm9yIChqID0gYmJTaXplLTE7IGogPj0gMDsgai0tKSB7CisJCQkJaW50MzJfdCBhMnVwZGF0ZSAgID0gcHRyW2JiU3RhcnQgKyBqXTsKKwkJCQl1aW50MTZfdCBxVmFsICAgICAgPSAodWludDE2X3QpKGogPj4gc2hpZnRzKTsKKwkJCQlxdWFkcmFudFthMnVwZGF0ZV0gPSBxVmFsOworCQkJCWlmIChhMnVwZGF0ZSA8IEJaX05fT1ZFUlNIT09UKQorCQkJCQlxdWFkcmFudFthMnVwZGF0ZSArIG5ibG9ja10gPSBxVmFsOworCQkJfQorCQkJQXNzZXJ0SCgoKGJiU2l6ZS0xKSA+PiBzaGlmdHMpIDw9IDY1NTM1LCAxMDAyKTsKKwkJfQorCX0KKyN1bmRlZiBydW5uaW5nT3JkZXIKKyN1bmRlZiBjb3B5U3RhcnQKKyN1bmRlZiBjb3B5RW5kCit9CisKKyN1bmRlZiBCSUdGUkVRCisjdW5kZWYgU0VUTUFTSworI3VuZGVmIENMRUFSTUFTSworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByZToKKyAqCW5ibG9jayA+IDAKKyAqCWFycjIgZXhpc3RzIGZvciBbMCAuLiBuYmxvY2stMSArTl9PVkVSU0hPT1RdCisgKgkgICgodWludDhfdCopYXJyMilbMCAuLiBuYmxvY2stMV0gaG9sZHMgYmxvY2sKKyAqCWFycjEgZXhpc3RzIGZvciBbMCAuLiBuYmxvY2stMV0KKyAqCisgKiBQb3N0OgorICoJKCh1aW50OF90KilhcnIyKSBbMCAuLiBuYmxvY2stMV0gaG9sZHMgYmxvY2sKKyAqCUFsbCBvdGhlciBhcmVhcyBvZiBibG9jayBkZXN0cm95ZWQKKyAqCWZ0YWJbMCAuLiA2NTUzNl0gZGVzdHJveWVkCisgKglhcnIxWzAgLi4gbmJsb2NrLTFdIGhvbGRzIHNvcnRlZCBvcmRlcgorICovCitzdGF0aWMgTk9JTkxJTkUKK3ZvaWQgQloyX2Jsb2NrU29ydChFU3RhdGUqIHMpCit7CisJLyogSW4gb3JpZ2luYWwgYnppcDIgMS4wLjQsIGl0J3MgYSBwYXJhbWV0ZXIsIGJ1dCAzMAorCSAqICh3aGljaCB3YXMgdGhlIGRlZmF1bHQpIHNob3VsZCB3b3JrIG9rLiAqLworCWVudW0geyB3ZmFjdCA9IDMwIH07CisKKwl1aW50MzJfdCogcHRyICAgID0gcy0+cHRyOworCXVpbnQ4X3QqICBibG9jayAgPSBzLT5ibG9jazsKKwl1aW50MzJfdCogZnRhYiAgID0gcy0+ZnRhYjsKKwlpbnQzMl90ICAgbmJsb2NrID0gcy0+bmJsb2NrOworCXVpbnQxNl90KiBxdWFkcmFudDsKKwlpbnQzMl90ICAgYnVkZ2V0OworCWludDMyX3QgICBpOworCisJaWYgKG5ibG9jayA8IDEwMDAwKSB7CisJCWZhbGxiYWNrU29ydChzLT5hcnIxLCBzLT5hcnIyLCBmdGFiLCBuYmxvY2spOworCX0gZWxzZSB7CisJCS8qIENhbGN1bGF0ZSB0aGUgbG9jYXRpb24gZm9yIHF1YWRyYW50LCByZW1lbWJlcmluZyB0byBnZXQKKwkJICogdGhlIGFsaWdubWVudCByaWdodC4gIEFzc3VtZXMgdGhhdCAmKGJsb2NrWzBdKSBpcyBhdCBsZWFzdAorCQkgKiAyLWJ5dGUgYWxpZ25lZCAtLSB0aGlzIHNob3VsZCBiZSBvayBzaW5jZSBibG9jayBpcyByZWFsbHkKKwkJICogdGhlIGZpcnN0IHNlY3Rpb24gb2YgYXJyMi4KKwkJICovCisJCWkgPSBuYmxvY2sgKyBCWl9OX09WRVJTSE9PVDsKKwkJaWYgKGkgJiAxKSBpKys7CisJCXF1YWRyYW50ID0gKHVpbnQxNl90KikoJihibG9ja1tpXSkpOworCisJCS8qICh3ZmFjdC0xKSAvIDMgcHV0cyB0aGUgZGVmYXVsdC1mYWN0b3ItMzAKKwkJICogdHJhbnNpdGlvbiBwb2ludCBhdCB2ZXJ5IHJvdWdobHkgdGhlIHNhbWUgcGxhY2UgYXMKKwkJICogd2l0aCB2MC4xIGFuZCB2MC45LjAuCisJCSAqIE5vdCB0aGF0IGl0IHBhcnRpY3VsYXJseSBtYXR0ZXJzIGFueSBtb3JlLCBzaW5jZSB0aGUKKwkJICogcmVzdWx0aW5nIGNvbXByZXNzZWQgc3RyZWFtIGlzIG5vdyB0aGUgc2FtZSByZWdhcmRsZXNzCisJCSAqIG9mIHdoZXRoZXIgb3Igbm90IHdlIHVzZSB0aGUgbWFpbiBzb3J0IG9yIGZhbGxiYWNrIHNvcnQuCisJCSAqLworCQlidWRnZXQgPSBuYmxvY2sgKiAoKHdmYWN0LTEpIC8gMyk7CisKKwkJbWFpblNvcnQocywgcHRyLCBibG9jaywgcXVhZHJhbnQsIGZ0YWIsIG5ibG9jaywgJmJ1ZGdldCk7CisJCWlmIChidWRnZXQgPCAwKSB7CisJCQlmYWxsYmFja1NvcnQocy0+YXJyMSwgcy0+YXJyMiwgZnRhYiwgbmJsb2NrKTsKKwkJfQorCX0KKworCXMtPm9yaWdQdHIgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgcy0+bmJsb2NrOyBpKyspCisJCWlmIChwdHJbaV0gPT0gMCkgeworCQkJcy0+b3JpZ1B0ciA9IGk7CisJCQlicmVhazsKKwkJfTsKKworCUFzc2VydEgocy0+b3JpZ1B0ciAhPSAtMSwgMTAwMyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc29ydC5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYi5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2RiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliLmMKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBiemlwMiBpcyB3cml0dGVuIGJ5IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+LgorICogQWRhcHRlZCBmb3IgYnVzeWJveCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPi4KKyAqIFNlZSBSRUFETUUgYW5kIExJQ0VOU0UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIExpYnJhcnkgdG9wLWxldmVsIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWIuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGZpbGUgaXMgcGFydCBvZiBiemlwMi9saWJiemlwMiwgYSBwcm9ncmFtIGFuZCBsaWJyYXJ5IGZvcgorbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworYnppcDIvbGliYnppcDIgdmVyc2lvbiAxLjAuNCBvZiAyMCBEZWNlbWJlciAyMDA2CitDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNiBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPgorCitQbGVhc2UgcmVhZCB0aGUgV0FSTklORywgRElTQ0xBSU1FUiBhbmQgUEFURU5UUyBzZWN0aW9ucyBpbiB0aGUKK1JFQURNRSBmaWxlLgorCitUaGlzIHByb2dyYW0gaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5lZAoraW4gdGhlIGZpbGUgTElDRU5TRS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDSEFOR0VTCisgKiAwLjkuMCAgICAtLSBvcmlnaW5hbCB2ZXJzaW9uLgorICogMC45LjBhL2IgLS0gbm8gY2hhbmdlcyBpbiB0aGlzIGZpbGUuCisgKiAwLjkuMGMgICAtLSBtYWRlIHplcm8tbGVuZ3RoIEJaX0ZMVVNIIHdvcmsgY29ycmVjdGx5IGluIGJ6Q29tcHJlc3MoKS4KKyAqICAgICAgICAgICAgIGZpeGVkIGJ6V3JpdGUvYnpSZWFkIHRvIGlnbm9yZSB6ZXJvLWxlbmd0aCByZXF1ZXN0cy4KKyAqICAgICAgICAgICAgIGZpeGVkIGJ6cmVhZCB0byBjb3JyZWN0bHkgaGFuZGxlIHJlYWQgcmVxdWVzdHMgYWZ0ZXIgRU9GLgorICogICAgICAgICAgICAgd3JvbmcgcGFyYW1ldGVyIG9yZGVyIGluIGNhbGwgdG8gYnpEZWNvbXByZXNzSW5pdCBpbgorICogICAgICAgICAgICAgYnpCdWZmVG9CdWZmRGVjb21wcmVzcy4gIEZpeGVkLgorICovCisKKy8qICNpbmNsdWRlICJiemxpYl9wcml2YXRlLmgiICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIENvbXByZXNzaW9uIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIEJaX0xJR0hUX0RFQlVHCitzdGF0aWMKK3ZvaWQgYnpfYXNzZXJ0X2ZhaWwoaW50IGVycmNvZGUpCit7CisJLyogaWYgKGVycmNvZGUgPT0gMTAwNykgYmJfZXJyb3JfbXNnX2FuZF9kaWUoInByb2JhYmx5IGJhZCBSQU0iKTsgKi8KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW50ZXJuYWwgZXJyb3IgJWQiLCBlcnJjb2RlKTsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgcHJlcGFyZV9uZXdfYmxvY2soRVN0YXRlKiBzKQoreworCWludCBpOworCXMtPm5ibG9jayA9IDA7CisJcy0+bnVtWiA9IDA7CisJcy0+c3RhdGVfb3V0X3BvcyA9IDA7CisJQlpfSU5JVElBTElTRV9DUkMocy0+YmxvY2tDUkMpOworCS8qIGlubGluZWQgbWVtc2V0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBoZXJlICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlzLT5pblVzZVtpXSA9IDA7CisJcy0+YmxvY2tObysrOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworQUxXQVlTX0lOTElORQordm9pZCBpbml0X1JMKEVTdGF0ZSogcykKK3sKKwlzLT5zdGF0ZV9pbl9jaCA9IDI1NjsKKwlzLT5zdGF0ZV9pbl9sZW4gPSAwOworfQorCisKK3N0YXRpYworaW50IGlzZW1wdHlfUkwoRVN0YXRlKiBzKQoreworCXJldHVybiAocy0+c3RhdGVfaW5fY2ggPj0gMjU2IHx8IHMtPnN0YXRlX2luX2xlbiA8PSAwKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgQloyX2J6Q29tcHJlc3NJbml0KGJ6X3N0cmVhbSAqc3RybSwgaW50IGJsb2NrU2l6ZTEwMGspCit7CisJaW50MzJfdCBuOworCUVTdGF0ZSogczsKKworCXMgPSB4emFsbG9jKHNpemVvZihFU3RhdGUpKTsKKwlzLT5zdHJtID0gc3RybTsKKworCW4gICAgICAgID0gMTAwMDAwICogYmxvY2tTaXplMTAwazsKKwlzLT5hcnIxICA9IHhtYWxsb2MobiAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YodWludDMyX3QpKTsKKwlzLT5tdGZ2ICA9ICh1aW50MTZfdCopcy0+YXJyMTsKKwlzLT5wdHIgICA9ICh1aW50MzJfdCopcy0+YXJyMTsKKwlzLT5hcnIyICA9IHhtYWxsb2MoKG4gKyBCWl9OX09WRVJTSE9PVCkgKiBzaXplb2YodWludDMyX3QpKTsKKwlzLT5ibG9jayA9ICh1aW50OF90KilzLT5hcnIyOworCXMtPmZ0YWIgID0geG1hbGxvYyg2NTUzNyAgICAgICAgICAgICAgICAqIHNpemVvZih1aW50MzJfdCkpOworCisJcy0+Y3JjMzJ0YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAxKTsKKworCXMtPnN0YXRlICAgICAgICAgICAgID0gQlpfU19JTlBVVDsKKwlzLT5tb2RlICAgICAgICAgICAgICA9IEJaX01fUlVOTklORzsKKwlzLT5ibG9ja1NpemUxMDBrICAgICA9IGJsb2NrU2l6ZTEwMGs7CisJcy0+bmJsb2NrTUFYICAgICAgICAgPSBuIC0gMTk7CisKKwlzdHJtLT5zdGF0ZSAgICAgICAgICA9IHM7CisJLypzdHJtLT50b3RhbF9pbiAgICAgPSAwOyovCisJc3RybS0+dG90YWxfb3V0ICAgICAgPSAwOworCWluaXRfUkwocyk7CisJcHJlcGFyZV9uZXdfYmxvY2socyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIGFkZF9wYWlyX3RvX2Jsb2NrKEVTdGF0ZSogcykKK3sKKwlpbnQzMl90IGk7CisJdWludDhfdCBjaCA9ICh1aW50OF90KShzLT5zdGF0ZV9pbl9jaCk7CisJZm9yIChpID0gMDsgaSA8IHMtPnN0YXRlX2luX2xlbjsgaSsrKSB7CisJCUJaX1VQREFURV9DUkMocywgcy0+YmxvY2tDUkMsIGNoKTsKKwl9CisJcy0+aW5Vc2Vbcy0+c3RhdGVfaW5fY2hdID0gMTsKKwlzd2l0Y2ggKHMtPnN0YXRlX2luX2xlbikgeworCQljYXNlIDM6CisJCQlzLT5ibG9ja1tzLT5uYmxvY2tdID0gKHVpbnQ4X3QpY2g7IHMtPm5ibG9jaysrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgMjoKKwkJCXMtPmJsb2NrW3MtPm5ibG9ja10gPSAodWludDhfdCljaDsgcy0+bmJsb2NrKys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAxOgorCQkJcy0+YmxvY2tbcy0+bmJsb2NrXSA9ICh1aW50OF90KWNoOyBzLT5uYmxvY2srKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcy0+aW5Vc2Vbcy0+c3RhdGVfaW5fbGVuIC0gNF0gPSAxOworCQkJcy0+YmxvY2tbcy0+bmJsb2NrXSA9ICh1aW50OF90KWNoOyBzLT5uYmxvY2srKzsKKwkJCXMtPmJsb2NrW3MtPm5ibG9ja10gPSAodWludDhfdCljaDsgcy0+bmJsb2NrKys7CisJCQlzLT5ibG9ja1tzLT5uYmxvY2tdID0gKHVpbnQ4X3QpY2g7IHMtPm5ibG9jaysrOworCQkJcy0+YmxvY2tbcy0+bmJsb2NrXSA9ICh1aW50OF90KWNoOyBzLT5uYmxvY2srKzsKKwkJCXMtPmJsb2NrW3MtPm5ibG9ja10gPSAodWludDhfdCkocy0+c3RhdGVfaW5fbGVuIC0gNCk7CisJCQlzLT5uYmxvY2srKzsKKwkJCWJyZWFrOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgZmx1c2hfUkwoRVN0YXRlKiBzKQoreworCWlmIChzLT5zdGF0ZV9pbl9jaCA8IDI1NikgYWRkX3BhaXJfdG9fYmxvY2socyk7CisJaW5pdF9STChzKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEFERF9DSEFSX1RPX0JMT0NLKHpzLCB6Y2hoMCkgXAoreyBcCisJdWludDMyX3QgemNoaCA9ICh1aW50MzJfdCkoemNoaDApOyBcCisJLyotLSBmYXN0IHRyYWNrIHRoZSBjb21tb24gY2FzZSAtLSovIFwKKwlpZiAoemNoaCAhPSB6cy0+c3RhdGVfaW5fY2ggJiYgenMtPnN0YXRlX2luX2xlbiA9PSAxKSB7IFwKKwkJdWludDhfdCBjaCA9ICh1aW50OF90KSh6cy0+c3RhdGVfaW5fY2gpOyBcCisJCUJaX1VQREFURV9DUkMoenMsIHpzLT5ibG9ja0NSQywgY2gpOyBcCisJCXpzLT5pblVzZVt6cy0+c3RhdGVfaW5fY2hdID0gMTsgXAorCQl6cy0+YmxvY2tbenMtPm5ibG9ja10gPSAodWludDhfdCljaDsgXAorCQl6cy0+bmJsb2NrKys7IFwKKwkJenMtPnN0YXRlX2luX2NoID0gemNoaDsgXAorCX0gXAorCWVsc2UgXAorCS8qLS0gZ2VuZXJhbCwgdW5jb21tb24gY2FzZXMgLS0qLyBcCisJaWYgKHpjaGggIT0genMtPnN0YXRlX2luX2NoIHx8IHpzLT5zdGF0ZV9pbl9sZW4gPT0gMjU1KSB7IFwKKwkJaWYgKHpzLT5zdGF0ZV9pbl9jaCA8IDI1NikgXAorCQkJYWRkX3BhaXJfdG9fYmxvY2soenMpOyBcCisJCXpzLT5zdGF0ZV9pbl9jaCA9IHpjaGg7IFwKKwkJenMtPnN0YXRlX2luX2xlbiA9IDE7IFwKKwl9IGVsc2UgeyBcCisJCXpzLT5zdGF0ZV9pbl9sZW4rKzsgXAorCX0gXAorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCAvKkJvb2wqLyBjb3B5X2lucHV0X3VudGlsX3N0b3AoRVN0YXRlKiBzKQoreworCS8qQm9vbCBwcm9ncmVzc19pbiA9IEZhbHNlOyovCisKKyNpZmRlZiBTQU1FX0NPREVfQVNfQkVMT1cKKwlpZiAocy0+bW9kZSA9PSBCWl9NX1JVTk5JTkcpIHsKKwkJLyotLSBmYXN0IHRyYWNrIHRoZSBjb21tb24gY2FzZSAtLSovCisJCXdoaWxlICgxKSB7CisJCQkvKi0tIG5vIGlucHV0PyAtLSovCisJCQlpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgYnJlYWs7CisJCQkvKi0tIGJsb2NrIGZ1bGw/IC0tKi8KKwkJCWlmIChzLT5uYmxvY2sgPj0gcy0+bmJsb2NrTUFYKSBicmVhazsKKwkJCS8qcHJvZ3Jlc3NfaW4gPSBUcnVlOyovCisJCQlBRERfQ0hBUl9UT19CTE9DSyhzLCAodWludDMyX3QpKCoodWludDhfdCopKHMtPnN0cm0tPm5leHRfaW4pKSk7CisJCQlzLT5zdHJtLT5uZXh0X2luKys7CisJCQlzLT5zdHJtLT5hdmFpbF9pbi0tOworCQkJLypzLT5zdHJtLT50b3RhbF9pbisrOyovCisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyotLSBnZW5lcmFsLCB1bmNvbW1vbiBjYXNlIC0tKi8KKwkJd2hpbGUgKDEpIHsKKwkJCS8qLS0gbm8gaW5wdXQ/IC0tKi8KKwkJCWlmIChzLT5zdHJtLT5hdmFpbF9pbiA9PSAwKSBicmVhazsKKwkJCS8qLS0gYmxvY2sgZnVsbD8gLS0qLworCQkJaWYgKHMtPm5ibG9jayA+PSBzLT5uYmxvY2tNQVgpIGJyZWFrOworCQkvLyMJLyotLSBmbHVzaC9maW5pc2ggZW5kPyAtLSovCisJCS8vIwlpZiAocy0+YXZhaWxfaW5fZXhwZWN0ID09IDApIGJyZWFrOworCQkJLypwcm9ncmVzc19pbiA9IFRydWU7Ki8KKwkJCUFERF9DSEFSX1RPX0JMT0NLKHMsICoodWludDhfdCopKHMtPnN0cm0tPm5leHRfaW4pKTsKKwkJCXMtPnN0cm0tPm5leHRfaW4rKzsKKwkJCXMtPnN0cm0tPmF2YWlsX2luLS07CisJCQkvKnMtPnN0cm0tPnRvdGFsX2luKys7Ki8KKwkJLy8jCXMtPmF2YWlsX2luX2V4cGVjdC0tOworCQl9CisJfQorCS8qcmV0dXJuIHByb2dyZXNzX2luOyovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIC8qQm9vbCovIGNvcHlfb3V0cHV0X3VudGlsX3N0b3AoRVN0YXRlKiBzKQoreworCS8qQm9vbCBwcm9ncmVzc19vdXQgPSBGYWxzZTsqLworCisJd2hpbGUgKDEpIHsKKwkJLyotLSBubyBvdXRwdXQgc3BhY2U/IC0tKi8KKwkJaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSBicmVhazsKKworCQkvKi0tIGJsb2NrIGRvbmU/IC0tKi8KKwkJaWYgKHMtPnN0YXRlX291dF9wb3MgPj0gcy0+bnVtWikgYnJlYWs7CisKKwkJLypwcm9ncmVzc19vdXQgPSBUcnVlOyovCisJCSoocy0+c3RybS0+bmV4dF9vdXQpID0gcy0+emJpdHNbcy0+c3RhdGVfb3V0X3Bvc107CisJCXMtPnN0YXRlX291dF9wb3MrKzsKKwkJcy0+c3RybS0+YXZhaWxfb3V0LS07CisJCXMtPnN0cm0tPm5leHRfb3V0Kys7CisJCXMtPnN0cm0tPnRvdGFsX291dCsrOworCX0KKwkvKnJldHVybiBwcm9ncmVzc19vdXQ7Ki8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgLypCb29sKi8gaGFuZGxlX2NvbXByZXNzKGJ6X3N0cmVhbSAqc3RybSkKK3sKKwkvKkJvb2wgcHJvZ3Jlc3NfaW4gID0gRmFsc2U7Ki8KKwkvKkJvb2wgcHJvZ3Jlc3Nfb3V0ID0gRmFsc2U7Ki8KKwlFU3RhdGUqIHMgPSBzdHJtLT5zdGF0ZTsKKworCXdoaWxlICgxKSB7CisJCWlmIChzLT5zdGF0ZSA9PSBCWl9TX09VVFBVVCkgeworCQkJLypwcm9ncmVzc19vdXQgfD0qLyBjb3B5X291dHB1dF91bnRpbF9zdG9wKHMpOworCQkJaWYgKHMtPnN0YXRlX291dF9wb3MgPCBzLT5udW1aKSBicmVhazsKKwkJCWlmIChzLT5tb2RlID09IEJaX01fRklOSVNISU5HCisJCQkvLyMgJiYgcy0+YXZhaWxfaW5fZXhwZWN0ID09IDAKKwkJCSAmJiBzLT5zdHJtLT5hdmFpbF9pbiA9PSAwCisJCQkgJiYgaXNlbXB0eV9STChzKSkKKwkJCQlicmVhazsKKwkJCXByZXBhcmVfbmV3X2Jsb2NrKHMpOworCQkJcy0+c3RhdGUgPSBCWl9TX0lOUFVUOworI2lmZGVmIEZMVVNIX0lTX1VOVVNFRAorCQkJaWYgKHMtPm1vZGUgPT0gQlpfTV9GTFVTSElORworCQkJICYmIHMtPmF2YWlsX2luX2V4cGVjdCA9PSAwCisJCQkgJiYgaXNlbXB0eV9STChzKSkKKwkJCQlicmVhazsKKyNlbmRpZgorCQl9CisKKwkJaWYgKHMtPnN0YXRlID09IEJaX1NfSU5QVVQpIHsKKwkJCS8qcHJvZ3Jlc3NfaW4gfD0qLyBjb3B5X2lucHV0X3VudGlsX3N0b3Aocyk7CisJCQkvLyNpZiAocy0+bW9kZSAhPSBCWl9NX1JVTk5JTkcgJiYgcy0+YXZhaWxfaW5fZXhwZWN0ID09IDApIHsKKwkJCWlmIChzLT5tb2RlICE9IEJaX01fUlVOTklORyAmJiBzLT5zdHJtLT5hdmFpbF9pbiA9PSAwKSB7CisJCQkJZmx1c2hfUkwocyk7CisJCQkJQloyX2NvbXByZXNzQmxvY2socywgKHMtPm1vZGUgPT0gQlpfTV9GSU5JU0hJTkcpKTsKKwkJCQlzLT5zdGF0ZSA9IEJaX1NfT1VUUFVUOworCQkJfSBlbHNlCisJCQlpZiAocy0+bmJsb2NrID49IHMtPm5ibG9ja01BWCkgeworCQkJCUJaMl9jb21wcmVzc0Jsb2NrKHMsIDApOworCQkJCXMtPnN0YXRlID0gQlpfU19PVVRQVVQ7CisJCQl9IGVsc2UKKwkJCWlmIChzLT5zdHJtLT5hdmFpbF9pbiA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKnJldHVybiBwcm9ncmVzc19pbiB8fCBwcm9ncmVzc19vdXQ7Ki8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK2ludCBCWjJfYnpDb21wcmVzcyhiel9zdHJlYW0gKnN0cm0sIGludCBhY3Rpb24pCit7CisJLypCb29sIHByb2dyZXNzOyovCisJRVN0YXRlKiBzOworCisJcyA9IHN0cm0tPnN0YXRlOworCisJc3dpdGNoIChzLT5tb2RlKSB7CisJCWNhc2UgQlpfTV9SVU5OSU5HOgorCQkJaWYgKGFjdGlvbiA9PSBCWl9SVU4pIHsKKwkJCQkvKnByb2dyZXNzID0qLyBoYW5kbGVfY29tcHJlc3Moc3RybSk7CisJCQkJLypyZXR1cm4gcHJvZ3Jlc3MgPyBCWl9SVU5fT0sgOiBCWl9QQVJBTV9FUlJPUjsqLworCQkJCXJldHVybiBCWl9SVU5fT0s7CisJCQl9CisjaWZkZWYgRkxVU0hfSVNfVU5VU0VECisJCQllbHNlCisJCQlpZiAoYWN0aW9uID09IEJaX0ZMVVNIKSB7CisJCQkJLy8jcy0+YXZhaWxfaW5fZXhwZWN0ID0gc3RybS0+YXZhaWxfaW47CisJCQkJcy0+bW9kZSA9IEJaX01fRkxVU0hJTkc7CisJCQkJZ290byBjYXNlX0JaX01fRkxVU0hJTkc7CisJCQl9CisjZW5kaWYKKwkJCWVsc2UKKwkJCS8qaWYgKGFjdGlvbiA9PSBCWl9GSU5JU0gpKi8geworCQkJCS8vI3MtPmF2YWlsX2luX2V4cGVjdCA9IHN0cm0tPmF2YWlsX2luOworCQkJCXMtPm1vZGUgPSBCWl9NX0ZJTklTSElORzsKKwkJCQlnb3RvIGNhc2VfQlpfTV9GSU5JU0hJTkc7CisJCQl9CisKKyNpZmRlZiBGTFVTSF9JU19VTlVTRUQKKyBjYXNlX0JaX01fRkxVU0hJTkc6CisJCWNhc2UgQlpfTV9GTFVTSElORzoKKwkJCS8qaWYgKHMtPmF2YWlsX2luX2V4cGVjdCAhPSBzLT5zdHJtLT5hdmFpbF9pbikKKwkJCQlyZXR1cm4gQlpfU0VRVUVOQ0VfRVJST1I7Ki8KKwkJCS8qcHJvZ3Jlc3MgPSovIGhhbmRsZV9jb21wcmVzcyhzdHJtKTsKKwkJCWlmIChzLT5hdmFpbF9pbl9leHBlY3QgPiAwIHx8ICFpc2VtcHR5X1JMKHMpIHx8IHMtPnN0YXRlX291dF9wb3MgPCBzLT5udW1aKQorCQkJCXJldHVybiBCWl9GTFVTSF9PSzsKKwkJCXMtPm1vZGUgPSBCWl9NX1JVTk5JTkc7CisJCQlyZXR1cm4gQlpfUlVOX09LOworI2VuZGlmCisKKyBjYXNlX0JaX01fRklOSVNISU5HOgorCQkvKmNhc2UgQlpfTV9GSU5JU0hJTkc6Ki8KKwkJZGVmYXVsdDoKKwkJCS8qaWYgKHMtPmF2YWlsX2luX2V4cGVjdCAhPSBzLT5zdHJtLT5hdmFpbF9pbikKKwkJCQlyZXR1cm4gQlpfU0VRVUVOQ0VfRVJST1I7Ki8KKwkJCS8qcHJvZ3Jlc3MgPSovIGhhbmRsZV9jb21wcmVzcyhzdHJtKTsKKwkJCS8qaWYgKCFwcm9ncmVzcykgcmV0dXJuIEJaX1NFUVVFTkNFX0VSUk9SOyovCisJCQkvLyNpZiAocy0+YXZhaWxfaW5fZXhwZWN0ID4gMCB8fCAhaXNlbXB0eV9STChzKSB8fCBzLT5zdGF0ZV9vdXRfcG9zIDwgcy0+bnVtWikKKwkJCS8vIwlyZXR1cm4gQlpfRklOSVNIX09LOworCQkJaWYgKHMtPnN0cm0tPmF2YWlsX2luID4gMCB8fCAhaXNlbXB0eV9STChzKSB8fCBzLT5zdGF0ZV9vdXRfcG9zIDwgcy0+bnVtWikKKwkJCQlyZXR1cm4gQlpfRklOSVNIX09LOworCQkJLypzLT5tb2RlID0gQlpfTV9JRExFOyovCisJCQlyZXR1cm4gQlpfU1RSRUFNX0VORDsKKwl9CisJLyogcmV0dXJuIEJaX09LOyAtLW5vdCByZWFjaGVkLS0qLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBCWjJfYnpDb21wcmVzc0VuZChiel9zdHJlYW0gKnN0cm0pCit7CisJRVN0YXRlKiBzOworCisJcyA9IHN0cm0tPnN0YXRlOworCWZyZWUocy0+YXJyMSk7CisJZnJlZShzLT5hcnIyKTsKKwlmcmVlKHMtPmZ0YWIpOworCWZyZWUocy0+Y3JjMzJ0YWJsZSk7CisJZnJlZShzKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBNaXNjIGNvbnZlbmllbmNlIHN0dWZmICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBFWEFNUExFX0NPREVfRk9SX01FTV9UT19NRU1fQ09NUFJFU1NJT04KK3N0YXRpYworaW50IEJaMl9iekJ1ZmZUb0J1ZmZDb21wcmVzcyhjaGFyKiBkZXN0LAorCQl1bnNpZ25lZCBpbnQqIGRlc3RMZW4sCisJCWNoYXIqICAgICAgICAgc291cmNlLAorCQl1bnNpZ25lZCBpbnQgIHNvdXJjZUxlbiwKKwkJaW50ICAgICAgICAgICBibG9ja1NpemUxMDBrKQoreworCWJ6X3N0cmVhbSBzdHJtOworCWludCByZXQ7CisKKwlpZiAoZGVzdCA9PSBOVUxMIHx8IGRlc3RMZW4gPT0gTlVMTAorCSB8fCBzb3VyY2UgPT0gTlVMTAorCSB8fCBibG9ja1NpemUxMDBrIDwgMSB8fCBibG9ja1NpemUxMDBrID4gOQorCSkgeworCQlyZXR1cm4gQlpfUEFSQU1fRVJST1I7CisJfQorCisJQloyX2J6Q29tcHJlc3NJbml0KCZzdHJtLCBibG9ja1NpemUxMDBrKTsKKworCXN0cm0ubmV4dF9pbiA9IHNvdXJjZTsKKwlzdHJtLm5leHRfb3V0ID0gZGVzdDsKKwlzdHJtLmF2YWlsX2luID0gc291cmNlTGVuOworCXN0cm0uYXZhaWxfb3V0ID0gKmRlc3RMZW47CisKKwlyZXQgPSBCWjJfYnpDb21wcmVzcygmc3RybSwgQlpfRklOSVNIKTsKKwlpZiAocmV0ID09IEJaX0ZJTklTSF9PSykgZ290byBvdXRwdXRfb3ZlcmZsb3c7CisJaWYgKHJldCAhPSBCWl9TVFJFQU1fRU5EKSBnb3RvIGVycmhhbmRsZXI7CisKKwkvKiBub3JtYWwgdGVybWluYXRpb24gKi8KKwkqZGVzdExlbiAtPSBzdHJtLmF2YWlsX291dDsKKwlCWjJfYnpDb21wcmVzc0VuZCgmc3RybSk7CisJcmV0dXJuIEJaX09LOworCisgb3V0cHV0X292ZXJmbG93OgorCUJaMl9iekNvbXByZXNzRW5kKCZzdHJtKTsKKwlyZXR1cm4gQlpfT1VUQlVGRl9GVUxMOworCisgZXJyaGFuZGxlcjoKKwlCWjJfYnpDb21wcmVzc0VuZCgmc3RybSk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6bGliLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliLmggYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiODExYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWIuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogYnppcDIgaXMgd3JpdHRlbiBieSBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPi4KKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4uCisgKiBTZWUgUkVBRE1FIGFuZCBMSUNFTlNFIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBQdWJsaWMgaGVhZGVyIGZpbGUgZm9yIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6bGliLmggLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgYnppcDIvbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQgbGlicmFyeSBmb3IKK2xvc3NsZXNzLCBibG9jay1zb3J0aW5nIGRhdGEgY29tcHJlc3Npb24uCisKK2J6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMS4wLjQgb2YgMjAgRGVjZW1iZXIgMjAwNgorQ29weXJpZ2h0IChDKSAxOTk2LTIwMDYgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4KKworUGxlYXNlIHJlYWQgdGhlIFdBUk5JTkcsIERJU0NMQUlNRVIgYW5kIFBBVEVOVFMgc2VjdGlvbnMgaW4gdGhlCitSRUFETUUgZmlsZS4KKworVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBjb250YWluZWQKK2luIHRoZSBmaWxlIExJQ0VOU0UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBCWl9SVU4gICAgICAgICAgICAgICAwCisjZGVmaW5lIEJaX0ZMVVNIICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlpfRklOSVNIICAgICAgICAgICAgMgorCisjZGVmaW5lIEJaX09LICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlpfUlVOX09LICAgICAgICAgICAgMQorI2RlZmluZSBCWl9GTFVTSF9PSyAgICAgICAgICAyCisjZGVmaW5lIEJaX0ZJTklTSF9PSyAgICAgICAgIDMKKyNkZWZpbmUgQlpfU1RSRUFNX0VORCAgICAgICAgNAorI2RlZmluZSBCWl9TRVFVRU5DRV9FUlJPUiAgICAoLTEpCisjZGVmaW5lIEJaX1BBUkFNX0VSUk9SICAgICAgICgtMikKKyNkZWZpbmUgQlpfTUVNX0VSUk9SICAgICAgICAgKC0zKQorI2RlZmluZSBCWl9EQVRBX0VSUk9SICAgICAgICAoLTQpCisjZGVmaW5lIEJaX0RBVEFfRVJST1JfTUFHSUMgICgtNSkKKyNkZWZpbmUgQlpfSU9fRVJST1IgICAgICAgICAgKC02KQorI2RlZmluZSBCWl9VTkVYUEVDVEVEX0VPRiAgICAoLTcpCisjZGVmaW5lIEJaX09VVEJVRkZfRlVMTCAgICAgICgtOCkKKyNkZWZpbmUgQlpfQ09ORklHX0VSUk9SICAgICAgKC05KQorCit0eXBlZGVmIHN0cnVjdCBiel9zdHJlYW0geworCXZvaWQgKnN0YXRlOworCWNoYXIgKm5leHRfaW47CisJY2hhciAqbmV4dF9vdXQ7CisJdW5zaWduZWQgYXZhaWxfaW47CisJdW5zaWduZWQgYXZhaWxfb3V0OworCS8qdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX2luOyovCisJdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX291dDsKK30gYnpfc3RyZWFtOworCisvKi0tIENvcmUgKGxvdy1sZXZlbCkgbGlicmFyeSBmdW5jdGlvbnMgLS0qLworCitzdGF0aWMgdm9pZCBCWjJfYnpDb21wcmVzc0luaXQoYnpfc3RyZWFtICpzdHJtLCBpbnQgYmxvY2tTaXplMTAwayk7CitzdGF0aWMgaW50IEJaMl9iekNvbXByZXNzKGJ6X3N0cmVhbSAqc3RybSwgaW50IGFjdGlvbik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKK3N0YXRpYyB2b2lkIEJaMl9iekNvbXByZXNzRW5kKGJ6X3N0cmVhbSAqc3RybSk7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemxpYi5oIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYl9wcml2YXRlLmggYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDMwY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYl9wcml2YXRlLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBiemlwMiBpcyB3cml0dGVuIGJ5IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+LgorICogQWRhcHRlZCBmb3IgYnVzeWJveCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPi4KKyAqIFNlZSBSRUFETUUgYW5kIExJQ0VOU0UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIFByaXZhdGUgaGVhZGVyIGZpbGUgZm9yIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6bGliX3ByaXZhdGUuaCAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGZpbGUgaXMgcGFydCBvZiBiemlwMi9saWJiemlwMiwgYSBwcm9ncmFtIGFuZCBsaWJyYXJ5IGZvcgorbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworYnppcDIvbGliYnppcDIgdmVyc2lvbiAxLjAuNCBvZiAyMCBEZWNlbWJlciAyMDA2CitDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNiBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPgorCitQbGVhc2UgcmVhZCB0aGUgV0FSTklORywgRElTQ0xBSU1FUiBhbmQgUEFURU5UUyBzZWN0aW9ucyBpbiB0aGUKK1JFQURNRSBmaWxlLgorCitUaGlzIHByb2dyYW0gaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5lZAoraW4gdGhlIGZpbGUgTElDRU5TRS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAjaW5jbHVkZSAiYnpsaWIuaCIgKi8KKworLyotLSBHZW5lcmFsIHN0dWZmLiAtLSovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCb29sOworCisjZGVmaW5lIFRydWUgICgoQm9vbCkxKQorI2RlZmluZSBGYWxzZSAoKEJvb2wpMCkKKworI2lmIEJaX0xJR0hUX0RFQlVHCitzdGF0aWMgdm9pZCBiel9hc3NlcnRfZmFpbChpbnQgZXJyY29kZSkgTk9SRVRVUk47CisjZGVmaW5lIEFzc2VydEgoY29uZCwgZXJyY29kZSkgXAorZG8geyBcCisJaWYgKCEoY29uZCkpIFwKKwkJYnpfYXNzZXJ0X2ZhaWwoZXJyY29kZSk7IFwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBBc3NlcnRIKGNvbmQsIG1zZykgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBCWl9ERUJVRworI2RlZmluZSBBc3NlcnREKGNvbmQsIG1zZykgXAorZG8geyBcCisJaWYgKCEoY29uZCkpIFwKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIihkZWJ1ZyBidWlsZCk6IGludGVybmFsIGVycm9yICVzIiwgbXNnKTsgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEFzc2VydEQoY29uZCwgbXNnKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKi0tIEhlYWRlciBieXRlcy4gLS0qLworCisjZGVmaW5lIEJaX0hEUl9CIDB4NDIgICAvKiAnQicgKi8KKyNkZWZpbmUgQlpfSERSX1ogMHg1YSAgIC8qICdaJyAqLworI2RlZmluZSBCWl9IRFJfaCAweDY4ICAgLyogJ2gnICovCisjZGVmaW5lIEJaX0hEUl8wIDB4MzAgICAvKiAnMCcgKi8KKworI2RlZmluZSBCWl9IRFJfQlpoMCAweDQyNWE2ODMwCisKKy8qLS0gQ29uc3RhbnRzIGZvciB0aGUgYmFjayBlbmQuIC0tKi8KKworI2RlZmluZSBCWl9NQVhfQUxQSEFfU0laRSAyNTgKKyNkZWZpbmUgQlpfTUFYX0NPREVfTEVOICAgIDIzCisKKyNkZWZpbmUgQlpfUlVOQSAwCisjZGVmaW5lIEJaX1JVTkIgMQorCisjZGVmaW5lIEJaX05fR1JPVVBTIDYKKyNkZWZpbmUgQlpfR19TSVpFICAgNTAKKyNkZWZpbmUgQlpfTl9JVEVSUyAgNAorCisjZGVmaW5lIEJaX01BWF9TRUxFQ1RPUlMgKDIgKyAoOTAwMDAwIC8gQlpfR19TSVpFKSkKKworCisvKi0tIFN0dWZmIGZvciBkb2luZyBDUkNzLiAtLSovCisKKyNkZWZpbmUgQlpfSU5JVElBTElTRV9DUkMoY3JjVmFyKSBcCit7IFwKKwljcmNWYXIgPSAweGZmZmZmZmZmTDsgXAorfQorCisjZGVmaW5lIEJaX0ZJTkFMSVNFX0NSQyhjcmNWYXIpIFwKK3sgXAorCWNyY1ZhciA9IH4oY3JjVmFyKTsgXAorfQorCisjZGVmaW5lIEJaX1VQREFURV9DUkMocywgY3JjVmFyLCBjaGEpIFwKK3sgXAorCWNyY1ZhciA9IChjcmNWYXIgPDwgOCkgXiBzLT5jcmMzMnRhYmxlWyhjcmNWYXIgPj4gMjQpIF4gKCh1aW50OF90KWNoYSldOyBcCit9CisKKworLyotLSBTdGF0ZXMgYW5kIG1vZGVzIGZvciBjb21wcmVzc2lvbi4gLS0qLworCisjZGVmaW5lIEJaX01fSURMRSAgICAgIDEKKyNkZWZpbmUgQlpfTV9SVU5OSU5HICAgMgorI2RlZmluZSBCWl9NX0ZMVVNISU5HICAzCisjZGVmaW5lIEJaX01fRklOSVNISU5HIDQKKworI2RlZmluZSBCWl9TX09VVFBVVCAgICAxCisjZGVmaW5lIEJaX1NfSU5QVVQgICAgIDIKKworI2RlZmluZSBCWl9OX1JBRElYIDIKKyNkZWZpbmUgQlpfTl9RU09SVCAxMgorI2RlZmluZSBCWl9OX1NIRUxMIDE4CisjZGVmaW5lIEJaX05fT1ZFUlNIT09UIChCWl9OX1JBRElYICsgQlpfTl9RU09SVCArIEJaX05fU0hFTEwgKyAyKQorCisKKy8qLS0gU3RydWN0dXJlIGhvbGRpbmcgYWxsIHRoZSBjb21wcmVzc2lvbi1zaWRlIHN0dWZmLiAtLSovCisKK3R5cGVkZWYgc3RydWN0IEVTdGF0ZSB7CisJLyogcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgYnpfc3RyZWFtICovCisJYnpfc3RyZWFtICpzdHJtOworCisJLyogbW9kZSB0aGlzIHN0cmVhbSBpcyBpbiwgYW5kIHdoZXRoZXIgaW5wdXR0aW5nICovCisJLyogb3Igb3V0cHV0dGluZyBkYXRhICovCisJaW50MzJfdCAgbW9kZTsKKwlpbnQzMl90ICBzdGF0ZTsKKworCS8qIHJlbWVtYmVycyBhdmFpbF9pbiB3aGVuIGZsdXNoL2ZpbmlzaCByZXF1ZXN0ZWQgKi8KKy8qIGJib3g6IG5vdCBuZWVkZWQsIHN0cm0tPmF2YWlsX2luIGFsd2F5cyBoYXMgdGhlIHNhbWUgdmFsdWUgKi8KKy8qIGNvbW1lbnRlZCBvdXQgd2l0aCAnLy8jJyB0aHJvdWdob3V0IHRoZSBjb2RlICovCisJLyogdWludDMyX3QgYXZhaWxfaW5fZXhwZWN0OyAqLworCisJLyogZm9yIGRvaW5nIHRoZSBibG9jayBzb3J0aW5nICovCisJaW50MzJfdCAgb3JpZ1B0cjsKKwl1aW50MzJfdCAqYXJyMTsKKwl1aW50MzJfdCAqYXJyMjsKKwl1aW50MzJfdCAqZnRhYjsKKworCS8qIGFsaWFzZXMgZm9yIGFycjEgYW5kIGFycjIgKi8KKwl1aW50MzJfdCAqcHRyOworCXVpbnQ4X3QgICpibG9jazsKKwl1aW50MTZfdCAqbXRmdjsKKwl1aW50OF90ICAqemJpdHM7CisKKwkvKiBndWVzcyB3aGF0ICovCisJdWludDMyX3QgKmNyYzMydGFibGU7CisKKwkvKiBydW4tbGVuZ3RoLWVuY29kaW5nIG9mIHRoZSBpbnB1dCAqLworCXVpbnQzMl90IHN0YXRlX2luX2NoOworCWludDMyX3QgIHN0YXRlX2luX2xlbjsKKworCS8qIGlucHV0IGFuZCBvdXRwdXQgbGltaXRzIGFuZCBjdXJyZW50IHBvc25zICovCisJaW50MzJfdCAgbmJsb2NrOworCWludDMyX3QgIG5ibG9ja01BWDsKKwlpbnQzMl90ICBudW1aOworCWludDMyX3QgIHN0YXRlX291dF9wb3M7CisKKwkvKiB0aGUgYnVmZmVyIGZvciBiaXQgc3RyZWFtIGNyZWF0aW9uICovCisJdWludDMyX3QgYnNCdWZmOworCWludDMyX3QgIGJzTGl2ZTsKKworCS8qIGJsb2NrIGFuZCBjb21iaW5lZCBDUkNzICovCisJdWludDMyX3QgYmxvY2tDUkM7CisJdWludDMyX3QgY29tYmluZWRDUkM7CisKKwkvKiBtaXNjIGFkbWluaXN0cmF0aXVtICovCisJaW50MzJfdCAgYmxvY2tObzsKKwlpbnQzMl90ICBibG9ja1NpemUxMDBrOworCisJLyogc3R1ZmYgZm9yIGNvZGluZyB0aGUgTVRGIHZhbHVlcyAqLworCWludDMyX3QgIG5NVEY7CisKKwkvKiBtYXAgb2YgYnl0ZXMgdXNlZCBpbiBibG9jayAqLworCWludDMyX3QgIG5JblVzZTsKKwlCb29sICAgICBpblVzZVsyNTZdIEFMSUdORUQoc2l6ZW9mKGxvbmcpKTsKKwl1aW50OF90ICB1bnNlcVRvU2VxWzI1Nl07CisKKwkvKiBzdHVmZiBmb3IgY29kaW5nIHRoZSBNVEYgdmFsdWVzICovCisJaW50MzJfdCAgbXRmRnJlcSAgICBbQlpfTUFYX0FMUEhBX1NJWkVdOworCXVpbnQ4X3QgIHNlbGVjdG9yICAgW0JaX01BWF9TRUxFQ1RPUlNdOworCXVpbnQ4X3QgIHNlbGVjdG9yTXRmW0JaX01BWF9TRUxFQ1RPUlNdOworCisJdWludDhfdCAgbGVuW0JaX05fR1JPVVBTXVtCWl9NQVhfQUxQSEFfU0laRV07CisKKwkvKiBzdGFjay1zYXZpbmcgbWVhc3VyZXM6IHRoZXNlIGNhbiBiZSBsb2NhbCwgYnV0IHRoZXkgYXJlIHRvbyBiaWcgKi8KKwlpbnQzMl90ICBzZW5kTVRGVmFsdWVzX19jb2RlIFtCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworCWludDMyX3QgIHNlbmRNVEZWYWx1ZXNfX3JmcmVxW0JaX05fR1JPVVBTXVtCWl9NQVhfQUxQSEFfU0laRV07CisjaWYgQ09ORklHX0JaSVAyX0ZFQVRVUkVfU1BFRUQgPj0gNQorCS8qIHNlY29uZCBkaW1lbnNpb246IG9ubHkgMyBuZWVkZWQ7IDQgbWFrZXMgaW5kZXggY2FsY3VsYXRpb25zIGZhc3RlciAqLworCXVpbnQzMl90IHNlbmRNVEZWYWx1ZXNfX2xlbl9wYWNrW0JaX01BWF9BTFBIQV9TSVpFXVs0XTsKKyNlbmRpZgorCWludDMyX3QgIEJaMl9oYk1ha2VDb2RlTGVuZ3Roc19faGVhcCAgW0JaX01BWF9BTFBIQV9TSVpFICsgMl07CisJaW50MzJfdCAgQloyX2hiTWFrZUNvZGVMZW5ndGhzX193ZWlnaHRbQlpfTUFYX0FMUEhBX1NJWkUgKiAyXTsKKwlpbnQzMl90ICBCWjJfaGJNYWtlQ29kZUxlbmd0aHNfX3BhcmVudFtCWl9NQVhfQUxQSEFfU0laRSAqIDJdOworCisJaW50MzJfdCAgbWFpblNvcnRfX3J1bm5pbmdPcmRlclsyNTZdOworCWludDMyX3QgIG1haW5Tb3J0X19jb3B5U3RhcnRbMjU2XTsKKwlpbnQzMl90ICBtYWluU29ydF9fY29weUVuZFsyNTZdOworfSBFU3RhdGU7CisKKworLyotLSBjb21wcmVzc2lvbi4gLS0qLworCitzdGF0aWMgdm9pZAorQloyX2Jsb2NrU29ydChFU3RhdGUqKTsKKworc3RhdGljIHZvaWQKK0JaMl9jb21wcmVzc0Jsb2NrKEVTdGF0ZSosIGludCk7CisKK3N0YXRpYyB2b2lkCitCWjJfYnNJbml0V3JpdGUoRVN0YXRlKik7CisKK3N0YXRpYyB2b2lkCitCWjJfaGJBc3NpZ25Db2RlcyhpbnQzMl90KiwgdWludDhfdCosIGludDMyX3QsIGludDMyX3QsIGludDMyX3QpOworCitzdGF0aWMgdm9pZAorQloyX2hiTWFrZUNvZGVMZW5ndGhzKEVTdGF0ZSosIHVpbnQ4X3QqLCBpbnQzMl90KiwgaW50MzJfdCwgaW50MzJfdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6bGliX3ByaXZhdGUuaCAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovY29tcHJlc3MuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTM2NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9jb21wcmVzcy5jCkBAIC0wLDAgKzEsNjgwIEBACisvKgorICogYnppcDIgaXMgd3JpdHRlbiBieSBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPi4KKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4uCisgKiBTZWUgUkVBRE1FIGFuZCBMSUNFTlNFIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBDb21wcmVzc2lvbiBtYWNoaW5lcnkgKG5vdCBpbmNsIGJsb2NrIHNvcnRpbmcpICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgYnppcDIvbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQgbGlicmFyeSBmb3IKK2xvc3NsZXNzLCBibG9jay1zb3J0aW5nIGRhdGEgY29tcHJlc3Npb24uCisKK2J6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMS4wLjQgb2YgMjAgRGVjZW1iZXIgMjAwNgorQ29weXJpZ2h0IChDKSAxOTk2LTIwMDYgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4KKworUGxlYXNlIHJlYWQgdGhlIFdBUk5JTkcsIERJU0NMQUlNRVIgYW5kIFBBVEVOVFMgc2VjdGlvbnMgaW4gdGhlCitSRUFETUUgZmlsZS4KKworVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBjb250YWluZWQKK2luIHRoZSBmaWxlIExJQ0VOU0UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ0hBTkdFUworICogMC45LjAgICAgLS0gb3JpZ2luYWwgdmVyc2lvbi4KKyAqIDAuOS4wYS9iIC0tIG5vIGNoYW5nZXMgaW4gdGhpcyBmaWxlLgorICogMC45LjBjICAgLS0gY2hhbmdlZCBzZXR0aW5nIG9mIG5Hcm91cHMgaW4gc2VuZE1URlZhbHVlcygpCisgKiAgICAgICAgICAgICBzbyBhcyB0byBkbyBhIGJpdCBiZXR0ZXIgb24gc21hbGwgZmlsZXMKKyovCisKKy8qICNpbmNsdWRlICJiemxpYl9wcml2YXRlLmgiICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIEJpdCBzdHJlYW0gSS9PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIEJaMl9ic0luaXRXcml0ZShFU3RhdGUqIHMpCit7CisJcy0+YnNMaXZlID0gMDsKKwlzLT5ic0J1ZmYgPSAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBOT0lOTElORQordm9pZCBic0ZpbmlzaFdyaXRlKEVTdGF0ZSogcykKK3sKKwl3aGlsZSAocy0+YnNMaXZlID4gMCkgeworCQlzLT56Yml0c1tzLT5udW1aXSA9ICh1aW50OF90KShzLT5ic0J1ZmYgPj4gMjQpOworCQlzLT5udW1aKys7CisJCXMtPmJzQnVmZiA8PD0gODsKKwkJcy0+YnNMaXZlIC09IDg7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworLyogSGVscHMgb25seSBvbiBsZXZlbCA1LCBvbiBvdGhlciBsZXZlbHMgaHVydHMuID8gKi8KKyNpZiBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCA+PSA1CitBTFdBWVNfSU5MSU5FCisjZW5kaWYKK3ZvaWQgYnNXKEVTdGF0ZSogcywgaW50MzJfdCBuLCB1aW50MzJfdCB2KQoreworCXdoaWxlIChzLT5ic0xpdmUgPj0gOCkgeworCQlzLT56Yml0c1tzLT5udW1aXSA9ICh1aW50OF90KShzLT5ic0J1ZmYgPj4gMjQpOworCQlzLT5udW1aKys7CisJCXMtPmJzQnVmZiA8PD0gODsKKwkJcy0+YnNMaXZlIC09IDg7CisJfQorCXMtPmJzQnVmZiB8PSAodiA8PCAoMzIgLSBzLT5ic0xpdmUgLSBuKSk7CisJcy0+YnNMaXZlICs9IG47Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIGJzUHV0VTMyKEVTdGF0ZSogcywgdW5zaWduZWQgdSkKK3sKKwlic1cocywgOCwgKHUgPj4gMjQpICYgMHhmZik7CisJYnNXKHMsIDgsICh1ID4+IDE2KSAmIDB4ZmYpOworCWJzVyhzLCA4LCAodSA+PiAgOCkgJiAweGZmKTsKKwlic1cocywgOCwgIHUgICAgICAgICYgMHhmZik7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIGJzUHV0VTE2KEVTdGF0ZSogcywgdW5zaWduZWQgdSkKK3sKKwlic1cocywgOCwgKHUgPj4gIDgpICYgMHhmZik7CisJYnNXKHMsIDgsICB1ICAgICAgICAmIDB4ZmYpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIFRoZSBiYWNrIGVuZCBwcm9wZXIgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIG1ha2VNYXBzX2UoRVN0YXRlKiBzKQoreworCWludCBpOworCXMtPm5JblVzZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmIChzLT5pblVzZVtpXSkgeworCQkJcy0+dW5zZXFUb1NlcVtpXSA9IHMtPm5JblVzZTsKKwkJCXMtPm5JblVzZSsrOworCQl9CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBOT0lOTElORQordm9pZCBnZW5lcmF0ZU1URlZhbHVlcyhFU3RhdGUqIHMpCit7CisJdWludDhfdCB5eVsyNTZdOworCWludDMyX3QgaSwgajsKKwlpbnQzMl90IHpQZW5kOworCWludDMyX3Qgd3I7CisJaW50MzJfdCBFT0I7CisKKwkvKgorCSAqIEFmdGVyIHNvcnRpbmcgKGVnLCBoZXJlKSwKKwkgKiBzLT5hcnIxWzAgLi4gcy0+bmJsb2NrLTFdIGhvbGRzIHNvcnRlZCBvcmRlciwKKwkgKiBhbmQKKwkgKiAoKHVpbnQ4X3QqKXMtPmFycjIpWzAgLi4gcy0+bmJsb2NrLTFdCisJICogaG9sZHMgdGhlIG9yaWdpbmFsIGJsb2NrIGRhdGEuCisJICoKKwkgKiBUaGUgZmlyc3QgdGhpbmcgdG8gZG8gaXMgZ2VuZXJhdGUgdGhlIE1URiB2YWx1ZXMsCisJICogYW5kIHB1dCB0aGVtIGluICgodWludDE2X3QqKXMtPmFycjEpWzAgLi4gcy0+bmJsb2NrLTFdLgorCSAqCisJICogQmVjYXVzZSB0aGVyZSBhcmUgc3RyaWN0bHkgZmV3ZXIgb3IgZXF1YWwgTVRGIHZhbHVlcworCSAqIHRoYW4gYmxvY2sgdmFsdWVzLCBwdHIgdmFsdWVzIGluIHRoaXMgYXJlYSBhcmUgb3ZlcndyaXR0ZW4KKwkgKiB3aXRoIE1URiB2YWx1ZXMgb25seSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCisJICoKKwkgKiBUaGUgZmluYWwgY29tcHJlc3NlZCBiaXRzdHJlYW0gaXMgZ2VuZXJhdGVkIGludG8gdGhlCisJICogYXJlYSBzdGFydGluZyBhdCAmKCh1aW50OF90KilzLT5hcnIyKVtzLT5uYmxvY2tdCisJICoKKwkgKiBUaGVzZSBzdG9yYWdlIGFsaWFzZXMgYXJlIHNldCB1cCBpbiBiekNvbXByZXNzSW5pdCgpLAorCSAqIGV4Y2VwdCBmb3IgdGhlIGxhc3Qgb25lLCB3aGljaCBpcyBhcnJhbmdlZCBpbgorCSAqIGNvbXByZXNzQmxvY2soKS4KKwkgKi8KKwl1aW50MzJfdCogcHRyICAgPSBzLT5wdHI7CisJdWludDhfdCogIGJsb2NrID0gcy0+YmxvY2s7CisJdWludDE2X3QqIG10ZnYgID0gcy0+bXRmdjsKKworCW1ha2VNYXBzX2Uocyk7CisJRU9CID0gcy0+bkluVXNlKzE7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEVPQjsgaSsrKQorCQlzLT5tdGZGcmVxW2ldID0gMDsKKworCXdyID0gMDsKKwl6UGVuZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHMtPm5JblVzZTsgaSsrKQorCQl5eVtpXSA9ICh1aW50OF90KSBpOworCisJZm9yIChpID0gMDsgaSA8IHMtPm5ibG9jazsgaSsrKSB7CisJCXVpbnQ4X3QgbGxfaTsKKwkJQXNzZXJ0RCh3ciA8PSBpLCAiZ2VuZXJhdGVNVEZWYWx1ZXMoMSkiKTsKKwkJaiA9IHB0cltpXSAtIDE7CisJCWlmIChqIDwgMCkKKwkJCWogKz0gcy0+bmJsb2NrOworCQlsbF9pID0gcy0+dW5zZXFUb1NlcVtibG9ja1tqXV07CisJCUFzc2VydEQobGxfaSA8IHMtPm5JblVzZSwgImdlbmVyYXRlTVRGVmFsdWVzKDJhKSIpOworCisJCWlmICh5eVswXSA9PSBsbF9pKSB7CisJCQl6UGVuZCsrOworCQl9IGVsc2UgeworCQkJaWYgKHpQZW5kID4gMCkgeworCQkJCXpQZW5kLS07CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJaWYgKHpQZW5kICYgMSkgeworCQkJCQkJbXRmdlt3cl0gPSBCWl9SVU5COyB3cisrOworCQkJCQkJcy0+bXRmRnJlcVtCWl9SVU5CXSsrOworCQkJCQl9IGVsc2UgeworCQkJCQkJbXRmdlt3cl0gPSBCWl9SVU5BOyB3cisrOworCQkJCQkJcy0+bXRmRnJlcVtCWl9SVU5BXSsrOworCQkJCQl9CisJCQkJCWlmICh6UGVuZCA8IDIpIGJyZWFrOworCQkJCQl6UGVuZCA9ICh1aW50MzJfdCkoelBlbmQgLSAyKSAvIDI7CisJCQkJCS8qIGJib3g6IHVuc2lnbmVkIGRpdiBpcyBlYXNpZXIgKi8KKwkJCQl9OworCQkJCXpQZW5kID0gMDsKKwkJCX0KKwkJCXsKKwkJCQlyZWdpc3RlciB1aW50OF90ICBydG1wOworCQkJCXJlZ2lzdGVyIHVpbnQ4X3QqIHJ5eV9qOworCQkJCXJlZ2lzdGVyIHVpbnQ4X3QgIHJsbF9pOworCQkJCXJ0bXAgID0geXlbMV07CisJCQkJeXlbMV0gPSB5eVswXTsKKwkJCQlyeXlfaiA9ICYoeXlbMV0pOworCQkJCXJsbF9pID0gbGxfaTsKKwkJCQl3aGlsZSAocmxsX2kgIT0gcnRtcCkgeworCQkJCQlyZWdpc3RlciB1aW50OF90IHJ0bXAyOworCQkJCQlyeXlfaisrOworCQkJCQlydG1wMiAgPSBydG1wOworCQkJCQlydG1wICAgPSAqcnl5X2o7CisJCQkJCSpyeXlfaiA9IHJ0bXAyOworCQkJCX07CisJCQkJeXlbMF0gPSBydG1wOworCQkJCWogPSByeXlfaiAtICYoeXlbMF0pOworCQkJCW10ZnZbd3JdID0gaisxOworCQkJCXdyKys7CisJCQkJcy0+bXRmRnJlcVtqKzFdKys7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoelBlbmQgPiAwKSB7CisJCXpQZW5kLS07CisJCXdoaWxlICgxKSB7CisJCQlpZiAoelBlbmQgJiAxKSB7CisJCQkJbXRmdlt3cl0gPSBCWl9SVU5COworCQkJCXdyKys7CisJCQkJcy0+bXRmRnJlcVtCWl9SVU5CXSsrOworCQkJfSBlbHNlIHsKKwkJCQltdGZ2W3dyXSA9IEJaX1JVTkE7CisJCQkJd3IrKzsKKwkJCQlzLT5tdGZGcmVxW0JaX1JVTkFdKys7CisJCQl9CisJCQlpZiAoelBlbmQgPCAyKQorCQkJCWJyZWFrOworCQkJelBlbmQgPSAodWludDMyX3QpKHpQZW5kIC0gMikgLyAyOworCQkJLyogYmJveDogdW5zaWduZWQgZGl2IGlzIGVhc2llciAqLworCQl9OworCQl6UGVuZCA9IDA7CisJfQorCisJbXRmdlt3cl0gPSBFT0I7CisJd3IrKzsKKwlzLT5tdGZGcmVxW0VPQl0rKzsKKworCXMtPm5NVEYgPSB3cjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEJaX0xFU1NFUl9JQ09TVCAgMAorI2RlZmluZSBCWl9HUkVBVEVSX0lDT1NUIDE1CisKK3N0YXRpYyBOT0lOTElORQordm9pZCBzZW5kTVRGVmFsdWVzKEVTdGF0ZSogcykKK3sKKwlpbnQzMl90IHYsIHQsIGksIGosIGdzLCBnZSwgdG90YywgYnQsIGJjLCBpdGVyOworCWludDMyX3QgblNlbGVjdG9ycywgYWxwaGFTaXplLCBtaW5MZW4sIG1heExlbiwgc2VsQ3RyOworCWludDMyX3Qgbkdyb3VwczsKKworCS8qCisJICogdWludDhfdCBsZW5bQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKwkgKiBpcyBhIGdsb2JhbCBzaW5jZSB0aGUgZGVjb2RlciBhbHNvIG5lZWRzIGl0LgorCSAqCisJICogaW50MzJfdCAgY29kZVtCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworCSAqIGludDMyX3QgIHJmcmVxW0JaX05fR1JPVVBTXVtCWl9NQVhfQUxQSEFfU0laRV07CisJICogYXJlIGFsc28gZ2xvYmFscyBvbmx5IHVzZWQgaW4gdGhpcyBwcm9jLgorCSAqIE1hZGUgZ2xvYmFsIHRvIGtlZXAgc3RhY2sgZnJhbWUgc2l6ZSBzbWFsbC4KKwkgKi8KKyNkZWZpbmUgY29kZSAgICAgc2VuZE1URlZhbHVlc19fY29kZQorI2RlZmluZSByZnJlcSAgICBzZW5kTVRGVmFsdWVzX19yZnJlcQorI2RlZmluZSBsZW5fcGFjayBzZW5kTVRGVmFsdWVzX19sZW5fcGFjaworCisJdWludDE2X3QgY29zdFtCWl9OX0dST1VQU107CisJaW50MzJfdCAgZmF2ZVtCWl9OX0dST1VQU107CisKKwl1aW50MTZfdCogbXRmdiA9IHMtPm10ZnY7CisKKwlhbHBoYVNpemUgPSBzLT5uSW5Vc2UgKyAyOworCWZvciAodCA9IDA7IHQgPCBCWl9OX0dST1VQUzsgdCsrKQorCQlmb3IgKHYgPSAwOyB2IDwgYWxwaGFTaXplOyB2KyspCisJCQlzLT5sZW5bdF1bdl0gPSBCWl9HUkVBVEVSX0lDT1NUOworCisJLyotLS0gRGVjaWRlIGhvdyBtYW55IGNvZGluZyB0YWJsZXMgdG8gdXNlIC0tLSovCisJQXNzZXJ0SChzLT5uTVRGID4gMCwgMzAwMSk7CisJaWYgKHMtPm5NVEYgPCAyMDApICBuR3JvdXBzID0gMjsgZWxzZQorCWlmIChzLT5uTVRGIDwgNjAwKSAgbkdyb3VwcyA9IDM7IGVsc2UKKwlpZiAocy0+bk1URiA8IDEyMDApIG5Hcm91cHMgPSA0OyBlbHNlCisJaWYgKHMtPm5NVEYgPCAyNDAwKSBuR3JvdXBzID0gNTsgZWxzZQorCW5Hcm91cHMgPSA2OworCisJLyotLS0gR2VuZXJhdGUgYW4gaW5pdGlhbCBzZXQgb2YgY29kaW5nIHRhYmxlcyAtLS0qLworCXsKKwkJaW50MzJfdCBuUGFydCwgcmVtRiwgdEZyZXEsIGFGcmVxOworCisJCW5QYXJ0ID0gbkdyb3VwczsKKwkJcmVtRiAgPSBzLT5uTVRGOworCQlncyA9IDA7CisJCXdoaWxlIChuUGFydCA+IDApIHsKKwkJCXRGcmVxID0gcmVtRiAvIG5QYXJ0OworCQkJZ2UgPSBncyAtIDE7CisJCQlhRnJlcSA9IDA7CisJCQl3aGlsZSAoYUZyZXEgPCB0RnJlcSAmJiBnZSA8IGFscGhhU2l6ZS0xKSB7CisJCQkJZ2UrKzsKKwkJCQlhRnJlcSArPSBzLT5tdGZGcmVxW2dlXTsKKwkJCX0KKworCQkJaWYgKGdlID4gZ3MKKwkJCSAmJiBuUGFydCAhPSBuR3JvdXBzICYmIG5QYXJ0ICE9IDEKKwkJCSAmJiAoKG5Hcm91cHMgLSBuUGFydCkgJSAyID09IDEpIC8qIGJib3g6IGNhbiB0aGlzIGJlIHJlcGxhY2VkIGJ5IHggJiAxPyAqLworCQkJKSB7CisJCQkJYUZyZXEgLT0gcy0+bXRmRnJlcVtnZV07CisJCQkJZ2UtLTsKKwkJCX0KKworCQkJZm9yICh2ID0gMDsgdiA8IGFscGhhU2l6ZTsgdisrKQorCQkJCWlmICh2ID49IGdzICYmIHYgPD0gZ2UpCisJCQkJCXMtPmxlbltuUGFydC0xXVt2XSA9IEJaX0xFU1NFUl9JQ09TVDsKKwkJCQllbHNlCisJCQkJCXMtPmxlbltuUGFydC0xXVt2XSA9IEJaX0dSRUFURVJfSUNPU1Q7CisKKwkJCW5QYXJ0LS07CisJCQlncyA9IGdlICsgMTsKKwkJCXJlbUYgLT0gYUZyZXE7CisJCX0KKwl9CisKKwkvKgorCSAqIEl0ZXJhdGUgdXAgdG8gQlpfTl9JVEVSUyB0aW1lcyB0byBpbXByb3ZlIHRoZSB0YWJsZXMuCisJICovCisJZm9yIChpdGVyID0gMDsgaXRlciA8IEJaX05fSVRFUlM7IGl0ZXIrKykgeworCQlmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKQorCQkJZmF2ZVt0XSA9IDA7CisKKwkJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKKwkJCWZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykKKwkJCQlzLT5yZnJlcVt0XVt2XSA9IDA7CisKKyNpZiBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCA+PSA1CisJCS8qCisJCSAqIFNldCB1cCBhbiBhdXhpbGlhcnkgbGVuZ3RoIHRhYmxlIHdoaWNoIGlzIHVzZWQgdG8gZmFzdC10cmFjaworCQkgKiB0aGUgY29tbW9uIGNhc2UgKG5Hcm91cHMgPT0gNikuCisJCSAqLworCQlpZiAobkdyb3VwcyA9PSA2KSB7CisJCQlmb3IgKHYgPSAwOyB2IDwgYWxwaGFTaXplOyB2KyspIHsKKwkJCQlzLT5sZW5fcGFja1t2XVswXSA9IChzLT5sZW5bMV1bdl0gPDwgMTYpIHwgcy0+bGVuWzBdW3ZdOworCQkJCXMtPmxlbl9wYWNrW3ZdWzFdID0gKHMtPmxlblszXVt2XSA8PCAxNikgfCBzLT5sZW5bMl1bdl07CisJCQkJcy0+bGVuX3BhY2tbdl1bMl0gPSAocy0+bGVuWzVdW3ZdIDw8IDE2KSB8IHMtPmxlbls0XVt2XTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCW5TZWxlY3RvcnMgPSAwOworCQl0b3RjID0gMDsKKwkJZ3MgPSAwOworCQl3aGlsZSAoMSkgeworCQkJLyotLS0gU2V0IGdyb3VwIHN0YXJ0ICYgZW5kIG1hcmtzLiAtLSovCisJCQlpZiAoZ3MgPj0gcy0+bk1URikKKwkJCQlicmVhazsKKwkJCWdlID0gZ3MgKyBCWl9HX1NJWkUgLSAxOworCQkJaWYgKGdlID49IHMtPm5NVEYpCisJCQkJZ2UgPSBzLT5uTVRGLTE7CisKKwkJCS8qCisJCQkgKiBDYWxjdWxhdGUgdGhlIGNvc3Qgb2YgdGhpcyBncm91cCBhcyBjb2RlZAorCQkJICogYnkgZWFjaCBvZiB0aGUgY29kaW5nIHRhYmxlcy4KKwkJCSAqLworCQkJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKKwkJCQljb3N0W3RdID0gMDsKKyNpZiBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCA+PSA1CisJCQlpZiAobkdyb3VwcyA9PSA2ICYmIDUwID09IGdlLWdzKzEpIHsKKwkJCQkvKi0tLSBmYXN0IHRyYWNrIHRoZSBjb21tb24gY2FzZSAtLS0qLworCQkJCXJlZ2lzdGVyIHVpbnQzMl90IGNvc3QwMSwgY29zdDIzLCBjb3N0NDU7CisJCQkJcmVnaXN0ZXIgdWludDE2X3QgaWN2OworCQkJCWNvc3QwMSA9IGNvc3QyMyA9IGNvc3Q0NSA9IDA7CisjZGVmaW5lIEJaX0lURVIobm4pIFwKKwlpY3YgPSBtdGZ2W2dzKyhubildOyBcCisJY29zdDAxICs9IHMtPmxlbl9wYWNrW2ljdl1bMF07IFwKKwljb3N0MjMgKz0gcy0+bGVuX3BhY2tbaWN2XVsxXTsgXAorCWNvc3Q0NSArPSBzLT5sZW5fcGFja1tpY3ZdWzJdOworCQkJCUJaX0lURVIoMCk7ICBCWl9JVEVSKDEpOyAgQlpfSVRFUigyKTsgIEJaX0lURVIoMyk7ICBCWl9JVEVSKDQpOworCQkJCUJaX0lURVIoNSk7ICBCWl9JVEVSKDYpOyAgQlpfSVRFUig3KTsgIEJaX0lURVIoOCk7ICBCWl9JVEVSKDkpOworCQkJCUJaX0lURVIoMTApOyBCWl9JVEVSKDExKTsgQlpfSVRFUigxMik7IEJaX0lURVIoMTMpOyBCWl9JVEVSKDE0KTsKKwkJCQlCWl9JVEVSKDE1KTsgQlpfSVRFUigxNik7IEJaX0lURVIoMTcpOyBCWl9JVEVSKDE4KTsgQlpfSVRFUigxOSk7CisJCQkJQlpfSVRFUigyMCk7IEJaX0lURVIoMjEpOyBCWl9JVEVSKDIyKTsgQlpfSVRFUigyMyk7IEJaX0lURVIoMjQpOworCQkJCUJaX0lURVIoMjUpOyBCWl9JVEVSKDI2KTsgQlpfSVRFUigyNyk7IEJaX0lURVIoMjgpOyBCWl9JVEVSKDI5KTsKKwkJCQlCWl9JVEVSKDMwKTsgQlpfSVRFUigzMSk7IEJaX0lURVIoMzIpOyBCWl9JVEVSKDMzKTsgQlpfSVRFUigzNCk7CisJCQkJQlpfSVRFUigzNSk7IEJaX0lURVIoMzYpOyBCWl9JVEVSKDM3KTsgQlpfSVRFUigzOCk7IEJaX0lURVIoMzkpOworCQkJCUJaX0lURVIoNDApOyBCWl9JVEVSKDQxKTsgQlpfSVRFUig0Mik7IEJaX0lURVIoNDMpOyBCWl9JVEVSKDQ0KTsKKwkJCQlCWl9JVEVSKDQ1KTsgQlpfSVRFUig0Nik7IEJaX0lURVIoNDcpOyBCWl9JVEVSKDQ4KTsgQlpfSVRFUig0OSk7CisjdW5kZWYgQlpfSVRFUgorCQkJCWNvc3RbMF0gPSBjb3N0MDEgJiAweGZmZmY7IGNvc3RbMV0gPSBjb3N0MDEgPj4gMTY7CisJCQkJY29zdFsyXSA9IGNvc3QyMyAmIDB4ZmZmZjsgY29zdFszXSA9IGNvc3QyMyA+PiAxNjsKKwkJCQljb3N0WzRdID0gY29zdDQ1ICYgMHhmZmZmOyBjb3N0WzVdID0gY29zdDQ1ID4+IDE2OworCisJCQl9IGVsc2UKKyNlbmRpZgorCQkJeworCQkJCS8qLS0tIHNsb3cgdmVyc2lvbiB3aGljaCBjb3JyZWN0bHkgaGFuZGxlcyBhbGwgc2l0dWF0aW9ucyAtLS0qLworCQkJCWZvciAoaSA9IGdzOyBpIDw9IGdlOyBpKyspIHsKKwkJCQkJdWludDE2X3QgaWN2ID0gbXRmdltpXTsKKwkJCQkJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKKwkJCQkJCWNvc3RbdF0gKz0gcy0+bGVuW3RdW2ljdl07CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIEZpbmQgdGhlIGNvZGluZyB0YWJsZSB3aGljaCBpcyBiZXN0IGZvciB0aGlzIGdyb3VwLAorCQkJICogYW5kIHJlY29yZCBpdHMgaWRlbnRpdHkgaW4gdGhlIHNlbGVjdG9yIHRhYmxlLgorCQkJICovCisJCQkvKmJjID0gOTk5OTk5OTk5OyovCisJCQkvKmJ0ID0gLTE7Ki8KKwkJCWJjID0gY29zdFswXTsKKwkJCWJ0ID0gMDsKKwkJCWZvciAodCA9IDEgLyowKi87IHQgPCBuR3JvdXBzOyB0KyspIHsKKwkJCQlpZiAoY29zdFt0XSA8IGJjKSB7CisJCQkJCWJjID0gY29zdFt0XTsKKwkJCQkJYnQgPSB0OworCQkJCX0KKwkJCX0KKwkJCXRvdGMgKz0gYmM7CisJCQlmYXZlW2J0XSsrOworCQkJcy0+c2VsZWN0b3JbblNlbGVjdG9yc10gPSBidDsKKwkJCW5TZWxlY3RvcnMrKzsKKworCQkJLyoKKwkJCSAqIEluY3JlbWVudCB0aGUgc3ltYm9sIGZyZXF1ZW5jaWVzIGZvciB0aGUgc2VsZWN0ZWQgdGFibGUuCisJCQkgKi8KKy8qIDElIGZhc3RlciBjb21wcmVzcy4gKzgwMCBieXRlcyAqLworI2lmIENPTkZJR19CWklQMl9GRUFUVVJFX1NQRUVEID49IDQKKwkJCWlmIChuR3JvdXBzID09IDYgJiYgNTAgPT0gZ2UtZ3MrMSkgeworCQkJCS8qLS0tIGZhc3QgdHJhY2sgdGhlIGNvbW1vbiBjYXNlIC0tLSovCisjZGVmaW5lIEJaX0lUVVIobm4pIHMtPnJmcmVxW2J0XVttdGZ2W2dzICsgKG5uKV1dKysKKwkJCQlCWl9JVFVSKDApOyAgQlpfSVRVUigxKTsgIEJaX0lUVVIoMik7ICBCWl9JVFVSKDMpOyAgQlpfSVRVUig0KTsKKwkJCQlCWl9JVFVSKDUpOyAgQlpfSVRVUig2KTsgIEJaX0lUVVIoNyk7ICBCWl9JVFVSKDgpOyAgQlpfSVRVUig5KTsKKwkJCQlCWl9JVFVSKDEwKTsgQlpfSVRVUigxMSk7IEJaX0lUVVIoMTIpOyBCWl9JVFVSKDEzKTsgQlpfSVRVUigxNCk7CisJCQkJQlpfSVRVUigxNSk7IEJaX0lUVVIoMTYpOyBCWl9JVFVSKDE3KTsgQlpfSVRVUigxOCk7IEJaX0lUVVIoMTkpOworCQkJCUJaX0lUVVIoMjApOyBCWl9JVFVSKDIxKTsgQlpfSVRVUigyMik7IEJaX0lUVVIoMjMpOyBCWl9JVFVSKDI0KTsKKwkJCQlCWl9JVFVSKDI1KTsgQlpfSVRVUigyNik7IEJaX0lUVVIoMjcpOyBCWl9JVFVSKDI4KTsgQlpfSVRVUigyOSk7CisJCQkJQlpfSVRVUigzMCk7IEJaX0lUVVIoMzEpOyBCWl9JVFVSKDMyKTsgQlpfSVRVUigzMyk7IEJaX0lUVVIoMzQpOworCQkJCUJaX0lUVVIoMzUpOyBCWl9JVFVSKDM2KTsgQlpfSVRVUigzNyk7IEJaX0lUVVIoMzgpOyBCWl9JVFVSKDM5KTsKKwkJCQlCWl9JVFVSKDQwKTsgQlpfSVRVUig0MSk7IEJaX0lUVVIoNDIpOyBCWl9JVFVSKDQzKTsgQlpfSVRVUig0NCk7CisJCQkJQlpfSVRVUig0NSk7IEJaX0lUVVIoNDYpOyBCWl9JVFVSKDQ3KTsgQlpfSVRVUig0OCk7IEJaX0lUVVIoNDkpOworI3VuZGVmIEJaX0lUVVIKKwkJCQlncyA9IGdlICsgMTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJLyotLS0gc2xvdyB2ZXJzaW9uIHdoaWNoIGNvcnJlY3RseSBoYW5kbGVzIGFsbCBzaXR1YXRpb25zIC0tLSovCisJCQkJd2hpbGUgKGdzIDw9IGdlKSB7CisJCQkJCXMtPnJmcmVxW2J0XVttdGZ2W2dzXV0rKzsKKwkJCQkJZ3MrKzsKKwkJCQl9CisJCQkJLyogYWxyZWFkeSBpczogZ3MgPSBnZSArIDE7ICovCisJCQl9CisJCX0KKworCQkvKgorCQkgKiBSZWNvbXB1dGUgdGhlIHRhYmxlcyBiYXNlZCBvbiB0aGUgYWNjdW11bGF0ZWQgZnJlcXVlbmNpZXMuCisJCSAqLworCQkvKiBtYXhMZW4gd2FzIGNoYW5nZWQgZnJvbSAyMCB0byAxNyBpbiBiemlwMi0xLjAuMy4gIFNlZQorCQkgKiBjb21tZW50IGluIGh1ZmZtYW4uYyBmb3IgZGV0YWlscy4gKi8KKwkJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKKwkJCUJaMl9oYk1ha2VDb2RlTGVuZ3RocyhzLCAmKHMtPmxlblt0XVswXSksICYocy0+cmZyZXFbdF1bMF0pLCBhbHBoYVNpemUsIDE3IC8qMjAqLyk7CisJfQorCisJQXNzZXJ0SChuR3JvdXBzIDwgOCwgMzAwMik7CisJQXNzZXJ0SChuU2VsZWN0b3JzIDwgMzI3NjggJiYgblNlbGVjdG9ycyA8PSAoMiArICg5MDAwMDAgLyBCWl9HX1NJWkUpKSwgMzAwMyk7CisKKwkvKi0tLSBDb21wdXRlIE1URiB2YWx1ZXMgZm9yIHRoZSBzZWxlY3RvcnMuIC0tLSovCisJeworCQl1aW50OF90IHBvc1tCWl9OX0dST1VQU10sIGxsX2ksIHRtcDIsIHRtcDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbkdyb3VwczsgaSsrKQorCQkJcG9zW2ldID0gaTsKKwkJZm9yIChpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgeworCQkJbGxfaSA9IHMtPnNlbGVjdG9yW2ldOworCQkJaiA9IDA7CisJCQl0bXAgPSBwb3Nbal07CisJCQl3aGlsZSAobGxfaSAhPSB0bXApIHsKKwkJCQlqKys7CisJCQkJdG1wMiA9IHRtcDsKKwkJCQl0bXAgPSBwb3Nbal07CisJCQkJcG9zW2pdID0gdG1wMjsKKwkJCX07CisJCQlwb3NbMF0gPSB0bXA7CisJCQlzLT5zZWxlY3Rvck10ZltpXSA9IGo7CisJCX0KKwl9OworCisJLyotLS0gQXNzaWduIGFjdHVhbCBjb2RlcyBmb3IgdGhlIHRhYmxlcy4gLS0qLworCWZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKwkJbWluTGVuID0gMzI7CisJCW1heExlbiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgeworCQkJaWYgKHMtPmxlblt0XVtpXSA+IG1heExlbikgbWF4TGVuID0gcy0+bGVuW3RdW2ldOworCQkJaWYgKHMtPmxlblt0XVtpXSA8IG1pbkxlbikgbWluTGVuID0gcy0+bGVuW3RdW2ldOworCQl9CisJCUFzc2VydEgoIShtYXhMZW4gPiAxNyAvKjIwKi8pLCAzMDA0KTsKKwkJQXNzZXJ0SCghKG1pbkxlbiA8IDEpLCAzMDA1KTsKKwkJQloyX2hiQXNzaWduQ29kZXMoJihzLT5jb2RlW3RdWzBdKSwgJihzLT5sZW5bdF1bMF0pLCBtaW5MZW4sIG1heExlbiwgYWxwaGFTaXplKTsKKwl9CisKKwkvKi0tLSBUcmFuc21pdCB0aGUgbWFwcGluZyB0YWJsZS4gLS0tKi8KKwl7CisJCS8qIGJib3g6IG9wdGltaXplZCBhIGJpdCBtb3JlIHRoYW4gaW4gYnppcDIgKi8KKwkJaW50IGluVXNlMTYgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJaWYgKHNpemVvZihsb25nKSA8PSA0KSB7CisJCQkJaW5Vc2UxNiA9IGluVXNlMTYqMiArCisJCQkJCSgoKih1aW50MzJfdCopJihzLT5pblVzZVtpICogMTYgKyAwXSkKKwkJCQkJfCAqKHVpbnQzMl90KikmKHMtPmluVXNlW2kgKiAxNiArIDRdKQorCQkJCQl8ICoodWludDMyX3QqKSYocy0+aW5Vc2VbaSAqIDE2ICsgOF0pCisJCQkJCXwgKih1aW50MzJfdCopJihzLT5pblVzZVtpICogMTYgKyAxMl0pKSAhPSAwKTsKKwkJCX0gZWxzZSB7IC8qIE91ciBDUFUgY2FuIGRvIGJldHRlciAqLworCQkJCWluVXNlMTYgPSBpblVzZTE2KjIgKworCQkJCQkoKCoodWludDY0X3QqKSYocy0+aW5Vc2VbaSAqIDE2ICsgMF0pCisJCQkJCXwgKih1aW50NjRfdCopJihzLT5pblVzZVtpICogMTYgKyA4XSkpICE9IDApOworCQkJfQorCQl9CisKKwkJYnNXKHMsIDE2LCBpblVzZTE2KTsKKworCQlpblVzZTE2IDw8PSAoc2l6ZW9mKGludCkqOCAtIDE2KTsgLyogbW92ZSAxNXRoIGJpdCBpbnRvIHNpZ24gYml0ICovCisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoaW5Vc2UxNiA8IDApIHsKKwkJCQl1bnNpZ25lZCB2MTYgPSAwOworCQkJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorCQkJCQl2MTYgPSB2MTYqMiArIHMtPmluVXNlW2kgKiAxNiArIGpdOworCQkJCWJzVyhzLCAxNiwgdjE2KTsKKwkJCX0KKwkJCWluVXNlMTYgPDw9IDE7CisJCX0KKwl9CisKKwkvKi0tLSBOb3cgdGhlIHNlbGVjdG9ycy4gLS0tKi8KKwlic1cocywgMywgbkdyb3Vwcyk7CisJYnNXKHMsIDE1LCBuU2VsZWN0b3JzKTsKKwlmb3IgKGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBzLT5zZWxlY3Rvck10ZltpXTsgaisrKQorCQkJYnNXKHMsIDEsIDEpOworCQlic1cocywgMSwgMCk7CisJfQorCisJLyotLS0gTm93IHRoZSBjb2RpbmcgdGFibGVzLiAtLS0qLworCWZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKwkJaW50MzJfdCBjdXJyID0gcy0+bGVuW3RdWzBdOworCQlic1cocywgNSwgY3Vycik7CisJCWZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgeworCQkJd2hpbGUgKGN1cnIgPCBzLT5sZW5bdF1baV0pIHsgYnNXKHMsIDIsIDIpOyBjdXJyKys7IC8qIDEwICovIH07CisJCQl3aGlsZSAoY3VyciA+IHMtPmxlblt0XVtpXSkgeyBic1cocywgMiwgMyk7IGN1cnItLTsgLyogMTEgKi8gfTsKKwkJCWJzVyhzLCAxLCAwKTsKKwkJfQorCX0KKworCS8qLS0tIEFuZCBmaW5hbGx5LCB0aGUgYmxvY2sgZGF0YSBwcm9wZXIgLS0tKi8KKwlzZWxDdHIgPSAwOworCWdzID0gMDsKKwl3aGlsZSAoMSkgeworCQlpZiAoZ3MgPj0gcy0+bk1URikKKwkJCWJyZWFrOworCQlnZSA9IGdzICsgQlpfR19TSVpFIC0gMTsKKwkJaWYgKGdlID49IHMtPm5NVEYpCisJCQlnZSA9IHMtPm5NVEYtMTsKKwkJQXNzZXJ0SChzLT5zZWxlY3RvcltzZWxDdHJdIDwgbkdyb3VwcywgMzAwNik7CisKKy8qIENvc3RzIDEzMDAgYnl0ZXMgYW5kIGlzIF9zbG93ZXJfIChvbiBJbnRlbCBDb3JlIDIpICovCisjaWYgMAorCQlpZiAobkdyb3VwcyA9PSA2ICYmIDUwID09IGdlLWdzKzEpIHsKKwkJCS8qLS0tIGZhc3QgdHJhY2sgdGhlIGNvbW1vbiBjYXNlIC0tLSovCisJCQl1aW50MTZfdCBtdGZ2X2k7CisJCQl1aW50OF90KiBzX2xlbl9zZWxfc2VsQ3RyICA9ICYocy0+bGVuW3MtPnNlbGVjdG9yW3NlbEN0cl1dWzBdKTsKKwkJCWludDMyX3QqIHNfY29kZV9zZWxfc2VsQ3RyID0gJihzLT5jb2RlW3MtPnNlbGVjdG9yW3NlbEN0cl1dWzBdKTsKKyNkZWZpbmUgQlpfSVRBSChubikgXAorCW10ZnZfaSA9IG10ZnZbZ3MrKG5uKV07IFwKKwlic1cocywgc19sZW5fc2VsX3NlbEN0clttdGZ2X2ldLCBzX2NvZGVfc2VsX3NlbEN0clttdGZ2X2ldKQorCQkJQlpfSVRBSCgwKTsgIEJaX0lUQUgoMSk7ICBCWl9JVEFIKDIpOyAgQlpfSVRBSCgzKTsgIEJaX0lUQUgoNCk7CisJCQlCWl9JVEFIKDUpOyAgQlpfSVRBSCg2KTsgIEJaX0lUQUgoNyk7ICBCWl9JVEFIKDgpOyAgQlpfSVRBSCg5KTsKKwkJCUJaX0lUQUgoMTApOyBCWl9JVEFIKDExKTsgQlpfSVRBSCgxMik7IEJaX0lUQUgoMTMpOyBCWl9JVEFIKDE0KTsKKwkJCUJaX0lUQUgoMTUpOyBCWl9JVEFIKDE2KTsgQlpfSVRBSCgxNyk7IEJaX0lUQUgoMTgpOyBCWl9JVEFIKDE5KTsKKwkJCUJaX0lUQUgoMjApOyBCWl9JVEFIKDIxKTsgQlpfSVRBSCgyMik7IEJaX0lUQUgoMjMpOyBCWl9JVEFIKDI0KTsKKwkJCUJaX0lUQUgoMjUpOyBCWl9JVEFIKDI2KTsgQlpfSVRBSCgyNyk7IEJaX0lUQUgoMjgpOyBCWl9JVEFIKDI5KTsKKwkJCUJaX0lUQUgoMzApOyBCWl9JVEFIKDMxKTsgQlpfSVRBSCgzMik7IEJaX0lUQUgoMzMpOyBCWl9JVEFIKDM0KTsKKwkJCUJaX0lUQUgoMzUpOyBCWl9JVEFIKDM2KTsgQlpfSVRBSCgzNyk7IEJaX0lUQUgoMzgpOyBCWl9JVEFIKDM5KTsKKwkJCUJaX0lUQUgoNDApOyBCWl9JVEFIKDQxKTsgQlpfSVRBSCg0Mik7IEJaX0lUQUgoNDMpOyBCWl9JVEFIKDQ0KTsKKwkJCUJaX0lUQUgoNDUpOyBCWl9JVEFIKDQ2KTsgQlpfSVRBSCg0Nyk7IEJaX0lUQUgoNDgpOyBCWl9JVEFIKDQ5KTsKKyN1bmRlZiBCWl9JVEFICisJCQlncyA9IGdlKzE7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCS8qLS0tIHNsb3cgdmVyc2lvbiB3aGljaCBjb3JyZWN0bHkgaGFuZGxlcyBhbGwgc2l0dWF0aW9ucyAtLS0qLworCQkJLyogY29kZSBpcyBiaXQgYmlnZ2VyLCBidXQgbW92ZXMgbXVsdGlwbHkgb3V0IG9mIHRoZSBsb29wICovCisJCQl1aW50OF90KiBzX2xlbl9zZWxfc2VsQ3RyICA9ICYocy0+bGVuIFtzLT5zZWxlY3RvcltzZWxDdHJdXVswXSk7CisJCQlpbnQzMl90KiBzX2NvZGVfc2VsX3NlbEN0ciA9ICYocy0+Y29kZVtzLT5zZWxlY3RvcltzZWxDdHJdXVswXSk7CisJCQl3aGlsZSAoZ3MgPD0gZ2UpIHsKKwkJCQlic1cocywKKwkJCQkJc19sZW5fc2VsX3NlbEN0clttdGZ2W2dzXV0sCisJCQkJCXNfY29kZV9zZWxfc2VsQ3RyW210ZnZbZ3NdXQorCQkJCSk7CisJCQkJZ3MrKzsKKwkJCX0KKwkJCS8qIGFscmVhZHkgaXM6IGdzID0gZ2UrMTsgKi8KKwkJfQorCQlzZWxDdHIrKzsKKwl9CisJQXNzZXJ0SChzZWxDdHIgPT0gblNlbGVjdG9ycywgMzAwNyk7CisjdW5kZWYgY29kZQorI3VuZGVmIHJmcmVxCisjdW5kZWYgbGVuX3BhY2sKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgQloyX2NvbXByZXNzQmxvY2soRVN0YXRlKiBzLCBpbnQgaXNfbGFzdF9ibG9jaykKK3sKKwlpZiAocy0+bmJsb2NrID4gMCkgeworCQlCWl9GSU5BTElTRV9DUkMocy0+YmxvY2tDUkMpOworCQlzLT5jb21iaW5lZENSQyA9IChzLT5jb21iaW5lZENSQyA8PCAxKSB8IChzLT5jb21iaW5lZENSQyA+PiAzMSk7CisJCXMtPmNvbWJpbmVkQ1JDIF49IHMtPmJsb2NrQ1JDOworCQlpZiAocy0+YmxvY2tObyA+IDEpCisJCQlzLT5udW1aID0gMDsKKworCQlCWjJfYmxvY2tTb3J0KHMpOworCX0KKworCXMtPnpiaXRzID0gJigodWludDhfdCopcy0+YXJyMilbcy0+bmJsb2NrXTsKKworCS8qLS0gSWYgdGhpcyBpcyB0aGUgZmlyc3QgYmxvY2ssIGNyZWF0ZSB0aGUgc3RyZWFtIGhlYWRlci4gLS0qLworCWlmIChzLT5ibG9ja05vID09IDEpIHsKKwkJQloyX2JzSW5pdFdyaXRlKHMpOworCQkvKmJzUHV0VTgocywgQlpfSERSX0IpOyovCisJCS8qYnNQdXRVOChzLCBCWl9IRFJfWik7Ki8KKwkJLypic1B1dFU4KHMsIEJaX0hEUl9oKTsqLworCQkvKmJzUHV0VTgocywgQlpfSERSXzAgKyBzLT5ibG9ja1NpemUxMDBrKTsqLworCQlic1B1dFUzMihzLCBCWl9IRFJfQlpoMCArIHMtPmJsb2NrU2l6ZTEwMGspOworCX0KKworCWlmIChzLT5uYmxvY2sgPiAwKSB7CisJCS8qYnNQdXRVOChzLCAweDMxKTsqLworCQkvKmJzUHV0VTgocywgMHg0MSk7Ki8KKwkJLypic1B1dFU4KHMsIDB4NTkpOyovCisJCS8qYnNQdXRVOChzLCAweDI2KTsqLworCQlic1B1dFUzMihzLCAweDMxNDE1OTI2KTsKKwkJLypic1B1dFU4KHMsIDB4NTMpOyovCisJCS8qYnNQdXRVOChzLCAweDU5KTsqLworCQlic1B1dFUxNihzLCAweDUzNTkpOworCisJCS8qLS0gTm93IHRoZSBibG9jaydzIENSQywgc28gaXQgaXMgaW4gYSBrbm93biBwbGFjZS4gLS0qLworCQlic1B1dFUzMihzLCBzLT5ibG9ja0NSQyk7CisKKwkJLyoKKwkJICogTm93IGEgc2luZ2xlIGJpdCBpbmRpY2F0aW5nIChub24tKXJhbmRvbWlzYXRpb24uCisJCSAqIEFzIG9mIHZlcnNpb24gMC45LjUsIHdlIHVzZSBhIGJldHRlciBzb3J0aW5nIGFsZ29yaXRobQorCQkgKiB3aGljaCBtYWtlcyByYW5kb21pc2F0aW9uIHVubmVjZXNzYXJ5LiAgU28gYWx3YXlzIHNldAorCQkgKiB0aGUgcmFuZG9taXNlZCBiaXQgdG8gJ25vJy4gIE9mIGNvdXJzZSwgdGhlIGRlY29kZXIKKwkJICogc3RpbGwgbmVlZHMgdG8gYmUgYWJsZSB0byBoYW5kbGUgcmFuZG9taXNlZCBibG9ja3MKKwkJICogc28gYXMgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAorCQkgKiBvbGRlciB2ZXJzaW9ucyBvZiBiemlwMi4KKwkJICovCisJCWJzVyhzLCAxLCAwKTsKKworCQlic1cocywgMjQsIHMtPm9yaWdQdHIpOworCQlnZW5lcmF0ZU1URlZhbHVlcyhzKTsKKwkJc2VuZE1URlZhbHVlcyhzKTsKKwl9CisKKwkvKi0tIElmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2ssIGFkZCB0aGUgc3RyZWFtIHRyYWlsZXIuIC0tKi8KKwlpZiAoaXNfbGFzdF9ibG9jaykgeworCQkvKmJzUHV0VTgocywgMHgxNyk7Ki8KKwkJLypic1B1dFU4KHMsIDB4NzIpOyovCisJCS8qYnNQdXRVOChzLCAweDQ1KTsqLworCQkvKmJzUHV0VTgocywgMHgzOCk7Ki8KKwkJYnNQdXRVMzIocywgMHgxNzcyNDUzOCk7CisJCS8qYnNQdXRVOChzLCAweDUwKTsqLworCQkvKmJzUHV0VTgocywgMHg5MCk7Ki8KKwkJYnNQdXRVMTYocywgMHg1MDkwKTsKKwkJYnNQdXRVMzIocywgcy0+Y29tYmluZWRDUkMpOworCQlic0ZpbmlzaFdyaXRlKHMpOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2h1ZmZtYW4uYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovaHVmZm1hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NmIxYWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2h1ZmZtYW4uYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIGJ6aXAyIGlzIHdyaXR0ZW4gYnkgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4uCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+LgorICogU2VlIFJFQURNRSBhbmQgTElDRU5TRSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gSHVmZm1hbiBjb2RpbmcgbG93LWxldmVsIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbi5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIGJ6aXAyL2xpYmJ6aXAyLCBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yCitsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKK0NvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+CisKK1BsZWFzZSByZWFkIHRoZSBXQVJOSU5HLCBESVNDTEFJTUVSIGFuZCBQQVRFTlRTIHNlY3Rpb25zIGluIHRoZQorUkVBRE1FIGZpbGUuCisKK1RoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkCitpbiB0aGUgZmlsZSBMSUNFTlNFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICNpbmNsdWRlICJiemxpYl9wcml2YXRlLmgiICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0VJR0hUT0YoenowKSAgKCh6ejApICYgMHhmZmZmZmYwMCkKKyNkZWZpbmUgREVQVEhPRih6ejEpICAgKCh6ejEpICYgMHgwMDAwMDBmZikKKyNkZWZpbmUgTVlNQVgoenoyLHp6MykgKCh6ejIpID4gKHp6MykgPyAoenoyKSA6ICh6ejMpKQorCisjZGVmaW5lIEFERFdFSUdIVFMoencxLHp3MikgXAorCShXRUlHSFRPRih6dzEpK1dFSUdIVE9GKHp3MikpIHwgXAorCSgxICsgTVlNQVgoREVQVEhPRih6dzEpLERFUFRIT0YoencyKSkpCisKKyNkZWZpbmUgVVBIRUFQKHopIFwKK3sgXAorCWludDMyX3QgenosIHRtcDsgXAorCXp6ID0gejsgXAorCXRtcCA9IGhlYXBbenpdOyBcCisJd2hpbGUgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbenogPj4gMV1dKSB7IFwKKwkJaGVhcFt6el0gPSBoZWFwW3p6ID4+IDFdOyBcCisJCXp6ID4+PSAxOyBcCisJfSBcCisJaGVhcFt6el0gPSB0bXA7IFwKK30KKworCisvKiA5MCBieXRlcywgMC4zJSBvZiBvdmVyYWxsIGNvbXByZXNzIHNwZWVkICovCisjaWYgQ09ORklHX0JaSVAyX0ZFQVRVUkVfU1BFRUQgPj0gMQorCisvKiBtYWNybyB3b3JrcyBiZXR0ZXIgdGhhbiBpbmxpbmUgKGdjYyA0LjIuMSkgKi8KKyNkZWZpbmUgRE9XTkhFQVAxKGhlYXAsIHdlaWdodCwgSGVhcCkgXAoreyBcCisJaW50MzJfdCB6eiwgeXksIHRtcDsgXAorCXp6ID0gMTsgXAorCXRtcCA9IGhlYXBbenpdOyBcCisJd2hpbGUgKDEpIHsgXAorCQl5eSA9IHp6IDw8IDE7IFwKKwkJaWYgKHl5ID4gbkhlYXApIFwKKwkJCWJyZWFrOyBcCisJCWlmICh5eSA8IG5IZWFwIFwKKwkJICYmIHdlaWdodFtoZWFwW3l5KzFdXSA8IHdlaWdodFtoZWFwW3l5XV0pIFwKKwkJCXl5Kys7IFwKKwkJaWYgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbeXldXSkgXAorCQkJYnJlYWs7IFwKKwkJaGVhcFt6el0gPSBoZWFwW3l5XTsgXAorCQl6eiA9IHl5OyBcCisJfSBcCisJaGVhcFt6el0gPSB0bXA7IFwKK30KKworI2Vsc2UKKworc3RhdGljCit2b2lkIERPV05IRUFQMShpbnQzMl90ICpoZWFwLCBpbnQzMl90ICp3ZWlnaHQsIGludDMyX3QgbkhlYXApCit7CisJaW50MzJfdCB6eiwgeXksIHRtcDsKKwl6eiA9IDE7CisJdG1wID0gaGVhcFt6el07CisJd2hpbGUgKDEpIHsKKwkJeXkgPSB6eiA8PCAxOworCQlpZiAoeXkgPiBuSGVhcCkKKwkJCWJyZWFrOworCQlpZiAoeXkgPCBuSGVhcAorCQkgJiYgd2VpZ2h0W2hlYXBbeXkgKyAxXV0gPCB3ZWlnaHRbaGVhcFt5eV1dKQorCQkJeXkrKzsKKwkJaWYgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbeXldXSkKKwkJCWJyZWFrOworCQloZWFwW3p6XSA9IGhlYXBbeXldOworCQl6eiA9IHl5OworCX0KKwloZWFwW3p6XSA9IHRtcDsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBCWjJfaGJNYWtlQ29kZUxlbmd0aHMoRVN0YXRlICpzLAorCQl1aW50OF90ICpsZW4sCisJCWludDMyX3QgKmZyZXEsCisJCWludDMyX3QgYWxwaGFTaXplLAorCQlpbnQzMl90IG1heExlbikKK3sKKwkvKgorCSAqIE5vZGVzIGFuZCBoZWFwIGVudHJpZXMgcnVuIGZyb20gMS4gIEVudHJ5IDAKKwkgKiBmb3IgYm90aCB0aGUgaGVhcCBhbmQgbm9kZXMgaXMgYSBzZW50aW5lbC4KKwkgKi8KKwlpbnQzMl90IG5Ob2RlcywgbkhlYXAsIG4xLCBuMiwgaSwgaiwgazsKKwlCb29sICB0b29Mb25nOworCisJLyogYmJveDogbW92ZWQgdG8gRVN0YXRlIHRvIHNhdmUgc3RhY2sKKwlpbnQzMl90IGhlYXAgIFtCWl9NQVhfQUxQSEFfU0laRSArIDJdOworCWludDMyX3Qgd2VpZ2h0W0JaX01BWF9BTFBIQV9TSVpFICogMl07CisJaW50MzJfdCBwYXJlbnRbQlpfTUFYX0FMUEhBX1NJWkUgKiAyXTsKKwkqLworI2RlZmluZSBoZWFwICAgKHMtPkJaMl9oYk1ha2VDb2RlTGVuZ3Roc19faGVhcCkKKyNkZWZpbmUgd2VpZ2h0IChzLT5CWjJfaGJNYWtlQ29kZUxlbmd0aHNfX3dlaWdodCkKKyNkZWZpbmUgcGFyZW50IChzLT5CWjJfaGJNYWtlQ29kZUxlbmd0aHNfX3BhcmVudCkKKworCWZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykKKwkJd2VpZ2h0W2krMV0gPSAoZnJlcVtpXSA9PSAwID8gMSA6IGZyZXFbaV0pIDw8IDg7CisKKwl3aGlsZSAoMSkgeworCQluTm9kZXMgPSBhbHBoYVNpemU7CisJCW5IZWFwID0gMDsKKworCQloZWFwWzBdID0gMDsKKwkJd2VpZ2h0WzBdID0gMDsKKwkJcGFyZW50WzBdID0gLTI7CisKKwkJZm9yIChpID0gMTsgaSA8PSBhbHBoYVNpemU7IGkrKykgeworCQkJcGFyZW50W2ldID0gLTE7CisJCQluSGVhcCsrOworCQkJaGVhcFtuSGVhcF0gPSBpOworCQkJVVBIRUFQKG5IZWFwKTsKKwkJfQorCisJCUFzc2VydEgobkhlYXAgPCAoQlpfTUFYX0FMUEhBX1NJWkUrMiksIDIwMDEpOworCisJCXdoaWxlIChuSGVhcCA+IDEpIHsKKwkJCW4xID0gaGVhcFsxXTsgaGVhcFsxXSA9IGhlYXBbbkhlYXBdOyBuSGVhcC0tOyBET1dOSEVBUDEoaGVhcCwgd2VpZ2h0LCBuSGVhcCk7CisJCQluMiA9IGhlYXBbMV07IGhlYXBbMV0gPSBoZWFwW25IZWFwXTsgbkhlYXAtLTsgRE9XTkhFQVAxKGhlYXAsIHdlaWdodCwgbkhlYXApOworCQkJbk5vZGVzKys7CisJCQlwYXJlbnRbbjFdID0gcGFyZW50W24yXSA9IG5Ob2RlczsKKwkJCXdlaWdodFtuTm9kZXNdID0gQUREV0VJR0hUUyh3ZWlnaHRbbjFdLCB3ZWlnaHRbbjJdKTsKKwkJCXBhcmVudFtuTm9kZXNdID0gLTE7CisJCQluSGVhcCsrOworCQkJaGVhcFtuSGVhcF0gPSBuTm9kZXM7CisJCQlVUEhFQVAobkhlYXApOworCQl9CisKKwkJQXNzZXJ0SChuTm9kZXMgPCAoQlpfTUFYX0FMUEhBX1NJWkUgKiAyKSwgMjAwMik7CisKKwkJdG9vTG9uZyA9IEZhbHNlOworCQlmb3IgKGkgPSAxOyBpIDw9IGFscGhhU2l6ZTsgaSsrKSB7CisJCQlqID0gMDsKKwkJCWsgPSBpOworCQkJd2hpbGUgKHBhcmVudFtrXSA+PSAwKSB7CisJCQkJayA9IHBhcmVudFtrXTsKKwkJCQlqKys7CisJCQl9CisJCQlsZW5baS0xXSA9IGo7CisJCQlpZiAoaiA+IG1heExlbikKKwkJCQl0b29Mb25nID0gVHJ1ZTsKKwkJfQorCisJCWlmICghdG9vTG9uZykKKwkJCWJyZWFrOworCisJCS8qIDE3IE9jdCAwNDoga2VlcC1nb2luZyBjb25kaXRpb24gZm9yIHRoZSBmb2xsb3dpbmcgbG9vcCB1c2VkCisJCXRvIGJlICdpIDwgYWxwaGFTaXplJywgd2hpY2ggbWlzc2VkIHRoZSBsYXN0IGVsZW1lbnQsCisJCXRoZW9yZXRpY2FsbHkgbGVhZGluZyB0byB0aGUgcG9zc2liaWxpdHkgb2YgdGhlIGNvbXByZXNzb3IKKwkJbG9vcGluZy4gIEhvd2V2ZXIsIHRoaXMgY291bnQtc2NhbGluZyBzdGVwIGlzIG9ubHkgbmVlZGVkIGlmCisJCW9uZSBvZiB0aGUgZ2VuZXJhdGVkIEh1ZmZtYW4gY29kZSB3b3JkcyBpcyBsb25nZXIgdGhhbgorCQltYXhMZW4sIHdoaWNoIHVwIHRvIGFuZCBpbmNsdWRpbmcgdmVyc2lvbiAxLjAuMiB3YXMgMjAgYml0cywKKwkJd2hpY2ggaXMgZXh0cmVtZWx5IHVubGlrZWx5LiAgSW4gdmVyc2lvbiAxLjAuMyBtYXhMZW4gd2FzCisJCWNoYW5nZWQgdG8gMTcgYml0cywgd2hpY2ggaGFzIG1pbmltYWwgZWZmZWN0IG9uIGNvbXByZXNzaW9uCisJCXJhdGlvLCBidXQgZG9lcyBtZWFuIHRoaXMgc2NhbGluZyBzdGVwIGlzIHVzZWQgZnJvbSB0aW1lIHRvCisJCXRpbWUsIGVub3VnaCB0byB2ZXJpZnkgdGhhdCBpdCB3b3Jrcy4KKworCQlUaGlzIG1lYW5zIHRoYXQgYnppcDItMS4wLjMgYW5kIGxhdGVyIHdpbGwgb25seSBwcm9kdWNlCisJCUh1ZmZtYW4gY29kZXMgd2l0aCBhIG1heGltdW0gbGVuZ3RoIG9mIDE3IGJpdHMuICBIb3dldmVyLCBpbgorCQlvcmRlciB0byBwcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGJpdHN0cmVhbXMKKwkJcHJvZHVjZWQgYnkgdmVyc2lvbnMgcHJlLTEuMC4zLCB0aGUgZGVjb21wcmVzc29yIG11c3Qgc3RpbGwKKwkJaGFuZGxlIGxlbmd0aHMgb2YgdXAgdG8gMjAuICovCisKKwkJZm9yIChpID0gMTsgaSA8PSBhbHBoYVNpemU7IGkrKykgeworCQkJaiA9IHdlaWdodFtpXSA+PiA4OworCQkJLyogYmJveDogeWVzLCBpdCBpcyBhIHNpZ25lZCBkaXZpc2lvbi4KKwkJCSAqIGRvbid0IHJlcGxhY2Ugd2l0aCBzaGlmdCEgKi8KKwkJCWogPSAxICsgKGogLyAyKTsKKwkJCXdlaWdodFtpXSA9IGogPDwgODsKKwkJfQorCX0KKyN1bmRlZiBoZWFwCisjdW5kZWYgd2VpZ2h0CisjdW5kZWYgcGFyZW50Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIEJaMl9oYkFzc2lnbkNvZGVzKGludDMyX3QgKmNvZGUsCisJCXVpbnQ4X3QgKmxlbmd0aCwKKwkJaW50MzJfdCBtaW5MZW4sCisJCWludDMyX3QgbWF4TGVuLAorCQlpbnQzMl90IGFscGhhU2l6ZSkKK3sKKwlpbnQzMl90IG4sIHZlYywgaTsKKworCXZlYyA9IDA7CisJZm9yIChuID0gbWluTGVuOyBuIDw9IG1heExlbjsgbisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgeworCQkJaWYgKGxlbmd0aFtpXSA9PSBuKSB7CisJCQkJY29kZVtpXSA9IHZlYzsKKwkJCQl2ZWMrKzsKKwkJCX07CisJCX0KKwkJdmVjIDw8PSAxOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfYWxpZ24uYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9hbGlnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTZmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfYWxpZ24uYwpAQCAtMCwwICsxLDE1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKwordm9pZCBGQVNUX0ZVTkMgZGF0YV9hbGlnbihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSwgdW5zaWduZWQgYm91bmRhcnkpCit7CisJdW5zaWduZWQgc2tpcF9hbW91bnQgPSAoYm91bmRhcnkgLSAoYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCAlIGJvdW5kYXJ5KSkgJSBib3VuZGFyeTsKKworCWFyY2hpdmVfaGFuZGxlLT5zZWVrKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIHNraXBfYW1vdW50KTsKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IHNraXBfYW1vdW50OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfYWxsLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF9hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjI1YzhiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfYWxsLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCit2b2lkIEZBU1RfRlVOQyBkYXRhX2V4dHJhY3RfYWxsKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyID0gYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyOworCWludCBkc3RfZmQ7CisJaW50IHJlczsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYCisJY2hhciAqc2N0eCA9IGFyY2hpdmVfaGFuZGxlLT50YXJfX25leHRfZmlsZV9zY3R4OworCWlmICghc2N0eCkKKwkJc2N0eCA9IGFyY2hpdmVfaGFuZGxlLT50YXJfX2dsb2JhbF9zY3R4OworCWlmIChzY3R4KSB7IC8qIHNldGZzY3JlYXRlY29uIGlzIDQgc3lzY2FsbHMsIGF2b2lkIGlmIHBvc3NpYmxlICovCisJCXNldGZzY3JlYXRlY29uKHNjdHgpOworCQlmcmVlKGFyY2hpdmVfaGFuZGxlLT50YXJfX25leHRfZmlsZV9zY3R4KTsKKwkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fbmV4dF9maWxlX3NjdHggPSBOVUxMOworCX0KKyNlbmRpZgorCisJaWYgKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfQ1JFQVRFX0xFQURJTkdfRElSUykgeworCQljaGFyICpzbGFzaCA9IHN0cnJjaHIoZmlsZV9oZWFkZXItPm5hbWUsICcvJyk7CisJCWlmIChzbGFzaCkgeworCQkJKnNsYXNoID0gJ1wwJzsKKwkJCWJiX21ha2VfZGlyZWN0b3J5KGZpbGVfaGVhZGVyLT5uYW1lLCAtMSwgRklMRVVUSUxTX1JFQ1VSKTsKKwkJCSpzbGFzaCA9ICcvJzsKKwkJfQorCX0KKworCWlmIChhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX1VOTElOS19PTEQpIHsKKwkJLyogUmVtb3ZlIHRoZSBlbnRyeSBpZiBpdCBleGlzdHMgKi8KKwkJaWYgKCFTX0lTRElSKGZpbGVfaGVhZGVyLT5tb2RlKSkgeworCQkJLyogSXMgaXQgaGFyZGxpbms/CisJCQkgKiBXZSBlbmNvZGUgaGFyZCBsaW5rcyBhcyByZWd1bGFyIGZpbGVzIG9mIHNpemUgMCB3aXRoIGEgc3ltbGluayAqLworCQkJaWYgKFNfSVNSRUcoZmlsZV9oZWFkZXItPm1vZGUpCisJCQkgJiYgZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0CisJCQkgJiYgZmlsZV9oZWFkZXItPnNpemUgPT0gMAorCQkJKSB7CisJCQkJLyogVWdseSBzcGVjaWFsIGNhc2U6CisJCQkJICogdGFyIGNmIHQudGFyIGhhcmRsaW5rMSBoYXJkbGluazIgaGFyZGxpbmsxCisJCQkJICogcmVzdWx0cyBpbiB0aGlzIHRhcmJhbGwgc3RydWN0dXJlOgorCQkJCSAqIGhhcmRsaW5rMQorCQkJCSAqIGhhcmRsaW5rMiAtPiBoYXJkbGluazEKKwkJCQkgKiBoYXJkbGluazEgLT4gaGFyZGxpbmsxIDw9PSAhISEKKwkJCQkgKi8KKwkJCQlpZiAoc3RyY21wKGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCwgZmlsZV9oZWFkZXItPm5hbWUpID09IDApCisJCQkJCWdvdG8gcmV0OworCQkJfQorCQkJLyogUHJvY2VlZCB3aXRoIGRlbGV0aW5nICovCisJCQlpZiAodW5saW5rKGZpbGVfaGVhZGVyLT5uYW1lKSA9PSAtMQorCQkJICYmIGVycm5vICE9IEVOT0VOVAorCQkJKSB7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZW1vdmUgb2xkIGZpbGUgJXMiLAorCQkJCQkJZmlsZV9oZWFkZXItPm5hbWUpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfRVhUUkFDVF9ORVdFUikgeworCQkvKiBSZW1vdmUgdGhlIGV4aXN0aW5nIGVudHJ5IGlmIGl0cyBvbGRlciB0aGFuIHRoZSBleHRyYWN0ZWQgZW50cnkgKi8KKwkJc3RydWN0IHN0YXQgZXhpc3Rpbmdfc2I7CisJCWlmIChsc3RhdChmaWxlX2hlYWRlci0+bmFtZSwgJmV4aXN0aW5nX3NiKSA9PSAtMSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc3RhdCBvbGQgZmlsZSIpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGV4aXN0aW5nX3NiLnN0X210aW1lID49IGZpbGVfaGVhZGVyLT5tdGltZSkgeworCQkJaWYgKCEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX1FVSUVUKQorCQkJICYmICFTX0lTRElSKGZpbGVfaGVhZGVyLT5tb2RlKQorCQkJKSB7CisJCQkJYmJfZXJyb3JfbXNnKCIlcyBub3QgY3JlYXRlZDogbmV3ZXIgb3IgIgorCQkJCQkic2FtZSBhZ2UgZmlsZSBleGlzdHMiLCBmaWxlX2hlYWRlci0+bmFtZSk7CisJCQl9CisJCQlkYXRhX3NraXAoYXJjaGl2ZV9oYW5kbGUpOworCQkJZ290byByZXQ7CisJCX0KKwkJZWxzZSBpZiAoKHVubGluayhmaWxlX2hlYWRlci0+bmFtZSkgPT0gLTEpICYmIChlcnJubyAhPSBFSVNESVIpKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlbW92ZSBvbGQgZmlsZSAlcyIsCisJCQkJCWZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJfQorCX0KKworCS8qIEhhbmRsZSBoYXJkIGxpbmtzIHNlcGFyYXRlbHkKKwkgKiBXZSBlbmNvZGUgaGFyZCBsaW5rcyBhcyByZWd1bGFyIGZpbGVzIG9mIHNpemUgMCB3aXRoIGEgc3ltbGluayAqLworCWlmIChTX0lTUkVHKGZpbGVfaGVhZGVyLT5tb2RlKQorCSAmJiBmaWxlX2hlYWRlci0+bGlua190YXJnZXQKKwkgJiYgZmlsZV9oZWFkZXItPnNpemUgPT0gMAorCSkgeworCQkvKiBoYXJkIGxpbmsgKi8KKwkJcmVzID0gbGluayhmaWxlX2hlYWRlci0+bGlua190YXJnZXQsIGZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJaWYgKChyZXMgPT0gLTEpICYmICEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX1FVSUVUKSkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICVzbGluayAiCisJCQkJCSJmcm9tICVzIHRvICVzIiwgImhhcmQiLAorCQkJCQlmaWxlX2hlYWRlci0+bmFtZSwKKwkJCQkJZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0KTsKKwkJfQorCQkvKiBIYXJkbGlua3MgaGF2ZSBubyBzZXBhcmF0ZSBtb2RlL293bmVyc2hpcCwgc2tpcCBjaG93bi9jaG1vZCAqLworCQlnb3RvIHJldDsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIGZpbGVzeXN0ZW0gZW50cnkgKi8KKwlzd2l0Y2ggKGZpbGVfaGVhZGVyLT5tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOiB7CisJCS8qIFJlZ3VsYXIgZmlsZSAqLworCQlpbnQgZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0w7CisJCWlmIChhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX09fVFJVTkMpCisJCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7CisJCWRzdF9mZCA9IHhvcGVuMyhmaWxlX2hlYWRlci0+bmFtZSwKKwkJCWZsYWdzLAorCQkJZmlsZV9oZWFkZXItPm1vZGUKKwkJCSk7CisJCWJiX2NvcHlmZF9leGFjdF9zaXplKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGRzdF9mZCwgZmlsZV9oZWFkZXItPnNpemUpOworCQljbG9zZShkc3RfZmQpOworCQlicmVhazsKKwl9CisJY2FzZSBTX0lGRElSOgorCQlyZXMgPSBta2RpcihmaWxlX2hlYWRlci0+bmFtZSwgZmlsZV9oZWFkZXItPm1vZGUpOworCQlpZiAoKHJlcyA9PSAtMSkKKwkJICYmIChlcnJubyAhPSBFSVNESVIpIC8qIGJ0dywgTGludXggZG9lc24ndCByZXR1cm4gdGhpcyAqLworCQkgJiYgKGVycm5vICE9IEVFWElTVCkKKwkJICYmICEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX1FVSUVUKQorCQkpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IG1ha2UgZGlyICVzIiwgZmlsZV9oZWFkZXItPm5hbWUpOworCQl9CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKKwkJLyogU3ltbGluayAqLworLy9UT0RPOiB3aGF0IGlmIGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCA9PSBOVUxMIChzYXksIGNvcnJ1cHRlZCB0YXJiYWxsPykKKwkJcmVzID0gc3ltbGluayhmaWxlX2hlYWRlci0+bGlua190YXJnZXQsIGZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJaWYgKChyZXMgPT0gLTEpCisJCSAmJiAhKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfRVhUUkFDVF9RVUlFVCkKKwkJKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJXNsaW5rICIKKwkJCQkiZnJvbSAlcyB0byAlcyIsICJzeW0iLAorCQkJCWZpbGVfaGVhZGVyLT5uYW1lLAorCQkJCWZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTX0lGU09DSzoKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGQ0hSOgorCWNhc2UgU19JRklGTzoKKwkJcmVzID0gbWtub2QoZmlsZV9oZWFkZXItPm5hbWUsIGZpbGVfaGVhZGVyLT5tb2RlLCBmaWxlX2hlYWRlci0+ZGV2aWNlKTsKKwkJaWYgKChyZXMgPT0gLTEpCisJCSAmJiAhKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfRVhUUkFDVF9RVUlFVCkKKwkJKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgbm9kZSAlcyIsIGZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5yZWNvZ25pemVkIGZpbGUgdHlwZSIpOworCX0KKworCWlmICghU19JU0xOSyhmaWxlX2hlYWRlci0+bW9kZSkpIHsKKwkJaWYgKCEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9ET05UX1JFU1RPUkVfT1dORVIpKSB7CisJCQl1aWRfdCB1aWQgPSBmaWxlX2hlYWRlci0+dWlkOworCQkJZ2lkX3QgZ2lkID0gZmlsZV9oZWFkZXItPmdpZDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwkJCWlmICghKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfTlVNRVJJQ19PV05FUikpIHsKKwkJCQlpZiAoZmlsZV9oZWFkZXItPnRhcl9fdW5hbWUpIHsKKy8vVE9ETzogY2FjaGUgbGFzdCBuYW1lL2lkIHBhaXI/CisJCQkJCXN0cnVjdCBwYXNzd2QgKnB3ZCA9IGdldHB3bmFtKGZpbGVfaGVhZGVyLT50YXJfX3VuYW1lKTsKKwkJCQkJaWYgKHB3ZCkgdWlkID0gcHdkLT5wd191aWQ7CisJCQkJfQorCQkJCWlmIChmaWxlX2hlYWRlci0+dGFyX19nbmFtZSkgeworCQkJCQlzdHJ1Y3QgZ3JvdXAgKmdycCA9IGdldGdybmFtKGZpbGVfaGVhZGVyLT50YXJfX2duYW1lKTsKKwkJCQkJaWYgKGdycCkgZ2lkID0gZ3JwLT5ncl9naWQ7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQkvKiBHTlUgdGFyIDEuMTUuMSB1c2VzIGNob3duLCBub3QgbGNob3duICovCisJCQljaG93bihmaWxlX2hlYWRlci0+bmFtZSwgdWlkLCBnaWQpOworCQl9CisJCS8qIHVjbGliYyBoYXMgbm8gbGNobW9kLCBnbGliYyBpcyBldmVuIHN0cmFuZ2VyIC0KKwkJICogaXQgaGFzIGxjaG1vZCB3aGljaCBzZWVtcyB0byBkbyBub3RoaW5nIQorCQkgKiBzbyB3ZSB1c2UgY2htb2QuLi4gKi8KKwkJaWYgKCEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9ET05UX1JFU1RPUkVfUEVSTSkpIHsKKwkJCWNobW9kKGZpbGVfaGVhZGVyLT5uYW1lLCBmaWxlX2hlYWRlci0+bW9kZSk7CisJCX0KKwkJaWYgKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfUkVTVE9SRV9EQVRFKSB7CisJCQlzdHJ1Y3QgdGltZXZhbCB0WzJdOworCisJCQl0WzFdLnR2X3NlYyA9IHRbMF0udHZfc2VjID0gZmlsZV9oZWFkZXItPm10aW1lOworCQkJdFsxXS50dl91c2VjID0gdFswXS50dl91c2VjID0gMDsKKwkJCXV0aW1lcyhmaWxlX2hlYWRlci0+bmFtZSwgdCk7CisJCX0KKwl9CisKKyByZXQ6IDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWAorCWlmIChzY3R4KSB7CisJCS8qIHJlc2V0IHRoZSBjb250ZXh0IGFmdGVyIGNyZWF0aW5nIGFuIGVudHJ5ICovCisJCXNldGZzY3JlYXRlY29uKE5VTEwpOworCX0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfdG9fY29tbWFuZC5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfdG9fY29tbWFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTc3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19jb21tYW5kLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCitlbnVtIHsKKwkvL1RBUl9GSUxFVFlQRSwKKwlUQVJfTU9ERSwKKwlUQVJfRklMRU5BTUUsCisJVEFSX1JFQUxOQU1FLAorI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCVRBUl9VTkFNRSwKKwlUQVJfR05BTUUsCisjZW5kaWYKKwlUQVJfU0laRSwKKwlUQVJfVUlELAorCVRBUl9HSUQsCisJVEFSX01BWCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YXJfdmFyW10gPSB7CisJLy8gIkZJTEVUWVBFIiwKKwkiTU9ERSIsCisJIkZJTEVOQU1FIiwKKwkiUkVBTE5BTUUiLAorI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCSJVTkFNRSIsCisJIkdOQU1FIiwKKyNlbmRpZgorCSJTSVpFIiwKKwkiVUlEIiwKKwkiR0lEIiwKK307CisKK3N0YXRpYyB2b2lkIHhwdXRlbnYoY2hhciAqc3RyKQoreworCWlmIChwdXRlbnYoc3RyKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworfQorCitzdGF0aWMgdm9pZCBzdHIyZW52KGNoYXIgKmVudltdLCBpbnQgaWR4LCBjb25zdCBjaGFyICpzdHIpCit7CisJZW52W2lkeF0gPSB4YXNwcmludGYoIlRBUl8lcz0lcyIsIHRhcl92YXJbaWR4XSwgc3RyKTsKKwl4cHV0ZW52KGVudltpZHhdKTsKK30KKworc3RhdGljIHZvaWQgZGVjMmVudihjaGFyICplbnZbXSwgaW50IGlkeCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKK3sKKwllbnZbaWR4XSA9IHhhc3ByaW50ZigiVEFSXyVzPSVsbHUiLCB0YXJfdmFyW2lkeF0sIHZhbCk7CisJeHB1dGVudihlbnZbaWR4XSk7Cit9CisKK3N0YXRpYyB2b2lkIG9jdDJlbnYoY2hhciAqZW52W10sIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWVudltpZHhdID0geGFzcHJpbnRmKCJUQVJfJXM9JWxvIiwgdGFyX3ZhcltpZHhdLCB2YWwpOworCXhwdXRlbnYoZW52W2lkeF0pOworfQorCit2b2lkIEZBU1RfRlVOQyBkYXRhX2V4dHJhY3RfdG9fY29tbWFuZChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlciA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlcjsKKworI2lmIDAgLyogZG8gd2UgbmVlZCB0aGlzPyBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWCAqLworCWNoYXIgKnNjdHggPSBhcmNoaXZlX2hhbmRsZS0+dGFyX19uZXh0X2ZpbGVfc2N0eDsKKwlpZiAoIXNjdHgpCisJCXNjdHggPSBhcmNoaXZlX2hhbmRsZS0+dGFyX19nbG9iYWxfc2N0eDsKKwlpZiAoc2N0eCkgeyAvKiBzZXRmc2NyZWF0ZWNvbiBpcyA0IHN5c2NhbGxzLCBhdm9pZCBpZiBwb3NzaWJsZSAqLworCQlzZXRmc2NyZWF0ZWNvbihzY3R4KTsKKwkJZnJlZShhcmNoaXZlX2hhbmRsZS0+dGFyX19uZXh0X2ZpbGVfc2N0eCk7CisJCWFyY2hpdmVfaGFuZGxlLT50YXJfX25leHRfZmlsZV9zY3R4ID0gTlVMTDsKKwl9CisjZW5kaWYKKworCWlmICgoZmlsZV9oZWFkZXItPm1vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKKwkJcGlkX3QgcGlkOworCQlpbnQgcFsyXSwgc3RhdHVzOworCQljaGFyICp0YXJfZW52W1RBUl9NQVhdOworCisJCW1lbXNldCh0YXJfZW52LCAwLCBzaXplb2YodGFyX2VudikpOworCisJCXhwaXBlKHApOworCQlwaWQgPSBCQl9NTVUgPyB4Zm9yaygpIDogeHZmb3JrKCk7CisJCWlmIChwaWQgPT0gMCkgeworCQkJLyogQ2hpbGQgKi8KKwkJCS8qIHN0cjJlbnYodGFyX2VudiwgVEFSX0ZJTEVUWVBFLCAiZiIpOyAtIHBhcmVudCBzaG91bGQgZG8gaXQgb25jZSAqLworCQkJb2N0MmVudih0YXJfZW52LCBUQVJfTU9ERSwgZmlsZV9oZWFkZXItPm1vZGUpOworCQkJc3RyMmVudih0YXJfZW52LCBUQVJfRklMRU5BTUUsIGZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJCXN0cjJlbnYodGFyX2VudiwgVEFSX1JFQUxOQU1FLCBmaWxlX2hlYWRlci0+bmFtZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisJCQlzdHIyZW52KHRhcl9lbnYsIFRBUl9VTkFNRSwgZmlsZV9oZWFkZXItPnRhcl9fdW5hbWUpOworCQkJc3RyMmVudih0YXJfZW52LCBUQVJfR05BTUUsIGZpbGVfaGVhZGVyLT50YXJfX2duYW1lKTsKKyNlbmRpZgorCQkJZGVjMmVudih0YXJfZW52LCBUQVJfU0laRSwgZmlsZV9oZWFkZXItPnNpemUpOworCQkJZGVjMmVudih0YXJfZW52LCBUQVJfVUlELCBmaWxlX2hlYWRlci0+dWlkKTsKKwkJCWRlYzJlbnYodGFyX2VudiwgVEFSX0dJRCwgZmlsZV9oZWFkZXItPmdpZCk7CisJCQljbG9zZShwWzFdKTsKKwkJCXhkdXAyKHBbMF0sIFNURElOX0ZJTEVOTyk7CisJCQlzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisJCQlleGVjbChhcmNoaXZlX2hhbmRsZS0+dGFyX190b19jb21tYW5kX3NoZWxsLAorCQkJCWFyY2hpdmVfaGFuZGxlLT50YXJfX3RvX2NvbW1hbmRfc2hlbGwsCisJCQkJIi1jIiwKKwkJCQlhcmNoaXZlX2hhbmRsZS0+dGFyX190b19jb21tYW5kLAorCQkJCU5VTEwpOworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmNoaXZlX2hhbmRsZS0+dGFyX190b19jb21tYW5kX3NoZWxsKTsKKwkJfQorCQljbG9zZShwWzBdKTsKKwkJLyogT3VyIGNhbGxlciBpcyBleHBlY3RlZCB0byBkbyBzaWduYWwoU0lHUElQRSwgU0lHX0lHTikKKwkJICogc28gdGhhdCB3ZSBkb24ndCBkaWUgaWYgY2hpbGQgZG9uJ3QgcmVhZCBhbGwgdGhlIGlucHV0OiAqLworCQliYl9jb3B5ZmRfZXhhY3Rfc2l6ZShhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBwWzFdLCAtZmlsZV9oZWFkZXItPnNpemUpOworCQljbG9zZShwWzFdKTsKKworCQlpZiAoc2FmZV93YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPT0gLTEpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIndhaXRwaWQiKTsKKwkJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyByZXR1cm5lZCBzdGF0dXMgJWQiLAorCQkJCWFyY2hpdmVfaGFuZGxlLT50YXJfX3RvX2NvbW1hbmQsIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCInJXMnIHRlcm1pbmF0ZWQgb24gc2lnbmFsICVkIiwKKwkJCQlhcmNoaXZlX2hhbmRsZS0+dGFyX190b19jb21tYW5kLCBXVEVSTVNJRyhzdGF0dXMpKTsKKworCQlpZiAoIUJCX01NVSkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgVEFSX01BWDsgaSsrKSB7CisJCQkJaWYgKHRhcl9lbnZbaV0pCisJCQkJCWJiX3Vuc2V0ZW52X2FuZF9mcmVlKHRhcl9lbnZbaV0pOworCQkJfQorCQl9CisJfQorCisjaWYgMCAvKiBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWCAqLworCWlmIChzY3R4KQorCQkvKiByZXNldCB0aGUgY29udGV4dCBhZnRlciBjcmVhdGluZyBhbiBlbnRyeSAqLworCQlzZXRmc2NyZWF0ZWNvbihOVUxMKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfdG9fc3Rkb3V0LmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19zdGRvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWYzZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfdG9fc3Rkb3V0LmMKQEAgLTAsMCArMSwxNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGRhdGFfZXh0cmFjdF90b19zdGRvdXQoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJYmJfY29weWZkX2V4YWN0X3NpemUoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwKKwkJCVNURE9VVF9GSUxFTk8sCisJCQlhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPnNpemUpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX3NraXAuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9za2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1NTQyNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9za2lwLmMKQEAgLTAsMCArMSwxMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGRhdGFfc2tpcChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlhcmNoaXZlX2hhbmRsZS0+c2VlayhhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPnNpemUpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX2J1bnppcDIuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc19idW56aXAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0NmU2OAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc19idW56aXAyLmMKQEAgLTAsMCArMSw4MjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogU21hbGwgYnppcDIgZGVmbGF0ZSBpbXBsZW1lbnRhdGlvbiwgYnkgUm9iIExhbmRsZXkgKHJvYkBsYW5kbGV5Lm5ldCkuCisKKyAgIEJhc2VkIG9uIGJ6aXAyIGRlY29tcHJlc3Npb24gY29kZSBieSBKdWxpYW4gUiBTZXdhcmQgKGpzZXdhcmRAYWNtLm9yZyksCisgICB3aGljaCBhbHNvIGFja25vd2xlZGdlcyBjb250cmlidXRpb25zIGJ5IE1pa2UgQnVycm93cywgRGF2aWQgV2hlZWxlciwKKyAgIFBldGVyIEZlbndpY2ssIEFsaXN0YWlyIE1vZmZhdCwgUmFkZm9yZCBOZWFsLCBJYW4gSC4gV2l0dGVuLAorICAgUm9iZXJ0IFNlZGdld2ljaywgYW5kIEpvbiBMLiBCZW50bGV5LgorCisgICBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorKi8KKworLyoKKwlTaXplIGFuZCBzcGVlZCBvcHRpbWl6YXRpb25zIGJ5IE1hbnVlbCBOb3ZvYSBJSUkgIChtam4zQGNvZGVwb2V0Lm9yZykuCisKKwlNb3JlIGVmZmljaWVudCByZWFkaW5nIG9mIEh1ZmZtYW4gY29kZXMsIGEgc3RyZWFtbGluZWQgcmVhZF9idW56aXAoKQorCWZ1bmN0aW9uLCBhbmQgdmFyaW91cyBvdGhlciB0d2Vha3MuICBJbiAobGltaXRlZCkgdGVzdHMsIGFwcHJveGltYXRlbHkKKwkyMCUgZmFzdGVyIHRoYW4gYnpjYXQgb24geDg2IGFuZCBhYm91dCAxMCUgZmFzdGVyIG9uIGFybS4KKworCU5vdGUgdGhhdCBhYm91dCAyLzMgb2YgdGhlIHRpbWUgaXMgc3BlbnQgaW4gcmVhZF9idW56aXAoKSByZXZlcnNpbmcKKwl0aGUgQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybWF0aW9uLiAgTXVjaCBvZiB0aGF0IHRpbWUgaXMgZGVsYXkKKwlyZXN1bHRpbmcgZnJvbSBjYWNoZSBtaXNzZXMuCisKKwkoMjAxMCB1cGRhdGUgYnkgdmRhOiBwcm9maWxlZCAiYnpjYXQgPDg0bWJ5dGUuYnoyID4vZGV2L251bGwiCisJb24geDg2LTY0IENQVSB3aXRoIEwyID4gMU06IGdldF9uZXh0X2Jsb2NrIGlzIGhvdHRlciB0aGFuIHJlYWRfYnVuemlwOgorCSV0aW1lIHNlY29uZHMgICBjYWxscyBmdW5jdGlvbgorCTcxLjAxICAgMTIuNjkgICAgIDQ0NCBnZXRfbmV4dF9ibG9jaworCTI4LjY1ICAgIDUuMTIgICA5MzA2NSByZWFkX2J1bnppcAorCTAwLjIyICAgIDAuMDQgNzczNjQ5MCBnZXRfYml0cworCTAwLjExICAgIDAuMDIgICAgICA0NyBkZWFsbG9jX2J1bnppcAorCTAwLjAwICAgIDAuMDAgICA5MzAxOCBmdWxsX3dyaXRlCisJLi4uKQorCisKKwlJIHdvdWxkIGFzayB0aGF0IGFueW9uZSBiZW5lZml0aW5nIGZyb20gdGhpcyB3b3JrLCBlc3BlY2lhbGx5IHRob3NlCisJdXNpbmcgaXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cywgY29uc2lkZXIgbWFraW5nIGEgZG9uYXRpb24gdG8gbXkgbG9jYWwKKwlub24tcHJvZml0IGhvc3BpY2Ugb3JnYW5pemF0aW9uICh3d3cuaG9zcGljZWFjYWRpYW5hLmNvbSkgaW4gdGhlIG5hbWUgb2YKKwl0aGUgd29tYW4gSSBsb3ZlZCwgVG9uaSBXLiBIYWdhbiwgd2hvIHBhc3NlZCBhd2F5IEZlYi4gMTIsIDIwMDMuCisKKwlNYW51ZWwKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKy8qIENvbnN0YW50cyBmb3IgSHVmZm1hbiBjb2RpbmcgKi8KKyNkZWZpbmUgTUFYX0dST1VQUyAgICAgICAgICA2CisjZGVmaW5lIEdST1VQX1NJWkUgICAgICAgICAgNTAgICAgICAvKiA2NCB3b3VsZCBoYXZlIGJlZW4gbW9yZSBlZmZpY2llbnQgKi8KKyNkZWZpbmUgTUFYX0hVRkNPREVfQklUUyAgICAyMCAgICAgIC8qIExvbmdlc3QgSHVmZm1hbiBjb2RlIGFsbG93ZWQgKi8KKyNkZWZpbmUgTUFYX1NZTUJPTFMgICAgICAgICAyNTggICAgIC8qIDI1NiBsaXRlcmFscyArIFJVTkEgKyBSVU5CICovCisjZGVmaW5lIFNZTUJPTF9SVU5BICAgICAgICAgMAorI2RlZmluZSBTWU1CT0xfUlVOQiAgICAgICAgIDEKKworLyogU3RhdHVzIHJldHVybiB2YWx1ZXMgKi8KKyNkZWZpbmUgUkVUVkFMX09LICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJFVFZBTF9MQVNUX0JMT0NLICAgICAgICAgICAgICAgKC0xKQorI2RlZmluZSBSRVRWQUxfTk9UX0JaSVBfREFUQSAgICAgICAgICAgICgtMikKKyNkZWZpbmUgUkVUVkFMX1VORVhQRUNURURfSU5QVVRfRU9GICAgICAoLTMpCisjZGVmaW5lIFJFVFZBTF9TSE9SVF9XUklURSAgICAgICAgICAgICAgKC00KQorI2RlZmluZSBSRVRWQUxfREFUQV9FUlJPUiAgICAgICAgICAgICAgICgtNSkKKyNkZWZpbmUgUkVUVkFMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAoLTYpCisjZGVmaW5lIFJFVFZBTF9PQlNPTEVURV9JTlBVVCAgICAgICAgICAgKC03KQorCisvKiBPdGhlciBob3VzZWtlZXBpbmcgY29uc3RhbnRzICovCisjZGVmaW5lIElPQlVGX1NJWkUgICAgICAgICAgNDA5NgorCisvKiBUaGlzIGlzIHdoYXQgd2Uga25vdyBhYm91dCBlYWNoIEh1ZmZtYW4gY29kaW5nIGdyb3VwICovCitzdHJ1Y3QgZ3JvdXBfZGF0YSB7CisJLyogV2UgaGF2ZSBhbiBleHRyYSBzbG90IGF0IHRoZSBlbmQgb2YgbGltaXRbXSBmb3IgYSBzZW50aW5lbCB2YWx1ZS4gKi8KKwlpbnQgbGltaXRbTUFYX0hVRkNPREVfQklUUysxXSwgYmFzZVtNQVhfSFVGQ09ERV9CSVRTXSwgcGVybXV0ZVtNQVhfU1lNQk9MU107CisJaW50IG1pbkxlbiwgbWF4TGVuOworfTsKKworLyogU3RydWN0dXJlIGhvbGRpbmcgYWxsIHRoZSBob3VzZWtlZXBpbmcgZGF0YSwgaW5jbHVkaW5nIElPIGJ1ZmZlcnMgYW5kCisgKiBtZW1vcnkgdGhhdCBwZXJzaXN0cyBiZXR3ZWVuIGNhbGxzIHRvIGJ1bnppcAorICogRm91bmQgdGhlIG1vc3QgdXNlZCBtZW1iZXI6CisgKiAgY2F0IHRoaXNfZmlsZS5jIHwgc2VkIC1lICdzLyIvIC9nJyAtZSAicy8nLyAvZyIgfCB4YXJncyAtbjEgXAorICogIHwgZ3JlcCAnYmQtPicgfCBzZWQgJ3MvXi4qYmQtPi9iZC0+LycgfCBzb3J0IHwgJFBBR0VSCisgKiBhbmQgbW92ZWQgaXQgKGluYnVmQml0Q291bnQpIHRvIG9mZnNldCAwLgorICovCitzdHJ1Y3QgYnVuemlwX2RhdGEgeworCS8qIEkvTyB0cmFja2luZyBkYXRhIChmaWxlIGhhbmRsZXMsIGJ1ZmZlcnMsIHBvc2l0aW9ucywgZXRjLikgKi8KKwl1bnNpZ25lZCBpbmJ1ZkJpdENvdW50LCBpbmJ1ZkJpdHM7CisJaW50IGluX2ZkLCBvdXRfZmQsIGluYnVmQ291bnQsIGluYnVmUG9zIC8qLCBvdXRidWZQb3MqLzsKKwl1aW50OF90ICppbmJ1ZiAvKiwqb3V0YnVmKi87CisKKwkvKiBTdGF0ZSBmb3IgaW50ZXJydXB0aW5nIG91dHB1dCBsb29wICovCisJaW50IHdyaXRlQ29waWVzLCB3cml0ZVBvcywgd3JpdGVSdW5Db3VudGRvd24sIHdyaXRlQ291bnQ7CisJaW50IHdyaXRlQ3VycmVudDsgLyogYWN0dWFsbHkgYSB1aW50OF90ICovCisKKwkvKiBUaGUgQ1JDIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGJsb2NrIGhlYWRlciBhbmQgY2FsY3VsYXRlZCBmcm9tIHRoZSBkYXRhICovCisJdWludDMyX3QgaGVhZGVyQ1JDLCB0b3RhbENSQywgd3JpdGVDUkM7CisKKwkvKiBJbnRlcm1lZGlhdGUgYnVmZmVyIGFuZCBpdHMgc2l6ZSAoaW4gYnl0ZXMpICovCisJdWludDMyX3QgKmRidWY7CisJdW5zaWduZWQgZGJ1ZlNpemU7CisKKwkvKiBGb3IgSS9PIGVycm9yIGhhbmRsaW5nICovCisJam1wX2J1ZiBqbXBidWY7CisKKwkvKiBCaWcgdGhpbmdzIGdvIGxhc3QgKHJlZ2lzdGVyLXJlbGF0aXZlIGFkZHJlc3NpbmcgY2FuIGJlIGxhcmdlciBmb3IgYmlnIG9mZnNldHMpICovCisJdWludDMyX3QgY3JjMzJUYWJsZVsyNTZdOworCXVpbnQ4X3Qgc2VsZWN0b3JzWzMyNzY4XTsgIC8qIG5TZWxlY3RvcnM9MTUgYml0cyAqLworCXN0cnVjdCBncm91cF9kYXRhIGdyb3Vwc1tNQVhfR1JPVVBTXTsgIC8qIEh1ZmZtYW4gY29kaW5nIHRhYmxlcyAqLworfTsKKy8qIHR5cGVkZWYgc3RydWN0IGJ1bnppcF9kYXRhIGJ1bnppcF9kYXRhOyAtLSBkb25lIGluIC5oIGZpbGUgKi8KKworCisvKiBSZXR1cm4gdGhlIG5leHQgbm5uIGJpdHMgb2YgaW5wdXQuICBBbGwgcmVhZHMgZnJvbSB0aGUgY29tcHJlc3NlZCBpbnB1dAorICAgYXJlIGRvbmUgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLiAgQWxsIHJlYWRzIGFyZSBiaWcgZW5kaWFuICovCitzdGF0aWMgdW5zaWduZWQgZ2V0X2JpdHMoYnVuemlwX2RhdGEgKmJkLCBpbnQgYml0c193YW50ZWQpCit7CisJdW5zaWduZWQgYml0cyA9IDA7CisJLyogQ2FjaGUgYmQtPmluYnVmQml0Q291bnQgaW4gYSBDUFUgcmVnaXN0ZXIgKGhvcGVmdWxseSk6ICovCisJaW50IGJpdF9jb3VudCA9IGJkLT5pbmJ1ZkJpdENvdW50OworCisJLyogSWYgd2UgbmVlZCB0byBnZXQgbW9yZSBkYXRhIGZyb20gdGhlIGJ5dGUgYnVmZmVyLCBkbyBzby4gIChMb29wIGdldHRpbmcKKwkgICBvbmUgYnl0ZSBhdCBhIHRpbWUgdG8gZW5mb3JjZSBlbmRpYW5uZXNzIGFuZCBhdm9pZCB1bmFsaWduZWQgYWNjZXNzLikgKi8KKwl3aGlsZSAoYml0X2NvdW50IDwgYml0c193YW50ZWQpIHsKKworCQkvKiBJZiB3ZSBuZWVkIHRvIHJlYWQgbW9yZSBkYXRhIGZyb20gZmlsZSBpbnRvIGJ5dGUgYnVmZmVyLCBkbyBzbyAqLworCQlpZiAoYmQtPmluYnVmUG9zID09IGJkLT5pbmJ1ZkNvdW50KSB7CisJCQkvKiBpZiAibm8gaW5wdXQgZmQiIGNhc2U6IGluX2ZkID09IC0xLCByZWFkIGZhaWxzLCB3ZSBqdW1wICovCisJCQliZC0+aW5idWZDb3VudCA9IHJlYWQoYmQtPmluX2ZkLCBiZC0+aW5idWYsIElPQlVGX1NJWkUpOworCQkJaWYgKGJkLT5pbmJ1ZkNvdW50IDw9IDApCisJCQkJbG9uZ2ptcChiZC0+am1wYnVmLCBSRVRWQUxfVU5FWFBFQ1RFRF9JTlBVVF9FT0YpOworCQkJYmQtPmluYnVmUG9zID0gMDsKKwkJfQorCisJCS8qIEF2b2lkIDMyLWJpdCBvdmVyZmxvdyAoZHVtcCBiaXQgYnVmZmVyIHRvIHRvcCBvZiBvdXRwdXQpICovCisJCWlmIChiaXRfY291bnQgPj0gMjQpIHsKKwkJCWJpdHMgPSBiZC0+aW5idWZCaXRzICYgKCgxIDw8IGJpdF9jb3VudCkgLSAxKTsKKwkJCWJpdHNfd2FudGVkIC09IGJpdF9jb3VudDsKKwkJCWJpdHMgPDw9IGJpdHNfd2FudGVkOworCQkJYml0X2NvdW50ID0gMDsKKwkJfQorCisJCS8qIEdyYWIgbmV4dCA4IGJpdHMgb2YgaW5wdXQgZnJvbSBidWZmZXIuICovCisJCWJkLT5pbmJ1ZkJpdHMgPSAoYmQtPmluYnVmQml0cyA8PCA4KSB8IGJkLT5pbmJ1ZltiZC0+aW5idWZQb3MrK107CisJCWJpdF9jb3VudCArPSA4OworCX0KKworCS8qIENhbGN1bGF0ZSByZXN1bHQgKi8KKwliaXRfY291bnQgLT0gYml0c193YW50ZWQ7CisJYmQtPmluYnVmQml0Q291bnQgPSBiaXRfY291bnQ7CisJYml0cyB8PSAoYmQtPmluYnVmQml0cyA+PiBiaXRfY291bnQpICYgKCgxIDw8IGJpdHNfd2FudGVkKSAtIDEpOworCisJcmV0dXJuIGJpdHM7Cit9CisKKy8qIFVucGFja3MgdGhlIG5leHQgYmxvY2sgYW5kIHNldHMgdXAgZm9yIHRoZSBpbnZlcnNlIEJ1cnJvd3MtV2hlZWxlciBzdGVwLiAqLworc3RhdGljIGludCBnZXRfbmV4dF9ibG9jayhidW56aXBfZGF0YSAqYmQpCit7CisJc3RydWN0IGdyb3VwX2RhdGEgKmh1Zkdyb3VwOworCWludCBkYnVmQ291bnQsIGRidWZTaXplLCBncm91cENvdW50LCAqYmFzZSwgKmxpbWl0LCBzZWxlY3RvciwKKwkJaSwgaiwgdCwgcnVuUG9zLCBzeW1Db3VudCwgc3ltVG90YWwsIG5TZWxlY3RvcnMsIGJ5dGVDb3VudFsyNTZdOworCWludCBydW5DbnQgPSBydW5DbnQ7IC8qIGZvciBjb21waWxlciAqLworCXVpbnQ4X3QgdWMsIHN5bVRvQnl0ZVsyNTZdLCBtdGZTeW1ib2xbMjU2XSwgKnNlbGVjdG9yczsKKwl1aW50MzJfdCAqZGJ1ZjsKKwl1bnNpZ25lZCBvcmlnUHRyOworCisJZGJ1ZiA9IGJkLT5kYnVmOworCWRidWZTaXplID0gYmQtPmRidWZTaXplOworCXNlbGVjdG9ycyA9IGJkLT5zZWxlY3RvcnM7CisKKy8qIEluIGJib3gsIHdlIGFyZSBvayB3aXRoIGFib3J0aW5nIHRocm91Z2ggc2V0am1wIHdoaWNoIGlzIHNldCB1cCBpbiBzdGFydF9idW56aXAgKi8KKyNpZiAwCisJLyogUmVzZXQgbG9uZ2ptcCBJL08gZXJyb3IgaGFuZGxpbmcgKi8KKwlpID0gc2V0am1wKGJkLT5qbXBidWYpOworCWlmIChpKSByZXR1cm4gaTsKKyNlbmRpZgorCisJLyogUmVhZCBpbiBoZWFkZXIgc2lnbmF0dXJlIGFuZCBDUkMsIHRoZW4gdmFsaWRhdGUgc2lnbmF0dXJlLgorCSAgIChsYXN0IGJsb2NrIHNpZ25hdHVyZSBtZWFucyBDUkMgaXMgZm9yIHdob2xlIGZpbGUsIHJldHVybiBub3cpICovCisJaSA9IGdldF9iaXRzKGJkLCAyNCk7CisJaiA9IGdldF9iaXRzKGJkLCAyNCk7CisJYmQtPmhlYWRlckNSQyA9IGdldF9iaXRzKGJkLCAzMik7CisJaWYgKChpID09IDB4MTc3MjQ1KSAmJiAoaiA9PSAweDM4NTA5MCkpIHJldHVybiBSRVRWQUxfTEFTVF9CTE9DSzsKKwlpZiAoKGkgIT0gMHgzMTQxNTkpIHx8IChqICE9IDB4MjY1MzU5KSkgcmV0dXJuIFJFVFZBTF9OT1RfQlpJUF9EQVRBOworCisJLyogV2UgY2FuIGFkZCBzdXBwb3J0IGZvciBibG9ja1JhbmRvbWlzZWQgaWYgYW55Ym9keSBjb21wbGFpbnMuICBUaGVyZSB3YXMKKwkgICBzb21lIGNvZGUgZm9yIHRoaXMgaW4gYnVzeWJveCAxLjAuMC1wcmUzLCBidXQgbm9ib2R5IGV2ZXIgbm90aWNlZCB0aGF0CisJICAgaXQgZGlkbid0IGFjdHVhbGx5IHdvcmsuICovCisJaWYgKGdldF9iaXRzKGJkLCAxKSkgcmV0dXJuIFJFVFZBTF9PQlNPTEVURV9JTlBVVDsKKwlvcmlnUHRyID0gZ2V0X2JpdHMoYmQsIDI0KTsKKwlpZiAoKGludClvcmlnUHRyID4gZGJ1ZlNpemUpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKworCS8qIG1hcHBpbmcgdGFibGU6IGlmIHNvbWUgYnl0ZSB2YWx1ZXMgYXJlIG5ldmVyIHVzZWQgKGVuY29kaW5nIHRoaW5ncworCSAgIGxpa2UgYXNjaWkgdGV4dCksIHRoZSBjb21wcmVzc2lvbiBjb2RlIHJlbW92ZXMgdGhlIGdhcHMgdG8gaGF2ZSBmZXdlcgorCSAgIHN5bWJvbHMgdG8gZGVhbCB3aXRoLCBhbmQgd3JpdGVzIGEgc3BhcnNlIGJpdGZpZWxkIGluZGljYXRpbmcgd2hpY2gKKwkgICB2YWx1ZXMgd2VyZSBwcmVzZW50LiAgV2UgbWFrZSBhIHRyYW5zbGF0aW9uIHRhYmxlIHRvIGNvbnZlcnQgdGhlIHN5bWJvbHMKKwkgICBiYWNrIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGVzLiAqLworCXN5bVRvdGFsID0gMDsKKwlpID0gMDsKKwl0ID0gZ2V0X2JpdHMoYmQsIDE2KTsKKwlkbyB7CisJCWlmICh0ICYgKDEgPDwgMTUpKSB7CisJCQl1bnNpZ25lZCBpbm5lcl9tYXAgPSBnZXRfYml0cyhiZCwgMTYpOworCQkJZG8geworCQkJCWlmIChpbm5lcl9tYXAgJiAoMSA8PCAxNSkpCisJCQkJCXN5bVRvQnl0ZVtzeW1Ub3RhbCsrXSA9IGk7CisJCQkJaW5uZXJfbWFwIDw8PSAxOworCQkJCWkrKzsKKwkJCX0gd2hpbGUgKGkgJiAxNSk7CisJCQlpIC09IDE2OworCQl9CisJCXQgPDw9IDE7CisJCWkgKz0gMTY7CisJfSB3aGlsZSAoaSA8IDI1Nik7CisKKwkvKiBIb3cgbWFueSBkaWZmZXJlbnQgSHVmZm1hbiBjb2RpbmcgZ3JvdXBzIGRvZXMgdGhpcyBibG9jayB1c2U/ICovCisJZ3JvdXBDb3VudCA9IGdldF9iaXRzKGJkLCAzKTsKKwlpZiAoZ3JvdXBDb3VudCA8IDIgfHwgZ3JvdXBDb3VudCA+IE1BWF9HUk9VUFMpCisJCXJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKworCS8qIG5TZWxlY3RvcnM6IEV2ZXJ5IEdST1VQX1NJWkUgbWFueSBzeW1ib2xzIHdlIHNlbGVjdCBhIG5ldyBIdWZmbWFuIGNvZGluZworCSAgIGdyb3VwLiAgUmVhZCBpbiB0aGUgZ3JvdXAgc2VsZWN0b3IgbGlzdCwgd2hpY2ggaXMgc3RvcmVkIGFzIE1URiBlbmNvZGVkCisJICAgYml0IHJ1bnMuICAoTVRGPU1vdmUgVG8gRnJvbnQsIGFzIGVhY2ggdmFsdWUgaXMgdXNlZCBpdCdzIG1vdmVkIHRvIHRoZQorCSAgIHN0YXJ0IG9mIHRoZSBsaXN0LikgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBDb3VudDsgaSsrKQorCQltdGZTeW1ib2xbaV0gPSBpOworCW5TZWxlY3RvcnMgPSBnZXRfYml0cyhiZCwgMTUpOworCWlmICghblNlbGVjdG9ycykKKwkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCWZvciAoaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKKwkJdWludDhfdCB0bXBfYnl0ZTsKKwkJLyogR2V0IG5leHQgdmFsdWUgKi8KKwkJaW50IG4gPSAwOworCQl3aGlsZSAoZ2V0X2JpdHMoYmQsIDEpKSB7CisJCQlpZiAobiA+PSBncm91cENvdW50KSByZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCQluKys7CisJCX0KKwkJLyogRGVjb2RlIE1URiB0byBnZXQgdGhlIG5leHQgc2VsZWN0b3IgKi8KKwkJdG1wX2J5dGUgPSBtdGZTeW1ib2xbbl07CisJCXdoaWxlICgtLW4gPj0gMCkKKwkJCW10ZlN5bWJvbFtuICsgMV0gPSBtdGZTeW1ib2xbbl07CisJCW10ZlN5bWJvbFswXSA9IHNlbGVjdG9yc1tpXSA9IHRtcF9ieXRlOworCX0KKworCS8qIFJlYWQgdGhlIEh1ZmZtYW4gY29kaW5nIHRhYmxlcyBmb3IgZWFjaCBncm91cCwgd2hpY2ggY29kZSBmb3Igc3ltVG90YWwKKwkgICBsaXRlcmFsIHN5bWJvbHMsIHBsdXMgdHdvIHJ1biBzeW1ib2xzIChSVU5BLCBSVU5CKSAqLworCXN5bUNvdW50ID0gc3ltVG90YWwgKyAyOworCWZvciAoaiA9IDA7IGogPCBncm91cENvdW50OyBqKyspIHsKKwkJdWludDhfdCBsZW5ndGhbTUFYX1NZTUJPTFNdOworCQkvKiA4IGJpdHMgaXMgQUxNT1NUIGVub3VnaCBmb3IgdGVtcFtdLCBzZWUgYmVsb3cgKi8KKwkJdW5zaWduZWQgdGVtcFtNQVhfSFVGQ09ERV9CSVRTKzFdOworCQlpbnQgbWluTGVuLCBtYXhMZW4sIHBwLCBsZW5fbTE7CisKKwkJLyogUmVhZCBIdWZmbWFuIGNvZGUgbGVuZ3RocyBmb3IgZWFjaCBzeW1ib2wuICBUaGV5J3JlIHN0b3JlZCBpbgorCQkgICBhIHdheSBzaW1pbGFyIHRvIG10ZjsgcmVjb3JkIGEgc3RhcnRpbmcgdmFsdWUgZm9yIHRoZSBmaXJzdCBzeW1ib2wsCisJCSAgIGFuZCBhbiBvZmZzZXQgZnJvbSB0aGUgcHJldmlvdXMgdmFsdWUgZm9yIGV2ZXJ5IHN5bWJvbCBhZnRlciB0aGF0LgorCQkgICAoU3VidHJhY3RpbmcgMSBiZWZvcmUgdGhlIGxvb3AgYW5kIHRoZW4gYWRkaW5nIGl0IGJhY2sgYXQgdGhlIGVuZCBpcworCQkgICBhbiBvcHRpbWl6YXRpb24gdGhhdCBtYWtlcyB0aGUgdGVzdCBpbnNpZGUgdGhlIGxvb3Agc2ltcGxlcjogc3ltYm9sCisJCSAgIGxlbmd0aCAwIGJlY29tZXMgbmVnYXRpdmUsIHNvIGFuIHVuc2lnbmVkIGluZXF1YWxpdHkgY2F0Y2hlcyBpdC4pICovCisJCWxlbl9tMSA9IGdldF9iaXRzKGJkLCA1KSAtIDE7CisJCWZvciAoaSA9IDA7IGkgPCBzeW1Db3VudDsgaSsrKSB7CisJCQlmb3IgKDs7KSB7CisJCQkJaW50IHR3b19iaXRzOworCQkJCWlmICgodW5zaWduZWQpbGVuX20xID4gKE1BWF9IVUZDT0RFX0JJVFMtMSkpCisJCQkJCXJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKworCQkJCS8qIElmIGZpcnN0IGJpdCBpcyAwLCBzdG9wLiAgRWxzZSBzZWNvbmQgYml0IGluZGljYXRlcyB3aGV0aGVyCisJCQkJICAgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCB0aGUgdmFsdWUuICBPcHRpbWl6YXRpb246IGdyYWIgMgorCQkJCSAgIGJpdHMgYW5kIHVuZ2V0IHRoZSBzZWNvbmQgaWYgdGhlIGZpcnN0IHdhcyAwLiAqLworCQkJCXR3b19iaXRzID0gZ2V0X2JpdHMoYmQsIDIpOworCQkJCWlmICh0d29fYml0cyA8IDIpIHsKKwkJCQkJYmQtPmluYnVmQml0Q291bnQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogQWRkIG9uZSBpZiBzZWNvbmQgYml0IDEsIGVsc2Ugc3VidHJhY3QgMS4gIEF2b2lkcyBpZi9lbHNlICovCisJCQkJbGVuX20xICs9ICgoKHR3b19iaXRzKzEpICYgMikgLSAxKTsKKwkJCX0KKworCQkJLyogQ29ycmVjdCBmb3IgdGhlIGluaXRpYWwgLTEsIHRvIGdldCB0aGUgZmluYWwgc3ltYm9sIGxlbmd0aCAqLworCQkJbGVuZ3RoW2ldID0gbGVuX20xICsgMTsKKwkJfQorCisJCS8qIEZpbmQgbGFyZ2VzdCBhbmQgc21hbGxlc3QgbGVuZ3RocyBpbiB0aGlzIGdyb3VwICovCisJCW1pbkxlbiA9IG1heExlbiA9IGxlbmd0aFswXTsKKwkJZm9yIChpID0gMTsgaSA8IHN5bUNvdW50OyBpKyspIHsKKwkJCWlmIChsZW5ndGhbaV0gPiBtYXhMZW4pIG1heExlbiA9IGxlbmd0aFtpXTsKKwkJCWVsc2UgaWYgKGxlbmd0aFtpXSA8IG1pbkxlbikgbWluTGVuID0gbGVuZ3RoW2ldOworCQl9CisKKwkJLyogQ2FsY3VsYXRlIHBlcm11dGVbXSwgYmFzZVtdLCBhbmQgbGltaXRbXSB0YWJsZXMgZnJvbSBsZW5ndGhbXS4KKwkJICoKKwkJICogcGVybXV0ZVtdIGlzIHRoZSBsb29rdXAgdGFibGUgZm9yIGNvbnZlcnRpbmcgSHVmZm1hbiBjb2RlZCBzeW1ib2xzCisJCSAqIGludG8gZGVjb2RlZCBzeW1ib2xzLiAgYmFzZVtdIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB0aGUKKwkJICogdmFsdWUgb2YgYSBIdWZmbWFuIHN5bWJvbCBvZiBhIGdpdmVuIGxlbmd0aCB3aGVuIHVzaW5nIHBlcm11dGVbXS4KKwkJICoKKwkJICogbGltaXRbXSBpbmRpY2F0ZXMgdGhlIGxhcmdlc3QgbnVtZXJpY2FsIHZhbHVlIGEgc3ltYm9sIHdpdGggYSBnaXZlbgorCQkgKiBudW1iZXIgb2YgYml0cyBjYW4gaGF2ZS4gIFRoaXMgaXMgaG93IHRoZSBIdWZmbWFuIGNvZGVzIGNhbiB2YXJ5IGluCisJCSAqIGxlbmd0aDogZWFjaCBjb2RlIHdpdGggYSB2YWx1ZT5saW1pdFtsZW5ndGhdIG5lZWRzIGFub3RoZXIgYml0LgorCQkgKi8KKwkJaHVmR3JvdXAgPSBiZC0+Z3JvdXBzICsgajsKKwkJaHVmR3JvdXAtPm1pbkxlbiA9IG1pbkxlbjsKKwkJaHVmR3JvdXAtPm1heExlbiA9IG1heExlbjsKKworCQkvKiBOb3RlIHRoYXQgbWluTGVuIGNhbid0IGJlIHNtYWxsZXIgdGhhbiAxLCBzbyB3ZSBhZGp1c3QgdGhlIGJhc2UKKwkJICAgYW5kIGxpbWl0IGFycmF5IHBvaW50ZXJzIHNvIHdlJ3JlIG5vdCBhbHdheXMgd2FzdGluZyB0aGUgZmlyc3QKKwkJICAgZW50cnkuICBXZSBkbyB0aGlzIGFnYWluIHdoZW4gdXNpbmcgdGhlbSAoZHVyaW5nIHN5bWJvbCBkZWNvZGluZykuICovCisJCWJhc2UgPSBodWZHcm91cC0+YmFzZSAtIDE7CisJCWxpbWl0ID0gaHVmR3JvdXAtPmxpbWl0IC0gMTsKKworCQkvKiBDYWxjdWxhdGUgcGVybXV0ZVtdLiAgQ29uY3VyZW50bHksIGluaXRpYWxpemUgdGVtcFtdIGFuZCBsaW1pdFtdLiAqLworCQlwcCA9IDA7CisJCWZvciAoaSA9IG1pbkxlbjsgaSA8PSBtYXhMZW47IGkrKykgeworCQkJaW50IGs7CisJCQl0ZW1wW2ldID0gbGltaXRbaV0gPSAwOworCQkJZm9yIChrID0gMDsgayA8IHN5bUNvdW50OyBrKyspCisJCQkJaWYgKGxlbmd0aFtrXSA9PSBpKQorCQkJCQlodWZHcm91cC0+cGVybXV0ZVtwcCsrXSA9IGs7CisJCX0KKworCQkvKiBDb3VudCBzeW1ib2xzIGNvZGVkIGZvciBhdCBlYWNoIGJpdCBsZW5ndGggKi8KKwkJLyogTkI6IGluIHBhdGhvbG9naWNhbCBjYXNlcywgdGVtcFs4XSBjYW4gZW5kIGlwIGJlaW5nIDI1Ni4KKwkJICogVGhhdCdzIHdoeSB1aW50OF90IGlzIHRvbyBzbWFsbCBmb3IgdGVtcFtdLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgc3ltQ291bnQ7IGkrKykgdGVtcFtsZW5ndGhbaV1dKys7CisKKwkJLyogQ2FsY3VsYXRlIGxpbWl0W10gKHRoZSBsYXJnZXN0IHN5bWJvbC1jb2RpbmcgdmFsdWUgYXQgZWFjaCBiaXQKKwkJICogbGVuZ3RoLCB3aGljaCBpcyAocHJldmlvdXMgbGltaXQ8PDEpK3N5bWJvbHMgYXQgdGhpcyBsZXZlbCksIGFuZAorCQkgKiBiYXNlW10gKG51bWJlciBvZiBzeW1ib2xzIHRvIGlnbm9yZSBhdCBlYWNoIGJpdCBsZW5ndGgsIHdoaWNoIGlzCisJCSAqIGxpbWl0IG1pbnVzIHRoZSBjdW11bGF0aXZlIGNvdW50IG9mIHN5bWJvbHMgY29kZWQgZm9yIGFscmVhZHkpLiAqLworCQlwcCA9IHQgPSAwOworCQlmb3IgKGkgPSBtaW5MZW47IGkgPCBtYXhMZW47KSB7CisJCQl1bnNpZ25lZCB0ZW1wX2kgPSB0ZW1wW2ldOworCisJCQlwcCArPSB0ZW1wX2k7CisKKwkJCS8qIFdlIHJlYWQgdGhlIGxhcmdlc3QgcG9zc2libGUgc3ltYm9sIHNpemUgYW5kIHRoZW4gdW5nZXQgYml0cworCQkJICAgYWZ0ZXIgZGV0ZXJtaW5pbmcgaG93IG1hbnkgd2UgbmVlZCwgYW5kIHRob3NlIGV4dHJhIGJpdHMgY291bGQKKwkJCSAgIGJlIHNldCB0byBhbnl0aGluZy4gIChUaGV5J3JlIG5vaXNlIGZyb20gZnV0dXJlIHN5bWJvbHMuKSAgQXQKKwkJCSAgIGVhY2ggbGV2ZWwgd2UncmUgcmVhbGx5IG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZmlyc3QgZmV3IGJpdHMsCisJCQkgICBzbyBoZXJlIHdlIHNldCBhbGwgdGhlIHRyYWlsaW5nIHRvLWJlLWlnbm9yZWQgYml0cyB0byAxIHNvIHRoZXkKKwkJCSAgIGRvbid0IGFmZmVjdCB0aGUgdmFsdWU+bGltaXRbbGVuZ3RoXSBjb21wYXJpc29uLiAqLworCQkJbGltaXRbaV0gPSAocHAgPDwgKG1heExlbiAtIGkpKSAtIDE7CisJCQlwcCA8PD0gMTsKKwkJCXQgKz0gdGVtcF9pOworCQkJYmFzZVsrK2ldID0gcHAgLSB0OworCQl9CisJCWxpbWl0W21heExlbl0gPSBwcCArIHRlbXBbbWF4TGVuXSAtIDE7CisJCWxpbWl0W21heExlbisxXSA9IElOVF9NQVg7IC8qIFNlbnRpbmVsIHZhbHVlIGZvciByZWFkaW5nIG5leHQgc3ltLiAqLworCQliYXNlW21pbkxlbl0gPSAwOworCX0KKworCS8qIFdlJ3ZlIGZpbmlzaGVkIHJlYWRpbmcgYW5kIGRpZ2VzdGluZyB0aGUgYmxvY2sgaGVhZGVyLiAgTm93IHJlYWQgdGhpcworCSAgIGJsb2NrJ3MgSHVmZm1hbiBjb2RlZCBzeW1ib2xzIGZyb20gdGhlIGZpbGUgYW5kIHVuZG8gdGhlIEh1ZmZtYW4gY29kaW5nCisJICAgYW5kIHJ1biBsZW5ndGggZW5jb2RpbmcsIHNhdmluZyB0aGUgcmVzdWx0IGludG8gZGJ1ZltkYnVmQ291bnQrK10gPSB1YyAqLworCisJLyogSW5pdGlhbGl6ZSBzeW1ib2wgb2NjdXJyZW5jZSBjb3VudGVycyBhbmQgc3ltYm9sIE1vdmUgVG8gRnJvbnQgdGFibGUgKi8KKwkvKm1lbXNldChieXRlQ291bnQsIDAsIHNpemVvZihieXRlQ291bnQpKTsgLSBzbWFsbGVyLCBidXQgc2xvd2VyICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWJ5dGVDb3VudFtpXSA9IDA7CisJCW10ZlN5bWJvbFtpXSA9ICh1aW50OF90KWk7CisJfQorCisJLyogTG9vcCB0aHJvdWdoIGNvbXByZXNzZWQgc3ltYm9scy4gKi8KKworCXJ1blBvcyA9IGRidWZDb3VudCA9IHNlbGVjdG9yID0gMDsKKwlmb3IgKDs7KSB7CisJCWludCBuZXh0U3ltOworCisJCS8qIEZldGNoIG5leHQgSHVmZm1hbiBjb2RpbmcgZ3JvdXAgZnJvbSBsaXN0LiAqLworCQlzeW1Db3VudCA9IEdST1VQX1NJWkUgLSAxOworCQlpZiAoc2VsZWN0b3IgPj0gblNlbGVjdG9ycykgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCQlodWZHcm91cCA9IGJkLT5ncm91cHMgKyBzZWxlY3RvcnNbc2VsZWN0b3IrK107CisJCWJhc2UgPSBodWZHcm91cC0+YmFzZSAtIDE7CisJCWxpbWl0ID0gaHVmR3JvdXAtPmxpbWl0IC0gMTsKKworIGNvbnRpbnVlX3RoaXNfZ3JvdXA6CisJCS8qIFJlYWQgbmV4dCBIdWZmbWFuLWNvZGVkIHN5bWJvbC4gKi8KKworCQkvKiBOb3RlOiBJdCBpcyBmYXIgY2hlYXBlciB0byByZWFkIG1heExlbiBiaXRzIGFuZCBiYWNrIHVwIHRoYW4gaXQgaXMKKwkJICAgdG8gcmVhZCBtaW5MZW4gYml0cyBhbmQgdGhlbiBhZGQgYWRkaXRpb25hbCBiaXQgYXQgYSB0aW1lLCB0ZXN0aW5nCisJCSAgIGFzIHdlIGdvLiAgQmVjYXVzZSB0aGVyZSBpcyBhIHRyYWlsaW5nIGxhc3QgYmxvY2sgKHdpdGggZmlsZSBDUkMpLAorCQkgICB0aGVyZSBpcyBubyBkYW5nZXIgb2YgdGhlIG92ZXJyZWFkIGNhdXNpbmcgYW4gdW5leHBlY3RlZCBFT0YgZm9yIGEKKwkJICAgdmFsaWQgY29tcHJlc3NlZCBmaWxlLgorCQkgKi8KKwkJaWYgKDEpIHsKKwkJCS8qIEFzIGEgZnVydGhlciBvcHRpbWl6YXRpb24sIHdlIGRvIHRoZSByZWFkIGlubGluZQorCQkJICAgKGZhbGxpbmcgYmFjayB0byBhIGNhbGwgdG8gZ2V0X2JpdHMgaWYgdGhlIGJ1ZmZlciBydW5zIGRyeSkuCisJCQkgKi8KKwkJCWludCBuZXdfY250OworCQkJd2hpbGUgKChuZXdfY250ID0gYmQtPmluYnVmQml0Q291bnQgLSBodWZHcm91cC0+bWF4TGVuKSA8IDApIHsKKwkJCQkvKiBiZC0+aW5idWZCaXRDb3VudCA8IGh1Zkdyb3VwLT5tYXhMZW4gKi8KKwkJCQlpZiAoYmQtPmluYnVmUG9zID09IGJkLT5pbmJ1ZkNvdW50KSB7CisJCQkJCW5leHRTeW0gPSBnZXRfYml0cyhiZCwgaHVmR3JvdXAtPm1heExlbik7CisJCQkJCWdvdG8gZ290X2h1ZmZfYml0czsKKwkJCQl9CisJCQkJYmQtPmluYnVmQml0cyA9IChiZC0+aW5idWZCaXRzIDw8IDgpIHwgYmQtPmluYnVmW2JkLT5pbmJ1ZlBvcysrXTsKKwkJCQliZC0+aW5idWZCaXRDb3VudCArPSA4OworCQkJfTsKKwkJCWJkLT5pbmJ1ZkJpdENvdW50ID0gbmV3X2NudDsgLyogImJkLT5pbmJ1ZkJpdENvdW50IC09IGh1Zkdyb3VwLT5tYXhMZW47IiAqLworCQkJbmV4dFN5bSA9IChiZC0+aW5idWZCaXRzID4+IG5ld19jbnQpICYgKCgxIDw8IGh1Zkdyb3VwLT5tYXhMZW4pIC0gMSk7CisgZ290X2h1ZmZfYml0czogOworCQl9IGVsc2UgeyAvKiB1bm9wdGltaXplZCBlcXVpdmFsZW50ICovCisJCQluZXh0U3ltID0gZ2V0X2JpdHMoYmQsIGh1Zkdyb3VwLT5tYXhMZW4pOworCQl9CisJCS8qIEZpZ3VyZSBob3cgbWFueSBiaXRzIGFyZSBpbiBuZXh0IHN5bWJvbCBhbmQgdW5nZXQgZXh0cmFzICovCisJCWkgPSBodWZHcm91cC0+bWluTGVuOworCQl3aGlsZSAobmV4dFN5bSA+IGxpbWl0W2ldKSArK2k7CisJCWogPSBodWZHcm91cC0+bWF4TGVuIC0gaTsKKwkJaWYgKGogPCAwKQorCQkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCQliZC0+aW5idWZCaXRDb3VudCArPSBqOworCisJCS8qIEh1ZmZtYW4gZGVjb2RlIHZhbHVlIHRvIGdldCBuZXh0U3ltICh3aXRoIGJvdW5kcyBjaGVja2luZykgKi8KKwkJbmV4dFN5bSA9IChuZXh0U3ltID4+IGopIC0gYmFzZVtpXTsKKwkJaWYgKCh1bnNpZ25lZCluZXh0U3ltID49IE1BWF9TWU1CT0xTKQorCQkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCQluZXh0U3ltID0gaHVmR3JvdXAtPnBlcm11dGVbbmV4dFN5bV07CisKKwkJLyogV2UgaGF2ZSBub3cgZGVjb2RlZCB0aGUgc3ltYm9sLCB3aGljaCBpbmRpY2F0ZXMgZWl0aGVyIGEgbmV3IGxpdGVyYWwKKwkJICAgYnl0ZSwgb3IgYSByZXBlYXRlZCBydW4gb2YgdGhlIG1vc3QgcmVjZW50IGxpdGVyYWwgYnl0ZS4gIEZpcnN0LAorCQkgICBjaGVjayBpZiBuZXh0U3ltIGluZGljYXRlcyBhIHJlcGVhdGVkIHJ1biwgYW5kIGlmIHNvIGxvb3AgY29sbGVjdGluZworCQkgICBob3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIGxhc3QgbGl0ZXJhbC4gKi8KKwkJaWYgKCh1bnNpZ25lZCluZXh0U3ltIDw9IFNZTUJPTF9SVU5CKSB7IC8qIFJVTkEgb3IgUlVOQiAqLworCisJCQkvKiBJZiB0aGlzIGlzIHRoZSBzdGFydCBvZiBhIG5ldyBydW4sIHplcm8gb3V0IGNvdW50ZXIgKi8KKwkJCWlmIChydW5Qb3MgPT0gMCkgeworCQkJCXJ1blBvcyA9IDE7CisJCQkJcnVuQ250ID0gMDsKKwkJCX0KKworCQkJLyogTmVhdCB0cmljayB0aGF0IHNhdmVzIDEgc3ltYm9sOiBpbnN0ZWFkIG9mIG9yLWluZyAwIG9yIDEgYXQKKwkJCSAgIGVhY2ggYml0IHBvc2l0aW9uLCBhZGQgMSBvciAyIGluc3RlYWQuICBGb3IgZXhhbXBsZSwKKwkJCSAgIDEwMTEgaXMgMTw8MCArIDE8PDEgKyAyPDwyLiAgMTAxMCBpcyAyPDwwICsgMjw8MSArIDE8PDIuCisJCQkgICBZb3UgY2FuIG1ha2UgYW55IGJpdCBwYXR0ZXJuIHRoYXQgd2F5IHVzaW5nIDEgbGVzcyBzeW1ib2wgdGhhbgorCQkJICAgdGhlIGJhc2ljIG9yIDAvMSBtZXRob2QgKGV4Y2VwdCBhbGwgYml0cyAwLCB3aGljaCB3b3VsZCB1c2Ugbm8KKwkJCSAgIHN5bWJvbHMsIGJ1dCBhIHJ1biBvZiBsZW5ndGggMCBkb2Vzbid0IG1lYW4gYW55dGhpbmcgaW4gdGhpcworCQkJICAgY29udGV4dCkuICBUaHVzIHNwYWNlIGlzIHNhdmVkLiAqLworCQkJcnVuQ250ICs9IChydW5Qb3MgPDwgbmV4dFN5bSk7IC8qICtydW5Qb3MgaWYgUlVOQTsgKzIqcnVuUG9zIGlmIFJVTkIgKi8KKwkJCWlmIChydW5Qb3MgPCBkYnVmU2l6ZSkgcnVuUG9zIDw8PSAxOworCQkJZ290byBlbmRfb2ZfaHVmZm1hbl9sb29wOworCQl9CisKKwkJLyogV2hlbiB3ZSBoaXQgdGhlIGZpcnN0IG5vbi1ydW4gc3ltYm9sIGFmdGVyIGEgcnVuLCB3ZSBub3cga25vdworCQkgICBob3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIGxhc3QgbGl0ZXJhbCwgc28gYXBwZW5kIHRoYXQgbWFueQorCQkgICBjb3BpZXMgdG8gb3VyIGJ1ZmZlciBvZiBkZWNvZGVkIHN5bWJvbHMgKGRidWYpIG5vdy4gIChUaGUgbGFzdAorCQkgICBsaXRlcmFsIHVzZWQgaXMgdGhlIG9uZSBhdCB0aGUgaGVhZCBvZiB0aGUgbXRmU3ltYm9sIGFycmF5LikgKi8KKwkJaWYgKHJ1blBvcyAhPSAwKSB7CisJCQl1aW50OF90IHRtcF9ieXRlOworCQkJaWYgKGRidWZDb3VudCArIHJ1bkNudCA+PSBkYnVmU2l6ZSkgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCQkJdG1wX2J5dGUgPSBzeW1Ub0J5dGVbbXRmU3ltYm9sWzBdXTsKKwkJCWJ5dGVDb3VudFt0bXBfYnl0ZV0gKz0gcnVuQ250OworCQkJd2hpbGUgKC0tcnVuQ250ID49IDApIGRidWZbZGJ1ZkNvdW50KytdID0gKHVpbnQzMl90KXRtcF9ieXRlOworCQkJcnVuUG9zID0gMDsKKwkJfQorCisJCS8qIElzIHRoaXMgdGhlIHRlcm1pbmF0aW5nIHN5bWJvbD8gKi8KKwkJaWYgKG5leHRTeW0gPiBzeW1Ub3RhbCkgYnJlYWs7CisKKwkJLyogQXQgdGhpcyBwb2ludCwgbmV4dFN5bSBpbmRpY2F0ZXMgYSBuZXcgbGl0ZXJhbCBjaGFyYWN0ZXIuICBTdWJ0cmFjdAorCQkgICBvbmUgdG8gZ2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgTVRGIGFycmF5IGF0IHdoaWNoIHRoaXMgbGl0ZXJhbCBpcworCQkgICBjdXJyZW50bHkgdG8gYmUgZm91bmQuICAoTm90ZSB0aGF0IHRoZSByZXN1bHQgY2FuJ3QgYmUgLTEgb3IgMCwKKwkJICAgYmVjYXVzZSAwIGFuZCAxIGFyZSBSVU5BIGFuZCBSVU5CLiAgQnV0IGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlCisJCSAgIGZpcnN0IHN5bWJvbCBpbiB0aGUgbXRmIGFycmF5LCBwb3NpdGlvbiAwLCB3b3VsZCBoYXZlIGJlZW4gaGFuZGxlZAorCQkgICBhcyBwYXJ0IG9mIGEgcnVuIGFib3ZlLiAgVGhlcmVmb3JlIDEgdW51c2VkIG10ZiBwb3NpdGlvbiBtaW51cworCQkgICAyIG5vbi1saXRlcmFsIG5leHRTeW0gdmFsdWVzIGVxdWFscyAtMS4pICovCisJCWlmIChkYnVmQ291bnQgPj0gZGJ1ZlNpemUpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKwkJaSA9IG5leHRTeW0gLSAxOworCQl1YyA9IG10ZlN5bWJvbFtpXTsKKworCQkvKiBBZGp1c3QgdGhlIE1URiBhcnJheS4gIFNpbmNlIHdlIHR5cGljYWxseSBleHBlY3QgdG8gbW92ZSBvbmx5IGEKKwkJICogc21hbGwgbnVtYmVyIG9mIHN5bWJvbHMsIGFuZCBhcmUgYm91bmQgYnkgMjU2IGluIGFueSBjYXNlLCB1c2luZworCQkgKiBtZW1tb3ZlIGhlcmUgd291bGQgdHlwaWNhbGx5IGJlIGJpZ2dlciBhbmQgc2xvd2VyIGR1ZSB0byBmdW5jdGlvbgorCQkgKiBjYWxsIG92ZXJoZWFkIGFuZCBvdGhlciBhc3NvcnRlZCBzZXR1cCBjb3N0cy4gKi8KKwkJZG8geworCQkJbXRmU3ltYm9sW2ldID0gbXRmU3ltYm9sW2ktMV07CisJCX0gd2hpbGUgKC0taSk7CisJCW10ZlN5bWJvbFswXSA9IHVjOworCQl1YyA9IHN5bVRvQnl0ZVt1Y107CisKKwkJLyogV2UgaGF2ZSBvdXIgbGl0ZXJhbCBieXRlLiAgU2F2ZSBpdCBpbnRvIGRidWYuICovCisJCWJ5dGVDb3VudFt1Y10rKzsKKwkJZGJ1ZltkYnVmQ291bnQrK10gPSAodWludDMyX3QpdWM7CisKKwkJLyogU2tpcCBncm91cCBpbml0aWFsaXphdGlvbiBpZiB3ZSdyZSBub3QgZG9uZSB3aXRoIHRoaXMgZ3JvdXAuICBEb25lCisJCSAqIHRoaXMgd2F5IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuICovCisgZW5kX29mX2h1ZmZtYW5fbG9vcDoKKwkJaWYgKC0tc3ltQ291bnQgPj0gMCkgZ290byBjb250aW51ZV90aGlzX2dyb3VwOworCX0KKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIHJlYWQgYWxsIHRoZSBIdWZmbWFuLWNvZGVkIHN5bWJvbHMgKGFuZCByZXBlYXRlZAorCSAgIHJ1bnMpIGZvciB0aGlzIGJsb2NrIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgYW5kIGRlY29kZWQgdGhlbSBpbnRvIHRoZQorCSAgIGludGVybWVkaWF0ZSBidWZmZXIuICBUaGVyZSBhcmUgZGJ1ZkNvdW50IG1hbnkgZGVjb2RlZCBieXRlcyBpbiBkYnVmW10uCisJICAgTm93IHVuZG8gdGhlIEJ1cnJvd3MtV2hlZWxlciB0cmFuc2Zvcm0gb24gZGJ1Zi4KKwkgICBTZWUgaHR0cDovL2RvZ21hLm5ldC9tYXJrbi9hcnRpY2xlcy9id3QvYnd0Lmh0bQorCSAqLworCisJLyogVHVybiBieXRlQ291bnQgaW50byBjdW11bGF0aXZlIG9jY3VycmVuY2UgY291bnRzIG9mIDAgdG8gbi0xLiAqLworCWogPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpbnQgdG1wX2NvdW50ID0gaiArIGJ5dGVDb3VudFtpXTsKKwkJYnl0ZUNvdW50W2ldID0gajsKKwkJaiA9IHRtcF9jb3VudDsKKwl9CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgb3JkZXIgZGJ1ZiB3b3VsZCBiZSBpbiBpZiB3ZSBzb3J0ZWQgaXQuICovCisJZm9yIChpID0gMDsgaSA8IGRidWZDb3VudDsgaSsrKSB7CisJCXVpbnQ4X3QgdG1wX2J5dGUgPSAodWludDhfdClkYnVmW2ldOworCQlpbnQgdG1wX2NvdW50ID0gYnl0ZUNvdW50W3RtcF9ieXRlXTsKKwkJZGJ1Zlt0bXBfY291bnRdIHw9IChpIDw8IDgpOworCQlieXRlQ291bnRbdG1wX2J5dGVdID0gdG1wX2NvdW50ICsgMTsKKwl9CisKKwkvKiBEZWNvZGUgZmlyc3QgYnl0ZSBieSBoYW5kIHRvIGluaXRpYWxpemUgInByZXZpb3VzIiBieXRlLiAgTm90ZSB0aGF0IGl0CisJICAgZG9lc24ndCBnZXQgb3V0cHV0LCBhbmQgaWYgdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgYXJlIGlkZW50aWNhbAorCSAgIGl0IGRvZXNuJ3QgcXVhbGlmeSBhcyBhIHJ1biAoaGVuY2Ugd3JpdGVSdW5Db3VudGRvd249NSkuICovCisJaWYgKGRidWZDb3VudCkgeworCQl1aW50MzJfdCB0bXA7CisJCWlmICgoaW50KW9yaWdQdHIgPj0gZGJ1ZkNvdW50KSByZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCXRtcCA9IGRidWZbb3JpZ1B0cl07CisJCWJkLT53cml0ZUN1cnJlbnQgPSAodWludDhfdCl0bXA7CisJCWJkLT53cml0ZVBvcyA9ICh0bXAgPj4gOCk7CisJCWJkLT53cml0ZVJ1bkNvdW50ZG93biA9IDU7CisJfQorCWJkLT53cml0ZUNvdW50ID0gZGJ1ZkNvdW50OworCisJcmV0dXJuIFJFVFZBTF9PSzsKK30KKworLyogVW5kbyBCdXJyb3dzLVdoZWVsZXIgdHJhbnNmb3JtIG9uIGludGVybWVkaWF0ZSBidWZmZXIgdG8gcHJvZHVjZSBvdXRwdXQuCisgICBJZiBzdGFydF9idW56aXAgd2FzIGluaXRpYWxpemVkIHdpdGggb3V0X2ZkPS0xLCB0aGVuIHVwIHRvIGxlbiBieXRlcyBvZgorICAgZGF0YSBhcmUgd3JpdHRlbiB0byBvdXRidWYuICBSZXR1cm4gdmFsdWUgaXMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IKKyAgIGVycm9yIChhbGwgZXJyb3JzIGFyZSBuZWdhdGl2ZSBudW1iZXJzKS4gIElmIG91dF9mZCE9LTEsIG91dGJ1ZiBhbmQgbGVuCisgICBhcmUgaWdub3JlZCwgZGF0YSBpcyB3cml0dGVuIHRvIG91dF9mZCBhbmQgcmV0dXJuIGlzIFJFVFZBTF9PSyBvciBlcnJvci4KKworICAgTkI6IHJlYWRfYnVuemlwIHJldHVybnMgPCAwIG9uIGVycm9yLCBvciB0aGUgbnVtYmVyIG9mICp1bmZpbGxlZCogYnl0ZXMKKyAgIGluIG91dGJ1Zi4gSU9XOiBvbiBFT0YgcmV0dXJucyBsZW4gKCJhbGwgYnl0ZXMgYXJlIG5vdCBmaWxsZWQiKSwgbm90IDAuCisgICAoV2h5PyBUaGlzIGFsbG93cyB0byBnZXQgcmlkIG9mIG9uZSBsb2NhbCB2YXJpYWJsZSkKKyovCitpbnQgRkFTVF9GVU5DIHJlYWRfYnVuemlwKGJ1bnppcF9kYXRhICpiZCwgY2hhciAqb3V0YnVmLCBpbnQgbGVuKQoreworCWNvbnN0IHVpbnQzMl90ICpkYnVmOworCWludCBwb3MsIGN1cnJlbnQsIHByZXZpb3VzOworCXVpbnQzMl90IENSQzsKKworCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBlcnJvci9lbmQgaW5kaWNhdG9yLCByZXR1cm4gaXQgKi8KKwlpZiAoYmQtPndyaXRlQ291bnQgPCAwKQorCQlyZXR1cm4gYmQtPndyaXRlQ291bnQ7CisKKwlkYnVmID0gYmQtPmRidWY7CisKKwkvKiBSZWdpc3Rlci1jYWNoZWQgc3RhdGUgKGhvcGVmdWxseSk6ICovCisJcG9zID0gYmQtPndyaXRlUG9zOworCWN1cnJlbnQgPSBiZC0+d3JpdGVDdXJyZW50OworCUNSQyA9IGJkLT53cml0ZUNSQzsgLyogc21hbGwgbG9zcyBvbiB4ODYtMzIgKG5vdCBlbm91Z2ggcmVncyksIHdpbiBvbiB4ODYtNjQgKi8KKworCS8qIFdlIHdpbGwgYWx3YXlzIGhhdmUgcGVuZGluZyBkZWNvZGVkIGRhdGEgdG8gd3JpdGUgaW50byB0aGUgb3V0cHV0CisJICAgYnVmZmVyIHVubGVzcyB0aGlzIGlzIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgKGluIHdoaWNoIGNhc2Ugd2UgaGF2ZW4ndAorCSAgIEh1ZmZtYW4tZGVjb2RlZCBhIGJsb2NrIGludG8gdGhlIGludGVybWVkaWF0ZSBidWZmZXIgeWV0KS4gKi8KKwlpZiAoYmQtPndyaXRlQ29waWVzKSB7CisKKyBkZWNfd3JpdGVDb3BpZXM6CisJCS8qIEluc2lkZSB0aGUgbG9vcCwgd3JpdGVDb3BpZXMgbWVhbnMgZXh0cmEgY29waWVzIChiZXlvbmQgMSkgKi8KKwkJLS1iZC0+d3JpdGVDb3BpZXM7CisKKwkJLyogTG9vcCBvdXRwdXR0aW5nIGJ5dGVzICovCisJCWZvciAoOzspIHsKKworCQkJLyogSWYgdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCwgc2F2ZSBjYWNoZWQgc3RhdGUgYW5kIHJldHVybiAqLworCQkJaWYgKC0tbGVuIDwgMCkgeworCQkJCS8qIFVubGlrZWx5IGJyYW5jaC4KKwkJCQkgKiBVc2Ugb2YgImdvdG8iIGluc3RlYWQgb2Yga2VlcGluZyBjb2RlIGhlcmUKKwkJCQkgKiBoZWxwcyBjb21waWxlciB0byByZWFsaXplIHRoaXMuICovCisJCQkJZ290byBvdXRidWZfZnVsbDsKKwkJCX0KKworCQkJLyogV3JpdGUgbmV4dCBieXRlIGludG8gb3V0cHV0IGJ1ZmZlciwgdXBkYXRpbmcgQ1JDICovCisJCQkqb3V0YnVmKysgPSBjdXJyZW50OworCQkJQ1JDID0gKENSQyA8PCA4KSBeIGJkLT5jcmMzMlRhYmxlWyhDUkMgPj4gMjQpIF4gY3VycmVudF07CisKKwkJCS8qIExvb3Agbm93IGlmIHdlJ3JlIG91dHB1dHRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoaXMgYnl0ZSAqLworCQkJaWYgKGJkLT53cml0ZUNvcGllcykgeworCQkJCS8qIFVubGlrZWx5IGJyYW5jaCAqLworCQkJCS8qLS1iZC0+d3JpdGVDb3BpZXM7Ki8KKwkJCQkvKmNvbnRpbnVlOyovCisJCQkJLyogU2FtZSwgYnV0IChhYil1c2luZyBvdGhlciBleGlzdGluZyAtLXdyaXRlQ29waWVzIG9wZXJhdGlvbgorCQkJCSAqIChhbmQgdGhpcyBpZigpIGNvbXBpbGVzIGludG8ganVzdCB0ZXN0K2JyYW5jaCBwYWlyKTogKi8KKwkJCQlnb3RvIGRlY193cml0ZUNvcGllczsKKwkJCX0KKyBkZWNvZGVfbmV4dF9ieXRlOgorCQkJaWYgKC0tYmQtPndyaXRlQ291bnQgPCAwKQorCQkJCWJyZWFrOyAvKiBpbnB1dCBibG9jayBpcyBmdWxseSBjb25zdW1lZCwgbmVlZCBuZXh0IG9uZSAqLworCisJCQkvKiBGb2xsb3cgc2VxdWVuY2UgdmVjdG9yIHRvIHVuZG8gQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybSAqLworCQkJcHJldmlvdXMgPSBjdXJyZW50OworCQkJcG9zID0gZGJ1Zltwb3NdOworCQkJY3VycmVudCA9ICh1aW50OF90KXBvczsKKwkJCXBvcyA+Pj0gODsKKworCQkJLyogQWZ0ZXIgMyBjb25zZWN1dGl2ZSBjb3BpZXMgb2YgdGhlIHNhbWUgYnl0ZSwgdGhlIDR0aAorCQkJICogaXMgYSByZXBlYXQgY291bnQuICBXZSBjb3VudCBkb3duIGZyb20gNCBpbnN0ZWFkCisJCQkgKiBvZiBjb3VudGluZyB1cCBiZWNhdXNlIHRlc3RpbmcgZm9yIG5vbi16ZXJvIGlzIGZhc3RlciAqLworCQkJaWYgKC0tYmQtPndyaXRlUnVuQ291bnRkb3duICE9IDApIHsKKwkJCQlpZiAoY3VycmVudCAhPSBwcmV2aW91cykKKwkJCQkJYmQtPndyaXRlUnVuQ291bnRkb3duID0gNDsKKwkJCX0gZWxzZSB7CisJCQkJLyogVW5saWtlbHkgYnJhbmNoICovCisJCQkJLyogV2UgaGF2ZSBhIHJlcGVhdGVkIHJ1biwgdGhpcyBieXRlIGluZGljYXRlcyB0aGUgY291bnQgKi8KKwkJCQliZC0+d3JpdGVDb3BpZXMgPSBjdXJyZW50OworCQkJCWN1cnJlbnQgPSBwcmV2aW91czsKKwkJCQliZC0+d3JpdGVSdW5Db3VudGRvd24gPSA1OworCisJCQkJLyogU29tZXRpbWVzIHRoZXJlIGFyZSBqdXN0IDMgYnl0ZXMgKHJ1biBsZW5ndGggMCkgKi8KKwkJCQlpZiAoIWJkLT53cml0ZUNvcGllcykgZ290byBkZWNvZGVfbmV4dF9ieXRlOworCisJCQkJLyogU3VidHJhY3QgdGhlIDEgY29weSB3ZSdkIG91dHB1dCBhbnl3YXkgdG8gZ2V0IGV4dHJhcyAqLworCQkJCS0tYmQtPndyaXRlQ29waWVzOworCQkJfQorCQl9IC8qIGZvcig7OykgKi8KKworCQkvKiBEZWNvbXByZXNzaW9uIG9mIHRoaXMgaW5wdXQgYmxvY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworCQliZC0+d3JpdGVDUkMgPSBDUkMgPSB+Q1JDOworCQliZC0+dG90YWxDUkMgPSAoKGJkLT50b3RhbENSQyA8PCAxKSB8IChiZC0+dG90YWxDUkMgPj4gMzEpKSBeIENSQzsKKworCQkvKiBJZiB0aGlzIGJsb2NrIGhhZCBhIENSQyBlcnJvciwgZm9yY2UgZmlsZSBsZXZlbCBDUkMgZXJyb3IgKi8KKwkJaWYgKENSQyAhPSBiZC0+aGVhZGVyQ1JDKSB7CisJCQliZC0+dG90YWxDUkMgPSBiZC0+aGVhZGVyQ1JDICsgMTsKKwkJCXJldHVybiBSRVRWQUxfTEFTVF9CTE9DSzsKKwkJfQorCX0KKworCS8qIFJlZmlsbCB0aGUgaW50ZXJtZWRpYXRlIGJ1ZmZlciBieSBIdWZmbWFuLWRlY29kaW5nIG5leHQgYmxvY2sgb2YgaW5wdXQgKi8KKwl7CisJCWludCByID0gZ2V0X25leHRfYmxvY2soYmQpOworCQlpZiAocikgeyAvKiBlcnJvci9lbmQgKi8KKwkJCWJkLT53cml0ZUNvdW50ID0gcjsKKwkJCXJldHVybiAociAhPSBSRVRWQUxfTEFTVF9CTE9DSykgPyByIDogbGVuOworCQl9CisJfQorCisJQ1JDID0gfjA7CisJcG9zID0gYmQtPndyaXRlUG9zOworCWN1cnJlbnQgPSBiZC0+d3JpdGVDdXJyZW50OworCWdvdG8gZGVjb2RlX25leHRfYnl0ZTsKKworIG91dGJ1Zl9mdWxsOgorCS8qIE91dHB1dCBidWZmZXIgaXMgZnVsbCwgc2F2ZSBjYWNoZWQgc3RhdGUgYW5kIHJldHVybiAqLworCWJkLT53cml0ZVBvcyA9IHBvczsKKwliZC0+d3JpdGVDdXJyZW50ID0gY3VycmVudDsKKwliZC0+d3JpdGVDUkMgPSBDUkM7CisKKwliZC0+d3JpdGVDb3BpZXMrKzsKKworCXJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlLCByZWFkIGZpbGUgaGVhZGVyLiAgSWYgaW5fZmQ9PS0xLCBpbmJ1ZiBtdXN0IGNvbnRhaW4KKyAgIGEgY29tcGxldGUgYnVuemlwIGZpbGUgKGxlbiBieXRlcyBsb25nKS4gIElmIGluX2ZkIT0tMSwgaW5idWYgYW5kIGxlbiBhcmUKKyAgIGlnbm9yZWQsIGFuZCBkYXRhIGlzIHJlYWQgZnJvbSBmaWxlIGhhbmRsZSBpbnRvIHRlbXBvcmFyeSBidWZmZXIuICovCisKKy8qIEJlY2F1c2UgYnVuemlwMiBpcyB1c2VkIGZvciBoZWxwIHRleHQgdW5wYWNraW5nLCBhbmQgYmVjYXVzZSBiYl9zaG93X3VzYWdlKCkKKyAgIHNob3VsZCB3b3JrIGZvciBOT0ZPUksgYXBwbGV0cyB0b28sIHdlIG11c3QgYmUgZXh0cmVtZWx5IGNhcmVmdWwgdG8gbm90IGxlYWsKKyAgIGFueSBhbGxvY2F0aW9ucyEgKi8KK2ludCBGQVNUX0ZVTkMgc3RhcnRfYnVuemlwKGJ1bnppcF9kYXRhICoqYmRwLCBpbnQgaW5fZmQsCisJCWNvbnN0IHZvaWQgKmluYnVmLCBpbnQgbGVuKQoreworCWJ1bnppcF9kYXRhICpiZDsKKwl1bnNpZ25lZCBpOworCWVudW0geworCQlCWmgwID0gKCdCJyA8PCAyNCkgKyAoJ1onIDw8IDE2KSArICgnaCcgPDwgOCkgKyAnMCcsCisJCWgwID0gKCdoJyA8PCA4KSArICcwJywKKwl9OworCisJLyogRmlndXJlIG91dCBob3cgbXVjaCBkYXRhIHRvIGFsbG9jYXRlICovCisJaSA9IHNpemVvZihidW56aXBfZGF0YSk7CisJaWYgKGluX2ZkICE9IC0xKSBpICs9IElPQlVGX1NJWkU7CisKKwkvKiBBbGxvY2F0ZSBidW56aXBfZGF0YS4gIE1vc3QgZmllbGRzIGluaXRpYWxpemUgdG8gemVyby4gKi8KKwliZCA9ICpiZHAgPSB4emFsbG9jKGkpOworCisJLyogU2V0dXAgaW5wdXQgYnVmZmVyICovCisJYmQtPmluX2ZkID0gaW5fZmQ7CisJaWYgKC0xID09IGluX2ZkKSB7CisJCS8qIGluIHRoaXMgY2FzZSwgYmQtPmluYnVmIGlzIHJlYWQtb25seSAqLworCQliZC0+aW5idWYgPSAodm9pZCopaW5idWY7IC8qIGNhc3QgYXdheSBjb25zdC1uZXNzICovCisJfSBlbHNlIHsKKwkJYmQtPmluYnVmID0gKHVpbnQ4X3QqKShiZCArIDEpOworCQltZW1jcHkoYmQtPmluYnVmLCBpbmJ1ZiwgbGVuKTsKKwl9CisJYmQtPmluYnVmQ291bnQgPSBsZW47CisKKwkvKiBJbml0IHRoZSBDUkMzMiB0YWJsZSAoYmlnIGVuZGlhbikgKi8KKwljcmMzMl9maWxsdGFibGUoYmQtPmNyYzMyVGFibGUsIDEpOworCisJLyogU2V0dXAgZm9yIEkvTyBlcnJvciBoYW5kbGluZyB2aWEgbG9uZ2ptcCAqLworCWkgPSBzZXRqbXAoYmQtPmptcGJ1Zik7CisJaWYgKGkpIHJldHVybiBpOworCisJLyogRW5zdXJlIHRoYXQgZmlsZSBzdGFydHMgd2l0aCAiQlpoWycxJy0nOSddLiIgKi8KKwkvKiBVcGRhdGU6IG5vdyBjYWxsZXIgdmVyaWZpZXMgMXN0IHR3byBieXRlcywgbWFrZXMgLmd6Ly5iejIKKwkgKiBpbnRlZ3JhdGlvbiBlYXNpZXIgKi8KKwkvKiB3YXM6ICovCisJLyogaSA9IGdldF9iaXRzKGJkLCAzMik7ICovCisJLyogaWYgKCh1bnNpZ25lZCkoaSAtIEJaaDAgLSAxKSA+PSA5KSByZXR1cm4gUkVUVkFMX05PVF9CWklQX0RBVEE7ICovCisJaSA9IGdldF9iaXRzKGJkLCAxNik7CisJaWYgKCh1bnNpZ25lZCkoaSAtIGgwIC0gMSkgPj0gOSkgcmV0dXJuIFJFVFZBTF9OT1RfQlpJUF9EQVRBOworCisJLyogRm91cnRoIGJ5dGUgKGFzY2lpICcxJy0nOScpIGluZGljYXRlcyBibG9jayBzaXplIGluIHVuaXRzIG9mIDEwMGsgb2YKKwkgICB1bmNvbXByZXNzZWQgZGF0YS4gIEFsbG9jYXRlIGludGVybWVkaWF0ZSBidWZmZXIgZm9yIGJsb2NrLiAqLworCS8qIGJkLT5kYnVmU2l6ZSA9IDEwMDAwMCAqIChpIC0gQlpoMCk7ICovCisJYmQtPmRidWZTaXplID0gMTAwMDAwICogKGkgLSBoMCk7CisKKwkvKiBDYW5ub3QgdXNlIHhtYWxsb2MgLSBtYXkgbGVhayBiZCBpbiBOT0ZPUksgY2FzZSEgKi8KKwliZC0+ZGJ1ZiA9IG1hbGxvY19vcl93YXJuKGJkLT5kYnVmU2l6ZSAqIHNpemVvZihiZC0+ZGJ1ZlswXSkpOworCWlmICghYmQtPmRidWYpIHsKKwkJZnJlZShiZCk7CisJCXhmdW5jX2RpZSgpOworCX0KKwlyZXR1cm4gUkVUVkFMX09LOworfQorCit2b2lkIEZBU1RfRlVOQyBkZWFsbG9jX2J1bnppcChidW56aXBfZGF0YSAqYmQpCit7CisJZnJlZShiZC0+ZGJ1Zik7CisJZnJlZShiZCk7Cit9CisKKworLyogRGVjb21wcmVzcyBzcmNfZmQgdG8gZHN0X2ZkLiAgU3RvcHMgYXQgZW5kIG9mIGJ6aXAgZGF0YSwgbm90IGVuZCBvZiBmaWxlLiAqLworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMKK3VucGFja19iejJfc3RyZWFtKGludCBzcmNfZmQsIGludCBkc3RfZmQpCit7CisJSUZfREVTS1RPUChsb25nIGxvbmcgdG90YWxfd3JpdHRlbiA9IDA7KQorCWJ1bnppcF9kYXRhICpiZDsKKwljaGFyICpvdXRidWY7CisJaW50IGk7CisJdW5zaWduZWQgbGVuOworCisJb3V0YnVmID0geG1hbGxvYyhJT0JVRl9TSVpFKTsKKwlsZW4gPSAwOworCXdoaWxlICgxKSB7IC8qICJQcm9jZXNzIG9uZSBCWi4uLiBzdHJlYW0iIGxvb3AgKi8KKworCQlpID0gc3RhcnRfYnVuemlwKCZiZCwgc3JjX2ZkLCBvdXRidWYgKyAyLCBsZW4pOworCisJCWlmIChpID09IDApIHsKKwkJCXdoaWxlICgxKSB7IC8qICJQcm9kdWNlIHNvbWUgb3V0cHV0IGJ5dGVzIiBsb29wICovCisJCQkJaSA9IHJlYWRfYnVuemlwKGJkLCBvdXRidWYsIElPQlVGX1NJWkUpOworCQkJCWlmIChpIDwgMCkgLyogZXJyb3I/ICovCisJCQkJCWJyZWFrOworCQkJCWkgPSBJT0JVRl9TSVpFIC0gaTsgLyogbnVtYmVyIG9mIGJ5dGVzIHByb2R1Y2VkICovCisJCQkJaWYgKGkgPT0gMCkgLyogRU9GPyAqLworCQkJCQlicmVhazsKKwkJCQlpZiAoaSAhPSBmdWxsX3dyaXRlKGRzdF9mZCwgb3V0YnVmLCBpKSkgeworCQkJCQliYl9lcnJvcl9tc2coInNob3J0IHdyaXRlIik7CisJCQkJCWkgPSBSRVRWQUxfU0hPUlRfV1JJVEU7CisJCQkJCWdvdG8gcmVsZWFzZV9tZW07CisJCQkJfQorCQkJCUlGX0RFU0tUT1AodG90YWxfd3JpdHRlbiArPSBpOykKKwkJCX0KKwkJfQorCisJCWlmIChpICE9IFJFVFZBTF9MQVNUX0JMT0NLKSB7CisJCQliYl9lcnJvcl9tc2coImJ1bnppcCBlcnJvciAlZCIsIGkpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJkLT5oZWFkZXJDUkMgIT0gYmQtPnRvdGFsQ1JDKSB7CisJCQliYl9lcnJvcl9tc2coIkNSQyBlcnJvciIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTdWNjZXNzZnVsbHkgdW5wYWNrZWQgb25lIEJaIHN0cmVhbSAqLworCQlpID0gUkVUVkFMX09LOworCisJCS8qIERvIHdlIGhhdmUgIkJaLi4uIiBhZnRlciBsYXN0IHByb2Nlc3NlZCBieXRlPworCQkgKiBwYnppcDIgKHBhcmFsbGVsaXplZCBiemlwMikgcHJvZHVjZXMgc3VjaCBmaWxlcy4KKwkJICovCisJCWxlbiA9IGJkLT5pbmJ1ZkNvdW50IC0gYmQtPmluYnVmUG9zOworCQltZW1jcHkob3V0YnVmLCAmYmQtPmluYnVmW2JkLT5pbmJ1ZlBvc10sIGxlbik7CisJCWlmIChsZW4gPCAyKSB7CisJCQlpZiAoc2FmZV9yZWFkKHNyY19mZCwgb3V0YnVmICsgbGVuLCAyIC0gbGVuKSAhPSAyIC0gbGVuKQorCQkJCWJyZWFrOworCQkJbGVuID0gMjsKKwkJfQorCQlpZiAoKih1aW50MTZfdCopb3V0YnVmICE9IEJaSVAyX01BR0lDKSAvKiAiQloiPyAqLworCQkJYnJlYWs7CisJCWRlYWxsb2NfYnVuemlwKGJkKTsKKwkJbGVuIC09IDI7CisJfQorCisgcmVsZWFzZV9tZW06CisJZGVhbGxvY19idW56aXAoYmQpOworCWZyZWUob3V0YnVmKTsKKworCXJldHVybiBpID8gaSA6IElGX0RFU0tUT1AodG90YWxfd3JpdHRlbikgKyAwOworfQorCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQwordW5wYWNrX2J6Ml9zdHJlYW1fcHJpbWUoaW50IHNyY19mZCwgaW50IGRzdF9mZCkKK3sKKwl1aW50MTZfdCBtYWdpYzI7CisJeHJlYWQoc3JjX2ZkLCAmbWFnaWMyLCAyKTsKKwlpZiAobWFnaWMyICE9IEJaSVAyX01BR0lDKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIG1hZ2ljIik7CisJfQorCXJldHVybiB1bnBhY2tfYnoyX3N0cmVhbShzcmNfZmQsIGRzdF9mZCk7Cit9CisKKyNpZmRlZiBURVNUSU5HCisKK3N0YXRpYyBjaGFyICpjb25zdCBidW56aXBfZXJyb3JzW10gPSB7CisJTlVMTCwgIkJhZCBmaWxlIGNoZWNrc3VtIiwgIk5vdCBiemlwIGRhdGEiLAorCSJVbmV4cGVjdGVkIGlucHV0IEVPRiIsICJVbmV4cGVjdGVkIG91dHB1dCBFT0YiLCAiRGF0YSBlcnJvciIsCisJIk91dCBvZiBtZW1vcnkiLCAiT2Jzb2xldGUgKHByZSAwLjkuNSkgYnppcCBmb3JtYXQgbm90IHN1cHBvcnRlZCIKK307CisKKy8qIER1bWIgbGl0dGxlIHRlc3QgdGhpbmcsIGRlY29tcHJlc3Mgc3RkaW4gdG8gc3Rkb3V0ICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY2hhciBjOworCisJaW50IGkgPSB1bnBhY2tfYnoyX3N0cmVhbV9wcmltZSgwLCAxKTsKKwlpZiAoaSA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1bnppcF9lcnJvcnNbLWldKTsKKwllbHNlIGlmIChyZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpKQorCQlmcHJpbnRmKHN0ZGVyciwgIlRyYWlsaW5nIGdhcmJhZ2UgaWdub3JlZFxuIik7CisJcmV0dXJuIC1pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5jb21wcmVzcy5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VuY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA2MWEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VuY29tcHJlc3MuYwpAQCAtMCwwICsxLDMxMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiB1bmNvbXByZXNzIGZvciBidXN5Ym94IC0tIChjKSAyMDAyIFJvYmVydCBHcmllYmwKKyAqCisgKiBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgY29tcHJlc3M0Mi5jIHNvdXJjZQorICogKHNlZSBkaXNjbGFpbWVyIGJlbG93KQorICovCisKKy8qIChOKWNvbXByZXNzNDIuYyAtIEZpbGUgY29tcHJlc3Npb24gYWxhIElFRUUgQ29tcHV0ZXIsIE1hciAxOTkyLgorICoKKyAqIEF1dGhvcnM6CisgKiAgIFNwZW5jZXIgVy4gVGhvbWFzICAgKGRlY3ZheCFoYXJwbyF1dGFoLWNzIXV0YWgtZ3IhdGhvbWFzKQorICogICBKaW0gTWNLaWUgICAgICAgICAgIChkZWN2YXghbWN2YXghamltKQorICogICBTdGV2ZSBEYXZpZXMgICAgICAgIChkZWN2YXghdmF4MTM1IXBldHNkIXBlb3JhIXNyZCkKKyAqICAgS2VuIFR1cmtvd3NraSAgICAgICAoZGVjdmF4IWRlY3dybCF0dXJ0bGV2YXgha2VuKQorICogICBKYW1lcyBBLiBXb29kcyAgICAgIChkZWN2YXghaWhucDQhYW1lcyFqYXcpCisgKiAgIEpvZSBPcm9zdCAgICAgICAgICAgKGRlY3ZheCF2YXgxMzUhcGV0c2Qham9lKQorICogICBEYXZlIE1hY2sgICAgICAgICAgIChjc3VAYWxlbWJpYy5hY3MuY29tKQorICogICBQZXRlciBKYW5uZXNlbiwgTmV0d29yayBDb21tdW5pY2F0aW9uIFN5c3RlbXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAocGV0ZXJAbmNzLm5sKQorICoKKyAqIG1hcmNAc3VzZS5kZSA6IGEgc21hbGwgc2VjdXJpdHkgZml4IGZvciBhIGJ1ZmZlciBvdmVyZmxvdworICoKKyAqIFsuLi4gSGlzdG9yeSBzbmlwcGVkIC4uLl0KKyAqCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisKKy8qIERlZmF1bHQgaW5wdXQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgSUJVRlNJWiAyMDQ4CisKKy8qIERlZmF1bHQgb3V0cHV0IGJ1ZmZlciBzaXplICovCisjZGVmaW5lIE9CVUZTSVogMjA0OAorCisvKiBEZWZpbmVzIGZvciB0aGlyZCBieXRlIG9mIGhlYWRlciAqLworI2RlZmluZSBCSVRfTUFTSyAgICAgICAgMHgxZiAgICAvKiBNYXNrIGZvciAnbnVtYmVyIG9mIGNvbXByZXNzc2lvbiBiaXRzJyAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXNrcyAweDIwIGFuZCAweDQwIGFyZSBmcmVlLiAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJIHRoaW5rIDB4MjAgc2hvdWxkIG1lYW4gdGhhdCB0aGVyZSBpcyAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhIGZvdXJ0aCBoZWFkZXIgYnl0ZSAoZm9yIGV4cGFuc2lvbikuICAgICAgICAqLworI2RlZmluZSBCTE9DS19NT0RFICAgICAgMHg4MCAgICAvKiBCbG9jayBjb21wcmVzc2lvbiBpZiB0YWJsZSBpcyBmdWxsIGFuZCAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiByYXRlIGlzIGRyb3BwaW5nIGZsdXNoIHRhYmxlcyAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgbmV4dCB0d28gY29kZXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGxpZ2h0bHksIGFzIHRoZXkgbXVzdCBub3QgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaWUgd2l0aGluIHRoZSBjb250aWd1b3VzIGdlbmVyYWwgY29kZSBzcGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGSVJTVCAgIDI1NyAgICAgLyogZmlyc3QgZnJlZSBlbnRyeSAqLworI2RlZmluZSBDTEVBUiAgIDI1NiAgICAgLyogdGFibGUgY2xlYXIgb3V0cHV0IGNvZGUgKi8KKworI2RlZmluZSBJTklUX0JJVFMgOSAgICAgLyogaW5pdGlhbCBudW1iZXIgb2YgYml0cy9jb2RlICovCisKKworLyogbWFjaGluZSB2YXJpYW50cyB3aGljaCByZXF1aXJlIGNjIC1EbWFjaGluZTogIHBkcDExLCB6ODAwMCwgRE9TICovCisjZGVmaW5lIEhCSVRTICAgICAgMTcgICAvKiA1MCUgb2NjdXBhbmN5ICovCisjZGVmaW5lIEhTSVpFICAgICAgKDE8PEhCSVRTKQorI2RlZmluZSBITUFTSyAgICAgIChIU0laRS0xKSAgICAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgSFBSSU1FICAgICA5OTQxICAgICAgICAgLyogdW51c2VkICovCisjZGVmaW5lIEJJVFMgICAgICAgMTYKKyNkZWZpbmUgQklUU19TVFIgICAiMTYiCisjdW5kZWYgIE1BWFNFR182NEsgICAgICAgICAgICAgIC8qIHVudXNlZCAqLworI2RlZmluZSBNQVhDT0RFKG4pICgxTCA8PCAobikpCisKKyNkZWZpbmUgaHRhYm9mKGkpICAgICAgICAgICAgICAgaHRhYltpXQorI2RlZmluZSBjb2RldGFib2YoaSkgICAgICAgICAgICBjb2RldGFiW2ldCisjZGVmaW5lIHRhYl9wcmVmaXhvZihpKSAgICAgICAgIGNvZGV0YWJvZihpKQorI2RlZmluZSB0YWJfc3VmZml4b2YoaSkgICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikoaHRhYikpW2ldCisjZGVmaW5lIGRlX3N0YWNrICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciAqKSYoaHRhYltIU0laRS0xXSkpCisjZGVmaW5lIGNsZWFyX3RhYl9wcmVmaXhvZigpICAgIG1lbXNldChjb2RldGFiLCAwLCAyNTYpCisKKy8qCisgKiBEZWNvbXByZXNzIHN0ZGluIHRvIHN0ZG91dC4gIFRoaXMgcm91dGluZSBhZGFwdHMgdG8gdGhlIGNvZGVzIGluIHRoZQorICogZmlsZSBidWlsZGluZyB0aGUgInN0cmluZyIgdGFibGUgb24tdGhlLWZseTsgcmVxdWlyaW5nIG5vIHRhYmxlIHRvCisgKiBiZSBzdG9yZWQgaW4gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAqLworCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQwordW5wYWNrX1pfc3RyZWFtKGludCBmZF9pbiwgaW50IGZkX291dCkKK3sKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZyB0b3RhbF93cml0dGVuID0gMDspCisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCByZXR2YWwgPSAtMTsKKwl1bnNpZ25lZCBjaGFyICpzdGFja3A7CisJbG9uZyBjb2RlOworCWludCBmaW5jaGFyOworCWxvbmcgb2xkY29kZTsKKwlsb25nIGluY29kZTsKKwlpbnQgaW5iaXRzOworCWludCBwb3NiaXRzOworCWludCBvdXRwb3M7CisJaW50IGluc2l6ZTsKKwlpbnQgYml0bWFzazsKKwlsb25nIGZyZWVfZW50OworCWxvbmcgbWF4Y29kZTsKKwlsb25nIG1heG1heGNvZGU7CisJaW50IG5fYml0czsKKwlpbnQgcnNpemUgPSAwOworCXVuc2lnbmVkIGNoYXIgKmluYnVmOyAvKiB3ZXJlIGVhdGluZyBpbnNhbmUgYW1vdW50cyBvZiBzdGFjayAtICovCisJdW5zaWduZWQgY2hhciAqb3V0YnVmOyAvKiBiYWQgZm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cyAqLworCXVuc2lnbmVkIGNoYXIgKmh0YWI7CisJdW5zaWduZWQgc2hvcnQgKmNvZGV0YWI7CisKKwkvKiBIbW0sIHRoZXNlIHdlcmUgc3RhdGljcyAtIHdoeT8hICovCisJLyogdXNlciBzZXR0YWJsZSBtYXggIyBiaXRzL2NvZGUgKi8KKwlpbnQgbWF4Yml0czsgLyogPSBCSVRTOyAqLworCS8qIGJsb2NrIGNvbXByZXNzIG1vZGUgLUMgY29tcGF0aWJsZSB3aXRoIDIuMCAqLworCWludCBibG9ja19tb2RlOyAvKiA9IEJMT0NLX01PREU7ICovCisKKwlpbmJ1ZiA9IHh6YWxsb2MoSUJVRlNJWiArIDY0KTsKKwlvdXRidWYgPSB4emFsbG9jKE9CVUZTSVogKyAyMDQ4KTsKKwlodGFiID0geHphbGxvYyhIU0laRSk7ICAvKiB3c24ndCB6ZXJvZWQgb3V0IGJlZm9yZSwgbWF5YmUgY2FuIHhtYWxsb2M/ICovCisJY29kZXRhYiA9IHh6YWxsb2MoSFNJWkUgKiBzaXplb2YoY29kZXRhYlswXSkpOworCisJaW5zaXplID0gMDsKKworCS8qIHhyZWFkIGlzbid0IGdvb2QgaGVyZSwgd2UgaGF2ZSB0byByZXR1cm4gLSBjYWxsZXIgbWF5IHdhbnQKKwkgKiB0byBkbyBzb21lIGNsZWFudXAgKGUuZy4gZGVsZXRlIGluY29tcGxldGUgdW5wYWNrZWQgZmlsZSBldGMpICovCisJaWYgKGZ1bGxfcmVhZChmZF9pbiwgaW5idWYsIDEpICE9IDEpIHsKKwkJYmJfZXJyb3JfbXNnKCJzaG9ydCByZWFkIik7CisJCWdvdG8gZXJyOworCX0KKworCW1heGJpdHMgPSBpbmJ1ZlswXSAmIEJJVF9NQVNLOworCWJsb2NrX21vZGUgPSBpbmJ1ZlswXSAmIEJMT0NLX01PREU7CisJbWF4bWF4Y29kZSA9IE1BWENPREUobWF4Yml0cyk7CisKKwlpZiAobWF4Yml0cyA+IEJJVFMpIHsKKwkJYmJfZXJyb3JfbXNnKCJjb21wcmVzc2VkIHdpdGggJWQgYml0cywgY2FuIG9ubHkgaGFuZGxlICIKKwkJCQlCSVRTX1NUUiIgYml0cyIsIG1heGJpdHMpOworCQlnb3RvIGVycjsKKwl9CisKKwluX2JpdHMgPSBJTklUX0JJVFM7CisJbWF4Y29kZSA9IE1BWENPREUoSU5JVF9CSVRTKSAtIDE7CisJYml0bWFzayA9ICgxIDw8IElOSVRfQklUUykgLSAxOworCW9sZGNvZGUgPSAtMTsKKwlmaW5jaGFyID0gMDsKKwlvdXRwb3MgPSAwOworCXBvc2JpdHMgPSAwIDw8IDM7CisKKwlmcmVlX2VudCA9ICgoYmxvY2tfbW9kZSkgPyBGSVJTVCA6IDI1Nik7CisKKwkvKiBBcyBhYm92ZSwgaW5pdGlhbGl6ZSB0aGUgZmlyc3QgMjU2IGVudHJpZXMgaW4gdGhlIHRhYmxlLiAqLworCS8qY2xlYXJfdGFiX3ByZWZpeG9mKCk7IC0gZG9uZSBieSB4emFsbG9jICovCisKKwlmb3IgKGNvZGUgPSAyNTU7IGNvZGUgPj0gMDsgLS1jb2RlKSB7CisJCXRhYl9zdWZmaXhvZihjb2RlKSA9ICh1bnNpZ25lZCBjaGFyKSBjb2RlOworCX0KKworCWRvIHsKKyByZXNldGJ1ZjoKKwkJeworCQkJaW50IGk7CisJCQlpbnQgZTsKKwkJCWludCBvOworCisJCQlvID0gcG9zYml0cyA+PiAzOworCQkJZSA9IGluc2l6ZSAtIG87CisKKwkJCWZvciAoaSA9IDA7IGkgPCBlOyArK2kpCisJCQkJaW5idWZbaV0gPSBpbmJ1ZltpICsgb107CisKKwkJCWluc2l6ZSA9IGU7CisJCQlwb3NiaXRzID0gMDsKKwkJfQorCisJCWlmIChpbnNpemUgPCAoaW50KSAoSUJVRlNJWiArIDY0KSAtIElCVUZTSVopIHsKKwkJCXJzaXplID0gc2FmZV9yZWFkKGZkX2luLCBpbmJ1ZiArIGluc2l6ZSwgSUJVRlNJWik7CisJCQlpZiAocnNpemUgPCAwKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCWluc2l6ZSArPSByc2l6ZTsKKwkJfQorCisJCWluYml0cyA9ICgocnNpemUgPiAwKSA/IChpbnNpemUgLSBpbnNpemUgJSBuX2JpdHMpIDw8IDMgOgorCQkJCSAgKGluc2l6ZSA8PCAzKSAtIChuX2JpdHMgLSAxKSk7CisKKwkJd2hpbGUgKGluYml0cyA+IHBvc2JpdHMpIHsKKwkJCWlmIChmcmVlX2VudCA+IG1heGNvZGUpIHsKKwkJCQlwb3NiaXRzID0KKwkJCQkJKChwb3NiaXRzIC0gMSkgKworCQkJCQkgKChuX2JpdHMgPDwgMykgLQorCQkJCQkgIChwb3NiaXRzIC0gMSArIChuX2JpdHMgPDwgMykpICUgKG5fYml0cyA8PCAzKSkpOworCQkJCSsrbl9iaXRzOworCQkJCWlmIChuX2JpdHMgPT0gbWF4Yml0cykgeworCQkJCQltYXhjb2RlID0gbWF4bWF4Y29kZTsKKwkJCQl9IGVsc2UgeworCQkJCQltYXhjb2RlID0gTUFYQ09ERShuX2JpdHMpIC0gMTsKKwkJCQl9CisJCQkJYml0bWFzayA9ICgxIDw8IG5fYml0cykgLSAxOworCQkJCWdvdG8gcmVzZXRidWY7CisJCQl9CisJCQl7CisJCQkJdW5zaWduZWQgY2hhciAqcCA9ICZpbmJ1Zltwb3NiaXRzID4+IDNdOworCisJCQkJY29kZSA9ICgoKChsb25nKSAocFswXSkpIHwgKChsb25nKSAocFsxXSkgPDwgOCkgfAorCQkJCSAgICAgICAgICgobG9uZykgKHBbMl0pIDw8IDE2KSkgPj4gKHBvc2JpdHMgJiAweDcpKSAmIGJpdG1hc2s7CisJCQl9CisJCQlwb3NiaXRzICs9IG5fYml0czsKKworCisJCQlpZiAob2xkY29kZSA9PSAtMSkgeworCQkJCWlmIChjb2RlID49IDI1NikKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHRlZCBkYXRhIik7IC8qICVsZCIsIGNvZGUpOyAqLworCQkJCW9sZGNvZGUgPSBjb2RlOworCQkJCWZpbmNoYXIgPSAoaW50KSBvbGRjb2RlOworCQkJCW91dGJ1ZltvdXRwb3MrK10gPSAodW5zaWduZWQgY2hhcikgZmluY2hhcjsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGNvZGUgPT0gQ0xFQVIgJiYgYmxvY2tfbW9kZSkgeworCQkJCWNsZWFyX3RhYl9wcmVmaXhvZigpOworCQkJCWZyZWVfZW50ID0gRklSU1QgLSAxOworCQkJCXBvc2JpdHMgPQorCQkJCQkoKHBvc2JpdHMgLSAxKSArCisJCQkJCSAoKG5fYml0cyA8PCAzKSAtCisJCQkJCSAgKHBvc2JpdHMgLSAxICsgKG5fYml0cyA8PCAzKSkgJSAobl9iaXRzIDw8IDMpKSk7CisJCQkJbl9iaXRzID0gSU5JVF9CSVRTOworCQkJCW1heGNvZGUgPSBNQVhDT0RFKElOSVRfQklUUykgLSAxOworCQkJCWJpdG1hc2sgPSAoMSA8PCBJTklUX0JJVFMpIC0gMTsKKwkJCQlnb3RvIHJlc2V0YnVmOworCQkJfQorCisJCQlpbmNvZGUgPSBjb2RlOworCQkJc3RhY2twID0gZGVfc3RhY2s7CisKKwkJCS8qIFNwZWNpYWwgY2FzZSBmb3IgS3dLd0sgc3RyaW5nLiAqLworCQkJaWYgKGNvZGUgPj0gZnJlZV9lbnQpIHsKKwkJCQlpZiAoY29kZSA+IGZyZWVfZW50KSB7CisJCQkJCXVuc2lnbmVkIGNoYXIgKnA7CisKKwkJCQkJcG9zYml0cyAtPSBuX2JpdHM7CisJCQkJCXAgPSAmaW5idWZbcG9zYml0cyA+PiAzXTsKKworCQkJCQliYl9lcnJvcl9tc2cKKwkJCQkJCSgiaW5zaXplOiVkIHBvc2JpdHM6JWQgaW5idWY6JTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICglZCkiLAorCQkJCQkJIGluc2l6ZSwgcG9zYml0cywgcFstMV0sIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sCisJCQkJCQkgKHBvc2JpdHMgJiAwNykpOworCQkJCQliYl9lcnJvcl9tc2coImNvcnJ1cHRlZCBkYXRhIik7CisJCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJCSotLXN0YWNrcCA9ICh1bnNpZ25lZCBjaGFyKSBmaW5jaGFyOworCQkJCWNvZGUgPSBvbGRjb2RlOworCQkJfQorCisJCQkvKiBHZW5lcmF0ZSBvdXRwdXQgY2hhcmFjdGVycyBpbiByZXZlcnNlIG9yZGVyICovCisJCQl3aGlsZSAoKGxvbmcpIGNvZGUgPj0gKGxvbmcpIDI1NikgeworCQkJCWlmIChzdGFja3AgPD0gJmh0YWJvZigwKSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHRlZCBkYXRhIik7CisJCQkJKi0tc3RhY2twID0gdGFiX3N1ZmZpeG9mKGNvZGUpOworCQkJCWNvZGUgPSB0YWJfcHJlZml4b2YoY29kZSk7CisJCQl9CisKKwkJCWZpbmNoYXIgPSB0YWJfc3VmZml4b2YoY29kZSk7CisJCQkqLS1zdGFja3AgPSAodW5zaWduZWQgY2hhcikgZmluY2hhcjsKKworCQkJLyogQW5kIHB1dCB0aGVtIG91dCBpbiBmb3J3YXJkIG9yZGVyICovCisJCQl7CisJCQkJaW50IGk7CisKKwkJCQlpID0gZGVfc3RhY2sgLSBzdGFja3A7CisJCQkJaWYgKG91dHBvcyArIGkgPj0gT0JVRlNJWikgeworCQkJCQlkbyB7CisJCQkJCQlpZiAoaSA+IE9CVUZTSVogLSBvdXRwb3MpIHsKKwkJCQkJCQlpID0gT0JVRlNJWiAtIG91dHBvczsKKwkJCQkJCX0KKworCQkJCQkJaWYgKGkgPiAwKSB7CisJCQkJCQkJbWVtY3B5KG91dGJ1ZiArIG91dHBvcywgc3RhY2twLCBpKTsKKwkJCQkJCQlvdXRwb3MgKz0gaTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKG91dHBvcyA+PSBPQlVGU0laKSB7CisJCQkJCQkJeHdyaXRlKGZkX291dCwgb3V0YnVmLCBvdXRwb3MpOworCQkJCQkJCUlGX0RFU0tUT1AodG90YWxfd3JpdHRlbiArPSBvdXRwb3M7KQorCQkJCQkJCW91dHBvcyA9IDA7CisJCQkJCQl9CisJCQkJCQlzdGFja3AgKz0gaTsKKwkJCQkJCWkgPSBkZV9zdGFjayAtIHN0YWNrcDsKKwkJCQkJfSB3aGlsZSAoaSA+IDApOworCQkJCX0gZWxzZSB7CisJCQkJCW1lbWNweShvdXRidWYgKyBvdXRwb3MsIHN0YWNrcCwgaSk7CisJCQkJCW91dHBvcyArPSBpOworCQkJCX0KKwkJCX0KKworCQkJLyogR2VuZXJhdGUgdGhlIG5ldyBlbnRyeS4gKi8KKwkJCWNvZGUgPSBmcmVlX2VudDsKKwkJCWlmIChjb2RlIDwgbWF4bWF4Y29kZSkgeworCQkJCXRhYl9wcmVmaXhvZihjb2RlKSA9ICh1bnNpZ25lZCBzaG9ydCkgb2xkY29kZTsKKwkJCQl0YWJfc3VmZml4b2YoY29kZSkgPSAodW5zaWduZWQgY2hhcikgZmluY2hhcjsKKwkJCQlmcmVlX2VudCA9IGNvZGUgKyAxOworCQkJfQorCisJCQkvKiBSZW1lbWJlciBwcmV2aW91cyBjb2RlLiAgKi8KKwkJCW9sZGNvZGUgPSBpbmNvZGU7CisJCX0KKworCX0gd2hpbGUgKHJzaXplID4gMCk7CisKKwlpZiAob3V0cG9zID4gMCkgeworCQl4d3JpdGUoZmRfb3V0LCBvdXRidWYsIG91dHBvcyk7CisJCUlGX0RFU0tUT1AodG90YWxfd3JpdHRlbiArPSBvdXRwb3M7KQorCX0KKworCXJldHZhbCA9IElGX0RFU0tUT1AodG90YWxfd3JpdHRlbikgKyAwOworIGVycjoKKwlmcmVlKGluYnVmKTsKKwlmcmVlKG91dGJ1Zik7CisJZnJlZShodGFiKTsKKwlmcmVlKGNvZGV0YWIpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5sem1hLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5sem1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0NzE0MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bmx6bWEuYwpAQCAtMCwwICsxLDQ2NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU21hbGwgbHptYSBkZWZsYXRlIGltcGxlbWVudGF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogQmFzZWQgb24gTHptYURlY29kZS5jIGZyb20gdGhlIExaTUEgU0RLIDQuMjIgKGh0dHA6Ly93d3cuNy16aXAub3JnLykKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1ICBJZ29yIFBhdmxvdgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xaTUFfRkFTVAorIyAgZGVmaW5lIHNwZWVkX2lubGluZSBBTFdBWVNfSU5MSU5FCisjICBkZWZpbmUgc2l6ZV9pbmxpbmUKKyNlbHNlCisjICBkZWZpbmUgc3BlZWRfaW5saW5lCisjICBkZWZpbmUgc2l6ZV9pbmxpbmUgQUxXQVlTX0lOTElORQorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBmZDsKKwl1aW50OF90ICpwdHI7CisKKy8qIFdhcyBrZWVwaW5nIHJjIG9uIHN0YWNrIGluIHVubHptYSBhbmQgc2VwYXJhdGVseSBhbGxvY2F0aW5nIGJ1ZmZlciwKKyAqIGJ1dCB3aXRoICJidWZmZXIgJ2F0dGFjaGVkIHRvJyBhbGxvY2F0ZWQgcmMiIGNvZGUgaXMgc21hbGxlcjogKi8KKwkvKiB1aW50OF90ICpidWZmZXI7ICovCisjZGVmaW5lIFJDX0JVRkZFUiAoKHVpbnQ4X3QqKShyYysxKSkKKworCXVpbnQ4X3QgKmJ1ZmZlcl9lbmQ7CisKKy8qIEhhZCBwcm92aXNpb25zIGZvciB2YXJpYWJsZSBidWZmZXIsIGJ1dCB3ZSBkb24ndCBuZWVkIGl0IGhlcmUgKi8KKwkvKiBpbnQgYnVmZmVyX3NpemU7ICovCisjZGVmaW5lIFJDX0JVRkZFUl9TSVpFIDB4MTAwMDAKKworCXVpbnQzMl90IGNvZGU7CisJdWludDMyX3QgcmFuZ2U7CisJdWludDMyX3QgYm91bmQ7Cit9IHJjX3Q7CisKKyNkZWZpbmUgUkNfVE9QX0JJVFMgMjQKKyNkZWZpbmUgUkNfTU9WRV9CSVRTIDUKKyNkZWZpbmUgUkNfTU9ERUxfVE9UQUxfQklUUyAxMQorCisKKy8qIENhbGxlZCB0d2ljZTogb25jZSBhdCBzdGFydHVwIChMWk1BX0ZBU1Qgb25seSkgYW5kIG9uY2UgaW4gcmNfbm9ybWFsaXplKCkgKi8KK3N0YXRpYyBzaXplX2lubGluZSB2b2lkIHJjX3JlYWQocmNfdCAqcmMpCit7CisJaW50IGJ1ZmZlcl9zaXplID0gc2FmZV9yZWFkKHJjLT5mZCwgUkNfQlVGRkVSLCBSQ19CVUZGRVJfU0laRSk7CisvL1RPRE86IHJldHVybiAtMSBpbnN0ZWFkCisvL1RoaXMgd2lsbCBtYWtlIHVubHptYSBkZWxldGUgYnJva2VuIHVucGFja2VkIGZpbGUgb24gdW5wYWNrIGVycm9ycworCWlmIChidWZmZXJfc2l6ZSA8PSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5leHBlY3RlZCBFT0YiKTsKKwlyYy0+cHRyID0gUkNfQlVGRkVSOworCXJjLT5idWZmZXJfZW5kID0gUkNfQlVGRkVSICsgYnVmZmVyX3NpemU7Cit9CisKKy8qIENhbGxlZCB0d2ljZSwgYnV0IG9uZSBjYWxsc2l0ZSBpcyBpbiBzcGVlZF9pbmxpbmUnZCByY19pc19iaXRfMSgpICovCitzdGF0aWMgdm9pZCByY19kb19ub3JtYWxpemUocmNfdCAqcmMpCit7CisJaWYgKHJjLT5wdHIgPj0gcmMtPmJ1ZmZlcl9lbmQpCisJCXJjX3JlYWQocmMpOworCXJjLT5yYW5nZSA8PD0gODsKKwlyYy0+Y29kZSA9IChyYy0+Y29kZSA8PCA4KSB8ICpyYy0+cHRyKys7Cit9CisKKy8qIENhbGxlZCBvbmNlICovCitzdGF0aWMgQUxXQVlTX0lOTElORSByY190KiByY19pbml0KGludCBmZCkgLyosIGludCBidWZmZXJfc2l6ZSkgKi8KK3sKKwlpbnQgaTsKKwlyY190ICpyYzsKKworCXJjID0geHphbGxvYyhzaXplb2YoKnJjKSArIFJDX0JVRkZFUl9TSVpFKTsKKworCXJjLT5mZCA9IGZkOworCS8qIHJjLT5wdHIgPSByYy0+YnVmZmVyX2VuZDsgKi8KKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MWk1BX0ZBU1QKKwkJaWYgKHJjLT5wdHIgPj0gcmMtPmJ1ZmZlcl9lbmQpCisJCQlyY19yZWFkKHJjKTsKKwkJcmMtPmNvZGUgPSAocmMtPmNvZGUgPDwgOCkgfCAqcmMtPnB0cisrOworI2Vsc2UKKwkJcmNfZG9fbm9ybWFsaXplKHJjKTsKKyNlbmRpZgorCX0KKwlyYy0+cmFuZ2UgPSAweEZGRkZGRkZGOworCXJldHVybiByYzsKK30KKworLyogQ2FsbGVkIG9uY2UgICovCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIHJjX2ZyZWUocmNfdCAqcmMpCit7CisJZnJlZShyYyk7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgcmNfbm9ybWFsaXplKHJjX3QgKnJjKQoreworCWlmIChyYy0+cmFuZ2UgPCAoMSA8PCBSQ19UT1BfQklUUykpIHsKKwkJcmNfZG9fbm9ybWFsaXplKHJjKTsKKwl9Cit9CisKKy8qIHJjX2lzX2JpdF8xIGlzIGNhbGxlZCA5IHRpbWVzICovCitzdGF0aWMgc3BlZWRfaW5saW5lIGludCByY19pc19iaXRfMShyY190ICpyYywgdWludDE2X3QgKnApCit7CisJcmNfbm9ybWFsaXplKHJjKTsKKwlyYy0+Ym91bmQgPSAqcCAqIChyYy0+cmFuZ2UgPj4gUkNfTU9ERUxfVE9UQUxfQklUUyk7CisJaWYgKHJjLT5jb2RlIDwgcmMtPmJvdW5kKSB7CisJCXJjLT5yYW5nZSA9IHJjLT5ib3VuZDsKKwkJKnAgKz0gKCgxIDw8IFJDX01PREVMX1RPVEFMX0JJVFMpIC0gKnApID4+IFJDX01PVkVfQklUUzsKKwkJcmV0dXJuIDA7CisJfQorCXJjLT5yYW5nZSAtPSByYy0+Ym91bmQ7CisJcmMtPmNvZGUgLT0gcmMtPmJvdW5kOworCSpwIC09ICpwID4+IFJDX01PVkVfQklUUzsKKwlyZXR1cm4gMTsKK30KKworLyogQ2FsbGVkIDQgdGltZXMgaW4gdW5sem1hIGxvb3AgKi8KK3N0YXRpYyBzcGVlZF9pbmxpbmUgaW50IHJjX2dldF9iaXQocmNfdCAqcmMsIHVpbnQxNl90ICpwLCBpbnQgKnN5bWJvbCkKK3sKKwlpbnQgcmV0ID0gcmNfaXNfYml0XzEocmMsIHApOworCSpzeW1ib2wgPSAqc3ltYm9sICogMiArIHJldDsKKwlyZXR1cm4gcmV0OworfQorCisvKiBDYWxsZWQgb25jZSAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IHJjX2RpcmVjdF9iaXQocmNfdCAqcmMpCit7CisJcmNfbm9ybWFsaXplKHJjKTsKKwlyYy0+cmFuZ2UgPj49IDE7CisJaWYgKHJjLT5jb2RlID49IHJjLT5yYW5nZSkgeworCQlyYy0+Y29kZSAtPSByYy0+cmFuZ2U7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHR3aWNlICovCitzdGF0aWMgc3BlZWRfaW5saW5lIHZvaWQKK3JjX2JpdF90cmVlX2RlY29kZShyY190ICpyYywgdWludDE2X3QgKnAsIGludCBudW1fbGV2ZWxzLCBpbnQgKnN5bWJvbCkKK3sKKwlpbnQgaSA9IG51bV9sZXZlbHM7CisKKwkqc3ltYm9sID0gMTsKKwl3aGlsZSAoaS0tKQorCQlyY19nZXRfYml0KHJjLCBwICsgKnN5bWJvbCwgc3ltYm9sKTsKKwkqc3ltYm9sIC09IDEgPDwgbnVtX2xldmVsczsKK30KKworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBwb3M7CisJdWludDMyX3QgZGljdF9zaXplOworCXVpbnQ2NF90IGRzdF9zaXplOworfSBQQUNLRUQgbHptYV9oZWFkZXJfdDsKKworCisvKiAjZGVmaW5lcyB3aWxsIGZvcmNlIGNvbXBpbGVyIHRvIGNvbXB1dGUvb3B0aW1pemUgZWFjaCBvbmUgd2l0aCBlYWNoIHVzYWdlLgorICogSGF2ZSBoZWFydCBhbmQgdXNlIGVudW0gaW5zdGVhZC4gKi8KK2VudW0geworCUxaTUFfQkFTRV9TSVpFID0gMTg0NiwKKwlMWk1BX0xJVF9TSVpFICA9IDc2OCwKKworCUxaTUFfTlVNX1BPU19CSVRTX01BWCA9IDQsCisKKwlMWk1BX0xFTl9OVU1fTE9XX0JJVFMgID0gMywKKwlMWk1BX0xFTl9OVU1fTUlEX0JJVFMgID0gMywKKwlMWk1BX0xFTl9OVU1fSElHSF9CSVRTID0gOCwKKworCUxaTUFfTEVOX0NIT0lDRSAgICAgPSAwLAorCUxaTUFfTEVOX0NIT0lDRV8yICAgPSAoTFpNQV9MRU5fQ0hPSUNFICsgMSksCisJTFpNQV9MRU5fTE9XICAgICAgICA9IChMWk1BX0xFTl9DSE9JQ0VfMiArIDEpLAorCUxaTUFfTEVOX01JRCAgICAgICAgPSAoTFpNQV9MRU5fTE9XIFwKKwkgICAgICAgICAgICAgICAgICAgICAgKyAoMSA8PCAoTFpNQV9OVU1fUE9TX0JJVFNfTUFYICsgTFpNQV9MRU5fTlVNX0xPV19CSVRTKSkpLAorCUxaTUFfTEVOX0hJR0ggICAgICAgPSAoTFpNQV9MRU5fTUlEIFwKKwkgICAgICAgICAgICAgICAgICAgICAgKyAoMSA8PCAoTFpNQV9OVU1fUE9TX0JJVFNfTUFYICsgTFpNQV9MRU5fTlVNX01JRF9CSVRTKSkpLAorCUxaTUFfTlVNX0xFTl9QUk9CUyAgPSAoTFpNQV9MRU5fSElHSCArICgxIDw8IExaTUFfTEVOX05VTV9ISUdIX0JJVFMpKSwKKworCUxaTUFfTlVNX1NUQVRFUyAgICAgPSAxMiwKKwlMWk1BX05VTV9MSVRfU1RBVEVTID0gNywKKworCUxaTUFfU1RBUlRfUE9TX01PREVMX0lOREVYID0gNCwKKwlMWk1BX0VORF9QT1NfTU9ERUxfSU5ERVggICA9IDE0LAorCUxaTUFfTlVNX0ZVTExfRElTVEFOQ0VTICAgID0gKDEgPDwgKExaTUFfRU5EX1BPU19NT0RFTF9JTkRFWCA+PiAxKSksCisKKwlMWk1BX05VTV9QT1NfU0xPVF9CSVRTID0gNiwKKwlMWk1BX05VTV9MRU5fVE9fUE9TX1NUQVRFUyA9IDQsCisKKwlMWk1BX05VTV9BTElHTl9CSVRTID0gNCwKKworCUxaTUFfTUFUQ0hfTUlOX0xFTiAgPSAyLAorCisJTFpNQV9JU19NQVRDSCAgICAgICA9IDAsCisJTFpNQV9JU19SRVAgICAgICAgICA9IChMWk1BX0lTX01BVENIICsgKExaTUFfTlVNX1NUQVRFUyA8PCBMWk1BX05VTV9QT1NfQklUU19NQVgpKSwKKwlMWk1BX0lTX1JFUF9HMCAgICAgID0gKExaTUFfSVNfUkVQICsgTFpNQV9OVU1fU1RBVEVTKSwKKwlMWk1BX0lTX1JFUF9HMSAgICAgID0gKExaTUFfSVNfUkVQX0cwICsgTFpNQV9OVU1fU1RBVEVTKSwKKwlMWk1BX0lTX1JFUF9HMiAgICAgID0gKExaTUFfSVNfUkVQX0cxICsgTFpNQV9OVU1fU1RBVEVTKSwKKwlMWk1BX0lTX1JFUF8wX0xPTkcgID0gKExaTUFfSVNfUkVQX0cyICsgTFpNQV9OVU1fU1RBVEVTKSwKKwlMWk1BX1BPU19TTE9UICAgICAgID0gKExaTUFfSVNfUkVQXzBfTE9ORyBcCisJICAgICAgICAgICAgICAgICAgICAgICsgKExaTUFfTlVNX1NUQVRFUyA8PCBMWk1BX05VTV9QT1NfQklUU19NQVgpKSwKKwlMWk1BX1NQRUNfUE9TICAgICAgID0gKExaTUFfUE9TX1NMT1QgXAorCSAgICAgICAgICAgICAgICAgICAgICArIChMWk1BX05VTV9MRU5fVE9fUE9TX1NUQVRFUyA8PCBMWk1BX05VTV9QT1NfU0xPVF9CSVRTKSksCisJTFpNQV9BTElHTiAgICAgICAgICA9IChMWk1BX1NQRUNfUE9TIFwKKwkgICAgICAgICAgICAgICAgICAgICAgKyBMWk1BX05VTV9GVUxMX0RJU1RBTkNFUyAtIExaTUFfRU5EX1BPU19NT0RFTF9JTkRFWCksCisJTFpNQV9MRU5fQ09ERVIgICAgICA9IChMWk1BX0FMSUdOICsgKDEgPDwgTFpNQV9OVU1fQUxJR05fQklUUykpLAorCUxaTUFfUkVQX0xFTl9DT0RFUiAgPSAoTFpNQV9MRU5fQ09ERVIgKyBMWk1BX05VTV9MRU5fUFJPQlMpLAorCUxaTUFfTElURVJBTCAgICAgICAgPSAoTFpNQV9SRVBfTEVOX0NPREVSICsgTFpNQV9OVU1fTEVOX1BST0JTKSwKK307CisKKworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMKK3VucGFja19sem1hX3N0cmVhbShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKQoreworCUlGX0RFU0tUT1AobG9uZyBsb25nIHRvdGFsX3dyaXR0ZW4gPSAwOykKKwlsem1hX2hlYWRlcl90IGhlYWRlcjsKKwlpbnQgbGMsIHBiLCBscDsKKwl1aW50MzJfdCBwb3Nfc3RhdGVfbWFzazsKKwl1aW50MzJfdCBsaXRlcmFsX3Bvc19tYXNrOworCXVpbnQxNl90ICpwOworCWludCBudW1fYml0czsKKwlpbnQgbnVtX3Byb2JzOworCXJjX3QgKnJjOworCWludCBpOworCXVpbnQ4X3QgKmJ1ZmZlcjsKKwl1aW50OF90IHByZXZpb3VzX2J5dGUgPSAwOworCXNpemVfdCBidWZmZXJfcG9zID0gMCwgZ2xvYmFsX3BvcyA9IDA7CisJaW50IGxlbiA9IDA7CisJaW50IHN0YXRlID0gMDsKKwl1aW50MzJfdCByZXAwID0gMSwgcmVwMSA9IDEsIHJlcDIgPSAxLCByZXAzID0gMTsKKworCWlmIChmdWxsX3JlYWQoc3JjX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikKKwkgfHwgaGVhZGVyLnBvcyA+PSAoOSAqIDUgKiA1KQorCSkgeworCQliYl9lcnJvcl9tc2coImJhZCBsem1hIGhlYWRlciIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaSA9IGhlYWRlci5wb3MgLyA5OworCWxjID0gaGVhZGVyLnBvcyAlIDk7CisJcGIgPSBpIC8gNTsKKwlscCA9IGkgJSA1OworCXBvc19zdGF0ZV9tYXNrID0gKDEgPDwgcGIpIC0gMTsKKwlsaXRlcmFsX3Bvc19tYXNrID0gKDEgPDwgbHApIC0gMTsKKworCWhlYWRlci5kaWN0X3NpemUgPSBTV0FQX0xFMzIoaGVhZGVyLmRpY3Rfc2l6ZSk7CisJaGVhZGVyLmRzdF9zaXplID0gU1dBUF9MRTY0KGhlYWRlci5kc3Rfc2l6ZSk7CisKKwlpZiAoaGVhZGVyLmRpY3Rfc2l6ZSA9PSAwKQorCQloZWFkZXIuZGljdF9zaXplKys7CisKKwlidWZmZXIgPSB4bWFsbG9jKE1JTihoZWFkZXIuZHN0X3NpemUsIGhlYWRlci5kaWN0X3NpemUpKTsKKworCW51bV9wcm9icyA9IExaTUFfQkFTRV9TSVpFICsgKExaTUFfTElUX1NJWkUgPDwgKGxjICsgbHApKTsKKwlwID0geG1hbGxvYyhudW1fcHJvYnMgKiBzaXplb2YoKnApKTsKKwludW1fcHJvYnMgKz0gTFpNQV9MSVRFUkFMIC0gTFpNQV9CQVNFX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IG51bV9wcm9iczsgaSsrKQorCQlwW2ldID0gKDEgPDwgUkNfTU9ERUxfVE9UQUxfQklUUykgPj4gMTsKKworCXJjID0gcmNfaW5pdChzcmNfZmQpOyAvKiwgUkNfQlVGRkVSX1NJWkUpOyAqLworCisJd2hpbGUgKGdsb2JhbF9wb3MgKyBidWZmZXJfcG9zIDwgaGVhZGVyLmRzdF9zaXplKSB7CisJCWludCBwb3Nfc3RhdGUgPSAoYnVmZmVyX3BvcyArIGdsb2JhbF9wb3MpICYgcG9zX3N0YXRlX21hc2s7CisJCXVpbnQxNl90ICpwcm9iID0gcCArIExaTUFfSVNfTUFUQ0ggKyAoc3RhdGUgPDwgTFpNQV9OVU1fUE9TX0JJVFNfTUFYKSArIHBvc19zdGF0ZTsKKworCQlpZiAoIXJjX2lzX2JpdF8xKHJjLCBwcm9iKSkgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgbmV4dF9zdGF0ZVtMWk1BX05VTV9TVEFURVNdID0KKwkJCQl7IDAsIDAsIDAsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDQsIDUgfTsKKwkJCWludCBtaSA9IDE7CisKKwkJCXByb2IgPSAocCArIExaTUFfTElURVJBTAorCQkJICAgICAgICArIChMWk1BX0xJVF9TSVpFICogKCgoKGJ1ZmZlcl9wb3MgKyBnbG9iYWxfcG9zKSAmIGxpdGVyYWxfcG9zX21hc2spIDw8IGxjKQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHByZXZpb3VzX2J5dGUgPj4gKDggLSBsYykpCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICApCisJCQkgICAgICAgICAgKQorCQkJKTsKKworCQkJaWYgKHN0YXRlID49IExaTUFfTlVNX0xJVF9TVEFURVMpIHsKKwkJCQlpbnQgbWF0Y2hfYnl0ZTsKKwkJCQl1aW50MzJfdCBwb3MgPSBidWZmZXJfcG9zIC0gcmVwMDsKKworCQkJCXdoaWxlIChwb3MgPj0gaGVhZGVyLmRpY3Rfc2l6ZSkKKwkJCQkJcG9zICs9IGhlYWRlci5kaWN0X3NpemU7CisJCQkJbWF0Y2hfYnl0ZSA9IGJ1ZmZlcltwb3NdOworCQkJCWRvIHsKKwkJCQkJaW50IGJpdDsKKworCQkJCQltYXRjaF9ieXRlIDw8PSAxOworCQkJCQliaXQgPSBtYXRjaF9ieXRlICYgMHgxMDA7CisJCQkJCWJpdCBePSAocmNfZ2V0X2JpdChyYywgcHJvYiArIDB4MTAwICsgYml0ICsgbWksICZtaSkgPDwgOCk7IC8qIDB4MTAwIG9yIDAgKi8KKwkJCQkJaWYgKGJpdCkKKwkJCQkJCWJyZWFrOworCQkJCX0gd2hpbGUgKG1pIDwgMHgxMDApOworCQkJfQorCQkJd2hpbGUgKG1pIDwgMHgxMDApIHsKKwkJCQlyY19nZXRfYml0KHJjLCBwcm9iICsgbWksICZtaSk7CisJCQl9CisKKwkJCXN0YXRlID0gbmV4dF9zdGF0ZVtzdGF0ZV07CisKKwkJCXByZXZpb3VzX2J5dGUgPSAodWludDhfdCkgbWk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFpNQV9GQVNUCisgb25lX2J5dGUxOgorCQkJYnVmZmVyW2J1ZmZlcl9wb3MrK10gPSBwcmV2aW91c19ieXRlOworCQkJaWYgKGJ1ZmZlcl9wb3MgPT0gaGVhZGVyLmRpY3Rfc2l6ZSkgeworCQkJCWJ1ZmZlcl9wb3MgPSAwOworCQkJCWdsb2JhbF9wb3MgKz0gaGVhZGVyLmRpY3Rfc2l6ZTsKKwkJCQlpZiAoZnVsbF93cml0ZShkc3RfZmQsIGJ1ZmZlciwgaGVhZGVyLmRpY3Rfc2l6ZSkgIT0gKHNzaXplX3QpaGVhZGVyLmRpY3Rfc2l6ZSkKKwkJCQkJZ290byBiYWQ7CisJCQkJSUZfREVTS1RPUCh0b3RhbF93cml0dGVuICs9IGhlYWRlci5kaWN0X3NpemU7KQorCQkJfQorI2Vsc2UKKwkJCWxlbiA9IDE7CisJCQlnb3RvIG9uZV9ieXRlMjsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJaW50IG9mZnNldDsKKwkJCXVpbnQxNl90ICpwcm9iMjsKKyNkZWZpbmUgcHJvYl9sZW4gcHJvYjIKKworCQkJcHJvYjIgPSBwICsgTFpNQV9JU19SRVAgKyBzdGF0ZTsKKwkJCWlmICghcmNfaXNfYml0XzEocmMsIHByb2IyKSkgeworCQkJCXJlcDMgPSByZXAyOworCQkJCXJlcDIgPSByZXAxOworCQkJCXJlcDEgPSByZXAwOworCQkJCXN0YXRlID0gc3RhdGUgPCBMWk1BX05VTV9MSVRfU1RBVEVTID8gMCA6IDM7CisJCQkJcHJvYjIgPSBwICsgTFpNQV9MRU5fQ09ERVI7CisJCQl9IGVsc2UgeworCQkJCXByb2IyICs9IExaTUFfSVNfUkVQX0cwIC0gTFpNQV9JU19SRVA7CisJCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYjIpKSB7CisJCQkJCXByb2IyID0gKHAgKyBMWk1BX0lTX1JFUF8wX0xPTkcKKwkJCQkJICAgICAgICArIChzdGF0ZSA8PCBMWk1BX05VTV9QT1NfQklUU19NQVgpCisJCQkJCSAgICAgICAgKyBwb3Nfc3RhdGUKKwkJCQkJKTsKKwkJCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYjIpKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFpNQV9GQVNUCisJCQkJCQl1aW50MzJfdCBwb3MgPSBidWZmZXJfcG9zIC0gcmVwMDsKKwkJCQkJCXN0YXRlID0gc3RhdGUgPCBMWk1BX05VTV9MSVRfU1RBVEVTID8gOSA6IDExOworCQkJCQkJd2hpbGUgKHBvcyA+PSBoZWFkZXIuZGljdF9zaXplKQorCQkJCQkJCXBvcyArPSBoZWFkZXIuZGljdF9zaXplOworCQkJCQkJcHJldmlvdXNfYnl0ZSA9IGJ1ZmZlcltwb3NdOworCQkJCQkJZ290byBvbmVfYnl0ZTE7CisjZWxzZQorCQkJCQkJc3RhdGUgPSBzdGF0ZSA8IExaTUFfTlVNX0xJVF9TVEFURVMgPyA5IDogMTE7CisJCQkJCQlsZW4gPSAxOworCQkJCQkJZ290byBzdHJpbmc7CisjZW5kaWYKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXVpbnQzMl90IGRpc3RhbmNlOworCisJCQkJCXByb2IyICs9IExaTUFfSVNfUkVQX0cxIC0gTFpNQV9JU19SRVBfRzA7CisJCQkJCWRpc3RhbmNlID0gcmVwMTsKKwkJCQkJaWYgKHJjX2lzX2JpdF8xKHJjLCBwcm9iMikpIHsKKwkJCQkJCXByb2IyICs9IExaTUFfSVNfUkVQX0cyIC0gTFpNQV9JU19SRVBfRzE7CisJCQkJCQlkaXN0YW5jZSA9IHJlcDI7CisJCQkJCQlpZiAocmNfaXNfYml0XzEocmMsIHByb2IyKSkgeworCQkJCQkJCWRpc3RhbmNlID0gcmVwMzsKKwkJCQkJCQlyZXAzID0gcmVwMjsKKwkJCQkJCX0KKwkJCQkJCXJlcDIgPSByZXAxOworCQkJCQl9CisJCQkJCXJlcDEgPSByZXAwOworCQkJCQlyZXAwID0gZGlzdGFuY2U7CisJCQkJfQorCQkJCXN0YXRlID0gc3RhdGUgPCBMWk1BX05VTV9MSVRfU1RBVEVTID8gOCA6IDExOworCQkJCXByb2IyID0gcCArIExaTUFfUkVQX0xFTl9DT0RFUjsKKwkJCX0KKworCQkJcHJvYl9sZW4gPSBwcm9iMiArIExaTUFfTEVOX0NIT0lDRTsKKwkJCW51bV9iaXRzID0gTFpNQV9MRU5fTlVNX0xPV19CSVRTOworCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYl9sZW4pKSB7CisJCQkJcHJvYl9sZW4gKz0gTFpNQV9MRU5fTE9XIC0gTFpNQV9MRU5fQ0hPSUNFCisJCQkJICAgICAgICAgICAgKyAocG9zX3N0YXRlIDw8IExaTUFfTEVOX05VTV9MT1dfQklUUyk7CisJCQkJb2Zmc2V0ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJcHJvYl9sZW4gKz0gTFpNQV9MRU5fQ0hPSUNFXzIgLSBMWk1BX0xFTl9DSE9JQ0U7CisJCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYl9sZW4pKSB7CisJCQkJCXByb2JfbGVuICs9IExaTUFfTEVOX01JRCAtIExaTUFfTEVOX0NIT0lDRV8yCisJCQkJCSAgICAgICAgICAgICsgKHBvc19zdGF0ZSA8PCBMWk1BX0xFTl9OVU1fTUlEX0JJVFMpOworCQkJCQlvZmZzZXQgPSAxIDw8IExaTUFfTEVOX05VTV9MT1dfQklUUzsKKwkJCQkJbnVtX2JpdHMgKz0gTFpNQV9MRU5fTlVNX01JRF9CSVRTIC0gTFpNQV9MRU5fTlVNX0xPV19CSVRTOworCQkJCX0gZWxzZSB7CisJCQkJCXByb2JfbGVuICs9IExaTUFfTEVOX0hJR0ggLSBMWk1BX0xFTl9DSE9JQ0VfMjsKKwkJCQkJb2Zmc2V0ID0gKCgxIDw8IExaTUFfTEVOX05VTV9MT1dfQklUUykKKwkJCQkJICAgICAgICAgICsgKDEgPDwgTFpNQV9MRU5fTlVNX01JRF9CSVRTKSk7CisJCQkJCW51bV9iaXRzICs9IExaTUFfTEVOX05VTV9ISUdIX0JJVFMgLSBMWk1BX0xFTl9OVU1fTE9XX0JJVFM7CisJCQkJfQorCQkJfQorCQkJcmNfYml0X3RyZWVfZGVjb2RlKHJjLCBwcm9iX2xlbiwgbnVtX2JpdHMsICZsZW4pOworCQkJbGVuICs9IG9mZnNldDsKKworCQkJaWYgKHN0YXRlIDwgNCkgeworCQkJCWludCBwb3Nfc2xvdDsKKwkJCQl1aW50MTZfdCAqcHJvYjM7CisKKwkJCQlzdGF0ZSArPSBMWk1BX05VTV9MSVRfU1RBVEVTOworCQkJCXByb2IzID0gcCArIExaTUFfUE9TX1NMT1QgKworCQkJCSAgICAgICAoKGxlbiA8IExaTUFfTlVNX0xFTl9UT19QT1NfU1RBVEVTID8gbGVuIDoKKwkJCQkgICAgICAgICBMWk1BX05VTV9MRU5fVE9fUE9TX1NUQVRFUyAtIDEpCisJCQkJICAgICAgICAgPDwgTFpNQV9OVU1fUE9TX1NMT1RfQklUUyk7CisJCQkJcmNfYml0X3RyZWVfZGVjb2RlKHJjLCBwcm9iMywKKwkJCQkJTFpNQV9OVU1fUE9TX1NMT1RfQklUUywgJnBvc19zbG90KTsKKwkJCQlyZXAwID0gcG9zX3Nsb3Q7CisJCQkJaWYgKHBvc19zbG90ID49IExaTUFfU1RBUlRfUE9TX01PREVMX0lOREVYKSB7CisJCQkJCWludCBpMiwgbWkyLCBudW1fYml0czIgPSAocG9zX3Nsb3QgPj4gMSkgLSAxOworCQkJCQlyZXAwID0gMiB8IChwb3Nfc2xvdCAmIDEpOworCQkJCQlpZiAocG9zX3Nsb3QgPCBMWk1BX0VORF9QT1NfTU9ERUxfSU5ERVgpIHsKKwkJCQkJCXJlcDAgPDw9IG51bV9iaXRzMjsKKwkJCQkJCXByb2IzID0gcCArIExaTUFfU1BFQ19QT1MgKyByZXAwIC0gcG9zX3Nsb3QgLSAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJZm9yICg7IG51bV9iaXRzMiAhPSBMWk1BX05VTV9BTElHTl9CSVRTOyBudW1fYml0czItLSkKKwkJCQkJCQlyZXAwID0gKHJlcDAgPDwgMSkgfCByY19kaXJlY3RfYml0KHJjKTsKKwkJCQkJCXJlcDAgPDw9IExaTUFfTlVNX0FMSUdOX0JJVFM7CisJCQkJCQlwcm9iMyA9IHAgKyBMWk1BX0FMSUdOOworCQkJCQl9CisJCQkJCWkyID0gMTsKKwkJCQkJbWkyID0gMTsKKwkJCQkJd2hpbGUgKG51bV9iaXRzMi0tKSB7CisJCQkJCQlpZiAocmNfZ2V0X2JpdChyYywgcHJvYjMgKyBtaTIsICZtaTIpKQorCQkJCQkJCXJlcDAgfD0gaTI7CisJCQkJCQlpMiA8PD0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKytyZXAwID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlsZW4gKz0gTFpNQV9NQVRDSF9NSU5fTEVOOworIElGX05PVF9GRUFUVVJFX0xaTUFfRkFTVChzdHJpbmc6KQorCQkJZG8geworCQkJCXVpbnQzMl90IHBvcyA9IGJ1ZmZlcl9wb3MgLSByZXAwOworCQkJCXdoaWxlIChwb3MgPj0gaGVhZGVyLmRpY3Rfc2l6ZSkKKwkJCQkJcG9zICs9IGhlYWRlci5kaWN0X3NpemU7CisJCQkJcHJldmlvdXNfYnl0ZSA9IGJ1ZmZlcltwb3NdOworIElGX05PVF9GRUFUVVJFX0xaTUFfRkFTVChvbmVfYnl0ZTI6KQorCQkJCWJ1ZmZlcltidWZmZXJfcG9zKytdID0gcHJldmlvdXNfYnl0ZTsKKwkJCQlpZiAoYnVmZmVyX3BvcyA9PSBoZWFkZXIuZGljdF9zaXplKSB7CisJCQkJCWJ1ZmZlcl9wb3MgPSAwOworCQkJCQlnbG9iYWxfcG9zICs9IGhlYWRlci5kaWN0X3NpemU7CisJCQkJCWlmIChmdWxsX3dyaXRlKGRzdF9mZCwgYnVmZmVyLCBoZWFkZXIuZGljdF9zaXplKSAhPSAoc3NpemVfdCloZWFkZXIuZGljdF9zaXplKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCUlGX0RFU0tUT1AodG90YWxfd3JpdHRlbiArPSBoZWFkZXIuZGljdF9zaXplOykKKwkJCQl9CisJCQkJbGVuLS07CisJCQl9IHdoaWxlIChsZW4gIT0gMCAmJiBidWZmZXJfcG9zIDwgaGVhZGVyLmRzdF9zaXplKTsKKwkJfQorCX0KKworCXsKKwkJSUZfTk9UX0RFU0tUT1AoaW50IHRvdGFsX3dyaXR0ZW4gPSAwOyAvKiBzdWNjZXNzICovKQorCQlJRl9ERVNLVE9QKHRvdGFsX3dyaXR0ZW4gKz0gYnVmZmVyX3BvczspCisJCWlmIChmdWxsX3dyaXRlKGRzdF9mZCwgYnVmZmVyLCBidWZmZXJfcG9zKSAhPSAoc3NpemVfdClidWZmZXJfcG9zKSB7CisgYmFkOgorCQkJdG90YWxfd3JpdHRlbiA9IC0xOyAvKiBmYWlsdXJlICovCisJCX0KKwkJcmNfZnJlZShyYyk7CisJCWZyZWUocCk7CisJCWZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIHRvdGFsX3dyaXR0ZW47CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VueHouYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bnh6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwZGZiMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bnh6LmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIFRoaXMgZmlsZSB1c2VzIFhaIEVtYmVkZGVkIGxpYnJhcnkgY29kZSB3aGljaCBpcyB3cml0dGVuCisgKiBieSBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqIGFuZCBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogU2VlIFJFQURNRSBmaWxlIGluIHVueHovIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXM6CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworI2RlZmluZSBYWl9GVU5DIEZBU1RfRlVOQworI2RlZmluZSBYWl9FWFRFUk4gc3RhdGljCisKKyNkZWZpbmUgWFpfREVDX0RZTkFMTE9DCisKKy8qIFNraXAgY2hlY2sgKHJhdGhlciB0aGFuIGZhaWwpIG9mIHVuc3VwcG9ydGVkIGhhc2ggZnVuY3Rpb25zICovCisjZGVmaW5lIFhaX0RFQ19BTllfQ0hFQ0sgIDEKKworLyogV2UgdXNlIG91ciBvd24gY3JjMzIgZnVuY3Rpb24gKi8KKyNkZWZpbmUgWFpfSU5URVJOQUxfQ1JDMzIgMAorc3RhdGljIHVpbnQzMl90IHh6X2NyYzMyKGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGNyYykKK3sKKwlyZXR1cm4gfmNyYzMyX2Jsb2NrX2VuZGlhbjAofmNyYywgYnVmLCBzaXplLCBnbG9iYWxfY3JjMzJfdGFibGUpOworfQorCisvKiBXZSB1c2UgYXJjaC1vcHRpbWl6ZWQgdW5hbGlnbmVkIGFjY2Vzc29ycyAqLworI2RlZmluZSBnZXRfdW5hbGlnbmVkX2xlMzIoYnVmKSAoeyB1aW50MzJfdCB2OyBtb3ZlX2Zyb21fdW5hbGlnbmVkMzIodiwgYnVmKTsgU1dBUF9MRTMyKHYpOyB9KQorI2RlZmluZSBnZXRfdW5hbGlnbmVkX2JlMzIoYnVmKSAoeyB1aW50MzJfdCB2OyBtb3ZlX2Zyb21fdW5hbGlnbmVkMzIodiwgYnVmKTsgU1dBUF9CRTMyKHYpOyB9KQorI2RlZmluZSBwdXRfdW5hbGlnbmVkX2xlMzIodmFsLCBidWYpIG1vdmVfdG9fdW5hbGlnbmVkMTYoYnVmLCBTV0FQX0xFMzIodmFsKSkKKyNkZWZpbmUgcHV0X3VuYWxpZ25lZF9iZTMyKHZhbCwgYnVmKSBtb3ZlX3RvX3VuYWxpZ25lZDE2KGJ1ZiwgU1dBUF9CRTMyKHZhbCkpCisKKyNpbmNsdWRlICJ1bnh6L3h6X2RlY19iY2ouYyIKKyNpbmNsdWRlICJ1bnh6L3h6X2RlY19sem1hMi5jIgorI2luY2x1ZGUgInVueHoveHpfZGVjX3N0cmVhbS5jIgorCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQwordW5wYWNrX3h6X3N0cmVhbShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKQoreworCXN0cnVjdCB4el9idWYgaW9idWY7CisJc3RydWN0IHh6X2RlYyAqc3RhdGU7CisJdW5zaWduZWQgY2hhciAqbWVtYnVmOworCUlGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgdG90YWwgPSAwOworCisJaWYgKCFnbG9iYWxfY3JjMzJfdGFibGUpCisJCWdsb2JhbF9jcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAvKmVuZGlhbjoqLyAwKTsKKworCW1lbXNldCgmaW9idWYsIDAsIHNpemVvZihpb2J1ZikpOworCS8qIFByZWxvYWQgWFogZmlsZSBzaWduYXR1cmUgKi8KKwltZW1idWYgPSAodm9pZCopIHN0cmNweSh4bWFsbG9jKDIgKiBCVUZTSVopLCBIRUFERVJfTUFHSUMpOworCWlvYnVmLmluID0gbWVtYnVmOworCWlvYnVmLmluX3NpemUgPSBIRUFERVJfTUFHSUNfU0laRTsKKwlpb2J1Zi5vdXQgPSBtZW1idWYgKyBCVUZTSVo7CisJaW9idWYub3V0X3NpemUgPSBCVUZTSVo7CisKKwkvKiBMaW1pdCBtZW1vcnkgdXNhZ2UgdG8gYWJvdXQgNjQgTWlCLiAqLworCXN0YXRlID0geHpfZGVjX2luaXQoWFpfRFlOQUxMT0MsIDY0KjEwMjQqMTAyNCk7CisKKwl3aGlsZSAoMSkgeworCQllbnVtIHh6X3JldCByOworCisJCWlmIChpb2J1Zi5pbl9wb3MgPT0gaW9idWYuaW5fc2l6ZSkgeworCQkJaW50IHJkID0gc2FmZV9yZWFkKHNyY19mZCwgbWVtYnVmLCBCVUZTSVopOworCQkJaWYgKHJkIDwgMCkgeworCQkJCWJiX2Vycm9yX21zZyhiYl9tc2dfcmVhZF9lcnJvcik7CisJCQkJdG90YWwgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlvYnVmLmluX3NpemUgPSByZDsKKwkJCWlvYnVmLmluX3BvcyA9IDA7CisJCX0KKy8vCQliYl9lcnJvcl9tc2coIj5pbiBwb3M6JWQgc2l6ZTolZCBvdXQgcG9zOiVkIHNpemU6JWQiLAorLy8JCQkJaW9idWYuaW5fcG9zLCBpb2J1Zi5pbl9zaXplLCBpb2J1Zi5vdXRfcG9zLCBpb2J1Zi5vdXRfc2l6ZSk7CisJCXIgPSB4el9kZWNfcnVuKHN0YXRlLCAmaW9idWYpOworLy8JCWJiX2Vycm9yX21zZygiPGluIHBvczolZCBzaXplOiVkIG91dCBwb3M6JWQgc2l6ZTolZCByOiVkIiwKKy8vCQkJCWlvYnVmLmluX3BvcywgaW9idWYuaW5fc2l6ZSwgaW9idWYub3V0X3BvcywgaW9idWYub3V0X3NpemUsIHIpOworCQlpZiAoaW9idWYub3V0X3BvcykgeworCQkJeHdyaXRlKGRzdF9mZCwgaW9idWYub3V0LCBpb2J1Zi5vdXRfcG9zKTsKKwkJCUlGX0RFU0tUT1AodG90YWwgKz0gaW9idWYub3V0X3BvczspCisJCQlpb2J1Zi5vdXRfcG9zID0gMDsKKwkJfQorCQlpZiAociA9PSBYWl9TVFJFQU1fRU5EKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAociAhPSBYWl9PSyAmJiByICE9IFhaX1VOU1VQUE9SVEVEX0NIRUNLKSB7CisJCQliYl9lcnJvcl9tc2coImNvcnJ1cHRlZCBkYXRhIik7CisJCQl0b3RhbCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJeHpfZGVjX2VuZChzdGF0ZSk7CisJZnJlZShtZW1idWYpOworCisJcmV0dXJuIHRvdGFsOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VuemlwLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW56aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjllZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VuemlwLmMKQEAgLTAsMCArMSwxMjUyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBndW56aXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBCYXNlZCBvbiBHTlUgZ3ppcCB2MS4yLjQgQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseS4KKyAqCisgKiBPcmlnaW5hbGx5IGFkanVzdGVkIGZvciBidXN5Ym94IGJ5IFN2ZW4gUnVkb2xwaCA8c3IxQGluZi50dS1kcmVzZGVuLmRlPgorICogYmFzZWQgb24gZ3ppcCBzb3VyY2VzCisgKgorICogQWRqdXN0ZWQgZnVydGhlciBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+IHRvIHN1cHBvcnQKKyAqIGZpbGVzIGFzIHdlbGwgYXMgc3RkaW4vc3Rkb3V0LCBhbmQgdG8gZ2VuZXJhbGx5IGJlaGF2ZSBpdHNlbGYgd3J0CisgKiBjb21tYW5kIGxpbmUgaGFuZGxpbmcuCisgKgorICogR2VuZXJhbCBjbGVhbnVwIHRvIGJldHRlciBhZGhlcmUgdG8gdGhlIHN0eWxlIGd1aWRlIGFuZCBtYWtlIHVzZSBvZiBzdGFuZGFyZAorICogYnVzeWJveCBmdW5jdGlvbnMgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIHJlYWRfZ3ogaW50ZXJmYWNlICsgYXNzb2NpYXRlZCBoYWNraW5nIGJ5IExhdXJlbmNlIEFuZGVyc29uCisgKgorICogRml4ZWQgaHVmdF9idWlsZCgpIHNvIGRlY29kaW5nIGVuZC1vZi1ibG9jayBjb2RlIGRvZXMgbm90IGdyYWIgbW9yZSBiaXRzCisgKiB0aGFuIG5lY2Vzc2FyeSAodGhpcyBpcyByZXF1aXJlZCBieSB1bnppcCBhcHBsZXQpLCBhZGRlZCBpbmZsYXRlX2NsZWFudXAoKQorICogdG8gZnJlZSBsZWFrZWQgYnl0ZWJ1ZmZlciBtZW1vcnkgKHVzZWQgaW4gdW56aXAuYyksIGFuZCBzb21lIG1pbm9yIHN0eWxlCisgKiBndWlkZSBjbGVhbnVwcyBieSBFZCBDbGFyaworICoKKyAqIGd6aXAgKEdOVSB6aXApIC0tIGNvbXByZXNzIGZpbGVzIHdpdGggemlwIGFsZ29yaXRobSBhbmQgJ2NvbXByZXNzJyBpbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkKKyAqIFRoZSB1bnppcCBjb2RlIHdhcyB3cml0dGVuIGFuZCBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgTWFyayBBZGxlci4KKyAqIFBvcnRpb25zIG9mIHRoZSBsencgY29kZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBwdWJsaWMgZG9tYWluICdjb21wcmVzcycKKyAqIHdyaXR0ZW4gYnkgU3BlbmNlciBUaG9tYXMsIEpvZSBPcm9zdCwgSmFtZXMgV29vZHMsIEppbSBNY0tpZSwgU3RldmUgRGF2aWVzLAorICogS2VuIFR1cmtvd3NraSwgRGF2ZSBNYWNrIGFuZCBQZXRlciBKYW5uZXNlbi4KKyAqCisgKiBTZWUgdGhlIGZpbGUgYWxnb3JpdGhtLmRvYyBmb3IgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgYW5kIGZpbGUgZm9ybWF0cy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgaHVmdF90IHsKKwl1bnNpZ25lZCBjaGFyIGU7CS8qIG51bWJlciBvZiBleHRyYSBiaXRzIG9yIG9wZXJhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgYjsJLyogbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHN1YmNvZGUgKi8KKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0IG47CS8qIGxpdGVyYWwsIGxlbmd0aCBiYXNlLCBvciBkaXN0YW5jZSBiYXNlICovCisJCXN0cnVjdCBodWZ0X3QgKnQ7CS8qIHBvaW50ZXIgdG8gbmV4dCBsZXZlbCBvZiB0YWJsZSAqLworCX0gdjsKK30gaHVmdF90OworCitlbnVtIHsKKwkvKiBndW56aXBfd2luZG93IHNpemUtLW11c3QgYmUgYSBwb3dlciBvZiB0d28sIGFuZAorCSAqIGF0IGxlYXN0IDMySyBmb3IgemlwJ3MgZGVmbGF0ZSBtZXRob2QgKi8KKwlHVU5aSVBfV1NJWkUgPSAweDgwMDAsCisJLyogSWYgQk1BWCBuZWVkcyB0byBiZSBsYXJnZXIgdGhhbiAxNiwgdGhlbiBoIGFuZCB4W10gc2hvdWxkIGJlIHVsZy4gKi8KKwlCTUFYID0gMTYsCS8qIG1heGltdW0gYml0IGxlbmd0aCBvZiBhbnkgY29kZSAoMTYgZm9yIGV4cGxvZGUpICovCisJTl9NQVggPSAyODgsCS8qIG1heGltdW0gbnVtYmVyIG9mIGNvZGVzIGluIGFueSBzZXQgKi8KK307CisKKworLyogVGhpcyBpcyBzb21ld2hhdCBjb21wbGV4LWxvb2tpbmcgYXJyYW5nZW1lbnQsIGJ1dCBpdCBhbGxvd3MKKyAqIHRvIHBsYWNlIGRlY29tcHJlc3NvciBzdGF0ZSBlaXRoZXIgaW4gYnNzIG9yIGluCisgKiBtYWxsb2MnZWQgc3BhY2Ugc2ltcGx5IGJ5IGNoYW5naW5nICNkZWZpbmVzIGJlbG93LgorICogU2l6ZXMgb24gaTM4NjoKKyAqIHRleHQgICAgZGF0YSAgICAgYnNzICAgICBkZWMgICAgIGhleAorICogNTI1NiAgICAgICAwICAgICAxMDggICAgNTM2NCAgICAxNGY0IC0gYnNzCisgKiA0OTE1ICAgICAgIDAgICAgICAgMCAgICA0OTE1ICAgIDEzMzMgLSBtYWxsb2MKKyAqLworI2RlZmluZSBTVEFURV9JTl9CU1MgMAorI2RlZmluZSBTVEFURV9JTl9NQUxMT0MgMQorCisKK3R5cGVkZWYgc3RydWN0IHN0YXRlX3QgeworCW9mZl90IGd1bnppcF9ieXRlc19vdXQ7IC8qIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgKi8KKwl1aW50MzJfdCBndW56aXBfY3JjOworCisJaW50IGd1bnppcF9zcmNfZmQ7CisJdW5zaWduZWQgZ3VuemlwX291dGJ1Zl9jb3VudDsgLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLworCisJdW5zaWduZWQgY2hhciAqZ3VuemlwX3dpbmRvdzsKKworCXVpbnQzMl90ICpndW56aXBfY3JjX3RhYmxlOworCisJLyogYml0YnVmZmVyICovCisJdW5zaWduZWQgZ3VuemlwX2JiOyAvKiBiaXQgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciBndW56aXBfYms7IC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisJLyogaW5wdXQgKGNvbXByZXNzZWQpIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyICpieXRlYnVmZmVyOyAgICAgIC8qIGJ1ZmZlciBpdHNlbGYgKi8KKwlvZmZfdCB0b19yZWFkOwkJCS8qIGNvbXByZXNzZWQgYnl0ZXMgdG8gcmVhZCAodW56aXAgb25seSwgLTEgZm9yIGd1bnppcCkgKi8KKy8vCXVuc2lnbmVkIGJ5dGVidWZmZXJfbWF4OyAgICAgICAgLyogYnVmZmVyIHNpemUgKi8KKwl1bnNpZ25lZCBieXRlYnVmZmVyX29mZnNldDsgICAgIC8qIGJ1ZmZlciBwb3NpdGlvbiAqLworCXVuc2lnbmVkIGJ5dGVidWZmZXJfc2l6ZTsgICAgICAgLyogaG93IG11Y2ggZGF0YSBpcyB0aGVyZSAoc2l6ZSA8PSBtYXgpICovCisKKwkvKiBwcml2YXRlIGRhdGEgb2YgaW5mbGF0ZV9jb2RlcygpICovCisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc19tbDsgLyogbWFza3MgZm9yIGJsIGFuZCBiZCBiaXRzICovCisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc19tZDsgLyogbWFza3MgZm9yIGJsIGFuZCBiZCBiaXRzICovCisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc19iYjsgLyogYml0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfazsgLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfdzsgLyogY3VycmVudCBndW56aXBfd2luZG93IHBvc2l0aW9uICovCisJaHVmdF90ICppbmZsYXRlX2NvZGVzX3RsOworCWh1ZnRfdCAqaW5mbGF0ZV9jb2Rlc190ZDsKKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX2JsOworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfYmQ7CisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc19ubjsgLyogbGVuZ3RoIGFuZCBpbmRleCBmb3IgY29weSAqLworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfZGQ7CisKKwlzbWFsbGludCByZXN1bWVfY29weTsKKworCS8qIHByaXZhdGUgZGF0YSBvZiBpbmZsYXRlX2dldF9uZXh0X3dpbmRvdygpICovCisJc21hbGxpbnQgbWV0aG9kOyAvKiBtZXRob2QgPT0gLTEgZm9yIHN0b3JlZCwgLTIgZm9yIGNvZGVzICovCisJc21hbGxpbnQgbmVlZF9hbm90aGVyX2Jsb2NrOworCXNtYWxsaW50IGVuZF9yZWFjaGVkOworCisJLyogcHJpdmF0ZSBkYXRhIG9mIGluZmxhdGVfc3RvcmVkKCkgKi8KKwl1bnNpZ25lZCBpbmZsYXRlX3N0b3JlZF9uOworCXVuc2lnbmVkIGluZmxhdGVfc3RvcmVkX2I7CisJdW5zaWduZWQgaW5mbGF0ZV9zdG9yZWRfazsKKwl1bnNpZ25lZCBpbmZsYXRlX3N0b3JlZF93OworCisJY29uc3QgY2hhciAqZXJyb3JfbXNnOworCWptcF9idWYgZXJyb3Jfam1wOworfSBzdGF0ZV90OworI2RlZmluZSBndW56aXBfYnl0ZXNfb3V0ICAgIChTKClndW56aXBfYnl0ZXNfb3V0ICAgKQorI2RlZmluZSBndW56aXBfY3JjICAgICAgICAgIChTKClndW56aXBfY3JjICAgICAgICAgKQorI2RlZmluZSBndW56aXBfc3JjX2ZkICAgICAgIChTKClndW56aXBfc3JjX2ZkICAgICAgKQorI2RlZmluZSBndW56aXBfb3V0YnVmX2NvdW50IChTKClndW56aXBfb3V0YnVmX2NvdW50KQorI2RlZmluZSBndW56aXBfd2luZG93ICAgICAgIChTKClndW56aXBfd2luZG93ICAgICAgKQorI2RlZmluZSBndW56aXBfY3JjX3RhYmxlICAgIChTKClndW56aXBfY3JjX3RhYmxlICAgKQorI2RlZmluZSBndW56aXBfYmIgICAgICAgICAgIChTKClndW56aXBfYmIgICAgICAgICAgKQorI2RlZmluZSBndW56aXBfYmsgICAgICAgICAgIChTKClndW56aXBfYmsgICAgICAgICAgKQorI2RlZmluZSB0b19yZWFkICAgICAgICAgICAgIChTKCl0b19yZWFkICAgICAgICAgICAgKQorLy8gI2RlZmluZSBieXRlYnVmZmVyX21heCAgIChTKClieXRlYnVmZmVyX21heCAgICAgKQorLy8gQm90aCBndW56aXAgYW5kIHVuemlwIGNhbiB1c2UgY29uc3RhbnQgYnVmZmVyIHNpemUgbm93ICgxNmspOgorI2RlZmluZSBieXRlYnVmZmVyX21heCAgICAgIDB4NDAwMAorI2RlZmluZSBieXRlYnVmZmVyICAgICAgICAgIChTKClieXRlYnVmZmVyICAgICAgICAgKQorI2RlZmluZSBieXRlYnVmZmVyX29mZnNldCAgIChTKClieXRlYnVmZmVyX29mZnNldCAgKQorI2RlZmluZSBieXRlYnVmZmVyX3NpemUgICAgIChTKClieXRlYnVmZmVyX3NpemUgICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX21sICAgIChTKClpbmZsYXRlX2NvZGVzX21sICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX21kICAgIChTKClpbmZsYXRlX2NvZGVzX21kICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX2JiICAgIChTKClpbmZsYXRlX2NvZGVzX2JiICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX2sgICAgIChTKClpbmZsYXRlX2NvZGVzX2sgICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX3cgICAgIChTKClpbmZsYXRlX2NvZGVzX3cgICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX3RsICAgIChTKClpbmZsYXRlX2NvZGVzX3RsICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX3RkICAgIChTKClpbmZsYXRlX2NvZGVzX3RkICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX2JsICAgIChTKClpbmZsYXRlX2NvZGVzX2JsICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX2JkICAgIChTKClpbmZsYXRlX2NvZGVzX2JkICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX25uICAgIChTKClpbmZsYXRlX2NvZGVzX25uICAgKQorI2RlZmluZSBpbmZsYXRlX2NvZGVzX2RkICAgIChTKClpbmZsYXRlX2NvZGVzX2RkICAgKQorI2RlZmluZSByZXN1bWVfY29weSAgICAgICAgIChTKClyZXN1bWVfY29weSAgICAgICAgKQorI2RlZmluZSBtZXRob2QgICAgICAgICAgICAgIChTKCltZXRob2QgICAgICAgICAgICAgKQorI2RlZmluZSBuZWVkX2Fub3RoZXJfYmxvY2sgIChTKCluZWVkX2Fub3RoZXJfYmxvY2sgKQorI2RlZmluZSBlbmRfcmVhY2hlZCAgICAgICAgIChTKCllbmRfcmVhY2hlZCAgICAgICAgKQorI2RlZmluZSBpbmZsYXRlX3N0b3JlZF9uICAgIChTKClpbmZsYXRlX3N0b3JlZF9uICAgKQorI2RlZmluZSBpbmZsYXRlX3N0b3JlZF9iICAgIChTKClpbmZsYXRlX3N0b3JlZF9iICAgKQorI2RlZmluZSBpbmZsYXRlX3N0b3JlZF9rICAgIChTKClpbmZsYXRlX3N0b3JlZF9rICAgKQorI2RlZmluZSBpbmZsYXRlX3N0b3JlZF93ICAgIChTKClpbmZsYXRlX3N0b3JlZF93ICAgKQorI2RlZmluZSBlcnJvcl9tc2cgICAgICAgICAgIChTKCllcnJvcl9tc2cgICAgICAgICAgKQorI2RlZmluZSBlcnJvcl9qbXAgICAgICAgICAgIChTKCllcnJvcl9qbXAgICAgICAgICAgKQorCisvKiBUaGlzIGlzIGEgZ2VuZXJpYyBwYXJ0ICovCisjaWYgU1RBVEVfSU5fQlNTIC8qIFVzZSBnbG9iYWwgZGF0YSBzZWdtZW50ICovCisjZGVmaW5lIERFQ0xBUkVfU1RBVEUgLypub3RoaW5nKi8KKyNkZWZpbmUgQUxMT0NfU1RBVEUgLypub3RoaW5nKi8KKyNkZWZpbmUgREVBTExPQ19TVEFURSAoKHZvaWQpMCkKKyNkZWZpbmUgUygpIHN0YXRlLgorI2RlZmluZSBQQVNTX1NUQVRFIC8qbm90aGluZyovCisjZGVmaW5lIFBBU1NfU1RBVEVfT05MWSAvKm5vdGhpbmcqLworI2RlZmluZSBTVEFURV9QQVJBTSAvKm5vdGhpbmcqLworI2RlZmluZSBTVEFURV9QQVJBTV9PTkxZIHZvaWQKK3N0YXRpYyBzdGF0ZV90IHN0YXRlOworI2VuZGlmCisKKyNpZiBTVEFURV9JTl9NQUxMT0MgLyogVXNlIG1hbGxvYyBzcGFjZSAqLworI2RlZmluZSBERUNMQVJFX1NUQVRFIHN0YXRlX3QgKnN0YXRlCisjZGVmaW5lIEFMTE9DX1NUQVRFIChzdGF0ZSA9IHh6YWxsb2Moc2l6ZW9mKCpzdGF0ZSkpKQorI2RlZmluZSBERUFMTE9DX1NUQVRFIGZyZWUoc3RhdGUpCisjZGVmaW5lIFMoKSBzdGF0ZS0+CisjZGVmaW5lIFBBU1NfU1RBVEUgc3RhdGUsCisjZGVmaW5lIFBBU1NfU1RBVEVfT05MWSBzdGF0ZQorI2RlZmluZSBTVEFURV9QQVJBTSBzdGF0ZV90ICpzdGF0ZSwKKyNkZWZpbmUgU1RBVEVfUEFSQU1fT05MWSBzdGF0ZV90ICpzdGF0ZQorI2VuZGlmCisKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG1hc2tfYml0c1tdIEFMSUdOMiA9IHsKKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDcsIDB4MDAwZiwgMHgwMDFmLCAweDAwM2YsIDB4MDA3ZiwgMHgwMGZmLAorCTB4MDFmZiwgMHgwM2ZmLCAweDA3ZmYsIDB4MGZmZiwgMHgxZmZmLCAweDNmZmYsIDB4N2ZmZiwgMHhmZmZmCit9OworCisvKiBDb3B5IGxlbmd0aHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjcGxlbnNbXSBBTElHTjIgPSB7CisJMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwgMzUsIDQzLCA1MSwgNTksCisJNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMAorfTsKKworLyogbm90ZTogc2VlIG5vdGUgIzEzIGFib3ZlIGFib3V0IHRoZSAyNTggaW4gdGhpcyBsaXN0LiAqLworLyogRXh0cmEgYml0cyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY3BsZXh0W10gQUxJR04xID0geworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsCisJNSwgNSwgNSwgMCwgOTksIDk5Cit9OyAvKiA5OSA9PSBpbnZhbGlkICovCisKKy8qIENvcHkgb2Zmc2V0cyBmb3IgZGlzdGFuY2UgY29kZXMgMC4uMjkgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjcGRpc3RbXSBBTElHTjIgPSB7CisJMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLCAyNTcsIDM4NSwgNTEzLAorCTc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NworfTsKKworLyogRXh0cmEgYml0cyBmb3IgZGlzdGFuY2UgY29kZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGNwZGV4dFtdIEFMSUdOMSA9IHsKKwkwLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsCisJMTEsIDExLCAxMiwgMTIsIDEzLCAxMworfTsKKworLyogVGFibGVzIGZvciBkZWZsYXRlIGZyb20gUEtaSVAncyBhcHBub3RlLnR4dC4gKi8KKy8qIE9yZGVyIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYm9yZGVyW10gQUxJR04xID0geworCTE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTUKK307CisKKworLyoKKyAqIEZyZWUgdGhlIG1hbGxvYydlZCB0YWJsZXMgYnVpbHQgYnkgaHVmdF9idWlsZCgpLCB3aGljaCBtYWtlcyBhIGxpbmtlZAorICogbGlzdCBvZiB0aGUgdGFibGVzIGl0IG1hZGUsIHdpdGggdGhlIGxpbmtzIGluIGEgZHVtbXkgZmlyc3QgZW50cnkgb2YKKyAqIGVhY2ggdGFibGUuCisgKiB0OiB0YWJsZSB0byBmcmVlCisgKi8KK3N0YXRpYyB2b2lkIGh1ZnRfZnJlZShodWZ0X3QgKnApCit7CisJaHVmdF90ICpxOworCisJLyogR28gdGhyb3VnaCBsaW5rZWQgbGlzdCwgZnJlZWluZyBmcm9tIHRoZSBtYWxsb2NlZCAodFstMV0pIGFkZHJlc3MuICovCisJd2hpbGUgKHApIHsKKwkJcSA9ICgtLXApLT52LnQ7CisJCWZyZWUocCk7CisJCXAgPSBxOworCX0KK30KKworc3RhdGljIHZvaWQgaHVmdF9mcmVlX2FsbChTVEFURV9QQVJBTV9PTkxZKQoreworCWh1ZnRfZnJlZShpbmZsYXRlX2NvZGVzX3RsKTsKKwlodWZ0X2ZyZWUoaW5mbGF0ZV9jb2Rlc190ZCk7CisJaW5mbGF0ZV9jb2Rlc190bCA9IE5VTEw7CisJaW5mbGF0ZV9jb2Rlc190ZCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGFib3J0X3VuemlwKFNUQVRFX1BBUkFNX09OTFkpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgYWJvcnRfdW56aXAoU1RBVEVfUEFSQU1fT05MWSkKK3sKKwlodWZ0X2ZyZWVfYWxsKFBBU1NfU1RBVEVfT05MWSk7CisJbG9uZ2ptcChlcnJvcl9qbXAsIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgZmlsbF9iaXRidWZmZXIoU1RBVEVfUEFSQU0gdW5zaWduZWQgYml0YnVmZmVyLCB1bnNpZ25lZCAqY3VycmVudCwgY29uc3QgdW5zaWduZWQgcmVxdWlyZWQpCit7CisJd2hpbGUgKCpjdXJyZW50IDwgcmVxdWlyZWQpIHsKKwkJaWYgKGJ5dGVidWZmZXJfb2Zmc2V0ID49IGJ5dGVidWZmZXJfc2l6ZSkgeworCQkJdW5zaWduZWQgc3ogPSBieXRlYnVmZmVyX21heCAtIDQ7CisJCQlpZiAodG9fcmVhZCA+PSAwICYmIHRvX3JlYWQgPCBzeikgLyogdW56aXAgb25seSAqLworCQkJCXN6ID0gdG9fcmVhZDsKKwkJCS8qIExlYXZlIHRoZSBmaXJzdCA0IGJ5dGVzIGVtcHR5IHNvIHdlIGNhbiBhbHdheXMgdW53aW5kIHRoZSBiaXRidWZmZXIKKwkJCSAqIHRvIHRoZSBmcm9udCBvZiB0aGUgYnl0ZWJ1ZmZlciAqLworCQkJYnl0ZWJ1ZmZlcl9zaXplID0gc2FmZV9yZWFkKGd1bnppcF9zcmNfZmQsICZieXRlYnVmZmVyWzRdLCBzeik7CisJCQlpZiAoKGludClieXRlYnVmZmVyX3NpemUgPCAxKSB7CisJCQkJZXJyb3JfbXNnID0gInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiOworCQkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7CisJCQl9CisJCQlpZiAodG9fcmVhZCA+PSAwKSAvKiB1bnppcCBvbmx5ICovCisJCQkJdG9fcmVhZCAtPSBieXRlYnVmZmVyX3NpemU7CisJCQlieXRlYnVmZmVyX3NpemUgKz0gNDsKKwkJCWJ5dGVidWZmZXJfb2Zmc2V0ID0gNDsKKwkJfQorCQliaXRidWZmZXIgfD0gKCh1bnNpZ25lZCkgYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0pIDw8ICpjdXJyZW50OworCQlieXRlYnVmZmVyX29mZnNldCsrOworCQkqY3VycmVudCArPSA4OworCX0KKwlyZXR1cm4gYml0YnVmZmVyOworfQorCisKKy8qIEdpdmVuIGEgbGlzdCBvZiBjb2RlIGxlbmd0aHMgYW5kIGEgbWF4aW11bSB0YWJsZSBzaXplLCBtYWtlIGEgc2V0IG9mCisgKiB0YWJsZXMgdG8gZGVjb2RlIHRoYXQgc2V0IG9mIGNvZGVzLiAgUmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb25lIGlmCisgKiB0aGUgZ2l2ZW4gY29kZSBzZXQgaXMgaW5jb21wbGV0ZSAodGhlIHRhYmxlcyBhcmUgc3RpbGwgYnVpbHQgaW4gdGhpcworICogY2FzZSksIHR3byBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCAoYWxsIHplcm8gbGVuZ3RoIGNvZGVzIG9yIGFuCisgKiBvdmVyc3Vic2NyaWJlZCBzZXQgb2YgbGVuZ3RocykgLSBpbiB0aGlzIGNhc2Ugc3RvcmVzIE5VTEwgaW4gKnQuCisgKgorICogYjoJY29kZSBsZW5ndGhzIGluIGJpdHMgKGFsbCBhc3N1bWVkIDw9IEJNQVgpCisgKiBuOgludW1iZXIgb2YgY29kZXMgKGFzc3VtZWQgPD0gTl9NQVgpCisgKiBzOgludW1iZXIgb2Ygc2ltcGxlLXZhbHVlZCBjb2RlcyAoMC4ucy0xKQorICogZDoJbGlzdCBvZiBiYXNlIHZhbHVlcyBmb3Igbm9uLXNpbXBsZSBjb2RlcworICogZToJbGlzdCBvZiBleHRyYSBiaXRzIGZvciBub24tc2ltcGxlIGNvZGVzCisgKiB0OglyZXN1bHQ6IHN0YXJ0aW5nIHRhYmxlCisgKiBtOgltYXhpbXVtIGxvb2t1cCBiaXRzLCByZXR1cm5zIGFjdHVhbAorICovCitzdGF0aWMgaW50IGh1ZnRfYnVpbGQoY29uc3QgdW5zaWduZWQgKmIsIGNvbnN0IHVuc2lnbmVkIG4sCisJCQkgICBjb25zdCB1bnNpZ25lZCBzLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqZCwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmUsIGh1ZnRfdCAqKnQsIHVuc2lnbmVkICptKQoreworCXVuc2lnbmVkIGE7ICAgICAgICAgICAgIC8qIGNvdW50ZXIgZm9yIGNvZGVzIG9mIGxlbmd0aCBrICovCisJdW5zaWduZWQgY1tCTUFYICsgMV07ICAgLyogYml0IGxlbmd0aCBjb3VudCB0YWJsZSAqLworCXVuc2lnbmVkIGVvYl9sZW47ICAgICAgIC8qIGxlbmd0aCBvZiBlbmQtb2YtYmxvY2sgY29kZSAodmFsdWUgMjU2KSAqLworCXVuc2lnbmVkIGY7ICAgICAgICAgICAgIC8qIGkgcmVwZWF0cyBpbiB0YWJsZSBldmVyeSBmIGVudHJpZXMgKi8KKwlpbnQgZzsgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisJaW50IGh0bDsgICAgICAgICAgICAgICAgLyogdGFibGUgbGV2ZWwgKi8KKwl1bnNpZ25lZCBpOyAgICAgICAgICAgICAvKiBjb3VudGVyLCBjdXJyZW50IGNvZGUgKi8KKwl1bnNpZ25lZCBqOyAgICAgICAgICAgICAvKiBjb3VudGVyICovCisJaW50IGs7ICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gY3VycmVudCBjb2RlICovCisJdW5zaWduZWQgKnA7ICAgICAgICAgICAgLyogcG9pbnRlciBpbnRvIGNbXSwgYltdLCBvciB2W10gKi8KKwlodWZ0X3QgKnE7ICAgICAgICAgICAgICAvKiBwb2ludHMgdG8gY3VycmVudCB0YWJsZSAqLworCWh1ZnRfdCByOyAgICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBzdHJ1Y3R1cmUgYXNzaWdubWVudCAqLworCWh1ZnRfdCAqdVtCTUFYXTsgICAgICAgIC8qIHRhYmxlIHN0YWNrICovCisJdW5zaWduZWQgdltOX01BWF07ICAgICAgLyogdmFsdWVzIGluIG9yZGVyIG9mIGJpdCBsZW5ndGggKi8KKwlpbnQgd3NbQk1BWCArIDFdOyAgICAgICAvKiBiaXRzIGRlY29kZWQgc3RhY2sgKi8KKwlpbnQgdzsgICAgICAgICAgICAgICAgICAvKiBiaXRzIGRlY29kZWQgKi8KKwl1bnNpZ25lZCB4W0JNQVggKyAxXTsgICAvKiBiaXQgb2Zmc2V0cywgdGhlbiBjb2RlIHN0YWNrICovCisJdW5zaWduZWQgKnhwOyAgICAgICAgICAgLyogcG9pbnRlciBpbnRvIHggKi8KKwlpbnQgeTsgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZHVtbXkgY29kZXMgYWRkZWQgKi8KKwl1bnNpZ25lZCB6OyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBjdXJyZW50IHRhYmxlICovCisKKwkvKiBMZW5ndGggb2YgRU9CIGNvZGUsIGlmIGFueSAqLworCWVvYl9sZW4gPSBuID4gMjU2ID8gYlsyNTZdIDogQk1BWDsKKworCSp0ID0gTlVMTDsKKworCS8qIEdlbmVyYXRlIGNvdW50cyBmb3IgZWFjaCBiaXQgbGVuZ3RoICovCisJbWVtc2V0KGMsIDAsIHNpemVvZihjKSk7CisJcCA9ICh1bnNpZ25lZCAqKSBiOyAvKiBjYXN0IGFsbG93cyB1cyB0byByZXVzZSBwIGZvciBwb2ludGluZyB0byBiICovCisJaSA9IG47CisJZG8geworCQljWypwXSsrOyAvKiBhc3N1bWUgYWxsIGVudHJpZXMgPD0gQk1BWCAqLworCQlwKys7ICAgICAvKiBjYW4ndCBjb21iaW5lIHdpdGggYWJvdmUgbGluZSAoU29sYXJpcyBidWcpICovCisJfSB3aGlsZSAoLS1pKTsKKwlpZiAoY1swXSA9PSBuKSB7ICAvKiBudWxsIGlucHV0IC0gYWxsIHplcm8gbGVuZ3RoIGNvZGVzICovCisJCSptID0gMDsKKwkJcmV0dXJuIDI7CisJfQorCisJLyogRmluZCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCwgYm91bmQgKm0gYnkgdGhvc2UgKi8KKwlmb3IgKGogPSAxOyAoY1tqXSA9PSAwKSAmJiAoaiA8PSBCTUFYKTsgaisrKQorCQljb250aW51ZTsKKwlrID0gajsgLyogbWluaW11bSBjb2RlIGxlbmd0aCAqLworCWZvciAoaSA9IEJNQVg7IChjW2ldID09IDApICYmIGk7IGktLSkKKwkJY29udGludWU7CisJZyA9IGk7IC8qIG1heGltdW0gY29kZSBsZW5ndGggKi8KKwkqbSA9ICgqbSA8IGopID8gaiA6ICgoKm0gPiBpKSA/IGkgOiAqbSk7CisKKwkvKiBBZGp1c3QgbGFzdCBsZW5ndGggY291bnQgdG8gZmlsbCBvdXQgY29kZXMsIGlmIG5lZWRlZCAqLworCWZvciAoeSA9IDEgPDwgajsgaiA8IGk7IGorKywgeSA8PD0gMSkgeworCQl5IC09IGNbal07CisJCWlmICh5IDwgMCkKKwkJCXJldHVybiAyOyAvKiBiYWQgaW5wdXQ6IG1vcmUgY29kZXMgdGhhbiBiaXRzICovCisJfQorCXkgLT0gY1tpXTsKKwlpZiAoeSA8IDApCisJCXJldHVybiAyOworCWNbaV0gKz0geTsKKworCS8qIEdlbmVyYXRlIHN0YXJ0aW5nIG9mZnNldHMgaW50byB0aGUgdmFsdWUgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisJeFsxXSA9IGogPSAwOworCXAgPSBjICsgMTsKKwl4cCA9IHggKyAyOworCXdoaWxlICgtLWkpIHsgLyogbm90ZSB0aGF0IGkgPT0gZyBmcm9tIGFib3ZlICovCisJCWogKz0gKnArKzsKKwkJKnhwKysgPSBqOworCX0KKworCS8qIE1ha2UgYSB0YWJsZSBvZiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aHMgKi8KKwlwID0gKHVuc2lnbmVkICopIGI7CisJaSA9IDA7CisJZG8geworCQlqID0gKnArKzsKKwkJaWYgKGogIT0gMCkgeworCQkJdlt4W2pdKytdID0gaTsKKwkJfQorCX0gd2hpbGUgKCsraSA8IG4pOworCisJLyogR2VuZXJhdGUgdGhlIEh1ZmZtYW4gY29kZXMgYW5kIGZvciBlYWNoLCBtYWtlIHRoZSB0YWJsZSBlbnRyaWVzICovCisJeFswXSA9IGkgPSAwOyAgIC8qIGZpcnN0IEh1ZmZtYW4gY29kZSBpcyB6ZXJvICovCisJcCA9IHY7ICAgICAgICAgIC8qIGdyYWIgdmFsdWVzIGluIGJpdCBvcmRlciAqLworCWh0bCA9IC0xOyAgICAgICAvKiBubyB0YWJsZXMgeWV0LS1sZXZlbCAtMSAqLworCXcgPSB3c1swXSA9IDA7ICAvKiBiaXRzIGRlY29kZWQgKi8KKwl1WzBdID0gTlVMTDsgICAgLyoganVzdCB0byBrZWVwIGNvbXBpbGVycyBoYXBweSAqLworCXEgPSBOVUxMOyAgICAgICAvKiBkaXR0byAqLworCXogPSAwOyAgICAgICAgICAvKiBkaXR0byAqLworCisJLyogZ28gdGhyb3VnaCB0aGUgYml0IGxlbmd0aHMgKGsgYWxyZWFkeSBpcyBiaXRzIGluIHNob3J0ZXN0IGNvZGUpICovCisJZm9yICg7IGsgPD0gZzsgaysrKSB7CisJCWEgPSBjW2tdOworCQl3aGlsZSAoYS0tKSB7CisJCQkvKiBoZXJlIGkgaXMgdGhlIEh1ZmZtYW4gY29kZSBvZiBsZW5ndGggayBiaXRzIGZvciB2YWx1ZSAqcCAqLworCQkJLyogbWFrZSB0YWJsZXMgdXAgdG8gcmVxdWlyZWQgbGV2ZWwgKi8KKwkJCXdoaWxlIChrID4gd3NbaHRsICsgMV0pIHsKKwkJCQl3ID0gd3NbKytodGxdOworCisJCQkJLyogY29tcHV0ZSBtaW5pbXVtIHNpemUgdGFibGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICptIGJpdHMgKi8KKwkJCQl6ID0gZyAtIHc7CisJCQkJeiA9IHogPiAqbSA/ICptIDogejsgLyogdXBwZXIgbGltaXQgb24gdGFibGUgc2l6ZSAqLworCQkJCWogPSBrIC0gdzsKKwkJCQlmID0gMSA8PCBqOworCQkJCWlmIChmID4gYSArIDEpIHsgLyogdHJ5IGEgay13IGJpdCB0YWJsZSAqLworCQkJCQkvKiB0b28gZmV3IGNvZGVzIGZvciBrLXcgYml0IHRhYmxlICovCisJCQkJCWYgLT0gYSArIDE7IC8qIGRlZHVjdCBjb2RlcyBmcm9tIHBhdHRlcm5zIGxlZnQgKi8KKwkJCQkJeHAgPSBjICsgazsKKwkJCQkJd2hpbGUgKCsraiA8IHopIHsgLyogdHJ5IHNtYWxsZXIgdGFibGVzIHVwIHRvIHogYml0cyAqLworCQkJCQkJZiA8PD0gMTsKKwkJCQkJCWlmIChmIDw9ICorK3hwKSB7CisJCQkJCQkJYnJlYWs7IC8qIGVub3VnaCBjb2RlcyB0byB1c2UgdXAgaiBiaXRzICovCisJCQkJCQl9CisJCQkJCQlmIC09ICp4cDsgLyogZWxzZSBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyAqLworCQkJCQl9CisJCQkJfQorCQkJCWogPSAodyArIGogPiBlb2JfbGVuICYmIHcgPCBlb2JfbGVuKSA/IGVvYl9sZW4gLSB3IDogajsJLyogbWFrZSBFT0IgY29kZSBlbmQgYXQgdGFibGUgKi8KKwkJCQl6ID0gMSA8PCBqOwkvKiB0YWJsZSBlbnRyaWVzIGZvciBqLWJpdCB0YWJsZSAqLworCQkJCXdzW2h0bCsxXSA9IHcgKyBqOwkvKiBzZXQgYml0cyBkZWNvZGVkIGluIHN0YWNrICovCisKKwkJCQkvKiBhbGxvY2F0ZSBhbmQgbGluayBpbiBuZXcgdGFibGUgKi8KKwkJCQlxID0geHphbGxvYygoeiArIDEpICogc2l6ZW9mKGh1ZnRfdCkpOworCQkJCSp0ID0gcSArIDE7CS8qIGxpbmsgdG8gbGlzdCBmb3IgaHVmdF9mcmVlKCkgKi8KKwkJCQl0ID0gJihxLT52LnQpOworCQkJCXVbaHRsXSA9ICsrcTsJLyogdGFibGUgc3RhcnRzIGFmdGVyIGxpbmsgKi8KKworCQkJCS8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSwgaWYgdGhlcmUgaXMgb25lICovCisJCQkJaWYgKGh0bCkgeworCQkJCQl4W2h0bF0gPSBpOyAvKiBzYXZlIHBhdHRlcm4gZm9yIGJhY2tpbmcgdXAgKi8KKwkJCQkJci5iID0gKHVuc2lnbmVkIGNoYXIpICh3IC0gd3NbaHRsIC0gMV0pOyAvKiBiaXRzIHRvIGR1bXAgYmVmb3JlIHRoaXMgdGFibGUgKi8KKwkJCQkJci5lID0gKHVuc2lnbmVkIGNoYXIpICgxNiArIGopOyAvKiBiaXRzIGluIHRoaXMgdGFibGUgKi8KKwkJCQkJci52LnQgPSBxOyAvKiBwb2ludGVyIHRvIHRoaXMgdGFibGUgKi8KKwkJCQkJaiA9IChpICYgKCgxIDw8IHcpIC0gMSkpID4+IHdzW2h0bCAtIDFdOworCQkJCQl1W2h0bCAtIDFdW2pdID0gcjsgLyogY29ubmVjdCB0byBsYXN0IHRhYmxlICovCisJCQkJfQorCQkJfQorCisJCQkvKiBzZXQgdXAgdGFibGUgZW50cnkgaW4gciAqLworCQkJci5iID0gKHVuc2lnbmVkIGNoYXIpIChrIC0gdyk7CisJCQlpZiAocCA+PSB2ICsgbikgeworCQkJCXIuZSA9IDk5OyAvKiBvdXQgb2YgdmFsdWVzLS1pbnZhbGlkIGNvZGUgKi8KKwkJCX0gZWxzZSBpZiAoKnAgPCBzKSB7CisJCQkJci5lID0gKHVuc2lnbmVkIGNoYXIpICgqcCA8IDI1NiA/IDE2IDogMTUpOwkvKiAyNTYgaXMgRU9CIGNvZGUgKi8KKwkJCQlyLnYubiA9ICh1bnNpZ25lZCBzaG9ydCkgKCpwKyspOyAvKiBzaW1wbGUgY29kZSBpcyBqdXN0IHRoZSB2YWx1ZSAqLworCQkJfSBlbHNlIHsKKwkJCQlyLmUgPSAodW5zaWduZWQgY2hhcikgZVsqcCAtIHNdOyAvKiBub24tc2ltcGxlLS1sb29rIHVwIGluIGxpc3RzICovCisJCQkJci52Lm4gPSBkWypwKysgLSBzXTsKKwkJCX0KKworCQkJLyogZmlsbCBjb2RlLWxpa2UgZW50cmllcyB3aXRoIHIgKi8KKwkJCWYgPSAxIDw8IChrIC0gdyk7CisJCQlmb3IgKGogPSBpID4+IHc7IGogPCB6OyBqICs9IGYpIHsKKwkJCQlxW2pdID0gcjsKKwkJCX0KKworCQkJLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgay1iaXQgY29kZSBpICovCisJCQlmb3IgKGogPSAxIDw8IChrIC0gMSk7IGkgJiBqOyBqID4+PSAxKSB7CisJCQkJaSBePSBqOworCQkJfQorCQkJaSBePSBqOworCisJCQkvKiBiYWNrdXAgb3ZlciBmaW5pc2hlZCB0YWJsZXMgKi8KKwkJCXdoaWxlICgoaSAmICgoMSA8PCB3KSAtIDEpKSAhPSB4W2h0bF0pIHsKKwkJCQl3ID0gd3NbLS1odGxdOworCQkJfQorCQl9CisJfQorCisJLyogcmV0dXJuIGFjdHVhbCBzaXplIG9mIGJhc2UgdGFibGUgKi8KKwkqbSA9IHdzWzFdOworCisJLyogUmV0dXJuIDEgaWYgd2Ugd2VyZSBnaXZlbiBhbiBpbmNvbXBsZXRlIHRhYmxlICovCisJcmV0dXJuIHkgIT0gMCAmJiBnICE9IDE7Cit9CisKKworLyoKKyAqIGluZmxhdGUgKGRlY29tcHJlc3MpIHRoZSBjb2RlcyBpbiBhIGRlZmxhdGVkIChjb21wcmVzc2VkKSBibG9jay4KKyAqIFJldHVybiBhbiBlcnJvciBjb2RlIG9yIHplcm8gaWYgaXQgYWxsIGdvZXMgb2suCisgKgorICogdGwsIHRkOiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RlciB0YWJsZXMKKyAqIGJsLCBiZDogbnVtYmVyIG9mIGJpdHMgZGVjb2RlZCBieSB0bFtdIGFuZCB0ZFtdCisgKi8KKy8qIGNhbGxlZCBvbmNlIGZyb20gaW5mbGF0ZV9ibG9jayAqLworCisvKiBtYXAgZm9ybWVybHkgbG9jYWwgc3RhdGljIHZhcmlhYmxlcyB0byBnbG9iYWxzICovCisjZGVmaW5lIG1sIGluZmxhdGVfY29kZXNfbWwKKyNkZWZpbmUgbWQgaW5mbGF0ZV9jb2Rlc19tZAorI2RlZmluZSBiYiBpbmZsYXRlX2NvZGVzX2JiCisjZGVmaW5lIGsgIGluZmxhdGVfY29kZXNfaworI2RlZmluZSB3ICBpbmZsYXRlX2NvZGVzX3cKKyNkZWZpbmUgdGwgaW5mbGF0ZV9jb2Rlc190bAorI2RlZmluZSB0ZCBpbmZsYXRlX2NvZGVzX3RkCisjZGVmaW5lIGJsIGluZmxhdGVfY29kZXNfYmwKKyNkZWZpbmUgYmQgaW5mbGF0ZV9jb2Rlc19iZAorI2RlZmluZSBubiBpbmZsYXRlX2NvZGVzX25uCisjZGVmaW5lIGRkIGluZmxhdGVfY29kZXNfZGQKK3N0YXRpYyB2b2lkIGluZmxhdGVfY29kZXNfc2V0dXAoU1RBVEVfUEFSQU0gdW5zaWduZWQgbXlfYmwsIHVuc2lnbmVkIG15X2JkKQoreworCWJsID0gbXlfYmw7CisJYmQgPSBteV9iZDsKKwkvKiBtYWtlIGxvY2FsIGNvcGllcyBvZiBnbG9iYWxzICovCisJYmIgPSBndW56aXBfYmI7CQkJLyogaW5pdGlhbGl6ZSBiaXQgYnVmZmVyICovCisJayA9IGd1bnppcF9iazsKKwl3ID0gZ3VuemlwX291dGJ1Zl9jb3VudDsJLyogaW5pdGlhbGl6ZSBndW56aXBfd2luZG93IHBvc2l0aW9uICovCisJLyogaW5mbGF0ZSB0aGUgY29kZWQgZGF0YSAqLworCW1sID0gbWFza19iaXRzW2JsXTsJCS8qIHByZWNvbXB1dGUgbWFza3MgZm9yIHNwZWVkICovCisJbWQgPSBtYXNrX2JpdHNbYmRdOworfQorLyogY2FsbGVkIG9uY2UgZnJvbSBpbmZsYXRlX2dldF9uZXh0X3dpbmRvdyAqLworc3RhdGljIE5PSU5MSU5FIGludCBpbmZsYXRlX2NvZGVzKFNUQVRFX1BBUkFNX09OTFkpCit7CisJdW5zaWduZWQgZTsJLyogdGFibGUgZW50cnkgZmxhZy9udW1iZXIgb2YgZXh0cmEgYml0cyAqLworCWh1ZnRfdCAqdDsJLyogcG9pbnRlciB0byB0YWJsZSBlbnRyeSAqLworCisJaWYgKHJlc3VtZV9jb3B5KQorCQlnb3RvIGRvX2NvcHk7CisKKwl3aGlsZSAoMSkgewkJCS8qIGRvIHVudGlsIGVuZCBvZiBibG9jayAqLworCQliYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYmIsICZrLCBibCk7CisJCXQgPSB0bCArICgodW5zaWduZWQpIGJiICYgbWwpOworCQllID0gdC0+ZTsKKwkJaWYgKGUgPiAxNikKKwkJCWRvIHsKKwkJCQlpZiAoZSA9PSA5OSkKKwkJCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTs7CisJCQkJYmIgPj49IHQtPmI7CisJCQkJayAtPSB0LT5iOworCQkJCWUgLT0gMTY7CisJCQkJYmIgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJiLCAmaywgZSk7CisJCQkJdCA9IHQtPnYudCArICgodW5zaWduZWQpIGJiICYgbWFza19iaXRzW2VdKTsKKwkJCQllID0gdC0+ZTsKKwkJCX0gd2hpbGUgKGUgPiAxNik7CisJCWJiID4+PSB0LT5iOworCQlrIC09IHQtPmI7CisJCWlmIChlID09IDE2KSB7CS8qIHRoZW4gaXQncyBhIGxpdGVyYWwgKi8KKwkJCWd1bnppcF93aW5kb3dbdysrXSA9ICh1bnNpZ25lZCBjaGFyKSB0LT52Lm47CisJCQlpZiAodyA9PSBHVU5aSVBfV1NJWkUpIHsKKwkJCQlndW56aXBfb3V0YnVmX2NvdW50ID0gdzsKKwkJCQkvL2ZsdXNoX2d1bnppcF93aW5kb3coKTsKKwkJCQl3ID0gMDsKKwkJCQlyZXR1cm4gMTsgLy8gV2UgaGF2ZSBhIGJsb2NrIHRvIHJlYWQKKwkJCX0KKwkJfSBlbHNlIHsJCS8qIGl0J3MgYW4gRU9CIG9yIGEgbGVuZ3RoICovCisJCQkvKiBleGl0IGlmIGVuZCBvZiBibG9jayAqLworCQkJaWYgKGUgPT0gMTUpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogZ2V0IGxlbmd0aCBvZiBibG9jayB0byBjb3B5ICovCisJCQliYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYmIsICZrLCBlKTsKKwkJCW5uID0gdC0+di5uICsgKCh1bnNpZ25lZCkgYmIgJiBtYXNrX2JpdHNbZV0pOworCQkJYmIgPj49IGU7CisJCQlrIC09IGU7CisKKwkJCS8qIGRlY29kZSBkaXN0YW5jZSBvZiBibG9jayB0byBjb3B5ICovCisJCQliYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYmIsICZrLCBiZCk7CisJCQl0ID0gdGQgKyAoKHVuc2lnbmVkKSBiYiAmIG1kKTsKKwkJCWUgPSB0LT5lOworCQkJaWYgKGUgPiAxNikKKwkJCQlkbyB7CisJCQkJCWlmIChlID09IDk5KQorCQkJCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsKKwkJCQkJYmIgPj49IHQtPmI7CisJCQkJCWsgLT0gdC0+YjsKKwkJCQkJZSAtPSAxNjsKKwkJCQkJYmIgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJiLCAmaywgZSk7CisJCQkJCXQgPSB0LT52LnQgKyAoKHVuc2lnbmVkKSBiYiAmIG1hc2tfYml0c1tlXSk7CisJCQkJCWUgPSB0LT5lOworCQkJCX0gd2hpbGUgKGUgPiAxNik7CisJCQliYiA+Pj0gdC0+YjsKKwkJCWsgLT0gdC0+YjsKKwkJCWJiID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiYiwgJmssIGUpOworCQkJZGQgPSB3IC0gdC0+di5uIC0gKCh1bnNpZ25lZCkgYmIgJiBtYXNrX2JpdHNbZV0pOworCQkJYmIgPj49IGU7CisJCQlrIC09IGU7CisKKwkJCS8qIGRvIHRoZSBjb3B5ICovCisgZG9fY29weToKKwkJCWRvIHsKKwkJCQkvKiBXYXM6IG5uIC09IChlID0gKGUgPSBHVU5aSVBfV1NJWkUgLSAoKGRkICY9IEdVTlpJUF9XU0laRSAtIDEpID4gdyA/IGRkIDogdykpID4gbm4gPyBubiA6IGUpOyAqLworCQkJCS8qIFdobyB3cm90ZSBUSEFUPz8gcmV3cml0dGVuIGFzOiAqLworCQkJCXVuc2lnbmVkIGRlbHRhOworCisJCQkJZGQgJj0gR1VOWklQX1dTSVpFIC0gMTsKKwkJCQllID0gR1VOWklQX1dTSVpFIC0gKGRkID4gdyA/IGRkIDogdyk7CisJCQkJZGVsdGEgPSB3ID4gZGQgPyB3IC0gZGQgOiBkZCAtIHc7CisJCQkJaWYgKGUgPiBubikgZSA9IG5uOworCQkJCW5uIC09IGU7CisKKwkJCQkvKiBjb3B5IHRvIG5ldyBidWZmZXIgdG8gcHJldmVudCBwb3NzaWJsZSBvdmVyd3JpdGUgKi8KKwkJCQlpZiAoZGVsdGEgPj0gZSkgeworCQkJCQltZW1jcHkoZ3VuemlwX3dpbmRvdyArIHcsIGd1bnppcF93aW5kb3cgKyBkZCwgZSk7CisJCQkJCXcgKz0gZTsKKwkJCQkJZGQgKz0gZTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBkbyBpdCBzbG93IHRvIGF2b2lkIG1lbWNweSgpIG92ZXJsYXAgKi8KKwkJCQkJLyogIU5PTUVNQ1BZICovCisJCQkJCWRvIHsKKwkJCQkJCWd1bnppcF93aW5kb3dbdysrXSA9IGd1bnppcF93aW5kb3dbZGQrK107CisJCQkJCX0gd2hpbGUgKC0tZSk7CisJCQkJfQorCQkJCWlmICh3ID09IEdVTlpJUF9XU0laRSkgeworCQkJCQlndW56aXBfb3V0YnVmX2NvdW50ID0gdzsKKwkJCQkJcmVzdW1lX2NvcHkgPSAobm4gIT0gMCk7CisJCQkJCS8vZmx1c2hfZ3VuemlwX3dpbmRvdygpOworCQkJCQl3ID0gMDsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfSB3aGlsZSAobm4pOworCQkJcmVzdW1lX2NvcHkgPSAwOworCQl9CisJfQorCisJLyogcmVzdG9yZSB0aGUgZ2xvYmFscyBmcm9tIHRoZSBsb2NhbHMgKi8KKwlndW56aXBfb3V0YnVmX2NvdW50ID0gdzsJLyogcmVzdG9yZSBnbG9iYWwgZ3VuemlwX3dpbmRvdyBwb2ludGVyICovCisJZ3VuemlwX2JiID0gYmI7CQkJLyogcmVzdG9yZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworCWd1bnppcF9iayA9IGs7CisKKwkvKiBub3JtYWxseSBqdXN0IGFmdGVyIGNhbGwgdG8gaW5mbGF0ZV9jb2RlcywgYnV0IHNhdmUgY29kZSBieSBwdXR0aW5nIGl0IGhlcmUgKi8KKwkvKiBmcmVlIHRoZSBkZWNvZGluZyB0YWJsZXMgKHRsIGFuZCB0ZCksIHJldHVybiAqLworCWh1ZnRfZnJlZV9hbGwoUEFTU19TVEFURV9PTkxZKTsKKworCS8qIGRvbmUgKi8KKwlyZXR1cm4gMDsKK30KKyN1bmRlZiBtbAorI3VuZGVmIG1kCisjdW5kZWYgYmIKKyN1bmRlZiBrCisjdW5kZWYgdworI3VuZGVmIHRsCisjdW5kZWYgdGQKKyN1bmRlZiBibAorI3VuZGVmIGJkCisjdW5kZWYgbm4KKyN1bmRlZiBkZAorCisKKy8qIGNhbGxlZCBvbmNlIGZyb20gaW5mbGF0ZV9ibG9jayAqLworc3RhdGljIHZvaWQgaW5mbGF0ZV9zdG9yZWRfc2V0dXAoU1RBVEVfUEFSQU0gaW50IG15X24sIGludCBteV9iLCBpbnQgbXlfaykKK3sKKwlpbmZsYXRlX3N0b3JlZF9uID0gbXlfbjsKKwlpbmZsYXRlX3N0b3JlZF9iID0gbXlfYjsKKwlpbmZsYXRlX3N0b3JlZF9rID0gbXlfazsKKwkvKiBpbml0aWFsaXplIGd1bnppcF93aW5kb3cgcG9zaXRpb24gKi8KKwlpbmZsYXRlX3N0b3JlZF93ID0gZ3VuemlwX291dGJ1Zl9jb3VudDsKK30KKy8qIGNhbGxlZCBvbmNlIGZyb20gaW5mbGF0ZV9nZXRfbmV4dF93aW5kb3cgKi8KK3N0YXRpYyBpbnQgaW5mbGF0ZV9zdG9yZWQoU1RBVEVfUEFSQU1fT05MWSkKK3sKKwkvKiByZWFkIGFuZCBvdXRwdXQgdGhlIGNvbXByZXNzZWQgZGF0YSAqLworCXdoaWxlIChpbmZsYXRlX3N0b3JlZF9uLS0pIHsKKwkJaW5mbGF0ZV9zdG9yZWRfYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgaW5mbGF0ZV9zdG9yZWRfYiwgJmluZmxhdGVfc3RvcmVkX2ssIDgpOworCQlndW56aXBfd2luZG93W2luZmxhdGVfc3RvcmVkX3crK10gPSAodW5zaWduZWQgY2hhcikgaW5mbGF0ZV9zdG9yZWRfYjsKKwkJaWYgKGluZmxhdGVfc3RvcmVkX3cgPT0gR1VOWklQX1dTSVpFKSB7CisJCQlndW56aXBfb3V0YnVmX2NvdW50ID0gaW5mbGF0ZV9zdG9yZWRfdzsKKwkJCS8vZmx1c2hfZ3VuemlwX3dpbmRvdygpOworCQkJaW5mbGF0ZV9zdG9yZWRfdyA9IDA7CisJCQlpbmZsYXRlX3N0b3JlZF9iID4+PSA4OworCQkJaW5mbGF0ZV9zdG9yZWRfayAtPSA4OworCQkJcmV0dXJuIDE7IC8qIFdlIGhhdmUgYSBibG9jayAqLworCQl9CisJCWluZmxhdGVfc3RvcmVkX2IgPj49IDg7CisJCWluZmxhdGVfc3RvcmVkX2sgLT0gODsKKwl9CisKKwkvKiByZXN0b3JlIHRoZSBnbG9iYWxzIGZyb20gdGhlIGxvY2FscyAqLworCWd1bnppcF9vdXRidWZfY291bnQgPSBpbmZsYXRlX3N0b3JlZF93OwkJLyogcmVzdG9yZSBnbG9iYWwgZ3VuemlwX3dpbmRvdyBwb2ludGVyICovCisJZ3VuemlwX2JiID0gaW5mbGF0ZV9zdG9yZWRfYjsJLyogcmVzdG9yZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworCWd1bnppcF9iayA9IGluZmxhdGVfc3RvcmVkX2s7CisJcmV0dXJuIDA7IC8qIEZpbmlzaGVkICovCit9CisKKworLyoKKyAqIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgYmxvY2sKKyAqIGU6IGxhc3QgYmxvY2sgZmxhZworICoKKyAqIEdMT0JBTCBWQVJJQUJMRVM6IGJiLCBraywKKyAqLworLyogUmV0dXJuIHZhbHVlczogLTEgPSBpbmZsYXRlX3N0b3JlZCwgLTIgPSBpbmZsYXRlX2NvZGVzICovCisvKiBPbmUgY2FsbHNpdGUgaW4gaW5mbGF0ZV9nZXRfbmV4dF93aW5kb3cgKi8KK3N0YXRpYyBpbnQgaW5mbGF0ZV9ibG9jayhTVEFURV9QQVJBTSBzbWFsbGludCAqZSkKK3sKKwl1bnNpZ25lZCBsbFsyODYgKyAzMF07ICAvKiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisJdW5zaWduZWQgdDsgICAgIC8qIGJsb2NrIHR5cGUgKi8KKwl1bnNpZ25lZCBiOyAgICAgLyogYml0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGs7ICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKwkvKiBtYWtlIGxvY2FsIGJpdCBidWZmZXIgKi8KKworCWIgPSBndW56aXBfYmI7CisJayA9IGd1bnppcF9iazsKKworCS8qIHJlYWQgaW4gbGFzdCBibG9jayBiaXQgKi8KKwliID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiLCAmaywgMSk7CisJKmUgPSBiICYgMTsKKwliID4+PSAxOworCWsgLT0gMTsKKworCS8qIHJlYWQgaW4gYmxvY2sgdHlwZSAqLworCWIgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGIsICZrLCAyKTsKKwl0ID0gKHVuc2lnbmVkKSBiICYgMzsKKwliID4+PSAyOworCWsgLT0gMjsKKworCS8qIHJlc3RvcmUgdGhlIGdsb2JhbCBiaXQgYnVmZmVyICovCisJZ3VuemlwX2JiID0gYjsKKwlndW56aXBfYmsgPSBrOworCisJLyogRG8gd2Ugc2VlIGJsb2NrIHR5cGUgMSBvZnRlbj8gWWVzIQorCSAqIFRPRE86IGZpeCBwZXJmb3JtYW5jZSBwcm9ibGVtIChzZWUgYmVsb3cpICovCisJLy9iYl9lcnJvcl9tc2coImJsa3R5cGUgJWQiLCB0KTsKKworCS8qIGluZmxhdGUgdGhhdCBibG9jayB0eXBlICovCisJc3dpdGNoICh0KSB7CisJY2FzZSAwOiAvKiBJbmZsYXRlIHN0b3JlZCAqLworCXsKKwkJdW5zaWduZWQgbjsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGJsb2NrICovCisJCXVuc2lnbmVkIGJfc3RvcmVkOwkvKiBiaXQgYnVmZmVyICovCisJCXVuc2lnbmVkIGtfc3RvcmVkOwkvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKwkJLyogbWFrZSBsb2NhbCBjb3BpZXMgb2YgZ2xvYmFscyAqLworCQliX3N0b3JlZCA9IGd1bnppcF9iYjsJLyogaW5pdGlhbGl6ZSBiaXQgYnVmZmVyICovCisJCWtfc3RvcmVkID0gZ3VuemlwX2JrOworCisJCS8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi8KKwkJbiA9IGtfc3RvcmVkICYgNzsKKwkJYl9zdG9yZWQgPj49IG47CisJCWtfc3RvcmVkIC09IG47CisKKwkJLyogZ2V0IHRoZSBsZW5ndGggYW5kIGl0cyBjb21wbGVtZW50ICovCisJCWJfc3RvcmVkID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX3N0b3JlZCwgJmtfc3RvcmVkLCAxNik7CisJCW4gPSAoKHVuc2lnbmVkKSBiX3N0b3JlZCAmIDB4ZmZmZik7CisJCWJfc3RvcmVkID4+PSAxNjsKKwkJa19zdG9yZWQgLT0gMTY7CisKKwkJYl9zdG9yZWQgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfc3RvcmVkLCAma19zdG9yZWQsIDE2KTsKKwkJaWYgKG4gIT0gKHVuc2lnbmVkKSAoKH5iX3N0b3JlZCkgJiAweGZmZmYpKSB7CisJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOwkvKiBlcnJvciBpbiBjb21wcmVzc2VkIGRhdGEgKi8KKwkJfQorCQliX3N0b3JlZCA+Pj0gMTY7CisJCWtfc3RvcmVkIC09IDE2OworCisJCWluZmxhdGVfc3RvcmVkX3NldHVwKFBBU1NfU1RBVEUgbiwgYl9zdG9yZWQsIGtfc3RvcmVkKTsKKworCQlyZXR1cm4gLTE7CisJfQorCWNhc2UgMToKKwkvKiBJbmZsYXRlIGZpeGVkCisJICogZGVjb21wcmVzcyBhbiBpbmZsYXRlZCB0eXBlIDEgKGZpeGVkIEh1ZmZtYW4gY29kZXMpIGJsb2NrLiBXZSBzaG91bGQKKwkgKiBlaXRoZXIgcmVwbGFjZSB0aGlzIHdpdGggYSBjdXN0b20gZGVjb2Rlciwgb3IgYXQgbGVhc3QgcHJlY29tcHV0ZSB0aGUKKwkgKiBIdWZmbWFuIHRhYmxlcy4gVE9ETyAqLworCXsKKwkJaW50IGk7ICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCisJCXVuc2lnbmVkIGJsOyAgICAgICAgICAgIC8qIGxvb2t1cCBiaXRzIGZvciB0bCAqLworCQl1bnNpZ25lZCBiZDsgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGQgKi8KKwkJLyogZ2NjIDQuMi4xIGlzIHRvbyBkdW1iIHRvIHJldXNlIHN0YWNrc3BhY2UuIE1vdmVkIHVwLi4uICovCisJCS8vdW5zaWduZWQgbGxbMjg4XTsgICAgIC8qIGxlbmd0aCBsaXN0IGZvciBodWZ0X2J1aWxkICovCisKKwkJLyogc2V0IHVwIGxpdGVyYWwgdGFibGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IDE0NDsgaSsrKQorCQkJbGxbaV0gPSA4OworCQlmb3IgKDsgaSA8IDI1NjsgaSsrKQorCQkJbGxbaV0gPSA5OworCQlmb3IgKDsgaSA8IDI4MDsgaSsrKQorCQkJbGxbaV0gPSA3OworCQlmb3IgKDsgaSA8IDI4ODsgaSsrKSAvKiBtYWtlIGEgY29tcGxldGUsIGJ1dCB3cm9uZyBjb2RlIHNldCAqLworCQkJbGxbaV0gPSA4OworCQlibCA9IDc7CisJCWh1ZnRfYnVpbGQobGwsIDI4OCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgJmluZmxhdGVfY29kZXNfdGwsICZibCk7CisJCS8qIGh1ZnRfYnVpbGQoKSBuZXZlciByZXR1cm4gbm9uemVybyAtIHdlIHVzZSBrbm93biBkYXRhICovCisKKwkJLyogc2V0IHVwIGRpc3RhbmNlIHRhYmxlICovCisJCWZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSAvKiBtYWtlIGFuIGluY29tcGxldGUgY29kZSBzZXQgKi8KKwkJCWxsW2ldID0gNTsKKwkJYmQgPSA1OworCQlodWZ0X2J1aWxkKGxsLCAzMCwgMCwgY3BkaXN0LCBjcGRleHQsICZpbmZsYXRlX2NvZGVzX3RkLCAmYmQpOworCisJCS8qIHNldCB1cCBkYXRhIGZvciBpbmZsYXRlX2NvZGVzKCkgKi8KKwkJaW5mbGF0ZV9jb2Rlc19zZXR1cChQQVNTX1NUQVRFIGJsLCBiZCk7CisKKwkJLyogaHVmdF9mcmVlIGNvZGUgbW92ZWQgaW50byBpbmZsYXRlX2NvZGVzICovCisKKwkJcmV0dXJuIC0yOworCX0KKwljYXNlIDI6IC8qIEluZmxhdGUgZHluYW1pYyAqLworCXsKKwkJZW51bSB7IGRiaXRzID0gNiB9OyAgICAgLyogYml0cyBpbiBiYXNlIGRpc3RhbmNlIGxvb2t1cCB0YWJsZSAqLworCQllbnVtIHsgbGJpdHMgPSA5IH07ICAgICAvKiBiaXRzIGluIGJhc2UgbGl0ZXJhbC9sZW5ndGggbG9va3VwIHRhYmxlICovCisKKwkJaHVmdF90ICp0ZDsgICAgICAgICAgICAgLyogZGlzdGFuY2UgY29kZSB0YWJsZSAqLworCQl1bnNpZ25lZCBpOyAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisJCXVuc2lnbmVkIGo7CisJCXVuc2lnbmVkIGw7ICAgICAgICAgICAgIC8qIGxhc3QgbGVuZ3RoICovCisJCXVuc2lnbmVkIG07ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGJpdCBsZW5ndGhzIHRhYmxlICovCisJCXVuc2lnbmVkIG47ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGhzIHRvIGdldCAqLworCQl1bnNpZ25lZCBibDsgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGwgKi8KKwkJdW5zaWduZWQgYmQ7ICAgICAgICAgICAgLyogbG9va3VwIGJpdHMgZm9yIHRkICovCisJCXVuc2lnbmVkIG5iOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzICovCisJCXVuc2lnbmVkIG5sOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLworCQl1bnNpZ25lZCBuZDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKworCQkvL3Vuc2lnbmVkIGxsWzI4NiArIDMwXTsvKiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisJCXVuc2lnbmVkIGJfZHluYW1pYzsgICAgIC8qIGJpdCBidWZmZXIgKi8KKwkJdW5zaWduZWQga19keW5hbWljOyAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisJCS8qIG1ha2UgbG9jYWwgYml0IGJ1ZmZlciAqLworCQliX2R5bmFtaWMgPSBndW56aXBfYmI7CisJCWtfZHluYW1pYyA9IGd1bnppcF9iazsKKworCQkvKiByZWFkIGluIHRhYmxlIGxlbmd0aHMgKi8KKwkJYl9keW5hbWljID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX2R5bmFtaWMsICZrX2R5bmFtaWMsIDUpOworCQlubCA9IDI1NyArICgodW5zaWduZWQpIGJfZHluYW1pYyAmIDB4MWYpOwkvKiBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KKworCQliX2R5bmFtaWMgPj49IDU7CisJCWtfZHluYW1pYyAtPSA1OworCQliX2R5bmFtaWMgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfZHluYW1pYywgJmtfZHluYW1pYywgNSk7CisJCW5kID0gMSArICgodW5zaWduZWQpIGJfZHluYW1pYyAmIDB4MWYpOwkvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKworCQliX2R5bmFtaWMgPj49IDU7CisJCWtfZHluYW1pYyAtPSA1OworCQliX2R5bmFtaWMgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfZHluYW1pYywgJmtfZHluYW1pYywgNCk7CisJCW5iID0gNCArICgodW5zaWduZWQpIGJfZHluYW1pYyAmIDB4Zik7CS8qIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzICovCisKKwkJYl9keW5hbWljID4+PSA0OworCQlrX2R5bmFtaWMgLT0gNDsKKwkJaWYgKG5sID4gMjg2IHx8IG5kID4gMzApCisJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOwkvKiBiYWQgbGVuZ3RocyAqLworCisJCS8qIHJlYWQgaW4gYml0LWxlbmd0aC1jb2RlIGxlbmd0aHMgKi8KKwkJZm9yIChqID0gMDsgaiA8IG5iOyBqKyspIHsKKwkJCWJfZHluYW1pYyA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9keW5hbWljLCAma19keW5hbWljLCAzKTsKKwkJCWxsW2JvcmRlcltqXV0gPSAodW5zaWduZWQpIGJfZHluYW1pYyAmIDc7CisJCQliX2R5bmFtaWMgPj49IDM7CisJCQlrX2R5bmFtaWMgLT0gMzsKKwkJfQorCQlmb3IgKDsgaiA8IDE5OyBqKyspCisJCQlsbFtib3JkZXJbal1dID0gMDsKKworCQkvKiBidWlsZCBkZWNvZGluZyB0YWJsZSBmb3IgdHJlZXMgLSBzaW5nbGUgbGV2ZWwsIDcgYml0IGxvb2t1cCAqLworCQlibCA9IDc7CisJCWkgPSBodWZ0X2J1aWxkKGxsLCAxOSwgMTksIE5VTEwsIE5VTEwsICZpbmZsYXRlX2NvZGVzX3RsLCAmYmwpOworCQlpZiAoaSAhPSAwKSB7CisJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOyAvL3JldHVybiBpOwkvKiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCisJCX0KKworCQkvKiByZWFkIGluIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworCQluID0gbmwgKyBuZDsKKwkJbSA9IG1hc2tfYml0c1tibF07CisJCWkgPSBsID0gMDsKKwkJd2hpbGUgKCh1bnNpZ25lZCkgaSA8IG4pIHsKKwkJCWJfZHluYW1pYyA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9keW5hbWljLCAma19keW5hbWljLCAodW5zaWduZWQpYmwpOworCQkJdGQgPSBpbmZsYXRlX2NvZGVzX3RsICsgKCh1bnNpZ25lZCkgYl9keW5hbWljICYgbSk7CisJCQlqID0gdGQtPmI7CisJCQliX2R5bmFtaWMgPj49IGo7CisJCQlrX2R5bmFtaWMgLT0gajsKKwkJCWogPSB0ZC0+di5uOworCQkJaWYgKGogPCAxNikgewkvKiBsZW5ndGggb2YgY29kZSBpbiBiaXRzICgwLi4xNSkgKi8KKwkJCQlsbFtpKytdID0gbCA9IGo7CS8qIHNhdmUgbGFzdCBsZW5ndGggaW4gbCAqLworCQkJfSBlbHNlIGlmIChqID09IDE2KSB7CS8qIHJlcGVhdCBsYXN0IGxlbmd0aCAzIHRvIDYgdGltZXMgKi8KKwkJCQliX2R5bmFtaWMgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfZHluYW1pYywgJmtfZHluYW1pYywgMik7CisJCQkJaiA9IDMgKyAoKHVuc2lnbmVkKSBiX2R5bmFtaWMgJiAzKTsKKwkJCQliX2R5bmFtaWMgPj49IDI7CisJCQkJa19keW5hbWljIC09IDI7CisJCQkJaWYgKCh1bnNpZ25lZCkgaSArIGogPiBuKSB7CisJCQkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7IC8vcmV0dXJuIDE7CisJCQkJfQorCQkJCXdoaWxlIChqLS0pIHsKKwkJCQkJbGxbaSsrXSA9IGw7CisJCQkJfQorCQkJfSBlbHNlIGlmIChqID09IDE3KSB7CS8qIDMgdG8gMTAgemVybyBsZW5ndGggY29kZXMgKi8KKwkJCQliX2R5bmFtaWMgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfZHluYW1pYywgJmtfZHluYW1pYywgMyk7CisJCQkJaiA9IDMgKyAoKHVuc2lnbmVkKSBiX2R5bmFtaWMgJiA3KTsKKwkJCQliX2R5bmFtaWMgPj49IDM7CisJCQkJa19keW5hbWljIC09IDM7CisJCQkJaWYgKCh1bnNpZ25lZCkgaSArIGogPiBuKSB7CisJCQkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7IC8vcmV0dXJuIDE7CisJCQkJfQorCQkJCXdoaWxlIChqLS0pIHsKKwkJCQkJbGxbaSsrXSA9IDA7CisJCQkJfQorCQkJCWwgPSAwOworCQkJfSBlbHNlIHsJLyogaiA9PSAxODogMTEgdG8gMTM4IHplcm8gbGVuZ3RoIGNvZGVzICovCisJCQkJYl9keW5hbWljID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX2R5bmFtaWMsICZrX2R5bmFtaWMsIDcpOworCQkJCWogPSAxMSArICgodW5zaWduZWQpIGJfZHluYW1pYyAmIDB4N2YpOworCQkJCWJfZHluYW1pYyA+Pj0gNzsKKwkJCQlrX2R5bmFtaWMgLT0gNzsKKwkJCQlpZiAoKHVuc2lnbmVkKSBpICsgaiA+IG4pIHsKKwkJCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsgLy9yZXR1cm4gMTsKKwkJCQl9CisJCQkJd2hpbGUgKGotLSkgeworCQkJCQlsbFtpKytdID0gMDsKKwkJCQl9CisJCQkJbCA9IDA7CisJCQl9CisJCX0KKworCQkvKiBmcmVlIGRlY29kaW5nIHRhYmxlIGZvciB0cmVlcyAqLworCQlodWZ0X2ZyZWUoaW5mbGF0ZV9jb2Rlc190bCk7CisKKwkJLyogcmVzdG9yZSB0aGUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKwkJZ3VuemlwX2JiID0gYl9keW5hbWljOworCQlndW56aXBfYmsgPSBrX2R5bmFtaWM7CisKKwkJLyogYnVpbGQgdGhlIGRlY29kaW5nIHRhYmxlcyBmb3IgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGVzICovCisJCWJsID0gbGJpdHM7CisKKwkJaSA9IGh1ZnRfYnVpbGQobGwsIG5sLCAyNTcsIGNwbGVucywgY3BsZXh0LCAmaW5mbGF0ZV9jb2Rlc190bCwgJmJsKTsKKwkJaWYgKGkgIT0gMCkKKwkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7CisJCWJkID0gZGJpdHM7CisJCWkgPSBodWZ0X2J1aWxkKGxsICsgbmwsIG5kLCAwLCBjcGRpc3QsIGNwZGV4dCwgJmluZmxhdGVfY29kZXNfdGQsICZiZCk7CisJCWlmIChpICE9IDApCisJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOworCisJCS8qIHNldCB1cCBkYXRhIGZvciBpbmZsYXRlX2NvZGVzKCkgKi8KKwkJaW5mbGF0ZV9jb2Rlc19zZXR1cChQQVNTX1NUQVRFIGJsLCBiZCk7CisKKwkJLyogaHVmdF9mcmVlIGNvZGUgbW92ZWQgaW50byBpbmZsYXRlX2NvZGVzICovCisKKwkJcmV0dXJuIC0yOworCX0KKwlkZWZhdWx0OgorCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOworCX0KK30KKworLyogVHdvIGNhbGxzaXRlcywgYm90aCBpbiBpbmZsYXRlX2dldF9uZXh0X3dpbmRvdyAqLworc3RhdGljIHZvaWQgY2FsY3VsYXRlX2d1bnppcF9jcmMoU1RBVEVfUEFSQU1fT05MWSkKK3sKKwlndW56aXBfY3JjID0gY3JjMzJfYmxvY2tfZW5kaWFuMChndW56aXBfY3JjLCBndW56aXBfd2luZG93LCBndW56aXBfb3V0YnVmX2NvdW50LCBndW56aXBfY3JjX3RhYmxlKTsKKwlndW56aXBfYnl0ZXNfb3V0ICs9IGd1bnppcF9vdXRidWZfY291bnQ7Cit9CisKKy8qIE9uZSBjYWxsc2l0ZSBpbiBpbmZsYXRlX3VuemlwX2ludGVybmFsICovCitzdGF0aWMgaW50IGluZmxhdGVfZ2V0X25leHRfd2luZG93KFNUQVRFX1BBUkFNX09OTFkpCit7CisJZ3VuemlwX291dGJ1Zl9jb3VudCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgcmV0OworCisJCWlmIChuZWVkX2Fub3RoZXJfYmxvY2spIHsKKwkJCWlmIChlbmRfcmVhY2hlZCkgeworCQkJCWNhbGN1bGF0ZV9ndW56aXBfY3JjKFBBU1NfU1RBVEVfT05MWSk7CisJCQkJZW5kX3JlYWNoZWQgPSAwOworCQkJCS8qIE5COiBuZWVkX2Fub3RoZXJfYmxvY2sgaXMgc3RpbGwgc2V0ICovCisJCQkJcmV0dXJuIDA7IC8qIExhc3QgYmxvY2sgKi8KKwkJCX0KKwkJCW1ldGhvZCA9IGluZmxhdGVfYmxvY2soUEFTU19TVEFURSAmZW5kX3JlYWNoZWQpOworCQkJbmVlZF9hbm90aGVyX2Jsb2NrID0gMDsKKwkJfQorCisJCXN3aXRjaCAobWV0aG9kKSB7CisJCWNhc2UgLTE6CisJCQlyZXQgPSBpbmZsYXRlX3N0b3JlZChQQVNTX1NUQVRFX09OTFkpOworCQkJYnJlYWs7CisJCWNhc2UgLTI6CisJCQlyZXQgPSBpbmZsYXRlX2NvZGVzKFBBU1NfU1RBVEVfT05MWSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogY2Fubm90IGhhcHBlbiAqLworCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsKKwkJfQorCisJCWlmIChyZXQgPT0gMSkgeworCQkJY2FsY3VsYXRlX2d1bnppcF9jcmMoUEFTU19TVEFURV9PTkxZKTsKKwkJCXJldHVybiAxOyAvKiBtb3JlIGRhdGEgbGVmdCAqLworCQl9CisJCW5lZWRfYW5vdGhlcl9ibG9jayA9IDE7IC8qIGVuZCBvZiB0aGF0IGJsb2NrICovCisJfQorCS8qIERvZXNudCBnZXQgaGVyZSAqLworfQorCisKKy8qIENhbGxlZCBmcm9tIHVucGFja19nel9zdHJlYW0oKSBhbmQgaW5mbGF0ZV91bnppcCgpICovCitzdGF0aWMgSUZfREVTS1RPUChsb25nIGxvbmcpIGludAoraW5mbGF0ZV91bnppcF9pbnRlcm5hbChTVEFURV9QQVJBTSBpbnQgaW4sIGludCBvdXQpCit7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBuID0gMDsKKwlzc2l6ZV90IG53cm90ZTsKKworCS8qIEFsbG9jYXRlIGFsbCBnbG9iYWwgYnVmZmVycyAoZm9yIERZTl9BTExPQyBvcHRpb24pICovCisJZ3VuemlwX3dpbmRvdyA9IHhtYWxsb2MoR1VOWklQX1dTSVpFKTsKKwlndW56aXBfb3V0YnVmX2NvdW50ID0gMDsKKwlndW56aXBfYnl0ZXNfb3V0ID0gMDsKKwlndW56aXBfc3JjX2ZkID0gaW47CisKKwkvKiAocmUpIGluaXRpYWxpemUgc3RhdGUgKi8KKwltZXRob2QgPSAtMTsKKwluZWVkX2Fub3RoZXJfYmxvY2sgPSAxOworCXJlc3VtZV9jb3B5ID0gMDsKKwlndW56aXBfYmsgPSAwOworCWd1bnppcF9iYiA9IDA7CisKKwkvKiBDcmVhdGUgdGhlIGNyYyB0YWJsZSAqLworCWd1bnppcF9jcmNfdGFibGUgPSBjcmMzMl9maWxsdGFibGUoTlVMTCwgMCk7CisJZ3VuemlwX2NyYyA9IH4wOworCisJZXJyb3JfbXNnID0gImNvcnJ1cHRlZCBkYXRhIjsKKwlpZiAoc2V0am1wKGVycm9yX2ptcCkpIHsKKwkJLyogRXJyb3IgZnJvbSBkZWVwIGluc2lkZSB6aXAgbWFjaGluZXJ5ICovCisJCW4gPSAtMTsKKwkJZ290byByZXQ7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50IHIgPSBpbmZsYXRlX2dldF9uZXh0X3dpbmRvdyhQQVNTX1NUQVRFX09OTFkpOworCQlud3JvdGUgPSBmdWxsX3dyaXRlKG91dCwgZ3VuemlwX3dpbmRvdywgZ3VuemlwX291dGJ1Zl9jb3VudCk7CisJCWlmIChud3JvdGUgIT0gKHNzaXplX3QpZ3VuemlwX291dGJ1Zl9jb3VudCkgeworCQkJYmJfcGVycm9yX21zZygid3JpdGUiKTsKKwkJCW4gPSAtMTsKKwkJCWdvdG8gcmV0OworCQl9CisJCUlGX0RFU0tUT1AobiArPSBud3JvdGU7KQorCQlpZiAociA9PSAwKSBicmVhazsKKwl9CisKKwkvKiBTdG9yZSB1bnVzZWQgYnl0ZXMgaW4gYSBnbG9iYWwgYnVmZmVyIHNvIGNhbGxpbmcgYXBwbGV0cyBjYW4gYWNjZXNzIGl0ICovCisJaWYgKGd1bnppcF9iayA+PSA4KSB7CisJCS8qIFVuZG8gdG9vIG11Y2ggbG9va2FoZWFkLiBUaGUgbmV4dCByZWFkIHdpbGwgYmUgYnl0ZSBhbGlnbmVkCisJCSAqIHNvIHdlIGNhbiBkaXNjYXJkIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IG1lYW5pbmdmdWwgYnl0ZS4gKi8KKwkJYnl0ZWJ1ZmZlcl9vZmZzZXQtLTsKKwkJYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0gPSBndW56aXBfYmIgJiAweGZmOworCQlndW56aXBfYmIgPj49IDg7CisJCWd1bnppcF9iayAtPSA4OworCX0KKyByZXQ6CisJLyogQ2xlYW51cCAqLworCWZyZWUoZ3VuemlwX3dpbmRvdyk7CisJZnJlZShndW56aXBfY3JjX3RhYmxlKTsKKwlyZXR1cm4gbjsKK30KKworCisvKiBFeHRlcm5hbCBlbnRyeSBwb2ludHMgKi8KKworLyogRm9yIHVuemlwICovCisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCitpbmZsYXRlX3VuemlwKGluZmxhdGVfdW56aXBfcmVzdWx0ICpyZXMsIG9mZl90IGNvbXByX3NpemUsIGludCBpbiwgaW50IG91dCkKK3sKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IG47CisJREVDTEFSRV9TVEFURTsKKworCUFMTE9DX1NUQVRFOworCisJdG9fcmVhZCA9IGNvbXByX3NpemU7CisvLwlieXRlYnVmZmVyX21heCA9IDB4ODAwMDsKKwlieXRlYnVmZmVyX29mZnNldCA9IDQ7CisJYnl0ZWJ1ZmZlciA9IHhtYWxsb2MoYnl0ZWJ1ZmZlcl9tYXgpOworCW4gPSBpbmZsYXRlX3VuemlwX2ludGVybmFsKFBBU1NfU1RBVEUgaW4sIG91dCk7CisJZnJlZShieXRlYnVmZmVyKTsKKworCXJlcy0+Y3JjID0gZ3VuemlwX2NyYzsKKwlyZXMtPmJ5dGVzX291dCA9IGd1bnppcF9ieXRlc19vdXQ7CisJREVBTExPQ19TVEFURTsKKwlyZXR1cm4gbjsKK30KKworCisvKiBGb3IgZ3VuemlwICovCisKKy8qIGhlbHBlcnMgZmlyc3QgKi8KKworLyogVG9wIHVwIHRoZSBpbnB1dCBidWZmZXIgd2l0aCBhdCBsZWFzdCBuIGJ5dGVzLiAqLworc3RhdGljIGludCB0b3BfdXAoU1RBVEVfUEFSQU0gdW5zaWduZWQgbikKK3sKKwlpbnQgY291bnQgPSBieXRlYnVmZmVyX3NpemUgLSBieXRlYnVmZmVyX29mZnNldDsKKworCWlmIChjb3VudCA8IChpbnQpbikgeworCQltZW1tb3ZlKGJ5dGVidWZmZXIsICZieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSwgY291bnQpOworCQlieXRlYnVmZmVyX29mZnNldCA9IDA7CisJCWJ5dGVidWZmZXJfc2l6ZSA9IGZ1bGxfcmVhZChndW56aXBfc3JjX2ZkLCAmYnl0ZWJ1ZmZlcltjb3VudF0sIGJ5dGVidWZmZXJfbWF4IC0gY291bnQpOworCQlpZiAoKGludClieXRlYnVmZmVyX3NpemUgPCAwKSB7CisJCQliYl9lcnJvcl9tc2coYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnl0ZWJ1ZmZlcl9zaXplICs9IGNvdW50OworCQlpZiAoYnl0ZWJ1ZmZlcl9zaXplIDwgbikKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVpbnQxNl90IGJ1ZmZlcl9yZWFkX2xlX3UxNihTVEFURV9QQVJBTV9PTkxZKQoreworCXVpbnQxNl90IHJlczsKKyNpZiBCQl9MSVRUTEVfRU5ESUFOCisJbW92ZV9mcm9tX3VuYWxpZ25lZDE2KHJlcywgJmJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXRdKTsKKyNlbHNlCisJcmVzID0gYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF07CisJcmVzIHw9IGJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXQgKyAxXSA8PCA4OworI2VuZGlmCisJYnl0ZWJ1ZmZlcl9vZmZzZXQgKz0gMjsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdWludDMyX3QgYnVmZmVyX3JlYWRfbGVfdTMyKFNUQVRFX1BBUkFNX09OTFkpCit7CisJdWludDMyX3QgcmVzOworI2lmIEJCX0xJVFRMRV9FTkRJQU4KKwltb3ZlX2Zyb21fdW5hbGlnbmVkMzIocmVzLCAmYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0pOworI2Vsc2UKKwlyZXMgPSBieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XTsKKwlyZXMgfD0gYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldCArIDFdIDw8IDg7CisJcmVzIHw9IGJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXQgKyAyXSA8PCAxNjsKKwlyZXMgfD0gYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldCArIDNdIDw8IDI0OworI2VuZGlmCisJYnl0ZWJ1ZmZlcl9vZmZzZXQgKz0gNDsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGNoZWNrX2hlYWRlcl9nemlwKFNUQVRFX1BBUkFNIHVucGFja19pbmZvX3QgKmluZm8pCit7CisJdW5pb24geworCQl1bnNpZ25lZCBjaGFyIHJhd1s4XTsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgZ3pfbWV0aG9kOworCQkJdWludDhfdCBmbGFnczsKKwkJCXVpbnQzMl90IG10aW1lOworCQkJdWludDhfdCB4dHJhX2ZsYWdzX1VOVVNFRDsKKwkJCXVpbnQ4X3Qgb3NfZmxhZ3NfVU5VU0VEOworCQl9IFBBQ0tFRCBmb3JtYXR0ZWQ7CisJfSBoZWFkZXI7CisJc3RydWN0IEJVR19oZWFkZXIgeworCQljaGFyIEJVR19oZWFkZXJbc2l6ZW9mKGhlYWRlcikgPT0gOCA/IDEgOiAtMV07CisJfTsKKworCS8qCisJICogUmV3aW5kIGJ5dGVidWZmZXIuIFdlIHVzZSB0aGUgYmVnaW5uaW5nIGJlY2F1c2UgdGhlIGhlYWRlciBoYXMgOAorCSAqIGJ5dGVzLCBsZWF2aW5nIGVub3VnaCBmb3IgdW53aW5kaW5nIGFmdGVyd2FyZHMuCisJICovCisJYnl0ZWJ1ZmZlcl9zaXplIC09IGJ5dGVidWZmZXJfb2Zmc2V0OworCW1lbW1vdmUoYnl0ZWJ1ZmZlciwgJmJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXRdLCBieXRlYnVmZmVyX3NpemUpOworCWJ5dGVidWZmZXJfb2Zmc2V0ID0gMDsKKworCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgOCkpCisJCXJldHVybiAwOworCW1lbWNweShoZWFkZXIucmF3LCAmYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0sIDgpOworCWJ5dGVidWZmZXJfb2Zmc2V0ICs9IDg7CisKKwkvKiBDaGVjayB0aGUgY29tcHJlc3Npb24gbWV0aG9kICovCisJaWYgKGhlYWRlci5mb3JtYXR0ZWQuZ3pfbWV0aG9kICE9IDgpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGhlYWRlci5mb3JtYXR0ZWQuZmxhZ3MgJiAweDA0KSB7CisJCS8qIGJpdCAyIHNldDogZXh0cmEgZmllbGQgcHJlc2VudCAqLworCQl1bnNpZ25lZCBleHRyYV9zaG9ydDsKKworCQlpZiAoIXRvcF91cChQQVNTX1NUQVRFIDIpKQorCQkJcmV0dXJuIDA7CisJCWV4dHJhX3Nob3J0ID0gYnVmZmVyX3JlYWRfbGVfdTE2KFBBU1NfU1RBVEVfT05MWSk7CisJCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgZXh0cmFfc2hvcnQpKQorCQkJcmV0dXJuIDA7CisJCS8qIElnbm9yZSBleHRyYSBmaWVsZCAqLworCQlieXRlYnVmZmVyX29mZnNldCArPSBleHRyYV9zaG9ydDsKKwl9CisKKwkvKiBEaXNjYXJkIG9yaWdpbmFsIG5hbWUgYW5kIGZpbGUgY29tbWVudCBpZiBhbnkgKi8KKwkvKiBiaXQgMyBzZXQ6IG9yaWdpbmFsIGZpbGUgbmFtZSBwcmVzZW50ICovCisJLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworCWlmIChoZWFkZXIuZm9ybWF0dGVkLmZsYWdzICYgMHgxOCkgeworCQl3aGlsZSAoMSkgeworCQkJZG8geworCQkJCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgMSkpCisJCQkJCXJldHVybiAwOworCQkJfSB3aGlsZSAoYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldCsrXSAhPSAwKTsKKwkJCWlmICgoaGVhZGVyLmZvcm1hdHRlZC5mbGFncyAmIDB4MTgpICE9IDB4MTgpCisJCQkJYnJlYWs7CisJCQloZWFkZXIuZm9ybWF0dGVkLmZsYWdzICY9IH4weDE4OworCQl9CisJfQorCisJaWYgKGluZm8pCisJCWluZm8tPm10aW1lID0gU1dBUF9MRTMyKGhlYWRlci5mb3JtYXR0ZWQubXRpbWUpOworCisJLyogUmVhZCB0aGUgaGVhZGVyIGNoZWNrc3VtICovCisJaWYgKGhlYWRlci5mb3JtYXR0ZWQuZmxhZ3MgJiAweDAyKSB7CisJCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgMikpCisJCQlyZXR1cm4gMDsKKwkJYnl0ZWJ1ZmZlcl9vZmZzZXQgKz0gMjsKKwl9CisJcmV0dXJuIDE7Cit9CisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCit1bnBhY2tfZ3pfc3RyZWFtX3dpdGhfaW5mbyhpbnQgaW4sIGludCBvdXQsIHVucGFja19pbmZvX3QgKmluZm8pCit7CisJdWludDMyX3QgdjMyOworCUlGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgbjsKKwlERUNMQVJFX1NUQVRFOworCisJbiA9IDA7CisKKwlBTExPQ19TVEFURTsKKwl0b19yZWFkID0gLTE7CisvLwlieXRlYnVmZmVyX21heCA9IDB4ODAwMDsKKwlieXRlYnVmZmVyID0geG1hbGxvYyhieXRlYnVmZmVyX21heCk7CisJZ3VuemlwX3NyY19mZCA9IGluOworCisgYWdhaW46CisJaWYgKCFjaGVja19oZWFkZXJfZ3ppcChQQVNTX1NUQVRFIGluZm8pKSB7CisJCWJiX2Vycm9yX21zZygiY29ycnVwdGVkIGRhdGEiKTsKKwkJbiA9IC0xOworCQlnb3RvIHJldDsKKwl9CisJbiArPSBpbmZsYXRlX3VuemlwX2ludGVybmFsKFBBU1NfU1RBVEUgaW4sIG91dCk7CisJaWYgKG4gPCAwKQorCQlnb3RvIHJldDsKKworCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgOCkpIHsKKwkJYmJfZXJyb3JfbXNnKCJjb3JydXB0ZWQgZGF0YSIpOworCQluID0gLTE7CisJCWdvdG8gcmV0OworCX0KKworCS8qIFZhbGlkYXRlIGRlY29tcHJlc3Npb24gLSBjcmMgKi8KKwl2MzIgPSBidWZmZXJfcmVhZF9sZV91MzIoUEFTU19TVEFURV9PTkxZKTsKKwlpZiAoKH5ndW56aXBfY3JjKSAhPSB2MzIpIHsKKwkJYmJfZXJyb3JfbXNnKCJjcmMgZXJyb3IiKTsKKwkJbiA9IC0xOworCQlnb3RvIHJldDsKKwl9CisKKwkvKiBWYWxpZGF0ZSBkZWNvbXByZXNzaW9uIC0gc2l6ZSAqLworCXYzMiA9IGJ1ZmZlcl9yZWFkX2xlX3UzMihQQVNTX1NUQVRFX09OTFkpOworCWlmICgodWludDMyX3QpZ3VuemlwX2J5dGVzX291dCAhPSB2MzIpIHsKKwkJYmJfZXJyb3JfbXNnKCJpbmNvcnJlY3QgbGVuZ3RoIik7CisJCW4gPSAtMTsKKwl9CisKKwlpZiAoIXRvcF91cChQQVNTX1NUQVRFIDIpKQorCQlnb3RvIHJldDsgLyogRU9GICovCisKKwlpZiAoYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0gPT0gMHgxZgorCSAmJiBieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0ICsgMV0gPT0gMHg4YgorCSkgeworCQlieXRlYnVmZmVyX29mZnNldCArPSAyOworCQlnb3RvIGFnYWluOworCX0KKwkvKiBHTlUgZ3ppcCBzYXlzOiAqLworCS8qYmJfZXJyb3JfbXNnKCJkZWNvbXByZXNzaW9uIE9LLCB0cmFpbGluZyBnYXJiYWdlIGlnbm9yZWQiKTsqLworCisgcmV0OgorCWZyZWUoYnl0ZWJ1ZmZlcik7CisJREVBTExPQ19TVEFURTsKKwlyZXR1cm4gbjsKK30KKworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMKK3VucGFja19nel9zdHJlYW0oaW50IGluLCBpbnQgb3V0KQoreworCXJldHVybiB1bnBhY2tfZ3pfc3RyZWFtX3dpdGhfaW5mbyhpbiwgb3V0LCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9hbGwuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2FsbC5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBieSBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKy8qIEFjY2VwdCBhbnkgbm9uLW51bGwgbmFtZSwgaXRzIG5vdCByZWFsbHkgYSBmaWx0ZXIgYXQgYWxsICovCitjaGFyIEZBU1RfRlVOQyBmaWx0ZXJfYWNjZXB0X2FsbChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlpZiAoYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lKQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfbGlzdC5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzY0MGFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2xpc3QuYwpAQCAtMCwwICsxLDE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisvKgorICogQWNjZXB0IG5hbWVzIHRoYXQgYXJlIGluIHRoZSBhY2NlcHQgbGlzdCwgaWdub3JpbmcgcmVqZWN0IGxpc3QuCisgKi8KK2NoYXIgRkFTVF9GVU5DIGZpbHRlcl9hY2NlcHRfbGlzdChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlpZiAoZmluZF9saXN0X2VudHJ5KGFyY2hpdmVfaGFuZGxlLT5hY2NlcHQsIGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSkpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9saXN0X3JlYXNzaWduLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGY3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbi5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisvKiBCdWlsdCBhbmQgdXNlZCBvbmx5IGlmIEVOQUJMRV9EUEtHIHx8IEVOQUJMRV9EUEtHX0RFQiAqLworCisvKgorICogUmVhc3NpZ24gdGhlIHN1YmFyY2hpdmUgbWV0YWRhdGEgcGFyc2VyIGJhc2VkIG9uIHRoZSBmaWxlbmFtZSBleHRlbnNpb24KKyAqIGUuZy4gaWYgaXRzIGEgLnRhci5neiBtb2RpZnkgYXJjaGl2ZV9oYW5kbGUtPnN1Yl9hcmNoaXZlIHRvIHByb2Nlc3MgYSAudGFyLmd6CisgKiBvciBpZiBpdHMgYSAudGFyLmJ6MiBtYWtlIGFyY2hpdmVfaGFuZGxlLT5zdWJfYXJjaGl2ZSBoYW5kbGUgdGhhdAorICovCitjaGFyIEZBU1RfRlVOQyBmaWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ24oYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJLyogQ2hlY2sgdGhlIGZpbGUgZW50cnkgaXMgaW4gdGhlIGFjY2VwdCBsaXN0ICovCisJaWYgKGZpbmRfbGlzdF9lbnRyeShhcmNoaXZlX2hhbmRsZS0+YWNjZXB0LCBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUpKSB7CisJCWNvbnN0IGNoYXIgKm5hbWVfcHRyOworCisJCS8qIEZpbmQgZXh0ZW5zaW9uICovCisJCW5hbWVfcHRyID0gc3RycmNocihhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUsICcuJyk7CisJCWlmICghbmFtZV9wdHIpCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQluYW1lX3B0cisrOworCisJCS8qIE1vZGlmeSB0aGUgc3ViYXJjaGl2ZSBoYW5kbGVyIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gKi8KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daCisJCSAmJiBzdHJjbXAobmFtZV9wdHIsICJneiIpID09IDAKKwkJKSB7CisJCQlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYWN0aW9uX2RhdGFfc3ViYXJjaGl2ZSA9IGdldF9oZWFkZXJfdGFyX2d6OworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJCSAmJiBzdHJjbXAobmFtZV9wdHIsICJiejIiKSA9PSAwCisJCSkgeworCQkJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX2FjdGlvbl9kYXRhX3N1YmFyY2hpdmUgPSBnZXRfaGVhZGVyX3Rhcl9iejI7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19MWk1BCisJCSAmJiBzdHJjbXAobmFtZV9wdHIsICJsem1hIikgPT0gMAorCQkpIHsKKwkJCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19hY3Rpb25fZGF0YV9zdWJhcmNoaXZlID0gZ2V0X2hlYWRlcl90YXJfbHptYTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwl9CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9yZWplY3RfbGlzdC5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X3JlamVjdF9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4NmNjYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9yZWplY3RfbGlzdC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBieSBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKy8qCisgKiBBY2NlcHQgbmFtZXMgdGhhdCBhcmUgaW4gdGhlIGFjY2VwdCBsaXN0IGFuZCBub3QgaW4gdGhlIHJlamVjdCBsaXN0CisgKi8KK2NoYXIgRkFTVF9GVU5DIGZpbHRlcl9hY2NlcHRfcmVqZWN0X2xpc3QoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJY29uc3QgY2hhciAqa2V5OworCWNvbnN0IGxsaXN0X3QgKnJlamVjdF9lbnRyeTsKKwljb25zdCBsbGlzdF90ICphY2NlcHRfZW50cnk7CisKKwlrZXkgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWU7CisKKwkvKiBJZiB0aGUga2V5IGlzIGluIGEgcmVqZWN0IGxpc3QgZmFpbCAqLworCXJlamVjdF9lbnRyeSA9IGZpbmRfbGlzdF9lbnRyeTIoYXJjaGl2ZV9oYW5kbGUtPnJlamVjdCwga2V5KTsKKwlpZiAocmVqZWN0X2VudHJ5KSB7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWFjY2VwdF9lbnRyeSA9IGZpbmRfbGlzdF9lbnRyeTIoYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwga2V5KTsKKworCS8qIEZhaWwgaWYgYW4gYWNjZXB0IGxpc3Qgd2FzIHNwZWNpZmllZCBhbmQgdGhlIGtleSB3YXNudCBpbiB0aGVyZSAqLworCWlmICgoYWNjZXB0X2VudHJ5ID09IE5VTEwpICYmIGFyY2hpdmVfaGFuZGxlLT5hY2NlcHQpIHsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwkvKiBBY2NlcHRlZCAqLworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbmRfbGlzdF9lbnRyeS5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9maW5kX2xpc3RfZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZkMWFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9maW5kX2xpc3RfZW50cnkuYwpAQCAtMCwwICsxLDU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworLyogRmluZCBhIHN0cmluZyBpbiBhIHNoZWxsIHBhdHRlcm4gbGlzdCAqLworY29uc3QgbGxpc3RfdCogRkFTVF9GVU5DIGZpbmRfbGlzdF9lbnRyeShjb25zdCBsbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlpZiAoZm5tYXRjaChsaXN0LT5kYXRhLCBmaWxlbmFtZSwgMCkgPT0gMCkgeworCQkJcmV0dXJuIGxpc3Q7CisJCX0KKwkJbGlzdCA9IGxpc3QtPmxpbms7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBTYW1lLCBidXQgY29tcGFyZXMgb25seSBwYXRoIGNvbXBvbmVudHMgcHJlc2VudCBpbiBwYXR0ZXJuCisgKiAoZXh0cmEgdHJhaWxpbmcgcGF0aCBjb21wb25lbnRzIGluIGZpbGVuYW1lIGFyZSBhc3N1bWVkIHRvIG1hdGNoKQorICovCitjb25zdCBsbGlzdF90KiBGQVNUX0ZVTkMgZmluZF9saXN0X2VudHJ5Mihjb25zdCBsbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyIGJ1ZltQQVRIX01BWF07CisJaW50IHBhdHRlcm5fc2xhc2hfY250OworCWNvbnN0IGNoYXIgKmM7CisJY2hhciAqZDsKKworCXdoaWxlIChsaXN0KSB7CisJCWMgPSBsaXN0LT5kYXRhOworCQlwYXR0ZXJuX3NsYXNoX2NudCA9IDA7CisJCXdoaWxlICgqYykKKwkJCWlmICgqYysrID09ICcvJykgcGF0dGVybl9zbGFzaF9jbnQrKzsKKwkJYyA9IGZpbGVuYW1lOworCQlkID0gYnVmOworCQkvKiBwYXJhbm9pYSBpcyBiZXR0ZXIgdGhhbiBidWZmZXIgb3ZlcmZsb3dzICovCisJCXdoaWxlICgqYyAmJiBkICE9IGJ1ZiArIHNpemVvZihidWYpLTEpIHsKKwkJCWlmICgqYyA9PSAnLycgJiYgLS1wYXR0ZXJuX3NsYXNoX2NudCA8IDApCisJCQkJYnJlYWs7CisJCQkqZCsrID0gKmMrKzsKKwkJfQorCQkqZCA9ICdcMCc7CisJCWlmIChmbm1hdGNoKGxpc3QtPmRhdGEsIGJ1ZiwgMCkgPT0gMCkgeworCQkJcmV0dXJuIGxpc3Q7CisJCX0KKwkJbGlzdCA9IGxpc3QtPmxpbms7CisJfQorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX2FyLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjYwM2IxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX2FyLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogQ29weXJpZ2h0IDIwMDEgR2xlbm4gTWNHcmF0aC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKyNpbmNsdWRlICJhci5oIgorCitzdGF0aWMgdW5zaWduZWQgcmVhZF9udW0oY29uc3QgY2hhciAqc3RyLCBpbnQgYmFzZSkKK3sKKwkvKiBUaGlzIGNvZGUgd29ya3MgYmVjYXVzZQorCSAqIG9uIG1pc2Zvcm1hdHRlZCBudW1iZXJzIGJiX3N0cnRvdSByZXR1cm5zIGFsbC1vbmVzICovCisJaW50IGVyciA9IGJiX3N0cnRvdShzdHIsIE5VTEwsIGJhc2UpOworCWlmIChlcnIgPT0gLTEpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGFyIGhlYWRlciIpOworCXJldHVybiBlcnI7Cit9CisKK2NoYXIgRkFTVF9GVU5DIGdldF9oZWFkZXJfYXIoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJZmlsZV9oZWFkZXJfdCAqdHlwZWQgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXI7CisJdW5zaWduZWQgc2l6ZTsKKwl1bmlvbiB7CisJCWNoYXIgcmF3WzYwXTsKKwkJc3RydWN0IGFyX2hlYWRlciBmb3JtYXR0ZWQ7CisJfSBhcjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUworCXN0YXRpYyBjaGFyICphcl9sb25nX25hbWVzOworCXN0YXRpYyB1bnNpZ25lZCBhcl9sb25nX25hbWVfc2l6ZTsKKyNlbmRpZgorCisJLyogZG9udCB1c2UgeHJlYWQgYXMgd2Ugd2FudCB0byBoYW5kbGUgdGhlIGVycm9yIG91cnNlbGYgKi8KKwlpZiAocmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBhci5yYXcsIDYwKSAhPSA2MCkgeworCQkvKiBFbmQgT2YgRmlsZSAqLworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCS8qIGFyIGhlYWRlciBzdGFydHMgb24gYW4gZXZlbiBieXRlICgyIGJ5dGUgYWxpZ25lZCkKKwkgKiAnXG4nIGlzIHVzZWQgZm9yIHBhZGRpbmcKKwkgKi8KKwlpZiAoYXIucmF3WzBdID09ICdcbicpIHsKKwkJLyogZml4IHVwIHRoZSBoZWFkZXIsIHdlIHN0YXJ0ZWQgcmVhZGluZyAxIGJ5dGUgdG9vIGVhcmx5ICovCisJCW1lbW1vdmUoYXIucmF3LCAmYXIucmF3WzFdLCA1OSk7CisJCWFyLnJhd1s1OV0gPSB4cmVhZF9jaGFyKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQpOworCQlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0Kys7CisJfQorCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gNjA7CisKKwlpZiAoYXIuZm9ybWF0dGVkLm1hZ2ljWzBdICE9ICdgJyB8fCBhci5mb3JtYXR0ZWQubWFnaWNbMV0gIT0gJ1xuJykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgYXIgaGVhZGVyIik7CisKKwkvKiBGSVhNRTogbW9yZSB0aG9yb3VnaCByb3V0aW5lIHdvdWxkIGJlIGluIG9yZGVyIGhlcmUKKwkgKiAod2UgaGF2ZSBzb21ldGhpbmcgbGlrZSB0aGF0IGluIHRhcikKKwkgKiBidXQgZm9yIG5vdyB3ZSBhcmUgbGF4LiAqLworCWFyLmZvcm1hdHRlZC5tYWdpY1swXSA9ICdcMCc7IC8qIGVsc2UgNEctMiBmaWxlIHdpbGwgaGF2ZSBzaXplPSI0Mjk0OTY3Mjk0YFxuLi4uIiAqLworCXR5cGVkLT5zaXplID0gc2l6ZSA9IHJlYWRfbnVtKGFyLmZvcm1hdHRlZC5zaXplLCAxMCk7CisKKwkvKiBzcGVjaWFsIGZpbGVuYW1lcyBoYXZlICcvJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyICovCisJaWYgKGFyLmZvcm1hdHRlZC5uYW1lWzBdID09ICcvJykgeworCQlpZiAoYXIuZm9ybWF0dGVkLm5hbWVbMV0gPT0gJyAnKSB7CisJCQkvKiBUaGlzIGlzIHRoZSBpbmRleCBvZiBzeW1ib2xzIGluIHRoZSBmaWxlIGZvciBjb21waWxlcnMgKi8KKwkJCWRhdGFfc2tpcChhcmNoaXZlX2hhbmRsZSk7CisJCQlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IHNpemU7CisJCQlyZXR1cm4gZ2V0X2hlYWRlcl9hcihhcmNoaXZlX2hhbmRsZSk7IC8qIFJldHVybiBuZXh0IGhlYWRlciAqLworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMKKwkJaWYgKGFyLmZvcm1hdHRlZC5uYW1lWzFdID09ICcvJykgeworCQkJLyogSWYgdGhlIHNlY29uZCBjaGFyIGlzIGEgJy8nIHRoZW4gdGhpcyBlbnRyaWVzIGRhdGEgc2VjdGlvbgorCQkJICogc3RvcmVzIGxvbmcgZmlsZW5hbWUgZm9yIG11bHRpcGxlIGVudHJpZXMsIHRoZXkgYXJlIHN0b3JlZAorCQkJICogaW4gc3RhdGljIHZhcmlhYmxlIGxvbmdfbmFtZXMgZm9yIHVzZSBpbiBmdXR1cmUgZW50cmllcworCQkJICovCisJCQlhcl9sb25nX25hbWVfc2l6ZSA9IHNpemU7CisJCQlmcmVlKGFyX2xvbmdfbmFtZXMpOworCQkJYXJfbG9uZ19uYW1lcyA9IHhtYWxsb2Moc2l6ZSk7CisJCQl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBhcl9sb25nX25hbWVzLCBzaXplKTsKKwkJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gc2l6ZTsKKwkJCS8qIFJldHVybiBuZXh0IGhlYWRlciAqLworCQkJcmV0dXJuIGdldF9oZWFkZXJfYXIoYXJjaGl2ZV9oYW5kbGUpOworCQl9CisjZWxzZQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibG9uZyBmaWxlbmFtZXMgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisJfQorCS8qIE9ubHkgc2l6ZSBpcyBhbHdheXMgcHJlc2VudCwgdGhlIHJlc3QgbWF5IGJlIG1pc3NpbmcgaW4KKwkgKiBsb25nIGZpbGVuYW1lIHBzZXVkbyBmaWxlLiBUaHVzIHdlIGRlY29kZSB0aGUgcmVzdAorCSAqIGFmdGVyIGRlYWxpbmcgd2l0aCBsb25nIGZpbGVuYW1lIHBzZXVkbyBmaWxlLgorCSAqLworCXR5cGVkLT5tb2RlID0gcmVhZF9udW0oYXIuZm9ybWF0dGVkLm1vZGUsIDgpOworCXR5cGVkLT5tdGltZSA9IHJlYWRfbnVtKGFyLmZvcm1hdHRlZC5kYXRlLCAxMCk7CisJdHlwZWQtPnVpZCA9IHJlYWRfbnVtKGFyLmZvcm1hdHRlZC51aWQsIDEwKTsKKwl0eXBlZC0+Z2lkID0gcmVhZF9udW0oYXIuZm9ybWF0dGVkLmdpZCwgMTApOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMKKwlpZiAoYXIuZm9ybWF0dGVkLm5hbWVbMF0gPT0gJy8nKSB7CisJCXVuc2lnbmVkIGxvbmdfb2Zmc2V0OworCisJCS8qIFRoZSBudW1iZXIgYWZ0ZXIgdGhlICcvJyBpbmRpY2F0ZXMgdGhlIG9mZnNldCBpbiB0aGUgYXIgZGF0YSBzZWN0aW9uCisJCSAqIChzYXZlZCBpbiBhcl9sb25nX25hbWVzKSB0aGF0IGNvbmF0YWlucyB0aGUgcmVhbCBmaWxlbmFtZSAqLworCQlsb25nX29mZnNldCA9IHJlYWRfbnVtKCZhci5mb3JtYXR0ZWQubmFtZVsxXSwgMTApOworCQlpZiAobG9uZ19vZmZzZXQgPj0gYXJfbG9uZ19uYW1lX3NpemUpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZXNvbHZlIGxvbmcgZmlsZW5hbWUiKTsKKwkJfQorCQl0eXBlZC0+bmFtZSA9IHhzdHJkdXAoYXJfbG9uZ19uYW1lcyArIGxvbmdfb2Zmc2V0KTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyogc2hvcnQgZmlsZW5hbWVzICovCisJCXR5cGVkLT5uYW1lID0geHN0cm5kdXAoYXIuZm9ybWF0dGVkLm5hbWUsIDE2KTsKKwl9CisKKwl0eXBlZC0+bmFtZVtzdHJjc3BuKHR5cGVkLT5uYW1lLCAiIC8iKV0gPSAnXDAnOworCisJaWYgKGFyY2hpdmVfaGFuZGxlLT5maWx0ZXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlcih0eXBlZCk7CisjaWYgRU5BQkxFX0RQS0cgfHwgRU5BQkxFX0RQS0dfREVCCisJCWlmIChhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUpIHsKKwkJCXdoaWxlIChhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYWN0aW9uX2RhdGFfc3ViYXJjaGl2ZShhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUpID09IEVYSVRfU1VDQ0VTUykKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YShhcmNoaXZlX2hhbmRsZSk7CisJfSBlbHNlIHsKKwkJZGF0YV9za2lwKGFyY2hpdmVfaGFuZGxlKTsKKwl9CisKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IHR5cGVkLT5zaXplOworCS8qIFNldCB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBjb3JyZWN0IHNwb3QsIHdlIG1heSBoYXZlIGJlZW4gcmVhZGluZyBhIGNvbXByZXNzZWQgZmlsZSAqLworCWxzZWVrKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGFyY2hpdmVfaGFuZGxlLT5vZmZzZXQsIFNFRUtfU0VUKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfY3Bpby5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX2NwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDk5YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX2NwaW8uYwpAQCAtMCwwICsxLDE4NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgMjAwMiBMYXVyZW5jZSBBbmRlcnNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCit0eXBlZGVmIHN0cnVjdCBoYXJkbGlua3NfdCB7CisJc3RydWN0IGhhcmRsaW5rc190ICpuZXh0OworCWludCBpbm9kZTsgLyogVE9ETzogbXVzdCBtYXRjaCBtYWovbWluIHRvbyEgKi8KKwlpbnQgbW9kZSA7CisJaW50IG10aW1lOyAvKiBUaGVzZSB0aHJlZSBhcmUgdXNlZnVsIG9ubHkgaW4gY29ybmVyIGNhc2UgKi8KKwlpbnQgdWlkICA7IC8qIG9mIGhhcmRsaW5rcyB3aXRoIHplcm8gc2l6ZSBib2R5ICovCisJaW50IGdpZCAgOworCWNoYXIgbmFtZVsxXTsKK30gaGFyZGxpbmtzX3Q7CisKK2NoYXIgRkFTVF9GVU5DIGdldF9oZWFkZXJfY3BpbyhhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlciA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlcjsKKwljaGFyIGNwaW9faGVhZGVyWzExMF07CisJaW50IG5hbWVzaXplOworCWludCBtYWpvciwgbWlub3IsIG5saW5rLCBtb2RlLCBpbm9kZTsKKwl1bnNpZ25lZCBzaXplLCB1aWQsIGdpZCwgbXRpbWU7CisKKwkvKiBUaGVyZSBjYW4gYmUgcGFkZGluZyBiZWZvcmUgYXJjaGl2ZSBoZWFkZXIgKi8KKwlkYXRhX2FsaWduKGFyY2hpdmVfaGFuZGxlLCA0KTsKKworCXNpemUgPSBmdWxsX3JlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgY3Bpb19oZWFkZXIsIDExMCk7CisJaWYgKHNpemUgPT0gMCkgeworCQlnb3RvIGNyZWF0ZV9oYXJkbGlua3M7CisJfQorCWlmIChzaXplICE9IDExMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgcmVhZCIpOworCX0KKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IDExMDsKKworCWlmIChzdHJuY21wKCZjcGlvX2hlYWRlclswXSwgIjA3MDcwIiwgNSkgIT0gMAorCSB8fCAoY3Bpb19oZWFkZXJbNV0gIT0gJzEnICYmIGNwaW9faGVhZGVyWzVdICE9ICcyJykKKwkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIGNwaW8gZm9ybWF0LCB1c2UgbmV3YyBvciBjcmMiKTsKKwl9CisKKwlpZiAoc3NjYW5mKGNwaW9faGVhZGVyICsgNiwKKwkJCSIlOHgiICIlOHgiICIlOHgiICIlOHgiCisJCQkiJTh4IiAiJTh4IiAiJTh4IiAvKm1haixtaW46Ki8gIiUqMTZjIgorCQkJLypybWFqLHJtaW46Ki8iJTh4IiAiJTh4IiAiJTh4IiAvKmNoa3N1bTogIiUqOGMiKi8sCisJCQkmaW5vZGUsICZtb2RlLCAmdWlkLCAmZ2lkLAorCQkJJm5saW5rLCAmbXRpbWUsICZzaXplLAorCQkJJm1ham9yLCAmbWlub3IsICZuYW1lc2l6ZSkgIT0gMTApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkYW1hZ2VkIGNwaW8gZmlsZSIpOworCWZpbGVfaGVhZGVyLT5tb2RlID0gbW9kZTsKKwlmaWxlX2hlYWRlci0+dWlkID0gdWlkOworCWZpbGVfaGVhZGVyLT5naWQgPSBnaWQ7CisJZmlsZV9oZWFkZXItPm10aW1lID0gbXRpbWU7CisJZmlsZV9oZWFkZXItPnNpemUgPSBzaXplOworCisJbmFtZXNpemUgJj0gMHgxZmZmOyAvKiBwYXJhbm9pYTogbGltaXQgbmFtZXMgdG8gOGsgY2hhcnMgKi8KKwlmaWxlX2hlYWRlci0+bmFtZSA9IHh6YWxsb2MobmFtZXNpemUgKyAxKTsKKwkvKiBSZWFkIGluIGZpbGVuYW1lICovCisJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgZmlsZV9oZWFkZXItPm5hbWUsIG5hbWVzaXplKTsKKwlpZiAoZmlsZV9oZWFkZXItPm5hbWVbMF0gPT0gJy8nKSB7CisJCS8qIFRlc3RjYXNlOiBlY2hvIC9ldGMvaG9zdHMgfCBjcGlvIC1wdmQgL3RtcAorCQkgKiBXaXRob3V0IHRoaXMgY29kZSwgaXQgdHJpZXMgdG8gdW5wYWNrIC9ldGMvaG9zdHMKKwkJICogaW50byAiL2V0Yy9ob3N0cyIsIG5vdCAiZXRjL2hvc3RzIi4KKwkJICovCisJCWNoYXIgKnAgPSBmaWxlX2hlYWRlci0+bmFtZTsKKwkJZG8gcCsrOyB3aGlsZSAoKnAgPT0gJy8nKTsKKwkJb3ZlcmxhcHBpbmdfc3RyY3B5KGZpbGVfaGVhZGVyLT5uYW1lLCBwKTsKKwl9CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBuYW1lc2l6ZTsKKworCS8qIFVwZGF0ZSBvZmZzZXQgYW1vdW50IGFuZCBza2lwIHBhZGRpbmcgYmVmb3JlIGZpbGUgY29udGVudHMgKi8KKwlkYXRhX2FsaWduKGFyY2hpdmVfaGFuZGxlLCA0KTsKKworCWlmIChzdHJjbXAoZmlsZV9oZWFkZXItPm5hbWUsICJUUkFJTEVSISEhIikgPT0gMCkgeworCQkvKiBBbHdheXMgcm91bmQgdXAuICI+PiA5IiBkaXZpZGVzIGJ5IDUxMiAqLworCQlhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fYmxvY2tzID0gKHVvZmZfdCkoYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArIDUxMSkgPj4gOTsKKwkJZ290byBjcmVhdGVfaGFyZGxpbmtzOworCX0KKworCWZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCA9IE5VTEw7CisJaWYgKFNfSVNMTksoZmlsZV9oZWFkZXItPm1vZGUpKSB7CisJCWZpbGVfaGVhZGVyLT5zaXplICY9IDB4MWZmZjsgLyogcGFyYW5vaWE6IGxpbWl0IG5hbWVzIHRvIDhrIGNoYXJzICovCisJCWZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCA9IHh6YWxsb2MoZmlsZV9oZWFkZXItPnNpemUgKyAxKTsKKwkJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0LCBmaWxlX2hlYWRlci0+c2l6ZSk7CisJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gZmlsZV9oZWFkZXItPnNpemU7CisJCWZpbGVfaGVhZGVyLT5zaXplID0gMDsgLyogU3RvcCBwb3NzaWJsZSBzZWVrcyBpbiBmdXR1cmUgKi8KKwl9CisKKy8vIFRPRE86IGRhdGFfZXh0cmFjdF9hbGwgY2FuJ3QgZGVhbCB3aXRoIGhhcmRsaW5rcyB0byBub24tZmlsZXMuLi4KKy8vIHdoZW4gZml4ZWQsIGNoYW5nZSBTX0lTUkVHIHRvICFTX0lTRElSIGhlcmUKKworCWlmIChubGluayA+IDEgJiYgU19JU1JFRyhmaWxlX2hlYWRlci0+bW9kZSkpIHsKKwkJaGFyZGxpbmtzX3QgKm5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpICsgbmFtZXNpemUpOworCQluZXctPmlub2RlID0gaW5vZGU7CisJCW5ldy0+bW9kZSAgPSBtb2RlIDsKKwkJbmV3LT5tdGltZSA9IG10aW1lOworCQluZXctPnVpZCAgID0gdWlkICA7CisJCW5ldy0+Z2lkICAgPSBnaWQgIDsKKwkJc3RyY3B5KG5ldy0+bmFtZSwgZmlsZV9oZWFkZXItPm5hbWUpOworCQkvKiBQdXQgZmlsZSBvbiBhIGxpbmtlZCBsaXN0IGZvciBsYXRlciAqLworCQlpZiAoc2l6ZSA9PSAwKSB7CisJCQluZXctPm5leHQgPSBhcmNoaXZlX2hhbmRsZS0+Y3Bpb19faGFyZGxpbmtzX3RvX2NyZWF0ZTsKKwkJCWFyY2hpdmVfaGFuZGxlLT5jcGlvX19oYXJkbGlua3NfdG9fY3JlYXRlID0gbmV3OworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLyogU2tpcCB0aGlzIG9uZSAqLworCQkJLyogVE9ETzogdGhpcyBicmVha3MgY3BpbyAtdCAoaXQgZG9lcyBub3Qgc2hvdyBoYXJkbGlua3MpICovCisJCX0KKwkJbmV3LT5uZXh0ID0gYXJjaGl2ZV9oYW5kbGUtPmNwaW9fX2NyZWF0ZWRfaGFyZGxpbmtzOworCQlhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fY3JlYXRlZF9oYXJkbGlua3MgPSBuZXc7CisJfQorCWZpbGVfaGVhZGVyLT5kZXZpY2UgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisKKwlpZiAoYXJjaGl2ZV9oYW5kbGUtPmZpbHRlcihhcmNoaXZlX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YShhcmNoaXZlX2hhbmRsZSk7CisvL1RPRE86IHJ1biAiZWNobyAvZXRjL2hvc3RzIHwgY3BpbyAtcHYgL3RtcCIgdHdpY2UuIE9uIDJuZCBydW46CisvL2NwaW86IGV0Yy9ob3N0cyBub3QgY3JlYXRlZDogbmV3ZXIgb3Igc2FtZSBhZ2UgZmlsZSBleGlzdHMKKy8vZXRjL2hvc3RzICA8LS0gc2hvdWxkIE5PVCBzaG93IGl0CisvLzIgYmxvY2tzIDwtLSBzaG91bGQgc2F5ICIwIGJsb2NrcyIKKwkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9oZWFkZXIoZmlsZV9oZWFkZXIpOworCX0gZWxzZSB7CisJCWRhdGFfc2tpcChhcmNoaXZlX2hhbmRsZSk7CisJfQorCisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBmaWxlX2hlYWRlci0+c2l6ZTsKKworCWZyZWUoZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0KTsKKwlmcmVlKGZpbGVfaGVhZGVyLT5uYW1lKTsKKwlmaWxlX2hlYWRlci0+bGlua190YXJnZXQgPSBOVUxMOworCWZpbGVfaGVhZGVyLT5uYW1lID0gTlVMTDsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKyBjcmVhdGVfaGFyZGxpbmtzOgorCWZyZWUoZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0KTsKKwlmcmVlKGZpbGVfaGVhZGVyLT5uYW1lKTsKKworCXdoaWxlIChhcmNoaXZlX2hhbmRsZS0+Y3Bpb19faGFyZGxpbmtzX3RvX2NyZWF0ZSkgeworCQloYXJkbGlua3NfdCAqY3VyOworCQloYXJkbGlua3NfdCAqbWFrZV9tZSA9IGFyY2hpdmVfaGFuZGxlLT5jcGlvX19oYXJkbGlua3NfdG9fY3JlYXRlOworCisJCWFyY2hpdmVfaGFuZGxlLT5jcGlvX19oYXJkbGlua3NfdG9fY3JlYXRlID0gbWFrZV9tZS0+bmV4dDsKKworCQltZW1zZXQoZmlsZV9oZWFkZXIsIDAsIHNpemVvZigqZmlsZV9oZWFkZXIpKTsKKwkJZmlsZV9oZWFkZXItPm10aW1lID0gbWFrZV9tZS0+bXRpbWU7CisJCWZpbGVfaGVhZGVyLT5uYW1lID0gbWFrZV9tZS0+bmFtZTsKKwkJZmlsZV9oZWFkZXItPm1vZGUgPSBtYWtlX21lLT5tb2RlOworCQlmaWxlX2hlYWRlci0+dWlkID0gbWFrZV9tZS0+dWlkOworCQlmaWxlX2hlYWRlci0+Z2lkID0gbWFrZV9tZS0+Z2lkOworCQkvKmZpbGVfaGVhZGVyLT5zaXplID0gMDsqLworCQkvKmZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCA9IE5VTEw7Ki8KKworCQkvKiBUcnkgdG8gZmluZCBhIGZpbGUgd2UgYXJlIGhhcmRsaW5rZWQgdG8gKi8KKwkJY3VyID0gYXJjaGl2ZV9oYW5kbGUtPmNwaW9fX2NyZWF0ZWRfaGFyZGxpbmtzOworCQl3aGlsZSAoY3VyKSB7CisJCQkvKiBUT0RPOiBtdXN0IG1hdGNoIG1hai9taW4gdG9vISAqLworCQkJaWYgKGN1ci0+aW5vZGUgPT0gbWFrZV9tZS0+aW5vZGUpIHsKKwkJCQlmaWxlX2hlYWRlci0+bGlua190YXJnZXQgPSBjdXItPm5hbWU7CisJCQkJIC8qIGxpbmtfdGFyZ2V0ICE9IE5VTEwsIHNpemUgPSAwOiAiSSBhbSBhIGhhcmRsaW5rIiAqLworCQkJCWlmIChhcmNoaXZlX2hhbmRsZS0+ZmlsdGVyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCQkJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YShhcmNoaXZlX2hhbmRsZSk7CisJCQkJZnJlZShtYWtlX21lKTsKKwkJCQlnb3RvIG5leHRfbGluazsKKwkJCX0KKwkJCWN1ciA9IGN1ci0+bmV4dDsKKwkJfQorCQkvKiBPb3BzLi4uIG5vIGZpbGUgd2l0aCBzdWNoIGlub2RlIHdhcyBjcmVhdGVkLi4uIGRvIGl0IG5vdworCQkgKiAoaGFwcGVucyB3aGVuIGhhcmRsaW5rZWQgZmlsZXMgYXJlIGVtcHR5ICh6ZXJvIGxlbmd0aCkpICovCisJCWlmIChhcmNoaXZlX2hhbmRsZS0+ZmlsdGVyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEoYXJjaGl2ZV9oYW5kbGUpOworCQkvKiBNb3ZlIHRvIHRoZSBsaXN0IG9mIGNyZWF0ZWQgaGFyZGxpbmtlZCBmaWxlcyAqLworCQltYWtlX21lLT5uZXh0ID0gYXJjaGl2ZV9oYW5kbGUtPmNwaW9fX2NyZWF0ZWRfaGFyZGxpbmtzOworCQlhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fY3JlYXRlZF9oYXJkbGlua3MgPSBtYWtlX21lOworIG5leHRfbGluazogOworCX0KKworCXdoaWxlIChhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fY3JlYXRlZF9oYXJkbGlua3MpIHsKKwkJaGFyZGxpbmtzX3QgKnAgPSBhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fY3JlYXRlZF9oYXJkbGlua3M7CisJCWFyY2hpdmVfaGFuZGxlLT5jcGlvX19jcmVhdGVkX2hhcmRsaW5rcyA9IHAtPm5leHQ7CisJCWZyZWUocCk7CisJfQorCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsgLyogIk5vIG1vcmUgZmlsZXMgdG8gcHJvY2VzcyIgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXIuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNhZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhci5jCkBAIC0wLDAgKzEsNDk3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogRklYTUU6CisgKiAgICBJbiBwcml2aWxlZ2VkIG1vZGUgaWYgdW5hbWUgYW5kIGduYW1lIG1hcCB0byBhIHVpZCBhbmQgZ2lkIHRoZW4gdXNlIHRoZQorICogICAgbWFwcGVkIHZhbHVlIGluc3RlYWQgb2YgdGhlIHVpZC9naWQgdmFsdWVzIGluIHRhciBoZWFkZXIKKyAqCisgKiBSZWZlcmVuY2VzOgorICogICAgR05VIHRhciBhbmQgc3RhciBtYW4gcGFnZXMsCisgKiAgICBPcGVuZ3JvdXAncyB1c3RhciBpbnRlcmNoYW5nZSBmb3JtYXQsCisgKiAgICBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3BheC5odG1sCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCit0eXBlZGVmIHVpbnQzMl90IGFsaWFzZWRfdWludDMyX3QgRklYX0FMSUFTSU5HOwordHlwZWRlZiBvZmZfdCAgICBhbGlhc2VkX29mZl90ICAgIEZJWF9BTElBU0lORzsKKworCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgc3RyaXBfdW5zYWZlX3ByZWZpeChjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqY3AgPSBzdHI7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqY3AyOworCQlpZiAoKmNwID09ICcvJykgeworCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJuY21wKGNwLCAiLy4uLyIrMSwgMykgPT0gMCkgeworCQkJY3AgKz0gMzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNwMiA9IHN0cnN0cihjcCwgIi8uLi8iKTsKKwkJaWYgKCFjcDIpCisJCQlicmVhazsKKwkJY3AgPSBjcDIgKyA0OworCX0KKwlpZiAoY3AgIT0gc3RyKSB7CisJCXN0YXRpYyBzbWFsbGludCB3YXJuZWQgPSAwOworCQlpZiAoIXdhcm5lZCkgeworCQkJd2FybmVkID0gMTsKKwkJCWJiX2Vycm9yX21zZygicmVtb3ZpbmcgbGVhZGluZyAnJS4qcycgZnJvbSBtZW1iZXIgbmFtZXMiLAorCQkJCShpbnQpKGNwIC0gc3RyKSwgc3RyKTsKKwkJfQorCX0KKwlyZXR1cm4gY3A7Cit9CisKKy8qIE5COiBfREVTVFJPWVNfIHN0cltsZW5dIGNoYXJhY3RlciEgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0T2N0YWwoY2hhciAqc3RyLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB2OworCWNoYXIgKmVuZDsKKwkvKiBOQjogbGVhZGluZyBzcGFjZXMgYXJlIGFsbG93ZWQuIFVzaW5nIHN0cnRvdWxsIHRvIGhhbmRsZSB0aGF0LgorCSAqIFRoZSBkb3duc2lkZSBpcyB0aGF0IHdlIGFjY2VwdCBlLmcuICItMTIzIiB0b28gOigKKwkgKi8KKwlzdHJbbGVuXSA9ICdcMCc7CisJdiA9IHN0cnRvdWxsKHN0ciwgJmVuZCwgOCk7CisJLyogc3RkOiAiRWFjaCBudW1lcmljIGZpZWxkIGlzIHRlcm1pbmF0ZWQgYnkgb25lIG9yIG1vcmUKKwkgKiA8c3BhY2U+IG9yIE5VTCBjaGFyYWN0ZXJzIi4gV2UgbXVzdCBzdXBwb3J0ICcgJyEgKi8KKwlpZiAoKmVuZCAhPSAnXDAnICYmICplbmQgIT0gJyAnKSB7CisJCWludDhfdCBmaXJzdCA9IHN0clswXTsKKwkJaWYgKCEoZmlyc3QgJiAweDgwKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb3JydXB0ZWQgb2N0YWwgdmFsdWUgaW4gdGFyIGhlYWRlciIpOworCQkvKgorCQkgKiBHTlUgdGFyIHVzZXMgImJhc2UtMjU2IGVuY29kaW5nIiBmb3IgdmVyeSBsYXJnZSBudW1iZXJzLgorCQkgKiBFbmNvZGluZyBpcyBiaW5hcnksIHdpdGggaGlnaGVzdCBiaXQgYWx3YXlzIHNldCBhcyBhIG1hcmtlcgorCQkgKiBhbmQgc2lnbiBpbiBuZXh0LWhpZ2hlc3QgYml0OgorCQkgKiA4MCAwMCAuLiAwMCAtIHplcm8KKwkJICogYmYgZmYgLi4gZmYgLSBsYXJnZXN0IHBvc2l0aXZlIG51bWJlcgorCQkgKiBmZiBmZiAuLiBmZiAtIG1pbnVzIDEKKwkJICogYzAgMDAgLi4gMDAgLSBzbWFsbGVzdCBuZWdhdGl2ZSBudW1iZXIKKwkJICoKKwkJICogRXhhbXBsZSBvZiB0YXIgZmlsZSB3aXRoIDg5MTQ5OTMxNTMgKDB4MjEzNjAwMDAxKSBieXRlIGZpbGUuCisJCSAqIEZpZWxkIHN0YXJ0cyBhdCBvZmZzZXQgN2M6CisJCSAqIDAwMDcwICAzMCAzMCAzMCAwMCAzMCAzMCAzMCAzMCAgMzAgMzAgMzAgMDAgODAgMDAgMDAgMDAgIHwwMDAuMDAwMDAwMC4uLi4ufAorCQkgKiAwMDA4MCAgMDAgMDAgMDAgMDIgMTMgNjAgMDAgMDEgIDMxIDMxIDMxIDMyIDMwIDMzIDMzIDM2ICB8Li4uLi5gLi4xMTEyMDMzNnwKKwkJICoKKwkJICogTkI6IHRhcmJhbGxzIHdpdGggTkVHQVRJVkUgdW5peCB0aW1lcyBlbmNvZGVkIHRoYXQgd2F5IHdlcmUgc2VlbiEKKwkJICovCisJCXYgPSBmaXJzdDsKKwkJLyogU2lnbi1leHRlbmQgdXNpbmcgNnRoIGJpdDogKi8KKwkJdiA8PD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykqOCAtIDc7CisJCXYgPSAobG9uZyBsb25nKXYgPj4gKHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKjggLSA3KTsKKwkJd2hpbGUgKC0tbGVuICE9IDApCisJCQl2ID0gKHYgPDwgOCkgKyAodW5zaWduZWQgY2hhcikgKnN0cisrOworCX0KKwlyZXR1cm4gdjsKK30KKyNkZWZpbmUgR0VUX09DVEFMKGEpIGdldE9jdGFsKChhKSwgc2l6ZW9mKGEpKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1NFTElOVVgKKy8qIFNjYW4gYSBQQVggaGVhZGVyIGZvciBTRUxpbnV4IGNvbnRleHRzLCB2aWEgIlJIVC5zZWN1cml0eS5zZWxpbnV4IiBrZXl3b3JkLgorICogVGhpcyBpcyB3aGF0IFJlZCBIYXQncyBwYXRjaGVkIHZlcnNpb24gb2YgdGFyIHVzZXMuCisgKi8KKyMgZGVmaW5lIFNFTElOVVhfQ09OVEVYVF9LRVlXT1JEICJSSFQuc2VjdXJpdHkuc2VsaW51eCIKK3N0YXRpYyBjaGFyICpnZXRfc2VsaW51eF9zY3R4X2Zyb21fcGF4X2hkcihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSwgdW5zaWduZWQgc3opCit7CisJY2hhciAqYnVmLCAqcDsKKwljaGFyICpyZXN1bHQ7CisKKwlwID0gYnVmID0geG1hbGxvYyhzeiArIDEpOworCS8qIHByZXZlbnQgYmJfc3RydG91IGZyb20gcnVubmluZyBvZmYgdGhlIGJ1ZmZlciAqLworCWJ1Zltzel0gPSAnXDAnOworCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGJ1Ziwgc3opOworCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gc3o7CisKKwlyZXN1bHQgPSBOVUxMOworCXdoaWxlIChzeiAhPSAwKSB7CisJCWNoYXIgKmVuZCwgKnZhbHVlOworCQl1bnNpZ25lZCBsZW47CisKKwkJLyogRXZlcnkgcmVjb3JkIGhhcyB0aGlzIGZvcm1hdDogIkxFTiBOQU1FPVZBTFVFXG4iICovCisJCWxlbiA9IGJiX3N0cnRvdShwLCAmZW5kLCAxMCk7CisJCS8qIGV4cGVjdCBlcnJubyB0byBiZSBFSU5WQUwsIGJlY2F1c2UgdGhlIGNoYXJhY3RlcgorCQkgKiBmb2xsb3dpbmcgdGhlIGRpZ2l0cyBzaG91bGQgYmUgYSBzcGFjZQorCQkgKi8KKwkJcCArPSBsZW47CisJCXN6IC09IGxlbjsKKwkJaWYgKChpbnQpc3ogPCAwCisJCSB8fCBsZW4gPT0gMAorCQkgfHwgZXJybm8gIT0gRUlOVkFMCisJCSB8fCAqZW5kICE9ICcgJworCQkpIHsKKwkJCWJiX2Vycm9yX21zZygibWFsZm9ybWVkIGV4dGVuZGVkIGhlYWRlciwgc2tpcHBlZCIpOworCQkJLy8gTW9yZSB2ZXJib3NlIHZlcnNpb246CisJCQkvL2JiX2Vycm9yX21zZygibWFsZm9ybWVkIGV4dGVuZGVkIGhlYWRlciBhdCAlIk9GRl9GTVQiZCwgc2tpcHBlZCIsCisJCQkvLwkJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCAtIChzeiArIGxlbikpOworCQkJYnJlYWs7CisJCX0KKwkJLyogb3ZlcndyaXRlIHRoZSB0ZXJtaW5hdGluZyBuZXdsaW5lIHdpdGggTlVMCisJCSAqICh3ZSBkbyBub3QgYm90aGVyIHRvIGNoZWNrIHRoYXQgaXQgKndhcyogYSBuZXdsaW5lKQorCQkgKi8KKwkJcFstMV0gPSAnXDAnOworCQkvKiBJcyBpdCBzZWxpbnV4IHNlY3VyaXR5IGNvbnRleHQ/ICovCisJCXZhbHVlID0gZW5kICsgMTsKKwkJaWYgKHN0cm5jbXAodmFsdWUsIFNFTElOVVhfQ09OVEVYVF9LRVlXT1JEIj0iLCBzaXplb2YoU0VMSU5VWF9DT05URVhUX0tFWVdPUkQiPSIpIC0gMSkgPT0gMCkgeworCQkJdmFsdWUgKz0gc2l6ZW9mKFNFTElOVVhfQ09OVEVYVF9LRVlXT1JEIj0iKSAtIDE7CisJCQlyZXN1bHQgPSB4c3RyZHVwKHZhbHVlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZnJlZShidWYpOworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXI7CisJc3RydWN0IHRhcl9oZWFkZXJfdCB0YXI7CisJY2hhciAqY3A7CisJaW50IGksIHN1bV91LCBzdW07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZCisJaW50IHN1bV9zOworI2VuZGlmCisJaW50IHBhcnNlX25hbWVzOworCisJLyogT3VyICJwcml2YXRlIGRhdGEiICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisjIGRlZmluZSBwX2xvbmduYW1lIChhcmNoaXZlX2hhbmRsZS0+dGFyX19sb25nbmFtZSkKKyMgZGVmaW5lIHBfbGlua25hbWUgKGFyY2hpdmVfaGFuZGxlLT50YXJfX2xpbmtuYW1lKQorI2Vsc2UKKyMgZGVmaW5lIHBfbG9uZ25hbWUgMAorIyBkZWZpbmUgcF9saW5rbmFtZSAwCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUyB8fCBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWAorIGFnYWluOgorI2VuZGlmCisJLyogQWxpZ24gaGVhZGVyICovCisJZGF0YV9hbGlnbihhcmNoaXZlX2hhbmRsZSwgNTEyKTsKKworIGFnYWluX2FmdGVyX2FsaWduOgorCisjaWYgRU5BQkxFX0RFU0tUT1AgfHwgRU5BQkxFX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1QKKwkvKiB0byBwcmV2ZW50IG1pc2RldGVjdGlvbiBvZiBiejIgc2lnICovCisJKihhbGlhc2VkX3VpbnQzMl90KikmdGFyID0gMDsKKwlpID0gZnVsbF9yZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsICZ0YXIsIDUxMik7CisJLyogSWYgR05VIHRhciBzZWVzIEVPRiBpbiBhYm92ZSByZWFkLCBpdCBzYXlzOgorCSAqICJ0YXI6IEEgbG9uZSB6ZXJvIGJsb2NrIGF0IE4iLCB3aGVyZSBOID0ga2lsb2J5dGUKKwkgKiB3aGVyZSBFT0Ygd2FzIG1ldCAobm90IEVPRiBibG9jaywgYWN0dWFsIEVPRiEpLAorCSAqIGFuZCBleGl0cyB3aXRoIEVYSVRfU1VDQ0VTUy4KKwkgKiBXZSB3aWxsIG1pbWljIGV4aXQoRVhJVF9TVUNDRVNTKSwgYWx0aG91Z2ggd2Ugd2lsbCBub3QgbWltaWMKKwkgKiB0aGUgbWVzc2FnZSBhbmQgd2UgZG9uJ3QgY2hlY2sgd2hldGhlciB3ZSBpbmRlZWQKKwkgKiBzYXcgemVybyBibG9jayBkaXJlY3RseSBiZWZvcmUgdGhpcy4gKi8KKwlpZiAoaSA9PSAwKSB7CisJCXhmdW5jX2Vycm9yX3JldHZhbCA9IDA7Cisgc2hvcnRfcmVhZDoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwl9CisJaWYgKGkgIT0gNTEyKSB7CisJCUlGX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1QoZ290byBhdXRvZGV0ZWN0OykKKwkJZ290byBzaG9ydF9yZWFkOworCX0KKworI2Vsc2UKKwlpID0gNTEyOworCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsICZ0YXIsIGkpOworI2VuZGlmCisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBpOworCisJLyogSWYgdGhlcmUgaXMgbm8gZmlsZW5hbWUgaXRzIGFuIGVtcHR5IGhlYWRlciAqLworCWlmICh0YXIubmFtZVswXSA9PSAwICYmIHRhci5wcmVmaXhbMF0gPT0gMCkgeworCQlpZiAoYXJjaGl2ZV9oYW5kbGUtPnRhcl9fZW5kKSB7CisJCQkvKiBTZWNvbmQgY29uc2VjdXRpdmUgZW1wdHkgaGVhZGVyIC0gZW5kIG9mIGFyY2hpdmUuCisJCQkgKiBSZWFkIHVudGlsIHRoZSBlbmQgdG8gZW1wdHkgdGhlIHBpcGUgZnJvbSBneiBvciBiejIKKwkJCSAqLworCQkJd2hpbGUgKGZ1bGxfcmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCAmdGFyLCA1MTIpID09IDUxMikKKwkJCQljb250aW51ZTsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fZW5kID0gMTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fZW5kID0gMDsKKworCS8qIENoZWNrIGhlYWRlciBoYXMgdmFsaWQgbWFnaWMsICJ1c3RhciIgaXMgZm9yIHRoZSBwcm9wZXIgdGFyLAorCSAqIGZpdmUgTlVMcyBhcmUgZm9yIHRoZSBvbGQgdGFyIGZvcm1hdCAgKi8KKwlpZiAoc3RybmNtcCh0YXIubWFnaWMsICJ1c3RhciIsIDUpICE9IDAKKwkgJiYgKCFFTkFCTEVfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFkKKwkgICAgIHx8IG1lbWNtcCh0YXIubWFnaWMsICJcMFwwXDBcMCIsIDUpICE9IDApCisJKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1QKKwkJY2hhciBGQVNUX0ZVTkMgKCpnZXRfaGVhZGVyX3B0cikoYXJjaGl2ZV9oYW5kbGVfdCAqKTsKKwkJdWludDE2X3QgbWFnaWMyOworCisgYXV0b2RldGVjdDoKKwkJbWFnaWMyID0gKihiYl9fYWxpYXNlZF91aW50MTZfdCopdGFyLm5hbWU7CisJCS8qIHRhciBnei9ieiBhdXRvZGV0ZWN0OiBjaGVjayBmb3IgZ3ovYnoyIG1hZ2ljLgorCQkgKiBJZiB3ZSBzZWUgdGhlIG1hZ2ljLCBhbmQgaXQgaXMgdGhlIHZlcnkgZmlyc3QgYmxvY2ssCisJCSAqIHdlIGNhbiBzd2l0Y2ggdG8gZ2V0X2hlYWRlcl90YXJfZ3ovYnoyL2x6bWEoKS4KKwkJICogTmVlZHMgc2Vla2FibGUgZmQuIEkgd2lzaCByZWN2KE1TR19QRUVLKSB3b3JrcworCQkgKiBvbiBhbnkgZmQuLi4gKi8KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwkJaWYgKG1hZ2ljMiA9PSBHWklQX01BR0lDKSB7CisJCQlnZXRfaGVhZGVyX3B0ciA9IGdldF9oZWFkZXJfdGFyX2d6OworCQl9IGVsc2UKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJCWlmIChtYWdpYzIgPT0gQlpJUDJfTUFHSUMKKwkJICYmIHRhci5uYW1lWzJdID09ICdoJyAmJiBpc2RpZ2l0KHRhci5uYW1lWzNdKQorCQkpIHsgLyogYnppcDIgKi8KKwkJCWdldF9oZWFkZXJfcHRyID0gZ2V0X2hlYWRlcl90YXJfYnoyOworCQl9IGVsc2UKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWFoKKwkJLy9UT0RPOiBpZiAobWFnaWMyID09IFhaX01BR0lDMSkuLi4KKwkJLy9lbHNlCisjIGVuZGlmCisJCQlnb3RvIGVycjsKKwkJLyogVHdvIGRpZmZlcmVudCBjYXVzZXMgZm9yIGxzZWVrKCkgIT0gMDoKKwkJICogdW5zZWVrYWJsZSBmZCAod291bGQgbGlrZSB0byBzdXBwb3J0IHRoYXQgdG9vLCBidXQuLi4pLAorCQkgKiBvciBub3QgZmlyc3QgYmxvY2sgKGZhbHNlIHBvc2l0aXZlLCBpdCdzIG5vdCAuZ3ovLmJ6MiEpICovCisJCWlmIChsc2VlayhhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCAtaSwgU0VFS19DVVIpICE9IDApCisJCQlnb3RvIGVycjsKKwkJd2hpbGUgKGdldF9oZWFkZXJfcHRyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyBlcnI6CisjZW5kaWYgLyogRkVBVFVSRV9UQVJfQVVUT0RFVEVDVCAqLworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCB0YXIgbWFnaWMiKTsKKwl9CisKKwkvKiBEbyBjaGVja3N1bSBvbiBoZWFkZXJzLgorCSAqIFBPU0lYIHNheXMgdGhhdCBjaGVja3N1bSBpcyBkb25lIG9uIHVuc2lnbmVkIGJ5dGVzLCBidXQKKwkgKiBTdW4gYW5kIEhQLVVYIGdldHMgaXQgd3JvbmcuLi4gbW9yZSBkZXRhaWxzIGluCisJICogR05VIHRhciBzb3VyY2UuICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZCisJc3VtX3MgPSAnICcgKiBzaXplb2YodGFyLmNoa3N1bSk7CisjZW5kaWYKKwlzdW1fdSA9ICcgJyAqIHNpemVvZih0YXIuY2hrc3VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTQ4OyBpKyspIHsKKwkJc3VtX3UgKz0gKCh1bnNpZ25lZCBjaGFyKikmdGFyKVtpXTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkKKwkJc3VtX3MgKz0gKChzaWduZWQgY2hhciopJnRhcilbaV07CisjZW5kaWYKKwl9CisJZm9yIChpID0gMTU2OyBpIDwgNTEyOyBpKyspIHsKKwkJc3VtX3UgKz0gKCh1bnNpZ25lZCBjaGFyKikmdGFyKVtpXTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkKKwkJc3VtX3MgKz0gKChzaWduZWQgY2hhciopJnRhcilbaV07CisjZW5kaWYKKwl9CisJLyogVGhpcyBmaWVsZCBkb2VzIG5vdCBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IChnZXRPY3RhbCkgKi8KKwl7CisJCWNoYXIgKmVuZHA7IC8qIGdjYyBsaWtlcyB0ZW1wIHZhciBmb3IgJmVuZHAgKi8KKwkJc3VtID0gc3RydG91bCh0YXIuY2hrc3VtLCAmZW5kcCwgOCk7CisJCWlmICgoKmVuZHAgIT0gJ1wwJyAmJiAqZW5kcCAhPSAnICcpCisJCSB8fCAoc3VtX3UgIT0gc3VtIElGX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZKCYmIHN1bV9zICE9IHN1bSkpCisJCSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgdGFyIGhlYWRlciBjaGVja3N1bSIpOworCQl9CisJfQorCS8qIGRvbid0IHVzZSB4c3RydG91bCwgdGFyLmNoa3N1bSBtYXkgaGF2ZSBsZWFkaW5nIHNwYWNlcyAqLworCXN1bSA9IHN0cnRvdWwodGFyLmNoa3N1bSwgTlVMTCwgOCk7CisJaWYgKHN1bV91ICE9IHN1bSBJRl9GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWSgmJiBzdW1fcyAhPSBzdW0pKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHRhciBoZWFkZXIgY2hlY2tzdW0iKTsKKwl9CisKKwkvKiAwIGlzIHJlc2VydmVkIGZvciBoaWdoIHBlcmYgZmlsZSwgdHJlYXQgYXMgbm9ybWFsIGZpbGUgKi8KKwlpZiAoIXRhci50eXBlZmxhZykgdGFyLnR5cGVmbGFnID0gJzAnOworCXBhcnNlX25hbWVzID0gKHRhci50eXBlZmxhZyA+PSAnMCcgJiYgdGFyLnR5cGVmbGFnIDw9ICc3Jyk7CisKKwkvKiBnZXRPY3RhbCB0cmFzaGVzIHN1YnNlcXVlbnQgZmllbGQsIHRoZXJlZm9yZSB3ZSBjYWxsIGl0CisJICogb24gZmllbGRzIGluIHJldmVyc2Ugb3JkZXIgKi8KKwlpZiAodGFyLmRldm1ham9yWzBdKSB7CisJCWNoYXIgdCA9IHRhci5wcmVmaXhbMF07CisJCS8qIHdlIHRyYXNoIHByZWZpeFswXSBoZXJlLCBidXQgd2UgRE8gbmVlZCBpdCBsYXRlciEgKi8KKwkJdW5zaWduZWQgbWlub3IgPSBHRVRfT0NUQUwodGFyLmRldm1pbm9yKTsKKwkJdW5zaWduZWQgbWFqb3IgPSBHRVRfT0NUQUwodGFyLmRldm1ham9yKTsKKwkJZmlsZV9oZWFkZXItPmRldmljZSA9IG1ha2VkZXYobWFqb3IsIG1pbm9yKTsKKwkJdGFyLnByZWZpeFswXSA9IHQ7CisJfQorCWZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCA9IE5VTEw7CisJaWYgKCFwX2xpbmtuYW1lICYmIHBhcnNlX25hbWVzICYmIHRhci5saW5rbmFtZVswXSkgeworCQlmaWxlX2hlYWRlci0+bGlua190YXJnZXQgPSB4c3RybmR1cCh0YXIubGlua25hbWUsIHNpemVvZih0YXIubGlua25hbWUpKTsKKwkJLyogRklYTUU6IHdoYXQgaWYgd2UgaGF2ZSBub24tbGluayBvYmplY3Qgd2l0aCBsaW5rX3RhcmdldD8gKi8KKwkJLyogV2lsbCBsaW5rX3RhcmdldCBiZSBmcmVlKCllZD8gKi8KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisJZmlsZV9oZWFkZXItPnRhcl9fdW5hbWUgPSB0YXIudW5hbWVbMF0gPyB4c3RybmR1cCh0YXIudW5hbWUsIHNpemVvZih0YXIudW5hbWUpKSA6IE5VTEw7CisJZmlsZV9oZWFkZXItPnRhcl9fZ25hbWUgPSB0YXIuZ25hbWVbMF0gPyB4c3RybmR1cCh0YXIuZ25hbWUsIHNpemVvZih0YXIuZ25hbWUpKSA6IE5VTEw7CisjZW5kaWYKKwlmaWxlX2hlYWRlci0+bXRpbWUgPSBHRVRfT0NUQUwodGFyLm10aW1lKTsKKwlmaWxlX2hlYWRlci0+c2l6ZSA9IEdFVF9PQ1RBTCh0YXIuc2l6ZSk7CisJZmlsZV9oZWFkZXItPmdpZCA9IEdFVF9PQ1RBTCh0YXIuZ2lkKTsKKwlmaWxlX2hlYWRlci0+dWlkID0gR0VUX09DVEFMKHRhci51aWQpOworCS8qIFNldCBiaXRzIDAtMTEgb2YgdGhlIGZpbGVzIG1vZGUgKi8KKwlmaWxlX2hlYWRlci0+bW9kZSA9IDA3Nzc3ICYgR0VUX09DVEFMKHRhci5tb2RlKTsKKworCWZpbGVfaGVhZGVyLT5uYW1lID0gTlVMTDsKKwlpZiAoIXBfbG9uZ25hbWUgJiYgcGFyc2VfbmFtZXMpIHsKKwkJLyogd2UgdHJhc2ggbW9kZVswXSBoZXJlLCBpdCdzIG9rICovCisJCS8vdGFyLm5hbWVbc2l6ZW9mKHRhci5uYW1lKV0gPSAnXDAnOyAtIGdjYyA0LjMuMCB3b3VsZCBjb21wbGFpbgorCQl0YXIubW9kZVswXSA9ICdcMCc7CisJCWlmICh0YXIucHJlZml4WzBdKSB7CisJCQkvKiBhbmQgcGFkZGluZ1swXSAqLworCQkJLy90YXIucHJlZml4W3NpemVvZih0YXIucHJlZml4KV0gPSAnXDAnOyAtIGdjYyA0LjMuMCB3b3VsZCBjb21wbGFpbgorCQkJdGFyLnBhZGRpbmdbMF0gPSAnXDAnOworCQkJZmlsZV9oZWFkZXItPm5hbWUgPSBjb25jYXRfcGF0aF9maWxlKHRhci5wcmVmaXgsIHRhci5uYW1lKTsKKwkJfSBlbHNlCisJCQlmaWxlX2hlYWRlci0+bmFtZSA9IHhzdHJkdXAodGFyLm5hbWUpOworCX0KKworCS8qIFNldCBiaXRzIDEyLTE1IG9mIHRoZSBmaWxlcyBtb2RlICovCisJLyogKHR5cGVmbGFnIHdhcyBub3QgdHJhc2hlZCBiZWNhdXNlIGNoa3N1bSBkb2VzIG5vdCB1c2UgZ2V0T2N0YWwpICovCisJc3dpdGNoICh0YXIudHlwZWZsYWcpIHsKKwljYXNlICcxJzogLyogaGFyZGxpbmsgKi8KKwkJLyogd2UgbWFyayBoYXJkbGlua3MgYXMgcmVndWxhciBmaWxlcyB3aXRoIHplcm8gc2l6ZSBhbmQgYSBsaW5rIG5hbWUgKi8KKwkJZmlsZV9oZWFkZXItPm1vZGUgfD0gU19JRlJFRzsKKwkJLyogb24gc2l6ZSBvZiBsaW5rIGZpZWxkcyBmcm9tIHN0YXIoNCkKKwkJICogLi4uIEZvciB0YXIgYXJjaGl2ZXMgd3JpdHRlbiBieSBwcmUgUE9TSVguMS0xOTg4CisJCSAqIGltcGxlbWVudGF0aW9ucywgdGhlIHNpemUgZmllbGQgdXN1YWxseSBjb250YWlucyB0aGUgc2l6ZSBvZgorCQkgKiB0aGUgZmlsZSBhbmQgbmVlZHMgdG8gYmUgaWdub3JlZCBhcyBubyBkYXRhIG1heSBmb2xsb3cgdGhpcworCQkgKiBoZWFkZXIgdHlwZS4gIEZvciBQT1NJWC4xLSAxOTg4IGNvbXBsaWFudCBhcmNoaXZlcywgdGhlIHNpemUKKwkJICogZmllbGQgbmVlZHMgdG8gYmUgMC4gIEZvciBQT1NJWC4xLTIwMDEgY29tcGxpYW50IGFyY2hpdmVzLAorCQkgKiB0aGUgc2l6ZSBmaWVsZCBtYXkgYmUgbm9uIHplcm8sIGluZGljYXRpbmcgdGhhdCBmaWxlIGRhdGEgaXMKKwkJICogaW5jbHVkZWQgaW4gdGhlIGFyY2hpdmUuCisJCSAqIGkuZTsgYWx3YXlzIGFzc3VtZSB0aGlzIGlzIHplcm8gZm9yIHNhZmV0eS4KKwkJICovCisJCWdvdG8gc2l6ZTA7CisJY2FzZSAnNyc6CisJLyogY2FzZSAwOiAqLworCWNhc2UgJzAnOgorI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWQorCQlpZiAobGFzdF9jaGFyX2lzKGZpbGVfaGVhZGVyLT5uYW1lLCAnLycpKSB7CisJCQlnb3RvIHNldF9kaXI7CisJCX0KKyNlbmRpZgorCQlmaWxlX2hlYWRlci0+bW9kZSB8PSBTX0lGUkVHOworCQlicmVhazsKKwljYXNlICcyJzoKKwkJZmlsZV9oZWFkZXItPm1vZGUgfD0gU19JRkxOSzsKKwkJLyogaGF2ZSBzZWVuIHRhcmJhbGxzIHdpdGggc2l6ZSBmaWVsZCBjb250YWluaW5nCisJCSAqIHRoZSBzaXplIG9mIHRoZSBsaW5rIHRhcmdldCdzIG5hbWUgKi8KKyBzaXplMDoKKwkJZmlsZV9oZWFkZXItPnNpemUgPSAwOworCQlicmVhazsKKwljYXNlICczJzoKKwkJZmlsZV9oZWFkZXItPm1vZGUgfD0gU19JRkNIUjsKKwkJZ290byBzaXplMDsgLyogcGFyYW5vaWEgKi8KKwljYXNlICc0JzoKKwkJZmlsZV9oZWFkZXItPm1vZGUgfD0gU19JRkJMSzsKKwkJZ290byBzaXplMDsKKwljYXNlICc1JzoKKyBJRl9GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWShzZXRfZGlyOikKKwkJZmlsZV9oZWFkZXItPm1vZGUgfD0gU19JRkRJUjsKKwkJZ290byBzaXplMDsKKwljYXNlICc2JzoKKwkJZmlsZV9oZWFkZXItPm1vZGUgfD0gU19JRklGTzsKKwkJZ290byBzaXplMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwljYXNlICdMJzoKKwkJLyogZnJlZTogcGFyYW5vaWE6IHRhciB3aXRoIHNldmVyYWwgY29uc2VjdXRpdmUgbG9uZ25hbWVzICovCisJCWZyZWUocF9sb25nbmFtZSk7CisJCS8qIEZvciBwYXJhbm9pYSByZWFzb25zIHdlIGFsbG9jYXRlIGV4dHJhIE5VTCBjaGFyICovCisJCXBfbG9uZ25hbWUgPSB4emFsbG9jKGZpbGVfaGVhZGVyLT5zaXplICsgMSk7CisJCS8qIFdlIHJlYWQgQVNDSVogc3RyaW5nLCBpbmNsdWRpbmcgTlVMICovCisJCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIHBfbG9uZ25hbWUsIGZpbGVfaGVhZGVyLT5zaXplKTsKKwkJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBmaWxlX2hlYWRlci0+c2l6ZTsKKwkJLyogcmV0dXJuIGdldF9oZWFkZXJfdGFyKGFyY2hpdmVfaGFuZGxlKTsgKi8KKwkJLyogZ2NjIDQuMS4xIGRpZG4ndCBvcHRpbWl6ZSBpdCBpbnRvIGp1bXAgKi8KKwkJLyogc28gd2Ugd2lsbCBkbyBpdCBvdXJzZWxmLCB0aGlzIGFsc28gc2F2ZXMgc3RhY2sgKi8KKwkJZ290byBhZ2FpbjsKKwljYXNlICdLJzoKKwkJZnJlZShwX2xpbmtuYW1lKTsKKwkJcF9saW5rbmFtZSA9IHh6YWxsb2MoZmlsZV9oZWFkZXItPnNpemUgKyAxKTsKKwkJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgcF9saW5rbmFtZSwgZmlsZV9oZWFkZXItPnNpemUpOworCQlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IGZpbGVfaGVhZGVyLT5zaXplOworCQkvKiByZXR1cm4gZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGUpOyAqLworCQlnb3RvIGFnYWluOworCWNhc2UgJ0QnOgkvKiBHTlUgZHVtcCBkaXIgKi8KKwljYXNlICdNJzoJLyogQ29udGludWF0aW9uIG9mIG11bHRpIHZvbHVtZSBhcmNoaXZlICovCisJY2FzZSAnTic6CS8qIE9sZCBHTlUgZm9yIG5hbWVzID4gMTAwIGNoYXJhY3RlcnMgKi8KKwljYXNlICdTJzoJLyogU3BhcnNlIGZpbGUgKi8KKwljYXNlICdWJzoJLyogVm9sdW1lIGhlYWRlciAqLworI2VuZGlmCisjaWYgIUVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYCisJY2FzZSAnZyc6CS8qIHBheCBnbG9iYWwgaGVhZGVyICovCisJY2FzZSAneCc6CS8qIHBheCBleHRlbmRlZCBoZWFkZXIgKi8KKyNlbHNlCisgc2tpcF9leHRfaGRyOgorI2VuZGlmCisJeworCQlvZmZfdCBzejsKKwkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBza2lwcGluZyBoZWFkZXIgJyVjJyIsIHRhci50eXBlZmxhZyk7CisJCXN6ID0gKGZpbGVfaGVhZGVyLT5zaXplICsgNTExKSAmIH4ob2ZmX3QpNTExOworCQlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IHN6OworCQlzeiA+Pj0gOTsgLyogc3ogLz0gNTEyIGJ1dCB3L28gY29udG9ydGlvbnMgZm9yIHNpZ25lZCBkaXYgKi8KKwkJd2hpbGUgKHN6LS0pCisJCQl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCAmdGFyLCA1MTIpOworCQkvKiByZXR1cm4gZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGUpOyAqLworCQlnb3RvIGFnYWluX2FmdGVyX2FsaWduOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWAorCWNhc2UgJ2cnOgkvKiBwYXggZ2xvYmFsIGhlYWRlciAqLworCWNhc2UgJ3gnOiB7CS8qIHBheCBleHRlbmRlZCBoZWFkZXIgKi8KKwkJY2hhciAqKnBwOworCQlpZiAoKHVvZmZfdClmaWxlX2hlYWRlci0+c2l6ZSA+IDB4ZmZmZmYpIC8qIHBhcmFub2lhICovCisJCQlnb3RvIHNraXBfZXh0X2hkcjsKKwkJcHAgPSAodGFyLnR5cGVmbGFnID09ICdnJykgPyAmYXJjaGl2ZV9oYW5kbGUtPnRhcl9fZ2xvYmFsX3NjdHggOiAmYXJjaGl2ZV9oYW5kbGUtPnRhcl9fbmV4dF9maWxlX3NjdHg7CisJCWZyZWUoKnBwKTsKKwkJKnBwID0gZ2V0X3NlbGludXhfc2N0eF9mcm9tX3BheF9oZHIoYXJjaGl2ZV9oYW5kbGUsIGZpbGVfaGVhZGVyLT5zaXplKTsKKwkJZ290byBhZ2FpbjsKKwl9CisjZW5kaWYKKwlkZWZhdWx0OgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biB0eXBlZmxhZzogMHgleCIsIHRhci50eXBlZmxhZyk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisJaWYgKHBfbG9uZ25hbWUpIHsKKwkJZmlsZV9oZWFkZXItPm5hbWUgPSBwX2xvbmduYW1lOworCQlwX2xvbmduYW1lID0gTlVMTDsKKwl9CisJaWYgKHBfbGlua25hbWUpIHsKKwkJZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0ID0gcF9saW5rbmFtZTsKKwkJcF9saW5rbmFtZSA9IE5VTEw7CisJfQorI2VuZGlmCisKKwkvKiBFdmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgbGFzdCAiLi4iIGNvbXBvbmVudCBpcyBzdHJpcHBlZCAqLworCW92ZXJsYXBwaW5nX3N0cmNweShmaWxlX2hlYWRlci0+bmFtZSwgc3RyaXBfdW5zYWZlX3ByZWZpeChmaWxlX2hlYWRlci0+bmFtZSkpOworCisJLyogU3RyaXAgdHJhaWxpbmcgJy8nIGluIGRpcmVjdG9yaWVzICovCisJLyogTXVzdCBiZSBkb25lIGFmdGVyIG1vZGUgaXMgc2V0IGFzICcvJyBpcyB1c2VkIHRvIGNoZWNrIGlmIGl0J3MgYSBkaXJlY3RvcnkgKi8KKwljcCA9IGxhc3RfY2hhcl9pcyhmaWxlX2hlYWRlci0+bmFtZSwgJy8nKTsKKworCWlmIChhcmNoaXZlX2hhbmRsZS0+ZmlsdGVyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9oZWFkZXIoLyphcmNoaXZlX2hhbmRsZS0+Ki8gZmlsZV9oZWFkZXIpOworCQkvKiBOb3RlIHRoYXQgd2Uga2lsbCB0aGUgJy8nIG9ubHkgYWZ0ZXIgYWN0aW9uX2hlYWRlcigpICovCisJCS8qIChsaWtlIEdOVSB0YXIgMS4xNS4xOiB2ZXJib3NlIG1vZGUgb3V0cHV0cyAiZGlyL2Rpci8iKSAqLworCQlpZiAoY3ApCisJCQkqY3AgPSAnXDAnOworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEoYXJjaGl2ZV9oYW5kbGUpOworCQlpZiAoYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCB8fCBhcmNoaXZlX2hhbmRsZS0+cmVqZWN0KQorCQkJbGxpc3RfYWRkX3RvKCZhcmNoaXZlX2hhbmRsZS0+cGFzc2VkLCBmaWxlX2hlYWRlci0+bmFtZSk7CisJCWVsc2UgLyogQ2FsbGVyIGlzbid0IGludGVyZXN0ZWQgaW4gbGlzdCBvZiB1bnBhY2tlZCBmaWxlcyAqLworCQkJZnJlZShmaWxlX2hlYWRlci0+bmFtZSk7CisJfSBlbHNlIHsKKwkJZGF0YV9za2lwKGFyY2hpdmVfaGFuZGxlKTsKKwkJZnJlZShmaWxlX2hlYWRlci0+bmFtZSk7CisJfQorCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gZmlsZV9oZWFkZXItPnNpemU7CisKKwlmcmVlKGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCk7CisJLyogRG8gbm90IGZyZWUoZmlsZV9oZWFkZXItPm5hbWUpIQorCSAqIEl0IG1pZ2h0IGJlIGluc2VydGVkIGluIGFyY2hpdmVfaGFuZGxlLT5wYXNzZWQgLSBzZWUgYWJvdmUgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwlmcmVlKGZpbGVfaGVhZGVyLT50YXJfX3VuYW1lKTsKKwlmcmVlKGZpbGVfaGVhZGVyLT50YXJfX2duYW1lKTsKKyNlbmRpZgorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX2J6Mi5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9iejIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQzMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9iejIuYwpAQCAtMCwwICsxLDIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl90YXJfYnoyKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCS8qIENhbid0IGxzZWVrIG92ZXIgcGlwZXMgKi8KKwlhcmNoaXZlX2hhbmRsZS0+c2VlayA9IHNlZWtfYnlfcmVhZDsKKworCW9wZW5fdHJhbnNmb3JtZXIoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgdW5wYWNrX2J6Ml9zdHJlYW1fcHJpbWUsICJidW56aXAyIik7CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCA9IDA7CisJd2hpbGUgKGdldF9oZWFkZXJfdGFyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworCisJLyogQ2FuIG9ubHkgZG8gb25lIGZpbGUgYXQgYSB0aW1lICovCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXJfZ3ouYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXJfZ3ouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODlmZWQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9nei5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCitjaGFyIEZBU1RfRlVOQyBnZXRfaGVhZGVyX3Rhcl9neihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKyNpZiBCQl9NTVUKKwl1aW50MTZfdCBtYWdpYzsKKyNlbmRpZgorCisJLyogQ2FuJ3QgbHNlZWsgb3ZlciBwaXBlcyAqLworCWFyY2hpdmVfaGFuZGxlLT5zZWVrID0gc2Vla19ieV9yZWFkOworCisJLyogQ2hlY2sgZ3ppcCBtYWdpYyBvbmx5IGlmIG9wZW5fdHJhbnNmb3JtZXIgd2lsbCBpbnZva2UgdW5wYWNrX2d6X3N0cmVhbSAoTU1VIGNhc2UpLgorCSAqIE90aGVyd2lzZSwgaXQgd2lsbCBpbnZva2UgYW4gZXh0ZXJuYWwgaGVscGVyICJndW56aXAgLWNmIiAoTk9NTVUgY2FzZSkgd2hpY2ggd2lsbAorCSAqIG5lZWQgdGhlIGhlYWRlci4gKi8KKyNpZiBCQl9NTVUKKwl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCAmbWFnaWMsIDIpOworCS8qIENhbiBza2lwIHRoaXMgY2hlY2ssIGJ1dCBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbGVzcyBjbGVhciAqLworCWlmIChtYWdpYyAhPSBHWklQX01BR0lDKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGd6aXAgbWFnaWMiKTsKKwl9CisjZW5kaWYKKworCW9wZW5fdHJhbnNmb3JtZXIoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgdW5wYWNrX2d6X3N0cmVhbSwgImd1bnppcCIpOworCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgPSAwOworCXdoaWxlIChnZXRfaGVhZGVyX3RhcihhcmNoaXZlX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKQorCQljb250aW51ZTsKKworCS8qIENhbiBvbmx5IGRvIG9uZSBmaWxlIGF0IGEgdGltZSAqLworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX2x6bWEuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXJfbHptYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDhlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX2x6bWEuYwpAQCAtMCwwICsxLDI0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTbWFsbCBsem1hIGRlZmxhdGUgaW1wbGVtZW50YXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl90YXJfbHptYShhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwkvKiBDYW4ndCBsc2VlayBvdmVyIHBpcGVzICovCisJYXJjaGl2ZV9oYW5kbGUtPnNlZWsgPSBzZWVrX2J5X3JlYWQ7CisKKwlvcGVuX3RyYW5zZm9ybWVyKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIHVucGFja19sem1hX3N0cmVhbSwgInVubHptYSIpOworCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgPSAwOworCXdoaWxlIChnZXRfaGVhZGVyX3RhcihhcmNoaXZlX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKQorCQljb250aW51ZTsKKworCS8qIENhbiBvbmx5IGRvIG9uZSBmaWxlIGF0IGEgdGltZSAqLworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl9saXN0LmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmYzc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX2xpc3QuYwpAQCAtMCwwICsxLDEyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGhlYWRlcl9saXN0KGNvbnN0IGZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyKQoreworLy9UT0RPOiBjcGlvIC12cCBESVIgc2hvdWxkIG91dHB1dCAiRElSL05BTUUiLCBub3QganVzdCAiTkFNRSIgKi8KKwlwdXRzKGZpbGVfaGVhZGVyLT5uYW1lKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX3NraXAuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX3NraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZjNTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfc2tpcC5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKwordm9pZCBGQVNUX0ZVTkMgaGVhZGVyX3NraXAoY29uc3QgZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIgVU5VU0VEX1BBUkFNKQoreworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfdmVyYm9zZV9saXN0LmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl92ZXJib3NlX2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzRlNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfdmVyYm9zZV9saXN0LmMKQEAgLTAsMCArMSw2OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGhlYWRlcl92ZXJib3NlX2xpc3QoY29uc3QgZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIpCit7CisJc3RydWN0IHRtIHRtX3RpbWU7CisJc3RydWN0IHRtICpwdG0gPSAmdG1fdGltZTsgLy9sb2NhbHRpbWUoJmZpbGVfaGVhZGVyLT5tdGltZSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwljaGFyIHVpZFtzaXplb2YoaW50KSozICsgMl07CisJLypjaGFyIGdpZFtzaXplb2YoaW50KSozICsgMl07Ki8KKwljaGFyICp1c2VyOworCWNoYXIgKmdyb3VwOworCisJbG9jYWx0aW1lX3IoJmZpbGVfaGVhZGVyLT5tdGltZSwgcHRtKTsKKworCXVzZXIgPSBmaWxlX2hlYWRlci0+dGFyX191bmFtZTsKKwlpZiAodXNlciA9PSBOVUxMKSB7CisJCXNwcmludGYodWlkLCAiJXUiLCAodW5zaWduZWQpZmlsZV9oZWFkZXItPnVpZCk7CisJCXVzZXIgPSB1aWQ7CisJfQorCWdyb3VwID0gZmlsZV9oZWFkZXItPnRhcl9fZ25hbWU7CisJaWYgKGdyb3VwID09IE5VTEwpIHsKKwkJLypzcHJpbnRmKGdpZCwgIiV1IiwgKHVuc2lnbmVkKWZpbGVfaGVhZGVyLT5naWQpOyovCisJCWdyb3VwID0gdXRvYShmaWxlX2hlYWRlci0+Z2lkKTsKKwl9CisJcHJpbnRmKCIlcyAlcy8lcyAlOSJPRkZfRk1UInUgJTR1LSUwMnUtJTAydSAlMDJ1OiUwMnU6JTAydSAlcyIsCisJCWJiX21vZGVfc3RyaW5nKGZpbGVfaGVhZGVyLT5tb2RlKSwKKwkJdXNlciwKKwkJZ3JvdXAsCisJCWZpbGVfaGVhZGVyLT5zaXplLAorCQkxOTAwICsgcHRtLT50bV95ZWFyLAorCQkxICsgcHRtLT50bV9tb24sCisJCXB0bS0+dG1fbWRheSwKKwkJcHRtLT50bV9ob3VyLAorCQlwdG0tPnRtX21pbiwKKwkJcHRtLT50bV9zZWMsCisJCWZpbGVfaGVhZGVyLT5uYW1lKTsKKworI2Vsc2UgLyogIUZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FICovCisKKwlsb2NhbHRpbWVfcigmZmlsZV9oZWFkZXItPm10aW1lLCBwdG0pOworCisJcHJpbnRmKCIlcyAldS8ldSAlOSJPRkZfRk1UInUgJTR1LSUwMnUtJTAydSAlMDJ1OiUwMnU6JTAydSAlcyIsCisJCWJiX21vZGVfc3RyaW5nKGZpbGVfaGVhZGVyLT5tb2RlKSwKKwkJKHVuc2lnbmVkKWZpbGVfaGVhZGVyLT51aWQsCisJCSh1bnNpZ25lZClmaWxlX2hlYWRlci0+Z2lkLAorCQlmaWxlX2hlYWRlci0+c2l6ZSwKKwkJMTkwMCArIHB0bS0+dG1feWVhciwKKwkJMSArIHB0bS0+dG1fbW9uLAorCQlwdG0tPnRtX21kYXksCisJCXB0bS0+dG1faG91ciwKKwkJcHRtLT50bV9taW4sCisJCXB0bS0+dG1fc2VjLAorCQlmaWxlX2hlYWRlci0+bmFtZSk7CisKKyNlbmRpZiAvKiBGRUFUVVJFX1RBUl9VTkFNRV9HTkFNRSAqLworCisJLyogTkI6IEdOVSB0YXIgc2hvd3MgIi0+IiBmb3Igc3ltbGlua3MgYW5kICJsaW5rIHRvIiBmb3IgaGFyZGxpbmtzICovCisJaWYgKGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCkgeworCQlwcmludGYoIiAtPiAlcyIsIGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCk7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2luaXRfaGFuZGxlLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2luaXRfaGFuZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0NGVhMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvaW5pdF9oYW5kbGUuYwpAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworYXJjaGl2ZV9oYW5kbGVfdCogRkFTVF9GVU5DIGluaXRfaGFuZGxlKHZvaWQpCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGU7CisKKwkvKiBJbml0aWFsaXplIGRlZmF1bHQgdmFsdWVzICovCisJYXJjaGl2ZV9oYW5kbGUgPSB4emFsbG9jKHNpemVvZihhcmNoaXZlX2hhbmRsZV90KSk7CisJYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyID0geHphbGxvYyhzaXplb2YoZmlsZV9oZWFkZXJfdCkpOworCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX3NraXA7CisJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9za2lwOworCWFyY2hpdmVfaGFuZGxlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2FsbDsKKwlhcmNoaXZlX2hhbmRsZS0+c2VlayA9IHNlZWtfYnlfanVtcDsKKworCXJldHVybiBhcmNoaXZlX2hhbmRsZTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvbGlibHpvLmggYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2xpYmx6by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Mzk5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2xpYmx6by5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni4uMjAwOCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lciA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAibGlibHpvX2ludGVyZmFjZS5oIgorCisvKiBsem8tMi4wMy9zcmMvY29uZmlnMXguaCAqLworI2RlZmluZSBNMl9NSU5fTEVOICAgICAgMworI2RlZmluZSBNMl9NQVhfTEVOICAgICAgOAorI2RlZmluZSBNM19NQVhfTEVOICAgICAgMzMKKyNkZWZpbmUgTTRfTUFYX0xFTiAgICAgIDkKKyNkZWZpbmUgTTFfTUFYX09GRlNFVCAgIDB4MDQwMAorI2RlZmluZSBNMl9NQVhfT0ZGU0VUICAgMHgwODAwCisjZGVmaW5lIE0zX01BWF9PRkZTRVQgICAweDQwMDAKKyNkZWZpbmUgTTRfTUFYX09GRlNFVCAgIDB4YmZmZgorI2RlZmluZSBNMV9NQVJLRVIgICAgICAgMAorI2RlZmluZSBNM19NQVJLRVIgICAgICAgMzIKKyNkZWZpbmUgTTRfTUFSS0VSICAgICAgIDE2CisKKyNkZWZpbmUgTVhfTUFYX09GRlNFVCAgIChNMV9NQVhfT0ZGU0VUICsgTTJfTUFYX09GRlNFVCkKKyNkZWZpbmUgTUlOX0xPT0tBSEVBRCAgIChNMl9NQVhfTEVOICsgMSkKKworI2RlZmluZSBMWk9fRU9GX0NPREUKKworLyogbHpvLTIuMDMvc3JjL2x6b19kaWN0LmggKi8KKyNkZWZpbmUgR0lOREVYKG1fcG9zLG1fb2ZmLGRpY3QsZGluZGV4LGluKSAgICBtX3BvcyA9IGRpY3RbZGluZGV4XQorI2RlZmluZSBEWDIocCxzMSxzMikgXAorICAgICAgICAoKCgoKHVuc2lnbmVkKSgocClbMl0pIDw8IChzMikpIF4gKHApWzFdKSA8PCAoczEpKSBeIChwKVswXSkKKy8vI2RlZmluZSBEQTMocCxzMSxzMixzMykgKChEQTIoKHApKzEsczIsczMpIDw8IChzMSkpICsgKHApWzBdKQorLy8jZGVmaW5lIERTMyhwLHMxLHMyLHMzKSAoKERTMigocCkrMSxzMixzMykgPDwgKHMxKSkgLSAocClbMF0pCisjZGVmaW5lIERYMyhwLHMxLHMyLHMzKSAoKERYMigocCkrMSxzMixzMykgPDwgKHMxKSkgXiAocClbMF0pCisKKyNkZWZpbmUgRF9TSVpFICAgICAgICAoMVUgPDwgRF9CSVRTKQorI2RlZmluZSBEX01BU0sgICAgICAgICgoMVUgPDwgRF9CSVRTKSAtIDEpCisjZGVmaW5lIERfSElHSCAgICAgICAgKChEX01BU0sgPj4gMSkgKyAxKQorCisjZGVmaW5lIExaT19DSEVDS19NUE9TX05PTl9ERVQobV9wb3MsbV9vZmYsaW4saXAsbWF4X29mZnNldCkgXAorICAgICggXAorICAgICAgICBtX3BvcyA9IGlwIC0gKHVuc2lnbmVkKShpcCAtIG1fcG9zKSwgXAorICAgICAgICAoKHVpbnRwdHJfdCltX3BvcyA8ICh1aW50cHRyX3QpaW4gXAorCXx8IChtX29mZiA9ICh1bnNpZ25lZCkoaXAgLSBtX3BvcykpIDw9IDAgXAorCXx8IG1fb2ZmID4gbWF4X29mZnNldCkgXAorICAgICkKKworI2RlZmluZSBERU5UUlkocCxpbikgICAgICAgICAgICAgICAgICAgICAgKHApCisjZGVmaW5lIFVQREFURV9JKGRpY3QsZHJ1bixpbmRleCxwLGluKSAgICBkaWN0W2luZGV4XSA9IERFTlRSWShwLGluKQorCisjZGVmaW5lIERNUyh2LHMpICAoKHVuc2lnbmVkKSAoKCh2KSAmIChEX01BU0sgPj4gKHMpKSkgPDwgKHMpKSkKKyNkZWZpbmUgRE0odikgICAgICgodW5zaWduZWQpICgodikgJiBEX01BU0spKQorI2RlZmluZSBETVVMKGEsYikgKCh1bnNpZ25lZCkgKChhKSAqIChiKSkpCisKKy8qIGx6by0yLjAzL3NyYy9sem9fcHRyLmggKi8KKyNkZWZpbmUgcGQoYSxiKSAgKCh1bnNpZ25lZCkoKGEpLShiKSkpCisKKyMgICAgZGVmaW5lIFRFU1RfSVAgICAgICAgICAgICAgKGlwIDwgaXBfZW5kKQorIyAgICBkZWZpbmUgTkVFRF9JUCh4KSBcCisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShpcF9lbmQgLSBpcCkgPCAodW5zaWduZWQpKHgpKSAgZ290byBpbnB1dF9vdmVycnVuCisKKyMgICAgdW5kZWYgVEVTVF9PUCAgICAgICAgICAgICAgLyogZG9uJ3QgbmVlZCBib3RoIG9mIHRoZSB0ZXN0cyBoZXJlICovCisjICAgIGRlZmluZSBURVNUX09QICAgICAgICAgICAgIDEKKyMgICAgZGVmaW5lIE5FRURfT1AoeCkgXAorICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkob3BfZW5kIC0gb3ApIDwgKHVuc2lnbmVkKSh4KSkgIGdvdG8gb3V0cHV0X292ZXJydW4KKworI2RlZmluZSBIQVZFX0FOWV9PUCAxCisKKy8vI2lmIGRlZmluZWQoTFpPX1RFU1RfT1ZFUlJVTl9MT09LQkVISU5EKQorIyAgZGVmaW5lIFRFU1RfTEIobV9wb3MpICAgICAgICBpZiAobV9wb3MgPCBvdXQgfHwgbV9wb3MgPj0gb3ApIGdvdG8gbG9va2JlaGluZF9vdmVycnVuCisvLyMgIGRlZmluZSBURVNUX0xCTyhtX3BvcyxvKSAgICAgaWYgKG1fcG9zIDwgb3V0IHx8IG1fcG9zID49IG9wIC0gKG8pKSBnb3RvIGxvb2tiZWhpbmRfb3ZlcnJ1bgorLy8jZWxzZQorLy8jICBkZWZpbmUgVEVTVF9MQihtX3BvcykgICAgICAgICgodm9pZCkgMCkKKy8vIyAgZGVmaW5lIFRFU1RfTEJPKG1fcG9zLG8pICAgICAoKHZvaWQpIDApCisvLyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF8xLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4XzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg4Mzk4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF8xLmMKQEAgLTAsMCArMSwzNSBAQAorLyogTFpPMVgtMSBjb21wcmVzc2lvbgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni4uMjAwOCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lciA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGlibHpvLmgiCisKKyNkZWZpbmUgRF9CSVRTICAgICAgICAgIDE0CisjZGVmaW5lIERfSU5ERVgxKGQscCkgICBkID0gRE0oRE1VTCgweDIxLERYMyhwLDUsNSw2KSkgPj4gNSkKKyNkZWZpbmUgRF9JTkRFWDIoZCxwKSAgIGQgPSAoZCAmIChEX01BU0sgJiAweDdmZikpIF4gKERfSElHSCB8IDB4MWYpCisKKyNkZWZpbmUgRE9fQ09NUFJFU1MgICAgIGx6bzF4XzFfY29tcHJlc3MKKworI2luY2x1ZGUgImx6bzF4X2MuYyIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfMW8uYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfMW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzYxMjUzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF8xby5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIExaTzFYLTEoMTUpIGNvbXByZXNzaW9uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2Li4yMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJsem8uaCIKKworI2RlZmluZSBEX0JJVFMgICAgICAgICAgMTUKKyNkZWZpbmUgRF9JTkRFWDEoZCxwKSAgIGQgPSBETShETVVMKDB4MjEsRFgzKHAsNSw1LDYpKSA+PiA1KQorI2RlZmluZSBEX0lOREVYMihkLHApICAgZCA9IChkICYgKERfTUFTSyAmIDB4N2ZmKSkgXiAoRF9ISUdIIHwgMHgxZikKKworI2RlZmluZSBET19DT01QUkVTUyAgICAgbHpvMXhfMV8xNV9jb21wcmVzcworCisjaW5jbHVkZSAibHpvMXhfYy5jIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF85eC5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF85eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzIwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4Xzl4LmMKQEAgLTAsMCArMSw5MjEgQEAKKy8qIGx6bzF4Xzl4LmMgLS0gaW1wbGVtZW50YXRpb24gb2YgdGhlIExaTzFYLTk5OSBjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA3IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDAxIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTkgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAxOTk4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTYgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGUgZm9sbG93aW5nIGlzIHByb2JhYmx5IG9ubHkgc2FmZSBvbiBJbnRlbC1jb21wYXRpYmxlIHByb2Nlc3NvcnMgLi4uICovCisjZGVmaW5lIExaT19VTkFMSUdORURfT0tfMgorI2RlZmluZSBMWk9fVU5BTElHTkVEX09LXzQKKworI2luY2x1ZGUgImxpYmx6by5oIgorCisjZGVmaW5lIExaT19NQVgoYSxiKSAgICAgICAgKChhKSA+PSAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIExaT19NSU4oYSxiKSAgICAgICAgKChhKSA8PSAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIExaT19NQVgzKGEsYixjKSAgICAgKChhKSA+PSAoYikgPyBMWk9fTUFYKGEsYykgOiBMWk9fTUFYKGIsYykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1dEX04gICAgICAgICAgIE00X01BWF9PRkZTRVQgICAvKiBzaXplIG9mIHJpbmcgYnVmZmVyICovCisjZGVmaW5lIFNXRF9GICAgICAgICAgICAyMDQ4ICAgICAgICAgICAvKiB1cHBlciBsaW1pdCBmb3IgbWF0Y2ggbGVuZ3RoICovCisKKyNkZWZpbmUgU1dEX0JFU1RfT0ZGICAgIChMWk9fTUFYMyhNMl9NQVhfTEVOLCBNM19NQVhfTEVOLCBNNF9NQVhfTEVOKSArIDEpCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgaW5pdDsKKworCXVuc2lnbmVkIGxvb2s7ICAgICAgICAgIC8qIGJ5dGVzIGluIGxvb2thaGVhZCBidWZmZXIgKi8KKworCXVuc2lnbmVkIG1fbGVuOworCXVuc2lnbmVkIG1fb2ZmOworCisJY29uc3QgdWludDhfdCAqYnA7CisJY29uc3QgdWludDhfdCAqaXA7CisJY29uc3QgdWludDhfdCAqaW47CisJY29uc3QgdWludDhfdCAqaW5fZW5kOworCXVpbnQ4X3QgKm91dDsKKworCXVuc2lnbmVkIHIxX2xpdDsKKworfSBsem8xeF85OTlfdDsKKworI2RlZmluZSBnZXRieXRlKGMpICAoKGMpLmlwIDwgKGMpLmluX2VuZCA/ICooKGMpLmlwKSsrIDogKC0xKSkKKworLyogbHpvX3N3ZC5jIC0tIHNsaWRpbmcgd2luZG93IGRpY3Rpb25hcnkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTV0RfVUlOVF9NQVggICAgICBVU0hSVF9NQVgKKworI2lmbmRlZiBTV0RfSFNJWkUKKyMgIGRlZmluZSBTV0RfSFNJWkUgICAgICAgICAxNjM4NAorI2VuZGlmCisjaWZuZGVmIFNXRF9NQVhfQ0hBSU4KKyMgIGRlZmluZSBTV0RfTUFYX0NIQUlOICAgICAyMDQ4CisjZW5kaWYKKworI2RlZmluZSBIRUFEMyhiLCBwKSBcCisJKCAoKDB4OWY1ZiAqICgoKChiW3BdPDw1KV5iW3ArMV0pPDw1KSBeIGJbcCsyXSkpID4+IDUpICYgKFNXRF9IU0laRS0xKSApCisKKyNpZiBkZWZpbmVkKExaT19VTkFMSUdORURfT0tfMikKKyMgIGRlZmluZSBIRUFEMihiLHApICAgICAgKCogKHVpbnQxNl90ICopICYoYltwXSkpCisjZWxzZQorIyAgZGVmaW5lIEhFQUQyKGIscCkgICAgICAoYltwXSBeICgodW5zaWduZWQpYltwKzFdPDw4KSkKKyNlbmRpZgorI2RlZmluZSBOSUwyICAgICAgICAgICAgICBTV0RfVUlOVF9NQVgKKwordHlwZWRlZiBzdHJ1Y3QgbHpvX3N3ZCB7CisJLyogcHVibGljIC0gImJ1aWx0LWluIiAqLworCisJLyogcHVibGljIC0gY29uZmlndXJhdGlvbiAqLworCXVuc2lnbmVkIG1heF9jaGFpbjsKKwlpbnQgdXNlX2Jlc3Rfb2ZmOworCisJLyogcHVibGljIC0gb3V0cHV0ICovCisJdW5zaWduZWQgbV9sZW47CisJdW5zaWduZWQgbV9vZmY7CisJdW5zaWduZWQgbG9vazsKKwlpbnQgYl9jaGFyOworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCXVuc2lnbmVkIGJlc3Rfb2ZmW1NXRF9CRVNUX09GRl07CisjZW5kaWYKKworCS8qIHNlbWkgcHVibGljICovCisJbHpvMXhfOTk5X3QgKmM7CisJdW5zaWduZWQgbV9wb3M7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJdW5zaWduZWQgYmVzdF9wb3NbU1dEX0JFU1RfT0ZGXTsKKyNlbmRpZgorCisJLyogcHJpdmF0ZSAqLworCXVuc2lnbmVkIGlwOyAgICAgICAgICAgICAgICAvKiBpbnB1dCBwb2ludGVyIChsb29rYWhlYWQpICovCisJdW5zaWduZWQgYnA7ICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBwb2ludGVyICovCisJdW5zaWduZWQgcnA7ICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBwb2ludGVyICovCisKKwl1bnNpZ25lZCBub2RlX2NvdW50OworCXVuc2lnbmVkIGZpcnN0X3JwOworCisJdWludDhfdCBiW1NXRF9OICsgU1dEX0ZdOworCXVpbnQ4X3QgYl93cmFwW1NXRF9GXTsgLyogbXVzdCBmb2xsb3cgYiAqLworCXVpbnQxNl90IGhlYWQzW1NXRF9IU0laRV07CisJdWludDE2X3Qgc3VjYzNbU1dEX04gKyBTV0RfRl07CisJdWludDE2X3QgYmVzdDNbU1dEX04gKyBTV0RfRl07CisJdWludDE2X3QgbGxlbjNbU1dEX0hTSVpFXTsKKyNpZmRlZiBIRUFEMgorCXVpbnQxNl90IGhlYWQyWzY1NTM2TF07CisjZW5kaWYKK30gbHpvX3N3ZF90LCAqbHpvX3N3ZF9wOworCisjZGVmaW5lIFNJWkVPRl9MWk9fU1dEX1QgICAgKHNpemVvZihsem9fc3dkX3QpKQorCisKKy8qIEFjY2VzcyBtYWNybyBmb3IgaGVhZDMuCisgKiBoZWFkM1trZXldIG1heSBiZSB1bmluaXRpYWxpemVkLCBidXQgdGhlbiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgorICovCisjZGVmaW5lIHNfZ2V0X2hlYWQzKHMsa2V5KSAgICBzLT5oZWFkM1trZXldCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCX1NJWkUgKFNXRF9OICsgU1dEX0YpCisKK3N0YXRpYyBpbnQgc3dkX2luaXQobHpvX3N3ZF9wIHMpCit7CisJLyogZGVmYXVsdHMgKi8KKwlzLT5ub2RlX2NvdW50ID0gU1dEX047CisKKwltZW1zZXQocy0+bGxlbjMsIDAsIHNpemVvZihzLT5sbGVuM1swXSkgKiAodW5zaWduZWQpU1dEX0hTSVpFKTsKKyNpZmRlZiBIRUFEMgorCW1lbXNldChzLT5oZWFkMiwgMHhmZiwgc2l6ZW9mKHMtPmhlYWQyWzBdKSAqIDY1NTM2TCk7CisJYXNzZXJ0KHMtPmhlYWQyWzBdID09IE5JTDIpOworI2VuZGlmCisKKwlzLT5pcCA9IDA7CisJcy0+YnAgPSBzLT5pcDsKKwlzLT5maXJzdF9ycCA9IHMtPmlwOworCisJYXNzZXJ0KHMtPmlwICsgU1dEX0YgPD0gQl9TSVpFKTsKKwlzLT5sb29rID0gKHVuc2lnbmVkKSAocy0+Yy0+aW5fZW5kIC0gcy0+Yy0+aXApOworCWlmIChzLT5sb29rID4gMCkgeworCQlpZiAocy0+bG9vayA+IFNXRF9GKQorCQkJcy0+bG9vayA9IFNXRF9GOworCQltZW1jcHkoJnMtPmJbcy0+aXBdLCBzLT5jLT5pcCwgcy0+bG9vayk7CisJCXMtPmMtPmlwICs9IHMtPmxvb2s7CisJCXMtPmlwICs9IHMtPmxvb2s7CisJfQorCWlmIChzLT5pcCA9PSBCX1NJWkUpCisJCXMtPmlwID0gMDsKKworCXMtPnJwID0gcy0+Zmlyc3RfcnA7CisJaWYgKHMtPnJwID49IHMtPm5vZGVfY291bnQpCisJCXMtPnJwIC09IHMtPm5vZGVfY291bnQ7CisJZWxzZQorCQlzLT5ycCArPSBCX1NJWkUgLSBzLT5ub2RlX2NvdW50OworCisJcmV0dXJuIExaT19FX09LOworfQorCisjZGVmaW5lIHN3ZF9wb3Myb2ZmKHMscG9zKSBcCisJKHMtPmJwID4gKHBvcykgPyBzLT5icCAtIChwb3MpIDogQl9TSVpFIC0gKChwb3MpIC0gcy0+YnApKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHN3ZF9nZXRieXRlKGx6b19zd2RfcCBzKQoreworCWludCBjOworCisJaWYgKChjID0gZ2V0Ynl0ZSgqKHMtPmMpKSkgPCAwKSB7CisJCWlmIChzLT5sb29rID4gMCkKKwkJCS0tcy0+bG9vazsKKwl9IGVsc2UgeworCQlzLT5iW3MtPmlwXSA9IGM7CisJCWlmIChzLT5pcCA8IFNXRF9GKQorCQkJcy0+Yl93cmFwW3MtPmlwXSA9IGM7CisJfQorCWlmICgrK3MtPmlwID09IEJfU0laRSkKKwkJcy0+aXAgPSAwOworCWlmICgrK3MtPmJwID09IEJfU0laRSkKKwkJcy0+YnAgPSAwOworCWlmICgrK3MtPnJwID09IEJfU0laRSkKKwkJcy0+cnAgPSAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gcmVtb3ZlIG5vZGUgZnJvbSBsaXN0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc3dkX3JlbW92ZV9ub2RlKGx6b19zd2RfcCBzLCB1bnNpZ25lZCBub2RlKQoreworCWlmIChzLT5ub2RlX2NvdW50ID09IDApIHsKKwkJdW5zaWduZWQga2V5OworCisJCWtleSA9IEhFQUQzKHMtPmIsbm9kZSk7CisJCWFzc2VydChzLT5sbGVuM1trZXldID4gMCk7CisJCS0tcy0+bGxlbjNba2V5XTsKKworI2lmZGVmIEhFQUQyCisJCWtleSA9IEhFQUQyKHMtPmIsbm9kZSk7CisJCWFzc2VydChzLT5oZWFkMltrZXldICE9IE5JTDIpOworCQlpZiAoKHVuc2lnbmVkKSBzLT5oZWFkMltrZXldID09IG5vZGUpCisJCQlzLT5oZWFkMltrZXldID0gTklMMjsKKyNlbmRpZgorCX0gZWxzZQorCQktLXMtPm5vZGVfY291bnQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc3dkX2FjY2VwdChsem9fc3dkX3AgcywgdW5zaWduZWQgbikKK3sKKwlhc3NlcnQobiA8PSBzLT5sb29rKTsKKworCXdoaWxlIChuLS0pIHsKKwkJdW5zaWduZWQga2V5OworCisJCXN3ZF9yZW1vdmVfbm9kZShzLHMtPnJwKTsKKworCQkvKiBhZGQgYnAgaW50byBIRUFEMyAqLworCQlrZXkgPSBIRUFEMyhzLT5iLCBzLT5icCk7CisJCXMtPnN1Y2MzW3MtPmJwXSA9IHNfZ2V0X2hlYWQzKHMsIGtleSk7CisJCXMtPmhlYWQzW2tleV0gPSBzLT5icDsKKwkJcy0+YmVzdDNbcy0+YnBdID0gU1dEX0YgKyAxOworCQlzLT5sbGVuM1trZXldKys7CisJCWFzc2VydChzLT5sbGVuM1trZXldIDw9IFNXRF9OKTsKKworI2lmZGVmIEhFQUQyCisJCS8qIGFkZCBicCBpbnRvIEhFQUQyICovCisJCWtleSA9IEhFQUQyKHMtPmIsIHMtPmJwKTsKKwkJcy0+aGVhZDJba2V5XSA9IHMtPmJwOworI2VuZGlmCisKKwkJc3dkX2dldGJ5dGUocyk7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHN3ZF9zZWFyY2gobHpvX3N3ZF9wIHMsIHVuc2lnbmVkIG5vZGUsIHVuc2lnbmVkIGNudCkKK3sKKwljb25zdCB1aW50OF90ICpwMTsKKwljb25zdCB1aW50OF90ICpwMjsKKwljb25zdCB1aW50OF90ICpweDsKKwl1bnNpZ25lZCBtX2xlbiA9IHMtPm1fbGVuOworCWNvbnN0IHVpbnQ4X3QgKmIgID0gcy0+YjsKKwljb25zdCB1aW50OF90ICpicCA9IHMtPmIgKyBzLT5icDsKKwljb25zdCB1aW50OF90ICpieCA9IHMtPmIgKyBzLT5icCArIHMtPmxvb2s7CisJdW5zaWduZWQgY2hhciBzY2FuX2VuZDE7CisKKwlhc3NlcnQocy0+bV9sZW4gPiAwKTsKKworCXNjYW5fZW5kMSA9IGJwW21fbGVuIC0gMV07CisJZm9yICggOyBjbnQtLSA+IDA7IG5vZGUgPSBzLT5zdWNjM1tub2RlXSkgeworCQlwMSA9IGJwOworCQlwMiA9IGIgKyBub2RlOworCQlweCA9IGJ4OworCisJCWFzc2VydChtX2xlbiA8IHMtPmxvb2spOworCisJCWlmIChwMlttX2xlbiAtIDFdID09IHNjYW5fZW5kMQorCQkgJiYgcDJbbV9sZW5dID09IHAxW21fbGVuXQorCQkgJiYgcDJbMF0gPT0gcDFbMF0KKwkJICYmIHAyWzFdID09IHAxWzFdCisJCSkgeworCQkJdW5zaWduZWQgaTsKKwkJCWFzc2VydChsem9fbWVtY21wKGJwLCAmYltub2RlXSwgMykgPT0gMCk7CisKKwkJCXAxICs9IDI7IHAyICs9IDI7CisJCQlkbyB7fSB3aGlsZSAoKytwMSA8IHB4ICYmICpwMSA9PSAqKytwMik7CisJCQlpID0gcDEtYnA7CisKKwkJCWFzc2VydChsem9fbWVtY21wKGJwLCAmYltub2RlXSwgaSkgPT0gMCk7CisKKyNpZiBkZWZpbmVkKFNXRF9CRVNUX09GRikKKwkJCWlmIChpIDwgU1dEX0JFU1RfT0ZGKSB7CisJCQkJaWYgKHMtPmJlc3RfcG9zW2ldID09IDApCisJCQkJCXMtPmJlc3RfcG9zW2ldID0gbm9kZSArIDE7CisJCQl9CisjZW5kaWYKKwkJCWlmIChpID4gbV9sZW4pIHsKKwkJCQlzLT5tX2xlbiA9IG1fbGVuID0gaTsKKwkJCQlzLT5tX3BvcyA9IG5vZGU7CisJCQkJaWYgKG1fbGVuID09IHMtPmxvb2spCisJCQkJCXJldHVybjsKKwkJCQlpZiAobV9sZW4gPj0gU1dEX0YpCisJCQkJCXJldHVybjsKKwkJCQlpZiAobV9sZW4gPiAodW5zaWduZWQpIHMtPmJlc3QzW25vZGVdKQorCQkJCQlyZXR1cm47CisJCQkJc2Nhbl9lbmQxID0gYnBbbV9sZW4gLSAxXTsKKwkJCX0KKwkJfQorCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgSEVBRDIKKworc3RhdGljIGludCBzd2Rfc2VhcmNoMihsem9fc3dkX3AgcykKK3sKKwl1bnNpZ25lZCBrZXk7CisKKwlhc3NlcnQocy0+bG9vayA+PSAyKTsKKwlhc3NlcnQocy0+bV9sZW4gPiAwKTsKKworCWtleSA9IHMtPmhlYWQyW0hFQUQyKHMtPmIsIHMtPmJwKV07CisJaWYgKGtleSA9PSBOSUwyKQorCQlyZXR1cm4gMDsKKwlhc3NlcnQobHpvX21lbWNtcCgmcy0+YltzLT5icF0sICZzLT5iW2tleV0sIDIpID09IDApOworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCWlmIChzLT5iZXN0X3Bvc1syXSA9PSAwKQorCQlzLT5iZXN0X3Bvc1syXSA9IGtleSArIDE7CisjZW5kaWYKKworCWlmIChzLT5tX2xlbiA8IDIpIHsKKwkJcy0+bV9sZW4gPSAyOworCQlzLT5tX3BvcyA9IGtleTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHN3ZF9maW5kYmVzdChsem9fc3dkX3AgcykKK3sKKwl1bnNpZ25lZCBrZXk7CisJdW5zaWduZWQgY250LCBub2RlOworCXVuc2lnbmVkIGxlbjsKKworCWFzc2VydChzLT5tX2xlbiA+IDApOworCisJLyogZ2V0IGN1cnJlbnQgaGVhZCwgYWRkIGJwIGludG8gSEVBRDMgKi8KKwlrZXkgPSBIRUFEMyhzLT5iLHMtPmJwKTsKKwlub2RlID0gcy0+c3VjYzNbcy0+YnBdID0gc19nZXRfaGVhZDMocywga2V5KTsKKwljbnQgPSBzLT5sbGVuM1trZXldKys7CisJYXNzZXJ0KHMtPmxsZW4zW2tleV0gPD0gU1dEX04gKyBTV0RfRik7CisJaWYgKGNudCA+IHMtPm1heF9jaGFpbikKKwkJY250ID0gcy0+bWF4X2NoYWluOworCXMtPmhlYWQzW2tleV0gPSBzLT5icDsKKworCXMtPmJfY2hhciA9IHMtPmJbcy0+YnBdOworCWxlbiA9IHMtPm1fbGVuOworCWlmIChzLT5tX2xlbiA+PSBzLT5sb29rKSB7CisJCWlmIChzLT5sb29rID09IDApCisJCQlzLT5iX2NoYXIgPSAtMTsKKwkJcy0+bV9vZmYgPSAwOworCQlzLT5iZXN0M1tzLT5icF0gPSBTV0RfRiArIDE7CisJfSBlbHNlIHsKKyNpZmRlZiBIRUFEMgorCQlpZiAoc3dkX3NlYXJjaDIocykpCisjZW5kaWYKKwkJCWlmIChzLT5sb29rID49IDMpCisJCQkJc3dkX3NlYXJjaChzLCBub2RlLCBjbnQpOworCQlpZiAocy0+bV9sZW4gPiBsZW4pCisJCQlzLT5tX29mZiA9IHN3ZF9wb3Myb2ZmKHMscy0+bV9wb3MpOworCQlzLT5iZXN0M1tzLT5icF0gPSBzLT5tX2xlbjsKKworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCQlpZiAocy0+dXNlX2Jlc3Rfb2ZmKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDI7IGkgPCBTV0RfQkVTVF9PRkY7IGkrKykgeworCQkJCWlmIChzLT5iZXN0X3Bvc1tpXSA+IDApCisJCQkJCXMtPmJlc3Rfb2ZmW2ldID0gc3dkX3BvczJvZmYocywgcy0+YmVzdF9wb3NbaV0tMSk7CisJCQkJZWxzZQorCQkJCQlzLT5iZXN0X29mZltpXSA9IDA7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKworCXN3ZF9yZW1vdmVfbm9kZShzLHMtPnJwKTsKKworI2lmZGVmIEhFQUQyCisJLyogYWRkIGJwIGludG8gSEVBRDIgKi8KKwlrZXkgPSBIRUFEMihzLT5iLCBzLT5icCk7CisJcy0+aGVhZDJba2V5XSA9IHMtPmJwOworI2VuZGlmCit9CisKKyN1bmRlZiBIRUFEMworI3VuZGVmIEhFQUQyCisjdW5kZWYgc19nZXRfaGVhZDMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGluaXRfbWF0Y2gobHpvMXhfOTk5X3QgKmMsIGx6b19zd2RfcCBzLCB1aW50MzJfdCB1c2VfYmVzdF9vZmYpCit7CisJaW50IHI7CisKKwlhc3NlcnQoIWMtPmluaXQpOworCWMtPmluaXQgPSAxOworCisJcy0+YyA9IGM7CisKKwlyID0gc3dkX2luaXQocyk7CisJaWYgKHIgIT0gMCkKKwkJcmV0dXJuIHI7CisKKwlzLT51c2VfYmVzdF9vZmYgPSB1c2VfYmVzdF9vZmY7CisJcmV0dXJuIHI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBmaW5kX21hdGNoKGx6bzF4Xzk5OV90ICpjLCBsem9fc3dkX3AgcywKKwkJdW5zaWduZWQgdGhpc19sZW4sIHVuc2lnbmVkIHNraXApCit7CisJYXNzZXJ0KGMtPmluaXQpOworCisJaWYgKHNraXAgPiAwKSB7CisJCWFzc2VydCh0aGlzX2xlbiA+PSBza2lwKTsKKwkJc3dkX2FjY2VwdChzLCB0aGlzX2xlbiAtIHNraXApOworCX0gZWxzZSB7CisJCWFzc2VydCh0aGlzX2xlbiA8PSAxKTsKKwl9CisKKwlzLT5tX2xlbiA9IDE7CisJcy0+bV9sZW4gPSAxOworI2lmZGVmIFNXRF9CRVNUX09GRgorCWlmIChzLT51c2VfYmVzdF9vZmYpCisJCW1lbXNldChzLT5iZXN0X3BvcywgMCwgc2l6ZW9mKHMtPmJlc3RfcG9zKSk7CisjZW5kaWYKKwlzd2RfZmluZGJlc3Qocyk7CisJYy0+bV9sZW4gPSBzLT5tX2xlbjsKKwljLT5tX29mZiA9IHMtPm1fb2ZmOworCisJc3dkX2dldGJ5dGUocyk7CisKKwlpZiAocy0+Yl9jaGFyIDwgMCkgeworCQljLT5sb29rID0gMDsKKwkJYy0+bV9sZW4gPSAwOworCX0gZWxzZSB7CisJCWMtPmxvb2sgPSBzLT5sb29rICsgMTsKKwl9CisJYy0+YnAgPSBjLT5pcCAtIGMtPmxvb2s7CisKKwlyZXR1cm4gTFpPX0VfT0s7Cit9CisKKy8qIHRoaXMgaXMgYSBwdWJsaWMgZnVuY3Rpb25zLCBidXQgdGhlcmUgaXMgbm8gcHJvdG90eXBlIGluIGEgaGVhZGVyIGZpbGUgKi8KK3N0YXRpYyBpbnQgbHpvMXhfOTk5X2NvbXByZXNzX2ludGVybmFsKGNvbnN0IHVpbnQ4X3QgKmluICwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90ICpvdXQsIHVuc2lnbmVkICpvdXRfbGVuLAorCQl2b2lkICp3cmttZW0sCisJCXVuc2lnbmVkIGdvb2RfbGVuZ3RoLAorCQl1bnNpZ25lZCBtYXhfbGF6eSwKKwkJdW5zaWduZWQgbWF4X2NoYWluLAorCQl1aW50MzJfdCB1c2VfYmVzdF9vZmYpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50OF90ICpjb2RlX21hdGNoKGx6bzF4Xzk5OV90ICpjLAorCQl1aW50OF90ICpvcCwgdW5zaWduZWQgbV9sZW4sIHVuc2lnbmVkIG1fb2ZmKQoreworCWFzc2VydChvcCA+IGMtPm91dCk7CisJaWYgKG1fbGVuID09IDIpIHsKKwkJYXNzZXJ0KG1fb2ZmIDw9IE0xX01BWF9PRkZTRVQpOworCQlhc3NlcnQoYy0+cjFfbGl0ID4gMCk7CisJCWFzc2VydChjLT5yMV9saXQgPCA0KTsKKwkJbV9vZmYgLT0gMTsKKwkJKm9wKysgPSBNMV9NQVJLRVIgfCAoKG1fb2ZmICYgMykgPDwgMik7CisJCSpvcCsrID0gbV9vZmYgPj4gMjsKKwl9IGVsc2UgaWYgKG1fbGVuIDw9IE0yX01BWF9MRU4gJiYgbV9vZmYgPD0gTTJfTUFYX09GRlNFVCkgeworCQlhc3NlcnQobV9sZW4gPj0gMyk7CisJCW1fb2ZmIC09IDE7CisJCSpvcCsrID0gKChtX2xlbiAtIDEpIDw8IDUpIHwgKChtX29mZiAmIDcpIDw8IDIpOworCQkqb3ArKyA9IG1fb2ZmID4+IDM7CisJCWFzc2VydChvcFstMl0gPj0gTTJfTUFSS0VSKTsKKwl9IGVsc2UgaWYgKG1fbGVuID09IE0yX01JTl9MRU4gJiYgbV9vZmYgPD0gTVhfTUFYX09GRlNFVCAmJiBjLT5yMV9saXQgPj0gNCkgeworCQlhc3NlcnQobV9sZW4gPT0gMyk7CisJCWFzc2VydChtX29mZiA+IE0yX01BWF9PRkZTRVQpOworCQltX29mZiAtPSAxICsgTTJfTUFYX09GRlNFVDsKKwkJKm9wKysgPSBNMV9NQVJLRVIgfCAoKG1fb2ZmICYgMykgPDwgMik7CisJCSpvcCsrID0gbV9vZmYgPj4gMjsKKwl9IGVsc2UgaWYgKG1fb2ZmIDw9IE0zX01BWF9PRkZTRVQpIHsKKwkJYXNzZXJ0KG1fbGVuID49IDMpOworCQltX29mZiAtPSAxOworCQlpZiAobV9sZW4gPD0gTTNfTUFYX0xFTikKKwkJCSpvcCsrID0gTTNfTUFSS0VSIHwgKG1fbGVuIC0gMik7CisJCWVsc2UgeworCQkJbV9sZW4gLT0gTTNfTUFYX0xFTjsKKwkJCSpvcCsrID0gTTNfTUFSS0VSIHwgMDsKKwkJCXdoaWxlIChtX2xlbiA+IDI1NSkgeworCQkJCW1fbGVuIC09IDI1NTsKKwkJCQkqb3ArKyA9IDA7CisJCQl9CisJCQlhc3NlcnQobV9sZW4gPiAwKTsKKwkJCSpvcCsrID0gbV9sZW47CisJCX0KKwkJKm9wKysgPSBtX29mZiA8PCAyOworCQkqb3ArKyA9IG1fb2ZmID4+IDY7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgazsKKworCQlhc3NlcnQobV9sZW4gPj0gMyk7CisJCWFzc2VydChtX29mZiA+IDB4NDAwMCk7CisJCWFzc2VydChtX29mZiA8PSAweGJmZmYpOworCQltX29mZiAtPSAweDQwMDA7CisJCWsgPSAobV9vZmYgJiAweDQwMDApID4+IDExOworCQlpZiAobV9sZW4gPD0gTTRfTUFYX0xFTikKKwkJCSpvcCsrID0gTTRfTUFSS0VSIHwgayB8IChtX2xlbiAtIDIpOworCQllbHNlIHsKKwkJCW1fbGVuIC09IE00X01BWF9MRU47CisJCQkqb3ArKyA9IE00X01BUktFUiB8IGsgfCAwOworCQkJd2hpbGUgKG1fbGVuID4gMjU1KSB7CisJCQkJbV9sZW4gLT0gMjU1OworCQkJCSpvcCsrID0gMDsKKwkJCX0KKwkJCWFzc2VydChtX2xlbiA+IDApOworCQkJKm9wKysgPSBtX2xlbjsKKwkJfQorCQkqb3ArKyA9IG1fb2ZmIDw8IDI7CisJCSpvcCsrID0gbV9vZmYgPj4gNjsKKwl9CisKKwlyZXR1cm4gb3A7Cit9CisKKworc3RhdGljIHVpbnQ4X3QgKlNUT1JFX1JVTihsem8xeF85OTlfdCAqYywgdWludDhfdCAqb3AsCisJCWNvbnN0IHVpbnQ4X3QgKmlpLCB1bnNpZ25lZCB0KQoreworCWlmIChvcCA9PSBjLT5vdXQgJiYgdCA8PSAyMzgpIHsKKwkJKm9wKysgPSAxNyArIHQ7CisJfSBlbHNlIGlmICh0IDw9IDMpIHsKKwkJb3BbLTJdIHw9IHQ7CisJfSBlbHNlIGlmICh0IDw9IDE4KSB7CisJCSpvcCsrID0gdCAtIDM7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgdHQgPSB0IC0gMTg7CisKKwkJKm9wKysgPSAwOworCQl3aGlsZSAodHQgPiAyNTUpIHsKKwkJCXR0IC09IDI1NTsKKwkJCSpvcCsrID0gMDsKKwkJfQorCQlhc3NlcnQodHQgPiAwKTsKKwkJKm9wKysgPSB0dDsKKwl9CisJZG8gKm9wKysgPSAqaWkrKzsgd2hpbGUgKC0tdCA+IDApOworCisJcmV0dXJuIG9wOworfQorCisKK3N0YXRpYyB1aW50OF90ICpjb2RlX3J1bihsem8xeF85OTlfdCAqYywgdWludDhfdCAqb3AsIGNvbnN0IHVpbnQ4X3QgKmlpLAorCQl1bnNpZ25lZCBsaXQpCit7CisJaWYgKGxpdCA+IDApIHsKKwkJYXNzZXJ0KG1fbGVuID49IDIpOworCQlvcCA9IFNUT1JFX1JVTihjLCBvcCwgaWksIGxpdCk7CisJfSBlbHNlIHsKKwkJYXNzZXJ0KG1fbGVuID49IDMpOworCX0KKwljLT5yMV9saXQgPSBsaXQ7CisKKwlyZXR1cm4gb3A7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBsZW5fb2ZfY29kZWRfbWF0Y2godW5zaWduZWQgbV9sZW4sIHVuc2lnbmVkIG1fb2ZmLCB1bnNpZ25lZCBsaXQpCit7CisJaW50IG4gPSA0OworCisJaWYgKG1fbGVuIDwgMikKKwkJcmV0dXJuIC0xOworCWlmIChtX2xlbiA9PSAyKQorCQlyZXR1cm4gKG1fb2ZmIDw9IE0xX01BWF9PRkZTRVQgJiYgbGl0ID4gMCAmJiBsaXQgPCA0KSA/IDIgOiAtMTsKKwlpZiAobV9sZW4gPD0gTTJfTUFYX0xFTiAmJiBtX29mZiA8PSBNMl9NQVhfT0ZGU0VUKQorCQlyZXR1cm4gMjsKKwlpZiAobV9sZW4gPT0gTTJfTUlOX0xFTiAmJiBtX29mZiA8PSBNWF9NQVhfT0ZGU0VUICYmIGxpdCA+PSA0KQorCQlyZXR1cm4gMjsKKwlpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkgeworCQlpZiAobV9sZW4gPD0gTTNfTUFYX0xFTikKKwkJCXJldHVybiAzOworCQltX2xlbiAtPSBNM19NQVhfTEVOOworCX0gZWxzZSBpZiAobV9vZmYgPD0gTTRfTUFYX09GRlNFVCkgeworCQlpZiAobV9sZW4gPD0gTTRfTUFYX0xFTikKKwkJCXJldHVybiAzOworCQltX2xlbiAtPSBNNF9NQVhfTEVOOworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKG1fbGVuID4gMjU1KSB7CisJCW1fbGVuIC09IDI1NTsKKwkJbisrOworCX0KKwlyZXR1cm4gbjsKK30KKworCitzdGF0aWMgaW50IG1pbl9nYWluKHVuc2lnbmVkIGFoZWFkLCB1bnNpZ25lZCBsaXQxLAorCQkgICAgdW5zaWduZWQgbGl0MiwgaW50IGwxLCBpbnQgbDIsIGludCBsMykKK3sKKwlpbnQgbGF6eV9tYXRjaF9taW5fZ2FpbiA9IDA7CisKKwlhc3NlcnQgKGFoZWFkID49IDEpOworCWxhenlfbWF0Y2hfbWluX2dhaW4gKz0gYWhlYWQ7CisKKwlpZiAobGl0MSA8PSAzKQorCQlsYXp5X21hdGNoX21pbl9nYWluICs9IChsaXQyIDw9IDMpID8gMCA6IDI7CisJZWxzZSBpZiAobGl0MSA8PSAxOCkKKwkJbGF6eV9tYXRjaF9taW5fZ2FpbiArPSAobGl0MiA8PSAxOCkgPyAwIDogMTsKKworCWxhenlfbWF0Y2hfbWluX2dhaW4gKz0gKGwyIC0gbDEpICogMjsKKwlpZiAobDMgPiAwKQorCQlsYXp5X21hdGNoX21pbl9nYWluIC09IChhaGVhZCAtIGwzKSAqIDI7CisKKwlpZiAobGF6eV9tYXRjaF9taW5fZ2FpbiA8IDApCisJCWxhenlfbWF0Y2hfbWluX2dhaW4gPSAwOworCisJcmV0dXJuIGxhenlfbWF0Y2hfbWluX2dhaW47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCitzdGF0aWMgdm9pZCBiZXR0ZXJfbWF0Y2goY29uc3QgbHpvX3N3ZF9wIHN3ZCwKKwkJCSAgIHVuc2lnbmVkICptX2xlbiwgdW5zaWduZWQgKm1fb2ZmKQoreworCWlmICgqbV9sZW4gPD0gTTJfTUlOX0xFTikKKwkJcmV0dXJuOworCisJaWYgKCptX29mZiA8PSBNMl9NQVhfT0ZGU0VUKQorCQlyZXR1cm47CisKKwkvKiBNMy9NNCAtPiBNMiAqLworCWlmICgqbV9vZmYgPiBNMl9NQVhfT0ZGU0VUCisJICYmICptX2xlbiA+PSBNMl9NSU5fTEVOICsgMSAmJiAqbV9sZW4gPD0gTTJfTUFYX0xFTiArIDEKKwkgJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gPD0gTTJfTUFYX09GRlNFVAorCSkgeworCQkqbV9sZW4gPSAqbV9sZW4gLSAxOworCQkqbV9vZmYgPSBzd2QtPmJlc3Rfb2ZmWyptX2xlbl07CisJCXJldHVybjsKKwl9CisKKwkvKiBNNCAtPiBNMiAqLworCWlmICgqbV9vZmYgPiBNM19NQVhfT0ZGU0VUCisJICYmICptX2xlbiA+PSBNNF9NQVhfTEVOICsgMSAmJiAqbV9sZW4gPD0gTTJfTUFYX0xFTiArIDIKKwkgJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMl0gJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMl0gPD0gTTJfTUFYX09GRlNFVAorCSkgeworCQkqbV9sZW4gPSAqbV9sZW4gLSAyOworCQkqbV9vZmYgPSBzd2QtPmJlc3Rfb2ZmWyptX2xlbl07CisJCXJldHVybjsKKwl9CisJLyogTTQgLT4gTTMgKi8KKwlpZiAoKm1fb2ZmID4gTTNfTUFYX09GRlNFVAorCSAmJiAqbV9sZW4gPj0gTTRfTUFYX0xFTiArIDEgJiYgKm1fbGVuIDw9IE0zX01BWF9MRU4gKyAxCisJICYmIHN3ZC0+YmVzdF9vZmZbKm1fbGVuLTFdICYmIHN3ZC0+YmVzdF9vZmZbKm1fbGVuLTFdIDw9IE0zX01BWF9PRkZTRVQKKwkpIHsKKwkJKm1fbGVuID0gKm1fbGVuIC0gMTsKKwkJKm1fb2ZmID0gc3dkLT5iZXN0X29mZlsqbV9sZW5dOworCX0KK30KKworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBsem8xeF85OTlfY29tcHJlc3NfaW50ZXJuYWwoY29uc3QgdWludDhfdCAqaW4sIHVuc2lnbmVkIGluX2xlbiwKKwkJdWludDhfdCAqb3V0LCB1bnNpZ25lZCAqb3V0X2xlbiwKKwkJdm9pZCAqd3JrbWVtLAorCQl1bnNpZ25lZCBnb29kX2xlbmd0aCwKKwkJdW5zaWduZWQgbWF4X2xhenksCisJCXVuc2lnbmVkIG1heF9jaGFpbiwKKwkJdWludDMyX3QgdXNlX2Jlc3Rfb2ZmKQoreworCXVpbnQ4X3QgKm9wOworCWNvbnN0IHVpbnQ4X3QgKmlpOworCXVuc2lnbmVkIGxpdDsKKwl1bnNpZ25lZCBtX2xlbiwgbV9vZmY7CisJbHpvMXhfOTk5X3QgY2M7CisJbHpvMXhfOTk5X3QgKmNvbnN0IGMgPSAmY2M7CisJY29uc3QgbHpvX3N3ZF9wIHN3ZCA9IChsem9fc3dkX3ApIHdya21lbTsKKwlpbnQgcjsKKworCWMtPmluaXQgPSAwOworCWMtPmlwID0gYy0+aW4gPSBpbjsKKwljLT5pbl9lbmQgPSBpbiArIGluX2xlbjsKKwljLT5vdXQgPSBvdXQ7CisKKwlvcCA9IG91dDsKKwlpaSA9IGMtPmlwOyAgICAgICAgICAgICAvKiBwb2ludCB0byBzdGFydCBvZiBsaXRlcmFsIHJ1biAqLworCWxpdCA9IDA7CisJYy0+cjFfbGl0ID0gMDsKKworCXIgPSBpbml0X21hdGNoKGMsIHN3ZCwgdXNlX2Jlc3Rfb2ZmKTsKKwlpZiAociAhPSAwKQorCQlyZXR1cm4gcjsKKwlzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKworCXIgPSBmaW5kX21hdGNoKGMsIHN3ZCwgMCwgMCk7CisJaWYgKHIgIT0gMCkKKwkJcmV0dXJuIHI7CisKKwl3aGlsZSAoYy0+bG9vayA+IDApIHsKKwkJdW5zaWduZWQgYWhlYWQ7CisJCXVuc2lnbmVkIG1heF9haGVhZDsKKwkJaW50IGwxLCBsMiwgbDM7CisKKwkJbV9sZW4gPSBjLT5tX2xlbjsKKwkJbV9vZmYgPSBjLT5tX29mZjsKKworCQlhc3NlcnQoYy0+YnAgPT0gYy0+aXAgLSBjLT5sb29rKTsKKwkJYXNzZXJ0KGMtPmJwID49IGluKTsKKwkJaWYgKGxpdCA9PSAwKQorCQkJaWkgPSBjLT5icDsKKwkJYXNzZXJ0KGlpICsgbGl0ID09IGMtPmJwKTsKKwkJYXNzZXJ0KHN3ZC0+Yl9jaGFyID09ICooYy0+YnApKTsKKworCQlpZiAobV9sZW4gPCAyCisJCSB8fCAobV9sZW4gPT0gMiAmJiAobV9vZmYgPiBNMV9NQVhfT0ZGU0VUIHx8IGxpdCA9PSAwIHx8IGxpdCA+PSA0KSkKKwkJICAgIC8qIERvIG5vdCBhY2NlcHQgdGhpcyBtYXRjaCBmb3IgY29tcHJlc3NlZC1kYXRhIGNvbXBhdGliaWxpdHkKKwkJICAgICAqIHdpdGggTFpPIHYxLjAxIGFuZCBiZWZvcmUKKwkJICAgICAqIFsgbWlnaHQgYmUgYSBwcm9ibGVtIGZvciBkZWNvbXByZXNzKCkgYW5kIG9wdGltaXplKCkgXQorCQkgICAgICovCisJCSB8fCAobV9sZW4gPT0gMiAmJiBvcCA9PSBvdXQpCisJCSB8fCAob3AgPT0gb3V0ICYmIGxpdCA9PSAwKQorCQkpIHsKKwkJCS8qIGEgbGl0ZXJhbCAqLworCQkJbV9sZW4gPSAwOworCQl9CisJCWVsc2UgaWYgKG1fbGVuID09IE0yX01JTl9MRU4pIHsKKwkJCS8qIGNvbXByZXNzaW9uIHJhdGlvIGltcHJvdmVzIGlmIHdlIGNvZGUgYSBsaXRlcmFsIGluIHNvbWUgY2FzZXMgKi8KKwkJCWlmIChtX29mZiA+IE1YX01BWF9PRkZTRVQgJiYgbGl0ID49IDQpCisJCQkJbV9sZW4gPSAwOworCQl9CisKKwkJaWYgKG1fbGVuID09IDApIHsKKwkJCS8qIGEgbGl0ZXJhbCAqLworCQkJbGl0Kys7CisJCQlzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKwkJCXIgPSBmaW5kX21hdGNoKGMsIHN3ZCwgMSwgMCk7CisJCQlhc3NlcnQociA9PSAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYSBtYXRjaCAqLworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCQlpZiAoc3dkLT51c2VfYmVzdF9vZmYpCisJCQliZXR0ZXJfbWF0Y2goc3dkLCAmbV9sZW4sICZtX29mZik7CisjZW5kaWYKKworCQkvKiBzaGFsbCB3ZSB0cnkgYSBsYXp5IG1hdGNoID8gKi8KKwkJYWhlYWQgPSAwOworCQlpZiAobV9sZW4gPj0gbWF4X2xhenkpIHsKKwkJCS8qIG5vICovCisJCQlsMSA9IDA7CisJCQltYXhfYWhlYWQgPSAwOworCQl9IGVsc2UgeworCQkJLyogeWVzLCB0cnkgYSBsYXp5IG1hdGNoICovCisJCQlsMSA9IGxlbl9vZl9jb2RlZF9tYXRjaChtX2xlbiwgbV9vZmYsIGxpdCk7CisJCQlhc3NlcnQobDEgPiAwKTsKKwkJCW1heF9haGVhZCA9IExaT19NSU4oMiwgKHVuc2lnbmVkKWwxIC0gMSk7CisJCX0KKworCisJCXdoaWxlIChhaGVhZCA8IG1heF9haGVhZCAmJiBjLT5sb29rID4gbV9sZW4pIHsKKwkJCWludCBsYXp5X21hdGNoX21pbl9nYWluOworCisJCQlpZiAobV9sZW4gPj0gZ29vZF9sZW5ndGgpCisJCQkJc3dkLT5tYXhfY2hhaW4gPSBtYXhfY2hhaW4gPj4gMjsKKwkJCWVsc2UKKwkJCQlzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKwkJCXIgPSBmaW5kX21hdGNoKGMsIHN3ZCwgMSwgMCk7CisJCQlhaGVhZCsrOworCisJCQlhc3NlcnQociA9PSAwKTsKKwkJCWFzc2VydChjLT5sb29rID4gMCk7CisJCQlhc3NlcnQoaWkgKyBsaXQgKyBhaGVhZCA9PSBjLT5icCk7CisKKwkJCWlmIChjLT5tX2xlbiA8IG1fbGVuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGMtPm1fbGVuID09IG1fbGVuICYmIGMtPm1fb2ZmID49IG1fb2ZmKQorCQkJCWNvbnRpbnVlOworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCQkJaWYgKHN3ZC0+dXNlX2Jlc3Rfb2ZmKQorCQkJCWJldHRlcl9tYXRjaChzd2QsICZjLT5tX2xlbiwgJmMtPm1fb2ZmKTsKKyNlbmRpZgorCQkJbDIgPSBsZW5fb2ZfY29kZWRfbWF0Y2goYy0+bV9sZW4sIGMtPm1fb2ZmLCBsaXQrYWhlYWQpOworCQkJaWYgKGwyIDwgMCkKKwkJCQljb250aW51ZTsKKworCQkJLyogY29tcHJlc3NlZC1kYXRhIGNvbXBhdGliaWxpdHkgW3NlZSBhYm92ZV0gKi8KKwkJCWwzID0gKG9wID09IG91dCkgPyAtMSA6IGxlbl9vZl9jb2RlZF9tYXRjaChhaGVhZCwgbV9vZmYsIGxpdCk7CisKKwkJCWxhenlfbWF0Y2hfbWluX2dhaW4gPSBtaW5fZ2FpbihhaGVhZCwgbGl0LCBsaXQrYWhlYWQsIGwxLCBsMiwgbDMpOworCQkJaWYgKGMtPm1fbGVuID49IG1fbGVuICsgbGF6eV9tYXRjaF9taW5fZ2FpbikgeworCQkJCWlmIChsMyA+IDApIHsKKwkJCQkJLyogY29kZSBwcmV2aW91cyBydW4gKi8KKwkJCQkJb3AgPSBjb2RlX3J1bihjLCBvcCwgaWksIGxpdCk7CisJCQkJCWxpdCA9IDA7CisJCQkJCS8qIGNvZGUgc2hvcnRlbmVkIG1hdGNoICovCisJCQkJCW9wID0gY29kZV9tYXRjaChjLCBvcCwgYWhlYWQsIG1fb2ZmKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaXQgKz0gYWhlYWQ7CisJCQkJCWFzc2VydChpaSArIGxpdCA9PSBjLT5icCk7CisJCQkJfQorCQkJCWdvdG8gbGF6eV9tYXRjaF9kb25lOworCQkJfQorCQl9CisKKwkJYXNzZXJ0KGlpICsgbGl0ICsgYWhlYWQgPT0gYy0+YnApOworCisJCS8qIDEgLSBjb2RlIHJ1biAqLworCQlvcCA9IGNvZGVfcnVuKGMsIG9wLCBpaSwgbGl0KTsKKwkJbGl0ID0gMDsKKworCQkvKiAyIC0gY29kZSBtYXRjaCAqLworCQlvcCA9IGNvZGVfbWF0Y2goYywgb3AsIG1fbGVuLCBtX29mZik7CisJCXN3ZC0+bWF4X2NoYWluID0gbWF4X2NoYWluOworCQlyID0gZmluZF9tYXRjaChjLCBzd2QsIG1fbGVuLCAxK2FoZWFkKTsKKwkJYXNzZXJ0KHIgPT0gMCk7CisKKyBsYXp5X21hdGNoX2RvbmU6IDsKKwl9CisKKwkvKiBzdG9yZSBmaW5hbCBydW4gKi8KKwlpZiAobGl0ID4gMCkKKwkJb3AgPSBTVE9SRV9SVU4oYywgb3AsIGlpLCBsaXQpOworCisjaWYgZGVmaW5lZChMWk9fRU9GX0NPREUpCisJKm9wKysgPSBNNF9NQVJLRVIgfCAxOworCSpvcCsrID0gMDsKKwkqb3ArKyA9IDA7CisjZW5kaWYKKworCSpvdXRfbGVuID0gb3AgLSBvdXQ7CisKKwlyZXR1cm4gTFpPX0VfT0s7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGx6bzF4Xzk5OV9jb21wcmVzc19sZXZlbChjb25zdCB1aW50OF90ICppbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90ICpvdXQsIHVuc2lnbmVkICpvdXRfbGVuLAorCQl2b2lkICp3cmttZW0sCisJCWludCBjb21wcmVzc2lvbl9sZXZlbCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJdWludDE2X3QgZ29vZF9sZW5ndGg7CisJCXVpbnQxNl90IG1heF9sYXp5OworCQl1aW50MTZfdCBtYXhfY2hhaW47CisJCXVpbnQxNl90IHVzZV9iZXN0X29mZjsKKwl9IGNbM10gPSB7CisJCXsgICAgIDgsICAgIDMyLCAgMjU2LCAgIDAgfSwKKwkJeyAgICAzMiwgICAxMjgsIDIwNDgsICAgMSB9LAorCQl7IFNXRF9GLCBTV0RfRiwgNDA5NiwgICAxIH0gICAgICAgLyogbWF4LiBjb21wcmVzc2lvbiAqLworCX07CisKKwlpZiAoY29tcHJlc3Npb25fbGV2ZWwgPCA3IHx8IGNvbXByZXNzaW9uX2xldmVsID4gOSkKKwkJcmV0dXJuIExaT19FX0VSUk9SOworCisJY29tcHJlc3Npb25fbGV2ZWwgLT0gNzsKKwlyZXR1cm4gbHpvMXhfOTk5X2NvbXByZXNzX2ludGVybmFsKGluLCBpbl9sZW4sIG91dCwgb3V0X2xlbiwgd3JrbWVtLAorCQkJCQkgICBjW2NvbXByZXNzaW9uX2xldmVsXS5nb29kX2xlbmd0aCwKKwkJCQkJICAgY1tjb21wcmVzc2lvbl9sZXZlbF0ubWF4X2xhenksCisJCQkJCSAgIGNbY29tcHJlc3Npb25fbGV2ZWxdLm1heF9jaGFpbiwKKwkJCQkJICAgY1tjb21wcmVzc2lvbl9sZXZlbF0udXNlX2Jlc3Rfb2ZmKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfYy5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4NmY3NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfYy5jCkBAIC0wLDAgKzEsMjk2IEBACisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTFpPMVtYWV0tMSBjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYuLjIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBjb21wcmVzcyBhIGJsb2NrIG9mIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTk9JTkxJTkUgdW5zaWduZWQKK2RvX2NvbXByZXNzKGNvbnN0IHVpbnQ4X3QqIGluLCB1bnNpZ25lZCBpbl9sZW4sCisJCXVpbnQ4X3QqIG91dCwgdW5zaWduZWQqIG91dF9sZW4sCisJCXZvaWQqIHdya21lbSkKK3sKKwlyZWdpc3RlciBjb25zdCB1aW50OF90KiBpcDsKKwl1aW50OF90KiBvcDsKKwljb25zdCB1aW50OF90KiBjb25zdCBpbl9lbmQgPSBpbiArIGluX2xlbjsKKwljb25zdCB1aW50OF90KiBjb25zdCBpcF9lbmQgPSBpbiArIGluX2xlbiAtIE0yX01BWF9MRU4gLSA1OworCWNvbnN0IHVpbnQ4X3QqIGlpOworCWNvbnN0IHZvaWQqICpjb25zdCBkaWN0ID0gKGNvbnN0IHZvaWQqKikgd3JrbWVtOworCisJb3AgPSBvdXQ7CisJaXAgPSBpbjsKKwlpaSA9IGlwOworCisJaXAgKz0gNDsKKwlmb3IgKDs7KSB7CisJCXJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QqIG1fcG9zOworCQl1bnNpZ25lZCBtX29mZjsKKwkJdW5zaWduZWQgbV9sZW47CisJCXVuc2lnbmVkIGRpbmRleDsKKworCQlEX0lOREVYMShkaW5kZXgsaXApOworCQlHSU5ERVgobV9wb3MsbV9vZmYsZGljdCxkaW5kZXgsaW4pOworCQlpZiAoTFpPX0NIRUNLX01QT1NfTk9OX0RFVChtX3BvcyxtX29mZixpbixpcCxNNF9NQVhfT0ZGU0VUKSkKKwkJCWdvdG8gbGl0ZXJhbDsKKyNpZiAxCisJCWlmIChtX29mZiA8PSBNMl9NQVhfT0ZGU0VUIHx8IG1fcG9zWzNdID09IGlwWzNdKQorCQkJZ290byB0cnlfbWF0Y2g7CisJCURfSU5ERVgyKGRpbmRleCxpcCk7CisjZW5kaWYKKwkJR0lOREVYKG1fcG9zLG1fb2ZmLGRpY3QsZGluZGV4LGluKTsKKwkJaWYgKExaT19DSEVDS19NUE9TX05PTl9ERVQobV9wb3MsbV9vZmYsaW4saXAsTTRfTUFYX09GRlNFVCkpCisJCQlnb3RvIGxpdGVyYWw7CisJCWlmIChtX29mZiA8PSBNMl9NQVhfT0ZGU0VUIHx8IG1fcG9zWzNdID09IGlwWzNdKQorCQkJZ290byB0cnlfbWF0Y2g7CisJCWdvdG8gbGl0ZXJhbDsKKworIHRyeV9tYXRjaDoKKyNpZiAxICYmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKQorCQlpZiAoKiAoY29uc3QgbHpvX3VzaG9ydHApIG1fcG9zICE9ICogKGNvbnN0IGx6b191c2hvcnRwKSBpcCkKKyNlbHNlCisJCWlmIChtX3Bvc1swXSAhPSBpcFswXSB8fCBtX3Bvc1sxXSAhPSBpcFsxXSkKKyNlbmRpZgorCQl7CisJCX0gZWxzZSB7CisJCQlpZiAobV9wb3NbMl0gPT0gaXBbMl0pIHsKKyNpZiAwCisJCQkJaWYgKG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisJCQkJCWdvdG8gbWF0Y2g7CisJCQkJaWYgKGxpdCA8PSAzKQorCQkJCQlnb3RvIG1hdGNoOworCQkJCWlmIChsaXQgPT0gMykgewkJCSAgLyogYmV0dGVyIGNvbXByZXNzaW9uLCBidXQgc2xvd2VyICovCisJCQkJCWFzc2VydChvcCAtIDIgPiBvdXQpOyBvcFstMl0gfD0gKHVpbnQ4X3QpKDMpOworCQkJCQkqb3ArKyA9ICppaSsrOyAqb3ArKyA9ICppaSsrOyAqb3ArKyA9ICppaSsrOworCQkJCQlnb3RvIGNvZGVfbWF0Y2g7CisJCQkJfQorCQkJCWlmIChtX3Bvc1szXSA9PSBpcFszXSkKKyNlbmRpZgorCQkJCQlnb3RvIG1hdGNoOworCQkJfQorCQkJZWxzZSB7CisJCQkJLyogc3RpbGwgbmVlZCBhIGJldHRlciB3YXkgZm9yIGZpbmRpbmcgTTEgbWF0Y2hlcyAqLworI2lmIDAKKwkJCQkvKiBhIE0xIG1hdGNoICovCisjaWYgMAorCQkJCWlmIChtX29mZiA8PSBNMV9NQVhfT0ZGU0VUICYmIGxpdCA+IDAgJiYgbGl0IDw9IDMpCisjZWxzZQorCQkJCWlmIChtX29mZiA8PSBNMV9NQVhfT0ZGU0VUICYmIGxpdCA9PSAzKQorI2VuZGlmCisJCQkJeworCQkJCQlyZWdpc3RlciB1bnNpZ25lZCB0OworCisJCQkJCXQgPSBsaXQ7CisJCQkJCWFzc2VydChvcCAtIDIgPiBvdXQpOyBvcFstMl0gfD0gKHVpbnQ4X3QpKHQpOworCQkJCQlkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7CisJCQkJCWFzc2VydChpaSA9PSBpcCk7CisJCQkJCW1fb2ZmIC09IDE7CisJCQkJCSpvcCsrID0gKHVpbnQ4X3QpKE0xX01BUktFUiB8ICgobV9vZmYgJiAzKSA8PCAyKSk7CisJCQkJCSpvcCsrID0gKHVpbnQ4X3QpKG1fb2ZmID4+IDIpOworCQkJCQlpcCArPSAyOworCQkJCQlnb3RvIG1hdGNoX2RvbmU7CisJCQkJfQorI2VuZGlmCisJCQl9CisJCX0KKworCQkvKiBhIGxpdGVyYWwgKi8KKyBsaXRlcmFsOgorCQlVUERBVEVfSShkaWN0LCAwLCBkaW5kZXgsIGlwLCBpbik7CisJCSsraXA7CisJCWlmIChpcCA+PSBpcF9lbmQpCisJCQlicmVhazsKKwkJY29udGludWU7CisKKwkJLyogYSBtYXRjaCAqLworbWF0Y2g6CisJCVVQREFURV9JKGRpY3QsIDAsIGRpbmRleCwgaXAsIGluKTsKKwkJLyogc3RvcmUgY3VycmVudCBsaXRlcmFsIHJ1biAqLworCQlpZiAocGQoaXAsIGlpKSA+IDApIHsKKwkJCXJlZ2lzdGVyIHVuc2lnbmVkIHQgPSBwZChpcCwgaWkpOworCisJCQlpZiAodCA8PSAzKSB7CisJCQkJYXNzZXJ0KG9wIC0gMiA+IG91dCk7CisJCQkJb3BbLTJdIHw9ICh1aW50OF90KSh0KTsKKwkJCX0KKwkJCWVsc2UgaWYgKHQgPD0gMTgpCisJCQkJKm9wKysgPSAodWludDhfdCkodCAtIDMpOworCQkJZWxzZSB7CisJCQkJcmVnaXN0ZXIgdW5zaWduZWQgdHQgPSB0IC0gMTg7CisKKwkJCQkqb3ArKyA9IDA7CisJCQkJd2hpbGUgKHR0ID4gMjU1KSB7CisJCQkJCXR0IC09IDI1NTsKKwkJCQkJKm9wKysgPSAwOworCQkJCX0KKwkJCQlhc3NlcnQodHQgPiAwKTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KSh0dCk7CisJCQl9CisJCQlkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7CisJCX0KKworCQkvKiBjb2RlIHRoZSBtYXRjaCAqLworCQlhc3NlcnQoaWkgPT0gaXApOworCQlpcCArPSAzOworCQlpZiAobV9wb3NbM10gIT0gKmlwKysgfHwgbV9wb3NbNF0gIT0gKmlwKysgfHwgbV9wb3NbNV0gIT0gKmlwKysKKwkJIHx8IG1fcG9zWzZdICE9ICppcCsrIHx8IG1fcG9zWzddICE9ICppcCsrIHx8IG1fcG9zWzhdICE9ICppcCsrCisjaWZkZWYgTFpPMVkKKwkJIHx8IG1fcG9zWyA5XSAhPSAqaXArKyB8fCBtX3Bvc1sxMF0gIT0gKmlwKysgfHwgbV9wb3NbMTFdICE9ICppcCsrCisJCSB8fCBtX3Bvc1sxMl0gIT0gKmlwKysgfHwgbV9wb3NbMTNdICE9ICppcCsrIHx8IG1fcG9zWzE0XSAhPSAqaXArKworI2VuZGlmCisJCSkgeworCQkJLS1pcDsKKwkJCW1fbGVuID0gcGQoaXAsIGlpKTsKKwkJCWFzc2VydChtX2xlbiA+PSAzKTsKKwkJCWFzc2VydChtX2xlbiA8PSBNMl9NQVhfTEVOKTsKKworCQkJaWYgKG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpIHsKKwkJCQltX29mZiAtPSAxOworI2lmIGRlZmluZWQoTFpPMVgpCisJCQkJKm9wKysgPSAodWludDhfdCkoKChtX2xlbiAtIDEpIDw8IDUpIHwgKChtX29mZiAmIDcpIDw8IDIpKTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KShtX29mZiA+PiAzKTsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisJCQkJKm9wKysgPSAodWludDhfdCkoKChtX2xlbiArIDEpIDw8IDQpIHwgKChtX29mZiAmIDMpIDw8IDIpKTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KShtX29mZiA+PiAyKTsKKyNlbmRpZgorCQkJfQorCQkJZWxzZSBpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkgeworCQkJCW1fb2ZmIC09IDE7CisJCQkJKm9wKysgPSAodWludDhfdCkoTTNfTUFSS0VSIHwgKG1fbGVuIC0gMikpOworCQkJCWdvdG8gbTNfbTRfb2Zmc2V0OworCQkJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKExaTzFYKQorCQkJCW1fb2ZmIC09IDB4NDAwMDsKKwkJCQlhc3NlcnQobV9vZmYgPiAwKTsKKwkJCQlhc3NlcnQobV9vZmYgPD0gMHg3ZmZmKTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KShNNF9NQVJLRVIgfCAoKG1fb2ZmICYgMHg0MDAwKSA+PiAxMSkgfCAobV9sZW4gLSAyKSk7CisJCQkJZ290byBtM19tNF9vZmZzZXQ7CisjZWxpZiBkZWZpbmVkKExaTzFZKQorCQkJCWdvdG8gbTRfbWF0Y2g7CisjZW5kaWYKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXsKKwkJCQljb25zdCB1aW50OF90KiBlbmQgPSBpbl9lbmQ7CisJCQkJY29uc3QgdWludDhfdCogbSA9IG1fcG9zICsgTTJfTUFYX0xFTiArIDE7CisJCQkJd2hpbGUgKGlwIDwgZW5kICYmICptID09ICppcCkKKwkJCQkJbSsrLCBpcCsrOworCQkJCW1fbGVuID0gcGQoaXAsIGlpKTsKKwkJCX0KKwkJCWFzc2VydChtX2xlbiA+IE0yX01BWF9MRU4pOworCisJCQlpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkgeworCQkJCW1fb2ZmIC09IDE7CisJCQkJaWYgKG1fbGVuIDw9IDMzKQorCQkJCQkqb3ArKyA9ICh1aW50OF90KShNM19NQVJLRVIgfCAobV9sZW4gLSAyKSk7CisJCQkJZWxzZSB7CisJCQkJCW1fbGVuIC09IDMzOworCQkJCQkqb3ArKyA9IE0zX01BUktFUiB8IDA7CisJCQkJCWdvdG8gbTNfbTRfbGVuOworCQkJCX0KKwkJCX0gZWxzZSB7CisjaWYgZGVmaW5lZChMWk8xWSkKKyBtNF9tYXRjaDoKKyNlbmRpZgorCQkJCW1fb2ZmIC09IDB4NDAwMDsKKwkJCQlhc3NlcnQobV9vZmYgPiAwKTsKKwkJCQlhc3NlcnQobV9vZmYgPD0gMHg3ZmZmKTsKKwkJCQlpZiAobV9sZW4gPD0gTTRfTUFYX0xFTikKKwkJCQkJKm9wKysgPSAodWludDhfdCkoTTRfTUFSS0VSIHwgKChtX29mZiAmIDB4NDAwMCkgPj4gMTEpIHwgKG1fbGVuIC0gMikpOworCQkJCWVsc2UgeworCQkJCQltX2xlbiAtPSBNNF9NQVhfTEVOOworCQkJCQkqb3ArKyA9ICh1aW50OF90KShNNF9NQVJLRVIgfCAoKG1fb2ZmICYgMHg0MDAwKSA+PiAxMSkpOworIG0zX200X2xlbjoKKwkJCQkJd2hpbGUgKG1fbGVuID4gMjU1KSB7CisJCQkJCQltX2xlbiAtPSAyNTU7CisJCQkJCQkqb3ArKyA9IDA7CisJCQkJCX0KKwkJCQkJYXNzZXJ0KG1fbGVuID4gMCk7CisJCQkJCSpvcCsrID0gKHVpbnQ4X3QpKG1fbGVuKTsKKwkJCQl9CisJCQl9CisgbTNfbTRfb2Zmc2V0OgorCQkJKm9wKysgPSAodWludDhfdCkoKG1fb2ZmICYgNjMpIDw8IDIpOworCQkJKm9wKysgPSAodWludDhfdCkobV9vZmYgPj4gNik7CisJCX0KKyNpZiAwCisgbWF0Y2hfZG9uZToKKyNlbmRpZgorCQlpaSA9IGlwOworCQlpZiAoaXAgPj0gaXBfZW5kKQorCQkJYnJlYWs7CisJfQorCisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gcGQoaW5fZW5kLCBpaSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gcHVibGljIGVudHJ5IHBvaW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgRE9fQ09NUFJFU1MoY29uc3QgdWludDhfdCogaW4sIHVuc2lnbmVkIGluX2xlbiwKKwkJdWludDhfdCogb3V0LCB1bnNpZ25lZCogb3V0X2xlbiwKKwkJdm9pZCogd3JrbWVtKQoreworCXVpbnQ4X3QqIG9wID0gb3V0OworCXVuc2lnbmVkIHQ7CisKKwlpZiAoaW5fbGVuIDw9IE0yX01BWF9MRU4gKyA1KQorCQl0ID0gaW5fbGVuOworCWVsc2UgeworCQl0ID0gZG9fY29tcHJlc3MoaW4saW5fbGVuLG9wLG91dF9sZW4sd3JrbWVtKTsKKwkJb3AgKz0gKm91dF9sZW47CisJfQorCisJaWYgKHQgPiAwKSB7CisJCWNvbnN0IHVpbnQ4X3QqIGlpID0gaW4gKyBpbl9sZW4gLSB0OworCisJCWlmIChvcCA9PSBvdXQgJiYgdCA8PSAyMzgpCisJCQkqb3ArKyA9ICh1aW50OF90KSgxNyArIHQpOworCQllbHNlIGlmICh0IDw9IDMpCisJCQlvcFstMl0gfD0gKHVpbnQ4X3QpKHQpOworCQllbHNlIGlmICh0IDw9IDE4KQorCQkJKm9wKysgPSAodWludDhfdCkodCAtIDMpOworCQllbHNlIHsKKwkJCXVuc2lnbmVkIHR0ID0gdCAtIDE4OworCisJCQkqb3ArKyA9IDA7CisJCQl3aGlsZSAodHQgPiAyNTUpIHsKKwkJCQl0dCAtPSAyNTU7CisJCQkJKm9wKysgPSAwOworCQkJfQorCQkJYXNzZXJ0KHR0ID4gMCk7CisJCQkqb3ArKyA9ICh1aW50OF90KSh0dCk7CisJCX0KKwkJZG8gKm9wKysgPSAqaWkrKzsgd2hpbGUgKC0tdCA+IDApOworCX0KKworCSpvcCsrID0gTTRfTUFSS0VSIHwgMTsKKwkqb3ArKyA9IDA7CisJKm9wKysgPSAwOworCisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gMDsgLypMWk9fRV9PSyovCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4X2QuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OGE4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4X2QuYwpAQCAtMCwwICsxLDQyMCBAQAorLyogaW1wbGVtZW50YXRpb24gb2YgdGhlIExaTzFYIGRlY29tcHJlc3Npb24gYWxnb3JpdGhtCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2Li4yMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJsem8uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBkZWNvbXByZXNzIGEgYmxvY2sgb2YgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNhZmUgZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZyAqLworaW50IGx6bzF4X2RlY29tcHJlc3Nfc2FmZShjb25zdCB1aW50OF90KiBpbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90KiBvdXQsIHVuc2lnbmVkKiBvdXRfbGVuLAorCQl2b2lkKiB3cmttZW0gVU5VU0VEX1BBUkFNKQoreworCXJlZ2lzdGVyIHVpbnQ4X3QqIG9wOworCXJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QqIGlwOworCXJlZ2lzdGVyIHVuc2lnbmVkIHQ7CisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisJdW5zaWduZWQgbV9vZmY7CisJY29uc3QgdWludDhfdCogZGljdF9lbmQ7CisjZWxzZQorCXJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QqIG1fcG9zID0gTlVMTDsgLyogcG9zc2libHkgbm90IG5lZWRlZCAqLworI2VuZGlmCisJY29uc3QgdWludDhfdCogY29uc3QgaXBfZW5kID0gaW4gKyBpbl9sZW47CisjaWYgZGVmaW5lZChIQVZFX0FOWV9PUCkKKwl1aW50OF90KiBjb25zdCBvcF9lbmQgPSBvdXQgKyAqb3V0X2xlbjsKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPMVopCisJdW5zaWduZWQgbGFzdF9tX29mZiA9IDA7CisjZW5kaWYKKworLy8JTFpPX1VOVVNFRCh3cmttZW0pOworCisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisJaWYgKGRpY3QpIHsKKwkJaWYgKGRpY3RfbGVuID4gTTRfTUFYX09GRlNFVCkgeworCQkJZGljdCArPSBkaWN0X2xlbiAtIE00X01BWF9PRkZTRVQ7CisJCQlkaWN0X2xlbiA9IE00X01BWF9PRkZTRVQ7CisJCX0KKwkJZGljdF9lbmQgPSBkaWN0ICsgZGljdF9sZW47CisJfSBlbHNlIHsKKwkJZGljdF9sZW4gPSAwOworCQlkaWN0X2VuZCA9IE5VTEw7CisJfQorI2VuZGlmIC8qIENPUFlfRElDVCAqLworCisJKm91dF9sZW4gPSAwOworCisJb3AgPSBvdXQ7CisJaXAgPSBpbjsKKworCWlmICgqaXAgPiAxNykgeworCQl0ID0gKmlwKysgLSAxNzsKKwkJaWYgKHQgPCA0KQorCQkJZ290byBtYXRjaF9uZXh0OworCQlhc3NlcnQodCA+IDApOyBORUVEX09QKHQpOyBORUVEX0lQKHQrMSk7CisJCWRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJZ290byBmaXJzdF9saXRlcmFsX3J1bjsKKwl9CisKKwl3aGlsZSAoVEVTVF9JUCAmJiBURVNUX09QKSB7CisJCXQgPSAqaXArKzsKKwkJaWYgKHQgPj0gMTYpCisJCQlnb3RvIG1hdGNoOworCQkvKiBhIGxpdGVyYWwgcnVuICovCisJCWlmICh0ID09IDApIHsKKwkJCU5FRURfSVAoMSk7CisJCQl3aGlsZSAoKmlwID09IDApIHsKKwkJCQl0ICs9IDI1NTsKKwkJCQlpcCsrOworCQkJCU5FRURfSVAoMSk7CisJCQl9CisJCQl0ICs9IDE1ICsgKmlwKys7CisJCX0KKwkJLyogY29weSBsaXRlcmFscyAqLworCQlhc3NlcnQodCA+IDApOworCQlORUVEX09QKHQrMyk7CisJCU5FRURfSVAodCs0KTsKKyNpZiBkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkgfHwgZGVmaW5lZChMWk9fQUxJR05FRF9PS180KQorIyBpZiAhZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpCisJCWlmIChQVFJfQUxJR05FRDJfNChvcCwgaXApKQorIyBlbmRpZgorCQl7CisJCQlDT1BZNChvcCwgaXApOworCQkJb3AgKz0gNDsKKwkJCWlwICs9IDQ7CisJCQlpZiAoLS10ID4gMCkgeworCQkJCWlmICh0ID49IDQpIHsKKwkJCQkJZG8geworCQkJCQkJQ09QWTQob3AsIGlwKTsKKwkJCQkJCW9wICs9IDQ7CisJCQkJCQlpcCArPSA0OworCQkJCQkJdCAtPSA0OworCQkJCQl9IHdoaWxlICh0ID49IDQpOworCQkJCQlpZiAodCA+IDApCisJCQkJCQlkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworCQkJCX0KKwkJCX0KKwkJfQorIyBpZiAhZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpCisJCWVsc2UKKyMgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKwkJeworCQkJKm9wKysgPSAqaXArKzsKKwkJCSpvcCsrID0gKmlwKys7CisJCQkqb3ArKyA9ICppcCsrOworCQkJZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworCQl9CisjZW5kaWYKKworIGZpcnN0X2xpdGVyYWxfcnVuOgorCQl0ID0gKmlwKys7CisJCWlmICh0ID49IDE2KQorCQkJZ290byBtYXRjaDsKKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKyNpZiBkZWZpbmVkKExaTzFaKQorCQltX29mZiA9ICgxICsgTTJfTUFYX09GRlNFVCkgKyAodCA8PCA2KSArICgqaXArKyA+PiAyKTsKKwkJbGFzdF9tX29mZiA9IG1fb2ZmOworI2Vsc2UKKwkJbV9vZmYgPSAoMSArIE0yX01BWF9PRkZTRVQpICsgKHQgPj4gMikgKyAoKmlwKysgPDwgMik7CisjZW5kaWYKKwkJTkVFRF9PUCgzKTsKKwkJdCA9IDM7IENPUFlfRElDVCh0LG1fb2ZmKQorI2Vsc2UgLyogIUNPUFlfRElDVCAqLworI2lmIGRlZmluZWQoTFpPMVopCisJCXQgPSAoMSArIE0yX01BWF9PRkZTRVQpICsgKHQgPDwgNikgKyAoKmlwKysgPj4gMik7CisJCW1fcG9zID0gb3AgLSB0OworCQlsYXN0X21fb2ZmID0gdDsKKyNlbHNlCisJCW1fcG9zID0gb3AgLSAoMSArIE0yX01BWF9PRkZTRVQpOworCQltX3BvcyAtPSB0ID4+IDI7CisJCW1fcG9zIC09ICppcCsrIDw8IDI7CisjZW5kaWYKKwkJVEVTVF9MQihtX3Bvcyk7IE5FRURfT1AoMyk7CisJCSpvcCsrID0gKm1fcG9zKys7CisJCSpvcCsrID0gKm1fcG9zKys7CisJCSpvcCsrID0gKm1fcG9zOworI2VuZGlmIC8qIENPUFlfRElDVCAqLworCQlnb3RvIG1hdGNoX2RvbmU7CisKKwkJLyogaGFuZGxlIG1hdGNoZXMgKi8KKwkJZG8geworIG1hdGNoOgorCQkJaWYgKHQgPj0gNjQpIHsJCS8qIGEgTTIgbWF0Y2ggKi8KKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKyNpZiBkZWZpbmVkKExaTzFYKQorCQkJCW1fb2ZmID0gMSArICgodCA+PiAyKSAmIDcpICsgKCppcCsrIDw8IDMpOworCQkJCXQgPSAodCA+PiA1KSAtIDE7CisjZWxpZiBkZWZpbmVkKExaTzFZKQorCQkJCW1fb2ZmID0gMSArICgodCA+PiAyKSAmIDMpICsgKCppcCsrIDw8IDIpOworCQkJCXQgPSAodCA+PiA0KSAtIDM7CisjZWxpZiBkZWZpbmVkKExaTzFaKQorCQkJCW1fb2ZmID0gdCAmIDB4MWY7CisJCQkJaWYgKG1fb2ZmID49IDB4MWMpCisJCQkJCW1fb2ZmID0gbGFzdF9tX29mZjsKKwkJCQllbHNlIHsKKwkJCQkJbV9vZmYgPSAxICsgKG1fb2ZmIDw8IDYpICsgKCppcCsrID4+IDIpOworCQkJCQlsYXN0X21fb2ZmID0gbV9vZmY7CisJCQkJfQorCQkJCXQgPSAodCA+PiA1KSAtIDE7CisjZW5kaWYKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKyNpZiBkZWZpbmVkKExaTzFYKQorCQkJCW1fcG9zID0gb3AgLSAxOworCQkJCW1fcG9zIC09ICh0ID4+IDIpICYgNzsKKwkJCQltX3BvcyAtPSAqaXArKyA8PCAzOworCQkJCXQgPSAodCA+PiA1KSAtIDE7CisjZWxpZiBkZWZpbmVkKExaTzFZKQorCQkJCW1fcG9zID0gb3AgLSAxOworCQkJCW1fcG9zIC09ICh0ID4+IDIpICYgMzsKKwkJCQltX3BvcyAtPSAqaXArKyA8PCAyOworCQkJCXQgPSAodCA+PiA0KSAtIDM7CisjZWxpZiBkZWZpbmVkKExaTzFaKQorCQkJCXsKKwkJCQkJdW5zaWduZWQgb2ZmID0gdCAmIDB4MWY7CisJCQkJCW1fcG9zID0gb3A7CisJCQkJCWlmIChvZmYgPj0gMHgxYykgeworCQkJCQkJYXNzZXJ0KGxhc3RfbV9vZmYgPiAwKTsKKwkJCQkJCW1fcG9zIC09IGxhc3RfbV9vZmY7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlvZmYgPSAxICsgKG9mZiA8PCA2KSArICgqaXArKyA+PiAyKTsKKwkJCQkJCW1fcG9zIC09IG9mZjsKKwkJCQkJCWxhc3RfbV9vZmYgPSBvZmY7CisJCQkJCX0KKwkJCQl9CisJCQkJdCA9ICh0ID4+IDUpIC0gMTsKKyNlbmRpZgorCQkJCVRFU1RfTEIobV9wb3MpOyBhc3NlcnQodCA+IDApOyBORUVEX09QKHQrMy0xKTsKKwkJCQlnb3RvIGNvcHlfbWF0Y2g7CisjZW5kaWYgLyogQ09QWV9ESUNUICovCisJCQl9CisJCQllbHNlIGlmICh0ID49IDMyKSB7CQkJLyogYSBNMyBtYXRjaCAqLworCQkJCXQgJj0gMzE7CisJCQkJaWYgKHQgPT0gMCkgeworCQkJCQlORUVEX0lQKDEpOworCQkJCQl3aGlsZSAoKmlwID09IDApIHsKKwkJCQkJCXQgKz0gMjU1OworCQkJCQkJaXArKzsKKwkJCQkJCU5FRURfSVAoMSk7CisJCQkJCX0KKwkJCQkJdCArPSAzMSArICppcCsrOworCQkJCX0KKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJCW1fb2ZmID0gMSArIChpcFswXSA8PCA2KSArIChpcFsxXSA+PiAyKTsKKwkJCQlsYXN0X21fb2ZmID0gbV9vZmY7CisjZWxzZQorCQkJCW1fb2ZmID0gMSArIChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKKyNlbmRpZgorI2Vsc2UgLyogIUNPUFlfRElDVCAqLworI2lmIGRlZmluZWQoTFpPMVopCisJCQkJeworCQkJCQl1bnNpZ25lZCBvZmYgPSAxICsgKGlwWzBdIDw8IDYpICsgKGlwWzFdID4+IDIpOworCQkJCQltX3BvcyA9IG9wIC0gb2ZmOworCQkJCQlsYXN0X21fb2ZmID0gb2ZmOworCQkJCX0KKyNlbGlmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKSAmJiBkZWZpbmVkKExaT19BQklfTElUVExFX0VORElBTikKKwkJCQltX3BvcyA9IG9wIC0gMTsKKwkJCQltX3BvcyAtPSAoKiAoY29uc3QgbHpvX3VzaG9ydHApIGlwKSA+PiAyOworI2Vsc2UKKwkJCQltX3BvcyA9IG9wIC0gMTsKKwkJCQltX3BvcyAtPSAoaXBbMF0gPj4gMikgKyAoaXBbMV0gPDwgNik7CisjZW5kaWYKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKwkJCQlpcCArPSAyOworCQkJfQorCQkJZWxzZSBpZiAodCA+PSAxNikgewkJCS8qIGEgTTQgbWF0Y2ggKi8KKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKwkJCQltX29mZiA9ICh0ICYgOCkgPDwgMTE7CisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisJCQkJbV9wb3MgPSBvcDsKKwkJCQltX3BvcyAtPSAodCAmIDgpIDw8IDExOworI2VuZGlmIC8qIENPUFlfRElDVCAqLworCQkJCXQgJj0gNzsKKwkJCQlpZiAodCA9PSAwKSB7CisJCQkJCU5FRURfSVAoMSk7CisJCQkJCXdoaWxlICgqaXAgPT0gMCkgeworCQkJCQkJdCArPSAyNTU7CisJCQkJCQlpcCsrOworCQkJCQkJTkVFRF9JUCgxKTsKKwkJCQkJfQorCQkJCQl0ICs9IDcgKyAqaXArKzsKKwkJCQl9CisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisjaWYgZGVmaW5lZChMWk8xWikKKwkJCQltX29mZiArPSAoaXBbMF0gPDwgNikgKyAoaXBbMV0gPj4gMik7CisjZWxzZQorCQkJCW1fb2ZmICs9IChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKKyNlbmRpZgorCQkJCWlwICs9IDI7CisJCQkJaWYgKG1fb2ZmID09IDApCisJCQkJCWdvdG8gZW9mX2ZvdW5kOworCQkJCW1fb2ZmICs9IDB4NDAwMDsKKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJCWxhc3RfbV9vZmYgPSBtX29mZjsKKyNlbmRpZgorI2Vsc2UgLyogIUNPUFlfRElDVCAqLworI2lmIGRlZmluZWQoTFpPMVopCisJCQkJbV9wb3MgLT0gKGlwWzBdIDw8IDYpICsgKGlwWzFdID4+IDIpOworI2VsaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzIpICYmIGRlZmluZWQoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorCQkJCW1fcG9zIC09ICgqIChjb25zdCBsem9fdXNob3J0cCkgaXApID4+IDI7CisjZWxzZQorCQkJCW1fcG9zIC09IChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKKyNlbmRpZgorCQkJCWlwICs9IDI7CisJCQkJaWYgKG1fcG9zID09IG9wKQorCQkJCQlnb3RvIGVvZl9mb3VuZDsKKwkJCQltX3BvcyAtPSAweDQwMDA7CisjaWYgZGVmaW5lZChMWk8xWikKKwkJCQlsYXN0X21fb2ZmID0gcGQoKGNvbnN0IHVpbnQ4X3QqKW9wLCBtX3Bvcyk7CisjZW5kaWYKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKwkJCX0KKwkJCWVsc2UgewkJCQkvKiBhIE0xIG1hdGNoICovCisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisjaWYgZGVmaW5lZChMWk8xWikKKwkJCQltX29mZiA9IDEgKyAodCA8PCA2KSArICgqaXArKyA+PiAyKTsKKwkJCQlsYXN0X21fb2ZmID0gbV9vZmY7CisjZWxzZQorCQkJCW1fb2ZmID0gMSArICh0ID4+IDIpICsgKCppcCsrIDw8IDIpOworI2VuZGlmCisJCQkJTkVFRF9PUCgyKTsKKwkJCQl0ID0gMjsgQ09QWV9ESUNUKHQsbV9vZmYpCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisjaWYgZGVmaW5lZChMWk8xWikKKwkJCQl0ID0gMSArICh0IDw8IDYpICsgKCppcCsrID4+IDIpOworCQkJCW1fcG9zID0gb3AgLSB0OworCQkJCWxhc3RfbV9vZmYgPSB0OworI2Vsc2UKKwkJCQltX3BvcyA9IG9wIC0gMTsKKwkJCQltX3BvcyAtPSB0ID4+IDI7CisJCQkJbV9wb3MgLT0gKmlwKysgPDwgMjsKKyNlbmRpZgorCQkJCVRFU1RfTEIobV9wb3MpOyBORUVEX09QKDIpOworCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJKm9wKysgPSAqbV9wb3M7CisjZW5kaWYgLyogQ09QWV9ESUNUICovCisJCQkJZ290byBtYXRjaF9kb25lOworCQkJfQorCisJCQkvKiBjb3B5IG1hdGNoICovCisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisKKwkJCU5FRURfT1AodCszLTEpOworCQkJdCArPSAzLTE7IENPUFlfRElDVCh0LG1fb2ZmKQorCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisKKwkJCVRFU1RfTEIobV9wb3MpOyBhc3NlcnQodCA+IDApOyBORUVEX09QKHQrMy0xKTsKKyNpZiBkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkgfHwgZGVmaW5lZChMWk9fQUxJR05FRF9PS180KQorIyBpZiAhZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpCisJCQlpZiAodCA+PSAyICogNCAtICgzIC0gMSkgJiYgUFRSX0FMSUdORUQyXzQob3AsbV9wb3MpKSB7CisJCQkJYXNzZXJ0KChvcCAtIG1fcG9zKSA+PSA0KTsJLyogYm90aCBwb2ludGVycyBhcmUgYWxpZ25lZCAqLworIyBlbHNlCisJCQlpZiAodCA+PSAyICogNCAtICgzIC0gMSkgJiYgKG9wIC0gbV9wb3MpID49IDQpIHsKKyMgZW5kaWYKKwkJCQlDT1BZNChvcCxtX3Bvcyk7CisJCQkJb3AgKz0gNDsgbV9wb3MgKz0gNDsgdCAtPSA0IC0gKDMgLSAxKTsKKwkJCQlkbyB7CisJCQkJCUNPUFk0KG9wLG1fcG9zKTsKKwkJCQkJb3AgKz0gNDsgbV9wb3MgKz0gNDsgdCAtPSA0OworCQkJCX0gd2hpbGUgKHQgPj0gNCk7CisJCQkJaWYgKHQgPiAwKQorCQkJCQlkbyAqb3ArKyA9ICptX3BvcysrOyB3aGlsZSAoLS10ID4gMCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYKKwkJCXsKKyBjb3B5X21hdGNoOgorCQkJCSpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7CisJCQkJZG8gKm9wKysgPSAqbV9wb3MrKzsgd2hpbGUgKC0tdCA+IDApOworCQkJfQorCisjZW5kaWYgLyogQ09QWV9ESUNUICovCisKKyBtYXRjaF9kb25lOgorI2lmIGRlZmluZWQoTFpPMVopCisJCQl0ID0gaXBbLTFdICYgMzsKKyNlbHNlCisJCQl0ID0gaXBbLTJdICYgMzsKKyNlbmRpZgorCQkJaWYgKHQgPT0gMCkKKwkJCQlicmVhazsKKworCQkJLyogY29weSBsaXRlcmFscyAqLworIG1hdGNoX25leHQ6CisJCQlhc3NlcnQodCA+IDApOworCQkJYXNzZXJ0KHQgPCA0KTsKKwkJCU5FRURfT1AodCk7CisJCQlORUVEX0lQKHQrMSk7CisjaWYgMAorCQkJZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworI2Vsc2UKKwkJCSpvcCsrID0gKmlwKys7CisJCQlpZiAodCA+IDEpIHsKKwkJCQkqb3ArKyA9ICppcCsrOworCQkJCWlmICh0ID4gMikKKwkJCQkJKm9wKysgPSAqaXArKzsKKwkJCX0KKyNlbmRpZgorCQkJdCA9ICppcCsrOworCQl9IHdoaWxlIChURVNUX0lQICYmIFRFU1RfT1ApOworCX0KKworLy8jaWYgZGVmaW5lZChIQVZFX1RFU1RfSVApIHx8IGRlZmluZWQoSEFWRV9URVNUX09QKQorCS8qIG5vIEVPRiBjb2RlIHdhcyBmb3VuZCAqLworCSpvdXRfbGVuID0gcGQob3AsIG91dCk7CisJcmV0dXJuIExaT19FX0VPRl9OT1RfRk9VTkQ7CisvLyNlbmRpZgorCisgZW9mX2ZvdW5kOgorCWFzc2VydCh0ID09IDEpOworCSpvdXRfbGVuID0gcGQob3AsIG91dCk7CisJcmV0dXJuIChpcCA9PSBpcF9lbmQgPyBMWk9fRV9PSyA6CisJCSAgIChpcCA8IGlwX2VuZAkgPyBMWk9fRV9JTlBVVF9OT1RfQ09OU1VNRUQgOiBMWk9fRV9JTlBVVF9PVkVSUlVOKSk7CisKKy8vI2lmIGRlZmluZWQoSEFWRV9ORUVEX0lQKQorIGlucHV0X292ZXJydW46CisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gTFpPX0VfSU5QVVRfT1ZFUlJVTjsKKy8vI2VuZGlmCisKKy8vI2lmIGRlZmluZWQoSEFWRV9ORUVEX09QKQorIG91dHB1dF9vdmVycnVuOgorCSpvdXRfbGVuID0gcGQob3AsIG91dCk7CisJcmV0dXJuIExaT19FX09VVFBVVF9PVkVSUlVOOworLy8jZW5kaWYKKworLy8jaWYgZGVmaW5lZChMWk9fVEVTVF9PVkVSUlVOX0xPT0tCRUhJTkQpCisgbG9va2JlaGluZF9vdmVycnVuOgorCSpvdXRfbGVuID0gcGQob3AsIG91dCk7CisJcmV0dXJuIExaT19FX0xPT0tCRUhJTkRfT1ZFUlJVTjsKKy8vI2VuZGlmCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL29wZW5fdHJhbnNmb3JtZXIuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvb3Blbl90cmFuc2Zvcm1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWU1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL29wZW5fdHJhbnNmb3JtZXIuYwpAQCAtMCwwICsxLDU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworLyogdHJhbnNmb3JtZXIoKSwgbW9yZSB0aGFuIG1lZXRzIHRoZSBleWUgKi8KKy8qCisgKiBPbiBNTVUgbWFjaGluZSwgdGhlIHRyYW5zZm9ybV9wcm9nIGlzIHJlbW92ZWQgYnkgbWFjcm8gbWFnaWMKKyAqIGluIGluY2x1ZGUvYXJjaGl2ZS5oLiBPbiBOT01NVSwgdHJhbnNmb3JtZXIgaXMgcmVtb3ZlZC4KKyAqLwordm9pZCBGQVNUX0ZVTkMgb3Blbl90cmFuc2Zvcm1lcihpbnQgZmQsCisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp0cmFuc2Zvcm1lcikoaW50IHNyY19mZCwgaW50IGRzdF9mZCksCisJY29uc3QgY2hhciAqdHJhbnNmb3JtX3Byb2cpCit7CisJc3RydWN0IGZkX3BhaXIgZmRfcGlwZTsKKwlpbnQgcGlkOworCisJeHBpcGVkX3BhaXIoZmRfcGlwZSk7CisJcGlkID0gQkJfTU1VID8geGZvcmsoKSA6IHh2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBDaGlsZCAqLworCQljbG9zZShmZF9waXBlLnJkKTsgLyogd2UgZG9uJ3Qgd2FudCB0byByZWFkIGZyb20gdGhlIHBhcmVudCAqLworCQkvLyBGSVhNRTogZXJyb3IgY2hlY2s/CisjaWYgQkJfTU1VCisJCXRyYW5zZm9ybWVyKGZkLCBmZF9waXBlLndyKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCQljbG9zZShmZF9waXBlLndyKTsgLyogc2VuZCBFT0YgKi8KKwkJCWNsb3NlKGZkKTsKKwkJfQorCQkvKiBtdXN0IGJlIF9leGl0ISBidWcgd2FzIGFjdHVhbGx5IHNlZW4gaGVyZSAqLworCQlfZXhpdChFWElUX1NVQ0NFU1MpOworI2Vsc2UKKwkJeworCQkJY2hhciAqYXJndls0XTsKKwkJCXhtb3ZlX2ZkKGZkLCAwKTsKKwkJCXhtb3ZlX2ZkKGZkX3BpcGUud3IsIDEpOworCQkJYXJndlswXSA9IChjaGFyKil0cmFuc2Zvcm1fcHJvZzsKKwkJCWFyZ3ZbMV0gPSAoY2hhciopIi1jZiI7CisJCQlhcmd2WzJdID0gKGNoYXIqKSItIjsKKwkJCWFyZ3ZbM10gPSBOVUxMOworCQkJQkJfRVhFQ1ZQKHRyYW5zZm9ybV9wcm9nLCBhcmd2KTsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgdHJhbnNmb3JtX3Byb2cpOworCQl9CisjZW5kaWYKKwkJLyogbm90cmVhY2hlZCAqLworCX0KKworCS8qIHBhcmVudCBwcm9jZXNzICovCisJY2xvc2UoZmRfcGlwZS53cik7IC8qIGRvbid0IHdhbnQgdG8gd3JpdGUgdG8gdGhlIGNoaWxkICovCisJeG1vdmVfZmQoZmRfcGlwZS5yZCwgZmQpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9zZWVrX2J5X2p1bXAuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvc2Vla19ieV9qdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYzUyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvc2Vla19ieV9qdW1wLmMKQEAgLTAsMCArMSwxOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIHNlZWtfYnlfanVtcChpbnQgZmQsIG9mZl90IGFtb3VudCkKK3sKKwlpZiAoYW1vdW50CisJICYmIGxzZWVrKGZkLCBhbW91bnQsIFNFRUtfQ1VSKSA9PSAob2ZmX3QpIC0xCisJKSB7CisJCWlmIChlcnJubyA9PSBFU1BJUEUpCisJCQlzZWVrX2J5X3JlYWQoZmQsIGFtb3VudCk7CisJCWVsc2UKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VlayBmYWlsdXJlIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS9zZWVrX2J5X3JlYWQuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvc2Vla19ieV9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5MzFhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvc2Vla19ieV9yZWFkLmMKQEAgLTAsMCArMSwxNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKy8qICBJZiB3ZSBhcmUgcmVhZGluZyB0aHJvdWdoIGEgcGlwZSwgb3IgZnJvbSBzdGRpbiB0aGVuIHdlIGNhbid0IGxzZWVrLAorICogIHdlIG11c3QgcmVhZCBhbmQgZGlzY2FyZCB0aGUgZGF0YSB0byBza2lwIG92ZXIgaXQuCisgKi8KK3ZvaWQgRkFTVF9GVU5DIHNlZWtfYnlfcmVhZChpbnQgZmQsIG9mZl90IGFtb3VudCkKK3sKKwlpZiAoYW1vdW50KQorCQliYl9jb3B5ZmRfZXhhY3Rfc2l6ZShmZCwgLTEsIGFtb3VudCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VucGFja19hcl9hcmNoaXZlLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VucGFja19hcl9hcmNoaXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkYmZkNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW5wYWNrX2FyX2FyY2hpdmUuYwpAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKyNpbmNsdWRlICJhci5oIgorCit2b2lkIEZBU1RfRlVOQyB1bnBhY2tfYXJfYXJjaGl2ZShhcmNoaXZlX2hhbmRsZV90ICphcl9hcmNoaXZlKQoreworCWNoYXIgbWFnaWNbN107CisKKwl4cmVhZChhcl9hcmNoaXZlLT5zcmNfZmQsIG1hZ2ljLCBBUl9NQUdJQ19MRU4pOworCWlmIChzdHJuY21wKG1hZ2ljLCBBUl9NQUdJQywgQVJfTUFHSUNfTEVOKSAhPSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGFyIG1hZ2ljIik7CisJfQorCWFyX2FyY2hpdmUtPm9mZnNldCArPSBBUl9NQUdJQ19MRU47CisKKwl3aGlsZSAoZ2V0X2hlYWRlcl9hcihhcl9hcmNoaXZlKSA9PSBFWElUX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L1JFQURNRSBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5NzJmNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei9SRUFETUUKQEAgLTAsMCArMSwxMzUgQEAKKworWFogRW1iZWRkZWQKKz09PT09PT09PT09CisKKyAgICBYWiBFbWJlZGRlZCBpcyBhIHJlbGF0aXZlbHkgc21hbGwsIGxpbWl0ZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIC54egorICAgIGZpbGUgZm9ybWF0LiBDdXJyZW50bHkgb25seSBkZWNvZGluZyBpcyBpbXBsZW1lbnRlZC4KKworICAgIFhaIEVtYmVkZGVkIHdhcyB3cml0dGVuIGZvciB1c2UgaW4gdGhlIExpbnV4IGtlcm5lbCwgYnV0IHRoZSBjb2RlIGNhbgorICAgIGJlIGVhc2lseSB1c2VkIGluIG90aGVyIGVudmlyb25tZW50cyB0b28sIGluY2x1ZGluZyByZWd1bGFyIHVzZXJzcGFjZQorICAgIGFwcGxpY2F0aW9ucy4KKworICAgIFRoaXMgUkVBRE1FIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZnVsIG9ubHkgd2hlbiB0aGUgY29weQorICAgIG9mIFhaIEVtYmVkZGVkIGlzbid0IHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCB0cmVlLiBZb3Ugc2hvdWxkIGFsc28KKyAgICByZWFkIGxpbnV4L0RvY3VtZW50YXRpb24veHoudHh0IGV2ZW4gaWYgeW91IGFyZW4ndCB1c2luZyBYWiBFbWJlZGRlZAorICAgIGFzIHBhcnQgb2YgTGludXg7IGluZm9ybWF0aW9uIGluIHRoYXQgZmlsZSBpcyBub3QgcmVwZWF0ZWQgaW4gdGhpcworICAgIFJFQURNRS4KKworQ29tcGlsaW5nIHRoZSBMaW51eCBrZXJuZWwgbW9kdWxlCisKKyAgICBUaGUgeHpfZGVjIG1vZHVsZSBkZXBlbmRzIG9uIGNyYzMyIG1vZHVsZSwgc28gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUKKyAgICBpdCBlbmFibGVkIChDT05GSUdfQ1JDMzIpLgorCisgICAgQnVpbGRpbmcgdGhlIHh6X2RlYyBhbmQgeHpfZGVjX3Rlc3QgbW9kdWxlcyB3aXRob3V0IHN1cHBvcnQgZm9yIEJDSgorICAgIGZpbHRlcnM6CisKKyAgICAgICAgY2QgbGludXgvbGliL3h6CisgICAgICAgIG1ha2UgLUMgL3BhdGgvdG8va2VybmVsL3NvdXJjZSBcCisgICAgICAgICAgICAgICAgS0NQUEZMQUdTPS1JIiQocHdkKS8uLi8uLi9pbmNsdWRlIiBNPSIkKHB3ZCkiIFwKKyAgICAgICAgICAgICAgICBDT05GSUdfWFpfREVDPW0gQ09ORklHX1haX0RFQ19URVNUPW0KKworICAgIEJ1aWxkaW5nIHRoZSB4el9kZWMgYW5kIHh6X2RlY190ZXN0IG1vZHVsZXMgd2l0aCBzdXBwb3J0IGZvciBCQ0oKKyAgICBmaWx0ZXJzOgorCisgICAgICAgIGNkIGxpbnV4L2xpYi94egorICAgICAgICBtYWtlIC1DIC9wYXRoL3RvL2tlcm5lbC9zb3VyY2UgXAorICAgICAgICAgICAgICAgIEtDUFBGTEFHUz0tSSIkKHB3ZCkvLi4vLi4vaW5jbHVkZSIgTT0iJChwd2QpIiBcCisgICAgICAgICAgICAgICAgQ09ORklHX1haX0RFQz1tIENPTkZJR19YWl9ERUNfVEVTVD1tIENPTkZJR19YWl9ERUNfQkNKPXkgXAorICAgICAgICAgICAgICAgIENPTkZJR19YWl9ERUNfWDg2PXkgQ09ORklHX1haX0RFQ19QT1dFUlBDPXkgXAorICAgICAgICAgICAgICAgIENPTkZJR19YWl9ERUNfSUE2ND15IENPTkZJR19YWl9ERUNfQVJNPXkgXAorICAgICAgICAgICAgICAgIENPTkZJR19YWl9ERUNfQVJNVEhVTUI9eSBDT05GSUdfWFpfREVDX1NQQVJDPXkKKworICAgIElmIHlvdSB3YW50IG9ubHkgb25lIG9yIGEgZmV3IG9mIHRoZSBCQ0ogZmlsdGVycywgb21pdCB0aGUgYXBwcm9wcmlhdGUKKyAgICB2YXJpYWJsZXMuIENPTkZJR19YWl9ERUNfQkNKPXkgaXMgYWx3YXlzIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBzdXBwb3J0CisgICAgY29kZSBzaGFyZWQgYmV0d2VlbiBhbGwgQkNKIGZpbHRlcnMuCisKKyAgICBNb3N0IHBlb3BsZSBkb24ndCBuZWVkIHRoZSB4el9kZWNfdGVzdCBtb2R1bGUuIFlvdSBjYW4gc2tpcCBidWlsZGluZworICAgIGl0IGJ5IG9taXR0aW5nIENPTkZJR19YWl9ERUNfVEVTVD1tIGZyb20gdGhlIG1ha2UgY29tbWFuZCBsaW5lLgorCitDb21waWxlciByZXF1aXJlbWVudHMKKworICAgIFhaIEVtYmVkZGVkIHNob3VsZCBjb21waWxlIGFzIGVpdGhlciBHTlUtQzg5ICh1c2VkIGluIHRoZSBMaW51eAorICAgIGtlcm5lbCkgb3Igd2l0aCBhbnkgQzk5IGNvbXBpbGVyLiBHZXR0aW5nIHRoZSBjb2RlIHRvIGNvbXBpbGUgd2l0aAorICAgIG5vbi1HTlUgQzg5IGNvbXBpbGVyIG9yIGEgQysrIGNvbXBpbGVyIHNob3VsZCBiZSBxdWl0ZSBlYXN5IGFzCisgICAgbG9uZyBhcyB0aGVyZSBpcyBhIGRhdGEgdHlwZSBmb3IgdW5zaWduZWQgNjQtYml0IGludGVnZXIgKG9yIHRoZQorICAgIGNvZGUgaXMgbW9kaWZpZWQgbm90IHRvIHN1cHBvcnQgbGFyZ2UgZmlsZXMsIHdoaWNoIG5lZWRzIHNvbWUgbW9yZQorICAgIGNhcmUgdGhhbiBqdXN0IHVzaW5nIDMyLWJpdCBpbnRlZ2VyIGluc3RlYWQgb2YgNjQtYml0KS4KKworICAgIElmIHlvdSB1c2UgR0NDLCB0cnkgdG8gdXNlIGEgcmVjZW50IHZlcnNpb24uIEZvciBleGFtcGxlLCBvbiB4ODYsCisgICAgeHpfZGVjX2x6bWEyLmMgY29tcGlsZWQgd2l0aCBHQ0MgMy4zLjYgaXMgMTUtMjUgJSBzbG93ZXIgdGhhbiB3aGVuCisgICAgY29tcGlsZWQgd2l0aCBHQ0MgNC4zLjMuCisKK0VtYmVkZGluZyBpbnRvIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMKKworICAgIFRvIGVtYmVkIHRoZSBYWiBkZWNvZGVyLCBjb3B5IHRoZSBmb2xsb3dpbmcgZmlsZXMgaW50byBhIHNpbmdsZQorICAgIGRpcmVjdG9yeSBpbiB5b3VyIHNvdXJjZSBjb2RlIHRyZWU6CisKKyAgICAgICAgbGludXgvaW5jbHVkZS9saW51eC94ei5oCisgICAgICAgIGxpbnV4L2xpYi94ei94el9jcmMzMi5jCisgICAgICAgIGxpbnV4L2xpYi94ei94el9kZWNfbHptYTIuYworICAgICAgICBsaW51eC9saWIveHoveHpfZGVjX3N0cmVhbS5jCisgICAgICAgIGxpbnV4L2xpYi94ei94el9sem1hMi5oCisgICAgICAgIGxpbnV4L2xpYi94ei94el9wcml2YXRlLmgKKyAgICAgICAgbGludXgvbGliL3h6L3h6X3N0cmVhbS5oCisgICAgICAgIHVzZXJzcGFjZS94el9jb25maWcuaAorCisgICAgQWx0ZXJuYXRpdmVseSwgeHouaCBtYXkgYmUgcGxhY2VkIGludG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5IGJ1dCB0aGVuCisgICAgdGhhdCBkaXJlY3RvcnkgbXVzdCBiZSBpbiB0aGUgY29tcGlsZXIgaW5jbHVkZSBwYXRoIHdoZW4gY29tcGlsaW5nCisgICAgdGhlIC5jIGZpbGVzLgorCisgICAgWW91ciBjb2RlIHNob3VsZCB1c2Ugb25seSB0aGUgZnVuY3Rpb25zIGRlY2xhcmVkIGluIHh6LmguIFRoZSByZXN0IG9mCisgICAgdGhlIC5oIGZpbGVzIGFyZSBtZWFudCBvbmx5IGZvciBpbnRlcm5hbCB1c2UgaW4gWFogRW1iZWRkZWQuCisKKyAgICBZb3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHh6X2NvbmZpZy5oIHRvIGJlIG1vcmUgc3VpdGFibGUgZm9yIHlvdXIgYnVpbGQKKyAgICBlbnZpcm9ubWVudC4gUHJvYmFibHkgeW91IHNob3VsZCBhdCBsZWFzdCBza2ltIHRocm91Z2ggaXQgZXZlbiBpZiB0aGUKKyAgICBkZWZhdWx0IGZpbGUgd29ya3MgYXMgaXMuCisKK0JDSiBmaWx0ZXIgc3VwcG9ydAorCisgICAgSWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igb25lIG9yIG1vcmUgQkNKIGZpbHRlcnMsIHlvdSBuZWVkIHRvIGNvcHkgYWxzbworICAgIGxpbnV4L2xpYi94ei94el9kZWNfYmNqLmMgaW50byB5b3VyIGFwcGxpY2F0aW9uLCBhbmQgdXNlIGFwcHJvcHJpYXRlCisgICAgI2RlZmluZXMgaW4geHpfY29uZmlnLmggb3IgaW4gY29tcGlsZXIgZmxhZ3MuIFlvdSBkb24ndCBuZWVkIHRoZXNlCisgICAgI2RlZmluZXMgaW4gdGhlIGNvZGUgdGhhdCBqdXN0IHVzZXMgWFogRW1iZWRkZWQgdmlhIHh6LmgsIGJ1dCBoYXZpbmcKKyAgICB0aGVtIGFsd2F5cyAjZGVmaW5lZCBkb2Vzbid0IGh1cnQgZWl0aGVyLgorCisgICAgICAgICNkZWZpbmUgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gc2V0ICAgICBCQ0ogZmlsdGVyIGVuZGlhbm5lc3MKKyAgICAgICAgWFpfREVDX1g4NiAgICAgICAgICB4ODYgb3IgeDg2LTY0ICAgICAgIExpdHRsZSBlbmRpYW4gb25seQorICAgICAgICBYWl9ERUNfUE9XRVJQQyAgICAgIFBvd2VyUEMgICAgICAgICAgICAgQmlnIGVuZGlhbiBvbmx5CisgICAgICAgIFhaX0RFQ19JQTY0ICAgICAgICAgSXRhbml1bSAoSUEtNjQpICAgICBCaWcgb3IgbGl0dGxlIGVuZGlhbgorICAgICAgICBYWl9ERUNfQVJNICAgICAgICAgIEFSTSAgICAgICAgICAgICAgICAgTGl0dGxlIGVuZGlhbiBvbmx5CisgICAgICAgIFhaX0RFQ19BUk1USFVNQiAgICAgQVJNLVRodW1iICAgICAgICAgICBMaXR0bGUgZW5kaWFuIG9ubHkKKyAgICAgICAgWFpfREVDX1NQQVJDICAgICAgICBTUEFSQyAgICAgICAgICAgICAgIEJpZyBvciBsaXR0bGUgZW5kaWFuCisKKyAgICBXaGlsZSBzb21lIGFyY2hpdGVjdHVyZXMgYXJlIChwYXJ0aWFsbHkpIGJpLWVuZGlhbiwgdGhlIGVuZGlhbm5lc3MKKyAgICBzZXR0aW5nIGRvZXNuJ3QgY2hhbmdlIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBpbnN0cnVjdGlvbnMgb24gYWxsCisgICAgYXJjaGl0ZWN0dXJlcy4gVGhhdCdzIHdoeSBJdGFuaXVtIGFuZCBTUEFSQyBmaWx0ZXJzIHdvcmsgZm9yIGJvdGggYmlnCisgICAgYW5kIGxpdHRsZSBlbmRpYW4gZXhlY3V0YWJsZXMgKEl0YW5pdW0gaGFzIGxpdHRsZSBlbmRpYW4gaW5zdHJ1Y3Rpb25zCisgICAgYW5kIFNQQVJDIGhhcyBiaWcgZW5kaWFuIGluc3RydWN0aW9ucykuCisKKyAgICBUaGVyZSBjdXJyZW50bHkgaXMgbm8gZmlsdGVyIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgb3IgYmlnIGVuZGlhbgorICAgIEFSTSBvciBBUk0tVGh1bWIuIEltcGxlbWVudGluZyBmaWx0ZXJzIGZvciB0aGVtIGNhbiBiZSBjb25zaWRlcmVkIGlmCisgICAgdGhlcmUgaXMgYSBuZWVkIGZvciBzdWNoIGZpbHRlcnMgaW4gcmVhbC13b3JsZCBhcHBsaWNhdGlvbnMuCisKK05vdGVzIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMKKworICAgIElmIHlvdSBhcmUgaW5jbHVkaW5nIFhaIEVtYmVkZGVkIGludG8gYSBzaGFyZWQgbGlicmFyeSwgeW91IHZlcnkKKyAgICBwcm9iYWJseSBzaG91bGQgcmVuYW1lIHRoZSB4el8qIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHN5bWJvbAorICAgIGNvbmZsaWN0cyBpbiBjYXNlIHlvdXIgbGlicmFyeSBpcyBsaW5rZWQgYWdhaW5zdCBzb21lIG90aGVyIGxpYnJhcnkKKyAgICBvciBhcHBsaWNhdGlvbiB0aGF0IGFsc28gaGFzIFhaIEVtYmVkZGVkIGluIGl0ICh3aGljaCBtYXkgZXZlbiBiZQorICAgIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgWFogRW1iZWRkZWQpLiBUT0RPOiBQcm92aWRlIGFuIGVhc3kgd2F5CisgICAgdG8gZG8gdGhpcy4KKworICAgIFBsZWFzZSBkb24ndCBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBvZiBYWiBFbWJlZGRlZCBpdHNlbGYgdW5sZXNzCisgICAgaXQgaXMgZmluZSB0byByZWJ1aWxkIGV2ZXJ5dGhpbmcgZGVwZW5kaW5nIG9uIHRoYXQgc2hhcmVkIGxpYnJhcnkKKyAgICBldmVyeXRpbWUgeW91IHVwZ3JhZGUgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIFhaIEVtYmVkZGVkLiBUaGVyZSBhcmUKKyAgICBubyBBUEkgb3IgQUJJIHN0YWJpbGl0eSBndWFyYW50ZWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mCisgICAgWFogRW1iZWRkZWQuCisKK1NwZWNpZnlpbmcgdGhlIGNhbGxpbmcgY29udmVudGlvbgorCisgICAgWFpfRlVOQyBtYWNybyB3YXMgaW5jbHVkZWQgdG8gc3VwcG9ydCBkZWNsYXJpbmcgZnVuY3Rpb25zIHdpdGggX19pbml0CisgICAgaW4gTGludXguIE91dHNpZGUgTGludXgsIGl0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNhbGxpbmcKKyAgICBjb252ZW50aW9uIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IG11bHRpcGxlIGNhbGxpbmcgY29udmVudGlvbnMuCisgICAgRm9yIGV4YW1wbGUsIG9uIFdpbmRvd3MsIHlvdSBtYXkgbWFrZSBhbGwgZnVuY3Rpb25zIHVzZSB0aGUgc3RkY2FsbAorICAgIGNhbGxpbmcgY29udmVudGlvbiBieSBkZWZpbmluZyBYWl9GVU5DPV9fc3RkY2FsbCB3aGVuIGJ1aWxkaW5nIGFuZAorICAgIHVzaW5nIHRoZSBmdW5jdGlvbnMgZnJvbSBYWiBFbWJlZGRlZC4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94ei5oIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMDcxYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94ei5oCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogWFogZGVjb21wcmVzc29yCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIFhaX0gKKyNkZWZpbmUgWFpfSAorCisjaWZkZWYgX19LRVJORUxfXworIwlpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyMJaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbHNlCisjCWluY2x1ZGUgPHN0ZGRlZi5oPgorIwlpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvKiBJbiBMaW51eCwgdGhpcyBpcyB1c2VkIHRvIG1ha2UgZXh0ZXJuIGZ1bmN0aW9ucyBzdGF0aWMgd2hlbiBuZWVkZWQuICovCisjaWZuZGVmIFhaX0VYVEVSTgorIwlkZWZpbmUgWFpfRVhURVJOIGV4dGVybgorI2VuZGlmCisKKy8qIEluIExpbnV4LCB0aGlzIGlzIHVzZWQgdG8gbWFyayB0aGUgZnVuY3Rpb25zIHdpdGggX19pbml0IHdoZW4gbmVlZGVkLiAqLworI2lmbmRlZiBYWl9GVU5DCisjCWRlZmluZSBYWl9GVU5DCisjZW5kaWYKKworLyoqCisgKiBlbnVtIHh6X21vZGUgLSBPcGVyYXRpb24gbW9kZQorICoKKyAqIEBYWl9TSU5HTEU6ICAgICAgICAgICAgICBTaW5nbGUtY2FsbCBtb2RlLiBUaGlzIHVzZXMgbGVzcyBSQU0gdGhhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gbXVsdGktY2FsbCBtb2RlcywgYmVjYXVzZSB0aGUgTFpNQTIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5IGRvZXNuJ3QgbmVlZCB0byBiZSBhbGxvY2F0ZWQgYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0IG9mIHRoZSBkZWNvZGVyIHN0YXRlLiBBbGwgcmVxdWlyZWQgZGF0YQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBhdCBpbml0aWFsaXphdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB4el9kZWNfcnVuKCkgY2Fubm90IHJldHVybiBYWl9NRU1fRVJST1IuCisgKiBAWFpfUFJFQUxMT0M6ICAgICAgICAgICAgTXVsdGktY2FsbCBtb2RlIHdpdGggcHJlYWxsb2NhdGVkIExaTUEyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeSBidWZmZXIuIEFsbCBkYXRhIHN0cnVjdHVyZXMgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGF0IGluaXRpYWxpemF0aW9uLCBzbyB4el9kZWNfcnVuKCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5ub3QgcmV0dXJuIFhaX01FTV9FUlJPUi4KKyAqIEBYWl9EWU5BTExPQzogICAgICAgICAgICBNdWx0aS1jYWxsIG1vZGUuIFRoZSBMWk1BMiBkaWN0aW9uYXJ5IGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIG9uY2UgdGhlIHJlcXVpcmVkIHNpemUgaGFzIGJlZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgZnJvbSB0aGUgc3RyZWFtIGhlYWRlcnMuIElmIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gZmFpbHMsIHh6X2RlY19ydW4oKSB3aWxsIHJldHVybgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaX01FTV9FUlJPUi4KKyAqCisgKiBJdCBpcyBwb3NzaWJsZSB0byBlbmFibGUgc3VwcG9ydCBvbmx5IGZvciBhIHN1YnNldCBvZiB0aGUgYWJvdmUKKyAqIG1vZGVzIGF0IGNvbXBpbGUgdGltZSBieSBkZWZpbmluZyBYWl9ERUNfU0lOR0xFLCBYWl9ERUNfUFJFQUxMT0MsCisgKiBvciBYWl9ERUNfRFlOQUxMT0MuIFRoZSB4el9kZWMga2VybmVsIG1vZHVsZSBpcyBhbHdheXMgY29tcGlsZWQKKyAqIHdpdGggc3VwcG9ydCBmb3IgYWxsIG9wZXJhdGlvbiBtb2RlcywgYnV0IHRoZSBwcmVib290IGNvZGUgbWF5CisgKiBiZSBidWlsdCB3aXRoIGZld2VyIGZlYXR1cmVzIHRvIG1pbmltaXplIGNvZGUgc2l6ZS4KKyAqLworZW51bSB4el9tb2RlIHsKKwlYWl9TSU5HTEUsCisJWFpfUFJFQUxMT0MsCisJWFpfRFlOQUxMT0MKK307CisKKy8qKgorICogZW51bSB4el9yZXQgLSBSZXR1cm4gY29kZXMKKyAqIEBYWl9PSzogICAgICAgICAgICAgICAgICBFdmVyeXRoaW5nIGlzIE9LIHNvIGZhci4gTW9yZSBpbnB1dCBvciBtb3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHNwYWNlIGlzIHJlcXVpcmVkIHRvIGNvbnRpbnVlLiBUaGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgaXMgcG9zc2libGUgb25seSBpbiBtdWx0aS1jYWxsIG1vZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoWFpfUFJFQUxMT0Mgb3IgWFpfRFlOQUxMT0MpLgorICogQFhaX1NUUkVBTV9FTkQ6ICAgICAgICAgIE9wZXJhdGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuCisgKiBAWFpfVU5TVVBQT1JURURfQ0hFQ0s6ICAgSW50ZWdyaXR5IGNoZWNrIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4gRGVjb2RpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzdGlsbCBwb3NzaWJsZSBpbiBtdWx0aS1jYWxsIG1vZGUgYnkgc2ltcGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyB4el9kZWNfcnVuKCkgYWdhaW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogVGhpcyByZXR1cm4gdmFsdWUgaXMgdXNlZCBvbmx5IGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFpfREVDX0FOWV9DSEVDSyB3YXMgZGVmaW5lZCBhdCBidWlsZCB0aW1lLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIG5vdCB1c2VkIGluIHRoZSBrZXJuZWwuIFVuc3VwcG9ydGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgdHlwZXMgcmV0dXJuIFhaX09QVElPTlNfRVJST1IgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9ERUNfQU5ZX0NIRUNLIHdhcyBub3QgZGVmaW5lZCBhdCBidWlsZCB0aW1lLgorICogQFhaX01FTV9FUlJPUjogICAgICAgICAgIEFsbG9jYXRpbmcgbWVtb3J5IGZhaWxlZC4gVGhpcyByZXR1cm4gY29kZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIG9ubHkgaWYgdGhlIGRlY29kZXIgd2FzIGluaXRpYWxpemVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBYWl9EWU5BTExPQy4gVGhlIGFtb3VudCBvZiBtZW1vcnkgdGhhdCB3YXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllZCB0byBiZSBhbGxvY2F0ZWQgd2FzIG5vIG1vcmUgdGhhbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0X21heCBhcmd1bWVudCBnaXZlbiB0byB4el9kZWNfaW5pdCgpLgorICogQFhaX01FTUxJTUlUX0VSUk9SOiAgICAgIEEgYmlnZ2VyIExaTUEyIGRpY3Rpb25hcnkgd291bGQgYmUgbmVlZGVkIHRoYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGJ5IHRoZSBkaWN0X21heCBhcmd1bWVudCBnaXZlbiB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgIHh6X2RlY19pbml0KCkuIFRoaXMgcmV0dXJuIHZhbHVlIGlzIHBvc3NpYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBpbiBtdWx0aS1jYWxsIG1vZGUgKFhaX1BSRUFMTE9DIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFpfRFlOQUxMT0MpOyB0aGUgc2luZ2xlLWNhbGwgbW9kZSAoWFpfU0lOR0xFKQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZXMgdGhlIGRpY3RfbWF4IGFyZ3VtZW50LgorICogQFhaX0ZPUk1BVF9FUlJPUjogICAgICAgIEZpbGUgZm9ybWF0IHdhcyBub3QgcmVjb2duaXplZCAod3JvbmcgbWFnaWMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcykuCisgKiBAWFpfT1BUSU9OU19FUlJPUjogICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uIG9wdGlvbnMuIEluIHRoZSBkZWNvZGVyIHRoaXMgbWVhbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBoZWFkZXIgQ1JDMzIgbWF0Y2hlcywgYnV0IHRoZSBoZWFkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYgc3BlY2lmaWVzIHNvbWV0aGluZyB0aGF0IHdlIGRvbid0IHN1cHBvcnQuCisgKiBAWFpfREFUQV9FUlJPUjogICAgICAgICAgQ29tcHJlc3NlZCBkYXRhIGlzIGNvcnJ1cHQuCisgKiBAWFpfQlVGX0VSUk9SOiAgICAgICAgICAgQ2Fubm90IG1ha2UgYW55IHByb2dyZXNzLiBEZXRhaWxzIGFyZSBzbGlnaHRseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBiZXR3ZWVuIG11bHRpLWNhbGwgYW5kIHNpbmdsZS1jYWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTsgbW9yZSBpbmZvcm1hdGlvbiBiZWxvdy4KKyAqCisgKiBJbiBtdWx0aS1jYWxsIG1vZGUsIFhaX0JVRl9FUlJPUiBpcyByZXR1cm5lZCB3aGVuIHR3byBjb25zZWN1dGl2ZSBjYWxscworICogdG8gWFogY29kZSBjYW5ub3QgY29uc3VtZSBhbnkgaW5wdXQgYW5kIGNhbm5vdCBwcm9kdWNlIGFueSBuZXcgb3V0cHV0LgorICogVGhpcyBoYXBwZW5zIHdoZW4gdGhlcmUgaXMgbm8gbmV3IGlucHV0IGF2YWlsYWJsZSwgb3IgdGhlIG91dHB1dCBidWZmZXIKKyAqIGlzIGZ1bGwgd2hpbGUgYXQgbGVhc3Qgb25lIG91dHB1dCBieXRlIGlzIHN0aWxsIHBlbmRpbmcuIEFzc3VtaW5nIHlvdXIKKyAqIGNvZGUgaXMgbm90IGJ1Z2d5LCB5b3UgY2FuIGdldCB0aGlzIGVycm9yIG9ubHkgd2hlbiBkZWNvZGluZyBhIGNvbXByZXNzZWQKKyAqIHN0cmVhbSB0aGF0IGlzIHRydW5jYXRlZCBvciBvdGhlcndpc2UgY29ycnVwdC4KKyAqCisgKiBJbiBzaW5nbGUtY2FsbCBtb2RlLCBYWl9CVUZfRVJST1IgaXMgcmV0dXJuZWQgb25seSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyCisgKiBpcyB0b28gc21hbGwsIG9yIHRoZSBjb21wcmVzc2VkIGlucHV0IGlzIGNvcnJ1cHQgaW4gYSB3YXkgdGhhdCBtYWtlcyB0aGUKKyAqIGRlY29kZXIgcHJvZHVjZSBtb3JlIG91dHB1dCB0aGFuIHRoZSBjYWxsZXIgZXhwZWN0ZWQuIFdoZW4gaXQgaXMKKyAqIChyZWxhdGl2ZWx5KSBjbGVhciB0aGF0IHRoZSBjb21wcmVzc2VkIGlucHV0IGlzIHRydW5jYXRlZCwgWFpfREFUQV9FUlJPUgorICogaXMgdXNlZCBpbnN0ZWFkIG9mIFhaX0JVRl9FUlJPUi4KKyAqLworZW51bSB4el9yZXQgeworCVhaX09LLAorCVhaX1NUUkVBTV9FTkQsCisJWFpfVU5TVVBQT1JURURfQ0hFQ0ssCisJWFpfTUVNX0VSUk9SLAorCVhaX01FTUxJTUlUX0VSUk9SLAorCVhaX0ZPUk1BVF9FUlJPUiwKKwlYWl9PUFRJT05TX0VSUk9SLAorCVhaX0RBVEFfRVJST1IsCisJWFpfQlVGX0VSUk9SCit9OworCisvKioKKyAqIHN0cnVjdCB4el9idWYgLSBQYXNzaW5nIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB0byBYWiBjb2RlCisgKiBAaW46ICAgICAgICAgQmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgbWF5IGJlIE5VTEwgaWYgYW5kIG9ubHkKKyAqICAgICAgICAgICAgICBpZiBpbl9wb3MgaXMgZXF1YWwgdG8gaW5fc2l6ZS4KKyAqIEBpbl9wb3M6ICAgICBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgbXVzdCBub3QgZXhjZWVkCisgKiAgICAgICAgICAgICAgaW5fc2l6ZS4KKyAqIEBpbl9zaXplOiAgICBTaXplIG9mIHRoZSBpbnB1dCBidWZmZXIKKyAqIEBvdXQ6ICAgICAgICBCZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgbWF5IGJlIE5VTEwgaWYgYW5kIG9ubHkKKyAqICAgICAgICAgICAgICBpZiBvdXRfcG9zIGlzIGVxdWFsIHRvIG91dF9zaXplLgorICogQG91dF9wb3M6ICAgIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgbXVzdCBub3QgZXhjZWVkCisgKiAgICAgICAgICAgICAgb3V0X3NpemUuCisgKiBAb3V0X3NpemU6ICAgU2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICoKKyAqIE9ubHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGZyb20gb3V0W291dF9wb3NdIG9ud2FyZCwgYW5kCisgKiB0aGUgdmFyaWFibGVzIGluX3BvcyBhbmQgb3V0X3BvcyBhcmUgbW9kaWZpZWQgYnkgdGhlIFhaIGNvZGUuCisgKi8KK3N0cnVjdCB4el9idWYgeworCWNvbnN0IHVpbnQ4X3QgKmluOworCXNpemVfdCBpbl9wb3M7CisJc2l6ZV90IGluX3NpemU7CisKKwl1aW50OF90ICpvdXQ7CisJc2l6ZV90IG91dF9wb3M7CisJc2l6ZV90IG91dF9zaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgeHpfZGVjIC0gT3BhcXVlIHR5cGUgdG8gaG9sZCB0aGUgWFogZGVjb2RlciBzdGF0ZQorICovCitzdHJ1Y3QgeHpfZGVjOworCisvKioKKyAqIHh6X2RlY19pbml0KCkgLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIFhaIGRlY29kZXIgc3RhdGUKKyAqIEBtb2RlOiAgICAgICBPcGVyYXRpb24gbW9kZQorICogQGRpY3RfbWF4OiAgIE1heGltdW0gc2l6ZSBvZiB0aGUgTFpNQTIgZGljdGlvbmFyeSAoaGlzdG9yeSBidWZmZXIpIGZvcgorICogICAgICAgICAgICAgIG11bHRpLWNhbGwgZGVjb2RpbmcuIFRoaXMgaXMgaWdub3JlZCBpbiBzaW5nbGUtY2FsbCBtb2RlCisgKiAgICAgICAgICAgICAgKG1vZGUgPT0gWFpfU0lOR0xFKS4gTFpNQTIgZGljdGlvbmFyeSBpcyBhbHdheXMgMl5uIGJ5dGVzCisgKiAgICAgICAgICAgICAgb3IgMl5uICsgMl4obi0xKSBieXRlcyAodGhlIGxhdHRlciBzaXplcyBhcmUgbGVzcyBjb21tb24KKyAqICAgICAgICAgICAgICBpbiBwcmFjdGljZSksIHNvIG90aGVyIHZhbHVlcyBmb3IgZGljdF9tYXggZG9uJ3QgbWFrZSBzZW5zZS4KKyAqICAgICAgICAgICAgICBJbiB0aGUga2VybmVsLCBkaWN0aW9uYXJ5IHNpemVzIG9mIDY0IEtpQiwgMTI4IEtpQiwgMjU2IEtpQiwKKyAqICAgICAgICAgICAgICA1MTIgS2lCLCBhbmQgMSBNaUIgYXJlIHByb2JhYmx5IHRoZSBvbmx5IHJlYXNvbmFibGUgdmFsdWVzLAorICogICAgICAgICAgICAgIGV4Y2VwdCBmb3Iga2VybmVsIGFuZCBpbml0cmFtZnMgaW1hZ2VzIHdoZXJlIGEgYmlnZ2VyCisgKiAgICAgICAgICAgICAgZGljdGlvbmFyeSBjYW4gYmUgZmluZSBhbmQgdXNlZnVsLgorICoKKyAqIFNpbmdsZS1jYWxsIG1vZGUgKFhaX1NJTkdMRSk6IHh6X2RlY19ydW4oKSBkZWNvZGVzIHRoZSB3aG9sZSBzdHJlYW0gYXQKKyAqIG9uY2UuIFRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgdGhlIGRlY29kaW5nIHdpbGwKKyAqIGZhaWwuIFRoZSBvdXRwdXQgc3BhY2UgaXMgdXNlZCBhcyB0aGUgZGljdGlvbmFyeSBidWZmZXIsIHdoaWNoIGlzIHdoeQorICogdGhlcmUgaXMgbm8gbmVlZCB0byBhbGxvY2F0ZSB0aGUgZGljdGlvbmFyeSBhcyBwYXJ0IG9mIHRoZSBkZWNvZGVyJ3MKKyAqIGludGVybmFsIHN0YXRlLgorICoKKyAqIEJlY2F1c2UgdGhlIG91dHB1dCBidWZmZXIgaXMgdXNlZCBhcyB0aGUgd29ya3NwYWNlLCBzdHJlYW1zIGVuY29kZWQgdXNpbmcKKyAqIGEgYmlnIGRpY3Rpb25hcnkgYXJlIG5vdCBhIHByb2JsZW0gaW4gc2luZ2xlLWNhbGwgbW9kZS4gSXQgaXMgZW5vdWdoIHRoYXQKKyAqIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgYWN0dWFsIHVuY29tcHJlc3NlZCBkYXRhOyBpdAorICogY2FuIGJlIHNtYWxsZXIgdGhhbiB0aGUgZGljdGlvbmFyeSBzaXplIHN0b3JlZCBpbiB0aGUgc3RyZWFtIGhlYWRlcnMuCisgKgorICogTXVsdGktY2FsbCBtb2RlIHdpdGggcHJlYWxsb2NhdGVkIGRpY3Rpb25hcnkgKFhaX1BSRUFMTE9DKTogZGljdF9tYXggYnl0ZXMKKyAqIG9mIG1lbW9yeSBpcyBwcmVhbGxvY2F0ZWQgZm9yIHRoZSBMWk1BMiBkaWN0aW9uYXJ5LiBUaGlzIHdheSB0aGVyZSBpcyBubworICogcmlzayB0aGF0IHh6X2RlY19ydW4oKSBjb3VsZCBydW4gb3V0IG9mIG1lbW9yeSwgc2luY2UgeHpfZGVjX3J1bigpIHdpbGwKKyAqIG5ldmVyIGFsbG9jYXRlIGFueSBtZW1vcnkuIEluc3RlYWQsIGlmIHRoZSBwcmVhbGxvY2F0ZWQgZGljdGlvbmFyeSBpcyB0b28KKyAqIHNtYWxsIGZvciBkZWNvZGluZyB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLCB4el9kZWNfcnVuKCkgd2lsbCByZXR1cm4KKyAqIFhaX01FTUxJTUlUX0VSUk9SLiBUaHVzLCBpdCBpcyBpbXBvcnRhbnQgdG8ga25vdyB3aGF0IGtpbmQgb2YgZGF0YSB3aWxsIGJlCisgKiBkZWNvZGVkIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudCBvZiBtZW1vcnkgZm9yIHRoZSBkaWN0aW9uYXJ5LgorICoKKyAqIE11bHRpLWNhbGwgbW9kZSB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkaWN0aW9uYXJ5IChYWl9EWU5BTExPQyk6CisgKiBkaWN0X21heCBzcGVjaWZpZXMgdGhlIG1heGltdW0gYWxsb3dlZCBkaWN0aW9uYXJ5IHNpemUgdGhhdCB4el9kZWNfcnVuKCkKKyAqIG1heSBhbGxvY2F0ZSBvbmNlIGl0IGhhcyBwYXJzZWQgdGhlIGRpY3Rpb25hcnkgc2l6ZSBmcm9tIHRoZSBzdHJlYW0KKyAqIGhlYWRlcnMuIFRoaXMgd2F5IGV4Y2Vzc2l2ZSBhbGxvY2F0aW9ucyBjYW4gYmUgYXZvaWRlZCB3aGlsZSBzdGlsbAorICogbGltaXRpbmcgdGhlIG1heGltdW0gbWVtb3J5IHVzYWdlIHRvIGEgc2FuZSB2YWx1ZSB0byBwcmV2ZW50IHJ1bm5pbmcgdGhlCisgKiBzeXN0ZW0gb3V0IG9mIG1lbW9yeSB3aGVuIGRlY29tcHJlc3Npbmcgc3RyZWFtcyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHh6X2RlY19pbml0KCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gc3RydWN0IHh6X2RlYywgd2hpY2ggaXMKKyAqIHJlYWR5IHRvIGJlIHVzZWQgd2l0aCB4el9kZWNfcnVuKCkuIElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLAorICogeHpfZGVjX2luaXQoKSByZXR1cm5zIE5VTEwuCisgKi8KK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjICogWFpfRlVOQyB4el9kZWNfaW5pdCgKKwkJZW51bSB4el9tb2RlIG1vZGUsIHVpbnQzMl90IGRpY3RfbWF4KTsKKworLyoqCisgKiB4el9kZWNfcnVuKCkgLSBSdW4gdGhlIFhaIGRlY29kZXIKKyAqIEBzOiAgICAgICAgICBEZWNvZGVyIHN0YXRlIGFsbG9jYXRlZCB1c2luZyB4el9kZWNfaW5pdCgpCisgKiBAYjogICAgICAgICAgSW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgKgorICogVGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgZGVwZW5kIG9uIGJ1aWxkIG9wdGlvbnMgYW5kIG9wZXJhdGlvbiBtb2RlLgorICogU2VlIGVudW0geHpfcmV0IGZvciBkZXRhaWxzLgorICoKKyAqIE5PVEU6IElmIGFuIGVycm9yIG9jY3VycyBpbiBzaW5nbGUtY2FsbCBtb2RlIChyZXR1cm4gdmFsdWUgaXMgbm90CisgKiBYWl9TVFJFQU1fRU5EKSwgYi0+aW5fcG9zIGFuZCBiLT5vdXRfcG9zIGFyZSBub3QgbW9kaWZpZWQsIGFuZCB0aGUKKyAqIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGZyb20gYi0+b3V0W2ItPm91dF9wb3NdIG9ud2FyZCBhcmUKKyAqIHVuZGVmaW5lZC4gVGhpcyBpcyB0cnVlIGV2ZW4gYWZ0ZXIgWFpfQlVGX0VSUk9SLCBiZWNhdXNlIHdpdGggc29tZSBmaWx0ZXIKKyAqIGNoYWlucywgdGhlcmUgbWF5IGJlIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIHRoaXMgcGFzcworICogY2Fubm90IGJlIHByb3Blcmx5IGRvbmUgaWYgdGhlIG91dHB1dCBidWZmZXIgaXMgdHJ1bmNhdGVkLiBUaHVzLCB5b3UKKyAqIGNhbm5vdCBnaXZlIHRoZSBzaW5nbGUtY2FsbCBkZWNvZGVyIGEgdG9vIHNtYWxsIGJ1ZmZlciBhbmQgdGhlbiBleHBlY3QgdG8KKyAqIGdldCB0aGF0IGFtb3VudCB2YWxpZCBkYXRhIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLiBZb3UgbXVzdCB1c2UKKyAqIHRoZSBtdWx0aS1jYWxsIGRlY29kZXIgaWYgeW91IGRvbid0IHdhbnQgdG8gdW5jb21wcmVzcyB0aGUgd2hvbGUgc3RyZWFtLgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgWFpfRlVOQyB4el9kZWNfcnVuKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpOworCisvKioKKyAqIHh6X2RlY19yZXNldCgpIC0gUmVzZXQgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgZGVjb2RlciBzdGF0ZQorICogQHM6ICAgICAgICAgIERlY29kZXIgc3RhdGUgYWxsb2NhdGVkIHVzaW5nIHh6X2RlY19pbml0KCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZSBtdWx0aS1jYWxsIGRlY29kZXIgc3RhdGUgd2l0aG91dAorICogZnJlZWluZyBhbmQgcmVhbGxvY2F0aW5nIG1lbW9yeSB3aXRoIHh6X2RlY19lbmQoKSBhbmQgeHpfZGVjX2luaXQoKS4KKyAqCisgKiBJbiBzaW5nbGUtY2FsbCBtb2RlLCB4el9kZWNfcmVzZXQoKSBpcyBhbHdheXMgY2FsbGVkIGluIHRoZSBiZWdpbm5pbmcgb2YKKyAqIHh6X2RlY19ydW4oKS4gVGh1cywgZXhwbGljaXQgY2FsbCB0byB4el9kZWNfcmVzZXQoKSBpcyB1c2VmdWwgb25seSBpbgorICogbXVsdGktY2FsbCBtb2RlLgorICovCitYWl9FWFRFUk4gdm9pZCBYWl9GVU5DIHh6X2RlY19yZXNldChzdHJ1Y3QgeHpfZGVjICpzKTsKKworLyoqCisgKiB4el9kZWNfZW5kKCkgLSBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgZGVjb2RlciBzdGF0ZQorICogQHM6ICAgICAgICAgIERlY29kZXIgc3RhdGUgYWxsb2NhdGVkIHVzaW5nIHh6X2RlY19pbml0KCkuIElmIHMgaXMgTlVMTCwKKyAqICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4KKyAqLworWFpfRVhURVJOIHZvaWQgWFpfRlVOQyB4el9kZWNfZW5kKHN0cnVjdCB4el9kZWMgKnMpOworCisvKgorICogU3RhbmRhbG9uZSBidWlsZCAodXNlcnNwYWNlIGJ1aWxkIG9yIGluLWtlcm5lbCBidWlsZCBmb3IgYm9vdCB0aW1lIHVzZSkKKyAqIG5lZWRzIGEgQ1JDMzIgaW1wbGVtZW50YXRpb24uIEZvciBub3JtYWwgaW4ta2VybmVsIHVzZSwga2VybmVsJ3Mgb3duCisgKiBDUkMzMiBtb2R1bGUgaXMgdXNlZCBpbnN0ZWFkLCBhbmQgdXNlcnMgb2YgdGhpcyBtb2R1bGUgZG9uJ3QgbmVlZCB0bworICogY2FyZSBhYm91dCB0aGUgZnVuY3Rpb25zIGJlbG93LgorICovCisjaWZuZGVmIFhaX0lOVEVSTkFMX0NSQzMyCisjCWlmZGVmIF9fS0VSTkVMX18KKyMJCWRlZmluZSBYWl9JTlRFUk5BTF9DUkMzMiAwCisjCWVsc2UKKyMJCWRlZmluZSBYWl9JTlRFUk5BTF9DUkMzMiAxCisjCWVuZGlmCisjZW5kaWYKKworI2lmIFhaX0lOVEVSTkFMX0NSQzMyCisvKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIHh6XyogZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZQorICogdGhlIENSQzMyIGxvb2t1cCB0YWJsZS4KKyAqLworWFpfRVhURVJOIHZvaWQgWFpfRlVOQyB4el9jcmMzMl9pbml0KHZvaWQpOworCisvKgorICogVXBkYXRlIENSQzMyIHZhbHVlIHVzaW5nIHRoZSBwb2x5bm9taWFsIGZyb20gSUVFRS04MDIuMy4gVG8gc3RhcnQgYSBuZXcKKyAqIGNhbGN1bGF0aW9uLCB0aGUgdGhpcmQgYXJndW1lbnQgbXVzdCBiZSB6ZXJvLiBUbyBjb250aW51ZSB0aGUgY2FsY3VsYXRpb24sCisgKiB0aGUgcHJldmlvdXNseSByZXR1cm5lZCB2YWx1ZSBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50LgorICovCitYWl9FWFRFUk4gdWludDMyX3QgWFpfRlVOQyB4el9jcmMzMigKKwkJY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgY3JjKTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfY29uZmlnLmggYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3ZTFjYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9jb25maWcuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIFByaXZhdGUgaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zIGZvciB1c2Vyc3BhY2UgdXNlIG9mIFhaIEVtYmVkZGVkCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfQ09ORklHX0gKKyNkZWZpbmUgWFpfQ09ORklHX0gKKworLyogVW5jb21tZW50IGFzIG5lZWRlZCB0byBlbmFibGUgQkNKIGZpbHRlciBkZWNvZGVycy4gKi8KKy8qICNkZWZpbmUgWFpfREVDX1g4NiAqLworLyogI2RlZmluZSBYWl9ERUNfUE9XRVJQQyAqLworLyogI2RlZmluZSBYWl9ERUNfSUE2NCAqLworLyogI2RlZmluZSBYWl9ERUNfQVJNICovCisvKiAjZGVmaW5lIFhaX0RFQ19BUk1USFVNQiAqLworLyogI2RlZmluZSBYWl9ERUNfU1BBUkMgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInh6LmgiCisKKyNkZWZpbmUga21hbGxvYyhzaXplLCBmbGFncykgbWFsbG9jKHNpemUpCisjZGVmaW5lIGtmcmVlKHB0cikgZnJlZShwdHIpCisjZGVmaW5lIHZtYWxsb2Moc2l6ZSkgbWFsbG9jKHNpemUpCisjZGVmaW5lIHZmcmVlKHB0cikgZnJlZShwdHIpCisKKyNkZWZpbmUgbWVtZXEoYSwgYiwgc2l6ZSkgKG1lbWNtcChhLCBiLCBzaXplKSA9PSAwKQorI2RlZmluZSBtZW16ZXJvKGJ1Ziwgc2l6ZSkgbWVtc2V0KGJ1ZiwgMCwgc2l6ZSkKKworI3VuZGVmIG1pbgorI3VuZGVmIG1pbl90CisjZGVmaW5lIG1pbih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorI2RlZmluZSBtaW5fdCh0eXBlLCB4LCB5KSBtaW4oeCwgeSkKKworLyoKKyAqIFNvbWUgZnVuY3Rpb25zIGhhdmUgYmVlbiBtYXJrZWQgd2l0aCBfX2Fsd2F5c19pbmxpbmUgdG8ga2VlcCB0aGUKKyAqIHBlcmZvcm1hbmNlIHJlYXNvbmFibGUgZXZlbiB3aGVuIHRoZSBjb21waWxlciBpcyBvcHRpbWl6aW5nIGZvcgorICogc21hbGwgY29kZSBzaXplLiBZb3UgbWF5IGJlIGFibGUgdG8gc2F2ZSBhIGZldyBieXRlcyBieSAjZGVmaW5pbmcKKyAqIF9fYWx3YXlzX2lubGluZSB0byBwbGFpbiBpbmxpbmUsIGJ1dCBkb24ndCBjb21wbGFpbiBpZiB0aGUgY29kZQorICogYmVjb21lcyBzbG93LgorICoKKyAqIE5PVEU6IFN5c3RlbSBoZWFkZXJzIG9uIEdOVS9MaW51eCBtYXkgI2RlZmluZSB0aGlzIG1hY3JvIGFscmVhZHksCisgKiBzbyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgaXQsIHlvdSBuZWVkIHRvICN1bmRlZiBpdCBmaXJzdC4KKyAqLworI2lmbmRlZiBfX2Fsd2F5c19pbmxpbmUKKyMJaWZkZWYgX19HTlVDX18KKyMJCWRlZmluZSBfX2Fsd2F5c19pbmxpbmUgXAorCQkJaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyMJZWxzZQorIwkJZGVmaW5lIF9fYWx3YXlzX2lubGluZSBpbmxpbmUKKyMJZW5kaWYKKyNlbmRpZgorCisvKgorICogU29tZSBmdW5jdGlvbnMgYXJlIG1hcmtlZCB0byBuZXZlciBiZSBpbmxpbmVkIHRvIHJlZHVjZSBzdGFjayB1c2FnZS4KKyAqIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IHN0YWNrIHVzYWdlLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHRoaXMgc28KKyAqIHRoYXQgbm9pbmxpbmVfZm9yX3N0YWNrIGlzICNkZWZpbmVkIHRvIGJlIGVtcHR5IGV2ZW4gd2hlbiB1c2luZyBHQ0MuCisgKiBEb2luZyBzbyBtYXkgc2F2ZSBhIGZldyBieXRlcyBpbiBiaW5hcnkgc2l6ZS4KKyAqLworI2lmbmRlZiBub2lubGluZV9mb3Jfc3RhY2sKKyMJaWZkZWYgX19HTlVDX18KKyMJCWRlZmluZSBub2lubGluZV9mb3Jfc3RhY2sgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKKyMJZWxzZQorIwkJZGVmaW5lIG5vaW5saW5lX2Zvcl9zdGFjaworIwllbmRpZgorI2VuZGlmCisKKy8qIElubGluZSBmdW5jdGlvbnMgdG8gYWNjZXNzIHVuYWxpZ25lZCB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMgKi8KKyNpZm5kZWYgZ2V0X3VuYWxpZ25lZF9sZTMyCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFhaX0ZVTkMgZ2V0X3VuYWxpZ25lZF9sZTMyKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwlyZXR1cm4gKHVpbnQzMl90KWJ1ZlswXQorCQkJfCAoKHVpbnQzMl90KWJ1ZlsxXSA8PCA4KQorCQkJfCAoKHVpbnQzMl90KWJ1ZlsyXSA8PCAxNikKKwkJCXwgKCh1aW50MzJfdClidWZbM10gPDwgMjQpOworfQorI2VuZGlmCisKKyNpZm5kZWYgZ2V0X3VuYWxpZ25lZF9iZTMyCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFhaX0ZVTkMgZ2V0X3VuYWxpZ25lZF9iZTMyKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwlyZXR1cm4gKHVpbnQzMl90KShidWZbMF0gPDwgMjQpCisJCQl8ICgodWludDMyX3QpYnVmWzFdIDw8IDE2KQorCQkJfCAoKHVpbnQzMl90KWJ1ZlsyXSA8PCA4KQorCQkJfCAodWludDMyX3QpYnVmWzNdOworfQorI2VuZGlmCisKKyNpZm5kZWYgcHV0X3VuYWxpZ25lZF9sZTMyCitzdGF0aWMgaW5saW5lIHZvaWQgWFpfRlVOQyBwdXRfdW5hbGlnbmVkX2xlMzIodWludDMyX3QgdmFsLCB1aW50OF90ICpidWYpCit7CisJYnVmWzBdID0gKHVpbnQ4X3QpdmFsOworCWJ1ZlsxXSA9ICh1aW50OF90KSh2YWwgPj4gOCk7CisJYnVmWzJdID0gKHVpbnQ4X3QpKHZhbCA+PiAxNik7CisJYnVmWzNdID0gKHVpbnQ4X3QpKHZhbCA+PiAyNCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBwdXRfdW5hbGlnbmVkX2JlMzIKK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIHB1dF91bmFsaWduZWRfYmUzMih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ1ZikKK3sKKwlidWZbMF0gPSAodWludDhfdCkodmFsID4+IDI0KTsKKwlidWZbMV0gPSAodWludDhfdCkodmFsID4+IDE2KTsKKwlidWZbMl0gPSAodWludDhfdCkodmFsID4+IDgpOworCWJ1ZlszXSA9ICh1aW50OF90KXZhbDsKK30KKyNlbmRpZgorCisvKgorICogVXNlIGdldF91bmFsaWduZWRfbGUzMigpIGFsc28gZm9yIGFsaWduZWQgYWNjZXNzIGZvciBzaW1wbGljaXR5LiBPbgorICogbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLCAjZGVmaW5lIGdldF9sZTMyKHB0cikgKCooY29uc3QgdWludDMyX3QgKikocHRyKSkKKyAqIGNvdWxkIHNhdmUgYSBmZXcgYnl0ZXMgaW4gY29kZSBzaXplLgorICovCisjaWZuZGVmIGdldF9sZTMyCisjCWRlZmluZSBnZXRfbGUzMiBnZXRfdW5hbGlnbmVkX2xlMzIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfYmNqLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX2Jjai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTYyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX2Jjai5jCkBAIC0wLDAgKzEsNTY0IEBACisvKgorICogQnJhbmNoL0NhbGwvSnVtcCAoQkNKKSBmaWx0ZXIgZGVjb2RlcnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisKKy8qCisgKiBUaGUgcmVzdCBvZiB0aGUgZmlsZSBpcyBpbnNpZGUgdGhpcyBpZmRlZi4gSXQgbWFrZXMgdGhpbmdzIGEgbGl0dGxlIG1vcmUKKyAqIGNvbnZlbmllbnQgd2hlbiBidWlsZGluZyB3aXRob3V0IHN1cHBvcnQgZm9yIGFueSBCQ0ogZmlsdGVycy4KKyAqLworI2lmZGVmIFhaX0RFQ19CQ0oKKworc3RydWN0IHh6X2RlY19iY2ogeworCS8qIFR5cGUgb2YgdGhlIEJDSiBmaWx0ZXIgYmVpbmcgdXNlZCAqLworCWVudW0geworCQlCQ0pfWDg2ID0gNCwgICAgICAgIC8qIHg4NiBvciB4ODYtNjQgKi8KKwkJQkNKX1BPV0VSUEMgPSA1LCAgICAvKiBCaWcgZW5kaWFuIG9ubHkgKi8KKwkJQkNKX0lBNjQgPSA2LCAgICAgICAvKiBCaWcgb3IgbGl0dGxlIGVuZGlhbiAqLworCQlCQ0pfQVJNID0gNywgICAgICAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworCQlCQ0pfQVJNVEhVTUIgPSA4LCAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworCQlCQ0pfU1BBUkMgPSA5ICAgICAgIC8qIEJpZyBvciBsaXR0bGUgZW5kaWFuICovCisJfSB0eXBlOworCisJLyoKKwkgKiBSZXR1cm4gdmFsdWUgb2YgdGhlIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbi4gV2UgbmVlZCB0byBwcmVzZXJ2ZQorCSAqIHRoaXMgaW5mb3JtYXRpb24gYWNyb3NzIGNhbGxzLCBiZWNhdXNlIHdlIG11c3Qgbm90IGNhbGwgdGhlIG5leHQKKwkgKiBmaWx0ZXIgYW55bW9yZSBvbmNlIGl0IGhhcyByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELgorCSAqLworCWVudW0geHpfcmV0IHJldDsKKworCS8qIFRydWUgaWYgd2UgYXJlIG9wZXJhdGluZyBpbiBzaW5nbGUtY2FsbCBtb2RlLiAqLworCWJvb2wgc2luZ2xlX2NhbGw7CisKKwkvKgorCSAqIEFic29sdXRlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZAorCSAqIGRhdGEgKGluIGEgc2luZ2xlIC54eiBCbG9jaykuIFdlIGNhcmUgb25seSBhYm91dCB0aGUgbG93ZXN0IDMyCisJICogYml0cyBzbyB0aGlzIGRvZXNuJ3QgbmVlZCB0byBiZSB1aW50NjRfdCBldmVuIHdpdGggYmlnIGZpbGVzLgorCSAqLworCXVpbnQzMl90IHBvczsKKworCS8qIHg4NiBmaWx0ZXIgc3RhdGUgKi8KKwl1aW50MzJfdCB4ODZfcHJldl9tYXNrOworCisJLyogVGVtcG9yYXJ5IHNwYWNlIHRvIGhvbGQgdGhlIHZhcmlhYmxlcyBmcm9tIHN0cnVjdCB4el9idWYgKi8KKwl1aW50OF90ICpvdXQ7CisJc2l6ZV90IG91dF9wb3M7CisJc2l6ZV90IG91dF9zaXplOworCisJc3RydWN0IHsKKwkJLyogQW1vdW50IG9mIGFscmVhZHkgZmlsdGVyZWQgZGF0YSBpbiB0aGUgYmVnaW5uaW5nIG9mIGJ1ZiAqLworCQlzaXplX3QgZmlsdGVyZWQ7CisKKwkJLyogVG90YWwgYW1vdW50IG9mIGRhdGEgY3VycmVudGx5IHN0b3JlZCBpbiBidWYgICovCisJCXNpemVfdCBzaXplOworCisJCS8qCisJCSAqIEJ1ZmZlciB0byBob2xkIGEgbWl4IG9mIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGRhdGEuIFRoaXMKKwkJICogbmVlZHMgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIEFsaWdubWVudCArIDIgKiBMb29rLWFoZWFkOgorCQkgKgorCQkgKiBUeXBlICAgICAgICAgQWxpZ25tZW50ICAgTG9vay1haGVhZAorCQkgKiB4ODYgICAgICAgICAgICAgIDEgICAgICAgICAgIDQKKwkJICogUG93ZXJQQyAgICAgICAgICA0ICAgICAgICAgICAwCisJCSAqIElBLTY0ICAgICAgICAgICAxNiAgICAgICAgICAgMAorCQkgKiBBUk0gICAgICAgICAgICAgIDQgICAgICAgICAgIDAKKwkJICogQVJNLVRodW1iICAgICAgICAyICAgICAgICAgICAyCisJCSAqIFNQQVJDICAgICAgICAgICAgNCAgICAgICAgICAgMAorCQkgKi8KKwkJdWludDhfdCBidWZbMTZdOworCX0gdGVtcDsKK307CisKKyNpZmRlZiBYWl9ERUNfWDg2CisvKgorICogVGhpcyBpcyBtYWNybyB1c2VkIHRvIHRlc3QgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBhIG1lbW9yeSBhZGRyZXNzCisgKiBpbiBhbiB4ODYgaW5zdHJ1Y3Rpb24uCisgKi8KKyNkZWZpbmUgYmNqX3g4Nl90ZXN0X21zYnl0ZShiKSAoKGIpID09IDB4MDAgfHwgKGIpID09IDB4RkYpCisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgc2l6ZV90IFhaX0ZVTkMgYmNqX3g4NigKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IGJvb2wgbWFza190b19hbGxvd2VkX3N0YXR1c1s4XQorCQk9IHsgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UgfTsKKworCXN0YXRpYyBjb25zdCB1aW50OF90IG1hc2tfdG9fYml0X251bVs4XSA9IHsgMCwgMSwgMiwgMiwgMywgMywgMywgMyB9OworCisJc2l6ZV90IGk7CisJc2l6ZV90IHByZXZfcG9zID0gKHNpemVfdCktMTsKKwl1aW50MzJfdCBwcmV2X21hc2sgPSBzLT54ODZfcHJldl9tYXNrOworCXVpbnQzMl90IHNyYzsKKwl1aW50MzJfdCBkZXN0OworCXVpbnQzMl90IGo7CisJdWludDhfdCBiOworCisJaWYgKHNpemUgPD0gNCkKKwkJcmV0dXJuIDA7CisKKwlzaXplIC09IDQ7CisJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgeworCQlpZiAoKGJ1ZltpXSAmIDB4RkUpICE9IDB4RTgpCisJCQljb250aW51ZTsKKworCQlwcmV2X3BvcyA9IGkgLSBwcmV2X3BvczsKKwkJaWYgKHByZXZfcG9zID4gMykgeworCQkJcHJldl9tYXNrID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgKHByZXZfcG9zIC0gMSkpICYgNzsKKwkJCWlmIChwcmV2X21hc2sgIT0gMCkgeworCQkJCWIgPSBidWZbaSArIDQgLSBtYXNrX3RvX2JpdF9udW1bcHJldl9tYXNrXV07CisJCQkJaWYgKCFtYXNrX3RvX2FsbG93ZWRfc3RhdHVzW3ByZXZfbWFza10KKwkJCQkJCXx8IGJjal94ODZfdGVzdF9tc2J5dGUoYikpIHsKKwkJCQkJcHJldl9wb3MgPSBpOworCQkJCQlwcmV2X21hc2sgPSAocHJldl9tYXNrIDw8IDEpIHwgMTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcHJldl9wb3MgPSBpOworCisJCWlmIChiY2pfeDg2X3Rlc3RfbXNieXRlKGJ1ZltpICsgNF0pKSB7CisJCQlzcmMgPSBnZXRfdW5hbGlnbmVkX2xlMzIoYnVmICsgaSArIDEpOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlkZXN0ID0gc3JjIC0gKHMtPnBvcyArICh1aW50MzJfdClpICsgNSk7CisJCQkJaWYgKHByZXZfbWFzayA9PSAwKQorCQkJCQlicmVhazsKKworCQkJCWogPSBtYXNrX3RvX2JpdF9udW1bcHJldl9tYXNrXSAqIDg7CisJCQkJYiA9ICh1aW50OF90KShkZXN0ID4+ICgyNCAtIGopKTsKKwkJCQlpZiAoIWJjal94ODZfdGVzdF9tc2J5dGUoYikpCisJCQkJCWJyZWFrOworCisJCQkJc3JjID0gZGVzdCBeICgoKHVpbnQzMl90KTEgPDwgKDMyIC0gaikpIC0gMSk7CisJCQl9CisKKwkJCWRlc3QgJj0gMHgwMUZGRkZGRjsKKwkJCWRlc3QgfD0gKHVpbnQzMl90KTAgLSAoZGVzdCAmIDB4MDEwMDAwMDApOworCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGRlc3QsIGJ1ZiArIGkgKyAxKTsKKwkJCWkgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCXByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgMSkgfCAxOworCQl9CisJfQorCisJcHJldl9wb3MgPSBpIC0gcHJldl9wb3M7CisJcy0+eDg2X3ByZXZfbWFzayA9IHByZXZfcG9zID4gMyA/IDAgOiBwcmV2X21hc2sgPDwgKHByZXZfcG9zIC0gMSk7CisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19QT1dFUlBDCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIHNpemVfdCBYWl9GVU5DIGJjal9wb3dlcnBjKAorCQlzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1aW50MzJfdCBpbnN0cjsKKworCWZvciAoaSA9IDA7IGkgKyA0IDw9IHNpemU7IGkgKz0gNCkgeworCQlpbnN0ciA9IGdldF91bmFsaWduZWRfYmUzMihidWYgKyBpKTsKKwkJaWYgKChpbnN0ciAmIDB4RkMwMDAwMDMpID09IDB4NDgwMDAwMDEpIHsKKwkJCWluc3RyICY9IDB4MDNGRkZGRkM7CisJCQlpbnN0ciAtPSBzLT5wb3MgKyAodWludDMyX3QpaTsKKwkJCWluc3RyICY9IDB4MDNGRkZGRkM7CisJCQlpbnN0ciB8PSAweDQ4MDAwMDAxOworCQkJcHV0X3VuYWxpZ25lZF9iZTMyKGluc3RyLCBidWYgKyBpKTsKKwkJfQorCX0KKworCXJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfSUE2NAorc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBzaXplX3QgWFpfRlVOQyBiY2pfaWE2NCgKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnJhbmNoX3RhYmxlWzMyXSA9IHsKKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJNCwgNCwgNiwgNiwgMCwgMCwgNywgNywKKwkJNCwgNCwgMCwgMCwgNCwgNCwgMCwgMAorCX07CisKKwkvKgorCSAqIFRoZSBsb2NhbCB2YXJpYWJsZXMgdGFrZSBhIGxpdHRsZSBiaXQgc3RhY2sgc3BhY2UsIGJ1dCBpdCdzIGxlc3MKKwkgKiB0aGFuIHdoYXQgTFpNQTIgZGVjb2RlciB0YWtlcywgc28gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlZHVjZQorCSAqIHN0YWNrIHVzYWdlIGhlcmUgd2l0aG91dCBkb2luZyB0aGF0IGZvciB0aGUgTFpNQTIgZGVjb2RlciB0b28uCisJICovCisKKwkvKiBMb29wIGNvdW50ZXJzICovCisJc2l6ZV90IGk7CisJc2l6ZV90IGo7CisKKwkvKiBJbnN0cnVjdGlvbiBzbG90ICgwLCAxLCBvciAyKSBpbiB0aGUgMTI4LWJpdCBpbnN0cnVjdGlvbiB3b3JkICovCisJdWludDMyX3Qgc2xvdDsKKworCS8qIEJpdHdpc2Ugb2Zmc2V0IG9mIHRoZSBpbnN0cnVjdGlvbiBpbmRpY2F0ZWQgYnkgc2xvdCAqLworCXVpbnQzMl90IGJpdF9wb3M7CisKKwkvKiBiaXRfcG9zIHNwbGl0IGludG8gYnl0ZSBhbmQgYml0IHBhcnRzICovCisJdWludDMyX3QgYnl0ZV9wb3M7CisJdWludDMyX3QgYml0X3JlczsKKworCS8qIEFkZHJlc3MgcGFydCBvZiBhbiBpbnN0cnVjdGlvbiAqLworCXVpbnQzMl90IGFkZHI7CisKKwkvKiBNYXNrIHVzZWQgdG8gZGV0ZWN0IHdoaWNoIGluc3RydWN0aW9ucyB0byBjb252ZXJ0ICovCisJdWludDMyX3QgbWFzazsKKworCS8qIDQxLWJpdCBpbnN0cnVjdGlvbiBzdG9yZWQgc29tZXdoZXJlIGluIHRoZSBsb3dlc3QgNDggYml0cyAqLworCXVpbnQ2NF90IGluc3RyOworCisJLyogSW5zdHJ1Y3Rpb24gbm9ybWFsaXplZCB3aXRoIGJpdF9yZXMgZm9yIGVhc2llciBtYW5pcHVsYXRpb24gKi8KKwl1aW50NjRfdCBub3JtOworCisJZm9yIChpID0gMDsgaSArIDE2IDw9IHNpemU7IGkgKz0gMTYpIHsKKwkJbWFzayA9IGJyYW5jaF90YWJsZVtidWZbaV0gJiAweDFGXTsKKwkJZm9yIChzbG90ID0gMCwgYml0X3BvcyA9IDU7IHNsb3QgPCAzOyArK3Nsb3QsIGJpdF9wb3MgKz0gNDEpIHsKKwkJCWlmICgoKG1hc2sgPj4gc2xvdCkgJiAxKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlieXRlX3BvcyA9IGJpdF9wb3MgPj4gMzsKKwkJCWJpdF9yZXMgPSBiaXRfcG9zICYgNzsKKwkJCWluc3RyID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCA2OyArK2opCisJCQkJaW5zdHIgfD0gKHVpbnQ2NF90KShidWZbaSArIGogKyBieXRlX3Bvc10pCisJCQkJCQk8PCAoOCAqIGopOworCisJCQlub3JtID0gaW5zdHIgPj4gYml0X3JlczsKKworCQkJaWYgKCgobm9ybSA+PiAzNykgJiAweDBGKSA9PSAweDA1CisJCQkJCSYmICgobm9ybSA+PiA5KSAmIDB4MDcpID09IDApIHsKKwkJCQlhZGRyID0gKG5vcm0gPj4gMTMpICYgMHgwRkZGRkY7CisJCQkJYWRkciB8PSAoKHVpbnQzMl90KShub3JtID4+IDM2KSAmIDEpIDw8IDIwOworCQkJCWFkZHIgPDw9IDQ7CisJCQkJYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaTsKKwkJCQlhZGRyID4+PSA0OworCisJCQkJbm9ybSAmPSB+KCh1aW50NjRfdCkweDhGRkZGRiA8PCAxMyk7CisJCQkJbm9ybSB8PSAodWludDY0X3QpKGFkZHIgJiAweDBGRkZGRikgPDwgMTM7CisJCQkJbm9ybSB8PSAodWludDY0X3QpKGFkZHIgJiAweDEwMDAwMCkKKwkJCQkJCTw8ICgzNiAtIDIwKTsKKworCQkJCWluc3RyICY9ICgxIDw8IGJpdF9yZXMpIC0gMTsKKwkJCQlpbnN0ciB8PSBub3JtIDw8IGJpdF9yZXM7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorCQkJCQlidWZbaSArIGogKyBieXRlX3Bvc10KKwkJCQkJCT0gKHVpbnQ4X3QpKGluc3RyID4+ICg4ICogaikpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19BUk0KK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgc2l6ZV90IFhaX0ZVTkMgYmNqX2FybSgKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgYWRkcjsKKworCWZvciAoaSA9IDA7IGkgKyA0IDw9IHNpemU7IGkgKz0gNCkgeworCQlpZiAoYnVmW2kgKyAzXSA9PSAweEVCKSB7CisJCQlhZGRyID0gKHVpbnQzMl90KWJ1ZltpXSB8ICgodWludDMyX3QpYnVmW2kgKyAxXSA8PCA4KQorCQkJCQl8ICgodWludDMyX3QpYnVmW2kgKyAyXSA8PCAxNik7CisJCQlhZGRyIDw8PSAyOworCQkJYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaSArIDg7CisJCQlhZGRyID4+PSAyOworCQkJYnVmW2ldID0gKHVpbnQ4X3QpYWRkcjsKKwkJCWJ1ZltpICsgMV0gPSAodWludDhfdCkoYWRkciA+PiA4KTsKKwkJCWJ1ZltpICsgMl0gPSAodWludDhfdCkoYWRkciA+PiAxNik7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIHNpemVfdCBYWl9GVU5DIGJjal9hcm10aHVtYigKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgYWRkcjsKKworCWZvciAoaSA9IDA7IGkgKyA0IDw9IHNpemU7IGkgKz0gMikgeworCQlpZiAoKGJ1ZltpICsgMV0gJiAweEY4KSA9PSAweEYwCisJCQkJJiYgKGJ1ZltpICsgM10gJiAweEY4KSA9PSAweEY4KSB7CisJCQlhZGRyID0gKCgodWludDMyX3QpYnVmW2kgKyAxXSAmIDB4MDcpIDw8IDE5KQorCQkJCQl8ICgodWludDMyX3QpYnVmW2ldIDw8IDExKQorCQkJCQl8ICgoKHVpbnQzMl90KWJ1ZltpICsgM10gJiAweDA3KSA8PCA4KQorCQkJCQl8ICh1aW50MzJfdClidWZbaSArIDJdOworCQkJYWRkciA8PD0gMTsKKwkJCWFkZHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWkgKyA0OworCQkJYWRkciA+Pj0gMTsKKwkJCWJ1ZltpICsgMV0gPSAodWludDhfdCkoMHhGMCB8ICgoYWRkciA+PiAxOSkgJiAweDA3KSk7CisJCQlidWZbaV0gPSAodWludDhfdCkoYWRkciA+PiAxMSk7CisJCQlidWZbaSArIDNdID0gKHVpbnQ4X3QpKDB4RjggfCAoKGFkZHIgPj4gOCkgJiAweDA3KSk7CisJCQlidWZbaSArIDJdID0gKHVpbnQ4X3QpYWRkcjsKKwkJCWkgKz0gMjsKKwkJfQorCX0KKworCXJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfU1BBUkMKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgc2l6ZV90IFhaX0ZVTkMgYmNqX3NwYXJjKAorCQlzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1aW50MzJfdCBpbnN0cjsKKworCWZvciAoaSA9IDA7IGkgKyA0IDw9IHNpemU7IGkgKz0gNCkgeworCQlpbnN0ciA9IGdldF91bmFsaWduZWRfYmUzMihidWYgKyBpKTsKKwkJaWYgKChpbnN0ciA+PiAyMikgPT0gMHgxMDAgfHwgKGluc3RyID4+IDIyKSA9PSAweDFGRikgeworCQkJaW5zdHIgPDw9IDI7CisJCQlpbnN0ciAtPSBzLT5wb3MgKyAodWludDMyX3QpaTsKKwkJCWluc3RyID4+PSAyOworCQkJaW5zdHIgPSAoKHVpbnQzMl90KTB4NDAwMDAwMDAgLSAoaW5zdHIgJiAweDQwMDAwMCkpCisJCQkJCXwgMHg0MDAwMDAwMCB8IChpbnN0ciAmIDB4M0ZGRkZGKTsKKwkJCXB1dF91bmFsaWduZWRfYmUzMihpbnN0ciwgYnVmICsgaSk7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisvKgorICogQXBwbHkgdGhlIHNlbGVjdGVkIEJDSiBmaWx0ZXIuIFVwZGF0ZSAqcG9zIGFuZCBzLT5wb3MgdG8gbWF0Y2ggdGhlIGFtb3VudAorICogb2YgZGF0YSB0aGF0IGdvdCBmaWx0ZXJlZC4KKyAqCisgKiBOT1RFOiBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGEgc3dpdGNoIHN0YXRlbWVudCB0byBhdm9pZCB1c2luZyBmdW5jdGlvbgorICogcG9pbnRlcnMsIHdoaWNoIGNvdWxkIGJlIHByb2JsZW1hdGljIGluIHRoZSBrZXJuZWwgYm9vdCBjb2RlLCB3aGljaCBtdXN0CisgKiBhdm9pZCBwb2ludGVycyB0byBzdGF0aWMgZGF0YSAoYXQgbGVhc3Qgb24geDg2KS4KKyAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBiY2pfYXBwbHkoc3RydWN0IHh6X2RlY19iY2ogKnMsCisJCXVpbnQ4X3QgKmJ1Ziwgc2l6ZV90ICpwb3MsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBmaWx0ZXJlZDsKKworCWJ1ZiArPSAqcG9zOworCXNpemUgLT0gKnBvczsKKworCXN3aXRjaCAocy0+dHlwZSkgeworI2lmZGVmIFhaX0RFQ19YODYKKwljYXNlIEJDSl9YODY6CisJCWZpbHRlcmVkID0gYmNqX3g4NihzLCBidWYsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19QT1dFUlBDCisJY2FzZSBCQ0pfUE9XRVJQQzoKKwkJZmlsdGVyZWQgPSBiY2pfcG93ZXJwYyhzLCBidWYsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19JQTY0CisJY2FzZSBCQ0pfSUE2NDoKKwkJZmlsdGVyZWQgPSBiY2pfaWE2NChzLCBidWYsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19BUk0KKwljYXNlIEJDSl9BUk06CisJCWZpbHRlcmVkID0gYmNqX2FybShzLCBidWYsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19BUk1USFVNQgorCWNhc2UgQkNKX0FSTVRIVU1COgorCQlmaWx0ZXJlZCA9IGJjal9hcm10aHVtYihzLCBidWYsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19TUEFSQworCWNhc2UgQkNKX1NQQVJDOgorCQlmaWx0ZXJlZCA9IGJjal9zcGFyYyhzLCBidWYsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCS8qIE5ldmVyIHJlYWNoZWQgYnV0IHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MuICovCisJCWZpbHRlcmVkID0gMDsKKwkJYnJlYWs7CisJfQorCisJKnBvcyArPSBmaWx0ZXJlZDsKKwlzLT5wb3MgKz0gZmlsdGVyZWQ7Cit9CisKKy8qCisgKiBGbHVzaCBwZW5kaW5nIGZpbHRlcmVkIGRhdGEgZnJvbSB0ZW1wIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICogTW92ZSB0aGUgcmVtYWluaW5nIG1peHR1cmUgb2YgcG9zc2libHkgZmlsdGVyZWQgYW5kIHVuZmlsdGVyZWQKKyAqIGRhdGEgdG8gdGhlIGJlZ2lubmluZyBvZiB0ZW1wLgorICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGJjal9mbHVzaChzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgY29weV9zaXplOworCisJY29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBzLT50ZW1wLmZpbHRlcmVkLCBiLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MpOworCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBzLT50ZW1wLmJ1ZiwgY29weV9zaXplKTsKKwliLT5vdXRfcG9zICs9IGNvcHlfc2l6ZTsKKworCXMtPnRlbXAuZmlsdGVyZWQgLT0gY29weV9zaXplOworCXMtPnRlbXAuc2l6ZSAtPSBjb3B5X3NpemU7CisJbWVtbW92ZShzLT50ZW1wLmJ1Ziwgcy0+dGVtcC5idWYgKyBjb3B5X3NpemUsIHMtPnRlbXAuc2l6ZSk7Cit9CisKKy8qCisgKiBUaGUgQkNKIGZpbHRlciBmdW5jdGlvbnMgYXJlIHByaW1pdGl2ZSBpbiBzZW5zZSB0aGF0IHRoZXkgcHJvY2VzcyB0aGUKKyAqIGRhdGEgaW4gY2h1bmtzIG9mIDEtMTYgYnl0ZXMuIFRvIGhpZGUgdGhpcyBpc3N1ZSwgdGhpcyBmdW5jdGlvbiBkb2VzCisgKiBzb21lIGJ1ZmZlcmluZy4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2Jjal9ydW4oc3RydWN0IHh6X2RlY19iY2ogKnMsCisJCXN0cnVjdCB4el9kZWNfbHptYTIgKmx6bWEyLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBvdXRfc3RhcnQ7CisKKwkvKgorCSAqIEZsdXNoIHBlbmRpbmcgYWxyZWFkeSBmaWx0ZXJlZCBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBSZXR1cm4KKwkgKiBpbW1lZGlhdGVsbHkgaWYgd2UgY291bGRuJ3QgZmx1c2ggZXZlcnl0aGluZywgb3IgaWYgdGhlIG5leHQKKwkgKiBmaWx0ZXIgaW4gdGhlIGNoYWluIGhhZCBhbHJlYWR5IHJldHVybmVkIFhaX1NUUkVBTV9FTkQuCisJICovCisJaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKSB7CisJCWJjal9mbHVzaChzLCBiKTsKKwkJaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKQorCQkJcmV0dXJuIFhaX09LOworCisJCWlmIChzLT5yZXQgPT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBYWl9TVFJFQU1fRU5EOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBtb3JlIG91dHB1dCBzcGFjZSB0aGFuIHdoYXQgaXMgY3VycmVudGx5IHBlbmRpbmcgaW4KKwkgKiB0ZW1wLCBjb3B5IHRoZSB1bmZpbHRlcmVkIGRhdGEgZnJvbSB0ZW1wIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisJICogYW5kIHRyeSB0byBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyIGJ5IGRlY29kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZQorCSAqIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbi4gQXBwbHkgdGhlIEJDSiBmaWx0ZXIgb24gdGhlIG5ldyBkYXRhCisJICogaW4gdGhlIG91dHB1dCBidWZmZXIuIElmIGV2ZXJ5dGhpbmcgY2Fubm90IGJlIGZpbHRlcmVkLCBjb3B5IGl0CisJICogdG8gdGVtcCBhbmQgcmV3aW5kIHRoZSBvdXRwdXQgYnVmZmVyIHBvc2l0aW9uIGFjY29yZGluZ2x5LgorCSAqLworCWlmIChzLT50ZW1wLnNpemUgPCBiLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MpIHsKKwkJb3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKwkJbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIHMtPnRlbXAuYnVmLCBzLT50ZW1wLnNpemUpOworCQliLT5vdXRfcG9zICs9IHMtPnRlbXAuc2l6ZTsKKworCQlzLT5yZXQgPSB4el9kZWNfbHptYTJfcnVuKGx6bWEyLCBiKTsKKwkJaWYgKHMtPnJldCAhPSBYWl9TVFJFQU1fRU5ECisJCQkJJiYgKHMtPnJldCAhPSBYWl9PSyB8fCBzLT5zaW5nbGVfY2FsbCkpCisJCQlyZXR1cm4gcy0+cmV0OworCisJCWJjal9hcHBseShzLCBiLT5vdXQsICZvdXRfc3RhcnQsIGItPm91dF9wb3MpOworCisJCS8qCisJCSAqIEFzIGFuIGV4Y2VwdGlvbiwgaWYgdGhlIG5leHQgZmlsdGVyIHJldHVybmVkIFhaX1NUUkVBTV9FTkQsCisJCSAqIHdlIGNhbiBkbyB0aGF0IHRvbywgc2luY2UgdGhlIGxhc3QgZmV3IGJ5dGVzIHRoYXQgcmVtYWluCisJCSAqIHVuZmlsdGVyZWQgYXJlIG1lYW50IHRvIHJlbWFpbiB1bmZpbHRlcmVkLgorCQkgKi8KKwkJaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisKKwkJcy0+dGVtcC5zaXplID0gYi0+b3V0X3BvcyAtIG91dF9zdGFydDsKKwkJYi0+b3V0X3BvcyAtPSBzLT50ZW1wLnNpemU7CisJCW1lbWNweShzLT50ZW1wLmJ1ZiwgYi0+b3V0ICsgYi0+b3V0X3Bvcywgcy0+dGVtcC5zaXplKTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgdW5maWx0ZXJlZCBkYXRhIGluIHRlbXAsIHRyeSB0byBmaWxsIGJ5IGRlY29kaW5nIG1vcmUKKwkgKiBkYXRhIGZyb20gdGhlIG5leHQgZmlsdGVyLiBBcHBseSB0aGUgQkNKIGZpbHRlciBvbiB0ZW1wLiBUaGVuIHdlCisJICogaG9wZWZ1bGx5IGNhbiBmaWxsIHRoZSBhY3R1YWwgb3V0cHV0IGJ1ZmZlciBieSBjb3B5aW5nIGZpbHRlcmVkCisJICogZGF0YSBmcm9tIHRlbXAuIEEgbWl4IG9mIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGRhdGEgbWF5IGJlIGxlZnQKKwkgKiBpbiB0ZW1wOyBpdCB3aWxsIGJlIHRha2VuIGNhcmUgb24gdGhlIG5leHQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorCSAqLworCWlmIChzLT50ZW1wLnNpemUgPiAwKSB7CisJCS8qIE1ha2UgYi0+b3V0eyxfcG9zLF9zaXplfSB0ZW1wb3JhcmlseSBwb2ludCB0byBzLT50ZW1wLiAqLworCQlzLT5vdXQgPSBiLT5vdXQ7CisJCXMtPm91dF9wb3MgPSBiLT5vdXRfcG9zOworCQlzLT5vdXRfc2l6ZSA9IGItPm91dF9zaXplOworCQliLT5vdXQgPSBzLT50ZW1wLmJ1ZjsKKwkJYi0+b3V0X3BvcyA9IHMtPnRlbXAuc2l6ZTsKKwkJYi0+b3V0X3NpemUgPSBzaXplb2Yocy0+dGVtcC5idWYpOworCisJCXMtPnJldCA9IHh6X2RlY19sem1hMl9ydW4obHptYTIsIGIpOworCisJCXMtPnRlbXAuc2l6ZSA9IGItPm91dF9wb3M7CisJCWItPm91dCA9IHMtPm91dDsKKwkJYi0+b3V0X3BvcyA9IHMtPm91dF9wb3M7CisJCWItPm91dF9zaXplID0gcy0+b3V0X3NpemU7CisKKwkJaWYgKHMtPnJldCAhPSBYWl9PSyAmJiBzLT5yZXQgIT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBzLT5yZXQ7CisKKwkJYmNqX2FwcGx5KHMsIHMtPnRlbXAuYnVmLCAmcy0+dGVtcC5maWx0ZXJlZCwgcy0+dGVtcC5zaXplKTsKKworCQkvKgorCQkgKiBJZiB0aGUgbmV4dCBmaWx0ZXIgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCwgd2UgbWFyayB0aGF0CisJCSAqIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQsIHNpbmNlIHRoZSBsYXN0IHVuZmlsdGVyZWQgYnl0ZXMKKwkJICogb2YgdGhlIHN0cmVhbSBhcmUgbWVhbnQgdG8gYmUgbGVmdCBhcyBpcy4KKwkJICovCisJCWlmIChzLT5yZXQgPT0gWFpfU1RSRUFNX0VORCkKKwkJCXMtPnRlbXAuZmlsdGVyZWQgPSBzLT50ZW1wLnNpemU7CisKKwkJYmNqX2ZsdXNoKHMsIGIpOworCQlpZiAocy0+dGVtcC5maWx0ZXJlZCA+IDApCisJCQlyZXR1cm4gWFpfT0s7CisJfQorCisJcmV0dXJuIHMtPnJldDsKK30KKworWFpfRVhURVJOIHN0cnVjdCB4el9kZWNfYmNqICogWFpfRlVOQyB4el9kZWNfYmNqX2NyZWF0ZShib29sIHNpbmdsZV9jYWxsKQoreworCXN0cnVjdCB4el9kZWNfYmNqICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyAhPSBOVUxMKQorCQlzLT5zaW5nbGVfY2FsbCA9IHNpbmdsZV9jYWxsOworCisJcmV0dXJuIHM7Cit9CisKK1haX0VYVEVSTiBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19iY2pfcmVzZXQoCisJCXN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKyNpZmRlZiBYWl9ERUNfWDg2CisJY2FzZSBCQ0pfWDg2OgorI2VuZGlmCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKKwljYXNlIEJDSl9QT1dFUlBDOgorI2VuZGlmCisjaWZkZWYgWFpfREVDX0lBNjQKKwljYXNlIEJDSl9JQTY0OgorI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTQorCWNhc2UgQkNKX0FSTToKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19BUk1USFVNQgorCWNhc2UgQkNKX0FSTVRIVU1COgorI2VuZGlmCisjaWZkZWYgWFpfREVDX1NQQVJDCisJY2FzZSBCQ0pfU1BBUkM6CisjZW5kaWYKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBVbnN1cHBvcnRlZCBGaWx0ZXIgSUQgKi8KKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisJfQorCisJcy0+dHlwZSA9IGlkOworCXMtPnJldCA9IFhaX09LOworCXMtPnBvcyA9IDA7CisJcy0+eDg2X3ByZXZfbWFzayA9IDA7CisJcy0+dGVtcC5maWx0ZXJlZCA9IDA7CisJcy0+dGVtcC5zaXplID0gMDsKKworCXJldHVybiBYWl9PSzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX2x6bWEyLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX2x6bWEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3MWNiNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfbHptYTIuYwpAQCAtMCwwICsxLDExNzUgQEAKKy8qCisgKiBMWk1BMiBkZWNvZGVyCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSAieHpfcHJpdmF0ZS5oIgorI2luY2x1ZGUgInh6X2x6bWEyLmgiCisKKy8qCisgKiBSYW5nZSBkZWNvZGVyIGluaXRpYWxpemF0aW9uIGVhdHMgdGhlIGZpcnN0IGZpdmUgYnl0ZXMgb2YgZWFjaCBMWk1BIGNodW5rLgorICovCisjZGVmaW5lIFJDX0lOSVRfQllURVMgNQorCisvKgorICogTWluaW11bSBudW1iZXIgb2YgdXNhYmxlIGlucHV0IGJ1ZmZlciB0byBzYWZlbHkgZGVjb2RlIG9uZSBMWk1BIHN5bWJvbC4KKyAqIFRoZSB3b3JzdCBjYXNlIGlzIHRoYXQgd2UgZGVjb2RlIDIyIGJpdHMgdXNpbmcgcHJvYmFiaWxpdGllcyBhbmQgMjYKKyAqIGRpcmVjdCBiaXRzLiBUaGlzIG1heSBkZWNvZGUgYXQgbWF4aW11bSBvZiAyMCBieXRlcyBvZiBpbnB1dC4gSG93ZXZlciwKKyAqIGx6bWFfbWFpbigpIGRvZXMgYW4gZXh0cmEgbm9ybWFsaXphdGlvbiBiZWZvcmUgcmV0dXJuaW5nLCB0aHVzIHdlCisgKiBuZWVkIHRvIHB1dCAyMSBoZXJlLgorICovCisjZGVmaW5lIExaTUFfSU5fUkVRVUlSRUQgMjEKKworLyoKKyAqIERpY3Rpb25hcnkgKGhpc3RvcnkgYnVmZmVyKQorICoKKyAqIFRoZXNlIGFyZSBhbHdheXMgdHJ1ZToKKyAqICAgIHN0YXJ0IDw9IHBvcyA8PSBmdWxsIDw9IGVuZAorICogICAgcG9zIDw9IGxpbWl0IDw9IGVuZAorICoKKyAqIEluIG11bHRpLWNhbGwgbW9kZSwgYWxzbyB0aGVzZSBhcmUgdHJ1ZToKKyAqICAgIGVuZCA9PSBzaXplCisgKiAgICBzaXplIDw9IHNpemVfbWF4CisgKiAgICBhbGxvY2F0ZWQgPD0gc2l6ZQorICoKKyAqIE1vc3Qgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBzaXplX3QgdG8gc3VwcG9ydCBzaW5nbGUtY2FsbCBtb2RlLAorICogaW4gd2hpY2ggdGhlIGRpY3Rpb25hcnkgdmFyaWFibGVzIGFkZHJlc3MgdGhlIGFjdHVhbCBvdXRwdXQKKyAqIGJ1ZmZlciBkaXJlY3RseS4KKyAqLworc3RydWN0IGRpY3Rpb25hcnkgeworCS8qIEJlZ2lubmluZyBvZiB0aGUgaGlzdG9yeSBidWZmZXIgKi8KKwl1aW50OF90ICpidWY7CisKKwkvKiBPbGQgcG9zaXRpb24gaW4gYnVmIChiZWZvcmUgZGVjb2RpbmcgbW9yZSBkYXRhKSAqLworCXNpemVfdCBzdGFydDsKKworCS8qIFBvc2l0aW9uIGluIGJ1ZiAqLworCXNpemVfdCBwb3M7CisKKwkvKgorCSAqIEhvdyBmdWxsIGRpY3Rpb25hcnkgaXMuIFRoaXMgaXMgdXNlZCB0byBkZXRlY3QgY29ycnVwdCBpbnB1dCB0aGF0CisJICogd291bGQgcmVhZCBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbS4KKwkgKi8KKwlzaXplX3QgZnVsbDsKKworCS8qIFdyaXRlIGxpbWl0OyB3ZSBkb24ndCB3cml0ZSB0byBidWZbbGltaXRdIG9yIGxhdGVyIGJ5dGVzLiAqLworCXNpemVfdCBsaW1pdDsKKworCS8qCisJICogRW5kIG9mIHRoZSBkaWN0aW9uYXJ5IGJ1ZmZlci4gSW4gbXVsdGktY2FsbCBtb2RlLCB0aGlzIGlzCisJICogdGhlIHNhbWUgYXMgdGhlIGRpY3Rpb25hcnkgc2l6ZS4gSW4gc2luZ2xlLWNhbGwgbW9kZSwgdGhpcworCSAqIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKwkgKi8KKwlzaXplX3QgZW5kOworCisJLyoKKwkgKiBTaXplIG9mIHRoZSBkaWN0aW9uYXJ5IGFzIHNwZWNpZmllZCBpbiBCbG9jayBIZWFkZXIuIFRoaXMgaXMgdXNlZAorCSAqIHRvZ2V0aGVyIHdpdGggImZ1bGwiIHRvIGRldGVjdCBjb3JydXB0IGlucHV0IHRoYXQgd291bGQgbWFrZSB1cworCSAqIHJlYWQgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0uCisJICovCisJdWludDMyX3Qgc2l6ZTsKKworCS8qCisJICogTWF4aW11bSBhbGxvd2VkIGRpY3Rpb25hcnkgc2l6ZSBpbiBtdWx0aS1jYWxsIG1vZGUuCisJICogVGhpcyBpcyBpZ25vcmVkIGluIHNpbmdsZS1jYWxsIG1vZGUuCisJICovCisJdWludDMyX3Qgc2l6ZV9tYXg7CisKKwkvKgorCSAqIEFtb3VudCBvZiBtZW1vcnkgY3VycmVudGx5IGFsbG9jYXRlZCBmb3IgdGhlIGRpY3Rpb25hcnkuCisJICogVGhpcyBpcyB1c2VkIG9ubHkgd2l0aCBYWl9EWU5BTExPQy4gKFdpdGggWFpfUFJFQUxMT0MsCisJICogc2l6ZV9tYXggaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBhbGxvY2F0ZWQgc2l6ZS4pCisJICovCisJdWludDMyX3QgYWxsb2NhdGVkOworCisJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwllbnVtIHh6X21vZGUgbW9kZTsKK307CisKKy8qIFJhbmdlIGRlY29kZXIgKi8KK3N0cnVjdCByY19kZWMgeworCXVpbnQzMl90IHJhbmdlOworCXVpbnQzMl90IGNvZGU7CisKKwkvKgorCSAqIE51bWJlciBvZiBpbml0aWFsaXppbmcgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIHJlYWQKKwkgKiBieSByY19yZWFkX2luaXQoKS4KKwkgKi8KKwl1aW50MzJfdCBpbml0X2J5dGVzX2xlZnQ7CisKKwkvKgorCSAqIEJ1ZmZlciBmcm9tIHdoaWNoIHdlIHJlYWQgb3VyIGlucHV0LiBJdCBjYW4gYmUgZWl0aGVyCisJICogdGVtcC5idWYgb3IgdGhlIGNhbGxlci1wcm92aWRlZCBpbnB1dCBidWZmZXIuCisJICovCisJY29uc3QgdWludDhfdCAqaW47CisJc2l6ZV90IGluX3BvczsKKwlzaXplX3QgaW5fbGltaXQ7Cit9OworCisvKiBQcm9iYWJpbGl0aWVzIGZvciBhIGxlbmd0aCBkZWNvZGVyLiAqLworc3RydWN0IGx6bWFfbGVuX2RlYyB7CisJLyogUHJvYmFiaWxpdHkgb2YgbWF0Y2ggbGVuZ3RoIGJlaW5nIGF0IGxlYXN0IDEwICovCisJdWludDE2X3QgY2hvaWNlOworCisJLyogUHJvYmFiaWxpdHkgb2YgbWF0Y2ggbGVuZ3RoIGJlaW5nIGF0IGxlYXN0IDE4ICovCisJdWludDE2X3QgY2hvaWNlMjsKKworCS8qIFByb2JhYmlsaXRpZXMgZm9yIG1hdGNoIGxlbmd0aHMgMi05ICovCisJdWludDE2X3QgbG93W1BPU19TVEFURVNfTUFYXVtMRU5fTE9XX1NZTUJPTFNdOworCisJLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAxMC0xNyAqLworCXVpbnQxNl90IG1pZFtQT1NfU1RBVEVTX01BWF1bTEVOX01JRF9TWU1CT0xTXTsKKworCS8qIFByb2JhYmlsaXRpZXMgZm9yIG1hdGNoIGxlbmd0aHMgMTgtMjczICovCisJdWludDE2X3QgaGlnaFtMRU5fSElHSF9TWU1CT0xTXTsKK307CisKK3N0cnVjdCBsem1hX2RlYyB7CisJLyogRGlzdGFuY2VzIG9mIGxhdGVzdCBmb3VyIG1hdGNoZXMgKi8KKwl1aW50MzJfdCByZXAwOworCXVpbnQzMl90IHJlcDE7CisJdWludDMyX3QgcmVwMjsKKwl1aW50MzJfdCByZXAzOworCisJLyogVHlwZXMgb2YgdGhlIG1vc3QgcmVjZW50bHkgc2VlbiBMWk1BIHN5bWJvbHMgKi8KKwllbnVtIGx6bWFfc3RhdGUgc3RhdGU7CisKKwkvKgorCSAqIExlbmd0aCBvZiBhIG1hdGNoLiBUaGlzIGlzIHVwZGF0ZWQgc28gdGhhdCBkaWN0X3JlcGVhdCBjYW4KKwkgKiBiZSBjYWxsZWQgYWdhaW4gdG8gZmluaXNoIHJlcGVhdGluZyB0aGUgd2hvbGUgbWF0Y2guCisJICovCisJdWludDMyX3QgbGVuOworCisJLyoKKwkgKiBMWk1BIHByb3BlcnRpZXMgb3IgcmVsYXRlZCBiaXQgbWFza3MgKG51bWJlciBvZiBsaXRlcmFsCisJICogY29udGV4dCBiaXRzLCBhIG1hc2sgZGVydmllZCBmcm9tIHRoZSBudW1iZXIgb2YgbGl0ZXJhbAorCSAqIHBvc2l0aW9uIGJpdHMsIGFuZCBhIG1hc2sgZGVydmllZCBmcm9tIHRoZSBudW1iZXIKKwkgKiBwb3NpdGlvbiBiaXRzKQorCSAqLworCXVpbnQzMl90IGxjOworCXVpbnQzMl90IGxpdGVyYWxfcG9zX21hc2s7IC8qICgxIDw8IGxwKSAtIDEgKi8KKwl1aW50MzJfdCBwb3NfbWFzazsgICAgICAgICAvKiAoMSA8PCBwYikgLSAxICovCisKKwkvKiBJZiAxLCBpdCdzIGEgbWF0Y2guIE90aGVyd2lzZSBpdCdzIGEgc2luZ2xlIDgtYml0IGxpdGVyYWwuICovCisJdWludDE2X3QgaXNfbWF0Y2hbU1RBVEVTXVtQT1NfU1RBVEVTX01BWF07CisKKwkvKiBJZiAxLCBpdCdzIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgcmVwMCAuLiByZXAzLiAqLworCXVpbnQxNl90IGlzX3JlcFtTVEFURVNdOworCisJLyoKKwkgKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDAuCisJICogT3RoZXJ3aXNlIGNoZWNrIGlzX3JlcDEuCisJICovCisJdWludDE2X3QgaXNfcmVwMFtTVEFURVNdOworCisJLyoKKwkgKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDEuCisJICogT3RoZXJ3aXNlIGNoZWNrIGlzX3JlcDIuCisJICovCisJdWludDE2X3QgaXNfcmVwMVtTVEFURVNdOworCisJLyogSWYgMCwgZGlzdGFuY2Ugb2YgYSByZXBlYXRlZCBtYXRjaCBpcyByZXAyLiBPdGhlcndpc2UgaXQgaXMgcmVwMy4gKi8KKwl1aW50MTZfdCBpc19yZXAyW1NUQVRFU107CisKKwkvKgorCSAqIElmIDEsIHRoZSByZXBlYXRlZCBtYXRjaCBoYXMgbGVuZ3RoIG9mIG9uZSBieXRlLiBPdGhlcndpc2UKKwkgKiB0aGUgbGVuZ3RoIGlzIGRlY29kZWQgZnJvbSByZXBfbGVuX2RlY29kZXIuCisJICovCisJdWludDE2X3QgaXNfcmVwMF9sb25nW1NUQVRFU11bUE9TX1NUQVRFU19NQVhdOworCisJLyoKKwkgKiBQcm9iYWJpbGl0eSB0cmVlIGZvciB0aGUgaGlnaGVzdCB0d28gYml0cyBvZiB0aGUgbWF0Y2gKKwkgKiBkaXN0YW5jZS4gVGhlcmUgaXMgYSBzZXBhcmF0ZSBwcm9iYWJpbGl0eSB0cmVlIGZvciBtYXRjaAorCSAqIGxlbmd0aHMgb2YgMiAoaS5lLiBNQVRDSF9MRU5fTUlOKSwgMywgNCwgYW5kIFs1LCAyNzNdLgorCSAqLworCXVpbnQxNl90IGRpc3Rfc2xvdFtESVNUX1NUQVRFU11bRElTVF9TTE9UU107CisKKwkvKgorCSAqIFByb2JpbGl0eSB0cmVlcyBmb3IgYWRkaXRpb25hbCBiaXRzIGZvciBtYXRjaCBkaXN0YW5jZQorCSAqIHdoZW4gdGhlIGRpc3RhbmNlIGlzIGluIHRoZSByYW5nZSBbNCwgMTI3XS4KKwkgKi8KKwl1aW50MTZfdCBkaXN0X3NwZWNpYWxbRlVMTF9ESVNUQU5DRVMgLSBESVNUX01PREVMX0VORF07CisKKwkvKgorCSAqIFByb2JhYmlsaXR5IHRyZWUgZm9yIHRoZSBsb3dlc3QgZm91ciBiaXRzIG9mIGEgbWF0Y2gKKwkgKiBkaXN0YW5jZSB0aGF0IGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAxMjguCisJICovCisJdWludDE2X3QgZGlzdF9hbGlnbltBTElHTl9TSVpFXTsKKworCS8qIExlbmd0aCBvZiBhIG5vcm1hbCBtYXRjaCAqLworCXN0cnVjdCBsem1hX2xlbl9kZWMgbWF0Y2hfbGVuX2RlYzsKKworCS8qIExlbmd0aCBvZiBhIHJlcGVhdGVkIG1hdGNoICovCisJc3RydWN0IGx6bWFfbGVuX2RlYyByZXBfbGVuX2RlYzsKKworCS8qIFByb2JhYmlsaXRpZXMgb2YgbGl0ZXJhbHMgKi8KKwl1aW50MTZfdCBsaXRlcmFsW0xJVEVSQUxfQ09ERVJTX01BWF1bTElURVJBTF9DT0RFUl9TSVpFXTsKK307CisKK3N0cnVjdCBsem1hMl9kZWMgeworCS8qIFBvc2l0aW9uIGluIHh6X2RlY19sem1hMl9ydW4oKS4gKi8KKwllbnVtIGx6bWEyX3NlcSB7CisJCVNFUV9DT05UUk9MLAorCQlTRVFfVU5DT01QUkVTU0VEXzEsCisJCVNFUV9VTkNPTVBSRVNTRURfMiwKKwkJU0VRX0NPTVBSRVNTRURfMCwKKwkJU0VRX0NPTVBSRVNTRURfMSwKKwkJU0VRX1BST1BFUlRJRVMsCisJCVNFUV9MWk1BX1BSRVBBUkUsCisJCVNFUV9MWk1BX1JVTiwKKwkJU0VRX0NPUFkKKwl9IHNlcXVlbmNlOworCisJLyogTmV4dCBwb3NpdGlvbiBhZnRlciBkZWNvZGluZyB0aGUgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBjaHVuay4gKi8KKwllbnVtIGx6bWEyX3NlcSBuZXh0X3NlcXVlbmNlOworCisJLyogVW5jb21wcmVzc2VkIHNpemUgb2YgTFpNQSBjaHVuayAoMiBNaUIgYXQgbWF4aW11bSkgKi8KKwl1aW50MzJfdCB1bmNvbXByZXNzZWQ7CisKKwkvKgorCSAqIENvbXByZXNzZWQgc2l6ZSBvZiBMWk1BIGNodW5rIG9yIGNvbXByZXNzZWQvdW5jb21wcmVzc2VkCisJICogc2l6ZSBvZiB1bmNvbXByZXNzZWQgY2h1bmsgKDY0IEtpQiBhdCBtYXhpbXVtKQorCSAqLworCXVpbnQzMl90IGNvbXByZXNzZWQ7CisKKwkvKgorCSAqIFRydWUgaWYgZGljdGlvbmFyeSByZXNldCBpcyBuZWVkZWQuIFRoaXMgaXMgZmFsc2UgYmVmb3JlCisJICogdGhlIGZpcnN0IGNodW5rIChMWk1BIG9yIHVuY29tcHJlc3NlZCkuCisJICovCisJYm9vbCBuZWVkX2RpY3RfcmVzZXQ7CisKKwkvKgorCSAqIFRydWUgaWYgbmV3IExaTUEgcHJvcGVydGllcyBhcmUgbmVlZGVkLiBUaGlzIGlzIGZhbHNlCisJICogYmVmb3JlIHRoZSBmaXJzdCBMWk1BIGNodW5rLgorCSAqLworCWJvb2wgbmVlZF9wcm9wczsKK307CisKK3N0cnVjdCB4el9kZWNfbHptYTIgeworCS8qCisJICogVGhlIG9yZGVyIGJlbG93IGlzIGltcG9ydGFudCBvbiB4ODYgdG8gcmVkdWNlIGNvZGUgc2l6ZSBhbmQKKwkgKiBpdCBzaG91bGRuJ3QgaHVydCBvbiBvdGhlciBwbGF0Zm9ybXMuIEV2ZXJ5dGhpbmcgdXAgdG8gYW5kCisJICogaW5jbHVkaW5nIGx6bWEucG9zX21hc2sgYXJlIGluIHRoZSBmaXJzdCAxMjggYnl0ZXMgb24geDg2LTMyLAorCSAqIHdoaWNoIGFsbG93cyB1c2luZyBzbWFsbGVyIGluc3RydWN0aW9ucyB0byBhY2Nlc3MgdGhvc2UKKwkgKiB2YXJpYWJsZXMuIE9uIHg4Ni02NCwgZmV3ZXIgdmFyaWFibGVzIGZpdCBpbnRvIHRoZSBmaXJzdCAxMjgKKwkgKiBieXRlcywgYnV0IHRoaXMgaXMgc3RpbGwgdGhlIGJlc3Qgb3JkZXIgd2l0aG91dCBzYWNyaWZpY2luZworCSAqIHRoZSByZWFkYWJpbGl0eSBieSBzcGxpdHRpbmcgdGhlIHN0cnVjdHVyZXMuCisJICovCisJc3RydWN0IHJjX2RlYyByYzsKKwlzdHJ1Y3QgZGljdGlvbmFyeSBkaWN0OworCXN0cnVjdCBsem1hMl9kZWMgbHptYTI7CisJc3RydWN0IGx6bWFfZGVjIGx6bWE7CisKKwkvKgorCSAqIFRlbXBvcmFyeSBidWZmZXIgd2hpY2ggaG9sZHMgc21hbGwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGJldHdlZW4KKwkgKiBkZWNvZGVyIGNhbGxzLiBTZWUgbHptYTJfbHptYSgpIGZvciBkZXRhaWxzLgorCSAqLworCXN0cnVjdCB7CisJCXVpbnQzMl90IHNpemU7CisJCXVpbnQ4X3QgYnVmWzMgKiBMWk1BX0lOX1JFUVVJUkVEXTsKKwl9IHRlbXA7Cit9OworCisvKioqKioqKioqKioqKioKKyAqIERpY3Rpb25hcnkgKgorICoqKioqKioqKioqKioqLworCisvKgorICogUmVzZXQgdGhlIGRpY3Rpb25hcnkgc3RhdGUuIFdoZW4gaW4gc2luZ2xlLWNhbGwgbW9kZSwgc2V0IHVwIHRoZSBiZWdpbm5pbmcKKyAqIG9mIHRoZSBkaWN0aW9uYXJ5IHRvIHBvaW50IHRvIHRoZSBhY3R1YWwgb3V0cHV0IGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBkaWN0X3Jlc2V0KHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCWlmIChERUNfSVNfU0lOR0xFKGRpY3QtPm1vZGUpKSB7CisJCWRpY3QtPmJ1ZiA9IGItPm91dCArIGItPm91dF9wb3M7CisJCWRpY3QtPmVuZCA9IGItPm91dF9zaXplIC0gYi0+b3V0X3BvczsKKwl9CisKKwlkaWN0LT5zdGFydCA9IDA7CisJZGljdC0+cG9zID0gMDsKKwlkaWN0LT5saW1pdCA9IDA7CisJZGljdC0+ZnVsbCA9IDA7Cit9CisKKy8qIFNldCBkaWN0aW9uYXJ5IHdyaXRlIGxpbWl0ICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGRpY3RfbGltaXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHNpemVfdCBvdXRfbWF4KQoreworCWlmIChkaWN0LT5lbmQgLSBkaWN0LT5wb3MgPD0gb3V0X21heCkKKwkJZGljdC0+bGltaXQgPSBkaWN0LT5lbmQ7CisJZWxzZQorCQlkaWN0LT5saW1pdCA9IGRpY3QtPnBvcyArIG91dF9tYXg7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBieXRlIGNhbiBiZSB3cml0dGVuIGludG8gdGhlIGRpY3Rpb25hcnkuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgWFpfRlVOQyBkaWN0X2hhc19zcGFjZShjb25zdCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCkKK3sKKwlyZXR1cm4gZGljdC0+cG9zIDwgZGljdC0+bGltaXQ7Cit9CisKKy8qCisgKiBHZXQgYSBieXRlIGZyb20gdGhlIGRpY3Rpb25hcnkgYXQgdGhlIGdpdmVuIGRpc3RhbmNlLiBUaGUgZGlzdGFuY2UgaXMKKyAqIGFzc3VtZWQgdG8gdmFsaWQsIG9yIGFzIGEgc3BlY2lhbCBjYXNlLCB6ZXJvIHdoZW4gdGhlIGRpY3Rpb25hcnkgaXMKKyAqIHN0aWxsIGVtcHR5LiBUaGlzIHNwZWNpYWwgY2FzZSBpcyBuZWVkZWQgZm9yIHNpbmdsZS1jYWxsIGRlY29kaW5nIHRvCisgKiBhdm9pZCB3cml0aW5nIGEgJ1wwJyB0byB0aGUgZW5kIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdWludDMyX3QgWFpfRlVOQyBkaWN0X2dldCgKKwkJY29uc3Qgc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHVpbnQzMl90IGRpc3QpCit7CisJc2l6ZV90IG9mZnNldCA9IGRpY3QtPnBvcyAtIGRpc3QgLSAxOworCisJaWYgKGRpc3QgPj0gZGljdC0+cG9zKQorCQlvZmZzZXQgKz0gZGljdC0+ZW5kOworCisJcmV0dXJuIGRpY3QtPmZ1bGwgPiAwID8gZGljdC0+YnVmW29mZnNldF0gOiAwOworfQorCisvKgorICogUHV0IG9uZSBieXRlIGludG8gdGhlIGRpY3Rpb25hcnkuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSBpcyBzcGFjZSBmb3IgaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIGRpY3RfcHV0KHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCB1aW50OF90IGJ5dGUpCit7CisJZGljdC0+YnVmW2RpY3QtPnBvcysrXSA9IGJ5dGU7CisKKwlpZiAoZGljdC0+ZnVsbCA8IGRpY3QtPnBvcykKKwkJZGljdC0+ZnVsbCA9IGRpY3QtPnBvczsKK30KKworLyoKKyAqIFJlcGVhdCBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gZGlzdGFuY2UuIElmIHRoZSBkaXN0YW5jZSBpcworICogaW52YWxpZCwgZmFsc2UgaXMgcmV0dXJuZWQuIE9uIHN1Y2Nlc3MsIHRydWUgaXMgcmV0dXJuZWQgYW5kICpsZW4gaXMKKyAqIHVwZGF0ZWQgdG8gaW5kaWNhdGUgaG93IG1hbnkgYnl0ZXMgd2VyZSBsZWZ0IHRvIGJlIHJlcGVhdGVkLgorICovCitzdGF0aWMgYm9vbCBYWl9GVU5DIGRpY3RfcmVwZWF0KAorCQlzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgdWludDMyX3QgKmxlbiwgdWludDMyX3QgZGlzdCkKK3sKKwlzaXplX3QgYmFjazsKKwl1aW50MzJfdCBsZWZ0OworCisJaWYgKGRpc3QgPj0gZGljdC0+ZnVsbCB8fCBkaXN0ID49IGRpY3QtPnNpemUpCisJCXJldHVybiBmYWxzZTsKKworCWxlZnQgPSBtaW5fdChzaXplX3QsIGRpY3QtPmxpbWl0IC0gZGljdC0+cG9zLCAqbGVuKTsKKwkqbGVuIC09IGxlZnQ7CisKKwliYWNrID0gZGljdC0+cG9zIC0gZGlzdCAtIDE7CisJaWYgKGRpc3QgPj0gZGljdC0+cG9zKQorCQliYWNrICs9IGRpY3QtPmVuZDsKKworCWRvIHsKKwkJZGljdC0+YnVmW2RpY3QtPnBvcysrXSA9IGRpY3QtPmJ1ZltiYWNrKytdOworCQlpZiAoYmFjayA9PSBkaWN0LT5lbmQpCisJCQliYWNrID0gMDsKKwl9IHdoaWxlICgtLWxlZnQgPiAwKTsKKworCWlmIChkaWN0LT5mdWxsIDwgZGljdC0+cG9zKQorCQlkaWN0LT5mdWxsID0gZGljdC0+cG9zOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qIENvcHkgdW5jb21wcmVzc2VkIGRhdGEgYXMgaXMgZnJvbSBpbnB1dCB0byBkaWN0aW9uYXJ5IGFuZCBvdXRwdXQgYnVmZmVycy4gKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgZGljdF91bmNvbXByZXNzZWQoCisJCXN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCBzdHJ1Y3QgeHpfYnVmICpiLCB1aW50MzJfdCAqbGVmdCkKK3sKKwlzaXplX3QgY29weV9zaXplOworCisJd2hpbGUgKCpsZWZ0ID4gMCAmJiBiLT5pbl9wb3MgPCBiLT5pbl9zaXplCisJCQkmJiBiLT5vdXRfcG9zIDwgYi0+b3V0X3NpemUpIHsKKwkJY29weV9zaXplID0gbWluKGItPmluX3NpemUgLSBiLT5pbl9wb3MsCisJCQkJYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zKTsKKwkJaWYgKGNvcHlfc2l6ZSA+IGRpY3QtPmVuZCAtIGRpY3QtPnBvcykKKwkJCWNvcHlfc2l6ZSA9IGRpY3QtPmVuZCAtIGRpY3QtPnBvczsKKwkJaWYgKGNvcHlfc2l6ZSA+ICpsZWZ0KQorCQkJY29weV9zaXplID0gKmxlZnQ7CisKKwkJKmxlZnQgLT0gY29weV9zaXplOworCisJCW1lbWNweShkaWN0LT5idWYgKyBkaWN0LT5wb3MsIGItPmluICsgYi0+aW5fcG9zLCBjb3B5X3NpemUpOworCQlkaWN0LT5wb3MgKz0gY29weV9zaXplOworCisJCWlmIChkaWN0LT5mdWxsIDwgZGljdC0+cG9zKQorCQkJZGljdC0+ZnVsbCA9IGRpY3QtPnBvczsKKworCQlpZiAoREVDX0lTX01VTFRJKGRpY3QtPm1vZGUpKSB7CisJCQlpZiAoZGljdC0+cG9zID09IGRpY3QtPmVuZCkKKwkJCQlkaWN0LT5wb3MgPSAwOworCisJCQltZW1jcHkoYi0+b3V0ICsgYi0+b3V0X3BvcywgYi0+aW4gKyBiLT5pbl9wb3MsCisJCQkJCWNvcHlfc2l6ZSk7CisJCX0KKworCQlkaWN0LT5zdGFydCA9IGRpY3QtPnBvczsKKworCQliLT5vdXRfcG9zICs9IGNvcHlfc2l6ZTsKKwkJYi0+aW5fcG9zICs9IGNvcHlfc2l6ZTsKKworCX0KK30KKworLyoKKyAqIEZsdXNoIHBlbmRpbmcgZGF0YSBmcm9tIGRpY3Rpb25hcnkgdG8gYi0+b3V0LiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgaXMKKyAqIGVub3VnaCBzcGFjZSBpbiBiLT5vdXQuIFRoaXMgaXMgZ3VhcmFudGVlZCBiZWNhdXNlIGNhbGxlciB1c2VzIGRpY3RfbGltaXQoKQorICogYmVmb3JlIGRlY29kaW5nIGRhdGEgaW50byB0aGUgZGljdGlvbmFyeS4KKyAqLworc3RhdGljIHVpbnQzMl90IFhaX0ZVTkMgZGljdF9mbHVzaChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgY29weV9zaXplID0gZGljdC0+cG9zIC0gZGljdC0+c3RhcnQ7CisKKwlpZiAoREVDX0lTX01VTFRJKGRpY3QtPm1vZGUpKSB7CisJCWlmIChkaWN0LT5wb3MgPT0gZGljdC0+ZW5kKQorCQkJZGljdC0+cG9zID0gMDsKKworCQltZW1jcHkoYi0+b3V0ICsgYi0+b3V0X3BvcywgZGljdC0+YnVmICsgZGljdC0+c3RhcnQsCisJCQkJY29weV9zaXplKTsKKwl9CisKKwlkaWN0LT5zdGFydCA9IGRpY3QtPnBvczsKKwliLT5vdXRfcG9zICs9IGNvcHlfc2l6ZTsKKwlyZXR1cm4gY29weV9zaXplOworfQorCisvKioqKioqKioqKioqKioqKioKKyAqIFJhbmdlIGRlY29kZXIgKgorICoqKioqKioqKioqKioqKioqLworCisvKiBSZXNldCB0aGUgcmFuZ2UgZGVjb2Rlci4gKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgcmNfcmVzZXQoc3RydWN0IHJjX2RlYyAqcmMpCit7CisJcmMtPnJhbmdlID0gKHVpbnQzMl90KS0xOworCXJjLT5jb2RlID0gMDsKKwlyYy0+aW5pdF9ieXRlc19sZWZ0ID0gUkNfSU5JVF9CWVRFUzsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZpcnN0IGZpdmUgaW5pdGlhbCBieXRlcyBpbnRvIHJjLT5jb2RlIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisgKiByZWFkIGFscmVhZHkuIChZZXMsIHRoZSBmaXJzdCBieXRlIGdldHMgY29tcGxldGVseSBpZ25vcmVkLikKKyAqLworc3RhdGljIGJvb2wgWFpfRlVOQyByY19yZWFkX2luaXQoc3RydWN0IHJjX2RlYyAqcmMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJd2hpbGUgKHJjLT5pbml0X2J5dGVzX2xlZnQgPiAwKSB7CisJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlyYy0+Y29kZSA9IChyYy0+Y29kZSA8PCA4KSArIGItPmluW2ItPmluX3BvcysrXTsKKwkJLS1yYy0+aW5pdF9ieXRlc19sZWZ0OworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBtYXkgbm90IGJlIGVub3VnaCBpbnB1dCBmb3IgdGhlIG5leHQgZGVjb2RpbmcgbG9vcC4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBYWl9GVU5DIHJjX2xpbWl0X2V4Y2VlZGVkKGNvbnN0IHN0cnVjdCByY19kZWMgKnJjKQoreworCXJldHVybiByYy0+aW5fcG9zID4gcmMtPmluX2xpbWl0OworfQorCisvKgorICogUmV0dXJuIHRydWUgaWYgaXQgaXMgcG9zc2libGUgKGZyb20gcG9pbnQgb2YgdmlldyBvZiByYW5nZSBkZWNvZGVyKSB0aGF0CisgKiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgTFpNQSBjaHVuay4KKyAqLworc3RhdGljIGlubGluZSBib29sIFhaX0ZVTkMgcmNfaXNfZmluaXNoZWQoY29uc3Qgc3RydWN0IHJjX2RlYyAqcmMpCit7CisJcmV0dXJuIHJjLT5jb2RlID09IDA7Cit9CisKKy8qIFJlYWQgdGhlIG5leHQgaW5wdXQgYnl0ZSBpZiBuZWVkZWQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgWFpfRlVOQyByY19ub3JtYWxpemUoc3RydWN0IHJjX2RlYyAqcmMpCit7CisJaWYgKHJjLT5yYW5nZSA8IFJDX1RPUF9WQUxVRSkgeworCQlyYy0+cmFuZ2UgPDw9IFJDX1NISUZUX0JJVFM7CisJCXJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IFJDX1NISUZUX0JJVFMpICsgcmMtPmluW3JjLT5pbl9wb3MrK107CisJfQorfQorCisvKgorICogRGVjb2RlIG9uZSBiaXQuIEluIHNvbWUgdmVyc2lvbnMsIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gc3BsaXR0ZWQgaW4gdGhyZWUKKyAqIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZSBjb21waWxlciBpcyBzdXBwb3NlZCB0byBiZSBhYmxlIHRvIG1vcmUgZWFzaWx5IGF2b2lkCisgKiBhbiBleHRyYSBicmFuY2guIEluIHRoaXMgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBMWk1BIGRlY29kZXIsIHRoaXMKKyAqIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGdvb2QgaWRlYSAodGVzdGVkIHdpdGggR0NDIDMuMy42LCAzLjQuNiwgYW5kIDQuMy4zCisgKiBvbiB4ODYpLiBVc2luZyBhIG5vbi1zcGxpdHRlZCB2ZXJzaW9uIHJlc3VsdHMgaW4gbmljZXIgbG9va2luZyBjb2RlIHRvby4KKyAqCisgKiBOT1RFOiBUaGlzIG11c3QgcmV0dXJuIGFuIGludC4gRG8gbm90IG1ha2UgaXQgcmV0dXJuIGEgYm9vbCBvciB0aGUgc3BlZWQKKyAqIG9mIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBHQ0MgMy54IGRlY3JlYXNlcyAxMC0xNSAlLiAoR0NDIDQuMyBkb2Vzbid0IGNhcmUsCisgKiBhbmQgaXQgZ2VuZXJhdGVzIDEwLTIwICUgZmFzdGVyIGNvZGUgdGhhbiBHQ0MgMy54IGZyb20gdGhpcyBmaWxlIGFueXdheS4pCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IFhaX0ZVTkMgcmNfYml0KHN0cnVjdCByY19kZWMgKnJjLCB1aW50MTZfdCAqcHJvYikKK3sKKwl1aW50MzJfdCBib3VuZDsKKwlpbnQgYml0OworCisJcmNfbm9ybWFsaXplKHJjKTsKKwlib3VuZCA9IChyYy0+cmFuZ2UgPj4gUkNfQklUX01PREVMX1RPVEFMX0JJVFMpICogKnByb2I7CisJaWYgKHJjLT5jb2RlIDwgYm91bmQpIHsKKwkJcmMtPnJhbmdlID0gYm91bmQ7CisJCSpwcm9iICs9IChSQ19CSVRfTU9ERUxfVE9UQUwgLSAqcHJvYikgPj4gUkNfTU9WRV9CSVRTOworCQliaXQgPSAwOworCX0gZWxzZSB7CisJCXJjLT5yYW5nZSAtPSBib3VuZDsKKwkJcmMtPmNvZGUgLT0gYm91bmQ7CisJCSpwcm9iIC09ICpwcm9iID4+IFJDX01PVkVfQklUUzsKKwkJYml0ID0gMTsKKwl9CisKKwlyZXR1cm4gYml0OworfQorCisvKiBEZWNvZGUgYSBiaXR0cmVlIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1aW50MzJfdCBYWl9GVU5DIHJjX2JpdHRyZWUoCisJCXN0cnVjdCByY19kZWMgKnJjLCB1aW50MTZfdCAqcHJvYnMsIHVpbnQzMl90IGxpbWl0KQoreworCXVpbnQzMl90IHN5bWJvbCA9IDE7CisKKwlkbyB7CisJCWlmIChyY19iaXQocmMsICZwcm9ic1tzeW1ib2xdKSkKKwkJCXN5bWJvbCA9IChzeW1ib2wgPDwgMSkgKyAxOworCQllbHNlCisJCQlzeW1ib2wgPDw9IDE7CisJfSB3aGlsZSAoc3ltYm9sIDwgbGltaXQpOworCisJcmV0dXJuIHN5bWJvbDsKK30KKworLyogRGVjb2RlIGEgYml0dHJlZSBzdGFydGluZyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgWFpfRlVOQyByY19iaXR0cmVlX3JldmVyc2Uoc3RydWN0IHJjX2RlYyAqcmMsCisJCXVpbnQxNl90ICpwcm9icywgdWludDMyX3QgKmRlc3QsIHVpbnQzMl90IGxpbWl0KQoreworCXVpbnQzMl90IHN5bWJvbCA9IDE7CisJdWludDMyX3QgaSA9IDA7CisKKwlkbyB7CisJCWlmIChyY19iaXQocmMsICZwcm9ic1tzeW1ib2xdKSkgeworCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSArIDE7CisJCQkqZGVzdCArPSAxIDw8IGk7CisJCX0gZWxzZSB7CisJCQlzeW1ib2wgPDw9IDE7CisJCX0KKwl9IHdoaWxlICgrK2kgPCBsaW1pdCk7Cit9CisKKy8qIERlY29kZSBkaXJlY3QgYml0cyAoZml4ZWQgZmlmdHktZmlmdHkgcHJvYmFiaWxpdHkpICovCitzdGF0aWMgaW5saW5lIHZvaWQgWFpfRlVOQyByY19kaXJlY3QoCisJCXN0cnVjdCByY19kZWMgKnJjLCB1aW50MzJfdCAqZGVzdCwgdWludDMyX3QgbGltaXQpCit7CisJdWludDMyX3QgbWFzazsKKworCWRvIHsKKwkJcmNfbm9ybWFsaXplKHJjKTsKKwkJcmMtPnJhbmdlID4+PSAxOworCQlyYy0+Y29kZSAtPSByYy0+cmFuZ2U7CisJCW1hc2sgPSAodWludDMyX3QpMCAtIChyYy0+Y29kZSA+PiAzMSk7CisJCXJjLT5jb2RlICs9IHJjLT5yYW5nZSAmIG1hc2s7CisJCSpkZXN0ID0gKCpkZXN0IDw8IDEpICsgKG1hc2sgKyAxKTsKKwl9IHdoaWxlICgtLWxpbWl0ID4gMCk7Cit9CisKKy8qKioqKioqKgorICogTFpNQSAqCisgKioqKioqKiovCisKKy8qIEdldCBwb2ludGVyIHRvIGxpdGVyYWwgY29kZXIgcHJvYmFiaWxpdHkgYXJyYXkuICovCitzdGF0aWMgdWludDE2X3QgKiBYWl9GVU5DIGx6bWFfbGl0ZXJhbF9wcm9icyhzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworCXVpbnQzMl90IHByZXZfYnl0ZSA9IGRpY3RfZ2V0KCZzLT5kaWN0LCAwKTsKKwl1aW50MzJfdCBsb3cgPSBwcmV2X2J5dGUgPj4gKDggLSBzLT5sem1hLmxjKTsKKwl1aW50MzJfdCBoaWdoID0gKHMtPmRpY3QucG9zICYgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrKSA8PCBzLT5sem1hLmxjOworCXJldHVybiBzLT5sem1hLmxpdGVyYWxbbG93ICsgaGlnaF07Cit9CisKKy8qIERlY29kZSBhIGxpdGVyYWwgKG9uZSA4LWJpdCBieXRlKSAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBsem1hX2xpdGVyYWwoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3Qgc3ltYm9sOworCXVpbnQzMl90IG1hdGNoX2J5dGU7CisJdWludDMyX3QgbWF0Y2hfYml0OworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBpOworCisJcHJvYnMgPSBsem1hX2xpdGVyYWxfcHJvYnMocyk7CisKKwlpZiAobHptYV9zdGF0ZV9pc19saXRlcmFsKHMtPmx6bWEuc3RhdGUpKSB7CisJCXN5bWJvbCA9IHJjX2JpdHRyZWUoJnMtPnJjLCBwcm9icywgMHgxMDApOworCX0gZWxzZSB7CisJCXN5bWJvbCA9IDE7CisJCW1hdGNoX2J5dGUgPSBkaWN0X2dldCgmcy0+ZGljdCwgcy0+bHptYS5yZXAwKSA8PCAxOworCQlvZmZzZXQgPSAweDEwMDsKKworCQlkbyB7CisJCQltYXRjaF9iaXQgPSBtYXRjaF9ieXRlICYgb2Zmc2V0OworCQkJbWF0Y2hfYnl0ZSA8PD0gMTsKKwkJCWkgPSBvZmZzZXQgKyBtYXRjaF9iaXQgKyBzeW1ib2w7CisKKwkJCWlmIChyY19iaXQoJnMtPnJjLCAmcHJvYnNbaV0pKSB7CisJCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSArIDE7CisJCQkJb2Zmc2V0ICY9IG1hdGNoX2JpdDsKKwkJCX0gZWxzZSB7CisJCQkJc3ltYm9sIDw8PSAxOworCQkJCW9mZnNldCAmPSB+bWF0Y2hfYml0OworCQkJfQorCQl9IHdoaWxlIChzeW1ib2wgPCAweDEwMCk7CisJfQorCisJZGljdF9wdXQoJnMtPmRpY3QsICh1aW50OF90KXN5bWJvbCk7CisJbHptYV9zdGF0ZV9saXRlcmFsKCZzLT5sem1hLnN0YXRlKTsKK30KKworLyogRGVjb2RlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGludG8gcy0+bHptYS5sZW4uICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGx6bWFfbGVuKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHN0cnVjdCBsem1hX2xlbl9kZWMgKmwsCisJCXVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3QgbGltaXQ7CisKKwlpZiAoIXJjX2JpdCgmcy0+cmMsICZsLT5jaG9pY2UpKSB7CisJCXByb2JzID0gbC0+bG93W3Bvc19zdGF0ZV07CisJCWxpbWl0ID0gTEVOX0xPV19TWU1CT0xTOworCQlzLT5sem1hLmxlbiA9IE1BVENIX0xFTl9NSU47CisJfSBlbHNlIHsKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmbC0+Y2hvaWNlMikpIHsKKwkJCXByb2JzID0gbC0+bWlkW3Bvc19zdGF0ZV07CisJCQlsaW1pdCA9IExFTl9NSURfU1lNQk9MUzsKKwkJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTiArIExFTl9MT1dfU1lNQk9MUzsKKwkJfSBlbHNlIHsKKwkJCXByb2JzID0gbC0+aGlnaDsKKwkJCWxpbWl0ID0gTEVOX0hJR0hfU1lNQk9MUzsKKwkJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTiArIExFTl9MT1dfU1lNQk9MUworCQkJCQkrIExFTl9NSURfU1lNQk9MUzsKKwkJfQorCX0KKworCXMtPmx6bWEubGVuICs9IHJjX2JpdHRyZWUoJnMtPnJjLCBwcm9icywgbGltaXQpIC0gbGltaXQ7Cit9CisKKy8qIERlY29kZSBhIG1hdGNoLiBUaGUgZGlzdGFuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gcy0+bHptYS5yZXAwLiAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBsem1hX21hdGNoKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3QgZGlzdF9zbG90OworCXVpbnQzMl90IGxpbWl0OworCisJbHptYV9zdGF0ZV9tYXRjaCgmcy0+bHptYS5zdGF0ZSk7CisKKwlzLT5sem1hLnJlcDMgPSBzLT5sem1hLnJlcDI7CisJcy0+bHptYS5yZXAyID0gcy0+bHptYS5yZXAxOworCXMtPmx6bWEucmVwMSA9IHMtPmx6bWEucmVwMDsKKworCWx6bWFfbGVuKHMsICZzLT5sem1hLm1hdGNoX2xlbl9kZWMsIHBvc19zdGF0ZSk7CisKKwlwcm9icyA9IHMtPmx6bWEuZGlzdF9zbG90W2x6bWFfZ2V0X2Rpc3Rfc3RhdGUocy0+bHptYS5sZW4pXTsKKwlkaXN0X3Nsb3QgPSByY19iaXR0cmVlKCZzLT5yYywgcHJvYnMsIERJU1RfU0xPVFMpIC0gRElTVF9TTE9UUzsKKworCWlmIChkaXN0X3Nsb3QgPCBESVNUX01PREVMX1NUQVJUKSB7CisJCXMtPmx6bWEucmVwMCA9IGRpc3Rfc2xvdDsKKwl9IGVsc2UgeworCQlsaW1pdCA9IChkaXN0X3Nsb3QgPj4gMSkgLSAxOworCQlzLT5sem1hLnJlcDAgPSAyICsgKGRpc3Rfc2xvdCAmIDEpOworCisJCWlmIChkaXN0X3Nsb3QgPCBESVNUX01PREVMX0VORCkgeworCQkJcy0+bHptYS5yZXAwIDw8PSBsaW1pdDsKKwkJCXByb2JzID0gcy0+bHptYS5kaXN0X3NwZWNpYWwgKyBzLT5sem1hLnJlcDAKKwkJCQkJLSBkaXN0X3Nsb3QgLSAxOworCQkJcmNfYml0dHJlZV9yZXZlcnNlKCZzLT5yYywgcHJvYnMsCisJCQkJCSZzLT5sem1hLnJlcDAsIGxpbWl0KTsKKwkJfSBlbHNlIHsKKwkJCXJjX2RpcmVjdCgmcy0+cmMsICZzLT5sem1hLnJlcDAsIGxpbWl0IC0gQUxJR05fQklUUyk7CisJCQlzLT5sem1hLnJlcDAgPDw9IEFMSUdOX0JJVFM7CisJCQlyY19iaXR0cmVlX3JldmVyc2UoJnMtPnJjLCBzLT5sem1hLmRpc3RfYWxpZ24sCisJCQkJCSZzLT5sem1hLnJlcDAsIEFMSUdOX0JJVFMpOworCQl9CisJfQorfQorCisvKgorICogRGVjb2RlIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgdGhlIGZvdXIgbW9zdCByZWNlbnRseQorICogc2VlbiBtYXRjaGVzLiBUaGUgZGlzdGFuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gcy0+bHptYS5yZXAwLgorICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGx6bWFfcmVwX21hdGNoKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MzJfdCB0bXA7CisKKwlpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDBbcy0+bHptYS5zdGF0ZV0pKSB7CisJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMF9sb25nWworCQkJCXMtPmx6bWEuc3RhdGVdW3Bvc19zdGF0ZV0pKSB7CisJCQlsem1hX3N0YXRlX3Nob3J0X3JlcCgmcy0+bHptYS5zdGF0ZSk7CisJCQlzLT5sem1hLmxlbiA9IDE7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDFbcy0+bHptYS5zdGF0ZV0pKSB7CisJCQl0bXAgPSBzLT5sem1hLnJlcDE7CisJCX0gZWxzZSB7CisJCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDJbcy0+bHptYS5zdGF0ZV0pKSB7CisJCQkJdG1wID0gcy0+bHptYS5yZXAyOworCQkJfSBlbHNlIHsKKwkJCQl0bXAgPSBzLT5sem1hLnJlcDM7CisJCQkJcy0+bHptYS5yZXAzID0gcy0+bHptYS5yZXAyOworCQkJfQorCisJCQlzLT5sem1hLnJlcDIgPSBzLT5sem1hLnJlcDE7CisJCX0KKworCQlzLT5sem1hLnJlcDEgPSBzLT5sem1hLnJlcDA7CisJCXMtPmx6bWEucmVwMCA9IHRtcDsKKwl9CisKKwlsem1hX3N0YXRlX2xvbmdfcmVwKCZzLT5sem1hLnN0YXRlKTsKKwlsem1hX2xlbihzLCAmcy0+bHptYS5yZXBfbGVuX2RlYywgcG9zX3N0YXRlKTsKK30KKworLyogTFpNQSBkZWNvZGVyIGNvcmUgKi8KK3N0YXRpYyBib29sIFhaX0ZVTkMgbHptYV9tYWluKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpCit7CisJdWludDMyX3QgcG9zX3N0YXRlOworCisJLyoKKwkgKiBJZiB0aGUgZGljdGlvbmFyeSB3YXMgcmVhY2hlZCBkdXJpbmcgdGhlIHByZXZpb3VzIGNhbGwsIHRyeSB0bworCSAqIGZpbmlzaCB0aGUgcG9zc2libHkgcGVuZGluZyByZXBlYXQgaW4gdGhlIGRpY3Rpb25hcnkuCisJICovCisJaWYgKGRpY3RfaGFzX3NwYWNlKCZzLT5kaWN0KSAmJiBzLT5sem1hLmxlbiA+IDApCisJCWRpY3RfcmVwZWF0KCZzLT5kaWN0LCAmcy0+bHptYS5sZW4sIHMtPmx6bWEucmVwMCk7CisKKwkvKgorCSAqIERlY29kZSBtb3JlIExaTUEgc3ltYm9scy4gT25lIGl0ZXJhdGlvbiBtYXkgY29uc3VtZSB1cCB0bworCSAqIExaTUFfSU5fUkVRVUlSRUQgLSAxIGJ5dGVzLgorCSAqLworCXdoaWxlIChkaWN0X2hhc19zcGFjZSgmcy0+ZGljdCkgJiYgIXJjX2xpbWl0X2V4Y2VlZGVkKCZzLT5yYykpIHsKKwkJcG9zX3N0YXRlID0gcy0+ZGljdC5wb3MgJiBzLT5sem1hLnBvc19tYXNrOworCisJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfbWF0Y2hbCisJCQkJcy0+bHptYS5zdGF0ZV1bcG9zX3N0YXRlXSkpIHsKKwkJCWx6bWFfbGl0ZXJhbChzKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXBbcy0+bHptYS5zdGF0ZV0pKQorCQkJCWx6bWFfcmVwX21hdGNoKHMsIHBvc19zdGF0ZSk7CisJCQllbHNlCisJCQkJbHptYV9tYXRjaChzLCBwb3Nfc3RhdGUpOworCisJCQlpZiAoIWRpY3RfcmVwZWF0KCZzLT5kaWN0LCAmcy0+bHptYS5sZW4sIHMtPmx6bWEucmVwMCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoKKwkgKiBIYXZpbmcgdGhlIHJhbmdlIGRlY29kZXIgYWx3YXlzIG5vcm1hbGl6ZWQgd2hlbiB3ZSBhcmUgb3V0c2lkZQorCSAqIHRoaXMgZnVuY3Rpb24gbWFrZXMgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBoYW5kbGUgZW5kIG9mIHRoZSBjaHVuay4KKwkgKi8KKwlyY19ub3JtYWxpemUoJnMtPnJjKTsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogUmVzZXQgdGhlIExaTUEgZGVjb2RlciBhbmQgcmFuZ2UgZGVjb2RlciBzdGF0ZS4gRGljdGlvbmFyeSBpcyBub3JlIHJlc2V0CisgKiBoZXJlLCBiZWNhdXNlIExaTUEgc3RhdGUgbWF5IGJlIHJlc2V0IHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBkaWN0aW9uYXJ5LgorICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGx6bWFfcmVzZXQoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJc2l6ZV90IGk7CisKKwlzLT5sem1hLnN0YXRlID0gU1RBVEVfTElUX0xJVDsKKwlzLT5sem1hLnJlcDAgPSAwOworCXMtPmx6bWEucmVwMSA9IDA7CisJcy0+bHptYS5yZXAyID0gMDsKKwlzLT5sem1hLnJlcDMgPSAwOworCisJLyoKKwkgKiBBbGwgcHJvYmFiaWxpdGllcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWUuIFRoaXMgaGFjaworCSAqIG1ha2VzIHRoZSBjb2RlIHNtYWxsZXIgYnkgYXZvaWRpbmcgYSBzZXBhcmF0ZSBsb29wIGZvciBlYWNoCisJICogcHJvYmFiaWxpdHkgYXJyYXkuCisJICoKKwkgKiBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBzbyB0aGF0IG9ubHkgdGhhdCBwYXJ0IG9mIGxpdGVyYWwKKwkgKiBwcm9iYWJpbGl0aWVzIHRoYXQgYXJlIGFjdHVhbGx5IHJlcXVpcmVkLiBJbiB0aGUgY29tbW9uIGNhc2UKKwkgKiB3ZSB3b3VsZCB3cml0ZSAxMiBLaUIgbGVzcy4KKwkgKi8KKwlwcm9icyA9IHMtPmx6bWEuaXNfbWF0Y2hbMF07CisJZm9yIChpID0gMDsgaSA8IFBST0JTX1RPVEFMOyArK2kpCisJCXByb2JzW2ldID0gUkNfQklUX01PREVMX1RPVEFMIC8gMjsKKworCXJjX3Jlc2V0KCZzLT5yYyk7Cit9CisKKy8qCisgKiBEZWNvZGUgYW5kIHZhbGlkYXRlIExaTUEgcHJvcGVydGllcyAobGMvbHAvcGIpIGFuZCBjYWxjdWxhdGUgdGhlIGJpdCBtYXNrcworICogZnJvbSB0aGUgZGVjb2RlZCBscCBhbmQgcGIgdmFsdWVzLiBPbiBzdWNjZXNzLCB0aGUgTFpNQSBkZWNvZGVyIHN0YXRlIGlzCisgKiByZXNldCBhbmQgdHJ1ZSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGJvb2wgWFpfRlVOQyBsem1hX3Byb3BzKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQ4X3QgcHJvcHMpCit7CisJaWYgKHByb3BzID4gKDQgKiA1ICsgNCkgKiA5ICsgOCkKKwkJcmV0dXJuIGZhbHNlOworCisJcy0+bHptYS5wb3NfbWFzayA9IDA7CisJd2hpbGUgKHByb3BzID49IDkgKiA1KSB7CisJCXByb3BzIC09IDkgKiA1OworCQkrK3MtPmx6bWEucG9zX21hc2s7CisJfQorCisJcy0+bHptYS5wb3NfbWFzayA9ICgxIDw8IHMtPmx6bWEucG9zX21hc2spIC0gMTsKKworCXMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzayA9IDA7CisJd2hpbGUgKHByb3BzID49IDkpIHsKKwkJcHJvcHMgLT0gOTsKKwkJKytzLT5sem1hLmxpdGVyYWxfcG9zX21hc2s7CisJfQorCisJcy0+bHptYS5sYyA9IHByb3BzOworCisJaWYgKHMtPmx6bWEubGMgKyBzLT5sem1hLmxpdGVyYWxfcG9zX21hc2sgPiA0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlzLT5sem1hLmxpdGVyYWxfcG9zX21hc2sgPSAoMSA8PCBzLT5sem1hLmxpdGVyYWxfcG9zX21hc2spIC0gMTsKKworCWx6bWFfcmVzZXQocyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKgorICogTFpNQTIgKgorICoqKioqKioqKi8KKworLyoKKyAqIFRoZSBMWk1BIGRlY29kZXIgYXNzdW1lcyB0aGF0IGlmIHRoZSBpbnB1dCBsaW1pdCAocy0+cmMuaW5fbGltaXQpIGhhc24ndAorICogYmVlbiBleGNlZWRlZCwgaXQgaXMgc2FmZSB0byByZWFkIHVwIHRvIExaTUFfSU5fUkVRVUlSRUQgYnl0ZXMuIFRoaXMKKyAqIHdyYXBwZXIgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBtYWtpbmcgdGhlIExaTUEgZGVjb2RlcidzIGFzc3VtcHRpb24gc2FmZS4KKyAqCisgKiBBcyBsb25nIGFzIHRoZXJlIGlzIHBsZW50eSBvZiBpbnB1dCBsZWZ0IHRvIGJlIGRlY29kZWQgaW4gdGhlIGN1cnJlbnQgTFpNQQorICogY2h1bmssIHdlIGRlY29kZSBkaXJlY3RseSBmcm9tIHRoZSBjYWxsZXItc3VwcGxpZWQgaW5wdXQgYnVmZmVyIHVudGlsCisgKiB0aGVyZSdzIExaTUFfSU5fUkVRVUlSRUQgYnl0ZXMgbGVmdC4gVGhvc2UgcmVtYWluaW5nIGJ5dGVzIGFyZSBjb3BpZWQgaW50bworICogcy0+dGVtcC5idWYsIHdoaWNoIChob3BlZnVsbHkpIGdldHMgZmlsbGVkIG9uIHRoZSBuZXh0IGNhbGwgdG8gdGhpcworICogZnVuY3Rpb24uIFdlIGRlY29kZSBhIGZldyBieXRlcyBmcm9tIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIHNvIHRoYXQgd2UgY2FuCisgKiBjb250aW51ZSBkZWNvZGluZyBmcm9tIHRoZSBjYWxsZXItc3VwcGxpZWQgaW5wdXQgYnVmZmVyIGFnYWluLgorICovCitzdGF0aWMgYm9vbCBYWl9GVU5DIGx6bWEyX2x6bWEoc3RydWN0IHh6X2RlY19sem1hMiAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgaW5fYXZhaWw7CisJdWludDMyX3QgdG1wOworCisJaW5fYXZhaWwgPSBiLT5pbl9zaXplIC0gYi0+aW5fcG9zOworCWlmIChzLT50ZW1wLnNpemUgPiAwIHx8IHMtPmx6bWEyLmNvbXByZXNzZWQgPT0gMCkgeworCQl0bXAgPSAyICogTFpNQV9JTl9SRVFVSVJFRCAtIHMtPnRlbXAuc2l6ZTsKKwkJaWYgKHRtcCA+IHMtPmx6bWEyLmNvbXByZXNzZWQgLSBzLT50ZW1wLnNpemUpCisJCQl0bXAgPSBzLT5sem1hMi5jb21wcmVzc2VkIC0gcy0+dGVtcC5zaXplOworCQlpZiAodG1wID4gaW5fYXZhaWwpCisJCQl0bXAgPSBpbl9hdmFpbDsKKworCQltZW1jcHkocy0+dGVtcC5idWYgKyBzLT50ZW1wLnNpemUsIGItPmluICsgYi0+aW5fcG9zLCB0bXApOworCisJCWlmIChzLT50ZW1wLnNpemUgKyB0bXAgPT0gcy0+bHptYTIuY29tcHJlc3NlZCkgeworCQkJbWVtemVybyhzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSArIHRtcCwKKwkJCQkJc2l6ZW9mKHMtPnRlbXAuYnVmKQorCQkJCQkJLSBzLT50ZW1wLnNpemUgLSB0bXApOworCQkJcy0+cmMuaW5fbGltaXQgPSBzLT50ZW1wLnNpemUgKyB0bXA7CisJCX0gZWxzZSBpZiAocy0+dGVtcC5zaXplICsgdG1wIDwgTFpNQV9JTl9SRVFVSVJFRCkgeworCQkJcy0+dGVtcC5zaXplICs9IHRtcDsKKwkJCWItPmluX3BvcyArPSB0bXA7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXMtPnJjLmluX2xpbWl0ID0gcy0+dGVtcC5zaXplICsgdG1wIC0gTFpNQV9JTl9SRVFVSVJFRDsKKwkJfQorCisJCXMtPnJjLmluID0gcy0+dGVtcC5idWY7CisJCXMtPnJjLmluX3BvcyA9IDA7CisKKwkJaWYgKCFsem1hX21haW4ocykgfHwgcy0+cmMuaW5fcG9zID4gcy0+dGVtcC5zaXplICsgdG1wKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXMtPmx6bWEyLmNvbXByZXNzZWQgLT0gcy0+cmMuaW5fcG9zOworCisJCWlmIChzLT5yYy5pbl9wb3MgPCBzLT50ZW1wLnNpemUpIHsKKwkJCXMtPnRlbXAuc2l6ZSAtPSBzLT5yYy5pbl9wb3M7CisJCQltZW1tb3ZlKHMtPnRlbXAuYnVmLCBzLT50ZW1wLmJ1ZiArIHMtPnJjLmluX3BvcywKKwkJCQkJcy0+dGVtcC5zaXplKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJYi0+aW5fcG9zICs9IHMtPnJjLmluX3BvcyAtIHMtPnRlbXAuc2l6ZTsKKwkJcy0+dGVtcC5zaXplID0gMDsKKwl9CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKGluX2F2YWlsID49IExaTUFfSU5fUkVRVUlSRUQpIHsKKwkJcy0+cmMuaW4gPSBiLT5pbjsKKwkJcy0+cmMuaW5fcG9zID0gYi0+aW5fcG9zOworCisJCWlmIChpbl9hdmFpbCA+PSBzLT5sem1hMi5jb21wcmVzc2VkICsgTFpNQV9JTl9SRVFVSVJFRCkKKwkJCXMtPnJjLmluX2xpbWl0ID0gYi0+aW5fcG9zICsgcy0+bHptYTIuY29tcHJlc3NlZDsKKwkJZWxzZQorCQkJcy0+cmMuaW5fbGltaXQgPSBiLT5pbl9zaXplIC0gTFpNQV9JTl9SRVFVSVJFRDsKKworCQlpZiAoIWx6bWFfbWFpbihzKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpbl9hdmFpbCA9IHMtPnJjLmluX3BvcyAtIGItPmluX3BvczsKKwkJaWYgKGluX2F2YWlsID4gcy0+bHptYTIuY29tcHJlc3NlZCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlzLT5sem1hMi5jb21wcmVzc2VkIC09IGluX2F2YWlsOworCQliLT5pbl9wb3MgPSBzLT5yYy5pbl9wb3M7CisJfQorCisJaW5fYXZhaWwgPSBiLT5pbl9zaXplIC0gYi0+aW5fcG9zOworCWlmIChpbl9hdmFpbCA8IExaTUFfSU5fUkVRVUlSRUQpIHsKKwkJaWYgKGluX2F2YWlsID4gcy0+bHptYTIuY29tcHJlc3NlZCkKKwkJCWluX2F2YWlsID0gcy0+bHptYTIuY29tcHJlc3NlZDsKKworCQltZW1jcHkocy0+dGVtcC5idWYsIGItPmluICsgYi0+aW5fcG9zLCBpbl9hdmFpbCk7CisJCXMtPnRlbXAuc2l6ZSA9IGluX2F2YWlsOworCQliLT5pbl9wb3MgKz0gaW5fYXZhaWw7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBUYWtlIGNhcmUgb2YgdGhlIExaTUEyIGNvbnRyb2wgbGF5ZXIsIGFuZCBmb3J3YXJkIHRoZSBqb2Igb2YgYWN0dWFsIExaTUEKKyAqIGRlY29kaW5nIG9yIGNvcHlpbmcgb2YgdW5jb21wcmVzc2VkIGNodW5rcyB0byBvdGhlciBmdW5jdGlvbnMuCisgKi8KK1haX0VYVEVSTiBOT0lOTElORSBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19sem1hMl9ydW4oCisJCXN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJdWludDMyX3QgdG1wOworCisJd2hpbGUgKGItPmluX3BvcyA8IGItPmluX3NpemUgfHwgcy0+bHptYTIuc2VxdWVuY2UgPT0gU0VRX0xaTUFfUlVOKSB7CisJCXN3aXRjaCAocy0+bHptYTIuc2VxdWVuY2UpIHsKKwkJY2FzZSBTRVFfQ09OVFJPTDoKKwkJCS8qCisJCQkgKiBMWk1BMiBjb250cm9sIGJ5dGUKKwkJCSAqCisJCQkgKiBFeGFjdCB2YWx1ZXM6CisJCQkgKiAgIDB4MDAgICBFbmQgbWFya2VyCisJCQkgKiAgIDB4MDEgICBEaWN0aW9uYXJ5IHJlc2V0IGZvbGxvd2VkIGJ5CisJCQkgKiAgICAgICAgICBhbiB1bmNvbXByZXNzZWQgY2h1bmsKKwkJCSAqICAgMHgwMiAgIFVuY29tcHJlc3NlZCBjaHVuayAobm8gZGljdGlvbmFyeSByZXNldCkKKwkJCSAqCisJCQkgKiBIaWdoZXN0IHRocmVlIGJpdHMgKHMtPmNvbnRyb2wgJiAweEUwKToKKwkJCSAqICAgMHhFMCAgIERpY3Rpb25hcnkgcmVzZXQsIG5ldyBwcm9wZXJ0aWVzIGFuZCBzdGF0ZQorCQkJICogICAgICAgICAgcmVzZXQsIGZvbGxvd2VkIGJ5IExaTUEgY29tcHJlc3NlZCBjaHVuaworCQkJICogICAweEMwICAgTmV3IHByb3BlcnRpZXMgYW5kIHN0YXRlIHJlc2V0LCBmb2xsb3dlZAorCQkJICogICAgICAgICAgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rIChubyBkaWN0aW9uYXJ5CisJCQkgKiAgICAgICAgICByZXNldCkKKwkJCSAqICAgMHhBMCAgIFN0YXRlIHJlc2V0IHVzaW5nIG9sZCBwcm9wZXJ0aWVzLAorCQkJICogICAgICAgICAgZm9sbG93ZWQgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rIChubworCQkJICogICAgICAgICAgZGljdGlvbmFyeSByZXNldCkKKwkJCSAqICAgMHg4MCAgIExaTUEgY2h1bmsgKG5vIGRpY3Rpb25hcnkgb3Igc3RhdGUgcmVzZXQpCisJCQkgKgorCQkJICogRm9yIExaTUEgY29tcHJlc3NlZCBjaHVua3MsIHRoZSBsb3dlc3QgZml2ZSBiaXRzCisJCQkgKiAocy0+Y29udHJvbCAmIDFGKSBhcmUgdGhlIGhpZ2hlc3QgYml0cyBvZiB0aGUKKwkJCSAqIHVuY29tcHJlc3NlZCBzaXplIChiaXRzIDE2LTIwKS4KKwkJCSAqCisJCQkgKiBBIG5ldyBMWk1BMiBzdHJlYW0gbXVzdCBiZWdpbiB3aXRoIGEgZGljdGlvbmFyeQorCQkJICogcmVzZXQuIFRoZSBmaXJzdCBMWk1BIGNodW5rIG11c3Qgc2V0IG5ldworCQkJICogcHJvcGVydGllcyBhbmQgcmVzZXQgdGhlIExaTUEgc3RhdGUuCisJCQkgKgorCQkJICogVmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55dGhpbmcgZGVzY3JpYmVkIGFib3ZlCisJCQkgKiBhcmUgaW52YWxpZCBhbmQgd2UgcmV0dXJuIFhaX0RBVEFfRVJST1IuCisJCQkgKi8KKwkJCXRtcCA9IGItPmluW2ItPmluX3BvcysrXTsKKworCQkJaWYgKHRtcCA+PSAweEUwIHx8IHRtcCA9PSAweDAxKSB7CisJCQkJcy0+bHptYTIubmVlZF9wcm9wcyA9IHRydWU7CisJCQkJcy0+bHptYTIubmVlZF9kaWN0X3Jlc2V0ID0gZmFsc2U7CisJCQkJZGljdF9yZXNldCgmcy0+ZGljdCwgYik7CisJCQl9IGVsc2UgaWYgKHMtPmx6bWEyLm5lZWRfZGljdF9yZXNldCkgeworCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCQkJfQorCisJCQlpZiAodG1wID49IDB4ODApIHsKKwkJCQlzLT5sem1hMi51bmNvbXByZXNzZWQgPSAodG1wICYgMHgxRikgPDwgMTY7CisJCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfVU5DT01QUkVTU0VEXzE7CisKKwkJCQlpZiAodG1wID49IDB4QzApIHsKKwkJCQkJLyoKKwkJCQkJICogV2hlbiB0aGVyZSBhcmUgbmV3IHByb3BlcnRpZXMsCisJCQkJCSAqIHN0YXRlIHJlc2V0IGlzIGRvbmUgYXQKKwkJCQkJICogU0VRX1BST1BFUlRJRVMuCisJCQkJCSAqLworCQkJCQlzLT5sem1hMi5uZWVkX3Byb3BzID0gZmFsc2U7CisJCQkJCXMtPmx6bWEyLm5leHRfc2VxdWVuY2UKKwkJCQkJCQk9IFNFUV9QUk9QRVJUSUVTOworCisJCQkJfSBlbHNlIGlmIChzLT5sem1hMi5uZWVkX3Byb3BzKSB7CisJCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQkJfSBlbHNlIHsKKwkJCQkJcy0+bHptYTIubmV4dF9zZXF1ZW5jZQorCQkJCQkJCT0gU0VRX0xaTUFfUFJFUEFSRTsKKwkJCQkJaWYgKHRtcCA+PSAweEEwKQorCQkJCQkJbHptYV9yZXNldChzKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICh0bXAgPT0gMHgwMCkKKwkJCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisKKwkJCQlpZiAodG1wID4gMHgwMikKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT01QUkVTU0VEXzA7CisJCQkJcy0+bHptYTIubmV4dF9zZXF1ZW5jZSA9IFNFUV9DT1BZOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFNFUV9VTkNPTVBSRVNTRURfMToKKwkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZAorCQkJCQkrPSAodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zKytdIDw8IDg7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9VTkNPTVBSRVNTRURfMjsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1VOQ09NUFJFU1NFRF8yOgorCQkJcy0+bHptYTIudW5jb21wcmVzc2VkCisJCQkJCSs9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gKyAxOworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09NUFJFU1NFRF8wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQ09NUFJFU1NFRF8wOgorCQkJcy0+bHptYTIuY29tcHJlc3NlZAorCQkJCQk9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gPDwgODsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTVBSRVNTRURfMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0NPTVBSRVNTRURfMToKKwkJCXMtPmx6bWEyLmNvbXByZXNzZWQKKwkJCQkJKz0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSArIDE7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IHMtPmx6bWEyLm5leHRfc2VxdWVuY2U7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9QUk9QRVJUSUVTOgorCQkJaWYgKCFsem1hX3Byb3BzKHMsIGItPmluW2ItPmluX3BvcysrXSkpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0xaTUFfUFJFUEFSRTsKKworCQljYXNlIFNFUV9MWk1BX1BSRVBBUkU6CisJCQlpZiAocy0+bHptYTIuY29tcHJlc3NlZCA8IFJDX0lOSVRfQllURVMpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCWlmICghcmNfcmVhZF9pbml0KCZzLT5yYywgYikpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQlzLT5sem1hMi5jb21wcmVzc2VkIC09IFJDX0lOSVRfQllURVM7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9MWk1BX1JVTjsKKworCQljYXNlIFNFUV9MWk1BX1JVTjoKKwkJCS8qCisJCQkgKiBTZXQgZGljdGlvbmFyeSBsaW1pdCB0byBpbmRpY2F0ZSBob3cgbXVjaCB3ZSB3YW50CisJCQkgKiB0byBiZSBlbmNvZGVkIGF0IG1heGltdW0uIERlY29kZSBuZXcgZGF0YSBpbnRvIHRoZQorCQkJICogZGljdGlvbmFyeS4gRmx1c2ggdGhlIG5ldyBkYXRhIGZyb20gZGljdGlvbmFyeSB0bworCQkJICogYi0+b3V0LiBDaGVjayBpZiB3ZSBmaW5pc2hlZCBkZWNvZGluZyB0aGlzIGNodW5rLgorCQkJICogSW4gY2FzZSB0aGUgZGljdGlvbmFyeSBnb3QgZnVsbCBidXQgd2UgZGlkbid0IGZpbGwKKwkJCSAqIHRoZSBvdXRwdXQgYnVmZmVyIHlldCwgd2UgbWF5IHJ1biB0aGlzIGxvb3AKKwkJCSAqIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgY2hhbmdpbmcgcy0+bHptYTIuc2VxdWVuY2UuCisJCQkgKi8KKwkJCWRpY3RfbGltaXQoJnMtPmRpY3QsIG1pbl90KHNpemVfdCwKKwkJCQkJYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zLAorCQkJCQlzLT5sem1hMi51bmNvbXByZXNzZWQpKTsKKwkJCWlmICghbHptYTJfbHptYShzLCBiKSkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+bHptYTIudW5jb21wcmVzc2VkIC09IGRpY3RfZmx1c2goJnMtPmRpY3QsIGIpOworCisJCQlpZiAocy0+bHptYTIudW5jb21wcmVzc2VkID09IDApIHsKKwkJCQlpZiAocy0+bHptYTIuY29tcHJlc3NlZCA+IDAgfHwgcy0+bHptYS5sZW4gPiAwCisJCQkJCQl8fCAhcmNfaXNfZmluaXNoZWQoJnMtPnJjKSkKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQlyY19yZXNldCgmcy0+cmMpOworCQkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTlRST0w7CisKKwkJCX0gZWxzZSBpZiAoYi0+b3V0X3BvcyA9PSBiLT5vdXRfc2l6ZQorCQkJCQl8fCAoYi0+aW5fcG9zID09IGItPmluX3NpemUKKwkJCQkJCSYmIHMtPnRlbXAuc2l6ZQorCQkJCQkJPCBzLT5sem1hMi5jb21wcmVzc2VkKSkgeworCQkJCXJldHVybiBYWl9PSzsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQ09QWToKKwkJCWRpY3RfdW5jb21wcmVzc2VkKCZzLT5kaWN0LCBiLCAmcy0+bHptYTIuY29tcHJlc3NlZCk7CisJCQlpZiAocy0+bHptYTIuY29tcHJlc3NlZCA+IDApCisJCQkJcmV0dXJuIFhaX09LOworCisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT05UUk9MOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gWFpfT0s7Cit9CisKK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjX2x6bWEyICogWFpfRlVOQyB4el9kZWNfbHptYTJfY3JlYXRlKAorCQllbnVtIHh6X21vZGUgbW9kZSwgdWludDMyX3QgZGljdF9tYXgpCit7CisJc3RydWN0IHh6X2RlY19sem1hMiAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzLT5kaWN0Lm1vZGUgPSBtb2RlOworCXMtPmRpY3Quc2l6ZV9tYXggPSBkaWN0X21heDsKKworCWlmIChERUNfSVNfUFJFQUxMT0MobW9kZSkpIHsKKwkJcy0+ZGljdC5idWYgPSB2bWFsbG9jKGRpY3RfbWF4KTsKKwkJaWYgKHMtPmRpY3QuYnVmID09IE5VTEwpIHsKKwkJCWtmcmVlKHMpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgaWYgKERFQ19JU19EWU5BTExPQyhtb2RlKSkgeworCQlzLT5kaWN0LmJ1ZiA9IE5VTEw7CisJCXMtPmRpY3QuYWxsb2NhdGVkID0gMDsKKwl9CisKKwlyZXR1cm4gczsKK30KKworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2x6bWEyX3Jlc2V0KAorCQlzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50OF90IHByb3BzKQoreworCS8qIFRoaXMgbGltaXRzIGRpY3Rpb25hcnkgc2l6ZSB0byAzIEdpQiB0byBrZWVwIHBhcnNpbmcgc2ltcGxlci4gKi8KKwlpZiAocHJvcHMgPiAzOSkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwlzLT5kaWN0LnNpemUgPSAyICsgKHByb3BzICYgMSk7CisJcy0+ZGljdC5zaXplIDw8PSAocHJvcHMgPj4gMSkgKyAxMTsKKworCWlmIChERUNfSVNfTVVMVEkocy0+ZGljdC5tb2RlKSkgeworCQlpZiAocy0+ZGljdC5zaXplID4gcy0+ZGljdC5zaXplX21heCkKKwkJCXJldHVybiBYWl9NRU1MSU1JVF9FUlJPUjsKKworCQlzLT5kaWN0LmVuZCA9IHMtPmRpY3Quc2l6ZTsKKworCQlpZiAoREVDX0lTX0RZTkFMTE9DKHMtPmRpY3QubW9kZSkpIHsKKwkJCWlmIChzLT5kaWN0LmFsbG9jYXRlZCA8IHMtPmRpY3Quc2l6ZSkgeworCQkJCXZmcmVlKHMtPmRpY3QuYnVmKTsKKwkJCQlzLT5kaWN0LmJ1ZiA9IHZtYWxsb2Mocy0+ZGljdC5zaXplKTsKKwkJCQlpZiAocy0+ZGljdC5idWYgPT0gTlVMTCkgeworCQkJCQlzLT5kaWN0LmFsbG9jYXRlZCA9IDA7CisJCQkJCXJldHVybiBYWl9NRU1fRVJST1I7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcy0+bHptYS5sZW4gPSAwOworCisJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09OVFJPTDsKKwlzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQgPSB0cnVlOworCisJcy0+dGVtcC5zaXplID0gMDsKKworCXJldHVybiBYWl9PSzsKK30KKworWFpfRVhURVJOIHZvaWQgWFpfRlVOQyB4el9kZWNfbHptYTJfZW5kKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpCit7CisJaWYgKERFQ19JU19NVUxUSShzLT5kaWN0Lm1vZGUpKQorCQl2ZnJlZShzLT5kaWN0LmJ1Zik7CisKKwlrZnJlZShzKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfc3RyZWFtLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX3N0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkY2JmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX3N0cmVhbS5jCkBAIC0wLDAgKzEsODIyIEBACisvKgorICogLnh6IFN0cmVhbSBkZWNvZGVyCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisjaW5jbHVkZSAieHpfc3RyZWFtLmgiCisKKy8qIEhhc2ggdXNlZCB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQgKi8KK3N0cnVjdCB4el9kZWNfaGFzaCB7CisJdmxpX3R5cGUgdW5wYWRkZWQ7CisJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCXVpbnQzMl90IGNyYzMyOworfTsKKworc3RydWN0IHh6X2RlYyB7CisJLyogUG9zaXRpb24gaW4gZGVjX21haW4oKSAqLworCWVudW0geworCQlTRVFfU1RSRUFNX0hFQURFUiwKKwkJU0VRX0JMT0NLX1NUQVJULAorCQlTRVFfQkxPQ0tfSEVBREVSLAorCQlTRVFfQkxPQ0tfVU5DT01QUkVTUywKKwkJU0VRX0JMT0NLX1BBRERJTkcsCisJCVNFUV9CTE9DS19DSEVDSywKKwkJU0VRX0lOREVYLAorCQlTRVFfSU5ERVhfUEFERElORywKKwkJU0VRX0lOREVYX0NSQzMyLAorCQlTRVFfU1RSRUFNX0ZPT1RFUgorCX0gc2VxdWVuY2U7CisKKwkvKiBQb3NpdGlvbiBpbiB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMgYW5kIENoZWNrIGZpZWxkcyAqLworCXVpbnQzMl90IHBvczsKKworCS8qIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGRlY29kZWQgYnkgZGVjX3ZsaSgpICovCisJdmxpX3R5cGUgdmxpOworCisJLyogU2F2ZWQgaW5fcG9zIGFuZCBvdXRfcG9zICovCisJc2l6ZV90IGluX3N0YXJ0OworCXNpemVfdCBvdXRfc3RhcnQ7CisKKwkvKiBDUkMzMiB2YWx1ZSBpbiBCbG9jayBvciBJbmRleCAqLworCXVpbnQzMl90IGNyYzMyOworCisJLyogVHlwZSBvZiB0aGUgaW50ZWdyaXR5IGNoZWNrIGNhbGN1bGF0ZWQgZnJvbSB1bmNvbXByZXNzZWQgZGF0YSAqLworCWVudW0geHpfY2hlY2sgY2hlY2tfdHlwZTsKKworCS8qIE9wZXJhdGlvbiBtb2RlICovCisJZW51bSB4el9tb2RlIG1vZGU7CisKKwkvKgorCSAqIFRydWUgaWYgdGhlIG5leHQgY2FsbCB0byB4el9kZWNfcnVuKCkgaXMgYWxsb3dlZCB0byByZXR1cm4KKwkgKiBYWl9CVUZfRVJST1IuCisJICovCisJYm9vbCBhbGxvd19idWZfZXJyb3I7CisKKwkvKiBJbmZvcm1hdGlvbiBzdG9yZWQgaW4gQmxvY2sgSGVhZGVyICovCisJc3RydWN0IHsKKwkJLyoKKwkJICogVmFsdWUgc3RvcmVkIGluIHRoZSBDb21wcmVzc2VkIFNpemUgZmllbGQsIG9yCisJCSAqIFZMSV9VTktOT1dOIGlmIENvbXByZXNzZWQgU2l6ZSBpcyBub3QgcHJlc2VudC4KKwkJICovCisJCXZsaV90eXBlIGNvbXByZXNzZWQ7CisKKwkJLyoKKwkJICogVmFsdWUgc3RvcmVkIGluIHRoZSBVbmNvbXByZXNzZWQgU2l6ZSBmaWVsZCwgb3IKKwkJICogVkxJX1VOS05PV04gaWYgVW5jb21wcmVzc2VkIFNpemUgaXMgbm90IHByZXNlbnQuCisJCSAqLworCQl2bGlfdHlwZSB1bmNvbXByZXNzZWQ7CisKKwkJLyogU2l6ZSBvZiB0aGUgQmxvY2sgSGVhZGVyIGZpZWxkICovCisJCXVpbnQzMl90IHNpemU7CisJfSBibG9ja19oZWFkZXI7CisKKwkvKiBJbmZvcm1hdGlvbiBjb2xsZWN0ZWQgd2hlbiBkZWNvZGluZyBCbG9ja3MgKi8KKwlzdHJ1Y3QgeworCQkvKiBPYnNlcnZlZCBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGN1cnJlbnQgQmxvY2sgKi8KKwkJdmxpX3R5cGUgY29tcHJlc3NlZDsKKworCQkvKiBPYnNlcnZlZCB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgY3VycmVudCBCbG9jayAqLworCQl2bGlfdHlwZSB1bmNvbXByZXNzZWQ7CisKKwkJLyogTnVtYmVyIG9mIEJsb2NrcyBkZWNvZGVkIHNvIGZhciAqLworCQl2bGlfdHlwZSBjb3VudDsKKworCQkvKgorCQkgKiBIYXNoIGNhbGN1bGF0ZWQgZnJvbSB0aGUgQmxvY2sgc2l6ZXMuIFRoaXMgaXMgdXNlZCB0bworCQkgKiB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuCisJCSAqLworCQlzdHJ1Y3QgeHpfZGVjX2hhc2ggaGFzaDsKKwl9IGJsb2NrOworCisJLyogVmFyaWFibGVzIG5lZWRlZCB3aGVuIHZlcmlmeWluZyB0aGUgSW5kZXggZmllbGQgKi8KKwlzdHJ1Y3QgeworCQkvKiBQb3NpdGlvbiBpbiBkZWNfaW5kZXgoKSAqLworCQllbnVtIHsKKwkJCVNFUV9JTkRFWF9DT1VOVCwKKwkJCVNFUV9JTkRFWF9VTlBBRERFRCwKKwkJCVNFUV9JTkRFWF9VTkNPTVBSRVNTRUQKKwkJfSBzZXF1ZW5jZTsKKworCQkvKiBTaXplIG9mIHRoZSBJbmRleCBpbiBieXRlcyAqLworCQl2bGlfdHlwZSBzaXplOworCisJCS8qIE51bWJlciBvZiBSZWNvcmRzIChtYXRjaGVzIGJsb2NrLmNvdW50IGluIHZhbGlkIGZpbGVzKSAqLworCQl2bGlfdHlwZSBjb3VudDsKKworCQkvKgorCQkgKiBIYXNoIGNhbGN1bGF0ZWQgZnJvbSB0aGUgUmVjb3JkcyAobWF0Y2hlcyBibG9jay5oYXNoIGluCisJCSAqIHZhbGlkIGZpbGVzKS4KKwkJICovCisJCXN0cnVjdCB4el9kZWNfaGFzaCBoYXNoOworCX0gaW5kZXg7CisKKwkvKgorCSAqIFRlbXBvcmFyeSBidWZmZXIgbmVlZGVkIHRvIGhvbGQgU3RyZWFtIEhlYWRlciwgQmxvY2sgSGVhZGVyLAorCSAqIGFuZCBTdHJlYW0gRm9vdGVyLiBUaGUgQmxvY2sgSGVhZGVyIGlzIHRoZSBiaWdnZXN0ICgxIEtpQikKKwkgKiBzbyB3ZSByZXNlcnZlIHNwYWNlIGFjY29yZGluZyB0byB0aGF0LiBidWZbXSBoYXMgdG8gYmUgYWxpZ25lZAorCSAqIHRvIGEgbXVsdGlwbGUgb2YgZm91ciBieXRlczsgdGhlIHNpemVfdCB2YXJpYWJsZXMgYmVmb3JlIGl0CisJICogc2hvdWxkIGd1YXJhbnRlZSB0aGlzLgorCSAqLworCXN0cnVjdCB7CisJCXNpemVfdCBwb3M7CisJCXNpemVfdCBzaXplOworCQl1aW50OF90IGJ1ZlsxMDI0XTsKKwl9IHRlbXA7CisKKwlzdHJ1Y3QgeHpfZGVjX2x6bWEyICpsem1hMjsKKworI2lmZGVmIFhaX0RFQ19CQ0oKKwlzdHJ1Y3QgeHpfZGVjX2JjaiAqYmNqOworCWJvb2wgYmNqX2FjdGl2ZTsKKyNlbmRpZgorfTsKKworI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKy8qIFNpemVzIG9mIHRoZSBDaGVjayBmaWVsZCB3aXRoIGRpZmZlcmVudCBDaGVjayBJRHMgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGNoZWNrX3NpemVzWzE2XSA9IHsKKwkwLAorCTQsIDQsIDQsCisJOCwgOCwgOCwKKwkxNiwgMTYsIDE2LAorCTMyLCAzMiwgMzIsCisJNjQsIDY0LCA2NAorfTsKKyNlbmRpZgorCisvKgorICogRmlsbCBzLT50ZW1wIGJ5IGNvcHlpbmcgZGF0YSBzdGFydGluZyBmcm9tIGItPmluW2ItPmluX3Bvc10uIENhbGxlcgorICogbXVzdCBoYXZlIHNldCBzLT50ZW1wLnBvcyB0byBpbmRpY2F0ZSBob3cgbXVjaCBkYXRhIHdlIGFyZSBzdXBwb3NlZAorICogdG8gY29weSBpbnRvIHMtPnRlbXAuYnVmLiBSZXR1cm4gdHJ1ZSBvbmNlIHMtPnRlbXAucG9zIGhhcyByZWFjaGVkCisgKiBzLT50ZW1wLnNpemUuCisgKi8KK3N0YXRpYyBib29sIFhaX0ZVTkMgZmlsbF90ZW1wKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwKKwkJCWItPmluX3NpemUgLSBiLT5pbl9wb3MsIHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zKTsKKworCW1lbWNweShzLT50ZW1wLmJ1ZiArIHMtPnRlbXAucG9zLCBiLT5pbiArIGItPmluX3BvcywgY29weV9zaXplKTsKKwliLT5pbl9wb3MgKz0gY29weV9zaXplOworCXMtPnRlbXAucG9zICs9IGNvcHlfc2l6ZTsKKworCWlmIChzLT50ZW1wLnBvcyA9PSBzLT50ZW1wLnNpemUpIHsKKwkJcy0+dGVtcC5wb3MgPSAwOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIERlY29kZSBhIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIChsaXR0bGUtZW5kaWFuIGJhc2UtMTI4IGVuY29kaW5nKSAqLworc3RhdGljIGVudW0geHpfcmV0IFhaX0ZVTkMgZGVjX3ZsaShzdHJ1Y3QgeHpfZGVjICpzLAorCQljb25zdCB1aW50OF90ICppbiwgc2l6ZV90ICppbl9wb3MsIHNpemVfdCBpbl9zaXplKQoreworCXVpbnQ4X3QgYnl0ZTsKKworCWlmIChzLT5wb3MgPT0gMCkKKwkJcy0+dmxpID0gMDsKKworCXdoaWxlICgqaW5fcG9zIDwgaW5fc2l6ZSkgeworCQlieXRlID0gaW5bKmluX3Bvc107CisJCSsrKmluX3BvczsKKworCQlzLT52bGkgfD0gKHZsaV90eXBlKShieXRlICYgMHg3RikgPDwgcy0+cG9zOworCisJCWlmICgoYnl0ZSAmIDB4ODApID09IDApIHsKKwkJCS8qIERvbid0IGFsbG93IG5vbi1taW5pbWFsIGVuY29kaW5ncy4gKi8KKwkJCWlmIChieXRlID09IDAgJiYgcy0+cG9zICE9IDApCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPnBvcyA9IDA7CisJCQlyZXR1cm4gWFpfU1RSRUFNX0VORDsKKwkJfQorCisJCXMtPnBvcyArPSA3OworCQlpZiAocy0+cG9zID09IDcgKiBWTElfQllURVNfTUFYKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJfQorCisJcmV0dXJuIFhaX09LOworfQorCisvKgorICogRGVjb2RlIHRoZSBDb21wcmVzc2VkIERhdGEgZmllbGQgZnJvbSBhIEJsb2NrLiBVcGRhdGUgYW5kIHZhbGlkYXRlCisgKiB0aGUgb2JzZXJ2ZWQgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIHNpemVzIG9mIHRoZSBCbG9jayBzbyB0aGF0CisgKiB0aGV5IGRvbid0IGV4Y2VlZCB0aGUgdmFsdWVzIHBvc3NpYmx5IHN0b3JlZCBpbiB0aGUgQmxvY2sgSGVhZGVyCisgKiAodmFsaWRhdGlvbiBhc3N1bWVzIHRoYXQgbm8gaW50ZWdlciBvdmVyZmxvdyBvY2N1cnMsIHNpbmNlIHZsaV90eXBlCisgKiBpcyBub3JtYWxseSB1aW50NjRfdCkuIFVwZGF0ZSB0aGUgQ1JDMzIgaWYgcHJlc2VuY2Ugb2YgdGhlIENSQzMyCisgKiBmaWVsZCB3YXMgaW5kaWNhdGVkIGluIFN0cmVhbSBIZWFkZXIuCisgKgorICogT25jZSB0aGUgZGVjb2RpbmcgaXMgZmluaXNoZWQsIHZhbGlkYXRlIHRoYXQgdGhlIG9ic2VydmVkIHNpemVzIG1hdGNoCisgKiB0aGUgc2l6ZXMgcG9zc2libHkgc3RvcmVkIGluIHRoZSBCbG9jayBIZWFkZXIuIFVwZGF0ZSB0aGUgaGFzaCBhbmQKKyAqIEJsb2NrIGNvdW50LCB3aGljaCBhcmUgbGF0ZXIgdXNlZCB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuCisgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBYWl9GVU5DIGRlY19ibG9jayhzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCWVudW0geHpfcmV0IHJldDsKKworCXMtPmluX3N0YXJ0ID0gYi0+aW5fcG9zOworCXMtPm91dF9zdGFydCA9IGItPm91dF9wb3M7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJaWYgKHMtPmJjal9hY3RpdmUpCisJCXJldCA9IHh6X2RlY19iY2pfcnVuKHMtPmJjaiwgcy0+bHptYTIsIGIpOworCWVsc2UKKyNlbmRpZgorCQlyZXQgPSB4el9kZWNfbHptYTJfcnVuKHMtPmx6bWEyLCBiKTsKKworCXMtPmJsb2NrLmNvbXByZXNzZWQgKz0gYi0+aW5fcG9zIC0gcy0+aW5fc3RhcnQ7CisJcy0+YmxvY2sudW5jb21wcmVzc2VkICs9IGItPm91dF9wb3MgLSBzLT5vdXRfc3RhcnQ7CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VwYXJhdGVseSBjaGVjayBmb3IgVkxJX1VOS05PV04sIHNpbmNlCisJICogdGhlIG9ic2VydmVkIHNpemVzIGFyZSBhbHdheXMgc21hbGxlciB0aGFuIFZMSV9VTktOT1dOLgorCSAqLworCWlmIChzLT5ibG9jay5jb21wcmVzc2VkID4gcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQKKwkJCXx8IHMtPmJsb2NrLnVuY29tcHJlc3NlZAorCQkJCT4gcy0+YmxvY2tfaGVhZGVyLnVuY29tcHJlc3NlZCkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlpZiAocy0+Y2hlY2tfdHlwZSA9PSBYWl9DSEVDS19DUkMzMikKKwkJcy0+Y3JjMzIgPSB4el9jcmMzMihiLT5vdXQgKyBzLT5vdXRfc3RhcnQsCisJCQkJYi0+b3V0X3BvcyAtIHMtPm91dF9zdGFydCwgcy0+Y3JjMzIpOworCisJaWYgKHJldCA9PSBYWl9TVFJFQU1fRU5EKSB7CisJCWlmIChzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZCAhPSBWTElfVU5LTk9XTgorCQkJCSYmIHMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkCisJCQkJCSE9IHMtPmJsb2NrLmNvbXByZXNzZWQpCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlpZiAocy0+YmxvY2tfaGVhZGVyLnVuY29tcHJlc3NlZCAhPSBWTElfVU5LTk9XTgorCQkJCSYmIHMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQKKwkJCQkJIT0gcy0+YmxvY2sudW5jb21wcmVzc2VkKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+YmxvY2suaGFzaC51bnBhZGRlZCArPSBzLT5ibG9ja19oZWFkZXIuc2l6ZQorCQkJCSsgcy0+YmxvY2suY29tcHJlc3NlZDsKKworI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKwkJcy0+YmxvY2suaGFzaC51bnBhZGRlZCArPSBjaGVja19zaXplc1tzLT5jaGVja190eXBlXTsKKyNlbHNlCisJCWlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzMyKQorCQkJcy0+YmxvY2suaGFzaC51bnBhZGRlZCArPSA0OworI2VuZGlmCisKKwkJcy0+YmxvY2suaGFzaC51bmNvbXByZXNzZWQgKz0gcy0+YmxvY2sudW5jb21wcmVzc2VkOworCQlzLT5ibG9jay5oYXNoLmNyYzMyID0geHpfY3JjMzIoCisJCQkJKGNvbnN0IHVpbnQ4X3QgKikmcy0+YmxvY2suaGFzaCwKKwkJCQlzaXplb2Yocy0+YmxvY2suaGFzaCksIHMtPmJsb2NrLmhhc2guY3JjMzIpOworCisJCSsrcy0+YmxvY2suY291bnQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogVXBkYXRlIHRoZSBJbmRleCBzaXplIGFuZCB0aGUgQ1JDMzIgdmFsdWUuICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGluZGV4X3VwZGF0ZShzdHJ1Y3QgeHpfZGVjICpzLCBjb25zdCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBpbl91c2VkID0gYi0+aW5fcG9zIC0gcy0+aW5fc3RhcnQ7CisJcy0+aW5kZXguc2l6ZSArPSBpbl91c2VkOworCXMtPmNyYzMyID0geHpfY3JjMzIoYi0+aW4gKyBzLT5pbl9zdGFydCwgaW5fdXNlZCwgcy0+Y3JjMzIpOworfQorCisvKgorICogRGVjb2RlIHRoZSBOdW1iZXIgb2YgUmVjb3JkcywgVW5wYWRkZWQgU2l6ZSwgYW5kIFVuY29tcHJlc3NlZCBTaXplCisgKiBmaWVsZHMgZnJvbSB0aGUgSW5kZXggZmllbGQuIFRoYXQgaXMsIEluZGV4IFBhZGRpbmcgYW5kIENSQzMyIGFyZSBub3QKKyAqIGRlY29kZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGNhbiByZXR1cm4gWFpfT0sgKG1vcmUgaW5wdXQgbmVlZGVkKSwgWFpfU1RSRUFNX0VORCAoZXZlcnl0aGluZworICogc3VjY2Vzc2Z1bGx5IGRlY29kZWQpLCBvciBYWl9EQVRBX0VSUk9SIChpbnB1dCBpcyBjb3JydXB0KS4KKyAqLworc3RhdGljIGVudW0geHpfcmV0IFhaX0ZVTkMgZGVjX2luZGV4KHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJZG8geworCQlyZXQgPSBkZWNfdmxpKHMsIGItPmluLCAmYi0+aW5fcG9zLCBiLT5pbl9zaXplKTsKKwkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKSB7CisJCQlpbmRleF91cGRhdGUocywgYik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJc3dpdGNoIChzLT5pbmRleC5zZXF1ZW5jZSkgeworCQljYXNlIFNFUV9JTkRFWF9DT1VOVDoKKwkJCXMtPmluZGV4LmNvdW50ID0gcy0+dmxpOworCisJCQkvKgorCQkJICogVmFsaWRhdGUgdGhhdCB0aGUgTnVtYmVyIG9mIFJlY29yZHMgZmllbGQKKwkJCSAqIGluZGljYXRlcyB0aGUgc2FtZSBudW1iZXIgb2YgUmVjb3JkcyBhcworCQkJICogdGhlcmUgd2VyZSBCbG9ja3MgaW4gdGhlIFN0cmVhbS4KKwkJCSAqLworCQkJaWYgKHMtPmluZGV4LmNvdW50ICE9IHMtPmJsb2NrLmNvdW50KQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5pbmRleC5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9VTlBBRERFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0lOREVYX1VOUEFEREVEOgorCQkJcy0+aW5kZXguaGFzaC51bnBhZGRlZCArPSBzLT52bGk7CisJCQlzLT5pbmRleC5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9VTkNPTVBSRVNTRUQ7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9JTkRFWF9VTkNPTVBSRVNTRUQ6CisJCQlzLT5pbmRleC5oYXNoLnVuY29tcHJlc3NlZCArPSBzLT52bGk7CisJCQlzLT5pbmRleC5oYXNoLmNyYzMyID0geHpfY3JjMzIoCisJCQkJCShjb25zdCB1aW50OF90ICopJnMtPmluZGV4Lmhhc2gsCisJCQkJCXNpemVvZihzLT5pbmRleC5oYXNoKSwKKwkJCQkJcy0+aW5kZXguaGFzaC5jcmMzMik7CisJCQktLXMtPmluZGV4LmNvdW50OworCQkJcy0+aW5kZXguc2VxdWVuY2UgPSBTRVFfSU5ERVhfVU5QQURERUQ7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHMtPmluZGV4LmNvdW50ID4gMCk7CisKKwlyZXR1cm4gWFpfU1RSRUFNX0VORDsKK30KKworLyoKKyAqIFZhbGlkYXRlIHRoYXQgdGhlIG5leHQgZm91ciBpbnB1dCBieXRlcyBtYXRjaCB0aGUgdmFsdWUgb2Ygcy0+Y3JjMzIuCisgKiBzLT5wb3MgbXVzdCBiZSB6ZXJvIHdoZW4gc3RhcnRpbmcgdG8gdmFsaWRhdGUgdGhlIGZpcnN0IGJ5dGUuCisgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBYWl9GVU5DIGNyYzMyX3ZhbGlkYXRlKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZG8geworCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisJCQlyZXR1cm4gWFpfT0s7CisKKwkJaWYgKCgocy0+Y3JjMzIgPj4gcy0+cG9zKSAmIDB4RkYpICE9IGItPmluW2ItPmluX3BvcysrXSkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCXMtPnBvcyArPSA4OworCisJfSB3aGlsZSAocy0+cG9zIDwgMzIpOworCisJcy0+Y3JjMzIgPSAwOworCXMtPnBvcyA9IDA7CisKKwlyZXR1cm4gWFpfU1RSRUFNX0VORDsKK30KKworI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKy8qCisgKiBTa2lwIG92ZXIgdGhlIENoZWNrIGZpZWxkIHdoZW4gdGhlIENoZWNrIElEIGlzIG5vdCBzdXBwb3J0ZWQuCisgKiBSZXR1cm5zIHRydWUgb25jZSB0aGUgd2hvbGUgQ2hlY2sgZmllbGQgaGFzIGJlZW4gc2tpcHBlZCBvdmVyLgorICovCitzdGF0aWMgYm9vbCBYWl9GVU5DIGNoZWNrX3NraXAoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwl3aGlsZSAocy0+cG9zIDwgY2hlY2tfc2l6ZXNbcy0+Y2hlY2tfdHlwZV0pIHsKKwkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJcmV0dXJuIGZhbHNlOworCisJCSsrYi0+aW5fcG9zOworCQkrK3MtPnBvczsKKwl9CisKKwlzLT5wb3MgPSAwOworCisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworLyogRGVjb2RlIHRoZSBTdHJlYW0gSGVhZGVyIGZpZWxkICh0aGUgZmlyc3QgMTIgYnl0ZXMgb2YgdGhlIC54eiBTdHJlYW0pLiAqLworc3RhdGljIGVudW0geHpfcmV0IFhaX0ZVTkMgZGVjX3N0cmVhbV9oZWFkZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKwlpZiAoIW1lbWVxKHMtPnRlbXAuYnVmLCBIRUFERVJfTUFHSUMsIEhFQURFUl9NQUdJQ19TSVpFKSkKKwkJcmV0dXJuIFhaX0ZPUk1BVF9FUlJPUjsKKworCWlmICh4el9jcmMzMihzLT50ZW1wLmJ1ZiArIEhFQURFUl9NQUdJQ19TSVpFLCAyLCAwKQorCQkJIT0gZ2V0X2xlMzIocy0+dGVtcC5idWYgKyBIRUFERVJfTUFHSUNfU0laRSArIDIpKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmIChzLT50ZW1wLmJ1ZltIRUFERVJfTUFHSUNfU0laRV0gIT0gMCkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKgorCSAqIE9mIGludGVncml0eSBjaGVja3MsIHdlIHN1cHBvcnQgb25seSBub25lIChDaGVjayBJRCA9IDApIGFuZAorCSAqIENSQzMyIChDaGVjayBJRCA9IDEpLiBIb3dldmVyLCBpZiBYWl9ERUNfQU5ZX0NIRUNLIGlzIGRlZmluZWQsCisJICogd2Ugd2lsbCBhY2NlcHQgb3RoZXIgY2hlY2sgdHlwZXMgdG9vLCBidXQgdGhlbiB0aGUgY2hlY2sgd29uJ3QKKwkgKiBiZSB2ZXJpZmllZCBhbmQgYSB3YXJuaW5nIChYWl9VTlNVUFBPUlRFRF9DSEVDSykgd2lsbCBiZSBnaXZlbi4KKwkgKi8KKwlzLT5jaGVja190eXBlID0gcy0+dGVtcC5idWZbSEVBREVSX01BR0lDX1NJWkUgKyAxXTsKKworI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKwlpZiAocy0+Y2hlY2tfdHlwZSA+IFhaX0NIRUNLX01BWCkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwlpZiAocy0+Y2hlY2tfdHlwZSA+IFhaX0NIRUNLX0NSQzMyKQorCQlyZXR1cm4gWFpfVU5TVVBQT1JURURfQ0hFQ0s7CisjZWxzZQorCWlmIChzLT5jaGVja190eXBlID4gWFpfQ0hFQ0tfQ1JDMzIpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworI2VuZGlmCisKKwlyZXR1cm4gWFpfT0s7Cit9CisKKy8qIERlY29kZSB0aGUgU3RyZWFtIEZvb3RlciBmaWVsZCAodGhlIGxhc3QgMTIgYnl0ZXMgb2YgdGhlIC54eiBTdHJlYW0pICovCitzdGF0aWMgZW51bSB4el9yZXQgWFpfRlVOQyBkZWNfc3RyZWFtX2Zvb3RlcihzdHJ1Y3QgeHpfZGVjICpzKQoreworCWlmICghbWVtZXEocy0+dGVtcC5idWYgKyAxMCwgRk9PVEVSX01BR0lDLCBGT09URVJfTUFHSUNfU0laRSkpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJaWYgKHh6X2NyYzMyKHMtPnRlbXAuYnVmICsgNCwgNiwgMCkgIT0gZ2V0X2xlMzIocy0+dGVtcC5idWYpKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCS8qCisJICogVmFsaWRhdGUgQmFja3dhcmQgU2l6ZS4gTm90ZSB0aGF0IHdlIG5ldmVyIGFkZGVkIHRoZSBzaXplIG9mIHRoZQorCSAqIEluZGV4IENSQzMyIGZpZWxkIHRvIHMtPmluZGV4LnNpemUsIHRodXMgd2UgdXNlIHMtPmluZGV4LnNpemUgLyA0CisJICogaW5zdGVhZCBvZiBzLT5pbmRleC5zaXplIC8gNCAtIDEuCisJICovCisJaWYgKChzLT5pbmRleC5zaXplID4+IDIpICE9IGdldF9sZTMyKHMtPnRlbXAuYnVmICsgNCkpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJaWYgKHMtPnRlbXAuYnVmWzhdICE9IDAgfHwgcy0+dGVtcC5idWZbOV0gIT0gcy0+Y2hlY2tfdHlwZSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkvKgorCSAqIFVzZSBYWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWFpfT0sgdG8gYmUgbW9yZSBjb252ZW5pZW50CisJICogZm9yIHRoZSBjYWxsZXIuCisJICovCisJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7Cit9CisKKy8qIERlY29kZSB0aGUgQmxvY2sgSGVhZGVyIGFuZCBpbml0aWFsaXplIHRoZSBmaWx0ZXIgY2hhaW4uICovCitzdGF0aWMgZW51bSB4el9yZXQgWFpfRlVOQyBkZWNfYmxvY2tfaGVhZGVyKHN0cnVjdCB4el9kZWMgKnMpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgQ1JDMzIuIFdlIGtub3cgdGhhdCB0aGUgdGVtcCBidWZmZXIgaXMgYXQgbGVhc3QKKwkgKiBlaWdodCBieXRlcyBzbyB0aGlzIGlzIHNhZmUuCisJICovCisJcy0+dGVtcC5zaXplIC09IDQ7CisJaWYgKHh6X2NyYzMyKHMtPnRlbXAuYnVmLCBzLT50ZW1wLnNpemUsIDApCisJCQkhPSBnZXRfbGUzMihzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSkpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJcy0+dGVtcC5wb3MgPSAyOworCisJLyoKKwkgKiBDYXRjaCB1bnN1cHBvcnRlZCBCbG9jayBGbGFncy4gV2Ugc3VwcG9ydCBvbmx5IG9uZSBvciB0d28gZmlsdGVycworCSAqIGluIHRoZSBjaGFpbiwgc28gd2UgY2F0Y2ggdGhhdCB3aXRoIHRoZSBzYW1lIHRlc3QuCisJICovCisjaWZkZWYgWFpfREVDX0JDSgorCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4M0UpCisjZWxzZQorCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4M0YpCisjZW5kaWYKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKiBDb21wcmVzc2VkIFNpemUgKi8KKwlpZiAocy0+dGVtcC5idWZbMV0gJiAweDQwKSB7CisJCWlmIChkZWNfdmxpKHMsIHMtPnRlbXAuYnVmLCAmcy0+dGVtcC5wb3MsIHMtPnRlbXAuc2l6ZSkKKwkJCQkJIT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCXMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkID0gcy0+dmxpOworCX0gZWxzZSB7CisJCXMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkID0gVkxJX1VOS05PV047CisJfQorCisJLyogVW5jb21wcmVzc2VkIFNpemUgKi8KKwlpZiAocy0+dGVtcC5idWZbMV0gJiAweDgwKSB7CisJCWlmIChkZWNfdmxpKHMsIHMtPnRlbXAuYnVmLCAmcy0+dGVtcC5wb3MsIHMtPnRlbXAuc2l6ZSkKKwkJCQkhPSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+YmxvY2tfaGVhZGVyLnVuY29tcHJlc3NlZCA9IHMtPnZsaTsKKwl9IGVsc2UgeworCQlzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkID0gVkxJX1VOS05PV047CisJfQorCisjaWZkZWYgWFpfREVDX0JDSgorCS8qIElmIHRoZXJlIGFyZSB0d28gZmlsdGVycywgdGhlIGZpcnN0IG9uZSBtdXN0IGJlIGEgQkNKIGZpbHRlci4gKi8KKwlzLT5iY2pfYWN0aXZlID0gcy0+dGVtcC5idWZbMV0gJiAweDAxOworCWlmIChzLT5iY2pfYWN0aXZlKSB7CisJCWlmIChzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyA8IDIpCisJCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCQlyZXQgPSB4el9kZWNfYmNqX3Jlc2V0KHMtPmJjaiwgcy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10pOworCQlpZiAocmV0ICE9IFhaX09LKQorCQkJcmV0dXJuIHJldDsKKworCQkvKgorCQkgKiBXZSBkb24ndCBzdXBwb3J0IGN1c3RvbSBzdGFydCBvZmZzZXQsCisJCSAqIHNvIFNpemUgb2YgUHJvcGVydGllcyBtdXN0IGJlIHplcm8uCisJCSAqLworCQlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgwMCkKKwkJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCX0KKyNlbmRpZgorCisJLyogVmFsaWQgRmlsdGVyIEZsYWdzIGFsd2F5cyB0YWtlIGF0IGxlYXN0IHR3byBieXRlcy4gKi8KKwlpZiAocy0+dGVtcC5zaXplIC0gcy0+dGVtcC5wb3MgPCAyKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCS8qIEZpbHRlciBJRCA9IExaTUEyICovCisJaWYgKHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdICE9IDB4MjEpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJLyogU2l6ZSBvZiBQcm9wZXJ0aWVzID0gMS1ieXRlIEZpbHRlciBQcm9wZXJ0aWVzICovCisJaWYgKHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdICE9IDB4MDEpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJLyogRmlsdGVyIFByb3BlcnRpZXMgY29udGFpbnMgTFpNQTIgZGljdGlvbmFyeSBzaXplLiAqLworCWlmIChzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyA8IDEpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJcmV0ID0geHpfZGVjX2x6bWEyX3Jlc2V0KHMtPmx6bWEyLCBzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSk7CisJaWYgKHJldCAhPSBYWl9PSykKKwkJcmV0dXJuIHJldDsKKworCS8qIFRoZSByZXN0IG11c3QgYmUgSGVhZGVyIFBhZGRpbmcuICovCisJd2hpbGUgKHMtPnRlbXAucG9zIDwgcy0+dGVtcC5zaXplKQorCQlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgwMCkKKwkJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJcy0+dGVtcC5wb3MgPSAwOworCXMtPmJsb2NrLmNvbXByZXNzZWQgPSAwOworCXMtPmJsb2NrLnVuY29tcHJlc3NlZCA9IDA7CisKKwlyZXR1cm4gWFpfT0s7Cit9CisKK3N0YXRpYyBlbnVtIHh6X3JldCBYWl9GVU5DIGRlY19tYWluKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJLyoKKwkgKiBTdG9yZSB0aGUgc3RhcnQgcG9zaXRpb24gZm9yIHRoZSBjYXNlIHdoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUKKwkgKiBvZiB0aGUgSW5kZXggZmllbGQuCisJICovCisJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3M7CisKKwl3aGlsZSAodHJ1ZSkgeworCQlzd2l0Y2ggKHMtPnNlcXVlbmNlKSB7CisJCWNhc2UgU0VRX1NUUkVBTV9IRUFERVI6CisJCQkvKgorCQkJICogU3RyZWFtIEhlYWRlciBpcyBjb3BpZWQgdG8gcy0+dGVtcCwgYW5kIHRoZW4KKwkJCSAqIGRlY29kZWQgZnJvbSB0aGVyZS4gVGhpcyB3YXkgaWYgdGhlIGNhbGxlcgorCQkJICogZ2l2ZXMgdXMgb25seSBsaXR0bGUgaW5wdXQgYXQgYSB0aW1lLCB3ZSBjYW4KKwkJCSAqIHN0aWxsIGtlZXAgdGhlIFN0cmVhbSBIZWFkZXIgZGVjb2RpbmcgY29kZQorCQkJICogc2ltcGxlLiBTaW1pbGFyIGFwcHJvYWNoIGlzIHVzZWQgaW4gbWFueSBwbGFjZXMKKwkJCSAqIGluIHRoaXMgZmlsZS4KKwkJCSAqLworCQkJaWYgKCFmaWxsX3RlbXAocywgYikpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQkvKgorCQkJICogSWYgZGVjX3N0cmVhbV9oZWFkZXIoKSByZXR1cm5zCisJCQkgKiBYWl9VTlNVUFBPUlRFRF9DSEVDSywgaXQgaXMgc3RpbGwgcG9zc2libGUKKwkJCSAqIHRvIGNvbnRpbnVlIGRlY29kaW5nIGlmIHdvcmtpbmcgaW4gbXVsdGktY2FsbAorCQkJICogbW9kZS4gVGh1cywgdXBkYXRlIHMtPnNlcXVlbmNlIGJlZm9yZSBjYWxsaW5nCisJCQkgKiBkZWNfc3RyZWFtX2hlYWRlcigpLgorCQkJICovCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19TVEFSVDsKKworCQkJcmV0ID0gZGVjX3N0cmVhbV9oZWFkZXIocyk7CisJCQlpZiAocmV0ICE9IFhaX09LKQorCQkJCXJldHVybiByZXQ7CisKKwkJY2FzZSBTRVFfQkxPQ0tfU1RBUlQ6CisJCQkvKiBXZSBuZWVkIG9uZSBieXRlIG9mIGlucHV0IHRvIGNvbnRpbnVlLiAqLworCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJLyogU2VlIGlmIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgSW5kZXggZmllbGQuICovCisJCQlpZiAoYi0+aW5bYi0+aW5fcG9zXSA9PSAwKSB7CisJCQkJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3MrKzsKKwkJCQlzLT5zZXF1ZW5jZSA9IFNFUV9JTkRFWDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgQmxvY2sgSGVhZGVyIGFuZAorCQkJICogcHJlcGFyZSB0byBkZWNvZGUgaXQuCisJCQkgKi8KKwkJCXMtPmJsb2NrX2hlYWRlci5zaXplCisJCQkJPSAoKHVpbnQzMl90KWItPmluW2ItPmluX3Bvc10gKyAxKSAqIDQ7CisKKwkJCXMtPnRlbXAuc2l6ZSA9IHMtPmJsb2NrX2hlYWRlci5zaXplOworCQkJcy0+dGVtcC5wb3MgPSAwOworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfSEVBREVSOworCisJCWNhc2UgU0VRX0JMT0NLX0hFQURFUjoKKwkJCWlmICghZmlsbF90ZW1wKHMsIGIpKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJcmV0ID0gZGVjX2Jsb2NrX2hlYWRlcihzKTsKKwkJCWlmIChyZXQgIT0gWFpfT0spCisJCQkJcmV0dXJuIHJldDsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfVU5DT01QUkVTUzsKKworCQljYXNlIFNFUV9CTE9DS19VTkNPTVBSRVNTOgorCQkJcmV0ID0gZGVjX2Jsb2NrKHMsIGIpOworCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1BBRERJTkc7CisKKwkJY2FzZSBTRVFfQkxPQ0tfUEFERElORzoKKwkJCS8qCisJCQkgKiBTaXplIG9mIENvbXByZXNzZWQgRGF0YSArIEJsb2NrIFBhZGRpbmcKKwkJCSAqIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBmb3VyLiBXZSBkb24ndCBuZWVkCisJCQkgKiBzLT5ibG9jay5jb21wcmVzc2VkIGZvciBhbnl0aGluZyBlbHNlCisJCQkgKiBhbnltb3JlLCBzbyB3ZSB1c2UgaXQgaGVyZSB0byB0ZXN0IHRoZSBzaXplCisJCQkgKiBvZiB0aGUgQmxvY2sgUGFkZGluZyBmaWVsZC4KKwkJCSAqLworCQkJd2hpbGUgKHMtPmJsb2NrLmNvbXByZXNzZWQgJiAzKSB7CisJCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCQlpZiAoYi0+aW5bYi0+aW5fcG9zKytdICE9IDApCisJCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQkJKytzLT5ibG9jay5jb21wcmVzc2VkOworCQkJfQorCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19DSEVDSzsKKworCQljYXNlIFNFUV9CTE9DS19DSEVDSzoKKwkJCWlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzMyKSB7CisJCQkJcmV0ID0gY3JjMzJfdmFsaWRhdGUocywgYik7CisJCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKwkJCWVsc2UgaWYgKCFjaGVja19za2lwKHMsIGIpKSB7CisJCQkJcmV0dXJuIFhaX09LOworCQkJfQorI2VuZGlmCisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1NUQVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfSU5ERVg6CisJCQlyZXQgPSBkZWNfaW5kZXgocywgYik7CisJCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfSU5ERVhfUEFERElORzsKKworCQljYXNlIFNFUV9JTkRFWF9QQURESU5HOgorCQkJd2hpbGUgKChzLT5pbmRleC5zaXplICsgKGItPmluX3BvcyAtIHMtPmluX3N0YXJ0KSkKKwkJCQkJJiAzKSB7CisJCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKSB7CisJCQkJCWluZGV4X3VwZGF0ZShzLCBiKTsKKwkJCQkJcmV0dXJuIFhaX09LOworCQkJCX0KKworCQkJCWlmIChiLT5pbltiLT5pbl9wb3MrK10gIT0gMCkKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJCQl9CisKKwkJCS8qIEZpbmlzaCB0aGUgQ1JDMzIgdmFsdWUgYW5kIEluZGV4IHNpemUuICovCisJCQlpbmRleF91cGRhdGUocywgYik7CisKKwkJCS8qIENvbXBhcmUgdGhlIGhhc2hlcyB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuICovCisJCQlpZiAoIW1lbWVxKCZzLT5ibG9jay5oYXNoLCAmcy0+aW5kZXguaGFzaCwKKwkJCQkJc2l6ZW9mKHMtPmJsb2NrLmhhc2gpKSkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfSU5ERVhfQ1JDMzI7CisKKwkJY2FzZSBTRVFfSU5ERVhfQ1JDMzI6CisJCQlyZXQgPSBjcmMzMl92YWxpZGF0ZShzLCBiKTsKKwkJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlzLT50ZW1wLnNpemUgPSBTVFJFQU1fSEVBREVSX1NJWkU7CisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9TVFJFQU1fRk9PVEVSOworCisJCWNhc2UgU0VRX1NUUkVBTV9GT09URVI6CisJCQlpZiAoIWZpbGxfdGVtcChzLCBiKSkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCXJldHVybiBkZWNfc3RyZWFtX2Zvb3RlcihzKTsKKwkJfQorCX0KKworCS8qIE5ldmVyIHJlYWNoZWQgKi8KK30KKworLyoKKyAqIHh6X2RlY19ydW4oKSBpcyBhIHdyYXBwZXIgZm9yIGRlY19tYWluKCkgdG8gaGFuZGxlIHNvbWUgc3BlY2lhbCBjYXNlcyBpbgorICogbXVsdGktY2FsbCBhbmQgc2luZ2xlLWNhbGwgZGVjb2RpbmcuCisgKgorICogSW4gbXVsdGktY2FsbCBtb2RlLCB3ZSBtdXN0IHJldHVybiBYWl9CVUZfRVJST1Igd2hlbiBpdCBzZWVtcyBjbGVhciB0aGF0IHdlCisgKiBhcmUgbm90IGdvaW5nIHRvIG1ha2UgYW55IHByb2dyZXNzIGFueW1vcmUuIFRoaXMgaXMgdG8gcHJldmVudCB0aGUgY2FsbGVyCisgKiBmcm9tIGNhbGxpbmcgdXMgaW5maW5pdGVseSB3aGVuIHRoZSBpbnB1dCBmaWxlIGlzIHRydW5jYXRlZCBvciBvdGhlcndpc2UKKyAqIGNvcnJ1cHQuIFNpbmNlIHpsaWItc3R5bGUgQVBJIGFsbG93cyB0aGF0IHRoZSBjYWxsZXIgZmlsbHMgdGhlIGlucHV0IGJ1ZmZlcgorICogb25seSB3aGVuIHRoZSBkZWNvZGVyIGRvZXNuJ3QgcHJvZHVjZSBhbnkgbmV3IG91dHB1dCwgd2UgaGF2ZSB0byBiZSBjYXJlZnVsCisgKiB0byBhdm9pZCByZXR1cm5pbmcgWFpfQlVGX0VSUk9SIHRvbyBlYXNpbHk6IFhaX0JVRl9FUlJPUiBpcyByZXR1cm5lZCBvbmx5CisgKiBhZnRlciB0aGUgc2Vjb25kIGNvbnNlY3V0aXZlIGNhbGwgdG8geHpfZGVjX3J1bigpIHRoYXQgbWFrZXMgbm8gcHJvZ3Jlc3MuCisgKgorICogSW4gc2luZ2xlLWNhbGwgbW9kZSwgaWYgd2UgY291bGRuJ3QgZGVjb2RlIGV2ZXJ5dGhpbmcgYW5kIG5vIGVycm9yCisgKiBvY2N1cnJlZCwgZWl0aGVyIHRoZSBpbnB1dCBpcyB0cnVuY2F0ZWQgb3IgdGhlIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLgorICogU2luY2Ugd2Uga25vdyB0aGF0IHRoZSBsYXN0IGlucHV0IGJ5dGUgbmV2ZXIgcHJvZHVjZXMgYW55IG91dHB1dCwgd2Uga25vdworICogdGhhdCBpZiBhbGwgdGhlIGlucHV0IHdhcyBjb25zdW1lZCBhbmQgZGVjb2Rpbmcgd2Fzbid0IGZpbmlzaGVkLCB0aGUgZmlsZQorICogbXVzdCBiZSBjb3JydXB0LiBPdGhlcndpc2UgdGhlIG91dHB1dCBidWZmZXIgaGFzIHRvIGJlIHRvbyBzbWFsbCBvciB0aGUKKyAqIGZpbGUgaXMgY29ycnVwdCBpbiBhIHdheSB0aGF0IGRlY29kaW5nIGl0IHByb2R1Y2VzIHRvbyBiaWcgb3V0cHV0LgorICoKKyAqIElmIHNpbmdsZS1jYWxsIGRlY29kaW5nIGZhaWxzLCB3ZSByZXNldCBiLT5pbl9wb3MgYW5kIGItPm91dF9wb3MgYmFjayB0bworICogdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiBUaGlzIGlzIGJlY2F1c2Ugd2l0aCBzb21lIGZpbHRlciBjaGFpbnMgdGhlcmUgd29uJ3QKKyAqIGJlIGFueSB2YWxpZCB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB1bmxlc3MgdGhlIGRlY29kaW5nCisgKiBhY3R1YWxseSBzdWNjZWVkcyAodGhhdCdzIHRoZSBwcmljZSB0byBwYXkgb2YgdXNpbmcgdGhlIG91dHB1dCBidWZmZXIgYXMKKyAqIHRoZSB3b3Jrc3BhY2UpLgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgWFpfRlVOQyB4el9kZWNfcnVuKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGluX3N0YXJ0OworCXNpemVfdCBvdXRfc3RhcnQ7CisJZW51bSB4el9yZXQgcmV0OworCisJaWYgKERFQ19JU19TSU5HTEUocy0+bW9kZSkpCisJCXh6X2RlY19yZXNldChzKTsKKworCWluX3N0YXJ0ID0gYi0+aW5fcG9zOworCW91dF9zdGFydCA9IGItPm91dF9wb3M7CisJcmV0ID0gZGVjX21haW4ocywgYik7CisKKwlpZiAoREVDX0lTX1NJTkdMRShzLT5tb2RlKSkgeworCQlpZiAocmV0ID09IFhaX09LKQorCQkJcmV0ID0gYi0+aW5fcG9zID09IGItPmluX3NpemUKKwkJCQkJPyBYWl9EQVRBX0VSUk9SIDogWFpfQlVGX0VSUk9SOworCisJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkgeworCQkJYi0+aW5fcG9zID0gaW5fc3RhcnQ7CisJCQliLT5vdXRfcG9zID0gb3V0X3N0YXJ0OworCQl9CisKKwl9IGVsc2UgaWYgKHJldCA9PSBYWl9PSyAmJiBpbl9zdGFydCA9PSBiLT5pbl9wb3MKKwkJCSYmIG91dF9zdGFydCA9PSBiLT5vdXRfcG9zKSB7CisJCWlmIChzLT5hbGxvd19idWZfZXJyb3IpCisJCQlyZXQgPSBYWl9CVUZfRVJST1I7CisKKwkJcy0+YWxsb3dfYnVmX2Vycm9yID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlzLT5hbGxvd19idWZfZXJyb3IgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlYyAqIFhaX0ZVTkMgeHpfZGVjX2luaXQoCisJCWVudW0geHpfbW9kZSBtb2RlLCB1aW50MzJfdCBkaWN0X21heCkKK3sKKwlzdHJ1Y3QgeHpfZGVjICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXMtPm1vZGUgPSBtb2RlOworCisjaWZkZWYgWFpfREVDX0JDSgorCXMtPmJjaiA9IHh6X2RlY19iY2pfY3JlYXRlKERFQ19JU19TSU5HTEUobW9kZSkpOworCWlmIChzLT5iY2ogPT0gTlVMTCkKKwkJZ290byBlcnJvcl9iY2o7CisjZW5kaWYKKworCXMtPmx6bWEyID0geHpfZGVjX2x6bWEyX2NyZWF0ZShtb2RlLCBkaWN0X21heCk7CisJaWYgKHMtPmx6bWEyID09IE5VTEwpCisJCWdvdG8gZXJyb3JfbHptYTI7CisKKwl4el9kZWNfcmVzZXQocyk7CisJcmV0dXJuIHM7CisKK2Vycm9yX2x6bWEyOgorI2lmZGVmIFhaX0RFQ19CQ0oKKwl4el9kZWNfYmNqX2VuZChzLT5iY2opOworZXJyb3JfYmNqOgorI2VuZGlmCisJa2ZyZWUocyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK1haX0VYVEVSTiB2b2lkIFhaX0ZVTkMgeHpfZGVjX3Jlc2V0KHN0cnVjdCB4el9kZWMgKnMpCit7CisJcy0+c2VxdWVuY2UgPSBTRVFfU1RSRUFNX0hFQURFUjsKKwlzLT5hbGxvd19idWZfZXJyb3IgPSBmYWxzZTsKKwlzLT5wb3MgPSAwOworCXMtPmNyYzMyID0gMDsKKwltZW16ZXJvKCZzLT5ibG9jaywgc2l6ZW9mKHMtPmJsb2NrKSk7CisJbWVtemVybygmcy0+aW5kZXgsIHNpemVvZihzLT5pbmRleCkpOworCXMtPnRlbXAucG9zID0gMDsKKwlzLT50ZW1wLnNpemUgPSBTVFJFQU1fSEVBREVSX1NJWkU7Cit9CisKK1haX0VYVEVSTiB2b2lkIFhaX0ZVTkMgeHpfZGVjX2VuZChzdHJ1Y3QgeHpfZGVjICpzKQoreworCWlmIChzICE9IE5VTEwpIHsKKwkJeHpfZGVjX2x6bWEyX2VuZChzLT5sem1hMik7CisjaWZkZWYgWFpfREVDX0JDSgorCQl4el9kZWNfYmNqX2VuZChzLT5iY2opOworI2VuZGlmCisJCWtmcmVlKHMpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9sem1hMi5oIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2x6bWEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmMjFhZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9sem1hMi5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogTFpNQTIgZGVmaW5pdGlvbnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfTFpNQTJfSAorI2RlZmluZSBYWl9MWk1BMl9ICisKKy8qIFJhbmdlIGNvZGVyIGNvbnN0YW50cyAqLworI2RlZmluZSBSQ19TSElGVF9CSVRTIDgKKyNkZWZpbmUgUkNfVE9QX0JJVFMgMjQKKyNkZWZpbmUgUkNfVE9QX1ZBTFVFICgxIDw8IFJDX1RPUF9CSVRTKQorI2RlZmluZSBSQ19CSVRfTU9ERUxfVE9UQUxfQklUUyAxMQorI2RlZmluZSBSQ19CSVRfTU9ERUxfVE9UQUwgKDEgPDwgUkNfQklUX01PREVMX1RPVEFMX0JJVFMpCisjZGVmaW5lIFJDX01PVkVfQklUUyA1CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBwb3NpdGlvbiBzdGF0ZXMuIEEgcG9zaXRpb24gc3RhdGUgaXMgdGhlIGxvd2VzdCBwYgorICogbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGN1cnJlbnQgdW5jb21wcmVzc2VkIG9mZnNldC4gSW4gc29tZSBwbGFjZXMgdGhlcmUKKyAqIGFyZSBkaWZmZXJlbnQgc2V0cyBvZiBwcm9iYWJpbGl0aWVzIGZvciBkaWZmZXJlbnQgcG9zaXRpb24gc3RhdGVzLgorICovCisjZGVmaW5lIFBPU19TVEFURVNfTUFYICgxIDw8IDQpCisKKy8qCisgKiBUaGlzIGVudW0gaXMgdXNlZCB0byB0cmFjayB3aGljaCBMWk1BIHN5bWJvbHMgaGF2ZSBvY2N1cnJlZCBtb3N0IHJlY2VudGx5CisgKiBhbmQgaW4gd2hpY2ggb3JkZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcmVkaWN0IHRoZSBuZXh0IHN5bWJvbC4KKyAqCisgKiBTeW1ib2xzOgorICogIC0gTGl0ZXJhbDogT25lIDgtYml0IGJ5dGUKKyAqICAtIE1hdGNoOiBSZXBlYXQgYSBjaHVuayBvZiBkYXRhIGF0IHNvbWUgZGlzdGFuY2UKKyAqICAtIExvbmcgcmVwZWF0OiBNdWx0aS1ieXRlIG1hdGNoIGF0IGEgcmVjZW50bHkgc2VlbiBkaXN0YW5jZQorICogIC0gU2hvcnQgcmVwZWF0OiBPbmUtYnl0ZSByZXBlYXQgYXQgYSByZWNlbnRseSBzZWVuIGRpc3RhbmNlCisgKgorICogVGhlIHN5bWJvbCBuYW1lcyBhcmUgaW4gZnJvbSBTVEFURV9vbGRlc3Rfb2xkZXJfcHJldmlvdXMuIFJFUCBtZWFucworICogZWl0aGVyIHNob3J0IG9yIGxvbmcgcmVwZWF0ZWQgbWF0Y2gsIGFuZCBOT05MSVQgbWVhbnMgYW55IG5vbi1saXRlcmFsLgorICovCitlbnVtIGx6bWFfc3RhdGUgeworCVNUQVRFX0xJVF9MSVQsCisJU1RBVEVfTUFUQ0hfTElUX0xJVCwKKwlTVEFURV9SRVBfTElUX0xJVCwKKwlTVEFURV9TSE9SVFJFUF9MSVRfTElULAorCVNUQVRFX01BVENIX0xJVCwKKwlTVEFURV9SRVBfTElULAorCVNUQVRFX1NIT1JUUkVQX0xJVCwKKwlTVEFURV9MSVRfTUFUQ0gsCisJU1RBVEVfTElUX0xPTkdSRVAsCisJU1RBVEVfTElUX1NIT1JUUkVQLAorCVNUQVRFX05PTkxJVF9NQVRDSCwKKwlTVEFURV9OT05MSVRfUkVQCit9OworCisvKiBUb3RhbCBudW1iZXIgb2Ygc3RhdGVzICovCisjZGVmaW5lIFNUQVRFUyAxMgorCisvKiBUaGUgbG93ZXN0IDcgc3RhdGVzIGluZGljYXRlIHRoYXQgdGhlIHByZXZpb3VzIHN0YXRlIHdhcyBhIGxpdGVyYWwuICovCisjZGVmaW5lIExJVF9TVEFURVMgNworCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIGxpdGVyYWwuICovCitzdGF0aWMgaW5saW5lIHZvaWQgWFpfRlVOQyBsem1hX3N0YXRlX2xpdGVyYWwoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAoKnN0YXRlIDw9IFNUQVRFX1NIT1JUUkVQX0xJVF9MSVQpCisJCSpzdGF0ZSA9IFNUQVRFX0xJVF9MSVQ7CisJZWxzZSBpZiAoKnN0YXRlIDw9IFNUQVRFX0xJVF9TSE9SVFJFUCkKKwkJKnN0YXRlIC09IDM7CisJZWxzZQorCQkqc3RhdGUgLT0gNjsKK30KKworLyogSW5kaWNhdGUgdGhhdCB0aGUgbGF0ZXN0IHN5bWJvbCB3YXMgYSBtYXRjaC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIGx6bWFfc3RhdGVfbWF0Y2goZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX01BVENIIDogU1RBVEVfTk9OTElUX01BVENIOworfQorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3RhdGUgd2FzIGEgbG9uZyByZXBlYXRlZCBtYXRjaC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIGx6bWFfc3RhdGVfbG9uZ19yZXAoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX0xPTkdSRVAgOiBTVEFURV9OT05MSVRfUkVQOworfQorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIHNob3J0IG1hdGNoLiAqLworc3RhdGljIGlubGluZSB2b2lkIFhaX0ZVTkMgbHptYV9zdGF0ZV9zaG9ydF9yZXAoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX1NIT1JUUkVQIDogU1RBVEVfTk9OTElUX1JFUDsKK30KKworLyogVGVzdCBpZiB0aGUgcHJldmlvdXMgc3ltYm9sIHdhcyBhIGxpdGVyYWwuICovCitzdGF0aWMgaW5saW5lIGJvb2wgWFpfRlVOQyBsem1hX3N0YXRlX2lzX2xpdGVyYWwoZW51bSBsem1hX3N0YXRlIHN0YXRlKQoreworCXJldHVybiBzdGF0ZSA8IExJVF9TVEFURVM7Cit9CisKKy8qIEVhY2ggbGl0ZXJhbCBjb2RlciBpcyBkaXZpZGVkIGluIHRocmVlIHNlY3Rpb25zOgorICogICAtIDB4MDAxLTB4MEZGOiBXaXRob3V0IG1hdGNoIGJ5dGUKKyAqICAgLSAweDEwMS0weDFGRjogV2l0aCBtYXRjaCBieXRlOyBtYXRjaCBiaXQgaXMgMAorICogICAtIDB4MjAxLTB4MkZGOiBXaXRoIG1hdGNoIGJ5dGU7IG1hdGNoIGJpdCBpcyAxCisgKgorICogTWF0Y2ggYnl0ZSBpcyB1c2VkIHdoZW4gdGhlIHByZXZpb3VzIExaTUEgc3ltYm9sIHdhcyBzb21ldGhpbmcgZWxzZSB0aGFuCisgKiBhIGxpdGVyYWwgKHRoYXQgaXMsIGl0IHdhcyBzb21lIGtpbmQgb2YgbWF0Y2gpLgorICovCisjZGVmaW5lIExJVEVSQUxfQ09ERVJfU0laRSAweDMwMAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBsaXRlcmFsIGNvZGVycyAqLworI2RlZmluZSBMSVRFUkFMX0NPREVSU19NQVggKDEgPDwgNCkKKworLyogTWluaW11bSBsZW5ndGggb2YgYSBtYXRjaCBpcyB0d28gYnl0ZXMuICovCisjZGVmaW5lIE1BVENIX0xFTl9NSU4gMgorCisvKiBNYXRjaCBsZW5ndGggaXMgZW5jb2RlZCB3aXRoIDQsIDUsIG9yIDEwIGJpdHMuCisgKgorICogTGVuZ3RoICAgQml0cworICogIDItOSAgICAgIDQgPSBDaG9pY2U9MCArIDMgYml0cworICogMTAtMTcgICAgIDUgPSBDaG9pY2U9MSArIENob2ljZTI9MCArIDMgYml0cworICogMTgtMjczICAgMTAgPSBDaG9pY2U9MSArIENob2ljZTI9MSArIDggYml0cworICovCisjZGVmaW5lIExFTl9MT1dfQklUUyAzCisjZGVmaW5lIExFTl9MT1dfU1lNQk9MUyAoMSA8PCBMRU5fTE9XX0JJVFMpCisjZGVmaW5lIExFTl9NSURfQklUUyAzCisjZGVmaW5lIExFTl9NSURfU1lNQk9MUyAoMSA8PCBMRU5fTUlEX0JJVFMpCisjZGVmaW5lIExFTl9ISUdIX0JJVFMgOAorI2RlZmluZSBMRU5fSElHSF9TWU1CT0xTICgxIDw8IExFTl9ISUdIX0JJVFMpCisjZGVmaW5lIExFTl9TWU1CT0xTIChMRU5fTE9XX1NZTUJPTFMgKyBMRU5fTUlEX1NZTUJPTFMgKyBMRU5fSElHSF9TWU1CT0xTKQorCisvKgorICogTWF4aW11bSBsZW5ndGggb2YgYSBtYXRjaCBpcyAyNzMgd2hpY2ggaXMgYSByZXN1bHQgb2YgdGhlIGVuY29kaW5nCisgKiBkZXNjcmliZWQgYWJvdmUuCisgKi8KKyNkZWZpbmUgTUFUQ0hfTEVOX01BWCAoTUFUQ0hfTEVOX01JTiArIExFTl9TWU1CT0xTIC0gMSkKKworLyoKKyAqIERpZmZlcmVudCBzZXRzIG9mIHByb2JhYmlsaXRpZXMgYXJlIHVzZWQgZm9yIG1hdGNoIGRpc3RhbmNlcyB0aGF0IGhhdmUKKyAqIHZlcnkgc2hvcnQgbWF0Y2ggbGVuZ3RoOiBMZW5ndGhzIG9mIDIsIDMsIGFuZCA0IGJ5dGVzIGhhdmUgYSBzZXBhcmF0ZQorICogc2V0IG9mIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggbGVuZ3RoLiBUaGUgbWF0Y2hlcyB3aXRoIGxvbmdlciBsZW5ndGgKKyAqIHVzZSBhIHNoYXJlZCBzZXQgb2YgcHJvYmFiaWxpdGllcy4KKyAqLworI2RlZmluZSBESVNUX1NUQVRFUyA0CisKKy8qCisgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBhcHByb3ByaWF0ZSBwcm9iYWJpbGl0eSBhcnJheSBmb3IgZGVjb2RpbmcKKyAqIHRoZSBkaXN0YW5jZSBzbG90LgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFhaX0ZVTkMgbHptYV9nZXRfZGlzdF9zdGF0ZSh1aW50MzJfdCBsZW4pCit7CisJcmV0dXJuIGxlbiA8IERJU1RfU1RBVEVTICsgTUFUQ0hfTEVOX01JTgorCQkJPyBsZW4gLSBNQVRDSF9MRU5fTUlOIDogRElTVF9TVEFURVMgLSAxOworfQorCisvKgorICogVGhlIGhpZ2hlc3QgdHdvIGJpdHMgb2YgYSAzMi1iaXQgbWF0Y2ggZGlzdGFuY2UgYXJlIGVuY29kZWQgdXNpbmcgc2l4IGJpdHMuCisgKiBUaGlzIHNpeC1iaXQgdmFsdWUgaXMgY2FsbGVkIGEgZGlzdGFuY2Ugc2xvdC4gVGhpcyB3YXkgZW5jb2RpbmcgYSAzMi1iaXQKKyAqIHZhbHVlIHRha2VzIDYtMzYgYml0cywgbGFyZ2VyIHZhbHVlcyB0YWtpbmcgbW9yZSBiaXRzLgorICovCisjZGVmaW5lIERJU1RfU0xPVF9CSVRTIDYKKyNkZWZpbmUgRElTVF9TTE9UUyAoMSA8PCBESVNUX1NMT1RfQklUUykKKworLyogTWF0Y2ggZGlzdGFuY2VzIHVwIHRvIDEyNyBhcmUgZnVsbHkgZW5jb2RlZCB1c2luZyBwcm9iYWJpbGl0aWVzLiBTaW5jZQorICogdGhlIGhpZ2hlc3QgdHdvIGJpdHMgKGRpc3RhbmNlIHNsb3QpIGFyZSBhbHdheXMgZW5jb2RlZCB1c2luZyBzaXggYml0cywKKyAqIHRoZSBkaXN0YW5jZXMgMC0zIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgYml0cyB0byBlbmNvZGUsIHNpbmNlIHRoZQorICogZGlzdGFuY2Ugc2xvdCBpdHNlbGYgaXMgdGhlIHNhbWUgYXMgdGhlIGFjdHVhbCBkaXN0YW5jZS4gRElTVF9NT0RFTF9TVEFSVAorICogaW5kaWNhdGVzIHRoZSBmaXJzdCBkaXN0YW5jZSBzbG90IHdoZXJlIGF0IGxlYXN0IG9uZSBhZGRpdGlvbmFsIGJpdCBpcworICogbmVlZGVkLgorICovCisjZGVmaW5lIERJU1RfTU9ERUxfU1RBUlQgNAorCisvKgorICogTWF0Y2ggZGlzdGFuY2VzIGdyZWF0ZXIgdGhhbiAxMjcgYXJlIGVuY29kZWQgaW4gdGhyZWUgcGllY2VzOgorICogICAtIGRpc3RhbmNlIHNsb3Q6IHRoZSBoaWdoZXN0IHR3byBiaXRzCisgKiAgIC0gZGlyZWN0IGJpdHM6IDItMjYgYml0cyBiZWxvdyB0aGUgaGlnaGVzdCB0d28gYml0cworICogICAtIGFsaWdubWVudCBiaXRzOiBmb3VyIGxvd2VzdCBiaXRzCisgKgorICogRGlyZWN0IGJpdHMgZG9uJ3QgdXNlIGFueSBwcm9iYWJpbGl0aWVzLgorICoKKyAqIFRoZSBkaXN0YW5jZSBzbG90IHZhbHVlIG9mIDE0IGlzIGZvciBkaXN0YW5jZXMgMTI4LTE5MS4KKyAqLworI2RlZmluZSBESVNUX01PREVMX0VORCAxNAorCisvKiBEaXN0YW5jZSBzbG90cyB0aGF0IGluZGljYXRlIGEgZGlzdGFuY2UgPD0gMTI3LiAqLworI2RlZmluZSBGVUxMX0RJU1RBTkNFU19CSVRTIChESVNUX01PREVMX0VORCAvIDIpCisjZGVmaW5lIEZVTExfRElTVEFOQ0VTICgxIDw8IEZVTExfRElTVEFOQ0VTX0JJVFMpCisKKy8qCisgKiBGb3IgbWF0Y2ggZGlzdGFuY2VzIGdyZWF0ZXIgdGhhbiAxMjcsIG9ubHkgdGhlIGhpZ2hlc3QgdHdvIGJpdHMgYW5kIHRoZQorICogbG93ZXN0IGZvdXIgYml0cyAoYWxpZ25tZW50KSBpcyBlbmNvZGVkIHVzaW5nIHByb2JhYmlsaXRpZXMuCisgKi8KKyNkZWZpbmUgQUxJR05fQklUUyA0CisjZGVmaW5lIEFMSUdOX1NJWkUgKDEgPDwgQUxJR05fQklUUykKKyNkZWZpbmUgQUxJR05fTUFTSyAoQUxJR05fU0laRSAtIDEpCisKKy8qIFRvdGFsIG51bWJlciBvZiBhbGwgcHJvYmFiaWxpdHkgdmFyaWFibGVzICovCisjZGVmaW5lIFBST0JTX1RPVEFMICgxODQ2ICsgTElURVJBTF9DT0RFUlNfTUFYICogTElURVJBTF9DT0RFUl9TSVpFKQorCisvKgorICogTFpNQSByZW1lbWJlcnMgdGhlIGZvdXIgbW9zdCByZWNlbnQgbWF0Y2ggZGlzdGFuY2VzLiBSZXVzaW5nIHRoZXNlCisgKiBkaXN0YW5jZXMgdGVuZHMgdG8gdGFrZSBsZXNzIHNwYWNlIHRoYW4gcmUtZW5jb2RpbmcgdGhlIGFjdHVhbAorICogZGlzdGFuY2UgdmFsdWUuCisgKi8KKyNkZWZpbmUgUkVQUyA0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X3ByaXZhdGUuaCBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9wcml2YXRlLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBQcml2YXRlIGluY2x1ZGVzIGFuZCBkZWZpbml0aW9ucworICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIFhaX1BSSVZBVEVfSAorI2RlZmluZSBYWl9QUklWQVRFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKwkvKiBYWl9QUkVCT09UIG1heSBiZSBkZWZpbmVkIG9ubHkgdmlhIGRlY29tcHJlc3NfdW54ei5jLiAqLworIwlpZm5kZWYgWFpfUFJFQk9PVAorIwkJaW5jbHVkZSA8bGludXgvc2xhYi5oPgorIwkJaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorIwkJaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjCQlkZWZpbmUgbWVtZXEoYSwgYiwgc2l6ZSkgKG1lbWNtcChhLCBiLCBzaXplKSA9PSAwKQorIwkJZGVmaW5lIG1lbXplcm8oYnVmLCBzaXplKSBtZW1zZXQoYnVmLCAwLCBzaXplKQorIwllbmRpZgorIwlpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjCWluY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyMJZGVmaW5lIGdldF9sZTMyKHApIGxlMzJfdG9fY3B1cCgoY29uc3QgdWludDMyX3QgKikocCkpCisJLyogWFpfSUdOT1JFX0tDT05GSUcgbWF5IGJlIGRlZmluZWQgb25seSB2aWEgZGVjb21wcmVzc191bnh6LmMuICovCisjCWlmbmRlZiBYWl9JR05PUkVfS0NPTkZJRworIwkJaWZkZWYgQ09ORklHX1haX0RFQ19YODYKKyMJCQlkZWZpbmUgWFpfREVDX1g4NgorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfUE9XRVJQQworIwkJCWRlZmluZSBYWl9ERUNfUE9XRVJQQworIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfSUE2NAorIwkJCWRlZmluZSBYWl9ERUNfSUE2NAorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfQVJNCisjCQkJZGVmaW5lIFhaX0RFQ19BUk0KKyMJCWVuZGlmCisjCQlpZmRlZiBDT05GSUdfWFpfREVDX0FSTVRIVU1CCisjCQkJZGVmaW5lIFhaX0RFQ19BUk1USFVNQgorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfU1BBUkMKKyMJCQlkZWZpbmUgWFpfREVDX1NQQVJDCisjCQllbmRpZgorIwllbmRpZgorIwlpbmNsdWRlIDxsaW51eC94ei5oPgorI2Vsc2UKKwkvKgorCSAqIEZvciB1c2Vyc3BhY2UgYnVpbGRzLCB1c2UgYSBzZXBhcmF0ZSBoZWFkZXIgdG8gZGVmaW5lIHRoZSByZXF1aXJlZAorCSAqIG1hY3JvcyBhbmQgZnVuY3Rpb25zLiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBhZGFwdCB0aGUgY29kZSBpbnRvCisJICogZGlmZmVyZW50IGVudmlyb25tZW50cyBhbmQgYXZvaWRzIGNsdXR0ZXIgaW4gdGhlIExpbnV4IGtlcm5lbCB0cmVlLgorCSAqLworIwlpbmNsdWRlICJ4el9jb25maWcuaCIKKyNlbmRpZgorCisvKiBJZiBubyBzcGVjaWZpYyBkZWNvZGluZyBtb2RlIGlzIHJlcXVlc3RlZCwgZW5hYmxlIHN1cHBvcnQgZm9yIGFsbCBtb2Rlcy4gKi8KKyNpZiAhZGVmaW5lZChYWl9ERUNfU0lOR0xFKSAmJiAhZGVmaW5lZChYWl9ERUNfUFJFQUxMT0MpIFwKKwkJJiYgIWRlZmluZWQoWFpfREVDX0RZTkFMTE9DKQorIwlkZWZpbmUgWFpfREVDX1NJTkdMRQorIwlkZWZpbmUgWFpfREVDX1BSRUFMTE9DCisjCWRlZmluZSBYWl9ERUNfRFlOQUxMT0MKKyNlbmRpZgorCisvKgorICogVGhlIERFQ19JU19mb28obW9kZSkgbWFjcm9zIGFyZSB1c2VkIGluICJpZiIgc3RhdGVtZW50cy4gSWYgb25seSBzb21lCisgKiBvZiB0aGUgc3VwcG9ydGVkIG1vZGVzIGFyZSBlbmFibGVkLCB0aGVzZSBtYWNyb3Mgd2lsbCBldmFsdWF0ZSB0byB0cnVlIG9yCisgKiBmYWxzZSBhdCBjb21waWxlIHRpbWUgYW5kIHRodXMgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIG9taXQgdW5uZWVkZWQgY29kZS4KKyAqLworI2lmZGVmIFhaX0RFQ19TSU5HTEUKKyMJZGVmaW5lIERFQ19JU19TSU5HTEUobW9kZSkgKChtb2RlKSA9PSBYWl9TSU5HTEUpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX1NJTkdMRShtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19QUkVBTExPQworIwlkZWZpbmUgREVDX0lTX1BSRUFMTE9DKG1vZGUpICgobW9kZSkgPT0gWFpfUFJFQUxMT0MpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX1BSRUFMTE9DKG1vZGUpIChmYWxzZSkKKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0RZTkFMTE9DCisjCWRlZmluZSBERUNfSVNfRFlOQUxMT0MobW9kZSkgKChtb2RlKSA9PSBYWl9EWU5BTExPQykKKyNlbHNlCisjCWRlZmluZSBERUNfSVNfRFlOQUxMT0MobW9kZSkgKGZhbHNlKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChYWl9ERUNfU0lOR0xFKQorIwlkZWZpbmUgREVDX0lTX01VTFRJKG1vZGUpICh0cnVlKQorI2VsaWYgZGVmaW5lZChYWl9ERUNfUFJFQUxMT0MpIHx8IGRlZmluZWQoWFpfREVDX0RZTkFMTE9DKQorIwlkZWZpbmUgREVDX0lTX01VTFRJKG1vZGUpICgobW9kZSkgIT0gWFpfU0lOR0xFKQorI2Vsc2UKKyMJZGVmaW5lIERFQ19JU19NVUxUSShtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworLyoKKyAqIElmIGFueSBvZiB0aGUgQkNKIGZpbHRlciBkZWNvZGVycyBhcmUgd2FudGVkLCBkZWZpbmUgWFpfREVDX0JDSi4KKyAqIFhaX0RFQ19CQ0ogaXMgdXNlZCB0byBlbmFibGUgZ2VuZXJpYyBzdXBwb3J0IGZvciBCQ0ogZGVjb2RlcnMuCisgKi8KKyNpZm5kZWYgWFpfREVDX0JDSgorIwlpZiBkZWZpbmVkKFhaX0RFQ19YODYpIHx8IGRlZmluZWQoWFpfREVDX1BPV0VSUEMpIFwKKwkJCXx8IGRlZmluZWQoWFpfREVDX0lBNjQpIHx8IGRlZmluZWQoWFpfREVDX0FSTSkgXAorCQkJfHwgZGVmaW5lZChYWl9ERUNfQVJNKSB8fCBkZWZpbmVkKFhaX0RFQ19BUk1USFVNQikgXAorCQkJfHwgZGVmaW5lZChYWl9ERUNfU1BBUkMpCisjCQlkZWZpbmUgWFpfREVDX0JDSgorIwllbmRpZgorI2VuZGlmCisKKy8qCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIExaTUEyIGRlY29kZXIuIHh6X2RlY19sem1hMl9yZXNldCgpIG11c3QgYmUgdXNlZAorICogYmVmb3JlIGNhbGxpbmcgeHpfZGVjX2x6bWEyX3J1bigpLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19sem1hMiAqIFhaX0ZVTkMgeHpfZGVjX2x6bWEyX2NyZWF0ZSgKKwkJZW51bSB4el9tb2RlIG1vZGUsIHVpbnQzMl90IGRpY3RfbWF4KTsKKworLyoKKyAqIERlY29kZSB0aGUgTFpNQTIgcHJvcGVydGllcyAob25lIGJ5dGUpIGFuZCByZXNldCB0aGUgZGVjb2Rlci4gUmV0dXJuCisgKiBYWl9PSyBvbiBzdWNjZXNzLCBYWl9NRU1MSU1JVF9FUlJPUiBpZiB0aGUgcHJlYWxsb2NhdGVkIGRpY3Rpb25hcnkgaXMgbm90CisgKiBiaWcgZW5vdWdoLCBhbmQgWFpfT1BUSU9OU19FUlJPUiBpZiBwcm9wcyBpbmRpY2F0ZXMgc29tZXRoaW5nIHRoYXQgdGhpcworICogZGVjb2RlciBkb2Vzbid0IHN1cHBvcnQuCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19sem1hMl9yZXNldCgKKwkJc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDhfdCBwcm9wcyk7CisKKy8qIERlY29kZSByYXcgTFpNQTIgc3RyZWFtIGZyb20gYi0+aW4gdG8gYi0+b3V0LiAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2x6bWEyX3J1bigKKwkJc3RydWN0IHh6X2RlY19sem1hMiAqcywgc3RydWN0IHh6X2J1ZiAqYik7CisKKy8qIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBMWk1BMiBkZWNvZGVyLiAqLworWFpfRVhURVJOIHZvaWQgWFpfRlVOQyB4el9kZWNfbHptYTJfZW5kKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpOworCisjaWZkZWYgWFpfREVDX0JDSgorLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgQkNKIGRlY29kZXJzLiB4el9kZWNfYmNqX3Jlc2V0KCkgbXVzdCBiZSB1c2VkIGJlZm9yZQorICogY2FsbGluZyB4el9kZWNfYmNqX3J1bigpLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19iY2ogKiBYWl9GVU5DIHh6X2RlY19iY2pfY3JlYXRlKGJvb2wgc2luZ2xlX2NhbGwpOworCisvKgorICogRGVjb2RlIHRoZSBGaWx0ZXIgSUQgb2YgYSBCQ0ogZmlsdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKKyAqIHN1cHBvcnQgY3VzdG9tIHN0YXJ0IG9mZnNldHMsIHNvIG5vIGRlY29kaW5nIG9mIEZpbHRlciBQcm9wZXJ0aWVzCisgKiBpcyBuZWVkZWQuIFJldHVybnMgWFpfT0sgaWYgdGhlIGdpdmVuIEZpbHRlciBJRCBpcyBzdXBwb3J0ZWQuCisgKiBPdGhlcndpc2UgWFpfT1BUSU9OU19FUlJPUiBpcyByZXR1cm5lZC4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2Jjal9yZXNldCgKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgaWQpOworCisvKgorICogRGVjb2RlIHJhdyBCQ0ogKyBMWk1BMiBzdHJlYW0uIFRoaXMgbXVzdCBiZSB1c2VkIG9ubHkgaWYgdGhlcmUgYWN0dWFsbHkgaXMKKyAqIGEgQkNKIGZpbHRlciBpbiB0aGUgY2hhaW4uIElmIHRoZSBjaGFpbiBoYXMgb25seSBMWk1BMiwgeHpfZGVjX2x6bWEyX3J1bigpCisgKiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseS4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2Jjal9ydW4oc3RydWN0IHh6X2RlY19iY2ogKnMsCisJCXN0cnVjdCB4el9kZWNfbHptYTIgKmx6bWEyLCBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIEJDSiBmaWx0ZXJzLiAqLworI2RlZmluZSB4el9kZWNfYmNqX2VuZChzKSBrZnJlZShzKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X3N0cmVhbS5oIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjJhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfc3RyZWFtLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBoYW5kbGluZyB0aGUgLnh6IGZpbGUgZm9ybWF0CisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfU1RSRUFNX0gKKyNkZWZpbmUgWFpfU1RSRUFNX0gKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgIVhaX0lOVEVSTkFMX0NSQzMyCisjCWluY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjCXVuZGVmIGNyYzMyCisjCWRlZmluZSB4el9jcmMzMihidWYsIHNpemUsIGNyYykgXAorCQkofmNyYzMyX2xlKH4odWludDMyX3QpKGNyYyksIGJ1Ziwgc2l6ZSkpCisjZW5kaWYKKworLyoKKyAqIFNlZSB0aGUgLnh6IGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24gYXQKKyAqIGh0dHA6Ly90dWthYW5pLm9yZy94ei94ei1maWxlLWZvcm1hdC50eHQKKyAqIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRhaW5lciBmb3JtYXQuCisgKi8KKworI2RlZmluZSBTVFJFQU1fSEVBREVSX1NJWkUgMTIKKworI2RlZmluZSBIRUFERVJfTUFHSUMgIlwzNzU3elhaXDAiCisjZGVmaW5lIEhFQURFUl9NQUdJQ19TSVpFIDYKKworI2RlZmluZSBGT09URVJfTUFHSUMgIllaIgorI2RlZmluZSBGT09URVJfTUFHSUNfU0laRSAyCisKKy8qCisgKiBWYXJpYWJsZS1sZW5ndGggaW50ZWdlciBjYW4gaG9sZCBhIDYzLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCBvciBhIHNwZWNpYWwKKyAqIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIHVua25vd24uCisgKi8KK3R5cGVkZWYgdWludDY0X3QgdmxpX3R5cGU7CisKKyNkZWZpbmUgVkxJX01BWCAoKHZsaV90eXBlKS0xIC8gMikKKyNkZWZpbmUgVkxJX1VOS05PV04gKCh2bGlfdHlwZSktMSkKKworLyogTWF4aW11bSBlbmNvZGVkIHNpemUgb2YgYSBWTEkgKi8KKyNkZWZpbmUgVkxJX0JZVEVTX01BWCAoc2l6ZW9mKHZsaV90eXBlKSAqIDggLyA3KQorCisvKiBJbnRlZ3JpdHkgQ2hlY2sgdHlwZXMgKi8KK2VudW0geHpfY2hlY2sgeworCVhaX0NIRUNLX05PTkUgPSAwLAorCVhaX0NIRUNLX0NSQzMyID0gMSwKKwlYWl9DSEVDS19DUkM2NCA9IDQsCisJWFpfQ0hFQ0tfU0hBMjU2ID0gMTAKK307CisKKy8qIE1heGltdW0gcG9zc2libGUgQ2hlY2sgSUQgKi8KKyNkZWZpbmUgWFpfQ0hFQ0tfTUFYIDE1CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbHpvcC5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvbHpvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjZiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9sem9wLmMKQEAgLTAsMCArMSwxMTAwIEBACisvKgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx6b3AgZmlsZSBjb21wcmVzc29yLgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYuLjIwMDMgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvcC8KKworICAgbHpvcCBhbmQgdGhlIExaTyBsaWJyYXJ5IGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSB0aGVtCisgICBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworICAgIk1pbmltYWxpemVkIiBmb3IgYnVzeWJveCBieSBBbGFpbiBLbmFmZgorKi8KKworLy91c2FnZTojZGVmaW5lIGx6b3BfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2Z2ZDEyMzQ1Njc4OUNGXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgbHpvcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktMS4uOQlDb21wcmVzc2lvbiBsZXZlbCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVjb21wcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLUYJRG9uJ3Qgc3RvcmUgb3IgdmVyaWZ5IGNoZWNrc3VtIgorLy91c2FnZTogICAgICJcbgktQwlBbHNvIHdyaXRlIGNoZWNrc3VtIG9mIGNvbXByZXNzZWQgYmxvY2siCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGx6b3BjYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdkNGXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgbHpvcGNhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktRglEb24ndCBzdG9yZSBvciB2ZXJpZnkgY2hlY2tzdW0iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHVubHpvcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZnZDRl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHVubHpvcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktRglEb24ndCBzdG9yZSBvciB2ZXJpZnkgY2hlY2tzdW0iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKyNpbmNsdWRlICJsaWJsem9faW50ZXJmYWNlLmgiCisKKy8qIGx6by0yLjAzL3NyYy9sem9fcHRyLmggKi8KKyNkZWZpbmUgcGQoYSxiKQkgKCh1bnNpZ25lZCkoKGEpLShiKSkpCisKKyNkZWZpbmUgbHpvX3ZlcnNpb24oKQkJCUxaT19WRVJTSU9OCisjZGVmaW5lIGx6b19zaXplb2ZfZGljdF90CQkoc2l6ZW9mKHVpbnQ4X3QqKSkKKworLyogbHpvLTIuMDMvaW5jbHVkZS9sem8vbHpvMXguaCAqLworI2RlZmluZSBMWk8xWF8xX01FTV9DT01QUkVTUwkoMTYzODQgKiBsem9fc2l6ZW9mX2RpY3RfdCkKKyNkZWZpbmUgTFpPMVhfMV8xNV9NRU1fQ09NUFJFU1MgKDMyNzY4ICogbHpvX3NpemVvZl9kaWN0X3QpCisjZGVmaW5lIExaTzFYXzk5OV9NRU1fQ09NUFJFU1MJKDE0ICogMTYzODQgKiBzaXplb2Yoc2hvcnQpKQorCisvKiBsem8tMi4wMy9zcmMvbHpvMXhfb28uYyAqLworI2RlZmluZSBOT19MSVQgVUlOVF9NQVgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjb3B5Mih1aW50OF90KiBpcCwgY29uc3QgdWludDhfdCogbV9wb3MsIHVuc2lnbmVkIG9mZikKK3sKKwlpcFswXSA9IG1fcG9zWzBdOworCWlmIChvZmYgPT0gMSkKKwkJaXBbMV0gPSBtX3Bvc1swXTsKKwllbHNlCisJCWlwWzFdID0gbV9wb3NbMV07Cit9CisKK3N0YXRpYyB2b2lkIGNvcHkzKHVpbnQ4X3QqIGlwLCBjb25zdCB1aW50OF90KiBtX3BvcywgdW5zaWduZWQgb2ZmKQoreworCWlwWzBdID0gbV9wb3NbMF07CisJaWYgKG9mZiA9PSAxKSB7CisJCWlwWzJdID0gaXBbMV0gPSBtX3Bvc1swXTsKKwl9CisJZWxzZSBpZiAob2ZmID09IDIpIHsKKwkJaXBbMV0gPSBtX3Bvc1sxXTsKKwkJaXBbMl0gPSBtX3Bvc1swXTsKKwl9CisJZWxzZSB7CisJCWlwWzFdID0gbV9wb3NbMV07CisJCWlwWzJdID0gbV9wb3NbMl07CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIG9wdGltaXplIGEgYmxvY2sgb2YgZGF0YS4KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBURVNUX0lQCQkoaXAgPCBpcF9lbmQpCisjZGVmaW5lIFRFU1RfT1AJCShvcCA8PSBvcF9lbmQpCisKK3N0YXRpYyBOT0lOTElORSBpbnQgbHpvMXhfb3B0aW1pemUodWludDhfdCAqaW4sIHVuc2lnbmVkIGluX2xlbiwKKwkJdWludDhfdCAqb3V0LCB1bnNpZ25lZCAqb3V0X2xlbiwKKwkJdm9pZCogd3JrbWVtIFVOVVNFRF9QQVJBTSkKK3sKKwl1aW50OF90KiBvcDsKKwl1aW50OF90KiBpcDsKKwl1bnNpZ25lZCB0OworCXVpbnQ4X3QqIG1fcG9zOworCXVpbnQ4X3QqIGNvbnN0IGlwX2VuZCA9IGluICsgaW5fbGVuOworCXVpbnQ4X3QqIGNvbnN0IG9wX2VuZCA9IG91dCArICpvdXRfbGVuOworCXVpbnQ4X3QqIGxpdHAgPSBOVUxMOworCXVuc2lnbmVkIGxpdCA9IDA7CisJdW5zaWduZWQgbmV4dF9saXQgPSBOT19MSVQ7CisJdW5zaWduZWQgbmw7CisJdW5zaWduZWQgbG9uZyBvX20xX2EgPSAwLCBvX20xX2IgPSAwLCBvX20yID0gMCwgb19tM19hID0gMCwgb19tM19iID0gMDsKKworLy8JICBMWk9fVU5VU0VEKHdya21lbSk7CisKKwkqb3V0X2xlbiA9IDA7CisKKwlvcCA9IG91dDsKKwlpcCA9IGluOworCisJaWYgKCppcCA+IDE3KSB7CisJCXQgPSAqaXArKyAtIDE3OworCQlpZiAodCA8IDQpCisJCQlnb3RvIG1hdGNoX25leHQ7CisJCWdvdG8gZmlyc3RfbGl0ZXJhbF9ydW47CisJfQorCisJd2hpbGUgKFRFU1RfSVAgJiYgVEVTVF9PUCkgeworCQl0ID0gKmlwKys7CisJCWlmICh0ID49IDE2KQorCQkJZ290byBtYXRjaDsKKwkJLyogYSBsaXRlcmFsIHJ1biAqLworCQlsaXRwID0gaXAgLSAxOworCQlpZiAodCA9PSAwKSB7CisJCQl0ID0gMTU7CisJCQl3aGlsZSAoKmlwID09IDApCisJCQkJdCArPSAyNTUsIGlwKys7CisJCQl0ICs9ICppcCsrOworCQl9CisJCWxpdCA9IHQgKyAzOworCQkvKiBjb3B5IGxpdGVyYWxzICovCisgY29weV9saXRlcmFsX3J1bjoKKwkJKm9wKysgPSAqaXArKzsKKwkJKm9wKysgPSAqaXArKzsKKwkJKm9wKysgPSAqaXArKzsKKyBmaXJzdF9saXRlcmFsX3J1bjoKKwkJZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworCisJCXQgPSAqaXArKzsKKworCQlpZiAodCA+PSAxNikKKwkJCWdvdG8gbWF0Y2g7CisjaWYgZGVmaW5lZChMWk8xWCkKKwkJbV9wb3MgPSBvcCAtIDEgLSAweDgwMDsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisJCW1fcG9zID0gb3AgLSAxIC0gMHg0MDA7CisjZW5kaWYKKwkJbV9wb3MgLT0gdCA+PiAyOworCQltX3BvcyAtPSAqaXArKyA8PCAyOworCQkqb3ArKyA9ICptX3BvcysrOworCQkqb3ArKyA9ICptX3BvcysrOworCQkqb3ArKyA9ICptX3BvcysrOworCQlsaXQgPSAwOworCQlnb3RvIG1hdGNoX2RvbmU7CisKKworCQkvKiBoYW5kbGUgbWF0Y2hlcyAqLworCQlkbyB7CisJCQlpZiAodCA8IDE2KSB7IC8qIGEgTTEgbWF0Y2ggKi8KKwkJCQltX3BvcyA9IG9wIC0gMTsKKwkJCQltX3BvcyAtPSB0ID4+IDI7CisJCQkJbV9wb3MgLT0gKmlwKysgPDwgMjsKKworCQkJCWlmIChsaXRwID09IE5VTEwpCisJCQkJCWdvdG8gY29weV9tMTsKKworCQkJCW5sID0gaXBbLTJdICYgMzsKKwkJCQkvKiB0ZXN0IGlmIGEgbWF0Y2ggZm9sbG93cyAqLworCQkJCWlmIChubCA9PSAwICYmIGxpdCA9PSAxICYmIGlwWzBdID49IDE2KSB7CisJCQkJCW5leHRfbGl0ID0gbmw7CisJCQkJCS8qIGFkanVzdCBsZW5ndGggb2YgcHJldmlvdXMgc2hvcnQgcnVuICovCisJCQkJCWxpdCArPSAyOworCQkJCQkqbGl0cCA9ICh1bnNpZ25lZCBjaGFyKSgoKmxpdHAgJiB+MykgfCBsaXQpOworCQkJCQkvKiBjb3B5IG92ZXIgdGhlIDIgbGl0ZXJhbHMgdGhhdCByZXBsYWNlIHRoZSBtYXRjaCAqLworCQkJCQljb3B5MihpcC0yLCBtX3BvcywgcGQob3AsIG1fcG9zKSk7CisJCQkJCW9fbTFfYSsrOworCQkJCX0KKwkJCQkvKiB0ZXN0IGlmIGEgbGl0ZXJhbCBydW4gZm9sbG93cyAqLworCQkJCWVsc2UKKwkJCQlpZiAobmwgPT0gMAorCQkJCSAmJiBpcFswXSA8IDE2CisJCQkJICYmIGlwWzBdICE9IDAKKwkJCQkgJiYgKGxpdCArIDIgKyBpcFswXSA8IDE2KQorCQkJCSkgeworCQkJCQl0ID0gKmlwKys7CisJCQkJCS8qIHJlbW92ZSBzaG9ydCBydW4gKi8KKwkJCQkJKmxpdHAgJj0gfjM7CisJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMiBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCWNvcHkyKGlwLTMrMSxtX3BvcyxwZChvcCxtX3BvcykpOworCQkJCQkvKiBtb3ZlIGxpdGVyYWxzIDEgYnl0ZSBhaGVhZCAqLworCQkJCQlsaXRwICs9IDI7CisJCQkJCWlmIChsaXQgPiAwKQorCQkJCQkJbWVtbW92ZShsaXRwKzEsIGxpdHAsIGxpdCk7CisJCQkJCS8qIGluc2VydCBuZXcgbGVuZ3RoIG9mIGxvbmcgbGl0ZXJhbCBydW4gKi8KKwkJCQkJbGl0ICs9IDIgKyB0ICsgMzsKKwkJCQkJKmxpdHAgPSAodW5zaWduZWQgY2hhcikobGl0IC0gMyk7CisKKwkJCQkJb19tMV9iKys7CisJCQkJCSpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7CisJCQkJCWdvdG8gY29weV9saXRlcmFsX3J1bjsKKwkJCQl9CisgY29weV9tMToKKwkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQl9IGVsc2UgeworIG1hdGNoOgorCQkJCWlmICh0ID49IDY0KSB7CQkJCS8qIGEgTTIgbWF0Y2ggKi8KKwkJCQkJbV9wb3MgPSBvcCAtIDE7CisjaWYgZGVmaW5lZChMWk8xWCkKKwkJCQkJbV9wb3MgLT0gKHQgPj4gMikgJiA3OworCQkJCQltX3BvcyAtPSAqaXArKyA8PCAzOworCQkJCQl0ID0gKHQgPj4gNSkgLSAxOworI2VsaWYgZGVmaW5lZChMWk8xWSkKKwkJCQkJbV9wb3MgLT0gKHQgPj4gMikgJiAzOworCQkJCQltX3BvcyAtPSAqaXArKyA8PCAyOworCQkJCQl0ID0gKHQgPj4gNCkgLSAzOworI2VuZGlmCisJCQkJCWlmIChsaXRwID09IE5VTEwpCisJCQkJCQlnb3RvIGNvcHlfbTsKKworCQkJCQlubCA9IGlwWy0yXSAmIDM7CisJCQkJCS8qIHRlc3QgaWYgaW4gYmVldHdlZW4gdHdvIGxvbmcgbGl0ZXJhbCBydW5zICovCisJCQkJCWlmICh0ID09IDEgJiYgbGl0ID4gMyAmJiBubCA9PSAwCisJCQkJCSAmJiBpcFswXSA8IDE2ICYmIGlwWzBdICE9IDAgJiYgKGxpdCArIDMgKyBpcFswXSA8IDE2KQorCQkJCQkpIHsKKwkJCQkJCXQgPSAqaXArKzsKKwkJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMyBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCQljb3B5MyhpcC0xLTIsbV9wb3MscGQob3AsbV9wb3MpKTsKKwkJCQkJCS8qIHNldCBuZXcgbGVuZ3RoIG9mIHByZXZpb3VzIGxpdGVyYWwgcnVuICovCisJCQkJCQlsaXQgKz0gMyArIHQgKyAzOworCQkJCQkJKmxpdHAgPSAodW5zaWduZWQgY2hhcikobGl0IC0gMyk7CisJCQkJCQlvX20yKys7CisJCQkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJCQlnb3RvIGNvcHlfbGl0ZXJhbF9ydW47CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodCA+PSAzMikgewkJCS8qIGEgTTMgbWF0Y2ggKi8KKwkJCQkJCXQgJj0gMzE7CisJCQkJCQlpZiAodCA9PSAwKSB7CisJCQkJCQkJdCA9IDMxOworCQkJCQkJCXdoaWxlICgqaXAgPT0gMCkKKwkJCQkJCQkJdCArPSAyNTUsIGlwKys7CisJCQkJCQkJdCArPSAqaXArKzsKKwkJCQkJCX0KKwkJCQkJCW1fcG9zID0gb3AgLSAxOworCQkJCQkJbV9wb3MgLT0gKmlwKysgPj4gMjsKKwkJCQkJCW1fcG9zIC09ICppcCsrIDw8IDY7CisJCQkJCX0gZWxzZSB7CQkJCQkvKiBhIE00IG1hdGNoICovCisJCQkJCQltX3BvcyA9IG9wOworCQkJCQkJbV9wb3MgLT0gKHQgJiA4KSA8PCAxMTsKKwkJCQkJCXQgJj0gNzsKKwkJCQkJCWlmICh0ID09IDApIHsKKwkJCQkJCQl0ID0gNzsKKwkJCQkJCQl3aGlsZSAoKmlwID09IDApCisJCQkJCQkJCXQgKz0gMjU1LCBpcCsrOworCQkJCQkJCXQgKz0gKmlwKys7CisJCQkJCQl9CisJCQkJCQltX3BvcyAtPSAqaXArKyA+PiAyOworCQkJCQkJbV9wb3MgLT0gKmlwKysgPDwgNjsKKwkJCQkJCWlmIChtX3BvcyA9PSBvcCkKKwkJCQkJCQlnb3RvIGVvZl9mb3VuZDsKKwkJCQkJCW1fcG9zIC09IDB4NDAwMDsKKwkJCQkJfQorCQkJCQlpZiAobGl0cCA9PSBOVUxMKQorCQkJCQkJZ290byBjb3B5X207CisKKwkJCQkJbmwgPSBpcFstMl0gJiAzOworCQkJCQkvKiB0ZXN0IGlmIGluIGJlZXR3ZWVuIHR3byBtYXRjaGVzICovCisJCQkJCWlmICh0ID09IDEgJiYgbGl0ID09IDAgJiYgbmwgPT0gMCAmJiBpcFswXSA+PSAxNikgeworCQkJCQkJbmV4dF9saXQgPSBubDsKKwkJCQkJCS8qIG1ha2UgYSBwcmV2aW91cyBzaG9ydCBydW4gKi8KKwkJCQkJCWxpdCArPSAzOworCQkJCQkJKmxpdHAgPSAodW5zaWduZWQgY2hhcikoKCpsaXRwICYgfjMpIHwgbGl0KTsKKwkJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMyBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCQljb3B5MyhpcC0zLG1fcG9zLHBkKG9wLG1fcG9zKSk7CisJCQkJCQlvX20zX2ErKzsKKwkJCQkJfQorCQkJCQkvKiB0ZXN0IGlmIGEgbGl0ZXJhbCBydW4gZm9sbG93cyAqLworCQkJCQllbHNlIGlmICh0ID09IDEgJiYgbGl0IDw9IDMgJiYgbmwgPT0gMAorCQkJCQkgJiYgaXBbMF0gPCAxNiAmJiBpcFswXSAhPSAwICYmIChsaXQgKyAzICsgaXBbMF0gPCAxNikKKwkJCQkJKSB7CisJCQkJCQl0ID0gKmlwKys7CisJCQkJCQkvKiByZW1vdmUgc2hvcnQgcnVuICovCisJCQkJCQkqbGl0cCAmPSB+MzsKKwkJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMyBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCQljb3B5MyhpcC00KzEsbV9wb3MscGQob3AsbV9wb3MpKTsKKwkJCQkJCS8qIG1vdmUgbGl0ZXJhbHMgMSBieXRlIGFoZWFkICovCisJCQkJCQlsaXRwICs9IDI7CisJCQkJCQlpZiAobGl0ID4gMCkKKwkJCQkJCQltZW1tb3ZlKGxpdHArMSxsaXRwLGxpdCk7CisJCQkJCQkvKiBpbnNlcnQgbmV3IGxlbmd0aCBvZiBsb25nIGxpdGVyYWwgcnVuICovCisJCQkJCQlsaXQgKz0gMyArIHQgKyAzOworCQkJCQkJKmxpdHAgPSAodW5zaWduZWQgY2hhcikobGl0IC0gMyk7CisKKwkJCQkJCW9fbTNfYisrOworCQkJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCQkJZ290byBjb3B5X2xpdGVyYWxfcnVuOworCQkJCQl9CisJCQkJfQorIGNvcHlfbToKKwkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJZG8gKm9wKysgPSAqbV9wb3MrKzsgd2hpbGUgKC0tdCA+IDApOworCQkJfQorCisgbWF0Y2hfZG9uZToKKwkJCWlmIChuZXh0X2xpdCA9PSBOT19MSVQpIHsKKwkJCQl0ID0gaXBbLTJdICYgMzsKKwkJCQlsaXQgPSB0OworCQkJCWxpdHAgPSBpcCAtIDI7CisJCQl9CisJCQllbHNlCisJCQkJdCA9IG5leHRfbGl0OworCQkJbmV4dF9saXQgPSBOT19MSVQ7CisJCQlpZiAodCA9PSAwKQorCQkJCWJyZWFrOworCQkJLyogY29weSBsaXRlcmFscyAqLworIG1hdGNoX25leHQ6CisJCQlkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisJCQl0ID0gKmlwKys7CisJCX0gd2hpbGUgKFRFU1RfSVAgJiYgVEVTVF9PUCk7CisJfQorCisJLyogbm8gRU9GIGNvZGUgd2FzIGZvdW5kICovCisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gTFpPX0VfRU9GX05PVF9GT1VORDsKKworIGVvZl9mb3VuZDoKKy8vCSAgTFpPX1VOVVNFRChvX20xX2EpOyBMWk9fVU5VU0VEKG9fbTFfYik7IExaT19VTlVTRUQob19tMik7CisvLwkgIExaT19VTlVTRUQob19tM19hKTsgTFpPX1VOVVNFRChvX20zX2IpOworCSpvdXRfbGVuID0gcGQob3AsIG91dCk7CisJcmV0dXJuIChpcCA9PSBpcF9lbmQgPyBMWk9fRV9PSyA6CisJCSAgIChpcCA8IGlwX2VuZAkgPyBMWk9fRV9JTlBVVF9OT1RfQ09OU1VNRUQgOiBMWk9fRV9JTlBVVF9PVkVSUlVOKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGX09TIEZfT1NfVU5JWAorI2RlZmluZSBGX0NTIEZfQ1NfTkFUSVZFCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBRExFUjMyX0lOSVRfVkFMVUUgMQorI2RlZmluZSBDUkMzMl9JTklUX1ZBTFVFICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VudW0geworCU1fTFpPMVhfMSAgICA9IDEsCisJTV9MWk8xWF8xXzE1ID0gMiwKKwlNX0xaTzFYXzk5OSAgPSAzLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBoZWFkZXIgZmxhZ3MgKi8KKyNkZWZpbmUgRl9BRExFUjMyX0QgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIEZfQURMRVIzMl9DICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBGX0hfRVhUUkFfRklFTEQgMHgwMDAwMDA0MEwKKyNkZWZpbmUgRl9IX0dNVERJRkYgICAgIDB4MDAwMDAwODBMCisjZGVmaW5lIEZfQ1JDMzJfRCAgICAgICAweDAwMDAwMTAwTAorI2RlZmluZSBGX0NSQzMyX0MgICAgICAgMHgwMDAwMDIwMEwKKyNkZWZpbmUgRl9IX0ZJTFRFUiAgICAgIDB4MDAwMDA4MDBMCisjZGVmaW5lIEZfSF9DUkMzMiAgICAgICAweDAwMDAxMDAwTAorI2RlZmluZSBGX01BU0sgICAgICAgICAgMHgwMDAwM0ZGRkwKKworLyogb3BlcmF0aW5nIHN5c3RlbSAmIGZpbGUgc3lzdGVtIHRoYXQgY3JlYXRlZCB0aGUgZmlsZSBbbW9zdGx5IHVudXNlZF0gKi8KKyNkZWZpbmUgRl9PU19VTklYICAgICAgIDB4MDMwMDAwMDBMCisjZGVmaW5lIEZfT1NfU0hJRlQgICAgICAyNAorI2RlZmluZSBGX09TX01BU0sgICAgICAgMHhmZjAwMDAwMEwKKworLyogY2hhcmFjdGVyIHNldCBmb3IgZmlsZSBuYW1lIGVuY29kaW5nIFttb3N0bHkgdW51c2VkXSAqLworI2RlZmluZSBGX0NTX05BVElWRSAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgRl9DU19TSElGVCAgICAgIDIwCisjZGVmaW5lIEZfQ1NfTUFTSyAgICAgICAweDAwZjAwMDAwTAorCisvKiB0aGVzZSBiaXRzIG11c3QgYmUgemVybyAqLworI2RlZmluZSBGX1JFU0VSVkVEICAgICAgKChGX01BU0sgfCBGX09TX01BU0sgfCBGX0NTX01BU0spIF4gMHhmZmZmZmZmZkwpCisKK3R5cGVkZWYgc3RydWN0IGNoa3N1bV90IHsKKwl1aW50MzJfdCBmX2FkbGVyMzI7CisJdWludDMyX3QgZl9jcmMzMjsKK30gY2hrc3VtX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhlYWRlcl90IHsKKwl1bnNpZ25lZCB2ZXJzaW9uOworCXVuc2lnbmVkIGxpYl92ZXJzaW9uOworCXVuc2lnbmVkIHZlcnNpb25fbmVlZGVkX3RvX2V4dHJhY3Q7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgbW9kZTsKKwl1aW50MzJfdCBtdGltZTsKKwl1aW50MzJfdCBnbXRkaWZmOworCXVpbnQzMl90IGhlYWRlcl9jaGVja3N1bTsKKworCXVpbnQzMl90IGV4dHJhX2ZpZWxkX2xlbjsKKwl1aW50MzJfdCBleHRyYV9maWVsZF9jaGVja3N1bTsKKworCXVuc2lnbmVkIGNoYXIgbWV0aG9kOworCXVuc2lnbmVkIGNoYXIgbGV2ZWw7CisKKwkvKiBpbmZvICovCisJY2hhciBuYW1lWzI1NSsxXTsKK30gaGVhZGVyX3Q7CisKK3N0cnVjdCBnbG9iYWxzIHsKKwkvKmNvbnN0IHVpbnQzMl90ICpsem9fY3JjMzJfdGFibGU7Ki8KKwljaGtzdW1fdCBjaGtzdW1faW47CisJY2hrc3VtX3QgY2hrc3VtX291dDsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKy8vI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisvLyNkZWZpbmUgSU5JVF9HKCkgZG8geworLy8JU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7CisvL30gd2hpbGUgKDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExaT1BfVkVSU0lPTiAgICAgICAgICAgIDB4MTAxMAorLy8jZGVmaW5lIExaT1BfVkVSU0lPTl9TVFJJTkcgICAgICIxLjAxIgorLy8jZGVmaW5lIExaT1BfVkVSU0lPTl9EQVRFICAgICAgICJBcHIgMjd0aCAyMDAzIgorCisjZGVmaW5lIE9QVElPTl9TVFJJTkcgImNmdmR0MTIzNDU2Nzg5Q0YiCisKK2VudW0geworCU9QVF9TVERPVVQgICAgICA9ICgxIDw8IDApLAorCU9QVF9GT1JDRSAgICAgICA9ICgxIDw8IDEpLAorCU9QVF9WRVJCT1NFICAgICA9ICgxIDw8IDIpLAorCU9QVF9ERUNPTVBSRVNTICA9ICgxIDw8IDMpLAorCU9QVF9URVNUICAgICAgICA9ICgxIDw8IDQpLAorCU9QVF8xICAgICAgICAgICA9ICgxIDw8IDUpLAorCU9QVF8yICAgICAgICAgICA9ICgxIDw8IDYpLAorCU9QVF8zICAgICAgICAgICA9ICgxIDw8IDcpLAorCU9QVF80ICAgICAgICAgICA9ICgxIDw8IDgpLAorCU9QVF81ICAgICAgICAgICA9ICgxIDw8IDkpLAorCU9QVF82ICAgICAgICAgICA9ICgxIDw8IDEwKSwKKwlPUFRfNzg5ICAgICAgICAgPSAoNyA8PCAxMSksCisJT1BUXzcgICAgICAgICAgID0gKDEgPDwgMTEpLAorCU9QVF84ICAgICAgICAgICA9ICgxIDw8IDEyKSwKKwlPUFRfQyAgICAgICAgICAgPSAoMSA8PCAxNCksCisJT1BUX0YgICAgICAgICAgID0gKDEgPDwgMTUpLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBhZGxlcjMyIGNoZWNrc3VtCisvLyBhZGFwdGVkIGZyb20gZnJlZSBjb2RlIGJ5IE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+CisvLyBzZWUgaHR0cDovL3d3dy56bGliLm9yZy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEZBU1RfRlVOQyB1aW50MzJfdAorbHpvX2FkbGVyMzIodWludDMyX3QgYWRsZXIsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdW5zaWduZWQgbGVuKQoreworCWVudW0geworCQlMWk9fQkFTRSA9IDY1NTIxLCAvKiBsYXJnZXN0IHByaW1lIHNtYWxsZXIgdGhhbiA2NTUzNiAqLworCQkvKiBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0CisJCSAqIDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEgKi8KKwkJTFpPX05NQVggPSA1NTUyLAorCX07CisJdWludDMyX3QgczEgPSBhZGxlciAmIDB4ZmZmZjsKKwl1aW50MzJfdCBzMiA9IChhZGxlciA+PiAxNikgJiAweGZmZmY7CisJdW5zaWduZWQgazsKKworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlrID0gbGVuIDwgTFpPX05NQVggPyAodW5zaWduZWQpIGxlbiA6IExaT19OTUFYOworCQlsZW4gLT0gazsKKwkJaWYgKGsgIT0gMCkgZG8geworCQkJczEgKz0gKmJ1ZisrOworCQkJczIgKz0gczE7CisJCX0gd2hpbGUgKC0tayA+IDApOworCQlzMSAlPSBMWk9fQkFTRTsKKwkJczIgJT0gTFpPX0JBU0U7CisJfQorCXJldHVybiAoczIgPDwgMTYpIHwgczE7Cit9CisKK3N0YXRpYyBGQVNUX0ZVTkMgdWludDMyX3QKK2x6b19jcmMzMih1aW50MzJfdCBjLCBjb25zdCB1aW50OF90KiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKwkvL2lmIChidWYgPT0gTlVMTCkgLSBpbXBvc3NpYmxlCisJLy8JcmV0dXJuIDA7CisKKwlyZXR1cm4gfmNyYzMyX2Jsb2NrX2VuZGlhbjAofmMsIGJ1ZiwgbGVuLCBnbG9iYWxfY3JjMzJfdGFibGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGluaXRfY2hrc3VtKGNoa3N1bV90ICpjdCkKK3sKKwljdC0+Zl9hZGxlcjMyID0gQURMRVIzMl9JTklUX1ZBTFVFOworCWN0LT5mX2NyYzMyID0gQ1JDMzJfSU5JVF9WQUxVRTsKK30KKworc3RhdGljIHZvaWQgYWRkX2J5dGVzX3RvX2Noa3N1bShjaGtzdW1fdCAqY3QsIGNvbnN0IHZvaWQqIGJ1ZiwgaW50IGNudCkKK3sKKwkvKiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgdHdvIGNoZWNrc3VtcyBhdCBvbmNlLCBiZWNhdXNlIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyLCB3ZSBkb24ndCBrbm93IHlldCB3aGljaCBvbmUgd2UnbGwKKwkgKiBldmVudHVhbGx5IG5lZWQgKi8KKwljdC0+Zl9hZGxlcjMyID0gbHpvX2FkbGVyMzIoY3QtPmZfYWRsZXIzMiwgKGNvbnN0IHVpbnQ4X3QqKWJ1ZiwgY250KTsKKwljdC0+Zl9jcmMzMiA9IGx6b19jcmMzMihjdC0+Zl9jcmMzMiwgKGNvbnN0IHVpbnQ4X3QqKWJ1ZiwgY250KTsKK30KKworc3RhdGljIHVpbnQzMl90IGNoa3N1bV9nZXRyZXN1bHQoY2hrc3VtX3QgKmN0LCBjb25zdCBoZWFkZXJfdCAqaCkKK3sKKwlyZXR1cm4gKGgtPmZsYWdzICYgRl9IX0NSQzMyKSA/IGN0LT5mX2NyYzMyIDogY3QtPmZfYWRsZXIzMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDMyX3QgcmVhZDMyKHZvaWQpCit7CisJdWludDMyX3QgdjsKKwl4cmVhZCgwLCAmdiwgNCk7CisJcmV0dXJuIG50b2hsKHYpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZTMyKHVpbnQzMl90IHYpCit7CisJdiA9IGh0b25sKHYpOworCXh3cml0ZSgxLCAmdiwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIGZfd3JpdGUoY29uc3Qgdm9pZCogYnVmLCBpbnQgY250KQoreworCXh3cml0ZSgxLCBidWYsIGNudCk7CisJYWRkX2J5dGVzX3RvX2Noa3N1bSgmRy5jaGtzdW1fb3V0LCBidWYsIGNudCk7Cit9CisKK3N0YXRpYyB2b2lkIGZfcmVhZCh2b2lkKiBidWYsIGludCBjbnQpCit7CisJeHJlYWQoMCwgYnVmLCBjbnQpOworCWFkZF9ieXRlc190b19jaGtzdW0oJkcuY2hrc3VtX2luLCBidWYsIGNudCk7Cit9CisKK3N0YXRpYyBpbnQgZl9yZWFkOCh2b2lkKQoreworCXVpbnQ4X3QgdjsKKwlmX3JlYWQoJnYsIDEpOworCXJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCBmX3dyaXRlOCh1aW50OF90IHYpCit7CisJZl93cml0ZSgmdiwgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBmX3JlYWQxNih2b2lkKQoreworCXVpbnQxNl90IHY7CisJZl9yZWFkKCZ2LCAyKTsKKwlyZXR1cm4gbnRvaHModik7Cit9CisKK3N0YXRpYyB2b2lkIGZfd3JpdGUxNih1aW50MTZfdCB2KQoreworCXYgPSBodG9ucyh2KTsKKwlmX3dyaXRlKCZ2LCAyKTsKK30KKworc3RhdGljIHVpbnQzMl90IGZfcmVhZDMyKHZvaWQpCit7CisJdWludDMyX3QgdjsKKwlmX3JlYWQoJnYsIDQpOworCXJldHVybiBudG9obCh2KTsKK30KKworc3RhdGljIHZvaWQgZl93cml0ZTMyKHVpbnQzMl90IHYpCit7CisJdiA9IGh0b25sKHYpOworCWZfd3JpdGUoJnYsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbHpvX2dldF9tZXRob2QoaGVhZGVyX3QgKmgpCit7CisJLyogY2hlY2sgbWV0aG9kICovCisJaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzEpIHsKKwkJaWYgKGgtPmxldmVsID09IDApCisJCQloLT5sZXZlbCA9IDM7CisJfSBlbHNlIGlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF8xXzE1KSB7CisJCWlmIChoLT5sZXZlbCA9PSAwKQorCQkJaC0+bGV2ZWwgPSAxOworCX0gZWxzZSBpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfOTk5KSB7CisJCWlmIChoLT5sZXZlbCA9PSAwKQorCQkJaC0+bGV2ZWwgPSA5OworCX0gZWxzZQorCQlyZXR1cm4gLTE7CQkvKiBub3QgYSBMWk8gbWV0aG9kICovCisKKwkvKiBjaGVjayBjb21wcmVzc2lvbiBsZXZlbCAqLworCWlmIChoLT5sZXZlbCA8IDEgfHwgaC0+bGV2ZWwgPiA5KQorCQlyZXR1cm4gMTU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExaT19CTE9DS19TSVpFCSgyNTYgKiAxMDI0bCkKKyNkZWZpbmUgTUFYX0JMT0NLX1NJWkUJKDY0ICogMTAyNGwgKiAxMDI0bCkJLyogRE8gTk9UIENIQU5HRSAqLworCisvKiBMWk8gbWF5IGV4cGFuZCB1bmNvbXByZXNzaWJsZSBkYXRhIGJ5IGEgc21hbGwgYW1vdW50ICovCisjZGVmaW5lIE1BWF9DT01QUkVTU0VEX1NJWkUoeCkJKCh4KSArICh4KSAvIDE2ICsgNjQgKyAzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGNvbXByZXNzIGEgZmlsZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTk9JTkxJTkUgc21hbGxpbnQgbHpvX2NvbXByZXNzKGNvbnN0IGhlYWRlcl90ICpoKQoreworCXVuc2lnbmVkIGJsb2NrX3NpemUgPSBMWk9fQkxPQ0tfU0laRTsKKwlpbnQgciA9IDA7IC8qIExaT19FX09LICovCisJdWludDhfdCAqY29uc3QgYjEgPSB4emFsbG9jKGJsb2NrX3NpemUpOworCXVpbnQ4X3QgKmNvbnN0IGIyID0geHphbGxvYyhNQVhfQ09NUFJFU1NFRF9TSVpFKGJsb2NrX3NpemUpKTsKKwl1bnNpZ25lZCBzcmNfbGVuID0gMCwgZHN0X2xlbiA9IDA7CisJdWludDMyX3QgZF9hZGxlcjMyID0gQURMRVIzMl9JTklUX1ZBTFVFOworCXVpbnQzMl90IGRfY3JjMzIgPSBDUkMzMl9JTklUX1ZBTFVFOworCWludCBsOworCXNtYWxsaW50IG9rID0gMTsKKwl1aW50OF90ICp3cmtfbWVtID0gTlVMTDsKKworCWlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF8xKQorCQl3cmtfbWVtID0geHphbGxvYyhMWk8xWF8xX01FTV9DT01QUkVTUyk7CisJZWxzZSBpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfMV8xNSkKKwkJd3JrX21lbSA9IHh6YWxsb2MoTFpPMVhfMV8xNV9NRU1fQ09NUFJFU1MpOworCWVsc2UgaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzk5OSkKKwkJd3JrX21lbSA9IHh6YWxsb2MoTFpPMVhfOTk5X01FTV9DT01QUkVTUyk7CisKKwlmb3IgKDs7KSB7CisJCS8qIHJlYWQgYSBibG9jayAqLworCQlsID0gZnVsbF9yZWFkKDAsIGIxLCBibG9ja19zaXplKTsKKwkJc3JjX2xlbiA9IChsID4gMCA/IGwgOiAwKTsKKworCQkvKiB3cml0ZSB1bmNvbXByZXNzZWQgYmxvY2sgc2l6ZSAqLworCQl3cml0ZTMyKHNyY19sZW4pOworCisJCS8qIGV4aXQgaWYgbGFzdCBibG9jayAqLworCQlpZiAoc3JjX2xlbiA9PSAwKQorCQkJYnJlYWs7CisKKwkJLyogY29tcHV0ZSBjaGVja3N1bSBvZiB1bmNvbXByZXNzZWQgYmxvY2sgKi8KKwkJaWYgKGgtPmZsYWdzICYgRl9BRExFUjMyX0QpCisJCQlkX2FkbGVyMzIgPSBsem9fYWRsZXIzMihBRExFUjMyX0lOSVRfVkFMVUUsIGIxLCBzcmNfbGVuKTsKKwkJaWYgKGgtPmZsYWdzICYgRl9DUkMzMl9EKQorCQkJZF9jcmMzMiA9IGx6b19jcmMzMihDUkMzMl9JTklUX1ZBTFVFLCBiMSwgc3JjX2xlbik7CisKKwkJLyogY29tcHJlc3MgKi8KKwkJaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzEpCisJCQlyID0gbHpvMXhfMV9jb21wcmVzcyhiMSwgc3JjX2xlbiwgYjIsICZkc3RfbGVuLCB3cmtfbWVtKTsKKwkJZWxzZSBpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfMV8xNSkKKwkJCXIgPSBsem8xeF8xXzE1X2NvbXByZXNzKGIxLCBzcmNfbGVuLCBiMiwgJmRzdF9sZW4sIHdya19tZW0pOworI2lmIEVOQUJMRV9MWk9QX0NPTVBSX0hJR0gKKwkJZWxzZSBpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfOTk5KQorCQkJciA9IGx6bzF4Xzk5OV9jb21wcmVzc19sZXZlbChiMSwgc3JjX2xlbiwgYjIsICZkc3RfbGVuLAorCQkJCQkJd3JrX21lbSwgaC0+bGV2ZWwpOworI2VuZGlmCisJCWVsc2UKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcm5hbCBlcnJvciIpOworCisJCWlmIChyICE9IDApIC8qIG5vdCBMWk9fRV9PSyAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludGVybmFsIGVycm9yIC0gY29tcHJlc3Npb24gZmFpbGVkIik7CisKKwkJLyogd3JpdGUgY29tcHJlc3NlZCBibG9jayBzaXplICovCisJCWlmIChkc3RfbGVuIDwgc3JjX2xlbikgeworCQkJLyogb3B0aW1pemUgKi8KKwkJCWlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF85OTkpIHsKKwkJCQl1bnNpZ25lZCBuZXdfbGVuID0gc3JjX2xlbjsKKwkJCQlyID0gbHpvMXhfb3B0aW1pemUoYjIsIGRzdF9sZW4sIGIxLCAmbmV3X2xlbiwgTlVMTCk7CisJCQkJaWYgKHIgIT0gMCAvKkxaT19FX09LKi8gfHwgbmV3X2xlbiAhPSBzcmNfbGVuKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW50ZXJuYWwgZXJyb3IgLSBvcHRpbWl6YXRpb24gZmFpbGVkIik7CisJCQl9CisJCQl3cml0ZTMyKGRzdF9sZW4pOworCQl9IGVsc2UgeworCQkJLyogZGF0YSBhY3R1YWxseSBleHBhbmRlZCA9PiBzdG9yZSBkYXRhIHVuY29tcHJlc3NlZCAqLworCQkJd3JpdGUzMihzcmNfbGVuKTsKKwkJfQorCisJCS8qIHdyaXRlIGNoZWNrc3VtIG9mIHVuY29tcHJlc3NlZCBibG9jayAqLworCQlpZiAoaC0+ZmxhZ3MgJiBGX0FETEVSMzJfRCkKKwkJCXdyaXRlMzIoZF9hZGxlcjMyKTsKKwkJaWYgKGgtPmZsYWdzICYgRl9DUkMzMl9EKQorCQkJd3JpdGUzMihkX2NyYzMyKTsKKworCQlpZiAoZHN0X2xlbiA8IHNyY19sZW4pIHsKKwkJCS8qIHdyaXRlIGNoZWNrc3VtIG9mIGNvbXByZXNzZWQgYmxvY2sgKi8KKwkJCWlmIChoLT5mbGFncyAmIEZfQURMRVIzMl9DKQorCQkJCXdyaXRlMzIobHpvX2FkbGVyMzIoQURMRVIzMl9JTklUX1ZBTFVFLCBiMiwgZHN0X2xlbikpOworCQkJaWYgKGgtPmZsYWdzICYgRl9DUkMzMl9DKQorCQkJCXdyaXRlMzIobHpvX2NyYzMyKENSQzMyX0lOSVRfVkFMVUUsIGIyLCBkc3RfbGVuKSk7CisJCQkvKiB3cml0ZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEgKi8KKwkJCXh3cml0ZSgxLCBiMiwgZHN0X2xlbik7CisJCX0gZWxzZSB7CisJCQkvKiB3cml0ZSB1bmNvbXByZXNzZWQgYmxvY2sgZGF0YSAqLworCQkJeHdyaXRlKDEsIGIxLCBzcmNfbGVuKTsKKwkJfQorCX0KKworCWZyZWUod3JrX21lbSk7CisJZnJlZShiMSk7CisJZnJlZShiMik7CisJcmV0dXJuIG9rOworfQorCitzdGF0aWMgRkFTVF9GVU5DIHZvaWQgbHpvX2NoZWNrKAorCQl1aW50MzJfdCBpbml0LAorCQl1aW50OF90KiBidWYsIHVuc2lnbmVkIGxlbiwKKwkJdWludDMyX3QgRkFTVF9GVU5DICgqZm4pKHVpbnQzMl90LCBjb25zdCB1aW50OF90KiwgdW5zaWduZWQpLAorCQl1aW50MzJfdCByZWYpCit7CisJLyogVGhpcyBmdW5jdGlvbiwgYnkgaGF2aW5nIHRoZSBzYW1lIG9yZGVyIG9mIHBhcmFtZXRlcnMKKwkgKiBhcyBmbiwgYW5kIGJ5IGJlaW5nIG1hcmtlZCBGQVNUX0ZVTkMgKHNhbWUgYXMgZm4pLAorCSAqIHNhdmVzIGEgZG96ZW4gYnl0ZXMgb2YgY29kZS4KKwkgKi8KKwl1aW50MzJfdCBjID0gZm4oaW5pdCwgYnVmLCBsZW4pOworCWlmIChjICE9IHJlZikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNoZWNrc3VtIGVycm9yIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gZGVjb21wcmVzcyBhIGZpbGUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIE5PSU5MSU5FIHNtYWxsaW50IGx6b19kZWNvbXByZXNzKGNvbnN0IGhlYWRlcl90ICpoKQoreworCXVuc2lnbmVkIGJsb2NrX3NpemUgPSBMWk9fQkxPQ0tfU0laRTsKKwlpbnQgcjsKKwl1aW50MzJfdCBzcmNfbGVuLCBkc3RfbGVuOworCXVpbnQzMl90IGNfYWRsZXIzMiA9IEFETEVSMzJfSU5JVF9WQUxVRTsKKwl1aW50MzJfdCBkX2FkbGVyMzIgPSBBRExFUjMyX0lOSVRfVkFMVUU7CisJdWludDMyX3QgY19jcmMzMiA9IENSQzMyX0lOSVRfVkFMVUUsIGRfY3JjMzIgPSBDUkMzMl9JTklUX1ZBTFVFOworCXNtYWxsaW50IG9rID0gMTsKKwl1aW50OF90ICpiMTsKKwl1aW50MzJfdCBtY3NfYmxvY2tfc2l6ZSA9IE1BWF9DT01QUkVTU0VEX1NJWkUoYmxvY2tfc2l6ZSk7CisJdWludDhfdCAqYjIgPSBOVUxMOworCisJZm9yICg7OykgeworCQl1aW50OF90ICpkc3Q7CisKKwkJLyogcmVhZCB1bmNvbXByZXNzZWQgYmxvY2sgc2l6ZSAqLworCQlkc3RfbGVuID0gcmVhZDMyKCk7CisKKwkJLyogZXhpdCBpZiBsYXN0IGJsb2NrICovCisJCWlmIChkc3RfbGVuID09IDApCisJCQlicmVhazsKKworCQkvKiBlcnJvciBpZiBzcGxpdCBmaWxlICovCisJCWlmIChkc3RfbGVuID09IDB4ZmZmZmZmZmZMKQorCQkJLyogc2hvdWxkIG5vdCBoYXBwZW4gLSBub3QgeWV0IGltcGxlbWVudGVkICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGhpcyBmaWxlIGlzIGEgc3BsaXQgbHpvcCBmaWxlIik7CisKKwkJaWYgKGRzdF9sZW4gPiBNQVhfQkxPQ0tfU0laRSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb3JydXB0ZWQgZGF0YSIpOworCisJCS8qIHJlYWQgY29tcHJlc3NlZCBibG9jayBzaXplICovCisJCXNyY19sZW4gPSByZWFkMzIoKTsKKwkJaWYgKHNyY19sZW4gPD0gMCB8fCBzcmNfbGVuID4gZHN0X2xlbikKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb3JydXB0ZWQgZGF0YSIpOworCisJCWlmIChkc3RfbGVuID4gYmxvY2tfc2l6ZSkgeworCQkJaWYgKGIyKSB7CisJCQkJZnJlZShiMik7CisJCQkJYjIgPSBOVUxMOworCQkJfQorCQkJYmxvY2tfc2l6ZSA9IGRzdF9sZW47CisJCQltY3NfYmxvY2tfc2l6ZSA9IE1BWF9DT01QUkVTU0VEX1NJWkUoYmxvY2tfc2l6ZSk7CisJCX0KKworCQkvKiByZWFkIGNoZWNrc3VtIG9mIHVuY29tcHJlc3NlZCBibG9jayAqLworCQlpZiAoaC0+ZmxhZ3MgJiBGX0FETEVSMzJfRCkKKwkJCWRfYWRsZXIzMiA9IHJlYWQzMigpOworCQlpZiAoaC0+ZmxhZ3MgJiBGX0NSQzMyX0QpCisJCQlkX2NyYzMyID0gcmVhZDMyKCk7CisKKwkJLyogcmVhZCBjaGVja3N1bSBvZiBjb21wcmVzc2VkIGJsb2NrICovCisJCWlmIChzcmNfbGVuIDwgZHN0X2xlbikgeworCQkJaWYgKGgtPmZsYWdzICYgRl9BRExFUjMyX0MpCisJCQkJY19hZGxlcjMyID0gcmVhZDMyKCk7CisJCQlpZiAoaC0+ZmxhZ3MgJiBGX0NSQzMyX0MpCisJCQkJY19jcmMzMiA9IHJlYWQzMigpOworCQl9CisKKwkJaWYgKGIyID09IE5VTEwpCisJCQliMiA9IHh6YWxsb2MobWNzX2Jsb2NrX3NpemUpOworCQkvKiByZWFkIHRoZSBibG9jayBpbnRvIHRoZSBlbmQgb2Ygb3VyIGJ1ZmZlciAqLworCQliMSA9IGIyICsgbWNzX2Jsb2NrX3NpemUgLSBzcmNfbGVuOworCQl4cmVhZCgwLCBiMSwgc3JjX2xlbik7CisKKwkJaWYgKHNyY19sZW4gPCBkc3RfbGVuKSB7CisJCQl1bnNpZ25lZCBkID0gZHN0X2xlbjsKKworCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9GKSkgeworCQkJCS8qIHZlcmlmeSBjaGVja3N1bSBvZiBjb21wcmVzc2VkIGJsb2NrICovCisJCQkJaWYgKGgtPmZsYWdzICYgRl9BRExFUjMyX0MpCisJCQkJCWx6b19jaGVjayhBRExFUjMyX0lOSVRfVkFMVUUsCisJCQkJCQkJYjEsIHNyY19sZW4sCisJCQkJCQkJbHpvX2FkbGVyMzIsIGNfYWRsZXIzMik7CisJCQkJaWYgKGgtPmZsYWdzICYgRl9DUkMzMl9DKQorCQkJCQlsem9fY2hlY2soQ1JDMzJfSU5JVF9WQUxVRSwKKwkJCQkJCQliMSwgc3JjX2xlbiwKKwkJCQkJCQlsem9fY3JjMzIsIGNfY3JjMzIpOworCQkJfQorCisJCQkvKiBkZWNvbXByZXNzICovCisvLwkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0YpCisvLwkJCQlyID0gbHpvMXhfZGVjb21wcmVzcyhiMSwgc3JjX2xlbiwgYjIsICZkLCBOVUxMKTsKKy8vCQkJZWxzZQorCQkJCXIgPSBsem8xeF9kZWNvbXByZXNzX3NhZmUoYjEsIHNyY19sZW4sIGIyLCAmZCwgTlVMTCk7CisKKwkJCWlmIChyICE9IDAgLypMWk9fRV9PSyovIHx8IGRzdF9sZW4gIT0gZCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb3JydXB0ZWQgZGF0YSIpOworCQkJfQorCQkJZHN0ID0gYjI7CisJCX0gZWxzZSB7CisJCQkvKiAic3RvcmVkIiBibG9jayA9PiBubyBkZWNvbXByZXNzaW9uICovCisJCQlkc3QgPSBiMTsKKwkJfQorCisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfRikpIHsKKwkJCS8qIHZlcmlmeSBjaGVja3N1bSBvZiB1bmNvbXByZXNzZWQgYmxvY2sgKi8KKwkJCWlmIChoLT5mbGFncyAmIEZfQURMRVIzMl9EKQorCQkJCWx6b19jaGVjayhBRExFUjMyX0lOSVRfVkFMVUUsCisJCQkJCWRzdCwgZHN0X2xlbiwKKwkJCQkJbHpvX2FkbGVyMzIsIGRfYWRsZXIzMik7CisJCQlpZiAoaC0+ZmxhZ3MgJiBGX0NSQzMyX0QpCisJCQkJbHpvX2NoZWNrKENSQzMyX0lOSVRfVkFMVUUsCisJCQkJCWRzdCwgZHN0X2xlbiwKKwkJCQkJbHpvX2NyYzMyLCBkX2NyYzMyKTsKKwkJfQorCisJCS8qIHdyaXRlIHVuY29tcHJlc3NlZCBibG9jayBkYXRhICovCisJCXh3cml0ZSgxLCBkc3QsIGRzdF9sZW4pOworCX0KKworCWZyZWUoYjIpOworCXJldHVybiBvazsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBsem9wIGZpbGUgc2lnbmF0dXJlIChzaGFtZWxlc3NseSBib3Jyb3dlZCBmcm9tIFBORykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoZSBmaXJzdCBuaW5lIGJ5dGVzIG9mIGEgbHpvcCBmaWxlIGFsd2F5cyBjb250YWluIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLQorICogKGhleCkgICAgICAgICAgICAgICAgICAgICAgICAgIDg5ICA0YyAgNWEgIDRmICAwMCAgMGQgIDBhICAxYSAgMGEKKyAqIChkZWNpbWFsKSAgICAgICAgICAgICAgICAgICAgIDEzNyAgNzYgIDkwICA3OSAgIDAgIDEzICAxMCAgMjYgIDEwCisgKiAoQyBub3RhdGlvbiAtIEFTQ0lJKSAgICAgICAgIFwyMTEgICBMICAgWiAgIE8gIFwwICBcciAgXG4gXDAzMiBcbgorICovCisKKy8qICh2ZGEpIGNvbXBhcmlzb24gd2l0aCBsem9wIHYxLjAycmMxICgibHpvcCAtMSA8RklMRSIgY21kKToKKyAqIE9ubHkgc2xpZ2h0IGRpZmZlcmVuY2VzIGluIGhlYWRlcjoKKyAqIC0wMDAwMDAwMCAgODkgNGMgNWEgNGYgMDAgMGQgMGEgMWEgMGEgMTAgMjAgMjAgMjAgMDkgNDAgMDIKKyAqICswMDAwMDAwMCAgODkgNGMgNWEgNGYgMDAgMGQgMGEgMWEgMGEgMTAgMTAgMjAgMzAgMDkgNDAgMDIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl4gXl5eXl4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gbGliX3ZlcnNpb24KKyAqIC0wMDAwMDAxMCAgMDEgMDMgMDAgMDAgMGQgMDAgMDAgODEgYTQgNDkgZjcgYTYgM2YgMDAgMDAgMDAKKyAqICswMDAwMDAxMCAgMDEgMDMgMDAgMDAgMDEgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKyAqICAgICAgICAgICAgICAgXl5eXl5eXl5eXl4gXl5eXl5eXl5eXl4gXl5eXl5eXl5eXl4KKyAqICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgbW9kZSAgICAgICAgbXRpbWUKKyAqIC0wMDAwMDAyMCAgMDAgMDAgMmQgNjcgMDQgMTcgMDAgMDQgMDAgMDAgMDAgMDMgZWQgZWMgOWQgNmQKKyAqICswMDAwMDAyMCAgMDAgMDAgMTAgNWYgMDAgYzEgMDAgMDQgMDAgMDAgMDAgMDMgZWQgZWMgOWQgNmQKKyAqICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl4KKyAqICAgICAgICAgICAgICAgICAgY2hrc3VtX291dAorICogVGhlIHJlc3QgaXMgaWRlbnRpY2FsLgorKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGx6b3BfbWFnaWNbOV0gPSB7CisJMHg4OSwgMHg0YywgMHg1YSwgMHg0ZiwgMHgwMCwgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYQorfTsKKworLyogVGhpcyBjb2RpbmcgaXMgZGVyaXZlZCBmcm9tIEFsZXhhbmRlciBMZWhtYW5uJ3MgcG5nY2hlY2sgY29kZS4gKi8KK3N0YXRpYyB2b2lkIGNoZWNrX21hZ2ljKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBtYWdpY1tzaXplb2YobHpvcF9tYWdpYyldOworCXhyZWFkKDAsIG1hZ2ljLCBzaXplb2YobWFnaWMpKTsKKwlpZiAobWVtY21wKG1hZ2ljLCBsem9wX21hZ2ljLCBzaXplb2YobHpvcF9tYWdpYykpICE9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgbWFnaWMgbnVtYmVyIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gbHpvcCBmaWxlIGhlYWRlcgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3cml0ZV9oZWFkZXIoY29uc3QgaGVhZGVyX3QgKmgpCit7CisJaW50IGw7CisKKwl4d3JpdGUoMSwgbHpvcF9tYWdpYywgc2l6ZW9mKGx6b3BfbWFnaWMpKTsKKworCWluaXRfY2hrc3VtKCZHLmNoa3N1bV9vdXQpOworCisJZl93cml0ZTE2KGgtPnZlcnNpb24pOworCWZfd3JpdGUxNihoLT5saWJfdmVyc2lvbik7CisJZl93cml0ZTE2KGgtPnZlcnNpb25fbmVlZGVkX3RvX2V4dHJhY3QpOworCWZfd3JpdGU4KGgtPm1ldGhvZCk7CisJZl93cml0ZTgoaC0+bGV2ZWwpOworCWZfd3JpdGUzMihoLT5mbGFncyk7CisJZl93cml0ZTMyKGgtPm1vZGUpOworCWZfd3JpdGUzMihoLT5tdGltZSk7CisJZl93cml0ZTMyKGgtPmdtdGRpZmYpOworCisJbCA9IChpbnQpIHN0cmxlbihoLT5uYW1lKTsKKwlmX3dyaXRlOChsKTsKKwlpZiAobCkKKwkJZl93cml0ZShoLT5uYW1lLCBsKTsKKworCWZfd3JpdGUzMihjaGtzdW1fZ2V0cmVzdWx0KCZHLmNoa3N1bV9vdXQsIGgpKTsKK30KKworc3RhdGljIGludCByZWFkX2hlYWRlcihoZWFkZXJfdCAqaCkKK3sKKwlpbnQgcjsKKwlpbnQgbDsKKwl1aW50MzJfdCBjaGVja3N1bTsKKworCW1lbXNldChoLCAwLCBzaXplb2YoKmgpKTsKKwloLT52ZXJzaW9uX25lZWRlZF90b19leHRyYWN0ID0gMHgwOTAwOwkvKiBmaXJzdCBsem9wIHZlcnNpb24gKi8KKwloLT5sZXZlbCA9IDA7CisKKwlpbml0X2Noa3N1bSgmRy5jaGtzdW1faW4pOworCisJaC0+dmVyc2lvbiA9IGZfcmVhZDE2KCk7CisJaWYgKGgtPnZlcnNpb24gPCAweDA5MDApCisJCXJldHVybiAzOworCWgtPmxpYl92ZXJzaW9uID0gZl9yZWFkMTYoKTsKKwlpZiAoaC0+dmVyc2lvbiA+PSAweDA5NDApIHsKKwkJaC0+dmVyc2lvbl9uZWVkZWRfdG9fZXh0cmFjdCA9IGZfcmVhZDE2KCk7CisJCWlmIChoLT52ZXJzaW9uX25lZWRlZF90b19leHRyYWN0ID4gTFpPUF9WRVJTSU9OKQorCQkJcmV0dXJuIDE2OworCQlpZiAoaC0+dmVyc2lvbl9uZWVkZWRfdG9fZXh0cmFjdCA8IDB4MDkwMCkKKwkJCXJldHVybiAzOworCX0KKwloLT5tZXRob2QgPSBmX3JlYWQ4KCk7CisJaWYgKGgtPnZlcnNpb24gPj0gMHgwOTQwKQorCQloLT5sZXZlbCA9IGZfcmVhZDgoKTsKKwloLT5mbGFncyA9IGZfcmVhZDMyKCk7CisJaWYgKGgtPmZsYWdzICYgRl9IX0ZJTFRFUikKKwkJcmV0dXJuIDE2OyAvKiBmaWx0ZXIgbm90IHN1cHBvcnRlZCAqLworCWgtPm1vZGUgPSBmX3JlYWQzMigpOworCWgtPm10aW1lID0gZl9yZWFkMzIoKTsKKwlpZiAoaC0+dmVyc2lvbiA+PSAweDA5NDApCisJCWgtPmdtdGRpZmYgPSBmX3JlYWQzMigpOworCisJbCA9IGZfcmVhZDgoKTsKKwlpZiAobCA+IDApCisJCWZfcmVhZChoLT5uYW1lLCBsKTsKKwloLT5uYW1lW2xdID0gMDsKKworCWNoZWNrc3VtID0gY2hrc3VtX2dldHJlc3VsdCgmRy5jaGtzdW1faW4sIGgpOworCWgtPmhlYWRlcl9jaGVja3N1bSA9IGZfcmVhZDMyKCk7CisJaWYgKGgtPmhlYWRlcl9jaGVja3N1bSAhPSBjaGVja3N1bSkKKwkJcmV0dXJuIDI7CisKKwlpZiAoaC0+bWV0aG9kIDw9IDApCisJCXJldHVybiAxNDsKKwlyID0gbHpvX2dldF9tZXRob2QoaCk7CisJaWYgKHIgIT0gMCkKKwkJcmV0dXJuIHI7CisKKwkvKiBjaGVjayByZXNlcnZlZCBmbGFncyAqLworCWlmIChoLT5mbGFncyAmIEZfUkVTRVJWRUQpCisJCXJldHVybiAtMTM7CisKKwkvKiBza2lwIGV4dHJhIGZpZWxkIFtub3QgdXNlZCB5ZXRdICovCisJaWYgKGgtPmZsYWdzICYgRl9IX0VYVFJBX0ZJRUxEKSB7CisJCXVpbnQzMl90IGs7CisKKwkJLyogbm90ZTogdGhlIGNoZWNrc3VtIGFsc28gY292ZXJzIHRoZSBsZW5ndGggKi8KKwkJaW5pdF9jaGtzdW0oJkcuY2hrc3VtX2luKTsKKwkJaC0+ZXh0cmFfZmllbGRfbGVuID0gZl9yZWFkMzIoKTsKKwkJZm9yIChrID0gMDsgayA8IGgtPmV4dHJhX2ZpZWxkX2xlbjsgaysrKQorCQkJZl9yZWFkOCgpOworCQljaGVja3N1bSA9IGNoa3N1bV9nZXRyZXN1bHQoJkcuY2hrc3VtX2luLCBoKTsKKwkJaC0+ZXh0cmFfZmllbGRfY2hlY2tzdW0gPSBmX3JlYWQzMigpOworCQlpZiAoaC0+ZXh0cmFfZmllbGRfY2hlY2tzdW0gIT0gY2hlY2tzdW0pCisJCQlyZXR1cm4gMzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcF9oZWFkZXIoaGVhZGVyX3QgKmgpCit7CisJaW50IHI7CisKKwlyID0gcmVhZF9oZWFkZXIoaCk7CisJaWYgKHIgPT0gMCkKKwkJcmV0dXJuOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJoZWFkZXJfZXJyb3IgJWQiLCByKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBjb21wcmVzcworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBsem9fc2V0X21ldGhvZChoZWFkZXJfdCAqaCkKK3sKKwlpbnQgbGV2ZWwgPSAxOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfMSkgeworCQloLT5tZXRob2QgPSBNX0xaTzFYXzFfMTU7CisJfSBlbHNlIGlmIChvcHRpb25fbWFzazMyICYgT1BUXzc4OSkgeworI2lmIEVOQUJMRV9MWk9QX0NPTVBSX0hJR0gKKwkJaC0+bWV0aG9kID0gTV9MWk8xWF85OTk7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUXzcpCisJCQlsZXZlbCA9IDc7CisJCWVsc2UgaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfOCkKKwkJCWxldmVsID0gODsKKwkJZWxzZQorCQkJbGV2ZWwgPSA5OworI2Vsc2UKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImhpZ2ggY29tcHJlc3Npb24gbm90IGNvbXBpbGVkIGluIik7CisjZW5kaWYKKwl9IGVsc2UgeyAvKiBsZXZlbHMgMi4uNiBvciBub25lIChkZWZhdWx0cyB0byBsZXZlbCAzKSAqLworCQloLT5tZXRob2QgPSBNX0xaTzFYXzE7CisJCWxldmVsID0gNTsgLyogbGV2ZWxzIDItNiBhcmUgYWN0dWFsbHkgdGhlIHNhbWUgKi8KKwl9CisKKwloLT5sZXZlbCA9IGxldmVsOworfQorCitzdGF0aWMgc21hbGxpbnQgZG9fbHpvX2NvbXByZXNzKHZvaWQpCit7CisJaGVhZGVyX3QgaGVhZGVyOworCisjZGVmaW5lIGggKCZoZWFkZXIpCisJbWVtc2V0KGgsIDAsIHNpemVvZigqaCkpOworCisJbHpvX3NldF9tZXRob2QoaCk7CisKKwloLT52ZXJzaW9uID0gKExaT1BfVkVSU0lPTiAmIDB4ZmZmZik7CisJaC0+dmVyc2lvbl9uZWVkZWRfdG9fZXh0cmFjdCA9IDB4MDk0MDsKKwloLT5saWJfdmVyc2lvbiA9IGx6b192ZXJzaW9uKCkgJiAweGZmZmY7CisKKwloLT5mbGFncyA9IChGX09TICYgRl9PU19NQVNLKSB8IChGX0NTICYgRl9DU19NQVNLKTsKKworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfRikgfHwgaC0+bWV0aG9kID09IE1fTFpPMVhfOTk5KSB7CisJCWgtPmZsYWdzIHw9IEZfQURMRVIzMl9EOworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9DKQorCQkJaC0+ZmxhZ3MgfD0gRl9BRExFUjMyX0M7CisJfQorCXdyaXRlX2hlYWRlcihoKTsKKwlyZXR1cm4gbHpvX2NvbXByZXNzKGgpOworI3VuZGVmIGgKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBkZWNvbXByZXNzCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzbWFsbGludCBkb19sem9fZGVjb21wcmVzcyh2b2lkKQoreworCWhlYWRlcl90IGhlYWRlcjsKKworCWNoZWNrX21hZ2ljKCk7CisJcF9oZWFkZXIoJmhlYWRlcik7CisJcmV0dXJuIGx6b19kZWNvbXByZXNzKCZoZWFkZXIpOworfQorCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIG1ha2VfbmV3X25hbWVfbHpvcChjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXhwZWN0ZWRfZXh0IFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9ERUNPTVBSRVNTKSB7CisJCWNoYXIgKmV4dGVuc2lvbiA9IHN0cnJjaHIoZmlsZW5hbWUsICcuJyk7CisJCWlmICghZXh0ZW5zaW9uIHx8IHN0cmNtcChleHRlbnNpb24gKyAxLCAibHpvIikgIT0gMCkKKwkJCXJldHVybiB4YXNwcmludGYoIiVzLm91dCIsIGZpbGVuYW1lKTsKKwkJKmV4dGVuc2lvbiA9ICdcMCc7CisJCXJldHVybiBmaWxlbmFtZTsKKwl9CisJcmV0dXJuIHhhc3ByaW50ZigiJXMubHpvIiwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgcGFja19sem9wKHVucGFja19pbmZvX3QgKmluZm8gVU5VU0VEX1BBUkFNKQoreworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0RFQ09NUFJFU1MpCisJCXJldHVybiBkb19sem9fZGVjb21wcmVzcygpOworCXJldHVybiBkb19sem9fY29tcHJlc3MoKTsKK30KKworaW50IGx6b3BfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGx6b3BfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFJJTkcpOworCWFyZ3YgKz0gb3B0aW5kOworCS8qIGx6b3BjYXQ/ICovCisJaWYgKGFwcGxldF9uYW1lWzRdID09ICdjJykKKwkJb3B0aW9uX21hc2szMiB8PSAoT1BUX1NURE9VVCB8IE9QVF9ERUNPTVBSRVNTKTsKKwkvKiB1bmx6b3A/ICovCisJaWYgKGFwcGxldF9uYW1lWzBdID09ICd1JykKKwkJb3B0aW9uX21hc2szMiB8PSBPUFRfREVDT01QUkVTUzsKKworCWdsb2JhbF9jcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAwKTsKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgcGFja19sem9wLCBtYWtlX25ld19uYW1lX2x6b3AsIC8qdW51c2VkOiovIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvcnBtLmMgYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9ycG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTc0ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvcnBtLmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcnBtIGFwcGxldCBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIGJ5IExhdXJlbmNlIEFuZGVyc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcnBtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItaSBQQUNLQUdFLnJwbTsgcnBtIC1xcFtpbGRjXSBQQUNLQUdFLnJwbSIKKy8vdXNhZ2U6I2RlZmluZSBycG1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNYW5pcHVsYXRlIFJQTSBwYWNrYWdlc1xuIgorLy91c2FnZTogICAgICJcbkNvbW1hbmRzOiIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSW5zdGFsbCBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktcXAJUXVlcnkgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJU2hvdyBpbmZvcm1hdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBjb250ZW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJTGlzdCBkb2N1bWVudHMiCisvL3VzYWdlOiAgICAgIlxuCS1jCUxpc3QgY29uZmlnIGZpbGVzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisjaW5jbHVkZSAicnBtLmgiCisKKyNkZWZpbmUgUlBNX0NIQVJfVFlQRSAgICAgICAgICAgMQorI2RlZmluZSBSUE1fSU5UOF9UWVBFICAgICAgICAgICAyCisjZGVmaW5lIFJQTV9JTlQxNl9UWVBFICAgICAgICAgIDMKKyNkZWZpbmUgUlBNX0lOVDMyX1RZUEUgICAgICAgICAgNAorLyogI2RlZmluZSBSUE1fSU5UNjRfVFlQRSAgICAgICA1ICAgLS0tLSBUaGVzZSBhcmVuJ3Qgc3VwcG9ydGVkICh5ZXQpICovCisjZGVmaW5lIFJQTV9TVFJJTkdfVFlQRSAgICAgICAgIDYKKyNkZWZpbmUgUlBNX0JJTl9UWVBFICAgICAgICAgICAgNworI2RlZmluZSBSUE1fU1RSSU5HX0FSUkFZX1RZUEUgICA4CisjZGVmaW5lIFJQTV9JMThOU1RSSU5HX1RZUEUgICAgIDkKKworI2RlZmluZSBUQUdfTkFNRSAgICAgICAgICAgICAgICAxMDAwCisjZGVmaW5lIFRBR19WRVJTSU9OICAgICAgICAgICAgIDEwMDEKKyNkZWZpbmUgVEFHX1JFTEVBU0UgICAgICAgICAgICAgMTAwMgorI2RlZmluZSBUQUdfU1VNTUFSWSAgICAgICAgICAgICAxMDA0CisjZGVmaW5lIFRBR19ERVNDUklQVElPTiAgICAgICAgIDEwMDUKKyNkZWZpbmUgVEFHX0JVSUxEVElNRSAgICAgICAgICAgMTAwNgorI2RlZmluZSBUQUdfQlVJTERIT1NUICAgICAgICAgICAxMDA3CisjZGVmaW5lIFRBR19TSVpFICAgICAgICAgICAgICAgIDEwMDkKKyNkZWZpbmUgVEFHX1ZFTkRPUiAgICAgICAgICAgICAgMTAxMQorI2RlZmluZSBUQUdfTElDRU5TRSAgICAgICAgICAgICAxMDE0CisjZGVmaW5lIFRBR19QQUNLQUdFUiAgICAgICAgICAgIDEwMTUKKyNkZWZpbmUgVEFHX0dST1VQICAgICAgICAgICAgICAgMTAxNgorI2RlZmluZSBUQUdfVVJMICAgICAgICAgICAgICAgICAxMDIwCisjZGVmaW5lIFRBR19QUkVJTiAgICAgICAgICAgICAgIDEwMjMKKyNkZWZpbmUgVEFHX1BPU1RJTiAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBUQUdfRklMRUZMQUdTICAgICAgICAgICAxMDM3CisjZGVmaW5lIFRBR19GSUxFVVNFUk5BTUUgICAgICAgIDEwMzkKKyNkZWZpbmUgVEFHX0ZJTEVHUk9VUE5BTUUgICAgICAgMTA0MAorI2RlZmluZSBUQUdfU09VUkNFUlBNICAgICAgICAgICAxMDQ0CisjZGVmaW5lIFRBR19QUkVJTlBST0cgICAgICAgICAgIDEwODUKKyNkZWZpbmUgVEFHX1BPU1RJTlBST0cgICAgICAgICAgMTA4NgorI2RlZmluZSBUQUdfUFJFRklYUyAgICAgICAgICAgICAxMDk4CisjZGVmaW5lIFRBR19ESVJJTkRFWEVTICAgICAgICAgIDExMTYKKyNkZWZpbmUgVEFHX0JBU0VOQU1FUyAgICAgICAgICAgMTExNworI2RlZmluZSBUQUdfRElSTkFNRVMgICAgICAgICAgICAxMTE4CisKKyNkZWZpbmUgUlBNRklMRV9DT05GSUcgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUlBNRklMRV9ET0MgICAgICAgICAgICAgKDEgPDwgMSkKKworZW51bSBycG1fZnVuY3Rpb25zX2UgeworCXJwbV9xdWVyeSA9IDEsCisJcnBtX2luc3RhbGwgPSAyLAorCXJwbV9xdWVyeV9pbmZvID0gNCwKKwlycG1fcXVlcnlfcGFja2FnZSA9IDgsCisJcnBtX3F1ZXJ5X2xpc3QgPSAxNiwKKwlycG1fcXVlcnlfbGlzdF9kb2MgPSAzMiwKKwlycG1fcXVlcnlfbGlzdF9jb25maWcgPSA2NAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHRhZzsgLyogNCBieXRlIHRhZyAqLworCXVpbnQzMl90IHR5cGU7IC8qIDQgYnl0ZSB0eXBlICovCisJdWludDMyX3Qgb2Zmc2V0OyAvKiA0IGJ5dGUgb2Zmc2V0ICovCisJdWludDMyX3QgY291bnQ7IC8qIDQgYnl0ZSBjb3VudCAqLworfSBycG1faW5kZXg7CisKK3N0YXRpYyB2b2lkICptYXA7CitzdGF0aWMgcnBtX2luZGV4ICoqbXl0YWdzOworc3RhdGljIGludCB0YWdjb3VudDsKKworc3RhdGljIHZvaWQgZXh0cmFjdF9jcGlvKGludCBmZCwgY29uc3QgY2hhciAqc291cmNlX3JwbSk7CitzdGF0aWMgcnBtX2luZGV4ICoqcnBtX2dldHRhZ3MoaW50IGZkLCBpbnQgKm51bV90YWdzKTsKK3N0YXRpYyBpbnQgYnNlYXJjaF9ycG10YWcoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICppdGVtKTsKK3N0YXRpYyBjaGFyICpycG1fZ2V0c3RyKGludCB0YWcsIGludCBpdGVtaW5kZXgpOworc3RhdGljIGludCBycG1fZ2V0aW50KGludCB0YWcsIGludCBpdGVtaW5kZXgpOworc3RhdGljIGludCBycG1fZ2V0Y291bnQoaW50IHRhZyk7CitzdGF0aWMgdm9pZCBmaWxlYWN0aW9uX2RvYmFja3VwKGNoYXIgKmZpbGVuYW1lLCBpbnQgZmlsZXJlZik7CitzdGF0aWMgdm9pZCBmaWxlYWN0aW9uX3NldG93bmdycChjaGFyICpmaWxlbmFtZSwgaW50IGZpbGVyZWYpOworc3RhdGljIHZvaWQgbG9vcF90aHJvdWdoX2ZpbGVzKGludCBmaWxldGFnLCB2b2lkICgqZmlsZWFjdGlvbikoY2hhciAqZmlsZW5hbWUsIGludCBmaWxlcmVmKSk7CisKK2ludCBycG1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJwbV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgb3B0ID0gMCwgZnVuYyA9IDAsIHJwbV9mZCwgb2Zmc2V0OworCWNvbnN0IGludCBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaXFwbGRjIikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ2knOiAvKiBGaXJzdCBhcmc6IEluc3RhbGwgbW9kZSwgd2l0aCBxOiBJbmZvcm1hdGlvbiAqLworCQkJaWYgKCFmdW5jKSBmdW5jID0gcnBtX2luc3RhbGw7CisJCQllbHNlIGZ1bmMgfD0gcnBtX3F1ZXJ5X2luZm87CisJCQlicmVhazsKKwkJY2FzZSAncSc6IC8qIEZpcnN0IGFyZzogUXVlcnkgbW9kZSAqLworCQkJaWYgKGZ1bmMpIGJiX3Nob3dfdXNhZ2UoKTsKKwkJCWZ1bmMgPSBycG1fcXVlcnk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6IC8qIFF1ZXJ5IGEgcGFja2FnZSAqLworCQkJZnVuYyB8PSBycG1fcXVlcnlfcGFja2FnZTsKKwkJCWJyZWFrOworCQljYXNlICdsJzogLyogTGlzdCBmaWxlcyBpbiBhIHBhY2thZ2UgKi8KKwkJCWZ1bmMgfD0gcnBtX3F1ZXJ5X2xpc3Q7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6IC8qIExpc3QgZG9jIGZpbGVzIGluIGEgcGFja2FnZSAoaW1wbGllcyBsaXN0KSAqLworCQkJZnVuYyB8PSBycG1fcXVlcnlfbGlzdDsKKwkJCWZ1bmMgfD0gcnBtX3F1ZXJ5X2xpc3RfZG9jOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOiAvKiBMaXN0IGNvbmZpZyBmaWxlcyBpbiBhIHBhY2thZ2UgKGltcGxpZXMgbGlzdCkgKi8KKwkJCWZ1bmMgfD0gcnBtX3F1ZXJ5X2xpc3Q7CisJCQlmdW5jIHw9IHJwbV9xdWVyeV9saXN0X2NvbmZpZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCWFyZ3YgKz0gb3B0aW5kOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJY29uc3QgY2hhciAqc291cmNlX3JwbTsKKworCQlycG1fZmQgPSB4b3BlbigqYXJndisrLCBPX1JET05MWSk7CisJCW15dGFncyA9IHJwbV9nZXR0YWdzKHJwbV9mZCwgJnRhZ2NvdW50KTsKKwkJaWYgKCFteXRhZ3MpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgcmVhZGluZyBycG0gaGVhZGVyIik7CisJCW9mZnNldCA9IHhsc2VlayhycG1fZmQsIDAsIFNFRUtfQ1VSKTsKKwkJLyogTWltaW11bSBpcyBvbmUgcGFnZSAqLworCQltYXAgPSBtbWFwKDAsIG9mZnNldCA+IHBhZ2VzaXplID8gKG9mZnNldCArIG9mZnNldCAlIHBhZ2VzaXplKSA6IHBhZ2VzaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBycG1fZmQsIDApOworCisJCXNvdXJjZV9ycG0gPSBycG1fZ2V0c3RyKFRBR19TT1VSQ0VSUE0sIDApOworCisJCWlmIChmdW5jICYgcnBtX2luc3RhbGwpIHsKKwkJCS8qIEJhY2t1cCBhbnkgY29uZmlnIGZpbGVzICovCisJCQlsb29wX3Rocm91Z2hfZmlsZXMoVEFHX0JBU0VOQU1FUywgZmlsZWFjdGlvbl9kb2JhY2t1cCk7CisJCQkvKiBFeHRhY3QgdGhlIGFyY2hpdmUgKi8KKwkJCWV4dHJhY3RfY3BpbyhycG1fZmQsIHNvdXJjZV9ycG0pOworCQkJLyogU2V0IHRoZSBjb3JyZWN0IGZpbGUgdWlkL2dpZCdzICovCisJCQlsb29wX3Rocm91Z2hfZmlsZXMoVEFHX0JBU0VOQU1FUywgZmlsZWFjdGlvbl9zZXRvd25ncnApOworCQl9CisJCWVsc2UgaWYgKChmdW5jICYgKHJwbV9xdWVyeXxycG1fcXVlcnlfcGFja2FnZSkpID09IChycG1fcXVlcnl8cnBtX3F1ZXJ5X3BhY2thZ2UpKSB7CisJCQlpZiAoIShmdW5jICYgKHJwbV9xdWVyeV9pbmZvfHJwbV9xdWVyeV9saXN0KSkpIHsKKwkJCQkvKiBJZiBqdXN0IGEgc3RyYWlnaHQgcXVlcnksIGp1c3QgZ2l2ZSBwYWNrYWdlIG5hbWUgKi8KKwkJCQlwcmludGYoIiVzLSVzLSVzXG4iLCBycG1fZ2V0c3RyKFRBR19OQU1FLCAwKSwgcnBtX2dldHN0cihUQUdfVkVSU0lPTiwgMCksIHJwbV9nZXRzdHIoVEFHX1JFTEVBU0UsIDApKTsKKwkJCX0KKwkJCWlmIChmdW5jICYgcnBtX3F1ZXJ5X2luZm8pIHsKKwkJCQkvKiBEbyB0aGUgbmljZSBwcmludG91dCAqLworCQkJCXRpbWVfdCBiZGF0ZV90aW1lOworCQkJCXN0cnVjdCB0bSAqYmRhdGVfcHRtOworCQkJCWNoYXIgYmRhdGVzdHJpbmdbNTBdOworCQkJCWNvbnN0IGNoYXIgKnA7CisKKwkJCQlwID0gcnBtX2dldHN0cihUQUdfUFJFRklYUywgMCk7CisJCQkJaWYgKCFwKSBwID0gIihub3QgcmVsb2NhdGVhYmxlKSI7CisJCQkJcHJpbnRmKCJOYW1lICAgICAgICA6ICUtMjlzUmVsb2NhdGlvbnM6ICVzXG4iLCBycG1fZ2V0c3RyKFRBR19OQU1FLCAwKSwgcCk7CisJCQkJcCA9IHJwbV9nZXRzdHIoVEFHX1ZFTkRPUiwgMCk7CisJCQkJaWYgKCFwKSBwID0gIihub25lKSI7CisJCQkJcHJpbnRmKCJWZXJzaW9uICAgICA6ICUtMzRzVmVuZG9yOiAlc1xuIiwgcnBtX2dldHN0cihUQUdfVkVSU0lPTiwgMCksIHApOworCQkJCWJkYXRlX3RpbWUgPSBycG1fZ2V0aW50KFRBR19CVUlMRFRJTUUsIDApOworCQkJCWJkYXRlX3B0bSA9IGxvY2FsdGltZSgmYmRhdGVfdGltZSk7CisJCQkJc3RyZnRpbWUoYmRhdGVzdHJpbmcsIDUwLCAiJWEgJWQgJWIgJVkgJVQgJVoiLCBiZGF0ZV9wdG0pOworCQkJCXByaW50ZigiUmVsZWFzZSAgICAgOiAlLTMwc0J1aWxkIERhdGU6ICVzXG4iLCBycG1fZ2V0c3RyKFRBR19SRUxFQVNFLCAwKSwgYmRhdGVzdHJpbmcpOworCQkJCXByaW50ZigiSW5zdGFsbCBkYXRlOiAlLTMwc0J1aWxkIEhvc3Q6ICVzXG4iLCAiKG5vdCBpbnN0YWxsZWQpIiwgcnBtX2dldHN0cihUQUdfQlVJTERIT1NULCAwKSk7CisJCQkJcHJpbnRmKCJHcm91cCAgICAgICA6ICUtMzBzU291cmNlIFJQTTogJXNcbiIsIHJwbV9nZXRzdHIoVEFHX0dST1VQLCAwKSwgc291cmNlX3JwbSk7CisJCQkJcHJpbnRmKCJTaXplICAgICAgICA6ICUtMzNkTGljZW5zZTogJXNcbiIsIHJwbV9nZXRpbnQoVEFHX1NJWkUsIDApLCBycG1fZ2V0c3RyKFRBR19MSUNFTlNFLCAwKSk7CisJCQkJcHJpbnRmKCJVUkwgICAgICAgICA6ICVzXG4iLCBycG1fZ2V0c3RyKFRBR19VUkwsIDApKTsKKwkJCQlwcmludGYoIlN1bW1hcnkgICAgIDogJXNcbiIsIHJwbV9nZXRzdHIoVEFHX1NVTU1BUlksIDApKTsKKwkJCQlwcmludGYoIkRlc2NyaXB0aW9uIDpcbiVzXG4iLCBycG1fZ2V0c3RyKFRBR19ERVNDUklQVElPTiwgMCkpOworCQkJfQorCQkJaWYgKGZ1bmMgJiBycG1fcXVlcnlfbGlzdCkgeworCQkJCWludCBjb3VudCwgaXQsIGZsYWdzOworCQkJCWNvdW50ID0gcnBtX2dldGNvdW50KFRBR19CQVNFTkFNRVMpOworCQkJCWZvciAoaXQgPSAwOyBpdCA8IGNvdW50OyBpdCsrKSB7CisJCQkJCWZsYWdzID0gcnBtX2dldGludChUQUdfRklMRUZMQUdTLCBpdCk7CisJCQkJCXN3aXRjaCAoZnVuYyAmIChycG1fcXVlcnlfbGlzdF9kb2N8cnBtX3F1ZXJ5X2xpc3RfY29uZmlnKSkgeworCQkJCQljYXNlIHJwbV9xdWVyeV9saXN0X2RvYzoKKwkJCQkJCWlmICghKGZsYWdzICYgUlBNRklMRV9ET0MpKSBjb250aW51ZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJwbV9xdWVyeV9saXN0X2NvbmZpZzoKKwkJCQkJCWlmICghKGZsYWdzICYgUlBNRklMRV9DT05GSUcpKSBjb250aW51ZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJwbV9xdWVyeV9saXN0X2RvY3xycG1fcXVlcnlfbGlzdF9jb25maWc6CisJCQkJCQlpZiAoIShmbGFncyAmIChSUE1GSUxFX0NPTkZJR3xSUE1GSUxFX0RPQykpKSBjb250aW51ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXByaW50ZigiJXMlc1xuIiwKKwkJCQkJCXJwbV9nZXRzdHIoVEFHX0RJUk5BTUVTLCBycG1fZ2V0aW50KFRBR19ESVJJTkRFWEVTLCBpdCkpLAorCQkJCQkJcnBtX2dldHN0cihUQUdfQkFTRU5BTUVTLCBpdCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlmcmVlKG15dGFncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X2NwaW8oaW50IGZkLCBjb25zdCBjaGFyICpzb3VyY2VfcnBtKQoreworCWFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlOworCisJaWYgKHNvdXJjZV9ycG0gIT0gTlVMTCkgeworCQkvKiBCaW5hcnkgcnBtIChpdCB3YXMgYnVpbHQgZnJvbSBzb21lIFNSUE0pLCBpbnN0YWxsIHRvIHJvb3QgKi8KKwkJeGNoZGlyKCIvIik7CisJfSAvKiBlbHNlOiBTUlBNLCBpbnN0YWxsIHRvIGN1cnJlbnQgZGlyICovCisKKwkvKiBJbml0aWFsaXplICovCisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCWFyY2hpdmVfaGFuZGxlLT5zZWVrID0gc2Vla19ieV9yZWFkOworCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGw7CisjaWYgMCAvKiBGb3IgdGVzdGluZyAocnBtIC1pIG9ubHkgbGlzdHMgdGhlIGZpbGVzIGluIGludGVybmFsIGNwaW8pOiAqLworCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9za2lwOworI2VuZGlmCisJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzID0gQVJDSElWRV9SRVNUT1JFX0RBVEUgfCBBUkNISVZFX0NSRUFURV9MRUFESU5HX0RJUlMKKwkJLyogY29tcGF0OiBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMuCisJCSAqIHRyeSAicnBtIC1pIGZvby5zcmMucnBtIiBmZXcgdGltZXMgaW4gYSByb3cgLQorCQkgKiBzdGFuZGFyZCBycG0gd2lsbCBub3QgY29tcGxhaW4uCisJCSAqIChUT0RPPyByZWFsIHJwbSBjcmVhdGVzICJmaWxlOzEyMzQiIGFuZCB0aGVuIHJlbmFtZXMgaXQpICovCisJCXwgQVJDSElWRV9VTkxJTktfT0xEOworCWFyY2hpdmVfaGFuZGxlLT5zcmNfZmQgPSBmZDsKKwkvKmFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgPSAwOyAtIGluaXRfaGFuZGxlKCkgZGlkIGl0ICovCisKKwlzZXR1cF91bnppcF9vbl9mZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkIC8qLCBmYWlsX2lmX25vdF9kZXRlY3RlZDogMSovKTsKKwl3aGlsZSAoZ2V0X2hlYWRlcl9jcGlvKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworfQorCitzdGF0aWMgcnBtX2luZGV4ICoqcnBtX2dldHRhZ3MoaW50IGZkLCBpbnQgKm51bV90YWdzKQoreworCS8qIFdlIHNob3VsZCBuZXZlciBuZWVkIG1vcmUgdGhhbiAyMDAgKHNocmluayB2aWEgcmVhbGxvYyBsYXRlcikgKi8KKwlycG1faW5kZXggKip0YWdzID0geHphbGxvYygyMDAgKiBzaXplb2YodGFnc1swXSkpOworCWludCBwYXNzLCB0YWdpbmRleCA9IDA7CisKKwl4bHNlZWsoZmQsIDk2LCBTRUVLX0NVUik7IC8qIFNlZWsgcGFzdCB0aGUgdW51c2VkIGxlYWQgKi8KKworCS8qIDFzdCBwYXNzIGlzIHRoZSBzaWduYXR1cmUgaGVhZGVycywgMm5kIGlzIHRoZSBtYWluIHN0dWZmICovCisJZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykgeworCQlzdHJ1Y3QgcnBtX2hlYWRlciBoZWFkZXI7CisJCXJwbV9pbmRleCAqdG1waW5kZXg7CisJCWludCBzdG9yZXBvczsKKworCQl4cmVhZChmZCwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworCQlpZiAoaGVhZGVyLm1hZ2ljX2FuZF92ZXIgIT0gaHRvbmwoUlBNX0hFQURFUl9NQUdJQ25WRVIpKQorCQkJcmV0dXJuIE5VTEw7IC8qIEludmFsaWQgbWFnaWMsIG9yIG5vdCB2ZXJzaW9uIDEgKi8KKwkJaGVhZGVyLnNpemUgPSBudG9obChoZWFkZXIuc2l6ZSk7CisJCWhlYWRlci5lbnRyaWVzID0gbnRvaGwoaGVhZGVyLmVudHJpZXMpOworCQlzdG9yZXBvcyA9IHhsc2VlayhmZCwgMCwgU0VFS19DVVIpICsgaGVhZGVyLmVudHJpZXMgKiAxNjsKKworCQl3aGlsZSAoaGVhZGVyLmVudHJpZXMtLSkgeworCQkJdG1waW5kZXggPSB0YWdzW3RhZ2luZGV4KytdID0geG1hbGxvYyhzaXplb2YoKnRtcGluZGV4KSk7CisJCQl4cmVhZChmZCwgdG1waW5kZXgsIHNpemVvZigqdG1waW5kZXgpKTsKKwkJCXRtcGluZGV4LT50YWcgPSBudG9obCh0bXBpbmRleC0+dGFnKTsKKwkJCXRtcGluZGV4LT50eXBlID0gbnRvaGwodG1waW5kZXgtPnR5cGUpOworCQkJdG1waW5kZXgtPmNvdW50ID0gbnRvaGwodG1waW5kZXgtPmNvdW50KTsKKwkJCXRtcGluZGV4LT5vZmZzZXQgPSBzdG9yZXBvcyArIG50b2hsKHRtcGluZGV4LT5vZmZzZXQpOworCQkJaWYgKHBhc3MgPT0gMCkKKwkJCQl0bXBpbmRleC0+dGFnIC09IDc0MzsKKwkJfQorCQlzdG9yZXBvcyA9IHhsc2VlayhmZCwgaGVhZGVyLnNpemUsIFNFRUtfQ1VSKTsgLyogU2VlayBwYXN0IHN0b3JlICovCisJCS8qIFNraXAgcGFkZGluZyB0byA4IGJ5dGUgYm91bmRhcnkgYWZ0ZXIgcmVhZGluZyBzaWduYXR1cmUgaGVhZGVycyAqLworCQlpZiAocGFzcyA9PSAwKQorCQkJeGxzZWVrKGZkLCAoLXN0b3JlcG9zKSAmIDB4NywgU0VFS19DVVIpOworCX0KKwkvKiByZWFsbG9jIHRhZ3MgdG8gc2F2ZSBzcGFjZSAqLworCXRhZ3MgPSB4cmVhbGxvYyh0YWdzLCB0YWdpbmRleCAqIHNpemVvZih0YWdzWzBdKSk7CisJKm51bV90YWdzID0gdGFnaW5kZXg7CisJLyogQWxsIGRvbmUsIGxlYXZlIHRoZSBmaWxlIGF0IHRoZSBzdGFydCBvZiB0aGUgZ3ppcHBlZCBjcGlvIGFyY2hpdmUgKi8KKwlyZXR1cm4gdGFnczsKK30KKworc3RhdGljIGludCBic2VhcmNoX3JwbXRhZyhjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKml0ZW0pCit7CisJaW50ICp0YWcgPSAoaW50ICopa2V5OworCXJwbV9pbmRleCAqKnRtcCA9IChycG1faW5kZXggKiopIGl0ZW07CisJcmV0dXJuICgqdGFnIC0gdG1wWzBdLT50YWcpOworfQorCitzdGF0aWMgaW50IHJwbV9nZXRjb3VudChpbnQgdGFnKQoreworCXJwbV9pbmRleCAqKmZvdW5kOworCWZvdW5kID0gYnNlYXJjaCgmdGFnLCBteXRhZ3MsIHRhZ2NvdW50LCBzaXplb2Yoc3RydWN0IHJwbXRhZyAqKSwgYnNlYXJjaF9ycG10YWcpOworCWlmICghZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiBmb3VuZFswXS0+Y291bnQ7Cit9CisKK3N0YXRpYyBjaGFyICpycG1fZ2V0c3RyKGludCB0YWcsIGludCBpdGVtaW5kZXgpCit7CisJcnBtX2luZGV4ICoqZm91bmQ7CisJZm91bmQgPSBic2VhcmNoKCZ0YWcsIG15dGFncywgdGFnY291bnQsIHNpemVvZihzdHJ1Y3QgcnBtdGFnICopLCBic2VhcmNoX3JwbXRhZyk7CisJaWYgKCFmb3VuZCB8fCBpdGVtaW5kZXggPj0gZm91bmRbMF0tPmNvdW50KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZm91bmRbMF0tPnR5cGUgPT0gUlBNX1NUUklOR19UWVBFCisJIHx8IGZvdW5kWzBdLT50eXBlID09IFJQTV9JMThOU1RSSU5HX1RZUEUKKwkgfHwgZm91bmRbMF0tPnR5cGUgPT0gUlBNX1NUUklOR19BUlJBWV9UWVBFCisJKSB7CisJCWludCBuOworCQljaGFyICp0bXBzdHIgPSAoY2hhciAqKSBtYXAgKyBmb3VuZFswXS0+b2Zmc2V0OworCQlmb3IgKG4gPSAwOyBuIDwgaXRlbWluZGV4OyBuKyspCisJCQl0bXBzdHIgPSB0bXBzdHIgKyBzdHJsZW4odG1wc3RyKSArIDE7CisJCXJldHVybiB0bXBzdHI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHJwbV9nZXRpbnQoaW50IHRhZywgaW50IGl0ZW1pbmRleCkKK3sKKwlycG1faW5kZXggKipmb3VuZDsKKwlpbnQgKnRtcGludDsgLyogTkI6IHVzaW5nIGludDhfdCogd291bGQgYmUgZWFzaWVyIHRvIGNvZGUgKi8KKworCS8qIGdjYyB0aHJvd3Mgd2FybmluZ3MgaGVyZSB3aGVuIHNpemVvZih2b2lkKikhPXNpemVvZihpbnQpIC4uLgorCSAqIGl0J3Mgb2sgdG8gaWdub3JlIGl0IGJlY2F1c2UgdGFnIHdvbid0IGJlIHVzZWQgYXMgYSBwb2ludGVyICovCisJZm91bmQgPSBic2VhcmNoKCZ0YWcsIG15dGFncywgdGFnY291bnQsIHNpemVvZihzdHJ1Y3QgcnBtdGFnICopLCBic2VhcmNoX3JwbXRhZyk7CisJaWYgKCFmb3VuZCB8fCBpdGVtaW5kZXggPj0gZm91bmRbMF0tPmNvdW50KQorCQlyZXR1cm4gLTE7CisKKwl0bXBpbnQgPSAoaW50ICopICgoY2hhciAqKSBtYXAgKyBmb3VuZFswXS0+b2Zmc2V0KTsKKworCWlmIChmb3VuZFswXS0+dHlwZSA9PSBSUE1fSU5UMzJfVFlQRSkgeworCQl0bXBpbnQgPSAoaW50ICopICgoY2hhciAqKSB0bXBpbnQgKyBpdGVtaW5kZXgqNCk7CisJCS8qcmV0dXJuIG50b2hsKCp0bXBpbnQpOyovCisJCS8qIGludCBjYW4gYmUgIT0gaW50MzJfdCAqLworCQlyZXR1cm4gbnRvaGwoKihpbnQzMl90Kil0bXBpbnQpOworCX0KKwlpZiAoZm91bmRbMF0tPnR5cGUgPT0gUlBNX0lOVDE2X1RZUEUpIHsKKwkJdG1waW50ID0gKGludCAqKSAoKGNoYXIgKikgdG1waW50ICsgaXRlbWluZGV4KjIpOworCQkvKiA/Pz8gcmVhZCBpbnQsIGFuZCBUSEVOIG50b2hzKCkgaXQ/PyAqLworCQkvKnJldHVybiBudG9ocygqdG1waW50KTsqLworCQlyZXR1cm4gbnRvaHMoKihpbnQxNl90Kil0bXBpbnQpOworCX0KKwlpZiAoZm91bmRbMF0tPnR5cGUgPT0gUlBNX0lOVDhfVFlQRSkgeworCQl0bXBpbnQgPSAoaW50ICopICgoY2hhciAqKSB0bXBpbnQgKyBpdGVtaW5kZXgpOworCQkvKiA/Pz8gd2h5IHdlIGRvbid0IHJlYWQgYnl0ZSBoZXJlPz8/ICovCisJCS8qcmV0dXJuIG50b2hzKCp0bXBpbnQpOyovCisJCXJldHVybiAqKGludDhfdCopdG1waW50OworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGVhY3Rpb25fZG9iYWNrdXAoY2hhciAqZmlsZW5hbWUsIGludCBmaWxlcmVmKQoreworCXN0cnVjdCBzdGF0IG9sZGZpbGU7CisJaW50IHN0YXRfcmVzOworCWNoYXIgKm5ld25hbWU7CisJaWYgKHJwbV9nZXRpbnQoVEFHX0ZJTEVGTEFHUywgZmlsZXJlZikgJiBSUE1GSUxFX0NPTkZJRykgeworCQkvKiBPbmx5IG5lZWQgdG8gYmFja3VwIGNvbmZpZyBmaWxlcyAqLworCQlzdGF0X3JlcyA9IGxzdGF0KGZpbGVuYW1lLCAmb2xkZmlsZSk7CisJCWlmIChzdGF0X3JlcyA9PSAwICYmIFNfSVNSRUcob2xkZmlsZS5zdF9tb2RlKSkgeworCQkJLyogRmlsZSBhbHJlYWR5IGV4aXN0cyAgLSByZWFsbHkgc2hvdWxkIGNoZWNrIE1ENSdzIGV0YyB0byBzZWUgaWYgZGlmZmVyZW50ICovCisJCQluZXduYW1lID0geGFzcHJpbnRmKCIlcy5ycG1vcmlnIiwgZmlsZW5hbWUpOworCQkJY29weV9maWxlKGZpbGVuYW1lLCBuZXduYW1lLCBGSUxFVVRJTFNfUkVDVVIgfCBGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTKTsKKwkJCXJlbW92ZV9maWxlKGZpbGVuYW1lLCBGSUxFVVRJTFNfUkVDVVIgfCBGSUxFVVRJTFNfRk9SQ0UpOworCQkJZnJlZShuZXduYW1lKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZmlsZWFjdGlvbl9zZXRvd25ncnAoY2hhciAqZmlsZW5hbWUsIGludCBmaWxlcmVmKQoreworCS8qIHJlYWwgcnBtIHdhcm5zOiAidXNlciBmb28gZG9lcyBub3QgZXhpc3QgLSB1c2luZyA8eW91PiIgKi8KKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3bmFtKHJwbV9nZXRzdHIoVEFHX0ZJTEVVU0VSTkFNRSwgZmlsZXJlZikpOworCWludCB1aWQgPSBwdyA/IHB3LT5wd191aWQgOiBnZXR1aWQoKTsgLyogb3IgZXVpZD8gKi8KKwlzdHJ1Y3QgZ3JvdXAgKmdyID0gZ2V0Z3JuYW0ocnBtX2dldHN0cihUQUdfRklMRUdST1VQTkFNRSwgZmlsZXJlZikpOworCWludCBnaWQgPSBnciA/IGdyLT5ncl9naWQgOiBnZXRnaWQoKTsKKwljaG93bihmaWxlbmFtZSwgdWlkLCBnaWQpOworfQorCitzdGF0aWMgdm9pZCBsb29wX3Rocm91Z2hfZmlsZXMoaW50IGZpbGV0YWcsIHZvaWQgKCpmaWxlYWN0aW9uKShjaGFyICpmaWxlbmFtZSwgaW50IGZpbGVyZWYpKQoreworCWludCBjb3VudCA9IDA7CisJd2hpbGUgKHJwbV9nZXRzdHIoZmlsZXRhZywgY291bnQpKSB7CisJCWNoYXIqIGZpbGVuYW1lID0geGFzcHJpbnRmKCIlcyVzIiwKKwkJCXJwbV9nZXRzdHIoVEFHX0RJUk5BTUVTLCBycG1fZ2V0aW50KFRBR19ESVJJTkRFWEVTLCBjb3VudCkpLAorCQkJcnBtX2dldHN0cihUQUdfQkFTRU5BTUVTLCBjb3VudCkpOworCQlmaWxlYWN0aW9uKGZpbGVuYW1lLCBjb3VudCsrKTsKKwkJZnJlZShmaWxlbmFtZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvcnBtLmggYi9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9ycG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUyYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvcnBtLmgKQEAgLTAsMCArMSwzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUlBNIHN0cnVjdHMgYW5kIGNvbnN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBMYXVyZW5jZSBBbmRlcnNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogUlBNIGZpbGUgc3RhcnRzIHdpdGggdGhpcyBzdHJ1Y3Q6ICovCitzdHJ1Y3QgcnBtX2xlYWQgeworCXVpbnQzMl90IG1hZ2ljOworCXVpbnQ4X3QgIG1ham9yLCBtaW5vcjsKKwl1aW50MTZfdCB0eXBlOworCXVpbnQxNl90IGFyY2hudW07CisJY2hhciAgICAgbmFtZVs2Nl07CisJdWludDE2X3Qgb3NudW07CisJdWludDE2X3Qgc2lnbmF0dXJlX3R5cGU7CisJY2hhciAgICAgcmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBCVUdfcnBtX2xlYWQgeworCWNoYXIgYnVnW3NpemVvZihzdHJ1Y3QgcnBtX2xlYWQpID09IDk2ID8gMSA6IC0xXTsKK307CisjZGVmaW5lIFJQTV9MRUFEX01BR0lDICAgICAgMHhlZGFiZWVkYgorI2RlZmluZSBSUE1fTEVBRF9NQUdJQ19TVFIgICJcMzU1XDI1M1wzNTZcMzMzIgorCisvKiBUaGVuIGZvbGxvd3MgdGhlIGhlYWRlcjogKi8KK3N0cnVjdCBycG1faGVhZGVyIHsKKwl1aW50MzJfdCBtYWdpY19hbmRfdmVyOyAvKiAzIGJ5dGUgbWFnaWM6IDB4OGUgMHhhZCAweGU4OyAxIGJ5dGUgdmVyc2lvbjogMHgwMSAqLworCXVpbnQzMl90IHJlc2VydmVkOyAgICAgIC8qIDQgYnl0ZXMgcmVzZXJ2ZWQgKi8KKwl1aW50MzJfdCBlbnRyaWVzOyAgICAgICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBoZWFkZXIgKDQgYnl0ZXMpICovCisJdWludDMyX3Qgc2l6ZTsgICAgICAgICAgLyogU2l6ZSBvZiBzdG9yZSAoNCBieXRlcykgKi8KK307CitzdHJ1Y3QgQlVHX3JwbV9oZWFkZXIgeworCWNoYXIgYnVnW3NpemVvZihzdHJ1Y3QgcnBtX2hlYWRlcikgPT0gMTYgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgUlBNX0hFQURFUl9NQUdJQ25WRVIgIDB4OGVhZGU4MDEKKyNkZWZpbmUgUlBNX0hFQURFUl9NQUdJQ19TVFIgICJcMjE2XDI1NVwzNTAiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9hcmNoaXZhbC9ycG0yY3Bpby5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvcnBtMmNwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjRhMGQxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvcnBtMmNwaW8uYwpAQCAtMCwwICsxLDExOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBycG0yY3BpbyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBMYXVyZW5jZSBBbmRlcnNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJwbTJjcGlvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJwYWNrYWdlLnJwbSIKKy8vdXNhZ2U6I2RlZmluZSBycG0yY3Bpb19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk91dHB1dCBhIGNwaW8gYXJjaGl2ZSBvZiB0aGUgcnBtIGZpbGUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKyNpbmNsdWRlICJycG0uaCIKKworZW51bSB7IHJwbV9mZCA9IFNURElOX0ZJTEVOTyB9OworCitzdGF0aWMgdW5zaWduZWQgc2tpcF9oZWFkZXIodm9pZCkKK3sKKwlzdHJ1Y3QgcnBtX2hlYWRlciBoZWFkZXI7CisJdW5zaWduZWQgbGVuOworCisJeHJlYWQocnBtX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisvLwlpZiAoc3RybmNtcCgoY2hhciAqKSAmaGVhZGVyLm1hZ2ljLCBSUE1fSEVBREVSX01BR0lDX1NUUiwgMykgIT0gMCkgeworLy8JCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIFJQTSBoZWFkZXIgbWFnaWMiKTsKKy8vCX0KKy8vCWlmIChoZWFkZXIudmVyc2lvbiAhPSAxKSB7CisvLwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIFJQTSBoZWFkZXIgdmVyc2lvbiIpOworLy8JfQorCWlmIChoZWFkZXIubWFnaWNfYW5kX3ZlciAhPSBodG9ubChSUE1fSEVBREVSX01BR0lDblZFUikpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgUlBNIGhlYWRlciBtYWdpYyBvciB1bnN1cHBvcnRlZCB2ZXJzaW9uIik7CisJCS8vICI6ICV4ICE9ICV4IiwgaGVhZGVyLm1hZ2ljX2FuZF92ZXIsIGh0b25sKFJQTV9IRUFERVJfTUFHSUNuVkVSKSk7CisJfQorCisJLyogU2VlayBwYXN0IGluZGV4IGVudHJpZXMsIGFuZCBwYXN0IHN0b3JlICovCisJbGVuID0gMTYgKiBudG9obChoZWFkZXIuZW50cmllcykgKyBudG9obChoZWFkZXIuc2l6ZSk7CisJc2Vla19ieV9qdW1wKHJwbV9mZCwgbGVuKTsKKworCXJldHVybiBzaXplb2YoaGVhZGVyKSArIGxlbjsKK30KKworLyogTm8gZ2V0b3B0IHJlcXVpcmVkICovCitpbnQgcnBtMmNwaW9fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJwbTJjcGlvX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnBtX2xlYWQgbGVhZDsKKwl1bnNpZ25lZCBwb3M7CisKKwlpZiAoYXJndlsxXSkgeworCQl4bW92ZV9mZCh4b3Blbihhcmd2WzFdLCBPX1JET05MWSksIHJwbV9mZCk7CisJfQorCXhyZWFkKHJwbV9mZCwgJmxlYWQsIHNpemVvZihsZWFkKSk7CisKKwkvKiBKdXN0IGNoZWNrIHRoZSBtYWdpYywgdGhlIHJlc3QgaXMgaXJyZWxldmFudCAqLworCWlmIChsZWFkLm1hZ2ljICE9IGh0b25sKFJQTV9MRUFEX01BR0lDKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBSUE0gbWFnaWMiKTsKKwl9CisKKwkvKiBTa2lwIHRoZSBzaWduYXR1cmUgaGVhZGVyLCBhbGlnbiB0byA4IGJ5dGVzICovCisJcG9zID0gc2tpcF9oZWFkZXIoKTsKKwlzZWVrX2J5X2p1bXAocnBtX2ZkLCAoLShpbnQpcG9zKSAmIDcpOworCisJLyogU2tpcCB0aGUgbWFpbiBoZWFkZXIgKi8KKwlza2lwX2hlYWRlcigpOworCisjaWYgMAorCS8qIFRoaXMgd29ya3MsIGJ1dCBkb2Vzbid0IHJlcG9ydCB1bmNvbXByZXNzIGVycm9ycyAodGhleSBoYXBwZW4gaW4gY2hpbGQpICovCisJc2V0dXBfdW56aXBfb25fZmQocnBtX2ZkIC8qZmFpbF9pZl9ub3RfZGV0ZWN0ZWQ6IDEqLyk7CisJaWYgKGJiX2NvcHlmZF9lb2YocnBtX2ZkLCBTVERPVVRfRklMRU5PKSA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlcnJvciB1bnBhY2tpbmciKTsKKyNlbHNlCisJLyogQkxPQVQgKi8KKwl7CisJCXVuaW9uIHsKKwkJCXVpbnQ4X3QgYls0XTsKKwkJCXVpbnQxNl90IGIxNlsyXTsKKwkJCXVpbnQzMl90IGIzMlsxXTsKKwkJfSBtYWdpYzsKKwkJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp1bnBhY2spKGludCBzcmNfZmQsIGludCBkc3RfZmQpOworCisJCXhyZWFkKHJwbV9mZCwgbWFnaWMuYjE2LCBzaXplb2YobWFnaWMuYjE2WzBdKSk7CisJCWlmIChtYWdpYy5iMTZbMF0gPT0gR1pJUF9NQUdJQykgeworCQkJdW5wYWNrID0gdW5wYWNrX2d6X3N0cmVhbTsKKwkJfSBlbHNlCisJCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwkJICYmIG1hZ2ljLmIxNlswXSA9PSBCWklQMl9NQUdJQworCQkpIHsKKwkJCXVucGFjayA9IHVucGFja19iejJfc3RyZWFtOworCQl9IGVsc2UKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1haCisJCSAmJiBtYWdpYy5iMTZbMF0gPT0gWFpfTUFHSUMxCisJCSkgeworCQkJeHJlYWQocnBtX2ZkLCBtYWdpYy5iMzIsIHNpemVvZihtYWdpYy5iMzJbMF0pKTsKKwkJCWlmIChtYWdpYy5iMzJbMF0gIT0gWFpfTUFHSUMyKQorCQkJCWdvdG8gbm9fbWFnaWM7CisJCQkvKiB1bnBhY2tfeHpfc3RyZWFtIHdhbnRzIGZkIGF0IHBvc2l0aW9uIDYsIG5vIG5lZWQgdG8gc2VlayAqLworCQkJLy94bHNlZWsocnBtX2ZkLCAtNiwgU0VFS19DVVIpOworCQkJdW5wYWNrID0gdW5wYWNrX3h6X3N0cmVhbTsKKwkJfSBlbHNlIHsKKyBub19tYWdpYzoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBnemlwIgorCQkJCQlJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMigiL2J6aXAyIikKKwkJCQkJSUZfRkVBVFVSRV9TRUFNTEVTU19YWigiL3h6IikKKwkJCQkJIiBtYWdpYyIpOworCQl9CisJCWlmICh1bnBhY2socnBtX2ZkLCBTVERPVVRfRklMRU5PKSA8IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgdW5wYWNraW5nIik7CisJfQorI2VuZGlmCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UocnBtX2ZkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL3Rhci5jIGIvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvdGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1ZTgzOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL3Rhci5jCkBAIC0wLDAgKzEsMTEzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB0YXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBNb2RpZmllZCB0byB1c2UgY29tbW9uIGV4dHJhY3Rpb24gY29kZSB1c2VkIGJ5IGFyLCBjcGlvLCBkcGtnLWRlYiwgZHBrZworICogIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiBOb3RlLCB0aGF0IGFzIG9mIEJ1c3lCb3gtMC40MywgdGFyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuIGZyb20gdGhlCisgKiBncm91bmQgdXAuICBJdCBzdGlsbCBoYXMgcmVtbmFudHMgb2YgdGhlIG9sZCBjb2RlIGx5aW5nIGFib3V0LCBidXQgaXQgaXMKKyAqIHZlcnkgZGlmZmVyZW50IG5vdyAoaS5lLiwgY2xlYW5lciwgbGVzcyBnbG9iYWwgdmFyaWFibGVzLCBldGMuKQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBCYXNlZCBpbiBwYXJ0IGluIHRoZSB0YXIgaW1wbGVtZW50YXRpb24gaW4gc2FzaAorICogIENvcHlyaWdodCAoYykgMTk5OSBieSBEYXZpZCBJLiBCZWxsCisgKiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgZGlzdHJpYnV0ZSwgb3IgbW9kaWZ5IHRoaXMgc291cmNlLAorICogIHByb3ZpZGVkIHRoYXQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIHJlbWFpbnMgaW50YWN0LgorICogIFBlcm1pc3Npb24gdG8gZGlzdHJpYnV0ZSBzYXNoIGRlcml2ZWQgY29kZSB1bmRlciBHUEwgaGFzIGJlZW4gZ3JhbnRlZC4KKyAqCisgKiBCYXNlZCBpbiBwYXJ0IG9uIHRoZSB0YXIgaW1wbGVtZW50YXRpb24gZnJvbSBidXN5Ym94LTAuMjgKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgQnJ1Y2UgUGVyZW5zCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBUT0RPOiBzZWN1cml0eSB3aXRoIC1DIERFU1RESVIgb3B0aW9uIGNhbiBiZSBlbmhhbmNlZC4KKyAqIENvbnNpZGVyIHRhciBmaWxlIGNyZWF0ZWQgdmlhOgorICogJCB0YXIgY3ZmIGJ1Zy50YXIgYW55dGhpbmcudHh0CisgKiAkIGxuIC1zIC90bXAgc3ltbGluaworICogJCB0YXIgLS1hcHBlbmQgLWYgYnVnLnRhciBzeW1saW5rCisgKiAkIHJtIHN5bWxpbmsKKyAqICQgbWtkaXIgc3ltbGluaworICogJCB0YXIgLS1hcHBlbmQgLWYgYnVnLnRhciBzeW1saW5rL2V2aWwucHkKKyAqCisgKiBUaGlzIHdpbGwgcmVzdWx0IGluIGFuIGFyY2hpdmUgd2hpY2ggY29udGFpbnM6CisgKiAkIHRhciAtLWxpc3QgLWYgYnVnLnRhcgorICogYW55dGhpbmcudHh0CisgKiBzeW1saW5rCisgKiBzeW1saW5rL2V2aWwucHkKKyAqCisgKiBVbnRhcnJpbmcgaXQgcHV0cyBldmlsLnB5IGluICcvdG1wJyBldmVuIGlmIHRoZSAtQyBERVNURElSIGlzIGdpdmVuLgorICogVGhpcyBkb2Vzbid0IGZlZWwgcmlnaHQsIGFuZCBJSVJDIEdOVSB0YXIgZG9lc24ndCBkbyB0aGF0LgorICovCisKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisvKiBGSVhNRTogU3RvcCB1c2luZyB0aGlzIG5vbi1zdGFuZGFyZCBmZWF0dXJlICovCisjaWZuZGVmIEZOTV9MRUFESU5HX0RJUgorIyBkZWZpbmUgRk5NX0xFQURJTkdfRElSIDAKKyNlbmRpZgorCisKKy8vI2RlZmluZSBEQkcoZm10LCAuLi4pIGJiX2Vycm9yX21zZygiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIERCRyguLi4pICgodm9pZCkwKQorCisKKyNkZWZpbmUgYmxvY2tfYnVmIGJiX2NvbW1vbl9idWZzaXoxCisKKworI2lmICFFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiAmJiAhRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisvKiBEbyBub3QgcGFzcyBnemlwIGZsYWcgdG8gd3JpdGVUYXJGaWxlKCkgKi8KKyNkZWZpbmUgd3JpdGVUYXJGaWxlKHRhcl9mZCwgdmVyYm9zZUZsYWcsIGRlcmVmZXJlbmNlRmxhZywgaW5jbHVkZSwgZXhjbHVkZSwgZ3ppcCkgXAorCXdyaXRlVGFyRmlsZSh0YXJfZmQsIHZlcmJvc2VGbGFnLCBkZXJlZmVyZW5jZUZsYWcsIGluY2x1ZGUsIGV4Y2x1ZGUpCisjZW5kaWYKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0NSRUFURQorCisvKgorKiogd3JpdGVUYXJGaWxlKCksIHdyaXRlRmlsZVRvVGFyYmFsbCgpLCBhbmQgd3JpdGVUYXJIZWFkZXIoKSBhcmUKKyoqIHRoZSBvbmx5IGZ1bmN0aW9ucyB0aGF0IGRlYWwgd2l0aCB0aGUgSGFyZExpbmtJbmZvIHN0cnVjdHVyZS4KKyoqIEV2ZW4gdGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUgeHh4SGFyZExpbmtJbmZvKCkgZnVuY3Rpb25zLgorKi8KK3R5cGVkZWYgc3RydWN0IEhhcmRMaW5rSW5mbyB7CisJc3RydWN0IEhhcmRMaW5rSW5mbyAqbmV4dDsgLyogTmV4dCBlbnRyeSBpbiBsaXN0ICovCisJZGV2X3QgZGV2OyAgICAgICAgICAgICAgICAgLyogRGV2aWNlIG51bWJlciAqLworCWlub190IGlubzsgICAgICAgICAgICAgICAgIC8qIElub2RlIG51bWJlciAqLworLy8Jc2hvcnQgbGlua0NvdW50OyAgICAgICAgICAgLyogKEhhcmQpIExpbmsgQ291bnQgKi8KKwljaGFyIG5hbWVbMV07ICAgICAgICAgICAgICAvKiBTdGFydCBvZiBmaWxlbmFtZSAobXVzdCBiZSBsYXN0KSAqLworfSBIYXJkTGlua0luZm87CisKKy8qIFNvbWUgaW5mbyB0byBiZSBjYXJyaWVkIGFsb25nIHdoZW4gY3JlYXRpbmcgYSBuZXcgdGFyYmFsbCAqLwordHlwZWRlZiBzdHJ1Y3QgVGFyQmFsbEluZm8geworCWludCB0YXJGZDsgICAgICAgICAgICAgICAgICAgICAgLyogT3Blbi1mb3Itd3JpdGUgZmlsZSBkZXNjcmlwdG9yCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmb3IgdGhlIHRhcmJhbGwgKi8KKwlpbnQgdmVyYm9zZUZsYWc7ICAgICAgICAgICAgICAgIC8qIFdoZXRoZXIgdG8gcHJpbnQgZXh0cmEgc3R1ZmYgb3Igbm90ICovCisJY29uc3QgbGxpc3RfdCAqZXhjbHVkZUxpc3Q7ICAgICAvKiBMaXN0IG9mIGZpbGVzIHRvIG5vdCBpbmNsdWRlICovCisJSGFyZExpbmtJbmZvICpobEluZm9IZWFkOyAgICAgICAvKiBIYXJkIExpbmsgVHJhY2tpbmcgSW5mb3JtYXRpb24gKi8KKwlIYXJkTGlua0luZm8gKmhsSW5mbzsgICAgICAgICAgIC8qIEhhcmQgTGluayBJbmZvIGZvciB0aGUgY3VycmVudCBmaWxlICovCisvL1RPRE86IHNhdmUgb25seSBzdF9kZXYgKyBzdF9pbm8KKwlzdHJ1Y3Qgc3RhdCB0YXJGaWxlU3RhdEJ1ZjsgICAgIC8qIFN0YXQgaW5mbyBmb3IgdGhlIHRhcmJhbGwsIGxldHRpbmcKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzIGtub3cgdGhlIGlub2RlIGFuZCBkZXZpY2UgdGhhdCB0aGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRhcmJhbGwgbGl2ZXMsIHNvIHdlIGNhbiBhdm9pZCB0cnlpbmcKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGluY2x1ZGUgdGhlIHRhcmJhbGwgaW50byBpdHNlbGYgKi8KK30gVGFyQmFsbEluZm87CisKKy8qIEEgbmljZSBlbnVtIHdpdGggYWxsIHRoZSBwb3NzaWJsZSB0YXIgZmlsZSBjb250ZW50IHR5cGVzICovCitlbnVtIHsKKwlSRUdUWVBFID0gJzAnLAkJLyogcmVndWxhciBmaWxlICovCisJUkVHVFlQRTAgPSAnXDAnLAkvKiByZWd1bGFyIGZpbGUgKGFuY2llbnQgYnVnIGNvbXBhdCkgKi8KKwlMTktUWVBFID0gJzEnLAkJLyogaGFyZCBsaW5rICovCisJU1lNVFlQRSA9ICcyJywJCS8qIHN5bWJvbGljIGxpbmsgKi8KKwlDSFJUWVBFID0gJzMnLAkJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KKwlCTEtUWVBFID0gJzQnLAkJLyogYmxvY2sgc3BlY2lhbCAqLworCURJUlRZUEUgPSAnNScsCQkvKiBkaXJlY3RvcnkgKi8KKwlGSUZPVFlQRSA9ICc2JywJCS8qIEZJRk8gc3BlY2lhbCAqLworCUNPTlRUWVBFID0gJzcnLAkJLyogcmVzZXJ2ZWQgKi8KKwlHTlVMT05HTElOSyA9ICdLJywJLyogR05VIGxvbmcgKD4xMDAgY2hhcnMpIGxpbmsgbmFtZSAqLworCUdOVUxPTkdOQU1FID0gJ0wnLAkvKiBHTlUgbG9uZyAoPjEwMCBjaGFycykgZmlsZSBuYW1lICovCit9OworCisvKiBNaWdodCBiZSBmYXN0ZXIgKGFuZCBiaWdnZXIpIGlmIHRoZSBkZXYvaW5vIHdlcmUgc3RvcmVkIGluIG51bWVyaWMgb3JkZXI7KSAqLworc3RhdGljIHZvaWQgYWRkSGFyZExpbmtJbmZvKEhhcmRMaW5rSW5mbyAqKmhsSW5mb0hlYWRQdHIsCisJCQkJCXN0cnVjdCBzdGF0ICpzdGF0YnVmLAorCQkJCQljb25zdCBjaGFyICpmaWxlTmFtZSkKK3sKKwkvKiBOb3RlOiBobEluZm9IZWFkUHRyIGNhbiBuZXZlciBiZSBOVUxMISAqLworCUhhcmRMaW5rSW5mbyAqaGxJbmZvOworCisJaGxJbmZvID0geG1hbGxvYyhzaXplb2YoSGFyZExpbmtJbmZvKSArIHN0cmxlbihmaWxlTmFtZSkpOworCWhsSW5mby0+bmV4dCA9ICpobEluZm9IZWFkUHRyOworCSpobEluZm9IZWFkUHRyID0gaGxJbmZvOworCWhsSW5mby0+ZGV2ID0gc3RhdGJ1Zi0+c3RfZGV2OworCWhsSW5mby0+aW5vID0gc3RhdGJ1Zi0+c3RfaW5vOworLy8JaGxJbmZvLT5saW5rQ291bnQgPSBzdGF0YnVmLT5zdF9ubGluazsKKwlzdHJjcHkoaGxJbmZvLT5uYW1lLCBmaWxlTmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVIYXJkTGlua0luZm8oSGFyZExpbmtJbmZvICoqaGxJbmZvSGVhZFB0cikKK3sKKwlIYXJkTGlua0luZm8gKmhsSW5mbzsKKwlIYXJkTGlua0luZm8gKmhsSW5mb05leHQ7CisKKwlpZiAoaGxJbmZvSGVhZFB0cikgeworCQlobEluZm8gPSAqaGxJbmZvSGVhZFB0cjsKKwkJd2hpbGUgKGhsSW5mbykgeworCQkJaGxJbmZvTmV4dCA9IGhsSW5mby0+bmV4dDsKKwkJCWZyZWUoaGxJbmZvKTsKKwkJCWhsSW5mbyA9IGhsSW5mb05leHQ7CisJCX0KKwkJKmhsSW5mb0hlYWRQdHIgPSBOVUxMOworCX0KK30KKworLyogTWlnaHQgYmUgZmFzdGVyIChhbmQgYmlnZ2VyKSBpZiB0aGUgZGV2L2lubyB3ZXJlIHN0b3JlZCBpbiBudW1lcmljIG9yZGVyIDspICovCitzdGF0aWMgSGFyZExpbmtJbmZvICpmaW5kSGFyZExpbmtJbmZvKEhhcmRMaW5rSW5mbyAqaGxJbmZvLCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZikKK3sKKwl3aGlsZSAoaGxJbmZvKSB7CisJCWlmIChzdGF0YnVmLT5zdF9pbm8gPT0gaGxJbmZvLT5pbm8KKwkJICYmIHN0YXRidWYtPnN0X2RldiA9PSBobEluZm8tPmRldgorCQkpIHsKKwkJCURCRygiZm91bmQgaGFyZGxpbms6JyVzJyIsIGhsSW5mby0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCQlobEluZm8gPSBobEluZm8tPm5leHQ7CisJfQorCXJldHVybiBobEluZm87Cit9CisKKy8qIFB1dCBhbiBvY3RhbCBzdHJpbmcgaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFRoZSBudW1iZXIgaXMgemVybyBwYWRkZWQgYW5kIHBvc3NpYmx5IG51bGwgdGVybWluYXRlZC4KKyAqIFN0b3JlcyBsb3ctb3JkZXIgYml0cyBvbmx5IGlmIHdob2xlIHZhbHVlIGRvZXMgbm90IGZpdC4gKi8KK3N0YXRpYyB2b2lkIHB1dE9jdGFsKGNoYXIgKmNwLCBpbnQgbGVuLCBvZmZfdCB2YWx1ZSkKK3sKKwljaGFyIHRlbXBCdWZmZXJbc2l6ZW9mKG9mZl90KSozICsgMV07CisJY2hhciAqdGVtcFN0cmluZyA9IHRlbXBCdWZmZXI7CisJaW50IHdpZHRoOworCisJd2lkdGggPSBzcHJpbnRmKHRlbXBCdWZmZXIsICIlMCoiT0ZGX0ZNVCJvIiwgbGVuLCB2YWx1ZSk7CisJdGVtcFN0cmluZyArPSAod2lkdGggLSBsZW4pOworCisJLyogSWYgc3RyaW5nIGhhcyBsZWFkaW5nIHplcm9lcywgd2UgY2FuIGRyb3Agb25lICovCisJLyogYW5kIGZpZWxkIHdpbGwgaGF2ZSB0cmFpbGluZyAnXDAnICovCisJLyogKGluY3JlYXNlcyBjaGFuY2VzIG9mIGNvbXBhdCB3aXRoIG90aGVyIHRhcnMpICovCisJaWYgKHRlbXBTdHJpbmdbMF0gPT0gJzAnKQorCQl0ZW1wU3RyaW5nKys7CisKKwkvKiBDb3B5IHRoZSBzdHJpbmcgdG8gdGhlIGZpZWxkICovCisJbWVtY3B5KGNwLCB0ZW1wU3RyaW5nLCBsZW4pOworfQorI2RlZmluZSBQVVRfT0NUQUwoYSwgYikgcHV0T2N0YWwoKGEpLCBzaXplb2YoYSksIChiKSkKKworc3RhdGljIHZvaWQgY2hrc3VtX2FuZF94d3JpdGUoaW50IGZkLCBzdHJ1Y3QgdGFyX2hlYWRlcl90KiBocCkKK3sKKwkvKiBQT1NJWCBzYXlzIHRoYXQgY2hlY2tzdW0gaXMgZG9uZSBvbiB1bnNpZ25lZCBieXRlcworCSAqIChTdW4gYW5kIEhQLVVYIGdldHMgaXQgd3JvbmcuLi4gbW9yZSBkZXRhaWxzIGluCisJICogR05VIHRhciBzb3VyY2UpICovCisJY29uc3QgdW5zaWduZWQgY2hhciAqY3A7CisJaW50IGNoa3N1bSwgc2l6ZTsKKworCXN0cmNweShocC0+bWFnaWMsICJ1c3RhciAgIik7CisKKwkvKiBDYWxjdWxhdGUgYW5kIHN0b3JlIHRoZSBjaGVja3N1bSAoaS5lLiwgdGhlIHN1bSBvZiBhbGwgb2YgdGhlIGJ5dGVzIG9mCisJICogdGhlIGhlYWRlcikuICBUaGUgY2hlY2tzdW0gZmllbGQgbXVzdCBiZSBmaWxsZWQgd2l0aCBibGFua3MgZm9yIHRoZQorCSAqIGNhbGN1bGF0aW9uLiAgVGhlIGNoZWNrc3VtIGZpZWxkIGlzIGZvcm1hdHRlZCBkaWZmZXJlbnRseSBmcm9tIHRoZQorCSAqIG90aGVyIGZpZWxkczogaXQgaGFzIDYgZGlnaXRzLCBhIG51bGwsIHRoZW4gYSBzcGFjZSAtLSByYXRoZXIgdGhhbgorCSAqIGRpZ2l0cywgZm9sbG93ZWQgYnkgYSBudWxsIGxpa2UgdGhlIG90aGVyIGZpZWxkcy4uLiAqLworCW1lbXNldChocC0+Y2hrc3VtLCAnICcsIHNpemVvZihocC0+Y2hrc3VtKSk7CisJY3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBocDsKKwljaGtzdW0gPSAwOworCXNpemUgPSBzaXplb2YoKmhwKTsKKwlkbyB7IGNoa3N1bSArPSAqY3ArKzsgfSB3aGlsZSAoLS1zaXplKTsKKwlwdXRPY3RhbChocC0+Y2hrc3VtLCBzaXplb2YoaHAtPmNoa3N1bSktMSwgY2hrc3VtKTsKKworCS8qIE5vdyB3cml0ZSB0aGUgaGVhZGVyIG91dCB0byBkaXNrICovCisJeHdyaXRlKGZkLCBocCwgc2l6ZW9mKCpocCkpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCitzdGF0aWMgdm9pZCB3cml0ZUxvbmduYW1lKGludCBmZCwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBkaXIpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCWNoYXIgbW9kZVs4XTsgICAgICAgICAgICAgLyogMTAwLTEwNyAqLworCQljaGFyIHVpZFs4XTsgICAgICAgICAgICAgIC8qIDEwOC0xMTUgKi8KKwkJY2hhciBnaWRbOF07ICAgICAgICAgICAgICAvKiAxMTYtMTIzICovCisJCWNoYXIgc2l6ZVsxMl07ICAgICAgICAgICAgLyogMTI0LTEzNSAqLworCQljaGFyIG10aW1lWzEyXTsgICAgICAgICAgIC8qIDEzNi0xNDcgKi8KKwl9IHByZWZpbGxlZCA9IHsKKwkJIjAwMDAwMDAiLAorCQkiMDAwMDAwMCIsCisJCSIwMDAwMDAwIiwKKwkJIjAwMDAwMDAwMDAwIiwKKwkJIjAwMDAwMDAwMDAwIiwKKwl9OworCXN0cnVjdCB0YXJfaGVhZGVyX3QgaGVhZGVyOworCWludCBzaXplOworCisJZGlyID0gISFkaXI7IC8qIG5vcm1hbGl6ZTogMC8xICovCisJc2l6ZSA9IHN0cmxlbihuYW1lKSArIDEgKyBkaXI7IC8qIEdOVSB0YXIgdXNlcyBzdHJsZW4rMSAqLworCS8qICsgZGlyOiBhY2NvdW50IGZvciBwb3NzaWJsZSAnLycgKi8KKworCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJc3RyY3B5KGhlYWRlci5uYW1lLCAiLi8uL0BMb25nTGluayIpOworCW1lbWNweShoZWFkZXIubW9kZSwgcHJlZmlsbGVkLm1vZGUsIHNpemVvZihwcmVmaWxsZWQpKTsKKwlQVVRfT0NUQUwoaGVhZGVyLnNpemUsIHNpemUpOworCWhlYWRlci50eXBlZmxhZyA9IHR5cGU7CisJY2hrc3VtX2FuZF94d3JpdGUoZmQsICZoZWFkZXIpOworCisJLyogV3JpdGUgZmlsZW5hbWVbL10gYW5kIHBhZCB0aGUgYmxvY2suICovCisJLyogZGlyPTA6IHdyaXRlcyAnbmFtZTxOVUw+JywgcGFkcyAqLworCS8qIGRpcj0xOiB3cml0ZXMgJ25hbWUnLCB3cml0ZXMgJy88TlVMPicsIHBhZHMgKi8KKwlkaXIgKj0gMjsKKwl4d3JpdGUoZmQsIG5hbWUsIHNpemUgLSBkaXIpOworCXh3cml0ZShmZCwgIi8iLCBkaXIpOworCXNpemUgPSAoLXNpemUpICYgKFRBUl9CTE9DS19TSVpFLTEpOworCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplKTsKKwl4d3JpdGUoZmQsICZoZWFkZXIsIHNpemUpOworfQorI2VuZGlmCisKKy8qIFdyaXRlIG91dCBhIHRhciBoZWFkZXIgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS9kaXJlY3Rvcnkvd2hhdGV2ZXIgKi8KK3N0YXRpYyBpbnQgd3JpdGVUYXJIZWFkZXIoc3RydWN0IFRhckJhbGxJbmZvICp0YkluZm8sCisJCWNvbnN0IGNoYXIgKmhlYWRlcl9uYW1lLCBjb25zdCBjaGFyICpmaWxlTmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYpCit7CisJc3RydWN0IHRhcl9oZWFkZXJfdCBoZWFkZXI7CisKKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCisJc3RybmNweShoZWFkZXIubmFtZSwgaGVhZGVyX25hbWUsIHNpemVvZihoZWFkZXIubmFtZSkpOworCisJLyogUE9TSVggc2F5cyB0byBtYXNrIG1vZGUgd2l0aCAwNzc3Ny4gKi8KKwlQVVRfT0NUQUwoaGVhZGVyLm1vZGUsIHN0YXRidWYtPnN0X21vZGUgJiAwNzc3Nyk7CisJUFVUX09DVEFMKGhlYWRlci51aWQsIHN0YXRidWYtPnN0X3VpZCk7CisJUFVUX09DVEFMKGhlYWRlci5naWQsIHN0YXRidWYtPnN0X2dpZCk7CisJbWVtc2V0KGhlYWRlci5zaXplLCAnMCcsIHNpemVvZihoZWFkZXIuc2l6ZSktMSk7IC8qIFJlZ3VsYXIgZmlsZSBzaXplIGlzIGhhbmRsZWQgbGF0ZXIgKi8KKwkvKiB1c2VycyByZXBvcnQgdGhhdCBmaWxlcyB3aXRoIG5lZ2F0aXZlIHN0X210aW1lIGNhdXNlIHRyb3VibGUsIHNvOiAqLworCVBVVF9PQ1RBTChoZWFkZXIubXRpbWUsIHN0YXRidWYtPnN0X210aW1lID49IDAgPyBzdGF0YnVmLT5zdF9tdGltZSA6IDApOworCisJLyogRW50ZXIgdGhlIHVzZXIgYW5kIGdyb3VwIG5hbWVzICovCisJc2FmZV9zdHJuY3B5KGhlYWRlci51bmFtZSwgZ2V0X2NhY2hlZF91c2VybmFtZShzdGF0YnVmLT5zdF91aWQpLCBzaXplb2YoaGVhZGVyLnVuYW1lKSk7CisJc2FmZV9zdHJuY3B5KGhlYWRlci5nbmFtZSwgZ2V0X2NhY2hlZF9ncm91cG5hbWUoc3RhdGJ1Zi0+c3RfZ2lkKSwgc2l6ZW9mKGhlYWRlci5nbmFtZSkpOworCisJaWYgKHRiSW5mby0+aGxJbmZvKSB7CisJCS8qIFRoaXMgaXMgYSBoYXJkIGxpbmsgKi8KKwkJaGVhZGVyLnR5cGVmbGFnID0gTE5LVFlQRTsKKwkJc3RybmNweShoZWFkZXIubGlua25hbWUsIHRiSW5mby0+aGxJbmZvLT5uYW1lLAorCQkJCXNpemVvZihoZWFkZXIubGlua25hbWUpKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwkJLyogV3JpdGUgb3V0IGxvbmcgbGlua25hbWUgaWYgbmVlZGVkICovCisJCWlmIChoZWFkZXIubGlua25hbWVbc2l6ZW9mKGhlYWRlci5saW5rbmFtZSktMV0pCisJCQl3cml0ZUxvbmduYW1lKHRiSW5mby0+dGFyRmQsIEdOVUxPTkdMSU5LLAorCQkJCQl0YkluZm8tPmhsSW5mby0+bmFtZSwgMCk7CisjZW5kaWYKKwl9IGVsc2UgaWYgKFNfSVNMTksoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJY2hhciAqbHBhdGggPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oZmlsZU5hbWUpOworCQlpZiAoIWxwYXRoKQorCQkJcmV0dXJuIEZBTFNFOworCQloZWFkZXIudHlwZWZsYWcgPSBTWU1UWVBFOworCQlzdHJuY3B5KGhlYWRlci5saW5rbmFtZSwgbHBhdGgsIHNpemVvZihoZWFkZXIubGlua25hbWUpKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwkJLyogV3JpdGUgb3V0IGxvbmcgbGlua25hbWUgaWYgbmVlZGVkICovCisJCWlmIChoZWFkZXIubGlua25hbWVbc2l6ZW9mKGhlYWRlci5saW5rbmFtZSktMV0pCisJCQl3cml0ZUxvbmduYW1lKHRiSW5mby0+dGFyRmQsIEdOVUxPTkdMSU5LLCBscGF0aCwgMCk7CisjZWxzZQorCQkvKiBJZiBpdCBpcyBsYXJnZXIgdGhhbiAxMDAgYnl0ZXMsIGJhaWwgb3V0ICovCisJCWlmIChoZWFkZXIubGlua25hbWVbc2l6ZW9mKGhlYWRlci5saW5rbmFtZSktMV0pIHsKKwkJCWZyZWUobHBhdGgpOworCQkJYmJfZXJyb3JfbXNnKCJuYW1lcyBsb25nZXIgdGhhbiAiTkFNRV9TSVpFX1NUUiIgY2hhcnMgbm90IHN1cHBvcnRlZCIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisjZW5kaWYKKwkJZnJlZShscGF0aCk7CisJfSBlbHNlIGlmIChTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWhlYWRlci50eXBlZmxhZyA9IERJUlRZUEU7CisJCS8qIEFwcGVuZCAnLycgb25seSBpZiB0aGVyZSBpcyBhIHNwYWNlIGZvciBpdCAqLworCQlpZiAoIWhlYWRlci5uYW1lW3NpemVvZihoZWFkZXIubmFtZSktMV0pCisJCQloZWFkZXIubmFtZVtzdHJsZW4oaGVhZGVyLm5hbWUpXSA9ICcvJzsKKwl9IGVsc2UgaWYgKFNfSVNDSFIoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJaGVhZGVyLnR5cGVmbGFnID0gQ0hSVFlQRTsKKwkJUFVUX09DVEFMKGhlYWRlci5kZXZtYWpvciwgbWFqb3Ioc3RhdGJ1Zi0+c3RfcmRldikpOworCQlQVVRfT0NUQUwoaGVhZGVyLmRldm1pbm9yLCBtaW5vcihzdGF0YnVmLT5zdF9yZGV2KSk7CisJfSBlbHNlIGlmIChTX0lTQkxLKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWhlYWRlci50eXBlZmxhZyA9IEJMS1RZUEU7CisJCVBVVF9PQ1RBTChoZWFkZXIuZGV2bWFqb3IsIG1ham9yKHN0YXRidWYtPnN0X3JkZXYpKTsKKwkJUFVUX09DVEFMKGhlYWRlci5kZXZtaW5vciwgbWlub3Ioc3RhdGJ1Zi0+c3RfcmRldikpOworCX0gZWxzZSBpZiAoU19JU0ZJRk8oc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJaGVhZGVyLnR5cGVmbGFnID0gRklGT1RZUEU7CisJfSBlbHNlIGlmIChTX0lTUkVHKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCS8qIGhlYWRlci5zaXplIGZpZWxkIGlzIDEyIGJ5dGVzIGxvbmcgKi8KKwkJLyogRG9lcyBvY3RhbC1lbmNvZGVkIHNpemUgZml0PyAqLworCQl1b2ZmX3QgZmlsZXNpemUgPSBzdGF0YnVmLT5zdF9zaXplOworCQlpZiAoc2l6ZW9mKGZpbGVzaXplKSA8PSA0CisJCSB8fCBmaWxlc2l6ZSA8PSAodW9mZl90KTA3Nzc3Nzc3Nzc3NzdMTAorCQkpIHsKKwkJCVBVVF9PQ1RBTChoZWFkZXIuc2l6ZSwgZmlsZXNpemUpOworCQl9CisJCS8qIERvZXMgYmFzZTI1Ni1lbmNvZGVkIHNpemUgZml0PworCQkgKiBJdCBhbHdheXMgZG9lcyB1bmxlc3Mgb2ZmX3QgaXMgd2lkZXIgdGhhbiA2NCBiaXRzLgorCQkgKi8KKwkJZWxzZSBpZiAoRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisjaWYgVUxMT05HX01BWCA+IDB4ZmZmZmZmZmZmZmZmZmZmZkxMIC8qIDJeNjQtMSAqLworCQkgJiYgKGZpbGVzaXplIDw9IDB4M2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTEwpCisjZW5kaWYKKwkJKSB7CisJICAgICAgICAgICAgICAgIC8qIEdOVSB0YXIgdXNlcyAiYmFzZS0yNTYgZW5jb2RpbmciIGZvciB2ZXJ5IGxhcmdlIG51bWJlcnMuCisJICAgICAgICAgICAgICAgICAqIEVuY29kaW5nIGlzIGJpbmFyeSwgd2l0aCBoaWdoZXN0IGJpdCBhbHdheXMgc2V0IGFzIGEgbWFya2VyCisJICAgICAgICAgICAgICAgICAqIGFuZCBzaWduIGluIG5leHQtaGlnaGVzdCBiaXQ6CisJICAgICAgICAgICAgICAgICAqIDgwIDAwIC4uIDAwIC0gemVybworCSAgICAgICAgICAgICAgICAgKiBiZiBmZiAuLiBmZiAtIGxhcmdlc3QgcG9zaXRpdmUgbnVtYmVyCisJICAgICAgICAgICAgICAgICAqIGZmIGZmIC4uIGZmIC0gbWludXMgMQorCSAgICAgICAgICAgICAgICAgKiBjMCAwMCAuLiAwMCAtIHNtYWxsZXN0IG5lZ2F0aXZlIG51bWJlcgorCQkJICovCisJCQljaGFyICpwOCA9IGhlYWRlci5zaXplICsgc2l6ZW9mKGhlYWRlci5zaXplKTsKKwkJCWRvIHsKKwkJCQkqLS1wOCA9ICh1aW50OF90KWZpbGVzaXplOworCQkJCWZpbGVzaXplID4+PSA4OworCQkJfSB3aGlsZSAocDggIT0gaGVhZGVyLnNpemUpOworCQkJKnA4IHw9IDB4ODA7CisJCX0gZWxzZSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc3RvcmUgZmlsZSAnJXMnICIKKwkJCQkib2Ygc2l6ZSAlIk9GRl9GTVQidSwgYWJvcnRpbmciLAorCQkJCWZpbGVOYW1lLCBzdGF0YnVmLT5zdF9zaXplKTsKKwkJfQorCQloZWFkZXIudHlwZWZsYWcgPSBSRUdUWVBFOworCX0gZWxzZSB7CisJCWJiX2Vycm9yX21zZygiJXM6IHVua25vd24gZmlsZSB0eXBlIiwgZmlsZU5hbWUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisJLyogV3JpdGUgb3V0IGxvbmcgbmFtZSBpZiBuZWVkZWQgKi8KKwkvKiAod2UsIGxpa2UgR05VIHRhciwgb3V0cHV0IGxvbmcgbGlua25hbWUgKmJlZm9yZSogbG9uZyBuYW1lKSAqLworCWlmIChoZWFkZXIubmFtZVtzaXplb2YoaGVhZGVyLm5hbWUpLTFdKQorCQl3cml0ZUxvbmduYW1lKHRiSW5mby0+dGFyRmQsIEdOVUxPTkdOQU1FLAorCQkJCWhlYWRlcl9uYW1lLCBTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpKTsKKyNlbmRpZgorCisJLyogTm93IHdyaXRlIHRoZSBoZWFkZXIgb3V0IHRvIGRpc2sgKi8KKwljaGtzdW1fYW5kX3h3cml0ZSh0YkluZm8tPnRhckZkLCAmaGVhZGVyKTsKKworCS8qIE5vdyBkbyB0aGUgdmVyYm9zZSB0aGluZyAob3Igbm90KSAqLworCWlmICh0YkluZm8tPnZlcmJvc2VGbGFnKSB7CisJCUZJTEUgKnZiRmQgPSBzdGRvdXQ7CisKKwkJLyogSWYgYXJjaGl2ZSBnb2VzIHRvIHN0ZG91dCwgdmVyYm9zZSBnb2VzIHRvIHN0ZGVyciAqLworCQlpZiAodGJJbmZvLT50YXJGZCA9PSBTVERPVVRfRklMRU5PKQorCQkJdmJGZCA9IHN0ZGVycjsKKwkJLyogR05VICJ0YXIgY3Z2ZiIgcHJpbnRzICJleHRlbmRlZCIgbGlzdGluZyBhLWxhICJscyAtbCIgKi8KKwkJLyogV2UgZG9uJ3QgaGF2ZSBzdWNoIGV4Y2Vzc2VzIGhlcmU6IGZvciB1cyAidiIgPT0gInZ2IiAqLworCQkvKiAnLycgaXMgcHJvYmFibHkgYSBHTlVpc20gKi8KKwkJZnByaW50Zih2YkZkLCAiJXMlc1xuIiwgaGVhZGVyX25hbWUsCisJCQkJU19JU0RJUihzdGF0YnVmLT5zdF9tb2RlKSA/ICIvIiA6ICIiKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9GUk9NCitzdGF0aWMgaW50IGV4Y2x1ZGVfZmlsZShjb25zdCBsbGlzdF90ICpleGNsdWRlZF9maWxlcywgY29uc3QgY2hhciAqZmlsZSkKK3sKKwl3aGlsZSAoZXhjbHVkZWRfZmlsZXMpIHsKKwkJaWYgKGV4Y2x1ZGVkX2ZpbGVzLT5kYXRhWzBdID09ICcvJykgeworCQkJaWYgKGZubWF0Y2goZXhjbHVkZWRfZmlsZXMtPmRhdGEsIGZpbGUsCisJCQkJCUZOTV9QQVRITkFNRSB8IEZOTV9MRUFESU5HX0RJUikgPT0gMCkKKwkJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0IGNoYXIgKnA7CisKKwkJCWZvciAocCA9IGZpbGU7IHBbMF0gIT0gJ1wwJzsgcCsrKSB7CisJCQkJaWYgKChwID09IGZpbGUgfHwgcFstMV0gPT0gJy8nKQorCQkJCSAmJiBwWzBdICE9ICcvJworCQkJCSAmJiBmbm1hdGNoKGV4Y2x1ZGVkX2ZpbGVzLT5kYXRhLCBwLAorCQkJCQkJRk5NX1BBVEhOQU1FIHwgRk5NX0xFQURJTkdfRElSKSA9PSAwCisJCQkJKSB7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfQorCQlleGNsdWRlZF9maWxlcyA9IGV4Y2x1ZGVkX2ZpbGVzLT5saW5rOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UKKyMgZGVmaW5lIGV4Y2x1ZGVfZmlsZShleGNsdWRlZF9maWxlcywgZmlsZSkgMAorI2VuZGlmCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHdyaXRlRmlsZVRvVGFyYmFsbChjb25zdCBjaGFyICpmaWxlTmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsCisJCQl2b2lkICp1c2VyRGF0YSwgaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgVGFyQmFsbEluZm8gKnRiSW5mbyA9IChzdHJ1Y3QgVGFyQmFsbEluZm8gKikgdXNlckRhdGE7CisJY29uc3QgY2hhciAqaGVhZGVyX25hbWU7CisJaW50IGlucHV0RmlsZUZkID0gLTE7CisKKwlEQkcoIndyaXRlRmlsZVRvVGFyYmFsbCgnJXMnKSIsIGZpbGVOYW1lKTsKKworCS8qIFN0cmlwIGxlYWRpbmcgJy8nIGFuZCBzdWNoIChtdXN0IGJlIGJlZm9yZSBtZW1vcml6aW5nIGhhcmRsaW5rJ3MgbmFtZSkgKi8KKwloZWFkZXJfbmFtZSA9IHN0cmlwX3Vuc2FmZV9wcmVmaXgoZmlsZU5hbWUpOworCisJaWYgKGhlYWRlcl9uYW1lWzBdID09ICdcMCcpCisJCXJldHVybiBUUlVFOworCisJLyogSXQgaXMgYWdhaW5zdCB0aGUgcnVsZXMgdG8gYXJjaGl2ZSBhIHNvY2tldCAqLworCWlmIChTX0lTU09DSyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQliYl9lcnJvcl9tc2coIiVzOiBzb2NrZXQgaWdub3JlZCIsIGZpbGVOYW1lKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGhhcmQgbGluay4KKwkgKiBJZiBzbyAtCisJICogVHJlYXQgdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiBhIGdpdmVuIGRldi9pbm9kZSBhcyBhIGZpbGUgd2hpbGUKKwkgKiB0cmVhdGluZyBhbnkgYWRkaXRpb25hbCBvY2N1cmFuY2VzIGFzIGhhcmQgbGlua3MuICBUaGlzIGlzIGRvbmUKKwkgKiBieSBhZGRpbmcgdGhlIGZpbGUgaW5mb3JtYXRpb24gdG8gdGhlIEhhcmRMaW5rSW5mbyBsaW5rZWQgbGlzdC4KKwkgKi8KKwl0YkluZm8tPmhsSW5mbyA9IE5VTEw7CisJaWYgKCFTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpICYmIHN0YXRidWYtPnN0X25saW5rID4gMSkgeworCQlEQkcoIiclcyc6IHN0X25saW5rID4gMSIsIGhlYWRlcl9uYW1lKTsKKwkJdGJJbmZvLT5obEluZm8gPSBmaW5kSGFyZExpbmtJbmZvKHRiSW5mby0+aGxJbmZvSGVhZCwgc3RhdGJ1Zik7CisJCWlmICh0YkluZm8tPmhsSW5mbyA9PSBOVUxMKSB7CisJCQlEQkcoIiclcyc6IGFkZEhhcmRMaW5rSW5mbyIsIGhlYWRlcl9uYW1lKTsKKwkJCWFkZEhhcmRMaW5rSW5mbygmdGJJbmZvLT5obEluZm9IZWFkLCBzdGF0YnVmLCBoZWFkZXJfbmFtZSk7CisJCX0KKwl9CisKKwkvKiBJdCBpcyBhIGJhZCBpZGVhIHRvIHN0b3JlIHRoZSBhcmNoaXZlIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZywKKwkgKiBzbyBjaGVjayB0aGUgZGV2aWNlIGFuZCBpbm9kZSB0byBiZSBzdXJlIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgaXNuJ3QKKwkgKiB0aGUgbmV3IHRhcmJhbGwgKi8KKwlpZiAodGJJbmZvLT50YXJGaWxlU3RhdEJ1Zi5zdF9kZXYgPT0gc3RhdGJ1Zi0+c3RfZGV2CisJICYmIHRiSW5mby0+dGFyRmlsZVN0YXRCdWYuc3RfaW5vID09IHN0YXRidWYtPnN0X2lubworCSkgeworCQliYl9lcnJvcl9tc2coIiVzOiBmaWxlIGlzIHRoZSBhcmNoaXZlOyBza2lwcGluZyIsIGZpbGVOYW1lKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJaWYgKGV4Y2x1ZGVfZmlsZSh0YkluZm8tPmV4Y2x1ZGVMaXN0LCBoZWFkZXJfbmFtZSkpCisJCXJldHVybiBTS0lQOworCisjaWYgIUVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworCWlmIChzdHJsZW4oaGVhZGVyX25hbWUpID49IE5BTUVfU0laRSkgeworCQliYl9lcnJvcl9tc2coIm5hbWVzIGxvbmdlciB0aGFuICJOQU1FX1NJWkVfU1RSIiBjaGFycyBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiBUUlVFOworCX0KKyNlbmRpZgorCisJLyogSXMgdGhpcyBhIHJlZ3VsYXIgZmlsZT8gKi8KKwlpZiAodGJJbmZvLT5obEluZm8gPT0gTlVMTCAmJiBTX0lTUkVHKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCS8qIG9wZW4gdGhlIGZpbGUgd2Ugd2FudCB0byBhcmNoaXZlLCBhbmQgbWFrZSBzdXJlIGFsbCBpcyB3ZWxsICovCisJCWlucHV0RmlsZUZkID0gb3Blbl9vcl93YXJuKGZpbGVOYW1lLCBPX1JET05MWSk7CisJCWlmIChpbnB1dEZpbGVGZCA8IDApIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgdGFyYmFsbCAqLworCWlmICh3cml0ZVRhckhlYWRlcih0YkluZm8sIGhlYWRlcl9uYW1lLCBmaWxlTmFtZSwgc3RhdGJ1ZikgPT0gRkFMU0UpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIElmIGl0IHdhcyBhIHJlZ3VsYXIgZmlsZSwgd3JpdGUgb3V0IHRoZSBib2R5ICovCisJaWYgKGlucHV0RmlsZUZkID49IDApIHsKKwkJc2l6ZV90IHJlYWRTaXplOworCQkvKiBXcml0ZSB0aGUgZmlsZSB0byB0aGUgYXJjaGl2ZS4gKi8KKwkJLyogV2UgcmVjb3JkIHNpemUgaW50byBoZWFkZXIgZmlyc3QsICovCisJCS8qIGFuZCB0aGVuIHdyaXRlIG91dCBmaWxlLiBJZiBmaWxlIHNocmlua3MgaW4gYmV0d2VlbiwgKi8KKwkJLyogdGFyIHdpbGwgYmUgY29ycnVwdGVkLiBTbyB3ZSBkb24ndCBhbGxvdyBmb3IgdGhhdC4gKi8KKwkJLyogTkI6IEdOVSB0YXIgMS4xNiB3YXJucyBhbmQgcGFkcyB3aXRoIHplcm9lcyAqLworCQkvKiBvciBldmVuIHNlZWtzIGJhY2sgYW5kIHVwZGF0ZXMgaGVhZGVyICovCisJCWJiX2NvcHlmZF9leGFjdF9zaXplKGlucHV0RmlsZUZkLCB0YkluZm8tPnRhckZkLCBzdGF0YnVmLT5zdF9zaXplKTsKKwkJLy8vL29mZl90IHJlYWRTaXplOworCQkvLy8vcmVhZFNpemUgPSBiYl9jb3B5ZmRfc2l6ZShpbnB1dEZpbGVGZCwgdGJJbmZvLT50YXJGZCwgc3RhdGJ1Zi0+c3Rfc2l6ZSk7CisJCS8vLy9pZiAocmVhZFNpemUgIT0gc3RhdGJ1Zi0+c3Rfc2l6ZSAmJiByZWFkU2l6ZSA+PSAwKSB7CisJCS8vLy8JYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQgZnJvbSAlcywgYWJvcnRpbmciLCBmaWxlTmFtZSk7CisJCS8vLy99CisKKwkJLyogQ2hlY2sgdGhhdCBmaWxlIGRpZCBub3QgZ3JvdyBpbiBiZXR3ZWVuPyAqLworCQkvKiBpZiAoc2FmZV9yZWFkKGlucHV0RmlsZUZkLCAxKSA9PSAxKSB3YXJuIGJ1dCBjb250aW51ZT8gKi8KKworCQljbG9zZShpbnB1dEZpbGVGZCk7CisKKwkJLyogUGFkIHRoZSBmaWxlIHVwIHRvIHRoZSB0YXIgYmxvY2sgc2l6ZSAqLworCQkvKiAoYSBmZXcgdHJpY2tzIGhlcmUgaW4gdGhlIG5hbWUgb2YgY29kZSBzaXplKSAqLworCQlyZWFkU2l6ZSA9ICgtKGludClzdGF0YnVmLT5zdF9zaXplKSAmIChUQVJfQkxPQ0tfU0laRS0xKTsKKwkJbWVtc2V0KGJsb2NrX2J1ZiwgMCwgcmVhZFNpemUpOworCQl4d3JpdGUodGJJbmZvLT50YXJGZCwgYmxvY2tfYnVmLCByZWFkU2l6ZSk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKyMgaWYgIShFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiAmJiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIpCisjICBkZWZpbmUgdmZvcmtfY29tcHJlc3Nvcih0YXJfZmQsIGd6aXApIHZmb3JrX2NvbXByZXNzb3IodGFyX2ZkKQorIyBlbmRpZgorLyogRG9uJ3QgaW5saW5lOiB2Zm9yayBzY2FyZXMgZ2NjIGFuZCBwZXNzaW1pemVzIGNvZGUgKi8KK3N0YXRpYyB2b2lkIE5PSU5MSU5FIHZmb3JrX2NvbXByZXNzb3IoaW50IHRhcl9mZCwgaW50IGd6aXApCit7CisJcGlkX3QgZ3ppcFBpZDsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1ogJiYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJY29uc3QgY2hhciAqemlwX2V4ZWMgPSAoZ3ppcCA9PSAxKSA/ICJnemlwIiA6ICJiemlwMiI7CisjIGVsaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwljb25zdCBjaGFyICp6aXBfZXhlYyA9ICJnemlwIjsKKyMgZWxzZSAvKiBvbmx5IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMiAqLworCWNvbnN0IGNoYXIgKnppcF9leGVjID0gImJ6aXAyIjsKKyMgZW5kaWYKKwkvLyBPbiBMaW51eCwgdmZvcmsgbmV2ZXIgdW5wYXVzZXMgcGFyZW50IGVhcmx5LCBhbHRob3VnaCBzdGFuZGFyZAorCS8vIGFsbG93cyBmb3IgdGhhdC4gRG8gd2Ugd2FudCB0byB3YXN0ZSBieXRlcyBjaGVja2luZyBmb3IgaXQ/CisjIGRlZmluZSBXQUlUX0ZPUl9DSElMRCAwCisJdm9sYXRpbGUgaW50IHZmb3JrX2V4ZWNfZXJybm8gPSAwOworCXN0cnVjdCBmZF9wYWlyIGd6aXBEYXRhUGlwZTsKKyMgaWYgV0FJVF9GT1JfQ0hJTEQKKwlzdHJ1Y3QgZmRfcGFpciBnemlwU3RhdHVzUGlwZTsKKwl4cGlwZWRfcGFpcihnemlwU3RhdHVzUGlwZSk7CisjIGVuZGlmCisJeHBpcGVkX3BhaXIoZ3ppcERhdGFQaXBlKTsKKworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLyogd2Ugb25seSB3YW50IEVQSVBFIG9uIGVycm9ycyAqLworCisjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCisJLyogQXZvaWQgdmZvcmsgY2xvYmJlcmluZyAqLworCSh2b2lkKSAmemlwX2V4ZWM7CisjIGVuZGlmCisKKwlnemlwUGlkID0geHZmb3JrKCk7CisKKwlpZiAoZ3ppcFBpZCA9PSAwKSB7CisJCS8qIGNoaWxkICovCisJCS8qIE5COiBjbG9zZSBfZmlyc3RfLCB0aGVuIG1vdmUgZmRzISAqLworCQljbG9zZShnemlwRGF0YVBpcGUud3IpOworIyBpZiBXQUlUX0ZPUl9DSElMRAorCQljbG9zZShnemlwU3RhdHVzUGlwZS5yZCk7CisJCS8qIGd6aXBTdGF0dXNQaXBlLndyIHdpbGwgY2xvc2Ugb25seSBvbiBleGVjIC0KKwkJICogcGFyZW50IHdhaXRzIGZvciB0aGlzIGNsb3NlIHRvIGhhcHBlbiAqLworCQlmY250bChnemlwU3RhdHVzUGlwZS53ciwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisjIGVuZGlmCisJCXhtb3ZlX2ZkKGd6aXBEYXRhUGlwZS5yZCwgMCk7CisJCXhtb3ZlX2ZkKHRhcl9mZCwgMSk7CisJCS8qIGV4ZWMgZ3ppcC9iemlwMiBwcm9ncmFtL2FwcGxldCAqLworCQlCQl9FWEVDTFAoemlwX2V4ZWMsIHppcF9leGVjLCAiLWYiLCBOVUxMKTsKKwkJdmZvcmtfZXhlY19lcnJubyA9IGVycm5vOworCQlfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCS8qIHBhcmVudCAqLworCXhtb3ZlX2ZkKGd6aXBEYXRhUGlwZS53ciwgdGFyX2ZkKTsKKwljbG9zZShnemlwRGF0YVBpcGUucmQpOworIyBpZiBXQUlUX0ZPUl9DSElMRAorCWNsb3NlKGd6aXBTdGF0dXNQaXBlLndyKTsKKwl3aGlsZSAoMSkgeworCQljaGFyIGJ1ZjsKKwkJaW50IG47CisKKwkJLyogV2FpdCB1bnRpbCBjaGlsZCBleGVjcyAob3IgZmFpbHMgdG8pICovCisJCW4gPSBmdWxsX3JlYWQoZ3ppcFN0YXR1c1BpcGUucmQsICZidWYsIDEpOworCQlpZiAobiA8IDAgLyogJiYgZXJybm8gPT0gRUFHQUlOICovKQorCQkJY29udGludWU7CS8qIHRyeSBpdCBhZ2FpbiAqLworCX0KKwljbG9zZShnemlwU3RhdHVzUGlwZS5yZCk7CisjIGVuZGlmCisJaWYgKHZmb3JrX2V4ZWNfZXJybm8pIHsKKwkJZXJybm8gPSB2Zm9ya19leGVjX2Vycm5vOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIHppcF9leGVjKTsKKwl9Cit9CisjZW5kaWYgLyogRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1ogfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyICovCisKKworLyogZ2NjIDQuMi4xIGlubGluZXMgaXQsIG1ha2luZyBjb2RlIGJpZ2dlciAqLworc3RhdGljIE5PSU5MSU5FIGludCB3cml0ZVRhckZpbGUoaW50IHRhcl9mZCwgaW50IHZlcmJvc2VGbGFnLAorCWludCBkZXJlZmVyZW5jZUZsYWcsIGNvbnN0IGxsaXN0X3QgKmluY2x1ZGUsCisJY29uc3QgbGxpc3RfdCAqZXhjbHVkZSwgaW50IGd6aXApCit7CisJaW50IGVycm9yRmxhZyA9IEZBTFNFOworCXN0cnVjdCBUYXJCYWxsSW5mbyB0YkluZm87CisKKwl0YkluZm8uaGxJbmZvSGVhZCA9IE5VTEw7CisJdGJJbmZvLnRhckZkID0gdGFyX2ZkOworCXRiSW5mby52ZXJib3NlRmxhZyA9IHZlcmJvc2VGbGFnOworCisJLyogU3RvcmUgdGhlIHN0YXQgaW5mbyBmb3IgdGhlIHRhcmJhbGwncyBmaWxlLCBzbworCSAqIGNhbiBhdm9pZCBpbmNsdWRpbmcgdGhlIHRhcmJhbGwgaW50byBpdHNlbGYuLi4uICAqLworCXhmc3RhdCh0YkluZm8udGFyRmQsICZ0YkluZm8udGFyRmlsZVN0YXRCdWYsICJjYW4ndCBzdGF0IHRhciBmaWxlIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwlpZiAoZ3ppcCkKKwkJdmZvcmtfY29tcHJlc3Nvcih0YkluZm8udGFyRmQsIGd6aXApOworI2VuZGlmCisKKwl0YkluZm8uZXhjbHVkZUxpc3QgPSBleGNsdWRlOworCisJLyogUmVhZCB0aGUgZGlyZWN0b3J5L2ZpbGVzIGFuZCBpdGVyYXRlIG92ZXIgdGhlbSBvbmUgYXQgYSB0aW1lICovCisJd2hpbGUgKGluY2x1ZGUpIHsKKwkJaWYgKCFyZWN1cnNpdmVfYWN0aW9uKGluY2x1ZGUtPmRhdGEsIEFDVElPTl9SRUNVUlNFIHwKKwkJCQkoZGVyZWZlcmVuY2VGbGFnID8gQUNUSU9OX0ZPTExPV0xJTktTIDogMCksCisJCQkJd3JpdGVGaWxlVG9UYXJiYWxsLCB3cml0ZUZpbGVUb1RhcmJhbGwsICZ0YkluZm8sIDApCisJCSkgeworCQkJZXJyb3JGbGFnID0gVFJVRTsKKwkJfQorCQlpbmNsdWRlID0gaW5jbHVkZS0+bGluazsKKwl9CisJLyogV3JpdGUgdHdvIGVtcHR5IGJsb2NrcyB0byB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlICovCisJbWVtc2V0KGJsb2NrX2J1ZiwgMCwgMipUQVJfQkxPQ0tfU0laRSk7CisJeHdyaXRlKHRiSW5mby50YXJGZCwgYmxvY2tfYnVmLCAyKlRBUl9CTE9DS19TSVpFKTsKKworCS8qIFRvIGJlIHBlZGFudGljYWxseSBjb3JyZWN0LCB3ZSB3b3VsZCBjaGVjayBpZiB0aGUgdGFyYmFsbAorCSAqIGlzIHNtYWxsZXIgdGhhbiAyMCB0YXIgYmxvY2tzLCBhbmQgcGFkIGl0IGlmIGl0IHdhcyBzbWFsbGVyLAorCSAqIGJ1dCB0aGF0IGlzbid0IG5lY2Vzc2FyeSBmb3IgR05VIHRhciBpbnRlcm9wZXJhYmlsaXR5LCBhbmQKKwkgKiBzbyBpcyBjb25zaWRlcmVkIGEgd2FzdGUgb2Ygc3BhY2UgKi8KKworCS8qIENsb3NlIHNvIHRoZSBjaGlsZCBwcm9jZXNzIChpZiBhbnkpIHdpbGwgZXhpdCAqLworCWNsb3NlKHRiSW5mby50YXJGZCk7CisKKwkvKiBIYW5nIHVwIHRoZSB0b29scywgY2xvc2UgdXAgc2hvcCwgaGVhZCBob21lICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlSGFyZExpbmtJbmZvKCZ0YkluZm8uaGxJbmZvSGVhZCk7CisKKwlpZiAoZXJyb3JGbGFnKQorCQliYl9lcnJvcl9tc2coImVycm9yIGV4aXQgZGVsYXllZCBmcm9tIHByZXZpb3VzIGVycm9ycyIpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1ogfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJaWYgKGd6aXApIHsKKwkJaW50IHN0YXR1czsKKwkJaWYgKHNhZmVfd2FpdHBpZCgtMSwgJnN0YXR1cywgMCkgPT0gLTEpCisJCQliYl9wZXJyb3JfbXNnKCJ3YWl0cGlkIik7CisJCWVsc2UgaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpKQorCQkJLyogZ3ppcCB3YXMga2lsbGVkIG9yIGhhcyBleGl0ZWQgd2l0aCBub256ZXJvISAqLworCQkJZXJyb3JGbGFnID0gVFJVRTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gZXJyb3JGbGFnOworfQorI2Vsc2UKK2ludCB3cml0ZVRhckZpbGUoaW50IHRhcl9mZCwgaW50IHZlcmJvc2VGbGFnLAorCWludCBkZXJlZmVyZW5jZUZsYWcsIGNvbnN0IGxsaXN0X3QgKmluY2x1ZGUsCisJY29uc3QgbGxpc3RfdCAqZXhjbHVkZSwgaW50IGd6aXApOworI2VuZGlmIC8qIEZFQVRVUkVfVEFSX0NSRUFURSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KK3N0YXRpYyBsbGlzdF90ICphcHBlbmRfZmlsZV9saXN0X3RvX2xpc3QobGxpc3RfdCAqbGlzdCkKK3sKKwlGSUxFICpzcmNfc3RyZWFtOworCWNoYXIgKmxpbmU7CisJbGxpc3RfdCAqbmV3bGlzdCA9IE5VTEw7CisKKwl3aGlsZSAobGlzdCkgeworCQlzcmNfc3RyZWFtID0geGZvcGVuX3N0ZGluKGxsaXN0X3BvcCgmbGlzdCkpOworCQl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHNyY19zdHJlYW0pKSAhPSBOVUxMKSB7CisJCQkvKiBraWxsIHRyYWlsaW5nICcvJyB1bmxlc3MgdGhlIHN0cmluZyBpcyBqdXN0ICIvIiAqLworCQkJY2hhciAqY3AgPSBsYXN0X2NoYXJfaXMobGluZSwgJy8nKTsKKwkJCWlmIChjcCA+IGxpbmUpCisJCQkJKmNwID0gJ1wwJzsKKwkJCWxsaXN0X2FkZF90bygmbmV3bGlzdCwgbGluZSk7CisJCX0KKwkJZmNsb3NlKHNyY19zdHJlYW0pOworCX0KKwlyZXR1cm4gbmV3bGlzdDsKK30KKyNlbHNlCisjIGRlZmluZSBhcHBlbmRfZmlsZV9saXN0X3RvX2xpc3QoeCkgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19aCitzdGF0aWMgY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl90YXJfWihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwkvKiBDYW4ndCBsc2VlayBvdmVyIHBpcGVzICovCisJYXJjaGl2ZV9oYW5kbGUtPnNlZWsgPSBzZWVrX2J5X3JlYWQ7CisKKwkvKiBkbyB0aGUgZGVjb21wcmVzc2lvbiwgYW5kIGNsZWFudXAgKi8KKwlpZiAoeHJlYWRfY2hhcihhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkKSAhPSAweDFmCisJIHx8IHhyZWFkX2NoYXIoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCkgIT0gMHg5ZAorCSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBtYWdpYyIpOworCX0KKworCW9wZW5fdHJhbnNmb3JtZXIoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgdW5wYWNrX1pfc3RyZWFtLCAidW5jb21wcmVzcyIpOworCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgPSAwOworCXdoaWxlIChnZXRfaGVhZGVyX3RhcihhcmNoaXZlX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKQorCQljb250aW51ZTsKKworCS8qIENhbiBvbmx5IGRvIG9uZSBmaWxlIGF0IGEgdGltZSAqLworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CisjZWxzZQorIyBkZWZpbmUgZ2V0X2hlYWRlcl90YXJfWiBOVUxMCisjZW5kaWYKKworI2lmZGVmIENIRUNLX0ZPUl9DSElMRF9FWElUQ09ERQorLyogTG9va3MgbGlrZSBpdCBpc24ndCBuZWVkZWQgLSB0YXIgZGV0ZWN0cyBtYWxmb3JtZWQgKHRydW5jYXRlZCkKKyAqIGFyY2hpdmUgaWYgZS5nLiBidW56aXAyIGZhaWxzICovCitzdGF0aWMgaW50IGNoaWxkX2Vycm9yOworCitzdGF0aWMgdm9pZCBoYW5kbGVfU0lHQ0hMRChpbnQgc3RhdHVzKQoreworCS8qIEFjdHVhbGx5LCAnc3RhdHVzJyBpcyBhIHNpZ25vLiBXZSByZXVzZSBpdCBmb3Igb3RoZXIgbmVlZHMgKi8KKworCS8qIFdhaXQgZm9yIGFueSBjaGlsZCB3aXRob3V0IGJsb2NraW5nICovCisJaWYgKHdhaXRfYW55X25vaGFuZygmc3RhdHVzKSA8IDApCisJCS8qIHdhaXQgZmFpbGVkPyEgSSdtIGNvbmZ1c2VkLi4uICovCisJCXJldHVybjsKKworCWlmIChXSUZFWElURUQoc3RhdHVzKSAmJiBXRVhJVFNUQVRVUyhzdGF0dXMpID09IDApCisJCS8qIGNoaWxkIGV4aXRlZCB3aXRoIDAgKi8KKwkJcmV0dXJuOworCS8qIENhbm5vdCBoYXBwZW4/CisJaWYgKCFXSUZTSUdOQUxFRChzdGF0dXMpICYmICFXSUZFWElURUQoc3RhdHVzKSkgcmV0dXJuOyAqLworCWNoaWxkX2Vycm9yID0gMTsKK30KKyNlbmRpZgorCisvL3VzYWdlOiNkZWZpbmUgdGFyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSItWyIgSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCJjIikgInh0IgorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19aKCJaIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VBTUxFU1NfR1ooInoiKQorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19CWjIoImoiKQorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19MWk1BKCJhIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX0NSRUFURSgiaCIpCisvL3VzYWdlOglJRl9GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUoIm0iKQorLy91c2FnZToJInZPXSAiCisvL3VzYWdlOglJRl9GRUFUVVJFX1RBUl9GUk9NKCJbLVggRklMRV0gWy1UIEZJTEVdICIpCisvL3VzYWdlOgkiWy1mIFRBUkZJTEVdIFstQyBESVJdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB0YXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX0NSRUFURSgiQ3JlYXRlLCBleHRyYWN0LCAiKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfVEFSX0NSRUFURSgiRXh0cmFjdCAiKQorLy91c2FnZToJIm9yIGxpc3QgZmlsZXMgZnJvbSBhIHRhciBmaWxlXG4iCisvL3VzYWdlOiAgICAgIlxuT3BlcmF0aW9uOiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX0NSRUFURSgKKy8vdXNhZ2U6ICAgICAiXG4JYwlDcmVhdGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCXgJRXh0cmFjdCIKKy8vdXNhZ2U6ICAgICAiXG4JdAlMaXN0IgorLy91c2FnZTogICAgICJcbglmCU5hbWUgb2YgVEFSRklMRSAoJy0nIGZvciBzdGRpbi9vdXQpIgorLy91c2FnZTogICAgICJcbglDCUNoYW5nZSB0byBESVIgYmVmb3JlIG9wZXJhdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JdglWZXJib3NlIgorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19aKAorLy91c2FnZTogICAgICJcbglaCShEZSljb21wcmVzcyB1c2luZyBjb21wcmVzcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VBTUxFU1NfR1ooCisvL3VzYWdlOiAgICAgIlxuCXoJKERlKWNvbXByZXNzIHVzaW5nIGd6aXAiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMigKKy8vdXNhZ2U6ICAgICAiXG4JagkoRGUpY29tcHJlc3MgdXNpbmcgYnppcDIiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX0xaTUEoCisvL3VzYWdlOiAgICAgIlxuCWEJKERlKWNvbXByZXNzIHVzaW5nIGx6bWEiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCU8JRXh0cmFjdCB0byBzdGRvdXQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1RBUl9DUkVBVEUoCisvL3VzYWdlOiAgICAgIlxuCWgJRm9sbG93IHN5bWxpbmtzIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FKAorLy91c2FnZTogICAgICJcbgltCURvbid0IHJlc3RvcmUgbXRpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1RBUl9GUk9NKAorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbglleGNsdWRlCUZpbGUgdG8gZXhjbHVkZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JWAlGaWxlIHdpdGggbmFtZXMgdG8gZXhjbHVkZSIKKy8vdXNhZ2U6ICAgICAiXG4JVAlGaWxlIHdpdGggbmFtZXMgdG8gaW5jbHVkZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdGFyX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHpjYXQgL3RtcC90YXJiYWxsLnRhci5neiB8IHRhciAteGYgLVxuIgorLy91c2FnZTogICAgICAgIiQgdGFyIC1jZiAvdG1wL3RhcmJhbGwudGFyIC91c3IvbG9jYWxcbiIKKworLy8gU3VwcG9ydGVkIGJ1dCBhcmVuJ3QgaW4gLS1oZWxwOgorLy8Jbwluby1zYW1lLW93bmVyCisvLwlwCXNhbWUtcGVybWlzc2lvbnMKKy8vCWsJa2VlcC1vbGQKKy8vCW51bWVyaWMtb3duZXIKKy8vCW5vLXNhbWUtcGVybWlzc2lvbnMKKy8vCW92ZXJ3cml0ZQorLy9JRl9GRUFUVVJFX1RBUl9UT19DT01NQU5EKAorLy8JdG8tY29tbWFuZAorLy8pCisKK2VudW0geworCU9QVEJJVF9LRUVQX09MRCA9IDgsCisJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCAgIE9QVEJJVF9DUkVBVEUgICAgICAsKQorCUlGX0ZFQVRVUkVfVEFSX0NSRUFURSggICBPUFRCSVRfREVSRUZFUkVOQ0UgLCkKKwlJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMiggT1BUQklUX0JaSVAyICAgICAgICwpCisJSUZfRkVBVFVSRV9TRUFNTEVTU19MWk1BKE9QVEJJVF9MWk1BICAgICAgICAsKQorCUlGX0ZFQVRVUkVfVEFSX0ZST00oICAgICBPUFRCSVRfSU5DTFVERV9GUk9NLCkKKwlJRl9GRUFUVVJFX1RBUl9GUk9NKCAgICAgT1BUQklUX0VYQ0xVREVfRlJPTSwpCisJSUZfRkVBVFVSRV9TRUFNTEVTU19HWiggIE9QVEJJVF9HWklQICAgICAgICAsKQorCUlGX0ZFQVRVUkVfU0VBTUxFU1NfWiggICBPUFRCSVRfQ09NUFJFU1MgICAgLCkgLy8gMTZ0aCBiaXQKKwlJRl9GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUoT1BUQklUX05PUFJFU0VSVkVfVElNRSwpCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUworCUlGX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQoT1BUQklUXzJDT01NQU5EICAgLCkKKwlPUFRCSVRfTlVNRVJJQ19PV05FUiwKKwlPUFRCSVRfTk9QUkVTRVJWRV9QRVJNLAorCU9QVEJJVF9PVkVSV1JJVEUsCisjZW5kaWYKKwlPUFRfVEVTVCAgICAgICAgID0gMSA8PCAwLCAvLyB0CisJT1BUX0VYVFJBQ1QgICAgICA9IDEgPDwgMSwgLy8geAorCU9QVF9CQVNFRElSICAgICAgPSAxIDw8IDIsIC8vIEMKKwlPUFRfVEFSTkFNRSAgICAgID0gMSA8PCAzLCAvLyBmCisJT1BUXzJTVERPVVQgICAgICA9IDEgPDwgNCwgLy8gTworCU9QVF9OT1BSRVNFUlZFX09XTkVSID0gMSA8PCA1LCAvLyBvID09IG5vLXNhbWUtb3duZXIKKwlPUFRfUCAgICAgICAgICAgID0gMSA8PCA2LCAvLyBwCisJT1BUX1ZFUkJPU0UgICAgICA9IDEgPDwgNywgLy8gdgorCU9QVF9LRUVQX09MRCAgICAgPSAxIDw8IDgsIC8vIGsKKwlPUFRfQ1JFQVRFICAgICAgID0gSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCAgICgxIDw8IE9QVEJJVF9DUkVBVEUgICAgICApKSArIDAsIC8vIGMKKwlPUFRfREVSRUZFUkVOQ0UgID0gSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCAgICgxIDw8IE9QVEJJVF9ERVJFRkVSRU5DRSApKSArIDAsIC8vIGgKKwlPUFRfQlpJUDIgICAgICAgID0gSUZfRkVBVFVSRV9TRUFNTEVTU19CWjIoICgxIDw8IE9QVEJJVF9CWklQMiAgICAgICApKSArIDAsIC8vIGoKKwlPUFRfTFpNQSAgICAgICAgID0gSUZfRkVBVFVSRV9TRUFNTEVTU19MWk1BKCgxIDw8IE9QVEJJVF9MWk1BICAgICAgICApKSArIDAsIC8vIGEKKwlPUFRfSU5DTFVERV9GUk9NID0gSUZfRkVBVFVSRV9UQVJfRlJPTSggICAgICgxIDw8IE9QVEJJVF9JTkNMVURFX0ZST00pKSArIDAsIC8vIFQKKwlPUFRfRVhDTFVERV9GUk9NID0gSUZfRkVBVFVSRV9UQVJfRlJPTSggICAgICgxIDw8IE9QVEJJVF9FWENMVURFX0ZST00pKSArIDAsIC8vIFgKKwlPUFRfR1pJUCAgICAgICAgID0gSUZfRkVBVFVSRV9TRUFNTEVTU19HWiggICgxIDw8IE9QVEJJVF9HWklQICAgICAgICApKSArIDAsIC8vIHoKKwlPUFRfQ09NUFJFU1MgICAgID0gSUZfRkVBVFVSRV9TRUFNTEVTU19aKCAgICgxIDw8IE9QVEJJVF9DT01QUkVTUyAgICApKSArIDAsIC8vIFoKKwlPUFRfTk9QUkVTRVJWRV9USU1FID0gSUZfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FKCgxIDw8IE9QVEJJVF9OT1BSRVNFUlZFX1RJTUUpKSArIDAsIC8vIG0KKwlPUFRfMkNPTU1BTkQgICAgICAgID0gSUZfRkVBVFVSRV9UQVJfVE9fQ09NTUFORCggICgxIDw8IE9QVEJJVF8yQ09NTUFORCAgICAgICApKSArIDAsIC8vIHRvLWNvbW1hbmQKKwlPUFRfTlVNRVJJQ19PV05FUiAgID0gSUZfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TKCgxIDw8IE9QVEJJVF9OVU1FUklDX09XTkVSICApKSArIDAsIC8vIG51bWVyaWMtb3duZXIKKwlPUFRfTk9QUkVTRVJWRV9QRVJNID0gSUZfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TKCgxIDw8IE9QVEJJVF9OT1BSRVNFUlZFX1BFUk0pKSArIDAsIC8vIG5vLXNhbWUtcGVybWlzc2lvbnMKKwlPUFRfT1ZFUldSSVRFICAgICAgID0gSUZfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TKCgxIDw8IE9QVEJJVF9PVkVSV1JJVEUgICAgICApKSArIDAsIC8vIG92ZXJ3cml0ZQorfTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciB0YXJfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJsaXN0XDAiICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ0IgorCSJleHRyYWN0XDAiICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ4IgorCSJkaXJlY3RvcnlcMCIgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJDIgorCSJmaWxlXDAiICAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJmIgorCSJ0by1zdGRvdXRcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJPIgorCS8qIGRvIG5vdCByZXN0b3JlIG93bmVyICovCisJLyogTm90ZTogR05VIHRhciBoYW5kbGVzICdvJyBhcyBuby1zYW1lLW93bmVyIG9ubHkgb24gZXh0cmFjdCwKKwkgKiBvbiBjcmVhdGUsICdvJyBpcyAtLW9sZC1hcmNoaXZlLiBXZSBkbyBub3Qgc3VwcG9ydCAtLW9sZC1hcmNoaXZlLiAqLworCSJuby1zYW1lLW93bmVyXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJvIgorCSJzYW1lLXBlcm1pc3Npb25zXDAiICAgIE5vX2FyZ3VtZW50ICAgICAgICJwIgorCSJ2ZXJib3NlXDAiICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ2IgorCSJrZWVwLW9sZFwwIiAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJrIgorIyBpZiBFTkFCTEVfRkVBVFVSRV9UQVJfQ1JFQVRFCisJImNyZWF0ZVwwIiAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImMiCisJImRlcmVmZXJlbmNlXDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImgiCisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCSJiemlwMlwwIiAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJqIgorIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19MWk1BCisJImx6bWFcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImEiCisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9GUk9NCisJImZpbGVzLWZyb21cMCIgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlQiCisJImV4Y2x1ZGUtZnJvbVwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlgiCisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daCisJImd6aXBcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInoiCisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1oKKwkiY29tcHJlc3NcMCIgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiWiIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRQorCSJ0b3VjaFwwIiAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJtIgorIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVE9fQ09NTUFORAorCSJ0by1jb21tYW5kXDAiCQlSZXF1aXJlZF9hcmd1bWVudCAiXHhmYiIKKyMgZW5kaWYKKwkvKiB1c2UgbnVtZXJpYyB1aWQvZ2lkIGZyb20gdGFyIGhlYWRlciwgbm90IHRleHR1YWwgKi8KKwkibnVtZXJpYy1vd25lclwwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAiXHhmYyIKKwkvKiBkbyBub3QgcmVzdG9yZSBtb2RlICovCisJIm5vLXNhbWUtcGVybWlzc2lvbnNcMCIgTm9fYXJndW1lbnQgICAgICAgIlx4ZmQiCisJLyogb24gdW5wYWNrLCBvcGVuIHdpdGggT19UUlVOQyBhbmQgIU9fRVhDTCAqLworCSJvdmVyd3JpdGVcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJceGZlIgorCS8qIC0tZXhjbHVkZSB0YWtlcyBuZXh0IGJpdCBwb3NpdGlvbiBpbiBvcHRpb24gbWFzaywgKi8KKwkvKiB0aGVyZWZvcmUgd2UgaGF2ZSB0byBwdXQgaXQgX2FmdGVyXyAtLW5vLXNhbWUtcGVybWlzc2lvbnMgKi8KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KKwkiZXhjbHVkZVwwIiAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiXHhmZiIKKyMgZW5kaWYKKwk7CisjZW5kaWYKKworaW50IHRhcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGFyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyIEZBU1RfRlVOQyAoKmdldF9oZWFkZXJfcHRyKShhcmNoaXZlX2hhbmRsZV90ICopID0gZ2V0X2hlYWRlcl90YXI7CisJYXJjaGl2ZV9oYW5kbGVfdCAqdGFyX2hhbmRsZTsKKwljaGFyICpiYXNlX2RpciA9IE5VTEw7CisJY29uc3QgY2hhciAqdGFyX2ZpbGVuYW1lID0gIi0iOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgdmVyYm9zZUZsYWcgPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMgJiYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KKwlsbGlzdF90ICpleGNsdWRlcyA9IE5VTEw7CisjZW5kaWYKKworCS8qIEluaXRpYWxpc2UgZGVmYXVsdCB2YWx1ZXMgKi8KKwl0YXJfaGFuZGxlID0gaW5pdF9oYW5kbGUoKTsKKwl0YXJfaGFuZGxlLT5haF9mbGFncyA9IEFSQ0hJVkVfQ1JFQVRFX0xFQURJTkdfRElSUworCSAgICAgICAgICAgICAgICAgICAgIHwgQVJDSElWRV9SRVNUT1JFX0RBVEUKKwkgICAgICAgICAgICAgICAgICAgICB8IEFSQ0hJVkVfVU5MSU5LX09MRDsKKworCS8qIEFwcGFyZW50bHkgb25seSByb290J3MgdGFyIHByZXNlcnZlcyBwZXJtcyAoc2VlIGJ1ZyAzODQ0KSAqLworCWlmIChnZXR1aWQoKSAhPSAwKQorCQl0YXJfaGFuZGxlLT5haF9mbGFncyB8PSBBUkNISVZFX0RPTlRfUkVTVE9SRV9QRVJNOworCisJLyogUHJlcGVuZCAnLScgdG8gdGhlIGZpcnN0IGFyZ3VtZW50IGlmIHJlcXVpcmVkICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLS06IiAvLyBmaXJzdCBhcmcgaXMgb3B0aW9ucworCQkidHQ6dnY6IiAvLyBjb3VudCAtdCwtdgorCQlJRl9GRUFUVVJFX1RBUl9GUk9NKCJYOjpUOjoiKSAvLyBjdW11bGF0aXZlIGxpc3RzCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyAmJiBFTkFCTEVfRkVBVFVSRV9UQVJfRlJPTQorCQkiXHhmZjo6IiAvLyBjdW11bGF0aXZlIGxpc3RzIGZvciAtLWV4Y2x1ZGUKKyNlbmRpZgorCQlJRl9GRUFUVVJFX1RBUl9DUkVBVEUoImM6IikgInQ6eDoiIC8vIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBpcyByZXFkCisJCUlGX0ZFQVRVUkVfVEFSX0NSRUFURSgiYy0tdHg6dC0tY3g6eC0tY3QiKSAvLyBtdXR1YWxseSBleGNsdXNpdmUKKwkJSUZfTk9UX0ZFQVRVUkVfVEFSX0NSRUFURSgidC0teDp4LS10Iik7IC8vIG11dHVhbGx5IGV4Y2x1c2l2ZQorI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gdGFyX2xvbmdvcHRzOworI2VuZGlmCisjaWYgRU5BQkxFX0RFU0tUT1AKKwlpZiAoYXJndlsxXSAmJiBhcmd2WzFdWzBdICE9ICctJykgeworCQkvKiBDb21wYXQ6CisJCSAqIDFzdCBhcmd1bWVudCB3aXRob3V0IGRhc2ggaGFuZGxlcyBvcHRpb25zIHdpdGggcGFyYW1ldGVycworCQkgKiBkaWZmZXJlbnRseSBmcm9tIGRhc2hlZCBvbmU6IGl0IHRha2VzICpuZXh0IGFyZ3ZbaV0qCisJCSAqIGFzIHBhcmFtZW50ZXIgZXZlbiBpZiB0aGVyZSBhcmUgbW9yZSBjaGFycyBpbiAxc3QgYXJndW1lbnQ6CisJCSAqICAidGFyIGZ4IFRBUkZJTEUiIC0gIngiIGlzIG5vdCB0YWtlbiBhcyBmJ3MgcGFyYW0KKwkJICogIGJ1dCBpcyBpbnRlcnByZXRlZCBhcyAteCBvcHRpb24KKwkJICogICJ0YXIgLXhmIFRBUkZJTEUiIC0gZGFzaGVkIGVxdWl2YWxlbnQgb2YgdGhlIGFib3ZlCisJCSAqICAidGFyIC1meCAuLi4iIC0gIngiIGlzIHRha2VuIGFzIGYncyBwYXJhbQorCQkgKiBnZXRvcHQzMiB3b3VsZG4ndCBoYW5kbGUgMXN0IGNvbW1hbmQgY29ycmVjdGx5LgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBwZW9wbGUgZG8gdXNlIHN1Y2ggY29tbWFuZHMuCisJCSAqIFdlIG1hc3NhZ2UgYXJndlsxXSB0byB3b3JrIGFyb3VuZCBpdCBieSBtb3ZpbmcgJ2YnCisJCSAqIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKwkJICogTW9yZSBjb250cml2ZWQgInRhciBmQ3ggVEFSRklMRSBESVIiIHN0aWxsIGZhaWxzLAorCQkgKiBidXQgc3VjaCBjb21tYW5kcyBhcmUgbXVjaCBsZXNzIGxpa2VseSB0byBiZSB1c2VkLgorCQkgKi8KKwkJY2hhciAqZiA9IHN0cmNocihhcmd2WzFdLCAnZicpOworCQlpZiAoZikgeworCQkJd2hpbGUgKGZbMV0gIT0gJ1wwJykgeworCQkJCSpmID0gZlsxXTsKKwkJCQlmKys7CisJCQl9CisJCQkqZiA9ICdmJzsKKwkJfQorCX0KKyNlbmRpZgorCW9wdCA9IGdldG9wdDMyKGFyZ3YsCisJCSJ0eEM6ZjpPb3B2ayIKKwkJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCAgICJjaCIgICkKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19CWjIoICJqIiAgICkKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19MWk1BKCJhIiAgICkKKwkJSUZfRkVBVFVSRV9UQVJfRlJPTSggICAgICJUOlg6IikKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19HWiggICJ6IiAgICkKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19aKCAgICJaIiAgICkKKwkJSUZfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FKCJtIikKKwkJLCAmYmFzZV9kaXIgLy8gLUMgZGlyCisJCSwgJnRhcl9maWxlbmFtZSAvLyAtZiBmaWxlbmFtZQorCQlJRl9GRUFUVVJFX1RBUl9GUk9NKCwgJih0YXJfaGFuZGxlLT5hY2NlcHQpKSAvLyBUCisJCUlGX0ZFQVRVUkVfVEFSX0ZST00oLCAmKHRhcl9oYW5kbGUtPnJlamVjdCkpIC8vIFgKKwkJSUZfRkVBVFVSRV9UQVJfVE9fQ09NTUFORCgsICYodGFyX2hhbmRsZS0+dGFyX190b19jb21tYW5kKSkgLy8gLS10by1jb21tYW5kCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyAmJiBFTkFCTEVfRkVBVFVSRV9UQVJfRlJPTQorCQksICZleGNsdWRlcyAvLyAtLWV4Y2x1ZGUKKyNlbmRpZgorCQksICZ2ZXJib3NlRmxhZyAvLyBjb21iaW5lZCBjb3VudCBmb3IgLXQgYW5kIC12CisJCSwgJnZlcmJvc2VGbGFnIC8vIGNvbWJpbmVkIGNvdW50IGZvciAtdCBhbmQgLXYKKwkJKTsKKwkvL2JiX2Vycm9yX21zZygib3B0OiUwOHgiLCBvcHQpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKHZlcmJvc2VGbGFnKSB0YXJfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX3ZlcmJvc2VfbGlzdDsKKwlpZiAodmVyYm9zZUZsYWcgPT0gMSkgdGFyX2hhbmRsZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl9saXN0OworCisJaWYgKG9wdCAmIE9QVF9FWFRSQUNUKQorCQl0YXJfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGw7CisKKwlpZiAob3B0ICYgT1BUXzJTVERPVVQpCisJCXRhcl9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X3RvX3N0ZG91dDsKKworCWlmIChvcHQgJiBPUFRfMkNPTU1BTkQpIHsKKwkJcHV0ZW52KChjaGFyKikiVEFSX0ZJTEVUWVBFPWYiKTsKKwkJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCQl0YXJfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF90b19jb21tYW5kOworCQlJRl9GRUFUVVJFX1RBUl9UT19DT01NQU5EKHRhcl9oYW5kbGUtPnRhcl9fdG9fY29tbWFuZF9zaGVsbCA9IHhzdHJkdXAoZ2V0X3NoZWxsX25hbWUoKSk7KQorCX0KKworCWlmIChvcHQgJiBPUFRfS0VFUF9PTEQpCisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzICY9IH5BUkNISVZFX1VOTElOS19PTEQ7CisKKwlpZiAob3B0ICYgT1BUX05VTUVSSUNfT1dORVIpCisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfTlVNRVJJQ19PV05FUjsKKworCWlmIChvcHQgJiBPUFRfTk9QUkVTRVJWRV9PV05FUikKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9ET05UX1JFU1RPUkVfT1dORVI7CisKKwlpZiAob3B0ICYgT1BUX05PUFJFU0VSVkVfUEVSTSkKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9ET05UX1JFU1RPUkVfUEVSTTsKKworCWlmIChvcHQgJiBPUFRfT1ZFUldSSVRFKSB7CisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzICY9IH5BUkNISVZFX1VOTElOS19PTEQ7CisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfT19UUlVOQzsKKwl9CisKKwlpZiAob3B0ICYgT1BUX0daSVApCisJCWdldF9oZWFkZXJfcHRyID0gZ2V0X2hlYWRlcl90YXJfZ3o7CisKKwlpZiAob3B0ICYgT1BUX0JaSVAyKQorCQlnZXRfaGVhZGVyX3B0ciA9IGdldF9oZWFkZXJfdGFyX2J6MjsKKworCWlmIChvcHQgJiBPUFRfTFpNQSkKKwkJZ2V0X2hlYWRlcl9wdHIgPSBnZXRfaGVhZGVyX3Rhcl9sem1hOworCisJaWYgKG9wdCAmIE9QVF9DT01QUkVTUykKKwkJZ2V0X2hlYWRlcl9wdHIgPSBnZXRfaGVhZGVyX3Rhcl9aOworCisJaWYgKG9wdCAmIE9QVF9OT1BSRVNFUlZFX1RJTUUpCisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzICY9IH5BUkNISVZFX1JFU1RPUkVfREFURTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9GUk9NCisJdGFyX2hhbmRsZS0+cmVqZWN0ID0gYXBwZW5kX2ZpbGVfbGlzdF90b19saXN0KHRhcl9oYW5kbGUtPnJlamVjdCk7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMKKwkvKiBBcHBlbmQgZXhjbHVkZXMgdG8gcmVqZWN0ICovCisJd2hpbGUgKGV4Y2x1ZGVzKSB7CisJCWxsaXN0X3QgKm5leHQgPSBleGNsdWRlcy0+bGluazsKKwkJZXhjbHVkZXMtPmxpbmsgPSB0YXJfaGFuZGxlLT5yZWplY3Q7CisJCXRhcl9oYW5kbGUtPnJlamVjdCA9IGV4Y2x1ZGVzOworCQlleGNsdWRlcyA9IG5leHQ7CisJfQorIyBlbmRpZgorCXRhcl9oYW5kbGUtPmFjY2VwdCA9IGFwcGVuZF9maWxlX2xpc3RfdG9fbGlzdCh0YXJfaGFuZGxlLT5hY2NlcHQpOworI2VuZGlmCisKKwkvKiBTZXR1cCBhbiBhcnJheSBvZiBmaWxlbmFtZXMgdG8gd29yayB3aXRoICovCisJLyogVE9ETzogVGhpcyBpcyB0aGUgc2FtZSBhcyBpbiBhciwgbWFrZSBhIHNlcGFyYXRlIGZ1bmN0aW9uPyAqLworCXdoaWxlICgqYXJndikgeworCQkvKiBraWxsIHRyYWlsaW5nICcvJyB1bmxlc3MgdGhlIHN0cmluZyBpcyBqdXN0ICIvIiAqLworCQljaGFyICpjcCA9IGxhc3RfY2hhcl9pcygqYXJndiwgJy8nKTsKKwkJaWYgKGNwID4gKmFyZ3YpCisJCQkqY3AgPSAnXDAnOworCQlsbGlzdF9hZGRfdG9fZW5kKCZ0YXJfaGFuZGxlLT5hY2NlcHQsICphcmd2KTsKKwkJYXJndisrOworCX0KKworCWlmICh0YXJfaGFuZGxlLT5hY2NlcHQgfHwgdGFyX2hhbmRsZS0+cmVqZWN0KQorCQl0YXJfaGFuZGxlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X3JlamVjdF9saXN0OworCisJLyogT3BlbiB0aGUgdGFyIGZpbGUgKi8KKwl7CisJCWludCB0YXJfZmQgPSBTVERJTl9GSUxFTk87CisJCWludCBmbGFncyA9IE9fUkRPTkxZOworCisJCWlmIChvcHQgJiBPUFRfQ1JFQVRFKSB7CisJCQkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGZpbGUgdG8gdGFyIHVwICovCisJCQlpZiAodGFyX2hhbmRsZS0+YWNjZXB0ID09IE5VTEwpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVtcHR5IGFyY2hpdmUiKTsKKworCQkJdGFyX2ZkID0gU1RET1VUX0ZJTEVOTzsKKwkJCS8qIE1pbWlja2luZyBHTlUgdGFyIDEuMTUuMTogKi8KKwkJCWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKwkJfQorCisJCWlmIChMT05FX0RBU0godGFyX2ZpbGVuYW1lKSkgeworCQkJdGFyX2hhbmRsZS0+c3JjX2ZkID0gdGFyX2ZkOworCQkJdGFyX2hhbmRsZS0+c2VlayA9IHNlZWtfYnlfcmVhZDsKKwkJfSBlbHNlIHsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVAorCQkJICYmIGZsYWdzID09IE9fUkRPTkxZCisJCQkgJiYgZ2V0X2hlYWRlcl9wdHIgPT0gZ2V0X2hlYWRlcl90YXIKKwkJCSkgeworCQkJCXRhcl9oYW5kbGUtPnNyY19mZCA9IG9wZW5femlwcGVkKHRhcl9maWxlbmFtZSk7CisJCQkJaWYgKHRhcl9oYW5kbGUtPnNyY19mZCA8IDApCisJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAnJXMnIiwgdGFyX2ZpbGVuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJdGFyX2hhbmRsZS0+c3JjX2ZkID0geG9wZW4odGFyX2ZpbGVuYW1lLCBmbGFncyk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoYmFzZV9kaXIpCisJCXhjaGRpcihiYXNlX2Rpcik7CisKKyNpZmRlZiBDSEVDS19GT1JfQ0hJTERfRVhJVENPREUKKwkvKiBXZSBuZWVkIHRvIGtub3cgd2hldGhlciBjaGlsZCAoZ3ppcC9iemlwL2V0YykgZXhpdHMgYWJub3JtYWxseSAqLworCXNpZ25hbChTSUdDSExELCBoYW5kbGVfU0lHQ0hMRCk7CisjZW5kaWYKKworCS8qIENyZWF0ZSBhbiBhcmNoaXZlICovCisJaWYgKG9wdCAmIE9QVF9DUkVBVEUpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwkJaW50IHppcE1vZGUgPSAwOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1ogJiYgKG9wdCAmIE9QVF9HWklQKSkKKwkJCXppcE1vZGUgPSAxOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyICYmIChvcHQgJiBPUFRfQlpJUDIpKQorCQkJemlwTW9kZSA9IDI7CisjZW5kaWYKKwkJLyogTkI6IHdyaXRlVGFyRmlsZSgpIGNsb3NlcyB0YXJfaGFuZGxlLT5zcmNfZmQgKi8KKwkJcmV0dXJuIHdyaXRlVGFyRmlsZSh0YXJfaGFuZGxlLT5zcmNfZmQsIHZlcmJvc2VGbGFnLCBvcHQgJiBPUFRfREVSRUZFUkVOQ0UsCisJCQkJdGFyX2hhbmRsZS0+YWNjZXB0LAorCQkJCXRhcl9oYW5kbGUtPnJlamVjdCwgemlwTW9kZSk7CisJfQorCisJd2hpbGUgKGdldF9oZWFkZXJfcHRyKHRhcl9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJY29udGludWU7CisKKwkvKiBDaGVjayB0aGF0IGV2ZXJ5IGZpbGUgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGV4dHJhY3RlZCB3YXMgKi8KKwl3aGlsZSAodGFyX2hhbmRsZS0+YWNjZXB0KSB7CisJCWlmICghZmluZF9saXN0X2VudHJ5KHRhcl9oYW5kbGUtPnJlamVjdCwgdGFyX2hhbmRsZS0+YWNjZXB0LT5kYXRhKQorCQkgJiYgIWZpbmRfbGlzdF9lbnRyeSh0YXJfaGFuZGxlLT5wYXNzZWQsIHRhcl9oYW5kbGUtPmFjY2VwdC0+ZGF0YSkKKwkJKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBmb3VuZCBpbiBhcmNoaXZlIiwKKwkJCQl0YXJfaGFuZGxlLT5hY2NlcHQtPmRhdGEpOworCQl9CisJCXRhcl9oYW5kbGUtPmFjY2VwdCA9IHRhcl9oYW5kbGUtPmFjY2VwdC0+bGluazsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQIC8qICYmIHRhcl9oYW5kbGUtPnNyY19mZCAhPSBTVERJTl9GSUxFTk8gKi8pCisJCWNsb3NlKHRhcl9oYW5kbGUtPnNyY19mZCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvYXJjaGl2YWwvdW56aXAuYyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL3VuemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhNzI5MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2FyY2hpdmFsL3VuemlwLmMKQEAgLTAsMCArMSw3MDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgdW56aXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRWQgQ2xhcmsKKyAqCisgKiBMb29zZWx5IGJhc2VkIG9uIG9yaWdpbmFsIGJ1c3lib3ggdW56aXAgYXBwbGV0IGJ5IExhdXJlbmNlIEFuZGVyc29uLgorICogQWxsIG9wdGlvbnMgYW5kIGZlYXR1cmVzIHNob3VsZCB3b3JrIGluIHRoaXMgdmVyc2lvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEZvciByZWZlcmVuY2Ugc2VlCisgKiBodHRwOi8vd3d3LnBrd2FyZS5jb20vY29tcGFueS9zdGFuZGFyZHMvYXBwbm90ZS8KKyAqIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL2RvYy9hcHBub3RlLWl6LWxhdGVzdC56aXAKKyAqLworCisvKiBUT0RPCisgKiBaaXA2NCArIG90aGVyIG1ldGhvZHMKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdW56aXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstb3B0c1ttb2RpZmllcnNdXSBGSUxFWy56aXBdIFtMSVNUXSBbLXggWExJU1RdIFstZCBESVJdIgorLy91c2FnZTojZGVmaW5lIHVuemlwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRXh0cmFjdCBmaWxlcyBmcm9tIFpJUCBhcmNoaXZlc1xuIgorLy91c2FnZTogICAgICJcbgktbAlMaXN0IGFyY2hpdmUgY29udGVudHMgKHdpdGggLXEgZm9yIHNob3J0IGZvcm0pIgorLy91c2FnZTogICAgICJcbgktbglOZXZlciBvdmVyd3JpdGUgZmlsZXMgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktbwlPdmVyd3JpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1wCVNlbmQgb3V0cHV0IHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJUXVpZXQiCisvL3VzYWdlOiAgICAgIlxuCS14IFhMU1QJRXhjbHVkZSB0aGVzZSBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgRElSCUV4dHJhY3QgZmlsZXMgaW50byBESVIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworZW51bSB7CisjaWYgQkJfQklHX0VORElBTgorCVpJUF9GSUxFSEVBREVSX01BR0lDID0gMHg1MDRiMDMwNCwKKwlaSVBfQ0RGX01BR0lDICAgICAgICA9IDB4NTA0YjAxMDIsIC8qIGNlbnRyYWwgZGlyZWN0b3J5J3MgZmlsZSBoZWFkZXIgKi8KKwlaSVBfQ0RFX01BR0lDICAgICAgICA9IDB4NTA0YjA1MDYsIC8qICJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiIHJlY29yZCAqLworCVpJUF9ERF9NQUdJQyAgICAgICAgID0gMHg1MDRiMDcwOCwKKyNlbHNlCisJWklQX0ZJTEVIRUFERVJfTUFHSUMgPSAweDA0MDM0YjUwLAorCVpJUF9DREZfTUFHSUMgICAgICAgID0gMHgwMjAxNGI1MCwKKwlaSVBfQ0RFX01BR0lDICAgICAgICA9IDB4MDYwNTRiNTAsCisJWklQX0REX01BR0lDICAgICAgICAgPSAweDA4MDc0YjUwLAorI2VuZGlmCit9OworCisjZGVmaW5lIFpJUF9IRUFERVJfTEVOIDI2CisKK3R5cGVkZWYgdW5pb24geworCXVpbnQ4X3QgcmF3W1pJUF9IRUFERVJfTEVOXTsKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgIC8qIDAtMSAqLworCQl1aW50MTZfdCB6aXBfZmxhZ3M7ICAgICAgICAgICAgIC8qIDItMyAqLworCQl1aW50MTZfdCBtZXRob2Q7ICAgICAgICAgICAgICAgIC8qIDQtNSAqLworCQl1aW50MTZfdCBtb2R0aW1lOyAgICAgICAgICAgICAgIC8qIDYtNyAqLworCQl1aW50MTZfdCBtb2RkYXRlOyAgICAgICAgICAgICAgIC8qIDgtOSAqLworCQl1aW50MzJfdCBjcmMzMiBQQUNLRUQ7ICAgICAgICAgIC8qIDEwLTEzICovCisJCXVpbnQzMl90IGNtcHNpemUgUEFDS0VEOyAgICAgICAgLyogMTQtMTcgKi8KKwkJdWludDMyX3QgdWNtcHNpemUgUEFDS0VEOyAgICAgICAvKiAxOC0yMSAqLworCQl1aW50MTZfdCBmaWxlbmFtZV9sZW47ICAgICAgICAgIC8qIDIyLTIzICovCisJCXVpbnQxNl90IGV4dHJhX2xlbjsgICAgICAgICAgICAgLyogMjQtMjUgKi8KKwl9IGZvcm1hdHRlZCBQQUNLRUQ7Cit9IHppcF9oZWFkZXJfdDsgLyogUEFDS0VEIC0gZ2NjIDQuMi4xIGRvZXNuJ3QgbGlrZSBpdCAoc3Bld3Mgd2FybmluZykgKi8KKworLyogQ2hlY2sgdGhlIG9mZnNldCBvZiB0aGUgbGFzdCBlbGVtZW50LCBub3QgdGhlIGxlbmd0aC4gIFRoaXMgbGVuaWVuY3kKKyAqIGFsbG93cyBmb3IgcG9vciBwYWNraW5nLCB3aGVyZWJ5IHRoZSBvdmVyYWxsIHN0cnVjdCBtYXkgYmUgdG9vIGxvbmcsCisgKiBldmVuIHRob3VnaCB0aGUgZWxlbWVudHMgYXJlIGFsbCBpbiB0aGUgcmlnaHQgcGxhY2UuCisgKi8KK3N0cnVjdCBCVUdfemlwX2hlYWRlcl9tdXN0X2JlXzI2X2J5dGVzIHsKKwljaGFyIEJVR196aXBfaGVhZGVyX211c3RfYmVfMjZfYnl0ZXNbCisJCW9mZnNldG9mKHppcF9oZWFkZXJfdCwgZm9ybWF0dGVkLmV4dHJhX2xlbikgKyAyCisJCQk9PSBaSVBfSEVBREVSX0xFTiA/IDEgOiAtMV07Cit9OworCisjZGVmaW5lIEZJWF9FTkRJQU5ORVNTX1pJUCh6aXBfaGVhZGVyKSBkbyB7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLnZlcnNpb24gICAgICA9IFNXQVBfTEUxNigoemlwX2hlYWRlcikuZm9ybWF0dGVkLnZlcnNpb24gICAgICk7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLm1ldGhvZCAgICAgICA9IFNXQVBfTEUxNigoemlwX2hlYWRlcikuZm9ybWF0dGVkLm1ldGhvZCAgICAgICk7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLm1vZHRpbWUgICAgICA9IFNXQVBfTEUxNigoemlwX2hlYWRlcikuZm9ybWF0dGVkLm1vZHRpbWUgICAgICk7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLm1vZGRhdGUgICAgICA9IFNXQVBfTEUxNigoemlwX2hlYWRlcikuZm9ybWF0dGVkLm1vZGRhdGUgICAgICk7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLmNyYzMyICAgICAgICA9IFNXQVBfTEUzMigoemlwX2hlYWRlcikuZm9ybWF0dGVkLmNyYzMyICAgICAgICk7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLmNtcHNpemUgICAgICA9IFNXQVBfTEUzMigoemlwX2hlYWRlcikuZm9ybWF0dGVkLmNtcHNpemUgICAgICk7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLnVjbXBzaXplICAgICA9IFNXQVBfTEUzMigoemlwX2hlYWRlcikuZm9ybWF0dGVkLnVjbXBzaXplICAgICk7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLmZpbGVuYW1lX2xlbiA9IFNXQVBfTEUxNigoemlwX2hlYWRlcikuZm9ybWF0dGVkLmZpbGVuYW1lX2xlbik7IFwKKwkoemlwX2hlYWRlcikuZm9ybWF0dGVkLmV4dHJhX2xlbiAgICA9IFNXQVBfTEUxNigoemlwX2hlYWRlcikuZm9ybWF0dGVkLmV4dHJhX2xlbiAgICk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0RGX0hFQURFUl9MRU4gNDIKKwordHlwZWRlZiB1bmlvbiB7CisJdWludDhfdCByYXdbQ0RGX0hFQURFUl9MRU5dOworCXN0cnVjdCB7CisJCS8qIHVpbnQzMl90IHNpZ25hdHVyZTsgNTAgNGIgMDEgMDIgKi8KKwkJdWludDE2X3QgdmVyc2lvbl9tYWRlX2J5OyAgICAgICAvKiAwLTEgKi8KKwkJdWludDE2X3QgdmVyc2lvbl9uZWVkZWQ7ICAgICAgICAvKiAyLTMgKi8KKwkJdWludDE2X3QgY2RmX2ZsYWdzOyAgICAgICAgICAgICAvKiA0LTUgKi8KKwkJdWludDE2X3QgbWV0aG9kOyAgICAgICAgICAgICAgICAvKiA2LTcgKi8KKwkJdWludDE2X3QgbXRpbWU7ICAgICAgICAgICAgICAgICAvKiA4LTkgKi8KKwkJdWludDE2X3QgbWRhdGU7ICAgICAgICAgICAgICAgICAvKiAxMC0xMSAqLworCQl1aW50MzJfdCBjcmMzMjsgICAgICAgICAgICAgICAgIC8qIDEyLTE1ICovCisJCXVpbnQzMl90IGNtcHNpemU7ICAgICAgICAgICAgICAgLyogMTYtMTkgKi8KKwkJdWludDMyX3QgdWNtcHNpemU7ICAgICAgICAgICAgICAvKiAyMC0yMyAqLworCQl1aW50MTZfdCBmaWxlX25hbWVfbGVuZ3RoOyAgICAgIC8qIDI0LTI1ICovCisJCXVpbnQxNl90IGV4dHJhX2ZpZWxkX2xlbmd0aDsgICAgLyogMjYtMjcgKi8KKwkJdWludDE2X3QgZmlsZV9jb21tZW50X2xlbmd0aDsgICAvKiAyOC0yOSAqLworCQl1aW50MTZfdCBkaXNrX251bWJlcl9zdGFydDsgICAgIC8qIDMwLTMxICovCisJCXVpbnQxNl90IGludGVybmFsX2ZpbGVfYXR0cmlidXRlczsgLyogMzItMzMgKi8KKwkJdWludDMyX3QgZXh0ZXJuYWxfZmlsZV9hdHRyaWJ1dGVzIFBBQ0tFRDsgLyogMzQtMzcgKi8KKwkJdWludDMyX3QgcmVsYXRpdmVfb2Zmc2V0X29mX2xvY2FsX2hlYWRlciBQQUNLRUQ7IC8qIDM4LTQxICovCisJfSBmb3JtYXR0ZWQgUEFDS0VEOworfSBjZGZfaGVhZGVyX3Q7CisKK3N0cnVjdCBCVUdfY2RmX2hlYWRlcl9tdXN0X2JlXzQyX2J5dGVzIHsKKwljaGFyIEJVR19jZGZfaGVhZGVyX211c3RfYmVfNDJfYnl0ZXNbCisJCW9mZnNldG9mKGNkZl9oZWFkZXJfdCwgZm9ybWF0dGVkLnJlbGF0aXZlX29mZnNldF9vZl9sb2NhbF9oZWFkZXIpICsgNAorCQkJPT0gQ0RGX0hFQURFUl9MRU4gPyAxIDogLTFdOworfTsKKworI2RlZmluZSBGSVhfRU5ESUFOTkVTU19DREYoY2RmX2hlYWRlcikgZG8geyBcCisJKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5jcmMzMiAgICAgICAgPSBTV0FQX0xFMzIoKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5jcmMzMiAgICAgICApOyBcCisJKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5jbXBzaXplICAgICAgPSBTV0FQX0xFMzIoKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5jbXBzaXplICAgICApOyBcCisJKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC51Y21wc2l6ZSAgICAgPSBTV0FQX0xFMzIoKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC51Y21wc2l6ZSAgICApOyBcCisJKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5maWxlX25hbWVfbGVuZ3RoID0gU1dBUF9MRTE2KChjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuZmlsZV9uYW1lX2xlbmd0aCk7IFwKKwkoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmV4dHJhX2ZpZWxkX2xlbmd0aCA9IFNXQVBfTEUxNigoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmV4dHJhX2ZpZWxkX2xlbmd0aCk7IFwKKwkoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmZpbGVfY29tbWVudF9sZW5ndGggPSBTV0FQX0xFMTYoKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5maWxlX2NvbW1lbnRfbGVuZ3RoKTsgXAorCUlGX0RFU0tUT1AoIFwKKwkoY2RmX2hlYWRlcikuZm9ybWF0dGVkLnZlcnNpb25fbWFkZV9ieSA9IFNXQVBfTEUxNigoY2RmX2hlYWRlcikuZm9ybWF0dGVkLnZlcnNpb25fbWFkZV9ieSk7IFwKKwkoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmV4dGVybmFsX2ZpbGVfYXR0cmlidXRlcyA9IFNXQVBfTEUzMigoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmV4dGVybmFsX2ZpbGVfYXR0cmlidXRlcyk7IFwKKwkpIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0RFX0hFQURFUl9MRU4gMTYKKwordHlwZWRlZiB1bmlvbiB7CisJdWludDhfdCByYXdbQ0RFX0hFQURFUl9MRU5dOworCXN0cnVjdCB7CisJCS8qIHVpbnQzMl90IHNpZ25hdHVyZTsgNTAgNGIgMDUgMDYgKi8KKwkJdWludDE2X3QgdGhpc19kaXNrX25vOworCQl1aW50MTZfdCBkaXNrX3dpdGhfY2RmX25vOworCQl1aW50MTZfdCBjZGZfZW50cmllc19vbl90aGlzX2Rpc2s7CisJCXVpbnQxNl90IGNkZl9lbnRyaWVzX3RvdGFsOworCQl1aW50MzJfdCBjZGZfc2l6ZTsKKwkJdWludDMyX3QgY2RmX29mZnNldDsKKwkJLyogdWludDE2X3QgZmlsZV9jb21tZW50X2xlbmd0aDsgKi8KKwkJLyogLlpJUCBmaWxlIGNvbW1lbnQgKHZhcmlhYmxlIHNpemUpICovCisJfSBmb3JtYXR0ZWQgUEFDS0VEOworfSBjZGVfaGVhZGVyX3Q7CisKK3N0cnVjdCBCVUdfY2RlX2hlYWRlcl9tdXN0X2JlXzE2X2J5dGVzIHsKKwljaGFyIEJVR19jZGVfaGVhZGVyX211c3RfYmVfMTZfYnl0ZXNbCisJCXNpemVvZihjZGVfaGVhZGVyX3QpID09IENERV9IRUFERVJfTEVOID8gMSA6IC0xXTsKK307CisKKyNkZWZpbmUgRklYX0VORElBTk5FU1NfQ0RFKGNkZV9oZWFkZXIpIGRvIHsgXAorCShjZGVfaGVhZGVyKS5mb3JtYXR0ZWQuY2RmX29mZnNldCA9IFNXQVBfTEUzMigoY2RlX2hlYWRlcikuZm9ybWF0dGVkLmNkZl9vZmZzZXQpOyBcCit9IHdoaWxlICgwKQorCitlbnVtIHsgemlwX2ZkID0gMyB9OworCisKKyNpZiBFTkFCTEVfREVTS1RPUAorCisjZGVmaW5lIFBFRUtfRlJPTV9FTkQgMTYzODQKKworLyogTkI6IGRvZXMgbm90IHByZXNlcnZlIGZpbGUgcG9zaXRpb24hICovCitzdGF0aWMgdWludDMyX3QgZmluZF9jZGZfb2Zmc2V0KHZvaWQpCit7CisJY2RlX2hlYWRlcl90IGNkZV9oZWFkZXI7CisJdW5zaWduZWQgY2hhciAqcDsKKwlvZmZfdCBlbmQ7CisJdW5zaWduZWQgY2hhciAqYnVmID0geHphbGxvYyhQRUVLX0ZST01fRU5EKTsKKworCWVuZCA9IHhsc2Vlayh6aXBfZmQsIDAsIFNFRUtfRU5EKTsKKwllbmQgLT0gUEVFS19GUk9NX0VORDsKKwlpZiAoZW5kIDwgMCkKKwkJZW5kID0gMDsKKwl4bHNlZWsoemlwX2ZkLCBlbmQsIFNFRUtfU0VUKTsKKwlmdWxsX3JlYWQoemlwX2ZkLCBidWYsIFBFRUtfRlJPTV9FTkQpOworCisJcCA9IGJ1ZjsKKwl3aGlsZSAocCA8PSBidWYgKyBQRUVLX0ZST01fRU5EIC0gQ0RFX0hFQURFUl9MRU4gLSA0KSB7CisJCWlmICgqcCAhPSAnUCcpIHsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqKytwICE9ICdLJykKKwkJCWNvbnRpbnVlOworCQlpZiAoKisrcCAhPSA1KQorCQkJY29udGludWU7CisJCWlmICgqKytwICE9IDYpCisJCQljb250aW51ZTsKKwkJLyogd2UgZm91bmQgQ0RFISAqLworCQltZW1jcHkoY2RlX2hlYWRlci5yYXcsIHAgKyAxLCBDREVfSEVBREVSX0xFTik7CisJCUZJWF9FTkRJQU5ORVNTX0NERShjZGVfaGVhZGVyKTsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gY2RlX2hlYWRlci5mb3JtYXR0ZWQuY2RmX29mZnNldDsKKwl9CisJLy9mcmVlKGJ1Zik7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgZmlsZSB0YWJsZSIpOworfTsKKworc3RhdGljIHVpbnQzMl90IHJlYWRfbmV4dF9jZGYodWludDMyX3QgY2RmX29mZnNldCwgY2RmX2hlYWRlcl90ICpjZGZfcHRyKQoreworCW9mZl90IG9yZzsKKworCW9yZyA9IHhsc2Vlayh6aXBfZmQsIDAsIFNFRUtfQ1VSKTsKKworCWlmICghY2RmX29mZnNldCkKKwkJY2RmX29mZnNldCA9IGZpbmRfY2RmX29mZnNldCgpOworCisJeGxzZWVrKHppcF9mZCwgY2RmX29mZnNldCArIDQsIFNFRUtfU0VUKTsKKwl4cmVhZCh6aXBfZmQsIGNkZl9wdHItPnJhdywgQ0RGX0hFQURFUl9MRU4pOworCUZJWF9FTkRJQU5ORVNTX0NERigqY2RmX3B0cik7CisJY2RmX29mZnNldCArPSA0ICsgQ0RGX0hFQURFUl9MRU4KKwkJKyBjZGZfcHRyLT5mb3JtYXR0ZWQuZmlsZV9uYW1lX2xlbmd0aAorCQkrIGNkZl9wdHItPmZvcm1hdHRlZC5leHRyYV9maWVsZF9sZW5ndGgKKwkJKyBjZGZfcHRyLT5mb3JtYXR0ZWQuZmlsZV9jb21tZW50X2xlbmd0aDsKKworCXhsc2Vlayh6aXBfZmQsIG9yZywgU0VFS19TRVQpOworCXJldHVybiBjZGZfb2Zmc2V0OworfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB1bnppcF9za2lwKG9mZl90IHNraXApCit7CisJaWYgKGxzZWVrKHppcF9mZCwgc2tpcCwgU0VFS19DVVIpID09IChvZmZfdCktMSkKKwkJYmJfY29weWZkX2V4YWN0X3NpemUoemlwX2ZkLCAtMSwgc2tpcCk7Cit9CisKK3N0YXRpYyB2b2lkIHVuemlwX2NyZWF0ZV9sZWFkaW5nX2RpcnMoY29uc3QgY2hhciAqZm4pCit7CisJLyogQ3JlYXRlIGFsbCBsZWFkaW5nIGRpcmVjdG9yaWVzICovCisJY2hhciAqbmFtZSA9IHhzdHJkdXAoZm4pOworCWlmIChiYl9tYWtlX2RpcmVjdG9yeShkaXJuYW1lKG5hbWUpLCAwNzc3LCBGSUxFVVRJTFNfUkVDVVIpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJleGl0aW5nIik7IC8qIGJiX21ha2VfZGlyZWN0b3J5IGlzIG5vaXN5ICovCisJfQorCWZyZWUobmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVuemlwX2V4dHJhY3QoemlwX2hlYWRlcl90ICp6aXBfaGVhZGVyLCBpbnQgZHN0X2ZkKQoreworCWlmICh6aXBfaGVhZGVyLT5mb3JtYXR0ZWQubWV0aG9kID09IDApIHsKKwkJLyogTWV0aG9kIDAgLSBzdG9yZWQgKG5vdCBjb21wcmVzc2VkKSAqLworCQlvZmZfdCBzaXplID0gemlwX2hlYWRlci0+Zm9ybWF0dGVkLnVjbXBzaXplOworCQlpZiAoc2l6ZSkKKwkJCWJiX2NvcHlmZF9leGFjdF9zaXplKHppcF9mZCwgZHN0X2ZkLCBzaXplKTsKKwl9IGVsc2UgeworCQkvKiBNZXRob2QgOCAtIGluZmxhdGUgKi8KKwkJaW5mbGF0ZV91bnppcF9yZXN1bHQgcmVzOworCQlpZiAoaW5mbGF0ZV91bnppcCgmcmVzLCB6aXBfaGVhZGVyLT5mb3JtYXR0ZWQuY21wc2l6ZSwgemlwX2ZkLCBkc3RfZmQpIDwgMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbmZsYXRlIGVycm9yIik7CisJCS8qIFZhbGlkYXRlIGRlY29tcHJlc3Npb24gLSBjcmMgKi8KKwkJaWYgKHppcF9oZWFkZXItPmZvcm1hdHRlZC5jcmMzMiAhPSAocmVzLmNyYyBeIDB4ZmZmZmZmZmZMKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNyYyBlcnJvciIpOworCQl9CisJCS8qIFZhbGlkYXRlIGRlY29tcHJlc3Npb24gLSBzaXplICovCisJCWlmICh6aXBfaGVhZGVyLT5mb3JtYXR0ZWQudWNtcHNpemUgIT0gcmVzLmJ5dGVzX291dCkgeworCQkJLyogRG9uJ3QgZGllLiBXaG8ga25vd3MsIG1heWJlIGxlbiBjYWxjdWxhdGlvbgorCQkJICogd2FzIGJvdGNoZWQgc29tZXdoZXJlLiBBZnRlciBhbGwsIGNyYyBtYXRjaGVkISAqLworCQkJYmJfZXJyb3JfbXNnKCJiYWQgbGVuZ3RoIik7CisJCX0KKwl9Cit9CisKK2ludCB1bnppcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdW56aXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7IE9fUFJPTVBULCBPX05FVkVSLCBPX0FMV0FZUyB9OworCisJemlwX2hlYWRlcl90IHppcF9oZWFkZXI7CisJc21hbGxpbnQgcXVpZXQgPSAwOworCUlGX05PVF9ERVNLVE9QKGNvbnN0KSBzbWFsbGludCB2ZXJib3NlID0gMDsKKwlzbWFsbGludCBsaXN0aW5nID0gMDsKKwlzbWFsbGludCBvdmVyd3JpdGUgPSBPX1BST01QVDsKKyNpZiBFTkFCTEVfREVTS1RPUAorCXVpbnQzMl90IGNkZl9vZmZzZXQ7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3VzaXplOworCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKKwl1bnNpZ25lZCB0b3RhbF9lbnRyaWVzOworCWludCBkc3RfZmQgPSAtMTsKKwljaGFyICpzcmNfZm4gPSBOVUxMOworCWNoYXIgKmRzdF9mbiA9IE5VTEw7CisJbGxpc3RfdCAqemFjY2VwdCA9IE5VTEw7CisJbGxpc3RfdCAqenJlamVjdCA9IE5VTEw7CisJY2hhciAqYmFzZV9kaXIgPSBOVUxMOworCWludCBpLCBvcHQ7CisJaW50IG9wdF9yYW5nZSA9IDA7CisJY2hhciBrZXlfYnVmWzgwXTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKKworLyogLXEsIC1sIGFuZCAtdjogVW5aaXAgNS41MiBvZiAyOCBGZWJydWFyeSAyMDA1LCBieSBJbmZvLVpJUDoKKyAqCisgKiAjIC91c3IvYmluL3VuemlwIC1xcSAtdiBkZWNvbXByZXNzX3VubHptYS5pLnppcAorICogICAyMDQzNzIgIERlZmw6TiAgICAzNTI3OCAgODMlICAwOS0wNi0wOSAxNDoyMyAgMGQwNTYyNTIgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqICMgL3Vzci9iaW4vdW56aXAgLXEgLXYgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICBMZW5ndGggICBNZXRob2QgICAgU2l6ZSAgUmF0aW8gICBEYXRlICAgVGltZSAgIENSQy0zMiAgICBOYW1lCisgKiAtLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tIC0tLS0tICAgLS0tLSAgIC0tLS0gICAtLS0tLS0gICAgLS0tLQorICogICAyMDQzNzIgIERlZmw6TiAgICAzNTI3OCAgODMlICAwOS0wNi0wOSAxNDoyMyAgMGQwNTYyNTIgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqIC0tLS0tLS0tICAgICAgICAgIC0tLS0tLS0gIC0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tCisgKiAgIDIwNDM3MiAgICAgICAgICAgIDM1Mjc4ICA4MyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBmaWxlCisgKiAjIC91c3IvYmluL3VuemlwIC12IGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiBBcmNoaXZlOiAgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICBMZW5ndGggICBNZXRob2QgICAgU2l6ZSAgUmF0aW8gICBEYXRlICAgVGltZSAgIENSQy0zMiAgICBOYW1lCisgKiAtLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tIC0tLS0tICAgLS0tLSAgIC0tLS0gICAtLS0tLS0gICAgLS0tLQorICogICAyMDQzNzIgIERlZmw6TiAgICAzNTI3OCAgODMlICAwOS0wNi0wOSAxNDoyMyAgMGQwNTYyNTIgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqIC0tLS0tLS0tICAgICAgICAgIC0tLS0tLS0gIC0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tCisgKiAgIDIwNDM3MiAgICAgICAgICAgIDM1Mjc4ICA4MyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBmaWxlCisgKiAjIHVuemlwIC12IGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiBBcmNoaXZlOiAgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICAgTGVuZ3RoICAgICBEYXRlICAgVGltZSAgICBOYW1lCisgKiAgLS0tLS0tLS0gICAgLS0tLSAgIC0tLS0gICAgLS0tLQorICogICAgMjA0MzcyICAwOS0wNi0wOSAxNDoyMyAgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqICAtLS0tLS0tLSAgICAgICAgICAgICAgICAgICAtLS0tLS0tCisgKiAgICAyMDQzNzIgICAgICAgICAgICAgICAgICAgMSBmaWxlcworICogIyAvdXNyL2Jpbi91bnppcCAtbCAtcXEgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICAgIDIwNDM3MiAgMDktMDYtMDkgMTQ6MjMgICBkZWNvbXByZXNzX3VubHptYS5pCisgKiAjIC91c3IvYmluL3VuemlwIC1sIC1xIGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiAgIExlbmd0aCAgICAgRGF0ZSAgIFRpbWUgICAgTmFtZQorICogIC0tLS0tLS0tICAgIC0tLS0gICAtLS0tICAgIC0tLS0KKyAqICAgIDIwNDM3MiAgMDktMDYtMDkgMTQ6MjMgICBkZWNvbXByZXNzX3VubHptYS5pCisgKiAgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgLS0tLS0tLQorICogICAgMjA0MzcyICAgICAgICAgICAgICAgICAgIDEgZmlsZQorICogIyAvdXNyL2Jpbi91bnppcCAtbCBkZWNvbXByZXNzX3VubHptYS5pLnppcAorICogQXJjaGl2ZTogIGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiAgIExlbmd0aCAgICAgRGF0ZSAgIFRpbWUgICAgTmFtZQorICogIC0tLS0tLS0tICAgIC0tLS0gICAtLS0tICAgIC0tLS0KKyAqICAgIDIwNDM3MiAgMDktMDYtMDkgMTQ6MjMgICBkZWNvbXByZXNzX3VubHptYS5pCisgKiAgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgLS0tLS0tLQorICogICAgMjA0MzcyICAgICAgICAgICAgICAgICAgIDEgZmlsZQorICovCisKKwkvKiAnLScgbWFrZXMgZ2V0b3B0IHJldHVybiAxIGZvciBub24tb3B0aW9ucyAqLworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICItZDpsbm9wcXh2IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0X3JhbmdlKSB7CisJCWNhc2UgMDogLyogT3B0aW9ucyAqLworCQkJc3dpdGNoIChvcHQpIHsKKwkJCWNhc2UgJ2wnOiAvKiBMaXN0ICovCisJCQkJbGlzdGluZyA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ24nOiAvKiBOZXZlciBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgKi8KKwkJCQlvdmVyd3JpdGUgPSBPX05FVkVSOworCQkJCWJyZWFrOworCisJCQljYXNlICdvJzogLyogQWx3YXlzIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyAqLworCQkJCW92ZXJ3cml0ZSA9IE9fQUxXQVlTOworCQkJCWJyZWFrOworCisJCQljYXNlICdwJzogLyogRXh0cmFjdCBmaWxlcyB0byBzdGRvdXQgYW5kIGZhbGwgdGhyb3VnaCB0byBzZXQgdmVyYm9zaXR5ICovCisJCQkJZHN0X2ZkID0gU1RET1VUX0ZJTEVOTzsKKworCQkJY2FzZSAncSc6IC8qIEJlIHF1aWV0ICovCisJCQkJcXVpZXQrKzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAndic6IC8qIFZlcmJvc2UgbGlzdCAqLworCQkJCUlGX0RFU0tUT1AodmVyYm9zZSsrOykKKwkJCQlsaXN0aW5nID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxOiAvKiBUaGUgemlwIGZpbGUgKi8KKwkJCQkvKiArNTogc3BhY2UgZm9yICIuemlwIiBhbmQgTlVMICovCisJCQkJc3JjX2ZuID0geG1hbGxvYyhzdHJsZW4ob3B0YXJnKSArIDUpOworCQkJCXN0cmNweShzcmNfZm4sIG9wdGFyZyk7CisJCQkJb3B0X3JhbmdlKys7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAxOiAvKiBJbmNsdWRlIGZpbGVzICovCisJCQlpZiAob3B0ID09IDEpIHsKKwkJCQlsbGlzdF9hZGRfdG8oJnphY2NlcHQsIG9wdGFyZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAob3B0ID09ICdkJykgeworCQkJCWJhc2VfZGlyID0gb3B0YXJnOworCQkJCW9wdF9yYW5nZSArPSAyOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKG9wdCA9PSAneCcpIHsKKwkJCQlvcHRfcmFuZ2UrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQljYXNlIDIgOiAvKiBFeGNsdWRlIGZpbGVzICovCisJCQlpZiAob3B0ID09IDEpIHsKKwkJCQlsbGlzdF9hZGRfdG8oJnpyZWplY3QsIG9wdGFyZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAob3B0ID09ICdkJykgeyAvKiBFeHRyYWN0IHRvIGJhc2UgZGlyZWN0b3J5ICovCisJCQkJYmFzZV9kaXIgPSBvcHRhcmc7CisJCQkJb3B0X3JhbmdlKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCisJaWYgKHNyY19mbiA9PSBOVUxMKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBPcGVuIGlucHV0IGZpbGUgKi8KKwlpZiAoTE9ORV9EQVNIKHNyY19mbikpIHsKKwkJeGR1cDIoU1RESU5fRklMRU5PLCB6aXBfZmQpOworCQkvKiBDYW5ub3QgdXNlIHByb21wdCBtb2RlIHNpbmNlIHppcCBkYXRhIGlzIGFycml2aW5nIG9uIFNURElOICovCisJCWlmIChvdmVyd3JpdGUgPT0gT19QUk9NUFQpCisJCQlvdmVyd3JpdGUgPSBPX05FVkVSOworCX0gZWxzZSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIGV4dG5bXVs1XSA9IHsiIiwgIi56aXAiLCAiLlpJUCJ9OworCQlpbnQgb3JpZ19zcmNfZm5fbGVuID0gc3RybGVuKHNyY19mbik7CisJCWludCBzcmNfZmQgPSAtMTsKKworCQlmb3IgKGkgPSAwOyAoaSA8IDMpICYmIChzcmNfZmQgPT0gLTEpOyBpKyspIHsKKwkJCXN0cmNweShzcmNfZm4gKyBvcmlnX3NyY19mbl9sZW4sIGV4dG5baV0pOworCQkJc3JjX2ZkID0gb3BlbihzcmNfZm4sIE9fUkRPTkxZKTsKKwkJfQorCQlpZiAoc3JjX2ZkID09IC0xKSB7CisJCQlzcmNfZm5bb3JpZ19zcmNfZm5fbGVuXSA9ICdcMCc7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAlcywgJXMuemlwLCAlcy5aSVAiLCBzcmNfZm4sIHNyY19mbiwgc3JjX2ZuKTsKKwkJfQorCQl4bW92ZV9mZChzcmNfZmQsIHppcF9mZCk7CisJfQorCisJLyogQ2hhbmdlIGRpciBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoYmFzZV9kaXIpCisJCXhjaGRpcihiYXNlX2Rpcik7CisKKwlpZiAocXVpZXQgPD0gMSkgeyAvKiBub3QgLXFxICovCisJCWlmIChxdWlldCA9PSAwKQorCQkJcHJpbnRmKCJBcmNoaXZlOiAgJXNcbiIsIHNyY19mbik7CisJCWlmIChsaXN0aW5nKSB7CisJCQlwdXRzKHZlcmJvc2UgPworCQkJCSIgTGVuZ3RoICAgTWV0aG9kICAgIFNpemUgIFJhdGlvICAgRGF0ZSAgIFRpbWUgICBDUkMtMzIgICAgTmFtZVxuIgorCQkJCSItLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tIC0tLS0tICAgLS0tLSAgIC0tLS0gICAtLS0tLS0gICAgLS0tLSIKKwkJCQk6CisJCQkJIiAgTGVuZ3RoICAgICBEYXRlICAgVGltZSAgICBOYW1lXG4iCisJCQkJIiAtLS0tLS0tLSAgICAtLS0tICAgLS0tLSAgICAtLS0tIgorCQkJCSk7CisJCX0KKwl9CisKKy8qIEV4YW1wbGUgb2YgYW4gYXJjaGl2ZSB3aXRoIG9uZSAwLWJ5dGUgbG9uZyBmaWxlIG5hbWVkICd6JworICogY3JlYXRlZCBieSBaaXAgMi4zMSBvbiBVbml4OgorICogMDAwMCBbNTAgNGJdMDMgMDQgMGEgMDAgMDAgMDAgMDAgMDAgNDIgMWEgYjggM2MgMDAgMDAgfFBLLi4uLi4uLi5CLi48Li58CisgKiAgICAgICBzaWcuLi4uLi4uLiB2bmVlZCBmbGFncyBjb21wciBtdGltZSBtZGF0ZSBjcmMzMj4KKyAqIDAwMTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAxIDAwIDE1IDAwIDdhIDU1IHwuLi4uLi4uLi4uLi4uLnpVfAorICogICAgICA+Li4uLi4gY3NpemUuLi4uLi4gdXNpemUuLi4uLi4gZm5sZW4gZXhsZW4gZm4gZXg+CisgKiAwMDIwICA1NCAwOSAwMCAwMyBjYyBkMyBmOSA0YiBjYyBkMyBmOSA0YiA1NSA3OCAwNCAwMCB8VC4uLi4uLksuLi5LVXguLnwKKyAqICAgICAgPnRyYV9maWVsZC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgKiAwMDMwICAwMCAwMCAwMCAwMFs1MCA0Yl0wMSAwMiAxNyAwMyAwYSAwMCAwMCAwMCAwMCAwMCB8Li4uLlBLLi4uLi4uLi4uLnwKKyAqICAgICAgIC4uLi4uLi4uLi4uIHNpZy4uLi4uLi4uIHZtYWRlIHZuZWVkIGZsYWdzIGNvbXByCisgKiAwMDQwICA0MiAxYSBiOCAzYyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8Qi4uPC4uLi4uLi4uLi4uLnwKKyAqICAgICAgIG10aW1lIG1kYXRlIGNyYzMyLi4uLi4uIGNzaXplLi4uLi4uIHVzaXplLi4uLi4uCisgKiAwMDUwICAwMSAwMCAwZCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCBhNCA4MSAwMCAwMCB8Li4uLi4uLi4uLi4uLi4uLnwKKyAqICAgICAgIGZubGVuIGV4bGVuIGNsZW4uIGRudW0uIGlhdHRyIGVhdHRyLi4uLi4uIHJlbG9mcz4gKGVhdHRyID0gcnctci0tci0tKQorICogMDA2MCAgMDAgMDAgN2EgNTUgNTQgMDUgMDAgMDMgY2MgZDMgZjkgNGIgNTUgNzggMDAgMDAgfC4uelVULi4uLi4uS1V4Li58CisgKiAgICAgID4uLi4uLiBmbiBleHRyYV9maWVsZC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICogMDA3MCBbNTAgNGJdMDUgMDYgMDAgMDAgMDAgMDAgMDEgMDAgMDEgMDAgM2MgMDAgMDAgMDAgfFBLLi4uLi4uLi4uLjwuLi58CisgKiAwMDgwICAzNCAwMCAwMCAwMCAwMCAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8NC4uLi4ufAorICovCisJdG90YWxfdXNpemUgPSAwOworCXRvdGFsX3NpemUgPSAwOworCXRvdGFsX2VudHJpZXMgPSAwOworI2lmIEVOQUJMRV9ERVNLVE9QCisJY2RmX29mZnNldCA9IDA7CisjZW5kaWYKKwl3aGlsZSAoMSkgeworCQl1aW50MzJfdCBtYWdpYzsKKwkJbW9kZV90IGRpcl9tb2RlID0gMDc3NzsKKyNpZiBFTkFCTEVfREVTS1RPUAorCQltb2RlX3QgZmlsZV9tb2RlID0gMDY2NjsKKyNlbmRpZgorCisJCS8qIENoZWNrIG1hZ2ljIG51bWJlciAqLworCQl4cmVhZCh6aXBfZmQsICZtYWdpYywgNCk7CisJCS8qIENlbnRyYWwgZGlyZWN0b3J5PyBJdCdzIGF0IHRoZSBlbmQsIHNvIGV4aXQgKi8KKwkJaWYgKG1hZ2ljID09IFpJUF9DREZfTUFHSUMpCisJCQlicmVhazsKKyNpZiBFTkFCTEVfREVTS1RPUAorCQkvKiBEYXRhIGRlc2NyaXB0b3I/IEl0IHdhcyBhIHN0cmVhbWluZyBmaWxlLCBnbyBvbiAqLworCQlpZiAobWFnaWMgPT0gWklQX0REX01BR0lDKSB7CisJCQkvKiBza2lwIG92ZXIgZHVwbGljYXRlIGNyYzMyLCBjbXBzaXplIGFuZCB1Y21wc2l6ZSAqLworCQkJdW56aXBfc2tpcCgzICogNCk7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisJCWlmIChtYWdpYyAhPSBaSVBfRklMRUhFQURFUl9NQUdJQykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHppcCBtYWdpYyAlMDhYIiwgKGludCltYWdpYyk7CisKKwkJLyogUmVhZCB0aGUgZmlsZSBoZWFkZXIgKi8KKwkJeHJlYWQoemlwX2ZkLCB6aXBfaGVhZGVyLnJhdywgWklQX0hFQURFUl9MRU4pOworCQlGSVhfRU5ESUFOTkVTU19aSVAoemlwX2hlYWRlcik7CisJCWlmICgoemlwX2hlYWRlci5mb3JtYXR0ZWQubWV0aG9kICE9IDApICYmICh6aXBfaGVhZGVyLmZvcm1hdHRlZC5tZXRob2QgIT0gOCkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnN1cHBvcnRlZCBtZXRob2QgJWQiLCB6aXBfaGVhZGVyLmZvcm1hdHRlZC5tZXRob2QpOworCQl9CisjaWYgIUVOQUJMRV9ERVNLVE9QCisJCWlmICh6aXBfaGVhZGVyLmZvcm1hdHRlZC56aXBfZmxhZ3MgJiBTV0FQX0xFMTYoMHgwMDA5KSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInppcCBmbGFncyAxIGFuZCA4IGFyZSBub3Qgc3VwcG9ydGVkIik7CisJCX0KKyNlbHNlCisJCWlmICh6aXBfaGVhZGVyLmZvcm1hdHRlZC56aXBfZmxhZ3MgJiBTV0FQX0xFMTYoMHgwMDAxKSkgeworCQkJLyogMHgwMDAxIC0gZW5jcnlwdGVkICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiemlwIGZsYWcgMSAoZW5jcnlwdGlvbikgaXMgbm90IHN1cHBvcnRlZCIpOworCQl9CisKKwkJeworCQkJY2RmX2hlYWRlcl90IGNkZl9oZWFkZXI7CisJCQljZGZfb2Zmc2V0ID0gcmVhZF9uZXh0X2NkZihjZGZfb2Zmc2V0LCAmY2RmX2hlYWRlcik7CisJCQlpZiAoemlwX2hlYWRlci5mb3JtYXR0ZWQuemlwX2ZsYWdzICYgU1dBUF9MRTE2KDB4MDAwOCkpIHsKKwkJCQkvKiAweDAwMDggLSBzdHJlYW1pbmcuIFt1XWNtcHNpemUgY2FuIGJlIHJlbGlhYmx5IGdvdHRlbgorCQkJCSAqIG9ubHkgZnJvbSBDZW50cmFsIERpcmVjdG9yeS4gU2VlIHVuemlwX2RvYy50eHQgKi8KKwkJCQl6aXBfaGVhZGVyLmZvcm1hdHRlZC5jcmMzMiAgICA9IGNkZl9oZWFkZXIuZm9ybWF0dGVkLmNyYzMyOworCQkJCXppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemUgID0gY2RmX2hlYWRlci5mb3JtYXR0ZWQuY21wc2l6ZTsKKwkJCQl6aXBfaGVhZGVyLmZvcm1hdHRlZC51Y21wc2l6ZSA9IGNkZl9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplOworCQkJfQorCQkJaWYgKChjZGZfaGVhZGVyLmZvcm1hdHRlZC52ZXJzaW9uX21hZGVfYnkgPj4gOCkgPT0gMykgeworCQkJCS8qIHRoaXMgYXJjaGl2ZSBpcyBjcmVhdGVkIG9uIFVuaXggKi8KKwkJCQlkaXJfbW9kZSA9IGZpbGVfbW9kZSA9IChjZGZfaGVhZGVyLmZvcm1hdHRlZC5leHRlcm5hbF9maWxlX2F0dHJpYnV0ZXMgPj4gMTYpOworCQkJfQorCQl9CisjZW5kaWYKKworCQkvKiBSZWFkIGZpbGVuYW1lICovCisJCWZyZWUoZHN0X2ZuKTsKKwkJZHN0X2ZuID0geHphbGxvYyh6aXBfaGVhZGVyLmZvcm1hdHRlZC5maWxlbmFtZV9sZW4gKyAxKTsKKwkJeHJlYWQoemlwX2ZkLCBkc3RfZm4sIHppcF9oZWFkZXIuZm9ybWF0dGVkLmZpbGVuYW1lX2xlbik7CisKKwkJLyogU2tpcCBleHRyYSBoZWFkZXIgYnl0ZXMgKi8KKwkJdW56aXBfc2tpcCh6aXBfaGVhZGVyLmZvcm1hdHRlZC5leHRyYV9sZW4pOworCisJCS8qIEZpbHRlciB6aXAgZW50cmllcyAqLworCQlpZiAoZmluZF9saXN0X2VudHJ5KHpyZWplY3QsIGRzdF9mbikKKwkJIHx8ICh6YWNjZXB0ICYmICFmaW5kX2xpc3RfZW50cnkoemFjY2VwdCwgZHN0X2ZuKSkKKwkJKSB7IC8qIFNraXAgZW50cnkgKi8KKwkJCWkgPSAnbic7CisKKwkJfSBlbHNlIHsgLyogRXh0cmFjdCBlbnRyeSAqLworCQkJaWYgKGxpc3RpbmcpIHsgLyogTGlzdCBlbnRyeSAqLworCQkJCXVuc2lnbmVkIGRvc3RpbWUgPSB6aXBfaGVhZGVyLmZvcm1hdHRlZC5tb2R0aW1lIHwgKHppcF9oZWFkZXIuZm9ybWF0dGVkLm1vZGRhdGUgPDwgMTYpOworCQkJCWlmICghdmVyYm9zZSkgeworCQkJCQkvLyAgICAgICIgIExlbmd0aCAgICAgRGF0ZSAgIFRpbWUgICAgTmFtZVxuIgorCQkJCQkvLyAgICAgICIgLS0tLS0tLS0gICAgLS0tLSAgIC0tLS0gICAgLS0tLSIKKwkJCQkJcHJpbnRmKCAgICAgICAiJTl1ICAlMDJ1LSUwMnUtJTAydSAlMDJ1OiUwMnUgICAlc1xuIiwKKwkJCQkJCSh1bnNpZ25lZCl6aXBfaGVhZGVyLmZvcm1hdHRlZC51Y21wc2l6ZSwKKwkJCQkJCShkb3N0aW1lICYgMHgwMWUwMDAwMCkgPj4gMjEsCisJCQkJCQkoZG9zdGltZSAmIDB4MDAxZjAwMDApID4+IDE2LAorCQkJCQkJKCgoZG9zdGltZSAmIDB4ZmUwMDAwMDApID4+IDI1KSArIDE5ODApICUgMTAwLAorCQkJCQkJKGRvc3RpbWUgJiAweDAwMDBmODAwKSA+PiAxMSwKKwkJCQkJCShkb3N0aW1lICYgMHgwMDAwMDdlMCkgPj4gNSwKKwkJCQkJCWRzdF9mbik7CisJCQkJCXRvdGFsX3VzaXplICs9IHppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplOworCQkJCX0gZWxzZSB7CisJCQkJCXVuc2lnbmVkIGxvbmcgcGVyY2VudHMgPSB6aXBfaGVhZGVyLmZvcm1hdHRlZC51Y21wc2l6ZSAtIHppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemU7CisJCQkJCXBlcmNlbnRzID0gcGVyY2VudHMgKiAxMDA7CisJCQkJCWlmICh6aXBfaGVhZGVyLmZvcm1hdHRlZC51Y21wc2l6ZSkKKwkJCQkJCXBlcmNlbnRzIC89IHppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplOworCQkJCQkvLyAgICAgICIgTGVuZ3RoICAgTWV0aG9kICAgIFNpemUgIFJhdGlvICAgRGF0ZSAgIFRpbWUgICBDUkMtMzIgICAgTmFtZVxuIgorCQkJCQkvLyAgICAgICItLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tIC0tLS0tICAgLS0tLSAgIC0tLS0gICAtLS0tLS0gICAgLS0tLSIKKwkJCQkJcHJpbnRmKCAgICAgICIlOHUgIERlZmw6TiIgICAgIiU5dSU0dSUlICAlMDJ1LSUwMnUtJTAydSAlMDJ1OiUwMnUgICUwOHggICVzXG4iLAorCQkJCQkJKHVuc2lnbmVkKXppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplLAorCQkJCQkJKHVuc2lnbmVkKXppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemUsCisJCQkJCQkodW5zaWduZWQpcGVyY2VudHMsCisJCQkJCQkoZG9zdGltZSAmIDB4MDFlMDAwMDApID4+IDIxLAorCQkJCQkJKGRvc3RpbWUgJiAweDAwMWYwMDAwKSA+PiAxNiwKKwkJCQkJCSgoKGRvc3RpbWUgJiAweGZlMDAwMDAwKSA+PiAyNSkgKyAxOTgwKSAlIDEwMCwKKwkJCQkJCShkb3N0aW1lICYgMHgwMDAwZjgwMCkgPj4gMTEsCisJCQkJCQkoZG9zdGltZSAmIDB4MDAwMDA3ZTApID4+IDUsCisJCQkJCQl6aXBfaGVhZGVyLmZvcm1hdHRlZC5jcmMzMiwKKwkJCQkJCWRzdF9mbik7CisJCQkJCXRvdGFsX3VzaXplICs9IHppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplOworCQkJCQl0b3RhbF9zaXplICs9IHppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemU7CisJCQkJfQorCQkJCWkgPSAnbic7CisJCQl9IGVsc2UgaWYgKGRzdF9mZCA9PSBTVERPVVRfRklMRU5PKSB7IC8qIEV4dHJhY3RpbmcgdG8gU1RET1VUICovCisJCQkJaSA9IC0xOworCQkJfSBlbHNlIGlmIChsYXN0X2NoYXJfaXMoZHN0X2ZuLCAnLycpKSB7IC8qIEV4dHJhY3QgZGlyZWN0b3J5ICovCisJCQkJaWYgKHN0YXQoZHN0X2ZuLCAmc3RhdF9idWYpID09IC0xKSB7CisJCQkJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc3RhdCAnJXMnIiwgZHN0X2ZuKTsKKwkJCQkJfQorCQkJCQlpZiAoIXF1aWV0KSB7CisJCQkJCQlwcmludGYoIiAgIGNyZWF0aW5nOiAlc1xuIiwgZHN0X2ZuKTsKKwkJCQkJfQorCQkJCQl1bnppcF9jcmVhdGVfbGVhZGluZ19kaXJzKGRzdF9mbik7CisJCQkJCWlmIChiYl9tYWtlX2RpcmVjdG9yeShkc3RfZm4sIGRpcl9tb2RlLCAwKSkgeworCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImV4aXRpbmciKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICghU19JU0RJUihzdGF0X2J1Zi5zdF9tb2RlKSkgeworCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgZXhpc3RzIGJ1dCBpcyBub3QgZGlyZWN0b3J5IiwgZHN0X2ZuKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpID0gJ24nOworCisJCQl9IGVsc2UgeyAgLyogRXh0cmFjdCBmaWxlICovCisgY2hlY2tfZmlsZToKKwkJCQlpZiAoc3RhdChkc3RfZm4sICZzdGF0X2J1ZikgPT0gLTEpIHsgLyogRmlsZSBkb2VzIG5vdCBleGlzdCAqLworCQkJCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHN0YXQgJyVzJyIsIGRzdF9mbik7CisJCQkJCX0KKwkJCQkJaSA9ICd5JzsKKwkJCQl9IGVsc2UgeyAvKiBGaWxlIGFscmVhZHkgZXhpc3RzICovCisJCQkJCWlmIChvdmVyd3JpdGUgPT0gT19ORVZFUikgeworCQkJCQkJaSA9ICduJzsKKwkJCQkJfSBlbHNlIGlmIChTX0lTUkVHKHN0YXRfYnVmLnN0X21vZGUpKSB7IC8qIEZpbGUgaXMgcmVndWxhciBmaWxlICovCisJCQkJCQlpZiAob3ZlcndyaXRlID09IE9fQUxXQVlTKSB7CisJCQkJCQkJaSA9ICd5JzsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcHJpbnRmKCJyZXBsYWNlICVzPyBbeV1lcywgW25dbywgW0FdbGwsIFtOXW9uZSwgW3JdZW5hbWU6ICIsIGRzdF9mbik7CisJCQkJCQkJaWYgKCFmZ2V0cyhrZXlfYnVmLCBzaXplb2Yoa2V5X2J1ZiksIHN0ZGluKSkgeworCQkJCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgaW5wdXQiKTsKKwkJCQkJCQl9CisJCQkJCQkJaSA9IGtleV9idWZbMF07CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7IC8qIEZpbGUgaXMgbm90IHJlZ3VsYXIgZmlsZSAqLworCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgZXhpc3RzIGJ1dCBpcyBub3QgcmVndWxhciBmaWxlIiwgZHN0X2ZuKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXN3aXRjaCAoaSkgeworCQljYXNlICdBJzoKKwkJCW92ZXJ3cml0ZSA9IE9fQUxXQVlTOworCQljYXNlICd5JzogLyogT3BlbiBmaWxlIGFuZCBmYWxsIGludG8gdW56aXAgKi8KKwkJCXVuemlwX2NyZWF0ZV9sZWFkaW5nX2RpcnMoZHN0X2ZuKTsKKyNpZiBFTkFCTEVfREVTS1RPUAorCQkJZHN0X2ZkID0geG9wZW4zKGRzdF9mbiwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgZmlsZV9tb2RlKTsKKyNlbHNlCisJCQlkc3RfZmQgPSB4b3Blbihkc3RfZm4sIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpOworI2VuZGlmCisJCWNhc2UgLTE6IC8qIFVuemlwICovCisJCQlpZiAoIXF1aWV0KSB7CisJCQkJcHJpbnRmKCIgIGluZmxhdGluZzogJXNcbiIsIGRzdF9mbik7CisJCQl9CisJCQl1bnppcF9leHRyYWN0KCZ6aXBfaGVhZGVyLCBkc3RfZmQpOworCQkJaWYgKGRzdF9mZCAhPSBTVERPVVRfRklMRU5PKSB7CisJCQkJLyogY2xvc2luZyBTVERPVVQgaXMgcG90ZW50aWFsbHkgYmFkIGZvciBmdXR1cmUgYnVzaW5lc3MgKi8KKwkJCQljbG9zZShkc3RfZmQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnTic6CisJCQlvdmVyd3JpdGUgPSBPX05FVkVSOworCQljYXNlICduJzoKKwkJCS8qIFNraXAgZW50cnkgZGF0YSAqLworCQkJdW56aXBfc2tpcCh6aXBfaGVhZGVyLmZvcm1hdHRlZC5jbXBzaXplKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3InOgorCQkJLyogUHJvbXB0IGZvciBuZXcgbmFtZSAqLworCQkJcHJpbnRmKCJuZXcgbmFtZTogIik7CisJCQlpZiAoIWZnZXRzKGtleV9idWYsIHNpemVvZihrZXlfYnVmKSwgc3RkaW4pKSB7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZWFkIGlucHV0Iik7CisJCQl9CisJCQlmcmVlKGRzdF9mbik7CisJCQlkc3RfZm4gPSB4c3RyZHVwKGtleV9idWYpOworCQkJY2hvbXAoZHN0X2ZuKTsKKwkJCWdvdG8gY2hlY2tfZmlsZTsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJlcnJvcjogaW52YWxpZCByZXNwb25zZSBbJWNdXG4iLCAoY2hhcilpKTsKKwkJCWdvdG8gY2hlY2tfZmlsZTsKKwkJfQorCisJCXRvdGFsX2VudHJpZXMrKzsKKwl9CisKKwlpZiAobGlzdGluZyAmJiBxdWlldCA8PSAxKSB7CisJCWlmICghdmVyYm9zZSkgeworCQkJLy8gICAgICAiICBMZW5ndGggICAgIERhdGUgICBUaW1lICAgIE5hbWVcbiIKKwkJCS8vICAgICAgIiAtLS0tLS0tLSAgICAtLS0tICAgLS0tLSAgICAtLS0tIgorCQkJcHJpbnRmKCAiIC0tLS0tLS0tICAgICAgICAgICAgICAgICAgIC0tLS0tLS1cbiIKKwkJCQkiJTlsdSIgICAiICAgICAgICAgICAgICAgICAgICV1IGZpbGVzXG4iLAorCQkJCXRvdGFsX3VzaXplLCB0b3RhbF9lbnRyaWVzKTsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgcGVyY2VudHMgPSB0b3RhbF91c2l6ZSAtIHRvdGFsX3NpemU7CisJCQlwZXJjZW50cyA9IHBlcmNlbnRzICogMTAwOworCQkJaWYgKHRvdGFsX3VzaXplKQorCQkJCXBlcmNlbnRzIC89IHRvdGFsX3VzaXplOworCQkJLy8gICAgICAiIExlbmd0aCAgIE1ldGhvZCAgICBTaXplICBSYXRpbyAgIERhdGUgICBUaW1lICAgQ1JDLTMyICAgIE5hbWVcbiIKKwkJCS8vICAgICAgIi0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0gLS0tLS0gICAtLS0tICAgLS0tLSAgIC0tLS0tLSAgICAtLS0tIgorCQkJcHJpbnRmKCAiLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLSAgLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS1cbiIKKwkJCQkiJThsdSIgICAgICAgICAgICAgICIlMTdsdSU0dSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICV1IGZpbGVzXG4iLAorCQkJCXRvdGFsX3VzaXplLCB0b3RhbF9zaXplLCAodW5zaWduZWQpcGVyY2VudHMsCisJCQkJdG90YWxfZW50cmllcyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvbmZpZ3MvVEVTVF9ub21tdV9kZWZjb25maWcgYi9idXN5Ym94LTEuMTkuMy9jb25maWdzL1RFU1Rfbm9tbXVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWY2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25maWdzL1RFU1Rfbm9tbXVfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTI2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIEJ1c3lib3ggdmVyc2lvbjogMS4xNi4wCisjIFdlZCBKYW4gMjcgMjE6MDE6MjYgMjAxMAorIworQ09ORklHX0hBVkVfRE9UX0NPTkZJRz15CisKKyMKKyMgQnVzeWJveCBTZXR0aW5ncworIworCisjCisjIEdlbmVyYWwgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0RFU0tUT1A9eQorQ09ORklHX0VYVFJBX0NPTVBBVD15CitDT05GSUdfSU5DTFVERV9TVVN2Mj15CisjIENPTkZJR19VU0VfUE9SVEFCTEVfQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVI9eQorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX0xPTkdfT1BUUz15CitDT05GSUdfRkVBVFVSRV9ERVZQVFM9eQorIyBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1NVSUQ9eQorQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQ9eQorQ09ORklHX1NFTElOVVg9eQorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFM9eQorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9IQVZFX1JQQz15CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CitDT05GSUdfTk9NTVU9eQorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucworIworIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQ9MgorQ09ORklHX0ZFQVRVUkVfRkFTVF9UT1A9eQorQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkc9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOPTEwMjQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfVkk9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTE1CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT049eQorQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTj15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVD15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9OT05fUE9TSVhfQ1A9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorQ09ORklHX01PTk9UT05JQ19TWVNDQUxMPXkKK0NPTkZJR19JT0NUTF9IRVgyU1RSX0VSUk9SPXkKK0NPTkZJR19GRUFUVVJFX0hXSUI9eQorCisjCisjIEFwcGxldHMKKyMKKworIworIyBBcmNoaXZhbCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0xaTUE9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfQloyPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0daPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1o9eQorQ09ORklHX0FSPXkKK0NPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTPXkKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CitDT05GSUdfRkVBVFVSRV9DUElPX089eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19QPXkKK0NPTkZJR19EUEtHPXkKK0NPTkZJR19EUEtHX0RFQj15CitDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFk9eQorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CitDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTFpPUD15CitDT05GSUdfTFpPUF9DT01QUl9ISUdIPXkKK0NPTkZJR19SUE0yQ1BJTz15CitDT05GSUdfUlBNPXkKK0NPTkZJR19UQVI9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURT15CitDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVD15CitDT05GSUdfRkVBVFVSRV9UQVJfRlJPTT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRT15CitDT05GSUdfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FPXkKK0NPTkZJR19VTkNPTVBSRVNTPXkKK0NPTkZJR19VTkxaTUE9eQorQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUPXkKK0NPTkZJR19VTlpJUD15CisKKyMKKyMgQ29yZXV0aWxzCisjCitDT05GSUdfQkFTRU5BTUU9eQorQ09ORklHX0NBTD15CitDT05GSUdfQ0FUPXkKK0NPTkZJR19DQVRWPXkKK0NPTkZJR19DSEdSUD15CitDT05GSUdfQ0hNT0Q9eQorQ09ORklHX0NIT1dOPXkKK0NPTkZJR19GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUz15CitDT05GSUdfQ0hST09UPXkKK0NPTkZJR19DS1NVTT15CitDT05GSUdfQ09NTT15CitDT05GSUdfQ1A9eQorQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TPXkKK0NPTkZJR19DVVQ9eQorQ09ORklHX0RBVEU9eQorQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQ9eQorQ09ORklHX0ZFQVRVUkVfREFURV9DT01QQVQ9eQorQ09ORklHX0REPXkKK0NPTkZJR19GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORz15CitDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORT15CitDT05GSUdfRkVBVFVSRV9ERF9JQlNfT0JTPXkKK0NPTkZJR19ERj15CitDT05GSUdfRkVBVFVSRV9ERl9GQU5DWT15CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQQU5EPXkKK0NPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlM9eQorQ09ORklHX0VYUFI9eQorQ09ORklHX0VYUFJfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GQUxTRT15CitDT05GSUdfRk9MRD15CitDT05GSUdfRlNZTkM9eQorQ09ORklHX0hFQUQ9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfSEVBRD15CitDT05GSUdfSE9TVElEPXkKK0NPTkZJR19JRD15CitDT05GSUdfSU5TVEFMTD15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTE49eQorQ09ORklHX0xPR05BTUU9eQorQ09ORklHX0xTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZJTEVUWVBFUz15CitDT05GSUdfRkVBVFVSRV9MU19GT0xMT1dMSU5LUz15CitDT05GSUdfRkVBVFVSRV9MU19SRUNVUlNJVkU9eQorQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVVNFUk5BTUU9eQorQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1I9eQorQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVD15CitDT05GSUdfTUQ1U1VNPXkKK0NPTkZJR19NS0RJUj15CitDT05GSUdfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlM9eQorQ09ORklHX01LRklGTz15CitDT05GSUdfTUtOT0Q9eQorQ09ORklHX01WPXkKK0NPTkZJR19GRUFUVVJFX01WX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTklDRT15CitDT05GSUdfTk9IVVA9eQorQ09ORklHX09EPXkKK0NPTkZJR19QUklOVEVOVj15CitDT05GSUdfUFJJTlRGPXkKK0NPTkZJR19QV0Q9eQorQ09ORklHX1JFQURMSU5LPXkKK0NPTkZJR19GRUFUVVJFX1JFQURMSU5LX0ZPTExPVz15CitDT05GSUdfUkVBTFBBVEg9eQorQ09ORklHX1JNPXkKK0NPTkZJR19STURJUj15CitDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlM9eQorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKK0NPTkZJR19TSEE1MTJTVU09eQorQ09ORklHX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQPXkKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CitDT05GSUdfU1RBVD15CitDT05GSUdfRkVBVFVSRV9TVEFUX0ZPUk1BVD15CitDT05GSUdfU1RUWT15CitDT05GSUdfU1VNPXkKK0NPTkZJR19TWU5DPXkKK0NPTkZJR19UQUM9eQorQ09ORklHX1RBSUw9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfVEFJTD15CitDT05GSUdfVEVFPXkKK0NPTkZJR19GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU89eQorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorQ09ORklHX1RSVUU9eQorQ09ORklHX1RUWT15CitDT05GSUdfVU5BTUU9eQorQ09ORklHX1VORVhQQU5EPXkKK0NPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfVU5JUT15CitDT05GSUdfVVNMRUVQPXkKK0NPTkZJR19VVURFQ09ERT15CitDT05GSUdfVVVFTkNPREU9eQorQ09ORklHX1dDPXkKK0NPTkZJR19GRUFUVVJFX1dDX0xBUkdFPXkKK0NPTkZJR19XSE89eQorQ09ORklHX1dIT0FNST15CitDT05GSUdfWUVTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgY3AgYW5kIG12CisjCitDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1M9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBscywgbW9yZSBhbmQgdGVsbmV0CisjCitDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEg9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzCisjCitDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0KKyMKK0NPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSz15CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19DSFZUPXkKK0NPTkZJR19DTEVBUj15CitDT05GSUdfREVBTExPQ1ZUPXkKK0NPTkZJR19EVU1QS01BUD15CitDT05GSUdfS0JEX01PREU9eQorQ09ORklHX0xPQURGT05UPXkKK0NPTkZJR19MT0FES01BUD15CitDT05GSUdfT1BFTlZUPXkKK0NPTkZJR19SRVNFVD15CitDT05GSUdfUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1JFU0laRV9QUklOVD15CitDT05GSUdfU0VUQ09OU09MRT15CitDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUz15CitDT05GSUdfU0VURk9OVD15CitDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQPXkKK0NPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSPSIiCitDT05GSUdfU0VUS0VZQ09ERVM9eQorQ09ORklHX1NFVExPR0NPTlM9eQorQ09ORklHX1NIT1dLRVk9eQorCisjCisjIERlYmlhbiBVdGlsaXRpZXMKKyMKK0NPTkZJR19NS1RFTVA9eQorQ09ORklHX1BJUEVfUFJPR1JFU1M9eQorQ09ORklHX1JVTl9QQVJUUz15CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWT15CitDT05GSUdfU1RBUlRfU1RPUF9EQUVNT049eQorQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TPXkKK0NPTkZJR19XSElDSD15CisKKyMKKyMgRWRpdG9ycworIworQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfUEFUQ0g9eQorQ09ORklHX1NFRD15CitDT05GSUdfVkk9eQorQ09ORklHX0ZFQVRVUkVfVklfTUFYX0xFTj00MDk2CitDT05GSUdfRkVBVFVSRV9WSV84QklUPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0NPTE9OPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1lBTktNQVJLPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFQVJDSD15CitDT05GSUdfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUz15CitDT05GSUdfRkVBVFVSRV9WSV9ET1RfQ01EPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1JFQURPTkxZPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVE9QVFM9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1dJTl9SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1M9eQorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworQ09ORklHX0lOSVQ9eQorQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUI9eQorQ09ORklHX0ZFQVRVUkVfS0lMTF9SRU1PVkVEPXkKK0NPTkZJR19GRUFUVVJFX0tJTExfREVMQVk9MQorQ09ORklHX0ZFQVRVUkVfSU5JVF9TQ1RUWT15CitDT05GSUdfRkVBVFVSRV9JTklUX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9FWFRSQV9RVUlFVD15CitDT05GSUdfRkVBVFVSRV9JTklUX0NPUkVEVU1QUz15CitDT05GSUdfRkVBVFVSRV9JTklUUkQ9eQorQ09ORklHX0hBTFQ9eQorIyBDT05GSUdfRkVBVFVSRV9DQUxMX1RFTElOSVQgaXMgbm90IHNldAorQ09ORklHX1RFTElOSVRfUEFUSD0iIgorQ09ORklHX01FU0c9eQorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTPXkKK0NPTkZJR19VU0VfQkJfUFdEX0dSUD15CitDT05GSUdfVVNFX0JCX1NIQURPVz15CitDT05GSUdfVVNFX0JCX0NSWVBUPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFRfU0hBPXkKK0NPTkZJR19BRERHUk9VUD15CitDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUD15CitDT05GSUdfREVMR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9DSEVDS19OQU1FUz15CitDT05GSUdfQUREVVNFUj15CitDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRklSU1RfU1lTVEVNX0lEPTEwMAorQ09ORklHX0xBU1RfU1lTVEVNX0lEPTk5OQorQ09ORklHX0RFTFVTRVI9eQorQ09ORklHX0dFVFRZPXkKK0NPTkZJR19GRUFUVVJFX1VUTVA9eQorQ09ORklHX0ZFQVRVUkVfV1RNUD15CitDT05GSUdfTE9HSU49eQorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dJTl9TQ1JJUFRTPXkKK0NPTkZJR19GRUFUVVJFX05PTE9HSU49eQorQ09ORklHX0ZFQVRVUkVfU0VDVVJFVFRZPXkKK0NPTkZJR19QQVNTV0Q9eQorQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0s9eQorQ09ORklHX0NSWVBUUFc9eQorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CitDT05GSUdfVkxPQ0s9eQorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKK0NPTkZJR19DSEFUVFI9eQorQ09ORklHX0ZTQ0s9eQorQ09ORklHX0xTQVRUUj15CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworQ09ORklHX01PRFBST0JFX1NNQUxMPXkKK0NPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRD15CisjIENPTkZJR19JTlNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfUk1NT0QgaXMgbm90IHNldAorIyBDT05GSUdfTFNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBNT0QgaXMgbm90IHNldAorCisjCisjIE9wdGlvbnMgY29tbW9uIHRvIG11bHRpcGxlIG1vZHV0aWxzCisjCisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lOU01PRF9UUllfTU1BUD15CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9saWIvbW9kdWxlcyIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSJtb2R1bGVzLmRlcCIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19BQ1BJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FDUElEX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLSUQ9eQorQ09ORklHX0RNRVNHPXkKK0NPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWT15CitDT05GSUdfRkJTRVQ9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREU9eQorQ09ORklHX0ZERkxVU0g9eQorQ09ORklHX0ZERk9STUFUPXkKK0NPTkZJR19GRElTSz15CitDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUz15CitDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRT15CitDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUw9eQorQ09ORklHX0ZFQVRVUkVfU0dJX0xBQkVMPXkKK0NPTkZJR19GRUFUVVJFX1NVTl9MQUJFTD15CitDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUw9eQorQ09ORklHX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQ9eQorQ09ORklHX0ZJTkRGUz15CitDT05GSUdfRlJFRVJBTURJU0s9eQorQ09ORklHX0ZTQ0tfTUlOSVg9eQorQ09ORklHX01LRlNfRVhUMj15CitDT05GSUdfTUtGU19NSU5JWD15CisKKyMKKyMgTWluaXggZmlsZXN5c3RlbSBzdXBwb3J0CisjCitDT05GSUdfRkVBVFVSRV9NSU5JWDI9eQorQ09ORklHX01LRlNfUkVJU0VSPXkKK0NPTkZJR19NS0ZTX1ZGQVQ9eQorQ09ORklHX0dFVE9QVD15CitDT05GSUdfRkVBVFVSRV9HRVRPUFRfTE9ORz15CitDT05GSUdfSEVYRFVNUD15CitDT05GSUdfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0U9eQorQ09ORklHX0hEPXkKK0NPTkZJR19IV0NMT0NLPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFM9eQorQ09ORklHX0lQQ1JNPXkKK0NPTkZJR19JUENTPXkKK0NPTkZJR19MT1NFVFVQPXkKK0NPTkZJR19MU1BDST15CitDT05GSUdfTFNVU0I9eQorQ09ORklHX01ERVY9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUD15CitDT05GSUdfRkVBVFVSRV9NREVWX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFPXkKK0NPTkZJR19NS1NXQVA9eQorQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQ9eQorQ09ORklHX01PUkU9eQorQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1M9eQorQ09ORklHX1ZPTFVNRUlEPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU1lTVj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQ9eQorQ09ORklHX01PVU5UPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZBS0U9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfVkVSQk9TRT15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX05GUz15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZTVEFCPXkKK0NPTkZJR19QSVZPVF9ST09UPXkKK0NPTkZJR19SREFURT15CitDT05GSUdfUkRFVj15CitDT05GSUdfUkVBRFBST0ZJTEU9eQorQ09ORklHX1JUQ1dBS0U9eQorQ09ORklHX1NDUklQVD15CitDT05GSUdfU0NSSVBUUkVQTEFZPXkKK0NPTkZJR19TRVRBUkNIPXkKK0NPTkZJR19TV0FQT05PRkY9eQorQ09ORklHX0ZFQVRVUkVfU1dBUE9OX1BSST15CitDT05GSUdfU1dJVENIX1JPT1Q9eQorQ09ORklHX1VNT1VOVD15CitDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbW91bnQvdW1vdW50CisjCitDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFV0aWxpdGllcworIworQ09ORklHX0FESlRJTUVYPXkKK0NPTkZJR19CQkNPTkZJRz15CitDT05GSUdfQkVFUD15CitDT05GSUdfRkVBVFVSRV9CRUVQX0ZSRVE9NDAwMAorQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVM9MzAKK0NPTkZJR19DSEFUPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfVFRZX0hJRkk9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUj15CitDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUz15CitDT05GSUdfRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUz15CitDT05GSUdfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU49eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQ9eQorQ09ORklHX0NIUlQ9eQorQ09ORklHX0NST05EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0Q9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVI9Ii92YXIvc3Bvb2wvY3JvbiIKK0NPTkZJR19DUk9OVEFCPXkKK0NPTkZJR19EQz15CitDT05GSUdfRkVBVFVSRV9EQ19MSUJNPXkKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CitDT05GSUdfREVWTUVNPXkKK0NPTkZJR19FSkVDVD15CitDT05GSUdfRkVBVFVSRV9FSkVDVF9TQ1NJPXkKK0NPTkZJR19GQlNQTEFTSD15CitDT05GSUdfRkxBU0hDUD15CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CitDT05GSUdfSU9OSUNFPXkKK0NPTkZJR19JTk9USUZZRD15CitDT05GSUdfTEFTVD15CitDT05GSUdfRkVBVFVSRV9MQVNUX1NNQUxMPXkKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorQ09ORklHX0hEUEFSTT15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQ9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BPXkKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorQ09ORklHX01BTj15CitDT05GSUdfTUlDUk9DT009eQorQ09ORklHX01PVU5UUE9JTlQ9eQorQ09ORklHX01UPXkKK0NPTkZJR19SQUlEQVVUT1JVTj15CitDT05GSUdfUkVBREFIRUFEPXkKK0NPTkZJR19SVU5MRVZFTD15CitDT05GSUdfUlg9eQorQ09ORklHX1NFVFNJRD15CitDT05GSUdfU1RSSU5HUz15CitDT05GSUdfVEFTS1NFVD15CitDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZPXkKK0NPTkZJR19USU1FPXkKK0NPTkZJR19USU1FT1VUPXkKK0NPTkZJR19UVFlTSVpFPXkKK0NPTkZJR19WT0xOQU1FPXkKK0NPTkZJR19XQUxMPXkKK0NPTkZJR19XQVRDSERPRz15CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX0lQVjY9eQorQ09ORklHX0ZFQVRVUkVfVU5JWF9MT0NBTD15CitDT05GSUdfRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTPXkKK0NPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTPXkKK0NPTkZJR19BUlA9eQorQ09ORklHX0FSUElORz15CitDT05GSUdfQlJDVEw9eQorQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVz15CitDT05GSUdfRE5TRD15CitDT05GSUdfRVRIRVJfV0FLRT15CitDT05GSUdfRkFLRUlERU5URD15CitDT05GSUdfRlRQRD15CitDT05GSUdfRkVBVFVSRV9GVFBfV1JJVEU9eQorQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1Q9eQorQ09ORklHX0ZUUEdFVD15CitDT05GSUdfRlRQUFVUPXkKK0NPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlM9eQorQ09ORklHX0hPU1ROQU1FPXkKK0NPTkZJR19IVFRQRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVFVJRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1PXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NHST15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZPXkKK0NPTkZJR19JRkNPTkZJRz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVM9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU0xJUD15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTPXkKK0NPTkZJR19JRkVOU0xBVkU9eQorQ09ORklHX0lGUExVR0Q9eQorQ09ORklHX0lGVVBET1dOPXkKK0NPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEg9Ii92YXIvcnVuL2lmc3RhdGUiCitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUD15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUF9CVUlMVElOPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSUZDT05GSUdfQlVJTFRJTiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0PXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjY9eQorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORz15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQPXkKK0NPTkZJR19JTkVURD15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITz15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRD15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRT15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRT15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTj15CitDT05GSUdfRkVBVFVSRV9JTkVURF9SUEM9eQorQ09ORklHX0lQPXkKK0NPTkZJR19GRUFUVVJFX0lQX0FERFJFU1M9eQorQ09ORklHX0ZFQVRVUkVfSVBfTElOSz15CitDT05GSUdfRkVBVFVSRV9JUF9ST1VURT15CitDT05GSUdfRkVBVFVSRV9JUF9UVU5ORUw9eQorQ09ORklHX0ZFQVRVUkVfSVBfUlVMRT15CitDT05GSUdfRkVBVFVSRV9JUF9TSE9SVF9GT1JNUz15CitDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUz15CitDT05GSUdfSVBBRERSPXkKK0NPTkZJR19JUExJTks9eQorQ09ORklHX0lQUk9VVEU9eQorQ09ORklHX0lQVFVOTkVMPXkKK0NPTkZJR19JUFJVTEU9eQorQ09ORklHX0lQQ0FMQz15CitDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTkFNRUlGPXkKK0NPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRD15CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorQ09ORklHX05FVFNUQVQ9eQorQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9XSURFPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHPXkKK0NPTkZJR19OU0xPT0tVUD15CitDT05GSUdfTlRQRD15CitDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUj15CitDT05GSUdfUElORz15CitDT05GSUdfUElORzY9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORz15CitDT05GSUdfUFNDQU49eQorQ09ORklHX1JPVVRFPXkKK0NPTkZJR19TTEFUVEFDSD15CitDT05GSUdfVEVMTkVUPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9UVFlQRT15CitDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOPXkKK0NPTkZJR19URUxORVREPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORT15CitDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQ9eQorQ09ORklHX1RGVFA9eQorQ09ORklHX1RGVFBEPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfR0VUPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfUFVUPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSPXkKK0NPTkZJR19URlRQX0RFQlVHPXkKK0NPTkZJR19UUkFDRVJPVVRFPXkKK0NPTkZJR19UUkFDRVJPVVRFNj15CitDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEU9eQorQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUD15CitDT05GSUdfVURIQ1BEPXkKK0NPTkZJR19ESENQUkVMQVk9eQorQ09ORklHX0RVTVBMRUFTRVM9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWT15CitDT05GSUdfREhDUERfTEVBU0VTX0ZJTEU9Ii92YXIvbGliL21pc2MvdWRoY3BkLmxlYXNlcyIKK0NPTkZJR19VREhDUEM9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BDX0FSUElORz15CitDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUPXkKK0NPTkZJR19VREhDUF9ERUJVRz05CitDT05GSUdfRkVBVFVSRV9VREhDUF9SRkMzMzk3PXkKK0NPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ9Ii91c3Ivc2hhcmUvdWRoY3BjL2RlZmF1bHQuc2NyaXB0IgorQ09ORklHX1VESENQQ19TTEFDS19GT1JfQlVHR1lfU0VSVkVSUz04MAorQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUz0iLVIgLW4iCitDT05GSUdfVkNPTkZJRz15CitDT05GSUdfV0dFVD15CitDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUj15CitDT05GSUdfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19aQ0lQPXkKK0NPTkZJR19UQ1BTVkQ9eQorQ09ORklHX1RVTkNUTD15CitDT05GSUdfRkVBVFVSRV9UVU5DVExfVUc9eQorQ09ORklHX1VEUFNWRD15CisKKyMKKyMgUHJpbnQgVXRpbGl0aWVzCisjCitDT05GSUdfTFBEPXkKK0NPTkZJR19MUFI9eQorQ09ORklHX0xQUT15CisKKyMKKyMgTWFpbCBVdGlsaXRpZXMKKyMKK0NPTkZJR19NQUtFTUlNRT15CitDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQ9InVzLWFzY2lpIgorQ09ORklHX1BPUE1BSUxESVI9eQorQ09ORklHX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWT15CitDT05GSUdfUkVGT1JNSU1FPXkKK0NPTkZJR19GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQ9eQorQ09ORklHX1NFTkRNQUlMPXkKKworIworIyBQcm9jZXNzIFV0aWxpdGllcworIworQ09ORklHX0ZSRUU9eQorQ09ORklHX0ZVU0VSPXkKK0NPTkZJR19LSUxMPXkKK0NPTkZJR19LSUxMQUxMPXkKK0NPTkZJR19LSUxMQUxMNT15CitDT05GSUdfTk1FVEVSPXkKK0NPTkZJR19QR1JFUD15CitDT05GSUdfUElET0Y9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfU0lOR0xFPXkKK0NPTkZJR19GRUFUVVJFX1BJRE9GX09NSVQ9eQorQ09ORklHX1BLSUxMPXkKK0NPTkZJR19QUz15CitDT05GSUdfRkVBVFVSRV9QU19XSURFPXkKK0NPTkZJR19GRUFUVVJFX1BTX1RJTUU9eQorQ09ORklHX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TPXkKK0NPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUz15CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorQ09ORklHX1RPUD15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0U9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9DUFU9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUz15CitDT05GSUdfRkVBVFVSRV9UT1BNRU09eQorQ09ORklHX0ZFQVRVUkVfU0hPV19USFJFQURTPXkKK0NPTkZJR19VUFRJTUU9eQorQ09ORklHX1dBVENIPXkKKworIworIyBSdW5pdCBVdGlsaXRpZXMKKyMKK0NPTkZJR19SVU5TVj15CitDT05GSUdfUlVOU1ZESVI9eQorQ09ORklHX0ZFQVRVUkVfUlVOU1ZESVJfTE9HPXkKK0NPTkZJR19TVj15CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iL3Zhci9zZXJ2aWNlIgorQ09ORklHX1NWTE9HRD15CitDT05GSUdfQ0hQU1Q9eQorQ09ORklHX1NFVFVJREdJRD15CitDT05GSUdfRU5WVUlER0lEPXkKK0NPTkZJR19FTlZESVI9eQorQ09ORklHX1NPRlRMSU1JVD15CisKKyMKKyMgU0VMaW51eCBVdGlsaXRpZXMKKyMKK0NPTkZJR19DSENPTj15CitDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlM9eQorQ09ORklHX0dFVEVORk9SQ0U9eQorQ09ORklHX0dFVFNFQk9PTD15CitDT05GSUdfTE9BRF9QT0xJQ1k9eQorQ09ORklHX01BVENIUEFUSENPTj15CitDT05GSUdfUkVTVE9SRUNPTj15CitDT05GSUdfUlVOQ09OPXkKK0NPTkZJR19GRUFUVVJFX1JVTkNPTl9MT05HX09QVElPTlM9eQorQ09ORklHX1NFTElOVVhFTkFCTEVEPXkKK0NPTkZJR19TRVRFTkZPUkNFPXkKK0NPTkZJR19TRVRGSUxFUz15CitDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT049eQorQ09ORklHX1NFVFNFQk9PTD15CitDT05GSUdfU0VTVEFUVVM9eQorCisjCisjIFNoZWxscworIworIyBDT05GSUdfRkVBVFVSRV9TSF9JU19BU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hfSVNfSFVTSD15CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfSk9CX0NPTlRST0wgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9HRVRPUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fUFJJTlRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0NNRENNRCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9FWFBBTkRfUFJNVCBpcyBub3Qgc2V0CitDT05GSUdfSFVTSD15CitDT05GSUdfSFVTSF9CQVNIX0NPTVBBVD15CitDT05GSUdfSFVTSF9IRUxQPXkKK0NPTkZJR19IVVNIX0lOVEVSQUNUSVZFPXkKK0NPTkZJR19IVVNIX0pPQj15CitDT05GSUdfSFVTSF9USUNLPXkKK0NPTkZJR19IVVNIX0lGPXkKK0NPTkZJR19IVVNIX0xPT1BTPXkKK0NPTkZJR19IVVNIX0NBU0U9eQorQ09ORklHX0hVU0hfRlVOQ1RJT05TPXkKK0NPTkZJR19IVVNIX0xPQ0FMPXkKK0NPTkZJR19IVVNIX0VYUE9SVF9OPXkKK0NPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUPXkKK0NPTkZJR19NU0g9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVD15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GRUFUVVJFX1NIX0VYVFJBX1FVSUVUPXkKK0NPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkU9eQorQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLPXkKK0NPTkZJR19DVFRZSEFDSz15CisKKyMKKyMgU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfU1lTTE9HRD15CitDT05GSUdfRkVBVFVSRV9ST1RBVEVfTE9HRklMRT15CitDT05GSUdfRkVBVFVSRV9SRU1PVEVfTE9HPXkKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQPXkKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRT0xNgorQ09ORklHX0xPR1JFQUQ9eQorQ09ORklHX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkc9eQorQ09ORklHX0tMT0dEPXkKK0NPTkZJR19MT0dHRVI9eQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uZmlncy9URVNUX25vcHJpbnRmX2RlZmNvbmZpZyBiL2J1c3lib3gtMS4xOS4zL2NvbmZpZ3MvVEVTVF9ub3ByaW50Zl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyZTEyOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvbmZpZ3MvVEVTVF9ub3ByaW50Zl9kZWZjb25maWcKQEAgLTAsMCArMSw5MjcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgQnVzeWJveCB2ZXJzaW9uOiAxLjE3LjAuZ2l0CisjIE1vbiBKdW4gIDcgMTM6Mzc6NTUgMjAxMAorIworQ09ORklHX0hBVkVfRE9UX0NPTkZJRz15CisKKyMKKyMgQnVzeWJveCBTZXR0aW5ncworIworCisjCisjIEdlbmVyYWwgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0RFU0tUT1A9eQorQ09ORklHX0VYVFJBX0NPTVBBVD15CitDT05GSUdfSU5DTFVERV9TVVN2Mj15CisjIENPTkZJR19VU0VfUE9SVEFCTEVfQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CisjIENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TVEFMTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0FMRV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklDT0RFX1NVUFBPUlQ9eQorIyBDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlY9eQorQ09ORklHX1NVQlNUX1dDSEFSPTYzCitDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVI9NjU1MzUKK0NPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlM9eQorQ09ORklHX1VOSUNPREVfV0lERV9XQ0hBUlM9eQorQ09ORklHX1VOSUNPREVfQklESV9TVVBQT1JUPXkKKyMgQ09ORklHX1VOSUNPREVfTkVVVFJBTF9UQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU49eQorQ09ORklHX0xPTkdfT1BUUz15CitDT05GSUdfRkVBVFVSRV9ERVZQVFM9eQorIyBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9VVE1QPXkKK0NPTkZJR19GRUFUVVJFX1dUTVA9eQorQ09ORklHX0ZFQVRVUkVfUElERklMRT15CisjIENPTkZJR19GRUFUVVJFX1NVSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyBpcyBub3Qgc2V0CitDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEg9Ii9wcm9jL3NlbGYvZXhlIgorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IQVZFX1JQQyBpcyBub3Qgc2V0CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworQ09ORklHX1NUQVRJQz15CisjIENPTkZJR19QSUUgaXMgbm90IHNldAorIyBDT05GSUdfTk9NTVUgaXMgbm90IHNldAorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9Imk0ODYtbGludXgtdWNsaWJjLSIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19XRVJST1I9eQorQ09ORklHX05PX0RFQlVHX0xJQj15CisjIENPTkZJR19ETUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGRU5DRSBpcyBub3Qgc2V0CisKKyMKKyMgSW5zdGFsbGF0aW9uIE9wdGlvbnMKKyMKKyMgQ09ORklHX0lOU1RBTExfTk9fVVNSIGlzIG5vdCBzZXQKK0NPTkZJR19JTlNUQUxMX0FQUExFVF9TWU1MSU5LUz15CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9IQVJETElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfU0NSSVBUX1dSQVBQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0RPTlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU1lNTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9IQVJETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TQ1JJUFRfV1JBUFBFUiBpcyBub3Qgc2V0CitDT05GSUdfUFJFRklYPSIuL19pbnN0YWxsIgorCisjCisjIEJ1c3lib3ggTGlicmFyeSBUdW5pbmcKKyMKK0NPTkZJR19QQVNTV09SRF9NSU5MRU49NgorQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEPTIKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKKyMgQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkc9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOPTEwMjQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfVkk9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTE1CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT049eQorQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTj15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVD15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9OT05fUE9TSVhfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX0NQX01FU1NBR0UgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQj02NAorQ09ORklHX01PTk9UT05JQ19TWVNDQUxMPXkKKyMgQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1IgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSFdJQj15CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFo9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CisjIENPTkZJR19BUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JVTlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQSU9fTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQSU9fUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUEtHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0dfREVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dVTlpJUCBpcyBub3Qgc2V0CisjIENPTkZJR19HWklQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTFpPUCBpcyBub3Qgc2V0CisjIENPTkZJR19MWk9QX0NPTVBSX0hJR0ggaXMgbm90IHNldAorIyBDT05GSUdfUlBNMkNQSU8gaXMgbm90IHNldAorIyBDT05GSUdfUlBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9GUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19VTkNPTVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOTFpNQSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xaTUFfRkFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19MWk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOWFogaXMgbm90IHNldAorIyBDT05GSUdfWFogaXMgbm90IHNldAorIyBDT05GSUdfVU5aSVAgaXMgbm90IHNldAorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKKyMgQ09ORklHX0NBVCBpcyBub3Qgc2V0CisjIENPTkZJR19EQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX05BTk8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVTVF82NCBpcyBub3Qgc2V0CisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUl9FUVVJViBpcyBub3Qgc2V0CisjIENPTkZJR19DQUwgaXMgbm90IHNldAorIyBDT05GSUdfQ0FUViBpcyBub3Qgc2V0CisjIENPTkZJR19DSEdSUCBpcyBub3Qgc2V0CisjIENPTkZJR19DSE1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSE9XTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJPT1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0tTVU0gaXMgbm90IHNldAorIyBDT05GSUdfQ09NTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19DVVQgaXMgbm90IHNldAorIyBDT05GSUdfREQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0REX0lCU19PQlMgaXMgbm90IHNldAorIyBDT05GSUdfREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERl9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19ESVJOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RPUzJVTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVgyRE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsgaXMgbm90IHNldAorIyBDT05GSUdfRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfRU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYUFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhQUl9NQVRIX1NVUFBPUlRfNjQgaXMgbm90IHNldAorQ09ORklHX0ZBTFNFPXkKKyMgQ09ORklHX0ZPTEQgaXMgbm90IHNldAorIyBDT05GSUdfRlNZTkMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX0hFQUQgaXMgbm90IHNldAorIyBDT05GSUdfSE9TVElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19MTiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19SRUNVUlNJVkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfVVNFUk5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19DT0xPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfTUQ1U1VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRklGTyBpcyBub3Qgc2V0CisjIENPTkZJR19NS05PRCBpcyBub3Qgc2V0CisjIENPTkZJR19NViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01WX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PSFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSSU5URU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSSU5URiBpcyBub3Qgc2V0CisjIENPTkZJR19QV0QgaXMgbm90IHNldAorIyBDT05GSUdfUkVBRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1cgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFBBVEggaXMgbm90IHNldAorIyBDT05GSUdfUk0gaXMgbm90IHNldAorIyBDT05GSUdfUk1ESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQTFTVU0gaXMgbm90IHNldAorIyBDT05GSUdfU0hBMjU2U1VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQTUxMlNVTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkxPQVRfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfU09SVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NPUlRfQklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVRfRk9STUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUVFkgaXMgbm90IHNldAorIyBDT05GSUdfU1VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTkMgaXMgbm90IHNldAorIyBDT05GSUdfVEFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBSUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0ggaXMgbm90IHNldAorQ09ORklHX1RSVUU9eQorIyBDT05GSUdfVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VORVhQQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVEgaXMgbm90IHNldAorIyBDT05GSUdfVVNMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VVREVDT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VVRU5DT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0UgaXMgbm90IHNldAorIyBDT05GSUdfV0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dIT0FNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSyBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NIVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkdDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NMRUFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQUxMT0NWVCBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QS01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19LQkRfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FERk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FES01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19PUEVOVlQgaXMgbm90IHNldAorIyBDT05GSUdfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfUkVTSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUj0iIgorIyBDT05GSUdfU0VUS0VZQ09ERVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VUTE9HQ09OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSE9XS0VZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUFNGMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1JBVyBpcyBub3Qgc2V0CisKKyMKKyMgRGViaWFuIFV0aWxpdGllcworIworIyBDT05GSUdfTUtURU1QIGlzIG5vdCBzZXQKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKKyMgQ09ORklHX1JVTl9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU1RBUlRfU1RPUF9EQUVNT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19XSElDSCBpcyBub3Qgc2V0CisKKyMKKyMgRWRpdG9ycworIworIyBDT05GSUdfQVdLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk0gaXMgbm90IHNldAorIyBDT05GSUdfQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RJRkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RJRkZfRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFRCBpcyBub3Qgc2V0CisjIENPTkZJR19WSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTAKKyMgQ09ORklHX0ZFQVRVUkVfVklfOEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX0NPTE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUksgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1NFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9TRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUxMT1dfRVhFQyBpcyBub3Qgc2V0CisKKyMKKyMgRmluZGluZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0ZJTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTVRJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX01NSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1RZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1hERVYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ORVdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX05PVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfREVQVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QUlVORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfREVMRVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfQ09OVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfR1JFUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1JFUF9DT05URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hBUkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNIGlzIG5vdCBzZXQKKworIworIyBJbml0IFV0aWxpdGllcworIworIyBDT05GSUdfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfS0lMTF9SRU1PVkVEIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0tJTExfREVMQVk9MAorIyBDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9TWVNMT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FWFRSQV9RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DQUxMX1RFTElOSVQgaXMgbm90IHNldAorQ09ORklHX1RFTElOSVRfUEFUSD0iIgorIyBDT05GSUdfTUVTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UQ0hBUlREIGlzIG5vdCBzZXQKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworIyBDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9QV0RfR1JQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9TSEFET1cgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX0NSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9DUllQVF9TSEEgaXMgbm90IHNldAorIyBDT05GSUdfQURER1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFTEdST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FERFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfRklSU1RfU1lTVEVNX0lEPTAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD0wCisjIENPTkZJR19ERUxVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBTSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJTl9TQ1JJUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVNTV0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVFBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfU1lTTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVUxPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMT0NLIGlzIG5vdCBzZXQKKworIworIyBMaW51eCBFeHQyIEZTIFByb2dzCisjCisjIENPTkZJR19DSEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRlNDSyBpcyBub3Qgc2V0CisjIENPTkZJR19MU0FUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVFVORTJGUyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworIyBDT05GSUdfTU9ESU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRV9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSPSIiCitDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRT0iIgorCisjCisjIExpbnV4IFN5c3RlbSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNRVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19GREZMVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZERk9STUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZESVNLIGlzIG5vdCBzZXQKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKKyMgQ09ORklHX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVU5fTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorIyBDT05GSUdfRkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVJBTURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfRlNDS19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX0VYVDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01JTklYMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1ZGQVQgaXMgbm90IHNldAorIyBDT05GSUdfR0VUT1BUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR0VUT1BUX0xPTkcgaXMgbm90IHNldAorIyBDT05GSUdfSEVYRFVNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRSBpcyBub3Qgc2V0CisjIENPTkZJR19IRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV0NMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTE9TRVRVUCBpcyBub3Qgc2V0CisjIENPTkZJR19MU1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19MU1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUtTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VTRV9URVJNSU9TIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUkVJU0VSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUIgaXMgbm90IHNldAorIyBDT05GSUdfUElWT1RfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19SREFURSBpcyBub3Qgc2V0CisjIENPTkZJR19SREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQURQUk9GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NSSVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDUklQVFJFUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorIyBDT05GSUdfVU1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU1PVU5UX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01UQUJfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FESlRJTUVYIGlzIG5vdCBzZXQKK0NPTkZJR19CQkNPTkZJRz15CisjIENPTkZJR19CRUVQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT0wCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0wCisjIENPTkZJR19DSEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NST05EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRElSPSIiCisjIENPTkZJR19DUk9OVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRENfTElCTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRUpFQ1RfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19GQlNQTEFTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfVU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0VSQVNFQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTklDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZRCBpcyBub3Qgc2V0CisjIENPTkZJR19MQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTAKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX1dJTkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRFBBUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUtFREVWUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19NQU4gaXMgbm90IHNldAorIyBDT05GSUdfTUlDUk9DT00gaXMgbm90IHNldAorIyBDT05GSUdfTU9VTlRQT0lOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQUlEQVVUT1JVTiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfVElNRU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19UVFlTSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZPTE5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlMgaXMgbm90IHNldAorIyBDT05GSUdfQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19CUkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ETlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkFLRUlERU5URCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfRlRQR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSE9TVE5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfSFRUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRVSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9DR0kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFkgaXMgbm90IHNldAorIyBDT05GSUdfSUZDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMgaXMgbm90IHNldAorIyBDT05GSUdfSUZFTlNMQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGUExVR0QgaXMgbm90IHNldAorIyBDT05GSUdfSUZVUERPV04gaXMgbm90IHNldAorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iIgorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBBRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUENBTEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19OQyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ19TRVJWRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkNfRVhUUkEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TTE9PS1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05UUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJTkc2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19QU0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19TTEFUVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BTVkQgaXMgbm90IHNldAorIyBDT05GSUdfVEVMTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0dFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUiBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VST1VURTYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVVNFX0lDTVAgaXMgbm90IHNldAorIyBDT05GSUdfVFVOQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFVOQ1RMX1VHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQRCBpcyBub3Qgc2V0CisjIENPTkZJR19ESENQUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUExFQVNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQRF9XUklURV9MRUFTRVNfRUFSTFkgaXMgbm90IHNldAorQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFPSIiCisjIENPTkZJR19VREhDUEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUENfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVURIQ1BfREVCVUc9MAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9SRkMzMzk3IGlzIG5vdCBzZXQKK0NPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ9IiIKK0NPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlM9MAorQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUz0iIgorIyBDT05GSUdfVURQU1ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfV0dFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1pDSVAgaXMgbm90IHNldAorCisjCisjIFByaW50IFV0aWxpdGllcworIworIyBDT05GSUdfTFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xQUiBpcyBub3Qgc2V0CisjIENPTkZJR19MUFEgaXMgbm90IHNldAorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCisjIENPTkZJR19NQUtFTUlNRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQ9IiIKKyMgQ09ORklHX1BPUE1BSUxESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFRk9STUlNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VORE1BSUwgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCisjIENPTkZJR19GUkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tJTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0lMTEFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LSUxMQUxMNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTUVURVIgaXMgbm90IHNldAorIyBDT05GSUdfUEdSRVAgaXMgbm90IHNldAorIyBDT05GSUdfUElET0YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QSURPRl9PTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfV0lERSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19VTlVTVUFMX1NZU1RFTVMgaXMgbm90IHNldAorIyBDT05GSUdfUkVOSUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JCX1NZU0NUTCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9TTVBfQ1BVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hPV19USFJFQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VQVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19SVU5TViBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5TVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TViBpcyBub3Qgc2V0CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iIgorIyBDT05GSUdfU1ZMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUFNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFVJREdJRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTlZVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPRlRMSU1JVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKKyMgQ09ORklHX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0pPQl9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfR0VUT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URiBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9DTURDTUQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX01BSUwgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9SQU5ET01fU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfRVhQQU5EX1BSTVQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSEVMUCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lOVEVSQUNUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSk9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9PUFMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9DQVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRlVOQ1RJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9FWFBPUlRfTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FPXkKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19OT05FPXkKKyMgQ09ORklHX01TSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NQVRIX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfTUFUSF9TVVBQT1JUXzY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NUVFlIQUNLIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX1NZU0xPR0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFTU9URV9MT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0RVUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TWVNMT0dEX1JFQURfQlVGRkVSX1NJWkU9MAorIyBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkU9MAorIyBDT05GSUdfTE9HUkVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0dFUiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb25maWdzL1RFU1Rfcmg5X2RlZmNvbmZpZyBiL2J1c3lib3gtMS4xOS4zL2NvbmZpZ3MvVEVTVF9yaDlfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDk0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25maWdzL1RFU1Rfcmg5X2RlZmNvbmZpZwpAQCAtMCwwICsxLDk0MSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMTcuMC5naXQKKyMgRnJpIEFwciAxNiAyMjoyNToyMiAyMDEwCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ERVNLVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVFJBX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfSU5DTFVERV9TVVN2Mj15CisjIENPTkZJR19VU0VfUE9SVEFCTEVfQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVI9eQorQ09ORklHX0xPQ0FMRV9TVVBQT1JUPXkKK0NPTkZJR19VTklDT0RFX1NVUFBPUlQ9eQorIyBDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOViBpcyBub3Qgc2V0CitDT05GSUdfU1VCU1RfV0NIQVI9NjMKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj03NjcKKyMgQ09ORklHX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1dJREVfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfQklESV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfTkVVVFJBTF9UQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VUTVA9eQorQ09ORklHX0ZFQVRVUkVfV1RNUD15CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1NVSUQ9eQorQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQ9eQorIyBDT05GSUdfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9BUFBMRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CVVNZQk9YX0VYRUNfUEFUSD0iL3Byb2Mvc2VsZi9leGUiCitDT05GSUdfRkVBVFVSRV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSEFWRV9SUEM9eQorCisjCisjIEJ1aWxkIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSUUgaXMgbm90IHNldAorIyBDT05GSUdfTk9NTVUgaXMgbm90IHNldAorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucworIworIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQ9MgorQ09ORklHX0ZFQVRVUkVfRkFTVF9UT1A9eQorIyBDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElORz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MTAyNAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0xNQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWT15CitDT05GSUdfRkVBVFVSRV9UQUJfQ09NUExFVElPTj15CisjIENPTkZJR19GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUD15CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTQKKyMgQ09ORklHX01PTk9UT05JQ19TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19JT0NUTF9IRVgyU1RSX0VSUk9SPXkKKyMgQ09ORklHX0ZFQVRVUkVfSFdJQiBpcyBub3Qgc2V0CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CitDT05GSUdfQVI9eQorQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVM9eQorQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFPXkKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CitDT05GSUdfRkVBVFVSRV9DUElPX089eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19QPXkKKyMgQ09ORklHX0RQS0cgaXMgbm90IHNldAorIyBDT05GSUdfRFBLR19ERUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CitDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTFpPUD15CisjIENPTkZJR19MWk9QX0NPTVBSX0hJR0ggaXMgbm90IHNldAorQ09ORklHX1JQTTJDUElPPXkKK0NPTkZJR19SUE09eQorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9BVVRPREVURUNUPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9GUk9NPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CitDT05GSUdfVU5DT01QUkVTUz15CitDT05GSUdfVU5MWk1BPXkKK0NPTkZJR19GRUFUVVJFX0xaTUFfRkFTVD15CitDT05GSUdfVU5aSVA9eQorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKK0NPTkZJR19DQUw9eQorQ09ORklHX0NBVD15CitDT05GSUdfQ0FUVj15CitDT05GSUdfQ0hHUlA9eQorQ09ORklHX0NITU9EPXkKK0NPTkZJR19DSE9XTj15CitDT05GSUdfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlM9eQorQ09ORklHX0NIUk9PVD15CitDT05GSUdfQ0tTVU09eQorQ09ORklHX0NPTU09eQorQ09ORklHX0NQPXkKK0NPTkZJR19GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfQ1VUPXkKK0NPTkZJR19EQVRFPXkKK0NPTkZJR19GRUFUVVJFX0RBVEVfSVNPRk1UPXkKK0NPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUPXkKK0NPTkZJR19ERD15CitDT05GSUdfRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkc9eQorQ09ORklHX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkU9eQorQ09ORklHX0ZFQVRVUkVfRERfSUJTX09CUz15CitDT05GSUdfREY9eQorQ09ORklHX0ZFQVRVUkVfREZfRkFOQ1k9eQorQ09ORklHX0RJUk5BTUU9eQorQ09ORklHX0RPUzJVTklYPXkKK0NPTkZJR19VTklYMkRPUz15CitDT05GSUdfRFU9eQorQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUs9eQorQ09ORklHX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITz15CitDT05GSUdfRU5WPXkKK0NPTkZJR19GRUFUVVJFX0VOVl9MT05HX09QVElPTlM9eQorQ09ORklHX0VYUEFORD15CitDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19FWFBSPXkKK0NPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkFMU0U9eQorQ09ORklHX0ZPTEQ9eQorQ09ORklHX0ZTWU5DPXkKK0NPTkZJR19IRUFEPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0hFQUQ9eQorQ09ORklHX0hPU1RJRD15CitDT05GSUdfSUQ9eQorQ09ORklHX0lOU1RBTEw9eQorQ09ORklHX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlM9eQorQ09ORklHX0xOPXkKK0NPTkZJR19MT0dOQU1FPXkKK0NPTkZJR19MUz15CitDT05GSUdfRkVBVFVSRV9MU19GSUxFVFlQRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1M9eQorQ09ORklHX0ZFQVRVUkVfTFNfUkVDVVJTSVZFPXkKK0NPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUz15CitDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1VTRVJOQU1FPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQ9eQorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorQ09ORklHX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19NS0ZJRk89eQorQ09ORklHX01LTk9EPXkKK0NPTkZJR19NVj15CitDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlM9eQorQ09ORklHX05JQ0U9eQorQ09ORklHX05PSFVQPXkKK0NPTkZJR19PRD15CitDT05GSUdfUFJJTlRFTlY9eQorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorQ09ORklHX1JFQUxQQVRIPXkKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorQ09ORklHX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19TRVE9eQorQ09ORklHX1NIQTFTVU09eQorQ09ORklHX1NIQTI1NlNVTT15CitDT05GSUdfU0hBNTEyU1VNPXkKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUD15CitDT05GSUdfU09SVD15CitDT05GSUdfRkVBVFVSRV9TT1JUX0JJRz15CitDT05GSUdfU1BMSVQ9eQorQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1k9eQorQ09ORklHX1NUQVQ9eQorQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQ9eQorQ09ORklHX1NUVFk9eQorQ09ORklHX1NVTT15CitDT05GSUdfU1lOQz15CitDT05GSUdfVEFDPXkKK0NPTkZJR19UQUlMPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1RBSUw9eQorQ09ORklHX1RFRT15CitDT05GSUdfRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPPXkKK0NPTkZJR19URVNUPXkKK0NPTkZJR19GRUFUVVJFX1RFU1RfNjQ9eQorQ09ORklHX1RPVUNIPXkKK0NPTkZJR19UUj15CitDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTPXkKK0NPTkZJR19GRUFUVVJFX1RSX0VRVUlWPXkKK0NPTkZJR19UUlVFPXkKK0NPTkZJR19UVFk9eQorQ09ORklHX1VOQU1FPXkKK0NPTkZJR19VTkVYUEFORD15CitDT05GSUdfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlM9eQorQ09ORklHX1VOSVE9eQorQ09ORklHX1VTTEVFUD15CitDT05GSUdfVVVERUNPREU9eQorQ09ORklHX1VVRU5DT0RFPXkKK0NPTkZJR19XQz15CitDT05GSUdfRkVBVFVSRV9XQ19MQVJHRT15CitDT05GSUdfV0hPPXkKK0NPTkZJR19XSE9BTUk9eQorQ09ORklHX1lFUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGNwIGFuZCBtdgorIworQ09ORklHX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbHMsIG1vcmUgYW5kIHRlbG5ldAorIworQ09ORklHX0ZFQVRVUkVfQVVUT1dJRFRIPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgZGYsIGR1LCBscworIworQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEU9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBtZDVzdW0sIHNoYTFzdW0sIHNoYTI1NnN1bSwgc2hhNTEyc3VtCisjCitDT05GSUdfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0s9eQorCisjCisjIENvbnNvbGUgVXRpbGl0aWVzCisjCitDT05GSUdfQ0hWVD15CitDT05GSUdfQ0xFQVI9eQorQ09ORklHX0RFQUxMT0NWVD15CitDT05GSUdfRFVNUEtNQVA9eQorQ09ORklHX0tCRF9NT0RFPXkKK0NPTkZJR19MT0FERk9OVD15CitDT05GSUdfTE9BREtNQVA9eQorQ09ORklHX09QRU5WVD15CitDT05GSUdfUkVTRVQ9eQorQ09ORklHX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9SRVNJWkVfUFJJTlQ9eQorQ09ORklHX1NFVENPTlNPTEU9eQorQ09ORklHX0ZFQVRVUkVfU0VUQ09OU09MRV9MT05HX09QVElPTlM9eQorQ09ORklHX1NFVEZPTlQ9eQorQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUD15CitDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUj0iIgorQ09ORklHX1NFVEtFWUNPREVTPXkKK0NPTkZJR19TRVRMT0dDT05TPXkKK0NPTkZJR19TSE9XS0VZPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbG9hZGZvbnQgYW5kIHNldGZvbnQKKyMKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUFNGMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1JBVyBpcyBub3Qgc2V0CisKKyMKKyMgRGViaWFuIFV0aWxpdGllcworIworQ09ORklHX01LVEVNUD15CitDT05GSUdfUElQRV9QUk9HUkVTUz15CitDT05GSUdfUlVOX1BBUlRTPXkKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZPXkKK0NPTkZJR19TVEFSVF9TVE9QX0RBRU1PTj15CitDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlM9eQorQ09ORklHX1dISUNIPXkKKworIworIyBFZGl0b3JzCisjCitDT05GSUdfQVdLPXkKK0NPTkZJR19GRUFUVVJFX0FXS19MSUJNPXkKK0NPTkZJR19DTVA9eQorQ09ORklHX0RJRkY9eQorQ09ORklHX0ZFQVRVUkVfRElGRl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfRElGRl9ESVI9eQorQ09ORklHX0VEPXkKK0NPTkZJR19QQVRDSD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19WST15CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTQwOTYKKyMgQ09ORklHX0ZFQVRVUkVfVklfOEJJVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1ZJX09QVElNSVpFX0NVUlNPUj15CitDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDPXkKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworQ09ORklHX0ZJTkQ9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUklOVDA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX01NSU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9QRVJNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1hERVY9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NQVhERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9OT1Q9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfU0laRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfREVMRVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1JFR0VYPXkKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1M9eQorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworQ09ORklHX0lOSVQ9eQorQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUI9eQorIyBDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCitDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRSRD15CitDT05GSUdfSEFMVD15CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCitDT05GSUdfTUVTRz15CisKKyMKKyMgTG9naW4vUGFzc3dvcmQgTWFuYWdlbWVudCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFM9eQorQ09ORklHX1VTRV9CQl9QV0RfR1JQPXkKK0NPTkZJR19VU0VfQkJfU0hBRE9XPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFQ9eQorQ09ORklHX1VTRV9CQl9DUllQVF9TSEE9eQorQ09ORklHX0FEREdST1VQPXkKK0NPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQPXkKK0NPTkZJR19ERUxHUk9VUD15CitDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorQ09ORklHX0FERFVTRVI9eQorQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZJUlNUX1NZU1RFTV9JRD0xMDAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD05OTkKK0NPTkZJR19ERUxVU0VSPXkKK0NPTkZJR19HRVRUWT15CitDT05GSUdfTE9HSU49eQorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dJTl9TQ1JJUFRTPXkKK0NPTkZJR19GRUFUVVJFX05PTE9HSU49eQorQ09ORklHX0ZFQVRVUkVfU0VDVVJFVFRZPXkKK0NPTkZJR19QQVNTV0Q9eQorQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0s9eQorQ09ORklHX0NSWVBUUFc9eQorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CitDT05GSUdfVkxPQ0s9eQorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKK0NPTkZJR19DSEFUVFI9eQorQ09ORklHX0ZTQ0s9eQorQ09ORklHX0xTQVRUUj15CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworQ09ORklHX01PRFBST0JFX1NNQUxMPXkKK0NPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRD15CisjIENPTkZJR19JTlNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfUk1NT0QgaXMgbm90IHNldAorIyBDT05GSUdfTFNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBNT0QgaXMgbm90IHNldAorCisjCisjIE9wdGlvbnMgY29tbW9uIHRvIG11bHRpcGxlIG1vZHV0aWxzCisjCisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUj0iL2xpYi9tb2R1bGVzIgorQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEU9Im1vZHVsZXMuZGVwIgorCisjCisjIExpbnV4IFN5c3RlbSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtJRD15CitDT05GSUdfRE1FU0c9eQorQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZPXkKK0NPTkZJR19GQlNFVD15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERT15CitDT05GSUdfRkRGTFVTSD15CitDT05GSUdfRkRGT1JNQVQ9eQorQ09ORklHX0ZESVNLPXkKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKK0NPTkZJR19GRUFUVVJFX0ZESVNLX1dSSVRBQkxFPXkKKyMgQ09ORklHX0ZFQVRVUkVfQUlYX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0dJX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VOX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfT1NGX0xBQkVMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZESVNLX0FEVkFOQ0VEPXkKK0NPTkZJR19GSU5ERlM9eQorIyBDT05GSUdfRkxPQ0sgaXMgbm90IHNldAorQ09ORklHX0ZSRUVSQU1ESVNLPXkKK0NPTkZJR19GU0NLX01JTklYPXkKKyMgQ09ORklHX01LRlNfRVhUMiBpcyBub3Qgc2V0CitDT05GSUdfTUtGU19NSU5JWD15CisKKyMKKyMgTWluaXggZmlsZXN5c3RlbSBzdXBwb3J0CisjCitDT05GSUdfRkVBVFVSRV9NSU5JWDI9eQorIyBDT05GSUdfTUtGU19SRUlTRVIgaXMgbm90IHNldAorQ09ORklHX01LRlNfVkZBVD15CitDT05GSUdfR0VUT1BUPXkKK0NPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HPXkKK0NPTkZJR19IRVhEVU1QPXkKK0NPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRT15CitDT05GSUdfSEQ9eQorQ09ORklHX0hXQ0xPQ0s9eQorQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUz15CitDT05GSUdfSVBDUk09eQorQ09ORklHX0lQQ1M9eQorQ09ORklHX0xPU0VUVVA9eQorQ09ORklHX0xTUENJPXkKK0NPTkZJR19MU1VTQj15CitDT05GSUdfTURFVj15CitDT05GSUdfRkVBVFVSRV9NREVWX0NPTkY9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUU9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfRVhFQz15CitDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkU9eQorQ09ORklHX01LU1dBUD15CitDT05GSUdfRkVBVFVSRV9NS1NXQVBfVVVJRD15CitDT05GSUdfTU9SRT15CitDT05GSUdfRkVBVFVSRV9VU0VfVEVSTUlPUz15CitDT05GSUdfVk9MVU1FSUQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0ZBVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjA9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVURGPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1M9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0NSQU1GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX09DRlMyPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRD15CitDT05GSUdfTU9VTlQ9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRT15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NT1VOVF9MQUJFTD15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlM9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfQ0lGUz15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9GTEFHUz15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQj15CitDT05GSUdfUElWT1RfUk9PVD15CitDT05GSUdfUkRBVEU9eQorQ09ORklHX1JERVY9eQorQ09ORklHX1JFQURQUk9GSUxFPXkKK0NPTkZJR19SVENXQUtFPXkKK0NPTkZJR19TQ1JJUFQ9eQorQ09ORklHX1NDUklQVFJFUExBWT15CitDT05GSUdfU0VUQVJDSD15CitDT05GSUdfU1dBUE9OT0ZGPXkKK0NPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkk9eQorQ09ORklHX1NXSVRDSF9ST09UPXkKK0NPTkZJR19VTU9VTlQ9eQorQ09ORklHX0ZFQVRVUkVfVU1PVU5UX0FMTD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1vdW50L3Vtb3VudAorIworQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUD15CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFV0aWxpdGllcworIworQ09ORklHX0FESlRJTUVYPXkKKyMgQ09ORklHX0JCQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19CRUVQPXkKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT00MDAwCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0zMAorQ09ORklHX0NIQVQ9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUw9eQorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1I9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUPXkKK0NPTkZJR19DSFJUPXkKK0NPTkZJR19DUk9ORD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUw9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRElSPSIvdmFyL3Nwb29sL2Nyb24iCitDT05GSUdfQ1JPTlRBQj15CitDT05GSUdfREM9eQorQ09ORklHX0ZFQVRVUkVfRENfTElCTT15CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorQ09ORklHX0RFVk1FTT15CitDT05GSUdfRUpFQ1Q9eQorQ09ORklHX0ZFQVRVUkVfRUpFQ1RfU0NTST15CitDT05GSUdfRkJTUExBU0g9eQorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorQ09ORklHX0xBU1Q9eQorIyBDT05GSUdfRkVBVFVSRV9MQVNUX1NNQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0xBU1RfRkFOQ1k9eQorQ09ORklHX0xFU1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19NQVhMSU5FUz05OTk5OTk5CitDT05GSUdfRkVBVFVSRV9MRVNTX0JSQUNLRVRTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19NQVJLUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX1JFR0VYUD15CitDT05GSUdfRkVBVFVSRV9MRVNTX1dJTkNIPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfREFTSENNRD15CitDT05GSUdfRkVBVFVSRV9MRVNTX0xJTkVOVU1TPXkKK0NPTkZJR19IRFBBUk09eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWT15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQT15CitDT05GSUdfTUFLRURFVlM9eQorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19MRUFGIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01BS0VERVZTX1RBQkxFPXkKK0NPTkZJR19NQU49eQorQ09ORklHX01JQ1JPQ09NPXkKK0NPTkZJR19NT1VOVFBPSU5UPXkKK0NPTkZJR19NVD15CitDT05GSUdfUkFJREFVVE9SVU49eQorIyBDT05GSUdfUkVBREFIRUFEIGlzIG5vdCBzZXQKK0NPTkZJR19SVU5MRVZFTD15CitDT05GSUdfUlg9eQorQ09ORklHX1NFVFNJRD15CitDT05GSUdfU1RSSU5HUz15CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfVElNRT15CitDT05GSUdfVElNRU9VVD15CitDT05GSUdfVFRZU0laRT15CitDT05GSUdfVk9MTkFNRT15CitDT05GSUdfV0FMTD15CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX0lQVjY9eQorIyBDT05GSUdfRkVBVFVSRV9VTklYX0xPQ0FMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1M9eQorIyBDT05GSUdfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUyBpcyBub3Qgc2V0CitDT05GSUdfQVJQPXkKK0NPTkZJR19BUlBJTkc9eQorQ09ORklHX0JSQ1RMPXkKK0NPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0JSQ1RMX1NIT1c9eQorQ09ORklHX0ROU0Q9eQorQ09ORklHX0VUSEVSX1dBS0U9eQorQ09ORklHX0ZBS0VJREVOVEQ9eQorQ09ORklHX0ZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZUUERfQUNDRVBUX0JST0tFTl9MSVNUPXkKK0NPTkZJR19GVFBHRVQ9eQorQ09ORklHX0ZUUFBVVD15CitDT05GSUdfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19IT1NUTkFNRT15CitDT05GSUdfSFRUUEQ9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1VTRV9TRU5ERklMRT15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRVSUQ9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9BVVRIX01ENT15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DR0k9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOVj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUz15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9QUk9YWT15CitDT05GSUdfSUZDT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NMSVA9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUT15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19IVz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUz15CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorQ09ORklHX0lGUExVR0Q9eQorQ09ORklHX0lGVVBET1dOPXkKK0NPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEg9Ii92YXIvcnVuL2lmc3RhdGUiCitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUD15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUF9CVUlMVElOPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSUZDT05GSUdfQlVJTFRJTiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0PXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjY9eQorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORz15CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1AgaXMgbm90IHNldAorQ09ORklHX0lORVREPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJEPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1JQQz15CitDT05GSUdfSVA9eQorQ09ORklHX0ZFQVRVUkVfSVBfQUREUkVTUz15CitDT05GSUdfRkVBVFVSRV9JUF9MSU5LPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JPVVRFPXkKK0NPTkZJR19GRUFUVVJFX0lQX1RVTk5FTD15CitDT05GSUdfRkVBVFVSRV9JUF9SVUxFPXkKK0NPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TPXkKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorQ09ORklHX0lQQUREUj15CitDT05GSUdfSVBMSU5LPXkKK0NPTkZJR19JUFJPVVRFPXkKK0NPTkZJR19JUFRVTk5FTD15CitDT05GSUdfSVBSVUxFPXkKK0NPTkZJR19JUENBTEM9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlM9eQorQ09ORklHX05BTUVJRj15CitDT05GSUdfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQ9eQorQ09ORklHX05DPXkKK0NPTkZJR19OQ19TRVJWRVI9eQorQ09ORklHX05DX0VYVFJBPXkKK0NPTkZJR19ORVRTVEFUPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERT15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRz15CitDT05GSUdfTlNMT09LVVA9eQorQ09ORklHX05UUEQ9eQorQ09ORklHX0ZFQVRVUkVfTlRQRF9TRVJWRVI9eQorQ09ORklHX1BJTkc9eQorQ09ORklHX1BJTkc2PXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkc9eQorQ09ORklHX1BTQ0FOPXkKK0NPTkZJR19ST1VURT15CitDT05GSUdfU0xBVFRBQ0g9eQorQ09ORklHX1RDUFNWRD15CitDT05GSUdfVEVMTkVUPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9UVFlQRT15CitDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOPXkKK0NPTkZJR19URUxORVREPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORT15CitDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQ9eQorQ09ORklHX1RGVFA9eQorQ09ORklHX1RGVFBEPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfR0VUPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfUFVUPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSPXkKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUk9VVEU9eQorQ09ORklHX1RSQUNFUk9VVEU2PXkKK0NPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRT15CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCBpcyBub3Qgc2V0CitDT05GSUdfVFVOQ1RMPXkKK0NPTkZJR19GRUFUVVJFX1RVTkNUTF9VRz15CitDT05GSUdfVURIQ1BEPXkKK0NPTkZJR19ESENQUkVMQVk9eQorQ09ORklHX0RVTVBMRUFTRVM9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWT15CitDT05GSUdfREhDUERfTEVBU0VTX0ZJTEU9Ii92YXIvbGliL21pc2MvdWRoY3BkLmxlYXNlcyIKK0NPTkZJR19VREhDUEM9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BDX0FSUElORz15CitDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUPXkKK0NPTkZJR19VREhDUF9ERUJVRz05CitDT05GSUdfRkVBVFVSRV9VREhDUF9SRkMzMzk3PXkKK0NPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ9Ii91c3Ivc2hhcmUvdWRoY3BjL2RlZmF1bHQuc2NyaXB0IgorQ09ORklHX1VESENQQ19TTEFDS19GT1JfQlVHR1lfU0VSVkVSUz04MAorQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUz0iLVIgLW4iCitDT05GSUdfVURQU1ZEPXkKK0NPTkZJR19WQ09ORklHPXkKK0NPTkZJR19XR0VUPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT049eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9USU1FT1VUPXkKK0NPTkZJR19aQ0lQPXkKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKK0NPTkZJR19MUEQ9eQorQ09ORklHX0xQUj15CitDT05GSUdfTFBRPXkKKworIworIyBNYWlsIFV0aWxpdGllcworIworQ09ORklHX01BS0VNSU1FPXkKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0idXMtYXNjaWkiCitDT05GSUdfUE9QTUFJTERJUj15CitDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZPXkKK0NPTkZJR19SRUZPUk1JTUU9eQorQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVD15CitDT05GSUdfU0VORE1BSUw9eQorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCitDT05GSUdfRlJFRT15CitDT05GSUdfRlVTRVI9eQorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKK0NPTkZJR19OTUVURVI9eQorQ09ORklHX1BHUkVQPXkKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorQ09ORklHX1BTPXkKK0NPTkZJR19GRUFUVVJFX1BTX1dJREU9eQorIyBDT05GSUdfRkVBVFVSRV9QU19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19SRU5JQ0U9eQorQ09ORklHX0JCX1NZU0NUTD15CitDT05GSUdfVE9QPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRT15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVT15CitDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTPXkKK0NPTkZJR19GRUFUVVJFX1RPUE1FTT15CitDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFM9eQorQ09ORklHX1VQVElNRT15CitDT05GSUdfV0FUQ0g9eQorCisjCisjIFJ1bml0IFV0aWxpdGllcworIworQ09ORklHX1JVTlNWPXkKK0NPTkZJR19SVU5TVkRJUj15CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CitDT05GSUdfU1Y9eQorQ09ORklHX1NWX0RFRkFVTFRfU0VSVklDRV9ESVI9Ii92YXIvc2VydmljZSIKK0NPTkZJR19TVkxPR0Q9eQorQ09ORklHX0NIUFNUPXkKK0NPTkZJR19TRVRVSURHSUQ9eQorQ09ORklHX0VOVlVJREdJRD15CitDT05GSUdfRU5WRElSPXkKK0NPTkZJR19TT0ZUTElNSVQ9eQorIyBDT05GSUdfQ0hDT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfR0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfTE9BRF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUFUQ0hQQVRIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU1RPUkVDT04gaXMgbm90IHNldAorIyBDT05GSUdfUlVOQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVNUQVRVUyBpcyBub3Qgc2V0CisKKyMKKyMgU2hlbGxzCisjCitDT05GSUdfRkVBVFVSRV9TSF9JU19BU0g9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfQVNIPXkKK0NPTkZJR19BU0hfQkFTSF9DT01QQVQ9eQorQ09ORklHX0FTSF9KT0JfQ09OVFJPTD15CitDT05GSUdfQVNIX0FMSUFTPXkKK0NPTkZJR19BU0hfR0VUT1BUUz15CitDT05GSUdfQVNIX0JVSUxUSU5fRUNITz15CitDT05GSUdfQVNIX0JVSUxUSU5fUFJJTlRGPXkKK0NPTkZJR19BU0hfQlVJTFRJTl9URVNUPXkKK0NPTkZJR19BU0hfQ01EQ01EPXkKKyMgQ09ORklHX0FTSF9NQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19BU0hfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX0FTSF9SQU5ET01fU1VQUE9SVD15CitDT05GSUdfQVNIX0VYUEFORF9QUk1UPXkKK0NPTkZJR19IVVNIPXkKK0NPTkZJR19IVVNIX0JBU0hfQ09NUEFUPXkKK0NPTkZJR19IVVNIX0hFTFA9eQorQ09ORklHX0hVU0hfSU5URVJBQ1RJVkU9eQorQ09ORklHX0hVU0hfSk9CPXkKK0NPTkZJR19IVVNIX1RJQ0s9eQorQ09ORklHX0hVU0hfSUY9eQorQ09ORklHX0hVU0hfTE9PUFM9eQorQ09ORklHX0hVU0hfQ0FTRT15CitDT05GSUdfSFVTSF9GVU5DVElPTlM9eQorQ09ORklHX0hVU0hfTE9DQUw9eQorQ09ORklHX0hVU0hfRVhQT1JUX049eQorQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQ9eQorQ09ORklHX01TSD15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQ9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLIGlzIG5vdCBzZXQKK0NPTkZJR19DVFRZSEFDSz15CisKKyMKKyMgU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfU1lTTE9HRD15CitDT05GSUdfRkVBVFVSRV9ST1RBVEVfTE9HRklMRT15CitDT05GSUdfRkVBVFVSRV9SRU1PVEVfTE9HPXkKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQPXkKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRT0yNTYKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRT0xNgorQ09ORklHX0xPR1JFQUQ9eQorQ09ORklHX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkc9eQorQ09ORklHX0tMT0dEPXkKK0NPTkZJR19MT0dHRVI9eQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uZmlncy9hbmRyb2lkX2RlZmNvbmZpZyBiL2J1c3lib3gtMS4xOS4zL2NvbmZpZ3MvYW5kcm9pZF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1MjMyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvbmZpZ3MvYW5kcm9pZF9kZWZjb25maWcKQEAgLTAsMCArMSwxMDE0IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIEJ1c3lib3ggdmVyc2lvbjogMS4xOS4wLmdpdAorIyBXZWQgSnVuIDI5IDEyOjAxOjU3IDIwMTEKKyMKK0NPTkZJR19IQVZFX0RPVF9DT05GSUc9eQorCisjCisjIEJ1c3lib3ggU2V0dGluZ3MKKyMKKworIworIyBHZW5lcmFsIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0RFU0tUT1AgaXMgbm90IHNldAorIyBDT05GSUdfRVhUUkFfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOQ0xVREVfU1VTdjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX1BPUlRBQkxFX0NPREUgaXMgbm90IHNldAorQ09ORklHX1BMQVRGT1JNX0xJTlVYPXkKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSE9XX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TVEFMTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfTk9fVVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0FMRV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1VTSU5HX0xPQ0FMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WIGlzIG5vdCBzZXQKK0NPTkZJR19TVUJTVF9XQ0hBUj0wCitDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVI9MAorIyBDT05GSUdfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfV0lERV9XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9CSURJX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9ORVVUUkFMX1RBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPTkdfT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFVlBUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVVRNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dUTVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QSURGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9BUFBMRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CVVNZQk9YX0VYRUNfUEFUSD0iL3Byb2Mvc2VsZi9leGUiCitDT05GSUdfRkVBVFVSRV9TWVNMT0c9eQorIyBDT05GSUdfRkVBVFVSRV9IQVZFX1JQQyBpcyBub3Qgc2V0CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xGUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYPSJhcm0tZWFiaS0iCisjCisjIFJlbW92ZWQ6CisjIHdhcm5pbmcgZmxhZ3M6CisjIC1Xbm8tbXVsdGljaGFyIC1XIC1XYWxsIC1Xbm8tdW51c2VkIC1XaW5pdC1zZWxmIC1XcG9pbnRlci1hcml0aAorIyAtV2Vycm9yPXJldHVybi10eXBlIC1XZXJyb3I9bm9uLXZpcnR1YWwtZHRvciAtV2Vycm9yPWFkZHJlc3MKKyMgLVdlcnJvcj1zZXF1ZW5jZS1wb2ludCAtV3N0cmljdC1hbGlhc2luZz0yIC1Xbm8tdW5kZWYgLVduby1zaGFkb3cKKyMgYmJveCBhbHJlYWR5IGFkZHMgdGhlc2U6CisjIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZvbWl0LWZyYW1lLXBvaW50ZXIKKyMgc2hvdWxkIGJlIG5vdCBuZWVkZWQsIG9yIGV2ZW4gaW5jcmVhc2VzIGNvZGUgc2l6ZToKKyMgLWZpbmxpbmUtZnVuY3Rpb25zIC1mbm8taW5saW5lLWZ1bmN0aW9ucy1jYWxsZWQtb25jZSAtZmlubGluZS1saW1pdD02NAorIyAtZnN0YWNrLXByb3RlY3RvciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWV4Y2VwdGlvbnMgLWZ1bndpbmQtdGFibGVzCisjIC1mbWVzc2FnZS1sZW5ndGg9MCAob25seSBhZmZlY3RzIGVycm9yIG1lc3NhZ2UgZm9ybWF0KQorIyB0b2RvOiBkbyB3ZSBuZWVkIHRoZXNlPyAtCisjIC1mbm8tc2hvcnQtZW51bXMKKyMgLWZnY3NlLWFmdGVyLXJlbG9hZAorIyAtZnJlcnVuLWNzZS1hZnRlci1sb29wCisjIC1mcmVuYW1lLXJlZ2lzdGVycworQ09ORklHX0VYVFJBX0NGTEFHUz0iLUkkQS9zeXN0ZW0vY29yZS9pbmNsdWRlIC1JJEEvYmlvbmljL2xpYmMvYXJjaC1hcm0vaW5jbHVkZSAtSSRBL2Jpb25pYy9saWJjL2luY2x1ZGUgLUkkQS9iaW9uaWMvbGliYy9rZXJuZWwvY29tbW9uIC1JJEEvYmlvbmljL2xpYmMva2VybmVsL2FyY2gtYXJtIC1JJEEvYmlvbmljL2xpYm0vaW5jbHVkZSAtSSRBL2Jpb25pYy9saWJtL2luY2x1ZGUvYXJjaC9hcm0gLWluY2x1ZGUgJEEvc3lzdGVtL2NvcmUvaW5jbHVkZS9hcmNoL2xpbnV4LWFybS9BbmRyb2lkQ29uZmlnLmggLUkkQS9zeXN0ZW0vY29yZS9pbmNsdWRlL2FyY2gvbGludXgtYXJtLyAtREFORFJPSUQgLURTS19SRUxFQVNFIC1ub3N0ZGxpYiAtbWFyY2g9YXJtdjctYSAtbXNvZnQtZmxvYXQgLW1mbG9hdC1hYmk9c29mdGZwIC1tZnB1PW5lb24gLW10aHVtYiAtbXRodW1iLWludGVyd29yayAtZnBpYyAtZm5vLXNob3J0LWVudW1zIC1mZ2NzZS1hZnRlci1yZWxvYWQgLWZyZXJ1bi1jc2UtYWZ0ZXItbG9vcCAtZnJlbmFtZS1yZWdpc3RlcnMiCisKKyMKKyMgRGVidWdnaW5nIE9wdGlvbnMKKyMKKyMgQ09ORklHX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFU1NJTUlaRSBpcyBub3Qgc2V0CisjIENPTkZJR19XRVJST1IgaXMgbm90IHNldAorQ09ORklHX05PX0RFQlVHX0xJQj15CisjIENPTkZJR19ETUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGRU5DRSBpcyBub3Qgc2V0CisKKyMKKyMgSW5zdGFsbGF0aW9uIE9wdGlvbnMgKCJtYWtlIGluc3RhbGwiIGJlaGF2aW9yKQorIworQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworIyBDT05GSUdfRkVBVFVSRV9TWVNURU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlRNSU5NQVggaXMgbm90IHNldAorQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQ9MgorIyBDT05GSUdfRkVBVFVSRV9GQVNUX1RPUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VUQ19ORVRXT1JLUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9VU0VfVEVSTUlPUz15CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkcgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOPTAKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19WSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlk9MAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTQKKyMgQ09ORklHX0ZFQVRVUkVfU0tJUF9ST09URlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9OT1RPTklDX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSU9DVExfSEVYMlNUUl9FUlJPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXSUIgaXMgbm90IHNldAorCisjCisjIEFwcGxldHMKKyMKKworIworIyBBcmNoaXZhbCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1haPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0xaTUE9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfQloyPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0daPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1o9eQorQ09ORklHX0FSPXkKK0NPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTPXkKK0NPTkZJR19GRUFUVVJFX0FSX0NSRUFURT15CitDT05GSUdfQlVOWklQMj15CitDT05GSUdfQlpJUDI9eQorQ09ORklHX0NQSU89eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19PPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fUD15CitDT05GSUdfRFBLRz15CitDT05GSUdfRFBLR19ERUI9eQorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CisjIENPTkZJR19GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19MWk9QPXkKK0NPTkZJR19MWk9QX0NPTVBSX0hJR0g9eQorQ09ORklHX1JQTTJDUElPPXkKK0NPTkZJR19SUE09eQorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9BVVRPREVURUNUPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9GUk9NPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9UT19DT01NQU5EIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRT15CitDT05GSUdfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1NFTElOVVggaXMgbm90IHNldAorQ09ORklHX1VOQ09NUFJFU1M9eQorQ09ORklHX1VOTFpNQT15CitDT05GSUdfRkVBVFVSRV9MWk1BX0ZBU1Q9eQorQ09ORklHX0xaTUE9eQorQ09ORklHX1VOWFo9eQorQ09ORklHX1haPXkKK0NPTkZJR19VTlpJUD15CisKKyMKKyMgQ29yZXV0aWxzCisjCitDT05GSUdfQkFTRU5BTUU9eQorQ09ORklHX0NBVD15CisjIENPTkZJR19EQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX05BTk8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRCBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUFMgaXMgbm90IHNldAorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorQ09ORklHX0JBU0U2ND15CitDT05GSUdfQ0FMPXkKK0NPTkZJR19DQVRWPXkKK0NPTkZJR19DSEdSUD15CitDT05GSUdfQ0hNT0Q9eQorQ09ORklHX0NIT1dOPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJPT1Q9eQorQ09ORklHX0NLU1VNPXkKK0NPTkZJR19DT01NPXkKK0NPTkZJR19DUD15CisjIENPTkZJR19GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfQ1VUPXkKK0NPTkZJR19ERD15CitDT05GSUdfRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkc9eQorQ09ORklHX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkU9eQorQ09ORklHX0ZFQVRVUkVfRERfSUJTX09CUz15CisjIENPTkZJR19ERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RGX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19ESVJOQU1FPXkKK0NPTkZJR19ET1MyVU5JWD15CitDT05GSUdfVU5JWDJET1M9eQorQ09ORklHX0RVPXkKK0NPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLPXkKK0NPTkZJR19FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE89eQorIyBDT05GSUdfRU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfRVhQQU5EPXkKKyMgQ09ORklHX0ZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYUFJfTUFUSF9TVVBQT1JUXzY0IGlzIG5vdCBzZXQKK0NPTkZJR19GQUxTRT15CitDT05GSUdfRk9MRD15CisjIENPTkZJR19GU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKKyMgQ09ORklHX0hPU1RJRCBpcyBub3Qgc2V0CitDT05GSUdfSU5TVEFMTD15CisjIENPTkZJR19GRUFUVVJFX0lOU1RBTExfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19MTj15CisjIENPTkZJR19MT0dOQU1FIGlzIG5vdCBzZXQKK0NPTkZJR19MUz15CitDT05GSUdfRkVBVFVSRV9MU19GSUxFVFlQRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1M9eQorQ09ORklHX0ZFQVRVUkVfTFNfUkVDVVJTSVZFPXkKK0NPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUz15CitDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1VTRVJOQU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19DT0xPUl9JU19ERUZBVUxUIGlzIG5vdCBzZXQKK0NPTkZJR19NRDVTVU09eQorQ09ORklHX01LRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NS0ZJRk89eQorQ09ORklHX01LTk9EPXkKK0NPTkZJR19NVj15CisjIENPTkZJR19GRUFUVVJFX01WX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTklDRT15CitDT05GSUdfTk9IVVA9eQorQ09ORklHX09EPXkKK0NPTkZJR19QUklOVEVOVj15CitDT05GSUdfUFJJTlRGPXkKK0NPTkZJR19QV0Q9eQorQ09ORklHX1JFQURMSU5LPXkKK0NPTkZJR19GRUFUVVJFX1JFQURMSU5LX0ZPTExPVz15CitDT05GSUdfUkVBTFBBVEg9eQorQ09ORklHX1JNPXkKK0NPTkZJR19STURJUj15CisjIENPTkZJR19GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfU0VRPXkKK0NPTkZJR19TSEExU1VNPXkKK0NPTkZJR19TSEEyNTZTVU09eQorQ09ORklHX1NIQTUxMlNVTT15CitDT05GSUdfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkxPQVRfU0xFRVA9eQorQ09ORklHX1NPUlQ9eQorQ09ORklHX0ZFQVRVUkVfU09SVF9CSUc9eQorQ09ORklHX1NQTElUPXkKK0NPTkZJR19GRUFUVVJFX1NQTElUX0ZBTkNZPXkKKyMgQ09ORklHX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFUX0ZPUk1BVCBpcyBub3Qgc2V0CitDT05GSUdfU1RUWT15CitDT05GSUdfU1VNPXkKK0NPTkZJR19TWU5DPXkKK0NPTkZJR19UQUM9eQorQ09ORklHX1RBSUw9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfVEFJTD15CitDT05GSUdfVEVFPXkKK0NPTkZJR19GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU89eQorQ09ORklHX1RSVUU9eQorIyBDT05GSUdfVFRZIGlzIG5vdCBzZXQKK0NPTkZJR19VTkFNRT15CitDT05GSUdfVU5FWFBBTkQ9eQorIyBDT05GSUdfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1VOSVE9eQorIyBDT05GSUdfVVNMRUVQIGlzIG5vdCBzZXQKK0NPTkZJR19VVURFQ09ERT15CitDT05GSUdfVVVFTkNPREU9eQorQ09ORklHX1dDPXkKK0NPTkZJR19GRUFUVVJFX1dDX0xBUkdFPXkKKyMgQ09ORklHX1dITyBpcyBub3Qgc2V0CitDT05GSUdfV0hPQU1JPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworQ09ORklHX0NIVlQ9eQorQ09ORklHX0ZHQ09OU09MRT15CitDT05GSUdfQ0xFQVI9eQorQ09ORklHX0RFQUxMT0NWVD15CitDT05GSUdfRFVNUEtNQVA9eQorIyBDT05GSUdfS0JEX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfTE9BREZPTlQgaXMgbm90IHNldAorQ09ORklHX0xPQURLTUFQPXkKK0NPTkZJR19PUEVOVlQ9eQorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKK0NPTkZJR19TRVRDT05TT0xFPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0VUQ09OU09MRV9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VURk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVEZPTlRfVEVYVFVBTF9NQVAgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVI9IiIKK0NPTkZJR19TRVRLRVlDT0RFUz15CitDT05GSUdfU0VUTE9HQ09OUz15CitDT05GSUdfU0hPV0tFWT15CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1BTRjIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9SQVcgaXMgbm90IHNldAorCisjCisjIERlYmlhbiBVdGlsaXRpZXMKKyMKK0NPTkZJR19NS1RFTVA9eQorQ09ORklHX1BJUEVfUFJPR1JFU1M9eQorQ09ORklHX1JVTl9QQVJUUz15CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZPXkKK0NPTkZJR19TVEFSVF9TVE9QX0RBRU1PTj15CitDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWT15CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19QQVRDSD15CisjIENPTkZJR19WSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTAKKyMgQ09ORklHX0ZFQVRVUkVfVklfOEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX0NPTE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUksgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1NFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9TRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FXSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FXS19MSUJNIGlzIG5vdCBzZXQKK0NPTkZJR19DTVA9eQorQ09ORklHX0RJRkY9eQorIyBDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9ESUZGX0RJUj15CisjIENPTkZJR19FRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDIGlzIG5vdCBzZXQKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworIyBDT05GSUdfRklORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUFJJTlQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfWERFViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTUFYREVQVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9FWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTk9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BBVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1JFR0VYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9MSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUkVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUkVQX0NPTlRFWFQgaXMgbm90IHNldAorQ09ORklHX1hBUkdTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVD15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTT15CisKKyMKKyMgSW5pdCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0JPT1RDSEFSVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9DT05GSUdfRklMRSBpcyBub3Qgc2V0CitDT05GSUdfSEFMVD15CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCitDT05GSUdfSU5JVD15CitDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQj15CisjIENPTkZJR19GRUFUVVJFX0tJTExfUkVNT1ZFRCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZPTAKK0NPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFk9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfRVhUUkFfUVVJRVQ9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFM9eQorQ09ORklHX0ZFQVRVUkVfSU5JVFJEPXkKK0NPTkZJR19JTklUX1RFUk1JTkFMX1RZUEU9ImxpbnV4IgorQ09ORklHX01FU0c9eQorQ09ORklHX0ZFQVRVUkVfTUVTR19FTkFCTEVfT05MWV9HUk9VUD15CisKKyMKKyMgTG9naW4vUGFzc3dvcmQgTWFuYWdlbWVudCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FERF9TSEVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRU1PVkVfU0hFTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9QV0RfR1JQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9TSEFET1cgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX0NSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9DUllQVF9TSEEgaXMgbm90IHNldAorIyBDT05GSUdfQUREVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorQ09ORklHX0ZJUlNUX1NZU1RFTV9JRD0wCitDT05GSUdfTEFTVF9TWVNURU1fSUQ9MAorIyBDT05GSUdfQURER1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFTFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVMR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBTSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJTl9TQ1JJUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVNTV0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVFBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfU1lTTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVUxPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMT0NLIGlzIG5vdCBzZXQKKworIworIyBMaW51eCBFeHQyIEZTIFByb2dzCisjCitDT05GSUdfQ0hBVFRSPXkKKyMgQ09ORklHX0ZTQ0sgaXMgbm90IHNldAorQ09ORklHX0xTQVRUUj15CitDT05GSUdfVFVORTJGUz15CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworQ09ORklHX01PRElORk89eQorQ09ORklHX01PRFBST0JFX1NNQUxMPXkKK0NPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRD15CisjIENPTkZJR19JTlNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfUk1NT0QgaXMgbm90IHNldAorIyBDT05GSUdfTFNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBNT0QgaXMgbm90IHNldAorCisjCisjIE9wdGlvbnMgY29tbW9uIHRvIG11bHRpcGxlIG1vZHV0aWxzCisjCisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUj0iL2xpYi9tb2R1bGVzIgorQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEU9Im1vZHVsZXMuZGVwIgorCisjCisjIExpbnV4IFN5c3RlbSBVdGlsaXRpZXMKKyMKK0NPTkZJR19CTE9DS0RFVj15CitDT05GSUdfUkVWPXkKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtJRD15CisjIENPTkZJR19GRUFUVVJFX0JMS0lEX1RZUEUgaXMgbm90IHNldAorQ09ORklHX0RNRVNHPXkKK0NPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWT15CitDT05GSUdfRkJTRVQ9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREU9eQorQ09ORklHX0ZERkxVU0g9eQorQ09ORklHX0ZERk9STUFUPXkKK0NPTkZJR19GRElTSz15CitDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUz15CitDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRT15CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dQVF9MQUJFTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRD15CitDT05GSUdfRklOREZTPXkKK0NPTkZJR19GTE9DSz15CitDT05GSUdfRlJFRVJBTURJU0s9eQorIyBDT05GSUdfRlNDS19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX0VYVDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01JTklYMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1ZGQVQgaXMgbm90IHNldAorQ09ORklHX0dFVE9QVD15CitDT05GSUdfRkVBVFVSRV9HRVRPUFRfTE9ORz15CitDT05GSUdfSEVYRFVNUD15CitDT05GSUdfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0U9eQorQ09ORklHX0hEPXkKKyMgQ09ORklHX0hXQ0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CitDT05GSUdfTE9TRVRVUD15CitDT05GSUdfTFNQQ0k9eQorQ09ORklHX0xTVVNCPXkKKyMgQ09ORklHX01ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0NPTkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfTE9BRF9GSVJNV0FSRSBpcyBub3Qgc2V0CitDT05GSUdfTUtTV0FQPXkKK0NPTkZJR19GRUFUVVJFX01LU1dBUF9VVUlEPXkKK0NPTkZJR19NT1JFPXkKKyMgQ09ORklHX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19QSVZPVF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19SREVWPXkKK0NPTkZJR19SRUFEUFJPRklMRT15CitDT05GSUdfUlRDV0FLRT15CitDT05GSUdfU0NSSVBUPXkKK0NPTkZJR19TQ1JJUFRSRVBMQVk9eQorIyBDT05GSUdfU0VUQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQT05PRkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXSVRDSF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VNT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VNT1VOVF9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1ZPTFVNRUlEPXkKKworIworIyBGaWxlc3lzdGVtL1ZvbHVtZSBpZGVudGlmaWNhdGlvbgorIworQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0ZBVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjA9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVURGPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1M9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0NSQU1GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX09DRlMyPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRD15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NPTlNQWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU5EV1JJVEUgaXMgbm90IHNldAorQ09ORklHX05BTkREVU1QPXkKK0NPTkZJR19TRVRTRVJJQUw9eQorIyBDT05GSUdfVUJJQVRUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSURFVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklNS1ZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklSTVZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklSU1ZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklVUERBVEVWT0wgaXMgbm90IHNldAorIyBDT05GSUdfQURKVElNRVggaXMgbm90IHNldAorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfQkVFUD15CitDT05GSUdfRkVBVFVSRV9CRUVQX0ZSRVE9NDAwMAorQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVM9MzAKK0NPTkZJR19DSEFUPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTj15CitDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVD15CitDT05GSUdfQ0hSVD15CisjIENPTkZJR19DUk9ORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NST05EX0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iIgorIyBDT05GSUdfQ1JPTlRBQiBpcyBub3Qgc2V0CitDT05GSUdfREM9eQorQ09ORklHX0ZFQVRVUkVfRENfTElCTT15CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorQ09ORklHX0RFVk1FTT15CisjIENPTkZJR19FSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0kgaXMgbm90IHNldAorQ09ORklHX0ZCU1BMQVNIPXkKK0NPTkZJR19GTEFTSENQPXkKK0NPTkZJR19GTEFTSF9MT0NLPXkKK0NPTkZJR19GTEFTSF9VTkxPQ0s9eQorIyBDT05GSUdfRkxBU0hfRVJBU0VBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSU9OSUNFIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZRD15CisjIENPTkZJR19MQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTAKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX1dJTkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUyBpcyBub3Qgc2V0CitDT05GSUdfSERQQVJNPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFk9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVD15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUE9eQorQ09ORklHX01BS0VERVZTPXkKKyMgQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfTEVBRiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRT15CitDT05GSUdfTUFOPXkKKyMgQ09ORklHX01JQ1JPQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVU5UUE9JTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVQgaXMgbm90IHNldAorQ09ORklHX1JBSURBVVRPUlVOPXkKKyMgQ09ORklHX1JFQURBSEVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfUlVOTEVWRUwgaXMgbm90IHNldAorQ09ORklHX1JYPXkKK0NPTkZJR19TRVRTSUQ9eQorQ09ORklHX1NUUklOR1M9eQorIyBDT05GSUdfVEFTS1NFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBU0tTRVRfRkFOQ1kgaXMgbm90IHNldAorQ09ORklHX1RJTUU9eQorQ09ORklHX1RJTUVPVVQ9eQorQ09ORklHX1RUWVNJWkU9eQorQ09ORklHX1ZPTE5BTUU9eQorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CitDT05GSUdfTkJEQ0xJRU5UPXkKK0NPTkZJR19OQz15CitDT05GSUdfTkNfU0VSVkVSPXkKK0NPTkZJR19OQ19FWFRSQT15CisjIENPTkZJR19OQ18xMTBfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJTkcgaXMgbm90IHNldAorIyBDT05GSUdfUElORzYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQU5DWV9QSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19XSE9JUz15CisjIENPTkZJR19GRUFUVVJFX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTklYX0xPQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorIyBDT05GSUdfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XIGlzIG5vdCBzZXQKK0NPTkZJR19ETlNEPXkKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorQ09ORklHX0ZBS0VJREVOVEQ9eQorQ09ORklHX0ZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZUUERfQUNDRVBUX0JST0tFTl9MSVNUPXkKK0NPTkZJR19GVFBHRVQ9eQorQ09ORklHX0ZUUFBVVD15CisjIENPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSE9TVE5BTUUgaXMgbm90IHNldAorQ09ORklHX0hUVFBEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1JBTkdFUz15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DR0k9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOVj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUz15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9QUk9YWT15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9HWklQPXkKK0NPTkZJR19JRkNPTkZJRz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVM9eQorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlE9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVM9eQorIyBDT05GSUdfSUZFTlNMQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGUExVR0QgaXMgbm90IHNldAorQ09ORklHX0lGVVBET1dOPXkKK0NPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEg9Ii92YXIvcnVuL2lmc3RhdGUiCitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUD15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUF9CVUlMVElOPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSUZDT05GSUdfQlVJTFRJTiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0PXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorQ09ORklHX0lQPXkKK0NPTkZJR19GRUFUVVJFX0lQX0FERFJFU1M9eQorQ09ORklHX0ZFQVRVUkVfSVBfTElOSz15CitDT05GSUdfRkVBVFVSRV9JUF9ST1VURT15CitDT05GSUdfRkVBVFVSRV9JUF9UVU5ORUw9eQorQ09ORklHX0ZFQVRVUkVfSVBfUlVMRT15CitDT05GSUdfRkVBVFVSRV9JUF9TSE9SVF9GT1JNUz15CisjIENPTkZJR19GRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19JUEFERFI9eQorQ09ORklHX0lQTElOSz15CitDT05GSUdfSVBST1VURT15CitDT05GSUdfSVBUVU5ORUw9eQorQ09ORklHX0lQUlVMRT15CitDT05GSUdfSVBDQUxDPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19GQU5DWT15CisjIENPTkZJR19GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX05FVFNUQVQ9eQorQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9XSURFPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHPXkKKyMgQ09ORklHX05TTE9PS1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05UUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUiBpcyBub3Qgc2V0CitDT05GSUdfUFNDQU49eQorQ09ORklHX1JPVVRFPXkKKyMgQ09ORklHX1NMQVRUQUNIIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BTVkQ9eQorIyBDT05GSUdfVEVMTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0dFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUiBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VST1VURTYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVVNFX0lDTVAgaXMgbm90IHNldAorQ09ORklHX1RVTkNUTD15CitDT05GSUdfRkVBVFVSRV9UVU5DVExfVUc9eQorIyBDT05GSUdfVURIQ1BEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BSRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QTEVBU0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQRF9CQVNFX0lQX09OX01BQyBpcyBub3Qgc2V0CitDT05GSUdfREhDUERfTEVBU0VTX0ZJTEU9IiIKK0NPTkZJR19VREhDUEM9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BDX0FSUElORz15CisjIENPTkZJR19GRUFUVVJFX1VESENQX1BPUlQgaXMgbm90IHNldAorQ09ORklHX1VESENQX0RFQlVHPTkKK0NPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTc9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BfODAyMVE9eQorQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVD0iL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTgwCitDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TPSItUiAtbiIKKyMgQ09ORklHX1VEUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19XR0VUPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT049eQorIyBDT05GSUdfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9XR0VUX1RJTUVPVVQ9eQorIyBDT05GSUdfWkNJUCBpcyBub3Qgc2V0CisKKyMKKyMgUHJpbnQgVXRpbGl0aWVzCisjCitDT05GSUdfTFBEPXkKK0NPTkZJR19MUFI9eQorQ09ORklHX0xQUT15CisKKyMKKyMgTWFpbCBVdGlsaXRpZXMKKyMKK0NPTkZJR19NQUtFTUlNRT15CitDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQ9InVzLWFzY2lpIgorQ09ORklHX1BPUE1BSUxESVI9eQorQ09ORklHX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWT15CitDT05GSUdfUkVGT1JNSU1FPXkKK0NPTkZJR19GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQ9eQorQ09ORklHX1NFTkRNQUlMPXkKKworIworIyBQcm9jZXNzIFV0aWxpdGllcworIworQ09ORklHX0lPU1RBVD15CitDT05GSUdfTVBTVEFUPXkKK0NPTkZJR19OTUVURVI9eQorQ09ORklHX1BNQVA9eQorQ09ORklHX1BPV0VSVE9QPXkKK0NPTkZJR19QU1RSRUU9eQorQ09ORklHX1BXRFg9eQorQ09ORklHX1NNRU1DQVA9eQorIyBDT05GSUdfRlJFRSBpcyBub3Qgc2V0CitDT05GSUdfRlVTRVI9eQorIyBDT05GSUdfS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LSUxMQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tJTExBTEw1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BHUkVQIGlzIG5vdCBzZXQKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CisjIENPTkZJR19QS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1dJREUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19SRU5JQ0U9eQorQ09ORklHX0JCX1NZU0NUTD15CitDT05GSUdfVE9QPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRT15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVT15CitDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTPXkKK0NPTkZJR19GRUFUVVJFX1RPUE1FTT15CitDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFM9eQorIyBDT05GSUdfVVBUSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSD15CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCitDT05GSUdfUlVOU1Y9eQorQ09ORklHX1JVTlNWRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOU1ZESVJfTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TVj15CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iL3Zhci9zZXJ2aWNlIgorQ09ORklHX1NWTE9HRD15CitDT05GSUdfQ0hQU1Q9eQorQ09ORklHX1NFVFVJREdJRD15CitDT05GSUdfRU5WVUlER0lEPXkKK0NPTkZJR19FTlZESVI9eQorQ09ORklHX1NPRlRMSU1JVD15CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKKyMgQ09ORklHX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0lETEVfVElNRU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfSk9CX0NPTlRST0wgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9HRVRPUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fUFJJTlRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0NNRENNRCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9FWFBBTkRfUFJNVCBpcyBub3Qgc2V0CitDT05GSUdfQ1RUWUhBQ0s9eQorIyBDT05GSUdfSFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQlJBQ0VfRVhQQU5TSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSEVMUCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lOVEVSQUNUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9KT0IgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9USUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSUYgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9MT09QUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0NBU0UgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9GVU5DVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRVhQT1JUX04gaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9NT0RFX1ggaXMgbm90IHNldAorIyBDT05GSUdfTVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FPXkKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19OT05FPXkKKyMgQ09ORklHX1NIX01BVEhfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9ISVNURklMRVNJWkUgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBMb2dnaW5nIFV0aWxpdGllcworIworIyBDT05GSUdfU1lTTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVNT1RFX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9DRkcgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFPTAKKyMgQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTAKKyMgQ09ORklHX0xPR1JFQUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORyBpcyBub3Qgc2V0CitDT05GSUdfS0xPR0Q9eQorQ09ORklHX0ZFQVRVUkVfS0xPR0RfS0xPR0NUTD15CisjIENPTkZJR19MT0dHRVIgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uZmlncy9jeWd3aW5fZGVmY29uZmlnIGIvYnVzeWJveC0xLjE5LjMvY29uZmlncy9jeWd3aW5fZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmQ2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25maWdzL2N5Z3dpbl9kZWZjb25maWcKQEAgLTAsMCArMSw5OTcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgQnVzeWJveCB2ZXJzaW9uOiAxLjE5LjAuZ2l0CisjIFN1biBKdWwgMTAgMTI6NDg6NTAgMjAxMQorIworQ09ORklHX0hBVkVfRE9UX0NPTkZJRz15CisKKyMKKyMgQnVzeWJveCBTZXR0aW5ncworIworCisjCisjIEdlbmVyYWwgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0RFU0tUT1A9eQorIyBDT05GSUdfRVhUUkFfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19JTkNMVURFX1NVU3YyPXkKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19QTEFURk9STV9MSU5VWD15CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVI9eQorIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1VOSUNPREVfU1VQUE9SVD15CisjIENPTkZJR19VTklDT0RFX1VTSU5HX0xPQ0FMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WIGlzIG5vdCBzZXQKK0NPTkZJR19TVUJTVF9XQ0hBUj02NTUzMworQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSPTAKKyMgQ09ORklHX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1dJREVfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfQklESV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfTkVVVFJBTF9UQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1BSRVNFUlZFX0JST0tFTiBpcyBub3Qgc2V0CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVVRNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dUTVAgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUElERklMRT15CitDT05GSUdfRkVBVFVSRV9TVUlEPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CisjIENPTkZJR19GRUFUVVJFX0hBVkVfUlBDIGlzIG5vdCBzZXQKKworIworIyBCdWlsZCBPcHRpb25zCisjCisjIENPTkZJR19TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfUElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JVSUxEX0xJQkJVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkRJVklEVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1ggaXMgbm90IHNldAorQ09ORklHX0xGUz15CitDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYPSIiCitDT05GSUdfRVhUUkFfQ0ZMQUdTPSIiCisKKyMKKyMgRGVidWdnaW5nIE9wdGlvbnMKKyMKKyMgQ09ORklHX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFU1NJTUlaRSBpcyBub3Qgc2V0CisjIENPTkZJR19XRVJST1IgaXMgbm90IHNldAorQ09ORklHX05PX0RFQlVHX0xJQj15CisjIENPTkZJR19ETUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGRU5DRSBpcyBub3Qgc2V0CisKKyMKKyMgSW5zdGFsbGF0aW9uIE9wdGlvbnMgKCJtYWtlIGluc3RhbGwiIGJlaGF2aW9yKQorIworQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworIyBDT05GSUdfRkVBVFVSRV9TWVNURU1EIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1JUTUlOTUFYPXkKK0NPTkZJR19QQVNTV09SRF9NSU5MRU49NgorQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEPTIKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKKyMgQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VTRV9URVJNSU9TPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkc9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOPTEwMjQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19WSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlk9MjU1CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZPXkKK0NPTkZJR19GRUFUVVJFX1RBQl9DT01QTEVUSU9OPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVD15CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUD15CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTQKK0NPTkZJR19GRUFUVVJFX1NLSVBfUk9PVEZTPXkKKyMgQ09ORklHX01PTk9UT05JQ19TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19JT0NUTF9IRVgyU1RSX0VSUk9SPXkKK0NPTkZJR19GRUFUVVJFX0hXSUI9eQorCisjCisjIEFwcGxldHMKKyMKKworIworIyBBcmNoaXZhbCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1haPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0xaTUE9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfQloyPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0daPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWiBpcyBub3Qgc2V0CisjIENPTkZJR19BUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CitDT05GSUdfRkVBVFVSRV9DUElPX089eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19QPXkKKyMgQ09ORklHX0RQS0cgaXMgbm90IHNldAorIyBDT05GSUdfRFBLR19ERUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CitDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTFpPUD15CisjIENPTkZJR19MWk9QX0NPTVBSX0hJR0ggaXMgbm90IHNldAorQ09ORklHX1JQTTJDUElPPXkKK0NPTkZJR19SUE09eQorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9BVVRPREVURUNUPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9GUk9NPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQ9eQorQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19VTkNPTVBSRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19VTkxaTUE9eQorQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUPXkKK0NPTkZJR19MWk1BPXkKK0NPTkZJR19VTlhaPXkKK0NPTkZJR19YWj15CitDT05GSUdfVU5aSVA9eQorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKK0NPTkZJR19DQVQ9eQorQ09ORklHX0RBVEU9eQorQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQ9eQorIyBDT05GSUdfRkVBVFVSRV9EQVRFX05BTk8gaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfREFURV9DT01QQVQ9eQorQ09ORklHX0lEPXkKK0NPTkZJR19HUk9VUFM9eQorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorQ09ORklHX0JBU0U2ND15CitDT05GSUdfQ0FMPXkKK0NPTkZJR19DQVRWPXkKK0NPTkZJR19DSEdSUD15CitDT05GSUdfQ0hNT0Q9eQorQ09ORklHX0NIT1dOPXkKK0NPTkZJR19GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUz15CitDT05GSUdfQ0hST09UPXkKK0NPTkZJR19DS1NVTT15CitDT05GSUdfQ09NTT15CitDT05GSUdfQ1A9eQorQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TPXkKK0NPTkZJR19DVVQ9eQorQ09ORklHX0REPXkKK0NPTkZJR19GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORz15CitDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORT15CitDT05GSUdfRkVBVFVSRV9ERF9JQlNfT0JTPXkKK0NPTkZJR19ERj15CitDT05GSUdfRkVBVFVSRV9ERl9GQU5DWT15CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CisjIENPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLIGlzIG5vdCBzZXQKK0NPTkZJR19FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE89eQorQ09ORklHX0VOVj15CitDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQUj15CitDT05GSUdfRVhQUl9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZBTFNFPXkKK0NPTkZJR19GT0xEPXkKK0NPTkZJR19GU1lOQz15CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKK0NPTkZJR19IT1NUSUQ9eQorQ09ORklHX0lOU1RBTEw9eQorQ09ORklHX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlM9eQorQ09ORklHX0xOPXkKK0NPTkZJR19MT0dOQU1FPXkKK0NPTkZJR19MUz15CitDT05GSUdfRkVBVFVSRV9MU19GSUxFVFlQRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1M9eQorQ09ORklHX0ZFQVRVUkVfTFNfUkVDVVJTSVZFPXkKK0NPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUz15CitDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1VTRVJOQU1FPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQ9eQorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorQ09ORklHX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19NS0ZJRk89eQorQ09ORklHX01LTk9EPXkKK0NPTkZJR19NVj15CitDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlM9eQorQ09ORklHX05JQ0U9eQorQ09ORklHX05PSFVQPXkKK0NPTkZJR19PRD15CitDT05GSUdfUFJJTlRFTlY9eQorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorQ09ORklHX1JFQUxQQVRIPXkKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorQ09ORklHX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19TRVE9eQorQ09ORklHX1NIQTFTVU09eQorQ09ORklHX1NIQTI1NlNVTT15CitDT05GSUdfU0hBNTEyU1VNPXkKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUD15CitDT05GSUdfU09SVD15CitDT05GSUdfRkVBVFVSRV9TT1JUX0JJRz15CitDT05GSUdfU1BMSVQ9eQorQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1k9eQorIyBDT05GSUdfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVRfRk9STUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TVFRZPXkKK0NPTkZJR19TVU09eQorQ09ORklHX1NZTkM9eQorQ09ORklHX1RBQz15CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVFJVRT15CitDT05GSUdfVFRZPXkKK0NPTkZJR19VTkFNRT15CitDT05GSUdfVU5FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19VTklRPXkKK0NPTkZJR19VU0xFRVA9eQorQ09ORklHX1VVREVDT0RFPXkKK0NPTkZJR19VVUVOQ09ERT15CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorIyBDT05GSUdfV0hPIGlzIG5vdCBzZXQKK0NPTkZJR19XSE9BTUk9eQorQ09ORklHX1lFUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGNwIGFuZCBtdgorIworQ09ORklHX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbHMsIG1vcmUgYW5kIHRlbG5ldAorIworQ09ORklHX0ZFQVRVUkVfQVVUT1dJRFRIPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgZGYsIGR1LCBscworIworQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEU9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBtZDVzdW0sIHNoYTFzdW0sIHNoYTI1NnN1bSwgc2hhNTEyc3VtCisjCitDT05GSUdfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0s9eQorCisjCisjIENvbnNvbGUgVXRpbGl0aWVzCisjCisjIENPTkZJR19DSFZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZHQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfQ0xFQVI9eQorIyBDT05GSUdfREVBTExPQ1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBLTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tCRF9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURLTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX09QRU5WVCBpcyBub3Qgc2V0CitDT05GSUdfUkVTRVQ9eQorQ09ORklHX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9SRVNJWkVfUFJJTlQ9eQorIyBDT05GSUdfU0VUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSPSIiCisjIENPTkZJR19TRVRLRVlDT0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRMT0dDT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIT1dLRVkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKK0NPTkZJR19SVU5fUEFSVFM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1k9eQorQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUz15CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19QQVRDSD15CitDT05GSUdfVkk9eQorQ09ORklHX0ZFQVRVUkVfVklfTUFYX0xFTj00MDk2CisjIENPTkZJR19GRUFUVVJFX1ZJXzhCSVQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfQ09MT049eQorQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUks9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIPXkKKyMgQ09ORklHX0ZFQVRVUkVfVklfUkVHRVhfU0VBUkNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQ9eQorQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFk9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUz15CitDT05GSUdfRkVBVFVSRV9WSV9TRVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SPXkKK0NPTkZJR19BV0s9eQorQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk09eQorQ09ORklHX0NNUD15CitDT05GSUdfRElGRj15CitDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9ESUZGX0RJUj15CitDT05GSUdfRUQ9eQorQ09ORklHX1NFRD15CitDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDPXkKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworQ09ORklHX0ZJTkQ9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUklOVDA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX01NSU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9QRVJNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1hERVY9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NQVhERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9OT1Q9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfU0laRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfREVMRVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1JFR0VYPXkKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1M9eQorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworIyBDT05GSUdfQk9PVENIQVJURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQkxPQVRFRF9IRUFERVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0NPTkZJR19GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DQUxMX1RFTElOSVQgaXMgbm90IHNldAorQ09ORklHX1RFTElOSVRfUEFUSD0iIgorIyBDT05GSUdfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfS0lMTF9SRU1PVkVEIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0tJTExfREVMQVk9MAorIyBDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9TWVNMT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FWFRSQV9RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUX1RFUk1JTkFMX1RZUEU9IiIKK0NPTkZJR19NRVNHPXkKK0NPTkZJR19GRUFUVVJFX01FU0dfRU5BQkxFX09OTFlfR1JPVVA9eQorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCitDT05GSUdfQUREX1NIRUxMPXkKK0NPTkZJR19SRU1PVkVfU0hFTEw9eQorQ09ORklHX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUz15CitDT05GSUdfVVNFX0JCX1BXRF9HUlA9eQorQ09ORklHX1VTRV9CQl9TSEFET1c9eQorQ09ORklHX1VTRV9CQl9DUllQVD15CitDT05GSUdfVVNFX0JCX0NSWVBUX1NIQT15CitDT05GSUdfQUREVVNFUj15CitDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUz15CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTIGlzIG5vdCBzZXQKK0NPTkZJR19GSVJTVF9TWVNURU1fSUQ9MTAwCitDT05GSUdfTEFTVF9TWVNURU1fSUQ9OTk5CitDT05GSUdfQURER1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfQURER1JPVVBfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVA9eQorQ09ORklHX0RFTFVTRVI9eQorQ09ORklHX0RFTEdST1VQPXkKK0NPTkZJR19GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVA9eQorIyBDT05GSUdfR0VUVFkgaXMgbm90IHNldAorQ09ORklHX0xPR0lOPXkKKyMgQ09ORklHX1BBTSBpcyBub3Qgc2V0CitDT05GSUdfTE9HSU5fU0NSSVBUUz15CitDT05GSUdfRkVBVFVSRV9OT0xPR0lOPXkKK0NPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWT15CitDT05GSUdfUEFTU1dEPXkKK0NPTkZJR19GRUFUVVJFX1BBU1NXRF9XRUFLX0NIRUNLPXkKK0NPTkZJR19DUllQVFBXPXkKK0NPTkZJR19DSFBBU1NXRD15CitDT05GSUdfU1U9eQorQ09ORklHX0ZFQVRVUkVfU1VfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX1NVX0NIRUNLU19TSEVMTFM9eQorQ09ORklHX1NVTE9HSU49eQorQ09ORklHX1ZMT0NLPXkKKworIworIyBMaW51eCBFeHQyIEZTIFByb2dzCisjCitDT05GSUdfQ0hBVFRSPXkKKyMgQ09ORklHX0ZTQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTFNBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkUyRlMgaXMgbm90IHNldAorCisjCisjIExpbnV4IE1vZHVsZSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX01PRElORk8gaXMgbm90IHNldAorIyBDT05GSUdfTU9EUFJPQkVfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfUk1NT0QgaXMgbm90IHNldAorIyBDT05GSUdfTFNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBNT0QgaXMgbm90IHNldAorCisjCisjIE9wdGlvbnMgY29tbW9uIHRvIG11bHRpcGxlIG1vZHV0aWxzCisjCisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUj0iIgorQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEU9IiIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19CTE9DS0RFViBpcyBub3Qgc2V0CitDT05GSUdfUkVWPXkKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkxLSURfVFlQRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUVTRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GQlNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZCU0VUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREUgaXMgbm90IHNldAorIyBDT05GSUdfRkRGTFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GREZPUk1BVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVU5fTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUFRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorQ09ORklHX0ZMT0NLPXkKKyMgQ09ORklHX0ZSRUVSQU1ESVNLIGlzIG5vdCBzZXQKK0NPTkZJR19GU0NLX01JTklYPXkKKyMgQ09ORklHX01LRlNfRVhUMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX01JTklYIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01JTklYMj15CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1ZGQVQgaXMgbm90IHNldAorQ09ORklHX0dFVE9QVD15CitDT05GSUdfRkVBVFVSRV9HRVRPUFRfTE9ORz15CitDT05GSUdfSEVYRFVNUD15CitDT05GSUdfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0U9eQorQ09ORklHX0hEPXkKKyMgQ09ORklHX0hXQ0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFMgaXMgbm90IHNldAorQ09ORklHX0lQQ1JNPXkKKyMgQ09ORklHX0lQQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTE9TRVRVUCBpcyBub3Qgc2V0CisjIENPTkZJR19MU1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19MU1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUgaXMgbm90IHNldAorQ09ORklHX01LU1dBUD15CitDT05GSUdfRkVBVFVSRV9NS1NXQVBfVVVJRD15CitDT05GSUdfTU9SRT15CisjIENPTkZJR19NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUIgaXMgbm90IHNldAorIyBDT05GSUdfUElWT1RfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19SREFURSBpcyBub3Qgc2V0CitDT05GSUdfUkRFVj15CitDT05GSUdfUkVBRFBST0ZJTEU9eQorIyBDT05GSUdfUlRDV0FLRSBpcyBub3Qgc2V0CitDT05GSUdfU0NSSVBUPXkKK0NPTkZJR19TQ1JJUFRSRVBMQVk9eQorIyBDT05GSUdfU0VUQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQT05PRkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXSVRDSF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VNT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VNT1VOVF9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVk9MVU1FSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9FWFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfWEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9VREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfT0NGUzIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCisjIENPTkZJR19DT05TUFkgaXMgbm90IHNldAorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkREVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSU1LVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJNVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJTVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVVQREFURVZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BREpUSU1FWCBpcyBub3Qgc2V0CisjIENPTkZJR19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX0JCQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRVAgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRPTAKK0NPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TPTAKK0NPTkZJR19DSEFUPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTj15CitDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVD15CitDT05GSUdfQ0hSVD15CitDT05GSUdfQ1JPTkQ9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorQ09ORklHX0RDPXkKK0NPTkZJR19GRUFUVVJFX0RDX0xJQk09eQorIyBDT05GSUdfREVWRlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9NT0RMT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9GR19OUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFVkZTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZNRU09eQorIyBDT05GSUdfRUpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FSkVDVF9TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU1BMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9VTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfRVJBU0VBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSU9OSUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRllEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorIyBDT05GSUdfSERQQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfTUFLRURFVlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19MRUFGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEUgaXMgbm90IHNldAorQ09ORklHX01BTj15CisjIENPTkZJR19NSUNST0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKK0NPTkZJR19NVD15CisjIENPTkZJR19SQUlEQVVUT1JVTiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JYIGlzIG5vdCBzZXQKK0NPTkZJR19TRVRTSUQ9eQorQ09ORklHX1NUUklOR1M9eQorIyBDT05GSUdfVEFTS1NFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBU0tTRVRfRkFOQ1kgaXMgbm90IHNldAorQ09ORklHX1RJTUU9eQorQ09ORklHX1RJTUVPVVQ9eQorQ09ORklHX1RUWVNJWkU9eQorQ09ORklHX1ZPTE5BTUU9eQorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19OQkRDTElFTlQgaXMgbm90IHNldAorQ09ORklHX05DPXkKK0NPTkZJR19OQ19TRVJWRVI9eQorQ09ORklHX05DX0VYVFJBPXkKKyMgQ09ORklHX05DXzExMF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkcgaXMgbm90IHNldAorQ09ORklHX1dIT0lTPXkKK0NPTkZJR19GRUFUVVJFX0lQVjY9eQorIyBDT05GSUdfRkVBVFVSRV9VTklYX0xPQ0FMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1M9eQorIyBDT05GSUdfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlAgaXMgbm90IHNldAorIyBDT05GSUdfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XIGlzIG5vdCBzZXQKK0NPTkZJR19ETlNEPXkKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorQ09ORklHX0ZBS0VJREVOVEQ9eQorQ09ORklHX0ZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZUUERfQUNDRVBUX0JST0tFTl9MSVNUPXkKK0NPTkZJR19GVFBHRVQ9eQorQ09ORklHX0ZUUFBVVD15CitDT05GSUdfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19IT1NUTkFNRT15CitDT05GSUdfSFRUUEQ9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVFVJRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1PXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NHST15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0daSVA9eQorIyBDT05GSUdfSUZDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMgaXMgbm90IHNldAorIyBDT05GSUdfSUZFTlNMQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGUExVR0QgaXMgbm90IHNldAorIyBDT05GSUdfSUZVUERPV04gaXMgbm90IHNldAorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iIgorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQ9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUU9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUU9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU49eQorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBBRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUlVMRSBpcyBub3Qgc2V0CitDT05GSUdfSVBDQUxDPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19GQU5DWT15CitDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX05FVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1dJREUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRyBpcyBub3Qgc2V0CisjIENPTkZJR19OU0xPT0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19OVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTlRQRF9TRVJWRVIgaXMgbm90IHNldAorQ09ORklHX1BTQ0FOPXkKKyMgQ09ORklHX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMQVRUQUNIIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BTVkQ9eQorQ09ORklHX1RFTE5FVD15CitDT05GSUdfRkVBVFVSRV9URUxORVRfVFRZUEU9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTj15CitDT05GSUdfVEVMTkVURD15CitDT05GSUdfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkU9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUPXkKK0NPTkZJR19URlRQPXkKK0NPTkZJR19URlRQRD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIHRmdHAvdGZ0cGQKKyMKK0NPTkZJR19GRUFUVVJFX1RGVFBfR0VUPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfUFVUPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSPXkKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5DVEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UVU5DVExfVUcgaXMgbm90IHNldAorIyBDT05GSUdfVURIQ1BEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BSRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QTEVBU0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQRF9CQVNFX0lQX09OX01BQyBpcyBub3Qgc2V0CitDT05GSUdfREhDUERfTEVBU0VTX0ZJTEU9IiIKKyMgQ09ORklHX1VESENQQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VREhDUF9ERUJVRz0wCisjIENPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF84MDIxUSBpcyBub3Qgc2V0CitDT05GSUdfVURIQ1BDX0RFRkFVTFRfU0NSSVBUPSIiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTAKK0NPTkZJR19JRlVQRE9XTl9VREhDUENfQ01EX09QVElPTlM9IiIKK0NPTkZJR19VRFBTVkQ9eQorIyBDT05GSUdfVkNPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfV0dFVD15CitDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUj15CitDT05GSUdfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfVElNRU9VVD15CisjIENPTkZJR19aQ0lQIGlzIG5vdCBzZXQKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKK0NPTkZJR19MUEQ9eQorQ09ORklHX0xQUj15CitDT05GSUdfTFBRPXkKKworIworIyBNYWlsIFV0aWxpdGllcworIworQ09ORklHX01BS0VNSU1FPXkKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0idXMtYXNjaWkiCitDT05GSUdfUE9QTUFJTERJUj15CitDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZPXkKK0NPTkZJR19SRUZPUk1JTUU9eQorQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVD15CitDT05GSUdfU0VORE1BSUw9eQorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCitDT05GSUdfSU9TVEFUPXkKK0NPTkZJR19NUFNUQVQ9eQorQ09ORklHX05NRVRFUj15CisjIENPTkZJR19QTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19QU1RSRUU9eQorQ09ORklHX1BXRFg9eQorQ09ORklHX1NNRU1DQVA9eQorIyBDT05GSUdfRlJFRSBpcyBub3Qgc2V0CitDT05GSUdfRlVTRVI9eQorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKK0NPTkZJR19QR1JFUD15CitDT05GSUdfUElET0Y9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfU0lOR0xFPXkKK0NPTkZJR19GRUFUVVJFX1BJRE9GX09NSVQ9eQorQ09ORklHX1BLSUxMPXkKK0NPTkZJR19QUz15CitDT05GSUdfRkVBVFVSRV9QU19XSURFPXkKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlM9eQorIyBDT05GSUdfRkVBVFVSRV9QU19VTlVTVUFMX1NZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX1JFTklDRT15CitDT05GSUdfQkJfU1lTQ1RMPXkKK0NPTkZJR19UT1A9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9TTVBfQ1BVPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX1BST0NFU1M9eQorQ09ORklHX0ZFQVRVUkVfVE9QTUVNPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0hPV19USFJFQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VQVElNRSBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0g9eQorCisjCisjIFJ1bml0IFV0aWxpdGllcworIworQ09ORklHX1JVTlNWPXkKK0NPTkZJR19SVU5TVkRJUj15CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CitDT05GSUdfU1Y9eQorQ09ORklHX1NWX0RFRkFVTFRfU0VSVklDRV9ESVI9Ii92YXIvc2VydmljZSIKK0NPTkZJR19TVkxPR0Q9eQorQ09ORklHX0NIUFNUPXkKK0NPTkZJR19TRVRVSURHSUQ9eQorQ09ORklHX0VOVlVJREdJRD15CitDT05GSUdfRU5WRElSPXkKK0NPTkZJR19TT0ZUTElNSVQ9eQorIyBDT05GSUdfQ0hDT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfR0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfTE9BRF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUFUQ0hQQVRIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU1RPUkVDT04gaXMgbm90IHNldAorIyBDT05GSUdfUlVOQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVNUQVRVUyBpcyBub3Qgc2V0CisKKyMKKyMgU2hlbGxzCisjCitDT05GSUdfQVNIPXkKK0NPTkZJR19BU0hfQkFTSF9DT01QQVQ9eQorIyBDT05GSUdfQVNIX0lETEVfVElNRU9VVCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX0pPQl9DT05UUk9MPXkKK0NPTkZJR19BU0hfQUxJQVM9eQorQ09ORklHX0FTSF9HRVRPUFRTPXkKK0NPTkZJR19BU0hfQlVJTFRJTl9FQ0hPPXkKK0NPTkZJR19BU0hfQlVJTFRJTl9QUklOVEY9eQorQ09ORklHX0FTSF9CVUlMVElOX1RFU1Q9eQorQ09ORklHX0FTSF9DTURDTUQ9eQorIyBDT05GSUdfQVNIX01BSUwgaXMgbm90IHNldAorQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUPXkKK0NPTkZJR19BU0hfRVhQQU5EX1BSTVQ9eQorIyBDT05GSUdfQ1RUWUhBQ0sgaXMgbm90IHNldAorQ09ORklHX0hVU0g9eQorQ09ORklHX0hVU0hfQkFTSF9DT01QQVQ9eQorQ09ORklHX0hVU0hfQlJBQ0VfRVhQQU5TSU9OPXkKK0NPTkZJR19IVVNIX0hFTFA9eQorQ09ORklHX0hVU0hfSU5URVJBQ1RJVkU9eQorQ09ORklHX0hVU0hfU0FWRUhJU1RPUlk9eQorQ09ORklHX0hVU0hfSk9CPXkKK0NPTkZJR19IVVNIX1RJQ0s9eQorQ09ORklHX0hVU0hfSUY9eQorQ09ORklHX0hVU0hfTE9PUFM9eQorQ09ORklHX0hVU0hfQ0FTRT15CitDT05GSUdfSFVTSF9GVU5DVElPTlM9eQorQ09ORklHX0hVU0hfTE9DQUw9eQorQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQ9eQorQ09ORklHX0hVU0hfRVhQT1JUX049eQorQ09ORklHX0hVU0hfTU9ERV9YPXkKKyMgQ09ORklHX01TSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19BU0g9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JBU0hfSVNfTk9ORT15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQ9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0hJU1RGSUxFU0laRT15CisKKyMKKyMgU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfU1lTTE9HRD15CitDT05GSUdfRkVBVFVSRV9ST1RBVEVfTE9HRklMRT15CitDT05GSUdfRkVBVFVSRV9SRU1PVEVfTE9HPXkKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQPXkKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfQ0ZHPXkKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRT0yNTYKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRT0xNgorQ09ORklHX0xPR1JFQUQ9eQorQ09ORklHX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkc9eQorIyBDT05GSUdfS0xPR0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9LTE9HRF9LTE9HQ1RMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dHRVI9eQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uZmlncy9mcmVlYnNkX2RlZmNvbmZpZyBiL2J1c3lib3gtMS4xOS4zL2NvbmZpZ3MvZnJlZWJzZF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyOTg1YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvbmZpZ3MvZnJlZWJzZF9kZWZjb25maWcKQEAgLTAsMCArMSw5NzAgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgQnVzeWJveCB2ZXJzaW9uOiAxLjE4LjEKKyMgVHVlIERlYyAyMSAxOTo0Nzo0MCAyMDEwCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ERVNLVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVFJBX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfSU5DTFVERV9TVVN2Mj15CitDT05GSUdfVVNFX1BPUlRBQkxFX0NPREU9eQorIyBDT05GSUdfUExBVEZPUk1fTElOVVggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19VU0VfTUFMTE9DPXkKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19PTl9TVEFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fSU5fQlNTIGlzIG5vdCBzZXQKK0NPTkZJR19TSE9XX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX1ZFUkJPU0VfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfSU5TVEFMTEVSPXkKKyMgQ09ORklHX0lOU1RBTExfTk9fVVNSIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NBTEVfU1VQUE9SVD15CitDT05GSUdfVU5JQ09ERV9TVVBQT1JUPXkKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTYzCitDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVI9NzY3CisjIENPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX0JJRElfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX05FVVRSQUxfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4gaXMgbm90IHNldAorQ09ORklHX0xPTkdfT1BUUz15CitDT05GSUdfRkVBVFVSRV9ERVZQVFM9eQorIyBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dUTVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VVE1QIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1BJREZJTEU9eQorQ09ORklHX0ZFQVRVUkVfU1VJRD15CitDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJRz15CitDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVD15CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CisjIENPTkZJR19GRUFUVVJFX0hBVkVfUlBDIGlzIG5vdCBzZXQKKworIworIyBCdWlsZCBPcHRpb25zCisjCisjIENPTkZJR19TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfUElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JVSUxEX0xJQkJVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkRJVklEVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1ggaXMgbm90IHNldAorQ09ORklHX0xGUz15CitDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYPSIiCitDT05GSUdfRVhUUkFfQ0ZMQUdTPSIiCisKKyMKKyMgRGVidWdnaW5nIE9wdGlvbnMKKyMKKyMgQ09ORklHX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFU1NJTUlaRSBpcyBub3Qgc2V0CisjIENPTkZJR19XRVJST1IgaXMgbm90IHNldAorQ09ORklHX05PX0RFQlVHX0xJQj15CisjIENPTkZJR19ETUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGRU5DRSBpcyBub3Qgc2V0CisKKyMKKyMgSW5zdGFsbGF0aW9uIE9wdGlvbnMgKCJtYWtlIGluc3RhbGwiIGJlaGF2aW9yKQorIworQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQ9MgorQ09ORklHX0ZFQVRVUkVfRkFTVF9UT1A9eQorIyBDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1M9eQorQ09ORklHX0ZFQVRVUkVfRURJVElORz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MTAyNAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0zMAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RBQl9DT01QTEVUSU9OPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQPXkKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorIyBDT05GSUdfTU9OT1RPTklDX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1I9eQorQ09ORklHX0ZFQVRVUkVfSFdJQj15CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFo9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CitDT05GSUdfQVI9eQorQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVM9eQorQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFPXkKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CisjIENPTkZJR19GRUFUVVJFX0NQSU9fTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQSU9fUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUEtHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0dfREVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19HVU5aSVA9eQorQ09ORklHX0daSVA9eQorQ09ORklHX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlM9eQorQ09ORklHX0xaT1A9eQorIyBDT05GSUdfTFpPUF9DT01QUl9ISUdIIGlzIG5vdCBzZXQKK0NPTkZJR19SUE0yQ1BJTz15CitDT05GSUdfUlBNPXkKK0NPTkZJR19UQVI9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURT15CitDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVD15CitDT05GSUdfRkVBVFVSRV9UQVJfRlJPTT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9UT19DT01NQU5EPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CitDT05GSUdfVU5DT01QUkVTUz15CitDT05GSUdfVU5MWk1BPXkKK0NPTkZJR19GRUFUVVJFX0xaTUFfRkFTVD15CitDT05GSUdfTFpNQT15CitDT05GSUdfVU5YWj15CitDT05GSUdfWFo9eQorQ09ORklHX1VOWklQPXkKKworIworIyBDb3JldXRpbHMKKyMKK0NPTkZJR19CQVNFTkFNRT15CitDT05GSUdfQ0FUPXkKKyMgQ09ORklHX0RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19URVNUPXkKK0NPTkZJR19GRUFUVVJFX1RFU1RfNjQ9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorIyBDT05GSUdfQkFTRTY0IGlzIG5vdCBzZXQKK0NPTkZJR19DQUw9eQorQ09ORklHX0NBVFY9eQorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TPXkKK0NPTkZJR19DSFJPT1Q9eQorQ09ORklHX0NLU1VNPXkKK0NPTkZJR19DT01NPXkKK0NPTkZJR19DUD15CitDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlM9eQorQ09ORklHX0NVVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorIyBDT05GSUdfREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERl9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQQU5EPXkKK0NPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlM9eQorQ09ORklHX0VYUFI9eQorQ09ORklHX0VYUFJfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GQUxTRT15CitDT05GSUdfRk9MRD15CitDT05GSUdfRlNZTkM9eQorQ09ORklHX0hFQUQ9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfSEVBRD15CitDT05GSUdfSE9TVElEPXkKK0NPTkZJR19JRD15CitDT05GSUdfSU5TVEFMTD15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTEVOR1RIPXkKK0NPTkZJR19MTj15CitDT05GSUdfTE9HTkFNRT15CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUj15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUl9JU19ERUZBVUxUPXkKK0NPTkZJR19NRDVTVU09eQorQ09ORklHX01LRElSPXkKK0NPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTUtGSUZPPXkKKyMgQ09ORklHX01LTk9EIGlzIG5vdCBzZXQKK0NPTkZJR19NVj15CitDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlM9eQorQ09ORklHX05JQ0U9eQorQ09ORklHX05PSFVQPXkKK0NPTkZJR19PRD15CitDT05GSUdfUFJJTlRFTlY9eQorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorQ09ORklHX1JFQUxQQVRIPXkKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorIyBDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKK0NPTkZJR19TSEE1MTJTVU09eQorQ09ORklHX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQPXkKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CisjIENPTkZJR19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQgaXMgbm90IHNldAorIyBDT05GSUdfU1RUWSBpcyBub3Qgc2V0CitDT05GSUdfU1VNPXkKK0NPTkZJR19TWU5DPXkKKyMgQ09ORklHX1RBQyBpcyBub3Qgc2V0CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSVUU9eQorQ09ORklHX1RUWT15CitDT05GSUdfVU5BTUU9eQorQ09ORklHX1VORVhQQU5EPXkKK0NPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfVU5JUT15CitDT05GSUdfVVNMRUVQPXkKK0NPTkZJR19VVURFQ09ERT15CitDT05GSUdfVVVFTkNPREU9eQorQ09ORklHX1dDPXkKK0NPTkZJR19GRUFUVVJFX1dDX0xBUkdFPXkKKyMgQ09ORklHX1dITyBpcyBub3Qgc2V0CitDT05GSUdfV0hPQU1JPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworIyBDT05GSUdfQ0hWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GR0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0NMRUFSPXkKKyMgQ09ORklHX0RFQUxMT0NWVCBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QS01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19LQkRfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FERk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FES01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19PUEVOVlQgaXMgbm90IHNldAorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKKyMgQ09ORklHX1NFVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUj0iIgorIyBDT05GSUdfU0VUS0VZQ09ERVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VUTE9HQ09OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSE9XS0VZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUFNGMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1JBVyBpcyBub3Qgc2V0CisKKyMKKyMgRGViaWFuIFV0aWxpdGllcworIworQ09ORklHX01LVEVNUD15CitDT05GSUdfUElQRV9QUk9HUkVTUz15CitDT05GSUdfUlVOX1BBUlRTPXkKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZPXkKKyMgQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1dISUNIPXkKKworIworIyBFZGl0b3JzCisjCitDT05GSUdfUEFUQ0g9eQorQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19WST15CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTEwMjQKK0NPTkZJR19GRUFUVVJFX1ZJXzhCSVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfQ09MT049eQorQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUks9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQ9eQorQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFk9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUz15CitDT05GSUdfRkVBVFVSRV9WSV9TRVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVg9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0NPTlRFWFQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRklORF9MSU5LUz15CitDT05GSUdfR1JFUD15CitDT05GSUdfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9DT05URVhUPXkKK0NPTkZJR19YQVJHUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTj15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQ9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk09eQorCisjCisjIEluaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19CT09UQ0hBUlREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9CTE9BVEVEX0hFQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQ09ORklHX0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfSEFMVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCisjIENPTkZJR19JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCisjIENPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0lOSVRfVEVSTUlOQUxfVFlQRT0iIgorIyBDT05GSUdfTUVTRyBpcyBub3Qgc2V0CisKKyMKKyMgTG9naW4vUGFzc3dvcmQgTWFuYWdlbWVudCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FERF9TSEVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRU1PVkVfU0hFTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VfQkJfUFdEX0dSUD15CisjIENPTkZJR19VU0VfQkJfU0hBRE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9DUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfQ1JZUFRfU0hBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FERFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTIGlzIG5vdCBzZXQKK0NPTkZJR19GSVJTVF9TWVNURU1fSUQ9MTAwCitDT05GSUdfTEFTVF9TWVNURU1fSUQ9OTk5CitDT05GSUdfQURER1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfQURER1JPVVBfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVA9eQorIyBDT05GSUdfREVMVVNFUiBpcyBub3Qgc2V0CitDT05GSUdfREVMR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUD15CisjIENPTkZJR19HRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQU0gaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU5fU0NSSVBUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRUNVUkVUVFkgaXMgbm90IHNldAorIyBDT05GSUdfUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRQVyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBBU1NXRCBpcyBub3Qgc2V0CisjIENPTkZJR19TVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVX0NIRUNLU19TSEVMTFMgaXMgbm90IHNldAorIyBDT05GSUdfU1VMT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworQ09ORklHX0NIQVRUUj15CisjIENPTkZJR19GU0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5FMkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRElORk8gaXMgbm90IHNldAorIyBDT05GSUdfTU9EUFJPQkVfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfUk1NT0QgaXMgbm90IHNldAorIyBDT05GSUdfTFNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBNT0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9UUllfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9IiIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSIiCisKKyMKKyMgTGludXggU3lzdGVtIFV0aWxpdGllcworIworIyBDT05GSUdfQkxPQ0tERVYgaXMgbm90IHNldAorQ09ORklHX1JFVj15CisjIENPTkZJR19BQ1BJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FDUElEX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtJRCBpcyBub3Qgc2V0CisjIENPTkZJR19ETUVTRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GQlNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZCU0VUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREUgaXMgbm90IHNldAorIyBDT05GSUdfRkRGTFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GREZPUk1BVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRElTSyBpcyBub3Qgc2V0CitDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUz15CisjIENPTkZJR19GRUFUVVJFX0ZESVNLX1dSSVRBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUlYX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0dJX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VOX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfT1NGX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1BUX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQgaXMgbm90IHNldAorIyBDT05GSUdfRklOREZTIGlzIG5vdCBzZXQKK0NPTkZJR19GTE9DSz15CisjIENPTkZJR19GUkVFUkFNRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19GU0NLX01JTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfRVhUMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX01JTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUlOSVgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfUkVJU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfVkZBVCBpcyBub3Qgc2V0CitDT05GSUdfR0VUT1BUPXkKK0NPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HPXkKK0NPTkZJR19IRVhEVU1QPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFIGlzIG5vdCBzZXQKK0NPTkZJR19IRD15CisjIENPTkZJR19IV0NMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTE9TRVRVUCBpcyBub3Qgc2V0CitDT05GSUdfTFNQQ0k9eQorQ09ORklHX0xTVVNCPXkKKyMgQ09ORklHX01ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0NPTkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfTE9BRF9GSVJNV0FSRSBpcyBub3Qgc2V0CisjIENPTkZJR19NS1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NS1NXQVBfVVVJRCBpcyBub3Qgc2V0CitDT05GSUdfTU9SRT15CisjIENPTkZJR19NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUIgaXMgbm90IHNldAorIyBDT05GSUdfUElWT1RfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19SREFURSBpcyBub3Qgc2V0CisjIENPTkZJR19SREVWIGlzIG5vdCBzZXQKK0NPTkZJR19SRUFEUFJPRklMRT15CisjIENPTkZJR19SVENXQUtFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDUklQVCBpcyBub3Qgc2V0CitDT05GSUdfU0NSSVBUUkVQTEFZPXkKKyMgQ09ORklHX1NFVEFSQ0ggaXMgbm90IHNldAorIyBDT05GSUdfU1dBUE9OT0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1dBUE9OX1BSSSBpcyBub3Qgc2V0CisjIENPTkZJR19TV0lUQ0hfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZPTFVNRUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0ZBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0hGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX05URlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVURGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTFVLUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU1lTViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX09DRlMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhSQUlEIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFV0aWxpdGllcworIworIyBDT05GSUdfQ09OU1BZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkRXUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU5ERFVNUCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FESlRJTUVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JCQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfQkVFUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CRUVQX0ZSRVE9MAorQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVM9MAorIyBDT05GSUdfQ0hBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQgaXMgbm90IHNldAorQ09ORklHX0NIUlQ9eQorIyBDT05GSUdfQ1JPTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVI9Ii92YXIvc3Bvb2wvY3JvbiIKK0NPTkZJR19DUk9OVEFCPXkKK0NPTkZJR19EQz15CitDT05GSUdfRkVBVFVSRV9EQ19MSUJNPXkKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRUpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FSkVDVF9TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU1BMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9VTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfRVJBU0VBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSU9OSUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRllEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19XSU5DSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfREFTSENNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVMgaXMgbm90IHNldAorIyBDT05GSUdfSERQQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfTUFLRURFVlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19MRUFGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfTUFOIGlzIG5vdCBzZXQKK0NPTkZJR19NSUNST0NPTT15CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBSURBVVRPUlVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQURBSEVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfUlVOTEVWRUwgaXMgbm90IHNldAorIyBDT05GSUdfUlggaXMgbm90IHNldAorQ09ORklHX1NFVFNJRD15CitDT05GSUdfU1RSSU5HUz15CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19USU1FT1VUPXkKK0NPTkZJR19UVFlTSVpFPXkKK0NPTkZJR19WT0xOQU1FPXkKKyMgQ09ORklHX1dBTEwgaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcgVXRpbGl0aWVzCisjCisjIENPTkZJR19OQkRDTElFTlQgaXMgbm90IHNldAorQ09ORklHX05DPXkKKyMgQ09ORklHX05DX1NFUlZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19OQ19FWFRSQSBpcyBub3Qgc2V0CisjIENPTkZJR19OQ18xMTBfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlMgaXMgbm90IHNldAorIyBDT05GSUdfQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19CUkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVyBpcyBub3Qgc2V0CitDT05GSUdfRE5TRD15CisjIENPTkZJR19FVEhFUl9XQUtFIGlzIG5vdCBzZXQKK0NPTkZJR19GQUtFSURFTlREPXkKK0NPTkZJR19GVFBEPXkKK0NPTkZJR19GRUFUVVJFX0ZUUF9XUklURT15CitDT05GSUdfRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVD15CitDT05GSUdfRlRQR0VUPXkKK0NPTkZJR19GVFBQVVQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUz15CitDT05GSUdfSE9TVE5BTUU9eQorQ09ORklHX0hUVFBEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1JBTkdFUz15CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1VTRV9TRU5ERklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1NFVFVJRCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1PXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NHST15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0daSVA9eQorIyBDT05GSUdfSUZDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMgaXMgbm90IHNldAorIyBDT05GSUdfSUZFTlNMQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGUExVR0QgaXMgbm90IHNldAorIyBDT05GSUdfSUZVUERPV04gaXMgbm90IHNldAorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iIgorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBBRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUlVMRSBpcyBub3Qgc2V0CitDT05GSUdfSVBDQUxDPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19GQU5DWT15CitDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9QUkcgaXMgbm90IHNldAorIyBDT05GSUdfTlNMT09LVVAgaXMgbm90IHNldAorIyBDT05GSUdfTlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJTkcgaXMgbm90IHNldAorIyBDT05GSUdfUElORzYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQU5DWV9QSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19QU0NBTj15CisjIENPTkZJR19ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19TTEFUVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BTVkQgaXMgbm90IHNldAorQ09ORklHX1RFTE5FVD15CitDT05GSUdfRkVBVFVSRV9URUxORVRfVFRZUEU9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTj15CitDT05GSUdfVEVMTkVURD15CitDT05GSUdfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkU9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUPXkKK0NPTkZJR19URlRQPXkKK0NPTkZJR19URlRQRD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIHRmdHAvdGZ0cGQKKyMKK0NPTkZJR19GRUFUVVJFX1RGVFBfR0VUPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfUFVUPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSPXkKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5DVEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UVU5DVExfVUcgaXMgbm90IHNldAorIyBDT05GSUdfVURIQ1BEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BSRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QTEVBU0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWSBpcyBub3Qgc2V0CitDT05GSUdfREhDUERfTEVBU0VTX0ZJTEU9IiIKKyMgQ09ORklHX1VESENQQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VREhDUF9ERUJVRz0wCisjIENPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTcgaXMgbm90IHNldAorQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVD0iIgorQ09ORklHX1VESENQQ19TTEFDS19GT1JfQlVHR1lfU0VSVkVSUz0wCitDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TPSIiCisjIENPTkZJR19VRFBTVkQgaXMgbm90IHNldAorIyBDT05GSUdfVkNPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfV0dFVD15CitDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUj15CitDT05GSUdfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfVElNRU9VVD15CisjIENPTkZJR19aQ0lQIGlzIG5vdCBzZXQKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0xQRCBpcyBub3Qgc2V0CitDT05GSUdfTFBSPXkKK0NPTkZJR19MUFE9eQorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCisjIENPTkZJR19NQUtFTUlNRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQ9IiIKKyMgQ09ORklHX1BPUE1BSUxESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFRk9STUlNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VORE1BSUwgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCitDT05GSUdfSU9TVEFUPXkKK0NPTkZJR19NUFNUQVQ9eQorQ09ORklHX1BNQVA9eQorQ09ORklHX1BPV0VSVE9QPXkKK0NPTkZJR19TTUVNQ0FQPXkKKyMgQ09ORklHX0ZSRUUgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRVIgaXMgbm90IHNldAorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKKyMgQ09ORklHX05NRVRFUiBpcyBub3Qgc2V0CitDT05GSUdfUEdSRVA9eQorIyBDT05GSUdfUElET0YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QSURPRl9PTUlUIGlzIG5vdCBzZXQKK0NPTkZJR19QS0lMTD15CitDT05GSUdfUFM9eQorQ09ORklHX0ZFQVRVUkVfUFNfV0lERT15CisjIENPTkZJR19GRUFUVVJFX1BTX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19VTlVTVUFMX1NZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX1JFTklDRT15CitDT05GSUdfQkJfU1lTQ1RMPXkKKyMgQ09ORklHX1RPUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BNRU0gaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hPV19USFJFQURTPXkKKyMgQ09ORklHX1VQVElNRSBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0g9eQorCisjCisjIFJ1bml0IFV0aWxpdGllcworIworIyBDT05GSUdfUlVOU1YgaXMgbm90IHNldAorIyBDT05GSUdfUlVOU1ZESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5TVkRJUl9MT0cgaXMgbm90IHNldAorIyBDT05GSUdfU1YgaXMgbm90IHNldAorQ09ORklHX1NWX0RFRkFVTFRfU0VSVklDRV9ESVI9IiIKKyMgQ09ORklHX1NWTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WVUlER0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0ZUTElNSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ0hDT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfR0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfTE9BRF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUFUQ0hQQVRIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU1RPUkVDT04gaXMgbm90IHNldAorIyBDT05GSUdfUlVOQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVNUQVRVUyBpcyBub3Qgc2V0CisKKyMKKyMgU2hlbGxzCisjCitDT05GSUdfQVNIPXkKKyMgQ09ORklHX0FTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfSk9CX0NPTlRST0wgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9HRVRPUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fUFJJTlRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0NNRENNRCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9FWFBBTkRfUFJNVCBpcyBub3Qgc2V0CisjIENPTkZJR19DVFRZSEFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CUkFDRV9FWFBBTlNJT04gaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9IRUxQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSU5URVJBQ1RJVkUgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9TQVZFSElTVE9SWSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0pPQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JRiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0xPT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQ0FTRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0ZVTkNUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0xPQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9FWFBPUlRfTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX01PREVfWCBpcyBub3Qgc2V0CisjIENPTkZJR19NU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hfSVNfQVNIPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfSFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CQVNIX0lTX05PTkU9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVD15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUXzY0PXkKKyMgQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0RVUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TWVNMT0dEX1JFQURfQlVGRkVSX1NJWkU9MjU2CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkU9MTYKK0NPTkZJR19MT0dSRUFEPXkKK0NPTkZJR19GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HPXkKKyMgQ09ORklHX0tMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfS0xPR0RfS0xPR0NUTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HR0VSPXkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvQ29uZmlnLnNyYyBiL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjU3MDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMTc2IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJDb25zb2xlIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBDSFZUCisJYm9vbCAiY2h2dCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byBjaGFuZ2UgdG8gYW5vdGhlciB0ZXJtaW5hbC4KKwkgIEV4YW1wbGU6IGNodnQgNCAoY2hhbmdlIHRvIHRlcm1pbmFsIC9kZXYvdHR5NCkKKworY29uZmlnIEZHQ09OU09MRQorCWJvb2wgImZnY29uc29sZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gcHJpbnRzIGFjdGl2ZSAoZm9yZWdyb3VuZCkgY29uc29sZSBudW1iZXIuCisKK2NvbmZpZyBDTEVBUgorCWJvb2wgImNsZWFyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBjbGVhcnMgdGhlIHRlcm1pbmFsIHNjcmVlbi4KKworY29uZmlnIERFQUxMT0NWVAorCWJvb2wgImRlYWxsb2N2dCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gZGVhbGxvY2F0ZXMgdW51c2VkIHZpcnR1YWwgY29uc29sZXMuCisKK2NvbmZpZyBEVU1QS01BUAorCWJvb2wgImR1bXBrbWFwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBkdW1wcyB0aGUga2VybmVsJ3Mga2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGUgdG8KKwkgIHN0ZG91dCwgaW4gYmluYXJ5IGZvcm1hdC4gWW91IGNhbiB0aGVuIHVzZSBsb2Fka21hcCB0byBsb2FkIGl0LgorCitjb25maWcgS0JEX01PREUKKwlib29sICJrYmRfbW9kZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gcmVwb3J0cyBhbmQgc2V0cyBrZXlib2FyZCBtb2RlLgorCitjb25maWcgTE9BREZPTlQKKwlib29sICJsb2FkZm9udCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gbG9hZHMgYSBjb25zb2xlIGZvbnQgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKworY29uZmlnIExPQURLTUFQCisJYm9vbCAibG9hZGttYXAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGxvYWRzIGEga2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGUgZnJvbQorCSAgc3RhbmRhcmQgaW5wdXQuCisKK2NvbmZpZyBPUEVOVlQKKwlib29sICJvcGVudnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gc3RhcnQgYSBjb21tYW5kIG9uIGFuIHVudXNlZAorCSAgdmlydHVhbCB0ZXJtaW5hbC4KKworY29uZmlnIFJFU0VUCisJYm9vbCAicmVzZXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gcmVzZXQgdGhlIHRlcm1pbmFsIHNjcmVlbiwgaWYgaXQKKwkgIGdldHMgbWVzc2VkIHVwLgorCitjb25maWcgUkVTSVpFCisJYm9vbCAicmVzaXplIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIChyZSlzZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgeW91ciBjdXJyZW50CisJICB0ZXJtaW5hbC4KKworY29uZmlnIEZFQVRVUkVfUkVTSVpFX1BSSU5UCisJYm9vbCAiUHJpbnQgZW52aXJvbm1lbnQgdmFyaWFibGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUkVTSVpFCisJaGVscAorCSAgUHJpbnRzIHRoZSBuZXdseSBzZXQgc2l6ZSAobnVtYmVyIG9mIGNvbHVtbnMgYW5kIHJvd3MpIG9mCisJICB0aGUgdGVybWluYWwuCisJICBFLmcuOgorCSAgQ09MVU1OUz04MDtMSU5FUz00NDtleHBvcnQgQ09MVU1OUyBMSU5FUzsKKworY29uZmlnIFNFVENPTlNPTEUKKwlib29sICJzZXRjb25zb2xlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSByZWRpcmVjdHMgdGhlIHN5c3RlbSBjb25zb2xlIHRvIGFub3RoZXIgZGV2aWNlLAorCSAgbGlrZSB0aGUgY3VycmVudCB0dHkgd2hpbGUgbG9nZ2VkIGluIHZpYSB0ZWxuZXQuCisKK2NvbmZpZyBGRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNFVENPTlNPTEUgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBzZXRjb25zb2xlIGFwcGxldC4KKworY29uZmlnIFNFVEZPTlQKKwlib29sICJzZXRmb250IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFsbG93cyB0byBsb2FkIGNvbnNvbGUgc2NyZWVuIG1hcC4gVXNlZnVsIGZvciBpMThuLgorCitjb25maWcgRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQCisJYm9vbCAiU3VwcG9ydCByZWFkaW5nIHRleHR1YWwgc2NyZWVuIG1hcHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTRVRGT05UCisJaGVscAorCSAgU3VwcG9ydCByZWFkaW5nIHRleHR1YWwgc2NyZWVuIG1hcHMuCisKK2NvbmZpZyBERUZBVUxUX1NFVEZPTlRfRElSCisJc3RyaW5nICJEZWZhdWx0IGRpcmVjdG9yeSBmb3IgY29uc29sZS10b29scyBmaWxlcyIKKwlkZWZhdWx0ICIiCisJZGVwZW5kcyBvbiBTRVRGT05UCisJaGVscAorCSAgRGlyZWN0b3J5IHRvIHVzZSBpZiBzZXRmb250J3MgcGFyYW1zIGFyZSBzaW1wbGUgZmlsZW5hbWVzCisJICAobm90IC9wYXRoL3RvL2ZpbGUgb3IgLi9maWxlKS4gRGVmYXVsdCBpcyAiIiAobm8gZGVmYXVsdCBkaXJlY3RvcnkpLgorCitjb25maWcgU0VUS0VZQ09ERVMKKwlib29sICJzZXRrZXljb2RlcyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gbG9hZHMgZW50cmllcyBpbnRvIHRoZSBrZXJuZWwncyBzY2FuY29kZS10by1rZXljb2RlCisJICBtYXAsIGFsbG93aW5nIHVudXN1YWwga2V5Ym9hcmRzIHRvIGdlbmVyYXRlIHVzYWJsZSBrZXljb2Rlcy4KKworY29uZmlnIFNFVExPR0NPTlMKKwlib29sICJzZXRsb2djb25zIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSByZWRpcmVjdHMgdGhlIG91dHB1dCBjb25zb2xlIG9mIGtlcm5lbCBtZXNzYWdlcy4KKworY29uZmlnIFNIT1dLRVkKKwlib29sICJzaG93a2V5IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFNob3dzIGtleXMgcHJlc3NlZC4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIGxvYWRmb250IGFuZCBzZXRmb250IgorCWRlcGVuZHMgb24gTE9BREZPTlQgfHwgU0VURk9OVAorCitjb25maWcgRkVBVFVSRV9MT0FERk9OVF9QU0YyCisJYm9vbCAiU3VwcG9ydCBmb3IgUFNGMiBjb25zb2xlIGZvbnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9BREZPTlQgfHwgU0VURk9OVAorCWhlbHAKKwkgIFN1cHBvcnQgUFNGMiBjb25zb2xlIGZvbnRzLgorCitjb25maWcgRkVBVFVSRV9MT0FERk9OVF9SQVcKKwlib29sICJTdXBwb3J0IGZvciBvbGQgKHJhdykgY29uc29sZSBmb250cyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPQURGT05UIHx8IFNFVEZPTlQKKwloZWxwCisJICBTdXBwb3J0IG9sZCAocmF3KSBjb25zb2xlIGZvbnRzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkZTlhZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDI1IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19DSFZUKQkJKz0gY2h2dC5vCitsaWItJChDT05GSUdfRkdDT05TT0xFKQkJKz0gZmdjb25zb2xlLm8KK2xpYi0kKENPTkZJR19DTEVBUikJCSs9IGNsZWFyLm8KK2xpYi0kKENPTkZJR19ERUFMTE9DVlQpCQkrPSBkZWFsbG9jdnQubworbGliLSQoQ09ORklHX0RVTVBLTUFQKQkJKz0gZHVtcGttYXAubworbGliLSQoQ09ORklHX1NFVENPTlNPTEUpCSs9IHNldGNvbnNvbGUubworbGliLSQoQ09ORklHX0tCRF9NT0RFKQkJKz0ga2JkX21vZGUubworbGliLSQoQ09ORklHX0xPQURGT05UKQkJKz0gbG9hZGZvbnQubworbGliLSQoQ09ORklHX0xPQURLTUFQKQkJKz0gbG9hZGttYXAubworbGliLSQoQ09ORklHX09QRU5WVCkJCSs9IG9wZW52dC5vCitsaWItJChDT05GSUdfUkVTRVQpCQkrPSByZXNldC5vCitsaWItJChDT05GSUdfUkVTSVpFKQkJKz0gcmVzaXplLm8KK2xpYi0kKENPTkZJR19TRVRGT05UKQkJKz0gbG9hZGZvbnQubworbGliLSQoQ09ORklHX1NFVEtFWUNPREVTKQkrPSBzZXRrZXljb2Rlcy5vCitsaWItJChDT05GSUdfU0VUTE9HQ09OUykJKz0gc2V0bG9nY29ucy5vCitsaWItJChDT05GSUdfU0hPV0tFWSkJCSs9IHNob3drZXkubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9jaHZ0LmMgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2NodnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWM5NzRmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9jaHZ0LmMKQEAgLTAsMCArMSwyMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjaHZ0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNodnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIk4iCisvL3VzYWdlOiNkZWZpbmUgY2h2dF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgZm9yZWdyb3VuZCB2aXJ0dWFsIHRlcm1pbmFsIHRvIC9kZXYvdHR5TiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBjaHZ0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaHZ0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbnVtID0geGF0b3VfcmFuZ2Uoc2luZ2xlX2FyZ3YoYXJndiksIDEsIDYzKTsKKwljb25zb2xlX21ha2VfYWN0aXZlKGdldF9jb25zb2xlX2ZkX29yX2RpZSgpLCBudW0pOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2NsZWFyLmMgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2NsZWFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyMmI3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvY2xlYXIuYwpAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNsZWFyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNsZWFyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgY2xlYXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDbGVhciBzY3JlZW4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgY2xlYXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNsZWFyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJLyogaG9tZTsgY2xlYXIgdG8gdGhlIGVuZCBvZiBzY3JlZW4gKi8KKwlyZXR1cm4gZnVsbF93cml0ZTFfc3RyKCJcMDMzW0giIlwwMzNbSiIpICE9IDY7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2RlYWxsb2N2dC5jIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9kZWFsbG9jdnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMxYzBhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9kZWFsbG9jdnQuYwpAQCAtMCwwICsxLDM4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBEaXNhbGxvY2F0ZSB2aXJ0dWFsIHRlcm1pbmFsKHMpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIG5vIG9wdGlvbnMsIG5vIGdldG9wdCAqLworCisvL3VzYWdlOiNkZWZpbmUgZGVhbGxvY3Z0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbTl0iCisvL3VzYWdlOiNkZWZpbmUgZGVhbGxvY3Z0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVhbGxvY2F0ZSB1bnVzZWQgdmlydHVhbCB0ZXJtaW5hbCAvZGV2L3R0eU4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBGcm9tIDxsaW51eC92dC5oPiAqLworZW51bSB7IFZUX0RJU0FMTE9DQVRFID0gMHg1NjA4IH07IC8qIGZyZWUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gdnQgKi8KKworaW50IGRlYWxsb2N2dF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGVhbGxvY3Z0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwkvKiBudW0gPSAwIGRlYWxsb2NhdGUgYWxsIHVudXNlZCBjb25zb2xlcyAqLworCWludCBudW0gPSAwOworCisJaWYgKGFyZ3ZbMV0pIHsKKwkJaWYgKGFyZ3ZbMl0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCW51bSA9IHhhdG91X3JhbmdlKGFyZ3ZbMV0sIDEsIDYzKTsKKwl9CisKKwkvKiBkb3VibGUgY2FzdCBzdXBwcmVzc2VzICJjYXN0IHRvIHB0ciBmcm9tIGludCBvZiBkaWZmZXJlbnQgc2l6ZSIgKi8KKwl4aW9jdGwoZ2V0X2NvbnNvbGVfZmRfb3JfZGllKCksIFZUX0RJU0FMTE9DQVRFLCAodm9pZCAqKShwdHJkaWZmX3QpbnVtKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9kdW1wa21hcC5jIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9kdW1wa21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTIzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2R1bXBrbWFwLmMKQEAgLTAsMCArMSw4MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBkdW1wa21hcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgQXJuZSBCZXJuaW4gPGFybmVAbWF0cml4Lmxvb3BiYWNrLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqLworLyogbm8gb3B0aW9ucywgbm8gZ2V0b3B0ICovCisKKy8vdXNhZ2U6I2RlZmluZSBkdW1wa21hcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiPiBrZXltYXAiCisvL3VzYWdlOiNkZWZpbmUgZHVtcGttYXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBhIGJpbmFyeSBrZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZSB0byBzdGRvdXQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGR1bXBrbWFwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGR1bXBrbWFwID4ga2V5bWFwXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBGcm9tIDxsaW51eC9rZC5oPiAqLworc3RydWN0IGtiZW50cnkgeworCXVuc2lnbmVkIGNoYXIga2JfdGFibGU7CisJdW5zaWduZWQgY2hhciBrYl9pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCBrYl92YWx1ZTsKK307CisjZGVmaW5lIEtER0tCRU5UIDB4NEI0NiAgLyogZ2V0cyBvbmUgZW50cnkgaW4gdHJhbnNsYXRpb24gdGFibGUgKi8KKworLyogRnJvbSA8bGludXgva2V5Ym9hcmQuaD4gKi8KKyNkZWZpbmUgTlJfS0VZUyAxMjgKKyNkZWZpbmUgTUFYX05SX0tFWU1BUFMgMjU2CisKK2ludCBkdW1wa21hcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZHVtcGttYXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBrYmVudHJ5IGtlOworCWludCBpLCBqLCBmZDsKKwlSRVNFUlZFX0NPTkZJR19CVUZGRVIoZmxhZ3MsIE1BWF9OUl9LRVlNQVBTKTsKKworCS8qIFdoZW4gdXNlciBhY2NpZGVudGFsbHkgcnVucyAiZHVtcGttYXAgRklMRSIKKwkgKiBpbnN0ZWFkIG9mICJkdW1wa21hcCA+RklMRSIsIHdlJ2QgZHVtcCBiaW5hcnkgc3R1ZmYgdG8gdHR5LgorCSAqIExldCdzIHByZXZlbnQgaXQ6ICovCisJaWYgKGFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKy8qCWJiX3dhcm5faWdub3JpbmdfYXJncyhhcmd2WzFdKTsqLworCisJZmQgPSBnZXRfY29uc29sZV9mZF9vcl9kaWUoKTsKKworCXdyaXRlKFNURE9VVF9GSUxFTk8sICJia2V5bWFwIiwgNyk7CisKKwkvKiBIZXJlIHdlIHdhbnQgdG8gc2V0IGV2ZXJ5dGhpbmcgdG8gMCBleGNlcHQgZm9yIGluZGV4ZXM6CisJICogWzAtMl0gWzQtNl0gWzgtMTBdIFsxMl0gKi8KKwltZW1zZXQoZmxhZ3MsIDB4MDAsIE1BWF9OUl9LRVlNQVBTKTsKKwltZW1zZXQoZmxhZ3MsIDB4MDEsIDEzKTsKKwlmbGFnc1szXSA9IGZsYWdzWzddID0gZmxhZ3NbMTFdID0gMDsKKworCS8qIGR1bXAgZmxhZ3MgKi8KKwl3cml0ZShTVERPVVRfRklMRU5PLCBmbGFncywgTUFYX05SX0tFWU1BUFMpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9LRVlNQVBTOyBpKyspIHsKKwkJaWYgKGZsYWdzW2ldID09IDEpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBOUl9LRVlTOyBqKyspIHsKKwkJCQlrZS5rYl9pbmRleCA9IGo7CisJCQkJa2Uua2JfdGFibGUgPSBpOworCQkJCWlmICghaW9jdGxfb3JfcGVycm9yKGZkLCBLREdLQkVOVCwgJmtlLAorCQkJCQkJImlvY3RsIGZhaWxlZCB3aXRoICVzLCAlcywgJXAiLAorCQkJCQkJKGNoYXIgKikma2Uua2JfaW5kZXgsCisJCQkJCQkoY2hhciAqKSZrZS5rYl90YWJsZSwKKwkJCQkJCSZrZS5rYl92YWx1ZSkKKwkJCQkpIHsKKwkJCQkJd3JpdGUoU1RET1VUX0ZJTEVOTywgKHZvaWQqKSZrZS5rYl92YWx1ZSwgMik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShmZCk7CisJCVJFTEVBU0VfQ09ORklHX0JVRkZFUihmbGFncyk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2ZnY29uc29sZS5jIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9mZ2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM1NWJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9mZ2NvbnNvbGUuYwpAQCAtMCwwICsxLDM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGZnY29uc29sZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBieSBHcmlnb3J5IEJhdGFsb3YgPGJnYUBhbHRsaW51eC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmdjb25zb2xlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSIiCisvL3VzYWdlOiNkZWZpbmUgZmdjb25zb2xlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiR2V0IGFjdGl2ZSBjb25zb2xlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRnJvbSA8bGludXgvdnQuaD4gKi8KK3N0cnVjdCB2dF9zdGF0IHsKKwl1bnNpZ25lZCBzaG9ydCB2X2FjdGl2ZTsgICAgICAgIC8qIGFjdGl2ZSB2dCAqLworCXVuc2lnbmVkIHNob3J0IHZfc2lnbmFsOyAgICAgICAgLyogc2lnbmFsIHRvIHNlbmQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3N0YXRlOyAgICAgICAgIC8qIHZ0IGJpdG1hc2sgKi8KK307CitlbnVtIHsgVlRfR0VUU1RBVEUgPSAweDU2MDMgfTsgLyogZ2V0IGdsb2JhbCB2dCBzdGF0ZSBpbmZvICovCisKK2ludCBmZ2NvbnNvbGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZnY29uc29sZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB2dF9zdGF0IHZ0c3RhdDsKKworCXZ0c3RhdC52X2FjdGl2ZSA9IDA7CisJeGlvY3RsKGdldF9jb25zb2xlX2ZkX29yX2RpZSgpLCBWVF9HRVRTVEFURSwgJnZ0c3RhdCk7CisJcHJpbnRmKCIlZFxuIiwgdnRzdGF0LnZfYWN0aXZlKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2tiZF9tb2RlLmMgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2tiZF9tb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4NTM2NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMva2JkX21vZGUuYwpAQCAtMCwwICsxLDY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGtiZF9tb2RlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IExvaWMgR3JlbmllIDxsb2ljLmdyZW5pZUBnbWFpbC5jb20+CisgKiAgIHdyaXR0ZW4gdXNpbmcgQW5kcmllcyBCcm91d2VyIDxhZWJAY3dpLm5sPidzIGtiZF9tb2RlIGZyb20KKyAqICAgY29uc29sZS11dGlscyB2MC4yLjMsIGxpY2Vuc2VkIHVuZGVyIEdOVSBHUEx2MgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGtiZF9tb2RlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWF8a3xzfHVdIFstQyBUVFldIgorLy91c2FnZTojZGVmaW5lIGtiZF9tb2RlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVwb3J0IG9yIHNldCB0aGUga2V5Ym9hcmQgbW9kZVxuIgorLy91c2FnZTogICAgICJcbgktYQlEZWZhdWx0IChBU0NJSSkiCisvL3VzYWdlOiAgICAgIlxuCS1rCU1lZGl1bS1yYXcgKGtleWJvYXJkKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJUmF3IChzY2FuY29kZSkiCisvL3VzYWdlOiAgICAgIlxuCS11CVVuaWNvZGUgKHV0Zi04KSIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgVFRZCUFmZmVjdCBUVFkgaW5zdGVhZCBvZiAvZGV2L3R0eSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgva2QuaD4KKworaW50IGtiZF9tb2RlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBrYmRfbW9kZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCVNDQU5DT0RFICA9ICgxIDw8IDApLAorCQlBU0NJSSAgICAgPSAoMSA8PCAxKSwKKwkJTUVESVVNUkFXID0gKDEgPDwgMiksCisJCVVOSUNPREUgICA9ICgxIDw8IDMpLAorCX07CisJaW50IGZkOworCXVuc2lnbmVkIG9wdDsKKwljb25zdCBjaGFyICp0dHlfbmFtZSA9IENVUlJFTlRfVFRZOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgInNha3VDOiIsICZ0dHlfbmFtZSk7CisJZmQgPSB4b3Blbl9ub25ibG9ja2luZyh0dHlfbmFtZSk7CisJb3B0ICY9IDB4ZjsgLyogY2xlYXIgLUMgYml0LCBzZWUgKCopICovCisKKwlpZiAoIW9wdCkgeyAvKiBwcmludCBjdXJyZW50IHNldHRpbmcgKi8KKwkJY29uc3QgY2hhciAqbW9kZSA9ICJ1bmtub3duIjsKKwkJaW50IG07CisKKwkJeGlvY3RsKGZkLCBLREdLQk1PREUsICZtKTsKKwkJaWYgKG0gPT0gS19SQVcpCisJCQltb2RlID0gInJhdyAoc2NhbmNvZGUpIjsKKwkJZWxzZSBpZiAobSA9PSBLX1hMQVRFKQorCQkJbW9kZSA9ICJkZWZhdWx0IChBU0NJSSkiOworCQllbHNlIGlmIChtID09IEtfTUVESVVNUkFXKQorCQkJbW9kZSA9ICJtZWRpdW1yYXcgKGtleWNvZGUpIjsKKwkJZWxzZSBpZiAobSA9PSBLX1VOSUNPREUpCisJCQltb2RlID0gIlVuaWNvZGUgKFVURi04KSI7CisJCXByaW50ZigiVGhlIGtleWJvYXJkIGlzIGluICVzIG1vZGVcbiIsIG1vZGUpOworCX0gZWxzZSB7CisJCS8qIGhlcmUgd2UgZGVwZW5kIG9uIHNwZWNpZmljIGJpdHMgYXNzaWduZWQgdG8gb3B0aW9ucyAoKikgKi8KKwkJb3B0ID0gb3B0ICYgVU5JQ09ERSA/IDMgOiBvcHQgPj4gMTsKKwkJLyogZG91YmxlIGNhc3QgcHJldmVudHMgd2FybmluZ3MgYWJvdXQgd2lkZW5pbmcgY29udmVyc2lvbiAqLworCQl4aW9jdGwoZmQsIEtEU0tCTU9ERSwgKHZvaWQqKShwdHJkaWZmX3Qpb3B0KTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZkKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9sb2FkZm9udC5jIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9sb2FkZm9udC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODg3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2xvYWRmb250LmMKQEAgLTAsMCArMSw0OTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxvYWRmb250LmMgLSBFdWdlbmUgQ3Jvc3NlciAmIEFuZHJpZXMgQnJvdXdlcgorICoKKyAqIFZlcnNpb24gMC45NmJiCisgKgorICogTG9hZHMgdGhlIGNvbnNvbGUgZm9udCwgYW5kIHBvc3NpYmx5IHRoZSBjb3JyZXNwb25kaW5nIHNjcmVlbiBtYXAocykuCisgKiAoQWRhcHRlZCBmb3IgYnVzeWJveCBieSBNYXRlaiBWZWxhLikKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsb2FkZm9udF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiPCBmb250IgorLy91c2FnZTojZGVmaW5lIGxvYWRmb250X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCBhIGNvbnNvbGUgZm9udCBmcm9tIHN0ZGluIgorLyogLy91c2FnZTogICAgICJcbgktQyBUVFkJQWZmZWN0IFRUWSBpbnN0ZWFkIG9mIC9kZXYvdHR5IiAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsb2FkZm9udF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBsb2FkZm9udCA8IC9ldGMvaTE4bi9mb250bmFtZVxuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzZXRmb250X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGT05UIFstbSBNQVBGSUxFXSBbLUMgVFRZXSIKKy8vdXNhZ2U6I2RlZmluZSBzZXRmb250X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCBhIGNvbnNvbGUgZm9udFxuIgorLy91c2FnZTogICAgICJcbgktbSBNQVBGSUxFCUxvYWQgY29uc29sZSBzY3JlZW4gbWFwIgorLy91c2FnZTogICAgICJcbgktQyBUVFkJCUFmZmVjdCBUVFkgaW5zdGVhZCBvZiAvZGV2L3R0eSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2V0Zm9udF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBzZXRmb250IC1tIGtvaTgtciAvZXRjL2kxOG4vZm9udG5hbWVcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL2tkLmg+CisKKyNpZm5kZWYgS0RGT05UT1AKKyMgZGVmaW5lIEtERk9OVE9QIDB4NEI3Mgorc3RydWN0IGNvbnNvbGVfZm9udF9vcCB7CisJdW5zaWduZWQgb3A7ICAgICAgICAgICAgLyogS0RfRk9OVF9PUF8qICovCisJdW5zaWduZWQgZmxhZ3M7ICAgICAgICAgLyogS0RfRk9OVF9GTEFHXyogKi8KKwl1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OworCXVuc2lnbmVkIGNoYXJjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOyAgICAvKiBmb250IGRhdGEgd2l0aCBoZWlnaHQgZml4ZWQgdG8gMzIgKi8KK307CisjIGRlZmluZSBLRF9GT05UX09QX1NFVCAgICAgICAgICAwICAvKiBTZXQgZm9udCAqLworIyBkZWZpbmUgS0RfRk9OVF9PUF9HRVQgICAgICAgICAgMSAgLyogR2V0IGZvbnQgKi8KKyMgZGVmaW5lIEtEX0ZPTlRfT1BfU0VUX0RFRkFVTFQgIDIgIC8qIFNldCBmb250IHRvIGRlZmF1bHQsIGRhdGEgcG9pbnRzIHRvIG5hbWUgLyBOVUxMICovCisjIGRlZmluZSBLRF9GT05UX09QX0NPUFkgICAgICAgICAzICAvKiBDb3B5IGZyb20gYW5vdGhlciBjb25zb2xlICovCisjIGRlZmluZSBLRF9GT05UX0ZMQUdfT0xEICAgICAgICAweDgwMDAwMDAwIC8qIEludm9rZWQgdmlhIG9sZCBpbnRlcmZhY2UgKi8KKyMgZGVmaW5lIEtEX0ZPTlRfRkxBR19ET05UX1JFQ0FMQyAxIC8qIERvbid0IGNhbGwgYWRqdXN0X2hlaWdodCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChVc2VkIGludGVybmFsbHkgZm9yIFBJT19GT05UIHN1cHBvcnQpICovCisjZW5kaWYgLyogS0RGT05UT1AgKi8KKworCitlbnVtIHsKKwlQU0YxX01BR0lDMCA9IDB4MzYsCisJUFNGMV9NQUdJQzEgPSAweDA0LAorCVBTRjFfTU9ERTUxMiA9IDB4MDEsCisJUFNGMV9NT0RFSEFTVEFCID0gMHgwMiwKKwlQU0YxX01PREVIQVNTRVEgPSAweDA0LAorCVBTRjFfTUFYTU9ERSA9IDB4MDUsCisJUFNGMV9TVEFSVFNFUSA9IDB4ZmZmZSwKKwlQU0YxX1NFUEFSQVRPUiA9IDB4ZmZmZiwKK307CisKK3N0cnVjdCBwc2YxX2hlYWRlciB7CisJdW5zaWduZWQgY2hhciBtYWdpY1syXTsgICAgICAgICAvKiBNYWdpYyBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIG1vZGU7ICAgICAgICAgICAgIC8qIFBTRiBmb250IG1vZGUgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYXJzaXplOyAgICAgICAgIC8qIENoYXJhY3RlciBzaXplICovCit9OworCisjZGVmaW5lIHBzZjFoKHgpICgoc3RydWN0IHBzZjFfaGVhZGVyKikoeCkpCisKKyNkZWZpbmUgUFNGMV9NQUdJQ19PSyh4KSAoIFwKKyAgICAgKHgpLT5tYWdpY1swXSA9PSBQU0YxX01BR0lDMCBcCisgICYmICh4KS0+bWFnaWNbMV0gPT0gUFNGMV9NQUdJQzEgXAorKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTE9BREZPTlRfUFNGMgorZW51bSB7CisJUFNGMl9NQUdJQzAgPSAweDcyLAorCVBTRjJfTUFHSUMxID0gMHhiNSwKKwlQU0YyX01BR0lDMiA9IDB4NGEsCisJUFNGMl9NQUdJQzMgPSAweDg2LAorCVBTRjJfSEFTX1VOSUNPREVfVEFCTEUgPSAweDAxLAorCVBTRjJfTUFYVkVSU0lPTiA9IDAsCisJUFNGMl9TVEFSVFNFUSA9IDB4ZmUsCisJUFNGMl9TRVBBUkFUT1IgPSAweGZmCit9OworCitzdHJ1Y3QgcHNmMl9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgbWFnaWNbNF07CisJdW5zaWduZWQgaW50IHZlcnNpb247CisJdW5zaWduZWQgaW50IGhlYWRlcnNpemU7ICAgIC8qIG9mZnNldCBvZiBiaXRtYXBzIGluIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGxlbmd0aDsgICAgICAgIC8qIG51bWJlciBvZiBnbHlwaHMgKi8KKwl1bnNpZ25lZCBpbnQgY2hhcnNpemU7ICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGZvciBlYWNoIGNoYXJhY3RlciAqLworCXVuc2lnbmVkIGludCBoZWlnaHQ7ICAgICAgICAvKiBtYXggZGltZW5zaW9ucyBvZiBnbHlwaHMgKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGg7ICAgICAgICAgLyogY2hhcnNpemUgPSBoZWlnaHQgKiAoKHdpZHRoICsgNykgLyA4KSAqLworfTsKKworI2RlZmluZSBwc2YyaCh4KSAoKHN0cnVjdCBwc2YyX2hlYWRlciopKHgpKQorCisjZGVmaW5lIFBTRjJfTUFHSUNfT0soeCkgKCBcCisgICAgICh4KS0+bWFnaWNbMF0gPT0gUFNGMl9NQUdJQzAgXAorICAmJiAoeCktPm1hZ2ljWzFdID09IFBTRjJfTUFHSUMxIFwKKyAgJiYgKHgpLT5tYWdpY1syXSA9PSBQU0YyX01BR0lDMiBcCisgICYmICh4KS0+bWFnaWNbM10gPT0gUFNGMl9NQUdJQzMgXAorKQorI2VuZGlmIC8qIEVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1BTRjIgKi8KKworCitzdGF0aWMgdm9pZCBkb19sb2FkZm9udChpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmluYnVmLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBjaGFyc2l6ZSwgaW50IGZvbnRzaXplKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgY2hhcndpZHRoID0gMzIgKiAoKHdpZHRoKzcpLzgpOworCWludCBpOworCisJaWYgKGhlaWdodCA8IDEgfHwgaGVpZ2h0ID4gMzIgfHwgd2lkdGggPCAxIHx8IHdpZHRoID4gMzIpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgY2hhcmFjdGVyIHNpemUgJWR4JWQiLCBoZWlnaHQsIHdpZHRoKTsKKworCWJ1ZiA9IHh6YWxsb2MoY2hhcndpZHRoICogKChmb250c2l6ZSA8IDEyOCkgPyAxMjggOiBmb250c2l6ZSkpOworCWZvciAoaSA9IDA7IGkgPCBmb250c2l6ZTsgaSsrKQorCQltZW1jcHkoYnVmICsgKGkqY2hhcndpZHRoKSwgaW5idWYgKyAoaSpjaGFyc2l6ZSksIGNoYXJzaXplKTsKKworCXsgLyogS0RGT05UT1AgKi8KKwkJc3RydWN0IGNvbnNvbGVfZm9udF9vcCBjZm87CisJCWNmby5vcCA9IEtEX0ZPTlRfT1BfU0VUOworCQljZm8uZmxhZ3MgPSAwOworCQljZm8ud2lkdGggPSB3aWR0aDsKKwkJY2ZvLmhlaWdodCA9IGhlaWdodDsKKwkJY2ZvLmNoYXJjb3VudCA9IGZvbnRzaXplOworCQljZm8uZGF0YSA9IGJ1ZjsKKwkJeGlvY3RsKGZkLCBLREZPTlRPUCwgJmNmbyk7CisJfQorCisJZnJlZShidWYpOworfQorCisvKgorICogRm9ybWF0IG9mIHRoZSBVbmljb2RlIGluZm9ybWF0aW9uOgorICoKKyAqIEZvciBlYWNoIGZvbnQgcG9zaXRpb24gPHVjPio8c2VxPio8dGVybT4KKyAqIHdoZXJlIDx1Yz4gaXMgYSAyLWJ5dGUgbGl0dGxlIGVuZGlhbiBVbmljb2RlIHZhbHVlIChQU0YxKQorICogb3IgYW4gVVRGLTggY29kZWQgdmFsdWUgKFBTRjIpLAorICogPHNlcT4gPSA8c3M+PHVjPjx1Yz4qLCA8c3M+ID0gcHNmMSA/IDB4RkZGRSA6IDB4RkUsCisgKiA8dGVybT4gPSBwc2YxID8gMHhGRkZGIDogMHhGRi4KKyAqIGFuZCAqIGRlbm90ZXMgemVybyBvciBtb3JlIG9jY3VycmVuY2VzIG9mIHRoZSBwcmVjZWRpbmcgaXRlbS4KKyAqCisgKiBTZW1hbnRpY3M6CisgKiBUaGUgbGVhZGluZyA8dWM+KiBwYXJ0IGdpdmVzIFVuaWNvZGUgc3ltYm9scyB0aGF0IGFyZSBhbGwKKyAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9udCBwb3NpdGlvbi4gVGhlIGZvbGxvd2luZyBzZXF1ZW5jZXMKKyAqIGFyZSBzZXF1ZW5jZXMgb2YgVW5pY29kZSBzeW1ib2xzIC0gcHJvYmFibHkgYSBzeW1ib2wKKyAqIHRvZ2V0aGVyIHdpdGggY29tYmluaW5nIGFjY2VudHMgLSBhbHNvIHJlcHJlc2VudGVkIGJ5CisgKiB0aGlzIGZvbnQgcG9zaXRpb24uCisgKgorICogRXhhbXBsZToKKyAqIEF0IHRoZSBmb250IHBvc2l0aW9uIGZvciBhIGNhcGl0YWwgQS1yaW5nIGdseXBoLCB3ZQorICogbWF5IGhhdmU6CisgKiAgIDAwQzUsMjEyQixGRkZFLDAwNDEsMDMwQSxGRkZGCisgKiBTb21lIGZvbnQgcG9zaXRpb25zIG1heSBiZSBkZXNjcmliZWQgYnkgc2VxdWVuY2VzIG9ubHksCisgKiBuYW1lbHkgd2hlbiB0aGVyZSBpcyBubyBwcmVjb21wb3NlZCBVbmljb2RlIHZhbHVlIGZvciB0aGUgZ2x5cGguCisgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTE9BREZPTlRfUFNGMgorI2RlZmluZSBkb19sb2FkdGFibGUoZmQsIGluYnVmLCB0YWlsc3osIGZvbnRzaXplLCBwc2YyKSBcCisJZG9fbG9hZHRhYmxlKGZkLCBpbmJ1ZiwgdGFpbHN6LCBmb250c2l6ZSkKKyNlbmRpZgorc3RhdGljIHZvaWQgZG9fbG9hZHRhYmxlKGludCBmZCwgdW5zaWduZWQgY2hhciAqaW5idWYsIGludCB0YWlsc3osIGludCBmb250c2l6ZSwgaW50IHBzZjIpCit7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1BTRjIKKy8qIGdjYyA0LjMuMSBjb2RlIHNpemU6ICovCisjIGRlZmluZSBwc2YyIDAgLyogKzAgYnl0ZXMgKi8KKy8vCWNvbnN0IGludCBwc2YyID0gMDsgLyogKzggYnl0ZXMgKi8KKy8vCWVudW0geyBwc2YyID0gMCB9OyAvKiArMTMgYnl0ZXMgKi8KKyNlbmRpZgorCXN0cnVjdCB1bmltYXBpbml0IGFkdmljZTsKKwlzdHJ1Y3QgdW5pbWFwZGVzYyB1ZDsKKwlzdHJ1Y3QgdW5pcGFpciAqdXA7CisJaW50IGN0ID0gMCwgbWF4Y3Q7CisJaW50IGdseXBoOworCXVpbnQxNl90IHVuaWNvZGU7CisKKwltYXhjdCA9IHRhaWxzejsgLyogbW9yZSB0aGFuIGVub3VnaCAqLworCXVwID0geG1hbGxvYyhtYXhjdCAqIHNpemVvZigqdXApKTsKKworCWZvciAoZ2x5cGggPSAwOyBnbHlwaCA8IGZvbnRzaXplOyBnbHlwaCsrKSB7CisJCXdoaWxlICh0YWlsc3ogPiAwKSB7CisJCQlpZiAoIXBzZjIpIHsgLyogUFNGMSAqLworCQkJCXVuaWNvZGUgPSAoKCh1aW50MTZfdCkgaW5idWZbMV0pIDw8IDgpICsgaW5idWZbMF07CisJCQkJdGFpbHN6IC09IDI7CisJCQkJaW5idWYgKz0gMjsKKwkJCQlpZiAodW5pY29kZSA9PSBQU0YxX1NFUEFSQVRPUikKKwkJCQkJYnJlYWs7CisJCQl9IGVsc2UgeyAvKiBQU0YyICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfTE9BREZPTlRfUFNGMgorCQkJCS0tdGFpbHN6OworCQkJCXVuaWNvZGUgPSAqaW5idWYrKzsKKwkJCQlpZiAodW5pY29kZSA9PSBQU0YyX1NFUEFSQVRPUikgeworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKHVuaWNvZGUgPT0gUFNGMl9TVEFSVFNFUSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5pY29kZSBzZXF1ZW5jZXMgbm90IGltcGxlbWVudGVkIik7CisJCQkJfSBlbHNlIGlmICh1bmljb2RlID49IDB4QzApIHsKKwkJCQkJaWYgKHVuaWNvZGUgPj0gMHhGQykKKwkJCQkJCXVuaWNvZGUgJj0gMHgwMSwgbWF4Y3QgPSA1OworCQkJCQllbHNlIGlmICh1bmljb2RlID49IDB4RjgpCisJCQkJCQl1bmljb2RlICY9IDB4MDMsIG1heGN0ID0gNDsKKwkJCQkJZWxzZSBpZiAodW5pY29kZSA+PSAweEYwKQorCQkJCQkJdW5pY29kZSAmPSAweDA3LCBtYXhjdCA9IDM7CisJCQkJCWVsc2UgaWYgKHVuaWNvZGUgPj0gMHhFMCkKKwkJCQkJCXVuaWNvZGUgJj0gMHgwRiwgbWF4Y3QgPSAyOworCQkJCQllbHNlCisJCQkJCQl1bmljb2RlICY9IDB4MUYsIG1heGN0ID0gMTsKKwkJCQkJZG8geworCQkJCQkJaWYgKHRhaWxzeiA8PSAwIHx8ICppbmJ1ZiA8IDB4ODAgfHwgKmluYnVmID4gMHhCRikKKwkJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaWxsZWdhbCBVVEYtOCBjaGFyYWN0ZXIiKTsKKwkJCQkJCS0tdGFpbHN6OworCQkJCQkJdW5pY29kZSA9ICh1bmljb2RlIDw8IDYpICsgKCppbmJ1ZisrICYgMHgzRik7CisJCQkJCX0gd2hpbGUgKC0tbWF4Y3QgPiAwKTsKKwkJCQl9IGVsc2UgaWYgKHVuaWNvZGUgPj0gMHg4MCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaWxsZWdhbCBVVEYtOCBjaGFyYWN0ZXIiKTsKKwkJCQl9CisjZWxzZQorCQkJCXJldHVybjsKKyNlbmRpZgorCQkJfQorCQkJdXBbY3RdLnVuaWNvZGUgPSB1bmljb2RlOworCQkJdXBbY3RdLmZvbnRwb3MgPSBnbHlwaDsKKwkJCWN0Kys7CisJCX0KKwl9CisKKwkvKiBOb3RlOiBhZnRlciBQSU9fVU5JTUFQQ0xSIGFuZCBiZWZvcmUgUElPX1VOSU1BUAorCSAgIHRoaXMgcHJpbnRmIGRpZCBub3Qgd29yayBvbiBtYW55IGtlcm5lbHMgKi8KKworCWFkdmljZS5hZHZpc2VkX2hhc2hzaXplID0gMDsKKwlhZHZpY2UuYWR2aXNlZF9oYXNoc3RlcCA9IDA7CisJYWR2aWNlLmFkdmlzZWRfaGFzaGxldmVsID0gMDsKKwl4aW9jdGwoZmQsIFBJT19VTklNQVBDTFIsICZhZHZpY2UpOworCXVkLmVudHJ5X2N0ID0gY3Q7CisJdWQuZW50cmllcyA9IHVwOworCXhpb2N0bChmZCwgUElPX1VOSU1BUCwgJnVkKTsKKyN1bmRlZiBwc2YyCit9CisKK3N0YXRpYyB2b2lkIGRvX2xvYWQoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJaW50IGhlaWdodDsKKwlpbnQgd2lkdGggPSA4OworCWludCBjaGFyc2l6ZTsKKwlpbnQgZm9udHNpemUgPSAyNTY7CisJaW50IGhhc190YWJsZSA9IDA7CisJdW5zaWduZWQgY2hhciAqZm9udCA9IGJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyICp0YWJsZTsKKworCWlmIChsZW4gPj0gc2l6ZW9mKHN0cnVjdCBwc2YxX2hlYWRlcikgJiYgUFNGMV9NQUdJQ19PSyhwc2YxaChidWZmZXIpKSkgeworCQlpZiAocHNmMWgoYnVmZmVyKS0+bW9kZSA+IFBTRjFfTUFYTU9ERSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnN1cHBvcnRlZCBwc2YgZmlsZSBtb2RlIik7CisJCWlmIChwc2YxaChidWZmZXIpLT5tb2RlICYgUFNGMV9NT0RFNTEyKQorCQkJZm9udHNpemUgPSA1MTI7CisJCWlmIChwc2YxaChidWZmZXIpLT5tb2RlICYgUFNGMV9NT0RFSEFTVEFCKQorCQkJaGFzX3RhYmxlID0gMTsKKwkJaGVpZ2h0ID0gY2hhcnNpemUgPSBwc2YxaChidWZmZXIpLT5jaGFyc2l6ZTsKKwkJZm9udCArPSBzaXplb2Yoc3RydWN0IHBzZjFfaGVhZGVyKTsKKwl9IGVsc2UKKyNpZiBFTkFCTEVfRkVBVFVSRV9MT0FERk9OVF9QU0YyCisJaWYgKGxlbiA+PSBzaXplb2Yoc3RydWN0IHBzZjJfaGVhZGVyKSAmJiBQU0YyX01BR0lDX09LKHBzZjJoKGJ1ZmZlcikpKSB7CisJCWlmIChwc2YyaChidWZmZXIpLT52ZXJzaW9uID4gUFNGMl9NQVhWRVJTSU9OKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIHBzZiBmaWxlIHZlcnNpb24iKTsKKwkJZm9udHNpemUgPSBwc2YyaChidWZmZXIpLT5sZW5ndGg7CisJCWlmIChwc2YyaChidWZmZXIpLT5mbGFncyAmIFBTRjJfSEFTX1VOSUNPREVfVEFCTEUpCisJCQloYXNfdGFibGUgPSAyOworCQljaGFyc2l6ZSA9IHBzZjJoKGJ1ZmZlciktPmNoYXJzaXplOworCQloZWlnaHQgPSBwc2YyaChidWZmZXIpLT5oZWlnaHQ7CisJCXdpZHRoID0gcHNmMmgoYnVmZmVyKS0+d2lkdGg7CisJCWZvbnQgKz0gcHNmMmgoYnVmZmVyKS0+aGVhZGVyc2l6ZTsKKwl9IGVsc2UKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1JBVworCWlmIChsZW4gPT0gOTc4MCkgeyAgLyogZmlsZSB3aXRoIHRocmVlIGNvZGUgcGFnZXM/ICovCisJCWNoYXJzaXplID0gaGVpZ2h0ID0gMTY7CisJCWZvbnQgKz0gNDA7CisJfSBlbHNlIGlmICgobGVuICYgMDM3NykgPT0gMCkgeyAgLyogYmFyZSBmb250ICovCisJCWNoYXJzaXplID0gaGVpZ2h0ID0gbGVuIC8gMjU2OworCX0gZWxzZQorI2VuZGlmCisJeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW5wdXQgZmlsZTogYmFkIGxlbmd0aCBvciB1bnN1cHBvcnRlZCBmb250IHR5cGUiKTsKKwl9CisKKyNpZiAhZGVmaW5lZChQSU9fRk9OVFgpIHx8IGRlZmluZWQoX19zcGFyY19fKQorCWlmIChmb250c2l6ZSAhPSAyNTYpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvbmx5IGZvbnRzaXplIDI1NiBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisJdGFibGUgPSBmb250ICsgZm9udHNpemUgKiBjaGFyc2l6ZTsKKwlidWZmZXIgKz0gbGVuOworCisJaWYgKHRhYmxlID4gYnVmZmVyIHx8ICghaGFzX3RhYmxlICYmIHRhYmxlICE9IGJ1ZmZlcikpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnB1dCBmaWxlOiBiYWQgbGVuZ3RoIik7CisKKwlkb19sb2FkZm9udChmZCwgZm9udCwgaGVpZ2h0LCB3aWR0aCwgY2hhcnNpemUsIGZvbnRzaXplKTsKKworCWlmIChoYXNfdGFibGUpCisJCWRvX2xvYWR0YWJsZShmZCwgdGFibGUsIGJ1ZmZlciAtIHRhYmxlLCBmb250c2l6ZSwgaGFzX3RhYmxlIC0gMSk7Cit9CisKKworI2lmIEVOQUJMRV9MT0FERk9OVAoraW50IGxvYWRmb250X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsb2FkZm9udF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc2l6ZV90IGxlbjsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisKKwkvLyBubyBhcmd1bWVudHMgYWxsb3dlZCEKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MCI7CisJZ2V0b3B0MzIoYXJndiwgIiIpOworCisJLyoKKwkgKiBXZSB1c2VkIHRvIGxvb2sgYXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZmlsZQorCSAqIHdpdGggc3RhdCgpOyBub3cgdGhhdCB3ZSBhY2NlcHQgY29tcHJlc3NlZCBmaWxlcywKKwkgKiBqdXN0IHJlYWQgdGhlIGVudGlyZSBmaWxlLgorCSAqLworCWxlbiA9IDMyKjEwMjQ7IC8vIGNhbid0IGJlIGxhcmdlcgorCWJ1ZmZlciA9IHhtYWxsb2NfcmVhZChTVERJTl9GSUxFTk8sICZsZW4pOworCS8vIHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZShmaWxlbmFtZSwgJmxlbik7CisJaWYgKCFidWZmZXIpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgcmVhZGluZyBpbnB1dCBmb250Iik7CisJZG9fbG9hZChnZXRfY29uc29sZV9mZF9vcl9kaWUoKSwgYnVmZmVyLCBsZW4pOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX1NFVEZPTlQKKworLyoKK2tiZC0xLjEyOgorCitzZXRmb250IFstTyBmb250K3VtYXAub3JpZ10gWy1vIGZvbnQub3JpZ10gWy1vbSBjbWFwLm9yaWddCitbLW91IHVtYXAub3JpZ10gWy1OXSBbZm9udC5uZXcgLi4uXSBbLW0gY21hcF0gWy11IHVtYXBdIFstQyBjb25zb2xlXQorWy1oTk5dIFstdl0gWy1WXQorCistaCBOTiAgT3ZlcnJpZGUgZm9udCBoZWlnaHQKKy1vIGZpbGUKKyAgICAgICBTYXZlIHByZXZpb3VzIGZvbnQgaW4gZmlsZQorLU8gZmlsZQorICAgICAgIFNhdmUgcHJldmlvdXMgZm9udCBhbmQgVW5pY29kZSBtYXAgaW4gZmlsZQorLW9tIGZpbGUKKyAgICAgICBTdG9yZSBjb25zb2xlIG1hcCBpbiBmaWxlCistb3UgZmlsZQorICAgICAgIFNhdmUgcHJldmlvdXMgVW5pY29kZSBtYXAgaW4gZmlsZQorLW0gZmlsZQorICAgICAgIExvYWQgY29uc29sZSBtYXAgb3IgVW5pY29kZSBjb25zb2xlIG1hcCBmcm9tIGZpbGUKKy11IGZpbGUKKyAgICAgICBMb2FkIFVuaWNvZGUgdGFibGUgZGVzY3JpYmluZyB0aGUgZm9udCBmcm9tIGZpbGUKKyAgICAgICBFeGFtcGxlOgorICAgICAgICMgY3A4NjYKKyAgICAgICAweDAwLTB4N2YgICAgICAgaWRlbQorICAgICAgICMKKyAgICAgICAweDgwICAgIFUrMDQxMCAgIyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgICAgMHg4MSAgICBVKzA0MTEgICMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICAgICAweDgyICAgIFUrMDQxMiAgIyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorLUMgY29uc29sZQorICAgICAgIFNldCB0aGUgZm9udCBmb3IgdGhlIGluZGljYXRlZCBjb25zb2xlCistdiAgICAgVmVyYm9zZQorLVYgICAgIFZlcnNpb24KKyovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQCitzdGF0aWMgaW50IGN0b2koY2hhciAqcykKK3sKKwlpZiAoc1swXSA9PSAnXCcnICYmIHNbMV0gIT0gJ1wwJyAmJiBzWzJdID09ICdcJycgJiYgc1szXSA9PSAnXDAnKQorCQlyZXR1cm4gc1sxXTsKKwkvLyBVKyBtZWFucyAweAorCWlmIChzWzBdID09ICdVJyAmJiBzWzFdID09ICcrJykgeworCQlzWzBdID0gJzAnOworCQlzWzFdID0gJ3gnOworCX0KKwlpZiAoIWlzZGlnaXQoc1swXSkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4geHN0cnRvdWwocywgMCk7Cit9CisjZW5kaWYKKworaW50IHNldGZvbnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldGZvbnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXNpemVfdCBsZW47CisJdW5zaWduZWQgb3B0czsKKwlpbnQgZmQ7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCWNoYXIgKm1hcGZpbGVuYW1lOworCWNvbnN0IGNoYXIgKnR0eV9uYW1lID0gQ1VSUkVOVF9UVFk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MSI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJtOkM6IiwgJm1hcGZpbGVuYW1lLCAmdHR5X25hbWUpOworCWFyZ3YgKz0gb3B0aW5kOworCisJZmQgPSB4b3Blbl9ub25ibG9ja2luZyh0dHlfbmFtZSk7CisKKwlpZiAoc2l6ZW9mKENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSKSA+IDEpIHsgLy8gaWYgbm90ICIiCisJCWlmICgqYXJndlswXSAhPSAnLycpIHsKKwkJCS8vIGdvdG8gZGVmYXVsdCBmb250cyBsb2NhdGlvbi4gZG9uJ3QgZGllIGlmIGRvZXNuJ3QgZXhpc3QKKwkJCWNoZGlyKENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSICIvY29uc29sZWZvbnRzIik7CisJCX0KKwl9CisJLy8gbG9hZCBmb250CisJbGVuID0gMzIqMTAyNDsgLy8gY2FuJ3QgYmUgbGFyZ2VyCisJYnVmZmVyID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKCphcmd2LCAmbGVuKTsKKwlpZiAoIWJ1ZmZlcikKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZSgqYXJndik7CisJZG9fbG9hZChmZCwgYnVmZmVyLCBsZW4pOworCisJLy8gbG9hZCB0aGUgc2NyZWVuIG1hcCwgaWYgYW55CisJaWYgKG9wdHMgJiAxKSB7IC8vIC1tCisJCXVuc2lnbmVkIG1vZGUgPSBQSU9fU0NSTk1BUDsKKwkJdm9pZCAqbWFwOworCisJCWlmIChzaXplb2YoQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVIpID4gMSkgeyAvLyBpZiBub3QgIiIKKwkJCWlmIChtYXBmaWxlbmFtZVswXSAhPSAnLycpIHsKKwkJCQkvLyBnb3RvIGRlZmF1bHQga2V5bWFwcyBsb2NhdGlvbgorCQkJCWNoZGlyKENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSICIvY29uc29sZXRyYW5zIik7CisJCQl9CisJCX0KKwkJLy8gZmV0Y2gga2V5bWFwCisJCW1hcCA9IHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZShtYXBmaWxlbmFtZSwgJmxlbik7CisJCWlmICghbWFwKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShtYXBmaWxlbmFtZSk7CisJCS8vIGZpbGUgc2l6ZSBpcyAyNTYgb3IgNTEyIGJ5dGVzPyAtPiBhc3N1bWUgYmluYXJ5IG1hcAorCQlpZiAobGVuID09IEVfVEFCU1ogfHwgbGVuID09IDIqRV9UQUJTWikgeworCQkJaWYgKGxlbiA9PSAyKkVfVEFCU1opCisJCQkJbW9kZSA9IFBJT19VTklTQ1JOTUFQOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUAorCQkvLyBhc3N1bWUgdGV4dHVhbCBVbmljb2RlIGNvbnNvbGUgbWFwczoKKwkJLy8gMHgwMCBVKzAwMDAgICMgIE5VTEwgKE5VTCkKKwkJLy8gMHgwMSBVKzAwMDEgICMgIFNUQVJUIE9GIEhFQURJTkcgKFNPSCkKKwkJLy8gMHgwMiBVKzAwMDIgICMgIFNUQVJUIE9GIFRFWFQgKFNUWCkKKwkJLy8gMHgwMyBVKzAwMDMgICMgIEVORCBPRiBURVhUIChFVFgpCisJCWVsc2UgeworCQkJaW50IGk7CisJCQljaGFyICp0b2tlblsyXTsKKwkJCXBhcnNlcl90ICpwYXJzZXI7CisKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQlmcmVlKG1hcCk7CisJCQltYXAgPSB4bWFsbG9jKEVfVEFCU1ogKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKworI2RlZmluZSB1bmljb2RlcyAoKHVuc2lnbmVkIHNob3J0ICopbWFwKQorCQkJLy8gZmlsbCB2YW5pbGxhIG1hcAorCQkJZm9yIChpID0gMDsgaSA8IEVfVEFCU1o7IGkrKykKKwkJCQl1bmljb2Rlc1tpXSA9IDB4ZjAwMCArIGk7CisKKwkJCXBhcnNlciA9IGNvbmZpZ19vcGVuKG1hcGZpbGVuYW1lKTsKKwkJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCB8IFBBUlNFX01JTl9ESUUpKSB7CisJCQkJLy8gcGFyc2UgY29kZS92YWx1ZSBwYWlyCisJCQkJaW50IGEgPSBjdG9pKHRva2VuWzBdKTsKKwkJCQlpbnQgYiA9IGN0b2kodG9rZW5bMV0pOworCQkJCWlmIChhIDwgMCB8fCBhID49IEVfVEFCU1oKKwkJCQkgfHwgYiA8IDAgfHwgYiA+IDY1NTM1CisJCQkJKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtYXAgZm9ybWF0Iik7CisJCQkJfQorCQkJCS8vIHBhdGNoIG1hcAorCQkJCXVuaWNvZGVzW2FdID0gYjsKKwkJCQkvLyB1bmljb2RlIGNoYXJhY3RlciBpcyBtZXQ/CisJCQkJaWYgKGIgPiAyNTUpCisJCQkJCW1vZGUgPSBQSU9fVU5JU0NSTk1BUDsKKwkJCX0KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQljb25maWdfY2xvc2UocGFyc2VyKTsKKworCQkJaWYgKG1vZGUgIT0gUElPX1VOSVNDUk5NQVApIHsKKyNkZWZpbmUgYXNjaWlzICgodW5zaWduZWQgY2hhciAqKW1hcCkKKwkJCQlmb3IgKGkgPSAwOyBpIDwgRV9UQUJTWjsgaSsrKQorCQkJCQlhc2NpaXNbaV0gPSB1bmljb2Rlc1tpXTsKKyN1bmRlZiBhc2NpaXMKKwkJCX0KKyN1bmRlZiB1bmljb2RlcworCQl9CisjZW5kaWYgLy8gRU5BQkxFX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUAorCisJCS8vIGRvIHNldCBzY3JlZW4gbWFwCisJCXhpb2N0bChmZCwgbW9kZSwgbWFwKTsKKworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKG1hcCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9sb2Fka21hcC5jIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9sb2Fka21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZmZlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL2xvYWRrbWFwLmMKQEAgLTAsMCArMSw4MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBsb2Fka21hcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBFbnJpcXVlIFphbmFyZGkgPGV6YW5hcmRpQHVsbC5lcz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsb2Fka21hcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiPCBrZXltYXAiCisvL3VzYWdlOiNkZWZpbmUgbG9hZGttYXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMb2FkIGEgYmluYXJ5IGtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gc3RkaW5cbiIKKy8qIC8vdXNhZ2U6ICAgICAiXG4JLUMgVFRZCUFmZmVjdCBUVFkgaW5zdGVhZCBvZiAvZGV2L3R0eSIgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbG9hZGttYXBfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbG9hZGttYXAgPCAvZXRjL2kxOG4vbGFuZy1rZXltYXBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgQklOQVJZX0tFWU1BUF9NQUdJQyAiYmtleW1hcCIKKworLyogRnJvbSA8bGludXgva2QuaD4gKi8KK3N0cnVjdCBrYmVudHJ5IHsKKwl1bnNpZ25lZCBjaGFyIGtiX3RhYmxlOworCXVuc2lnbmVkIGNoYXIga2JfaW5kZXg7CisJdW5zaWduZWQgc2hvcnQga2JfdmFsdWU7Cit9OworLyogc2V0cyBvbmUgZW50cnkgaW4gdHJhbnNsYXRpb24gdGFibGUgKi8KKyNkZWZpbmUgS0RTS0JFTlQgICAgICAgIDB4NEI0NworCisvKiBGcm9tIDxsaW51eC9rZXlib2FyZC5oPiAqLworI2RlZmluZSBOUl9LRVlTICAgICAgICAgMTI4CisjZGVmaW5lIE1BWF9OUl9LRVlNQVBTICAyNTYKKworaW50IGxvYWRrbWFwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsb2Fka21hcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGtiZW50cnkga2U7CisJaW50IGksIGosIGZkOworCXVpbnQxNl90IGlidWZmW05SX0tFWVNdOworLyoJY29uc3QgY2hhciAqdHR5X25hbWUgPSBDVVJSRU5UX1RUWTsgKi8KKwlSRVNFUlZFX0NPTkZJR19CVUZGRVIoZmxhZ3MsIE1BWF9OUl9LRVlNQVBTKTsKKworCS8qIFdoZW4gdXNlciBhY2NpZGVudGFsbHkgcnVucyAibG9hZGttYXAgRklMRSIKKwkgKiBpbnN0ZWFkIG9mICJsb2Fka21hcCA8RklMRSIsIHdlIGVuZCB1cCB3YWl0aW5nIGZvciBpbnB1dCBmcm9tIHR0eS4KKwkgKiBMZXQncyBwcmV2ZW50IGl0OiAqLworCWlmIChhcmd2WzFdKQorCQliYl9zaG93X3VzYWdlKCk7CisvKiBiYl93YXJuX2lnbm9yaW5nX2FyZ3MoYXJndlsxXSk7ICovCisJZmQgPSBnZXRfY29uc29sZV9mZF9vcl9kaWUoKTsKKy8qIG9yIG1heWJlOgorCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJDOiIsICZ0dHlfbmFtZSk7CisJZmQgPSB4b3Blbl9ub25ibG9ja2luZyh0dHlfbmFtZSk7CisqLworCisJeHJlYWQoU1RESU5fRklMRU5PLCBmbGFncywgNyk7CisJaWYgKHN0cm5jbXAoZmxhZ3MsIEJJTkFSWV9LRVlNQVBfTUFHSUMsIDcpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGEgdmFsaWQgYmluYXJ5IGtleW1hcCIpOworCisJeHJlYWQoU1RESU5fRklMRU5PLCBmbGFncywgTUFYX05SX0tFWU1BUFMpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9LRVlNQVBTOyBpKyspIHsKKwkJaWYgKGZsYWdzW2ldID09IDEpIHsKKwkJCXhyZWFkKFNURElOX0ZJTEVOTywgaWJ1ZmYsIE5SX0tFWVMgKiBzaXplb2YodWludDE2X3QpKTsKKwkJCWZvciAoaiA9IDA7IGogPCBOUl9LRVlTOyBqKyspIHsKKwkJCQlrZS5rYl9pbmRleCA9IGo7CisJCQkJa2Uua2JfdGFibGUgPSBpOworCQkJCWtlLmtiX3ZhbHVlID0gaWJ1ZmZbal07CisJCQkJaW9jdGwoZmQsIEtEU0tCRU5ULCAma2UpOworCQkJfQorCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWNsb3NlKGZkKTsKKwkJUkVMRUFTRV9DT05GSUdfQlVGRkVSKGZsYWdzKTsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvb3BlbnZ0LmMgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL29wZW52dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjM1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL29wZW52dC5jCkBAIC0wLDAgKzEsMTg4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgb3BlbnZ0LmMgLSBvcGVuIGEgdnQgdG8gcnVuIGEgY29tbWFuZC4KKyAqCisgKiAgYnVzeWJveGVkIGJ5IFF1eSBUb250aGF0IDxxdXlAc2lnbmFsMy5jb20+CisgKiAgaGFja2VkIGJ5IFRpdG8gPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG9wZW52dF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jIE5dIFstc3ddIFtQUk9HIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIG9wZW52dF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlN0YXJ0IFBST0cgb24gYSBuZXcgdmlydHVhbCB0ZXJtaW5hbFxuIgorLy91c2FnZTogICAgICJcbgktYyBOCVVzZSBzcGVjaWZpZWQgVlQiCisvL3VzYWdlOiAgICAgIlxuCS1zCVN3aXRjaCB0byB0aGUgVlQiCisvKiAvL3VzYWdlOiAgICAgIlxuCS1sCVJ1biBQUk9HIGFzIGxvZ2luIHNoZWxsIChieSBwcmVwZW5kaW5nICctJykiICovCisvL3VzYWdlOiAgICAgIlxuCS13CVdhaXQgZm9yIFBST0cgdG8gZXhpdCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgb3BlbnZ0X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJvcGVudnQgMiAvYmluL2FzaFxuIgorCisjaW5jbHVkZSA8bGludXgvdnQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiAiU3RhbmRhcmQiIG9wZW52dCdzIG1hbiBwYWdlICh3ZSBkbyBub3Qgc3VwcG9ydCBhbGwgb2YgdGhpcyk6CisKK29wZW52dCBbLWMgTlVNXSBbLWZzdWx2XSBbLS1dIFtjb21tYW5kIFthcmdzXV0KKworRmluZCB0aGUgZmlyc3QgYXZhaWxhYmxlIFZULCBhbmQgcnVuIGNvbW1hbmQgb24gaXQuIFN0ZGlvIGlzIGRpcmVjdGVkCit0byB0aGF0IFZULiBJZiBubyBjb21tYW5kIGlzIHNwZWNpZmllZCB0aGVuICRTSEVMTCBpcyB1c2VkLgorCistYyBOVU0KKyAgICBVc2UgdGhlIGdpdmVuIFZUIG51bWJlciwgbm90IHRoZSBmaXJzdCBmcmVlIG9uZS4KKy1mCisgICAgRm9yY2Ugb3BlbmluZyBhIFZUOiBkb24ndCB0cnkgdG8gY2hlY2sgaWYgVlQgaXMgYWxyZWFkeSBpbiB1c2UuCistcworICAgIFN3aXRjaCB0byB0aGUgbmV3IFZUIHdoZW4gc3RhcnRpbmcgdGhlIGNvbW1hbmQuCisgICAgVGhlIFZUIG9mIHRoZSBuZXcgY29tbWFuZCB3aWxsIGJlIG1hZGUgdGhlIG5ldyBjdXJyZW50IFZULgorLXUKKyAgICBGaWd1cmUgb3V0IHRoZSBvd25lciBvZiB0aGUgY3VycmVudCBWVCwgYW5kIHJ1biBsb2dpbiBhcyB0aGF0IHVzZXIuCisgICAgU3VpdGFibGUgdG8gYmUgY2FsbGVkIGJ5IGluaXQuIFNob3VsZG4ndCBiZSB1c2VkIHdpdGggLWMgb3IgLWwuCistbAorICAgIE1ha2UgdGhlIGNvbW1hbmQgYSBsb2dpbiBzaGVsbDogYSAiLSIgaXMgcHJlcGVuZGVkIHRvIHRoZSBhcmd2WzBdCisgICAgd2hlbiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorLXYKKyAgICBWZXJib3NlLgorLXcKKyAgICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLiBJZiAtdyBhbmQgLXMgYXJlIHVzZWQgdG9nZXRoZXIsCisgICAgc3dpdGNoIGJhY2sgdG8gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzLgorCitiYm94OgorLXU6IG5vdCBpbXBsZW1lbnRlZAorLWY6IGFsd2F5cyBpbiBlZmZlY3QKKy1sOiBub3QgaW1wbGVtZW50ZWQsIGlnbm9yZWQKKy12OiBpZ25vcmVkCistd3M6IGRvZXMgTk9UIHN3aXRjaCBiYWNrCisqLworCisvKiBIZWxwZXI6IGRvZXMgdGhpcyBmZCB1bmRlcnN0YW5kIFZUX3h4eD8gKi8KK3N0YXRpYyBpbnQgbm90X3Z0X2ZkKGludCBmZCkKK3sKKwlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXQ7CisJcmV0dXJuIGlvY3RsKGZkLCBWVF9HRVRTVEFURSwgJnZ0c3RhdCk7IC8qICEwOiBlcnJvciwgaXQncyBub3QgVlQgZmQgKi8KK30KKworLyogSGVscGVyOiBnZXQgYSBmZCBzdWl0YWJsZSBmb3IgVlRfeHh4ICovCitzdGF0aWMgaW50IGdldF92dF9mZCh2b2lkKQoreworCWludCBmZDsKKworCS8qIERvIHdlLCBieSBjaGFuY2UsIGFscmVhZHkgaGF2ZSBpdD8gKi8KKwlmb3IgKGZkID0gMDsgZmQgPCAzOyBmZCsrKQorCQlpZiAoIW5vdF92dF9mZChmZCkpCisJCQlyZXR1cm4gZmQ7CisJZmQgPSBvcGVuKERFVl9DT05TT0xFLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOworCWlmIChmZCA+PSAwICYmICFub3RfdnRfZmQoZmQpKQorCQlyZXR1cm4gZmQ7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgb3BlbiBWVCIpOworfQorCitzdGF0aWMgaW50IGZpbmRfZnJlZV92dG5vKHZvaWQpCit7CisJaW50IHZ0bm87CisJaW50IGZkID0gZ2V0X3Z0X2ZkKCk7CisKKwllcnJubyA9IDA7CisJLyp4ZnVuY19lcnJvcl9yZXR2YWwgPSAzOyAtIGRvIHdlIG5lZWQgY29tcGF0PyAqLworCWlmIChpb2N0bChmZCwgVlRfT1BFTlFSWSwgJnZ0bm8pICE9IDAgfHwgdnRubyA8PSAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgb3BlbiBWVCIpOworLy8gTm90IHJlYWxseSBuZWVkZWQsIGdyZXAgZm9yIERBRU1PTl9PTkxZX1NBTklUSVpFCisvLwlpZiAoZmQgPiAyKQorLy8JCWNsb3NlKGZkKTsKKwlyZXR1cm4gdnRubzsKK30KKworLyogdmZvcmsgc2NhcmVzIGdjYywgaXQgZ2VuZXJhdGVzIGJpZ2dlciBjb2RlLgorICogS2VlcCBpdCBhd2F5IGZyb20gbWFpbiBwcm9ncmFtLgorICogVE9ETzogbW92ZSB0byBsaWJiYjsgb3IgYWRhcHQgZXhpc3RpbmcgbGliYmIncyBzcGF3bigpLgorICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCB2Zm9ya19jaGlsZChjaGFyICoqYXJndikKK3sKKwlpZiAodmZvcmsoKSA9PSAwKSB7CisJCS8qIENISUxEICovCisJCS8qIFRyeSB0byBtYWtlIHRoaXMgVlQgb3VyIGNvbnRyb2xsaW5nIHR0eSAqLworCQlzZXRzaWQoKTsgLyogbG9zZSBvbGQgY3R0eSAqLworCQlpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NTQ1RUWSwgMCAvKiAwOiBkb24ndCBmb3JjaWJseSBzdGVhbCAqLyk7CisJCS8vYmJfZXJyb3JfbXNnKCJvdXIgc2lkICVkIiwgZ2V0c2lkKDApKTsKKwkJLy9iYl9lcnJvcl9tc2coIm91ciBwZ3JwICVkIiwgZ2V0cGdycCgpKTsKKwkJLy9iYl9lcnJvcl9tc2coIlZUJ3Mgc2lkICVkIiwgdGNnZXRzaWQoMCkpOworCQkvL2JiX2Vycm9yX21zZygiVlQncyBwZ3JwICVkIiwgdGNnZXRwZ3JwKDApKTsKKwkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwl9Cit9CisKK2ludCBvcGVudnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG9wZW52dF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciB2dG5hbWVbc2l6ZW9mKFZDX0ZPUk1BVCkgKyBzaXplb2YoaW50KSozXTsKKwlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXQ7CisJY2hhciAqc3RyX2M7CisJaW50IHZ0bm87CisJaW50IGZsYWdzOworCWVudW0geworCQlPUFRfYyA9ICgxIDw8IDApLAorCQlPUFRfdyA9ICgxIDw8IDEpLAorCQlPUFRfcyA9ICgxIDw8IDIpLAorCQlPUFRfbCA9ICgxIDw8IDMpLAorCQlPUFRfZiA9ICgxIDw8IDQpLAorCQlPUFRfdiA9ICgxIDw8IDUpLAorCX07CisKKwkvKiAiKyIgLSBzdG9wIG9uIGZpcnN0IG5vbi1vcHRpb24gKi8KKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICIrYzp3c2xmdiIsICZzdHJfYyk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoZmxhZ3MgJiBPUFRfYykgeworCQkvKiBDaGVjayBmb3IgaWxsZWdhbCB2dCBudW1iZXI6IDwgMSBvciA+IDYzICovCisJCXZ0bm8gPSB4YXRvdV9yYW5nZShzdHJfYywgMSwgNjMpOworCX0gZWxzZSB7CisJCXZ0bm8gPSBmaW5kX2ZyZWVfdnRubygpOworCX0KKworCS8qIEdyYWIgbmV3IFZUICovCisJc3ByaW50Zih2dG5hbWUsIFZDX0ZPUk1BVCwgdnRubyk7CisJLyogKFRyeSB0bykgY2xlYW4gdXAgc3RyYXkgb3BlbiBmZHMgYWJvdmUgZmQgMiAqLworCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fQ0xPU0VfRVhUUkFfRkRTIHwgREFFTU9OX09OTFlfU0FOSVRJWkUsIE5VTEwpOworCWNsb3NlKFNURElOX0ZJTEVOTyk7CisJLypzZXRzaWQoKTsgLSBCQUQgSURFQTogYWZ0ZXIgd2UgZXhpdCwgY2hpbGQgaXMgU0lHSFVQZWQuLi4gKi8KKwl4b3Blbih2dG5hbWUsIE9fUkRXUik7CisJeGlvY3RsKFNURElOX0ZJTEVOTywgVlRfR0VUU1RBVEUsICZ2dHN0YXQpOworCisJaWYgKGZsYWdzICYgT1BUX3MpIHsKKwkJY29uc29sZV9tYWtlX2FjdGl2ZShTVERJTl9GSUxFTk8sIHZ0bm8pOworCX0KKworCWlmICghYXJndlswXSkgeworCQlhcmd2LS07CisJCWFyZ3ZbMF0gPSAoY2hhciAqKSBnZXRfc2hlbGxfbmFtZSgpOworCQkvKmFyZ3ZbMV0gPSBOVUxMOyAtIGFscmVhZHkgaXMgKi8KKwl9CisKKwl4ZHVwMihTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCXhkdXAyKFNURElOX0ZJTEVOTywgU1RERVJSX0ZJTEVOTyk7CisKKyNpZmRlZiBCTE9BVAorCXsKKwkvKiBIYW5kbGUgLWwgKGxvZ2luIHNoZWxsKSBvcHRpb24gKi8KKwljb25zdCBjaGFyICpwcm9nID0gYXJndlswXTsKKwlpZiAoZmxhZ3MgJiBPUFRfbCkKKwkJYXJndlswXSA9IHhhc3ByaW50ZigiLSVzIiwgYXJndlswXSk7CisJfQorI2VuZGlmCisKKwl2Zm9ya19jaGlsZChhcmd2KTsKKwlpZiAoZmxhZ3MgJiBPUFRfdykgeworCQkvKiBXZSBoYXZlIG9ubHkgb25lIGNoaWxkLCB3YWl0IGZvciBpdCAqLworCQlzYWZlX3dhaXRwaWQoLTEsIE5VTEwsIDApOyAvKiBsb29wcyBvbiBFSU5UUiAqLworCQlpZiAoZmxhZ3MgJiBPUFRfcykgeworCQkJY29uc29sZV9tYWtlX2FjdGl2ZShTVERJTl9GSUxFTk8sIHZ0c3RhdC52X2FjdGl2ZSk7CisJCQkvLyBDb21wYXQ6IGV2ZW4gd2l0aCAtYyBOICh0cnkgdG8pIGRpc2FsbG9jYXRlOgorCQkJLy8gIyAvdXNyL2FwcC9rYmQtMS4xMi9iaW4vb3BlbnZ0IC1mIC1jIDkgLXdzIHNsZWVwIDUKKwkJCS8vIG9wZW52dDogY291bGQgbm90IGRlYWxsb2NhdGUgY29uc29sZSA5CisJCQl4aW9jdGwoU1RESU5fRklMRU5PLCBWVF9ESVNBTExPQ0FURSwgKHZvaWQqKShwdHJkaWZmX3QpdnRubyk7CisJCX0KKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvcmVzZXQuYyBiL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvcmVzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTk0MGJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9yZXNldC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcmVzZXQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBXcml0dGVuIGJ5IEVyaWsgQW5kZXJzZW4gYW5kIEtlbnQgUm9ib3R0aSA8cm9ib3R0aUBtZXRjb25uZWN0LmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJUVywgd2hpY2ggInN0YW5kYXJkIiBwYWNrYWdlIGhhcyB0aGlzIHV0aWxpdHk/IEl0IGRvZXNuJ3Qgc2VlbQorICogdG8gYmUgbmN1cnNlcywgY29yZXV0aWxzLCBjb25zb2xlLXRvb2xzLi4uIHRoZW4gd2hhdD8gKi8KKworLy91c2FnZTojZGVmaW5lIHJlc2V0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgcmVzZXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXNldCB0aGUgc2NyZWVuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBFU0MgIlwwMzMiCisKKyNpZiBFTkFCTEVfU1RUWQoraW50IHN0dHlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworI2VuZGlmCisKK2ludCByZXNldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmVzZXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYXJnc1tdID0geworCQkic3R0eSIsICJzYW5lIiwgTlVMTAorCX07CisKKwkvKiBubyBvcHRpb25zLCBubyBnZXRvcHQgKi8KKworCWlmICgvKmlzYXR0eShTVERJTl9GSUxFTk8pICYmKi8gaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCS8qIFNlZSAnbWFuIDQgY29uc29sZV9jb2RlcycgZm9yIGRldGFpbHM6CisJCSAqICJFU0MgYyIgICAgICAgIC0tIFJlc2V0CisJCSAqICJFU0MgKCBCIiAgICAgIC0tIFNlbGVjdCBHMCBDaGFyYWN0ZXIgU2V0IChCID0gVVMpCisJCSAqICJFU0MgWyAwIG0iICAgIC0tIFJlc2V0IGFsbCBkaXNwbGF5IGF0dHJpYnV0ZXMKKwkJICogIkVTQyBbIEoiICAgICAgLS0gRXJhc2UgdG8gdGhlIGVuZCBvZiBzY3JlZW4KKwkJICogIkVTQyBbID8gMjUgaCIgLS0gTWFrZSBjdXJzb3IgdmlzaWJsZQorCQkgKi8KKwkJcHJpbnRmKEVTQyJjIiBFU0MiKEIiIEVTQyJbMG0iIEVTQyJbSiIgRVNDIls/MjVoIik7CisJCS8qIGh0dHA6Ly9idWdzLmJ1c3lib3gubmV0L3ZpZXcucGhwP2lkPTE0MTQ6CisJCSAqIHBlb3BsZSB3YW50IGl0IHRvIHJlc2V0IGVjaG8gZXRjOiAqLworI2lmIEVOQUJMRV9TVFRZCisJCXJldHVybiBzdHR5X21haW4oMiwgKGNoYXIqKilhcmdzKTsKKyNlbHNlCisJCWV4ZWN2cCgic3R0eSIsIChjaGFyKiopYXJncyk7CisjZW5kaWYKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvcmVzaXplLmMgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL3Jlc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMGQ2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL3Jlc2l6ZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJlc2l6ZSAtIHNldCB0ZXJtaW5hbCB3aWR0aCBhbmQgaGVpZ2h0LgorICoKKyAqIENvcHlyaWdodCAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIG5vIG9wdGlvbnMsIG5vIGdldG9wdCAqLworCisvL3VzYWdlOiNkZWZpbmUgcmVzaXplX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgcmVzaXplX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVzaXplIHRoZSBzY3JlZW4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIEVTQyAiXDAzMyIKKworI2RlZmluZSBvbGRfdGVybWlvc19wICgoc3RydWN0IHRlcm1pb3MqKSZiYl9jb21tb25fYnVmc2l6MSkKKworc3RhdGljIHZvaWQKK29uaW50cihpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwl0Y3NldGF0dHIoU1RERVJSX0ZJTEVOTywgVENTQU5PVywgb2xkX3Rlcm1pb3NfcCk7CisJX2V4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworaW50IHJlc2l6ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmVzaXplX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHRlcm1pb3MgbmV3OworCXN0cnVjdCB3aW5zaXplIHcgPSB7IDAsIDAsIDAsIDAgfTsKKwlpbnQgcmV0OworCisJLyogV2UgdXNlIF9zdGRlcnJfIGluIG9yZGVyIHRvIG1ha2UgcmVzaXplIHVzYWJsZQorCSAqIGluIHNoZWxsIGJhY2t0aWNrcyAodGhvc2UgcmVkaXJlY3Qgc3Rkb3V0IGF3YXkgZnJvbSB0dHkpLgorCSAqIE5COiBvdGhlciB2ZXJzaW9ucyBvZiByZXNpemUgb3BlbiAiL2Rldi90dHkiCisJICogYW5kIG9wZXJhdGUgb24gaXQgLSBzaG91bGQgd2UgZG8gdGhlIHNhbWU/CisJICovCisKKwl0Y2dldGF0dHIoU1RERVJSX0ZJTEVOTywgb2xkX3Rlcm1pb3NfcCk7IC8qIGZpZGRsZSBlY2hvICovCisJbWVtY3B5KCZuZXcsIG9sZF90ZXJtaW9zX3AsIHNpemVvZihuZXcpKTsKKwluZXcuY19jZmxhZyB8PSAoQ0xPQ0FMIHwgQ1JFQUQpOworCW5ldy5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IEVDSE9FIHwgSVNJRyk7CisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHSU5UKQorCQkrICgxIDw8IFNJR1FVSVQpCisJCSsgKDEgPDwgU0lHVEVSTSkKKwkJKyAoMSA8PCBTSUdBTFJNKQorCQksIG9uaW50cik7CisJdGNzZXRhdHRyKFNUREVSUl9GSUxFTk8sIFRDU0FOT1csICZuZXcpOworCisJLyogc2F2ZV9jdXJzb3JfcG9zIDcKKwkgKiBzY3JvbGxfd2hvbGVfc2NyZWVuIFtyCisJICogcHV0X2N1cnNvcl93YWFhYXlfb2ZmIFskeDskeUgKKwkgKiBnZXRfY3Vyc29yX3BvcyBbNm4KKwkgKiByZXN0b3JlX2N1cnNvcl9wb3MgOAorCSAqLworCWZwcmludGYoc3RkZXJyLCBFU0MiNyIgRVNDIltyIiBFU0MiWzk5OTs5OTlIIiBFU0MiWzZuIik7CisJYWxhcm0oMyk7IC8qIEp1c3QgaW4gY2FzZSB0ZXJtaW5hbCB3b24ndCBhbnN3ZXIgKi8KKy8vQlVHOiBkZWF0aCBieSBzaWduYWwgd29uJ3QgcmVzdG9yZSB0ZXJtaW9zCisJc2NhbmYoRVNDIlslaHU7JWh1UiIsICZ3LndzX3JvdywgJncud3NfY29sKTsKKwlmcHJpbnRmKHN0ZGVyciwgRVNDIjgiKTsKKworCS8qIEJUVywgb3RoZXIgdmVyc2lvbnMgb2YgcmVzaXplIHJlY2FsY3VsYXRlIHcud3NfeHBpeGVsLCB3cy53c195cGl4ZWwKKwkgKiBieSBjYWxjdWxhdGluZyBjaGFyYWN0ZXIgY2VsbCBIeFcgZnJvbSBvbGQgdmFsdWVzCisJICogKGdvdHRlbiB2aWEgVElPQ0dXSU5TWikgYW5kIHJlY29tcHV0aW5nICpwaXhlbCB2YWx1ZXMgKi8KKwlyZXQgPSBpb2N0bChTVERFUlJfRklMRU5PLCBUSU9DU1dJTlNaLCAmdyk7CisKKwl0Y3NldGF0dHIoU1RERVJSX0ZJTEVOTywgVENTQU5PVywgb2xkX3Rlcm1pb3NfcCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfUkVTSVpFX1BSSU5UKQorCQlwcmludGYoIkNPTFVNTlM9JWQ7TElORVM9JWQ7ZXhwb3J0IENPTFVNTlMgTElORVM7XG4iLAorCQkJdy53c19jb2wsIHcud3Nfcm93KTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL3NldGNvbnNvbGUuYyBiL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvc2V0Y29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDUxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL3NldGNvbnNvbGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgc2V0Y29uc29sZS5jIC0gcmVkaXJlY3Qgc3lzdGVtIGNvbnNvbGUgb3V0cHV0CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBFbnJpayBCZXJraGFuIDxFbnJpay5CZXJraGFuQGlua2EuZGU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNldGNvbnNvbGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstciIgSUZfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUygifC0tcmVzZXQiKSAiXSBbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSBzZXRjb25zb2xlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVkaXJlY3Qgc3lzdGVtIGNvbnNvbGUgb3V0cHV0IHRvIERFVklDRSAoZGVmYXVsdDogL2Rldi90dHkpXG4iCisvL3VzYWdlOiAgICAgIlxuCS1yCVJlc2V0IG91dHB1dCB0byAvZGV2L2NvbnNvbGUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgc2V0Y29uc29sZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2V0Y29uc29sZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqZGV2aWNlID0gQ1VSUkVOVF9UVFk7CisJYm9vbCByZXNldDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TCisJc3RhdGljIGNvbnN0IGNoYXIgc2V0Y29uc29sZV9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJyZXNldFwwIiBOb19hcmd1bWVudCAiciIKKwkJOworCWFwcGxldF9sb25nX29wdGlvbnMgPSBzZXRjb25zb2xlX2xvbmdvcHRzOworI2VuZGlmCisJLyogYXQgbW9zdCBvbmUgbm9uLW9wdGlvbiBhcmd1bWVudCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xIjsKKwlyZXNldCA9IGdldG9wdDMyKGFyZ3YsICJyIik7CisKKwlhcmd2ICs9IDEgKyByZXNldDsKKwlpZiAoKmFyZ3YpIHsKKwkJZGV2aWNlID0gKmFyZ3Y7CisJfSBlbHNlIHsKKwkJaWYgKHJlc2V0KQorCQkJZGV2aWNlID0gREVWX0NPTlNPTEU7CisJfQorCisJeGlvY3RsKHhvcGVuKGRldmljZSwgT19XUk9OTFkpLCBUSU9DQ09OUywgTlVMTCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvc2V0a2V5Y29kZXMuYyBiL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvc2V0a2V5Y29kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmE3YzIzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9zZXRrZXljb2Rlcy5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNldGtleWNvZGVzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTggQW5kcmllcyBFLiBCcm91d2VyIDxhZWJAY3dpLm5sPgorICoKKyAqIEFkanVzdGVkIGZvciBCdXN5Qm94IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRrZXljb2Rlc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiU0NBTkNPREUgS0VZQ09ERS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzZXRrZXljb2Rlc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNldCBlbnRyaWVzIGludG8gdGhlIGtlcm5lbCdzIHNjYW5jb2RlLXRvLWtleWNvZGUgbWFwLFxuIgorLy91c2FnZTogICAgICAgImFsbG93aW5nIHVudXN1YWwga2V5Ym9hcmRzIHRvIGdlbmVyYXRlIHVzYWJsZSBrZXljb2Rlcy5cblxuIgorLy91c2FnZTogICAgICAgIlNDQU5DT0RFIG1heSBiZSBlaXRoZXIgeHggb3IgZTB4eCAoaGV4YWRlY2ltYWwpLFxuIgorLy91c2FnZTogICAgICAgImFuZCBLRVlDT0RFIGlzIGdpdmVuIGluIGRlY2ltYWwuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzZXRrZXljb2Rlc19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBzZXRrZXljb2RlcyBlMDMwIDEyN1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRnJvbSA8bGludXgva2QuaD4gKi8KK3N0cnVjdCBrYmtleWNvZGUgeworCXVuc2lnbmVkIHNjYW5jb2RlLCBrZXljb2RlOworfTsKK2VudW0geworCUtEU0VUS0VZQ09ERSA9IDB4NEI0RCAgLyogd3JpdGUga2VybmVsIGtleWNvZGUgdGFibGUgZW50cnkgKi8KK307CisKK2ludCBzZXRrZXljb2Rlc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2V0a2V5Y29kZXNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCXN0cnVjdCBrYmtleWNvZGUgYTsKKworCWlmICghKGFyZ2MgJiAxKSAvKiBpZiBldmVuICovIHx8IGFyZ2MgPCAyKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlmZCA9IGdldF9jb25zb2xlX2ZkX29yX2RpZSgpOworCisJd2hpbGUgKGFyZ3ZbMV0pIHsKKwkJaW50IHNjID0geHN0cnRvdWxfcmFuZ2UoYXJndlsxXSwgMTYsIDAsIDB4ZTA3Zik7CisJCWlmIChzYyA+PSAweGUwMDApIHsKKwkJCXNjIC09IDB4ZTAwMDsKKwkJCXNjICs9IDB4MDA4MDsKKwkJfQorCQlhLnNjYW5jb2RlID0gc2M7CisJCWEua2V5Y29kZSA9IHhhdG91X3JhbmdlKGFyZ3ZbMl0sIDAsIDI1NSk7CisJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGZkLCBLRFNFVEtFWUNPREUsICZhLAorCQkJImNhbid0IHNldCBTQ0FOQ09ERSAleCB0byBLRVlDT0RFICVkIiwKKwkJCXNjLCBhLmtleWNvZGUpOworCQlhcmd2ICs9IDI7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL3NldGxvZ2NvbnMuYyBiL2J1c3lib3gtMS4xOS4zL2NvbnNvbGUtdG9vbHMvc2V0bG9nY29ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYTg5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL3NldGxvZ2NvbnMuYwpAQCAtMCwwICsxLDM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZXRsb2djb25zOiBTZW5kIGtlcm5lbCBtZXNzYWdlcyB0byB0aGUgY3VycmVudCBjb25zb2xlIG9yIHRvIGNvbnNvbGUgTgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBKYW4gS2lzemthIDxqYW4ua2lzemthQHdlYi5kZT4KKyAqCisgKiBCYXNlZCBvbiBzZXRsb2djb25zIChrYmQtMS4xMikgYnkgQW5kcmllcyBFLiBCcm91d2VyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc2V0bG9nY29uc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTiIKKy8vdXNhZ2U6I2RlZmluZSBzZXRsb2djb25zX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVkaXJlY3QgdGhlIGtlcm5lbCBvdXRwdXQgdG8gY29uc29sZSBOICgwIGZvciBjdXJyZW50KSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzZXRsb2djb25zX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRsb2djb25zX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgeworCQljaGFyIGZuOworCQljaGFyIHN1YmFyZzsKKwl9IGFyZyA9IHsgMTEsIC8qIHJlZGlyZWN0IGtlcm5lbCBtZXNzYWdlcyAqLworCQkJICAwICAgLyogdG8gc3BlY2lmaWVkIGNvbnNvbGUgKGN1cnJlbnQgYXMgZGVmYXVsdCkgKi8KKwkJCX07CisKKwlpZiAoYXJndlsxXSkKKwkJYXJnLnN1YmFyZyA9IHhhdG91X3JhbmdlKGFyZ3ZbMV0sIDAsIDYzKTsKKworCXhpb2N0bCh4b3BlbihWQ18xLCBPX1JET05MWSksIFRJT0NMSU5VWCwgJmFyZyk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9zaG93a2V5LmMgYi9idXN5Ym94LTEuMTkuMy9jb25zb2xlLXRvb2xzL3Nob3drZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI3ODVlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29uc29sZS10b29scy9zaG93a2V5LmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNob3dzIGtleXMgcHJlc3NlZC4gaW5zcGlyZWQgYnkga2JkIHBhY2thZ2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNob3drZXlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYSB8IC1rIHwgLXNdIgorLy91c2FnZTojZGVmaW5lIHNob3drZXlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGtleXMgcHJlc3NlZFxuIgorLy91c2FnZTogICAgICJcbgktYQlEaXNwbGF5IGRlY2ltYWwvb2N0YWwvaGV4IHZhbHVlcyBvZiB0aGUga2V5cyIKKy8vdXNhZ2U6ICAgICAiXG4JLWsJRGlzcGxheSBpbnRlcnByZXRlZCBrZXljb2RlcyAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1zCURpc3BsYXkgcmF3IHNjYW4tY29kZXMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisKKworc3RydWN0IGdsb2JhbHMgeworCWludCBrYm1vZGU7CisJc3RydWN0IHRlcm1pb3MgdGlvLCB0aW8wOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBrYm1vZGUgKEcua2Jtb2RlKQorI2RlZmluZSB0aW8gICAgKEcudGlvKQorI2RlZmluZSB0aW8wICAgKEcudGlvMCkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKworLy8gc2V0IHJhdyB0dHkgbW9kZQorLy8gYWxzbyB1c2VkIGJ5IG1pY3JvY29tCisvLyBsaWJiYiBjYW5kaWRhdGVzPworc3RhdGljIHZvaWQgeGdldDEoc3RydWN0IHRlcm1pb3MgKnQsIHN0cnVjdCB0ZXJtaW9zICpvbGR0KQoreworCXRjZ2V0YXR0cihTVERJTl9GSUxFTk8sIG9sZHQpOworCSp0ID0gKm9sZHQ7CisJY2ZtYWtlcmF3KHQpOworfQorCitzdGF0aWMgdm9pZCB4c2V0MShzdHJ1Y3QgdGVybWlvcyAqdCkKK3sKKwlpbnQgcmV0ID0gdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQUZMVVNILCB0KTsKKwlpZiAocmV0KSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHRjc2V0YXR0ciBmb3Igc3RkaW4iKTsKKwl9Cit9CisKK2ludCBzaG93a2V5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzaG93a2V5X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJT1BUX2EgPSAoMTw8MCksIC8vIGRpc3BsYXkgdGhlIGRlY2ltYWwvb2N0YWwvaGV4IHZhbHVlcyBvZiB0aGUga2V5cworCQlPUFRfayA9ICgxPDwxKSwgLy8gZGlzcGxheSBvbmx5IHRoZSBpbnRlcnByZXRlZCBrZXljb2RlcyAoZGVmYXVsdCkKKwkJT1BUX3MgPSAoMTw8MiksIC8vIGRpc3BsYXkgb25seSB0aGUgcmF3IHNjYW4tY29kZXMKKwl9OworCisJSU5JVF9HKCk7CisKKwkvLyBGSVhNRTogYWtzIGFyZSBhbGwgbXV0dWFsbHkgZXhjbHVzaXZlCisJZ2V0b3B0MzIoYXJndiwgImFrcyIpOworCisJLy8gcHJlcGFyZSBmb3IgcmF3IG1vZGUKKwl4Z2V0MSgmdGlvLCAmdGlvMCk7CisJLy8gcHV0IHN0ZGluIGluIHJhdyBtb2RlCisJeHNldDEoJnRpbyk7CisKKyNkZWZpbmUgcHJlc3Nfa2V5cyAiUHJlc3MgYW55IGtleXMsIHByb2dyYW0gdGVybWluYXRlcyAlczpcclxuXG4iCisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9hKSB7CisJCS8vIGp1c3QgcmVhZCBzdGRpbiBjaGFyIGJ5IGNoYXIKKwkJdW5zaWduZWQgY2hhciBjOworCisJCXByaW50ZihwcmVzc19rZXlzLCAib24gRU9GIChjdHJsLUQpIik7CisKKwkJLy8gcmVhZCBhbmQgc2hvdyBieXRlIHZhbHVlcworCQl3aGlsZSAoMSA9PSByZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpKSB7CisJCQlwcmludGYoIiUzdSAwJTAzbyAweCUwMnhcclxuIiwgYywgYywgYyk7CisJCQlpZiAoMDQgLypDVFJMLUQqLyA9PSBjKQorCQkJCWJyZWFrOworCQl9CisKKwl9IGVsc2UgeworCQkvLyB3ZSBhc3N1bWUgYSBQQyBrZXlib2FyZAorCQl4aW9jdGwoU1RESU5fRklMRU5PLCBLREdLQk1PREUsICZrYm1vZGUpOworCQlwcmludGYoIktleWJvYXJkIG1vZGUgd2FzICVzLlxyXG5cbiIsCisJCQlrYm1vZGUgPT0gS19SQVcgPyAiUkFXIiA6CisJCQkJKGtibW9kZSA9PSBLX1hMQVRFID8gIlhMQVRFIiA6CisJCQkJCShrYm1vZGUgPT0gS19NRURJVU1SQVcgPyAiTUVESVVNUkFXIiA6CisJCQkJCQkoa2Jtb2RlID09IEtfVU5JQ09ERSA/ICJVTklDT0RFIiA6ICJVTktOT1dOIikpKQorCQkpOworCisJCS8vIHNldCByYXcga2V5Ym9hcmQgbW9kZQorCQl4aW9jdGwoU1RESU5fRklMRU5PLCBLRFNLQk1PREUsICh2b2lkICopKHB0cmRpZmZfdCkoKG9wdGlvbl9tYXNrMzIgJiBPUFRfaykgPyBLX01FRElVTVJBVyA6IEtfUkFXKSk7CisKKwkJLy8gd2Ugc2hvdWxkIGV4aXQgb24gYW55IHNpZ25hbDsgc2lnbmFscyBzaG91bGQgaW50ZXJydXB0IHJlYWQKKwkJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KEJCX0ZBVEFMX1NJR1MsIHJlY29yZF9zaWdubyk7CisKKwkJLy8gaW5mb3JtIHVzZXIgdGhhdCBwcm9ncmFtIGVuZHMgYWZ0ZXIgdGltZSBvZiBpbmFjdGl2aXR5CisJCXByaW50ZihwcmVzc19rZXlzLCAiMTBzIGFmdGVyIGxhc3Qga2V5cHJlc3MiKTsKKworCQkvLyByZWFkIGFuZCBzaG93IHNjYW5jb2RlcworCQl3aGlsZSAoIWJiX2dvdF9zaWduYWwpIHsKKwkJCWNoYXIgYnVmWzE4XTsKKwkJCWludCBpLCBuOworCisJCQkvLyBzZXR1cCAxMHMgd2F0Y2hkb2cKKwkJCWFsYXJtKDEwKTsKKworCQkJLy8gcmVhZCBzY2FuY29kZXMKKwkJCW4gPSByZWFkKFNURElOX0ZJTEVOTywgYnVmLCBzaXplb2YoYnVmKSk7CisJCQlpID0gMDsKKwkJCXdoaWxlIChpIDwgbikgeworCQkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3MpIHsKKwkJCQkJLy8gc2hvdyByYXcgc2NhbmNvZGVzCisJCQkJCXByaW50ZigiMHglMDJ4ICIsIGJ1ZltpKytdKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBzaG93IGludGVycHJldGVkIHNjYW5jb2RlcyAoZGVmYXVsdCkKKwkJCQkJY2hhciBjID0gYnVmW2ldOworCQkJCQlpbnQga2M7CisJCQkJCWlmIChpKzIgPCBuCisJCQkJCSAmJiAoYyAmIDB4N2YpID09IDAKKwkJCQkJICYmIChidWZbaSsxXSAmIDB4ODApICE9IDAKKwkJCQkJICYmIChidWZbaSsyXSAmIDB4ODApICE9IDAKKwkJCQkJKSB7CisJCQkJCQlrYyA9ICgoYnVmW2krMV0gJiAweDdmKSA8PCA3KSB8IChidWZbaSsyXSAmIDB4N2YpOworCQkJCQkJaSArPSAzOworCQkJCQl9IGVsc2UgeworCQkJCQkJa2MgPSAoYyAmIDB4N2YpOworCQkJCQkJaSsrOworCQkJCQl9CisJCQkJCXByaW50Zigia2V5Y29kZSAlM3UgJXMiLCBrYywgKGMgJiAweDgwKSA/ICJyZWxlYXNlIiA6ICJwcmVzcyIpOworCQkJCX0KKwkJCX0KKwkJCXB1dHMoIlxyIik7CisJCX0KKworCQkvLyByZXN0b3JlIGtleWJvYXJkIG1vZGUKKwkJeGlvY3RsKFNURElOX0ZJTEVOTywgS0RTS0JNT0RFLCAodm9pZCAqKShwdHJkaWZmX3Qpa2Jtb2RlKTsKKwl9CisKKwkvLyByZXN0b3JlIGNvbnNvbGUgc2V0dGluZ3MKKwl4c2V0MSgmdGlvMCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTE2NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSw3ODkgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkNvcmV1dGlscyIKKworSU5TRVJUCisKK2NvbmZpZyBDQUwKKwlib29sICJjYWwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2FsIGlzIHVzZWQgdG8gZGlzcGxheSBhIG1vbnRobHkgY2FsZW5kZXIuCisKK2NvbmZpZyBDQVRWCisJYm9vbCAiY2F0diIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBEaXNwbGF5IG5vbnByaW50aW5nIGNoYXJhY3RlcnMgYXMgZXNjYXBlIHNlcXVlbmNlcyAobGlrZSBzb21lCisJICBpbXBsZW1lbnRhdGlvbnMnIGNhdCAtdiBvcHRpb24pLgorCitjb25maWcgQ0hHUlAKKwlib29sICJjaGdycCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjaGdycCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZ3JvdXAgb3duZXJzaGlwIG9mIGZpbGVzLgorCitjb25maWcgQ0hNT0QKKwlib29sICJjaG1vZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjaG1vZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgYWNjZXNzIHBlcm1pc3Npb24gb2YgZmlsZXMuCisKK2NvbmZpZyBDSE9XTgorCWJvb2wgImNob3duIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNob3duIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSB1c2VyIGFuZC9vciBncm91cCBvd25lcnNoaXAKKwkgIG9mIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ0hPV04gJiYgTE9OR19PUFRTCisJaGVscAorCSAgRW5hYmxlIHVzZSBvZiBsb25nIG9wdGlvbnMKKworY29uZmlnIENIUk9PVAorCWJvb2wgImNocm9vdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjaHJvb3QgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHJvb3QgZGlyZWN0b3J5IGFuZCBydW4gYSBjb21tYW5kLgorCSAgVGhlIGRlZmF1bHQgY29tbWFuZCBpcyBgL2Jpbi9zaCcuCisKK2NvbmZpZyBDS1NVTQorCWJvb2wgImNrc3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNrc3VtIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBDUkMzMiBjaGVja3N1bSBvZiBhIGZpbGUuCisKK2NvbmZpZyBDT01NCisJYm9vbCAiY29tbSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjb21tIGlzIHVzZWQgdG8gY29tcGFyZSB0d28gZmlsZXMgbGluZSBieSBsaW5lIGFuZCByZXR1cm4KKwkgIGEgdGhyZWUtY29sdW1uIG91dHB1dC4KKworY29uZmlnIENQCisJYm9vbCAiY3AiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY3AgaXMgdXNlZCB0byBjb3B5IGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKworY29uZmlnIEZFQVRVUkVfQ1BfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyBmb3IgY3AiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDUCAmJiBMT05HX09QVFMKKwloZWxwCisJICBFbmFibGUgbG9uZyBvcHRpb25zIGZvciBjcC4KKwkgIEFsc28gYWRkIHN1cHBvcnQgZm9yIC0tcGFyZW50cyBvcHRpb24uCisKK2NvbmZpZyBDVVQKKwlib29sICJjdXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY3V0IGlzIHVzZWQgdG8gcHJpbnQgc2VsZWN0ZWQgcGFydHMgb2YgbGluZXMgZnJvbQorCSAgZWFjaCBmaWxlIHRvIHN0ZG91dC4KKworY29uZmlnIERECisJYm9vbCAiZGQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGQgY29waWVzIGEgZmlsZSAoZnJvbSBzdGFuZGFyZCBpbnB1dCB0byBzdGFuZGFyZCBvdXRwdXQsCisJICBieSBkZWZhdWx0KSB1c2luZyBzcGVjaWZpYyBpbnB1dCBhbmQgb3V0cHV0IGJsb2Nrc2l6ZXMsCisJICB3aGlsZSBvcHRpb25hbGx5IHBlcmZvcm1pbmcgY29udmVyc2lvbnMgb24gaXQuCisKK2NvbmZpZyBGRUFUVVJFX0REX1NJR05BTF9IQU5ETElORworCWJvb2wgIkVuYWJsZSBERCBzaWduYWwgaGFuZGxpbmcgZm9yIHN0YXR1cyByZXBvcnRpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERAorCWhlbHAKKwkgIFNlbmRpbmcgYSBTSUdVU1IxIHNpZ25hbCB0byBhIHJ1bm5pbmcgYGRkJyBwcm9jZXNzIG1ha2VzIGl0CisJICBwcmludCB0byBzdGFuZGFyZCBlcnJvciB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVhZCBhbmQgd3JpdHRlbgorCSAgc28gZmFyLCB0aGVuIHRvIHJlc3VtZSBjb3B5aW5nLgorCisJICAkIGRkIGlmPS9kZXYvemVybyBvZj0vZGV2L251bGwmCisJICAkIHBpZD0kISBraWxsIC1VU1IxICRwaWQ7IHNsZWVwIDE7IGtpbGwgJHBpZAorCSAgMTA4OTkyMDYrMCByZWNvcmRzIGluCisJICAxMDg5OTIwNiswIHJlY29yZHMgb3V0CisKK2NvbmZpZyBGRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FCisJYm9vbCAiRW5hYmxlIHRoZSB0aGlyZCBzdGF0dXMgbGluZSB1cG9uIHNpZ25hbCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEREICYmIEZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HCisJaGVscAorCSAgRGlzcGxheXMgYSBjb3JldXRpbHMtbGlrZSB0aGlyZCBzdGF0dXMgbGluZSB3aXRoIHRyYW5zZmVycmVkIGJ5dGVzLAorCSAgZWxhcHNlZCB0aW1lIGFuZCBzcGVlZC4KKworY29uZmlnIEZFQVRVUkVfRERfSUJTX09CUworCWJvb2wgIkVuYWJsZSBpYnMsIG9icyBhbmQgY29udiBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREQKKwloZWxwCisJICBFbmFibGVzIHN1cHBvcnQgZm9yIHdyaXRpbmcgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBpbiBhbmQgb3V0LAorCSAgYXQgYSB0aW1lLCBhbmQgcGVyZm9ybWluZyBjb252ZXJzaW9ucyBvbiB0aGUgZGF0YSBzdHJlYW0uCisKK2NvbmZpZyBERgorCWJvb2wgImRmIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGRmIHJlcG9ydHMgdGhlIGFtb3VudCBvZiBkaXNrIHNwYWNlIHVzZWQgYW5kIGF2YWlsYWJsZQorCSAgb24gZmlsZXN5c3RlbXMuCisKK2NvbmZpZyBGRUFUVVJFX0RGX0ZBTkNZCisJYm9vbCAiRW5hYmxlIC1hLCAtaSwgLUIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgLWEsIC1pIGFuZCAtQi4KKworCSAgICAtYSBTaG93IGFsbCBmaWxlc3lzdGVtcworCSAgICAtaSBJbm9kZXMKKwkgICAgLUIgPFNJWkU+IEJsb2Nrc2l6ZQorCitjb25maWcgRElSTkFNRQorCWJvb2wgImRpcm5hbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGlybmFtZSBpcyB1c2VkIHRvIHN0cmlwIGEgbm9uLWRpcmVjdG9yeSBzdWZmaXggZnJvbQorCSAgYSBmaWxlIG5hbWUuCisKK2NvbmZpZyBET1MyVU5JWAorCWJvb2wgImRvczJ1bml4L3VuaXgyZG9zIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGRvczJ1bml4IGlzIHVzZWQgdG8gY29udmVydCBhIHRleHQgZmlsZSBmcm9tIERPUyBmb3JtYXQgdG8KKwkgIFVOSVggZm9ybWF0LCBhbmQgdmljZSB2ZXJzYS4KKworY29uZmlnIFVOSVgyRE9TCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRE9TMlVOSVgKKwloZWxwCisJICB1bml4MmRvcyBpcyB1c2VkIHRvIGNvbnZlcnQgYSB0ZXh0IGZpbGUgZnJvbSBVTklYIGZvcm1hdCB0bworCSAgRE9TIGZvcm1hdCwgYW5kIHZpY2UgdmVyc2EuCisKK2NvbmZpZyBEVQorCWJvb2wgImR1IChkZWZhdWx0IGJsb2Nrc2l6ZSBvZiA1MTIgYnl0ZXMpIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGR1IGlzIHVzZWQgdG8gcmVwb3J0IHRoZSBhbW91bnQgb2YgZGlzayBzcGFjZSB1c2VkCisJICBmb3Igc3BlY2lmaWVkIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSworCWJvb2wgIlVzZSBhIGRlZmF1bHQgYmxvY2tzaXplIG9mIDEwMjQgYnl0ZXMgKDFLKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERVCisJaGVscAorCSAgVXNlIGEgYmxvY2tzaXplIG9mICgxSykgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA1MTJiLgorCitjb25maWcgRUNITworCWJvb2wgImVjaG8gKGJhc2ljIFN1U3YzIHZlcnNpb24gdGFraW5nIG5vIG9wdGlvbnMpIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGVjaG8gaXMgdXNlZCB0byBwcmludCBhIHNwZWNpZmllZCBzdHJpbmcgdG8gc3Rkb3V0LgorCisjIHRoaXMgZW50cnkgYWxzbyBhcHBlYXJzIGluIHNoZWxsL0NvbmZpZy5pbiwgbmV4dCB0byB0aGUgZWNobyBidWlsdGluCitjb25maWcgRkVBVFVSRV9GQU5DWV9FQ0hPCisJYm9vbCAiRW5hYmxlIGVjaG8gb3B0aW9ucyAoLW4gYW5kIC1lKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEVDSE8gfHwgQVNIX0JVSUxUSU5fRUNITyB8fCBIVVNICisJaGVscAorCSAgVGhpcyBhZGRzIG9wdGlvbnMgKC1uIGFuZCAtZSkgdG8gZWNoby4KKworY29uZmlnIEVOVgorCWJvb2wgImVudiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBlbnYgaXMgdXNlZCB0byBzZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHJ1bgorCSAgYSBjb21tYW5kOyB3aXRob3V0IG9wdGlvbnMgaXQgZGlzcGxheXMgdGhlIGN1cnJlbnQKKwkgIGVudmlyb25tZW50LgorCitjb25maWcgRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEVOViAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIGVudiBhcHBsZXQuCisKK2NvbmZpZyBFWFBBTkQKKwlib29sICJleHBhbmQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQnkgZGVmYXVsdCwgY29udmVydCBhbGwgdGFicyB0byBzcGFjZXMuCisKK2NvbmZpZyBGRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRVhQQU5EICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgZXhwYW5kIGFwcGxldC4KKworY29uZmlnIEVYUFIKKwlib29sICJleHByIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGV4cHIgaXMgdXNlZCB0byBjYWxjdWxhdGUgbnVtYmVycyBhbmQgcHJpbnQgdGhlIHJlc3VsdAorCSAgdG8gc3RhbmRhcmQgb3V0cHV0LgorCitjb25maWcgRVhQUl9NQVRIX1NVUFBPUlRfNjQKKwlib29sICJFeHRlbmQgUG9zaXggbnVtYmVycyBzdXBwb3J0IHRvIDY0IGJpdCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEVYUFIKKwloZWxwCisJICBFbmFibGUgNjQtYml0IG1hdGggc3VwcG9ydCBpbiB0aGUgZXhwciBhcHBsZXQuIFRoaXMgd2lsbCBtYWtlCisJICB0aGUgYXBwbGV0IHNsaWdodGx5IGxhcmdlciwgYnV0IHdpbGwgYWxsb3cgY29tcHV0YXRpb24gd2l0aCB2ZXJ5CisJICBsYXJnZSBudW1iZXJzLgorCitjb25maWcgRkFMU0UKKwlib29sICJmYWxzZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBmYWxzZSByZXR1cm5zIGFuIGV4aXQgY29kZSBvZiBGQUxTRSAoMSkuCisKK2NvbmZpZyBGT0xECisJYm9vbCAiZm9sZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXcmFwIHRleHQgdG8gZml0IGEgc3BlY2lmaWMgd2lkdGguCisKK2NvbmZpZyBGU1lOQworCWJvb2wgImZzeW5jIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGZzeW5jIGlzIHVzZWQgdG8gZmx1c2ggZmlsZS1yZWxhdGVkIGNhY2hlZCBibG9ja3MgdG8gZGlzay4KKworY29uZmlnIEhFQUQKKwlib29sICJoZWFkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGhlYWQgaXMgdXNlZCB0byBwcmludCB0aGUgZmlyc3Qgc3BlY2lmaWVkIG51bWJlciBvZiBsaW5lcworCSAgZnJvbSBmaWxlcy4KKworY29uZmlnIEZFQVRVUkVfRkFOQ1lfSEVBRAorCWJvb2wgIkVuYWJsZSBoZWFkIG9wdGlvbnMgKC1jLCAtcSwgYW5kIC12KSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhFQUQKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIGhlYWQgb3B0aW9ucyAoLWMsIC1xLCBhbmQgLXYpLgorCitjb25maWcgSE9TVElECisJYm9vbCAiaG9zdGlkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGhvc3RpZCBwcmludHMgdGhlIG51bWVyaWMgaWRlbnRpZmllciAoaW4gaGV4YWRlY2ltYWwpIGZvcgorCSAgdGhlIGN1cnJlbnQgaG9zdC4KKworY29uZmlnIElOU1RBTEwKKwlib29sICJpbnN0YWxsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvcHkgZmlsZXMgYW5kIHNldCBhdHRyaWJ1dGVzLgorCitjb25maWcgRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTlNUQUxMICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgaW5zdGFsbCBhcHBsZXQuCisKKyMjIyNjb25maWcgTEVOR1RICisjIyMjCWJvb2wgImxlbmd0aCIKKyMjIyMJZGVmYXVsdCB5CisjIyMjCWhlbHAKKyMjIyMJICBsZW5ndGggaXMgdXNlZCB0byBwcmludCBvdXQgdGhlIGxlbmd0aCBvZiBhIHNwZWNpZmllZCBzdHJpbmcuCisKK2NvbmZpZyBMTgorCWJvb2wgImxuIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxuIGlzIHVzZWQgdG8gY3JlYXRlIGhhcmQgb3Igc29mdCBsaW5rcyBiZXR3ZWVuIGZpbGVzLgorCitjb25maWcgTE9HTkFNRQorCWJvb2wgImxvZ25hbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbG9nbmFtZSBpcyB1c2VkIHRvIHByaW50IHRoZSBjdXJyZW50IHVzZXIncyBsb2dpbiBuYW1lLgorCitjb25maWcgTFMKKwlib29sICJscyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBscyBpcyB1c2VkIHRvIGxpc3QgdGhlIGNvbnRlbnRzIG9mIGRpcmVjdG9yaWVzLgorCitjb25maWcgRkVBVFVSRV9MU19GSUxFVFlQRVMKKwlib29sICJFbmFibGUgZmlsZXR5cGluZyBvcHRpb25zICgtcCBhbmQgLUYpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMKKwloZWxwCisJICBFbmFibGUgdGhlIGxzIG9wdGlvbnMgKC1wIGFuZCAtRikuCisKK2NvbmZpZyBGRUFUVVJFX0xTX0ZPTExPV0xJTktTCisJYm9vbCAiRW5hYmxlIHN5bWxpbmtzIGRlcmVmZXJlbmNpbmcgKC1MKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTCisJaGVscAorCSAgRW5hYmxlIHRoZSBscyBvcHRpb24gKC1MKS4KKworY29uZmlnIEZFQVRVUkVfTFNfUkVDVVJTSVZFCisJYm9vbCAiRW5hYmxlIHJlY3Vyc2lvbiAoLVIpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMKKwloZWxwCisJICBFbmFibGUgdGhlIGxzIG9wdGlvbiAoLVIpLgorCitjb25maWcgRkVBVFVSRV9MU19TT1JURklMRVMKKwlib29sICJTb3J0IHRoZSBmaWxlIG5hbWVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMKKwloZWxwCisJICBBbGxvdyBscyB0byBzb3J0IGZpbGUgbmFtZXMgYWxwaGFiZXRpY2FsbHkuCisKK2NvbmZpZyBGRUFUVVJFX0xTX1RJTUVTVEFNUFMKKwlib29sICJTaG93IGZpbGUgdGltZXN0YW1wcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTCisJaGVscAorCSAgQWxsb3cgbHMgdG8gZGlzcGxheSB0aW1lc3RhbXBzIGZvciBmaWxlcy4KKworY29uZmlnIEZFQVRVUkVfTFNfVVNFUk5BTUUKKwlib29sICJTaG93IHVzZXJuYW1lL2dyb3VwbmFtZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEFsbG93IGxzIHRvIGRpc3BsYXkgdXNlcm5hbWUvZ3JvdXBuYW1lIGZvciBmaWxlcy4KKworY29uZmlnIEZFQVRVUkVfTFNfQ09MT1IKKwlib29sICJBbGxvdyB1c2Ugb2YgY29sb3IgdG8gaWRlbnRpZnkgZmlsZSB0eXBlcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgLS1jb2xvciBvcHRpb24gdG8gbHMuCisKK2NvbmZpZyBGRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQKKwlib29sICJQcm9kdWNlIGNvbG9yZWQgbHMgb3V0cHV0IGJ5IGRlZmF1bHQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0xTX0NPTE9SCisJaGVscAorCSAgU2F5aW5nIHllcyBoZXJlIHdpbGwgdHVybiBjb2xvcmluZyBvbiBieSBkZWZhdWx0LAorCSAgZXZlbiBpZiBubyAiLS1jb2xvciIgb3B0aW9uIGlzIGdpdmVuIHRvIHRoZSBscyBjb21tYW5kLgorCSAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQsIHNpbmNlIHRoZSBjb2xvcnMgYXJlIG5vdAorCSAgY29uZmlndXJhYmxlLCBhbmQgdGhlIG91dHB1dCBtYXkgbm90IGJlIGxlZ2libGUgb24KKwkgIG1hbnkgb3V0cHV0IHNjcmVlbnMuCisKK2NvbmZpZyBNRDVTVU0KKwlib29sICJtZDVzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgbWQ1c3VtIGlzIHVzZWQgdG8gcHJpbnQgb3IgY2hlY2sgTUQ1IGNoZWNrc3Vtcy4KKworY29uZmlnIE1LRElSCisJYm9vbCAibWtkaXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbWtkaXIgaXMgdXNlZCB0byBjcmVhdGUgZGlyZWN0b3JpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzLgorCitjb25maWcgRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTUtESVIgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBta2RpciBhcHBsZXQuCisKK2NvbmZpZyBNS0ZJRk8KKwlib29sICJta2ZpZm8iCisJZGVmYXVsdCB5CisJaGVscAorCSAgbWtmaWZvIGlzIHVzZWQgdG8gY3JlYXRlIEZJRk9zIChuYW1lZCBwaXBlcykuCisJICBUaGUgYG1rbm9kJyBwcm9ncmFtIGNhbiBhbHNvIGNyZWF0ZSBGSUZPcy4KKworY29uZmlnIE1LTk9ECisJYm9vbCAibWtub2QiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbWtub2QgaXMgdXNlZCB0byBjcmVhdGUgRklGT3Mgb3IgYmxvY2svY2hhcmFjdGVyIHNwZWNpYWwKKwkgIGZpbGVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lcy4KKworY29uZmlnIE1WCisJYm9vbCAibXYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbXYgaXMgdXNlZCB0byBtb3ZlIG9yIHJlbmFtZSBmaWxlcyBvciBkaXJlY3Rvcmllcy4KKworY29uZmlnIEZFQVRVUkVfTVZfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1WICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgbXYgYXBwbGV0LgorCitjb25maWcgTklDRQorCWJvb2wgIm5pY2UiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbmljZSBydW5zIGEgcHJvZ3JhbSB3aXRoIG1vZGlmaWVkIHNjaGVkdWxpbmcgcHJpb3JpdHkuCisKK2NvbmZpZyBOT0hVUAorCWJvb2wgIm5vaHVwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJ1biBhIGNvbW1hbmQgaW1tdW5lIHRvIGhhbmd1cHMsIHdpdGggb3V0cHV0IHRvIGEgbm9uLXR0eS4KKworY29uZmlnIE9ECisJYm9vbCAib2QiCisJZGVmYXVsdCB5CisJaGVscAorCSAgb2QgaXMgdXNlZCB0byBkdW1wIGJpbmFyeSBmaWxlcyBpbiBvY3RhbCBhbmQgb3RoZXIgZm9ybWF0cy4KKworY29uZmlnIFBSSU5URU5WCisJYm9vbCAicHJpbnRlbnYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcHJpbnRlbnYgaXMgdXNlZCB0byBwcmludCBhbGwgb3IgcGFydCBvZiBlbnZpcm9ubWVudC4KKworY29uZmlnIFBSSU5URgorCWJvb2wgInByaW50ZiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBwcmludGYgaXMgdXNlZCB0byBmb3JtYXQgYW5kIHByaW50IHNwZWNpZmllZCBzdHJpbmdzLgorCSAgSXQncyBzaW1pbGFyIHRvIGBlY2hvJyBleGNlcHQgaXQgaGFzIG1vcmUgb3B0aW9ucy4KKworY29uZmlnIFBXRAorCWJvb2wgInB3ZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBwd2QgaXMgdXNlZCB0byBwcmludCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKK2NvbmZpZyBSRUFETElOSworCWJvb2wgInJlYWRsaW5rIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSByZWFkcyBhIHN5bWJvbGljIGxpbmsgYW5kIHJldHVybnMgdGhlIG5hbWUKKwkgIG9mIHRoZSBmaWxlIGl0IHBvaW50cyB0bworCitjb25maWcgRkVBVFVSRV9SRUFETElOS19GT0xMT1cKKwlib29sICJFbmFibGUgY2Fub25pY2FsaXphdGlvbiBieSBmb2xsb3dpbmcgYWxsIHN5bWxpbmtzICgtZikiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSRUFETElOSworCWhlbHAKKwkgIEVuYWJsZSB0aGUgcmVhZGxpbmsgb3B0aW9uICgtZikuCisKK2NvbmZpZyBSRUFMUEFUSAorCWJvb2wgInJlYWxwYXRoIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJldHVybiB0aGUgY2Fub25pY2FsaXplZCBhYnNvbHV0ZSBwYXRobmFtZS4KKwkgIFRoaXMgaXNuJ3QgcHJvdmlkZWQgYnkgR05VIHNoZWxsdXRpbHMsIGJ1dCB3aGVyZSBlbHNlIGRvZXMgaXQgYmVsb25nLgorCitjb25maWcgUk0KKwlib29sICJybSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBybSBpcyB1c2VkIHRvIHJlbW92ZSBmaWxlcyBvciBkaXJlY3Rvcmllcy4KKworY29uZmlnIFJNRElSCisJYm9vbCAicm1kaXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcm1kaXIgaXMgdXNlZCB0byByZW1vdmUgZW1wdHkgZGlyZWN0b3JpZXMuCisKK2NvbmZpZyBGRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSTURJUiAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHJtZGlyIGFwcGxldCwgaW5jbHVkaW5nCisJICAtLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEdOVSBybWRpci4KKworY29uZmlnIFNFUQorCWJvb2wgInNlcSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBwcmludCBhIHNlcXVlbmNlIG9mIG51bWJlcnMKKworY29uZmlnIFNIQTFTVU0KKwlib29sICJzaGExc3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvbXB1dGUgYW5kIGNoZWNrIFNIQTEgbWVzc2FnZSBkaWdlc3QKKworY29uZmlnIFNIQTI1NlNVTQorCWJvb2wgInNoYTI1NnN1bSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDb21wdXRlIGFuZCBjaGVjayBTSEEyNTYgbWVzc2FnZSBkaWdlc3QKKworY29uZmlnIFNIQTUxMlNVTQorCWJvb2wgInNoYTUxMnN1bSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDb21wdXRlIGFuZCBjaGVjayBTSEE1MTIgbWVzc2FnZSBkaWdlc3QKKworY29uZmlnIFNMRUVQCisJYm9vbCAic2xlZXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc2xlZXAgaXMgdXNlZCB0byBwYXVzZSBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMuCisJICBJdCBjb21lcyBpbiAzIHZlcnNpb25zOgorCSAgLSBzbWFsbDogdGFrZXMgb25lIGludGVnZXIgcGFyYW1ldGVyCisJICAtIGZhbmN5OiB0YWtlcyBtdWx0aXBsZSBpbnRlZ2VyIGFyZ3VtZW50cyB3aXRoIHN1ZmZpeGVzOgorCSAgICBzbGVlcCAxZCAyaCAzbSAxNXMKKwkgIC0gZmFuY3kgd2l0aCBmcmFjdGlvbmFsIG51bWJlcnM6CisJICAgIHNsZWVwIDIuM3MgNC41aCBzbGVlcHMgZm9yIDE2MjAyLjMgc2Vjb25kcworCSAgTGFzdCBvbmUgaXMgInRoZSBtb3N0IGNvbXBhdGlibGUiIHdpdGggY29yZXV0aWxzIHNsZWVwLAorCSAgYnV0IGl0IGFkZHMgYXJvdW5kIDFrIG9mIGNvZGUuCisKK2NvbmZpZyBGRUFUVVJFX0ZBTkNZX1NMRUVQCisJYm9vbCAiRW5hYmxlIG11bHRpcGxlIGFyZ3VtZW50cyBhbmQgcy9tL2gvZCBzdWZmaXhlcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNMRUVQCisJaGVscAorCSAgQWxsb3cgc2xlZXAgdG8gcGF1c2UgZm9yIHNwZWNpZmllZCBtaW51dGVzLCBob3VycywgYW5kIGRheXMuCisKK2NvbmZpZyBGRUFUVVJFX0ZMT0FUX1NMRUVQCisJYm9vbCAiRW5hYmxlIGZyYWN0aW9uYWwgYXJndW1lbnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9GQU5DWV9TTEVFUAorCWhlbHAKKwkgIEFsbG93IGZvciBmcmFjdGlvbmFsIG51bWVyaWMgcGFyYW1ldGVycy4KKworY29uZmlnIFNPUlQKKwlib29sICJzb3J0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHNvcnQgaXMgdXNlZCB0byBzb3J0IGxpbmVzIG9mIHRleHQgaW4gc3BlY2lmaWVkIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9TT1JUX0JJRworCWJvb2wgIkZ1bGwgU3VTdjMgY29tcGxpYW50IHNvcnQgKHN1cHBvcnQgLWt0Y3NiZGZpb3pnTSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTT1JUCisJaGVscAorCSAgV2l0aG91dCB0aGlzLCBzb3J0IG9ubHkgc3VwcG9ydHMgLXIsIC11LCBhbmQgYW4gaW50ZWdlciB2ZXJzaW9uCisJICBvZiAtbi4gU2VsZWN0aW5nIHRoaXMgYWRkcyBzb3J0IGtleXMsIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQsIGFuZAorCSAgbW9yZS4gVGhpcyBhZGRzIGEgbGl0dGxlIG92ZXIgM2sgdG8gYSBub25zdGF0aWMgYnVpbGQgb24geDg2LgorCisJICBUaGUgU3VTdjMgc29ydCBzdGFuZGFyZCBpcyBhdmFpbGFibGUgYXQ6CisJICBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3NvcnQuaHRtbAorCitjb25maWcgU1BMSVQKKwlib29sICJzcGxpdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzcGxpdCBhIGZpbGUgaW50byBwaWVjZXMuCisKK2NvbmZpZyBGRUFUVVJFX1NQTElUX0ZBTkNZCisJYm9vbCAiRmFuY3kgZXh0ZW5zaW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNQTElUCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIGZlYXR1cmVzIG5vdCByZXF1aXJlZCBieSBTVVN2My4KKwkgIFN1cHBvcnRzIGFkZGl0aW9uYWwgc3VmZml4ZXMgJ2InIGZvciA1MTIgYnl0ZXMsCisJICAnZycgZm9yIDFHaUIgZm9yIHRoZSAtYiBvcHRpb24uCisKK2NvbmZpZyBTVEFUCisJYm9vbCAic3RhdCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVggIyBzdGF0ZnMoKQorCWhlbHAKKwkgIGRpc3BsYXkgZmlsZSBvciBmaWxlc3lzdGVtIHN0YXR1cy4KKworY29uZmlnIEZFQVRVUkVfU1RBVF9GT1JNQVQKKwlib29sICJFbmFibGUgY3VzdG9tIGZvcm1hdHMgKC1jKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNUQVQKKwloZWxwCisJICBXaXRob3V0IHRoaXMsIHN0YXQgd2lsbCBub3Qgc3VwcG9ydCB0aGUgJy1jIGZvcm1hdCcgb3B0aW9uIHdoZXJlCisJICB1c2VycyBjYW4gcGFzcyBhIGN1c3RvbSBmb3JtYXQgc3RyaW5nIGZvciBvdXRwdXQuIFRoaXMgYWRkcyBhYm91dAorCSAgN2sgdG8gYSBub25zdGF0aWMgYnVpbGQgb24gYW1kNjQuCisKK2NvbmZpZyBTVFRZCisJYm9vbCAic3R0eSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzdHR5IGlzIHVzZWQgdG8gY2hhbmdlIGFuZCBwcmludCB0ZXJtaW5hbCBsaW5lIHNldHRpbmdzLgorCitjb25maWcgU1VNCisJYm9vbCAic3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNoZWNrc3VtIGFuZCBjb3VudCB0aGUgYmxvY2tzIGluIGEgZmlsZQorCitjb25maWcgU1lOQworCWJvb2wgInN5bmMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc3luYyBpcyB1c2VkIHRvIGZsdXNoIGZpbGVzeXN0ZW0gYnVmZmVycy4KKworY29uZmlnIFRBQworCWJvb2wgInRhYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0YWMgaXMgdXNlZCB0byBjb25jYXRlbmF0ZSBhbmQgcHJpbnQgZmlsZXMgaW4gcmV2ZXJzZS4KKworY29uZmlnIFRBSUwKKwlib29sICJ0YWlsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRhaWwgaXMgdXNlZCB0byBwcmludCB0aGUgbGFzdCBzcGVjaWZpZWQgbnVtYmVyIG9mIGxpbmVzCisJICBmcm9tIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9GQU5DWV9UQUlMCisJYm9vbCAiRW5hYmxlIGV4dHJhIHRhaWwgb3B0aW9ucyAoLXEsIC1zLCAtdiwgYW5kIC1GKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBSUwKKwloZWxwCisJICBUaGUgb3B0aW9ucyAoLXEsIC1zLCBhbmQgLXYpIGFyZSBwcm92aWRlZCBieSBHTlUgdGFpbCwgYnV0CisJICBhcmUgbm90IHNwZWNpZmljIGluIHRoZSBTVVN2MyBzdGFuZGFyZC4KKworCSAgICAtcSAgICAgIE5ldmVyIG91dHB1dCBoZWFkZXJzIGdpdmluZyBmaWxlIG5hbWVzCisJICAgIC1zIFNFQyAgV2FpdCBTRUMgc2Vjb25kcyBiZXR3ZWVuIHJlYWRzIHdpdGggLWYKKwkgICAgLXYgICAgICBBbHdheXMgb3V0cHV0IGhlYWRlcnMgZ2l2aW5nIGZpbGUgbmFtZXMKKworY29uZmlnIFRFRQorCWJvb2wgInRlZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0ZWUgaXMgdXNlZCB0byByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlCisJICB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPCisJYm9vbCAiRW5hYmxlIGJsb2NrIEkvTyAobGFyZ2VyL2Zhc3RlcikgaW5zdGVhZCBvZiBieXRlIEkvTyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRFRQorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiBmb3IgYSBmYXN0ZXIgdGVlLCBhdCBleHBlbnNlIG9mIHNpemUuCisKK2NvbmZpZyBUUlVFCisJYm9vbCAidHJ1ZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0cnVlIHJldHVybnMgYW4gZXhpdCBjb2RlIG9mIFRSVUUgKDApLgorCitjb25maWcgVFRZCisJYm9vbCAidHR5IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHR0eSBpcyB1c2VkIHRvIHByaW50IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRlcm1pbmFsIHRvCisJICBzdGFuZGFyZCBvdXRwdXQuCisKK2NvbmZpZyBVTkFNRQorCWJvb2wgInVuYW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVuYW1lIGlzIHVzZWQgdG8gcHJpbnQgc3lzdGVtIGluZm9ybWF0aW9uLgorCitjb25maWcgVU5FWFBBTkQKKwlib29sICJ1bmV4cGFuZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCeSBkZWZhdWx0LCBjb252ZXJ0IG9ubHkgbGVhZGluZyBzZXF1ZW5jZXMgb2YgYmxhbmtzIHRvIHRhYnMuCisKK2NvbmZpZyBGRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVTkVYUEFORCAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHVuZXhwYW5kIGFwcGxldC4KKworY29uZmlnIFVOSVEKKwlib29sICJ1bmlxIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVuaXEgaXMgdXNlZCB0byByZW1vdmUgZHVwbGljYXRlIGxpbmVzIGZyb20gYSBzb3J0ZWQgZmlsZS4KKworY29uZmlnIFVTTEVFUAorCWJvb2wgInVzbGVlcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1c2xlZXAgaXMgdXNlZCB0byBwYXVzZSBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcy4KKworY29uZmlnIFVVREVDT0RFCisJYm9vbCAidXVkZWNvZGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdXVkZWNvZGUgaXMgdXNlZCB0byBkZWNvZGUgYSB1dWVuY29kZWQgZmlsZS4KKworY29uZmlnIFVVRU5DT0RFCisJYm9vbCAidXVlbmNvZGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdXVlbmNvZGUgaXMgdXNlZCB0byB1dWVuY29kZSBhIGZpbGUuCisKK2NvbmZpZyBXQworCWJvb2wgIndjIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHdjIGlzIHVzZWQgdG8gcHJpbnQgdGhlIG51bWJlciBvZiBieXRlcywgd29yZHMsIGFuZCBsaW5lcywKKwkgIGluIHNwZWNpZmllZCBmaWxlcy4KKworY29uZmlnIEZFQVRVUkVfV0NfTEFSR0UKKwlib29sICJTdXBwb3J0IHZlcnkgbGFyZ2UgZmlsZXMgaW4gd2MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBXQworCWhlbHAKKwkgIFVzZSAidW5zaWduZWQgbG9uZyBsb25nIiBpbiB3YyBmb3IgY291bnRlciB2YXJpYWJsZXMuCisKK2NvbmZpZyBXSE9BTUkKKwlib29sICJ3aG9hbWkiCisJZGVmYXVsdCB5CisJaGVscAorCSAgd2hvYW1pIGlzIHVzZWQgdG8gcHJpbnQgdGhlIHVzZXJuYW1lIG9mIHRoZSBjdXJyZW50CisJICB1c2VyIGlkIChzYW1lIGFzIGlkIC11bikuCisKK2NvbmZpZyBZRVMKKwlib29sICJ5ZXMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgeWVzIGlzIHVzZWQgdG8gcmVwZWF0ZWRseSBvdXRwdXQgYSBzcGVjaWZpYyBzdHJpbmcsIG9yCisJICB0aGUgZGVmYXVsdCBzdHJpbmcgYHknLgorCitjb21tZW50ICJDb21tb24gb3B0aW9ucyBmb3IgY3AgYW5kIG12IgorCWRlcGVuZHMgb24gQ1AgfHwgTVYKKworY29uZmlnIEZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTCisJYm9vbCAiUHJlc2VydmUgaGFyZCBsaW5rcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENQIHx8IE1WCisJaGVscAorCSAgQWxsb3cgY3AgYW5kIG12IHRvIHByZXNlcnZlIGhhcmQgbGlua3MuCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBscywgbW9yZSBhbmQgdGVsbmV0IgorCWRlcGVuZHMgb24gTFMgfHwgTU9SRSB8fCBURUxORVQKKworY29uZmlnIEZFQVRVUkVfQVVUT1dJRFRICisJYm9vbCAiQ2FsY3VsYXRlIHRlcm1pbmFsICYgY29sdW1uIHdpZHRocyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTIHx8IE1PUkUgfHwgVEVMTkVUCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHV0aWxpdGllcyBzdWNoIGFzICdscycsICdtb3JlJyBhbmQgJ3RlbG5ldCcKKwkgIHRvIGRldGVybWluZSB0aGUgd2lkdGggb2YgdGhlIHNjcmVlbiwgd2hpY2ggY2FuIGFsbG93IHRoZW0gdG8KKwkgIGRpc3BsYXkgYWRkaXRpb25hbCB0ZXh0IG9yIGF2b2lkIHdyYXBwaW5nIHRleHQgb250byB0aGUgbmV4dCBsaW5lLgorCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIHlvdXIgdXRpbGl0aWVzIHdpbGwgYmUgZXNwZWNpYWxseQorCSAgcHJpbWl0aXZlIGFuZCB3aWxsIGJlIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHdpZHRoLgorCitjb21tZW50ICJDb21tb24gb3B0aW9ucyBmb3IgZGYsIGR1LCBscyIKKwlkZXBlbmRzIG9uIERGIHx8IERVIHx8IExTCisKK2NvbmZpZyBGRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJYm9vbCAiU3VwcG9ydCBmb3IgaHVtYW4gcmVhZGFibGUgb3V0cHV0IChleGFtcGxlIDEzaywgMjNNLCAyMzVHKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERGIHx8IERVIHx8IExTCisJaGVscAorCSAgQWxsb3cgZGYsIGR1LCBhbmQgbHMgdG8gaGF2ZSBodW1hbiByZWFkYWJsZSBvdXRwdXQuCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBtZDVzdW0sIHNoYTFzdW0sIHNoYTI1NnN1bSwgc2hhNTEyc3VtIgorCWRlcGVuZHMgb24gTUQ1U1VNIHx8IFNIQTFTVU0gfHwgU0hBMjU2U1VNIHx8IFNIQTUxMlNVTQorCitjb25maWcgRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0sKKwlib29sICJFbmFibGUgLWMsIC1zIGFuZCAtdyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTUQ1U1VNIHx8IFNIQTFTVU0gfHwgU0hBMjU2U1VNIHx8IFNIQTUxMlNVTQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoZSAtYyBvcHRpb25zIGFsbG93cyBmaWxlcyB0byBiZSBjaGVja2VkCisJICBhZ2FpbnN0IHByZS1jYWxjdWxhdGVkIGhhc2ggdmFsdWVzLgorCisJICAtcyBhbmQgLXcgYXJlIHVzZWZ1bCBvcHRpb25zIHdoZW4gdmVyaWZ5aW5nIGNoZWNrc3Vtcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2Q4OGIzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw4NiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYnMteQkJCSs9IGxpYmNvcmV1dGlscy8KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19DQUwpICAgICAgICs9IGNhbC5vCitsaWItJChDT05GSUdfQ0FUVikgICAgICArPSBjYXR2Lm8KK2xpYi0kKENPTkZJR19DSEdSUCkgICAgICs9IGNoZ3JwLm8gY2hvd24ubworbGliLSQoQ09ORklHX0NITU9EKSAgICAgKz0gY2htb2QubworbGliLSQoQ09ORklHX0NIT1dOKSAgICAgKz0gY2hvd24ubworbGliLSQoQ09ORklHX0FERFVTRVIpICAgKz0gY2hvd24ubyAjIHVzZWQgYnkgYWRkdXNlcgorbGliLSQoQ09ORklHX0FEREdST1VQKSAgKz0gY2hvd24ubyAjIHVzZWQgYnkgYWRkdXNlcgorbGliLSQoQ09ORklHX0NIUk9PVCkgICAgKz0gY2hyb290Lm8KK2xpYi0kKENPTkZJR19DS1NVTSkgICAgICs9IGNrc3VtLm8KK2xpYi0kKENPTkZJR19DT01NKSAgICAgICs9IGNvbW0ubworbGliLSQoQ09ORklHX0NQKSAgICAgICAgKz0gY3AubworbGliLSQoQ09ORklHX0NVVCkgICAgICAgKz0gY3V0Lm8KK2xpYi0kKENPTkZJR19ERCkgICAgICAgICs9IGRkLm8KK2xpYi0kKENPTkZJR19ERikgICAgICAgICs9IGRmLm8KK2xpYi0kKENPTkZJR19ESVJOQU1FKSAgICs9IGRpcm5hbWUubworbGliLSQoQ09ORklHX0RPUzJVTklYKSAgKz0gZG9zMnVuaXgubworbGliLSQoQ09ORklHX0RVKSAgICAgICAgKz0gZHUubworbGliLSQoQ09ORklHX0VDSE8pICAgICAgKz0gZWNoby5vCitsaWItJChDT05GSUdfQVNIKSAgICAgICArPSBlY2hvLm8gIyB1c2VkIGJ5IGFzaAorbGliLSQoQ09ORklHX0hVU0gpICAgICAgKz0gZWNoby5vICMgdXNlZCBieSBodXNoCitsaWItJChDT05GSUdfRU5WKSAgICAgICArPSBlbnYubworbGliLSQoQ09ORklHX0VYUFIpICAgICAgKz0gZXhwci5vCitsaWItJChDT05GSUdfRVhQQU5EKSAgICArPSBleHBhbmQubworbGliLSQoQ09ORklHX0ZBTFNFKSAgICAgKz0gZmFsc2UubworbGliLSQoQ09ORklHX0ZPTEQpICAgICAgKz0gZm9sZC5vCitsaWItJChDT05GSUdfRlNZTkMpICAgICArPSBmc3luYy5vCitsaWItJChDT05GSUdfSEVBRCkgICAgICArPSBoZWFkLm8KK2xpYi0kKENPTkZJR19IT1NUSUQpICAgICs9IGhvc3RpZC5vCitsaWItJChDT05GSUdfSU5TVEFMTCkgICArPSBpbnN0YWxsLm8KKyNsaWItJChDT05GSUdfTEVOR1RIKSAgICArPSBsZW5ndGgubworbGliLSQoQ09ORklHX0xOKSAgICAgICAgKz0gbG4ubworbGliLSQoQ09ORklHX0xPR05BTUUpICAgKz0gbG9nbmFtZS5vCitsaWItJChDT05GSUdfTFMpICAgICAgICArPSBscy5vCitsaWItJChDT05GSUdfRlRQRCkgICAgICArPSBscy5vCitsaWItJChDT05GSUdfTUQ1U1VNKSAgICArPSBtZDVfc2hhMV9zdW0ubworbGliLSQoQ09ORklHX01LRElSKSAgICAgKz0gbWtkaXIubworbGliLSQoQ09ORklHX01LRklGTykgICAgKz0gbWtmaWZvLm8KK2xpYi0kKENPTkZJR19NS05PRCkgICAgICs9IG1rbm9kLm8KK2xpYi0kKENPTkZJR19NVikgICAgICAgICs9IG12Lm8KK2xpYi0kKENPTkZJR19OSUNFKSAgICAgICs9IG5pY2UubworbGliLSQoQ09ORklHX05PSFVQKSAgICAgKz0gbm9odXAubworbGliLSQoQ09ORklHX09EKSAgICAgICAgKz0gb2QubworbGliLSQoQ09ORklHX1BSSU5URU5WKSAgKz0gcHJpbnRlbnYubworbGliLSQoQ09ORklHX1BSSU5URikgICAgKz0gcHJpbnRmLm8KK2xpYi0kKENPTkZJR19BU0hfQlVJTFRJTl9QUklOVEYpICs9IHByaW50Zi5vCitsaWItJChDT05GSUdfUFdEKSAgICAgICArPSBwd2QubworbGliLSQoQ09ORklHX1JFQURMSU5LKSAgKz0gcmVhZGxpbmsubworbGliLSQoQ09ORklHX1JFQUxQQVRIKSAgKz0gcmVhbHBhdGgubworbGliLSQoQ09ORklHX1JNKSAgICAgICAgKz0gcm0ubworbGliLSQoQ09ORklHX1JNRElSKSAgICAgKz0gcm1kaXIubworbGliLSQoQ09ORklHX1NFUSkgICAgICAgKz0gc2VxLm8KK2xpYi0kKENPTkZJR19TSEExU1VNKSAgICs9IG1kNV9zaGExX3N1bS5vCitsaWItJChDT05GSUdfU0hBMjU2U1VNKSArPSBtZDVfc2hhMV9zdW0ubworbGliLSQoQ09ORklHX1NIQTUxMlNVTSkgKz0gbWQ1X3NoYTFfc3VtLm8KK2xpYi0kKENPTkZJR19TTEVFUCkgICAgICs9IHNsZWVwLm8KK2xpYi0kKENPTkZJR19TUExJVCkgICAgICs9IHNwbGl0Lm8KK2xpYi0kKENPTkZJR19TT1JUKSAgICAgICs9IHNvcnQubworbGliLSQoQ09ORklHX1NUQVQpICAgICAgKz0gc3RhdC5vCitsaWItJChDT05GSUdfU1RUWSkgICAgICArPSBzdHR5Lm8KK2xpYi0kKENPTkZJR19TVU0pICAgICAgICs9IHN1bS5vCitsaWItJChDT05GSUdfU1lOQykgICAgICArPSBzeW5jLm8KK2xpYi0kKENPTkZJR19UQUMpICAgICAgICs9IHRhYy5vCitsaWItJChDT05GSUdfVEFJTCkgICAgICArPSB0YWlsLm8KK2xpYi0kKENPTkZJR19URUUpICAgICAgICs9IHRlZS5vCitsaWItJChDT05GSUdfVFJVRSkgICAgICArPSB0cnVlLm8KK2xpYi0kKENPTkZJR19UVFkpICAgICAgICs9IHR0eS5vCitsaWItJChDT05GSUdfVU5BTUUpICAgICArPSB1bmFtZS5vCitsaWItJChDT05GSUdfVU5FWFBBTkQpICArPSBleHBhbmQubworbGliLSQoQ09ORklHX1VOSVEpICAgICAgKz0gdW5pcS5vCitsaWItJChDT05GSUdfVVNMRUVQKSAgICArPSB1c2xlZXAubworbGliLSQoQ09ORklHX1VVREVDT0RFKSAgKz0gdXVkZWNvZGUubworbGliLSQoQ09ORklHX1VVRU5DT0RFKSAgKz0gdXVlbmNvZGUubworbGliLSQoQ09ORklHX1dDKSAgICAgICAgKz0gd2MubworbGliLSQoQ09ORklHX1dIT0FNSSkgICAgKz0gd2hvYW1pLm8KK2xpYi0kKENPTkZJR19ZRVMpICAgICAgICs9IHllcy5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvYmFzZW5hbWUuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9iYXNlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2ExMzcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvYmFzZW5hbWUuYwpAQCAtMCwwICsxLDc5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGJhc2VuYW1lIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBDaGFuZ2VzOgorICogMSkgTm93IGNoZWNrcyBmb3IgdG9vIG1hbnkgYXJncy4gIE5lZWQgYXQgbGVhc3Qgb25lIGFuZCBhdCBtb3N0IHR3by4KKyAqIDIpIERvbid0IGNoZWNrIGZvciBvcHRpb25zLCBhcyBwZXIgU1VTdjMuCisgKiAzKSBTYXZlIHNvbWUgc3BhY2UgYnkgdXNpbmcgc3RyY21wKCkuICBDYWxsaW5nIHN0cm5jbXAoKSBoZXJlIHdhcyBzaWxseS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvYmFzZW5hbWUuaHRtbCAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfQkFTRU5BTUUpICs9IGJhc2VuYW1lLm8KKworLy9jb25maWc6Y29uZmlnIEJBU0VOQU1FCisvL2NvbmZpZzoJYm9vbCAiYmFzZW5hbWUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgYmFzZW5hbWUgaXMgdXNlZCB0byBzdHJpcCB0aGUgZGlyZWN0b3J5IGFuZCBzdWZmaXggZnJvbSBmaWxlbmFtZXMsCisvL2NvbmZpZzoJICBsZWF2aW5nIGp1c3QgdGhlIGZpbGVuYW1lIGl0c2VsZi4gRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoCisvL2NvbmZpZzoJICB0byBlbmFibGUgdGhlICdiYXNlbmFtZScgdXRpbGl0eS4KKworLy91c2FnZTojZGVmaW5lIGJhc2VuYW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFIFtTVUZGSVhdIgorLy91c2FnZTojZGVmaW5lIGJhc2VuYW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3RyaXAgZGlyZWN0b3J5IHBhdGggYW5kIC5TVUZGSVggZnJvbSBGSUxFXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGJhc2VuYW1lX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGJhc2VuYW1lIC91c3IvbG9jYWwvYmluL2Zvb1xuIgorLy91c2FnZTogICAgICAgImZvb1xuIgorLy91c2FnZTogICAgICAgIiQgYmFzZW5hbWUgL3Vzci9sb2NhbC9iaW4vXG4iCisvL3VzYWdlOiAgICAgICAiYmluXG4iCisvL3VzYWdlOiAgICAgICAiJCBiYXNlbmFtZSAvZm9vL2Jhci50eHQgLnR4dFxuIgorLy91c2FnZTogICAgICAgImJhciIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBiYXNlbmFtZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmFzZW5hbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc2l6ZV90IG0sIG47CisJY2hhciAqczsKKworCWlmIChhcmd2WzFdICYmIHN0cmNtcChhcmd2WzFdLCAiLS0iKSA9PSAwKSB7CisJCWFyZ3YrKzsKKwkJYXJnYy0tOworCX0KKworCWlmICgodW5zaWduZWQpKGFyZ2MtMikgPj0gMikgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLyogSXQgc2hvdWxkIHN0cmlwIHNsYXNoOiAvYWJjL2RlZi8gLT4gZGVmICovCisJcyA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKCorK2FyZ3YpOworCisJbSA9IHN0cmxlbihzKTsKKwlpZiAoKisrYXJndikgeworCQluID0gc3RybGVuKCphcmd2KTsKKwkJaWYgKChtID4gbikgJiYgKHN0cmNtcChzK20tbiwgKmFyZ3YpID09IDApKSB7CisJCQltIC09IG47CisJCQkvKnNbbV0gPSAnXDAnOyAtIHJlZHVuZGFudCAqLworCQl9CisJfQorCisJLyogcHV0cyhzKSB3aWxsIGRvLCBidXQgd2UgY2FuIGRvIHdpdGhvdXQgc3RkaW8gdGhpcyB3YXk6ICovCisJc1ttKytdID0gJ1xuJzsKKwkvKiBOQjogIT0gaXMgY29ycmVjdCBoZXJlOiAqLworCXJldHVybiBmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIHMsIG0pICE9IChzc2l6ZV90KW07Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2FsLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3MGFkOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9jYWwuYwpAQCAtMCwwICsxLDM4MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ2FsZW5kYXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBTZWUgb3JpZ2luYWwgY29weXJpZ2h0IGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgd2l0aCAtaiBhbmQgLXkgZXh0ZW5zaW9ucyAoZnJvbSB1dGlsLWxpbnV4KS4gKi8KKy8qIEJCX0FVRElUIEJVRzogVGhlIG91dHB1dCBvZiAnY2FsIC1qIDE3NTInIGlzIGluY29ycmVjdC4gIFRoZSB1cHN0cmVhbQorICogQkJfQVVESVQgQlVHOiB2ZXJzaW9uIGluIHV0aWwtbGludXggc2VlbXMgdG8gYmUgYnJva2VuIGFzIHdlbGwuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NhbC5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogTWFqb3Igc2l6ZSByZWR1Y3Rpb24uLi4gb3ZlciA1MCUgKD4xLjVrKSBvbiBpMzg2LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjYWxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstanldIFtbTU9OVEhdIFlFQVJdIgorLy91c2FnZTojZGVmaW5lIGNhbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgYSBjYWxlbmRhclxuIgorLy91c2FnZTogICAgICJcbgktaglVc2UganVsaWFuIGRhdGVzIgorLy91c2FnZTogICAgICJcbgkteQlEaXNwbGF5IHRoZSBlbnRpcmUgeWVhciIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisvKiBXZSBvZnRlbiB1c2UgInVuc2lnbmVkIiBpbnRlYWQgb2YgImludCIsIGl0J3MgZWFzaWVyIHRvIGRpdiBvbiBtb3N0IENQVXMgKi8KKworI2RlZmluZQlUSFVSU0RBWQkJNAkJLyogZm9yIHJlZm9ybWF0aW9uICovCisjZGVmaW5lCVNBVFVSREFZCQk2CQkvKiAxIEphbiAxIHdhcyBhIFNhdHVyZGF5ICovCisKKyNkZWZpbmUJRklSU1RfTUlTU0lOR19EQVkJNjM5Nzg3CQkvKiAzIFNlcCAxNzUyICovCisjZGVmaW5lCU5VTUJFUl9NSVNTSU5HX0RBWVMJMTEJCS8qIDExIGRheSBjb3JyZWN0aW9uICovCisKKyNkZWZpbmUJTUFYREFZUwkJCTQyCQkvKiBtYXggc2xvdHMgaW4gYSBtb250aCBhcnJheSAqLworI2RlZmluZQlTUEFDRQkJCS0xCQkvKiB1c2VkIGluIGRheSBhcnJheSAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkYXlzX2luX21vbnRoW10gQUxJR04xID0geworCTAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNlcDE3NTJbXSBBTElHTjEgPSB7CisJCSAxLAkyLAkxNCwJMTUsCTE2LAorCTE3LAkxOCwJMTksCTIwLAkyMSwJMjIsCTIzLAorCTI0LAkyNSwJMjYsCTI3LAkyOCwJMjksCTMwCit9OworCisvKiBTZXQgdG8gMCBvciAxIGluIG1haW4gKi8KKyNkZWZpbmUganVsaWFuICgodW5zaWduZWQpb3B0aW9uX21hc2szMikKKworLyogbGVhcCB5ZWFyIC0tIGFjY291bnQgZm9yIEdyZWdvcmlhbiByZWZvcm1hdGlvbiBpbiAxNzUyICovCitzdGF0aWMgaW50IGxlYXBfeWVhcih1bnNpZ25lZCB5cikKK3sKKwlpZiAoeXIgPD0gMTc1MikKKwkJcmV0dXJuICEoeXIgJSA0KTsKKwlyZXR1cm4gKCEoeXIgJSA0KSAmJiAoeXIgJSAxMDApKSB8fCAhKHlyICUgNDAwKTsKK30KKworLyogbnVtYmVyIG9mIGNlbnR1cmllcyBzaW5jZSAxNzAwLCBub3QgaW5jbHVzaXZlICovCisjZGVmaW5lCWNlbnR1cmllc19zaW5jZV8xNzAwKHlyKSBcCisJKCh5cikgPiAxNzAwID8gKHlyKSAvIDEwMCAtIDE3IDogMCkKKworLyogbnVtYmVyIG9mIGNlbnR1cmllcyBzaW5jZSAxNzAwIHdob3NlIG1vZHVsbyBvZiA0MDAgaXMgMCAqLworI2RlZmluZQlxdWFkX2NlbnR1cmllc19zaW5jZV8xNzAwKHlyKSBcCisJKCh5cikgPiAxNjAwID8gKCh5cikgLSAxNjAwKSAvIDQwMCA6IDApCisKKy8qIG51bWJlciBvZiBsZWFwIHllYXJzIGJldHdlZW4geWVhciAxIGFuZCB0aGlzIHllYXIsIG5vdCBpbmNsdXNpdmUgKi8KKyNkZWZpbmUJbGVhcF95ZWFyc19zaW5jZV95ZWFyXzEoeXIpIFwKKwkoKHlyKSAvIDQgLSBjZW50dXJpZXNfc2luY2VfMTcwMCh5cikgKyBxdWFkX2NlbnR1cmllc19zaW5jZV8xNzAwKHlyKSkKKworc3RhdGljIHZvaWQgY2VudGVyKGNoYXIgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIGRheV9hcnJheSh1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkICopOworc3RhdGljIHZvaWQgdHJpbV90cmFpbGluZ19zcGFjZXNfYW5kX3ByaW50KGNoYXIgKik7CisKK3N0YXRpYyB2b2lkIGJsYW5rX3N0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZsZW4pOworc3RhdGljIGNoYXIgKmJ1aWxkX3JvdyhjaGFyICpwLCB1bnNpZ25lZCAqZHApOworCisjZGVmaW5lCURBWV9MRU4JCTMJCS8qIDMgc3BhY2VzIHBlciBkYXkgKi8KKyNkZWZpbmUJSl9EQVlfTEVOCShEQVlfTEVOICsgMSkKKyNkZWZpbmUJV0VFS19MRU4JMjAJCS8qIDcgKiAzIC0gb25lIHNwYWNlIGF0IHRoZSBlbmQgKi8KKyNkZWZpbmUJSl9XRUVLX0xFTgkoV0VFS19MRU4gKyA3KQorI2RlZmluZQlIRUFEX1NFUAkyCQkvKiBzcGFjZXMgYmV0d2VlbiBkYXkgaGVhZGluZ3MgKi8KKworaW50IGNhbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2FsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdG0gemVyb190bTsKKwl0aW1lX3Qgbm93OworCXVuc2lnbmVkIG1vbnRoLCB5ZWFyLCBmbGFncywgaTsKKwljaGFyICptb250aF9uYW1lc1sxMl07CisJLyogbm9ybWFsIGhlYWRpbmc6ICovCisJLyogIlN1IE1vIFR1IFdlIFRoIEZyIFNhIiAqLworCS8qIC1qIGhlYWRpbmc6ICovCisJLyogIiBTdSAgTW8gIFR1ICBXZSAgVGggIEZyICBTYSIgKi8KKwljaGFyIGRheV9oZWFkaW5nc1tFTkFCTEVfVU5JQ09ERV9TVVBQT1JUID8gMjggKiA2IDogMjhdOworCUlGX1VOSUNPREVfU1VQUE9SVChjaGFyICpocCA9IGRheV9oZWFkaW5nczspCisJY2hhciBidWZbNDBdOworCisJaW5pdF91bmljb2RlKCk7CisKKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJqeSIpOworCS8qIFRoaXMgc2V0cyBqdWxpYW4gPSBmbGFncyAmIDE6ICovCisJb3B0aW9uX21hc2szMiAmPSAxOworCW1vbnRoID0gMDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghYXJndlswXSkgeworCQlzdHJ1Y3QgdG0gKnB0bTsKKworCQl0aW1lKCZub3cpOworCQlwdG0gPSBsb2NhbHRpbWUoJm5vdyk7CisJCXllYXIgPSBwdG0tPnRtX3llYXIgKyAxOTAwOworCQlpZiAoIShmbGFncyAmIDIpKSB7IC8qIG5vIC15ICovCisJCQltb250aCA9IHB0bS0+dG1fbW9uICsgMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhcmd2WzFdKSB7CisJCQlpZiAoYXJndlsyXSkgeworCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCX0KKwkJCWlmICghKGZsYWdzICYgMikpIHsgLyogbm8gLXkgKi8KKwkJCQltb250aCA9IHhhdG91X3JhbmdlKCphcmd2LCAxLCAxMik7CisJCQl9CisJCQlhcmd2Kys7CisJCX0KKwkJeWVhciA9IHhhdG91X3JhbmdlKCphcmd2LCAxLCA5OTk5KTsKKwl9CisKKwlibGFua19zdHJpbmcoZGF5X2hlYWRpbmdzLCBzaXplb2YoZGF5X2hlYWRpbmdzKSAtIDcgKyA3Kmp1bGlhbik7CisKKwlpID0gMDsKKwlkbyB7CisJCXplcm9fdG0udG1fbW9uID0gaTsKKwkJLyogZnVsbCBtb250aCBuYW1lIGFjY29yZGluZyB0byBsb2NhbGUgKi8KKwkJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiVCIiwgJnplcm9fdG0pOworCQltb250aF9uYW1lc1tpXSA9IHhzdHJkdXAoYnVmKTsKKworCQlpZiAoaSA8IDcpIHsKKwkJCXplcm9fdG0udG1fd2RheSA9IGk7CisJCQkvKiBhYmJyZXZpYXRlZCB3ZWVrZGF5IG5hbWUgYWNjb3JkaW5nIHRvIGxvY2FsZSAqLworCQkJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiVhIiwgJnplcm9fdG0pOworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCWlmIChqdWxpYW4pCisJCQkJKmhwKysgPSAnICc7CisJCQl7CisJCQkJY2hhciAqdHdvX3djaGFycyA9IHVuaWNvZGVfY29udl90b19wcmludGFibGVfZml4ZWR3aWR0aCgvKk5VTEwsKi8gYnVmLCAyKTsKKwkJCQlzdHJjcHkoaHAsIHR3b193Y2hhcnMpOworCQkJCWZyZWUodHdvX3djaGFycyk7CisJCQl9CisJCQlocCArPSBzdHJsZW4oaHApOworCQkJKmhwKysgPSAnICc7CisjZWxzZQorCQkJc3RybmNweShkYXlfaGVhZGluZ3MgKyBpICogKDMranVsaWFuKSArIGp1bGlhbiwgYnVmLCAyKTsKKyNlbmRpZgorCQl9CisJfSB3aGlsZSAoKytpIDwgMTIpOworCUlGX1VOSUNPREVfU1VQUE9SVChocFstMV0gPSAnXDAnOykKKworCWlmIChtb250aCkgeworCQl1bnNpZ25lZCByb3csIGxlbiwgZGF5c1tNQVhEQVlTXTsKKwkJdW5zaWduZWQgKmRwID0gZGF5czsKKwkJY2hhciBsaW5lb3V0WzMwXTsKKworCQlkYXlfYXJyYXkobW9udGgsIHllYXIsIGRwKTsKKwkJbGVuID0gc3ByaW50ZihsaW5lb3V0LCAiJXMgJWQiLCBtb250aF9uYW1lc1ttb250aCAtIDFdLCB5ZWFyKTsKKwkJcHJpbnRmKCIlKnMlc1xuJXNcbiIsCisJCQkgICAoKDcqanVsaWFuICsgV0VFS19MRU4pIC0gbGVuKSAvIDIsICIiLAorCQkJICAgbGluZW91dCwgZGF5X2hlYWRpbmdzKTsKKwkJZm9yIChyb3cgPSAwOyByb3cgPCA2OyByb3crKykgeworCQkJYnVpbGRfcm93KGxpbmVvdXQsIGRwKVswXSA9ICdcMCc7CisJCQlkcCArPSA3OworCQkJdHJpbV90cmFpbGluZ19zcGFjZXNfYW5kX3ByaW50KGxpbmVvdXQpOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgcm93LCB3aGljaF9jYWwsIHdlZWtfbGVuLCBkYXlzWzEyXVtNQVhEQVlTXTsKKwkJdW5zaWduZWQgKmRwOworCQljaGFyIGxpbmVvdXRbODBdOworCisJCXNwcmludGYobGluZW91dCwgIiV1IiwgeWVhcik7CisJCWNlbnRlcihsaW5lb3V0LAorCQkJICAgKFdFRUtfTEVOICogMyArIEhFQURfU0VQICogMikKKwkJCSAgICsganVsaWFuICogKEpfV0VFS19MRU4gKiAyICsgSEVBRF9TRVAKKwkJCQkJCSAgIC0gKFdFRUtfTEVOICogMyArIEhFQURfU0VQICogMikpLAorCQkJICAgMCk7CisJCXB1dHMoIlxuIik7CQkvKiB0d28gXG4ncyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQkJZGF5X2FycmF5KGkgKyAxLCB5ZWFyLCBkYXlzW2ldKTsKKwkJfQorCQlibGFua19zdHJpbmcobGluZW91dCwgc2l6ZW9mKGxpbmVvdXQpKTsKKwkJd2Vla19sZW4gPSBXRUVLX0xFTiArIGp1bGlhbiAqIChKX1dFRUtfTEVOIC0gV0VFS19MRU4pOworCQlmb3IgKG1vbnRoID0gMDsgbW9udGggPCAxMjsgbW9udGggKz0gMy1qdWxpYW4pIHsKKwkJCWNlbnRlcihtb250aF9uYW1lc1ttb250aF0sIHdlZWtfbGVuLCBIRUFEX1NFUCk7CisJCQlpZiAoIWp1bGlhbikgeworCQkJCWNlbnRlcihtb250aF9uYW1lc1ttb250aCArIDFdLCB3ZWVrX2xlbiwgSEVBRF9TRVApOworCQkJfQorCQkJY2VudGVyKG1vbnRoX25hbWVzW21vbnRoICsgMiAtIGp1bGlhbl0sIHdlZWtfbGVuLCAwKTsKKwkJCXByaW50ZigiXG4lcyUqcyVzIiwgZGF5X2hlYWRpbmdzLCBIRUFEX1NFUCwgIiIsIGRheV9oZWFkaW5ncyk7CisJCQlpZiAoIWp1bGlhbikgeworCQkJCXByaW50ZigiJSpzJXMiLCBIRUFEX1NFUCwgIiIsIGRheV9oZWFkaW5ncyk7CisJCQl9CisJCQliYl9wdXRjaGFyKCdcbicpOworCQkJZm9yIChyb3cgPSAwOyByb3cgPCAoNio3KTsgcm93ICs9IDcpIHsKKwkJCQlmb3IgKHdoaWNoX2NhbCA9IDA7IHdoaWNoX2NhbCA8IDMtanVsaWFuOyB3aGljaF9jYWwrKykgeworCQkJCQlkcCA9IGRheXNbbW9udGggKyB3aGljaF9jYWxdICsgcm93OworCQkJCQlidWlsZF9yb3cobGluZW91dCArIHdoaWNoX2NhbCAqICh3ZWVrX2xlbiArIDIpLCBkcCk7CisJCQkJfQorCQkJCS8qIGJsYW5rX3N0cmluZyB0b29rIGNhcmUgb2YgbnVsIHRlcm1pbmF0aW9uLiAqLworCQkJCXRyaW1fdHJhaWxpbmdfc3BhY2VzX2FuZF9wcmludChsaW5lb3V0KTsKKwkJCX0KKwkJfQorCX0KKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworLyoKKyAqIGRheV9hcnJheSAtLQorICoJRmlsbCBpbiBhbiBhcnJheSBvZiA0MiBpbnRlZ2VycyB3aXRoIGEgY2FsZW5kYXIuICBBc3N1bWUgZm9yIGEgbW9tZW50CisgKgl0aGF0IHlvdSB0b29rIHRoZSAobWF4aW11bSkgNiByb3dzIGluIGEgY2FsZW5kYXIgYW5kIHN0cmV0Y2hlZCB0aGVtCisgKglvdXQgZW5kIHRvIGVuZC4gIFlvdSB3b3VsZCBoYXZlIDQyIG51bWJlcnMgb3Igc3BhY2VzLiAgVGhpcyByb3V0aW5lCisgKglidWlsZHMgdGhhdCBhcnJheSBmb3IgYW55IG1vbnRoIGZyb20gSmFuLiAxIHRocm91Z2ggRGVjLiA5OTk5LgorICovCitzdGF0aWMgdm9pZCBkYXlfYXJyYXkodW5zaWduZWQgbW9udGgsIHVuc2lnbmVkIHllYXIsIHVuc2lnbmVkICpkYXlzKQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIGRheSwgZHcsIGRtOworCisJbWVtc2V0KGRheXMsIFNQQUNFLCBNQVhEQVlTICogc2l6ZW9mKGludCkpOworCisJaWYgKChtb250aCA9PSA5KSAmJiAoeWVhciA9PSAxNzUyKSkgeworCQkvKiBBc3N1bWVzIHRoZSBHcmVnb3JpYW4gcmVmb3JtYXRpb24gZWxpbWluYXRlcworCQkgKiAzIFNlcC4gMTc1MiB0aHJvdWdoIDEzIFNlcC4gMTc1Mi4KKwkJICovCisJCXVuc2lnbmVkIGpfb2Zmc2V0ID0ganVsaWFuICogMjQ0OworCQlzaXplX3Qgb2RheSA9IDA7CisKKwkJZG8geworCQkJZGF5c1tvZGF5KzJdID0gc2VwMTc1MltvZGF5XSArIGpfb2Zmc2V0OworCQl9IHdoaWxlICgrK29kYXkgPCBzaXplb2Yoc2VwMTc1MikpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBkYXlfaW5feWVhcgorCSAqIHJldHVybiB0aGUgMSBiYXNlZCBkYXkgbnVtYmVyIHdpdGhpbiB0aGUgeWVhcgorCSAqLworCWRheSA9IDE7CisJaWYgKChtb250aCA+IDIpICYmIGxlYXBfeWVhcih5ZWFyKSkgeworCQkrK2RheTsKKwl9CisKKwlpID0gbW9udGg7CisJd2hpbGUgKGkpIHsKKwkJZGF5ICs9IGRheXNfaW5fbW9udGhbLS1pXTsKKwl9CisKKwkvKiBkYXlfaW5fd2VlaworCSAqIHJldHVybiB0aGUgMCBiYXNlZCBkYXkgbnVtYmVyIGZvciBhbnkgZGF0ZSBmcm9tIDEgSmFuLiAxIHRvCisJICogMzEgRGVjLiA5OTk5LiAgQXNzdW1lcyB0aGUgR3JlZ29yaWFuIHJlZm9ybWF0aW9uIGVsaW1pbmF0ZXMKKwkgKiAzIFNlcC4gMTc1MiB0aHJvdWdoIDEzIFNlcC4gMTc1Mi4gIFJldHVybnMgVGh1cnNkYXkgZm9yIGFsbAorCSAqIG1pc3NpbmcgZGF5cy4KKwkgKi8KKwl0ZW1wID0gKGxvbmcpKHllYXIgLSAxKSAqIDM2NSArIGxlYXBfeWVhcnNfc2luY2VfeWVhcl8xKHllYXIgLSAxKSArIGRheTsKKwlpZiAodGVtcCA8IEZJUlNUX01JU1NJTkdfREFZKSB7CisJCWR3ID0gKCh0ZW1wIC0gMSArIFNBVFVSREFZKSAlIDcpOworCX0gZWxzZSB7CisJCWR3ID0gKCgodGVtcCAtIDEgKyBTQVRVUkRBWSkgLSBOVU1CRVJfTUlTU0lOR19EQVlTKSAlIDcpOworCX0KKworCWlmICghanVsaWFuKSB7CisJCWRheSA9IDE7CisJfQorCisJZG0gPSBkYXlzX2luX21vbnRoW21vbnRoXTsKKwlpZiAoKG1vbnRoID09IDIpICYmIGxlYXBfeWVhcih5ZWFyKSkgeworCQkrK2RtOworCX0KKworCWRvIHsKKwkJZGF5c1tkdysrXSA9IGRheSsrOworCX0gd2hpbGUgKC0tZG0pOworfQorCitzdGF0aWMgdm9pZCB0cmltX3RyYWlsaW5nX3NwYWNlc19hbmRfcHJpbnQoY2hhciAqcykKK3sKKwljaGFyICpwID0gczsKKworCXdoaWxlICgqcCkgeworCQkrK3A7CisJfQorCXdoaWxlIChwICE9IHMpIHsKKwkJLS1wOworCQlpZiAoIWlzc3BhY2UoKnApKSB7CisJCQlwWzFdID0gJ1wwJzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHV0cyhzKTsKK30KKworc3RhdGljIHZvaWQgY2VudGVyKGNoYXIgKnN0ciwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBzZXBhcmF0ZSkKK3sKKwl1bnNpZ25lZCBuID0gc3RybGVuKHN0cik7CisJbGVuIC09IG47CisJcHJpbnRmKCIlKnMlKnMiLCAobGVuLzIpICsgbiwgc3RyLCAobGVuLzIpICsgKGxlbiAlIDIpICsgc2VwYXJhdGUsICIiKTsKK30KKworc3RhdGljIHZvaWQgYmxhbmtfc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwltZW1zZXQoYnVmLCAnICcsIGJ1Zmxlbik7CisJYnVmW2J1Zmxlbi0xXSA9ICdcMCc7Cit9CisKK3N0YXRpYyBjaGFyICpidWlsZF9yb3coY2hhciAqcCwgdW5zaWduZWQgKmRwKQoreworCXVuc2lnbmVkIGNvbCwgdmFsLCBkYXk7CisKKwltZW1zZXQocCwgJyAnLCAoanVsaWFuICsgREFZX0xFTikgKiA3KTsKKworCWNvbCA9IDA7CisJZG8geworCQlkYXkgPSAqZHArKzsKKwkJaWYgKGRheSAhPSBTUEFDRSkgeworCQkJaWYgKGp1bGlhbikgeworCQkJCSsrcDsKKwkJCQlpZiAoZGF5ID49IDEwMCkgeworCQkJCQkqcCA9ICcwJzsKKwkJCQkJcFstMV0gPSAoZGF5IC8gMTAwKSArICcwJzsKKwkJCQkJZGF5ICU9IDEwMDsKKwkJCQl9CisJCQl9CisJCQl2YWwgPSBkYXkgLyAxMDsKKwkJCWlmICh2YWwgPiAwKSB7CisJCQkJKnAgPSB2YWwgKyAnMCc7CisJCQl9CisJCQkqKytwID0gZGF5ICUgMTAgKyAnMCc7CisJCQlwICs9IDI7CisJCX0gZWxzZSB7CisJCQlwICs9IERBWV9MRU4gKyBqdWxpYW47CisJCX0KKwl9IHdoaWxlICgrK2NvbCA8IDcpOworCisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtpbSBMZXRrZW1hbi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9jYXQuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9jYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGMzOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2NhdC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNhdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NhdC5odG1sICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19DQVQpICAgICArPSBjYXQubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX01PUkUpICAgICs9IGNhdC5vICMgbW9yZSB1c2VzIGl0IGlmIHN0ZG91dCBpc24ndCBhIHR0eQorLy9rYnVpbGQ6bGliLSQoQ09ORklHX0xFU1MpICAgICs9IGNhdC5vICMgbGVzcyB0b28KKy8va2J1aWxkOmxpYi0kKENPTkZJR19DUk9OVEFCKSArPSBjYXQubyAjIGNyb250YWIgLWwKKworLy9jb25maWc6Y29uZmlnIENBVAorLy9jb25maWc6CWJvb2wgImNhdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBjYXQgaXMgdXNlZCB0byBjb25jYXRlbmF0ZSBmaWxlcyBhbmQgcHJpbnQgdGhlbSB0byB0aGUgc3RhbmRhcmQKKy8vY29uZmlnOgkgIG91dHB1dC4gRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIGVuYWJsZSB0aGUgJ2NhdCcgdXRpbGl0eS4KKworLy91c2FnZTojZGVmaW5lIGNhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGNhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbmNhdGVuYXRlIEZJTEVzIGFuZCBwcmludCB0aGVtIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgY2F0X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGNhdCAvcHJvYy91cHRpbWVcbiIKKy8vdXNhZ2U6ICAgICAgICIxMTA3MTYuNzIgMTcuNjciCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKK2ludCBiYl9jYXQoY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKwlpZiAoISphcmd2KQorCQlhcmd2ID0gKGNoYXIqKikgJmJiX2FyZ3ZfZGFzaDsKKworCWRvIHsKKwkJZmQgPSBvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YpOworCQlpZiAoZmQgPj0gMCkgeworCQkJLyogVGhpcyBpcyBub3QgYSB4ZnVuYyAtIG5ldmVyIGV4aXRzICovCisJCQlvZmZfdCByID0gYmJfY29weWZkX2VvZihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCQlpZiAoZmQgIT0gU1RESU5fRklMRU5PKQorCQkJCWNsb3NlKGZkKTsKKwkJCWlmIChyID49IDApCisJCQkJY29udGludWU7CisJCX0KKwkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGNhdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2F0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlnZXRvcHQzMihhcmd2LCAidSIpOworCWFyZ3YgKz0gb3B0aW5kOworCXJldHVybiBiYl9jYXQoYXJndik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2F0di5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2NhdHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTRiNDMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2NhdHYuYwpAQCAtMCwwICsxLDgzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjYXQgLXYgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFNlZSAiQ2F0IC12IGNvbnNpZGVyZWQgaGFybWZ1bCIgYXQKKyAqIGh0dHA6Ly9jbS5iZWxsLWxhYnMuY29tL2NtL2NzL2RvYy84NC9rcC5wcy5neiAqLworCisvL3VzYWdlOiNkZWZpbmUgY2F0dl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1ldHZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBjYXR2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSBub25wcmludGluZyBjaGFyYWN0ZXJzIGFzIF54IG9yIE0teFxuIgorLy91c2FnZTogICAgICJcbgktZQlFbmQgZWFjaCBsaW5lIHdpdGggJCIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJU2hvdyB0YWJzIGFzIF5JIgorLy91c2FnZTogICAgICJcbgktdglEb24ndCB1c2UgXnggb3IgTS14IGVzY2FwZXMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgY2F0dl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2F0dl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgZmQ7CisJdW5zaWduZWQgZmxhZ3M7CisKKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJldHYiKTsKKyNkZWZpbmUgQ0FUVl9PUFRfZSAoMTw8MCkKKyNkZWZpbmUgQ0FUVl9PUFRfdCAoMTw8MSkKKyNkZWZpbmUgQ0FUVl9PUFRfdiAoMTw8MikKKwlmbGFncyBePSBDQVRWX09QVF92OworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogUmVhZCBmcm9tIHN0ZGluIGlmIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHRvIGRvLiAqLworCWlmICghYXJndlswXSkKKwkJKi0tYXJndiA9IChjaGFyKikiLSI7CisJZG8geworCQlmZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCWlmIChmZCA8IDApIHsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAoOzspIHsKKwkJCWludCBpLCByZXM7CisKKyNkZWZpbmUgcmVhZF9idWYgYmJfY29tbW9uX2J1ZnNpejEKKwkJCXJlcyA9IHJlYWQoZmQsIHJlYWRfYnVmLCBDT01NT05fQlVGU0laRSk7CisJCQlpZiAocmVzIDwgMCkKKwkJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQlpZiAocmVzIDwgMSkKKwkJCQlicmVhazsKKwkJCWZvciAoaSA9IDA7IGkgPCByZXM7IGkrKykgeworCQkJCXVuc2lnbmVkIGNoYXIgYyA9IHJlYWRfYnVmW2ldOworCisJCQkJaWYgKGMgPiAxMjYgJiYgKGZsYWdzICYgQ0FUVl9PUFRfdikpIHsKKwkJCQkJaWYgKGMgPT0gMTI3KSB7CisJCQkJCQlwcmludGYoIl4/Iik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlwcmludGYoIk0tIik7CisJCQkJCWMgLT0gMTI4OworCQkJCX0KKwkJCQlpZiAoYyA8IDMyKSB7CisJCQkJCWlmIChjID09IDEwKSB7CisJCQkJCQlpZiAoZmxhZ3MgJiBDQVRWX09QVF9lKQorCQkJCQkJCWJiX3B1dGNoYXIoJyQnKTsKKwkJCQkJfSBlbHNlIGlmIChmbGFncyAmIChjPT05ID8gQ0FUVl9PUFRfdCA6IENBVFZfT1BUX3YpKSB7CisJCQkJCQlwcmludGYoIl4lYyIsIGMrJ0AnKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCWJiX3B1dGNoYXIoYyk7CisJCQl9CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQICYmIGZkKQorCQkJY2xvc2UoZmQpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2NoZ3JwLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2hncnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDc2ZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2NoZ3JwLmMKQEAgLTAsMCArMSw1MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjaGdycCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGRlZmVjdHMgLSBub25lPyAqLworLyogQkJfQVVESVQgR05VIGRlZmVjdHMgLSB1bnN1cHBvcnRlZCBsb25nIG9wdGlvbnMuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NoZ3JwLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIGNoZ3JwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLVJoTEhQIklGX0RFU0tUT1AoImN2ZiIpIl0uLi4gR1JPVVAgRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBjaGdycF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgZ3JvdXAgbWVtYmVyc2hpcCBvZiBlYWNoIEZJTEUgdG8gR1JPVVBcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJQWZmZWN0IHN5bWxpbmtzIGluc3RlYWQgb2Ygc3ltbGluayB0YXJnZXRzIgorLy91c2FnZTogICAgICJcbgktTAlUcmF2ZXJzZSBhbGwgc3ltbGlua3MgdG8gZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxuCS1ICVRyYXZlcnNlIHN5bWxpbmtzIG9uIGNvbW1hbmQgbGluZSBvbmx5IgorLy91c2FnZTogICAgICJcbgktUAlEb24ndCB0cmF2ZXJzZSBzeW1saW5rcyAoZGVmYXVsdCkiCisvL3VzYWdlOglJRl9ERVNLVE9QKAorLy91c2FnZTogICAgICJcbgktYwlMaXN0IGNoYW5nZWQgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1mCUhpZGUgZXJyb3JzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjaGdycF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1yLS1yLS1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgICAgICAgMCBBcHIgMTIgMTg6MjUgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGNoZ3JwIHJvb3QgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXItLXItLXItLSAgICAxIGFuZGVyc2VuIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCitpbnQgY2hncnBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNoZ3JwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCS8qICJjaGdycCBbb3B0c10gYWJjIGZpbGUocykiID09ICJjaG93biBbb3B0c10gOmFiYyBmaWxlKHMpIiAqLworCWNoYXIgKipwID0gYXJndjsKKwl3aGlsZSAoKisrcCkgeworCQlpZiAocFswXVswXSAhPSAnLScpIHsKKwkJCXBbMF0gPSB4YXNwcmludGYoIjolcyIsIHBbMF0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNob3duX21haW4oYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2htb2QuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9jaG1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTQ1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2htb2QuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjaG1vZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBSZXdvcmtlZCBieSAoQykgMjAwMiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKiAgdG8gY29ycmVjdGx5IHBhcnNlICctcnd4Z29hJworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBCQl9BVURJVCBHTlUgZGVmZWN0cyAtIHVuc3VwcG9ydGVkIGxvbmcgb3B0aW9ucy4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvY2htb2QuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgY2htb2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUiJJRl9ERVNLVE9QKCJjdmYiKSJdIE1PREVbLE1PREVdLi4uIEZJTEUuLi4iCisvL3VzYWdlOiNkZWZpbmUgY2htb2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFYWNoIE1PREUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIGxldHRlcnMgdWdvYSwgb25lIG9mIHRoZVxuIgorLy91c2FnZTogICAgICAgInN5bWJvbHMgKy09IGFuZCBvbmUgb3IgbW9yZSBvZiB0aGUgbGV0dGVycyByd3hzdFxuIgorLy91c2FnZTogICAgICJcbgktUglSZWN1cnNlIgorLy91c2FnZToJSUZfREVTS1RPUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWMJTGlzdCBjaGFuZ2VkIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktdglMaXN0IGFsbCBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJSGlkZSBlcnJvcnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGNobW9kX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LXJ3LXItLSAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgY2htb2QgdSt4IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1yd3hydy1yLS0gICAgMSByb290ICAgICByb290ICAgICAgICAgICAgMCBBcHIgMTIgMTg6MjUgL3RtcC9mb28qXG4iCisvL3VzYWdlOiAgICAgICAiJCBjaG1vZCA0NDQgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXItLXItLXItLSAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisjZGVmaW5lIE9QVF9SRUNVUlNFIChvcHRpb25fbWFzazMyICYgMSkKKyNkZWZpbmUgT1BUX1ZFUkJPU0UgKElGX0RFU0tUT1Aob3B0aW9uX21hc2szMiAmIDIpIElGX05PVF9ERVNLVE9QKDApKQorI2RlZmluZSBPUFRfQ0hBTkdFRCAoSUZfREVTS1RPUChvcHRpb25fbWFzazMyICYgNCkgSUZfTk9UX0RFU0tUT1AoMCkpCisjZGVmaW5lIE9QVF9RVUlFVCAgIChJRl9ERVNLVE9QKG9wdGlvbl9tYXNrMzIgJiA4KSBJRl9OT1RfREVTS1RPUCgwKSkKKyNkZWZpbmUgT1BUX1NUUiAgICAgIlIiIElGX0RFU0tUT1AoInZjZiIpCisKKy8qIGNvcmV1dGlsczoKKyAqIGNobW9kIG5ldmVyIGNoYW5nZXMgdGhlIHBlcm1pc3Npb25zIG9mIHN5bWJvbGljIGxpbmtzOyB0aGUgY2htb2QKKyAqIHN5c3RlbSBjYWxsIGNhbm5vdCBjaGFuZ2UgdGhlaXIgcGVybWlzc2lvbnMuIFRoaXMgaXMgbm90IGEgcHJvYmxlbQorICogc2luY2UgdGhlIHBlcm1pc3Npb25zIG9mIHN5bWJvbGljIGxpbmtzIGFyZSBuZXZlciB1c2VkLgorICogSG93ZXZlciwgZm9yIGVhY2ggc3ltYm9saWMgbGluayBsaXN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgY2htb2QgY2hhbmdlcworICogdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBwb2ludGVkLXRvIGZpbGUuIEluIGNvbnRyYXN0LCBjaG1vZCBpZ25vcmVzCisgKiBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCBkdXJpbmcgcmVjdXJzaXZlIGRpcmVjdG9yeSB0cmF2ZXJzYWxzLgorICovCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVBY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0ICpzdGF0YnVmLCB2b2lkKiBwYXJhbSwgaW50IGRlcHRoKQoreworCW1vZGVfdCBuZXdtb2RlOworCisJLyogbWF0Y2ggY29yZXV0aWxzIGJlaGF2aW9yICovCisJaWYgKGRlcHRoID09IDApIHsKKwkJLyogc3RhdGJ1ZiBob2xkcyBsc3RhdCByZXN1bHQsIGJ1dCB3ZSBuZWVkIHN0YXQgKGZvbGxvdyBsaW5rKSAqLworCQlpZiAoc3RhdChmaWxlTmFtZSwgc3RhdGJ1ZikpCisJCQlnb3RvIGVycjsKKwl9IGVsc2UgeyAvKiBkZXB0aCA+IDA6IHNraXAgbGlua3MgKi8KKwkJaWYgKFNfSVNMTksoc3RhdGJ1Zi0+c3RfbW9kZSkpCisJCQlyZXR1cm4gVFJVRTsKKwl9CisJbmV3bW9kZSA9IHN0YXRidWYtPnN0X21vZGU7CisKKwlpZiAoIWJiX3BhcnNlX21vZGUoKGNoYXIgKilwYXJhbSwgJm5ld21vZGUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBtb2RlICclcyciLCAoY2hhciAqKXBhcmFtKTsKKworCWlmIChjaG1vZChmaWxlTmFtZSwgbmV3bW9kZSkgPT0gMCkgeworCQlpZiAoT1BUX1ZFUkJPU0UKKwkJIHx8IChPUFRfQ0hBTkdFRCAmJiBzdGF0YnVmLT5zdF9tb2RlICE9IG5ld21vZGUpCisJCSkgeworCQkJcHJpbnRmKCJtb2RlIG9mICclcycgY2hhbmdlZCB0byAlMDRvICglcylcbiIsIGZpbGVOYW1lLAorCQkJCW5ld21vZGUgJiAwNzc3NywgYmJfbW9kZV9zdHJpbmcobmV3bW9kZSkrMSk7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfQorIGVycjoKKwlpZiAoIU9QVF9RVUlFVCkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZU5hbWUpOworCXJldHVybiBGQUxTRTsKK30KKworaW50IGNobW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaG1vZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwljaGFyICphcmcsICoqYXJncDsKKwljaGFyICpzbW9kZTsKKworCS8qIENvbnZlcnQgZmlyc3QgZW5jb3VudGVyZWQgLXIgaW50byBhciwgLXcgaW50byBhdyBldGMKKwkgKiBzbyB0aGF0IGdldG9wdCB3b3VsZCBub3QgZWF0IGl0ICovCisJYXJncCA9IGFyZ3Y7CisJd2hpbGUgKChhcmcgPSAqKythcmdwKSkgeworCQkvKiBNb2RlIHNwZWMgbXVzdCBiZSB0aGUgZmlyc3QgYXJnIChzYW5zIC1SIGV0YykgKi8KKwkJLyogKHByb3RlY3QgYWdhaW5zdCBtaXNoYW5kbGluZyBlLmcuICJjaG1vZCA2NDQgLXIiKSAqLworCQlpZiAoYXJnWzBdICE9ICctJykgeworCQkJYXJnID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCS8qIEFuIG9wdGlvbi4gTm90IGEgLS0gb3IgdmFsaWQgb3B0aW9uPyAqLworCQlpZiAoYXJnWzFdICYmICFzdHJjaHIoIi0iT1BUX1NUUiwgYXJnWzFdKSkgeworCQkJYXJnWzBdID0gJ2EnOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTIiOworCWdldG9wdDMyKGFyZ3YsICgiLSJPUFRfU1RSKSArIDEpOyAvKiBSZXVzZSBzdHJpbmcgKi8KKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIFJlc3RvcmUgb3B0aW9uLWxpa2UgbW9kZSBpZiBuZWVkZWQgKi8KKwlpZiAoYXJnKSBhcmdbMF0gPSAnLSc7CisKKwkvKiBPaywgcmVhZHkgdG8gZG8gdGhlIGRlZWQgbm93ICovCisJc21vZGUgPSAqYXJndisrOworCWRvIHsKKwkJaWYgKCFyZWN1cnNpdmVfYWN0aW9uKCphcmd2LAorCQkJT1BUX1JFQ1VSU0UsICAgIC8vIHJlY3Vyc2UKKwkJCWZpbGVBY3Rpb24sICAgICAvLyBmaWxlIGFjdGlvbgorCQkJZmlsZUFjdGlvbiwgICAgIC8vIGRpciBhY3Rpb24KKwkJCXNtb2RlLCAgICAgICAgICAvLyB1c2VyIGRhdGEKKwkJCTApICAgICAgICAgICAgICAvLyBkZXB0aAorCQkpIHsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKK1NlY3VyaXR5OiBjaG1vZCBpcyB0b28gaW1wb3J0YW50IGFuZCB0b28gc3VidGxlLgorVGhpcyBpcyBhIHRlc3Qgc2NyaXB0IChidXN5Ym94IGNobW9kIHZlcnN1cyBjb3JldXRpbHMpLgorUnVuIGl0IGluIGVtcHR5IGRpcmVjdG9yeS4KKworIyEvYmluL3NoCit0MT0iL3RtcC9idXN5Ym94IGNobW9kIgordDI9Ii91c3IvYmluL2NobW9kIgorY3JlYXRlKCkgeworICAgIHJtIC1yZiAkMTsgbWtkaXIgJDEKKyAgICAoCisgICAgY2QgJDEgfHwgZXhpdCAxCisgICAgbWtkaXIgZGlyCisgICAgPnVwCisgICAgPmZpbGUKKyAgICA+ZGlyL2ZpbGUKKyAgICBsbiAtcyBkaXIgbGlua2RpcgorICAgIGxuIC1zIGZpbGUgbGlua2ZpbGUKKyAgICBsbiAtcyAuLi91cCBkaXIvdXAKKyAgICApCit9Cit0c3QoKSB7CisgICAgKGNkIHRlc3QxOyAkdDEgJDEpCisgICAgKGNkIHRlc3QyOyAkdDIgJDEpCisgICAgKGNkIHRlc3QxOyBscyAtbFIpID5vdXQxCisgICAgKGNkIHRlc3QyOyBscyAtbFIpID5vdXQyCisgICAgZWNobyAiY2htb2QgJDEiID5vdXQuZGlmZgorICAgIGlmICEgZGlmZiAtdSBvdXQxIG91dDIgPj5vdXQuZGlmZjsgdGhlbiBleGl0IDE7IGZpCisgICAgcm0gb3V0LmRpZmYKK30KK2VjaG8gIklmIHNjcmlwdCBwcm9kdWNlZCAnb3V0LmRpZmYnIGZpbGUsIHRoZW4gYXQgbGVhc3Qgb25lIHRlc3RjYXNlIGZhaWxlZCIKK2NyZWF0ZSB0ZXN0MTsgY3JlYXRlIHRlc3QyCit0c3QgImErdyBmaWxlIgordHN0ICJhLXcgZGlyIgordHN0ICJhK3cgbGlua2ZpbGUiCit0c3QgImEtdyBsaW5rZGlyIgordHN0ICItUiBhK3cgZmlsZSIKK3RzdCAiLVIgYS13IGRpciIKK3RzdCAiLVIgYSt3IGxpbmtmaWxlIgordHN0ICItUiBhLXcgbGlua2RpciIKK3RzdCAiYS1yLGEreCBsaW5rZmlsZSIKKyovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2hvd24uYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9jaG93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTY2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2hvd24uYwpAQCAtMCwwICsxLDIyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjaG93biBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGRlZmVjdHMgLSBub25lPyAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9jaG93bi5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaG93bl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1SaExIUCJJRl9ERVNLVE9QKCJjdmYiKSJdLi4uIE9XTkVSWzwufDo+W0dST1VQXV0gRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBjaG93bl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgb3duZXIgYW5kL29yIGdyb3VwIG9mIGVhY2ggRklMRSB0byBPV05FUiBhbmQvb3IgR1JPVVBcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJQWZmZWN0IHN5bWxpbmtzIGluc3RlYWQgb2Ygc3ltbGluayB0YXJnZXRzIgorLy91c2FnZTogICAgICJcbgktTAlUcmF2ZXJzZSBhbGwgc3ltbGlua3MgdG8gZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxuCS1ICVRyYXZlcnNlIHN5bWxpbmtzIG9uIGNvbW1hbmQgbGluZSBvbmx5IgorLy91c2FnZTogICAgICJcbgktUAlEb24ndCB0cmF2ZXJzZSBzeW1saW5rcyAoZGVmYXVsdCkiCisvL3VzYWdlOglJRl9ERVNLVE9QKAorLy91c2FnZTogICAgICJcbgktYwlMaXN0IGNoYW5nZWQgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS12CUxpc3QgYWxsIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktZglIaWRlIGVycm9ycyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgY2hvd25fZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICItci0tci0tci0tICAgIDEgYW5kZXJzZW4gYW5kZXJzZW4gICAgICAgIDAgQXByIDEyIDE4OjI1IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBjaG93biByb290IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1yLS1yLS1yLS0gICAgMSByb290ICAgICBhbmRlcnNlbiAgICAgICAgMCBBcHIgMTIgMTg6MjUgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGNob3duIHJvb3Qucm9vdCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgImxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXItLXItLXItLSAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisjZGVmaW5lIE9QVF9TVFIgICAgICgiUmgiIElGX0RFU0tUT1AoInZjZkxIUCIpKQorI2RlZmluZSBCSVRfUkVDVVJTRSAxCisjZGVmaW5lIE9QVF9SRUNVUlNFIChvcHQgJiAxKQorI2RlZmluZSBPUFRfTk9ERVJFRiAob3B0ICYgMikKKyNkZWZpbmUgT1BUX1ZFUkJPU0UgKElGX0RFU0tUT1Aob3B0ICYgMHgwNCkgSUZfTk9UX0RFU0tUT1AoMCkpCisjZGVmaW5lIE9QVF9DSEFOR0VEIChJRl9ERVNLVE9QKG9wdCAmIDB4MDgpIElGX05PVF9ERVNLVE9QKDApKQorI2RlZmluZSBPUFRfUVVJRVQgICAoSUZfREVTS1RPUChvcHQgJiAweDEwKSBJRl9OT1RfREVTS1RPUCgwKSkKKy8qIFBPU0lYIG9wdGlvbnMKKyAqIC1MIHRyYXZlcnNlIGV2ZXJ5IHN5bWJvbGljIGxpbmsgdG8gYSBkaXJlY3RvcnkgZW5jb3VudGVyZWQKKyAqIC1IIGlmIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGlzIGEgc3ltYm9saWMgbGluayB0byBhIGRpcmVjdG9yeSwgdHJhdmVyc2UgaXQKKyAqIC1QIGRvIG5vdCB0cmF2ZXJzZSBhbnkgc3ltYm9saWMgbGlua3MgKGRlZmF1bHQpCisgKiBXZSBkbyBub3QgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nOgorICogIlNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSBvZiAtSCwgLUwsIGFuZCAtUCBpcyBub3QgYW4gZXJyb3IuCisgKiBUaGUgbGFzdCBvcHRpb24gc3BlY2lmaWVkIHNoYWxsIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHV0aWxpdHkuIiAqLworLyogLUwgKi8KKyNkZWZpbmUgQklUX1RSQVZFUlNFIDB4MjAKKyNkZWZpbmUgT1BUX1RSQVZFUlNFIChJRl9ERVNLVE9QKG9wdCAmIEJJVF9UUkFWRVJTRSkgSUZfTk9UX0RFU0tUT1AoMCkpCisvKiAtSCBvciAtTCAqLworI2RlZmluZSBCSVRfVFJBVkVSU0VfVE9QICgweDIwfDB4NDApCisjZGVmaW5lIE9QVF9UUkFWRVJTRV9UT1AgKElGX0RFU0tUT1Aob3B0ICYgQklUX1RSQVZFUlNFX1RPUCkgSUZfTk9UX0RFU0tUT1AoMCkpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIGNob3duX2xvbmdvcHRzW10gQUxJR04xID0KKwkicmVjdXJzaXZlXDAiICAgICAgICBOb19hcmd1bWVudCAgICJSIgorCSJkZXJlZmVyZW5jZVwwIiAgICAgIE5vX2FyZ3VtZW50ICAgIlx4ZmYiCisJIm5vLWRlcmVmZXJlbmNlXDAiICAgTm9fYXJndW1lbnQgICAiaCIKKyMgaWYgRU5BQkxFX0RFU0tUT1AKKwkiY2hhbmdlc1wwIiAgICAgICAgICBOb19hcmd1bWVudCAgICJjIgorCSJzaWxlbnRcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgImYiCisJInF1aWV0XDAiICAgICAgICAgICAgTm9fYXJndW1lbnQgICAiZiIKKwkidmVyYm9zZVwwIiAgICAgICAgICBOb19hcmd1bWVudCAgICJ2IgorIyBlbmRpZgorCTsKKyNlbmRpZgorCit0eXBlZGVmIGludCAoKmNob3duX2ZwdHIpKGNvbnN0IGNoYXIgKiwgdWlkX3QsIGdpZF90KTsKKworc3RydWN0IHBhcmFtX3QgeworCXN0cnVjdCBiYl91aWRnaWRfdCB1Z2lkOworCWNob3duX2ZwdHIgY2hvd25fZnVuYzsKK307CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVBY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0ICpzdGF0YnVmLAorCQl2b2lkICp2cGFyYW0sIGludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisjZGVmaW5lIHBhcmFtICAoKihzdHJ1Y3QgcGFyYW1fdCopdnBhcmFtKQorI2RlZmluZSBvcHQgb3B0aW9uX21hc2szMgorCXVpZF90IHUgPSAocGFyYW0udWdpZC51aWQgPT0gKHVpZF90KS0xTCkgPyBzdGF0YnVmLT5zdF91aWQgOiBwYXJhbS51Z2lkLnVpZDsKKwlnaWRfdCBnID0gKHBhcmFtLnVnaWQuZ2lkID09IChnaWRfdCktMUwpID8gc3RhdGJ1Zi0+c3RfZ2lkIDogcGFyYW0udWdpZC5naWQ7CisKKwlpZiAocGFyYW0uY2hvd25fZnVuYyhmaWxlTmFtZSwgdSwgZykgPT0gMCkgeworCQlpZiAoT1BUX1ZFUkJPU0UKKwkJIHx8IChPUFRfQ0hBTkdFRCAmJiAoc3RhdGJ1Zi0+c3RfdWlkICE9IHUgfHwgc3RhdGJ1Zi0+c3RfZ2lkICE9IGcpKQorCQkpIHsKKwkJCXByaW50ZigiY2hhbmdlZCBvd25lcnNoaXAgb2YgJyVzJyB0byAldToldVxuIiwKKwkJCQkJZmlsZU5hbWUsICh1bnNpZ25lZCl1LCAodW5zaWduZWQpZyk7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfQorCWlmICghT1BUX1FVSUVUKQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlTmFtZSk7CisJcmV0dXJuIEZBTFNFOworI3VuZGVmIG9wdAorI3VuZGVmIHBhcmFtCit9CisKK2ludCBjaG93bl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgb3B0LCBmbGFnczsKKwlzdHJ1Y3QgcGFyYW1fdCBwYXJhbTsKKworCS8qIEp1c3QgLTEgbWlnaHQgbm90IHdvcms6IHVpZF90IG1heSBiZSB1bnNpZ25lZCBsb25nICovCisJcGFyYW0udWdpZC51aWQgPSAtMUw7CisJcGFyYW0udWdpZC5naWQgPSAtMUw7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gY2hvd25fbG9uZ29wdHM7CisjZW5kaWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMiI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUX1NUUik7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBUaGlzIG1hdGNoZXMgY29yZXV0aWxzIGJlaGF2aW9yIChhbG1vc3QgLSBzZWUgYmVsb3cpICovCisJcGFyYW0uY2hvd25fZnVuYyA9IGNob3duOworCWlmIChPUFRfTk9ERVJFRgorCSAgICAvKiB8fCAoT1BUX1JFQ1VSU0UgJiYgIU9QVF9UUkFWRVJTRV9UT1ApOiAqLworCSAgICBJRl9ERVNLVE9QKCB8fCAob3B0ICYgKEJJVF9SRUNVUlNFfEJJVF9UUkFWRVJTRV9UT1ApKSA9PSBCSVRfUkVDVVJTRSkKKwkpIHsKKwkJcGFyYW0uY2hvd25fZnVuYyA9IGxjaG93bjsKKwl9CisKKwlmbGFncyA9IEFDVElPTl9ERVBUSEZJUlNUOyAvKiBtYXRjaCBjb3JldXRpbHMgb3JkZXIgKi8KKwlpZiAoT1BUX1JFQ1VSU0UpCisJCWZsYWdzIHw9IEFDVElPTl9SRUNVUlNFOworCWlmIChPUFRfVFJBVkVSU0VfVE9QKQorCQlmbGFncyB8PSBBQ1RJT05fRk9MTE9XTElOS1NfTDA7IC8qIC1ILy1MOiBmb2xsb3cgbGlua3Mgb24gZGVwdGggMCAqLworCWlmIChPUFRfVFJBVkVSU0UpCisJCWZsYWdzIHw9IEFDVElPTl9GT0xMT1dMSU5LUzsgLyogZm9sbG93IGxpbmtzIGlmIC1MICovCisKKwlwYXJzZV9jaG93bl91c2VyZ3JvdXBfb3JfZGllKCZwYXJhbS51Z2lkLCBhcmd2WzBdKTsKKworCS8qIE9rLCByZWFkeSB0byBkbyB0aGUgZGVlZCBub3cgKi8KKwl3aGlsZSAoKisrYXJndikgeworCQlpZiAoIXJlY3Vyc2l2ZV9hY3Rpb24oKmFyZ3YsCisJCQkJZmxhZ3MsICAgICAgICAgIC8qIGZsYWdzICovCisJCQkJZmlsZUFjdGlvbiwgICAgIC8qIGZpbGUgYWN0aW9uICovCisJCQkJZmlsZUFjdGlvbiwgICAgIC8qIGRpciBhY3Rpb24gKi8KKwkJCQkmcGFyYW0sICAgICAgICAgLyogdXNlciBkYXRhICovCisJCQkJMCkgICAgICAgICAgICAgIC8qIGRlcHRoICovCisJCSkgeworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQl9CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKK1Rlc3RjYXNlLiBSdW4gaW4gZW1wdHkgZGlyZWN0b3J5LgorCisjIS9iaW4vc2gKK3QxPSIvdG1wL2J1c3lib3ggY2hvd24iCit0Mj0iL3Vzci9iaW4vY2hvd24iCitjcmVhdGUoKSB7CisgICAgcm0gLXJmICQxOyBta2RpciAkMQorICAgICgKKyAgICBjZCAkMSB8fCBleGl0IDEKKyAgICBta2RpciBkaXIgZGlyMgorICAgID51cAorICAgID5maWxlCisgICAgPmRpci9maWxlCisgICAgPmRpcjIvZmlsZQorICAgIGxuIC1zIGRpciBsaW5rZGlyCisgICAgbG4gLXMgZmlsZSBsaW5rZmlsZQorICAgIGxuIC1zIC4uL3VwIGRpci9saW5rdXAKKyAgICBsbiAtcyAuLi9kaXIyIGRpci9saW5rdXBkaXIyCisgICAgKQorICAgIGNob3duIC1SIDA6MCAkMQorfQordHN0KCkgeworICAgIGNyZWF0ZSB0ZXN0MQorICAgIGNyZWF0ZSB0ZXN0MgorICAgIGVjaG8gIlskMV0iID4+dGVzdDEub3V0CisgICAgZWNobyAiWyQxXSIgPj50ZXN0Mi5vdXQKKyAgICAoY2QgdGVzdDE7ICR0MSAkMSkgPj50ZXN0MS5vdXQgMj4mMQorICAgIChjZCB0ZXN0MjsgJHQyICQxKSA+PnRlc3QyLm91dCAyPiYxCisgICAgKGNkIHRlc3QxOyBscyAtbG5SKSA+b3V0MQorICAgIChjZCB0ZXN0MjsgbHMgLWxuUikgPm91dDIKKyAgICBlY2hvICJjaG93biAkMSIgPm91dC5kaWZmCisgICAgaWYgISBkaWZmIC11IG91dDEgb3V0MiA+Pm91dC5kaWZmOyB0aGVuIGV4aXQgMTsgZmkKKyAgICBybSBvdXQuZGlmZgorfQordHN0X2Zvcl9lYWNoKCkgeworICAgIHRzdCAiJDEgMToxIGZpbGUiCisgICAgdHN0ICIkMSAxOjEgZGlyIgorICAgIHRzdCAiJDEgMToxIGxpbmtkaXIiCisgICAgdHN0ICIkMSAxOjEgbGlua2ZpbGUiCit9CitlY2hvICJJZiBzY3JpcHQgcHJvZHVjZWQgJ291dC5kaWZmJyBmaWxlLCB0aGVuIGF0IGxlYXN0IG9uZSB0ZXN0Y2FzZSBmYWlsZWQiCis+dGVzdDEub3V0Cis+dGVzdDIub3V0CisjIFRoZXNlIG1hdGNoIGNvcmV1dGlscyA2Ljg6Cit0c3RfZm9yX2VhY2ggIi12IgordHN0X2Zvcl9lYWNoICItdlIiCit0c3RfZm9yX2VhY2ggIi12UlAiCit0c3RfZm9yX2VhY2ggIi12UkwiCit0c3RfZm9yX2VhY2ggIi12UkgiCit0c3RfZm9yX2VhY2ggIi12aCIKK3RzdF9mb3JfZWFjaCAiLXZoUiIKK3RzdF9mb3JfZWFjaCAiLXZoUlAiCit0c3RfZm9yX2VhY2ggIi12aFJMIgordHN0X2Zvcl9lYWNoICItdmhSSCIKKyMgRml4IGBuYW1lJyBpbiBjb3JldXRpbHMgb3V0cHV0CitzZWQgJ3MvYC8nIiciJy9nJyAtaSB0ZXN0Mi5vdXQKKyMgQ29tcGFyZSB1cyB3aXRoIGNvcmV1dGlscyBvdXRwdXQKK2RpZmYgLXUgdGVzdDEub3V0IHRlc3QyLm91dAorCisqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2Nocm9vdC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2Nocm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGJlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY2hyb290LmMKQEAgLTAsMCArMSw0NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjaHJvb3QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gTWF0Y2hlcyBHTlUgYmVoYXZpb3IuICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaHJvb3RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIk5FV1JPT1QgW1BST0cgQVJHU10iCisvL3VzYWdlOiNkZWZpbmUgY2hyb290X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIFBST0cgd2l0aCByb290IGRpcmVjdG9yeSBzZXQgdG8gTkVXUk9PVCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgY2hyb290X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC9iaW4vbHNcbiIKKy8vdXNhZ2U6ICAgICAgICJscnd4cnd4cnd4ICAgIDEgcm9vdCAgICAgcm9vdCAgICAgICAgICAxMiBBcHIgMTMgMDA6NDYgL2Jpbi9scyAtPiAvQnVzeUJveFxuIgorLy91c2FnZTogICAgICAgIiMgbW91bnQgL2Rldi9oZGMxIC9tbnQgLXQgbWluaXhcbiIKKy8vdXNhZ2U6ICAgICAgICIjIGNocm9vdCAvbW50XG4iCisvL3VzYWdlOiAgICAgICAiIyBscyAtbCAvYmluL2xzXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3eHIteHIteCAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgIDQwODE2IEZlYiAgNSAwNzo0NSAvYmluL2xzKlxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IGNocm9vdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2hyb290X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwkrK2FyZ3Y7CisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCXhjaHJvb3QoKmFyZ3YpOworCXhjaGRpcigiLyIpOworCisJKythcmd2OworCWlmICghKmFyZ3YpIHsgLyogbm8gMm5kIHBhcmFtIChQUk9HKSwgdXNlIHNoZWxsICovCisJCWFyZ3YgLT0gMjsKKwkJYXJndlswXSA9IChjaGFyICopIGdldF9zaGVsbF9uYW1lKCk7CisJCWFyZ3ZbMV0gPSAoY2hhciAqKSAiLWkiOyAvKiBHTlUgY29yZXV0aWxzIDguNCBjb21wYXQgKi8KKwkJLyphcmd2WzJdID0gTlVMTDsgLSBhbHJlYWR5IGlzICovCisJfQorCisJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ja3N1bS5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2Nrc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwYjBjMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ja3N1bS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNrc3VtIC0gY2FsY3VsYXRlIHRoZSBDUkMzMiBjaGVja3N1bSBvZiBhIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgUm9iIFN1bGxpdmFuLCB3aXRoIGlkZWFzIGZyb20gY29kZSBieSBXYWx0ZXIgSGFybXMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBja3N1bV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRklMRVMuLi4iCisvL3VzYWdlOiNkZWZpbmUgY2tzdW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDYWxjdWxhdGUgdGhlIENSQzMyIGNoZWNrc3VtcyBvZiBGSUxFUyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBja3N1bV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2tzdW1fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVpbnQzMl90ICpjcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAxKTsKKwl1aW50MzJfdCBjcmM7CisJb2ZmX3QgbGVuZ3RoLCBmaWxlc2l6ZTsKKwlpbnQgYnl0ZXNfcmVhZDsKKwlpbnQgZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTOworCisjaWYgRU5BQkxFX0RFU0tUT1AKKwlnZXRvcHQzMihhcmd2LCAiIik7IC8qIGNvcmV1dGlscyA2LjkgY29tcGF0ICovCisJYXJndiArPSBvcHRpbmQ7CisjZWxzZQorCWFyZ3YrKzsKKyNlbmRpZgorCisJZG8geworCQlpbnQgZmQgPSBvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YgPyAqYXJndiA6IGJiX21zZ19zdGFuZGFyZF9pbnB1dCk7CisKKwkJaWYgKGZkIDwgMCkgeworCQkJZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKwkJY3JjID0gMDsKKwkJbGVuZ3RoID0gMDsKKworI2RlZmluZSByZWFkX2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCQl3aGlsZSAoKGJ5dGVzX3JlYWQgPSBzYWZlX3JlYWQoZmQsIHJlYWRfYnVmLCBzaXplb2YocmVhZF9idWYpKSkgPiAwKSB7CisJCQlsZW5ndGggKz0gYnl0ZXNfcmVhZDsKKwkJCWNyYyA9IGNyYzMyX2Jsb2NrX2VuZGlhbjEoY3JjLCByZWFkX2J1ZiwgYnl0ZXNfcmVhZCwgY3JjMzJfdGFibGUpOworCQl9CisJCWNsb3NlKGZkKTsKKworCQlmaWxlc2l6ZSA9IGxlbmd0aDsKKworCQl3aGlsZSAobGVuZ3RoKSB7CisJCQljcmMgPSAoY3JjIDw8IDgpIF4gY3JjMzJfdGFibGVbKHVpbnQ4X3QpKGNyYyA+PiAyNCkgXiAodWludDhfdClsZW5ndGhdOworCQkJLyogbXVzdCBlbnN1cmUgdGhhdCBzaGlmdCBpcyB1bnNpZ25lZCEgKi8KKwkJCWlmIChzaXplb2YobGVuZ3RoKSA8PSBzaXplb2YodW5zaWduZWQpKQorCQkJCWxlbmd0aCA9ICh1bnNpZ25lZClsZW5ndGggPj4gODsKKwkJCWVsc2UgaWYgKHNpemVvZihsZW5ndGgpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQlsZW5ndGggPSAodW5zaWduZWQgbG9uZylsZW5ndGggPj4gODsKKwkJCWVsc2UKKwkJCQlsZW5ndGggPSAodW5zaWduZWQgbG9uZyBsb25nKWxlbmd0aCA+PiA4OworCQl9CisJCWNyYyA9IH5jcmM7CisKKwkJcHJpbnRmKCgqYXJndiA/ICIlIlBSSXUzMiIgJSJPRkZfRk1UImkgJXNcbiIgOiAiJSJQUkl1MzIiICUiT0ZGX0ZNVCJpXG4iKSwKKwkJCQljcmMsIGZpbGVzaXplLCAqYXJndik7CisJfSB3aGlsZSAoKmFyZ3YgJiYgKisrYXJndik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KGV4aXRfY29kZSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY29tbS5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2NvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQ1MDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2NvbW0uYwpAQCAtMCwwICsxLDEwOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjb21tIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IFJvYmVydCBTdWxsaXZhbiA8Y29naXRvLmVyZ28uY29naXRvQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjb21tX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLTEyM10gRklMRTEgRklMRTIiCisvL3VzYWdlOiNkZWZpbmUgY29tbV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbXBhcmUgRklMRTEgd2l0aCBGSUxFMlxuIgorLy91c2FnZTogICAgICJcbgktMQlTdXBwcmVzcyBsaW5lcyB1bmlxdWUgdG8gRklMRTEiCisvL3VzYWdlOiAgICAgIlxuCS0yCVN1cHByZXNzIGxpbmVzIHVuaXF1ZSB0byBGSUxFMiIKKy8vdXNhZ2U6ICAgICAiXG4JLTMJU3VwcHJlc3MgbGluZXMgY29tbW9uIHRvIGJvdGggZmlsZXMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIENPTU1fT1BUXzEgKDEgPDwgMCkKKyNkZWZpbmUgQ09NTV9PUFRfMiAoMSA8PCAxKQorI2RlZmluZSBDT01NX09QVF8zICgxIDw8IDIpCisKKy8qIHdyaXRlbGluZSBvdXRwdXRzIHRoZSBpbnB1dCBnaXZlbiwgYXBwcm9wcmlhdGVseSBhbGlnbmVkIGFjY29yZGluZyB0byBjbGFzcyAqLworc3RhdGljIHZvaWQgd3JpdGVsaW5lKGNoYXIgKmxpbmUsIGludCBjbGFzcykKK3sKKwlpbnQgZmxhZ3MgPSBvcHRpb25fbWFzazMyOworCWlmIChjbGFzcyA9PSAwKSB7CisJCWlmIChmbGFncyAmIENPTU1fT1BUXzEpCisJCQlyZXR1cm47CisJfSBlbHNlIGlmIChjbGFzcyA9PSAxKSB7CisJCWlmIChmbGFncyAmIENPTU1fT1BUXzIpCisJCQlyZXR1cm47CisJCWlmICghKGZsYWdzICYgQ09NTV9PUFRfMSkpCisJCQlwdXRjaGFyKCdcdCcpOworCX0gZWxzZSAvKmlmIChjbGFzcyA9PSAyKSovIHsKKwkJaWYgKGZsYWdzICYgQ09NTV9PUFRfMykKKwkJCXJldHVybjsKKwkJaWYgKCEoZmxhZ3MgJiBDT01NX09QVF8xKSkKKwkJCXB1dGNoYXIoJ1x0Jyk7CisJCWlmICghKGZsYWdzICYgQ09NTV9PUFRfMikpCisJCQlwdXRjaGFyKCdcdCcpOworCX0KKwlwdXRzKGxpbmUpOworfQorCitpbnQgY29tbV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY29tbV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqdGhpc2xpbmVbMl07CisJRklMRSAqc3RyZWFtWzJdOworCWludCBpOworCWludCBvcmRlcjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0yIjsKKwlnZXRvcHQzMihhcmd2LCAiMTIzIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCXN0cmVhbVtpXSA9IHhmb3Blbl9zdGRpbihhcmd2W2ldKTsKKwl9CisKKwlvcmRlciA9IDA7CisJdGhpc2xpbmVbMV0gPSB0aGlzbGluZVswXSA9IE5VTEw7CisJd2hpbGUgKDEpIHsKKwkJaWYgKG9yZGVyIDw9IDApIHsKKwkJCWZyZWUodGhpc2xpbmVbMF0pOworCQkJdGhpc2xpbmVbMF0gPSB4bWFsbG9jX2ZnZXRsaW5lKHN0cmVhbVswXSk7CisJCX0KKwkJaWYgKG9yZGVyID49IDApIHsKKwkJCWZyZWUodGhpc2xpbmVbMV0pOworCQkJdGhpc2xpbmVbMV0gPSB4bWFsbG9jX2ZnZXRsaW5lKHN0cmVhbVsxXSk7CisJCX0KKworCQlpID0gIXRoaXNsaW5lWzBdICsgKCF0aGlzbGluZVsxXSA8PCAxKTsKKwkJaWYgKGkpCisJCQlicmVhazsKKwkJb3JkZXIgPSBzdHJjbXAodGhpc2xpbmVbMF0sIHRoaXNsaW5lWzFdKTsKKworCQlpZiAob3JkZXIgPj0gMCkKKwkJCXdyaXRlbGluZSh0aGlzbGluZVsxXSwgb3JkZXIgPyAxIDogMik7CisJCWVsc2UKKwkJCXdyaXRlbGluZSh0aGlzbGluZVswXSwgMCk7CisJfQorCisJLyogRU9GIGF0IGxlYXN0IG9uIG9uZSBvZiB0aGUgc3RyZWFtcyAqLworCWkgJj0gMTsKKwlpZiAodGhpc2xpbmVbaV0pIHsKKwkJLyogc3RyZWFtW2ldIGlzIG5vdCBhdCBFT0YgeWV0ICovCisJCS8qIHdlIGRpZCBub3QgcHJpbnQgdGhpc2xpbmVbaV0geWV0ICovCisJCWNoYXIgKnAgPSB0aGlzbGluZVtpXTsKKwkJd3JpdGVsaW5lKHAsIGkpOworCQl3aGlsZSAoMSkgeworCQkJZnJlZShwKTsKKwkJCXAgPSB4bWFsbG9jX2ZnZXRsaW5lKHN0cmVhbVtpXSk7CisJCQlpZiAoIXApCisJCQkJYnJlYWs7CisJCQl3cml0ZWxpbmUocCwgaSk7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZmNsb3NlKHN0cmVhbVswXSk7CisJCWZjbG9zZShzdHJlYW1bMV0pOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY3AuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9jcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OGUyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY3AuYwpAQCAtMCwwICsxLDIwOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICogU0VMaW51eCBzdXBwb3J0IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9jcC5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogU2l6ZSByZWR1Y3Rpb24uCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gU09VUkNFIERFU1QiCisvL3VzYWdlOiNkZWZpbmUgY3BfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb3B5IFNPVVJDRSB0byBERVNULCBvciBtdWx0aXBsZSBTT1VSQ0UocykgdG8gRElSRUNUT1JZXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hCVNhbWUgYXMgLWRwUiIKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgIlxuCS1jCVByZXNlcnZlIHNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1SLC1yCVJlY3Vyc2UiCisvL3VzYWdlOiAgICAgIlxuCS1kLC1QCVByZXNlcnZlIHN5bWxpbmtzIChkZWZhdWx0IGlmIC1SKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJRm9sbG93IGFsbCBzeW1saW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJRm9sbG93IHN5bWxpbmtzIG9uIGNvbW1hbmQgbGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUHJlc2VydmUgZmlsZSBhdHRyaWJ1dGVzIGlmIHBvc3NpYmxlIgorLy91c2FnZTogICAgICJcbgktZglPdmVyd3JpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1pCVByb21wdCBiZWZvcmUgb3ZlcndyaXRlIgorLy91c2FnZTogICAgICJcbgktbCwtcwlDcmVhdGUgKHN5bSlsaW5rcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGliY29yZXV0aWxzL2NvcmV1dGlscy5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgY3BfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IHNvdXJjZV9zdGF0OworCXN0cnVjdCBzdGF0IGRlc3Rfc3RhdDsKKwljb25zdCBjaGFyICpsYXN0OworCWNvbnN0IGNoYXIgKmRlc3Q7CisJaW50IHNfZmxhZ3M7CisJaW50IGRfZmxhZ3M7CisJaW50IGZsYWdzOworCWludCBzdGF0dXM7CisJZW51bSB7CisJCU9QVF9hID0gMSA8PCAoc2l6ZW9mKEZJTEVVVElMU19DUF9PUFRTVFIpLTEpLAorCQlPUFRfciA9IDEgPDwgKHNpemVvZihGSUxFVVRJTFNfQ1BfT1BUU1RSKSksCisJCU9QVF9QID0gMSA8PCAoc2l6ZW9mKEZJTEVVVElMU19DUF9PUFRTVFIpKzEpLAorCQlPUFRfdiA9IDEgPDwgKHNpemVvZihGSUxFVVRJTFNfQ1BfT1BUU1RSKSsyKSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUF9MT05HX09QVElPTlMKKwkJT1BUX3BhcmVudHMgPSAxIDw8IChzaXplb2YoRklMRVVUSUxTX0NQX09QVFNUUikrMyksCisjZW5kaWYKKwl9OworCisJLy8gTmVlZCBhdCBsZWFzdCB0d28gYXJndW1lbnRzCisJLy8gU29mdC0gYW5kIGhhcmRsaW5raW5nIGRvZXNuJ3QgbWl4CisJLy8gLVAgYW5kIC1kIGFyZSB0aGUgc2FtZSAoLVAgaXMgUE9TSVgsIC1kIGlzIEdOVSkKKwkvLyAtciBhbmQgLVIgYXJlIHRoZSBzYW1lCisJLy8gLVIgKGFuZCB0aGVyZWZvcmUgLXIpIHR1cm5zIG9uIC1kIChjb3JldXRpbHMgZG9lcyB0aGlzKQorCS8vIC1hID0gLXBkUgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0yOmwtLXM6cy0tbDpQZDpyUmQ6UmQ6YXBkUiI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9CisJCSJhcmNoaXZlXDAiICAgICAgICBOb19hcmd1bWVudCAiYSIKKwkJImZvcmNlXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICJmIgorCQkiaW50ZXJhY3RpdmVcMCIgICAgTm9fYXJndW1lbnQgImkiCisJCSJsaW5rXDAiICAgICAgICAgICBOb19hcmd1bWVudCAibCIKKwkJImRlcmVmZXJlbmNlXDAiICAgIE5vX2FyZ3VtZW50ICJMIgorCQkibm8tZGVyZWZlcmVuY2VcMCIgTm9fYXJndW1lbnQgIlAiCisJCSJyZWN1cnNpdmVcMCIgICAgICBOb19hcmd1bWVudCAiUiIKKwkJInN5bWJvbGljLWxpbmtcMCIgIE5vX2FyZ3VtZW50ICJzIgorCQkidmVyYm9zZVwwIiAgICAgICAgTm9fYXJndW1lbnQgInYiCisJCSJwYXJlbnRzXDAiICAgICAgICBOb19hcmd1bWVudCAiXHhmZiIKKwkJOworI2VuZGlmCisJLy8gLXYgKC0tdmVyYm9zZSkgaXMgaWdub3JlZAorCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgRklMRVVUSUxTX0NQX09QVFNUUiAiYXJQdiIpOworCS8qIE9wdGlvbnMgb2YgY3AgZnJvbSBHTlUgY29yZXV0aWxzIDYuMTA6CisJICogLWEsIC0tYXJjaGl2ZQorCSAqIC1mLCAtLWZvcmNlCisJICogLWksIC0taW50ZXJhY3RpdmUKKwkgKiAtbCwgLS1saW5rCisJICogLUwsIC0tZGVyZWZlcmVuY2UKKwkgKiAtUCwgLS1uby1kZXJlZmVyZW5jZQorCSAqIC1SLCAtciwgLS1yZWN1cnNpdmUKKwkgKiAtcywgLS1zeW1ib2xpYy1saW5rCisJICogLXYsIC0tdmVyYm9zZQorCSAqIC1ICWZvbGxvdyBjb21tYW5kLWxpbmUgc3ltYm9saWMgbGlua3MgaW4gU09VUkNFCisJICogLWQJc2FtZSBhcyAtLW5vLWRlcmVmZXJlbmNlIC0tcHJlc2VydmU9bGlua3MKKwkgKiAtcAlzYW1lIGFzIC0tcHJlc2VydmU9bW9kZSxvd25lcnNoaXAsdGltZXN0YW1wcworCSAqIC1jCXNhbWUgYXMgLS1wcmVzZXJ2ZT1jb250ZXh0CisJICogLS1wYXJlbnRzCisJICoJdXNlIGZ1bGwgc291cmNlIGZpbGUgbmFtZSB1bmRlciBESVJFQ1RPUlkKKwkgKiBOT1QgU1VQUE9SVEVEIElOIEJCT1g6CisJICogLS1iYWNrdXBbPUNPTlRST0xdCisJICoJbWFrZSBhIGJhY2t1cCBvZiBlYWNoIGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUKKwkgKiAtYglsaWtlIC0tYmFja3VwIGJ1dCBkb2VzIG5vdCBhY2NlcHQgYW4gYXJndW1lbnQKKwkgKiAtLWNvcHktY29udGVudHMKKwkgKgljb3B5IGNvbnRlbnRzIG9mIHNwZWNpYWwgZmlsZXMgd2hlbiByZWN1cnNpdmUKKwkgKiAtLXByZXNlcnZlWz1BVFRSX0xJU1RdCisJICoJcHJlc2VydmUgYXR0cmlidXRlcyAoZGVmYXVsdDogbW9kZSxvd25lcnNoaXAsdGltZXN0YW1wcyksCisJICoJaWYgcG9zc2libGUgYWRkaXRpb25hbCBhdHRyaWJ1dGVzOiBzZWN1cml0eSBjb250ZXh0LGxpbmtzLGFsbAorCSAqIC0tbm8tcHJlc2VydmU9QVRUUl9MSVNUCisJICogLS1yZW1vdmUtZGVzdGluYXRpb24KKwkgKglyZW1vdmUgIGVhY2ggZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZSBiZWZvcmUgYXR0ZW1wdGluZyB0byBvcGVuCisJICogLS1zcGFyc2U9V0hFTgorCSAqCWNvbnRyb2wgY3JlYXRpb24gb2Ygc3BhcnNlIGZpbGVzCisJICogLS1zdHJpcC10cmFpbGluZy1zbGFzaGVzCisJICoJcmVtb3ZlIGFueSB0cmFpbGluZyBzbGFzaGVzIGZyb20gZWFjaCBTT1VSQ0UgYXJndW1lbnQKKwkgKiAtUywgLS1zdWZmaXg9U1VGRklYCisJICoJb3ZlcnJpZGUgdGhlIHVzdWFsIGJhY2t1cCBzdWZmaXgKKwkgKiAtdCwgLS10YXJnZXQtZGlyZWN0b3J5PURJUkVDVE9SWQorCSAqCWNvcHkgYWxsIFNPVVJDRSBhcmd1bWVudHMgaW50byBESVJFQ1RPUlkKKwkgKiAtVCwgLS1uby10YXJnZXQtZGlyZWN0b3J5CisJICoJdHJlYXQgREVTVCBhcyBhIG5vcm1hbCBmaWxlCisJICogLXUsIC0tdXBkYXRlCisJICoJY29weSBvbmx5IHdoZW4gdGhlIFNPVVJDRSBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGRlc3RpbmF0aW9uCisJICoJZmlsZSBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzIG1pc3NpbmcKKwkgKiAteCwgLS1vbmUtZmlsZS1zeXN0ZW0KKwkgKglzdGF5IG9uIHRoaXMgZmlsZSBzeXN0ZW0KKwkgKiAtWiwgLS1jb250ZXh0PUNPTlRFWFQKKwkgKgkoU0VMaW51eCkgc2V0IFNFTGludXggc2VjdXJpdHkgY29udGV4dCBvZiBjb3B5IHRvIENPTlRFWFQKKwkgKi8KKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwkvKiBSZXZlcnNlIHRoaXMgYml0LiBJZiB0aGVyZSBpcyAtZCwgYml0IGlzIG5vdCBzZXQ6ICovCisJZmxhZ3MgXj0gRklMRVVUSUxTX0RFUkVGRVJFTkNFOworCS8qIGNvcmV1dGlscyA2LjkgY29tcGF0OgorCSAqIGJ5IGRlZmF1bHQsICJjcCIgZGVyZWZzIHN5bWxpbmtzIChjcmVhdGVzIHJlZ3VsYXIgZGVzdCBmaWxlcyksCisJICogYnV0ICJjcCAtUiIgZG9lcyBub3QuIFdlIHN3aXRjaCBvZmYgZGVyZWYgaWYgLXIgb3IgLVIgKHNlZSBhYm92ZSkuCisJICogSG93ZXZlciwgImNwIC1STCIgbXVzdCBzdGlsbCBkZXJlZiBzeW1saW5rczogKi8KKwlpZiAoZmxhZ3MgJiBGSUxFVVRJTFNfREVSRUZfU09GVExJTkspIC8qIC1MICovCisJCWZsYWdzIHw9IEZJTEVVVElMU19ERVJFRkVSRU5DRTsKKworI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKGZsYWdzICYgRklMRVVUSUxTX1BSRVNFUlZFX1NFQ1VSSVRZX0NPTlRFWFQpIHsKKwkJc2VsaW51eF9vcl9kaWUoKTsKKwl9CisjZW5kaWYKKworCXN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwlsYXN0ID0gYXJndlthcmdjIC0gMV07CisJLyogSWYgdGhlcmUgYXJlIG9ubHkgdHdvIGFyZ3VtZW50cyBhbmQuLi4gICovCisJaWYgKGFyZ2MgPT0gMikgeworCQlzX2ZsYWdzID0gY3BfbXZfc3RhdDIoKmFyZ3YsICZzb3VyY2Vfc3RhdCwKKwkJCQkoZmxhZ3MgJiBGSUxFVVRJTFNfREVSRUZFUkVOQ0UpID8gc3RhdCA6IGxzdGF0KTsKKwkJaWYgKHNfZmxhZ3MgPCAwKQorCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJZF9mbGFncyA9IGNwX212X3N0YXQobGFzdCwgJmRlc3Rfc3RhdCk7CisJCWlmIChkX2ZsYWdzIDwgMCkKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUF9MT05HX09QVElPTlMKKwkJaWYgKGZsYWdzICYgT1BUX3BhcmVudHMpIHsKKwkJCWlmICghKGRfZmxhZ3MgJiAyKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3aXRoIC0tcGFyZW50cywgdGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgYSBkaXJlY3RvcnkiKTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJLyogLi4uaWYgbmVpdGhlciBpcyBhIGRpcmVjdG9yeS4uLiAgKi8KKwkJaWYgKCEoKHNfZmxhZ3MgfCBkX2ZsYWdzKSAmIDIpCisJCSAgICAvKiAuLi5vcjogcmVjdXJzaW5nLCB0aGUgMXN0IGlzIGEgZGlyZWN0b3J5LCBhbmQgdGhlIDJuZCBkb2Vzbid0IGV4aXN0Li4uICovCisJCSB8fCAoKGZsYWdzICYgRklMRVVUSUxTX1JFQ1VSKSAmJiAoc19mbGFncyAmIDIpICYmICFkX2ZsYWdzKQorCQkpIHsKKwkJCS8qIERvIGEgc2ltcGxlIGNvcHkgKi8KKwkJCWRlc3QgPSBsYXN0OworCQkJZ290byBET19DT1BZOyAvKiBOQjogYXJnYz09MiAtPiAqKythcmd2PT1sYXN0ICovCisJCX0KKwl9CisKKwl3aGlsZSAoMSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUworCQlpZiAoZmxhZ3MgJiBPUFRfcGFyZW50cykgeworCQkJY2hhciAqZGVzdF9kdXA7CisJCQljaGFyICpkZXN0X2RpcjsKKwkJCWRlc3QgPSBjb25jYXRfcGF0aF9maWxlKGxhc3QsICphcmd2KTsKKwkJCWRlc3RfZHVwID0geHN0cmR1cChkZXN0KTsKKwkJCWRlc3RfZGlyID0gZGlybmFtZShkZXN0X2R1cCk7CisJCQlpZiAoYmJfbWFrZV9kaXJlY3RvcnkoZGVzdF9kaXIsIC0xLCBGSUxFVVRJTFNfUkVDVVIpKSB7CisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJCWZyZWUoZGVzdF9kdXApOworCQkJZ290byBET19DT1BZOworCQl9CisjZW5kaWYKKwkJZGVzdCA9IGNvbmNhdF9wYXRoX2ZpbGUobGFzdCwgYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoKmFyZ3YpKTsKKyBET19DT1BZOgorCQlpZiAoY29weV9maWxlKCphcmd2LCBkZXN0LCBmbGFncykgPCAwKSB7CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwkJaWYgKCorK2FyZ3YgPT0gbGFzdCkgeworCQkJLyogcG9zc2libHkgbGVha2luZyBkZXN0Li4uICovCisJCQlicmVhazsKKwkJfQorCQkvKiBkb24ndCBtb3ZlIHVwOiBkZXN0IG1heSBiZSA9PSBsYXN0IGFuZCBub3QgbWFsbG9jZWQhICovCisJCWZyZWUoKHZvaWQqKWRlc3QpOworCX0KKworCS8qIEV4aXQuIFdlIGFyZSBOT0VYRUMsIG5vdCBOT0ZPUksuIFdlIGRvIGV4aXQgYXQgdGhlIGVuZCBvZiBtYWluKCkgKi8KKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2N1dC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2N1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjdiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvY3V0LmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGN1dC5jIC0gbWluaW1hbGlzdCB2ZXJzaW9uIG9mIGN1dAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgTGluZW8sIGluYy4KKyAqIFdyaXR0ZW4gYnkgTWFyayBXaGl0bGV5IDxtYXJrd0Bjb2RlcG9ldC5vcmc+CisgKiBkZWJsb2F0ZWQgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY3V0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGN1dF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHNlbGVjdGVkIGZpZWxkcyBmcm9tIGVhY2ggaW5wdXQgRklMRSB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgTElTVAlPdXRwdXQgb25seSBieXRlcyBmcm9tIExJU1QiCisvL3VzYWdlOiAgICAgIlxuCS1jIExJU1QJT3V0cHV0IG9ubHkgY2hhcmFjdGVycyBmcm9tIExJU1QiCisvL3VzYWdlOiAgICAgIlxuCS1kIENIQVIJVXNlIENIQVIgaW5zdGVhZCBvZiB0YWIgYXMgdGhlIGZpZWxkIGRlbGltaXRlciIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJT3V0cHV0IG9ubHkgdGhlIGxpbmVzIGNvbnRhaW5pbmcgZGVsaW1pdGVyIgorLy91c2FnZTogICAgICJcbgktZiBOCVByaW50IG9ubHkgdGhlc2UgZmllbGRzIgorLy91c2FnZTogICAgICJcbgktbglJZ25vcmVkIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjdXRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZWNobyBcIkhlbGxvIHdvcmxkXCIgfCBjdXQgLWYgMSAtZCAnICdcbiIKKy8vdXNhZ2U6ICAgICAgICJIZWxsb1xuIgorLy91c2FnZTogICAgICAgIiQgZWNobyBcIkhlbGxvIHdvcmxkXCIgfCBjdXQgLWYgMiAtZCAnICdcbiIKKy8vdXNhZ2U6ICAgICAgICJ3b3JsZFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisvKiBvcHRpb24gdmFycyAqLworc3RhdGljIGNvbnN0IGNoYXIgb3B0c3RyaW5nW10gQUxJR04xID0gImI6YzpmOmQ6c24iOworI2RlZmluZSBDVVRfT1BUX0JZVEVfRkxHUyAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ1VUX09QVF9DSEFSX0ZMR1MgICAgICgxIDw8IDEpCisjZGVmaW5lIENVVF9PUFRfRklFTERTX0ZMR1MgICAoMSA8PCAyKQorI2RlZmluZSBDVVRfT1BUX0RFTElNX0ZMR1MgICAgKDEgPDwgMykKKyNkZWZpbmUgQ1VUX09QVF9TVVBQUkVTU19GTEdTICgxIDw8IDQpCisKK3N0cnVjdCBjdXRfbGlzdCB7CisJaW50IHN0YXJ0cG9zOworCWludCBlbmRwb3M7Cit9OworCitlbnVtIHsKKwlCT0wgPSAwLAorCUVPTCA9IElOVF9NQVgsCisJTk9OX1JBTkdFID0gLTEKK307CisKK3N0YXRpYyBpbnQgY21wZnVuYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXJldHVybiAoKChzdHJ1Y3QgY3V0X2xpc3QgKikgYSktPnN0YXJ0cG9zIC0KKwkJCSgoc3RydWN0IGN1dF9saXN0ICopIGIpLT5zdGFydHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIGN1dF9maWxlKEZJTEUgKmZpbGUsIGNoYXIgZGVsaW0sIGNvbnN0IHN0cnVjdCBjdXRfbGlzdCAqY3V0X2xpc3RzLCB1bnNpZ25lZCBubGlzdHMpCit7CisJY2hhciAqbGluZTsKKwl1bnNpZ25lZCBsaW5lbnVtID0gMDsJLyoga2VlcCB0aGVzZSB6ZXJvLWJhc2VkIHRvIGJlIGNvbnNpc3RlbnQgKi8KKworCS8qIGdvIHRocm91Z2ggZXZlcnkgbGluZSBpbiB0aGUgZmlsZSAqLworCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoZmlsZSkpICE9IE5VTEwpIHsKKworCQkvKiBzZXQgdXAgYSBsaXN0IHNvIHdlIGNhbiBrZWVwIHRyYWNrIG9mIHdoYXQncyBiZWVuIHByaW50ZWQgKi8KKwkJaW50IGxpbmVsZW4gPSBzdHJsZW4obGluZSk7CisJCWNoYXIgKnByaW50ZWQgPSB4emFsbG9jKGxpbmVsZW4gKyAxKTsKKwkJY2hhciAqb3JpZ19saW5lID0gbGluZTsKKwkJdW5zaWduZWQgY2xfcG9zID0gMDsKKwkJaW50IHNwb3M7CisKKwkJLyogY3V0IGJhc2VkIG9uIGNoYXJzL2J5dGVzIFhYWDogb25seSB3b3JrcyB3aGVuIHNpemVvZihjaGFyKSA9PSBieXRlICovCisJCWlmIChvcHRpb25fbWFzazMyICYgKENVVF9PUFRfQ0hBUl9GTEdTIHwgQ1VUX09QVF9CWVRFX0ZMR1MpKSB7CisJCQkvKiBwcmludCB0aGUgY2hhcnMgc3BlY2lmaWVkIGluIGVhY2ggY3V0IGxpc3QgKi8KKwkJCWZvciAoOyBjbF9wb3MgPCBubGlzdHM7IGNsX3BvcysrKSB7CisJCQkJc3BvcyA9IGN1dF9saXN0c1tjbF9wb3NdLnN0YXJ0cG9zOworCQkJCXdoaWxlIChzcG9zIDwgbGluZWxlbikgeworCQkJCQlpZiAoIXByaW50ZWRbc3Bvc10pIHsKKwkJCQkJCXByaW50ZWRbc3Bvc10gPSAnWCc7CisJCQkJCQlwdXRjaGFyKGxpbmVbc3Bvc10pOworCQkJCQl9CisJCQkJCXNwb3MrKzsKKwkJCQkJaWYgKHNwb3MgPiBjdXRfbGlzdHNbY2xfcG9zXS5lbmRwb3MKKwkJCQkJLyogTk9OX1JBTkdFIGlzIC0xLCBzbyBpZiBiZWxvdyBpcyB0cnVlLAorCQkJCQkgKiB0aGUgYWJvdmUgd2FzIHRydWUgdG9vIChzcG9zIGlzID49IDApICovCisJCQkJCS8qIHx8IGN1dF9saXN0c1tjbF9wb3NdLmVuZHBvcyA9PSBOT05fUkFOR0UgKi8KKwkJCQkJKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChkZWxpbSA9PSAnXG4nKSB7CS8qIGN1dCBieSBsaW5lcyAqLworCQkJc3BvcyA9IGN1dF9saXN0c1tjbF9wb3NdLnN0YXJ0cG9zOworCisJCQkvKiBnZXQgb3V0IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0cyB0byBwcm9jZXNzIG9yIGlmIHRoZSBsaW5lcworCQkJICogYXJlIGxvd2VyIHRoYW4gd2hhdCB3ZSdyZSBpbnRlcmVzdGVkIGluICovCisJCQlpZiAoKChpbnQpbGluZW51bSA8IHNwb3MpIHx8IChjbF9wb3MgPj0gbmxpc3RzKSkKKwkJCQlnb3RvIG5leHRfbGluZTsKKworCQkJLyogaWYgdGhlIGxpbmUgd2UncmUgbG9va2luZyBmb3IgaXMgbG93ZXIgdGhhbiB0aGUgb25lIHdlIHdlcmUKKwkJCSAqIHBhc3NlZCwgaXQgbWVhbnMgd2UgZGlzcGxheWVkIGl0IGFscmVhZHksIHNvIG1vdmUgb24gKi8KKwkJCXdoaWxlIChzcG9zIDwgKGludClsaW5lbnVtKSB7CisJCQkJc3BvcysrOworCQkJCS8qIGdvIHRvIHRoZSBuZXh0IGxpc3QgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGlzIG9uZSAqLworCQkJCWlmIChzcG9zID4gY3V0X2xpc3RzW2NsX3Bvc10uZW5kcG9zCisJCQkJIHx8IGN1dF9saXN0c1tjbF9wb3NdLmVuZHBvcyA9PSBOT05fUkFOR0UKKwkJCQkpIHsKKwkJCQkJY2xfcG9zKys7CisJCQkJCS8qIGdldCBvdXQgaWYgdGhlcmUncyBubyBtb3JlIGxpc3RzIHRvIHByb2Nlc3MgKi8KKwkJCQkJaWYgKGNsX3BvcyA+PSBubGlzdHMpCisJCQkJCQlnb3RvIG5leHRfbGluZTsKKwkJCQkJc3BvcyA9IGN1dF9saXN0c1tjbF9wb3NdLnN0YXJ0cG9zOworCQkJCQkvKiBnZXQgb3V0IGlmIHRoZSBjdXJyZW50IGxpbmUgaXMgbG93ZXIgdGhhbiB0aGUgb25lCisJCQkJCSAqIHdlIGp1c3QgYmVjYW1lIGludGVyZXN0ZWQgaW4gKi8KKwkJCQkJaWYgKChpbnQpbGluZW51bSA8IHNwb3MpCisJCQkJCQlnb3RvIG5leHRfbGluZTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIElmIHdlIG1hZGUgaXQgaGVyZSwgaXQgbWVhbnMgd2UndmUgZm91bmQgdGhlIGxpbmUgd2UncmUKKwkJCSAqIGxvb2tpbmcgZm9yLCBzbyBwcmludCBpdCAqLworCQkJcHV0cyhsaW5lKTsKKwkJCWdvdG8gbmV4dF9saW5lOworCQl9IGVsc2UgewkJLyogY3V0IGJ5IGZpZWxkcyAqLworCQkJaW50IG5kZWxpbSA9IC0xOwkvKiB6ZXJvLWJhc2VkIC8gb25lLWJhc2VkIHByb2JsZW0gKi8KKwkJCWludCBuZmllbGRzX3ByaW50ZWQgPSAwOworCQkJY2hhciAqZmllbGQgPSBOVUxMOworCQkJY2hhciBkZWxpbWl0ZXJbMl07CisKKwkJCWRlbGltaXRlclswXSA9IGRlbGltOworCQkJZGVsaW1pdGVyWzFdID0gMDsKKworCQkJLyogZG9lcyB0aGlzIGxpbmUgY29udGFpbiBhbnkgZGVsaW1pdGVycz8gKi8KKwkJCWlmIChzdHJjaHIobGluZSwgZGVsaW0pID09IE5VTEwpIHsKKwkJCQlpZiAoIShvcHRpb25fbWFzazMyICYgQ1VUX09QVF9TVVBQUkVTU19GTEdTKSkKKwkJCQkJcHV0cyhsaW5lKTsKKwkJCQlnb3RvIG5leHRfbGluZTsKKwkJCX0KKworCQkJLyogcHJvY2VzcyBlYWNoIGxpc3Qgb24gdGhpcyBsaW5lLCBmb3IgYXMgbG9uZyBhcyB3ZSd2ZSBnb3QKKwkJCSAqIGEgbGluZSB0byBwcm9jZXNzICovCisJCQlmb3IgKDsgY2xfcG9zIDwgbmxpc3RzICYmIGxpbmU7IGNsX3BvcysrKSB7CisJCQkJc3BvcyA9IGN1dF9saXN0c1tjbF9wb3NdLnN0YXJ0cG9zOworCQkJCWRvIHsKKwkJCQkJLyogZmluZCB0aGUgZmllbGQgd2UncmUgbG9va2luZyBmb3IgKi8KKwkJCQkJd2hpbGUgKGxpbmUgJiYgbmRlbGltIDwgc3BvcykgeworCQkJCQkJZmllbGQgPSBzdHJzZXAoJmxpbmUsIGRlbGltaXRlcik7CisJCQkJCQluZGVsaW0rKzsKKwkJCQkJfQorCisJCQkJCS8qIHdlIGZvdW5kIGl0LCBhbmQgaXQgaGFzbid0IGJlZW4gcHJpbnRlZCB5ZXQgKi8KKwkJCQkJaWYgKGZpZWxkICYmIG5kZWxpbSA9PSBzcG9zICYmICFwcmludGVkW25kZWxpbV0pIHsKKwkJCQkJCS8qIGlmIHRoaXMgaXNuJ3Qgb3VyIGZpcnN0IHRpbWUgdGhyb3VnaCwgd2UgbmVlZCB0bworCQkJCQkJICogcHJpbnQgdGhlIGRlbGltaXRlciBhZnRlciB0aGUgbGFzdCBmaWVsZCB0aGF0IHdhcworCQkJCQkJICogcHJpbnRlZCAqLworCQkJCQkJaWYgKG5maWVsZHNfcHJpbnRlZCA+IDApCisJCQkJCQkJcHV0Y2hhcihkZWxpbSk7CisJCQkJCQlmcHV0cyhmaWVsZCwgc3Rkb3V0KTsKKwkJCQkJCXByaW50ZWRbbmRlbGltXSA9ICdYJzsKKwkJCQkJCW5maWVsZHNfcHJpbnRlZCsrOwkvKiBzaG91bGRuJ3Qgb3ZlcmZsb3cuLiAqLworCQkJCQl9CisKKwkJCQkJc3BvcysrOworCisJCQkJCS8qIGtlZXAgZ29pbmcgYXMgbG9uZyBhcyB3ZSBoYXZlIGEgbGluZSB0byB3b3JrIHdpdGgsCisJCQkJCSAqIHRoaXMgaXMgYSBsaXN0LCBhbmQgd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhhdAorCQkJCQkgKiBsaXN0ICovCisJCQkJfSB3aGlsZSAoc3BvcyA8PSBjdXRfbGlzdHNbY2xfcG9zXS5lbmRwb3MgJiYgbGluZQorCQkJCQkJJiYgY3V0X2xpc3RzW2NsX3Bvc10uZW5kcG9zICE9IE5PTl9SQU5HRSk7CisJCQl9CisJCX0KKwkJLyogaWYgd2UgcHJpbnRlZCBhbnl0aGluZyBhdCBhbGwsIHdlIG5lZWQgdG8gZmluaXNoIGl0IHdpdGggYQorCQkgKiBuZXdsaW5lIGN1eiB3ZSB3ZXJlIGhhbmRlZCBhIGNob21wZWQgbGluZSAqLworCQlwdXRjaGFyKCdcbicpOworIG5leHRfbGluZToKKwkJbGluZW51bSsrOworCQlmcmVlKHByaW50ZWQpOworCQlmcmVlKG9yaWdfbGluZSk7CisJfQorfQorCitpbnQgY3V0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjdXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIGdyb3dhYmxlIGFycmF5IGhvbGRpbmcgYSBzZXJpZXMgb2YgbGlzdHMgKi8KKwlzdHJ1Y3QgY3V0X2xpc3QgKmN1dF9saXN0cyA9IE5VTEw7CisJdW5zaWduZWQgbmxpc3RzID0gMDsJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFib3ZlIGxpc3QgKi8KKwljaGFyIGRlbGltID0gJ1x0JzsJLyogZGVsaW1pdGVyLCBkZWZhdWx0IGlzIHRhYiAqLworCWNoYXIgKnNvcHQsICpsdG9rOworCXVuc2lnbmVkIG9wdDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImItLWJjZjpjLS1iY2Y6Zi0tYmNmIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBvcHRzdHJpbmcsICZzb3B0LCAmc29wdCwgJnNvcHQsICZsdG9rKTsKKy8vCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghKG9wdCAmIChDVVRfT1BUX0JZVEVfRkxHUyB8IENVVF9PUFRfQ0hBUl9GTEdTIHwgQ1VUX09QVF9GSUVMRFNfRkxHUykpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXhwZWN0ZWQgYSBsaXN0IG9mIGJ5dGVzLCBjaGFyYWN0ZXJzLCBvciBmaWVsZHMiKTsKKworCWlmIChvcHQgJiBDVVRfT1BUX0RFTElNX0ZMR1MpIHsKKwkJaWYgKGx0b2tbMF0gJiYgbHRva1sxXSkgeyAvKiBtb3JlIHRoYW4gMSBjaGFyPyAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRoZSBkZWxpbWl0ZXIgbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIiKTsKKwkJfQorCQlkZWxpbSA9IGx0b2tbMF07CisJfQorCisJLyogIG5vbi1maWVsZCAoY2hhciBvciBieXRlKSBjdXR0aW5nIGhhcyBzb21lIHNwZWNpYWwgaGFuZGxpbmcgKi8KKwlpZiAoIShvcHQgJiBDVVRfT1BUX0ZJRUxEU19GTEdTKSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBfb3Bfb25fZmllbGRbXSBBTElHTjEgPSAiIG9ubHkgd2hlbiBvcGVyYXRpbmcgb24gZmllbGRzIjsKKworCQlpZiAob3B0ICYgQ1VUX09QVF9TVVBQUkVTU19GTEdTKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZQorCQkJCSgic3VwcHJlc3Npbmcgbm9uLWRlbGltaXRlZCBsaW5lcyBtYWtlcyBzZW5zZSVzIiwKKwkJCQkgX29wX29uX2ZpZWxkKTsKKwkJfQorCQlpZiAoZGVsaW0gIT0gJ1x0JykgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUKKwkJCQkoImEgZGVsaW1pdGVyIG1heSBiZSBzcGVjaWZpZWQlcyIsIF9vcF9vbl9maWVsZCk7CisJCX0KKwl9CisKKwkvKgorCSAqIHBhcnNlIGxpc3QgYW5kIHB1dCB2YWx1ZXMgaW50byBzdGFydHBvcyBhbmQgZW5kcG9zLgorCSAqIHZhbGlkIGxpc3QgZm9ybWF0czogTiwgTi0sIE4tTSwgLU0KKwkgKiBtb3JlIHRoYW4gb25lIGxpc3QgY2FuIGJlIHNlcGFyYXRlZCBieSBjb21tYXMKKwkgKi8KKwl7CisJCWNoYXIgKm50b2s7CisJCWludCBzID0gMCwgZSA9IDA7CisKKwkJLyogdGFrZSBhcGFydCB0aGUgbGlzdHMsIG9uZSBieSBvbmUgKHRoZXkgYXJlIHNlcGFyYXRlZCB3aXRoIGNvbW1hcykgKi8KKwkJd2hpbGUgKChsdG9rID0gc3Ryc2VwKCZzb3B0LCAiLCIpKSAhPSBOVUxMKSB7CisKKwkJCS8qIGl0J3MgYWN0dWFsbHkgbGVnYWwgdG8gcGFzcyBhbiBlbXB0eSBsaXN0ICovCisJCQlpZiAoIWx0b2tbMF0pCisJCQkJY29udGludWU7CisKKwkJCS8qIGdldCB0aGUgc3RhcnQgcG9zICovCisJCQludG9rID0gc3Ryc2VwKCZsdG9rLCAiLSIpOworCQkJaWYgKCFudG9rWzBdKSB7CisJCQkJcyA9IEJPTDsKKwkJCX0gZWxzZSB7CisJCQkJcyA9IHhhdG9pX3Bvc2l0aXZlKG50b2spOworCQkJCS8qIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgYXJyYXlzIGFyZSB6ZXJvIGJhc2VkLCB3aGlsZQorCQkJCSAqIHRoZSB1c2VyIGV4cGVjdHMgdGhlIGZpcnN0IGNoYXIgb24gdGhlIGxpbmUgdG8gYmUgY2hhciAjMSAqLworCQkJCWlmIChzICE9IDApCisJCQkJCXMtLTsKKwkJCX0KKworCQkJLyogZ2V0IHRoZSBlbmQgcG9zICovCisJCQlpZiAobHRvayA9PSBOVUxMKSB7CisJCQkJZSA9IE5PTl9SQU5HRTsKKwkJCX0gZWxzZSBpZiAoIWx0b2tbMF0pIHsKKwkJCQllID0gRU9MOworCQkJfSBlbHNlIHsKKwkJCQllID0geGF0b2lfcG9zaXRpdmUobHRvayk7CisJCQkJLyogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFuZCBlbmQgcG9zaXRpb24gb2YgMCwKKwkJCQkgKiB0aGF0IG1lYW5zICJ0aWwgdGhlIGVuZCBvZiB0aGUgbGluZSIgKi8KKwkJCQlpZiAoZSA9PSAwKQorCQkJCQllID0gRU9MOworCQkJCWUtLTsJLyogYWdhaW4sIGFycmF5cyBhcmUgemVybyBiYXNlZCwgbGluZXMgYXJlIDEgYmFzZWQgKi8KKwkJCQlpZiAoZSA9PSBzKQorCQkJCQllID0gTk9OX1JBTkdFOworCQkJfQorCisJCQkvKiBhZGQgdGhlIG5ldyBsaXN0ICovCisJCQljdXRfbGlzdHMgPSB4cmVhbGxvY192ZWN0b3IoY3V0X2xpc3RzLCA0LCBubGlzdHMpOworCQkJLyogTkI6IHN0YXJ0cG9zIGlzIGFsd2F5cyA+PSAwLAorCQkJICogd2hpbGUgZW5kcG9zIG1heSBiZSA9IE5PTl9SQU5HRSAoLTEpICovCisJCQljdXRfbGlzdHNbbmxpc3RzXS5zdGFydHBvcyA9IHM7CisJCQljdXRfbGlzdHNbbmxpc3RzXS5lbmRwb3MgPSBlOworCQkJbmxpc3RzKys7CisJCX0KKworCQkvKiBtYWtlIHN1cmUgd2UgZ290IHNvbWUgY3V0IHBvc2l0aW9ucyBvdXQgb2YgYWxsIHRoYXQgKi8KKwkJaWYgKG5saXN0cyA9PSAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm1pc3NpbmcgbGlzdCBvZiBwb3NpdGlvbnMiKTsKKworCQkvKiBub3cgdGhhdCB0aGUgbGlzdHMgYXJlIHBhcnNlZCwgd2UgbmVlZCB0byBzb3J0IHRoZW0gdG8gbWFrZSBsaWZlCisJCSAqIGVhc2llciBvbiB1cyB3aGVuIGl0IGNvbWVzIHRpbWUgdG8gcHJpbnQgdGhlIGNoYXJzIC8gZmllbGRzIC8gbGluZXMKKwkJICovCisJCXFzb3J0KGN1dF9saXN0cywgbmxpc3RzLCBzaXplb2YoY3V0X2xpc3RzWzBdKSwgY21wZnVuYyk7CisJfQorCisJeworCQlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisJCWlmICghKmFyZ3YpCisJCQkqLS1hcmd2ID0gKGNoYXIgKikiLSI7CisKKwkJZG8geworCQkJRklMRSAqZmlsZSA9IGZvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YpOworCQkJaWYgKCFmaWxlKSB7CisJCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY3V0X2ZpbGUoZmlsZSwgZGVsaW0sIGN1dF9saXN0cywgbmxpc3RzKTsKKwkJCWZjbG9zZV9pZl9ub3Rfc3RkaW4oZmlsZSk7CisJCX0gd2hpbGUgKCorK2FyZ3YpOworCisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoY3V0X2xpc3RzKTsKKwkJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9kYXRlLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2Q1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZGF0ZS5jCkBAIC0wLDAgKzEsMzgyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGRhdGUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBieSBNYXR0aGV3IEdyYW50IDxncmFudG1hQGFuYXRob3RoLmdlbi5uej4KKyAqCisgKiBpc28tZm9ybWF0IGhhbmRsaW5nIGFkZGVkIGJ5IFJvYmVydCBHcmllYmwgPGdyaWVibEBnbXguZGU+CisgKiBidWdmaXhlcyBhbmQgY2xlYW51cCBieSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorKi8KKworLyogVGhpcyAnZGF0ZScgY29tbWFuZCBzdXBwb3J0cyBvbmx5IDIgdGltZSBzZXR0aW5nIGZvcm1hdHMsCisgICBhbGwgdGhlIEdOVSBzdHJmdGltZSBzdHVmZiAoaXRzIGluIGxpYmMsIGxldHMgdXNlIGl0KSwKKyAgIHNldHRpbmcgdGltZSB1c2luZyBVVEMgYW5kIGRpc3BsYXlpbmcgaXQsIGFzIHdlbGwgYXMKKyAgIGFuIFJGQyAyODIyIGNvbXBsaWFudCBkYXRlIG91dHB1dCBmb3Igc2hlbGwgc2NyaXB0aW5nCisgICBtYWlsIGNvbW1hbmRzICovCisKKy8qIElucHV0IHBhcnNpbmcgY29kZSBpcyBhbHdheXMgYnVsa3kgLSB1c2VkIGhlYXZ5IGR1dHkgbGliYyBzdHVmZiBhcworICAgbXVjaCBhcyBwb3NzaWJsZSwgbWlzc2VkIG91dCBhIGxvdCBvZiBib3VuZHMgY2hlY2tpbmcgKi8KKworLy9hcHBsZXQ6SUZfREFURShBUFBMRVQoZGF0ZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0RBVEUpICs9IGRhdGUubworCisvL2NvbmZpZzpjb25maWcgREFURQorLy9jb25maWc6CWJvb2wgImRhdGUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZGF0ZSBpcyB1c2VkIHRvIHNldCB0aGUgc3lzdGVtIGRhdGUgb3IgZGlzcGxheSB0aGUKKy8vY29uZmlnOgkgIGN1cnJlbnQgdGltZSBpbiB0aGUgZ2l2ZW4gZm9ybWF0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9EQVRFX0lTT0ZNVAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBJU08gZGF0ZSBmb3JtYXQgb3V0cHV0ICgtSSkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBEQVRFCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIG9wdGlvbiAoLUkpIHRvIG91dHB1dCBhbiBJU08tODYwMSBjb21wbGlhbnQKKy8vY29uZmlnOgkgIGRhdGUvdGltZSBzdHJpbmcuCisvL2NvbmZpZzoKKy8vY29uZmlnOiMgZGVmYXVsdHMgdG8gIm5vIjogc3RhdCdzIG5hbm9zZWNvbmQgZmllbGQgaXMgYSBiaXQgbm9uLXBvcnRhYmxlCisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9EQVRFX05BTk8KKy8vY29uZmlnOglib29sICJTdXBwb3J0ICVbbnVtXU4gbmFub3NlY29uZCBmb3JtYXQgc3BlY2lmaWVyIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gREFURSAgIyBzeXNjYWxsKF9fTlJfY2xvY2tfZ2V0dGltZSkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0ICVbbnVtXU4gZm9ybWF0IHNwZWNpZmllci4gQWRkcyB+MjUwIGJ5dGVzIG9mIGNvZGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0RBVEVfQ09NUEFUCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCB3ZWlyZCAnZGF0ZSBNTUREaGhtbVtbWVldWVldWy5zc10nIGZvcm1hdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIERBVEUKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTeXN0ZW0gdGltZSBjYW4gYmUgc2V0IGJ5ICdkYXRlIC1zIERBVEUnIGFuZCBzaW1wbHkgJ2RhdGUgREFURScsCisvL2NvbmZpZzoJICBidXQgZm9ybWF0cyBvZiBEQVRFIHN0cmluZyBhcmUgZGlmZmVyZW50LiAnZGF0ZSBEQVRFJyBhY2NlcHRzCisvL2NvbmZpZzoJICBhIHJhdGhlciB3ZWlyZCBNTUREaGhtbVtbWVldWVldWy5zc10gZm9ybWF0IHdpdGggY29tcGxldGVseQorLy9jb25maWc6CSAgdW5uYXR1cmFsIHBsYWNlbWVudCBvZiB5ZWFyIGJldHdlZW4gbWludXRlcyBhbmQgc2Vjb25kcy4KKy8vY29uZmlnOgkgIGRhdGUgLXMgKGFuZCBvdGhlciBjb21tYW5kcyBsaWtlIHRvdWNoIC1kKSB1c2UgbW9yZSBzZW5zaWJsZQorLy9jb25maWc6CSAgZm9ybWF0cyAoZm9yIG9uZSwgSVNPIGZvcm1hdCBZWVlZLU1NLUREIGhoOm1tOnNzLnNzc3NzcykuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFdpdGggdGhpcyBvcHRpb24gb2ZmLCAnZGF0ZSBEQVRFJyBpcyAnZGF0ZSAtcyBEQVRFJyBzdXBwb3J0CisvL2NvbmZpZzoJICB0aGUgc2FtZSBmb3JtYXQuIFdpdGggaXQgb24sICdkYXRlIERBVEUnIGFkZGl0aW9uYWxseSBzdXBwb3J0cworLy9jb25maWc6CSAgTU1ERGhobW1bW1lZXVlZXVsuc3NdIGZvcm1hdC4KKworLyogR05VIGNvcmV1dGlscyA2LjkgbWFuIHBhZ2U6CisgKiBkYXRlIFtPUFRJT05dLi4uIFsrRk9STUFUXQorICogZGF0ZSBbLXV8LS11dGN8LS11bml2ZXJzYWxdIFtNTUREaGhtbVtbQ0NdWVldWy5zc11dCisgKiAtZCwgLS1kYXRlPVNUUklORworICogICAgICBkaXNwbGF5IHRpbWUgZGVzY3JpYmVkIGJ5IFNUUklORywgbm90IGBub3cnCisgKiAtZiwgLS1maWxlPURBVEVGSUxFCisgKiAgICAgIGxpa2UgLS1kYXRlIG9uY2UgZm9yIGVhY2ggbGluZSBvZiBEQVRFRklMRQorICogLXIsIC0tcmVmZXJlbmNlPUZJTEUKKyAqICAgICAgZGlzcGxheSB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiBGSUxFCisgKiAtUiwgLS1yZmMtMjgyMgorICogICAgICBvdXRwdXQgZGF0ZSBhbmQgdGltZSBpbiBSRkMgMjgyMiBmb3JtYXQuCisgKiAgICAgIEV4YW1wbGU6IE1vbiwgMDcgQXVnIDIwMDYgMTI6MzQ6NTYgLTA2MDAKKyAqIC0tcmZjLTMzMzk9VElNRVNQRUMKKyAqICAgICAgb3V0cHV0IGRhdGUgYW5kIHRpbWUgaW4gUkZDIDMzMzkgZm9ybWF0LgorICogICAgICBUSU1FU1BFQz0nZGF0ZScsICdzZWNvbmRzJywgb3IgJ25zJworICogICAgICBEYXRlIGFuZCB0aW1lIGNvbXBvbmVudHMgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSBzcGFjZToKKyAqICAgICAgMjAwNi0wOC0wNyAxMjozNDo1Ni0wNjowMAorICogLXMsIC0tc2V0PVNUUklORworICogICAgICBzZXQgdGltZSBkZXNjcmliZWQgYnkgU1RSSU5HCisgKiAtdSwgLS11dGMsIC0tdW5pdmVyc2FsCisgKiAgICAgIHByaW50IG9yIHNldCBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZQorICoKKyAqIEJ1c3lib3g6CisgKiBsb25nIG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAqIC1mIGlzIG5vdCBzdXBwb3J0ZWQKKyAqIC1JIHNlZW1zIHRvIHJvdWdobHkgbWF0Y2ggLS1yZmMtMzMzOSwgYnV0IC1JIGhhcyBfb3B0aW9uYWxfIHBhcmFtCisgKiAgICAodGh1cyAiLUkgc2Vjb25kcyIgZG9lc24ndCB3b3JrLCBvbmx5ICItSXNlY29uZHMiKSwKKyAqICAgIGFuZCBkb2VzIG5vdCBzdXBwb3J0IC1JbnMKKyAqIC1EIEZNVCBpcyBhIGJib3ggZXh0ZW5zaW9uIGZvciBfaW5wdXRfIGNvbnZlcnNpb24gb2YgLWQgREFURQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkYXRlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gWytGTVRdIFtUSU1FXSIKKy8vdXNhZ2U6I2RlZmluZSBkYXRlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSB0aW1lICh1c2luZyArRk1UKSwgb3Igc2V0IHRpbWVcbiIKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCVstc10gVElNRQlTZXQgdGltZSB0byBUSU1FIgorLy91c2FnZTogICAgICJcbgktdQkJV29yayBpbiBVVEMgKGRvbid0IGNvbnZlcnQgdG8gbG9jYWwgdGltZSkiCisvL3VzYWdlOiAgICAgIlxuCS1SCQlPdXRwdXQgUkZDLTI4MjIgY29tcGxpYW50IGRhdGUgc3RyaW5nIgorLy91c2FnZToJKSBJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCVstcywtLXNldF0gVElNRQlTZXQgdGltZSB0byBUSU1FIgorLy91c2FnZTogICAgICJcbgktdSwtLXV0YwlXb3JrIGluIFVUQyAoZG9uJ3QgY29udmVydCB0byBsb2NhbCB0aW1lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVIsLS1yZmMtMjgyMglPdXRwdXQgUkZDLTI4MjIgY29tcGxpYW50IGRhdGUgc3RyaW5nIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9EQVRFX0lTT0ZNVCgKKy8vdXNhZ2U6ICAgICAiXG4JLUlbU1BFQ10JT3V0cHV0IElTTy04NjAxIGNvbXBsaWFudCBkYXRlIHN0cmluZyIKKy8vdXNhZ2U6ICAgICAiXG4JCQlTUEVDPSdkYXRlJyAoZGVmYXVsdCkgZm9yIGRhdGUgb25seSwiCisvL3VzYWdlOiAgICAgIlxuCQkJJ2hvdXJzJywgJ21pbnV0ZXMnLCBvciAnc2Vjb25kcycgZm9yIGRhdGUgYW5kIgorLy91c2FnZTogICAgICJcbgkJCXRpbWUgdG8gdGhlIGluZGljYXRlZCBwcmVjaXNpb24iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktciBGSUxFCQlEaXNwbGF5IGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgRklMRSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgVElNRQkJRGlzcGxheSBUSU1FLCBub3QgJ25vdyciCisvL3VzYWdlOgkpIElGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLXIsLS1yZWZlcmVuY2UgRklMRQlEaXNwbGF5IGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgRklMRSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQsLS1kYXRlIFRJTUUJRGlzcGxheSBUSU1FLCBub3QgJ25vdyciCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0RBVEVfSVNPRk1UKAorLy91c2FnZTogICAgICJcbgktRCBGTVQJCVVzZSBGTVQgZm9yIC1kIFRJTUUgY29udmVyc2lvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuUmVjb2duaXplZCBUSU1FIGZvcm1hdHM6IgorLy91c2FnZTogICAgICJcbgloaDptbVs6c3NdIgorLy91c2FnZTogICAgICJcbglbWVlZWS5dTU0uREQtaGg6bW1bOnNzXSIKKy8vdXNhZ2U6ICAgICAiXG4JWVlZWS1NTS1ERCBoaDptbVs6c3NdIgorLy91c2FnZTogICAgICJcbglbW1tbW1lZXVlZXU1NXUREXWhoXW1tWy5zc10iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRhdGVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZGF0ZVxuIgorLy91c2FnZTogICAgICAgIldlZCBBcHIgMTIgMTg6NTI6NDEgTURUIDIwMDBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWYgRU5BQkxFX0ZFQVRVUkVfREFURV9OQU5PCisjIGluY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjZW5kaWYKKworZW51bSB7CisJT1BUX1JGQzI4MjIgICA9ICgxIDw8IDApLCAvKiBSICovCisJT1BUX1NFVCAgICAgICA9ICgxIDw8IDEpLCAvKiBzICovCisJT1BUX1VUQyAgICAgICA9ICgxIDw8IDIpLCAvKiB1ICovCisJT1BUX0RBVEUgICAgICA9ICgxIDw8IDMpLCAvKiBkICovCisJT1BUX1JFRkVSRU5DRSA9ICgxIDw8IDQpLCAvKiByICovCisJT1BUX1RJTUVTUEVDICA9ICgxIDw8IDUpICogRU5BQkxFX0ZFQVRVUkVfREFURV9JU09GTVQsIC8qIEkgKi8KKwlPUFRfSElOVCAgICAgID0gKDEgPDwgNikgKiBFTkFCTEVfRkVBVFVSRV9EQVRFX0lTT0ZNVCwgLyogRCAqLworfTsKKworc3RhdGljIHZvaWQgbWF5YmVfc2V0X3V0YyhpbnQgb3B0KQoreworCWlmIChvcHQgJiBPUFRfVVRDKQorCQlwdXRlbnYoKGNoYXIqKSJUWj1VVEMwIik7Cit9CisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCitzdGF0aWMgY29uc3QgY2hhciBkYXRlX2xvbmdvcHRzW10gQUxJR04xID0KKwkJInJmYy04MjJcMCIgICBOb19hcmd1bWVudCAgICAgICAiUiIKKwkJInJmYy0yODIyXDAiICBOb19hcmd1bWVudCAgICAgICAiUiIKKwkJInNldFwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAicyIKKwkJInV0Y1wwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAidSIKKwkvKgkidW5pdmVyc2FsXDAiIE5vX2FyZ3VtZW50ICAgICAgICJ1IiAqLworCQkiZGF0ZVwwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJkIgorCQkicmVmZXJlbmNlXDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJyIgorCQk7CisjZW5kaWYKKworaW50IGRhdGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRhdGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlzdHJ1Y3QgdG0gdG1fdGltZTsKKwljaGFyIGJ1Zl9mbXRfZHQyc3RyWzY0XTsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGlmbXQgPSAtMTsKKwljaGFyICpkYXRlX3N0cjsKKwljaGFyICpmbXRfZHQyc3RyOworCWNoYXIgKmZtdF9zdHIyZHQ7CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciAqaXNvZm10X2FyZyA9IE5VTEw7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJkLS1zOnMtLWQiCisJCUlGX0ZFQVRVUkVfREFURV9JU09GTVQoIjpSLS1JOkktLVIiKTsKKwlJRl9MT05HX09QVFMoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGRhdGVfbG9uZ29wdHM7KQorCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJSczp1ZDpyOiIKKwkJCUlGX0ZFQVRVUkVfREFURV9JU09GTVQoIkk6OkQ6IiksCisJCQkmZGF0ZV9zdHIsICZkYXRlX3N0ciwgJmZpbGVuYW1lCisJCQlJRl9GRUFUVVJFX0RBVEVfSVNPRk1UKCwgJmlzb2ZtdF9hcmcsICZmbXRfc3RyMmR0KSk7CisJYXJndiArPSBvcHRpbmQ7CisJbWF5YmVfc2V0X3V0YyhvcHQpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0RBVEVfSVNPRk1UICYmIChvcHQgJiBPUFRfVElNRVNQRUMpKSB7CisJCWlmbXQgPSAwOyAvKiBkZWZhdWx0IGlzIGRhdGUgKi8KKwkJaWYgKGlzb2ZtdF9hcmcpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGlzb2Zvcm1hdHNbXSBBTElHTjEgPQorCQkJCSJkYXRlXDAiImhvdXJzXDAiIm1pbnV0ZXNcMCIic2Vjb25kc1wwIjsgLyogbnM/ICovCisJCQlpZm10ID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhpc29mb3JtYXRzLCBpc29mbXRfYXJnKTsKKwkJCWlmIChpZm10IDwgMCkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisKKwlmbXRfZHQyc3RyID0gTlVMTDsKKwlpZiAoYXJndlswXSAmJiBhcmd2WzBdWzBdID09ICcrJykgeworCQlmbXRfZHQyc3RyID0gJmFyZ3ZbMF1bMV07IC8qIHNraXAgb3ZlciB0aGUgJysnICovCisJCWFyZ3YrKzsKKwl9CisJaWYgKCEob3B0ICYgKE9QVF9TRVQgfCBPUFRfREFURSkpKSB7CisJCW9wdCB8PSBPUFRfU0VUOworCQlkYXRlX3N0ciA9IGFyZ3ZbMF07IC8qIGNhbiBiZSBOVUxMICovCisJCWlmIChkYXRlX3N0cikgeworI2lmIEVOQUJMRV9GRUFUVVJFX0RBVEVfQ09NUEFUCisJCQlpbnQgbGVuID0gc3Ryc3BuKGRhdGVfc3RyLCAiMDEyMzQ1Njc4OSIpOworCQkJaWYgKGRhdGVfc3RyW2xlbl0gPT0gJ1wwJworCQkJIHx8IChkYXRlX3N0cltsZW5dID09ICcuJworCQkJICAgICYmIGlzZGlnaXQoZGF0ZV9zdHJbbGVuKzFdKQorCQkJICAgICYmIGlzZGlnaXQoZGF0ZV9zdHJbbGVuKzJdKQorCQkJICAgICYmIGRhdGVfc3RyW2xlbiszXSA9PSAnXDAnCisJCQkgICAgKQorCQkJKSB7CisJCQkJLyogRHJlYWRlZCBNTUREaGhtbVtbQ0NdWVldWy5zc10gZm9ybWF0IQorCQkJCSAqIEl0IGRvZXMgbm90IG1hdGNoIC1kIG9yIC1zIGZvcm1hdC4KKwkJCQkgKiBTb21lIHVzZXJzIGFjdHVhbGx5IGRvIHVzZSBpdC4KKwkJCQkgKi8KKwkJCQlsZW4gLT0gODsKKwkJCQlpZiAobGVuIDwgMCB8fCBsZW4gPiA0IHx8IChsZW4gJiAxKSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfZGF0ZSwgZGF0ZV9zdHIpOworCQkJCWlmIChsZW4gIT0gMCkgeyAvKiBtb3ZlIFlZIG9yIENDWVkgdG8gZnJvbnQgKi8KKwkJCQkJY2hhciBidWZbNF07CisJCQkJCW1lbWNweShidWYsIGRhdGVfc3RyICsgOCwgbGVuKTsKKwkJCQkJbWVtbW92ZShkYXRlX3N0ciArIGxlbiwgZGF0ZV9zdHIsIDgpOworCQkJCQltZW1jcHkoZGF0ZV9zdHIsIGJ1ZiwgbGVuKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCWFyZ3YrKzsKKwkJfQorCX0KKwlpZiAoKmFyZ3YpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIE5vdyB3ZSBoYXZlIHBhcnNlZCBhbGwgdGhlIGluZm9ybWF0aW9uIGV4Y2VwdCB0aGUgZGF0ZSBmb3JtYXQKKwkgKiB3aGljaCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNsb2NrIGlzIGJlaW5nIHNldCBvciByZWFkICovCisKKwlpZiAob3B0ICYgT1BUX1JFRkVSRU5DRSkgeworCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCQl4c3RhdChmaWxlbmFtZSwgJnN0YXRidWYpOworCQl0cy50dl9zZWMgPSBzdGF0YnVmLnN0X210aW1lOworI2lmIEVOQUJMRV9GRUFUVVJFX0RBVEVfTkFOTworCQl0cy50dl9uc2VjID0gc3RhdGJ1Zi5zdF9tdGltLnR2X25zZWM7CisJCS8qIFNvbWUgdG9vbGNoYWlucyB1c2UgLnN0X210aW1lbnNlYyBpbnN0ZWFkIG9mIHN0X210aW0udHZfbnNlYy4KKwkJICogSWYgeW91IG5lZWQgI2RlZmluZSBfU1ZJRF9TT1VSQ0UgMSB0byBlbmFibGUgc3RfbXRpbS50dl9uc2VjLAorCQkgKiBkcm9wIGEgbWFpbCB0byBwcm9qZWN0IG1haWxpbmcgbGlzdCBwbGVhc2UKKwkJICovCisjZW5kaWYKKwl9IGVsc2UgeworI2lmIEVOQUJMRV9GRUFUVVJFX0RBVEVfTkFOTworCQkvKiBsaWJjIGhhcyBpbmNyZWRpYmx5IG1lc3N5IHdheSBvZiBkb2luZyB0aGlzLAorCQkgKiB0eXBpY2FsbHkgcmVxdWlyaW5nIC1scnQuIFdlIGp1c3Qgc2tpcCBhbGwgdGhpcyBtZXNzICovCisJCXN5c2NhbGwoX19OUl9jbG9ja19nZXR0aW1lLCBDTE9DS19SRUFMVElNRSwgJnRzKTsKKyNlbHNlCisJCXRpbWUoJnRzLnR2X3NlYyk7CisjZW5kaWYKKwl9CisJbG9jYWx0aW1lX3IoJnRzLnR2X3NlYywgJnRtX3RpbWUpOworCisJLyogSWYgZGF0ZSBzdHJpbmcgaXMgZ2l2ZW4sIHVwZGF0ZSB0bV90aW1lLCBhbmQgbWF5YmUgc2V0IGRhdGUgKi8KKwlpZiAoZGF0ZV9zdHIgIT0gTlVMTCkgeworCQkvKiBaZXJvIG91dCBmaWVsZHMgLSB0YWtlIGhlciBiYWNrIHRvIG1pZG5pZ2h0ISAqLworCQl0bV90aW1lLnRtX3NlYyA9IDA7CisJCXRtX3RpbWUudG1fbWluID0gMDsKKwkJdG1fdGltZS50bV9ob3VyID0gMDsKKworCQkvKiBQcm9jZXNzIGFueSBkYXRlIGlucHV0IHRvIFVOSVggdGltZSBzaW5jZSAxIEphbiAxOTcwICovCisJCWlmIChFTkFCTEVfRkVBVFVSRV9EQVRFX0lTT0ZNVCAmJiAob3B0ICYgT1BUX0hJTlQpKSB7CisJCQlpZiAoc3RycHRpbWUoZGF0ZV9zdHIsIGZtdF9zdHIyZHQsICZ0bV90aW1lKSA9PSBOVUxMKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2RhdGUsIGRhdGVfc3RyKTsKKwkJfSBlbHNlIHsKKwkJCXBhcnNlX2RhdGVzdHIoZGF0ZV9zdHIsICZ0bV90aW1lKTsKKwkJfQorCisJCS8qIENvcnJlY3QgYW55IGRheSBvZiB3ZWVrIGFuZCBkYXkgb2YgeWVhciBldGMuIGZpZWxkcyAqLworCQkvKiBCZSBzdXJlIHRvIHJlY2hlY2sgZHN0IChidXQgbm90IGlmIGRhdGUgaXMgdGltZV90IGZvcm1hdCkgKi8KKwkJaWYgKGRhdGVfc3RyWzBdICE9ICdAJykKKwkJCXRtX3RpbWUudG1faXNkc3QgPSAtMTsKKwkJdHMudHZfc2VjID0gdmFsaWRhdGVfdG1fdGltZShkYXRlX3N0ciwgJnRtX3RpbWUpOworCisJCW1heWJlX3NldF91dGMob3B0KTsKKworCQkvKiBpZiBzZXR0aW5nIHRpbWUsIHNldCBpdCAqLworCQlpZiAoKG9wdCAmIE9QVF9TRVQpICYmIHN0aW1lKCZ0cy50dl9zZWMpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc2V0IGRhdGUiKTsKKwkJfQorCX0KKworCS8qIERpc3BsYXkgb3V0cHV0ICovCisKKwkvKiBEZWFsIHdpdGggZm9ybWF0IHN0cmluZyAqLworCWlmIChmbXRfZHQyc3RyID09IE5VTEwpIHsKKwkJaW50IGk7CisJCWZtdF9kdDJzdHIgPSBidWZfZm10X2R0MnN0cjsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0RBVEVfSVNPRk1UICYmIGlmbXQgPj0gMCkgeworCQkJLyogLUlbU1BFQ106IDA6ZGF0ZSAxOmhvdXJzIDI6bWludXRlcyAzOnNlY29uZHMgKi8KKwkJCXN0cmNweShmbXRfZHQyc3RyLCAiJVktJW0tJWRUJUg6JU06JVMiKTsKKwkJCWkgPSA4ICsgMyAqIGlmbXQ7CisJCQlpZiAoaWZtdCAhPSAwKSB7CisJCQkJLyogVE9ETzogaWYgKGlmbXQ9PTQpIGkgKz0gc3ByaW50ZigmZm10X2R0MnN0cltpXSwgIiwlMDl1IiwgbmFub3NlY29uZHMpOyAqLworIGZvcm1hdF91dGM6CisJCQkJZm10X2R0MnN0cltpKytdID0gJyUnOworCQkJCWZtdF9kdDJzdHJbaSsrXSA9IChvcHQgJiBPUFRfVVRDKSA/ICdaJyA6ICd6JzsKKwkJCX0KKwkJCWZtdF9kdDJzdHJbaV0gPSAnXDAnOworCQl9IGVsc2UgaWYgKG9wdCAmIE9QVF9SRkMyODIyKSB7CisJCQkvKiAtUi4gdW5kbyBidXN5Ym94LmMgc2V0bG9jYWxlICovCisJCQlpZiAoRU5BQkxFX0xPQ0FMRV9TVVBQT1JUKQorCQkJCXNldGxvY2FsZShMQ19USU1FLCAiQyIpOworCQkJc3RyY3B5KGZtdF9kdDJzdHIsICIlYSwgJWQgJWIgJVkgJUg6JU06JVMgIik7CisJCQlpID0gc2l6ZW9mKCIlYSwgJWQgJWIgJVkgJUg6JU06JVMgIiktMTsKKwkJCWdvdG8gZm9ybWF0X3V0YzsKKwkJfSBlbHNlIHsgLyogZGVmYXVsdCBjYXNlICovCisJCQlmbXRfZHQyc3RyID0gKGNoYXIqKSIlYSAlYiAlZSAlSDolTTolUyAlWiAlWSI7CisJCX0KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfREFURV9OQU5PCisJZWxzZSB7CisJCS8qIFVzZXItc3BlY2lmaWVkIGZtdF9kdDJzdHIgKi8KKwkJLyogU2VhcmNoIGZvciBhbmQgcHJvY2VzcyAiJU4iICovCisJCWNoYXIgKnAgPSBmbXRfZHQyc3RyOworCQl3aGlsZSAoKHAgPSBzdHJjaHIocCwgJyUnKSkgIT0gTlVMTCkgeworCQkJaW50IG4sIG07CisJCQl1bnNpZ25lZCBwcmVzLCBzY2FsZTsKKworCQkJcCsrOworCQkJaWYgKCpwID09ICclJykgeworCQkJCXArKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW4gPSBzdHJzcG4ocCwgIjAxMjM0NTY3ODkiKTsKKwkJCWlmIChwW25dICE9ICdOJykgeworCQkJCXAgKz0gbjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIFdlIGhhdmUgIiVbbm5uXU4iICovCisJCQlwWy0xXSA9ICdcMCc7CisJCQlwW25dID0gJ1wwJzsKKwkJCXNjYWxlID0gMTsKKwkJCXByZXMgPSA5OworCQkJaWYgKG4pIHsKKwkJCQlwcmVzID0geGF0b2lfcG9zaXRpdmUocCk7CisJCQkJaWYgKHByZXMgPT0gMCkKKwkJCQkJcHJlcyA9IDk7CisJCQkJbSA9IDkgLSBwcmVzOworCQkJCXdoaWxlICgtLW0gPj0gMCkKKwkJCQkJc2NhbGUgKj0gMTA7CisJCQl9CisKKwkJCW0gPSBwIC0gZm10X2R0MnN0cjsKKwkJCXAgKz0gbiArIDE7CisJCQlmbXRfZHQyc3RyID0geGFzcHJpbnRmKCIlcyUwKnUlcyIsIGZtdF9kdDJzdHIsIHByZXMsICh1bnNpZ25lZCl0cy50dl9uc2VjIC8gc2NhbGUsIHApOworCQkJcCA9IGZtdF9kdDJzdHIgKyBtOworCQl9CisJfQorI2VuZGlmCisKKyNkZWZpbmUgZGF0ZV9idWYgYmJfY29tbW9uX2J1ZnNpejEKKwlpZiAoKmZtdF9kdDJzdHIgPT0gJ1wwJykgeworCQkvKiBXaXRoIG5vIGZvcm1hdCBzdHJpbmcsIGp1c3QgcHJpbnQgYSBibGFuayBsaW5lICovCisJCWRhdGVfYnVmWzBdID0gJ1wwJzsKKwl9IGVsc2UgeworCQkvKiBIYW5kbGUgc3BlY2lhbCBjb252ZXJzaW9ucyAqLworCQlpZiAoc3RybmNtcChmbXRfZHQyc3RyLCAiJWYiLCAyKSA9PSAwKSB7CisJCQlmbXRfZHQyc3RyID0gKGNoYXIqKSIlWS4lbS4lZC0lSDolTTolUyI7CisJCX0KKwkJLyogR2VuZXJhdGUgb3V0cHV0IHN0cmluZyAqLworCQlzdHJmdGltZShkYXRlX2J1Ziwgc2l6ZW9mKGRhdGVfYnVmKSwgZm10X2R0MnN0ciwgJnRtX3RpbWUpOworCX0KKwlwdXRzKGRhdGVfYnVmKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZGQuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9kZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjAyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZGQuYwpAQCAtMCwwICsxLDQzOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBkZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgTWF0dCBLcmFhaQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGRkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbaWY9RklMRV0gW29mPUZJTEVdICIgSUZfRkVBVFVSRV9ERF9JQlNfT0JTKCJbaWJzPU5dIFtvYnM9Tl0gIikgIlticz1OXSBbY291bnQ9Tl0gW3NraXA9Tl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW3NlZWs9Tl0iIElGX0ZFQVRVUkVfRERfSUJTX09CUygiIFtjb252PW5vdHJ1bmN8bm9lcnJvcnxzeW5jfGZzeW5jXSIpCisvL3VzYWdlOiNkZWZpbmUgZGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb3B5IGEgZmlsZSB3aXRoIGNvbnZlcnRpbmcgYW5kIGZvcm1hdHRpbmdcbiIKKy8vdXNhZ2U6ICAgICAiXG4JaWY9RklMRQkJUmVhZCBmcm9tIEZJTEUgaW5zdGVhZCBvZiBzdGRpbiIKKy8vdXNhZ2U6ICAgICAiXG4Jb2Y9RklMRQkJV3JpdGUgdG8gRklMRSBpbnN0ZWFkIG9mIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JYnM9TgkJUmVhZCBhbmQgd3JpdGUgTiBieXRlcyBhdCBhIHRpbWUiCisvL3VzYWdlOglJRl9GRUFUVVJFX0REX0lCU19PQlMoCisvL3VzYWdlOiAgICAgIlxuCWlicz1OCQlSZWFkIE4gYnl0ZXMgYXQgYSB0aW1lIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9ERF9JQlNfT0JTKAorLy91c2FnZTogICAgICJcbglvYnM9TgkJV3JpdGUgTiBieXRlcyBhdCBhIHRpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCWNvdW50PU4JCUNvcHkgb25seSBOIGlucHV0IGJsb2NrcyIKKy8vdXNhZ2U6ICAgICAiXG4Jc2tpcD1OCQlTa2lwIE4gaW5wdXQgYmxvY2tzIgorLy91c2FnZTogICAgICJcbglzZWVrPU4JCVNraXAgTiBvdXRwdXQgYmxvY2tzIgorLy91c2FnZToJSUZfRkVBVFVSRV9ERF9JQlNfT0JTKAorLy91c2FnZTogICAgICJcbgljb252PW5vdHJ1bmMJRG9uJ3QgdHJ1bmNhdGUgb3V0cHV0IGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCWNvbnY9bm9lcnJvcglDb250aW51ZSBhZnRlciByZWFkIGVycm9ycyIKKy8vdXNhZ2U6ICAgICAiXG4JY29udj1zeW5jCVBhZCBibG9ja3Mgd2l0aCB6ZXJvcyIKKy8vdXNhZ2U6ICAgICAiXG4JY29udj1mc3luYwlQaHlzaWNhbGx5IHdyaXRlIGRhdGEgb3V0IGJlZm9yZSBmaW5pc2hpbmciCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk51bWJlcnMgbWF5IGJlIHN1ZmZpeGVkIGJ5IGMgKHgxKSwgdyAoeDIpLCBiICh4NTEyKSwga0QgKHgxMDAwKSwgayAoeDEwMjQpLCIKKy8vdXNhZ2U6ICAgICAiXG5NRCAoeDEwMDAwMDApLCBNICh4MTA0ODU3NiksIEdEICh4MTAwMDAwMDAwMCkgb3IgRyAoeDEwNzM3NDE4MjQpIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBkZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkZCBpZj0vZGV2L3plcm8gb2Y9L2Rldi9yYW0xIGJzPTFNIGNvdW50PTRcbiIKKy8vdXNhZ2U6ICAgICAgICI0KzAgcmVjb3JkcyBpblxuIgorLy91c2FnZTogICAgICAgIjQrMCByZWNvcmRzIG91dFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCitlbnVtIHsKKwlpZmQgPSBTVERJTl9GSUxFTk8sCisJb2ZkID0gU1RET1VUX0ZJTEVOTywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgZGRfc3VmZml4ZXNbXSA9IHsKKwl7ICJjIiwgMSB9LAorCXsgInciLCAyIH0sCisJeyAiYiIsIDUxMiB9LAorCXsgImtEIiwgMTAwMCB9LAorCXsgImsiLCAxMDI0IH0sCisJeyAiSyIsIDEwMjQgfSwgIC8qIGNvbXBhdCB3aXRoIGNvcmV1dGlscyBkZCAqLworCXsgIk1EIiwgMTAwMDAwMCB9LAorCXsgIk0iLCAxMDQ4NTc2IH0sCisJeyAiR0QiLCAxMDAwMDAwMDAwIH0sCisJeyAiRyIsIDEwNzM3NDE4MjQgfSwKKwl7ICIiLCAwIH0KK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlvZmZfdCBvdXRfZnVsbCwgb3V0X3BhcnQsIGluX2Z1bGwsIGluX3BhcnQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkUKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfYnl0ZXM7CisJdW5zaWduZWQgbG9uZyBsb25nIGJlZ2luX3RpbWVfdXM7CisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCS8qIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVjYXVzZSBvZiBOT0VYRUMgKi8gXAorCW1lbXNldCgmRywgMCwgc2l6ZW9mKEcpKTsgXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBkZF9vdXRwdXRfc3RhdHVzKGludCBVTlVTRURfUEFSQU0gY3VyX3NpZ25hbCkKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORQorCWRvdWJsZSBzZWNvbmRzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc19zZWM7CisJdW5zaWduZWQgbG9uZyBsb25nIG5vd191cyA9IG1vbm90b25pY191cygpOyAvKiBiZWZvcmUgZnByaW50ZiAqLworI2VuZGlmCisKKwkvKiBEZWxpYmVyYXRlbHkgdXNpbmcgJXUsIG5vdCAlZCAqLworCWZwcmludGYoc3RkZXJyLCAiJSJPRkZfRk1UInUrJSJPRkZfRk1UInUgcmVjb3JkcyBpblxuIgorCQkJIiUiT0ZGX0ZNVCJ1KyUiT0ZGX0ZNVCJ1IHJlY29yZHMgb3V0XG4iLAorCQkJRy5pbl9mdWxsLCBHLmluX3BhcnQsCisJCQlHLm91dF9mdWxsLCBHLm91dF9wYXJ0KTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FCisJZnByaW50ZihzdGRlcnIsICIlbGx1IGJ5dGVzICglc0IpIGNvcGllZCwgIiwKKwkJCUcudG90YWxfYnl0ZXMsCisJCQkvKiBzaG93IGZyYWN0aW9uYWwgZGlnaXQsIHVzZSBzdWZmaXhlcyAqLworCQkJbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIoRy50b3RhbF9ieXRlcywgMSwgMCkKKwkpOworCS8qIENvcm5lciBjYXNlczoKKwkgKiAuL2J1c3lib3ggZGQgPC9kZXYvbnVsbCA+L2Rldi9udWxsCisJICogLi9idXN5Ym94IGRkIGJzPTFNIGNvdW50PTIwMDAgPC9kZXYvemVybyA+L2Rldi9udWxsCisJICogKGVjaG8gRE9ORSkgfCAuL2J1c3lib3ggZGQgPi9kZXYvbnVsbAorCSAqIChzbGVlcCAxOyBlY2hvIERPTkUpIHwgLi9idXN5Ym94IGRkID4vZGV2L251bGwKKwkgKi8KKwlzZWNvbmRzID0gKG5vd191cyAtIEcuYmVnaW5fdGltZV91cykgLyAxMDAwMDAwLjA7CisJYnl0ZXNfc2VjID0gRy50b3RhbF9ieXRlcyAvIHNlY29uZHM7CisJZnByaW50ZihzdGRlcnIsICIlZiBzZWNvbmRzLCAlc0Ivc1xuIiwKKwkJCXNlY29uZHMsCisJCQkvKiBzaG93IGZyYWN0aW9uYWwgZGlnaXQsIHVzZSBzdWZmaXhlcyAqLworCQkJbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIoYnl0ZXNfc2VjLCAxLCAwKQorCSk7CisjZW5kaWYKK30KKworc3RhdGljIHNzaXplX3QgZnVsbF93cml0ZV9vcl93YXJuKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKKwljb25zdCBjaGFyICpjb25zdCBmaWxlbmFtZSkKK3sKKwlzc2l6ZV90IG4gPSBmdWxsX3dyaXRlKG9mZCwgYnVmLCBsZW4pOworCWlmIChuIDwgMCkKKwkJYmJfcGVycm9yX21zZygid3JpdGluZyAnJXMnIiwgZmlsZW5hbWUpOworCXJldHVybiBuOworfQorCitzdGF0aWMgYm9vbCB3cml0ZV9hbmRfc3RhdHMoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBzaXplX3Qgb2JzLAorCWNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXNzaXplX3QgbiA9IGZ1bGxfd3JpdGVfb3Jfd2FybihidWYsIGxlbiwgZmlsZW5hbWUpOworCWlmIChuIDwgMCkKKwkJcmV0dXJuIDE7CisJaWYgKChzaXplX3QpbiA9PSBvYnMpCisJCUcub3V0X2Z1bGwrKzsKKwllbHNlIGlmIChuKSAvKiA+IDAgKi8KKwkJRy5vdXRfcGFydCsrOworI2lmIEVOQUJMRV9GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FCisJRy50b3RhbF9ieXRlcyArPSBuOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfTEZTCisjIGRlZmluZSBYQVRPVV9TRlggeGF0b3VsbF9zZngKKyNlbHNlCisjIGRlZmluZSBYQVRPVV9TRlggeGF0b3VsX3NmeAorI2VuZGlmCisKK2ludCBkZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQkvKiBNdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIE9QX2NvbnZfWFhYISAqLworCQkvKiAoc2VlICJmbGFncyB8PSAoMSA8PCB3aGF0KSIgYmVsb3cpICovCisJCUZMQUdfTk9UUlVOQyA9IDEgPDwgMCwKKwkJRkxBR19TWU5DICAgID0gMSA8PCAxLAorCQlGTEFHX05PRVJST1IgPSAxIDw8IDIsCisJCUZMQUdfRlNZTkMgICA9IDEgPDwgMywKKwkJLyogZW5kIG9mIGNvbnYgZmxhZ3MgKi8KKwkJRkxBR19UV09CVUZTID0gMSA8PCA0LAorCQlGTEFHX0NPVU5UICAgPSAxIDw8IDUsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJic1wwIiJjb3VudFwwIiJzZWVrXDAiInNraXBcMCIiaWZcMCIib2ZcMCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9JQlNfT0JTCisJCSJpYnNcMCIib2JzXDAiImNvbnZcMCIKKyNlbmRpZgorCQk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUworCXN0YXRpYyBjb25zdCBjaGFyIGNvbnZfd29yZHNbXSBBTElHTjEgPQorCQkibm90cnVuY1wwIiJzeW5jXDAiIm5vZXJyb3JcMCIiZnN5bmNcMCI7CisjZW5kaWYKKwllbnVtIHsKKwkJT1BfYnMgPSAwLAorCQlPUF9jb3VudCwKKwkJT1Bfc2VlaywKKwkJT1Bfc2tpcCwKKwkJT1BfaWYsCisJCU9QX29mLAorI2lmIEVOQUJMRV9GRUFUVVJFX0REX0lCU19PQlMKKwkJT1BfaWJzLAorCQlPUF9vYnMsCisJCU9QX2NvbnYsCisJCS8qIE11c3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgRkxBR19YWFghICovCisJCU9QX2NvbnZfbm90cnVuYyA9IDAsCisJCU9QX2NvbnZfc3luYywKKwkJT1BfY29udl9ub2Vycm9yLAorCQlPUF9jb252X2ZzeW5jLAorCS8qIFVuaW1wbGVtZW50ZWQgY29udj1YWFg6ICovCisJLy9ub2NyZWF0ICAgICAgIGRvIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlCisJLy9leGNsICAgICAgICAgIGZhaWwgaWYgdGhlIG91dHB1dCBmaWxlIGFscmVhZHkgZXhpc3RzCisJLy9mZGF0YXN5bmMgICAgIHBoeXNpY2FsbHkgd3JpdGUgb3V0cHV0IGZpbGUgZGF0YSBiZWZvcmUgZmluaXNoaW5nCisJLy9zd2FiICAgICAgICAgIHN3YXAgZXZlcnkgcGFpciBvZiBpbnB1dCBieXRlcworCS8vbGNhc2UgICAgICAgICBjaGFuZ2UgdXBwZXIgY2FzZSB0byBsb3dlciBjYXNlCisJLy91Y2FzZSAgICAgICAgIGNoYW5nZSBsb3dlciBjYXNlIHRvIHVwcGVyIGNhc2UKKwkvL2Jsb2NrICAgICAgICAgcGFkIG5ld2xpbmUtdGVybWluYXRlZCByZWNvcmRzIHdpdGggc3BhY2VzIHRvIGNicy1zaXplCisJLy91bmJsb2NrICAgICAgIHJlcGxhY2UgdHJhaWxpbmcgc3BhY2VzIGluIGNicy1zaXplIHJlY29yZHMgd2l0aCBuZXdsaW5lCisJLy9hc2NpaSAgICAgICAgIGZyb20gRUJDRElDIHRvIEFTQ0lJCisJLy9lYmNkaWMgICAgICAgIGZyb20gQVNDSUkgdG8gRUJDRElDCisJLy9pYm0gICAgICAgICAgIGZyb20gQVNDSUkgdG8gYWx0ZXJuYXRlIEVCQ0RJQworI2VuZGlmCisJfTsKKwlpbnQgZXhpdGNvZGUgPSBFWElUX0ZBSUxVUkU7CisJc2l6ZV90IGlicyA9IDUxMiwgb2JzID0gNTEyOworCXNzaXplX3QgbiwgdzsKKwljaGFyICppYnVmLCAqb2J1ZjsKKwkvKiBBbmQgdGhlc2UgYXJlIGFsbCB6ZXJvZWQgYXQgb25jZSEgKi8KKwlzdHJ1Y3QgeworCQlpbnQgZmxhZ3M7CisJCXNpemVfdCBvYzsKKwkJb2ZmX3QgY291bnQ7CisJCW9mZl90IHNlZWssIHNraXA7CisJCWNvbnN0IGNoYXIgKmluZmlsZSwgKm91dGZpbGU7CisJfSBaOworI2RlZmluZSBmbGFncyAgIChaLmZsYWdzICApCisjZGVmaW5lIG9jICAgICAgKFoub2MgICAgICkKKyNkZWZpbmUgY291bnQgICAoWi5jb3VudCAgKQorI2RlZmluZSBzZWVrICAgIChaLnNlZWsgICApCisjZGVmaW5lIHNraXAgICAgKFouc2tpcCAgICkKKyNkZWZpbmUgaW5maWxlICAoWi5pbmZpbGUgKQorI2RlZmluZSBvdXRmaWxlIChaLm91dGZpbGUpCisKKwltZW1zZXQoJlosIDAsIHNpemVvZihaKSk7CisJSU5JVF9HKCk7CisJLy9mZmx1c2hfYWxsKCk7IC0gaXMgdGhpcyBuZWVkZWQgYmVjYXVzZSBvZiBOT0VYRUM/CisKKwlmb3IgKG4gPSAxOyBhcmd2W25dOyBuKyspIHsKKwkJaW50IHdoYXQ7CisJCWNoYXIgKnZhbDsKKwkJY2hhciAqYXJnID0gYXJndltuXTsKKworI2lmIEVOQUJMRV9ERVNLVE9QCisJCS8qICJkZCAtLSIuIE5COiBjb3JldXRpbHMgNi45IHdpbGwgY29tcGxhaW4gaWYgdGhleSBzZWUKKwkJICogbW9yZSB0aGFuIG9uZSBvZiB0aGVtLiBXZSB3b3VsZG4ndC4gKi8KKwkJaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09ICctJyAmJiBhcmdbMl0gPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCXZhbCA9IHN0cmNocihhcmcsICc9Jyk7CisJCWlmICh2YWwgPT0gTlVMTCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJKnZhbCA9ICdcMCc7CisJCXdoYXQgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCBhcmcpOworCQlpZiAod2hhdCA8IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJCS8qICp2YWwgPSAnPSc7IC0gdG8gcHJlc2VydmUgcHMgbGlzdGluZz8gKi8KKwkJdmFsKys7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUworCQlpZiAod2hhdCA9PSBPUF9pYnMpIHsKKwkJCS8qIE11c3QgZml0IGludG8gcG9zaXRpdmUgc3NpemVfdCAqLworCQkJaWJzID0geGF0b3VsX3JhbmdlX3NmeCh2YWwsIDEsICgoc2l6ZV90KS0xTCkvMiwgZGRfc3VmZml4ZXMpOworCQkJLypjb250aW51ZTsqLworCQl9CisJCWlmICh3aGF0ID09IE9QX29icykgeworCQkJb2JzID0geGF0b3VsX3JhbmdlX3NmeCh2YWwsIDEsICgoc2l6ZV90KS0xTCkvMiwgZGRfc3VmZml4ZXMpOworCQkJLypjb250aW51ZTsqLworCQl9CisJCWlmICh3aGF0ID09IE9QX2NvbnYpIHsKKwkJCXdoaWxlICgxKSB7CisJCQkJLyogZmluZCAnLCcsIHJlcGxhY2UgdGhlbSB3aXRoIE5VTCBzbyB3ZSBjYW4gdXNlIHZhbCBmb3IKKwkJCQkgKiBpbmRleF9pbl9zdHJpbmdzKCkgd2l0aG91dCBjb3B5aW5nLgorCQkJCSAqIFdlIHJlbHkgb24gdmFsIGJlaW5nIG5vbi1udWxsLCBlbHNlIHN0cmNociB3b3VsZCBmYXVsdC4KKwkJCQkgKi8KKwkJCQlhcmcgPSBzdHJjaHIodmFsLCAnLCcpOworCQkJCWlmIChhcmcpCisJCQkJCSphcmcgPSAnXDAnOworCQkJCXdoYXQgPSBpbmRleF9pbl9zdHJpbmdzKGNvbnZfd29yZHMsIHZhbCk7CisJCQkJaWYgKHdoYXQgPCAwKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsIHZhbCwgImNvbnYiKTsKKwkJCQlmbGFncyB8PSAoMSA8PCB3aGF0KTsKKwkJCQlpZiAoIWFyZykgLyogbm8gJywnIGxlZnQsIHNvIHRoaXMgd2FzIHRoZSBsYXN0IHNwZWNpZmllciAqLworCQkJCQlicmVhazsKKwkJCQkvKiAqYXJnID0gJywnOyAtIHRvIHByZXNlcnZlIHBzIGxpc3Rpbmc/ICovCisJCQkJdmFsID0gYXJnICsgMTsgLyogc2tpcCB0aGlzIGtleXdvcmQgYW5kICcsJyAqLworCQkJfQorCQkJY29udGludWU7IC8qIHdlIHRyYXNoZWQgJ3doYXQnLCBjYW4ndCBmYWxsIHRocm91Z2ggKi8KKwkJfQorI2VuZGlmCisJCWlmICh3aGF0ID09IE9QX2JzKSB7CisJCQlpYnMgPSBvYnMgPSB4YXRvdWxfcmFuZ2Vfc2Z4KHZhbCwgMSwgKChzaXplX3QpLTFMKS8yLCBkZF9zdWZmaXhlcyk7CisJCQkvKmNvbnRpbnVlOyovCisJCX0KKwkJLyogVGhlc2UgY2FuIGJlIGxhcmdlOiAqLworCQlpZiAod2hhdCA9PSBPUF9jb3VudCkgeworCQkJZmxhZ3MgfD0gRkxBR19DT1VOVDsKKwkJCWNvdW50ID0gWEFUT1VfU0ZYKHZhbCwgZGRfc3VmZml4ZXMpOworCQkJLypjb250aW51ZTsqLworCQl9CisJCWlmICh3aGF0ID09IE9QX3NlZWspIHsKKwkJCXNlZWsgPSBYQVRPVV9TRlgodmFsLCBkZF9zdWZmaXhlcyk7CisJCQkvKmNvbnRpbnVlOyovCisJCX0KKwkJaWYgKHdoYXQgPT0gT1Bfc2tpcCkgeworCQkJc2tpcCA9IFhBVE9VX1NGWCh2YWwsIGRkX3N1ZmZpeGVzKTsKKwkJCS8qY29udGludWU7Ki8KKwkJfQorCQlpZiAod2hhdCA9PSBPUF9pZikgeworCQkJaW5maWxlID0gdmFsOworCQkJLypjb250aW51ZTsqLworCQl9CisJCWlmICh3aGF0ID09IE9QX29mKSB7CisJCQlvdXRmaWxlID0gdmFsOworCQkJLypjb250aW51ZTsqLworCQl9CisJfSAvKiBlbmQgb2YgImZvciAoYXJndltuXSkiICovCisKKy8vWFhYOkZJWE1FIGZvciBodWdlIGlicyBvciBvYnMsIG1hbGxvYydpbmcgdGhlbSBpc24ndCB0aGUgYnJpZ2h0ZXN0IGlkZWEgZXZlcgorCWlidWYgPSBvYnVmID0geG1hbGxvYyhpYnMpOworCWlmIChpYnMgIT0gb2JzKSB7CisJCWZsYWdzIHw9IEZMQUdfVFdPQlVGUzsKKwkJb2J1ZiA9IHhtYWxsb2Mob2JzKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkcKKwlzaWduYWxfU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR1VTUjEsIGRkX291dHB1dF9zdGF0dXMpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkUKKwlHLmJlZ2luX3RpbWVfdXMgPSBtb25vdG9uaWNfdXMoKTsKKyNlbmRpZgorCisJaWYgKGluZmlsZSAhPSBOVUxMKQorCQl4bW92ZV9mZCh4b3BlbihpbmZpbGUsIE9fUkRPTkxZKSwgaWZkKTsKKwllbHNlIHsKKwkJaW5maWxlID0gYmJfbXNnX3N0YW5kYXJkX2lucHV0OworCX0KKwlpZiAob3V0ZmlsZSAhPSBOVUxMKSB7CisJCWludCBvZmxhZyA9IE9fV1JPTkxZIHwgT19DUkVBVDsKKworCQlpZiAoIXNlZWsgJiYgIShmbGFncyAmIEZMQUdfTk9UUlVOQykpCisJCQlvZmxhZyB8PSBPX1RSVU5DOworCisJCXhtb3ZlX2ZkKHhvcGVuKG91dGZpbGUsIG9mbGFnKSwgb2ZkKTsKKworCQlpZiAoc2VlayAmJiAhKGZsYWdzICYgRkxBR19OT1RSVU5DKSkgeworCQkJaWYgKGZ0cnVuY2F0ZShvZmQsIHNlZWsgKiBvYnMpIDwgMCkgeworCQkJCXN0cnVjdCBzdGF0IHN0OworCisJCQkJaWYgKGZzdGF0KG9mZCwgJnN0KSA8IDAKKwkJCQkgfHwgU19JU1JFRyhzdC5zdF9tb2RlKQorCQkJCSB8fCBTX0lTRElSKHN0LnN0X21vZGUpCisJCQkJKSB7CisJCQkJCWdvdG8gZGllX291dGZpbGU7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJb3V0ZmlsZSA9IGJiX21zZ19zdGFuZGFyZF9vdXRwdXQ7CisJfQorCWlmIChza2lwKSB7CisJCWlmIChsc2VlayhpZmQsIHNraXAgKiBpYnMsIFNFRUtfQ1VSKSA8IDApIHsKKwkJCXdoaWxlIChza2lwLS0gPiAwKSB7CisJCQkJbiA9IHNhZmVfcmVhZChpZmQsIGlidWYsIGlicyk7CisJCQkJaWYgKG4gPCAwKQorCQkJCQlnb3RvIGRpZV9pbmZpbGU7CisJCQkJaWYgKG4gPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKHNlZWspIHsKKwkJaWYgKGxzZWVrKG9mZCwgc2VlayAqIG9icywgU0VFS19DVVIpIDwgMCkKKwkJCWdvdG8gZGllX291dGZpbGU7CisJfQorCisJd2hpbGUgKCEoZmxhZ3MgJiBGTEFHX0NPVU5UKSB8fCAoRy5pbl9mdWxsICsgRy5pbl9wYXJ0ICE9IGNvdW50KSkgeworCQluID0gc2FmZV9yZWFkKGlmZCwgaWJ1ZiwgaWJzKTsKKwkJaWYgKG4gPT0gMCkKKwkJCWJyZWFrOworCQlpZiAobiA8IDApIHsKKwkJCS8qICJCYWQgYmxvY2siICovCisJCQlpZiAoIShmbGFncyAmIEZMQUdfTk9FUlJPUikpCisJCQkJZ290byBkaWVfaW5maWxlOworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coaW5maWxlKTsKKwkJCS8qIEdOVSBkZCB3aXRoIGNvbnY9bm9lcnJvciBza2lwcyBvdmVyIGJhZCBibG9ja3MgKi8KKwkJCXhsc2VlayhpZmQsIGlicywgU0VFS19DVVIpOworCQkJLyogY29udj1ub2Vycm9yLHN5bmMgd3JpdGVzIE5VTHMsCisJCQkgKiBjb252PW5vZXJyb3IganVzdCBpZ25vcmVzIGlucHV0IGJhZCBibG9ja3MgKi8KKwkJCW4gPSAwOworCQl9CisJCWlmICgoc2l6ZV90KW4gPT0gaWJzKQorCQkJRy5pbl9mdWxsKys7CisJCWVsc2UgeworCQkJRy5pbl9wYXJ0Kys7CisJCQlpZiAoZmxhZ3MgJiBGTEFHX1NZTkMpIHsKKwkJCQltZW1zZXQoaWJ1ZiArIG4sIDAsIGlicyAtIG4pOworCQkJCW4gPSBpYnM7CisJCQl9CisJCX0KKwkJaWYgKGZsYWdzICYgRkxBR19UV09CVUZTKSB7CisJCQljaGFyICp0bXAgPSBpYnVmOworCQkJd2hpbGUgKG4pIHsKKwkJCQlzaXplX3QgZCA9IG9icyAtIG9jOworCisJCQkJaWYgKGQgPiAoc2l6ZV90KW4pCisJCQkJCWQgPSBuOworCQkJCW1lbWNweShvYnVmICsgb2MsIHRtcCwgZCk7CisJCQkJbiAtPSBkOworCQkJCXRtcCArPSBkOworCQkJCW9jICs9IGQ7CisJCQkJaWYgKG9jID09IG9icykgeworCQkJCQlpZiAod3JpdGVfYW5kX3N0YXRzKG9idWYsIG9icywgb2JzLCBvdXRmaWxlKSkKKwkJCQkJCWdvdG8gb3V0X3N0YXR1czsKKwkJCQkJb2MgPSAwOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICh3cml0ZV9hbmRfc3RhdHMoaWJ1Ziwgbiwgb2JzLCBvdXRmaWxlKSkKKwkJCWdvdG8gb3V0X3N0YXR1czsKKworCQlpZiAoZmxhZ3MgJiBGTEFHX0ZTWU5DKSB7CisJCQlpZiAoZnN5bmMob2ZkKSA8IDApCisJCQkJZ290byBkaWVfb3V0ZmlsZTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9ERF9JQlNfT0JTICYmIG9jKSB7CisJCXcgPSBmdWxsX3dyaXRlX29yX3dhcm4ob2J1Ziwgb2MsIG91dGZpbGUpOworCQlpZiAodyA8IDApIGdvdG8gb3V0X3N0YXR1czsKKwkJaWYgKHcgPiAwKSBHLm91dF9wYXJ0Kys7CisJfQorCWlmIChjbG9zZShpZmQpIDwgMCkgeworIGRpZV9pbmZpbGU6CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoaW5maWxlKTsKKwl9CisKKwlpZiAoY2xvc2Uob2ZkKSA8IDApIHsKKyBkaWVfb3V0ZmlsZToKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShvdXRmaWxlKTsKKwl9CisKKwlleGl0Y29kZSA9IEVYSVRfU1VDQ0VTUzsKKyBvdXRfc3RhdHVzOgorCWRkX291dHB1dF9zdGF0dXMoMCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShvYnVmKTsKKwkJaWYgKGZsYWdzICYgRkxBR19UV09CVUZTKQorCQkJZnJlZShpYnVmKTsKKwl9CisKKwlyZXR1cm4gZXhpdGNvZGU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZGYuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGJkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZGYuYwpAQCAtMCwwICsxLDI1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBkZiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIGJhc2VkIG9uIG9yaWdpbmFsIGNvZGUgYnkgKEkgdGhpbmspIEJydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIF9OT1RfIGNvbXBsaWFudCAtLSBvcHRpb24gLXQgbWlzc2luZy4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvZGYuaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIFNpemUgcmVkdWN0aW9uLiAgUmVtb3ZlZCBmbG9hdGluZyBwb2ludCBkZXBlbmRlbmN5LiAgQWRkZWQgZXJyb3IgY2hlY2tpbmcKKyAqIG9uIG91dHB1dC4gIE91dHB1dCBzdGF0cyBvbiAwLXNpemVkIGZpbGVzeXN0ZW1zIGlmIHNwZWNpZmljYWxseSBsaXN0ZWQgb24KKyAqIHRoZSBjb21tYW5kIGxpbmUuICBQcm9wZXJseSByb3VuZCAqLWJsb2NrcywgVXNlZCwgYW5kIEF2YWlsYWJsZSBxdWFudGl0aWVzLgorICoKKyAqIEF1ZyAyOCwgMjAwOCAgICAgIEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIEltcGxlbWVudCAtUCBhbmQgLUI7IGJldHRlciBjb3JldXRpbHMgY29tcGF0OyBjbGVhbnVwCisgKi8KKworLy91c2FnZTojZGVmaW5lIGRmX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLVBrIgorLy91c2FnZToJSUZfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSgibWgiKQorLy91c2FnZToJSUZfRkVBVFVSRV9ERl9GQU5DWSgiYWldIFstQiBTSVpFIikKKy8vdXNhZ2U6CSJdIFtGSUxFU1lTVEVNXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBkZl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IGZpbGVzeXN0ZW0gdXNhZ2Ugc3RhdGlzdGljc1xuIgorLy91c2FnZTogICAgICJcbgktUAlQT1NJWCBvdXRwdXQgZm9ybWF0IgorLy91c2FnZTogICAgICJcbgktawkxMDI0LWJ5dGUgYmxvY2tzIChkZWZhdWx0KSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoCisvL3VzYWdlOiAgICAgIlxuCS1tCTFNLWJ5dGUgYmxvY2tzIgorLy91c2FnZTogICAgICJcbgktaAlIdW1hbiByZWFkYWJsZSAoZS5nLiAxSyAyNDNNIDJHKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfREZfRkFOQ1koCisvL3VzYWdlOiAgICAgIlxuCS1hCVNob3cgYWxsIGZpbGVzeXN0ZW1zIgorLy91c2FnZTogICAgICJcbgktaQlJbm9kZXMiCisvL3VzYWdlOiAgICAgIlxuCS1CIFNJWkUJQmxvY2tzaXplIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBkZl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkZlxuIgorLy91c2FnZTogICAgICAgIkZpbGVzeXN0ZW0gICAgICAgICAgIDFLLWJsb2NrcyAgICAgIFVzZWQgQXZhaWxhYmxlIFVzZSUgTW91bnRlZCBvblxuIgorLy91c2FnZTogICAgICAgIi9kZXYvc2RhMyAgICAgICAgICAgICAgODY5MDg2NCAgIDg1NTM1NDAgICAgMTM3MzI0ICA5OCUgL1xuIgorLy91c2FnZTogICAgICAgIi9kZXYvc2RhMSAgICAgICAgICAgICAgICA2NDIxNiAgICAgMzYzNjQgICAgIDI3ODUyICA1NyUgL2Jvb3RcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGRmIC9kZXYvc2RhM1xuIgorLy91c2FnZTogICAgICAgIkZpbGVzeXN0ZW0gICAgICAgICAgIDFLLWJsb2NrcyAgICAgIFVzZWQgQXZhaWxhYmxlIFVzZSUgTW91bnRlZCBvblxuIgorLy91c2FnZTogICAgICAgIi9kZXYvc2RhMyAgICAgICAgICAgICAgODY5MDg2NCAgIDg1NTM1NDAgICAgMTM3MzI0ICA5OCUgL1xuIgorLy91c2FnZTogICAgICAgIiQgUE9TSVhMWV9DT1JSRUNUPXN1cmUgZGYgL2Rldi9zZGEzXG4iCisvL3VzYWdlOiAgICAgICAiRmlsZXN5c3RlbSAgICAgICAgIDUxMkItYmxvY2tzICAgICAgVXNlZCBBdmFpbGFibGUgVXNlJSBNb3VudGVkIG9uXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9zZGEzICAgICAgICAgICAgIDE3MzgxNzI4ICAxNzEwNzA4MCAgICAyNzQ2NDggIDk4JSAvXG4iCisvL3VzYWdlOiAgICAgICAiJCBQT1NJWExZX0NPUlJFQ1Q9eWVwIGRmIC1QIC9kZXYvc2RhM1xuIgorLy91c2FnZTogICAgICAgIkZpbGVzeXN0ZW0gICAgICAgICAgNTEyLWJsb2NrcyAgICAgIFVzZWQgQXZhaWxhYmxlIENhcGFjaXR5IE1vdW50ZWQgb25cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L3NkYTMgICAgICAgICAgICAgMTczODE3MjggIDE3MTA3MDgwICAgIDI3NDY0OCAgICAgIDk4JSAvXG4iCisKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGtzY2FsZSh1bnNpZ25lZCBsb25nIGIsIHVuc2lnbmVkIGxvbmcgYnMpCit7CisJcmV0dXJuIChiICogKHVuc2lnbmVkIGxvbmcgbG9uZykgYnMgKyAxMDI0LzIpIC8gMTAyNDsKK30KKyNlbmRpZgorCitpbnQgZGZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRmX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIGJsb2Nrc191c2VkOworCXVuc2lnbmVkIGJsb2Nrc19wZXJjZW50X3VzZWQ7CisJdW5zaWduZWQgbG9uZyBkZl9kaXNwX2hyID0gMTAyNDsKKwlpbnQgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCXVuc2lnbmVkIG9wdDsKKwlGSUxFICptb3VudF90YWJsZTsKKwlzdHJ1Y3QgbW50ZW50ICptb3VudF9lbnRyeTsKKwlzdHJ1Y3Qgc3RhdGZzIHM7CisKKwllbnVtIHsKKwkJT1BUX0tJTE8gID0gKDEgPDwgMCksCisJCU9QVF9QT1NJWCA9ICgxIDw8IDEpLAorCQlPUFRfQUxMICAgPSAoMSA8PCAyKSAqIEVOQUJMRV9GRUFUVVJFX0RGX0ZBTkNZLAorCQlPUFRfSU5PREUgPSAoMSA8PCAzKSAqIEVOQUJMRV9GRUFUVVJFX0RGX0ZBTkNZLAorCQlPUFRfQlNJWkUgPSAoMSA8PCA0KSAqIEVOQUJMRV9GRUFUVVJFX0RGX0ZBTkNZLAorCQlPUFRfSFVNQU4gPSAoMSA8PCAoMiArIDMqRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1kpKSAqIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFLAorCQlPUFRfTUVHQSAgPSAoMSA8PCAoMyArIDMqRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1kpKSAqIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFLAorCX07CisJY29uc3QgY2hhciAqZGlzcF91bml0c19oZHIgPSBOVUxMOworCWNoYXIgKmNocDsKKworCWluaXRfdW5pY29kZSgpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUgJiYgRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1kKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJrLW1COm0tQms6Qi1rbSI7CisjZWxpZiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCW9wdF9jb21wbGVtZW50YXJ5ID0gImstbTptLWsiOworI2VuZGlmCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImtQIgorCQkJSUZfRkVBVFVSRV9ERl9GQU5DWSgiYWlCOiIpCisJCQlJRl9GRUFUVVJFX0hVTUFOX1JFQURBQkxFKCJobSIpCisJCQlJRl9GRUFUVVJFX0RGX0ZBTkNZKCwgJmNocCkpOworCWlmIChvcHQgJiBPUFRfTUVHQSkKKwkJZGZfZGlzcF9ociA9IDEwMjQqMTAyNDsKKworCWlmIChvcHQgJiBPUFRfQlNJWkUpCisJCWRmX2Rpc3BfaHIgPSB4YXRvdWxfcmFuZ2UoY2hwLCAxLCBVTE9OR19NQVgpOyAvKiBkaXNhbGxvdyAwICovCisKKwkvKiBGcm9tIHRoZSBtYW5wYWdlIG9mIGRmIGZyb20gY29yZXV0aWxzLTYuMTA6CisJICAgRGlzayBzcGFjZSBpcyBzaG93biBpbiAxSyBibG9ja3MgYnkgZGVmYXVsdCwgdW5sZXNzIHRoZSBlbnZpcm9ubWVudAorCSAgIHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCBpcyBzZXQsIGluIHdoaWNoIGNhc2UgNTEyLWJ5dGUgYmxvY2tzIGFyZSB1c2VkLgorCSovCisJaWYgKGdldGVudigiUE9TSVhMWV9DT1JSRUNUIikpIC8qIFRPRE8gLSBhIG5ldyBsaWJiYiBmdW5jdGlvbj8gKi8KKwkJZGZfZGlzcF9ociA9IDUxMjsKKworCWlmIChvcHQgJiBPUFRfSFVNQU4pIHsKKwkJZGZfZGlzcF9ociA9IDA7CisJCWRpc3BfdW5pdHNfaGRyID0gIiAgICAgU2l6ZSI7CisJfQorCWlmIChvcHQgJiBPUFRfSU5PREUpCisJCWRpc3BfdW5pdHNfaGRyID0gIiAgIElub2RlcyI7CisKKwlpZiAoZGlzcF91bml0c19oZHIgPT0gTlVMTCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJCWRpc3BfdW5pdHNfaGRyID0geGFzcHJpbnRmKCIlcy1ibG9ja3MiLAorCQkJLyogcHJpbnQgZGZfZGlzcF9ociwgc2hvdyBubyBmcmFjdGlvbmFscywKKwkJCSAqIHVzZSBzdWZmaXhlcyBpZiBPUFRfUE9TSVggaXMgc2V0IGluIG9wdCAqLworCQkJbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIoZGZfZGlzcF9ociwgMCwgISEob3B0ICYgT1BUX1BPU0lYKSkKKwkJKTsKKyNlbHNlCisJCWRpc3BfdW5pdHNfaGRyID0geGFzcHJpbnRmKCIlbHUtYmxvY2tzIiwgZGZfZGlzcF9ocik7CisjZW5kaWYKKwl9CisJcHJpbnRmKCJGaWxlc3lzdGVtICAgICAgICAgICAlLTE1c1VzZWQgQXZhaWxhYmxlICVzIE1vdW50ZWQgb25cbiIsCisJCQlkaXNwX3VuaXRzX2hkciwgKG9wdCAmIE9QVF9QT1NJWCkgPyAiQ2FwYWNpdHkiIDogIlVzZSUiKTsKKworCW1vdW50X3RhYmxlID0gTlVMTDsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJbW91bnRfdGFibGUgPSBzZXRtbnRlbnQoYmJfcGF0aF9tdGFiX2ZpbGUsICJyIik7CisJCWlmICghbW91bnRfdGFibGUpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfcGF0aF9tdGFiX2ZpbGUpOworCX0KKworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKmRldmljZTsKKwkJY29uc3QgY2hhciAqbW91bnRfcG9pbnQ7CisKKwkJaWYgKG1vdW50X3RhYmxlKSB7CisJCQltb3VudF9lbnRyeSA9IGdldG1udGVudChtb3VudF90YWJsZSk7CisJCQlpZiAoIW1vdW50X2VudHJ5KSB7CisJCQkJZW5kbW50ZW50KG1vdW50X3RhYmxlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1vdW50X3BvaW50ID0gKmFyZ3YrKzsKKwkJCWlmICghbW91bnRfcG9pbnQpCisJCQkJYnJlYWs7CisJCQltb3VudF9lbnRyeSA9IGZpbmRfbW91bnRfcG9pbnQobW91bnRfcG9pbnQsIDEpOworCQkJaWYgKCFtb3VudF9lbnRyeSkgeworCQkJCWJiX2Vycm9yX21zZygiJXM6IGNhbid0IGZpbmQgbW91bnQgcG9pbnQiLCBtb3VudF9wb2ludCk7Cisgc2V0X2Vycm9yOgorCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWRldmljZSA9IG1vdW50X2VudHJ5LT5tbnRfZnNuYW1lOworCQltb3VudF9wb2ludCA9IG1vdW50X2VudHJ5LT5tbnRfZGlyOworCisJCWlmIChzdGF0ZnMobW91bnRfcG9pbnQsICZzKSAhPSAwKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhtb3VudF9wb2ludCk7CisJCQlnb3RvIHNldF9lcnJvcjsKKwkJfQorCisJCWlmICgocy5mX2Jsb2NrcyA+IDApIHx8ICFtb3VudF90YWJsZSB8fCAob3B0ICYgT1BUX0FMTCkpIHsKKwkJCWlmIChvcHQgJiBPUFRfSU5PREUpIHsKKwkJCQlzLmZfYmxvY2tzID0gcy5mX2ZpbGVzOworCQkJCXMuZl9iYXZhaWwgPSBzLmZfYmZyZWUgPSBzLmZfZmZyZWU7CisJCQkJcy5mX2JzaXplID0gMTsKKworCQkJCWlmIChkZl9kaXNwX2hyKQorCQkJCQlkZl9kaXNwX2hyID0gMTsKKwkJCX0KKwkJCWJsb2Nrc191c2VkID0gcy5mX2Jsb2NrcyAtIHMuZl9iZnJlZTsKKwkJCWJsb2Nrc19wZXJjZW50X3VzZWQgPSAwOworCQkJaWYgKGJsb2Nrc191c2VkICsgcy5mX2JhdmFpbCkgeworCQkJCWJsb2Nrc19wZXJjZW50X3VzZWQgPSAoYmxvY2tzX3VzZWQgKiAxMDBVTEwKKwkJCQkJCSsgKGJsb2Nrc191c2VkICsgcy5mX2JhdmFpbCkvMgorCQkJCQkJKSAvIChibG9ja3NfdXNlZCArIHMuZl9iYXZhaWwpOworCQkJfQorCisJCQkvKiBHTlUgY29yZXV0aWxzIDYuMTAgc2tpcHMgY2VydGFpbiBtb3VudHMsIHRyeSB0byBiZSBjb21wYXRpYmxlLiAgKi8KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TS0lQX1JPT1RGUyAmJiBzdHJjbXAoZGV2aWNlLCAicm9vdGZzIikgPT0gMCkKKwkJCQljb250aW51ZTsKKworI2lmZGVmIFdIWV9XRV9ET19JVF9GT1JfREVWX1JPT1RfT05MWQorCQkJaWYgKHN0cmNtcChkZXZpY2UsICIvZGV2L3Jvb3QiKSA9PSAwKSB7CisJCQkJLyogQWRqdXN0cyBkZXZpY2UgdG8gYmUgdGhlIHJlYWwgcm9vdCBkZXZpY2UsCisJCQkJICogb3IgbGVhdmVzIGRldmljZSBhbG9uZSBpZiBpdCBjYW4ndCBmaW5kIGl0ICovCisJCQkJZGV2aWNlID0gZmluZF9ibG9ja19kZXZpY2UoIi8iKTsKKwkJCQlpZiAoIWRldmljZSkgeworCQkJCQlnb3RvIHNldF9lcnJvcjsKKwkJCQl9CisJCQl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCXsKKwkJCQl1bmlfc3RhdF90IHVuaV9zdGF0OworCQkJCWNoYXIgKnVuaV9kZXYgPSB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlKCZ1bmlfc3RhdCwgZGV2aWNlKTsKKwkJCQlpZiAodW5pX3N0YXQudW5pY29kZV93aWR0aCA+IDIwICYmICEob3B0ICYgT1BUX1BPU0lYKSkgeworCQkJCQlwcmludGYoIiVzXG4lMjBzIiwgdW5pX2RldiwgIiIpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ZigiJXMlKnMiLCB1bmlfZGV2LCAyMCAtIChpbnQpdW5pX3N0YXQudW5pY29kZV93aWR0aCwgIiIpOworCQkJCX0KKwkJCQlmcmVlKHVuaV9kZXYpOworCQkJfQorI2Vsc2UKKwkJCWlmIChwcmludGYoIlxuJS0yMHMiICsgMSwgZGV2aWNlKSA+IDIwICYmICEob3B0ICYgT1BUX1BPU0lYKSkKKwkJCQkgICAgcHJpbnRmKCJcbiUtMjBzIiwgIiIpOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCQkJcHJpbnRmKCIgJTlzICIsCisJCQkJLyogZl9ibG9ja3MgeCBmX2JzaXplIC8gZGZfZGlzcF9ociwgc2hvdyBvbmUgZnJhY3Rpb25hbCwKKwkJCQkgKiB1c2Ugc3VmZml4ZXMgaWYgZGZfZGlzcF9ociA9PSAwICovCisJCQkJbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIocy5mX2Jsb2Nrcywgcy5mX2JzaXplLCBkZl9kaXNwX2hyKSk7CisKKwkJCXByaW50ZigiICU5cyAiICsgMSwKKwkJCQkvKiBFWFBSIHggZl9ic2l6ZSAvIGRmX2Rpc3BfaHIsIHNob3cgb25lIGZyYWN0aW9uYWwsCisJCQkJICogdXNlIHN1ZmZpeGVzIGlmIGRmX2Rpc3BfaHIgPT0gMCAqLworCQkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKChzLmZfYmxvY2tzIC0gcy5mX2JmcmVlKSwKKwkJCQkJCXMuZl9ic2l6ZSwgZGZfZGlzcF9ocikpOworCisJCQlwcmludGYoIiU5cyAlM3UlJSAlc1xuIiwKKwkJCQkvKiBmX2JhdmFpbCB4IGZfYnNpemUgLyBkZl9kaXNwX2hyLCBzaG93IG9uZSBmcmFjdGlvbmFsLAorCQkJCSAqIHVzZSBzdWZmaXhlcyBpZiBkZl9kaXNwX2hyID09IDAgKi8KKwkJCQltYWtlX2h1bWFuX3JlYWRhYmxlX3N0cihzLmZfYmF2YWlsLCBzLmZfYnNpemUsIGRmX2Rpc3BfaHIpLAorCQkJCWJsb2Nrc19wZXJjZW50X3VzZWQsIG1vdW50X3BvaW50KTsKKyNlbHNlCisJCQlwcmludGYoIiAlOWx1ICU5bHUgJTlsdSAlM3UlJSAlc1xuIiwKKwkJCQlrc2NhbGUocy5mX2Jsb2Nrcywgcy5mX2JzaXplKSwKKwkJCQlrc2NhbGUocy5mX2Jsb2NrcyAtIHMuZl9iZnJlZSwgcy5mX2JzaXplKSwKKwkJCQlrc2NhbGUocy5mX2JhdmFpbCwgcy5mX2JzaXplKSwKKwkJCQlibG9ja3NfcGVyY2VudF91c2VkLCBtb3VudF9wb2ludCk7CisjZW5kaWYKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZGlybmFtZS5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2Rpcm5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDEwNjdjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2Rpcm5hbWUuYwpAQCAtMCwwICsxLDMzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGRpcm5hbWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvZGlybmFtZS5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSBkaXJuYW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFTkFNRSIKKy8vdXNhZ2U6I2RlZmluZSBkaXJuYW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3RyaXAgbm9uLWRpcmVjdG9yeSBzdWZmaXggZnJvbSBGSUxFTkFNRSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZGlybmFtZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkaXJuYW1lIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiL3RtcFxuIgorLy91c2FnZTogICAgICAgIiQgZGlybmFtZSAvdG1wL2Zvby9cbiIKKy8vdXNhZ2U6ICAgICAgICIvdG1wXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgZGlybmFtZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGlybmFtZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcHV0cyhkaXJuYW1lKHNpbmdsZV9hcmd2KGFyZ3YpKSk7CisJcmV0dXJuIGZmbHVzaF9hbGwoKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9kb3MydW5peC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2RvczJ1bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczOThiZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9kb3MydW5peC5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBkb3MydW5peCBmb3IgQnVzeUJveAorICoKKyAqIGRvczJ1bml4ICdcbicgY29udmVydG9yIDAuNS4wCisgKiBiYXNlZCBvbiBVbml4MkRvcyAwLjkuMCBieSBQZXRlciBIYW5lY2FrIChtYWRlIDE5LjIuMTk5NykKKyAqIENvcHlyaWdodCAxOTk3LC4uIGJ5IFBldGVyIEhhbmVjYWsgPGhhbmVjYWtAbWVnYWxvbWFuLnNrPi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogZG9zMnVuaXggZmlsdGVycyByZWFkaW5nIGlucHV0IGZyb20gc3RkaW4gYW5kIHdyaXRpbmcgb3V0cHV0IHRvIHN0ZG91dC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorKi8KKworLy91c2FnZTojZGVmaW5lIGRvczJ1bml4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXVkXSBbRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgZG9zMnVuaXhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb252ZXJ0IEZJTEUgaW4tcGxhY2UgZnJvbSBET1MgdG8gVW5peCBmb3JtYXQuXG4iCisvL3VzYWdlOiAgICAgICAiV2hlbiBubyBmaWxlIGlzIGdpdmVuLCB1c2Ugc3RkaW4vc3Rkb3V0LlxuIgorLy91c2FnZTogICAgICJcbgktdQlkb3MydW5peCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJdW5peDJkb3MiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHVuaXgyZG9zX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXVkXSBbRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgdW5peDJkb3NfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb252ZXJ0IEZJTEUgaW4tcGxhY2UgZnJvbSBVbml4IHRvIERPUyBmb3JtYXQuXG4iCisvL3VzYWdlOiAgICAgICAiV2hlbiBubyBmaWxlIGlzIGdpdmVuLCB1c2Ugc3RkaW4vc3Rkb3V0LlxuIgorLy91c2FnZTogICAgICJcbgktdQlkb3MydW5peCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJdW5peDJkb3MiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitlbnVtIHsKKwlDVF9VTklYMkRPUyA9IDEsCisJQ1RfRE9TMlVOSVgKK307CisKKy8qIGlmIGZuIGlzIE5VTEwgdGhlbiBpbnB1dCBpcyBzdGRpbiBhbmQgb3V0cHV0IGlzIHN0ZG91dCAqLworc3RhdGljIHZvaWQgY29udmVydChjaGFyICpmbiwgaW50IGNvbnZfdHlwZSkKK3sKKwlGSUxFICppbiwgKm91dDsKKwlpbnQgaTsKKwljaGFyICp0ZW1wX2ZuID0gdGVtcF9mbjsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqcmVzb2x2ZWRfZm4gPSByZXNvbHZlZF9mbjsKKworCWluID0gc3RkaW47CisJb3V0ID0gc3Rkb3V0OworCWlmIChmbiAhPSBOVUxMKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCisJCXJlc29sdmVkX2ZuID0geG1hbGxvY19mb2xsb3dfc3ltbGlua3MoZm4pOworCQlpZiAocmVzb2x2ZWRfZm4gPT0gTlVMTCkKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoZm4pOworCQlpbiA9IHhmb3Blbl9mb3JfcmVhZChyZXNvbHZlZF9mbik7CisJCWZzdGF0KGZpbGVubyhpbiksICZzdCk7CisKKwkJdGVtcF9mbiA9IHhhc3ByaW50ZigiJXNYWFhYWFgiLCByZXNvbHZlZF9mbik7CisJCWkgPSB4bWtzdGVtcCh0ZW1wX2ZuKTsKKwkJaWYgKGZjaG1vZChpLCBzdC5zdF9tb2RlKSA9PSAtMSkKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUodGVtcF9mbik7CisKKwkJb3V0ID0geGZkb3Blbl9mb3Jfd3JpdGUoaSk7CisJfQorCisJd2hpbGUgKChpID0gZmdldGMoaW4pKSAhPSBFT0YpIHsKKwkJaWYgKGkgPT0gJ1xyJykKKwkJCWNvbnRpbnVlOworCQlpZiAoaSA9PSAnXG4nKQorCQkJaWYgKGNvbnZfdHlwZSA9PSBDVF9VTklYMkRPUykKKwkJCQlmcHV0YygnXHInLCBvdXQpOworCQlmcHV0YyhpLCBvdXQpOworCX0KKworCWlmIChmbiAhPSBOVUxMKSB7CisJCWlmIChmY2xvc2UoaW4pIDwgMCB8fCBmY2xvc2Uob3V0KSA8IDApIHsKKwkJCXVubGluayh0ZW1wX2ZuKTsKKwkJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJCX0KKwkJeHJlbmFtZSh0ZW1wX2ZuLCByZXNvbHZlZF9mbik7CisJCWZyZWUodGVtcF9mbik7CisJCWZyZWUocmVzb2x2ZWRfZm4pOworCX0KK30KKworaW50IGRvczJ1bml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkb3MydW5peF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG8sIGNvbnZfdHlwZTsKKworCS8qIFNlZSBpZiB3ZSBhcmUgc3VwcG9zZWQgdG8gYmUgZG9pbmcgZG9zMnVuaXggb3IgdW5peDJkb3MgKi8KKwljb252X3R5cGUgPSBDVF9VTklYMkRPUzsKKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ2QnKSB7CisJCWNvbnZfdHlwZSA9IENUX0RPUzJVTklYOworCX0KKworCS8qIC11IGNvbnZlcnQgdG8gdW5peCwgLWQgY29udmVydCB0byBkb3MgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ1LS1kOmQtLXUiOyAvKiBtdXR1YWxseSBleGNsdXNpdmUgKi8KKwlvID0gZ2V0b3B0MzIoYXJndiwgImR1Iik7CisKKwkvKiBEbyB0aGUgY29udmVyc2lvbiByZXF1ZXN0ZWQgYnkgYW4gYXJndW1lbnQgZWxzZSBkbyB0aGUgZGVmYXVsdAorCSAqIGNvbnZlcnNpb24gZGVwZW5kaW5nIG9uIG91ciBuYW1lLiAgKi8KKwlpZiAobykKKwkJY29udl90eXBlID0gbzsKKworCWFyZ3YgKz0gb3B0aW5kOworCWRvIHsKKwkJLyogbWlnaHQgYmUgY29udmVydChOVUxMKSBpZiB0aGVyZSBpcyBubyBmaWxlbmFtZSBnaXZlbiAqLworCQljb252ZXJ0KCphcmd2LCBjb252X3R5cGUpOworCX0gd2hpbGUgKCphcmd2ICYmICorK2FyZ3YpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZHUuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9kdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YmJlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZHUuYwpAQCAtMCwwICsxLDI2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBkdSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgTGluZW8sIGluYy4gYW5kIEpvaG4gQmVwcHUKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgSm9obiBCZXBwdSA8YmVwcHVAY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAyICBFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICh1bmxlc3MgZGVmYXVsdCBibG9ja3NpemUgc2V0IHRvIDFrKSAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9kdS5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogTW9zdGx5IHJld3JpdHRlbiBmb3IgU1VTdjMgY29tcGxpYW5jZSBhbmQgdG8gZml4IGJ1Z3MvZGVmZWN0cy4KKyAqIDEpIEFkZGVkIHN1cHBvcnQgZm9yIFNVU3YzIC1hLCAtSCwgLUwsIGdudSAtYywgYW5kIChidXN5Ym94KSAtZCBvcHRpb25zLgorICogICAgVGhlIC1kIG9wdGlvbiBhbGxvd3Mgc2V0dGluZyBvZiBtYXggZGVwdGggKHNpbWlsYXIgdG8gZ251IC0tbWF4LWRlcHRoKS4KKyAqIDIpIEZpeGVkIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucyBmb3IgbGlua3MgYW5kIGRpcmVjdG9yaWVzLCBlc3BlY2lhbGx5CisgKiAgICB3aGVuIGVycm9ycyBvY2N1cnJlZC4gIENhbGN1bGF0ZXMgc2l6ZXMgc2hvdWxkIG5vdyBtYXRjaCBnbnUgZHUgb3V0cHV0LgorICogMykgQWRkZWQgZXJyb3IgY2hlY2tpbmcgb2Ygb3V0cHV0LgorICogNCkgRml4ZWQgYnVzeWJveCBidWcgIzEyODQgaW52b2x2aW5nIGxvbmcgb3ZlcmZsb3cgd2l0aCBodW1hbl9yZWFkYWJsZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZHVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYUhMZGNsc3giIElGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoImhtIikgImtdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBkdV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlN1bW1hcml6ZSBkaXNrIHNwYWNlIHVzZWQgZm9yIGVhY2ggRklMRSBhbmQvb3IgZGlyZWN0b3J5LlxuIgorLy91c2FnZTogICAgICAgIkRpc2sgc3BhY2UgaXMgcHJpbnRlZCBpbiB1bml0cyBvZiAiCisvL3VzYWdlOglJRl9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKCIxMDI0IikKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKCI1MTIiKQorLy91c2FnZTogICAgICAgIiBieXRlcy5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU2hvdyBmaWxlIHNpemVzIHRvbyIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJRm9sbG93IGFsbCBzeW1saW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJRm9sbG93IHN5bWxpbmtzIG9uIGNvbW1hbmQgbGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgTglMaW1pdCBvdXRwdXQgdG8gZGlyZWN0b3JpZXMgKGFuZCBmaWxlcyB3aXRoIC1hKSBvZiBkZXB0aCA8IE4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVNob3cgZ3JhbmQgdG90YWwiCisvL3VzYWdlOiAgICAgIlxuCS1sCUNvdW50IHNpemVzIG1hbnkgdGltZXMgaWYgaGFyZCBsaW5rZWQiCisvL3VzYWdlOiAgICAgIlxuCS1zCURpc3BsYXkgb25seSBhIHRvdGFsIGZvciBlYWNoIGFyZ3VtZW50IgorLy91c2FnZTogICAgICJcbgkteAlTa2lwIGRpcmVjdG9yaWVzIG9uIGRpZmZlcmVudCBmaWxlc3lzdGVtcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoCisvL3VzYWdlOiAgICAgIlxuCS1oCVNpemVzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCAoZS5nLiwgMUsgMjQzTSAyRyApIgorLy91c2FnZTogICAgICJcbgktbQlTaXplcyBpbiBtZWdhYnl0ZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1rCVNpemVzIGluIGtpbG9ieXRlcyIKKy8vdXNhZ2U6CQkJSUZfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSygiIChkZWZhdWx0KSIpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGR1X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGR1XG4iCisvL3VzYWdlOiAgICAgICAiMTYgICAgICAuL0NWU1xuIgorLy91c2FnZTogICAgICAgIjEyICAgICAgLi9rZXJuZWwtcGF0Y2hlcy9DVlNcbiIKKy8vdXNhZ2U6ICAgICAgICI4MCAgICAgIC4va2VybmVsLXBhdGNoZXNcbiIKKy8vdXNhZ2U6ICAgICAgICIxMiAgICAgIC4vdGVzdHMvQ1ZTXG4iCisvL3VzYWdlOiAgICAgICAiMzYgICAgICAuL3Rlc3RzXG4iCisvL3VzYWdlOiAgICAgICAiMTIgICAgICAuL3NjcmlwdHMvQ1ZTXG4iCisvL3VzYWdlOiAgICAgICAiMTYgICAgICAuL3NjcmlwdHNcbiIKKy8vdXNhZ2U6ICAgICAgICIxMiAgICAgIC4vZG9jcy9DVlNcbiIKKy8vdXNhZ2U6ICAgICAgICIxMDQgICAgIC4vZG9jc1xuIgorLy91c2FnZTogICAgICAgIjI0MTcgICAgLlxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZW51bSB7CisJT1BUX2FfZmlsZXNfdG9vICAgID0gKDEgPDwgMCksCisJT1BUX0hfZm9sbG93X2xpbmtzID0gKDEgPDwgMSksCisJT1BUX2tfa2J5dGVzICAgICAgID0gKDEgPDwgMiksCisJT1BUX0xfZm9sbG93X2xpbmtzID0gKDEgPDwgMyksCisJT1BUX3NfdG90YWxfbm9yZWN1cnNlID0gKDEgPDwgNCksCisJT1BUX3hfb25lX0ZTICAgICAgID0gKDEgPDwgNSksCisJT1BUX2RfbWF4ZGVwdGggICAgID0gKDEgPDwgNiksCisJT1BUX2xfaGFyZGxpbmtzICAgID0gKDEgPDwgNyksCisJT1BUX2NfdG90YWwgICAgICAgID0gKDEgPDwgOCksCisJT1BUX2hfZm9yX2h1bWFucyAgID0gKDEgPDwgOSksCisJT1BUX21fbWJ5dGVzICAgICAgID0gKDEgPDwgMTApLAorfTsKKworc3RydWN0IGdsb2JhbHMgeworI2lmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJdW5zaWduZWQgbG9uZyBkaXNwX2hyOworI2Vsc2UKKwl1bnNpZ25lZCBkaXNwX2s7CisjZW5kaWYKKwlpbnQgbWF4X3ByaW50X2RlcHRoOworCWJvb2wgc3RhdHVzOworCWludCBzbGlua19kZXB0aDsKKwlpbnQgZHVfZGVwdGg7CisJZGV2X3QgZGlyX2RldjsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisKKworc3RhdGljIHZvaWQgcHJpbnQodW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwkvKiBUT0RPIC0gTWF5IG5vdCB3YW50IHRvIGRlZmVyIGVycm9yIGNoZWNraW5nIGhlcmUuICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKwlwcmludGYoIiVzXHQlc1xuIiwKKwkJCS8qIHNpemUgeCA1MTIgLyBHLmRpc3BfaHIsIHNob3cgb25lIGZyYWN0aW9uYWwsCisJCQkgKiB1c2Ugc3VmZml4ZXMgaWYgRy5kaXNwX2hyID09IDAgKi8KKwkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKHNpemUsIDUxMiwgRy5kaXNwX2hyKSwKKwkJCWZpbGVuYW1lKTsKKyNlbHNlCisJaWYgKEcuZGlzcF9rKSB7CisJCXNpemUrKzsKKwkJc2l6ZSA+Pj0gMTsKKwl9CisJcHJpbnRmKCIlbHVcdCVzXG4iLCBzaXplLCBmaWxlbmFtZSk7CisjZW5kaWYKK30KKworLyogdGlueSByZWN1cnNpdmUgZHUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGR1KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJdW5zaWduZWQgbG9uZyBzdW07CisKKwlpZiAobHN0YXQoZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVuYW1lKTsKKwkJRy5zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCXJldHVybiAwOworCX0KKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3hfb25lX0ZTKSB7CisJCWlmIChHLmR1X2RlcHRoID09IDApIHsKKwkJCUcuZGlyX2RldiA9IHN0YXRidWYuc3RfZGV2OworCQl9IGVsc2UgaWYgKEcuZGlyX2RldiAhPSBzdGF0YnVmLnN0X2RldikgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzdW0gPSBzdGF0YnVmLnN0X2Jsb2NrczsKKworCWlmIChTX0lTTE5LKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJaWYgKEcuc2xpbmtfZGVwdGggPiBHLmR1X2RlcHRoKSB7IC8qIC1IIG9yIC1MICovCisJCQlpZiAoc3RhdChmaWxlbmFtZSwgJnN0YXRidWYpICE9IDApIHsKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlbmFtZSk7CisJCQkJRy5zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzdW0gPSBzdGF0YnVmLnN0X2Jsb2NrczsKKwkJCWlmIChHLnNsaW5rX2RlcHRoID09IDEpIHsKKwkJCQkvKiBDb252ZXJ0IC1IIHRvIC1MICovCisJCQkJRy5zbGlua19kZXB0aCA9IElOVF9NQVg7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX2xfaGFyZGxpbmtzKQorCSAmJiBzdGF0YnVmLnN0X25saW5rID4gMQorCSkgeworCQkvKiBBZGQgZmlsZXMvZGlyZWN0b3JpZXMgd2l0aCBsaW5rcyBvbmx5IG9uY2UgKi8KKwkJaWYgKGlzX2luX2lub19kZXZfaGFzaHRhYmxlKCZzdGF0YnVmKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJYWRkX3RvX2lub19kZXZfaGFzaHRhYmxlKCZzdGF0YnVmLCBOVUxMKTsKKwl9CisKKwlpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7CisJCURJUiAqZGlyOworCQlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwkJY2hhciAqbmV3ZmlsZTsKKworCQlkaXIgPSB3YXJuX29wZW5kaXIoZmlsZW5hbWUpOworCQlpZiAoIWRpcikgeworCQkJRy5zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQlyZXR1cm4gc3VtOworCQl9CisKKwkJd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJCW5ld2ZpbGUgPSBjb25jYXRfc3VicGF0aF9maWxlKGZpbGVuYW1lLCBlbnRyeS0+ZF9uYW1lKTsKKwkJCWlmIChuZXdmaWxlID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQkrK0cuZHVfZGVwdGg7CisJCQlzdW0gKz0gZHUobmV3ZmlsZSk7CisJCQktLUcuZHVfZGVwdGg7CisJCQlmcmVlKG5ld2ZpbGUpOworCQl9CisJCWNsb3NlZGlyKGRpcik7CisJfSBlbHNlIHsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9hX2ZpbGVzX3RvbykgJiYgRy5kdV9kZXB0aCAhPSAwKQorCQkJcmV0dXJuIHN1bTsKKwl9CisJaWYgKEcuZHVfZGVwdGggPD0gRy5tYXhfcHJpbnRfZGVwdGgpIHsKKwkJcHJpbnQoc3VtLCBmaWxlbmFtZSk7CisJfQorCXJldHVybiBzdW07Cit9CisKK2ludCBkdV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZHVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgdG90YWw7CisJaW50IHNsaW5rX2RlcHRoX3NhdmU7CisJdW5zaWduZWQgb3B0OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKwlJRl9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKEcuZGlzcF9ociA9IDEwMjQ7KQorCUlGX05PVF9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKEcuZGlzcF9ociA9IDUxMjspCisJaWYgKGdldGVudigiUE9TSVhMWV9DT1JSRUNUIikpICAvKiBUT0RPIC0gYSBuZXcgbGliYmIgZnVuY3Rpb24/ICovCisJCUcuZGlzcF9ociA9IDUxMjsKKyNlbHNlCisJSUZfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSyhHLmRpc3BfayA9IDE7KQorCS8qIElGX05PVF9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKEcuZGlzcF9rID0gMDspIC0gRyBpcyBwcmUtemVyb2VkICovCisjZW5kaWYKKwlHLm1heF9wcmludF9kZXB0aCA9IElOVF9NQVg7CisKKwkvKiBOb3RlOiBTVVN2MyBzcGVjaWZpZXMgdGhhdCAtYSBhbmQgLXMgb3B0aW9ucyBjYW5ub3QgYmUgdXNlZCB0b2dldGhlcgorCSAqIGluIHN0cmljdGx5IGNvbmZvcm1pbmcgYXBwbGljYXRpb25zLiAgSG93ZXZlciwgaXQgYWxzbyBzYXlzIHRoYXQgc29tZQorCSAqIGR1IGltcGxlbWVudGF0aW9ucyBtYXkgcHJvZHVjZSBvdXRwdXQgd2hlbiAtYSBhbmQgLXMgYXJlIHVzZWQgdG9nZXRoZXIuCisJICogZ251IGR1IGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZSBpbiB0aGlzIGNhc2UuICBXZSBjaG9vc2UgdG8gc2ltcGx5CisJICogaWdub3JlIC1hLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggLXMgYmVpbmcgZXF1aXZhbGVudCB0byAtZCAwLgorCSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiaC1rbTprLWhtOm0taGs6SC1MOkwtSDpzLWQ6ZC1zOmQrIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYUhrTHN4IiAiZDoiICJsYyIgImhtIiwgJkcubWF4X3ByaW50X2RlcHRoKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgT1BUX2hfZm9yX2h1bWFucykgeworCQlHLmRpc3BfaHIgPSAwOworCX0KKwlpZiAob3B0ICYgT1BUX21fbWJ5dGVzKSB7CisJCUcuZGlzcF9ociA9IDEwMjQqMTAyNDsKKwl9CisJaWYgKG9wdCAmIE9QVF9rX2tieXRlcykgeworCQlHLmRpc3BfaHIgPSAxMDI0OworCX0KKyNlbHNlCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiSC1MOkwtSDpzLWQ6ZC1zOmQrIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYUhrTHN4IiAiZDoiICJsYyIsICZHLm1heF9wcmludF9kZXB0aCk7CisJYXJndiArPSBvcHRpbmQ7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLCisJaWYgKG9wdCAmIE9QVF9rX2tieXRlcykgeworCQlHLmRpc3BfayA9IDE7CisJfQorI2VuZGlmCisjZW5kaWYKKwlpZiAob3B0ICYgT1BUX0hfZm9sbG93X2xpbmtzKSB7CisJCUcuc2xpbmtfZGVwdGggPSAxOworCX0KKwlpZiAob3B0ICYgT1BUX0xfZm9sbG93X2xpbmtzKSB7CisJCUcuc2xpbmtfZGVwdGggPSBJTlRfTUFYOworCX0KKwlpZiAob3B0ICYgT1BUX3NfdG90YWxfbm9yZWN1cnNlKSB7CisJCUcubWF4X3ByaW50X2RlcHRoID0gMDsKKwl9CisKKwkvKiBnbyB0aHJvdWdoIHJlbWFpbmluZyBhcmdzIChpZiBhbnkpICovCisJaWYgKCEqYXJndikgeworCQkqLS1hcmd2ID0gKGNoYXIqKSIuIjsKKwkJaWYgKEcuc2xpbmtfZGVwdGggPT0gMSkgeworCQkJRy5zbGlua19kZXB0aCA9IDA7CisJCX0KKwl9CisKKwlzbGlua19kZXB0aF9zYXZlID0gRy5zbGlua19kZXB0aDsKKwl0b3RhbCA9IDA7CisJZG8geworCQl0b3RhbCArPSBkdSgqYXJndik7CisJCS8qIG90aGVyd2lzZSBkdSAvZGlyIC9kaXIgd29uJ3Qgc2hvdyAvZGlyIHR3aWNlOiAqLworCQlyZXNldF9pbm9fZGV2X2hhc2h0YWJsZSgpOworCQlHLnNsaW5rX2RlcHRoID0gc2xpbmtfZGVwdGhfc2F2ZTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCWlmIChvcHQgJiBPUFRfY190b3RhbCkKKwkJcHJpbnQodG90YWwsICJ0b3RhbCIpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChHLnN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZWNoby5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2VjaG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjYzODk0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2VjaG8uYwpAQCAtMCwwICsxLDMzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZWNobyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAtLSB1bmxlc3MgY29uZmlndXJlZCBhcyBmYW5jeSBlY2hvLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9lY2hvLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBCZWNhdXNlIG9mIGJlaGF2aW9yYWwgZGlmZmVyZW5jZXMsIGltcGxlbWVudGVkIGNvbmZpZ3VyYWJsZSBTVVN2MworICogb3IgJ2ZhbmN5JyBnbnUtaXNoIGJlaGF2aW9ycy4gIEFsc28sIHJlZHVjZWQgc2l6ZSBhbmQgZml4ZWQgYnVncy4KKyAqIDEpIEluIGhhbmRsaW5nICdcYycgZXNjYXBlLCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvbmx5IHN1cHByZXNzZWQgdGhlCisgKiAgICAgdHJhaWxpbmcgbmV3bGluZS4gIFNVU3YzIHNwZWNpZmllcyBfbm9fIG91dHB1dCBhZnRlciAnXGMnLgorICogMikgU1VTdjMgc3BlY2lmaWVzIHRoYXQgb2N0YWwgZXNjYXBlcyBhcmUgb2YgdGhlIGZvcm0gXDB7I3sjeyN9fX0uCisgKiAgICBUaGUgcHJldmlvdXMgdmVyc2lvbiBkaWQgbm90IGFsbG93IDQtZGlnaXQgb2N0YWxzLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBlY2hvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfRUNITygiWy1uZUVdICIpICJbQVJHXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBlY2hvX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgdGhlIHNwZWNpZmllZCBBUkdzIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfRUNITyggIlxuIgorLy91c2FnZTogICAgICJcbgktbglTdXBwcmVzcyB0cmFpbGluZyBuZXdsaW5lIgorLy91c2FnZTogICAgICJcbgktZQlJbnRlcnByZXQgYmFja3NsYXNoIGVzY2FwZXMgKGkuZS4sIFxcdD10YWIpIgorLy91c2FnZTogICAgICJcbgktRQlEb24ndCBpbnRlcnByZXQgYmFja3NsYXNoIGVzY2FwZXMgKGRlZmF1bHQpIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBlY2hvX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gXCJFcmlrIGlzIGNvb2xcIlxuIgorLy91c2FnZTogICAgICAgIkVyaWsgaXMgY29vbFxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9GQU5DWV9FQ0hPKCIkIGVjaG8gLWUgXCJFcmlrXFxuaXNcXG5jb29sXCJcbiIKKy8vdXNhZ2U6ICAgICAgICJFcmlrXG4iCisvL3VzYWdlOiAgICAgICAiaXNcbiIKKy8vdXNhZ2U6ICAgICAgICJjb29sXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIFwiRXJpa1xcbmlzXFxuY29vbFwiXG4iCisvL3VzYWdlOiAgICAgICAiRXJpa1xcbmlzXFxuY29vbFxuIikKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKy8qIE5COiBjYW4gYmUgdXNlZCBieSBzaGVsbCBldmVuIGlmIG5vdCBlbmFibGVkIGFzIGFwcGxldCAqLworCisvKgorICogTkIyOiB3ZSBkb24ndCB1c2Ugc3RkaW8sIHdlIG5lZWQgYmV0dGVyIGVycm9yIGhhbmRpbmcuCisgKiBFeGFtcGxlcyBpbmNsdWRlIHdyaXRpbmcgaW50byBub24tb3BlbmVkIHN0ZG91dCBhbmQgZXJyb3Igb24gd3JpdGUuCisgKgorICogV2l0aCBzdGRpbywgb3V0cHV0IGdldHMgc2hvdmVsZWQgaW50byBzdGRvdXQgYnVmZmVyLCBhbmQgZXZlbgorICogZmZsdXNoIGNhbm5vdCBjbGVhciBpdCBvdXQuIEl0IHNlZW1zIHRoYXQgZXZlbiBpZiBsaWJjIHJlY2VpdmVzCisgKiBFQkFERiBvbiB3cml0ZSBhdHRlbXB0cywgaXQgZmVlbHMgZGV0ZXJtaW5lZCB0byBvdXRwdXQgZGF0YSBubyBtYXR0ZXIgd2hhdC4KKyAqIElmIGVjaG8gaXMgY2FsbGVkIGJ5IHNoZWxsLCBpdCB3aWxsIHRyeSB3cml0aW5nIGFnYWluIGxhdGVyLCBhbmQgcG9zc2libHkKKyAqIHdpbGwgY2xvYmJlciBmdXR1cmUgb3V0cHV0LiBOb3QgZ29vZC4KKyAqCisgKiBTb2xhcmlzIGhhcyBmcHVyZ2Ugd2hpY2ggZGlzY2FyZHMgYnVmZmVyZWQgaW5wdXQuIGdsaWJjIGhhcyBfX2ZwdXJnZS4KKyAqIEJ1dCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdGFuZGFyZC4KKyAqLworCitpbnQgZWNob19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKnBwOworCWNvbnN0IGNoYXIgKmFyZzsKKwljaGFyICpvdXQ7CisJY2hhciAqYnVmZmVyOworCXVuc2lnbmVkIGJ1ZmxlbjsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfRUNITworCWVudW0geworCQllZmxhZyA9ICdcXCcsCisJCW5mbGFnID0gMSwgIC8qIDEgLS0gcHJpbnQgJ1xuJyAqLworCX07CisKKwlhcmd2Kys7CisjZWxzZQorCWNoYXIgbmZsYWcgPSAxOworCWNoYXIgZWZsYWcgPSAwOworCisJd2hpbGUgKChhcmcgPSAqKythcmd2KSAhPSBOVUxMKSB7CisJCWNoYXIgbiwgZTsKKworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOyAvKiBub3QgYW4gb3B0aW9uIGFyZywgZWNobyBpdCAqLworCisJCS8qIElmIGl0IGFwcGVhcnMgdGhhdCB3ZSBhcmUgaGFuZGxpbmcgb3B0aW9ucywgdGhlbiBtYWtlIHN1cmUKKwkJICogdGhhdCBhbGwgb2YgdGhlIG9wdGlvbnMgc3BlY2lmaWVkIGFyZSBhY3R1YWxseSB2YWxpZC4KKwkJICogT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIHNob3VsZCBqdXN0IGJlIGVjaG9lZC4KKwkJICovCisJCWFyZysrOworCQluID0gbmZsYWc7CisJCWUgPSBlZmxhZzsKKwkJZG8geworCQkJaWYgKCphcmcgPT0gJ24nKQorCQkJCW4gPSAwOworCQkJZWxzZSBpZiAoKmFyZyA9PSAnZScpCisJCQkJZSA9ICdcXCc7CisJCQllbHNlIGlmICgqYXJnICE9ICdFJykgeworCQkJCS8qICItY2NjIiBhcmcgd2l0aCBvbmUgb2YgYydzIGludmFsaWQsIGVjaG8gaXQgKi8KKwkJCQkvKiBhcmcgY29uc2lzdGluZyBmcm9tIGp1c3QgIi0iIGFsc28gaGFuZGxlZCBoZXJlICovCisJCQkJZ290byBqdXN0X2VjaG87CisJCQl9CisJCX0gd2hpbGUgKCorK2FyZyk7CisJCW5mbGFnID0gbjsKKwkJZWZsYWcgPSBlOworCX0KKyBqdXN0X2VjaG86CisjZW5kaWYKKworCWJ1ZmxlbiA9IDA7CisJcHAgPSBhcmd2OworCXdoaWxlICgoYXJnID0gKnBwKSAhPSBOVUxMKSB7CisJCWJ1ZmxlbiArPSBzdHJsZW4oYXJnKSArIDE7CisJCXBwKys7CisJfQorCW91dCA9IGJ1ZmZlciA9IHhtYWxsb2MoYnVmbGVuICsgMSk7IC8qICsxIGlzIG5lZWRlZCBmb3IgIm5vIGFyZ3MiIGNhc2UgKi8KKworCXdoaWxlICgoYXJnID0gKmFyZ3YpICE9IE5VTEwpIHsKKwkJaW50IGM7CisKKwkJaWYgKCFlZmxhZykgeworCQkJLyogb3B0aW1pemF0aW9uIGZvciB2ZXJ5IGNvbW1vbiBjYXNlICovCisJCQlvdXQgPSBzdHBjcHkob3V0LCBhcmcpOworCQl9IGVsc2UKKwkJd2hpbGUgKChjID0gKmFyZysrKSAhPSAnXDAnKSB7CisJCQlpZiAoYyA9PSBlZmxhZykgeworCQkJCS8qIFRoaXMgaXMgYW4gIlx4IiBzZXF1ZW5jZSAqLworCisJCQkJaWYgKCphcmcgPT0gJ2MnKSB7CisJCQkJCS8qICJcYyIgbWVhbnMgY2FuY2VsIG5ld2xpbmUgYW5kCisJCQkJCSAqIGlnbm9yZSBhbGwgc3Vic2VxdWVudCBjaGFycy4gKi8KKwkJCQkJZ290byBkb193cml0ZTsKKwkJCQl9CisJCQkJLyogU2luY2UgU1VTdjMgbWFuZGF0ZXMgYSBmaXJzdCBkaWdpdCBvZiAwLCA0LWRpZ2l0IG9jdGFscworCQkJCSogb2YgdGhlIGZvcm0gXDAjIyMgYXJlIGFjY2VwdGVkLiAqLworCQkJCWlmICgqYXJnID09ICcwJykgeworCQkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKGFyZ1sxXSAtICcwJykgPCA4KSB7CisJCQkJCQkvKiAybmQgY2hhciBpcyAwLi43OiBza2lwIGxlYWRpbmcgJzAnICovCisJCQkJCQlhcmcrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSBoYW5kbGVzIE5VTCBjb3JyZWN0bHkKKwkJCQkgKiAoIi4uLlwiIGNhc2UpLiAqLworCQkJCXsKKwkJCQkJLyogb3B0aW1pemF0aW9uOiBkb24ndCBmb3JjZSBhcmcgdG8gYmUgb24tc3RhY2ssCisJCQkJCSAqIHVzZSBhbm90aGVyIHZhcmlhYmxlIGZvciB0aGF0LiB+MzAgYnl0ZXMgd2luICovCisJCQkJCWNvbnN0IGNoYXIgKnogPSBhcmc7CisJCQkJCWMgPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgmeik7CisJCQkJCWFyZyA9IHo7CisJCQkJfQorCQkJfQorCQkJKm91dCsrID0gYzsKKwkJfQorCisJCWlmICghKisrYXJndikKKwkJCWJyZWFrOworCQkqb3V0KysgPSAnICc7CisJfQorCisJaWYgKG5mbGFnKSB7CisJCSpvdXQrKyA9ICdcbic7CisJfQorCisgZG9fd3JpdGU6CisJLyogQ2FyZWZ1bCB0byBlcnJvciBvdXQgb24gcGFydGlhbCB3cml0ZXMgdG9vICh0aGluayBFTk9TUEMhKSAqLworCWVycm5vID0gMDsKKwkvKnIgPSovIGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmZmVyLCBvdXQgLSBidWZmZXIpOworCWZyZWUoYnVmZmVyKTsKKwlpZiAoLypXUk9ORzpyIDwgMCovIGVycm5vKSB7CisJCWJiX3BlcnJvcl9tc2coYmJfbXNnX3dyaXRlX2Vycm9yKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIDxCU0QgQWR2ZXJ0aXNpbmcgQ2xhdXNlIG9taXR0ZWQgcGVyIHRoZSBKdWx5IDIyLCAxOTk5IGxpY2Vuc2luZyBjaGFuZ2UKKyAqCQlmdHA6Ly9mdHAuY3MuYmVya2VsZXkuZWR1L3B1Yi80YnNkL1JFQURNRS5JbXB0LkxpY2Vuc2UuQ2hhbmdlPgorICoKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZWNoby5jCTguMSAoQmVya2VsZXkpIDUvMzEvOTMKKyAqLworCisjaWZkZWYgVkVSU0lPTl9XSVRIX1dSSVRFVgorLyogV2UgY2FuJ3QgdXNlIHN0ZGlvLgorICogVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBoaWdobHkgbm9uLW9idmlvdXMuCisgKiBlY2hvX21haW4gaXMgdXNlZCBmcm9tIHNoZWxsLiBTaGVsbCBtdXN0IGNvcnJlY3RseSBoYW5kbGUgImVjaG8gZm9vIgorICogaWYgc3Rkb3V0IGlzIGNsb3NlZC4gV2l0aCBzdGRpbywgb3V0cHV0IGdldHMgc2hvdmVsZWQgaW50bworICogc3Rkb3V0IGJ1ZmZlciwgYW5kIGV2ZW4gZmZsdXNoIGNhbm5vdCBjbGVhciBpdCBvdXQuIEl0IHNlZW1zIHRoYXQKKyAqIGV2ZW4gaWYgbGliYyByZWNlaXZlcyBFQkFERiBvbiB3cml0ZSBhdHRlbXB0cywgaXQgZmVlbHMgZGV0ZXJtaW5lZAorICogdG8gb3V0cHV0IGRhdGEgbm8gbWF0dGVyIHdoYXQuIFNvIGl0IHdpbGwgdHJ5IGxhdGVyLAorICogYW5kIHBvc3NpYmx5IHdpbGwgY2xvYmJlciBmdXR1cmUgb3V0cHV0LiBOb3QgZ29vZC4KKyAqCisgKiBVc2luZyB3cml0ZXYgaW5zdGVhZCwgd2l0aCAnZGlyZWN0JyBjb252ZXJzaW9uIG9mIGFyZ3YgdmVjdG9yLgorICovCisKK2ludCBlY2hvX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpb3ZlYyBpb1thcmdjXTsKKwlzdHJ1Y3QgaW92ZWMgKmN1cl9pbyA9IGlvOworCWNoYXIgKmFyZzsKKwljaGFyICpwOworI2lmICFFTkFCTEVfRkVBVFVSRV9GQU5DWV9FQ0hPCisJZW51bSB7CisJCWVmbGFnID0gJ1xcJywKKwkJbmZsYWcgPSAxLCAgLyogMSAtLSBwcmludCAnXG4nICovCisJfTsKKwlhcmcgPSAqKythcmd2OworCWlmICghYXJnKQorCQlnb3RvIG5ld2xpbmVfcmV0OworI2Vsc2UKKwljaGFyIG5mbGFnID0gMTsKKwljaGFyIGVmbGFnID0gMDsKKworCXdoaWxlICgxKSB7CisJCWFyZyA9ICorK2FyZ3Y7CisJCWlmICghYXJnKQorCQkJZ290byBuZXdsaW5lX3JldDsKKwkJaWYgKCphcmcgIT0gJy0nKQorCQkJYnJlYWs7CisKKwkJLyogSWYgaXQgYXBwZWFycyB0aGF0IHdlIGFyZSBoYW5kbGluZyBvcHRpb25zLCB0aGVuIG1ha2Ugc3VyZQorCQkgKiB0aGF0IGFsbCBvZiB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgYXJlIGFjdHVhbGx5IHZhbGlkLgorCQkgKiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgc2hvdWxkIGp1c3QgYmUgZWNob2VkLgorCQkgKi8KKwkJcCA9IGFyZyArIDE7CisJCWlmICghKnApCS8qIEEgc2luZ2xlICctJywgc28gZWNobyBpdC4gKi8KKwkJCWdvdG8ganVzdF9lY2hvOworCisJCWRvIHsKKwkJCWlmICghc3RyY2hyKCJuZUUiLCAqcCkpCisJCQkJZ290byBqdXN0X2VjaG87CisJCX0gd2hpbGUgKCorK3ApOworCisJCS8qIEFsbCBvZiB0aGUgb3B0aW9ucyBpbiB0aGlzIGFyZyBhcmUgdmFsaWQsIHNvIGhhbmRsZSB0aGVtLiAqLworCQlwID0gYXJnICsgMTsKKwkJZG8geworCQkJaWYgKCpwID09ICduJykKKwkJCQluZmxhZyA9IDA7CisJCQlpZiAoKnAgPT0gJ2UnKQorCQkJCWVmbGFnID0gJ1xcJzsKKwkJfSB3aGlsZSAoKisrcCk7CisJfQorIGp1c3RfZWNobzoKKyNlbmRpZgorCisJd2hpbGUgKDEpIHsKKwkJLyogYXJnIGlzIGFscmVhZHkgPT0gKmFyZ3YgYW5kIGlzbid0IE5VTEwgKi8KKwkJaW50IGM7CisKKwkJY3VyX2lvLT5pb3ZfYmFzZSA9IHAgPSBhcmc7CisKKwkJaWYgKCFlZmxhZykgeworCQkJLyogb3B0aW1pemF0aW9uIGZvciB2ZXJ5IGNvbW1vbiBjYXNlICovCisJCQlwICs9IHN0cmxlbihhcmcpOworCQl9IGVsc2Ugd2hpbGUgKChjID0gKmFyZysrKSkgeworCQkJaWYgKGMgPT0gZWZsYWcpIHsKKwkJCQkvKiBUaGlzIGlzIGFuICJceCIgc2VxdWVuY2UgKi8KKworCQkJCWlmICgqYXJnID09ICdjJykgeworCQkJCQkvKiAiXGMiIG1lYW5zIGNhbmNlbCBuZXdsaW5lIGFuZAorCQkJCQkgKiBpZ25vcmUgYWxsIHN1YnNlcXVlbnQgY2hhcnMuICovCisJCQkJCWN1cl9pby0+aW92X2xlbiA9IHAgLSAoY2hhciopY3VyX2lvLT5pb3ZfYmFzZTsKKwkJCQkJY3VyX2lvKys7CisJCQkJCWdvdG8gcmV0OworCQkJCX0KKwkJCQkvKiBTaW5jZSBTVVN2MyBtYW5kYXRlcyBhIGZpcnN0IGRpZ2l0IG9mIDAsIDQtZGlnaXQgb2N0YWxzCisJCQkJKiBvZiB0aGUgZm9ybSBcMCMjIyBhcmUgYWNjZXB0ZWQuICovCisJCQkJaWYgKCphcmcgPT0gJzAnICYmICh1bnNpZ25lZCBjaGFyKShhcmdbMV0gLSAnMCcpIDwgOCkgeworCQkJCQlhcmcrKzsKKwkJCQl9CisJCQkJLyogYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UgY2FuIGhhbmRsZSBudWwgY29ycmVjdGx5ICovCisJCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCAodm9pZCopICZhcmcpOworCQkJfQorCQkJKnArKyA9IGM7CisJCX0KKworCQlhcmcgPSAqKythcmd2OworCQlpZiAoYXJnKQorCQkJKnArKyA9ICcgJzsKKwkJY3VyX2lvLT5pb3ZfbGVuID0gcCAtIChjaGFyKiljdXJfaW8tPmlvdl9iYXNlOworCQljdXJfaW8rKzsKKwkJaWYgKCFhcmcpCisJCQlicmVhazsKKwl9CisKKyBuZXdsaW5lX3JldDoKKwlpZiAobmZsYWcpIHsKKwkJY3VyX2lvLT5pb3ZfYmFzZSA9IChjaGFyKikiXG4iOworCQljdXJfaW8tPmlvdl9sZW4gPSAxOworCQljdXJfaW8rKzsKKwl9CisgcmV0OgorCS8qIFRPRE86IGltcGxlbWVudCBhbmQgdXNlIGZ1bGxfd3JpdGV2PyAqLworCXJldHVybiB3cml0ZXYoMSwgaW8sIChjdXJfaW8gLSBpbykpID49IDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9lbnYuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9lbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDdlZjEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2Vudi5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBlbnYgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5OTMsIDE5OTQKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqCisgKiBNb2RpZmllZCBmb3IgQnVzeUJveCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2Vudi5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogRml4ZWQgYnVnIGludm9sdmluZyBleGl0IHJldHVybiBjb2RlcyBpZiBleGVjdnAgZmFpbHMuICBBbHNvIGFkZGVkCisgKiBvdXRwdXQgZXJyb3IgY2hlY2tpbmcuCisgKi8KKworLyoKKyAqIE1vZGlmaWVkIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gKEMpIDIwMDMKKyAqIC0gY29ycmVjdCAiLSIgb3B0aW9uIHVzYWdlCisgKiAtIG11bHRpcGxlICItdSB1bnNldGVudiIgc3VwcG9ydAorICogLSBHTlUgbG9uZyBvcHRpb24gc3VwcG9ydAorICogLSB1c2UgeGZ1bmNfZXJyb3JfcmV0dmFsCisgKi8KKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLy91c2FnZTojZGVmaW5lIGVudl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1pdV0gWy1dIFtuYW1lPXZhbHVlXS4uLiBbUFJPRyBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSBlbnZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBvciBydW4gUFJPRyBhZnRlciBzZXR0aW5nIHVwXG4iCisvL3VzYWdlOiAgICAgICAidGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudFxuIgorLy91c2FnZTogICAgICJcbgktLCAtaQlTdGFydCB3aXRoIGFuIGVtcHR5IGVudmlyb25tZW50IgorLy91c2FnZTogICAgICJcbgktdQlSZW1vdmUgdmFyaWFibGUgZnJvbSB0aGUgZW52aXJvbm1lbnQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgZW52X2xvbmdvcHRzW10gQUxJR04xID0KKwkiaWdub3JlLWVudmlyb25tZW50XDAiIE5vX2FyZ3VtZW50ICAgICAgICJpIgorCSJ1bnNldFwwIiAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInUiCisJOworI2VuZGlmCisKK2ludCBlbnZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGVudl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwlsbGlzdF90ICp1bnNldF9lbnYgPSBOVUxMOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidTo6IjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGVudl9sb25nb3B0czsKKyNlbmRpZgorCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiK2l1OiIsICZ1bnNldF9lbnYpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChhcmd2WzBdICYmIExPTkVfREFTSChhcmd2WzBdKSkgeworCQlvcHRzIHw9IDE7CisJCSsrYXJndjsKKwl9CisJaWYgKG9wdHMgJiAxKSB7CisJCWNsZWFyZW52KCk7CisJfQorCXdoaWxlICh1bnNldF9lbnYpIHsKKwkJY2hhciAqdmFyID0gbGxpc3RfcG9wKCZ1bnNldF9lbnYpOworCQkvKiBUaGlzIGRvZXMgbm90IGhhbmRsZSAtdVZBUj1WQUwKKwkJICogKGNvcmV1dGlscyBfc2V0c18gdGhlIHZhcmlhYmxlIGluIHRoYXQgY2FzZSk6ICovCisJCS8qdW5zZXRlbnYodmFyKTsqLworCQkvKiBUaGlzIGRvZXMsIGJ1dCB1c2VzIHNvbWV3aGFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlIHRoYXQKKwkJICogcHV0ZW52KCJuYW1lX3dpdGhvdXRfZXF1YWxfc2lnbiIpIHVuc2V0cyB0aGUgdmFyaWFibGU6ICovCisJCXB1dGVudih2YXIpOworCX0KKworCXdoaWxlICgqYXJndiAmJiAoc3RyY2hyKCphcmd2LCAnPScpICE9IE5VTEwpKSB7CisJCWlmIChwdXRlbnYoKmFyZ3YpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJwdXRlbnYiKTsKKwkJfQorCQkrK2FyZ3Y7CisJfQorCisJaWYgKGFyZ3ZbMF0pIHsKKwkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwl9CisKKwlpZiAoZW52aXJvbikgeyAvKiBjbGVhcmVudigpIG1heSBzZXQgZW52aXJvbiA9PSBOVUxMISAqLworCQljaGFyICoqZXA7CisJCWZvciAoZXAgPSBlbnZpcm9uOyAqZXA7IGVwKyspIHsKKwkJCXB1dHMoKmVwKTsKKwkJfQorCX0KKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBCU0QgQWR2ZXJ0aXNpbmcgQ2xhdXNlIG9taXR0ZWQgcGVyIHRoZSBKdWx5IDIyLCAxOTk5IGxpY2Vuc2luZyBjaGFuZ2UKKyAqICAgIGZ0cDovL2Z0cC5jcy5iZXJrZWxleS5lZHUvcHViLzRic2QvUkVBRE1FLkltcHQuTGljZW5zZS5DaGFuZ2UKKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZXhwYW5kLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZXhwYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViYmZmYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9leHBhbmQuYwpAQCAtMCwwICsxLDIzMyBAQAorLyogZXhwYW5kIC0gY29udmVydCB0YWJzIHRvIHNwYWNlcworICogdW5leHBhbmQgLSBjb252ZXJ0IHNwYWNlcyB0byB0YWJzCisgKgorICogQ29weXJpZ2h0IChDKSA4OSwgOTEsIDE5OTUtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIERhdmlkIE1hY0tlbnppZSA8ZGptQGdudS5haS5taXQuZWR1PgorICoKKyAqIE9wdGlvbnMgZm9yIGV4cGFuZDoKKyAqIC10IG51bSAgLS10YWJzPU5VTSAgICAgIENvbnZlcnQgdGFicyB0byBudW0gc3BhY2VzIChkZWZhdWx0IDggc3BhY2VzKS4KKyAqIC1pICAgICAgLS1pbml0aWFsICAgICAgIE9ubHkgY29udmVydCBpbml0aWFsIHRhYnMgb24gZWFjaCBsaW5lIHRvIHNwYWNlcy4KKyAqCisgKiBPcHRpb25zIGZvciB1bmV4cGFuZDoKKyAqIC1hICAgICAgLS1hbGwgICAgICAgICAgIENvbnZlcnQgYWxsIGJsYW5rcywgaW5zdGVhZCBvZiBqdXN0IGluaXRpYWwgYmxhbmtzLgorICogLWYgICAgICAtLWZpcnN0LW9ubHkgICAgQ29udmVydCBvbmx5IGxlYWRpbmcgc2VxdWVuY2VzIG9mIGJsYW5rcyAoZGVmYXVsdCkuCisgKiAtdCBudW0gIC0tdGFicz1OVU0gICAgICBIYXZlIHRhYnMgbnVtIGNoYXJhY3RlcnMgYXBhcnQgaW5zdGVhZCBvZiA4LgorICoKKyAqICBCdXN5Ym94IHZlcnNpb24gKEMpIDIwMDcgYnkgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqICBDYXZlYXQ6IHRoaXMgdmVyc2lvbnMgb2YgZXhwYW5kIGFuZCB1bmV4cGFuZCBkb24ndCBhY2NlcHQgdGFiIGxpc3RzLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBleHBhbmRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstaV0gWy10IE5dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBleHBhbmRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb252ZXJ0IHRhYnMgdG8gc3BhY2VzLCB3cml0aW5nIHRvIHN0ZG91dFxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktaSwtLWluaXRpYWwJRG9uJ3QgY29udmVydCB0YWJzIGFmdGVyIG5vbiBibGFua3MiCisvL3VzYWdlOiAgICAgIlxuCS10LC0tdGFicz1OCVRhYnN0b3BzIGV2ZXJ5IE4gY2hhcnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktaQlEb24ndCBjb252ZXJ0IHRhYnMgYWZ0ZXIgbm9uIGJsYW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJVGFic3RvcHMgZXZlcnkgTiBjaGFycyIKKy8vdXNhZ2U6CSkKKworLy91c2FnZTojZGVmaW5lIHVuZXhwYW5kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWZhXVstdCBOXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdW5leHBhbmRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb252ZXJ0IHNwYWNlcyB0byB0YWJzLCB3cml0aW5nIHRvIHN0ZG91dFxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1hLC0tYWxsCUNvbnZlcnQgYWxsIGJsYW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYsLS1maXJzdC1vbmx5CUNvbnZlcnQgb25seSBsZWFkaW5nIGJsYW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10YWJzPU4JVGFic3RvcHMgZXZlcnkgTiBjaGFycyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWEJQ29udmVydCBhbGwgYmxhbmtzIgorLy91c2FnZTogICAgICJcbgktZglDb252ZXJ0IG9ubHkgbGVhZGluZyBibGFua3MiCisvL3VzYWdlOiAgICAgIlxuCS10IE4JVGFic3RvcHMgZXZlcnkgTiBjaGFycyIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCitlbnVtIHsKKwlPUFRfSU5JVElBTCAgICAgPSAxIDw8IDAsCisJT1BUX1RBQlMgICAgICAgID0gMSA8PCAxLAorCU9QVF9BTEwgICAgICAgICA9IDEgPDwgMiwKK307CisKKyNpZiBFTkFCTEVfRVhQQU5ECitzdGF0aWMgdm9pZCBleHBhbmQoRklMRSAqZmlsZSwgdW5zaWduZWQgdGFiX3NpemUsIHVuc2lnbmVkIG9wdCkKK3sKKwljaGFyICpsaW5lOworCisJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0cyhmaWxlKSkgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBjaGFyIGM7CisJCWNoYXIgKnB0cjsKKwkJY2hhciAqcHRyX3N0cmJlZzsKKworCQlwdHIgPSBwdHJfc3RyYmVnID0gbGluZTsKKwkJd2hpbGUgKChjID0gKnB0cikgIT0gJ1wwJykgeworCQkJaWYgKChvcHQgJiBPUFRfSU5JVElBTCkgJiYgIWlzYmxhbmsoYykpIHsKKwkJCQkvKiBub3Qgc3BhY2Ugb3IgdGFiICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYyA9PSAnXHQnKSB7CisJCQkJdW5zaWduZWQgbGVuOworCQkJCSpwdHIgPSAnXDAnOworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQkJeworCQkJCQl1bmlfc3RhdF90IHVuaV9zdGF0OworCQkJCQlwcmludGFibGVfc3RyaW5nKCZ1bmlfc3RhdCwgcHRyX3N0cmJlZyk7CisJCQkJCWxlbiA9IHVuaV9zdGF0LnVuaWNvZGVfd2lkdGg7CisJCQkJfQorIyBlbHNlCisJCQkJbGVuID0gcHRyIC0gcHRyX3N0cmJlZzsKKyMgZW5kaWYKKwkJCQlsZW4gPSB0YWJfc2l6ZSAtIChsZW4gJSB0YWJfc2l6ZSk7CisJCQkJLyp3aGlsZSAocHRyWzFdID09ICdcdCcpIHsgcHRyKys7IGxlbiArPSB0YWJfc2l6ZTsgfSAtIGNhbiBoYW5kbGUgbWFueSB0YWJzIGF0IG9uY2UgKi8KKwkJCQlwcmludGYoIiVzJSpzIiwgcHRyX3N0cmJlZywgbGVuLCAiIik7CisJCQkJcHRyX3N0cmJlZyA9IHB0ciArIDE7CisJCQl9CisJCQlwdHIrKzsKKwkJfQorCQlmcHV0cyhwdHJfc3RyYmVnLCBzdGRvdXQpOworCQlmcmVlKGxpbmUpOworCX0KK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX1VORVhQQU5ECitzdGF0aWMgdm9pZCB1bmV4cGFuZChGSUxFICpmaWxlLCB1bnNpZ25lZCB0YWJfc2l6ZSwgdW5zaWduZWQgb3B0KQoreworCWNoYXIgKmxpbmU7CisKKwl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRzKGZpbGUpKSAhPSBOVUxMKSB7CisJCWNoYXIgKnB0ciA9IGxpbmU7CisJCXVuc2lnbmVkIGNvbHVtbiA9IDA7CisKKwkJd2hpbGUgKCpwdHIpIHsKKwkJCXVuc2lnbmVkIG47CisJCQl1bnNpZ25lZCBsZW4gPSAwOworCisJCQl3aGlsZSAoKnB0ciA9PSAnICcpIHsKKwkJCQlwdHIrKzsKKwkJCQlsZW4rKzsKKwkJCX0KKwkJCWNvbHVtbiArPSBsZW47CisJCQlpZiAoKnB0ciA9PSAnXHQnKSB7CisJCQkJY29sdW1uICs9IHRhYl9zaXplIC0gKGNvbHVtbiAlIHRhYl9zaXplKTsKKwkJCQlwdHIrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbiA9IGNvbHVtbiAvIHRhYl9zaXplOworCQkJaWYgKG4pIHsKKwkJCQlsZW4gPSBjb2x1bW4gPSBjb2x1bW4gJSB0YWJfc2l6ZTsKKwkJCQl3aGlsZSAobi0tKQorCQkJCQlwdXRjaGFyKCdcdCcpOworCQkJfQorCisJCQlpZiAoKG9wdCAmIE9QVF9JTklUSUFMKSAmJiBwdHIgIT0gbGluZSkgeworCQkJCXByaW50ZigiJSpzJXMiLCBsZW4sICIiLCBwdHIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbiA9IHN0cmNzcG4ocHRyLCAiXHQgIik7CisJCQlwcmludGYoIiUqcyUuKnMiLCBsZW4sICIiLCBuLCBwdHIpOworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQl7CisJCQkJY2hhciBjOworCQkJCXVuaV9zdGF0X3QgdW5pX3N0YXQ7CisJCQkJYyA9IHB0cltuXTsKKwkJCQlwdHJbbl0gPSAnXDAnOworCQkJCXByaW50YWJsZV9zdHJpbmcoJnVuaV9zdGF0LCBwdHIpOworCQkJCWxlbiA9IHVuaV9zdGF0LnVuaWNvZGVfd2lkdGg7CisJCQkJcHRyW25dID0gYzsKKwkJCX0KKyMgZWxzZQorCQkJbGVuID0gbjsKKyMgZW5kaWYKKwkJCXB0ciArPSBuOworCQkJY29sdW1uID0gKGNvbHVtbiArIGxlbikgJSB0YWJfc2l6ZTsKKwkJfQorCQlmcmVlKGxpbmUpOworCX0KK30KKyNlbmRpZgorCitpbnQgZXhwYW5kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBleHBhbmRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIERlZmF1bHQgOCBzcGFjZXMgZm9yIDEgdGFiICovCisJY29uc3QgY2hhciAqb3B0X3QgPSAiOCI7CisJRklMRSAqZmlsZTsKKwl1bnNpZ25lZCB0YWJfc2l6ZTsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGV4aXRfc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIGV4cGFuZF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCS8qIG5hbWUsIGhhc19hcmcsIHZhbCAqLworCQkiaW5pdGlhbFwwIiAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiaSIKKwkJInRhYnNcMCIgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInQiCisJOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TCisJc3RhdGljIGNvbnN0IGNoYXIgdW5leHBhbmRfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkvKiBuYW1lLCBoYXNfYXJnLCB2YWwgKi8KKwkJImZpcnN0LW9ubHlcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgImkiCisJCSJ0YWJzXDAiICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCQkiYWxsXDAiICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYSIKKwk7CisjZW5kaWYKKwlpbml0X3VuaWNvZGUoKTsKKworCWlmIChFTkFCTEVfRVhQQU5EICYmICghRU5BQkxFX1VORVhQQU5EIHx8IGFwcGxldF9uYW1lWzBdID09ICdlJykpIHsKKwkJSUZfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TKGFwcGxldF9sb25nX29wdGlvbnMgPSBleHBhbmRfbG9uZ29wdHMpOworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAiaXQ6IiwgJm9wdF90KTsKKwl9IGVsc2UgeworCQlJRl9GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gdW5leHBhbmRfbG9uZ29wdHMpOworCQkvKiAtdCBOVU0gc2V0cyBhbHNvIC1hICovCisJCW9wdF9jb21wbGVtZW50YXJ5ID0gInRhIjsKKwkJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImZ0OmEiLCAmb3B0X3QpOworCQkvKiAtZiAtLWZpcnN0LW9ubHkgaXMgdGhlIGRlZmF1bHQgKi8KKwkJaWYgKCEob3B0ICYgT1BUX0FMTCkpIG9wdCB8PSBPUFRfSU5JVElBTDsKKwl9CisJdGFiX3NpemUgPSB4YXRvdV9yYW5nZShvcHRfdCwgMSwgVUlOVF9NQVgpOworCisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoISphcmd2KSB7CisJCSotLWFyZ3YgPSAoY2hhciopYmJfbXNnX3N0YW5kYXJkX2lucHV0OworCX0KKwlkbyB7CisJCWZpbGUgPSBmb3Blbl9vcl93YXJuX3N0ZGluKCphcmd2KTsKKwkJaWYgKCFmaWxlKSB7CisJCQlleGl0X3N0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKEVOQUJMRV9FWFBBTkQgJiYgKCFFTkFCTEVfVU5FWFBBTkQgfHwgYXBwbGV0X25hbWVbMF0gPT0gJ2UnKSkKKwkJCUlGX0VYUEFORChleHBhbmQoZmlsZSwgdGFiX3NpemUsIG9wdCkpOworCQllbHNlCisJCQlJRl9VTkVYUEFORCh1bmV4cGFuZChmaWxlLCB0YWJfc2l6ZSwgb3B0KSk7CisKKwkJLyogQ2hlY2sgYW5kIGNsb3NlIHRoZSBmaWxlICovCisJCWlmIChmY2xvc2VfaWZfbm90X3N0ZGluKGZpbGUpKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7CisJCQlleGl0X3N0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCQkvKiBJZiBzdGRpbiBhbHNvIGNsZWFyIEVPRiAqLworCQlpZiAoZmlsZSA9PSBzdGRpbikKKwkJCWNsZWFyZXJyKGZpbGUpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJLyogTm93IGNsb3NlIHN0ZGluIGFsc28gKi8KKwkvKiAoaWYgd2UgZGlkbid0IHJlYWQgZnJvbSBpdCwgaXQncyBhIG5vLW9wKSAqLworCWlmIChmY2xvc2Uoc3RkaW4pKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3N0YW5kYXJkX2lucHV0KTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoZXhpdF9zdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2V4cHIuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9leHByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNzViNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9leHByLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZXhwciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIGJhc2VkIG9uIEdOVSBleHByIE1pa2UgUGFya2VyLgorICogQ29weXJpZ2h0IChDKSA4NiwgMTk5MS0xOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIEJ1c3lib3ggbW9kaWZpY2F0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAwICBFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPi4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1ICBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKiAgLSByZWR1Y2VkIDQ2NCBieXRlcy4KKyAqICAtIDY0IG1hdGggc3VwcG9ydAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogVGhpcyBwcm9ncmFtIGV2YWx1YXRlcyBleHByZXNzaW9ucy4gIEVhY2ggdG9rZW4gKG9wZXJhdG9yLCBvcGVyYW5kLAorICogcGFyZW50aGVzaXMpIG9mIHRoZSBleHByZXNzaW9uIG11c3QgYmUgYSBzZXBhcmF0ZSBhcmd1bWVudC4gIFRoZQorICogcGFyc2VyIHVzZWQgaXMgYSByZWFzb25hYmx5IGdlbmVyYWwgb25lLCB0aG91Z2ggYW55IGluY2FybmF0aW9uIG9mCisgKiBpdCBpcyBsYW5ndWFnZS1zcGVjaWZpYy4gIEl0IGlzIGVzcGVjaWFsbHkgbmljZSBmb3IgZXhwcmVzc2lvbnMuCisgKgorICogTm8gcGFyc2UgdHJlZSBpcyBuZWVkZWQ7IGEgbmV3IG5vZGUgaXMgZXZhbHVhdGVkIGltbWVkaWF0ZWx5LgorICogT25lIGZ1bmN0aW9uIGNhbiBoYW5kbGUgbXVsdGlwbGUgb3BlcmF0b3JzIGFsbCBvZiBlcXVhbCBwcmVjZWRlbmNlLAorICogcHJvdmlkZWQgdGhleSBhbGwgYXNzb2NpYXRlICgoeCBvcCB4KSBvcCB4KS4gKi8KKworLyogbm8gZ2V0b3B0IG5lZWRlZCAqLworCisvL3VzYWdlOiNkZWZpbmUgZXhwcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRVhQUkVTU0lPTiIKKy8vdXNhZ2U6I2RlZmluZSBleHByX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgdGhlIHZhbHVlIG9mIEVYUFJFU1NJT04gdG8gc3Rkb3V0XG4iCisvL3VzYWdlOiAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiRVhQUkVTU0lPTiBtYXkgYmU6XG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgfCBBUkcyCUFSRzEgaWYgaXQgaXMgbmVpdGhlciBudWxsIG5vciAwLCBvdGhlcndpc2UgQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxICYgQVJHMglBUkcxIGlmIG5laXRoZXIgYXJndW1lbnQgaXMgbnVsbCBvciAwLCBvdGhlcndpc2UgMFxuIgorLy91c2FnZTogICAgICAgIglBUkcxIDwgQVJHMgkxIGlmIEFSRzEgaXMgbGVzcyB0aGFuIEFSRzIsIGVsc2UgMC4gU2ltaWxhcmx5OlxuIgorLy91c2FnZTogICAgICAgIglBUkcxIDw9IEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSA9IEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSAhPSBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgPj0gQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxID4gQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxICsgQVJHMglTdW0gb2YgQVJHMSBhbmQgQVJHMi4gU2ltaWxhcmx5OlxuIgorLy91c2FnZTogICAgICAgIglBUkcxIC0gQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxICogQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxIC8gQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxICUgQVJHMlxuIgorLy91c2FnZTogICAgICAgIglTVFJJTkcgOiBSRUdFWFAJCUFuY2hvcmVkIHBhdHRlcm4gbWF0Y2ggb2YgUkVHRVhQIGluIFNUUklOR1xuIgorLy91c2FnZTogICAgICAgIgltYXRjaCBTVFJJTkcgUkVHRVhQCVNhbWUgYXMgU1RSSU5HIDogUkVHRVhQXG4iCisvL3VzYWdlOiAgICAgICAiCXN1YnN0ciBTVFJJTkcgUE9TIExFTkdUSCBTdWJzdHJpbmcgb2YgU1RSSU5HLCBQT1MgY291bnRlZCBmcm9tIDFcbiIKKy8vdXNhZ2U6ICAgICAgICIJaW5kZXggU1RSSU5HIENIQVJTCUluZGV4IGluIFNUUklORyB3aGVyZSBhbnkgQ0hBUlMgaXMgZm91bmQsIG9yIDBcbiIKKy8vdXNhZ2U6ICAgICAgICIJbGVuZ3RoIFNUUklORwkJTGVuZ3RoIG9mIFNUUklOR1xuIgorLy91c2FnZTogICAgICAgIglxdW90ZSBUT0tFTgkJSW50ZXJwcmV0IFRPS0VOIGFzIGEgc3RyaW5nLCBldmVuIGlmXG4iCisvL3VzYWdlOiAgICAgICAiCQkJCWl0IGlzIGEga2V5d29yZCBsaWtlICdtYXRjaCcgb3IgYW5cbiIKKy8vdXNhZ2U6ICAgICAgICIJCQkJb3BlcmF0b3IgbGlrZSAnLydcbiIKKy8vdXNhZ2U6ICAgICAgICIJKEVYUFJFU1NJT04pCQlWYWx1ZSBvZiBFWFBSRVNTSU9OXG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiQmV3YXJlIHRoYXQgbWFueSBvcGVyYXRvcnMgbmVlZCB0byBiZSBlc2NhcGVkIG9yIHF1b3RlZCBmb3Igc2hlbGxzLlxuIgorLy91c2FnZTogICAgICAgIkNvbXBhcmlzb25zIGFyZSBhcml0aG1ldGljIGlmIGJvdGggQVJHcyBhcmUgbnVtYmVycywgZWxzZVxuIgorLy91c2FnZTogICAgICAgImxleGljb2dyYXBoaWNhbC4gUGF0dGVybiBtYXRjaGVzIHJldHVybiB0aGUgc3RyaW5nIG1hdGNoZWQgYmV0d2VlblxuIgorLy91c2FnZTogICAgICAgIlxcKCBhbmQgXFwpIG9yIG51bGw7IGlmIFxcKCBhbmQgXFwpIGFyZSBub3QgdXNlZCwgdGhleSByZXR1cm4gdGhlIG51bWJlclxuIgorLy91c2FnZTogICAgICAgIm9mIGNoYXJhY3RlcnMgbWF0Y2hlZCBvciAwLiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAieHJlZ2V4LmgiCisKKyNpZiBFTkFCTEVfRVhQUl9NQVRIX1NVUFBPUlRfNjQKK3R5cGVkZWYgaW50NjRfdCBhcml0aF90OworCisjZGVmaW5lIFBGX1JFWiAgICAgICJsbCIKKyNkZWZpbmUgUEZfUkVaX1RZUEUgKGxvbmcgbG9uZykKKyNkZWZpbmUgU1RSVE9MKHMsIGUsIGIpIHN0cnRvbGwocywgZSwgYikKKyNlbHNlCit0eXBlZGVmIGxvbmcgYXJpdGhfdDsKKworI2RlZmluZSBQRl9SRVogICAgICAibCIKKyNkZWZpbmUgUEZfUkVaX1RZUEUgKGxvbmcpCisjZGVmaW5lIFNUUlRPTChzLCBlLCBiKSBzdHJ0b2wocywgZSwgYikKKyNlbmRpZgorCisvKiBUT0RPOiB1c2UgYmJfc3RydG9sW2xdPyBJdCdzIGVhc2llciB0byBjaGVjayBmb3IgZXJyb3JzLi4uICovCisKKy8qIFRoZSBraW5kcyBvZiB2YWx1ZSB3ZSBjYW4gaGF2ZS4gICovCitlbnVtIHsKKwlJTlRFR0VSLAorCVNUUklORworfTsKKworLyogQSB2YWx1ZSBpcy4uLi4gKi8KK3N0cnVjdCB2YWxpbmZvIHsKKwlzbWFsbGludCB0eXBlOyAgICAgICAgICAgICAgICAgIC8qIFdoaWNoIGtpbmQuICovCisJdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdmFsdWUgaXRzZWxmLiAqLworCQlhcml0aF90IGk7CisJCWNoYXIgKnM7CisJfSB1OworfTsKK3R5cGVkZWYgc3RydWN0IHZhbGluZm8gVkFMVUU7CisKKy8qIFRoZSBhcmd1bWVudHMgZ2l2ZW4gdG8gdGhlIHByb2dyYW0sIG1pbnVzIHRoZSBwcm9ncmFtIG5hbWUuICAqLworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgKiphcmdzOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBWQUxVRSAqZXZhbCh2b2lkKTsKKworCisvKiBSZXR1cm4gYSBWQUxVRSBmb3IgSS4gICovCisKK3N0YXRpYyBWQUxVRSAqaW50X3ZhbHVlKGFyaXRoX3QgaSkKK3sKKwlWQUxVRSAqdjsKKworCXYgPSB4emFsbG9jKHNpemVvZihWQUxVRSkpOworCWlmIChJTlRFR0VSKSAvKiBvdGhlcndpc2UgeHphYWxvYyBkaWQgaXQgYWxyZWFkeSAqLworCQl2LT50eXBlID0gSU5URUdFUjsKKwl2LT51LmkgPSBpOworCXJldHVybiB2OworfQorCisvKiBSZXR1cm4gYSBWQUxVRSBmb3IgUy4gICovCisKK3N0YXRpYyBWQUxVRSAqc3RyX3ZhbHVlKGNvbnN0IGNoYXIgKnMpCit7CisJVkFMVUUgKnY7CisKKwl2ID0geHphbGxvYyhzaXplb2YoVkFMVUUpKTsKKwlpZiAoU1RSSU5HKSAvKiBvdGhlcndpc2UgeHphYWxvYyBkaWQgaXQgYWxyZWFkeSAqLworCQl2LT50eXBlID0gU1RSSU5HOworCXYtPnUucyA9IHhzdHJkdXAocyk7CisJcmV0dXJuIHY7Cit9CisKKy8qIEZyZWUgVkFMVUUgViwgaW5jbHVkaW5nIHN0cnVjdHVyZSBjb21wb25lbnRzLiAgKi8KKworc3RhdGljIHZvaWQgZnJlZXYoVkFMVUUgKnYpCit7CisJaWYgKHYtPnR5cGUgPT0gU1RSSU5HKQorCQlmcmVlKHYtPnUucyk7CisJZnJlZSh2KTsKK30KKworLyogUmV0dXJuIG5vbnplcm8gaWYgViBpcyBhIG51bGwtc3RyaW5nIG9yIHplcm8tbnVtYmVyLiAgKi8KKworc3RhdGljIGludCBudWxsKFZBTFVFICp2KQoreworCWlmICh2LT50eXBlID09IElOVEVHRVIpCisJCXJldHVybiB2LT51LmkgPT0gMDsKKwkvKiBTVFJJTkc6ICovCisJcmV0dXJuIHYtPnUuc1swXSA9PSAnXDAnIHx8IExPTkVfQ0hBUih2LT51LnMsICcwJyk7Cit9CisKKy8qIENvZXJjZSBWIHRvIGEgU1RSSU5HIHZhbHVlIChjYW4ndCBmYWlsKS4gICovCisKK3N0YXRpYyB2b2lkIHRvc3RyaW5nKFZBTFVFICp2KQoreworCWlmICh2LT50eXBlID09IElOVEVHRVIpIHsKKwkJdi0+dS5zID0geGFzcHJpbnRmKCIlIiBQRl9SRVogImQiLCBQRl9SRVpfVFlQRSB2LT51LmkpOworCQl2LT50eXBlID0gU1RSSU5HOworCX0KK30KKworLyogQ29lcmNlIFYgdG8gYW4gSU5URUdFUiB2YWx1ZS4gIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4gICovCisKK3N0YXRpYyBib29sIHRvYXJpdGgoVkFMVUUgKnYpCit7CisJaWYgKHYtPnR5cGUgPT0gU1RSSU5HKSB7CisJCWFyaXRoX3QgaTsKKwkJY2hhciAqZTsKKworCQkvKiBEb24ndCBpbnRlcnByZXQgdGhlIGVtcHR5IHN0cmluZyBhcyBhbiBpbnRlZ2VyLiAgKi8KKwkJLyogQ3VycmVudGx5IGRvZXMgbm90IHdvcnJ5IGFib3V0IG92ZXJmbG93IG9yIGludC9sb25nIGRpZmZlcmVuY2VzLiAqLworCQlpID0gU1RSVE9MKHYtPnUucywgJmUsIDEwKTsKKwkJaWYgKCh2LT51LnMgPT0gZSkgfHwgKmUpCisJCQlyZXR1cm4gMDsKKwkJZnJlZSh2LT51LnMpOworCQl2LT51LmkgPSBpOworCQl2LT50eXBlID0gSU5URUdFUjsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIFJldHVybiBzdHJbMF0rc3RyWzFdIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgU1RSIGV4YWN0bHkuCisgICBTVFIgbXVzdCBub3QgYmUgTlVMTC4gICovCisKK3N0YXRpYyBpbnQgbmV4dGFyZyhjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKCpHLmFyZ3MgPT0gTlVMTCB8fCBzdHJjbXAoKkcuYXJncywgc3RyKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpc3RyWzBdICsgKHVuc2lnbmVkIGNoYXIpc3RyWzFdOworfQorCisvKiBUaGUgY29tcGFyaXNvbiBvcGVyYXRvciBoYW5kbGluZyBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgaW50IGNtcF9jb21tb24oVkFMVUUgKmwsIFZBTFVFICpyLCBpbnQgb3ApCit7CisJYXJpdGhfdCBsbCwgcnI7CisKKwlsbCA9IGwtPnUuaTsKKwlyciA9IHItPnUuaTsKKwlpZiAobC0+dHlwZSA9PSBTVFJJTkcgfHwgci0+dHlwZSA9PSBTVFJJTkcpIHsKKwkJdG9zdHJpbmcobCk7CisJCXRvc3RyaW5nKHIpOworCQlsbCA9IHN0cmNtcChsLT51LnMsIHItPnUucyk7CisJCXJyID0gMDsKKwl9CisJLyogY2FsY3VsYXRpbmcgbGwgLSByciBhbmQgY2hlY2tpbmcgdGhlIHJlc3VsdCBpcyBwcm9uZSB0byBvdmVyZmxvd3MuCisJICogV2UnbGwgZG8gaXQgZGlmZmVyZW50bHk6ICovCisJaWYgKG9wID09ICc8JykKKwkJcmV0dXJuIGxsIDwgcnI7CisJaWYgKG9wID09ICgnPCcgKyAnPScpKQorCQlyZXR1cm4gbGwgPD0gcnI7CisJaWYgKG9wID09ICc9JyB8fCAob3AgPT0gJz0nICsgJz0nKSkKKwkJcmV0dXJuIGxsID09IHJyOworCWlmIChvcCA9PSAnIScgKyAnPScpCisJCXJldHVybiBsbCAhPSBycjsKKwlpZiAob3AgPT0gJz4nKQorCQlyZXR1cm4gbGwgPiBycjsKKwkvKiA+PSAqLworCXJldHVybiBsbCA+PSBycjsKK30KKworLyogVGhlIGFyaXRobWV0aWMgb3BlcmF0b3IgaGFuZGxpbmcgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIGFyaXRoX3QgYXJpdGhtZXRpY19jb21tb24oVkFMVUUgKmwsIFZBTFVFICpyLCBpbnQgb3ApCit7CisJYXJpdGhfdCBsaSwgcmk7CisKKwlpZiAoIXRvYXJpdGgobCkgfHwgIXRvYXJpdGgocikpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub24tbnVtZXJpYyBhcmd1bWVudCIpOworCWxpID0gbC0+dS5pOworCXJpID0gci0+dS5pOworCWlmIChvcCA9PSAnKycpCisJCXJldHVybiBsaSArIHJpOworCWlmIChvcCA9PSAnLScpCisJCXJldHVybiBsaSAtIHJpOworCWlmIChvcCA9PSAnKicpCisJCXJldHVybiBsaSAqIHJpOworCWlmIChyaSA9PSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZGl2aXNpb24gYnkgemVybyIpOworCWlmIChvcCA9PSAnLycpCisJCXJldHVybiBsaSAvIHJpOworCXJldHVybiBsaSAlIHJpOworfQorCisvKiBEbyB0aGUgOiBvcGVyYXRvci4KKyAgIFNWIGlzIHRoZSBWQUxVRSBmb3IgdGhlIGxocyAodGhlIHN0cmluZyksCisgICBQViBpcyB0aGUgVkFMVUUgZm9yIHRoZSByaHMgKHRoZSBwYXR0ZXJuKS4gICovCisKK3N0YXRpYyBWQUxVRSAqZG9jb2xvbihWQUxVRSAqc3YsIFZBTFVFICpwdikKK3sKKwllbnVtIHsgTk1BVENIID0gMiB9OworCVZBTFVFICp2OworCXJlZ2V4X3QgcmVfYnVmZmVyOworCXJlZ21hdGNoX3QgcmVfcmVnc1tOTUFUQ0hdOworCisJdG9zdHJpbmcoc3YpOworCXRvc3RyaW5nKHB2KTsKKworCWlmIChwdi0+dS5zWzBdID09ICdeJykgeworCQliYl9lcnJvcl9tc2coCisid2FybmluZzogJyVzJzogdXNpbmcgJ14nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiIKKyJvZiBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBub3QgcG9ydGFibGU7IGl0IGlzIGlnbm9yZWQiLCBwdi0+dS5zKTsKKwl9CisKKwltZW1zZXQoJnJlX2J1ZmZlciwgMCwgc2l6ZW9mKHJlX2J1ZmZlcikpOworCW1lbXNldChyZV9yZWdzLCAwLCBzaXplb2YocmVfcmVncykpOworCXhyZWdjb21wKCZyZV9idWZmZXIsIHB2LT51LnMsIDApOworCisJLyogZXhwciB1c2VzIGFuIGFuY2hvcmVkIHBhdHRlcm4gbWF0Y2gsIHNvIGNoZWNrIHRoYXQgdGhlcmUgd2FzIGEKKwkgKiBtYXRjaCBhbmQgdGhhdCB0aGUgbWF0Y2ggc3RhcnRzIGF0IG9mZnNldCAwLiAqLworCWlmIChyZWdleGVjKCZyZV9idWZmZXIsIHN2LT51LnMsIE5NQVRDSCwgcmVfcmVncywgMCkgIT0gUkVHX05PTUFUQ0gKKwkgJiYgcmVfcmVnc1swXS5ybV9zbyA9PSAwCisJKSB7CisJCS8qIFdlcmUgXCguLi5cKSB1c2VkPyAqLworCQlpZiAocmVfYnVmZmVyLnJlX25zdWIgPiAwICYmIHJlX3JlZ3NbMV0ucm1fc28gPj0gMCkgeworCQkJc3YtPnUuc1tyZV9yZWdzWzFdLnJtX2VvXSA9ICdcMCc7CisJCQl2ID0gc3RyX3ZhbHVlKHN2LT51LnMgKyByZV9yZWdzWzFdLnJtX3NvKTsKKwkJfSBlbHNlIHsKKwkJCXYgPSBpbnRfdmFsdWUocmVfcmVnc1swXS5ybV9lbyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBNYXRjaCBmYWlsZWQgLS0gcmV0dXJuIHRoZSByaWdodCBraW5kIG9mIG51bGwuICAqLworCQlpZiAocmVfYnVmZmVyLnJlX25zdWIgPiAwKQorCQkJdiA9IHN0cl92YWx1ZSgiIik7CisJCWVsc2UKKwkJCXYgPSBpbnRfdmFsdWUoMCk7CisJfQorCXJlZ2ZyZWUoJnJlX2J1ZmZlcik7CisJcmV0dXJuIHY7Cit9CisKKy8qIEhhbmRsZSBiYXJlIG9wZXJhbmRzIGFuZCAoIGV4cHIgKSBzeW50YXguICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWw3KHZvaWQpCit7CisJVkFMVUUgKnY7CisKKwlpZiAoISpHLmFyZ3MpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW50YXggZXJyb3IiKTsKKworCWlmIChuZXh0YXJnKCIoIikpIHsKKwkJRy5hcmdzKys7CisJCXYgPSBldmFsKCk7CisJCWlmICghbmV4dGFyZygiKSIpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciIpOworCQlHLmFyZ3MrKzsKKwkJcmV0dXJuIHY7CisJfQorCisJaWYgKG5leHRhcmcoIikiKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciIpOworCisJcmV0dXJuIHN0cl92YWx1ZSgqRy5hcmdzKyspOworfQorCisvKiBIYW5kbGUgbWF0Y2gsIHN1YnN0ciwgaW5kZXgsIGxlbmd0aCwgYW5kIHF1b3RlIGtleXdvcmRzLiAgKi8KKworc3RhdGljIFZBTFVFICpldmFsNih2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJInF1b3RlXDAiImxlbmd0aFwwIiJtYXRjaFwwIiJpbmRleFwwIiJzdWJzdHJcMCI7CisKKwlWQUxVRSAqciwgKmkxLCAqaTI7CisJVkFMVUUgKmwgPSBsOyAvKiBzaWxlbmNlIGdjYyAqLworCVZBTFVFICp2ID0gdjsgLyogc2lsZW5jZSBnY2MgKi8KKwlpbnQga2V5ID0gKkcuYXJncyA/IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICpHLmFyZ3MpICsgMSA6IDA7CisKKwlpZiAoa2V5ID09IDApIC8qIG5vdCBhIGtleXdvcmQgKi8KKwkJcmV0dXJuIGV2YWw3KCk7CisJRy5hcmdzKys7IC8qIFdlIGhhdmUgYSB2YWxpZCB0b2tlbiwgc28gZ2V0IHRoZSBuZXh0IGFyZ3VtZW50LiAgKi8KKwlpZiAoa2V5ID09IDEpIHsgLyogcXVvdGUgKi8KKwkJaWYgKCEqRy5hcmdzKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciIpOworCQlyZXR1cm4gc3RyX3ZhbHVlKCpHLmFyZ3MrKyk7CisJfQorCWlmIChrZXkgPT0gMikgeyAvKiBsZW5ndGggKi8KKwkJciA9IGV2YWw2KCk7CisJCXRvc3RyaW5nKHIpOworCQl2ID0gaW50X3ZhbHVlKHN0cmxlbihyLT51LnMpKTsKKwkJZnJlZXYocik7CisJfSBlbHNlCisJCWwgPSBldmFsNigpOworCisJaWYgKGtleSA9PSAzKSB7IC8qIG1hdGNoICovCisJCXIgPSBldmFsNigpOworCQl2ID0gZG9jb2xvbihsLCByKTsKKwkJZnJlZXYobCk7CisJCWZyZWV2KHIpOworCX0KKwlpZiAoa2V5ID09IDQpIHsgLyogaW5kZXggKi8KKwkJciA9IGV2YWw2KCk7CisJCXRvc3RyaW5nKGwpOworCQl0b3N0cmluZyhyKTsKKwkJdiA9IGludF92YWx1ZShzdHJjc3BuKGwtPnUucywgci0+dS5zKSArIDEpOworCQlpZiAodi0+dS5pID09IChhcml0aF90KSBzdHJsZW4obC0+dS5zKSArIDEpCisJCQl2LT51LmkgPSAwOworCQlmcmVldihsKTsKKwkJZnJlZXYocik7CisJfQorCWlmIChrZXkgPT0gNSkgeyAvKiBzdWJzdHIgKi8KKwkJaTEgPSBldmFsNigpOworCQlpMiA9IGV2YWw2KCk7CisJCXRvc3RyaW5nKGwpOworCQlpZiAoIXRvYXJpdGgoaTEpIHx8ICF0b2FyaXRoKGkyKQorCQkgfHwgaTEtPnUuaSA+IChhcml0aF90KSBzdHJsZW4obC0+dS5zKQorCQkgfHwgaTEtPnUuaSA8PSAwIHx8IGkyLT51LmkgPD0gMCkKKwkJCXYgPSBzdHJfdmFsdWUoIiIpOworCQllbHNlIHsKKwkJCXYgPSB4bWFsbG9jKHNpemVvZihWQUxVRSkpOworCQkJdi0+dHlwZSA9IFNUUklORzsKKwkJCXYtPnUucyA9IHhzdHJuZHVwKGwtPnUucyArIGkxLT51LmkgLSAxLCBpMi0+dS5pKTsKKwkJfQorCQlmcmVldihsKTsKKwkJZnJlZXYoaTEpOworCQlmcmVldihpMik7CisJfQorCXJldHVybiB2OworfQorCisvKiBIYW5kbGUgOiBvcGVyYXRvciAocGF0dGVybiBtYXRjaGluZykuCisgICBDYWxscyBkb2NvbG9uIHRvIGRvIHRoZSByZWFsIHdvcmsuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWw1KHZvaWQpCit7CisJVkFMVUUgKmwsICpyLCAqdjsKKworCWwgPSBldmFsNigpOworCXdoaWxlIChuZXh0YXJnKCI6IikpIHsKKwkJRy5hcmdzKys7CisJCXIgPSBldmFsNigpOworCQl2ID0gZG9jb2xvbihsLCByKTsKKwkJZnJlZXYobCk7CisJCWZyZWV2KHIpOworCQlsID0gdjsKKwl9CisJcmV0dXJuIGw7Cit9CisKKy8qIEhhbmRsZSAqLCAvLCAlIG9wZXJhdG9ycy4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbDQodm9pZCkKK3sKKwlWQUxVRSAqbCwgKnI7CisJaW50IG9wOworCWFyaXRoX3QgdmFsOworCisJbCA9IGV2YWw1KCk7CisJd2hpbGUgKDEpIHsKKwkJb3AgPSBuZXh0YXJnKCIqIik7CisJCWlmICghb3ApIHsgb3AgPSBuZXh0YXJnKCIvIik7CisJCSBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiJSIpOworCQkgIGlmICghb3ApIHJldHVybiBsOworCQl9fQorCQlHLmFyZ3MrKzsKKwkJciA9IGV2YWw1KCk7CisJCXZhbCA9IGFyaXRobWV0aWNfY29tbW9uKGwsIHIsIG9wKTsKKwkJZnJlZXYobCk7CisJCWZyZWV2KHIpOworCQlsID0gaW50X3ZhbHVlKHZhbCk7CisJfQorfQorCisvKiBIYW5kbGUgKywgLSBvcGVyYXRvcnMuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWwzKHZvaWQpCit7CisJVkFMVUUgKmwsICpyOworCWludCBvcDsKKwlhcml0aF90IHZhbDsKKworCWwgPSBldmFsNCgpOworCXdoaWxlICgxKSB7CisJCW9wID0gbmV4dGFyZygiKyIpOworCQlpZiAoIW9wKSB7CisJCQlvcCA9IG5leHRhcmcoIi0iKTsKKwkJCWlmICghb3ApIHJldHVybiBsOworCQl9CisJCUcuYXJncysrOworCQlyID0gZXZhbDQoKTsKKwkJdmFsID0gYXJpdGhtZXRpY19jb21tb24obCwgciwgb3ApOworCQlmcmVldihsKTsKKwkJZnJlZXYocik7CisJCWwgPSBpbnRfdmFsdWUodmFsKTsKKwl9Cit9CisKKy8qIEhhbmRsZSBjb21wYXJpc29ucy4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbDIodm9pZCkKK3sKKwlWQUxVRSAqbCwgKnI7CisJaW50IG9wOworCWFyaXRoX3QgdmFsOworCisJbCA9IGV2YWwzKCk7CisJd2hpbGUgKDEpIHsKKwkJb3AgPSBuZXh0YXJnKCI8Iik7CisJCWlmICghb3ApIHsgb3AgPSBuZXh0YXJnKCI8PSIpOworCQkgaWYgKCFvcCkgeyBvcCA9IG5leHRhcmcoIj0iKTsKKwkJICBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiPT0iKTsKKwkJICAgaWYgKCFvcCkgeyBvcCA9IG5leHRhcmcoIiE9Iik7CisJCSAgICBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiPj0iKTsKKwkJICAgICBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiPiIpOworCQkgICAgICBpZiAoIW9wKSByZXR1cm4gbDsKKwkJfX19fX19CisJCUcuYXJncysrOworCQlyID0gZXZhbDMoKTsKKwkJdG9hcml0aChsKTsKKwkJdG9hcml0aChyKTsKKwkJdmFsID0gY21wX2NvbW1vbihsLCByLCBvcCk7CisJCWZyZWV2KGwpOworCQlmcmVldihyKTsKKwkJbCA9IGludF92YWx1ZSh2YWwpOworCX0KK30KKworLyogSGFuZGxlICYuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWwxKHZvaWQpCit7CisJVkFMVUUgKmwsICpyOworCisJbCA9IGV2YWwyKCk7CisJd2hpbGUgKG5leHRhcmcoIiYiKSkgeworCQlHLmFyZ3MrKzsKKwkJciA9IGV2YWwyKCk7CisJCWlmIChudWxsKGwpIHx8IG51bGwocikpIHsKKwkJCWZyZWV2KGwpOworCQkJZnJlZXYocik7CisJCQlsID0gaW50X3ZhbHVlKDApOworCQl9IGVsc2UKKwkJCWZyZWV2KHIpOworCX0KKwlyZXR1cm4gbDsKK30KKworLyogSGFuZGxlIHwuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWwodm9pZCkKK3sKKwlWQUxVRSAqbCwgKnI7CisKKwlsID0gZXZhbDEoKTsKKwl3aGlsZSAobmV4dGFyZygifCIpKSB7CisJCUcuYXJncysrOworCQlyID0gZXZhbDEoKTsKKwkJaWYgKG51bGwobCkpIHsKKwkJCWZyZWV2KGwpOworCQkJbCA9IHI7CisJCX0gZWxzZQorCQkJZnJlZXYocik7CisJfQorCXJldHVybiBsOworfQorCitpbnQgZXhwcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZXhwcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJVkFMVUUgKnY7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyOyAvKiBjb3JldXRpbHMgY29tcGF0ICovCisJRy5hcmdzID0gYXJndiArIDE7CisJaWYgKCpHLmFyZ3MgPT0gTlVMTCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIGZldyBhcmd1bWVudHMiKTsKKwl9CisJdiA9IGV2YWwoKTsKKwlpZiAoKkcuYXJncykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciIpOworCWlmICh2LT50eXBlID09IElOVEVHRVIpCisJCXByaW50ZigiJSIgUEZfUkVaICJkXG4iLCBQRl9SRVpfVFlQRSB2LT51LmkpOworCWVsc2UKKwkJcHV0cyh2LT51LnMpOworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQobnVsbCh2KSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZmFsc2UuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9mYWxzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzJmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZmFsc2UuYwpAQCAtMCwwICsxLDMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGZhbHNlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDAwOTUzOTkvdXRpbGl0aWVzL2ZhbHNlLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIGZhbHNlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgZmFsc2VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXR1cm4gYW4gZXhpdCBjb2RlIG9mIEZBTFNFICgxKSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmFsc2VfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZmFsc2VcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gJD9cbiIKKy8vdXNhZ2U6ICAgICAgICIxXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgZmFsc2VfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZhbHNlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9mb2xkLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZm9sZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzMwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZm9sZC5jCkBAIC0wLDAgKzEsMTc2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIGZvbGQgLS0gd3JhcCBlYWNoIGlucHV0IGxpbmUgdG8gZml0IGluIHNwZWNpZmllZCB3aWR0aC4KKworICAgV3JpdHRlbiBieSBEYXZpZCBNYWNLZW56aWUsIGRqbUBnbnUuYWkubWl0LmVkdS4KKyAgIENvcHlyaWdodCAoQykgOTEsIDE5OTUtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTW9kaWZpZWQgZm9yIGJ1c3lib3ggYmFzZWQgb24gY29yZXV0aWxzIHYgNS4wCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgR2xlbm4gTWNHcmF0aAorCisgICBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorKi8KKworLy91c2FnZTojZGVmaW5lIGZvbGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYnNdIFstdyBXSURUSF0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGZvbGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJXcmFwIGlucHV0IGxpbmVzIGluIGVhY2ggRklMRSAob3Igc3RkaW4pLCB3cml0aW5nIHRvIHN0ZG91dFxuIgorLy91c2FnZTogICAgICJcbgktYglDb3VudCBieXRlcyByYXRoZXIgdGhhbiBjb2x1bW5zIgorLy91c2FnZTogICAgICJcbgktcwlCcmVhayBhdCBzcGFjZXMiCisvL3VzYWdlOiAgICAgIlxuCS13CVVzZSBXSURUSCBjb2x1bW5zIGluc3RlYWQgb2YgODAiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLyogTXVzdCBtYXRjaCBnZXRvcHQzMiBjYWxsICovCisjZGVmaW5lIEZMQUdfQ09VTlRfQllURVMgICAgICAgIDEKKyNkZWZpbmUgRkxBR19CUkVBS19TUEFDRVMgICAgICAgMgorI2RlZmluZSBGTEFHX1dJRFRIICAgICAgICAgICAgICA0CisKKy8qIEFzc3VtaW5nIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBDT0xVTU4sIHJldHVybiB0aGUgY29sdW1uIHRoYXQKKyAgIHByaW50aW5nIEMgd2lsbCBtb3ZlIHRoZSBjdXJzb3IgdG8uCisgICBUaGUgZmlyc3QgY29sdW1uIGlzIDAuICovCitzdGF0aWMgaW50IGFkanVzdF9jb2x1bW4odW5zaWduZWQgY29sdW1uLCBjaGFyIGMpCit7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX0NPVU5UX0JZVEVTKQorCQlyZXR1cm4gKytjb2x1bW47CisKKwlpZiAoYyA9PSAnXHQnKQorCQlyZXR1cm4gY29sdW1uICsgOCAtIGNvbHVtbiAlIDg7CisKKwlpZiAoYyA9PSAnXGInKSB7CisJCWlmICgoaW50KS0tY29sdW1uIDwgMCkKKwkJCWNvbHVtbiA9IDA7CisJfQorCWVsc2UgaWYgKGMgPT0gJ1xyJykKKwkJY29sdW1uID0gMDsKKwllbHNlIHsgLyoganVzdCBhIHByaW50YWJsZSBjaGFyICovCisJCWlmICh1bmljb2RlX3N0YXR1cyAhPSBVTklDT0RFX09OIC8qIGV2ZXJ5IGJ5dGUgaXMgYSBuZXcgY2hhciAqLworCQkgfHwgKGMgJiAweGMwKSAhPSAweDgwIC8qIGl0IGlzbid0IGEgMm5kKyBieXRlIG9mIGEgVW5pY29kZSBjaGFyICovCisJCSkgeworCQkJY29sdW1uKys7CisJCX0KKwl9CisJcmV0dXJuIGNvbHVtbjsKK30KKworLyogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIHdyaXRlIE5VTHMsIHVubGlrZSBmcHV0cyBldGMuICovCitzdGF0aWMgdm9pZCB3cml0ZTJzdGRvdXQoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaXplKQoreworCWZ3cml0ZShidWYsIDEsIHNpemUsIHN0ZG91dCk7Cit9CisKK2ludCBmb2xkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmb2xkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpsaW5lX291dCA9IE5VTEw7CisJY29uc3QgY2hhciAqd19vcHQgPSAiODAiOworCXVuc2lnbmVkIHdpZHRoOworCXNtYWxsaW50IGV4aXRjb2RlID0gRVhJVF9TVUNDRVNTOworCisJaW5pdF91bmljb2RlKCk7CisKKwlpZiAoRU5BQkxFX0lOQ0xVREVfU1VTdjIpIHsKKwkJLyogVHVybiBhbnkgbnVtZXJpYyBvcHRpb25zIGludG8gLXcgb3B0aW9ucy4gICovCisJCWludCBpOworCQlmb3IgKGkgPSAxOyBhcmd2W2ldOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKmEgPSBhcmd2W2ldOworCQkJaWYgKCphID09ICctJykgeworCQkJCWErKzsKKwkJCQlpZiAoKmEgPT0gJy0nICYmICFhWzFdKSAvKiAiLS0iICovCisJCQkJCWJyZWFrOworCQkJCWlmIChpc2RpZ2l0KCphKSkKKwkJCQkJYXJndltpXSA9IHhhc3ByaW50ZigiLXclcyIsIGEpOworCQkJfQorCQl9CisJfQorCisJZ2V0b3B0MzIoYXJndiwgImJzdzoiLCAmd19vcHQpOworCXdpZHRoID0geGF0b3VfcmFuZ2Uod19vcHQsIDEsIDEwMDAwKTsKKworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciopIi0iOworCisJZG8geworCQlGSUxFICppc3RyZWFtID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCWludCBjOworCQl1bnNpZ25lZCBjb2x1bW4gPSAwOyAgICAgLyogU2NyZWVuIGNvbHVtbiB3aGVyZSBuZXh0IGNoYXIgd2lsbCBnbyAqLworCQl1bnNpZ25lZCBvZmZzZXRfb3V0ID0gMDsgLyogSW5kZXggaW4gJ2xpbmVfb3V0JyBmb3IgbmV4dCBjaGFyICovCisKKwkJaWYgKGlzdHJlYW0gPT0gTlVMTCkgeworCQkJZXhpdGNvZGUgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCXdoaWxlICgoYyA9IGdldGMoaXN0cmVhbSkpICE9IEVPRikgeworCQkJLyogV2UgZ3JvdyBsaW5lX291dCBpbiBjaHVua3Mgb2YgMHgxMDAwIGJ5dGVzICovCisJCQlpZiAoKG9mZnNldF9vdXQgJiAweGZmZikgPT0gMCkgeworCQkJCWxpbmVfb3V0ID0geHJlYWxsb2MobGluZV9vdXQsIG9mZnNldF9vdXQgKyAweDEwMDApOworCQkJfQorIHJlc2NhbjoKKwkJCWxpbmVfb3V0W29mZnNldF9vdXRdID0gYzsKKwkJCWlmIChjID09ICdcbicpIHsKKwkJCQl3cml0ZTJzdGRvdXQobGluZV9vdXQsIG9mZnNldF9vdXQgKyAxKTsKKwkJCQljb2x1bW4gPSBvZmZzZXRfb3V0ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNvbHVtbiA9IGFkanVzdF9jb2x1bW4oY29sdW1uLCBjKTsKKwkJCWlmIChjb2x1bW4gPD0gd2lkdGggfHwgb2Zmc2V0X291dCA9PSAwKSB7CisJCQkJLyogb2Zmc2V0X291dCA9PSAwIGNhc2UgaGFwcGVucworCQkJCSAqIHdpdGggc21hbGwgd2lkdGggKHNheSwgMSkgYW5kIHRhYnMuCisJCQkJICogVGhlIHZlcnkgZmlyc3QgdGFiIGFscmVhZHkgZ29lcyB0byBjb2x1bW4gOCwKKwkJCQkgKiBidXQgd2UgbXVzdCBub3Qgd3JhcCBpdCAqLworCQkJCW9mZnNldF9vdXQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogVGhpcyBjaGFyYWN0ZXIgd291bGQgbWFrZSB0aGUgbGluZSB0b28gbG9uZy4KKwkJCSAqIFByaW50IHRoZSBsaW5lIHBsdXMgYSBuZXdsaW5lLCBhbmQgbWFrZSB0aGlzIGNoYXJhY3RlcgorCQkJICogc3RhcnQgdGhlIG5leHQgbGluZSAqLworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX0JSRUFLX1NQQUNFUykgeworCQkJCXVuc2lnbmVkIGk7CisJCQkJdW5zaWduZWQgbG9naWNhbF9lbmQ7CisKKwkJCQkvKiBMb29rIGZvciB0aGUgbGFzdCBibGFuay4gKi8KKwkJCQlmb3IgKGxvZ2ljYWxfZW5kID0gb2Zmc2V0X291dCAtIDE7IChpbnQpbG9naWNhbF9lbmQgPj0gMDsgbG9naWNhbF9lbmQtLSkgeworCQkJCQlpZiAoIWlzYmxhbmsobGluZV9vdXRbbG9naWNhbF9lbmRdKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIEZvdW5kIGEgc3BhY2Ugb3IgdGFiLgorCQkJCQkgKiBPdXRwdXQgdXAgdG8gYW5kIGluY2x1ZGluZyBpdCwgYW5kIHN0YXJ0IGEgbmV3IGxpbmUgKi8KKwkJCQkJbG9naWNhbF9lbmQrKzsKKwkJCQkJLypsaW5lX291dFtsb2dpY2FsX2VuZF0gPSAnXG4nOyAtIE5PISB0aGlzIG51a2VzIG9uZSBidWZmZXJlZCBjaGFyYWN0ZXIgKi8KKwkJCQkJd3JpdGUyc3Rkb3V0KGxpbmVfb3V0LCBsb2dpY2FsX2VuZCk7CisJCQkJCXB1dGNoYXIoJ1xuJyk7CisJCQkJCS8qIE1vdmUgdGhlIHJlbWFpbmRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUuCisJCQkJCSAqIFRoZSBhcmVhcyBiZWluZyBjb3BpZWQgaGVyZSBtaWdodCBvdmVybGFwLiAqLworCQkJCQltZW1tb3ZlKGxpbmVfb3V0LCBsaW5lX291dCArIGxvZ2ljYWxfZW5kLCBvZmZzZXRfb3V0IC0gbG9naWNhbF9lbmQpOworCQkJCQlvZmZzZXRfb3V0IC09IGxvZ2ljYWxfZW5kOworCQkJCQlmb3IgKGNvbHVtbiA9IGkgPSAwOyBpIDwgb2Zmc2V0X291dDsgaSsrKSB7CisJCQkJCQljb2x1bW4gPSBhZGp1c3RfY29sdW1uKGNvbHVtbiwgbGluZV9vdXRbaV0pOworCQkJCQl9CisJCQkJCWdvdG8gcmVzY2FuOworCQkJCX0KKwkJCQkvKiBObyBibGFuayBmb3VuZCwgd3JhcCB3aWxsIHNwbGl0IHRoZSBvdmVybG9uZyB3b3JkICovCisJCQl9CisJCQkvKiBPdXRwdXQgd2hhdCB3ZSBhY2N1bXVsYXRlZCB1cCB0byBub3csIGFuZCBzdGFydCBhIG5ldyBsaW5lICovCisJCQlsaW5lX291dFtvZmZzZXRfb3V0XSA9ICdcbic7CisJCQl3cml0ZTJzdGRvdXQobGluZV9vdXQsIG9mZnNldF9vdXQgKyAxKTsKKwkJCWNvbHVtbiA9IG9mZnNldF9vdXQgPSAwOworCQkJZ290byByZXNjYW47CisJCX0gLyogd2hpbGUgKG5vdCBFT0YpICovCisKKwkJaWYgKG9mZnNldF9vdXQpIHsKKwkJCXdyaXRlMnN0ZG91dChsaW5lX291dCwgb2Zmc2V0X291dCk7CisJCX0KKworCQlpZiAoZmNsb3NlX2lmX25vdF9zdGRpbihpc3RyZWFtKSkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmFyZ3YpOworCQkJZXhpdGNvZGUgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwl9IHdoaWxlICgqKythcmd2KTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoZXhpdGNvZGUpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2ZzeW5jLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvZnN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTJhNDFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2ZzeW5jLmMKQEAgLTAsMCArMSw1MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBmc3luYyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmc3luY190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kXSBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIGZzeW5jX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiV3JpdGUgZmlsZXMnIGJ1ZmZlcmVkIGJsb2NrcyB0byBkaXNrXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kCUF2b2lkIHN5bmNpbmcgbWV0YWRhdGEiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmbmRlZiBPX05PQVRJTUUKKyMgZGVmaW5lIE9fTk9BVElNRSAwCisjZW5kaWYKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGZzeW5jX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmc3luY19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHN0YXR1czsKKwlpbnQgb3B0czsKKworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZCIpOyAvKiBmZGF0YXN5bmMgKi8KKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJZG8geworCQlpbnQgZmQgPSBvcGVuX29yX3dhcm4oKmFyZ3YsIE9fTk9BVElNRSB8IE9fTk9DVFRZIHwgT19SRE9OTFkpOworCisJCWlmIChmZCA9PSAtMSkgeworCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKChvcHRzID8gZmRhdGFzeW5jKGZkKSA6IGZzeW5jKGZkKSkpIHsKKwkJCS8vc3RhdHVzID0gRVhJVF9GQUlMVVJFOyAtIGRvIHdlIHdhbnQgdGhpcz8KKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJfQorCQljbG9zZShmZCk7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2hlYWQuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9oZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0NTEyNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9oZWFkLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGhlYWQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogQkJfQVVESVQgR05VIGNvbXBhdGlibGUgLWMsIC1xLCBhbmQgLXYgb3B0aW9ucyBpbiAnZmFuY3knIGNvbmZpZ3VyYXRpb24uICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2hlYWQuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgaGVhZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBoZWFkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgZmlyc3QgMTAgbGluZXMgb2YgZWFjaCBGSUxFIChvciBzdGRpbikgdG8gc3Rkb3V0LlxuIgorLy91c2FnZTogICAgICAgIldpdGggbW9yZSB0aGFuIG9uZSBGSUxFLCBwcmVjZWRlIGVhY2ggd2l0aCBhIGZpbGVuYW1lIGhlYWRlci5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTltrYm1dCVByaW50IGZpcnN0IE4gbGluZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX0hFQUQoCisvL3VzYWdlOiAgICAgIlxuCS1jIE5ba2JtXQlQcmludCBmaXJzdCBOIGJ5dGVzIgorLy91c2FnZTogICAgICJcbgktcQkJTmV2ZXIgcHJpbnQgaGVhZGVycyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCUFsd2F5cyBwcmludCBoZWFkZXJzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5OIG1heSBiZSBzdWZmaXhlZCBieSBrICh4MTAyNCksIGIgKHg1MTIpLCBvciBtICh4MTAyNF4yKS4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGhlYWRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgaGVhZCAtbiAyIC9ldGMvcGFzc3dkXG4iCisvL3VzYWdlOiAgICAgICAicm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaFxuIgorLy91c2FnZTogICAgICAgImRhZW1vbjp4OjE6MTpkYWVtb246L3Vzci9zYmluOi9iaW4vc2hcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGhlYWRfb3B0c1tdIEFMSUdOMSA9CisJIm46IgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZBTkNZX0hFQUQKKwkiYzpxdiIKKyNlbmRpZgorCTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBoZWFkX3N1ZmZpeGVzW10gPSB7CisJeyAiYiIsIDUxMiB9LAorCXsgImsiLCAxMDI0IH0sCisJeyAibSIsIDEwMjQqMTAyNCB9LAorCXsgIiIsIDAgfQorfTsKKworI2RlZmluZSBoZWFkZXJfZm10X3N0ciAiXG49PT4gJXMgPD09XG4iCisKK2ludCBoZWFkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBoZWFkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgY291bnQgPSAxMDsKKwl1bnNpZ25lZCBsb25nIGk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCWludCBjb3VudF9ieXRlcyA9IDA7CisJaW50IGhlYWRlcl90aHJlc2hob2xkID0gMTsKKyNlbmRpZgorCUZJTEUgKmZwOworCWNvbnN0IGNoYXIgKmZtdDsKKwljaGFyICpwOworCWludCBvcHQ7CisJaW50IGM7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKworI2lmIEVOQUJMRV9JTkNMVURFX1NVU3YyIHx8IEVOQUJMRV9GRUFUVVJFX0ZBTkNZX0hFQUQKKwkvKiBBbGxvdyBsZWdhY3kgc3ludGF4IG9mIGFuIGluaXRpYWwgbnVtZXJpYyBvcHRpb24gd2l0aG91dCAtbi4gKi8KKwlpZiAoYXJndlsxXSAmJiBhcmd2WzFdWzBdID09ICctJworCSAmJiBpc2RpZ2l0KGFyZ3ZbMV1bMV0pCisJKSB7CisJCS0tYXJnYzsKKwkJKythcmd2OworCQlwID0gKCphcmd2KSArIDE7CisJCWdvdG8gR0VUX0NPVU5UOworCX0KKyNlbmRpZgorCisJLyogTm8gc2l6ZSBiZW5lZml0IGluIGNvbnZlcnRpbmcgdGhpcyB0byBnZXRvcHQzMiAqLworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIGhlYWRfb3B0cykpID4gMCkgeworCQlzd2l0Y2ggKG9wdCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0ZBTkNZX0hFQUQKKwkJY2FzZSAncSc6CisJCQloZWFkZXJfdGhyZXNoaG9sZCA9IElOVF9NQVg7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQloZWFkZXJfdGhyZXNoaG9sZCA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJY291bnRfYnl0ZXMgPSAxOworCQkJLyogZmFsbCB0aHJvdWdoICovCisjZW5kaWYKKwkJY2FzZSAnbic6CisJCQlwID0gb3B0YXJnOworI2lmIEVOQUJMRV9JTkNMVURFX1NVU3YyIHx8IEVOQUJMRV9GRUFUVVJFX0ZBTkNZX0hFQUQKKyBHRVRfQ09VTlQ6CisjZW5kaWYKKwkJCWNvdW50ID0geGF0b3VsX3NmeChwLCBoZWFkX3N1ZmZpeGVzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCEqYXJndikKKwkJKi0tYXJndiA9IChjaGFyKikiLSI7CisKKwlmbXQgPSBoZWFkZXJfZm10X3N0ciArIDE7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCWlmIChhcmdjIDw9IGhlYWRlcl90aHJlc2hob2xkKSB7CisJCWhlYWRlcl90aHJlc2hob2xkID0gMDsKKwl9CisjZWxzZQorCWlmIChhcmdjIDw9IDEpIHsKKwkJZm10ICs9IDExOyAvKiAiIiAqLworCX0KKwkvKiBOb3cgZGVmaW5lIHNvbWUgdGhpbmdzIGhlcmUgdG8gYXZvaWQgI2lmZGVmcyBpbiB0aGUgY29kZSBiZWxvdy4KKwkgKiBUaGVzZSBzaG91bGQgb3B0aW1pemUgb3V0IG9mIHRoZSBpZiBjb25kaXRpb25zIGJlbG93LiAqLworI2RlZmluZSBoZWFkZXJfdGhyZXNoaG9sZCAgIDEKKyNkZWZpbmUgY291bnRfYnl0ZXMgICAgICAgICAwCisjZW5kaWYKKworCWRvIHsKKwkJZnAgPSBmb3Blbl9vcl93YXJuX3N0ZGluKCphcmd2KTsKKwkJaWYgKGZwKSB7CisJCQlpZiAoZnAgPT0gc3RkaW4pIHsKKwkJCQkqYXJndiA9IChjaGFyICopIGJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwkJCX0KKwkJCWlmIChoZWFkZXJfdGhyZXNoaG9sZCkgeworCQkJCXByaW50ZihmbXQsICphcmd2KTsKKwkJCX0KKwkJCWkgPSBjb3VudDsKKwkJCXdoaWxlIChpICYmICgoYyA9IGdldGMoZnApKSAhPSBFT0YpKSB7CisJCQkJaWYgKGNvdW50X2J5dGVzIHx8IChjID09ICdcbicpKSB7CisJCQkJCS0taTsKKwkJCQl9CisJCQkJcHV0Y2hhcihjKTsKKwkJCX0KKwkJCWlmIChmY2xvc2VfaWZfbm90X3N0ZGluKGZwKSkgeworCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQl9CisJCQlkaWVfaWZfZmVycm9yX3N0ZG91dCgpOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQl9CisJCWZtdCA9IGhlYWRlcl9mbXRfc3RyOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2hvc3RpZC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2hvc3RpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDA5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvaG9zdGlkLmMKQEAgLTAsMCArMSwzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBob3N0aWQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEVkd2FyZCBCZXR0cyA8ZWR3YXJkQGRlYmlhbi5vcmc+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BIC0tIE1hdGNoZXMgR05VIGJlaGF2aW9yLiAqLworCisvL3VzYWdlOiNkZWZpbmUgaG9zdGlkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgaG9zdGlkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgb3V0IGEgdW5pcXVlIDMyLWJpdCBpZGVudGlmaWVyIGZvciB0aGUgbWFjaGluZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBob3N0aWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGhvc3RpZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWlmIChhcmd2WzFdKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlwcmludGYoIiVseFxuIiwgZ2V0aG9zdGlkKCkpOworCisJcmV0dXJuIGZmbHVzaF9hbGwoKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9pZC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5ZDI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9pZC5jCkBAIC0wLDAgKzEsMjY5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGlkIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudC4gKi8KKy8qIEhhY2tlZCBieSBUaXRvIFJhZ3VzYSAoQykgMjAwNCB0byBoYW5kbGUgdXNlcm5hbWVzIG9mIHdoYXRldmVyCisgKiBsZW5ndGggYW5kIHRvIGJlIG1vcmUgc2ltaWxhciB0byBHTlUgaWQuCisgKiAtWiBvcHRpb24gc3VwcG9ydDogYnkgWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKiBBZGRlZCAtRyBvcHRpb24gVGl0byBSYWd1c2EgKEMpIDIwMDggZm9yIFNVU3YzLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBJRAorLy9jb25maWc6CWJvb2wgImlkIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGlkIGRpc3BsYXlzIHRoZSBjdXJyZW50IHVzZXIgYW5kIGdyb3VwIElEIG5hbWVzLgorCisvL2NvbmZpZzpjb25maWcgR1JPVVBTCisvL2NvbmZpZzoJYm9vbCAiZ3JvdXBzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFByaW50IHRoZSBncm91cCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggY3VycmVudCB1c2VyIGlkLgorCisvL2tidWlsZDpsaWItJChDT05GSUdfR1JPVVBTKSArPSBpZC5vCisvL2tidWlsZDpsaWItJChDT05GSUdfSUQpICAgICArPSBpZC5vCisKKy8vYXBwbGV0OklGX0dST1VQUyhBUFBMRVRfTk9FWEVDKGdyb3VwcywgaWQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGdyb3VwcykpCisvL2FwcGxldDpJRl9JRCggICAgQVBQTEVUX05PRVhFQyhpZCwgICAgIGlkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBpZCAgICApKQorCisvL3VzYWdlOiNkZWZpbmUgaWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbVVNFUl0iCisvL3VzYWdlOiNkZWZpbmUgaWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBpbmZvcm1hdGlvbiBhYm91dCBVU0VSIG9yIHRoZSBjdXJyZW50IHVzZXJcbiIKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgIlxuCS1aCVNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS11CVVzZXIgSUQiCisvL3VzYWdlOiAgICAgIlxuCS1nCUdyb3VwIElEIgorLy91c2FnZTogICAgICJcbgktRwlTdXBwbGVtZW50YXJ5IGdyb3VwIElEcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpbnQgbmFtZXMgaW5zdGVhZCBvZiBudW1iZXJzIgorLy91c2FnZTogICAgICJcbgktcglQcmludCByZWFsIElEIGluc3RlYWQgb2YgZWZmZWN0aXZlIElEIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBpZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBpZFxuIgorLy91c2FnZTogICAgICAgInVpZD0xMDAwKGFuZGVyc2VuKSBnaWQ9MTAwMChhbmRlcnNlbilcbiIKKworLy91c2FnZTojZGVmaW5lIGdyb3Vwc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW1VTRVJdIgorLy91c2FnZTojZGVmaW5lIGdyb3Vwc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBncm91cCBtZW1iZXJzaGlwcyBvZiBVU0VSIG9yIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBncm91cHNfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZ3JvdXBzXG4iCisvL3VzYWdlOiAgICAgICAiYW5kZXJzZW4gbHAgZGlhbG91dCBjZHJvbSBmbG9wcHlcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKyNpZiAhRU5BQkxFX1VTRV9CQl9QV0RfR1JQCisjaWYgZGVmaW5lZChfX1VDTElCQ19NQUpPUl9fKSAmJiAoX19VQ0xJQkNfTUFKT1JfXyA9PSAwKQorI2lmIChfX1VDTElCQ19NSU5PUl9fIDwgOSkgfHwgKF9fVUNMSUJDX01JTk9SX18gPT0gOSAmJiAgX19VQ0xJQkNfU1VCTEVWRUxfXyA8IDMwKQorI2Vycm9yICJTb3JyeSwgeW91IG5lZWQgYXQgbGVhc3QgdUNsaWJjIHZlcnNpb24gMC45LjMwIGZvciBpZCBhcHBsZXQgdG8gYnVpbGQiCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKK2VudW0geworCVBSSU5UX1JFQUwgICAgICA9ICgxIDw8IDApLAorCU5BTUVfTk9UX05VTUJFUiA9ICgxIDw8IDEpLAorCUpVU1RfVVNFUiAgICAgICA9ICgxIDw8IDIpLAorCUpVU1RfR1JPVVAgICAgICA9ICgxIDw8IDMpLAorCUpVU1RfQUxMX0dST1VQUyA9ICgxIDw8IDQpLAorI2lmIEVOQUJMRV9TRUxJTlVYCisJSlVTVF9DT05URVhUICAgID0gKDEgPDwgNSksCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgcHJpbnRfY29tbW9uKHVuc2lnbmVkIGlkLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaWYgKHByZWZpeCkgeworCQlwcmludGYoIiVzIiwgcHJlZml4KTsKKwl9CisJaWYgKCEob3B0aW9uX21hc2szMiAmIE5BTUVfTk9UX05VTUJFUikgfHwgIW5hbWUpIHsKKwkJcHJpbnRmKCIldSIsIGlkKTsKKwl9CisJaWYgKCFvcHRpb25fbWFzazMyIHx8IChvcHRpb25fbWFzazMyICYgTkFNRV9OT1RfTlVNQkVSKSkgeworCQlpZiAobmFtZSkgeworCQkJcHJpbnRmKG9wdGlvbl9tYXNrMzIgPyAiJXMiIDogIiglcykiLCBuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERvbid0IHNldCBlcnJvciBzdGF0dXMgZmxhZyBpbiBkZWZhdWx0IG1vZGUgKi8KKwkJCWlmIChvcHRpb25fbWFzazMyKSB7CisJCQkJaWYgKEVOQUJMRV9ERVNLVE9QKQorCQkJCQliYl9lcnJvcl9tc2coInVua25vd24gSUQgJXUiLCBpZCk7CisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHByaW50X2dyb3VwKGdpZF90IGlkLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcmV0dXJuIHByaW50X2NvbW1vbihpZCwgZ2lkMmdyb3VwKGlkKSwgcHJlZml4KTsKK30KKworc3RhdGljIGludCBwcmludF91c2VyKHVpZF90IGlkLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcmV0dXJuIHByaW50X2NvbW1vbihpZCwgdWlkMnVuYW1lKGlkKSwgcHJlZml4KTsKK30KKworLyogT24gZXJyb3Igc2V0ICpuIDwgMCBhbmQgcmV0dXJuID49IDAKKyAqIElmICpuIGlzIHRvbyBzbWFsbCwgdXBkYXRlIGl0IGFuZCByZXR1cm4gPCAwCisgKiAob2sgdG8gdHJhc2ggZ3JvdXBzW10gaW4gYm90aCBjYXNlcykKKyAqIE90aGVyd2lzZSBmaWxsIGluIGdyb3Vwc1tdIGFuZCByZXR1cm4gPj0gMAorICovCitzdGF0aWMgaW50IGdldF9ncm91cHMoY29uc3QgY2hhciAqdXNlcm5hbWUsIGdpZF90IHJnaWQsIGdpZF90ICpncm91cHMsIGludCAqbikKK3sKKwlpbnQgbTsKKworCWlmICh1c2VybmFtZSkgeworCQkvKiBJZiB0aGUgdXNlciBpcyBhIG1lbWJlciBvZiBtb3JlIHRoYW4KKwkJICogKm4gZ3JvdXBzLCB0aGVuIC0xIGlzIHJldHVybmVkLiBPdGhlcndpc2UgPj0gMC4KKwkJICogKGFuZCBubyBkZWZpbmVkIHdheSBvZiBkZXRlY3RpbmcgZXJyb3JzPyEpICovCisJCW0gPSBnZXRncm91cGxpc3QodXNlcm5hbWUsIHJnaWQsIGdyb3Vwcywgbik7CisJCS8qIEkgZ3Vlc3MgKm4gPCAwIG1pZ2h0IGluZGljYXRlIGVycm9yLiBBbnl3YXksCisJCSAqIG1hbGxvYydpbmcgLTEgYnl0ZXMgd29uJ3QgYmUgZ29vZCwgc286ICovCisJCWlmICgqbiA8IDApCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIG07CisJfQorCisJKm4gPSBnZXRncm91cHMoKm4sIGdyb3Vwcyk7CisJaWYgKCpuID49IDApCisJCXJldHVybiAqbjsKKwkvKiBFcnJvciAqLworCWlmIChlcnJubyA9PSBFSU5WQUwpIC8qICpuIGlzIHRvbyBzbWFsbD8gKi8KKwkJKm4gPSBnZXRncm91cHMoMCwgZ3JvdXBzKTsgLyogZ2V0IG5lZWRlZCAqbiAqLworCS8qIGlmICpuID49IDAsIHJldHVybiAtMSAoZ290IG5ldyAqbiksIGVsc2UgcmV0dXJuIDAgKGVycm9yKTogKi8KKwlyZXR1cm4gLSgqbiA+PSAwKTsKK30KKworaW50IGlkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdWlkX3QgcnVpZDsKKwlnaWRfdCByZ2lkOworCXVpZF90IGV1aWQ7CisJZ2lkX3QgZWdpZDsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGk7CisJaW50IHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwljb25zdCBjaGFyICpwcmVmaXg7CisJY29uc3QgY2hhciAqdXNlcm5hbWU7CisjaWYgRU5BQkxFX1NFTElOVVgKKwlzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQgPSBOVUxMOworI2VuZGlmCisKKwlpZiAoRU5BQkxFX0dST1VQUyAmJiAoIUVOQUJMRV9JRCB8fCBhcHBsZXRfbmFtZVswXSA9PSAnZycpKSB7CisJCS8qIFRPRE86IGNvcmV1dGlscyBncm91cHMgcHJlcGVuZCAiVVNFUiA6ICIgcHJlZml4LAorCQkgKiBhbmQgYWNjZXB0IG1hbnkgdXNlcm5hbWVzLiBFeGFtcGxlOgorCQkgKiAjIGdyb3VwcyByb290IHJvb3QKKwkJICogcm9vdCA6IHJvb3QKKwkJICogcm9vdCA6IHJvb3QKKwkJICovCisJCW9wdCA9IG9wdGlvbl9tYXNrMzIgPSBnZXRvcHQzMihhcmd2LCAiIikgfCBKVVNUX0FMTF9HUk9VUFMgfCBOQU1FX05PVF9OVU1CRVI7CisJfSBlbHNlIHsKKwkJLyogRG9uJ3QgYWxsb3cgLW4gLXIgLW5yIC11ZyAtcnVnIC1udWcgLXJudWcgLXVaIC1nWiAtR1oqLworCQkvKiBEb24ndCBhbGxvdyBtb3JlIHRoYW4gb25lIHVzZXJuYW1lICovCisJCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xOnUtLWc6Zy0tdTpHLS11OnUtLUc6Zy0tRzpHLS1nOnI/dWdHOm4/dWdHIgorCQkJIElGX1NFTElOVVgoIjp1LS1aOlotLXU6Zy0tWjpaLS1nOkctLVo6Wi0tRyIpOworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAicm51Z0ciIElGX1NFTElOVVgoIloiKSk7CisJfQorCisJdXNlcm5hbWUgPSBhcmd2W29wdGluZF07CisJaWYgKHVzZXJuYW1lKSB7CisJCXN0cnVjdCBwYXNzd2QgKnAgPSB4Z2V0cHduYW0odXNlcm5hbWUpOworCQlldWlkID0gcnVpZCA9IHAtPnB3X3VpZDsKKwkJZWdpZCA9IHJnaWQgPSBwLT5wd19naWQ7CisJfSBlbHNlIHsKKwkJZWdpZCA9IGdldGVnaWQoKTsKKwkJcmdpZCA9IGdldGdpZCgpOworCQlldWlkID0gZ2V0ZXVpZCgpOworCQlydWlkID0gZ2V0dWlkKCk7CisJfQorCS8qIEpVU1RfQUxMX0dST1VQUyBpZ25vcmVzIC1yIFBSSU5UX1JFQUwgZmxhZyBldmVuIGlmIG1hbiBwYWdlIGZvciAqLworCS8qIGlkIHNheXM6IHByaW50IHRoZSByZWFsIElEIGluc3RlYWQgb2YgdGhlIGVmZmVjdGl2ZSBJRCwgd2l0aCAtdWdHICovCisJLyogaW4gZmFjdCBpbiB0aGlzIGNhc2UgZWdpZCBpcyBhbHdheXMgcHJpbnRlZCBpZiBlZ2lkICE9IHJnaWQgKi8KKwlpZiAoIW9wdCB8fCAob3B0ICYgSlVTVF9BTExfR1JPVVBTKSkgeworCQlnaWRfdCAqZ3JvdXBzOworCQlpbnQgbjsKKworCQlpZiAoIW9wdCkgeworCQkJLyogRGVmYXVsdCBNb2RlICovCisJCQlzdGF0dXMgfD0gcHJpbnRfdXNlcihydWlkLCAidWlkPSIpOworCQkJc3RhdHVzIHw9IHByaW50X2dyb3VwKHJnaWQsICIgZ2lkPSIpOworCQkJaWYgKGV1aWQgIT0gcnVpZCkKKwkJCQlzdGF0dXMgfD0gcHJpbnRfdXNlcihldWlkLCAiIGV1aWQ9Iik7CisJCQlpZiAoZWdpZCAhPSByZ2lkKQorCQkJCXN0YXR1cyB8PSBwcmludF9ncm91cChlZ2lkLCAiIGVnaWQ9Iik7CisJCX0gZWxzZSB7CisJCQkvKiBKVVNUX0FMTF9HUk9VUFMgKi8KKwkJCXN0YXR1cyB8PSBwcmludF9ncm91cChyZ2lkLCBOVUxMKTsKKwkJCWlmIChlZ2lkICE9IHJnaWQpCisJCQkJc3RhdHVzIHw9IHByaW50X2dyb3VwKGVnaWQsICIgIik7CisJCX0KKwkJLyogV2UgYXJlIHN1cHBseWluZyBsYXJnaXNoIGJ1ZmZlciwgdHJ5aW5nCisJCSAqIHRvIG5vdCBydW4gZ2V0X2dyb3VwcygpIHR3aWNlLiBUaGF0IG1pZ2h0IGJlIHNsb3cKKwkJICogKCJ1c2VyIGRhdGFiYXNlIGluIHJlbW90ZSBTUUwgc2VydmVyIiBjYXNlKSAqLworCQlncm91cHMgPSB4bWFsbG9jKDY0ICogc2l6ZW9mKGdyb3Vwc1swXSkpOworCQluID0gNjQ7CisJCWlmIChnZXRfZ3JvdXBzKHVzZXJuYW1lLCByZ2lkLCBncm91cHMsICZuKSA8IDApIHsKKwkJCS8qIE5lZWQgYmlnZ2VyIGJ1ZmZlciBhZnRlciBhbGwgKi8KKwkJCWdyb3VwcyA9IHhyZWFsbG9jKGdyb3VwcywgbiAqIHNpemVvZihncm91cHNbMF0pKTsKKwkJCWdldF9ncm91cHModXNlcm5hbWUsIHJnaWQsIGdyb3VwcywgJm4pOworCQl9CisJCWlmIChuID4gMCkgeworCQkJLyogUHJpbnQgdGhlIGxpc3QgKi8KKwkJCXByZWZpeCA9ICIgZ3JvdXBzPSI7CisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJaWYgKG9wdCAmJiAoZ3JvdXBzW2ldID09IHJnaWQgfHwgZ3JvdXBzW2ldID09IGVnaWQpKQorCQkJCQljb250aW51ZTsKKwkJCQlzdGF0dXMgfD0gcHJpbnRfZ3JvdXAoZ3JvdXBzW2ldLCBvcHQgPyAiICIgOiBwcmVmaXgpOworCQkJCXByZWZpeCA9ICIsIjsKKwkJCX0KKwkJfSBlbHNlIGlmIChuIDwgMCkgeyAvKiBlcnJvciBpbiBnZXRfZ3JvdXBzKCkgKi8KKwkJCWlmIChFTkFCTEVfREVTS1RPUCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IGdyb3VwcyIpOworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGdyb3Vwcyk7CisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKGlzX3NlbGludXhfZW5hYmxlZCgpKSB7CisJCQlpZiAoZ2V0Y29uKCZzY29udGV4dCkgPT0gMCkKKwkJCQlwcmludGYoIiBjb250ZXh0PSVzIiwgc2NvbnRleHQpOworCQl9CisjZW5kaWYKKwl9IGVsc2UgaWYgKG9wdCAmIFBSSU5UX1JFQUwpIHsKKwkJZXVpZCA9IHJ1aWQ7CisJCWVnaWQgPSByZ2lkOworCX0KKworCWlmIChvcHQgJiBKVVNUX1VTRVIpCisJCXN0YXR1cyB8PSBwcmludF91c2VyKGV1aWQsIE5VTEwpOworCWVsc2UgaWYgKG9wdCAmIEpVU1RfR1JPVVApCisJCXN0YXR1cyB8PSBwcmludF9ncm91cChlZ2lkLCBOVUxMKTsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWVsc2UgaWYgKG9wdCAmIEpVU1RfQ09OVEVYVCkgeworCQlzZWxpbnV4X29yX2RpZSgpOworCQlpZiAodXNlcm5hbWUgfHwgZ2V0Y29uKCZzY29udGV4dCkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgcHJvY2VzcyBjb250ZXh0JXMiLAorCQkJCXVzZXJuYW1lID8gIiBmb3IgYSBkaWZmZXJlbnQgdXNlciIgOiAiIik7CisJCX0KKwkJZnB1dHMoc2NvbnRleHQsIHN0ZG91dCk7CisJfQorCS8qIGZyZWVjb24oTlVMTCkgc2VlbXMgdG8gYmUgaGFybWxlc3MgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWVjb24oc2NvbnRleHQpOworI2VuZGlmCisJYmJfcHV0Y2hhcignXG4nKTsKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvaWRfdGVzdC5zaCBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9pZF90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkNjVmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvaWRfdGVzdC5zaApAQCAtMCwwICsxLDI0NCBAQAorIyEvYmluL2Jhc2gKKyMgVGVzdCBzY3JpcHQgZm9yIGJ1c3lib3ggaWQgdnMuIGNvcmV1dGlscyBpZC4KKyMgTmVlZHMgcm9vdCBwcml2aWxlZ2VzIGZvciBzb21lIHRlc3RzLgorCitjcCAvdXNyL2Jpbi9pZCAuCitCVVNZQk9YPS4vYnVzeWJveAorSUQ9Li9pZAorTElTVD1gYXdrIC1GOiAneyBwcmludGYgIiVzXG4iLCAkMSB9JyAvZXRjL3Bhc3N3ZGAKK0ZMQUdfVVNFUl9FWElTVFM9Im5vIgorVEVTVF9VU0VSPSJmNTgzY2E4ODRjMWQ5MzQ1OGZiNjFlZDEzN2ZmNDRmNiIKKworZWNobyAidGVzdCAxOiBpZCBbb3B0aW9uc10gbm91c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwkkQlVTWUJPWCBpZCAkT1BUSU9OUyA+Zm9vIDI+L2Rldi9udWxsCisJUkVUMT0kPworCSRJRCAkT1BUSU9OUyA+YmFyIDI+L2Rldi9udWxsCisJUkVUMj0kPworCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJZmkKKwlkaWZmIGZvbyBiYXIKK2RvbmUKKworZWNobyAidGVzdCAyOiBpZCBbb3B0aW9uc10gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJZm9yIGkgaW4gJExJU1QgOyBkbworCQlpZiB0ZXN0ICIkaSIgPSAiJFRFU1RfVVNFUiI7IHRoZW4KKwkJCUZMQUdfVVNFUl9FWElTVFM9InllcyIKKwkJZmkKKwkJJEJVU1lCT1ggaWQgJE9QVElPTlMgJGkgPmZvbyAyPi9kZXYvbnVsbAorCQlSRVQxPSQ/CisJCSRJRCAkT1BUSU9OUyAkaSA+YmFyIDI+L2Rldi9udWxsCisJCVJFVDI9JD8KKwkJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJCWZpCisJCWRpZmYgZm9vIGJhcgorCWRvbmUKK2RvbmUKKworaWYgdGVzdCAkRkxBR19VU0VSX0VYSVNUUyA9ICJ5ZXMiOyB0aGVuCisJZWNobyAidGVzdCAzLDQsNSw2LDcsOCw5LDEwLDExLDEyIHNraXBwZWQgYmVjYXVzZSB0ZXN0IHVzZXIgJFRFU1RfVVNFUiBhbHJlYWR5IGV4aXN0cyIKKwlybSAtZiBmb28gYmFyCisJZXhpdCAxCitmaQorCithZGR1c2VyIC1zIC9iaW4vdHJ1ZSAtZyAiIiAtSCAtRCAiJFRFU1RfVVNFUiIgfHwgZXhpdCAxCisKK2Nob3duICRURVNUX1VTRVIuJFRFU1RfVVNFUiAkQlVTWUJPWAorY2htb2QgdStzICRCVVNZQk9YIDI+JjEgL2Rldi9udWxsCitjaG93biAkVEVTVF9VU0VSLiRURVNUX1VTRVIgJElECitjaG1vZCB1K3MgJElEIDI+JjEgL2Rldi9udWxsCisKK2VjaG8gInRlc3QgMyBzZXR1aWQsIGV4aXN0aW5nIHVzZXI6IGlkIFtvcHRpb25zXSBubyB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwkkQlVTWUJPWCBpZCAkT1BUSU9OUyA+Zm9vIDI+L2Rldi9udWxsCisJUkVUMT0kPworCSRJRCAkT1BUSU9OUyA+YmFyIDI+L2Rldi9udWxsCisJUkVUMj0kPworCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJZmkKKwlkaWZmIGZvbyBiYXIKKwkjZG9uZQorZG9uZQorCitlY2hvICJ0ZXN0IDQgc2V0dWlkLCBleGlzdGluZyB1c2VyOiBpZCBbb3B0aW9uc10gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJZm9yIGkgaW4gJExJU1QgOyBkbworCQkkQlVTWUJPWCBpZCAkT1BUSU9OUyAkaSA+Zm9vIDI+L2Rldi9udWxsCisJCVJFVDE9JD8KKwkJJElEICRPUFRJT05TICRpID5iYXIgMj4vZGV2L251bGwKKwkJUkVUMj0kPworCQlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwkJZmkKKwkJZGlmZiBmb28gYmFyCisJZG9uZQorZG9uZQorCitjaG93biAkVEVTVF9VU0VSLiRURVNUX1VTRVIgJEJVU1lCT1gKK2NobW9kIGcrcyAkQlVTWUJPWCAyPiYxIC9kZXYvbnVsbAorY2hvd24gJFRFU1RfVVNFUi4kVEVTVF9VU0VSICRJRAorY2htb2QgZytzICRJRCAyPiYxIC9kZXYvbnVsbAorCitlY2hvICJ0ZXN0IDUgc2V0Z2lkLCBleGlzdGluZyB1c2VyOiBpZCBbb3B0aW9uc10gbm8gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJJEJVU1lCT1ggaWQgJE9QVElPTlMgPmZvbyAyPi9kZXYvbnVsbAorCVJFVDE9JD8KKwkkSUQgJE9QVElPTlMgPmJhciAyPi9kZXYvbnVsbAorCVJFVDI9JD8KKwlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCWZpCisJZGlmZiBmb28gYmFyCisJI2RvbmUKK2RvbmUKKworZWNobyAidGVzdCA2IHNldGdpZCwgZXhpc3RpbmcgdXNlcjogaWQgW29wdGlvbnNdIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCWZvciBpIGluICRMSVNUIDsgZG8KKwkJJEJVU1lCT1ggaWQgJE9QVElPTlMgJGkgPmZvbyAyPi9kZXYvbnVsbAorCQlSRVQxPSQ/CisJCSRJRCAkT1BUSU9OUyAkaSA+YmFyIDI+L2Rldi9udWxsCisJCVJFVDI9JD8KKwkJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJCWZpCisJCWRpZmYgZm9vIGJhcgorCWRvbmUKK2RvbmUKKworY2hvd24gJFRFU1RfVVNFUi4kVEVTVF9VU0VSICRCVVNZQk9YCitjaG1vZCB1K3MsZytzICRCVVNZQk9YIDI+JjEgL2Rldi9udWxsCitjaG93biAkVEVTVF9VU0VSLiRURVNUX1VTRVIgJElECitjaG1vZCB1K3MsZytzICRJRCAyPiYxIC9kZXYvbnVsbAorCitlY2hvICJ0ZXN0IDcgc2V0dWlkLCBzZXRnaWQsIGV4aXN0aW5nIHVzZXI6IGlkIFtvcHRpb25zXSBubyB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwkkQlVTWUJPWCBpZCAkT1BUSU9OUyA+Zm9vIDI+L2Rldi9udWxsCisJUkVUMT0kPworCSRJRCAkT1BUSU9OUyA+YmFyIDI+L2Rldi9udWxsCisJUkVUMj0kPworCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJZmkKKwlkaWZmIGZvbyBiYXIKKwkjZG9uZQorZG9uZQorCitlY2hvICJ0ZXN0IDggc2V0dWlkLCBzZXRnaWQsIGV4aXN0aW5nIHVzZXI6IGlkIFtvcHRpb25zXSB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwlmb3IgaSBpbiAkTElTVCA7IGRvCisJCSRCVVNZQk9YIGlkICRPUFRJT05TICRpID5mb28gMj4vZGV2L251bGwKKwkJUkVUMT0kPworCQkkSUQgJE9QVElPTlMgJGkgPmJhciAyPi9kZXYvbnVsbAorCQlSRVQyPSQ/CisJCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCQlmaQorCQlkaWZmIGZvbyBiYXIKKwlkb25lCitkb25lCisKK2RlbHVzZXIgJFRFU1RfVVNFUiB8fCBleGl0IDEKKworZWNobyAidGVzdCA5IHNldHVpZCwgc2V0Z2lkLCBub3QgZXhpc3RpbmcgdXNlcjogaWQgW29wdGlvbnNdIG5vIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCSRCVVNZQk9YIGlkICRPUFRJT05TID5mb28gMj4vZGV2L251bGwKKwlSRVQxPSQ/CisJJElEICRPUFRJT05TID5iYXIgMj4vZGV2L251bGwKKwlSRVQyPSQ/CisJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwlmaQorCWRpZmYgZm9vIGJhcgorZG9uZQorCitlY2hvICJ0ZXN0IDEwIHNldHVpZCwgc2V0Z2lkLCBub3QgZXhpc3RpbmcgdXNlcjogaWQgW29wdGlvbnNdIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCWZvciBpIGluICRMSVNUIDsgZG8KKwkJJEJVU1lCT1ggaWQgJE9QVElPTlMgJGkgPmZvbyAyPi9kZXYvbnVsbAorCQlSRVQxPSQ/CisJCSRJRCAkT1BUSU9OUyAkaSA+YmFyIDI+L2Rldi9udWxsCisJCVJFVDI9JD8KKwkJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJCWZpCisJCWRpZmYgZm9vIGJhcgorCWRvbmUKK2RvbmUKKworY2hvd24gLnJvb3QgJEJVU1lCT1ggMj4mMSAvZGV2L251bGwKK2Nob3duIC5yb290ICRJRCAyPiYxIC9kZXYvbnVsbAorY2htb2QgZytzICRCVVNZQk9YIDI+JjEgL2Rldi9udWxsCitjaG1vZCBnK3MgJElEIDI+JjEgL2Rldi9udWxsCisKK2VjaG8gInRlc3QgMTEgc2V0Z2lkLCBub3QgZXhpc3RpbmcgZ3JvdXA6IGlkIFtvcHRpb25zXSBubyB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwkkQlVTWUJPWCBpZCAkT1BUSU9OUyA+Zm9vIDI+L2Rldi9udWxsCisJUkVUMT0kPworCSRJRCAkT1BUSU9OUyA+YmFyIDI+L2Rldi9udWxsCisJUkVUMj0kPworCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJZmkKKwlkaWZmIGZvbyBiYXIKKwkjZG9uZQorZG9uZQorCitlY2hvICJ0ZXN0IDEyIHNldGdpZCwgbm90IGV4aXN0aW5nIGdyb3VwOiBpZCBbb3B0aW9uc10gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJZm9yIGkgaW4gJExJU1QgOyBkbworCQkkQlVTWUJPWCBpZCAkT1BUSU9OUyAkaSA+Zm9vIDI+L2Rldi9udWxsCisJCVJFVDE9JD8KKwkJJElEICRPUFRJT05TICRpID5iYXIgMj4vZGV2L251bGwKKwkJUkVUMj0kPworCQlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwkJZmkKKwkJZGlmZiBmb28gYmFyCisJZG9uZQorZG9uZQorCitjaG93biByb290LnJvb3QgJEJVU1lCT1ggMj4mMSAvZGV2L251bGwKK2Nob3duIHJvb3Qucm9vdCAkSUQgMj4mMSAvZGV2L251bGwKK3JtIC1mICRJRAorcm0gLWYgZm9vIGJhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2luc3RhbGwuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9pbnN0YWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1NDk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9pbnN0YWxsLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBHbGVubiBNY0dyYXRoCisgKiBTRUxpbnV4IHN1cHBvcnQ6IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogLXYsIC1iLCAtYyBhcmUgaWdub3JlZCAqLworLy91c2FnZTojZGVmaW5lIGluc3RhbGxfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstY2REc3BdIFstbyBVU0VSXSBbLWcgR1JQXSBbLW0gTU9ERV0gW1NPVVJDRV0uLi4gREVTVCIKKy8vdXNhZ2U6I2RlZmluZSBpbnN0YWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29weSBmaWxlcyBhbmQgc2V0IGF0dHJpYnV0ZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJSnVzdCBjb3B5IChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJQ3JlYXRlIGRpcmVjdG9yaWVzIgorLy91c2FnZTogICAgICJcbgktRAlDcmVhdGUgbGVhZGluZyB0YXJnZXQgZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCVN0cmlwIHN5bWJvbCB0YWJsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUHJlc2VydmUgZGF0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8gVVNFUglTZXQgb3duZXJzaGlwIgorLy91c2FnZTogICAgICJcbgktZyBHUlAJU2V0IGdyb3VwIG93bmVyc2hpcCIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTU9ERQlTZXQgcGVybWlzc2lvbnMiCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktWglTZXQgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGliY29yZXV0aWxzL2NvcmV1dGlscy5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIGluc3RhbGxfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJkaXJlY3RvcnlcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJkIgorCSJwcmVzZXJ2ZS10aW1lc3RhbXBzXDAiIE5vX2FyZ3VtZW50ICAgICAgICJwIgorCSJzdHJpcFwwIiAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCSJncm91cFwwIiAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJnIgorCSJtb2RlXDAiICAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJtIgorCSJvd25lclwwIiAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJvIgorLyogYXV0b2ZzIGJ1aWxkIGluc2lzdHMgb2YgdXNpbmcgLWIgLS1zdWZmaXg9Lm9yaWcgKi8KKy8qIFRPRE8/IChzaG9ydCBvcHRpb24gZm9yIC0tc3VmZml4IGlzIC1TKSAqLworI2lmIEVOQUJMRV9TRUxJTlVYCisJImNvbnRleHRcMCIgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIloiCisJInByZXNlcnZlX2NvbnRleHRcMCIgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmYiCisJInByZXNlcnZlLWNvbnRleHRcMCIgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmYiCisjZW5kaWYKKwk7CisjZW5kaWYKKworCisjaWYgRU5BQkxFX1NFTElOVVgKK3N0YXRpYyB2b2lkIHNldGRlZmF1bHRmaWxlY29uKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgczsKKwlzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQgPSBOVUxMOworCisJaWYgKCFpc19zZWxpbnV4X2VuYWJsZWQoKSkgeworCQlyZXR1cm47CisJfQorCWlmIChsc3RhdChwYXRoLCAmcykgIT0gMCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKG1hdGNocGF0aGNvbihwYXRoLCBzLnN0X21vZGUsICZzY29udGV4dCkgPCAwKSB7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoc3RyY21wKHNjb250ZXh0LCAiPDxub25lPj4iKSA9PSAwKSB7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsc2V0ZmlsZWNvbihwYXRoLCBzY29udGV4dCkgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9UU1VQKSB7CisJCQliYl9wZXJyb3JfbXNnKCJ3YXJuaW5nOiBjYW4ndCBjaGFuZ2UgY29udGV4dCIKKwkJCQkJIiBvZiAlcyB0byAlcyIsIHBhdGgsIHNjb250ZXh0KTsKKwkJfQorCX0KKworIG91dDoKKwlmcmVlY29uKHNjb250ZXh0KTsKK30KKworI2VuZGlmCisKK2ludCBpbnN0YWxsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpbnN0YWxsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJbW9kZV90IG1vZGU7CisJdWlkX3QgdWlkOworCWdpZF90IGdpZDsKKwljaGFyICphcmcsICpsYXN0OworCWNvbnN0IGNoYXIgKmdpZF9zdHI7CisJY29uc3QgY2hhciAqdWlkX3N0cjsKKwljb25zdCBjaGFyICptb2RlX3N0cjsKKwlpbnQgY29weV9mbGFncyA9IEZJTEVVVElMU19ERVJFRkVSRU5DRSB8IEZJTEVVVElMU19GT1JDRTsKKwlpbnQgb3B0czsKKwlpbnQgbWluX2FyZ3MgPSAxOworCWludCByZXQgPSBFWElUX1NVQ0NFU1M7CisJaW50IGlzZGlyID0gMDsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dDsKKwlib29sIHVzZV9kZWZhdWx0X3NlbGludXhfY29udGV4dCA9IDE7CisjZW5kaWYKKwllbnVtIHsKKwkJT1BUX2MgICAgICAgICAgICAgPSAxIDw8IDAsCisJCU9QVF92ICAgICAgICAgICAgID0gMSA8PCAxLAorCQlPUFRfYiAgICAgICAgICAgICA9IDEgPDwgMiwKKwkJT1BUX01LRElSX0xFQURJTkcgPSAxIDw8IDMsCisJCU9QVF9ESVJFQ1RPUlkgICAgID0gMSA8PCA0LAorCQlPUFRfUFJFU0VSVkVfVElNRSA9IDEgPDwgNSwKKwkJT1BUX1NUUklQICAgICAgICAgPSAxIDw8IDYsCisJCU9QVF9HUk9VUCAgICAgICAgID0gMSA8PCA3LAorCQlPUFRfTU9ERSAgICAgICAgICA9IDEgPDwgOCwKKwkJT1BUX09XTkVSICAgICAgICAgPSAxIDw8IDksCisjaWYgRU5BQkxFX1NFTElOVVgKKwkJT1BUX1NFVF9TRUNVUklUWV9DT05URVhUID0gMSA8PCAxMCwKKwkJT1BUX1BSRVNFUlZFX1NFQ1VSSVRZX0NPTlRFWFQgPSAxIDw8IDExLAorI2VuZGlmCisJfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU1RBTExfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGluc3RhbGxfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJzLS1kOmQtLXMiIElGX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMoSUZfU0VMSU5VWCgiOlotLVx4ZmY6XHhmZi0tWiIpKTsKKwkvKiAtYyBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpdCdzIG5lZWRlZCAqLworCS8qIC12IGlzIGlnbm9yZWQgKCJwcmludCBuYW1lIG9mIGVhY2ggY3JlYXRlZCBkaXJlY3RvcnkiKSAqLworCS8qIC1iIGlzIGlnbm9yZWQgKCJtYWtlIGEgYmFja3VwIG9mIGVhY2ggZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZSIpICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJjdmIiICJEZHBzZzptOm86IiBJRl9TRUxJTlVYKCJaOiIpLAorCQkJJmdpZF9zdHIsICZtb2RlX3N0ciwgJnVpZF9zdHIgSUZfU0VMSU5VWCgsICZzY29udGV4dCkpOworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAob3B0cyAmIChPUFRfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVHxPUFRfU0VUX1NFQ1VSSVRZX0NPTlRFWFQpKSB7CisJCXNlbGludXhfb3JfZGllKCk7CisJCXVzZV9kZWZhdWx0X3NlbGludXhfY29udGV4dCA9IDA7CisJCWlmIChvcHRzICYgT1BUX1BSRVNFUlZFX1NFQ1VSSVRZX0NPTlRFWFQpIHsKKwkJCWNvcHlfZmxhZ3MgfD0gRklMRVVUSUxTX1BSRVNFUlZFX1NFQ1VSSVRZX0NPTlRFWFQ7CisJCX0KKwkJaWYgKG9wdHMgJiBPUFRfU0VUX1NFQ1VSSVRZX0NPTlRFWFQpIHsKKwkJCXNldGZzY3JlYXRlY29uX29yX2RpZShzY29udGV4dCk7CisJCQljb3B5X2ZsYWdzIHw9IEZJTEVVVElMU19TRVRfU0VDVVJJVFlfQ09OVEVYVDsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogcHJlc2VydmUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZSwgdGhpcyBpcyBHTlUgYmVoYXZpb3VyLAorCSAqIEJTRCBvbmx5IHByZXNlcnZlcyBtb2RpZmljYXRpb24gdGltZSAqLworCWlmIChvcHRzICYgT1BUX1BSRVNFUlZFX1RJTUUpIHsKKwkJY29weV9mbGFncyB8PSBGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTOworCX0KKwltb2RlID0gMDc1NTsgLyogR05VIGNvcmV1dGlscyA2LjEwIGNvbXBhdCAqLworCWlmIChvcHRzICYgT1BUX01PREUpCisJCWJiX3BhcnNlX21vZGUobW9kZV9zdHIsICZtb2RlKTsKKwl1aWQgPSAob3B0cyAmIE9QVF9PV05FUikgPyBnZXRfdWdfaWQodWlkX3N0ciwgeHVuYW1lMnVpZCkgOiBnZXR1aWQoKTsKKwlnaWQgPSAob3B0cyAmIE9QVF9HUk9VUCkgPyBnZXRfdWdfaWQoZ2lkX3N0ciwgeGdyb3VwMmdpZCkgOiBnZXRnaWQoKTsKKworCWxhc3QgPSBhcmd2W2FyZ2MgLSAxXTsKKwlpZiAoIShvcHRzICYgT1BUX0RJUkVDVE9SWSkpIHsKKwkJYXJndlthcmdjIC0gMV0gPSBOVUxMOworCQltaW5fYXJncysrOworCisJCS8qIGNvcmV1dGlscyBpbnN0YWxsIHJlc29sdmVzIGxpbmsgaW4gdGhpcyBjYXNlLCBkb24ndCB1c2UgbHN0YXQgKi8KKwkJaXNkaXIgPSBzdGF0KGxhc3QsICZzdGF0YnVmKSA8IDAgPyAwIDogU19JU0RJUihzdGF0YnVmLnN0X21vZGUpOworCX0KKworCWlmIChhcmdjIDwgbWluX2FyZ3MpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCXdoaWxlICgoYXJnID0gKmFyZ3YrKykgIT0gTlVMTCkgeworCQljaGFyICpkZXN0ID0gbGFzdDsKKwkJaWYgKG9wdHMgJiBPUFRfRElSRUNUT1JZKSB7CisJCQlkZXN0ID0gYXJnOworCQkJLyogR05VIGNvcmV1dGlscyA2LjkgZG9lcyBub3Qgc2V0IHVpZDpnaWQKKwkJCSAqIG9uIGludGVybWVkaWF0ZSBjcmVhdGVkIGRpcmVjdG9yaWVzCisJCQkgKiAob25seSBvbiBsYXN0IG9uZSkgKi8KKwkJCWlmIChiYl9tYWtlX2RpcmVjdG9yeShkZXN0LCAwNzU1LCBGSUxFVVRJTFNfUkVDVVIpKSB7CisJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChvcHRzICYgT1BUX01LRElSX0xFQURJTkcpIHsKKwkJCQljaGFyICpkZGlyID0geHN0cmR1cChkZXN0KTsKKwkJCQliYl9tYWtlX2RpcmVjdG9yeShkaXJuYW1lKGRkaXIpLCAwNzU1LCBGSUxFVVRJTFNfUkVDVVIpOworCQkJCS8qIGVycm9ycyBhcmUgbm90IGNoZWNrZWQuIGNvcHlfZmlsZQorCQkJCSAqIHdpbGwgZmFpbCBpZiBkaXIgaXMgbm90IGNyZWF0ZWQuICovCisJCQkJZnJlZShkZGlyKTsKKwkJCX0KKwkJCWlmIChpc2RpcikKKwkJCQlkZXN0ID0gY29uY2F0X3BhdGhfZmlsZShsYXN0LCBiYl9iYXNlbmFtZShhcmcpKTsKKwkJCWlmIChjb3B5X2ZpbGUoYXJnLCBkZXN0LCBjb3B5X2ZsYWdzKSAhPSAwKSB7CisJCQkJLyogY29weSBpcyBub3QgbWFkZSAqLworCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlpZiAob3B0cyAmIE9QVF9TVFJJUCkgeworCQkJCWNoYXIgKmFyZ3NbNF07CisJCQkJYXJnc1swXSA9IChjaGFyKikic3RyaXAiOworCQkJCWFyZ3NbMV0gPSAoY2hhciopIi1wIjsgLyogLXAgLS1wcmVzZXJ2ZS1kYXRlcyAqLworCQkJCWFyZ3NbMl0gPSBkZXN0OworCQkJCWFyZ3NbM10gPSBOVUxMOworCQkJCWlmIChzcGF3bl9hbmRfd2FpdChhcmdzKSkgeworCQkJCQliYl9wZXJyb3JfbXNnKCJzdHJpcCIpOworCQkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogU2V0IHRoZSBmaWxlIG1vZGUgKGFsd2F5cywgbm90IG9ubHkgd2l0aCAtbSkuCisJCSAqIEdOVSBjb3JldXRpbHMgNi4xMCBpcyBub3QgYWZmZWN0ZWQgYnkgdW1hc2suICovCisJCWlmIChjaG1vZChkZXN0LCBtb2RlKSA9PSAtMSkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgY2hhbmdlICVzIG9mICVzIiwgInBlcm1pc3Npb25zIiwgZGVzdCk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCX0KKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAodXNlX2RlZmF1bHRfc2VsaW51eF9jb250ZXh0KQorCQkJc2V0ZGVmYXVsdGZpbGVjb24oZGVzdCk7CisjZW5kaWYKKwkJLyogU2V0IHRoZSB1c2VyIGFuZCBncm91cCBpZCAqLworCQlpZiAoKG9wdHMgJiAoT1BUX09XTkVSfE9QVF9HUk9VUCkpCisJCSAmJiBsY2hvd24oZGVzdCwgdWlkLCBnaWQpID09IC0xCisJCSkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgY2hhbmdlICVzIG9mICVzIiwgIm93bmVyc2hpcCIsIGRlc3QpOworCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQl9CisgbmV4dDoKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQICYmIGlzZGlyKQorCQkJZnJlZShkZXN0KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xlbmd0aC5jLmRpc2FibGVkIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xlbmd0aC5jLmRpc2FibGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTg5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbGVuZ3RoLmMuZGlzYWJsZWQKQEAgLTAsMCArMSwzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gQXBwYXJlbnRseSBhIGJ1c3lib3ggKG9ic29sZXRlPykgZXh0ZW5zaW9uLiAqLworCisvL3VzYWdlOiNkZWZpbmUgbGVuZ3RoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJTVFJJTkciCisvL3VzYWdlOiNkZWZpbmUgbGVuZ3RoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgU1RSSU5HJ3MgbGVuZ3RoIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsZW5ndGhfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbGVuZ3RoIEhlbGxvXG4iCisvL3VzYWdlOiAgICAgICAiNVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGxlbmd0aF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbGVuZ3RoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmICgoYXJnYyAhPSAyKSB8fCAoKiooKythcmd2KSA9PSAnLScpKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlwcmludGYoIiV1XG4iLCAodW5zaWduZWQpc3RybGVuKCphcmd2KSk7CisKKwlyZXR1cm4gZmZsdXNoX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDJkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbGliY29yZXV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxNCBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfTUtGSUZPKQkrPSBnZXRvcHRfbWtfZmlmb19ub2QubworbGliLSQoQ09ORklHX01LTk9EKQkrPSBnZXRvcHRfbWtfZmlmb19ub2QubworbGliLSQoQ09ORklHX0lOU1RBTEwpCSs9IGNwX212X3N0YXQubworbGliLSQoQ09ORklHX0NQKQkrPSBjcF9tdl9zdGF0Lm8KK2xpYi0kKENPTkZJR19NVikJKz0gY3BfbXZfc3RhdC5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NvcmV1dGlscy5oIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9jb3JldXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDdkMDMzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9jb3JldXRpbHMuaApAQCAtMCwwICsxLDIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZm5kZWYgQ09SRVVUSUxTX0gKKyNkZWZpbmUgQ09SRVVUSUxTX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKwordHlwZWRlZiBpbnQgKCpzdGF0X2Z1bmMpKGNvbnN0IGNoYXIgKmZuLCBzdHJ1Y3Qgc3RhdCAqcHMpOworCitpbnQgY3BfbXZfc3RhdDIoY29uc3QgY2hhciAqZm4sIHN0cnVjdCBzdGF0ICpmbl9zdGF0LCBzdGF0X2Z1bmMgc2YpIEZBU1RfRlVOQzsKK2ludCBjcF9tdl9zdGF0KGNvbnN0IGNoYXIgKmZuLCBzdHJ1Y3Qgc3RhdCAqZm5fc3RhdCkgRkFTVF9GVU5DOworCittb2RlX3QgZ2V0b3B0X21rX2ZpZm9fbm9kKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9jcF9tdl9zdGF0LmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NwX212X3N0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmEwN2VjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9jcF9tdl9zdGF0LmMKQEAgLTAsMCArMSw1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY29yZXV0aWxzIHV0aWxpdHkgcm91dGluZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiY29yZXV0aWxzLmgiCisKK2ludCBGQVNUX0ZVTkMgY3BfbXZfc3RhdDIoY29uc3QgY2hhciAqZm4sIHN0cnVjdCBzdGF0ICpmbl9zdGF0LCBzdGF0X2Z1bmMgc2YpCit7CisJaWYgKHNmKGZuLCBmbl9zdGF0KSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRQorCQkJaWYgKGVycm5vID09IEVOT1RESVIpIHsKKwkJCQliYl9lcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJzogUGF0aCBoYXMgbm9uLWRpcmVjdG9yeSBjb21wb25lbnQiLCBmbik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorI2VuZGlmCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzdGF0ICclcyciLCBmbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChTX0lTRElSKGZuX3N0YXQtPnN0X21vZGUpKSB7CisJCXJldHVybiAzOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IEZBU1RfRlVOQyBjcF9tdl9zdGF0KGNvbnN0IGNoYXIgKmZuLCBzdHJ1Y3Qgc3RhdCAqZm5fc3RhdCkKK3sKKwlyZXR1cm4gY3BfbXZfc3RhdDIoZm4sIGZuX3N0YXQsIHN0YXQpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9nZXRvcHRfbWtfZmlmb19ub2QuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9saWJjb3JldXRpbHMvZ2V0b3B0X21rX2ZpZm9fbm9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyNzE3MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9saWJjb3JldXRpbHMvZ2V0b3B0X21rX2ZpZm9fbm9kLmMKQEAgLTAsMCArMSw0OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY29yZXV0aWxzIHV0aWxpdHkgcm91dGluZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiY29yZXV0aWxzLmgiCisKK21vZGVfdCBGQVNUX0ZVTkMgZ2V0b3B0X21rX2ZpZm9fbm9kKGNoYXIgKiphcmd2KQoreworCW1vZGVfdCBtb2RlID0gMDY2NjsKKwljaGFyICpzbW9kZSA9IE5VTEw7CisjaWYgRU5BQkxFX1NFTElOVVgKKwlzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQ7CisjZW5kaWYKKwlpbnQgb3B0OworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJtOiIgSUZfU0VMSU5VWCgiWjoiKSwgJnNtb2RlIElGX1NFTElOVVgoLCZzY29udGV4dCkpOworCWlmIChvcHQgJiAxKSB7CisJCWlmIChiYl9wYXJzZV9tb2RlKHNtb2RlLCAmbW9kZSkpCisJCQl1bWFzaygwKTsKKwl9CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChvcHQgJiAyKSB7CisJCXNlbGludXhfb3JfZGllKCk7CisJCXNldGZzY3JlYXRlY29uX29yX2RpZShzY29udGV4dCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gbW9kZTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9sbi5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL2xuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhOWE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9sbi5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGxuIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBCQl9BVURJVCBHTlUgb3B0aW9ucyBtaXNzaW5nOiAtZCwgLUYsIC1pLCBhbmQgLXYuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2xuLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIGxuX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gVEFSR0VULi4uIExJTkt8RElSIgorLy91c2FnZTojZGVmaW5lIGxuX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIGEgbGluayBMSU5LIG9yIERJUi9UQVJHRVQgdG8gdGhlIHNwZWNpZmllZCBUQVJHRVQocylcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTWFrZSBzeW1saW5rcyBpbnN0ZWFkIG9mIGhhcmRsaW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJUmVtb3ZlIGV4aXN0aW5nIGRlc3RpbmF0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3QgZGVyZWZlcmVuY2Ugc3ltbGlua3MgLSB0cmVhdCBsaWtlIG5vcm1hbCBmaWxlIgorLy91c2FnZTogICAgICJcbgktYglNYWtlIGEgYmFja3VwIG9mIHRoZSB0YXJnZXQgKGlmIGV4aXN0cykgYmVmb3JlIGxpbmsgb3BlcmF0aW9uIgorLy91c2FnZTogICAgICJcbgktUyBzdWYJVXNlIHN1ZmZpeCBpbnN0ZWFkIG9mIH4gd2hlbiBtYWtpbmcgYmFja3VwIGZpbGVzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsbl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBsbiAtcyBCdXN5Qm94IC90bXAvbHNcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvbHNcbiIKKy8vdXNhZ2U6ICAgICAgICJscnd4cnd4cnd4ICAgIDEgcm9vdCAgICAgcm9vdCAgICAgICAgICAgIDcgQXByIDEyIDE4OjM5IGxzIC0+IEJ1c3lCb3gqXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKKyNkZWZpbmUgTE5fU1lNTElOSyAgICAgICAgICAxCisjZGVmaW5lIExOX0ZPUkNFICAgICAgICAgICAgMgorI2RlZmluZSBMTl9OT0RFUkVGRVJFTkNFICAgIDQKKyNkZWZpbmUgTE5fQkFDS1VQICAgICAgICAgICA4CisjZGVmaW5lIExOX1NVRkZJWCAgICAgICAgICAgMTYKKworaW50IGxuX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsbl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCWludCBvcHRzOworCWNoYXIgKmxhc3Q7CisJY2hhciAqc3JjX25hbWU7CisJY2hhciAqc3JjOworCWNoYXIgKnN1ZmZpeCA9IChjaGFyKikifiI7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlpbnQgKCpsaW5rX2Z1bmMpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogbWluIG9uZSBhcmcgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgInNmbmJTOiIsICZzdWZmaXgpOworCisJbGFzdCA9IGFyZ3ZbYXJnYyAtIDFdOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCFhcmd2WzFdKSB7CisJCS8qICJsbiBQQVRIL1RPL0ZJTEUiIC0+ICJsbiBQQVRIL1RPL0ZJTEUgRklMRSIgKi8KKwkJKi0tYXJndiA9IGxhc3Q7CisJCS8qIHhzdHJkdXAgaXMgbmVlZGVkOiAibG4gLXMgUEFUSC9UTy9GSUxFLyIgaXMgZXF1aXZhbGVudCB0bworCQkgKiAibG4gLXMgUEFUSC9UTy9GSUxFLyBGSUxFIiwgbm90ICJsbiAtcyBQQVRIL1RPL0ZJTEUgRklMRSIKKwkJICovCisJCWxhc3QgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcCh4c3RyZHVwKGxhc3QpKTsKKwl9CisKKwlkbyB7CisJCXNyY19uYW1lID0gTlVMTDsKKwkJc3JjID0gbGFzdDsKKworCQlpZiAoaXNfZGlyZWN0b3J5KHNyYywKKwkJICAgICAgICAgICAgICAgIChvcHRzICYgTE5fTk9ERVJFRkVSRU5DRSkgXiBMTl9OT0RFUkVGRVJFTkNFLAorCQkgICAgICAgICAgICAgICAgTlVMTCkKKwkJKSB7CisJCQlzcmNfbmFtZSA9IHhzdHJkdXAoKmFyZ3YpOworCQkJc3JjID0gY29uY2F0X3BhdGhfZmlsZShzcmMsIGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKHNyY19uYW1lKSk7CisJCQlmcmVlKHNyY19uYW1lKTsKKwkJCXNyY19uYW1lID0gc3JjOworCQl9CisJCWlmICghKG9wdHMgJiBMTl9TWU1MSU5LKSAmJiBzdGF0KCphcmd2LCAmc3RhdGJ1ZikpIHsKKwkJCS8vIGNvcmV1dGlsczogImxuIGRhbmdsaW5nX3N5bWxpbmsgbmV3X2hhcmRsaW5rIiB3b3JrcworCQkJaWYgKGxzdGF0KCphcmd2LCAmc3RhdGJ1ZikgfHwgIVNfSVNMTksoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQkJZnJlZShzcmNfbmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAob3B0cyAmIExOX0JBQ0tVUCkgeworCQkJY2hhciAqYmFja3VwOworCQkJYmFja3VwID0geGFzcHJpbnRmKCIlcyVzIiwgc3JjLCBzdWZmaXgpOworCQkJaWYgKHJlbmFtZShzcmMsIGJhY2t1cCkgPCAwICYmIGVycm5vICE9IEVOT0VOVCkgeworCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKHNyYyk7CisJCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJCWZyZWUoYmFja3VwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZyZWUoYmFja3VwKTsKKwkJCS8qCisJCQkgKiBXaGVuIHRoZSBzb3VyY2UgYW5kIGRlc3QgYXJlIGJvdGggaGFyZCBsaW5rcyB0byB0aGUgc2FtZQorCQkJICogaW5vZGUsIGEgcmVuYW1lIG1heSBzdWNjZWVkIGV2ZW4gdGhvdWdoIG5vdGhpbmcgaGFwcGVuZWQuCisJCQkgKiBUaGVyZWZvcmUsIGFsd2F5cyB1bmxpbmsoKS4KKwkJCSAqLworCQkJdW5saW5rKHNyYyk7CisJCX0gZWxzZSBpZiAob3B0cyAmIExOX0ZPUkNFKSB7CisJCQl1bmxpbmsoc3JjKTsKKwkJfQorCisJCWxpbmtfZnVuYyA9IGxpbms7CisJCWlmIChvcHRzICYgTE5fU1lNTElOSykgeworCQkJbGlua19mdW5jID0gc3ltbGluazsKKwkJfQorCisJCWlmIChsaW5rX2Z1bmMoKmFyZ3YsIHNyYykgIT0gMCkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coc3JjKTsKKwkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCisJCWZyZWUoc3JjX25hbWUpOworCisJfSB3aGlsZSAoKCsrYXJndilbMV0pOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9sb2duYW1lLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbG9nbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjk2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbG9nbmFtZS5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbG9nbmFtZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgRWR3YXJkIEJldHRzIDxlZHdhcmRAZGViaWFuLm9yZz4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvbG9nbmFtZS5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogU1VTdjMgc3BlY2lmaWVzIHRoZSBzdHJpbmcgdXNlZCBpcyB0aGF0IHJldHVybmVkIGZyb20gZ2V0bG9naW4oKS4KKyAqIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB1c2VkIGdldHB3dWlkKCkgZm9yIGdldGV1aWQoKSwgd2hpY2gKKyAqIGlzIF9ub3RfIHRoZSBzYW1lLiAgRXJpayBhcHBhcmVudGx5IG1hZGUgdGhpcyBjaGFuZ2UgYWxtb3N0IDMgeWVhcnMKKyAqIGFnbyB0byBhdm9pZCBmYWlsaW5nIHdoZW4gbm8gdXRtcCB3YXMgYXZhaWxhYmxlLiAgSG93ZXZlciwgdGhlCisgKiBjb3JyZWN0IGNvdXJzZSBvZiBhY3Rpb24gd3J0IFNVU3YzIGZvciBhIGZhaWxpbmcgZ2V0bG9naW4oKSBpcworICogYSBkaWFnbm9zdGljIG1lc3NhZ2UgYW5kIGFuIGVycm9yIHJldHVybi4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9nbmFtZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIGxvZ25hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB1c2VyIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsb2duYW1lX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxvZ25hbWVcbiIKKy8vdXNhZ2U6ICAgICAgICJyb290XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgbG9nbmFtZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9nbmFtZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgYnVmWzY0XTsKKworCWlmIChhcmd2WzFdKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBVc2luZyBfciBmdW5jdGlvbiAtIGF2b2lkIHB1bGxpbmcgaW4gc3RhdGljIGJ1ZmZlciBmcm9tIGxpYmMgKi8KKwlpZiAoZ2V0bG9naW5fcihidWYsIHNpemVvZihidWYpKSA9PSAwKSB7CisJCXB1dHMoYnVmKTsKKwkJcmV0dXJuIGZmbHVzaF9hbGwoKTsKKwl9CisKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldGxvZ2luIik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbHMuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjI1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbHMuYwpAQCAtMCwwICsxLDEyNTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBCcmlhbiBDYW5kbGVyIDxCLkNhbmRsZXJAcG9ib3guY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogW2RhdGUgdW5rbm93bi4gUGVyaGFwcyBiZWZvcmUgeWVhciAyMDAwXQorICogVG8gYWNoaWV2ZSBhIHNtYWxsIG1lbW9yeSBmb290cHJpbnQsIHRoaXMgdmVyc2lvbiBvZiAnbHMnIGRvZXNuJ3QgZG8gYW55CisgKiBmaWxlIHNvcnRpbmcsIGFuZCBvbmx5IGhhcyB0aGUgbW9zdCBlc3NlbnRpYWwgY29tbWFuZCBsaW5lIHN3aXRjaGVzCisgKiAoaS5lLiwgdGhlIG9uZXMgSSBjb3VsZG4ndCBsaXZlIHdpdGhvdXQgOi0pIEFsbCBmZWF0dXJlcyB3aGljaCBpbnZvbHZlCisgKiBsaW5raW5nIGluIHN1YnN0YW50aWFsIGNodW5rcyBvZiBsaWJjIGNhbiBiZSBkaXNhYmxlZC4KKyAqCisgKiBBbHRob3VnaCBJIGRvbid0IHJlYWxseSB3YW50IHRvIGFkZCBuZXcgZmVhdHVyZXMgdG8gdGhpcyBwcm9ncmFtIHRvCisgKiBrZWVwIGl0IHNtYWxsLCBJICphbSogaW50ZXJlc3RlZCB0byByZWNlaXZlIGJ1ZyBmaXhlcyBhbmQgd2F5cyB0byBtYWtlCisgKiBpdCBtb3JlIHBvcnRhYmxlLgorICoKKyAqIEtOT1dOIEJVR1M6CisgKiAxLiBoaWRkZW4gZmlsZXMgY2FuIG1ha2UgY29sdW1uIHdpZHRoIHRvbyBsYXJnZQorICoKKyAqIE5PTi1PUFRJTUFMIEJFSEFWSU9VUjoKKyAqIDEuIGF1dG93aWR0aCByZWFkcyBkaXJlY3RvcmllcyB0d2ljZQorICogMi4gaWYgeW91IGRvIGEgc2hvcnQgZGlyZWN0b3J5IGxpc3Rpbmcgd2l0aG91dCBmaWxldHlwZSBjaGFyYWN0ZXJzCisgKiAgICBhcHBlbmRlZCwgdGhlcmUncyBubyBuZWVkIHRvIHN0YXQgZWFjaCBvbmUKKyAqIFBPUlRBQklMSVRZOgorICogMS4gcmVxdWlyZXMgbHN0YXQgKEJTRCkgLSBob3cgZG8geW91IGRvIGl0IHdpdGhvdXQ/CisgKgorICogWzIwMDktMDNdCisgKiBscyBzb3J0cyBsaXN0aW5nIG5vdywgYW5kIHN1cHBvcnRzIGFsbW9zdCBhbGwgb3B0aW9ucy4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbHNfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstMUFhQ3hkIgorLy91c2FnZToJSUZfRkVBVFVSRV9MU19GT0xMT1dMSU5LUygiTEgiKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19SRUNVUlNJVkUoIlIiKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19GSUxFVFlQRVMoIkZwIikgImxpbnMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoImUiKQorLy91c2FnZToJSUZfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSgiaCIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX1NPUlRGSUxFUygiclNYdiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoImN0dSIpCisvL3VzYWdlOglJRl9TRUxJTlVYKCJrS1oiKSAiXSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQVVUT1dJRFRIKCIgWy13IFdJRFRIXSIpICIgW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGxzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdCBkaXJlY3RvcnkgY29udGVudHNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLTEJT25lIGNvbHVtbiBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1hCUluY2x1ZGUgZW50cmllcyB3aGljaCBzdGFydCB3aXRoIC4iCisvL3VzYWdlOiAgICAgIlxuCS1BCUxpa2UgLWEsIGJ1dCBleGNsdWRlIC4gYW5kIC4uIgorLy91c2FnZTogICAgICJcbgktQwlMaXN0IGJ5IGNvbHVtbnMiCisvL3VzYWdlOiAgICAgIlxuCS14CUxpc3QgYnkgbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1kCUxpc3QgZGlyZWN0b3J5IGVudHJpZXMgaW5zdGVhZCBvZiBjb250ZW50cyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MoCisvL3VzYWdlOiAgICAgIlxuCS1MCUZvbGxvdyBzeW1saW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJRm9sbG93IHN5bWxpbmtzIG9uIGNvbW1hbmQgbGluZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfUkVDVVJTSVZFKAorLy91c2FnZTogICAgICJcbgktUglSZWN1cnNlIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19GSUxFVFlQRVMoCisvL3VzYWdlOiAgICAgIlxuCS1wCUFwcGVuZCAvIHRvIGRpciBlbnRyaWVzIgorLy91c2FnZTogICAgICJcbgktRglBcHBlbmQgaW5kaWNhdG9yIChvbmUgb2YgKi89QHwpIHRvIGVudHJpZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1sCUxvbmcgbGlzdGluZyBmb3JtYXQiCisvL3VzYWdlOiAgICAgIlxuCS1pCUxpc3QgaW5vZGUgbnVtYmVycyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JTGlzdCBudW1lcmljIFVJRHMgYW5kIEdJRHMgaW5zdGVhZCBvZiBuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTGlzdCBhbGxvY2F0ZWQgYmxvY2tzIgorLy91c2FnZToJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKAorLy91c2FnZTogICAgICJcbgktZQlMaXN0IGZ1bGwgZGF0ZSBhbmQgdGltZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoCisvL3VzYWdlOiAgICAgIlxuCS1oCUxpc3Qgc2l6ZXMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0ICgxSyAyNDNNIDJHKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfU09SVEZJTEVTKAorLy91c2FnZTogICAgICJcbgktcglTb3J0IGluIHJldmVyc2Ugb3JkZXIiCisvL3VzYWdlOiAgICAgIlxuCS1TCVNvcnQgYnkgc2l6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVgJU29ydCBieSBleHRlbnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS12CVNvcnQgYnkgdmVyc2lvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV2l0aCAtbDogc29ydCBieSBjdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJV2l0aCAtbDogc29ydCBieSBtdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJV2l0aCAtbDogc29ydCBieSBhdGltZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgIlxuCS1rCUxpc3Qgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6ICAgICAiXG4JLUsJTGlzdCBzZWN1cml0eSBjb250ZXh0IGluIGxvbmcgZm9ybWF0IgorLy91c2FnZTogICAgICJcbgktWglMaXN0IHNlY3VyaXR5IGNvbnRleHQgYW5kIHBlcm1pc3Npb24iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0FVVE9XSURUSCgKKy8vdXNhZ2U6ICAgICAiXG4JLXcgTglBc3N1bWUgdGhlIHRlcm1pbmFsIGlzIE4gY29sdW1ucyB3aWRlIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19DT0xPUigKKy8vdXNhZ2U6ICAgICAiXG4JLS1jb2xvcls9e2Fsd2F5cyxuZXZlcixhdXRvfV0JQ29udHJvbCBjb2xvcmluZyIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworI2lmIEVOQUJMRV9GVFBECisvKiBmdHBkIHVzZXMgbHMsIGFuZCB3aXRob3V0IHRpbWVzdGFtcHMgTW96aWxsYSB3b24ndCB1bmRlcnN0YW5kCisgKiBmdHBkJ3MgTElTVCBvdXRwdXQuCisgKi8KKyMgdW5kZWYgQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUworIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTCisjIHVuZGVmIElGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUworIyB1bmRlZiBJRl9OT1RfRkVBVFVSRV9MU19USU1FU1RBTVBTCisjIGRlZmluZSBDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTIDEKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMgMQorIyBkZWZpbmUgSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKC4uLikgX19WQV9BUkdTX18KKyMgZGVmaW5lIElGX05PVF9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoLi4uKQorI2VuZGlmCisKKworZW51bSB7CitURVJNSU5BTF9XSURUSCAgPSA4MCwgICAgICAgICAgIC8qIHVzZSA3OSBpZiB0ZXJtaW5hbCBoYXMgbGluZWZvbGQgYnVnICovCisKK1NQTElUX0ZJTEUgICAgICA9IDAsCitTUExJVF9ESVIgICAgICAgPSAxLAorU1BMSVRfU1VCRElSICAgID0gMiwKKworLyogQml0cyBpbiBHLmFsbF9mbXQ6ICovCisKKy8qIDUxMzA2IGxyd3hyd3hyd3ggIDEgcm9vdCAgICAgcm9vdCAgICAgICAgIDIgTWF5IDExIDAxOjQzIC9iaW4vdmlldyAtPiB2aSogKi8KKy8qIHdoYXQgZmlsZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGxpc3RlZCAqLworTElTVF9JTk8gICAgICAgID0gMSA8PCAwLAorTElTVF9CTE9DS1MgICAgID0gMSA8PCAxLAorTElTVF9NT0RFQklUUyAgID0gMSA8PCAyLAorTElTVF9OTElOS1MgICAgID0gMSA8PCAzLAorTElTVF9JRF9OQU1FICAgID0gMSA8PCA0LAorTElTVF9JRF9OVU1FUklDID0gMSA8PCA1LAorTElTVF9DT05URVhUICAgID0gMSA8PCA2LAorTElTVF9TSVpFICAgICAgID0gMSA8PCA3LAorTElTVF9EQVRFX1RJTUUgID0gMSA8PCA4LAorTElTVF9GVUxMVElNRSAgID0gMSA8PCA5LAorTElTVF9TWU1MSU5LICAgID0gMSA8PCAxMCwKK0xJU1RfRklMRVRZUEUgICA9IDEgPDwgMTEsIC8qIHNob3cgLyBzdWZmaXggZm9yIGRpcnMgKi8KK0xJU1RfQ0xBU1NJRlkgICA9IDEgPDwgMTIsIC8qIHJlcXVpcmVzIExJU1RfRklMRVRZUEUsIGFsc28gc2hvdyAqLHwsQCw9IHN1ZmZpeGVzICovCitMSVNUX01BU0sgICAgICAgPSAoTElTVF9DTEFTU0lGWSA8PCAxKSAtIDEsCisKKy8qIHdoYXQgZmlsZXMgd2lsbCBiZSBkaXNwbGF5ZWQgKi8KK0RJU1BfRElSTkFNRSAgICA9IDEgPDwgMTMsICAgICAgLyogMiBvciBtb3JlIGl0ZW1zPyBsYWJlbCBkaXJlY3RvcmllcyAqLworRElTUF9ISURERU4gICAgID0gMSA8PCAxNCwgICAgICAvKiBzaG93IGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIC4gKi8KK0RJU1BfRE9UICAgICAgICA9IDEgPDwgMTUsICAgICAgLyogc2hvdyAuIGFuZCAuLiAqLworRElTUF9OT0xJU1QgICAgID0gMSA8PCAxNiwgICAgICAvKiBzaG93IGRpcmVjdG9yeSBhcyBpdHNlbGYsIG5vdCBjb250ZW50cyAqLworRElTUF9SRUNVUlNJVkUgID0gMSA8PCAxNywgICAgICAvKiBzaG93IGRpcmVjdG9yeSBhbmQgZXZlcnl0aGluZyBiZWxvdyBpdCAqLworRElTUF9ST1dTICAgICAgID0gMSA8PCAxOCwgICAgICAvKiBwcmludCBhY3Jvc3Mgcm93cyAqLworRElTUF9NQVNLICAgICAgID0gKChESVNQX1JPV1MgPDwgMSkgLSAxKSAmIH4oRElTUF9ESVJOQU1FIC0gMSksCisKKy8qIHdoYXQgaXMgdGhlIG92ZXJhbGwgc3R5bGUgb2YgdGhlIGxpc3RpbmcgKi8KK1NUWUxFX0NPTFVNTkFSICA9IDEgPDwgMTksICAgICAgLyogbWFueSByZWNvcmRzIHBlciBsaW5lICovCitTVFlMRV9MT05HICAgICAgPSAyIDw8IDE5LCAgICAgIC8qIG9uZSByZWNvcmQgcGVyIGxpbmUsIGV4dGVuZGVkIGluZm8gKi8KK1NUWUxFX1NJTkdMRSAgICA9IDMgPDwgMTksICAgICAgLyogb25lIHJlY29yZCBwZXIgbGluZSAqLworU1RZTEVfTUFTSyAgICAgID0gU1RZTEVfU0lOR0xFLAorCisvKiB3aGljaCBvZiB0aGUgdGhyZWUgdGltZXMgd2lsbCBiZSB1c2VkICovCitUSU1FX0NIQU5HRSAgICAgPSAoMSA8PCAyMSkgKiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTLAorVElNRV9BQ0NFU1MgICAgID0gKDIgPDwgMjEpICogRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUywKK1RJTUVfTUFTSyAgICAgICA9ICgzIDw8IDIxKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMsCisKKy8qIGhvdyB3aWxsIHRoZSBmaWxlcyBiZSBzb3J0ZWQgKENPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUykgKi8KK1NPUlRfUkVWRVJTRSAgICA9IDEgPDwgMjMsCisKK1NPUlRfTkFNRSAgICAgICA9IDAsICAgICAgICAgICAgLyogc29ydCBieSBmaWxlIG5hbWUgKi8KK1NPUlRfU0laRSAgICAgICA9IDEgPDwgMjQsICAgICAgLyogc29ydCBieSBmaWxlIHNpemUgKi8KK1NPUlRfQVRJTUUgICAgICA9IDIgPDwgMjQsICAgICAgLyogc29ydCBieSBsYXN0IGFjY2VzcyB0aW1lICovCitTT1JUX0NUSU1FICAgICAgPSAzIDw8IDI0LCAgICAgIC8qIHNvcnQgYnkgbGFzdCBjaGFuZ2UgdGltZSAqLworU09SVF9NVElNRSAgICAgID0gNCA8PCAyNCwgICAgICAvKiBzb3J0IGJ5IGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgKi8KK1NPUlRfVkVSU0lPTiAgICA9IDUgPDwgMjQsICAgICAgLyogc29ydCBieSB2ZXJzaW9uICovCitTT1JUX0VYVCAgICAgICAgPSA2IDw8IDI0LCAgICAgIC8qIHNvcnQgYnkgZmlsZSBuYW1lIGV4dGVuc2lvbiAqLworU09SVF9ESVIgICAgICAgID0gNyA8PCAyNCwgICAgICAvKiBzb3J0IGJ5IGZpbGUgb3IgZGlyZWN0b3J5ICovCitTT1JUX01BU0sgICAgICAgPSAoNyA8PCAyNCkgKiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMsCisKK0xJU1RfTE9ORyAgICAgICA9IExJU1RfTU9ERUJJVFMgfCBMSVNUX05MSU5LUyB8IExJU1RfSURfTkFNRSB8IExJU1RfU0laRSB8IFwKKyAgICAgICAgICAgICAgICAgIExJU1RfREFURV9USU1FIHwgTElTVF9TWU1MSU5LLAorfTsKKworLyogLUNhZGlsMSAgU3RkIG9wdGlvbnMsIGJ1c3lib3ggYWx3YXlzIHN1cHBvcnRzICovCisvKiAtZ25zeEEgICBTdGQgb3B0aW9ucywgYnVzeWJveCBhbHdheXMgc3VwcG9ydHMgKi8KKy8qIC1RICAgICAgIEdOVSBvcHRpb24sIGJ1c3lib3ggYWx3YXlzIHN1cHBvcnRzICovCisvKiAtayAgICAgICBTRUxpbnV4IG9wdGlvbiwgYnVzeWJveCBhbHdheXMgc3VwcG9ydHMgKGlnbm9yZXMgaWYgIVNFTGludXgpICovCisvKiAgICAgICAgICBTdGQgaGFzIC1rIHdoaWNoIG1lYW5zICJzaG93IHNpemVzIGluIGtieXRlcyIgKi8KKy8qIC1MSFJjdHVyIFN0ZCBvcHRpb25zLCBidXN5Ym94IG9wdGlvbmFsbHkgc3VwcG9ydHMgKi8KKy8qIC1GcCAgICAgIFN0ZCBvcHRpb25zLCBidXN5Ym94IG9wdGlvbmFsbHkgc3VwcG9ydHMgKi8KKy8qIC1TWHZoVHcgIEdOVSBvcHRpb25zLCBidXN5Ym94IG9wdGlvbmFsbHkgc3VwcG9ydHMgKi8KKy8qIC1UIFdJRFRIIElnbm9yZWQgKHdlIGRvbid0IHVzZSB0YWJzIG9uIG91dHB1dCkgKi8KKy8qIC1LWiAgICAgIFNFTGludXggbWFuZGF0ZWQgb3B0aW9ucywgYnVzeWJveCBvcHRpb25hbGx5IHN1cHBvcnRzICovCisvKiAgICAgICAgICAoY29yZXV0aWxzIDguNCBoYXMgbm8gLUssIHJlbW92ZSBpdD8pICovCisvKiAtZSAgICAgICBJIHRoaW5rIHdlIG1hZGUgdGhpcyBvbmUgdXAgKGxvb2tzIHNpbWlsYXIgdG8gR05VIC0tZnVsbC10aW1lKSAqLworLyogV2UgYWxyZWFkeSB1c2VkIHVwIGFsbCAzMiBiaXRzLCBpZiB3ZSBuZWVkIHRvIGFkZCBtb3JlLCBjYW5kaWRhdGVzIGZvciByZW1vdmFsOiAqLworLyogLUssIC1ULCAtZSAoYWRkIC0tZnVsbC10aW1lIGluc3RlYWQpICovCitzdGF0aWMgY29uc3QgY2hhciBsc19vcHRpb25zW10gQUxJR04xID0KKwkiQ2FkaWwxZ25zeFFBayIgICAgICAvKiAxMyBvcHRzLCB0b3RhbCAxMyAqLworCUlGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUygiY2V0dSIpIC8qIDQsIDE3ICovCisJSUZfRkVBVFVSRV9MU19TT1JURklMRVMoIlNYcnYiKSAgLyogNCwgMjEgKi8KKwlJRl9GRUFUVVJFX0xTX0ZJTEVUWVBFUygiRnAiKSAgICAvKiAyLCAyMyAqLworCUlGX0ZFQVRVUkVfTFNfUkVDVVJTSVZFKCJSIikgICAgIC8qIDEsIDI0ICovCisJSUZfU0VMSU5VWCgiS1oiKSAgICAgICAgICAgICAgICAgLyogMiwgMjYgKi8KKwlJRl9GRUFUVVJFX0xTX0ZPTExPV0xJTktTKCJMSCIpICAvKiAyLCAyOCAqLworCUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoImgiKSAgIC8qIDEsIDI5ICovCisJSUZfRkVBVFVSRV9BVVRPV0lEVEgoIlQ6dzoiKSAgICAgLyogMiwgMzEgKi8KKwkvKiB3aXRoIC0tY29sb3IsIHdlIHVzZSBhbGwgMzIgYml0cyAqLzsKK2VudW0geworCS8vT1BUX0MgPSAoMSA8PCAwKSwKKwkvL09QVF9hID0gKDEgPDwgMSksCisJLy9PUFRfZCA9ICgxIDw8IDIpLAorCS8vT1BUX2kgPSAoMSA8PCAzKSwKKwkvL09QVF9sID0gKDEgPDwgNCksCisJLy9PUFRfMSA9ICgxIDw8IDUpLAorCU9QVF9nID0gKDEgPDwgNiksCisJLy9PUFRfbiA9ICgxIDw8IDcpLAorCS8vT1BUX3MgPSAoMSA8PCA4KSwKKwkvL09QVF94ID0gKDEgPDwgOSksCisJT1BUX1EgPSAoMSA8PCAxMCksCisJLy9PUFRfQSA9ICgxIDw8IDExKSwKKwkvL09QVF9rID0gKDEgPDwgMTIpLAorCisJT1BUQklUX2MgPSAxMywKKwlPUFRCSVRfZSwKKwlPUFRCSVRfdCwKKwlPUFRCSVRfdSwKKwlPUFRCSVRfUyA9IE9QVEJJVF9jICsgNCAqIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMsCisJT1BUQklUX1gsIC8qIDE4ICovCisJT1BUQklUX3IsCisJT1BUQklUX3YsCisJT1BUQklUX0YgPSBPUFRCSVRfUyArIDQgKiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMsCisJT1BUQklUX3AsIC8qIDIyICovCisJT1BUQklUX1IgPSBPUFRCSVRfRiArIDIgKiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMsCisJT1BUQklUX0sgPSBPUFRCSVRfUiArIDEgKiBFTkFCTEVfRkVBVFVSRV9MU19SRUNVUlNJVkUsCisJT1BUQklUX1osIC8qIDI1ICovCisJT1BUQklUX0wgPSBPUFRCSVRfSyArIDIgKiBFTkFCTEVfU0VMSU5VWCwKKwlPUFRCSVRfSCwgLyogMjcgKi8KKwlPUFRCSVRfaCA9IE9QVEJJVF9MICsgMiAqIEVOQUJMRV9GRUFUVVJFX0xTX0ZPTExPV0xJTktTLAorCU9QVEJJVF9UID0gT1BUQklUX2ggKyAxICogRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUsCisJT1BUQklUX3csIC8qIDMwICovCisJT1BUQklUX2NvbG9yID0gT1BUQklUX1QgKyAyICogRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRILAorCisJT1BUX2MgPSAoMSA8PCBPUFRCSVRfYykgKiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTLAorCU9QVF9lID0gKDEgPDwgT1BUQklUX2UpICogRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUywKKwlPUFRfdCA9ICgxIDw8IE9QVEJJVF90KSAqIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMsCisJT1BUX3UgPSAoMSA8PCBPUFRCSVRfdSkgKiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTLAorCU9QVF9TID0gKDEgPDwgT1BUQklUX1MpICogRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTLAorCU9QVF9YID0gKDEgPDwgT1BUQklUX1gpICogRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTLAorCU9QVF9yID0gKDEgPDwgT1BUQklUX3IpICogRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTLAorCU9QVF92ID0gKDEgPDwgT1BUQklUX3YpICogRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTLAorCU9QVF9GID0gKDEgPDwgT1BUQklUX0YpICogRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTLAorCU9QVF9wID0gKDEgPDwgT1BUQklUX3ApICogRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTLAorCU9QVF9SID0gKDEgPDwgT1BUQklUX1IpICogRU5BQkxFX0ZFQVRVUkVfTFNfUkVDVVJTSVZFLAorCU9QVF9LID0gKDEgPDwgT1BUQklUX0spICogRU5BQkxFX1NFTElOVVgsCisJT1BUX1ogPSAoMSA8PCBPUFRCSVRfWikgKiBFTkFCTEVfU0VMSU5VWCwKKwlPUFRfTCA9ICgxIDw8IE9QVEJJVF9MKSAqIEVOQUJMRV9GRUFUVVJFX0xTX0ZPTExPV0xJTktTLAorCU9QVF9IID0gKDEgPDwgT1BUQklUX0gpICogRU5BQkxFX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MsCisJT1BUX2ggPSAoMSA8PCBPUFRCSVRfaCkgKiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSwKKwlPUFRfVCA9ICgxIDw8IE9QVEJJVF9UKSAqIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSCwKKwlPUFRfdyA9ICgxIDw8IE9QVEJJVF93KSAqIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSCwKKwlPUFRfY29sb3IgPSAoMSA8PCBPUFRCSVRfY29sb3IpICogRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IsCit9OworCisvKiBUT0RPOiBzaW1wbGUgdG9nZ2xlcyBtYXkgYmUgc3RvcmVkIGFzIE9QVF94eHggYml0cyBpbnN0ZWFkICovCitzdGF0aWMgY29uc3QgdWludDMyX3Qgb3B0X2ZsYWdzW10gPSB7CisJU1RZTEVfQ09MVU1OQVIsCQkgICAgIC8qIEMgKi8KKwlESVNQX0hJRERFTiB8IERJU1BfRE9ULCAgICAgIC8qIGEgKi8KKwlESVNQX05PTElTVCwgICAgICAgICAgICAgICAgIC8qIGQgKi8KKwlMSVNUX0lOTywgICAgICAgICAgICAgICAgICAgIC8qIGkgKi8KKwlMSVNUX0xPTkcgfCBTVFlMRV9MT05HLCAgICAgIC8qIGwgKi8KKwlTVFlMRV9TSU5HTEUsICAgICAgICAgICAgICAgIC8qIDEgKi8KKwlMSVNUX0xPTkcgfCBTVFlMRV9MT05HLCAgICAgIC8qIGcgKGRvbid0IHNob3cgb3duZXIpIC0gaGFuZGxlZCB2aWEgT1BUX2cuIGFzc3VtZXMgbCAqLworCUxJU1RfSURfTlVNRVJJQyB8IExJU1RfTE9ORyB8IFNUWUxFX0xPTkcsIC8qIG4gKGFzc3VtZXMgbCkgKi8KKwlMSVNUX0JMT0NLUywgICAgICAgICAgICAgICAgIC8qIHMgKi8KKwlESVNQX1JPV1MgfCBTVFlMRV9DT0xVTU5BUiwgIC8qIHggKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEgKHF1b3RlIGZpbGVuYW1lKSAtIGhhbmRsZWQgdmlhIE9QVF9RICovCisJRElTUF9ISURERU4sICAgICAgICAgICAgICAgICAvKiBBICovCisJRU5BQkxFX1NFTElOVVggKiAoTElTVF9DT05URVhUfFNUWUxFX1NJTkdMRSksIC8qIGsgKGlnbm9yZWQgaWYgIVNFTElOVVgpICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUworCVRJTUVfQ0hBTkdFIHwgKEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUyAqIFNPUlRfQ1RJTUUpLCAvKiBjICovCisJTElTVF9GVUxMVElNRSwgICAgICAgICAgICAgICAvKiBlICovCisJRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTICogU09SVF9NVElNRSwgLyogdCAqLworCVRJTUVfQUNDRVNTIHwgKEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUyAqIFNPUlRfQVRJTUUpLCAvKiB1ICovCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMKKwlTT1JUX1NJWkUsICAgICAgICAgICAgICAgICAgIC8qIFMgKi8KKwlTT1JUX0VYVCwgICAgICAgICAgICAgICAgICAgIC8qIFggKi8KKwlTT1JUX1JFVkVSU0UsICAgICAgICAgICAgICAgIC8qIHIgKi8KKwlTT1JUX1ZFUlNJT04sICAgICAgICAgICAgICAgIC8qIHYgKi8KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUworCUxJU1RfRklMRVRZUEUgfCBMSVNUX0NMQVNTSUZZLCAvKiBGICovCisJTElTVF9GSUxFVFlQRSwgICAgICAgICAgICAgICAvKiBwICovCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19SRUNVUlNJVkUKKwlESVNQX1JFQ1VSU0lWRSwgICAgICAgICAgICAgIC8qIFIgKi8KKyNlbmRpZgorI2lmIEVOQUJMRV9TRUxJTlVYCisJTElTVF9NT0RFQklUU3xMSVNUX05MSU5LU3xMSVNUX0NPTlRFWFR8TElTVF9TSVpFfExJU1RfREFURV9USU1FfFNUWUxFX1NJTkdMRSwgLyogSyAqLworCUxJU1RfTU9ERUJJVFN8TElTVF9JRF9OQU1FfExJU1RfQ09OVEVYVHxTVFlMRV9TSU5HTEUsIC8qIFogKi8KKyNlbmRpZgorCSgxVSA8PCAzMSkKKwkvKiBvcHRpb25zIGFmdGVyIFogYXJlIG5vdCBwcm9jZXNzZWQgdGhyb3VnaCBvcHRfZmxhZ3MgKi8KK307CisKKworLyoKKyAqIGEgZGlyZWN0b3J5IGVudHJ5IGFuZCBpdHMgc3RhdCBpbmZvCisgKi8KK3N0cnVjdCBkbm9kZSB7CisJY29uc3QgY2hhciAqbmFtZTsgICAgICAgLyogdXN1YWxseSBiYXNlbmFtZSwgYnV0IHRoaW5rICJscyAtbCBkaXIvZmlsZSIgKi8KKwljb25zdCBjaGFyICpmdWxsbmFtZTsgICAvKiBmdWxsIG5hbWUgKHVzYWJsZSBmb3Igc3RhdCBldGMpICovCisJc3RydWN0IGRub2RlICpkbl9uZXh0OyAgLyogZm9yIGxpbmtlZCBsaXN0ICovCisJSUZfU0VMSU5VWChzZWN1cml0eV9jb250ZXh0X3Qgc2lkOykKKwlzbWFsbGludCBmbmFtZV9hbGxvY2F0ZWQ7CisKKwkvKiBVc2VkIHRvIGF2b2lkIHJlLWRvaW5nIFtsXXN0YXQgYXQgcHJpbnRvdXQgc3RhZ2UKKwkgKiBpZiB3ZSBhbHJlYWR5IGNvbGxlY3RlZCBuZWVkZWQgZGF0YSBpbiBzY2FuIHN0YWdlOgorCSAqLworCW1vZGVfdCAgICBkbl9tb2RlX2xzdGF0OyAgIC8qIG9idGFpbmVkIHdpdGggbHN0YXQsIG9yIDAgKi8KKwltb2RlX3QgICAgZG5fbW9kZV9zdGF0OyAgICAvKiBvYnRhaW5lZCB3aXRoIHN0YXQsIG9yIDAgKi8KKworLy8Jc3RydWN0IHN0YXQgZHN0YXQ7CisvLyBzdHJ1Y3Qgc3RhdCBpcyBodWdlLiBXZSBkb24ndCBuZWVkIGl0IGluIGZ1bGwuCisvLyBBdCBsZWFzdCB3ZSBkb24ndCBuZWVkIHN0X2RldiBhbmQgc3RfYmxrc2l6ZSwKKy8vIGJ1dCB0aGVyZSBhcmUgaW52aXNpYmxlIGZpZWxkcyBhcyB3ZWxsCisvLyAoc3VjaCBhcyBuYW5vc2Vjb25kLXJlc29sdXRpb24gdGltZXNwYW1wcykKKy8vIGFuZCBwYWRkaW5nLCB3aGljaCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gc3RvcmUuCisvLyBXZSBhbHNvIGNhbiBwcmUtcGFyc2UgZGV2X3QgZG5fcmRldiAoaW4gZ2xpYmMsIGl0J3MgaHVnZSkuCisvLyBPbiAzMi1iaXQgdWNsaWJjOiBkbm9kZSBzaXplIHdlbnQgZnJvbSAxMTIgdG8gODQgYnl0ZXMuCisvLworCS8qIFNhbWUgbmFtZXMgYXMgaW4gc3RydWN0IHN0YXQsIGJ1dCB3aXRoIGRuXyBpbnN0ZWFkIG9mIHN0XyBwZng6ICovCisJbW9kZV90ICAgIGRuX21vZGU7IC8qIG9idGFpbmVkIHdpdGggbHN0YXQgT1Igc3RhdCwgZGVwZW5kaW5nIG9uIC1MIGV0YyAqLworCW9mZl90ICAgICBkbl9zaXplOworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMgfHwgRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTCisJdGltZV90ICAgIGRuX2F0aW1lOworCXRpbWVfdCAgICBkbl9tdGltZTsKKwl0aW1lX3QgICAgZG5fY3RpbWU7CisjZW5kaWYKKwlpbm9fdCAgICAgZG5faW5vOworCWJsa2NudF90ICBkbl9ibG9ja3M7CisJbmxpbmtfdCAgIGRuX25saW5rOworCXVpZF90ICAgICBkbl91aWQ7CisJZ2lkX3QgICAgIGRuX2dpZDsKKwlpbnQgICAgICAgZG5fcmRldl9tYWo7CisJaW50ICAgICAgIGRuX3JkZXZfbWluOworLy8JZGV2X3QgICAgIGRuX2RldjsKKy8vCWJsa3NpemVfdCBkbl9ibGtzaXplOworfTsKKworc3RydWN0IGdsb2JhbHMgeworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJc21hbGxpbnQgc2hvd19jb2xvcjsKKyMgZGVmaW5lIEdfc2hvd19jb2xvciAoRy5zaG93X2NvbG9yKQorI2Vsc2UKKyMgZGVmaW5lIEdfc2hvd19jb2xvciAwCisjZW5kaWYKKwlzbWFsbGludCBleGl0X2NvZGU7CisJdW5zaWduZWQgYWxsX2ZtdDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgKKwl1bnNpZ25lZCB0ZXJtaW5hbF93aWR0aDsKKyMgZGVmaW5lIEdfdGVybWluYWxfd2lkdGggKEcudGVybWluYWxfd2lkdGgpCisjZWxzZQorIyBkZWZpbmUgR190ZXJtaW5hbF93aWR0aCBURVJNSU5BTF9XSURUSAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUworCS8qIERvIHRpbWUoKSBqdXN0IG9uY2UuIFNhdmVzIG9uZSBzeXNjYWxsIHBlciBmaWxlIGZvciAibHMgLWwiICovCisJdGltZV90IGN1cnJlbnRfdGltZV90OworI2VuZGlmCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwkvKiB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlY2F1c2Ugb2YgTk9FWEVDICovIFwKKwltZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7IFwKKwlJRl9GRUFUVVJFX0FVVE9XSURUSChHX3Rlcm1pbmFsX3dpZHRoID0gVEVSTUlOQUxfV0lEVEg7KSBcCisJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKHRpbWUoJkcuY3VycmVudF90aW1lX3QpOykgXAorfSB3aGlsZSAoMCkKKworCisvKioqIE91dHB1dCBjb2RlICoqKi8KKworCisvKiBGWUkgdHlwZSB2YWx1ZXM6IDE6ZmlmbyAyOmNoYXIgNDpkaXIgNjpibGsgODpmaWxlIDEwOmxpbmsgMTI6c29ja2V0CisgKiAodmFyaW91cyB3YWNreSBPU2VzOiAxMzpTdW4gZG9vciAxNDpCU0Qgd2hpdGVvdXQgNTpYRU5JWCBuYW1lZCBmaWxlCisgKiAgMy83Om11bHRpcGxleGVkIGNoYXIvYmxvY2sgZGV2aWNlKQorICogYW5kIHdlIHVzZSAwIGZvciB1bmtub3duIGFuZCAxNSBmb3IgZXhlY3V0YWJsZXMgKHNlZSBiZWxvdykgKi8KKyNkZWZpbmUgVFlQRUlOREVYKG1vZGUpICgoKG1vZGUpID4+IDEyKSAmIDB4MGYpCisvKiAgICAgICAgICAgICAgICAgICAgICAgdW4gIGZpIGNociAtICAgZGlyIC0gIGJsayAgLSAgZmlsZSAtICBsaW5rIC0gc29jayAtICAgLSBleGUgKi8KKyNkZWZpbmUgQVBQQ0hBUihtb2RlKSAgICgiXDAiInwiIlwwIiJcMCIiLyIiXDAiIlwwIiJcMCIiXDAiIlwwIiJAIiJcMCIiPSIiXDAiIlwwIiJcMCIgW1RZUEVJTkRFWChtb2RlKV0pCisvKiAwMzYgYmxhY2sgZm9yZWdyb3VuZCAgICAgICAgICAgICAgMDUwIGJsYWNrIGJhY2tncm91bmQKKyAgIDAzNyByZWQgZm9yZWdyb3VuZCAgICAgICAgICAgICAgICAwNTEgcmVkIGJhY2tncm91bmQKKyAgIDA0MCBncmVlbiBmb3JlZ3JvdW5kICAgICAgICAgICAgICAwNTIgZ3JlZW4gYmFja2dyb3VuZAorICAgMDQxIGJyb3duIGZvcmVncm91bmQgICAgICAgICAgICAgIDA1MyBicm93biBiYWNrZ3JvdW5kCisgICAwNDIgYmx1ZSBmb3JlZ3JvdW5kICAgICAgICAgICAgICAgMDU0IGJsdWUgYmFja2dyb3VuZAorICAgMDQzIG1hZ2VudGEgKHB1cnBsZSkgZm9yZWdyb3VuZCAgIDA1NSBtYWdlbnRhIGJhY2tncm91bmQKKyAgIDA0NCBjeWFuIChsaWdodCBibHVlKSBmb3JlZ3JvdW5kICAwNTYgY3lhbiBiYWNrZ3JvdW5kCisgICAwNDUgZ3JheSBmb3JlZ3JvdW5kICAgICAgICAgICAgICAgMDU3IHdoaXRlIGJhY2tncm91bmQKKyovCisjZGVmaW5lIENPTE9SKG1vZGUpICggXAorCS8qdW4gIGZpICBjaHIgIC0gIGRpciAgLSAgYmxrICAtICBmaWxlIC0gIGxpbmsgLSAgc29jayAtICAgLSAgZXhlICovIFwKKwkiXDAzN1wwNDNcMDQzXDA0NVwwNDJcMDQ1XDA0M1wwNDNcMDAwXDA0NVwwNDRcMDQ1XDA0M1wwNDVcMDQ1XDA0MCIgXAorCVtUWVBFSU5ERVgobW9kZSldKQorLyogU2VsZWN0IG5vcm1hbCAoMCkgW2FjdHVhbGx5ICJyZXNldCBhbGwiXSBvciBib2xkICgxKQorICogKG90aGVyIGF0dHJpYnV0ZXMgYXJlIDI6ZGltIDQ6dW5kZXJsaW5lIDU6YmxpbmsgNzpyZXZlcnNlLAorICogIGxldCdzIHVzZSA3IGZvciAiaW1wb3NzaWJsZSIgdHlwZXMsIGp1c3QgZm9yIGZ1bikKKyAqIE5vdGU6IGNvcmV1dGlscyA2LjkgdXNlcyBpbnZlcnRlZCByZWQgZm9yIHNldHVpZCBiaW5hcmllcy4KKyAqLworI2RlZmluZSBBVFRSKG1vZGUpICggXAorCS8qdW4gZmkgY2hyIC0gZGlyIC0gYmxrIC0gZmlsZS0gbGluay0gc29jay0gLSAgZXhlICovIFwKKwkiXDAxXDAwXDAxXDA3XDAxXDA3XDAxXDA3XDAwXDA3XDAxXDA3XDAxXDA3XDA3XDAxIiBcCisJW1RZUEVJTkRFWChtb2RlKV0pCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19DT0xPUgorLyogbW9kZSBvZiB6ZXJvIGlzIGludGVycHJldGVkIGFzICJ1bmtub3duIiAoc3RhdCBmYWlsZWQpICovCitzdGF0aWMgY2hhciBmZ2NvbG9yKG1vZGVfdCBtb2RlKQoreworCWlmIChTX0lTUkVHKG1vZGUpICYmIChtb2RlICYgKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkpKQorCQlyZXR1cm4gQ09MT1IoMHhGMDAwKTsJLyogRmlsZSBpcyBleGVjdXRhYmxlIC4uLiAqLworCXJldHVybiBDT0xPUihtb2RlKTsKK30KK3N0YXRpYyBjaGFyIGJvbGQobW9kZV90IG1vZGUpCit7CisJaWYgKFNfSVNSRUcobW9kZSkgJiYgKG1vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkpCisJCXJldHVybiBBVFRSKDB4RjAwMCk7CS8qIEZpbGUgaXMgZXhlY3V0YWJsZSAuLi4gKi8KKwlyZXR1cm4gQVRUUihtb2RlKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTCitzdGF0aWMgY2hhciBhcHBlbmRfY2hhcihtb2RlX3QgbW9kZSkKK3sKKwlpZiAoIShHLmFsbF9mbXQgJiBMSVNUX0ZJTEVUWVBFKSkKKwkJcmV0dXJuICdcMCc7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiAnLyc7CisJaWYgKCEoRy5hbGxfZm10ICYgTElTVF9DTEFTU0lGWSkpCisJCXJldHVybiAnXDAnOworCWlmIChTX0lTUkVHKG1vZGUpICYmIChtb2RlICYgKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkpKQorCQlyZXR1cm4gJyonOworCXJldHVybiBBUFBDSEFSKG1vZGUpOworfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjYWxjX25hbWVfbGVuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbGVuOworCXVuaV9zdGF0X3QgdW5pX3N0YXQ7CisKKwkvLyBUT0RPOiBxdW90ZSB0YWIgYXMgXHQsIGV0YywgaWYgLVEKKwluYW1lID0gcHJpbnRhYmxlX3N0cmluZygmdW5pX3N0YXQsIG5hbWUpOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9RKSkgeworCQlyZXR1cm4gdW5pX3N0YXQudW5pY29kZV93aWR0aDsKKwl9CisKKwlsZW4gPSAyICsgdW5pX3N0YXQudW5pY29kZV93aWR0aDsKKwl3aGlsZSAoKm5hbWUpIHsKKwkJaWYgKCpuYW1lID09ICciJyB8fCAqbmFtZSA9PSAnXFwnKSB7CisJCQlsZW4rKzsKKwkJfQorCQluYW1lKys7CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHVzZWQgY29sdW1ucy4KKyAqIE5vdGUgdGhhdCBvbmx5IFNUWUxFX0NPTFVNTkFSIHVzZXMgcmV0dXJuIHZhbHVlLgorICogU1RZTEVfU0lOR0xFIGFuZCBTVFlMRV9MT05HIGRvbid0IGNhcmUuCisgKiBjb3JldXRpbHMgNy4yIGFsc28gc3VwcG9ydHM6CisgKiBscyAtYiAoLS1lc2NhcGUpID0gb2N0YWwgZXNjYXBlcyAoYWx0aG91Z2ggaXQgZG9lc24ndCBsb29rIGxpa2Ugd29ya2luZykKKyAqIGxzIC1OICgtLWxpdGVyYWwpID0gbm90IGVzY2FwZSBhdCBhbGwKKyAqLworc3RhdGljIHVuc2lnbmVkIHByaW50X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsZW47CisJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKworCS8vIFRPRE86IHF1b3RlIHRhYiBhcyBcdCwgZXRjLCBpZiAtUQorCW5hbWUgPSBwcmludGFibGVfc3RyaW5nKCZ1bmlfc3RhdCwgbmFtZSk7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1EpKSB7CisJCWZwdXRzKG5hbWUsIHN0ZG91dCk7CisJCXJldHVybiB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworCX0KKworCWxlbiA9IDIgKyB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworCXB1dGNoYXIoJyInKTsKKwl3aGlsZSAoKm5hbWUpIHsKKwkJaWYgKCpuYW1lID09ICciJyB8fCAqbmFtZSA9PSAnXFwnKSB7CisJCQlwdXRjaGFyKCdcXCcpOworCQkJbGVuKys7CisJCX0KKwkJcHV0Y2hhcigqbmFtZSk7CisJCW5hbWUrKzsKKwl9CisJcHV0Y2hhcignIicpOworCXJldHVybiBsZW47Cit9CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHVzZWQgY29sdW1ucy4KKyAqIE5vdGUgdGhhdCBvbmx5IFNUWUxFX0NPTFVNTkFSIHVzZXMgcmV0dXJuIHZhbHVlLAorICogU1RZTEVfU0lOR0xFIGFuZCBTVFlMRV9MT05HIGRvbid0IGNhcmUuCisgKi8KK3N0YXRpYyBOT0lOTElORSB1bnNpZ25lZCBkaXNwbGF5X3NpbmdsZShjb25zdCBzdHJ1Y3QgZG5vZGUgKmRuKQoreworCXVuc2lnbmVkIGNvbHVtbiA9IDA7CisJY2hhciAqbHBhdGg7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTIHx8IEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwljaGFyIGFwcGVuZDsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTCisJYXBwZW5kID0gYXBwZW5kX2NoYXIoZG4tPmRuX21vZGUpOworI2VuZGlmCisKKwkvKiBEbyByZWFkbGluayBlYXJseSwgc28gdGhhdCBpZiBpdCBmYWlscywgZXJyb3IgbWVzc2FnZQorCSAqIGRvZXMgbm90IGFwcGVhciAqaW5zaWRlKiB0aGUgImxzIC1sIiBsaW5lICovCisJbHBhdGggPSBOVUxMOworCWlmIChHLmFsbF9mbXQgJiBMSVNUX1NZTUxJTkspCisJCWlmIChTX0lTTE5LKGRuLT5kbl9tb2RlKSkKKwkJCWxwYXRoID0geG1hbGxvY19yZWFkbGlua19vcl93YXJuKGRuLT5mdWxsbmFtZSk7CisKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9JTk8pCisJCWNvbHVtbiArPSBwcmludGYoIiU3bGx1ICIsIChsb25nIGxvbmcpIGRuLT5kbl9pbm8pOworLy9UT0RPOiAtaCBzaG91bGQgYWZmZWN0IC1zIHRvbzoKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9CTE9DS1MpCisJCWNvbHVtbiArPSBwcmludGYoIiU2Ik9GRl9GTVQidSAiLCAob2ZmX3QpIChkbi0+ZG5fYmxvY2tzID4+IDEpKTsKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9NT0RFQklUUykKKwkJY29sdW1uICs9IHByaW50ZigiJS0xMHMgIiwgKGNoYXIgKikgYmJfbW9kZV9zdHJpbmcoZG4tPmRuX21vZGUpKTsKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9OTElOS1MpCisJCWNvbHVtbiArPSBwcmludGYoIiU0bHUgIiwgKGxvbmcpIGRuLT5kbl9ubGluayk7CisJaWYgKEcuYWxsX2ZtdCAmIExJU1RfSURfTlVNRVJJQykgeworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9nKQorCQkJY29sdW1uICs9IHByaW50ZigiJS04dSAiLCAoaW50KSBkbi0+ZG5fZ2lkKTsKKwkJZWxzZQorCQkJY29sdW1uICs9IHByaW50ZigiJS04dSAlLTh1ICIsCisJCQkJCShpbnQpIGRuLT5kbl91aWQsCisJCQkJCShpbnQpIGRuLT5kbl9naWQpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19VU0VSTkFNRQorCWVsc2UgaWYgKEcuYWxsX2ZtdCAmIExJU1RfSURfTkFNRSkgeworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9nKSB7CisJCQljb2x1bW4gKz0gcHJpbnRmKCIlLTguOHMgIiwKKwkJCQlnZXRfY2FjaGVkX2dyb3VwbmFtZShkbi0+ZG5fZ2lkKSk7CisJCX0gZWxzZSB7CisJCQljb2x1bW4gKz0gcHJpbnRmKCIlLTguOHMgJS04LjhzICIsCisJCQkJZ2V0X2NhY2hlZF91c2VybmFtZShkbi0+ZG5fdWlkKSwKKwkJCQlnZXRfY2FjaGVkX2dyb3VwbmFtZShkbi0+ZG5fZ2lkKSk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9TSVpFKSB7CisJCWlmIChTX0lTQkxLKGRuLT5kbl9tb2RlKSB8fCBTX0lTQ0hSKGRuLT5kbl9tb2RlKSkgeworCQkJY29sdW1uICs9IHByaW50ZigiJTR1LCAlM3UgIiwKKwkJCQkJZG4tPmRuX3JkZXZfbWFqLAorCQkJCQlkbi0+ZG5fcmRldl9taW4pOworCQl9IGVsc2UgeworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfaCkgeworCQkJCWNvbHVtbiArPSBwcmludGYoIiUiSFVNQU5fUkVBREFCTEVfTUFYX1dJRFRIX1NUUiJzICIsCisJCQkJCS8qIHByaW50IHNpemUsIHNob3cgb25lIGZyYWN0aW9uYWwsIHVzZSBzdWZmaXhlcyAqLworCQkJCQltYWtlX2h1bWFuX3JlYWRhYmxlX3N0cihkbi0+ZG5fc2l6ZSwgMSwgMCkKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQljb2x1bW4gKz0gcHJpbnRmKCIlOSJPRkZfRk1UInUgIiwgZG4tPmRuX3NpemUpOworCQkJfQorCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMKKwlpZiAoRy5hbGxfZm10ICYgKExJU1RfRlVMTFRJTUV8TElTVF9EQVRFX1RJTUUpKSB7CisJCWNoYXIgKmZpbGV0aW1lOworCQl0aW1lX3QgdHRpbWUgPSBkbi0+ZG5fbXRpbWU7CisJCWlmIChHLmFsbF9mbXQgJiBUSU1FX0FDQ0VTUykKKwkJCXR0aW1lID0gZG4tPmRuX2F0aW1lOworCQlpZiAoRy5hbGxfZm10ICYgVElNRV9DSEFOR0UpCisJCQl0dGltZSA9IGRuLT5kbl9jdGltZTsKKwkJZmlsZXRpbWUgPSBjdGltZSgmdHRpbWUpOworCQkvKiBmaWxldGltZSdzIGZvcm1hdDogIldlZCBKdW4gMzAgMjE6NDk6MDggMTk5M1xuIiAqLworCQlpZiAoRy5hbGxfZm10ICYgTElTVF9GVUxMVElNRSkgeyAvKiAtZSAqLworCQkJLyogTm90ZTogY29yZXV0aWxzIDguNCBscyAtLWZ1bGwtdGltZSBwcmludHM6CisJCQkgKiAyMDA5LTA3LTEzIDE3OjQ5OjI3LjAwMDAwMDAwMCArMDIwMAorCQkJICovCisJCQljb2x1bW4gKz0gcHJpbnRmKCIlLjI0cyAiLCBmaWxldGltZSk7CisJCX0gZWxzZSB7IC8qIExJU1RfREFURV9USU1FICovCisJCQkvKiBHLmN1cnJlbnRfdGltZV90IH49PSB0aW1lKE5VTEwpICovCisJCQl0aW1lX3QgYWdlID0gRy5jdXJyZW50X3RpbWVfdCAtIHR0aW1lOworCQkJcHJpbnRmKCIlLjZzICIsIGZpbGV0aW1lICsgNCk7IC8qICJKdW4gMzAiICovCisJCQlpZiAoYWdlIDwgMzYwMEwgKiAyNCAqIDM2NSAvIDIgJiYgYWdlID4gLTE1ICogNjApIHsKKwkJCQkvKiBoaDptbSBpZiBsZXNzIHRoYW4gNiBtb250aHMgb2xkICovCisJCQkJcHJpbnRmKCIlLjVzICIsIGZpbGV0aW1lICsgMTEpOworCQkJfSBlbHNlIHsgLyogeWVhci4gYnVnZ3kgaWYgeWVhciA+IDk5OTkgOykgKi8KKwkJCQlwcmludGYoIiAlLjRzICIsIGZpbGV0aW1lICsgMjApOworCQkJfQorCQkJY29sdW1uICs9IDEzOworCQl9CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9DT05URVhUKSB7CisJCWNvbHVtbiArPSBwcmludGYoIiUtMzJzICIsIGRuLT5zaWQgPyBkbi0+c2lkIDogInVua25vd24iKTsKKwkJZnJlZWNvbihkbi0+c2lkKTsKKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJaWYgKEdfc2hvd19jb2xvcikgeworCQltb2RlX3QgbW9kZSA9IGRuLT5kbl9tb2RlX2xzdGF0OworCQlpZiAoIW1vZGUpCisJCQlpZiAobHN0YXQoZG4tPmZ1bGxuYW1lLCAmc3RhdGJ1ZikgPT0gMCkKKwkJCQltb2RlID0gc3RhdGJ1Zi5zdF9tb2RlOworCQlwcmludGYoIlwwMzNbJXU7JXVtIiwgYm9sZChtb2RlKSwgZmdjb2xvcihtb2RlKSk7CisJfQorI2VuZGlmCisJY29sdW1uICs9IHByaW50X25hbWUoZG4tPm5hbWUpOworCWlmIChHX3Nob3dfY29sb3IpIHsKKwkJcHJpbnRmKCJcMDMzWzBtIik7CisJfQorCisJaWYgKGxwYXRoKSB7CisJCXByaW50ZigiIC0+ICIpOworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUyB8fCBFTkFCTEVfRkVBVFVSRV9MU19DT0xPUgorCQlpZiAoKEcuYWxsX2ZtdCAmIExJU1RfRklMRVRZUEUpIHx8IEdfc2hvd19jb2xvcikgeworCQkJbW9kZV90IG1vZGUgPSBkbi0+ZG5fbW9kZV9zdGF0OworCQkJaWYgKCFtb2RlKQorCQkJCWlmIChzdGF0KGRuLT5mdWxsbmFtZSwgJnN0YXRidWYpID09IDApCisJCQkJCW1vZGUgPSBzdGF0YnVmLnN0X21vZGU7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUworCQkJYXBwZW5kID0gYXBwZW5kX2NoYXIobW9kZSk7CisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJCQlpZiAoR19zaG93X2NvbG9yKSB7CisJCQkJcHJpbnRmKCJcMDMzWyV1OyV1bSIsIGJvbGQobW9kZSksIGZnY29sb3IobW9kZSkpOworCQkJfQorIyBlbmRpZgorCQl9CisjZW5kaWYKKwkJY29sdW1uICs9IHByaW50X25hbWUobHBhdGgpICsgNDsKKwkJZnJlZShscGF0aCk7CisJCWlmIChHX3Nob3dfY29sb3IpIHsKKwkJCXByaW50ZigiXDAzM1swbSIpOworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUworCWlmIChHLmFsbF9mbXQgJiBMSVNUX0ZJTEVUWVBFKSB7CisJCWlmIChhcHBlbmQpIHsKKwkJCXB1dGNoYXIoYXBwZW5kKTsKKwkJCWNvbHVtbisrOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gY29sdW1uOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2ZpbGVzKHN0cnVjdCBkbm9kZSAqKmRuLCB1bnNpZ25lZCBuZmlsZXMpCit7CisJdW5zaWduZWQgaSwgbmNvbHMsIG5yb3dzLCByb3csIG5jOworCXVuc2lnbmVkIGNvbHVtbjsKKwl1bnNpZ25lZCBuZXh0dGFiOworCXVuc2lnbmVkIGNvbHVtbl93aWR0aCA9IDA7IC8qIHVzZWQgb25seSBieSBTVFlMRV9DT0xVTU5BUiAqLworCisJaWYgKEcuYWxsX2ZtdCAmIFNUWUxFX0xPTkcpIHsgLyogU1RZTEVfTE9ORyBvciBTVFlMRV9TSU5HTEUgKi8KKwkJbmNvbHMgPSAxOworCX0gZWxzZSB7CisJCS8qIGZpbmQgdGhlIGxvbmdlc3QgZmlsZSBuYW1lLCB1c2UgdGhhdCBhcyB0aGUgY29sdW1uIHdpZHRoICovCisJCWZvciAoaSA9IDA7IGRuW2ldOyBpKyspIHsKKwkJCWludCBsZW4gPSBjYWxjX25hbWVfbGVuKGRuW2ldLT5uYW1lKTsKKwkJCWlmIChjb2x1bW5fd2lkdGggPCBsZW4pCisJCQkJY29sdW1uX3dpZHRoID0gbGVuOworCQl9CisJCWNvbHVtbl93aWR0aCArPSAxICsKKwkJCUlGX1NFTElOVVgoICgoRy5hbGxfZm10ICYgTElTVF9DT05URVhUKSA/IDMzIDogMCkgKyApCisJCQkJKChHLmFsbF9mbXQgJiBMSVNUX0lOTykgPyA4IDogMCkgKworCQkJCSgoRy5hbGxfZm10ICYgTElTVF9CTE9DS1MpID8gNSA6IDApOworCQluY29scyA9ICh1bnNpZ25lZClHX3Rlcm1pbmFsX3dpZHRoIC8gY29sdW1uX3dpZHRoOworCX0KKworCWlmIChuY29scyA+IDEpIHsKKwkJbnJvd3MgPSBuZmlsZXMgLyBuY29sczsKKwkJaWYgKG5yb3dzICogbmNvbHMgPCBuZmlsZXMpCisJCQlucm93cysrOyAgICAgICAgICAgICAgICAvKiByb3VuZCB1cCBmcmFjdGlvbmFscyAqLworCX0gZWxzZSB7CisJCW5yb3dzID0gbmZpbGVzOworCQluY29scyA9IDE7CisJfQorCisJY29sdW1uID0gMDsKKwluZXh0dGFiID0gMDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IG5yb3dzOyByb3crKykgeworCQlmb3IgKG5jID0gMDsgbmMgPCBuY29sczsgbmMrKykgeworCQkJLyogcmVhY2ggaW50byB0aGUgYXJyYXkgYmFzZWQgb24gdGhlIGNvbHVtbiBhbmQgcm93ICovCisJCQlpZiAoRy5hbGxfZm10ICYgRElTUF9ST1dTKQorCQkJCWkgPSAocm93ICogbmNvbHMpICsgbmM7CS8qIGRpc3BsYXkgYWNyb3NzIHJvdyAqLworCQkJZWxzZQorCQkJCWkgPSAobmMgKiBucm93cykgKyByb3c7CS8qIGRpc3BsYXkgYnkgY29sdW1uICovCisJCQlpZiAoaSA8IG5maWxlcykgeworCQkJCWlmIChjb2x1bW4gPiAwKSB7CisJCQkJCW5leHR0YWIgLT0gY29sdW1uOworCQkJCQlwcmludGYoIiUqcyAiLCBuZXh0dGFiLCAiIik7CisJCQkJCWNvbHVtbiArPSBuZXh0dGFiICsgMTsKKwkJCQl9CisJCQkJbmV4dHRhYiA9IGNvbHVtbiArIGNvbHVtbl93aWR0aDsKKwkJCQljb2x1bW4gKz0gZGlzcGxheV9zaW5nbGUoZG5baV0pOworCQkJfQorCQl9CisJCXB1dGNoYXIoJ1xuJyk7CisJCWNvbHVtbiA9IDA7CisJfQorfQorCisKKy8qKiogRGlyIHNjYW5uaW5nIGNvZGUgKioqLworCitzdGF0aWMgc3RydWN0IGRub2RlICpteV9zdGF0KGNvbnN0IGNoYXIgKmZ1bGxuYW1lLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZm9yY2VfZm9sbG93KQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJc3RydWN0IGRub2RlICpjdXI7CisKKwljdXIgPSB4emFsbG9jKHNpemVvZigqY3VyKSk7CisJY3VyLT5mdWxsbmFtZSA9IGZ1bGxuYW1lOworCWN1ci0+bmFtZSA9IG5hbWU7CisKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfTCkgfHwgZm9yY2VfZm9sbG93KSB7CisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKGlzX3NlbGludXhfZW5hYmxlZCgpKSAgeworCQkJIGdldGZpbGVjb24oZnVsbG5hbWUsICZjdXItPnNpZCk7CisJCX0KKyNlbmRpZgorCQlpZiAoc3RhdChmdWxsbmFtZSwgJnN0YXRidWYpKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhmdWxsbmFtZSk7CisJCQlHLmV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJCWZyZWUoY3VyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWN1ci0+ZG5fbW9kZV9zdGF0ID0gc3RhdGJ1Zi5zdF9tb2RlOworCX0gZWxzZSB7CisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKGlzX3NlbGludXhfZW5hYmxlZCgpKSB7CisJCQlsZ2V0ZmlsZWNvbihmdWxsbmFtZSwgJmN1ci0+c2lkKTsKKwkJfQorI2VuZGlmCisJCWlmIChsc3RhdChmdWxsbmFtZSwgJnN0YXRidWYpKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhmdWxsbmFtZSk7CisJCQlHLmV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJCWZyZWUoY3VyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWN1ci0+ZG5fbW9kZV9sc3RhdCA9IHN0YXRidWYuc3RfbW9kZTsKKwl9CisKKwkvKiBjdXItPmRzdGF0ID0gc3RhdGJ1ZjogKi8KKwljdXItPmRuX21vZGUgICA9IHN0YXRidWYuc3RfbW9kZSAgOworCWN1ci0+ZG5fc2l6ZSAgID0gc3RhdGJ1Zi5zdF9zaXplICA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyB8fCBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMKKwljdXItPmRuX2F0aW1lICA9IHN0YXRidWYuc3RfYXRpbWUgOworCWN1ci0+ZG5fbXRpbWUgID0gc3RhdGJ1Zi5zdF9tdGltZSA7CisJY3VyLT5kbl9jdGltZSAgPSBzdGF0YnVmLnN0X2N0aW1lIDsKKyNlbmRpZgorCWN1ci0+ZG5faW5vICAgID0gc3RhdGJ1Zi5zdF9pbm8gICA7CisJY3VyLT5kbl9ibG9ja3MgPSBzdGF0YnVmLnN0X2Jsb2NrczsKKwljdXItPmRuX25saW5rICA9IHN0YXRidWYuc3RfbmxpbmsgOworCWN1ci0+ZG5fdWlkICAgID0gc3RhdGJ1Zi5zdF91aWQgICA7CisJY3VyLT5kbl9naWQgICAgPSBzdGF0YnVmLnN0X2dpZCAgIDsKKwljdXItPmRuX3JkZXZfbWFqID0gbWFqb3Ioc3RhdGJ1Zi5zdF9yZGV2KTsKKwljdXItPmRuX3JkZXZfbWluID0gbWlub3Ioc3RhdGJ1Zi5zdF9yZGV2KTsKKworCXJldHVybiBjdXI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjb3VudF9kaXJzKHN0cnVjdCBkbm9kZSAqKmRuLCBpbnQgd2hpY2gpCit7CisJdW5zaWduZWQgZGlycywgYWxsOworCisJaWYgKCFkbikKKwkJcmV0dXJuIDA7CisKKwlkaXJzID0gYWxsID0gMDsKKwlmb3IgKDsgKmRuOyBkbisrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJYWxsKys7CisJCWlmICghU19JU0RJUigoKmRuKS0+ZG5fbW9kZSkpCisJCQljb250aW51ZTsKKworCQluYW1lID0gKCpkbiktPm5hbWU7CisJCWlmICh3aGljaCAhPSBTUExJVF9TVUJESVIgLyogaWYgbm90IHJlcXVlc3RlZCB0byBza2lwIC4gLyAuLiAqLworCQkgLyogb3IgaWYgaXQncyBub3QgLiBvciAuLiAqLworCQkgfHwgbmFtZVswXSAhPSAnLicKKwkJIHx8IChuYW1lWzFdICYmIChuYW1lWzFdICE9ICcuJyB8fCBuYW1lWzJdKSkKKwkJKSB7CisJCQlkaXJzKys7CisJCX0KKwl9CisJcmV0dXJuIHdoaWNoICE9IFNQTElUX0ZJTEUgPyBkaXJzIDogYWxsIC0gZGlyczsKK30KKworLyogZ2V0IG1lbW9yeSB0byBob2xkIGFuIGFycmF5IG9mIHBvaW50ZXJzICovCitzdGF0aWMgc3RydWN0IGRub2RlICoqZG5hbGxvYyh1bnNpZ25lZCBudW0pCit7CisJaWYgKG51bSA8IDEpCisJCXJldHVybiBOVUxMOworCisJbnVtKys7IC8qIHNvIHRoYXQgd2UgaGF2ZSB0ZXJtaW5hdGluZyBOVUxMICovCisJcmV0dXJuIHh6YWxsb2MobnVtICogc2l6ZW9mKHN0cnVjdCBkbm9kZSAqKSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19SRUNVUlNJVkUKK3N0YXRpYyB2b2lkIGRmcmVlKHN0cnVjdCBkbm9kZSAqKmRucCkKK3sKKwl1bnNpZ25lZCBpOworCisJaWYgKGRucCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBkbnBbaV07IGkrKykgeworCQlzdHJ1Y3QgZG5vZGUgKmN1ciA9IGRucFtpXTsKKwkJaWYgKGN1ci0+Zm5hbWVfYWxsb2NhdGVkKQorCQkJZnJlZSgoY2hhciopY3VyLT5mdWxsbmFtZSk7CisJCWZyZWUoY3VyKTsKKwl9CisJZnJlZShkbnApOworfQorI2Vsc2UKKyNkZWZpbmUgZGZyZWUoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiBSZXR1cm5zIE5VTEwtdGVybWluYXRlZCBtYWxsb2NlZCB2ZWN0b3Igb2YgcG9pbnRlcnMgKG9yIE5VTEwpICovCitzdGF0aWMgc3RydWN0IGRub2RlICoqc3BsaXRkbmFycmF5KHN0cnVjdCBkbm9kZSAqKmRuLCBpbnQgd2hpY2gpCit7CisJdW5zaWduZWQgZG5jbnQsIGQ7CisJc3RydWN0IGRub2RlICoqZG5wOworCisJaWYgKGRuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogY291bnQgaG93IG1hbnkgZGlycyBvciBmaWxlcyB0aGVyZSBhcmUgKi8KKwlkbmNudCA9IGNvdW50X2RpcnMoZG4sIHdoaWNoKTsKKworCS8qIGFsbG9jYXRlIGEgZmlsZSBhcnJheSBhbmQgYSBkaXIgYXJyYXkgKi8KKwlkbnAgPSBkbmFsbG9jKGRuY250KTsKKworCS8qIGNvcHkgdGhlIGVudHJ5cyBpbnRvIHRoZSBmaWxlIG9yIGRpciBhcnJheSAqLworCWZvciAoZCA9IDA7ICpkbjsgZG4rKykgeworCQlpZiAoU19JU0RJUigoKmRuKS0+ZG5fbW9kZSkpIHsKKwkJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJCWlmICh3aGljaCA9PSBTUExJVF9GSUxFKQorCQkJCWNvbnRpbnVlOworCisJCQluYW1lID0gKCpkbiktPm5hbWU7CisJCQlpZiAoKHdoaWNoICYgU1BMSVRfRElSKSAvKiBhbnkgZGlyLi4uICovCisJCQkvKiAuLi4gb3Igbm90IC4gb3IgLi4gKi8KKwkJCSB8fCBuYW1lWzBdICE9ICcuJworCQkJIHx8IChuYW1lWzFdICYmIChuYW1lWzFdICE9ICcuJyB8fCBuYW1lWzJdKSkKKwkJCSkgeworCQkJCWRucFtkKytdID0gKmRuOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKHdoaWNoID09IFNQTElUX0ZJTEUpIHsKKwkJCWRucFtkKytdID0gKmRuOworCQl9CisJfQorCXJldHVybiBkbnA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMKK3N0YXRpYyBpbnQgc29ydGNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXN0cnVjdCBkbm9kZSAqZDEgPSAqKHN0cnVjdCBkbm9kZSAqKilhOworCXN0cnVjdCBkbm9kZSAqZDIgPSAqKHN0cnVjdCBkbm9kZSAqKiliOworCXVuc2lnbmVkIHNvcnRfb3B0cyA9IEcuYWxsX2ZtdCAmIFNPUlRfTUFTSzsKKwlvZmZfdCBkaWY7CisKKwlkaWYgPSAwOyAvKiBhc3N1bWUgU09SVF9OQU1FICovCisJLy8gVE9ETzogdXNlIHByZS1pbml0aWFsaXplZCBmdW5jdGlvbiBwb2ludGVyCisJLy8gaW5zdGVhZCBvZiBicmFuY2ggZm9yZXN0CisJaWYgKHNvcnRfb3B0cyA9PSBTT1JUX1NJWkUpIHsKKwkJZGlmID0gKGQyLT5kbl9zaXplIC0gZDEtPmRuX3NpemUpOworCX0gZWxzZQorCWlmIChzb3J0X29wdHMgPT0gU09SVF9BVElNRSkgeworCQlkaWYgPSAoZDItPmRuX2F0aW1lIC0gZDEtPmRuX2F0aW1lKTsKKwl9IGVsc2UKKwlpZiAoc29ydF9vcHRzID09IFNPUlRfQ1RJTUUpIHsKKwkJZGlmID0gKGQyLT5kbl9jdGltZSAtIGQxLT5kbl9jdGltZSk7CisJfSBlbHNlCisJaWYgKHNvcnRfb3B0cyA9PSBTT1JUX01USU1FKSB7CisJCWRpZiA9IChkMi0+ZG5fbXRpbWUgLSBkMS0+ZG5fbXRpbWUpOworCX0gZWxzZQorCWlmIChzb3J0X29wdHMgPT0gU09SVF9ESVIpIHsKKwkJZGlmID0gU19JU0RJUihkMi0+ZG5fbW9kZSkgLSBTX0lTRElSKGQxLT5kbl9tb2RlKTsKKwl9IGVsc2UKKyNpZiBkZWZpbmVkKEhBVkVfU1RSVkVSU0NNUCkgJiYgSEFWRV9TVFJWRVJTQ01QID09IDEKKwlpZiAoc29ydF9vcHRzID09IFNPUlRfVkVSU0lPTikgeworCQlkaWYgPSBzdHJ2ZXJzY21wKGQxLT5uYW1lLCBkMi0+bmFtZSk7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoc29ydF9vcHRzID09IFNPUlRfRVhUKSB7CisJCWRpZiA9IHN0cmNtcChzdHJjaHJudWwoZDEtPm5hbWUsICcuJyksIHN0cmNocm51bChkMi0+bmFtZSwgJy4nKSk7CisJfQorCWlmIChkaWYgPT0gMCkgeworCQkvKiBzb3J0IGJ5IG5hbWUsIHVzZSBhcyB0aWUgYnJlYWtlciBmb3Igb3RoZXIgc29ydHMgKi8KKwkJaWYgKEVOQUJMRV9MT0NBTEVfU1VQUE9SVCkKKwkJCWRpZiA9IHN0cmNvbGwoZDEtPm5hbWUsIGQyLT5uYW1lKTsKKwkJZWxzZQorCQkJZGlmID0gc3RyY21wKGQxLT5uYW1lLCBkMi0+bmFtZSk7CisJfQorCisJLyogTWFrZSBkaWYgZml0IGludG8gYW4gaW50ICovCisJaWYgKHNpemVvZihkaWYpID4gc2l6ZW9mKGludCkpIHsKKwkJZW51bSB7IEJJVFNfVE9fU0hJRlQgPSA4ICogKHNpemVvZihkaWYpIC0gc2l6ZW9mKGludCkpIH07CisJCS8qIHNoaWZ0IGxlYXZpbmcgb25seSAiaW50IiB3b3J0aCBvZiBiaXRzICovCisJCWlmIChkaWYgIT0gMCkgeworCQkJZGlmID0gMSB8IChpbnQpKCh1b2ZmX3QpZGlmID4+IEJJVFNfVE9fU0hJRlQpOworCQl9CisJfQorCisJcmV0dXJuIChHLmFsbF9mbXQgJiBTT1JUX1JFVkVSU0UpID8gLShpbnQpZGlmIDogKGludClkaWY7Cit9CisKK3N0YXRpYyB2b2lkIGRuc29ydChzdHJ1Y3QgZG5vZGUgKipkbiwgaW50IHNpemUpCit7CisJcXNvcnQoZG4sIHNpemUsIHNpemVvZigqZG4pLCBzb3J0Y21wKTsKK30KKworc3RhdGljIHZvaWQgc29ydF9hbmRfZGlzcGxheV9maWxlcyhzdHJ1Y3QgZG5vZGUgKipkbiwgdW5zaWduZWQgbmZpbGVzKQoreworCWRuc29ydChkbiwgbmZpbGVzKTsKKwlkaXNwbGF5X2ZpbGVzKGRuLCBuZmlsZXMpOworfQorI2Vsc2UKKyMgZGVmaW5lIGRuc29ydChkbiwgc2l6ZSkgKCh2b2lkKTApCisjIGRlZmluZSBzb3J0X2FuZF9kaXNwbGF5X2ZpbGVzKGRuLCBuZmlsZXMpIGRpc3BsYXlfZmlsZXMoZG4sIG5maWxlcykKKyNlbmRpZgorCisvKiBSZXR1cm5zIE5VTEwtdGVybWluYXRlZCBtYWxsb2NlZCB2ZWN0b3Igb2YgcG9pbnRlcnMgKG9yIE5VTEwpICovCitzdGF0aWMgc3RydWN0IGRub2RlICoqc2Nhbl9vbmVfZGlyKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkICpuZmlsZXNfcCkKK3sKKwlzdHJ1Y3QgZG5vZGUgKmRuLCAqY3VyLCAqKmRucDsKKwlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwlESVIgKmRpcjsKKwl1bnNpZ25lZCBpLCBuZmlsZXM7CisKKwkqbmZpbGVzX3AgPSAwOworCWRpciA9IHdhcm5fb3BlbmRpcihwYXRoKTsKKwlpZiAoZGlyID09IE5VTEwpIHsKKwkJRy5leGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CisJCXJldHVybiBOVUxMOwkvKiBjb3VsZCBub3Qgb3BlbiB0aGUgZGlyICovCisJfQorCWRuID0gTlVMTDsKKwluZmlsZXMgPSAwOworCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJY2hhciAqZnVsbG5hbWU7CisKKwkJLyogYXJlIHdlIGdvaW5nIHRvIGxpc3QgdGhlIGZpbGUtIGl0IG1heSBiZSAuIG9yIC4uIG9yIGEgaGlkZGVuIGZpbGUgKi8KKwkJaWYgKGVudHJ5LT5kX25hbWVbMF0gPT0gJy4nKSB7CisJCQlpZiAoKCFlbnRyeS0+ZF9uYW1lWzFdIHx8IChlbnRyeS0+ZF9uYW1lWzFdID09ICcuJyAmJiAhZW50cnktPmRfbmFtZVsyXSkpCisJCQkgJiYgIShHLmFsbF9mbXQgJiBESVNQX0RPVCkKKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCEoRy5hbGxfZm10ICYgRElTUF9ISURERU4pKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWZ1bGxuYW1lID0gY29uY2F0X3BhdGhfZmlsZShwYXRoLCBlbnRyeS0+ZF9uYW1lKTsKKwkJY3VyID0gbXlfc3RhdChmdWxsbmFtZSwgYmJfYmFzZW5hbWUoZnVsbG5hbWUpLCAwKTsKKwkJaWYgKCFjdXIpIHsKKwkJCWZyZWUoZnVsbG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJY3VyLT5mbmFtZV9hbGxvY2F0ZWQgPSAxOworCQljdXItPmRuX25leHQgPSBkbjsKKwkJZG4gPSBjdXI7CisJCW5maWxlcysrOworCX0KKwljbG9zZWRpcihkaXIpOworCisJaWYgKGRuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogbm93IHRoYXQgd2Uga25vdyBob3cgbWFueSBmaWxlcyB0aGVyZSBhcmUKKwkgKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5IHRvIGhvbGQgZG5vZGUgcG9pbnRlcnMKKwkgKi8KKwkqbmZpbGVzX3AgPSBuZmlsZXM7CisJZG5wID0gZG5hbGxvYyhuZmlsZXMpOworCWZvciAoaSA9IDA7IC8qIGkgPCBuZmlsZXMgLSBkZXRlY3RlZCB2aWEgIWRuIGJlbG93ICovOyBpKyspIHsKKwkJZG5wW2ldID0gZG47CS8qIHNhdmUgcG9pbnRlciB0byBub2RlIGluIGFycmF5ICovCisJCWRuID0gZG4tPmRuX25leHQ7CisJCWlmICghZG4pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZG5wOworfQorCisjaWYgRU5BQkxFX0RFU0tUT1AKKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2xzLmh0bWwKKyAqIElmIGFueSBvZiB0aGUgLWwsIC1uLCAtcyBvcHRpb25zIGlzIHNwZWNpZmllZCwgZWFjaCBsaXN0CisgKiBvZiBmaWxlcyB3aXRoaW4gdGhlIGRpcmVjdG9yeSBzaGFsbCBiZSBwcmVjZWRlZCBieSBhCisgKiBzdGF0dXMgbGluZSBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgZmlsZSBzeXN0ZW0gYmxvY2tzCisgKiBvY2N1cGllZCBieSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGluIDUxMi1ieXRlIHVuaXRzIGlmCisgKiB0aGUgLWsgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIG9yIDEwMjQtYnl0ZSB1bml0cyBpZiB0aGUKKyAqIC1rIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgaW50ZWdyYWwKKyAqIG51bWJlciBvZiB1bml0cy4KKyAqLworLyogYnkgSm9yZ2VuIE92ZXJnYWFyZCAoam9yZ2VuIEFUIGFudGlzdGF0ZW4uc2UpICovCitzdGF0aWMgb2ZmX3QgY2FsY3VsYXRlX2Jsb2NrcyhzdHJ1Y3QgZG5vZGUgKipkbikKK3sKKwl1b2ZmX3QgYmxvY2tzID0gMTsKKwlpZiAoZG4pIHsKKwkJd2hpbGUgKCpkbikgeworCQkJLyogc3RfYmxvY2tzIGlzIGluIDUxMiBieXRlIGJsb2NrcyAqLworCQkJYmxvY2tzICs9ICgqZG4pLT5kbl9ibG9ja3M7CisJCQlkbisrOworCQl9CisJfQorCisJLyogRXZlbiB0aG91Z2ggc3RhbmRhcmQgc2F5cyB1c2UgNTEyIGJ5dGUgYmxvY2tzLCBjb3JldXRpbHMgdXNlIDFrICovCisJLyogQWN0dWFsbHksIHdlIHJvdW5kIHVwIGJ5IGNhbGN1bGF0aW5nIChibG9ja3MgKyAxKSAvIDIsCisJICogIisgMSIgd2FzIGRvbmUgd2hlbiB3ZSBpbml0aWFsaXplZCBibG9ja3MgdG8gMSAqLworCXJldHVybiBibG9ja3MgPj4gMTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzY2FuX2FuZF9kaXNwbGF5X2RpcnNfcmVjdXIoc3RydWN0IGRub2RlICoqZG4sIGludCBmaXJzdCkKK3sKKwl1bnNpZ25lZCBuZmlsZXM7CisJc3RydWN0IGRub2RlICoqc3ViZG5wOworCisJZm9yICg7ICpkbjsgZG4rKykgeworCQlpZiAoRy5hbGxfZm10ICYgKERJU1BfRElSTkFNRSB8IERJU1BfUkVDVVJTSVZFKSkgeworCQkJaWYgKCFmaXJzdCkKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJZmlyc3QgPSAwOworCQkJcHJpbnRmKCIlczpcbiIsICgqZG4pLT5mdWxsbmFtZSk7CisJCX0KKwkJc3ViZG5wID0gc2Nhbl9vbmVfZGlyKCgqZG4pLT5mdWxsbmFtZSwgJm5maWxlcyk7CisjaWYgRU5BQkxFX0RFU0tUT1AKKwkJaWYgKChHLmFsbF9mbXQgJiBTVFlMRV9NQVNLKSA9PSBTVFlMRV9MT05HKQorCQkJcHJpbnRmKCJ0b3RhbCAlIk9GRl9GTVQidVxuIiwgY2FsY3VsYXRlX2Jsb2NrcyhzdWJkbnApKTsKKyNlbmRpZgorCQlpZiAobmZpbGVzID4gMCkgeworCQkJLyogbGlzdCBhbGwgZmlsZXMgYXQgdGhpcyBsZXZlbCAqLworCQkJc29ydF9hbmRfZGlzcGxheV9maWxlcyhzdWJkbnAsIG5maWxlcyk7CisKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9MU19SRUNVUlNJVkUKKwkJCSAmJiAoRy5hbGxfZm10ICYgRElTUF9SRUNVUlNJVkUpCisJCQkpIHsKKwkJCQlzdHJ1Y3QgZG5vZGUgKipkbmQ7CisJCQkJdW5zaWduZWQgZG5kaXJzOworCQkJCS8qIHJlY3Vyc2l2ZSAtIGxpc3QgdGhlIHN1Yi1kaXJzICovCisJCQkJZG5kID0gc3BsaXRkbmFycmF5KHN1YmRucCwgU1BMSVRfU1VCRElSKTsKKwkJCQlkbmRpcnMgPSBjb3VudF9kaXJzKHN1YmRucCwgU1BMSVRfU1VCRElSKTsKKwkJCQlpZiAoZG5kaXJzID4gMCkgeworCQkJCQlkbnNvcnQoZG5kLCBkbmRpcnMpOworCQkJCQlzY2FuX2FuZF9kaXNwbGF5X2RpcnNfcmVjdXIoZG5kLCAwKTsKKwkJCQkJLyogZnJlZSB0aGUgYXJyYXkgb2YgZG5vZGUgcG9pbnRlcnMgdG8gdGhlIGRpcnMgKi8KKwkJCQkJZnJlZShkbmQpOworCQkJCX0KKwkJCX0KKwkJCS8qIGZyZWUgdGhlIGRub2RlcyBhbmQgdGhlIGZ1bGxuYW1lIG1lbSAqLworCQkJZGZyZWUoc3ViZG5wKTsKKwkJfQorCX0KK30KKworCitpbnQgbHNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBkbm9kZSAqKmRuZDsKKwlzdHJ1Y3QgZG5vZGUgKipkbmY7CisJc3RydWN0IGRub2RlICoqZG5wOworCXN0cnVjdCBkbm9kZSAqZG47CisJc3RydWN0IGRub2RlICpjdXI7CisJdW5zaWduZWQgb3B0OworCXVuc2lnbmVkIG5maWxlczsKKwl1bnNpZ25lZCBkbmZpbGVzOworCXVuc2lnbmVkIGRuZGlyczsKKwl1bnNpZ25lZCBpOworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJLyogY29sb3JlZCBMUyBzdXBwb3J0IGJ5IEphV2ksIGphbndpbGxlbS5qYW5zc2VuQGx4dHJlbWUubmwgKi8KKwkvKiBjb3JldXRpbHMgNi4xMDoKKwkgKiAjIGxzIC0tY29sb3I9Qk9HVVMKKwkgKiBsczogaW52YWxpZCBhcmd1bWVudCAnQk9HVVMnIGZvciAnLS1jb2xvcicKKwkgKiBWYWxpZCBhcmd1bWVudHMgYXJlOgorCSAqICdhbHdheXMnLCAneWVzJywgJ2ZvcmNlJworCSAqICduZXZlcicsICdubycsICdub25lJworCSAqICdhdXRvJywgJ3R0eScsICdpZi10dHknCisJICogKGFuZCBzdWJzdHJpbmdzOiAiLS1jb2xvcj1hbHdhIiB3b3JrIHRvbykKKwkgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBsc19sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJjb2xvclwwIiBPcHRpb25hbF9hcmd1bWVudCAiXHhmZiI7IC8qIG5vIHNob3J0IGVxdWl2YWxlbnQgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBjb2xvcl9zdHJbXSBBTElHTjEgPQorCQkiYWx3YXlzXDAiInllc1wwIiJmb3JjZVwwIgorCQkiYXV0b1wwIiJ0dHlcMCIiaWYtdHR5XDAiOworCS8qIG5lZWQgdG8gaW5pdGlhbGl6ZSBzaW5jZSAtLWNvbG9yIGhhcyBfYW4gb3B0aW9uYWxfIGFyZ3VtZW50ICovCisJY29uc3QgY2hhciAqY29sb3Jfb3B0ID0gY29sb3Jfc3RyOyAvKiAiYWx3YXlzIiAqLworI2VuZGlmCisKKwlJTklUX0coKTsKKworCWluaXRfdW5pY29kZSgpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUykKKwkJRy5hbGxfZm10ID0gU09SVF9OQU1FOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRICisJLyogb2J0YWluIHRoZSB0ZXJtaW5hbCB3aWR0aCAqLworCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoU1RESU5fRklMRU5PLCAmR190ZXJtaW5hbF93aWR0aCwgTlVMTCk7CisJLyogZ28gb25lIGxlc3MuLi4gKi8KKwlHX3Rlcm1pbmFsX3dpZHRoLS07CisjZW5kaWYKKworCS8qIHByb2Nlc3Mgb3B0aW9ucyAqLworCUlGX0ZFQVRVUkVfTFNfQ09MT1IoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGxzX2xvbmdvcHRzOykKKwlvcHRfY29tcGxlbWVudGFyeSA9CisJCS8qIC1lIGltcGxpZXMgLWwgKi8KKwkJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKCJlbCIpCisJCS8qIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9scy5odG1sOgorCQkgKiBpbiBzb21lIHBhaXJzIG9mIG9wdHMsIG9ubHkgbGFzdCBvbmUgdGFrZXMgZWZmZWN0OgorCQkgKi8KKwkJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKElGX0ZFQVRVUkVfTFNfU09SVEZJTEVTKCI6dC1TOlMtdCIpKSAvKiB0aW1lL3NpemUgKi8KKwkJLy8gIjptLWw6bC1tIiAtIHdlIGRvbid0IGhhdmUgLW0KKwkJSUZfRkVBVFVSRV9MU19GT0xMT1dMSU5LUygiOkgtTDpMLUgiKQorCQkiOkMteGw6eC1DbDpsLXhDIiAvKiBieWNvbHMvYnlsaW5lcy9sb25nICovCisJCSI6Qy0xOjEtQyIgLyogYnljb2xzL29uZWxpbmUgKi8KKwkJIjp4LTE6MS14IiAvKiBieWxpbmVzL29uZWxpbmUgKG5vdCBpbiBTdVMsIGJ1dCBpbiBHTlUgY29yZXV0aWxzIDguNCkgKi8KKwkJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKCI6Yy11OnUtYyIpIC8qIG10aW1lL2F0aW1lICovCisJCS8qIC13IE5VTTogKi8KKwkJSUZfRkVBVFVSRV9BVVRPV0lEVEgoIjp3KyIpOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIGxzX29wdGlvbnMKKwkJSUZfRkVBVFVSRV9BVVRPV0lEVEgoLCBOVUxMLCAmR190ZXJtaW5hbF93aWR0aCkKKwkJSUZfRkVBVFVSRV9MU19DT0xPUigsICZjb2xvcl9vcHQpCisJKTsKKwlmb3IgKGkgPSAwOyBvcHRfZmxhZ3NbaV0gIT0gKDFVIDw8IDMxKTsgaSsrKSB7CisJCWlmIChvcHQgJiAoMSA8PCBpKSkgeworCQkJdWludDMyX3QgZmxhZ3MgPSBvcHRfZmxhZ3NbaV07CisKKwkJCWlmIChmbGFncyAmIFNUWUxFX01BU0spCisJCQkJRy5hbGxfZm10ICY9IH5TVFlMRV9NQVNLOworCQkJaWYgKGZsYWdzICYgU09SVF9NQVNLKQorCQkJCUcuYWxsX2ZtdCAmPSB+U09SVF9NQVNLOworCQkJaWYgKGZsYWdzICYgVElNRV9NQVNLKQorCQkJCUcuYWxsX2ZtdCAmPSB+VElNRV9NQVNLOworCisJCQlHLmFsbF9mbXQgfD0gZmxhZ3M7CisJCX0KKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19DT0xPUgorCS8qIHNldCBHX3Nob3dfY29sb3IgPSAxLzAgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVCAmJiBpc2F0dHkoU1RET1VUX0ZJTEVOTykpIHsKKwkJY2hhciAqcCA9IGdldGVudigiTFNfQ09MT1JTIik7CisJCS8qIExTX0NPTE9SUyBpcyB1bnNldCwgb3IgKG5vdCBlbXB0eSAmJiBub3QgIm5vbmUiKSA/ICovCisJCWlmICghcCB8fCAocFswXSAmJiBzdHJjbXAocCwgIm5vbmUiKSAhPSAwKSkKKwkJCUdfc2hvd19jb2xvciA9IDE7CisJfQorCWlmIChvcHQgJiBPUFRfY29sb3IpIHsKKwkJaWYgKGNvbG9yX29wdFswXSA9PSAnbicpCisJCQlHX3Nob3dfY29sb3IgPSAwOworCQllbHNlIHN3aXRjaCAoaW5kZXhfaW5fc3Vic3RyaW5ncyhjb2xvcl9zdHIsIGNvbG9yX29wdCkpIHsKKwkJY2FzZSAzOgorCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJCWlmIChpc2F0dHkoU1RET1VUX0ZJTEVOTykpIHsKKwkJY2FzZSAwOgorCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCQlHX3Nob3dfY29sb3IgPSAxOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBzb3J0IG91dCB3aGljaCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0YWtlIHByZWNlZGVuY2UgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTFNfUkVDVVJTSVZFICYmIChHLmFsbF9mbXQgJiBESVNQX05PTElTVCkpCisJCUcuYWxsX2ZtdCAmPSB+RElTUF9SRUNVUlNJVkU7CS8qIG5vIHJlY3Vyc2UgaWYgbGlzdGluZyBvbmx5IGRpciAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTICYmIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUykgeworCQlpZiAoRy5hbGxfZm10ICYgVElNRV9DSEFOR0UpCisJCQlHLmFsbF9mbXQgPSAoRy5hbGxfZm10ICYgflNPUlRfTUFTSykgfCBTT1JUX0NUSU1FOworCQlpZiAoRy5hbGxfZm10ICYgVElNRV9BQ0NFU1MpCisJCQlHLmFsbF9mbXQgPSAoRy5hbGxfZm10ICYgflNPUlRfTUFTSykgfCBTT1JUX0FUSU1FOworCX0KKwlpZiAoKEcuYWxsX2ZtdCAmIFNUWUxFX01BU0spICE9IFNUWUxFX0xPTkcpIC8qIG5vdCAtbD8gKi8KKwkJRy5hbGxfZm10ICY9IH4oTElTVF9JRF9OVU1FUklDfExJU1RfSURfTkFNRXxMSVNUX0ZVTExUSU1FKTsKKworCS8qIGNob29zZSBhIGRpc3BsYXkgZm9ybWF0IGlmIG9uZSB3YXMgbm90IGFscmVhZHkgc3BlY2lmaWVkIGJ5IGFuIG9wdGlvbiAqLworCWlmICghKEcuYWxsX2ZtdCAmIFNUWUxFX01BU0spKQorCQlHLmFsbF9mbXQgfD0gKGlzYXR0eShTVERPVVRfRklMRU5PKSA/IFNUWUxFX0NPTFVNTkFSIDogU1RZTEVfU0lOR0xFKTsKKworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghYXJndlswXSkKKwkJKi0tYXJndiA9IChjaGFyKikiLiI7CisKKwlpZiAoYXJndlsxXSkKKwkJRy5hbGxfZm10IHw9IERJU1BfRElSTkFNRTsgLyogMiBvciBtb3JlIGl0ZW1zPyBsYWJlbCBkaXJlY3RvcmllcyAqLworCisJLyogc3R1ZmYgdGhlIGNvbW1hbmQgbGluZSBmaWxlIG5hbWVzIGludG8gYSBkbm9kZSBhcnJheSAqLworCWRuID0gTlVMTDsKKwluZmlsZXMgPSAwOworCWRvIHsKKwkJY3VyID0gbXlfc3RhdCgqYXJndiwgKmFyZ3YsCisJCQkvKiBmb2xsb3cgbGlua3Mgb24gY29tbWFuZCBsaW5lIHVubGVzcyAtbCwgLXMgb3IgLUY6ICovCisJCQkhKChHLmFsbF9mbXQgJiBTVFlMRV9NQVNLKSA9PSBTVFlMRV9MT05HCisJCQkgIHx8IChHLmFsbF9mbXQgJiBMSVNUX0JMT0NLUykKKwkJCSAgfHwgKG9wdGlvbl9tYXNrMzIgJiBPUFRfRikKKwkJCSkKKwkJCS8qIC4uLiBvciBpZiAtSDogKi8KKwkJCXx8IChvcHRpb25fbWFzazMyICYgT1BUX0gpCisJCQkvKiAuLi4gb3IgaWYgLUwsIGJ1dCBteV9zdGF0IGFsd2F5cyBmb2xsb3dzIGxpbmtzIGlmIC1MICovCisJCSk7CisJCWFyZ3YrKzsKKwkJaWYgKCFjdXIpCisJCQljb250aW51ZTsKKwkJLypjdXItPmZuYW1lX2FsbG9jYXRlZCA9IDA7IC0gYWxyZWFkeSBpcyAqLworCQljdXItPmRuX25leHQgPSBkbjsKKwkJZG4gPSBjdXI7CisJCW5maWxlcysrOworCX0gd2hpbGUgKCphcmd2KTsKKworCS8qIG5maWxlcyBfbWF5XyBiZSAwIGhlcmUgLSB0cnkgImxzIGRvZXNudF9leGlzdCIgKi8KKwlpZiAobmZpbGVzID09IDApCisJCXJldHVybiBHLmV4aXRfY29kZTsKKworCS8qIG5vdyB0aGF0IHdlIGtub3cgaG93IG1hbnkgZmlsZXMgdGhlcmUgYXJlCisJICogYWxsb2NhdGUgbWVtb3J5IGZvciBhbiBhcnJheSB0byBob2xkIGRub2RlIHBvaW50ZXJzCisJICovCisJZG5wID0gZG5hbGxvYyhuZmlsZXMpOworCWZvciAoaSA9IDA7IC8qIGkgPCBuZmlsZXMgLSBkZXRlY3RlZCB2aWEgIWRuIGJlbG93ICovOyBpKyspIHsKKwkJZG5wW2ldID0gZG47CS8qIHNhdmUgcG9pbnRlciB0byBub2RlIGluIGFycmF5ICovCisJCWRuID0gZG4tPmRuX25leHQ7CisJCWlmICghZG4pCisJCQlicmVhazsKKwl9CisKKwlpZiAoRy5hbGxfZm10ICYgRElTUF9OT0xJU1QpIHsKKwkJc29ydF9hbmRfZGlzcGxheV9maWxlcyhkbnAsIG5maWxlcyk7CisJfSBlbHNlIHsKKwkJZG5kID0gc3BsaXRkbmFycmF5KGRucCwgU1BMSVRfRElSKTsKKwkJZG5mID0gc3BsaXRkbmFycmF5KGRucCwgU1BMSVRfRklMRSk7CisJCWRuZGlycyA9IGNvdW50X2RpcnMoZG5wLCBTUExJVF9ESVIpOworCQlkbmZpbGVzID0gbmZpbGVzIC0gZG5kaXJzOworCQlpZiAoZG5maWxlcyA+IDApIHsKKwkJCXNvcnRfYW5kX2Rpc3BsYXlfZmlsZXMoZG5mLCBkbmZpbGVzKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQlmcmVlKGRuZik7CisJCX0KKwkJaWYgKGRuZGlycyA+IDApIHsKKwkJCWRuc29ydChkbmQsIGRuZGlycyk7CisJCQlzY2FuX2FuZF9kaXNwbGF5X2RpcnNfcmVjdXIoZG5kLCBkbmZpbGVzID09IDApOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWZyZWUoZG5kKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZGZyZWUoZG5wKTsKKwlyZXR1cm4gRy5leGl0X2NvZGU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbWQ1X3NoYTFfc3VtLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbWQ1X3NoYTFfc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNmRkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9tZDVfc2hhMV9zdW0uYwpAQCAtMCwwICsxLDI0MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIENvcHlyaWdodCAoQykgMjAwMyBHbGVubiBMLiBNY0dyYXRoCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgRXJpayBBbmRlcnNlbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1kNXN1bV90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSygiWy1jW3N3XV0gIikiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIG1kNXN1bV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IiBJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSygiIG9yIGNoZWNrIikgIiBNRDUgY2hlY2tzdW1zIgorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ2hlY2sgc3VtcyBhZ2FpbnN0IGxpc3QgaW4gRklMRXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCURvbid0IG91dHB1dCBhbnl0aGluZywgc3RhdHVzIGNvZGUgc2hvd3Mgc3VjY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJV2FybiBhYm91dCBpbXByb3Blcmx5IGZvcm1hdHRlZCBjaGVja3N1bSBsaW5lcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbWQ1c3VtX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG1kNXN1bSA8IGJ1c3lib3hcbiIKKy8vdXNhZ2U6ICAgICAgICI2ZmQxMWU5OGI5OGE1OGY2NGZmMzM5OGQ3YjMyNDAwM1xuIgorLy91c2FnZTogICAgICAgIiQgbWQ1c3VtIGJ1c3lib3hcbiIKKy8vdXNhZ2U6ICAgICAgICI2ZmQxMWU5OGI5OGE1OGY2NGZmMzM5OGQ3YjMyNDAwMyAgYnVzeWJveFxuIgorLy91c2FnZTogICAgICAgIiQgbWQ1c3VtIC1jIC1cbiIKKy8vdXNhZ2U6ICAgICAgICI2ZmQxMWU5OGI5OGE1OGY2NGZmMzM5OGQ3YjMyNDAwMyAgYnVzeWJveFxuIgorLy91c2FnZTogICAgICAgImJ1c3lib3g6IE9LXG4iCisvL3VzYWdlOiAgICAgICAiXkRcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2hhMXN1bV90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSygiWy1jW3N3XV0gIikiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHNoYTFzdW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCIgSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIiBvciBjaGVjayIpICIgU0hBMSBjaGVja3N1bXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSyggIlxuIgorLy91c2FnZTogICAgICJcbgktYwlDaGVjayBzdW1zIGFnYWluc3QgbGlzdCBpbiBGSUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJRG9uJ3Qgb3V0cHV0IGFueXRoaW5nLCBzdGF0dXMgY29kZSBzaG93cyBzdWNjZXNzIgorLy91c2FnZTogICAgICJcbgktdwlXYXJuIGFib3V0IGltcHJvcGVybHkgZm9ybWF0dGVkIGNoZWNrc3VtIGxpbmVzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzaGEyNTZzdW1fdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIlstY1tzd11dICIpIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzaGEyNTZzdW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCIgSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIiBvciBjaGVjayIpICIgU0hBMjU2IGNoZWNrc3VtcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCUNoZWNrIHN1bXMgYWdhaW5zdCBsaXN0IGluIEZJTEVzIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBvdXRwdXQgYW55dGhpbmcsIHN0YXR1cyBjb2RlIHNob3dzIHN1Y2Nlc3MiCisvL3VzYWdlOiAgICAgIlxuCS13CVdhcm4gYWJvdXQgaW1wcm9wZXJseSBmb3JtYXR0ZWQgY2hlY2tzdW0gbGluZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNoYTUxMnN1bV90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSygiWy1jW3N3XV0gIikiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHNoYTUxMnN1bV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IiBJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSygiIG9yIGNoZWNrIikgIiBTSEE1MTIgY2hlY2tzdW1zIgorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ2hlY2sgc3VtcyBhZ2FpbnN0IGxpc3QgaW4gRklMRXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCURvbid0IG91dHB1dCBhbnl0aGluZywgc3RhdHVzIGNvZGUgc2hvd3Mgc3VjY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJV2FybiBhYm91dCBpbXByb3Blcmx5IGZvcm1hdHRlZCBjaGVja3N1bSBsaW5lcyIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2VudW0geworCS8qIDR0aCBsZXR0ZXIgb2YgYXBwbGV0X25hbWUgaXMuLi4gKi8KKwlIQVNIX01ENSA9ICdzJywgLyogIm1kNT5zPHVtIiAqLworCUhBU0hfU0hBMSA9ICcxJywKKwlIQVNIX1NIQTI1NiA9ICcyJywKKwlIQVNIX1NIQTUxMiA9ICc1JywKK307CisKKyNkZWZpbmUgRkxBR19TSUxFTlQgIDEKKyNkZWZpbmUgRkxBR19DSEVDSyAgIDIKKyNkZWZpbmUgRkxBR19XQVJOICAgIDQKKworLyogVGhpcyBtaWdodCBiZSB1c2VmdWwgZWxzZXdoZXJlICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqaGFzaF9iaW5fdG9faGV4KHVuc2lnbmVkIGNoYXIgKmhhc2hfdmFsdWUsCisJCQkJdW5zaWduZWQgaGFzaF9sZW5ndGgpCit7CisJLyogeHphbGxvYyB6ZXJvLXRlcm1pbmF0ZXMgKi8KKwljaGFyICpoZXhfdmFsdWUgPSB4emFsbG9jKChoYXNoX2xlbmd0aCAqIDIpICsgMSk7CisJYmluMmhleChoZXhfdmFsdWUsIChjaGFyKiloYXNoX3ZhbHVlLCBoYXNoX2xlbmd0aCk7CisJcmV0dXJuICh1bnNpZ25lZCBjaGFyICopaGV4X3ZhbHVlOworfQorCitzdGF0aWMgdWludDhfdCAqaGFzaF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCBzcmNfZmQsIGhhc2hfbGVuLCBjb3VudDsKKwl1bmlvbiBfY3R4XyB7CisJCXNoYTUxMl9jdHhfdCBzaGE1MTI7CisJCXNoYTI1Nl9jdHhfdCBzaGEyNTY7CisJCXNoYTFfY3R4X3Qgc2hhMTsKKwkJbWQ1X2N0eF90IG1kNTsKKwl9IGNvbnRleHQ7CisJdWludDhfdCAqaGFzaF92YWx1ZTsKKwl2b2lkIEZBU1RfRlVOQyAoKnVwZGF0ZSkodm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCXZvaWQgRkFTVF9GVU5DICgqZmluYWwpKHZvaWQqLCB2b2lkKik7CisJY2hhciBoYXNoX2FsZ287CisKKwlzcmNfZmQgPSBvcGVuX29yX3dhcm5fc3RkaW4oZmlsZW5hbWUpOworCWlmIChzcmNfZmQgPCAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWhhc2hfYWxnbyA9IGFwcGxldF9uYW1lWzNdOworCisJLyogZmlndXJlIHNwZWNpZmljIGhhc2ggYWxnb3JpdGhtcyAqLworCWlmIChFTkFCTEVfTUQ1U1VNICYmIGhhc2hfYWxnbyA9PSBIQVNIX01ENSkgeworCQltZDVfYmVnaW4oJmNvbnRleHQubWQ1KTsKKwkJdXBkYXRlID0gKHZvaWQqKW1kNV9oYXNoOworCQlmaW5hbCA9ICh2b2lkKiltZDVfZW5kOworCQloYXNoX2xlbiA9IDE2OworCX0gZWxzZSBpZiAoRU5BQkxFX1NIQTFTVU0gJiYgaGFzaF9hbGdvID09IEhBU0hfU0hBMSkgeworCQlzaGExX2JlZ2luKCZjb250ZXh0LnNoYTEpOworCQl1cGRhdGUgPSAodm9pZCopc2hhMV9oYXNoOworCQlmaW5hbCA9ICh2b2lkKilzaGExX2VuZDsKKwkJaGFzaF9sZW4gPSAyMDsKKwl9IGVsc2UgaWYgKEVOQUJMRV9TSEEyNTZTVU0gJiYgaGFzaF9hbGdvID09IEhBU0hfU0hBMjU2KSB7CisJCXNoYTI1Nl9iZWdpbigmY29udGV4dC5zaGEyNTYpOworCQl1cGRhdGUgPSAodm9pZCopc2hhMjU2X2hhc2g7CisJCWZpbmFsID0gKHZvaWQqKXNoYTI1Nl9lbmQ7CisJCWhhc2hfbGVuID0gMzI7CisJfSBlbHNlIGlmIChFTkFCTEVfU0hBNTEyU1VNICYmIGhhc2hfYWxnbyA9PSBIQVNIX1NIQTUxMikgeworCQlzaGE1MTJfYmVnaW4oJmNvbnRleHQuc2hhNTEyKTsKKwkJdXBkYXRlID0gKHZvaWQqKXNoYTUxMl9oYXNoOworCQlmaW5hbCA9ICh2b2lkKilzaGE1MTJfZW5kOworCQloYXNoX2xlbiA9IDY0OworCX0gZWxzZSB7CisJCXhmdW5jX2RpZSgpOyAvKiBjYW4ndCByZWFjaCB0aGlzICovCisJfQorCisJeworCQlSRVNFUlZFX0NPTkZJR19VQlVGRkVSKGluX2J1ZiwgNDA5Nik7CisJCXdoaWxlICgoY291bnQgPSBzYWZlX3JlYWQoc3JjX2ZkLCBpbl9idWYsIDQwOTYpKSA+IDApIHsKKwkJCXVwZGF0ZSgmY29udGV4dCwgaW5fYnVmLCBjb3VudCk7CisJCX0KKwkJaGFzaF92YWx1ZSA9IE5VTEw7CisJCWlmIChjb3VudCA9PSAwKSB7CisJCQlmaW5hbCgmY29udGV4dCwgaW5fYnVmKTsKKwkJCWhhc2hfdmFsdWUgPSBoYXNoX2Jpbl90b19oZXgoaW5fYnVmLCBoYXNoX2xlbik7CisJCX0KKwkJUkVMRUFTRV9DT05GSUdfQlVGRkVSKGluX2J1Zik7CisJfQorCisJaWYgKHNyY19mZCAhPSBTVERJTl9GSUxFTk8pIHsKKwkJY2xvc2Uoc3JjX2ZkKTsKKwl9CisKKwlyZXR1cm4gaGFzaF92YWx1ZTsKK30KKworaW50IG1kNV9zaGExX3N1bV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWQ1X3NoYTFfc3VtX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0dXJuX3ZhbHVlID0gRVhJVF9TVUNDRVNTOworCXVuc2lnbmVkIGZsYWdzOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSykgeworCQkvKiAtYiAiYmluYXJ5IiwgLXQgInRleHQiIGFyZSBpZ25vcmVkIChzaGFOTk5zdW0gY29tcGF0KSAqLworCQlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJzY3didCIpOworCQlhcmd2ICs9IG9wdGluZDsKKwkJLy9hcmdjIC09IG9wdGluZDsKKwl9IGVsc2UgeworCQlhcmd2ICs9IDE7CisJCS8vYXJnYyAtPSAxOworCX0KKwlpZiAoISphcmd2KQorCQkqLS1hcmd2ID0gKGNoYXIqKSItIjsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0sgJiYgIShmbGFncyAmIEZMQUdfQ0hFQ0spKSB7CisJCWlmIChmbGFncyAmIEZMQUdfU0lMRU5UKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiLSVjIGlzIG1lYW5pbmdmdWwgb25seSB3aXRoIC1jIiwgJ3MnKTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBGTEFHX1dBUk4pIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCItJWMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdpdGggLWMiLCAndycpOworCQl9CisJfQorCisJZG8geworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLICYmIChmbGFncyAmIEZMQUdfQ0hFQ0spKSB7CisJCQlGSUxFICpwcmVfY29tcHV0ZWRfc3RyZWFtOworCQkJY2hhciAqbGluZTsKKwkJCWludCBjb3VudF90b3RhbCA9IDA7CisJCQlpbnQgY291bnRfZmFpbGVkID0gMDsKKworCQkJcHJlX2NvbXB1dGVkX3N0cmVhbSA9IHhmb3Blbl9zdGRpbigqYXJndik7CisKKwkJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUocHJlX2NvbXB1dGVkX3N0cmVhbSkpICE9IE5VTEwpIHsKKwkJCQl1aW50OF90ICpoYXNoX3ZhbHVlOworCQkJCWNoYXIgKmZpbGVuYW1lX3B0cjsKKworCQkJCWNvdW50X3RvdGFsKys7CisJCQkJZmlsZW5hbWVfcHRyID0gc3Ryc3RyKGxpbmUsICIgICIpOworCQkJCS8qIGhhbmRsZSBmb3JtYXQgZm9yIGJpbmFyeSBjaGVja3N1bXMgKi8KKwkJCQlpZiAoZmlsZW5hbWVfcHRyID09IE5VTEwpIHsKKwkJCQkJZmlsZW5hbWVfcHRyID0gc3Ryc3RyKGxpbmUsICIgKiIpOworCQkJCX0KKwkJCQlpZiAoZmlsZW5hbWVfcHRyID09IE5VTEwpIHsKKwkJCQkJaWYgKGZsYWdzICYgRkxBR19XQVJOKSB7CisJCQkJCQliYl9lcnJvcl9tc2coImludmFsaWQgZm9ybWF0Iik7CisJCQkJCX0KKwkJCQkJY291bnRfZmFpbGVkKys7CisJCQkJCXJldHVybl92YWx1ZSA9IEVYSVRfRkFJTFVSRTsKKwkJCQkJZnJlZShsaW5lKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCSpmaWxlbmFtZV9wdHIgPSAnXDAnOworCQkJCWZpbGVuYW1lX3B0ciArPSAyOworCisJCQkJaGFzaF92YWx1ZSA9IGhhc2hfZmlsZShmaWxlbmFtZV9wdHIpOworCisJCQkJaWYgKGhhc2hfdmFsdWUgJiYgKHN0cmNtcCgoY2hhciopaGFzaF92YWx1ZSwgbGluZSkgPT0gMCkpIHsKKwkJCQkJaWYgKCEoZmxhZ3MgJiBGTEFHX1NJTEVOVCkpCisJCQkJCQlwcmludGYoIiVzOiBPS1xuIiwgZmlsZW5hbWVfcHRyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIShmbGFncyAmIEZMQUdfU0lMRU5UKSkKKwkJCQkJCXByaW50ZigiJXM6IEZBSUxFRFxuIiwgZmlsZW5hbWVfcHRyKTsKKwkJCQkJY291bnRfZmFpbGVkKys7CisJCQkJCXJldHVybl92YWx1ZSA9IEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQkJLyogcG9zc2libGUgZnJlZShOVUxMKSAqLworCQkJCWZyZWUoaGFzaF92YWx1ZSk7CisJCQkJZnJlZShsaW5lKTsKKwkJCX0KKwkJCWlmIChjb3VudF9mYWlsZWQgJiYgIShmbGFncyAmIEZMQUdfU0lMRU5UKSkgeworCQkJCWJiX2Vycm9yX21zZygiV0FSTklORzogJWQgb2YgJWQgY29tcHV0ZWQgY2hlY2tzdW1zIGRpZCBOT1QgbWF0Y2giLAorCQkJCQkJCSBjb3VudF9mYWlsZWQsIGNvdW50X3RvdGFsKTsKKwkJCX0KKwkJCWZjbG9zZV9pZl9ub3Rfc3RkaW4ocHJlX2NvbXB1dGVkX3N0cmVhbSk7CisJCX0gZWxzZSB7CisJCQl1aW50OF90ICpoYXNoX3ZhbHVlID0gaGFzaF9maWxlKCphcmd2KTsKKwkJCWlmIChoYXNoX3ZhbHVlID09IE5VTEwpIHsKKwkJCQlyZXR1cm5fdmFsdWUgPSBFWElUX0ZBSUxVUkU7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiJXMgICVzXG4iLCBoYXNoX3ZhbHVlLCAqYXJndik7CisJCQkJZnJlZShoYXNoX3ZhbHVlKTsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHJldHVybl92YWx1ZTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ta2Rpci5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL21rZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0MjliMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ta2Rpci5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbWtkaXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9ta2Rpci5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogRml4ZWQgYnJva2VuIHBlcm1pc3Npb24gc2V0dGluZyB3aGVuIC1wIHdhcyB1c2VkOyBlc3BlY2lhbGx5IGluCisgKiBjb25qdW5jdGlvbiB3aXRoIC1tLgorICovCisKKy8qIE5vdiAyOCwgMjAwNiAgICAgIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD46IEFkZCBTRUxpbnV4IFN1cHBvcnQuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rZGlyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gRElSRUNUT1JZLi4uIgorLy91c2FnZTojZGVmaW5lIG1rZGlyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIERJUkVDVE9SWVxuIgorLy91c2FnZTogICAgICJcbgktbSBNT0RFCU1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS1wCU5vIGVycm9yIGlmIGV4aXN0czsgbWFrZSBwYXJlbnQgZGlyZWN0b3JpZXMgYXMgbmVlZGVkIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLVoJU2V0IHNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1rZGlyX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG1rZGlyIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBta2RpciAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi90bXAvZm9vOiBGaWxlIGV4aXN0c1xuIgorLy91c2FnZTogICAgICAgIiQgbWtkaXIgL3RtcC9mb28vYmFyL2JhelxuIgorLy91c2FnZTogICAgICAgIi90bXAvZm9vL2Jhci9iYXo6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1rZGlyIC1wIC90bXAvZm9vL2Jhci9iYXpcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIG1rZGlyX2xvbmdvcHRzW10gQUxJR04xID0KKwkibW9kZVwwIiAgICBSZXF1aXJlZF9hcmd1bWVudCAibSIKKwkicGFyZW50c1wwIiBOb19hcmd1bWVudCAgICAgICAicCIKKyNpZiBFTkFCTEVfU0VMSU5VWAorCSJjb250ZXh0XDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJaIgorI2VuZGlmCisJOworI2VuZGlmCisKK2ludCBta2Rpcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtkaXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCW1vZGVfdCBtb2RlID0gKG1vZGVfdCkoLTEpOworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJaW50IGZsYWdzID0gMDsKKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqc21vZGU7CisjaWYgRU5BQkxFX1NFTElOVVgKKwlzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQ7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBta2Rpcl9sb25nb3B0czsKKyNlbmRpZgorCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJtOnAiIElGX1NFTElOVVgoIlo6IiksICZzbW9kZSBJRl9TRUxJTlVYKCwmc2NvbnRleHQpKTsKKwlpZiAob3B0ICYgMSkgeworCQltb2RlID0gMDc3NzsKKwkJaWYgKCFiYl9wYXJzZV9tb2RlKHNtb2RlLCAmbW9kZSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIG1vZGUgJyVzJyIsIHNtb2RlKTsKKwkJfQorCX0KKwlpZiAob3B0ICYgMikKKwkJZmxhZ3MgfD0gRklMRVVUSUxTX1JFQ1VSOworI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKG9wdCAmIDQpIHsKKwkJc2VsaW51eF9vcl9kaWUoKTsKKwkJc2V0ZnNjcmVhdGVjb25fb3JfZGllKHNjb250ZXh0KTsKKwl9CisjZW5kaWYKKworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghYXJndlswXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJZG8geworCQlpZiAoYmJfbWFrZV9kaXJlY3RvcnkoKmFyZ3YsIG1vZGUsIGZsYWdzKSkgeworCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQl9CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL21rZmlmby5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL21rZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTgzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbWtmaWZvLmMKQEAgLTAsMCArMSw0OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtmaWZvIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvbWtmaWZvLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIG1rZmlmb190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1tIE1PREVdICIgSUZfU0VMSU5VWCgiWy1aXSAiKSAiTkFNRSIKKy8vdXNhZ2U6I2RlZmluZSBta2ZpZm9fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgbmFtZWQgcGlwZVxuIgorLy91c2FnZTogICAgICJcbgktbSBNT0RFCU1vZGUgKGRlZmF1bHQgYT1ydykiCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktWglTZXQgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGliY29yZXV0aWxzL2NvcmV1dGlscy5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgbWtmaWZvX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBta2ZpZm9fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCW1vZGVfdCBtb2RlOworCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKwltb2RlID0gZ2V0b3B0X21rX2ZpZm9fbm9kKGFyZ3YpOworCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCEqYXJndikgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJZG8geworCQlpZiAobWtmaWZvKCphcmd2LCBtb2RlKSA8IDApIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsgIC8qIEF2b2lkIG11bHRpYnl0ZSBwcm9ibGVtcy4gKi8KKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ta25vZC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL21rbm9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkMzY1OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ta25vZC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1rbm9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gTWF0Y2hlcyBHTlUgYmVoYXZpb3IuICovCisKKy8vdXNhZ2U6I2RlZmluZSBta25vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1tIE1PREVdICIgSUZfU0VMSU5VWCgiWy1aXSAiKSAiTkFNRSBUWVBFIE1BSk9SIE1JTk9SIgorLy91c2FnZTojZGVmaW5lIG1rbm9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIGEgc3BlY2lhbCBmaWxlIChibG9jaywgY2hhcmFjdGVyLCBvciBwaXBlKVxuIgorLy91c2FnZTogICAgICJcbgktbSBNT0RFCUNyZWF0aW9uIG1vZGUgKGRlZmF1bHQgYT1ydykiCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktWglTZXQgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG5UWVBFOiIKKy8vdXNhZ2U6ICAgICAiXG4JYglCbG9jayBkZXZpY2UiCisvL3VzYWdlOiAgICAgIlxuCWMgb3IgdQlDaGFyYWN0ZXIgZGV2aWNlIgorLy91c2FnZTogICAgICJcbglwCU5hbWVkIHBpcGUgKE1BSk9SIGFuZCBNSU5PUiBhcmUgaWdub3JlZCkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1rbm9kX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG1rbm9kIC9kZXYvZmQwIGIgMiAwXG4iCisvL3VzYWdlOiAgICAgICAiJCBta25vZCAtbSA2NDQgL3RtcC9waXBlIHBcbiIKKworI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4gIC8vIEZvciBtYWtlZGV2CisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImxpYmNvcmV1dGlscy9jb3JldXRpbHMuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgbW9kZXNfY2hhcnNbXSBBTElHTjEgPSB7ICdwJywgJ2MnLCAndScsICdiJywgMCwgMSwgMSwgMiB9Oworc3RhdGljIGNvbnN0IG1vZGVfdCBtb2Rlc19jdWJwW10gPSB7IFNfSUZJRk8sIFNfSUZDSFIsIFNfSUZCTEsgfTsKKworaW50IG1rbm9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBta25vZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwltb2RlX3QgbW9kZTsKKwlkZXZfdCBkZXY7CisJY29uc3QgY2hhciAqbmFtZTsKKworCW1vZGUgPSBnZXRvcHRfbWtfZmlmb19ub2QoYXJndik7CisJYXJndiArPSBvcHRpbmQ7CisJYXJnYyAtPSBvcHRpbmQ7CisKKwlpZiAoYXJnYyA+PSAyKSB7CisJCW5hbWUgPSBzdHJjaHIobW9kZXNfY2hhcnMsIGFyZ3ZbMV1bMF0pOworCQlpZiAobmFtZSAhPSBOVUxMKSB7CisJCQltb2RlIHw9IG1vZGVzX2N1YnBbKGludCkobmFtZVs0XSldOworCisJCQlkZXYgPSAwOworCQkJaWYgKCpuYW1lICE9ICdwJykgeworCQkJCWFyZ2MgLT0gMjsKKwkJCQlpZiAoYXJnYyA9PSAyKSB7CisJCQkJCS8qIEF1dG9kZXRlY3Qgd2hhdCB0aGUgc3lzdGVtIHN1cHBvcnRzOyB0aGVzZSBtYWNyb3Mgc2hvdWxkCisJCQkJCSAqIG9wdGltaXplIG91dCB0byB0d28gY29uc3RhbnRzLiAqLworCQkJCQlkZXYgPSBtYWtlZGV2KHhhdG91bF9yYW5nZShhcmd2WzJdLCAwLCBtYWpvcihVSU5UX01BWCkpLAorCQkJCQkgICAgICAgICAgICAgIHhhdG91bF9yYW5nZShhcmd2WzNdLCAwLCBtaW5vcihVSU5UX01BWCkpKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChhcmdjID09IDIpIHsKKwkJCQluYW1lID0gKmFyZ3Y7CisJCQkJaWYgKG1rbm9kKG5hbWUsIG1vZGUsIGRldikgPT0gMCkgeworCQkJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQkJCX0KKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKG5hbWUpOworCQkJfQorCQl9CisJfQorCWJiX3Nob3dfdXNhZ2UoKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9tdi5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL212LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmNGNkNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9tdi5jCkBAIC0wLDAgKzEsMTU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG12IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IE1hdHQgS3JhYWkgPGtyYWFpQGFsdW1uaS5jYXJuZWdpZW1lbGxvbi5lZHU+CisgKiBTRUxpbnV4IHN1cHBvcnQgYnkgWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIFNpemUgcmVkdWN0aW9uIGFuZCBpbXByb3ZlZCBlcnJvciBjaGVja2luZy4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJjb3JldXRpbHMvY29yZXV0aWxzLmgiCisKKy8vdXNhZ2U6I2RlZmluZSBtdl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1maW5dIFNPVVJDRSBERVNUXG4iCisvL3VzYWdlOiAgICAgICAib3I6IG12IFstZmluXSBTT1VSQ0UuLi4gRElSRUNUT1JZIgorLy91c2FnZTojZGVmaW5lIG12X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVuYW1lIFNPVVJDRSB0byBERVNULCBvciBtb3ZlIFNPVVJDRShzKSB0byBESVJFQ1RPUllcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRG9uJ3QgcHJvbXB0IGJlZm9yZSBvdmVyd3JpdGluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSW50ZXJhY3RpdmUsIHByb21wdCBiZWZvcmUgb3ZlcndyaXRlIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbXZfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbXYgL3RtcC9mb28gL2Jpbi9iYXJcbiIKKworI2lmIEVOQUJMRV9GRUFUVVJFX01WX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgbXZfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJpbnRlcmFjdGl2ZVwwIiBOb19hcmd1bWVudCAiaSIKKwkiZm9yY2VcMCIgICAgICAgTm9fYXJndW1lbnQgImYiCisJIm5vLWNsb2JiZXJcMCIgIE5vX2FyZ3VtZW50ICJuIgorCTsKKyNlbmRpZgorCisjZGVmaW5lIE9QVF9GSUxFVVRJTFNfRk9SQ0UgICAgICAgMQorI2RlZmluZSBPUFRfRklMRVVUSUxTX0lOVEVSQUNUSVZFIDIKKyNkZWZpbmUgT1BUX0ZJTEVVVElMU19OT0NMT0JCRVIgICA0CisKK2ludCBtdl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbXZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgZGVzdF9zdGF0OworCWNvbnN0IGNoYXIgKmxhc3Q7CisJY29uc3QgY2hhciAqZGVzdDsKKwl1bnNpZ25lZCBmbGFnczsKKwlpbnQgZGVzdF9leGlzdHM7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGNvcHlfZmxhZyA9IDA7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NVl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gbXZfbG9uZ29wdHM7CisjZW5kaWYKKwkvKiBOZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMuCisJICogSWYgbW9yZSB0aGFuIG9uZSBvZiAtZiwgLWksIC1uIGlzIHNwZWNpZmllZCAsIG9ubHkgdGhlIGZpbmFsIG9uZQorCSAqIHRha2VzIGVmZmVjdCAoaXQgdW5zZXRzIHByZXZpb3VzIG9wdGlvbnMpLiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0yOmYtaW46aS1mbjpuLWZpIjsKKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJmaW4iKTsKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwlsYXN0ID0gYXJndlthcmdjIC0gMV07CisKKwlpZiAoYXJnYyA9PSAyKSB7CisJCWRlc3RfZXhpc3RzID0gY3BfbXZfc3RhdChsYXN0LCAmZGVzdF9zdGF0KTsKKwkJaWYgKGRlc3RfZXhpc3RzIDwgMCkgeworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCisJCWlmICghKGRlc3RfZXhpc3RzICYgMikpIHsgLyogbGFzdCBpcyBub3QgYSBkaXJlY3RvcnkgKi8KKwkJCWRlc3QgPSBsYXN0OworCQkJZ290byBET19NT1ZFOworCQl9CisJfQorCisJZG8geworCQlkZXN0ID0gY29uY2F0X3BhdGhfZmlsZShsYXN0LCBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcCgqYXJndikpOworCQlkZXN0X2V4aXN0cyA9IGNwX212X3N0YXQoZGVzdCwgJmRlc3Rfc3RhdCk7CisJCWlmIChkZXN0X2V4aXN0cyA8IDApIHsKKwkJCWdvdG8gUkVUXzE7CisJCX0KKworIERPX01PVkU6CisJCWlmIChkZXN0X2V4aXN0cykgeworCQkJaWYgKGZsYWdzICYgT1BUX0ZJTEVVVElMU19OT0NMT0JCRVIpCisJCQkJZ290byBSRVRfMDsKKwkJCWlmICghKGZsYWdzICYgT1BUX0ZJTEVVVElMU19GT1JDRSkKKwkJCSAmJiAoKGFjY2VzcyhkZXN0LCBXX09LKSA8IDAgJiYgaXNhdHR5KDApKQorCQkJICAgIHx8IChmbGFncyAmIE9QVF9GSUxFVVRJTFNfSU5URVJBQ1RJVkUpKQorCQkJKSB7CisJCQkJaWYgKGZwcmludGYoc3RkZXJyLCAibXY6IG92ZXJ3cml0ZSAnJXMnPyAiLCBkZXN0KSA8IDApIHsKKwkJCQkJZ290byBSRVRfMTsgIC8qIE91Y2ghIGZwcmludGYgZmFpbGVkISAqLworCQkJCX0KKwkJCQlpZiAoIWJiX2Fza19jb25maXJtYXRpb24oKSkgeworCQkJCQlnb3RvIFJFVF8wOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyZW5hbWUoKmFyZ3YsIGRlc3QpIDwgMCkgeworCQkJc3RydWN0IHN0YXQgc291cmNlX3N0YXQ7CisJCQlpbnQgc291cmNlX2V4aXN0czsKKworCQkJaWYgKGVycm5vICE9IEVYREVWCisJCQkgfHwgKHNvdXJjZV9leGlzdHMgPSBjcF9tdl9zdGF0MigqYXJndiwgJnNvdXJjZV9zdGF0LCBsc3RhdCkpIDwgMQorCQkJKSB7CisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVuYW1lICclcyciLCAqYXJndik7CisJCQl9IGVsc2UgeworCQkJCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdIEFMSUdOMSA9CisJCQkJCSJjYW4ndCBvdmVyd3JpdGUgJXNkaXJlY3Rvcnkgd2l0aCAlc2RpcmVjdG9yeSI7CisKKwkJCQlpZiAoZGVzdF9leGlzdHMpIHsKKwkJCQkJaWYgKGRlc3RfZXhpc3RzID09IDMpIHsKKwkJCQkJCWlmIChzb3VyY2VfZXhpc3RzICE9IDMpIHsKKwkJCQkJCQliYl9lcnJvcl9tc2coZm10LCAiIiwgIm5vbi0iKTsKKwkJCQkJCQlnb3RvIFJFVF8xOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHNvdXJjZV9leGlzdHMgPT0gMykgeworCQkJCQkJCWJiX2Vycm9yX21zZyhmbXQsICJub24tIiwgIiIpOworCQkJCQkJCWdvdG8gUkVUXzE7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKHVubGluayhkZXN0KSA8IDApIHsKKwkJCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlbW92ZSAnJXMnIiwgZGVzdCk7CisJCQkJCQlnb3RvIFJFVF8xOworCQkJCQl9CisJCQkJfQorCQkJCS8qIEZJTEVVVElMU19SRUNVUiBhbHNvIHByZXZlbnRzIG5hc3RpZXMgbGlrZQorCQkJCSAqICJyZWFkIGZyb20gZGV2aWNlIGFuZCB3cml0ZSBjb250ZW50cyB0byBkc3QiCisJCQkJICogaW5zdGVhZCBvZiAiY3JlYXRlIHNhbWUgZGV2aWNlIG5vZGUiICovCisJCQkJY29weV9mbGFnID0gRklMRVVUSUxTX1JFQ1VSIHwgRklMRVVUSUxTX1BSRVNFUlZFX1NUQVRVUzsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCQkJCWNvcHlfZmxhZyB8PSBGSUxFVVRJTFNfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVDsKKyNlbmRpZgorCQkJCWlmICgoY29weV9maWxlKCphcmd2LCBkZXN0LCBjb3B5X2ZsYWcpID49IDApCisJCQkJICYmIChyZW1vdmVfZmlsZSgqYXJndiwgRklMRVVUSUxTX1JFQ1VSIHwgRklMRVVUSUxTX0ZPUkNFKSA+PSAwKQorCQkJCSkgeworCQkJCQlnb3RvIFJFVF8wOworCQkJCX0KKwkJCX0KKyBSRVRfMToKKwkJCXN0YXR1cyA9IDE7CisJCX0KKyBSRVRfMDoKKwkJaWYgKGRlc3QgIT0gbGFzdCkgeworCQkJZnJlZSgodm9pZCAqKSBkZXN0KTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YgIT0gbGFzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL25pY2UuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9uaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3NTk5MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9uaWNlLmMKQEAgLTAsMCArMSw1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG5pY2VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbiBBREpVU1RdIFtQUk9HIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIG5pY2VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2Ugc2NoZWR1bGluZyBwcmlvcml0eSwgcnVuIFBST0dcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gQURKVVNUCUFkanVzdCBwcmlvcml0eSBieSBBREpVU1QiCisKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgbmljZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbmljZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgb2xkX3ByaW9yaXR5LCBhZGp1c3RtZW50OworCisJb2xkX3ByaW9yaXR5ID0gZ2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwKTsKKworCWlmICghKisrYXJndikgeyAvKiBObyBhcmdzLCBzbyAoR05VKSBvdXRwdXQgY3VycmVudCBuaWNlIHZhbHVlLiAqLworCQlwcmludGYoIiVkXG4iLCBvbGRfcHJpb3JpdHkpOworCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCisJYWRqdXN0bWVudCA9IDEwOyAgLyogU2V0IGRlZmF1bHQgYWRqdXN0bWVudC4gKi8KKworCWlmIChhcmd2WzBdWzBdID09ICctJykgeworCQlpZiAoYXJndlswXVsxXSA9PSAnbicpIHsgLyogLW4gKi8KKwkJCWlmIChhcmd2WzBdWzJdKSB7IC8qIC1uTk5OTiAody9vIHNwYWNlKSAqLworCQkJCWFyZ3ZbMF0gKz0gMjsgYXJndi0tOyBhcmdjKys7CisJCQl9CisJCX0gZWxzZSB7IC8qIC1OTk4gKE5OTiBtYXkgYmUgbmVnYXRpdmUpID09IC1uIE5OTiAqLworCQkJYXJndlswXSArPSAxOyBhcmd2LS07IGFyZ2MrKzsKKwkJfQorCQlpZiAoYXJnYyA8IDQpIHsgIC8qIE1pc3NpbmcgcHJpb3JpdHkgYW5kL29yIHV0aWxpdHkhICovCisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwkJYWRqdXN0bWVudCA9IHhhdG9pX3JhbmdlKGFyZ3ZbMV0sIElOVF9NSU4vMiwgSU5UX01BWC8yKTsKKwkJYXJndiArPSAyOworCX0KKworCXsgIC8qIFNldCBvdXIgcHJpb3JpdHkuICovCisJCWludCBwcmlvID0gb2xkX3ByaW9yaXR5ICsgYWRqdXN0bWVudDsKKworCQlpZiAoc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBwcmlvKSA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0cHJpb3JpdHkoJWQpIiwgcHJpbyk7CisJCX0KKwl9CisKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL25vaHVwLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvbm9odXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg1M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL25vaHVwLmMKQEAgLTAsMCArMSw4OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBub2h1cCAtIGludm9rZSBhIHV0aWxpdHkgaW1tdW5lIHRvIGhhbmd1cHMuCisgKgorICogQnVzeWJveCB2ZXJzaW9uIGJhc2VkIG9uIG5vaHVwIHNwZWNpZmljYXRpb24gYXQKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvbm9odXAuaHRtbAorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKiBDb3B5cmlnaHQgMjAwNiBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBub2h1cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIG5vaHVwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIFBST0cgaW1tdW5lIHRvIGhhbmd1cHMsIHdpdGggb3V0cHV0IHRvIGEgbm9uLXR0eSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbm9odXBfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbm9odXAgbWFrZSAmIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogQ29tcGF0IGluZm86IG5vaHVwIChHTlUgY29yZXV0aWxzIDYuOCkgZG9lcyB0aGlzOgorIyBub2h1cCB0cnVlCitub2h1cDogaWdub3JpbmcgaW5wdXQgYW5kIGFwcGVuZGluZyBvdXRwdXQgdG8gYG5vaHVwLm91dCcKKyMgbm9odXAgdHJ1ZSAxPi9kZXYvbnVsbAorbm9odXA6IGlnbm9yaW5nIGlucHV0IGFuZCByZWRpcmVjdGluZyBzdGRlcnIgdG8gc3Rkb3V0CisjIG5vaHVwIHRydWUgMj56egorIyBjYXQgenoKK25vaHVwOiBpZ25vcmluZyBpbnB1dCBhbmQgYXBwZW5kaW5nIG91dHB1dCB0byBgbm9odXAub3V0JworIyBub2h1cCB0cnVlIDI+enogMT4vZGV2L251bGwKKyMgY2F0IHp6Citub2h1cDogaWdub3JpbmcgaW5wdXQKKyMgbm9odXAgdHJ1ZSA8L2Rldi9udWxsIDE+L2Rldi9udWxsCitub2h1cDogcmVkaXJlY3Rpbmcgc3RkZXJyIHRvIHN0ZG91dAorIyBub2h1cCB0cnVlIDwvZGV2L251bGwgMj56eiAxPi9kZXYvbnVsbAorIyBjYXQgenoKKyAgKG5vdGhpbmcpCisjCisqLworCitpbnQgbm9odXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5vaHVwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpub2h1cG91dDsKKwljaGFyICpob21lOworCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMTI3OworCisJaWYgKCFhcmd2WzFdKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBJZiBzdGRpbiBpcyBhIHR0eSwgZGV0YWNoIGZyb20gaXQuICovCisJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pKSB7CisJCS8qIGJiX2Vycm9yX21zZygiaWdub3JpbmcgaW5wdXQiKTsgKi8KKwkJY2xvc2UoU1RESU5fRklMRU5PKTsKKwkJeG9wZW4oYmJfZGV2X251bGwsIE9fUkRPTkxZKTsgLyogd2lsbCBiZSBmZCAwIChTVERJTl9GSUxFTk8pICovCisJfQorCisJbm9odXBvdXQgPSAibm9odXAub3V0IjsKKwkvKiBSZWRpcmVjdCBzdGRvdXQgdG8gbm9odXAub3V0LCBlaXRoZXIgaW4gIi4iIG9yIGluICIkSE9NRSIuICovCisJaWYgKGlzYXR0eShTVERPVVRfRklMRU5PKSkgeworCQljbG9zZShTVERPVVRfRklMRU5PKTsKKwkJaWYgKG9wZW4obm9odXBvdXQsIE9fQ1JFQVR8T19XUk9OTFl8T19BUFBFTkQsIFNfSVJVU1J8U19JV1VTUikgPCAwKSB7CisJCQlob21lID0gZ2V0ZW52KCJIT01FIik7CisJCQlpZiAoaG9tZSkgeworCQkJCW5vaHVwb3V0ID0gY29uY2F0X3BhdGhfZmlsZShob21lLCBub2h1cG91dCk7CisJCQkJeG9wZW4zKG5vaHVwb3V0LCBPX0NSRUFUfE9fV1JPTkxZfE9fQVBQRU5ELCBTX0lSVVNSfFNfSVdVU1IpOworCQkJfSBlbHNlIHsKKwkJCQl4b3BlbihiYl9kZXZfbnVsbCwgT19SRE9OTFkpOyAvKiB3aWxsIGJlIGZkIDEgKi8KKwkJCX0KKwkJfQorCQliYl9lcnJvcl9tc2coImFwcGVuZGluZyBvdXRwdXQgdG8gJXMiLCBub2h1cG91dCk7CisJfQorCisJLyogSWYgd2UgaGF2ZSBhIHR0eSBvbiBzdGRlcnIsIHJlZGlyZWN0IHRvIHN0ZG91dC4gKi8KKwlpZiAoaXNhdHR5KFNUREVSUl9GSUxFTk8pKSB7CisJCS8qIGlmIChzdGRvdXRfd2FzbnRfYV90dHkpCisJCQliYl9lcnJvcl9tc2coInJlZGlyZWN0aW5nIHN0ZGVyciB0byBzdGRvdXQiKTsgKi8KKwkJZHVwMihTVERPVVRfRklMRU5PLCBTVERFUlJfRklMRU5PKTsKKwl9CisKKwlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKworCWFyZ3YrKzsKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL29kLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjExZmNmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL29kLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKiBCYXNlZCBvbiBjb2RlIGZyb20gdXRpbC1saW51eCB2IDIuMTFsCisgKgorICogQ29weXJpZ2h0IChjKSAxOTkwCisgKiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKi8KKworLy91c2FnZTojaWYgIUVOQUJMRV9ERVNLVE9QCisvL3VzYWdlOiNkZWZpbmUgb2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYUJiY0RkZUZmSGhJaUxsT292WHhdIFtGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBvZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IEZJTEUgKG9yIHN0ZGluKSB1bmFtYmlndW91c2x5LCBhcyBvY3RhbCBieXRlcyBieSBkZWZhdWx0IgorLy91c2FnZTojZW5kaWYKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWYgRU5BQkxFX0RFU0tUT1AKKy8qIFRoaXMgb25lIHByb3ZpZGVzIC10IChidXN5Ym94J3Mgb3duIGJ1aWxkIHNjcmlwdCBuZWVkcyBpdCkgKi8KKyNpbmNsdWRlICJvZF9ibG9hdHkuYyIKKyNlbHNlCisKKyNpbmNsdWRlICJkdW1wLmgiCisKK3N0YXRpYyB2b2lkCitvZG9mZnNldChkdW1wZXJfdCAqZHVtcGVyLCBpbnQgYXJnYywgY2hhciAqKiphcmd2cCkKK3sKKwljaGFyICpudW0sICpwOworCWludCBiYXNlOworCWNoYXIgKmVuZDsKKworCS8qCisJICogVGhlIG9mZnNldCBzeW50YXggb2Ygb2QoMSkgd2FzIGdlbnVpbmVseSBiaXphcnJlLiAgRmlyc3QsIGlmCisJICogaXQgc3RhcnRlZCB3aXRoIGEgcGx1cyBpdCBoYWQgdG8gYmUgYW4gb2Zmc2V0LiAgT3RoZXJ3aXNlLCBpZgorCSAqIHRoZXJlIHdlcmUgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cywgYSBudW1iZXIgb3IgbG93ZXItY2FzZSAneCcKKwkgKiBmb2xsb3dlZCBieSBhIG51bWJlciBtYWtlcyBpdCBhbiBvZmZzZXQuICBCeSBkZWZhdWx0IGl0IHdhcworCSAqIG9jdGFsOyBpZiBpdCBzdGFydGVkIHdpdGggJ3gnIG9yICcweCcgaXQgd2FzIGhleC4gIElmIGl0IGVuZGVkCisJICogaW4gYSAnLicsIGl0IHdhcyBkZWNpbWFsLiAgSWYgYSAnYicgb3IgJ0InIHdhcyBhcHBlbmRlZCwgaXQKKwkgKiBtdWx0aXBsaWVkIHRoZSBudW1iZXIgYnkgNTEyIG9yIDEwMjQgYnl0ZSB1bml0cy4gIFRoZXJlIHdhcworCSAqIG5vIHdheSB0byBhc3NpZ24gYSBibG9jayBjb3VudCB0byBhIGhleCBvZmZzZXQuCisJICoKKwkgKiBXZSBhc3N1bWVzIGl0J3MgYSBmaWxlIGlmIHRoZSBvZmZzZXQgaXMgYmFkLgorCSAqLworCXAgPSAqKmFyZ3ZwOworCisJaWYgKCFwKSB7CisJCS8qIGhleSBzb21lb25lIGlzIHByb2JhYmx5IHBpcGluZyB0byB1cyAuLi4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoKnAgIT0gJysnKQorCQkmJiAoYXJnYyA8IDIKKwkJCXx8ICghaXNkaWdpdChwWzBdKQorCQkJCSYmICgocFswXSAhPSAneCcpIHx8ICFpc3hkaWdpdChwWzFdKSkpKSkKKwkJcmV0dXJuOworCisJYmFzZSA9IDA7CisJLyoKKwkgKiBza2lwIG92ZXIgbGVhZGluZyAnKycsICd4WzAtOWEtZkEtZl0nIG9yICcweCcsIGFuZAorCSAqIHNldCBiYXNlLgorCSAqLworCWlmIChwWzBdID09ICcrJykKKwkJKytwOworCWlmIChwWzBdID09ICd4JyAmJiBpc3hkaWdpdChwWzFdKSkgeworCQkrK3A7CisJCWJhc2UgPSAxNjsKKwl9IGVsc2UgaWYgKHBbMF0gPT0gJzAnICYmIHBbMV0gPT0gJ3gnKSB7CisJCXAgKz0gMjsKKwkJYmFzZSA9IDE2OworCX0KKworCS8qIHNraXAgb3ZlciB0aGUgbnVtYmVyICovCisJaWYgKGJhc2UgPT0gMTYpCisJCWZvciAobnVtID0gcDsgaXN4ZGlnaXQoKnApOyArK3ApCisJCQljb250aW51ZTsKKwllbHNlCisJCWZvciAobnVtID0gcDsgaXNkaWdpdCgqcCk7ICsrcCkKKwkJCWNvbnRpbnVlOworCisJLyogY2hlY2sgZm9yIG5vIG51bWJlciAqLworCWlmIChudW0gPT0gcCkKKwkJcmV0dXJuOworCisJLyogaWYgdGVybWluYXRlcyB3aXRoIGEgJy4nLCBiYXNlIGlzIGRlY2ltYWwgKi8KKwlpZiAoKnAgPT0gJy4nKSB7CisJCWlmIChiYXNlKQorCQkJcmV0dXJuOworCQliYXNlID0gMTA7CisJfQorCisJZHVtcGVyLT5kdW1wX3NraXAgPSBzdHJ0b2wobnVtLCAmZW5kLCBiYXNlID8gYmFzZSA6IDgpOworCisJLyogaWYgZW5kIGlzbid0IHRoZSBzYW1lIGFzIHAsIHdlIGdvdCBhIG5vbi1vY3RhbCBkaWdpdCAqLworCWlmIChlbmQgIT0gcCkKKwkJZHVtcGVyLT5kdW1wX3NraXAgPSAwOworCWVsc2UgeworCQlpZiAoKnApIHsKKwkJCWlmICgqcCA9PSAnYicpIHsKKwkJCQlkdW1wZXItPmR1bXBfc2tpcCAqPSA1MTI7CisJCQkJKytwOworCQkJfSBlbHNlIGlmICgqcCA9PSAnQicpIHsKKwkJCQlkdW1wZXItPmR1bXBfc2tpcCAqPSAxMDI0OworCQkJCSsrcDsKKwkJCX0KKwkJfQorCQlpZiAoKnApCisJCQlkdW1wZXItPmR1bXBfc2tpcCA9IDA7CisJCWVsc2UgeworCQkJKysqYXJndnA7CisJCQkvKgorCQkJICogSWYgdGhlIG9mZnNldCB1c2VzIGEgbm9uLW9jdGFsIGJhc2UsIHRoZSBiYXNlIG9mCisJCQkgKiB0aGUgb2Zmc2V0IGlzIGNoYW5nZWQgYXMgd2VsbC4gIFRoaXMgaXNuJ3QgcHJldHR5LAorCQkJICogYnV0IGl0J3MgZWFzeS4KKwkJCSAqLworI2RlZmluZSBUWVBFX09GRlNFVCA3CisJCQl7CisJCQkJY2hhciB4X29yX2Q7CisJCQkJaWYgKGJhc2UgPT0gMTYpIHsKKwkJCQkJeF9vcl9kID0gJ3gnOworCQkJCQlnb3RvIERPX1hfT1JfRDsKKwkJCQl9CisJCQkJaWYgKGJhc2UgPT0gMTApIHsKKwkJCQkJeF9vcl9kID0gJ2QnOworIERPX1hfT1JfRDoKKwkJCQkJZHVtcGVyLT5mc2hlYWQtPm5leHRmdS0+Zm10W1RZUEVfT0ZGU0VUXQorCQkJCQkJPSBkdW1wZXItPmZzaGVhZC0+bmV4dGZzLT5uZXh0ZnUtPmZtdFtUWVBFX09GRlNFVF0KKwkJCQkJCT0geF9vcl9kOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFkZF9zdHJpbmdzW10gPSB7CisJIjE2LzEgXCIlM191IFwiIFwiXFxuXCIiLCAgICAgICAgICAgICAgLyogYSAqLworCSI4LzIgXCIgJTA2byBcIiBcIlxcblwiIiwgICAgICAgICAgICAgIC8qIEIsIG8gKi8KKwkiMTYvMSBcIiUwM28gXCIgXCJcXG5cIiIsICAgICAgICAgICAgICAvKiBiICovCisJIjE2LzEgXCIlM19jIFwiIFwiXFxuXCIiLCAgICAgICAgICAgICAgLyogYyAqLworCSI4LzIgXCIgICUwNXUgXCIgXCJcXG5cIiIsICAgICAgICAgICAgIC8qIGQgKi8KKwkiNC80IFwiICAgICAlMDEwdSBcIiBcIlxcblwiIiwgICAgICAgICAvKiBEICovCisJIjIvOCBcIiAgICAgICAgICAlMjEuMTRlIFwiIFwiXFxuXCIiLCAgLyogZSAodW5kb2N1bWVudGVkIGluIG9kKSwgRiAqLworCSI0LzQgXCIgJTE0LjdlIFwiIFwiXFxuXCIiLCAgICAgICAgICAgIC8qIGYgKi8KKwkiNC80IFwiICAgICAgICUwOHggXCIgXCJcXG5cIiIsICAgICAgICAvKiBILCBYICovCisJIjgvMiBcIiAgICUwNHggXCIgXCJcXG5cIiIsICAgICAgICAgICAgLyogaCwgeCAqLworCSI0LzQgXCIgICAgJTExZCBcIiBcIlxcblwiIiwgICAgICAgICAgIC8qIEksIEwsIGwgKi8KKwkiOC8yIFwiICU2ZCBcIiBcIlxcblwiIiwgICAgICAgICAgICAgICAvKiBpICovCisJIjQvNCBcIiAgICAlMDExbyBcIiBcIlxcblwiIiwgICAgICAgICAgLyogTyAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgb2Rfb3B0c1tdIEFMSUdOMSA9ICJhQmJjRGRlRmZIaElpTGxPb1h4diI7CisKK3N0YXRpYyBjb25zdCBjaGFyIG9kX28yc2lbXSBBTElHTjEgPSB7CisJMCwgMSwgMiwgMywgNSwKKwk0LCA2LCA2LCA3LCA4LAorCTksIDB4YSwgMHhiLCAweGEsIDB4YSwKKwkweGIsIDEsIDgsIDksCit9OworCitpbnQgb2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjaDsKKwlpbnQgZmlyc3QgPSAxOworCWNoYXIgKnA7CisJZHVtcGVyX3QgKmR1bXBlciA9IGFsbG9jX2R1bXBlcigpOworCisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCBvZF9vcHRzKSkgPiAwKSB7CisJCWlmIChjaCA9PSAndicpIHsKKwkJCWR1bXBlci0+ZHVtcF92ZmxhZyA9IEFMTDsKKwkJfSBlbHNlIGlmICgoKHAgPSBzdHJjaHIob2Rfb3B0cywgY2gpKSAhPSBOVUxMKSAmJiAoKnAgIT0gJ1wwJykpIHsKKwkJCWlmIChmaXJzdCkgeworCQkJCWZpcnN0ID0gMDsKKwkJCQliYl9kdW1wX2FkZChkdW1wZXIsICJcIiUwNy43X0FvXG5cIiIpOworCQkJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA3LjdfYW8gIFwiIik7CisJCQl9IGVsc2UgeworCQkJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiICAgICAgICAgXCIiKTsKKwkJCX0KKwkJCWJiX2R1bXBfYWRkKGR1bXBlciwgYWRkX3N0cmluZ3NbKGludClvZF9vMnNpWyhwIC0gb2Rfb3B0cyldXSk7CisJCX0gZWxzZSB7ICAvKiBQLCBwLCBzLCB3LCBvciBvdGhlciB1bmhhbmRsZWQgKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0KKwlpZiAoIWR1bXBlci0+ZnNoZWFkKSB7CisJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA3LjdfQW9cblwiIik7CisJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA3LjdfYW8gIFwiIDgvMiBcIiUwNm8gXCIgXCJcXG5cIiIpOworCX0KKworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJb2RvZmZzZXQoZHVtcGVyLCBhcmdjLCAmYXJndik7CisKKwlyZXR1cm4gYmJfZHVtcF9kdW1wKGR1bXBlciwgYXJndik7Cit9CisjZW5kaWYgLyogRU5BQkxFX0RFU0tUT1AgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvb2RfYmxvYXR5LmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvb2RfYmxvYXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3Zjg3OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9vZF9ibG9hdHkuYwpAQCAtMCwwICsxLDEzODQgQEAKKy8qIG9kIC0tIGR1bXAgZmlsZXMgaW4gb2N0YWwgYW5kIG90aGVyIGZvcm1hdHMKKyAgIENvcHlyaWdodCAoQykgOTIsIDE5OTUtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisvKiBXcml0dGVuIGJ5IEppbSBNZXllcmluZy4gICovCisvKiBCdXN5Ym94ZWQgYnkgRGVueXMgVmxhc2Vua28sIGJhc2VkIG9uIG9kLmMgZnJvbSBjb3JldXRpbHMtNS4yLjEgKi8KKworCisvKiAjaW5jbHVkZSAibGliYmIuaCIgLSBkb25lIGluIG9kLmMgKi8KKyNkZWZpbmUgYXNzZXJ0KGEpICgodm9pZCkwKQorCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9ERVNLVE9QCisvL3VzYWdlOiNkZWZpbmUgb2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYWJjZGZoaWxvdnhzXSBbLXQgVFlQRV0gWy1BIFJBRElYXSBbLU4gU0laRV0gWy1qIFNLSVBdIFstUyBNSU5TVFJdIFstdyBXSURUSF0gW0ZJTEUuLi5dIgorLy8gV2UgZG9uJ3Qgc3VwcG9ydDoKKy8vIC4uLiBbRklMRV0gW1srXU9GRlNFVFsuXVtiXV0KKy8vIFN1cHBvcnQgaXMgYnVnZ3kgZm9yOgorLy8gb2QgLS10cmFkaXRpb25hbCBbT1BUSU9OXS4uLiBbRklMRV0gW1srXU9GRlNFVFsuXVtiXSBbK11bTEFCRUxdWy5dW2JdXQorCisvL3VzYWdlOiNkZWZpbmUgb2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBGSUxFcyAob3Igc3RkaW4pIHVuYW1iaWd1b3VzbHksIGFzIG9jdGFsIGJ5dGVzIGJ5IGRlZmF1bHQiCisvL3VzYWdlOiNlbmRpZgorCitlbnVtIHsKKwlPUFRfQSA9IDEgPDwgMCwKKwlPUFRfTiA9IDEgPDwgMSwKKwlPUFRfYSA9IDEgPDwgMiwKKwlPUFRfYiA9IDEgPDwgMywKKwlPUFRfYyA9IDEgPDwgNCwKKwlPUFRfZCA9IDEgPDwgNSwKKwlPUFRfZiA9IDEgPDwgNiwKKwlPUFRfaCA9IDEgPDwgNywKKwlPUFRfaSA9IDEgPDwgOCwKKwlPUFRfaiA9IDEgPDwgOSwKKwlPUFRfbCA9IDEgPDwgMTAsCisJT1BUX28gPSAxIDw8IDExLAorCU9QVF90ID0gMSA8PCAxMiwKKwkvKiBXaGVuIHplcm8gYW5kIHR3byBvciBtb3JlIGNvbnNlY3V0aXZlIGJsb2NrcyBhcmUgZXF1YWwsIGZvcm1hdAorCSAgIG9ubHkgdGhlIGZpcnN0IGJsb2NrIGFuZCBvdXRwdXQgYW4gYXN0ZXJpc2sgYWxvbmUgb24gdGhlIGZvbGxvd2luZworCSAgIGxpbmUgdG8gaW5kaWNhdGUgdGhhdCBpZGVudGljYWwgYmxvY2tzIGhhdmUgYmVlbiBlbGlkZWQ6ICovCisJT1BUX3YgPSAxIDw8IDEzLAorCU9QVF94ID0gMSA8PCAxNCwKKwlPUFRfcyA9IDEgPDwgMTUsCisJT1BUX1MgPSAxIDw8IDE2LAorCU9QVF93ID0gMSA8PCAxNywKKwlPUFRfdHJhZGl0aW9uYWwgPSAoMSA8PCAxOCkgKiBFTkFCTEVfTE9OR19PUFRTLAorfTsKKworI2RlZmluZSBPRF9HRVRPUFQzMigpIGdldG9wdDMyKGFyZ3YsIFwKKwkiQTpOOmFiY2RmaGlqOmxvdDp2eHNTOnc6OiIsIFwKKwkvKiAtdyB3aXRoIG9wdGlvbmFsIHBhcmFtICovIFwKKwkvKiAtUyB3YXMgLXMgYW5kIGFsc28gaGFkIG9wdGlvbmFsIHBhcmFtZXRlciAqLyBcCisJLyogYnV0IGluIGNvcmV1dGlscyA2LjMgaXQgd2FzIHJlbmFtZWQgYW5kIG5vdyBoYXMgKi8gXAorCS8qIF9tYW5kYXRvcnlfIHBhcmFtZXRlciAqLyBcCisJJnN0cl9BLCAmc3RyX04sICZzdHJfaiwgJmxzdF90LCAmc3RyX1MsICZieXRlc19wZXJfYmxvY2spCisKKworLyogQ2hlY2sgZm9yIDB4N2YgaXMgYSBjb3JldXRpbHMgNi4zIGFkZGl0aW9uICovCisjZGVmaW5lIElTUFJJTlQoYykgKCgoYykgPj0gJyAnKSAmJiAoYykgPCAweDdmKQorCit0eXBlZGVmIGxvbmcgZG91YmxlIGxvbmdkb3VibGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsb25nbG9uZ190OwordHlwZWRlZiBsb25nIGxvbmcgbGxvbmc7CisKKyNpZiBFTkFCTEVfTEZTCisjIGRlZmluZSB4c3RydG9vZmZfc2Z4IHhzdHJ0b3VsbF9zZngKKyNlbHNlCisjIGRlZmluZSB4c3RydG9vZmZfc2Z4IHhzdHJ0b3VsX3NmeAorI2VuZGlmCisKKy8qIFRoZSBkZWZhdWx0IG51bWJlciBvZiBpbnB1dCBieXRlcyBwZXIgb3V0cHV0IGxpbmUuICAqLworI2RlZmluZSBERUZBVUxUX0JZVEVTX1BFUl9CTE9DSyAxNgorCisvKiBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIG9mIHByZWNpc2lvbiBpbiBhIGZsb2F0LiAgKi8KKyNpZm5kZWYgRkxUX0RJRworIyBkZWZpbmUgRkxUX0RJRyA3CisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyBvZiBwcmVjaXNpb24gaW4gYSBkb3VibGUuICAqLworI2lmbmRlZiBEQkxfRElHCisjIGRlZmluZSBEQkxfRElHIDE1CisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyBvZiBwcmVjaXNpb24gaW4gYSBsb25nIGRvdWJsZS4gICovCisjaWZuZGVmIExEQkxfRElHCisjIGRlZmluZSBMREJMX0RJRyBEQkxfRElHCisjZW5kaWYKKworZW51bSBzaXplX3NwZWMgeworCU5PX1NJWkUsCisJQ0hBUiwKKwlTSE9SVCwKKwlJTlQsCisJTE9ORywKKwlMT05HX0xPTkcsCisJRkxPQVRfU0lOR0xFLAorCUZMT0FUX0RPVUJMRSwKKwlGTE9BVF9MT05HX0RPVUJMRSwKKwlOX1NJWkVfU1BFQ1MKK307CisKK2VudW0gb3V0cHV0X2Zvcm1hdCB7CisJU0lHTkVEX0RFQ0lNQUwsCisJVU5TSUdORURfREVDSU1BTCwKKwlPQ1RBTCwKKwlIRVhBREVDSU1BTCwKKwlGTE9BVElOR19QT0lOVCwKKwlOQU1FRF9DSEFSQUNURVIsCisJQ0hBUkFDVEVSCit9OworCisvKiBFYWNoIG91dHB1dCBmb3JtYXQgc3BlY2lmaWNhdGlvbiAoZnJvbSAnLXQgc3BlYycgb3IgZnJvbQorICAgb2xkLXN0eWxlIG9wdGlvbnMpIGlzIHJlcHJlc2VudGVkIGJ5IG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgKi8KK3N0cnVjdCB0c3BlYyB7CisJZW51bSBvdXRwdXRfZm9ybWF0IGZtdDsKKwllbnVtIHNpemVfc3BlYyBzaXplOworCXZvaWQgKCpwcmludF9mdW5jdGlvbikgKHNpemVfdCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCWNoYXIgKmZtdF9zdHJpbmc7CisJaW50IGhleGxfbW9kZV90cmFpbGVyOworCWludCBmaWVsZF93aWR0aDsKK307CisKKy8qIENvbnZlcnQgdGhlIG51bWJlciBvZiA4LWJpdCBieXRlcyBvZiBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiB0bworICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIChkaWdpdHMgKyBzaWduIGlmIHRoZSB0eXBlIGlzIHNpZ25lZCkKKyAgIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgc2FtZSBxdWFudGl0eSBpbiB0aGUgc3BlY2lmaWVkIGJhc2UvdHlwZS4KKyAgIEZvciBleGFtcGxlLCBhIDMyLWJpdCAoNC1ieXRlKSBxdWFudGl0eSBtYXkgcmVxdWlyZSBhIGZpZWxkIHdpZHRoCisgICBhcyB3aWRlIGFzIHRoZSBmb2xsb3dpbmcgZm9yIHRoZXNlIHR5cGVzOgorICAgMTEJdW5zaWduZWQgb2N0YWwKKyAgIDExCXNpZ25lZCBkZWNpbWFsCisgICAxMAl1bnNpZ25lZCBkZWNpbWFsCisgICA4CXVuc2lnbmVkIGhleGFkZWNpbWFsICAqLworCitzdGF0aWMgY29uc3QgdWludDhfdCBieXRlc190b19vY3RfZGlnaXRzW10gQUxJR04xID0KK3swLCAzLCA2LCA4LCAxMSwgMTQsIDE2LCAxOSwgMjIsIDI1LCAyNywgMzAsIDMyLCAzNSwgMzgsIDQxLCA0M307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJ5dGVzX3RvX3NpZ25lZF9kZWNfZGlnaXRzW10gQUxJR04xID0KK3sxLCA0LCA2LCA4LCAxMSwgMTMsIDE2LCAxOCwgMjAsIDIzLCAyNSwgMjgsIDMwLCAzMywgMzUsIDM3LCA0MH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJ5dGVzX3RvX3Vuc2lnbmVkX2RlY19kaWdpdHNbXSBBTElHTjEgPQorezAsIDMsIDUsIDgsIDEwLCAxMywgMTUsIDE3LCAyMCwgMjIsIDI1LCAyNywgMjksIDMyLCAzNCwgMzcsIDM5fTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnl0ZXNfdG9faGV4X2RpZ2l0c1tdIEFMSUdOMSA9Cit7MCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYsIDE4LCAyMCwgMjIsIDI0LCAyNiwgMjgsIDMwLCAzMn07CisKKy8qIENvbnZlcnQgZW51bSBzaXplX3NwZWMgdG8gdGhlIHNpemUgb2YgdGhlIG5hbWVkIHR5cGUuICAqLworc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIHdpZHRoX2J5dGVzW10gQUxJR04xID0geworCS0xLAorCXNpemVvZihjaGFyKSwKKwlzaXplb2Yoc2hvcnQpLAorCXNpemVvZihpbnQpLAorCXNpemVvZihsb25nKSwKKwlzaXplb2YodWxvbmdsb25nX3QpLAorCXNpemVvZihmbG9hdCksCisJc2l6ZW9mKGRvdWJsZSksCisJc2l6ZW9mKGxvbmdkb3VibGVfdCkKK307CisvKiBFbnN1cmUgdGhhdCBmb3IgZWFjaCBtZW1iZXIgb2YgJ2VudW0gc2l6ZV9zcGVjJyB0aGVyZSBpcyBhbgorICAgaW5pdGlhbGl6ZXIgaW4gdGhlIHdpZHRoX2J5dGVzIGFycmF5LiAgKi8KK3N0cnVjdCBFUlJfd2lkdGhfYnl0ZXNfaGFzX2JhZF9zaXplIHsKKwljaGFyIEVSUl93aWR0aF9ieXRlc19oYXNfYmFkX3NpemVbQVJSQVlfU0laRSh3aWR0aF9ieXRlcykgPT0gTl9TSVpFX1NQRUNTID8gMSA6IC0xXTsKK307CisKK3N0YXRpYyBzbWFsbGludCBleGl0X2NvZGU7CisKK3N0YXRpYyB1bnNpZ25lZCBzdHJpbmdfbWluOworCisvKiBBbiBhcnJheSBvZiBzcGVjcyBkZXNjcmliaW5nIGhvdyB0byBmb3JtYXQgZWFjaCBpbnB1dCBibG9jay4gICovCitzdGF0aWMgc2l6ZV90IG5fc3BlY3M7CitzdGF0aWMgc3RydWN0IHRzcGVjICpzcGVjOworCisvKiBGdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW4gYWRkcmVzcyBhbmQgYW4gb3B0aW9uYWwgZm9sbG93aW5nIGNoYXIsCisgICBhbmQgcHJpbnRzIHRoZSBhZGRyZXNzIGFuZCBjaGFyIHRvIHN0ZG91dC4gICovCitzdGF0aWMgdm9pZCAoKmZvcm1hdF9hZGRyZXNzKShvZmZfdCwgY2hhcik7CisvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvbGQtc3R5bGUgcHNldWRvIHN0YXJ0aW5nIGFkZHJlc3MgYW5kCisgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICAqLworI2lmIEVOQUJMRV9MT05HX09QVFMKK3N0YXRpYyBvZmZfdCBwc2V1ZG9fb2Zmc2V0OworI2Vsc2UKK2VudW0geyBwc2V1ZG9fb2Zmc2V0ID0gMCB9OworI2VuZGlmCisvKiBXaGVuIHplcm8sIE1BWF9CWVRFU19UT19GT1JNQVQgYW5kIEVORF9PRkZTRVQgYXJlIGlnbm9yZWQsIGFuZCBhbGwKKyAgIGlucHV0IGlzIGZvcm1hdHRlZC4gICovCisKKy8qIFRoZSBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgZm9ybWF0dGVkIHBlciBvdXRwdXQgbGluZS4gIEl0IG11c3QgYmUKKyAgIGEgbXVsdGlwbGUgb2YgdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiB0aGUgc2l6ZXMgYXNzb2NpYXRlZCB3aXRoCisgICB0aGUgc3BlY2lmaWVkIG91dHB1dCB0eXBlcy4gIEl0IHNob3VsZCBiZSBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYnV0CisgICBubyBsYXJnZXIgdGhhbiAxNiAtLSB1bmxlc3Mgc3BlY2lmaWVkIHdpdGggdGhlIC13IG9wdGlvbi4gICovCitzdGF0aWMgdW5zaWduZWQgYnl0ZXNfcGVyX2Jsb2NrID0gMzI7IC8qIGhhdmUgdG8gdXNlIHVuc2lnbmVkLCBub3Qgc2l6ZV90ICovCisKKy8qIEEgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgdGhlIGZpbGUtYXJndW1lbnRzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgKmZpbGVfbGlzdDsKKworLyogVGhlIGlucHV0IHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgZmlsZS4gICovCitzdGF0aWMgRklMRSAqaW5fc3RyZWFtOworCisjZGVmaW5lIE1BWF9JTlRFR1JBTF9UWVBFX1NJWkUgc2l6ZW9mKHVsb25nbG9uZ190KQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW50ZWdyYWxfdHlwZV9zaXplW01BWF9JTlRFR1JBTF9UWVBFX1NJWkUgKyAxXSBBTElHTjEgPSB7CisJW3NpemVvZihjaGFyKV0gPSBDSEFSLAorI2lmIFVTSFJUX01BWCAhPSBVQ0hBUl9NQVgKKwlbc2l6ZW9mKHNob3J0KV0gPSBTSE9SVCwKKyNlbmRpZgorI2lmIFVJTlRfTUFYICE9IFVTSFJUX01BWAorCVtzaXplb2YoaW50KV0gPSBJTlQsCisjZW5kaWYKKyNpZiBVTE9OR19NQVggIT0gVUlOVF9NQVgKKwlbc2l6ZW9mKGxvbmcpXSA9IExPTkcsCisjZW5kaWYKKyNpZiBVTExPTkdfTUFYICE9IFVMT05HX01BWAorCVtzaXplb2YodWxvbmdsb25nX3QpXSA9IExPTkdfTE9ORywKKyNlbmRpZgorfTsKKworI2RlZmluZSBNQVhfRlBfVFlQRV9TSVpFIHNpemVvZihsb25nZG91YmxlX3QpCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmcF90eXBlX3NpemVbTUFYX0ZQX1RZUEVfU0laRSArIDFdIEFMSUdOMSA9IHsKKwkvKiBnY2Mgc2VlbXMgdG8gYWxsb3cgcmVwZWF0ZWQgaW5kZXhlcy4gTGFzdCBvbmUgd2lucyAqLworCVtzaXplb2YobG9uZ2RvdWJsZV90KV0gPSBGTE9BVF9MT05HX0RPVUJMRSwKKwlbc2l6ZW9mKGRvdWJsZSldID0gRkxPQVRfRE9VQkxFLAorCVtzaXplb2YoZmxvYXQpXSA9IEZMT0FUX1NJTkdMRQorfTsKKworCitzdGF0aWMgdW5zaWduZWQKK2djZCh1bnNpZ25lZCB1LCB1bnNpZ25lZCB2KQoreworCXVuc2lnbmVkIHQ7CisJd2hpbGUgKHYgIT0gMCkgeworCQl0ID0gdSAlIHY7CisJCXUgPSB2OworCQl2ID0gdDsKKwl9CisJcmV0dXJuIHU7Cit9CisKKy8qIENvbXB1dGUgdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiBVIGFuZCBWLiAgKi8KK3N0YXRpYyB1bnNpZ25lZAorbGNtKHVuc2lnbmVkIHUsIHVuc2lnbmVkIHYpIHsKKwl1bnNpZ25lZCB0ID0gZ2NkKHUsIHYpOworCWlmICh0ID09IDApCisJCXJldHVybiAwOworCXJldHVybiB1ICogdiAvIHQ7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zX2NoYXIoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLCBjb25zdCBjaGFyICpmbXRfc3RyaW5nKQoreworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJaW50IHRtcCA9ICooc2lnbmVkIGNoYXIgKikgYmxvY2s7CisJCXByaW50ZihmbXRfc3RyaW5nLCB0bXApOworCQlibG9jayArPSBzaXplb2YodW5zaWduZWQgY2hhcik7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfY2hhcihzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQl1bnNpZ25lZCB0bXAgPSAqKHVuc2lnbmVkIGNoYXIgKikgYmxvY2s7CisJCXByaW50ZihmbXRfc3RyaW5nLCB0bXApOworCQlibG9jayArPSBzaXplb2YodW5zaWduZWQgY2hhcik7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc19zaG9ydChzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJbl9ieXRlcyAvPSBzaXplb2Yoc2lnbmVkIHNob3J0KTsKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCWludCB0bXAgPSAqKHNpZ25lZCBzaG9ydCAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc2hvcnQoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLCBjb25zdCBjaGFyICpmbXRfc3RyaW5nKQoreworCW5fYnl0ZXMgLz0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCXVuc2lnbmVkIHRtcCA9ICoodW5zaWduZWQgc2hvcnQgKikgYmxvY2s7CisJCXByaW50ZihmbXRfc3RyaW5nLCB0bXApOworCQlibG9jayArPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCX0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X2ludChzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJbl9ieXRlcyAvPSBzaXplb2YodW5zaWduZWQpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJdW5zaWduZWQgdG1wID0gKih1bnNpZ25lZCAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bnNpZ25lZCk7CisJfQorfQorCisjaWYgVUlOVF9NQVggPT0gVUxPTkdfTUFYCisjIGRlZmluZSBwcmludF9sb25nIHByaW50X2ludAorI2Vsc2UKK3N0YXRpYyB2b2lkCitwcmludF9sb25nKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wID0gKih1bnNpZ25lZCBsb25nICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCX0KK30KKyNlbmRpZgorCisjaWYgVUxPTkdfTUFYID09IFVMTE9OR19NQVgKKyMgZGVmaW5lIHByaW50X2xvbmdfbG9uZyBwcmludF9sb25nCisjZWxzZQorc3RhdGljIHZvaWQKK3ByaW50X2xvbmdfbG9uZyhzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJbl9ieXRlcyAvPSBzaXplb2YodWxvbmdsb25nX3QpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJdWxvbmdsb25nX3QgdG1wID0gKih1bG9uZ2xvbmdfdCAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bG9uZ2xvbmdfdCk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitwcmludF9mbG9hdChzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJbl9ieXRlcyAvPSBzaXplb2YoZmxvYXQpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJZmxvYXQgdG1wID0gKihmbG9hdCAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZihmbG9hdCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZG91YmxlKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZihkb3VibGUpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJZG91YmxlIHRtcCA9ICooZG91YmxlICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKGRvdWJsZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfbG9uZ19kb3VibGUoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLCBjb25zdCBjaGFyICpmbXRfc3RyaW5nKQoreworCW5fYnl0ZXMgLz0gc2l6ZW9mKGxvbmdkb3VibGVfdCk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQlsb25nZG91YmxlX3QgdG1wID0gKihsb25nZG91YmxlX3QgKikgYmxvY2s7CisJCXByaW50ZihmbXRfc3RyaW5nLCB0bXApOworCQlibG9jayArPSBzaXplb2YobG9uZ2RvdWJsZV90KTsKKwl9Cit9CisKKy8qIHByaW50X1tuYW1lZF1fYXNjaWkgYXJlIG9wdGltaXplZCBmb3Igc3BlZWQuCisgKiBSZW1lbWJlciwgc29tZWRheSB5b3UgbWF5IHdhbnQgdG8gcHVtcCBnaWdhYnl0ZXMgdGhyb3VnaCB0aGlzIHRoaW5nLgorICogU2F2aW5nIGEgZG96ZW4gb2YgLnRleHQgYnl0ZXMgaGVyZSBpcyBjb3VudGVyLXByb2R1Y3RpdmUgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X25hbWVkX2FzY2lpKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywKKwkJY29uc3QgY2hhciAqdW51c2VkX2ZtdF9zdHJpbmcgVU5VU0VEX1BBUkFNKQoreworCS8qIE5hbWVzIGZvciBzb21lIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzLiAgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBjaGFybmFtZVszM11bM10gQUxJR04xID0geworCQkibnVsIiwgInNvaCIsICJzdHgiLCAiZXR4IiwgImVvdCIsICJlbnEiLCAiYWNrIiwgImJlbCIsCisJCSIgYnMiLCAiIGh0IiwgIiBubCIsICIgdnQiLCAiIGZmIiwgIiBjciIsICIgc28iLCAiIHNpIiwKKwkJImRsZSIsICJkYzEiLCAiZGMyIiwgImRjMyIsICJkYzQiLCAibmFrIiwgInN5biIsICJldGIiLAorCQkiY2FuIiwgIiBlbSIsICJzdWIiLCAiZXNjIiwgIiBmcyIsICIgZ3MiLCAiIHJzIiwgIiB1cyIsCisJCSIgc3AiCisJfTsKKwkvLyBidWZbTl0gcG9zOiAgMDEyMzQgNTY3ODkKKwljaGFyIGJ1ZlsxMl0gPSAiICAgeFwwIDB4eFwwIjsKKwkvLyBhY3R1YWxseSAiICAgeFwwIHh4eFwwIiwgYnV0IHdhbnQgdG8gc2hhcmUgc3RyaW5nIHdpdGggcHJpbnRfYXNjaWkuCisJLy8gWzEyXSBiZWNhdXNlIHdlIHRha2UgdGhyZWUgMzJiaXQgc3RhY2sgc2xvdHMgYW55d2F5LCBhbmQKKwkvLyBnY2MgaXMgdG9vIGR1bWIgdG8gaW5pdGlhbGl6ZSB3aXRoIGNvbnN0YW50IHN0b3JlcywKKwkvLyBpdCBjb3BpZXMgaW5pdGlhbGl6ZXIgZnJvbSByb2RhdGEuIE9oIHdlbGwuCisKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCXVuc2lnbmVkIG1hc2tlZF9jID0gKih1bnNpZ25lZCBjaGFyICopIGJsb2NrKys7CisKKwkJbWFza2VkX2MgJj0gMHg3ZjsKKwkJaWYgKG1hc2tlZF9jID09IDB4N2YpIHsKKwkJCWZwdXRzKCIgZGVsIiwgc3Rkb3V0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYXNrZWRfYyA+ICcgJykgeworCQkJYnVmWzNdID0gbWFza2VkX2M7CisJCQlmcHV0cyhidWYsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXaHk/IEJlY2F1c2UgcHJpbnRmKCIgJTMuM3MiKSBpcyBtdWNoIHNsb3dlci4uLiAqLworCQlidWZbNl0gPSBjaGFybmFtZVttYXNrZWRfY11bMF07CisJCWJ1Zls3XSA9IGNoYXJuYW1lW21hc2tlZF9jXVsxXTsKKwkJYnVmWzhdID0gY2hhcm5hbWVbbWFza2VkX2NdWzJdOworCQlmcHV0cyhidWYrNSwgc3Rkb3V0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9hc2NpaShzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssCisJCWNvbnN0IGNoYXIgKnVudXNlZF9mbXRfc3RyaW5nIFVOVVNFRF9QQVJBTSkKK3sKKwkvLyBidWZbTl0gcG9zOiAgMDEyMzQgNTY3ODkKKwljaGFyIGJ1ZlsxMl0gPSAiICAgeFwwIDB4eFwwIjsKKworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJY29uc3QgY2hhciAqczsKKwkJdW5zaWduZWQgYyA9ICoodW5zaWduZWQgY2hhciAqKSBibG9jaysrOworCisJCWlmIChJU1BSSU5UKGMpKSB7CisJCQlidWZbM10gPSBjOworCQkJZnB1dHMoYnVmLCBzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1wwJzoKKwkJCXMgPSAiICBcXDAiOworCQkJYnJlYWs7CisJCWNhc2UgJ1wwMDcnOgorCQkJcyA9ICIgIFxcYSI7CisJCQlicmVhazsKKwkJY2FzZSAnXGInOgorCQkJcyA9ICIgIFxcYiI7CisJCQlicmVhazsKKwkJY2FzZSAnXGYnOgorCQkJcyA9ICIgIFxcZiI7CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQkJcyA9ICIgIFxcbiI7CisJCQlicmVhazsKKwkJY2FzZSAnXHInOgorCQkJcyA9ICIgIFxcciI7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJcyA9ICIgIFxcdCI7CisJCQlicmVhazsKKwkJY2FzZSAnXHYnOgorCQkJcyA9ICIgIFxcdiI7CisJCQlicmVhazsKKwkJY2FzZSAnXHg3Zic6CisJCQlzID0gIiAxNzciOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIGMgaXMgbmV2ZXIgbGFyZ2VyIHRoYW4gMDQwICovCisJCQlidWZbN10gPSAoYyA+PiAzKSArICcwJzsKKwkJCWJ1Zls4XSA9IChjICYgNykgKyAnMCc7CisJCQlzID0gYnVmICsgNTsKKwkJfQorCQlmcHV0cyhzLCBzdGRvdXQpOworCX0KK30KKworLyogR2l2ZW4gYSBsaXN0IG9mIG9uZSBvciBtb3JlIGlucHV0IGZpbGVuYW1lcyBGSUxFX0xJU1QsIHNldCB0aGUgZ2xvYmFsCisgICBmaWxlIHBvaW50ZXIgSU5fU1RSRUFNIGFuZCB0aGUgZ2xvYmFsIHN0cmluZyBJTlBVVF9GSUxFTkFNRSB0byB0aGUKKyAgIGZpcnN0IG9uZSB0aGF0IGNhbiBiZSBzdWNjZXNzZnVsbHkgb3BlbmVkLiBNb2RpZnkgRklMRV9MSVNUIHRvCisgICByZWZlcmVuY2UgdGhlIG5leHQgZmlsZW5hbWUgaW4gdGhlIGxpc3QuICBBIGZpbGUgbmFtZSBvZiAiLSIgaXMKKyAgIGludGVycHJldGVkIGFzIHN0YW5kYXJkIGlucHV0LiAgSWYgYW55IGZpbGUgb3BlbiBmYWlscywgZ2l2ZSBhbiBlcnJvcgorICAgbWVzc2FnZSBhbmQgcmV0dXJuIG5vbnplcm8uICAqLworCitzdGF0aWMgdm9pZAorb3Blbl9uZXh0X2ZpbGUodm9pZCkKK3sKKwl3aGlsZSAoMSkgeworCQlpZiAoISpmaWxlX2xpc3QpCisJCQlyZXR1cm47CisJCWluX3N0cmVhbSA9IGZvcGVuX29yX3dhcm5fc3RkaW4oKmZpbGVfbGlzdCsrKTsKKwkJaWYgKGluX3N0cmVhbSkgeworCQkJYnJlYWs7CisJCX0KKwkJZXhpdF9jb2RlID0gMTsKKwl9CisKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiAoT1BUX058T1BUX1MpKSA9PSBPUFRfTikKKwkJc2V0YnVmKGluX3N0cmVhbSwgTlVMTCk7Cit9CisKKy8qIFRlc3Qgd2hldGhlciB0aGVyZSBoYXZlIGJlZW4gZXJyb3JzIG9uIGluX3N0cmVhbSwgYW5kIGNsb3NlIGl0IGlmCisgICBpdCBpcyBub3Qgc3RhbmRhcmQgaW5wdXQuICBSZXR1cm4gbm9uemVybyBpZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvcgorICAgb24gaW5fc3RyZWFtIG9yIHN0ZG91dDsgcmV0dXJuIHplcm8gb3RoZXJ3aXNlLiAgVGhpcyBmdW5jdGlvbiB3aWxsCisgICByZXBvcnQgbW9yZSB0aGFuIG9uZSBlcnJvciBvbmx5IGlmIGJvdGggYSByZWFkIGFuZCBhIHdyaXRlIGVycm9yCisgICBoYXZlIG9jY3VycmVkLiAgSU5fRVJSTk8sIGlmIG5vbnplcm8sIGlzIHRoZSBlcnJvciBudW1iZXIKKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vc3QgcmVjZW50IGFjdGlvbiBmb3IgSU5fU1RSRUFNLiAgKi8KKworc3RhdGljIHZvaWQKK2NoZWNrX2FuZF9jbG9zZSh2b2lkKQoreworCWlmIChpbl9zdHJlYW0pIHsKKwkJaWYgKGZlcnJvcihpbl9zdHJlYW0pKQl7CisJCQliYl9lcnJvcl9tc2coIiVzOiByZWFkIGVycm9yIiwgKGluX3N0cmVhbSA9PSBzdGRpbikKKwkJCQkJPyBiYl9tc2dfc3RhbmRhcmRfaW5wdXQKKwkJCQkJOiBmaWxlX2xpc3RbLTFdCisJCQkpOworCQkJZXhpdF9jb2RlID0gMTsKKwkJfQorCQlmY2xvc2VfaWZfbm90X3N0ZGluKGluX3N0cmVhbSk7CisJCWluX3N0cmVhbSA9IE5VTEw7CisJfQorCisJaWYgKGZlcnJvcihzdGRvdXQpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ193cml0ZV9lcnJvcik7CisJfQorfQorCisvKiBJZiBTIHBvaW50cyB0byBhIHNpbmdsZSB2YWxpZCBtb2Rlcm4gb2QgZm9ybWF0IHN0cmluZywgcHV0CisgICBhIGRlc2NyaXB0aW9uIG9mIHRoYXQgZm9ybWF0IGluICpUU1BFQywgcmV0dXJuIHBvaW50ZXIgdG8KKyAgIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGp1c3QtZGVjb2RlZCBmb3JtYXQuCisgICBGb3IgZXhhbXBsZSwgaWYgUyB3ZXJlICJkNGFmTCIsIHdlIHdpbGwgcmV0dXJuIGEgcnRwIHRvICJhZkwiCisgICBhbmQgKlRTUEVDIHdvdWxkIGJlCisJeworCQlmbXQgPSBTSUdORURfREVDSU1BTDsKKwkJc2l6ZSA9IElOVCBvciBMT05HOyAod2hpY2hldmVyIGludGVncmFsX3R5cGVfc2l6ZVs0XSByZXNvbHZlcyB0bykKKwkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9pbnQ7IChhc3N1bWluZyBzaXplID09IElOVCkKKwkJZm10X3N0cmluZyA9ICIlMDExZCVjIjsKKwl9CisgICBTX09SSUcgaXMgc29sZWx5IGZvciByZXBvcnRpbmcgZXJyb3JzLiAgSXQgc2hvdWxkIGJlIHRoZSBmdWxsIGZvcm1hdAorICAgc3RyaW5nIGFyZ3VtZW50LiAqLworCitzdGF0aWMgTk9JTkxJTkUgY29uc3QgY2hhciAqCitkZWNvZGVfb25lX2Zvcm1hdChjb25zdCBjaGFyICpzX29yaWcsIGNvbnN0IGNoYXIgKnMsIHN0cnVjdCB0c3BlYyAqdHNwZWMpCit7CisJZW51bSBzaXplX3NwZWMgc2l6ZV9zcGVjOworCXVuc2lnbmVkIHNpemU7CisJZW51bSBvdXRwdXRfZm9ybWF0IGZtdDsKKwljb25zdCBjaGFyICpwOworCWNoYXIgKmVuZDsKKwljaGFyICpmbXRfc3RyaW5nID0gTlVMTDsKKwl2b2lkICgqcHJpbnRfZnVuY3Rpb24pIChzaXplX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKwl1bnNpZ25lZCBjOworCXVuc2lnbmVkIGZpZWxkX3dpZHRoID0gMDsKKwlpbnQgcG9zOworCisJc3dpdGNoICgqcykgeworCWNhc2UgJ2QnOgorCWNhc2UgJ28nOgorCWNhc2UgJ3UnOgorCWNhc2UgJ3gnOiB7CisJCXN0YXRpYyBjb25zdCBjaGFyIENTSUxbXSBBTElHTjEgPSAiQ1NJTCI7CisKKwkJYyA9ICpzKys7CisJCXAgPSBzdHJjaHIoQ1NJTCwgKnMpOworCQkvKiBpZiAqcyA9PSBOVUwsIHAgIT0gTlVMTCEgVGVzdGNhc2U6ICJvZCAtdHgiICovCisJCWlmICghcCB8fCAqcCA9PSAnXDAnKSB7CisJCQlzaXplID0gc2l6ZW9mKGludCk7CisJCQlpZiAoaXNkaWdpdChzWzBdKSkgeworCQkJCXNpemUgPSBiYl9zdHJ0b3UocywgJmVuZCwgMCk7CisJCQkJaWYgKGVycm5vID09IEVSQU5HRQorCQkJCSB8fCBNQVhfSU5URUdSQUxfVFlQRV9TSVpFIDwgc2l6ZQorCQkJCSB8fCBpbnRlZ3JhbF90eXBlX3NpemVbc2l6ZV0gPT0gTk9fU0laRQorCQkJCSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCB0eXBlIHN0cmluZyAnJXMnOyAiCisJCQkJCQkiJXUtYnl0ZSAlcyB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiLAorCQkJCQkJc19vcmlnLCBzaXplLCAiaW50ZWdyYWwiKTsKKwkJCQl9CisJCQkJcyA9IGVuZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IENTSUxfc2l6ZW9mWzRdID0geworCQkJCXNpemVvZihjaGFyKSwKKwkJCQlzaXplb2Yoc2hvcnQpLAorCQkJCXNpemVvZihpbnQpLAorCQkJCXNpemVvZihsb25nKSwKKwkJCX07CisJCQlzaXplID0gQ1NJTF9zaXplb2ZbcCAtIENTSUxdOworCQkJcysrOyAvKiBza2lwIEMvUy9JL0wgKi8KKwkJfQorCisjZGVmaW5lIElTUEVDX1RPX0ZPUk1BVChTcGVjLCBNaW5fZm9ybWF0LCBMb25nX2Zvcm1hdCwgTWF4X2Zvcm1hdCkgXAorCSgoU3BlYykgPT0gTE9OR19MT05HID8gKE1heF9mb3JtYXQpIFwKKwk6ICgoU3BlYykgPT0gTE9ORyA/IChMb25nX2Zvcm1hdCkgOiAoTWluX2Zvcm1hdCkpKQorCisjZGVmaW5lIEZNVF9CWVRFU19BTExPQ0FURUQgOQorCQlzaXplX3NwZWMgPSBpbnRlZ3JhbF90eXBlX3NpemVbc2l6ZV07CisKKwkJeworCQkJc3RhdGljIGNvbnN0IGNoYXIgZG91eFtdIEFMSUdOMSA9ICJkb3V4IjsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGRvdXhfZm10X2xldHRlcltdWzRdID0geworCQkJCSJsbGQiLCAibGxvIiwgImxsdSIsICJsbHgiCisJCQl9OworCQkJc3RhdGljIGNvbnN0IGVudW0gb3V0cHV0X2Zvcm1hdCBkb3V4X2ZtdFtdID0geworCQkJCVNJR05FRF9ERUNJTUFMLAorCQkJCU9DVEFMLAorCQkJCVVOU0lHTkVEX0RFQ0lNQUwsCisJCQkJSEVYQURFQ0lNQUwsCisJCQl9OworCQkJc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRvdXhfYnl0ZXNfdG9fWFhYW10gPSB7CisJCQkJYnl0ZXNfdG9fc2lnbmVkX2RlY19kaWdpdHMsCisJCQkJYnl0ZXNfdG9fb2N0X2RpZ2l0cywKKwkJCQlieXRlc190b191bnNpZ25lZF9kZWNfZGlnaXRzLAorCQkJCWJ5dGVzX3RvX2hleF9kaWdpdHMsCisJCQl9OworCQkJc3RhdGljIGNvbnN0IGNoYXIgZG91eF9mbXRzdHJpbmdbXVtzaXplb2YoIiAlJTAldSVzIildID0geworCQkJCSIgJSUldSVzIiwKKwkJCQkiICUlMCV1JXMiLAorCQkJCSIgJSUldSVzIiwKKwkJCQkiICUlMCV1JXMiLAorCQkJfTsKKworCQkJcG9zID0gc3RyY2hyKGRvdXgsIGMpIC0gZG91eDsKKwkJCWZtdCA9IGRvdXhfZm10W3Bvc107CisJCQlmaWVsZF93aWR0aCA9IGRvdXhfYnl0ZXNfdG9fWFhYW3Bvc11bc2l6ZV07CisJCQlwID0gZG91eF9mbXRfbGV0dGVyW3Bvc10gKyAyOworCQkJaWYgKHNpemVfc3BlYyA9PSBMT05HKSBwLS07CisJCQlpZiAoc2l6ZV9zcGVjID09IExPTkdfTE9ORykgcCAtPSAyOworCQkJZm10X3N0cmluZyA9IHhhc3ByaW50Zihkb3V4X2ZtdHN0cmluZ1twb3NdLCBmaWVsZF93aWR0aCwgcCk7CisJCX0KKworCQlzd2l0Y2ggKHNpemVfc3BlYykgeworCQljYXNlIENIQVI6CisJCQlwcmludF9mdW5jdGlvbiA9IChmbXQgPT0gU0lHTkVEX0RFQ0lNQUwKKwkJCQkgICAgPyBwcmludF9zX2NoYXIKKwkJCQkgICAgOiBwcmludF9jaGFyKTsKKwkJCWJyZWFrOworCQljYXNlIFNIT1JUOgorCQkJcHJpbnRfZnVuY3Rpb24gPSAoZm10ID09IFNJR05FRF9ERUNJTUFMCisJCQkJICAgID8gcHJpbnRfc19zaG9ydAorCQkJCSAgICA6IHByaW50X3Nob3J0KTsKKwkJCWJyZWFrOworCQljYXNlIElOVDoKKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfaW50OworCQkJYnJlYWs7CisJCWNhc2UgTE9ORzoKKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfbG9uZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBjYXNlIExPTkdfTE9ORzogKi8KKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfbG9uZ19sb25nOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSAnZic6IHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgRkRMW10gQUxJR04xID0gIkZETCI7CisKKwkJZm10ID0gRkxPQVRJTkdfUE9JTlQ7CisJCSsrczsKKwkJcCA9IHN0cmNocihGREwsICpzKTsKKwkJaWYgKCFwKSB7CisJCQlzaXplID0gc2l6ZW9mKGRvdWJsZSk7CisJCQlpZiAoaXNkaWdpdChzWzBdKSkgeworCQkJCXNpemUgPSBiYl9zdHJ0b3UocywgJmVuZCwgMCk7CisJCQkJaWYgKGVycm5vID09IEVSQU5HRSB8fCBzaXplID4gTUFYX0ZQX1RZUEVfU0laRQorCQkJCSB8fCBmcF90eXBlX3NpemVbc2l6ZV0gPT0gTk9fU0laRQorCQkJCSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCB0eXBlIHN0cmluZyAnJXMnOyAiCisJCQkJCQkiJXUtYnl0ZSAlcyB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiLAorCQkJCQkJc19vcmlnLCBzaXplLCAiZmxvYXRpbmcgcG9pbnQiKTsKKwkJCQl9CisJCQkJcyA9IGVuZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IEZETF9zaXplb2ZbXSA9IHsKKwkJCQlzaXplb2YoZmxvYXQpLAorCQkJCXNpemVvZihkb3VibGUpLAorCQkJCXNpemVvZihsb25nZG91YmxlX3QpLAorCQkJfTsKKworCQkJc2l6ZSA9IEZETF9zaXplb2ZbcCAtIEZETF07CisJCX0KKworCQlzaXplX3NwZWMgPSBmcF90eXBlX3NpemVbc2l6ZV07CisKKwkJc3dpdGNoIChzaXplX3NwZWMpIHsKKwkJY2FzZSBGTE9BVF9TSU5HTEU6CisJCQlwcmludF9mdW5jdGlvbiA9IHByaW50X2Zsb2F0OworCQkJZmllbGRfd2lkdGggPSBGTFRfRElHICsgODsKKwkJCS8qIERvbid0IHVzZSAlI2U7IG5vdCBhbGwgc3lzdGVtcyBzdXBwb3J0IGl0LiAgKi8KKwkJCWZtdF9zdHJpbmcgPSB4YXNwcmludGYoIiAlJSVkLiVkZSIsIGZpZWxkX3dpZHRoLCBGTFRfRElHKTsKKwkJCWJyZWFrOworCQljYXNlIEZMT0FUX0RPVUJMRToKKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfZG91YmxlOworCQkJZmllbGRfd2lkdGggPSBEQkxfRElHICsgODsKKwkJCWZtdF9zdHJpbmcgPSB4YXNwcmludGYoIiAlJSVkLiVkZSIsIGZpZWxkX3dpZHRoLCBEQkxfRElHKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBjYXNlIEZMT0FUX0xPTkdfRE9VQkxFOiAqLworCQkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9sb25nX2RvdWJsZTsKKwkJCWZpZWxkX3dpZHRoID0gTERCTF9ESUcgKyA4OworCQkJZm10X3N0cmluZyA9IHhhc3ByaW50ZigiICUlJWQuJWRMZSIsIGZpZWxkX3dpZHRoLCBMREJMX0RJRyk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlICdhJzoKKwkJKytzOworCQlmbXQgPSBOQU1FRF9DSEFSQUNURVI7CisJCXNpemVfc3BlYyA9IENIQVI7CisJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfbmFtZWRfYXNjaWk7CisJCWZpZWxkX3dpZHRoID0gMzsKKwkJYnJlYWs7CisJY2FzZSAnYyc6CisJCSsrczsKKwkJZm10ID0gQ0hBUkFDVEVSOworCQlzaXplX3NwZWMgPSBDSEFSOworCQlwcmludF9mdW5jdGlvbiA9IHByaW50X2FzY2lpOworCQlmaWVsZF93aWR0aCA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGNoYXJhY3RlciAnJWMnICIKKwkJCQkiaW4gdHlwZSBzdHJpbmcgJyVzJyIsICpzLCBzX29yaWcpOworCX0KKworCXRzcGVjLT5zaXplID0gc2l6ZV9zcGVjOworCXRzcGVjLT5mbXQgPSBmbXQ7CisJdHNwZWMtPnByaW50X2Z1bmN0aW9uID0gcHJpbnRfZnVuY3Rpb247CisJdHNwZWMtPmZtdF9zdHJpbmcgPSBmbXRfc3RyaW5nOworCisJdHNwZWMtPmZpZWxkX3dpZHRoID0gZmllbGRfd2lkdGg7CisJdHNwZWMtPmhleGxfbW9kZV90cmFpbGVyID0gKCpzID09ICd6Jyk7CisJaWYgKHRzcGVjLT5oZXhsX21vZGVfdHJhaWxlcikKKwkJcysrOworCisJcmV0dXJuIHM7Cit9CisKKy8qIERlY29kZSB0aGUgbW9kZXJuIG9kIGZvcm1hdCBzdHJpbmcgUy4gIEFwcGVuZCB0aGUgZGVjb2RlZAorICAgcmVwcmVzZW50YXRpb24gdG8gdGhlIGdsb2JhbCBhcnJheSBTUEVDLCByZWFsbG9jYXRpbmcgU1BFQyBpZgorICAgbmVjZXNzYXJ5LiAgKi8KKworc3RhdGljIHZvaWQKK2RlY29kZV9mb3JtYXRfc3RyaW5nKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3QgY2hhciAqc19vcmlnID0gczsKKworCXdoaWxlICgqcyAhPSAnXDAnKSB7CisJCXN0cnVjdCB0c3BlYyB0c3BlYzsKKwkJY29uc3QgY2hhciAqbmV4dDsKKworCQluZXh0ID0gZGVjb2RlX29uZV9mb3JtYXQoc19vcmlnLCBzLCAmdHNwZWMpOworCisJCWFzc2VydChzICE9IG5leHQpOworCQlzID0gbmV4dDsKKwkJc3BlYyA9IHhyZWFsbG9jX3ZlY3RvcihzcGVjLCA0LCBuX3NwZWNzKTsKKwkJbWVtY3B5KCZzcGVjW25fc3BlY3NdLCAmdHNwZWMsIHNpemVvZihzcGVjWzBdKSk7CisJCW5fc3BlY3MrKzsKKwl9Cit9CisKKy8qIEdpdmVuIGEgbGlzdCBvZiBvbmUgb3IgbW9yZSBpbnB1dCBmaWxlbmFtZXMgRklMRV9MSVNULCBzZXQgdGhlIGdsb2JhbAorICAgZmlsZSBwb2ludGVyIElOX1NUUkVBTSB0byBwb3NpdGlvbiBOX1NLSVAgaW4gdGhlIGNvbmNhdGVuYXRpb24gb2YKKyAgIHRob3NlIGZpbGVzLiAgSWYgYW55IGZpbGUgb3BlcmF0aW9uIGZhaWxzIG9yIGlmIHRoZXJlIGFyZSBmZXdlciB0aGFuCisgICBOX1NLSVAgYnl0ZXMgaW4gdGhlIGNvbWJpbmVkIGlucHV0LCBnaXZlIGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybgorICAgbm9uemVyby4gIFdoZW4gcG9zc2libGUsIHVzZSBzZWVrIHJhdGhlciB0aGFuIHJlYWQgb3BlcmF0aW9ucyB0bworICAgYWR2YW5jZSBJTl9TVFJFQU0uICAqLworCitzdGF0aWMgdm9pZAorc2tpcChvZmZfdCBuX3NraXApCit7CisJaWYgKG5fc2tpcCA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoaW5fc3RyZWFtKSB7IC8qICFFT0YgKi8KKwkJc3RydWN0IHN0YXQgZmlsZV9zdGF0czsKKworCQkvKiBGaXJzdCB0cnkgc2Vla2luZy4gIEZvciBsYXJnZSBvZmZzZXRzLCB0aGlzIGV4dHJhIHdvcmsgaXMKKwkJICAgd29ydGh3aGlsZS4gIElmIHRoZSBvZmZzZXQgaXMgYmVsb3cgc29tZSB0aHJlc2hvbGQgaXQgbWF5IGJlCisJCSAgIG1vcmUgZWZmaWNpZW50IHRvIG1vdmUgdGhlIHBvaW50ZXIgYnkgcmVhZGluZy4gIFRoZXJlIGFyZSB0d28KKwkJICAgaXNzdWVzIHdoZW4gdHJ5aW5nIHRvIHNlZWs6CisJCQktIHRoZSBmaWxlIG11c3QgYmUgc2Vla2FibGUuCisJCQktIGJlZm9yZSBzZWVraW5nIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24sIG1ha2Ugc3VyZQorCQkJICB0aGF0IHRoZSBuZXcgcG9zaXRpb24gaXMgaW4gdGhlIGN1cnJlbnQgZmlsZS4KKwkJCSAgVHJ5IHRvIGRvIHRoYXQgYnkgZ2V0dGluZyBmaWxlJ3Mgc2l6ZSB1c2luZyBmc3RhdC4KKwkJCSAgQnV0IHRoYXQgd2lsbCB3b3JrIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMuICAqLworCisJCQkvKiBUaGUgc3Rfc2l6ZSBmaWVsZCBpcyB2YWxpZCBvbmx5IGZvciByZWd1bGFyIGZpbGVzCisJCQkgICAoYW5kIGZvciBzeW1ib2xpYyBsaW5rcywgd2hpY2ggY2Fubm90IG9jY3VyIGhlcmUpLgorCQkJICAgSWYgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHNraXAgaXMgYXQgbGVhc3QKKwkJCSAgIGFzIGxhcmdlIGFzIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZpbGUsIHdlIGNhbgorCQkJICAgZGVjcmVtZW50IG5fc2tpcCBhbmQgZ28gb24gdG8gdGhlIG5leHQgZmlsZS4gICovCisJCWlmIChmc3RhdChmaWxlbm8oaW5fc3RyZWFtKSwgJmZpbGVfc3RhdHMpID09IDAKKwkJICYmIFNfSVNSRUcoZmlsZV9zdGF0cy5zdF9tb2RlKSAmJiBmaWxlX3N0YXRzLnN0X3NpemUgPiAwCisJCSkgeworCQkJaWYgKGZpbGVfc3RhdHMuc3Rfc2l6ZSA8IG5fc2tpcCkgeworCQkJCW5fc2tpcCAtPSBmaWxlX3N0YXRzLnN0X3NpemU7CisJCQkJLyogdGFrZSAiY2hlY2sgJiBjbG9zZSAvIG9wZW5fbmV4dCIgcm91dGUgKi8KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZzZWVrbyhpbl9zdHJlYW0sIG5fc2tpcCwgU0VFS19DVVIpICE9IDApCisJCQkJCWV4aXRfY29kZSA9IDE7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogSWYgaXQncyBub3QgYSByZWd1bGFyIGZpbGUgd2l0aCBwb3NpdGl2ZSBzaXplLAorCQkJICAgcG9zaXRpb24gdGhlIGZpbGUgcG9pbnRlciBieSByZWFkaW5nLiAgKi8KKwkJCWNoYXIgYnVmWzEwMjRdOworCQkJc2l6ZV90IG5fYnl0ZXNfdG9fcmVhZCA9IDEwMjQ7CisJCQlzaXplX3Qgbl9ieXRlc19yZWFkOworCisJCQl3aGlsZSAobl9za2lwID4gMCkgeworCQkJCWlmIChuX3NraXAgPCBuX2J5dGVzX3RvX3JlYWQpCisJCQkJCW5fYnl0ZXNfdG9fcmVhZCA9IG5fc2tpcDsKKwkJCQluX2J5dGVzX3JlYWQgPSBmcmVhZChidWYsIDEsIG5fYnl0ZXNfdG9fcmVhZCwgaW5fc3RyZWFtKTsKKwkJCQluX3NraXAgLT0gbl9ieXRlc19yZWFkOworCQkJCWlmIChuX2J5dGVzX3JlYWQgIT0gbl9ieXRlc190b19yZWFkKQorCQkJCQlicmVhazsgLyogRU9GIG9uIHRoaXMgZmlsZSBvciBlcnJvciAqLworCQkJfQorCQl9CisJCWlmIChuX3NraXAgPT0gMCkKKwkJCXJldHVybjsKKworCQljaGVja19hbmRfY2xvc2UoKTsKKwkJb3Blbl9uZXh0X2ZpbGUoKTsKKwl9CisKKwlpZiAobl9za2lwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2tpcCBwYXN0IGVuZCBvZiBjb21iaW5lZCBpbnB1dCIpOworfQorCisKK3R5cGVkZWYgdm9pZCBGTl9mb3JtYXRfYWRkcmVzcyhvZmZfdCBhZGRyZXNzLCBjaGFyIGMpOworCitzdGF0aWMgdm9pZAorZm9ybWF0X2FkZHJlc3Nfbm9uZShvZmZfdCBhZGRyZXNzIFVOVVNFRF9QQVJBTSwgY2hhciBjIFVOVVNFRF9QQVJBTSkKK3sKK30KKworc3RhdGljIGNoYXIgYWRkcmVzc19mbXRbXSBBTElHTjEgPSAiJTBuIk9GRl9GTVQieGMiOworLyogQ29ycmVzcG9uZHMgdG8gJ3gnIGFib3ZlICovCisjZGVmaW5lIGFkZHJlc3NfYmFzZV9jaGFyIGFkZHJlc3NfZm10W3NpemVvZihhZGRyZXNzX2ZtdCktM10KKy8qIENvcnJlc3BvbmRzIHRvICduJyBhYm92ZSAqLworI2RlZmluZSBhZGRyZXNzX3BhZF9sZW5fY2hhciBhZGRyZXNzX2ZtdFsyXQorCitzdGF0aWMgdm9pZAorZm9ybWF0X2FkZHJlc3Nfc3RkKG9mZl90IGFkZHJlc3MsIGNoYXIgYykKK3sKKwkvKiBDb3JyZXNwb25kcyB0byAnYycgKi8KKwlhZGRyZXNzX2ZtdFtzaXplb2YoYWRkcmVzc19mbXQpLTJdID0gYzsKKwlwcmludGYoYWRkcmVzc19mbXQsIGFkZHJlc3MpOworfQorCisjaWYgRU5BQkxFX0xPTkdfT1BUUworLyogb25seSB1c2VkIHdpdGggLS10cmFkaXRpb25hbCAqLworc3RhdGljIHZvaWQKK2Zvcm1hdF9hZGRyZXNzX3BhcmVuKG9mZl90IGFkZHJlc3MsIGNoYXIgYykKK3sKKwlwdXRjaGFyKCcoJyk7CisJZm9ybWF0X2FkZHJlc3Nfc3RkKGFkZHJlc3MsICcpJyk7CisJaWYgKGMpIHB1dGNoYXIoYyk7Cit9CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfYWRkcmVzc19sYWJlbChvZmZfdCBhZGRyZXNzLCBjaGFyIGMpCit7CisJZm9ybWF0X2FkZHJlc3Nfc3RkKGFkZHJlc3MsICcgJyk7CisJZm9ybWF0X2FkZHJlc3NfcGFyZW4oYWRkcmVzcyArIHBzZXVkb19vZmZzZXQsIGMpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitkdW1wX2hleGxfbW9kZV90cmFpbGVyKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaykKK3sKKwlmcHV0cygiICA+Iiwgc3Rkb3V0KTsKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCXVuc2lnbmVkIGMgPSAqKHVuc2lnbmVkIGNoYXIgKikgYmxvY2srKzsKKwkJYyA9IChJU1BSSU5UKGMpID8gYyA6ICcuJyk7CisJCXB1dGNoYXIoYyk7CisJfQorCXB1dGNoYXIoJzwnKTsKK30KKworLyogV3JpdGUgTl9CWVRFUyBieXRlcyBmcm9tIENVUlJfQkxPQ0sgdG8gc3RhbmRhcmQgb3V0cHV0IG9uY2UgZm9yIGVhY2gKKyAgIG9mIHRoZSBOX1NQRUMgZm9ybWF0IHNwZWNzLiAgQ1VSUkVOVF9PRkZTRVQgaXMgdGhlIGJ5dGUgYWRkcmVzcyBvZgorICAgQ1VSUl9CTE9DSyBpbiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBpbnB1dCBmaWxlcywgYW5kIGl0IGlzIHByaW50ZWQKKyAgIChvcHRpb25hbGx5KSBvbmx5IGJlZm9yZSB0aGUgb3V0cHV0IGxpbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdAorICAgZm9ybWF0IHNwZWMuICBXaGVuIGR1cGxpY2F0ZSBibG9ja3MgYXJlIGJlaW5nIGFiYnJldmlhdGVkLCB0aGUgb3V0cHV0CisgICBmb3IgYSBzZXF1ZW5jZSBvZiBpZGVudGljYWwgaW5wdXQgYmxvY2tzIGlzIHRoZSBvdXRwdXQgZm9yIHRoZSBmaXJzdAorICAgYmxvY2sgZm9sbG93ZWQgYnkgYW4gYXN0ZXJpc2sgYWxvbmUgb24gYSBsaW5lLiAgSXQgaXMgdmFsaWQgdG8gY29tcGFyZQorICAgdGhlIGJsb2NrcyBQUkVWX0JMT0NLIGFuZCBDVVJSX0JMT0NLIG9ubHkgd2hlbiBOX0JZVEVTID09IEJZVEVTX1BFUl9CTE9DSy4KKyAgIFRoYXQgY29uZGl0aW9uIG1heSBiZSBmYWxzZSBvbmx5IGZvciB0aGUgbGFzdCBpbnB1dCBibG9jayAtLSBhbmQgdGhlbgorICAgb25seSB3aGVuIGl0IGhhcyBub3QgYmVlbiBwYWRkZWQgdG8gbGVuZ3RoIEJZVEVTX1BFUl9CTE9DSy4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9ibG9jayhvZmZfdCBjdXJyZW50X29mZnNldCwgc2l6ZV90IG5fYnl0ZXMsCisJCWNvbnN0IGNoYXIgKnByZXZfYmxvY2ssIGNvbnN0IGNoYXIgKmN1cnJfYmxvY2spCit7CisJc3RhdGljIGNoYXIgZmlyc3QgPSAxOworCXN0YXRpYyBjaGFyIHByZXZfcGFpcl9lcXVhbCA9IDA7CisJc2l6ZV90IGk7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX3YpCisJICYmICFmaXJzdAorCSAmJiBuX2J5dGVzID09IGJ5dGVzX3Blcl9ibG9jaworCSAmJiBtZW1jbXAocHJldl9ibG9jaywgY3Vycl9ibG9jaywgYnl0ZXNfcGVyX2Jsb2NrKSA9PSAwCisJKSB7CisJCWlmIChwcmV2X3BhaXJfZXF1YWwpIHsKKwkJCS8qIFRoZSB0d28gcHJlY2VkaW5nIGJsb2NrcyB3ZXJlIGVxdWFsLCBhbmQgdGhlIGN1cnJlbnQKKwkJCSAgIGJsb2NrIGlzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG9uZSwgc28gcHJpbnQgbm90aGluZy4gICovCisJCX0gZWxzZSB7CisJCQlwdXRzKCIqIik7CisJCQlwcmV2X3BhaXJfZXF1YWwgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJZmlyc3QgPSAwOworCQlwcmV2X3BhaXJfZXF1YWwgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbl9zcGVjczsgaSsrKSB7CisJCQlpZiAoaSA9PSAwKQorCQkJCWZvcm1hdF9hZGRyZXNzKGN1cnJlbnRfb2Zmc2V0LCAnXDAnKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUqcyIsIGFkZHJlc3NfcGFkX2xlbl9jaGFyIC0gJzAnLCAiIik7CisJCQkoKnNwZWNbaV0ucHJpbnRfZnVuY3Rpb24pIChuX2J5dGVzLCBjdXJyX2Jsb2NrLCBzcGVjW2ldLmZtdF9zdHJpbmcpOworCQkJaWYgKHNwZWNbaV0uaGV4bF9tb2RlX3RyYWlsZXIpIHsKKwkJCQkvKiBzcGFjZS1wYWQgb3V0IHRvIGZ1bGwgbGluZSB3aWR0aCwgdGhlbiBkdW1wIHRoZSB0cmFpbGVyICovCisJCQkJdW5zaWduZWQgZGF0dW1fd2lkdGggPSB3aWR0aF9ieXRlc1tzcGVjW2ldLnNpemVdOworCQkJCXVuc2lnbmVkIGJsYW5rX2ZpZWxkcyA9IChieXRlc19wZXJfYmxvY2sgLSBuX2J5dGVzKSAvIGRhdHVtX3dpZHRoOworCQkJCXVuc2lnbmVkIGZpZWxkX3dpZHRoID0gc3BlY1tpXS5maWVsZF93aWR0aCArIDE7CisJCQkJcHJpbnRmKCIlKnMiLCBibGFua19maWVsZHMgKiBmaWVsZF93aWR0aCwgIiIpOworCQkJCWR1bXBfaGV4bF9tb2RlX3RyYWlsZXIobl9ieXRlcywgY3Vycl9ibG9jayk7CisJCQl9CisJCQlwdXRjaGFyKCdcbicpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorcmVhZF9ibG9jayhzaXplX3QgbiwgY2hhciAqYmxvY2ssIHNpemVfdCAqbl9ieXRlc19pbl9idWZmZXIpCit7CisJYXNzZXJ0KDAgPCBuICYmIG4gPD0gYnl0ZXNfcGVyX2Jsb2NrKTsKKworCSpuX2J5dGVzX2luX2J1ZmZlciA9IDA7CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoaW5fc3RyZWFtICE9IE5VTEwpIHsgLyogRU9GLiAgKi8KKwkJc2l6ZV90IG5fbmVlZGVkOworCQlzaXplX3Qgbl9yZWFkOworCisJCW5fbmVlZGVkID0gbiAtICpuX2J5dGVzX2luX2J1ZmZlcjsKKwkJbl9yZWFkID0gZnJlYWQoYmxvY2sgKyAqbl9ieXRlc19pbl9idWZmZXIsIDEsIG5fbmVlZGVkLCBpbl9zdHJlYW0pOworCQkqbl9ieXRlc19pbl9idWZmZXIgKz0gbl9yZWFkOworCQlpZiAobl9yZWFkID09IG5fbmVlZGVkKQorCQkJYnJlYWs7CisJCS8qIGVycm9yIGNoZWNrIGlzIGRvbmUgaW4gY2hlY2tfYW5kX2Nsb3NlICovCisJCWNoZWNrX2FuZF9jbG9zZSgpOworCQlvcGVuX25leHRfZmlsZSgpOworCX0KK30KKworLyogUmV0dXJuIHRoZSBsZWFzdCBjb21tb24gbXVsdGlwbGUgb2YgdGhlIHNpemVzIGFzc29jaWF0ZWQKKyAgIHdpdGggdGhlIGZvcm1hdCBzcGVjcy4gICovCisKK3N0YXRpYyBpbnQKK2dldF9sY20odm9pZCkKK3sKKwlzaXplX3QgaTsKKwlpbnQgbF9jX20gPSAxOworCisJZm9yIChpID0gMDsgaSA8IG5fc3BlY3M7IGkrKykKKwkJbF9jX20gPSBsY20obF9jX20sIHdpZHRoX2J5dGVzWyhpbnQpIHNwZWNbaV0uc2l6ZV0pOworCXJldHVybiBsX2NfbTsKK30KKworLyogUmVhZCBhIGNodW5rIG9mIHNpemUgQllURVNfUEVSX0JMT0NLIGZyb20gdGhlIGlucHV0IGZpbGVzLCB3cml0ZSB0aGUKKyAgIGZvcm1hdHRlZCBibG9jayB0byBzdGFuZGFyZCBvdXRwdXQsIGFuZCByZXBlYXQgdW50aWwgdGhlIHNwZWNpZmllZAorICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaGFzIGJlZW4gcmVhZCBvciB1bnRpbCBhbGwgaW5wdXQgaGFzIGJlZW4KKyAgIHByb2Nlc3NlZC4gIElmIHRoZSBsYXN0IGJsb2NrIHJlYWQgaXMgc21hbGxlciB0aGFuIEJZVEVTX1BFUl9CTE9DSworICAgYW5kIGl0cyBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBzaXplIGFzc29jaWF0ZWQgd2l0aCBhIGZvcm1hdAorICAgc3BlYywgZXh0ZW5kIHRoZSBpbnB1dCBibG9jayB3aXRoIHplcm8gYnl0ZXMgdW50aWwgaXRzIGxlbmd0aCBpcyBhCisgICBtdWx0aXBsZSBvZiBhbGwgZm9ybWF0IHNwZWMgc2l6ZXMuICBXcml0ZSB0aGUgZmluYWwgYmxvY2suICBGaW5hbGx5LAorICAgd3JpdGUgb24gYSBsaW5lIGJ5IGl0c2VsZiB0aGUgb2Zmc2V0IG9mIHRoZSBieXRlIGFmdGVyIHRoZSBsYXN0IGJ5dGUKKyAgIHJlYWQuICAqLworCitzdGF0aWMgdm9pZAorZHVtcChvZmZfdCBjdXJyZW50X29mZnNldCwgb2ZmX3QgZW5kX29mZnNldCkKK3sKKwljaGFyICpibG9ja1syXTsKKwlpbnQgaWR4OworCXNpemVfdCBuX2J5dGVzX3JlYWQ7CisKKwlibG9ja1swXSA9IHhtYWxsb2MoMiAqIGJ5dGVzX3Blcl9ibG9jayk7CisJYmxvY2tbMV0gPSBibG9ja1swXSArIGJ5dGVzX3Blcl9ibG9jazsKKworCWlkeCA9IDA7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfTikgeworCQl3aGlsZSAoMSkgeworCQkJc2l6ZV90IG5fbmVlZGVkOworCQkJaWYgKGN1cnJlbnRfb2Zmc2V0ID49IGVuZF9vZmZzZXQpIHsKKwkJCQluX2J5dGVzX3JlYWQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJbl9uZWVkZWQgPSBNSU4oZW5kX29mZnNldCAtIGN1cnJlbnRfb2Zmc2V0LCAob2ZmX3QpIGJ5dGVzX3Blcl9ibG9jayk7CisJCQlyZWFkX2Jsb2NrKG5fbmVlZGVkLCBibG9ja1tpZHhdLCAmbl9ieXRlc19yZWFkKTsKKwkJCWlmIChuX2J5dGVzX3JlYWQgPCBieXRlc19wZXJfYmxvY2spCisJCQkJYnJlYWs7CisJCQlhc3NlcnQobl9ieXRlc19yZWFkID09IGJ5dGVzX3Blcl9ibG9jayk7CisJCQl3cml0ZV9ibG9jayhjdXJyZW50X29mZnNldCwgbl9ieXRlc19yZWFkLCBibG9ja1tpZHggXiAxXSwgYmxvY2tbaWR4XSk7CisJCQljdXJyZW50X29mZnNldCArPSBuX2J5dGVzX3JlYWQ7CisJCQlpZHggXj0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgxKSB7CisJCQlyZWFkX2Jsb2NrKGJ5dGVzX3Blcl9ibG9jaywgYmxvY2tbaWR4XSwgJm5fYnl0ZXNfcmVhZCk7CisJCQlpZiAobl9ieXRlc19yZWFkIDwgYnl0ZXNfcGVyX2Jsb2NrKQorCQkJCWJyZWFrOworCQkJYXNzZXJ0KG5fYnl0ZXNfcmVhZCA9PSBieXRlc19wZXJfYmxvY2spOworCQkJd3JpdGVfYmxvY2soY3VycmVudF9vZmZzZXQsIG5fYnl0ZXNfcmVhZCwgYmxvY2tbaWR4IF4gMV0sIGJsb2NrW2lkeF0pOworCQkJY3VycmVudF9vZmZzZXQgKz0gbl9ieXRlc19yZWFkOworCQkJaWR4IF49IDE7CisJCX0KKwl9CisKKwlpZiAobl9ieXRlc19yZWFkID4gMCkgeworCQlpbnQgbF9jX207CisJCXNpemVfdCBieXRlc190b193cml0ZTsKKworCQlsX2NfbSA9IGdldF9sY20oKTsKKworCQkvKiBNYWtlIGJ5dGVzX3RvX3dyaXRlIHRoZSBzbWFsbGVzdCBtdWx0aXBsZSBvZiBsX2NfbSB0aGF0CisJCQkgaXMgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgbl9ieXRlc19yZWFkLiAgKi8KKwkJYnl0ZXNfdG9fd3JpdGUgPSBsX2NfbSAqICgobl9ieXRlc19yZWFkICsgbF9jX20gLSAxKSAvIGxfY19tKTsKKworCQltZW1zZXQoYmxvY2tbaWR4XSArIG5fYnl0ZXNfcmVhZCwgMCwgYnl0ZXNfdG9fd3JpdGUgLSBuX2J5dGVzX3JlYWQpOworCQl3cml0ZV9ibG9jayhjdXJyZW50X29mZnNldCwgYnl0ZXNfdG9fd3JpdGUsCisJCQkJICAgYmxvY2tbaWR4IF4gMV0sIGJsb2NrW2lkeF0pOworCQljdXJyZW50X29mZnNldCArPSBuX2J5dGVzX3JlYWQ7CisJfQorCisJZm9ybWF0X2FkZHJlc3MoY3VycmVudF9vZmZzZXQsICdcbicpOworCisJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX04pICYmIGN1cnJlbnRfb2Zmc2V0ID49IGVuZF9vZmZzZXQpCisJCWNoZWNrX2FuZF9jbG9zZSgpOworCisJZnJlZShibG9ja1swXSk7Cit9CisKKy8qIFJlYWQgTiBieXRlcyBpbnRvIEJMT0NLIGZyb20gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGlucHV0IGZpbGVzCisgICBuYW1lZCBpbiB0aGUgZ2xvYmFsIGFycmF5IEZJTEVfTElTVC4gIE9uIHRoZSBmaXJzdCBjYWxsIHRvIHRoaXMKKyAgIGZ1bmN0aW9uLCB0aGUgZ2xvYmFsIHZhcmlhYmxlIElOX1NUUkVBTSBpcyBleHBlY3RlZCB0byBiZSBhbiBvcGVuCisgICBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBmaWxlIElOUFVUX0ZJTEVOQU1FLiAgSWYgYWxsIE4KKyAgIGJ5dGVzIGNhbm5vdCBiZSByZWFkIGZyb20gSU5fU1RSRUFNLCBjbG9zZSBJTl9TVFJFQU0gYW5kIHVwZGF0ZQorICAgdGhlIGdsb2JhbCB2YXJpYWJsZXMgSU5fU1RSRUFNIGFuZCBJTlBVVF9GSUxFTkFNRS4gIFRoZW4gdHJ5IHRvCisgICByZWFkIHRoZSByZW1haW5pbmcgYnl0ZXMgZnJvbSB0aGUgbmV3bHkgb3BlbmVkIGZpbGUuICBSZXBlYXQgaWYKKyAgIG5lY2Vzc2FyeSB1bnRpbCBFT0YgaXMgcmVhY2hlZCBmb3IgdGhlIGxhc3QgZmlsZSBpbiBGSUxFX0xJU1QuCisgICBPbiBzdWJzZXF1ZW50IGNhbGxzLCBkb24ndCBtb2RpZnkgQkxPQ0sgYW5kIHJldHVybiB6ZXJvLiAgU2V0CisgICAqTl9CWVRFU19JTl9CVUZGRVIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiAgSWYgYW4gZXJyb3Igb2NjdXJzLAorICAgaXQgd2lsbCBiZSBkZXRlY3RlZCB0aHJvdWdoIGZlcnJvciB3aGVuIHRoZSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUKKyAgIGNsb3NlZC4gIElmIHRoZXJlIGlzIGFuIGVycm9yLCBnaXZlIGEgbWVzc2FnZSBidXQgY29udGludWUgcmVhZGluZworICAgYXMgdXN1YWwgYW5kIHJldHVybiBub256ZXJvLiAgT3RoZXJ3aXNlIHJldHVybiB6ZXJvLiAgKi8KKworLyogU1RSSU5HUyBtb2RlLiAgRmluZCBlYWNoICJzdHJpbmcgY29uc3RhbnQiIGluIHRoZSBpbnB1dC4KKyAgIEEgc3RyaW5nIGNvbnN0YW50IGlzIGEgcnVuIG9mIGF0IGxlYXN0ICdzdHJpbmdfbWluJyBBU0NJSQorICAgZ3JhcGhpYyAob3IgZm9ybWF0dGluZykgY2hhcmFjdGVycyB0ZXJtaW5hdGVkIGJ5IGEgbnVsbC4KKyAgIEJhc2VkIG9uIGEgZnVuY3Rpb24gd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGZvciBhCisgICB0cmFkaXRpb25hbCB2ZXJzaW9uIG9mIG9kLiAgKi8KKworc3RhdGljIHZvaWQKK2R1bXBfc3RyaW5ncyhvZmZfdCBhZGRyZXNzLCBvZmZfdCBlbmRfb2Zmc2V0KQoreworCXVuc2lnbmVkIGJ1ZnNpemUgPSBNQVgoMTAwLCBzdHJpbmdfbWluKTsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSB4bWFsbG9jKGJ1ZnNpemUpOworCisJd2hpbGUgKDEpIHsKKwkJc2l6ZV90IGk7CisJCWludCBjOworCisJCS8qIFNlZSBpZiB0aGUgbmV4dCAnc3RyaW5nX21pbicgY2hhcnMgYXJlIGFsbCBwcmludGluZyBjaGFycy4gICovCisgdHJ5bGluZToKKwkJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX04pICYmIChlbmRfb2Zmc2V0IC0gc3RyaW5nX21pbiA8PSBhZGRyZXNzKSkKKwkJCWJyZWFrOworCQlpID0gMDsKKwkJd2hpbGUgKCEob3B0aW9uX21hc2szMiAmIE9QVF9OKSB8fCBhZGRyZXNzIDwgZW5kX29mZnNldCkgeworCQkJaWYgKGkgPT0gYnVmc2l6ZSkgeworCQkJCWJ1ZnNpemUgKz0gYnVmc2l6ZS84OworCQkJCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgYnVmc2l6ZSk7CisJCQl9CisKKwkJCXdoaWxlIChpbl9zdHJlYW0pIHsgLyogIUVPRiAqLworCQkJCWMgPSBmZ2V0Yyhpbl9zdHJlYW0pOworCQkJCWlmIChjICE9IEVPRikKKwkJCQkJZ290byBnb3RfY2hhcjsKKwkJCQljaGVja19hbmRfY2xvc2UoKTsKKwkJCQlvcGVuX25leHRfZmlsZSgpOworCQkJfQorCQkJLyogRU9GICovCisJCQlnb3RvIHJldDsKKyBnb3RfY2hhcjoKKwkJCWFkZHJlc3MrKzsKKwkJCWlmICghYykKKwkJCQlicmVhazsKKwkJCWlmICghSVNQUklOVChjKSkKKwkJCQlnb3RvIHRyeWxpbmU7CS8qIEl0IGlzbid0OyBnaXZlIHVwIG9uIHRoaXMgc3RyaW5nLiAgKi8KKwkJCWJ1ZltpKytdID0gYzsJCS8qIFN0cmluZyBjb250aW51ZXM7IHN0b3JlIGl0IGFsbC4gICovCisJCX0KKworCQlpZiAoaSA8IHN0cmluZ19taW4pCQkvKiBUb28gc2hvcnQhICovCisJCQlnb3RvIHRyeWxpbmU7CisKKwkJLyogSWYgd2UgZ2V0IGhlcmUsIHRoZSBzdHJpbmcgaXMgYWxsIHByaW50YWJsZSBhbmQgTlVMLXRlcm1pbmF0ZWQgKi8KKwkJYnVmW2ldID0gMDsKKwkJZm9ybWF0X2FkZHJlc3MoYWRkcmVzcyAtIGkgLSAxLCAnICcpOworCisJCWZvciAoaSA9IDA7IChjID0gYnVmW2ldKTsgaSsrKSB7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ1wwMDcnOiBmcHV0cygiXFxhIiwgc3Rkb3V0KTsgYnJlYWs7CisJCQljYXNlICdcYic6IGZwdXRzKCJcXGIiLCBzdGRvdXQpOyBicmVhazsKKwkJCWNhc2UgJ1xmJzogZnB1dHMoIlxcZiIsIHN0ZG91dCk7IGJyZWFrOworCQkJY2FzZSAnXG4nOiBmcHV0cygiXFxuIiwgc3Rkb3V0KTsgYnJlYWs7CisJCQljYXNlICdccic6IGZwdXRzKCJcXHIiLCBzdGRvdXQpOyBicmVhazsKKwkJCWNhc2UgJ1x0JzogZnB1dHMoIlxcdCIsIHN0ZG91dCk7IGJyZWFrOworCQkJY2FzZSAnXHYnOiBmcHV0cygiXFx2Iiwgc3Rkb3V0KTsgYnJlYWs7CisJCQlkZWZhdWx0OiBwdXRjaGFyKGMpOworCQkJfQorCQl9CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorCisJLyogV2UgcmVhY2ggdGhpcyBwb2ludCBvbmx5IGlmIHdlIHNlYXJjaCB0aHJvdWdoCisJICAgKG1heF9ieXRlc190b19mb3JtYXQgLSBzdHJpbmdfbWluKSBieXRlcyBiZWZvcmUgcmVhY2hpbmcgRU9GLiAgKi8KKwljaGVja19hbmRfY2xvc2UoKTsKKyByZXQ6CisJZnJlZShidWYpOworfQorCisjaWYgRU5BQkxFX0xPTkdfT1BUUworLyogSWYgUyBpcyBhIHZhbGlkIHRyYWRpdGlvbmFsIG9mZnNldCBzcGVjaWZpY2F0aW9uIHdpdGggYW4gb3B0aW9uYWwKKyAgIGxlYWRpbmcgJysnIHJldHVybiBub256ZXJvIGFuZCBzZXQgKk9GRlNFVCB0byB0aGUgb2Zmc2V0IGl0IGRlbm90ZXMuICAqLworCitzdGF0aWMgaW50CitwYXJzZV9vbGRfb2Zmc2V0KGNvbnN0IGNoYXIgKnMsIG9mZl90ICpvZmZzZXQpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBCYltdID0geworCQl7ICJCIiwgMTAyNCB9LAorCQl7ICJiIiwgNTEyIH0sCisJCXsgIiIsIDAgfQorCX07CisJY2hhciAqcDsKKwlpbnQgcmFkaXg7CisKKwkvKiBTa2lwIG92ZXIgYW55IGxlYWRpbmcgJysnLiAqLworCWlmIChzWzBdID09ICcrJykgKytzOworCWlmICghaXNkaWdpdChzWzBdKSkgcmV0dXJuIDA7IC8qIG5vdCBhIG51bWJlciAqLworCisJLyogRGV0ZXJtaW5lIHRoZSByYWRpeCB3ZSdsbCB1c2UgdG8gaW50ZXJwcmV0IFMuICBJZiB0aGVyZSBpcyBhICcuJywKKwkgKiBpdCdzIGRlY2ltYWwsIG90aGVyd2lzZSwgaWYgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCAnMFgnb3IgJzB4JywKKwkgKiBpdCdzIGhleGFkZWNpbWFsLCBlbHNlIG9jdGFsLiAgKi8KKwlwID0gc3RyY2hyKHMsICcuJyk7CisJcmFkaXggPSA4OworCWlmIChwKSB7CisJCXBbMF0gPSAnXDAnOyAvKiBjaGVhdGluZyAqLworCQlyYWRpeCA9IDEwOworCX0gZWxzZSBpZiAoc1swXSA9PSAnMCcgJiYgKHNbMV0gPT0gJ3gnIHx8IHNbMV0gPT0gJ1gnKSkKKwkJcmFkaXggPSAxNjsKKworCSpvZmZzZXQgPSB4c3RydG9vZmZfc2Z4KHMsIHJhZGl4LCBCYik7CisJaWYgKHApIHBbMF0gPSAnLic7CisKKwlyZXR1cm4gKCpvZmZzZXQgPj0gMCk7Cit9CisjZW5kaWYKKworaW50IG9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBvZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBia21bXSA9IHsKKwkJeyAiYiIsIDUxMiB9LAorCQl7ICJrIiwgMTAyNCB9LAorCQl7ICJtIiwgMTAyNCoxMDI0IH0sCisJCXsgIiIsIDAgfQorCX07CisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIG9kX2xvbmdvcHRzW10gQUxJR04xID0KKwkJInNraXAtYnl0ZXNcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJqIgorCQkiYWRkcmVzcy1yYWRpeFwwIiAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkEiCisJCSJyZWFkLWJ5dGVzXDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiTiIKKwkJImZvcm1hdFwwIiAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCQkib3V0cHV0LWR1cGxpY2F0ZXNcMCIgTm9fYXJndW1lbnQgICAgICAgInYiCisJCS8qIFllcywgaXQncyB0cnVlOiAtUyBOVU0sIGJ1dCAtLXN0cmluZ3NbPU5VTV0hCisJCSAqIHRoYXQgaXMsIE5VTSBpcyBtYW5kYXRvcnkgZm9yIC1TIGJ1dCBvcHRpb25hbCBmb3IgLS1zdHJpbmdzIQorCQkgKi8KKwkJInN0cmluZ3NcMCIgICAgICAgICAgIE9wdGlvbmFsX2FyZ3VtZW50ICJTIgorCQkid2lkdGhcMCIgICAgICAgICAgICAgT3B0aW9uYWxfYXJndW1lbnQgInciCisJCSJ0cmFkaXRpb25hbFwwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZiIKKwkJOworI2VuZGlmCisJY29uc3QgY2hhciAqc3RyX0EsICpzdHJfTiwgKnN0cl9qLCAqc3RyX1MgPSAiMyI7CisJbGxpc3RfdCAqbHN0X3QgPSBOVUxMOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgbF9jX207CisJLyogVGhlIG51bWJlciBvZiBpbnB1dCBieXRlcyB0byBza2lwIGJlZm9yZSBmb3JtYXR0aW5nIGFuZCB3cml0aW5nLiAgKi8KKwlvZmZfdCBuX2J5dGVzX3RvX3NraXAgPSAwOworCS8qIFRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSB0byBiZSBmb3JtYXR0ZWQuICAqLworCW9mZl90IGVuZF9vZmZzZXQgPSAwOworCS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHdpbGwgYmUgZm9ybWF0dGVkLiAgKi8KKwlvZmZfdCBtYXhfYnl0ZXNfdG9fZm9ybWF0ID0gMDsKKworCXNwZWMgPSBOVUxMOworCWZvcm1hdF9hZGRyZXNzID0gZm9ybWF0X2FkZHJlc3Nfc3RkOworCWFkZHJlc3NfYmFzZV9jaGFyID0gJ28nOworCWFkZHJlc3NfcGFkX2xlbl9jaGFyID0gJzcnOworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidys6dDo6IjsgLyogLXcgTiwgLXQgaXMgYSBsaXN0ICovCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBvZF9sb25nb3B0czsKKyNlbmRpZgorCW9wdCA9IE9EX0dFVE9QVDMyKCk7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIE9QVF9BKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIGRveG5bXSBBTElHTjEgPSAiZG94biI7CisJCXN0YXRpYyBjb25zdCBjaGFyIGRveG5fYWRkcmVzc19iYXNlX2NoYXJbXSBBTElHTjEgPSB7CisJCQkndScsICdvJywgJ3gnLCAvKiAnPycgZm91cnRoIG9uZSBpcyBub3QgaW1wb3J0YW50ICovCisJCX07CisJCXN0YXRpYyBjb25zdCB1aW50OF90IGRveG5fYWRkcmVzc19wYWRfbGVuX2NoYXJbXSBBTElHTjEgPSB7CisJCQknNycsICc3JywgJzYnLCAvKiAnPycgKi8KKwkJfTsKKwkJY2hhciAqcDsKKwkJaW50IHBvczsKKwkJcCA9IHN0cmNocihkb3huLCBzdHJfQVswXSk7CisJCWlmICghcCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgb3V0cHV0IGFkZHJlc3MgcmFkaXggIgorCQkJCSInJWMnIChtdXN0IGJlIFtkb3huXSkiLCBzdHJfQVswXSk7CisJCXBvcyA9IHAgLSBkb3huOworCQlpZiAocG9zID09IDMpIGZvcm1hdF9hZGRyZXNzID0gZm9ybWF0X2FkZHJlc3Nfbm9uZTsKKwkJYWRkcmVzc19iYXNlX2NoYXIgPSBkb3huX2FkZHJlc3NfYmFzZV9jaGFyW3Bvc107CisJCWFkZHJlc3NfcGFkX2xlbl9jaGFyID0gZG94bl9hZGRyZXNzX3BhZF9sZW5fY2hhcltwb3NdOworCX0KKwlpZiAob3B0ICYgT1BUX04pIHsKKwkJbWF4X2J5dGVzX3RvX2Zvcm1hdCA9IHhzdHJ0b29mZl9zZngoc3RyX04sIDAsIGJrbSk7CisJfQorCWlmIChvcHQgJiBPUFRfYSkgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoImEiKTsKKwlpZiAob3B0ICYgT1BUX2IpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJvQyIpOworCWlmIChvcHQgJiBPUFRfYykgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoImMiKTsKKwlpZiAob3B0ICYgT1BUX2QpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJ1MiIpOworCWlmIChvcHQgJiBPUFRfZikgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoImZGIik7CisJaWYgKG9wdCAmIE9QVF9oKSBkZWNvZGVfZm9ybWF0X3N0cmluZygieDIiKTsKKwlpZiAob3B0ICYgT1BUX2kpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJkMiIpOworCWlmIChvcHQgJiBPUFRfaikgbl9ieXRlc190b19za2lwID0geHN0cnRvb2ZmX3NmeChzdHJfaiwgMCwgYmttKTsKKwlpZiAob3B0ICYgT1BUX2wpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJkNCIpOworCWlmIChvcHQgJiBPUFRfbykgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoIm8yIik7CisJd2hpbGUgKGxzdF90KSB7CisJCWRlY29kZV9mb3JtYXRfc3RyaW5nKGxsaXN0X3BvcCgmbHN0X3QpKTsKKwl9CisJaWYgKG9wdCAmIE9QVF94KSBkZWNvZGVfZm9ybWF0X3N0cmluZygieDIiKTsKKwlpZiAob3B0ICYgT1BUX3MpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJkMiIpOworCWlmIChvcHQgJiBPUFRfUykgeworCQlzdHJpbmdfbWluID0geHN0cnRvdV9zZngoc3RyX1MsIDAsIGJrbSk7CisJfQorCisJLy8gQmxvYXQ6CisJLy9pZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfUykgJiYgbl9zcGVjcyA+IDApCisJLy8JYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHR5cGUgbWF5IGJlIHNwZWNpZmllZCB3aGVuIGR1bXBpbmcgc3RyaW5ncyIpOworCisJLyogSWYgdGhlIC0tdHJhZGl0aW9uYWwgb3B0aW9uIGlzIHVzZWQsIHRoZXJlIG1heSBiZSBmcm9tCisJICogMCB0byAzIHJlbWFpbmluZyBjb21tYW5kIGxpbmUgYXJndW1lbnRzOyAgaGFuZGxlIGVhY2ggY2FzZQorCSAqIHNlcGFyYXRlbHkuCisJICogb2QgW0ZJTEVdIFtbK11PRkZTRVRbLl1bYl0gW1srXUxBQkVMWy5dW2JdXV0KKwkgKiBUaGUgb2Zmc2V0IGFuZCBwc2V1ZG9fc3RhcnQgaGF2ZSB0aGUgc2FtZSBzeW50YXguCisJICoKKwkgKiBGSVhNRTogUE9TSVggMTAwMy4xLTIwMDEgd2l0aCBYU0kgcmVxdWlyZXMgc3VwcG9ydCBmb3IgdGhlCisJICogdHJhZGl0aW9uYWwgc3ludGF4IGV2ZW4gaWYgLS10cmFkaXRpb25hbCBpcyBub3QgZ2l2ZW4uICAqLworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCWlmIChvcHQgJiBPUFRfdHJhZGl0aW9uYWwpIHsKKwkJaWYgKGFyZ3ZbMF0pIHsKKwkJCW9mZl90IHBzZXVkb19zdGFydCA9IC0xOworCQkJb2ZmX3QgbzEsIG8yOworCisJCQlpZiAoIWFyZ3ZbMV0pIHsgLyogb25lIGFyZyAqLworCQkJCWlmIChwYXJzZV9vbGRfb2Zmc2V0KGFyZ3ZbMF0sICZvMSkpIHsKKwkJCQkJLyogb2QgLS10cmFkaXRpb25hbCBPRkZTRVQgKi8KKwkJCQkJbl9ieXRlc190b19za2lwID0gbzE7CisJCQkJCWFyZ3YrKzsKKwkJCQl9CisJCQkJLyogb2QgLS10cmFkaXRpb25hbCBGSUxFICovCisJCQl9IGVsc2UgaWYgKCFhcmd2WzJdKSB7IC8qIHR3byBhcmdzICovCisJCQkJaWYgKHBhcnNlX29sZF9vZmZzZXQoYXJndlswXSwgJm8xKQorCQkJCSAmJiBwYXJzZV9vbGRfb2Zmc2V0KGFyZ3ZbMV0sICZvMikKKwkJCQkpIHsKKwkJCQkJLyogb2QgLS10cmFkaXRpb25hbCBPRkZTRVQgTEFCRUwgKi8KKwkJCQkJbl9ieXRlc190b19za2lwID0gbzE7CisJCQkJCXBzZXVkb19zdGFydCA9IG8yOworCQkJCQlhcmd2ICs9IDI7CisJCQkJfSBlbHNlIGlmIChwYXJzZV9vbGRfb2Zmc2V0KGFyZ3ZbMV0sICZvMikpIHsKKwkJCQkJLyogb2QgLS10cmFkaXRpb25hbCBGSUxFIE9GRlNFVCAqLworCQkJCQluX2J5dGVzX3RvX3NraXAgPSBvMjsKKwkJCQkJYXJndlsxXSA9IE5VTEw7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgc2Vjb25kIGFyZ3VtZW50ICclcyciLCBhcmd2WzFdKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCFhcmd2WzNdKSB7IC8qIHRocmVlIGFyZ3MgKi8KKwkJCQlpZiAocGFyc2Vfb2xkX29mZnNldChhcmd2WzFdLCAmbzEpCisJCQkJICYmIHBhcnNlX29sZF9vZmZzZXQoYXJndlsyXSwgJm8yKQorCQkJCSkgeworCQkJCQkvKiBvZCAtLXRyYWRpdGlvbmFsIEZJTEUgT0ZGU0VUIExBQkVMICovCisJCQkJCW5fYnl0ZXNfdG9fc2tpcCA9IG8xOworCQkJCQlwc2V1ZG9fc3RhcnQgPSBvMjsKKwkJCQkJYXJndlsxXSA9IE5VTEw7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRoZSBsYXN0IHR3byBhcmd1bWVudHMgbXVzdCBiZSBvZmZzZXRzIik7CisJCQkJfQorCQkJfSBlbHNlIHsgLyogPjMgYXJncyAqLworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKKwkJCX0KKworCQkJaWYgKHBzZXVkb19zdGFydCA+PSAwKSB7CisJCQkJaWYgKGZvcm1hdF9hZGRyZXNzID09IGZvcm1hdF9hZGRyZXNzX25vbmUpIHsKKwkJCQkJYWRkcmVzc19iYXNlX2NoYXIgPSAnbyc7CisJCQkJCWFkZHJlc3NfcGFkX2xlbl9jaGFyID0gJzcnOworCQkJCQlmb3JtYXRfYWRkcmVzcyA9IGZvcm1hdF9hZGRyZXNzX3BhcmVuOworCQkJCX0gZWxzZSB7CisJCQkJCWZvcm1hdF9hZGRyZXNzID0gZm9ybWF0X2FkZHJlc3NfbGFiZWw7CisJCQkJfQorCQkJCXBzZXVkb19vZmZzZXQgPSBwc2V1ZG9fc3RhcnQgLSBuX2J5dGVzX3RvX3NraXA7CisJCQl9CisJCX0KKwkJLyogZWxzZTogb2QgLS10cmFkaXRpb25hbCAod2l0aG91dCBhcmdzKSAqLworCX0KKyNlbmRpZgorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfTikgeworCQllbmRfb2Zmc2V0ID0gbl9ieXRlc190b19za2lwICsgbWF4X2J5dGVzX3RvX2Zvcm1hdDsKKwkJaWYgKGVuZF9vZmZzZXQgPCBuX2J5dGVzX3RvX3NraXApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiU0tJUCArIFNJWkUgaXMgdG9vIGxhcmdlIik7CisJfQorCisJaWYgKG5fc3BlY3MgPT0gMCkgeworCQlkZWNvZGVfZm9ybWF0X3N0cmluZygibzIiKTsKKwkJLypuX3NwZWNzID0gMTsgLSBkb25lIGJ5IGRlY29kZV9mb3JtYXRfc3RyaW5nICovCisJfQorCisJLyogSWYgbm8gZmlsZXMgd2VyZSBsaXN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZSwKKwkgICBzZXQgdGhlIGdsb2JhbCBwb2ludGVyIEZJTEVfTElTVCBzbyB0aGF0IGl0CisJICAgcmVmZXJlbmNlcyB0aGUgbnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2Ygb25lIG5hbWU6ICItIi4gICovCisJZmlsZV9saXN0ID0gYmJfYXJndl9kYXNoOworCWlmIChhcmd2WzBdKSB7CisJCS8qIFNldCB0aGUgZ2xvYmFsIHBvaW50ZXIgRklMRV9MSVNUIHNvIHRoYXQgaXQKKwkJICAgcmVmZXJlbmNlcyB0aGUgZmlyc3QgZmlsZS1hcmd1bWVudCBvbiB0aGUgY29tbWFuZC1saW5lLiAgKi8KKwkJZmlsZV9saXN0ID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIGFyZ3Y7CisJfQorCisJLyogT3BlbiB0aGUgZmlyc3QgaW5wdXQgZmlsZSAqLworCW9wZW5fbmV4dF9maWxlKCk7CisJLyogU2tpcCBvdmVyIGFueSB1bndhbnRlZCBoZWFkZXIgYnl0ZXMgKi8KKwlza2lwKG5fYnl0ZXNfdG9fc2tpcCk7CisJaWYgKCFpbl9zdHJlYW0pCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisKKwkvKiBDb21wdXRlIG91dHB1dCBibG9jayBsZW5ndGggKi8KKwlsX2NfbSA9IGdldF9sY20oKTsKKworCWlmIChvcHQgJiBPUFRfdykgeyAvKiAtdzogd2lkdGggKi8KKwkJaWYgKCFieXRlc19wZXJfYmxvY2sgfHwgYnl0ZXNfcGVyX2Jsb2NrICUgbF9jX20gIT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBpbnZhbGlkIHdpZHRoICV1OyB1c2luZyAlZCBpbnN0ZWFkIiwKKwkJCQkJKHVuc2lnbmVkKWJ5dGVzX3Blcl9ibG9jaywgbF9jX20pOworCQkJYnl0ZXNfcGVyX2Jsb2NrID0gbF9jX207CisJCX0KKwl9IGVsc2UgeworCQlieXRlc19wZXJfYmxvY2sgPSBsX2NfbTsKKwkJaWYgKGxfY19tIDwgREVGQVVMVF9CWVRFU19QRVJfQkxPQ0spCisJCQlieXRlc19wZXJfYmxvY2sgKj0gREVGQVVMVF9CWVRFU19QRVJfQkxPQ0sgLyBsX2NfbTsKKwl9CisKKyNpZmRlZiBERUJVRworCWZvciAoaSA9IDA7IGkgPCBuX3NwZWNzOyBpKyspIHsKKwkJcHJpbnRmKCIlZDogZm10PVwiJXNcIiB3aWR0aD0lZFxuIiwKKwkJCWksIHNwZWNbaV0uZm10X3N0cmluZywgd2lkdGhfYnl0ZXNbc3BlY1tpXS5zaXplXSk7CisJfQorI2VuZGlmCisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9TKQorCQlkdW1wX3N0cmluZ3Mobl9ieXRlc190b19za2lwLCBlbmRfb2Zmc2V0KTsKKwllbHNlCisJCWR1bXAobl9ieXRlc190b19za2lwLCBlbmRfb2Zmc2V0KTsKKworCWlmIChmY2xvc2Uoc3RkaW4pKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3N0YW5kYXJkX2lucHV0KTsKKworCXJldHVybiBleGl0X2NvZGU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvcHJpbnRlbnYuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9wcmludGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWRiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvcHJpbnRlbnYuYwpAQCAtMCwwICsxLDUwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwcmludGVudiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHByaW50ZW52X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbVkFSSUFCTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHByaW50ZW52X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgZW52aXJvbm1lbnQgVkFSSUFCTEVzLlxuIgorLy91c2FnZTogICAgICAgIklmIG5vIFZBUklBQkxFIHNwZWNpZmllZCwgcHJpbnQgYWxsLiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBwcmludGVudl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcHJpbnRlbnZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7CisKKwkvKiBubyB2YXJpYWJsZXMgc3BlY2lmaWVkLCBzaG93IHdob2xlIGVudiAqLworCWlmICghYXJndlsxXSkgeworCQljaGFyICoqZSA9IGVudmlyb247CisKKwkJLyogZW52aXJvbiBjYW4gYmUgTlVMTCEgKGZvciBleGFtcGxlLCBhZnRlciBjbGVhcmVudigpKQorCQkgKiBDaGVjayBmb3IgdGhhdDoKKwkJICovCisJCWlmIChlKQorCQkJd2hpbGUgKCplKQorCQkJCXB1dHMoKmUrKyk7CisJfSBlbHNlIHsKKwkJLyogc2VhcmNoIGZvciBzcGVjaWZpZWQgdmFyaWFibGVzIGFuZCBwcmludCB0aGVtIG91dCBpZiBmb3VuZCAqLworCQljaGFyICphcmcsICplbnY7CisKKwkJd2hpbGUgKChhcmcgPSAqKythcmd2KSAhPSBOVUxMKSB7CisJCQllbnYgPSBnZXRlbnYoYXJnKTsKKwkJCWlmIChlbnYpCisJCQkJcHV0cyhlbnYpOworCQkJZWxzZQorCQkJCWV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0KKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoZXhpdF9jb2RlKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9wcmludGYuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTNhYTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3ByaW50Zi5jCkBAIC0wLDAgKzEsNDE0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIHByaW50ZiAtIGZvcm1hdCBhbmQgcHJpbnQgZGF0YQorCisgICBDb3B5cmlnaHQgMTk5OSBEYXZlIENpbmVnZQorICAgUG9ydGlvbnMgY29weXJpZ2h0IChDKSAxOTkwLTE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvKiBVc2FnZTogcHJpbnRmIGZvcm1hdCBbYXJndW1lbnQuLi5dCisKKyAgIEEgZnJvbnQgZW5kIHRvIHRoZSBwcmludGYgZnVuY3Rpb24gdGhhdCBsZXRzIGl0IGJlIHVzZWQgZnJvbSB0aGUgc2hlbGwuCisKKyAgIEJhY2tzbGFzaCBlc2NhcGVzOgorCisgICBcIiA9IGRvdWJsZSBxdW90ZQorICAgXFwgPSBiYWNrc2xhc2gKKyAgIFxhID0gYWxlcnQgKGJlbGwpCisgICBcYiA9IGJhY2tzcGFjZQorICAgXGMgPSBwcm9kdWNlIG5vIGZ1cnRoZXIgb3V0cHV0CisgICBcZiA9IGZvcm0gZmVlZAorICAgXG4gPSBuZXcgbGluZQorICAgXHIgPSBjYXJyaWFnZSByZXR1cm4KKyAgIFx0ID0gaG9yaXpvbnRhbCB0YWIKKyAgIFx2ID0gdmVydGljYWwgdGFiCisgICBcMG9vbyA9IG9jdGFsIG51bWJlciAob29vIGlzIDAgdG8gMyBkaWdpdHMpCisgICBceGhoaCA9IGhleGFkZWNpbWFsIG51bWJlciAoaGhoIGlzIDEgdG8gMyBkaWdpdHMpCisKKyAgIEFkZGl0aW9uYWwgZGlyZWN0aXZlOgorCisgICAlYiA9IHByaW50IGFuIGFyZ3VtZW50IHN0cmluZywgaW50ZXJwcmV0aW5nIGJhY2tzbGFzaCBlc2NhcGVzCisKKyAgIFRoZSAnZm9ybWF0JyBhcmd1bWVudCBpcyByZS11c2VkIGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5CisgICB0byBjb252ZXJ0IGFsbCBvZiB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorCisgICBEYXZpZCBNYWNLZW56aWUgPGRqbUBnbnUuYWkubWl0LmVkdT4KKyovCisKKy8vICAgMTk5OTA1MDggQnVzeSBCb3hlZCEgRGF2ZSBDaW5lZ2UKKworLy91c2FnZTojZGVmaW5lIHByaW50Zl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRk9STUFUIFtBUkdVTUVOVF0uLi4iCisvL3VzYWdlOiNkZWZpbmUgcHJpbnRmX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRm9ybWF0IGFuZCBwcmludCBBUkdVTUVOVChzKSBhY2NvcmRpbmcgdG8gRk9STUFULFxuIgorLy91c2FnZTogICAgICAgIndoZXJlIEZPUk1BVCBjb250cm9scyB0aGUgb3V0cHV0IGV4YWN0bHkgYXMgaW4gQyBwcmludGYiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHByaW50Zl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwcmludGYgXCJWYWw9JWRcXG5cIiA1XG4iCisvL3VzYWdlOiAgICAgICAiVmFsPTVcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEEgbm90ZSBvbiBiYWQgaW5wdXQ6IG5laXRoZXIgYmFzaCAzLjIgbm9yIGNvcmV1dGlscyA2LjEwIHN0b3Agb24gaXQuCisgKiBUaGV5IHJlcG9ydCBpdDoKKyAqICBiYXNoOiBwcmludGY6IFhYWDogaW52YWxpZCBudW1iZXIKKyAqICBwcmludGY6IFhYWDogZXhwZWN0ZWQgYSBudW1lcmljIHZhbHVlCisgKiAgYmFzaDogcHJpbnRmOiAxMjNYWFg6IGludmFsaWQgbnVtYmVyCisgKiAgcHJpbnRmOiAxMjNYWFg6IHZhbHVlIG5vdCBjb21wbGV0ZWx5IGNvbnZlcnRlZAorICogYnV0IHRoZW4gdGhleSB1c2UgMCAob3IgcGFydGlhbGx5IGNvbnZlcnRlZCBudW1lcmljIHByZWZpeCkgYXMgYSB2YWx1ZQorICogYW5kIGNvbnRpbnVlLiBUaGV5IGV4aXQgd2l0aCAxIGluIHRoaXMgY2FzZS4KKyAqIEJvdGggYWNjZXB0IGluc2FuZSBmaWVsZCB3aWR0aC9wcmVjaXNpb24gKGUuZy4gJTk5OTk5OTk5OTkuOTk5OTk5OTk5OWQpLgorICogQm90aCBwcmludCBlcnJvciBtZXNzYWdlIGFuZCBhc3N1bWUgMCBpZiAlKi4qZiB3aWR0aC9wcmVjaXNpb24gaXMgImJhZCIKKyAqICAoYnV0IG5lZ2F0aXZlIG51bWJlcnMgYXJlIG5vdCAiYmFkIikuCisgKiBCb3RoIGFjY2VwdCBuZWdhdGl2ZSBudW1iZXJzIGZvciAldSBzcGVjaWZpZXIuCisgKgorICogV2UgdHJ5IHRvIGJlIGNvbXBhdGlibGUuCisgKi8KKwordHlwZWRlZiB2b2lkIEZBU1RfRlVOQyAoKmNvbnZlcnRlcikoY29uc3QgY2hhciAqYXJnLCB2b2lkICpyZXN1bHQpOworCitzdGF0aWMgaW50IG11bHRpY29udmVydChjb25zdCBjaGFyICphcmcsIHZvaWQgKnJlc3VsdCwgY29udmVydGVyIGNvbnZlcnQpCit7CisJaWYgKCphcmcgPT0gJyInIHx8ICphcmcgPT0gJ1wnJykgeworCQlhcmcgPSB1dG9hKCh1bnNpZ25lZCBjaGFyKWFyZ1sxXSk7CisJfQorCWVycm5vID0gMDsKKwljb252ZXJ0KGFyZywgcmVzdWx0KTsKKwlpZiAoZXJybm8pIHsKKwkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG51bWJlciAnJXMnIiwgYXJnKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29udl9zdHJ0b3VsbChjb25zdCBjaGFyICphcmcsIHZvaWQgKnJlc3VsdCkKK3sKKwkqKHVuc2lnbmVkIGxvbmcgbG9uZyopcmVzdWx0ID0gYmJfc3RydG91bGwoYXJnLCBOVUxMLCAwKTsKKwkvKiBib3RoIGNvcmV1dGlscyA2LjEwIGFuZCBiYXNoIDMuMjoKKwkgKiAkIHByaW50ZiAnJXhcbicgLTIKKwkgKiBmZmZmZmZmZmZmZmZmZmZlCisJICogTWltaWMgdGhhdDoKKwkgKi8KKwlpZiAoZXJybm8pIHsKKwkJKih1bnNpZ25lZCBsb25nIGxvbmcqKXJlc3VsdCA9IGJiX3N0cnRvbGwoYXJnLCBOVUxMLCAwKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29udl9zdHJ0b2xsKGNvbnN0IGNoYXIgKmFyZywgdm9pZCAqcmVzdWx0KQoreworCSoobG9uZyBsb25nKilyZXN1bHQgPSBiYl9zdHJ0b2xsKGFyZywgTlVMTCwgMCk7Cit9CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29udl9zdHJ0b2QoY29uc3QgY2hhciAqYXJnLCB2b2lkICpyZXN1bHQpCit7CisJY2hhciAqZW5kOworCS8qIFdlbGwsIHRoaXMgb25lIGFsbG93cyBsZWFkaW5nIHdoaXRlc3BhY2UuLi4gc28gd2hhdD8gKi8KKwkvKiBXaGF0IEkgbGlrZSBtdWNoIGxlc3MgaXMgdGhhdCAiLSIgYWNjZXB0ZWQgdG9vISA6KCAqLworCSooZG91YmxlKilyZXN1bHQgPSBzdHJ0b2QoYXJnLCAmZW5kKTsKKwlpZiAoZW5kWzBdKSB7CisJCWVycm5vID0gRVJBTkdFOworCQkqKGRvdWJsZSopcmVzdWx0ID0gMDsKKwl9Cit9CisKKy8qIENhbGxlcnMgc2hvdWxkIGNoZWNrIGVycm5vIHRvIGRldGVjdCBlcnJvcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbXlfeHN0cnRvdWxsKGNvbnN0IGNoYXIgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0OworCWlmIChtdWx0aWNvbnZlcnQoYXJnLCAmcmVzdWx0LCBjb252X3N0cnRvdWxsKSkKKwkJcmVzdWx0ID0gMDsKKwlyZXR1cm4gcmVzdWx0OworfQorc3RhdGljIGxvbmcgbG9uZyBteV94c3RydG9sbChjb25zdCBjaGFyICphcmcpCit7CisJbG9uZyBsb25nIHJlc3VsdDsKKwlpZiAobXVsdGljb252ZXJ0KGFyZywgJnJlc3VsdCwgY29udl9zdHJ0b2xsKSkKKwkJcmVzdWx0ID0gMDsKKwlyZXR1cm4gcmVzdWx0OworfQorc3RhdGljIGRvdWJsZSBteV94c3RydG9kKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlkb3VibGUgcmVzdWx0OworCW11bHRpY29udmVydChhcmcsICZyZXN1bHQsIGNvbnZfc3RydG9kKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBwcmludF9lc2Nfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyIGM7CisJd2hpbGUgKChjID0gKnN0cikgIT0gJ1wwJykgeworCQlzdHIrKzsKKwkJaWYgKGMgPT0gJ1xcJykKKwkJCWMgPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgmc3RyKTsKKwkJcHV0Y2hhcihjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2RpcmVjKGNoYXIgKmZvcm1hdCwgdW5zaWduZWQgZm10X2xlbmd0aCwKKwkJaW50IGZpZWxkX3dpZHRoLCBpbnQgcHJlY2lzaW9uLAorCQljb25zdCBjaGFyICphcmd1bWVudCkKK3sKKwlsb25nIGxvbmcgbGx2OworCWRvdWJsZSBkdjsKKwljaGFyIHNhdmVkOworCWNoYXIgKmhhdmVfcHJlYywgKmhhdmVfd2lkdGg7CisKKwlzYXZlZCA9IGZvcm1hdFtmbXRfbGVuZ3RoXTsKKwlmb3JtYXRbZm10X2xlbmd0aF0gPSAnXDAnOworCisJaGF2ZV9wcmVjID0gc3Ryc3RyKGZvcm1hdCwgIi4qIik7CisJaGF2ZV93aWR0aCA9IHN0cmNocihmb3JtYXQsICcqJyk7CisJaWYgKGhhdmVfd2lkdGggLSAxID09IGhhdmVfcHJlYykKKwkJaGF2ZV93aWR0aCA9IE5VTEw7CisKKwllcnJubyA9IDA7CisKKwlzd2l0Y2ggKGZvcm1hdFtmbXRfbGVuZ3RoIC0gMV0pIHsKKwljYXNlICdjJzoKKwkJcHJpbnRmKGZvcm1hdCwgKmFyZ3VtZW50KTsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CisJY2FzZSAnaSc6CisJCWxsdiA9IG15X3hzdHJ0b2xsKGFyZ3VtZW50KTsKKyBwcmludF9sb25nOgorCQlpZiAoIWhhdmVfd2lkdGgpIHsKKwkJCWlmICghaGF2ZV9wcmVjKQorCQkJCXByaW50Zihmb3JtYXQsIGxsdik7CisJCQllbHNlCisJCQkJcHJpbnRmKGZvcm1hdCwgcHJlY2lzaW9uLCBsbHYpOworCQl9IGVsc2UgeworCQkJaWYgKCFoYXZlX3ByZWMpCisJCQkJcHJpbnRmKGZvcm1hdCwgZmllbGRfd2lkdGgsIGxsdik7CisJCQllbHNlCisJCQkJcHJpbnRmKGZvcm1hdCwgZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgbGx2KTsKKwkJfQorCQlicmVhazsKKwljYXNlICdvJzoKKwljYXNlICd1JzoKKwljYXNlICd4JzoKKwljYXNlICdYJzoKKwkJbGx2ID0gbXlfeHN0cnRvdWxsKGFyZ3VtZW50KTsKKwkJLyogY2hlYXQ6IHVuc2lnbmVkIGxvbmcgYW5kIGxvbmcgaGF2ZSBzYW1lIHdpZHRoLCBzby4uLiAqLworCQlnb3RvIHByaW50X2xvbmc7CisJY2FzZSAncyc6CisJCS8qIEFyZSBjaGFyKiBhbmQgbG9uZyBsb25nIHRoZSBzYW1lPyAqLworCQlpZiAoc2l6ZW9mKGFyZ3VtZW50KSA9PSBzaXplb2YobGx2KSkgeworCQkJbGx2ID0gKGxvbmcgbG9uZykocHRyZGlmZl90KWFyZ3VtZW50OworCQkJZ290byBwcmludF9sb25nOworCQl9IGVsc2UgeworCQkJLyogSG9wZSBjb21waWxlciB3aWxsIG9wdGltaXplIGl0IG91dCBieSBtb3ZpbmcgY2FsbAorCQkJICogaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIGlmcy4uLiAqLworCQkJaWYgKCFoYXZlX3dpZHRoKSB7CisJCQkJaWYgKCFoYXZlX3ByZWMpCisJCQkJCXByaW50Zihmb3JtYXQsIGFyZ3VtZW50LCAvKnVudXNlZDoqLyBhcmd1bWVudCwgYXJndW1lbnQpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKGZvcm1hdCwgcHJlY2lzaW9uLCBhcmd1bWVudCwgLyp1bnVzZWQ6Ki8gYXJndW1lbnQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWhhdmVfcHJlYykKKwkJCQkJcHJpbnRmKGZvcm1hdCwgZmllbGRfd2lkdGgsIGFyZ3VtZW50LCAvKnVudXNlZDoqLyBhcmd1bWVudCk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoZm9ybWF0LCBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBhcmd1bWVudCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgJ2YnOgorCWNhc2UgJ2UnOgorCWNhc2UgJ0UnOgorCWNhc2UgJ2cnOgorCWNhc2UgJ0cnOgorCQlkdiA9IG15X3hzdHJ0b2QoYXJndW1lbnQpOworCQlpZiAoIWhhdmVfd2lkdGgpIHsKKwkJCWlmICghaGF2ZV9wcmVjKQorCQkJCXByaW50Zihmb3JtYXQsIGR2KTsKKwkJCWVsc2UKKwkJCQlwcmludGYoZm9ybWF0LCBwcmVjaXNpb24sIGR2KTsKKwkJfSBlbHNlIHsKKwkJCWlmICghaGF2ZV9wcmVjKQorCQkJCXByaW50Zihmb3JtYXQsIGZpZWxkX3dpZHRoLCBkdik7CisJCQllbHNlCisJCQkJcHJpbnRmKGZvcm1hdCwgZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZHYpOworCQl9CisJCWJyZWFrOworCX0gLyogc3dpdGNoICovCisKKwlmb3JtYXRbZm10X2xlbmd0aF0gPSBzYXZlZDsKK30KKworLyogSGFuZGxlIHBhcmFtcyBmb3IgIiUqLipmIi4gTmVnYXRpdmUgbnVtYmVycyBhcmUgb2sgKGNvbXBhdCkuICovCitzdGF0aWMgaW50IGdldF93aWR0aF9wcmVjKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgdiA9IGJiX3N0cnRvaShzdHIsIE5VTEwsIDEwKTsKKwlpZiAoZXJybm8pIHsKKwkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG51bWJlciAnJXMnIiwgc3RyKTsKKwkJdiA9IDA7CisJfQorCXJldHVybiB2OworfQorCisvKiBQcmludCB0aGUgdGV4dCBpbiBGT1JNQVQsIHVzaW5nIEFSR1YgZm9yIGFyZ3VtZW50cyB0byBhbnkgJyUnIGRpcmVjdGl2ZXMuCisgICBSZXR1cm4gYWR2YW5jZWQgQVJHVi4gICovCitzdGF0aWMgY2hhciAqKnByaW50X2Zvcm1hdHRlZChjaGFyICpmLCBjaGFyICoqYXJndiwgaW50ICpjb252X2VycikKK3sKKwljaGFyICpkaXJlY19zdGFydDsgICAgICAvKiBTdGFydCBvZiAlIGRpcmVjdGl2ZS4gICovCisJdW5zaWduZWQgZGlyZWNfbGVuZ3RoOyAgLyogTGVuZ3RoIG9mICUgZGlyZWN0aXZlLiAgKi8KKwlpbnQgZmllbGRfd2lkdGg7ICAgICAgICAvKiBBcmcgdG8gZmlyc3QgJyonICovCisJaW50IHByZWNpc2lvbjsgICAgICAgICAgLyogQXJnIHRvIHNlY29uZCAnKicgKi8KKwljaGFyICoqc2F2ZWRfYXJndiA9IGFyZ3Y7CisKKwlmb3IgKDsgKmY7ICsrZikgeworCQlzd2l0Y2ggKCpmKSB7CisJCWNhc2UgJyUnOgorCQkJZGlyZWNfc3RhcnQgPSBmKys7CisJCQlkaXJlY19sZW5ndGggPSAxOworCQkJZmllbGRfd2lkdGggPSBwcmVjaXNpb24gPSAwOworCQkJaWYgKCpmID09ICclJykgeworCQkJCWJiX3B1dGNoYXIoJyUnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgqZiA9PSAnYicpIHsKKwkJCQlpZiAoKmFyZ3YpIHsKKwkJCQkJcHJpbnRfZXNjX3N0cmluZygqYXJndik7CisJCQkJCSsrYXJndjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RyY2hyKCItKyAjIiwgKmYpKSB7CisJCQkJKytmOworCQkJCSsrZGlyZWNfbGVuZ3RoOworCQkJfQorCQkJaWYgKCpmID09ICcqJykgeworCQkJCSsrZjsKKwkJCQkrK2RpcmVjX2xlbmd0aDsKKwkJCQlpZiAoKmFyZ3YpCisJCQkJCWZpZWxkX3dpZHRoID0gZ2V0X3dpZHRoX3ByZWMoKmFyZ3YrKyk7CisJCQl9IGVsc2UgeworCQkJCXdoaWxlIChpc2RpZ2l0KCpmKSkgeworCQkJCQkrK2Y7CisJCQkJCSsrZGlyZWNfbGVuZ3RoOworCQkJCX0KKwkJCX0KKwkJCWlmICgqZiA9PSAnLicpIHsKKwkJCQkrK2Y7CisJCQkJKytkaXJlY19sZW5ndGg7CisJCQkJaWYgKCpmID09ICcqJykgeworCQkJCQkrK2Y7CisJCQkJCSsrZGlyZWNfbGVuZ3RoOworCQkJCQlpZiAoKmFyZ3YpCisJCQkJCQlwcmVjaXNpb24gPSBnZXRfd2lkdGhfcHJlYygqYXJndisrKTsKKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAoaXNkaWdpdCgqZikpIHsKKwkJCQkJCSsrZjsKKwkJCQkJCSsrZGlyZWNfbGVuZ3RoOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiBSZW1vdmUgImxMaHoiIHNpemUgbW9kaWZpZXJzLCByZXBlYXRlZGx5LgorCQkJICogYmFzaCBkb2VzIG5vdCBsaWtlICIlbGxkIiwgYnV0IGNvcmV1dGlscworCQkJICogaGFwcGlseSB0YWtlcyBldmVuICIlTGxsbGhoemhoemQiIQorCQkJICogV2UgYXJlIHBlcm1pc3NpdmUgbGlrZSBjb3JldXRpbHMgKi8KKwkJCXdoaWxlICgoKmYgfCAweDIwKSA9PSAnbCcgfHwgKmYgPT0gJ2gnIHx8ICpmID09ICd6JykgeworCQkJCW92ZXJsYXBwaW5nX3N0cmNweShmLCBmICsgMSk7CisJCQl9CisJCQkvKiBBZGQgImxsIiBpZiBpbnRlZ2VyIG1vZGlmaWVyLCB0aGVuIHByaW50ICovCisJCQl7CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0X2NoYXJzW10gQUxJR04xID0gImRpb3V4WGZlRWdHY3MiOworCQkJCWNoYXIgKnAgPSBzdHJjaHIoZm9ybWF0X2NoYXJzLCAqZik7CisJCQkJLyogbmVlZGVkIC0gdHJ5ICJwcmludGYgJSIgd2l0aG91dCBpdCAqLworCQkJCWlmIChwID09IE5VTEwpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCIlczogaW52YWxpZCBmb3JtYXQiLCBkaXJlY19zdGFydCk7CisJCQkJCS8qIGNhdXNlcyBtYWluKCkgdG8gZXhpdCB3aXRoIGVycm9yICovCisJCQkJCXJldHVybiBzYXZlZF9hcmd2IC0gMTsKKwkJCQl9CisJCQkJKytkaXJlY19sZW5ndGg7CisJCQkJaWYgKHAgLSBmb3JtYXRfY2hhcnMgPD0gNSkgeworCQkJCQkvKiBpdCBpcyBvbmUgb2YgImRpb3V4WCIgKi8KKwkJCQkJcCA9IHhtYWxsb2MoZGlyZWNfbGVuZ3RoICsgMyk7CisJCQkJCW1lbWNweShwLCBkaXJlY19zdGFydCwgZGlyZWNfbGVuZ3RoKTsKKwkJCQkJcFtkaXJlY19sZW5ndGggKyAxXSA9IHBbZGlyZWNfbGVuZ3RoIC0gMV07CisJCQkJCXBbZGlyZWNfbGVuZ3RoIC0gMV0gPSAnbCc7CisJCQkJCXBbZGlyZWNfbGVuZ3RoXSA9ICdsJzsKKwkJCQkJLy9iYl9lcnJvcl9tc2coIjwlcz4iLCBwKTsKKwkJCQkJZGlyZWNfbGVuZ3RoICs9IDI7CisJCQkJCWRpcmVjX3N0YXJ0ID0gcDsKKwkJCQl9IGVsc2UgeworCQkJCQlwID0gTlVMTDsKKwkJCQl9CisJCQkJaWYgKCphcmd2KSB7CisJCQkJCXByaW50X2RpcmVjKGRpcmVjX3N0YXJ0LCBkaXJlY19sZW5ndGgsIGZpZWxkX3dpZHRoLAorCQkJCQkJCQlwcmVjaXNpb24sICphcmd2KyspOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50X2RpcmVjKGRpcmVjX3N0YXJ0LCBkaXJlY19sZW5ndGgsIGZpZWxkX3dpZHRoLAorCQkJCQkJCQlwcmVjaXNpb24sICIiKTsKKwkJCQl9CisJCQkJKmNvbnZfZXJyIHw9IGVycm5vOworCQkJCWZyZWUocCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXFwnOgorCQkJaWYgKCorK2YgPT0gJ2MnKSB7CisJCQkJcmV0dXJuIHNhdmVkX2FyZ3Y7IC8qIGNhdXNlcyBtYWluKCkgdG8gZXhpdCAqLworCQkJfQorCQkJYmJfcHV0Y2hhcihiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgoY29uc3QgY2hhciAqKikmZikpOworCQkJZi0tOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwdXRjaGFyKCpmKTsKKwkJfQorCX0KKworCXJldHVybiBhcmd2OworfQorCitpbnQgcHJpbnRmX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgY29udl9lcnI7CisJY2hhciAqZm9ybWF0OworCWNoYXIgKiphcmd2MjsKKworCS8qIFdlIG11c3QgY2hlY2sgdGhhdCBzdGRvdXQgaXMgbm90IGNsb3NlZC4KKwkgKiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGhpZ2hseSBub24tb2J2aW91cy4KKwkgKiBwcmludGZfbWFpbiBpcyB1c2VkIGZyb20gc2hlbGwuCisJICogU2hlbGwgbXVzdCBjb3JyZWN0bHkgaGFuZGxlICdwcmludGYgIiVzIiBmb28nCisJICogaWYgc3Rkb3V0IGlzIGNsb3NlZC4gV2l0aCBzdGRpbywgb3V0cHV0IGdldHMgc2hvdmVsZWQgaW50bworCSAqIHN0ZG91dCBidWZmZXIsIGFuZCBldmVuIGZmbHVzaCBjYW5ub3QgY2xlYXIgaXQgb3V0LiBJdCBzZWVtcyB0aGF0CisJICogZXZlbiBpZiBsaWJjIHJlY2VpdmVzIEVCQURGIG9uIHdyaXRlIGF0dGVtcHRzLCBpdCBmZWVscyBkZXRlcm1pbmVkCisJICogdG8gb3V0cHV0IGRhdGEgbm8gbWF0dGVyIHdoYXQuIFNvIGl0IHdpbGwgdHJ5IGxhdGVyLAorCSAqIGFuZCBwb3NzaWJseSB3aWxsIGNsb2JiZXIgZnV0dXJlIG91dHB1dC4gTm90IGdvb2QuICovCisvLyBUT0RPOiBjaGVjayBmY250bCgpICYgT19BQ0NNT0RFID09IE9fV1JPTkxZIG9yIE9fUkRXUj8KKwlpZiAoZmNudGwoMSwgRl9HRVRGTCkgPT0gLTEpCisJCXJldHVybiAxOyAvKiBtYXRjaCBjb3JldXRpbHMgNi4xMCAoc2FucyBlcnJvciBtc2cgdG8gc3RkZXJyKSAqLworCS8vaWYgKGR1cDIoMSwgMSkgIT0gMSkgLSBvbGQgd2F5CisJLy8JcmV0dXJuIDE7CisKKwkvKiBiYXNoIGJ1aWx0aW4gZXJyb3JzIG91dCBvbiAicHJpbnRmICctJXMtXG4nIGZvbyIsCisJICogY29yZXV0aWxzLTYuOSB3b3Jrcy4gQm90aCB3b3JrIHdpdGggInByaW50ZiAtLSAnLSVzLVxuJyBmb28iLgorCSAqIFdlIHdpbGwgbWltaWMgY29yZXV0aWxzLiAqLworCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nICYmIGFyZ3ZbMV1bMV0gPT0gJy0nICYmICFhcmd2WzFdWzJdKQorCQlhcmd2Kys7CisJaWYgKCFhcmd2WzFdKSB7CisJCWlmIChFTkFCTEVfQVNIX0JVSUxUSU5fUFJJTlRGCisJCSAmJiBhcHBsZXRfbmFtZVswXSAhPSAncCcKKwkJKSB7CisJCQliYl9lcnJvcl9tc2coInVzYWdlOiBwcmludGYgRk9STUFUIFtBUkdVTUVOVC4uLl0iKTsKKwkJCXJldHVybiAyOyAvKiBiYXNoIGNvbXBhdCAqLworCQl9CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlmb3JtYXQgPSBhcmd2WzFdOworCWFyZ3YyID0gYXJndiArIDI7CisKKwljb252X2VyciA9IDA7CisJZG8geworCQlhcmd2ID0gYXJndjI7CisJCWFyZ3YyID0gcHJpbnRfZm9ybWF0dGVkKGZvcm1hdCwgYXJndiwgJmNvbnZfZXJyKTsKKwl9IHdoaWxlIChhcmd2MiA+IGFyZ3YgJiYgKmFyZ3YyKTsKKworCS8qIGNvcmV1dGlscyBjb21wYXQgKGJhc2ggZG9lc24ndCBkbyB0aGlzKToKKwlpZiAoKmFyZ3YpCisJCWZwcmludGYoc3RkZXJyLCAiZXhjZXNzIGFyZ3MgaWdub3JlZCIpOworCSovCisKKwlyZXR1cm4gKGFyZ3YyIDwgYXJndikgLyogaWYgdHJ1ZSwgcHJpbnRfZm9ybWF0dGVkIGVycm9yZWQgb3V0ICovCisJCXx8IGNvbnZfZXJyOyAvKiBwcmludF9mb3JtYXR0ZWQgc2F3IGludmFsaWQgbnVtYmVyICovCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvcHdkLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvcHdkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5YjgzNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9wd2QuYwpAQCAtMCwwICsxLDM2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHB3ZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcHdkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgcHdkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgdGhlIGZ1bGwgZmlsZW5hbWUgb2YgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHB3ZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwd2RcbiIKKy8vdXNhZ2U6ICAgICAgICIvcm9vdFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IHB3ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcHdkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqYnVmOworCisJYnVmID0geHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oTlVMTCk7CisJaWYgKGJ1ZiAhPSBOVUxMKSB7CisJCXB1dHMoYnVmKTsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gZmZsdXNoX2FsbCgpOworCX0KKworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvcmVhZGxpbmsuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9yZWFkbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWQ3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvcmVhZGxpbmsuYwpAQCAtMCwwICsxLDgyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJlYWRsaW5rIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByZWFkbGlua190cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX1JFQURMSU5LX0ZPTExPVygiWy1mbnZdICIpICJGSUxFIgorLy91c2FnZTojZGVmaW5lIHJlYWRsaW5rX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSB0aGUgdmFsdWUgb2YgYSBzeW1saW5rIgorLy91c2FnZToJSUZfRkVBVFVSRV9SRUFETElOS19GT0xMT1coICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJQ2Fub25pY2FsaXplIGJ5IGZvbGxvd2luZyBhbGwgc3ltbGlua3MiCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IGFkZCBuZXdsaW5lIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqICMgcmVhZGxpbmsgLS12ZXJzaW9uCisgKiByZWFkbGluayAoR05VIGNvcmV1dGlscykgNi4xMAorICogIyByZWFkbGluayAtLWhlbHAKKyAqICAgLWYsIC0tY2Fub25pY2FsaXplCisgKiAgICAgIGNhbm9uaWNhbGl6ZSBieSBmb2xsb3dpbmcgZXZlcnkgc3ltbGluayBpbgorICogICAgICBldmVyeSBjb21wb25lbnQgb2YgdGhlIGdpdmVuIG5hbWUgcmVjdXJzaXZlbHk7CisgKiAgICAgIGFsbCBidXQgdGhlIGxhc3QgY29tcG9uZW50IG11c3QgZXhpc3QKKyAqICAgLWUsIC0tY2Fub25pY2FsaXplLWV4aXN0aW5nCisgKiAgICAgIGNhbm9uaWNhbGl6ZSBieSBmb2xsb3dpbmcgZXZlcnkgc3ltbGluayBpbgorICogICAgICBldmVyeSBjb21wb25lbnQgb2YgdGhlIGdpdmVuIG5hbWUgcmVjdXJzaXZlbHksCisgKiAgICAgIGFsbCBjb21wb25lbnRzIG11c3QgZXhpc3QKKyAqICAgLW0sIC0tY2Fub25pY2FsaXplLW1pc3NpbmcKKyAqICAgICAgY2Fub25pY2FsaXplIGJ5IGZvbGxvd2luZyBldmVyeSBzeW1saW5rIGluCisgKiAgICAgIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZSByZWN1cnNpdmVseSwKKyAqICAgICAgd2l0aG91dCByZXF1aXJlbWVudHMgb24gY29tcG9uZW50cyBleGlzdGVuY2UKKyAqICAgLW4sIC0tbm8tbmV3bGluZSAgICAgICAgICAgICAgZG8gbm90IG91dHB1dCB0aGUgdHJhaWxpbmcgbmV3bGluZQorICogICAtcSwgLS1xdWlldCwgLXMsIC0tc2lsZW50ICAgICBzdXBwcmVzcyBtb3N0IGVycm9yIG1lc3NhZ2VzCisgKiAgIC12LCAtLXZlcmJvc2UgICAgICAgICAgICAgICAgIHJlcG9ydCBlcnJvciBtZXNzYWdlcworICoKKyAqIGJib3ggc3VwcG9ydHM6IC1mIC1uIC12IChmdWxseSksIC1xIC1zIChhY2NlcHRzIGJ1dCBpZ25vcmVzKQorICovCisKK2ludCByZWFkbGlua19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmVhZGxpbmtfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmJ1ZjsKKwljaGFyICpmbmFtZTsKKworCUlGX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XKAorCQl1bnNpZ25lZCBvcHQ7CisJCS8qIFdlIG5lZWQgZXhhY3RseSBvbmUgbm9uLW9wdGlvbiBhcmd1bWVudC4gICovCisJCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsKKwkJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImZudnNxIik7CisJCWZuYW1lID0gYXJndltvcHRpbmRdOworCSkKKwlJRl9OT1RfRkVBVFVSRV9SRUFETElOS19GT0xMT1coCisJCWNvbnN0IHVuc2lnbmVkIG9wdCA9IDA7CisJCWlmIChhcmdjICE9IDIpIGJiX3Nob3dfdXNhZ2UoKTsKKwkJZm5hbWUgPSBhcmd2WzFdOworCSkKKworCS8qIGNvbXBhdDogY29yZXV0aWxzIHJlYWRsaW5rIHJlcG9ydHMgZXJyb3JzIHNpbGVudGx5IHZpYSBleGl0IGNvZGUgKi8KKwlpZiAoIShvcHQgJiA0KSkgLyogbm90IC12ICovCisJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisKKwlpZiAob3B0ICYgMSkgeyAvKiAtZiAqLworCQlidWYgPSB4bWFsbG9jX3JlYWxwYXRoKGZuYW1lKTsKKwl9IGVsc2UgeworCQlidWYgPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oZm5hbWUpOworCX0KKworCWlmICghYnVmKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCXByaW50Zigob3B0ICYgMikgPyAiJXMiIDogIiVzXG4iLCBidWYpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKGJ1Zik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvcmVhbHBhdGguYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9yZWFscGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTNiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvcmVhbHBhdGguYwpAQCAtMCwwICsxLDQxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BIC0tIEFwcGFyZW50bHkgYSBidXN5Ym94IGV4dGVuc2lvbi4gKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBOb3cgZG9lcyBwcm9wZXIgZXJyb3IgY2hlY2tpbmcgb24gb3V0cHV0IGFuZCByZXR1cm5zIGEgZmFpbHVyZSBleGl0IGNvZGUKKyAqIGlmIG9uZSBvciBtb3JlIHBhdGhzIGNhbm5vdCBiZSByZXNvbHZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByZWFscGF0aF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSByZWFscGF0aF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJldHVybiB0aGUgYWJzb2x1dGUgcGF0aG5hbWVzIG9mIGdpdmVuIEZJTEUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgcmVhbHBhdGhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlYWxwYXRoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisJaWYgKCEqKythcmd2KSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlkbyB7CisJCWNoYXIgKnJlc29sdmVkX3BhdGggPSB4bWFsbG9jX3JlYWxwYXRoKCphcmd2KTsKKwkJaWYgKHJlc29sdmVkX3BhdGggIT0gTlVMTCkgeworCQkJcHV0cyhyZXNvbHZlZF9wYXRoKTsKKwkJCWZyZWUocmVzb2x2ZWRfcGF0aCk7CisJCX0gZWxzZSB7CisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7CisJCX0KKwl9IHdoaWxlICgqKythcmd2KTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQocmV0dmFsKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ybS5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyZmJhMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ybS5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcm0gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9ybS5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogU2l6ZSByZWR1Y3Rpb24uCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWlyZl0gRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBybV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlbW92ZSAodW5saW5rKSBGSUxFc1xuIgorLy91c2FnZTogICAgICJcbgktaQlBbHdheXMgcHJvbXB0IGJlZm9yZSByZW1vdmluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJTmV2ZXIgcHJvbXB0IgorLy91c2FnZTogICAgICJcbgktUiwtcglSZWN1cnNlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBybV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBybSAtcmYgL3RtcC9mb29cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBybV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcm1fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBzdGF0dXMgPSAwOworCWludCBmbGFncyA9IDA7CisJdW5zaWduZWQgb3B0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZi1pOmktZiI7CisJLyogLXYgKHZlcmJvc2UpIGlzIGlnbm9yZWQgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZmlScnYiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgMSkKKwkJZmxhZ3MgfD0gRklMRVVUSUxTX0ZPUkNFOworCWlmIChvcHQgJiAyKQorCQlmbGFncyB8PSBGSUxFVVRJTFNfSU5URVJBQ1RJVkU7CisJaWYgKG9wdCAmICg4fDQpKQorCQlmbGFncyB8PSBGSUxFVVRJTFNfUkVDVVI7CisKKwlpZiAoKmFyZ3YgIT0gTlVMTCkgeworCQlkbyB7CisJCQljb25zdCBjaGFyICpiYXNlID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoKmFyZ3YpOworCisJCQlpZiAoRE9UX09SX0RPVERPVChiYXNlKSkgeworCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgcmVtb3ZlICcuJyBvciAnLi4nIik7CisJCQl9IGVsc2UgaWYgKHJlbW92ZV9maWxlKCphcmd2LCBmbGFncykgPj0gMCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3RhdHVzID0gMTsKKwkJfSB3aGlsZSAoKisrYXJndik7CisJfSBlbHNlIGlmICghKGZsYWdzICYgRklMRVVUSUxTX0ZPUkNFKSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ybWRpci5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3JtZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0MGQxYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9ybWRpci5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJtZGlyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvcm1kaXIuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgcm1kaXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBESVJFQ1RPUlkuLi4iCisvL3VzYWdlOiNkZWZpbmUgcm1kaXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZW1vdmUgRElSRUNUT1JZIGlmIGl0IGlzIGVtcHR5XG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLXB8LS1wYXJlbnRzCUluY2x1ZGUgcGFyZW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1wCUluY2x1ZGUgcGFyZW50cyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcm1kaXJfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiMgcm1kaXIgL3RtcC9mb29cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworI2RlZmluZSBQQVJFTlRTIDB4MDEKKyNkZWZpbmUgSUdOT1JFX05PTl9FTVBUWSAweDAyCisKK2ludCBybWRpcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcm1kaXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJaW50IGZsYWdzOworCWNoYXIgKnBhdGg7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciBybWRpcl9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJwYXJlbnRzXDAiICAgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgInAiCisJCS8qIERlYmlhbiBldGNoOiBtYW55IHBhY2thZ2VzIGZhaWwgdG8gYmUgcHVyZ2VkIG9yIGluc3RhbGxlZAorCQkgKiBiZWNhdXNlIHRoZXkgZGVzcGVyYXRlbHkgd2FudCB0aGlzIG9wdGlvbjogKi8KKwkJImlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eVwwIiBOb19hcmd1bWVudCAiXHhmZiIKKwkJOworCWFwcGxldF9sb25nX29wdGlvbnMgPSBybWRpcl9sb25nb3B0czsKKyNlbmRpZgorCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgInAiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghKmFyZ3YpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWRvIHsKKwkJcGF0aCA9ICphcmd2OworCisJCXdoaWxlICgxKSB7CisJCQlpZiAocm1kaXIocGF0aCkgPCAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TCisJCQkJaWYgKChmbGFncyAmIElHTk9SRV9OT05fRU1QVFkpICYmIGVycm5vID09IEVOT1RFTVBUWSkKKwkJCQkJYnJlYWs7CisjZW5kaWYKKwkJCQliYl9wZXJyb3JfbXNnKCInJXMnIiwgcGF0aCk7ICAvKiBNYXRjaCBnbnUgcm1kaXIgbXNnLiAqLworCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCX0gZWxzZSBpZiAoZmxhZ3MgJiBQQVJFTlRTKSB7CisJCQkJLyogTm90ZTogcGF0aCB3YXMgbm90ICIiIHNpbmNlIHJtZGlyIHN1Y2NlZWRlZC4gKi8KKwkJCQlwYXRoID0gZGlybmFtZShwYXRoKTsKKwkJCQkvKiBQYXRoIGlzIG5vdyBqdXN0IHRoZSBwYXJlbnQgY29tcG9uZW50LiAgRGlybmFtZQorCQkJCSAqIHJldHVybnMgIi4iIGlmIHRoZXJlIGFyZSBubyBwYXJlbnRzLgorCQkJCSAqLworCQkJCWlmIChOT1RfTE9ORV9DSEFSKHBhdGgsICcuJykpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc2VxLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc2VxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4NjE5MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9zZXEuYwpAQCAtMCwwICsxLDEwOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2VxIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc2VxX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXddIFstcyBTRVBdIFtGSVJTVCBbSU5DXV0gTEFTVCIKKy8vdXNhZ2U6I2RlZmluZSBzZXFfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBudW1iZXJzIGZyb20gRklSU1QgdG8gTEFTVCwgaW4gc3RlcHMgb2YgSU5DLlxuIgorLy91c2FnZTogICAgICAgIkZJUlNULCBJTkMgZGVmYXVsdCB0byAxLlxuIgorLy91c2FnZTogICAgICJcbgktdwlQYWQgdG8gbGFzdCB3aXRoIGxlYWRpbmcgemVyb3MiCisvL3VzYWdlOiAgICAgIlxuCS1zIFNFUAlTdHJpbmcgc2VwYXJhdG9yIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IHNlcV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2VxX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlPUFRfdyA9ICgxIDw8IDApLAorCQlPUFRfcyA9ICgxIDw8IDEpLAorCX07CisJZG91YmxlIGZpcnN0LCBsYXN0LCBpbmNyZW1lbnQsIHY7CisJdW5zaWduZWQgbjsKKwl1bnNpZ25lZCB3aWR0aDsKKwl1bnNpZ25lZCBmcmFjX3BhcnQ7CisJY29uc3QgY2hhciAqc2VwLCAqb3B0X3MgPSAiXG4iOworCXVuc2lnbmVkIG9wdDsKKworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCS8qIFVuZG8gYnVzeWJveC5jOiBvbiBpbnB1dCwgd2Ugd2FudCB0byB1c2UgZG90CisJICogYXMgZnJhY3Rpb25hbCBzZXBhcmF0b3IsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBsb2NhbGUgKi8KKwlzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKTsKKyNlbmRpZgorCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIit3czoiLCAmb3B0X3MpOworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCWZpcnN0ID0gaW5jcmVtZW50ID0gMTsKKwllcnJubyA9IDA7CisJc3dpdGNoIChhcmdjKSB7CisJCQljaGFyICpwcDsKKwkJY2FzZSAzOgorCQkJaW5jcmVtZW50ID0gc3RydG9kKGFyZ3ZbMV0sICZwcCk7CisJCQllcnJubyB8PSAqcHA7CisJCWNhc2UgMjoKKwkJCWZpcnN0ID0gc3RydG9kKGFyZ3ZbMF0sICZwcCk7CisJCQllcnJubyB8PSAqcHA7CisJCWNhc2UgMToKKwkJCWxhc3QgPSBzdHJ0b2QoYXJndlthcmdjLTFdLCAmcHApOworCQkJaWYgKCFlcnJubyAmJiAqcHAgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKyNpZiBFTkFCTEVfTE9DQUxFX1NVUFBPUlQKKwlzZXRsb2NhbGUoTENfTlVNRVJJQywgIiIpOworI2VuZGlmCisKKwkvKiBMYXN0IGNoZWNrZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoOiBjb3JldXRpbHMtNi4xMCAqLworCXdpZHRoID0gMDsKKwlmcmFjX3BhcnQgPSAwOworCXdoaWxlICgxKSB7CisJCWNoYXIgKmRvdCA9IHN0cmNocm51bCgqYXJndiwgJy4nKTsKKwkJaW50IHcgPSAoZG90IC0gKmFyZ3YpOworCQlpbnQgZiA9IHN0cmxlbihkb3QpOworCQlpZiAod2lkdGggPCB3KQorCQkJd2lkdGggPSB3OworCQlhcmd2Kys7CisJCWlmICghKmFyZ3YpCisJCQlicmVhazsKKwkJLyogV2h5IGRvIHRoZSBhYm92ZSBfYmVmb3JlXyBmcmFjIGNoZWNrIGJlbG93PworCQkgKiBUcnkgInNlcSAxIDIuMCIgYW5kICJzZXEgMS4wIDIuMCI6CisJCSAqIGNvcmV1dGlscyBuZXZlciBwYXkgYXR0ZW50aW9uIHRvIHRoZSBudW1iZXIKKwkJICogb2YgZnJhY3Rpb25hbCBkaWdpdHMgaW4gbGFzdCBhcmcuICovCisJCWlmIChmcmFjX3BhcnQgPCBmKQorCQkJZnJhY19wYXJ0ID0gZjsKKwl9CisJaWYgKGZyYWNfcGFydCkgeworCQlmcmFjX3BhcnQtLTsKKwkJaWYgKGZyYWNfcGFydCkKKwkJCXdpZHRoICs9IGZyYWNfcGFydCArIDE7CisJfQorCWlmICghKG9wdCAmIE9QVF93KSkKKwkJd2lkdGggPSAwOworCisJc2VwID0gIiI7CisJdiA9IGZpcnN0OworCW4gPSAwOworCXdoaWxlIChpbmNyZW1lbnQgPj0gMCA/IHYgPD0gbGFzdCA6IHYgPj0gbGFzdCkgeworCQlpZiAocHJpbnRmKCIlcyUwKi4qZiIsIHNlcCwgd2lkdGgsIGZyYWNfcGFydCwgdikgPCAwKQorCQkJYnJlYWs7IC8qIEkvTyBlcnJvciwgYmFpbCBvdXQgKHllcywgdGhpcyByZWFsbHkgaGFwcGVucykgKi8KKwkJc2VwID0gb3B0X3M7CisJCS8qIHYgKz0gaW5jcmVtZW50OyAtIHdvdWxkIGFjY3VtdWxhdGUgZmxvYXRpbmcgcG9pbnQgZXJyb3JzICovCisJCW4rKzsKKwkJdiA9IGZpcnN0ICsgbiAqIGluY3JlbWVudDsKKwl9CisJaWYgKG4pIC8qIGlmIHdoaWxlIGxvb3AgZXhlY3V0ZWQgYXQgbGVhc3Qgb25jZSAqLworCQliYl9wdXRjaGFyKCdcbicpOworCisJcmV0dXJuIGZmbHVzaF9hbGwoKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9zbGVlcC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3NsZWVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmYmQxNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9zbGVlcC5jCkBAIC0wLDAgKzEsMTI2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzbGVlcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBCQl9BVURJVCBHTlUgaXNzdWVzIC0tIGZhbmN5IHZlcnNpb24gbWF0Y2hlcyBleGNlcHQgYXJncyBtdXN0IGJlIGludHMuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3NsZWVwLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBSZXdyaXR0ZW4gdG8gZG8gcHJvcGVyIGFyZyBhbmQgZXJyb3IgY2hlY2tpbmcuCisgKiBBbHNvLCBhZGRlZCBhICdmYW5jeScgY29uZmlndXJhdGlvbiB0byBhY2NlcHQgbXVsdGlwbGUgYXJncyB3aXRoCisgKiB0aW1lIHN1ZmZpeGVzIGZvciBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgYW5kIGRheXMuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNsZWVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfU0xFRVAoIlsiKSAiTiIgSUZfRkVBVFVSRV9GQU5DWV9TTEVFUCgiXS4uLiIpCisvL3VzYWdlOiNkZWZpbmUgc2xlZXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0ZBTkNZX1NMRUVQKCJQYXVzZSBmb3IgTiBzZWNvbmRzIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfU0xFRVAoCisvL3VzYWdlOiAgICAgICAiUGF1c2UgZm9yIGEgdGltZSBlcXVhbCB0byB0aGUgdG90YWwgb2YgdGhlIGFyZ3MgZ2l2ZW4sIHdoZXJlIGVhY2ggYXJnIGNhblxuIgorLy91c2FnZTogICAgICAgImhhdmUgYW4gb3B0aW9uYWwgc3VmZml4IG9mIChzKWVjb25kcywgKG0paW51dGVzLCAoaClvdXJzLCBvciAoZClheXMiKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzbGVlcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBzbGVlcCAyXG4iCisvL3VzYWdlOiAgICAgICAiWzIgc2Vjb25kIGRlbGF5IHJlc3VsdHNdXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX1NMRUVQKAorLy91c2FnZTogICAgICAgIiQgc2xlZXAgMWQgM2ggMjJtIDhzXG4iCisvL3VzYWdlOiAgICAgICAiWzk4NTI4IHNlY29uZCBkZWxheSByZXN1bHRzXVxuIikKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIERvIG5vdCBtYWtlIHRoaXMgYXBwbGV0IE5PRk9SSy4gSXQgYnJlYWtzIF5DLWluZyBvZiBwYXVzZXMgaW4gc2hlbGxzICovCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZBTkNZX1NMRUVQIHx8IEVOQUJMRV9GRUFUVVJFX0ZMT0FUX1NMRUVQCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IHNmeFtdID0geworCXsgInMiLCAxIH0sCisJeyAibSIsIDYwIH0sCisJeyAiaCIsIDYwKjYwIH0sCisJeyAiZCIsIDI0KjYwKjYwIH0sCisJeyAiIiwgMCB9Cit9OworI2VuZGlmCisKK2ludCBzbGVlcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2xlZXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0ZMT0FUX1NMRUVQCisJZG91YmxlIGR1cmF0aW9uOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKyNlbHNlCisJdW5zaWduZWQgZHVyYXRpb247CisjZW5kaWYKKworCSsrYXJndjsKKwlpZiAoISphcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GTE9BVF9TTEVFUAorCisjIGlmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCS8qIHVuZG8gYnVzeWJveC5jIHNldGxvY2FsZSAqLworCXNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpOworIyBlbmRpZgorCWR1cmF0aW9uID0gMDsKKwlkbyB7CisJCWNoYXIgKmFyZyA9ICphcmd2OworCQlpZiAoc3RyY2hyKGFyZywgJy4nKSkgeworCQkJZG91YmxlIGQ7CisJCQljaGFyICpwcDsKKwkJCWludCBsZW4gPSBzdHJzcG4oYXJnLCAiMDEyMzQ1Njc4OS4iKTsKKwkJCWNoYXIgc3YgPSBhcmdbbGVuXTsKKwkJCWFyZ1tsZW5dID0gJ1wwJzsKKwkJCWVycm5vID0gMDsKKwkJCWQgPSBzdHJ0b2QoYXJnLCAmcHApOworCQkJaWYgKGVycm5vIHx8ICpwcCkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlhcmcgKz0gbGVuOworCQkJKmFyZy0tID0gc3Y7CisJCQlzdiA9ICphcmc7CisJCQkqYXJnID0gJzEnOworCQkJZHVyYXRpb24gKz0gZCAqIHhhdG91bF9zZngoYXJnLCBzZngpOworCQkJKmFyZyA9IHN2OworCQl9IGVsc2UgeworCQkJZHVyYXRpb24gKz0geGF0b3VsX3NmeChhcmcsIHNmeCk7CisJCX0KKwl9IHdoaWxlICgqKythcmd2KTsKKworCXRzLnR2X3NlYyA9IE1BWElOVCh0eXBlb2YodHMudHZfc2VjKSk7CisJdHMudHZfbnNlYyA9IDA7CisJaWYgKGR1cmF0aW9uID49IDAgJiYgZHVyYXRpb24gPCB0cy50dl9zZWMpIHsKKwkJdHMudHZfc2VjID0gZHVyYXRpb247CisJCXRzLnR2X25zZWMgPSAoZHVyYXRpb24gLSB0cy50dl9zZWMpICogMTAwMDAwMDAwMDsKKwl9CisJZG8geworCQllcnJubyA9IDA7CisJCW5hbm9zbGVlcCgmdHMsICZ0cyk7CisJfSB3aGlsZSAoZXJybm8gPT0gRUlOVFIpOworCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9GQU5DWV9TTEVFUAorCisJZHVyYXRpb24gPSAwOworCWRvIHsKKwkJZHVyYXRpb24gKz0geGF0b3VfcmFuZ2Vfc2Z4KCphcmd2LCAwLCBVSU5UX01BWCAtIGR1cmF0aW9uLCBzZngpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCXNsZWVwKGR1cmF0aW9uKTsKKworI2Vsc2UgLyogc2ltcGxlICovCisKKwlkdXJhdGlvbiA9IHhhdG91KCphcmd2KTsKKwlzbGVlcChkdXJhdGlvbik7CisJLy8gT2ZmLiBJZiBpdCdzIHJlYWxseSBuZWVkZWQsIHByb3ZpZGUgZXhhbXBsZSB3aHkKKwkvL2lmIChzbGVlcChkdXJhdGlvbikpIHsKKwkvLwliYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSgpOworCS8vfQorCisjZW5kaWYKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc29ydC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3NvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGYwNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3NvcnQuYwpAQCAtMCwwICsxLDQ2OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3VTMyBjb21wbGlhbnQgc29ydCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIE1BSU5UQUlORVI6IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBTZWUgU3VTMyBzb3J0IHN0YW5kYXJkIGF0OgorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9zb3J0Lmh0bWwKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc29ydF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1ucnUiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NPUlRfQklHKCJnTWNzemJkZmltU1Rva3RdIFstbyBGSUxFXSBbLWsgc3RhcnRbLm9mZnNldF1bb3B0c11bLGVuZFsub2Zmc2V0XVtvcHRzXV0gWy10IENIQVIiKQorLy91c2FnZTogICAgICAgIl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHNvcnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTb3J0IGxpbmVzIG9mIHRleHRcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU09SVF9CSUcoCisvL3VzYWdlOiAgICAgIlxuCS1iCUlnbm9yZSBsZWFkaW5nIGJsYW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ2hlY2sgd2hldGhlciBpbnB1dCBpcyBzb3J0ZWQiCisvL3VzYWdlOiAgICAgIlxuCS1kCURpY3Rpb25hcnkgb3JkZXIgKGJsYW5rIG9yIGFscGhhbnVtZXJpYyBvbmx5KSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJSWdub3JlIGNhc2UiCisvL3VzYWdlOiAgICAgIlxuCS1nCUdlbmVyYWwgbnVtZXJpY2FsIHNvcnQiCisvL3VzYWdlOiAgICAgIlxuCS1pCUlnbm9yZSB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIgorLy91c2FnZTogICAgICJcbgktawlTb3J0IGtleSIKKy8vdXNhZ2U6ICAgICAiXG4JLU0JU29ydCBtb250aCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLW4JU29ydCBudW1iZXJzIgorLy91c2FnZToJSUZfRkVBVFVSRV9TT1JUX0JJRygKKy8vdXNhZ2U6ICAgICAiXG4JLW8JT3V0cHV0IHRvIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS1rCVNvcnQgYnkga2V5IgorLy91c2FnZTogICAgICJcbgktdCBDSEFSCUtleSBzZXBhcmF0b3IiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1yCVJldmVyc2Ugc29ydCBvcmRlciIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU09SVF9CSUcoCisvL3VzYWdlOiAgICAgIlxuCS1zCVN0YWJsZSAoZG9uJ3Qgc29ydCB0aWVzIGFscGhhYmV0aWNhbGx5KSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXUJU3VwcHJlc3MgZHVwbGljYXRlIGxpbmVzIgorLy91c2FnZToJSUZfRkVBVFVSRV9TT1JUX0JJRygKKy8vdXNhZ2U6ICAgICAiXG4JLXoJTGluZXMgYXJlIHRlcm1pbmF0ZWQgYnkgTlVMLCBub3QgbmV3bGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW1TVAlJZ25vcmVkIGZvciBHTlUgY29tcGF0aWJpbGl0eSIpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNvcnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZWNobyAtZSBcImVcXG5mXFxuYlxcbmRcXG5jXFxuYVwiIHwgc29ydFxuIgorLy91c2FnZTogICAgICAgImFcbiIKKy8vdXNhZ2U6ICAgICAgICJiXG4iCisvL3VzYWdlOiAgICAgICAiY1xuIgorLy91c2FnZTogICAgICAgImRcbiIKKy8vdXNhZ2U6ICAgICAgICJlXG4iCisvL3VzYWdlOiAgICAgICAiZlxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9TT1JUX0JJRygKKy8vdXNhZ2U6CQkiJCBlY2hvIC1lIFwiYyAzXFxuYiAyXFxuZCAyXCIgfCAkU09SVCAtayAyLDJuIC1rIDEsMXJcbiIKKy8vdXNhZ2U6CQkiZCAyXG4iCisvL3VzYWdlOgkJImIgMlxuIgorLy91c2FnZToJCSJjIDNcbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAgICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKKy8qCisJc29ydCBbLW1dWy1vIG91dHB1dF1bLWJkZmlucnVdWy10IGNoYXJdWy1rIGtleWRlZl0uLi4gW2ZpbGUuLi5dCisJc29ydCAtYyBbLWJkZmlucnVdWy10IGNoYXJdWy1rIGtleWRlZl1bZmlsZV0KKyovCisKKy8qIFRoZXNlIGFyZSBzb3J0IHR5cGVzICovCitzdGF0aWMgY29uc3QgY2hhciBPUFRfU1RSW10gQUxJR04xID0gIm5nTXVjc3picmRmaW1TOlQ6bzprOnQ6IjsKK2VudW0geworCUZMQUdfbiAgPSAxLCAgICAgICAgICAgIC8qIE51bWVyaWMgc29ydCAqLworCUZMQUdfZyAgPSAyLCAgICAgICAgICAgIC8qIFNvcnQgdXNpbmcgc3RydG9kKCkgKi8KKwlGTEFHX00gID0gNCwgICAgICAgICAgICAvKiBTb3J0IGRhdGUgKi8KKy8qIHVjc3ogYXBwbHkgdG8gcm9vdCBsZXZlbCBvbmx5LCBub3Qga2V5cy4gIGIgYXQgcm9vdCBsZXZlbCBpbXBsaWVzIGJiICovCisJRkxBR191ICA9IDgsICAgICAgICAgICAgLyogVW5pcXVlICovCisJRkxBR19jICA9IDB4MTAsICAgICAgICAgLyogQ2hlY2s6IG5vIG91dHB1dCwgZXhpdCghb3JkZXJlZCkgKi8KKwlGTEFHX3MgID0gMHgyMCwgICAgICAgICAvKiBTdGFibGUgc29ydCwgbm8gYXNjaWkgZmFsbGJhY2sgYXQgZW5kICovCisJRkxBR196ICA9IDB4NDAsICAgICAgICAgLyogSW5wdXQgYW5kIG91dHB1dCBpcyBOVUwgdGVybWluYXRlZCwgbm90IFxuICovCisvKiBUaGVzZSBjYW4gYmUgYXBwbGllZCB0byBzZWFyY2gga2V5cywgdGhlIHByZXZpb3VzIGZvdXIgY2FuJ3QgKi8KKwlGTEFHX2IgID0gMHg4MCwgICAgICAgICAvKiBJZ25vcmUgbGVhZGluZyBibGFua3MgKi8KKwlGTEFHX3IgID0gMHgxMDAsICAgICAgICAvKiBSZXZlcnNlICovCisJRkxBR19kICA9IDB4MjAwLCAgICAgICAgLyogSWdub3JlICEoaXNhbG51bSgpfGlzc3BhY2UoKSkgKi8KKwlGTEFHX2YgID0gMHg0MDAsICAgICAgICAvKiBGb3JjZSB1cHBlcmNhc2UgKi8KKwlGTEFHX2kgID0gMHg4MDAsICAgICAgICAvKiBJZ25vcmUgIWlzcHJpbnQoKSAqLworCUZMQUdfbSAgPSAweDEwMDAsICAgICAgIC8qIGlnbm9yZWQ6IG1lcmdlIGFscmVhZHkgc29ydGVkIGZpbGVzOyBkbyBub3Qgc29ydCAqLworCUZMQUdfUyAgPSAweDIwMDAsICAgICAgIC8qIGlnbm9yZWQ6IC1TLCAtLWJ1ZmZlci1zaXplPVNJWkUgKi8KKwlGTEFHX1QgID0gMHg0MDAwLCAgICAgICAvKiBpZ25vcmVkOiAtVCwgLS10ZW1wb3JhcnktZGlyZWN0b3J5PURJUiAqLworCUZMQUdfbyAgPSAweDgwMDAsCisJRkxBR19rICA9IDB4MTAwMDAsCisJRkxBR190ICA9IDB4MjAwMDAsCisJRkxBR19iYiA9IDB4ODAwMDAwMDAsICAgLyogSWdub3JlIHRyYWlsaW5nIGJsYW5rcyAgKi8KK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TT1JUX0JJRworc3RhdGljIGNoYXIga2V5X3NlcGFyYXRvcjsKKworc3RhdGljIHN0cnVjdCBzb3J0X2tleSB7CisJc3RydWN0IHNvcnRfa2V5ICpuZXh0X2tleTsgIC8qIGxpbmtlZCBsaXN0ICovCisJdW5zaWduZWQgcmFuZ2VbNF07ICAgICAgICAgIC8qIHN0YXJ0IHdvcmQsIHN0YXJ0IGNoYXIsIGVuZCB3b3JkLCBlbmQgY2hhciAqLworCXVuc2lnbmVkIGZsYWdzOworfSAqa2V5X2xpc3Q7CisKK3N0YXRpYyBjaGFyICpnZXRfa2V5KGNoYXIgKnN0ciwgc3RydWN0IHNvcnRfa2V5ICprZXksIGludCBmbGFncykKK3sKKwlpbnQgc3RhcnQgPSAwLCBlbmQgPSAwLCBsZW4sIGo7CisJdW5zaWduZWQgaTsKKworCS8qIFNwZWNpYWwgY2FzZSB3aG9sZSBzdHJpbmcsIHNvIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBhIGNvcHkgKi8KKwlpZiAoa2V5LT5yYW5nZVswXSA9PSAxICYmICFrZXktPnJhbmdlWzFdICYmICFrZXktPnJhbmdlWzJdICYmICFrZXktPnJhbmdlWzNdCisJICYmICEoZmxhZ3MgJiAoRkxBR19iIHwgRkxBR19kIHwgRkxBR19mIHwgRkxBR19pIHwgRkxBR19iYikpCisJKSB7CisJCXJldHVybiBzdHI7CisJfQorCisJLyogRmluZCBzdGFydCBvZiBrZXkgb24gZmlyc3QgcGFzcywgZW5kIG9uIHNlY29uZCBwYXNzICovCisJbGVuID0gc3RybGVuKHN0cik7CisJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQlpZiAoIWtleS0+cmFuZ2VbMipqXSkKKwkJCWVuZCA9IGxlbjsKKwkJLyogTG9vcCB0aHJvdWdoIGZpZWxkcyAqLworCQllbHNlIHsKKwkJCWVuZCA9IDA7CisJCQlmb3IgKGkgPSAxOyBpIDwga2V5LT5yYW5nZVsyKmpdICsgajsgaSsrKSB7CisJCQkJaWYgKGtleV9zZXBhcmF0b3IpIHsKKwkJCQkJLyogU2tpcCBib2R5IG9mIGtleSBhbmQgc2VwYXJhdG9yICovCisJCQkJCXdoaWxlIChzdHJbZW5kXSkgeworCQkJCQkJaWYgKHN0cltlbmQrK10gPT0ga2V5X3NlcGFyYXRvcikKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qIFNraXAgbGVhZGluZyBibGFua3MgKi8KKwkJCQkJd2hpbGUgKGlzc3BhY2Uoc3RyW2VuZF0pKQorCQkJCQkJZW5kKys7CisJCQkJCS8qIFNraXAgYm9keSBvZiBrZXkgKi8KKwkJCQkJd2hpbGUgKHN0cltlbmRdKSB7CisJCQkJCQlpZiAoaXNzcGFjZShzdHJbZW5kXSkpCisJCQkJCQkJYnJlYWs7CisJCQkJCQllbmQrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIWopIHN0YXJ0ID0gZW5kOworCX0KKwkvKiBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UgaWYgbmVjZXNzYXJ5ICovCisvL1hYWDogc2tpcF93aGl0ZXNwYWNlKCkKKwlpZiAoZmxhZ3MgJiBGTEFHX2IpCisJCXdoaWxlIChpc3NwYWNlKHN0cltzdGFydF0pKSBzdGFydCsrOworCS8qIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGZsYWdzICYgRkxBR19iYikKKwkJd2hpbGUgKGVuZCA+IHN0YXJ0ICYmIGlzc3BhY2Uoc3RyW2VuZC0xXSkpIGVuZC0tOworCS8qIEhhbmRsZSBvZmZzZXRzIG9uIHN0YXJ0IGFuZCBlbmQgKi8KKwlpZiAoa2V5LT5yYW5nZVszXSkgeworCQllbmQgKz0ga2V5LT5yYW5nZVszXSAtIDE7CisJCWlmIChlbmQgPiBsZW4pIGVuZCA9IGxlbjsKKwl9CisJaWYgKGtleS0+cmFuZ2VbMV0pIHsKKwkJc3RhcnQgKz0ga2V5LT5yYW5nZVsxXSAtIDE7CisJCWlmIChzdGFydCA+IGxlbikgc3RhcnQgPSBsZW47CisJfQorCS8qIE1ha2UgdGhlIGNvcHkgKi8KKwlpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0OworCXN0ciA9IHhzdHJuZHVwKHN0citzdGFydCwgZW5kLXN0YXJ0KTsKKwkvKiBIYW5kbGUgLWQgKi8KKwlpZiAoZmxhZ3MgJiBGTEFHX2QpIHsKKwkJZm9yIChzdGFydCA9IGVuZCA9IDA7IHN0cltlbmRdOyBlbmQrKykKKwkJCWlmIChpc3NwYWNlKHN0cltlbmRdKSB8fCBpc2FsbnVtKHN0cltlbmRdKSkKKwkJCQlzdHJbc3RhcnQrK10gPSBzdHJbZW5kXTsKKwkJc3RyW3N0YXJ0XSA9ICdcMCc7CisJfQorCS8qIEhhbmRsZSAtaSAqLworCWlmIChmbGFncyAmIEZMQUdfaSkgeworCQlmb3IgKHN0YXJ0ID0gZW5kID0gMDsgc3RyW2VuZF07IGVuZCsrKQorCQkJaWYgKGlzcHJpbnRfYXNjaWlvbmx5KHN0cltlbmRdKSkKKwkJCQlzdHJbc3RhcnQrK10gPSBzdHJbZW5kXTsKKwkJc3RyW3N0YXJ0XSA9ICdcMCc7CisJfQorCS8qIEhhbmRsZSAtZiAqLworCWlmIChmbGFncyAmIEZMQUdfZikKKwkJZm9yIChpID0gMDsgc3RyW2ldOyBpKyspCisJCQlzdHJbaV0gPSB0b3VwcGVyKHN0cltpXSk7CisKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgc3RydWN0IHNvcnRfa2V5ICphZGRfa2V5KHZvaWQpCit7CisJc3RydWN0IHNvcnRfa2V5ICoqcGtleSA9ICZrZXlfbGlzdDsKKwl3aGlsZSAoKnBrZXkpCisJCXBrZXkgPSAmKCgqcGtleSktPm5leHRfa2V5KTsKKwlyZXR1cm4gKnBrZXkgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ydF9rZXkpKTsKK30KKworI2RlZmluZSBHRVRfTElORShmcCkgXAorCSgob3B0aW9uX21hc2szMiAmIEZMQUdfeikgXAorCT8gYmJfZ2V0X2NodW5rX2Zyb21fZmlsZShmcCwgTlVMTCkgXAorCTogeG1hbGxvY19mZ2V0bGluZShmcCkpCisjZWxzZQorI2RlZmluZSBHRVRfTElORShmcCkgeG1hbGxvY19mZ2V0bGluZShmcCkKKyNlbmRpZgorCisvKiBJdGVyYXRlIHRocm91Z2gga2V5cyBsaXN0IGFuZCBwZXJmb3JtIGNvbXBhcmlzb25zICovCitzdGF0aWMgaW50IGNvbXBhcmVfa2V5cyhjb25zdCB2b2lkICp4YXJnLCBjb25zdCB2b2lkICp5YXJnKQoreworCWludCBmbGFncyA9IG9wdGlvbl9tYXNrMzIsIHJldHZhbCA9IDA7CisJY2hhciAqeCwgKnk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TT1JUX0JJRworCXN0cnVjdCBzb3J0X2tleSAqa2V5OworCisJZm9yIChrZXkgPSBrZXlfbGlzdDsgIXJldHZhbCAmJiBrZXk7IGtleSA9IGtleS0+bmV4dF9rZXkpIHsKKwkJZmxhZ3MgPSBrZXktPmZsYWdzID8ga2V5LT5mbGFncyA6IG9wdGlvbl9tYXNrMzI7CisJCS8qIENob3Agb3V0IGFuZCBtb2RpZnkga2V5IGNodW5rcywgaGFuZGxpbmcgLWRmaWIgKi8KKwkJeCA9IGdldF9rZXkoKihjaGFyICoqKXhhcmcsIGtleSwgZmxhZ3MpOworCQl5ID0gZ2V0X2tleSgqKGNoYXIgKiopeWFyZywga2V5LCBmbGFncyk7CisjZWxzZQorCS8qIFRoaXMgY3VybHkgYnJhY2tldCBzZXJ2ZXMgbm8gcHVycG9zZSBidXQgdG8gbWF0Y2ggdGhlIG5lc3RpbmcKKwkgICBsZXZlbCBvZiB0aGUgZm9yICgpIGxvb3Agd2UncmUgbm90IHVzaW5nICovCisJeworCQl4ID0gKihjaGFyICoqKXhhcmc7CisJCXkgPSAqKGNoYXIgKiopeWFyZzsKKyNlbmRpZgorCQkvKiBQZXJmb3JtIGFjdHVhbCBjb21wYXJpc29uICovCisJCXN3aXRjaCAoZmxhZ3MgJiA3KSB7CisJCWRlZmF1bHQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBzb3J0IHR5cGUiKTsKKwkJCWJyZWFrOworCQkvKiBBc2NpaSBzb3J0ICovCisJCWNhc2UgMDoKKyNpZiBFTkFCTEVfTE9DQUxFX1NVUFBPUlQKKwkJCXJldHZhbCA9IHN0cmNvbGwoeCwgeSk7CisjZWxzZQorCQkJcmV0dmFsID0gc3RyY21wKHgsIHkpOworI2VuZGlmCisJCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TT1JUX0JJRworCQljYXNlIEZMQUdfZzogeworCQkJY2hhciAqeHgsICp5eTsKKwkJCWRvdWJsZSBkeCA9IHN0cnRvZCh4LCAmeHgpOworCQkJZG91YmxlIGR5ID0gc3RydG9kKHksICZ5eSk7CisJCQkvKiBub3QgbnVtYmVycyA8IE5hTiA8IC1pbmZpbml0eSA8IG51bWJlcnMgPCAraW5maW5pdHkpICovCisJCQlpZiAoeCA9PSB4eCkKKwkJCQlyZXR2YWwgPSAoeSA9PSB5eSA/IDAgOiAtMSk7CisJCQllbHNlIGlmICh5ID09IHl5KQorCQkJCXJldHZhbCA9IDE7CisJCQkvKiBDaGVjayBmb3IgaXNuYW4gKi8KKwkJCWVsc2UgaWYgKGR4ICE9IGR4KQorCQkJCXJldHZhbCA9IChkeSAhPSBkeSkgPyAwIDogLTE7CisJCQllbHNlIGlmIChkeSAhPSBkeSkKKwkJCQlyZXR2YWwgPSAxOworCQkJLyogQ2hlY2sgZm9yIGluZmluaXR5LiAgQ291bGQgdW5kZXJmbG93LCBidXQgaXQgYXZvaWRzIGxpYm0uICovCisJCQllbHNlIGlmICgxLjAgLyBkeCA9PSAwLjApIHsKKwkJCQlpZiAoZHggPCAwKQorCQkJCQlyZXR2YWwgPSAoMS4wIC8gZHkgPT0gMC4wICYmIGR5IDwgMCkgPyAwIDogLTE7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAoMS4wIC8gZHkgPT0gMC4wICYmIGR5ID4gMCkgPyAwIDogMTsKKwkJCX0gZWxzZSBpZiAoMS4wIC8gZHkgPT0gMC4wKQorCQkJCXJldHZhbCA9IChkeSA8IDApID8gMSA6IC0xOworCQkJZWxzZQorCQkJCXJldHZhbCA9IChkeCA+IGR5KSA/IDEgOiAoKGR4IDwgZHkpID8gLTEgOiAwKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkxBR19NOiB7CisJCQlzdHJ1Y3QgdG0gdGh5bWU7CisJCQlpbnQgZHg7CisJCQljaGFyICp4eCwgKnl5OworCisJCQl4eCA9IHN0cnB0aW1lKHgsICIlYiIsICZ0aHltZSk7CisJCQlkeCA9IHRoeW1lLnRtX21vbjsKKwkJCXl5ID0gc3RycHRpbWUoeSwgIiViIiwgJnRoeW1lKTsKKwkJCWlmICgheHgpCisJCQkJcmV0dmFsID0gKCF5eSkgPyAwIDogLTE7CisJCQllbHNlIGlmICgheXkpCisJCQkJcmV0dmFsID0gMTsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAoZHggPT0gdGh5bWUudG1fbW9uKSA/IDAgOiBkeCAtIHRoeW1lLnRtX21vbjsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZ1bGwgZmxvYXRpbmcgcG9pbnQgdmVyc2lvbiBvZiAtbiAqLworCQljYXNlIEZMQUdfbjogeworCQkJZG91YmxlIGR4ID0gYXRvZih4KTsKKwkJCWRvdWJsZSBkeSA9IGF0b2YoeSk7CisJCQlyZXR2YWwgPSAoZHggPiBkeSkgPyAxIDogKChkeCA8IGR5KSA/IC0xIDogMCk7CisJCQlicmVhazsKKwkJfQorCQl9IC8qIHN3aXRjaCAqLworCQkvKiBGcmVlIGtleSBjb3BpZXMuICovCisJCWlmICh4ICE9ICooY2hhciAqKil4YXJnKSBmcmVlKHgpOworCQlpZiAoeSAhPSAqKGNoYXIgKiopeWFyZykgZnJlZSh5KTsKKwkJLyogaWYgKHJldHZhbCkgYnJlYWs7IC0gZG9uZSBieSBmb3IgKCkgYW55d2F5ICovCisjZWxzZQorCQkvKiBJbnRlZ2VyIHZlcnNpb24gb2YgLW4gZm9yIHRpbnkgc3lzdGVtcyAqLworCQljYXNlIEZMQUdfbjoKKwkJCXJldHZhbCA9IGF0b2koeCkgLSBhdG9pKHkpOworCQkJYnJlYWs7CisJCX0gLyogc3dpdGNoICovCisjZW5kaWYKKwl9IC8qIGZvciAqLworCisJLyogUGVyZm9ybSBmYWxsYmFjayBzb3J0IGlmIG5lY2Vzc2FyeSAqLworCWlmICghcmV0dmFsICYmICEob3B0aW9uX21hc2szMiAmIEZMQUdfcykpCisJCXJldHZhbCA9IHN0cmNtcCgqKGNoYXIgKiopeGFyZywgKihjaGFyICoqKXlhcmcpOworCisJaWYgKGZsYWdzICYgRkxBR19yKSByZXR1cm4gLXJldHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU09SVF9CSUcKK3N0YXRpYyB1bnNpZ25lZCBzdHIydShjaGFyICoqc3RyKQoreworCXVuc2lnbmVkIGxvbmcgbHU7CisJaWYgKCFpc2RpZ2l0KCgqc3RyKVswXSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZmllbGQgc3BlY2lmaWNhdGlvbiIpOworCWx1ID0gc3RydG91bCgqc3RyLCBzdHIsIDEwKTsKKwlpZiAoKHNpemVvZihsb25nKSA+IHNpemVvZihpbnQpICYmIGx1ID4gSU5UX01BWCkgfHwgIWx1KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGZpZWxkIHNwZWNpZmljYXRpb24iKTsKKwlyZXR1cm4gbHU7Cit9CisjZW5kaWYKKworaW50IHNvcnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNvcnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmxpbmUsICoqbGluZXM7CisJY2hhciAqc3RyX2lnbm9yZWQsICpzdHJfbywgKnN0cl90OworCWxsaXN0X3QgKmxzdF9rID0gTlVMTDsKKwlpbnQgaSwgZmxhZzsKKwlpbnQgbGluZWNvdW50OworCXVuc2lnbmVkIG9wdHM7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyOworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KKwkvKiAtbyBhbmQgLXQgY2FuIGJlIGdpdmVuIGF0IG1vc3Qgb25jZSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm8tLW86dC0tdDoiIC8qIC10LCAtbzogYXQgbW9zdCBvbmUgb2YgZWFjaCAqLworCQkJIms6OiI7IC8qIC1rIHRha2VzIGxpc3QgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgT1BUX1NUUiwgJnN0cl9pZ25vcmVkLCAmc3RyX2lnbm9yZWQsICZzdHJfbywgJmxzdF9rLCAmc3RyX3QpOworCS8qIGdsb2JhbCBiIHN0cmlwcyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgKi8KKwlpZiAob3B0cyAmIEZMQUdfYikKKwkJb3B0aW9uX21hc2szMiB8PSBGTEFHX2JiOworI2lmIEVOQUJMRV9GRUFUVVJFX1NPUlRfQklHCisJaWYgKG9wdHMgJiBGTEFHX3QpIHsKKwkJaWYgKCFzdHJfdFswXSB8fCBzdHJfdFsxXSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgLXQgcGFyYW1ldGVyIik7CisJCWtleV9zZXBhcmF0b3IgPSBzdHJfdFswXTsKKwl9CisJLyogbm90ZTogYmVsb3cgdGhpcyBwb2ludCB3ZSB1c2Ugb3B0aW9uX21hc2szMiwgbm90IG9wdHMsCisJICogc2luY2UgdGhhdCByZWR1Y2VzIHJlZ2lzdGVyIHByZXNzdXJlIGFuZCBtYWtlcyBjb2RlIHNtYWxsZXIgKi8KKworCS8qIHBhcnNlIHNvcnQga2V5ICovCisJd2hpbGUgKGxzdF9rKSB7CisJCWVudW0geworCQkJRkxBR19hbGxvd2VkX2Zvcl9rID0KKwkJCQlGTEFHX24gfCAvKiBOdW1lcmljIHNvcnQgKi8KKwkJCQlGTEFHX2cgfCAvKiBTb3J0IHVzaW5nIHN0cnRvZCgpICovCisJCQkJRkxBR19NIHwgLyogU29ydCBkYXRlICovCisJCQkJRkxBR19iIHwgLyogSWdub3JlIGxlYWRpbmcgYmxhbmtzICovCisJCQkJRkxBR19yIHwgLyogUmV2ZXJzZSAqLworCQkJCUZMQUdfZCB8IC8qIElnbm9yZSAhKGlzYWxudW0oKXxpc3NwYWNlKCkpICovCisJCQkJRkxBR19mIHwgLyogRm9yY2UgdXBwZXJjYXNlICovCisJCQkJRkxBR19pIHwgLyogSWdub3JlICFpc3ByaW50KCkgKi8KKwkJCTAKKwkJfTsKKwkJc3RydWN0IHNvcnRfa2V5ICprZXkgPSBhZGRfa2V5KCk7CisJCWNoYXIgKnN0cl9rID0gbGxpc3RfcG9wKCZsc3Rfayk7CisKKwkJaSA9IDA7IC8qIGk9PTAgYmVmb3JlIGNvbW1hLCAxIGFmdGVyICgtazMsNikgKi8KKwkJd2hpbGUgKCpzdHJfaykgeworCQkJLyogU3RhcnQgb2YgcmFuZ2UgKi8KKwkJCS8qIENhbm5vdCB1c2UgYmJfc3RydG91IC0gc3VmZml4IGNhbiBiZSBhIGxldHRlciAqLworCQkJa2V5LT5yYW5nZVsyKmldID0gc3RyMnUoJnN0cl9rKTsKKwkJCWlmICgqc3RyX2sgPT0gJy4nKSB7CisJCQkJc3RyX2srKzsKKwkJCQlrZXktPnJhbmdlWzIqaSsxXSA9IHN0cjJ1KCZzdHJfayk7CisJCQl9CisJCQl3aGlsZSAoKnN0cl9rKSB7CisJCQkJY29uc3QgY2hhciAqdGVtcDI7CisKKwkJCQlpZiAoKnN0cl9rID09ICcsJyAmJiAhaSsrKSB7CisJCQkJCXN0cl9rKys7CisJCQkJCWJyZWFrOworCQkJCX0gLyogbm8gZWxzZSBuZWVkZWQ6IGZhbGwgdGhyb3VnaCB0byBzeW50YXggZXJyb3IKKwkJCQkJYmVjYXVzZSBjb21tYSBpc24ndCBpbiBPUFRfU1RSICovCisJCQkJdGVtcDIgPSBzdHJjaHIoT1BUX1NUUiwgKnN0cl9rKTsKKwkJCQlpZiAoIXRlbXAyKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBrZXkgb3B0aW9uIik7CisJCQkJZmxhZyA9IDEgPDwgKHRlbXAyIC0gT1BUX1NUUik7CisJCQkJaWYgKGZsYWcgJiB+RkxBR19hbGxvd2VkX2Zvcl9rKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBzb3J0IHR5cGUiKTsKKwkJCQkvKiBiIGFmdGVyICcsJyBtZWFucyBzdHJpcCBfdHJhaWxpbmdfIHNwYWNlICovCisJCQkJaWYgKGkgJiYgZmxhZyA9PSBGTEFHX2IpCisJCQkJCWZsYWcgPSBGTEFHX2JiOworCQkJCWtleS0+ZmxhZ3MgfD0gZmxhZzsKKwkJCQlzdHJfaysrOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBPcGVuIGlucHV0IGZpbGVzIGFuZCByZWFkIGRhdGEgKi8KKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KQorCQkqLS1hcmd2ID0gKGNoYXIqKSItIjsKKwlsaW5lY291bnQgPSAwOworCWxpbmVzID0gTlVMTDsKKwlkbyB7CisJCS8qIGNvcmV1dGlscyA2LjkgY29tcGF0OiBhYm9ydCBvbiBmaXJzdCBvcGVuIGVycm9yLAorCQkgKiBkbyBub3QgY29udGludWUgdG8gbmV4dCBmaWxlOiAqLworCQlGSUxFICpmcCA9IHhmb3Blbl9zdGRpbigqYXJndik7CisJCWZvciAoOzspIHsKKwkJCWxpbmUgPSBHRVRfTElORShmcCk7CisJCQlpZiAoIWxpbmUpCisJCQkJYnJlYWs7CisJCQlsaW5lcyA9IHhyZWFsbG9jX3ZlY3RvcihsaW5lcywgNiwgbGluZWNvdW50KTsKKwkJCWxpbmVzW2xpbmVjb3VudCsrXSA9IGxpbmU7CisJCX0KKwkJZmNsb3NlX2lmX25vdF9zdGRpbihmcCk7CisJfSB3aGlsZSAoKisrYXJndik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TT1JUX0JJRworCS8qIGlmIG5vIGtleSwgcGVyZm9ybSBhbHBoYWJldGljIHNvcnQgKi8KKwlpZiAoIWtleV9saXN0KQorCQlhZGRfa2V5KCktPnJhbmdlWzBdID0gMTsKKwkvKiBoYW5kbGUgLWMgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfYykgeworCQlpbnQgaiA9IChvcHRpb25fbWFzazMyICYgRkxBR191KSA/IC0xIDogMDsKKwkJZm9yIChpID0gMTsgaSA8IGxpbmVjb3VudDsgaSsrKSB7CisJCQlpZiAoY29tcGFyZV9rZXlzKCZsaW5lc1tpLTFdLCAmbGluZXNbaV0pID4gaikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQ2hlY2sgbGluZSAldVxuIiwgaSk7CisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKyNlbmRpZgorCS8qIFBlcmZvcm0gdGhlIGFjdHVhbCBzb3J0ICovCisJcXNvcnQobGluZXMsIGxpbmVjb3VudCwgc2l6ZW9mKGxpbmVzWzBdKSwgY29tcGFyZV9rZXlzKTsKKwkvKiBoYW5kbGUgLXUgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfdSkgeworCQlmbGFnID0gMDsKKwkJLyogY29yZXV0aWxzIDYuMyBkcm9wIGxpbmVzIGZvciB3aGljaCBvbmx5IGtleSBpcyB0aGUgc2FtZSAqLworCQkvKiAtLSBkaXNhYmxpbmcgbGFzdC1yZXNvcnQgY29tcGFyZS4uLiAqLworCQlvcHRpb25fbWFzazMyIHw9IEZMQUdfczsKKwkJZm9yIChpID0gMTsgaSA8IGxpbmVjb3VudDsgaSsrKSB7CisJCQlpZiAoY29tcGFyZV9rZXlzKCZsaW5lc1tmbGFnXSwgJmxpbmVzW2ldKSA9PSAwKQorCQkJCWZyZWUobGluZXNbaV0pOworCQkJZWxzZQorCQkJCWxpbmVzWysrZmxhZ10gPSBsaW5lc1tpXTsKKwkJfQorCQlpZiAobGluZWNvdW50KQorCQkJbGluZWNvdW50ID0gZmxhZysxOworCX0KKworCS8qIFByaW50IGl0ICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU09SVF9CSUcKKwkvKiBPcGVuIG91dHB1dCBmaWxlIF9hZnRlcl8gd2UgcmVhZCBhbGwgaW5wdXQgb25lcyAqLworCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19vKQorCQl4bW92ZV9mZCh4b3BlbihzdHJfbywgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DKSwgU1RET1VUX0ZJTEVOTyk7CisjZW5kaWYKKwlmbGFnID0gKG9wdGlvbl9tYXNrMzIgJiBGTEFHX3opID8gJ1wwJyA6ICdcbic7CisJZm9yIChpID0gMDsgaSA8IGxpbmVjb3VudDsgaSsrKQorCQlwcmludGYoIiVzJWMiLCBsaW5lc1tpXSwgZmxhZyk7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc3BsaXQuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9zcGxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTY0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc3BsaXQuYwpAQCAtMCwwICsxLDE1MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3BsaXQgLSBzcGxpdCBhIGZpbGUgaW50byBwaWVjZXMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBCQl9BVURJVDogU1VTdjMgY29tcGxpYW50CisgKiBTVVN2MyByZXF1aXJlbWVudHM6CisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3NwbGl0Lmh0bWwKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3BsaXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbSU5QVVQgW1BSRUZJWF1dIgorLy91c2FnZTojZGVmaW5lIHNwbGl0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1iIE5ba3xtXQlTcGxpdCBieSBOIChraWxvfG1lZ2EpYnl0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1sIE4JCVNwbGl0IGJ5IE4gbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1hIE4JCVVzZSBOIGxldHRlcnMgYXMgc3VmZml4IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzcGxpdF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBzcGxpdCBUT0RPIGZvb1xuIgorLy91c2FnZTogICAgICAgIiQgY2F0IFRPRE8gfCBzcGxpdCAtYSAyIC1sIDIgVE9ET19cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgc3BsaXRfc3VmZmljZXNbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TUExJVF9GQU5DWQorCXsgImIiLCA1MTIgfSwKKyNlbmRpZgorCXsgImsiLCAxMDI0IH0sCisJeyAibSIsIDEwMjQqMTAyNCB9LAorI2lmIEVOQUJMRV9GRUFUVVJFX1NQTElUX0ZBTkNZCisJeyAiZyIsIDEwMjQqMTAyNCoxMDI0IH0sCisjZW5kaWYKKwl7ICIiLCAwIH0KK307CisKKy8qIEluY3JlbWVudCB0aGUgc3VmZml4IHBhcnQgb2YgdGhlIGZpbGVuYW1lLgorICogUmV0dXJucyBOVUxMIGlmIHdlIGFyZSBvdXQgb2YgZmlsZW5hbWVzLgorICovCitzdGF0aWMgY2hhciAqbmV4dF9maWxlKGNoYXIgKm9sZCwgdW5zaWduZWQgc3VmZml4X2xlbikKK3sKKwlzaXplX3QgZW5kID0gc3RybGVuKG9sZCk7CisJdW5zaWduZWQgaSA9IDE7CisJY2hhciAqY3VycjsKKworCXdoaWxlICgxKSB7CisJCWN1cnIgPSBvbGQgKyBlbmQgLSBpOworCQlpZiAoKmN1cnIgPCAneicpIHsKKwkJCSpjdXJyICs9IDE7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJCWlmIChpID4gc3VmZml4X2xlbikgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJKmN1cnIgPSAnYSc7CisJfQorCisJcmV0dXJuIG9sZDsKK30KKworI2RlZmluZSByZWFkX2J1ZmZlciBiYl9jb21tb25fYnVmc2l6MQorZW51bSB7IFJFQURfQlVGRkVSX1NJWkUgPSBDT01NT05fQlVGU0laRSAtIDEgfTsKKworI2RlZmluZSBTUExJVF9PUFRfbCAoMTw8MCkKKyNkZWZpbmUgU1BMSVRfT1BUX2IgKDE8PDEpCisjZGVmaW5lIFNQTElUX09QVF9hICgxPDwyKQorCitpbnQgc3BsaXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNwbGl0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBzdWZmaXhfbGVuID0gMjsKKwljaGFyICpwZng7CisJY2hhciAqY291bnRfcDsKKwljb25zdCBjaGFyICpzZng7CisJb2ZmX3QgY250ID0gMTAwMDsKKwlvZmZfdCByZW1haW5pbmcgPSAwOworCXVuc2lnbmVkIG9wdDsKKwlzc2l6ZV90IGJ5dGVzX3JlYWQsIHRvX3dyaXRlOworCWNoYXIgKnNyYzsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8yOmErIjsgLyogbWF4IDIgYXJnczsgLWEgTiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJsOmI6YToiLCAmY291bnRfcCwgJmNvdW50X3AsICZzdWZmaXhfbGVuKTsKKworCWlmIChvcHQgJiBTUExJVF9PUFRfbCkKKwkJY250ID0gWEFUT09GRihjb3VudF9wKTsKKwlpZiAob3B0ICYgU1BMSVRfT1BUX2IpIC8vIEZJWE1FOiBhbHNvIG5lZWRzIFhBVE9PRkYKKwkJY250ID0geGF0b3VsbF9zZngoY291bnRfcCwgc3BsaXRfc3VmZmljZXMpOworCXNmeCA9ICJ4IjsKKworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChhcmd2WzBdKSB7CisJCWludCBmZDsKKwkJaWYgKGFyZ3ZbMV0pCisJCQlzZnggPSBhcmd2WzFdOworCQlmZCA9IHhvcGVuX3N0ZGluKGFyZ3ZbMF0pOworCQl4bW92ZV9mZChmZCwgU1RESU5fRklMRU5PKTsKKwl9IGVsc2UgeworCQlhcmd2WzBdID0gKGNoYXIgKikgYmJfbXNnX3N0YW5kYXJkX2lucHV0OworCX0KKworCWlmIChOQU1FX01BWCA8IHN0cmxlbihzZngpICsgc3VmZml4X2xlbikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN1ZmZpeCB0b28gbG9uZyIpOworCisJeworCQljaGFyICpjaGFyX3AgPSB4emFsbG9jKHN1ZmZpeF9sZW4gKyAxKTsKKwkJbWVtc2V0KGNoYXJfcCwgJ2EnLCBzdWZmaXhfbGVuKTsKKwkJcGZ4ID0geGFzcHJpbnRmKCIlcyVzIiwgc2Z4LCBjaGFyX3ApOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGNoYXJfcCk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJYnl0ZXNfcmVhZCA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIHJlYWRfYnVmZmVyLCBSRUFEX0JVRkZFUl9TSVpFKTsKKwkJaWYgKCFieXRlc19yZWFkKQorCQkJYnJlYWs7CisJCWlmIChieXRlc19yZWFkIDwgMCkKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7CisJCXNyYyA9IHJlYWRfYnVmZmVyOworCQlkbyB7CisJCQlpZiAoIXJlbWFpbmluZykgeworCQkJCWlmICghcGZ4KQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3VmZml4ZXMgZXhoYXVzdGVkIik7CisJCQkJeG1vdmVfZmQoeG9wZW4ocGZ4LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DKSwgMSk7CisJCQkJcGZ4ID0gbmV4dF9maWxlKHBmeCwgc3VmZml4X2xlbik7CisJCQkJcmVtYWluaW5nID0gY250OworCQkJfQorCisJCQlpZiAob3B0ICYgU1BMSVRfT1BUX2IpIHsKKwkJCQkvKiBzcGxpdCBieSBieXRlcyAqLworCQkJCXRvX3dyaXRlID0gKGJ5dGVzX3JlYWQgPCByZW1haW5pbmcpID8gYnl0ZXNfcmVhZCA6IHJlbWFpbmluZzsKKwkJCQlyZW1haW5pbmcgLT0gdG9fd3JpdGU7CisJCQl9IGVsc2UgeworCQkJCS8qIHNwbGl0IGJ5IGxpbmVzICovCisJCQkJLyogY2FuIGJlIHNwZWQgdXAgYnkgdXNpbmcgX21lbXJjaHJfCisJCQkJICogYW5kIHdyaXRpbmcgbWFueSBsaW5lcyBhdCBvbmNlLi4uICovCisJCQkJY2hhciAqZW5kID0gbWVtY2hyKHNyYywgJ1xuJywgYnl0ZXNfcmVhZCk7CisJCQkJaWYgKGVuZCkgeworCQkJCQktLXJlbWFpbmluZzsKKwkJCQkJdG9fd3JpdGUgPSBlbmQgLSBzcmMgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCXRvX3dyaXRlID0gYnl0ZXNfcmVhZDsKKwkJCQl9CisJCQl9CisKKwkJCXh3cml0ZShTVERPVVRfRklMRU5PLCBzcmMsIHRvX3dyaXRlKTsKKwkJCWJ5dGVzX3JlYWQgLT0gdG9fd3JpdGU7CisJCQlzcmMgKz0gdG9fd3JpdGU7CisJCX0gd2hpbGUgKGJ5dGVzX3JlYWQpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3N0YXQuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9zdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NzcxOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9zdGF0LmMKQEAgLTAsMCArMSw3MjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHN0YXQgLS0gZGlzcGxheSBmaWxlIG9yIGZpbGUgc3lzdGVtIHN0YXR1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+CisgKgorICogV3JpdHRlbiBieSBNaWNoYWVsIE1lc2tlcworICogVGFrZW4gZnJvbSBjb3JldXRpbHMgYW5kIHR1cm5lZCBpbnRvIGEgYnVzeWJveCBhcHBsZXQgYnkgTWlrZSBGcnlzaW5nZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzdGF0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzdGF0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSBmaWxlIChkZWZhdWx0KSBvciBmaWxlc3lzdGVtIHN0YXR1c1xuIgorLy91c2FnZToJSUZfRkVBVFVSRV9TVEFUX0ZPUk1BVCgKKy8vdXNhZ2U6ICAgICAiXG4JLWMgZm10CVVzZSB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRGlzcGxheSBmaWxlc3lzdGVtIHN0YXR1cyIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJRm9sbG93IGxpbmtzIgorLy91c2FnZTogICAgICJcbgktdAlEaXNwbGF5IGluZm8gaW4gdGVyc2UgZm9ybSIKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgIlxuCS1aCVByaW50IHNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVRfRk9STUFUKAorLy91c2FnZTogICAgICAgIlxuXG5WYWxpZCBmb3JtYXQgc2VxdWVuY2VzIGZvciBmaWxlczpcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWEJQWNjZXNzIHJpZ2h0cyBpbiBvY3RhbFxuIgorLy91c2FnZTogICAgICAgIiAlQQlBY2Nlc3MgcmlnaHRzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1cbiIKKy8vdXNhZ2U6ICAgICAgICIgJWIJTnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgKHNlZSAlQilcbiIKKy8vdXNhZ2U6ICAgICAgICIgJUIJVGhlIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBibG9jayByZXBvcnRlZCBieSAlYlxuIgorLy91c2FnZTogICAgICAgIiAlZAlEZXZpY2UgbnVtYmVyIGluIGRlY2ltYWxcbiIKKy8vdXNhZ2U6ICAgICAgICIgJUQJRGV2aWNlIG51bWJlciBpbiBoZXhcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWYJUmF3IG1vZGUgaW4gaGV4XG4iCisvL3VzYWdlOiAgICAgICAiICVGCUZpbGUgdHlwZVxuIgorLy91c2FnZTogICAgICAgIiAlZwlHcm91cCBJRCBvZiBvd25lclxuIgorLy91c2FnZTogICAgICAgIiAlRwlHcm91cCBuYW1lIG9mIG93bmVyXG4iCisvL3VzYWdlOiAgICAgICAiICVoCU51bWJlciBvZiBoYXJkIGxpbmtzXG4iCisvL3VzYWdlOiAgICAgICAiICVpCUlub2RlIG51bWJlclxuIgorLy91c2FnZTogICAgICAgIiAlbglGaWxlIG5hbWVcbiIKKy8vdXNhZ2U6ICAgICAgICIgJU4JRmlsZSBuYW1lLCB3aXRoIC0+IFRBUkdFVCBpZiBzeW1saW5rXG4iCisvL3VzYWdlOiAgICAgICAiICVvCUkvTyBibG9jayBzaXplXG4iCisvL3VzYWdlOiAgICAgICAiICVzCVRvdGFsIHNpemUsIGluIGJ5dGVzXG4iCisvL3VzYWdlOiAgICAgICAiICV0CU1ham9yIGRldmljZSB0eXBlIGluIGhleFxuIgorLy91c2FnZTogICAgICAgIiAlVAlNaW5vciBkZXZpY2UgdHlwZSBpbiBoZXhcbiIKKy8vdXNhZ2U6ICAgICAgICIgJXUJVXNlciBJRCBvZiBvd25lclxuIgorLy91c2FnZTogICAgICAgIiAlVQlVc2VyIG5hbWUgb2Ygb3duZXJcbiIKKy8vdXNhZ2U6ICAgICAgICIgJXgJVGltZSBvZiBsYXN0IGFjY2Vzc1xuIgorLy91c2FnZTogICAgICAgIiAlWAlUaW1lIG9mIGxhc3QgYWNjZXNzIGFzIHNlY29uZHMgc2luY2UgRXBvY2hcbiIKKy8vdXNhZ2U6ICAgICAgICIgJXkJVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvblxuIgorLy91c2FnZTogICAgICAgIiAlWQlUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uIGFzIHNlY29uZHMgc2luY2UgRXBvY2hcbiIKKy8vdXNhZ2U6ICAgICAgICIgJXoJVGltZSBvZiBsYXN0IGNoYW5nZVxuIgorLy91c2FnZTogICAgICAgIiAlWglUaW1lIG9mIGxhc3QgY2hhbmdlIGFzIHNlY29uZHMgc2luY2UgRXBvY2hcbiIKKy8vdXNhZ2U6ICAgICAgICJcblZhbGlkIGZvcm1hdCBzZXF1ZW5jZXMgZm9yIGZpbGUgc3lzdGVtczpcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWEJRnJlZSBibG9ja3MgYXZhaWxhYmxlIHRvIG5vbi1zdXBlcnVzZXJcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWIJVG90YWwgZGF0YSBibG9ja3MgaW4gZmlsZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAgICIgJWMJVG90YWwgZmlsZSBub2RlcyBpbiBmaWxlIHN5c3RlbVxuIgorLy91c2FnZTogICAgICAgIiAlZAlGcmVlIGZpbGUgbm9kZXMgaW4gZmlsZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAgICIgJWYJRnJlZSBibG9ja3MgaW4gZmlsZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgICAiICVDCVNlY3VyaXR5IGNvbnRleHQgaW4gc2VsaW51eFxuIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICAgIiAlaQlGaWxlIFN5c3RlbSBJRCBpbiBoZXhcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWwJTWF4aW11bSBsZW5ndGggb2YgZmlsZW5hbWVzXG4iCisvL3VzYWdlOiAgICAgICAiICVuCUZpbGUgbmFtZVxuIgorLy91c2FnZTogICAgICAgIiAlcwlCbG9jayBzaXplIChmb3IgZmFzdGVyIHRyYW5zZmVyKVxuIgorLy91c2FnZTogICAgICAgIiAlUwlGdW5kYW1lbnRhbCBibG9jayBzaXplIChmb3IgYmxvY2sgY291bnRzKVxuIgorLy91c2FnZTogICAgICAgIiAldAlUeXBlIGluIGhleFxuIgorLy91c2FnZTogICAgICAgIiAlVAlUeXBlIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0iCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIE9QVF9GSUxFU1lTICAgICAoMSA8PCAwKQorI2RlZmluZSBPUFRfVEVSU0UgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgT1BUX0RFUkVGRVJFTkNFICgxIDw8IDIpCisjZGVmaW5lIE9QVF9TRUxJTlVYICAgICAoMSA8PCAzKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKK3R5cGVkZWYgYm9vbCAoKnN0YXRmdW5jX3B0cikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworI2Vsc2UKK3R5cGVkZWYgYm9vbCAoKnN0YXRmdW5jX3B0cikoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqZmlsZV90eXBlKGNvbnN0IHN0cnVjdCBzdGF0ICpzdCkKK3sKKwkvKiBTZWUgUE9TSVggMTAwMy4xLTIwMDEgWENVIFRhYmxlIDQtOCBsaW5lcyAxNzA5My0xNzEwNworCSAqIGZvciBzb21lIG9mIHRoZXNlIGZvcm1hdHMuCisJICogVG8ga2VlcCBkaWFnbm9zdGljcyBncmFtbWF0aWNhbCBpbiBFbmdsaXNoLCB0aGUKKwkgKiByZXR1cm5lZCBzdHJpbmcgbXVzdCBzdGFydCB3aXRoIGEgY29uc29uYW50LgorCSAqLworCWlmIChTX0lTUkVHKHN0LT5zdF9tb2RlKSkgIHJldHVybiBzdC0+c3Rfc2l6ZSA9PSAwID8gInJlZ3VsYXIgZW1wdHkgZmlsZSIgOiAicmVndWxhciBmaWxlIjsKKwlpZiAoU19JU0RJUihzdC0+c3RfbW9kZSkpICByZXR1cm4gImRpcmVjdG9yeSI7CisJaWYgKFNfSVNCTEsoc3QtPnN0X21vZGUpKSAgcmV0dXJuICJibG9jayBzcGVjaWFsIGZpbGUiOworCWlmIChTX0lTQ0hSKHN0LT5zdF9tb2RlKSkgIHJldHVybiAiY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSI7CisJaWYgKFNfSVNGSUZPKHN0LT5zdF9tb2RlKSkgcmV0dXJuICJmaWZvIjsKKwlpZiAoU19JU0xOSyhzdC0+c3RfbW9kZSkpICByZXR1cm4gInN5bWJvbGljIGxpbmsiOworCWlmIChTX0lTU09DSyhzdC0+c3RfbW9kZSkpIHJldHVybiAic29ja2V0IjsKKwlpZiAoU19UWVBFSVNNUShzdCkpICAgICAgICByZXR1cm4gIm1lc3NhZ2UgcXVldWUiOworCWlmIChTX1RZUEVJU1NFTShzdCkpICAgICAgIHJldHVybiAic2VtYXBob3JlIjsKKwlpZiAoU19UWVBFSVNTSE0oc3QpKSAgICAgICByZXR1cm4gInNoYXJlZCBtZW1vcnkgb2JqZWN0IjsKKyNpZmRlZiBTX1RZUEVJU1RNTworCWlmIChTX1RZUEVJU1RNTyhzdCkpICAgICAgIHJldHVybiAidHlwZWQgbWVtb3J5IG9iamVjdCI7CisjZW5kaWYKKwlyZXR1cm4gIndlaXJkIGZpbGUiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqaHVtYW5fdGltZSh0aW1lX3QgdCkKK3sKKwkvKiBPbGQKKwlzdGF0aWMgY2hhciAqc3RyOworCXN0ciA9IGN0aW1lKCZ0KTsKKwlzdHJbc3RybGVuKHN0ciktMV0gPSAnXDAnOworCXJldHVybiBzdHI7CisJKi8KKwkvKiBjb3JldXRpbHMgNi4zIGNvbXBhdDogKi8KKworCS8qc3RhdGljIGNoYXIgYnVmW3NpemVvZigiWVlZWS1NTS1ERCBISDpNTTpTUy4wMDAwMDAwMDAiKV0gQUxJR04xOyovCisjZGVmaW5lIGJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCisJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiVZLSVtLSVkICVIOiVNOiVTLjAwMDAwMDAwMCIsIGxvY2FsdGltZSgmdCkpOworCXJldHVybiBidWY7CisjdW5kZWYgYnVmCit9CisKKy8qIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtLgorICogU29tZSBzeXN0ZW1zIGhhdmUgc3RhdGZ2cy5mX2Jhc2V0eXBlW0ZTVFlQU1pdLiAoQUlYLCBIUC1VWCwgYW5kIFNvbGFyaXMpCisgKiBPdGhlcnMgaGF2ZSBzdGF0ZnMuZl9mc3R5cGVuYW1lW01GU05BTUVMRU5dLiAoTmV0QlNEIDEuNS4yKQorICogU3RpbGwgb3RoZXJzIGhhdmUgbmVpdGhlciBhbmQgaGF2ZSB0byBnZXQgYnkgd2l0aCBmX3R5cGUgKExpbnV4KS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmh1bWFuX2ZzdHlwZSh1aW50MzJfdCBmX3R5cGUpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB0eXBlcyB7CisJCXVpbnQzMl90IHR5cGU7CisJCWNvbnN0IGNoYXIgKmNvbnN0IGZzOworCX0gaHVtYW50eXBlc1tdID0geworCQl7IDB4QURGRiwgICAgICJhZmZzIiB9LAorCQl7IDB4MUNkMSwgICAgICJkZXZwdHMiIH0sCisJCXsgMHgxMzdELCAgICAgImV4dCIgfSwKKwkJeyAweEVGNTEsICAgICAiZXh0MiIgfSwKKwkJeyAweEVGNTMsICAgICAiZXh0Mi9leHQzIiB9LAorCQl7IDB4MzE1MzQ2NGEsICJqZnMiIH0sCisJCXsgMHg1ODQ2NTM0MiwgInhmcyIgfSwKKwkJeyAweEY5OTVFODQ5LCAiaHBmcyIgfSwKKwkJeyAweDk2NjAsICAgICAiaXNvZnMiIH0sCisJCXsgMHg0MDAwLCAgICAgImlzb2ZzIiB9LAorCQl7IDB4NDAwNCwgICAgICJpc29mcyIgfSwKKwkJeyAweDEzN0YsICAgICAibWluaXgiIH0sCisJCXsgMHgxMzhGLCAgICAgIm1pbml4ICgzMCBjaGFyLikiIH0sCisJCXsgMHgyNDY4LCAgICAgIm1pbml4IHYyIiB9LAorCQl7IDB4MjQ3OCwgICAgICJtaW5peCB2MiAoMzAgY2hhci4pIiB9LAorCQl7IDB4NGQ0NCwgICAgICJtc2RvcyIgfSwKKwkJeyAweDQwMDYsICAgICAiZmF0IiB9LAorCQl7IDB4NTY0YywgICAgICJub3ZlbGwiIH0sCisJCXsgMHg2OTY5LCAgICAgIm5mcyIgfSwKKwkJeyAweDlmYTAsICAgICAicHJvYyIgfSwKKwkJeyAweDUxN0IsICAgICAic21iIiB9LAorCQl7IDB4MDEyRkY3QjQsICJ4ZW5peCIgfSwKKwkJeyAweDAxMkZGN0I1LCAic3lzdjQiIH0sCisJCXsgMHgwMTJGRjdCNiwgInN5c3YyIiB9LAorCQl7IDB4MDEyRkY3QjcsICJjb2giIH0sCisJCXsgMHgwMDAxMTk1NCwgInVmcyIgfSwKKwkJeyAweDAxMkZEMTZELCAieGlhIiB9LAorCQl7IDB4NTM0NjU0NGUsICJudGZzIiB9LAorCQl7IDB4MTAyMTk5NCwgICJ0bXBmcyIgfSwKKwkJeyAweDUyNjU0OTczLCAicmVpc2VyZnMiIH0sCisJCXsgMHgyOGNkM2Q0NSwgImNyYW1mcyIgfSwKKwkJeyAweDcyNzUsICAgICAicm9tZnMiIH0sCisJCXsgMHg4NTg0NThmNiwgInJvbWZzIiB9LAorCQl7IDB4NzM3MTczNjgsICJzcXVhc2hmcyIgfSwKKwkJeyAweDYyNjU2NTcyLCAic3lzZnMiIH0sCisJCXsgMCwgIlVOS05PV04iIH0KKwl9OworCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBodW1hbnR5cGVzW2ldLnR5cGU7ICsraSkKKwkJaWYgKGh1bWFudHlwZXNbaV0udHlwZSA9PSBmX3R5cGUpCisJCQlicmVhazsKKwlyZXR1cm4gaHVtYW50eXBlc1tpXS5mczsKK30KKworLyogIm1hbiBzdGF0ZnMiIHNheXMgdGhhdCBzdGF0ZnNidWYtPmZfZnNpZCBpcyBhIG1lc3MgKi8KKy8qIGNvcmV1dGlscyB0cmVhdHMgaXQgYXMgYW4gYXJyYXkgb2YgaW50cywgbW9zdCBzaWduaWZpY2FudCBmaXJzdCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRfZl9mc2lkKGNvbnN0IHN0cnVjdCBzdGF0ZnMgKnN0YXRmc2J1ZikKK3sKKwljb25zdCB1bnNpZ25lZCAqcCA9IChjb25zdCB2b2lkKikgJnN0YXRmc2J1Zi0+Zl9mc2lkOworCXVuc2lnbmVkIHN6ID0gc2l6ZW9mKHN0YXRmc2J1Zi0+Zl9mc2lkKSAvIHNpemVvZih1bnNpZ25lZCk7CisJdW5zaWduZWQgbG9uZyBsb25nIHIgPSAwOworCisJZG8KKwkJciA9IChyIDw8IChzaXplb2YodW5zaWduZWQpKjgpKSB8ICpwKys7CisJd2hpbGUgKC0tc3ogPiAwKTsKKwlyZXR1cm4gcjsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NUQVRfRk9STUFUCitzdGF0aWMgdm9pZCBzdHJjYXRjKGNoYXIgKnN0ciwgY2hhciBjKQoreworCWludCBsZW4gPSBzdHJsZW4oc3RyKTsKKwlzdHJbbGVuKytdID0gYzsKKwlzdHJbbGVuXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50ZnMoY2hhciAqcGZvcm1hdCwgY29uc3QgY2hhciAqbXNnKQoreworCXN0cmNhdGMocGZvcm1hdCwgJ3MnKTsKKwlwcmludGYocGZvcm1hdCwgbXNnKTsKK30KKworLyogcHJpbnQgc3RhdGZzIGluZm8gKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBwcmludF9zdGF0ZnMoY2hhciAqcGZvcm1hdCwgY29uc3QgY2hhciBtLAorCQljb25zdCBjaGFyICpjb25zdCBmaWxlbmFtZSwgY29uc3Qgdm9pZCAqZGF0YQorCQlJRl9TRUxJTlVYKCwgc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0KSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3RhdGZzICpzdGF0ZnNidWYgPSBkYXRhOworCWlmIChtID09ICduJykgeworCQlwcmludGZzKHBmb3JtYXQsIGZpbGVuYW1lKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2knKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx4Iik7CisJCXByaW50ZihwZm9ybWF0LCBnZXRfZl9mc2lkKHN0YXRmc2J1ZikpOworCX0gZWxzZSBpZiAobSA9PSAnbCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIHN0YXRmc2J1Zi0+Zl9uYW1lbGVuKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ3QnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHgiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBzdGF0ZnNidWYtPmZfdHlwZSk7IC8qIG5vIGVxdWl2ICovCisJfSBlbHNlIGlmIChtID09ICdUJykgeworCQlwcmludGZzKHBmb3JtYXQsIGh1bWFuX2ZzdHlwZShzdGF0ZnNidWYtPmZfdHlwZSkpOworCX0gZWxzZSBpZiAobSA9PSAnYicpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi0+Zl9ibG9ja3MpOworCX0gZWxzZSBpZiAobSA9PSAnZicpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi0+Zl9iZnJlZSk7CisJfSBlbHNlIGlmIChtID09ICdhJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLT5mX2JhdmFpbCk7CisJfSBlbHNlIGlmIChtID09ICdzJyB8fCBtID09ICdTJykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGZzYnVmLT5mX2JzaXplKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2MnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYtPmZfZmlsZXMpOworCX0gZWxzZSBpZiAobSA9PSAnZCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi0+Zl9mZnJlZSk7CisjIGlmIEVOQUJMRV9TRUxJTlVYCisJfSBlbHNlIGlmIChtID09ICdDJyAmJiAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYKSkgeworCQlwcmludGZzKHBmb3JtYXQsIHNjb250ZXh0KTsKKyMgZW5kaWYKKwl9IGVsc2UgeworCQlzdHJjYXRjKHBmb3JtYXQsICdjJyk7CisJCXByaW50ZihwZm9ybWF0LCBtKTsKKwl9Cit9CisKKy8qIHByaW50IHN0YXQgaW5mbyAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIHByaW50X3N0YXQoY2hhciAqcGZvcm1hdCwgY29uc3QgY2hhciBtLAorCQljb25zdCBjaGFyICpjb25zdCBmaWxlbmFtZSwgY29uc3Qgdm9pZCAqZGF0YQorCQlJRl9TRUxJTlVYKCwgc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0KSkKK3sKKyNkZWZpbmUgVFlQRV9TSUdORUQodCkgKCEgKCh0KSAwIDwgKHQpIC0xKSkKKwlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiA9IChzdHJ1Y3Qgc3RhdCAqKSBkYXRhOworCXN0cnVjdCBwYXNzd2QgKnB3X2VudDsKKwlzdHJ1Y3QgZ3JvdXAgKmd3X2VudDsKKworCWlmIChtID09ICduJykgeworCQlwcmludGZzKHBmb3JtYXQsIGZpbGVuYW1lKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ04nKSB7CisJCXN0cmNhdGMocGZvcm1hdCwgJ3MnKTsKKwkJaWYgKFNfSVNMTksoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJCWNoYXIgKmxpbmtuYW1lID0geG1hbGxvY19yZWFkbGlua19vcl93YXJuKGZpbGVuYW1lKTsKKwkJCWlmIChsaW5rbmFtZSA9PSBOVUxMKQorCQkJCXJldHVybjsKKwkJCXByaW50ZigiJyVzJyAtPiAnJXMnIiwgZmlsZW5hbWUsIGxpbmtuYW1lKTsKKwkJCWZyZWUobGlua25hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKHBmb3JtYXQsIGZpbGVuYW1lKTsKKwkJfQorCX0gZWxzZSBpZiAobSA9PSAnZCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYtPnN0X2Rldik7CisJfSBlbHNlIGlmIChtID09ICdEJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxseCIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi0+c3RfZGV2KTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2knKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLT5zdF9pbm8pOworCX0gZWxzZSBpZiAobSA9PSAnYScpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbyIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIChzdGF0YnVmLT5zdF9tb2RlICYgKFNfSVNVSUR8U19JU0dJRHxTX0lTVlRYfFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKSkpOworCX0gZWxzZSBpZiAobSA9PSAnQScpIHsKKwkJcHJpbnRmcyhwZm9ybWF0LCBiYl9tb2RlX3N0cmluZyhzdGF0YnVmLT5zdF9tb2RlKSk7CisJfSBlbHNlIGlmIChtID09ICdmJykgeworCQlzdHJjYXQocGZvcm1hdCwgImx4Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi0+c3RfbW9kZSk7CisJfSBlbHNlIGlmIChtID09ICdGJykgeworCQlwcmludGZzKHBmb3JtYXQsIGZpbGVfdHlwZShzdGF0YnVmKSk7CisJfSBlbHNlIGlmIChtID09ICdoJykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi0+c3RfbmxpbmspOworCX0gZWxzZSBpZiAobSA9PSAndScpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYtPnN0X3VpZCk7CisJfSBlbHNlIGlmIChtID09ICdVJykgeworCQlwd19lbnQgPSBnZXRwd3VpZChzdGF0YnVmLT5zdF91aWQpOworCQlwcmludGZzKHBmb3JtYXQsIChwd19lbnQgIT0gTlVMTCkgPyBwd19lbnQtPnB3X25hbWUgOiAiVU5LTk9XTiIpOworCX0gZWxzZSBpZiAobSA9PSAnZycpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYtPnN0X2dpZCk7CisJfSBlbHNlIGlmIChtID09ICdHJykgeworCQlnd19lbnQgPSBnZXRncmdpZChzdGF0YnVmLT5zdF9naWQpOworCQlwcmludGZzKHBmb3JtYXQsIChnd19lbnQgIT0gTlVMTCkgPyBnd19lbnQtPmdyX25hbWUgOiAiVU5LTk9XTiIpOworCX0gZWxzZSBpZiAobSA9PSAndCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJseCIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIG1ham9yKHN0YXRidWYtPnN0X3JkZXYpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ1QnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHgiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBtaW5vcihzdGF0YnVmLT5zdF9yZGV2KSk7CisJfSBlbHNlIGlmIChtID09ICdzJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi0+c3Rfc2l6ZSk7CisJfSBlbHNlIGlmIChtID09ICdCJykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgNTEyKTsgLy9TVF9OQkxPQ0tTSVpFCisJfSBlbHNlIGlmIChtID09ICdiJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi0+c3RfYmxvY2tzKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ28nKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLT5zdF9ibGtzaXplKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ3gnKSB7CisJCXByaW50ZnMocGZvcm1hdCwgaHVtYW5fdGltZShzdGF0YnVmLT5zdF9hdGltZSkpOworCX0gZWxzZSBpZiAobSA9PSAnWCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsIFRZUEVfU0lHTkVEKHRpbWVfdCkgPyAibGQiIDogImx1Iik7CisJCS8qIG5vdGU6ICh1bnNpZ25lZCBsb25nKSB3b3VsZCBiZSB3cm9uZzoKKwkJICogaW1hZ2luZSAodW5zaWduZWQgbG9uZzY0KWludDMyICovCisJCXByaW50ZihwZm9ybWF0LCAobG9uZykgc3RhdGJ1Zi0+c3RfYXRpbWUpOworCX0gZWxzZSBpZiAobSA9PSAneScpIHsKKwkJcHJpbnRmcyhwZm9ybWF0LCBodW1hbl90aW1lKHN0YXRidWYtPnN0X210aW1lKSk7CisJfSBlbHNlIGlmIChtID09ICdZJykgeworCQlzdHJjYXQocGZvcm1hdCwgVFlQRV9TSUdORUQodGltZV90KSA/ICJsZCIgOiAibHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsIChsb25nKSBzdGF0YnVmLT5zdF9tdGltZSk7CisJfSBlbHNlIGlmIChtID09ICd6JykgeworCQlwcmludGZzKHBmb3JtYXQsIGh1bWFuX3RpbWUoc3RhdGJ1Zi0+c3RfY3RpbWUpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ1onKSB7CisJCXN0cmNhdChwZm9ybWF0LCBUWVBFX1NJR05FRCh0aW1lX3QpID8gImxkIiA6ICJsdSIpOworCQlwcmludGYocGZvcm1hdCwgKGxvbmcpIHN0YXRidWYtPnN0X2N0aW1lKTsKKyMgaWYgRU5BQkxFX1NFTElOVVgKKwl9IGVsc2UgaWYgKG0gPT0gJ0MnICYmIChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVgpKSB7CisJCXByaW50ZnMocGZvcm1hdCwgc2NvbnRleHQpOworIyBlbmRpZgorCX0gZWxzZSB7CisJCXN0cmNhdGMocGZvcm1hdCwgJ2MnKTsKKwkJcHJpbnRmKHBmb3JtYXQsIG0pOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfaXQoY29uc3QgY2hhciAqbWFzdGVyZm9ybWF0LAorCQljb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJdm9pZCBGQVNUX0ZVTkMgKCpwcmludF9mdW5jKShjaGFyKiwgY2hhciwgY29uc3QgY2hhciosIGNvbnN0IHZvaWQqIElGX1NFTElOVVgoLCBzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpKSwKKwkJY29uc3Qgdm9pZCAqZGF0YQorCQlJRl9TRUxJTlVYKCwgc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0KSkKK3sKKwkvKiBDcmVhdGUgYSB3b3JraW5nIGNvcHkgb2YgdGhlIGZvcm1hdCBzdHJpbmcgKi8KKwljaGFyICpmb3JtYXQgPSB4c3RyZHVwKG1hc3RlcmZvcm1hdCk7CisJLyogQWRkIDIgdG8gYWNjb21vZGF0ZSBvdXIgY29udmVyc2lvbiBvZiB0aGUgc3RhdCAnJXMnIGZvcm1hdCBzdHJpbmcKKwkgKiB0byB0aGUgcHJpbnRmICclbGx1JyBvbmUuICAqLworCWNoYXIgKmRlc3QgPSB4bWFsbG9jKHN0cmxlbihmb3JtYXQpICsgMiArIDEpOworCWNoYXIgKmI7CisKKwliID0gZm9ybWF0OworCXdoaWxlIChiKSB7CisJCS8qIEVhY2ggaXRlcmF0aW9uIGZpbmRzIG5leHQgJXNwZWMsCisJCSAqIHByaW50cyBwcmVjZWRpbmcgc3RyaW5nIGFuZCBoYW5kbGVzIGZvdW5kICVzcGVjCisJCSAqLworCQlzaXplX3QgbGVuOworCQljaGFyICpwID0gc3RyY2hyKGIsICclJyk7CisJCWlmICghcCkgeworCQkJLyogY29yZXV0aWxzIDYuMyBhbHdheXMgcHJpbnRzIG5ld2xpbmUgYXQgdGhlIGVuZCAqLworCQkJLypmcHV0cyhiLCBzdGRvdXQpOyovCisJCQlwdXRzKGIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBkZXN0ID0gIiU8bW9kaWZpZXJzPiIgKi8KKwkJbGVuID0gMSArIHN0cnNwbihwICsgMSwgIiMtKy5JIDAxMjM0NTY3ODkiKTsKKwkJbWVtY3B5KGRlc3QsIHAsIGxlbik7CisJCWRlc3RbbGVuXSA9ICdcMCc7CisKKwkJLyogcHJpbnQgcHJlY2VkaW5nIHN0cmluZyAqLworCQkqcCA9ICdcMCc7CisJCWZwdXRzKGIsIHN0ZG91dCk7CisKKwkJcCArPSBsZW47CisJCWIgPSBwICsgMTsKKwkJc3dpdGNoICgqcCkgeworCQljYXNlICdcMCc6CisJCQliID0gTlVMTDsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlICclJzoKKwkJCWJiX3B1dGNoYXIoJyUnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogQ29tcGxldGVzICIlPG1vZGlmaWVycz4iIHdpdGggc3BlY2lmaWVyIGFuZCBwcmludGZzICovCisJCQlwcmludF9mdW5jKGRlc3QsICpwLCBmaWxlbmFtZSwgZGF0YSBJRl9TRUxJTlVYKCxzY29udGV4dCkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmcmVlKGZvcm1hdCk7CisJZnJlZShkZXN0KTsKK30KKyNlbmRpZiAgLyogRkVBVFVSRV9TVEFUX0ZPUk1BVCAqLworCisvKiBTdGF0IHRoZSBmaWxlIHN5c3RlbSBhbmQgcHJpbnQgd2hhdCB3ZSBmaW5kLiAgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKKyNkZWZpbmUgZG9fc3RhdGZzKGZpbGVuYW1lLCBmb3JtYXQpIGRvX3N0YXRmcyhmaWxlbmFtZSkKKyNlbmRpZgorc3RhdGljIGJvb2wgZG9fc3RhdGZzKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpmb3JtYXQpCit7CisJc3RydWN0IHN0YXRmcyBzdGF0ZnNidWY7CisjaWYgIUVOQUJMRV9GRUFUVVJFX1NUQVRfRk9STUFUCisJY29uc3QgY2hhciAqZm9ybWF0OworI2VuZGlmCisjaWYgRU5BQkxFX1NFTElOVVgKKwlzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQgPSBOVUxMOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCkgeworCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfREVSRUZFUkVOQ0UKKwkJICAgICA/IGxnZXRmaWxlY29uKGZpbGVuYW1lLCAmc2NvbnRleHQpCisJCSAgICAgOiBnZXRmaWxlY29uKGZpbGVuYW1lLCAmc2NvbnRleHQpCisJCSAgICApIDwgMAorCQkpIHsKKwkJCWJiX3BlcnJvcl9tc2coZmlsZW5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoc3RhdGZzKGZpbGVuYW1lLCAmc3RhdGZzYnVmKSAhPSAwKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlYWQgZmlsZSBzeXN0ZW0gaW5mb3JtYXRpb24gZm9yICclcyciLCBmaWxlbmFtZSk7CisJCXJldHVybiAwOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NUQVRfRk9STUFUCisJaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisjIGlmICFFTkFCTEVfU0VMSU5VWAorCQlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRQorCQkJPyAiJW4gJWkgJWwgJXQgJXMgJWIgJWYgJWEgJWMgJWRcbiIKKwkJCTogIiAgRmlsZTogXCIlblwiXG4iCisJCQkgICIgICAgSUQ6ICUtOGkgTmFtZWxlbjogJS03bCBUeXBlOiAlVFxuIgorCQkJICAiQmxvY2sgc2l6ZTogJS0xMHNcbiIKKwkJCSAgIkJsb2NrczogVG90YWw6ICUtMTBiIEZyZWU6ICUtMTBmIEF2YWlsYWJsZTogJWFcbiIKKwkJCSAgIklub2RlczogVG90YWw6ICUtMTBjIEZyZWU6ICVkIik7CisjIGVsc2UKKwkJZm9ybWF0ID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UKKwkJCT8gKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCA/ICIlbiAlaSAlbCAldCAlcyAlYiAlZiAlYSAlYyAlZCAlQ1xuIjoKKwkJCSIlbiAlaSAlbCAldCAlcyAlYiAlZiAlYSAlYyAlZFxuIikKKwkJCTogKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCA/CisJCQkiICBGaWxlOiBcIiVuXCJcbiIKKwkJCSIgICAgSUQ6ICUtOGkgTmFtZWxlbjogJS03bCBUeXBlOiAlVFxuIgorCQkJIkJsb2NrIHNpemU6ICUtMTBzXG4iCisJCQkiQmxvY2tzOiBUb3RhbDogJS0xMGIgRnJlZTogJS0xMGYgQXZhaWxhYmxlOiAlYVxuIgorCQkJIklub2RlczogVG90YWw6ICUtMTBjIEZyZWU6ICVkIgorCQkJIiAgU19jb250ZXh0OiAlQ1xuIjoKKwkJCSIgIEZpbGU6IFwiJW5cIlxuIgorCQkJIiAgICBJRDogJS04aSBOYW1lbGVuOiAlLTdsIFR5cGU6ICVUXG4iCisJCQkiQmxvY2sgc2l6ZTogJS0xMHNcbiIKKwkJCSJCbG9ja3M6IFRvdGFsOiAlLTEwYiBGcmVlOiAlLTEwZiBBdmFpbGFibGU6ICVhXG4iCisJCQkiSW5vZGVzOiBUb3RhbDogJS0xMGMgRnJlZTogJWRcbiIpCisJCQkpOworIyBlbmRpZiAvKiBTRUxJTlVYICovCisJfQorCXByaW50X2l0KGZvcm1hdCwgZmlsZW5hbWUsIHByaW50X3N0YXRmcywgJnN0YXRmc2J1ZiBJRl9TRUxJTlVYKCwgc2NvbnRleHQpKTsKKyNlbHNlIC8qIEZFQVRVUkVfU1RBVF9GT1JNQVQgKi8KKwlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRQorCQk/ICIlcyAlbGx4ICVsdSAiCisJCTogIiAgRmlsZTogXCIlc1wiXG4iCisJCSAgIiAgICBJRDogJS04bGx4IE5hbWVsZW46ICUtN2x1ICIpOworCXByaW50Zihmb3JtYXQsCisJICAgICAgIGZpbGVuYW1lLAorCSAgICAgICBnZXRfZl9mc2lkKCZzdGF0ZnNidWYpLAorCSAgICAgICBzdGF0ZnNidWYuZl9uYW1lbGVuKTsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFKQorCQlwcmludGYoIiVseCAiLCAodW5zaWduZWQgbG9uZykgc3RhdGZzYnVmLmZfdHlwZSk7CisJZWxzZQorCQlwcmludGYoIlR5cGU6ICVzXG4iLCBodW1hbl9mc3R5cGUoc3RhdGZzYnVmLmZfdHlwZSkpOworCisjIGlmICFFTkFCTEVfU0VMSU5VWAorCWZvcm1hdCA9IChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFCisJCT8gIiVsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIKKwkJOiAiQmxvY2sgc2l6ZTogJS0xMGx1XG4iCisJCSAgIkJsb2NrczogVG90YWw6ICUtMTBsbHUgRnJlZTogJS0xMGxsdSBBdmFpbGFibGU6ICVsbHVcbiIKKwkJICAiSW5vZGVzOiBUb3RhbDogJS0xMGxsdSBGcmVlOiAlbGx1XG4iKTsKKwlwcmludGYoZm9ybWF0LAorCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGZzYnVmLmZfYnNpemUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2Jsb2NrcywKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfYmZyZWUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2JhdmFpbCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfZmlsZXMsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2ZmcmVlKTsKKyMgZWxzZQorCWZvcm1hdCA9IChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFCisJCT8gKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCA/ICIlbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVDXG4iIDogIiVsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIpCisJCTogKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWAorCQkJPwkiQmxvY2sgc2l6ZTogJS0xMGx1XG4iCisJCQkJIkJsb2NrczogVG90YWw6ICUtMTBsbHUgRnJlZTogJS0xMGxsdSBBdmFpbGFibGU6ICVsbHVcbiIKKwkJCQkiSW5vZGVzOiBUb3RhbDogJS0xMGxsdSBGcmVlOiAlbGx1IgorCQkJCSJTX2NvbnRleHQ6ICVDXG4iCisJCQk6CSJCbG9jayBzaXplOiAlLTEwbHVcbiIKKwkJCQkiQmxvY2tzOiBUb3RhbDogJS0xMGxsdSBGcmVlOiAlLTEwbGx1IEF2YWlsYWJsZTogJWxsdVxuIgorCQkJCSJJbm9kZXM6IFRvdGFsOiAlLTEwbGx1IEZyZWU6ICVsbHVcbiIKKwkJCSkKKwkJKTsKKwlwcmludGYoZm9ybWF0LAorCQkodW5zaWduZWQgbG9uZykgc3RhdGZzYnVmLmZfYnNpemUsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2Jsb2NrcywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfYmZyZWUsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2JhdmFpbCwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfZmlsZXMsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2ZmcmVlLAorCQlzY29udGV4dCk7CisKKwlpZiAoc2NvbnRleHQpCisJCWZyZWVjb24oc2NvbnRleHQpOworIyBlbmRpZgorI2VuZGlmICAvKiBGRUFUVVJFX1NUQVRfRk9STUFUICovCisJcmV0dXJuIDE7Cit9CisKKy8qIHN0YXQgdGhlIGZpbGUgYW5kIHByaW50IHdoYXQgd2UgZmluZCAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9TVEFUX0ZPUk1BVAorI2RlZmluZSBkb19zdGF0KGZpbGVuYW1lLCBmb3JtYXQpIGRvX3N0YXQoZmlsZW5hbWUpCisjZW5kaWYKK3N0YXRpYyBib29sIGRvX3N0YXQoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmZvcm1hdCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworI2lmIEVOQUJMRV9TRUxJTlVYCisJc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0ID0gTlVMTDsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVgpIHsKKwkJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX0RFUkVGRVJFTkNFCisJCSAgICAgPyBsZ2V0ZmlsZWNvbihmaWxlbmFtZSwgJnNjb250ZXh0KQorCQkgICAgIDogZ2V0ZmlsZWNvbihmaWxlbmFtZSwgJnNjb250ZXh0KQorCQkgICAgKSA8IDAKKwkJKSB7CisJCQliYl9wZXJyb3JfbXNnKGZpbGVuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX0RFUkVGRVJFTkNFID8gc3RhdCA6IGxzdGF0KSAoZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKKwlpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyMgaWYgIUVOQUJMRV9TRUxJTlVYCisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFKSB7CisJCQlmb3JtYXQgPSAiJW4gJXMgJWIgJWYgJXUgJWcgJUQgJWkgJWggJXQgJVQgJVggJVkgJVogJW8iOworCQl9IGVsc2UgeworCQkJaWYgKFNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSB8fCBTX0lTQ0hSKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJCQlmb3JtYXQgPQorCQkJCQkiICBGaWxlOiAlTlxuIgorCQkJCQkiICBTaXplOiAlLTEwc1x0QmxvY2tzOiAlLTEwYiBJTyBCbG9jazogJS02byAlRlxuIgorCQkJCQkiRGV2aWNlOiAlRGgvJWRkXHRJbm9kZTogJS0xMGkgIExpbmtzOiAlLTVoIgorCQkJCQkiIERldmljZSB0eXBlOiAldCwlVFxuIgorCQkJCQkiQWNjZXNzOiAoJTA0YS8lMTAuMTBBKSAgVWlkOiAoJTV1LyU4VSkgICBHaWQ6ICglNWcvJThHKVxuIgorCQkJCQkiQWNjZXNzOiAleFxuIiAiTW9kaWZ5OiAleVxuIiAiQ2hhbmdlOiAlelxuIjsKKwkJCX0gZWxzZSB7CisJCQkJZm9ybWF0ID0KKwkJCQkJIiAgRmlsZTogJU5cbiIKKwkJCQkJIiAgU2l6ZTogJS0xMHNcdEJsb2NrczogJS0xMGIgSU8gQmxvY2s6ICUtNm8gJUZcbiIKKwkJCQkJIkRldmljZTogJURoLyVkZFx0SW5vZGU6ICUtMTBpICBMaW5rczogJWhcbiIKKwkJCQkJIkFjY2VzczogKCUwNGEvJTEwLjEwQSkgIFVpZDogKCU1dS8lOFUpICAgR2lkOiAoJTVnLyU4RylcbiIKKwkJCQkJIkFjY2VzczogJXhcbiIgIk1vZGlmeTogJXlcbiIgIkNoYW5nZTogJXpcbiI7CisJCQl9CisJCX0KKyMgZWxzZQorCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRSkgeworCQkJZm9ybWF0ID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCA/CisJCQkJICAiJW4gJXMgJWIgJWYgJXUgJWcgJUQgJWkgJWggJXQgJVQgJVggJVkgJVogJW8gJUNcbiI6CisJCQkJICAiJW4gJXMgJWIgJWYgJXUgJWcgJUQgJWkgJWggJXQgJVQgJVggJVkgJVogJW9cbiIpOworCQl9IGVsc2UgeworCQkJaWYgKFNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSB8fCBTX0lTQ0hSKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJCQlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYID8KKwkJCQkJICAiICBGaWxlOiAlTlxuIgorCQkJCQkgICIgIFNpemU6ICUtMTBzXHRCbG9ja3M6ICUtMTBiIElPIEJsb2NrOiAlLTZvICVGXG4iCisJCQkJCSAgIkRldmljZTogJURoLyVkZFx0SW5vZGU6ICUtMTBpICBMaW5rczogJS01aCIKKwkJCQkJICAiIERldmljZSB0eXBlOiAldCwlVFxuIgorCQkJCQkgICJBY2Nlc3M6ICglMDRhLyUxMC4xMEEpICBVaWQ6ICglNXUvJThVKSAgIEdpZDogKCU1Zy8lOEcpXG4iCisJCQkJCSAgIiAgIFNfQ29udGV4dDogJUNcbiIKKwkJCQkJICAiQWNjZXNzOiAleFxuIiAiTW9kaWZ5OiAleVxuIiAiQ2hhbmdlOiAlelxuIjoKKwkJCQkJICAiICBGaWxlOiAlTlxuIgorCQkJCQkgICIgIFNpemU6ICUtMTBzXHRCbG9ja3M6ICUtMTBiIElPIEJsb2NrOiAlLTZvICVGXG4iCisJCQkJCSAgIkRldmljZTogJURoLyVkZFx0SW5vZGU6ICUtMTBpICBMaW5rczogJS01aCIKKwkJCQkJICAiIERldmljZSB0eXBlOiAldCwlVFxuIgorCQkJCQkgICJBY2Nlc3M6ICglMDRhLyUxMC4xMEEpICBVaWQ6ICglNXUvJThVKSAgIEdpZDogKCU1Zy8lOEcpXG4iCisJCQkJCSAgIkFjY2VzczogJXhcbiIgIk1vZGlmeTogJXlcbiIgIkNoYW5nZTogJXpcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYID8KKwkJCQkJICAiICBGaWxlOiAlTlxuIgorCQkJCQkgICIgIFNpemU6ICUtMTBzXHRCbG9ja3M6ICUtMTBiIElPIEJsb2NrOiAlLTZvICVGXG4iCisJCQkJCSAgIkRldmljZTogJURoLyVkZFx0SW5vZGU6ICUtMTBpICBMaW5rczogJWhcbiIKKwkJCQkJICAiQWNjZXNzOiAoJTA0YS8lMTAuMTBBKSAgVWlkOiAoJTV1LyU4VSkgICBHaWQ6ICglNWcvJThHKVxuIgorCQkJCQkgICJTX0NvbnRleHQ6ICVDXG4iCisJCQkJCSAgIkFjY2VzczogJXhcbiIgIk1vZGlmeTogJXlcbiIgIkNoYW5nZTogJXpcbiI6CisJCQkJCSAgIiAgRmlsZTogJU5cbiIKKwkJCQkJICAiICBTaXplOiAlLTEwc1x0QmxvY2tzOiAlLTEwYiBJTyBCbG9jazogJS02byAlRlxuIgorCQkJCQkgICJEZXZpY2U6ICVEaC8lZGRcdElub2RlOiAlLTEwaSAgTGlua3M6ICVoXG4iCisJCQkJCSAgIkFjY2VzczogKCUwNGEvJTEwLjEwQSkgIFVpZDogKCU1dS8lOFUpICAgR2lkOiAoJTVnLyU4RylcbiIKKwkJCQkJICAiQWNjZXNzOiAleFxuIiAiTW9kaWZ5OiAleVxuIiAiQ2hhbmdlOiAlelxuIik7CisJCQl9CisJCX0KKyMgZW5kaWYKKwl9CisJcHJpbnRfaXQoZm9ybWF0LCBmaWxlbmFtZSwgcHJpbnRfc3RhdCwgJnN0YXRidWYgSUZfU0VMSU5VWCgsIHNjb250ZXh0KSk7CisjZWxzZQkvKiBGRUFUVVJFX1NUQVRfRk9STUFUICovCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UpIHsKKwkJcHJpbnRmKCIlcyAlbGx1ICVsbHUgJWx4ICVsdSAlbHUgJWxseCAlbGx1ICVsdSAlbHggJWx4ICVsdSAlbHUgJWx1ICVsdSIKKwkJICAgICAgIElGX05PVF9TRUxJTlVYKCJcbiIpLAorCQkgICAgICAgZmlsZW5hbWUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLnN0X3NpemUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLnN0X2Jsb2NrcywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X21vZGUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF91aWQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9naWQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLnN0X2RldiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3RfaW5vLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfbmxpbmssCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgbWFqb3Ioc3RhdGJ1Zi5zdF9yZGV2KSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBtaW5vcihzdGF0YnVmLnN0X3JkZXYpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfYXRpbWUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9tdGltZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X2N0aW1lLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfYmxrc2l6ZQorCQkpOworIyBpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYKQorCQkJcHJpbnRmKCIgJWxjXG4iLCAqc2NvbnRleHQpOworCQllbHNlCisJCQliYl9wdXRjaGFyKCdcbicpOworIyBlbmRpZgorCX0gZWxzZSB7CisJCWNoYXIgKmxpbmtuYW1lID0gTlVMTDsKKwkJc3RydWN0IHBhc3N3ZCAqcHdfZW50OworCQlzdHJ1Y3QgZ3JvdXAgKmd3X2VudDsKKworCQlnd19lbnQgPSBnZXRncmdpZChzdGF0YnVmLnN0X2dpZCk7CisJCXB3X2VudCA9IGdldHB3dWlkKHN0YXRidWYuc3RfdWlkKTsKKworCQlpZiAoU19JU0xOSyhzdGF0YnVmLnN0X21vZGUpKQorCQkJbGlua25hbWUgPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oZmlsZW5hbWUpOworCQlpZiAobGlua25hbWUpIHsKKwkJCXByaW50ZigiICBGaWxlOiAnJXMnIC0+ICclcydcbiIsIGZpbGVuYW1lLCBsaW5rbmFtZSk7CisJCQlmcmVlKGxpbmtuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiICBGaWxlOiAnJXMnXG4iLCBmaWxlbmFtZSk7CisJCX0KKworCQlwcmludGYoIiAgU2l6ZTogJS0xMGxsdVx0QmxvY2tzOiAlLTEwbGx1IElPIEJsb2NrOiAlLTZsdSAlc1xuIgorCQkgICAgICAgIkRldmljZTogJWxseGgvJWxsdWRcdElub2RlOiAlLTEwbGx1ICBMaW5rczogJS01bHUiLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9zaXplLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9ibG9ja3MsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9ibGtzaXplLAorCQkgICAgICAgZmlsZV90eXBlKCZzdGF0YnVmKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3RfZGV2LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9kZXYsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLnN0X2lubywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X25saW5rKTsKKwkJaWYgKFNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSB8fCBTX0lTQ0hSKHN0YXRidWYuc3RfbW9kZSkpCisJCQlwcmludGYoIiBEZXZpY2UgdHlwZTogJWx4LCVseFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgbWFqb3Ioc3RhdGJ1Zi5zdF9yZGV2KSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgbWlub3Ioc3RhdGJ1Zi5zdF9yZGV2KSk7CisJCWVsc2UKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCXByaW50ZigiQWNjZXNzOiAoJTA0bG8vJTEwLjEwcykgIFVpZDogKCU1bHUvJThzKSAgIEdpZDogKCU1bHUvJThzKVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoc3RhdGJ1Zi5zdF9tb2RlICYgKFNfSVNVSUR8U19JU0dJRHxTX0lTVlRYfFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKSksCisJCSAgICAgICBiYl9tb2RlX3N0cmluZyhzdGF0YnVmLnN0X21vZGUpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfdWlkLAorCQkgICAgICAgKHB3X2VudCAhPSBOVUxMKSA/IHB3X2VudC0+cHdfbmFtZSA6ICJVTktOT1dOIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X2dpZCwKKwkJICAgICAgIChnd19lbnQgIT0gTlVMTCkgPyBnd19lbnQtPmdyX25hbWUgOiAiVU5LTk9XTiIpOworIyBpZiBFTkFCTEVfU0VMSU5VWAorCQlwcmludGYoIiAgIFNfQ29udGV4dDogJWxjXG4iLCAqc2NvbnRleHQpOworIyBlbmRpZgorCQlwcmludGYoIkFjY2VzczogJXNcbiIsIGh1bWFuX3RpbWUoc3RhdGJ1Zi5zdF9hdGltZSkpOworCQlwcmludGYoIk1vZGlmeTogJXNcbiIsIGh1bWFuX3RpbWUoc3RhdGJ1Zi5zdF9tdGltZSkpOworCQlwcmludGYoIkNoYW5nZTogJXNcbiIsIGh1bWFuX3RpbWUoc3RhdGJ1Zi5zdF9jdGltZSkpOworCX0KKyNlbmRpZiAgLyogRkVBVFVSRV9TVEFUX0ZPUk1BVCAqLworCXJldHVybiAxOworfQorCitpbnQgc3RhdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3RhdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJSUZfRkVBVFVSRV9TVEFUX0ZPUk1BVChjaGFyICpmb3JtYXQgPSBOVUxMOykKKwlpbnQgaTsKKwlpbnQgb2s7CisJdW5zaWduZWQgb3B0czsKKwlzdGF0ZnVuY19wdHIgc3RhdGZ1bmMgPSBkb19zdGF0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBtaW4gb25lIGFyZyAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZnRMIgorCQlJRl9TRUxJTlVYKCJaIikKKwkJSUZfRkVBVFVSRV9TVEFUX0ZPUk1BVCgiYzoiLCAmZm9ybWF0KQorCSk7CisJaWYgKG9wdHMgJiBPUFRfRklMRVNZUykgLyogLWYgKi8KKwkJc3RhdGZ1bmMgPSBkb19zdGF0ZnM7CisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAob3B0cyAmIE9QVF9TRUxJTlVYKSB7CisJCXNlbGludXhfb3JfZGllKCk7CisJfQorI2VuZGlmCisJb2sgPSAxOworCWFyZ3YgKz0gb3B0aW5kOworCWZvciAoaSA9IDA7IGFyZ3ZbaV07ICsraSkKKwkJb2sgJj0gc3RhdGZ1bmMoYXJndltpXSBJRl9GRUFUVVJFX1NUQVRfRk9STUFUKCwgZm9ybWF0KSk7CisKKwlyZXR1cm4gKG9rID8gRVhJVF9TVUNDRVNTIDogRVhJVF9GQUlMVVJFKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy9zdHR5LmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc3R0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDU3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc3R0eS5jCkBAIC0wLDAgKzEsMTU1NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBzdHR5IC0tIGNoYW5nZSBhbmQgcHJpbnQgdGVybWluYWwgbGluZSBzZXR0aW5ncworICAgQ29weXJpZ2h0IChDKSAxOTkwLTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworLyogVXNhZ2U6IHN0dHkgWy1hZ10gWy1GIGRldmljZV0gW3NldHRpbmcuLi5dCisKKyAgIE9wdGlvbnM6CisgICAtYSBXcml0ZSBhbGwgY3VycmVudCBzZXR0aW5ncyB0byBzdGRvdXQgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4KKyAgIC1nIFdyaXRlIGFsbCBjdXJyZW50IHNldHRpbmdzIHRvIHN0ZG91dCBpbiBzdHR5LXJlYWRhYmxlIGZvcm0uCisgICAtRiBPcGVuIGFuZCB1c2UgdGhlIHNwZWNpZmllZCBkZXZpY2UgaW5zdGVhZCBvZiBzdGRpbgorCisgICBJZiBubyBhcmdzIGFyZSBnaXZlbiwgd3JpdGUgdG8gc3Rkb3V0IHRoZSBiYXVkIHJhdGUgYW5kIHNldHRpbmdzIHRoYXQKKyAgIGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20gdGhlaXIgZGVmYXVsdHMuICBNb2RlIHJlYWRpbmcgYW5kIGNoYW5nZXMKKyAgIGFyZSBkb25lIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlLCBvciBzdGRpbiBpZiBub25lIHdhcyBzcGVjaWZpZWQuCisKKyAgIERhdmlkIE1hY0tlbnppZSA8ZGptQGdudS5haS5taXQuZWR1PgorCisgICBTcGVjaWFsIGZvciBidXN5Ym94IHBvcnRlZCBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IDIwMDEKKworICAgKi8KKworLy91c2FnZTojZGVmaW5lIHN0dHlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYXxnXSBbLUYgREVWSUNFXSBbU0VUVElOR10uLi4iCisvL3VzYWdlOiNkZWZpbmUgc3R0eV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIldpdGhvdXQgYXJndW1lbnRzLCBwcmludHMgYmF1ZCByYXRlLCBsaW5lIGRpc2NpcGxpbmUsXG4iCisvL3VzYWdlOiAgICAgICAiYW5kIGRldmlhdGlvbnMgZnJvbSBzdHR5IHNhbmVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUYgREVWSUNFCU9wZW4gZGV2aWNlIGluc3RlYWQgb2Ygc3RkaW4iCisvL3VzYWdlOiAgICAgIlxuCS1hCQlQcmludCBhbGwgY3VycmVudCBzZXR0aW5ncyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtIgorLy91c2FnZTogICAgICJcbgktZwkJUHJpbnQgaW4gc3R0eS1yZWFkYWJsZSBmb3JtIgorLy91c2FnZTogICAgICJcbglbU0VUVElOR10JU2VlIG1hbnBhZ2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWZuZGVmIF9QT1NJWF9WRElTQUJMRQorIyBkZWZpbmUgX1BPU0lYX1ZESVNBQkxFICgodW5zaWduZWQgY2hhcikgMCkKKyNlbmRpZgorCisjZGVmaW5lIENvbnRyb2woYykgKChjKSAmIDB4MWYpCisvKiBDYW5vbmljYWwgdmFsdWVzIGZvciBjb250cm9sIGNoYXJhY3RlcnMgKi8KKyNpZm5kZWYgQ0lOVFIKKyMgZGVmaW5lIENJTlRSIENvbnRyb2woJ2MnKQorI2VuZGlmCisjaWZuZGVmIENRVUlUCisjIGRlZmluZSBDUVVJVCAyOAorI2VuZGlmCisjaWZuZGVmIENFUkFTRQorIyBkZWZpbmUgQ0VSQVNFIDEyNworI2VuZGlmCisjaWZuZGVmIENLSUxMCisjIGRlZmluZSBDS0lMTCBDb250cm9sKCd1JykKKyNlbmRpZgorI2lmbmRlZiBDRU9GCisjIGRlZmluZSBDRU9GIENvbnRyb2woJ2QnKQorI2VuZGlmCisjaWZuZGVmIENFT0wKKyMgZGVmaW5lIENFT0wgX1BPU0lYX1ZESVNBQkxFCisjZW5kaWYKKyNpZm5kZWYgQ1NUQVJUCisjIGRlZmluZSBDU1RBUlQgQ29udHJvbCgncScpCisjZW5kaWYKKyNpZm5kZWYgQ1NUT1AKKyMgZGVmaW5lIENTVE9QIENvbnRyb2woJ3MnKQorI2VuZGlmCisjaWZuZGVmIENTVVNQCisjIGRlZmluZSBDU1VTUCBDb250cm9sKCd6JykKKyNlbmRpZgorI2lmIGRlZmluZWQoVkVPTDIpICYmICFkZWZpbmVkKENFT0wyKQorIyBkZWZpbmUgQ0VPTDIgX1BPU0lYX1ZESVNBQkxFCisjZW5kaWYKKy8qIGdsaWJjLTIuMTIuMSB1c2VzIG9ubHkgVlNXVEMgbmFtZSAqLworI2lmIGRlZmluZWQoVlNXVEMpICYmICFkZWZpbmVkKFZTV1RDSCkKKyMgZGVmaW5lIFZTV1RDSCBWU1dUQworI2VuZGlmCisvKiBJU0MgcmVuYW1lZCBzd3RjaCB0byBzdXNwIGZvciB0ZXJtaW9zLCBidXQgd2UnbGwgYWNjZXB0IGVpdGhlciBuYW1lICovCisjaWYgZGVmaW5lZChWU1VTUCkgJiYgIWRlZmluZWQoVlNXVENIKQorIyBkZWZpbmUgVlNXVENIIFZTVVNQCisjIGRlZmluZSBDU1dUQ0ggQ1NVU1AKKyNlbmRpZgorI2lmIGRlZmluZWQoVlNXVENIKSAmJiAhZGVmaW5lZChDU1dUQ0gpCisjIGRlZmluZSBDU1dUQ0ggX1BPU0lYX1ZESVNBQkxFCisjZW5kaWYKKworLyogU3VuT1MgNS4zIGxvc2VzICheWiBkb2Vzbid0IHdvcmspIGlmICdzd3RjaCcgaXMgdGhlIHNhbWUgYXMgJ3N1c3AnLgorICAgU28gdGhlIGRlZmF1bHQgaXMgdG8gZGlzYWJsZSAnc3d0Y2guJyAgKi8KKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX3N2cjRfXykKKyMgdW5kZWYgQ1NXVENICisjIGRlZmluZSBDU1dUQ0ggX1BPU0lYX1ZESVNBQkxFCisjZW5kaWYKKworI2lmIGRlZmluZWQoVldFUlNFKSAmJiAhZGVmaW5lZChWV0VSQVNFKSAgICAgICAvKiBBSVgtMy4yLjUgKi8KKyMgZGVmaW5lIFZXRVJBU0UgVldFUlNFCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZEU1VTUCkgJiYgIWRlZmluZWQoQ0RTVVNQKQorIyBkZWZpbmUgQ0RTVVNQIENvbnRyb2woJ3knKQorI2VuZGlmCisjaWYgIWRlZmluZWQoVlJFUFJJTlQpICYmIGRlZmluZWQoVlJQUk5UKSAgICAgICAvKiBJcml4IDQuMC41ICovCisjIGRlZmluZSBWUkVQUklOVCBWUlBSTlQKKyNlbmRpZgorI2lmIGRlZmluZWQoVlJFUFJJTlQpICYmICFkZWZpbmVkKENSUFJOVCkKKyMgZGVmaW5lIENSUFJOVCBDb250cm9sKCdyJykKKyNlbmRpZgorI2lmIGRlZmluZWQoVldFUkFTRSkgJiYgIWRlZmluZWQoQ1dFUkFTRSkKKyMgZGVmaW5lIENXRVJBU0UgQ29udHJvbCgndycpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZMTkVYVCkgJiYgIWRlZmluZWQoQ0xORVhUKQorIyBkZWZpbmUgQ0xORVhUIENvbnRyb2woJ3YnKQorI2VuZGlmCisjaWYgZGVmaW5lZChWRElTQ0FSRCkgJiYgIWRlZmluZWQoVkZMVVNITykKKyMgZGVmaW5lIFZGTFVTSE8gVkRJU0NBUkQKKyNlbmRpZgorI2lmIGRlZmluZWQoVkZMVVNIKSAmJiAhZGVmaW5lZChWRkxVU0hPKSAgICAgICAgLyogVWx0cml4IDQuMiAqLworIyBkZWZpbmUgVkZMVVNITyBWRkxVU0gKKyNlbmRpZgorI2lmIGRlZmluZWQoQ1RMRUNIKSAmJiAhZGVmaW5lZChFQ0hPQ1RMKSAgICAgICAgLyogVWx0cml4IDQuMyAqLworIyBkZWZpbmUgRUNIT0NUTCBDVExFQ0gKKyNlbmRpZgorI2lmIGRlZmluZWQoVENUTEVDSCkgJiYgIWRlZmluZWQoRUNIT0NUTCkgICAgICAgLyogVWx0cml4IDQuMiAqLworIyBkZWZpbmUgRUNIT0NUTCBUQ1RMRUNICisjZW5kaWYKKyNpZiBkZWZpbmVkKENSVEtJTCkgJiYgIWRlZmluZWQoRUNIT0tFKSAgICAgICAgIC8qIFVsdHJpeCA0LjIgYW5kIDQuMyAqLworIyBkZWZpbmUgRUNIT0tFIENSVEtJTAorI2VuZGlmCisjaWYgZGVmaW5lZChWRkxVU0hPKSAmJiAhZGVmaW5lZChDRkxVU0hPKQorIyBkZWZpbmUgQ0ZMVVNITyBDb250cm9sKCdvJykKKyNlbmRpZgorI2lmIGRlZmluZWQoVlNUQVRVUykgJiYgIWRlZmluZWQoQ1NUQVRVUykKKyMgZGVmaW5lIENTVEFUVVMgQ29udHJvbCgndCcpCisjZW5kaWYKKworLyogU2F2ZSB1cyBmcm9tICNpZmRlZiBmb3Jlc3QgcGxhZ3VlICovCisjaWZuZGVmIEJTRExZCisjIGRlZmluZSBCU0RMWSAwCisjZW5kaWYKKyNpZm5kZWYgQ0lCQVVECisjIGRlZmluZSBDSUJBVUQgMAorI2VuZGlmCisjaWZuZGVmIENSRExZCisjIGRlZmluZSBDUkRMWSAwCisjZW5kaWYKKyNpZm5kZWYgQ1JUU0NUUworIyBkZWZpbmUgQ1JUU0NUUyAwCisjZW5kaWYKKyNpZm5kZWYgRUNIT0NUTAorIyBkZWZpbmUgRUNIT0NUTCAwCisjZW5kaWYKKyNpZm5kZWYgRUNIT0tFCisjIGRlZmluZSBFQ0hPS0UgMAorI2VuZGlmCisjaWZuZGVmIEVDSE9QUlQKKyMgZGVmaW5lIEVDSE9QUlQgMAorI2VuZGlmCisjaWZuZGVmIEZGRExZCisjIGRlZmluZSBGRkRMWSAwCisjZW5kaWYKKyNpZm5kZWYgSUVYVEVOCisjIGRlZmluZSBJRVhURU4gMAorI2VuZGlmCisjaWZuZGVmIElNQVhCRUwKKyMgZGVmaW5lIElNQVhCRUwgMAorI2VuZGlmCisjaWZuZGVmIElVQ0xDCisjIGRlZmluZSBJVUNMQyAwCisjZW5kaWYKKyNpZm5kZWYgSVhBTlkKKyMgZGVmaW5lIElYQU5ZIDAKKyNlbmRpZgorI2lmbmRlZiBOTERMWQorIyBkZWZpbmUgTkxETFkgMAorI2VuZGlmCisjaWZuZGVmIE9DUk5MCisjIGRlZmluZSBPQ1JOTCAwCisjZW5kaWYKKyNpZm5kZWYgT0ZERUwKKyMgZGVmaW5lIE9GREVMIDAKKyNlbmRpZgorI2lmbmRlZiBPRklMTAorIyBkZWZpbmUgT0ZJTEwgMAorI2VuZGlmCisjaWZuZGVmIE9MQ1VDCisjIGRlZmluZSBPTENVQyAwCisjZW5kaWYKKyNpZm5kZWYgT05MQ1IKKyMgZGVmaW5lIE9OTENSIDAKKyNlbmRpZgorI2lmbmRlZiBPTkxSRVQKKyMgZGVmaW5lIE9OTFJFVCAwCisjZW5kaWYKKyNpZm5kZWYgT05PQ1IKKyMgZGVmaW5lIE9OT0NSIDAKKyNlbmRpZgorI2lmbmRlZiBPWFRBQlMKKyMgZGVmaW5lIE9YVEFCUyAwCisjZW5kaWYKKyNpZm5kZWYgVEFCRExZCisjIGRlZmluZSBUQUJETFkgMAorI2VuZGlmCisjaWZuZGVmIFRBQjEKKyMgZGVmaW5lIFRBQjEgMAorI2VuZGlmCisjaWZuZGVmIFRBQjIKKyMgZGVmaW5lIFRBQjIgMAorI2VuZGlmCisjaWZuZGVmIFRPU1RPUAorIyBkZWZpbmUgVE9TVE9QIDAKKyNlbmRpZgorI2lmbmRlZiBWRFNVU1AKKyMgZGVmaW5lIFZEU1VTUCAwCisjZW5kaWYKKyNpZm5kZWYgVkVPTDIKKyMgZGVmaW5lIFZFT0wyIDAKKyNlbmRpZgorI2lmbmRlZiBWRkxVU0hPCisjIGRlZmluZSBWRkxVU0hPIDAKKyNlbmRpZgorI2lmbmRlZiBWTE5FWFQKKyMgZGVmaW5lIFZMTkVYVCAwCisjZW5kaWYKKyNpZm5kZWYgVlJFUFJJTlQKKyMgZGVmaW5lIFZSRVBSSU5UIDAKKyNlbmRpZgorI2lmbmRlZiBWU1RBVFVTCisjIGRlZmluZSBWU1RBVFVTIDAKKyNlbmRpZgorI2lmbmRlZiBWU1dUQ0gKKyMgZGVmaW5lIFZTV1RDSCAwCisjZW5kaWYKKyNpZm5kZWYgVlRETFkKKyMgZGVmaW5lIFZURExZIDAKKyNlbmRpZgorI2lmbmRlZiBWV0VSQVNFCisjIGRlZmluZSBWV0VSQVNFIDAKKyNlbmRpZgorI2lmbmRlZiBYQ0FTRQorIyBkZWZpbmUgWENBU0UgMAorI2VuZGlmCisjaWZuZGVmIElVVEY4CisjIGRlZmluZSBJVVRGOCAwCisjZW5kaWYKKworLyogV2hpY2ggc3BlZWRzIHRvIHNldCAqLworZW51bSBzcGVlZF9zZXR0aW5nIHsKKwlpbnB1dF9zcGVlZCwgb3V0cHV0X3NwZWVkLCBib3RoX3NwZWVkcworfTsKKworLyogV2hpY2ggbWVtYmVyKHMpIG9mICdzdHJ1Y3QgdGVybWlvcycgYSBtb2RlIHVzZXMgKi8KK2VudW0geworCS8qIERvIE5PVCBjaGFuZ2UgdGhlIG9yZGVyIG9yIHZhbHVlcywgYXMgbW9kZV90eXBlX2ZsYWcoKQorCSAqIGRlcGVuZHMgb24gdGhlbSAqLworCWNvbnRyb2wsIGlucHV0LCBvdXRwdXQsIGxvY2FsLCBjb21iaW5hdGlvbgorfTsKKworLyogRmxhZ3MgZm9yICdzdHJ1Y3QgbW9kZV9pbmZvJyAqLworI2RlZmluZSBTQU5FX1NFVCAxICAgICAgICAgICAgICAvKiBTZXQgaW4gJ3NhbmUnIG1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQU5FX1VOU0VUIDIgICAgICAgICAgICAvKiBVbnNldCBpbiAnc2FuZScgbW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRVYgNCAgICAgICAgICAgICAgICAgICAvKiBDYW4gYmUgdHVybmVkIG9mZiBieSBwcmVwZW5kaW5nICctJyAqLworI2RlZmluZSBPTUlUIDggICAgICAgICAgICAgICAgICAvKiBEb24ndCBkaXNwbGF5IHZhbHVlICAgICAgICAgICAgICAgICAqLworCisKKy8qIEVhY2ggbW9kZS4KKyAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBrZXB0IGFzIHNtYWxsIGFzIGh1bWFubHkgcG9zc2libGUuCisgKi8KK3N0cnVjdCBtb2RlX2luZm8geworCWNvbnN0IHVpbnQ4X3QgdHlwZTsgICAgICAgICAgIC8qIFdoaWNoIHN0cnVjdHVyZSBlbGVtZW50IHRvIGNoYW5nZSAgICAqLworCWNvbnN0IHVpbnQ4X3QgZmxhZ3M7ICAgICAgICAgIC8qIFNldHRpbmcgYW5kIGRpc3BsYXkgb3B0aW9ucyAgICAgICAgICAqLworCS8qIG9ubHkgdGhlc2UgdmFsdWVzIGFyZSBldmVyIHVzZWQsIHNvLi4uICovCisjaWYgICAoQ1NJWkUgfCBOTERMWSB8IENSRExZIHwgVEFCRExZIHwgQlNETFkgfCBWVERMWSB8IEZGRExZKSA8IDB4MTAwCisJY29uc3QgdWludDhfdCBtYXNrOworI2VsaWYgKENTSVpFIHwgTkxETFkgfCBDUkRMWSB8IFRBQkRMWSB8IEJTRExZIHwgVlRETFkgfCBGRkRMWSkgPCAweDEwMDAwCisJY29uc3QgdWludDE2X3QgbWFzazsKKyNlbHNlCisJY29uc3QgdGNmbGFnX3QgbWFzazsgICAgICAgICAgLyogT3RoZXIgYml0cyB0byB0dXJuIG9mZiBmb3IgdGhpcyBtb2RlICovCisjZW5kaWYKKwkvKiB3YXMgdXNpbmcgc2hvcnQgaGVyZSwgYnV0IHBwYzMyIHdhcyB1bmhhcHB5ICovCisJY29uc3QgdGNmbGFnX3QgYml0czsgICAgICAgICAgLyogQml0cyB0byBzZXQgZm9yIHRoaXMgbW9kZSAgICAgICAgICAgICovCit9OworCitlbnVtIHsKKwkvKiBNdXN0IG1hdGNoIG1vZGVfbmFtZVtdIGFuZCBtb2RlX2luZm9bXSBvcmRlciEgKi8KKwlJRFhfZXZlbnAgPSAwLAorCUlEWF9wYXJpdHksCisJSURYX29kZHAsCisJSURYX25sLAorCUlEWF9laywKKwlJRFhfc2FuZSwKKwlJRFhfY29va2VkLAorCUlEWF9yYXcsCisJSURYX3Bhc3M4LAorCUlEWF9saXRvdXQsCisJSURYX2NicmVhaywKKwlJRFhfY3J0LAorCUlEWF9kZWMsCisjaWYgSVhBTlkKKwlJRFhfZGVjY3RscSwKKyNlbmRpZgorI2lmIFRBQkRMWSB8fCBPWFRBQlMKKwlJRFhfdGFicywKKyNlbmRpZgorI2lmIFhDQVNFICYmIElVQ0xDICYmIE9MQ1VDCisJSURYX2xjYXNlLAorCUlEWF9MQ0FTRSwKKyNlbmRpZgorfTsKKworI2RlZmluZSBNSV9FTlRSWShOLFQsRixCLE0pIE4gIlwwIgorCisvKiBNb2RlIG5hbWVzIGdpdmVuIG9uIGNvbW1hbmQgbGluZSAqLworc3RhdGljIGNvbnN0IGNoYXIgbW9kZV9uYW1lW10gPQorCU1JX0VOVFJZKCJldmVucCIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInBhcml0eSIsICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgib2RkcCIsICAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJubCIsICAgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImVrIiwgICAgICAgY29tYmluYXRpb24sIE9NSVQsICAgICAgICAgICAgICAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgic2FuZSIsICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJjb29rZWQiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInJhdyIsICAgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgicGFzczgiLCAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJsaXRvdXQiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImNicmVhayIsICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiY3J0IiwgICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJkZWMiLCAgICAgIGNvbWJpbmF0aW9uLCBPTUlULCAgICAgICAgICAgICAgMCwgICAgICAgICAgMCApCisjaWYgSVhBTlkKKwlNSV9FTlRSWSgiZGVjY3RscSIsICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorI2VuZGlmCisjaWYgVEFCRExZIHx8IE9YVEFCUworCU1JX0VOVFJZKCJ0YWJzIiwgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisjZW5kaWYKKyNpZiBYQ0FTRSAmJiBJVUNMQyAmJiBPTENVQworCU1JX0VOVFJZKCJsY2FzZSIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoIkxDQVNFIiwgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJwYXJlbmIiLCAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgUEFSRU5CLCAgICAgMCApCisJTUlfRU5UUlkoInBhcm9kZCIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBQQVJPREQsICAgICAwICkKKwlNSV9FTlRSWSgiY3M1IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTNSwgICAgIENTSVpFKQorCU1JX0VOVFJZKCJjczYiLCAgICAgIGNvbnRyb2wsICAgICAwLCAgICAgICAgICAgICAgICAgQ1M2LCAgICAgQ1NJWkUpCisJTUlfRU5UUlkoImNzNyIsICAgICAgY29udHJvbCwgICAgIDAsICAgICAgICAgICAgICAgICBDUzcsICAgICBDU0laRSkKKwlNSV9FTlRSWSgiY3M4IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTOCwgICAgIENTSVpFKQorCU1JX0VOVFJZKCJodXBjbCIsICAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgSFVQQ0wsICAgICAgMCApCisJTUlfRU5UUlkoImh1cCIsICAgICAgY29udHJvbCwgICAgIFJFViAgICAgICAgfCBPTUlULCBIVVBDTCwgICAgICAwICkKKwlNSV9FTlRSWSgiY3N0b3BiIiwgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIENTVE9QQiwgICAgIDAgKQorCU1JX0VOVFJZKCJjcmVhZCIsICAgIGNvbnRyb2wsICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgQ1JFQUQsICAgICAgMCApCisJTUlfRU5UUlkoImNsb2NhbCIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBDTE9DQUwsICAgICAwICkKKyNpZiBDUlRTQ1RTCisJTUlfRU5UUlkoImNydHNjdHMiLCAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBDUlRTQ1RTLCAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJpZ25icmsiLCAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSUdOQlJLLCAgICAgMCApCisJTUlfRU5UUlkoImJya2ludCIsICAgaW5wdXQsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBCUktJTlQsICAgICAwICkKKwlNSV9FTlRSWSgiaWducGFyIiwgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElHTlBBUiwgICAgIDAgKQorCU1JX0VOVFJZKCJwYXJtcmsiLCAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgUEFSTVJLLCAgICAgMCApCisJTUlfRU5UUlkoImlucGNrIiwgICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBJTlBDSywgICAgICAwICkKKwlNSV9FTlRSWSgiaXN0cmlwIiwgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElTVFJJUCwgICAgIDAgKQorCU1JX0VOVFJZKCJpbmxjciIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSU5MQ1IsICAgICAgMCApCisJTUlfRU5UUlkoImlnbmNyIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJR05DUiwgICAgICAwICkKKwlNSV9FTlRSWSgiaWNybmwiLCAgICBpbnB1dCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElDUk5MLCAgICAgIDAgKQorCU1JX0VOVFJZKCJpeG9uIiwgICAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgSVhPTiwgICAgICAgMCApCisJTUlfRU5UUlkoIml4b2ZmIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJWE9GRiwgICAgICAwICkKKwlNSV9FTlRSWSgidGFuZGVtIiwgICBpbnB1dCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIElYT0ZGLCAgICAgIDAgKQorI2lmIElVQ0xDCisJTUlfRU5UUlkoIml1Y2xjIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJVUNMQywgICAgICAwICkKKyNlbmRpZgorI2lmIElYQU5ZCisJTUlfRU5UUlkoIml4YW55IiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJWEFOWSwgICAgICAwICkKKyNlbmRpZgorI2lmIElNQVhCRUwKKwlNSV9FTlRSWSgiaW1heGJlbCIsICBpbnB1dCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElNQVhCRUwsICAgIDAgKQorI2VuZGlmCisjaWYgSVVURjgKKwlNSV9FTlRSWSgiaXV0ZjgiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElVVEY4LCAgICAgIDAgKQorI2VuZGlmCisJTUlfRU5UUlkoIm9wb3N0IiwgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBPUE9TVCwgICAgICAwICkKKyNpZiBPTENVQworCU1JX0VOVFJZKCJvbGN1YyIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT0xDVUMsICAgICAgMCApCisjZW5kaWYKKyNpZiBPQ1JOTAorCU1JX0VOVFJZKCJvY3JubCIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT0NSTkwsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTkxDUgorCU1JX0VOVFJZKCJvbmxjciIsICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgT05MQ1IsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTk9DUgorCU1JX0VOVFJZKCJvbm9jciIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT05PQ1IsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTkxSRVQKKwlNSV9FTlRSWSgib25scmV0IiwgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9OTFJFVCwgICAgIDAgKQorI2VuZGlmCisjaWYgT0ZJTEwKKwlNSV9FTlRSWSgib2ZpbGwiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9GSUxMLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT0ZERUwKKwlNSV9FTlRSWSgib2ZkZWwiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9GREVMLCAgICAgIDAgKQorI2VuZGlmCisjaWYgTkxETFkKKwlNSV9FTlRSWSgibmwxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIE5MMSwgICAgIE5MRExZKQorCU1JX0VOVFJZKCJubDAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgTkwwLCAgICAgTkxETFkpCisjZW5kaWYKKyNpZiBDUkRMWQorCU1JX0VOVFJZKCJjcjMiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgQ1IzLCAgICAgQ1JETFkpCisJTUlfRU5UUlkoImNyMiIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBDUjIsICAgICBDUkRMWSkKKwlNSV9FTlRSWSgiY3IxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIENSMSwgICAgIENSRExZKQorCU1JX0VOVFJZKCJjcjAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgQ1IwLCAgICAgQ1JETFkpCisjZW5kaWYKKworI2lmIFRBQkRMWQorCU1JX0VOVFJZKCJ0YWIzIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVEFCMywgICBUQUJETFkpCisjIGlmIFRBQjIKKwlNSV9FTlRSWSgidGFiMiIsICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIFRBQjIsICAgVEFCRExZKQorIyBlbmRpZgorIyBpZiBUQUIxCisJTUlfRU5UUlkoInRhYjEiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBUQUIxLCAgIFRBQkRMWSkKKyMgZW5kaWYKKwlNSV9FTlRSWSgidGFiMCIsICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIFRBQjAsICAgVEFCRExZKQorI2Vsc2UKKyMgaWYgT1hUQUJTCisJTUlfRU5UUlkoInRhYjMiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBPWFRBQlMsICAgICAwICkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgQlNETFkKKwlNSV9FTlRSWSgiYnMxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIEJTMSwgICAgIEJTRExZKQorCU1JX0VOVFJZKCJiczAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgQlMwLCAgICAgQlNETFkpCisjZW5kaWYKKyNpZiBWVERMWQorCU1JX0VOVFJZKCJ2dDEiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVlQxLCAgICAgVlRETFkpCisJTUlfRU5UUlkoInZ0MCIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBWVDAsICAgICBWVERMWSkKKyNlbmRpZgorI2lmIEZGRExZCisJTUlfRU5UUlkoImZmMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBGRjEsICAgICBGRkRMWSkKKwlNSV9FTlRSWSgiZmYwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIEZGMCwgICAgIEZGRExZKQorI2VuZGlmCisJTUlfRU5UUlkoImlzaWciLCAgICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJU0lHLCAgICAgICAwICkKKwlNSV9FTlRSWSgiaWNhbm9uIiwgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElDQU5PTiwgICAgIDAgKQorI2lmIElFWFRFTgorCU1JX0VOVFJZKCJpZXh0ZW4iLCAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgSUVYVEVOLCAgICAgMCApCisjZW5kaWYKKwlNSV9FTlRSWSgiZWNobyIsICAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE8sICAgICAgIDAgKQorCU1JX0VOVFJZKCJlY2hvZSIsICAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgRUNIT0UsICAgICAgMCApCisJTUlfRU5UUlkoImNydGVyYXNlIiwgbG9jYWwsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBFQ0hPRSwgICAgICAwICkKKwlNSV9FTlRSWSgiZWNob2siLCAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9LLCAgICAgIDAgKQorCU1JX0VOVFJZKCJlY2hvbmwiLCAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgRUNIT05MLCAgICAgMCApCisJTUlfRU5UUlkoIm5vZmxzaCIsICAgbG9jYWwsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBOT0ZMU0gsICAgICAwICkKKyNpZiBYQ0FTRQorCU1JX0VOVFJZKCJ4Y2FzZSIsICAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgWENBU0UsICAgICAgMCApCisjZW5kaWYKKyNpZiBUT1NUT1AKKwlNSV9FTlRSWSgidG9zdG9wIiwgICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIFRPU1RPUCwgICAgIDAgKQorI2VuZGlmCisjaWYgRUNIT1BSVAorCU1JX0VOVFJZKCJlY2hvcHJ0IiwgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgRUNIT1BSVCwgICAgMCApCisJTUlfRU5UUlkoInBydGVyYXNlIiwgbG9jYWwsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBFQ0hPUFJULCAgICAwICkKKyNlbmRpZgorI2lmIEVDSE9DVEwKKwlNSV9FTlRSWSgiZWNob2N0bCIsICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9DVEwsICAgIDAgKQorCU1JX0VOVFJZKCJjdGxlY2hvIiwgIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT0NUTCwgICAgMCApCisjZW5kaWYKKyNpZiBFQ0hPS0UKKwlNSV9FTlRSWSgiZWNob2tlIiwgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9LRSwgICAgIDAgKQorCU1JX0VOVFJZKCJjcnRraWxsIiwgIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT0tFLCAgICAgMCApCisjZW5kaWYKKwk7CisKKyN1bmRlZiBNSV9FTlRSWQorI2RlZmluZSBNSV9FTlRSWShOLFQsRixCLE0pIHsgVCwgRiwgTSwgQiB9LAorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1vZGVfaW5mbyBtb2RlX2luZm9bXSA9IHsKKwkvKiBUaGlzIHNob3VsZCBiZSB2ZXJiYXRpbSBjdXQtbi1wYXN0ZSBjb3B5IG9mIHRoZSBhYm92ZSBNSV9FTlRSWXMgKi8KKwlNSV9FTlRSWSgiZXZlbnAiLCAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJwYXJpdHkiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoIm9kZHAiLCAgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgibmwiLCAgICAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJlayIsICAgICAgIGNvbWJpbmF0aW9uLCBPTUlULCAgICAgICAgICAgICAgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInNhbmUiLCAgICAgY29tYmluYXRpb24sIE9NSVQsICAgICAgICAgICAgICAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiY29va2VkIiwgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJyYXciLCAgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInBhc3M4IiwgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgibGl0b3V0IiwgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJjYnJlYWsiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImNydCIsICAgICAgY29tYmluYXRpb24sIE9NSVQsICAgICAgICAgICAgICAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiZGVjIiwgICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorI2lmIElYQU5ZCisJTUlfRU5UUlkoImRlY2N0bHEiLCAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKyNlbmRpZgorI2lmIFRBQkRMWSB8fCBPWFRBQlMKKwlNSV9FTlRSWSgidGFicyIsICAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorI2VuZGlmCisjaWYgWENBU0UgJiYgSVVDTEMgJiYgT0xDVUMKKwlNSV9FTlRSWSgibGNhc2UiLCAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJMQ0FTRSIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisjZW5kaWYKKwlNSV9FTlRSWSgicGFyZW5iIiwgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIFBBUkVOQiwgICAgIDAgKQorCU1JX0VOVFJZKCJwYXJvZGQiLCAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgUEFST0RELCAgICAgMCApCisJTUlfRU5UUlkoImNzNSIsICAgICAgY29udHJvbCwgICAgIDAsICAgICAgICAgICAgICAgICBDUzUsICAgICBDU0laRSkKKwlNSV9FTlRSWSgiY3M2IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTNiwgICAgIENTSVpFKQorCU1JX0VOVFJZKCJjczciLCAgICAgIGNvbnRyb2wsICAgICAwLCAgICAgICAgICAgICAgICAgQ1M3LCAgICAgQ1NJWkUpCisJTUlfRU5UUlkoImNzOCIsICAgICAgY29udHJvbCwgICAgIDAsICAgICAgICAgICAgICAgICBDUzgsICAgICBDU0laRSkKKwlNSV9FTlRSWSgiaHVwY2wiLCAgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIEhVUENMLCAgICAgIDAgKQorCU1JX0VOVFJZKCJodXAiLCAgICAgIGNvbnRyb2wsICAgICBSRVYgICAgICAgIHwgT01JVCwgSFVQQ0wsICAgICAgMCApCisJTUlfRU5UUlkoImNzdG9wYiIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBDU1RPUEIsICAgICAwICkKKwlNSV9FTlRSWSgiY3JlYWQiLCAgICBjb250cm9sLCAgICAgU0FORV9TRVQgICB8IFJFViwgIENSRUFELCAgICAgIDAgKQorCU1JX0VOVFJZKCJjbG9jYWwiLCAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgQ0xPQ0FMLCAgICAgMCApCisjaWYgQ1JUU0NUUworCU1JX0VOVFJZKCJjcnRzY3RzIiwgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgQ1JUU0NUUywgICAgMCApCisjZW5kaWYKKwlNSV9FTlRSWSgiaWduYnJrIiwgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElHTkJSSywgICAgIDAgKQorCU1JX0VOVFJZKCJicmtpbnQiLCAgIGlucHV0LCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgQlJLSU5ULCAgICAgMCApCisJTUlfRU5UUlkoImlnbnBhciIsICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBJR05QQVIsICAgICAwICkKKwlNSV9FTlRSWSgicGFybXJrIiwgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIFBBUk1SSywgICAgIDAgKQorCU1JX0VOVFJZKCJpbnBjayIsICAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgSU5QQ0ssICAgICAgMCApCisJTUlfRU5UUlkoImlzdHJpcCIsICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBJU1RSSVAsICAgICAwICkKKwlNSV9FTlRSWSgiaW5sY3IiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElOTENSLCAgICAgIDAgKQorCU1JX0VOVFJZKCJpZ25jciIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSUdOQ1IsICAgICAgMCApCisJTUlfRU5UUlkoImljcm5sIiwgICAgaW5wdXQsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJQ1JOTCwgICAgICAwICkKKwlNSV9FTlRSWSgiaXhvbiIsICAgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElYT04sICAgICAgIDAgKQorCU1JX0VOVFJZKCJpeG9mZiIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSVhPRkYsICAgICAgMCApCisJTUlfRU5UUlkoInRhbmRlbSIsICAgaW5wdXQsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBJWE9GRiwgICAgICAwICkKKyNpZiBJVUNMQworCU1JX0VOVFJZKCJpdWNsYyIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSVVDTEMsICAgICAgMCApCisjZW5kaWYKKyNpZiBJWEFOWQorCU1JX0VOVFJZKCJpeGFueSIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSVhBTlksICAgICAgMCApCisjZW5kaWYKKyNpZiBJTUFYQkVMCisJTUlfRU5UUlkoImltYXhiZWwiLCAgaW5wdXQsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJTUFYQkVMLCAgICAwICkKKyNlbmRpZgorI2lmIElVVEY4CisJTUlfRU5UUlkoIml1dGY4IiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJVVRGOCwgICAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJvcG9zdCIsICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgT1BPU1QsICAgICAgMCApCisjaWYgT0xDVUMKKwlNSV9FTlRSWSgib2xjdWMiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9MQ1VDLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT0NSTkwKKwlNSV9FTlRSWSgib2NybmwiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9DUk5MLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT05MQ1IKKwlNSV9FTlRSWSgib25sY3IiLCAgICBvdXRwdXQsICAgICAgU0FORV9TRVQgICB8IFJFViwgIE9OTENSLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT05PQ1IKKwlNSV9FTlRSWSgib25vY3IiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9OT0NSLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT05MUkVUCisJTUlfRU5UUlkoIm9ubHJldCIsICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPTkxSRVQsICAgICAwICkKKyNlbmRpZgorI2lmIE9GSUxMCisJTUlfRU5UUlkoIm9maWxsIiwgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPRklMTCwgICAgICAwICkKKyNlbmRpZgorI2lmIE9GREVMCisJTUlfRU5UUlkoIm9mZGVsIiwgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPRkRFTCwgICAgICAwICkKKyNlbmRpZgorI2lmIE5MRExZCisJTUlfRU5UUlkoIm5sMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBOTDEsICAgICBOTERMWSkKKwlNSV9FTlRSWSgibmwwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIE5MMCwgICAgIE5MRExZKQorI2VuZGlmCisjaWYgQ1JETFkKKwlNSV9FTlRSWSgiY3IzIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIENSMywgICAgIENSRExZKQorCU1JX0VOVFJZKCJjcjIiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgQ1IyLCAgICAgQ1JETFkpCisJTUlfRU5UUlkoImNyMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBDUjEsICAgICBDUkRMWSkKKwlNSV9FTlRSWSgiY3IwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIENSMCwgICAgIENSRExZKQorI2VuZGlmCisKKyNpZiBUQUJETFkKKwlNSV9FTlRSWSgidGFiMyIsICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIFRBQjMsICAgVEFCRExZKQorIyBpZiBUQUIyCisJTUlfRU5UUlkoInRhYjIiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBUQUIyLCAgIFRBQkRMWSkKKyMgZW5kaWYKKyMgaWYgVEFCMQorCU1JX0VOVFJZKCJ0YWIxIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVEFCMSwgICBUQUJETFkpCisjIGVuZGlmCisJTUlfRU5UUlkoInRhYjAiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBUQUIwLCAgIFRBQkRMWSkKKyNlbHNlCisjIGlmIE9YVEFCUworCU1JX0VOVFJZKCJ0YWIzIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgT1hUQUJTLCAgICAgMCApCisjIGVuZGlmCisjZW5kaWYKKworI2lmIEJTRExZCisJTUlfRU5UUlkoImJzMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBCUzEsICAgICBCU0RMWSkKKwlNSV9FTlRSWSgiYnMwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIEJTMCwgICAgIEJTRExZKQorI2VuZGlmCisjaWYgVlRETFkKKwlNSV9FTlRSWSgidnQxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIFZUMSwgICAgIFZURExZKQorCU1JX0VOVFJZKCJ2dDAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgVlQwLCAgICAgVlRETFkpCisjZW5kaWYKKyNpZiBGRkRMWQorCU1JX0VOVFJZKCJmZjEiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgRkYxLCAgICAgRkZETFkpCisJTUlfRU5UUlkoImZmMCIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBGRjAsICAgICBGRkRMWSkKKyNlbmRpZgorCU1JX0VOVFJZKCJpc2lnIiwgICAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgSVNJRywgICAgICAgMCApCisJTUlfRU5UUlkoImljYW5vbiIsICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJQ0FOT04sICAgICAwICkKKyNpZiBJRVhURU4KKwlNSV9FTlRSWSgiaWV4dGVuIiwgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElFWFRFTiwgICAgIDAgKQorI2VuZGlmCisJTUlfRU5UUlkoImVjaG8iLCAgICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPLCAgICAgICAwICkKKwlNSV9FTlRSWSgiZWNob2UiLCAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9FLCAgICAgIDAgKQorCU1JX0VOVFJZKCJjcnRlcmFzZSIsIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT0UsICAgICAgMCApCisJTUlfRU5UUlkoImVjaG9rIiwgICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPSywgICAgICAwICkKKwlNSV9FTlRSWSgiZWNob25sIiwgICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIEVDSE9OTCwgICAgIDAgKQorCU1JX0VOVFJZKCJub2Zsc2giLCAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgTk9GTFNILCAgICAgMCApCisjaWYgWENBU0UKKwlNSV9FTlRSWSgieGNhc2UiLCAgICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIFhDQVNFLCAgICAgIDAgKQorI2VuZGlmCisjaWYgVE9TVE9QCisJTUlfRU5UUlkoInRvc3RvcCIsICAgbG9jYWwsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBUT1NUT1AsICAgICAwICkKKyNlbmRpZgorI2lmIEVDSE9QUlQKKwlNSV9FTlRSWSgiZWNob3BydCIsICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIEVDSE9QUlQsICAgIDAgKQorCU1JX0VOVFJZKCJwcnRlcmFzZSIsIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT1BSVCwgICAgMCApCisjZW5kaWYKKyNpZiBFQ0hPQ1RMCisJTUlfRU5UUlkoImVjaG9jdGwiLCAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPQ1RMLCAgICAwICkKKwlNSV9FTlRSWSgiY3RsZWNobyIsICBsb2NhbCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIEVDSE9DVEwsICAgIDAgKQorI2VuZGlmCisjaWYgRUNIT0tFCisJTUlfRU5UUlkoImVjaG9rZSIsICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPS0UsICAgICAwICkKKwlNSV9FTlRSWSgiY3J0a2lsbCIsICBsb2NhbCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIEVDSE9LRSwgICAgIDAgKQorI2VuZGlmCit9OworCitlbnVtIHsKKwlOVU1fbW9kZV9pbmZvID0gQVJSQVlfU0laRShtb2RlX2luZm8pCit9OworCisKKy8qIENvbnRyb2wgY2hhcmFjdGVycyAqLworc3RydWN0IGNvbnRyb2xfaW5mbyB7CisJY29uc3QgdWludDhfdCBzYW5ldmFsOyAgLyogVmFsdWUgdG8gc2V0IGZvciAnc3R0eSBzYW5lJyAqLworCWNvbnN0IHVpbnQ4X3Qgb2Zmc2V0OyAgIC8qIE9mZnNldCBpbiBjX2NjICovCit9OworCitlbnVtIHsKKwkvKiBNdXN0IG1hdGNoIGNvbnRyb2xfbmFtZVtdIGFuZCBjb250cm9sX2luZm9bXSBvcmRlciEgKi8KKwlDSURYX2ludHIgPSAwLAorCUNJRFhfcXVpdCwKKwlDSURYX2VyYXNlLAorCUNJRFhfa2lsbCwKKwlDSURYX2VvZiwKKwlDSURYX2VvbCwKKyNpZiBWRU9MMgorCUNJRFhfZW9sMiwKKyNlbmRpZgorI2lmIFZTV1RDSAorCUNJRFhfc3d0Y2gsCisjZW5kaWYKKwlDSURYX3N0YXJ0LAorCUNJRFhfc3RvcCwKKwlDSURYX3N1c3AsCisjaWYgVkRTVVNQCisJQ0lEWF9kc3VzcCwKKyNlbmRpZgorI2lmIFZSRVBSSU5UCisJQ0lEWF9ycHJudCwKKyNlbmRpZgorI2lmIFZXRVJBU0UKKwlDSURYX3dlcmFzZSwKKyNlbmRpZgorI2lmIFZMTkVYVAorCUNJRFhfbG5leHQsCisjZW5kaWYKKyNpZiBWRkxVU0hPCisJQ0lEWF9mbHVzaCwKKyNlbmRpZgorI2lmIFZTVEFUVVMKKwlDSURYX3N0YXR1cywKKyNlbmRpZgorCUNJRFhfbWluLAorCUNJRFhfdGltZSwKK307CisKKyNkZWZpbmUgQ0lfRU5UUlkobixzLG8pIG4gIlwwIgorCisvKiBOYW1lIGdpdmVuIG9uIGNvbW1hbmQgbGluZSAqLworc3RhdGljIGNvbnN0IGNoYXIgY29udHJvbF9uYW1lW10gPQorCUNJX0VOVFJZKCJpbnRyIiwgICAgIENJTlRSLCAgIFZJTlRSICAgKQorCUNJX0VOVFJZKCJxdWl0IiwgICAgIENRVUlULCAgIFZRVUlUICAgKQorCUNJX0VOVFJZKCJlcmFzZSIsICAgIENFUkFTRSwgIFZFUkFTRSAgKQorCUNJX0VOVFJZKCJraWxsIiwgICAgIENLSUxMLCAgIFZLSUxMICAgKQorCUNJX0VOVFJZKCJlb2YiLCAgICAgIENFT0YsICAgIFZFT0YgICAgKQorCUNJX0VOVFJZKCJlb2wiLCAgICAgIENFT0wsICAgIFZFT0wgICAgKQorI2lmIFZFT0wyCisJQ0lfRU5UUlkoImVvbDIiLCAgICAgQ0VPTDIsICAgVkVPTDIgICApCisjZW5kaWYKKyNpZiBWU1dUQ0gKKwlDSV9FTlRSWSgic3d0Y2giLCAgICBDU1dUQ0gsICBWU1dUQ0ggICkKKyNlbmRpZgorCUNJX0VOVFJZKCJzdGFydCIsICAgIENTVEFSVCwgIFZTVEFSVCAgKQorCUNJX0VOVFJZKCJzdG9wIiwgICAgIENTVE9QLCAgIFZTVE9QICAgKQorCUNJX0VOVFJZKCJzdXNwIiwgICAgIENTVVNQLCAgIFZTVVNQICAgKQorI2lmIFZEU1VTUAorCUNJX0VOVFJZKCJkc3VzcCIsICAgIENEU1VTUCwgIFZEU1VTUCAgKQorI2VuZGlmCisjaWYgVlJFUFJJTlQKKwlDSV9FTlRSWSgicnBybnQiLCAgICBDUlBSTlQsICBWUkVQUklOVCkKKyNlbmRpZgorI2lmIFZXRVJBU0UKKwlDSV9FTlRSWSgid2VyYXNlIiwgICBDV0VSQVNFLCBWV0VSQVNFICkKKyNlbmRpZgorI2lmIFZMTkVYVAorCUNJX0VOVFJZKCJsbmV4dCIsICAgIENMTkVYVCwgIFZMTkVYVCAgKQorI2VuZGlmCisjaWYgVkZMVVNITworCUNJX0VOVFJZKCJmbHVzaCIsICAgIENGTFVTSE8sIFZGTFVTSE8gKQorI2VuZGlmCisjaWYgVlNUQVRVUworCUNJX0VOVFJZKCJzdGF0dXMiLCAgIENTVEFUVVMsIFZTVEFUVVMgKQorI2VuZGlmCisJLyogVGhlc2UgbXVzdCBiZSBsYXN0IGJlY2F1c2Ugb2YgdGhlIGRpc3BsYXkgcm91dGluZXMgKi8KKwlDSV9FTlRSWSgibWluIiwgICAgICAxLCAgICAgICBWTUlOICAgICkKKwlDSV9FTlRSWSgidGltZSIsICAgICAwLCAgICAgICBWVElNRSAgICkKKwk7CisKKyN1bmRlZiBDSV9FTlRSWQorI2RlZmluZSBDSV9FTlRSWShuLHMsbykgeyBzLCBvIH0sCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29udHJvbF9pbmZvIGNvbnRyb2xfaW5mb1tdID0geworCS8qIFRoaXMgc2hvdWxkIGJlIHZlcmJhdGltIGN1dC1uLXBhc3RlIGNvcHkgb2YgdGhlIGFib3ZlIENJX0VOVFJZcyAqLworCUNJX0VOVFJZKCJpbnRyIiwgICAgIENJTlRSLCAgIFZJTlRSICAgKQorCUNJX0VOVFJZKCJxdWl0IiwgICAgIENRVUlULCAgIFZRVUlUICAgKQorCUNJX0VOVFJZKCJlcmFzZSIsICAgIENFUkFTRSwgIFZFUkFTRSAgKQorCUNJX0VOVFJZKCJraWxsIiwgICAgIENLSUxMLCAgIFZLSUxMICAgKQorCUNJX0VOVFJZKCJlb2YiLCAgICAgIENFT0YsICAgIFZFT0YgICAgKQorCUNJX0VOVFJZKCJlb2wiLCAgICAgIENFT0wsICAgIFZFT0wgICAgKQorI2lmIFZFT0wyCisJQ0lfRU5UUlkoImVvbDIiLCAgICAgQ0VPTDIsICAgVkVPTDIgICApCisjZW5kaWYKKyNpZiBWU1dUQ0gKKwlDSV9FTlRSWSgic3d0Y2giLCAgICBDU1dUQ0gsICBWU1dUQ0ggICkKKyNlbmRpZgorCUNJX0VOVFJZKCJzdGFydCIsICAgIENTVEFSVCwgIFZTVEFSVCAgKQorCUNJX0VOVFJZKCJzdG9wIiwgICAgIENTVE9QLCAgIFZTVE9QICAgKQorCUNJX0VOVFJZKCJzdXNwIiwgICAgIENTVVNQLCAgIFZTVVNQICAgKQorI2lmIFZEU1VTUAorCUNJX0VOVFJZKCJkc3VzcCIsICAgIENEU1VTUCwgIFZEU1VTUCAgKQorI2VuZGlmCisjaWYgVlJFUFJJTlQKKwlDSV9FTlRSWSgicnBybnQiLCAgICBDUlBSTlQsICBWUkVQUklOVCkKKyNlbmRpZgorI2lmIFZXRVJBU0UKKwlDSV9FTlRSWSgid2VyYXNlIiwgICBDV0VSQVNFLCBWV0VSQVNFICkKKyNlbmRpZgorI2lmIFZMTkVYVAorCUNJX0VOVFJZKCJsbmV4dCIsICAgIENMTkVYVCwgIFZMTkVYVCAgKQorI2VuZGlmCisjaWYgVkZMVVNITworCUNJX0VOVFJZKCJmbHVzaCIsICAgIENGTFVTSE8sIFZGTFVTSE8gKQorI2VuZGlmCisjaWYgVlNUQVRVUworCUNJX0VOVFJZKCJzdGF0dXMiLCAgIENTVEFUVVMsIFZTVEFUVVMgKQorI2VuZGlmCisJLyogVGhlc2UgbXVzdCBiZSBsYXN0IGJlY2F1c2Ugb2YgdGhlIGRpc3BsYXkgcm91dGluZXMgKi8KKwlDSV9FTlRSWSgibWluIiwgICAgICAxLCAgICAgICBWTUlOICAgICkKKwlDSV9FTlRSWSgidGltZSIsICAgICAwLCAgICAgICBWVElNRSAgICkKK307CisKK2VudW0geworCU5VTV9jb250cm9sX2luZm8gPSBBUlJBWV9TSVpFKGNvbnRyb2xfaW5mbykKK307CisKKworc3RydWN0IGdsb2JhbHMgeworCWNvbnN0IGNoYXIgKmRldmljZV9uYW1lOworCS8qIFRoZSB3aWR0aCBvZiB0aGUgc2NyZWVuLCBmb3Igb3V0cHV0IHdyYXBwaW5nICovCisJdW5zaWduZWQgbWF4X2NvbDsKKwkvKiBDdXJyZW50IHBvc2l0aW9uLCB0byBrbm93IHdoZW4gdG8gd3JhcCAqLworCXVuc2lnbmVkIGN1cnJlbnRfY29sOworCWNoYXIgYnVmWzEwXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUcuZGV2aWNlX25hbWUgPSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7IFwKKwlHLm1heF9jb2wgPSA4MDsgXAorfSB3aGlsZSAoMCkKKworCisvKiBSZXR1cm4gYSBzdHJpbmcgdGhhdCBpcyB0aGUgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGNoYXJhY3RlciBDSCAqLworLyogQWRhcHRlZCBmcm9tICdjYXQnIGJ5IFRvcmJqb3JuIEdyYW5sdW5kICovCitzdGF0aWMgY29uc3QgY2hhciAqdmlzaWJsZSh1bnNpZ25lZCBjaCkKK3sKKwljaGFyICpicG91dCA9IEcuYnVmOworCisJaWYgKGNoID09IF9QT1NJWF9WRElTQUJMRSkKKwkJcmV0dXJuICI8dW5kZWY+IjsKKworCWlmIChjaCA+PSAxMjgpIHsKKwkJY2ggLT0gMTI4OworCQkqYnBvdXQrKyA9ICdNJzsKKwkJKmJwb3V0KysgPSAnLSc7CisJfQorCisJaWYgKGNoIDwgMzIpIHsKKwkJKmJwb3V0KysgPSAnXic7CisJCSpicG91dCsrID0gY2ggKyA2NDsKKwl9IGVsc2UgaWYgKGNoIDwgMTI3KSB7CisJCSpicG91dCsrID0gY2g7CisJfSBlbHNlIHsKKwkJKmJwb3V0KysgPSAnXic7CisJCSpicG91dCsrID0gJz8nOworCX0KKworCSpicG91dCA9ICdcMCc7CisJcmV0dXJuIEcuYnVmOworfQorCitzdGF0aWMgdGNmbGFnX3QgKm1vZGVfdHlwZV9mbGFnKHVuc2lnbmVkIHR5cGUsIGNvbnN0IHN0cnVjdCB0ZXJtaW9zICptb2RlKQoreworCXN0YXRpYyBjb25zdCB1aW50OF90IHRjZmxhZ19vZmZzZXRzW10gQUxJR04xID0geworCQlvZmZzZXRvZihzdHJ1Y3QgdGVybWlvcywgY19jZmxhZyksIC8qIGNvbnRyb2wgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHRlcm1pb3MsIGNfaWZsYWcpLCAvKiBpbnB1dCAqLworCQlvZmZzZXRvZihzdHJ1Y3QgdGVybWlvcywgY19vZmxhZyksIC8qIG91dHB1dCAqLworCQlvZmZzZXRvZihzdHJ1Y3QgdGVybWlvcywgY19sZmxhZykgIC8qIGxvY2FsICovCisJfTsKKworCWlmICh0eXBlIDw9IGxvY2FsKSB7CisJCXJldHVybiAodGNmbGFnX3QqKSAoKChjaGFyKiltb2RlKSArIHRjZmxhZ19vZmZzZXRzW3R5cGVdKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zcGVlZF9vcl9kaWUoZW51bSBzcGVlZF9zZXR0aW5nIHR5cGUsIGNvbnN0IGNoYXIgKmFyZywKKwkJCQkJc3RydWN0IHRlcm1pb3MgKm1vZGUpCit7CisJc3BlZWRfdCBiYXVkOworCisJYmF1ZCA9IHR0eV92YWx1ZV90b19iYXVkKHhhdG91KGFyZykpOworCisJaWYgKHR5cGUgIT0gb3V0cHV0X3NwZWVkKSB7ICAgICAvKiBlaXRoZXIgaW5wdXQgb3IgYm90aCAqLworCQljZnNldGlzcGVlZChtb2RlLCBiYXVkKTsKKwl9CisJaWYgKHR5cGUgIT0gaW5wdXRfc3BlZWQpIHsgICAgICAvKiBlaXRoZXIgb3V0cHV0IG9yIGJvdGggKi8KKwkJY2ZzZXRvc3BlZWQobW9kZSwgYmF1ZCk7CisJfQorfQorCitzdGF0aWMgTk9SRVRVUk4gdm9pZCBwZXJyb3Jfb25fZGV2aWNlX2FuZF9kaWUoY29uc3QgY2hhciAqZm10KQoreworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShmbXQsIEcuZGV2aWNlX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBwZXJyb3Jfb25fZGV2aWNlKGNvbnN0IGNoYXIgKmZtdCkKK3sKKwliYl9wZXJyb3JfbXNnKGZtdCwgRy5kZXZpY2VfbmFtZSk7Cit9CisKKy8qIFByaW50IGZvcm1hdCBzdHJpbmcgTUVTU0FHRSBhbmQgb3B0aW9uYWwgYXJncy4KKyAgIFdyYXAgdG8gbmV4dCBsaW5lIGZpcnN0IGlmIGl0IHdvbid0IGZpdC4KKyAgIFByaW50IGEgc3BhY2UgZmlyc3QgdW5sZXNzIE1FU1NBR0Ugd2lsbCBzdGFydCBhIG5ldyBsaW5lICovCitzdGF0aWMgdm9pZCB3cmFwZihjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCit7CisJY2hhciBidWZbMTI4XTsKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgYnVmbGVuOworCisJdmFfc3RhcnQoYXJncywgbWVzc2FnZSk7CisJYnVmbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIG1lc3NhZ2UsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwkvKiBXZSBzZWVtIHRvIGJlIGNhbGxlZCBvbmx5IHdpdGggc3VpdGFibGUgbGVuZ3RocywgYnV0IGNoZWNrIGlmCisJICAgc29tZWJvZHkgZmFpbGVkIHRvIGFkaGVyZSB0byB0aGlzIGFzc3VtcHRpb24ganVzdCB0byBiZSBzdXJlLiAgKi8KKwlpZiAoIWJ1ZmxlbiB8fCBidWZsZW4gPj0gc2l6ZW9mKGJ1ZikpIHJldHVybjsKKworCWlmIChHLmN1cnJlbnRfY29sID4gMCkgeworCQlHLmN1cnJlbnRfY29sKys7CisJCWlmIChidWZbMF0gIT0gJ1xuJykgeworCQkJaWYgKEcuY3VycmVudF9jb2wgKyBidWZsZW4gPj0gRy5tYXhfY29sKSB7CisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCQlHLmN1cnJlbnRfY29sID0gMDsKKwkJCX0gZWxzZQorCQkJCWJiX3B1dGNoYXIoJyAnKTsKKwkJfQorCX0KKwlmcHV0cyhidWYsIHN0ZG91dCk7CisJRy5jdXJyZW50X2NvbCArPSBidWZsZW47CisJaWYgKGJ1ZltidWZsZW4tMV0gPT0gJ1xuJykKKwkJRy5jdXJyZW50X2NvbCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ld2xpbmUodm9pZCkKK3sKKwlpZiAoRy5jdXJyZW50X2NvbCAhPSAwKQorCQl3cmFwZigiXG4iKTsKK30KKworI2lmZGVmIFRJT0NHV0lOU1oKK3N0YXRpYyB2b2lkIHNldF93aW5kb3dfc2l6ZShpbnQgcm93cywgaW50IGNvbHMpCit7CisJc3RydWN0IHdpbnNpemUgd2luID0geyAwLCAwLCAwLCAwIH07CisKKwlpZiAoaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DR1dJTlNaLCAmd2luKSkgeworCQlpZiAoZXJybm8gIT0gRUlOVkFMKSB7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJbWVtc2V0KCZ3aW4sIDAsIHNpemVvZih3aW4pKTsKKwl9CisKKwlpZiAocm93cyA+PSAwKQorCQl3aW4ud3Nfcm93ID0gcm93czsKKwlpZiAoY29scyA+PSAwKQorCQl3aW4ud3NfY29sID0gY29sczsKKworCWlmIChpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NTV0lOU1osIChjaGFyICopICZ3aW4pKQorYmFpbDoKKwkJcGVycm9yX29uX2RldmljZSgiJXMiKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3dpbmRvd19zaXplKGludCBmYW5jeSkKK3sKKwljb25zdCBjaGFyICpmbXRfc3RyID0gIiVzXDAlczogbm8gc2l6ZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBkZXZpY2UiOworCXVuc2lnbmVkIHdpZHRoLCBoZWlnaHQ7CisKKwlpZiAoZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChTVERJTl9GSUxFTk8sICZ3aWR0aCwgJmhlaWdodCkpIHsKKwkJaWYgKChlcnJubyAhPSBFSU5WQUwpIHx8ICgoZm10X3N0ciArPSAyKSwgIWZhbmN5KSkgeworCQkJcGVycm9yX29uX2RldmljZShmbXRfc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCXdyYXBmKGZhbmN5ID8gInJvd3MgJXU7IGNvbHVtbnMgJXU7IiA6ICIldSAldVxuIiwKKwkJCQloZWlnaHQsIHdpZHRoKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgc3R0eV9zdWZmaXhlc1tdID0geworCXsgImIiLCAgNTEyIH0sCisJeyAiayIsIDEwMjQgfSwKKwl7ICJCIiwgMTAyNCB9LAorCXsgIiIsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtb2RlX2luZm8gKmZpbmRfbW9kZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpID0gaW5kZXhfaW5fc3RyaW5ncyhtb2RlX25hbWUsIG5hbWUpOworCXJldHVybiBpID49IDAgPyAmbW9kZV9pbmZvW2ldIDogTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gKmZpbmRfY29udHJvbChjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpID0gaW5kZXhfaW5fc3RyaW5ncyhjb250cm9sX25hbWUsIG5hbWUpOworCXJldHVybiBpID49IDAgPyAmY29udHJvbF9pbmZvW2ldIDogTlVMTDsKK30KKworZW51bSB7CisJcGFyYW1fbmVlZF9hcmcgPSAweDgwLAorCXBhcmFtX2xpbmUgICAgPSAxIHwgMHg4MCwKKwlwYXJhbV9yb3dzICAgID0gMiB8IDB4ODAsCisJcGFyYW1fY29scyAgICA9IDMgfCAweDgwLAorCXBhcmFtX2NvbHVtbnMgPSA0IHwgMHg4MCwKKwlwYXJhbV9zaXplICAgID0gNSwKKwlwYXJhbV9zcGVlZCAgID0gNiwKKwlwYXJhbV9pc3BlZWQgID0gNyB8IDB4ODAsCisJcGFyYW1fb3NwZWVkICA9IDggfCAweDgwLAorfTsKKworc3RhdGljIGludCBmaW5kX3BhcmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcGFyYW1zW10gQUxJR04xID0KKwkJImxpbmVcMCIgICAgLyogMSAqLworCQkicm93c1wwIiAgICAvKiAyICovCisJCSJjb2xzXDAiICAgIC8qIDMgKi8KKwkJImNvbHVtbnNcMCIgLyogNCAqLworCQkic2l6ZVwwIiAgICAvKiA1ICovCisJCSJzcGVlZFwwIiAgIC8qIDYgKi8KKwkJImlzcGVlZFwwIgorCQkib3NwZWVkXDAiOworCWludCBpID0gaW5kZXhfaW5fc3RyaW5ncyhwYXJhbXMsIG5hbWUpICsgMTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoaSAhPSA1ICYmIGkgIT0gNikKKwkJaSB8PSAweDgwOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHJlY292ZXJfbW9kZShjb25zdCBjaGFyICphcmcsIHN0cnVjdCB0ZXJtaW9zICptb2RlKQoreworCWludCBpLCBuOworCXVuc2lnbmVkIGNocjsKKwl1bnNpZ25lZCBsb25nIGlmbGFnLCBvZmxhZywgY2ZsYWcsIGxmbGFnOworCisJLyogU2NhbiBpbnRvIHRlbXBvcmFyaWVzIHNpbmNlIGl0IGlzIHRvbyBtdWNoIHRyb3VibGUgdG8gZmlndXJlIG91dAorCSAgIHRoZSByaWdodCBmb3JtYXQgZm9yICd0Y2ZsYWdfdCcgKi8KKwlpZiAoc3NjYW5mKGFyZywgIiVseDolbHg6JWx4OiVseCVuIiwKKwkJCSAgICZpZmxhZywgJm9mbGFnLCAmY2ZsYWcsICZsZmxhZywgJm4pICE9IDQpCisJCXJldHVybiAwOworCW1vZGUtPmNfaWZsYWcgPSBpZmxhZzsKKwltb2RlLT5jX29mbGFnID0gb2ZsYWc7CisJbW9kZS0+Y19jZmxhZyA9IGNmbGFnOworCW1vZGUtPmNfbGZsYWcgPSBsZmxhZzsKKwlhcmcgKz0gbjsKKwlmb3IgKGkgPSAwOyBpIDwgTkNDUzsgKytpKSB7CisJCWlmIChzc2NhbmYoYXJnLCAiOiV4JW4iLCAmY2hyLCAmbikgIT0gMSkKKwkJCXJldHVybiAwOworCQltb2RlLT5jX2NjW2ldID0gY2hyOworCQlhcmcgKz0gbjsKKwl9CisKKwkvKiBGYWlsIGlmIHRoZXJlIGFyZSB0b28gbWFueSBmaWVsZHMgKi8KKwlpZiAoKmFyZyAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3JlY292ZXJhYmxlKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICptb2RlLAorCQkJCWludCBVTlVTRURfUEFSQU0gZHVtbXkpCit7CisJaW50IGk7CisJcHJpbnRmKCIlbHg6JWx4OiVseDolbHgiLAorCQkgICAodW5zaWduZWQgbG9uZykgbW9kZS0+Y19pZmxhZywgKHVuc2lnbmVkIGxvbmcpIG1vZGUtPmNfb2ZsYWcsCisJCSAgICh1bnNpZ25lZCBsb25nKSBtb2RlLT5jX2NmbGFnLCAodW5zaWduZWQgbG9uZykgbW9kZS0+Y19sZmxhZyk7CisJZm9yIChpID0gMDsgaSA8IE5DQ1M7ICsraSkKKwkJcHJpbnRmKCI6JXgiLCAodW5zaWduZWQgaW50KSBtb2RlLT5jX2NjW2ldKTsKKwliYl9wdXRjaGFyKCdcbicpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3NwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICptb2RlLCBpbnQgZmFuY3kpCit7CisJLy9fX19fX19fX19fX19fX19fX19fXyAwMTIzNDU2NyA4IDkKKwljb25zdCBjaGFyICpmbXRfc3RyID0gIiVsdSAlbHVcblwwaXNwZWVkICVsdSBiYXVkOyBvc3BlZWQgJWx1IGJhdWQ7IjsKKwl1bnNpZ25lZCBsb25nIGlzcGVlZCwgb3NwZWVkOworCisJaXNwZWVkID0gY2ZnZXRpc3BlZWQobW9kZSk7CisJb3NwZWVkID0gY2ZnZXRvc3BlZWQobW9kZSk7CisJaWYgKGlzcGVlZCA9PSAwIHx8IGlzcGVlZCA9PSBvc3BlZWQpIHsKKwkJaXNwZWVkID0gb3NwZWVkOyAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIGlzcGVlZCB3YXMgMCAqLworCQkvL19fX19fX19fIDAxMjMgNCA1IDYgNyA4IDkKKwkJZm10X3N0ciA9ICIlbHVcblwwXDBcMFwwXDBzcGVlZCAlbHUgYmF1ZDsiOworCX0KKwlpZiAoZmFuY3kpIGZtdF9zdHIgKz0gOTsKKwl3cmFwZihmbXRfc3RyLCB0dHlfYmF1ZF90b192YWx1ZShpc3BlZWQpLCB0dHlfYmF1ZF90b192YWx1ZShvc3BlZWQpKTsKK30KKworc3RhdGljIHZvaWQgZG9fZGlzcGxheShjb25zdCBzdHJ1Y3QgdGVybWlvcyAqbW9kZSwgaW50IGFsbCkKK3sKKwlpbnQgaTsKKwl0Y2ZsYWdfdCAqYml0c3A7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCWludCBwcmV2X3R5cGUgPSBjb250cm9sOworCisJZGlzcGxheV9zcGVlZChtb2RlLCAxKTsKKwlpZiAoYWxsKQorCQlkaXNwbGF5X3dpbmRvd19zaXplKDEpOworI2lmZGVmIF9fbGludXhfXworCXdyYXBmKCJsaW5lID0gJXU7XG4iLCBtb2RlLT5jX2xpbmUpOworI2Vsc2UKKwluZXdsaW5lKCk7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgIT0gQ0lEWF9taW47ICsraSkgeworCQkvKiBJZiBzd3RjaCBpcyB0aGUgc2FtZSBhcyBzdXNwLCBkb24ndCBwcmludCBib3RoICovCisjaWYgVlNXVENIID09IFZTVVNQCisJCWlmIChpID09IENJRFhfc3d0Y2gpCisJCQljb250aW51ZTsKKyNlbmRpZgorCQkvKiBJZiBlb2YgdXNlcyB0aGUgc2FtZSBzbG90IGFzIG1pbiwgb25seSBwcmludCB3aGljaGV2ZXIgYXBwbGllcyAqLworI2lmIFZFT0YgPT0gVk1JTgorCQlpZiAoIShtb2RlLT5jX2xmbGFnICYgSUNBTk9OKQorCQkgJiYgKGkgPT0gQ0lEWF9lb2YgfHwgaSA9PSBDSURYX2VvbCkKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisJCXdyYXBmKCIlcyA9ICVzOyIsIG50aF9zdHJpbmcoY29udHJvbF9uYW1lLCBpKSwKKwkJCSAgdmlzaWJsZShtb2RlLT5jX2NjW2NvbnRyb2xfaW5mb1tpXS5vZmZzZXRdKSk7CisJfQorI2lmIFZFT0YgPT0gVk1JTgorCWlmICgobW9kZS0+Y19sZmxhZyAmIElDQU5PTikgPT0gMCkKKyNlbmRpZgorCQl3cmFwZigibWluID0gJXU7IHRpbWUgPSAldTsiLCBtb2RlLT5jX2NjW1ZNSU5dLCBtb2RlLT5jX2NjW1ZUSU1FXSk7CisJbmV3bGluZSgpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9tb2RlX2luZm87ICsraSkgeworCQlpZiAobW9kZV9pbmZvW2ldLmZsYWdzICYgT01JVCkKKwkJCWNvbnRpbnVlOworCQlpZiAobW9kZV9pbmZvW2ldLnR5cGUgIT0gcHJldl90eXBlKSB7CisJCQluZXdsaW5lKCk7CisJCQlwcmV2X3R5cGUgPSBtb2RlX2luZm9baV0udHlwZTsKKwkJfQorCisJCWJpdHNwID0gbW9kZV90eXBlX2ZsYWcobW9kZV9pbmZvW2ldLnR5cGUsIG1vZGUpOworCQltYXNrID0gbW9kZV9pbmZvW2ldLm1hc2sgPyBtb2RlX2luZm9baV0ubWFzayA6IG1vZGVfaW5mb1tpXS5iaXRzOworCQlpZiAoKCpiaXRzcCAmIG1hc2spID09IG1vZGVfaW5mb1tpXS5iaXRzKSB7CisJCQlpZiAoYWxsIHx8IChtb2RlX2luZm9baV0uZmxhZ3MgJiBTQU5FX1VOU0VUKSkKKwkJCQl3cmFwZigiLSVzIisxLCBudGhfc3RyaW5nKG1vZGVfbmFtZSwgaSkpOworCQl9IGVsc2UgeworCQkJaWYgKChhbGwgJiYgbW9kZV9pbmZvW2ldLmZsYWdzICYgUkVWKQorCQkJIHx8ICghYWxsICYmIChtb2RlX2luZm9baV0uZmxhZ3MgJiAoU0FORV9TRVQgfCBSRVYpKSA9PSAoU0FORV9TRVQgfCBSRVYpKQorCQkJKSB7CisJCQkJd3JhcGYoIi0lcyIsIG50aF9zdHJpbmcobW9kZV9uYW1lLCBpKSk7CisJCQl9CisJCX0KKwl9CisJbmV3bGluZSgpOworfQorCitzdGF0aWMgdm9pZCBzYW5lX21vZGUoc3RydWN0IHRlcm1pb3MgKm1vZGUpCit7CisJaW50IGk7CisJdGNmbGFnX3QgKmJpdHNwOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9jb250cm9sX2luZm87ICsraSkgeworI2lmIFZNSU4gPT0gVkVPRgorCQlpZiAoaSA9PSBDSURYX21pbikKKwkJCWJyZWFrOworI2VuZGlmCisJCW1vZGUtPmNfY2NbY29udHJvbF9pbmZvW2ldLm9mZnNldF0gPSBjb250cm9sX2luZm9baV0uc2FuZXZhbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX21vZGVfaW5mbzsgKytpKSB7CisJCWlmIChtb2RlX2luZm9baV0uZmxhZ3MgJiBTQU5FX1NFVCkgeworCQkJYml0c3AgPSBtb2RlX3R5cGVfZmxhZyhtb2RlX2luZm9baV0udHlwZSwgbW9kZSk7CisJCQkqYml0c3AgPSAoKmJpdHNwICYgfigodW5zaWduZWQgbG9uZyltb2RlX2luZm9baV0ubWFzaykpCisJCQkJfCBtb2RlX2luZm9baV0uYml0czsKKwkJfSBlbHNlIGlmIChtb2RlX2luZm9baV0uZmxhZ3MgJiBTQU5FX1VOU0VUKSB7CisJCQliaXRzcCA9IG1vZGVfdHlwZV9mbGFnKG1vZGVfaW5mb1tpXS50eXBlLCBtb2RlKTsKKwkJCSpiaXRzcCA9ICpiaXRzcCAmIH4oKHVuc2lnbmVkIGxvbmcpbW9kZV9pbmZvW2ldLm1hc2spCisJCQkJJiB+bW9kZV9pbmZvW2ldLmJpdHM7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tb2RlKGNvbnN0IHN0cnVjdCBtb2RlX2luZm8gKmluZm8sIGludCByZXZlcnNlZCwKKwkJCQkJc3RydWN0IHRlcm1pb3MgKm1vZGUpCit7CisJdGNmbGFnX3QgKmJpdHNwOworCisJYml0c3AgPSBtb2RlX3R5cGVfZmxhZyhpbmZvLT50eXBlLCBtb2RlKTsKKworCWlmIChiaXRzcCkgeworCQlpZiAocmV2ZXJzZWQpCisJCQkqYml0c3AgPSAqYml0c3AgJiB+aW5mby0+bWFzayAmIH5pbmZvLT5iaXRzOworCQllbHNlCisJCQkqYml0c3AgPSAoKmJpdHNwICYgfmluZm8tPm1hc2spIHwgaW5mby0+Yml0czsKKwkJcmV0dXJuOworCX0KKworCS8qIENvbWJpbmF0aW9uIG1vZGUgKi8KKwlpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9ldmVucF0gfHwgaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9wYXJpdHldKSB7CisJCWlmIChyZXZlcnNlZCkKKwkJCW1vZGUtPmNfY2ZsYWcgPSAobW9kZS0+Y19jZmxhZyAmIH5QQVJFTkIgJiB+Q1NJWkUpIHwgQ1M4OworCQllbHNlCisJCQltb2RlLT5jX2NmbGFnID0gKG1vZGUtPmNfY2ZsYWcgJiB+UEFST0REICYgfkNTSVpFKSB8IFBBUkVOQiB8IENTNzsKKwl9IGVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfb2RkcF0pIHsKKwkJaWYgKHJldmVyc2VkKQorCQkJbW9kZS0+Y19jZmxhZyA9IChtb2RlLT5jX2NmbGFnICYgflBBUkVOQiAmIH5DU0laRSkgfCBDUzg7CisJCWVsc2UKKwkJCW1vZGUtPmNfY2ZsYWcgPSAobW9kZS0+Y19jZmxhZyAmIH5DU0laRSkgfCBDUzcgfCBQQVJPREQgfCBQQVJFTkI7CisJfSBlbHNlIGlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX25sXSkgeworCQlpZiAocmV2ZXJzZWQpIHsKKwkJCW1vZGUtPmNfaWZsYWcgPSAobW9kZS0+Y19pZmxhZyB8IElDUk5MKSAmIH5JTkxDUiAmIH5JR05DUjsKKwkJCW1vZGUtPmNfb2ZsYWcgPSAobW9kZS0+Y19vZmxhZyB8IE9OTENSKSAmIH5PQ1JOTCAmIH5PTkxSRVQ7CisJCX0gZWxzZSB7CisJCQltb2RlLT5jX2lmbGFnID0gbW9kZS0+Y19pZmxhZyAmIH5JQ1JOTDsKKwkJCWlmIChPTkxDUikgbW9kZS0+Y19vZmxhZyA9IG1vZGUtPmNfb2ZsYWcgJiB+T05MQ1I7CisJCX0KKwl9IGVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfZWtdKSB7CisJCW1vZGUtPmNfY2NbVkVSQVNFXSA9IENFUkFTRTsKKwkJbW9kZS0+Y19jY1tWS0lMTF0gPSBDS0lMTDsKKwl9IGVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfc2FuZV0pIHsKKwkJc2FuZV9tb2RlKG1vZGUpOworCX0gZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9jYnJlYWtdKSB7CisJCWlmIChyZXZlcnNlZCkKKwkJCW1vZGUtPmNfbGZsYWcgfD0gSUNBTk9OOworCQllbHNlCisJCQltb2RlLT5jX2xmbGFnICY9IH5JQ0FOT047CisJfSBlbHNlIGlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX3Bhc3M4XSkgeworCQlpZiAocmV2ZXJzZWQpIHsKKwkJCW1vZGUtPmNfY2ZsYWcgPSAobW9kZS0+Y19jZmxhZyAmIH5DU0laRSkgfCBDUzcgfCBQQVJFTkI7CisJCQltb2RlLT5jX2lmbGFnIHw9IElTVFJJUDsKKwkJfSBlbHNlIHsKKwkJCW1vZGUtPmNfY2ZsYWcgPSAobW9kZS0+Y19jZmxhZyAmIH5QQVJFTkIgJiB+Q1NJWkUpIHwgQ1M4OworCQkJbW9kZS0+Y19pZmxhZyAmPSB+SVNUUklQOworCQl9CisJfSBlbHNlIGlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX2xpdG91dF0pIHsKKwkJaWYgKHJldmVyc2VkKSB7CisJCQltb2RlLT5jX2NmbGFnID0gKG1vZGUtPmNfY2ZsYWcgJiB+Q1NJWkUpIHwgQ1M3IHwgUEFSRU5COworCQkJbW9kZS0+Y19pZmxhZyB8PSBJU1RSSVA7CisJCQltb2RlLT5jX29mbGFnIHw9IE9QT1NUOworCQl9IGVsc2UgeworCQkJbW9kZS0+Y19jZmxhZyA9IChtb2RlLT5jX2NmbGFnICYgflBBUkVOQiAmIH5DU0laRSkgfCBDUzg7CisJCQltb2RlLT5jX2lmbGFnICY9IH5JU1RSSVA7CisJCQltb2RlLT5jX29mbGFnICY9IH5PUE9TVDsKKwkJfQorCX0gZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9yYXddIHx8IGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfY29va2VkXSkgeworCQlpZiAoKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfcmF3XSAmJiByZXZlcnNlZCkKKwkJIHx8IChpbmZvID09ICZtb2RlX2luZm9bSURYX2Nvb2tlZF0gJiYgIXJldmVyc2VkKQorCQkpIHsKKwkJCS8qIENvb2tlZCBtb2RlICovCisJCQltb2RlLT5jX2lmbGFnIHw9IEJSS0lOVCB8IElHTlBBUiB8IElTVFJJUCB8IElDUk5MIHwgSVhPTjsKKwkJCW1vZGUtPmNfb2ZsYWcgfD0gT1BPU1Q7CisJCQltb2RlLT5jX2xmbGFnIHw9IElTSUcgfCBJQ0FOT047CisjaWYgVk1JTiA9PSBWRU9GCisJCQltb2RlLT5jX2NjW1ZFT0ZdID0gQ0VPRjsKKyNlbmRpZgorI2lmIFZUSU1FID09IFZFT0wKKwkJCW1vZGUtPmNfY2NbVkVPTF0gPSBDRU9MOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQkvKiBSYXcgbW9kZSAqLworCQkJbW9kZS0+Y19pZmxhZyA9IDA7CisJCQltb2RlLT5jX29mbGFnICY9IH5PUE9TVDsKKwkJCW1vZGUtPmNfbGZsYWcgJj0gfihJU0lHIHwgSUNBTk9OIHwgWENBU0UpOworCQkJbW9kZS0+Y19jY1tWTUlOXSA9IDE7CisJCQltb2RlLT5jX2NjW1ZUSU1FXSA9IDA7CisJCX0KKwl9CisjaWYgSVhBTlkKKwllbHNlIGlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX2RlY2N0bHFdKSB7CisJCWlmIChyZXZlcnNlZCkKKwkJCW1vZGUtPmNfaWZsYWcgfD0gSVhBTlk7CisJCWVsc2UKKwkJCW1vZGUtPmNfaWZsYWcgJj0gfklYQU5ZOworCX0KKyNlbmRpZgorI2lmIFRBQkRMWQorCWVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfdGFic10pIHsKKwkJaWYgKHJldmVyc2VkKQorCQkJbW9kZS0+Y19vZmxhZyA9IChtb2RlLT5jX29mbGFnICYgflRBQkRMWSkgfCBUQUIzOworCQllbHNlCisJCQltb2RlLT5jX29mbGFnID0gKG1vZGUtPmNfb2ZsYWcgJiB+VEFCRExZKSB8IFRBQjA7CisJfQorI2VuZGlmCisjaWYgT1hUQUJTCisJZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF90YWJzXSkgeworCQlpZiAocmV2ZXJzZWQpCisJCQltb2RlLT5jX29mbGFnIHw9IE9YVEFCUzsKKwkJZWxzZQorCQkJbW9kZS0+Y19vZmxhZyAmPSB+T1hUQUJTOworCX0KKyNlbmRpZgorI2lmIFhDQVNFICYmIElVQ0xDICYmIE9MQ1VDCisJZWxzZSBpZiAoaW5mbz09Jm1vZGVfaW5mb1tJRFhfbGNhc2VdIHx8IGluZm89PSZtb2RlX2luZm9bSURYX0xDQVNFXSkgeworCQlpZiAocmV2ZXJzZWQpIHsKKwkJCW1vZGUtPmNfbGZsYWcgJj0gflhDQVNFOworCQkJbW9kZS0+Y19pZmxhZyAmPSB+SVVDTEM7CisJCQltb2RlLT5jX29mbGFnICY9IH5PTENVQzsKKwkJfSBlbHNlIHsKKwkJCW1vZGUtPmNfbGZsYWcgfD0gWENBU0U7CisJCQltb2RlLT5jX2lmbGFnIHw9IElVQ0xDOworCQkJbW9kZS0+Y19vZmxhZyB8PSBPTENVQzsKKwkJfQorCX0KKyNlbmRpZgorCWVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfY3J0XSkgeworCQltb2RlLT5jX2xmbGFnIHw9IEVDSE9FIHwgRUNIT0NUTCB8IEVDSE9LRTsKKwl9IGVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfZGVjXSkgeworCQltb2RlLT5jX2NjW1ZJTlRSXSA9IDM7IC8qIF5DICovCisJCW1vZGUtPmNfY2NbVkVSQVNFXSA9IDEyNzsgLyogREVMICovCisJCW1vZGUtPmNfY2NbVktJTExdID0gMjE7IC8qIF5VICovCisJCW1vZGUtPmNfbGZsYWcgfD0gRUNIT0UgfCBFQ0hPQ1RMIHwgRUNIT0tFOworCQlpZiAoSVhBTlkpIG1vZGUtPmNfaWZsYWcgJj0gfklYQU5ZOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2NvbnRyb2xfY2hhcl9vcl9kaWUoY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyAqaW5mbywKKwkJCWNvbnN0IGNoYXIgKmFyZywgc3RydWN0IHRlcm1pb3MgKm1vZGUpCit7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKKworCWlmIChpbmZvID09ICZjb250cm9sX2luZm9bQ0lEWF9taW5dIHx8IGluZm8gPT0gJmNvbnRyb2xfaW5mb1tDSURYX3RpbWVdKQorCQl2YWx1ZSA9IHhhdG91bF9yYW5nZV9zZngoYXJnLCAwLCAweGZmLCBzdHR5X3N1ZmZpeGVzKTsKKwllbHNlIGlmIChhcmdbMF0gPT0gJ1wwJyB8fCBhcmdbMV0gPT0gJ1wwJykKKwkJdmFsdWUgPSBhcmdbMF07CisJZWxzZSBpZiAoc3RyY21wKGFyZywgIl4tIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAidW5kZWYiKSA9PSAwKQorCQl2YWx1ZSA9IF9QT1NJWF9WRElTQUJMRTsKKwllbHNlIGlmIChhcmdbMF0gPT0gJ14nKSB7IC8qIElnbm9yZSBhbnkgdHJhaWxpbmcganVuayAoXkNqdW5rKSAqLworCQl2YWx1ZSA9IGFyZ1sxXSAmIDB4MWY7IC8qIE5vbi1sZXR0ZXJzIGdldCB3ZWlyZCByZXN1bHRzICovCisJCWlmIChhcmdbMV0gPT0gJz8nKQorCQkJdmFsdWUgPSAxMjc7CisJfSBlbHNlCisJCXZhbHVlID0geGF0b3VsX3JhbmdlX3NmeChhcmcsIDAsIDB4ZmYsIHN0dHlfc3VmZml4ZXMpOworCW1vZGUtPmNfY2NbaW5mby0+b2Zmc2V0XSA9IHZhbHVlOworfQorCisjZGVmaW5lIFNUVFlfcmVxdWlyZV9zZXRfYXR0ciAgICgxIDw8IDApCisjZGVmaW5lIFNUVFlfc3BlZWRfd2FzX3NldCAgICAgICgxIDw8IDEpCisjZGVmaW5lIFNUVFlfdmVyYm9zZV9vdXRwdXQgICAgICgxIDw8IDIpCisjZGVmaW5lIFNUVFlfcmVjb3ZlcmFibGVfb3V0cHV0ICgxIDw8IDMpCisjZGVmaW5lIFNUVFlfbm9hcmdzICAgICAgICAgICAgICgxIDw8IDQpCisKK2ludCBzdHR5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdHR5X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdGVybWlvcyBtb2RlOworCXZvaWQgKCpvdXRwdXRfZnVuYykoY29uc3Qgc3RydWN0IHRlcm1pb3MgKiwgaW50KTsKKwljb25zdCBjaGFyICpmaWxlX25hbWUgPSBOVUxMOworCWludCBkaXNwbGF5X2FsbCA9IDA7CisJaW50IHN0dHlfc3RhdGU7CisJaW50IGs7CisKKwlJTklUX0coKTsKKworCXN0dHlfc3RhdGUgPSBTVFRZX25vYXJnczsKKwlvdXRwdXRfZnVuYyA9IGRvX2Rpc3BsYXk7CisKKwkvKiBGaXJzdCBwYXNzOiBvbmx5IHBhcnNlL3ZlcmlmeSBjb21tYW5kIGxpbmUgcGFyYW1zICovCisJayA9IDA7CisJd2hpbGUgKGFyZ3ZbKytrXSkgeworCQljb25zdCBzdHJ1Y3QgbW9kZV9pbmZvICptcDsKKwkJY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyAqY3A7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3Zba107CisJCWNvbnN0IGNoYXIgKmFyZ25leHQgPSBhcmd2W2srMV07CisJCWludCBwYXJhbTsKKworCQlpZiAoYXJnWzBdID09ICctJykgeworCQkJaW50IGk7CisJCQltcCA9IGZpbmRfbW9kZShhcmcrMSk7CisJCQlpZiAobXApIHsKKwkJCQlpZiAoIShtcC0+ZmxhZ3MgJiBSRVYpKQorCQkJCQlnb3RvIGludmFsaWRfYXJndW1lbnQ7CisJCQkJc3R0eV9zdGF0ZSAmPSB+U1RUWV9ub2FyZ3M7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBJdCBpcyBhbiBvcHRpb24gLSBwYXJzZSBpdCAqLworCQkJaSA9IDA7CisJCQl3aGlsZSAoYXJnWysraV0pIHsKKwkJCQlzd2l0Y2ggKGFyZ1tpXSkgeworCQkJCWNhc2UgJ2EnOgorCQkJCQlzdHR5X3N0YXRlIHw9IFNUVFlfdmVyYm9zZV9vdXRwdXQ7CisJCQkJCW91dHB1dF9mdW5jID0gZG9fZGlzcGxheTsKKwkJCQkJZGlzcGxheV9hbGwgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdnJzoKKwkJCQkJc3R0eV9zdGF0ZSB8PSBTVFRZX3JlY292ZXJhYmxlX291dHB1dDsKKwkJCQkJb3V0cHV0X2Z1bmMgPSBkaXNwbGF5X3JlY292ZXJhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlICdGJzoKKwkJCQkJaWYgKGZpbGVfbmFtZSkKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvbmx5IG9uZSBkZXZpY2UgbWF5IGJlIHNwZWNpZmllZCIpOworCQkJCQlmaWxlX25hbWUgPSAmYXJnW2krMV07IC8qICItRmRldmljZSIgPyAqLworCQkJCQlpZiAoIWZpbGVfbmFtZVswXSkgeyAvKiBub3BlLCAiLUYgZGV2aWNlIiAqLworCQkJCQkJaW50IHAgPSBrKzE7IC8qIGFyZ3ZbcF0gaXMgYXJnbmV4dCAqLworCQkJCQkJZmlsZV9uYW1lID0gYXJnbmV4dDsKKwkJCQkJCWlmICghZmlsZV9uYW1lKQorCQkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsICItRiIpOworCQkJCQkJLyogcmVtb3ZlIC1GIHBhcmFtIGZyb20gYXJnW3ZjXSAqLworCQkJCQkJd2hpbGUgKGFyZ3ZbcF0pIHsKKwkJCQkJCQlhcmd2W3BdID0gYXJndltwKzFdOworCQkJCQkJCSsrcDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlnb3RvIGVuZF9vcHRpb247CisJCQkJZGVmYXVsdDoKKwkJCQkJZ290byBpbnZhbGlkX2FyZ3VtZW50OworCQkJCX0KKwkJCX0KKyBlbmRfb3B0aW9uOgorCQkJY29udGludWU7CisJCX0KKworCQltcCA9IGZpbmRfbW9kZShhcmcpOworCQlpZiAobXApIHsKKwkJCXN0dHlfc3RhdGUgJj0gflNUVFlfbm9hcmdzOworCQkJY29udGludWU7CisJCX0KKworCQljcCA9IGZpbmRfY29udHJvbChhcmcpOworCQlpZiAoY3ApIHsKKwkJCWlmICghYXJnbmV4dCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCBhcmcpOworCQkJLyogY2FsbGVkIGZvciB0aGUgc2lkZSBlZmZlY3Qgb2YgeGZ1bmMgZGVhdGggb25seSAqLworCQkJc2V0X2NvbnRyb2xfY2hhcl9vcl9kaWUoY3AsIGFyZ25leHQsICZtb2RlKTsKKwkJCXN0dHlfc3RhdGUgJj0gflNUVFlfbm9hcmdzOworCQkJKytrOworCQkJY29udGludWU7CisJCX0KKworCQlwYXJhbSA9IGZpbmRfcGFyYW0oYXJnKTsKKwkJaWYgKHBhcmFtICYgcGFyYW1fbmVlZF9hcmcpIHsKKwkJCWlmICghYXJnbmV4dCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCBhcmcpOworCQkJKytrOworCQl9CisKKwkJc3dpdGNoIChwYXJhbSkgeworI2lmZGVmIF9fbGludXhfXworCQljYXNlIHBhcmFtX2xpbmU6CisjIGlmbmRlZiBUSU9DR1dJTlNaCisJCQl4YXRvdWxfcmFuZ2Vfc2Z4KGFyZ25leHQsIDEsIElOVF9NQVgsIHN0dHlfc3VmZml4ZXMpOworCQkJYnJlYWs7CisjIGVuZGlmIC8qIGVsc2UgZmFsbC10aHJvdWdoICovCisjZW5kaWYKKyNpZmRlZiBUSU9DR1dJTlNaCisJCWNhc2UgcGFyYW1fcm93czoKKwkJY2FzZSBwYXJhbV9jb2xzOgorCQljYXNlIHBhcmFtX2NvbHVtbnM6CisJCQl4YXRvdWxfcmFuZ2Vfc2Z4KGFyZ25leHQsIDEsIElOVF9NQVgsIHN0dHlfc3VmZml4ZXMpOworCQkJYnJlYWs7CisJCWNhc2UgcGFyYW1fc2l6ZToKKyNlbmRpZgorCQljYXNlIHBhcmFtX3NwZWVkOgorCQkJYnJlYWs7CisJCWNhc2UgcGFyYW1faXNwZWVkOgorCQkJLyogY2FsbGVkIGZvciB0aGUgc2lkZSBlZmZlY3Qgb2YgeGZ1bmMgZGVhdGggb25seSAqLworCQkJc2V0X3NwZWVkX29yX2RpZShpbnB1dF9zcGVlZCwgYXJnbmV4dCwgJm1vZGUpOworCQkJYnJlYWs7CisJCWNhc2UgcGFyYW1fb3NwZWVkOgorCQkJLyogY2FsbGVkIGZvciB0aGUgc2lkZSBlZmZlY3Qgb2YgeGZ1bmMgZGVhdGggb25seSAqLworCQkJc2V0X3NwZWVkX29yX2RpZShvdXRwdXRfc3BlZWQsIGFyZ25leHQsICZtb2RlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHJlY292ZXJfbW9kZShhcmcsICZtb2RlKSA9PSAxKSBicmVhazsKKwkJCWlmICh0dHlfdmFsdWVfdG9fYmF1ZCh4YXRvdShhcmcpKSAhPSAoc3BlZWRfdCkgLTEpIGJyZWFrOworIGludmFsaWRfYXJndW1lbnQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBhcmd1bWVudCAnJXMnIiwgYXJnKTsKKwkJfQorCQlzdHR5X3N0YXRlICY9IH5TVFRZX25vYXJnczsKKwl9CisKKwkvKiBTcGVjaWZ5aW5nIGJvdGggLWEgYW5kIC1nIGlzIGFuIGVycm9yICovCisJaWYgKChzdHR5X3N0YXRlICYgKFNUVFlfdmVyYm9zZV9vdXRwdXQgfCBTVFRZX3JlY292ZXJhYmxlX291dHB1dCkpID09CisJCShTVFRZX3ZlcmJvc2Vfb3V0cHV0IHwgU1RUWV9yZWNvdmVyYWJsZV9vdXRwdXQpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidmVyYm9zZSBhbmQgc3R0eS1yZWFkYWJsZSBvdXRwdXQgc3R5bGVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiKTsKKwkvKiBTcGVjaWZ5aW5nIC1hIG9yIC1nIHdpdGggbm9uLW9wdGlvbnMgaXMgYW4gZXJyb3IgKi8KKwlpZiAoIShzdHR5X3N0YXRlICYgU1RUWV9ub2FyZ3MpCisJICYmIChzdHR5X3N0YXRlICYgKFNUVFlfdmVyYm9zZV9vdXRwdXQgfCBTVFRZX3JlY292ZXJhYmxlX291dHB1dCkpCisJKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtb2RlcyBtYXkgbm90IGJlIHNldCB3aGVuIHNwZWNpZnlpbmcgYW4gb3V0cHV0IHN0eWxlIik7CisJfQorCisJLyogTm93IGl0IGlzIHNhZmUgdG8gc3RhcnQgZG9pbmcgdGhpbmdzICovCisJaWYgKGZpbGVfbmFtZSkgeworCQlHLmRldmljZV9uYW1lID0gZmlsZV9uYW1lOworCQl4bW92ZV9mZCh4b3Blbl9ub25ibG9ja2luZyhHLmRldmljZV9uYW1lKSwgU1RESU5fRklMRU5PKTsKKwkJbmRlbGF5X29mZihTVERJTl9GSUxFTk8pOworCX0KKworCS8qIEluaXRpYWxpemUgdG8gYWxsIHplcm9lcyBzbyB0aGVyZSBpcyBubyByaXNrIG1lbWNtcCB3aWxsIHJlcG9ydCBhCisJICAgc3B1cmlvdXMgZGlmZmVyZW5jZSBpbiBhbiB1bmluaXRpYWxpemVkIHBvcnRpb24gb2YgdGhlIHN0cnVjdHVyZSAqLworCW1lbXNldCgmbW9kZSwgMCwgc2l6ZW9mKG1vZGUpKTsKKwlpZiAodGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJm1vZGUpKQorCQlwZXJyb3Jfb25fZGV2aWNlX2FuZF9kaWUoIiVzIik7CisKKwlpZiAoc3R0eV9zdGF0ZSAmIChTVFRZX3ZlcmJvc2Vfb3V0cHV0IHwgU1RUWV9yZWNvdmVyYWJsZV9vdXRwdXQgfCBTVFRZX25vYXJncykpIHsKKwkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChTVERPVVRfRklMRU5PLCAmRy5tYXhfY29sLCBOVUxMKTsKKwkJb3V0cHV0X2Z1bmMoJm1vZGUsIGRpc3BsYXlfYWxsKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBTZWNvbmQgcGFzczogcGVyZm9ybSBhY3Rpb25zICovCisJayA9IDA7CisJd2hpbGUgKGFyZ3ZbKytrXSkgeworCQljb25zdCBzdHJ1Y3QgbW9kZV9pbmZvICptcDsKKwkJY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyAqY3A7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3Zba107CisJCWNvbnN0IGNoYXIgKmFyZ25leHQgPSBhcmd2W2srMV07CisJCWludCBwYXJhbTsKKworCQlpZiAoYXJnWzBdID09ICctJykgeworCQkJbXAgPSBmaW5kX21vZGUoYXJnKzEpOworCQkJaWYgKG1wKSB7CisJCQkJc2V0X21vZGUobXAsIDEgLyogcmV2ZXJzZWQgKi8sICZtb2RlKTsKKwkJCQlzdHR5X3N0YXRlIHw9IFNUVFlfcmVxdWlyZV9zZXRfYXR0cjsKKwkJCX0KKwkJCS8qIEl0IGlzIGFuIG9wdGlvbiAtIGFscmVhZHkgcGFyc2VkLiBTa2lwIGl0ICovCisJCQljb250aW51ZTsKKwkJfQorCisJCW1wID0gZmluZF9tb2RlKGFyZyk7CisJCWlmIChtcCkgeworCQkJc2V0X21vZGUobXAsIDAgLyogbm9uLXJldmVyc2VkICovLCAmbW9kZSk7CisJCQlzdHR5X3N0YXRlIHw9IFNUVFlfcmVxdWlyZV9zZXRfYXR0cjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY3AgPSBmaW5kX2NvbnRyb2woYXJnKTsKKwkJaWYgKGNwKSB7CisJCQkrK2s7CisJCQlzZXRfY29udHJvbF9jaGFyX29yX2RpZShjcCwgYXJnbmV4dCwgJm1vZGUpOworCQkJc3R0eV9zdGF0ZSB8PSBTVFRZX3JlcXVpcmVfc2V0X2F0dHI7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBhcmFtID0gZmluZF9wYXJhbShhcmcpOworCQlpZiAocGFyYW0gJiBwYXJhbV9uZWVkX2FyZykgeworCQkJKytrOworCQl9CisKKwkJc3dpdGNoIChwYXJhbSkgeworI2lmZGVmIF9fbGludXhfXworCQljYXNlIHBhcmFtX2xpbmU6CisJCQltb2RlLmNfbGluZSA9IHhhdG91bF9zZngoYXJnbmV4dCwgc3R0eV9zdWZmaXhlcyk7CisJCQlzdHR5X3N0YXRlIHw9IFNUVFlfcmVxdWlyZV9zZXRfYXR0cjsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgVElPQ0dXSU5TWgorCQljYXNlIHBhcmFtX2NvbHM6CisJCWNhc2UgcGFyYW1fY29sdW1uczoKKwkJCXNldF93aW5kb3dfc2l6ZSgtMSwgeGF0b3VsX3NmeChhcmduZXh0LCBzdHR5X3N1ZmZpeGVzKSk7CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9zaXplOgorCQkJZGlzcGxheV93aW5kb3dfc2l6ZSgwKTsKKwkJCWJyZWFrOworCQljYXNlIHBhcmFtX3Jvd3M6CisJCQlzZXRfd2luZG93X3NpemUoeGF0b3VsX3NmeChhcmduZXh0LCBzdHR5X3N1ZmZpeGVzKSwgLTEpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBwYXJhbV9zcGVlZDoKKwkJCWRpc3BsYXlfc3BlZWQoJm1vZGUsIDApOworCQkJYnJlYWs7CisJCWNhc2UgcGFyYW1faXNwZWVkOgorCQkJc2V0X3NwZWVkX29yX2RpZShpbnB1dF9zcGVlZCwgYXJnbmV4dCwgJm1vZGUpOworCQkJc3R0eV9zdGF0ZSB8PSAoU1RUWV9yZXF1aXJlX3NldF9hdHRyIHwgU1RUWV9zcGVlZF93YXNfc2V0KTsKKwkJCWJyZWFrOworCQljYXNlIHBhcmFtX29zcGVlZDoKKwkJCXNldF9zcGVlZF9vcl9kaWUob3V0cHV0X3NwZWVkLCBhcmduZXh0LCAmbW9kZSk7CisJCQlzdHR5X3N0YXRlIHw9IChTVFRZX3JlcXVpcmVfc2V0X2F0dHIgfCBTVFRZX3NwZWVkX3dhc19zZXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAocmVjb3Zlcl9tb2RlKGFyZywgJm1vZGUpID09IDEpCisJCQkJc3R0eV9zdGF0ZSB8PSBTVFRZX3JlcXVpcmVfc2V0X2F0dHI7CisJCQllbHNlIC8qIHRydWU6IGlmICh0dHlfdmFsdWVfdG9fYmF1ZCh4YXRvdShhcmcpKSAhPSAoc3BlZWRfdCkgLTEpICoveworCQkJCXNldF9zcGVlZF9vcl9kaWUoYm90aF9zcGVlZHMsIGFyZywgJm1vZGUpOworCQkJCXN0dHlfc3RhdGUgfD0gKFNUVFlfcmVxdWlyZV9zZXRfYXR0ciB8IFNUVFlfc3BlZWRfd2FzX3NldCk7CisJCQl9IC8qIGVsc2UgLSBpbXBvc3NpYmxlIChjYXVnaHQgaW4gdGhlIGZpcnN0IHBhc3MpOgorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGFyZ3VtZW50ICclcyciLCBhcmcpOyAqLworCQl9CisJfQorCisJaWYgKHN0dHlfc3RhdGUgJiBTVFRZX3JlcXVpcmVfc2V0X2F0dHIpIHsKKwkJc3RydWN0IHRlcm1pb3MgbmV3X21vZGU7CisKKwkJaWYgKHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FEUkFJTiwgJm1vZGUpKQorCQkJcGVycm9yX29uX2RldmljZV9hbmRfZGllKCIlcyIpOworCisJCS8qIFBPU0lYIChhY2NvcmRpbmcgdG8gWmxvdG5pY2sncyBib29rKSB0Y3NldGF0dHIgcmV0dXJucyB6ZXJvIGlmCisJCSAgIGl0IHBlcmZvcm1zICphbnkqIG9mIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9ucy4gIFRoaXMgbWVhbnMgaXQKKwkJICAgY2FuIHJlcG9ydCAnc3VjY2Vzcycgd2hlbiBpdCBoYXMgYWN0dWFsbHkgZmFpbGVkIHRvIHBlcmZvcm0KKwkJICAgc29tZSBwcm9wZXIgc3Vic2V0IG9mIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9ucy4gIFRvIGRldGVjdAorCQkgICB0aGlzIHBhcnRpYWwgZmFpbHVyZSwgZ2V0IHRoZSBjdXJyZW50IHRlcm1pbmFsIGF0dHJpYnV0ZXMgYW5kCisJCSAgIGNvbXBhcmUgdGhlbSB0byB0aGUgcmVxdWVzdGVkIG9uZXMgKi8KKworCQkvKiBJbml0aWFsaXplIHRvIGFsbCB6ZXJvZXMgc28gdGhlcmUgaXMgbm8gcmlzayBtZW1jbXAgd2lsbCByZXBvcnQgYQorCQkgICBzcHVyaW91cyBkaWZmZXJlbmNlIGluIGFuIHVuaW5pdGlhbGl6ZWQgcG9ydGlvbiBvZiB0aGUgc3RydWN0dXJlICovCisJCW1lbXNldCgmbmV3X21vZGUsIDAsIHNpemVvZihuZXdfbW9kZSkpOworCQlpZiAodGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJm5ld19tb2RlKSkKKwkJCXBlcnJvcl9vbl9kZXZpY2VfYW5kX2RpZSgiJXMiKTsKKworCQlpZiAobWVtY21wKCZtb2RlLCAmbmV3X21vZGUsIHNpemVvZihtb2RlKSkgIT0gMCkgeworI2lmIENJQkFVRAorCQkJLyogU3VuT1MgNC4xLjMgKGF0IGxlYXN0KSBoYXMgdGhlIHByb2JsZW0gdGhhdCBhZnRlciB0aGlzIHNlcXVlbmNlLAorCQkJICAgdGNnZXRhdHRyICgmbTEpOyB0Y3NldGF0dHIgKCZtMSk7IHRjZ2V0YXR0ciAoJm0yKTsKKwkJCSAgIHNvbWV0aW1lcyAobTEgIT0gbTIpLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyBpbiB0aGUgZm91ciBiaXRzCisJCQkgICBvZiB0aGUgY19jZmxhZyBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBiYXVkIHJhdGUuICBUbyBzYXZlCisJCQkgICBTdW4gdXNlcnMgYSBsaXR0bGUgY29uZnVzaW9uLCBkb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgdGhpcworCQkJICAgaGFwcGVucy4gIEJ1dCBzdXBwcmVzcyB0aGUgZXJyb3Igb25seSBpZiB3ZSBoYXZlbid0IHRyaWVkIHRvCisJCQkgICBzZXQgdGhlIGJhdWQgcmF0ZSBleHBsaWNpdGx5IC0tIG90aGVyd2lzZSB3ZSdkIG5ldmVyIGdpdmUgYW4KKwkJCSAgIGVycm9yIGZvciBhIHRydWUgZmFpbHVyZSB0byBzZXQgdGhlIGJhdWQgcmF0ZSAqLworCisJCQluZXdfbW9kZS5jX2NmbGFnICY9ICh+Q0lCQVVEKTsKKwkJCWlmICgoc3R0eV9zdGF0ZSAmIFNUVFlfc3BlZWRfd2FzX3NldCkKKwkJCSB8fCBtZW1jbXAoJm1vZGUsICZuZXdfbW9kZSwgc2l6ZW9mKG1vZGUpKSAhPSAwKQorI2VuZGlmCisJCQkJcGVycm9yX29uX2RldmljZV9hbmRfZGllKCIlczogY2Fubm90IHBlcmZvcm0gYWxsIHJlcXVlc3RlZCBvcGVyYXRpb25zIik7CisJCX0KKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3N1bS5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3N1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTEwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc3VtLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHN1bSAtLSBjaGVja3N1bSBhbmQgY291bnQgdGhlIGJsb2NrcyBpbiBhIGZpbGUKKyAqICAgICBMaWtlIEJTRCBzdW0gb3IgU3lzViBzdW0gLXIsIGV4Y2VwdCBsaWtlIFN5c1Ygc3VtIGlmIC1zIG9wdGlvbiBpcyBnaXZlbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDg2LCA4OSwgOTEsIDE5OTUtMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorICoKKyAqIFdyaXR0ZW4gYnkgS2F5dmFuIEFnaGFpZXBvdXIgYW5kIERhdmlkIE1hY0tlbnppZQorICogVGFrZW4gZnJvbSBjb3JldXRpbHMgYW5kIHR1cm5lZCBpbnRvIGEgYnVzeWJveCBhcHBsZXQgYnkgTWlrZSBGcnlzaW5nZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzdW1fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstcnNdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzdW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGVja3N1bSBhbmQgY291bnQgdGhlIGJsb2NrcyBpbiBhIGZpbGVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJVXNlIEJTRCBzdW0gYWxnb3JpdGhtICgxSyBibG9ja3MpIgorLy91c2FnZTogICAgICJcbgktcwlVc2UgU3lzdGVtIFYgc3VtIGFsZ29yaXRobSAoNTEyYnl0ZSBibG9ja3MpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZW51bSB7IFNVTV9CU0QsIFBSSU5UX05BTUUsIFNVTV9TWVNWIH07CisKKy8qIEJTRDogY2FsY3VsYXRlIGFuZCBwcmludCB0aGUgcm90YXRlZCBjaGVja3N1bSBhbmQgdGhlIHNpemUgaW4gMUsgYmxvY2tzCisgICBUaGUgY2hlY2tzdW0gdmFyaWVzIGRlcGVuZGluZyBvbiBzaXplb2YgKGludCkuICovCisvKiBTWVNWOiBjYWxjdWxhdGUgYW5kIHByaW50IHRoZSBjaGVja3N1bSBhbmQgdGhlIHNpemUgaW4gNTEyLWJ5dGUgYmxvY2tzICovCisvKiBSZXR1cm4gMSBpZiBzdWNjZXNzZnVsLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBzdW1fZmlsZShjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCB0eXBlKQoreworI2RlZmluZSBidWYgYmJfY29tbW9uX2J1ZnNpejEKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfYnl0ZXMgPSAwOworCWludCBmZCwgcjsKKwkvKiBUaGUgc3VtIG9mIGFsbCB0aGUgaW5wdXQgYnl0ZXMsIG1vZHVsbyAoVUlOVF9NQVggKyAxKS4gICovCisJdW5zaWduZWQgcyA9IDA7CisKKwlmZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbihmaWxlKTsKKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiAwOworCisJd2hpbGUgKDEpIHsKKwkJc2l6ZV90IGJ5dGVzX3JlYWQgPSBzYWZlX3JlYWQoZmQsIGJ1ZiwgQlVGU0laKTsKKworCQlpZiAoKHNzaXplX3QpYnl0ZXNfcmVhZCA8PSAwKSB7CisJCQlyID0gKGZkICYmIGNsb3NlKGZkKSAhPSAwKTsKKwkJCWlmICghYnl0ZXNfcmVhZCAmJiAhcikKKwkJCQkvKiBubyBlcnJvciAqLworCQkJCWJyZWFrOworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXRvdGFsX2J5dGVzICs9IGJ5dGVzX3JlYWQ7CisJCWlmICh0eXBlID49IFNVTV9TWVNWKSB7CisJCQlkbyBzICs9IGJ1ZlstLWJ5dGVzX3JlYWRdOyB3aGlsZSAoYnl0ZXNfcmVhZCk7CisJCX0gZWxzZSB7CisJCQlyID0gMDsKKwkJCWRvIHsKKwkJCQlzID0gKHMgPj4gMSkgKyAoKHMgJiAxKSA8PCAxNSk7CisJCQkJcyArPSBidWZbcisrXTsKKwkJCQlzICY9IDB4ZmZmZjsgLyogS2VlcCBpdCB3aXRoaW4gYm91bmRzLiAqLworCQkJfSB3aGlsZSAoLS1ieXRlc19yZWFkKTsKKwkJfQorCX0KKworCWlmICh0eXBlIDwgUFJJTlRfTkFNRSkKKwkJZmlsZSA9ICIiOworCWlmICh0eXBlID49IFNVTV9TWVNWKSB7CisJCXIgPSAocyAmIDB4ZmZmZikgKyAoKHMgJiAweGZmZmZmZmZmKSA+PiAxNik7CisJCXMgPSAociAmIDB4ZmZmZikgKyAociA+PiAxNik7CisJCXByaW50ZigiJWQgJWxsdSAlc1xuIiwgcywgKHRvdGFsX2J5dGVzICsgNTExKSAvIDUxMiwgZmlsZSk7CisJfSBlbHNlCisJCXByaW50ZigiJTA1ZCAlNWxsdSAlc1xuIiwgcywgKHRvdGFsX2J5dGVzICsgMTAyMykgLyAxMDI0LCBmaWxlKTsKKwlyZXR1cm4gMTsKKyN1bmRlZiBidWYKK30KKworaW50IHN1bV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3VtX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBuOworCXVuc2lnbmVkIHR5cGUgPSBTVU1fQlNEOworCisJbiA9IGdldG9wdDMyKGFyZ3YsICJzciIpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChuICYgMSkgdHlwZSA9IFNVTV9TWVNWOworCS8qIGdpdmUgdGhlIGJzZCBwcmlvcml0eSBvdmVyIHN5c3YgZnVuYyAqLworCWlmIChuICYgMikgdHlwZSA9IFNVTV9CU0Q7CisKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJLyogRG8gbm90IHByaW50IHRoZSBuYW1lICovCisJCW4gPSBzdW1fZmlsZSgiLSIsIHR5cGUpOworCX0gZWxzZSB7CisJCS8qIE5lZWQgdG8gcHJpbnQgdGhlIG5hbWUgaWYgZWl0aGVyCisJCSAgIC0gbW9yZSB0aGFuIG9uZSBmaWxlIGdpdmVuCisJCSAgIC0gZG9pbmcgc3lzdiAqLworCQl0eXBlICs9IChhcmd2WzFdIHx8IHR5cGUgPT0gU1VNX1NZU1YpOworCQluID0gMTsKKwkJZG8geworCQkJbiAmPSBzdW1fZmlsZSgqYXJndiwgdHlwZSk7CisJCX0gd2hpbGUgKCorK2FyZ3YpOworCX0KKwlyZXR1cm4gIW47Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvc3luYy5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDk4YTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3N5bmMuYwpAQCAtMCwwICsxLDMwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHN5bmMgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgQnJ1Y2UgUGVyZW5zIDxicnVjZUBwaXhhci5jb20+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BIC0tIE1hdGNoZXMgR05VIGJlaGF2aW9yLiAqLworCisvL3VzYWdlOiNkZWZpbmUgc3luY190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHN5bmNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJXcml0ZSBhbGwgYnVmZmVyZWQgYmxvY2tzIHRvIGRpc2siCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgc3luY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3luY19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgSUZfTk9UX0RFU0tUT1AoVU5VU0VEX1BBUkFNKSkKK3sKKwkvKiBjb3JldXRpbHMtNi45IGNvbXBhdCAqLworCWJiX3dhcm5faWdub3JpbmdfYXJncyhhcmd2WzFdKTsKKworCXN5bmMoKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGFjLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkNjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy90YWMuYwpAQCAtMCwwICsxLDExMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGFjIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBZYW5nIFhpYW9wZW5nICA8eXhwIGF0IGhhbndhbmcuY29tLmNuPgorICogQ29weXJpZ2h0IChDKSAyMDA3ICBOYXRhbmFlbCBDb3BhICA8bmF0YW5hZWwuY29wYUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIFRpdG8gUmFndXNhICAgIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqLworCisvKiB0YWMgLSBjb25jYXRlbmF0ZSBhbmQgcHJpbnQgZmlsZXMgaW4gcmV2ZXJzZSAqLworCisvKiBCYXNlZCBvbiBZYW5nIFhpYW9wZW5nJ3MgKHl4cCBhdCBoYW53YW5nLmNvbS5jbikgcGF0Y2gKKyAqIGh0dHA6Ly93d3cudWNsaWJjLm9yZy9saXN0cy9idXN5Ym94LzIwMDMtSnVseS8wMDg4MTMuaHRtbAorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0YWNfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB0YWNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CSJDb25jYXRlbmF0ZSBGSUxFcyBhbmQgcHJpbnQgdGhlbSBpbiByZXZlcnNlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworc3RydWN0IGxzdHJpbmcgeworCWludCBzaXplOworCWNoYXIgYnVmWzFdOworfTsKKworaW50IHRhY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGFjX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqbmFtZTsKKwlGSUxFICpmOworCXN0cnVjdCBsc3RyaW5nICpsaW5lID0gTlVMTDsKKwlsbGlzdF90ICpsaXN0ID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisjaWYgRU5BQkxFX0RFU0tUT1AKKy8qIHRhYyBmcm9tIGNvcmV1dGlscyA2Ljkgc3VwcG9ydHM6CisgICAgICAgLWIsIC0tYmVmb3JlCisgICAgICAgICAgICAgIGF0dGFjaCB0aGUgc2VwYXJhdG9yIGJlZm9yZSBpbnN0ZWFkIG9mIGFmdGVyCisgICAgICAgLXIsIC0tcmVnZXgKKyAgICAgICAgICAgICAgaW50ZXJwcmV0IHRoZSBzZXBhcmF0b3IgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAtcywgLS1zZXBhcmF0b3I9U1RSSU5HCisgICAgICAgICAgICAgIHVzZSBTVFJJTkcgYXMgdGhlIHNlcGFyYXRvciBpbnN0ZWFkIG9mIG5ld2xpbmUKK1dlIHN1cHBvcnQgbm9uZSwgYnV0IGF0IGxlYXN0IHdlIHdpbGwgY29tcGxhaW4gb3IgaGFuZGxlICItLSI6CisqLworCWdldG9wdDMyKGFyZ3YsICIiKTsKKwlhcmd2ICs9IG9wdGluZDsKKyNlbHNlCisJYXJndisrOworI2VuZGlmCisJaWYgKCEqYXJndikKKwkJKi0tYXJndiA9IChjaGFyICopIi0iOworCS8qIFdlIHdpbGwgcmVhZCBmcm9tIGxhc3QgZmlsZSB0byBmaXJzdCAqLworCW5hbWUgPSBhcmd2OworCXdoaWxlICgqbmFtZSkKKwkJbmFtZSsrOworCisJZG8geworCQlpbnQgY2gsIGk7CisKKwkJbmFtZS0tOworCQlmID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqbmFtZSk7CisJCWlmIChmID09IE5VTEwpIHsKKwkJCS8qIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZCBieSBmb3Blbl9vcl93YXJuX3N0ZGluICovCisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVycm5vID0gaSA9IDA7CisJCWRvIHsKKwkJCWNoID0gZmdldGMoZik7CisJCQlpZiAoY2ggIT0gRU9GKSB7CisJCQkJaWYgKCEoaSAmIDB4N2YpKQorCQkJCQkvKiBHcm93IG9uIGV2ZXJ5IDEyOHRoIGNoYXIgKi8KKwkJCQkJbGluZSA9IHhyZWFsbG9jKGxpbmUsIGkgKyAweDdmICsgc2l6ZW9mKGludCkgKyAxKTsKKwkJCQlsaW5lLT5idWZbaSsrXSA9IGNoOworCQkJfQorCQkJaWYgKGNoID09ICdcbicgfHwgKGNoID09IEVPRiAmJiBpICE9IDApKSB7CisJCQkJbGluZSA9IHhyZWFsbG9jKGxpbmUsIGkgKyBzaXplb2YoaW50KSk7CisJCQkJbGluZS0+c2l6ZSA9IGk7CisJCQkJbGxpc3RfYWRkX3RvKCZsaXN0LCBsaW5lKTsKKwkJCQlsaW5lID0gTlVMTDsKKwkJCQlpID0gMDsKKwkJCX0KKwkJfSB3aGlsZSAoY2ggIT0gRU9GKTsKKwkJLyogZmdldGMgc2V0cyBlcnJubyB0byBFTk9FTlQgb24gRU9GLCB3ZSBkb24ndCB3YW50CisJCSAqIHRvIHdhcm4gb24gdGhpcyBub24tZXJyb3IhICovCisJCWlmIChlcnJubyAmJiBlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCpuYW1lKTsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gd2hpbGUgKG5hbWUgIT0gYXJndik7CisKKwl3aGlsZSAobGlzdCkgeworCQlsaW5lID0gKHN0cnVjdCBsc3RyaW5nICopbGlzdC0+ZGF0YTsKKwkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGxpbmUtPmJ1ZiwgbGluZS0+c2l6ZSk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQkJZnJlZShsbGlzdF9wb3AoJmxpc3QpKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3QgPSBsaXN0LT5saW5rOworCQl9CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy90YWlsLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzY2VjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGFpbC5jCkBAIC0wLDAgKzEsMzgyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHRhaWwgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAobmVlZCBmYW5jeSBmb3IgLWMpICovCisvKiBCQl9BVURJVCBHTlUgY29tcGF0aWJsZSAtYywgLXEsIGFuZCAtdiBvcHRpb25zIGluICdmYW5jeScgY29uZmlndXJhdGlvbi4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdGFpbC5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogUHJldHR5IG11Y2ggcmV3cml0dGVuIHRvIGZpeCBudW1lcm91cyBidWdzIGFuZCByZWR1Y2UgcmVhbGxvYygpIGNhbGxzLgorICogQnVncyBmaXhlZCAoYWx0aG91Z2ggSSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gb25lIG9yIHR3by4uLiBpdCB3YXMgcHJldHR5IGJhZCkKKyAqIDEpIG1peGluZyBwcmludGYvd3JpdGUgd2l0aG91dCBmZmx1c2goKWluZyBzdGRvdXQKKyAqIDIpIG5vIGNoZWNrIHRoYXQgYW55IG9wZW4gZmlsZXMgYXJlIHByZXNlbnQKKyAqIDMpIG9wdHN0cmluZyBoYWQgLXEgdGFraW5nIGFuIGFyZworICogNCkgbm8gZXJyb3IgY2hlY2tpbmcgb24gd3JpdGUgaW4gc29tZSBjYXNlcywgYW5kIGEgd2FybmluZyBldmVuIHRoZW4KKyAqIDUpIHEgYW5kIHMgaW50ZXJhY3Rpb24gYnVnCisgKiA2KSBubyBjaGVjayBmb3IgbHNlZWsgZXJyb3IKKyAqIDcpIGxzZWVrIGF0dGVtcHRlZCB3aGVuIGNvdW50PT0wIGV2ZW4gaWYgYXJnIHdhcyArMCAoZnJvbSB0b3ApCisgKi8KKworLy91c2FnZTojZGVmaW5lIHRhaWxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdGFpbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IGxhc3QgMTAgbGluZXMgb2YgZWFjaCBGSUxFIChvciBzdGRpbikgdG8gc3Rkb3V0LlxuIgorLy91c2FnZTogICAgICAgIldpdGggbW9yZSB0aGFuIG9uZSBGSUxFLCBwcmVjZWRlIGVhY2ggd2l0aCBhIGZpbGVuYW1lIGhlYWRlci5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJCVByaW50IGRhdGEgYXMgZmlsZSBncm93cyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfVEFJTCgKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0VDT05EUwlXYWl0IFNFQ09ORFMgYmV0d2VlbiByZWFkcyB3aXRoIC1mIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbiBOW2tibV0JUHJpbnQgbGFzdCBOIGxpbmVzIgorLy91c2FnZToJSUZfRkVBVFVSRV9GQU5DWV9UQUlMKAorLy91c2FnZTogICAgICJcbgktYyBOW2tibV0JUHJpbnQgbGFzdCBOIGJ5dGVzIgorLy91c2FnZTogICAgICJcbgktcQkJTmV2ZXIgcHJpbnQgaGVhZGVycyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCUFsd2F5cyBwcmludCBoZWFkZXJzIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5OIG1heSBiZSBzdWZmaXhlZCBieSBrICh4MTAyNCksIGIgKHg1MTIpLCBvciBtICh4MTAyNF4yKS4iCisvL3VzYWdlOiAgICAgIlxuSWYgTiBzdGFydHMgd2l0aCBhICcrJywgb3V0cHV0IGJlZ2lucyB3aXRoIHRoZSBOdGggaXRlbSBmcm9tIHRoZSBzdGFydCIKKy8vdXNhZ2U6ICAgICAiXG5vZiBlYWNoIGZpbGUsIG5vdCBmcm9tIHRoZSBlbmQuIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0YWlsX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHRhaWwgLW4gMSAvZXRjL3Jlc29sdi5jb25mXG4iCisvL3VzYWdlOiAgICAgICAibmFtZXNlcnZlciAxMC4wLjAuMVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCB0YWlsX3N1ZmZpeGVzW10gPSB7CisJeyAiYiIsIDUxMiB9LAorCXsgImsiLCAxMDI0IH0sCisJeyAibSIsIDEwMjQqMTAyNCB9LAorCXsgIiIsIDAgfQorfTsKKworc3RydWN0IGdsb2JhbHMgeworCWJvb2wgZnJvbV90b3A7CisJYm9vbCBleGl0Y29kZTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisKK3N0YXRpYyB2b2lkIHRhaWxfeHByaW50X2hlYWRlcihjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWlmIChmZHByaW50ZihTVERPVVRfRklMRU5PLCBmbXQsIGZpbGVuYW1lKSA8IDApCisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRhaWxfcmVhZChpbnQgZmQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcjsKKwlvZmZfdCBjdXJyZW50OworCXN0cnVjdCBzdGF0IHNidWY7CisKKwkvKiAvcHJvYyBmaWxlcyByZXBvcnQgemVybyBzdF9zaXplLCBkb24ndCBsc2VlayB0aGVtLiAqLworCWlmIChmc3RhdChmZCwgJnNidWYpID09IDAgJiYgc2J1Zi5zdF9zaXplID4gMCkgeworCQljdXJyZW50ID0gbHNlZWsoZmQsIDAsIFNFRUtfQ1VSKTsKKwkJaWYgKHNidWYuc3Rfc2l6ZSA8IGN1cnJlbnQpCisJCQl4bHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwl9CisKKwlyID0gZnVsbF9yZWFkKGZkLCBidWYsIGNvdW50KTsKKwlpZiAociA8IDApIHsKKwkJYmJfcGVycm9yX21zZyhiYl9tc2dfcmVhZF9lcnJvcik7CisJCUcuZXhpdGNvZGUgPSBFWElUX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIHI7Cit9CisKKyNkZWZpbmUgaGVhZGVyX2ZtdF9zdHIgIlxuPT0+ICVzIDw9PVxuIgorCitzdGF0aWMgdW5zaWduZWQgZWF0X251bShjb25zdCBjaGFyICpwKQoreworCWlmICgqcCA9PSAnLScpCisJCXArKzsKKwllbHNlIGlmICgqcCA9PSAnKycpIHsKKwkJcCsrOworCQlHLmZyb21fdG9wID0gMTsKKwl9CisJcmV0dXJuIHhhdG91X3NmeChwLCB0YWlsX3N1ZmZpeGVzKTsKK30KKworaW50IHRhaWxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRhaWxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgY291bnQgPSAxMDsKKwl1bnNpZ25lZCBzbGVlcF9wZXJpb2QgPSAxOworCWNvbnN0IGNoYXIgKnN0cl9jLCAqc3RyX247CisKKwljaGFyICp0YWlsYnVmOworCXNpemVfdCB0YWlsYnVmc2l6ZTsKKwl1bnNpZ25lZCBoZWFkZXJfdGhyZXNoaG9sZCA9IDE7CisJdW5zaWduZWQgbmZpbGVzOworCWludCBpLCBvcHQ7CisKKwlpbnQgKmZkczsKKwljb25zdCBjaGFyICpmbXQ7CisKKyNpZiBFTkFCTEVfSU5DTFVERV9TVVN2MiB8fCBFTkFCTEVfRkVBVFVSRV9GQU5DWV9UQUlMCisJLyogQWxsb3cgbGVnYWN5IHN5bnRheCBvZiBhbiBpbml0aWFsIG51bWVyaWMgb3B0aW9uIHdpdGhvdXQgLW4uICovCisJaWYgKGFyZ3ZbMV0gJiYgKGFyZ3ZbMV1bMF0gPT0gJysnIHx8IGFyZ3ZbMV1bMF0gPT0gJy0nKQorCSAmJiBpc2RpZ2l0KGFyZ3ZbMV1bMV0pCisJKSB7CisJCWNvdW50ID0gZWF0X251bShhcmd2WzFdKTsKKwkJYXJndisrOworCQlhcmdjLS07CisJfQorI2VuZGlmCisKKwkvKiAtcyBOVU0sIC1GIGltbGllcyAtZiAqLworCUlGX0ZFQVRVUkVfRkFOQ1lfVEFJTChvcHRfY29tcGxlbWVudGFyeSA9ICJzKzpGZiI7KQorCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmYzpuOiIgSUZfRkVBVFVSRV9GQU5DWV9UQUlMKCJxczp2RiIpLAorCQkJJnN0cl9jLCAmc3RyX24gSUZfRkVBVFVSRV9GQU5DWV9UQUlMKCwmc2xlZXBfcGVyaW9kKSk7CisjZGVmaW5lIEZPTExPVyAob3B0ICYgMHgxKQorI2RlZmluZSBDT1VOVF9CWVRFUyAob3B0ICYgMHgyKQorCS8vaWYgKG9wdCAmIDB4MSkgLy8gLWYKKwlpZiAob3B0ICYgMHgyKSBjb3VudCA9IGVhdF9udW0oc3RyX2MpOyAvLyAtYworCWlmIChvcHQgJiAweDQpIGNvdW50ID0gZWF0X251bShzdHJfbik7IC8vIC1uCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfVEFJTAorCS8qIHE6IG1ha2UgaXQgaW1wb3NzaWJsZSBmb3IgbmZpbGVzIHRvIGJlID4gaGVhZGVyX3RocmVzaGhvbGQgKi8KKwlpZiAob3B0ICYgMHg4KSBoZWFkZXJfdGhyZXNoaG9sZCA9IFVJTlRfTUFYOyAvLyAtcQorCS8vaWYgKG9wdCAmIDB4MTApIC8vIC1zCisJaWYgKG9wdCAmIDB4MjApIGhlYWRlcl90aHJlc2hob2xkID0gMDsgLy8gLXYKKyMgZGVmaW5lIEZPTExPV19SRVRSWSAob3B0ICYgMHg0MCkKKyNlbHNlCisjIGRlZmluZSBGT0xMT1dfUkVUUlkgMAorI2VuZGlmCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBvcGVuIGFsbCB0aGUgZmlsZXMgKi8KKwlmZHMgPSB4bWFsbG9jKHNpemVvZihmZHNbMF0pICogKGFyZ2MgKyAxKSk7CisJaWYgKCFhcmd2WzBdKSB7CisJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwkJaWYgKGZzdGF0KFNURElOX0ZJTEVOTywgJnN0YXRidWYpID09IDAKKwkJICYmIFNfSVNGSUZPKHN0YXRidWYuc3RfbW9kZSkKKwkJKSB7CisJCQlvcHQgJj0gfjE7IC8qIGNsZWFyIEZPTExPVyAqLworCQl9CisJCWFyZ3ZbMF0gPSAoY2hhciAqKSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJfQorCW5maWxlcyA9IGkgPSAwOworCWRvIHsKKwkJaW50IGZkID0gb3Blbl9vcl93YXJuX3N0ZGluKGFyZ3ZbaV0pOworCQlpZiAoZmQgPCAwICYmICFGT0xMT1dfUkVUUlkpIHsKKwkJCUcuZXhpdGNvZGUgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCQlmZHNbbmZpbGVzXSA9IGZkOworCQlhcmd2W25maWxlcysrXSA9IGFyZ3ZbaV07CisJfSB3aGlsZSAoKytpIDwgYXJnYyk7CisKKwlpZiAoIW5maWxlcykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIGZpbGVzIik7CisKKwkvKiBwcmVwYXJlIHRoZSBidWZmZXIgKi8KKwl0YWlsYnVmc2l6ZSA9IEJVRlNJWjsKKwlpZiAoIUcuZnJvbV90b3AgJiYgQ09VTlRfQllURVMpIHsKKwkJaWYgKHRhaWxidWZzaXplIDwgY291bnQgKyBCVUZTSVopIHsKKwkJCXRhaWxidWZzaXplID0gY291bnQgKyBCVUZTSVo7CisJCX0KKwl9CisJLyogdGFpbCAtYzEwMjRtIFJFR1VMQVJfRklMRSBkb2Vzbid0IHJlYWxseSBuZWVkIDFHIG1lbSBibG9jay4KKwkgKiAoSW4gZmFjdCwgaXQgZG9lc24ndCBuZWVkIEFOWSBtZW1vcnkpLiBTbyBkZWxheSBhbGxvY2F0aW9uLgorCSAqLworCXRhaWxidWYgPSBOVUxMOworCisJLyogdGFpbCB0aGUgZmlsZXMgKi8KKworCWZtdCA9IGhlYWRlcl9mbXRfc3RyICsgMTsgLyogc2tpcCBsZWFkaW5nIG5ld2xpbmUgaW4gdGhlIGhlYWRlciBvbiB0aGUgZmlyc3Qgb3V0cHV0ICovCisJaSA9IDA7CisJZG8geworCQljaGFyICpidWY7CisJCWludCB0YWlsbGVuOworCQlpbnQgbmV3bGluZXNfc2VlbjsKKwkJdW5zaWduZWQgc2VlbjsKKwkJaW50IG5yZWFkOworCQlpbnQgZmQgPSBmZHNbaV07CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0ZBTkNZX1RBSUwgJiYgZmQgPCAwKQorCQkJY29udGludWU7IC8qIG1heSBoYXBwZW4gd2l0aCAtRiAqLworCisJCWlmIChuZmlsZXMgPiBoZWFkZXJfdGhyZXNoaG9sZCkgeworCQkJdGFpbF94cHJpbnRfaGVhZGVyKGZtdCwgYXJndltpXSk7CisJCQlmbXQgPSBoZWFkZXJfZm10X3N0cjsKKwkJfQorCisJCWlmICghRy5mcm9tX3RvcCkgeworCQkJb2ZmX3QgY3VycmVudCA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7CisJCQlpZiAoY3VycmVudCA+IDApIHsKKwkJCQl1bnNpZ25lZCBvZmY7CisJCQkJaWYgKENPVU5UX0JZVEVTKSB7CisJCQkJLyogT3B0aW1pemluZyBjb3VudC1ieXRlcyBjYXNlIGlmIHRoZSBmaWxlIGlzIHNlZWthYmxlLgorCQkJCSAqIEJld2FyZSBvZiBiYWNraW5nIHVwIHRvbyBmYXIuCisJCQkJICogQWxzbyB3ZSBleGNsdWRlIGZpbGVzIHdpdGggc2l6ZSAwIChiZWNhdXNlIG9mIC9wcm9jL3h4eCkgKi8KKwkJCQkJaWYgKGNvdW50ID09IDApCisJCQkJCQljb250aW51ZTsgLyogc2hvd2luZyB6ZXJvIGJ5dGVzIGlzIGVhc3kgOikgKi8KKwkJCQkJY3VycmVudCAtPSBjb3VudDsKKwkJCQkJaWYgKGN1cnJlbnQgPCAwKQorCQkJCQkJY3VycmVudCA9IDA7CisJCQkJCXhsc2VlayhmZCwgY3VycmVudCwgU0VFS19TRVQpOworCQkJCQliYl9jb3B5ZmRfc2l6ZShmZCwgU1RET1VUX0ZJTEVOTywgY291bnQpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjaWYgMSAvKiBUaGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBmb3IgKkxPTkcqIHN0cmluZ3MsIGJ1dCB2ZXJ5IHVzZWZ1bCAqLworCQkJCS8qIE9wdGltaXppbmcgY291bnQtbGluZXMgY2FzZSBpZiB0aGUgZmlsZSBpcyBzZWVrYWJsZS4KKwkJCQkgKiBXZSBhc3N1bWUgdGhlIGxpbmVzIGFyZSA8NjRrLgorCQkJCSAqIChVc2VycyBjb21wbGFpbiB0aGF0IHRhaWwgdGFrZXMgdG9vIGxvbmcKKwkJCQkgKiBvbiBtdWx0aS1naWdhYnl0ZSBmaWxlcykgKi8KKwkJCQlvZmYgPSAoY291bnQgfCAweGYpOyAvKiBmb3Igc21hbGwgY291bnRzLCBiZSBtb3JlIHBhcmFub2lkICovCisJCQkJaWYgKG9mZiA+IChJTlRfTUFYIC8gKDY0KjEwMjQpKSkKKwkJCQkJb2ZmID0gKElOVF9NQVggLyAoNjQqMTAyNCkpOworCQkJCWN1cnJlbnQgLT0gb2ZmICogKDY0KjEwMjQpOworCQkJCWlmIChjdXJyZW50IDwgMCkKKwkJCQkJY3VycmVudCA9IDA7CisJCQkJeGxzZWVrKGZkLCBjdXJyZW50LCBTRUVLX1NFVCk7CisjZW5kaWYKKwkJCX0KKwkJfQorCisJCWlmICghdGFpbGJ1ZikKKwkJCXRhaWxidWYgPSB4bWFsbG9jKHRhaWxidWZzaXplKTsKKworCQlidWYgPSB0YWlsYnVmOworCQl0YWlsbGVuID0gMDsKKwkJLyogIldlIHNhdyAxc3QgbGluZS9ieXRlIi4KKwkJICogVXNlZCBvbmx5IGJ5ICtOIGNvZGUgKCJzdGFydCBmcm9tIE50aCIsIDEtYmFzZWQpOiAqLworCQlzZWVuID0gMTsKKwkJbmV3bGluZXNfc2VlbiA9IDA7CisJCXdoaWxlICgobnJlYWQgPSB0YWlsX3JlYWQoZmQsIGJ1ZiwgdGFpbGJ1ZnNpemUgLSB0YWlsbGVuKSkgPiAwKSB7CisJCQlpZiAoRy5mcm9tX3RvcCkgeworCQkJCWludCBud3JpdGUgPSBucmVhZDsKKwkJCQlpZiAoc2VlbiA8IGNvdW50KSB7CisJCQkJCS8qIFdlIG5lZWQgdG8gc2tpcCBhIGZldyBtb3JlIGJ5dGVzL2xpbmVzICovCisJCQkJCWlmIChDT1VOVF9CWVRFUykgeworCQkJCQkJbndyaXRlIC09IChjb3VudCAtIHNlZW4pOworCQkJCQkJc2VlbiArPSBucmVhZDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNoYXIgKnMgPSBidWY7CisJCQkJCQlkbyB7CisJCQkJCQkJLS1ud3JpdGU7CisJCQkJCQkJaWYgKCpzKysgPT0gJ1xuJyAmJiArK3NlZW4gPT0gY291bnQpIHsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfSB3aGlsZSAobndyaXRlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAobndyaXRlID4gMCkKKwkJCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiArIG5yZWFkIC0gbndyaXRlLCBud3JpdGUpOworCQkJfSBlbHNlIGlmIChjb3VudCkgeworCQkJCWlmIChDT1VOVF9CWVRFUykgeworCQkJCQl0YWlsbGVuICs9IG5yZWFkOworCQkJCQlpZiAodGFpbGxlbiA+IChpbnQpY291bnQpIHsKKwkJCQkJCW1lbW1vdmUodGFpbGJ1ZiwgdGFpbGJ1ZiArIHRhaWxsZW4gLSBjb3VudCwgY291bnQpOworCQkJCQkJdGFpbGxlbiA9IGNvdW50OworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGsgPSBucmVhZDsKKwkJCQkJaW50IG5ld2xpbmVzX2luX2J1ZiA9IDA7CisKKwkJCQkJZG8geyAvKiBjb3VudCAnXG4nIGluIGxhc3QgcmVhZCAqLworCQkJCQkJay0tOworCQkJCQkJaWYgKGJ1ZltrXSA9PSAnXG4nKSB7CisJCQkJCQkJbmV3bGluZXNfaW5fYnVmKys7CisJCQkJCQl9CisJCQkJCX0gd2hpbGUgKGspOworCisJCQkJCWlmIChuZXdsaW5lc19zZWVuICsgbmV3bGluZXNfaW5fYnVmIDwgKGludCljb3VudCkgeworCQkJCQkJbmV3bGluZXNfc2VlbiArPSBuZXdsaW5lc19pbl9idWY7CisJCQkJCQl0YWlsbGVuICs9IG5yZWFkOworCQkJCQl9IGVsc2UgeworCQkJCQkJaW50IGV4dHJhID0gKGJ1ZltucmVhZC0xXSAhPSAnXG4nKTsKKwkJCQkJCWNoYXIgKnM7CisKKwkJCQkJCWsgPSBuZXdsaW5lc19zZWVuICsgbmV3bGluZXNfaW5fYnVmICsgZXh0cmEgLSBjb3VudDsKKwkJCQkJCXMgPSB0YWlsYnVmOworCQkJCQkJd2hpbGUgKGspIHsKKwkJCQkJCQlpZiAoKnMgPT0gJ1xuJykgeworCQkJCQkJCQlrLS07CisJCQkJCQkJfQorCQkJCQkJCXMrKzsKKwkJCQkJCX0KKwkJCQkJCXRhaWxsZW4gKz0gbnJlYWQgLSAocyAtIHRhaWxidWYpOworCQkJCQkJbWVtbW92ZSh0YWlsYnVmLCBzLCB0YWlsbGVuKTsKKwkJCQkJCW5ld2xpbmVzX3NlZW4gPSBjb3VudCAtIGV4dHJhOworCQkJCQl9CisJCQkJCWlmICh0YWlsYnVmc2l6ZSA8IChzaXplX3QpdGFpbGxlbiArIEJVRlNJWikgeworCQkJCQkJdGFpbGJ1ZnNpemUgPSB0YWlsbGVuICsgQlVGU0laOworCQkJCQkJdGFpbGJ1ZiA9IHhyZWFsbG9jKHRhaWxidWYsIHRhaWxidWZzaXplKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlidWYgPSB0YWlsYnVmICsgdGFpbGxlbjsKKwkJCX0KKwkJfSAvKiB3aGlsZSAodGFpbF9yZWFkKCkgPiAwKSAqLworCQlpZiAoIUcuZnJvbV90b3ApIHsKKwkJCXh3cml0ZShTVERPVVRfRklMRU5PLCB0YWlsYnVmLCB0YWlsbGVuKTsKKwkJfQorCX0gd2hpbGUgKCsraSA8IG5maWxlcyk7CisKKwl0YWlsYnVmID0geHJlYWxsb2ModGFpbGJ1ZiwgQlVGU0laKTsKKworCWZtdCA9IE5VTEw7CisKKwlpZiAoRk9MTE9XKSB3aGlsZSAoMSkgeworCQlzbGVlcChzbGVlcF9wZXJpb2QpOworCisJCWkgPSAwOworCQlkbyB7CisJCQlpbnQgbnJlYWQ7CisJCQljb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3ZbaV07CisJCQlpbnQgZmQgPSBmZHNbaV07CisKKwkJCWlmIChGT0xMT1dfUkVUUlkpIHsKKwkJCQlzdHJ1Y3Qgc3RhdCBzYnVmLCBmc2J1ZjsKKworCQkJCWlmIChmZCA8IDAKKwkJCQkgfHwgZnN0YXQoZmQsICZmc2J1ZikgPCAwCisJCQkJIHx8IHN0YXQoZmlsZW5hbWUsICZzYnVmKSA8IDAKKwkJCQkgfHwgZnNidWYuc3RfZGV2ICE9IHNidWYuc3RfZGV2CisJCQkJIHx8IGZzYnVmLnN0X2lubyAhPSBzYnVmLnN0X2lubworCQkJCSkgeworCQkJCQlpbnQgbmV3X2ZkOworCisJCQkJCWlmIChmZCA+PSAwKQorCQkJCQkJY2xvc2UoZmQpOworCQkJCQluZXdfZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJCQkJCWlmIChuZXdfZmQgPj0gMCkgeworCQkJCQkJYmJfZXJyb3JfbXNnKCIlcyBoYXMgJXM7IGZvbGxvd2luZyBlbmQgb2YgbmV3IGZpbGUiLAorCQkJCQkJCWZpbGVuYW1lLCAoZmQgPCAwKSA/ICJhcHBlYXJlZCIgOiAiYmVlbiByZXBsYWNlZCIKKwkJCQkJCSk7CisJCQkJCX0gZWxzZSBpZiAoZmQgPj0gMCkgeworCQkJCQkJYmJfcGVycm9yX21zZygiJXMgaGFzIGJlY29tZSBpbmFjY2Vzc2libGUiLCBmaWxlbmFtZSk7CisJCQkJCX0KKwkJCQkJZmRzW2ldID0gZmQgPSBuZXdfZmQ7CisJCQkJfQorCQkJfQorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0ZBTkNZX1RBSUwgJiYgZmQgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5maWxlcyA+IGhlYWRlcl90aHJlc2hob2xkKSB7CisJCQkJZm10ID0gaGVhZGVyX2ZtdF9zdHI7CisJCQl9CisJCQl3aGlsZSAoKG5yZWFkID0gdGFpbF9yZWFkKGZkLCB0YWlsYnVmLCBCVUZTSVopKSA+IDApIHsKKwkJCQlpZiAoZm10KSB7CisJCQkJCXRhaWxfeHByaW50X2hlYWRlcihmbXQsIGZpbGVuYW1lKTsKKwkJCQkJZm10ID0gTlVMTDsKKwkJCQl9CisJCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIHRhaWxidWYsIG5yZWFkKTsKKwkJCX0KKwkJfSB3aGlsZSAoKytpIDwgbmZpbGVzKTsKKwl9IC8qIHdoaWxlICgxKSAqLworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoZmRzKTsKKwkJZnJlZSh0YWlsYnVmKTsKKwl9CisJcmV0dXJuIEcuZXhpdGNvZGU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGVlLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjYzA1MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy90ZWUuYwpAQCAtMCwwICsxLDExOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGVlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdGVlLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIHRlZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1haV0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHRlZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvcHkgc3RkaW4gdG8gZWFjaCBGSUxFLCBhbmQgYWxzbyB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJQXBwZW5kIHRvIHRoZSBnaXZlbiBGSUxFcywgZG9uJ3Qgb3ZlcndyaXRlIgorLy91c2FnZTogICAgICJcbgktaQlJZ25vcmUgaW50ZXJydXB0IHNpZ25hbHMgKFNJR0lOVCkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRlZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIFwiSGVsbG9cIiB8IHRlZSAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgY2F0IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiSGVsbG9cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB0ZWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRlZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICptb2RlID0gIndcMGEiOworCUZJTEUgKipmaWxlczsKKwlGSUxFICoqZnA7CisJY2hhciAqKm5hbWVzOworCWNoYXIgKipucDsKKwljaGFyIHJldHZhbDsKKy8vVE9ETzogbWFrZSB1bmNvbmRpdGlvbmFsCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTworCXNzaXplX3QgYzsKKyMgZGVmaW5lIGJ1ZiBiYl9jb21tb25fYnVmc2l6MQorI2Vsc2UKKwlpbnQgYzsKKyNlbmRpZgorCXJldHZhbCA9IGdldG9wdDMyKGFyZ3YsICJpYSIpOwkvKiAnYScgbXVzdCBiZSAybmQgKi8KKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCW1vZGUgKz0gKHJldHZhbCAmIDIpOwkvKiBTaW5jZSAnYScgaXMgdGhlIDJuZCBvcHRpb24uLi4gKi8KKworCWlmIChyZXR2YWwgJiAxKSB7CisJCXNpZ25hbChTSUdJTlQsIFNJR19JR04pOyAvKiBUT0RPIC0gc3dpdGNoIHRvIHNpZ2FjdGlvbi4gKHdoeT8pICovCisJfQorCXJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwkvKiBnbnUgdGVlIGlnbm9yZXMgU0lHUElQRSBpbiBjYXNlIG9uZSBvZiB0aGUgb3V0cHV0IGZpbGVzIGlzIGEgcGlwZQorCSAqIHRoYXQgZG9lc24ndCBjb25zdW1lIGFsbCBpdHMgaW5wdXQuICBHb29kIGlkZWEuLi4gKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwkvKiBBbGxvY2F0ZSBhbiBhcnJheSBvZiBGSUxFIConcywgd2l0aCBvbmUgZXh0cmEgZm9yIGEgc2VudGluZWwuICovCisJZnAgPSBmaWxlcyA9IHh6YWxsb2Moc2l6ZW9mKEZJTEUgKikgKiAoYXJnYyArIDIpKTsKKwlucCA9IG5hbWVzID0gYXJndiAtIDE7CisKKwlmaWxlc1swXSA9IHN0ZG91dDsKKwlnb3RvIEdPVF9ORVdfRklMRTsKKwlkbyB7CisJCSpmcCA9IHN0ZG91dDsKKwkJaWYgKE5PVF9MT05FX0RBU0goKmFyZ3YpKSB7CisJCQkqZnAgPSBmb3Blbl9vcl93YXJuKCphcmd2LCBtb2RlKTsKKwkJCWlmICgqZnAgPT0gTlVMTCkgeworCQkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCQlhcmd2Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJKm5wID0gKmFyZ3YrKzsKKyBHT1RfTkVXX0ZJTEU6CisJCXNldGJ1ZigqZnAsIE5VTEwpOwkvKiB0ZWUgbXVzdCBub3QgYnVmZmVyIG91dHB1dC4gKi8KKwkJZnArKzsKKwkJbnArKzsKKwl9IHdoaWxlICgqYXJndik7CisJLyogbmFtZXNbMF0gd2lsbCBiZSBmaWxsZWQgbGF0ZXIgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU8KKwl3aGlsZSAoKGMgPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBidWYsIHNpemVvZihidWYpKSkgPiAwKSB7CisJCWZwID0gZmlsZXM7CisJCWRvCisJCQlmd3JpdGUoYnVmLCAxLCBjLCAqZnApOworCQl3aGlsZSAoKisrZnApOworCX0KKwlpZiAoYyA8IDApIHsJCS8qIE1ha2Ugc3VyZSByZWFkIGVycm9ycyBhcmUgc2lnbmFsZWQuICovCisJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwl9CisjZWxzZQorCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworCXdoaWxlICgoYyA9IGdldGNoYXIoKSkgIT0gRU9GKSB7CisJCWZwID0gZmlsZXM7CisJCWRvCisJCQlwdXRjKGMsICpmcCk7CisJCXdoaWxlICgqKytmcCk7CisJfQorI2VuZGlmCisKKwkvKiBOb3cgd2UgbmVlZCB0byBjaGVjayBmb3IgaS9vIGVycm9ycyBvbiBzdGRpbiBhbmQgdGhlIHZhcmlvdXMKKwkgKiBvdXRwdXQgZmlsZXMuICBTaW5jZSB3ZSBrbm93IHRoYXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBvdXRwdXQKKwkgKiBmaWxlIHRhYmxlIGlzIHN0ZG91dCwgd2UgY2FuIHNhdmUgb25lICJpZiBmZXJyb3IiIHRlc3QgYnkKKwkgKiBzZXR0aW5nIHRoZSBmaXJzdCBlbnRyeSB0byBzdGRpbiBhbmQgY2hlY2tpbmcgc3Rkb3V0IGVycm9yCisJICogc3RhdHVzIHdpdGggZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCgpLi4uIGFsdGhvdWdoIGZmbHVzaCgpaW5nCisJICogaXMgdW5uZWNlc3NhcnkgaGVyZS4gKi8KKwlucCA9IG5hbWVzOworCWZwID0gZmlsZXM7CisJbmFtZXNbMF0gPSAoY2hhciAqKSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJZmlsZXNbMF0gPSBzdGRpbjsKKwlkbyB7CS8qIE5vdyBjaGVjayBmb3IgaW5wdXQgYW5kIG91dHB1dCBlcnJvcnMuICovCisJCS8qIENoZWNraW5nIGZlcnJvciBzaG91bGQgYmUgc3VmZmljaWVudCwgYnV0IHdlIG1heSB3YW50IHRvIGZjbG9zZS4KKwkJICogSWYgd2UgZG8sIHJlbWVtYmVyIG5vdCB0byBjbG9zZSBzdGRpbiEgKi8KKwkJZGllX2lmX2ZlcnJvcigqZnArKywgKm5wKyspOworCX0gd2hpbGUgKCpmcCk7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHJldHZhbCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGVzdC5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjUzOThhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3Rlc3QuYwpAQCAtMCwwICsxLDkxNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGVzdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoYykgYnkgYSB3aG9sZSBwaWxlIG9mIGZvbGtzOgorICoKKyAqICAgICB0ZXN0KDEpOyB2ZXJzaW9uIDctbGlrZSAgLS0gIGF1dGhvciBFcmlrIEJhYWxiZXJnZW4KKyAqICAgICBtb2RpZmllZCBieSBFcmljIEdpc2luIHRvIGJlIHVzZWQgYXMgYnVpbHQtaW4uCisgKiAgICAgbW9kaWZpZWQgYnkgQXJub2xkIFJvYmJpbnMgdG8gYWRkIFNWUjMgY29tcGF0aWJpbGl0eQorICogICAgICgteCAtYyAtYiAtcCAtdSAtZyAtaykgcGx1cyBLb3JuJ3MgLUwgLW50IC1vdCAtZWYgYW5kIG5ldyAtUyAoc29ja2V0KS4KKyAqICAgICBtb2RpZmllZCBieSBKLlQuIENvbmtsaW4gZm9yIE5ldEJTRC4KKyAqICAgICBtb2RpZmllZCBieSBIZXJiZXJ0IFh1IHRvIGJlIHVzZWQgYXMgYnVpbHQtaW4gaW4gYXNoLgorICogICAgIG1vZGlmaWVkIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gdG8gYmUgdXNlZAorICogICAgIGluIGJ1c3lib3guCisgKiAgICAgbW9kaWZpZWQgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIHRvIGJlIHVzZWFibGUgKGkuZS4gYSBiaXQgbGVzcyBibG9hdHkpLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBzdGF0ZXM6CisgKiAgICAgIlRoaXMgcHJvZ3JhbSBpcyBpbiB0aGUgUHVibGljIERvbWFpbi4iCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1RFU1QpICAgICAgKz0gdGVzdC5vIHRlc3RfcHRyX2hhY2subworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0FTSCkgICAgICAgKz0gdGVzdC5vIHRlc3RfcHRyX2hhY2subworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0hVU0gpICAgICAgKz0gdGVzdC5vIHRlc3RfcHRyX2hhY2subworCisvL2NvbmZpZzpjb25maWcgVEVTVAorLy9jb25maWc6CWJvb2wgInRlc3QiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdGVzdCBpcyB1c2VkIHRvIGNoZWNrIGZpbGUgdHlwZXMgYW5kIGNvbXBhcmUgdmFsdWVzLAorLy9jb25maWc6CSAgcmV0dXJuaW5nIGFuIGFwcHJvcHJpYXRlIGV4aXQgY29kZS4gVGhlIGJhc2ggc2hlbGwKKy8vY29uZmlnOgkgIGhhcyB0ZXN0IGJ1aWx0IGluLCBhc2ggY2FuIGJ1aWxkIGl0IGluIG9wdGlvbmFsbHkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RFU1RfNjQKKy8vY29uZmlnOglib29sICJFeHRlbmQgdGVzdCB0byA2NCBiaXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBURVNUIHx8IEFTSF9CVUlMVElOX1RFU1QgfHwgSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSA2NC1iaXQgc3VwcG9ydCBpbiB0ZXN0LgorCisvKiAidGVzdCAtLWhlbHAiIGRvZXMgbm90IHByaW50IGhlbHAgKFBPU0lYIGNvbXBhdCksIG9ubHkgIlsgLS1oZWxwIiBkb2VzLgorICogV2UgZGlzcGxheSAiPGFwcGxldD4gRVhQUkVTU0lPTiBdIiBoZXJlIChub3QgIjxhcHBsZXQ+IEVYUFJFU1NJT04iKQorICogVW5mb3J0dW5hdGVseSwgaXQgc2NyZXdzIHVwIGdlbmVyYXRlZCBCdXN5Qm94Lmh0bWwuIFRPRE8uICovCisvL3VzYWdlOiNkZWZpbmUgdGVzdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRVhQUkVTU0lPTiBdIgorLy91c2FnZTojZGVmaW5lIHRlc3RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGVjayBmaWxlIHR5cGVzLCBjb21wYXJlIHZhbHVlcyBldGMuIFJldHVybiBhIDAvMSBleGl0IGNvZGVcbiIKKy8vdXNhZ2U6ICAgICAgICJkZXBlbmRpbmcgb24gbG9naWNhbCB2YWx1ZSBvZiBFWFBSRVNTSU9OIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0ZXN0X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHRlc3QgMSAtZXEgMlxuIgorLy91c2FnZTogICAgICAgIiQgZWNobyAkP1xuIgorLy91c2FnZTogICAgICAgIjFcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHRlc3QgMSAtZXEgMVxuIgorLy91c2FnZTogICAgICAgIiQgZWNobyAkP1xuIgorLy91c2FnZTogICAgICAgIjBcbiIKKy8vdXNhZ2U6ICAgICAgICIkIFsgLWQgL2V0YyBdXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvICQ/XG4iCisvL3VzYWdlOiAgICAgICAiMFxuIgorLy91c2FnZTogICAgICAgIiQgWyAtZCAvanVuayBdXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvICQ/XG4iCisvL3VzYWdlOiAgICAgICAiMVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLyogdGVzdF9tYWluKCkgaXMgY2FsbGVkIGZyb20gc2hlbGxzLCBhbmQgd2UgbmVlZCB0byBiZSBleHRyYSBjYXJlZnVsIGhlcmUuCisgKiBUaGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZiBQUkVGRVJfQVBQTEVUUyBhbmQgU0hfU1RBTkRBTE9ORQorICogc3RhdGUuICovCisKKy8qIHRlc3QoMSkgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGdyYW1tYXI6CisJb2V4cHIgICA6Oj0gYWV4cHIgfCBhZXhwciAiLW8iIG9leHByIDsKKwlhZXhwciAgIDo6PSBuZXhwciB8IG5leHByICItYSIgYWV4cHIgOworCW5leHByICAgOjo9IHByaW1hcnkgfCAiISIgcHJpbWFyeQorCXByaW1hcnkgOjo9IHVuYXJ5LW9wZXJhdG9yIG9wZXJhbmQKKwkJfCBvcGVyYW5kIGJpbmFyeS1vcGVyYXRvciBvcGVyYW5kCisJCXwgb3BlcmFuZAorCQl8ICIoIiBvZXhwciAiKSIKKwkJOworCXVuYXJ5LW9wZXJhdG9yIDo6PSAiLXIifCItdyJ8Ii14InwiLWYifCItZCJ8Ii1jInwiLWIifCItcCJ8CisJCSItdSJ8Ii1nInwiLWsifCItcyJ8Ii10InwiLXoifCItbiJ8Ii1vInwiLU8ifCItRyJ8Ii1MInwiLVMiOworCisJYmluYXJ5LW9wZXJhdG9yIDo6PSAiPSJ8Ij09InwiIT0ifCItZXEifCItbmUifCItZ2UifCItZ3QifCItbGUifCItbHQifAorCQkJIi1udCJ8Ii1vdCJ8Ii1lZiI7CisJb3BlcmFuZCA6Oj0gPGFueSBsZWdhbCBVTklYIGZpbGUgbmFtZT4KKyovCisKKy8qIFRPRE86IGhhbmRsZSBbWyBleHByIF1dIGJhc2hpc20gYmFzaC1jb21wYXRpYmx5LgorICogW1sgXV0gaXMgbWVhbnQgdG8gYmUgYSAiYmV0dGVyIFsgXSIsIHdpdGggbGVzcyB3ZWlyZCBzeW50YXgKKyAqIGFuZCB3aXRob3V0IHRoZSByaXNrIG9mIHZhcmlhYmxlcyBhbmQgcXVvdGVkIHN0cmluZ3MgbWlzaW50ZXJwcmV0ZWQKKyAqIGFzIG9wZXJhdG9ycy4KKyAqIFRoaXMgd2lsbCByZXF1aXJlIHN1cHBvcnQgZnJvbSBzaGVsbHMgLSB3ZSBuZWVkIHRvIGtub3cgcXVvdGUgc3RhdHVzCisgKiBvZiBlYWNoIHBhcmFtZXRlciAoc2VlIGJlbG93KS4KKyAqCisgKiBXb3JkIHNwbGl0dGluZyBhbmQgcGF0aG5hbWUgZXhwYW5zaW9uIHNob3VsZCBOT1QgYmUgcGVyZm9ybWVkOgorICogICAgICAjIGE9ImEgYiI7IFtbICRhID0gImEgYiIgXV0gJiYgZWNobyBZRVMKKyAqICAgICAgWUVTCisgKiAgICAgICMgW1sgL2Jpbi9tKiBdXSAmJiBlY2hvIFlFUworICogICAgICBZRVMKKyAqCisgKiA9fiBzaG91bGQgZG8gcmVnZXhwIG1hdGNoCisgKiA9IGFuZCA9PSBzaG91bGQgZG8gcGF0dGVybiBtYXRjaCBhZ2FpbnN0IHJpZ2h0IHNpZGU6CisgKiAgICAgICMgW1sgKmEqID09IGJhYiBdXSAmJiBlY2hvIFlFUworICogICAgICAjIFtbIGJhYiA9PSAqYSogXV0gJiYgZWNobyBZRVMKKyAqICAgICAgWUVTCisgKiAhPSBkb2VzIHRoZSBuZWdhdGVkID09IChpLmUuLCBhbHNvIHdpdGggcGF0dGVybiBtYXRjaGluZykuCisgKiBQYXR0ZXJuIG1hdGNoaW5nIGlzIHF1b3RhdGlvbi1zZW5zaXRpdmU6CisgKiAgICAgICMgW1sgYmFiID09ICJiImEqIF1dICYmIGVjaG8gWUVTCisgKiAgICAgIFlFUworICogICAgICAjIFtbIGJhYiA9PSBiImEqIiBdXSAmJiBlY2hvIFlFUworICoKKyAqIENvbmRpdGlvbmFsIG9wZXJhdG9ycyBzdWNoIGFzIC1mIG11c3QgYmUgdW5xdW90ZWQgbGl0ZXJhbHMgdG8gYmUgcmVjb2duaXplZDoKKyAqICAgICAgIyBbWyAtZSAvYmluIF1dICYmIGVjaG8gWUVTCisgKiAgICAgIFlFUworICogICAgICAjIFtbICctZScgL2JpbiBdXSAmJiBlY2hvIFlFUworICogICAgICBiYXNoOiBjb25kaXRpb25hbCBiaW5hcnkgb3BlcmF0b3IgZXhwZWN0ZWQuLi4KKyAqICAgICAgIyBBPSctZSc7IFtbICRBIC9iaW4gXV0gJiYgZWNobyBZRVMKKyAqICAgICAgYmFzaDogY29uZGl0aW9uYWwgYmluYXJ5IG9wZXJhdG9yIGV4cGVjdGVkLi4uCisgKgorICogfHwgYW5kICYmIHNob3VsZCB3b3JrIGFzIC1vIGFuZCAtYSB3b3JrIGluIFsgXQorICogLWEgYW5kIC1vIGFyZW4ndCByZWNvZ25pemVkICgmJiBhbmQgfHwgYXJlIHRvIGJlIHVzZWQgaW5zdGVhZCkKKyAqICggYW5kICkgZG8gbm90IG5lZWQgdG8gYmUgcXVvdGVkIHVubGlrZSBpbiBbIF06CisgKiAgICAgICMgW1sgKCBhYmMgKSAmJiAnJyBdXSAmJiBlY2hvIFlFUworICogICAgICAjIFtbICggYWJjICkgfHwgJycgXV0gJiYgZWNobyBZRVMKKyAqICAgICAgWUVTCisgKiAgICAgICMgW1sgKCBhYmMgKSAtbyAnJyBdXSAmJiBlY2hvIFlFUworICogICAgICBiYXNoOiBzeW50YXggZXJyb3IgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4uLgorICoKKyAqIEFwYXJ0IGZyb20gdGhlIGFib3ZlLCBbWyBleHByIF1dIHNob3VsZCB3b3JrIGFzIFsgZXhwciBdCisgKi8KKworI2RlZmluZSBURVNUX0RFQlVHIDAKKworZW51bSB0b2tlbiB7CisJRU9JLAorCisJRklMUkQsIC8qIGZpbGUgYWNjZXNzICovCisJRklMV1IsCisJRklMRVgsCisKKwlGSUxFWElTVCwKKworCUZJTFJFRywgLyogZmlsZSB0eXBlICovCisJRklMRElSLAorCUZJTENERVYsCisJRklMQkRFViwKKwlGSUxGSUZPLAorCUZJTFNPQ0ssCisKKwlGSUxTWU0sCisJRklMR1osCisJRklMVFQsCisKKwlGSUxTVUlELCAvKiBmaWxlIGJpdCAqLworCUZJTFNHSUQsCisJRklMU1RDSywKKworCUZJTE5ULCAvKiBmaWxlIG9wcyAqLworCUZJTE9ULAorCUZJTEVRLAorCisJRklMVUlELAorCUZJTEdJRCwKKworCVNUUkVaLCAvKiBzdHIgb3BzICovCisJU1RSTlosCisJU1RSRVEsCisJU1RSTkUsCisJU1RSTFQsCisJU1RSR1QsCisKKwlJTlRFUSwgLyogaW50IG9wcyAqLworCUlOVE5FLAorCUlOVEdFLAorCUlOVEdULAorCUlOVExFLAorCUlOVExULAorCisJVU5PVCwKKwlCQU5ELAorCUJPUiwKKwlMUEFSRU4sCisJUlBBUkVOLAorCU9QRVJBTkQKK307CisjZGVmaW5lIGlzX2ludF9vcChhKSAgICAgICgoKHVuc2lnbmVkIGNoYXIpKChhKSAtIElOVEVRKSkgPD0gNSkKKyNkZWZpbmUgaXNfc3RyX29wKGEpICAgICAgKCgodW5zaWduZWQgY2hhcikoKGEpIC0gU1RSRVopKSA8PSA1KQorI2RlZmluZSBpc19maWxlX29wKGEpICAgICAoKCh1bnNpZ25lZCBjaGFyKSgoYSkgLSBGSUxOVCkpIDw9IDIpCisjZGVmaW5lIGlzX2ZpbGVfYWNjZXNzKGEpICgoKHVuc2lnbmVkIGNoYXIpKChhKSAtIEZJTFJEKSkgPD0gMikKKyNkZWZpbmUgaXNfZmlsZV90eXBlKGEpICAgKCgodW5zaWduZWQgY2hhcikoKGEpIC0gRklMUkVHKSkgPD0gNSkKKyNkZWZpbmUgaXNfZmlsZV9iaXQoYSkgICAgKCgodW5zaWduZWQgY2hhcikoKGEpIC0gRklMU1VJRCkpIDw9IDIpCisKKyNpZiBURVNUX0RFQlVHCitpbnQgZGVwdGg7CisjZGVmaW5lIG5lc3RfbXNnKC4uLikgZG8geyBcCisJZGVwdGgrKzsgXAorCWZwcmludGYoc3RkZXJyLCAiJSpzIiwgZGVwdGgqMiwgIiIpOyBcCisJZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgdW5uZXN0X21zZyguLi4pIGRvIHsgXAorCWZwcmludGYoc3RkZXJyLCAiJSpzIiwgZGVwdGgqMiwgIiIpOyBcCisJZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKTsgXAorCWRlcHRoLS07IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIGRiZ19tc2coLi4uKSBkbyB7IFwKKwlmcHJpbnRmKHN0ZGVyciwgIiUqcyIsIGRlcHRoKjIsICIiKTsgXAorCWZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIHVubmVzdF9tc2dfYW5kX3JldHVybihleHByLCAuLi4pIGRvIHsgXAorCW51bWJlcl90IF9fcmVzID0gKGV4cHIpOyBcCisJZnByaW50ZihzdGRlcnIsICIlKnMiLCBkZXB0aCoyLCAiIik7IFwKKwlmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18sIHJlcyk7IFwKKwlkZXB0aC0tOyBcCisJcmV0dXJuIF9fcmVzOyBcCit9IHdoaWxlICgwKQorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFRPS1NUUltdID0geworCSJFT0kiLAorCSJGSUxSRCIsCisJIkZJTFdSIiwKKwkiRklMRVgiLAorCSJGSUxFWElTVCIsCisJIkZJTFJFRyIsCisJIkZJTERJUiIsCisJIkZJTENERVYiLAorCSJGSUxCREVWIiwKKwkiRklMRklGTyIsCisJIkZJTFNPQ0siLAorCSJGSUxTWU0iLAorCSJGSUxHWiIsCisJIkZJTFRUIiwKKwkiRklMU1VJRCIsCisJIkZJTFNHSUQiLAorCSJGSUxTVENLIiwKKwkiRklMTlQiLAorCSJGSUxPVCIsCisJIkZJTEVRIiwKKwkiRklMVUlEIiwKKwkiRklMR0lEIiwKKwkiU1RSRVoiLAorCSJTVFJOWiIsCisJIlNUUkVRIiwKKwkiU1RSTkUiLAorCSJTVFJMVCIsCisJIlNUUkdUIiwKKwkiSU5URVEiLAorCSJJTlRORSIsCisJIklOVEdFIiwKKwkiSU5UR1QiLAorCSJJTlRMRSIsCisJIklOVExUIiwKKwkiVU5PVCIsCisJIkJBTkQiLAorCSJCT1IiLAorCSJMUEFSRU4iLAorCSJSUEFSRU4iLAorCSJPUEVSQU5EIgorfTsKKyNlbHNlCisjZGVmaW5lIG5lc3RfbXNnKC4uLikgICAoKHZvaWQpMCkKKyNkZWZpbmUgdW5uZXN0X21zZyguLi4pICgodm9pZCkwKQorI2RlZmluZSBkYmdfbXNnKC4uLikgICAgKCh2b2lkKTApCisjZGVmaW5lIHVubmVzdF9tc2dfYW5kX3JldHVybihleHByLCAuLi4pIHJldHVybiBleHByCisjZW5kaWYKKworZW51bSB7CisJVU5PUCwKKwlCSU5PUCwKKwlCVU5PUCwKKwlCQklOT1AsCisJUEFSRU4KK307CisKK3N0cnVjdCBvcGVyYXRvcl90IHsKKwl1bnNpZ25lZCBjaGFyIG9wX251bSwgb3BfdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BlcmF0b3JfdCBvcHNfdGFibGVbXSA9IHsKKwl7IC8qICItciIgKi8gRklMUkQgICAsIFVOT1AgICB9LAorCXsgLyogIi13IiAqLyBGSUxXUiAgICwgVU5PUCAgIH0sCisJeyAvKiAiLXgiICovIEZJTEVYICAgLCBVTk9QICAgfSwKKwl7IC8qICItZSIgKi8gRklMRVhJU1QsIFVOT1AgICB9LAorCXsgLyogIi1mIiAqLyBGSUxSRUcgICwgVU5PUCAgIH0sCisJeyAvKiAiLWQiICovIEZJTERJUiAgLCBVTk9QICAgfSwKKwl7IC8qICItYyIgKi8gRklMQ0RFViAsIFVOT1AgICB9LAorCXsgLyogIi1iIiAqLyBGSUxCREVWICwgVU5PUCAgIH0sCisJeyAvKiAiLXAiICovIEZJTEZJRk8gLCBVTk9QICAgfSwKKwl7IC8qICItdSIgKi8gRklMU1VJRCAsIFVOT1AgICB9LAorCXsgLyogIi1nIiAqLyBGSUxTR0lEICwgVU5PUCAgIH0sCisJeyAvKiAiLWsiICovIEZJTFNUQ0sgLCBVTk9QICAgfSwKKwl7IC8qICItcyIgKi8gRklMR1ogICAsIFVOT1AgICB9LAorCXsgLyogIi10IiAqLyBGSUxUVCAgICwgVU5PUCAgIH0sCisJeyAvKiAiLXoiICovIFNUUkVaICAgLCBVTk9QICAgfSwKKwl7IC8qICItbiIgKi8gU1RSTlogICAsIFVOT1AgICB9LAorCXsgLyogIi1oIiAqLyBGSUxTWU0gICwgVU5PUCAgIH0sICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0ICovCisKKwl7IC8qICItTyIgKi8gRklMVUlEICAsIFVOT1AgICB9LAorCXsgLyogIi1HIiAqLyBGSUxHSUQgICwgVU5PUCAgIH0sCisJeyAvKiAiLUwiICovIEZJTFNZTSAgLCBVTk9QICAgfSwKKwl7IC8qICItUyIgKi8gRklMU09DSyAsIFVOT1AgICB9LAorCXsgLyogIj0iICAqLyBTVFJFUSAgICwgQklOT1AgIH0sCisJeyAvKiAiPT0iICovIFNUUkVRICAgLCBCSU5PUCAgfSwKKwl7IC8qICIhPSIgKi8gU1RSTkUgICAsIEJJTk9QICB9LAorCXsgLyogIjwiICAqLyBTVFJMVCAgICwgQklOT1AgIH0sCisJeyAvKiAiPiIgICovIFNUUkdUICAgLCBCSU5PUCAgfSwKKwl7IC8qICItZXEiKi8gSU5URVEgICAsIEJJTk9QICB9LAorCXsgLyogIi1uZSIqLyBJTlRORSAgICwgQklOT1AgIH0sCisJeyAvKiAiLWdlIiovIElOVEdFICAgLCBCSU5PUCAgfSwKKwl7IC8qICItZ3QiKi8gSU5UR1QgICAsIEJJTk9QICB9LAorCXsgLyogIi1sZSIqLyBJTlRMRSAgICwgQklOT1AgIH0sCisJeyAvKiAiLWx0IiovIElOVExUICAgLCBCSU5PUCAgfSwKKwl7IC8qICItbnQiKi8gRklMTlQgICAsIEJJTk9QICB9LAorCXsgLyogIi1vdCIqLyBGSUxPVCAgICwgQklOT1AgIH0sCisJeyAvKiAiLWVmIiovIEZJTEVRICAgLCBCSU5PUCAgfSwKKwl7IC8qICIhIiAgKi8gVU5PVCAgICAsIEJVTk9QICB9LAorCXsgLyogIi1hIiAqLyBCQU5EICAgICwgQkJJTk9QIH0sCisJeyAvKiAiLW8iICovIEJPUiAgICAgLCBCQklOT1AgfSwKKwl7IC8qICIoIiAgKi8gTFBBUkVOICAsIFBBUkVOICB9LAorCXsgLyogIikiICAqLyBSUEFSRU4gICwgUEFSRU4gIH0sCit9OworLyogUGxlYXNlIGtlZXAgdGhlc2UgdHdvIHRhYmxlcyBpbiBzeW5jICovCitzdGF0aWMgY29uc3QgY2hhciBvcHNfdGV4dHNbXSBBTElHTjEgPQorCSItciIgICJcMCIKKwkiLXciICAiXDAiCisJIi14IiAgIlwwIgorCSItZSIgICJcMCIKKwkiLWYiICAiXDAiCisJIi1kIiAgIlwwIgorCSItYyIgICJcMCIKKwkiLWIiICAiXDAiCisJIi1wIiAgIlwwIgorCSItdSIgICJcMCIKKwkiLWciICAiXDAiCisJIi1rIiAgIlwwIgorCSItcyIgICJcMCIKKwkiLXQiICAiXDAiCisJIi16IiAgIlwwIgorCSItbiIgICJcMCIKKwkiLWgiICAiXDAiCisKKwkiLU8iICAiXDAiCisJIi1HIiAgIlwwIgorCSItTCIgICJcMCIKKwkiLVMiICAiXDAiCisJIj0iICAgIlwwIgorCSI9PSIgICJcMCIKKwkiIT0iICAiXDAiCisJIjwiICAgIlwwIgorCSI+IiAgICJcMCIKKwkiLWVxIiAiXDAiCisJIi1uZSIgIlwwIgorCSItZ2UiICJcMCIKKwkiLWd0IiAiXDAiCisJIi1sZSIgIlwwIgorCSItbHQiICJcMCIKKwkiLW50IiAiXDAiCisJIi1vdCIgIlwwIgorCSItZWYiICJcMCIKKwkiISIgICAiXDAiCisJIi1hIiAgIlwwIgorCSItbyIgICJcMCIKKwkiKCIgICAiXDAiCisJIikiICAgIlwwIgorOworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URVNUXzY0Cit0eXBlZGVmIGludDY0X3QgbnVtYmVyX3Q7CisjZWxzZQordHlwZWRlZiBpbnQgbnVtYmVyX3Q7CisjZW5kaWYKKworCisvKiBXZSB0cnkgdG8gbWluaW1pemUgYm90aCBzdGF0aWMgYW5kIHN0YWNrIHVzYWdlLiAqLworc3RydWN0IHRlc3Rfc3RhdGljcyB7CisJY2hhciAqKmFyZ3M7CisJLyogc2V0IG9ubHkgYnkgY2hlY2tfb3BlcmF0b3IoKSwgZWl0aGVyIHRvIGJvZ3VzIHN0cnVjdAorCSAqIG9yIHBvaW50cyB0byBtYXRjaGluZyBvcGVyYXRvcl90IHN0cnVjdC4gTmV2ZXIgTlVMTC4gKi8KKwljb25zdCBzdHJ1Y3Qgb3BlcmF0b3JfdCAqbGFzdF9vcGVyYXRvcjsKKwlnaWRfdCAqZ3JvdXBfYXJyYXk7CisJaW50IG5ncm91cHM7CisJam1wX2J1ZiBsZWF2aW5nOworfTsKKworLyogU2VlIHRlc3RfcHRyX2hhY2suYyAqLworZXh0ZXJuIHN0cnVjdCB0ZXN0X3N0YXRpY3MgKmNvbnN0IHRlc3RfcHRyX3RvX3N0YXRpY3M7CisKKyNkZWZpbmUgUyAoKnRlc3RfcHRyX3RvX3N0YXRpY3MpCisjZGVmaW5lIGFyZ3MgICAgICAgICAgICAoUy5hcmdzICAgICAgICAgKQorI2RlZmluZSBsYXN0X29wZXJhdG9yICAgKFMubGFzdF9vcGVyYXRvcikKKyNkZWZpbmUgZ3JvdXBfYXJyYXkgICAgIChTLmdyb3VwX2FycmF5ICApCisjZGVmaW5lIG5ncm91cHMgICAgICAgICAoUy5uZ3JvdXBzICAgICAgKQorI2RlZmluZSBsZWF2aW5nICAgICAgICAgKFMubGVhdmluZyAgICAgICkKKworI2RlZmluZSBJTklUX1MoKSBkbyB7IFwKKwkoKihzdHJ1Y3QgdGVzdF9zdGF0aWNzKiopJnRlc3RfcHRyX3RvX3N0YXRpY3MpID0geHphbGxvYyhzaXplb2YoUykpOyBcCisJYmFycmllcigpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBERUlOSVRfUygpIGRvIHsgXAorCWZyZWUodGVzdF9wdHJfdG9fc3RhdGljcyk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBudW1iZXJfdCBwcmltYXJ5KGVudW0gdG9rZW4gbik7CisKK3N0YXRpYyB2b2lkIHN5bnRheChjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqbXNnKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHN5bnRheChjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqbXNnKQoreworCWlmIChvcCAmJiAqb3ApIHsKKwkJYmJfZXJyb3JfbXNnKCIlczogJXMiLCBvcCwgbXNnKTsKKwl9IGVsc2UgeworCQliYl9lcnJvcl9tc2coIiVzOiAlcyIrNCwgbXNnKTsKKwl9CisJbG9uZ2ptcChsZWF2aW5nLCAyKTsKK30KKworLyogYXRvaSB3aXRoIGVycm9yIGRldGVjdGlvbiAqLworLy9YWFg6IEZJWE1FOiBkdXBsaWNhdGUgb2YgZXhpc3RpbmcgbGliYmIgZnVuY3Rpb24/CitzdGF0aWMgbnVtYmVyX3QgZ2V0bihjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVTVF82NAorCWxvbmcgbG9uZyByOworI2Vsc2UKKwlsb25nIHI7CisjZW5kaWYKKworCWVycm5vID0gMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URVNUXzY0CisJciA9IHN0cnRvbGwocywgJnAsIDEwKTsKKyNlbHNlCisJciA9IHN0cnRvbChzLCAmcCwgMTApOworI2VuZGlmCisKKwlpZiAoZXJybm8gIT0gMCkKKwkJc3ludGF4KHMsICJvdXQgb2YgcmFuZ2UiKTsKKworCWlmIChwID09IHMgfHwgKihza2lwX3doaXRlc3BhY2UocCkpICE9ICdcMCcpCisJCXN5bnRheChzLCAiYmFkIG51bWJlciIpOworCisJcmV0dXJuIHI7Cit9CisKKy8qIFVOVVNFRAorc3RhdGljIGludCBuZXdlcmYoY29uc3QgY2hhciAqZjEsIGNvbnN0IGNoYXIgKmYyKQoreworCXN0cnVjdCBzdGF0IGIxLCBiMjsKKworCXJldHVybiAoc3RhdChmMSwgJmIxKSA9PSAwICYmCisJCQlzdGF0KGYyLCAmYjIpID09IDAgJiYgYjEuc3RfbXRpbWUgPiBiMi5zdF9tdGltZSk7Cit9CisKK3N0YXRpYyBpbnQgb2xkZXJmKGNvbnN0IGNoYXIgKmYxLCBjb25zdCBjaGFyICpmMikKK3sKKwlzdHJ1Y3Qgc3RhdCBiMSwgYjI7CisKKwlyZXR1cm4gKHN0YXQoZjEsICZiMSkgPT0gMCAmJgorCQkJc3RhdChmMiwgJmIyKSA9PSAwICYmIGIxLnN0X210aW1lIDwgYjIuc3RfbXRpbWUpOworfQorCitzdGF0aWMgaW50IGVxdWFsZihjb25zdCBjaGFyICpmMSwgY29uc3QgY2hhciAqZjIpCit7CisJc3RydWN0IHN0YXQgYjEsIGIyOworCisJcmV0dXJuIChzdGF0KGYxLCAmYjEpID09IDAgJiYKKwkJCXN0YXQoZjIsICZiMikgPT0gMCAmJgorCQkJYjEuc3RfZGV2ID09IGIyLnN0X2RldiAmJiBiMS5zdF9pbm8gPT0gYjIuc3RfaW5vKTsKK30KKyovCisKKworc3RhdGljIGVudW0gdG9rZW4gY2hlY2tfb3BlcmF0b3IoY29uc3QgY2hhciAqcykKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG9wZXJhdG9yX3Qgbm9fb3AgPSB7CisJCS5vcF9udW0gPSAtMSwKKwkJLm9wX3R5cGUgPSAtMQorCX07CisJaW50IG47CisKKwlsYXN0X29wZXJhdG9yID0gJm5vX29wOworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBFT0k7CisJbiA9IGluZGV4X2luX3N0cmluZ3Mob3BzX3RleHRzLCBzKTsKKwlpZiAobiA8IDApCisJCXJldHVybiBPUEVSQU5EOworCWxhc3Rfb3BlcmF0b3IgPSAmb3BzX3RhYmxlW25dOworCXJldHVybiBvcHNfdGFibGVbbl0ub3BfbnVtOworfQorCisKK3N0YXRpYyBpbnQgYmlub3Aodm9pZCkKK3sKKwljb25zdCBjaGFyICpvcG5kMSwgKm9wbmQyOworCWNvbnN0IHN0cnVjdCBvcGVyYXRvcl90ICpvcDsKKwludW1iZXJfdCB2YWwxLCB2YWwyOworCisJb3BuZDEgPSAqYXJnczsKKwljaGVja19vcGVyYXRvcigqKythcmdzKTsKKwlvcCA9IGxhc3Rfb3BlcmF0b3I7CisKKwlvcG5kMiA9ICorK2FyZ3M7CisJaWYgKG9wbmQyID09IE5VTEwpCisJCXN5bnRheChhcmdzWy0xXSwgImFyZ3VtZW50IGV4cGVjdGVkIik7CisKKwlpZiAoaXNfaW50X29wKG9wLT5vcF9udW0pKSB7CisJCXZhbDEgPSBnZXRuKG9wbmQxKTsKKwkJdmFsMiA9IGdldG4ob3BuZDIpOworCQlpZiAob3AtPm9wX251bSA9PSBJTlRFUSkKKwkJCXJldHVybiB2YWwxID09IHZhbDI7CisJCWlmIChvcC0+b3BfbnVtID09IElOVE5FKQorCQkJcmV0dXJuIHZhbDEgIT0gdmFsMjsKKwkJaWYgKG9wLT5vcF9udW0gPT0gSU5UR0UpCisJCQlyZXR1cm4gdmFsMSA+PSB2YWwyOworCQlpZiAob3AtPm9wX251bSA9PSBJTlRHVCkKKwkJCXJldHVybiB2YWwxID4gIHZhbDI7CisJCWlmIChvcC0+b3BfbnVtID09IElOVExFKQorCQkJcmV0dXJuIHZhbDEgPD0gdmFsMjsKKwkJLyppZiAob3AtPm9wX251bSA9PSBJTlRMVCkqLworCQlyZXR1cm4gdmFsMSA8ICB2YWwyOworCX0KKwlpZiAoaXNfc3RyX29wKG9wLT5vcF9udW0pKSB7CisJCXZhbDEgPSBzdHJjbXAob3BuZDEsIG9wbmQyKTsKKwkJaWYgKG9wLT5vcF9udW0gPT0gU1RSRVEpCisJCQlyZXR1cm4gdmFsMSA9PSAwOworCQlpZiAob3AtPm9wX251bSA9PSBTVFJORSkKKwkJCXJldHVybiB2YWwxICE9IDA7CisJCWlmIChvcC0+b3BfbnVtID09IFNUUkxUKQorCQkJcmV0dXJuIHZhbDEgPCAwOworCQkvKmlmIChvcC0+b3BfbnVtID09IFNUUkdUKSovCisJCXJldHVybiB2YWwxID4gMDsKKwl9CisJLyogV2UgYXJlIHN1cmUgdGhhdCB0aGVzZSB0aHJlZSBhcmUgYnkgbm93IHRoZSBvbmx5IGJpbm9wcyB3ZSBkaWRuJ3QgY2hlY2sKKwkgKiB5ZXQsIHNvIHdlIGRvIG5vdCBjaGVjayBpZiB0aGUgY2xhc3MgaXMgY29ycmVjdDoKKwkgKi8KKy8qCWlmIChpc19maWxlX29wKG9wLT5vcF9udW0pKSAqLworCXsKKwkJc3RydWN0IHN0YXQgYjEsIGIyOworCisJCWlmIChzdGF0KG9wbmQxLCAmYjEpIHx8IHN0YXQob3BuZDIsICZiMikpCisJCQlyZXR1cm4gMDsgLyogZmFsc2UsIHNpbmNlIGF0IGxlYXN0IG9uZSBzdGF0IGZhaWxlZCAqLworCQlpZiAob3AtPm9wX251bSA9PSBGSUxOVCkKKwkJCXJldHVybiBiMS5zdF9tdGltZSA+IGIyLnN0X210aW1lOworCQlpZiAob3AtPm9wX251bSA9PSBGSUxPVCkKKwkJCXJldHVybiBiMS5zdF9tdGltZSA8IGIyLnN0X210aW1lOworCQkvKmlmIChvcC0+b3BfbnVtID09IEZJTEVRKSovCisJCXJldHVybiBiMS5zdF9kZXYgPT0gYjIuc3RfZGV2ICYmIGIxLnN0X2lubyA9PSBiMi5zdF9pbm87CisJfQorCS8qcmV0dXJuIDE7IC0gTk9UUkVBQ0hFRCAqLworfQorCisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfZ3JvdXBfYXJyYXkodm9pZCkKK3sKKwlpbnQgbjsKKworCS8qIGdldGdyb3VwcyBtYXkgYmUgZXhwZW5zaXZlLCB0cnkgdG8gdXNlIGl0IG9ubHkgb25jZSAqLworCW5ncm91cHMgPSAzMjsKKwlkbyB7CisJCS8qIEZJWE1FOiBhc2ggdHJpZXMgc28gaGFyZCB0byBub3QgZGllIG9uIE9PTSwKKwkJICogYW5kIHdlIHNwb2lsIGl0IHdpdGgganVzdCBvbmUgeHJlYWxsb2MgaGVyZSAqLworCQkvKiBXZSByZWFsbG9jLCBiZWNhdXNlIHRlc3RfbWFpbiBjYW4gYmUgZW50ZXJlZCByZXBlYXRlZGx5IGJ5IHNoZWxsLgorCQkgKiBUZXN0Y2FzZSAoYXNoKTogJ3doaWxlIHRydWU7IGRvIHRlc3QgLXggc29tZV9maWxlOyBkb25lJworCQkgKiBhbmQgd2F0Y2ggdG9wLiAoc29tZV9maWxlIG11c3QgaGF2ZSBvd25lciAhPSB5b3UpICovCisJCW4gPSBuZ3JvdXBzOworCQlncm91cF9hcnJheSA9IHhyZWFsbG9jKGdyb3VwX2FycmF5LCBuICogc2l6ZW9mKGdpZF90KSk7CisJCW5ncm91cHMgPSBnZXRncm91cHMobiwgZ3JvdXBfYXJyYXkpOworCX0gd2hpbGUgKG5ncm91cHMgPiBuKTsKK30KKworCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgR0lEIGlzIG9uZSB0aGF0IHdlIGhhdmUgaW4gb3VyIGdyb3VwcyBsaXN0LiAqLworLy9YWFg6IEZJWE1FOiBkdXBsaWNhdGUgb2YgZXhpc3RpbmcgbGliYmIgZnVuY3Rpb24/CisvLyBzZWUgdG9wbGV2ZWwgVE9ETyBmaWxlOgorLy8gcG9zc2libGUgY29kZSBkdXBsaWNhdGlvbiBpbmdyb3VwKCkgYW5kIGlzX2FfZ3JvdXBfbWVtYmVyKCkKK3N0YXRpYyBpbnQgaXNfYV9ncm91cF9tZW1iZXIoZ2lkX3QgZ2lkKQoreworCWludCBpOworCisJLyogU2hvcnQtY2lyY3VpdCBpZiBwb3NzaWJsZSwgbWF5YmUgc2F2aW5nIGEgY2FsbCB0byBnZXRncm91cHMoKS4gKi8KKwlpZiAoZ2lkID09IGdldGdpZCgpIHx8IGdpZCA9PSBnZXRlZ2lkKCkpCisJCXJldHVybiAxOworCisJaWYgKG5ncm91cHMgPT0gMCkKKwkJaW5pdGlhbGl6ZV9ncm91cF9hcnJheSgpOworCisJLyogU2VhcmNoIHRocm91Z2ggdGhlIGxpc3QgbG9va2luZyBmb3IgR0lELiAqLworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspCisJCWlmIChnaWQgPT0gZ3JvdXBfYXJyYXlbaV0pCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisKKy8qIERvIHRoZSBzYW1lIHRoaW5nIGFjY2VzcygyKSBkb2VzLCBidXQgdXNlIHRoZSBlZmZlY3RpdmUgdWlkIGFuZCBnaWQsCisgICBhbmQgZG9uJ3QgbWFrZSB0aGUgbWlzdGFrZSBvZiB0ZWxsaW5nIHJvb3QgdGhhdCBhbnkgZmlsZSBpcworICAgZXhlY3V0YWJsZS4gKi8KK3N0YXRpYyBpbnQgdGVzdF9lYWNjZXNzKGNoYXIgKnBhdGgsIGludCBtb2RlKQoreworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIGludCBldWlkID0gZ2V0ZXVpZCgpOworCisJaWYgKHN0YXQocGF0aCwgJnN0KSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChldWlkID09IDApIHsKKwkJLyogUm9vdCBjYW4gcmVhZCBvciB3cml0ZSBhbnkgZmlsZS4gKi8KKwkJaWYgKG1vZGUgIT0gWF9PSykKKwkJCXJldHVybiAwOworCisJCS8qIFJvb3QgY2FuIGV4ZWN1dGUgYW55IGZpbGUgdGhhdCBoYXMgYW55IG9uZSBvZiB0aGUgZXhlY3V0ZQorCQkgICBiaXRzIHNldC4gKi8KKwkJaWYgKHN0LnN0X21vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChzdC5zdF91aWQgPT0gZXVpZCkgIC8qIG93bmVyICovCisJCW1vZGUgPDw9IDY7CisJZWxzZSBpZiAoaXNfYV9ncm91cF9tZW1iZXIoc3Quc3RfZ2lkKSkKKwkJbW9kZSA8PD0gMzsKKworCWlmIChzdC5zdF9tb2RlICYgbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBmaWxzdGF0KGNoYXIgKm5tLCBlbnVtIHRva2VuIG1vZGUpCit7CisJc3RydWN0IHN0YXQgczsKKwl1bnNpZ25lZCBpID0gaTsgLyogZ2NjIDMueCB0aGlua3MgaXQgY2FuIGJlIHVzZWQgdW5pbml0aWFsaXplZCAqLworCisJaWYgKG1vZGUgPT0gRklMU1lNKSB7CisjaWZkZWYgU19JRkxOSworCQlpZiAobHN0YXQobm0sICZzKSA9PSAwKSB7CisJCQlpID0gU19JRkxOSzsKKwkJCWdvdG8gZmlsZXR5cGU7CisJCX0KKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RhdChubSwgJnMpICE9IDApCisJCXJldHVybiAwOworCWlmIChtb2RlID09IEZJTEVYSVNUKQorCQlyZXR1cm4gMTsKKwlpZiAoaXNfZmlsZV9hY2Nlc3MobW9kZSkpIHsKKwkJaWYgKG1vZGUgPT0gRklMUkQpCisJCQlpID0gUl9PSzsKKwkJaWYgKG1vZGUgPT0gRklMV1IpCisJCQlpID0gV19PSzsKKwkJaWYgKG1vZGUgPT0gRklMRVgpCisJCQlpID0gWF9PSzsKKwkJcmV0dXJuIHRlc3RfZWFjY2VzcyhubSwgaSkgPT0gMDsKKwl9CisJaWYgKGlzX2ZpbGVfdHlwZShtb2RlKSkgeworCQlpZiAobW9kZSA9PSBGSUxSRUcpCisJCQlpID0gU19JRlJFRzsKKwkJaWYgKG1vZGUgPT0gRklMRElSKQorCQkJaSA9IFNfSUZESVI7CisJCWlmIChtb2RlID09IEZJTENERVYpCisJCQlpID0gU19JRkNIUjsKKwkJaWYgKG1vZGUgPT0gRklMQkRFVikKKwkJCWkgPSBTX0lGQkxLOworCQlpZiAobW9kZSA9PSBGSUxGSUZPKSB7CisjaWZkZWYgU19JRklGTworCQkJaSA9IFNfSUZJRk87CisjZWxzZQorCQkJcmV0dXJuIDA7CisjZW5kaWYKKwkJfQorCQlpZiAobW9kZSA9PSBGSUxTT0NLKSB7CisjaWZkZWYgU19JRlNPQ0sKKwkJCWkgPSBTX0lGU09DSzsKKyNlbHNlCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQl9CisgZmlsZXR5cGU6CisJCXJldHVybiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gaSk7CisJfQorCWlmIChpc19maWxlX2JpdChtb2RlKSkgeworCQlpZiAobW9kZSA9PSBGSUxTVUlEKQorCQkJaSA9IFNfSVNVSUQ7CisJCWlmIChtb2RlID09IEZJTFNHSUQpCisJCQlpID0gU19JU0dJRDsKKwkJaWYgKG1vZGUgPT0gRklMU1RDSykKKwkJCWkgPSBTX0lTVlRYOworCQlyZXR1cm4gKChzLnN0X21vZGUgJiBpKSAhPSAwKTsKKwl9CisJaWYgKG1vZGUgPT0gRklMR1opCisJCXJldHVybiBzLnN0X3NpemUgPiAwTDsKKwlpZiAobW9kZSA9PSBGSUxVSUQpCisJCXJldHVybiBzLnN0X3VpZCA9PSBnZXRldWlkKCk7CisJaWYgKG1vZGUgPT0gRklMR0lEKQorCQlyZXR1cm4gcy5zdF9naWQgPT0gZ2V0ZWdpZCgpOworCXJldHVybiAxOyAvKiBOT1RSRUFDSEVEICovCit9CisKKworc3RhdGljIG51bWJlcl90IG5leHByKGVudW0gdG9rZW4gbikKK3sKKwludW1iZXJfdCByZXM7CisKKwluZXN0X21zZygiPm5leHByKCVzKVxuIiwgVE9LU1RSW25dKTsKKwlpZiAobiA9PSBVTk9UKSB7CisJCW4gPSBjaGVja19vcGVyYXRvcigqKythcmdzKTsKKwkJaWYgKG4gPT0gRU9JKSB7CisJCQkvKiBzcGVjaWFsIGNhc2U6IFsgISBdLCBbIGEgLWEgISBdIGFyZSB2YWxpZCAqLworCQkJLyogSU9XLCAiISBBUkciIG1heSBtaXNzIEFSRyAqLworCQkJdW5uZXN0X21zZygiPG5leHByOjEgKCFFT0kpXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXJlcyA9ICFuZXhwcihuKTsKKwkJdW5uZXN0X21zZygiPG5leHByOiVsbGRcbiIsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCXJlcyA9IHByaW1hcnkobik7CisJdW5uZXN0X21zZygiPG5leHByOiVsbGRcbiIsIHJlcyk7CisJcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgbnVtYmVyX3QgYWV4cHIoZW51bSB0b2tlbiBuKQoreworCW51bWJlcl90IHJlczsKKworCW5lc3RfbXNnKCI+YWV4cHIoJXMpXG4iLCBUT0tTVFJbbl0pOworCXJlcyA9IG5leHByKG4pOworCWRiZ19tc2coImFleHByOiBuZXhwcjolbGxkLCBuZXh0IGFyZ3M6JXNcbiIsIHJlcywgYXJnc1sxXSk7CisJaWYgKGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpID09IEJBTkQpIHsKKwkJZGJnX21zZygiYWV4cHI6IGFyZyBpcyBBTkQsIG5leHQgYXJnczolc1xuIiwgYXJnc1sxXSk7CisJCXJlcyA9IGFleHByKGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpKSAmJiByZXM7CisJCXVubmVzdF9tc2coIjxhZXhwcjolbGxkXG4iLCByZXMpOworCQlyZXR1cm4gcmVzOworCX0KKwlhcmdzLS07CisJdW5uZXN0X21zZygiPGFleHByOiVsbGQsIGFyZ3M6JXNcbiIsIHJlcywgYXJnc1swXSk7CisJcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgbnVtYmVyX3Qgb2V4cHIoZW51bSB0b2tlbiBuKQoreworCW51bWJlcl90IHJlczsKKworCW5lc3RfbXNnKCI+b2V4cHIoJXMpXG4iLCBUT0tTVFJbbl0pOworCXJlcyA9IGFleHByKG4pOworCWRiZ19tc2coIm9leHByOiBhZXhwcjolbGxkLCBuZXh0IGFyZ3M6JXNcbiIsIHJlcywgYXJnc1sxXSk7CisJaWYgKGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpID09IEJPUikgeworCQlkYmdfbXNnKCJvZXhwcjogbmV4dCBhcmcgaXMgT1IsIG5leHQgYXJnczolc1xuIiwgYXJnc1sxXSk7CisJCXJlcyA9IG9leHByKGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpKSB8fCByZXM7CisJCXVubmVzdF9tc2coIjxvZXhwcjolbGxkXG4iLCByZXMpOworCQlyZXR1cm4gcmVzOworCX0KKwlhcmdzLS07CisJdW5uZXN0X21zZygiPG9leHByOiVsbGQsIGFyZ3M6JXNcbiIsIHJlcywgYXJnc1swXSk7CisJcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgbnVtYmVyX3QgcHJpbWFyeShlbnVtIHRva2VuIG4pCit7CisjaWYgVEVTVF9ERUJVRworCW51bWJlcl90IHJlcyA9IHJlczsgLyogZm9yIGNvbXBpbGVyICovCisjZWxzZQorCW51bWJlcl90IHJlczsKKyNlbmRpZgorCWNvbnN0IHN0cnVjdCBvcGVyYXRvcl90ICphcmdzMF9vcDsKKworCW5lc3RfbXNnKCI+cHJpbWFyeSglcylcbiIsIFRPS1NUUltuXSk7CisJaWYgKG4gPT0gRU9JKSB7CisJCXN5bnRheChOVUxMLCAiYXJndW1lbnQgZXhwZWN0ZWQiKTsKKwl9CisJaWYgKG4gPT0gTFBBUkVOKSB7CisJCXJlcyA9IG9leHByKGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpKTsKKwkJaWYgKGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpICE9IFJQQVJFTikKKwkJCXN5bnRheChOVUxMLCAiY2xvc2luZyBwYXJlbiBleHBlY3RlZCIpOworCQl1bm5lc3RfbXNnKCI8cHJpbWFyeTolbGxkXG4iLCByZXMpOworCQlyZXR1cm4gcmVzOworCX0KKworCS8qIGNvcmV1dGlscyA2LjkgY2hlY2tzICJpcyBhcmdzWzFdIGJpbm9wIGFuZCBhcmdzWzJdIGV4aXN0PyIgZmlyc3QsCisJICogZG8gdGhlIHNhbWUgKi8KKwlhcmdzMF9vcCA9IGxhc3Rfb3BlcmF0b3I7CisJLyogbGFzdF9vcGVyYXRvciA9IG9wZXJhdG9yIGF0IGFyZ3NbMV0gKi8KKwlpZiAoY2hlY2tfb3BlcmF0b3IoYXJnc1sxXSkgIT0gRU9JKSB7IC8qIGlmIGFyZ3NbMV0gIT0gTlVMTCAqLworCQlpZiAoYXJnc1syXSkgeworCQkJLy8gY29yZXV0aWxzIGFsc28gZG9lcyB0aGlzOgorCQkJLy8gaWYgKGFyZ3NbM10gJiYgYXJnc1swXT0iLWwiICYmIGFyZ3NbMl0gaXMgQklOT1ApCisJCQkvLwlyZXR1cm4gYmlub3AoMSAvKiBwcmVwZW5kZWQgYnkgLWwgKi8pOworCQkJaWYgKGxhc3Rfb3BlcmF0b3ItPm9wX3R5cGUgPT0gQklOT1ApCisJCQkJdW5uZXN0X21zZ19hbmRfcmV0dXJuKGJpbm9wKCksICI8cHJpbWFyeTogYmlub3A6JWxsZFxuIik7CisJCX0KKwl9CisJLyogY2hlY2sgImlzIGFyZ3NbMF0gdW5vcD8iIHNlY29uZCAqLworCWlmIChhcmdzMF9vcC0+b3BfdHlwZSA9PSBVTk9QKSB7CisJCS8qIHVuYXJ5IGV4cHJlc3Npb24gKi8KKwkJaWYgKGFyZ3NbMV0gPT0gTlVMTCkKKy8vCQkJc3ludGF4KGFyZ3MwX29wLT5vcF90ZXh0LCAiYXJndW1lbnQgZXhwZWN0ZWQiKTsKKwkJCWdvdG8gY2hlY2tfZW1wdGluZXNzOworCQlhcmdzKys7CisJCWlmIChuID09IFNUUkVaKQorCQkJdW5uZXN0X21zZ19hbmRfcmV0dXJuKGFyZ3NbMF1bMF0gPT0gJ1wwJywgIjxwcmltYXJ5OiVsbGRcbiIpOworCQlpZiAobiA9PSBTVFJOWikKKwkJCXVubmVzdF9tc2dfYW5kX3JldHVybihhcmdzWzBdWzBdICE9ICdcMCcsICI8cHJpbWFyeTolbGxkXG4iKTsKKwkJaWYgKG4gPT0gRklMVFQpCisJCQl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oaXNhdHR5KGdldG4oKmFyZ3MpKSwgIjxwcmltYXJ5OiBpc2F0dHkoJXMpJWxsZFxuIiwgKmFyZ3MpOworCQl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oZmlsc3RhdCgqYXJncywgbiksICI8cHJpbWFyeTogZmlsc3RhdCglcyk6JWxsZFxuIiwgKmFyZ3MpOworCX0KKworCS8qY2hlY2tfb3BlcmF0b3IoYXJnc1sxXSk7IC0gYWxyZWFkeSBkb25lICovCisJaWYgKGxhc3Rfb3BlcmF0b3ItPm9wX3R5cGUgPT0gQklOT1ApIHsKKwkJLyogYXJnc1syXSBpcyBrbm93biB0byBiZSBOVUxMLCBpc24ndCBpdCBib3VuZCB0byBmYWlsPyAqLworCQl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oYmlub3AoKSwgIjxwcmltYXJ5OiVsbGRcbiIpOworCX0KKyBjaGVja19lbXB0aW5lc3M6CisJdW5uZXN0X21zZ19hbmRfcmV0dXJuKGFyZ3NbMF1bMF0gIT0gJ1wwJywgIjxwcmltYXJ5OiVsbGRcbiIpOworfQorCisKK2ludCB0ZXN0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByZXM7CisJY29uc3QgY2hhciAqYXJnMDsKKy8vCWJvb2wgbmVnYXRlID0gMDsKKworCWFyZzAgPSBiYl9iYXNlbmFtZShhcmd2WzBdKTsKKwlpZiAoYXJnMFswXSA9PSAnWycpIHsKKwkJLS1hcmdjOworCQlpZiAoIWFyZzBbMV0pIHsgLyogIlsiID8gKi8KKwkJCWlmIChOT1RfTE9ORV9DSEFSKGFyZ3ZbYXJnY10sICddJykpIHsKKwkJCQliYl9lcnJvcl9tc2coIm1pc3NpbmcgXSIpOworCQkJCXJldHVybiAyOworCQkJfQorCQl9IGVsc2UgeyAvKiBhc3N1bWluZyAiW1siICovCisJCQlpZiAoc3RyY21wKGFyZ3ZbYXJnY10sICJdXSIpICE9IDApIHsKKwkJCQliYl9lcnJvcl9tc2coIm1pc3NpbmcgXV0iKTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJfQorCQlhcmd2W2FyZ2NdID0gTlVMTDsKKwl9CisKKwkvKiBXZSBtdXN0IGRvIERFSU5JVF9TKCkgcHJpb3IgdG8gcmV0dXJuaW5nICovCisJSU5JVF9TKCk7CisKKwlyZXMgPSBzZXRqbXAobGVhdmluZyk7CisJaWYgKHJlcykKKwkJZ290byByZXQ7CisKKwkvKiByZXNldHRpbmcgbmdyb3VwcyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeS4gIGl0IHdpbGwKKwkgKiBmb3JjZSBhIG5ldyBjYWxsIHRvIGdldGdyb3VwcygpLCB3aGljaCBwcmV2ZW50cyB1c2luZworCSAqIGdyb3VwIGRhdGEgZmV0Y2hlZCBkdXJpbmcgYSBwcmV2aW91cyBjYWxsLiAgYnV0IHRoZQorCSAqIG9ubHkgd2F5IHRoZSBncm91cCBkYXRhIGNvdWxkIGJlIHN0YWxlIGlzIGlmIHRoZXJlJ3MKKwkgKiBiZWVuIGFuIGludGVydmVuaW5nIGNhbGwgdG8gc2V0Z3JvdXBzKCksIGFuZCB0aGlzCisJICogaXNuJ3QgbGlrZWx5IGluIHRoZSBjYXNlIG9mIGEgc2hlbGwuICBwYXJhbm9pYQorCSAqIHByZXZhaWxzLi4uCisJICovCisJLypuZ3JvdXBzID0gMDsgLSBkb25lIGJ5IElOSVRfUygpICovCisKKwkvL2FyZ2MtLTsKKwlhcmd2Kys7CisKKwkvKiBJbXBsZW1lbnQgc3BlY2lhbCBjYXNlcyBmcm9tIFBPU0lYLjIsIHNlY3Rpb24gNC42Mi40ICovCisJaWYgKCFhcmd2WzBdKSB7IC8qICJ0ZXN0IiAqLworCQlyZXMgPSAxOworCQlnb3RvIHJldDsKKwl9CisjaWYgMAorLy8gTm93IGl0J3MgZml4ZWQgaW4gdGhlIHBhcnNlciBhbmQgc2hvdWxkIG5vdCBiZSBuZWVkZWQKKwlpZiAoTE9ORV9DSEFSKGFyZ3ZbMF0sICchJykgJiYgYXJndlsxXSkgeworCQluZWdhdGUgPSAxOworCQkvL2FyZ2MtLTsKKwkJYXJndisrOworCX0KKwlpZiAoIWFyZ3ZbMV0pIHsgLyogInRlc3QgWyFdIGFyZyIgKi8KKwkJcmVzID0gKCphcmd2WzBdID09ICdcMCcpOworCQlnb3RvIHJldDsKKwl9CisJaWYgKGFyZ3ZbMl0gJiYgIWFyZ3ZbM10pIHsKKwkJY2hlY2tfb3BlcmF0b3IoYXJndlsxXSk7CisJCWlmIChsYXN0X29wZXJhdG9yLT5vcF90eXBlID09IEJJTk9QKSB7CisJCQkvKiAidGVzdCBbIV0gYXJnMSA8YmluYXJ5X29wPiBhcmcyIiAqLworCQkJYXJncyA9IGFyZ3Y7CisJCQlyZXMgPSAoYmlub3AoKSA9PSAwKTsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorCisJLyogU29tZSBjb21wbGV4IGV4cHJlc3Npb24uIFVuZG8gJyEnIHJlbW92YWwgKi8KKwlpZiAobmVnYXRlKSB7CisJCW5lZ2F0ZSA9IDA7CisJCS8vYXJnYysrOworCQlhcmd2LS07CisJfQorI2VuZGlmCisJYXJncyA9IGFyZ3Y7CisJcmVzID0gIW9leHByKGNoZWNrX29wZXJhdG9yKCphcmdzKSk7CisKKwlpZiAoKmFyZ3MgIT0gTlVMTCAmJiAqKythcmdzICE9IE5VTEwpIHsKKwkJLyogRXhhbXBsZXM6CisJCSAqIHRlc3QgMyAtbHQgNSA2CisJCSAqIHRlc3QgLXQgMSAyCisJCSAqLworCQliYl9lcnJvcl9tc2coIiVzOiB1bmtub3duIG9wZXJhbmQiLCAqYXJncyk7CisJCXJlcyA9IDI7CisJfQorIHJldDoKKwlERUlOSVRfUygpOworLy8JcmV0dXJuIG5lZ2F0ZSA/ICFyZXMgOiByZXM7CisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy90ZXN0X3B0cl9oYWNrLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGVzdF9wdHJfaGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTlkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdGVzdF9wdHJfaGFjay5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworc3RydWN0IHRlc3Rfc3RhdGljczsKKworI2lmbmRlZiBHQ0NfQ09NQklORQorCisvKiBXZSBjaGVhdCBoZXJlLiBJdCBpcyBkZWNsYXJlZCBhcyBjb25zdCBwdHIgaW4gbGliYmIuaCwKKyAqIGJ1dCBoZXJlIHdlIG1ha2UgaXQgbGl2ZSBpbiBSL1cgbWVtb3J5ICovCitzdHJ1Y3QgdGVzdF9zdGF0aWNzICp0ZXN0X3B0cl90b19zdGF0aWNzOworCisjZWxzZQorCisvKiBnY2MgLWNvbWJpbmUgd2lsbCBzZWUgdGhyb3VnaCBhbmQgY29tcGxhaW4gKi8KKy8qIFVzaW5nIGFsdGVybmF0aXZlIG1ldGhvZCB3aGljaCBpcyBtb3JlIGxpa2VseSB0byBicmVhaworICogb24gd2VpcmQgYXJjaGl0ZWN0dXJlcywgY29tcGlsZXJzLCBsaW5rZXJzIGFuZCBzbyBvbiAqLworc3RydWN0IHRlc3Rfc3RhdGljcyAqY29uc3QgdGVzdF9wdHJfdG9fc3RhdGljcyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdG91Y2guYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy90b3VjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTgwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdG91Y2guYwpAQCAtMCwwICsxLDE1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB0b3VjaCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIF9OT1RfIGNvbXBsaWFudCAtLSBvcHRpb25zIC1hLCAtbSwgLXIsIC10IG5vdCBzdXBwb3J0ZWQuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3RvdWNoLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBQcmV2aW91cyB2ZXJzaW9uIGNhbGxlZCBvcGVuKCkgYW5kIHRoZW4gdXRpbWUoKS4gIFdoaWxlIHRoaXMgd2lsbCBiZQorICogYmUgbmVjZXNzYXJ5IHRvIGltcGxlbWVudCAtciBhbmQgLXQsIGl0IGN1cnJlbnRseSBvbmx5IG1ha2VzIHRoaW5ncyBiaWdnZXIuCisgKiBBbHNvLCBleGl0aW5nIG9uIGEgZmFpbHVyZSB3YXMgYSBidWcuICBBbGwgYXJncyBzaG91bGQgYmUgcHJvY2Vzc2VkLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvL2NvbmZpZzpjb25maWcgVE9VQ0gKKy8vY29uZmlnOglib29sICJ0b3VjaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICB0b3VjaCBpcyB1c2VkIHRvIGNyZWF0ZSBvciBjaGFuZ2UgdGhlIGFjY2VzcyBhbmQvb3IKKy8vY29uZmlnOgkgIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgb2Ygc3BlY2lmaWVkIGZpbGVzLgorCisvL2FwcGxldDpJRl9UT1VDSChBUFBMRVRfTk9GT1JLKHRvdWNoLCB0b3VjaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCB0b3VjaCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19UT1VDSCkgKz0gdG91Y2gubworCisvL3VzYWdlOiNkZWZpbmUgdG91Y2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY10iIElGX0RFU0tUT1AoIiBbLWQgREFURV0gWy1yIEZJTEVdIikgIiBGSUxFIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB0b3VjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlVwZGF0ZSB0aGUgbGFzdC1tb2RpZmllZCBkYXRlIG9uIHRoZSBnaXZlbiBGSUxFW3NdXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCURvbid0IGNyZWF0ZSBmaWxlcyIKKy8vdXNhZ2U6CUlGX0RFU0tUT1AoCisvL3VzYWdlOiAgICAgIlxuCS1kIERUCURhdGUvdGltZSB0byB1c2UiCisvL3VzYWdlOiAgICAgIlxuCS1yIEZJTEUJVXNlIEZJTEUncyBkYXRlL3RpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRvdWNoX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiL2Jpbi9sczogL3RtcC9mb286IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHRvdWNoIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1ydy1ydy1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgICAgICAgMCBBcHIgMTUgMDE6MTEgL3RtcC9mb29cbiIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLyogY29yZXV0aWxzIGltcGxlbWVudHM6CisgKiAtYSAgIGNoYW5nZSBvbmx5IHRoZSBhY2Nlc3MgdGltZQorICogLWMsIC0tbm8tY3JlYXRlCisgKiAgICAgIGRvIG5vdCBjcmVhdGUgYW55IGZpbGVzCisgKiAtZCwgLS1kYXRlPVNUUklORworICogICAgICBwYXJzZSBTVFJJTkcgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGN1cnJlbnQgdGltZQorICogLWYgICAoaWdub3JlZCwgQlNEIGNvbXBhdCkKKyAqIC1tICAgY2hhbmdlIG9ubHkgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCisgKiAtciwgLS1yZWZlcmVuY2U9RklMRQorICogICAgICB1c2UgdGhpcyBmaWxlJ3MgdGltZXMgaW5zdGVhZCBvZiBjdXJyZW50IHRpbWUKKyAqIC10IFNUQU1QCisgKiAgICAgIHVzZSBbW0NDXVlZXU1NRERoaG1tWy5zc10gaW5zdGVhZCBvZiBjdXJyZW50IHRpbWUKKyAqIC0tdGltZT1XT1JECisgKiAgICAgIGNoYW5nZSB0aGUgc3BlY2lmaWVkIHRpbWU6IFdPUkQgaXMgYWNjZXNzLCBhdGltZSwgb3IgdXNlCisgKi8KKworaW50IHRvdWNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0b3VjaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJaW50IG9wdHM7CisjaWYgRU5BQkxFX0RFU0tUT1AKKyMgaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIHRvdWNoX2xvbmdvcHRzW10gQUxJR04xID0KKwkJLyogbmFtZSwgaGFzX2FyZywgdmFsICovCisJCSJuby1jcmVhdGVcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYyIKKwkJInJlZmVyZW5jZVwwIiAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJyIgorCQkiZGF0ZVwwIiAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImQiCisJOworIyBlbmRpZgorCWNoYXIgKnJlZmVyZW5jZV9maWxlID0gTlVMTDsKKwljaGFyICpkYXRlX3N0ciA9IE5VTEw7CisJc3RydWN0IHRpbWV2YWwgdGltZWJ1ZlsyXTsKKwl0aW1lYnVmWzFdLnR2X3VzZWMgPSB0aW1lYnVmWzBdLnR2X3VzZWMgPSAwOworI2Vsc2UKKyMgZGVmaW5lIHJlZmVyZW5jZV9maWxlIE5VTEwKKyMgZGVmaW5lIGRhdGVfc3RyICAgICAgIE5VTEwKKyMgZGVmaW5lIHRpbWVidWYgICAgICAgICgoc3RydWN0IHRpbWV2YWwqKU5VTEwpCisjZW5kaWYKKworI2lmIEVOQUJMRV9ERVNLVE9QICYmIEVOQUJMRV9MT05HX09QVFMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gdG91Y2hfbG9uZ29wdHM7CisjZW5kaWYKKwkvKiAtZCBhbmQgLXQgYm90aCBzZXQgdGltZS4gSW4gY29yZXV0aWxzLAorCSAqIGFjY2VwdGVkIGRhdGEgZm9ybWF0IGRpZmZlcnMgYSBiaXQgYmV0d2VlbiAtZCBhbmQgLXQuCisJICogV2UgYWNjZXB0IHRoZSBzYW1lIGZvcm1hdHMgZm9yIGJvdGggKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImMiIElGX0RFU0tUT1AoInI6ZDp0OiIpCisJCQkJLyppZ25vcmVkOiovICJmbWEiCisJCQkJSUZfREVTS1RPUCgsICZyZWZlcmVuY2VfZmlsZSkKKwkJCQlJRl9ERVNLVE9QKCwgJmRhdGVfc3RyKQorCQkJCUlGX0RFU0tUT1AoLCAmZGF0ZV9zdHIpCisJKTsKKworCW9wdHMgJj0gMTsgLyogb25seSAtYyBiaXQgaXMgbGVmdCAqLworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghKmFyZ3YpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmIChyZWZlcmVuY2VfZmlsZSkgeworCQlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKwkJeHN0YXQocmVmZXJlbmNlX2ZpbGUsICZzdGJ1Zik7CisJCXRpbWVidWZbMV0udHZfc2VjID0gdGltZWJ1ZlswXS50dl9zZWMgPSBzdGJ1Zi5zdF9tdGltZTsKKwl9CisKKwlpZiAoZGF0ZV9zdHIpIHsKKwkJc3RydWN0IHRtIHRtX3RpbWU7CisJCXRpbWVfdCB0OworCisJCS8vbWVtc2V0KCZ0bV90aW1lLCAwLCBzaXplb2YodG1fdGltZSkpOworCQkvKiBCZXR0ZXIgdGhhbiBtZW1zZXQ6IG1ha2VzICJISDpNTSIgZGF0ZXMgbWVhbmluZ2Z1bCAqLworCQl0aW1lKCZ0KTsKKwkJbG9jYWx0aW1lX3IoJnQsICZ0bV90aW1lKTsKKwkJcGFyc2VfZGF0ZXN0cihkYXRlX3N0ciwgJnRtX3RpbWUpOworCisJCS8qIENvcnJlY3QgYW55IGRheSBvZiB3ZWVrIGFuZCBkYXkgb2YgeWVhciBldGMuIGZpZWxkcyAqLworCQl0bV90aW1lLnRtX2lzZHN0ID0gLTE7ICAvKiBCZSBzdXJlIHRvIHJlY2hlY2sgZHN0ICovCisJCXQgPSB2YWxpZGF0ZV90bV90aW1lKGRhdGVfc3RyLCAmdG1fdGltZSk7CisKKwkJdGltZWJ1ZlsxXS50dl9zZWMgPSB0aW1lYnVmWzBdLnR2X3NlYyA9IHQ7CisJfQorCisJZG8geworCQlpZiAodXRpbWVzKCphcmd2LCAocmVmZXJlbmNlX2ZpbGUgfHwgZGF0ZV9zdHIpID8gdGltZWJ1ZiA6IE5VTEwpICE9IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsgLyogbm8gc3VjaCBmaWxlICovCisJCQkJaWYgKG9wdHMpIHsgLyogY3JlYXRpb24gaXMgZGlzYWJsZWQsIHNvIGlnbm9yZSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogVHJ5IHRvIGNyZWF0ZSB0aGUgZmlsZSAqLworCQkJCWZkID0gb3BlbigqYXJndiwgT19SRFdSIHwgT19DUkVBVCwgMDY2Nik7CisJCQkJaWYgKGZkID49IDApIHsKKwkJCQkJeGNsb3NlKGZkKTsKKwkJCQkJaWYgKHJlZmVyZW5jZV9maWxlIHx8IGRhdGVfc3RyKQorCQkJCQkJdXRpbWVzKCphcmd2LCB0aW1lYnVmKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmFyZ3YpOworCQl9CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3RyLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjc5NDhhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3RyLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgdHIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiogQ29weXJpZ2h0IChjKSAxOTg3LDE5OTcsIFByZW50aWNlIEhhbGwgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBuYW1lIG9mIFByZW50aWNlIEhhbGwgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIENvcHlyaWdodCAoYykgTWljaGllbCBIdWlzamVzCisgKgorICogVGhpcyB2ZXJzaW9uIG9mIHRyIGlzIGFkYXB0ZWQgZnJvbSBNaW5peCB0ciBhbmQgd2FzIG1vZGlmaWVkCisgKiBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+IHRvIGJlIHVzZWQgaW4gYnVzeWJveC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3RyLmh0bWwKKyAqIFRPRE86IGdyYXBoLCBwcmludAorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19UUikgKz0gdHIubworCisvL2NvbmZpZzpjb25maWcgVFIKKy8vY29uZmlnOglib29sICJ0ciIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICB0ciBpcyB1c2VkIHRvIHNxdWVlemUsIGFuZC9vciBkZWxldGUgY2hhcmFjdGVycyBmcm9tIHN0YW5kYXJkCisvL2NvbmZpZzoJICBpbnB1dCwgd3JpdGluZyB0byBzdGFuZGFyZCBvdXRwdXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RSX0NMQVNTRVMKKy8vY29uZmlnOglib29sICJFbmFibGUgY2hhcmFjdGVyIGNsYXNzZXMgKHN1Y2ggYXMgWzp1cHBlcjpdKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRSCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGNoYXJhY3RlciBjbGFzc2VzLCBlbmFibGluZyBjb21tYW5kcyBzdWNoIGFzOgorLy9jb25maWc6CSAgdHIgWzp1cHBlcjpdIFs6bG93ZXI6XSB0byBjb252ZXJ0IGlucHV0IGludG8gbG93ZXJjYXNlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9UUl9FUVVJVgorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBlcXVpdmFsZW5jZSBjbGFzc2VzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVFIKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgZXF1aXZhbGVuY2UgY2xhc3Nlcywgd2hpY2ggZXNzZW50aWFsbHkgYWRkIHRoZSBlbmNsb3NlZAorLy9jb25maWc6CSAgY2hhcmFjdGVyIHRvIHRoZSBjdXJyZW50IHNldC4gRm9yIGluc3RhbmNlLCB0ciBbPWE9XSB4eXogd291bGQKKy8vY29uZmlnOgkgIHJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAnYScgd2l0aCAneHl6Jy4gVGhpcyBvcHRpb24gaXMgbWFpbmx5CisvL2NvbmZpZzoJICB1c2VmdWwgZm9yIGNhc2VzIHdoZW4gbm8gb3RoZXIgd2F5IG9mIGV4cHJlc3NpbmcgYSBjaGFyYWN0ZXIKKy8vY29uZmlnOgkgIGlzIHBvc3NpYmxlLgorCisvL3VzYWdlOiNkZWZpbmUgdHJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2RzXSBTVFJJTkcxIFtTVFJJTkcyXSIKKy8vdXNhZ2U6I2RlZmluZSB0cl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlRyYW5zbGF0ZSwgc3F1ZWV6ZSwgb3IgZGVsZXRlIGNoYXJhY3RlcnMgZnJvbSBzdGRpbiwgd3JpdGluZyB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJVGFrZSBjb21wbGVtZW50IG9mIFNUUklORzEiCisvL3VzYWdlOiAgICAgIlxuCS1kCURlbGV0ZSBpbnB1dCBjaGFyYWN0ZXJzIGNvZGVkIFNUUklORzEiCisvL3VzYWdlOiAgICAgIlxuCS1zCVNxdWVlemUgbXVsdGlwbGUgb3V0cHV0IGNoYXJhY3RlcnMgb2YgU1RSSU5HMiBpbnRvIG9uZSBjaGFyYWN0ZXIiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRyX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gXCJnZGtrbiB2bnFrY1wiIHwgdHIgW2EteV0gW2Itel1cbiIKKy8vdXNhZ2U6ICAgICAgICJoZWxsbyB3b3JsZFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZW51bSB7CisJQVNDSUkgPSAyNTYsCisJLyogc3RyaW5nIGJ1ZmZlciBuZWVkcyB0byBiZSBhdCBsZWFzdCBhcyBiaWcgYXMgdGhlIHdob2xlICJhbHBoYWJldCIuCisJICogQlVGU0laID09IEFTQ0lJIGlzIG9rLCBidXQgd2Ugd2lsbCByZWFsbG9jIGluIGV4cGFuZAorCSAqIGV2ZW4gZm9yIHNtYWxsZXN0IHBhdHRlcm5zLCBsZXQncyBhdm9pZCB0aGF0IGJ5IHVzaW5nICoyOgorCSAqLworCVRSX0JVRlNJWiA9IChCVUZTSVogPiBBU0NJSSoyKSA/IEJVRlNJWiA6IEFTQ0lJKjIsCit9OworCitzdGF0aWMgdm9pZCBtYXAoY2hhciAqcHZlY3RvciwKKwkJY2hhciAqc3RyaW5nMSwgdW5zaWduZWQgc3RyaW5nMV9sZW4sCisJCWNoYXIgKnN0cmluZzIsIHVuc2lnbmVkIHN0cmluZzJfbGVuKQoreworCWNoYXIgbGFzdCA9ICcwJzsKKwl1bnNpZ25lZCBpLCBqOworCisJZm9yIChqID0gMCwgaSA9IDA7IGkgPCBzdHJpbmcxX2xlbjsgaSsrKSB7CisJCWlmIChzdHJpbmcyX2xlbiA8PSBqKQorCQkJcHZlY3RvclsodW5zaWduZWQgY2hhcikoc3RyaW5nMVtpXSldID0gbGFzdDsKKwkJZWxzZQorCQkJcHZlY3RvclsodW5zaWduZWQgY2hhcikoc3RyaW5nMVtpXSldID0gbGFzdCA9IHN0cmluZzJbaisrXTsKKwl9Cit9CisKKy8qIHN1cHBvcnRlZCBjb25zdHJ1Y3RzOgorICogICBSYW5nZXMsICBlLmcuLCAgMC05ICAgPT0+ICAwMTIzNDU2Nzg5CisgKiAgIEVzY2FwZXMsIGUuZy4sICBcYSAgICA9PT4gIENvbnRyb2wtRworICogICBDaGFyYWN0ZXIgY2xhc3NlcywgZS5nLiBbOnVwcGVyOl0gPT0+IEEuLi5aCisgKiAgIEVxdWl2IGNsYXNzZXNzLCBlLmcuIFs9QT1dID09PiBBICAgKGhtbW1tbW1tPykKKyAqIG5vdCBzdXBwb3J0ZWQ6CisgKiAgIFxvb28tXG9vbyAtIG9jdGFsIHJhbmdlcworICogICBbeCpOXSAtIHJlcGVhdCBjaGFyIHggTiB0aW1lcworICogICBbeCpdIC0gcmVwZWF0IGNoYXIgeCB1bnRpbCBpdCBmaWxscyBTVFJJTkcyOgorICogIyBlY2hvIHF3ZTEyMyB8IC91c3IvYmluL3RyIDEyMzQ1Njc4OSAnW2RdJworICogcXdlW2RdCisgKiAjIGVjaG8gcXdlMTIzIHwgL3Vzci9iaW4vdHIgMTIzNDU2Nzg5ICdbZCpdJworICogcXdlZGRkCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBleHBhbmQoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqYnVmZmVyX3ApCit7CisJY2hhciAqYnVmZmVyID0gKmJ1ZmZlcl9wOworCXVuc2lnbmVkIHBvcyA9IDA7CisJdW5zaWduZWQgc2l6ZSA9IFRSX0JVRlNJWjsKKwl1bnNpZ25lZCBpOyAvKiBjYW4ndCBiZSB1bnNpZ25lZCBjaGFyOiBtdXN0IGJlIGFibGUgdG8gaG9sZCAyNTYgKi8KKwl1bnNpZ25lZCBjaGFyIGFjOworCisJd2hpbGUgKCphcmcpIHsKKwkJaWYgKHBvcyArIEFTQ0lJID4gc2l6ZSkgeworCQkJc2l6ZSArPSBBU0NJSTsKKwkJCSpidWZmZXJfcCA9IGJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgc2l6ZSk7CisJCX0KKwkJaWYgKCphcmcgPT0gJ1xcJykgeworCQkJYXJnKys7CisJCQlidWZmZXJbcG9zKytdID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoJmFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXJnWzFdID09ICctJykgeyAvKiAiMC05Li4uIiAqLworCQkJYWMgPSBhcmdbMl07CisJCQlpZiAoYWMgPT0gJ1wwJykgeyAvKiAiMC0iOiBjb3B5IHZlcmJhdGltICovCisJCQkJYnVmZmVyW3BvcysrXSA9ICphcmcrKzsgLyogY29weSAnMCcgKi8KKwkJCQljb250aW51ZTsgLyogbmV4dCBpdGVyIHdpbGwgY29weSAnLScgYW5kIHN0b3AgKi8KKwkJCX0KKwkJCWkgPSAodW5zaWduZWQgY2hhcikgKmFyZzsKKwkJCXdoaWxlIChpIDw9IGFjKSAvKiBvazogaSBpcyB1bnNpZ25lZCBfaW50XyAqLworCQkJCWJ1ZmZlcltwb3MrK10gPSBpKys7CisJCQlhcmcgKz0gMzsgLyogc2tpcCAwLTkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoRU5BQkxFX0ZFQVRVUkVfVFJfQ0xBU1NFUyB8fCBFTkFCTEVfRkVBVFVSRV9UUl9FUVVJVikKKwkJICYmICphcmcgPT0gJ1snCisJCSkgeworCQkJYXJnKys7CisJCQlpID0gKHVuc2lnbmVkIGNoYXIpICphcmcrKzsKKwkJCS8qICJbeHl6Li4uIi4gaT14LCBhcmcgcG9pbnRzIHRvIHkgKi8KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9UUl9DTEFTU0VTICYmIGkgPT0gJzonKSB7IC8qIFs6Y2xhc3M6XSAqLworI2RlZmluZSBDTE8gIjpdXDAiCisJCQkJc3RhdGljIGNvbnN0IGNoYXIgY2xhc3Nlc1tdIEFMSUdOMSA9CisJCQkJCSJhbHBoYSJDTE8gImFsbnVtIkNMTyAiZGlnaXQiQ0xPCisJCQkJCSJsb3dlciJDTE8gInVwcGVyIkNMTyAic3BhY2UiQ0xPCisJCQkJCSJibGFuayJDTE8gInB1bmN0IkNMTyAiY250cmwiQ0xPCisJCQkJCSJ4ZGlnaXQiQ0xPOworCQkJCWVudW0geworCQkJCQlDTEFTU19pbnZhbGlkID0gMCwgLyogd2UgaW5jcmVtZW50IHRoZSByZXR2YWwgKi8KKwkJCQkJQ0xBU1NfYWxwaGEgPSAxLAorCQkJCQlDTEFTU19hbG51bSA9IDIsCisJCQkJCUNMQVNTX2RpZ2l0ID0gMywKKwkJCQkJQ0xBU1NfbG93ZXIgPSA0LAorCQkJCQlDTEFTU191cHBlciA9IDUsCisJCQkJCUNMQVNTX3NwYWNlID0gNiwKKwkJCQkJQ0xBU1NfYmxhbmsgPSA3LAorCQkJCQlDTEFTU19wdW5jdCA9IDgsCisJCQkJCUNMQVNTX2NudHJsID0gOSwKKwkJCQkJQ0xBU1NfeGRpZ2l0ID0gMTAsCisJCQkJCS8vQ0xBU1NfZ3JhcGggPSAxMSwKKwkJCQkJLy9DTEFTU19wcmludCA9IDEyLAorCQkJCX07CisJCQkJc21hbGx1aW50IGo7CisJCQkJY2hhciAqdG1wOworCisJCQkJLyogeGRpZ2l0IG5lZWRzIDgsIG5vdCA3ICovCisJCQkJaSA9IDcgKyAoYXJnWzBdID09ICd4Jyk7CisJCQkJdG1wID0geHN0cm5kdXAoYXJnLCBpKTsKKwkJCQlqID0gaW5kZXhfaW5fc3RyaW5ncyhjbGFzc2VzLCB0bXApICsgMTsKKwkJCQlmcmVlKHRtcCk7CisKKwkJCQlpZiAoaiA9PSBDTEFTU19pbnZhbGlkKQorCQkJCQlnb3RvIHNraXBfYnJhY2tldDsKKworCQkJCWFyZyArPSBpOworCQkJCWlmIChqID09IENMQVNTX2FsbnVtIHx8IGogPT0gQ0xBU1NfZGlnaXQgfHwgaiA9PSBDTEFTU194ZGlnaXQpIHsKKwkJCQkJZm9yIChpID0gJzAnOyBpIDw9ICc5JzsgaSsrKQorCQkJCQkJYnVmZmVyW3BvcysrXSA9IGk7CisJCQkJfQorCQkJCWlmIChqID09IENMQVNTX2FscGhhIHx8IGogPT0gQ0xBU1NfYWxudW0gfHwgaiA9PSBDTEFTU191cHBlcikgeworCQkJCQlmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspCisJCQkJCQlidWZmZXJbcG9zKytdID0gaTsKKwkJCQl9CisJCQkJaWYgKGogPT0gQ0xBU1NfYWxwaGEgfHwgaiA9PSBDTEFTU19hbG51bSB8fCBqID09IENMQVNTX2xvd2VyKSB7CisJCQkJCWZvciAoaSA9ICdhJzsgaSA8PSAneic7IGkrKykKKwkJCQkJCWJ1ZmZlcltwb3MrK10gPSBpOworCQkJCX0KKwkJCQlpZiAoaiA9PSBDTEFTU19zcGFjZSB8fCBqID09IENMQVNTX2JsYW5rKSB7CisJCQkJCWJ1ZmZlcltwb3MrK10gPSAnXHQnOworCQkJCQlpZiAoaiA9PSBDTEFTU19zcGFjZSkgeworCQkJCQkJYnVmZmVyW3BvcysrXSA9ICdcbic7CisJCQkJCQlidWZmZXJbcG9zKytdID0gJ1x2JzsKKwkJCQkJCWJ1ZmZlcltwb3MrK10gPSAnXGYnOworCQkJCQkJYnVmZmVyW3BvcysrXSA9ICdccic7CisJCQkJCX0KKwkJCQkJYnVmZmVyW3BvcysrXSA9ICcgJzsKKwkJCQl9CisJCQkJaWYgKGogPT0gQ0xBU1NfcHVuY3QgfHwgaiA9PSBDTEFTU19jbnRybCkgeworCQkJCQlmb3IgKGkgPSAnXDAnOyBpIDwgQVNDSUk7IGkrKykgeworCQkJCQkJaWYgKChqID09IENMQVNTX3B1bmN0ICYmIGlzcHJpbnRfYXNjaWlvbmx5KGkpICYmICFpc2FsbnVtKGkpICYmICFpc3NwYWNlKGkpKQorCQkJCQkJIHx8IChqID09IENMQVNTX2NudHJsICYmIGlzY250cmwoaSkpCisJCQkJCQkpIHsKKwkJCQkJCQlidWZmZXJbcG9zKytdID0gaTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoaiA9PSBDTEFTU194ZGlnaXQpIHsKKwkJCQkJZm9yIChpID0gJ0EnOyBpIDw9ICdGJzsgaSsrKSB7CisJCQkJCQlidWZmZXJbcG9zICsgNl0gPSBpIHwgMHgyMDsKKwkJCQkJCWJ1ZmZlcltwb3MrK10gPSBpOworCQkJCQl9CisJCQkJCXBvcyArPSA2OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qICJbeHl6Li4uIiwgaT14LCBhcmcgcG9pbnRzIHRvIHkgKi8KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9UUl9FUVVJViAmJiBpID09ICc9JykgeyAvKiBbPUNIQVI9XSAqLworCQkJCWJ1ZmZlcltwb3MrK10gPSAqYXJnOyAvKiBjb3B5IENIQVIgKi8KKwkJCQlpZiAoIWFyZ1swXSB8fCBhcmdbMV0gIT0gJz0nIHx8IGFyZ1syXSAhPSAnXScpCisJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQlhcmcgKz0gMzsgIC8qIHNraXAgQ0hBUj1dICovCisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBUaGUgcmVzdCBvZiAiW3h5ei4uLiIgY2FzZXMgaXMgdHJlYXRlZCBhcyBub3JtYWwKKwkJCSAqIHN0cmluZywgIlsiIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgaGVyZToKKwkJCSAqIHRyICJbYS16XSIgIltBLVpdIiBjYW4gYmUgd3JpdHRlbiBhcyB0ciAiYS16IiAiQS1aIiwKKwkJCSAqIGFsc28gdHJ5IHRyICJbYS16XSIgIl9BLVorIiBhbmQgeW91J2xsIHNlZSB0aGF0CisJCQkgKiBbXSBpcyBub3Qgc3BlY2lhbCBoZXJlLgorCQkJICovCisgc2tpcF9icmFja2V0OgorCQkJYXJnIC09IDI7IC8qIHBvaW50cyB0byAiWyIgaW4gIlt4eXouLi4iICovCisJCX0KKwkJYnVmZmVyW3BvcysrXSA9ICphcmcrKzsKKwl9CisJcmV0dXJuIHBvczsKK30KKworLyogTkI6IGJ1ZmZlciBpcyBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IFRSX0JVRlNJWkUKKyAqICh3aGljaCBpcyA+PSBBU0NJSSkgYmlnLgorICovCitzdGF0aWMgaW50IGNvbXBsZW1lbnQoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX2xlbikKK3sKKwlpbnQgbGVuOworCWNoYXIgY29udltBU0NJSV07CisJdW5zaWduZWQgY2hhciBjaDsKKworCWxlbiA9IDA7CisJY2ggPSAnXDAnOworCXdoaWxlICgxKSB7CisJCWlmIChtZW1jaHIoYnVmZmVyLCBjaCwgYnVmZmVyX2xlbikgPT0gTlVMTCkKKwkJCWNvbnZbbGVuKytdID0gY2g7CisJCWlmICgrK2NoID09ICdcMCcpCisJCQlicmVhazsKKwl9CisJbWVtY3B5KGJ1ZmZlciwgY29udiwgbGVuKTsKKwlyZXR1cm4gbGVuOworfQorCitpbnQgdHJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwlzbWFsbHVpbnQgb3B0czsKKwlzc2l6ZV90IHJlYWRfY2hhcnM7CisJc2l6ZV90IGluX2luZGV4LCBvdXRfaW5kZXg7CisJdW5zaWduZWQgbGFzdCA9IFVDSEFSX01BWCArIDE7IC8qIG5vdCBlcXVhbCB0byBhbnkgY2hhciAqLworCXVuc2lnbmVkIGNoYXIgY29kZWQsIGM7CisJY2hhciAqc3RyMSA9IHhtYWxsb2MoVFJfQlVGU0laKTsKKwljaGFyICpzdHIyID0geG1hbGxvYyhUUl9CVUZTSVopOworCWludCBzdHIyX2xlbmd0aDsKKwlpbnQgc3RyMV9sZW5ndGg7CisJY2hhciAqdmVjdG9yID0geHphbGxvYyhBU0NJSSAqIDMpOworCWNoYXIgKmludmVjICA9IHZlY3RvciArIEFTQ0lJOworCWNoYXIgKm91dHZlYyA9IHZlY3RvciArIEFTQ0lJICogMjsKKworI2RlZmluZSBUUl9PUFRfY29tcGxlbWVudCAgICgzIDw8IDApCisjZGVmaW5lIFRSX09QVF9kZWxldGUgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgVFJfT1BUX3NxdWVlemVfcmVwcyAoMSA8PCAzKQorCisJZm9yIChpID0gMDsgaSA8IEFTQ0lJOyBpKyspIHsKKwkJdmVjdG9yW2ldID0gaTsKKwkJLyppbnZlY1tpXSA9IG91dHZlY1tpXSA9IEZBTFNFOyAtIGRvbmUgYnkgeHphbGxvYyAqLworCX0KKworCS8qIC1DLy1jIGRpZmZlcmVuY2UgaXMgdGhhdCAtQyBjb21wbGVtZW50cyAiY2hhcmFjdGVycyIsCisJICogYW5kIC1jIGNvbXBsZW1lbnRzICJ2YWx1ZXMiIChiaW5hcnkgYnl0ZXMgSSBndWVzcykuCisJICogSW4gUE9TSVggbG9jYWxlLCB0aGVzZSBhcmUgdGhlIHNhbWUuCisJICovCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICIrQ2NkcyIpOyAvKiAnKyc6IHN0b3AgYXQgZmlyc3Qgbm9uLW9wdGlvbiAqLworCWFyZ3YgKz0gb3B0aW5kOworCisJc3RyMV9sZW5ndGggPSBleHBhbmQoKmFyZ3YrKywgJnN0cjEpOworCXN0cjJfbGVuZ3RoID0gMDsKKwlpZiAob3B0cyAmIFRSX09QVF9jb21wbGVtZW50KQorCQlzdHIxX2xlbmd0aCA9IGNvbXBsZW1lbnQoc3RyMSwgc3RyMV9sZW5ndGgpOworCWlmICgqYXJndikgeworCQlpZiAoYXJndlswXVswXSA9PSAnXDAnKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlNUUklORzIgY2Fubm90IGJlIGVtcHR5Iik7CisJCXN0cjJfbGVuZ3RoID0gZXhwYW5kKCphcmd2LCAmc3RyMik7CisJCW1hcCh2ZWN0b3IsIHN0cjEsIHN0cjFfbGVuZ3RoLAorCQkJCXN0cjIsIHN0cjJfbGVuZ3RoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHN0cjFfbGVuZ3RoOyBpKyspCisJCWludmVjWyh1bnNpZ25lZCBjaGFyKShzdHIxW2ldKV0gPSBUUlVFOworCWZvciAoaSA9IDA7IGkgPCBzdHIyX2xlbmd0aDsgaSsrKQorCQlvdXR2ZWNbKHVuc2lnbmVkIGNoYXIpKHN0cjJbaV0pXSA9IFRSVUU7CisKKwlnb3RvIHN0YXJ0X2Zyb207CisKKwkvKiBJbiB0aGlzIGxvb3AsIHN0cjEgc3BhY2UgaXMgcmV1c2VkIGFzIGlucHV0IGJ1ZmZlciwKKwkgKiBzdHIyIC0gYXMgb3V0cHV0IG9uZS4gKi8KKwlmb3IgKDs7KSB7CisJCS8qIElmIHdlJ3JlIG91dCBvZiBpbnB1dCwgZmx1c2ggb3V0cHV0IGFuZCByZWFkIG1vcmUgaW5wdXQuICovCisJCWlmICgoc3NpemVfdClpbl9pbmRleCA9PSByZWFkX2NoYXJzKSB7CisJCQlpZiAob3V0X2luZGV4KSB7CisJCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIHN0cjIsIG91dF9pbmRleCk7Cisgc3RhcnRfZnJvbToKKwkJCQlvdXRfaW5kZXggPSAwOworCQkJfQorCQkJcmVhZF9jaGFycyA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIHN0cjEsIFRSX0JVRlNJWik7CisJCQlpZiAocmVhZF9jaGFycyA8PSAwKSB7CisJCQkJaWYgKHJlYWRfY2hhcnMgPCAwKQorCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJCWJyZWFrOworCQkJfQorCQkJaW5faW5kZXggPSAwOworCQl9CisJCWMgPSBzdHIxW2luX2luZGV4KytdOworCQlpZiAoKG9wdHMgJiBUUl9PUFRfZGVsZXRlKSAmJiBpbnZlY1tjXSkKKwkJCWNvbnRpbnVlOworCQljb2RlZCA9IHZlY3RvcltjXTsKKwkJaWYgKChvcHRzICYgVFJfT1BUX3NxdWVlemVfcmVwcykgJiYgbGFzdCA9PSBjb2RlZAorCQkgJiYgKGludmVjW2NdIHx8IG91dHZlY1tjb2RlZF0pCisJCSkgeworCQkJY29udGludWU7CisJCX0KKwkJc3RyMltvdXRfaW5kZXgrK10gPSBsYXN0ID0gY29kZWQ7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUodmVjdG9yKTsKKwkJZnJlZShzdHIyKTsKKwkJZnJlZShzdHIxKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3RydWUuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy90cnVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZTQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy90cnVlLmMKQEAgLTAsMCArMSwzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB0cnVlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3RydWUuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgdHJ1ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHRydWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXR1cm4gYW4gZXhpdCBjb2RlIG9mIFRSVUUgKDApIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0cnVlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHRydWVcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gJD9cbiIKKy8vdXNhZ2U6ICAgICAgICIwXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgdHJ1ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHJ1ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdHR5LmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxNzUwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy90dHkuYwpAQCAtMCwwICsxLDU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0dHkgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3Y0IGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdHR5Lmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIHR0eV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHR0eV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IGZpbGUgbmFtZSBvZiBzdGRpbidzIHRlcm1pbmFsIgorLy91c2FnZToJSUZfSU5DTFVERV9TVVN2MiggIlxuIgorLy91c2FnZTogICAgICJcbgktcwlQcmludCBub3RoaW5nLCBvbmx5IHJldHVybiBleGl0IHN0YXR1cyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdHR5X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHR0eVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvdHR5MlxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHR0eV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHR5X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpzOworCUlGX0lOQ0xVREVfU1VTdjIoaW50IHNpbGVudDspICAvKiBOb3RlOiBObyBsb25nZXIgcmVsZXZhbnQgaW4gU1VTdjMuICovCisJaW50IHJldHZhbDsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7ICAvKiBTVVN2MyByZXF1aXJlcyA+IDEgZm9yIGVycm9yLiAqLworCisJSUZfSU5DTFVERV9TVVN2MihzaWxlbnQgPSBnZXRvcHQzMihhcmd2LCAicyIpOykKKwlJRl9JTkNMVURFX1NVU3YyKGFyZ3YgKz0gb3B0aW5kOykKKwlJRl9OT1RfSU5DTFVERV9TVVN2Mihhcmd2ICs9IDE7KQorCisJLyogZ251IHR0eSBvdXRwdXRzIGEgd2FybmluZyB0aGF0IGl0IGlzIGlnbm9yaW5nIGFsbCBhcmdzLiAqLworCWJiX3dhcm5faWdub3JpbmdfYXJncyhhcmd2WzBdKTsKKworCXJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKworCXMgPSB4bWFsbG9jX3R0eW5hbWUoU1RESU5fRklMRU5PKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJLyogQWNjb3JkaW5nIHRvIFNVU3YzLCB0dHluYW1lIGNhbiBmYWlsIHdpdGggRUJBREYgb3IgRU5PVFRZLgorCSAqIFdlIGtub3cgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBnb29kLCBzbyBmYWlsdXJlIG1lYW5zIG5vdCBhIHR0eS4gKi8KKwkJcyA9ICJub3QgYSB0dHkiOworCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJfQorCUlGX0lOQ0xVREVfU1VTdjIoaWYgKCFzaWxlbnQpIHB1dHMocyk7KQorCUlGX05PVF9JTkNMVURFX1NVU3YyKHB1dHMocyk7KQorCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3VuYW1lLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZkNzZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3VuYW1lLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogdW5hbWUgLS0gcHJpbnQgc3lzdGVtIGluZm9ybWF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5ODktMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy91bmFtZS5odG1sICovCisKKy8qIE9wdGlvbgkJRXhhbXBsZQorICogLXMsIC0tc3lzbmFtZQlTdW5PUworICogLW4sIC0tbm9kZW5hbWUJcm9ja3k4CisgKiAtciwgLS1yZWxlYXNlCTQuMAorICogLXYsIC0tdmVyc2lvbgorICogLW0sIC0tbWFjaGluZQlzdW4KKyAqIC1hLCAtLWFsbAkJU3VuT1Mgcm9ja3k4IDQuMCAgc3VuCisgKgorICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgZXF1aXZhbGVudCB0byAnLXMnLgorICoKKyAqIERhdmlkIE1hY0tlbnppZSA8ZGptQGdudS5haS5taXQuZWR1PgorICoKKyAqIEdOVSBjb3JldXRpbHMgNi4xMDoKKyAqIE9wdGlvbjogICAgICAgICAgICAgICAgICAgICAgc3RydWN0ICAgRXhhbXBsZShzKToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRzbmFtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDoKKyAqIC1zLCAtLWtlcm5lbC1uYW1lICAgICAgICAgICAgc3lzbmFtZSAgTGludXgKKyAqIC1uLCAtLW5vZGVuYW1lICAgICAgICAgICAgICAgbm9kZW5hbWUgbG9jYWxob3N0LmxvY2FsZG9tYWluCisgKiAtciwgLS1rZXJuZWwtcmVsZWFzZSAgICAgICAgIHJlbGVhc2UgIDIuNi4yOQorICogLXYsIC0ta2VybmVsLXZlcnNpb24gICAgICAgICB2ZXJzaW9uICAjMSBTTVAgU3VuIEphbiAxMSAyMDo1MjozNyBFU1QgMjAwOQorICogLW0sIC0tbWFjaGluZSAgICAgICAgICAgICAgICBtYWNoaW5lICB4ODZfNjQgICBpNjg2CisgKiAtcCwgLS1wcm9jZXNzb3IgICAgICAgICAgICAgIChub25lKSAgIHg4Nl82NCAgIGk2ODYKKyAqIC1pLCAtLWhhcmR3YXJlLXBsYXRmb3JtICAgICAgKG5vbmUpICAgeDg2XzY0ICAgaTM4NgorICogICAgICBOQjogdmFuaWxsYSBjb3JldXRpbHMgcmVwb3J0cyAidW5rbm93biIgLXAgYW5kIC1pLAorICogICAgICB4ODZfNjQgYW5kIGk2ODYvaTM4NiBzaG93biBhYm92ZSBhcmUgRmVkb3JhJ3MgaW52ZW50aW9ucy4KKyAqIC1vLCAtLW9wZXJhdGluZy1zeXN0ZW0gICAgICAgKG5vbmUpICAgR05VL0xpbnV4CisgKiAtYSwgLS1hbGw6IGFsbCBvZiB0aGUgYWJvdmUsIGluIHRoZSBvcmRlciBzaG93bi4KKyAqICAgICAgSWYgLXAgb3IgLWkgaXMgbm90IGtub3duLCBkb24ndCBzaG93IHRoZW0KKyAqLworCisvKiBCdXN5Ym94ZWQgYnkgRXJpayBBbmRlcnNlbgorICoKKyAqIEJlZm9yZSAyMDAzOiBHbGVubiBNY0dyYXRoIGFuZCBNYW51ZWwgTm92b2EgSUlJCisgKiAgRnVydGhlciBzaXplIHJlZHVjdGlvbnMuCisgKiBNYXIgMTYsIDIwMDM6IE1hbnVlbCBOb3ZvYSBJSUkgKG1qbjNAY29kZXBvZXQub3JnKQorICogIE5vdyBkb2VzIHByb3BlciBlcnJvciBjaGVja2luZyBvbiBpL28uICBQbHVzIHNvbWUgZnVydGhlciBzcGFjZSBzYXZpbmdzLgorICogSmFuIDIwMDk6CisgKiAgRml4IGhhbmRsaW5nIG9mIC1hIHRvIG5vdCBwcmludCAidW5rbm93biIsIGFkZCAtbyBhbmQgLWkgc3VwcG9ydC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdW5hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYW1ucnNwdl0iCisvL3VzYWdlOiNkZWZpbmUgdW5hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBzeXN0ZW0gaW5mb3JtYXRpb25cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJUHJpbnQgYWxsIgorLy91c2FnZTogICAgICJcbgktbQlUaGUgbWFjaGluZSAoaGFyZHdhcmUpIHR5cGUiCisvL3VzYWdlOiAgICAgIlxuCS1uCUhvc3RuYW1lIgorLy91c2FnZTogICAgICJcbgktcglPUyByZWxlYXNlIgorLy91c2FnZTogICAgICJcbgktcwlPUyBuYW1lIChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUHJvY2Vzc29yIHR5cGUiCisvL3VzYWdlOiAgICAgIlxuCS12CU9TIHZlcnNpb24iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHVuYW1lX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHVuYW1lIC1hXG4iCisvL3VzYWdlOiAgICAgICAiTGludXggZGViaWFuIDIuNC4yMyAjMiBUdWUgRGVjIDIzIDE3OjA5OjEwIE1TVCAyMDAzIGk2ODYgR05VL0xpbnV4XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB1dHNuYW1lIG5hbWU7CisJY2hhciBwcm9jZXNzb3Jbc2l6ZW9mKCgoc3RydWN0IHV0c25hbWUqKU5VTEwpLT5tYWNoaW5lKV07CisJY2hhciBwbGF0Zm9ybVtzaXplb2YoKChzdHJ1Y3QgdXRzbmFtZSopTlVMTCktPm1hY2hpbmUpXTsKKwljaGFyIG9zW3NpemVvZigiR05VL0xpbnV4IildOworfSB1bmFtZV9pbmZvX3Q7CisKK3N0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPSAic25ydm1waW9hIjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB1dHNuYW1lX29mZnNldFtdID0geworCW9mZnNldG9mKHVuYW1lX2luZm9fdCwgbmFtZS5zeXNuYW1lKSwgLyogLXMgKi8KKwlvZmZzZXRvZih1bmFtZV9pbmZvX3QsIG5hbWUubm9kZW5hbWUpLCAvKiAtbiAqLworCW9mZnNldG9mKHVuYW1lX2luZm9fdCwgbmFtZS5yZWxlYXNlKSwgLyogLXIgKi8KKwlvZmZzZXRvZih1bmFtZV9pbmZvX3QsIG5hbWUudmVyc2lvbiksIC8qIC12ICovCisJb2Zmc2V0b2YodW5hbWVfaW5mb190LCBuYW1lLm1hY2hpbmUpLCAvKiAtbSAqLworCW9mZnNldG9mKHVuYW1lX2luZm9fdCwgcHJvY2Vzc29yKSwgLyogLXAgKi8KKwlvZmZzZXRvZih1bmFtZV9pbmZvX3QsIHBsYXRmb3JtKSwgLyogLWkgKi8KKwlvZmZzZXRvZih1bmFtZV9pbmZvX3QsIG9zKSwgLyogLW8gKi8KK307CisKK2ludCB1bmFtZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdW5hbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciB1bmFtZV9sb25nb3B0c1tdIEFMSUdOMSA9CisJCS8qIG5hbWUsIGhhc19hcmcsIHZhbCAqLworCQkiYWxsXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImEiCisJCSJrZXJuZWwtbmFtZVwwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAicyIKKwkJIm5vZGVuYW1lXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJuIgorCQkia2VybmVsLXJlbGVhc2VcMCIgICAgTm9fYXJndW1lbnQgICAgICAgInIiCisJCSJyZWxlYXNlXDAiICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiciIKKwkJImtlcm5lbC12ZXJzaW9uXDAiICAgIE5vX2FyZ3VtZW50ICAgICAgICJ2IgorCQkibWFjaGluZVwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm0iCisJCSJwcm9jZXNzb3JcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicCIKKwkJImhhcmR3YXJlLXBsYXRmb3JtXDAiIE5vX2FyZ3VtZW50ICAgICAgICJpIgorCQkib3BlcmF0aW5nLXN5c3RlbVwwIiAgTm9fYXJndW1lbnQgICAgICAgIm8iCisJOworI2VuZGlmCisJdW5hbWVfaW5mb190IHVuYW1lX2luZm87CisjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19saW51eF9fKQorCWNoYXIgKmZha2Vfc3BhcmMgPSBnZXRlbnYoIkZBS0VfU1BBUkMiKTsKKyNlbmRpZgorCWNvbnN0IGNoYXIgKnVua25vd25fc3RyID0gInVua25vd24iOworCWNvbnN0IGNoYXIgKmZtdDsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqZGVsdGE7CisJdW5zaWduZWQgdG9wcmludDsKKworCUlGX0xPTkdfT1BUUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gdW5hbWVfbG9uZ29wdHMpOworCXRvcHJpbnQgPSBnZXRvcHQzMihhcmd2LCBvcHRpb25zKTsKKworCWlmIChhcmd2W29wdGluZF0pIHsgLyogY29yZXV0aWxzLTYuOSBjb21wYXQgKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmICh0b3ByaW50ICYgKDEgPDwgOCkpIHsgLyogLWEgPT4gYWxsIG9wdHMgb24gKi8KKwkJdG9wcmludCA9ICgxIDw8IDgpIC0gMTsKKwkJdW5rbm93bl9zdHIgPSAiIjsgLyogLWEgZG9lcyBub3QgcHJpbnQgdW5rbm93biBmaWVsZHMgKi8KKwl9CisKKwlpZiAodG9wcmludCA9PSAwKSB7IC8qIG5vIG9wdHMgPT4gLXMgKHN5c25hbWUpICovCisJCXRvcHJpbnQgPSAxOworCX0KKworCXVuYW1lKCZ1bmFtZV9pbmZvLm5hbWUpOyAvKiBuZXZlciBmYWlscyAqLworCisjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19saW51eF9fKQorCWlmIChmYWtlX3NwYXJjICYmIChmYWtlX3NwYXJjWzBdIHwgMHgyMCkgPT0gJ3knKSB7CisJCXN0cmNweSh1bmFtZV9pbmZvLm5hbWUubWFjaGluZSwgInNwYXJjIik7CisJfQorI2VuZGlmCisJc3RyY3B5KHVuYW1lX2luZm8ucHJvY2Vzc29yLCB1bmtub3duX3N0cik7CisJc3RyY3B5KHVuYW1lX2luZm8ucGxhdGZvcm0sIHVua25vd25fc3RyKTsKKwlzdHJjcHkodW5hbWVfaW5mby5vcywgIkdOVS9MaW51eCIpOworI2lmIDAKKwkvKiBGZWRvcmEgZG9lcyBzb21ldGhpbmcgbGlrZSB0aGlzICovCisJc3RyY3B5KHVuYW1lX2luZm8ucHJvY2Vzc29yLCB1bmFtZV9pbmZvLm5hbWUubWFjaGluZSk7CisJc3RyY3B5KHVuYW1lX2luZm8ucGxhdGZvcm0sIHVuYW1lX2luZm8ubmFtZS5tYWNoaW5lKTsKKwlpZiAodW5hbWVfaW5mby5wbGF0Zm9ybVswXSA9PSAnaScKKwkgJiYgdW5hbWVfaW5mby5wbGF0Zm9ybVsxXQorCSAmJiB1bmFtZV9pbmZvLnBsYXRmb3JtWzJdID09ICc4JworCSAmJiB1bmFtZV9pbmZvLnBsYXRmb3JtWzNdID09ICc2JworCSkgeworCQl1bmFtZV9pbmZvLnBsYXRmb3JtWzFdID0gJzMnOworCX0KKyNlbmRpZgorCisJZGVsdGEgPSB1dHNuYW1lX29mZnNldDsKKwlmbXQgPSAiICVzIiArIDE7CisJZG8geworCQlpZiAodG9wcmludCAmIDEpIHsKKwkJCWNvbnN0IGNoYXIgKnAgPSAoY2hhciAqKSgmdW5hbWVfaW5mbykgKyAqZGVsdGE7CisJCQlpZiAocFswXSkgeworCQkJCXByaW50ZihmbXQsIHApOworCQkJCWZtdCA9ICIgJXMiOworCQkJfQorCQl9CisJCSsrZGVsdGE7CisJfSB3aGlsZSAodG9wcmludCA+Pj0gMSk7CisJYmJfcHV0Y2hhcignXG4nKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsgLyogY29yZXV0aWxzLTYuOSBjb21wYXQgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy91bmlxLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdW5pcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDhkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdW5pcS5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1bmlxIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdW5pcS5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSB1bmlxX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNkdV1bLWYscyx3IE5dIFtJTlBVVCBbT1VUUFVUXV0iCisvL3VzYWdlOiNkZWZpbmUgdW5pcV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc2NhcmQgZHVwbGljYXRlIGxpbmVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVByZWZpeCBsaW5lcyBieSB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIgorLy91c2FnZTogICAgICJcbgktZAlPbmx5IHByaW50IGR1cGxpY2F0ZSBsaW5lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJT25seSBwcmludCB1bmlxdWUgbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1mIE4JU2tpcCBmaXJzdCBOIGZpZWxkcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgTglTa2lwIGZpcnN0IE4gY2hhcnMgKGFmdGVyIGFueSBza2lwcGVkIGZpZWxkcykiCisvL3VzYWdlOiAgICAgIlxuCS13IE4JQ29tcGFyZSBOIGNoYXJhY3RlcnMgaW4gbGluZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW5pcV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIC1lIFwiYVxcbmFcXG5iXFxuY1xcbmNcXG5hXCIgfCBzb3J0IHwgdW5pcVxuIgorLy91c2FnZTogICAgICAgImFcbiIKKy8vdXNhZ2U6ICAgICAgICJiXG4iCisvL3VzYWdlOiAgICAgICAiY1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHVuaXFfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVuaXFfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmlucHV0X2ZpbGVuYW1lOworCXVuc2lnbmVkIHNraXBfZmllbGRzLCBza2lwX2NoYXJzLCBtYXhfY2hhcnM7CisJdW5zaWduZWQgb3B0OworCWNoYXIgKmN1cl9saW5lOworCWNvbnN0IGNoYXIgKmN1cl9jb21wYXJlOworCisJZW51bSB7CisJCU9QVF9jID0gMHgxLAorCQlPUFRfZCA9IDB4MiwgLyogcHJpbnQgb25seSBkdXBzICovCisJCU9QVF91ID0gMHg0LCAvKiBwcmludCBvbmx5IHVuaXEgKi8KKwkJT1BUX2YgPSAweDgsCisJCU9QVF9zID0gMHgxMCwKKwkJT1BUX3cgPSAweDIwLAorCX07CisKKwlza2lwX2ZpZWxkcyA9IHNraXBfY2hhcnMgPSAwOworCW1heF9jaGFycyA9IElOVF9NQVg7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJmKzpzKzp3KyI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNkdWY6czp3OiIsICZza2lwX2ZpZWxkcywgJnNraXBfY2hhcnMsICZtYXhfY2hhcnMpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaW5wdXRfZmlsZW5hbWUgPSBhcmd2WzBdOworCWlmIChpbnB1dF9maWxlbmFtZSkgeworCQljb25zdCBjaGFyICpvdXRwdXQ7CisKKwkJaWYgKGlucHV0X2ZpbGVuYW1lWzBdICE9ICctJyB8fCBpbnB1dF9maWxlbmFtZVsxXSkgeworCQkJY2xvc2UoU1RESU5fRklMRU5PKTsgLyogPT0gMCAqLworCQkJeG9wZW4oaW5wdXRfZmlsZW5hbWUsIE9fUkRPTkxZKTsgLyogZmQgd2lsbCBiZSAwICovCisJCX0KKwkJb3V0cHV0ID0gYXJndlsxXTsKKwkJaWYgKG91dHB1dCkgeworCQkJaWYgKGFyZ3ZbMl0pCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJaWYgKG91dHB1dFswXSAhPSAnLScgfHwgb3V0cHV0WzFdKSB7CisJCQkJLy8gV29uJ3Qgd29yayB3aXRoICJ1bmlxIC0gRklMRSIgYW5kIGNsb3NlZCBzdGRpbjoKKwkJCQkvL2Nsb3NlKFNURE9VVF9GSUxFTk8pOworCQkJCS8veG9wZW4ob3V0cHV0LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DKTsKKwkJCQl4bW92ZV9mZCh4b3BlbihvdXRwdXQsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCBTVERPVVRfRklMRU5PKTsKKwkJCX0KKwkJfQorCX0KKworCWN1cl9jb21wYXJlID0gY3VyX2xpbmUgPSBOVUxMOyAvKiBwcmltZSB0aGUgcHVtcCAqLworCisJZG8geworCQl1bnNpZ25lZCBpOworCQl1bnNpZ25lZCBsb25nIGR1cHM7CisJCWNoYXIgKm9sZF9saW5lOworCQljb25zdCBjaGFyICpvbGRfY29tcGFyZTsKKworCQlvbGRfbGluZSA9IGN1cl9saW5lOworCQlvbGRfY29tcGFyZSA9IGN1cl9jb21wYXJlOworCQlkdXBzID0gMDsKKworCQkvKiBnbnUgdW5pcSBpZ25vcmVzIG5ld2xpbmVzICovCisJCXdoaWxlICgoY3VyX2xpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHN0ZGluKSkgIT0gTlVMTCkgeworCQkJY3VyX2NvbXBhcmUgPSBjdXJfbGluZTsKKwkJCWZvciAoaSA9IHNraXBfZmllbGRzOyBpOyBpLS0pIHsKKwkJCQljdXJfY29tcGFyZSA9IHNraXBfd2hpdGVzcGFjZShjdXJfY29tcGFyZSk7CisJCQkJY3VyX2NvbXBhcmUgPSBza2lwX25vbl93aGl0ZXNwYWNlKGN1cl9jb21wYXJlKTsKKwkJCX0KKwkJCWZvciAoaSA9IHNraXBfY2hhcnM7ICpjdXJfY29tcGFyZSAmJiBpOyBpLS0pIHsKKwkJCQkrK2N1cl9jb21wYXJlOworCQkJfQorCisJCQlpZiAoIW9sZF9saW5lIHx8IHN0cm5jbXAob2xkX2NvbXBhcmUsIGN1cl9jb21wYXJlLCBtYXhfY2hhcnMpKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWZyZWUoY3VyX2xpbmUpOworCQkJKytkdXBzOyAgLyogdGVzdGluZyBmb3Igb3ZlcmZsb3cgc2VlbXMgZXhjZXNzaXZlICovCisJCX0KKworCQlpZiAob2xkX2xpbmUpIHsKKwkJCWlmICghKG9wdCAmIChPUFRfZCA8PCAhIWR1cHMpKSkgeyAvKiAoaWYgZHVwcywgb3B0ICYgT1BUX3UpICovCisJCQkJaWYgKG9wdCAmIE9QVF9jKSB7CisJCQkJCS8qICU3bHUgbWF0Y2hlcyBHTlUgY29yZXV0aWxzIDYuOSAqLworCQkJCQlwcmludGYoIiU3bHUgIiwgZHVwcyArIDEpOworCQkJCX0KKwkJCQlwcmludGYoIiVzXG4iLCBvbGRfbGluZSk7CisJCQl9CisJCQlmcmVlKG9sZF9saW5lKTsKKwkJfQorCX0gd2hpbGUgKGN1cl9saW5lKTsKKworCWRpZV9pZl9mZXJyb3Ioc3RkaW4sIGlucHV0X2ZpbGVuYW1lKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy91c2xlZXAuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy91c2xlZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTRlYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3VzbGVlcC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHVzbGVlcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BIC0tIEFwcGFyZW50bHkgYSBidXN5Ym94IGV4dGVuc2lvbi4gKi8KKworLy91c2FnZTojZGVmaW5lIHVzbGVlcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTiIKKy8vdXNhZ2U6I2RlZmluZSB1c2xlZXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQYXVzZSBmb3IgTiBtaWNyb3NlY29uZHMiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHVzbGVlcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCB1c2xlZXAgMTAwMDAwMFxuIgorLy91c2FnZTogICAgICAgIltwYXVzZXMgZm9yIDEgc2Vjb25kXVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IHVzbGVlcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdXNsZWVwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXVzbGVlcCh4YXRvdShhcmd2WzFdKSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3V1ZGVjb2RlLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvdXVkZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWNmZTZjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3V1ZGVjb2RlLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAyMDAzLCBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBCYXNlZCBvbiBzcGVjaWZpY2F0aW9uIGZyb20KKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdXVlbmNvZGUuaHRtbAorICoKKyAqIEJ1Z3M6IHRoZSBzcGVjIGRvZXNuJ3QgbWVudGlvbiBhbnl0aGluZyBhYm91dCAiYFxuYFxuIiBwcmlvciB0byB0aGUKKyAqICJlbmQiIGxpbmUKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdXVkZWNvZGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbyBPVVRGSUxFXSBbSU5GSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSB1dWRlY29kZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlV1ZGVjb2RlIGEgZmlsZVxuIgorLy91c2FnZTogICAgICAgIkZpbmRzIG91dGZpbGUgbmFtZSBpbiB1dWVuY29kZWQgc291cmNlIHVubGVzcyAtbyBpcyBnaXZlbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdXVkZWNvZGVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdXVkZWNvZGUgLW8gYnVzeWJveCBidXN5Ym94LnV1XG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCBidXN5Ym94XG4iCisvL3VzYWdlOiAgICAgICAiLXJ3eHIteHIteCAgIDEgYW1zICAgICAgYW1zICAgICAgICAyNDUyNjQgSnVuICA3IDIxOjM1IGJ1c3lib3hcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfVVVERUNPREUKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyByZWFkX3N0ZHV1KEZJTEUgKnNyY19zdHJlYW0sIEZJTEUgKmRzdF9zdHJlYW0sIGludCBmbGFncyBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqbGluZTsKKworCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoc3JjX3N0cmVhbSkpICE9IE5VTEwpIHsKKwkJaW50IGVuY29kZWRfbGVuLCBzdHJfbGVuOworCQljaGFyICpsaW5lX3B0ciwgKmRzdDsKKworCQlpZiAoc3RyY21wKGxpbmUsICJlbmQiKSA9PSAwKSB7CisJCQlyZXR1cm47IC8qIHRoZSBvbmx5IG5vbi1lcnJvciBleGl0ICovCisJCX0KKworCQlsaW5lX3B0ciA9IGxpbmU7CisJCXdoaWxlICgqbGluZV9wdHIpIHsKKwkJCSpsaW5lX3B0ciA9ICgqbGluZV9wdHIgLSAweDIwKSAmIDB4M2Y7CisJCQlsaW5lX3B0cisrOworCQl9CisJCXN0cl9sZW4gPSBsaW5lX3B0ciAtIGxpbmU7CisKKwkJZW5jb2RlZF9sZW4gPSBsaW5lWzBdICogNCAvIDM7CisJCS8qIENoZWNrIHRoYXQgbGluZSBpcyBub3QgdG9vIHNob3J0LiAod2UgdG9sZXJhdGUKKwkJICogb3Zlcmx5IF9sb25nXyBsaW5lIHRvIGFjY29tb2RhdGUgcG9zc2libGUgZXh0cmEgJ2AnKS4KKwkJICogRW1wdHkgbGluZSBjYXNlIGlzIGFsc28gY2F1Z2h0IGhlcmUuICovCisJCWlmIChzdHJfbGVuIDw9IGVuY29kZWRfbGVuKSB7CisJCQlicmVhazsgLyogZ28gdG8gYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IGZpbGUiKTsgKi8KKwkJfQorCQlpZiAoZW5jb2RlZF9sZW4gPD0gMCkgeworCQkJLyogSWdub3JlIHRoZSAiYFxuIiBsaW5lLCB3aHkgaXMgaXQgZXZlbiBpbiB0aGUgZW5jb2RlIGZpbGUgPyAqLworCQkJZnJlZShsaW5lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChlbmNvZGVkX2xlbiA+IDYwKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibGluZSB0b28gbG9uZyIpOworCQl9CisKKwkJZHN0ID0gbGluZTsKKwkJbGluZV9wdHIgPSBsaW5lICsgMTsKKwkJZG8geworCQkJLyogTWVyZ2UgZm91ciA2IGJpdCBjaGFycyB0byB0aHJlZSA4IGJpdCBjaGFycyAqLworCQkJKmRzdCsrID0gbGluZV9wdHJbMF0gPDwgMiB8IGxpbmVfcHRyWzFdID4+IDQ7CisJCQllbmNvZGVkX2xlbi0tOworCQkJaWYgKGVuY29kZWRfbGVuID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJKmRzdCsrID0gbGluZV9wdHJbMV0gPDwgNCB8IGxpbmVfcHRyWzJdID4+IDI7CisJCQllbmNvZGVkX2xlbi0tOworCQkJaWYgKGVuY29kZWRfbGVuID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJKmRzdCsrID0gbGluZV9wdHJbMl0gPDwgNiB8IGxpbmVfcHRyWzNdOworCQkJbGluZV9wdHIgKz0gNDsKKwkJCWVuY29kZWRfbGVuIC09IDI7CisJCX0gd2hpbGUgKGVuY29kZWRfbGVuID4gMCk7CisJCWZ3cml0ZShsaW5lLCAxLCBkc3QgLSBsaW5lLCBkc3Rfc3RyZWFtKTsKKwkJZnJlZShsaW5lKTsKKwl9CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IGZpbGUiKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX1VVREVDT0RFCitpbnQgdXVkZWNvZGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHV1ZGVjb2RlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICpzcmNfc3RyZWFtOworCWNoYXIgKm91dG5hbWUgPSBOVUxMOworCWNoYXIgKmxpbmU7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MSI7IC8qIDEgYXJndW1lbnQgbWF4ICovCisJZ2V0b3B0MzIoYXJndiwgIm86IiwgJm91dG5hbWUpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCFhcmd2WzBdKQorCQkqLS1hcmd2ID0gKGNoYXIqKSItIjsKKwlzcmNfc3RyZWFtID0geGZvcGVuX3N0ZGluKGFyZ3ZbMF0pOworCisJLyogU2VhcmNoIGZvciB0aGUgc3RhcnQgb2YgdGhlIGVuY29kaW5nICovCisJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShzcmNfc3RyZWFtKSkgIT0gTlVMTCkgeworCQl2b2lkIEZBU1RfRlVOQyAoKmRlY29kZV9mbl9wdHIpKEZJTEUgKnNyYywgRklMRSAqZHN0LCBpbnQgZmxhZ3MpOworCQljaGFyICpsaW5lX3B0cjsKKwkJRklMRSAqZHN0X3N0cmVhbTsKKwkJaW50IG1vZGU7CisKKwkJaWYgKHN0cm5jbXAobGluZSwgImJlZ2luLWJhc2U2NCAiLCAxMykgPT0gMCkgeworCQkJbGluZV9wdHIgPSBsaW5lICsgMTM7CisJCQlkZWNvZGVfZm5fcHRyID0gcmVhZF9iYXNlNjQ7CisJCX0gZWxzZSBpZiAoc3RybmNtcChsaW5lLCAiYmVnaW4gIiwgNikgPT0gMCkgeworCQkJbGluZV9wdHIgPSBsaW5lICsgNjsKKwkJCWRlY29kZV9mbl9wdHIgPSByZWFkX3N0ZHV1OworCQl9IGVsc2UgeworCQkJZnJlZShsaW5lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYmVnaW4gbGluZSBmb3VuZC4gZGVjb2RlIGFuZCBleGl0ICovCisJCW1vZGUgPSBiYl9zdHJ0b3UobGluZV9wdHIsIE5VTEwsIDgpOworCQlpZiAob3V0bmFtZSA9PSBOVUxMKSB7CisJCQlvdXRuYW1lID0gc3RyY2hyKGxpbmVfcHRyLCAnICcpOworCQkJaWYgKChvdXRuYW1lID09IE5VTEwpIHx8ICgqb3V0bmFtZSA9PSAnXDAnKSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJb3V0bmFtZSsrOworCQl9CisJCWRzdF9zdHJlYW0gPSBzdGRvdXQ7CisJCWlmIChOT1RfTE9ORV9EQVNIKG91dG5hbWUpKSB7CisJCQlkc3Rfc3RyZWFtID0geGZvcGVuX2Zvcl93cml0ZShvdXRuYW1lKTsKKwkJCWZjaG1vZChmaWxlbm8oZHN0X3N0cmVhbSksIG1vZGUgJiAoU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKSk7CisJCX0KKwkJZnJlZShsaW5lKTsKKwkJZGVjb2RlX2ZuX3B0cihzcmNfc3RyZWFtLCBkc3Rfc3RyZWFtLCAvKmZsYWdzOiovIEJBU0U2NF9GTEFHX1VVX1NUT1AgKyBCQVNFNjRfRkxBR19OT19TVE9QX0NIQVIpOworCQkvKiBmY2xvc2VfaWZfbm90X3N0ZGluKHNyY19zdHJlYW0pOyAtIHJlZHVuZGFudCAqLworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gJ2JlZ2luJyBsaW5lIik7Cit9CisjZW5kaWYKKworLy9hcHBsZXQ6SUZfQkFTRTY0KEFQUExFVChiYXNlNjQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19CQVNFNjQpICs9IHV1ZGVjb2RlLm8KKworLy9jb25maWc6Y29uZmlnIEJBU0U2NAorLy9jb25maWc6CWJvb2wgImJhc2U2NCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBCYXNlNjQgZW5jb2RlIGFuZCBkZWNvZGUKKworLy91c2FnZTojZGVmaW5lIGJhc2U2NF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1kXSBbRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgYmFzZTY0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQmFzZTY0IGVuY29kZSBvciBkZWNvZGUgRklMRSB0byBzdGFuZGFyZCBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1kCURlY29kZSBkYXRhIgorLy8vL3VzYWdlOiAgICAgIlxuCS13IENPTAlXcmFwIGxpbmVzIGF0IENPTCAoZGVmYXVsdCA3NiwgMCBkaXNhYmxlcykiCisvLy8vdXNhZ2U6ICAgICAiXG4JLWkJV2hlbiBkZWNvZGluZywgaWdub3JlIG5vbi1hbHBoYWJldCBjaGFyYWN0ZXJzIgorCisjaWYgRU5BQkxFX0JBU0U2NAoraW50IGJhc2U2NF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmFzZTY0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICpzcmNfc3RyZWFtOworCXVuc2lnbmVkIG9wdHM7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MSI7IC8qIDEgYXJndW1lbnQgbWF4ICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJkIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoIWFyZ3ZbMF0pCisJCSotLWFyZ3YgPSAoY2hhciopIi0iOworCXNyY19zdHJlYW0gPSB4Zm9wZW5fc3RkaW4oYXJndlswXSk7CisJaWYgKG9wdHMpIHsKKwkJcmVhZF9iYXNlNjQoc3JjX3N0cmVhbSwgc3Rkb3V0LCAvKmZsYWdzOiovIChjaGFyKUVPRik7CisJfSBlbHNlIHsKKwkJZW51bSB7CisJCQlTUkNfQlVGX1NJWkUgPSA3Ni80KjMsICAvKiBUaGlzICpNVVNUKiBiZSBhIG11bHRpcGxlIG9mIDMgKi8KKwkJCURTVF9CVUZfU0laRSA9IDQgKiAoKFNSQ19CVUZfU0laRSArIDIpIC8gMyksCisJCX07CisJCWNoYXIgc3JjX2J1ZltTUkNfQlVGX1NJWkVdOworCQljaGFyIGRzdF9idWZbRFNUX0JVRl9TSVpFICsgMV07CisJCWludCBzcmNfZmQgPSBmaWxlbm8oc3JjX3N0cmVhbSk7CisJCXdoaWxlICgxKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGZ1bGxfcmVhZChzcmNfZmQsIHNyY19idWYsIFNSQ19CVUZfU0laRSk7CisJCQlpZiAoIXNpemUpCisJCQkJYnJlYWs7CisJCQlpZiAoKHNzaXplX3Qpc2l6ZSA8IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCS8qIEVuY29kZSB0aGUgYnVmZmVyIHdlIGp1c3QgcmVhZCBpbiAqLworCQkJYmJfdXVlbmNvZGUoZHN0X2J1Ziwgc3JjX2J1Ziwgc2l6ZSwgYmJfdXVlbmNfdGJsX2Jhc2U2NCk7CisJCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgZHN0X2J1ZiwgNCAqICgoc2l6ZSArIDIpIC8gMykpOworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCWZmbHVzaChzdGRvdXQpOworCQl9CisJfQorCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQorI2VuZGlmCisKKy8qIFRlc3Qgc2NyaXB0LgorUHV0IHRoaXMgaW50byBhbiBlbXB0eSBkaXIgd2l0aCBidXN5Ym94IGJpbmFyeSwgYW4gcnVuLgorCisjIS9iaW4vc2gKK3Rlc3QgLXggYnVzeWJveCB8fCB7IGVjaG8gIk5vIC4vYnVzeWJveD8iOyBleGl0OyB9CitsbiAtc2YgYnVzeWJveCB1dWRlY29kZQorbG4gLXNmIGJ1c3lib3ggdXVlbmNvZGUKKz5BX251bGwKK2VjaG8gLW4gQSA+QQorZWNobyAtbiBBQiA+QUIKK2VjaG8gLW4gQUJDID5BQkMKK2VjaG8gLW4gQUJDRCA+QUJDRAorZWNobyAtbiBBQkNERSA+QUJDREUKK2VjaG8gLW4gQUJDREVGID5BQkNERUYKK2NhdCBidXN5Ym94ID5BX2Jib3gKK2ZvciBmIGluIEEqOyBkbworICAgIGVjaG8gdXVlbmNvZGUgJGYKKyAgICAuL3V1ZW5jb2RlICAgICRmIDwkZiA+dV8kZgorICAgIC4vdXVlbmNvZGUgLW0gJGYgPCRmID5tXyRmCitkb25lCitta2RpciB1bnBrX3UgdW5wa19tIDI+L2Rldi9udWxsCitmb3IgZiBpbiB1Xyo7IGRvCisgICAgLi91dWRlY29kZSA8JGYgLW8gdW5wa191LyR7ZjoyfQorICAgIGRpZmYgLWEgJHtmOjJ9IHVucGtfdS8ke2Y6Mn0gPi9kZXYvbnVsbCAyPiYxCisgICAgZWNobyB1dWRlY29kZSAkZjogJD8KK2RvbmUKK2ZvciBmIGluIG1fKjsgZG8KKyAgICAuL3V1ZGVjb2RlIDwkZiAtbyB1bnBrX20vJHtmOjJ9CisgICAgZGlmZiAtYSAke2Y6Mn0gdW5wa19tLyR7ZjoyfSA+L2Rldi9udWxsIDI+JjEKKyAgICBlY2hvIHV1ZGVjb2RlICRmOiAkPworZG9uZQorKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy91dWVuY29kZS5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3V1ZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhNDg5YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy91dWVuY29kZS5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqICBiYXNlZCBvbiB0aGUgZnVuY3Rpb24gYmFzZTY0X2VuY29kZSBmcm9tIGh0dHAuYyBpbiB3Z2V0IHYxLjYKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdXVlbmNvZGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbV0gW0lORklMRV0gU1RPUkVEX0ZJTEVOQU1FIgorLy91c2FnZTojZGVmaW5lIHV1ZW5jb2RlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVXVlbmNvZGUgYSBmaWxlIHRvIHN0ZG91dFxuIgorLy91c2FnZTogICAgICJcbgktbQlVc2UgYmFzZTY0IGVuY29kaW5nIHBlciBSRkMxNTIxIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1dWVuY29kZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCB1dWVuY29kZSBidXN5Ym94IGJ1c3lib3hcbiIKKy8vdXNhZ2U6ICAgICAgICJiZWdpbiA3NTUgYnVzeWJveFxuIgorLy91c2FnZTogICAgICAgIjxlbmNvZGVkIGZpbGUgc25pcHBlZD5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIHV1ZGVjb2RlIGJ1c3lib3ggYnVzeWJveCA+IGJ1c3lib3gudXVcbiIKKy8vdXNhZ2U6ICAgICAgICIkXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitlbnVtIHsKKwlTUkNfQlVGX1NJWkUgPSAxNSozLCAgLyogVGhpcyAqTVVTVCogYmUgYSBtdWx0aXBsZSBvZiAzICovCisJRFNUX0JVRl9TSVpFID0gNCAqICgoU1JDX0JVRl9TSVpFICsgMikgLyAzKSwKK307CisKK2ludCB1dWVuY29kZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdXVlbmNvZGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IHN0YXRfYnVmOworCWludCBzcmNfZmQgPSBTVERJTl9GSUxFTk87CisJY29uc3QgY2hhciAqdGJsOworCW1vZGVfdCBtb2RlOworCWNoYXIgc3JjX2J1ZltTUkNfQlVGX1NJWkVdOworCWNoYXIgZHN0X2J1ZltEU1RfQlVGX1NJWkUgKyAxXTsKKworCXRibCA9IGJiX3V1ZW5jX3RibF9zdGQ7CisJbW9kZSA9IDA2NjYgJiB+dW1hc2soMDY2Nik7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6PzIiOyAvKiBtdXN0IGhhdmUgMSBvciAyIGFyZ3MgKi8KKwlpZiAoZ2V0b3B0MzIoYXJndiwgIm0iKSkgeworCQl0YmwgPSBiYl91dWVuY190YmxfYmFzZTY0OworCX0KKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoYXJndlsxXSkgeworCQlzcmNfZmQgPSB4b3Blbihhcmd2WzBdLCBPX1JET05MWSk7CisJCWZzdGF0KHNyY19mZCwgJnN0YXRfYnVmKTsKKwkJbW9kZSA9IHN0YXRfYnVmLnN0X21vZGUgJiAoU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKTsKKwkJYXJndisrOworCX0KKworCXByaW50ZigiYmVnaW4lcyAlbyAlcyIsIHRibCA9PSBiYl91dWVuY190Ymxfc3RkID8gIiIgOiAiLWJhc2U2NCIsIG1vZGUsICphcmd2KTsKKwl3aGlsZSAoMSkgeworCQlzaXplX3Qgc2l6ZSA9IGZ1bGxfcmVhZChzcmNfZmQsIHNyY19idWYsIFNSQ19CVUZfU0laRSk7CisJCWlmICghc2l6ZSkKKwkJCWJyZWFrOworCQlpZiAoKHNzaXplX3Qpc2l6ZSA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQkvKiBFbmNvZGUgdGhlIGJ1ZmZlciB3ZSBqdXN0IHJlYWQgaW4gKi8KKwkJYmJfdXVlbmNvZGUoZHN0X2J1Ziwgc3JjX2J1Ziwgc2l6ZSwgdGJsKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJaWYgKHRibCA9PSBiYl91dWVuY190Ymxfc3RkKSB7CisJCQliYl9wdXRjaGFyKHRibFtzaXplXSk7CisJCX0KKwkJZmZsdXNoKHN0ZG91dCk7CisJCXh3cml0ZShTVERPVVRfRklMRU5PLCBkc3RfYnVmLCA0ICogKChzaXplICsgMikgLyAzKSk7CisJfQorCXByaW50Zih0YmwgPT0gYmJfdXVlbmNfdGJsX3N0ZCA/ICJcbmBcbmVuZFxuIiA6ICJcbj09PT1cbiIpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3djLmMgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvd2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDEwZTQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3djLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHdjIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3djLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBSZXdyaXR0ZW4gdG8gZml4IGEgbnVtYmVyIG9mIHByb2JsZW1zIGFuZCBkbyBzb21lIHNpemUgb3B0aW1pemF0aW9ucy4KKyAqIFByb2JsZW1zIGluIHRoZSBwcmV2aW91cyBidXN5Ym94IGltcGxlbWVudGF0aW9uIChiZXNpZGVzIGJsb2F0KSBpbmNsdWRlZDoKKyAqICAxKSBicm9rZW4gJ3djIC1jJyBvcHRpbWl6YXRpb24gKHJlYWQgbm90ZSBiZWxvdykKKyAqICAyKSBicm9rZW4gaGFuZGxpbmcgb2YgJy0nIGFyZ3MKKyAqICAzKSBubyBjaGVja2luZyBvZiBmZXJyb3Igb24gRU9GIHJldHVybnMKKyAqICA0KSBpc3ByaW50KCkgd2Fzbid0IGNvbnNpZGVyZWQgd2hlbiB3b3JkIGNvdW50aW5nLgorICoKKyAqIE5PVEVTOgorICoKKyAqIFRoZSBwcmV2aW91cyBidXN5Ym94IHdjIGF0dGVtcHRlZCBhbiBvcHRpbWl6YXRpb24gdXNpbmcgc3RhdCBmb3IgdGhlCisgKiBjYXNlIG9mIGNvdW50aW5nIGNoYXJzIG9ubHkuICBJIG9taXR0ZWQgdGhhdCBiZWNhdXNlIGl0IHdhcyBicm9rZW4uCisgKiBJdCBkaWRuJ3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIHBvc3NpYmlsaXR5IG9mIGlucHV0IGNvbWluZyBmcm9tIGEKKyAqIHBpcGUsIG9yIGlucHV0IGZyb20gYSBmaWxlIHdpdGggZmlsZSBwb2ludGVyIG5vdCBhdCB0aGUgYmVnaW5uaW5nLgorICoKKyAqIFRvIGltcGxlbWVudCBzdWNoIGEgc3BlZWQgb3B0aW1pemF0aW9uIGNvcnJlY3RseSwgbm90IG9ubHkgZG8geW91CisgKiBuZWVkIHRoZSBzaXplLCBidXQgYWxzbyB0aGUgZmlsZSBwb3NpdGlvbi4gIE5vdGUgYWxzbyB0aGF0IHRoZQorICogZmlsZSBwb3NpdGlvbiBtYXkgYmUgcGFzdCB0aGUgZW5kIG9mIGZpbGUuICBDb25zaWRlciB0aGUgZXhhbXBsZQorICogKGFkYXB0ZWQgZnJvbSBleGFtcGxlIGluIGdudSB3Yy5jKQorICoKKyAqICAgICAgZWNobyBoZWxsbyA+IC90bXAvdGVzdGZpbGUgJiYKKyAqICAgICAgKGRkIGlicz0xayBza2lwPTEgY291bnQ9MCAmPiAvZGV2L251bGw7IHdjIC1jKSA8IC90bXAvdGVzdGZpbGUKKyAqCisgKiBmb3Igd2hpY2ggJ3djIC1jJyBzaG91bGQgb3V0cHV0ICcwJy4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisjaWYgIUVOQUJMRV9MT0NBTEVfU1VQUE9SVAorIyB1bmRlZiBpc3ByaW50CisjIHVuZGVmIGlzc3BhY2UKKyMgZGVmaW5lIGlzcHJpbnQoYykgKCh1bnNpZ25lZCkoKGMpIC0gMHgyMCkgPD0gKDB4N2UgLSAweDIwKSkKKyMgZGVmaW5lIGlzc3BhY2UoYykgKChjKSA9PSAnICcpCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dDX0xBUkdFCisjIGRlZmluZSBDT1VOVF9UIHVuc2lnbmVkIGxvbmcgbG9uZworIyBkZWZpbmUgQ09VTlRfRk1UICJsbHUiCisjZWxzZQorIyBkZWZpbmUgQ09VTlRfVCB1bnNpZ25lZAorIyBkZWZpbmUgQ09VTlRfRk1UICJ1IgorI2VuZGlmCisKKy8qIFdlIHN1cHBvcnQgLW0gZXZlbiB3aGVuIFVOSUNPREVfU1VQUE9SVCBpcyBvZmYsCisgKiB3ZSBqdXN0IGRvbid0IGFkdmVydGlzZSBpdCBpbiBoZWxwIHRleHQsCisgKiBzaW5jZSBpdCBpcyB0aGUgc2FtZSBhcyAtYyBpbiB0aGlzIGNhc2UuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHdjX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWMiSUZfVU5JQ09ERV9TVVBQT1JUKCJtIikibHdMXSBbRklMRV0uLi4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHdjX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ291bnQgbGluZXMsIHdvcmRzLCBhbmQgYnl0ZXMgZm9yIGVhY2ggRklMRSAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCUNvdW50IGJ5dGVzIgorLy91c2FnZToJSUZfVU5JQ09ERV9TVVBQT1JUKAorLy91c2FnZTogICAgICJcbgktbQlDb3VudCBjaGFyYWN0ZXJzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbAlDb3VudCBuZXdsaW5lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJQ291bnQgd29yZHMiCisvL3VzYWdlOiAgICAgIlxuCS1MCVByaW50IGxvbmdlc3QgbGluZSBsZW5ndGgiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHdjX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHdjIC9ldGMvcGFzc3dkXG4iCisvL3VzYWdlOiAgICAgICAiICAgICAzMSAgICAgIDQ2ICAgIDEzNjUgL2V0Yy9wYXNzd2RcbiIKKworLyogT3JkZXIgaXMgaW1wb3J0YW50IGlmIHdlIHdhbnQgdG8gYmUgY29tcGF0aWJsZSB3aXRoCisgKiBjb2x1bW4gb3JkZXIgaW4gIndjIC1jbWx3TCIgb3V0cHV0OgorICovCitlbnVtIHsKKwlXQ19MSU5FUyAgICA9IDAsIC8qIC1sICovCisJV0NfV09SRFMgICAgPSAxLCAvKiAtdyAqLworCVdDX1VOSUNIQVJTID0gMiwgLyogLW0gKi8KKwlXQ19CWVRFUyAgICA9IDMsIC8qIC1jICovCisJV0NfTEVOR1RIICAgPSA0LCAvKiAtTCAqLworCU5VTV9XQ1MgICAgID0gNSwKK307CisKK2ludCB3Y19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2NfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmFyZzsKKwljb25zdCBjaGFyICpzdGFydF9mbXQgPSAiICU5IkNPVU5UX0ZNVCArIDE7CisJY29uc3QgY2hhciAqZm5hbWVfZm10ID0gIiAlc1xuIjsKKwlDT1VOVF9UICpwY291bnRzOworCUNPVU5UX1QgY291bnRzW05VTV9XQ1NdOworCUNPVU5UX1QgdG90YWxzW05VTV9XQ1NdOworCWludCBudW1fZmlsZXM7CisJc21hbGxpbnQgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCXVuc2lnbmVkIHByaW50X3R5cGU7CisKKwlpbml0X3VuaWNvZGUoKTsKKworCXByaW50X3R5cGUgPSBnZXRvcHQzMihhcmd2LCAibHdtY0wiKTsKKworCWlmIChwcmludF90eXBlID09IDApIHsKKwkJcHJpbnRfdHlwZSA9ICgxIDw8IFdDX0xJTkVTKSB8ICgxIDw8IFdDX1dPUkRTKSB8ICgxIDw8IFdDX0JZVEVTKTsKKwl9CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJKi0tYXJndiA9IChjaGFyICopIGJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwkJZm5hbWVfZm10ID0gIlxuIjsKKwl9CisJaWYgKCFhcmd2WzFdKSB7IC8qIHplcm8gb3Igb25lIGZpbGVuYW1lPyAqLworCQlpZiAoISgocHJpbnRfdHlwZS0xKSAmIHByaW50X3R5cGUpKSAvKiBleGFjdGx5IG9uZSBvcHRpb24/ICovCisJCQlzdGFydF9mbXQgPSAiJSJDT1VOVF9GTVQ7CisJfQorCisJbWVtc2V0KHRvdGFscywgMCwgc2l6ZW9mKHRvdGFscykpOworCisJcGNvdW50cyA9IGNvdW50czsKKworCW51bV9maWxlcyA9IDA7CisJd2hpbGUgKChhcmcgPSAqYXJndisrKSAhPSBOVUxMKSB7CisJCUZJTEUgKmZwOworCQljb25zdCBjaGFyICpzOworCQl1bnNpZ25lZCB1OworCQl1bnNpZ25lZCBsaW5lcG9zOworCQlzbWFsbGludCBpbl93b3JkOworCisJCSsrbnVtX2ZpbGVzOworCQlmcCA9IGZvcGVuX29yX3dhcm5fc3RkaW4oYXJnKTsKKwkJaWYgKCFmcCkgeworCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKworCQltZW1zZXQoY291bnRzLCAwLCBzaXplb2YoY291bnRzKSk7CisJCWxpbmVwb3MgPSAwOworCQlpbl93b3JkID0gMDsKKworCQl3aGlsZSAoMSkgeworCQkJaW50IGM7CisJCQkvKiBPdXIgLXcgZG9lc24ndCBtYXRjaCBHTlUgd2MgZXhhY3RseS4uLiBvaCB3ZWxsICovCisKKwkJCWMgPSBnZXRjKGZwKTsKKwkJCWlmIChjID09IEVPRikgeworCQkJCWlmIChmZXJyb3IoZnApKSB7CisJCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGFyZyk7CisJCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQkJZ290byBET19FT0Y7ICAvKiBUcmVhdCBhbiBFT0YgYXMgJ1xyJy4gKi8KKwkJCX0KKworCQkJLyogQ2F0ZXIgZm9yIC1jIGFuZCAtbSAqLworCQkJKytjb3VudHNbV0NfQllURVNdOworCQkJaWYgKHVuaWNvZGVfc3RhdHVzICE9IFVOSUNPREVfT04gLyogZXZlcnkgYnl0ZSBpcyBhIG5ldyBjaGFyICovCisJCQkgfHwgKGMgJiAweGMwKSAhPSAweDgwIC8qIGl0IGlzbid0IGEgMm5kKyBieXRlIG9mIGEgVW5pY29kZSBjaGFyICovCisJCQkpIHsKKwkJCQkrK2NvdW50c1tXQ19VTklDSEFSU107CisJCQl9CisKKwkJCWlmIChpc3ByaW50X2FzY2lpb25seShjKSkgeyAvKiBGSVhNRTogbm90IHVuaWNvZGUtYXdhcmUgKi8KKwkJCQkrK2xpbmVwb3M7CisJCQkJaWYgKCFpc3NwYWNlKGMpKSB7CisJCQkJCWluX3dvcmQgPSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCh1bnNpZ25lZCkoYyAtIDkpIDw9IDQpIHsKKwkJCQkvKiBcdCAgOQorCQkJCSAqIFxuIDEwCisJCQkJICogXHYgMTEKKwkJCQkgKiBcZiAxMgorCQkJCSAqIFxyIDEzCisJCQkJICovCisJCQkJaWYgKGMgPT0gJ1x0JykgeworCQkJCQlsaW5lcG9zID0gKGxpbmVwb3MgfCA3KSArIDE7CisJCQkJfSBlbHNlIHsgIC8qICdcbicsICdccicsICdcZicsIG9yICdcdicgKi8KKyBET19FT0Y6CisJCQkJCWlmIChsaW5lcG9zID4gY291bnRzW1dDX0xFTkdUSF0pIHsKKwkJCQkJCWNvdW50c1tXQ19MRU5HVEhdID0gbGluZXBvczsKKwkJCQkJfQorCQkJCQlpZiAoYyA9PSAnXG4nKSB7CisJCQkJCQkrK2NvdW50c1tXQ19MSU5FU107CisJCQkJCX0KKwkJCQkJaWYgKGMgIT0gJ1x2JykgeworCQkJCQkJbGluZXBvcyA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQljb3VudHNbV0NfV09SRFNdICs9IGluX3dvcmQ7CisJCQlpbl93b3JkID0gMDsKKwkJCWlmIChjID09IEVPRikgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJZmNsb3NlX2lmX25vdF9zdGRpbihmcCk7CisKKwkJaWYgKHRvdGFsc1tXQ19MRU5HVEhdIDwgY291bnRzW1dDX0xFTkdUSF0pIHsKKwkJCXRvdGFsc1tXQ19MRU5HVEhdID0gY291bnRzW1dDX0xFTkdUSF07CisJCX0KKwkJdG90YWxzW1dDX0xFTkdUSF0gLT0gY291bnRzW1dDX0xFTkdUSF07CisKKyBPVVRQVVQ6CisJCS8qIGNvcmV1dGlscyB3YyB0cmllcyBoYXJkIHRvIHByaW50IHByZXR0eSBjb2x1bW5zCisJCSAqIChzYXZlcyByZXN1bHRzIGZvciBhbGwgZmlsZXMsIGZpbmRzIG1heCBjb2wgbGVuIGV0Yy4uLikKKwkJICogd2Ugd29uJ3QgdHJ5IHRoYXQgaGFyZCwgaXQgd2lsbCBibG9hdCB1cyB0b28gbXVjaCAqLworCQlzID0gc3RhcnRfZm10OworCQl1ID0gMDsKKwkJZG8geworCQkJaWYgKHByaW50X3R5cGUgJiAoMSA8PCB1KSkgeworCQkJCXByaW50ZihzLCBwY291bnRzW3VdKTsKKwkJCQlzID0gIiAlOSJDT1VOVF9GTVQ7IC8qIE9rLi4uIHJlc3RvcmUgdGhlIGxlYWRpbmcgc3BhY2UuICovCisJCQl9CisJCQl0b3RhbHNbdV0gKz0gcGNvdW50c1t1XTsKKwkJfSB3aGlsZSAoKyt1IDwgTlVNX1dDUyk7CisJCXByaW50ZihmbmFtZV9mbXQsIGFyZyk7CisJfQorCisJLyogSWYgbW9yZSB0aGFuIG9uZSBmaWxlIHdhcyBwcm9jZXNzZWQsIHdlIHdhbnQgdGhlIHRvdGFscy4gIFRvIHNhdmUgc29tZQorCSAqIHNwYWNlLCB3ZSBzZXQgdGhlIHBjb3VudHMgcHRyIHRvIHRoZSB0b3RhbHMgYXJyYXkuICBUaGlzIGhhcyB0aGUgc2lkZQorCSAqIGVmZmVjdCBvZiB0cmFzaGluZyB0aGUgdG90YWxzIGFycmF5IGFmdGVyIG91dHB1dHRpbmcgaXQsIGJ1dCB0aGF0J3MKKwkgKiBpcnJlbGF2ZW50IHNpbmNlIHdlIG5vIGxvbmdlciBuZWVkIGl0LiAqLworCWlmIChudW1fZmlsZXMgPiAxKSB7CisJCW51bV9maWxlcyA9IDA7ICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGhlcmUgYWdhaW4uICovCisJCWFyZyA9ICJ0b3RhbCI7CisJCXBjb3VudHMgPSB0b3RhbHM7CisJCS0tYXJndjsKKwkJZ290byBPVVRQVVQ7CisJfQorCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3doby5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3doby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzkyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMvd2hvLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNaW5pIHdobyBpcyB1c2VkIHRvIGRpc3BsYXkgdXNlciBuYW1lLCBsb2dpbiB0aW1lLAorICogaWRsZSB0aW1lIGFuZCBob3N0IG5hbWUuCisgKgorICogQXV0aG9yOiBEYSBDaGVuICA8ZGNoZW5AYXlybmV0d29ya3MuY29tPgorICoKKyAqIFRoaXMgaXMgYSBmcmVlIGRvY3VtZW50OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjoKKyAqICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBBWVIgTmV0d29ya3MsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBCQl9BVURJVCBTVVN2MyBfTk9UXyBjb21wbGlhbnQgLS0gbWlzc2luZyBvcHRpb25zIC1iLCAtZCwgLWwsIC1tLCAtcCwgLXEsIC1yLCAtcywgLXQsIC1ULCAtdTsgTWlzc2luZyBhcmd1bWVudCAnZmlsZScuICAqLworCisvL2NvbmZpZzpjb25maWcgV0hPCisvL2NvbmZpZzogICAgICBib29sICJ3aG8iCisvL2NvbmZpZzogICAgICBkZWZhdWx0IHkKKy8vY29uZmlnOiAgICAgIGRlcGVuZHMgb24gRkVBVFVSRV9VVE1QCisvL2NvbmZpZzogICAgICBoZWxwCisvL2NvbmZpZzogICAgICAgIHdobyBpcyB1c2VkIHRvIHNob3cgd2hvIGlzIGxvZ2dlZCBvbi4KKworLy9jb25maWc6Y29uZmlnIFVTRVJTCisvL2NvbmZpZzogICAgICBib29sICJ1c2VycyIKKy8vY29uZmlnOiAgICAgIGRlZmF1bHQgeQorLy9jb25maWc6ICAgICAgZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKy8vY29uZmlnOiAgICAgIGhlbHAKKy8vY29uZmlnOiAgICAgICAgUHJpbnQgdXNlcnMgY3VycmVudGx5IGxvZ2dlZCBvbi4KKworLy9hcHBsZXQ6SUZfVVNFUlMoQVBQTEVUX09ERE5BTUUodXNlcnMsIHdobywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgdXNlcnMpKQorLy9hcHBsZXQ6SUZfV0hPKCAgQVBQTEVUKCAgd2hvLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VTRVJTKSArPSB3aG8ubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1dITykgKz0gd2hvLm8KKworLy91c2FnZTojZGVmaW5lIHVzZXJzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgdXNlcnNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgdXNlcnMgY3VycmVudGx5IGxvZ2dlZCBvbiIKKworLy91c2FnZTojZGVmaW5lIHdob190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hXSIKKy8vdXNhZ2U6I2RlZmluZSB3aG9fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IHdobyBpcyBsb2dnZWQgb25cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU2hvdyBhbGwiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdm9pZCBpZGxlX3N0cmluZyhjaGFyICpzdHI2LCB0aW1lX3QgdCkKK3sKKwl0ID0gdGltZShOVUxMKSAtIHQ7CisKKwkvKmlmICh0IDwgNjApIHsKKwkJc3RyNlswXSA9ICcuJzsKKwkJc3RyNlsxXSA9ICdcMCc7CisJCXJldHVybjsKKwl9Ki8KKwlpZiAodCA+PSAwICYmIHQgPCAoMjQgKiA2MCAqIDYwKSkgeworCQlzcHJpbnRmKHN0cjYsICIlMDJkOiUwMmQiLAorCQkJCShpbnQpICh0IC8gKDYwICogNjApKSwKKwkJCQkoaW50KSAoKHQgJSAoNjAgKiA2MCkpIC8gNjApKTsKKwkJcmV0dXJuOworCX0KKwlzdHJjcHkoc3RyNiwgIm9sZCIpOworfQorCitpbnQgd2hvX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3aG9fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB1dG1wICp1dDsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGRvX3VzZXJzID0gKEVOQUJMRV9VU0VSUyAmJiAoIUVOQUJMRV9XSE8gfHwgYXBwbGV0X25hbWVbMF0gPT0gJ3UnKSk7CisJY29uc3QgY2hhciAqZm10ID0gIiVzIjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0wIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBkb191c2VycyA/ICIiIDogImFIIik7CisJaWYgKG9wdCAmIDIpIC8vIC1ICisJCXByaW50ZigiVVNFUlx0XHRUVFlcdFx0SURMRVx0VElNRVx0XHQgSE9TVFxuIik7CisKKwlzZXR1dGVudCgpOworCXdoaWxlICgodXQgPSBnZXR1dGVudCgpKSAhPSBOVUxMKSB7CisJCWlmICh1dC0+dXRfdXNlclswXQorCQkgJiYgKChvcHQgJiAxKSB8fCB1dC0+dXRfdHlwZSA9PSBVU0VSX1BST0NFU1MpCisJCSkgeworCQkJaWYgKCFkb191c2VycykgeworCQkJCWNoYXIgc3RyNls2XTsKKwkJCQljaGFyIG5hbWVbc2l6ZW9mKCIvZGV2LyIpICsgc2l6ZW9mKHV0LT51dF9saW5lKSArIDFdOworCQkJCXN0cnVjdCBzdGF0IHN0OworCQkJCXRpbWVfdCBzZWNvbmRzOworCisJCQkJc3RyNlswXSA9ICc/JzsKKwkJCQlzdHI2WzFdID0gJ1wwJzsKKwkJCQlzdHJjcHkobmFtZSwgIi9kZXYvIik7CisJCQkJc2FmZV9zdHJuY3B5KHV0LT51dF9saW5lWzBdID09ICcvJyA/IG5hbWUgOiBuYW1lICsgc2l6ZW9mKCIvZGV2LyIpLTEsCisJCQkJCXV0LT51dF9saW5lLAorCQkJCQlzaXplb2YodXQtPnV0X2xpbmUpKzEKKwkJCQkpOworCQkJCWlmIChzdGF0KG5hbWUsICZzdCkgPT0gMCkKKwkJCQkJaWRsZV9zdHJpbmcoc3RyNiwgc3Quc3RfYXRpbWUpOworCQkJCS8qIG1hbnBhZ2VzIHNheSB1dF90di50dl9zZWMgKmlzKiB0aW1lX3QsCisJCQkJICogYnV0IHNvbWUgc3lzdGVtcyBoYXZlIGl0IHdyb25nICovCisJCQkJc2Vjb25kcyA9IHV0LT51dF90di50dl9zZWM7CisJCQkJLyogSG93IHdpZGUgdGltZSBmaWVsZCBjYW4gYmU/CisJCQkJICogIk5vdiAxMCAxOTozMzoyMCI6IDE1IGNoYXJzCisJCQkJICogIjIwMTAtMTEtMTAgMTk6MzMiOiAxNiBjaGFycworCQkJCSAqLworCQkJCXByaW50ZigiJS0xNS4qcyAlLTE1LipzICUtN3MgJS0xNi4xNnMgJS4qc1xuIiwKKwkJCQkJCShpbnQpc2l6ZW9mKHV0LT51dF91c2VyKSwgdXQtPnV0X3VzZXIsCisJCQkJCQkoaW50KXNpemVvZih1dC0+dXRfbGluZSksIHV0LT51dF9saW5lLAorCQkJCQkJc3RyNiwKKwkJCQkJCWN0aW1lKCZzZWNvbmRzKSArIDQsCisJCQkJCQkoaW50KXNpemVvZih1dC0+dXRfaG9zdCksIHV0LT51dF9ob3N0CisJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKGZtdCwgdXQtPnV0X3VzZXIpOworCQkJCWZtdCA9ICIgJXMiOworCQkJfQorCQl9CisJfQorCWlmIChkb191c2VycykKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWVuZHV0ZW50KCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy93aG9hbWkuYyBiL2J1c3lib3gtMS4xOS4zL2NvcmV1dGlscy93aG9hbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGIxN2NhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3dob2FtaS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgd2hvYW1pIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAtLSBNYXRjaGVzIEdOVSBiZWhhdmlvci4gKi8KKworLy91c2FnZTojZGVmaW5lIHdob2FtaV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHdob2FtaV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSB1c2VyIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGVmZmVjdGl2ZSB1c2VyIGlkIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IHdob2FtaV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2hvYW1pX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJaWYgKGFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIFdpbGwgY29tcGxhaW4gYW5kIGRpZSBpZiB1c2VybmFtZSBub3QgZm91bmQgKi8KKwlwdXRzKHh1aWQydW5hbWUoZ2V0ZXVpZCgpKSk7CisKKwlyZXR1cm4gZmZsdXNoX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3llcy5jIGIvYnVzeWJveC0xLjE5LjMvY29yZXV0aWxzL3llcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzk5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9jb3JldXRpbHMveWVzLmMKQEAgLTAsMCArMSw0NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogeWVzIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gTWF0Y2hlcyBHTlUgYmVoYXZpb3IuICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogU2l6ZSByZWR1Y3Rpb25zIGFuZCByZW1vdmVkIHJlZHVuZGFudCBhcHBsZXQgbmFtZSBwcmVmaXggZnJvbSBlcnJvciBtZXNzYWdlcy4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLy91c2FnZTojZGVmaW5lIHllc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW1NUUklOR10iCisvL3VzYWdlOiNkZWZpbmUgeWVzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVwZWF0ZWRseSBvdXRwdXQgYSBsaW5lIHdpdGggU1RSSU5HLCBvciAneSciCisKK2ludCB5ZXNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHllc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKnBwOworCisJYXJndlswXSA9IChjaGFyKikieSI7CisJaWYgKGFyZ3ZbMV0pCisJCSsrYXJndjsKKworCWRvIHsKKwkJcHAgPSBhcmd2OworCQl3aGlsZSAoMSkgeworCQkJZnB1dHMoKnBwLCBzdGRvdXQpOworCQkJaWYgKCEqKytwcCkKKwkJCQlicmVhazsKKwkJCXB1dGNoYXIoJyAnKTsKKwkJfQorCX0gd2hpbGUgKHB1dGNoYXIoJ1xuJykgIT0gRU9GKTsKKworCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kZWJpYW51dGlscy9Db25maWcuc3JjIGIvYnVzeWJveC0xLjE5LjMvZGViaWFudXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmMwOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZGViaWFudXRpbHMvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDg1IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJEZWJpYW4gVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIE1LVEVNUAorCWJvb2wgIm1rdGVtcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta3RlbXAgaXMgdXNlZCB0byBjcmVhdGUgdW5pcXVlIHRlbXBvcmFyeSBmaWxlcworCitjb25maWcgUElQRV9QUk9HUkVTUworCWJvb2wgInBpcGVfcHJvZ3Jlc3MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRGlzcGxheSBhIGRvdCB0byBpbmRpY2F0ZSBwaXBlIGFjdGl2aXR5LgorCitjb25maWcgUlVOX1BBUlRTCisJYm9vbCAicnVuLXBhcnRzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJ1bi1wYXJ0cyBpcyBhIHV0aWxpdHkgZGVzaWduZWQgdG8gcnVuIGFsbCB0aGUgc2NyaXB0cyBpbiBhIGRpcmVjdG9yeS4KKworCSAgSXQgaXMgdXNlZnVsIHRvIHNldCB1cCBhIGRpcmVjdG9yeSBsaWtlIGNyb24uZGFpbHksIHdoZXJlIHlvdSBuZWVkIHRvCisJICBleGVjdXRlIGFsbCB0aGUgc2NyaXB0cyBpbiB0aGF0IGRpcmVjdG9yeS4KKworCSAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBydW4tcGFydHMgc29tZSBmZWF0dXJlcyAoc3VjaCBhcyByZXBvcnQKKwkgIG1vZGUpIGFyZSBub3QgaW1wbGVtZW50ZWQuCisKKwkgIFVubGVzcyB5b3Uga25vdyB0aGF0IHJ1bi1wYXJ0cyBpcyB1c2VkIGluIHNvbWUgb2YgeW91ciBzY3JpcHRzCisJICB5b3UgY2FuIHNhZmVseSBzYXkgTiBoZXJlLgorCitjb25maWcgRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJVTl9QQVJUUyAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHJ1bi1wYXJ0cyBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX1JVTl9QQVJUU19GQU5DWQorCWJvb2wgIlN1cHBvcnQgYWRkaXRpb25hbCBhcmd1bWVudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSVU5fUEFSVFMKKwloZWxwCisJICBTdXBwb3J0IGFkZGl0aW9uYWwgb3B0aW9uczoKKwkgIC1sIC0tbGlzdCBwcmludCB0aGUgbmFtZXMgb2YgdGhlIGFsbCBtYXRjaGluZyBmaWxlcyAobm90CisJICAgICAgICAgICAgbGltaXRlZCB0byBleGVjdXRhYmxlcyksIGJ1dCBkb24ndCBhY3R1YWxseSBydW4gdGhlbS4KKworY29uZmlnIFNUQVJUX1NUT1BfREFFTU9OCisJYm9vbCAic3RhcnQtc3RvcC1kYWVtb24iCisJZGVmYXVsdCB5CisJaGVscAorCSAgc3RhcnQtc3RvcC1kYWVtb24gaXMgdXNlZCB0byBjb250cm9sIHRoZSBjcmVhdGlvbiBhbmQKKwkgIHRlcm1pbmF0aW9uIG9mIHN5c3RlbS1sZXZlbCBwcm9jZXNzZXMsIHVzdWFsbHkgdGhlIG9uZXMKKwkgIHN0YXJ0ZWQgZHVyaW5nIHRoZSBzdGFydHVwIG9mIHRoZSBzeXN0ZW0uCisKK2NvbmZpZyBGRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZCisJYm9vbCAiU3VwcG9ydCBhZGRpdGlvbmFsIGFyZ3VtZW50cyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNUQVJUX1NUT1BfREFFTU9OCisJaGVscAorCSAgU3VwcG9ydCBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKwkgIC1vfC0tb2tub2RvIGlnbm9yZWQgc2luY2Ugd2UgZXhpdCB3aXRoIDAgYW55d2F5CisJICAtdnwtLXZlcmJvc2UKKwkgIC1OfC0tbmljZWxldmVsIE4KKworY29uZmlnIEZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNUQVJUX1NUT1BfREFFTU9OICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgc3RhcnQtc3RvcC1kYWVtb24gYXBwbGV0LgorCitjb25maWcgV0hJQ0gKKwlib29sICJ3aGljaCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3aGljaCBpcyB1c2VkIHRvIGZpbmQgcHJvZ3JhbXMgaW4geW91ciBQQVRIIGFuZAorCSAgcHJpbnQgb3V0IHRoZWlyIHBhdGhuYW1lcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZGViaWFudXRpbHMvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL2RlYmlhbnV0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxYjVjOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2RlYmlhbnV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxNCBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfTUtURU1QKSAgICAgICAgICAgICs9IG1rdGVtcC5vCitsaWItJChDT05GSUdfUElQRV9QUk9HUkVTUykgICAgICs9IHBpcGVfcHJvZ3Jlc3MubworbGliLSQoQ09ORklHX1JVTl9QQVJUUykgICAgICAgICArPSBydW5fcGFydHMubworbGliLSQoQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OKSArPSBzdGFydF9zdG9wX2RhZW1vbi5vCitsaWItJChDT05GSUdfV0hJQ0gpICAgICAgICAgICAgICs9IHdoaWNoLm8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RlYmlhbnV0aWxzL21rdGVtcC5jIGIvYnVzeWJveC0xLjE5LjMvZGViaWFudXRpbHMvbWt0ZW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3Y2IxYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2RlYmlhbnV0aWxzL21rdGVtcC5jCkBAIC0wLDAgKzEsOTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbWt0ZW1wIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBEYW5pZWwgSmFjb2Jvd2l0egorICogV3JpdHRlbiBieSBEYW5pZWwgSmFjb2Jvd2l0eiA8ZGFuQGRlYmlhbi5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBDb3JldXRpbHMgNi4xMiBtYW4gcGFnZSBzYXlzOgorICogICAgICAgIG1rdGVtcCBbT1BUSU9OXS4uLiBbVEVNUExBVEVdCisgKiBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBvciBkaXJlY3RvcnksIHNhZmVseSwgYW5kIHByaW50IGl0cyBuYW1lLiBJZgorICogVEVNUExBVEUgaXMgbm90IHNwZWNpZmllZCwgdXNlIHRtcC5YWFhYWFhYWFhYLgorICogLWQsIC0tZGlyZWN0b3J5CisgKiAgICAgICAgY3JlYXRlIGEgZGlyZWN0b3J5LCBub3QgYSBmaWxlCisgKiAtcSwgLS1xdWlldAorICogICAgICAgIHN1cHByZXNzIGRpYWdub3N0aWNzIGFib3V0IGZpbGUvZGlyLWNyZWF0aW9uIGZhaWx1cmUKKyAqIC11LCAtLWRyeS1ydW4KKyAqICAgICAgICBkbyBub3QgY3JlYXRlIGFueXRoaW5nOyBtZXJlbHkgcHJpbnQgYSBuYW1lICh1bnNhZmUpCisgKiAtLXRtcGRpcls9RElSXQorICogICAgICAgIGludGVycHJldCBURU1QTEFURSByZWxhdGl2ZSB0byBESVIuIElmIERJUiBpcyBub3Qgc3BlY2lmaWVkLAorICogICAgICAgIHVzZSAgJFRNUERJUiBpZiBzZXQsIGVsc2UgL3RtcC4gIFdpdGggdGhpcyBvcHRpb24sIFRFTVBMQVRFIG11c3QKKyAqICAgICAgICBub3QgYmUgYW4gYWJzb2x1dGUgbmFtZS4gVW5saWtlIHdpdGggLXQsIFRFTVBMQVRFIG1heSBjb250YWluCisgKiAgICAgICAgc2xhc2hlcywgYnV0IGV2ZW4gaGVyZSwgbWt0ZW1wIHN0aWxsIGNyZWF0ZXMgb25seSB0aGUgZmluYWwgY29tLQorICogICAgICAgIHBvbmVudC4KKyAqIC1wIERJUiB1c2UgRElSIGFzIGEgcHJlZml4OyBpbXBsaWVzIC10IFtkZXByZWNhdGVkXQorICogLXQgICAgIGludGVycHJldCBURU1QTEFURSBhcyBhIHNpbmdsZSBmaWxlIG5hbWUgY29tcG9uZW50LCByZWxhdGl2ZSAgdG8KKyAqICAgICAgICBhICBkaXJlY3Rvcnk6ICAkVE1QRElSLCBpZiBzZXQ7IGVsc2UgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgdmlhCisgKiAgICAgICAgLXA7IGVsc2UgL3RtcCBbZGVwcmVjYXRlZF0KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbWt0ZW1wX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWR0XSBbLXAgRElSXSBbVEVNUExBVEVdIgorLy91c2FnZTojZGVmaW5lIG1rdGVtcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHdpdGggbmFtZSBiYXNlZCBvbiBURU1QTEFURSBhbmQgcHJpbnQgaXRzIG5hbWUuXG4iCisvL3VzYWdlOiAgICAgICAiVEVNUExBVEUgbXVzdCBlbmQgd2l0aCBYWFhYWFggKGUuZy4gWy9kaXIvXW5hbWVYWFhYWFgpLlxuIgorLy91c2FnZTogICAgICAgIldpdGhvdXQgVEVNUExBVEUsIC10IHRtcC5YWFhYWFggaXMgYXNzdW1lZC5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJTWFrZSBkaXJlY3RvcnksIG5vdCBmaWxlIgorLy8vL3VzYWdlOiAgICJcbgktcQlGYWlsIHNpbGVudGx5IG9uIGVycm9ycyIgLSB3ZSBpZ25vcmUgdGhpcyBvcHQKKy8vdXNhZ2U6ICAgICAiXG4JLXQJUHJlcGVuZCBiYXNlIGRpcmVjdG9yeSBuYW1lIHRvIFRFTVBMQVRFIgorLy91c2FnZTogICAgICJcbgktcCBESVIJVXNlIERJUiBhcyBhIGJhc2UgZGlyZWN0b3J5IChpbXBsaWVzIC10KSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuQmFzZSBkaXJlY3RvcnkgaXM6IC1wIERJUiwgZWxzZSAkVE1QRElSLCBlbHNlIC90bXAiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1rdGVtcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBta3RlbXAgL3RtcC90ZW1wLlhYWFhYWFxuIgorLy91c2FnZTogICAgICAgIi90bXAvdGVtcC5tV2lMak1cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sYSAvdG1wL3RlbXAubVdpTGpNXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LS0tLS0tLSAgICAxIGFuZGVyc2VuIGFuZGVyc2VuICAgICAgICAwIEFwciAyNSAxNzoxMCAvdG1wL3RlbXAubVdpTGpNXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgbWt0ZW1wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBta3RlbXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnBhdGg7CisJY2hhciAqY2hwOworCXVuc2lnbmVkIG9wdHM7CisJZW51bSB7CisJCU9QVF9kID0gMSA8PCAwLAorCQlPUFRfcSA9IDEgPDwgMSwKKwkJT1BUX3QgPSAxIDw8IDIsCisJCU9QVF9wID0gMSA8PCAzLAorCX07CisKKwlwYXRoID0gZ2V0ZW52KCJUTVBESVIiKTsKKwlpZiAoIXBhdGggfHwgcGF0aFswXSA9PSAnXDAnKQorCQlwYXRoID0gIi90bXAiOworCisJLyogLXEgaXMgaWdub3JlZCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xIjsgLyogMSBhcmd1bWVudCBtYXggKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImRxdHA6IiwgJnBhdGgpOworCisJY2hwID0gYXJndltvcHRpbmRdOworCWlmICghY2hwKSB7CisJCS8qIEdOVSBjb3JldXRpbHMgOC40OgorCQkgKiBiYXJlICJta3RlbXAiIC0+ICJta3RlbXAgLXQgdG1wLlhYWFhYWCIKKwkJICovCisJCWNocCA9IHhzdHJkdXAoInRtcC5YWFhYWFgiKTsKKwkJb3B0cyB8PSBPUFRfdDsKKwl9CisJaWYgKG9wdHMgJiAoT1BUX3R8T1BUX3ApKQorCQljaHAgPSBjb25jYXRfcGF0aF9maWxlKHBhdGgsIGNocCk7CisKKwlpZiAob3B0cyAmIE9QVF9kKSB7CisJCWlmIChta2R0ZW1wKGNocCkgPT0gTlVMTCkKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJaWYgKG1rc3RlbXAoY2hwKSA8IDApCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCXB1dHMoY2hwKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kZWJpYW51dGlscy9waXBlX3Byb2dyZXNzLmMgYi9idXN5Ym94LTEuMTkuMy9kZWJpYW51dGlscy9waXBlX3Byb2dyZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3NDQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2RlYmlhbnV0aWxzL3BpcGVfcHJvZ3Jlc3MuYwpAQCAtMCwwICsxLDM5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNb25pdG9yIGEgcGlwZSB3aXRoIGEgc2ltcGxlIHByb2dyZXNzIGRpc3BsYXkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+LCBKb2V5IEhlc3MKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBwaXBlX3Byb2dyZXNzX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBwaXBlX3Byb2dyZXNzX2Z1bGxfdXNhZ2UgIiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgUElQRV9QUk9HUkVTU19TSVpFIDQwOTYKKworLyogUmVhZCBhIGJsb2NrIG9mIGRhdGEgZnJvbSBzdGRpbiwgd3JpdGUgaXQgdG8gc3Rkb3V0LgorICogQWN0aXZpdHkgaXMgaW5kaWNhdGVkIGJ5IGEgJy4nIHRvIHN0ZGVycgorICovCitpbnQgcGlwZV9wcm9ncmVzc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGlwZV9wcm9ncmVzc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgYnVmW1BJUEVfUFJPR1JFU1NfU0laRV07CisJdGltZV90IHQgPSB0aW1lKE5VTEwpOworCWludCBsZW47CisKKwl3aGlsZSAoKGxlbiA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIGJ1ZiwgUElQRV9QUk9HUkVTU19TSVpFKSkgPiAwKSB7CisJCXRpbWVfdCBuZXdfdGltZSA9IHRpbWUoTlVMTCk7CisJCWlmIChuZXdfdGltZSAhPSB0KSB7CisJCQl0ID0gbmV3X3RpbWU7CisJCQliYl9wdXRjaGFyX3N0ZGVycignLicpOworCQl9CisJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCBsZW4pOworCX0KKworCWJiX3B1dGNoYXJfc3RkZXJyKCdcbicpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kZWJpYW51dGlscy9ydW5fcGFydHMuYyBiL2J1c3lib3gtMS4xOS4zL2RlYmlhbnV0aWxzL3J1bl9wYXJ0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Y2JmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kZWJpYW51dGlscy9ydW5fcGFydHMuYwpAQCAtMCwwICsxLDE5NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBydW4tcGFydHMgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogQmFzZWQgb24gYSBvbGRlciB2ZXJzaW9uIHRoYXQgd2FzIGluIGJ1c3lib3ggd2hpY2ggd2FzIDFrIGJpZy4uCisgKiAgIENvcHlyaWdodCAoQykgMjAwMSBieSBFbWFudWVsZSBBaW5hIDxlbWFudWVsZS5haW5hQHRpc2NhbGkuaXQ+CisgKgorICogQmFzZWQgb24gdGhlIERlYmlhbiBydW4tcGFydHMgcHJvZ3JhbSwgdmVyc2lvbiAxLjE1CisgKiAgIENvcHlyaWdodCAoQykgMTk5NiBKZWZmIE5veG9uIDxqZWZmQHJvdXRlci5wYXRjaC5uZXQ+LAorICogICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBHdXkgTWFvciA8bWFvckBkZWJpYW4ub3JnPgorICoKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFRoaXMgaXMgbXkgZmlyc3QgYXR0ZW1wdCB0byB3cml0ZSBhIHByb2dyYW0gaW4gQyAod2VsbCwgdGhpcyBpcyBteSBmaXJzdAorICogYXR0ZW1wdCB0byB3cml0ZSBhIHByb2dyYW0hIDotKSAuICovCisKKy8qIFRoaXMgcGllY2Ugb2YgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHJ1bi1wYXJ0cywKKyAqIHRha2VuIGZyb20gZGViaWFuLXV0aWxzLiBJJ3ZlIG9ubHkgcmVtb3ZlZCB0aGUgbG9uZyBvcHRpb25zIGFuZCBhIHRoZQorICogcmVwb3J0IG1vZGUuIEFzIHRoZSBvcmlnaW5hbCBydW4tcGFydHMgc3VwcG9ydCBvbmx5IGxvbmcgb3B0aW9ucywgSSd2ZQorICogYnJva2VuIGNvbXBhdGliaWxpdHkgYmVjYXVzZSB0aGUgQnVzeUJveCBwb2xpY3kgZG9lc24ndCBhbGxvdyB0aGVtLgorICogVGhlIHN1cHBvcnRlZCBvcHRpb25zIGFyZToKKyAqIC10ICAgICAgICAgICB0ZXN0LiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZXMgdG8gYmUgZXhlY3V0ZWQsIHdpdGhvdXQKKyAqICAgICAgICAgICAgICBleGVjdXRlIHRoZW0uCisgKiAtYSBBUkcgICAgICAgYXJndW1lbnQuIFBhc3MgQVJHIGFzIGFuIGFyZ3VtZW50IHRoZSBwcm9ncmFtIGV4ZWN1dGVkLiBJdCBjYW4KKyAqICAgICAgICAgICAgICBiZSByZXBlYXRlZCB0byBwYXNzIG11bHRpcGxlIGFyZ3VtZW50cy4KKyAqIC11IE1BU0sgICAgICB1bWFzay4gU2V0IHRoZSB1bWFzayBvZiB0aGUgcHJvZ3JhbSBleGVjdXRlZCB0byBNQVNLLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBydW5fcGFydHNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdF0gIklGX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZKCJbLWxdICIpIlstYSBBUkddIFstdSBNQVNLXSBESVJFQ1RPUlkiCisvL3VzYWdlOiNkZWZpbmUgcnVuX3BhcnRzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIGEgYnVuY2ggb2Ygc2NyaXB0cyBpbiBESVJFQ1RPUllcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJUHJpbnQgd2hhdCB3b3VsZCBiZSBydW4sIGJ1dCBkb24ndCBhY3R1YWxseSBydW4gYW55dGhpbmciCisvL3VzYWdlOiAgICAgIlxuCS1hIEFSRwlQYXNzIEFSRyBhcyBhcmd1bWVudCBmb3IgZXZlcnkgcHJvZ3JhbSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgTUFTSwlTZXQgdGhlIHVtYXNrIHRvIE1BU0sgYmVmb3JlIHJ1bm5pbmcgZXZlcnkgcHJvZ3JhbSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktbAlQcmludCBuYW1lcyBvZiBhbGwgbWF0Y2hpbmcgZmlsZXMgZXZlbiBpZiB0aGV5IGFyZSBub3QgZXhlY3V0YWJsZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcnVuX3BhcnRzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJ1bi1wYXJ0cyAtYSBzdGFydCAvZXRjL2luaXQuZFxuIgorLy91c2FnZTogICAgICAgIiQgcnVuLXBhcnRzIC1hIHN0b3A9bm93IC9ldGMvaW5pdC5kXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMZXQncyBhc3N1bWUgeW91IGhhdmUgYSBzY3JpcHQgZm9vL2Rvc29tZXRoaW5nOlxuIgorLy91c2FnZTogICAgICAgIiMhL2Jpbi9zaFxuIgorLy91c2FnZTogICAgICAgImZvciBpIGluICQqOyBkbyBldmFsICRpOyBkb25lOyB1bnNldCBpXG4iCisvL3VzYWdlOiAgICAgICAiY2FzZSBcIiQxXCIgaW5cbiIKKy8vdXNhZ2U6ICAgICAgICJzdGFydCopIGVjaG8gc3RhcnRpbmcgc29tZXRoaW5nOztcbiIKKy8vdXNhZ2U6ICAgICAgICJzdG9wKikgc2V0IC14OyBzaHV0ZG93biAtaCAkc3RvcDs7XG4iCisvL3VzYWdlOiAgICAgICAiZXNhY1xuXG4iCisvL3VzYWdlOiAgICAgICAiUnVubmluZyB0aGlzIHlpZWxkczpcbiIKKy8vdXNhZ2U6ICAgICAgICIkcnVuLXBhcnRzIC1hIHN0b3A9KzRtIGZvby9cbiIKKy8vdXNhZ2U6ICAgICAgICIrIHNodXRkb3duIC1oICs0bSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICoqbmFtZXM7CisJaW50ICAgIGN1cjsKKwljaGFyICAqY21kWzFdOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgbmFtZXMgKEcubmFtZXMpCisjZGVmaW5lIGN1ciAgIChHLmN1ciAgKQorI2RlZmluZSBjbWQgICAoRy5jbWQgICkKKworZW51bSB7IE5VTV9DTUQgPSAoQ09NTU9OX0JVRlNJWkUgLSBzaXplb2YoRykpIC8gc2l6ZW9mKGNtZFswXSkgLSAxIH07CisKK2VudW0geworCU9QVF9yID0gKDEgPDwgMCksCisJT1BUX2EgPSAoMSA8PCAxKSwKKwlPUFRfdSA9ICgxIDw8IDIpLAorCU9QVF90ID0gKDEgPDwgMyksCisJT1BUX2wgPSAoMSA8PCA0KSAqIEVOQUJMRV9GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSwKK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1kKKyNkZWZpbmUgbGlzdF9tb2RlIChvcHRpb25fbWFzazMyICYgT1BUX2wpCisjZWxzZQorI2RlZmluZSBsaXN0X21vZGUgMAorI2VuZGlmCisKKy8qIElzIHRoaXMgYSB2YWxpZCBmaWxlbmFtZSAodXBwZXIvbG93ZXIgYWxwaGEsIGRpZ2l0cywKKyAqIHVuZGVyc2NvcmVzLCBhbmQgaHlwaGVucyBvbmx5PykKKyAqLworc3RhdGljIGJvb2wgaW52YWxpZF9uYW1lKGNvbnN0IGNoYXIgKmMpCit7CisJYyA9IGJiX2Jhc2VuYW1lKGMpOworCisJd2hpbGUgKCpjICYmIChpc2FsbnVtKCpjKSB8fCAqYyA9PSAnXycgfHwgKmMgPT0gJy0nKSkKKwkJYysrOworCisJcmV0dXJuICpjOyAvKiBUUlVFICghMCkgaWYgdGVybWluYXRpbmcgTlVMIGlzIG5vdCByZWFjaGVkICovCit9CisKK3N0YXRpYyBpbnQgYmJfYWxwaGFzb3J0KGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwlpbnQgciA9IHN0cmNtcCgqKGNoYXIgKiopIHAxLCAqKGNoYXIgKiopIHAyKTsKKwlyZXR1cm4gKG9wdGlvbl9tYXNrMzIgJiBPUFRfcikgPyAtciA6IHI7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGFjdChjb25zdCBjaGFyICpmaWxlLCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1Ziwgdm9pZCAqYXJncyBVTlVTRURfUEFSQU0sIGludCBkZXB0aCkKK3sKKwlpZiAoZGVwdGggPT0gMSkKKwkJcmV0dXJuIFRSVUU7CisKKwlpZiAoZGVwdGggPT0gMgorCSAmJiAoICAhKHN0YXRidWYtPnN0X21vZGUgJiAoU19JRlJFRyB8IFNfSUZMTkspKQorCSAgICB8fCBpbnZhbGlkX25hbWUoZmlsZSkKKwkgICAgfHwgKCFsaXN0X21vZGUgJiYgYWNjZXNzKGZpbGUsIFhfT0spICE9IDApKQorCSkgeworCQlyZXR1cm4gU0tJUDsKKwl9CisKKwluYW1lcyA9IHhyZWFsbG9jX3ZlY3RvcihuYW1lcywgNCwgY3VyKTsKKwluYW1lc1tjdXIrK10gPSB4c3RyZHVwKGZpbGUpOworCS8qbmFtZXNbY3VyXSA9IE5VTEw7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBydW5wYXJ0c19sb25nb3B0c1tdIEFMSUdOMSA9CisJImFyZ1wwIiAgICAgUmVxdWlyZWRfYXJndW1lbnQgImEiCisJInVtYXNrXDAiICAgUmVxdWlyZWRfYXJndW1lbnQgInUiCisJInRlc3RcMCIgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZCisJImxpc3RcMCIgICAgTm9fYXJndW1lbnQgICAgICAgImwiCisJInJldmVyc2VcMCIgTm9fYXJndW1lbnQgICAgICAgInIiCisvL1RPRE86ICJ2ZXJib3NlXDAiIE5vX2FyZ3VtZW50ICAgICAgICJ2IgorI2VuZGlmCisJOworI2VuZGlmCisKK2ludCBydW5fcGFydHNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJ1bl9wYXJ0c19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqdW1hc2tfcCA9ICIyMiI7CisJbGxpc3RfdCAqYXJnX2xpc3QgPSBOVUxMOworCXVuc2lnbmVkIG47CisJaW50IHJldDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gcnVucGFydHNfbG9uZ29wdHM7CisjZW5kaWYKKwkvKiBXZSByZXF1aXJlIGV4YWN0bHkgb25lIGFyZ3VtZW50OiB0aGUgZGlyZWN0b3J5IG5hbWUgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MTphOjoiOworCWdldG9wdDMyKGFyZ3YsICJyYTp1OnQiSUZfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1koImwiKSwgJmFyZ19saXN0LCAmdW1hc2tfcCk7CisKKwl1bWFzayh4c3RydG91X3JhbmdlKHVtYXNrX3AsIDgsIDAsIDA3Nzc3KSk7CisKKwluID0gMTsKKwl3aGlsZSAoYXJnX2xpc3QgJiYgbiA8IE5VTV9DTUQpIHsKKwkJY21kW24rK10gPSBsbGlzdF9wb3AoJmFyZ19saXN0KTsKKwl9CisJLyogY21kW25dID0gTlVMTDsgLSBpcyBhbHJlYWR5IHplcm9lZCBvdXQgKi8KKworCS8qIHJ1bi1wYXJ0cyBoYXMgdG8gc29ydCBleGVjdXRhYmxlcyBieSBuYW1lIGJlZm9yZSBydW5uaW5nIHRoZW0gKi8KKworCXJlY3Vyc2l2ZV9hY3Rpb24oYXJndltvcHRpbmRdLAorCQkJQUNUSU9OX1JFQ1VSU0V8QUNUSU9OX0ZPTExPV0xJTktTLAorCQkJYWN0LCAgICAgICAgICAgIC8qIGZpbGUgYWN0aW9uICovCisJCQlhY3QsICAgICAgICAgICAgLyogZGlyIGFjdGlvbiAqLworCQkJTlVMTCwgICAgICAgICAgIC8qIHVzZXIgZGF0YSAqLworCQkJMSAgICAgICAgICAgICAgIC8qIGRlcHRoICovCisJCSk7CisKKwlpZiAoIW5hbWVzKQorCQlyZXR1cm4gMDsKKworCXFzb3J0KG5hbWVzLCBjdXIsIHNpemVvZihjaGFyICopLCBiYl9hbHBoYXNvcnQpOworCisJbiA9IDA7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqbmFtZSA9ICpuYW1lcysrOworCQlpZiAoIW5hbWUpCisJCQlicmVhazsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiAoT1BUX3QgfCBPUFRfbCkpIHsKKwkJCXB1dHMobmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQljbWRbMF0gPSBuYW1lOworCQlyZXQgPSBzcGF3bl9hbmRfd2FpdChjbWQpOworCQlpZiAocmV0ID09IDApCisJCQljb250aW51ZTsKKwkJbiA9IDE7CisJCWlmIChyZXQgPCAwKQorCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgbmFtZSk7CisJCWVsc2UgLyogcmV0ID4gMCAqLworCQkJYmJfZXJyb3JfbXNnKCIlcyBleGl0ZWQgd2l0aCBjb2RlICVkIiwgbmFtZSwgcmV0ICYgMHhmZik7CisJfQorCisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kZWJpYW51dGlscy9zdGFydF9zdG9wX2RhZW1vbi5jIGIvYnVzeWJveC0xLjE5LjMvZGViaWFudXRpbHMvc3RhcnRfc3RvcF9kYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzYxOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZGViaWFudXRpbHMvc3RhcnRfc3RvcF9kYWVtb24uYwpAQCAtMCwwICsxLDUxOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzdGFydC1zdG9wLWRhZW1vbiBpbXBsZW1lbnRhdGlvbihzKSBmb3IgYnVzeWJveAorICoKKyAqIFdyaXR0ZW4gYnkgTWFyZWsgTWljaGFsa2lld2ljeiA8bWFyZWttQGkxN2xpbnV4Yi5pc3RzLnB3ci53cm9jLnBsPiwKKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggRGF2aWQgS2ltZG9uIDxkd2hlZG9uQGdvcmRpYW4uY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKK1RoaXMgaXMgaG93IGl0IGlzIHN1cHBvc2VkIHRvIHdvcms6CisKK3N0YXJ0LXN0b3AtZGFlbW9uIFtPUFRJT05TXSBbLS1zdGFydHwtLXN0b3BdIFtbLS1dIGFyZ3VtZW50cy4uLl0KKworT25lIChvbmx5KSBvZiB0aGVzZSBtdXN0IGJlIGdpdmVuOgorICAgICAgICAtUywtLXN0YXJ0ICAgICAgICAgICAgICBTdGFydAorICAgICAgICAtSywtLXN0b3AgICAgICAgICAgICAgICBTdG9wCisKK1NlYXJjaCBmb3IgbWF0Y2hpbmcgcHJvY2Vzc2VzLgorSWYgLS1zdG9wIGlzIGdpdmVuLCBzdG9wIGFsbCBtYXRjaGluZyBwcm9jZXNzZXMgKGJ5IHNlbmRpbmcgYSBzaWduYWwpLgorSWYgLS1zdGFydCBpcyBnaXZlbiwgc3RhcnQgYSBuZXcgcHJvY2VzcyB1bmxlc3MgYSBtYXRjaGluZyBwcm9jZXNzIHdhcyBmb3VuZC4KKworT3B0aW9ucyBjb250cm9sbGluZyBwcm9jZXNzIG1hdGNoaW5nCisoaWYgbXVsdGlwbGUgY29uZGl0aW9ucyBhcmUgc3BlY2lmaWVkLCBhbGwgbXVzdCBtYXRjaCk6CisgICAgICAgIC11LC0tdXNlciBVU0VSTkFNRXxVSUQgIE9ubHkgY29uc2lkZXIgdGhpcyB1c2VyJ3MgcHJvY2Vzc2VzCisgICAgICAgIC1uLC0tbmFtZSBQUk9DRVNTX05BTUUgIExvb2sgZm9yIHByb2Nlc3NlcyBieSBtYXRjaGluZyBQUk9DRVNTX05BTUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBjb21tIGZpZWxkIGluIC9wcm9jLyRQSUQvc3RhdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBiYXNlbmFtZSBpcyBjb21wYXJlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm50cGQiID09ICIuL250cGQiID09ICIvcGF0aC90by9udHBkIi4KK1tUT0RPOiBjYW4gUFJPQ0VTU19OQU1FIGJlIGEgZnVsbCBwYXRobmFtZT8gU2hvdWxkIHdlIHJlcXVpcmUgZnVsbCBtYXRjaCB0aGVuCit3aXRoIC9wcm9jLyRQSUQvZXhlIG9yIGFyZ3ZbMF0gKGNvbW0gY2FuJ3QgYmUgbWF0Y2hlZCwgaXQgbmV2ZXIgY29udGFpbnMgcGF0aCldCisgICAgICAgIC14LC0tZXhlYyBFWEVDVVRBQkxFICAgIExvb2sgZm9yIHByb2Nlc3NlcyB0aGF0IHdlcmUgc3RhcnRlZCB3aXRoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBpbiAvcHJvYy8kUElEL2NtZGxpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVubGlrZSAtbiwgd2UgbWF0Y2ggYWdhaW5zdCB0aGUgZnVsbCBwYXRoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnRwZCIgIT0gIi4vbnRwZCIgIT0gIi9wYXRoL3RvL250cGQiCisgICAgICAgIC1wLC0tcGlkZmlsZSBQSURfRklMRSAgIExvb2sgZm9yIHByb2Nlc3NlcyB3aXRoIFBJRCBmcm9tIHRoaXMgZmlsZQorCitPcHRpb25zIHdoaWNoIGFyZSB2YWxpZCBmb3IgLS1zdGFydCBvbmx5OgorICAgICAgICAteCwtLWV4ZWMgRVhFQ1VUQUJMRSAgICBQcm9ncmFtIHRvIHJ1biAoMXN0IGFyZyBvZiBleGVjdnApLiBNYW5kYXRvcnkuCisgICAgICAgIC1hLC0tc3RhcnRhcyBOQU1FICAgICAgIGFyZ3ZbMF0gKGRlZmF1bHRzIHRvIEVYRUNVVEFCTEUpCisgICAgICAgIC1iLC0tYmFja2dyb3VuZCAgICAgICAgIFB1dCBwcm9jZXNzIGludG8gYmFja2dyb3VuZAorICAgICAgICAtTiwtLW5pY2VsZXZlbCBOICAgICAgICBBZGQgTiB0byBwcm9jZXNzJyBuaWNlIGxldmVsCisgICAgICAgIC1jLC0tY2h1aWQgVVNFUls6W0dSUF1dIENoYW5nZSB0byBzcGVjaWZpZWQgdXNlciBbYW5kIGdyb3VwXQorICAgICAgICAtbSwtLW1ha2UtcGlkZmlsZSAgICAgICBXcml0ZSBQSUQgdG8gdGhlIHBpZGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvdGggLW0gYW5kIC1wIG11c3QgYmUgZ2l2ZW4hKQorCitPcHRpb25zIHdoaWNoIGFyZSB2YWxpZCBmb3IgLS1zdG9wIG9ubHk6CisgICAgICAgIC1zLC0tc2lnbmFsIFNJRyAgICAgICAgIFNpZ25hbCB0byBzZW5kIChkZWZhdWx0OlRFUk0pCisgICAgICAgIC10LC0tdGVzdCAgICAgICAgICAgICAgIEV4aXQgd2l0aCBzdGF0dXMgMCBpZiBwcm9jZXNzIGlzIGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZSBkb24ndCBhY3R1YWxseSBzdGFydCBvciBzdG9wIGRhZW1vbnMpCisKK01pc2Mgb3B0aW9uczoKKyAgICAgICAgLW8sLS1va25vZG8gICAgICAgICAgICAgRXhpdCB3aXRoIHN0YXR1cyAwIGlmIG5vdGhpbmcgaXMgZG9uZQorICAgICAgICAtcSwtLXF1aWV0ICAgICAgICAgICAgICBRdWlldAorICAgICAgICAtdiwtLXZlcmJvc2UgICAgICAgICAgICBWZXJib3NlCisqLworCisvL3VzYWdlOiNkZWZpbmUgc3RhcnRfc3RvcF9kYWVtb25fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbLVN8LUtdIC4uLiBbLS0gQVJHUy4uLl0iCisvL3VzYWdlOiNkZWZpbmUgc3RhcnRfc3RvcF9kYWVtb25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZWFyY2ggZm9yIG1hdGNoaW5nIHByb2Nlc3NlcywgYW5kIHRoZW5cbiIKKy8vdXNhZ2U6ICAgICAgICItSzogc3RvcCBhbGwgbWF0Y2hpbmcgcHJvY2Vzc2VzLlxuIgorLy91c2FnZTogICAgICAgIi1TOiBzdGFydCBhIHByb2Nlc3MgdW5sZXNzIGEgbWF0Y2hpbmcgcHJvY2VzcyBpcyBmb3VuZC5cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcblByb2Nlc3MgbWF0Y2hpbmc6IgorLy91c2FnZTogICAgICJcbgktdSwtLXVzZXIgVVNFUk5BTUV8VUlECU1hdGNoIG9ubHkgdGhpcyB1c2VyJ3MgcHJvY2Vzc2VzIgorLy91c2FnZTogICAgICJcbgktbiwtLW5hbWUgTkFNRQkJTWF0Y2ggcHJvY2Vzc2VzIHdpdGggTkFNRSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJaW4gY29tbSBmaWVsZCBpbiAvcHJvYy9QSUQvc3RhdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXgsLS1leGVjIEVYRUNVVEFCTEUJTWF0Y2ggcHJvY2Vzc2VzIHdpdGggdGhpcyBjb21tYW5kIgorLy91c2FnZTogICAgICJcbgkJCQlpbiAvcHJvYy9QSUQvY21kbGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAsLS1waWRmaWxlIEZJTEUJTWF0Y2ggYSBwcm9jZXNzIHdpdGggUElEIGZyb20gdGhlIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCUFsbCBzcGVjaWZpZWQgY29uZGl0aW9ucyBtdXN0IG1hdGNoIgorLy91c2FnZTogICAgICJcbi1TIG9ubHk6IgorLy91c2FnZTogICAgICJcbgkteCwtLWV4ZWMgRVhFQ1VUQUJMRQlQcm9ncmFtIHRvIHJ1biIKKy8vdXNhZ2U6ICAgICAiXG4JLWEsLS1zdGFydGFzIE5BTUUJWmVyb3RoIGFyZ3VtZW50IgorLy91c2FnZTogICAgICJcbgktYiwtLWJhY2tncm91bmQJCUJhY2tncm91bmQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktTiwtLW5pY2VsZXZlbCBOCUNoYW5nZSBuaWNlIGxldmVsIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktYywtLWNodWlkIFVTRVJbOltHUlBdXQlDaGFuZ2UgdG8gdXNlci9ncm91cCIKKy8vdXNhZ2U6ICAgICAiXG4JLW0sLS1tYWtlLXBpZGZpbGUJV3JpdGUgUElEIHRvIHRoZSBwaWRmaWxlIHNwZWNpZmllZCBieSAtcCIKKy8vdXNhZ2U6ICAgICAiXG4tSyBvbmx5OiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zaWduYWwgU0lHCQlTaWduYWwgdG8gc2VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10ZXN0CQlNYXRjaCBvbmx5LCBleGl0IHdpdGggMCBpZiBhIHByb2Nlc3MgaXMgZm91bmQiCisvL3VzYWdlOiAgICAgIlxuT3RoZXI6IgorLy91c2FnZToJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLW8sLS1va25vZG8JCUV4aXQgd2l0aCBzdGF0dXMgMCBpZiBub3RoaW5nIGlzIGRvbmUiCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQkJVmVyYm9zZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXEsLS1xdWlldAkJUXVpZXQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuUHJvY2VzcyBtYXRjaGluZzoiCisvL3VzYWdlOiAgICAgIlxuCS11IFVTRVJOQU1FfFVJRAlNYXRjaCBvbmx5IHRoaXMgdXNlcidzIHByb2Nlc3NlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTkFNRQkJTWF0Y2ggcHJvY2Vzc2VzIHdpdGggTkFNRSIKKy8vdXNhZ2U6ICAgICAiXG4JCQlpbiBjb21tIGZpZWxkIGluIC9wcm9jL1BJRC9zdGF0IgorLy91c2FnZTogICAgICJcbgkteCBFWEVDVVRBQkxFCU1hdGNoIHByb2Nlc3NlcyB3aXRoIHRoaXMgY29tbWFuZCIKKy8vdXNhZ2U6ICAgICAiXG4JCQljb21tYW5kIGluIC9wcm9jL1BJRC9jbWRsaW5lIgorLy91c2FnZTogICAgICJcbgktcCBGSUxFCQlNYXRjaCBhIHByb2Nlc3Mgd2l0aCBQSUQgZnJvbSB0aGUgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JQWxsIHNwZWNpZmllZCBjb25kaXRpb25zIG11c3QgbWF0Y2giCisvL3VzYWdlOiAgICAgIlxuLVMgb25seToiCisvL3VzYWdlOiAgICAgIlxuCS14IEVYRUNVVEFCTEUJUHJvZ3JhbSB0byBydW4iCisvL3VzYWdlOiAgICAgIlxuCS1hIE5BTUUJCVplcm90aCBhcmd1bWVudCIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJCUJhY2tncm91bmQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktTiBOCQlDaGFuZ2UgbmljZSBsZXZlbCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWMgVVNFUls6W0dSUF1dCUNoYW5nZSB0byB1c2VyL2dyb3VwIgorLy91c2FnZTogICAgICJcbgktbQkJV3JpdGUgUElEIHRvIHRoZSBwaWRmaWxlIHNwZWNpZmllZCBieSAtcCIKKy8vdXNhZ2U6ICAgICAiXG4tSyBvbmx5OiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0lHCQlTaWduYWwgdG8gc2VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJCU1hdGNoIG9ubHksIGV4aXQgd2l0aCAwIGlmIGEgcHJvY2VzcyBpcyBmb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG5PdGhlcjoiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktbwkJRXhpdCB3aXRoIHN0YXR1cyAwIGlmIG5vdGhpbmcgaXMgZG9uZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1xCQlRdWlldCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisvKiBPdmVycmlkZSBFTkFCTEVfRkVBVFVSRV9QSURGSUxFICovCisjZGVmaW5lIFdBTlRfUElERklMRSAxCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RydWN0IHBpZF9saXN0IHsKKwlzdHJ1Y3QgcGlkX2xpc3QgKm5leHQ7CisJcGlkX3QgcGlkOworfTsKKworZW51bSB7CisJQ1RYX1NUT1AgICAgICAgPSAoMSA8PCAgMCksCisJQ1RYX1NUQVJUICAgICAgPSAoMSA8PCAgMSksCisJT1BUX0JBQ0tHUk9VTkQgPSAoMSA8PCAgMiksIC8vIC1iCisJT1BUX1FVSUVUICAgICAgPSAoMSA8PCAgMyksIC8vIC1xCisJT1BUX1RFU1QgICAgICAgPSAoMSA8PCAgNCksIC8vIC10CisJT1BUX01BS0VQSUQgICAgPSAoMSA8PCAgNSksIC8vIC1tCisJT1BUX2EgICAgICAgICAgPSAoMSA8PCAgNiksIC8vIC1hCisJT1BUX24gICAgICAgICAgPSAoMSA8PCAgNyksIC8vIC1uCisJT1BUX3MgICAgICAgICAgPSAoMSA8PCAgOCksIC8vIC1zCisJT1BUX3UgICAgICAgICAgPSAoMSA8PCAgOSksIC8vIC11CisJT1BUX2MgICAgICAgICAgPSAoMSA8PCAxMCksIC8vIC1jCisJT1BUX3ggICAgICAgICAgPSAoMSA8PCAxMSksIC8vIC14CisJT1BUX3AgICAgICAgICAgPSAoMSA8PCAxMiksIC8vIC1wCisJT1BUX09LTk9ETyAgICAgPSAoMSA8PCAxMykgKiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSwgLy8gLW8KKwlPUFRfVkVSQk9TRSAgICA9ICgxIDw8IDE0KSAqIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZLCAvLyAtdgorCU9QVF9OSUNFTEVWRUwgID0gKDEgPDwgMTUpICogRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1ksIC8vIC1OCit9OworI2RlZmluZSBRVUlFVCAob3B0aW9uX21hc2szMiAmIE9QVF9RVUlFVCkKKyNkZWZpbmUgVEVTVCAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVTVCkKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCBwaWRfbGlzdCAqZm91bmRfcHJvY3M7CisJY2hhciAqdXNlcnNwZWM7CisJY2hhciAqY21kbmFtZTsKKwljaGFyICpleGVjbmFtZTsKKwljaGFyICpwaWRmaWxlOworCWNoYXIgKmV4ZWNuYW1lX2NtcGJ1ZjsKKwl1bnNpZ25lZCBleGVjbmFtZV9zaXplb2Y7CisJaW50IHVzZXJfaWQ7CisJc21hbGxpbnQgc2lnbmFsX25yOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgdXNlcnNwZWMgICAgICAgICAgKEcudXNlcnNwZWMgICAgICAgICAgICApCisjZGVmaW5lIGNtZG5hbWUgICAgICAgICAgIChHLmNtZG5hbWUgICAgICAgICAgICAgKQorI2RlZmluZSBleGVjbmFtZSAgICAgICAgICAoRy5leGVjbmFtZSAgICAgICAgICAgICkKKyNkZWZpbmUgcGlkZmlsZSAgICAgICAgICAgKEcucGlkZmlsZSAgICAgICAgICAgICApCisjZGVmaW5lIHVzZXJfaWQgICAgICAgICAgIChHLnVzZXJfaWQgICAgICAgICAgICAgKQorI2RlZmluZSBzaWduYWxfbnIgICAgICAgICAoRy5zaWduYWxfbnIgICAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJdXNlcl9pZCA9IC0xOyBcCisJc2lnbmFsX25yID0gMTU7IFwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBPTERFUl9WRVJTSU9OX09GX1gKKy8qIC14LC0tZXhlYyBFWEVDVVRBQkxFCisgKiBMb29rIGZvciBwcm9jZXNzZXMgd2l0aCBtYXRjaGluZyAvcHJvYy8kUElEL2V4ZS4KKyAqIE1hdGNoIGlzIHBlcmZvcm1lZCB1c2luZyBkZXZpY2UraW5vZGUuCisgKi8KK3N0YXRpYyBpbnQgcGlkX2lzX2V4ZWMocGlkX3QgcGlkKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNoYXIgYnVmW3NpemVvZigiL3Byb2MvJXUvZXhlIikgKyBzaXplb2YoaW50KSozXTsKKworCXNwcmludGYoYnVmLCAiL3Byb2MvJXUvZXhlIiwgKHVuc2lnbmVkKXBpZCk7CisJaWYgKHN0YXQoYnVmLCAmc3QpIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0LnN0X2RldiA9PSBleGVjc3RhdC5zdF9kZXYKKwkgJiYgc3Quc3RfaW5vID09IGV4ZWNzdGF0LnN0X2lubykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBwaWRfaXNfZXhlYyhwaWRfdCBwaWQpCit7CisJc3NpemVfdCBieXRlczsKKwljaGFyIGJ1ZltzaXplb2YoIi9wcm9jLyV1L2NtZGxpbmUiKSArIHNpemVvZihpbnQpKjNdOworCisJc3ByaW50ZihidWYsICIvcHJvYy8ldS9jbWRsaW5lIiwgKHVuc2lnbmVkKXBpZCk7CisJYnl0ZXMgPSBvcGVuX3JlYWRfY2xvc2UoYnVmLCBHLmV4ZWNuYW1lX2NtcGJ1ZiwgRy5leGVjbmFtZV9zaXplb2YpOworCWlmIChieXRlcyA+IDApIHsKKwkJRy5leGVjbmFtZV9jbXBidWZbYnl0ZXNdID0gJ1wwJzsKKwkJcmV0dXJuIHN0cmNtcChleGVjbmFtZSwgRy5leGVjbmFtZV9jbXBidWYpID09IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpZF9pc19uYW1lKHBpZF90IHBpZCkKK3sKKwkvKiAvcHJvYy9QSUQvc3RhdCBpcyAiUElEIChjb21tXzE1X2J5dGVzX21heCkgLi4uIiAqLworCWNoYXIgYnVmWzMyXTsgLyogc2hvdWxkIGJlIGVub3VnaCAqLworCWNoYXIgKnAsICpwZTsKKworCXNwcmludGYoYnVmLCAiL3Byb2MvJXUvc3RhdCIsICh1bnNpZ25lZClwaWQpOworCWlmIChvcGVuX3JlYWRfY2xvc2UoYnVmLCBidWYsIHNpemVvZihidWYpIC0gMSkgPCAwKQorCQlyZXR1cm4gMDsKKwlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7IC8qIHBhcmFub2lhICovCisJcCA9IHN0cmNocihidWYsICcoJyk7CisJaWYgKCFwKQorCQlyZXR1cm4gMDsKKwlwZSA9IHN0cnJjaHIoKytwLCAnKScpOworCWlmICghcGUpCisJCXJldHVybiAwOworCSpwZSA9ICdcMCc7CisJLyogd2UgcmVxdWlyZSBjb21tIHRvIG1hdGNoIGFuZCB0byBub3QgYmUgdHJ1bmNhdGVkICovCisJLyogaW4gTGludXgsIGlmIGNvbW0gaXMgMTUgY2hhcnMsIGl0IG1heSBiZSBhIHRydW5jYXRlZAorCSAqIG5hbWUsIHNvIHdlIGRvbid0IGFsbG93IHRoYXQgdG8gbWF0Y2ggKi8KKwlpZiAoc3RybGVuKHApID49IENPTU1fTEVOIC0gMSkgLyogQ09NTV9MRU4gaXMgMTYgKi8KKwkJcmV0dXJuIDA7CisJcmV0dXJuIHN0cmNtcChwLCBjbWRuYW1lKSA9PSAwOworfQorCitzdGF0aWMgaW50IHBpZF9pc191c2VyKGludCBwaWQpCit7CisJc3RydWN0IHN0YXQgc2I7CisJY2hhciBidWZbc2l6ZW9mKCIvcHJvYy8iKSArIHNpemVvZihpbnQpKjNdOworCisJc3ByaW50ZihidWYsICIvcHJvYy8ldSIsICh1bnNpZ25lZClwaWQpOworCWlmIChzdGF0KGJ1ZiwgJnNiKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHNiLnN0X3VpZCA9PSAodWlkX3QpdXNlcl9pZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrKGludCBwaWQpCit7CisJc3RydWN0IHBpZF9saXN0ICpwOworCisJaWYgKGV4ZWNuYW1lICYmICFwaWRfaXNfZXhlYyhwaWQpKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGNtZG5hbWUgJiYgIXBpZF9pc19uYW1lKHBpZCkpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAodXNlcnNwZWMgJiYgIXBpZF9pc191c2VyKHBpZCkpIHsKKwkJcmV0dXJuOworCX0KKwlwID0geG1hbGxvYyhzaXplb2YoKnApKTsKKwlwLT5uZXh0ID0gRy5mb3VuZF9wcm9jczsKKwlwLT5waWQgPSBwaWQ7CisJRy5mb3VuZF9wcm9jcyA9IHA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3BpZGZpbGUodm9pZCkKK3sKKwlGSUxFICpmOworCXVuc2lnbmVkIHBpZDsKKworCWYgPSBmb3Blbl9mb3JfcmVhZChwaWRmaWxlKTsKKwlpZiAoZikgeworCQlpZiAoZnNjYW5mKGYsICIldSIsICZwaWQpID09IDEpCisJCQljaGVjayhwaWQpOworCQlmY2xvc2UoZik7CisJfSBlbHNlIGlmIChlcnJubyAhPSBFTk9FTlQpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgib3BlbiBwaWRmaWxlICVzIiwgcGlkZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3Byb2Npbml0KHZvaWQpCit7CisJRElSICpwcm9jZGlyOworCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCWludCBwaWQ7CisKKwlpZiAocGlkZmlsZSkgeworCQlkb19waWRmaWxlKCk7CisJCXJldHVybjsKKwl9CisKKwlwcm9jZGlyID0geG9wZW5kaXIoIi9wcm9jIik7CisKKwlwaWQgPSAwOworCXdoaWxlICgxKSB7CisJCWVycm5vID0gMDsgLyogY2xlYXIgYW55IHByZXZpb3VzIGVycm9yICovCisJCWVudHJ5ID0gcmVhZGRpcihwcm9jZGlyKTsKKy8vIFRPRE86IHRoaXMgY2hlY2sgaXMgdG9vIGdlbmVyaWMsIGl0J3MgYmV0dGVyCisvLyB0byBjaGVjayBmb3IgZXhhY3QgZXJybm8ocykgd2hpY2ggbWVhbiB0aGF0IHdlIGdvdCBzdGFsZSBlbnRyeQorCQlpZiAoZXJybm8pIC8qIFN0YWxlIGVudHJ5LCBwcm9jZXNzIGhhcyBkaWVkIGFmdGVyIG9wZW5kaXIgKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoIWVudHJ5KSAvKiBFT0YsIG5vIG1vcmUgZW50cmllcyAqLworCQkJYnJlYWs7CisJCXBpZCA9IGJiX3N0cnRvdShlbnRyeS0+ZF9uYW1lLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubykgLyogTmFOICovCisJCQljb250aW51ZTsKKwkJY2hlY2socGlkKTsKKwl9CisJY2xvc2VkaXIocHJvY2Rpcik7CisJaWYgKCFwaWQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3RoaW5nIGluIC9wcm9jIC0gbm90IG1vdW50ZWQ/Iik7Cit9CisKK3N0YXRpYyBpbnQgZG9fc3RvcCh2b2lkKQoreworCWNoYXIgKndoYXQ7CisJc3RydWN0IHBpZF9saXN0ICpwOworCWludCBraWxsZWQgPSAwOworCisJaWYgKGNtZG5hbWUpIHsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB3aGF0ID0geHN0cmR1cChjbWRuYW1lKTsKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgd2hhdCA9IGNtZG5hbWU7CisJfSBlbHNlIGlmIChleGVjbmFtZSkgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHdoYXQgPSB4c3RyZHVwKGV4ZWNuYW1lKTsKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgd2hhdCA9IGV4ZWNuYW1lOworCX0gZWxzZSBpZiAocGlkZmlsZSkgeworCQl3aGF0ID0geGFzcHJpbnRmKCJwcm9jZXNzIGluIHBpZGZpbGUgJyVzJyIsIHBpZGZpbGUpOworCX0gZWxzZSBpZiAodXNlcnNwZWMpIHsKKwkJd2hhdCA9IHhhc3ByaW50ZigicHJvY2Vzcyhlcykgb3duZWQgYnkgJyVzJyIsIHVzZXJzcGVjKTsKKwl9IGVsc2UgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW50ZXJuYWwgZXJyb3IsIHBsZWFzZSByZXBvcnQiKTsKKwl9CisKKwlpZiAoIUcuZm91bmRfcHJvY3MpIHsKKwkJaWYgKCFRVUlFVCkKKwkJCXByaW50Zigibm8gJXMgZm91bmQ7IG5vbmUga2lsbGVkXG4iLCB3aGF0KTsKKwkJa2lsbGVkID0gLTE7CisJCWdvdG8gcmV0OworCX0KKwlmb3IgKHAgPSBHLmZvdW5kX3Byb2NzOyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAoa2lsbChwLT5waWQsIFRFU1QgPyAwIDogc2lnbmFsX25yKSA9PSAwKSB7CisJCQlraWxsZWQrKzsKKwkJfSBlbHNlIHsKKwkJCWJiX3BlcnJvcl9tc2coIndhcm5pbmc6IGtpbGxpbmcgcHJvY2VzcyAldSIsICh1bnNpZ25lZClwLT5waWQpOworCQkJcC0+cGlkID0gMDsKKwkJCWlmIChURVNUKSB7CisJCQkJLyogRXhhbXBsZTogLUsgLS10ZXN0IC0tcGlkZmlsZSBQSURGSUxFIGRldGVjdGVkCisJCQkJICogdGhhdCBQSURGSUxFJ3MgcGlkIGRvZXNuJ3QgZXhpc3QgKi8KKwkJCQlraWxsZWQgPSAtMTsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIVFVSUVUICYmIGtpbGxlZCkgeworCQlwcmludGYoInN0b3BwZWQgJXMgKHBpZCIsIHdoYXQpOworCQlmb3IgKHAgPSBHLmZvdW5kX3Byb2NzOyBwOyBwID0gcC0+bmV4dCkKKwkJCWlmIChwLT5waWQpCisJCQkJcHJpbnRmKCIgJXUiLCAodW5zaWduZWQpcC0+cGlkKTsKKwkJcHV0cygiKSIpOworCX0KKyByZXQ6CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKHdoYXQpOworCXJldHVybiBraWxsZWQ7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIHN0YXJ0X3N0b3BfZGFlbW9uX2xvbmdvcHRzW10gQUxJR04xID0KKwkic3RvcFwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJLIgorCSJzdGFydFwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlMiCisJImJhY2tncm91bmRcMCIgICBOb19hcmd1bWVudCAgICAgICAiYiIKKwkicXVpZXRcMCIgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJxIgorCSJ0ZXN0XDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisJIm1ha2UtcGlkZmlsZVwwIiBOb19hcmd1bWVudCAgICAgICAibSIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWQorCSJva25vZG9cMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm8iCisJInZlcmJvc2VcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAidiIKKwkibmljZWxldmVsXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJOIgorI2VuZGlmCisJInN0YXJ0YXNcMCIgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiYSIKKwkibmFtZVwwIiAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJuIgorCSJzaWduYWxcMCIgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInMiCisJInVzZXJcMCIgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidSIKKwkiY2h1aWRcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJjIgorCSJleGVjXDAiICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIngiCisJInBpZGZpbGVcMCIgICAgICBSZXF1aXJlZF9hcmd1bWVudCAicCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWQorCSJyZXRyeVwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlIiCisjZW5kaWYKKwk7CisjZW5kaWYKKworaW50IHN0YXJ0X3N0b3BfZGFlbW9uX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdGFydF9zdG9wX2RhZW1vbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWNoYXIgKnNpZ25hbWU7CisJY2hhciAqc3RhcnRhczsKKwljaGFyICpjaHVpZDsKKyNpZmRlZiBPTERFUl9WRVJTSU9OX09GX1gKKwlzdHJ1Y3Qgc3RhdCBleGVjc3RhdDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZCisvLwljaGFyICpyZXRyeV9hcmcgPSBOVUxMOworLy8JaW50IHJldHJpZXMgPSAtMTsKKwljaGFyICpvcHRfTjsKKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gc3RhcnRfc3RvcF9kYWVtb25fbG9uZ29wdHM7CisjZW5kaWYKKworCS8qIC1LIG9yIC1TIGlzIHJlcXVpcmVkOyB0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KKwkvKiAtcCBpcyByZXF1aXJlZCBpZiAtbSBpcyBnaXZlbiAqLworCS8qIC14cHVuIChhdCBsZWFzdCBvbmUpIGlzIHJlcXVpcmVkIGlmIC1LIGlzIGdpdmVuICovCisJLyogLXhhIChhdCBsZWFzdCBvbmUpIGlzIHJlcXVpcmVkIGlmIC1TIGlzIGdpdmVuICovCisJLyogLXEgdHVybnMgb2ZmIC12ICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiSzpTOkstLVM6Uy0tSzptP3A6Sz94cHVuOlM/eGEiCisJCUlGX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1koInEtdiIpOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJLU2JxdG1hOm46czp1OmM6eDpwOiIKKwkJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgib3ZOOlI6IiksCisJCSZzdGFydGFzLCAmY21kbmFtZSwgJnNpZ25hbWUsICZ1c2Vyc3BlYywgJmNodWlkLCAmZXhlY25hbWUsICZwaWRmaWxlCisJCUlGX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1koLCZvcHRfTikKKwkJLyogV2UgYWNjZXB0IGFuZCBpZ25vcmUgLVIgPHBhcmFtPiAvIC0tcmV0cnkgPHBhcmFtPiAqLworCQlJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKCxOVUxMKQorCSk7CisKKwlpZiAob3B0ICYgT1BUX3MpIHsKKwkJc2lnbmFsX25yID0gZ2V0X3NpZ251bShzaWduYW1lKTsKKwkJaWYgKHNpZ25hbF9uciA8IDApIGJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZiAoIShvcHQgJiBPUFRfYSkpCisJCXN0YXJ0YXMgPSBleGVjbmFtZTsKKwlpZiAoIWV4ZWNuYW1lKSAvKiBpbiBjYXNlIC1hIGlzIGdpdmVuIGFuZCAteCBpcyBub3QgKi8KKwkJZXhlY25hbWUgPSBzdGFydGFzOworCWlmIChleGVjbmFtZSkgeworCQlHLmV4ZWNuYW1lX3NpemVvZiA9IHN0cmxlbihleGVjbmFtZSkgKyAxOworCQlHLmV4ZWNuYW1lX2NtcGJ1ZiA9IHhtYWxsb2MoRy5leGVjbmFtZV9zaXplb2YgKyAxKTsKKwl9CisKKy8vCUlGX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1koCisvLwkJaWYgKHJldHJ5X2FyZykKKy8vCQkJcmV0cmllcyA9IHhhdG9pX3Bvc2l0aXZlKHJldHJ5X2FyZyk7CisvLwkpCisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICh1c2Vyc3BlYykgeworCQl1c2VyX2lkID0gYmJfc3RydG91KHVzZXJzcGVjLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubykKKwkJCXVzZXJfaWQgPSB4dW5hbWUydWlkKHVzZXJzcGVjKTsKKwl9CisJLyogQm90aCBzdGFydCBhbmQgc3RvcCBuZWVkIHRvIGtub3cgY3VycmVudCBwcm9jZXNzZXMgKi8KKwlkb19wcm9jaW5pdCgpOworCisJaWYgKG9wdCAmIENUWF9TVE9QKSB7CisJCWludCBpID0gZG9fc3RvcCgpOworCQlyZXR1cm4gKG9wdCAmIE9QVF9PS05PRE8pID8gMCA6IChpIDw9IDApOworCX0KKworCWlmIChHLmZvdW5kX3Byb2NzKSB7CisJCWlmICghUVVJRVQpCisJCQlwcmludGYoIiVzIGlzIGFscmVhZHkgcnVubmluZ1xuJXVcbiIsIGV4ZWNuYW1lLCAodW5zaWduZWQpRy5mb3VuZF9wcm9jcy0+cGlkKTsKKwkJcmV0dXJuICEob3B0ICYgT1BUX09LTk9ETyk7CisJfQorCisjaWZkZWYgT0xERVJfVkVSU0lPTl9PRl9YCisJaWYgKGV4ZWNuYW1lKQorCQl4c3RhdChleGVjbmFtZSwgJmV4ZWNzdGF0KTsKKyNlbmRpZgorCisJKi0tYXJndiA9IHN0YXJ0YXM7CisJaWYgKG9wdCAmIE9QVF9CQUNLR1JPVU5EKSB7CisjaWYgQkJfTU1VCisJCWJiX2RhZW1vbml6ZShEQUVNT05fREVWTlVMTF9TVERJTyArIERBRU1PTl9DTE9TRV9FWFRSQV9GRFMpOworCQkvKiBEQUVNT05fREVWTlVMTF9TVERJTyBpcyBzdXBlcmZsdW91cyAtCisJCSAqIGl0J3MgYWx3YXlzIGRvbmUgYnkgYmJfZGFlbW9uaXplKCkgKi8KKyNlbHNlCisJCXBpZF90IHBpZCA9IHh2Zm9yaygpOworCQlpZiAocGlkICE9IDApIHsKKwkJCS8qIHBhcmVudCAqLworCQkJLyogd2h5IF9leGl0PyB0aGUgY2hpbGQgbWF5IGhhdmUgY2hhbmdlZCB0aGUgc3RhY2ssCisJCQkgKiBzbyAicmV0dXJuIDAiIG1heSBkbyBiYWQgdGhpbmdzICovCisJCQlfZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisJCS8qIENoaWxkICovCisJCXNldHNpZCgpOyAvKiBkZXRhY2ggZnJvbSBjb250cm9sbGluZyB0dHkgKi8KKwkJLyogUmVkaXJlY3Qgc3RkaW8gdG8gL2Rldi9udWxsLCBjbG9zZSBleHRyYSBGRHMuCisJCSAqIFdlIGRvIG5vdCBhY3R1YWxseSBkYWVtb25pemUgYmVjYXVzZSBvZiBEQUVNT05fT05MWV9TQU5JVElaRSAqLworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0RFVk5VTExfU1RESU8KKwkJCSsgREFFTU9OX0NMT1NFX0VYVFJBX0ZEUworCQkJKyBEQUVNT05fT05MWV9TQU5JVElaRSwKKwkJCU5VTEwgLyogYXJndiwgdW51c2VkICovICk7CisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9NQUtFUElEKSB7CisJCS8qIFVzZXIgd2FudHMgX3VzXyB0byBtYWtlIHRoZSBwaWRmaWxlICovCisJCXdyaXRlX3BpZGZpbGUocGlkZmlsZSk7CisJfQorCWlmIChvcHQgJiBPUFRfYykgeworCQlzdHJ1Y3QgYmJfdWlkZ2lkX3QgdWdpZCA9IHsgLTEsIC0xIH07CisJCXBhcnNlX2Nob3duX3VzZXJncm91cF9vcl9kaWUoJnVnaWQsIGNodWlkKTsKKwkJaWYgKHVnaWQuZ2lkICE9IChnaWRfdCkgLTEpIHhzZXRnaWQodWdpZC5naWQpOworCQlpZiAodWdpZC51aWQgIT0gKHVpZF90KSAtMSkgeHNldHVpZCh1Z2lkLnVpZCk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZCisJaWYgKG9wdCAmIE9QVF9OSUNFTEVWRUwpIHsKKwkJLyogU2V0IHByb2Nlc3MgcHJpb3JpdHkgKi8KKwkJaW50IHByaW8gPSBnZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDApICsgeGF0b2lfcmFuZ2Uob3B0X04sIElOVF9NSU4vMiwgSU5UX01BWC8yKTsKKwkJaWYgKHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgcHJpbykgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHByaW9yaXR5KCVkKSIsIHByaW8pOworCQl9CisJfQorI2VuZGlmCisJZXhlY3ZwKHN0YXJ0YXMsIGFyZ3YpOworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgc3RhcnRhcyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kZWJpYW51dGlscy93aGljaC5jIGIvYnVzeWJveC0xLjE5LjMvZGViaWFudXRpbHMvd2hpY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZkNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZGViaWFudXRpbHMvd2hpY2guYwpAQCAtMCwwICsxLDk5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBXaGljaCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBHYWJyaWVsIFNvbWxvIDxzb21sbyBhdCBjbXUuZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQmFzZWQgb24gd2hpY2ggZnJvbSBkZWJpYW51dGlscworICovCisKKy8vdXNhZ2U6I2RlZmluZSB3aGljaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW0NPTU1BTkRdLi4uIgorLy91c2FnZTojZGVmaW5lIHdoaWNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9jYXRlIGEgQ09NTUFORCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgd2hpY2hfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgd2hpY2ggbG9naW5cbiIKKy8vdXNhZ2U6ICAgICAgICIvYmluL2xvZ2luXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgd2hpY2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHdoaWNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlJRl9ERVNLVE9QKGludCBvcHQ7KQorCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJY2hhciAqcGF0aDsKKwljaGFyICpwOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKi8KKwlJRl9ERVNLVE9QKG9wdCA9KSBnZXRvcHQzMihhcmd2LCAiYSIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogVGhpcyBtYXRjaGVzIHdoYXQgaXMgc2VlbiBvbiBlLmcuIHVidW50dS4KKwkgKiAid2hpY2giIHRoZXJlIGlzIGEgc2hlbGwgc2NyaXB0LiAqLworCXBhdGggPSBnZXRlbnYoIlBBVEgiKTsKKwlpZiAoIXBhdGgpIHsKKwkJcGF0aCA9IChjaGFyKiliYl9QQVRIX3Jvb3RfcGF0aDsKKwkJcHV0ZW52KHBhdGgpOworCQlwYXRoICs9IDU7IC8qIHNraXAgIlBBVEg9IiAqLworCX0KKworCWRvIHsKKyNpZiBFTkFCTEVfREVTS1RPUAorLyogTXVjaCBibG9hdCBqdXN0IHRvIHN1cHBvcnQgLWEgKi8KKwkJaWYgKHN0cmNocigqYXJndiwgJy8nKSkgeworCQkJaWYgKGV4ZWNhYmxlX2ZpbGUoKmFyZ3YpKSB7CisJCQkJcHV0cygqYXJndik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCX0gZWxzZSB7CisJCQljaGFyICpwYXRoMiA9IHhzdHJkdXAocGF0aCk7CisJCQljaGFyICp0bXAgPSBwYXRoMjsKKworCQkJcCA9IGZpbmRfZXhlY2FibGUoKmFyZ3YsICZ0bXApOworCQkJaWYgKCFwKQorCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCWVsc2UgeworIHByaW50OgorCQkJCXB1dHMocCk7CisJCQkJZnJlZShwKTsKKwkJCQlpZiAob3B0KSB7CisJCQkJCS8qIC1hOiBzaG93IG1hdGNoZXMgaW4gYWxsIFBBVEggY29tcG9uZW50cyAqLworCQkJCQlpZiAodG1wKSB7CisJCQkJCQlwID0gZmluZF9leGVjYWJsZSgqYXJndiwgJnRtcCk7CisJCQkJCQlpZiAocCkKKwkJCQkJCQlnb3RvIHByaW50OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZnJlZShwYXRoMik7CisJCX0KKyNlbHNlCisvKiBKdXN0IGlnbm9yaW5nIC1hICovCisJCWlmIChzdHJjaHIoKmFyZ3YsICcvJykpIHsKKwkJCWlmIChleGVjYWJsZV9maWxlKCphcmd2KSkgeworCQkJCXB1dHMoKmFyZ3YpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJY2hhciAqcGF0aDIgPSB4c3RyZHVwKHBhdGgpOworCQkJY2hhciAqdG1wID0gcGF0aDI7CisJCQlwID0gZmluZF9leGVjYWJsZSgqYXJndiwgJnRtcCk7CisJCQlmcmVlKHBhdGgyKTsKKwkJCWlmIChwKSB7CisJCQkJcHV0cyhwKTsKKwkJCQlmcmVlKHApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKyNlbmRpZgorCX0gd2hpbGUgKCooKythcmd2KSAhPSBOVUxMKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RvY3MvU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPLnR4dCBiL2J1c3lib3gtMS4xOS4zL2RvY3MvU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTM5NTRiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9TZXJpYWwtUHJvZ3JhbW1pbmctSE9XVE8udHh0CkBAIC0wLDAgKzEsNDI0IEBACitEb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5sYWZuLm9yZy9+ZGF2ZS9saW51eC9TZXJpYWwtUHJvZ3JhbW1pbmctSE9XVE8udHh0CitTZWVtcyB0byBiZSBzb21ld2hhdCBvbGQsIGJ1dCBjb250YWlucyB1c2VmdWwgYml0cyBmb3IgZ2V0dHkuYyBoYWNraW5nCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgVGhlIExpbnV4IFNlcmlhbCBQcm9ncmFtbWluZyBIT1dUTywgUGFydCAxIG9mIDIKKyAgQnkgVmVybm9uIEMuIEhveGllCisgIHYyLjAgMTAgU2VwdGVtYmVyIDE5OTkKKworICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gcHJvZ3JhbSBjb21tdW5pY2F0aW9ucyB3aXRoIGRldmljZXMKKyAgb3ZlciBhIHNlcmlhbCBwb3J0IG9uIGEgTGludXggYm94LgorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgVGFibGUgb2YgQ29udGVudHMKKworICAxLiBDb3B5cmlnaHQKKworICAyLiBJbnRyb2R1Y3Rpb24KKworICAzLiBPcGVuaW5nCisKKyAgNC4gQ29tbWFuZHMKKworICA1LiBDaGFuZ2luZyBCYXVkIFJhdGVzCisKKyAgNi4gQWRkaXRpb25hbCBDb250cm9sIENhbGxzCisKKyAgICAgNi4xIFNlbmRpbmcgYSAiYnJlYWsiLgorICAgICA2LjIgSGFyZHdhcmUgZmxvdyBjb250cm9sLgorICAgICA2LjMgRmx1c2hpbmcgSS9PIGJ1ZmZlcnMuCisKKyAgNy4gTW9kZW0gY29udHJvbAorCisgIDguIFByb2Nlc3MgR3JvdXBzCisKKyAgICAgOC4xIFNlc3Npb25zCisgICAgIDguMiBQcm9jZXNzIEdyb3VwcworICAgICA4LjMgQ29udHJvbGxpbmcgVGVybWluYWwKKyAgICAgICAgOC4zLjEgR2V0IHRoZSBmb3JlZ3JvdW5kIGdyb3VwIHByb2Nlc3MgaWQuCisgICAgICAgIDguMy4yIFNldCB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIGlkIG9mIGEgdGVybWluYWwuCisgICAgICAgIDguMy4zIEdldCBwcm9jZXNzIGdyb3VwIGlkLgorCisgIDkuIExvY2tmaWxlcworCisgIDEwLiBBZGRpdGlvbmFsIEluZm9ybWF0aW9uCisKKyAgMTEuIEZlZWRiYWNrCisKKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuICBDb3B5cmlnaHQKKworICBUaGUgTGludXggU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPIGlzIGNvcHlyaWdodCAoQykgMTk5NyBieSBWZXJub24KKyAgSG94aWUuICBMaW51eCBIT1dUTyBkb2N1bWVudHMgbWF5IGJlIHJlcHJvZHVjZWQgYW5kIGRpc3RyaWJ1dGVkIGluCisgIHdob2xlIG9yIGluIHBhcnQsIGluIGFueSBtZWRpdW0gcGh5c2ljYWwgb3IgZWxlY3Ryb25pYywgYXMgbG9uZyBhcworICB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgb24gYWxsIGNvcGllcy4gQ29tbWVyY2lhbAorICByZWRpc3RyaWJ1dGlvbiBpcyBhbGxvd2VkIGFuZCBlbmNvdXJhZ2VkOyBob3dldmVyLCB0aGUgYXV0aG9yIHdvdWxkCisgIGxpa2UgdG8gYmUgbm90aWZpZWQgb2YgYW55IHN1Y2ggZGlzdHJpYnV0aW9ucy4KKworICBBbGwgdHJhbnNsYXRpb25zLCBkZXJpdmF0aXZlIHdvcmtzLCBvciBhZ2dyZWdhdGUgd29ya3MgaW5jb3Jwb3JhdGluZworICB0aGlzIExpbnV4IEhPV1RPIGRvY3VtZW50IG11c3QgYmUgY292ZXJlZCB1bmRlciB0aGlzIGNvcHlyaWdodCBub3RpY2UuCisgIFRoYXQgaXMsIHlvdSBtYXkgbm90IHByb2R1Y2UgYSBkZXJpdmF0aXZlIHdvcmsgZnJvbSB0aGlzIEhPV1RPIGFuZAorICBpbXBvc2UgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgb24gaXRzIGRpc3RyaWJ1dGlvbi4KKworICBUaGlzIHZlcnNpb24gaXMgYSBjb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBwcmV2aW91cyBTZXJpYWwtUHJvZ3JhbW1pbmctCisgIEhPV1RPICBieSBQZXRlciBILiBCYXVtYW5uLCAgPG1haWx0bzpQZXRlci5CYXVtYW5uQGRsci5kZT4KKworICAyLiAgSW50cm9kdWN0aW9uCisKKyAgVGhpcyBIT1dUTyB3aWxsIGF0dGVtcHQgdG8gZ2l2ZSBoaW50cyBhYm91dCBob3cgdG8gd3JpdGUgYSBwcm9ncmFtCisgIHdoaWNoIG5lZWRzIHRvIGFjY2VzcyBhIHNlcmlhbCBwb3J0LiAgSXRzIHByaW5jaXBhbCBmb2N1cyB3aWxsIGJlIG9uCisgIHRoZSBMaW51eCBpbXBsZW1lbnRhdGlvbiBhbmQgd2hhdCB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBsaWJyYXJ5CisgIGZ1bmN0aW9ucyBhdmFpbGFibGUuCisKKyAgU29tZW9uZSBhc2tlZCBhYm91dCB3aGljaCBvZiBzZXZlcmFsIHNlcXVlbmNlcyBvZiBvcGVyYXRpb25zIHdhcworICByaWdodC4gIFRoZXJlIGlzIG5vIGFic29sdXRlIHJpZ2h0IHdheSB0byBhY2NvbXBsaXNoIGFuIG91dGNvbWUuICBUaGUKKyAgb3B0aW9ucyBhdmFpbGFibGUgYXJlIHRvbyBudW1lcm91cy4gIElmIHlvdXIgc2VxdWVuY2VzIHByb2R1Y2VzIHRoZQorICBkZXNpcmVkIHJlc3VsdHMsIHRoZW4gdGhhdCBpcyB0aGUgcmlnaHQgd2F5IGZvciB5b3UuICBBbm90aGVyCisgIHByb2dyYW1tZXIgbWF5IHNlbGVjdCBhbm90aGVyIHNldCBvZiBvcHRpb25zIGFuZCBnZXQgdGhlIHNhbWUgcmVzdWx0cy4KKyAgSGlzIG1ldGhvZCBpcyByaWdodCBmb3IgaGltLgorCisgIE5laXRoZXIgb2YgdGhlc2UgbWV0aG9kcyBtYXkgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIHNvbWUgb3RoZXIKKyAgaW1wbGVtZW50YXRpb24gb2YgVU5JWC4gIEl0IGlzIHN0cmFuZ2UgdGhhdCBtYW55IG9mIHRoZSBjb25jZXB0cyB3aGljaAorICB3ZXJlIGltcGxlbWVudGVkIGluIHRoZSBTWVNWIHZlcnNpb24gaGF2ZSBiZWVuIGR1bXBlZC4gIEJlY2F1c2UgVU5JWAorICB3YXMgZGV2ZWxvcGVkIGJ5IEFUJlQgYW5kIG11Y2ggY29kZSBoYXMgYmVlbiBnZW5lcmF0ZWQgb24gdGhvc2UKKyAgY29uY2VwdHMsIHRoZSBBVCZUIHZlcnNpb24gc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCB0byB3aGljaCBvdGhlcnMKKyAgc2hvdWxkIGVtdWxhdGUuCisKKyAgTm93IHRoZSBzdGFuZGFyZCBpcyBQT1NJWC4KKworICBJdCB3YXMgb25jZSBzdGF0ZWQgdGhhdCB0aGUgcG9wdWxhcml0eSBvZiBVTklYIGFuZCBDIHdhcyB0aGF0IHRoZXkKKyAgd2VyZSBjcmVhdGVkIGJ5IHByb2dyYW1tZXJzIGZvciBwcm9ncmFtbWVycy4gIE5vdCBieSBzY2hvbGFycyB3aG8KKyAgaW5zaXN0IG9uIHB1cml0eSBvZiBzdHlsZSBpbiBkZWZlcmVuY2UgdG8gcmVzdWx0cyBhbmQgc2ltcGxpY2l0eSBvZgorICB1c2UuICBOb3QgYnkgY29tbWl0dGVlcyB3aXRoIHBlb3BsZSB3aG8gaGF2ZSBkaXZlcnNlIHBlcnNvbmFsIG9yCisgIHByb3ByaWV0YXJ5IGFnZW5kYS4gIE5vdyBBTlNJIGFuZCBQT1NJWCBoYXZlIHN0cmF5ZWQgZnJvbSB0aG9zZQorICBvcmlnaW5hbCBjbGVhciBhbmQgc2ltcGx5IGNvbmNlcHRzLgorCisgIDMuICBPcGVuaW5nCisKKyAgVGhlIHZhcmlvdXMgc2VyaWFsIGRldmljZXMgYXJlIG9wZW5lZCBqdXN0IGFzIGFueSBvdGhlciBmaWxlLgorICBBbHRob3VnaCwgdGhlIGZvcGVuKDMpIGNvbW1hbmQgbWF5IGJlIHVzZWQsIHRoZSBwbGFpbiBvcGVuKDIpIGlzCisgIHByZWZlcnJlZC4gIFRoaXMgY2FsbCByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2hpY2ggaXMgcmVxdWlyZWQKKyAgZm9yIHRoZSB2YXJpb3VzIGNvbW1hbmRzIHRoYXQgY29uZmlndXJlIHRoZSBpbnRlcmZhY2UuCisKKyAgT3BlbigyKSBoYXMgdGhlIGZvcm1hdDoKKworICAgICAgICNpbmNsdWRlIDxmY250bC5oPgorICAgICAgIGludCBvcGVuKGNoYXIgKnBhdGgsIGludCBmbGFncywgW2ludCBtb2RlXSk7CisKKyAgSW4gYWRkaXRpb24gdG8gdGhlIG9idmlvdXMgT19SRFdSLCBPX1dST05MWSBhbmQgT19SRE9OTFksIHR3bworICBhZGRpdGlvbmFsIGZsYWdzIGFyZSBhdmFpbGFibGUuICBUaGVzZSBhcmUgT19OT05CTE9DSyBhbmQgT19OT0NUVFkuCisgIE90aGVyIGZsYWdzIGxpc3RlZCBpbiB0aGUgb3BlbigyKSBtYW51YWwgcGFnZSBhcmUgbm90IGFwcGxpY2FibGUgdG8KKyAgc2VyaWFsIGRldmljZXMuCisKKyAgTm9ybWFsbHksIGEgc2VyaWFsIGRldmljZSBvcGVucyBpbiAiYmxvY2tpbmciIG1vZGUuICBUaGlzIG1lYW5zIHRoYXQKKyAgdGhlIG9wZW4oKSB3aWxsIG5vdCByZXR1cm4gdW50aWwgdGhlIENhcnJpZXIgRGV0ZWN0IGxpbmUgZnJvbSB0aGUgcG9ydAorICBpcyBhY3RpdmUsIGUuZy4gbW9kZW0sIGlzIGFjdGl2ZS4gIFdoZW4gb3BlbmVkIHdpdGggdGhlIE9fTk9OQkxPQ0sKKyAgZmxhZyBzZXQsIHRoZSBvcGVuKCkgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCisgIG9mIHRoZSBEQ0QgbGluZS4gIFRoZSAiYmxvY2tpbmciIG1vZGUgYWxzbyBhZmZlY3RzIHRoZSByZWFkKCkgY2FsbC4KKworICBUaGUgZmNudGwoMikgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIE9fTk9OQkxPQ0sgZmxhZyBhbnl0aW1lCisgIGFmdGVyIHRoZSBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLgorCisgIFRoZSBkZXZpY2UgZHJpdmVyIGFuZCB0aGUgZGF0YSBwYXNzaW5nIHRocm91Z2ggaXQgYXJlIGNvbnRyb2xsZWQKKyAgYWNjb3JkaW5nIHRvIHNldHRpbmdzIGluIHRoZSBzdHJ1Y3QgdGVybWlvcy4gIFRoaXMgc3RydWN0dXJlIGlzCisgIGRlZmluZWQgaW4gIi91c3IvaW5jbHVkZS90ZXJtaW9zLmgiLiAgSW4gdGhlIExpbnV4IHRyZWUsIGZ1cnRoZXIKKyAgcmVmZXJlbmNlIGlzIG1hZGUgdG8gIi91c3IvaW5jbHVkZS9hc20vdGVybWJpdHMuaCIuCisgIEluIGJsb2NraW5nIG1vZGUsIGEgcmVhZCgyKSB3aWxsIGJsb2NrIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGEKKyAgc2lnbmFsIGlzIHJlY2VpdmVkLiAgSXQgaXMgc3RpbGwgc3ViamVjdCB0byBzdGF0ZSBvZiB0aGUgSUNBTk9OIGZsYWcuCisKKyAgV2hlbiB0aGUgdGVybWlvcy5jX2xmbGFnIElDQU5PTiBiaXQgaXMgc2V0LCBpbnB1dCBkYXRhIGlzIGNvbGxlY3RlZAorICBpbnRvIHN0cmluZ3MgdW50aWwgYSBOTCwgRU9GIG9yIEVPTCBjaGFyYWN0ZXIgaXMgcmVjZWl2ZWQuICBZb3UgY2FuCisgIGRlZmluZSB0aGVzZSBpbiB0aGUgdGVybWlvcy5jX2NjW10gYXJyYXkuICBBbHNvLCBFUkFTRSBhbmQgS0lMTAorICBjaGFyYWN0ZXJzIHdpbGwgb3BlcmF0ZSBvbiB0aGUgaW5jb21pbmcgZGF0YSBiZWZvcmUgaXQgaXMgZGVsaXZlcmVkIHRvCisgIHRoZSB1c2VyLgorCisgIEluIG5vbi1jYW5vbmljYWwgbW9kZSwgaW5jb21pbmcgZGF0YSBpcyBxdWFudGlmaWVkIGJ5IHVzZSBvZiB0aGUKKyAgY19jY1tWTUlOIGFuZCBjX2NjW1ZUSU1FXSB2YWx1ZXMgaW4gdGVybWlvcy5jX2NjW10uCisKKyAgU29tZSBwcm9ncmFtbWVycyB1c2UgdGhlIHNlbGVjdCgpIGNhbGwgdG8gZGV0ZWN0IHRoZSBjb21wbGV0aW9uIG9mIGEKKyAgcmVhZCgpLiAgVGhpcyBpcyBub3QgdGhlIGJlc3Qgd2F5IG9mIGNoZWNraW5nIGZvciBpbmNvbWluZyBkYXRhLgorICBTZWxlY3QoKSBpcyBwYXJ0IG9mIHRoZSBTT0NLRVRTIHNjaGVtZSBhbmQgdG9vIGNvbXBsZXggZm9yIG1vc3QKKyAgYXBwbGljYXRpb25zLgorCisgIEEgZnVsbCBleHBsYW5hdGlvbiBvZiB0aGUgZmllbGRzIG9mIHRoZSB0ZXJtaW9zIHN0cnVjdHVyZSBpcyBjb250YWluZWQKKyAgaW4gdGVybWlvcyg3KSBvZiB0aGUgVXNlcnMgTWFudWFsLiAgQSB2ZXJzaW9uIGlzIGluY2x1ZGVkIGluIFBhcnQgMiBvZgorICB0aGlzIEhPV1RPIGRvY3VtZW50LgorCisgIDQuICBDb21tYW5kcworCisgIENoYW5nZXMgdG8gdGhlIHN0cnVjdCB0ZXJtaW9zIGFyZSBtYWRlIGJ5IHJldHJpZXZpbmcgdGhlIGN1cnJlbnQKKyAgc2V0dGluZ3MsIG1ha2luZyB0aGUgZGVzaXJlZCBjaGFuZ2VzIGFuZCB0cmFuc21pdHRpbmcgdGhlIG1vZGlmaWVkCisgIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBrZXJuZWwuCisKKyAgVGhlIGhpc3RvcmljIG1lYW5zIG9mIGNvbW11bmljYXRpbmcgd2l0aCB0aGUga2VybmVsIHdhcyBieSB1c2Ugb2YgdGhlCisgIGlvY3RsKGZkLCBDT01NQU5ELCBhcmcpIHN5c3RlbSBjYWxsLiAgVGhlbiB0aGUgcHVyaXN0cyBpbiB0aGUKKyAgY29tcHV0ZXIgaW5kdXN0cnkgZGVjaWRlZCB0aGF0IHRoaXMgd2FzIG5vdCBnZW5ldGljYWxseSBjb25zaXN0ZW50LgorICBUaGVpciBhcmd1bWVudCB3YXMgdGhhdCB0aGUgYXJndW1lbnQgY2hhbmdlZCBpdHMgc3RyaXBlcy4gIFNvbWV0aW1lcworICBpdCB3YXMgYW4gaW50LCBzb21ldGltZXMgaXQgd2FzIGEgcG9pbnRlciB0byBpbnQgYW5kIG90aGVyIHRpbWVzIGl0CisgIHdhcyBhIHBvaW50ZXIgdG8gc3RydWN0IHRlcm1pb3MuICBUaGVuIHRoZXJlIHdlcmUgdGhvc2UgdGltZXMgaXQgd2FzCisgIGVtcHR5IG9yIE5VTEwuICBUaGVzZSB2YXJpYXRpb25zIGFyZSBkZXBlbmRlbnQgdXBvbiB0aGUgQ09NTUFORC4KKworICBBcyBhIGFsdGVybmF0aXZlLCB0aGUgdGMqIHNlcmllcyBvZiBmdW5jdGlvbnMgd2VyZSBjb25jb2N0ZWQuCisKKyAgVGhlc2UgYXJlOgorCisgICAgICAgaW50IHRjZ2V0YXR0cihpbnQgZmlsZWRlcywgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCk7CisgICAgICAgaW50IHRjc2V0YXR0cihpbnQgZmlsZWRlcywgaW50IG9wdGlvbmFsX2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvc19wKTsKKworICBpbnN0ZWFkIG9mOgorCisgICAgICAgaW50IGlvY3RsKGludCBmaWxlZGVzLCBpbnQgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCk7CisKKyAgd2hlcmUgY29tbWFuZCBpcyBUQ0dFVFMgb3Igb25lIG9mIFRDU0VUUywgVENTRVRTVyBvciBUQ1NFVFNGLgorCisgIFRoZSBUQ1NFVFMgY29tbWFuZCBpcyBjb21wYXJhYmxlIHRvIHRoZSBUQ1NBTk9XIG9wdGlvbmFsX2FjdGlvbiBmb3IKKyAgdGhlIHRjKiB2ZXJzaW9uLiAgVGhlc2UgZGlyZWN0IHRoZSBrZXJuZWwgdG8gYWRvcHQgdGhlIGNoYW5nZXMKKyAgaW1tZWRpYXRlbHkuICBPdGhlciBwYWlycyBhcmU6CisKKyAgICBjb21tYW5kICAgb3B0aW9uYWxfYWN0aW9uICAgTWVhbmluZworICAgIFRDU0VUU1cgICBUQ1NBRFJBSU4gICAgICAgICBDaGFuZ2UgYWZ0ZXIgYWxsIG91dHB1dCBoYXMgZHJhaW5lZC4KKyAgICBUQ1NFVFNGICAgVENTQUZMVVNIICAgICAgICAgQ2hhbmdlIGFmdGVyIGFsbCBvdXRwdXQgaGFzIGRyYWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkaXNjYXJkIGFueSBpbnB1dCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZWFkLgorCisgIFNpbmNlIHRoZSByZXR1cm4gY29kZSBmcm9tIGVpdGhlciB0aGUgaW9jdGwoMikgb3IgdGhlIHRjc2V0YXR0cigyKQorICBjb21tYW5kcyBvbmx5IGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2FzIHByb2Nlc3NlZCBieSB0aGUga2VybmVsLgorICBUaGVzZSBkbyBub3QgaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGNoYW5nZXMgd2VyZSBhY3R1YWxseQorICBhY2NvbXBsaXNoZWQuICBFaXRoZXIgb2YgdGhlc2UgY29tbWFuZHMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgY2FsbAorICB0bzoKKworICAgICAgIGlvY3RsKGZkLCBUQ0dFVFMsICZuZXdfdGVybWlvcyk7CisKKyAgb3I6CisKKyAgICAgICB0Y2dldGF0dHIoZmQsICZuZXdfdGVybWlvcyk7CisKKyAgQSB1c2VyIGZ1bmN0aW9uIHdoaWNoIG1ha2VzIGNoYW5nZXMgdG8gdGhlIHRlcm1pb3Mgc3RydWN0dXJlIHNob3VsZAorICBkZWZpbmUgdHdvIHN0cnVjdCB0ZXJtaW9zIHZhcmlhYmxlcy4gIE9uZSBvZiB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkCisgIGNvbnRhaW4gdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbi4gIFRoZSBvdGhlciBzaG91bGQgY29udGFpbiBhIGNvcHkgb2YKKyAgdGhlIGtlcm5lbHMgdmVyc2lvbi4gIFRoZW4gYWZ0ZXIgdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbiBoYXMgYmVlbgorICBzZW50IHRvIHRoZSBrZXJuZWwsIGFub3RoZXIgY2FsbCBzaG91bGQgYmUgbWFkZSB0byByZXRyaWV2ZSB0aGUKKyAga2VybmVscyB2ZXJzaW9uLiAgVGhlbiB0aGUgdHdvIGNvbXBhcmVkLgorCisgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gYWRkIFJUUy9DVFMgZmxvdyBjb250cm9sOgorCisgICAgICAgc3RydWN0IHRlcm1pb3MgbXlfdGVybWlvczsKKyAgICAgICBzdHJ1Y3QgdGVybWlvcyBuZXdfdGVybWlvczsKKworICAgICAgIHRjZ2V0YXR0cihmZCwgJm15X3Rlcm1pb3MpOworICAgICAgIG15X3Rlcm1pb3MuY19mbGFnIHw9IENSVFNDVFM7CisgICAgICAgdGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmbXlfdGVybWlvcyk7CisgICAgICAgdGNnZXRhdHRyKGZkLCAmbmV3X3Rlcm1pb3MpOworICAgICAgIGlmIChtZW1jbXAobXlfdGVybWlvcywgbmV3X3Rlcm1pb3MsCisgICAgICAgICAgICBzaXplb2YobXlfdGVybWlvcykpICE9IDApIHsKKyAgICAgICAgICAgLyogZG8gc29tZSBlcnJvciBoYW5kbGluZyAqLworICAgICAgIH0KKworICA1LiAgQ2hhbmdpbmcgQmF1ZCBSYXRlcworCisgIFdpdGggTGludXgsIHRoZSBiYXVkIHJhdGUgY2FuIGJlIGNoYW5nZWQgdXNpbmcgYSB0ZWNobmlxdWUgc2ltaWxhciB0bworICBhZGQvZGVsZXRlIFJUUy9DVFMuCisKKyAgc3RydWN0IHRlcm1pb3MgbXlfdGVybWlvczsKKyAgc3RydWN0IHRlcm1pb3MgbmV3X3Rlcm1pb3M7CisKKyAgdGNnZXRhdHRyKGZkLCAmbXlfdGVybWlvcyk7CisgIG15X3Rlcm1pb3MuY19mbGFnICY9IH5DQkFVRDsKKyAgbXlfdGVybWlvcy5jX2ZsYWcgfD0gQjE5MjAwOworICB0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZteV90ZXJtaW9zKTsKKyAgdGNnZXRhdHRyKGZkLCAmbmV3X3Rlcm1pb3MpOworICBpZiAobWVtY21wKG15X3Rlcm1pb3MsIG5ld190ZXJtaW9zLAorICAgICAgIHNpemVvZihteV90ZXJtaW9zKSkgIT0gMCkgeworICAgICAgLyogZG8gc29tZSBlcnJvciBoYW5kbGluZyAqLworICB9CisKKyAgUE9TSVggYWRkcyBhbm90aGVyIG1ldGhvZC4gIFRoZXkgZGVmaW5lOgorCisgICAgICAgc3BlZWRfdCBjZmdldGlzcGVlZChjb25zdCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvc19wKTsKKyAgICAgICBzcGVlZF90IGNmZ2V0b3NwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zX3ApOworCisgIGxpYnJhcnkgY2FsbHMgdG8gZXh0cmFjdCB0aGUgY3VycmVudCBpbnB1dCBvciBvdXRwdXQgc3BlZWQgZnJvbSB0aGUKKyAgc3RydWN0IHRlcm1pb3MgcG9pbnRlZCB0byB3aXRoICp0ZXJtaW9fcC4gIFRoaXMgaXMgYSB2YXJpYWJsZSBkZWZpbmVkCisgIGluIHRoZSBjYWxsaW5nIHByb2Nlc3MuICBJbiBwcmFjdGljZSwgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMKKyAgdGVybWlvcywgc2hvdWxkIGJlIG9idGFpbmVkIGJ5IHRoZSB0Y2dldGF0dHIoKSBjYWxsIG9yIGFuIGlvY3RsKCkgY2FsbAorICB1c2luZyB0aGUgVENHRVRTIGNvbW1hbmQuCisKKyAgVGhlIGNvbXBhbmlvbiBsaWJyYXJ5IGNhbGxzIGFyZToKKworICAgICAgIGludCBjZnNldGlzcGVlZChzdHJ1Y3QgdGVybWlvcyAqdGVybWlvc19wLCBzcGVlZF90IHNwZWVkKTsKKyAgICAgICBpbnQgY2ZzZXRvc3BlZWQoc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCwgc3BlZWRfdCBzcGVlZCk7CisKKyAgd2hpY2ggYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYmF1ZCByYXRlIGluIHRoZSBsb2NhbGx5CisgIGRlZmluZWQgKnRlcm1pb3NfcC4gIEZvbGxvd2luZyBlaXRoZXIgb2YgdGhlc2UgY2FsbHMsIGVpdGhlciBhIGNhbGwgdG8KKyAgdGNzZXRhdHRyKCkgb3IgaW9jdGwoKSB3aXRoIG9uZSBvZiBUQ1NFVFMsIFRDU0VUU1cgb3IgVENTRVRTRiBhcyB0aGUKKyAgY29tbWFuZCB0byB0cmFuc21pdCB0aGUgY2hhbmdlIHRvIHRoZSBrZXJuZWwuCisKKyAgVGhlIGNmKiBjb21tYW5kcyBhcmUgcHJlZmVycmVkIGZvciBwb3J0YWJpbGl0eS4gIFNvbWUgd2VpcmQgVW5pY2VzIHVzZQorICBhIGNvbnNpZGVyYWJseSBkaWZmZXJlbnQgZm9ybWF0IG9mIHRlcm1pb3MuCisKKyAgTW9zdCBpbXBsZW1lbnRhdGlvbnMgb2YgTGludXggdXNlIG9ubHkgdGhlIGlucHV0IHNwZWVkIGZvciBib3RoIGlucHV0CisgIGFuZCBvdXRwdXQuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gYnkKKyAgcmVmZXJlbmNlIHRvIDx0ZXJtaW9zLmg+LiAgSW4gcmVhbGl0eSwgdGhleSBhcmUgaW4KKyAgL3Vzci9pbmNsdWRlL2FzbS90ZXJtYml0cy5oLgorCisgIDYuICBBZGRpdGlvbmFsIENvbnRyb2wgQ2FsbHMKKworICA2LjEuICBTZW5kaW5nIGEgImJyZWFrIi4KKworICAgICAgIGludCBpb2N0bChmZCwgVENTQlJLLCBpbnQgYXJnKTsKKyAgICAgICBpbnQgdGNzZW5kYnJlYWsoZmQsIGludCBhcmcpOworCisgIFNlbmQgYSBicmVhazogIEhlcmUgdGhlIGFjdGlvbiBkaWZmZXJzIGJldHdlZW4gdGhlIGNvbnZlbnRpb25hbAorICBpb2N0bCgpIGNhbGwgYW5kIHRoZSBQT1NJWCBjYWxsLiAgRm9yIHRoZSBjb252ZW50aW9uYWwgY2FsbCwgYW4gYXJnIG9mCisgICcwJyBzZXRzIHRoZSBicmVhayBjb250cm9sIGxpbmUgb2YgdGhlIFVBUlQgZm9yIDAuMjUgc2Vjb25kcy4gIEZvciB0aGUKKyAgUE9TSVggY29tbWFuZCwgdGhlIGJyZWFrIGxpbmUgaXMgc2V0IGZvciBhcmcgdGltZXMgMC4xIHNlY29uZHMuCisKKyAgNi4yLiAgSGFyZHdhcmUgZmxvdyBjb250cm9sLgorCisgICAgICAgaW50IGlvY3RsKGZkLCBUQ1hPTkMsIGludCBhY3Rpb24pOworICAgICAgIGludCB0Y2Zsb3coZmQsIGludCBhY3Rpb24pOworCisgIFRoZSBhY3Rpb24gZmxhZ3MgYXJlOgorCisgIG8gIFRDT09GRiAgMCAgc3VzcGVuZCBvdXRwdXQKKworICBvICBUQ09PTiAgIDEgIHJlc3RhcnQgb3V0cHV0CisKKyAgbyAgVENJT0ZGICAyICB0cmFuc21pdCBTVE9QIGNoYXJhY3RlciB0byBzdXNwZW5kIGlucHV0CisKKyAgbyAgVENJT04gICAzICB0cmFuc21pdCBTVEFSVCBjaGFyYWN0ZXIgdG8gcmVzdGFydCBpbnB1dAorCisgIDYuMy4gIEZsdXNoaW5nIEkvTyBidWZmZXJzLgorCisgICAgICAgaW50IGlvY3RsKGZkLCBUQ0ZMU0gsIHF1ZXVlX3NlbGVjdG9yKTsKKyAgICAgICBpbnQgdGNmbHVzaChmZCwgcXVldWVfc2VsZWN0b3IpOworCisgIFRoZSBxdWV1ZV9zZWxlY3RvciBmbGFncyBhcmU6CisKKyAgbyAgVENJRkxVU0ggIDAgIGZsdXNoIGFueSBkYXRhIG5vdCB5ZXQgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKKworICBvICBUQ09GTFVTSCAgMSAgZmx1c2ggYW55IGRhdGEgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGJ1ZmZlciBidXQgbm90CisgICAgIHlldCB0cmFuc21pdHRlZAorCisgIG8gIFRDSU9GTFVTSCAyICBmbHVzaCBib3RoIGJ1ZmZlcnMKKworICA3LiAgTW9kZW0gY29udHJvbAorCisgIFRoZSBoYXJkd2FyZSBtb2RlbSBjb250cm9sIGxpbmVzIGNhbiBiZSBtb25pdG9yZWQgb3IgbW9kaWZpZWQgYnkgdGhlCisgIGlvY3RsKDIpIHN5c3RlbSBjYWxsLiAgQSBzZXQgb2YgY29tcGFyYWJsZSB0YyogY2FsbHMgYXBwYXJlbnRseSBkbyBub3QKKyAgZXhpc3QuICBUaGUgZm9ybSBvZiB0aGlzIGNhbGwgaXM6CisKKyAgICAgICBpbnQgaW9jdGwoZmQsIENPTU1BTkQsIChpbnQgKilmbGFncyk7CisKKyAgVGhlIENPTU1BTkRTIGFuZCB0aGVpciBhY3Rpb24gYXJlOgorCisgIG8gIFRJT0NNQklTICB0dXJuIG9uIGNvbnRyb2wgbGluZXMgZGVwZW5kaW5nIHVwb24gd2hpY2ggYml0cyBhcmUgc2V0CisgICAgIGluIGZsYWdzLgorCisgIG8gIFRJT0NNQklDICB0dXJuIG9mZiBjb250cm9sIGxpbmVzIGRlcGVuZGluZyB1cG9uIHdoaWNoIGJpdHMgYXJlCisgICAgIHVuc2V0IGluIGZsYWdzLgorICBvICBUSU9DTUdFVCAgdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlIHNldCBpbiBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCisgICAgIGN1cnJlbnQgc3RhdHVzCisKKyAgbyAgVElPQ01TRVQgIHRoZSBzdGF0ZSBvZiB0aGUgVUFSVCBpcyBjaGFuZ2VkIGFjY29yZGluZyB0byB3aGljaCBiaXRzCisgICAgIGFyZSBzZXQvdW5zZXQgaW4gJ2ZsYWdzJworCisgICAgIFRoZSBiaXQgcGF0dGVybiBvZiBmbGFncyByZWZlciB0byB0aGUgZm9sbG93aW5nIGNvbnRyb2wgbGluZXM6CisKKyAgbyAgVElPQ01fTEUgICAgICBMaW5lIGVuYWJsZQorCisgIG8gIFRJT0NNX0RUUiAgICAgRGF0YSBUZXJtaW5hbCBSZWFkeQorCisgIG8gIFRJT0NNX1JUUyAgICAgUmVxdWVzdCB0byBzZW5kCisKKyAgbyAgVElPQ01fU1QgICAgICBTZWNvbmRhcnkgdHJhbnNtaXQKKworICBvICBUSU9DTV9TUiAgICAgIFNlY29uZGFyeSByZWNlaXZlCisKKyAgbyAgVElPQ01fQ1RTICAgICBDbGVhciB0byBzZW5kCisKKyAgbyAgVElPQ01fQ0FSICAgICBDYXJyaWVyIGRldGVjdAorCisgIG8gIFRJT0NNX1JORyAgICAgUmluZworCisgIG8gIFRJT0NNX0RTUiAgICAgRGF0YSBzZXQgcmVhZHkKKworICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBzb21lIG9mIHRoZXNlIGJpdHMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIG1vZGVtCisgIGFuZCB0aGUgVUFSVCBjYW5ub3QgY2hhbmdlIHRoZW0gYnV0IHRoZWlyIHN0YXR1cyBjYW4gYmUgc2Vuc2VkIGJ5CisgIFRJT0NNR0VULiAgQWxzbywgbW9zdCBQZXJzb25hbCBDb21wdXRlcnMgZG8gbm90IHByb3ZpZGUgaGFyZHdhcmUgZm9yCisgIHNlY29uZGFyeSB0cmFuc21pdCBhbmQgcmVjZWl2ZS4KKworICBUaGVyZSBhcmUgYWxzbyBhIHBhaXIgb2YgaW9jdGwoKSB0byBtb25pdG9yIHRoZXNlIGxpbmVzLiAgVGhleSBhcmUKKyAgdW5kb2N1bWVudGVkIGFzIGZhciBhcyBJIGhhdmUgbGVhcm5lZC4gIFRoZSBjb21tYW5kcyBhcmUgVElPQ01JV0FJVAorICBhbmQgVENJT0dJQ09VTlQuICBUaGV5IGFsc28gZGlmZmVyIGJldHdlZW4gdmVyc2lvbnMgb2YgdGhlIExpbnV4CisgIGtlcm5lbC4KKworICBTZWUgdGhlIGxpbmVzLmMgZmlsZSBpbiBteSAic2VyaWFsX3N1aXRlIiBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdGhlc2UKKyAgY2FuIGJlIHVzZWQgc2VlICA8ZnRwOi8vc2NpY29tLmFscGhhY2QuY29tL3B1Yi9saW51eC9zZXJpYWxfc3VpdGU+CisKKyAgOC4gIFByb2Nlc3MgR3JvdXBzCisKKyAgOC4xLiAgU2Vzc2lvbnMKKworICA4LjIuICBQcm9jZXNzIEdyb3VwcworCisgIEFueSBuZXdseSBjcmVhdGVkIHByb2Nlc3MgaW5oZXJpdHMgdGhlIFByb2Nlc3MgR3JvdXAgb2YgaXRzIGNyZWF0b3IuCisgIFRoZSBQcm9jZXNzIEdyb3VwIGxlYWRlciBoYXMgdGhlIHNhbWUgUElEIGFzIFBHSUQuCisKKyAgOC4zLiAgQ29udHJvbGxpbmcgVGVybWluYWwKKworICBUaGVyZSBhcmUgYSBzZXJpZXMgb2YgaW9jdGwoMikgYW5kIHRjKigyKSBjYWxscyB3aGljaCBjYW4gYmUgdXNlZCB0bworICBtb25pdG9yIG9yIHRvIGNoYW5nZSB0aGUgcHJvY2VzcyBncm91cCB0byB3aGljaCB0aGUgZGV2aWNlIGlzCisgIGF0dGFjaGVkLgorCisgIDguMy4xLiAgR2V0IHRoZSBmb3JlZ3JvdW5kIGdyb3VwIHByb2Nlc3MgaWQuCisKKyAgSWYgdGhlcmUgaXMgbm8gZm9yZWdyb3VuZCBncm91cCwgYSBudW1iZXIgbm90IHJlcHJlc2VudGluZyBhbiBleGlzdGluZworICBwcm9jZXNzIGdyb3VwIGlzIHJldHVybmVkLiAgT24gZXJyb3IsIGEgLTEgaXMgcmV0dXJuZWQgYW5kIGVycm5vIGlzCisgIHNldC4KKworICAgICAgIGludCBpb2N0bChmZCwgVElPQ0dQR1JQLCAocGlkX3QgKilwaWQpOworICAgICAgIGludCB0Y2dldHBncnAoZmQsIChwaWRfdCAqKXBpZCk7CisKKyAgOC4zLjIuICBTZXQgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBpZCBvZiBhIHRlcm1pbmFsLgorCisgIFRoZSBmZCBtdXN0IGJlIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBhbmQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICBzZXNzaW9uIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisKKyAgICAgICBpbnQgaW9jdGwoZmQsIFRJT0NTUEdSUCwgKHBpZF90ICopcGlkKTsKKyAgICAgICBpbnQgdGNzZXRwZ3JwKGZkLCAocGlkX3QgKilwaWQpOworCisgIDguMy4zLiAgR2V0IHByb2Nlc3MgZ3JvdXAgaWQuCisKKyAgICAgICBpbnQgaW9jdGwoZmQsIFRJT0NHUEdSUCwgJihwaWRfdClwaWQpOworICAgICAgIGludCB0Y2dldHBncnAoZmQsICYocGlkX3QpcGlkKTsKKworICA5LiAgTG9ja2ZpbGVzCisKKyAgQW55IHByb2Nlc3Mgd2hpY2ggYWNjZXNzZXMgYSBzZXJpYWwgZGV2aWNlIHNob3VsZCBmaXJzdCBjaGVjayBmb3IgdGhlCisgIGV4aXN0ZW5jZSBvZiBsb2NrIGZpbGUgZm9yIHRoZSBkZXNpcmVkIGRldmljZS4gIElmIHN1Y2ggYSBsb2NrIGxvY2sKKyAgZmlsZSBleGlzdHMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIG1heSBiZSBpbiB1c2UgYnkgYW5vdGhlcgorICBwcm9jZXNzLgorCisgIENoZWNrIG15ICJsaWJkZXZsb2Nrcy14LngudGd6IiBhdAorICA8ZnRwOi8vc2NpY29tLmFscGhhY2RjLmNvbS9wdWIvbGludXg+IGZvciBhbiBleGFtcGxlIG9mIGhvdyB0aGVzZSBsb2NrCisgIGZpbGVzIHNob3VsZCBiZSB1dGlsaXplZC4KKworICAxMC4gIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24KKworICBDaGVjayBvdXQgbXkgInNlcmlhbF9zdWl0ZS50Z3oiIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHByb2dyYW1taW5nCisgIHRoZSBzZXJpYWwgcG9ydHMgYXQgICA8bWFpbHRvOnZlcm5AemVicmEuYWxwaGFjZGMuY29tPi4gIFRoZXJlIHNvbWUKKyAgZXhhbXBsZXMgYW5kIHNvbWUgYmx1cmJzIGFib3V0IHNldHRpbmcgdXAgbW9kZW1zIGFuZCBjb21tZW50cyBhYm91dAorICBzb21lIGdlbmVyYWwgY29uc2lkZXJhdGlvbnMuCisKKyAgMTEuICBGZWVkYmFjaworCisgIFBsZWFzZSBzZW5kIG1lIGFueSBjb3JyZWN0aW9ucywgcXVlc3Rpb25zLCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIG9yCisgIGFkZGl0aW9uYWwgbWF0ZXJpYWwuIEkgd291bGQgbGlrZSB0byBpbXByb3ZlIHRoaXMgSE9XVE8hICBUZWxsIG1lCisgIGV4YWN0bHkgd2hhdCB5b3UgZG9uJ3QgdW5kZXJzdGFuZCwgb3Igd2hhdCBjb3VsZCBiZSBjbGVhcmVyLiAgWW91IGNhbgorICByZWFjaCBtZSBhdCAgPG1haWx0bzp2ZXJuQHplYnJhLmFscGhhY2RjLmNvbT4gdmlhIGVtYWlsLiAgUGxlYXNlCisgIGluY2x1ZGUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBTZXJpYWwtUHJvZ3JhbW1pbmctSE9XVE8gd2hlbgorICB3cml0aW5nLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZG9jcy9idXN5Ym94X2Zvb3Rlci5wb2QgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2J1c3lib3hfZm9vdGVyLnBvZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ2YzczCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9idXN5Ym94X2Zvb3Rlci5wb2QKQEAgLTAsMCArMSwyODUgQEAKKz1iYWNrCisKKz1oZWFkMSBMSUJDIE5TUworCitHTlUgTGliYyAoZ2xpYmMpIHVzZXMgdGhlIE5hbWUgU2VydmljZSBTd2l0Y2ggKE5TUykgdG8gY29uZmlndXJlIHRoZSBiZWhhdmlvcgorb2YgdGhlIEMgbGlicmFyeSBmb3IgdGhlIGxvY2FsIGVudmlyb25tZW50LCBhbmQgdG8gY29uZmlndXJlIGhvdyBpdCByZWFkcworc3lzdGVtIGRhdGEsIHN1Y2ggYXMgcGFzc3dvcmRzIGFuZCBncm91cCBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgaW1wbGVtZW50ZWQKK3VzaW5nIGFuIC9ldGMvbnNzd2l0Y2guY29uZiBjb25maWd1cmF0aW9uIGZpbGUsIGFuZCB1c2luZyBvbmUgb3IgbW9yZSBvZiB0aGUKKy9saWIvbGlibnNzXyogbGlicmFyaWVzLiAgQnVzeUJveCB0cmllcyB0byBhdm9pZCB1c2luZyBhbnkgbGliYyBjYWxscyB0aGF0IG1ha2UKK3VzZSBvZiBOU1MuICBTb21lIGFwcGxldHMgaG93ZXZlciwgc3VjaCBhcyBsb2dpbiBhbmQgc3UsIHdpbGwgdXNlIGxpYmMgZnVuY3Rpb25zCit0aGF0IHJlcXVpcmUgTlNTLgorCitJZiB5b3UgZW5hYmxlIENPTkZJR19VU0VfQkJfUFdEX0dSUCwgQnVzeUJveCB3aWxsIHVzZSBpbnRlcm5hbCBmdW5jdGlvbnMgdG8KK2RpcmVjdGx5IGFjY2VzcyB0aGUgL2V0Yy9wYXNzd2QsIC9ldGMvZ3JvdXAsIGFuZCAvZXRjL3NoYWRvdyBmaWxlcyB3aXRob3V0Cit1c2luZyBOU1MuICBUaGlzIG1heSBhbGxvdyB5b3UgdG8gcnVuIHlvdXIgc3lzdGVtIHdpdGhvdXQgdGhlIG5lZWQgZm9yCitpbnN0YWxsaW5nIGFueSBvZiB0aGUgTlNTIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIGxpYnJhcmllcy4KKworV2hlbiB1c2VkIHdpdGggZ2xpYmMsIHRoZSBCdXN5Qm94ICduZXR3b3JraW5nJyBhcHBsZXRzIHdpbGwgc2ltaWxhcmx5IHJlcXVpcmUKK3RoYXQgeW91IGluc3RhbGwgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZ2xpYmMgTlNTIHN0dWZmIChpbiBwYXJ0aWN1bGFyLAorL2V0Yy9uc3N3aXRjaC5jb25mLCAvbGliL2xpYm5zc19kbnMqLCAvbGliL2xpYm5zc19maWxlcyosIGFuZCAvbGliL2xpYnJlc29sdiopLgorCitTaGFtZWxlc3MgUGx1ZzogQXMgYW4gYWx0ZXJuYXRpdmUsIG9uZSBjb3VsZCB1c2UgYSBDIGxpYnJhcnkgc3VjaCBhcyB1Q2xpYmMuICBJbgorYWRkaXRpb24gdG8gbWFraW5nIHlvdXIgc3lzdGVtIHNpZ25pZmljYW50bHkgc21hbGxlciwgdUNsaWJjIGRvZXMgbm90IHJlcXVpcmUgdGhlCit1c2Ugb2YgYW55IE5TUyBzdXBwb3J0IGZpbGVzIG9yIGxpYnJhcmllcy4KKworPWhlYWQxIE1BSU5UQUlORVIKKworRGVuaXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKworPWhlYWQxIEFVVEhPUlMKKworVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCBjb2RlIHRvIEJ1c3lCb3ggd2hldGhlciB0aGV5IGtub3cgaXQgb3IKK25vdC4gIElmIHlvdSBoYXZlIHdyaXR0ZW4gY29kZSBpbmNsdWRlZCBpbiBCdXN5Qm94LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGJlCitsaXN0ZWQgaGVyZSBzbyB5b3UgY2FuIG9idGFpbiB5b3VyIGJpdCBvZiBldGVybmFsIGdsb3J5LiAgSWYgeW91IHNob3VsZCBiZQorbGlzdGVkIGhlcmUsIG9yIHRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHlvdSBoYXZlIGRvbmUgbmVlZHMgbW9yZSBkZXRhaWwsIG9yIGlzCitpbmNvcnJlY3QsIHBsZWFzZSBzZW5kIGluIGFuIHVwZGF0ZS4KKworCis9Zm9yIGh0bWwgPGJyPgorCitFbWFudWVsZSBBaW5hIDxlbWFudWVsZS5haW5hQHRpc2NhbGkuaXQ+CisgICAgcnVuLXBhcnRzCisKKz1mb3IgaHRtbCA8YnI+CisKK0VyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKworICAgIFRvbnMgb2YgbmV3IHN0dWZmLCBtYWpvciByZXdyaXRlIG9mIG1vc3Qgb2YgdGhlCisgICAgY29yZSBhcHBzLCB0b25zIG9mIG5ldyBhcHBzIGFzIG5vdGVkIGluIGhlYWRlciBmaWxlcy4KKyAgICBMb3RzIG9mIHRlZGlvdXMgZWZmb3J0IHdyaXRpbmcgdGhlc2UgYm9yaW5nIGRvY3MgdGhhdAorICAgIG5vYm9keSBpcyBnb2luZyB0byBhY3R1YWxseSByZWFkLgorCis9Zm9yIGh0bWwgPGJyPgorCitMYXVyZW5jZSBBbmRlcnNvbiA8bC5kLmFuZGVyc29uQHdhcndpY2suYWMudWs+CisKKyAgICBycG0yY3BpbywgdW56aXAsIGdldF9oZWFkZXJfY3BpbywgcmVhZF9neiBpbnRlcmZhY2UsIHJwbQorCis9Zm9yIGh0bWwgPGJyPgorCitKZWZmIEFuZ2llbHNraSA8amVmZkB0aGVwdHJncm91cC5jb20+CisKKyAgICBmdHBwdXQsIGZ0cGdldAorCis9Zm9yIGh0bWwgPGJyPgorCitFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPgorCisgICAgZXhwciwgaG9zdGlkLCBsb2duYW1lLCB3aG9hbWkKKworPWZvciBodG1sIDxicj4KKworSm9obiBCZXBwdSA8YmVwcHVAY29kZXBvZXQub3JnPgorCisgICAgZHUsIG5zbG9va3VwLCBzb3J0CisKKz1mb3IgaHRtbCA8YnI+CisKK0JyaWFuIENhbmRsZXIgPEIuQ2FuZGxlckBwb2JveC5jb20+CisKKyAgICB0aW55LWxzKGxzKQorCis9Zm9yIGh0bWwgPGJyPgorCitSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKworICAgIGZic2V0LCBwaW5nLCBob3N0bmFtZQorCis9Zm9yIGh0bWwgPGJyPgorCitEYXZlIENpbmVnZSA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgorCisgICAgbW9yZSh2MiksIG1ha2VkZXZzLCBkdXRtcCwgbW9kdWxhcml6YXRpb24sIGF1dG8gbGlua3MgZmlsZSwKKyAgICB2YXJpb3VzIGZpeGVzLCBMaW51eCBSb3V0ZXIgUHJvamVjdCBtYWludGVuYW5jZQorCis9Zm9yIGh0bWwgPGJyPgorCitKb3JkYW4gQ3JvdXNlIDxqb3JkYW5AY29zbWljcGVuZ3Vpbi5uZXQ+CisKKyAgICBpcGNhbGMKKworPWZvciBodG1sIDxicj4KKworTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4KKworICAgIHRmdHAgY2xpZW50IGluc21vZCBwb3dlcnBjIHN1cHBvcnQKKworPWZvciBodG1sIDxicj4KKworTGFycnkgRG9vbGl0dGxlIDxsZG9vbGl0dEByZWN5Y2xlLmxibC5nb3Y+CisKKyAgICBwcmlzdGluZSBzb3VyY2UgZGlyZWN0b3J5IGNvbXBpbGF0aW9uLCBsb3RzIG9mIHBhdGNoZXMgYW5kIGZpeGVzLgorCis9Zm9yIGh0bWwgPGJyPgorCitHbGVubiBFbmdlbCA8Z2xlbm5lQGVuZ2VsLm9yZz4KKworICAgIGh0dHBkCisKKz1mb3IgaHRtbCA8YnI+CisKK0dlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4KKworICAgIFN5c2tsb2dkIChzaW5nbGUgdGhyZWFkZWQgc3lzbG9nZCwgSVBDIENpcmN1bGFyIGJ1ZmZlciBzdXBwb3J0LAorICAgIGxvZ3JlYWQpLCB2YXJpb3VzIGZpeGVzLgorCis9Zm9yIGh0bWwgPGJyPgorCitLYXJsIE0uIEhlZ2Jsb29tIDxrYXJsaGVnQGRlYmlhbi5vcmc+CisKKyAgICBjcF9tdi5jLCB0aGUgdGVzdCBzdWl0ZSwgdmFyaW91cyBmaXhlcyB0byB1dGlsaXR5LmMsICZjLgorCis9Zm9yIGh0bWwgPGJyPgorCitEYW5pZWwgSmFjb2Jvd2l0eiA8ZGFuQGRlYmlhbi5vcmc+CisKKyAgICBta3RlbXAuYworCis9Zm9yIGh0bWwgPGJyPgorCitNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY211LmVkdT4KKworICAgIGRvY3VtZW50YXRpb24sIGJ1Z2ZpeGVzLCB0ZXN0IHN1aXRlCisKKz1mb3IgaHRtbCA8YnI+CisKK1N0ZXBoYW4gTGlueiA8bGluekBsaS1wcm8ubmV0PgorCisgICAgaXBjYWxjLCBSZWQgSGF0IGVxdWl2YWxlbmNlCisKKz1mb3IgaHRtbCA8YnI+CisKK0pvaG4gTG9tYmFyZG8gPGpvaG5AZGVsdGFuZXQuY29tPgorCisgICAgdHIKKworPWZvciBodG1sIDxicj4KKworR2xlbm4gTWNHcmF0aCA8YnVnMUBpaW5ldC5uZXQuYXU+CisKKyAgICBDb21tb24gdW5hcmNoaXZpbmcgY29kZSBhbmQgdW5hcmNoaXZpbmcgYXBwbGV0cywgaWZ1cGRvd24sIGZ0cGdldHB1dCwKKyAgICBuYW1laWYsIHNlZCwgcGF0Y2gsIGZvbGQsIGluc3RhbGwsIHV1ZGVjb2RlLgorICAgIFZhcmlvdXMgYnVnZml4ZXMsIHJldmlldyBhbmQgYXBwbHkgbnVtZXJvdXMgcGF0Y2hlcy4KKworPWZvciBodG1sIDxicj4KKworTWFudWVsIE5vdm9hIElJSSA8bWpuM0Bjb2RlcG9ldC5vcmc+CisKKyAgICBjYXQsIGhlYWQsIG1rZmlmbywgbWtub2QsIHJtZGlyLCBzbGVlcCwgdGVlLCB0dHksIHVuaXEsIHVzbGVlcCwgd2MsIHllcywKKyAgICBtZXNnLCB2Y29uZmlnLCBtYWtlX2RpcmVjdG9yeSwgcGFyc2VfbW9kZSwgZGlybmFtZSwgbW9kZV9zdHJpbmcsCisgICAgZ2V0X2xhc3RfcGF0aF9jb21wb25lbnQsIHNpbXBsaWZ5X3BhdGgsIGFuZCBhIG51bWJlciB0cml2aWFsIGxpYmJiIHJvdXRpbmVzCisKKyAgICBhbHNvIGJ1ZyBmaXhlcywgcGFydGlhbCByZXdyaXRlcywgYW5kIHNpemUgb3B0aW1pemF0aW9ucyBpbgorICAgIGFzaCwgYmFzZW5hbWUsIGNhbCwgY21wLCBjcCwgZGYsIGR1LCBlY2hvLCBlbnYsIGxuLCBsb2duYW1lLCBtZDVzdW0sIG1rZGlyLAorICAgIG12LCByZWFscGF0aCwgcm0sIHNvcnQsIHRhaWwsIHRvdWNoLCB1bmFtZSwgd2F0Y2gsIGFyaXRoLCBodW1hbl9yZWFkYWJsZSwKKyAgICBpbnRlcmZhY2UsIGR1dG1wLCBpZmNvbmZpZywgcm91dGUKKworPWZvciBodG1sIDxicj4KKworVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorCisgICAgY21kZWRpdDsgeGFyZ3MoY3VycmVudCksIGh0dHBkKGN1cnJlbnQpOworICAgIHBvcnRzOiBhc2gsIGNyb25kLCBmZGlzaywgaW5ldGQsIHN0dHksIHRyYWNlcm91dGUsIHRvcDsKKyAgICBsb2NhbGUsIHZhcmlvdXMgZml4ZXMKKyAgICBhbmQgaXJyZWNvbmNpbGFibGUgY3JpdGljIG9mIGV2ZXJ5dGhpbmcgbm90IHBlcmZlY3QuCisKKz1mb3IgaHRtbCA8YnI+CisKK0JydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPgorCisgICAgT3JpZ2luYWwgYXV0aG9yIG9mIEJ1c3lCb3ggaW4gMTk5NSwgMTk5Ni4gU29tZSBvZiBoaXMgY29kZSBjYW4KKyAgICBzdGlsbCBiZSBmb3VuZCBoaWRpbmcgaGVyZSBhbmQgdGhlcmUuLi4KKworPWZvciBodG1sIDxicj4KKworVGltIFJpa2VyIDxUaW1AUmlrZXJzLm9yZz4KKworICAgIGJ1ZyBmaXhlcywgbWVtYmVyIG9mIGZhbiBjbHViCisKKz1mb3IgaHRtbCA8YnI+CisKK0tlbnQgUm9ib3R0aSA8cm9ib3R0aUBtZXRjb25uZWN0LmNvbT4KKworICAgIHJlc2V0LCB0b25zIGFuZCB0b25zIG9mIGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzLgorCis9Zm9yIGh0bWwgPGJyPgorCitDaGlwIFJvc2VudGhhbCA8Y2hpcEB1bmljb20uY29tPiwgPGNyb3NlbnRoQGNvdmFkLmNvbT4KKworICAgIHdnZXQgLSBDb250cmlidXRlZCBieSBwZXJtaXNzaW9uIG9mIENvdmFkIENvbW11bmljYXRpb25zCisKKz1mb3IgaHRtbCA8YnI+CisKK1BhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisKKyAgICBMb3RzIG9mIGJ1Z3MgZml4ZXMgYW5kIHBhdGNoZXMuCisKKz1mb3IgaHRtbCA8YnI+CisKK0d5ZXBpIFNhbSA8Z3llcGlAcHJheGlzLXN3LmNvbT4KKworICAgIFJlbW90ZSBsb2dnaW5nIGZlYXR1cmUgZm9yIHN5c2xvZ2QKKworPWZvciBodG1sIDxicj4KKworTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQHRyYW5zbWV0YS5jb20+CisKKyAgICBta3N3YXAsIGZzY2subWluaXgsIG1rZnMubWluaXgKKworPWZvciBodG1sIDxicj4KKworTWFyayBXaGl0bGV5IDxtYXJrd0Bjb2RlcG9ldC5vcmc+CisKKyAgICBncmVwLCBzZWQsIGN1dCwgeGFyZ3MocHJldmlvdXMpLAorICAgIHN0eWxlLWd1aWRlLCBuZXctYXBwbGV0LUhPV1RPLCBidWcgZml4ZXMsIGV0Yy4KKworPWZvciBodG1sIDxicj4KKworQ2hhcmxlcyBQLiBXcmlnaHQgPGNwd3JpZ2h0QHZpbGxhZ2VuZXQuY29tPgorCisgICAgZ3ppcCwgbWluaS1uZXRjYXQobmMpCisKKz1mb3IgaHRtbCA8YnI+CisKK0VucmlxdWUgWmFuYXJkaSA8ZXphbmFyZGlAdWxsLmVzPgorCisgICAgdGFyY2F0IChzaW5jZSByZW1vdmVkKSwgbG9hZGttYXAsIHZhcmlvdXMgZml4ZXMsIERlYmlhbiBtYWludGVuYW5jZQorCis9Zm9yIGh0bWwgPGJyPgorCitUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisKKyAgICBkZXZmc2QgYW5kIHNpemUgb3B0aW1pemF0aW9ucyBpbiBzdHJpbmdzLCBvcGVudnQgYW5kIGRlYWxsb2N2dC4KKworPWZvciBodG1sIDxicj4KKworUGF1bCBGb3ggPHBnZkBmb3hoYXJwLmJvc3Rvbi5tYS51cz4KKworICAgIHZpIGVkaXRpbmcgbW9kZSBmb3IgYXNoLCB2YXJpb3VzIG90aGVyIHBhdGNoZXMvZml4ZXMKKworPWZvciBodG1sIDxicj4KKworUm9iZXJ0byBBLiBGb2dsaWV0dGEgPG1lQHJvYmVydG8uZm9nbGlldHRhLm5hbWU+CisKKyAgICBwb3J0OiBkbnNkCisKKz1mb3IgaHRtbCA8YnI+CisKK0Jlcm5oYXJkIFJldXRuZXItRmlzY2hlciA8cmVwLmRvdC5ub3BAZ21haWwuY29tPgorCisgICAgbWlzYworCis9Zm9yIGh0bWwgPGJyPgorCitNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+CisKKyAgICBpbml0aWFsIGUyZnNwcm9ncywgcHJpbnRlbnYsIHNldGFyY2gsIHN1bSwgbWlzYworCis9Zm9yIGh0bWwgPGJyPgorCitKaWUgWmhhbmcgPGppZS56aGFuZ0BhbmFsb2cuY29tPgorCisgICAgZml4ZWQgdHdvIGJ1Z3MgaW4gbXNoIGFuZCBodXNoIChleGl0Y29kZSBvZiBraWxsZWQgcHJvY2Vzc2VzKQorCis9Y3V0CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL2J1c3lib3hfaGVhZGVyLnBvZCBiL2J1c3lib3gtMS4xOS4zL2RvY3MvYnVzeWJveF9oZWFkZXIucG9kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTE3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2J1c3lib3hfaGVhZGVyLnBvZApAQCAtMCwwICsxLDgyIEBACisjIHZpOiBzZXQgc3c9NCB0cz00OgorCis9aGVhZDEgTkFNRQorCitCdXN5Qm94IC0gVGhlIFN3aXNzIEFybXkgS25pZmUgb2YgRW1iZWRkZWQgTGludXgKKworPWhlYWQxIFNZTlRBWAorCisgYnVzeWJveCA8YXBwbGV0PiBbYXJndW1lbnRzLi4uXSAgIyBvcgorCisgPGFwcGxldD4gW2FyZ3VtZW50cy4uLl0JICAjIGlmIHN5bWxpbmtlZAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQnVzeUJveCBjb21iaW5lcyB0aW55IHZlcnNpb25zIG9mIG1hbnkgY29tbW9uIFVOSVggdXRpbGl0aWVzIGludG8gYSBzaW5nbGUKK3NtYWxsIGV4ZWN1dGFibGUuIEl0IHByb3ZpZGVzIG1pbmltYWxpc3QgcmVwbGFjZW1lbnRzIGZvciBtb3N0IG9mIHRoZSB1dGlsaXRpZXMKK3lvdSB1c3VhbGx5IGZpbmQgaW4gR05VIGNvcmV1dGlscywgdXRpbC1saW51eCwgZXRjLiBUaGUgdXRpbGl0aWVzIGluIEJ1c3lCb3gKK2dlbmVyYWxseSBoYXZlIGZld2VyIG9wdGlvbnMgdGhhbiB0aGVpciBmdWxsLWZlYXR1cmVkIEdOVSBjb3VzaW5zOyBob3dldmVyLCB0aGUKK29wdGlvbnMgdGhhdCBhcmUgaW5jbHVkZWQgcHJvdmlkZSB0aGUgZXhwZWN0ZWQgZnVuY3Rpb25hbGl0eSBhbmQgYmVoYXZlIHZlcnkKK211Y2ggbGlrZSB0aGVpciBHTlUgY291bnRlcnBhcnRzLgorCitCdXN5Qm94IGhhcyBiZWVuIHdyaXR0ZW4gd2l0aCBzaXplLW9wdGltaXphdGlvbiBhbmQgbGltaXRlZCByZXNvdXJjZXMgaW4gbWluZC4KK0l0IGlzIGFsc28gZXh0cmVtZWx5IG1vZHVsYXIgc28geW91IGNhbiBlYXNpbHkgaW5jbHVkZSBvciBleGNsdWRlIGNvbW1hbmRzIChvcgorZmVhdHVyZXMpIGF0IGNvbXBpbGUgdGltZS4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGN1c3RvbWl6ZSB5b3VyIGVtYmVkZGVkCitzeXN0ZW1zLiBUbyBjcmVhdGUgYSB3b3JraW5nIHN5c3RlbSwganVzdCBhZGQgL2RldiwgL2V0YywgYW5kIGEgTGludXgga2VybmVsLgorQnVzeUJveCBwcm92aWRlcyBhIGZhaXJseSBjb21wbGV0ZSBQT1NJWCBlbnZpcm9ubWVudCBmb3IgYW55IHNtYWxsIG9yIGVtYmVkZGVkCitzeXN0ZW0uCisKK0J1c3lCb3ggaXMgZXh0cmVtZWx5IGNvbmZpZ3VyYWJsZS4gIFRoaXMgYWxsb3dzIHlvdSB0byBpbmNsdWRlIG9ubHkgdGhlCitjb21wb25lbnRzIHlvdSBuZWVkLCB0aGVyZWJ5IHJlZHVjaW5nIGJpbmFyeSBzaXplLiBSdW4gJ21ha2UgY29uZmlnJyBvciAnbWFrZQorbWVudWNvbmZpZycgdG8gc2VsZWN0IHRoZSBmdW5jdGlvbmFsaXR5IHRoYXQgeW91IHdpc2ggdG8gZW5hYmxlLiAgVGhlbiBydW4KKydtYWtlJyB0byBjb21waWxlIEJ1c3lCb3ggdXNpbmcgeW91ciBjb25maWd1cmF0aW9uLgorCitBZnRlciB0aGUgY29tcGlsZSBoYXMgZmluaXNoZWQsIHlvdSBzaG91bGQgdXNlICdtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwKK0J1c3lCb3guIFRoaXMgd2lsbCBpbnN0YWxsIHRoZSAnYmluL2J1c3lib3gnIGJpbmFyeSwgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkKK3NwZWNpZmllZCBieSBDT05GSUdfUFJFRklYLiBDT05GSUdfUFJFRklYIGNhbiBiZSBzZXQgd2hlbiBjb25maWd1cmluZyBCdXN5Qm94LAorb3IgeW91IGNhbiBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGxvY2F0aW9uIGF0IGluc3RhbGwgdGltZSAoaS5lLiwgd2l0aCBhCitjb21tYW5kIGxpbmUgbGlrZSAnbWFrZSBDT05GSUdfUFJFRklYPS90bXAvZm9vIGluc3RhbGwnKS4gSWYgeW91IGVuYWJsZWQKK2FueSBhcHBsZXQgaW5zdGFsbGF0aW9uIHNjaGVtZSAoZWl0aGVyIGFzIHN5bWxpbmtzIG9yIGhhcmRsaW5rcyksIHRoZXNlIHdpbGwKK2Fsc28gYmUgaW5zdGFsbGVkIGluIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IENPTkZJR19QUkVGSVguCisKKz1oZWFkMSBVU0FHRQorCitCdXN5Qm94IGlzIGEgbXVsdGktY2FsbCBiaW5hcnkuICBBIG11bHRpLWNhbGwgYmluYXJ5IGlzIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbQordGhhdCBwZXJmb3JtcyB0aGUgc2FtZSBqb2IgYXMgbW9yZSB0aGFuIG9uZSB1dGlsaXR5IHByb2dyYW0uICBUaGF0IG1lYW5zIHRoZXJlCitpcyBqdXN0IGEgc2luZ2xlIEJ1c3lCb3ggYmluYXJ5LCBidXQgdGhhdCBzaW5nbGUgYmluYXJ5IGFjdHMgbGlrZSBhIGxhcmdlCitudW1iZXIgb2YgdXRpbGl0aWVzLiAgVGhpcyBhbGxvd3MgQnVzeUJveCB0byBiZSBzbWFsbGVyIHNpbmNlIGFsbCB0aGUgYnVpbHQtaW4KK3V0aWxpdHkgcHJvZ3JhbXMgKHdlIGNhbGwgdGhlbSBhcHBsZXRzKSBjYW4gc2hhcmUgY29kZSBmb3IgbWFueSBjb21tb24KK29wZXJhdGlvbnMuCisKK1lvdSBjYW4gYWxzbyBpbnZva2UgQnVzeUJveCBieSBpc3N1aW5nIGEgY29tbWFuZCBhcyBhbiBhcmd1bWVudCBvbiB0aGUKK2NvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLCBlbnRlcmluZworCisJL2Jpbi9idXN5Ym94IGxzCisKK3dpbGwgYWxzbyBjYXVzZSBCdXN5Qm94IHRvIGJlaGF2ZSBhcyAnbHMnLgorCitPZiBjb3Vyc2UsIGFkZGluZyAnL2Jpbi9idXN5Ym94JyBpbnRvIGV2ZXJ5IGNvbW1hbmQgd291bGQgYmUgcGFpbmZ1bC4gIFNvIG1vc3QKK3Blb3BsZSB3aWxsIGludm9rZSBCdXN5Qm94IHVzaW5nIGxpbmtzIHRvIHRoZSBCdXN5Qm94IGJpbmFyeS4KKworRm9yIGV4YW1wbGUsIGVudGVyaW5nCisKKwlsbiAtcyAvYmluL2J1c3lib3ggbHMKKwkuL2xzCisKK3dpbGwgY2F1c2UgQnVzeUJveCB0byBiZWhhdmUgYXMgJ2xzJyAoaWYgdGhlICdscycgY29tbWFuZCBoYXMgYmVlbiBjb21waWxlZAoraW50byBCdXN5Qm94KS4gIEdlbmVyYWxseSBzcGVha2luZywgeW91IHNob3VsZCBuZXZlciBuZWVkIHRvIG1ha2UgYWxsIHRoZXNlCitsaW5rcyB5b3Vyc2VsZiwgYXMgdGhlIEJ1c3lCb3ggYnVpbGQgc3lzdGVtIHdpbGwgZG8gdGhpcyBmb3IgeW91IHdoZW4geW91IHJ1bgordGhlICdtYWtlIGluc3RhbGwnIGNvbW1hbmQuCisKK0lmIHlvdSBpbnZva2UgQnVzeUJveCB3aXRoIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBwcm92aWRlIHlvdSB3aXRoIGEgbGlzdCBvZiB0aGUKK2FwcGxldHMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQgaW50byB5b3VyIEJ1c3lCb3ggYmluYXJ5LgorCis9aGVhZDEgQ09NTU9OIE9QVElPTlMKKworTW9zdCBCdXN5Qm94IGFwcGxldHMgc3VwcG9ydCB0aGUgQjwtLWhlbHA+IGFyZ3VtZW50IHRvIHByb3ZpZGUgYSB0ZXJzZSBydW50aW1lCitkZXNjcmlwdGlvbiBvZiB0aGVpciBiZWhhdmlvci4gIElmIHRoZSBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFIG9wdGlvbiBoYXMKK2JlZW4gZW5hYmxlZCwgbW9yZSBkZXRhaWxlZCB1c2FnZSBpbmZvcm1hdGlvbiB3aWxsIGFsc28gYmUgYXZhaWxhYmxlLgorCis9aGVhZDEgQ09NTUFORFMKKworQ3VycmVudGx5IGF2YWlsYWJsZSBhcHBsZXRzIGluY2x1ZGU6CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL2NnaS9jbC5odG1sIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9jZ2kvY2wuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhmYWFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9jZ2kvY2wuaHRtbApAQCAtMCwwICsxLDQ2IEBACis8aHRtbD48aGVhZD48dGl0bGU+Q0dJIENvbW1hbmQgbGluZSBvcHRpb25zPC90aXRsZT48L2hlYWQ+PGJvZHk+PGgxPjxpbWcgYWx0PSIiIHNyYz0iY2xfZmlsZXMvQ0dJbG9nby5naWYiPiBDR0kgQ29tbWFuZCBsaW5lIG9wdGlvbnM8L2gxPgorPGhyPiA8cD4KKworPC9wPjxoMj5TcGVjaWZpY2F0aW9uPC9oMj4KKworVGhlIGNvbW1hbmQgbGluZSBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2Ugb2YgYW4gSVNJTkRFWCBxdWVyeS4gSXQgaXMKK25vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGFuIEhUTUwgZm9ybSBvciBhbnkgYXMgeWV0IHVuZGVmaW5lZCBxdWVyeQordHlwZS4gVGhlIHNlcnZlciBzaG91bGQgc2VhcmNoIHRoZSBxdWVyeSBpbmZvcm1hdGlvbiAodGhlIDxjb2RlPlFVRVJZX1NUUklORzwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUpIGZvciBhIG5vbi1lbmNvZGVkCis9IGNoYXJhY3RlciB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbW1hbmQgbGluZSBpcyB0byBiZSB1c2VkLCBpZiBpdAorZmluZHMgb25lLCB0aGUgY29tbWFuZCBsaW5lIGlzIG5vdCB0byBiZSB1c2VkLiBUaGlzIHRydXN0cyB0aGUgY2xpZW50cwordG8gZW5jb2RlIHRoZSA9IHNpZ24gaW4gSVNJTkRFWCBxdWVyaWVzLCBhIHByYWN0aWNlIHdoaWNoIHdhcworY29uc2lkZXJlZCBzYWZlIGF0IHRoZSB0aW1lIG9mIHRoZSBkZXNpZ24gb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiA8cD4KKworRm9yIGV4YW1wbGUsIHVzZSB0aGUgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS1iaW4vZmluZ2VyIj5maW5nZXIgc2NyaXB0PC9hPiBhbmQgdGhlIElTSU5ERVggaW50ZXJmYWNlIHRvIGxvb2sgdXAgImh0dHBkIi4gIFlvdSB3aWxsIHNlZSB0aGF0IHRoZSBzY3JpcHQgd2lsbCBjYWxsIGl0c2VsZiB3aXRoIDxjb2RlPi9jZ2ktYmluL2Zpbmdlcj9odHRwZDwvY29kZT4gYW5kIHdpbGwgYWN0dWFsbHkgZXhlY3V0ZSAiZmluZ2VyIGh0dHBkIiBvbiB0aGUgY29tbWFuZCBsaW5lIGFuZCBvdXRwdXQgdGhlIHJlc3VsdHMgdG8geW91LgorPC9wPjxwPgorSWYgdGhlIHNlcnZlciBkb2VzIGZpbmQgYSAiPSIgaW4gdGhlIDxjb2RlPlFVRVJZX1NUUklORzwvY29kZT4sCit0aGVuIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBub3QgYmUgdXNlZCwgYW5kIG5vIGRlY29kaW5nIHdpbGwgYmUKK3BlcmZvcm1lZC4gVGhlIHF1ZXJ5IHRoZW4gcmVtYWlucyBpbnRhY3QgZm9yIHByb2Nlc3NpbmcgYnkgYW4KK2FwcHJvcHJpYXRlIEZPUk0gc3VibWlzc2lvbiBkZWNvZGVyLgorQWdhaW4sIGFzIGFuIGV4YW1wbGUsIHVzZSA8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpLWJpbi9maW5nZXI/aHR0cGQ9bmFtZSI+dGhpcyBoeXBlcmxpbms8L2E+IHRvIHN1Ym1pdCA8Y29kZT4iaHR0cGQ9bmFtZSI8L2NvZGU+IHRvIHRoZSBmaW5nZXIgc2NyaXB0LiAgU2luY2UgdGhpcyA8Y29kZT5RVUVSWV9TVFJJTkc8L2NvZGU+Citjb250YWluZWQgYW4gdW5lbmNvZGVkICI9Iiwgbm90aGluZyB3YXMgZGVjb2RlZCwgdGhlIHNjcmlwdCBkaWRuJ3Qga25vdworaXQgd2FzIGJlaW5nIHN1Ym1pdHRlZCBhIHZhbGlkIHF1ZXJ5LCBhbmQganVzdCBnYXZlIHlvdSB0aGUgZGVmYXVsdAorZmluZ2VyIGZvcm0uCis8L3A+PHA+CitJZiB0aGUgc2VydmVyIGZpbmRzIHRoYXQgaXQgY2Fubm90IHNlbmQgdGhlIHN0cmluZyBkdWUgdG8gaW50ZXJuYWwKK2xpbWl0YXRpb25zIChzdWNoIGFzIGV4ZWMoKSBvciAvYmluL3NoIGNvbW1hbmQgbGluZSByZXN0cmljdGlvbnMpIHRoZQorc2VydmVyIHNob3VsZCBpbmNsdWRlIE5PIGNvbW1hbmQgbGluZSBpbmZvcm1hdGlvbiBhbmQgcHJvdmlkZSB0aGUKK25vbi1kZWNvZGVkIHF1ZXJ5IGluZm9ybWF0aW9uIGluIHRoZSBlbnZpcm9ubWVudAordmFyaWFibGUgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbCNxdWVyeSI+PGNvZGU+UVVFUllfU1RSSU5HPC9jb2RlPjwvYT4uIDwvcD48cD4KKzwvcD48aHI+Cis8aDI+RXhhbXBsZXM8L2gyPgorCitFeGFtcGxlcyBvZiB0aGUgY29tbWFuZCBsaW5lIHVzYWdlIGFyZSBtdWNoIGJldHRlciA8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2V4YW1wbGVzLmh0bWwiPmRlbW9uc3RyYXRlZDwvYT4gdGhhbiBleHBsYWluZWQuIEZvciB0aGVzZQorZXhhbXBsZXMsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIHNjcmlwdCBvdXRwdXQgd2hpY2ggc2F5cyB3aGF0CithcmdjIGFuZCBhcmd2IGFyZS4gPHA+CisKKzwvcD48aHI+CisKKzxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvaW50ZXJmYWNlLmh0bWwiPjxpbWcgYWx0PSJbQmFja10iIHNyYz0iY2xfZmlsZXMvYmFjay5naWYiPlJldHVybiB0byB0aGUKK2ludGVyZmFjZSBzcGVjaWZpY2F0aW9uPC9hPiA8cD4KKworQ0dJIC0gQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlCis8L3A+PGFkZHJlc3M+PGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9tYWlsdG9jZ2kuaHRtbCI+Y2dpQG5jc2EudWl1Yy5lZHU8L2E+PC9hZGRyZXNzPgorCisKKzwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL2NnaS9lbnYuaHRtbCBiL2J1c3lib3gtMS4xOS4zL2RvY3MvY2dpL2Vudi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4M2M3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2NnaS9lbnYuaHRtbApAQCAtMCwwICsxLDE0OSBAQAorPGh0bWw+PGhlYWQ+PHRpdGxlPkNHSSBFbnZpcm9ubWVudCBWYXJpYWJsZXM8L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+PGltZyBhbHQ9IiIgc3JjPSJlbnZfZmlsZXMvQ0dJbG9nby5naWYiPiBDR0kgRW52aXJvbm1lbnQgVmFyaWFibGVzPC9oMT4KKzxocj4KKworPHA+CisKK0luIG9yZGVyIHRvIHBhc3MgZGF0YSBhYm91dCB0aGUgaW5mb3JtYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBzZXJ2ZXIgdG8KK3RoZSBzY3JpcHQsIHRoZSBzZXJ2ZXIgdXNlcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFzIHdlbGwgYXMKK2Vudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgd2hlbiB0aGUKK3NlcnZlciBleGVjdXRlcyB0aGUgZ2F0ZXdheSBwcm9ncmFtLiA8L3A+PHA+CisKKzwvcD48aHI+Cis8aDI+U3BlY2lmaWNhdGlvbjwvaDI+CisKKyA8cD4KK1RoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgcmVxdWVzdC1zcGVjaWZpYyBhbmQgYXJlCitzZXQgZm9yIGFsbCByZXF1ZXN0czogPC9wPjxwPgorCis8L3A+PHVsPgorPGxpPiA8Y29kZT5TRVJWRVJfU09GVFdBUkU8L2NvZGU+IDxwPgorCisgICAgVGhlIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhlIGluZm9ybWF0aW9uIHNlcnZlciBzb2Z0d2FyZSBhbnN3ZXJpbmcKKyAgICB0aGUgcmVxdWVzdCAoYW5kIHJ1bm5pbmcgdGhlIGdhdGV3YXkpLiBGb3JtYXQ6IG5hbWUvdmVyc2lvbiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+U0VSVkVSX05BTUU8L2NvZGU+IDxwPgorICAgIFRoZSBzZXJ2ZXIncyBob3N0bmFtZSwgRE5TIGFsaWFzLCBvciBJUCBhZGRyZXNzIGFzIGl0IHdvdWxkIGFwcGVhcgorICAgIGluIHNlbGYtcmVmZXJlbmNpbmcgVVJMcy4gPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPkdBVEVXQVlfSU5URVJGQUNFPC9jb2RlPiA8cD4KKyAgICBUaGUgcmV2aXNpb24gb2YgdGhlIENHSSBzcGVjaWZpY2F0aW9uIHRvIHdoaWNoIHRoaXMgc2VydmVyCisgICAgY29tcGxpZXMuIEZvcm1hdDogQ0dJL3JldmlzaW9uPC9wPjxwPgorCis8L3A+PC9saT48L3VsPgorCis8aHI+CisKK1RoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpYyB0byB0aGUgcmVxdWVzdCBiZWluZworZnVsZmlsbGVkIGJ5IHRoZSBnYXRld2F5IHByb2dyYW06IDxwPgorCis8L3A+PHVsPgorPGxpPiA8YSBuYW1lPSJwcm90b2NvbCI+PGNvZGU+U0VSVkVSX1BST1RPQ09MPC9jb2RlPjwvYT4gPHA+CisgICAgVGhlIG5hbWUgYW5kIHJldmlzaW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBwcm90Y29sIHRoaXMgcmVxdWVzdCBjYW1lCisgICAgaW4gd2l0aC4gRm9ybWF0OiBwcm90b2NvbC9yZXZpc2lvbiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+U0VSVkVSX1BPUlQ8L2NvZGU+ICA8cD4KKyAgICBUaGUgcG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHNlbnQuIDwvcD48cD4KKworPC9wPjwvbGk+PGxpPiA8Y29kZT5SRVFVRVNUX01FVEhPRDwvY29kZT4gPHA+CisgICAgVGhlIG1ldGhvZCB3aXRoIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBtYWRlLiBGb3IgSFRUUCwgdGhpcyBpcworICAgICJHRVQiLCAiSEVBRCIsICJQT1NUIiwgZXRjLiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+UEFUSF9JTkZPPC9jb2RlPiA8cD4KKyAgICBUaGUgZXh0cmEgcGF0aCBpbmZvcm1hdGlvbiwgYXMgZ2l2ZW4gYnkgdGhlIGNsaWVudC4gSW4gb3RoZXIKKyAgICB3b3Jkcywgc2NyaXB0cyBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlaXIgdmlydHVhbCBwYXRobmFtZSwgZm9sbG93ZWQKKyAgICBieSBleHRyYSBpbmZvcm1hdGlvbiBhdCB0aGUgZW5kIG9mIHRoaXMgcGF0aC4gVGhlIGV4dHJhCisgICAgaW5mb3JtYXRpb24gaXMgc2VudCBhcyBQQVRIX0lORk8uIFRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlCisgICAgZGVjb2RlZCBieSB0aGUgc2VydmVyIGlmIGl0IGNvbWVzIGZyb20gYSBVUkwgYmVmb3JlIGl0IGlzIHBhc3NlZAorICAgIHRvIHRoZSBDR0kgc2NyaXB0LjwvcD48cD4KKworPC9wPjwvbGk+PGxpPiA8Y29kZT5QQVRIX1RSQU5TTEFURUQ8L2NvZGU+IDxwPgorICAgIFRoZSBzZXJ2ZXIgcHJvdmlkZXMgYSB0cmFuc2xhdGVkIHZlcnNpb24gb2YgUEFUSF9JTkZPLCB3aGljaCB0YWtlcworICAgIHRoZSBwYXRoIGFuZCBkb2VzIGFueSB2aXJ0dWFsLXRvLXBoeXNpY2FsIG1hcHBpbmcgdG8gaXQuIDwvcD48cD4KKworPC9wPjwvbGk+PGxpPiA8Y29kZT5TQ1JJUFRfTkFNRTwvY29kZT4gPHA+CisgICAgQSB2aXJ0dWFsIHBhdGggdG8gdGhlIHNjcmlwdCBiZWluZyBleGVjdXRlZCwgdXNlZCBmb3IKKyAgICBzZWxmLXJlZmVyZW5jaW5nIFVSTHMuIDwvcD48cD4KKworPC9wPjwvbGk+PGxpPiA8YSBuYW1lPSJxdWVyeSI+PGNvZGU+UVVFUllfU1RSSU5HPC9jb2RlPjwvYT4gPHA+CisgICAgVGhlIGluZm9ybWF0aW9uIHdoaWNoIGZvbGxvd3MgdGhlID8gaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cubmNzYS51aXVjLmVkdS9kZW1vd2ViL3VybC1wcmltZXIuaHRtbCI+VVJMPC9hPgorICAgIHdoaWNoIHJlZmVyZW5jZWQgdGhpcyBzY3JpcHQuIFRoaXMgaXMgdGhlIHF1ZXJ5IGluZm9ybWF0aW9uLiBJdAorICAgIHNob3VsZCBub3QgYmUgZGVjb2RlZCBpbiBhbnkgZmFzaGlvbi4gVGhpcyB2YXJpYWJsZSBzaG91bGQgYWx3YXlzCisgICAgYmUgc2V0IHdoZW4gdGhlcmUgaXMgcXVlcnkgaW5mb3JtYXRpb24sIHJlZ2FyZGxlc3Mgb2YgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9jbC5odG1sIj5jb21tYW5kIGxpbmUgZGVjb2Rpbmc8L2E+LiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+UkVNT1RFX0hPU1Q8L2NvZGU+IDxwPgorICAgIFRoZSBob3N0bmFtZSBtYWtpbmcgdGhlIHJlcXVlc3QuIElmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSB0aGlzCisgICAgaW5mb3JtYXRpb24sIGl0IHNob3VsZCBzZXQgUkVNT1RFX0FERFIgYW5kIGxlYXZlIHRoaXMgdW5zZXQuPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPlJFTU9URV9BRERSPC9jb2RlPiA8cD4KKyAgICBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGhvc3QgbWFraW5nIHRoZSByZXF1ZXN0LiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+QVVUSF9UWVBFPC9jb2RlPiA8cD4KKyAgICBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIHVzZXIgYXV0aGVudGljYXRpb24sIGFuZCB0aGUgc2NyaXB0IGlzCisgICAgcHJvdGVjdHMsIHRoaXMgaXMgdGhlIHByb3RvY29sLXNwZWNpZmljIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCB1c2VkCisgICAgdG8gdmFsaWRhdGUgdGhlIHVzZXIuIDwvcD48cD4KKworPC9wPjwvbGk+PGxpPiA8Y29kZT5SRU1PVEVfVVNFUjwvY29kZT4gPHA+CisgICAgSWYgdGhlIHNlcnZlciBzdXBwb3J0cyB1c2VyIGF1dGhlbnRpY2F0aW9uLCBhbmQgdGhlIHNjcmlwdCBpcworICAgIHByb3RlY3RlZCwgdGhpcyBpcyB0aGUgdXNlcm5hbWUgdGhleSBoYXZlIGF1dGhlbnRpY2F0ZWQgYXMuIDwvcD48cD4KKzwvcD48L2xpPjxsaT4gPGNvZGU+UkVNT1RFX0lERU5UPC9jb2RlPiA8cD4KKyAgICBJZiB0aGUgSFRUUCBzZXJ2ZXIgc3VwcG9ydHMgUkZDIDkzMSBpZGVudGlmaWNhdGlvbiwgdGhlbiB0aGlzCisgICAgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gdGhlIHJlbW90ZSB1c2VyIG5hbWUgcmV0cmlldmVkIGZyb20gdGhlCisgICAgc2VydmVyLiBVc2FnZSBvZiB0aGlzIHZhcmlhYmxlIHNob3VsZCBiZSBsaW1pdGVkIHRvIGxvZ2dpbmcgb25seS4KKyAgICA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGEgbmFtZT0iY3QiPjxjb2RlPkNPTlRFTlRfVFlQRTwvY29kZT48L2E+IDxwPgorICAgIEZvciBxdWVyaWVzIHdoaWNoIGhhdmUgYXR0YWNoZWQgaW5mb3JtYXRpb24sIHN1Y2ggYXMgSFRUUCBQT1NUIGFuZAorICAgIFBVVCwgdGhpcyBpcyB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBkYXRhLiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGEgbmFtZT0iY2wiPjxjb2RlPkNPTlRFTlRfTEVOR1RIPC9jb2RlPjwvYT4gPHA+CisgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2FpZCBjb250ZW50IGFzIGdpdmVuIGJ5IHRoZSBjbGllbnQuIDwvcD48cD4KKworPC9wPjwvbGk+PC91bD4KKworCis8YSBuYW1lPSJoZWFkZXJzIj48aHI+PC9hPgorCitJbiBhZGRpdGlvbiB0byB0aGVzZSwgdGhlIGhlYWRlciBsaW5lcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQsIGlmCithbnksIGFyZSBwbGFjZWQgaW50byB0aGUgZW52aXJvbm1lbnQgd2l0aCB0aGUgcHJlZml4IEhUVFBfIGZvbGxvd2VkIGJ5Cit0aGUgaGVhZGVyIG5hbWUuIEFueSAtIGNoYXJhY3RlcnMgaW4gdGhlIGhlYWRlciBuYW1lIGFyZSBjaGFuZ2VkIHRvIF8KK2NoYXJhY3RlcnMuIFRoZSBzZXJ2ZXIgbWF5IGV4Y2x1ZGUgYW55IGhlYWRlcnMgd2hpY2ggaXQgaGFzIGFscmVhZHkKK3Byb2Nlc3NlZCwgc3VjaCBhcyBBdXRob3JpemF0aW9uLCBDb250ZW50LXR5cGUsIGFuZCBDb250ZW50LWxlbmd0aC4gSWYKK25lY2Vzc2FyeSwgdGhlIHNlcnZlciBtYXkgY2hvb3NlIHRvIGV4Y2x1ZGUgYW55IG9yIGFsbCBvZiB0aGVzZQoraGVhZGVycyBpZiBpbmNsdWRpbmcgdGhlbSB3b3VsZCBleGNlZWQgYW55IHN5c3RlbSBlbnZpcm9ubWVudAorbGltaXRzLiA8cD4KKworQW4gZXhhbXBsZSBvZiB0aGlzIGlzIHRoZSBIVFRQX0FDQ0VQVCB2YXJpYWJsZSB3aGljaCB3YXMgZGVmaW5lZCBpbgorQ0dJLzEuMC4gQW5vdGhlciBleGFtcGxlIGlzIHRoZSBoZWFkZXIgVXNlci1BZ2VudC48L3A+PHA+CisKKzwvcD48dWw+Cis8bGk+IDxjb2RlPkhUVFBfQUNDRVBUPC9jb2RlPiA8cD4KKyAgICBUaGUgTUlNRSB0eXBlcyB3aGljaCB0aGUgY2xpZW50IHdpbGwgYWNjZXB0LCBhcyBnaXZlbiBieSBIVFRQCisgICAgaGVhZGVycy4gT3RoZXIgcHJvdG9jb2xzIG1heSBuZWVkIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20KKyAgICBlbHNld2hlcmUuIEVhY2ggaXRlbSBpbiB0aGlzIGxpc3Qgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYXMgYXMKKyAgICBwZXIgdGhlIEhUVFAgc3BlYy4gPC9wPjxwPgorCisgICAgRm9ybWF0OiB0eXBlL3N1YnR5cGUsIHR5cGUvc3VidHlwZSA8L3A+PHA+CisKKworPC9wPjwvbGk+PGxpPiA8Y29kZT5IVFRQX1VTRVJfQUdFTlQ8L2NvZGU+PHA+CisKKyAgICBUaGUgYnJvd3NlciB0aGUgY2xpZW50IGlzIHVzaW5nIHRvIHNlbmQgdGhlIHJlcXVlc3QuIEdlbmVyYWwKK2Zvcm1hdDogPGNvZGU+c29mdHdhcmUvdmVyc2lvbiBsaWJyYXJ5L3ZlcnNpb248L2NvZGU+LjwvcD48cD4KKworPC9wPjwvbGk+PC91bD4KKworPGhyPgorPGgyPkV4YW1wbGVzPC9oMj4KKworRXhhbXBsZXMgb2YgdGhlIHNldHRpbmcgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSByZWFsbHkgbXVjaCBiZXR0ZXIKKzxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZXhhbXBsZXMuaHRtbCI+ZGVtb25zdHJhdGVkPC9hPiB0aGFuIGV4cGxhaW5lZC4gPHA+CisKKzwvcD48aHI+CisKKzxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvaW50ZXJmYWNlLmh0bWwiPjxpbWcgYWx0PSJbQmFja10iIHNyYz0iZW52X2ZpbGVzL2JhY2suZ2lmIj5SZXR1cm4gdG8gdGhlCitpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbjwvYT4gPHA+CisKK0NHSSAtIENvbW1vbiBHYXRld2F5IEludGVyZmFjZQorPC9wPjxhZGRyZXNzPjxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvbWFpbHRvY2dpLmh0bWwiPmNnaUBuY3NhLnVpdWMuZWR1PC9hPjwvYWRkcmVzcz4KKworPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RvY3MvY2dpL2luLmh0bWwgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2NnaS9pbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTVmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2NnaS9pbi5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzxodG1sPjxoZWFkPjx0aXRsZT5DR0kgU2NyaXB0IGlucHV0PC90aXRsZT48L2hlYWQ+PGJvZHk+PGgxPjxpbWcgYWx0PSIiIHNyYz0iaW5fZmlsZXMvQ0dJbG9nby5naWYiPiBDR0kgU2NyaXB0IElucHV0PC9oMT4KKzxocj4KKworPGgyPlNwZWNpZmljYXRpb248L2gyPgorCitGb3IgcmVxdWVzdHMgd2hpY2ggaGF2ZSBpbmZvcm1hdGlvbiBhdHRhY2hlZCBhZnRlciB0aGUgaGVhZGVyLCBzdWNoIGFzCitIVFRQIFBPU1Qgb3IgUFVULCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBzZW50IHRvIHRoZSBzY3JpcHQgb24gc3RkaW4uCis8cD4KKworVGhlIHNlcnZlciB3aWxsIHNlbmQgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbCNjbCI+Q09OVEVOVF9MRU5HVEg8L2E+IGJ5dGVzIG9uCit0aGlzIGZpbGUgZGVzY3JpcHRvci4gUmVtZW1iZXIgdGhhdCBpdCB3aWxsIGdpdmUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZW52Lmh0bWwjY3QiPkNPTlRFTlRfVFlQRTwvYT4gb2YgdGhlIGRhdGEgYXMgd2VsbC4gVGhlIHNlcnZlciBpcworaW4gbm8gd2F5IG9ibGlnYXRlZCB0byBzZW5kIGVuZC1vZi1maWxlIGFmdGVyIHRoZSBzY3JpcHQgcmVhZHMKKzxjb2RlPkNPTlRFTlRfTEVOR1RIPC9jb2RlPiBieXRlcy4gPC9wPjxwPgorPC9wPjxocj4KKzxoMj5FeGFtcGxlPC9oMj4KKworTGV0J3MgdGFrZSBhIGZvcm0gd2l0aCBNRVRIT0Q9IlBPU1QiIGFzIGFuIGV4YW1wbGUuIExldCdzIHNheSB0aGUgZm9ybQorcmVzdWx0cyBhcmUgNyBieXRlcyBlbmNvZGVkLCBhbmQgbG9vayBsaWtlIDxjb2RlPmE9YiZhbXA7Yj1jPC9jb2RlPi4KKzxwPgorCitJbiB0aGlzIGNhc2UsIHRoZSBzZXJ2ZXIgd2lsbCBzZXQgQ09OVEVOVF9MRU5HVEggdG8gNyBhbmQgQ09OVEVOVF9UWVBFCit0byBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQuIFRoZSBmaXJzdCBieXRlIG9uIHRoZSBzY3JpcHQncworc3RhbmRhcmQgaW5wdXQgd2lsbCBiZSAiYSIsIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBlbmNvZGVkIHN0cmluZy48L3A+PHA+CisKKzwvcD48aHI+CisKKzxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvaW50ZXJmYWNlLmh0bWwiPjxpbWcgYWx0PSJbQmFja10iIHNyYz0iaW5fZmlsZXMvYmFjay5naWYiPlJldHVybiB0byB0aGUKK2ludGVyZmFjZSBzcGVjaWZpY2F0aW9uPC9hPiA8cD4KKworQ0dJIC0gQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlCis8L3A+PGFkZHJlc3M+PGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9tYWlsdG9jZ2kuaHRtbCI+Y2dpQG5jc2EudWl1Yy5lZHU8L2E+PC9hZGRyZXNzPgorCis8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZG9jcy9jZ2kvaW50ZXJmYWNlLmh0bWwgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2NnaS9pbnRlcmZhY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmUwMTZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9jZ2kvaW50ZXJmYWNlLmh0bWwKQEAgLTAsMCArMSwyOSBAQAorPGh0bWw+PGhlYWQ+PHRpdGxlPlRoZSBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbgorW2h0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvaW50ZXJmYWNlLmh0bWxdCis8L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+PGltZyBhbHQ9IiIgc3JjPSJpbnRlcmZhY2VfZmlsZXMvQ0dJbG9nby5naWYiPiBUaGUgQ0dJIFNwZWNpZmljYXRpb248L2gxPgorCis8aHI+CisKK1RoaXMgaXMgdGhlIHNwZWNpZmljYXRpb24gZm9yIENHSSB2ZXJzaW9uIDEuMSwgb3IgQ0dJLzEuMS4gRnVydGhlcgorcmV2aXNpb25zIG9mIHRoaXMgcHJvdG9jb2wgYXJlIGd1YXJhbnRlZWQgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZS4KKzxwPgorCitUaGUgc2VydmVyIGFuZCB0aGUgQ0dJIHNjcmlwdCBjb21tdW5pY2F0ZSBpbiBmb3VyIG1ham9yIHdheXMuIEVhY2ggb2YKK3RoZSBmb2xsb3dpbmcgaXMgYSBob3RsaW5rIHRvIGdyYXBoaWMgZGV0YWlsLjwvcD48cD4KKworPC9wPjx1bD4KKzxsaT4gPGEgaHJlZj0iZW52Lmh0bWwiPkVudmlyb25tZW50IHZhcmlhYmxlczwvYT4KKzwvbGk+PGxpPiA8YSBocmVmPSJjbC5odG1sIj5UaGUgY29tbWFuZCBsaW5lPC9hPgorPC9saT48bGk+IDxhIGhyZWY9ImluLmh0bWwiPlN0YW5kYXJkIGlucHV0PC9hPgorPC9saT48bGk+IDxhIGhyZWY9Im91dC5odG1sIj5TdGFuZGFyZCBvdXRwdXQ8L2E+Cis8L2xpPjwvdWw+Cis8aHI+CisKKworPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9vdmVydmlldy5odG1sIj48aW1nIGFsdD0iW0JhY2tdIiBzcmM9ImludGVyZmFjZV9maWxlcy9iYWNrLmdpZiI+UmV0dXJuIHRvIHRoZSBvdmVydmlldzwvYT4gPHA+CisKKworCitDR0kgLSBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UKKzwvcD48YWRkcmVzcz48YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL21haWx0b2NnaS5odG1sIj5jZ2lAbmNzYS51aXVjLmVkdTwvYT48L2FkZHJlc3M+Cis8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZG9jcy9jZ2kvb3V0Lmh0bWwgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2NnaS9vdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjY2OTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9jZ2kvb3V0Lmh0bWwKQEAgLTAsMCArMSwxMjYgQEAKKzxodG1sPjxoZWFkPjx0aXRsZT5DR0kgU2NyaXB0IG91dHB1dDwvdGl0bGU+PC9oZWFkPjxib2R5PjxoMT48aW1nIGFsdD0iIiBzcmM9Im91dF9maWxlcy9DR0lsb2dvLmdpZiI+IENHSSBTY3JpcHQgT3V0cHV0PC9oMT4KKzxocj4KKworPGgyPlNjcmlwdCBvdXRwdXQ8L2gyPgorCitUaGUgc2NyaXB0IHNlbmRzIGl0cyBvdXRwdXQgdG8gc3Rkb3V0LiBUaGlzIG91dHB1dCBjYW4gZWl0aGVyIGJlIGEKK2RvY3VtZW50IGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0LCBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIHNlcnZlciBmb3IKK3JldHJpZXZpbmcgdGhlIGRlc2lyZWQgb3V0cHV0LiA8cD4KKzwvcD48aHI+CisKKzxoMj5TY3JpcHQgbmFtaW5nIGNvbnZlbnRpb25zPC9oMj4KKworTm9ybWFsbHksIHNjcmlwdHMgcHJvZHVjZSBvdXRwdXQgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYW5kIHNlbnQgYmFjayB0bwordGhlIGNsaWVudC4gQW4gYWR2YW50YWdlIG9mIHRoaXMgaXMgdGhhdCB0aGUgc2NyaXB0cyBkbyBub3QgbmVlZCB0bworc2VuZCBhIGZ1bGwgSFRUUC8xLjAgaGVhZGVyIGZvciBldmVyeSByZXF1ZXN0LiAgPHA+Cis8YSBuYW1lPSJucGgiPgorU29tZSBzY3JpcHRzIG1heSB3YW50IHRvIGF2b2lkIHRoZSBleHRyYSBvdmVyaGVhZCBvZiB0aGUgc2VydmVyCitwYXJzaW5nIHRoZWlyIG91dHB1dCwgYW5kIHRhbGsgZGlyZWN0bHkgdG8gdGhlIGNsaWVudC4gSW4gb3JkZXIgdG8KK2Rpc3Rpbmd1aXNoIHRoZXNlIHNjcmlwdHMgZnJvbSB0aGUgb3RoZXIgc2NyaXB0cywgQ0dJIHJlcXVpcmVzIHRoYXQKK3RoZSBzY3JpcHQgbmFtZSBiZWdpbnMgd2l0aCBucGgtIGlmIGEgc2NyaXB0IGRvZXMgbm90IHdhbnQgdGhlIHNlcnZlcgordG8gcGFyc2UgaXRzIGhlYWRlci4gSW4gdGhpcyBjYXNlLCBpdCBpcyB0aGUgc2NyaXB0J3MgcmVzcG9uc2liaWxpdHkKK3RvIHJldHVybiBhIHZhbGlkIEhUVFAvMS4wIChvciBIVFRQLzAuOSkgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4gIDwvYT48L3A+PHA+CisKKzwvcD48aHI+Cis8aDI+PGEgbmFtZT0ibnBoIj5QYXJzZWQgaGVhZGVyczwvYT48L2gyPgorCis8YSBuYW1lPSJucGgiPlRoZSBvdXRwdXQgb2Ygc2NyaXB0cyBiZWdpbnMgd2l0aCBhIHNtYWxsIGhlYWRlci4gVGhpcyBoZWFkZXIgY29uc2lzdHMKK29mIHRleHQgbGluZXMsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBhbiA8L2E+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvaHlwZXJ0ZXh0L1dXVy9Qcm90b2NvbHMvSFRUUC9PYmplY3RfSGVhZGVycy5odG1sIj4KK0hUVFAgaGVhZGVyPC9hPiwgdGVybWluYXRlZCBieSBhIGJsYW5rIGxpbmUgKGEgbGluZSB3aXRoIG9ubHkgYQorbGluZWZlZWQgb3IgQ1IvTEYpLiA8cD4KKworQW55IGhlYWRlcnMgd2hpY2ggYXJlIG5vdCBzZXJ2ZXIgZGlyZWN0aXZlcyBhcmUgc2VudCBkaXJlY3RseSBiYWNrIHRvCit0aGUgY2xpZW50LiBDdXJyZW50bHksIHRoaXMgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRocmVlIHNlcnZlcgorZGlyZWN0aXZlczo8L3A+PHA+CisKKzwvcD48dWw+Cis8bGk+IDxjb2RlPkNvbnRlbnQtdHlwZTwvY29kZT4gPHA+CisKKyAgICBUaGlzIGlzIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGRvY3VtZW50IHlvdSBhcmUgcmV0dXJuaW5nLiAgPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPkxvY2F0aW9uPC9jb2RlPiA8cD4KKworICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRvIHRoZSBzZXJ2ZXIgdGhhdCB5b3UgYXJlIHJldHVybmluZyBhCisgICAgcmVmZXJlbmNlIHRvIGEgZG9jdW1lbnQgcmF0aGVyIHRoYW4gYW4gYWN0dWFsIGRvY3VtZW50LiA8L3A+PHA+CisKKyAgICBJZiB0aGUgYXJndW1lbnQgdG8gdGhpcyBpcyBhIFVSTCwgdGhlIHNlcnZlciB3aWxsIGlzc3VlIGEgcmVkaXJlY3QKKyAgICB0byB0aGUgY2xpZW50LiA8L3A+PHA+CisKKyAgICBJZiB0aGUgYXJndW1lbnQgdG8gdGhpcyBpcyBhIHZpcnR1YWwgcGF0aCwgdGhlIHNlcnZlciB3aWxsCisgICAgcmV0cmlldmUgdGhlIGRvY3VtZW50IHNwZWNpZmllZCBhcyBpZiB0aGUgY2xpZW50IGhhZCByZXF1ZXN0ZWQKKyAgICB0aGF0IGRvY3VtZW50IG9yaWdpbmFsbHkuID8gZGlyZWN0aXZlcyB3aWxsIHdvcmsgaW4gaGVyZSwgYnV0ICMKKyAgICBkaXJlY3RpdmVzIG11c3QgYmUgcmVkaXJlY3RlZCBiYWNrIHRvIHRoZSBjbGllbnQuPC9wPjxwPgorCisKKzwvcD48L2xpPjxsaT4gPGEgbmFtZT0ic3RhdHVzIj48Y29kZT5TdGF0dXM8L2NvZGU+PC9hPjxwPgorCisgICAgVGhpcyBpcyB1c2VkIHRvIGdpdmUgdGhlIHNlcnZlciBhbiBIVFRQLzEuMCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9oeXBlcnRleHQvV1dXL1Byb3RvY29scy9IVFRQL0hUUkVTUC5odG1sIj5zdGF0dXMKK2xpbmU8L2E+IHRvIHNlbmQgdG8gdGhlIGNsaWVudC4gVGhlIGZvcm1hdCBpcyA8Y29kZT5ubm4geHh4eHg8L2NvZGU+LAord2hlcmUgPGNvZGU+bm5uPC9jb2RlPiBpcyB0aGUgMy1kaWdpdCBzdGF0dXMgY29kZSwgYW5kCis8Y29kZT54eHh4eDwvY29kZT4gaXMgdGhlIHJlYXNvbiBzdHJpbmcsIHN1Y2ggYXMgIkZvcmJpZGRlbiIuPC9wPjxwPgorCis8L3A+PC9saT48L3VsPgorCis8aHI+Cis8aDI+RXhhbXBsZXM8L2gyPgorCitMZXQncyBzYXkgSSBoYXZlIGEgZnJvbWdyYXR6IHRvIEhUTUwgY29udmVydGVyLiBXaGVuIG15IGNvbnZlcnRlciBpcworZmluaXNoZWQgd2l0aCBpdHMgd29yaywgaXQgd2lsbCBvdXRwdXQgdGhlIGZvbGxvd2luZyBvbiBzdGRvdXQgKG5vdGUKK3RoYXQgdGhlIGxpbmVzIGJlZ2lubmluZyBhbmQgZW5kaW5nIHdpdGggLS0tIGFyZSBqdXN0IGZvciBpbGx1c3RyYXRpb24KK2FuZCB3b3VsZCBub3QgYmUgb3V0cHV0KTogPHA+CisKKzwvcD48cHJlPi0tLSBzdGFydCBvZiBvdXRwdXQgLS0tCitDb250ZW50LXR5cGU6IHRleHQvaHRtbAorCistLS0gZW5kIG9mIG91dHB1dCAtLS0KKzwvcHJlPgorCitOb3RlIHRoZSBibGFuayBsaW5lIGFmdGVyIENvbnRlbnQtdHlwZS4gPHA+CisKK05vdywgbGV0J3Mgc2F5IEkgaGF2ZSBhIHNjcmlwdCB3aGljaCwgaW4gY2VydGFpbiBpbnN0YW5jZXMsIHdhbnRzIHRvCityZXR1cm4gdGhlIGRvY3VtZW50IDxjb2RlPi9wYXRoL2RvYy50eHQ8L2NvZGU+IGZyb20gdGhpcyBzZXJ2ZXIganVzdAorYXMgaWYgdGhlIHVzZXIgaGFkIGFjdHVhbGx5IHJlcXVlc3RlZAorPGNvZGU+aHR0cDovL3NlcnZlcjpwb3J0L3BhdGgvZG9jLnR4dDwvY29kZT4gdG8gYmVnaW4gd2l0aC4gSW4gdGhpcworY2FzZSwgdGhlIHNjcmlwdCB3b3VsZCBvdXRwdXQ6IDwvcD48cD4KKzwvcD48cHJlPi0tLSBzdGFydCBvZiBvdXRwdXQgLS0tCitMb2NhdGlvbjogL3BhdGgvZG9jLnR4dAorCistLS0gZW5kIG9mIG91dHB1dCAtLS0KKzwvcHJlPgorCitUaGUgc2VydmVyIHdvdWxkIHRoZW4gcGVyZm9ybSB0aGUgcmVxdWVzdCBhbmQgc2VuZCBpdCB0byB0aGUgY2xpZW50LgorPHA+CisKK0xldCdzIHNheSB0aGF0IEkgaGF2ZSBhIHNjcmlwdCB3aGljaCB3YW50cyB0byByZWZlcmVuY2Ugb3VyIGdvcGhlcgorc2VydmVyLiBJbiB0aGlzIGNhc2UsIGlmIHRoZSBzY3JpcHQgd2FudGVkIHRvIHJlZmVyIHRoZSB1c2VyIHRvCis8Y29kZT5nb3BoZXI6Ly9nb3BoZXIubmNzYS51aXVjLmVkdS88L2NvZGU+LCBpdCB3b3VsZCBvdXRwdXQ6IDwvcD48cD4KKworPC9wPjxwcmU+LS0tIHN0YXJ0IG9mIG91dHB1dCAtLS0KK0xvY2F0aW9uOiBnb3BoZXI6Ly9nb3BoZXIubmNzYS51aXVjLmVkdS8KKworLS0tIGVuZCBvZiBvdXRwdXQgLS0tCis8L3ByZT4KKworRmluYWxseSwgSSBoYXZlIGEgc2NyaXB0IHdoaWNoIHdhbnRzIHRvIHRhbGsgdG8gdGhlIGNsaWVudCBkaXJlY3RseS4KK0luIHRoaXMgY2FzZSwgaWYgdGhlIHNjcmlwdCBpcyByZWZlcmVuY2VkIHdpdGggPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbCNwcm90b2NvbCI+PGNvZGU+U0VSVkVSX1BST1RPQ09MPC9jb2RlPjwvYT4gb2YgSFRUUC8xLjAsCit0aGUgc2NyaXB0IHdvdWxkIG91dHB1dCB0aGUgZm9sbG93aW5nIEhUVFAvMS4wIHJlc3BvbnNlOiA8cD4KKworPC9wPjxwcmU+LS0tIHN0YXJ0IG9mIG91dHB1dCAtLS0KK0hUVFAvMS4wIDIwMCBPSworU2VydmVyOiBOQ1NBLzEuMGE2CitDb250ZW50LXR5cGU6IHRleHQvcGxhaW4KKworVGhpcyBpcyBhIHBsYWludGV4dCBkb2N1bWVudCBnZW5lcmF0ZWQgb24gdGhlIGZseSBqdXN0IGZvciB5b3UuCisKKy0tLSBlbmQgb2Ygb3V0cHV0IC0tLQorPC9wcmU+CisKKworPGhyPgorCis8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2ludGVyZmFjZS5odG1sIj48aW1nIGFsdD0iW0JhY2tdIiBzcmM9Im91dF9maWxlcy9iYWNrLmdpZiI+UmV0dXJuIHRvIHRoZQoraW50ZXJmYWNlIHNwZWNpZmljYXRpb248L2E+IDxwPgorCitDR0kgLSBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UKKzwvcD48YWRkcmVzcz48YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL21haWx0b2NnaS5odG1sIj5jZ2lAbmNzYS51aXVjLmVkdTwvYT48L2FkZHJlc3M+Cis8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZG9jcy9jb250cmlidXRpbmcudHh0IGIvYnVzeWJveC0xLjE5LjMvZG9jcy9jb250cmlidXRpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjg5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2NvbnRyaWJ1dGluZy50eHQKQEAgLTAsMCArMSw0MzkgQEAKK0NvbnRyaWJ1dGluZyBUbyBCdXN5Ym94Cis9PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIGNvbnRyaWJ1dGUgdG8gQnVzeWJveCwgd2hlcmUKK3lvdSBjYW4gaGVscCwgZ3VpZGVsaW5lcyBvbiB0ZXN0aW5nLCBhbmQgaG93IHRvIHN1Ym1pdCBhIHdlbGwtZm9ybWVkIHBhdGNoCit0aGF0IGlzIG1vcmUgbGlrZWx5IHRvIGJlIGFjY2VwdGVkLgorCitUaGUgQnVzeWJveCBob21lIHBhZ2UgaXMgYXQ6IGh0dHA6Ly9idXN5Ym94Lm5ldC8KKworCisKK1ByZS1Db250cmlidXRpb24gQ2hlY2tsaXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyB5b3Ugd2FudCB0byBjb250cmlidXRlIHRvIEJ1c3lib3gsIGVoPyBHcmVhdCwgd29uZGVyZnVsLCBnbGFkIHlvdSB3YW50IHRvCitoZWxwLiBIb3dldmVyLCBiZWZvcmUgeW91IGRpdmUgaW4sIGhlYWRsb25nIGFuZCBob3Rmb290LCB0aGVyZSBhcmUgc29tZSB0aGluZ3MKK3lvdSBuZWVkIHRvIGRvOgorCisKK0NoZWNrb3V0IHRoZSBMYXRlc3QgQ29kZQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoaXMgaXMgYSBuZWNlc3NhcnkgZmlyc3Qgc3RlcC4gUGxlYXNlIGRvIG5vdCB0cnkgdG8gd29yayB3aXRoIHRoZSBsYXN0CityZWxlYXNlZCB2ZXJzaW9uLCBhcyB0aGVyZSBpcyBhIGdvb2QgY2hhbmNlIHRoYXQgc29tZWJvZHkgaGFzIGFscmVhZHkgZml4ZWQKK3RoZSBidWcgeW91IGZvdW5kLiBTb21lYm9keSBtaWdodCBoYXZlIGV2ZW4gYWRkZWQgdGhlIGZlYXR1cmUgeW91IGhhZCBpbiBtaW5kLgorRG9uJ3QgbWFrZSB5b3VyIHdvcmsgb2Jzb2xldGUgYmVmb3JlIHlvdSBzdGFydCEKKworRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjaGVjayBvdXQgQnVzeWJveCBkZXZlbG9wbWVudCB0cmVlLCBwbGVhc2UgbG9vayBhdCB0aGUKK2ZvbGxvd2luZyBsaW5rczoKKworCWh0dHA6Ly9idXN5Ym94Lm5ldC9zb3VyY2UuaHRtbAorCisKK1JlYWQgdGhlIE1haWxpbmcgTGlzdAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK05vIG9uZSBpcyByZXF1aXJlZCB0byByZWFkIHRoZSBlbnRpcmUgYXJjaGl2ZXMgb2YgdGhlIG1haWxpbmcgbGlzdCwgYnV0IHlvdQorc2hvdWxkIGF0IGxlYXN0IHJlYWQgdXAgb24gd2hhdCBwZW9wbGUgaGF2ZSBiZWVuIHRhbGtpbmcgYWJvdXQgbGF0ZWx5LiBJZgoreW91J3ZlIHJlY2VudGx5IGRpc2NvdmVyZWQgYSBwcm9ibGVtLCBjaGFuY2VzIGFyZSBzb21lYm9keSBlbHNlIGhhcyB0b28uIElmCit5b3UncmUgdGhlIGZpcnN0IHRvIGRpc2NvdmVyIGEgcHJvYmxlbSwgcG9zdCBhIG1lc3NhZ2UgYW5kIGxldCB0aGUgcmVzdCBvZiB1cwora25vdy4KKworQXJjaGl2ZXMgY2FuIGJlIGZvdW5kIGhlcmU6CisKKwlodHRwOi8vYnVzeWJveC5uZXQvbGlzdHMvYnVzeWJveC8KKworSWYgeW91IGhhdmUgYSBzZXJpb3VzIGludGVyZXN0IGluIEJ1c3lib3gsIGkuZS4sIHlvdSBhcmUgdXNpbmcgaXQgZGF5LXRvLWRheSBvcgorYXMgcGFydCBvZiBhbiBlbWJlZGRlZCBwcm9qZWN0LCBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSB0byBqb2luIHRoZSBtYWlsaW5nCitsaXN0LgorCitBIHdlYi1iYXNlZCBzaWduLXVwIGZvcm0gY2FuIGJlIGZvdW5kIGhlcmU6CisKKwlodHRwOi8vYnVzeWJveC5uZXQvbWFpbG1hbi9saXN0aW5mby9idXN5Ym94CisKKworQ29vcmRpbmF0ZSB3aXRoIHRoZSBBcHBsZXQgTWFpbnRhaW5lcgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitTb21lIChub3QgYWxsKSBvZiB0aGUgYXBwbGV0cyBpbiBCdXN5Ym94IGFyZSAib3duZWQiIGJ5IGEgbWFpbnRhaW5lciB3aG8gaGFzCitwdXQgc2lnbmlmaWNhbnQgZWZmb3J0IGludG8gaXQgYW5kIGlzIHByb2JhYmx5IG1vcmUgZmFtaWxpYXIgd2l0aCBpdCB0aGFuCitvdGhlcnMuIFRvIGZpbmQgdGhlIG1haW50YWluZXIgb2YgYW4gYXBwbGV0LCBsb29rIGF0IHRoZSB0b3Agb2YgdGhlIC5jIGZpbGUKK2ZvciBhIG5hbWUgZm9sbG93aW5nIHRoZSB3b3JkICdDb3B5cmlnaHQnIG9yICdXcml0dGVuIGJ5JyBvciAnTWFpbnRhaW5lcicuCisKK0JlZm9yZSBwbHVuZ2luZyBhaGVhZCwgaXQncyBhIGdvb2QgaWRlYSB0byBzZW5kIGEgbWVzc2FnZSB0byB0aGUgbWFpbGluZyBsaXN0Cit0aGF0IHNheXM6ICJIZXksIEkgd2FzIHRoaW5raW5nIGFib3V0IGFkZGluZyB0aGUgJ3RyYW5zbW9ncmlmeScgZmVhdHVyZSB0byB0aGUKKydmb28nIGFwcGxldC4gIFdvdWxkIHRoaXMgYmUgdXNlZnVsPyBJcyBhbnlvbmUgZWxzZSB3b3JraW5nIG9uIGl0PyIgWW91IG1pZ2h0Cit3YW50IHRvIENDIHRoZSBtYWludGFpbmVyIChpZiBhbnkpIHdpdGggeW91ciBxdWVzdGlvbi4KKworCisKK0FyZWFzIFdoZXJlIFlvdSBDYW4gSGVscAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0J1c3lib3ggY2FuIGFsd2F5cyB1c2UgaW1wcm92ZW1lbnQhIElmIHlvdSdyZSBsb29raW5nIGZvciB3YXlzIHRvIGhlbHAsIHRoZXJlCithcmUgYSB2YXJpZXR5IG9mIGFyZWFzIHdoZXJlIHlvdSBjb3VsZCBoZWxwLgorCisKK1doYXQgQnVzeWJveCBEb2Vzbid0IE5lZWQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQmVmb3JlIGxpc3RpbmcgdGhlIGFyZWFzIHdoZXJlIHlvdSBfY2FuXyBoZWxwLCBpdCdzIHdvcnRod2hpbGUgdG8gbWVudGlvbiB0aGUKK2FyZWFzIHdoZXJlIHlvdSBzaG91bGRuJ3QgYm90aGVyLiBXaGlsZSBCdXN5Ym94IHN0cml2ZXMgdG8gYmUgdGhlICJTd2lzcyBBcm15CitLbmlmZSIgb2YgZW1iZWRkZWQgTGludXgsIHRoZXJlIGFyZSBzb21lIGFwcGxldHMgdGhhdCB3aWxsIG5vdCBiZSBhY2NlcHRlZDoKKworIC0gQW55IGZpbGVzeXN0ZW0gbWFuaXB1bGF0aW9uIHRvb2xzOiBCdXN5Ym94IGlzIGZpbGVzeXN0ZW0gaW5kZXBlbmRlbnQgYW5kCisgICB3ZSBkbyBub3Qgd2FudCB0byBzdGFydCBhZGRpbmcgbWtmcy9mc2NrIHRvb2xzIGZvciBldmVyeSAob3IgYW55KQorICAgZmlsZXN5c3RlbSB1bmRlciB0aGUgc3VuLiAoZnNja19taW5peC5jIGFuZCBta2ZzX21pbml4LmMgYXJlIGxpdmluZyBvbgorICAgYm9ycm93ZWQgdGltZS4pIFRoZXJlIGFyZSBmYXIgdG9vIG1hbnkgb2YgdGhlc2UgdG9vbHMgb3V0IHRoZXJlLiAgVXNlCisgICB0aGUgdXBzdHJlYW0gdmVyc2lvbi4gIFJhdGlvbmFsZTogYnVncyBpbiB0aGVzZSB0b29scyBjYW4gZGVzdHJveQorICAgdmFzdCBhbW91bnRzIG9mIGRhdGEuICBLZWVwaW5nIHVwIHdpdGggZmlsZXN5c3RlbSBmb3JtYXQgZGV2ZWxvcG1lbnQKKyAgIGlzIGltcHJhY3RpY2FsIChlc3BlY2lhbGx5IGluIHRoZSBhcmVhIG9mIGtlZXBpbmcgZnNjayB0b29sIHNhZmUKKyAgIGFuZCB1cC10by1kYXRlKS4KKworIC0gQW55IGRpc2ssIGRldmljZSwgb3IgbWVkaWEtc3BlY2lmaWMgdG9vbHM6IFVzZSB0aGUgLXV0aWxzIG9yIC10b29scyBwYWNrYWdlCisgICB0aGF0IHdhcyBkZXNpZ25lZCBmb3IgeW91ciBkZXZpY2U7IGRvbid0IHRyeSB0byBzaG9laG9ybiB0aGVtIGludG8gQnVzeWJveC4KKworIC0gQW55IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyB0b29sczogQnVzeWJveCBpcyAob3Igc2hvdWxkIGJlKSBhcmNoaXRlY3R1cmUKKyAgIGluZGVwZW5kZW50LiBEbyBub3Qgc2VuZCB1cyB0b29scyB0aGF0IGNhbm5vdCBiZSB1c2VkIGFjcm9zcyBtdWx0aXBsZQorICAgcGxhdGZvcm1zIC8gYXJjaGVzLgorCisKK0J1ZyBSZXBvcnRpbmcKK35+fn5+fn5+fn5+fn4KKworSWYgeW91IGZpbmQgYnVncywgcGxlYXNlIHN1Ym1pdCBhIGRldGFpbGVkIGJ1ZyByZXBvcnQgdG8gdGhlIGJ1c3lib3ggbWFpbGluZworbGlzdCBhdCBidXN5Ym94QGJ1c3lib3gubmV0LiAgQSB3ZWxsLXdyaXR0ZW4gYnVnIHJlcG9ydCBzaG91bGQgaW5jbHVkZSBhCit0cmFuc2NyaXB0IG9mIGEgc2hlbGwgc2Vzc2lvbiB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgYmFkIGJlaGF2aW9yIGFuZCBlbmFibGVzCithbnlvbmUgZWxzZSB0byBkdXBsaWNhdGUgdGhlIGJ1ZyBvbiB0aGVpciBvd24gbWFjaGluZS4gVGhlIGZvbGxvd2luZyBpcyBzdWNoCithbiBleGFtcGxlOgorCisgICAgVG86IGJ1c3lib3hAYnVzeWJveC5uZXQKKyAgICBGcm9tOiBkaWxpZ2VudEB0ZXN0aW5nLmxpbnV4Lm9yZworICAgIFN1YmplY3Q6IC9iaW4vZGF0ZSBkb2Vzbid0IHdvcmsKKworICAgIFBhY2thZ2U6IGJ1c3lib3gKKyAgICBWZXJzaW9uOiAxLjAwCisKKyAgICBXaGVuIEkgZXhlY3V0ZSBCdXN5Ym94ICdkYXRlJyBpdCBwcm9kdWNlcyB1bmV4cGVjdGVkIHJlc3VsdHMuCisgICAgV2l0aCBHTlUgZGF0ZSBJIGdldCB0aGUgZm9sbG93aW5nIG91dHB1dDoKKworCSQgZGF0ZQorCVdlZCBNYXIgMjEgMTQ6MTk6NDEgTVNUIDIwMDEKKworICAgIEJ1dCB3aGVuIEkgdXNlIEJ1c3lCb3ggZGF0ZSBJIGdldCB0aGlzIGluc3RlYWQ6CisKKwkkIGRhdGUKKwlJbGxlZ2FsIGluc3RydWN0aW9uCisKKyAgICBJIGFtIHVzaW5nIERlYmlhbiB1bnN0YWJsZSwga2VybmVsIHZlcnNpb24gMi40LjE5LXJtazEgb24gYW4gTmV0d2luZGVyLAorICAgIGFuZCB0aGUgbGF0ZXN0IHVDbGliYyBmcm9tIENWUy4KKworCS1EaWxpZ2VudAorCitOb3RlIHRoZSBjYXJlZnVsIGRlc2NyaXB0aW9uIGFuZCB1c2Ugb2YgZXhhbXBsZXMgc2hvd2luZyBub3Qgb25seSB3aGF0IEJ1c3lCb3gKK2RvZXMsIGJ1dCBhbHNvIGEgY291bnRlciBleGFtcGxlIHNob3dpbmcgd2hhdCBhbiBlcXVpdmFsZW50IEdOVSBhcHAgZG9lcy4gIEJ1ZworcmVwb3J0cyBsYWNraW5nIHN1Y2ggZGV0YWlsIG1heSBuZXZlciBiZSBmaXhlZC4uLiAgVGhhbmtzIGZvciB1bmRlcnN0YW5kaW5nLgorCisKKworV3JpdGUgRG9jdW1lbnRhdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fgorCitDaGFuY2VzIGFyZSwgZG9jdW1lbnRhdGlvbiBpbiBCdXN5Ym94IGlzIGVpdGhlciBtaXNzaW5nIG9yIG5lZWRzIGltcHJvdmVtZW50LgorRWl0aGVyIHdheSwgaGVscCBpcyB3ZWxjb21lLgorCitXb3JrIGlzIGJlaW5nIGRvbmUgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGZyb20gc291cmNlcywKK2VzcGVjaWFsbHkgZnJvbSB0aGUgdXNhZ2UuaCBmaWxlLiBJZiB5b3Ugd2FudCB0byBjb3JyZWN0IHRoZSBkb2N1bWVudGF0aW9uLAorcGxlYXNlIG1ha2UgY2hhbmdlcyB0byB0aGUgcHJlLWdlbmVyYXRpb24gcGFydHMsIHJhdGhlciB0aGFuIHRoZSBnZW5lcmF0ZWQKK2RvY3VtZW50YXRpb24uIFtNb3JlIHRvIGNvbWUgb24gdGhpcyBsYXRlci4uLl0KKworSXQgaXMgcHJlZmVycmVkIHRoYXQgbW9kaWZpY2F0aW9ucyB0byBkb2N1bWVudGF0aW9uIGJlIHN1Ym1pdHRlZCBpbiBwYXRjaAorZm9ybWF0IChtb3JlIG9uIHRoaXMgYmVsb3cpLCBidXQgd2UncmUgYSBsaXR0bGUgbW9yZSBsZW5pZW50IHdoZW4gaXQgY29tZXMgdG8KK2RvY3MuIFlvdSBjb3VsZCwgZm9yIGV4YW1wbGUsIGp1c3Qgc2F5ICJhZnRlciB0aGUgbGlzdGluZyBvZiB0aGUgbW91bnQKK29wdGlvbnMsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3b3VsZCBiZSBoZWxwZnVsLi4uIgorCisKK0NvbnN1bHQgRXhpc3RpbmcgU291cmNlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0ZvciBhIHF1aWNrIGxpc3Rpbmcgb2YgIm5lZWRzIHdvcmsiIHNwb3RzIGluIHRoZSBzb3VyY2VzLCBjZCBpbnRvIHRoZSBCdXN5Ym94CitkaXJlY3RvcnkgYW5kIHJ1biB0aGUgZm9sbG93aW5nOgorCisJZm9yIGkgaW4gVE9ETyBGSVhNRSBYWFg7IGRvIGZpbmQgLW5hbWUgJyouW2NoXSd8eGFyZ3MgZ3JlcCAkaTsgZG9uZQorCitUaGlzIHdpbGwgc2hvdyBhbGwgb2YgdGhlIHRyb3VibGUgc3BvdHMgb3IgJ3F1ZXN0aW9uYWJsZScgY29kZS4gUGljayBhIHNwb3QsCithbnkgc3BvdCwgdGhlc2UgYXJlIGFsbCBpbnZpdGF0aW9ucyBmb3IgeW91IHRvIGNvbnRyaWJ1dGUuCisKKworQWRkIGEgTmV3IEFwcGxldAorfn5+fn5+fn5+fn5+fn5+fgorCitJZiB5b3Ugd2FudCB0byBhZGQgYSBuZXcgYXBwbGV0IHRvIEJ1c3lib3gsIHdlJ2QgbG92ZSB0byBzZWUgaXQuIEhvd2V2ZXIsCitiZWZvcmUgeW91IHdyaXRlIGFueSBjb2RlLCBwbGVhc2UgYXNrIGJlZm9yZWhhbmQgb24gdGhlIG1haWxpbmcgbGlzdCBzb21ldGhpbmcKK2xpa2UgIkRvIHlvdSB0aGluayBhcHBsZXQgJ2Zvbycgd291bGQgYmUgdXNlZnVsIGluIEJ1c3lib3g/IiBvciAiV291bGQgeW91CitndXlzIGFjY2VwdCBhcHBsZXQgJ2ZvbycgaW50byBCdXN5Ym94IGlmIEkgd2VyZSB0byB3cml0ZSBpdD8iIElmIHRoZSBhbnN3ZXIgaXMKKyJubyIgYnkgdGhlIGZvbGtzIG9uIHRoZSBtYWlsaW5nIGxpc3QsIHRoZW4geW91J3ZlIHNhdmVkIHlvdXJzZWxmIHNvbWUgdGltZS4KK0NvbnZlcnNlbHksIHlvdSBjb3VsZCBnZXQgc29tZSBwb3NpdGl2ZSByZXNwb25zZXMgZnJvbSBmb2xrcyB3aG8gbWlnaHQgYmUKK2ludGVyZXN0ZWQgaW4gaGVscGluZyB5b3UgaW1wbGVtZW50IGl0LCBvciBjYW4gcmVjb21tZW5kIHRoZSBiZXN0IGFwcHJvYWNoLgorUGVyaGFwcyBtb3N0IGltcG9ydGFudGx5LCB0aGlzIGlzIHlvdXIgd2F5IG9mIGNhbGxpbmcgImRpYnMiIG9uIHNvbWV0aGluZyBhbmQKK2F2b2lkaW5nIGR1cGxpY2F0aW9uIG9mIGVmZm9ydC4KKworQWxzbywgYmVmb3JlIHlvdSB3cml0ZSBhIGxpbmUgb2YgY29kZSwgcGxlYXNlIHJlYWQgdGhlICduZXctYXBwbGV0LUhPV1RPLnR4dCcKK2ZpbGUgaW4gdGhlIGRvY3MvIGRpcmVjdG9yeS4KKworCitKYW5pdG9yaWFsIFdvcmsKK35+fn5+fn5+fn5+fn5+fgorCitUaGVzZSBhcmUgZGlydHkgam9icywgYnV0IHNvbWVib2R5J3MgZ290dGEgZG8gJ2VtLgorCisgLSBTZWN1cml0eSBhdWRpdHM6CisgICBodHRwOi8vd3d3LnNlY3VyaXR5Zm9jdXMuY29tL3BvcHVwcy9mb3J1bXMvc2VjcHJvZy9pbnRyby5zaHRtbAorCisgLSBTeW50aGV0aWMgY29kZSByZW1vdmFsOiBodHRwOi8vd3d3LnBlcmwuY29tL3B1Yi8yMDAwLzA2L2NvbW1pZnkuaHRtbCAtIFRoaXMKKyAgIGlzIHZlcnkgUGVybC1zcGVjaWZpYywgYnV0IHRoZSBhZHZpY2UgZ2l2ZW4gaW4gaGVyZSBhcHBsaWVzIGVxdWFsbHkgd2VsbCB0bworICAgQy4KKworIC0gQyBsaWJyYXJ5IGZ1bmN0aW9uIHVzZSBhdWRpdHM6IFZlcmlmeWluZyB0aGF0IGZ1bmN0aW9ucyBhcmUgYmVpbmcgdXNlZAorICAgcHJvcGVybHkgKGNhbGxlZCB3aXRoIHRoZSByaWdodCBhcmdzKSwgcmVwbGFjaW5nIHVuc2FmZSBsaWJyYXJ5IGZ1bmN0aW9ucworICAgd2l0aCBzYWZlciB2ZXJzaW9ucywgbWFraW5nIHN1cmUgcmV0dXJuIGNvZGVzIGFyZSBiZWluZyBjaGVja2VkLCBldGMuCisKKyAtIFdoZXJlIGFwcHJvcHJpYXRlLCByZXBsYWNlIHByZXByb2Nlc3NvciBkZWZpbmVkIG1hY3JvcyBhbmQgdmFsdWVzIHdpdGgKKyAgIGNvbXBpbGUtdGltZSBlcXVpdmFsZW50cy4KKworIC0gU3R5bGUgZ3VpZGUgY29tcGxpYW5jZS4gU2VlOiBkb2NzL3N0eWxlLWd1aWRlLnR4dAorCisgLSBBZGQgdGVzdGNhc2VzIHRvIHRlc3RzL3Rlc3RjYXNlcy4KKworIC0gTWFrZWZpbGUgaW1wcm92ZW1lbnRzOgorICAgaHR0cDovL3d3dy5jYW5iLmF1dWcub3JnLmF1L35taWxsZXJwL3JtY2gvcmVjdS1tYWtlLWNvbnMtaGFybS5odG1sCisgICAoSSB0aGluayB0aGUgcmVjdXJzaXZlIHByb2JsZW1zIGFyZSBwcmV0dHkgbXVjaCB0YWtlbiBjYXJlIG9mIGF0IHRoaXMgcG9pbnQsIG5vbj8pCisKKyAtICJUZW4gQ29tbWFuZG1lbnRzIiBjb21wbGlhbmNlOiAodGhpcyBpcyBhICJtYXliZSIsIGNlcnRhaW5seSBub3QgYXMKKyAgIGltcG9ydGFudCBhcyBhbnkgb2YgdGhlIHByZXZpb3VzIGl0ZW1zLikKKyAgICBodHRwOi8vd3d3Lmx5c2F0b3IubGl1LnNlL2MvdGVuLWNvbW1hbmRtZW50cy5odG1sCisKK090aGVyIHVzZWZ1bCBsaW5rczoKKworIC0gdGhlIGNvbXAubGFuZy5jIEZBUTogaHR0cDovL2hvbWUuZGF0YWNvbW0uY2gvdF93b2xmL3R3L2MvaW5kZXguaHRtbCNTb3VyY2VzCisKKworCitTdWJtaXR0aW5nIFBhdGNoZXMgVG8gQnVzeWJveAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSBhcmUgc29tZSBndWlkZWxpbmVzIG9uIGhvdyB0byBzdWJtaXQgYSBwYXRjaCB0byBCdXN5Ym94LgorCisKK01ha2luZyBBIFBhdGNoCit+fn5+fn5+fn5+fn5+fgorCitJZiB5b3UndmUgZ290IGFub255bW91cyBHaXQgYWNjZXNzIHNldCB1cCwgbWFraW5nIGEgcGF0Y2ggaXMgc2ltcGxlLiBKdXN0IG1ha2UKK3N1cmUgeW91J3JlIGluIHRoZSBidXN5Ym94LyBkaXJlY3RvcnkgYW5kIHR5cGU6CisKKwlnaXQgZGlmZiAtYiAtdyA+IG15Y2hhbmdlcy5wYXRjaAorCitZb3UgY2FuIHNlbmQgdGhlIHJlc3VsdGluZyAucGF0Y2ggZmlsZSB0byB0aGUgbWFpbGluZyBsaXN0IHdpdGggYSBkZXNjcmlwdGlvbgorb2Ygd2hhdCBpdCBkb2VzLiAoQnV0IG5vdCBiZWZvcmUgeW91IHRlc3QgaXQhIFNlZSB0aGUgbmV4dCBzZWN0aW9uIGZvciBzb21lCitndWlkZWxpbmVzLikgSXQgaXMgcHJlZmVycmVkIHRoYXQgcGF0Y2hlcyBiZSBzZW50IGFzIGF0dGFjaG1lbnRzLCBidXQgaXQgaXMKK25vdCByZXF1aXJlZC4KKworQWxzbywgZmVlbCBmcmVlIHRvIGhlbHAgdGVzdCBvdGhlciBwZW9wbGUncyBwYXRjaGVzIGFuZCByZXBseSB0byB0aGVtIHdpdGgKK2NvbW1lbnRzLiBZb3UgY2FuIGFwcGx5IGEgcGF0Y2ggYnkgc2F2aW5nIGl0IGludG8geW91ciBidXN5Ym94LyBkaXJlY3RvcnkgYW5kCit0eXBpbmc6CisKKwlwYXRjaCAtcDEgPCBteWNoYW5nZXMucGF0Y2gKKworVGhlbiB5b3UgY2FuIHJlY29tcGlsZSwgc2VlIGlmIGl0IHJ1bnMsIHRlc3QgaWYgaXQgd29ya3MgYXMgYWR2ZXJ0aXNlZCwgYW5kCitwb3N0IHlvdXIgZmluZGluZ3MgdG8gdGhlIG1haWxpbmcgbGlzdC4KKworTk9URTogUGxlYXNlIGRvIG5vdCBpbmNsdWRlIGV4dHJhbmVvdXMgb3IgaXJyZWxldmFudCBjaGFuZ2VzIGluIHlvdXIgcGF0Y2hlcy4KK1BsZWFzZSBkbyBub3QgdHJ5IHRvICJidW5kbGUiIHR3byBwYXRjaGVzIHRvZ2V0aGVyIGludG8gb25lLiBNYWtlIHNpbmdsZSwKK2Rpc2NyZWV0IGNoYW5nZXMgb24gYSBwZXItcGF0Y2ggYmFzaXMuIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBtYWtlIGEgcGF0Y2ggdGhhdAordG91Y2hlcyBjb2RlIGluIG1hbnkgcGxhY2VzLCBidXQgdGhlc2Uga2luZCBvZiBwYXRjaGVzIGFyZSByYXJlIGFuZCBzaG91bGQgYmUKK2Nvb3JkaW5hdGVkIHdpdGggYSBtYWludGFpbmVyLgorCisKK1Rlc3RpbmcgR3VpZGVsaW5lcworfn5+fn5+fn5+fn5+fn5+fn5+CisKK0l0J3MgY29uc2lkZXJlZCBnb29kIGZvcm0gdG8gdGVzdCB5b3VyIG5ldyBmZWF0dXJlIGJlZm9yZSB5b3Ugc3VibWl0IGEgcGF0Y2gKK3RvIHRoZSBtYWlsaW5nIGxpc3QsIGFuZCBlc3BlY2lhbGx5IGJlZm9yZSB5b3UgcHVzaCBhIGNoYW5nZSB0byBHaXQuIEhlcmUKK2FyZSBzb21lIGd1aWRlbGluZXMgb24gaG93IHRvIHRlc3QgeW91ciBjaGFuZ2VzLgorCisgLSBBbHdheXMgdGVzdCBCdXN5Ym94IGFwcGxldHMgYWdhaW5zdCBHTlUgY291bnRlcnBhcnRzIGFuZCBtYWtlIHN1cmUgdGhlCisgICBiZWhhdmlvciAvIG91dHB1dCBpcyBpZGVudGljYWwgYmV0d2VlbiB0aGUgdHdvLgorCisgLSBUcnkgc2V2ZXJhbCBkaWZmZXJlbnQgcGVybXV0YXRpb25zIGFuZCBjb21iaW5hdGlvbnMgb2YgdGhlIGZlYXR1cmVzIHlvdSdyZQorICAgYWRkaW5nIChpLmUuLCBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIGNvbW1hbmQtbGluZSBzd2l0Y2hlcykgYW5kIG1ha2Ugc3VyZQorICAgdGhleSBhbGwgd29yazsgbWFrZSBzdXJlIG9uZSBmZWF0dXJlIGRvZXMgbm90IGludGVyZmVyZSB3aXRoIGFub3RoZXIuCisKKyAtIE1ha2Ugc3VyZSB5b3UgdGVzdCBjb21waWxpbmcgYWdhaW5zdCB0aGUgc291cmNlIGJvdGggd2l0aCB0aGUgZmVhdHVyZQorICAgdHVybmVkIG9uIGFuZCB0dXJuZWQgb2ZmIGluIENvbmZpZy5oIGFuZCBtYWtlIHN1cmUgQnVzeWJveCBjb21waWxlcyBjbGVhbmx5CisgICBib3RoIHdheXMuCisKKyAtIFJ1biB0aGUgbXVsdGlidWlsZC5wbCBzY3JpcHQgaW4gdGhlIHRlc3RzIGRpcmVjdG9yeSBhbmQgbWFrZSBzdXJlCisgICBldmVyeXRoaW5nIGNoZWNrcyBvdXQgT0suIChEbyB0aGlzIGZyb20gd2l0aGluIHRoZSBidXN5Ym94LyBkaXJlY3RvcnkgYnkKKyAgIHR5cGluZzogJ3Rlc3RzL211bHRpYnVpbGQucGwnLikKKworCitNYWtpbmcgU3VyZSBZb3VyIFBhdGNoIERvZXNuJ3QgR2V0IExvc3QKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitJZiB5b3UgZG9uJ3Qgd2FudCB5b3VyIHBhdGNoIHRvIGJlIGxvc3Qgb3IgZm9yZ290dGVuLCBzZW5kIGl0IHRvIHRoZSBidXN5Ym94CittYWlsaW5nIGxpc3Qgd2l0aCBhIHN1YmplY3QgbGluZSBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisJW1BBVENIXSAtIEFkZHMgInRyYW5zbW9ncmlmeSIgZmVhdHVyZSB0byAiZm9vIgorCitJbiB0aGUgYm9keSwgeW91IHNob3VsZCBoYXZlIGEgcHNldWRvLWhlYWRlciB0aGF0IGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICAgIFBhY2thZ2U6IGJ1c3lib3gKKyAgICBWZXJzaW9uOiB2MS4wMXByZSAob3Igd2hhdGV2ZXIgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcykKKyAgICBTZXZlcml0eTogd2lzaGxpc3QKKworVGhlIHJlbWFpbmRlciBvZiB0aGUgYm9keSBzaG91bGQgcmVhZCBhbG9uZyB0aGVzZSBsaW5lczoKKworCVRoaXMgcGF0Y2ggYWRkcyB0aGUgInRyYW5zbW9ncmlmeSIgZmVhdHVyZSB0byB0aGUgImZvbyIgYXBwbGV0LiBJIGhhdmUKKwl0ZXN0ZWQgdGhpcyBvbiBbYXJjaF0gc3lzdGVtKHMpIGFuZCBpdCB3b3Jrcy4gSSBoYXZlIHRlc3RlZCBpdCBhZ2FpbnN0IHRoZQorCUdOVSBjb3VudGVycGFydHMgYW5kIHRoZSBvdXRwdXRzIGFyZSBpZGVudGljYWwuIEkgaGF2ZSBydW4gdGhlIHNjcmlwdHMgaW4KKwl0aGUgJ3Rlc3RzJyBkaXJlY3RvcnkgYW5kIG5vdGhpbmcgYnJlYWtzLgorCisKKworSW1wcm92aW5nIFlvdXIgQ2hhbmNlcyBvZiBQYXRjaCBBY2NlcHRhbmNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRXZlbiBhZnRlciB5b3Ugc2VuZCBhIGJyaWxsaWFudCBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0LCBzb21ldGltZXMgaXQgY2FuIGdvCit1bm5vdGljZWQsIHVuLXJlcGxpZWQtdG8sIGFuZCBzb21ldGltZXMgKHNpZ2gpIGV2ZW4gbG9zdC4gVGhpcyBpcyBhbgordW5mb3J0dW5hdGUgZmFjdCBvZiBsaWZlLCBidXQgdGhlcmUgYXJlIHN0ZXBzIHlvdSBjYW4gdGFrZSB0byBoZWxwIHlvdXIgcGF0Y2gKK2dldCBub3RpY2VkIGFuZCBjb252aW5jZSBhIG1haW50YWluZXIgdGhhdCBpdCBzaG91bGQgYmUgYWRkZWQ6CisKKworQmUgU3VjY2luY3QKK35+fn5+fn5+fn5+CisKK0EgcGF0Y2ggdGhhdCBpbmNsdWRlcyBzbWFsbCwgaXNvbGF0ZWQsIG9idmlvdXMgY2hhbmdlcyBpcyBtb3JlIGxpa2VseSB0byBiZQorYWNjZXB0ZWQgdGhhbiBhIHBhdGNoIHRoYXQgdG91Y2hlcyBjb2RlIGluIGxvdHMgb2YgZGlmZmVyZW50IHBsYWNlcyBvciBtYWtlcworc3dlZXBpbmcsIGR1YmlvdXMgY2hhbmdlcy4KKworCitCYWNrIEl0IFVwCit+fn5+fn5+fn5+CisKK0hhcmQgZmFjdHMgb24gd2h5IHlvdXIgcGF0Y2ggaXMgYmV0dGVyIHRoYW4gdGhlIGV4aXN0aW5nIGNvZGUgd2lsbCBnbyBhIGxvbmcKK3dheSB0b3dhcmQgY29udmluY2luZyBtYWludGFpbmVycyB0aGF0IHlvdXIgcGF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkLgorU3BlY2lmaWNhbGx5LCBwYXRjaGVzIGFyZSBtb3JlIGxpa2VseSB0byBiZSBhY2NlcHRlZCBpZiB0aGV5IGFyZSBwcm92YWJseSBtb3JlCitjb3JyZWN0LCBzbWFsbGVyLCBmYXN0ZXIsIHNpbXBsZXIsIG9yIG1vcmUgbWFpbnRhaW5hYmxlIHRoYW4gdGhlIGV4aXN0aW5nCitjb2RlLgorCitDb252ZXJzZWx5LCBhbnkgcGF0Y2ggdGhhdCBpcyBzdXBwb3J0ZWQgd2l0aCBub3RoaW5nIG1vcmUgdGhhbiAiSSB0aGluayB0aGlzCit3b3VsZCBiZSBjb29sIiBvciAidGhpcyBwYXRjaCBpcyBnb29kIGJlY2F1c2UgSSBzYXkgaXQgaXMgYW5kIEkndmUgZ290IGEgUGhkCitpbiBDb21wdXRlciBTY2llbmNlIiB3aWxsIGxpa2VseSBiZSBpZ25vcmVkLgorCisKK0ZvbGxvdyBUaGUgU3R5bGUgR3VpZGUKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSXQncyBjb25zaWRlcmVkIGdvb2QgZm9ybSB0byBhYmlkZSBieSB0aGUgZXN0YWJsaXNoZWQgY29kaW5nIHN0eWxlIHVzZWQgaW4gYQorcHJvamVjdDsgQnVzeWJveCBpcyBubyBleGNlcHRpb24uIFdlIGhhdmUgZ29uZSBzbyBmYXIgYXMgdG8gZGVsaW5lYXRlIHRoZQorImVsZW1lbnRzIG9mIEJ1c3lib3ggc3R5bGUiIGluIHRoZSBmaWxlIGRvY3Mvc3R5bGUtZ3VpZGUudHh0LiBQbGVhc2UgZm9sbG93Cit0aGVtLgorCisKK1dvcmsgV2l0aCBTb21lb25lIEVsc2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworV29ya2luZyBvbiBhIHBhdGNoIGluIGlzb2xhdGlvbiBpcyBsZXNzIGVmZmVjdGl2ZSB0aGFuIHdvcmtpbmcgd2l0aCBzb21lb25lCitlbHNlIGZvciBhIHZhcmlldHkgb2YgcmVhc29ucy4gSWYgYW5vdGhlciBCdXN5Ym94IHVzZXIgaXMgaW50ZXJlc3RlZCBpbiB3aGF0Cit5b3UncmUgZG9pbmcsIHRoZW4gaXQncyB0d28gKG9yIG1vcmUpIHZvaWNlcyBpbnN0ZWFkIG9mIG9uZSB0aGF0IGNhbiBwZXRpdGlvbgorZm9yIGluY2x1c2lvbiBvZiB0aGUgcGF0Y2guIFlvdSdsbCBhbHNvIGhhdmUgbW9yZSBwZW9wbGUgdGhhdCBjYW4gdGVzdCB5b3VyCitjaGFuZ2VzLCBvciBldmVuIG9mZmVyIHN1Z2dlc3Rpb25zIG9uIGJldHRlciBhcHByb2FjaGVzIHlvdSBjb3VsZCB0YWtlLgorCitHZXR0aW5nIG90aGVyIGZvbGtzIGludGVyZXN0ZWQgZm9sbG93cyBhcyBhIG5hdHVyYWwgY291cnNlIGlmIHlvdSd2ZSByZWNlaXZlZAorcmVzcG9uc2VzIGZyb20gcXVlcmllcyB0byBhcHBsZXQgbWFpbnRhaW5lciBvciBwb3NpdGl2ZSByZXNwb25zZXMgZnJvbSBmb2xrcworb24gdGhlIG1haWxpbmcgbGlzdC4KKworV2UndmUgbWFkZSBzdHJpZGVudCBlZmZvcnRzIHRvIHB1dCBhIHVzZWZ1bCAiY29sbGFib3JhdGlvbiIgaW5mcmFzdHJ1Y3R1cmUgaW4KK3BsYWNlIGluIHRoZSBmb3JtIG9mIG1haWxpbmcgbGlzdHMsIHRoZSBidWcgdHJhY2tpbmcgc3lzdGVtLCBhbmQgR2l0LiBQbGVhc2UKK3VzZSB0aGVzZSByZXNvdXJjZXMuCisKKworU2VuZCBQYXRjaGVzIHRvIHRoZSBCdWcgVHJhY2tpbmcgU3lzdGVtCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhpcyB3YXMgbWVudGlvbmVkIGFib3ZlIGluIHRoZSAiTWFraW5nIFN1cmUgWW91ciBQYXRjaCBEb2Vzbid0IEdldCBMb3N0Igorc2VjdGlvbiwgYnV0IGl0IGlzIHdvcnRoIG1lbnRpb25pbmcgYWdhaW4uIEEgcGF0Y2ggc2VudCB0byB0aGUgbWFpbGluZyBsaXN0CittaWdodCBiZSB1bm5vdGljZWQgYW5kIGZvcmdvdHRlbi4gQSBwYXRjaCBzZW50IHRvIHRoZSBidWcgdHJhY2tpbmcgc3lzdGVtIHdpbGwKK2JlIHN0b3JlZCBhbmQgY2xvc2VseSBjb25uZWN0ZWQgdG8gdGhlIGJ1ZyBpdCBmaXhlcy4KKworCitCZSBQb2xpdGUKK35+fn5+fn5+fgorCitUaGUgb2xkIHNheWluZyAiWW91J2xsIGNhdGNoIG1vcmUgZmxpZXMgd2l0aCBob25leSB0aGFuIHlvdSB3aWxsIHdpdGggdmluZWdhciIKK2FwcGxpZXMgd2hlbiBzdWJtaXR0aW5nIHBhdGNoZXMgdG8gdGhlIG1haWxpbmcgbGlzdCBmb3IgYXBwcm92YWwuIFRoZSB3YXkgeW91CitwcmVzZW50IHlvdXIgcGF0Y2ggaXMgc29tZXRpbWVzIGp1c3QgYXMgaW1wb3J0YW50IGFzIHRoZSBhY3R1YWwgcGF0Y2ggaXRzZWxmCisoaWYgbm90IG1vcmUgc28pLiBCZWluZyBydWRlIHRvIHRoZSBtYWludGFpbmVycyBpcyBub3QgYW4gZWZmZWN0aXZlIHdheSB0bworY29udmluY2UgdGhlbSB0aGF0IHlvdXIgcGF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkOyBpdCB3aWxsIGxpa2VseSBoYXZlIHRoZQorb3Bwb3NpdGUgZWZmZWN0LgorCisKKworUHVzaGluZyBDaGFuZ2VzIHRvIEdpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3Ugc3VibWl0IHNldmVyYWwgcGF0Y2hlcyB0aGF0IGRlbW9uc3RyYXRlIHRoYXQgeW91IGFyZSBhIHNraWxsZWQgYW5kIHdpc2UKK2NvZGVyLCB5b3UgbWF5IGJlIGludml0ZWQgdG8gYmVjb21lIGEgY29tbWl0dGVyLCB0aHVzIGVuYWJsaW5nIHlvdSB0byBwdXNoCitjaGFuZ2VzIGRpcmVjdGx5IHRvIEdpdC4gVGhpcyBpcyBuaWNlIGJlY2F1c2UgeW91IGRvbid0IGhhdmUgdG8gd2FpdCBmb3IKK3NvbWVvbmUgZWxzZSB0byBwdXNoIHlvdXIgY2hhbmdlIGZvciB5b3UsIHlvdSBjYW4ganVzdCBkbyBpdCB5b3Vyc2VsZi4KKworQnV0IG5vdGUgdGhhdCB0aGlzIGlzIGEgcHJpdmlsZWdlIHRoYXQgY29tZXMgd2l0aCBzb21lIHJlc3BvbnNpYmlsaXRpZXMuIFlvdQorc2hvdWxkIHRlc3QgeW91ciBjaGFuZ2VzIGJlZm9yZSB5b3UgcHVzaCB0aGVtLiBZb3Ugc2hvdWxkIGFsc28gdGFsayB0byBhbgorYXBwbGV0IG1haW50YWluZXIgYmVmb3JlIHlvdSBtYWtlIGFueSBraW5kIG9mIHN3ZWVwaW5nIGNoYW5nZXMgdG8gc29tZWJvZHkKK2Vsc2UncyBjb2RlLiBCaWcgY2hhbmdlcyBzaG91bGQgc3RpbGwgZ28gdG8gdGhlIG1haWxpbmcgbGlzdCBmaXJzdC4gUmVtZW1iZXIsCitiZWluZyB3aXNlLCBwb2xpdGUsIGFuZCBkaXNjcmVldCBpcyBtb3JlIGltcG9ydGFudCB0aGFuIGJlaW5nIGNsZXZlci4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gR2l0IHB1c2ggYWNjZXNzLCBzZWU6CisKKwlodHRwOi8vYnVzeWJveC5uZXQvZGV2ZWxvcGVyLmh0bWwKKworCitXaGVuIFRvIFB1c2gKK35+fn5+fn5+fn5+fgorCitHZW5lcmFsbHksIHlvdSBzaG91bGQgZmVlbCBmcmVlIHRvIHB1c2ggYSBjaGFuZ2UgaWY6CisKKyAtIFlvdXIgY2hhbmdlcyBhcmUgc21hbGwgYW5kIGRvbid0IHRvdWNoIG1hbnkgZmlsZXMKKyAtIFlvdSBhcmUgZml4aW5nIGEgYnVnCisgLSBTb21lYm9keSBoYXMgdG9sZCB5b3UgdGhhdCBpdCdzIG9rYXkKKyAtIEl0J3Mgb2J2aW91c2x5IHRoZSBSaWdodCBUaGluZworCitUaGUgbW9yZSBvZiB0aGUgYWJvdmUgYXJlIHRydWUsIHRoZSBiZXR0ZXIgaXQgaXMgdG8ganVzdCBwdXNoIGEgY2hhbmdlCitkaXJlY3RseSB0byBHaXQuCisKKworV2hlbiBOb3QgVG8gUHVzaAorfn5+fn5+fn5+fn5+fn5+fgorCitFdmVuIGlmIHlvdSBoYXZlIHB1c2ggYWNjZXNzLCB5b3Ugc2hvdWxkIHByb2JhYmx5IHN0aWxsIHBvc3QgYSBwYXRjaCB0byB0aGUKK21haWxpbmcgbGlzdCBpZjoKKworIC0gWW91ciBjaGFuZ2VzIGFyZSBicm9hZCBhbmQgdG91Y2ggbWFueSBkaWZmZXJlbnQgZmlsZXMKKyAtIFlvdSBhcmUgYWRkaW5nIGEgZmVhdHVyZQorIC0gWW91ciBjaGFuZ2VzIGFyZSBzcGVjdWxhdGl2ZSBvciBleHBlcmltZW50YWwgKGkuZS4sIHRyeWluZyBhIG5ldyBhbGdvcml0aG0pCisgLSBZb3UgYXJlIG5vdCB0aGUgbWFpbnRhaW5lciBhbmQgeW91ciBjaGFuZ2VzIG1ha2UgdGhlIG1haW50YWluZXIgY3JpbmdlCisKK1RoZSBtb3JlIG9mIHRoZSBhYm92ZSBhcmUgdHJ1ZSwgdGhlIGJldHRlciBpdCBpcyB0byBwb3N0IGEgcGF0Y2ggdG8gdGhlCittYWlsaW5nIGxpc3QgaW5zdGVhZCBvZiBwdXNoaW5nLgorCisKKworRmluYWwgV29yZHMKKy0tLS0tLS0tLS0tCisKK0lmIGFsbCBvZiB0aGlzIHNlZW1zIGNvbXBsaWNhdGVkLCBkb24ndCBwYW5pYywgaXQncyByZWFsbHkgbm90IHRoYXQgdG91Z2guIElmCit5b3UncmUgaGF2aW5nIGRpZmZpY3VsdHkgZm9sbG93aW5nIHNvbWUgb2YgdGhlIHN0ZXBzIG91dGxpbmVkIGluIHRoaXMKK2RvY3VtZW50IGRvbid0IHdvcnJ5LCB0aGUgZm9sa3Mgb24gdGhlIEJ1c3lib3ggbWFpbGluZyBsaXN0IGFyZSBhIGZhaXJseQorZ29vZC1uYXR1cmVkIGJ1bmNoIGFuZCB3aWxsIHdvcmsgd2l0aCB5b3UgdG8gaGVscCBnZXQgeW91ciBwYXRjaGVzIGludG8gc2hhcGUKK29yIGhlbHAgeW91IG1ha2UgY29udHJpYnV0aW9ucy4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RvY3MvY3R0eS5odG0gYi9idXN5Ym94LTEuMTkuMy9kb2NzL2N0dHkuaHRtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDY2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL2N0dHkuaHRtCkBAIC0wLDAgKzEsNDc2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Cis8aHRtbD48aGVhZD4KKyA8IS0tIHNhdmVkIGZyb20gaHR0cDovL3d3dy53aW4udHVlLm5sL35hZWIvbGludXgvbGsvbGstMTAuaHRtbCAtLT4KKyA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IlNHTUwtVG9vbHMgMS4wLjkiPjx0aXRsZT5UaGUgTGludXgga2VybmVsOiBQcm9jZXNzZXM8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aHI+Cis8aDI+PGEgbmFtZT0iczEwIj4xMC4gUHJvY2Vzc2VzPC9hPjwvaDI+CisKKzxwPkJlZm9yZSBsb29raW5nIGF0IHRoZSBMaW51eCBpbXBsZW1lbnRhdGlvbiwgZmlyc3QgYSBnZW5lcmFsIFVuaXgKK2Rlc2NyaXB0aW9uIG9mIHRocmVhZHMsIHByb2Nlc3NlcywgcHJvY2VzcyBncm91cHMgYW5kIHNlc3Npb25zLgorPC9wPjxwPkEgc2Vzc2lvbiBjb250YWlucyBhIG51bWJlciBvZiBwcm9jZXNzIGdyb3VwcywgYW5kIGEgcHJvY2VzcyBncm91cAorY29udGFpbnMgYSBudW1iZXIgb2YgcHJvY2Vzc2VzLCBhbmQgYSBwcm9jZXNzIGNvbnRhaW5zIGEgbnVtYmVyCitvZiB0aHJlYWRzLgorPC9wPjxwPkEgc2Vzc2lvbiBjYW4gaGF2ZSBhIGNvbnRyb2xsaW5nIHR0eS4KK0F0IG1vc3Qgb25lIHByb2Nlc3MgZ3JvdXAgaW4gYSBzZXNzaW9uIGNhbiBiZSBhIGZvcmVncm91bmQgcHJvY2VzcyBncm91cC4KK0FuIGludGVycnVwdCBjaGFyYWN0ZXIgdHlwZWQgb24gYSB0dHkgKCJUZWxldHlwZSIsIGkuZS4sIHRlcm1pbmFsKQorY2F1c2VzIGEgc2lnbmFsIHRvIGJlIHNlbnQgdG8gYWxsIG1lbWJlcnMgb2YgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cAoraW4gdGhlIHNlc3Npb24gKGlmIGFueSkgdGhhdCBoYXMgdGhhdCB0dHkgYXMgY29udHJvbGxpbmcgdHR5LgorPC9wPjxwPkFsbCB0aGVzZSBvYmplY3RzIGhhdmUgbnVtYmVycywgYW5kIHdlIGhhdmUgdGhyZWFkIElEcywgcHJvY2VzcyBJRHMsCitwcm9jZXNzIGdyb3VwIElEcyBhbmQgc2Vzc2lvbiBJRHMuCis8L3A+PHA+Cis8L3A+PGgyPjxhIG5hbWU9InNzMTAuMSI+MTAuMSBQcm9jZXNzZXM8L2E+Cis8L2gyPgorCis8cD4KKzwvcD48aDM+Q3JlYXRpb248L2gzPgorCis8cD5BIG5ldyBwcm9jZXNzIGlzIHRyYWRpdGlvbmFsbHkgc3RhcnRlZCB1c2luZyB0aGUgPGNvZGU+Zm9yaygpPC9jb2RlPgorc3lzdGVtIGNhbGw6Cis8L3A+PGJsb2NrcXVvdGU+Cis8cHJlPnBpZF90IHA7CisKK3AgPSBmb3JrKCk7CitpZiAocCA9PSAocGlkX3QpIC0xKQorICAgICAgICAvKiBFUlJPUiAqLworZWxzZSBpZiAocCA9PSAwKQorICAgICAgICAvKiBDSElMRCAqLworZWxzZQorICAgICAgICAvKiBQQVJFTlQgKi8KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+VGhpcyBjcmVhdGVzIGEgY2hpbGQgYXMgYSBkdXBsaWNhdGUgb2YgaXRzIHBhcmVudC4KK1BhcmVudCBhbmQgY2hpbGQgYXJlIGlkZW50aWNhbCBpbiBhbG1vc3QgYWxsIHJlc3BlY3RzLgorSW4gdGhlIGNvZGUgdGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBwYXJlbnQKK2xlYXJucyB0aGUgcHJvY2VzcyBJRCBvZiBpdHMgY2hpbGQsIHdoaWxlIDxjb2RlPmZvcmsoKTwvY29kZT4KK3JldHVybnMgMCBpbiB0aGUgY2hpbGQuIChJdCBjYW4gZmluZCB0aGUgcHJvY2VzcyBJRCBvZiBpdHMKK3BhcmVudCB1c2luZyB0aGUgPGNvZGU+Z2V0cHBpZCgpPC9jb2RlPiBzeXN0ZW0gY2FsbC4pCis8L3A+PHA+Cis8L3A+PGgzPlRlcm1pbmF0aW9uPC9oMz4KKworPHA+Tm9ybWFsIHRlcm1pbmF0aW9uIGlzIHdoZW4gdGhlIHByb2Nlc3MgZG9lcworPC9wPjxibG9ja3F1b3RlPgorPHByZT5leGl0KG4pOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK29yCis8YmxvY2txdW90ZT4KKzxwcmU+cmV0dXJuIG47Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworZnJvbSBpdHMgPGNvZGU+bWFpbigpPC9jb2RlPiBwcm9jZWR1cmUuIEl0IHJldHVybnMgdGhlIHNpbmdsZSBieXRlIDxjb2RlPm48L2NvZGU+Cit0byBpdHMgcGFyZW50LgorPHA+QWJub3JtYWwgdGVybWluYXRpb24gaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBzaWduYWwuCis8L3A+PHA+Cis8L3A+PGgzPkNvbGxlY3RpbmcgdGhlIGV4aXQgY29kZS4gWm9tYmllczwvaDM+CisKKzxwPlRoZSBwYXJlbnQgZG9lcworPC9wPjxibG9ja3F1b3RlPgorPHByZT5waWRfdCBwOworaW50IHN0YXR1czsKKworcCA9IHdhaXQoJmFtcDtzdGF0dXMpOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK2FuZCBjb2xsZWN0cyB0d28gYnl0ZXM6Cis8cD4KKzxmaWd1cmU+Cis8ZXBzIGZpbGU9ImFic2VudCI+Cis8aW1nIHNyYz0iY3R0eV9maWxlcy9leGl0X3N0YXR1cy5wbmciPgorPC9lcHM+Cis8L2ZpZ3VyZT48L3A+PHA+QSBwcm9jZXNzIHRoYXQgaGFzIHRlcm1pbmF0ZWQgYnV0IGhhcyBub3QgeWV0IGJlZW4gd2FpdGVkIGZvcgoraXMgYSA8aT56b21iaWU8L2k+LiBJdCBuZWVkIG9ubHkgc3RvcmUgdGhlc2UgdHdvIGJ5dGVzOgorZXhpdCBjb2RlIGFuZCByZWFzb24gZm9yIHRlcm1pbmF0aW9uLgorPC9wPjxwPk9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgcGFyZW50IGRpZXMgZmlyc3QsIDxjb2RlPmluaXQ8L2NvZGU+IChwcm9jZXNzIDEpCitpbmhlcml0cyB0aGUgY2hpbGQgYW5kIGJlY29tZXMgaXRzIHBhcmVudC4KKzwvcD48cD4KKzwvcD48aDM+U2lnbmFsczwvaDM+CisKKzxwPgorPC9wPjxoMz5TdG9wcGluZzwvaDM+CisKKzxwPlNvbWUgc2lnbmFscyBjYXVzZSBhIHByb2Nlc3MgdG8gc3RvcDoKKzxjb2RlPlNJR1NUT1A8L2NvZGU+IChzdG9wISksCis8Y29kZT5TSUdUU1RQPC9jb2RlPiAoc3RvcCBmcm9tIHR0eTogcHJvYmFibHkgXlogd2FzIHR5cGVkKSwKKzxjb2RlPlNJR1RUSU48L2NvZGU+ICh0dHkgaW5wdXQgYXNrZWQgYnkgYmFja2dyb3VuZCBwcm9jZXNzKSwKKzxjb2RlPlNJR1RUT1U8L2NvZGU+ICh0dHkgb3V0cHV0IHNlbnQgYnkgYmFja2dyb3VuZCBwcm9jZXNzLCBhbmQgdGhpcyB3YXMKK2Rpc2FsbG93ZWQgYnkgPGNvZGU+c3R0eSB0b3N0b3A8L2NvZGU+KS4KKzwvcD48cD5BcGFydCBmcm9tIF5aIHRoZXJlIGFsc28gaXMgXlkuIFRoZSBmb3JtZXIgc3RvcHMgdGhlIHByb2Nlc3MKK3doZW4gaXQgaXMgdHlwZWQsIHRoZSBsYXR0ZXIgc3RvcHMgaXQgd2hlbiBpdCBpcyByZWFkLgorPC9wPjxwPlNpZ25hbHMgZ2VuZXJhdGVkIGJ5IHR5cGluZyB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgb24gc29tZSB0dHkKK2FyZSBzZW50IHRvIGFsbCBwcm9jZXNzZXMgdGhhdCBhcmUgaW4gdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cAorb2YgdGhlIHNlc3Npb24gdGhhdCBoYXMgdGhhdCB0dHkgYXMgY29udHJvbGxpbmcgdHR5LiAoRGV0YWlscyBiZWxvdy4pCis8L3A+PHA+SWYgYSBwcm9jZXNzIGlzIGJlaW5nIHRyYWNlZCwgZXZlcnkgc2lnbmFsIHdpbGwgc3RvcCBpdC4KKzwvcD48cD4KKzwvcD48aDM+Q29udGludWluZzwvaDM+CisKKzxwPjxjb2RlPlNJR0NPTlQ8L2NvZGU+OiBjb250aW51ZSBhIHN0b3BwZWQgcHJvY2Vzcy4KKzwvcD48cD4KKzwvcD48aDM+VGVybWluYXRpbmc8L2gzPgorCis8cD48Y29kZT5TSUdLSUxMPC9jb2RlPiAoZGllISBub3chKSwKKzxjb2RlPlNJR1RFUk08L2NvZGU+IChwbGVhc2UsIGdvIGF3YXkpLAorPGNvZGU+U0lHSFVQPC9jb2RlPiAobW9kZW0gaGFuZ3VwKSwKKzxjb2RlPlNJR0lOVDwvY29kZT4gKF5DKSwKKzxjb2RlPlNJR1FVSVQ8L2NvZGU+ICheXCksIGV0Yy4KK01hbnkgc2lnbmFscyBoYXZlIGFzIGRlZmF1bHQgYWN0aW9uIHRvIGtpbGwgdGhlIHRhcmdldC4KKyhTb21ldGltZXMgd2l0aCBhbiBhZGRpdGlvbmFsIGNvcmUgZHVtcCwgd2hlbiBzdWNoIGlzCithbGxvd2VkIGJ5IHJsaW1pdC4pCitUaGUgc2lnbmFscyA8Y29kZT5TSUdDSExEPC9jb2RlPiBhbmQgPGNvZGU+U0lHV0lOQ0g8L2NvZGU+CithcmUgaWdub3JlZCBieSBkZWZhdWx0LgorQWxsIGV4Y2VwdCA8Y29kZT5TSUdLSUxMPC9jb2RlPiBhbmQgPGNvZGU+U0lHU1RPUDwvY29kZT4gY2FuIGJlCitjYXVnaHQgb3IgaWdub3JlZCBvciBibG9ja2VkLgorRm9yIGRldGFpbHMsIHNlZSA8Y29kZT5zaWduYWwoNyk8L2NvZGU+LgorPC9wPjxwPgorPC9wPjxoMj48YSBuYW1lPSJzczEwLjIiPjEwLjIgUHJvY2VzcyBncm91cHM8L2E+Cis8L2gyPgorCis8cD5FdmVyeSBwcm9jZXNzIGlzIG1lbWJlciBvZiBhIHVuaXF1ZSA8aT5wcm9jZXNzIGdyb3VwPC9pPiwKK2lkZW50aWZpZWQgYnkgaXRzIDxpPnByb2Nlc3MgZ3JvdXAgSUQ8L2k+LgorKFdoZW4gdGhlIHByb2Nlc3MgaXMgY3JlYXRlZCwgaXQgYmVjb21lcyBhIG1lbWJlciBvZiB0aGUgcHJvY2VzcyBncm91cAorb2YgaXRzIHBhcmVudC4pCitCeSBjb252ZW50aW9uLCB0aGUgcHJvY2VzcyBncm91cCBJRCBvZiBhIHByb2Nlc3MgZ3JvdXAKK2VxdWFscyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBwcm9jZXNzIGdyb3VwLAorY2FsbGVkIHRoZSA8aT5wcm9jZXNzIGdyb3VwIGxlYWRlcjwvaT4uCitBIHByb2Nlc3MgZmluZHMgdGhlIElEIG9mIGl0cyBwcm9jZXNzIGdyb3VwIHVzaW5nIHRoZSBzeXN0ZW0gY2FsbAorPGNvZGU+Z2V0cGdycCgpPC9jb2RlPiwgb3IsIGVxdWl2YWxlbnRseSwgPGNvZGU+Z2V0cGdpZCgwKTwvY29kZT4uCitPbmUgZmluZHMgdGhlIHByb2Nlc3MgZ3JvdXAgSUQgb2YgcHJvY2VzcyA8Y29kZT5wPC9jb2RlPiB1c2luZworPGNvZGU+Z2V0cGdpZChwKTwvY29kZT4uCis8L3A+PHA+T25lIG1heSB1c2UgdGhlIGNvbW1hbmQgPGNvZGU+cHMgajwvY29kZT4gdG8gc2VlIFBQSUQgKHBhcmVudCBwcm9jZXNzIElEKSwKK1BJRCAocHJvY2VzcyBJRCksIFBHSUQgKHByb2Nlc3MgZ3JvdXAgSUQpIGFuZCBTSUQgKHNlc3Npb24gSUQpCitvZiBwcm9jZXNzZXMuIFdpdGggYSBzaGVsbCB0aGF0IGRvZXMgbm90IGtub3cgYWJvdXQgam9iIGNvbnRyb2wsCitsaWtlIDxjb2RlPmFzaDwvY29kZT4sIGVhY2ggb2YgaXRzIGNoaWxkcmVuIHdpbGwgYmUgaW4gdGhlIHNhbWUgc2Vzc2lvbgorYW5kIGhhdmUgdGhlIHNhbWUgcHJvY2VzcyBncm91cCBhcyB0aGUgc2hlbGwuIFdpdGggYSBzaGVsbCB0aGF0IGtub3dzCithYm91dCBqb2IgY29udHJvbCwgbGlrZSA8Y29kZT5iYXNoPC9jb2RlPiwgdGhlIHByb2Nlc3NlcyBvZiBvbmUgcGlwZWxpbmUsIGxpa2UKKzwvcD48YmxvY2txdW90ZT4KKzxwcmU+JSBjYXQgcGFwZXIgfCBpZGVhbCB8IHBpYyB8IHRibCB8IGVxbiB8IGRpdHJvZmYgJmd0OyBvdXQKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitmb3JtIGEgc2luZ2xlIHByb2Nlc3MgZ3JvdXAuCis8cD4KKzwvcD48aDM+Q3JlYXRpb248L2gzPgorCis8cD5BIHByb2Nlc3MgPGNvZGU+cGlkPC9jb2RlPiBpcyBwdXQgaW50byB0aGUgcHJvY2VzcyBncm91cCA8Y29kZT5wZ2lkPC9jb2RlPiBieQorPC9wPjxibG9ja3F1b3RlPgorPHByZT5zZXRwZ2lkKHBpZCwgcGdpZCk7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSWYgPGNvZGU+cGdpZCA9PSBwaWQ8L2NvZGU+IG9yIDxjb2RlPnBnaWQgPT0gMDwvY29kZT4gdGhlbiB0aGlzIGNyZWF0ZXMKK2EgbmV3IHByb2Nlc3MgZ3JvdXAgd2l0aCBwcm9jZXNzIGdyb3VwIGxlYWRlciA8Y29kZT5waWQ8L2NvZGU+LgorT3RoZXJ3aXNlLCB0aGlzIHB1dHMgPGNvZGU+cGlkPC9jb2RlPiBpbnRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nCitwcm9jZXNzIGdyb3VwIDxjb2RlPnBnaWQ8L2NvZGU+LgorQSB6ZXJvIDxjb2RlPnBpZDwvY29kZT4gcmVmZXJzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MuCitUaGUgY2FsbCA8Y29kZT5zZXRwZ3JwKCk8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gPGNvZGU+c2V0cGdpZCgwLDApPC9jb2RlPi4KKzxwPgorPC9wPjxoMz5SZXN0cmljdGlvbnMgb24gc2V0cGdpZCgpPC9oMz4KKworPHA+VGhlIGNhbGxpbmcgcHJvY2VzcyBtdXN0IGJlIDxjb2RlPnBpZDwvY29kZT4gaXRzZWxmLCBvciBpdHMgcGFyZW50LAorYW5kIHRoZSBwYXJlbnQgY2FuIG9ubHkgZG8gdGhpcyBiZWZvcmUgPGNvZGU+cGlkPC9jb2RlPiBoYXMgZG9uZQorPGNvZGU+ZXhlYygpPC9jb2RlPiwgYW5kIG9ubHkgd2hlbiBib3RoIGJlbG9uZyB0byB0aGUgc2FtZSBzZXNzaW9uLgorSXQgaXMgYW4gZXJyb3IgaWYgcHJvY2VzcyA8Y29kZT5waWQ8L2NvZGU+IGlzIGEgc2Vzc2lvbiBsZWFkZXIKKyhhbmQgdGhpcyBjYWxsIHdvdWxkIGNoYW5nZSBpdHMgPGNvZGU+cGdpZDwvY29kZT4pLgorPC9wPjxwPgorPC9wPjxoMz5UeXBpY2FsIHNlcXVlbmNlPC9oMz4KKworPHA+Cis8L3A+PGJsb2NrcXVvdGU+Cis8cHJlPnAgPSBmb3JrKCk7CitpZiAocCA9PSAocGlkX3QpIC0xKSB7CisgICAgICAgIC8qIEVSUk9SICovCit9IGVsc2UgaWYgKHAgPT0gMCkgeyAgICAvKiBDSElMRCAqLworICAgICAgICBzZXRwZ2lkKDAsIHBnaWQpOworICAgICAgICAuLi4KK30gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIFBBUkVOVCAqLworICAgICAgICBzZXRwZ2lkKHAsIHBnaWQpOworICAgICAgICAuLi4KK30KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGlzIGVuc3VyZXMgdGhhdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgcGFyZW50IG9yIGNoaWxkIGlzIHNjaGVkdWxlZAorZmlyc3QsIHRoZSBwcm9jZXNzIGdyb3VwIHNldHRpbmcgaXMgYXMgZXhwZWN0ZWQgYnkgYm90aC4KKzxwPgorPC9wPjxoMz5TaWduYWxsaW5nIGFuZCB3YWl0aW5nPC9oMz4KKworPHA+T25lIGNhbiBzaWduYWwgYWxsIG1lbWJlcnMgb2YgYSBwcm9jZXNzIGdyb3VwOgorPC9wPjxibG9ja3F1b3RlPgorPHByZT5raWxscGcocGdycCwgc2lnKTsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+T25lIGNhbiB3YWl0IGZvciBjaGlsZHJlbiBpbiBvbmVzIG93biBwcm9jZXNzIGdyb3VwOgorPC9wPjxibG9ja3F1b3RlPgorPHByZT53YWl0cGlkKDAsICZhbXA7c3RhdHVzLCAuLi4pOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK29yIGluIGEgc3BlY2lmaWVkIHByb2Nlc3MgZ3JvdXA6Cis8YmxvY2txdW90ZT4KKzxwcmU+d2FpdHBpZCgtcGdycCwgJmFtcDtzdGF0dXMsIC4uLik7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPgorPC9wPjxoMz5Gb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXA8L2gzPgorCis8cD5BbW9uZyB0aGUgcHJvY2VzcyBncm91cHMgaW4gYSBzZXNzaW9uIGF0IG1vc3Qgb25lIGNhbiBiZQordGhlIDxpPmZvcmVncm91bmQgcHJvY2VzcyBncm91cDwvaT4gb2YgdGhhdCBzZXNzaW9uLgorVGhlIHR0eSBpbnB1dCBhbmQgdHR5IHNpZ25hbHMgKHNpZ25hbHMgZ2VuZXJhdGVkIGJ5IF5DLCBeWiwgZXRjLikKK2dvIHRvIHByb2Nlc3NlcyBpbiB0aGlzIGZvcmVncm91bmQgcHJvY2VzcyBncm91cC4KKzwvcD48cD5BIHByb2Nlc3MgY2FuIGRldGVybWluZSB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIGluIGl0cyBzZXNzaW9uCit1c2luZyA8Y29kZT50Y2dldHBncnAoZmQpPC9jb2RlPiwgd2hlcmUgPGNvZGU+ZmQ8L2NvZGU+IHJlZmVycyB0byBpdHMKK2NvbnRyb2xsaW5nIHR0eS4gSWYgdGhlcmUgaXMgbm9uZSwgdGhpcyByZXR1cm5zIGEgcmFuZG9tIHZhbHVlCitsYXJnZXIgdGhhbiAxIHRoYXQgaXMgbm90IGEgcHJvY2VzcyBncm91cCBJRC4KKzwvcD48cD5BIHByb2Nlc3MgY2FuIHNldCB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIGluIGl0cyBzZXNzaW9uCit1c2luZyA8Y29kZT50Y3NldHBncnAoZmQscGdycCk8L2NvZGU+LCB3aGVyZSA8Y29kZT5mZDwvY29kZT4gcmVmZXJzIHRvIGl0cworY29udHJvbGxpbmcgdHR5LCBhbmQgPGNvZGU+cGdycDwvY29kZT4gaXMgYSBwcm9jZXNzIGdyb3VwIGluCitpdHMgc2Vzc2lvbiwgYW5kIHRoaXMgc2Vzc2lvbiBzdGlsbCBpcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250cm9sbGluZwordHR5IG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCis8L3A+PHA+SG93IGRvZXMgb25lIGdldCA8Y29kZT5mZDwvY29kZT4/IEJ5IGRlZmluaXRpb24sIDxjb2RlPi9kZXYvdHR5PC9jb2RlPgorcmVmZXJzIHRvIHRoZSBjb250cm9sbGluZyB0dHksIGVudGlyZWx5IGluZGVwZW5kZW50IG9mIHJlZGlyZWN0cworb2Ygc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dC4gKFRoZXJlIGlzIGFsc28gdGhlIGZ1bmN0aW9uCis8Y29kZT5jdGVybWlkKCk8L2NvZGU+IHRvIGdldCB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuCitPbiBhIFBPU0lYIHN0YW5kYXJkIHN5c3RlbSBpdCB3aWxsIHJldHVybiA8Y29kZT4vZGV2L3R0eTwvY29kZT4uKQorT3BlbmluZyB0aGUgbmFtZSBvZiB0aGUKK2NvbnRyb2xsaW5nIHR0eSBnaXZlcyBhIGZpbGUgZGVzY3JpcHRvciA8Y29kZT5mZDwvY29kZT4uCis8L3A+PHA+Cis8L3A+PGgzPkJhY2tncm91bmQgcHJvY2VzcyBncm91cHM8L2gzPgorCis8cD5BbGwgcHJvY2VzcyBncm91cHMgaW4gYSBzZXNzaW9uIHRoYXQgYXJlIG5vdCBmb3JlZ3JvdW5kCitwcm9jZXNzIGdyb3VwIGFyZSA8aT5iYWNrZ3JvdW5kIHByb2Nlc3MgZ3JvdXBzPC9pPi4KK1NpbmNlIHRoZSB1c2VyIGF0IHRoZSBrZXlib2FyZCBpcyBpbnRlcmFjdGluZyB3aXRoIGZvcmVncm91bmQKK3Byb2Nlc3NlcywgYmFja2dyb3VuZCBwcm9jZXNzZXMgc2hvdWxkIHN0YXkgYXdheSBmcm9tIGl0LgorV2hlbiBhIGJhY2tncm91bmQgcHJvY2VzcyByZWFkcyBmcm9tIHRoZSB0ZXJtaW5hbCBpdCBnZXRzCithIFNJR1RUSU4gc2lnbmFsLiBOb3JtYWxseSwgdGhhdCB3aWxsIHN0b3AgaXQsIHRoZSBqb2IgY29udHJvbCBzaGVsbAorbm90aWNlcyBhbmQgdGVsbHMgdGhlIHVzZXIsIHdobyBjYW4gc2F5IDxjb2RlPmZnPC9jb2RlPiB0byBjb250aW51ZQordGhpcyBiYWNrZ3JvdW5kIHByb2Nlc3MgYXMgYSBmb3JlZ3JvdW5kIHByb2Nlc3MsIGFuZCB0aGVuIHRoaXMKK3Byb2Nlc3MgY2FuIHJlYWQgZnJvbSB0aGUgdGVybWluYWwuIEJ1dCBpZiB0aGUgYmFja2dyb3VuZCBwcm9jZXNzCitpZ25vcmVzIG9yIGJsb2NrcyB0aGUgU0lHVFRJTiBzaWduYWwsIG9yIGlmIGl0cyBwcm9jZXNzIGdyb3VwCitpcyBvcnBoYW5lZCAoc2VlIGJlbG93KSwgdGhlbiB0aGUgcmVhZCgpIHJldHVybnMgYW4gRUlPIGVycm9yLAorYW5kIG5vIHNpZ25hbCBpcyBzZW50LiAoSW5kZWVkLCB0aGUgaWRlYSBpcyB0byB0ZWxsIHRoZSBwcm9jZXNzCit0aGF0IHJlYWRpbmcgZnJvbSB0aGUgdGVybWluYWwgaXMgbm90IGFsbG93ZWQgcmlnaHQgbm93LgorSWYgaXQgd291bGRuJ3Qgc2VlIHRoZSBzaWduYWwsIHRoZW4gaXQgd2lsbCBzZWUgdGhlIGVycm9yIHJldHVybi4pCis8L3A+PHA+V2hlbiBhIGJhY2tncm91bmQgcHJvY2VzcyB3cml0ZXMgdG8gdGhlIHRlcm1pbmFsLCBpdCBtYXkgZ2V0CithIFNJR1RUT1Ugc2lnbmFsLiBNYXk6IG5hbWVseSwgd2hlbiB0aGUgZmxhZyB0aGF0IHRoaXMgbXVzdCBoYXBwZW4KK2lzIHNldCAoaXQgaXMgb2ZmIGJ5IGRlZmF1bHQpLiBPbmUgY2FuIHNldCB0aGUgZmxhZyBieQorPC9wPjxibG9ja3F1b3RlPgorPHByZT4lIHN0dHkgdG9zdG9wCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworYW5kIGNsZWFyIGl0IGFnYWluIGJ5Cis8YmxvY2txdW90ZT4KKzxwcmU+JSBzdHR5IC10b3N0b3AKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCithbmQgaW5zcGVjdCBpdCBieQorPGJsb2NrcXVvdGU+Cis8cHJlPiUgc3R0eSAtYQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0FnYWluLCBpZiBUT1NUT1AgaXMgc2V0IGJ1dCB0aGUgYmFja2dyb3VuZCBwcm9jZXNzIGlnbm9yZXMgb3IgYmxvY2tzCit0aGUgU0lHVFRPVSBzaWduYWwsIG9yIGlmIGl0cyBwcm9jZXNzIGdyb3VwIGlzIG9ycGhhbmVkIChzZWUgYmVsb3cpLAordGhlbiB0aGUgd3JpdGUoKSByZXR1cm5zIGFuIEVJTyBlcnJvciwgYW5kIG5vIHNpZ25hbCBpcyBzZW50LgorPHA+Cis8L3A+PGgzPk9ycGhhbmVkIHByb2Nlc3MgZ3JvdXBzPC9oMz4KKworPHA+VGhlIHByb2Nlc3MgZ3JvdXAgbGVhZGVyIGlzIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIHByb2Nlc3MgZ3JvdXAuCitJdCBtYXkgdGVybWluYXRlIGJlZm9yZSB0aGUgb3RoZXJzLCBhbmQgdGhlbiB0aGUgcHJvY2VzcyBncm91cCBpcword2l0aG91dCBsZWFkZXIuCis8L3A+PHA+QSBwcm9jZXNzIGdyb3VwIGlzIGNhbGxlZCA8aT5vcnBoYW5lZDwvaT4gd2hlbiA8aT50aGUKK3BhcmVudCBvZiBldmVyeSBtZW1iZXIgaXMgZWl0aGVyIGluIHRoZSBwcm9jZXNzIGdyb3VwCitvciBvdXRzaWRlIHRoZSBzZXNzaW9uPC9pPi4KK0luIHBhcnRpY3VsYXIsIHRoZSBwcm9jZXNzIGdyb3VwIG9mIHRoZSBzZXNzaW9uIGxlYWRlcgoraXMgYWx3YXlzIG9ycGhhbmVkLgorPC9wPjxwPklmIHRlcm1pbmF0aW9uIG9mIGEgcHJvY2VzcyBjYXVzZXMgYSBwcm9jZXNzIGdyb3VwIHRvIGJlY29tZQorb3JwaGFuZWQsIGFuZCBzb21lIG1lbWJlciBpcyBzdG9wcGVkLCB0aGVuIGFsbCBhcmUgc2VudCBmaXJzdCBTSUdIVVAKK2FuZCB0aGVuIFNJR0NPTlQuCis8L3A+PHA+VGhlIGlkZWEgaXMgdGhhdCBwZXJoYXBzIHRoZSBwYXJlbnQgb2YgdGhlIHByb2Nlc3MgZ3JvdXAgbGVhZGVyCitpcyBhIGpvYiBjb250cm9sIHNoZWxsLiAoSW4gdGhlIHNhbWUgc2Vzc2lvbiBidXQgYSBkaWZmZXJlbnQKK3Byb2Nlc3MgZ3JvdXAuKSBBcyBsb25nIGFzIHRoaXMgcGFyZW50IGlzIGFsaXZlLCBpdCBjYW4KK2hhbmRsZSB0aGUgc3RvcHBpbmcgYW5kIHN0YXJ0aW5nIG9mIG1lbWJlcnMgaW4gdGhlIHByb2Nlc3MgZ3JvdXAuCitXaGVuIGl0IGRpZXMsIHRoZXJlIG1heSBiZSBub2JvZHkgdG8gY29udGludWUgc3RvcHBlZCBwcm9jZXNzZXMuCitUaGVyZWZvcmUsIHRoZXNlIHN0b3BwZWQgcHJvY2Vzc2VzIGFyZSBzZW50IFNJR0hVUCwgc28gdGhhdCB0aGV5CitkaWUgdW5sZXNzIHRoZXkgY2F0Y2ggb3IgaWdub3JlIGl0LCBhbmQgdGhlbiBTSUdDT05UIHRvIGNvbnRpbnVlIHRoZW0uCis8L3A+PHA+Tm90ZSB0aGF0IHRoZSBwcm9jZXNzIGdyb3VwIG9mIHRoZSBzZXNzaW9uIGxlYWRlciBpcyBhbHJlYWR5CitvcnBoYW5lZCwgc28gbm8gc2lnbmFscyBhcmUgc2VudCB3aGVuIHRoZSBzZXNzaW9uIGxlYWRlciBkaWVzLgorPC9wPjxwPk5vdGUgYWxzbyB0aGF0IGEgcHJvY2VzcyBncm91cCBjYW4gYmVjb21lIG9ycGhhbmVkIGluIHR3byB3YXlzCitieSB0ZXJtaW5hdGlvbiBvZiBhIHByb2Nlc3M6IGVpdGhlciBpdCB3YXMgYSBwYXJlbnQgYW5kIG5vdCBpdHNlbGYKK2luIHRoZSBwcm9jZXNzIGdyb3VwLCBvciBpdCB3YXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcHJvY2VzcyBncm91cAord2l0aCBhIHBhcmVudCBvdXRzaWRlIGJ1dCBpbiB0aGUgc2FtZSBzZXNzaW9uLgorRnVydGhlcm1vcmUsIHRoYXQgYSBwcm9jZXNzIGdyb3VwIGNhbiBiZWNvbWUgb3JwaGFuZWQKK290aGVyIHRoYW4gYnkgdGVybWluYXRpb24gb2YgYSBwcm9jZXNzLCBuYW1lbHkgd2hlbiBzb21lCittZW1iZXIgaXMgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcHJvY2VzcyBncm91cC4KKzwvcD48cD4KKzwvcD48aDI+PGEgbmFtZT0ic3MxMC4zIj4xMC4zIFNlc3Npb25zPC9hPgorPC9oMj4KKworPHA+RXZlcnkgcHJvY2VzcyBncm91cCBpcyBpbiBhIHVuaXF1ZSA8aT5zZXNzaW9uPC9pPi4KKyhXaGVuIHRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQsIGl0IGJlY29tZXMgYSBtZW1iZXIgb2YgdGhlIHNlc3Npb24KK29mIGl0cyBwYXJlbnQuKQorQnkgY29udmVudGlvbiwgdGhlIHNlc3Npb24gSUQgb2YgYSBzZXNzaW9uCitlcXVhbHMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgc2Vzc2lvbiwKK2NhbGxlZCB0aGUgPGk+c2Vzc2lvbiBsZWFkZXI8L2k+LgorQSBwcm9jZXNzIGZpbmRzIHRoZSBJRCBvZiBpdHMgc2Vzc2lvbiB1c2luZyB0aGUgc3lzdGVtIGNhbGwKKzxjb2RlPmdldHNpZCgpPC9jb2RlPi4KKzwvcD48cD5FdmVyeSBzZXNzaW9uIG1heSBoYXZlIGEgPGk+Y29udHJvbGxpbmcgdHR5PC9pPiwKK3RoYXQgdGhlbiBhbHNvIGlzIGNhbGxlZCB0aGUgY29udHJvbGxpbmcgdHR5IG9mIGVhY2ggb2YKK2l0cyBtZW1iZXIgcHJvY2Vzc2VzLgorQSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBjb250cm9sbGluZyB0dHkgaXMgb2J0YWluZWQgYnkKK29wZW5pbmcgPGNvZGU+L2Rldi90dHk8L2NvZGU+LiAoQW5kIHdoZW4gdGhhdCBmYWlscywgdGhlcmUgd2FzIG5vCitjb250cm9sbGluZyB0dHkuKSBHaXZlbiBhIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGNvbnRyb2xsaW5nIHR0eSwKK29uZSBtYXkgb2J0YWluIHRoZSBTSUQgdXNpbmcgPGNvZGU+dGNnZXRzaWQoZmQpPC9jb2RlPi4KKzwvcD48cD5BIHNlc3Npb24gaXMgb2Z0ZW4gc2V0IHVwIGJ5IGEgbG9naW4gcHJvY2Vzcy4gVGhlIHRlcm1pbmFsCitvbiB3aGljaCBvbmUgaXMgbG9nZ2VkIGluIHRoZW4gYmVjb21lcyB0aGUgY29udHJvbGxpbmcgdHR5CitvZiB0aGUgc2Vzc2lvbi4gQWxsIHByb2Nlc3NlcyB0aGF0IGFyZSBkZXNjZW5kYW50cyBvZiB0aGUKK2xvZ2luIHByb2Nlc3Mgd2lsbCBpbiBnZW5lcmFsIGJlIG1lbWJlcnMgb2YgdGhlIHNlc3Npb24uCis8L3A+PHA+Cis8L3A+PGgzPkNyZWF0aW9uPC9oMz4KKworPHA+QSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkIGJ5Cis8L3A+PGJsb2NrcXVvdGU+Cis8cHJlPnBpZCA9IHNldHNpZCgpOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1RoaXMgaXMgYWxsb3dlZCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBub3QgYSBwcm9jZXNzIGdyb3VwIGxlYWRlci4KK0luIG9yZGVyIHRvIGJlIHN1cmUgb2YgdGhhdCB3ZSBmb3JrIGZpcnN0OgorPGJsb2NrcXVvdGU+Cis8cHJlPnAgPSBmb3JrKCk7CitpZiAocCkgZXhpdCgwKTsKK3BpZCA9IHNldHNpZCgpOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1RoZSByZXN1bHQgaXMgdGhhdCB0aGUgY3VycmVudCBwcm9jZXNzICh3aXRoIHByb2Nlc3MgSUQgPGNvZGU+cGlkPC9jb2RlPikKK2JlY29tZXMgc2Vzc2lvbiBsZWFkZXIgb2YgYSBuZXcgc2Vzc2lvbiB3aXRoIHNlc3Npb24gSUQgPGNvZGU+cGlkPC9jb2RlPi4KK01vcmVvdmVyLCBpdCBiZWNvbWVzIHByb2Nlc3MgZ3JvdXAgbGVhZGVyIG9mIGEgbmV3IHByb2Nlc3MgZ3JvdXAuCitCb3RoIHNlc3Npb24gYW5kIHByb2Nlc3MgZ3JvdXAgY29udGFpbiBvbmx5IHRoZSBzaW5nbGUgcHJvY2VzcyA8Y29kZT5waWQ8L2NvZGU+LgorRnVydGhlcm1vcmUsIHRoaXMgcHJvY2VzcyBoYXMgbm8gY29udHJvbGxpbmcgdHR5LgorPHA+VGhlIHJlc3RyaWN0aW9uIHRoYXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBtdXN0IG5vdCBiZSBhIHByb2Nlc3MgZ3JvdXAgbGVhZGVyCitpcyBuZWVkZWQ6IG90aGVyd2lzZSBpdHMgUElEIHNlcnZlcyBhcyBQR0lEIG9mIHNvbWUgZXhpc3RpbmcgcHJvY2VzcyBncm91cAorYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHRoZSBQR0lEIG9mIGEgbmV3IHByb2Nlc3MgZ3JvdXAuCis8L3A+PHA+Cis8L3A+PGgzPkdldHRpbmcgYSBjb250cm9sbGluZyB0dHk8L2gzPgorCis8cD5Ib3cgZG9lcyBvbmUgZ2V0IGEgY29udHJvbGxpbmcgdGVybWluYWw/IE5vYm9keSBrbm93cywKK3RoaXMgaXMgYSBncmVhdCBteXN0ZXJ5LgorPC9wPjxwPlRoZSBTeXN0ZW0gViBhcHByb2FjaCBpcyB0aGF0IHRoZSBmaXJzdCB0dHkgb3BlbmVkIGJ5IHRoZSBwcm9jZXNzCitiZWNvbWVzIGl0cyBjb250cm9sbGluZyB0dHkuCis8L3A+PHA+VGhlIEJTRCBhcHByb2FjaCBpcyB0aGF0IG9uZSBoYXMgdG8gZXhwbGljaXRseSBjYWxsCis8L3A+PGJsb2NrcXVvdGU+Cis8cHJlPmlvY3RsKGZkLCBUSU9DU0NUVFksIDAvMSk7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKwordG8gZ2V0IGEgY29udHJvbGxpbmcgdHR5LgorPHA+TGludXggdHJpZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGJvdGgsIGFzIGFsd2F5cywgYW5kIHRoaXMKK3Jlc3VsdHMgaW4gYSB2ZXJ5IG9ic2N1cmUgY29tcGxleCBvZiBjb25kaXRpb25zLiBSb3VnaGx5OgorPC9wPjxwPlRoZSA8Y29kZT5USU9DU0NUVFk8L2NvZGU+IGlvY3RsIHdpbGwgZ2l2ZSB1cyBhIGNvbnRyb2xsaW5nIHR0eSwKK3Byb3ZpZGVkIHRoYXQgKGkpIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYSBzZXNzaW9uIGxlYWRlciwKK2FuZCAoaWkpIGl0IGRvZXMgbm90IHlldCBoYXZlIGEgY29udHJvbGxpbmcgdHR5LCBhbmQKKyhpaWkpIG1heWJlIHRoZSB0dHkgc2hvdWxkIG5vdCBhbHJlYWR5IGNvbnRyb2wgc29tZSBvdGhlciBzZXNzaW9uOworaWYgaXQgZG9lcyBpdCBpcyBhbiBlcnJvciBpZiB3ZSBhcmVuJ3Qgcm9vdCwgb3Igd2Ugc3RlYWwgdGhlIHR0eQoraWYgd2UgYXJlIGFsbC1wb3dlcmZ1bC4KK1t2ZGE6IGNvcnJlY3Rpb246IHRoaXJkIHBhcmFtZXRlciBjb250cm9scyB0aGlzOiBpZiAxLCB3ZSBzdGVhbCB0dHkgZnJvbQorYW55IHN1Y2ggc2Vzc2lvbiwgaWYgMCwgd2UgZG9uJ3Qgc3RlYWxdCis8L3A+PHA+T3BlbmluZyBzb21lIHRlcm1pbmFsIHdpbGwgZ2l2ZSB1cyBhIGNvbnRyb2xsaW5nIHR0eSwKK3Byb3ZpZGVkIHRoYXQgKGkpIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYSBzZXNzaW9uIGxlYWRlciwgYW5kCisoaWkpIGl0IGRvZXMgbm90IHlldCBoYXZlIGEgY29udHJvbGxpbmcgdHR5LCBhbmQKKyhpaWkpIHRoZSB0dHkgZG9lcyBub3QgYWxyZWFkeSBjb250cm9sIHNvbWUgb3RoZXIgc2Vzc2lvbiwgYW5kCisoaXYpIHRoZSBvcGVuIGRpZCBub3QgaGF2ZSB0aGUgPGNvZGU+T19OT0NUVFk8L2NvZGU+IGZsYWcsIGFuZAorKHYpIHRoZSB0dHkgaXMgbm90IHRoZSBmb3JlZ3JvdW5kIFZULCBhbmQKKyh2aSkgdGhlIHR0eSBpcyBub3QgdGhlIGNvbnNvbGUsIGFuZAorKHZpaSkgbWF5YmUgdGhlIHR0eSBzaG91bGQgbm90IGJlIG1hc3RlciBvciBzbGF2ZSBwdHkuCis8L3A+PHA+Cis8L3A+PGgzPkdldHRpbmcgcmlkIG9mIGEgY29udHJvbGxpbmcgdHR5PC9oMz4KKworPHA+SWYgYSBwcm9jZXNzIHdhbnRzIHRvIGNvbnRpbnVlIGFzIGEgZGFlbW9uLCBpdCBtdXN0IGRldGFjaCBpdHNlbGYKK2Zyb20gaXRzIGNvbnRyb2xsaW5nIHR0eS4gQWJvdmUgd2Ugc2F3IHRoYXQgPGNvZGU+c2V0c2lkKCk8L2NvZGU+Cit3aWxsIHJlbW92ZSB0aGUgY29udHJvbGxpbmcgdHR5LiBBbHNvIHRoZSBpb2N0bCBUSU9DTk9UVFkgZG9lcyB0aGlzLgorTW9yZW92ZXIsIGluIG9yZGVyIG5vdCB0byBnZXQgYSBjb250cm9sbGluZyB0dHkgYWdhaW4gYXMgc29vbiBhcyBpdAorb3BlbnMgYSB0dHksIHRoZSBwcm9jZXNzIGhhcyB0byBmb3JrIG9uY2UgbW9yZSwgdG8gYXNzdXJlIHRoYXQgaXQKK2lzIG5vdCBhIHNlc3Npb24gbGVhZGVyLiBUeXBpY2FsIGNvZGUgZnJhZ21lbnQ6Cis8L3A+PHA+Cis8L3A+PHByZT4gICAgICAgIGlmICgoZm9yaygpKSAhPSAwKQorICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIHNldHNpZCgpOworICAgICAgICBpZiAoKGZvcmsoKSkgIT0gMCkKKyAgICAgICAgICAgICAgICBleGl0KDApOworPC9wcmU+Cis8cD5TZWUgYWxzbyA8Y29kZT5kYWVtb24oMyk8L2NvZGU+LgorPC9wPjxwPgorPC9wPjxoMz5EaXNjb25uZWN0PC9oMz4KKworPHA+SWYgdGhlIHRlcm1pbmFsIGdvZXMgYXdheSBieSBtb2RlbSBoYW5ndXAsIGFuZCB0aGUgbGluZSB3YXMgbm90IGxvY2FsLAordGhlbiBhIFNJR0hVUCBpcyBzZW50IHRvIHRoZSBzZXNzaW9uIGxlYWRlci4KK0FueSBmdXJ0aGVyIHJlYWRzIGZyb20gdGhlIGdvbmUgdGVybWluYWwgcmV0dXJuIEVPRi4KKyhPciBwb3NzaWJseSAtMSB3aXRoIDxjb2RlPmVycm5vPC9jb2RlPiBzZXQgdG8gRUlPLikKKzwvcD48cD5JZiB0aGUgdGVybWluYWwgaXMgdGhlIHNsYXZlIHNpZGUgb2YgYSBwc2V1ZG90dHksIGFuZCB0aGUgbWFzdGVyIHNpZGUKK2lzIGNsb3NlZCAoZm9yIHRoZSBsYXN0IHRpbWUpLCB0aGVuIGEgU0lHSFVQIGlzIHNlbnQgdG8gdGhlIGZvcmVncm91bmQKK3Byb2Nlc3MgZ3JvdXAgb2YgdGhlIHNsYXZlIHNpZGUuCis8L3A+PHA+V2hlbiB0aGUgc2Vzc2lvbiBsZWFkZXIgZGllcywgYSBTSUdIVVAgaXMgc2VudCB0byBhbGwgcHJvY2Vzc2VzCitpbiB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwLiBNb3Jlb3ZlciwgdGhlIHRlcm1pbmFsIHN0b3BzIGJlaW5nCit0aGUgY29udHJvbGxpbmcgdGVybWluYWwgb2YgdGhpcyBzZXNzaW9uIChzbyB0aGF0IGl0IGNhbiBiZWNvbWUKK3RoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBvZiBhbm90aGVyIHNlc3Npb24pLgorPC9wPjxwPlRodXMsIGlmIHRoZSB0ZXJtaW5hbCBnb2VzIGF3YXkgYW5kIHRoZSBzZXNzaW9uIGxlYWRlciBpcworYSBqb2IgY29udHJvbCBzaGVsbCwgdGhlbiBpdCBjYW4gaGFuZGxlIHRoaW5ncyBmb3IgaXRzIGRlc2NlbmRhbnRzLAorZS5nLiBieSBzZW5kaW5nIHRoZW0gYWdhaW4gYSBTSUdIVVAuCitJZiBvbiB0aGUgb3RoZXIgaGFuZCB0aGUgc2Vzc2lvbiBsZWFkZXIgaXMgYW4gaW5ub2NlbnQgcHJvY2VzcwordGhhdCBkb2VzIG5vdCBjYXRjaCBTSUdIVVAsIGl0IHdpbGwgZGllLCBhbmQgYWxsIGZvcmVncm91bmQgcHJvY2Vzc2VzCitnZXQgYSBTSUdIVVAuCis8L3A+PHA+Cis8L3A+PGgyPjxhIG5hbWU9InNzMTAuNCI+MTAuNCBUaHJlYWRzPC9hPgorPC9oMj4KKworPHA+QSBwcm9jZXNzIGNhbiBoYXZlIHNldmVyYWwgdGhyZWFkcy4gTmV3IHRocmVhZHMgKHdpdGggdGhlIHNhbWUgUElECithcyB0aGUgcGFyZW50IHRocmVhZCkgYXJlIHN0YXJ0ZWQgdXNpbmcgdGhlIDxjb2RlPmNsb25lPC9jb2RlPiBzeXN0ZW0KK2NhbGwgdXNpbmcgdGhlIDxjb2RlPkNMT05FX1RIUkVBRDwvY29kZT4gZmxhZy4gVGhyZWFkcyBhcmUgZGlzdGluZ3Vpc2hlZAorYnkgYSA8aT50aHJlYWQgSUQ8L2k+IChUSUQpLiBBbiBvcmRpbmFyeSBwcm9jZXNzIGhhcyBhIHNpbmdsZSB0aHJlYWQKK3dpdGggVElEIGVxdWFsIHRvIFBJRC4gVGhlIHN5c3RlbSBjYWxsIDxjb2RlPmdldHRpZCgpPC9jb2RlPiByZXR1cm5zIHRoZQorVElELiBUaGUgc3lzdGVtIGNhbGwgPGNvZGU+dGtpbGwoKTwvY29kZT4gc2VuZHMgYSBzaWduYWwgdG8gYSBzaW5nbGUgdGhyZWFkLgorPC9wPjxwPkV4YW1wbGU6IGEgcHJvY2VzcyB3aXRoIHR3byB0aHJlYWRzLiBCb3RoIG9ubHkgcHJpbnQgUElEIGFuZCBUSUQgYW5kIGV4aXQuCisoTGludXggMi40LjE5IG9yIGxhdGVyLikKKzwvcD48cHJlPiUgY2F0ICZsdDsmbHQ7IEVPRiAmZ3Q7IGdldHRpZC1kZW1vLmMKKyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKKyNpbmNsdWRlICZsdDtzeXMvdHlwZXMuaCZndDsKKyNkZWZpbmUgQ0xPTkVfU0lHSEFORCAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQ0xPTkVfVEhSRUFEICAgIDB4MDAwMTAwMDAKKyNpbmNsdWRlICZsdDtsaW51eC91bmlzdGQuaCZndDsKKyNpbmNsdWRlICZsdDtlcnJuby5oJmd0OworX3N5c2NhbGwwKHBpZF90LGdldHRpZCkKKworaW50IHRocmVhZCh2b2lkICpwKSB7CisgICAgICAgIHByaW50ZigidGhyZWFkOiAlZCAlZFxuIiwgZ2V0dGlkKCksIGdldHBpZCgpKTsKK30KKworbWFpbigpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzdGFja1s0MDk2XTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaSA9IGNsb25lKHRocmVhZCwgc3RhY2srMjA0OCwgQ0xPTkVfVEhSRUFEIHwgQ0xPTkVfU0lHSEFORCwgTlVMTCk7CisgICAgICAgIGlmIChpID09IC0xKQorICAgICAgICAgICAgICAgIHBlcnJvcigiY2xvbmUiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiY2xvbmUgcmV0dXJucyAlZFxuIiwgaSk7CisgICAgICAgIHByaW50ZigicGFyZW50OiAlZCAlZFxuIiwgZ2V0dGlkKCksIGdldHBpZCgpKTsKK30KK0VPRgorJSBjYyAtbyBnZXR0aWQtZGVtbyBnZXR0aWQtZGVtby5jCislIC4vZ2V0dGlkLWRlbW8KK2Nsb25lIHJldHVybnMgMjE4MjYKK3BhcmVudDogMjE4MjUgMjE4MjUKK3RocmVhZDogMjE4MjYgMjE4MjUKKyUKKzwvcHJlPgorPHA+Cis8L3A+PHA+Cis8L3A+PGhyPgorCis8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZG9jcy9kcmFmdC1jb2FyLWNnaS12MTEtMDMtY2xlYW4uaHRtbCBiL2J1c3lib3gtMS4xOS4zL2RvY3MvZHJhZnQtY29hci1jZ2ktdjExLTAzLWNsZWFuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyYzliOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2RvY3MvZHJhZnQtY29hci1jZ2ktdjExLTAzLWNsZWFuLmh0bWwKQEAgLTAsMCArMSwyNjc0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCisgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvbG9vc2UuZHRkIj4KKzxIVE1MPgorIDxIRUFEPgorICA8VElUTEU+Q29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIC0gMS4xICpEcmFmdCAwMyogW2h0dHA6Ly9jZ2ktc3BlYy5nb2x1eC5jb20vZHJhZnQtY29hci1jZ2ktdjExLTAzLWNsZWFuLmh0bWxdCisgIDwvVElUTEU+Cis8IS0tI2lmIGV4cHI9IiRIVFRQX1VTRVJfQUdFTlQgIT0gL0x5bngvIiAtLT4KKyA8IS0tI3NldCB2YXI9IkdVSSIgdmFsdWU9IjEiIC0tPgorPCEtLSNlbmRpZiAtLT4KKyAgPExJTksgSFJFRj0ibWFpbHRvOktlbi5Db2FyQEdvbHV4LkNvbSIgcmV2PSJyZXZpc2VkIj4KKyAgPExJTksgUkVMPSJTVFlMRVNIRUVUIiBIUkVGPSJjZ2lwLXN0eWxlLXJmYy5jc3MiIFRZUEU9InRleHQvY3NzIj4KKyAgPE1FVEEgbmFtZT0ibGF0ZXhzdHlsZSIgY29udGVudD0icmZjIj4KKyAgPE1FVEEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJLZW4gQSBMIENvYXIiPgorICA8TUVUQSBuYW1lPSJpbnN0aXR1dGUiIGNvbnRlbnQ9IklCTSBDb3Jwb3JhdGlvbiI+CisgIDxNRVRBIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjI1IEp1bmUgMTk5OSI+CisgIDxNRVRBIG5hbWU9ImV4cGlyZXMiIGNvbnRlbnQ9IkV4cGlyZXMgMzEgRGVjZW1iZXIgMTk5OSI+CisgIDxNRVRBIG5hbWU9ImRvY3VtZW50IiBjb250ZW50PSJJTlRFUk5FVC1EUkFGVCI+CisgIDxNRVRBIG5hbWU9ImZpbGUiIGNvbnRlbnQ9IiZsdDtkcmFmdC1jb2FyLWNnaS12MTEtMDMudHh0Jmd0OyI+CisgIDxNRVRBIG5hbWU9Imdyb3VwIiBjb250ZW50PSJJTlRFUk5FVC1EUkFGVCI+Cis8IS0tCisgICAgVGhlcmUgYXJlIGEgbG90IG9mIEJORiBmcmFnbWVudHMgaW4gdGhpcyBkb2N1bWVudC4gIFRvIG1ha2UgaXQgd29yaworICAgIGluIGFsbCBwb3NzaWJsZSBicm93c2VycyAoaW5jbHVkaW5nIEx5bngsIHdoaWNoIGlzIHVzZWQgdG8gdHVybiBpdAorICAgIGludG8gdGV4dC9wbGFpbiksIHdlIGhhbmRsZSB0aGVzZSBieSB1c2luZyBQUkVmb3JtYXR0ZWQgYmxvY2tzIHdpdGgKKyAgICBhIHVuaXZlcnNhbCBpbnRlcm5hbCBtYXJnaW4gb2YgMiwgaW5zaWRlIG9uZS1sZXZlbCBETCBibG9ja3MuCisgLS0+CisgPC9IRUFEPgorIDxCT0RZPgorICA8IS0tCisgICAgSFRNTCBkb2Vzbid0IGRvIHBhcGVyIHBhZ2luYXRpb24sIHNvIHdlIG5lZWQgdG8gZmFrZSBpdCBvdXQuICBCYXNpbmcKKyAgICBvdXIgZm9ybWF0dGluZyB1cG9uIFJGQzIwNjgsIHRoZXJlIGFyZSBmb3VyICg0KSBsaW5lcyBvZiBoZWFkZXIgYW5kCisgICAgZm91ciAoNCkgbGluZXMgb2YgZm9vdGVyIGZvciBlYWNoIHBhZ2UuCisKKzxESVYgQUxJR049IkNFTlRFUiI+CisgPFBSRT4KKworCisKKworQ29hciwgZXQgYWwuICAgICAgICAgICAgICAgQ0dJLzEuMSBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgTWF5LCAxOTk4CitJTlRFUk5FVC1EUkFGVCAgICAgICAgICAgICBFeHBpcmVzIDEgRGVjZW1iZXIgMTk5OCAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMl0KKworCisgPC9QUkU+Cis8L0RJVj4KKyAgLS0+CisgIDwhLS0KKyAgICBUaGUgZm9sbG93aW5nIHdlaXJkbmVzcyB3cnQgbm9uLWJyZWFraW5nIHNwYWNlcyBpcyB0byBnZXQgTHlueAorICAgICh3aGljaCBpcyBiYXJlbHkgVEFCTEUtYXdhcmUpIHRvIGxpbmUgdGhlIGxlZnQvcmlnaHQganVzdGlmaWVkCisgICAgdGV4dCB1cCBwcm9wZXJseS4KKyAgLS0+CisgIDxESVYgQUxJR049IkNFTlRFUiI+CisgICA8VEFCTEUgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPTAgQ0VMTFNQQUNJTkc9MD4KKyAgICA8VFIgVkFMSUdOPSJUT1AiPgorICAgICA8VEQgQUxJR049IkxFRlQiPgorICAgICAgSU5URVJORVQtRFJBRlQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyAgICAgPC9URD4KKyAgICAgPFREIEFMSUdOPSJSSUdIVCI+CisgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtLZW4gQSBMIENvYXIKKyAgICAgPC9URD4KKyAgICA8L1RSPgorICAgIDxUUiBWQUxJR049IlRPUCI+CisgICAgIDxURCBBTElHTj0iTEVGVCI+CisgICAgICBkcmFmdC1jb2FyLWNnaS12MTEtMDMue2h0bWwsdHh0fSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworICAgICA8L1REPgorICAgICA8VEQgQUxJR049IlJJR0hUIj4KKyAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lCTSBDb3Jwb3JhdGlvbgorICAgICA8L1REPgorICAgIDwvVFI+CisgICAgPFRSIFZBTElHTj0iVE9QIj4KKyAgICAgPFREIEFMSUdOPSJMRUZUIj4KKyAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworICAgICA8L1REPgorICAgICA8VEQgQUxJR049IlJJR0hUIj4KKyAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0QuUi5ULiBSb2JpbnNvbgorICAgICA8L1REPgorICAgIDwvVFI+CisgICAgPFRSIFZBTElHTj0iVE9QIj4KKyAgICAgPFREIEFMSUdOPSJMRUZUIj4KKyAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworICAgICA8L1REPgorICAgICA8VEQgQUxJR049IlJJR0hUIj4KKyAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0UqVFJBREUmbmJzcDtVSyZuYnNwO0x0ZC4KKyAgICAgPC9URD4KKyAgICA8L1RSPgorICAgIDxUUiBWQUxJR049IlRPUCI+CisgICAgIDxURCBBTElHTj0iTEVGVCI+CisgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyAgICAgPC9URD4KKyAgICAgPFREIEFMSUdOPSJSSUdIVCI+CisgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyNSBKdW5lIDE5OTkKKyAgICAgPC9URD4KKyAgICA8L1RSPgorICAgPC9UQUJMRT4KKyAgPC9ESVY+CisKKyAgPEgxIEFMSUdOPSJDRU5URVIiPgorICAgVGhlIFdXVyBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UKKyAgIDxCUj4KKyAgIFZlcnNpb24gMS4xCisgIDwvSDE+CisKKzwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJJLUQtc3RhdGVtZW50IiAtLT4KKworICA8SDI+CisgICA8QSBOQU1FPSJBYnN0cmFjdCI+CisgICAgQWJzdHJhY3QKKyAgIDwvQT4KKyAgPC9IMj4KKyAgPFA+CisgIFRoZSBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UgKENHSSkgaXMgYSBzaW1wbGUgaW50ZXJmYWNlIGZvciBydW5uaW5nCisgIGV4dGVybmFsIHByb2dyYW1zLCBzb2Z0d2FyZSBvciBnYXRld2F5cyB1bmRlciBhbiBpbmZvcm1hdGlvbiBzZXJ2ZXIKKyAgaW4gYSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBtYW5uZXIuIEN1cnJlbnRseSwgdGhlIHN1cHBvcnRlZCBpbmZvcm1hdGlvbgorICBzZXJ2ZXJzIGFyZSBIVFRQIHNlcnZlcnMuCisgIDwvUD4KKyAgPFA+CisgIFRoZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW4gdXNlIGJ5IHRoZSBXb3JsZC1XaWRlIFdlYiBzaW5jZSAxOTkzLiBUaGlzCisgIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aGUKKyAgImN1cnJlbnQgcHJhY3RpY2UiIHBhcmFtZXRlcnMgb2YgdGhlCisgICdDR0kvMS4xJyBpbnRlcmZhY2UgZGV2ZWxvcGVkIGFuZCBkb2N1bWVudGVkIGF0IHRoZSBVLlMuIE5hdGlvbmFsCisgIENlbnRyZSBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIFtOQ1NBLUNHSV0uCisgIFRoaXMgZG9jdW1lbnQgYWxzbyBkZWZpbmVzIHRoZSB1c2Ugb2YgdGhlIENHSS8xLjEgaW50ZXJmYWNlCisgIG9uIHRoZSBVbml4IGFuZCBBbWlnYURPUyh0bSkgc3lzdGVtcy4KKyAgPC9QPgorICA8UD4KKyAgRGlzY3Vzc2lvbiBvZiB0aGlzIGRyYWZ0IG9jY3VycyBvbiB0aGUgQ0dJLVdHIG1haWxpbmcgbGlzdDsgc2VlIHRoZQorICBwcm9qZWN0IFdlYiBwYWdlIGF0CisgIDxTQU1QPiZsdDtVUkw6PEEgSFJFRj0iaHR0cDovL0NHSS1TcGVjLkdvbHV4LkNvbS8iCisgICAgICAgICAgICAgICAgPmh0dHA6Ly9DR0ktU3BlYy5Hb2x1eC5Db20vPC9BPiZndDs8L1NBTVA+CisgIGZvciBkZXRhaWxzIG9uIHRoZSBtYWlsaW5nIGxpc3QgYW5kIHRoZSBzdGF0dXMgb2YgdGhlIHByb2plY3QuCisgIDwvUD4KKworPCEtLSNpZiBleHByPSIkR1VJIiAtLT4KKyAgPEgyPgorICAgUmV2aXNpb24gSGlzdG9yeQorICA8L0gyPgorICA8UD4KKyAgVGhlIHJldmlzaW9uIGhpc3Rvcnkgb2YgdGhpcyBkcmFmdCBpcyBiZWluZyBtYWludGFpbmVkIHVzaW5nIFdlYi1iYXNlZAorICBHVUkgbm90YXRpb24sIHN1Y2ggYXMgc3RydWNrLXRocm91Z2ggY2hhcmFjdGVycyBhbmQgY29sb3VyLWNvZGVkCisgIHNlY3Rpb25zLiAgVGhlIGZvbGxvd2luZyBsZWdlbmQgZGVzY3JpYmVzIGhvdyB0byBkZXRlcm1pbmUgdGhlIG9yaWdpbgorICBvZiBhIHBhcnRpY3VsYXIgcmV2aXNpb24gYWNjb3JkaW5nIHRvIHRoZSBjb2xvdXIgb2YgdGhlIHRleHQ6CisgIDwvUD4KKyAgPERMIENPTVBBQ1Q+CisgICA8RFQ+QmxhY2sKKyAgIDwvRFQ+CisgICA8REQ+UmV2aXNpb24gMDAsIHJlbGVhc2VkIDI4IE1heSAxOTk4CisgICA8L0REPgorICAgPERUPkdyZWVuCisgICA8L0RUPgorICAgPEREPlJldmlzaW9uIDAxLCByZWxlYXNlZCAyOCBEZWNlbWJlciAxOTk4CisgICAgPEJSPgorICAgIE1ham9yIHN0cnVjdHVyZSBjaGFuZ2U6IFNlY3Rpb24gNCwgIlJlcXVlc3QgTWV0YWRhdGEgKE1ldGEtVmFyaWFibGVzKSIKKyAgICB3YXMgbW92ZWQgZW50aXJlbHkgdW5kZXIgPEEgSFJFRj0iIzcuMCI+U2VjdGlvbiA3PC9BPiwgIkRhdGEgSW5wdXQgdG8gdGhlCisgICAgQ0dJIFNjcmlwdC4iCisgICAgRHVlIHRvIHRoZSBzaXplIG9mIHRoaXMgY2hhbmdlLCBpdCBpcyBub3RlZCBoZXJlIGFuZCB0aGUgdGV4dCBpbiBpdHMKKyAgICBmb3JtZXIgbG9jYXRpb24gZG9lcyA8RU0+bm90PC9FTT4gYXBwZWFyIGFzIHN0cnVja3Rocm91Z2guICBUaGlzIGhhcworICAgIGNhdXNlZCBtYWpvciA8QSBIUkVGPSIjNi4wIj5zZWN0aW9ucyA1PC9BPiBhbmQgZm9sbG93aW5nIHRvIGRlY3JlbWVudAorICAgIGJ5IG9uZS4gIE90aGVyCisgICAgbGFyZ2UgdGV4dCBtb3ZlbWVudHMgYXJlIGxpa2V3aXNlIG5vdCBtYXJrZWQgdXAuICBSZWZlcmVuY2VzIHRvIFJGQworICAgIDE3Mzggd2VyZSBjaGFuZ2VkIHRvIDIzOTYgKDE3MzgncyByZXBsYWNlbWVudCkuCisgICA8L0REPgorICAgPERUPlJlZAorICAgPC9EVD4KKyAgIDxERD5SZXZpc2lvbiAwMiwgcmVsZWFzZWQgMiBBcHJpbCwgMTk5OQorICAgIDxCUj4KKyAgICBBZGRlZCB0ZXh0IHRvIDxBIEhSRUY9IiM4LjMiPnNlY3Rpb24gOC4zPC9BPiBkZWZpbmluZyBjb3JyZWN0IGhhbmRsaW5nCisgICAgb2YgSFRUUC8xLjEKKyAgICByZXF1ZXN0cyB1c2luZyAiY2h1bmtlZCIgVHJhbnNmZXItRW5jb2RpbmcuICBMYWJlbGxlZCBtZXRhdmFyaWFibGUKKyAgICBuYW1lcyBpbiA8QSBIUkVGPSIjOC4wIj5zZWN0aW9uIDg8L0E+IHdpdGggdGhlIGFwcHJvcHJpYXRlIGRldGFpbCBzZWN0aW9uCisgICAgbnVtYmVycy4KKyAgICBDbGFyaWZpZWQgYWxsb3dlZCB1c2FnZSBvZiA8U0FNUD5TdGF0dXM8L1NBTVA+IGFuZAorICAgIDxTQU1QPkxvY2F0aW9uPC9TQU1QPiByZXNwb25zZSBoZWFkZXIgZmllbGRzLiAgSW5jbHVkZWQgbmV3CisgICAgSW50ZXJuZXQtRHJhZnQgbGFuZ3VhZ2UuCisgICA8L0REPgorICAgPERUPkZ1Y2hzaWEKKyAgIDwvRFQ+CisgICA8REQ+UmV2aXNpb24gMDMsIHJlbGVhc2VkIDI1IEp1bmUgMTk5OQorICAgIDxCUj4KKyAgICBDaGFuZ2VkIHJlZmVyZW5jZXMgZnJvbSAiSFRUUCIgdG8gIlByb3RvY29sLVNwZWNpZmljIiBmb3IgdGhlIGxpc3Rpbmcgb2YKKyAgICB0aGluZ3MgbGlrZSBIVFRQX0FDQ0VQVC4gIENoYW5nZWQgJ2VudGl0eS1ib2R5JyBhbmQgJ2NvbnRlbnQtYm9keScgdG8KKyAgICAnbWVzc2FnZS1ib2R5LicgIEFkZGVkIGEgbm90ZSB0aGF0IHJlc3BvbnNlIGhlYWRlcnMgbXVzdCBjb21wbHkgd2l0aAorICAgIHJlcXVpcmVtZW50cyBvZiB0aGUgcHJvdG9jb2wgbGV2ZWwgaW4gdXNlLiAgQWRkZWQgYSBsb3Qgb2Ygc3R1ZmYgYWJvdXQKKyAgICBzZWN1cml0eSAoc2VjdGlvbiAxMSkuICBDbGFyaWZpZWQgYSBidW5jaCBvZiBwcm9kdWN0aW9ucy4gIFBvaW50ZWQgb3V0CisgICAgdGhhdCB6ZXJvLWxlbmd0aCBhbmQgb21pdHRlZCB2YWx1ZXMgYXJlIGluZGlzdGluZ3Vpc2hhYmxlIGluIHRoaXMKKyAgICBzcGVjaWZpY2F0aW9uLiAgQ2xhcmlmaWVkIHByb2R1Y3Rpb24gZGVzY3JpYmluZyBvcmRlciBvZiBmaWVsZHMgaW4KKyAgICBzY3JpcHQgcmVzcG9uc2UgaGVhZGVyLiAgQ2xhcmlmaWVkIGlzc3VlcyBzdXJyb3VuZGluZyBlbmNvZGluZyBvZgorICAgIGRhdGEuICBBY2tub3dsZWRnZWQgYWRkaXRpb25hbCBjb250cmlidXRvcnMsIGFuZCBjaGFuZ2VkIG9uZSBvZgorICAgIHRoZSBhdXRob3JzJyBhZGRyZXNzZXMuCisgICA8L0REPgorICA8L0RMPgorPCEtLSNlbmRpZiAtLT4KKworICA8SDI+CisgICA8QSBOQU1FPSJDb250ZW50cyI+CisgICAgVGFibGUgb2YgQ29udGVudHMKKyAgIDwvQT4KKyAgPC9IMj4KKyAgPERJViBBTElHTj0iQ0VOVEVSIj4KKyAgIDxQUkU+CisgIDEgSW50cm9kdWN0aW9uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMS4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMS4xIFB1cnBvc2UuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzEuMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDEuMiBSZXF1aXJlbWVudHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAxLjMgU3BlY2lmaWNhdGlvbnMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMS4zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMS40IFRlcm1pbm9sb2d5Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzEuNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgMiBOb3RhdGlvbmFsIENvbnZlbnRpb25zIGFuZCBHZW5lcmljIEdyYW1tYXIuLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMyLjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAyLjEgQXVnbWVudGVkIEJORi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMi4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMi4yIEJhc2ljIFJ1bGVzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzIuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgMyBQcm90b2NvbCBQYXJhbWV0ZXJzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMzLjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAzLjEgVVJMIEVuY29kaW5nLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMy4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMy4yIFRoZSBTY3JpcHQtVVJJLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzMuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgNCBJbnZva2luZyB0aGUgU2NyaXB0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM0LjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDUgVGhlIENHSSBTY3JpcHQgQ29tbWFuZCBMaW5lLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNS4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICA2IERhdGEgSW5wdXQgdG8gdGhlIENHSSBTY3JpcHQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDYuMSBSZXF1ZXN0IE1ldGFkYXRhIChNZXRhdmFyaWFibGVzKS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM2LjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjEgQVVUSF9UWVBFLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjIgQ09OVEVOVF9MRU5HVEguLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjMgQ09OVEVOVF9UWVBFLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjQgR0FURVdBWV9JTlRFUkZBQ0UuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjUgUHJvdG9jb2wtU3BlY2lmaWMgTWV0YXZhcmlhYmxlcy4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjYgUEFUSF9JTkZPLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjcgUEFUSF9UUkFOU0xBVEVELi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjggUVVFUllfU1RSSU5HLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjkgUkVNT1RFX0FERFIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjEwIFJFTU9URV9IT1NULi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjEwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4xMSBSRU1PVEVfSURFTlQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4xMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICA2LjEuMTIgUkVNT1RFX1VTRVIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM2LjEuMTIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjEzIFJFUVVFU1RfTUVUSE9ELi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjEzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4xNCBTQ1JJUFRfTkFNRS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4xNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICA2LjEuMTUgU0VSVkVSX05BTUUuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM2LjEuMTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjE2IFNFUlZFUl9QT1JULi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjE2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4xNyBTRVJWRVJfUFJPVE9DT0wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4xNyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICA2LjEuMTggU0VSVkVSX1NPRlRXQVJFLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM2LjEuMTgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4yIFJlcXVlc3QgTWVzc2FnZS1Cb2RpZXMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICA3IERhdGEgT3V0cHV0IGZyb20gdGhlIENHSSBTY3JpcHQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzcuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDcuMSBOb24tUGFyc2VkIEhlYWRlciBPdXRwdXQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM3LjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICA3LjIgUGFyc2VkIEhlYWRlciBPdXRwdXQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNy4yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDcuMi4xIENHSSBoZWFkZXIgZmllbGRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzcuMi4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgICA3LjIuMS4xIENvbnRlbnQtVHlwZS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzcuMi4xLjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgIDcuMi4xLjIgTG9jYXRpb24uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNy4yLjEuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICAgNy4yLjEuMyBTdGF0dXMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM3LjIuMS4zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgICA3LjIuMS40IEV4dGVuc2lvbiBoZWFkZXIgZmllbGRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzcuMi4xLjMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNy4yLjIgSFRUUCBoZWFkZXIgZmllbGRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNy4yLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDggU2VydmVyIEltcGxlbWVudGF0aW9uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjOC4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgOC4xIFJlcXVpcmVtZW50cyBmb3IgU2VydmVycy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzguMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICA4LjEuMSBTY3JpcHQtVVJJLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM4LjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgOC4xLjIgUmVxdWVzdCBNZXNzYWdlLWJvZHkgSGFuZGxpbmcuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjOC4xLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgOC4xLjMgUmVxdWlyZWQgTWV0YXZhcmlhYmxlcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjOC4xLjMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgOC4xLjQgUmVzcG9uc2UgQ29tcGxpYW5jZS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjOC4xLjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICA4LjIgUmVjb21tZW5kYXRpb25zIGZvciBTZXJ2ZXJzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjOC4yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgOC4zIFN1bW1hcnkgb2YgTWV0YXZhcmlhYmxlcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzguMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgOSBTY3JpcHQgSW1wbGVtZW50YXRpb24uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM5LjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICA5LjEgUmVxdWlyZW1lbnRzIGZvciBTY3JpcHRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjOS4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgOS4yIFJlY29tbWVuZGF0aW9ucyBmb3IgU2NyaXB0cy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzkuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgMTAgU3lzdGVtIFNwZWNpZmljYXRpb25zLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxMC4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMTAuMSBBbWlnYURPUy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzEwLjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAxMC4yIFVuaXguLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMTAuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgMTEgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxMS4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMTEuMSBTYWZlIE1ldGhvZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzExLjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAxMS4yIEhUVFAgSGVhZGVyIEZpZWxkcyBDb250YWluaW5nIFNlbnNpdGl2ZSBJbmZvcm1hdGlvbi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMTEuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDExLjMgU2NyaXB0IEludGVyZmVyZW5jZSB3aXRoIHRoZSBTZXJ2ZXIuLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxMS4zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMTEuNCBEYXRhIExlbmd0aCBhbmQgQnVmZmVyaW5nIENvbnNpZGVyYXRpb25zLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzExLjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAxMS41IFN0YXRlbGVzcyBQcm9jZXNzaW5nLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMTEuNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgMTIgQWNrbm93bGVkZ21lbnRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxMi4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAxMyBSZWZlcmVuY2VzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzEzLjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDE0IEF1dGhvcnMnIEFkZHJlc3Nlcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMTQuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICAgPC9QUkU+CisgIDwvRElWPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjEuMCI+CisgICAgMS4gSW50cm9kdWN0aW9uCisgICA8L0E+CisgIDwvSDI+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iMS4xIj4KKyAgICAxLjEuIFB1cnBvc2UKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFRvZ2V0aGVyIHRoZSBIVFRQIFs8QSBIUkVGPSIjWzNdIj4zPC9BPiw8QSBIUkVGPSIjWzhdIj44PC9BPl0gc2VydmVyCisgIGFuZCB0aGUgQ0dJIHNjcmlwdCBhcmUgcmVzcG9uc2libGUKKyAgZm9yIHNlcnZpY2luZyBhIGNsaWVudAorICByZXF1ZXN0IGJ5IHNlbmRpbmcgYmFjayByZXNwb25zZXMuIFRoZSBjbGllbnQKKyAgcmVxdWVzdCBjb21wcmlzZXMgYSBVbml2ZXJzYWwgUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKQorICBbPEEgSFJFRj0iI1sxXSI+MTwvQT5dLCBhCisgIHJlcXVlc3QgbWV0aG9kLCBhbmQgdmFyaW91cyBhbmNpbGxhcnkKKyAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3QKKyAgcHJvdmlkZWQgYnkgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20uCisgIDwvUD4KKyAgPFA+CisgIFRoZSBDR0kgZGVmaW5lcyB0aGUgYWJzdHJhY3QgcGFyYW1ldGVycywga25vd24gYXMKKyAgbWV0YXZhcmlhYmxlcywKKyAgd2hpY2ggZGVzY3JpYmUgdGhlIGNsaWVudCdzCisgIHJlcXVlc3QuIFRvZ2V0aGVyIHdpdGggYQorICBjb25jcmV0ZSBwcm9ncmFtbWVyIGludGVyZmFjZSB0aGlzIHNwZWNpZmllcyBhIHBsYXRmb3JtLWluZGVwZW5kZW50CisgIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzY3JpcHQgYW5kIHRoZSBIVFRQIHNlcnZlci4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjEuMiI+CisgICAgMS4yLiBSZXF1aXJlbWVudHMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFRoaXMgc3BlY2lmaWNhdGlvbiB1c2VzIHRoZSBzYW1lIHdvcmRzIGFzIFJGQyAxMTIzCisgIFs8QSBIUkVGPSIjWzVdIj41PC9BPl0gdG8gZGVmaW5lIHRoZQorICBzaWduaWZpY2FuY2Ugb2YgZWFjaCBwYXJ0aWN1bGFyIHJlcXVpcmVtZW50LiBUaGVzZSBhcmU6CisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8REw+CisgICA8RFQ+PEVNPk1VU1Q8L0VNPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGlzIHdvcmQgb3IgdGhlIGFkamVjdGl2ZSAncmVxdWlyZWQnIG1lYW5zIHRoYXQgdGhlIGl0ZW0gaXMgYW4KKyAgICBhYnNvbHV0ZSByZXF1aXJlbWVudCBvZiB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxFTT5TSE9VTEQ8L0VNPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGlzIHdvcmQgb3IgdGhlIGFkamVjdGl2ZSAncmVjb21tZW5kZWQnIG1lYW5zIHRoYXQgdGhlcmUgbWF5CisgICAgZXhpc3QgdmFsaWQgcmVhc29ucyBpbiBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZXMgdG8gaWdub3JlIHRoaXMKKyAgICBpdGVtLCBidXQgdGhlIGZ1bGwgaW1wbGljYXRpb25zIHNob3VsZCBiZSB1bmRlcnN0b29kIGFuZCB0aGUgY2FzZQorICAgIGNhcmVmdWxseSB3ZWlnaGVkIGJlZm9yZSBjaG9vc2luZyBhIGRpZmZlcmVudCBjb3Vyc2UuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48RU0+TUFZPC9FTT4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhpcyB3b3JkIG9yIHRoZSBhZGplY3RpdmUgJ29wdGlvbmFsJyBtZWFucyB0aGF0IHRoaXMgaXRlbSBpcworICAgIHRydWx5IG9wdGlvbmFsLiBPbmUgdmVuZG9yIG1heSBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgaXRlbSBiZWNhdXNlCisgICAgYSBwYXJ0aWN1bGFyIG1hcmtldHBsYWNlIHJlcXVpcmVzIGl0IG9yIGJlY2F1c2UgaXQgZW5oYW5jZXMgdGhlCisgICAgcHJvZHVjdCwgZm9yIGV4YW1wbGU7IGFub3RoZXIgdmVuZG9yIG1heSBvbWl0IHRoZSBzYW1lIGl0ZW0uCisgICAgPC9QPgorICAgPC9ERD4KKyAgPC9ETD4KKyAgPFA+CisgIEFuIGltcGxlbWVudGF0aW9uIGlzIG5vdCBjb21wbGlhbnQgaWYgaXQgZmFpbHMgdG8gc2F0aXNmeSBvbmUgb3IgbW9yZQorICBvZiB0aGUgJ211c3QnIHJlcXVpcmVtZW50cyBmb3IgdGhlIHByb3RvY29scyBpdCBpbXBsZW1lbnRzLiBBbgorICBpbXBsZW1lbnRhdGlvbiB0aGF0IHNhdGlzZmllcyBhbGwgb2YgdGhlICdtdXN0JyBhbmQgYWxsIG9mIHRoZQorICAnc2hvdWxkJyByZXF1aXJlbWVudHMgZm9yIGl0cyBmZWF0dXJlcyBpcyBzYWlkIHRvIGJlICd1bmNvbmRpdGlvbmFsbHkKKyAgY29tcGxpYW50Jzsgb25lIHRoYXQgc2F0aXNmaWVzIGFsbCBvZiB0aGUgJ211c3QnIHJlcXVpcmVtZW50cyBidXQgbm90CisgIGFsbCBvZiB0aGUgJ3Nob3VsZCcgcmVxdWlyZW1lbnRzIGZvciBpdHMgZmVhdHVyZXMgaXMgc2FpZCB0byBiZQorICAnY29uZGl0aW9uYWxseSBjb21wbGlhbnQuJworICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iMS4zIj4KKyAgICAxLjMuIFNwZWNpZmljYXRpb25zCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBOb3QgYWxsIG9mIHRoZSBmdW5jdGlvbnMgYW5kIGZlYXR1cmVzIG9mIHRoZSBDR0kgYXJlIGRlZmluZWQgaW4gdGhlCisgIG1haW4gcGFydCBvZiB0aGlzIHNwZWNpZmljYXRpb24uIFRoZSBmb2xsb3dpbmcgcGhyYXNlcyBhcmUgdXNlZCB0bworICBkZXNjcmliZSB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIG5vdCBzcGVjaWZpZWQ6CisgIDwvUD4KKyAgPERMPgorICAgPERUPjxFTT5zeXN0ZW0gZGVmaW5lZDwvRU0+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZSBmZWF0dXJlIG1heSBkaWZmZXIgYmV0d2VlbiBzeXN0ZW1zLCBidXQgbXVzdCBiZSB0aGUgc2FtZSBmb3IKKyAgICBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIHVzaW5nIHRoZSBzYW1lIHN5c3RlbS4gQSBzeXN0ZW0gd2lsbAorICAgIHVzdWFsbHkgaWRlbnRpZnkgYSBjbGFzcyBvZiBvcGVyYXRpbmctc3lzdGVtcy4gU29tZSBzeXN0ZW1zIGFyZQorICAgIGRlZmluZWQgaW4KKyAgICA8QSBIUkVGPSIjMTAuMCIKKyAgICA+c2VjdGlvbiAxMDwvQT4gb2YgdGhpcyBkb2N1bWVudC4KKyAgICBOZXcgc3lzdGVtcyBtYXkgYmUgZGVmaW5lZAorICAgIGJ5IG5ldyBzcGVjaWZpY2F0aW9ucyB3aXRob3V0IHJldmlzaW9uIG9mIHRoaXMgZG9jdW1lbnQuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48RU0+aW1wbGVtZW50YXRpb24gZGVmaW5lZDwvRU0+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZSBiZWhhdmlvdXIgb2YgdGhlIGZlYXR1cmUgbWF5IHZhcnkgZnJvbSBpbXBsZW1lbnRhdGlvbiB0bworICAgIGltcGxlbWVudGF0aW9uLCBidXQgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG11c3QgZG9jdW1lbnQgaXRzCisgICAgYmVoYXZpb3VyLgorICAgIDwvUD4KKyAgIDwvREQ+CisgIDwvREw+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iMS40Ij4KKyAgICAxLjQuIFRlcm1pbm9sb2d5CisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGlzIHNwZWNpZmljYXRpb24gdXNlcyBtYW55IHRlcm1zIGRlZmluZWQgaW4gdGhlIEhUVFAvMS4xCisgIHNwZWNpZmljYXRpb24gWzxBIEhSRUY9IiNbOF0iPjg8L0E+XTsgaG93ZXZlciwgdGhlIGZvbGxvd2luZyB0ZXJtcyBhcmUKKyAgdXNlZCBoZXJlIGluIGEKKyAgc2Vuc2Ugd2hpY2ggbWF5IG5vdCBhY2NvcmQgd2l0aCB0aGVpciBkZWZpbml0aW9ucyBpbiB0aGF0IGRvY3VtZW50LAorICBvciB3aXRoIHRoZWlyIGNvbW1vbiBtZWFuaW5nLgorICA8L1A+CisKKyAgPERMPgorICAgPERUPjxFTT5tZXRhdmFyaWFibGU8L0VNPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBBIG5hbWVkIHBhcmFtZXRlciB0aGF0IGNhcnJpZXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmVyIHRvIHRoZQorICAgIHNjcmlwdC4gSXQgaXMgbm90IG5lY2Vzc2FyaWx5IGEgdmFyaWFibGUgaW4gdGhlIG9wZXJhdGluZy1zeXN0ZW0ncworICAgIGVudmlyb25tZW50LCBhbHRob3VnaCB0aGF0IGlzIHRoZSBtb3N0IGNvbW1vbiBpbXBsZW1lbnRhdGlvbi4KKyAgICA8L1A+CisgICA8L0REPgorCisgICA8RFQ+PEVNPnNjcmlwdDwvRU0+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZSBzb2Z0d2FyZSB3aGljaCBpcyBpbnZva2VkIGJ5IHRoZSBzZXJ2ZXIgPEVNPnZpYTwvRU0+IHRoaXMKKyAgICBpbnRlcmZhY2UuIEl0CisgICAgbmVlZCBub3QgYmUgYSBzdGFuZGFsb25lIHByb2dyYW0sIGJ1dCBjb3VsZCBiZSBhCisgICAgZHluYW1pY2FsbHktbG9hZGVkIG9yIHNoYXJlZCBsaWJyYXJ5LCBvciBldmVuIGEgc3Vicm91dGluZSBpbiB0aGUKKyAgICBzZXJ2ZXIuICBJdCA8RU0+bWF5PC9FTT4gYmUgYSBzZXQgb2Ygc3RhdGVtZW50cworICAgIGludGVycHJldGVkIGF0IHJ1bi10aW1lLCBhcyB0aGUgdGVybSAnc2NyaXB0JyBpcyBmcmVxdWVudGx5CisgICAgdW5kZXJzdG9vZCwgYnV0IHRoYXQgaXMgbm90IGEgcmVxdWlyZW1lbnQgYW5kIHdpdGhpbiB0aGUgY29udGV4dAorICAgIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiB0aGUgdGVybSBoYXMgdGhlIGJyb2FkZXIgZGVmaW5pdGlvbiBzdGF0ZWQuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48RU0+c2VydmVyPC9FTT4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gd2hpY2ggaW52b2tlcyB0aGUgc2NyaXB0IGluIG9yZGVyIHRvIHNlcnZpY2UKKyAgICByZXF1ZXN0cy4KKyAgICA8L1A+CisgICA8L0REPgorICA8L0RMPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjIuMCI+CisgICAgMi4gTm90YXRpb25hbCBDb252ZW50aW9ucyBhbmQgR2VuZXJpYyBHcmFtbWFyCisgICA8L0E+CisgIDwvSDI+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iMi4xIj4KKyAgICAyLjEuIEF1Z21lbnRlZCBCTkYKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIEFsbCBvZiB0aGUgbWVjaGFuaXNtcyBzcGVjaWZpZWQgaW4gdGhpcyBkb2N1bWVudCBhcmUgZGVzY3JpYmVkIGluCisgIGJvdGggcHJvc2UgYW5kIGFuIGF1Z21lbnRlZCBCYWNrdXMtTmF1ciBGb3JtIChCTkYpIHNpbWlsYXIgdG8gdGhhdAorICB1c2VkIGJ5IFJGQyA4MjIgWzxBIEhSRUY9IiNbNl0iPjY8L0E+XS4gVGhpcyBhdWdtZW50ZWQgQk5GIGNvbnRhaW5zCisgIHRoZSBmb2xsb3dpbmcgY29uc3RydWN0czoKKyAgPC9QPgorICA8REw+CisgICA8RFQ+bmFtZSA9IGRlZmluaXRpb24KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhlCisgICAgZGVmaW5pdGlvbiBieSB0aGUgZXF1YWwgY2hhcmFjdGVyICgiPSIpLiBXaGl0ZXNwYWNlIGlzIG9ubHkKKyAgICBzaWduaWZpY2FudCBpbiB0aGF0IGNvbnRpbnVhdGlvbiBsaW5lcyBvZiBhIGRlZmluaXRpb24gYXJlCisgICAgaW5kZW50ZWQuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD4ibGl0ZXJhbCIKKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgUXVvdGF0aW9uIG1hcmtzICgiKSBzdXJyb3VuZCBsaXRlcmFsIHRleHQsIGV4Y2VwdCBmb3IgYSBsaXRlcmFsCisgICAgcXVvdGF0aW9uIG1hcmssIHdoaWNoIGlzIHN1cnJvdW5kZWQgYnkgYW5nbGUtYnJhY2tldHMgKCImbHQ7IiBhbmQgIiZndDsiKS4KKyAgICBVbmxlc3Mgc3RhdGVkIG90aGVyd2lzZSwgdGhlIHRleHQgaXMgY2FzZS1zZW5zaXRpdmUuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD5ydWxlMSB8IHJ1bGUyCisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIEFsdGVybmF0aXZlIHJ1bGVzIGFyZSBzZXBhcmF0ZWQgYnkgYSB2ZXJ0aWNhbCBiYXIgKCJ8IikuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD4ocnVsZTEgcnVsZTIgcnVsZTMpCisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIEVsZW1lbnRzIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzIGFyZSB0cmVhdGVkIGFzIGEgc2luZ2xlIGVsZW1lbnQuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD4qcnVsZQorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBBIHJ1bGUgcHJlY2VkZWQgYnkgYW4gYXN0ZXJpc2sgKCIqIikgbWF5IGhhdmUgemVybyBvciBtb3JlCisgICAgb2NjdXJyZW5jZXMuIEEgcnVsZSBwcmVjZWRlZCBieSBhbiBpbnRlZ2VyIGZvbGxvd2VkIGJ5IGFuIGFzdGVyaXNrCisgICAgbXVzdCBvY2N1ciBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcy4KKyAgICA8L1A+CisgICA8L0REPgorICAgPERUPltydWxlXQorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBBbiBlbGVtZW50IGVuY2xvc2VkIGluIHNxdWFyZQorICAgIGJyYWNrZXRzICgiWyIgYW5kICJdIikgaXMgb3B0aW9uYWwuCisgICAgPC9QPgorICAgPC9ERD4KKyAgPC9ETD4KKworICA8SDM+CisgICA8QSBOQU1FPSIyLjIiPgorICAgIDIuMi4gQmFzaWMgUnVsZXMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGlzIHNwZWNpZmljYXRpb24gdG8KKyAgZGVzY3JpYmUgYmFzaWMgcGFyc2luZyBjb25zdHJ1Y3RzLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBhbHBoYSAgICAgICAgID0gbG93YWxwaGEgfCBoaWFscGhhCisgICAgYWxwaGFudW0gICAgICA9IGFscGhhIHwgZGlnaXQKKyAgICBsb3dhbHBoYSAgICAgID0gImEiIHwgImIiIHwgImMiIHwgImQiIHwgImUiIHwgImYiIHwgImciIHwgImgiCisgICAgICAgICAgICAgICAgICAgIHwgImkiIHwgImoiIHwgImsiIHwgImwiIHwgIm0iIHwgIm4iIHwgIm8iIHwgInAiCisgICAgICAgICAgICAgICAgICAgIHwgInEiIHwgInIiIHwgInMiIHwgInQiIHwgInUiIHwgInYiIHwgInciIHwgIngiCisgICAgICAgICAgICAgICAgICAgIHwgInkiIHwgInoiCisgICAgaGlhbHBoYSAgICAgICA9ICJBIiB8ICJCIiB8ICJDIiB8ICJEIiB8ICJFIiB8ICJGIiB8ICJHIiB8ICJIIgorICAgICAgICAgICAgICAgICAgICB8ICJJIiB8ICJKIiB8ICJLIiB8ICJMIiB8ICJNIiB8ICJOIiB8ICJPIiB8ICJQIgorICAgICAgICAgICAgICAgICAgICB8ICJRIiB8ICJSIiB8ICJTIiB8ICJUIiB8ICJVIiB8ICJWIiB8ICJXIiB8ICJYIgorICAgICAgICAgICAgICAgICAgICB8ICJZIiB8ICJaIgorICAgIGRpZ2l0ICAgICAgICAgPSAiMCIgfCAiMSIgfCAiMiIgfCAiMyIgfCAiNCIgfCAiNSIgfCAiNiIgfCAiNyIKKyAgICAgICAgICAgICAgICAgICAgfCAiOCIgfCAiOSIKKyAgICBoZXggICAgICAgICAgID0gZGlnaXQgfCAiQSIgfCAiQiIgfCAiQyIgfCAiRCIgfCAiRSIgfCAiRiIgfCAiYSIKKyAgICAgICAgICAgICAgICAgICAgfCAiYiIgfCAiYyIgfCAiZCIgfCAiZSIgfCAiZiIKKyAgICBlc2NhcGVkICAgICAgID0gIiUiIGhleCBoZXgKKyAgICBPQ1RFVCAgICAgICAgID0gJmx0O2FueSA4LWJpdCBzZXF1ZW5jZSBvZiBkYXRhJmd0OworICAgIENIQVIgICAgICAgICAgPSAmbHQ7YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpJmd0OworICAgIENUTCAgICAgICAgICAgPSAmbHQ7YW55IFVTLUFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgIChvY3RldHMgMCAtIDMxKSBhbmQgREVMICgxMjcpJmd0OworICAgIENSICAgICAgICAgICAgPSAmbHQ7VVMtQVNDSUkgQ1IsIGNhcnJpYWdlIHJldHVybiAoMTMpJmd0OworICAgIExGICAgICAgICAgICAgPSAmbHQ7VVMtQVNDSUkgTEYsIGxpbmVmZWVkICgxMCkmZ3Q7CisgICAgU1AgICAgICAgICAgICA9ICZsdDtVUy1BU0NJSSBTUCwgc3BhY2UgKDMyKSZndDsKKyAgICBIVCAgICAgICAgICAgID0gJmx0O1VTLUFTQ0lJIEhULCBob3Jpem9udGFsIHRhYiAoOSkmZ3Q7CisgICAgTkwgICAgICAgICAgICA9IENSIHwgTEYKKyAgICBMV1NQICAgICAgICAgID0gU1AgfCBIVCB8IE5MCisgICAgdHNwZWNpYWwgICAgICA9ICIoIiB8ICIpIiB8ICJAIiB8ICIsIiB8ICI7IiB8ICI6IiB8ICJcIiB8ICZsdDsiJmd0OworICAgICAgICAgICAgICAgICAgICB8ICIvIiB8ICJbIiB8ICJdIiB8ICI/IiB8ICImbHQ7IiB8ICImZ3Q7IiB8ICJ7IiB8ICJ9IgorICAgICAgICAgICAgICAgICAgICB8IFNQIHwgSFQgfCBOTAorICAgIHRva2VuICAgICAgICAgPSAxKiZsdDthbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciB0c3BlY2lhbHMmZ3Q7CisgICAgcXVvdGVkLXN0cmluZyA9ICggJmx0OyImZ3Q7ICpxZHRleHQgJmx0OyImZ3Q7ICkgfCAoICImbHQ7IiAqcWF0ZXh0ICImZ3Q7IikKKyAgICBxZHRleHQgICAgICAgID0gJmx0O2FueSBDSEFSIGV4Y2VwdCAmbHQ7IiZndDsgYW5kIENUTHMgYnV0IGluY2x1ZGluZyBMV1NQJmd0OworICAgIHFhdGV4dCAgICAgICAgPSAmbHQ7YW55IENIQVIgZXhjZXB0ICImbHQ7IiwgIiZndDsiIGFuZCBDVExzIGJ1dAorICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgTFdTUCZndDsKKyAgICBtYXJrICAgICAgICAgID0gIi0iIHwgIl8iIHwgIi4iIHwgIiEiIHwgIn4iIHwgIioiIHwgIiciIHwgIigiIHwgIikiCisgICAgdW5yZXNlcnZlZCAgICA9IGFscGhhbnVtIHwgbWFyaworICAgIHJlc2VydmVkICAgICAgPSAiOyIgfCAiLyIgfCAiPyIgfCAiOiIgfCAiQCIgfCAiJmFtcDsiIHwgIj0iIHwKKyAgICAgICAgICAgICAgICAgICAgIiQiIHwgIiwiCisgICAgdXJpYyAgICAgICAgICA9IHJlc2VydmVkIHwgdW5yZXNlcnZlZCB8IGVzY2FwZWQKKyAgPC9QUkU+CisgIDxQPgorICBOb3RlIHRoYXQgbmV3bGluZSAoTkwpIG5lZWQgbm90IGJlIGEgc2luZ2xlIGNoYXJhY3RlciwgYnV0IGNhbiBiZSBhCisgIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgPC9QPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjMuMCI+CisgICAgMy4gUHJvdG9jb2wgUGFyYW1ldGVycworICAgPC9BPgorICA8L0gyPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjMuMSI+CisgICAgMy4xLiBVUkwgRW5jb2RpbmcKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFNvbWUgdmFyaWFibGVzIGFuZCBjb25zdHJ1Y3RzIHVzZWQgaGVyZSBhcmUgZGVzY3JpYmVkIGFzIGJlaW5nCisgICdVUkwtZW5jb2RlZCcuIFRoaXMgZW5jb2RpbmcgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24KKyAgMiBvZiBSRkMKKyAgMjM5NgorICBbPEEgSFJFRj0iI1s0XSI+NDwvQT5dLgorICA8L1A+CisgIDxQPgorICBBbiBhbHRlcm5hdGUgInNob3J0Y3V0IiBlbmNvZGluZyBmb3IgcmVwcmVzZW50aW5nIHRoZSBzcGFjZQorICBjaGFyYWN0ZXIgZXhpc3RzIGFuZCBpcyBpbiBjb21tb24gdXNlLiAgU2NyaXB0cyBNVVNUIGJlIHByZXBhcmVkIHRvCisgIHJlY29nbmlzZSBib3RoICcrJyBhbmQgJyUyMCcgYXMgYW4gZW5jb2RlZCBzcGFjZSBpbiBhCisgIFVSTC1lbmNvZGVkIHZhbHVlLgorICA8L1A+CisgIDxQPgorICBOb3RlIHRoYXQgc29tZSB1bnNhZmUgY2hhcmFjdGVycyBtYXkgaGF2ZSBkaWZmZXJlbnQgc2VtYW50aWNzIGlmCisgIHRoZXkgYXJlIGVuY29kZWQuIFRoZSBkZWZpbml0aW9uIG9mIHdoaWNoIGNoYXJhY3RlcnMgYXJlIHVuc2FmZQorICBkZXBlbmRzIG9uIHRoZSBjb250ZXh0LgorICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0d28gVVJMcyBkbyBub3QKKyAgbmVjZXNzYXJpbHkgcmVmZXIgdG8gdGhlIHNhbWUgcmVzb3VyY2U6CisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIGh0dHA6Ly9zb21laG9zdC5jb20vc29tZWRpciUyRnZhbHVlCisgICAgaHR0cDovL3NvbWVob3N0LmNvbS9zb21lZGlyL3ZhbHVlCisgIDwvUFJFPgorICA8UD4KKyAgU2VlIHNlY3Rpb24KKyAgMiBvZiBSRkMKKyAgMjM5NiBbPEEgSFJFRj0iI1s0XSI+NDwvQT5dCisgIGZvciBhdXRob3JpdGF0aXZlIHRyZWF0bWVudCBvZiB0aGlzIGlzc3VlLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iMy4yIj4KKyAgICAzLjIuIFRoZSBTY3JpcHQtVVJJCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGUgJ1NjcmlwdC1VUkknIGlzIGRlZmluZWQgYXMgdGhlIFVSSSBvZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZAorICBieSB0aGUgbWV0YXZhcmlhYmxlcy4gICBPZnRlbiwKKyAgdGhpcyBVUkkgd2lsbCBiZSB0aGUgc2FtZSBhcworICB0aGUgVVJJIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50ICh0aGUgJ0NsaWVudC1VUkknKTsgaG93ZXZlciwgaXQgbmVlZAorICBub3QgYmUuIEluc3RlYWQsIGl0IGNvdWxkIGJlIGEgVVJJIGludmVudGVkIGJ5IHRoZSBzZXJ2ZXIsIGFuZCBzbyBpdAorICBjYW4gb25seSBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBzZXJ2ZXIgYW5kIGl0cyBDR0kgaW50ZXJmYWNlLgorICA8L1A+CisgIDxQPgorICBUaGUgU2NyaXB0LVVSSSBoYXMgdGhlIHN5bnRheCBvZiBnZW5lcmljLVJMIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAyLjEKKyAgb2YgUkZDIDE4MDggWzxBIEhSRUY9IiNbN10iPjc8L0E+XSwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgb2JqZWN0CisgIHBhcmFtZXRlcnMgYW5kCisgIGZyYWdtZW50IGlkZW50aWZpZXJzIGFyZSBub3QgcGVybWl0dGVkOgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICAmbHQ7c2NoZW1lJmd0OzovLyZsdDtob3N0Jmd0OyZsdDtwb3J0Jmd0Oy8mbHQ7cGF0aCZndDs/Jmx0O3F1ZXJ5Jmd0OworICA8L1BSRT4KKyAgPFA+CisgIFRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlCisgIFNjcmlwdC1VUkkKKyAgYXJlIGRlZmluZWQgYnkgc29tZSBvZiB0aGUKKyAgbWV0YXZhcmlhYmxlcyAoc2VlCisgIDxBIEhSRUY9IiM0LjAiPnNlY3Rpb24gNDwvQT4KKyAgYmVsb3cpOworICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBzY3JpcHQtdXJpID0gcHJvdG9jb2wgIjovLyIgU0VSVkVSX05BTUUgIjoiIFNFUlZFUl9QT1JUIGVuYy1zY3JpcHQKKyAgICAgICAgICAgICAgICAgZW5jLXBhdGgtaW5mbyAiPyIgUVVFUllfU1RSSU5HCisgIDwvUFJFPgorICA8UD4KKyAgd2hlcmUgJ3Byb3RvY29sJyBpcyBvYnRhaW5lZAorICBmcm9tIFNFUlZFUl9QUk9UT0NPTCwgJ2VuYy1zY3JpcHQnIGlzIGEKKyAgVVJMLWVuY29kZWQgdmVyc2lvbiBvZiBTQ1JJUFRfTkFNRSBhbmQgJ2VuYy1wYXRoLWluZm8nIGlzIGEKKyAgVVJMLWVuY29kZWQgdmVyc2lvbiBvZiBQQVRIX0lORk8uICBTZWUKKyAgPEEgSFJFRj0iIzQuNiI+c2VjdGlvbiA0LjY8L0E+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQQVRIX0lORk8KKyAgbWV0YXZhcmlhYmxlLgorICA8L1A+CisgIDxQPgorICBOb3RlIHRoYXQgdGhlIHNjaGVtZSBhbmQgdGhlIHByb3RvY29sIGFyZSA8RU0+bm90PC9FTT4gaWRlbnRpY2FsOworICBmb3IgaW5zdGFuY2UsIGEgcmVzb3VyY2UgYWNjZXNzZWQgPEVNPnZpYTwvRU0+IGFuIFNTTCBtZWNoYW5pc20KKyAgbWF5IGhhdmUgYSBDbGllbnQtVVJJIHdpdGggYSBzY2hlbWUgb2YgIjxTQU1QPmh0dHBzPC9TQU1QPiIKKyAgcmF0aGVyIHRoYW4gIjxTQU1QPmh0dHA8L1NBTVA+Ii4gICBDR0kvMS4xIHByb3ZpZGVzIG5vIG1lYW5zCisgIGZvciB0aGUgc2NyaXB0IHRvIHJlY29uc3RydWN0IHRoaXMsIGFuZCB0aGVyZWZvcmUKKyAgdGhlIFNjcmlwdC1VUkkgaW5jbHVkZXMgdGhlIGJhc2UgcHJvdG9jb2wgdXNlZC4KKyAgPC9QPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjQuMCI+CisgICAgNC4gSW52b2tpbmcgdGhlIFNjcmlwdAorICAgPC9BPgorICA8L0gyPgorICA8UD4KKyAgVGhlCisgIHNjcmlwdCBpcyBpbnZva2VkIGluIGEgc3lzdGVtIGRlZmluZWQgbWFubmVyLiBVbmxlc3Mgc3BlY2lmaWVkCisgIG90aGVyd2lzZSwgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHdpbGwgYmUgaW52b2tlZCBhcyBhbgorICBleGVjdXRhYmxlIHByb2dyYW0uCisgIDwvUD4KKworICA8SDI+CisgICA8QSBOQU1FPSI1LjAiPgorICAgIDUuIFRoZSBDR0kgU2NyaXB0IENvbW1hbmQgTGluZQorICAgPC9BPgorICA8L0gyPgorICA8UD4KKyAgU29tZSBzeXN0ZW1zIHN1cHBvcnQgYSBtZXRob2QgZm9yIHN1cHBseWluZyBhbiBhcnJheSBvZiBzdHJpbmdzIHRvCisgIHRoZSBDR0kgc2NyaXB0LiBUaGlzIGlzIG9ubHkgdXNlZCBpbiB0aGUgY2FzZSBvZiBhbiAnaW5kZXhlZCcgcXVlcnkuCisgIFRoaXMgaXMgaWRlbnRpZmllZCBieSBhICJHRVQiIG9yICJIRUFEIiBIVFRQIHJlcXVlc3Qgd2l0aCBhIFVSTAorICBxdWVyeQorICBzdHJpbmcgbm90IGNvbnRhaW5pbmcgYW55IHVuZW5jb2RlZCAiPSIgY2hhcmFjdGVycy4gRm9yIHN1Y2ggYQorICByZXF1ZXN0LAorICBzZXJ2ZXJzIFNIT1VMRCBwYXJzZSB0aGUgc2VhcmNoIHN0cmluZworICBpbnRvIHdvcmRzLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBzZWFyY2gtc3RyaW5nID0gc2VhcmNoLXdvcmQgKiggIisiIHNlYXJjaC13b3JkICkKKyAgICBzZWFyY2gtd29yZCAgID0gMSpzY2hhcgorICAgIHNjaGFyICAgICAgICAgPSB4dW5yZXNlcnZlZCB8IGVzY2FwZWQgfCB4cmVzZXJ2ZWQKKyAgICB4dW5yZXNlcnZlZCAgID0gYWxwaGEgfCBkaWdpdCB8IHhzYWZlIHwgZXh0cmEKKyAgICB4c2FmZSAgICAgICAgID0gIiQiIHwgIi0iIHwgIl8iIHwgIi4iCisgICAgeHJlc2VydmVkICAgICA9ICI7IiB8ICIvIiB8ICI/IiB8ICI6IiB8ICJAIiB8ICImIgorICA8L1BSRT4KKyAgPFA+CisgIEFmdGVyIHBhcnNpbmcsIGVhY2ggd29yZCBpcyBVUkwtZGVjb2RlZCwgb3B0aW9uYWxseSBlbmNvZGVkIGluIGEKKyAgc3lzdGVtIGRlZmluZWQgbWFubmVyLAorICBhbmQgdGhlbiB0aGUgYXJndW1lbnQgbGlzdCBpcyBzZXQgdG8gdGhlIGxpc3QKKyAgb2Ygd29yZHMuCisgIDwvUD4KKyAgPFA+CisgIElmIHRoZSBzZXJ2ZXIgY2Fubm90IGNyZWF0ZSBhbnkgcGFydCBvZiB0aGUgYXJndW1lbnQgbGlzdCwgdGhlbiB0aGUKKyAgc2VydmVyIFNIT1VMRCBOT1QgZ2VuZXJhdGUgYW55IGNvbW1hbmQgbGluZSBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHRoZQorICBudW1iZXIgb2YgYXJndW1lbnRzIG1heSBiZSBncmVhdGVyIHRoYW4gb3BlcmF0aW5nIHN5c3RlbSBvciBzZXJ2ZXIKKyAgbGltaXRhdGlvbnMgcGVybWl0LCBvciBvbmUgb2YgdGhlIHdvcmRzIG1heSBub3QgYmUgcmVwcmVzZW50YWJsZSBhcyBhbgorICBhcmd1bWVudC4KKyAgPC9QPgorICA8UD4KKyAgU2NyaXB0cyBTSE9VTEQgY2hlY2sgdG8gc2VlIGlmIHRoZSBRVUVSWV9TVFJJTkcgdmFsdWUgY29udGFpbnMgYW4KKyAgdW5lbmNvZGVkICI9IiBjaGFyYWN0ZXIsIGFuZCBTSE9VTEQgTk9UIHVzZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICBpZiBpdCBkb2VzLgorICA8L1A+CisKKyAgPEgyPgorICAgPEEgTkFNRT0iNi4wIj4KKyAgICA2LiBEYXRhIElucHV0IHRvIHRoZSBDR0kgU2NyaXB0CisgICA8L0E+CisgIDwvSDI+CisgIDxQPgorICBJbmZvcm1hdGlvbiBhYm91dCBhIHJlcXVlc3QgY29tZXMgZnJvbSB0d28gZGlmZmVyZW50IHNvdXJjZXM6IHRoZQorICByZXF1ZXN0IGhlYWRlciwgYW5kIGFueSBhc3NvY2lhdGVkCisgIG1lc3NhZ2UtYm9keS4KKyAgU2VydmVycyBNVVNUCisgIG1ha2UgcG9ydGlvbnMgb2YgdGhpcyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8KKyAgIHNjcmlwdHMuCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSI2LjEiPgorICAgIDYuMS4gUmVxdWVzdCBNZXRhZGF0YQorICAgIChNZXRhdmFyaWFibGVzKQorICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgRWFjaCBDR0kgc2VydmVyCisgIGltcGxlbWVudGF0aW9uIE1VU1QgZGVmaW5lIGEgbWVjaGFuaXNtCisgIHRvIHBhc3MgZGF0YSBhYm91dCB0aGUgcmVxdWVzdCBmcm9tCisgIHRoZSBzZXJ2ZXIgdG8gdGhlIHNjcmlwdC4KKyAgVGhlIG1ldGF2YXJpYWJsZXMgY29udGFpbmluZyB0aGVzZQorICBkYXRhCisgIGFyZSBhY2Nlc3NlZCBieSB0aGUgc2NyaXB0IGluIGEgc3lzdGVtCisgIGRlZmluZWQgbWFubmVyLgorICBUaGUKKyAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlCisgIG1ldGF2YXJpYWJsZXMgaXMKKyAgc3lzdGVtIGRlZmluZWQuCisgIDwvUD4KKyAgPFA+CisgIFRoaXMgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSByZXByZXNlbnRhdGlvbiBvZgorICBudWxsIHZhbHVlcyBhbmQgbWlzc2luZyBvbmVzLiAgV2hldGhlciBudWxsIG9yIG1pc3NpbmcgdmFsdWVzCisgIChzdWNoIGFzIGEgcXVlcnkgY29tcG9uZW50IG9mICI/IiBvciAiIiwgcmVzcGVjdGl2ZWx5KSBhcmUgcmVwcmVzZW50ZWQKKyAgYnkgdW5kZWZpbmVkIG1ldGF2YXJpYWJsZXMgb3IgYnkgbWV0YXZhcmlhYmxlcyB3aXRoIHZhbHVlcyBvZiAiIiBpcworICBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICA8L1A+CisgIDxQPgorICBDYXNlIGlzIG5vdCBzaWduaWZpY2FudCBpbiB0aGUKKyAgbWV0YXZhcmlhYmxlCisgIG5hbWVzLCBpbiB0aGF0IHRoZXJlIGNhbm5vdCBiZSB0d28KKyAgZGlmZmVyZW50IHZhcmlhYmxlcworICB3aG9zZSBuYW1lcyBkaWZmZXIgaW4gY2FzZSBvbmx5LiBIZXJlIHRoZXkgYXJlCisgIHNob3duIHVzaW5nIGEgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIGNhcGl0YWxzIHBsdXMgdW5kZXJzY29yZQorICAoIl8iKS4gVGhlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmFtZXMgaXMgc3lzdGVtIGRlZmluZWQ7IGZvcgorICBhIHBhcnRpY3VsYXIgc3lzdGVtIHRoZSByZXByZXNlbnRhdGlvbiBNQVkgYmUgZGVmaW5lZCBkaWZmZXJlbnRseQorICB0aGFuIHRoaXMuCisgIDwvUD4KKyAgPFA+CisgIE1ldGF2YXJpYWJsZQorICB2YWx1ZXMgTVVTVCBiZQorICBjb25zaWRlcmVkIGNhc2Utc2Vuc2l0aXZlIGV4Y2VwdCBhcyBub3RlZAorICBvdGhlcndpc2UuCisgIDwvUD4KKyAgPFA+CisgIFRoZSBjYW5vbmljYWwKKyAgbWV0YXZhcmlhYmxlcworICBkZWZpbmVkIGJ5IHRoaXMgc3BlY2lmaWNhdGlvbiBhcmU6CisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIEFVVEhfVFlQRQorICAgIENPTlRFTlRfTEVOR1RICisgICAgQ09OVEVOVF9UWVBFCisgICAgR0FURVdBWV9JTlRFUkZBQ0UKKyAgICBQQVRIX0lORk8KKyAgICBQQVRIX1RSQU5TTEFURUQKKyAgICBRVUVSWV9TVFJJTkcKKyAgICBSRU1PVEVfQUREUgorICAgIFJFTU9URV9IT1NUCisgICAgUkVNT1RFX0lERU5UCisgICAgUkVNT1RFX1VTRVIKKyAgICBSRVFVRVNUX01FVEhPRAorICAgIFNDUklQVF9OQU1FCisgICAgU0VSVkVSX05BTUUKKyAgICBTRVJWRVJfUE9SVAorICAgIFNFUlZFUl9QUk9UT0NPTAorICAgIFNFUlZFUl9TT0ZUV0FSRQorICA8L1BSRT4KKyAgPFA+CisgIE1ldGF2YXJpYWJsZXMgd2l0aCBuYW1lcyBiZWdpbm5pbmcgd2l0aCB0aGUgcHJvdG9jb2wgbmFtZSAoPEVNPmUuZy48L0VNPiwKKyAgIkhUVFBfQUNDRVBUIikgYXJlIGFsc28gY2Fub25pY2FsIGluIHRoZWlyIGRlc2NyaXB0aW9uIG9mIHJlcXVlc3QgaGVhZGVyCisgIGZpZWxkcy4gIFRoZSBudW1iZXIgYW5kIG1lYW5pbmcgb2YgdGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgaW5kZXBlbmRlbnRseQorICBvZiB0aGlzIHNwZWNpZmljYXRpb24uICAoU2VlIGFsc28gPEEgSFJFRj0iIzYuMS41Ij5zZWN0aW9uIDYuMS41PC9BPi4pCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuMSI+CisgICAgNi4xLjEuIEFVVEhfVFlQRQorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhpcyB2YXJpYWJsZSBpcyBzcGVjaWZpYyB0byByZXF1ZXN0cyBtYWRlCisgIDxFTT52aWE8L0VNPiB0aGUKKyAgIjxDT0RFPmh0dHA8L0NPREU+IgorICBzY2hlbWUuCisgIDwvUD4KKyAgPFA+CisgIElmIHRoZSBTY3JpcHQtVVJJCisgIHJlcXVpcmVkIGFjY2VzcyBhdXRoZW50aWNhdGlvbiBmb3IgZXh0ZXJuYWwKKyAgYWNjZXNzLCB0aGVuIHRoZSBzZXJ2ZXIKKyAgTVVTVCBzZXQKKyAgdGhlIHZhbHVlIG9mCisgIHRoaXMgdmFyaWFibGUKKyAgZnJvbSB0aGUgJzxTQU1QPmF1dGgtc2NoZW1lPC9TQU1QPicgdG9rZW4gaW4KKyAgdGhlIHJlcXVlc3QncyAiPFNBTVA+QXV0aG9yaXphdGlvbjwvU0FNUD4iIGhlYWRlcgorICBmaWVsZC4KKyAgT3RoZXJ3aXNlCisgIGl0IGlzCisgIHNldCB0byBOVUxMLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBBVVRIX1RZUEUgICA9ICIiIHwgYXV0aC1zY2hlbWUKKyAgICBhdXRoLXNjaGVtZSA9ICJCYXNpYyIgfCAiRGlnZXN0IiB8IHRva2VuCisgIDwvUFJFPgorICA8UD4KKyAgSFRUUCBhY2Nlc3MgYXV0aGVudGljYXRpb24gc2NoZW1lcyBhcmUgZGVzY3JpYmVkIGluIHNlY3Rpb24gMTEgb2YgdGhlCisgIEhUVFAvMS4xIHNwZWNpZmljYXRpb24gWzxBIEhSRUY9IiNbOF0iPjg8L0E+XS4gVGhlIGF1dGgtc2NoZW1lIGlzCisgIG5vdCBjYXNlLXNlbnNpdGl2ZS4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycworICBNVVNUCisgIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cyBpZiB0aGUgcmVxdWVzdAorICBoZWFkZXIgaW5jbHVkZWQgYW4gIjxTQU1QPkF1dGhvcml6YXRpb248L1NBTVA+IiBmaWVsZAorICB0aGF0IHdhcyBhdXRoZW50aWNhdGVkLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjIiPgorICAgIDYuMS4yLiBDT05URU5UX0xFTkdUSAorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhpcworICBtZXRhdmFyaWFibGUKKyAgaXMgc2V0IHRvIHRoZQorICBzaXplIG9mIHRoZSBtZXNzYWdlLWJvZHkKKyAgZW50aXR5IGF0dGFjaGVkIHRvIHRoZSByZXF1ZXN0LCBpZiBhbnksIGluIGRlY2ltYWwKKyAgbnVtYmVyIG9mIG9jdGV0cy4gSWYgbm8gZGF0YSBhcmUgYXR0YWNoZWQsIHRoZW4gdGhpcworICBtZXRhdmFyaWFibGUKKyAgaXMgZWl0aGVyIE5VTEwgb3Igbm90CisgIGRlZmluZWQuIFRoZSBzeW50YXggaXMKKyAgdGhlIHNhbWUgYXMgZm9yCisgIHRoZSBIVFRQICI8U0FNUD5Db250ZW50LUxlbmd0aDwvU0FNUD4iIGhlYWRlciBmaWVsZCAoc2VjdGlvbiAxNC4xNCwgSFRUUC8xLjEKKyAgc3BlY2lmaWNhdGlvbiBbPEEgSFJFRj0iI1s4XSI+ODwvQT5dKS4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgQ09OVEVOVF9MRU5HVEggPSAiIiB8IDEqZGlnaXQKKyAgPC9QUkU+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgcHJvdmlkZSB0aGlzIG1ldGF2YXJpYWJsZQorICB0byBzY3JpcHRzIGlmIHRoZSByZXF1ZXN0CisgIHdhcyBhY2NvbXBhbmllZCBieSBhCisgIG1lc3NhZ2UtYm9keSBlbnRpdHkuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuMyI+CisgICAgNi4xLjMuIENPTlRFTlRfVFlQRQorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgSWYgdGhlIHJlcXVlc3QgaW5jbHVkZXMgYQorICBtZXNzYWdlLWJvZHksCisgIENPTlRFTlRfVFlQRSBpcyBzZXQKKyAgdG8KKyAgdGhlIEludGVybmV0IE1lZGlhIFR5cGUKKyAgWzxBIEhSRUY9IiNbOV0iPjk8L0E+XSBvZiB0aGUgYXR0YWNoZWQKKyAgZW50aXR5IGlmIHRoZSB0eXBlIHdhcyBwcm92aWRlZCA8RU0+dmlhPC9FTT4KKyAgYSAiPFNBTVA+Q29udGVudC10eXBlPC9TQU1QPiIgZmllbGQgaW4gdGhlCisgIHJlcXVlc3QgaGVhZGVyLCBvciBpZiB0aGUgc2VydmVyIGNhbiBkZXRlcm1pbmUgaXQgaW4gdGhlIGFic2VuY2UKKyAgb2YgYSBzdXBwbGllZCAiPFNBTVA+Q29udGVudC10eXBlPC9TQU1QPiIgZmllbGQuIFRoZSBzeW50YXggaXMgdGhlCisgIHNhbWUgYXMgZm9yIHRoZSBIVFRQCisgICI8U0FNUD5Db250ZW50LVR5cGU8L1NBTVA+IiBoZWFkZXIgZmllbGQuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIENPTlRFTlRfVFlQRSA9ICIiIHwgbWVkaWEtdHlwZQorICAgIG1lZGlhLXR5cGUgICA9IHR5cGUgIi8iIHN1YnR5cGUgKiggIjsiIHBhcmFtZXRlcikKKyAgICB0eXBlICAgICAgICAgPSB0b2tlbgorICAgIHN1YnR5cGUgICAgICA9IHRva2VuCisgICAgcGFyYW1ldGVyICAgID0gYXR0cmlidXRlICI9IiB2YWx1ZQorICAgIGF0dHJpYnV0ZSAgICA9IHRva2VuCisgICAgdmFsdWUgICAgICAgID0gdG9rZW4gfCBxdW90ZWQtc3RyaW5nCisgIDwvUFJFPgorICA8UD4KKyAgVGhlIHR5cGUsIHN1YnR5cGUsCisgIGFuZCBwYXJhbWV0ZXIgYXR0cmlidXRlIG5hbWVzIGFyZSBub3QKKyAgY2FzZS1zZW5zaXRpdmUuIFBhcmFtZXRlciB2YWx1ZXMgTUFZIGJlIGNhc2Ugc2Vuc2l0aXZlLgorICBNZWRpYSB0eXBlcyBhbmQgdGhlaXIgdXNlIGluIEhUVFAgYXJlIGRlc2NyaWJlZAorICBpbiBzZWN0aW9uIDMuNyBvZiB0aGUKKyAgSFRUUC8xLjEgc3BlY2lmaWNhdGlvbiBbPEEgSFJFRj0iI1s4XSI+ODwvQT5dLgorICA8L1A+CisgIDxQPgorICBFeGFtcGxlOgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKKyAgPC9QUkU+CisgIDxQPgorICBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHZhcmlhYmxlLiBJZiBhbmQgb25seSBpZiBpdCBpcworICB1bnNldCwgdGhlbiB0aGUgc2NyaXB0IE1BWSBhdHRlbXB0IHRvIGRldGVybWluZSB0aGUgbWVkaWEgdHlwZSBmcm9tCisgIHRoZSBkYXRhIHJlY2VpdmVkLiBJZiB0aGUgdHlwZSByZW1haW5zIHVua25vd24sIHRoZW4KKyAgdGhlIHNjcmlwdCBNQVkgY2hvb3NlIHRvIGVpdGhlciBhc3N1bWUgYQorICBjb250ZW50LXR5cGUgb2YKKyAgPFNBTVA+YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtPC9TQU1QPgorICBvciByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aCAgYSA0MTUgKCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIikKKyAgZXJyb3IuICBTZWUgPEEgSFJFRj0iIzcuMi4xLjMiPnNlY3Rpb24gNy4yLjEuMzwvQT4KKyAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcmV0dXJuaW5nIGVycm9yIHN0YXR1cyB2YWx1ZXMuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBwcm92aWRlIHRoaXMgbWV0YXZhcmlhYmxlCisgIHRvIHNjcmlwdHMgaWYKKyAgYSAiPFNBTVA+Q29udGVudC1UeXBlPC9TQU1QPiIgZmllbGQgd2FzIHByZXNlbnQKKyAgaW4gdGhlIG9yaWdpbmFsIHJlcXVlc3QgaGVhZGVyLiAgSWYgdGhlIHNlcnZlciByZWNlaXZlcyBhIHJlcXVlc3QKKyAgd2l0aCBhbiBhdHRhY2hlZCBlbnRpdHkgYnV0IG5vICI8U0FNUD5Db250ZW50LVR5cGU8L1NBTVA+IgorICBoZWFkZXIgZmllbGQsIGl0IE1BWSBhdHRlbXB0IHRvCisgIGRldGVybWluZSB0aGUgY29ycmVjdCBkYXRhdHlwZSwgb3IgaXQgTUFZIG9taXQgdGhpcworICBtZXRhdmFyaWFibGUgd2hlbgorICBjb21tdW5pY2F0aW5nIHRoZSByZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHRoZSBzY3JpcHQuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuNCI+CisgICAgNi4xLjQuIEdBVEVXQVlfSU5URVJGQUNFCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGlzCisgIG1ldGF2YXJpYWJsZQorICBpcyBzZXQgdG8KKyAgdGhlIGRpYWxlY3Qgb2YgQ0dJIGJlaW5nIHVzZWQKKyAgYnkgdGhlIHNlcnZlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzY3JpcHQuCisgIFN5bnRheDoKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgR0FURVdBWV9JTlRFUkZBQ0UgPSAiQ0dJIiAiLyIgbWFqb3IgIi4iIG1pbm9yCisgICAgbWFqb3IgICAgICAgICAgICAgPSAxKmRpZ2l0CisgICAgbWlub3IgICAgICAgICAgICAgPSAxKmRpZ2l0CisgIDwvUFJFPgorICA8UD4KKyAgTm90ZSB0aGF0IHRoZSBtYWpvciBhbmQgbWlub3IgbnVtYmVycyBhcmUgdHJlYXRlZCBhcyBzZXBhcmF0ZQorICBpbnRlZ2VycyBhbmQgaGVuY2UgZWFjaCBtYXkgYmUKKyAgbW9yZSB0aGFuIGEgc2luZ2xlCisgIGRpZ2l0LiBUaHVzIENHSS8yLjQgaXMgYSBsb3dlciB2ZXJzaW9uIHRoYW4gQ0dJLzIuMTMgd2hpY2ggaW4gdHVybgorICBpcyBsb3dlciB0aGFuIENHSS8xMi4zLiBMZWFkaW5nIHplcm9zIGluIGVpdGhlcgorICB0aGUgbWFqb3Igb3IgdGhlIG1pbm9yIG51bWJlciBNVVNUIGJlIGlnbm9yZWQgYnkgc2NyaXB0cyBhbmQKKyAgU0hPVUxEIE5PVCBiZSBnZW5lcmF0ZWQgYnkgc2VydmVycy4KKyAgPC9QPgorICA8UD4KKyAgVGhpcyBkb2N1bWVudCBkZWZpbmVzIHRoZSAxLjEgdmVyc2lvbiBvZiB0aGUgQ0dJIGludGVyZmFjZQorICAoIkNHSS8xLjEiKS4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS41Ij4KKyAgICA2LjEuNS4gUHJvdG9jb2wtU3BlY2lmaWMgTWV0YXZhcmlhYmxlcworICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlc2UgbWV0YXZhcmlhYmxlcyBhcmUgc3BlY2lmaWMgdG8KKyAgdGhlIHByb3RvY29sCisgIDxFTT52aWE8L0VNPiB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlLgorICBJbnRlcnByZXRhdGlvbiBvZiB0aGVzZSB2YXJpYWJsZXMgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YKKyAgdGhlCisgIFNFUlZFUl9QUk9UT0NPTAorICBtZXRhdmFyaWFibGUKKyAgKHNlZQorICA8QSBIUkVGPSIjNi4xLjE3Ij5zZWN0aW9uIDYuMS4xNzwvQT4pLgorICA8L1A+CisgIDxQPgorICBNZXRhdmFyaWFibGVzCisgIHdpdGggbmFtZXMgYmVnaW5uaW5nIHdpdGggIkhUVFBfIiBjb250YWluCisgIHZhbHVlcyBmcm9tIHRoZSByZXF1ZXN0IGhlYWRlciwgaWYgdGhlCisgIHNjaGVtZSB1c2VkIHdhcyBIVFRQLgorICBFYWNoCisgIEhUVFAgaGVhZGVyIGZpZWxkIG5hbWUgaXMgY29udmVydGVkIHRvIHVwcGVyIGNhc2UsIGhhcyBhbGwgb2NjdXJyZW5jZXMgb2YKKyAgIi0iIHJlcGxhY2VkIHdpdGggIl8iLAorICBhbmQgaGFzICJIVFRQXyIgcHJlcGVuZGVkIHRvICBmb3JtCisgIHRoZSBtZXRhdmFyaWFibGUgbmFtZS4KKyAgU2ltaWxhciB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFwcGxpZWQgZm9yIG90aGVyCisgIHByb3RvY29scy4KKyAgVGhlIGhlYWRlciBkYXRhIE1BWSBiZSBwcmVzZW50ZWQgYXMgc2VudAorICBieSB0aGUgY2xpZW50LCBvciBNQVkgYmUgcmV3cml0dGVuIGluIHdheXMgd2hpY2ggZG8gbm90IGNoYW5nZSBpdHMKKyAgc2VtYW50aWNzLiBJZiBtdWx0aXBsZSBoZWFkZXIgZmllbGRzIHdpdGggdGhlIHNhbWUgZmllbGQtbmFtZSBhcmUgcmVjZWl2ZWQKKyAgdGhlbiAgdGhlIHNlcnZlcgorICBNVVNUICByZXdyaXRlIHRoZW0gYXMgdGhvdWdoIHRoZXkKKyAgaGFkIGJlZW4gcmVjZWl2ZWQgYXMgYSBzaW5nbGUgaGVhZGVyIGZpZWxkIGhhdmluZyB0aGUgc2FtZQorICBzZW1hbnRpY3MgYmVmb3JlIGJlaW5nIHJlcHJlc2VudGVkIGluIGEKKyAgbWV0YXZhcmlhYmxlLgorICBTaW1pbGFybHksIGEgaGVhZGVyIGZpZWxkIHRoYXQgaXMgcmVjZWl2ZWQgb24gbW9yZSB0aGFuIG9uZSBsaW5lCisgIE1VU1QgYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgbGluZS4gVGhlIHNlcnZlciBNVVNULCBpZiBuZWNlc3NhcnksCisgIGNoYW5nZSB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgKGZvciBleGFtcGxlLCB0aGUgY2hhcmFjdGVyCisgIHNldCkgdG8gYmUgYXBwcm9wcmlhdGUgZm9yIGEgQ0dJCisgIG1ldGF2YXJpYWJsZS4KKyAgPCEtLSAjIyNOT1RFOiBTZWUgaWYgMjA2OCBkZXNjcmliZXMgdGhpcyB0aG9yb3VnaGx5LCBhbmQKKyAgcG9pbnQgdGhlcmUgaWYgc28uIC0tPgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIGFyZQorICBub3QgcmVxdWlyZWQgdG8gY3JlYXRlCisgIG1ldGF2YXJpYWJsZXMgZm9yIGFsbAorICB0aGUgcmVxdWVzdAorICBoZWFkZXIgZmllbGRzIHRoYXQgdGhleQorICByZWNlaXZlLiBJbiBwYXJ0aWN1bGFyLAorICB0aGV5IE1BWQorICBkZWNsaW5lIHRvIG1ha2UgYXZhaWxhYmxlIGFueQorICBoZWFkZXIgZmllbGRzIGNhcnJ5aW5nIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLCBzdWNoIGFzCisgICI8U0FNUD5BdXRob3JpemF0aW9uPC9TQU1QPiIsIG9yCisgIHdoaWNoIGFyZSBhdmFpbGFibGUgdG8gdGhlIHNjcmlwdAorICA8RU0+dmlhPC9FTT4gb3RoZXIgbWV0YXZhcmlhYmxlcywKKyAgc3VjaCBhcyAiPFNBTVA+Q29udGVudC1MZW5ndGg8L1NBTVA+IiBhbmQgIjxTQU1QPkNvbnRlbnQtVHlwZTwvU0FNUD4iLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjYiPgorICAgIDYuMS42LiBQQVRIX0lORk8KKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBQQVRIX0lORk8KKyAgbWV0YXZhcmlhYmxlCisgIHNwZWNpZmllcworICBhIHBhdGggdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIENHSSBzY3JpcHQuIEl0IGlkZW50aWZpZXMgdGhlCisgIHJlc291cmNlIG9yIHN1Yi1yZXNvdXJjZSB0byBiZSByZXR1cm5lZAorICBieSB0aGUgQ0dJCisgIHNjcmlwdCwgYW5kIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgcG9ydGlvbgorICBvZiB0aGUgVVJJIHBhdGggZm9sbG93aW5nIHRoZSBzY3JpcHQgbmFtZSBidXQgcHJlY2VkaW5nCisgIGFueSBxdWVyeSBkYXRhLgorICBUaGUgc3ludGF4CisgIGFuZCBzZW1hbnRpY3MgYXJlIHNpbWlsYXIgdG8gYSBkZWNvZGVkIEhUVFAgVVJMCisgICdwYXRoJyB0b2tlbgorICAoZGVmaW5lZCBpbgorICBSRkMgMjM5NgorICBbPEEgSFJFRj0iI1s0XSI+NDwvQT5dKSwgd2l0aCB0aGUgZXhjZXB0aW9uCisgIHRoYXQgYSBQQVRIX0lORk8gb2YgIi8iCisgIHJlcHJlc2VudHMgYSBzaW5nbGUgdm9pZCBwYXRoIHNlZ21lbnQuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFBBVEhfSU5GTyA9ICIiIHwgKCAiLyIgcGF0aCApCisgICAgcGF0aCAgICAgID0gc2VnbWVudCAqKCAiLyIgc2VnbWVudCApCisgICAgc2VnbWVudCAgID0gKnBjaGFyCisgICAgcGNoYXIgICAgID0gJmx0O2FueSBDSEFSIGV4Y2VwdCAiLyImZ3Q7CisgIDwvUFJFPgorICA8UD4KKyAgVGhlIFBBVEhfSU5GTyBzdHJpbmcgaXMgdGhlIHRyYWlsaW5nIHBhcnQgb2YgdGhlICZsdDtwYXRoJmd0OyBjb21wb25lbnQgb2YKKyAgdGhlIFNjcmlwdC1VUkkKKyAgKHNlZSA8QSBIUkVGPSIjMy4yIj5zZWN0aW9uIDMuMjwvQT4pCisgIHRoYXQgZm9sbG93cyB0aGUgU0NSSVBUX05BTUUKKyAgcG9ydGlvbiBvZiB0aGUgcGF0aC4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBNQVkgaW1wb3NlIHRoZWlyIG93biByZXN0cmljdGlvbnMgYW5kCisgIGxpbWl0YXRpb25zIG9uIHdoYXQgdmFsdWVzIHRoZXkgd2lsbCBhY2NlcHQgZm9yIFBBVEhfSU5GTywgYW5kIE1BWQorICByZWplY3Qgb3IgZWRpdCBhbnkgdmFsdWVzIHRoZXkKKyAgY29uc2lkZXIgb2JqZWN0aW9uYWJsZSBiZWZvcmUgcGFzc2luZworICB0aGVtIHRvIHRoZSBzY3JpcHQuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBtYWtlIHRoaXMgVVJJIGNvbXBvbmVudCBhdmFpbGFibGUKKyAgdG8gQ0dJIHNjcmlwdHMuICBUaGUgUEFUSF9JTkZPCisgIHZhbHVlIGlzIGNhc2Utc2Vuc2l0aXZlLCBhbmQgdGhlCisgIHNlcnZlciBNVVNUIHByZXNlcnZlIHRoZSBjYXNlIG9mIHRoZSBQQVRIX0lORk8gZWxlbWVudCBvZiB0aGUgVVJJCisgIHdoZW4gbWFraW5nIGl0IGF2YWlsYWJsZSB0byBzY3JpcHRzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjciPgorICAgIDYuMS43LiBQQVRIX1RSQU5TTEFURUQKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFBBVEhfVFJBTlNMQVRFRCBpcyBkZXJpdmVkIGJ5IHRha2luZyBhbnkgcGF0aC1pbmZvIGNvbXBvbmVudCBvZiB0aGUKKyAgcmVxdWVzdCBVUkkgKHNlZQorICA8QSBIUkVGPSIjNi4xLjYiPnNlY3Rpb24gNi4xLjY8L0E+KSwgZGVjb2RpbmcgaXQKKyAgKHNlZSA8QSBIUkVGPSIjMy4xIj5zZWN0aW9uIDMuMTwvQT4pLCBwYXJzaW5nIGl0IGFzIGEgVVJJIGluIGl0cyBvd24KKyAgcmlnaHQsIGFuZCBwZXJmb3JtaW5nIGFueSB2aXJ0dWFsLXRvLXBoeXNpY2FsCisgIHRyYW5zbGF0aW9uIGFwcHJvcHJpYXRlIHRvIG1hcCBpdCBvbnRvIHRoZQorICBzZXJ2ZXIncyBkb2N1bWVudCByZXBvc2l0b3J5IHN0cnVjdHVyZS4KKyAgSWYgdGhlIHJlcXVlc3QgVVJJIGluY2x1ZGVzIG5vIHBhdGgtaW5mbworICBjb21wb25lbnQsIHRoZSBQQVRIX1RSQU5TTEFURUQgbWV0YXZhcmlhYmxlIFNIT1VMRCBOT1QgYmUgZGVmaW5lZC4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgUEFUSF9UUkFOU0xBVEVEID0gKkNIQVIKKyAgPC9QUkU+CisgIDxQPgorICBGb3IgYSByZXF1ZXN0IHN1Y2ggYXMgdGhlIGZvbGxvd2luZzoKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgaHR0cDovL3NvbWVob3N0LmNvbS9jZ2ktYmluL3NvbWVzY3JpcHQvdGhpcyUyZWlzJTJlcGF0aCUyZWluZm8KKyAgPC9QUkU+CisgIDxQPgorICB0aGUgUEFUSF9JTkZPIGNvbXBvbmVudCB3b3VsZCBiZSBkZWNvZGVkLCBhbmQgdGhlIHJlc3VsdAorICBwYXJzZWQgYXMgdGhvdWdoIGl0IHdlcmUgYSByZXF1ZXN0IGZvciB0aGUgZm9sbG93aW5nOgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBodHRwOi8vc29tZWhvc3QuY29tL3RoaXMuaXMudGhlLnBhdGguaW5mbworICA8L1BSRT4KKyAgPFA+CisgIFRoaXMgd291bGQgdGhlbiBiZSB0cmFuc2xhdGVkIHRvIGEKKyAgbG9jYXRpb24gaW4gdGhlIHNlcnZlcidzIGRvY3VtZW50IHJlcG9zaXRvcnksCisgIHBlcmhhcHMgYSBmaWxlc3lzdGVtIHBhdGggc29tZXRoaW5nCisgIGxpa2UgdGhpczoKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgL3Vzci9sb2NhbC93d3cvaHRkb2NzL3RoaXMuaXMudGhlLnBhdGguaW5mbworICA8L1BSRT4KKyAgPFA+CisgIFRoZSByZXN1bHQgb2YgdGhlIHRyYW5zbGF0aW9uIGlzIHRoZSB2YWx1ZSBvZiBQQVRIX1RSQU5TTEFURUQuCisgIDwvUD4KKyAgPFA+CisgIFRoZSB2YWx1ZSBvZiBQQVRIX1RSQU5TTEFURUQgbWF5IG9yIG1heSBub3QgbWFwIHRvIGEgdmFsaWQKKyAgcmVwb3NpdG9yeQorICBsb2NhdGlvbi4KKyAgU2VydmVycyBNVVNUIHByZXNlcnZlIHRoZSBjYXNlIG9mIHRoZSBwYXRoLWluZm8KKyAgc2VnbWVudCBpZiBhbmQgb25seSBpZiB0aGUgdW5kZXJseWluZworICByZXBvc2l0b3J5CisgIHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlCisgIG5hbWVzLiAgSWYgdGhlCisgIHJlcG9zaXRvcnkKKyAgaXMgb25seSBjYXNlLWF3YXJlLCBjYXNlLXByZXNlcnZpbmcsIG9yIGNhc2UtYmxpbmQKKyAgd2l0aCByZWdhcmQgdG8KKyAgZG9jdW1lbnQgbmFtZXMsCisgIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBwcmVzZXJ2ZSB0aGUKKyAgY2FzZSBvZiB0aGUgb3JpZ2luYWwgc2VnbWVudCB0aHJvdWdoIHRoZSB0cmFuc2xhdGlvbi4KKyAgPC9QPgorICA8UD4KKyAgVGhlCisgIHRyYW5zbGF0aW9uCisgIGFsZ29yaXRobSB0aGUgc2VydmVyIHVzZXMgdG8gZGVyaXZlIFBBVEhfVFJBTlNMQVRFRCBpcworICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkOyBDR0kgc2NyaXB0cyB3aGljaCB1c2UgdGhpcyB2YXJpYWJsZSBtYXkKKyAgc3VmZmVyIGxpbWl0ZWQgcG9ydGFiaWxpdHkuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgU0hPVUxEIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cyBpZiBhbmQgb25seSBpZiB0aGUgcmVxdWVzdCBVUkkgaW5jbHVkZXMgYQorICBwYXRoLWluZm8gY29tcG9uZW50LgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjgiPgorICAgIDYuMS44LiBRVUVSWV9TVFJJTkcKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIEEgVVJMLWVuY29kZWQKKyAgc3RyaW5nOyB0aGUgJmx0O3F1ZXJ5Jmd0OyBwYXJ0IG9mIHRoZQorICBTY3JpcHQtVVJJLgorICAoU2VlCisgIDxBIEhSRUY9IiMzLjIiPnNlY3Rpb24gMy4yPC9BPi4pCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFFVRVJZX1NUUklORyA9IHF1ZXJ5LXN0cmluZworICAgIHF1ZXJ5LXN0cmluZyA9ICp1cmljCisgIDwvUFJFPgorICA8UD4KKyAgVGhlIFVSTCBzeW50YXggZm9yIGEgIHF1ZXJ5CisgIHN0cmluZyBpcyBkZXNjcmliZWQgaW4KKyAgc2VjdGlvbiAzIG9mCisgIFJGQyAyMzk2CisgIFs8QSBIUkVGPSIjWzRdIj40PC9BPl0uCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBzdXBwbHkgdGhpcyB2YWx1ZSB0byBzY3JpcHRzLgorICBUaGUgUVVFUllfU1RSSU5HIHZhbHVlIGlzIGNhc2Utc2Vuc2l0aXZlLgorICBJZiB0aGUgU2NyaXB0LVVSSSBkb2VzIG5vdCBpbmNsdWRlIGEgcXVlcnkgY29tcG9uZW50LAorICB0aGUgUVVFUllfU1RSSU5HIG1ldGF2YXJpYWJsZSBNVVNUIGJlIGRlZmluZWQgYXMgYW4gZW1wdHkgc3RyaW5nICgiIikuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuOSI+CisgICAgNi4xLjkuIFJFTU9URV9BRERSCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgY2xpZW50CisgIHNlbmRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4gVGhpcworICBpcyBub3QgbmVjZXNzYXJpbHkgdGhhdCBvZiB0aGUgdXNlcgorICBhZ2VudAorICAoc3VjaCBhcyBpZiB0aGUgcmVxdWVzdCBjYW1lIHRocm91Z2ggYSBwcm94eSkuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFJFTU9URV9BRERSICA9IGhvc3RudW1iZXIKKyAgICBob3N0bnVtYmVyICAgPSBpcHY0LWFkZHJlc3MgfCBpcHY2LWFkZHJlc3MKKyAgPC9QUkU+CisgIDxQPgorICBUaGUgZGVmaW5pdGlvbnMgb2YgPFNBTVA+aXB2NC1hZGRyZXNzPC9TQU1QPiBhbmQgPFNBTVA+aXB2Ni1hZGRyZXNzPC9TQU1QPgorICBhcmUgcHJvdmlkZWQgaW4gQXBwZW5kaXggQiBvZiBSRkMgMjM3MyBbPEEgSFJFRj0iI1sxM10iPjEzPC9BPl0uCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBzdXBwbHkgdGhpcyB2YWx1ZSB0byBzY3JpcHRzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjEwIj4KKyAgICA2LjEuMTAuIFJFTU9URV9IT1NUCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIG9mIHRoZQorICBjbGllbnQgc2VuZGluZyB0aGUgcmVxdWVzdCB0bworICB0aGUgc2VydmVyLCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBOVUxMLgorICAoU2VlIDxBIEhSRUY9IiM2LjEuOSI+c2VjdGlvbiA2LjEuOTwvQT4uKQorICBGdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWVzIHRha2UgdGhlIGZvcm0gYXMgZGVzY3JpYmVkIGluCisgIHNlY3Rpb24gMy41IG9mIFJGQyAxMDM0IFs8QSBIUkVGPSIjWzEwXSI+MTA8L0E+XSBhbmQgc2VjdGlvbiAyLjEgb2YKKyAgUkZDIDExMjMgWzxBIEhSRUY9IiNbNV0iPjU8L0E+XS4gIERvbWFpbiBuYW1lcyBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIFNIT1VMRCBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gdG8KKyAgc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS4xMSI+CisgICAgNi4xLjExLiBSRU1PVEVfSURFTlQKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiByZXBvcnRlZCBhYm91dCB0aGUgY29ubmVjdGlvbiBieSBhCisgIFJGQyAxNDEzIFs8QSBIUkVGPSIjWzExXSI+MTE8L0E+XSByZXF1ZXN0IHRvIHRoZSByZW1vdGUgYWdlbnQsIGlmCisgIGF2YWlsYWJsZS4gU2VydmVycworICBNQVkgY2hvb3NlIG5vdAorICB0byBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgb3Igbm90IHRvIHJlcXVlc3QgdGhlIGRhdGEKKyAgZm9yIGVmZmljaWVuY3kgcmVhc29ucy4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgUkVNT1RFX0lERU5UID0gKkNIQVIKKyAgPC9QUkU+CisgIDxQPgorICBUaGUgZGF0YSByZXR1cm5lZAorICBtYXkgYmUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gcHVycG9zZXMsIGJ1dCB0aGUgbGV2ZWwKKyAgb2YgdHJ1c3QgcmVwb3NlZCBpbiB0aGVtIHNob3VsZCBiZSBtaW5pbWFsLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1BWSBzdXBwbHkgdGhpcyBpbmZvcm1hdGlvbiB0byBzY3JpcHRzIGlmIHRoZQorICBSRkMxNDEzIFs8QSBIUkVGPSIjWzExXSI+MTE8L0E+XSBsb29rdXAgaXMgcGVyZm9ybWVkLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjEyIj4KKyAgICA2LjEuMTIuIFJFTU9URV9VU0VSCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBJZiB0aGUgcmVxdWVzdCByZXF1aXJlZCBhdXRoZW50aWNhdGlvbiB1c2luZyB0aGUgIkJhc2ljIgorICBtZWNoYW5pc20gKDxFTT5pLmUuPC9FTT4sIHRoZSBBVVRIX1RZUEUKKyAgbWV0YXZhcmlhYmxlIGlzIHNldAorICB0byAiQmFzaWMiKSwgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIFJFTU9URV9VU0VSCisgIG1ldGF2YXJpYWJsZSBpcyBzZXQgdG8gdGhlCisgIHVzZXItSUQgc3VwcGxpZWQuICBJbiBhbGwgb3RoZXIgY2FzZXMKKyAgdGhlIHZhbHVlIG9mIHRoaXMgbWV0YXZhcmlhYmxlCisgIGlzIHVuZGVmaW5lZC4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgUkVNT1RFX1VTRVIgPSAqT0NURVQKKyAgPC9QUkU+CisgIDxQPgorICBUaGlzIHZhcmlhYmxlIGlzIHNwZWNpZmljIHRvIHJlcXVlc3RzIG1hZGUgPEVNPnZpYTwvRU0+IHRoZQorICBIVFRQIHByb3RvY29sLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIFNIT1VMRCBwcm92aWRlIHRoaXMgbWV0YXZhcmlhYmxlCisgIHRvIHNjcmlwdHMuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuMTMiPgorICAgIDYuMS4xMy4gUkVRVUVTVF9NRVRIT0QKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBSRVFVRVNUX01FVEhPRAorICBtZXRhdmFyaWFibGUKKyAgaXMgc2V0IHRvIHRoZQorICBtZXRob2Qgd2l0aCB3aGljaCB0aGUgcmVxdWVzdCB3YXMgbWFkZSwgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24KKyAgNS4xLjEgb2YgdGhlIEhUVFAvMS4wIHNwZWNpZmljYXRpb24gWzxBIEhSRUY9IiNbM10iPjM8L0E+XSBhbmQKKyAgc2VjdGlvbiA1LjEuMSBvZiB0aGUKKyAgSFRUUC8xLjEgc3BlY2lmaWNhdGlvbiBbPEEgSFJFRj0iI1s4XSI+ODwvQT5dLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBSRVFVRVNUX01FVEhPRCAgID0gaHR0cC1tZXRob2QKKyAgICBodHRwLW1ldGhvZCAgICAgID0gIkdFVCIgfCAiSEVBRCIgfCAiUE9TVCIgfCAiUFVUIiB8ICJERUxFVEUiCisgICAgICAgICAgICAgICAgICAgICAgIHwgIk9QVElPTlMiIHwgIlRSQUNFIiB8IGV4dGVuc2lvbi1tZXRob2QKKyAgICBleHRlbnNpb24tbWV0aG9kID0gdG9rZW4KKyAgPC9QUkU+CisgIDxQPgorICBUaGUgbWV0aG9kIGlzIGNhc2Ugc2Vuc2l0aXZlLgorICBDR0kvMS4xIHNlcnZlcnMgTUFZIGNob29zZSB0byBwcm9jZXNzIHNvbWUgbWV0aG9kcworICBkaXJlY3RseSByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZW0gdG8gc2NyaXB0cy4KKyAgPC9QPgorICA8UD4KKyAgVGhpcyB2YXJpYWJsZSBpcyBzcGVjaWZpYyB0byByZXF1ZXN0cyBtYWRlIHdpdGggSFRUUC4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS4xNCI+CisgICAgNi4xLjE0LiBTQ1JJUFRfTkFNRQorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlIFNDUklQVF9OQU1FCisgIG1ldGF2YXJpYWJsZQorICBpcworICBzZXQgdG8gYSBVUkwgcGF0aCB0aGF0IGNvdWxkIGlkZW50aWZ5IHRoZSBDR0kgc2NyaXB0IChyYXRoZXIgdGhhbiB0aGUKKyAgc2NyaXB0J3MKKyAgb3V0cHV0KS4gVGhlIHN5bnRheCBhbmQgc2VtYW50aWNzIGFyZSBpZGVudGljYWwgdG8gYQorICBkZWNvZGVkIEhUVFAgVVJMICdwYXRoJyB0b2tlbgorICAoc2VlIFJGQyAyMzk2CisgIFs8QSBIUkVGPSIjWzRdIj40PC9BPl0pLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBTQ1JJUFRfTkFNRSA9ICIiIHwgKCAiLyIgWyBwYXRoIF0gKQorICA8L1BSRT4KKyAgPFA+CisgIFRoZSBTQ1JJUFRfTkFNRSBzdHJpbmcgaXMgc29tZSBsZWFkaW5nIHBhcnQgb2YgdGhlICZsdDtwYXRoJmd0OyBjb21wb25lbnQKKyAgb2YgdGhlIFNjcmlwdC1VUkkgZGVyaXZlZCBpbiBzb21lCisgIGltcGxlbWVudGF0aW9uIGRlZmluZWQgbWFubmVyLgorICBObyBQQVRIX0lORk8gb3IgUVVFUllfU1RSSU5HIHNlZ21lbnRzCisgIChzZWUgc2VjdGlvbnMgPEEgSFJFRj0iIzYuMS42Ij42LjEuNjwvQT4gYW5kCisgIDxBIEhSRUY9IiM2LjEuOCI+Ni4xLjg8L0E+KSBhcmUgaW5jbHVkZWQKKyAgaW4gdGhlIFNDUklQVF9OQU1FIHZhbHVlLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgcHJvdmlkZSB0aGlzIG1ldGF2YXJpYWJsZQorICB0byBzY3JpcHRzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjE1Ij4KKyAgICA2LjEuMTUuIFNFUlZFUl9OQU1FCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgU0VSVkVSX05BTUUKKyAgbWV0YXZhcmlhYmxlCisgIGlzIHNldCB0byB0aGUKKyAgbmFtZSAgb2YgdGhlCisgIHNlcnZlciwgYXMKKyAgZGVyaXZlZCBmcm9tIHRoZSAmbHQ7aG9zdCZndDsgcGFydCBvZiB0aGUKKyAgU2NyaXB0LVVSSQorICAoc2VlIDxBIEhSRUY9IiMzLjIiPnNlY3Rpb24gMy4yPC9BPikuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFNFUlZFUl9OQU1FID0gaG9zdG5hbWUgfCBob3N0bnVtYmVyCisgIDwvUFJFPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS4xNiI+CisgICAgNi4xLjE2LiBTRVJWRVJfUE9SVAorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlIFNFUlZFUl9QT1JUCisgIG1ldGF2YXJpYWJsZQorICBpcyBzZXQgdG8gdGhlCisgIHBvcnQgb24gd2hpY2ggdGhlCisgIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLCBhcyB1c2VkIGluIHRoZSAmbHQ7cG9ydCZndDsKKyAgcGFydCBvZiB0aGUgU2NyaXB0LVVSSS4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgU0VSVkVSX1BPUlQgPSAxKmRpZ2l0CisgIDwvUFJFPgorICA8UD4KKyAgSWYgdGhlICZsdDtwb3J0Jmd0OyBwb3J0aW9uIG9mIHRoZSBzY3JpcHQtVVJJIGlzIGJsYW5rLCB0aGUgYWN0dWFsCisgIHBvcnQgbnVtYmVyIHVwb24gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIE1VU1QgYmUgc3VwcGxpZWQuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBwcm92aWRlIHRoaXMgbWV0YXZhcmlhYmxlCisgIHRvIHNjcmlwdHMuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuMTciPgorICAgIDYuMS4xNy4gU0VSVkVSX1BST1RPQ09MCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgU0VSVkVSX1BST1RPQ09MCisgIG1ldGF2YXJpYWJsZQorICBpcyBzZXQgdG8KKyAgdGhlCisgIG5hbWUgYW5kIHJldmlzaW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBwcm90b2NvbCB3aXRoIHdoaWNoCisgIHRoZQorICByZXF1ZXN0CisgIGFycml2ZWQuICBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgcHJvdG9jb2wgdmVyc2lvbiB1c2VkIGJ5CisgIHRoZSBzZXJ2ZXIgaW4gaXRzIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFNFUlZFUl9QUk9UT0NPTCAgID0gSFRUUC1WZXJzaW9uIHwgZXh0ZW5zaW9uLXZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0ZW5zaW9uLXRva2VuCisgICAgSFRUUC1WZXJzaW9uICAgICAgPSAiSFRUUCIgIi8iIDEqZGlnaXQgIi4iIDEqZGlnaXQKKyAgICBleHRlbnNpb24tdmVyc2lvbiA9IHByb3RvY29sICIvIiAxKmRpZ2l0ICIuIiAxKmRpZ2l0CisgICAgcHJvdG9jb2wgICAgICAgICAgPSAxKiggYWxwaGEgfCBkaWdpdCB8ICIrIiB8ICItIiB8ICIuIiApCisgICAgZXh0ZW5zaW9uLXRva2VuICAgPSB0b2tlbgorICA8L1BSRT4KKyAgPFA+CisgICdwcm90b2NvbCcgaXMgYSB2ZXJzaW9uIG9mIHRoZSAmbHQ7c2NoZW1lJmd0OyBwYXJ0IG9mIHRoZQorICBTY3JpcHQtVVJJLCBidXQgaXMKKyAgbm90IGlkZW50aWNhbCB0byBpdC4gIEZvciBleGFtcGxlLCB0aGUgc2NoZW1lIG9mIGEgcmVxdWVzdCBtYXkgYmUKKyAgIjxTQU1QPmh0dHBzPC9TQU1QPiIgd2hpbGUgdGhlIHByb3RvY29sIHJlbWFpbnMgIjxTQU1QPmh0dHA8L1NBTVA+Ii4KKyAgVGhlIHByb3RvY29sIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZSwgYnV0CisgIGJ5IGNvbnZlbnRpb24sICdwcm90b2NvbCcgaXMgaW4KKyAgdXBwZXIgY2FzZS4KKyAgPC9QPgorICA8UD4KKyAgQSB3ZWxsLWtub3duIGV4dGVuc2lvbiB0b2tlbiB2YWx1ZSBpcyAiSU5DTFVERUQiLAorICB3aGljaCBzaWduYWxzIHRoYXQgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaXMgYmVpbmcgaW5jbHVkZWQgYXMgcGFydCBvZgorICBhIGNvbXBvc2l0ZSBkb2N1bWVudCwgcmF0aGVyIHRoYW4gYmVpbmcgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlCisgIGNsaWVudCByZXF1ZXN0LgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgcHJvdmlkZSB0aGlzIG1ldGF2YXJpYWJsZQorICB0byBzY3JpcHRzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjE4Ij4KKyAgICA2LjEuMTguIFNFUlZFUl9TT0ZUV0FSRQorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlIFNFUlZFUl9TT0ZUV0FSRQorICBtZXRhdmFyaWFibGUKKyAgaXMgc2V0IHRvIHRoZQorICBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBzZXJ2ZXIgc29mdHdhcmUgYW5zd2VyaW5nIHRoZQorICByZXF1ZXN0IChhbmQgcnVubmluZyB0aGUgZ2F0ZXdheSkuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFNFUlZFUl9TT0ZUV0FSRSA9IDEqcHJvZHVjdAorICAgIHByb2R1Y3QgICAgICAgICA9IHRva2VuIFsgIi8iIHByb2R1Y3QtdmVyc2lvbiBdCisgICAgcHJvZHVjdC12ZXJzaW9uID0gdG9rZW4KKyAgPC9QUkU+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgcHJvdmlkZSB0aGlzIG1ldGF2YXJpYWJsZQorICB0byBzY3JpcHRzLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iNi4yIj4KKyAgICA2LjIuIFJlcXVlc3QgTWVzc2FnZS1Cb2RpZXMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIEFzIHRoZXJlIG1heSBiZSBhIGRhdGEgZW50aXR5IGF0dGFjaGVkIHRvIHRoZSByZXF1ZXN0LCB0aGVyZSBNVVNUIGJlCisgIGEgc3lzdGVtIGRlZmluZWQgbWV0aG9kIGZvciB0aGUgc2NyaXB0IHRvIHJlYWQKKyAgdGhlc2UgZGF0YS4gVW5sZXNzCisgIGRlZmluZWQgb3RoZXJ3aXNlLCB0aGlzIHdpbGwgYmUgPEVNPnZpYTwvRU0+IHRoZSAnc3RhbmRhcmQgaW5wdXQnIGZpbGUKKyAgZGVzY3JpcHRvci4KKyAgPC9QPgorICA8UD4KKyAgSWYgdGhlIENPTlRFTlRfTEVOR1RIIHZhbHVlIChzZWUgPEEgSFJFRj0iIzYuMS4yIj5zZWN0aW9uIDYuMS4yPC9BPikKKyAgaXMgbm9uLU5VTEwsIHRoZSBzZXJ2ZXIgTVVTVCBzdXBwbHkgYXQgbGVhc3QgdGhhdCBtYW55IGJ5dGVzIHRvCisgIHNjcmlwdHMgb24gdGhlIHN0YW5kYXJkIGlucHV0IHN0cmVhbS4KKyAgU2NyaXB0cyBhcmUKKyAgbm90IG9ibGlnZWQgdG8gcmVhZCB0aGUgZGF0YS4KKyAgU2VydmVycyBNQVkgc2lnbmFsIGFuIEVPRiBjb25kaXRpb24gYWZ0ZXIgQ09OVEVOVF9MRU5HVEggYnl0ZXMgaGF2ZSBiZWVuCisgIHJlYWQsIGJ1dCBhcmUKKyAgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIFRoZXJlZm9yZSwgc2NyaXB0cworICBNVVNUIE5PVAorICBhdHRlbXB0IHRvIHJlYWQgbW9yZSB0aGFuIENPTlRFTlRfTEVOR1RIIGJ5dGVzLCBldmVuIGlmIG1vcmUgZGF0YQorICBhcmUgYXZhaWxhYmxlLgorICA8L1A+CisgIDxQPgorICBGb3Igbm9uLXBhcnNlZCBoZWFkZXIgKE5QSCkgc2NyaXB0cyAoc2VlCisgIDxBIEhSRUY9IiM3LjEiPnNlY3Rpb24gNy4xPC9BPgorICBiZWxvdyksCisgIHNlcnZlcnMgU0hPVUxECisgIGF0dGVtcHQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEKKyAgc3VwcGxpZWQgdG8gdGhlIHNjcmlwdCBhcmUgcHJlY2lzZWx5CisgIGFzIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgYW5kIHVuYWx0ZXJlZCBieQorICB0aGUgc2VydmVyLgorICA8L1A+CisgIDxQPgorICA8QSBIUkVGPSIjOC4xLjIiPlNlY3Rpb24gOC4xLjI8L0E+IGRlc2NyaWJlcyB0aGUgcmVxdWlyZW1lbnRzIG9mCisgIHNlcnZlcnMgd2l0aCByZWdhcmQgdG8gcmVxdWVzdHMgdGhhdCBpbmNsdWRlCisgIG1lc3NhZ2UtYm9kaWVzLgorICA8L1A+CisKKyAgPEgyPgorICAgPEEgTkFNRT0iNy4wIj4KKyAgICA3LiBEYXRhIE91dHB1dCBmcm9tIHRoZSBDR0kgU2NyaXB0CisgICA8L0E+CisgIDwvSDI+CisgIDxQPgorICBUaGVyZSBNVVNUIGJlIGEgc3lzdGVtIGRlZmluZWQgbWV0aG9kIGZvciB0aGUgc2NyaXB0IHRvIHNlbmQgZGF0YQorICBiYWNrIHRvIHRoZSBzZXJ2ZXIgb3IgY2xpZW50OyBhIHNjcmlwdCBNVVNUIGFsd2F5cyByZXR1cm4gc29tZSBkYXRhLgorICBVbmxlc3MgZGVmaW5lZCBvdGhlcndpc2UsIHRoaXMgd2lsbCBiZSA8RU0+dmlhPC9FTT4gdGhlICdzdGFuZGFyZAorICBvdXRwdXQnIGZpbGUgZGVzY3JpcHRvci4KKyAgPC9QPgorICA8UD4KKyAgVGhlcmUgYXJlIHR3byBmb3JtcyBvZiBvdXRwdXQgdGhhdCAgc2NyaXB0cyBjYW4gc3VwcGx5IHRvIHNlcnZlcnM6IG5vbi1wYXJzZWQKKyAgaGVhZGVyIChOUEgpIG91dHB1dCwgYW5kIHBhcnNlZCBoZWFkZXIgb3V0cHV0LgorICBTZXJ2ZXJzIE1VU1Qgc3VwcG9ydCBwYXJzZWQgaGVhZGVyCisgIG91dHB1dCBhbmQgTUFZIHN1cHBvcnQgTlBIIG91dHB1dC4gIFRoZSBtZXRob2Qgb2YKKyAgZGlzdGluZ3Vpc2hpbmcgYmV0d2VlbiB0aGUgdHdvCisgIHR5cGVzIG9mIG91dHB1dCAob3Igc2NyaXB0cykgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZC4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBNQVkgaW1wbGVtZW50IGEgdGltZW91dCBwZXJpb2Qgd2l0aGluIHdoaWNoIGRhdGEgbXVzdCBiZQorICByZWNlaXZlZCBmcm9tIHNjcmlwdHMuICBJZiBhIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVzIHN1Y2gKKyAgYSB0aW1lb3V0IGFuZCByZWNlaXZlcyBubyBkYXRhIGZyb20gYSBzY3JpcHQgd2l0aGluIHRoZSB0aW1lb3V0CisgIHBlcmlvZCwgdGhlIHNlcnZlciBNQVkgdGVybWluYXRlIHRoZSBzY3JpcHQgcHJvY2VzcyBhbmQgU0hPVUxECisgIGFib3J0IHRoZSBjbGllbnQgcmVxdWVzdCB3aXRoCisgIGVpdGhlciBhCisgICc1MDQgR2F0ZXdheSBUaW1lZCBPdXQnIG9yIGEKKyAgJzUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InIHJlc3BvbnNlLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iNy4xIj4KKyAgICA3LjEuIE5vbi1QYXJzZWQgSGVhZGVyIE91dHB1dAorICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgU2NyaXB0cyB1c2luZyB0aGUgTlBIIG91dHB1dCBmb3JtCisgIE1VU1QgcmV0dXJuIGEgY29tcGxldGUgSFRUUCByZXNwb25zZSBtZXNzYWdlLCBhcyBkZXNjcmliZWQKKyAgaW4gU2VjdGlvbiA2IG9mIHRoZSBIVFRQIHNwZWNpZmljYXRpb25zCisgIFs8QSBIUkVGPSIjWzNdIj4zPC9BPiw8QSBIUkVGPSIjWzhdIj44PC9BPl0uCisgICBOUEggc2NyaXB0cworICBNVVNUIHVzZSB0aGUgU0VSVkVSX1BST1RPQ09MIHZhcmlhYmxlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0CisgIGZvciBhIHJlc3BvbnNlLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzCisgIFNIT1VMRCBhdHRlbXB0IHRvIGVuc3VyZSB0aGF0IHRoZSBzY3JpcHQgb3V0cHV0IGlzIHNlbnQKKyAgZGlyZWN0bHkgdG8gdGhlIGNsaWVudCwgd2l0aCBtaW5pbWFsCisgIGludGVybmFsIGFuZCBubyB0cmFuc3BvcnQtdmlzaWJsZQorICBidWZmZXJpbmcuCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSI3LjIiPgorICAgIDcuMi4gUGFyc2VkIEhlYWRlciBPdXRwdXQKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFNjcmlwdHMgdXNpbmcgdGhlIHBhcnNlZCBoZWFkZXIgb3V0cHV0IGZvcm0gTVVTVCBzdXBwbHkKKyAgYSBDR0kgcmVzcG9uc2UgbWVzc2FnZSB0byB0aGUgc2VydmVyCisgIGFzIGZvbGxvd3M6CisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIENHSS1SZXNwb25zZSAgID0gKm9wdGlvbmFsLWZpZWxkIENHSS1GaWVsZCAqb3B0aW9uYWwtZmllbGQgTkwgWyBNZXNzYWdlLUJvZHkgXQorICAgIG9wdGlvbmFsLWZpZWxkID0gKCBDR0ktRmllbGQgfCBIVFRQLUZpZWxkICkKKyAgICBDR0ktRmllbGQgICAgICA9IENvbnRlbnQtdHlwZQorICAgICAgICAgICAgICAgICAgIHwgTG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICB8IFN0YXR1cworICAgICAgICAgICAgICAgICAgIHwgZXh0ZW5zaW9uLWhlYWRlcgorICA8L1BSRT4KKyAgPFA+PCEtLSAjIyMjIyBJZiBIVFRQIGRlZmluZXMgeC1oZWFkZXJzLCByZW1vdmUgb3VycyBleGNlcHQgeC1jZ2ktIC0tPgorICBUaGUgcmVzcG9uc2UgY29tcHJpc2VzIGEgaGVhZGVyIGFuZCBhIGJvZHksIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuCisgIFRoZSBib2R5IG1heSBiZSBOVUxMLgorICBUaGUgaGVhZGVyIGZpZWxkcyBhcmUgZWl0aGVyIENHSSBoZWFkZXIgZmllbGRzIHRvIGJlIGludGVycHJldGVkIGJ5CisgIHRoZSBzZXJ2ZXIsIG9yIEhUVFAgaGVhZGVyIGZpZWxkcworICB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgcmV0dXJuZWQKKyAgdG8gdGhlIGNsaWVudAorICBpZiB0aGUgcmVxdWVzdCBtZXRob2QgaXMgSFRUUC4gQXQgbGVhc3Qgb25lCisgIENHSS1GaWVsZCBNVVNUIGJlCisgIHN1cHBsaWVkLCBidXQgbm8gQ0dJICBmaWVsZCBuYW1lIG1heSBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlCisgIGluIGEgcmVzcG9uc2UuCisgIElmIGEgYm9keSBpcyBzdXBwbGllZCwgdGhlbiBhICI8U0FNUD5Db250ZW50LXR5cGU8L1NBTVA+IgorICBoZWFkZXIgZmllbGQgTVVTVCBiZQorICBzdXBwbGllZCBieSB0aGUgc2NyaXB0LAorICBvdGhlcndpc2UgdGhlIHNjcmlwdCBNVVNUIHNlbmQgYSAiPFNBTVA+TG9jYXRpb248L1NBTVA+IgorICBvciAiPFNBTVA+U3RhdHVzPC9TQU1QPiIgaGVhZGVyIGZpZWxkLiBJZiBhCisgIDxTQU1QPkxvY2F0aW9uPC9TQU1QPiBDR0ktRmllbGQKKyAgaXMgcmV0dXJuZWQsIHRoZW4gdGhlIHNjcmlwdCBNVVNUIE5PVCBzdXBwbHkKKyAgYW55IEhUVFAtRmllbGRzLgorICA8L1A+CisgIDxQPgorICBFYWNoIGhlYWRlciBmaWVsZCBpbiBhIENHSS1SZXNwb25zZSBNVVNUIGJlIHNwZWNpZmllZCBvbiBhIHNpbmdsZSBsaW5lOworICBDR0kvMS4xIGRvZXMgbm90IHN1cHBvcnQgY29udGludWF0aW9uIGxpbmVzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNy4yLjEiPgorICAgIDcuMi4xLiBDR0kgaGVhZGVyIGZpZWxkcworICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlIENHSSBoZWFkZXIgZmllbGRzIGhhdmUgdGhlIGdlbmVyaWMgc3ludGF4OgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBnZW5lcmljLWZpZWxkICA9IGZpZWxkLW5hbWUgIjoiIFsgZmllbGQtdmFsdWUgXSBOTAorICAgIGZpZWxkLW5hbWUgICAgID0gdG9rZW4KKyAgICBmaWVsZC12YWx1ZSAgICA9ICooIGZpZWxkLWNvbnRlbnQgfCBMV1NQICkKKyAgICBmaWVsZC1jb250ZW50ICA9ICooIHRva2VuIHwgdHNwZWNpYWwgfCBxdW90ZWQtc3RyaW5nICkKKyAgPC9QUkU+CisgIDxQPgorICBUaGUgZmllbGQtbmFtZSBpcyBub3QgY2FzZSBzZW5zaXRpdmU7IGEgTlVMTCBmaWVsZCB2YWx1ZSBpcworICBlcXVpdmFsZW50IHRvIHRoZSBoZWFkZXIgZmllbGQgbm90IGJlaW5nIHNlbnQuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI3LjIuMS4xIj4KKyAgICA3LjIuMS4xLiBDb250ZW50LVR5cGUKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBJbnRlcm5ldCBNZWRpYSBUeXBlIFs8QSBIUkVGPSIjWzldIj45PC9BPl0gb2YgdGhlIGVudGl0eQorICBib2R5LCB3aGljaCBpcyB0byBiZSBzZW50IHVubW9kaWZpZWQgdG8gdGhlIGNsaWVudC4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgQ29udGVudC1UeXBlID0gIkNvbnRlbnQtVHlwZSIgIjoiIG1lZGlhLXR5cGUgTkwKKyAgPC9QUkU+CisgIDxQPgorICBUaGlzIGlzIGFjdHVhbGx5IGFuIEhUVFAtRmllbGQKKyAgcmF0aGVyIHRoYW4gYSBDR0ktRmllbGQsIGJ1dAorICBpdCBpcyBsaXN0ZWQgaGVyZSBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbmNlIGluIHRoZSBDR0kgZGlhbG9ndWUgYXMKKyAgYSBtZW1iZXIgb2YgdGhlICJvbmUgb2YgdGhlc2UgaXMgcmVxdWlyZWQiIHNldCBvZiBoZWFkZXIKKyAgZmllbGRzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNy4yLjEuMiI+CisgICAgNy4yLjEuMi4gTG9jYXRpb24KKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRvIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgc2NyaXB0IGlzIHJldHVybmluZyBhCisgIHJlZmVyZW5jZSB0byBhIGRvY3VtZW50IHJhdGhlciB0aGFuIGFuIGFjdHVhbCBkb2N1bWVudC4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgTG9jYXRpb24gICAgICAgICA9ICJMb2NhdGlvbiIgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICggZnJhZ21lbnQtVVJJIHwgcmVsLVVSTC1hYnMtcGF0aCApIE5MCisgICAgZnJhZ21lbnQtVVJJICAgICA9IFVSSSBbICMgZnJhZ21lbnRpZCBdCisgICAgVVJJICAgICAgICAgICAgICA9IHNjaGVtZSAiOiIgKnFjaGFyCisgICAgZnJhZ21lbnRpZCAgICAgICA9ICpxY2hhcgorICAgIHJlbC1VUkwtYWJzLXBhdGggPSAiLyIgWyBocGF0aCBdIFsgIj8iIHF1ZXJ5LXN0cmluZyBdCisgICAgaHBhdGggICAgICAgICAgICA9IGZwc2VnbWVudCAqKCAiLyIgcHNlZ21lbnQgKQorICAgIGZwc2VnbWVudCAgICAgICAgPSAxKmhjaGFyCisgICAgcHNlZ21lbnQgICAgICAgICA9ICpoY2hhcgorICAgIGhjaGFyICAgICAgICAgICAgPSBhbHBoYSB8IGRpZ2l0IHwgc2FmZSB8IGV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgIHwgIjoiIHwgIkAiIHwgIiYgfCAiPSIKKyAgPC9QUkU+CisgIDxQPgorICBUaGUgTG9jYXRpb24KKyAgdmFsdWUgaXMgZWl0aGVyIGFuIGFic29sdXRlIFVSSSB3aXRoIG9wdGlvbmFsIGZyYWdtZW50LAorICBhcyBkZWZpbmVkIGluIFJGQyAxNjMwIFs8QSBIUkVGPSIjWzFdIj4xPC9BPl0sIG9yIGFuIGFic29sdXRlIHBhdGgKKyAgd2l0aGluIHRoZSBzZXJ2ZXIncyBVUkkgc3BhY2UgKDxFTT5pLmUuPC9FTT4sCisgIG9taXR0aW5nIHRoZSBzY2hlbWUgYW5kIG5ldHdvcmstcmVsYXRlZCBmaWVsZHMpIGFuZCBvcHRpb25hbAorICBxdWVyeS1zdHJpbmcuIElmIGFuIGFic29sdXRlIFVSSSBpcyByZXR1cm5lZCBieSB0aGUgc2NyaXB0LAorICB0aGVuIHRoZQorICBzZXJ2ZXIgTVVTVCBnZW5lcmF0ZSBhCisgICczMDIgcmVkaXJlY3QnIEhUVFAgcmVzcG9uc2UKKyAgbWVzc2FnZSB1bmxlc3MgdGhlIHNjcmlwdCBoYXMgc3VwcGxpZWQgYW4KKyAgZXhwbGljaXQgU3RhdHVzIHJlc3BvbnNlIGhlYWRlciBmaWVsZC4KKyAgU2NyaXB0cyByZXR1cm5pbmcgYW4gYWJzb2x1dGUgVVJJIE1BWSBjaG9vc2UgdG8KKyAgcHJvdmlkZSBhIG1lc3NhZ2UtYm9keS4gIFNlcnZlcnMgTVVTVCBtYWtlIGFueSBhcHByb3ByaWF0ZSBtb2RpZmljYXRpb25zCisgIHRvIHRoZSBzY3JpcHQncyBvdXRwdXQgdG8gZW5zdXJlIHRoZSByZXNwb25zZSB0byB0aGUgdXNlci1hZ2VudCBjb21wbGllcworICB3aXRoIHRoZSByZXNwb25zZSBwcm90b2NvbCB2ZXJzaW9uLgorICBJZiB0aGUgTG9jYXRpb24gdmFsdWUgaXMgYSBwYXRoLCB0aGVuIHRoZSBzZXJ2ZXIKKyAgTVVTVCBnZW5lcmF0ZQorICB0aGUgcmVzcG9uc2UgdGhhdCBpdCB3b3VsZCBoYXZlIHByb2R1Y2VkIGluIHJlc3BvbnNlIHRvIGEgcmVxdWVzdAorICBjb250YWluaW5nIHRoZSBVUkwKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgc2NoZW1lICI6Ly8iIFNFUlZFUl9OQU1FICI6IiBTRVJWRVJfUE9SVCByZWwtVVJMLWFicy1wYXRoCisgIDwvUFJFPgorICA8UD4KKyAgTm90ZTogSWYgdGhlIHJlcXVlc3Qgd2FzIGFjY29tcGFuaWVkIGJ5IGEKKyAgbWVzc2FnZS1ib2R5CisgIChzdWNoIGFzIGZvciBhIFBPU1QgcmVxdWVzdCksIGFuZCB0aGUgc2NyaXB0CisgIHJlZGlyZWN0cyB0aGUgcmVxdWVzdCB3aXRoIGEgTG9jYXRpb24gZmllbGQsIHRoZQorICBtZXNzYWdlLWJvZHkKKyAgbWF5IG5vdCBiZQorICBhdmFpbGFibGUgdG8gdGhlIHJlc291cmNlIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgcmVkaXJlY3QuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI3LjIuMS4zIj4KKyAgICA3LjIuMS4zLiBTdGF0dXMKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSAiPFNBTVA+U3RhdHVzPC9TQU1QPiIgaGVhZGVyIGZpZWxkIGlzIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIHNlcnZlciB3aGF0CisgIHN0YXR1cyBjb2RlIHRoZSBzZXJ2ZXIgTVVTVCB1c2UgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFN0YXR1cyAgICAgICAgPSAiU3RhdHVzIiAiOiIgZGlnaXQgZGlnaXQgZGlnaXQgU1AgcmVhc29uLXBocmFzZSBOTAorICAgIHJlYXNvbi1waHJhc2UgPSAqJmx0O0NIQVIsIGV4Y2x1ZGluZyBDVExzLCBOTCZndDsKKyAgPC9QUkU+CisgIDxQPgorICBUaGUgdmFsaWQgc3RhdHVzIGNvZGVzIGFyZSBsaXN0ZWQgaW4gc2VjdGlvbiA2LjEuMSBvZiB0aGUgSFRUUC8xLjAKKyAgc3BlY2lmaWNhdGlvbnMgWzxBIEhSRUY9IiNbM10iPjM8L0E+XS4gSWYgdGhlIFNFUlZFUl9QUk9UT0NPTCBpcworICAiSFRUUC8xLjEiLCB0aGVuIHRoZSBzdGF0dXMgY29kZXMgZGVmaW5lZCBpbiB0aGUgSFRUUC8xLjEKKyAgc3BlY2lmaWNhdGlvbiBbPEEgSFJFRj0iI1s4XSI+ODwvQT5dIG1heQorICBiZSB1c2VkLiBJZiB0aGUgc2NyaXB0IGRvZXMgbm90IHJldHVybiBhICI8U0FNUD5TdGF0dXM8L1NBTVA+IiBoZWFkZXIKKyAgZmllbGQsIHRoZW4gIjIwMCBPSyIgU0hPVUxEIGJlIGFzc3VtZWQgYnkgdGhlIHNlcnZlci4KKyAgPC9QPgorICA8UD4KKyAgSWYgYSBzY3JpcHQgaXMgYmVpbmcgdXNlZCB0byBoYW5kbGUgYSBwYXJ0aWN1bGFyIGVycm9yIG9yIGNvbmRpdGlvbgorICBlbmNvdW50ZXJlZCBieSB0aGUgc2VydmVyLCBzdWNoIGFzIGEgJzQwNCBOb3QgRm91bmQnIGVycm9yLCB0aGUgc2NyaXB0CisgIFNIT1VMRCB1c2UgdGhlICI8U0FNUD5TdGF0dXM8L1NBTVA+IiBDR0kgaGVhZGVyIGZpZWxkIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IKKyAgY29uZGl0aW9uIGJhY2sgdG8gdGhlIGNsaWVudC4gIDxFTT5FLmcuPC9FTT4sIGluIHRoZSBleGFtcGxlIG1lbnRpb25lZCBpdAorICBTSE9VTEQgaW5jbHVkZSBhICJTdGF0dXM6Jm5ic3A7NDA0Jm5ic3A7Tm90Jm5ic3A7Rm91bmQiIGluIHRoZQorICBoZWFkZXIgZGF0YSByZXR1cm5lZCB0byB0aGUgc2VydmVyLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNy4yLjEuNCI+CisgICAgNy4yLjEuNC4gRXh0ZW5zaW9uIGhlYWRlciBmaWVsZHMKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFNjcmlwdHMgTUFZIGluY2x1ZGUgaW4gdGhlaXIgQ0dJIHJlc3BvbnNlIGhlYWRlciBhZGRpdGlvbmFsIGZpZWxkcworICBub3QgZGVmaW5lZCBpbiB0aGlzIG9yIHRoZSBIVFRQIHNwZWNpZmljYXRpb24uCisgIFRoZXNlIGFyZSBjYWxsZWQgImV4dGVuc2lvbiIgZmllbGRzLAorICBhbmQgaGF2ZSB0aGUgc3ludGF4IG9mIGEgPFNBTVA+Z2VuZXJpYy1maWVsZDwvU0FNUD4gYXMgZGVmaW5lZCBpbgorICA8QSBIUkVGPSIjNy4yLjEiPnNlY3Rpb24gNy4yLjE8L0E+LiAgVGhlIG5hbWUgb2YgYW4gZXh0ZW5zaW9uIGZpZWxkCisgIE1VU1QgTk9UIGNvbmZsaWN0IHdpdGggYSBmaWVsZCBuYW1lIGRlZmluZWQgaW4gdGhpcyBvciBhbnkgb3RoZXIKKyAgc3BlY2lmaWNhdGlvbjsgZXh0ZW5zaW9uIGZpZWxkIG5hbWVzIFNIT1VMRCBiZWdpbiB3aXRoICJYLUNHSS0iCisgIHRvIGVuc3VyZSB1bmlxdWVuZXNzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNy4yLjIiPgorICAgIDcuMi4yLiBIVFRQIGhlYWRlciBmaWVsZHMKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBzY3JpcHQgTUFZIHJldHVybiBhbnkgb3RoZXIgaGVhZGVyIGZpZWxkcyBkZWZpbmVkIGJ5IHRoZQorICBzcGVjaWZpY2F0aW9uCisgIGZvciB0aGUgU0VSVkVSX1BST1RPQ09MIChIVFRQLzEuMCBbPEEgSFJFRj0iI1szXSI+MzwvQT5dIG9yIEhUVFAvMS4xCisgIFs8QSBIUkVGPSIjWzhdIj44PC9BPl0pLgorICBTZXJ2ZXJzIE1VU1QgcmVzb2x2ZSBjb25mbGljdHMgYmV0ZWVuIENHSSBoZWFkZXIKKyAgYW5kIEhUVFAgaGVhZGVyIGZvcm1hdHMgb3IgbmFtZXMgKHNlZSA8QSBIUkVGPSIjOC4wIj5zZWN0aW9uIDg8L0E+KS4KKyAgPC9QPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjguMCI+CisgICAgOC4gU2VydmVyIEltcGxlbWVudGF0aW9uCisgICA8L0E+CisgIDwvSDI+CisgIDxQPgorICBUaGlzIHNlY3Rpb24gZGVmaW5lcyB0aGUgcmVxdWlyZW1lbnRzIHRoYXQgbXVzdCBiZSBtZXQgYnkgSFRUUAorICBzZXJ2ZXJzIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBjb2hlcmVudCBhbmQgY29ycmVjdCBDR0kvMS4xCisgIGVudmlyb25tZW50IGluIHdoaWNoIHNjcmlwdHMgbWF5IGZ1bmN0aW9uLiAgSXQgaXMgaW50ZW5kZWQKKyAgcHJpbWFyaWx5IGZvciBzZXJ2ZXIgaW1wbGVtZW50b3JzLCBidXQgaXQgaXMgdXNlZnVsIGZvcgorICBzY3JpcHQgYXV0aG9ycyB0byBiZSBmYW1pbGlhciB3aXRoIHRoZSBpbmZvcm1hdGlvbiBhcyB3ZWxsLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iOC4xIj4KKyAgICA4LjEuIFJlcXVpcmVtZW50cyBmb3IgU2VydmVycworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgSW4gb3JkZXIgdG8gYmUgY29uc2lkZXJlZCBDR0kvMS4xLWNvbXBsaWFudCwgYSBzZXJ2ZXIgbXVzdCBtZWV0CisgIGNlcnRhaW4gYmFzaWMgY3JpdGVyaWEgYW5kIHByb3ZpZGUgY2VydGFpbiBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkuCisgIFRoZSBkZXRhaWxzIG9mIHRoZXNlIHJlcXVpcmVtZW50cyBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSI4LjEuMSI+CisgICAgOC4xLjEuIFNjcmlwdC1VUkkKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBzdXBwb3J0IHRoZSBzdGFuZGFyZCBtZWNoYW5pc20gKGRlc2NyaWJlZCBiZWxvdykgd2hpY2gKKyAgYWxsb3dzCisgIHNjcmlwdCBhdXRob3JzIHRvIGRldGVybWluZQorICB3aGF0IFVSTCB0byB1c2UgaW4gZG9jdW1lbnRzCisgIHdoaWNoIHJlZmVyZW5jZSB0aGUgc2NyaXB0OworICBzcGVjaWZpY2FsbHksIHdoYXQgVVJMIHRvIHVzZSBpbiBvcmRlciB0bworICBhY2hpZXZlIHBhcnRpY3VsYXIgc2V0dGluZ3Mgb2YgdGhlCisgIG1ldGF2YXJpYWJsZXMuIFRoaXMKKyAgbWVjaGFuaXNtIGlzIGFzIGZvbGxvd3M6CisgIDwvUD4KKyAgPFA+CisgIFRoZSBzZXJ2ZXIKKyAgTVVTVCB0cmFuc2xhdGUgdGhlIGhlYWRlciBkYXRhIGZyb20gdGhlIENHSSBoZWFkZXIgZmllbGQgc3ludGF4IHRvCisgIHRoZSBIVFRQCisgIGhlYWRlciBmaWVsZCBzeW50YXggaWYgdGhlc2UgZGlmZmVyLiBGb3IgZXhhbXBsZSwgdGhlIGNoYXJhY3RlcgorICBzZXF1ZW5jZSBmb3IKKyAgbmV3bGluZSAoc3VjaCBhcyBVbml4J3MgQVNDSUkgTkwpIHVzZWQgYnkgQ0dJIHNjcmlwdHMgbWF5IG5vdCBiZSB0aGUKKyAgc2FtZSBhcyB0aGF0IHVzZWQgYnkgSFRUUCAoQVNDSUkgQ1IgZm9sbG93ZWQgYnkgTEYpLiBUaGUgc2VydmVyIE1VU1QKKyAgYWxzbyByZXNvbHZlIGFueSBjb25mbGljdHMgYmV0d2VlbiBoZWFkZXIgZmllbGRzIHJldHVybmVkIGJ5IHRoZSBzY3JpcHQKKyAgYW5kIGhlYWRlciBmaWVsZHMgdGhhdCBpdCB3b3VsZCBvdGhlcndpc2Ugc2VuZCBpdHNlbGYuCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSI4LjEuMiI+CisgICAgOC4xLjIuIFJlcXVlc3QgTWVzc2FnZS1ib2R5IEhhbmRsaW5nCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGVzZSBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3Igc2VydmVyIGhhbmRsaW5nIG9mIG1lc3NhZ2UtYm9kaWVzIGRpcmVjdGVkCisgIHRvIENHSS8xLjEgcmVzb3VyY2VzOgorICA8L1A+CisgIDxPTD4KKyAgIDxMST5UaGUgbWVzc2FnZS1ib2R5IHRoZSBzZXJ2ZXIgcHJvdmlkZXMgdG8gdGhlIENHSSBzY3JpcHQgTVVTVAorICAgIGhhdmUgYW55IHRyYW5zZmVyIGVuY29kaW5ncyByZW1vdmVkLgorICAgPC9MST4KKyAgIDxMST5UaGUgc2VydmVyIE1VU1QgZGVyaXZlIGFuZCBwcm92aWRlIGEgdmFsdWUgZm9yIHRoZSBDT05URU5UX0xFTkdUSAorICAgIG1ldGF2YXJpYWJsZSB0aGF0IHJlZmxlY3RzIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UtYm9keSBhZnRlciBhbnkKKyAgICB0cmFuc2ZlciBkZWNvZGluZy4KKyAgIDwvTEk+CisgICA8TEk+VGhlIHNlcnZlciBNVVNUIGxlYXZlIGludGFjdCBhbnkgY29udGVudC1lbmNvZGluZ3Mgb2YgdGhlIG1lc3NhZ2UtYm9keS4KKyAgIDwvTEk+CisgIDwvT0w+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iOC4xLjMiPgorICAgIDguMS4zLiBSZXF1aXJlZCBNZXRhdmFyaWFibGVzCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgcHJvdmlkZSBzY3JpcHRzIHdpdGggY2VydGFpbiBpbmZvcm1hdGlvbiBhbmQKKyAgbWV0YXZhcmlhYmxlcworICBhcyBkZXNjcmliZWQgaW4gPEEgSFJFRj0iIzguMyI+c2VjdGlvbiA4LjM8L0E+LgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iOC4xLjQiPgorICAgIDguMS40LiBSZXNwb25zZSBDb21wbGlhbmNlCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgZW5zdXJlIHRoYXQgcmVzcG9uc2VzIHNlbnQgdG8gdGhlIHVzZXItYWdlbnQgbWVldCBhbGwKKyAgcmVxdWlyZW1lbnRzIG9mIHRoZSBwcm90b2NvbCBsZXZlbCBpbiBlZmZlY3QuICBUaGlzIG1heSBpbnZvbHZlCisgIG1vZGlmeWluZywgZGVsZXRpbmcsIG9yIGF1Z21lbnRpbmcgYW55IGhlYWRlcgorICBmaWVsZHMgYW5kL29yIG1lc3NhZ2UtYm9keSBzdXBwbGllZCBieSB0aGUgc2NyaXB0LgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iOC4yIj4KKyAgICA4LjIuIFJlY29tbWVuZGF0aW9ucyBmb3IgU2VydmVycworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgU2VydmVycyBTSE9VTEQgcHJvdmlkZSB0aGUgIjxTQU1QPnF1ZXJ5PC9TQU1QPiIgY29tcG9uZW50IG9mIHRoZSBzY3JpcHQtVVJJCisgIGFzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gc2NyaXB0cyBpZiBpdCBkb2VzIG5vdAorICBjb250YWluIGFueSB1bmVuY29kZWQgJz0nIGNoYXJhY3RlcnMgYW5kIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGNhbgorICBiZSBnZW5lcmF0ZWQgaW4gYW4gdW5hbWJpZ3VvdXMgbWFubmVyLgorICAoU2VlIDxBIEhSRUY9IiM1LjAiPnNlY3Rpb24gNTwvQT4uKQorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIFNIT1VMRCBzZXQgdGhlIEFVVEhfVFlQRQorICBtZXRhdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9mIHRoZQorICAnPFNBTVA+YXV0aC1zY2hlbWU8L1NBTVA+JyB0b2tlbiBvZiB0aGUgIjxTQU1QPkF1dGhvcml6YXRpb248L1NBTVA+IgorICBmaWVsZCBpZiBpdCB3YXMgc3VwcGxpZWQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdCBoZWFkZXIuCisgIChTZWUgPEEgSFJFRj0iIzYuMS4xIj5zZWN0aW9uIDYuMS4xPC9BPi4pCisgIDwvUD4KKyAgPFA+CisgIFdoZXJlIGFwcGxpY2FibGUsIHNlcnZlcnMgU0hPVUxEIHNldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQorICB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBzY3JpcHQgaXMgbG9jYXRlZCBiZWZvcmUgaW52b2tpbmcKKyAgaXQuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTUFZIHJlamVjdCB3aXRoIGVycm9yICc0MDQgTm90IEZvdW5kJworICBhbnkgcmVxdWVzdHMgdGhhdCB3b3VsZCByZXN1bHQgaW4KKyAgYW4gZW5jb2RlZCAiLyIgYmVpbmcgZGVjb2RlZCBpbnRvIFBBVEhfSU5GTyBvciBTQ1JJUFRfTkFNRSwgYXMgdGhpcworICBtaWdodCByZXByZXNlbnQgYSBsb3NzIG9mIGluZm9ybWF0aW9uIHRvIHRoZSBzY3JpcHQuCisgIDwvUD4KKyAgPFA+CisgIEFsdGhvdWdoIHRoZSBzZXJ2ZXIgYW5kIHRoZSBDR0kgc2NyaXB0IG5lZWQgbm90IGJlIGNvbnNpc3RlbnQgaW4KKyAgdGhlaXIgaGFuZGxpbmcgb2YgVVJMIHBhdGhzIChjbGllbnQgVVJMcyBhbmQgdGhlIFBBVEhfSU5GTyBkYXRhLAorICByZXNwZWN0aXZlbHkpLCBzZXJ2ZXIgYXV0aG9ycyBtYXkgd2lzaCB0byBpbXBvc2UgY29uc2lzdGVuY3kuCisgIFNvIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gU0hPVUxEIGRlZmluZSBpdHMgYmVoYXZpb3VyIGZvciB0aGUKKyAgZm9sbG93aW5nIGNhc2VzOgorICA8L1A+CisgIDxPTD4KKyAgIDxMST5kZWZpbmUgYW55IHJlc3RyaWN0aW9ucyBvbiBhbGxvd2VkIGNoYXJhY3RlcnMsIGluIHBhcnRpY3VsYXIKKyAgICB3aGV0aGVyIEFTQ0lJIE5VTCBpcyBwZXJtaXR0ZWQ7CisgICA8L0xJPgorICAgPExJPmRlZmluZSBhbnkgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgcGF0aCBzZWdtZW50cywgaW4gcGFydGljdWxhcgorICAgIHdoZXRoZXIgbm9uLXRlcm1pbmFsIE5VTEwgc2VnbWVudHMgYXJlIHBlcm1pdHRlZDsKKyAgIDwvTEk+CisgICA8TEk+ZGVmaW5lIHRoZSBiZWhhdmlvdXIgZm9yIDxTQU1QPiIuIjwvU0FNUD4gb3IgPFNBTVA+Ii4uIjwvU0FNUD4gcGF0aAorICAgIHNlZ21lbnRzOyA8RU0+aS5lLjwvRU0+LCB3aGV0aGVyIHRoZXkgYXJlIHByb2hpYml0ZWQsIHRyZWF0ZWQgYXMKKyAgICBvcmRpbmFyeSBwYXRoCisgICAgc2VnbWVudHMgb3IgaW50ZXJwcmV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSByZWxhdGl2ZSBVUkwKKyAgICBzcGVjaWZpY2F0aW9uIFs8QSBIUkVGPSIjWzddIj43PC9BPl07CisgICA8L0xJPgorICAgPExJPmRlZmluZSBhbnkgbGltaXRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgaW5jbHVkaW5nIGxpbWl0cyBvbiBwYXRoIG9yCisgICAgc2VhcmNoIHN0cmluZyBsZW5ndGhzLCBhbmQgbGltaXRzIG9uIHRoZSB2b2x1bWUgb2YgaGVhZGVyIGRhdGEgdGhlIHNlcnZlcgorICAgIHdpbGwgcGFyc2UuCisgICA8L0xJPjwhLS0gIyMjIyMgTW92ZSB0aGUgZmllbGQgcmVzb2x1dGlvbi90cmFuc2xhdGlvbiBwYXJhIGJlbG93IGhlcmUgLS0+CisgIDwvT0w+CisgIDxQPgorICBTZXJ2ZXJzIE1BWSBnZW5lcmF0ZSB0aGUKKyAgU2NyaXB0LVVSSSBpbgorICBhbnkgd2F5IGZyb20gdGhlIGNsaWVudCBVUkksCisgIG9yIGZyb20gYW55IG90aGVyIGRhdGEgKGJ1dCB0aGUgYmVoYXZpb3VyIFNIT1VMRCBiZSBkb2N1bWVudGVkKS4KKyAgPC9QPgorICA8UD4KKyAgRm9yIG5vbi1wYXJzZWQgaGVhZGVyIChOUEgpIHNjcmlwdHMgKHNlZQorICA8QSBIUkVGPSIjNy4xIj5zZWN0aW9uIDcuMTwvQT4pLCBzZXJ2ZXJzIFNIT1VMRAorICBhdHRlbXB0IHRvIGVuc3VyZSB0aGF0IHRoZSBzY3JpcHQgaW5wdXQgY29tZXMgZGlyZWN0bHkgZnJvbSB0aGUKKyAgY2xpZW50LCB3aXRoIG1pbmltYWwgYnVmZmVyaW5nLiBGb3IgYWxsIHNjcmlwdHMgdGhlIGRhdGEgd2lsbCBiZQorICBhcyBzdXBwbGllZCBieSB0aGUgY2xpZW50LgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iOC4zIj4KKyAgICA4LjMuIFN1bW1hcnkgb2YKKyAgICBNZXRhVmFyaWFibGVzCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgcHJvdmlkZSB0aGUgZm9sbG93aW5nCisgIG1ldGF2YXJpYWJsZXMgdG8KKyAgc2NyaXB0cy4gIFNlZSB0aGUgaW5kaXZpZHVhbCBkZXNjcmlwdGlvbnMgZm9yIGV4Y2VwdGlvbnMgYW5kIHNlbWFudGljcy4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgQ09OVEVOVF9MRU5HVEggKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4yIj42LjEuMjwvQT4pCisgICAgQ09OVEVOVF9UWVBFIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMyI+Ni4xLjM8L0E+KQorICAgIEdBVEVXQVlfSU5URVJGQUNFIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuNCI+Ni4xLjQ8L0E+KQorICAgIFBBVEhfSU5GTyAoc2VjdGlvbiA8QSBIUkVGPSIjNi4xLjYiPjYuMS42PC9BPikKKyAgICBRVUVSWV9TVFJJTkcgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS44Ij42LjEuODwvQT4pCisgICAgUkVNT1RFX0FERFIgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS45Ij42LjEuOTwvQT4pCisgICAgUkVRVUVTVF9NRVRIT0QgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4xMyI+Ni4xLjEzPC9BPikKKyAgICBTQ1JJUFRfTkFNRSAoc2VjdGlvbiA8QSBIUkVGPSIjNi4xLjE0Ij42LjEuMTQ8L0E+KQorICAgIFNFUlZFUl9OQU1FIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMTUiPjYuMS4xNTwvQT4pCisgICAgU0VSVkVSX1BPUlQgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4xNiI+Ni4xLjE2PC9BPikKKyAgICBTRVJWRVJfUFJPVE9DT0wgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4xNyI+Ni4xLjE3PC9BPikKKyAgICBTRVJWRVJfU09GVFdBUkUgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4xOCI+Ni4xLjE4PC9BPikKKyAgPC9QUkU+CisgIDxQPgorICBTZXJ2ZXJzIFNIT1VMRCBkZWZpbmUgdGhlIGZvbGxvd2luZworICBtZXRhdmFyaWFibGVzIGZvciBzY3JpcHRzLgorICBTZWUgdGhlIGluZGl2aWR1YWwgZGVzY3JpcHRpb25zIGZvciBleGNlcHRpb25zIGFuZCBzZW1hbnRpY3MuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIEFVVEhfVFlQRSAoc2VjdGlvbiA8QSBIUkVGPSIjNi4xLjEiPjYuMS4xPC9BPikKKyAgICBSRU1PVEVfSE9TVCAoc2VjdGlvbiA8QSBIUkVGPSIjNi4xLjEwIj42LjEuMTA8L0E+KQorICA8L1BSRT4KKyAgPFA+CisgIEluIGFkZGl0aW9uLCBzZXJ2ZXJzIFNIT1VMRCBwcm92aWRlCisgIG1ldGF2YXJpYWJsZXMgZm9yIGFsbCBmaWVsZHMgcHJlc2VudAorICBpbiB0aGUgSFRUUCByZXF1ZXN0IGhlYWRlciwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRob3NlIGludm9sdmVkIHdpdGgKKyAgYWNjZXNzIGNvbnRyb2wuICBTZXJ2ZXJzIE1BWSBhdCB0aGVpciBkaXNjcmV0aW9uIHByb3ZpZGUKKyAgbWV0YXZhcmlhYmxlcworICBmb3IgYWNjZXNzIGNvbnRyb2wgZmllbGRzLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1BWSBkZWZpbmUgdGhlIGZvbGxvd2luZworICBtZXRhdmFyaWFibGVzLiAgU2VlIHRoZSBpbmRpdmlkdWFsCisgIGRlc2NyaXB0aW9ucyBmb3IgZXhjZXB0aW9ucyBhbmQgc2VtYW50aWNzLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBQQVRIX1RSQU5TTEFURUQgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS43Ij42LjEuNzwvQT4pCisgICAgUkVNT1RFX0lERU5UIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMTEiPjYuMS4xMTwvQT4pCisgICAgUkVNT1RFX1VTRVIgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4xMiI+Ni4xLjEyPC9BPikKKyAgPC9QUkU+CisgIDxQPgorICBTZXJ2ZXJzIE1BWQorICBhdCB0aGVpciBkaXNjcmV0aW9uIGRlZmluZSBhZGRpdGlvbmFsIGltcGxlbWVudGF0aW9uLXNwZWNpZmljCisgIGV4dGVuc2lvbiBtZXRhdmFyaWFibGVzCisgIHByb3ZpZGVkIHRoZWlyIG5hbWVzIGRvIG5vdAorICBjb25mbGljdCB3aXRoIGRlZmluZWQgaGVhZGVyIGZpZWxkIG5hbWVzLiAgSW1wbGVtZW50YXRpb24tc3BlY2lmaWMKKyAgbWV0YXZhcmlhYmxlIG5hbWVzIFNIT1VMRAorICBiZSBwcmVmaXhlZCB3aXRoICJYXyIgKDxFTT5lLmcuPC9FTT4sCisgICJYX0RCQSIpIHRvIGF2b2lkIHRoZSBwb3RlbnRpYWwgZm9yIHN1Y2ggY29uZmxpY3RzLgorICA8L1A+CisKKyAgPEgyPgorICAgPEEgTkFNRT0iOS4wIj4KKyAgICA5LgorICAgIFNjcmlwdCBJbXBsZW1lbnRhdGlvbgorICAgPC9BPgorICA8L0gyPgorICA8UD4KKyAgVGhpcyBzZWN0aW9uIGRlZmluZXMgdGhlIHJlcXVpcmVtZW50cyBhbmQgcmVjb21tZW5kYXRpb25zIGZvciBzY3JpcHRzCisgIHRoYXQgYXJlIGludGVuZGVkIHRvIGZ1bmN0aW9uIGluIGEgQ0dJLzEuMSBlbnZpcm9ubWVudC4gIEl0IGlzIGludGVuZGVkCisgIHByaW1hcmlseSBhcyBhIHJlZmVyZW5jZSBmb3Igc2NyaXB0IGF1dGhvcnMsIGJ1dCBzZXJ2ZXIgaW1wbGVtZW50b3JzCisgIHNob3VsZCBiZSBmYW1pbGlhciB3aXRoIHRoZXNlIGlzc3VlcyBhcyB3ZWxsLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iOS4xIj4KKyAgICA5LjEuIFJlcXVpcmVtZW50cyBmb3IgU2NyaXB0cworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgU2NyaXB0cyB1c2luZyB0aGUgcGFyc2VkLWhlYWRlciBtZXRob2QgdG8gY29tbXVuaWNhdGUgd2l0aCBzZXJ2ZXJzCisgIE1VU1Qgc3VwcGx5IGEgcmVzcG9uc2UgaGVhZGVyIHRvIHRoZSBzZXJ2ZXIuCisgIChTZWUgPEEgSFJFRj0iIzcuMCI+c2VjdGlvbiA3PC9BPi4pCisgIDwvUD4KKyAgPFA+CisgIFNjcmlwdHMgdXNpbmcgdGhlIE5QSCBtZXRob2QgdG8gY29tbXVuaWNhdGUgd2l0aCBzZXJ2ZXJzIE1VU1QKKyAgcHJvdmlkZSBjb21wbGV0ZSBIVFRQIHJlc3BvbnNlcywgYW5kIE1VU1QgdXNlIHRoZSB2YWx1ZSBvZiB0aGUKKyAgU0VSVkVSX1BST1RPQ09MIG1ldGF2YXJpYWJsZQorICB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGZvcm1hdC4KKyAgKFNlZSA8QSBIUkVGPSIjNy4xIj5zZWN0aW9uIDcuMTwvQT4uKQorICA8L1A+CisgIDxQPgorICBTY3JpcHRzIE1VU1QgY2hlY2sgdGhlIHZhbHVlIG9mIHRoZSBSRVFVRVNUX01FVEhPRAorICBtZXRhdmFyaWFibGUgaW4gb3JkZXIKKyAgdG8gcHJvdmlkZSBhbiBhcHByb3ByaWF0ZSByZXNwb25zZS4KKyAgKFNlZSA8QSBIUkVGPSIjNi4xLjEzIj5zZWN0aW9uIDYuMS4xMzwvQT4uKQorICA8L1A+CisgIDxQPgorICBTY3JpcHRzIE1VU1QgYmUgcHJlcGFyZWQgdG8gaGFuZGxlZCBVUkwtZW5jb2RlZCB2YWx1ZXMgaW4KKyAgbWV0YXZhcmlhYmxlcy4KKyAgSW4gYWRkaXRpb24sIHRoZXkgTVVTVCByZWNvZ25pc2UgYm90aCAiKyIgYW5kICIlMjAiIGluIFVSTC1lbmNvZGVkCisgIHF1YW50aXRpZXMgYXMgcmVwcmVzZW50aW5nIHRoZSBzcGFjZSBjaGFyYWN0ZXIuCisgIChTZWUgPEEgSFJFRj0iIzMuMSI+c2VjdGlvbiAzLjE8L0E+LikKKyAgPC9QPgorICA8UD4KKyAgU2NyaXB0cyBNVVNUIGlnbm9yZSBsZWFkaW5nIHplcm9zIGluIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzCisgIGluIHRoZSBHQVRFV0FZX0lOVEVSRkFDRQorICBtZXRhdmFyaWFibGUgdmFsdWUuIChTZWUKKyAgPEEgSFJFRj0iIzYuMS40Ij5zZWN0aW9uIDYuMS40PC9BPi4pCisgIDwvUD4KKyAgPFA+CisgIFdoZW4gcHJvY2Vzc2luZyByZXF1ZXN0cyB0aGF0IGluY2x1ZGUgYQorICBtZXNzYWdlLWJvZHksIHNjcmlwdHMKKyAgTVVTVCBOT1QgcmVhZCBtb3JlIHRoYW4gQ09OVEVOVF9MRU5HVEggYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICAoU2VlIHNlY3Rpb25zIDxBIEhSRUY9IiM2LjEuMiI+Ni4xLjI8L0E+IGFuZCA8QSBIUkVGPSIjNi4yIj42LjI8L0E+LikKKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjkuMiI+CisgICAgOS4yLiBSZWNvbW1lbmRhdGlvbnMgZm9yIFNjcmlwdHMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFNlcnZlcnMgbWF5IGludGVycnVwdCBvciB0ZXJtaW5hdGUgc2NyaXB0IGV4ZWN1dGlvbiBhdCBhbnkgdGltZQorICBhbmQgd2l0aG91dCB3YXJuaW5nLCBzbyBzY3JpcHRzIFNIT1VMRCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGgKKyAgYWJub3JtYWwgdGVybWluYXRpb24uCisgIDwvUD4KKyAgPFA+CisgIFNjcmlwdHMgTVVTVAorICByZWplY3Qgd2l0aAorICBlcnJvciAnNDA1IE1ldGhvZCBOb3QKKyAgQWxsb3dlZCcgcmVxdWVzdHMKKyAgbWFkZSB1c2luZyBtZXRob2RzIHRoYXQgdGhleSBkbyBub3Qgc3VwcG9ydC4gSWYgdGhlIHNjcmlwdCBkb2VzCisgIG5vdCBpbnRlbmQKKyAgcHJvY2Vzc2luZyB0aGUgUEFUSF9JTkZPIGRhdGEsIHRoZW4gaXQgU0hPVUxEIHJlamVjdCB0aGUgcmVxdWVzdCB3aXRoCisgICc0MDQgTm90CisgIEZvdW5kJyBpZiBQQVRIX0lORk8gaXMgbm90IE5VTEwuCisgIDwvUD4KKyAgPFA+CisgIElmIGEgc2NyaXB0IGlzIHByb2Nlc3NpbmcgdGhlIG91dHB1dCBvZiBhIGZvcm0sIGl0IFNIT1VMRAorICB2ZXJpZnkgdGhhdCB0aGUgQ09OVEVOVF9UWVBFCisgIGlzICI8U0FNUD5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L1NBTVA+IiBbPEEgSFJFRj0iI1syXSI+MjwvQT5dCisgIG9yIHdoYXRldmVyIG90aGVyIG1lZGlhIHR5cGUgaXMgZXhwZWN0ZWQuCisgIDwvUD4KKyAgPFA+CisgIFNjcmlwdHMgcGFyc2luZyBQQVRIX0lORk8sCisgIFBBVEhfVFJBTlNMQVRFRCwgb3IgU0NSSVBUX05BTUUKKyAgU0hPVUxEIGJlIGNhcmVmdWwKKyAgb2Ygdm9pZCBwYXRoIHNlZ21lbnRzICgiPFNBTVA+Ly88L1NBTVA+IikgYW5kIHNwZWNpYWwgcGF0aCBzZWdtZW50cworICAoPFNBTVA+Ii4iPC9TQU1QPiBhbmQKKyAgPFNBTVA+Ii4uIjwvU0FNUD4pLiBUaGV5IFNIT1VMRCBlaXRoZXIgYmUgcmVtb3ZlZCBmcm9tIHRoZSBwYXRoIGJlZm9yZQorICB1c2UgaW4gT1MKKyAgc3lzdGVtIGNhbGxzLCBvciB0aGUgcmVxdWVzdCBTSE9VTEQgYmUgcmVqZWN0ZWQgd2l0aAorICAnNDA0IE5vdCBGb3VuZCcuCisgIDwvUD4KKyAgPFA+CisgIEFzIGl0IGlzIGltcG9zc2libGUgZm9yCisgIHNjcmlwdHMgdG8gZGV0ZXJtaW5lIHRoZSBjbGllbnQgVVJJIHRoYXQKKyAgaW5pdGlhdGVkICBhCisgIHJlcXVlc3Qgd2l0aG91dCBrbm93bGVkZ2Ugb2YgdGhlIHNwZWNpZmljIHNlcnZlciBpbgorICB1c2UsIHRoZSBzY3JpcHQgU0hPVUxEIE5PVCByZXR1cm4gIjxTQU1QPnRleHQvaHRtbDwvU0FNUD4iCisgIGRvY3VtZW50cyBjb250YWluaW5nCisgIHJlbGF0aXZlIFVSTCBsaW5rcyB3aXRob3V0IGluY2x1ZGluZyBhICI8U0FNUD4mbHQ7QkFTRSZndDs8L1NBTVA+IgorICB0YWcgaW4gdGhlIGRvY3VtZW50LgorICA8L1A+CisgIDxQPgorICBXaGVuIHJldHVybmluZyBoZWFkZXIgZmllbGRzLAorICBzY3JpcHRzIFNIT1VMRCB0cnkgdG8gc2VuZCB0aGUgQ0dJCisgIGhlYWRlciBmaWVsZHMgKHNlZSBzZWN0aW9uCisgIDxBIEhSRUY9IiM3LjIiPjcuMjwvQT4pIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZAorICBTSE9VTEQgc2VuZCB0aGVtCisgIGJlZm9yZSBhbnkgSFRUUCBoZWFkZXIgZmllbGRzLiBUaGlzIG1heQorICBoZWxwIHJlZHVjZSB0aGUgc2VydmVyJ3MgbWVtb3J5IHJlcXVpcmVtZW50cy4KKyAgPC9QPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjEwLjAiPgorICAgIDEwLiBTeXN0ZW0gU3BlY2lmaWNhdGlvbnMKKyAgIDwvQT4KKyAgPC9IMj4KKworICA8SDM+CisgICA8QSBOQU1FPSIxMC4xIj4KKyAgICAxMC4xLiBBbWlnYURPUworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDR0kgb24gYW4gQW1pZ2FET1Mgb3BlcmF0aW5nIHN5c3RlbSBwbGF0Zm9ybQorICBTSE9VTEQgdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyB0aGUgbWVjaGFuaXNtIG9mIHByb3ZpZGluZworICByZXF1ZXN0IG1ldGFkYXRhIHRvIENHSSBzY3JpcHRzLgorICA8L1A+CisgIDxETD4KKyAgIDxEVD48U1RST05HPkVudmlyb25tZW50IHZhcmlhYmxlczwvU1RST05HPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGVzZSBhcmUgYWNjZXNzZWQgYnkgdGhlIERPUyBsaWJyYXJ5IHJvdXRpbmUgPFNBTVA+R2V0VmFyPC9TQU1QPi4gVGhlCisgICAgZmxhZ3MgYXJndW1lbnQgU0hPVUxEIGJlIDAuIENhc2UgaXMgaWdub3JlZCwgYnV0IHVwcGVyIGNhc2UgaXMKKyAgICByZWNvbW1lbmRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNhc2Utc2Vuc2l0aXZlIHN5c3RlbXMuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48U1RST05HPlRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5PC9TVFJPTkc+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc2NyaXB0IGlzIHNldCB0byB0aGUgZGlyZWN0b3J5CisgICAgY29udGFpbmluZyB0aGUgc2NyaXB0LgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PFNUUk9ORz5DaGFyYWN0ZXIgc2V0PC9TVFJPTkc+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZSBVUy1BU0NJSSBjaGFyYWN0ZXIgc2V0IGlzIHVzZWQgZm9yIHRoZSBkZWZpbml0aW9uIG9mIGVudmlyb25tZW50CisgICAgdmFyaWFibGUgbmFtZXMgYW5kIGhlYWRlcgorICAgIGZpZWxkIG5hbWVzOyB0aGUgbmV3bGluZSAoTkwpIHNlcXVlbmNlIGlzIExGOworICAgIHNlcnZlcnMgU0hPVUxEIGFsc28gYWNjZXB0IENSIExGIGFzIGEgbmV3bGluZS4KKyAgICA8L1A+CisgICA8L0REPgorICA8L0RMPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjEwLjIiPgorICAgIDEwLjIuIFVuaXgKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ0dJIG9uIGEgVU5JWCBvcGVyYXRpbmcgc3lzdGVtIHBsYXRmb3JtCisgIFNIT1VMRCB1c2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHRoZSBtZWNoYW5pc20gb2YgcHJvdmlkaW5nCisgIHJlcXVlc3QgbWV0YWRhdGEgdG8gQ0dJIHNjcmlwdHMuCisgIDwvUD4KKyAgPFA+CisgIEZvciBVbml4IGNvbXBhdGlibGUgb3BlcmF0aW5nIHN5c3RlbXMsIHRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQ6CisgIDwvUD4KKyAgPERMPgorICAgPERUPjxTVFJPTkc+RW52aXJvbm1lbnQgdmFyaWFibGVzPC9TVFJPTkc+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZXNlIGFyZSBhY2Nlc3NlZCBieSB0aGUgQyBsaWJyYXJ5IHJvdXRpbmUgPFNBTVA+Z2V0ZW52PC9TQU1QPi4KKyAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxTVFJPTkc+VGhlIGNvbW1hbmQgbGluZTwvU1RST05HPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGlzIGlzIGFjY2Vzc2VkIHVzaW5nIHRoZQorICAgIDxTQU1QPmFyZ2M8L1NBTVA+IGFuZCA8U0FNUD5hcmd2PC9TQU1QPgorICAgIGFyZ3VtZW50cyB0byA8U0FNUD5tYWluKCk8L1NBTVA+LiBUaGUgd29yZHMgaGF2ZSBhbnkgY2hhcmFjdGVycworICAgIHRoYXQKKyAgICBhcmUgJ2FjdGl2ZScgaW4gdGhlIEJvdXJuZSBzaGVsbCBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2guCisgICAgSWYgdGhlIHZhbHVlIG9mIHRoZSBRVUVSWV9TVFJJTkcKKyAgICBtZXRhdmFyaWFibGUKKyAgICBjb250YWlucyBhbiB1bmVuY29kZWQgZXF1YWxzLXNpZ24gJz0nLCB0aGVuIHRoZSBjb21tYW5kIGxpbmUKKyAgICBTSE9VTEQgTk9UIGJlIHVzZWQgYnkgdGhlIHNjcmlwdC4KKyAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxTVFJPTkc+VGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk8L1NUUk9ORz4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzY3JpcHQKKyAgICBTSE9VTEQgYmUgc2V0IHRvIHRoZSBkaXJlY3RvcnkKKyAgICBjb250YWluaW5nIHRoZSBzY3JpcHQuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48U1RST05HPkNoYXJhY3RlciBzZXQ8L1NUUk9ORz4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhlIFVTLUFTQ0lJIGNoYXJhY3RlciBzZXQgaXMgdXNlZCBmb3IgdGhlIGRlZmluaXRpb24gb2YgZW52aXJvbm1lbnQKKyAgICB2YXJpYWJsZSBuYW1lcyBhbmQgaGVhZGVyIGZpZWxkIG5hbWVzOyB0aGUgbmV3bGluZSAoTkwpIHNlcXVlbmNlIGlzIExGOworICAgIHNlcnZlcnMgU0hPVUxEIGFsc28gYWNjZXB0IENSIExGIGFzIGEgbmV3bGluZS4KKyAgICA8L1A+CisgICA8L0REPgorICA8L0RMPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjExLjAiPgorICAgIDExLiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucworICAgPC9BPgorICA8L0gyPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjExLjEiPgorICAgIDExLjEuIFNhZmUgTWV0aG9kcworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgQXMgZGlzY3Vzc2VkIGluIHRoZSBzZWN1cml0eSBjb25zaWRlcmF0aW9ucyBvZiB0aGUgSFRUUAorICBzcGVjaWZpY2F0aW9ucyBbPEEgSFJFRj0iI1szXSI+MzwvQT4sPEEgSFJFRj0iI1s4XSI+ODwvQT5dLCB0aGUKKyAgY29udmVudGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCB0aGF0IHRoZQorICBHRVQgYW5kIEhFQUQgbWV0aG9kcyBzaG91bGQgYmUgJ3NhZmUnOyB0aGV5IHNob3VsZCBjYXVzZSBubworICBzaWRlLWVmZmVjdHMgYW5kIG9ubHkgaGF2ZSB0aGUgc2lnbmlmaWNhbmNlIG9mIHJlc291cmNlIHJldHJpZXZhbC4KKyAgPC9QPgorICA8UD4KKyAgQ0dJIHNjcmlwdHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgYW55IEhUVFAgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMKKyAgWzxBIEhSRUY9IiNbM10iPjM8L0E+LDxBIEhSRUY9IiNbOF0iPjg8L0E+XQorICB3aXRoIHJlc3BlY3QgdG8gdGhlIHByb3RvY29sIHZlcnNpb24gbGV2ZWwgb2YgdGhlIHJlcXVlc3QgYW5kCisgIGFueSBzaWRlIGVmZmVjdHMgZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHRzIG9uIGJlaGFsZiBvZgorICB0aGUgc2VydmVyLiAgUHJpbWFyeQorICBhbW9uZyB0aGVzZQorICBhcmUgdGhlIGNvbnNpZGVyYXRpb25zIG9mIHNhZmUgYW5kIGlkZW1wb3RlbnQgbWV0aG9kcy4gIElkZW1wb3RlbnQKKyAgcmVxdWVzdHMgYXJlIHRob3NlIHRoYXQgbWF5IGJlIHJlcGVhdGVkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdGltZXMKKyAgYW5kIHByb2R1Y2Ugc2lkZSBlZmZlY3RzIGlkZW50aWNhbCB0byBhIHNpbmdsZSByZXF1ZXN0LgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iMTEuMiI+CisgICAgMTEuMi4gSFRUUCBIZWFkZXIKKyAgICBGaWVsZHMgQ29udGFpbmluZyBTZW5zaXRpdmUgSW5mb3JtYXRpb24KKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFNvbWUgSFRUUCBoZWFkZXIgZmllbGRzIG1heSBjYXJyeSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2hpY2ggdGhlIHNlcnZlcgorICBTSE9VTEQgTk9UIHBhc3Mgb24gdG8gdGhlIHNjcmlwdCB1bmxlc3MgZXhwbGljaXRseSBjb25maWd1cmVkIHRvIGRvCisgIHNvLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHNlcnZlciBwcm90ZWN0cyB0aGUgc2NyaXB0IHVzaW5nIHRoZQorICAiPFNBTVA+QmFzaWM8L1NBTVA+IgorICBhdXRoZW50aWNhdGlvbiBzY2hlbWUsIHRoZW4gdGhlIGNsaWVudCB3aWxsIHNlbmQgYW4KKyAgIjxTQU1QPkF1dGhvcml6YXRpb248L1NBTVA+IgorICBoZWFkZXIgZmllbGQgY29udGFpbmluZyBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4gSWYgdGhlIHNlcnZlciwgcmF0aGVyCisgIHRoYW4gdGhlIHNjcmlwdCwgdmFsaWRhdGVzIHRoaXMgaW5mb3JtYXRpb24gdGhlbiB0aGUgcGFzc3dvcmQgU0hPVUxECisgIE5PVCBiZSBwYXNzZWQgb24gdG8gdGhlIHNjcmlwdCA8RU0+dmlhPC9FTT4gdGhlIEhUVFBfQVVUSE9SSVpBVElPTgorICBtZXRhdmFyaWFibGUKKyAgd2l0aG91dCBjYXJlZnVsIGNvbnNpZGVyYXRpb24uCisgIFRoaXMgYWxzbyBhcHBsaWVzIHRvIHRoZQorICBQcm94eS1BdXRob3JpemF0aW9uIGhlYWRlciBmaWVsZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgSFRUUF9QUk9YWV9BVVRIT1JJWkFUSU9OCisgIG1ldGF2YXJpYWJsZS4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjExLjMiPgorICAgIDExLjMuIFNjcmlwdAorICAgIEludGVyZmVyZW5jZSB3aXRoIHRoZSBTZXJ2ZXIKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFRoZSBtb3N0IGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBvZiBDR0kgaW52b2tlcyB0aGUgc2NyaXB0IGFzIGEgY2hpbGQKKyAgcHJvY2VzcyB1c2luZyB0aGUgc2FtZSB1c2VyIGFuZCBncm91cCBhcyB0aGUgc2VydmVyIHByb2Nlc3MuIEl0CisgIFNIT1VMRCB0aGVyZWZvcmUgYmUgZW5zdXJlZCB0aGF0IHRoZSBzY3JpcHQgY2Fubm90IGludGVyZmVyZSB3aXRoIHRoZQorICBzZXJ2ZXIgcHJvY2VzcywgaXRzIGNvbmZpZ3VyYXRpb24sIG9yIGRvY3VtZW50cy4KKyAgPC9QPgorICA8UD4KKyAgSWYgdGhlIHNjcmlwdCBpcyBleGVjdXRlZCBieSBjYWxsaW5nIGEgZnVuY3Rpb24gbGlua2VkIGluIHRvIHRoZQorICBzZXJ2ZXIgc29mdHdhcmUgKGVpdGhlciBhdCBjb21waWxlLXRpbWUgb3IgcnVuLXRpbWUpIHRoZW4gcHJlY2F1dGlvbnMKKyAgU0hPVUxEIGJlIHRha2VuIHRvIHByb3RlY3QgdGhlIGNvcmUgbWVtb3J5IG9mIHRoZSBzZXJ2ZXIsIG9yIHRvCisgIGVuc3VyZSB0aGF0IHVudHJ1c3RlZCBjb2RlIGNhbm5vdCBiZSBleGVjdXRlZC4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjExLjQiPgorICAgIDExLjQuIERhdGEgTGVuZ3RoIGFuZCBCdWZmZXJpbmcgQ29uc2lkZXJhdGlvbnMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFRoaXMgc3BlY2lmaWNhdGlvbiBwbGFjZXMgbm8gbGltaXRzIG9uIHRoZSBsZW5ndGggb2YgbWVzc2FnZS1ib2RpZXMKKyAgcHJlc2VudGVkIHRvIHRoZSBzY3JpcHQuICBTY3JpcHRzIHNob3VsZCBub3QgYXNzdW1lIHRoYXQgc3RhdGljYWxseQorICBhbGxvY2F0ZWQgYnVmZmVycyBvZiBhbnkgc2l6ZSBhcmUgc3VmZmljaWVudCB0byBjb250YWluIHRoZSBlbnRpcmUKKyAgc3VibWlzc2lvbiBhdCBvbmUgdGltZS4gIFVzZSBvZiBhIGZpeGVkIGxlbmd0aCBidWZmZXIgd2l0aG91dCBjYXJlZnVsCisgIG92ZXJmbG93IGNoZWNraW5nIG1heSByZXN1bHQgaW4gYW4gYXR0YWNrZXIgZXhwbG9pdGluZyAnc3RhY2stc21hc2hpbmcnCisgIG9yICdzdGFjay1vdmVyZmxvdycgdnVsbmVyYWJpbGl0aWVzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorICBTY3JpcHRzIG1heSBzcG9vbCBsYXJnZSBzdWJtaXNzaW9ucyB0byBkaXNrIG9yIG90aGVyIGJ1ZmZlcmluZyBtZWRpYSwKKyAgYnV0IGEgcmFwaWQgc3VjY2Vzc2lvbiBvZiBsYXJnZSBzdWJtaXNzaW9ucyBtYXkgcmVzdWx0IGluIGRlbmlhbCBvZgorICBzZXJ2aWNlIGNvbmRpdGlvbnMuICBJZiB0aGUgQ09OVEVOVF9MRU5HVEggb2YgYSBtZXNzYWdlLWJvZHkgaXMgbGFyZ2VyCisgIHRoYW4gcmVzb3VyY2UgY29uc2lkZXJhdGlvbnMgYWxsb3csIHNjcmlwdHMgc2hvdWxkIHJlc3BvbmQgd2l0aCBhbgorICBlcnJvciBzdGF0dXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm90b2NvbCB2ZXJzaW9uOyBwb3RlbnRpYWxseSBhcHBsaWNhYmxlCisgIHN0YXR1cyBjb2RlcyBpbmNsdWRlICc1MDMgU2VydmljZSBVbmF2YWlsYWJsZScgKEhUVFAvMS4wIGFuZCBIVFRQLzEuMSksCisgICc0MTMgUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlJyAoSFRUUC8xLjEpLCBhbmQKKyAgJzQxNCBSZXF1ZXN0LVVSSSBUb28gTG9uZycgKEhUVFAvMS4xKS4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjExLjUiPgorICAgIDExLjUuIFN0YXRlbGVzcyBQcm9jZXNzaW5nCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGUgc3RhdGVsZXNzIG5hdHVyZSBvZiB0aGUgV2ViIG1ha2VzIGVhY2ggc2NyaXB0IGV4ZWN1dGlvbiBhbmQgcmVzb3VyY2UKKyAgcmV0cmlldmFsIGluZGVwZW5kZW50IG9mIGFsbCBvdGhlcnMgZXZlbiB3aGVuIG11bHRpcGxlIHJlcXVlc3RzIGNvbnN0aXR1dGUgYQorICBzaW5nbGUgY29uY2VwdHVhbCBXZWIgdHJhbnNhY3Rpb24uICBCZWNhdXNlIG9mIHRoaXMsIGEgc2NyaXB0IHNob3VsZCBub3QKKyAgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNvbnRleHQgb2YgdGhlIHVzZXItYWdlbnQgc3VibWl0dGluZyBhCisgIHJlcXVlc3QuICBJbiBwYXJ0aWN1bGFyLCBzY3JpcHRzIHNob3VsZCBleGFtaW5lIGRhdGEgb2J0YWluZWQgZnJvbSB0aGUgY2xpZW50CisgIGFuZCB2ZXJpZnkgdGhhdCB0aGV5IGFyZSB2YWxpZCwgYm90aCBpbiBmb3JtIGFuZCBjb250ZW50LCBiZWZvcmUgYWxsb3dpbmcKKyAgdGhlbSB0byBiZSB1c2VkIGZvciBzZW5zaXRpdmUgcHVycG9zZXMgc3VjaCBhcyBpbnB1dCB0byBvdGhlcgorICBhcHBsaWNhdGlvbnMsIGNvbW1hbmRzLCBvciBvcGVyYXRpbmcgc3lzdGVtIHNlcnZpY2VzLiAgVGhlc2UgdXNlcworICBpbmNsdWRlLCBidXQgYXJlIG5vdAorICBsaW1pdGVkIHRvOiBzeXN0ZW0gY2FsbCBhcmd1bWVudHMsIGRhdGFiYXNlIHdyaXRlcywgZHluYW1pY2FsbHkgZXZhbHVhdGVkCisgIHNvdXJjZSBjb2RlLCBhbmQgaW5wdXQgdG8gYmlsbGluZyBvciBvdGhlciBzZWN1cmUgcHJvY2Vzc2VzLiAgSXQgaXMgaW1wb3J0YW50CisgIHRoYXQgYXBwbGljYXRpb25zIGJlIHByb3RlY3RlZCBmcm9tIGludmFsaWQgaW5wdXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisgIHRoZSBpbnZhbGlkaXR5IGlzIHRoZSByZXN1bHQgb2YgdXNlciBlcnJvciwgbG9naWMgZXJyb3IsIG9yIG1hbGljaW91cyBhY3Rpb24uCisgIDwvUD4KKyAgPFA+CisgIEF1dGhvcnMgb2Ygc2NyaXB0cyBpbnZvbHZlZCBpbiBtdWx0aS1yZXF1ZXN0IHRyYW5zYWN0aW9ucyBzaG91bGQgYmUKKyAgcGFydGljdWxhcmx5IGNhdXRpb3MgYWJvdXQgdmFsaWRhdGluZyB0aGUgc3RhdGUgaW5mb3JtYXRpb247CisgIHVuZGVzaXJhYmxlIGVmZmVjdHMgbWF5IHJlc3VsdCBmcm9tIHRoZSBzdWJzdGl0dXRpb24gb2YgZGFuZ2Vyb3VzCisgIHZhbHVlcyBmb3IgcG9ydGlvbnMgb2YgdGhlIHN1Ym1pc3Npb24gd2hpY2ggbWlnaHQgb3RoZXJ3aXNlIGJlCisgIHByZXN1bWVkIHNhZmUuICBTdWJ2ZXJzaW9uIG9mIHRoaXMgdHlwZSBvY2N1cnMgd2hlbiBhbHRlcmF0aW9ucworICBhcmUgbWFkZSB0byBkYXRhIGZyb20gYSBwcmlvciBzdGFnZSBvZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCB3ZXJlCisgIG5vdCBtZWFudCB0byBiZSBjb250cm9sbGVkIGJ5IHRoZSBjbGllbnQgKDxFTT5lLmcuPC9FTT4sIGhpZGRlbgorICBIVE1MIGZvcm0gZWxlbWVudHMsIGNvb2tpZXMsIGVtYmVkZGVkIFVSTHMsIDxFTT5ldGMuPC9FTT4pLgorICA8L1A+CisKKyAgPEgyPgorICAgPEEgTkFNRT0iMTIuMCI+CisgICAgMTIuIEFja25vd2xlZGdlbWVudHMKKyAgIDwvQT4KKyAgPC9IMj4KKyAgPFA+CisgIFRoaXMgd29yayBpcyBiYXNlZCBvbiBhIGRyYWZ0IHB1Ymxpc2hlZCBpbiAxOTk3IGJ5IERhdmlkIFIuIFJvYmluc29uLAorICB3aGljaCBpbiB0dXJuIHdhcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgQ0dJIGludGVyZmFjZSB0aGF0IGFyb3NlIG91dCBvZgorICBkaXNjdXNzaW9ucyBvbiB0aGUgPEVNPnd3dy10YWxrPC9FTT4gbWFpbGluZyBsaXN0LiBJbiBwYXJ0aWN1bGFyLAorICBSb2IgTWNDb29sLCBKb2huIEZyYW5rcywgQXJpIEx1b3RvbmVuLAorICBHZW9yZ2UgUGhpbGxpcHMgYW5kCisgIFRvbnkgU2FuZGVycyBkZXNlcnZlIHNwZWNpYWwgcmVjb2duaXRpb24gZm9yIHRoZWlyIGVmZm9ydHMgaW4KKyAgZGVmaW5pbmcgYW5kIGltcGxlbWVudGluZyB0aGUgZWFybHkgdmVyc2lvbnMgb2YgdGhpcyBpbnRlcmZhY2UuCisgIDwvUD4KKyAgPFA+CisgIFRoaXMgZG9jdW1lbnQgaGFzIGFsc28gZ3JlYXRseSBiZW5lZml0ZWQgZnJvbSB0aGUgY29tbWVudHMgYW5kCisgIHN1Z2dlc3Rpb25zIG1hZGUgYnkgIENocmlzIEFkaWUsIERhdmUgS3Jpc3RvbCwKKyAgTWlrZSBNZXllciwgRGF2aWQgTW9ycmlzLCBKZXJlbXkgTWFkZWEsCisgIFBhdHJpY2sgTTxTVVA+YzwvU1VQPk1hbnVzLCBBZGFtIERvbmFodWUsCisgIFJvc3MgUGF0dGVyc29uLCBhbmQgSGFyYWxkIEFsdmVzdHJhbmQuCisgIDwvUD4KKworICA8SDI+CisgICA8QSBOQU1FPSIxMy4wIj4KKyAgICAxMy4gUmVmZXJlbmNlcworICAgPC9BPgorICA8L0gyPgorICA8REwgQ09NUEFDVD4KKyAgIDxEVD48QSBOQU1FPSJbMV0iPlsxXTwvQT4KKyAgIDwvRFQ+CisgICA8REQ+QmVybmVycy1MZWUsIFQuLCAnVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXJzIGluIFdXVzogQQorICAgICAgIFVuaWZ5aW5nIFN5bnRheCBmb3IgdGhlIEV4cHJlc3Npb24gb2YgTmFtZXMgYW5kIEFkZHJlc3NlcyBvZgorICAgICAgIE9iamVjdHMgb24gdGhlIE5ldHdvcmsgYXMgdXNlZCBpbiB0aGUgV29ybGQtV2lkZSBXZWInLCBSRkMgMTYzMCwKKyAgICAgICBDRVJOLCBKdW5lIDE5OTQuCisgICAgICAgPFA+CisgICAgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48QSBOQU1FPSJbMl0iPlsyXTwvQT4KKyAgIDwvRFQ+CisgICA8REQ+QmVybmVycy1MZWUsIFQuIGFuZCBDb25ub2xseSwgRC4sICdIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIC0KKyAgICAgICAgMi4wJywgUkZDIDE4NjYsIE1JVC9XM0MsIE5vdmVtYmVyIDE5OTUuCisgICAgICAgPFA+CisgICAgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48QSBOQU1FPSJbM10iPlszXTwvQT4KKyAgIDwvRFQ+CisgICA8REQ+QmVybmVycy1MZWUsIFQuLCBGaWVsZGluZywgUi4gVC4gYW5kIEZyeXN0eWssIEguLAorICAgICAgICAgICdIeXBlcnRleHQgVHJhbnNmZXIgUHJvdG9jb2wgLS0gSFRUUC8xLjAnLCBSRkMgMTk0NSwgTUlUL0xDUywKKyAgICAgICAgICBVQyBJcnZpbmUsIE1heSAxOTk2LgorICAgICAgIDxQPgorICAgICAgIDwvUD4KKyAgIDwvREQ+CisKKyAgPERUPjxBIE5BTUU9Ils0XSI+WzRdPC9BPgorICA8L0RUPgorICA8REQ+QmVybmVycy1MZWUsIFQuLCBGaWVsZGluZywgUi4sIGFuZCBNYXNpbnRlciwgTC4sIEVkaXRvcnMsCisgICAnVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAoVVJJKTogR2VuZXJpYyBTeW50YXgnLCBSRkMgMjM5NiwKKyAgIE1JVCwgVS5DLiBJcnZpbmUsIFhlcm94IENvcnBvcmF0aW9uLCBBdWd1c3QgMTk5Ni4KKyAgIDxQPgorICAgPC9QPgorICA8L0REPgorCisgIDxEVD48QSBOQU1FPSJbNV0iPls1XTwvQT4KKyAgPC9EVD4KKyAgPEREPkJyYWRlbiwgUi4sIEVkaXRvciwgJ1JlcXVpcmVtZW50cyBmb3IgSW50ZXJuZXQgSG9zdHMgLS0KKyAgICAgICAgICBBcHBsaWNhdGlvbiBhbmQgU3VwcG9ydCcsIFNURCAzLCBSRkMgMTEyMywgSUVURiwgT2N0b2JlciAxOTg5LgorICAgICAgIDxQPgorICAgICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PEEgTkFNRT0iWzZdIj5bNl08L0E+CisgICA8L0RUPgorICAgPEREPkNyb2NrZXIsIEQuSC4sICdTdGFuZGFyZCBmb3IgdGhlIEZvcm1hdCBvZiBBUlBBIEludGVybmV0IFRleHQKKyAgICAgICAgICBNZXNzYWdlcycsIFNURCAxMSwgUkZDIDgyMiwgVW5pdmVyc2l0eSBvZiBEZWxhd2FyZSwgQXVndXN0IDE5ODIuCisgICAgICAgPFA+CisgICAgICAgPC9QPgorICAgPC9ERD4KKyAgPERUPjxBIE5BTUU9Ils3XSI+WzddPC9BPgorICA8L0RUPgorICA8REQ+RmllbGRpbmcsIFIuLCAnUmVsYXRpdmUgVW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9ycycsIFJGQyAxODA4LAorICAgICAgICAgIFVDIElydmluZSwgSnVuZSAxOTk1LgorICAgICAgIDxQPgorICAgICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PEEgTkFNRT0iWzhdIj5bOF08L0E+CisgICA8L0RUPgorICAgPEREPkZpZWxkaW5nLCBSLiwgR2V0dHlzLCBKLiwgTW9ndWwsIEouLCBGcnlzdHlrLCBILiBhbmQKKyAgICAgICAgICBCZXJuZXJzLUxlZSwgVC4sICdIeXBlcnRleHQgVHJhbnNmZXIgUHJvdG9jb2wgLS0gSFRUUC8xLjEnLAorICAgICAgICAgIFJGQyAyMDY4LCBVQyBJcnZpbmUsIERFQywKKwkgIE1JVC9MQ1MsIEphbnVhcnkgMTk5Ny4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxBIE5BTUU9Ils5XSI+WzldPC9BPgorICAgPC9EVD4KKyAgIDxERD5GcmVlZCwgTi4gYW5kIEJvcmVuc3RlaW4gTi4sICdNdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbAorICAgICAgICAgIEV4dGVuc2lvbnMgKE1JTUUpIFBhcnQgVHdvOiBNZWRpYSBUeXBlcycsIFJGQyAyMDQ2LCBJbm5vc29mdCwKKyAgICAgICAgICBGaXJzdCBWaXJ0dWFsLCBOb3ZlbWJlciAxOTk2LgorICAgICAgIDxQPgorICAgICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PEEgTkFNRT0iWzEwXSI+WzEwXTwvQT4KKyAgIDwvRFQ+CisgICA8REQ+TW9ja2FwZXRyaXMsIFAuLCAnRG9tYWluIE5hbWVzIC0gQ29uY2VwdHMgYW5kIEZhY2lsaXRpZXMnLAorICAgICAgICAgIFNURCAxMywgUkZDIDEwMzQsIElTSSwgTm92ZW1iZXIgMTk4Ny4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxBIE5BTUU9IlsxMV0iPlsxMV08L0E+CisgICA8L0RUPgorICAgPEREPlN0LiBKb2hucywgTS4sICdJZGVudGlmaWNhdGlvbiBQcm90b2NvbCcsIFJGQyAxNDMxLCBVUworICAgICAgICAgIERlcGFydG1lbnQgb2YgRGVmZW5zZSwgRmVicnVhcnkgMTk5My4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxBIE5BTUU9IlsxMl0iPlsxMl08L0E+CisgICA8L0RUPgorICAgPEREPidDb2RlZCBDaGFyYWN0ZXIgU2V0IC0tIDctYml0IEFtZXJpY2FuIFN0YW5kYXJkIENvZGUgZm9yCisgICAgICAgICAgSW5mb3JtYXRpb24gSW50ZXJjaGFuZ2UnLCBBTlNJIFgzLjQtMTk4Ni4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxBIE5BTUU9IlsxM10iPlsxM108L0E+CisgICA8L0RUPgorICAgPEREPkhpbmRlbiwgUi4gYW5kIERlZXJpbmcsIFMuLAorICAgICAgICAgICdJUCBWZXJzaW9uIDYgQWRkcmVzc2luZyBBcmNoaXRlY3R1cmUnLCBSRkMgMjM3MywKKwkgIE5va2lhLCBDaXNjbyBTeXN0ZW1zLAorICAgICAgICAgIEp1bHkgMTk5OC4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorICA8L0RMPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjE0LjAiPgorICAgIDE0LiBBdXRob3JzJyBBZGRyZXNzZXMKKyAgIDwvQT4KKyAgPC9IMj4KKyAgPEFERFJFU1M+CisgICA8UD4KKyAgIEtlbiBBIEwgQ29hcgorICAgPEJSPgorICAgTWVlcFpvciBDb25zdWx0aW5nCisgICA8QlI+CisgICA3ODI0IE1heWZhaXJlIENyZXN0IExhbmUsIFN1aXRlIDIwMgorICAgPEJSPgorICAgUmFsZWlnaCwgTkMgICAyNzYxNS00ODc1CisgICA8QlI+CisgICBVLlMuQS4KKyAgIDwvUD4KKyAgIDxQPgorICAgVGVsOiArMSAoOTE5KSAyNTQuNDIzNworICAgPEJSPgorICAgRmF4OiArMSAoOTE5KSAyNTQuNTI1MAorICAgPEJSPgorICAgRW1haWw6CisgICA8QQorICAgIEhSRUY9Im1haWx0bzpLZW4uQ29hckBHb2x1eC5Db20iCisgICA+PFNBTVA+S2VuLkNvYXJAR29sdXguQ29tPC9TQU1QPjwvQT4KKyAgIDwvUD4KKyAgPC9BRERSRVNTPgorICA8QUREUkVTUz4KKyAgIDxQPgorICAgRGF2aWQgUm9iaW5zb24KKyAgIDxCUj4KKyAgIEUqVFJBREUgVUsgTHRkCisgICA8QlI+CisgICBNb3VudCBQbGVhc2FudCBIb3VzZQorICAgPEJSPgorICAgMiBNb3VudCBQbGVhc2FudAorICAgPEJSPgorICAgSHVudGluZ2RvbiBSb2FkCisgICA8QlI+CisgICBDYW1icmlkZ2UgQ0IzIDBSTgorICAgPEJSPgorICAgVUsKKyAgIDwvUD4KKyAgIDxQPgorICAgVGVsOiArNDQgKDEyMjMpIDU2NjkyNgorICAgPEJSPgorICAgRmF4OiArNDQgKDEyMjMpIDUwNjI4OAorICAgPEJSPgorICAgRW1haWw6CisgICA8QQorICAgIEhSRUY9Im1haWx0bzpkcnRyQGV0cmFkZS5jby51ayIKKyAgID48U0FNUD5kcnRyQGV0cmFkZS5jby51azwvU0FNUD48L0E+CisgIDwvQUREUkVTUz4KKworIDwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RvY3MvaWZ1cGRvd25fZGVzaWduLnR4dCBiL2J1c3lib3gtMS4xOS4zL2RvY3MvaWZ1cGRvd25fZGVzaWduLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI0ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9pZnVwZG93bl9kZXNpZ24udHh0CkBAIC0wLDAgKzEsNDQgQEAKK1RoaXMgZG9jdW1lbnQgaXMgbWVhbnQgdG8gY29udmluY2UgeW91IHRvIG5vdCB1c2UgaWZ1cC9pZmRvd24uCisKKworVGhlIGdlbmVyYWwgcHJvYmxlbSB3aXRoIGlmdXBkb3duIGlzIHRoYXQgaXQgaXMgImNvcHVsYXRlZCBpbiB2ZXJ0aWNhbAorZmFzaGlvbiIgYnkgZGVzaWduLiBJdCB0cmllcyB0byBkbyB0aGUgam9iIG9mIHNoZWxsIHNjcmlwdCBpbiBDLAorYW5kIHRoaXMgaXMgaW52YXJpYWJseSBkb29tZWQgdG8gZmFpbC4gWW91IG5lZWQgaWZ1cC9pZmRvd24KK3RvIGJlIGFkYXB0YWJsZSBieSBsb2NhbCBhZG1pbnMsIGFuZCBDIGlzIGFuIGV4dHJlbWVseSBwb29yIGNob2ljZQorZm9yIHRoYXQuCisKK1dlIGFyZSBkb29tZWQgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGlmdXAvaWZkb3duLiBKdXN0IGxvb2sgYXMgdGhpcyBjb2RlOgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRoY3BfY2xpZW50X3QgZXh0X2RoY3BfY2xpZW50c1tdID0geworCXsgImRoY3BjZCIsICI8dXAgY21kPiIsICI8ZG93biBjbWQ+IiB9LAorCXsgImRoY2xpZW50IiwgLi4uLi4uLi4gfSwKKwl7ICJwdW1wIiwgLi4uLi4uLi4gfSwKKwl7ICJ1ZGhjcGMiLCAuLi4uLi4uLiB9LAorfTsKKworc3RhdGljIGludCBkaGNwX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1AKKwlpbnQgaSA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXh0X2RoY3BfY2xpZW50cyk7IGkrKykgeworCQlpZiAoZXhpc3RzX2V4ZWNhYmxlKGV4dF9kaGNwX2NsaWVudHNbaV0ubmFtZSkpCisJCQlyZXR1cm4gZXhlY3V0ZShleHRfZGhjcF9jbGllbnRzW2ldLnN0b3BjbWQsIGlmZCwgZXhlYyk7CisJfQorCWJiX2Vycm9yX21zZygibm8gZGhjcCBjbGllbnRzIGZvdW5kLCB1c2luZyBzdGF0aWMgaW50ZXJmYWNlIHNodXRkb3duIik7CisJcmV0dXJuIHN0YXRpY19kb3duKGlmZCwgZXhlYyk7CisjZWxpZiBFTkFCTEVfVURIQ1BDCisJcmV0dXJuIGV4ZWN1dGUoImtpbGwgIgorCQkJImBjYXQgL3Zhci9ydW4vdWRoY3BjLiVpZmFjZSUucGlkYCAyPi9kZXYvbnVsbCIsIGlmZCwgZXhlYyk7CisjZWxzZQorCXJldHVybiAwOyAvKiBubyBkaGNwIHN1cHBvcnQgKi8KKyNlbmRpZgorfQorCitIb3cgdGhlIGhlbGwgaXQgaXMgc3VwcG9zZWQgdG8gd29yayByZWxpYWJseSB0aGlzIHdheT8gSnVzdCBpbWFnaW5lIHRoYXQKK2FkbWluIGlzIHVzaW5nIHB1bXAgYW5kIGlmdXAvaWZkb3duLiBJdCB3b3Jrcy4gVGhlbiwgZm9yIHdoYXRldmVyIHJlYXNvbiwKK2FkbWluIGluc3RhbGxzIGRoY2xpZW50LCBidXQgZG9lcyBOT1QgdXNlIGl0LiBpZmRvd24gd2lsbCBTVE9QIFdPUktJTkcsCitqdXN0IGJlY2F1c2UgaXQgd2lsbCBzZWUgaW5zdGFsbGVkIGRoY2xpZW50IGJpbmFyeSBpbiBlLmcuIC91c3IvYmluL2RoY2xpZW50IQorVGhpcyBpcyBzdHVwaWQuCisKK0kgc2VyaW91c2x5IHVyZ2UgcGVvcGxlIHRvIG5vdCB1c2UgaWZ1cC9pZmRvd24uCitVc2Ugc29tZXRoaW5nIGxlc3MgYnJhaW4gZGFtYWdlZC4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RvY3Mva2VlcF9kYXRhX3NtYWxsLnR4dCBiL2J1c3lib3gtMS4xOS4zL2RvY3Mva2VlcF9kYXRhX3NtYWxsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ3MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9rZWVwX2RhdGFfc21hbGwudHh0CkBAIC0wLDAgKzEsMjU2IEBACisJCUtlZXBpbmcgZGF0YSBzbWFsbAorCitXaGVuIG1hbnkgYXBwbGV0cyBhcmUgY29tcGlsZWQgaW50byBidXN5Ym94LCBhbGwgcncgZGF0YSBhbmQKK2JzcyBmb3IgZWFjaCBhcHBsZXQgYXJlIGNvbmNhdGVuYXRlZC4gSW5jbHVkaW5nIHRob3NlIGZyb20gbGliYywKK2lmIHN0YXRpYyBidXN5Ym94IGlzIGJ1aWx0LiBXaGVuIGJ1c3lib3ggaXMgc3RhcnRlZCwgX2FsbF8gdGhpcyBkYXRhCitpcyBhbGxvY2F0ZWQsIG5vdCBqdXN0IHRoYXQgb25lIHBhcnQgZm9yIHNlbGVjdGVkIGFwcGxldC4KKworV2hhdCAiYWxsb2NhdGVkIiBleGFjdGx5IG1lYW5zLCBkZXBlbmRzIG9uIGFyY2guCitPbiBOT01NVSBpdCdzIHByb2JhYmx5IGJpdGVzIHRoZSBtb3N0LCBhY3R1YWxseSB1c2luZyByZWFsCitSQU0gZm9yIHJ3ZGF0YSBhbmQgYnNzLiBPbiBpMzg2LCBic3MgaXMgbGF6aWx5IGFsbG9jYXRlZAorYnkgQ09XZWQgemVybyBwYWdlcy4gTm90IHN1cmUgYWJvdXQgcndkYXRhIC0gYWxzbyBDT1c/CisKK0luIG9yZGVyIHRvIGtlZXAgYnVzeWJveCBOT01NVSBhbmQgc21hbGwtbWVtIHN5c3RlbXMgZnJpZW5kbHkKK3dlIHNob3VsZCBhdm9pZCBsYXJnZSBnbG9iYWwgZGF0YSBpbiBvdXIgYXBwbGV0cywgYW5kIHNob3VsZAorbWluaW1pemUgdXNhZ2Ugb2YgbGliYyBmdW5jdGlvbnMgd2hpY2ggaW1wbGljaXRseSB1c2UKK3N1Y2ggc3RydWN0dXJlcy4KKworU21hbGwgZXhwZXJpbWVudCB0byBtZWFzdXJlICJwYXJhc2l0aWMiIGJib3ggbWVtb3J5IGNvbnN1bXB0aW9uOgoraGVyZSB3ZSBzdGFydCAxMDAwICJidXN5Ym94IHNsZWVwIDEwIiBpbiBwYXJhbGxlbC4KK2J1c3lib3ggYmluYXJ5IGlzIHByYWN0aWNhbGx5IGFsbHllc2NvbmZpZyBzdGF0aWMgb25lLAorYnVpbHQgYWdhaW5zdCB1Y2xpYmMuIFJ1biBvbiB4ODYtNjQgbWFjaGluZSB3aXRoIDY0LWJpdCBrZXJuZWw6CisKK2Jhc2gtMy4yIyBubWV0ZXIgJyV0ICVjICVtICVwICVbcG5dJworMjM6MTc6MjggLi4uLi4uLi4uLiAxNjhNICAgIDAgIDE0NworMjM6MTc6MjkgLi4uLi4uLi4uLiAxNjhNICAgIDAgIDE0NworMjM6MTc6MzAgVS4uLi4uLi4uLiAxNjhNICAgIDEgIDE0NworMjM6MTc6MzEgU1UuLi4uLi4uLiAxODFNICAyNDQgIDM5MQorMjM6MTc6MzIgU1NTU1VVVS4uLiAyMjNNICA3NTcgMTE0NworMjM6MTc6MzMgVVVVLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6MzQgVS4uLi4uLi4uLiAyMjNNICAgIDEgMTE0NworMjM6MTc6MzUgLi4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6MzYgLi4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6MzcgUy4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6MzggLi4uLi4uLi4uLiAyMjNNICAgIDEgMTE0NworMjM6MTc6MzkgLi4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6NDAgLi4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6NDEgLi4uLi4uLi4uLiAyMTBNICAgIDAgIDkwNgorMjM6MTc6NDIgLi4uLi4uLi4uLiAxNjhNICAgIDEgIDE0NworMjM6MTc6NDMgLi4uLi4uLi4uLiAxNjhNICAgIDAgIDE0NworCitUaGlzIHJlcXVpcmVzIDU1TSBvZiBtZW1vcnkuIFRodXMgMSB0cml2aWFsIGJ1c3lib3ggYXBwbGV0Cit0YWtlcyA1NWsgb2YgbWVtb3J5IG9uIDY0LWJpdCB4ODYga2VybmVsLgorCitPbiAzMi1iaXQga2VybmVsIHdlIG5lZWQgfjI2ayBwZXIgYXBwbGV0LgorCitTY3JpcHQ6CisKK2k9MTAwMDsgd2hpbGUgdGVzdCAkaSAhPSAwOyBkbworICAgICAgICBlY2hvIC1uIC4KKyAgICAgICAgYnVzeWJveCBzbGVlcCAzMCAmCisgICAgICAgIGk9JCgoaSAtIDEpKQorZG9uZQorZWNobword2FpdAorCisoRGF0YSBmcm9tIE5PTU1VIGFyY2hlcyBhcmUgc291Z2h0LiBQcm92aWRlICdzaXplIGJ1c3lib3gnIG91dHB1dCB0b28pCisKKworCQlFeGFtcGxlIDEKKworT25lIGV4YW1wbGUgaG93IHRvIHJlZHVjZSBnbG9iYWwgZGF0YSB1c2FnZSBpcyBpbgorYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VuemlwLmM6CisKKy8qIFRoaXMgaXMgc29tZXdoYXQgY29tcGxleC1sb29raW5nIGFycmFuZ2VtZW50LCBidXQgaXQgYWxsb3dzCisgKiB0byBwbGFjZSBkZWNvbXByZXNzb3Igc3RhdGUgZWl0aGVyIGluIGJzcyBvciBpbgorICogbWFsbG9jJ2VkIHNwYWNlIHNpbXBseSBieSBjaGFuZ2luZyAjZGVmaW5lcyBiZWxvdy4KKyAqIFNpemVzIG9uIGkzODY6CisgKiB0ZXh0ICAgIGRhdGEgICAgIGJzcyAgICAgZGVjICAgICBoZXgKKyAqIDUyNTYgICAgICAgMCAgICAgMTA4ICAgIDUzNjQgICAgMTRmNCAtIGJzcworICogNDkxNSAgICAgICAwICAgICAgIDAgICAgNDkxNSAgICAxMzMzIC0gbWFsbG9jCisgKi8KKyNkZWZpbmUgU1RBVEVfSU5fQlNTIDAKKyNkZWZpbmUgU1RBVEVfSU5fTUFMTE9DIDEKKworKHNlZSB0aGUgcmVzdCBvZiB0aGUgZmlsZSB0byBnZXQgdGhlIGlkZWEpCisKK1RoaXMgZXhhbXBsZSBjb21wbGV0ZWx5IGVsaW1pbmF0ZXMgZ2xvYmFscyBpbiB0aGF0IG1vZHVsZS4KK1JlcXVpcmVkIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gdW5wYWNrX2d6X3N0cmVhbSgpIFtpdHMgbWFpbiBtb2R1bGVdCithbmQgdGhlbiBwYXNzZWQgZG93biB0byBhbGwgc3Vicm91dGluZXMgd2hpY2ggbmVlZCB0byBhY2Nlc3MgJ2dsb2JhbHMnCithcyBhIHBhcmFtZXRlci4KKworCisJCUV4YW1wbGUgMgorCitJbiBjYXNlIHlvdSBkb24ndCB3YW50IHRvIHBhc3MgdGhpcyBhZGRpdGlvbmFsIHBhcmFtZXRlciBldmVyeXdoZXJlLAordGFrZSBhIGxvb2sgYXQgYXJjaGl2YWwvZ3ppcC5jLiBIZXJlIGFsbCBnbG9iYWwgZGF0YSBpcyByZXBsYWNlZCBieQorc2luZ2xlIGdsb2JhbCBwb2ludGVyIChwdHJfdG9fZ2xvYmFscykgdG8gYWxsb2NhdGVkIHN0b3JhZ2UuCisKK0luIG9yZGVyIHRvIG5vdCBkdXBsaWNhdGUgcHRyX3RvX2dsb2JhbHMgaW4gZXZlcnkgYXBwbGV0LCB5b3UgY2FuCityZXVzZSBzaW5nbGUgY29tbW9uIG9uZS4gSXQgaXMgZGVmaW5lZCBpbiBsaWJiYi9tZXNzYWdlcy5jCithcyBzdHJ1Y3QgZ2xvYmFscyAqY29uc3QgcHRyX3RvX2dsb2JhbHMsIGJ1dCB0aGUgc3RydWN0IGdsb2JhbHMgaXMKK05PVCBkZWZpbmVkIGluIGxpYmJiLmguIFlvdSBmaXJzdCBkZWZpbmUgeW91ciBvd24gc3RydWN0OgorCitzdHJ1Y3QgZ2xvYmFscyB7IGludCBhOyBjaGFyIGJ1ZlsxMDAwXTsgfTsKKworYW5kIHRoZW4gZGVjbGFyZSB0aGF0IHB0cl90b19nbG9iYWxzIGlzIGEgcG9pbnRlciB0byBpdDoKKworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisKK3B0cl90b19nbG9iYWxzIGlzIGRlY2xhcmVkIGFzIGNvbnN0YW50IHBvaW50ZXIuCitUaGlzIGhlbHBzIGdjYyB1bmRlcnN0YW5kIHRoYXQgaXQgd29uJ3QgY2hhbmdlLCByZXN1bHRpbmcgaW4gbm90aWNlYWJseQorc21hbGxlciBjb2RlLiBJbiBvcmRlciB0byBhc3NpZ24gaXQsIHVzZSBTRVRfUFRSX1RPX0dMT0JBTFMgbWFjcm86CisKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsKKworVHlwaWNhbGx5IGl0IGlzIGRvbmUgaW4gPGFwcGxldD5fbWFpbigpLgorCitOb3cgeW91IGNhbiByZWZlcmVuY2UgImdsb2JhbHMiIGJ5IEcuYSwgRy5idWYgYW5kIHNvIG9uLCBpbiBhbnkgZnVuY3Rpb24uCisKKworCQliYl9jb21tb25fYnVmc2l6MQorCitUaGVyZSBpcyBvbmUgYmlnIGNvbW1vbiBidWZmZXIgaW4gYnNzIC0gYmJfY29tbW9uX2J1ZnNpejEuIEl0IGlzIGEgbXVjaAorZWFybGllciBtZWNoYW5pc20gdG8gcmVkdWNlIGJzcyB1c2FnZS4gRWFjaCBhcHBsZXQgY2FuIHVzZSBpdCBmb3IKK2l0cyBuZWVkcy4gTGlicmFyeSBmdW5jdGlvbnMgYXJlIHByb2hpYml0ZWQgZnJvbSB1c2luZyBpdC4KKworJ0cuJyB0cmljayBjYW4gYmUgZG9uZSB1c2luZyBiYl9jb21tb25fYnVmc2l6MSBpbnN0ZWFkIG9mIG1hbGxvY2VkIGJ1ZmZlcjoKKworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisKK0JlIGNhcmVmdWwsIHRob3VnaCwgYW5kIHVzZSBpdCBvbmx5IGlmIGdsb2JhbHMgZml0IGludG8gYmJfY29tbW9uX2J1ZnNpejEuCitTaW5jZSBiYl9jb21tb25fYnVmc2l6MSBpcyBCVUZTSVogKyAxIGJ5dGVzIGxvbmcgYW5kIEJVRlNJWiBjYW4gY2hhbmdlCitmcm9tIG9uZSBsaWJjIHRvIGFub3RoZXIsIHlvdSBoYXZlIHRvIGFkZCBjb21waWxlLXRpbWUgY2hlY2sgZm9yIGl0OgorCitpZiAoc2l6ZW9mKHN0cnVjdCBnbG9iYWxzKSA+IHNpemVvZihiYl9jb21tb25fYnVmc2l6MSkpCisJQlVHXzxhcHBsZXQ+X2dsb2JhbHNfdG9vX2JpZygpOworCisKKwkJRHJhd2JhY2tzCisKK1lvdSBoYXZlIHRvIGluaXRpYWxpemUgaXQgYnkgaGFuZC4geHphbGxvYygpIGNhbiBiZSBoZWxwZnVsIGluIGNsZWFyaW5nCithbGxvY2F0ZWQgc3RvcmFnZSB0byAwLCBidXQgYW55dGhpbmcgbW9yZSBtdXN0IGJlIGRvbmUgYnkgaGFuZC4KKworQWxsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIHByZWZpeGVkIGJ5ICdHLicgbm93LiBJZiB0aGlzIG1ha2VzIGNvZGUKK2xlc3MgcmVhZGFibGUsIHVzZSAjZGVmaW5lczoKKworI2RlZmluZSBkZXZfZmQgKEcuZGV2X2ZkKQorI2RlZmluZSBzZWN0b3IgKEcuc2VjdG9yKQorCisKKwkJV29yZCBvZiBjYXV0aW9uCisKK0lmIGFwcGxldCBkb2Vzbid0IHVzZSBtdWNoIG9mIGdsb2JhbCBkYXRhLCBjb252ZXJ0aW5nIGl0IHRvIHVzZQorb25lIG9mIGFib3ZlIG1ldGhvZHMgaXMgbm90IHdvcnRoIHRoZSByZXN1bHRpbmcgY29kZSBvYmZ1c2NhdGlvbi4KK0lmIHlvdSBoYXZlIGxlc3MgdGhhbiB+MzAwIGJ5dGVzIG9mIGdsb2JhbCBkYXRhIC0gZG9uJ3QgYm90aGVyLgorCisKKwkJRmluZGluZyBub24tc2hhcmVkIGR1cGxpY2F0ZWQgc3RyaW5ncworCitzdHJpbmdzIGJ1c3lib3ggfCBzb3J0IHwgdW5pcSAtYyB8IHNvcnQgLW5yCisKKworCQlnY2MncyBkYXRhIGFsaWdubWVudCBwcm9ibGVtCisKK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlIGFkZGVkIGluIHZpLmM6CisKK3N0YXRpYyBpbnQgdGFic3RvcDsKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyB0ZXJtX29yaWcgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CitzdGF0aWMgc3RydWN0IHRlcm1pb3MgdGVybV92aSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKKworcmVkdWNlcyBic3Mgc2l6ZSBieSAzMiBieXRlcywgYmVjYXVzZSBnY2Mgc29tZXRpbWVzIGFsaWducyBzdHJ1Y3R1cmVzIHRvCityaWRpY3Vsb3VzbHkgbGFyZ2UgdmFsdWVzLiBhc20gb3V0cHV0IGRpZmYgZm9yIGFib3ZlIGV4YW1wbGU6CisKKyB0YWJzdG9wOgorICAgICAgICAuemVybyAgIDQKKyAgICAgICAgLnNlY3Rpb24gICAgICAgIC5ic3MudGVybV9vcmlnLCJhdyIsQG5vYml0cworLSAgICAgICAuYWxpZ24gMzIKKysgICAgICAgLmFsaWduIDQKKyAgICAgICAgLnR5cGUgICB0ZXJtX29yaWcsIEBvYmplY3QKKyAgICAgICAgLnNpemUgICB0ZXJtX29yaWcsIDYwCisgdGVybV9vcmlnOgorICAgICAgICAuemVybyAgIDYwCisgICAgICAgIC5zZWN0aW9uICAgICAgICAuYnNzLnRlcm1fdmksImF3IixAbm9iaXRzCistICAgICAgIC5hbGlnbiAzMgorKyAgICAgICAuYWxpZ24gNAorICAgICAgICAudHlwZSAgIHRlcm1fdmksIEBvYmplY3QKKyAgICAgICAgLnNpemUgICB0ZXJtX3ZpLCA2MAorCitnY2MgZG9lc24ndCBzZWVtIHRvIGhhdmUgb3B0aW9ucyBmb3IgYWx0ZXJpbmcgdGhpcyBiZWhhdmlvdXIuCisKK2djYyAzLjQuMyBhbmQgNC4xLjEgdGVzdGVkOgorY2hhciBjID0gMTsKKy8vIGdjYyBhbGlnbnMgdG8gMzIgYnl0ZXMgaWYgc2l6ZW9mKHN0cnVjdCkgPj0gMzIKK3N0cnVjdCB7CisgICAgaW50IGEsYixjLGQ7CisgICAgaW50IGkxLGkyLGkzOworfSBzMjggPSB7IDEgfTsgICAgLy8gc3RydWN0IHdpbGwgYmUgYWxpZ25lZCB0byA0IGJ5dGVzCitzdHJ1Y3QgeworICAgIGludCBhLGIsYyxkOworICAgIGludCBpMSxpMixpMyxpNDsKK30gczMyID0geyAxIH07ICAgIC8vIHN0cnVjdCB3aWxsIGJlIGFsaWduZWQgdG8gMzIgYnl0ZXMKKy8vIHNhbWUgZm9yIGFycmF5cworY2hhciB2YzMxWzMxXSA9IHsgMSB9OyAvLyB1bmFsaWduZWQKK2NoYXIgdmMzMlszMl0gPSB7IDEgfTsgLy8gYWxpZ25lZCB0byAzMiBieXRlcworCistZnBhY2stc3RydWN0PTEgcmVkdWNlcyBhbGlnbm1lbnQgb2YgczI4IHRvIDEgKGJ1dCBwcm9iYWJseQord2lsbCBicmVhayBsYXlvdXQgb2YgbWFueSBsaWJjIHN0cnVjdHMpIGJ1dCBzMzIgYW5kIHZjMzIKK2FyZSBzdGlsbCBhbGlnbmVkIHRvIDMyIGJ5dGVzLgorCitJIHdpbGwgdHJ5IHRvIGNvb2sgdXAgYSBwYXRjaCB0byBhZGQgYSBnY2Mgb3B0aW9uIGZvciBkaXNhYmxpbmcgaXQuCitNZWFud2hpbGUsIHRoaXMgaXMgd2hlcmUgaXQgY2FuIGJlIGRpc2FibGVkIGluIGdjYyBzb3VyY2U6CisKK2djYy9jb25maWcvaTM4Ni9pMzg2LmMKK2ludAoraXg4Nl9kYXRhX2FsaWdubWVudCAodHJlZSB0eXBlLCBpbnQgYWxpZ24pCit7CisjaWYgMAorICBpZiAoQUdHUkVHQVRFX1RZUEVfUCAodHlwZSkKKyAgICAgICAmJiBUWVBFX1NJWkUgKHR5cGUpCisgICAgICAgJiYgVFJFRV9DT0RFIChUWVBFX1NJWkUgKHR5cGUpKSA9PSBJTlRFR0VSX0NTVAorICAgICAgICYmIChUUkVFX0lOVF9DU1RfTE9XIChUWVBFX1NJWkUgKHR5cGUpKSA+PSAyNTYKKyAgICAgICAgICAgfHwgVFJFRV9JTlRfQ1NUX0hJR0ggKFRZUEVfU0laRSAodHlwZSkpKSAmJiBhbGlnbiA8IDI1NikKKyAgICByZXR1cm4gMjU2OworI2VuZGlmCisKK1Jlc3VsdCAobm9uLXN0YXRpYyBidXN5Ym94IGJ1aWx0IGFnYWluc3QgZ2xpYmMpOgorCisjIHNpemUgL3Vzci9zcmNkZXZlbC9iYm94L2ZpeC9idXN5Ym94LnQwL2J1c3lib3ggYnVzeWJveAorICAgdGV4dCAgICBkYXRhICAgICBic3MgICAgIGRlYyAgICAgaGV4IGZpbGVuYW1lCisgNjM0NDE2ICAgIDI3MzYgICAyMzg1NiAgNjYxMDA4ICAgYTE2MTAgYnVzeWJveAorIDYzMjU4MCAgICAyNjcyICAgMjI5NDQgIDY1ODE5NiAgIGEwYjE0IGJ1c3lib3hfbm9hbGlnbgorCisKKworCQlLZWVwaW5nIGNvZGUgc21hbGwKKworU2V0IENPTkZJR19FWFRSQV9DRkxBR1M9Ii1mbm8taW5saW5lLWZ1bmN0aW9ucy1jYWxsZWQtb25jZSIsCitwcm9kdWNlICJtYWtlIGJsb2F0Y2hlY2siLCBzZWUgdGhlIGJpZ2dlc3QgYXV0by1pbmxpbmVkIGZ1bmN0aW9ucy4KK05vdywgc2V0IENPTkZJR19FWFRSQV9DRkxBR1MgYmFjayB0byAiIiwgYnV0IGFkZCBOT0lOTElORQordG8gc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMuIEluIDEuMTYueCB0aW1lZnJhbWUsIHRoZSByZXN1bHRzIHdlcmUKKyhhbm5vdGF0ZWQgIm1ha2UgYmxvYXRjaGVjayIgb3V0cHV0KToKKworZnVuY3Rpb24gICAgICAgICAgICAgb2xkICAgICBuZXcgICBkZWx0YQorZXhwYW5kX3ZhcnNfdG9fbGlzdCAgICAtICAgIDE3MTIgICArMTcxMiB3aW4KK2x6bzF4X29wdGltaXplICAgICAgICAgLSAgICAxNDI5ICAgKzE0Mjkgd2luCithcml0aF9hcHBseSAgICAgICAgICAgIC0gICAgMTMyNiAgICsxMzI2IHdpbgorcmVhZF9pbnRlcmZhY2VzICAgICAgICAtICAgIDExNjMgICArMTE2MyBsb3NzLCBsZWF2ZSB3L28gTk9JTkxJTkUKK2xvZ2Rpcl9vcGVuICAgICAgICAgICAgLSAgICAxMTQ4ICAgKzExNDggd2luCitjaGVja19kZXBzICAgICAgICAgICAgIC0gICAgMTE0OCAgICsxMTQ4IGxvc3MKK3Jld3JpdGUgICAgICAgICAgICAgICAgLSAgICAxMDM5ICAgKzEwMzkgd2luCitydW5fcGlwZSAgICAgICAgICAgICAzNTggICAgMTM5NiAgICsxMDM4IHdpbgord3JpdGVfc3RhdHVzX2ZpbGUgICAgICAtICAgIDEwMjkgICArMTAyOSBhbG1vc3QgdGhlIHNhbWUsIGxlYXZlIHcvbyBOT0lOTElORQorZHVtcF9pZGVudGl0eSAgICAgICAgICAtICAgICA5ODcgICAgKzk4NyB3aW4KK21haW5RU29ydDMgICAgICAgICAgICAgLSAgICAgOTIxICAgICs5MjEgd2luCitwYXJzZV9vbmVfbGluZSAgICAgICAgIC0gICAgIDkxNiAgICArOTE2IGxvc3MKK3N1bW1hcml6ZSAgICAgICAgICAgICAgLSAgICAgODk3ICAgICs4OTcgYWxtb3N0IHRoZSBzYW1lCitkb19zaG0gICAgICAgICAgICAgICAgIC0gICAgIDg4NCAgICArODg0IHdpbgorY3Bpb19vICAgICAgICAgICAgICAgICAtICAgICA4NjMgICAgKzg2MyB3aW4KK3N1YkNvbW1hbmQgICAgICAgICAgICAgLSAgICAgODQxICAgICs4NDEgbG9zcworcmVjZWl2ZSAgICAgICAgICAgICAgICAtICAgICA4MzQgICAgKzgzNCBsb3NzCisKKzg1NSBieXRlcyBzYXZlZCBpbiB0b3RhbC4KKworc2NyaXB0cy9ta2RpZmZfb2JqX2Jsb2F0IG1heSBiZSB1c2VmdWwgdG8gYXV0b21hdGUgdGhpcyBwcm9jZXNzOiBydW4KKyJzY3JpcHRzL21rZGlmZl9vYmpfYmxvYXQgTk9STUFMTFlfQlVJTFRfVFJFRSBGT1JDRURfTk9JTkxJTkVfVFJFRSIKK2FuZCBzZWxlY3QgbW9kdWxlcyB3aGljaCBzaHJhbmsuCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL2xvZ2dpbmdfYW5kX2JhY2tncm91bmRpbmcudHh0IGIvYnVzeWJveC0xLjE5LjMvZG9jcy9sb2dnaW5nX2FuZF9iYWNrZ3JvdW5kaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTY4ODU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9sb2dnaW5nX2FuZF9iYWNrZ3JvdW5kaW5nLnR4dApAQCAtMCwwICsxLDk2IEBACisJTG9nZ2luZyBhbmQgYmFja2dyb3VuZGluZworCitCeSBkZWZhdWx0LCBiYl9bcF1lcnJvcl9tc2dbX2FuZF9kaWVdIG1lc3NhZ2VzIGdvIHRvIHN0ZGVyciwKK2FuZCBvZiBjb3Vyc2UsIHVzdWFsbHkgYXBwbGV0cyBkbyBub3QgYXV0by1iYWNrZ3JvdW5kLiA6KQorCitIaXN0b3JpY2FsbHksIGRhZW1vbnMgYW5kIGluZXRkIHNlcnZpY2VzIGFyZSBkaWZmZXJlbnQuCisKK0J1c3lib3ggaXMgdHJ5aW5nIHRvIHByb3ZpZGUgY29tcGF0aWJsZSBiZWhhdmlvciwgdGh1cyBpZiBhbiBhcHBsZXQKK2lzIGVtdWxhdGluZyBhbiBleGlzdGluZyB1dGlsaXR5LCBpdCBzaG91bGQgbWltaWMgaXQuIElmIHV0aWxpdHkKK2F1dG8tYmFja2dyb3VuZHMgaXRzZWxmLCBidXN5Ym94IGFwcGxldCBzaG91bGQgZG8gdGhlIHNhbWUuCitJZiB1dGlsaXR5IG5vcm1hbGx5IGxvZ3MgdG8gc3lzbG9nLCBidXN5Ym94IGFwcGxldCBzaG91bGQgZG8KK3RoZSBzYW1lIHRvby4KKworSG93ZXZlciwgYnVzeWJveCBzaG91bGQgbm90IG5lZWRsZXNzbHkgcmVzdHJpY3QgdGhlIGZyZWVkb20KK29mIHRoZSB1c2Vycy4gQW5kIHVzZXJzIGhhdmUgZGlmZmVyZW50IG5lZWRzIGFuZCBkaWZmZXJlbnQgcHJlZmVyZW5jZXMuCitTb21lIG1pZ2h0IGxpa2UgbG9nZ2luZyBldmVyeXRoaW5nIGZyb20gZGFlbW9ucyB0byBzeXNsb2cuCitPdGhlcnMgcHJlZmVyIHJ1bm5pbmcgc3R1ZmYgdW5kZXIgcnVuc3Yvc3Zsb2dkIGFuZCB0aHVzIHdvdWxkIGxpa2UKK2xvZ2dpbmcgdG8gc3RkZXJyIGFuZCBubyBkYWVtb25pemF0aW9uLgorCitUbyBoZWxwIHdpdGggdGhhdCwgYnVzeWJveCBhcHBsZXRzIHNob3VsZCBoYXZlIG9wdGlvbnMgdG8gb3ZlcnJpZGUKK2RlZmF1bHQgYmVoYXZpb3IsIHdoYXRldmVyIHRoYXQgaXMgZm9yIGEgZ2l2ZW4gYXBwbGV0LgorCisKK0N1cnJlbnQgc2l0dWF0aW9uIGlzIGEgYml0IG9mIGEgbWVzczoKKworYWNwaWQgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZAorY3JvbmQgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZiwgbG9ncyB0byBzeXNsb2cgdW5sZXNzIC1kIG9yIC1MLgorICAgIG9wdGlvbiAtZCBsb2dzIHRvIHN0ZGVyciwgLUwgRklMRSBsb2dzIHRvIEZJTEUKK2RldmZzZCAtIChvYnNvbGV0ZSkKK2Ruc2QgLSBvcHRpb24gLWQgbWFrZXMgaXQgYmFja2dyb3VuZCBhbmQgbG9nIHRvIHN5c2xvZworZmFrZWlkZW50ZCAtIGluZXRkIHNlcnZpY2UuIEF1dG8tYmFja2dyb3VuZHMgYW5kIGxvZ3MgdG8gc3lzbG9nCisgICAgaWYgbm8gLWYgYW5kIG5vIC1pIGFuZCBubyAtdyAoLWkgaXMgImluZXRkIHNlcnZpY2UiIGZsYWcsCisgICAgLXcgaXMgImluZXRkLXdhaXQgc2VydmljZSIgZmxhZykKK2Z0cGQgLSBpbmV0ZCBzZXJ2aWNlLiBMb2dzIHRvIHN5c2xvZyB3aXRoIC1TLCB3aXRoIC12IGxvZ3MgdG8gc3RyZXJyIHRvbworaHR0cGQgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZiBvciAtaSAoLWkgaXMgImluZXRkIHNlcnZpY2UiIGZsYWcpCitpbmV0ZCAtIGF1dG8tYmFja2dyb3VuZHMgdW5sZXNzIC1mLCBsb2dzIHRvIHN5c2xvZyB1bmxlc3MgLWUKK2tsb2dkIC0gYXV0by1iYWNrZ3JvdW5kcyB1bmxlc3MgLW4KK3N5c2xvZ2QgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtbgordGVsbmV0ZCAtIGF1dG8tYmFja2dyb3VuZHMgdW5sZXNzIC1mIG9yIC1pICgtaSBpcyAiaW5ldGQgc2VydmljZSIgZmxhZykKK3VkaGNwYyAtIGF1dG8tYmFja2dyb3VuZHMgdW5sZXNzIC1mIGFmdGVyIGxlYXNlIGlzIG9idGFpbmVkLAorICAgIG9wdGlvbiAtYiBtYWtlcyBpdCBiYWNrZ3JvdW5kIHNvb25lciAod2hlbiBsZWFzZSBhdHRlbXB0CisgICAgZmFpbHMgYW5kIHJldHJpZXMgc3RhcnQpLAorICAgIGFmdGVyIGJhY2tncm91bmRpbmcgaXQgc3RvcHMgbG9nZ2luZyB0byBzdGRlcnI7CisgICAgbG9ncyB0byBzdGRlcnIsIGJ1dCBvcHRpb24gLVMgbWFrZXMgaXQgbG9nICphbHNvKiB0byBzeXNsb2cKK3VkaGNwZCAtIGF1dG8tYmFja2dyb3VuZHMgYW5kIGRvIG5vdCBsb2cgdG8gc3RkZXJyIHVubGVzcyAtZiwKKyAgICBvdGhlcndpc2UgbG9ncyB0byBzdGRlcnIsIGJ1dCBvcHRpb24gLVMgbWFrZXMgaXQgbG9nICphbHNvKiB0byBzeXNsb2cKK3pjaXAgLSBhdXRvLWJhY2tncm91bmRzIGFuZCBsb2dzICphbHNvKiB0byBzeXNsb2cgdW5sZXNzIC1mCisKK1RvdGFsOiAxMyBhcHBsZXRzICgrMSBvYnNvbGV0ZSksCisgNCBsb2cgdG8gc3lzbG9nIGJ5IGRlZmF1bHQgKGNyb25kIGZha2VpZGVudGQgaW5ldGQgemNpcCksCisgNSBuZXZlciBsb2cgdG8gc3lzbG9nIChhY3BpZCBodHRwZCB0ZWxuZXRkIGtsb2dkIHN5c2xvZ2QsIGxhc3QgdHdvCisgLSBmb3Igb2J2aW91c2x5IGNvcnJlY3QgcmVhc29ucyksCisgdGhlcmUgYXJlIG5vIGRhZW1vbnMgd2hpY2ggYWx3YXlzIGxvZyB0byBzeXNsb2csCisgMTIgYXV0by1iYWNrZ3JvdW5kIGlmIG5vdCBydW4gYXMgaW5ldGQgc2VydmljZXMgKGFsbCBleGNlcHQgZG5zZC4KKyBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gInN0YW5kYXJkIiBkbnNkIEFGQUlLUykuIEJ1dCBzZWUgYmVsb3cKKyBmb3IgZGFlbW9ucyAodGNwc3ZkIGV0Yykgd2hpY2ggZG9uJ3QgYXV0by1iYWNrZ3JvdW5kLgorCittaXNjdXRpbHMvY3JvbmQuYzogICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CituZXR3b3JraW5nL2Ruc2QuYzogICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CituZXR3b3JraW5nL2Z0cGQuYzogICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9OT05FOworbmV0d29ya2luZy9mdHBkLmM6ICAgICAgICAgICAgbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvaW5ldGQuYzogICAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvaXNydl9pZGVudGQuYzogICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvdGVsbmV0ZC5jOiAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuYzogICAgIGxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CituZXR3b3JraW5nL3VkaGNwL2RoY3BjLmM6ICAgICBsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworbmV0d29ya2luZy91ZGhjcC9kaGNwYy5jOiAgICAgbG9nbW9kZSAmPSB+TE9HTU9ERV9TVERJTzsKK25ldHdvcmtpbmcvdWRoY3AvZGhjcGQuYzogICAgIGxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CituZXR3b3JraW5nL3VkaGNwL2RoY3BkLmM6ICAgICBsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworbmV0d29ya2luZy96Y2lwLmM6ICAgICAgICAgICAgbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKKworCitUaGVzZSBkYWVtb25zIG5ldmVyIGF1dG8tYmFja2dyb3VuZCBhbmQgbmV2ZXIgbG9nIHRvIHN5c2xvZzoKKworbHBkIC0gaW5ldGQgc2VydmljZS4gSGFzIG5vdGhpbmcgdG8gbG9nIHNvIGZhciwgdGhvdWdoCitkaGNwcmVsYXkgLSBzdGFuZGFyZCBiZWhhdmlvcgoraW5vdGlmeWQgLSBzdGFuZGFyZCBiZWhhdmlvcgorcnVuc3YgLSBzdGFuZGFyZCBiZWhhdmlvcgorcnVuc3ZkaXIgLSBzdGFuZGFyZCBiZWhhdmlvcgorc3Zsb2dkIC0gc3RhbmRhcmQgYmVoYXZpb3IKK3RjcHN2ZCwgdWRwc3ZkIC0gc3RhbmRhcmQgYmVoYXZpb3IKK3RmdHBkIC0gc3RhbmRhcmQgYmVoYXZpb3IKKworCitOb24tZGFlbW9ucyAoc2VlbXMgdG8gYmUgdXNlIHN5c2xvZyBmb3IgYSBnb29kIHJlYXNvbik6CisKK25ldHdvcmtpbmcvbmFtZWlmLmM6ICAgICAgICAgIGxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7Citsb2dpbnV0aWxzL2NocGFzc3dkLmM6ICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworbG9naW51dGlscy9jaHBhc3N3ZC5jOiAgICAgICAgbG9nbW9kZSA9IExPR01PREVfU1RESU87Citsb2dpbnV0aWxzL2dldHR5LmM6ICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworbG9naW51dGlscy9nZXR0eS5jOiAgICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfTk9ORTsKK2xvZ2ludXRpbHMvcGFzc3dkLmM6ICAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworbG9naW51dGlscy9wYXNzd2QuYzogICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfQk9USDsKK2xvZ2ludXRpbHMvc3Vsb2dpbi5jOiAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsgKHVzZWQgaWYgc3RkaW8gaXNuJ3QgYSB0dHkpCitsb2dpbnV0aWxzL3N1bG9naW4uYzogICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9CT1RIOwordXRpbC1saW51eC9tb3VudC5jOiAgICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOyAodXNlZCBpbiBhIGJhY2tncm91bmRlZCBORlMgbW91bnQgaGVscGVyKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZG9jcy9tZGV2LnR4dCBiL2J1c3lib3gtMS4xOS4zL2RvY3MvbWRldi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwM2JkOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2RvY3MvbWRldi50eHQKQEAgLTAsMCArMSwxNDUgQEAKKy0tLS0tLS0tLS0tLS0KKyBNREVWIFByaW1lcgorLS0tLS0tLS0tLS0tLQorCitGb3IgdGhvc2Ugb2YgdXMgd2hvIGtub3cgaG93IHRvIHVzZSBtZGV2LCBhIHByaW1lciBtaWdodCBzZWVtIGxhbWUuICBGb3IKK2V2ZXJ5b25lIGVsc2UsIG1kZXYgaXMgYSB3ZWlyZCBibGFjayBib3ggdGhhdCB0aGV5IGhlYXIgaXMgYXdlc29tZSwgYnV0IGNhbid0CitzZWVtIHRvIGdldCB0aGVpciBoZWFkIGFyb3VuZCBob3cgaXQgd29ya3MuICBUaHVzLCBhIHByaW1lci4KKworLS0tLS0tLS0tLS0KKyBCYXNpYyBVc2UKKy0tLS0tLS0tLS0tCisKK01kZXYgaGFzIHR3byBwcmltYXJ5IHVzZXM6IGluaXRpYWwgcG9wdWxhdGlvbiBhbmQgZHluYW1pYyB1cGRhdGVzLiAgQm90aAorcmVxdWlyZSBzeXNmcyBzdXBwb3J0IGluIHRoZSBrZXJuZWwgYW5kIGhhdmUgaXQgbW91bnRlZCBhdCAvc3lzLiAgRm9yIGR5bmFtaWMKK3VwZGF0ZXMsIHlvdSBhbHNvIG5lZWQgdG8gaGF2ZSBob3RwbHVnZ2luZyBlbmFibGVkIGluIHlvdXIga2VybmVsLgorCitIZXJlJ3MgYSB0eXBpY2FsIGNvZGUgc25pcHBldCBmcm9tIHRoZSBpbml0IHNjcmlwdDoKK1swXSBtb3VudCAtdCBwcm9jIHByb2MgL3Byb2MKK1sxXSBtb3VudCAtdCBzeXNmcyBzeXNmcyAvc3lzCitbMl0gZWNobyAvc2Jpbi9tZGV2ID4gL3Byb2Mvc3lzL2tlcm5lbC9ob3RwbHVnCitbM10gbWRldiAtcworCitBbHRlcm5hdGl2ZWx5LCB3aXRob3V0IHByb2NmcyB0aGUgYWJvdmUgYmVjb21lczoKK1sxXSBtb3VudCAtdCBzeXNmcyBzeXNmcyAvc3lzCitbMl0gc3lzY3RsIC13IGtlcm5lbC5ob3RwbHVnPS9zYmluL21kZXYKK1szXSBtZGV2IC1zCisKKworT2YgY291cnNlLCBhIG1vcmUgImZ1bGwiIHNldHVwIHdvdWxkIGVudGFpbCBleGVjdXRpbmcgdGhpcyBiZWZvcmUgdGhlIHByZXZpb3VzCitjb2RlIHNuaXBwZXQ6CitbNF0gbW91bnQgLXQgdG1wZnMgLW8gc2l6ZT02NGssbW9kZT0wNzU1IHRtcGZzIC9kZXYKK1s1XSBta2RpciAvZGV2L3B0cworWzZdIG1vdW50IC10IGRldnB0cyBkZXZwdHMgL2Rldi9wdHMKKworVGhlIHNpbXBsZSBleHBsYW5hdGlvbiBoZXJlIGlzIHRoYXQgWzFdIHlvdSBuZWVkIHRvIGhhdmUgL3N5cyBtb3VudGVkIGJlZm9yZQorZXhlY3V0aW5nIG1kZXYuICBUaGVuIHlvdSBbMl0gaW5zdHJ1Y3QgdGhlIGtlcm5lbCB0byBleGVjdXRlIC9zYmluL21kZXYgd2hlbmV2ZXIKK2EgZGV2aWNlIGlzIGFkZGVkIG9yIHJlbW92ZWQgc28gdGhhdCB0aGUgZGV2aWNlIG5vZGUgY2FuIGJlIGNyZWF0ZWQgb3IKK2Rlc3Ryb3llZC4gIFRoZW4geW91IFszXSBzZWVkIC9kZXYgd2l0aCBhbGwgdGhlIGRldmljZSBub2RlcyB0aGF0IHdlcmUgY3JlYXRlZAord2hpbGUgdGhlIHN5c3RlbSB3YXMgYm9vdGluZy4KKworRm9yIHRoZSAiZnVsbCIgc2V0dXAsIHlvdSB3YW50IHRvIFs0XSBtYWtlIHN1cmUgL2RldiBpcyBhIHRtcGZzIGZpbGVzeXN0ZW0KKyhhc3N1bWluZyB5b3UncmUgcnVubmluZyBvdXQgb2YgZmxhc2gpLiAgVGhlbiB5b3Ugd2FudCB0byBbNV0gY3JlYXRlIHRoZQorL2Rldi9wdHMgbW91bnQgcG9pbnQgYW5kIGZpbmFsbHkgWzZdIG1vdW50IHRoZSBkZXZwdHMgZmlsZXN5c3RlbSBvbiBpdC4KKworLS0tLS0tLS0tLS0tLQorIE1ERVYgQ29uZmlnICAgKC9ldGMvbWRldi5jb25mKQorLS0tLS0tLS0tLS0tLQorCitNZGV2IGhhcyBhbiBvcHRpb25hbCBjb25maWcgZmlsZSBmb3IgY29udHJvbGxpbmcgb3duZXJzaGlwL3Blcm1pc3Npb25zIG9mCitkZXZpY2Ugbm9kZXMgaWYgeW91ciBzeXN0ZW0gbmVlZHMgc29tZXRoaW5nIG1vcmUgdGhhbiB0aGUgZGVmYXVsdCByb290L3Jvb3QKKzY2MCBwZXJtaXNzaW9ucy4KKworVGhlIGZpbGUgaGFzIHRoZSBmb3JtYXQ6CisgICAgPGRldmljZSByZWdleD4gICAgICAgPHVpZD46PGdpZD4gPHBlcm1pc3Npb25zPgorIG9yIEA8bWFqWyxtaW4xWy1taW4yXV0+IDx1aWQ+OjxnaWQ+IDxwZXJtaXNzaW9ucz4KKworRm9yIGV4YW1wbGU6CisgICAgaGRbYS16XVswLTldKiAwOjMgNjYwCisKK1RoZSBjb25maWcgZmlsZSBwYXJzaW5nIHN0b3BzIGF0IHRoZSBmaXJzdCBtYXRjaGluZyBsaW5lLiAgSWYgbm8gbGluZSBpcworbWF0Y2hlZCwgdGhlbiB0aGUgZGVmYXVsdCBvZiAwOjAgNjYwIGlzIHVzZWQuICBUbyBzZXQgeW91ciBvd24gZGVmYXVsdCwgc2ltcGx5CitjcmVhdGUgeW91ciBvd24gdG90YWwgbWF0Y2ggbGlrZSBzbzoKKwkuKiAxOjEgNzc3CisKK1lvdSBjYW4gcmVuYW1lL21vdmUgZGV2aWNlIG5vZGVzIGJ5IHVzaW5nIHRoZSBuZXh0IG9wdGlvbmFsIGZpZWxkLgorCTxkZXZpY2UgcmVnZXg+IDx1aWQ+OjxnaWQ+IDxwZXJtaXNzaW9ucz4gWz1wYXRoXQorU28gaWYgeW91IHdhbnQgdG8gcGxhY2UgdGhlIGRldmljZSBub2RlIGludG8gYSBzdWJkaXJlY3RvcnksIG1ha2Ugc3VyZSB0aGUgcGF0aAoraGFzIGEgdHJhaWxpbmcgLy4gIElmIHlvdSB3YW50IHRvIHJlbmFtZSB0aGUgZGV2aWNlIG5vZGUsIGp1c3QgcGxhY2UgdGhlIG5hbWUuCisJaGRhIDA6MyA2NjAgPWRyaXZlcy8KK1RoaXMgd2lsbCBtb3ZlICJoZGEiIGludG8gdGhlIGRyaXZlcy8gc3ViZGlyZWN0b3J5LgorCWhkYiAwOjMgNjYwID1jZHJvbQorVGhpcyB3aWxsIHJlbmFtZSAiaGRiIiB0byAiY2Ryb20iLgorCitTaW1pbGFybHksICI+cGF0aCIgcmVuYW1lcy9tb3ZlcyB0aGUgZGV2aWNlIGJ1dCBpdCBhbHNvIGNyZWF0ZXMKK2EgZGlyZWN0IHN5bWxpbmsgL2Rldi9ERVZOQU1FIHRvIHRoZSByZW5hbWVkL21vdmVkIGRldmljZS4KKworWW91IGNhbiBhbHNvIHByZXZlbnQgY3JlYXRpb24gb2YgZGV2aWNlIG5vZGVzIHdpdGggdGhlIDR0aCBmaWVsZCBhcyAiISI6CisJdHR5W2Etel0uIDA6MCA2NjAgIQorCXB0eVthLXpdLiAwOjAgNjYwICEKKworSWYgeW91IGFsc28gZW5hYmxlIHN1cHBvcnQgZm9yIGV4ZWN1dGluZyB5b3VyIG93biBjb21tYW5kcywgdGhlbiB0aGUgZmlsZSBoYXMKK3RoZSBmb3JtYXQ6CisJPGRldmljZSByZWdleD4gPHVpZD46PGdpZD4gPHBlcm1pc3Npb25zPiBbPXBhdGhdIFtAfCR8Kjxjb21tYW5kPl0KKyAgICBvcgorCTxkZXZpY2UgcmVnZXg+IDx1aWQ+OjxnaWQ+IDxwZXJtaXNzaW9ucz4gWz5wYXRoXSBbQHwkfCo8Y29tbWFuZD5dCisgICAgb3IKKwk8ZGV2aWNlIHJlZ2V4PiA8dWlkPjo8Z2lkPiA8cGVybWlzc2lvbnM+IFshXSBbQHwkfCo8Y29tbWFuZD5dCisKK0ZvciBleGFtcGxlOgorLS0tODwtLS0KKyMgYmxvY2sgZGV2aWNlcworKFtoc11kW2Etel0pCQlyb290OmRpc2sJNjYwCT5kaXNrLyUxLzAKKyhbaHNdZFthLXpdKShbMC05XSspCXJvb3Q6ZGlzawk2NjAJPmRpc2svJTEvJTIKK21tY2JsayhbMC05XSspCQlyb290OmRpc2sJNjYwCT5kaXNrL21tYy8lMS8wCittbWNibGsoWzAtOV0rKXAoWzAtOV0rKQlyb290OmRpc2sJNjYwCT5kaXNrL21tYy8lMS8lMgorIyBuZXR3b3JrIGRldmljZXMKKyh0dW58dGFwKQkJcm9vdDpuZXR3b3JrCTY2MAk+bmV0LyUxCistLS04PC0tLQorCitUaGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGhhdmUgdGhlIG1lYW5pbmc6CisJQCBSdW4gYWZ0ZXIgY3JlYXRpbmcgdGhlIGRldmljZS4KKwkkIFJ1biBiZWZvcmUgcmVtb3ZpbmcgdGhlIGRldmljZS4KKwkqIFJ1biBib3RoIGFmdGVyIGNyZWF0aW5nIGFuZCBiZWZvcmUgcmVtb3ZpbmcgdGhlIGRldmljZS4KKworVGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgdmlhIHRoZSBzeXN0ZW0oKSBmdW5jdGlvbiAod2hpY2ggbWVhbnMgeW91J3JlIGdpdmluZyBhCitjb21tYW5kIHRvIHRoZSBzaGVsbCksIHNvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIHNoZWxsIGluc3RhbGxlZCBhdCAvYmluL3NoLiAgWW91CitzaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCB0aGUga2VybmVsIGV4ZWN1dGVzIGhvdHBsdWcgaGVscGVycyB3aXRoIHN0ZGluLAorc3Rkb3V0LCBhbmQgc3RkZXJyIGNvbm5lY3RlZCB0byAvZGV2L251bGwuCisKK0ZvciB5b3VyIGNvbnZlbmllbmNlLCB0aGUgc2hlbGwgZW52IHZhciAkTURFViBpcyBzZXQgdG8gdGhlIGRldmljZSBuYW1lLiAgU28gaWYKK3RoZSBkZXZpY2UgImhkYyIgd2FzIG1hdGNoZWQsIE1ERVYgd291bGQgYmUgc2V0IHRvICJoZGMiLgorCistLS0tLS0tLS0tCisgRklSTVdBUkUKKy0tLS0tLS0tLS0KKworU29tZSBrZXJuZWwgZGV2aWNlIGRyaXZlcnMgbmVlZCB0byByZXF1ZXN0IGZpcm13YXJlIGF0IHJ1bnRpbWUgaW4gb3JkZXIgdG8KK3Byb3Blcmx5IGluaXRpYWxpemUgYSBkZXZpY2UuICBQbGFjZSBhbGwgc3VjaCBmaXJtd2FyZSBmaWxlcyBpbnRvIHRoZQorL2xpYi9maXJtd2FyZS8gZGlyZWN0b3J5LiAgQXQgcnVudGltZSwgdGhlIGtlcm5lbCB3aWxsIGludm9rZSBtZGV2IHdpdGggdGhlCitmaWxlbmFtZSBvZiB0aGUgZmlybXdhcmUgd2hpY2ggbWRldiB3aWxsIGxvYWQgb3V0IG9mIC9saWIvZmlybXdhcmUvIGFuZCBpbnRvCit0aGUga2VybmVsIHZpYSB0aGUgc3lzZnMgaW50ZXJmYWNlLiAgVGhlIGV4YWN0IGZpbGVuYW1lIGlzIGhhcmRjb2RlZCBpbiB0aGUKK2tlcm5lbCwgc28gbG9vayB0aGVyZSBpZiB5b3UgbmVlZCB0byBrbm93IGhvdyB0byBuYW1lIHRoZSBmaWxlIGluIHVzZXJzcGFjZS4KKworLS0tLS0tLS0tLS0tCisgU0VRVUVOQ0lORworLS0tLS0tLS0tLS0tCisKK0tlcm5lbCBkb2VzIG5vdCBzZXJpYWxpemUgaG90cGx1ZyBldmVudHMuIEl0IGluY3JlbWVudHMgU0VRTlVNIGVudmlyb25tZW50YWwKK3ZhcmlhYmxlIGZvciBlYWNoIHN1Y2Nlc3NpdmUgaG90cGx1ZyBpbnZvY2F0aW9uLiBOb3JtYWxseSwgbWRldiBkb2Vzbid0IGNhcmUuCitUaGlzIG1heSByZW9yZGVyIGhvdHBsdWcgYW5kIGhvdC11bnBsdWcgZXZlbnRzLCB3aXRoIHR5cGljYWwgc3ltcHRvbXMgb2YKK2RldmljZSBub2RlcyBzb21ldGltZXMgbm90IGNyZWF0ZWQgYXMgZXhwZWN0ZWQuCisKK0hvd2V2ZXIsIGlmIC9kZXYvbWRldi5zZXEgZmlsZSBpcyBmb3VuZCwgbWRldiB3aWxsIGNvbXBhcmUgaXRzCitjb250ZW50cyB3aXRoIFNFUU5VTS4gSXQgd2lsbCByZXRyeSB1cCB0byB0d28gc2Vjb25kcywgd2FpdGluZyBmb3IgdGhlbQordG8gbWF0Y2guIElmIHRoZXkgbWF0Y2ggZXhhY3RseSAobm90IGV2ZW4gdHJhaWxpbmcgJ1xuJyBpcyBhbGxvd2VkKSwKK29yIGlmIHR3byBzZWNvbmRzIHBhc3MsIG1kZXYgcnVucyBhcyB1c3VhbCwgdGhlbiBpdCByZXdyaXRlcyAvZGV2L21kZXYuc2VxCit3aXRoIFNFUU5VTSsxLgorCitJT1c6IHRoaXMgd2lsbCBzZXJpYWxpemUgY29uY3VycmVudCBtZGV2IGludm9jYXRpb25zLgorCitJZiB5b3Ugd2FudCB0byBhY3RpdmF0ZSB0aGlzIGZlYXR1cmUsIGV4ZWN1dGUgImVjaG8gPi9kZXYvbWRldi5zZXEiIHByaW9yIHRvCitzZXR0aW5nIG1kZXYgdG8gYmUgdGhlIGhvdHBsdWcgaGFuZGxlci4gVGhpcyB3cml0ZXMgc2luZ2xlICdcbicgdG8gdGhlIGZpbGUuCitOQjogbWRldiByZWNvZ25pemVzIC9kZXYvbWRldi5zZXEgY29uc2lzdGluZyBvZiBzaW5nbGUgJ1xuJyBjaGFyYWN0ZXIKK2FzIGEgc3BlY2lhbCBjYXNlLiBJT1c6IHRoaXMgd2lsbCBub3QgbWFrZSB5b3VyIGZpcnN0IGhvdHBsdWcgZXZlbnQKK3RvIHN0YWxsIGZvciB0d28gc2Vjb25kcy4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RvY3MvbmV3LWFwcGxldC1IT1dUTy50eHQgYi9idXN5Ym94LTEuMTkuMy9kb2NzL25ldy1hcHBsZXQtSE9XVE8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODA1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL25ldy1hcHBsZXQtSE9XVE8udHh0CkBAIC0wLDAgKzEsMTgyIEBACitIb3cgdG8gQWRkIGEgTmV3IEFwcGxldCB0byBCdXN5Qm94Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZG9jdW1lbnQgZGV0YWlscyB0aGUgc3RlcHMgeW91IG11c3QgdGFrZSB0byBhZGQgYSBuZXcgYXBwbGV0IHRvIEJ1c3lCb3guCisKK0NyZWRpdHM6CitNYXR0IEtyYWFpIC0gaW5pdGlhbCB3cml0ZXVwCitNYXJrIFdoaXRsZXkgLSB0aGUgcmVtaXgKK1Rob21hcyBMdW5kcXVpc3QgLSBUcnlpbmcgdG8ga2VlcCBpdCB1cGRhdGVkLgorCitXaGVuIGRvaW5nIHRoaXMgeW91IHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbGF0ZXN0IGdpdCBIRUFELgorVGhpcyBpcyBhIGdvb2QgdGhpbmcgaWYgeW91IHBsYW4gdG8gZ2V0dGluZyBpdCBjb21taXR0ZWQgaW50byBtYWlubGluZS4KKworSW5pdGlhbCBXcml0ZQorLS0tLS0tLS0tLS0tLQorCitGaXJzdCwgd3JpdGUgeW91ciBhcHBsZXQuICBCZSBzdXJlIHRvIGluY2x1ZGUgY29weXJpZ2h0IGluZm9ybWF0aW9uIGF0IHRoZSB0b3AsCitzdWNoIGFzIHdobyB5b3Ugc3RvbGUgdGhlIGNvZGUgZnJvbSBhbmQgc28gZm9ydGguIEFsc28gaW5jbHVkZSB0aGUgbWluaS1HUEwKK2JvaWxlcnBsYXRlLiBCZSBzdXJlIHRvIG5hbWUgdGhlIG1haW4gZnVuY3Rpb24gPGFwcGxldD5fbWFpbiBpbnN0ZWFkIG9mIG1haW4uCitBbmQgYmUgc3VyZSB0byBwdXQgaXQgaW4gPGFwcGxldD4uYy4gVXNhZ2UgZG9lcyBub3QgaGF2ZSB0byBiZSB0YWtlbiBjYXJlIG9mIGJ5Cit5b3VyIGFwcGxldC4KK01ha2Ugc3VyZSB0byAjaW5jbHVkZSAibGliYmIuaCIgYXMgdGhlIGZpcnN0IGluY2x1ZGUgZmlsZSBpbiB5b3VyIGFwcGxldC4KKworRm9yIGEgbmV3IGFwcGxldCBtdSwgaGVyZSBpcyB0aGUgY29kZSB0aGF0IHdvdWxkIGdvIGluIG11LmM6CisKKyhidXN5Ym94LmggYWxyZWFkeSBpbmNsdWRlcyBtb3N0IHVzdWFsIGhlYWRlciBmaWxlcy4gWW91IGRvIG5vdCBuZWVkCisjaW5jbHVkZSA8c3RkaW8uaD4gZXRjLi4uKQorCisKKy0tLS1iZWdpbiBleGFtcGxlIGNvZGUtLS0tLS0KKworLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBtdSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgW1lFQVJdIGJ5IFtZT1VSIE5BTUVdIDxZT1VSIEVNQUlMPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAib3RoZXIuaCIKKworaW50IG11X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtdV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisJc3NpemVfdCBuOworCWNoYXIgbXU7CisKKwlmZCA9IHhvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKTsKKworCWlmICgobiA9IHNhZmVfcmVhZChmZCwgJm11LCAxKSkgPCAxKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIi9kZXYvcmFuZG9tIik7CisKKwlyZXR1cm4gbXU7Cit9CisKKy0tLS1lbmQgZXhhbXBsZSBjb2RlLS0tLS0tCisKKworQ29kaW5nIFN0eWxlCistLS0tLS0tLS0tLS0KKworQmVmb3JlIHlvdSBzdWJtaXQgeW91ciBhcHBsZXQgZm9yIGluY2x1c2lvbiBpbiBCdXN5Qm94LCAob3IgYmV0dGVyIHlldCwgYmVmb3JlCit5b3UgX3dyaXRlXyB5b3VyIGFwcGxldCkgcGxlYXNlIHJlYWQgdGhyb3VnaCB0aGUgc3R5bGUgZ3VpZGUgaW4gdGhlIGRvY3MKK2RpcmVjdG9yeSBhbmQgbWFrZSB5b3VyIHByb2dyYW0gY29tcGxpYW50LgorCisKK1NvbWUgV29yZHMgb24gbGliYmIKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgeW91IGFyZSB3cml0aW5nIHlvdXIgYXBwbGV0LCBwbGVhc2UgYmUgYXdhcmUgb2YgdGhlIGJvZHkgb2YgcHJlLWV4aXN0aW5nCit1c2VmdWwgZnVuY3Rpb25zIGluIGxpYmJiLiBVc2UgdGhlc2UgaW5zdGVhZCBvZiByZWludmVudGluZyB0aGUgd2hlZWwuCisKK0FkZGl0aW9uYWxseSwgaWYgeW91IGhhdmUgYW55IHVzZWZ1bCwgZ2VuZXJhbC1wdXJwb3NlIGZ1bmN0aW9ucyBpbiB5b3VyCithcHBsZXQgdGhhdCBjb3VsZCBiZSB1c2VmdWwgaW4gb3RoZXIgYXBwbGV0cywgY29uc2lkZXIgcHV0dGluZyB0aGVtIGluIGxpYmJiLgorCitBbmQgaXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgc29tZSBvZiB0aGUgb3RoZXIgYXBwbGV0cyB1c2VzIGZ1bmN0aW9ucyB5b3UKK2NvdWxkIHVzZS4gSWYgc28sIHlvdSBoYXZlIHRvIHJpcCB0aGUgZnVuY3Rpb24gb3V0IG9mIHRoZSBhcHBsZXQgYW5kIG1ha2UKK2EgbGliYmIgZnVuY3Rpb24gb3V0IG9mIGl0LgorCitBZGRpbmcgYSBsaWJiYiBmdW5jdGlvbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNYWtlIGEgbmV3IGZpbGUgbmFtZWQgPGZ1bmN0aW9uX25hbWU+LmMKKworLS0tLXN0YXJ0IGV4YW1wbGUgY29kZS0tLS0tLQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJvdGhlci5oIgorCitpbnQgZnVuY3Rpb24oY2hhciAqYSkKK3sKKwlyZXR1cm4gKmE7Cit9CisKKy0tLS1lbmQgZXhhbXBsZSBjb2RlLS0tLS0tCisKK0FkZCA8ZnVuY3Rpb25fbmFtZT4ubyBpbiB0aGUgcmlnaHQgYWxwaGFiZXRpY2FsbHkgc29ydGVkIHBsYWNlCitpbiBsaWJiYi9LYnVpbGQuc3JjLiBZb3Ugc2hvdWxkIGxvb2sgYXQgdGhlIGNvbmRpdGlvbmFsIHBhcnQgb2YKK2xpYmJiL0tidWlsZC5zcmMgYXMgd2VsbC4KKworWW91IHNob3VsZCBhbHNvIHRyeSB0byBmaW5kIGEgc3VpdGFibGUgcGxhY2UgaW4gaW5jbHVkZS9saWJiYi5oIGZvcgordGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLiBJZiBub3QsIGFkZCBpdCBzb21ld2hlcmUgYW55d2F5LCB3aXRoIG9yIHdpdGhvdXQKK2lmZGVmcyB0byBpbmNsdWRlIG9yIG5vdC4KKworWW91IGNhbiBsb29rIGF0IGxpYmJiL0NvbmZpZy5zcmMgYW5kIHRyeSB0byBmaW5kIG91dCBpZiB0aGUgZnVuY3Rpb24gaXMKK3R1bmFibGUgYW5kIGFkZCBpdCB0aGVyZSBpZiBpdCBpcy4KKworCitQbGFjZW1lbnQgLyBEaXJlY3RvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGaW5kIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgZm9yIHlvdXIgbmV3IGFwcGxldC4KKworTWFrZSBzdXJlIHlvdSBmaW5kIHRoZSBhcHByb3ByaWF0ZSBwbGFjZXMgaW4gdGhlIGZpbGVzLCB0aGUgYXBwbGV0cyBhcmUKK3NvcnRlZCBhbHBoYWJldGljYWxseS4KKworQWRkIHRoZSBhcHBsZXQgdG8gS2J1aWxkLnNyYyBpbiB0aGUgY2hvc2VuIGRpcmVjdG9yeToKKworbGliLSQoQ09ORklHX01VKSAgICAgICAgICAgICAgICs9IG11Lm8KKworQWRkIHRoZSBhcHBsZXQgdG8gQ29uZmlnLnNyYyBpbiB0aGUgY2hvc2VuIGRpcmVjdG9yeToKKworY29uZmlnIE1VCisJYm9vbCAiTVUiCisJZGVmYXVsdCBuCisJaGVscAorCSAgUmV0dXJucyBhbiBpbmRldGVybWluYXRlIHZhbHVlLgorCisKK1VzYWdlIFN0cmluZyhzKQorLS0tLS0tLS0tLS0tLS0tCisKK05leHQsIGFkZCB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgeW91IGFwcGxldCB0byBpbmNsdWRlL3VzYWdlLnNyYy5oLgorVGhpcyBzaG91bGQgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKwkjZGVmaW5lIG11X3RyaXZpYWxfdXNhZ2UgXAorCQkiLVthYmNkZV0gRklMRVMiCisJI2RlZmluZSBtdV9mdWxsX3VzYWdlIFwKKwkJIlJldHVybnMgYW4gaW5kZXRlcm1pbmF0ZSB2YWx1ZS5cblxuIiBcCisJCSJPcHRpb25zOlxuIiBcCisJCSJcdC1hXHRcdGZpcnN0IGZ1bmN0aW9uXG4iIFwKKwkJIlx0LWJcdFx0c2Vjb25kIGZ1bmN0aW9uXG4iIFwKKwkJLi4uCisKK0lmIHlvdXIgcHJvZ3JhbSBzdXBwb3J0cyBmbGFncywgdGhlIGZsYWdzIHNob3VsZCBiZSBtZW50aW9uZWQgb24gdGhlIGZpcnN0CitsaW5lICgtW2FiY2RlXSkgYW5kIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgZWFjaCBmbGFnIHNob3VsZCBnbyBpbiB0aGUKK211X2Z1bGxfdXNhZ2Ugc2VjdGlvbiwgb25lIGZsYWcgcGVyIGxpbmUuIChOdW1lcm91cyBleGFtcGxlcyBvZiB0aGlzCitjdXJyZW50bHkgZXhpc3QgaW4gdXNhZ2Uuc3JjLmguKQorCisKK0hlYWRlciBGaWxlcworLS0tLS0tLS0tLS0tCisKK05leHQsIGFkZCBhbiBlbnRyeSB0byBpbmNsdWRlL2FwcGxldHMuc3JjLmguICBCZSAqc3VyZSogdG8ga2VlcCB0aGUgbGlzdAoraW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBvciBlbHNlIGl0IHdpbGwgYnJlYWsgdGhlIGJpbmFyeS1zZWFyY2ggbG9va3VwCithbGdvcml0aG0gaW4gYnVzeWJveC5jIGFuZCB0aGUgR29kcyBvZiBCdXN5Qm94IHNtaXRlIHlvdS4gWWVhLCB2ZXJpbHk6CisKK0JlIHN1cmUgdG8gcmVhZCB0aGUgdG9wIG9mIGFwcGxldHMuc3JjLmggYmVmb3JlIGFkZGluZyB5b3VyIGFwcGxldC4KKworCS8qIGFsbCBwcm9ncmFtcyBhYm92ZSBoZXJlIGFyZSBhbHBoYWJldGljYWxseSAibGVzcyB0aGFuIiAnbXUnICovCisJSUZfTVUoQVBQTEVUKG11LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKwkvKiBhbGwgcHJvZ3JhbXMgYmVsb3cgaGVyZSBhcmUgYWxwaGFiZXRpY2FsbHkgImdyZWF0ZXIgdGhhbiIgJ211JyAqLworCisKK1RoZSBHcmFuZCBBbm5vdW5jZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlbiBjcmVhdGUgYSBkaWZmIGJ5IGFkZGluZyB0aGUgbmV3IGZpbGVzIHRvIGdpdCAocmVtZW1iZXIgeW91ciBsaWJiYiBmaWxlcykKKwlnaXQgYWRkIDx3aGVyZSB5b3UgcHV0IGl0Pi9tdS5jCitldmVudHVhbGx5IGFsc286CisJZ2l0IGFkZCBsaWJiYi9mdW5jdGlvbi5jCit0aGVuCisJZ2l0IGNvbW1pdAorCWdpdCBmb3JtYXQtcGF0Y2ggSEVBRF4KK2FuZCBzZW5kIGl0IHRvIHRoZSBtYWlsaW5nIGxpc3Q6CisJYnVzeWJveEBidXN5Ym94Lm5ldAorCWh0dHA6Ly9idXN5Ym94Lm5ldC9tYWlsbWFuL2xpc3RpbmZvL2J1c3lib3gKKworU2VuZGluZyBwYXRjaGVzIGFzIGF0dGFjaG1lbnRzIGlzIHByZWZlcnJlZCwgYnV0IG5vdCByZXF1aXJlZC4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RvY3Mvbm9mb3JrX25vZXhlYy50eHQgYi9idXN5Ym94LTEuMTkuMy9kb2NzL25vZm9ya19ub2V4ZWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OGY1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL25vZm9ya19ub2V4ZWMudHh0CkBAIC0wLDAgKzEsOTggQEAKKwlOT0VYRUMgYW5kIE5PRk9SSyBhcHBsZXRzLgorCitVbml4IHNoZWxscyB0cmFkaXRpb25hbGx5IGV4ZWN1dGUgc29tZSBjb21tYW5kcyBpbnRlcm5hbGx5IGluIHRoZSBhdHRlbXB0Cit0byBkcmFtYXRpY2FsbHkgc3BlZWQgdXAgZXhlY3V0aW9uLiBJdCB3aWxsIGJlIHNsb3cgYXMgaGVsbCBpZiBmb3IgZXZlcnkKKyJlY2hvIGJsYWgiIHNoZWxsIHdpbGwgZm9yayBhbmQgZXhlYyAvYmluL2VjaG8uIFRvIHRoaXMgZW5kLCBzaGVsbHMKK2hhdmUgdG8gX3JlaW1wbGVtZW50XyB0aGVzZSBjb21tYW5kcyBpbnRlcm5hbGx5LgorCitCdXN5Ym94IGlzIHVuaXF1ZSBpbiB0aGlzIHJlZ2FyZCBiZWNhdXNlIGl0IGFscmVhZHkgaXMgYSBjb2xsZWN0aW9uCitvZiByZWltcGxlbWVudGVkIFVuaXggY29tbWFuZHMsIGFuZCB3ZSBjYW4gZG8gdGhlIHNhbWUgdHJpY2sKK2ZvciBzcGVlZGluZyB1cCBidXN5Ym94IHNoZWxscywgYW5kIG1vcmUuIE5PRVhFQyBhbmQgTk9GT1JLIGFwcGxldHMKK2FyZSBleGFjdGx5IHRob3NlIGFwcGxldHMgd2hpY2ggYXJlIGVsaWdpYmxlIGZvciB0aGVzZSB0cmlja3MuCisKK0FwcGxldCB3aWxsIGJlIHN1YmplY3QgdG8gTk9GT1JLL05PRVhFQyB0cmlja3MgaWYgaXQgaXMgbWFya2VkIGFzIHN1Y2gKK2luIGFwcGxldHMuaC4gRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyBpcyBhIGNvbmZpZyBvcHRpb24gd2hpY2gKK2dsb2JhbGx5IGVuYWJsZXMgdXNhZ2Ugb2YgTk9GT1JLL05PRVhFQyB0cmlja3MuCitJZiBpdCBpcyBlbmFibGVkLCBGRUFUVVJFX1NIX1NUQU5EQUxPTkUgY2FuIGJlIGVuYWJsZWQgdG9vLAorYW5kIHRoZW4gc2hlbGxzIHdpbGwgdXNlIE5PRk9SSy9OT0VYRUMgdHJpY2tzIGZvciBvcmRpbmFyeSBjb21tYW5kcy4KK05COiBzaGVsbCBidWlsdGlucyB1c2UgdGhlc2UgdHJpY2tzIHJlZ2FyZGxlc3Mgb2YgRkVBVFVSRV9TSF9TVEFOREFMT05FCitvciBGRUFUVVJFX1BSRUZFUl9BUFBMRVRTLgorCitJbiBDLCBpZiB5b3Ugd2FudCB0byBjYWxsIGEgcHJvZ3JhbSBhbmQgd2FpdCBmb3IgaXQsIHVzZQorc3Bhd25fYW5kX3dhaXQoYXJndiksIEJCX0VYRUNWUChwcm9nLGFyZ3YpIG9yIEJCX0VYRUNMUChwcm9nLGFyZ3YwLC4uLikuCitUaGV5IGNoZWNrIHdoZXRoZXIgcHJvZ3JhbSBuYW1lIGlzIGFuIGFwcGxldCBuYW1lIGFuZCBvcHRpb25hbGx5CitkbyBOT0ZPUksvTk9FWEVDIHRoaW5nIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uLgorCisKKwlOT0VYRUMKKworTk9FWEVDIGFwcGxldCBzaG91bGQgd29yayBjb3JyZWN0bHkgaWYgYW5vdGhlciBhcHBsZXQgZm9ya3MgYW5kIHRoZW4KK2V4ZWN1dGVzIGV4aXQoPGFwcGxldD5fbWFpbihhcmdjLGFyZ3YpKSBpbiB0aGUgY2hpbGQuIFRoZSBydWxlcworcm91Z2hseSBhcmU6CisKKyogZG8gbm90IGV4cGVjdCBzaGFyZWQgZ2xvYmFsIHZhcmlhYmxlcy9idWZmZXJzIHRvIGJlIGluIHRoZWlyCisgICJpbml0aWFsaXplZCIgc3RhdGUuIEV4YW1wbGVzOiB4ZnVuY19lcnJvcl9yZXR2YWwgY2FuIGJlICE9IDEsCisgIGJiX2NvbW1vbl9idWZzaXoxIGNhbiBiZSBzY3JpYmJsZWQgb3ZlciwgLi4uCisqIGRvIG5vdCBleHBlY3QgdGhhdCBzdGRpbyB3YXNuJ3QgdXNlZCBiZWZvcmUuIENhbGxpbmcgc2V0W3ZdYnVmKCkKKyAgY2FuIGJlIGRpc2FzdHJvdXMuCisqIC4uLgorCitOT0VYRUMgYXBwbGV0cyBzYXZlIG9ubHkgb25lIGhhbGYgb2YgZm9yaytleGVjIG92ZXJoZWFkLgorTk9FWEVDIHRyaWNrIGlzIGRpc2FibGVkIGZvciBOT01NVSBidWlsZC4KKworCisJTk9GT1JLCisKK05PRk9SSyBhcHBsZXQgc2hvdWxkIHdvcmsgY29ycmVjdGx5IGlmIGFub3RoZXIgYXBwbGV0IHNpbXBseSBydW5zCis8YXBwbGV0Pl9tYWluKGFyZ2MsYXJndikgYW5kIHRoZW4gY29udGludWVzIHdpdGggaXRzIGJ1c2luZXNzLgoreGFyZ3MsIGZpbmQsIHNoZWxscyBkbyBpdCAoZ3JlcCBmb3IgInNwYXduX2FuZF93YWl0IiBhbmQKKyJydW5fbm9mb3JrX2FwcGxldCIgdG8gZmluZCBtb3JlIHVzZXJzKS4KKworVGhpcyBwb3NlcyBtdWNoIG1vcmUgc2VyaW91cyBsaW1pdGF0aW9ucyBvbiB3aGF0IGFwcGxldCBjYW4gZG86CisKKyogYWxsIE5PRVhFQyBsaW1pdGF0aW9ucyBhcHBseS4KKyogZG8gbm90IGV2ZXIgZXhpdCgpIG9yIGV4ZWMoKS4KKyAgLSB4ZnVuY3MgYXJlIG9rYXkuIFRoZXkgYXJlIHVzaW5nIHNwZWNpYWwgdHJpY2sgdG8gcmV0dXJuCisgICAgdG8gdGhlIGNhbGxlciBhcHBsZXQgaW5zdGVhZCBvZiBkeWluZyB3aGVuIHRoZXkgZGV0ZWN0ICJ4IiBjb25kaXRpb24uCisgIC0geW91IG1heSAiZXhpdCIgdG8gY2FsbGVyIGFwcGxldCBieSBjYWxsaW5nIHhmdW5jX2RpZSgpLiBSZXR1cm4gdmFsdWUKKyAgICBpcyB0YWtlbiBmcm9tIHhmdW5jX2Vycm9yX3JldHZhbC4KKyAgLSBmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KG4pIGlzIG9rIHRvIHVzZS4KKyogZG8gbm90IHVzZSBzaGFyZWQgZ2xvYmFsIGRhdGEsIG9yIHNhdmUvcmVzdG9yZSBzaGFyZWQgZ2xvYmFsIGRhdGEKKyAgKGUuZy4gYmJfY29tbW9uX2J1ZnNpejEpIHByaW9yIHRvIHJldHVybmluZy4KKyAgLSBnZXRvcHQzMigpIGlzIG9rIHRvIHVzZS4gWW91IGRvIG5vdCBuZWVkIHRvIHNhdmUvcmVzdG9yZSBvcHRpb25fbWFzazMyLAorICAgIGl0IGlzIGFscmVhZHkgZG9uZSBieSBjb3JlIGNvZGUuCisqIGlmIHlvdSBhbGxvY2F0ZSBtZW1vcnksIHlvdSBjYW4gdXNlIHhtYWxsb2MoKSBvbmx5IG9uIHRoZSB2ZXJ5IGZpcnN0CisgIGFsbG9jYXRpb24uIEFsbCBvdGhlciBhbGxvY2F0aW9ucyBzaG91bGQgdXNlIG1hbGxvY1tfb3Jfd2Fybl0oKS4KKyAgQWZ0ZXIgZmlyc3QgYWxsb2NhdGlvbiwgeW91IGNhbm5vdCB1c2UgYW55IHhmdW5jcy4KKyAgT3RoZXJ3aXNlLCBmYWlsaW5nIHhmdW5jIHdpbGwgcmV0dXJuIHRvIGNhbGxlciBhcHBsZXQKKyAgd2l0aG91dCBmcmVlaW5nIG1hbGxvY2VkIGRhdGEhCisqIEFsbCBhbGxvY2F0ZWQgZGF0YSwgb3BlbmVkIGZpbGVzLCBzaWduYWwgaGFuZGxlcnMsIHRlcm1pb3Mgc2V0dGluZ3MsCisgIE9fTk9OQkxPQ0sgZmxhZ3MgZXRjIHNob3VsZCBiZSBmcmVlZC9jbG9zZWQvcmVzdG9yZWQgcHJpb3IgdG8gcmV0dXJuLgorKiAuLi4KKworTk9GT1JLIGFwcGxldHMgZ2l2ZSB0aGUgbW9zdCBvZiBzcGVlZCBhZHZhbnRhZ2UsIGJ1dCBhcmUgdHJpY2tpZXN0Cit0byBpbXBsZW1lbnQuIEluIG9yZGVyIHRvIG1pbmltaXplIGFtb3VudCBvZiBidWdzIGFuZCBtYWludGVuYW5jZSwKK3ByaW1lIGNhbmRpZGF0ZXMgZm9yIE5PRk9SSy1pZmljYXRpb24gYXJlIHRob3NlIGFwcGxldHMgd2hpY2gKK2FyZSBzbWFsbCBhbmQgZWFzeSB0byBhdWRpdCwgYW5kIHRob3NlIHdoaWNoIGFyZSBtb3JlIGxpa2VseSB0byBiZQorZnJlcXVlbnRseSBleGVjdXRlZCBmcm9tIHNoZWxsL2ZpbmQveGFyZ3MsIHBhcnRpY3VsYXJseSBpbiBzaGVsbAorc2NyaXB0IGxvb3BzLiBBcHBsZXRzIHdoaWNoIG1lc3Mgd2l0aCBzaWduYWwgaGFuZGxlcnMsIHRlcm1pb3MgZXRjCithcmUgcHJvYmFibHkgbm90IHdvcnRoIHRoZSBlZmZvcnQuCisKK0FueSBOT0ZPUksgYXBwbGV0IGlzIGFsc28gYSBOT0VYRUMgYXBwbGV0LgorCisKKwlSZWxldmFudCBDT05GSUcgb3B0aW9ucworCitGRUFUVVJFX1BSRUZFUl9BUFBMRVRTCisgIEJCX0VYRUNWUChjbWQsIGFyZ3YpIHdpbGwgdHJ5IHRvIGV4ZWMgL3Byb2Mvc2VsZi9leGUKKyAgICBpZiBjb21tYW5kJ3MgbmFtZSBtYXRjaGVzIHNvbWUgYXBwbGV0IG5hbWUKKyAgYXBwbGV0IHRhYmxlcyB3aWxsIGNvbnRhaW4gTk9GT1JLL05PRVhFQyBiaXRzCisgIHNwYXduX2FuZF93YWl0KGFyZ3YpIHdpbGwgZG8gTk9GT1JLL05PRVhFQyB0cmlja3MKKworRkVBVFVSRV9TSF9TVEFOREFMT05FIChuZWVkcyBGRUFUVVJFX1BSRUZFUl9BUFBMRVRTPXkpCisgIHNoZWxscyB3aWxsIHRyeSB0byBleGVjIC9wcm9jL3NlbGYvZXhlIGlmIGNvbW1hbmQncyBuYW1lIG1hdGNoZXMKKyAgICBzb21lIGFwcGxldCBuYW1lCisgIHNoZWxscyB3aWxsIGRvIE5PRVhFQyB0cmljayBvbiBOT0VYRUMgYXBwbGV0cworCitGRUFUVVJFX1NIX05PRk9SSyAobmVlZHMgRkVBVFVSRV9QUkVGRVJfQVBQTEVUUz15KQorICBzaGVsbHMgd2lsbCBkbyBOT0ZPUksgdHJpY2sgb24gTk9GT1JLIGFwcGxldHMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2RvY3MvcG9zaXhfY29uZm9ybWFuY2UudHh0IGIvYnVzeWJveC0xLjE5LjMvZG9jcy9wb3NpeF9jb25mb3JtYW5jZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MTZkNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2RvY3MvcG9zaXhfY29uZm9ybWFuY2UudHh0CkBAIC0wLDAgKzEsNzQxIEBACisKK0J1c3lib3ggUE9TSVggY29uZm9ybWFuY2UgdGFibGUKKworU2VlIFBPU0lYIGRvY3VtZW50YXRpb24gKDEwMDMuMS0yMDA4KSBoZXJlOgoraHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS8KK0FuZCB0aGUgY29tcGxldGUgbGlzdCBvZiBhbGwgdXRpbGl0aWVzIHRoYXQgUE9TSVggY292ZXJzOgoraHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS9pZHgvdXRpbGl0aWVzLmh0bWwKKworVGhpcyBsaXN0aW5nIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYW5kIGN1cnJlbnRseSBvbmx5IGNvdmVycwordG9vbCBvcHRpb25zIChub3Qgb3BlcmFuZHMsIGVudmlyb25tZW50IHZhcmlhYmxlcywgcmV0dXJuIGNvZGVzLCBldGMuLikuCitGb3IgZWFjaCBvcHRpb24gaXQgaXMgc2V0IGlmIGl0IChhKSBleGlzdHMgYW5kIChiKSBjb21wbGlhbnQgdG8gUE9TSVggMjAwOC4KK1NvbWUgb3B0aW9ucyBleGlzdCBidXQgdGhlcmUgaXMgbm8gdmFsdWUgaW4gdGhlICdjb21wbGlhbnQnIGNvbHVtbjogdGhhdAorbWVhbnMgbm8gb25lIGhhcyB5ZXQgYm90aGVyZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG9wdGlvbiBkb2VzIHdoYXQgaXQgaXMKK3JlcXVpcmVkIHRvIGRvLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQT1NJWCBUb29scyBzdXBwb3J0ZWQgb25seSBhcyBzaGVsbCBidWlsdC1pbnMgKGFzaCBzaGVsbCk6CisgIGFsaWFzLCBiZywgY2QsIGZnLCBnZXRvcHRzLCBoYXNoLCBqb2JzLCByZWFkLCB0eXBlLCB1bWFzaywgdWxpbWl0LAorICB1bmFsaWFzLCB3YWl0LCB3cml0ZQorCitQT1NJWCBUb29scyBub3Qgc3VwcG9ydGVkOgorICBhc2EsIGF0LCBiYXRjaCwgYmMsIGM5OSwgY29tbWFuZCwgY29tcHJlc3MsIGNzcGxpdCwgZXgsIGZjLCBmaWxlLAorICBnZW5jYXQsIGdldGNvbmYsIGljb252LCBqb2luLCBsaW5rLCBsb2NhbGUsIGxvY2FsZWRlZiwgbHAsIG00LAorICBtYWlseCwgbmV3Z3JwLCBubCwgcGFzdGUsIHBhdGhjaGssIHBheCwgcHIsIHFhbHRlciwgcWRlbCwgcWhvbGQsIHFtb3ZlLAorICBxbXNnLCBxcmVydW4sIHFybHMsIHFzZWxlY3QsIHFzaWcsIHFzdGF0LCBxc3ViLCB0YWJzLCB0YWxrLCB0cHV0LAorICB0c29ydCwgdW5saW5rLCB1dWNwLCB1dXN0YXQsIHV1eAorCitQT1NJWCBUb29scyBub3Qgc3VwcG9ydGVkIChERVZFTE9QTUVOVCk6CisgIGFkbWluLCBjZmxvdywgY3RhZ3MsIGN4cmVmLCBkZWx0YSwgZm9ydDc3LCBnZXQsIGxleCwgbWFrZSwgbm0sIHBycywgcm1kZWwsCisgIHNhY3QsIHNjY3MsIHN0cmlwLCB1bmdldCwgdmFsLCB3aGF0LCB5YWNjCisKKworUE9TSVggVG9vbHMgc3VwcG9ydGVkOgorCitOb3RlOiBlY2hvLCBwcmludGYsIGtpbGwsIHB3ZCBkb2N1bWVudGVkIGhlcmUgYXMgc3RhbmQtYWxvbmUgYXBwbGV0cywKKyAgICAgIG5vdCBhcyBhc2ggYnVpbHQtaW5zLgorCisKK2FyIFBPU0lYIG9wdGlvbnMgKioqKioqKioqKioqKioqKioqKioqIEZhaWxlZCB0byByZWNvZ25pemUgemlwICYgdGFyIChkaWQgbm90IGNvbXBhcmUgdG8gcmVndWxhciBhcikKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtQyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtVCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtaSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtcSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtciAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdiAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAteCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorYXIgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtbworCithd2sgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1GIEVSRSAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1mIHByb2dmaWxlICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC12IGFzc2lnbm1lbnQgICB8ICB5ZXMgICB8ICAgICAgICAgICB8Cithd2sgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK2Jhc2VuYW1lIFBPU0lYIG9wdGlvbnM6IE5vbmUKK2Jhc2VuYW1lIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitjYWwgUE9TSVggb3B0aW9uczogTm9uZQorY2FsIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLXksIC1qCisKK2NhdCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLXUgICAgICAgICAgICAgIHwgIHllcyAgIHwgbm8gICAgICAgIHwgb3B0aW9uIGlzIGlnbm9yZWQKK2NhdCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworY2hncnAgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1IICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1MICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1QICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1SICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1oICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CitjaGdycCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1mLCAtYywgLXYKKworY2htb2QgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1SICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitjaG1vZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1mLCAtdiwgLWMKKworY2hvd24gUE9TSVggb3B0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtSCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfCBJdCBzZWVtcyBsaWtlIGFsbCBmbGFncyBhcmUgc3VwcG9ydGVkIChhY2NvcmRpbmcgdG8gcHJpbnRvdXQpLCBidXQKKyAgLUwgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwgIGl0IGZhaWxzIHRvIHdvcmsgb24gbXkgbWFjaGluZQorICAtUCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtUiAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtaCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorY2hvd24gQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtZiwgLWMsIC12CisKK2Nrc3VtIFBPU0lYIG9wdGlvbnM6IE5vbmUKK2Nrc3VtIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitjbXAgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1sICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitjbXAgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorCisKK2NvbW0gUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC0xICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC0yICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC0zICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8Citjb21tIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitjcCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUggICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLUwgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLVAgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLVIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWYgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXAgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK2NwIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLWQsIC1hLCAtcywgLWMsIC1yLCAtbAorCitjcm9udGFiIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtZSAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtbCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtciAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorY3JvbnRhYiBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC11LCAtYworCitjdXQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1iIGxpc3QgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1jIGxpc3QgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1kIGRlbGltICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1mIGxpc3QgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1uICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitjdXQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK2RhdGUgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC11ICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitkYXRlIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLUlbU1BFQ10sIC1kIFRJTUUsIC1yIEZJTEUsIC1SLCAtRCBGTVQKKworZGQgUE9TSVggb3B0aW9uczoKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICBpZiAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBvZiAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBpYnMgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBvYnMgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBicyAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBjYnMgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBza2lwICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBzZWVrICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBjb3VudCAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBjb252PWFzY2lpICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBjb252PWViY2RpYyAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBjb252PWlibSAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBjb252PWJsb2NrICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBjb252PXVuYmxvY2sgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBjb252PWxjYXNlICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBjb252PXVjYXNlICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBjb252PXN3YXAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICBjb252PW5vZXJyb3IgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBjb252PW5vdHJ1bmMgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICBjb252PXN5bmMgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorZGQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorIGNvbnY9ZnN5bmMKKworZGYgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1QICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1rICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC10ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitkZiBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1hLCAtbSwgLUIgU0laRSwgLWksIC1oCitSZW1hcms6CistIEl0IHNlZW1zIHRoYXQgR05VIGRmIGRvZXMgbm90IHJvdW5kIHBlcmNlbnRzIHVwIGluIGl0cyBvdXRwdXQgKHRodXMgaXRzIHJlc3VsdHMgYXJlIGEgYml0IGRpZmZlcmVudCkKKworZGlmZiBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUMgbiAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLVUgbiAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWIgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWUgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWYgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXIgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXUgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK2RpZmYgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtZCwgLWEsIC1zLCAtdCwgLUwsIC1OLCAtaSwgLVQsIC13LCAtcSwgLVMKKworZGlybmFtZSBQT1NJWCBvcHRpb25zOiBOb25lCitkaXJuYW1lIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitkdSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUggICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLUwgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWEgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWsgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXggICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKK2R1IEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLWMsIC1tLCAtaCwgLWQgTiwgLWwKKworCitlY2hvIFBPU0lYIG9wdGlvbnM6IE5vbmUKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtbiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfCBUaGUgcmVzdWx0IG9mIC1uIGlzICJpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIgorZWNobyBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1lLCAtRQorCitlZCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLXAgc3RyaW5nICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK2VkIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitlbnYgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1pICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitlbnYgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtdSwgLSwgIC1pCisKK2V4cGFuZCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLXQgdGFibGlzdCAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK2V4cGFuZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC0tdGFicz1OLCAtaSwgLS1pbml0aWFsCisKK2V4cHIgUE9TSVggb3BlcmF0aW9uczoKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICB8ICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICAmICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICA9ICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICA+ICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICA+PSAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICA8PSAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICA8ICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICAhPSAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICArICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICAtICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICAqICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICAvICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICAlICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICA6ICAgICAgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICAoZXhwcikgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICBpbnRlZ2VyICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorICBzdHJpbmcgICAgICAgICAgfCAgeWVzICAgfCAgeWVzICAgICAgfAorZXhwciBCdXN5Ym94IHNwZWNpZmljIG9wZXJhdGlvbnM6CisgIG1hdGNoLCBzdWJzdHIsIGluZGV4LCBsZW5ndGgsIHF1b3RlCisKK2ZhbHNlIFBPU0lYIG9wdGlvbnM6IE5vbmUKK2ZhbHNlIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitmaW5kIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtSCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtTCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorZmluZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1ncm91cCBOQU1FLCAtbXRpbWUgREFZUywgLXByaW50LCAtbWF4ZGVwdGggTiwgLWV4ZWMgQ01EIEFSRyA7LCAtbmV3ZXIgRklMRSwgLWNvbnRleHQsIC1pbmFtZSBQQVRURVJOLCAtZm9sbG93LCAtZGVwdGgsIC14ZGV2LCAtaW51bSBOLCAtdHlwZSBYLCAtcHJpbnQwLCAtbWluZGVwdGggTiwgLW1taW4gTUlOUywgLXJlZ2V4IFBBVFRFUk4sIC1wcnVuZSwgLXBhdGggUEFUVEVSTiwgLXVzZXIgTkFNRSwgLWRlbGV0ZSwgLXBlcm0gTk5OLCAtbmFtZSBQQVRURVJOLCAtc2l6ZSBOW2Jja10KKworZm9sZCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXcgd2lkdGggICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK2ZvbGQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK2Z1c2VyIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorZnVzZXIgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtbSwgLWssIC00LCAtU0lHTkFMLCAtNiwgLXMKKworZ3JlcCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUUgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLUYgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWMgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWUgcGF0dGVybl9saXN0IHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWYgcGF0dGVybl9maWxlIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWwgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLW4gICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXEgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXYgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXggICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK2dyZXAgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtQSwgLUMsIC1CLCAtTCwgLUgsIC1vLCAtaCwgLXcsIC1yLCAteiwgLW0gTUFYCisKK2hlYWQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1uIG51bWJlciAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitoZWFkIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLXYsIC1jIE5VTSwgLXEKKworaWQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1HICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1nICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1uICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1yICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC11ICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitpZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1aCisKK2lwY3JtIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtTSBzaG1rZXkgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtUSBtc2drZXkgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtUyBzZW1rZXkgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbSBzaG1pZCAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcSBtc2dpZCAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcyBzZW1pZCAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAoraXBjcm0gQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtbU0sIC1xUSwgLXNTCisKK2lwY3MgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1hICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1iICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1jICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1tICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1vICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1wICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1xICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC10ICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CitpcGNzIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLWwsIC1pLCAtdQorCitraWxsIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtbCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyBzaWduYWxfbmFtZSAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtc2lnbmFsX25hbWUgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtc2lnbmFsX251bWJlciAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAora2lsbCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgICAtcSwgLW8KKworbG4gUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1MICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1QICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1mICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitsbiBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1TIHN1ZiwgLW4sIC1iCisKK2xvZ2dlciBQT1NJWCBvcHRpb25zOiBOb25lCitsb2dnZXIgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtcCBQUklPLCAtdCBUQUcsIC1zCisKK2xvZ25hbWUgUE9TSVggb3B0aW9uczogTm9uZQorbG9nbmFtZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworbHMgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC0xICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1BICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1DICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1GICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8IEFuZCBtb3JlOiAnPScgZm9yIHNvY2tldHMgKG5vdCBkZWZpbmVkIGJ5IFBPU0lYKQorICAtSCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtTCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfCBCdXQgY29sb3JpbmcgbWF5IGJlIHdyb25nIChhdCBsZWFzdCBQT1NJWCBkb2VzIG5vdCByZXF1aXJlIGNvcnJlY3QgY29sb3JzIDopICkKKyAgLVIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLVMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWEgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWMgICAgICAgICAgICAgIHwgIHllcyAgIHwgbm8gICAgICAgIHwgU29ydHMgb3V0cHV0IHdpdGggJy1sJyAoc2hvdWxkIG9ubHkgc2hvdyBjdGltZSB3aXRoICctbCcsIGFuZCBzb3J0IG9ubHkgd2l0aCAnLXQnKQorICAtZCAgICAgICAgICAgICAgfCAgeWVzICAgfCBubyAgICAgICAgfCBXaGVuIGludm9rZWQgdG9nZXRoZXIgd2l0aCAnLUwnIHNob3VsZCByZWFkIHN5bWJvbGljIGxpbmtzLCBhbmQgZG9lc24ndAorICAtZiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtaSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtayAgICAgICAgICAgICAgfCAgeWVzICAgfCBubyAgICAgICAgfCBEb2VzIHNvbWV0aGluZyBjb21wbGV0ZWx5IHVucmVsYXRlZCEgKExpc3RzIHNlY3VyaXR5IGNvbnRleHQgaW5zdGVhZCBvZiBzcGVjaWZ5aW5nIGJsb2NrIHNpemUpCisgIC1sICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1tICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1uICAgICAgICAgICAgICB8ICB5ZXMgICB8IG5vICAgICAgICB8IFdvcmtzIGNvcnJlY3RseSBvbmx5IHRvZ2V0aGVyIHdpdGggJy1sJyAoYnV0IFBPU0lYIHJlcXVpcmVzICctbCcgdG8gYmUgaW1wbGljaXRseSBhc3N1bWVkKQorICAtbyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtciAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAteCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorbHMgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtLWNvbG9yLCAtVCBOVU0sIC1LLCAtWCwgLVosIC1lLCAtaCwgLXYsIC13IE5VTQorCittYW4gUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1rICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CittYW4gQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtYSAgICAgIERpc3BsYXkgYWxsIHBhZ2VzCisKKworbWVzZyBQT1NJWCBvcHRpb25zOiBOb25lCittZXNnIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitta2RpciBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLW0gbW9kZSAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXAgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK21rZGlyIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLVoKKworbWtmaWZvIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtbSBtb2RlICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorbWtmaWZvIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLVoKKworbW9yZSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWUgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLW4gbnVtYmVyICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXAgY29tbWFuZCAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXQgdGFnc3RyaW5nICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXUgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK21vcmUgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK212IFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtZiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtaSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorbXYgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK25pY2UgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1uIGluY3JlbWVudCAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CituaWNlIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitub2h1cCBQT1NJWCBvcHRpb25zOiBOb25lCitub2h1cCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworb2QgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1BIGFkZHJlc3NfYmFzZSB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1OIGNvdW50ICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1iICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1jICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1kICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1qIHNraXAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1vICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC10IHR5cGVfc3RyaW5nICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC12ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC14ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitvZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworcGF0Y2ggUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1EIGRlZmluZSAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1OICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1SICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1iICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1jICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1kIGRpciAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1lICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1pIHBhdGNoZmlsZSAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1sICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1uICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1vIG91dGZpbGUgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1wIG51bSAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1yIHJlamVjdGZpbGUgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC11ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitwYXRjaCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworcHJpbnRmIFBPU0lYIG9wdGlvbnM6IE5vbmUKK3ByaW50ZiBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworcHMgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1BICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1HIGdyb3VwbGlzdCAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1VIHVzZXJsaXN0ICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1hICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1kICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1lICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1mICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1nIGdyb3VwbGlzdCAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1sICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1uIG5hbWVsaXN0ICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1vIGZvcm1hdCAgICAgICB8ICB5ZXMgICB8IG5vICAgICAgICB8IG5vdCBzdXBwb3J0ZWQ6IHJ1c2VyLCBncm91cCwgcmdyb3VwLCBwY3B1CisgIC1wIHByb2NsaXN0ICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC10IHRlcm1saXN0ICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC11IHVzZXJsaXN0ICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitwcyBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworcHdkIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtTCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtUCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorcHdkIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCityZW5pY2UgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1nICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1uIGluY3JlbWVudCAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8IE5vdGUgUE9TSVggYWxsb3dzIG9ubHkgdG8gcnVuIHdpdGggdGhpcyBvcHRpb24gKGJ1c3lib3ggYWxzbyBhbGxvd3MgdG8gcnVuIHdpdGhvdXQgJy1uJyBhbmQgc2V0IG5pY2VuZXNzIGRpcmVjdGx5KQorICAtcCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorcmVuaWNlIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitybSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLVIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWYgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3JtIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitybWRpciBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLXAgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3JtZGlyIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLS1wYXJlbnRzCisKK3NlZCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWUgc2NyaXB0ICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWYgc2NyaXB0X2ZpbGUgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLW4gICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKK3NlZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1pLCAtcgorCitzaCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK3NoIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitzbGVlcCBQT1NJWCBvcHRpb25zOiBOb25lCitzbGVlcCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworc29ydCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWQgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWYgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwgQnV0IGlzIG5vdCBsaWtlIEdOVSBzb3J0LCB3aGljaCBpc24ndCEgKHRyeSB0byBzb3J0ICdhXG5BXG5CXG5iJyB3aXRoIGFuZCB3aXRob3V0IC1mKQorICAtayBrZXlkZWYgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtbSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbyBvdXRwdXQgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtciAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdCBjaGFyICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorc29ydCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1tU1QsIC1nLCAtTSwgLXMsIC16CisKK3NwbGl0IFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYSBzdWZmaXhfbGVuZ3RoIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWIgbiAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWIgbmsgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWIgbm0gICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWwgbGluZV9jb3VudCAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3NwbGl0IEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitzdHJpbmdzIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbiBudW1iZXIgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdCBmb3JtYXQgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorc3RyaW5ncyBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1vLCAtZgorCitzdHR5IFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorc3R0eSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1GIERFVklDRQorCit0YWlsIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYyBudW1iZXIgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbiBudW1iZXIgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAordGFpbCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC12LCAtcSwgLXMgU0VDCisKK3RlZSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWEgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3RlZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKwordGVzdCBQT1NJWCBvcHRpb25zOiBOb25lCit0ZXN0IEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCit0aW1lIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtcCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAordGltZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC12CisKK3RvdWNoIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZCBkYXRlX3RpbWUgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtciByZWZfZmlsZSAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdCB0aW1lICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAordG91Y2ggQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3RyIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtQyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAordHIgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3RydWUgUE9TSVggb3B0aW9uczogTm9uZQordHJ1ZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKwordHR5IFBPU0lYIG9wdGlvbnM6IE5vbmUKK3R0eSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1zCisKK3VuYW1lIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtciAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAordW5hbWUgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtcAorCit1bmNvbXByZXNzIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAordW5jb21wcmVzcyBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKwordW5leHBhbmQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1hICAgICAgICAgICAgICB8ICB5ZXMgICB8IG5vICAgICAgICB8IFBPU0lYIHJlcXVpcmVzIGNvbnZlcnRpbmcgdHdvIG9yIG1vcmUgc3BhY2VzIHRvIHRhYnMsIGJ1c3lib3ggY29udmVydHMgb25lIG9yIG1vcmUgc3BhY2VzCisgIC10IHRhYmxpc3QgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8Cit1bmV4cGFuZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC0tdGFicz1OLCAtZiwgLS1maXJzdC1vbmx5LCAtLWFsbAorCit1bmlxIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZiBmaWVsZHMgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyBjaGFycyAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAordW5pcSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC13IE4KKwordXVkZWNvZGUgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1vIG91dGZpbGUgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8Cit1dWRlY29kZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKwordXVlbmNvZGUgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1tICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8Cit1dWVuY29kZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKwordmkgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1SICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1jIGNvbW1hbmQgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1yICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC10IHRhZ3N0cmluZyAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC13IHNpemUgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8Cit2aSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1ICisKK3djIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAord2MgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtTAorCit3aG8gUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1IICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1UICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1hICAgICAgICAgICAgICB8ICB5ZXMgICB8IG5vICAgICAgICB8IGp1c3Qgc2hvd3MgYWxsCisgIC1iICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1kICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1sICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1tICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1wICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1xICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1yICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC10ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC11ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8Cit3aG8gQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3hhcmdzIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtRSBlb2ZzdHIgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtSSByZXBsc3RyICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtTCBudW1iZXIgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbiBudW1iZXIgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyBzaXplICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAteCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAoreGFyZ3MgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtZVtTVFJdLCAtMCwgLXIKKworemNhdCBQT1NJWCBvcHRpb25zOiBOb25lCit6Y2F0IEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZG9jcy9zaWdpbnQuaHRtIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9zaWdpbnQuaHRtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzBmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL3NpZ2ludC5odG0KQEAgLTAsMCArMSw2MjcgQEAKKzxIVE1MPgorPEhFQUQ+Cis8bGluayByZWw9IlNIT1JUQ1VUIElDT04iIGhyZWY9Imh0dHA6Ly93d3cuY29ucy5vcmcvZmF2aWNvbi5pY28iPgorPFRJVExFPlByb3BlciBoYW5kbGluZyBvZiBTSUdJTlQvU0lHUVVJVCBbaHR0cDovL3d3dy5jb25zLm9yZy9jcmFjYXVlci9zaWdpbnQuaHRtbF08L1RJVExFPgorPCEtLSBDcmVhdGVkIGJ5OiBHTlUgbTQgdXNpbmcgJFJldmlzaW9uOiAxLjIwICQgb2YgY3Jhd3d3Lm00bGliIG9uIDExLUZlYi0yMDA1IC0tPgorPEJPRFkgQkdDT0xPUj0iI2ZmZjhlMSI+Cis8Q0VOVEVSPjxIMj5Qcm9wZXIgaGFuZGxpbmcgb2YgU0lHSU5UL1NJR1FVSVQ8L0gyPjwvQ0VOVEVSPgorPGltZyBzcmM9bGluaWUucG5nIHdpZHRoPSIxMDAlIiBhbHQ9IiAiPgorPFA+CisKKzx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz00PgorPHRyPjx0aCB2YWxpZ249dG9wIGFsaWduPWxlZnQ+QWJzdHJhY3Q6IDwvdGg+Cis8dGQgdmFsaWduPXRvcCBhbGlnbj1sZWZ0PgorSW4gVU5JWCB0ZXJtaW5hbCBzZXNzaW9ucywgeW91IHVzdWFsbHkgaGF2ZSBhIGtleSBsaWtlCis8Y29kZT5DLWM8L2NvZGU+IChDb250cm9sLUMpIHRvIGltbWVkaWF0ZWx5IGVuZCB3aGF0ZXZlciBwcm9ncmFtIHlvdQoraGF2ZSBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kLiBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gd2hlbiB0aGUgcHJvZ3JhbQoreW91IGNhbGxlZCBoYXMgY2FsbGVkIG90aGVyIHByb2dyYW1zIGluIHR1cm4uIEV2ZXJ5dGhpbmcgc2hvdWxkIGJlCithYm9ydGVkLCBnaXZpbmcgeW91IHlvdXIgY29tbWFuZCBwcm9tcHQgYmFjaywgbm8gbWF0dGVyIGhvdyBkZWVwIHRoZQorY2FsbCBzdGFjayBpcy4KKworPHA+QmFzaWNhbGx5LCBpdCdzIHRyaXZpYWwuIEJ1dCB0aGUgZXhpc3RlbmNlIG9mIGludGVyYWN0aXZlCithcHBsaWNhdGlvbnMgdGhhdCB1c2UgU0lHSU5UIGFuZC9vciBTSUdRVUlUIGZvciBvdGhlciBwdXJwb3NlcyB0aGFuIGEKK2NvbXBsZXRlIGltbWVkaWF0ZSBhYm9ydCBtYWtlIG1hdHRlcnMgY29tcGxpY2F0ZWQsIGFuZCAtIGFzIHdhcyB0bworZXhwZWN0IC0gbGVmdCB1cyB3aXRoIHNldmVyYWwgd2F5cyB0byBzb2x2ZSB0aGUgcHJvYmxlbXMuIE9mIGNvdXJzZSwKK2V4aXN0aW5nIHNoZWxscyBhbmQgYXBwbGljYXRpb25zIGZvbGxvdyBkaWZmZXJlbnQgd2F5cy4KKworPFA+VGhpcyBXZWIgcGFnZXMgb3V0bGluZXMgZGlmZmVyZW50IHdheXMgdG8gc29sdmUgdGhlIHByb2JsZW0gYW5kCithcmd1ZXMgdGhhdCBvbmx5IG9uZSBvZiB0aGVtIGNhbiBkbyBldmVyeXRoaW5nIHJpZ2h0LCBhbHRob3VnaCBpdAorbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIGZpeCBzb21lIGV4aXN0aW5nIHNvZnR3YXJlLgorCisKKworPC90ZD48L3RyPjx0cj48dGggdmFsaWduPXRvcCBhbGlnbj1sZWZ0PkludGVuZGVkIGF1ZGllbmNlOiA8L3RoPgorPHRkIHZhbGlnbj10b3AgYWxpZ249bGVmdD5Qcm9ncmFtbWVycyB3aG8gaW1wbGVtZW50IHByb2dyYW1zIHRoYXQgY2F0Y2ggU0lHSU5UL1NJR1FVSVQuCis8QlI+UHJvZ3JhbW1lcnMgd2hvIGltcGxlbWVudHMgc2hlbGxzIG9yIHNoZWxsLWxpa2UgcHJvZ3JhbXMgdGhhdAorZXhlY3V0ZSBiYXRjaGVzIG9mIHByb2dyYW1zLgorCis8cD5Vc2VycyB3aG8gaGF2ZSBwcm9ibGVtcyBwcm9ibGVtcyBnZXR0aW5nIHJpZCBvZiBydW5hd2F5IHNoZWxsCitzY3JpcHRzIHVzaW5nIDxjb2RlPkNvbnRyb2wtQzwvY29kZT4uIE9yIGhhdmUgaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zCit0aGF0IGRvbid0IGJlaGF2ZSByaWdodCB3aGVuIHNlbmRpbmcgU0lHSU5ULiBFeGFtcGxlcyBhcmUgZW1hY3MnZXMKK3RoYXQgZGllIG9uIENvbnRyb2wtZyBvciBzaGVsbHNjcmlwdCBzdGF0ZW1lbnRzIHRoYXQgc29tZXRpbWVzIGFyZQorZXhlY3V0ZWQgYW5kIHNvbWV0aW1lcyBub3QsIGFwcGFyZW50bHkgbm90IGRldGVybWluZWQgYnkgdGhlIHVzZXIncworaW50ZW50aW9uLgorCisKKzwvdGQ+PC90cj48dHI+PHRoIHZhbGlnbj10b3AgYWxpZ249bGVmdD5SZXF1aXJlZCBrbm93bGVkZ2U6IDwvdGg+Cis8dGQgdmFsaWduPXRvcCBhbGlnbj1sZWZ0PllvdSBoYXZlIHRvIGtub3cgd2hhdCBpdCBtZWFucyB0byBjYXRjaCBTSUdJTlQgb3IgU0lHUVVJVCBhbmQgaG93Citwcm9jZXNzZXMgYXJlIHdhaXRpbmcgZm9yIG90aGVyIHByb2Nlc3NlcyAoY2hpbGRzKSB0aGV5IHNwYXduZWQuCisKKworPC90ZD48L3RyPjwvdGFibGU+Cis8aW1nIHNyYz1saW5pZS5wbmcgd2lkdGg9IjEwMCUiIGFsdD0iICI+CisKKworPEgzPkJhc2ljIGNvbmNlcHRzPC9IMz4KKworV2hhdCB0ZWNobmljYWxseSBoYXBwZW5zIHdoZW4geW91IHByZXNzIENvbnRyb2wtQyBpcyB0aGF0IGFsbCBwcm9ncmFtcworcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZCBpbiB5b3VyIGN1cnJlbnQgdGVybWluYWwgKG9yIHZpcnR1YWwKK3Rlcm1pbmFsKSBnZXQgdGhlIHNpZ25hbCBTSUdJTlQgc2VudC4KKworPHA+WW91IG1heSBjaGFuZ2UgdGhlIGtleSB0aGF0IHRyaWdnZXJzIHRoZSBzaWduYWwgdXNpbmcKKzxjb2RlPnN0dHk8L2NvZGU+IGFuZCBydW5uaW5nIHByb2dyYW1zIG1heSByZW1hcCB0aGUgU0lHSU5ULXNlbmRpbmcKK2tleSBhdCBhbnkgdGltZSB0aGV5IGxpa2UsIHdpdGhvdXQgeW91ciBpbnRlcnZlbnRpb24gYW5kIHdpdGhvdXQKK2Fza2luZyB5b3UgZmlyc3QuCisKKzxwPlRoZSB1c3VhbCByZWFjdGlvbiBvZiBhIHJ1bm5pbmcgcHJvZ3JhbSB0byBTSUdJTlQgaXMgdG8gZXhpdC4KK0hvd2V2ZXIsIG5vdCBhbGwgcHJvZ3JhbSBkbyBhbiBleGl0IG9uIFNJR0lOVCwgcHJvZ3JhbXMgYXJlIGZyZWUgdG8KK3VzZSB0aGUgc2lnbmFsIGZvciBvdGhlciBhY3Rpb25zIG9yIHRvIGlnbm9yZSBpdCBhdCBhbGwuCisKKzxwPkFsbCBwcm9ncmFtcyBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kIHJlY2VpdmUgdGhlIHNpZ25hbC4gVGhpcyBtYXkKK2JlIGEgbmVzdGVkICJzdGFjayIgb2YgcHJvZ3JhbXM6IFlvdSBzdGFydGVkIGEgcHJvZ3JhbSB0aGF0IHN0YXJ0ZWQKK2Fub3RoZXIgYW5kIHRoZSBvdXRlciBpcyB3YWl0aW5nIGZvciB0aGUgaW5uZXIgdG8gZXhpdC4gVGhpcyBuZXN0aW5nCittYXkgYmUgYXJiaXRyYXJpbHkgZGVlcC4KKworPHA+VGhlIGlubmVybW9zdCBwcm9ncmFtIGlzIHRoZSBvbmUgdGhhdCBkZWNpZGVzIHdoYXQgdG8gZG8gb24gU0lHSU5ULgorSXQgbWF5IGV4aXQsIGRvIHNvbWV0aGluZyBlbHNlIG9yIGRvIG5vdGhpbmcuIFN0aWxsLCB3aGVuIHRoZSB1c2VyIGhpdAorU0lHSU5ULCBhbGwgdGhlIG91dGVyIHByb2dyYW1zIGFyZSBhd2FrZW4sIGdldCB0aGUgc2lnbmFsIGFuZCBtYXkKK3JlYWN0IG9uIGl0LgorCis8SDM+V2hhdCB3ZSB0cnkgdG8gYWNoaWV2ZTwvSDM+CisKK1RoZSBwcm9ibGVtIGlzIHdpdGggc2hlbGwgc2NyaXB0cyAob3Igc2ltaWxhciBwcm9ncmFtcyB0aGF0IGNhbGwKK3NldmVyYWwgc3VicHJvZ3JhbXMgb25lIGFmdGVyIGFub3RoZXIpLgorCis8cD5MZXQgdXMgY29uc2lkZXIgdGhlIG1vc3QgYmFzaWMgc2NyaXB0OgorPFBSRT4KKyMhIC9iaW4vc2gKK3Byb2dyYW0xCitwcm9ncmFtMgorPC9QUkU+CithbmQgdGhlIHVzdWFsIHJ1biBsb29rcyBsaWtlIHRoaXM6Cis8UFJFPgorJCBzaCBteXNjcmlwdAorW291dHB1dCBvZiBwcm9ncmFtMV0KK1tvdXRwdXQgb2YgcHJvZ3JhbTJdCiskCis8L1BSRT4KKworPHA+TGV0IHVzIGFzc3VtZSB0aGF0IGJvdGggcHJvZ3JhbXMgZG8gbm90aGluZyBzcGVjaWFsIG9uIFNJR0lOVCwgdGhleQoranVzdCBleGl0LgorCis8cD5Ob3cgaW1hZ2luZSB0aGUgdXNlciBoaXRzIEMtYyB3aGlsZSBhIHNoZWxsc2NyaXB0IGlzIGV4ZWN1dGluZyBpdHMKK2ZpcnN0IHByb2dyYW0uIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbXMgcmVjZWl2ZSBTSUdJTlQ6IHByb2dyYW0xIGFuZAorYWxzbyB0aGUgc2hlbGwgZXhlY3V0aW5nIHRoZSBzY3JpcHQuIHByb2dyYW0xIGV4aXRzLgorCis8cD5CdXQgd2hhdCBzaG91bGQgdGhlIHNoZWxsIGRvPyBJZiB3ZSBzYXkgdGhhdCBpdCBpcyBvbmx5IHRoZQoraW5uZXJtb3N0J3MgcHJvZ3JhbXMgYnVzaW5lc3MgdG8gcmVhY3Qgb24gU0lHSU5ULCB0aGUgc2hlbGwgd2lsbCBkbworbm90aGluZyBzcGVjaWFsIChub3QgZXhpdCkgYW5kIGl0IHdpbGwgY29udGludWUgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKK3NjcmlwdCBhbmQgcnVuIHByb2dyYW0yLiBCdXQgdGhpcyBpcyB3cm9uZzogVGhlIHVzZXIncyBpbnRlbnRpb24gaW4KK2hpdHRpbmcgQy1jIGlzIHRvIGFib3J0IHRoZSB3aG9sZSBzY3JpcHQsIHRvIGdldCBoaXMgcHJvbXB0IGJhY2suIElmCitoZSBoaXRzIEMtYyB3aGlsZSB0aGUgZmlyc3QgcHJvZ3JhbSBpcyBydW5uaW5nLCBoZSBkb2VzIG5vdCB3YW50Citwcm9ncmFtMiB0byBiZSBldmVuIHN0YXJ0ZWQuCisKKzxwPmhlcmUgaXMgd2hhdCB3b3VsZCBoYXBwZW4gaWYgdGhlIHNoZWxsIGRvZXNuJ3QgZG8gYW55dGhpbmc6Cis8UFJFPgorJCBzaCBteXNjcmlwdAorW2ZpcnN0IGhhbGYgb2YgcHJvZ3JhbTEncyBvdXRwdXRdCitDLWMgICBbdXNlcnMgcHJlc3NlcyBDLWNdCitbc2Vjb25kIGhhbGYgb2YgcHJvZ3JhbTEncyBvdXRwdXQgd2lsbCBub3QgYmUgZGlzcGxheWVkXQorW291dHB1dCBvZiBwcm9ncmFtMiB3aWxsIGFwcGVhcl0KKzwvUFJFPgorCisKKzxwPkNvbnNpZGVyIGEgbW9yZSBhbm5veWluZyBleGFtcGxlOgorPHByZT4KKyMhIC9iaW4vc2gKKyMgbGV0J3MgYXNzdW1lIHRoZXJlIGFyZSAzMDAgKi5kYXQgZmlsZXMKK2ZvciBmaWxlIGluICouZGF0IDsgZG8KKwlkYXQyYXNjaWkgJGRhdAorZG9uZQorPC9wcmU+CisKK0lmIHlvdXIgc2hlbGwgd291bGRuJ3QgZW5kIGlmIHRoZSB1c2VyIGhpdHMgPGNvZGU+Qy1jPC9jb2RlPiwKKzxjb2RlPkMtYzwvY29kZT4gd291bGQganVzdCBlbmQgPHN0cm9uZz5vbmU8L3N0cm9uZz4gZGF0MmFzY2lpIHJ1biBhbmQKK3RoZSBzY3JpcHQgd291bGQgY29udGludWUuIFRodXMsIHlvdSBoYWQgdG8gaGl0IDxjb2RlPkMtYzwvY29kZT4gdXAgdG8KKzMwMCB0aW1lcyB0byBlbmQgdGhpcyBzY3JpcHQuCisKKzxIMz5BbHRlcm5hdGl2ZXMgdG8gZG8gc288L0gzPgorCis8cD5UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGhhbmRsZSBhYm9ydGlvbiBvZiBzaGVsbCBzY3JpcHRzIHdoZW4KK1NJR0lOVCBpcyByZWNlaXZlZCB3aGlsZSBhIGZvcmVncm91bmQgY2hpbGQgcnVuczoKKworPG1lbnU+CisKKzxsaT5BcyBqdXN0IG91dGxpbmVkLCB0aGUgc2hlbGxzY3JpcHQgbWF5IGp1c3QgY29udGludWUsIGlnbm9yaW5nIHRoZQorZmFjdCB0aGF0IHRoZSB1c2VyIGhpdCA8Y29kZT5DLWM8L2NvZGU+LiBUaGF0IHdheSwgeW91ciBzaGVsbHNjcmlwdCAtCitpbmNsdWRpbmcgYW55IGxvb3BzIC0gd291bGQgY29udGludWUgYW5kIHlvdSBoYWQgbm8gY2hhbmNlIG9mIGFib3J0aW5nCitpdCBleGNlcHQgdXNpbmcgdGhlIGtpbGwgY29tbWFuZCBhZnRlciBmaW5kaW5nIG91dCB0aGUgb3V0ZXJtb3N0CitzaGVsbCdzIFBJRC4gVGhpcyAic29sdXRpb24iIHdpbGwgbm90IGJlIGRpc2N1c3NlZCBmdXJ0aGVyLCBhcyBpdCBpcworb2J2aW91c2x5IG5vdCBkZXNpcmFibGUuCisKKzxwPjxsaT5UaGUgc2hlbGwgaXRzZWxmIGV4aXRzIGltbWVkaWF0ZWx5IHdoZW4gaXQgcmVjZWl2ZXMgU0lHSU5ULiBOb3QKK29ubHkgdGhlIHByb2dyYW0gY2FsbGVkIHdpbGwgZXhpdCwgYnV0IHRoZSBjYWxsaW5nICh0aGUKK3NjcmlwdC1leGVjdXRpbmcpIHNoZWxsLiBUaGUgZmlyc3QgdmFyaWFudCBpcyB0byBleGl0IHRoZSBzaGVsbCAoYW5kCit0aGVyZWZvcmUgZGlzY29udGludWluZyBleGVjdXRpb24gb2YgdGhlIHNjcmlwdCkgaW1tZWRpYXRlbHksIHdoaWxlCit0aGUgYmFja2dyb3VuZCBwcm9ncmFtIG1heSBzdGlsbCBiZSBleGVjdXRpbmcgKHJlbWVtYmVyIHRoYXQgYWx0aG91Z2gKK3RoZSBzaGVsbCBpcyBqdXN0IHdhaXRpbmcgZm9yIHRoZSBjYWxsZWQgcHJvZ3JhbSB0byBleGl0LCBpdCBpcyB3b2tlbgordXAgYW5kIG1heSBhY3QpLiBJIHdpbGwgY2FsbCB0aGUgd2F5IG9mIGRvaW5nIHRoaW5ncyB0aGUgIklVRSIgKGZvcgorImltbWVkaWF0ZSB1bmNvbmRpdGlvbmFsIGV4aXQiKSBmb3IgdGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudC4KKworPHA+PGxpPkFzIGEgdmFyaWFudCBvZiB0aGUgZm9ybWVyLCB3aGVuIHRoZSBzaGVsbCByZWNlaXZlcyBTSUdJTlQKK3doaWxlIGl0IGlzIHdhaXRpbmcgZm9yIGEgY2hpbGQgdG8gZXhpdCwgdGhlIHNoZWxsIGRvZXMgbm90IGV4aXQKK2ltbWVkaWF0ZWx5LiBidXQgaXQgcmVtZW1iZXJzIHRoZSBmYWN0IHRoYXQgYSBTSUdJTlQgaGFwcGVuZWQuIEFmdGVyCit0aGUgY2FsbGVkIHByb2dyYW0gZXhpdHMgYW5kIHRoZSBzaGVsbCdzIHdhaXQgZW5kcywgdGhlIHNoZWxsIHdpbGwKK2V4aXQgaXRzZWxmIGFuZCBoZW5jZSBkaXNjb250aW51ZSB0aGUgc2NyaXB0LiBJIHdpbGwgY2FsbCB0aGUgd2F5IG9mCitkb2luZyB0aGluZ3MgdGhlICJXVUUiIChmb3IgIndhaXQgYW5kIHVuY29uZGl0aW9uYWwgZXhpdCIpIGZvciB0aGUKK3Jlc3Qgb2YgdGhpcyBkb2N1bWVudC4KKworPHA+PGxpPlRoZXJlIGlzIGFsc28gYSB3YXkgdGhhdCB0aGUgY2FsbGluZyBzaGVsbCBjYW4gdGVsbCB3aGV0aGVyIHRoZQorY2FsbGVkIHByb2dyYW0gZXhpdGVkIG9uIFNJR0lOVCBhbmQgaWYgaXQgaWdub3JlZCBTSUdJTlQgKG9yIHVzZWQgaXQKK2ZvciBvdGhlciBwdXJwb3NlcykuIEFzIGluIHRoZSA8c2w+V1VFPC9zbD4gd2F5LCB0aGUgc2hlbGwgd2FpdHMgZm9yCit0aGUgY2hpbGQgdG8gY29tcGxldGUuIEl0IGZpZ3VyZXMgd2hldGhlciB0aGUgcHJvZ3JhbSB3YXMgZW5kZWQgb24KK1NJR0lOVCBhbmQgaWYgc28sIGl0IGRpc2NvbnRpbnVlIHRoZSBzY3JpcHQuIElmIHRoZSBwcm9ncmFtIGRpZCBhbnkKK290aGVyIGV4aXQsIHRoZSBzY3JpcHQgd2lsbCBiZSBjb250aW51ZWQuIEkgd2lsbCBjYWxsIHRoZSB3YXkgb2YgZG9pbmcKK3RoaW5ncyB0aGUgIldDRSIgKGZvciAid2FpdCBhbmQgY29vcGVyYXRpdmUgZXhpdCIpIGZvciB0aGUgcmVzdCBvZgordGhpcyBkb2N1bWVudC4KKworPC9tZW51PgorCis8SDM+VGhlIHByb2JsZW08L0gzPgorCitPbiBmaXJzdCBzaWdodCwgYWxsIHRocmVlIHNvbHV0aW9ucyAoSVVFLCBXVUUgYW5kIFdDRSkgYWxsIHNlZW0gdG8gZG8KK3doYXQgd2Ugd2FudDogSWYgQy1jIGlzIGhpdCB3aGlsZSB0aGUgZmlyc3QgcHJvZ3JhbSBvZiB0aGUgc2hlbGwKK3NjcmlwdCBydW5zLCB0aGUgc2NyaXB0IGlzIGRpc2NvbnRpbnVlZC4gVGhlIHVzZXIgZ2V0cyBoaXMgcHJvbXB0IGJhY2sKK2ltbWVkaWF0ZWx5LiBTbyB3aGF0IGFyZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIHdheSBvZiBoYW5kbGluZworU0lHSU5UPworCis8cD5UaGVyZSBhcmUgcHJvZ3JhbXMgdGhhdCB1c2UgdGhlIHNpZ25hbCBTSUdJTlQgZm9yIG90aGVyIHB1cnBvc2VzCit0aGFuIGV4aXRpbmcuIFRoZXkgdXNlIGl0IGFzIGEgbm9ybWFsIGtleXN0cm9rZS4gVGhlIHVzZXIgaXMgZXhwZWN0ZWQKK3RvIHVzZSB0aGUga2V5IHRoYXQgc2VuZHMgU0lHSU5UIGR1cmluZyBhIHBlcmZlY3RseSBub3JtYWwgcHJvZ3JhbQorcnVuLiBBcyBhIHJlc3VsdCwgdGhlIHVzZXIgc2VuZHMgU0lHSU5UIGluIHNpdHVhdGlvbnMgd2hlcmUgaGUvc2hlCitkb2VzIG5vdCB3YW50IHRoZSBwcm9ncmFtIG9yIHRoZSBzY3JpcHQgdG8gZW5kLgorCis8cD5UaGUgcHJpbWFyeSBleGFtcGxlIGlzIHRoZSBlbWFjcyBlZGl0b3I6IEMtZyBkb2VzIHdoYXQgRVNDIGRvZXMgaW4KK290aGVyIGFwcGxpY2F0aW9uczogSXQgY2FuY2VscyBhIHBhcnRpYWxseSBleGVjdXRlZCBvciBwcmVwYXJlZAorb3BlcmF0aW9uLiBUZWNobmljYWxseSwgZW1hY3MgcmVtYXBzIHRoZSBrZXkgdGhhdCBzZW5kcyBTSUdJTlQgZnJvbQorQy1jIHRvIEMtZyBhbmQgY2F0Y2hlcyBTSUdJTlQuCisKKzxwPlJlbWVtYmVyIHRoYXQgdGhlIFNJR0lOVCBpcyBzZW50IHRvIGFsbCBwcm9ncmFtcyBydW5uaW5nIGluIHRoZQorZm9yZWdyb3VuZC4gSWYgZW1hY3MgaXMgZXhlY3V0aW5nIGZyb20gYSBzaGVsbCBzY3JpcHQsIGJvdGggZW1hY3MgYW5kCit0aGUgc2hlbGwgZ2V0IFNJR0lOVC4gZW1hY3MgaXMgdGhlIHByb2dyYW0gdGhhdCBkZWNpZGVzIHdoYXQgdG8gZG86CitFeGl0IG9uIFNJR0lOVCBvciBub3QuIGVtYWNzIGRlY2lkZXMgbm90IHRvIGV4aXQuIFRoZSBwcm9ibGVtIGFyaXNlcword2hlbiB0aGUgc2hlbGwgZHJhd3MgaXRzIG93biBjb25jbHVzaW9ucyBmcm9tIHJlY2VpdmluZyBTSUdJTlQgd2l0aG91dAorY29uc3VsdGluZyBlbWFjcyBmb3IgaXRzIG9waW5pb24uCisKKzxwPkNvbnNpZGVyIHRoaXMgc2NyaXB0OgorPFBSRT4KKyMhIC9iaW4vc2gKK2VtYWNzIC90bXAvZm9vCitjcCAvdG1wL2ZvbyAvaG9tZS91c2VyL21haWwvc2VudAorPC9QUkU+CisKKzxwPklmIEMtZyBpcyB1c2VkIGluIGVtYWNzLCBib3RoIHRoZSBzaGVsbCBhbmQgZW1hY3Mgd2lsbCByZWNlaXZlZAorU0lHSU5ULiBFbWFjcyB3aWxsIG5vdCBleGl0LCB0aGUgdXNlciB1c2VkIEMtZyBhcyBhIG5vcm1hbCBlZGl0aW5nCitrZXlzdHJva2UsIGhlL3NoZSBkb2VzIG5vdCB3YW50IHRoZSBzY3JpcHQgdG8gYmUgYWJvcnRlZCBvbiBDLWcuCisKKzxwPlRoZSBjZW50cmFsIHByb2JsZW0gaXMgdGhhdCB0aGUgc2Vjb25kIGNvbW1hbmQgKGNwKSBtYXkKK3VuaW50ZW50aW9uYWxseSBiZSBraWxsZWQgd2hlbiB0aGUgc2hlbGwgZHJhd3MgaXRzIG93biBjb25jbHVzaW9uCithYm91dCB0aGUgdXNlcidzIGludGVudGlvbi4gVGhlIGlubmVybW9zdCBwcm9ncmFtIGlzIHRoZSBvbmx5IG9uZSB0bworanVkZ2UuCisKKzxIMz5PbmUgbW9yZSBleGFtcGxlPC9IMz4KKworPHA+SW1hZ2luZSBhIG1haWwgc2Vzc2lvbiB1c2luZyBhIGN1cnNlcyBtYWlsZXIgaW4gYSB0dHkuIFlvdSBjYWxsZWQKK3lvdXIgbWFpbGVyIGFuZCBzdGFydGVkIHRvIGNvbXBvc2UgYSBtZXNzYWdlLiBZb3VyIG1haWxlciBjYWxscyBlbWFjcy4KKzxjb2RlPkMtZzwvY29kZT4gaXMgYSBub3JtYWwgZWRpdGluZyBrZXkgaW4gZW1hY3MuIFRlY2huaWNhbGx5IGl0CitzZW5kcyBTSUdJTlQgKGl0IHdhcyA8Y29kZT5DLWM8L2NvZGU+LCBidXQgZW1hY3MgcmVtYXBwZWQgdGhlIGtleSkgdG8KKzxtZW51PgorPGxpPmVtYWNzCis8bGk+dGhlIHNoZWxsIGJldHdlZW4geW91ciBtYWlsZXIgYW5kIGVtYWNzLCB0aGUgb25lIGZyb20geW91ciBtYWlsZXJzCisgICAgc3lzdGVtKCJlbWFjcyAvdG1wL2JsYS40NCIpIGNvbW1hbmQKKzxsaT50aGUgbWFpbGVyIGl0c2VsZgorPGxpPnBvc3NpYmx5IGFub3RoZXIgc2hlbGwgaWYgeW91ciBtYWlsZXIgd2FzIGNhbGxlZCBieSBhIHNoZWxsIHNjcmlwdAorb3IgZnJvbSBhbm90aGVyIGFwcGxpY2F0aW9uIHVzaW5nIHN5c3RlbSgzKQorPGxpPnlvdXIgaW50ZXJhY3RpdmUgc2hlbGwgKHdoaWNoIGlnbm9yZXMgaXQgc2luY2UgaXQgaXMgaW50ZXJhY3RpdmUKK2FuZCBoZW5jZSBpcyBub3QgcmVsZXZhbnQgdG8gdGhpcyBkaXNjdXNzaW9uKQorPC9tZW51PgorCis8cD5JZiBldmVyeW9uZSBqdXN0IGV4aXRzIG9uIFNJR0lOVCwgeW91IHdpbGwgYmUgbGVmdCB3aXRoIG5vdGhpbmcgYnV0Cit5b3VyIGxvZ2luIHNoZWxsLCB3aXRob3V0IGFza2luZy4KKworPHA+QnV0IGZvciBzdXJlIHlvdSBkb24ndCB3YW50IHRvIGJlIGRyb3BwZWQgb3V0IG9mIHlvdXIgZWRpdG9yIGFuZAorb3V0IG9mIHlvdXIgbWFpbGVyIGJhY2sgdG8gdGhlIGNvbW1hbmRsaW5lLCBoYXZpbmcgeW91ciBlZGl0ZWQgZGF0YQorYW5kIG1haWxlciBzdGF0dXMgZGVsZXRlZC4KKworPHA+VW5kZXJzdGFuZCB0aGUgZGlmZmVyZW5jZTogV2hpbGUgPGNvZGU+Qy1nPC9jb2RlPiBpcyB1c2VkIGFuIGEga2luZAorb2YgYWJvcnQga2V5IGluIGVtYWNzLCBpdCBpc24ndCB0aGUgbWFqb3IgImFib3J0IGV2ZXJ5dGhpbmciIGtleS4gV2hlbgoreW91IHVzZSA8Y29kZT5DLWc8L2NvZGU+IGluIGVtYWNzLCB5b3Ugd2FudCB0byBlbmQgc29tZSBpbnRlcm5hbCBlbWFjcworY29tbWFuZC4gWW91IGRvbid0IHdhbnQgeW91ciB3aG9sZSBlbWFjcyBhbmQgbWFpbGVyIHNlc3Npb24gdG8gZW5kLgorCis8cD5TbywgaWYgdGhlIHNoZWxsIGV4aXRzIGltbWVkaWF0ZWx5IGlmIHRoZSB1c2VyIHNlbmRzIFNJR0lOVCAodGhlCitzZWNvbmQgb2YgdGhlIGZvdXIgd2F5cyBzaG93biBhYm92ZSksIHRoZSBwYXJlbnQgb2YgZW1hY3Mgd291bGQgZGllLAorbGVhdmluZyBlbWFjcyB3aXRob3V0IHRoZSBjb250cm9sbGluZyB0dHkuIFRoZSB1c2VyIHdpbGwgbG9zZSBpdCdzCitlZGl0aW5nIHNlc3Npb24gaW1tZWRpYXRlbHkgYW5kIHVucmVjb3ZlcmFibGUuIElmIHRoZSAibWFpbiIgc2hlbGwgb2YKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIGRlZmF1bHRzIHRvIHRoaXMgYmVoYXZpb3IsIGV2ZXJ5IGVkaXRvciBzZXNzaW9uCit0aGF0IGlzIHNwYXduZWQgZnJvbSBhIG1haWxlciBvciBzdWNoIHdpbGwgYnJlYWsgKGJlY2F1c2UgaXQgaXMKK3VzdWFsbHkgZXhlY3V0ZWQgYnkgc3lzdGVtKDMpLCB3aGljaCBjYWxscyAvYmluL3NoKS4gVGhpcyB3YXMgdGhlIGNhc2UKK2luIEZyZWVCU0QgYmVmb3JlIEkgYW5kIEJydWNlIEV2YW5zIGNoYW5nZWQgaXQgaW4gMTk5OC4KKworPHA+SWYgdGhlIHNoZWxsIHJlY29nbml6ZWQgdGhhdCBTSUdJTlQgd2FzIHNlbnQgYW5kIGV4aXRzIGFmdGVyIHRoZQorY3VycmVudCBmb3JlZ3JvdW5kIHByb2Nlc3MgZXhpdGVkICh0aGUgdGhpcmQgd2F5IG9mIHRoZSBmb3VyKSwgdGhlCitlZGl0b3Igc2Vzc2lvbiB3aWxsIG5vdCBiZSBkaXN0dXJiZWQsIGJ1dCB0aGluZ3Mgd2lsbCBzdGlsbCBub3Qgd29yaworcmlnaHQuCisKKzxIMz5BIGZ1cnRoZXIgbG9vayBhdCB0aGUgYWx0ZXJuYXRpdmVzPC9IMz4KKworPHA+U3RpbGwgY29uc2lkZXJpbmcgdGhpcyBzY3JpcHQgdG8gZXhhbWluZSB0aGUgc2hlbGwncyBhY3Rpb25zIGluIHRoZQorSVVFLCBXVUUgYW5kIElDRSB3YXkgb2YgaGFuZGxpbmcgU0lHSU5UOgorPFBSRT4KKyMhIC9iaW4vc2gKK2VtYWNzIC90bXAvZm9vCitjcCAvdG1wL2ZvbyAvaG9tZS91c2VyL21haWwvc2VudAorPC9QUkU+CisKKzxwPlRoZSBJVUUgKCJpbW1lZGlhdGUgdW5jb25kaXRpb25hbCBleGl0Iikgd2F5IGRvZXMgbm90IHdvcmsgYXQgYWxsOgorZW1hY3Mgd2FudHMgdG8gc3Vydml2ZSB0aGUgU0lHSU5UIChpdCdzIGEgbm9ybWFsIGVkaXRpbmcga2V5IGZvcgorZW1hY3MpLCBidXQgaXRzIHBhcmVudCBzaGVsbCB1bmNvbmRpdGlvbmFsbHkgdGhpbmtzICJXZSByZWNlaXZlZAorU0lHSU5ULiBBYm9ydCBldmVyeXRoaW5nLiBOb3cuIi4gVGhlIHNoZWxsIHdpbGwgZXhpdCBldmVuIGJlZm9yZSBlbWFjcworZXhpdHMuIEJ1dCB0aGlzIHdpbGwgbGVhdmUgZW1hY3MgaW4gYW4gdW51c2FibGUgc3RhdGUsIHNpbmNlIHRoZSBkZWF0aAorb2YgaXRzIGNhbGxpbmcgc2hlbGwgd2lsbCBsZWF2ZSBpdCB3aXRob3V0IHJlcXVpcmVkIHJlc291cmNlcyAoZmlsZQorZGVzY3JpcHRvcnMpLiBUaGlzIHdheSBkb2VzIG5vdCB3b3JrIGF0IGFsbCBmb3Igc2hlbGxzY3JpcHRzIHRoYXQgY2FsbAorcHJvZ3JhbXMgdGhhdCB1c2UgU0lHSU5UIGZvciBvdGhlciBwdXJwb3NlcyB0aGFuIGltbWVkaWF0ZSBleGl0LiBFdmVuCitmb3IgcHJvZ3JhbXMgdGhhdCBleGl0IG9uIFNJR0lOVCwgYnV0IHdhbnQgdG8gZG8gc29tZSBjbGVhbnVwIGJldHdlZW4KK3RoZSBzaWduYWwgYW5kIHRoZSBleGl0LCBtYXkgZmFpbCBiZWZvcmUgdGhleSBjb21wbGV0ZSB0aGVpciBjbGVhbnVwLgorCis8cD5JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIHdheSBoYXMgb25lIGFkdmFudGFnZTogSWYgYSBjaGlsZAorYmxvY2tzIFNJR0lOVCBhbmQgZG9lcyBub3QgZXhpdCBhdCBhbGwsIHRoaXMgd2F5IHdpbGwgZ2V0IGNvbnRyb2wgYmFjawordG8gdGhlIHVzZXIncyB0ZXJtaW5hbC4gU2luY2Ugc3VjaCBwcm9ncmFtcyBzaG91bGQgYmUgYmFubmVkIGZyb20geW91cgorc3lzdGVtIGFueXdheSwgSSBkb24ndCB0aGluayB0aGF0IHdlaWdocyBhZ2FpbnN0IHRoZSBkaXNhZHZhbnRhZ2VzLgorCis8cD5XVUUgKCJ3YWl0IGFuZCB1bmNvbmRpdGlvbmFsIGV4aXQiKSBpcyBhIGxpdHRsZSBtb3JlIGNsZXZlcjogSWYgQy1nCit3YXMgdXNlZCBpbiBlbWFjcywgdGhlIHNoZWxsIHdpbGwgZ2V0IFNJR0lOVC4gSXQgd2lsbCBub3QgaW1tZWRpYXRlbHkKK2V4aXQsIGJ1dCByZW1lbWJlciB0aGUgZmFjdCB0aGF0IGEgU0lHSU5UIGhhcHBlbmVkLiBXaGVuIGVtYWNzIGVuZHMKKyhtYXliZSBhIGxvbmcgdGltZSBhZnRlciB0aGUgU0lHSU5UKSwgaXQgd2lsbCBzYXkgIk9rLCBhIFNJR0lOVAoraGFwcGVuZWQgc29tZXRpbWUgd2hpbGUgdGhlIGNoaWxkIHdhcyBleGVjdXRpbmcsIHRoZSB1c2VyIHdhbnRzIHRoZQorc2NyaXB0IHRvIGJlIGRpc2NvbnRpbnVlZCIuIEl0IHdpbGwgdGhlbiBleGl0LiBUaGUgY3Agd2lsbCBub3QgYmUKK2V4ZWN1dGVkLiBCdXQgdGhhdCdzIGJhZC4gVGhlICJjcCIgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBlbWFjcworc2Vzc2lvbiBlbmRlZCB3aXRob3V0IHRoZSBDLWcga2V5IGV2ZXIgdXNlZCwgYnV0IGl0IHdpbGwgbm90IGJlCitleGVjdXRlZCB3aGVuIHRoZSB1c2VyIHVzZWQgQy1nIGF0IGxlYXN0IG9uZSB0aW1lLiBUaGF0IGlzIGNsZWFybHkgbm90CitkZXNpcmVkLiBTaW5jZSBDLWcgaXMgYSBub3JtYWwgZWRpdGluZyBrZXkgaW4gZW1hY3MsIHRoZSB1c2VyIGV4cGVjdHMKK3RoZSByZXN0IG9mIHRoZSBzY3JpcHQgdG8gYmVoYXZlIGlkZW50aWNhbGx5IG5vIG1hdHRlciB3aGF0IGtleXMgaGUKK3VzZWQuCisKKzxwPkFzIGEgcmVzdWx0LCB0aGUgIldVRSIgd2F5IGlzIGJldHRlciB0aGFuIHRoZSAiSVVFIiB3YXkgaW4gdGhhdCBpdAorZG9lcyBub3QgYnJlYWsgU0lHSU5ULXVzaW5nIHByb2dyYW1zIGNvbXBsZXRlbHkuIFRoZSBlbWFjcyBzZXNzaW9uCit3aWxsIGVuZCB1bmRpc3R1cmJlZC4gQnV0IGl0IHN0aWxsIGRvZXMgbm90IHN1cHBvcnQgc2NyaXB0cyB3aGVyZQorb3RoZXIgYWN0aW9ucyBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIGEgcHJvZ3JhbSB0aGF0IHVzZSBTSUdJTlQgZm9yCitub24tZXhpdCBwdXJwb3Nlcy4gU2luY2UgdGhlIGJlaGF2aW9yIGlzIGJhc2ljYWxseSB1bmRldGVybWluYWJsZSBmb3IKK3RoZSB1c2VyLCB0aGlzIGNhbiBsZWFkIHRvIG5hc3R5IHN1cnByaXNlcy4KKworPHA+VGhlICJXQ0UiIHdheSBmaXhlcyB0aGlzIGJ5ICJhc2tpbmciIHRoZSBjYWxsZWQgcHJvZ3JhbSB3aGV0aGVyIGl0CitleGl0ZWQgb24gU0lHSU5UIG9yIG5vdC4gV2hpbGUgZW1hY3MgcmVjZWl2ZXMgU0lHSU5ULCBpdCBkb2VzIG5vdCBleGl0CitvbiBpdCBhbmQgYSBjYWxsaW5nIHNoZWxsIHdhaXRpbmcgZm9yIGl0cyBleGl0IHdpbGwgbm90IGJlIHRvbGQgdGhhdAoraXQgZXhpdGVkIG9uIFNJR0lOVC4gKEFsdGhvdWdoIGl0IHJlY2VpdmVzIFNJR0lOVCBhdCBzb21lIHBvaW50IGluCit0aW1lLCB0aGUgc3lzdGVtIGRvZXMgbm90IGVuZm9yY2UgdGhhdCBlbWFjcyB3aWxsIGV4aXQgd2l0aAorIkktZXhpdGVkLW9uLVNJR0lOVCIgc3RhdHVzLiBUaGlzIGlzIHVuZGVyIGVtYWNzJyBjb250cm9sLCBzZWUgYmVsb3cpLgorCis8cD50aGlzIHN0aWxsIHdvcmsgZm9yIHRoZSBub3JtYWwgc2NyaXB0IHdpdGhvdXQgU0lHSU5ULXVzaW5nCitwcm9ncmFtczo8L3A+Cis8UFJFPgorIyEgL2Jpbi9zaAorcHJvZ3JhbTEKK3Byb2dyYW0yCis8L1BSRT4KKworVW5sZXNzIHByb2dyYW0xIGFuZCBwcm9ncmFtMiBtZXNzIGFyb3VuZCB3aXRoIHNpZ25hbCBoYW5kbGluZywgdGhlCitzeXN0ZW0gd2lsbCB0ZWxsIHRoZSBjYWxsaW5nIHNoZWxsIHdoZXRoZXIgdGhlIHByb2dyYW1zIGV4aXRlZAorbm9ybWFsbHkgb3IgYXMgYSByZXN1bHQgb2YgU0lHSU5ULgorCis8cD5UaGUgIldDRSIgd2F5IHRoZW4gaGFzIGFuIGVhc3kgd2F5IHRvIHRoaW5ncyByaWdodDogV2hlbiBvbmUgY2FsbGVkCitwcm9ncmFtIGV4aXRlZCB3aXRoICJJLWV4aXRlZC1vbi1TSUdJTlQiIHN0YXR1cywgaXQgd2lsbCBkaXNjb250aW51ZQordGhlIHNjcmlwdCBhZnRlciB0aGlzIHByb2dyYW0uIElmIHRoZSBwcm9ncmFtIGVuZHMgd2l0aG91dCB0aGlzCitzdGF0dXMsIHRoZSBuZXh0IGNvbW1hbmQgaW4gdGhlIHNjcmlwdCBpcyBzdGFydGVkLgorCis8cD5JdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IGEgc2hlbGwgaW4gIldDRSIgbW9kdXMgZG9lcyBub3QKK25lZWQgdG8gbGlzdGVuIHRvIHRoZSBTSUdJTlQgc2lnbmFsIGF0IGFsbC4gQm90aCBpbiB0aGUKKyJlbWFjcy10aGVuLWNwIiBzY3JpcHQgYW5kIGluIHRoZSAic2V2ZXJhbC1ub3JtYWwtcHJvZ3JhbXMiIHNjcmlwdCwgaXQKK3dpbGwgYmUgd29rZW4gdXAgYW5kIHJlY2VpdmUgU0lHSU5UIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUKK2NvcnJlc3BvbmRpbmcga2V5LiBCdXQgdGhlIHNoZWxsIGRvZXMgbm90IG5lZWQgdG8gcmVhY3Qgb24gdGhpcyBldmVudAorYW5kIGl0IGRvZXNuJ3QgbmVlZCB0byByZW1lbWJlciB0aGUgZXZlbnQgb2YgYW55IFNJR0lOVCwgZWl0aGVyLgorVGVsbGluZyB3aGV0aGVyIHRoZSB1c2VyIHdhbnRzIHRvIGVuZCBhIHNjcmlwdCBpcyBkb25lIGJ5IGFza2luZyB0aGF0Citwcm9ncmFtIHRoYXQgaGFzIHRvIGRlY2lkZSwgdGhhdCBwcm9ncmFtIHRoYXQgaW50ZXJwcmV0cyBrZXlzdHJva2VzCitmcm9tIHRoZSB1c2VyLCB0aGUgaW5uZXJtb3N0IHByb2dyYW0uCisKKzxIMz5TbyBldmVyeXRoaW5nIGlzIHdlbGwgd2l0aCBXQ0U/PC9IMz4KKworV2VsbCwgYWxtb3N0LgorCis8cD5UaGUgcHJvYmxlbSB3aXRoIHRoZSAiV0NFIiBtb2R1cyBpcyB0aGF0IHRoZXJlIGFyZSBicm9rZW4gcHJvZ3JhbXMKK3RoYXQgZG8gbm90IHByb3Blcmx5IGNvbW11bmljYXRlIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiB1cCB0byB0aGUKK2NhbGxpbmcgcHJvZ3JhbS4KKworPHA+VW5sZXNzIGEgcHJvZ3JhbSBtZXNzZXMgd2l0aCBzaWduYWwgaGFuZGxpbmcsIHRoZSBzeXN0ZW0gZG9lcyB0aGlzCithdXRvbWF0aWNhbGx5LgorCis8cD5UaGVyZSBhcmUgcHJvZ3JhbXMgdGhhdCB3YW50IHRvIGV4aXQgb24gU0lHSU5ULCBidXQgdGhleSBkb24ndCBsZXQKK3RoZSBzeXN0ZW0gZG8gdGhlIGF1dG9tYXRpYyBleGl0LCBiZWNhdXNlIHRoZXkgd2FudCB0byBkbyBzb21lCitjbGVhbnVwLiBUbyBkbyBzbywgdGhleSBjYXRjaCBTSUdJTlQsIGRvIHRoZSBjbGVhbnVwIGFuZCB0aGVuIGV4aXQgYnkKK3RoZW1zZWx2ZXMuCisKKzxwPkFuZCBoZXJlIGlzIHdoZXJlIHRoZSBwcm9ibGVtIGFyaXNlczogT25jZSB0aGV5IGNhdGNoIHRoZSBzaWduYWwsCit0aGUgc3lzdGVtIHdpbGwgbm8gbG9uZ2VyIGNvbW11bmljYXRlIHRoZSAiSS1leGl0ZWQtb24tU0lHSU5UIiBzdGF0dXMKK3RvIHRoZSBjYWxsaW5nIHByb2dyYW0gYXV0b21hdGljYWxseS4gRXZlbiBpZiB0aGUgcHJvZ3JhbSBleGl0CitpbW1lZGlhdGVseSBpbiB0aGUgc2lnbmFsIGhhbmRsZXIgb2YgU0lHSU5ULiBPbmNlIGl0IGNhdGNoZXMgdGhlCitzaWduYWwsIGl0IGhhcyB0byB0YWtlIGNhcmUgb2YgY29tbXVuaWNhdGluZyB0aGUgc2lnbmFsIHN0YXR1cworaXRzZWxmLgorCis8cD5Tb21lIHByb2dyYW1zIGRvbid0IGRvIHRoaXMuIE9uIFNJR0lOVCwgdGhleSBkbyBjbGVhbnVwIGFuZCBleGl0CitpbW1lZGlhdGx5LCBidXQgdGhlIGNhbGxpbmcgc2hlbGwgaXNuJ3QgdG9sZCBhYm91dCB0aGUgbm9uLW5vcm1hbCBleGl0CithbmQgaXQgd2lsbCBjYWxsIHRoZSBuZXh0IHByb2dyYW0gaW4gdGhlIHNjcmlwdC4KKworPHA+QXMgYSByZXN1bHQsIHRoZSB1c2VyIGhpdHMgU0lHSU5UIGFuZCB3aGlsZSBvbmUgcHJvZ3JhbSBleGl0cywgdGhlCitzaGVsbHNjcmlwdCBjb250aW51ZXMuIFRvIGhpbS9oZXIgaXQgbG9va3MgbGlrZSB0aGUgc2hlbGwgZmFpbHMgdG8KK29iZXkgdG8gaGlzIGFib3J0aW9uIGNvbW1hbmQuCisKKzxwPkJvdGggSVVFIG9yIFdVRSBzaGVsbCB3b3VsZCBub3QgaGF2ZSB0aGlzIHByb2JsZW0sIHNpbmNlIHRoZXkKK2Rpc2NvbnRpbnVlIHRoZSBzY3JpcHQgb24gdGhlaXIgb3duLiBCdXQgYXMgSSBzYWlkLCB0aGV5IGRvbid0IHN1cHBvcnQKK3Byb2dyYW1zIHVzaW5nIFNJR0lOVCBmb3Igbm9uLWV4aXRpbmcgcHVycG9zZXMsIG5vIG1hdHRlciB3aGV0aGVyCit0aGVzZSBwcm9ncmFtcyBwcm9wZXJseSBjb21tdW5pY2F0ZSB0aGVpciBzaWduYWwgc3RhdHVzIHRvIHRoZSBjYWxsaW5nCitzaGVsbCBvciBub3QuCisKKzxwPlNpbmNlIHNvbWUgc2hlbGwgaW4gd2lkZSB1c2UgaW1wbGVtZW50IHRoZSBXVUUgd2F5IChhbmQgc29tZSBldmVuCitJVUUpLCB0aGVyZSBpcyBhIGNvbnNpZGVyYWJsZSBudW1iZXIgb2YgYnJva2VuIHByb2dyYW1zIG91dCB0aGVyZSB0aGF0CiticmVhayBXQ0Ugc2hlbGxzLiBUaGUgcHJvZ3JhbW1lcnMganVzdCBkb24ndCByZWNvZ25pemUgaXQgaWYgdGhlaXIKK3NoZWxsIGlzbid0IFdDRS4KKworPEgzPkhvdyB0byBiZSBhIHByb3BlciBwcm9ncmFtPC9IMz4KKworPHA+KFNob3J0IG5vdGUgaW4gYWR2YW5jZTogV2hhdCB5b3UgbmVlZCB0byBhY2hpZXZlIGlzIHRoYXQKK1dJRlNJR05BTEVEKHN0YXR1cykgaXMgdHJ1ZSBpbiB0aGUgY2FsbGluZyBwcm9ncmFtIGFuZCB0aGF0CitXVEVSTVNJRyhzdGF0dXMpIHJldHVybnMgU0lHSU5ULikKKworPHA+SWYgeW91IGRvbid0IGNhdGNoIFNJR0lOVCwgdGhlIHN5c3RlbSBhdXRvbWF0aWNhbGx5IGRvZXMgdGhlIHJpZ2h0Cit0aGluZyBmb3IgeW91OiBZb3VyIHByb2dyYW0gZXhpdHMgYW5kIHRoZSBjYWxsaW5nIHByb2dyYW0gZ2V0cyB0aGUKK3JpZ2h0ICJJLWV4aXRlZC1vbi1TSUdJTlQiIHN0YXR1cyBhZnRlciB3YWl0aW5nIGZvciB5b3VyIGV4aXQuCisKKzxwPkJ1dCBvbmNlIHlvdSBjYXRjaCBTSUdJTlQsIHlvdSBoYXZlIHRvIGFjdC4KKworPHA+RGVjaWRlIHdoZXRoZXIgdGhlIFNJR0lOVCBpcyB1c2VkIGZvciBleGl0L2Fib3J0IHB1cnBvc2VzIGFuZCBoZW5jZQorYSBzaGVsbHNjcmlwdCBjYWxsaW5nIHRoaXMgcHJvZ3JhbSBzaG91bGQgZGlzY29udGludWUuIFRoaXMgaXMKK2hvcGVmdWxseSBvYnZpb3VzLiBJZiB5b3UganVzdCBuZWVkIHRvIGRvIHNvbWUgY2xlYW51cCBvbiBTSUdJTlQsIGJ1dAordGhlbiBleGl0IGltbWVkaWF0ZWx5LCB0aGUgYW5zd2VyIGlzICJ5ZXMiLgorCis8cD5JZiBzbywgeW91IGhhdmUgdG8gdGVsbCB0aGUgY2FsbGluZyBwcm9ncmFtIGFib3V0IGl0IGJ5IGV4aXRpbmcKK3dpdGggdGhlICJJLWV4aXRlZC1vbi1TSUdJTlQiIHN0YXR1cy4KKworPHA+VGhlcmUgaXMgbm8gb3RoZXIgd2F5IG9mIGRvaW5nIHRoaXMgdGhhbiB0byBraWxsIHlvdXJzZWxmIHdpdGggYQorU0lHSU5UIHNpZ25hbC4gRG8gaXQgYnkgcmVzZXR0aW5nIHRoZSBTSUdJTlQgaGFuZGxlciB0byBTSUdfREZMLCB0aGVuCitzZW5kIHlvdXJzZWxmIHRoZSBzaWduYWwuCisKKzxQUkU+Cit2b2lkIHNpZ2ludF9oYW5kbGVyKGludCBzaWcpCit7CisJPGRvIHNvbWUgY2xlYW51cD4KKwlzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKwlraWxsKGdldHBpZCgpLCBTSUdJTlQpOworfQorPC9QUkU+CisKK05vdGVzOgorCis8TUVOVT4KKworPExJPllvdSBjYW5ub3QgImZha2UiIHRoZSBwcm9wZXIgZXhpdCBzdGF0dXMgYnkgYW4gZXhpdCgzKSB3aXRoIGEKK3NwZWNpYWwgbnVtZXJpYyB2YWx1ZS4gUGVvcGxlIG9mdGVuIGFzc3VtZSB0aGlzIHNpbmNlIHRoZSBtYW51YWxzIGZvcgorc2hlbGxzIG9mdGVuIGxpc3Qgc29tZSByZXR1cm4gdmFsdWUgZm9yIGV4YWN0bHkgdGhpcy4gQnV0IHRoaXMgaXMganVzdAorYSBjb252ZW50aW9uIGZvciB5b3VyIHNoZWxsIHNjcmlwdC4gSXQgZG9lcyBub3Qgd29yayBmcm9tIG9uZSBVTklYIEFQSQorcHJvZ3JhbSB0byBhbm90aGVyLgorCis8UD5BbGwgdGhhdCBoYXBwZW5zIGlzIHRoYXQgdGhlIHNoZWxsIHNldHMgdGhlICIkPyIgdmFyaWFibGUgdG8gYQorc3BlY2lhbCBudW1lcmljIHZhbHVlIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgeW91ciBzY3JpcHQsIGJlY2F1c2UgeW91cgorc2NyaXB0IGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBsb3dlci1sZXZlciBVTklYIHN0YXR1cyBldmFsdWF0aW9uCitmdW5jdGlvbnMuIFRoaXMgaXMganVzdCBhbiBhZ3JlZW1lbnQgYmV0d2VlbiB5b3VyIHNjcmlwdCBhbmQgdGhlCitleGVjdXRpbmcgc2hlbGwsIGl0IGRvZXMgbm90IGhhdmUgYW55IG1lYW5pbmcgaW4gb3RoZXIgY29udGV4dHMuCisKKzxQPjxMST5EbyBub3QgdXNlIGtpbGwoMCwgU0lHSU5UKSB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIG1hbnVsIGZvcgoreW91ciBPUyBpbXBsZW1lbnRhdGlvbi4gSS5lLiBvbiBCU0QsIHRoaXMgd291bGQgbm90IHNlbmQgdGhlIHNpZ25hbCB0bwordGhlIGN1cnJlbnQgcHJvY2VzcywgYnV0IHRvIGFsbCBwcm9jZXNzZXMgaW4gdGhlIGdyb3VwLgorCis8UD48TEk+UE9TSVggMTAwMy4xIGFsbG93cyBhbGwgdGhlc2UgY2FsbHMgdG8gYXBwZWFyIGluIHNpZ25hbAoraGFuZGxlcnMsIHNvIGl0IGlzIHBvcnRhYmxlLgorCis8L01FTlU+CisKKzxwPkluIGEgYm91cm5lIHNoZWxsIHNjcmlwdCwgeW91IGNhbiBjYXRjaCBzaWduYWxzIHVzaW5nIHRoZQorPGNvZGU+dHJhcDwvY29kZT4gY29tbWFuZC4gSGVyZSwgdGhlIHNhbWUgYXMgZm9yIEMgcHJvZ3JhbXMgYXBwbHkuICBJZgordGhlIGludGVudGlvbiBvZiBTSUdJTlQgaXMgdG8gZW5kIHlvdXIgcHJvZ3JhbSwgeW91IGhhdmUgdG8gZXhpdCBpbiBhCit3YXkgdGhhdCB0aGUgY2FsbGluZyBwcm9ncmFtcyAic2VlcyIgdGhhdCB5b3UgaGF2ZSBiZWVuIGtpbGxlZC4gIElmCit5b3UgZG9uJ3QgY2F0Y2ggU0lHSU5ULCB0aGlzIGhhcHBlbmQgYXV0b21hdGljYWxseSwgYnV0IG9mIHlvdSBjYXRjaAorU0lHSU5ULCBpLmUuIHRvIGRvIGNsZWFudXAgd29yaywgeW91IGhhdmUgdG8gZW5kIHRoZSBwcm9ncmFtIGJ5CitraWxsaW5nIHlvdXJzZWxmLCBub3QgYnkgY2FsbGluZyBleGl0LgorCis8cD5Db25zaWRlciB0aGlzIGV4YW1wbGUgZnJvbSBGcmVlQlNEJ3MgPGNvZGU+bWtkZXA8L2NvZGU+LCB3aGljaCBpcyBhCitib3VybmUgc2hlbGwgc2NyaXB0LgorCis8cHJlPgorVE1QPV9ta2RlcCQkCit0cmFwICdybSAtZiAkVE1QIDsgdHJhcCAyIDsga2lsbCAtMiAkJCcgMSAyIDMgMTMgMTUKKzwvcHJlPgorCitZZXMsIHlvdSBoYXZlIHRvIGRvIGl0IHRoZSBoYXJkIHdheS4gSXQncyBldmVuIG1vcmUgYW5ub3lpbmcgaW4gc2hlbGwKK3NjcmlwdHMgdGhhbiBpbiBDIHByb2dyYW1zIHNpbmNlIHlvdSBjYW4ndCAicHJlLWRlbGV0ZSIgdGVtcG9yYXJ5CitmaWxlcyAod2hpY2ggaXNuJ3QgcmVhbGx5IHBvcnRhYmxlIGluIEMsIHRob3VnaCkuCisKKzxQPkFsbCB0aGlzIGFwcGxpZXMgdG8gcHJvZ3JhbXMgaW4gYWxsIGxhbmd1YWdlcywgbm90IG9ubHkgQyBhbmQKK2JvdXJuZSBzaGVsbC4gRXZlcnkgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24gdGhhdCBsZXRzIHlvdSBjYXRjaCBTSUdJTlQKK3Nob3VsZCBhbHNvIGdpdmUgeW91IHRoZSBvcHRpb24gdG8gcmVzZXQgdGhlIHNpZ25hbCBhbmQga2lsbCB5b3Vyc2VsZi4KKworPFA+SXQgaXMgYWx3YXlzIGRlc2lyZWFibGUgdG8gZXhpdCB0aGUgcmlnaHQgd2F5LCBldmVuIGlmIHlvdSBkb24ndAorZXhwZWN0IHlvdXIgdXN1YWwgY2FsbGVycyB0byBkZXBlbmQgb24gaXQsIHNvbWUgdW51c3VhbCBvbmUgd2lsbCBjb21lCithbG9uZy4gVGhpcyBwcm9wZXIgZXhpdCBzdGF0dXMgd2lsbCBiZSBuZWVkZWQgZm9yIFdDRSBhbmQgd2lsbCBub3QKK2h1cnQgd2hlbiB0aGUgY2FsbGluZyBzaGVsbCB1c2VzIElVRSBvciBXVUUuCisKKzxIMz5Ib3cgdG8gYmUgYSBwcm9wZXIgc2hlbGw8L0gzPgorCitBbGwgdGhpcyBhcHBsaWVzIG9ubHkgZm9yIHRoZSBzY3JpcHQtZXhlY3V0aW5nIGNhc2UuIE1vc3Qgc2hlbGxzIHdpbGwKK2Fsc28gaGF2ZSBpbnRlcmFjdGl2ZSBtb2RlcyB3aGVyZSB0aGluZ3MgYXJlIGRpZmZlcmVudC4KKworPE1FTlU+CisKKzxMST5EbyBub3RoaW5nIHNwZWNpYWwgd2hlbiBTSUdJTlQgYXBwZWFycyB3aGlsZSB5b3Ugd2FpdCBmb3IgYSBjaGlsZC4KK1lvdSBkb24ndCBldmVuIGhhdmUgdG8gcmVtZW1iZXIgdGhhdCBvbmUgaGFwcGVuZWQuCisKKzxQPjxMST5XYWl0IGZvciBjaGlsZCB0byBleGl0LCBnZXQgdGhlIGV4aXQgc3RhdHVzLiBEbyBub3QgdHJ1bmNhdGUgaXQKK3RvIHR5cGUgY2hhci4KKworPFA+PExJPkxvb2sgYXQgV0lGU0lHTkFMRUQoc3RhdHVzKSBhbmQgV1RFUk1TSUcoc3RhdHVzKSB0byB0ZWxsCit3aGV0aGVyIHRoZSBjaGlsZCBzYXlzICJJIGV4aXRlZCBvbiBTSUdJTlQ6IGluIG15IG9waW5pb24gdGhlIHVzZXIKK3dhbnRzIHRoZSBzaGVsbHNjcmlwdCB0byBiZSBkaXNjb250aW51ZWQiLgorCis8UD48TEk+SWYgdGhlIGxhdHRlciBhcHBsaWVzLCBkaXNjb250aW51ZSB0aGUgc2NyaXB0LgorCis8UD48TEk+RXhpdC4gQnV0IHNpbmNlIGEgc2hlbGxzY3JpcHQgbWF5IGluIHR1cm4gYmUgY2FsbGVkIGJ5IGEKK3NoZWxsc2NyaXB0LCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgcHJvcGVybHkgY29tbXVuaWNhdGUgdGhlCitkaXNjb250aW51ZSBpbnRlbnRpb24gdG8gdGhlIGNhbGxpbmcgcHJvZ3JhbS4gQXMgaW4gYW55IG90aGVyIHByb2dyYW0KKyhzZWUgYWJvdmUpLCBkbworCis8UFJFPgorCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCWtpbGwoZ2V0cGlkKCksIFNJR0lOVCk7Cis8L1BSRT4KKworPC9NRU5VPgorCis8SDM+T3RoZXIgcmVtYXJrczwvSDM+CisKK0FsdGhvdWdoIHRoaXMgd2ViIHBhZ2UgdGFsa3MgYWJvdXQgU0lHSU5UIG9ubHksIGFsbW9zdCB0aGUgc2FtZSBpc3N1ZXMKK2FwcGx5IHRvIFNJR1FVSVQsIGluY2x1ZGluZyBwcm9wZXIgZXhpdGluZyBieSBraWxsaW5nIHlvdXJzZWxmIGFmdGVyCitjYXRjaGluZyB0aGUgc2lnbmFsIGFuZCBwcm9wZXIgcmVhY3Rpb24gb24gdGhlIFdJRlNJR05BTEVEKHN0YXR1cykKK3ZhbHVlLiBPbmUgbm90YWJsZSBkaWZmZXJlbmNlIGZvciBTSUdRVUlUIGlzIHRoYXQgeW91IGhhdmUgdG8gbWFrZQorc3VyZSB0aGF0IG5vdCB0aGUgd2hvbGUgY2FsbCB0cmVlIGR1bXBzIGNvcmUuCisKKzxIMz5XaGF0IHRvIGZpZ2h0PC9IMz4KKworTWFrZSBzdXJlIGFsbCBwcm9ncmFtcyA8ZW0+cmVhbGx5PC9lbT4ga2lsbCB0aGVtc2VsdmVzIGlmIHRoZXkgcmVhY3QKK3RvIFNJR0lOVCBvciBTSUdRVUlUIGFuZCBpbnRlbmQgdG8gYWJvcnQgdGhlaXIgb3BlcmF0aW9uIGFzIGEgcmVzdWx0CitvZiB0aGlzIHNpZ25hbC4gUHJvZ3JhbXMgdGhhdCBkb24ndCB1c2UgU0lHSU5UL1NJR1FVSVQgYXMgYQordGVybWluYXRpb24gdHJpZ2dlciAtIGJ1dCBhcyBwYXJ0IG9mIG5vcm1hbCBvcGVyYXRpb24gLSBkb24ndCBraWxsCit0aGVtc2VsdmVzLCBidXQgZG8gYSBub3JtYWwgZXhpdCBpbnN0ZWFkLgorCis8cD5NYWtlIHN1cmUgcGVvcGxlIHVuZGVyc3RhbmQgd2h5IHlvdSBjYW4ndCBmYWtlIGFuIGV4aXQtb24tc2lnbmFsIGJ5Citkb2luZyBleGl0KC4uLikgdXNpbmcgYW55IG51bWVyaWNhbCBzdGF0dXMuCisKKzxwPk1ha2Ugc3VyZSB5b3UgdXNlIGEgc2hlbGwgdGhhdCBiZWhhdmVzIHJpZ2h0LiBFc3BlY2lhbGx5IGlmIHlvdQorZGV2ZWxvcCBwcm9ncmFtcywgc2luY2UgaXQgd2lsbCBoZWxwIHNlZWluZyBwcm9ibGVtcy4KKworPEgzPkNvbmNyZXRlIGV4YW1wbGVzIGhvdyB0byBmaXggcHJvZ3JhbXM6PC9IMz4KKzx1bD4KKworPGxpPlRoZSBmaXggZm9yIEZyZWVCU0QncworPEEgSFJFRj0iaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvY3Zzd2ViLmNnaS9zcmMvdXNyLmJpbi90aW1lL3RpbWUuYy5kaWZmP3IxPTEuMTAmcjI9MS4xMSI+dGltZSgxKTwvQT4uIFRoaXMgZml4IGlzIHRoZSBiZXN0IGV4YW1wbGUsIGl0J3MgcXVpdGUgc2hvcnQgYW5kIGNsZWFyIGFuZAoraXQgZml4ZXMgYSBjYXNlIHdoZXJlIHNvbWVvbmUgdHJpZWQgdG8gZmFrZSBzaWduYWwgZXhpdCBzdGF0dXMgYnkgYQorbnVtZXJpY2FsIHZhbHVlLiBBbmQgdGhlIGNvbXBsZXRlIHByb2dyYW0gaXMgc21hbGwuCisKKzxwPjxsaT5GaXggZm9yIEZyZWVCU0QncworPEEgSFJFRj0iaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvY3Zzd2ViLmNnaS9zcmMvdXNyLmJpbi90cnVzcy9tYWluLmMuZGlmZj9yMT0xLjkmcjI9MS4xMCI+dHJ1c3MoMSk8L0E+LgorCis8cD48bGk+VGhlIGZpeCBmb3IgRnJlZUJTRCdzCis8QSBIUkVGPSJodHRwOi8vd3d3LmZyZWVic2Qub3JnL2NnaS9jdnN3ZWIuY2dpL3NyYy91c3IuYmluL21rZGVwL21rZGVwLmdjYy5zaC5kaWZmP3IxPTEuOC4yLjEmcjI9MS44LjIuMiI+bWtkZXAoMSk8L0E+LCBhIHNoZWxsIHNjcmlwdC4KKworCis8cD48bGk+Rml4IGZvciBGcmVlQlNEJ3MgbWFrZSgxKSwgPEEgSFJFRj0iaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvY3Zzd2ViLmNnaS9zcmMvdXNyLmJpbi9tYWtlL2pvYi5jLmRpZmY/cjE9MS45JnIyPTEuMTAiPnBhcnQgMTwvQT4sCis8QSBIUkVGPSJodHRwOi8vd3d3LmZyZWVic2Qub3JnL2NnaS9jdnN3ZWIuY2dpL3NyYy91c3IuYmluL21ha2UvY29tcGF0LmMuZGlmZj9yMT0xLjEwJnIyPTEuMTEiPnBhcnQgMjwvQT4uCisKKzwvdWw+CisKKzxIMz5UZXN0c3VpdGUgZm9yIHNoZWxsczwvSDM+CisKK0kgaGF2ZSBhIGNvbGxlY3Rpb24gb2Ygc2hlbGxzY3JpcHRzIHRoYXQgdGVzdCBzaGVsbHMgZm9yIHRoZQorYmVoYXZpb3IuIFNlZSBteSA8QSBIUkVGPSJkb3dubG9hZC8iPmRvd25sb2FkIGRpcjwvQT4gdG8gZ2V0IHRoZSBuZXdlc3QKKyJzaC1pbnRlcnJ1cHQiIGZpbGVzLCBlaXRoZXIgYXMgYSB0YXJmaWxlIG9yIGFzIGluZGl2aWR1YWwgZmlsZSBmb3IKK29ubGluZSBicm93c2luZy4gVGhpcyBpc24ndCByZWFsbHkgZG9jdW1lbnRlZCwgYmVzaWRlcyBmcm9tIHRoZQorY29tbWVudHMgdGhlIHNjcmlwdHMgZWNoby4KKworPEgzPkFwcGVuZGl4IDEgLSB0YWJsZSBvZiBpbXBsZW1lbnRhdGlvbiBjaG9pY2VzPC9IMz4KKworPHRhYmxlIGJvcmRlciBjZWxscGFkZGluZz0yPgorCis8dHIgdmFsaWduPXRvcD4KKzx0aD5NZXRob2Qgc2lnbjwvdGg+Cis8dGg+RG9lcyB3aGF0PzwvdGg+Cis8dGg+RXhhbXBsZSBzaGVsbHMgdGhhdCBpbXBsZW1lbnQgaXQ6PC90aD4KKzx0aD5XaGF0IGhhcHBlbnMgd2hlbiBhIHNoZWxsc2NyaXB0IGNhbGxlZCBlbWFjcywgdGhlIHVzZXIgdXNlZAorPGNvZGU+Qy1nPC9jb2RlPiBhbmQgdGhlIHNjcmlwdCBoYXMgYWRkaXRpb25hbCBjb21tYW5kcyBpbiBpdD88L3RoPgorPHRoPldoYXQgaGFwcGVucyB3aGVuIGEgc2hlbGxzY3JpcHQgY2FsbGVkIGVtYWNzLCB0aGUgdXNlciBkaWQgbm90IHVzZQorPGNvZGU+Qy1jPC9jb2RlPiBhbmQgdGhlIHNjcmlwdCBoYXMgYWRkaXRpb25hbCBjb21tYW5kcyBpbiBpdD88L3RoPgorPHRoPldoYXQgaGFwcGVucyBpZiBhIG5vbi1pbnRlcmFjdGl2ZSBjaGlsZCBjYXRjaGVzIFNJR0lOVD88L3RoPgorPHRoPlRvIGJlaGF2ZSBwcm9wZXJseSwgY2hpbGRzIG11c3QgZG8gd2hhdD88L3RoPgorPC90cj4KKworPHRyIHZhbGlnbj10b3AgYWxpZ249bGVmdD4KKzx0ZD5JVUU8L3RkPgorPHRkPlRoZSBzaGVsbCBleGVjdXRpbmcgYSBzY3JpcHQgZXhpdHMgaW1tZWRpYXRlbHkgaWYgaXQgcmVjZWl2ZXMKK1NJR0lOVC48L3RkPgorPHRkPjQuNEJTRCBhc2ggKGFzaCksIE5ldEJTRCwgRnJlZUJTRCBwcmlvciB0byAzLjAvMjIuODwvdGQ+Cis8dGQ+VGhlIGVkaXRvciBzZXNzaW9uIGlzIGxvc3QgYW5kIHN1YnNlcXVlbnQgY29tbWFuZHMgYXJlIG5vdAorZXhlY3V0ZWQuPC90ZD4KKzx0ZD5UaGUgZWRpdG9yIGNvbnRpbnVlcyBhcyBub3JtYWwgYW5kIHRoZSBzdWJzZXF1ZW50IGNvbW1hbmRzIGFyZQorZXhlY3V0ZWQuIDwvdGQ+Cis8dGQ+VGhlIHNjcmlwdHMgZW5kcyBpbW1lZGlhdGVseSwgcmV0dXJuaW5nIHRvIHRoZSBjYWxsZXIgZXZlbiBiZWZvcmUKK3RoZSBjdXJyZW50IGZvcmVncm91bmQgY2hpbGQgb2YgdGhlIHNoZWxsIGV4aXRzLiA8L3RkPgorPHRkPkl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGNoaWxkIGRvZXMgb3IgaG93IGl0IGV4aXRzLCBldmVuIGlmIHRoZQorY2hpbGQgY29udGludWVzIHRvIG9wZXJhdGUsIHRoZSBzaGVsbCByZXR1cm5zLiA8L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj10b3AgYWxpZ249bGVmdD4KKzx0ZD5XVUU8L3RkPgorPHRkPklmIHRoZSBzaGVsbCBleGVjdXRpbmcgYSBzY3JpcHQgcmVjZWl2ZWQgU0lHSU5UIHdoaWxlIGEgZm9yZWdyb3VuZAorcHJvY2VzcyB3YXMgcnVubmluZywgaXQgd2lsbCBleGl0IGFmdGVyIHRoYXQgY2hpbGQncyBleGl0LjwvdGQ+Cis8dGQ+cGRrc2ggKE9wZW5CU0QgL2Jpbi9zaCk8L3RkPgorPHRkPlRoZSBlZGl0b3IgY29udGludWVzIGFzIG5vcm1hbCwgYnV0IHN1YnNlcXVlbnQgY29tbWFuZHMgZnJvbSB0aGUKK3NjcmlwdCBhcmUgbm90IGV4ZWN1dGVkLjwvdGQ+Cis8dGQ+VGhlIGVkaXRvciBjb250aW51ZXMgYXMgbm9ybWFsIGFuZCBzdWJzZXF1ZW50IGNvbW1hbmRzIGFyZQorZXhlY3V0ZWQuIDwvdGQ+Cis8dGQ+VGhlIHNjcmlwdHMgcmV0dXJucyB0byBpdHMgY2FsbGVyIGFmdGVyIHRoZSBjdXJyZW50IGZvcmVncm91bmQKK2NoaWxkIGV4aXRzLCBubyBtYXR0ZXIgaG93IHRoZSBjaGlsZCBleGl0ZWQuIDwvdGQ+Cis8dGQ+SXQgZG9lc24ndCBtYXR0ZXIgaG93IHRoZSBjaGlsZCBleGl0cyAoc2lnbmFsIHN0YXR1cyBvciBub3QpLCBidXQKK2lmIGl0IGRvZXNuJ3QgcmV0dXJuIGF0IGFsbCwgdGhlIHNoZWxsIHdpbGwgbm90IHJldHVybi4gSW4gbm8gY2FzZQord2lsbCBmdXJ0aGVyIGNvbW1hbmRzIGZyb20gdGhlIHNjcmlwdCBiZSBleGVjdXRlZC4gPC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249dG9wIGFsaWduPWxlZnQ+Cis8dGQ+V0NFPC90ZD4KKzx0ZD5UaGUgc2hlbGwgZXhpdHMgaWYgYSBjaGlsZCBzaWduYWxlZCB0aGF0IGl0IHdhcyBraWxsZWQgb24gYQorc2lnbmFsIChlaXRoZXIgaXQgaGFkIHRoZSBkZWZhdWx0IGhhbmRsZXIgZm9yIFNJR0lOVCBvciBpdCBraWxsZWQKK2l0c2VsZikuICA8L3RkPgorPHRkPmJhc2ggKExpbnV4IC9iaW4vc2gpLCBtb3N0IGNvbW1lcmNpYWwgL2Jpbi9zaCwgRnJlZUJTRCAvYmluL3NoCitmcm9tIDMuMC8yLjIuOC48L3RkPgorPHRkPlRoZSBlZGl0b3IgY29udGludWVzIGFzIG5vcm1hbCBhbmQgc3Vic2VxdWVudCBjb21tYW5kcyBhcmUKK2V4ZWN1dGVkLiA8L3RkPgorPHRkPlRoZSBlZGl0b3IgY29udGludWVzIGFzIG5vcm1hbCBhbmQgc3Vic2VxdWVudCBjb21tYW5kcyBhcmUKK2V4ZWN1dGVkLiA8L3RkPgorPHRkPlRoZSBzY3JpcHRzIHJldHVybnMgdG8gaXRzIGNhbGxlciBhZnRlciB0aGUgY3VycmVudCBmb3JlZ3JvdW5kCitjaGlsZCBleGl0cywgYnV0IG9ubHkgaWYgdGhlIGNoaWxkIGV4aXRlZCB3aXRoIHNpZ25hbCBzdGF0dXMuIElmCit0aGUgY2hpbGQgZGlkIGEgbm9ybWFsIGV4aXQgKGV2ZW4gaWYgaXQgcmVjZWl2ZWQgU0lHSU5ULCBidXQgY2F0Y2hlcworaXQpLCB0aGUgc2NyaXB0IHdpbGwgY29udGludWUuIDwvdGQ+Cis8dGQ+VGhlIGNoaWxkIG11c3QgYmUgaW1wbGVtZW50ZWQgcmlnaHQsIG9yIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUKK3RvIGJyZWFrIHNoZWxsIHNjcmlwdHMgcmVsaWFibHkuPC90ZD4KKzwvdHI+CisKKzwvdGFibGU+CisKKzxQPjxpbWcgc3JjPWxpbmllLnBuZyB3aWR0aD0iMTAwJSIgYWx0PSIgIj4KKzxCUj4mY29weTsyMDA1IE1hcnRpbiBDcmFjYXVlciAmbHQ7Y3JhY2F1ZXIgQCBjb25zLm9yZyZndDsKKzxBIEhSRUY9Imh0dHA6Ly93d3cuY29ucy5vcmcvY3JhY2F1ZXIvIj5odHRwOi8vd3d3LmNvbnMub3JnL2NyYWNhdWVyLzwvQT4KKzxCUj5MYXN0IGNoYW5nZWQ6ICREYXRlOiAyMDA1LzAyLzExIDIxOjQ0OjQzICQKKzwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL3NtYWxsaW50LnR4dCBiL2J1c3lib3gtMS4xOS4zL2RvY3Mvc21hbGxpbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1N2RmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL3NtYWxsaW50LnR4dApAQCAtMCwwICsxLDM5IEBACisgICAgICAgIHNtYWxsdWludCBpID0gaW5kZXhfaW5fc3RyX2FycmF5KHBhcmFtcywgbmFtZSkgKyAxOworICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIShpID09IDQgfHwgaSA9PSA1KSkKKyAgICAgICAgICAgICAgICBpIHw9IDB4ODA7CisKKyAgICAgICAgcmV0dXJuIGk7CisKK0kgdGhpbmsgdGhhdCB0aGlzIG9wdGltaXphdGlvbiBpcyB3cm9uZy4KK2luZGV4X2luX3N0cl9hcnJheSByZXR1cm5zIGludC4gQXQgYmVzdCwgY29tcGlsZXIgd2lsbCB1c2UgaXQgYXMtaXMuCitBdCB3b3JzdCwgY29tcGlsZXIgd2lsbCB0cnkgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgY2FzdAoraW50byBhIGJ5dGUsIHdoaWNoIHByb2JhYmx5IHJlc3VsdHMgaW4gIm4gPSBuICYgMHhmZiIgb24gbWFueSBhcmNoaXRlY3R1cmVzLgorCitZb3Ugc2F2ZSBub3RoaW5nIG9uIHNwYWNlIGhlcmUgYmVjYXVzZSBpIGlzIG5vdCBzdG9yZWQgb24tc3RhY2ssCitnY2Mgd2lsbCBrZWVwIGl0IGluIHJlZ2lzdGVyLiBBbmQgZXZlbiBpZiBpdCAqaXMqIHN0b3JlZCwKK2l0IGlzICpzdGFjayogc3RvcmFnZSwgd2hpY2ggaXMgY2hlYXAgKHVubGlrZSBkYXRhL2JzcykuCisKK3NtYWxsW3VdaW50cyBhcmUgdXNlZnVsIF9tb3N0bHlfIGZvcjoKKworKGEpIGZsYWcgdmFyaWFibGVzCisgICAgKGExKSBnbG9iYWwgZmxhZyB2YXJpYWJsZXMgLSBtYWtlIGRhdGEvYnNzIHNtYWxsZXIKKyAgICAoYTIpIGxvY2FsIGZsYWcgdmFyaWFibGVzIC0gImEgPSA1IiwgImEgfD0gMHg0MCIgYXJlIHNtYWxsZXIKKyAgICAgICAgIGZvciBieXRlcyB0aGFuIGZvciBmdWxsIGludGVnZXJzLgorICAgICAgICAgICAgRXhhbXBsZToKKyAgICAgICAgICAgIG9uIGkzODYsIHRoZXJlIGlzIG5vIHdpZGVuaW5nIGNvbnN0YW50IHN0b3JlIGluc3RydWN0aW9uCisgICAgICAgICAgICBmb3Igc29tZSB0eXBlcyBvZiBhZGRyZXNzIG1vZGVzLCB0aHVzCisgICAgICAgICAgICBtb3ZsICQweDAsKCVlYXgpIGlzICJjNyAwMCAwMCAwMCAwMCAwMCIKKyAgICAgICAgICAgIG1vdmIgJDB4MCwoJWVheCkgaXMgImM2IDAwIDAwIgorKGIpIHNtYWxsIGludGVnZXIgc3RydWN0dXJlIG1lbWJlcnMsIHdoZW4geW91IGhhdmUgbWFueSBzdWNoCisgICAgc3RydWN0dXJlcyBhbGxvY2F0ZWQsCisgICAgb3Igd2hlbiB0aGVzZSBhcmUgZ2xvYmFsIG9iamVjdHMgb2YgdGhpcyBzdHJ1Y3R1cmUgdHlwZQorCitzbWFsbFt1XWludHMgYXJlICpOT1QqIHVzZWZ1bCBmb3I6CisKKyhhKSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzIC0KKyAgICB0aGV5IGFyZSBwdXNoZWQgb24tc3RhY2sgb3Igc3RvcmVkIGluIHJlZ2lzdGVycywgYnl0ZXMgaGVyZSBhcmUgKmhhcmRlcioKKyAgICB0byBkZWFsIHdpdGggdGhhbiBpbnRzCisoYikgImNvbXB1dGF0aW9uYWwiIHZhcmlhYmxlcyAtICJhKysiLCAiYSA9IGIqMyArIDciIG1heSB0YWtlIG1vcmUgY29kZSB0byBkbworICAgIG9uIGJ5dGVzIHRoYW4gb24gaW50cyBvbiBzb21lIGFyY2hpdGVjdGlyZXMuCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL3N0eWxlLWd1aWRlLnR4dCBiL2J1c3lib3gtMS4xOS4zL2RvY3Mvc3R5bGUtZ3VpZGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZWQ4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9kb2NzL3N0eWxlLWd1aWRlLnR4dApAQCAtMCwwICsxLDcxMyBAQAorQnVzeWJveCBTdHlsZSBHdWlkZQorPT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgY29kaW5nIHN0eWxlIGNvbnZlbnRpb25zIHVzZWQgaW4gQnVzeWJveC4gSWYgeW91CithZGQgYSBuZXcgZmlsZSB0byBCdXN5Ym94IG9yIGFyZSBlZGl0aW5nIGFuIGV4aXN0aW5nIGZpbGUsIHBsZWFzZSBmb3JtYXQgeW91cgorY29kZSBhY2NvcmRpbmcgdG8gdGhpcyBzdHlsZS4gSWYgeW91IGFyZSB0aGUgbWFpbnRhaW5lciBvZiBhIGZpbGUgdGhhdCBkb2VzCitub3QgZm9sbG93IHRoZXNlIGd1aWRlbGluZXMsIHBsZWFzZSAtLSBhdCB5b3VyIG93biBjb252ZW5pZW5jZSAtLSBtb2RpZnkgdGhlCitmaWxlKHMpIHlvdSBtYWludGFpbiB0byBicmluZyB0aGVtIGludG8gY29uZm9ybWFuY2Ugd2l0aCB0aGlzIHN0eWxlIGd1aWRlLgorUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGEgbG93IHByaW9yaXR5IHRhc2suCisKK1RvIGhlbHAgeW91IGZvcm1hdCB0aGUgd2hpdGVzcGFjZSBvZiB5b3VyIHByb2dyYW1zLCBhbiAiLmluZGVudC5wcm8iIGZpbGUgaXMKK2luY2x1ZGVkIGluIHRoZSBtYWluIEJ1c3lib3ggc291cmNlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIG9wdGlvbiBmbGFncyB0bworZm9ybWF0IGNvZGUgYXMgcGVyIHRoaXMgc3R5bGUgZ3VpZGUuIFRoaXMgd2F5IHlvdSBjYW4gcnVuIEdOVSBpbmRlbnQgb24geW91cgorZmlsZXMgYnkgdHlwaW5nICdpbmRlbnQgbXlmaWxlLmMgbXlmaWxlLmgnIGFuZCBpdCB3aWxsIG1hZ2ljYWxseSBhcHBseSBhbGwgdGhlCityaWdodCBmb3JtYXR0aW5nIHJ1bGVzIHRvIHlvdXIgZmlsZS4gUGxlYXNlIF9kb19ub3RfIHJ1biB0aGlzIG9uIGFsbCB0aGUgZmlsZXMKK2luIHRoZSBkaXJlY3RvcnksIGp1c3QgeW91ciBvd24uCisKKworCitEZWNsYXJhdGlvbiBPcmRlcgorLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSBpcyB0aGUgcHJlZmVycmVkIG9yZGVyIGluIHdoaWNoIGNvZGUgc2hvdWxkIGJlIGxhaWQgb3V0IGluIGEgZmlsZToKKworIC0gY29tbWVudGVkIHByb2dyYW0gbmFtZSBhbmQgb25lLWxpbmUgZGVzY3JpcHRpb24KKyAtIGNvbW1lbnRlZCBhdXRob3IgbmFtZSBhbmQgZW1haWwgYWRkcmVzcyhlcykKKyAtIGNvbW1lbnRlZCBHUEwgYm9pbGVycGxhdGUKKyAtIGNvbW1lbnRlZCBsb25nZXIgZGVzY3JpcHRpb24gLyBub3RlcyBmb3IgdGhlIHByb2dyYW0gKGlmIG5lZWRlZCkKKyAtICNpbmNsdWRlcyBvZiAuaCBmaWxlcyB3aXRoIGFuZ2xlIGJyYWNrZXRzICg8PikgYXJvdW5kIHRoZW0KKyAtICNpbmNsdWRlcyBvZiAuaCBmaWxlcyB3aXRoIHF1b3RlcyAoIiIpIGFyb3VuZCB0aGVtCisgLSAjZGVmaW5lcyAoaWYgYW55LCBub3RlIHRoZSBzZWN0aW9uIGJlbG93IHRpdGxlZCAiQXZvaWQgdGhlIFByZXByb2Nlc3NvciIpCisgLSBjb25zdCBhbmQgZ2xvYmFsIHZhcmlhYmxlcworIC0gZnVuY3Rpb24gZGVjbGFyYXRpb25zIChpZiBuZWNlc3NhcnkpCisgLSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMKKworCisKK1doaXRlc3BhY2UgYW5kIEZvcm1hdHRpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyBldmVyeWJvZHkncyBmYXZvcml0ZSBmbGFtZSB0b3BpYyBzbyBsZXQncyBnZXQgaXQgb3V0IG9mIHRoZSB3YXkgcmlnaHQKK3VwIGZyb250LgorCisKK1RhYnMgdnMuIFNwYWNlcyBpbiBMaW5lIEluZGVudGF0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgcHJlZmVyZW5jZSBpbiBCdXN5Ym94IGlzIHRvIGluZGVudCBsaW5lcyB3aXRoIHRhYnMuIERvIG5vdCBpbmRlbnQgbGluZXMKK3dpdGggc3BhY2VzIGFuZCBkbyBub3QgaW5kZW50cyBsaW5lcyB1c2luZyBhIG1peHR1cmUgb2YgdGFicyBhbmQgc3BhY2VzLiAoVGhlCitpbmRlbnRhdGlvbiBzdHlsZSBpbiB0aGUgQXBhY2hlIGFuZCBQb3N0Zml4IHNvdXJjZSBkb2VzIHRoaXMgc29ydCBvZiB0aGluZzoKK1xzXHNcc1xzaWYgKGV4cHIpIHtcblx0c3RtdDsgLS1pY2suKSBUaGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBydWxlIGlzCittdWx0aS1saW5lIGNvbW1lbnRzIHRoYXQgdXNlIGFuIGFzdGVyaXNrIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lLCBpLmUuOgorCisJXHQvKgorCVx0ICogVGhpcyBpcyBhIGJsb2NrIGNvbW1lbnQuCisJXHQgKiBOb3RlIHRoYXQgaXQgaGFzIG11bHRpcGxlIGxpbmVzCisJXHQgKiBhbmQgdGhhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBoYXMgYSB0YWIgcGx1cyBhIHNwYWNlCisJXHQgKiBleGNlcHQgZm9yIHRoZSBvcGVuaW5nICcvKicgbGluZSB3aGVyZSB0aGUgc2xhc2gKKwlcdCAqIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHNwYWNlLgorCVx0ICovCisKK0Z1cnRoZXJtb3JlLCBUaGUgcHJlZmVyZW5jZSBpcyB0aGF0IHRhYnMgYmUgc2V0IHRvIGRpc3BsYXkgYXQgZm91ciBzcGFjZXMKK3dpZGUsIGJ1dCB0aGUgYmVhdXR5IG9mIHVzaW5nIG9ubHkgdGFicyAoYW5kIG5vdCBzcGFjZXMpIGF0IHRoZSBiZWdpbm5pbmcgb2YKK2xpbmVzIGlzIHRoYXQgeW91IGNhbiBzZXQgeW91ciBlZGl0b3IgdG8gZGlzcGxheSB0YWJzIGF0ICp3aGF0ZXZlciogbnVtYmVyIG9mCitzcGFjZXMgaXMgZGVzaXJlZCBhbmQgdGhlIGNvZGUgd2lsbCBzdGlsbCBsb29rIGZpbmUuCisKKworT3BlcmF0b3IgU3BhY2luZworfn5+fn5+fn5+fn5+fn5+fgorCitQdXQgc3BhY2VzIGJldHdlZW4gdGVybXMgYW5kIG9wZXJhdG9ycy4gRXhhbXBsZToKKworCURvbid0IGRvIHRoaXM6CisKKwkJZm9yKGk9MDtpPG51bV9pdGVtcztpKyspeworCisJRG8gdGhpcyBpbnN0ZWFkOgorCisJCWZvciAoaSA9IDA7IGkgPCBudW1faXRlbXM7IGkrKykgeworCisJV2hpbGUgaXQgZXh0ZW5kcyB0aGUgbGluZSBhIGJpdCBsb25nZXIsIHRoZSBzcGFjZWQgdmVyc2lvbiBpcyBtb3JlCisJcmVhZGFibGUuIEFuIGFsbG93YWJsZSBleGNlcHRpb24gdG8gdGhpcyBydWxlIGlzIHRoZSBzaXR1YXRpb24gd2hlcmUKKwlleGNsdWRpbmcgdGhlIHNwYWNpbmcgbWFrZXMgaXQgbW9yZSBvYnZpb3VzIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhCisJc2luZ2xlIHRlcm0gKGV2ZW4gaWYgaXQgaXMgYSBjb21wb3VuZCB0ZXJtKSBzdWNoIGFzOgorCisJCWlmIChzdHJbaWR4XSA9PSAnLycgJiYgc3RyW2lkeC0xXSAhPSAnXFwnKQorCisJb3IKKworCQlpZiAoKGFyZ2MtMSkgLSAob3B0aW5kKzEpID4gMCkKKworCitCcmFja2V0IFNwYWNpbmcKK35+fn5+fn5+fn5+fn5+fgorCitJZiBhbiBvcGVuaW5nIGJyYWNrZXQgc3RhcnRzIGEgZnVuY3Rpb24sIGl0IHNob3VsZCBiZSBvbiB0aGUKK25leHQgbGluZSB3aXRoIG5vIHNwYWNpbmcgYmVmb3JlIGl0LiBIb3dldmVyLCBpZiBhIGJyYWNrZXQgZm9sbG93cyBhbiBvcGVuaW5nCitjb250cm9sIGJsb2NrLCBpdCBzaG91bGQgYmUgb24gdGhlIHNhbWUgbGluZSB3aXRoIGEgc2luZ2xlIHNwYWNlIChub3QgYSB0YWIpCitiZXR3ZWVuIGl0IGFuZCB0aGUgb3BlbmluZyBjb250cm9sIGJsb2NrIHN0YXRlbWVudC4gRXhhbXBsZXM6CisKKwlEb24ndCBkbyB0aGlzOgorCisJCXdoaWxlICghZG9uZSkKKwkJeworCisJCWRvCisJCXsKKworCURvbid0IGRvIHRoaXMgZWl0aGVyOgorCisJCXdoaWxlICghZG9uZSl7CisKKwkJZG97CisKKwlBbmQgZm9yIGhlYXZlbidzIHNha2UsIGRvbid0IGRvIHRoaXM6CisKKwkJd2hpbGUgKCFkb25lKQorCQkgIHsKKworCQlkbworCQkgIHsKKworCURvIHRoaXMgaW5zdGVhZDoKKworCQl3aGlsZSAoIWRvbmUpIHsKKworCQlkbyB7CisKK0lmIHlvdSBoYXZlIGxvbmcgbG9naWMgc3RhdGVtZW50cyB0aGF0IG5lZWQgdG8gYmUgd3JhcHBlZCwgdGhlbiB1bmN1ZGRsaW5nCit0aGUgYnJhY2tldCB0byBpbXByb3ZlIHJlYWRhYmlsaXR5IGlzIGFsbG93ZWQuIEdlbmVyYWxseSwgdGhpcyBzdHlsZSBtYWtlcworaXQgZWFzaWVyIGZvciByZWFkZXIgdG8gbm90aWNlIHRoYXQgMm5kIGFuZCBmb2xsb3dpbmcgbGluZXMgYXJlIHN0aWxsCitpbnNpZGUgJ2lmJzoKKworCQlpZiAoc29tZV9yZWFsbHlfbG9uZ19jaGVja3MgJiYgc29tZV9vdGhlcl9yZWFsbHlfbG9uZ19jaGVja3MKKwkJICYmIHNvbWVfbW9yZV9yZWFsbHlfbG9uZ19jaGVja3MKKwkJICYmIGV2ZW5fbW9yZV9vZl9sb25nX2NoZWNrcworCQkpIHsKKwkJCWRvX2Zvb19ub3c7CisKK1NwYWNpbmcgYXJvdW5kIFBhcmVudGhlc2VzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitQdXQgYSBzcGFjZSBiZXR3ZWVuIEMga2V5d29yZHMgYW5kIGxlZnQgcGFyZW5zLCBidXQgbm90IGJldHdlZW4gZnVuY3Rpb24gbmFtZXMKK2FuZCB0aGUgbGVmdCBwYXJlbiB0aGF0IHN0YXJ0cyBpdCdzIHBhcmFtZXRlciBsaXN0ICh3aGV0aGVyIGl0IGlzIGJlaW5nCitkZWNsYXJlZCBvciBjYWxsZWQpLiBFeGFtcGxlczoKKworCURvbid0IGRvIHRoaXM6CisKKwkJd2hpbGUoZm9vKSB7CisJCWZvcihpID0gMDsgaSA8IG47IGkrKykgeworCisJRG8gdGhpcyBpbnN0ZWFkOgorCisJCXdoaWxlIChmb28pIHsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCisJQnV0IGRvIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CisKKwkJc3RhdGljIGludCBteV9mdW5jKGludCBmb28sIGNoYXIgYmFyKQorCQkuLi4KKwkJYmF6ID0gbXlfZnVuYygxLCAyKTsKKworQWxzbywgZG9uJ3QgcHV0IGEgc3BhY2UgYmV0d2VlbiB0aGUgbGVmdCBwYXJlbiBhbmQgdGhlIGZpcnN0IHRlcm0sIG5vciBiZXR3ZWVuCit0aGUgbGFzdCBhcmcgYW5kIHRoZSByaWdodCBwYXJlbi4KKworCURvbid0IGRvIHRoaXM6CisKKwkJaWYgKCB4IDwgMSApCisJCXN0cmNtcCggdGhpc3N0ciwgdGhhdHN0ciApCisKKwlEbyB0aGlzIGluc3RlYWQ6CisKKwkJaWYgKHggPCAxKQorCQlzdHJjbXAodGhpc3N0ciwgdGhhdHN0cikKKworCitDdWRkbGVkIEVsc2VzCit+fn5+fn5+fn5+fn5+CisKK0Fsc28sIHBsZWFzZSAiY3VkZGxlIiB5b3VyIGVsc2Ugc3RhdGVtZW50cyBieSBwdXR0aW5nIHRoZSBlbHNlIGtleXdvcmQgb24gdGhlCitzYW1lIGxpbmUgYWZ0ZXIgdGhlIHJpZ2h0IGJyYWNrZXQgdGhhdCBjbG9zZXMgYW4gJ2lmJyBzdGF0ZW1lbnQuCisKKwlEb24ndCBkbyB0aGlzOgorCisJaWYgKGZvbykgeworCQlzdG10OworCX0KKwllbHNlIHsKKwkJc3RtdDsKKwl9CisKKwlEbyB0aGlzIGluc3RlYWQ6CisKKwlpZiAoZm9vKSB7CisJCXN0bXQ7CisJfSBlbHNlIHsKKwkJc3RtdDsKKwl9CisKK1RoZSBleGNlcHRpb24gdG8gdGhpcyBydWxlIGlzIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgYSBjb21tZW50IGJlZm9yZSB0aGUgZWxzZQorYmxvY2suIEV4YW1wbGU6CisKKwlpZiAoZm9vKSB7CisJCXN0bXRzLi4uCisJfQorCS8qIG90aGVyd2lzZSwgd2UncmUganVzdCBraWRkaW5nIG91cnNlbHZlcywgc28gcmUtZnJvYiB0aGUgaW5wdXQgKi8KKwllbHNlIHsKKwkJb3RoZXJfc3RtdHMuLi4KKwl9CisKKworTGFiZWxzCit+fn5+fn4KKworTGFiZWxzIHNob3VsZCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLCBub3QgaW5kZW50ZWQgdG8gdGhlIGJsb2NrCitsZXZlbCAoYmVjYXVzZSB0aGV5IGRvIG5vdCAiYmVsb25nIiB0byBibG9jayBzY29wZSwgb25seSB0byB3aG9sZSBmdW5jdGlvbikuCisKKwlpZiAoZm9vKSB7CisJCXN0bXQ7CisgbGFiZWw6CisJCXN0bXQyOworCQlzdG10OworCX0KKworKFB1dHRpbmcgbGFiZWwgYXQgcG9zaXRpb24gMSBwcmV2ZW50cyBkaWZmIC1wIGZyb20gY29uZnVzaW5nIGxhYmVsIGZvciBmdW5jdGlvbgorbmFtZSwgYnV0IGl0J3Mgbm90IGEgcG9saWN5IG9mIGJ1c3lib3ggcHJvamVjdCB0byBlbmZvcmNlIHN1Y2ggYSBtaW5vciBkZXRhaWwpLgorCisKKworVmFyaWFibGUgYW5kIEZ1bmN0aW9uIE5hbWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVXNlIHRoZSBLJlIgc3R5bGUgd2l0aCBuYW1lcyBpbiBhbGwgbG93ZXItY2FzZSBhbmQgdW5kZXJzY29yZXMgb2NjYXNpb25hbGx5Cit1c2VkIHRvIHNlcGFyYXRlIHdvcmRzIChlLmcuLCAidmFyaWFibGVfbmFtZSIgYW5kICJudW1jaGFycyIgYXJlIGJvdGgKK2FjY2VwdGFibGUpLiBVc2luZyB1bmRlcnNjb3JlcyBtYWtlcyB2YXJpYWJsZSBhbmQgZnVuY3Rpb24gbmFtZXMgbW9yZSByZWFkYWJsZQorYmVjYXVzZSBpdCBsb29rcyBsaWtlIHdoaXRlc3BhY2U7IHVzaW5nIGxvd2VyLWNhc2UgaXMgZWFzeSBvbiB0aGUgZXllcy4KKworCUZyb3duZWQgdXBvbjoKKworCQloaXRMaXN0CisJCVRvdGFsQ2hhcnMKKwkJc3pGaWxlTmFtZQorCQlwZl9OZm9sX1RyaVN0YXRlCisKKwlQcmVmZXJyZWQ6CisKKwkJaGl0X2xpc3QKKwkJdG90YWxfY2hhcnMKKwkJZmlsZV9uYW1lCisJCXNlbnNpYmxlX25hbWUKKworRXhjZXB0aW9uczoKKworIC0gRW51bXMsIG1hY3JvcywgYW5kIGNvbnN0YW50IHZhcmlhYmxlcyBhcmUgb2NjYXNpb25hbGx5IHdyaXR0ZW4gaW4gYWxsCisgICB1cHBlci1jYXNlIHdpdGggd29yZHMgb3B0aW9uYWxseSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMgKGkuZS4gRklGT19UWVBFLAorICAgSVNCTEtERVYoKSkuCisKKyAtIE5vYm9keSBpcyBnb2luZyB0byBnZXQgbWFkIGF0IHlvdSBmb3IgdXNpbmcgJ3B2YXInIGFzIHRoZSBuYW1lIG9mIGEKKyAgIHZhcmlhYmxlIHRoYXQgaXMgYSBwb2ludGVyIHRvICd2YXInLgorCisKK0NvbnZlcnRpbmcgdG8gSyZSCit+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgQnVzeWJveCBjb2RlYmFzZSBpcyB2ZXJ5IG11Y2ggYSBtaXh0dXJlIG9mIGNvZGUgZ2F0aGVyZWQgZnJvbSBhIHZhcmlldHkgb2YKK3NvdXJjZXMuIFRoaXMgZXhwbGFpbnMgd2h5IHRoZSBjdXJyZW50IGNvZGViYXNlIGNvbnRhaW5zIHN1Y2ggYSBob2RnZS1wb2RnZSBvZgorZGlmZmVyZW50IG5hbWluZyBzdHlsZXMgKEphdmEsIFBhc2NhbCwgSyZSLCBqdXN0LXBsYWluLXdlaXJkLCBldGMuKS4gVGhlIEsmUgorZ3VpZGVsaW5lIGV4cGxhaW5lZCBhYm92ZSBzaG91bGQgdGhlcmVmb3JlIGJlIHVzZWQgb24gbmV3IGZpbGVzIHRoYXQgYXJlIGFkZGVkCit0byB0aGUgcmVwb3NpdG9yeS4gRnVydGhlcm1vcmUsIHRoZSBtYWludGFpbmVyIG9mIGFuIGV4aXN0aW5nIGZpbGUgdGhhdCB1c2VzCithbHRlcm5hdGUgbmFtaW5nIGNvbnZlbnRpb25zIHNob3VsZCwgYXQgaGlzIG93biBjb252ZW5pZW5jZSwgY29udmVydCB0aG9zZQorbmFtZXMgb3ZlciB0byBLJlIgc3R5bGUuIENvbnZlcnRpbmcgdmFyaWFibGUgbmFtZXMgaXMgYSB2ZXJ5IGxvdyBwcmlvcml0eQordGFzay4KKworSWYgeW91IHdhbnQgdG8gZG8gYSBzZWFyY2gtYW5kLXJlcGxhY2Ugb2YgYSBzaW5nbGUgdmFyaWFibGUgbmFtZSBpbiBkaWZmZXJlbnQKK2ZpbGVzLCB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGJ1c3lib3ggZGlyZWN0b3J5OgorCisJJCBwZXJsIC1waSAtZSAncy9cYk9sZFZhclxiL25ld192YXIvZycgKi5bY2hdCisKK0lmIHlvdSB3YW50IHRvIGNvbnZlcnQgYWxsIHRoZSBub24tSyZSIHZhcnMgaW4geW91ciBmaWxlIGFsbCBhdCBvbmNlLCBmb2xsb3cKK3RoZXNlIHN0ZXBzOgorCisgLSBJbiB0aGUgYnVzeWJveCBkaXJlY3RvcnkgdHlwZSAnZXhhbXBsZXMvbWsya25yLnBsIGZpbGVzLXRvLWNvbnZlcnQnLiBUaGlzCisgICBkb2VzIG5vdCBkbyB0aGUgYWN0dWFsIGNvbnZlcnNpb24sIHJhdGhlciwgaXQgZ2VuZXJhdGVzIGEgc2NyaXB0IGNhbGxlZAorICAgJ2NvbnZlcnRtZS5wbCcgdGhhdCBzaG93cyB3aGF0IHdpbGwgYmUgY29udmVydGVkLCBnaXZpbmcgeW91IGEgY2hhbmNlIHRvCisgICByZXZpZXcgdGhlIGNoYW5nZXMgYmVmb3JlaGFuZC4KKworIC0gUmV2aWV3IHRoZSAnY29udmVydG1lLnBsJyBzY3JpcHQgdGhhdCBnZXRzIGdlbmVyYXRlZCBpbiB0aGUgYnVzeWJveAorICAgZGlyZWN0b3J5IGFuZCByZW1vdmUgLyBlZGl0IGFueSBvZiB0aGUgc3Vic3RpdHV0aW9ucyBpbiB0aGVyZS4gUGxlYXNlCisgICBlc3BlY2lhbGx5IGNoZWNrIGZvciBmYWxzZSBwb3NpdGl2ZXMgKHN0cmluZ3MgdGhhdCBzaG91bGQgbm90IGJlCisgICBjb252ZXJ0ZWQpLgorCisgLSBUeXBlICcuL2NvbnZlcnRtZS5wbCBzYW1lLWZpbGVzLWFzLWJlZm9yZScgdG8gcGVyZm9ybSB0aGUgYWN0dWFsCisgICBjb252ZXJzaW9uLgorCisgLSBDb21waWxlIGFuZCBzZWUgaWYgZXZlcnl0aGluZyBzdGlsbCB3b3Jrcy4KKworUGxlYXNlIGJlIGF3YXJlIG9mIGNoYW5nZXMgdGhhdCBoYXZlIGNhc2NhZGluZyBlZmZlY3RzIGludG8gb3RoZXIgZmlsZXMuIEZvcgorZXhhbXBsZSwgaWYgeW91J3JlIGNoYW5naW5nIHRoZSBuYW1lIG9mIHNvbWV0aGluZyBpbiwgc2F5IHV0aWxpdHkuYywgeW91CitzaG91bGQgcHJvYmFibHkgcnVuICdleGFtcGxlcy9tazJrbnIucGwgdXRpbGl0eS5jJyBhdCBmaXJzdCwgYnV0IHdoZW4geW91IHJ1bgordGhlICdjb252ZXJ0bWUucGwnIHNjcmlwdCB5b3Ugc2hvdWxkIHJ1biBpdCBvbiBfYWxsXyBmaWxlcyBsaWtlIHNvOgorJy4vY29udmVydG1lLnBsICouW2NoXScuCisKKworCitBdm9pZCBUaGUgUHJlcHJvY2Vzc29yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0F0IGJlc3QsIHRoZSBwcmVwcm9jZXNzb3IgaXMgYSBuZWNlc3NhcnkgZXZpbCwgaGVscGluZyB1cyBhY2NvdW50IGZvciBwbGF0Zm9ybQorYW5kIGFyY2hpdGVjdHVyZSBkaWZmZXJlbmNlcy4gVXNpbmcgdGhlIHByZXByb2Nlc3NvciB1bm5lY2Vzc2FyaWx5IGlzIGp1c3QKK3BsYWluIGV2aWwuCisKKworVGhlIEZvbGx5IG9mICNkZWZpbmUKK35+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1VzZSAnY29uc3QgPHR5cGU+IHZhcicgZm9yIGRlY2xhcmluZyBjb25zdGFudHMuCisKKwlEb24ndCBkbyB0aGlzOgorCisJCSNkZWZpbmUgQ09OU1QgODAKKworCURvIHRoaXMgaW5zdGVhZCwgd2hlbiB0aGUgdmFyaWFibGUgaXMgaW4gYSBoZWFkZXIgZmlsZSBhbmQgd2lsbCBiZSB1c2VkIGluCisJc2V2ZXJhbCBzb3VyY2UgZmlsZXM6CisKKwkJZW51bSB7IENPTlNUID0gODAgfTsKKworQWx0aG91Z2ggZW51bSBtYXkgbG9vayB1Z2x5IHRvIHNvbWUgcGVvcGxlLCBpdCBpcyBiZXR0ZXIgZm9yIGNvZGUgc2l6ZS4KK1dpdGggImNvbnN0IGludCIgY29tcGlsZXIgbWF5IGZhaWwgdG8gb3B0aW1pemUgaXQgb3V0IGFuZCB3aWxsIHJlc2VydmUKK2EgcmVhbCBzdG9yYWdlIGluIHJvZGF0YSBmb3IgaXQhIChIb3BlZnVsbHksIG5ld2VyIGdjYyB3aWxsIGdldCBiZXR0ZXIKK2F0IGl0Li4uKS4gIFdpdGggImRlZmluZSIsIHlvdSBoYXZlIHNsaWdodCByaXNrIG9mIHBvbGx1dGluZyBuYW1lc3BhY2UKKygjZGVmaW5lIGRvZXNuJ3QgYWxsb3cgeW91IHRvIHJlZGVmaW5lIHRoZSBuYW1lIGluIHRoZSBpbm5lciBzY29wZXMpLAorYW5kIGNvbXBsZXggImRlZmluZSIgYXJlIGV2YWx1YXRlZCBlYWNoIHRpbWUgdGhleSB1ZXNkLCBub3Qgb25jZQorYXQgZGVjbGFyYXRpb25zIGxpa2UgZW51bXMuIEFsc28sIHRoZSBwcmVwcm9jZXNzb3IgZG9lcyBfbm9fIHR5cGUgY2hlY2tpbmcKK3doYXRzb2V2ZXIsIG1ha2luZyBpdCBtdWNoIG1vcmUgZXJyb3IgcHJvbmUuCisKKworVGhlIEZvbGx5IG9mIE1hY3Jvcworfn5+fn5+fn5+fn5+fn5+fn5+fgorCitVc2UgJ3N0YXRpYyBpbmxpbmUnIGluc3RlYWQgb2YgYSBtYWNyby4KKworCURvbid0IGRvIHRoaXM6CisKKwkJI2RlZmluZSBtaW5pX2Z1bmMocGFyYW0xLCBwYXJhbTIpIChwYXJhbTEgPDwgcGFyYW0yKQorCisJRG8gdGhpcyBpbnN0ZWFkOgorCisJCXN0YXRpYyBpbmxpbmUgaW50IG1pbmlfZnVuYyhpbnQgcGFyYW0xLCBwYXJhbTIpCisJCXsKKwkJCXJldHVybiAocGFyYW0xIDw8IHBhcmFtMik7CisJCX0KKworU3RhdGljIGlubGluZSBmdW5jdGlvbnMgYXJlIGdyZWF0bHkgcHJlZmVycmVkIG92ZXIgbWFjcm9zLiBUaGV5IHByb3ZpZGUgdHlwZQorc2FmZXR5LCBoYXZlIG5vIGxlbmd0aCBsaW1pdGF0aW9ucywgbm8gZm9ybWF0dGluZyBsaW1pdGF0aW9ucywgaGF2ZSBhbiBhY3R1YWwKK3JldHVybiB2YWx1ZSwgYW5kIHVuZGVyIGdjYyB0aGV5IGFyZSBhcyBjaGVhcCBhcyBtYWNyb3MuIEJlc2lkZXMsIHJlYWxseSBsb25nCittYWNyb3Mgd2l0aCBiYWNrc2xhc2hlcyBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZSBhcmUgdWdseSBhcyBzaW4uCisKKworVGhlIEZvbGx5IG9mICNpZmRlZgorfn5+fn5+fn5+fn5+fn5+fn5+fgorCitDb2RlIGNsdXR0ZXJlZCB3aXRoIGlmZGVmcyBpcyBkaWZmaWN1bHQgdG8gcmVhZCBhbmQgbWFpbnRhaW4uIERvbid0IGRvIGl0LgorSW5zdGVhZCwgcHV0IHlvdXIgaWZkZWZzIGF0IHRoZSB0b3Agb2YgeW91ciAuYyBmaWxlIChvciBpbiBhIGhlYWRlciksIGFuZAorY29uZGl0aW9uYWxseSBkZWZpbmUgJ3N0YXRpYyBpbmxpbmUnIGZ1bmN0aW9ucywgKG9yICptYXliZSogbWFjcm9zKSwgd2hpY2ggYXJlCit1c2VkIGluIHRoZSBjb2RlLgorCisJRG9uJ3QgZG8gdGhpczoKKworCQlyZXQgPSBteV9mdW5jKGJhciwgYmF6KTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gLTE7CisJCSNpZmRlZiBDT05GSUdfRkVBVFVSRV9GVU5LWQorCQkJbWF5YmVfZG9fZnVua3lfc3R1ZmYoYmFyLCBiYXopOworCQkjZW5kaWYKKworCURvIHRoaXMgaW5zdGVhZDoKKworCShpbiAuaCBoZWFkZXIgZmlsZSkKKworCQkjaWYgRU5BQkxFX0ZFQVRVUkVfRlVOS1kKKwkJc3RhdGljIGlubGluZSB2b2lkIG1heWJlX2RvX2Z1bmt5X3N0dWZmKGludCBiYXIsIGludCBiYXopCisJCXsKKwkJCS8qIGxvdHNhIGNvZGUgaW4gaGVyZSAqLworCQl9CisJCSNlbHNlCisJCXN0YXRpYyBpbmxpbmUgdm9pZCBtYXliZV9kb19mdW5reV9zdHVmZihpbnQgYmFyLCBpbnQgYmF6KSB7fQorCQkjZW5kaWYKKworCShpbiB0aGUgLmMgc291cmNlIGZpbGUpCisKKwkJcmV0ID0gbXlfZnVuYyhiYXIsIGJheik7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIC0xOworCQltYXliZV9kb19mdW5reV9zdHVmZihiYXIsIGJheik7CisKK1RoZSBncmVhdCB0aGluZyBhYm91dCB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgYXdheQordGhlICJuby1vcCIgY2FzZSAodGhlIGVtcHR5IGZ1bmN0aW9uKSB3aGVuIHRoZSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYuCisKK05vdGUgYWxzbyB0aGUgdXNlIG9mIHRoZSB3b3JkICdtYXliZScgaW4gdGhlIGZ1bmN0aW9uIG5hbWUgdG8gaW5kaWNhdGUKK2NvbmRpdGlvbmFsIGV4ZWN1dGlvbi4KKworCisKK05vdGVzIG9uIFN0cmluZ3MKKy0tLS0tLS0tLS0tLS0tLS0KKworU3RyaW5ncyBpbiBDIGNhbiBnZXQgYSBsaXR0bGUgdGhvcm55LiBIZXJlJ3Mgc29tZSBndWlkZWxpbmVzIGZvciBkZWFsaW5nIHdpdGgKK3N0cmluZ3MgaW4gQnVzeWJveC4gKFRoZXJlIGlzIHN1cmVseSBtb3JlIHRoYXQgY291bGQgYmUgYWRkZWQgdG8gdGhpcworc2VjdGlvbi4pCisKKworU3RyaW5nIEZpbGVzCit+fn5+fn5+fn5+fn4KKworUHV0IGFsbCBoZWxwL3VzYWdlIG1lc3NhZ2VzIGluIHVzYWdlLmMuIFB1dCBvdGhlciBzdHJpbmdzIGluIG1lc3NhZ2VzLmMuCitQdXR0aW5nIHRoZXNlIHN0cmluZ3MgaW50byB0aGVpciBvd24gZmlsZSBpcyBhIGNhbGN1bGF0ZWQgZGVjaXNpb24gZGVzaWduZWQgdG8KK2NvbmZpbmUgc3BlbGxpbmcgZXJyb3JzIHRvIGEgc2luZ2xlIHBsYWNlIGFuZCBhaWQgaW50ZXJuYXRpb25hbGl6YXRpb24KK2VmZm9ydHMsIGlmIG5lZWRlZC4gKFNpZGUgTm90ZTogd2UgbWlnaHQgd2FudCB0byB1c2UgYSBzaW5nbGUgZmlsZSAtIG1heWJlCitjYWxsZWQgJ3N0cmluZ3MuYycgLSBpbnN0ZWFkIG9mIHR3bywgZm9vZCBmb3IgdGhvdWdodCkuCisKKworVGVzdGluZyBTdHJpbmcgRXF1aXZhbGVuY2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZXJlJ3MgYSByaWdodCB3YXkgYW5kIGEgd3Jvbmcgd2F5IHRvIHRlc3QgZm9yIHN0cmluZyBlcXVpdmFsZW5jZSB3aXRoCitzdHJjbXAoKToKKworCVRoZSB3cm9uZyB3YXk6CisKKwkJaWYgKCFzdHJjbXAoc3RyaW5nLCAiZm9vIikpIHsKKwkJCS4uLgorCisJVGhlIHJpZ2h0IHdheToKKworCQlpZiAoc3RyY21wKHN0cmluZywgImZvbyIpID09IDApeworCQkJLi4uCisKK1RoZSB1c2Ugb2YgdGhlICJlcXVhbHMiICg9PSkgb3BlcmF0b3IgaW4gdGhlIGxhdHRlciBleGFtcGxlIG1ha2VzIGl0IG11Y2ggbW9yZQorb2J2aW91cyB0aGF0IHlvdSBhcmUgdGVzdGluZyBmb3IgZXF1aXZhbGVuY2UuIFRoZSBmb3JtZXIgZXhhbXBsZSB3aXRoIHRoZQorIm5vdCIgKCEpIG9wZXJhdG9yIG1ha2VzIGl0IGxvb2sgbGlrZSB5b3UgYXJlIHRlc3RpbmcgZm9yIGFuIGVycm9yLiBJbiBhIG1vcmUKK3BlcmZlY3Qgd29ybGQsIHdlIHdvdWxkIGhhdmUgYSBzdHJlcSgpIGZ1bmN0aW9uIGluIHRoZSBzdHJpbmcgbGlicmFyeSwgYnV0Cit0aGF0IGFpbid0IHRoZSB3b3JsZCB3ZSdyZSBsaXZpbmcgaW4uCisKKworQXZvaWQgRGFuZ2Vyb3VzIFN0cmluZyBGdW5jdGlvbnMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1VuZm9ydHVuYXRlbHksIHRoZSB3YXkgQyBoYW5kbGVzIHN0cmluZ3MgbWFrZXMgdGhlbSBwcm9uZSB0byBvdmVycnVucyB3aGVuCitjZXJ0YWluIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSAobWlzKXVzZWQuIFRoZSBmb2xsb3dpbmcgdGFibGUgIG9mZmVycyBhIHN1bW1hcnkKK29mIHNvbWUgb2YgdGhlIG1vcmUgbm90b3Jpb3VzIHRyb3VibGVtYWtlcnM6CisKK2Z1bmN0aW9uICAgICBvdmVyZmxvd3MgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmNweSAgICAgICBkZXN0IHN0cmluZyAgICAgICAgICAgICAgICBzYWZlX3N0cm5jcHkKK3N0cm5jcHkgICAgICBtYXkgZmFpbCB0byAwLXRlcm1pbmF0ZSBkc3Qgc2FmZV9zdHJuY3B5CitzdHJjYXQgICAgICAgZGVzdCBzdHJpbmcgICAgICAgICAgICAgICAgc3RybmNhdAorZ2V0cyAgICAgICAgIHN0cmluZyBpdCBnZXRzICAgICAgICAgICAgIGZnZXRzCitnZXR3ZCAgICAgICAgYnVmIHN0cmluZyAgICAgICAgICAgICAgICAgZ2V0Y3dkCitbdl1zcHJpbnRmICAgc3RyIGJ1ZmZlciAgICAgICAgICAgICAgICAgW3Zdc25wcmludGYKK3JlYWxwYXRoICAgICBwYXRoIGJ1ZmZlciAgICAgICAgICAgICAgICB1c2Ugd2l0aCBwYXRoY29uZgorW3ZmXXNjYW5mICAgIGl0cyBhcmd1bWVudHMgICAgICAgICAgICAgIGp1c3QgYXZvaWQgaXQKKworCitUaGUgYWJvdmUgaXMgYnkgbm8gbWVhbnMgYSBjb21wbGV0ZSBsaXN0LiBCZSBjYXJlZnVsIG91dCB0aGVyZS4KKworCisKK0F2b2lkIEJpZyBTdGF0aWMgQnVmZmVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpcnN0LCBzb21lIGJhY2tncm91bmQgdG8gcHV0IHRoaXMgZGlzY3Vzc2lvbiBpbiBjb250ZXh0OiBzdGF0aWMgYnVmZmVycyBsb29rCitsaWtlIHRoaXMgaW4gY29kZToKKworCS8qIGluIGEgLmMgZmlsZSBvdXRzaWRlIGFueSBmdW5jdGlvbnMgKi8KKwlzdGF0aWMgY2hhciBidWZmZXJbQlVGU0laXTsgLyogaGFwcGlseSB1c2VkIGJ5IGFueSBmdW5jdGlvbiBpbiB0aGlzIGZpbGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaWNrISBiaWchICovCisKK1RoZSBwcm9ibGVtIHdpdGggdGhlc2UgaXMgdGhhdCBhbnkgdGltZSBhbnkgYnVzeWJveCBhcHAgaXMgcnVuLCB5b3UgcGF5IGEKK21lbW9yeSBwZW5hbHR5IGZvciB0aGlzIGJ1ZmZlciwgZXZlbiBpZiB0aGUgYXBwbGV0IHRoYXQgdXNlcyBzYWlkIGJ1ZmZlciBpcworbm90IHJ1bi4gVGhpcyBjYW4gYmUgZml4ZWQsIHRodXNseToKKworCXN0YXRpYyBjaGFyICpidWZmZXI7CisJLi4uCisJb3RoZXJfZnVuYygpCisJeworCQlzdHJjcHkoYnVmZmVyLCBsb3RzYV9jaGFycyk7IC8qIGhhcHBpbHkgdXNlcyBnbG9iYWwgKmJ1ZmZlciAqLworCS4uLgorCWZvb19tYWluKCkKKwl7CisJCWJ1ZmZlciA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIpKkJVRlNJWik7CisJLi4uCisKK0hvd2V2ZXIsIHRoaXMgYXBwcm9hY2ggdHJhZGVzIGJzcyBzZWdtZW50IGZvciB0ZXh0IHNlZ21lbnQuIFJhdGhlciB0aGFuCittYWxsb2NpbmcgdGhlIGJ1ZmZlcnMgKGFuZCB0aHVzIGdyb3dpbmcgdGhlIHRleHQgc2l6ZSksIGJ1ZmZlcnMgY2FuIGJlCitkZWNsYXJlZCBvbiB0aGUgc3RhY2sgaW4gdGhlICpfbWFpbigpIGZ1bmN0aW9uIGFuZCBtYWRlIGF2YWlsYWJsZSBnbG9iYWxseSBieQorYXNzaWduaW5nIHRoZW0gdG8gYSBnbG9iYWwgcG9pbnRlciB0aHVzbHk6CisKKwlzdGF0aWMgY2hhciAqcGJ1ZmZlcjsKKwkuLi4KKwlvdGhlcl9mdW5jKCkKKwl7CisJCXN0cmNweShwYnVmZmVyLCBsb3RzYV9jaGFycyk7IC8qIGhhcHBpbHkgdXNlcyBnbG9iYWwgKnBidWZmZXIgKi8KKwkuLi4KKwlmb29fbWFpbigpCisJeworCQljaGFyICpidWZmZXJbQlVGU0laXTsgLyogZGVjbGFyZWQgbG9jYWxseSwgb24gc3RhY2sgKi8KKwkJcGJ1ZmZlciA9IGJ1ZmZlcjsgICAgIC8qIGJ1dCBhdmFpbGFibGUgZ2xvYmFsbHkgKi8KKwkuLi4KKworVGhpcyBsYXN0IGFwcHJvYWNoIGhhcyBzb21lIGFkdmFudGFnZXMgKGxvdyBjb2RlIHNpemUsIHNwYWNlIG5vdCB1c2VkIHVudGlsCitpdCdzIG5lZWRlZCksIGJ1dCBjYW4gYmUgYSBwcm9ibGVtIGluIHNvbWUgbG93IHJlc291cmNlIG1hY2hpbmVzIHRoYXQgaGF2ZQordmVyeSBsaW1pdGVkIHN0YWNrIHNwYWNlIChlLmcuLCB1Q0xpbnV4KS4KKworQSBtYWNybyBpcyBkZWNsYXJlZCBpbiBidXN5Ym94LmggdGhhdCBpbXBsZW1lbnRzIGNvbXBpbGUtdGltZSBzZWxlY3Rpb24KK2JldHdlZW4geG1hbGxvYygpIGFuZCBzdGFjayBjcmVhdGlvbiwgc28geW91IGNhbiBjb2RlIHRoZSBsaW5lIGluIHF1ZXN0aW9uIGFzCisKKwkJUkVTRVJWRV9DT05GSUdfQlVGRkVSKGJ1ZmZlciwgQlVGU0laKTsKKworYW5kIHRoZSByaWdodCB0aGluZyB3aWxsIGhhcHBlbiwgYmFzZWQgb24geW91ciBjb25maWd1cmF0aW9uLgorCitBbm90aGVyIHJlbGF0aXZlbHkgbmV3IHRyaWNrIG9mIHNpbWlsYXIgbmF0dXJlIGlzIGV4cGxhaW5lZAoraW4ga2VlcF9kYXRhX3NtYWxsLnR4dC4KKworCisKK01pc2NlbGxhbmVvdXMgQ29kaW5nIEd1aWRlbGluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBhcmUgaW1wb3J0YW50IGl0ZW1zIHRoYXQgZG9uJ3QgZml0IGludG8gYW55IG9mIHRoZSBhYm92ZQorc2VjdGlvbnMuCisKKworTW9kZWwgQnVzeWJveCBBcHBsZXRzIEFmdGVyIEdOVSBDb3VudGVycGFydHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1doZW4gaW4gZG91YnQgYWJvdXQgdGhlIHByb3BlciBiZWhhdmlvciBvZiBhIEJ1c3lib3ggcHJvZ3JhbSAob3V0cHV0LAorZm9ybWF0dGluZywgb3B0aW9ucywgZXRjLiksIG1vZGVsIGl0IGFmdGVyIHRoZSBlcXVpdmFsZW50IEdOVSBwcm9ncmFtLgorRG9lc24ndCBtYXR0ZXIgaG93IHRoYXQgcHJvZ3JhbSBiZWhhdmVzIG9uIHNvbWUgb3RoZXIgZmxhdm9yIG9mICpOSVg7IGRvZXNuJ3QKK21hdHRlciB3aGF0IHRoZSBQT1NJWCBzdGFuZGFyZCBzYXlzIG9yIGRvZXNuJ3Qgc2F5LCBqdXN0IG1vZGVsIEJ1c3lib3gKK3Byb2dyYW1zIGFmdGVyIHRoZWlyIEdOVSBjb3VudGVycGFydHMgYW5kIGl0IHdpbGwgbWFrZSBsaWZlIGVhc2llciBvbiAobmVhcmx5KQorZXZlcnlvbmUuCisKK1RoZSBvbmx5IHRpbWUgd2UgZGV2aWF0ZSBmcm9tIGVtdWxhdGluZyB0aGUgR05VIGJlaGF2aW9yIGlzIHdoZW46CisKKwktIFdlIGFyZSBkZWxpYmVyYXRlbHkgbm90IHN1cHBvcnRpbmcgYSBmZWF0dXJlIChzdWNoIGFzIGEgY29tbWFuZCBsaW5lCisJICBzd2l0Y2gpCisJLSBFbXVsYXRpbmcgdGhlIEdOVSBiZWhhdmlvciBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSAobG90cyBtb3JlIGNvZGUKKwkgIHdvdWxkIGJlIHJlcXVpcmVkLCBsb3RzIG1vcmUgbWVtb3J5IHdvdWxkIGJlIHVzZWQsIGV0Yy4pCisJLSBUaGUgZGlmZmVyZW5jZSBpcyBtaW5vciBvciBjb3NtZXRpYworCitBIG5vdGUgb24gdGhlICdjb3NtZXRpYycgY2FzZTogb3V0cHV0IGRpZmZlcmVuY2VzIG1pZ2h0IGJlIGNvbnNpZGVyZWQKK2Nvc21ldGljLCBidXQgaWYgdGhlIG91dHB1dCBpcyBzaWduaWZpY2FudCBlbm91Z2ggdG8gYnJlYWsgb3RoZXIgc2NyaXB0cyB0aGF0Cit1c2UgdGhlIG91dHB1dCwgaXQgc2hvdWxkIHJlYWxseSBiZSBmaXhlZC4KKworCitTY29wZQorfn5+fn4KKworSWYgYSBjb25zdCB2YXJpYWJsZSBpcyB1c2VkIG9ubHkgaW4gYSBzaW5nbGUgc291cmNlIGZpbGUsIHB1dCBpdCBpbiB0aGUgc291cmNlCitmaWxlIGFuZCBub3QgaW4gYSBoZWFkZXIgZmlsZS4gTGlrZXdpc2UsIGlmIGEgY29uc3QgdmFyaWFibGUgaXMgdXNlZCBpbiBvbmx5CitvbmUgZnVuY3Rpb24sIGRvIG5vdCBtYWtlIGl0IGdsb2JhbCB0byB0aGUgZmlsZS4gSW5zdGVhZCwgZGVjbGFyZSBpdCBpbnNpZGUKK3RoZSBmdW5jdGlvbiBib2R5LiBCb3R0b20gbGluZTogTWFrZSBhIGNvbnNjaW91cyBlZmZvcnQgdG8gbGltaXQgZGVjbGFyYXRpb25zCit0byB0aGUgc21hbGxlc3Qgc2NvcGUgcG9zc2libGUuCisKK0luc2lkZSBhcHBsZXQgZmlsZXMsIGFsbCBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIHN0YXRpYyBzbyBhcyB0byBrZWVwIHRoZQorZ2xvYmFsIG5hbWUgc3BhY2UgY2xlYW4uIFRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgaXMgdGhlICJhcHBsZXRfbWFpbiIKK2Z1bmN0aW9uIHdoaWNoIG11c3QgYmUgZGVjbGFyZWQgZXh0ZXJuLgorCitJZiB5b3Ugd3JpdGUgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgdGFzayB0aGF0IGNvdWxkIGJlIHVzZWZ1bCBvdXRzaWRlIHRoZQoraW1tZWRpYXRlIGZpbGUsIHR1cm4gaXQgaW50byBhIGdlbmVyYWwtcHVycG9zZSBmdW5jdGlvbiB3aXRoIG5vIHRpZXMgdG8gYW55CithcHBsZXQgYW5kIHB1dCBpdCBpbiB0aGUgdXRpbGl0eS5jIGZpbGUgaW5zdGVhZC4KKworCitCcmFja2V0cyBBcmUgWW91ciBGcmllbmRzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1BsZWFzZSB1c2UgYnJhY2tldHMgb24gYWxsIGlmIGFuZCBlbHNlIHN0YXRlbWVudHMsIGV2ZW4gaWYgaXQgaXMgb25seSBvbmUKK2xpbmUuIEV4YW1wbGU6CisKKwlEb24ndCBkbyB0aGlzOgorCisJCWlmIChmb28pCisJCQlzdG10MTsKKwkJc3RtdDIKKwkJc3RtdDM7CisKKwlEbyB0aGlzIGluc3RlYWQ6CisKKwkJaWYgKGZvbykgeworCQkJc3RtdDE7CisJCX0KKwkJc3RtdDIKKwkJc3RtdDM7CisKK1RoZSAiYnJhY2tldGxlc3MiIGFwcHJvYWNoIGlzIGVycm9yIHByb25lIGJlY2F1c2Ugc29tZWRheSB5b3UgbWlnaHQgYWRkIGEgbGluZQorbGlrZSB0aGlzOgorCisJCWlmIChmb28pCisJCQlzdG10MTsKKwkJCW5ld19saW5lKCk7CisJCXN0bXQyOworCQlzdG10MzsKKworQW5kIHRoZSByZXN1bHRpbmcgYmVoYXZpb3Igb2YgeW91ciBwcm9ncmFtIHdvdWxkIHRvdGFsbHkgYmV3aWxkZXIgeW91LiAoRG9uJ3QKK2xhdWdoLCBpdCBoYXBwZW5zIHRvIHVzIGFsbC4pIFJlbWVtYmVyIGZvbGtzLCB0aGlzIGlzIEMsIG5vdCBQeXRob24uCisKKworRnVuY3Rpb24gRGVjbGFyYXRpb25zCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworRG8gbm90IHVzZSBvbGQtc3R5bGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIHRoYXQgZGVjbGFyZSB2YXJpYWJsZSB0eXBlcyBiZXR3ZWVuCit0aGUgcGFyYW1ldGVyIGxpc3QgYW5kIG9wZW5pbmcgYnJhY2tldC4gRXhhbXBsZToKKworCURvbid0IGRvIHRoaXM6CisKKwkJaW50IGZvbyhwYXJtMSwgcGFybTIpCisJCQljaGFyIHBhcm0xOworCQkJZmxvYXQgcGFybTI7CisJCXsKKwkJCS4uLi4KKworCURvIHRoaXMgaW5zdGVhZDoKKworCQlpbnQgZm9vKGNoYXIgcGFybTEsIGZsb2F0IHBhcm0yKQorCQl7CisJCQkuLi4uCisKK1RoZSBvbmx5IHRpbWUgeW91IHdvdWxkIGV2ZXIgbmVlZCB0byB1c2UgdGhlIG9sZCBkZWNsYXJhdGlvbiBzeW50YXggaXMgdG8KK3N1cHBvcnQgYW5jaWVudCwgYW50ZWRpbHV2aWFuIGNvbXBpbGVycy4gVG8gb3VyIGdvb2QgZm9ydHVuZSwgd2UgaGF2ZSBhY2Nlc3MKK3RvIG1vcmUgbW9kZXJuIGNvbXBpbGVycyBhbmQgdGhlIG9sZCBkZWNsYXJhdGlvbiBzeW50YXggaXMgbmVpdGhlciBuZWNlc3NhcnkKK25vciBkZXNpcmVkLgorCisKK0VtcGhhc2l6aW5nIExvZ2ljYWwgQmxvY2tzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitPcmdhbml6YXRpb24gYW5kIHJlYWRhYmlsaXR5IGFyZSBpbXByb3ZlZCBieSBwdXR0aW5nIGV4dHJhIG5ld2xpbmVzIGFyb3VuZAorYmxvY2tzIG9mIGNvZGUgdGhhdCBwZXJmb3JtIGEgc2luZ2xlIHRhc2suIFRoZXNlIGFyZSB0eXBpY2FsbHkgYmxvY2tzIHRoYXQKK2JlZ2luIHdpdGggYSBDIGtleXdvcmQsIGJ1dCBub3QgYWx3YXlzLgorCitGdXJ0aGVybW9yZSwgeW91IHNob3VsZCBwdXQgYSBzaW5nbGUgY29tbWVudCAobm90IG5lY2Vzc2FyaWx5IG9uZSBsaW5lLCBqdXN0CitvbmUgY29tbWVudCkgYmVmb3JlIHRoZSBibG9jaywgcmF0aGVyIHRoYW4gY29tbWVudGluZyBlYWNoIGFuZCBldmVyeSBsaW5lLgorVGhlcmUgaXMgYW4gb3B0aW1hbCBhbW91bnQgb2YgY29tbWVudGluZyB0aGF0IGEgcHJvZ3JhbSBjYW4gaGF2ZTsgeW91IGNhbgorY29tbWVudCB0b28gbXVjaCBhcyB3ZWxsIGFzIHRvbyBsaXR0bGUuCisKK0EgcGljdHVyZSBpcyByZWFsbHkgd29ydGggYSB0aG91c2FuZCB3b3JkcyBoZXJlLCB0aGUgZm9sbG93aW5nIGV4YW1wbGUKK2lsbHVzdHJhdGVzIGhvdyB0byBlbXBoYXNpemUgbG9naWNhbCBibG9ja3M6CisKKwl3aGlsZSAobGluZSA9IHhtYWxsb2NfZmdldHMoZnApKSB7CisKKwkJLyogZWF0IHRoZSBuZXdsaW5lLCBpZiBhbnkgKi8KKwkJY2hvbXAobGluZSk7CisKKwkJLyogaWdub3JlIGJsYW5rIGxpbmVzICovCisJCWlmIChzdHJsZW4oZmlsZV90b19hY3Rfb24pID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogaWYgdGhlIHNlYXJjaCBzdHJpbmcgaXMgaW4gdGhpcyBsaW5lLCBwcmludCBpdCwKKwkJICogdW5sZXNzIHdlIHdlcmUgdG9sZCB0byBiZSBxdWlldCAqLworCQlpZiAoc3Ryc3RyKGxpbmUsIHNlYXJjaCkgJiYgIWJlX3F1aWV0KSB7CisJCQlwdXRzKGxpbmUpOworCQl9CisKKwkJLyogY2xlYW4gdXAgKi8KKwkJZnJlZShsaW5lKTsKKwl9CisKKworUHJvY2Vzc2luZyBPcHRpb25zIHdpdGggZ2V0b3B0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgeW91ciBhcHBsZXQgbmVlZHMgdG8gcHJvY2VzcyBjb21tYW5kLWxpbmUgc3dpdGNoZXMsIHBsZWFzZSB1c2UgZ2V0b3B0MzIoKSB0bworZG8gc28uIE51bWVyb3VzIGV4YW1wbGVzIGNhbiBiZSBzZWVuIGluIG1hbnkgb2YgdGhlIGV4aXN0aW5nIGFwcGxldHMsIGJ1dAorYmFzaWNhbGx5IGl0IGJvaWxzIGRvd24gdG8gdHdvIHRoaW5nczogYXQgdGhlIHRvcCBvZiB0aGUgLmMgZmlsZSwgaGF2ZSB0aGlzCitsaW5lIGluIHRoZSBtaWRzdCBvZiB5b3VyICNpbmNsdWRlcywgaWYgeW91IG5lZWQgdG8gcGFyc2UgbG9uZyBvcHRpb25zOgorCisJI2luY2x1ZGUgPGdldG9wdC5oPgorCitUaGVuIGhhdmUgbG9uZyBvcHRpb25zIGRlZmluZWQ6CisKKwlzdGF0aWMgY29uc3QgY2hhciA8YXBwbGV0Pl9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJsaXN0XDAiICAgIE5vX2FyZ3VtZW50ICJ0IgorCQkiZXh0cmFjdFwwIiBOb19hcmd1bWVudCAieCIKKwk7CisKK0FuZCBhIGNvZGUgYmxvY2sgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIG5lYXIgdGhlIHRvcCBvZiB5b3VyIGFwcGxldF9tYWluKCkKK3JvdXRpbmU6CisKKwljaGFyICpzdHJfYjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImNyeXB0aWNfc3RyaW5nIjsKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gPGFwcGxldD5fbG9uZ29wdHM7IC8qIGlmIHlvdSBoYXZlIHRoZW0gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmdjLCBhcmd2LCAiYWI6YyIsICZzdHJfYik7CisJaWYgKG9wdCAmIDEpIHsKKwkJaGFuZGxlX29wdGlvbl9hKCk7CisJfQorCWlmIChvcHQgJiAyKSB7CisJCWhhbmRsZV9vcHRpb25fYihzdHJfYik7CisJfQorCWlmIChvcHQgJiA0KSB7CisJCWhhbmRsZV9vcHRpb25fYygpOworCX0KKworSWYgeW91ciBhcHBsZXQgdGFrZXMgbm8gb3B0aW9ucyAoc3VjaCBhcyAnaW5pdCcpLCB0aGVyZSBzaG91bGQgYmUgYSBsaW5lCitzb21ld2hlcmUgaW4gdGhlIGZpbGUgcmVhZHM6CisKKwkvKiBubyBvcHRpb25zLCBubyBnZXRvcHQgKi8KKworVGhhdCB3YXksIHdoZW4gcGVvcGxlIGdvIGdyZXBwaW5nIHRvIHNlZSB3aGljaCBhcHBsZXRzIG5lZWQgdG8gYmUgY29udmVydGVkIHRvCit1c2UgZ2V0b3B0LCB0aGV5IHdvbid0IGdldCBmYWxzZSBwb3NpdGl2ZXMuCisKK0ZvciBtb3JlIGluZm8gYW5kIGV4YW1wbGVzLCBleGFtaW5lIGdldG9wdDMyLmMsIHRhci5jLCB3Z2V0LmMgZXRjLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZG9jcy9zeXNsb2cuY29uZi50eHQgYi9idXN5Ym94LTEuMTkuMy9kb2NzL3N5c2xvZy5jb25mLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDljNGExCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy9zeXNsb2cuY29uZi50eHQKQEAgLTAsMCArMSwyOCBAQAorSWYgc3lzbG9nZCBhcHBsZXQgY29tcGlsZWQgd2l0aCBGRUFUVVJFX1NZU0xPR0RfQ0ZHPXksIHRoZW4gaXQgc3VwcG9ydHMgcmVzdHJpY3RlZCBzeXNsb2cuY29uZi4KK1RoZSBjb25maWcgcmVzZW1ibGVzIHJzeXNsb2cuY29uZiBpbiBSVUxFUyBwYXJ0OgorCitMSU5FID0gREVMSU0gW1JVTEUgfCBDT01NRU5UXQorQ09NTUVOVCA9ICMuKgorREVMSU0gPSBTUEFDRSBUQUIKK1JVTEUgPSBTRUxFQ1RPUiBbO1NFTEVDVE9SXSogREVMSU0qIEFDVElPTiBERUxJTSoKK1NFTEVDVE9SID0gRkFDSUxJVFkgWyxGQUNJTElUWV0qIC5bWyFdPV0gUFJJT1JJVFkKK0ZBQ0lMSVRZID0gKiB8IGtlcm4gfCB1c2VyIC4uLiAoc2VlIHN5c2xvZy5oKQorUFJJT1JJVFkgPSAqIHwgZW1lcmcgfCBhbGVydCAuLi4gKHNlZSBzeXNsb2cuaCkKK0FDVElPTiA9IEZJTEUKKworIm1hcmsiIGZhY2lsaXR5IGlzIE5PVCBzdXBwb3J0ZWQuCisibm9uZSIgcHJpb3JpdHkgaXMgc3VwcG9ydGVkLgorSW4gRkFDSUxJVFkgYW5kIFBSSU9SSVRZICIqIiBzdGFuZHMgZm9yICJhbnkiLgorRklMRSBpcyBhIHJlZ3VsYXIgZmlsZSBvciB0dHkgZGV2aWNlLgorCitIZXJlIGlzIGFuIGV4YW1wbGU6CisKKyNzeXNsb2cuY29uZgora2Vybix1c2VyLiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdmFyL2xvZy9tZXNzYWdlcwkjYWxsIG1lc3NhZ2VzIG9mIGtlcm4gYW5kIHVzZXIgZmFjaWxpdGllcwora2Vybi4hZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdmFyL2xvZy9jcml0aWNhbAkjYWxsIG1lc3NhZ2VzIG9mIGtlcm4gZmFjaWxpdHkgd2l0aCBwcmlvcml0aWVzIGxvd2VyIHRoYW4gZXJyICh3YXJuLCBub3RpY2UgLi4uKQorKi4qO2F1dGgsYXV0aHByaXYubm9uZSAgICAgICAgICAgICAgICAgICAgICAvdmFyL2xvZy9ub2F1dGgJI2FsbCBtZXNzYWdlcyBleGNlcHQgb25lcyB3aXRoIGF1dGggYW5kIGF1dGhwcml2IGZhY2lsaXRpZXMKK2tlcm4sdXNlci4qO2tlcm4uIT1ub3RpY2U7Ki5lcnI7c3lzbG9nLm5vbmUgL3Zhci9sb2cvT01HCSNzb21lIHdoaWNrZWQgcnVsZSBqdXN0IGFzIGFuIGV4YW1wbGUgPSkKKyouKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL2Rldi9udWxsCQkjdGhpcyBwcmV2ZW50cyBmcm9tIGxvZ2dpbmcgdG8gZGVmYXVsdCBsb2cgZmlsZSAoLU8gRklMRSBvciAvdmFyL2xvZy9tZXNzYWdlcykKKworRXZlbiBpbiB0aGUgY2FzZSBvZiBtYXRjaCB3aXRoIHNvbWUgcnVsZSBhbm90aGVyIHJ1bGVzIHdpbGwgYmUgdHJpZWQgdG9vLgorSWYgdGhlcmUgd2FzIG5vIG1hdGNoIHdpdGggYW55IG9mIHRoZSBydWxlcywgbG9nZ2luZyB0byBkZWZhdWx0IGxvZyBmaWxlIG9yIHNoYXJlZCBtZW1vcnkgd2lsbCBiZSBwZXJmb3JtZWQuCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL3Rhcl9wYXgudHh0IGIvYnVzeWJveC0xLjE5LjMvZG9jcy90YXJfcGF4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTZjMjdiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy90YXJfcGF4LnR4dApAQCAtMCwwICsxLDIzOSBAQAorJ3BheCBoZWFkZXJzJyBpcyBQT1NJWCAyMDAzIChpaXJjKSBhZGRpdGlvbiBkZXNpZ25lZCB0byBmaXgKK3RhciBmb3JtYXQgbGltaXRhdGlvbnMgLSBvbGRlciB0YXIgZm9ybWF0IGhhcyBmaXhlZCBmaWVsZHMKK2ZvciBldmVyeXRoaW5nIChmaWxlbmFtZSwgdWlkLCBmaWxlc2l6ZSBldGMpIHdoaWNoIGNhbiBvdmVyZmxvdy4KKworcGF4IEhlYWRlciBCbG9jaworCitUaGUgcGF4IGhlYWRlciBibG9jayBzaGFsbCBiZSBpZGVudGljYWwgdG8gdGhlIHVzdGFyIGhlYWRlciBibG9jaworZGVzY3JpYmVkIGluIHVzdGFyIEludGVyY2hhbmdlIEZvcm1hdCwgZXhjZXB0IHRoYXQgdHdvIGFkZGl0aW9uYWwKK3R5cGVmbGFnIHZhbHVlcyBhcmUgZGVmaW5lZDoKKworeAorICAgIFJlcHJlc2VudHMgZXh0ZW5kZWQgaGVhZGVyIHJlY29yZHMgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZSBpbgordGhlIGFyY2hpdmUgKHdoaWNoIHNoYWxsIGhhdmUgaXRzIG93biB1c3RhciBoZWFkZXIgYmxvY2spLgorCitnCisgICAgUmVwcmVzZW50cyBnbG9iYWwgZXh0ZW5kZWQgaGVhZGVyIHJlY29yZHMgZm9yIHRoZSBmb2xsb3dpbmcKK2ZpbGVzIGluIHRoZSBhcmNoaXZlLiBFYWNoIHZhbHVlIHNoYWxsIGFmZmVjdCBhbGwgc3Vic2VxdWVudCBmaWxlcwordGhhdCBkbyBub3Qgb3ZlcnJpZGUgdGhhdCB2YWx1ZSBpbiB0aGVpciBvd24gZXh0ZW5kZWQgaGVhZGVyCityZWNvcmQgYW5kIHVudGlsIGFub3RoZXIgZ2xvYmFsIGV4dGVuZGVkIGhlYWRlciByZWNvcmQgaXMgcmVhY2hlZAordGhhdCBwcm92aWRlcyBhbm90aGVyIHZhbHVlIGZvciB0aGUgc2FtZSBmaWVsZC4gVGhlIHR5cGVmbGFnIGcKK2dsb2JhbCBoZWFkZXJzIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGludGVyY2hhbmdlIG1lZGlhIHRoYXQKK2NvdWxkIHN1ZmZlciBwYXJ0aWFsIGRhdGEgbG9zcyBpbiB0cmFuc3BvcnRpbmcgdGhlIGFyY2hpdmUuCisKK0ZvciBib3RoIG9mIHRoZXNlIHR5cGVzLCB0aGUgc2l6ZSBmaWVsZCBzaGFsbCBiZSB0aGUgc2l6ZSBvZiB0aGUKK2V4dGVuZGVkIGhlYWRlciByZWNvcmRzIGluIG9jdGV0cy4gVGhlIG90aGVyIGZpZWxkcyBpbiB0aGUgaGVhZGVyCitibG9jayBhcmUgbm90IG1lYW5pbmdmdWwgdG8gdGhpcyB2ZXJzaW9uIG9mIHRoZSBwYXggdXRpbGl0eS4KK0hvd2V2ZXIsIGlmIHRoaXMgYXJjaGl2ZSBpcyByZWFkIGJ5IGEgcGF4IHV0aWxpdHkgY29uZm9ybWluZyB0bwordGhlIElTTyBQT1NJWC0yOjE5OTMgc3RhbmRhcmQsIHRoZSBoZWFkZXIgYmxvY2sgZmllbGRzIGFyZSB1c2VkIHRvCitjcmVhdGUgYSByZWd1bGFyIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZXh0ZW5kZWQgaGVhZGVyIHJlY29yZHMgYXMKK2RhdGEuIFRoZXJlZm9yZSwgaGVhZGVyIGJsb2NrIGZpZWxkIHZhbHVlcyBzaG91bGQgYmUgc2VsZWN0ZWQgdG8KK3Byb3ZpZGUgcmVhc29uYWJsZSBmaWxlIGFjY2VzcyB0byB0aGlzIHJlZ3VsYXIgZmlsZS4KKworQSBmdXJ0aGVyIGRpZmZlcmVuY2UgZnJvbSB0aGUgdXN0YXIgaGVhZGVyIGJsb2NrIGlzIHRoYXQgZGF0YQorYmxvY2tzIGZvciBmaWxlcyBvZiB0eXBlZmxhZyAxICh0aGUgZGlnaXQgb25lKSAoaGFyZCBsaW5rKSBtYXkgYmUKK2luY2x1ZGVkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBzaXplIGZpZWxkIG1heSBiZSBncmVhdGVyIHRoYW4KK3plcm8uCisKK3BheCBFeHRlbmRlZCBIZWFkZXIKKworQW4gZXh0ZW5kZWQgaGVhZGVyIHNoYWxsIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgcmVjb3JkcywgZWFjaAorY29uc3RydWN0ZWQgYXMgZm9sbG93czoKKworIiVkICVzPSVzXG4iLCA8bGVuZ3RoPiwgPGtleXdvcmQ+LCA8dmFsdWU+CisKK1RoZSA8bGVuZ3RoPiBmaWVsZCBzaGFsbCBiZSB0aGUgZGVjaW1hbCBsZW5ndGggb2YgdGhlIGV4dGVuZGVkCitoZWFkZXIgcmVjb3JkIGluIG9jdGV0cywgaW5jbHVkaW5nIGxlbmd0aCBzdHJpbmcgaXRzZWxmIGFuZCB0aGUKK3RyYWlsaW5nIDxuZXdsaW5lPi4KKworW3NraXBdCisKK2F0aW1lCisgICAgVGhlIGZpbGUgYWNjZXNzIHRpbWUgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZShzKSwgZXF1aXZhbGVudCB0bwordGhlIHZhbHVlIG9mIHRoZSBzdF9hdGltZSBtZW1iZXIgb2YgdGhlIHN0YXQgc3RydWN0dXJlIGZvciBhIGZpbGUsCithcyBkZXNjcmliZWQgYnkgdGhlIHN0YXQoKSBmdW5jdGlvbi4gVGhlIGFjY2VzcyB0aW1lIHNoYWxsIGJlCityZXN0b3JlZCBpZiB0aGUgcHJvY2VzcyBoYXMgdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZSByZXF1aXJlZCB0bworZG8gc28uIFRoZSBmb3JtYXQgb2YgdGhlIDx2YWx1ZT4gc2hhbGwgYmUgYXMgZGVzY3JpYmVkIGluIHBheAorRXh0ZW5kZWQgSGVhZGVyIEZpbGUgVGltZXMuCisKK2NoYXJzZXQKKyAgICBUaGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIGVuY29kZSB0aGUgZGF0YSBpbiB0aGUKK2ZvbGxvd2luZyBmaWxlKHMpLgorCisgICAgVGhlIGVuY29kaW5nIGlzIGluY2x1ZGVkIGluIGFuIGV4dGVuZGVkIGhlYWRlciBmb3IgaW5mb3JtYXRpb24KK29ubHk7IHdoZW4gcGF4IGlzIHVzZWQgYXMgZGVzY3JpYmVkIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLCBpdAorc2hhbGwgbm90IHRyYW5zbGF0ZSB0aGUgZmlsZSBkYXRhIGludG8gYW55IG90aGVyIGVuY29kaW5nLiBUaGUKK0JJTkFSWSBlbnRyeSBpbmRpY2F0ZXMgdW5lbmNvZGVkIGJpbmFyeSBkYXRhLgorCisgICAgV2hlbiB1c2VkIGluIHdyaXRlIG9yIGNvcHkgbW9kZSwgaXQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZAord2hldGhlciBwYXggaW5jbHVkZXMgYSBjaGFyc2V0IGV4dGVuZGVkIGhlYWRlciByZWNvcmQgZm9yIGEgZmlsZS4KKworY29tbWVudAorICAgIEEgc2VyaWVzIG9mIGNoYXJhY3RlcnMgdXNlZCBhcyBhIGNvbW1lbnQuIEFsbCBjaGFyYWN0ZXJzIGluCit0aGUgPHZhbHVlPiBmaWVsZCBzaGFsbCBiZSBpZ25vcmVkIGJ5IHBheC4KKworZ2lkCisgICAgVGhlIGdyb3VwIElEIG9mIHRoZSBncm91cCB0aGF0IG93bnMgdGhlIGZpbGUsIGV4cHJlc3NlZCBhcyBhCitkZWNpbWFsIG51bWJlciB1c2luZyBkaWdpdHMgZnJvbSB0aGUgSVNPL0lFQyA2NDY6MTk5MSBzdGFuZGFyZC4KK1RoaXMgcmVjb3JkIHNoYWxsIG92ZXJyaWRlIHRoZSBnaWQgZmllbGQgaW4gdGhlIGZvbGxvd2luZyBoZWFkZXIKK2Jsb2NrKHMpLiBXaGVuIHVzZWQgaW4gd3JpdGUgb3IgY29weSBtb2RlLCBwYXggc2hhbGwgaW5jbHVkZSBhIGdpZAorZXh0ZW5kZWQgaGVhZGVyIHJlY29yZCBmb3IgZWFjaCBmaWxlIHdob3NlIGdyb3VwIElEIGlzIGdyZWF0ZXIKK3RoYW4gMjA5NzE1MSAob2N0YWwgNzc3Nzc3NykuCisKK2duYW1lCisgICAgVGhlIGdyb3VwIG9mIHRoZSBmaWxlKHMpLCBmb3JtYXR0ZWQgYXMgYSBncm91cCBuYW1lIGluIHRoZQorZ3JvdXAgZGF0YWJhc2UuIFRoaXMgcmVjb3JkIHNoYWxsIG92ZXJyaWRlIHRoZSBnaWQgYW5kIGduYW1lCitmaWVsZHMgaW4gdGhlIGZvbGxvd2luZyBoZWFkZXIgYmxvY2socyksIGFuZCBhbnkgZ2lkIGV4dGVuZGVkCitoZWFkZXIgcmVjb3JkLiBXaGVuIHVzZWQgaW4gcmVhZCwgY29weSwgb3IgbGlzdCBtb2RlLCBwYXggc2hhbGwKK3RyYW5zbGF0ZSB0aGUgbmFtZSBmcm9tIHRoZSBVVEYtOCBlbmNvZGluZyBpbiB0aGUgaGVhZGVyIHJlY29yZCB0bwordGhlIGNoYXJhY3RlciBzZXQgYXBwcm9wcmlhdGUgZm9yIHRoZSBncm91cCBkYXRhYmFzZSBvbiB0aGUKK3JlY2VpdmluZyBzeXN0ZW0uIElmIGFueSBvZiB0aGUgVVRGLTggY2hhcmFjdGVycyBjYW5ub3QgYmUKK3RyYW5zbGF0ZWQsIGFuZCBpZiB0aGUgLW8gaW52YWxpZD0gVVRGLTggb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsCit0aGUgcmVzdWx0cyBhcmUgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gV2hlbiB1c2VkIGluIHdyaXRlIG9yIGNvcHkKK21vZGUsIHBheCBzaGFsbCBpbmNsdWRlIGEgZ25hbWUgZXh0ZW5kZWQgaGVhZGVyIHJlY29yZCBmb3IgZWFjaAorZmlsZSB3aG9zZSBncm91cCBuYW1lIGNhbm5vdCBiZSByZXByZXNlbnRlZCBlbnRpcmVseSB3aXRoIHRoZQorbGV0dGVycyBhbmQgZGlnaXRzIG9mIHRoZSBwb3J0YWJsZSBjaGFyYWN0ZXIgc2V0LgorCitsaW5rcGF0aAorICAgIFRoZSBwYXRobmFtZSBvZiBhIGxpbmsgYmVpbmcgY3JlYXRlZCB0byBhbm90aGVyIGZpbGUsIG9mIGFueQordHlwZSwgcHJldmlvdXNseSBhcmNoaXZlZC4gVGhpcyByZWNvcmQgc2hhbGwgb3ZlcnJpZGUgdGhlIGxpbmtuYW1lCitmaWVsZCBpbiB0aGUgZm9sbG93aW5nIHVzdGFyIGhlYWRlciBibG9jayhzKS4gVGhlIGZvbGxvd2luZyB1c3RhcgoraGVhZGVyIGJsb2NrIHNoYWxsIGRldGVybWluZSB0aGUgdHlwZSBvZiBsaW5rIGNyZWF0ZWQuIElmIHR5cGVmbGFnCitvZiB0aGUgZm9sbG93aW5nIGhlYWRlciBibG9jayBpcyAxLCBpdCBzaGFsbCBiZSBhIGhhcmQgbGluay4gSWYKK3R5cGVmbGFnIGlzIDIsIGl0IHNoYWxsIGJlIGEgc3ltYm9saWMgbGluayBhbmQgdGhlIGxpbmtwYXRoIHZhbHVlCitzaGFsbCBiZSB0aGUgY29udGVudHMgb2YgdGhlIHN5bWJvbGljIGxpbmsuIFRoZSBwYXggdXRpbGl0eSBzaGFsbAordHJhbnNsYXRlIHRoZSBuYW1lIG9mIHRoZSBsaW5rIChjb250ZW50cyBvZiB0aGUgc3ltYm9saWMgbGluaykKK2Zyb20gdGhlIFVURi04IGVuY29kaW5nIHRvIHRoZSBjaGFyYWN0ZXIgc2V0IGFwcHJvcHJpYXRlIGZvciB0aGUKK2xvY2FsIGZpbGUgc3lzdGVtLiBXaGVuIHVzZWQgaW4gd3JpdGUgb3IgY29weSBtb2RlLCBwYXggc2hhbGwKK2luY2x1ZGUgYSBsaW5rcGF0aCBleHRlbmRlZCBoZWFkZXIgcmVjb3JkIGZvciBlYWNoIGxpbmsgd2hvc2UKK3BhdGhuYW1lIGNhbm5vdCBiZSByZXByZXNlbnRlZCBlbnRpcmVseSB3aXRoIHRoZSBtZW1iZXJzIG9mIHRoZQorcG9ydGFibGUgY2hhcmFjdGVyIHNldCBvdGhlciB0aGFuIE5VTC4KKworbXRpbWUKKyAgICBUaGUgZmlsZSBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZm9sbG93aW5nIGZpbGUocyksCitlcXVpdmFsZW50IHRvIHRoZSB2YWx1ZSBvZiB0aGUgc3RfbXRpbWUgbWVtYmVyIG9mIHRoZSBzdGF0CitzdHJ1Y3R1cmUgZm9yIGEgZmlsZSwgYXMgZGVzY3JpYmVkIGluIHRoZSBzdGF0KCkgZnVuY3Rpb24uIFRoaXMKK3JlY29yZCBzaGFsbCBvdmVycmlkZSB0aGUgbXRpbWUgZmllbGQgaW4gdGhlIGZvbGxvd2luZyBoZWFkZXIKK2Jsb2NrKHMpLiBUaGUgbW9kaWZpY2F0aW9uIHRpbWUgc2hhbGwgYmUgcmVzdG9yZWQgaWYgdGhlIHByb2Nlc3MKK2hhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlIHJlcXVpcmVkIHRvIGRvIHNvLiBUaGUgZm9ybWF0IG9mIHRoZQorPHZhbHVlPiBzaGFsbCBiZSBhcyBkZXNjcmliZWQgaW4gcGF4IEV4dGVuZGVkIEhlYWRlciBGaWxlIFRpbWVzLgorCitwYXRoCisgICAgVGhlIHBhdGhuYW1lIG9mIHRoZSBmb2xsb3dpbmcgZmlsZShzKS4gVGhpcyByZWNvcmQgc2hhbGwKK292ZXJyaWRlIHRoZSBuYW1lIGFuZCBwcmVmaXggZmllbGRzIGluIHRoZSBmb2xsb3dpbmcgaGVhZGVyCitibG9jayhzKS4gVGhlIHBheCB1dGlsaXR5IHNoYWxsIHRyYW5zbGF0ZSB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUKK2Zyb20gdGhlIFVURi04IGVuY29kaW5nIHRvIHRoZSBjaGFyYWN0ZXIgc2V0IGFwcHJvcHJpYXRlIGZvciB0aGUKK2xvY2FsIGZpbGUgc3lzdGVtLgorCisgICAgV2hlbiB1c2VkIGluIHdyaXRlIG9yIGNvcHkgbW9kZSwgcGF4IHNoYWxsIGluY2x1ZGUgYSBwYXRoCitleHRlbmRlZCBoZWFkZXIgcmVjb3JkIGZvciBlYWNoIGZpbGUgd2hvc2UgcGF0aG5hbWUgY2Fubm90IGJlCityZXByZXNlbnRlZCBlbnRpcmVseSB3aXRoIHRoZSBtZW1iZXJzIG9mIHRoZSBwb3J0YWJsZSBjaGFyYWN0ZXIKK3NldCBvdGhlciB0aGFuIE5VTC4KKworcmVhbHRpbWUuYW55CisgICAgVGhlIGtleXdvcmRzIHByZWZpeGVkIGJ5ICJyZWFsdGltZS4iIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlCitzdGFuZGFyZGl6YXRpb24uCisKK3NlY3VyaXR5LmFueQorICAgIFRoZSBrZXl3b3JkcyBwcmVmaXhlZCBieSAic2VjdXJpdHkuIiBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZQorc3RhbmRhcmRpemF0aW9uLgorCitzaXplCisgICAgVGhlIHNpemUgb2YgdGhlIGZpbGUgaW4gb2N0ZXRzLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsIG51bWJlcgordXNpbmcgZGlnaXRzIGZyb20gdGhlIElTTy9JRUMgNjQ2OjE5OTEgc3RhbmRhcmQuIFRoaXMgcmVjb3JkIHNoYWxsCitvdmVycmlkZSB0aGUgc2l6ZSBmaWVsZCBpbiB0aGUgZm9sbG93aW5nIGhlYWRlciBibG9jayhzKS4gV2hlbgordXNlZCBpbiB3cml0ZSBvciBjb3B5IG1vZGUsIHBheCBzaGFsbCBpbmNsdWRlIGEgc2l6ZSBleHRlbmRlZAoraGVhZGVyIHJlY29yZCBmb3IgZWFjaCBmaWxlIHdpdGggYSBzaXplIHZhbHVlIGdyZWF0ZXIgdGhhbgorODU4OTkzNDU5MSAob2N0YWwgNzc3Nzc3Nzc3NzcpLgorCit1aWQKKyAgICBUaGUgdXNlciBJRCBvZiB0aGUgZmlsZSBvd25lciwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbCBudW1iZXIKK3VzaW5nIGRpZ2l0cyBmcm9tIHRoZSBJU08vSUVDIDY0NjoxOTkxIHN0YW5kYXJkLiBUaGlzIHJlY29yZCBzaGFsbAorb3ZlcnJpZGUgdGhlIHVpZCBmaWVsZCBpbiB0aGUgZm9sbG93aW5nIGhlYWRlciBibG9jayhzKS4gV2hlbiB1c2VkCitpbiB3cml0ZSBvciBjb3B5IG1vZGUsIHBheCBzaGFsbCBpbmNsdWRlIGEgdWlkIGV4dGVuZGVkIGhlYWRlcgorcmVjb3JkIGZvciBlYWNoIGZpbGUgd2hvc2Ugb3duZXIgSUQgaXMgZ3JlYXRlciB0aGFuIDIwOTcxNTEgKG9jdGFsCis3Nzc3Nzc3KS4KKwordW5hbWUKKyAgICBUaGUgb3duZXIgb2YgdGhlIGZvbGxvd2luZyBmaWxlKHMpLCBmb3JtYXR0ZWQgYXMgYSB1c2VyIG5hbWUKK2luIHRoZSB1c2VyIGRhdGFiYXNlLiBUaGlzIHJlY29yZCBzaGFsbCBvdmVycmlkZSB0aGUgdWlkIGFuZCB1bmFtZQorZmllbGRzIGluIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGJsb2NrKHMpLCBhbmQgYW55IHVpZCBleHRlbmRlZAoraGVhZGVyIHJlY29yZC4gV2hlbiB1c2VkIGluIHJlYWQsIGNvcHksIG9yIGxpc3QgbW9kZSwgcGF4IHNoYWxsCit0cmFuc2xhdGUgdGhlIG5hbWUgZnJvbSB0aGUgVVRGLTggZW5jb2RpbmcgaW4gdGhlIGhlYWRlciByZWNvcmQgdG8KK3RoZSBjaGFyYWN0ZXIgc2V0IGFwcHJvcHJpYXRlIGZvciB0aGUgdXNlciBkYXRhYmFzZSBvbiB0aGUKK3JlY2VpdmluZyBzeXN0ZW0uIElmIGFueSBvZiB0aGUgVVRGLTggY2hhcmFjdGVycyBjYW5ub3QgYmUKK3RyYW5zbGF0ZWQsIGFuZCBpZiB0aGUgLW8gaW52YWxpZD0gVVRGLTggb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsCit0aGUgcmVzdWx0cyBhcmUgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gV2hlbiB1c2VkIGluIHdyaXRlIG9yIGNvcHkKK21vZGUsIHBheCBzaGFsbCBpbmNsdWRlIGEgdW5hbWUgZXh0ZW5kZWQgaGVhZGVyIHJlY29yZCBmb3IgZWFjaAorZmlsZSB3aG9zZSB1c2VyIG5hbWUgY2Fubm90IGJlIHJlcHJlc2VudGVkIGVudGlyZWx5IHdpdGggdGhlCitsZXR0ZXJzIGFuZCBkaWdpdHMgb2YgdGhlIHBvcnRhYmxlIGNoYXJhY3RlciBzZXQuCisKK0lmIHRoZSA8dmFsdWU+IGZpZWxkIGlzIHplcm8gbGVuZ3RoLCBpdCBzaGFsbCBkZWxldGUgYW55IGhlYWRlcgorYmxvY2sgZmllbGQsIHByZXZpb3VzbHkgZW50ZXJlZCBleHRlbmRlZCBoZWFkZXIgdmFsdWUsIG9yIGdsb2JhbAorZXh0ZW5kZWQgaGVhZGVyIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUuCisKK0lmIGEga2V5d29yZCBpbiBhbiBleHRlbmRlZCBoZWFkZXIgcmVjb3JkIChvciBpbiBhIC1vCitvcHRpb24tYXJndW1lbnQpIG92ZXJyaWRlcyBvciBkZWxldGVzIGEgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKK3VzdGFyIGhlYWRlciBibG9jaywgcGF4IHNoYWxsIGlnbm9yZSB0aGUgY29udGVudHMgb2YgdGhhdCBoZWFkZXIKK2Jsb2NrIGZpZWxkLgorCitVbmxpa2UgdGhlIHVzdGFyIGhlYWRlciBibG9jayBmaWVsZHMsIE5VTHMgc2hhbGwgbm90IGRlbGltaXQKKzx2YWx1ZT5zOyBhbGwgY2hhcmFjdGVycyB3aXRoaW4gdGhlIDx2YWx1ZT4gZmllbGQgc2hhbGwgYmUKK2NvbnNpZGVyZWQgZGF0YSBmb3IgdGhlIGZpZWxkLiBOb25lIG9mIHRoZSBsZW5ndGggbGltaXRhdGlvbnMgb2YKK3RoZSB1c3RhciBoZWFkZXIgYmxvY2sgZmllbGRzIGluIHVzdGFyIEhlYWRlciBCbG9jayBzaGFsbCBhcHBseSB0bwordGhlIGV4dGVuZGVkIGhlYWRlciByZWNvcmRzLgorCitwYXggRXh0ZW5kZWQgSGVhZGVyIEZpbGUgVGltZXMKKworVGltZSByZWNvcmRzIHNoYWxsIGJlIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlCit0aW1lIGluIHNlY29uZHMgc2luY2UgdGhlIEVwb2NoLiBJZiBhIHBlcmlvZCAoICcuJyApIGRlY2ltYWwgcG9pbnQKK2NoYXJhY3RlciBpcyBwcmVzZW50LCB0aGUgZGlnaXRzIHRvIHRoZSByaWdodCBvZiB0aGUgcG9pbnQgc2hhbGwKK3JlcHJlc2VudCB0aGUgdW5pdHMgb2YgYSBzdWJzZWNvbmQgdGltaW5nIGdyYW51bGFyaXR5LiBJbiByZWFkIG9yCitjb3B5IG1vZGUsIHRoZSBwYXggdXRpbGl0eSBzaGFsbCB0cnVuY2F0ZSB0aGUgdGltZSBvZiBhIGZpbGUgdG8KK3RoZSBncmVhdGVzdCB2YWx1ZSB0aGF0IGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGlucHV0IGhlYWRlcgorZmlsZSB0aW1lLiBJbiB3cml0ZSBvciBjb3B5IG1vZGUsIHRoZSBwYXggdXRpbGl0eSBzaGFsbCBvdXRwdXQgYQordGltZSBleGFjdGx5IGlmIGl0IGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZGVjaW1hbCBudW1iZXIsCithbmQgb3RoZXJ3aXNlIHNoYWxsIGdlbmVyYXRlIG9ubHkgZW5vdWdoIGRpZ2l0cyBzbyB0aGF0IHRoZSBzYW1lCit0aW1lIHNoYWxsIGJlIHJlY292ZXJlZCBpZiB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgb24gYSBzeXN0ZW0gd2hvc2UKK3VuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIHNhbWUgdGltZSBncmFudWxhcml0eS4KKworRXhhbXBsZSBmcm9tIExpbnV4IGtlcm5lbCBhcmNoaXZlIHRhcmJhbGw6CisKKzAwMDAwMDAwICA3MCA2MSA3OCA1ZiA2NyA2YyA2ZiA2MiAgNjEgNmMgNWYgNjggNjUgNjEgNjQgNjUgIHxwYXhfZ2xvYmFsX2hlYWRlfAorMDAwMDAwMTAgIDcyIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfHIuLi4uLi4uLi4uLi4uLi58CiswMDAwMDAyMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMDMwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwNDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDA1MCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMDYwICAwMCAwMCAwMCAwMCAzMCAzMCAzMCAzMCAgMzYgMzYgMzYgMDAgMzAgMzAgMzAgMzAgIHwuLi4uMDAwMDY2Ni4wMDAwfAorMDAwMDAwNzAgIDMwIDMwIDMwIDAwIDMwIDMwIDMwIDMwICAzMCAzMCAzMCAwMCAzMCAzMCAzMCAzMCAgfDAwMC4wMDAwMDAwLjAwMDB8CiswMDAwMDA4MCAgMzAgMzAgMzAgMzAgMzAgMzYgMzQgMDAgIDMwIDMwIDMwIDMwIDMwIDMwIDMwIDMwICB8MDAwMDA2NC4wMDAwMDAwMHwKKzAwMDAwMDkwICAzMCAzMCAzMCAwMCAzMCAzMCAzMSAzNCAgMzAgMzUgMzMgMDAgNjcgMDAgMDAgMDAgIHwwMDAuMDAxNDA1My5nLi4ufAorMDAwMDAwYTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDBiMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMGMwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwZDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDBlMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMGYwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxMDAgIDAwIDc1IDczIDc0IDYxIDcyIDAwIDMwICAzMCA2NyA2OSA3NCAwMCAwMCAwMCAwMCAgfC51c3Rhci4wMGdpdC4uLi58CiswMDAwMDExMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMTIwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgNjcgNjkgNzQgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi5naXQuLi4ufAorMDAwMDAxMzAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDE0MCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDMwIDMwIDMwIDMwIDMwIDMwIDMwICB8Li4uLi4uLi4uMDAwMDAwMHwKKzAwMDAwMTUwICAwMCAzMCAzMCAzMCAzMCAzMCAzMCAzMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuMDAwMDAwMC4uLi4uLi4ufAorMDAwMDAxNjAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDE3MCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMTgwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxOTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDFhMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMWIwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxYzAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDFkMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMWUwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxZjAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDIwMCAgMzUgMzIgMjAgNjMgNmYgNmQgNmQgNjUgIDZlIDc0IDNkIDYyIDMxIDMwIDM1IDMwICB8NTIgY29tbWVudD1iMTA1MHwKKzAwMDAwMjEwICAzMiA2MiAzMiAzMiA2MSAzMSAzMiAzMCAgMzkgNjQgMzYgNjIgMzQgMzcgMzYgMzMgIHwyYjIyYTEyMDlkNmI0NzYzfAorMDAwMDAyMjAgIDM5IDY0IDM4IDM4IDYyIDM4IDMxIDMyICA2MiAzMiAzMSA2NiA2MiAzNSAzOSAzNCAgfDlkODhiODEyYjIxZmI1OTR8CiswMDAwMDIzMCAgMzkgNjUgMzQgMGEgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8OWU0Li4uLi4uLi4uLi4uLnwKKzAwMDAwMjQwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorLi4uCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL3VuaWNvZGUudHh0IGIvYnVzeWJveC0xLjE5LjMvZG9jcy91bmljb2RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzE1OWNlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy91bmljb2RlLnR4dApAQCAtMCwwICsxLDcxIEBACisJVW5pY29kZSBzdXBwb3J0IGluIGJ1c3lib3gKKworVGhlcmUgYXJlIHNldmVyYWwgc2NlbmFyaW9zIHdoZXJlIHdlIG5lZWQgdG8gaGFuZGxlIHVuaWNvZGUKK2NvcnJlY3RseS4KKworCVNoZWxsIGlucHV0CisKK1dlIHdhbnQgdG8gY29ycmVjdGx5IGhhbmRsZSBpbnB1dCBvZiB1bmljb2RlIGNoYXJhY3RlcnMuCitUaGVyZSBhcmUgc2V2ZXJhbCBwcm9ibGVtcyB3aXRoIGl0LiBKdXN0IGhhbmRsaW5nIGlucHV0CithcyBzZXF1ZW5jZSBvZiBieXRlcyB3b3VsZCBicmVhayBhbnkgZWRpdGluZy4gVGhpcyB3YXMgZml4ZWQKK2FuZCBub3cgbGluZWVkaXQgb3BlcmF0ZXMgb24gdGhlIGFycmF5IG9mIHdjaGFyX3Qncy4KK0J1dCB3ZSBhbHNvIG5lZWQgdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgcHJvYmxlbWF0aWMgbW9tZW50czoKKworKiBJdCBpcyB1bnJlYXNvbmFibGUgdG8gZXhwZWN0IHRoYXQgb3V0cHV0IGRldmljZSBzdXBwb3J0cworICBfYW55XyB1bmljb2RlIGNoYXJzLiBQZXJoYXBzIHdlIG5lZWQgdG8gYXZvaWQgcHJpbnRpbmcKKyAgdGhvc2UgY2hhcnMgd2hpY2ggYXJlIG5vdCBzdXBwb3J0ZWQgYnkgb3V0cHV0IGRldmljZS4KKyAgRXhhbXBsZXM6IGNoYXJzIHdoaWNoIGFyZSBub3QgcHJlc2VudCBpbiB0aGUgZm9udCwKKyAgY2hhcnMgd2hpY2ggYXJlIG5vdCBhc3NpZ25lZCBpbiB1bmljb2RlLAorICBjb21iaW5pbmcgY2hhcnMgKGVzcGVjaWFsbHkgdHJ5aW5nIHRvIGNvbWJpbmUgYmFkIHBhaXJzOgorICBhX2NoaW5lc2Vfc3ltYm9sICsgImNvbWJpbmluZyBncmF2ZSBhY2NlbnQiID0gPz8hKQorCisqIFdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCB1bmljb2RlIGNoYXJzIGhhdmUKKyAgZGlmZmVyZW50IHdpZHRoczogMCBmb3IgY29tYmluaW5nIGNoYXJzLCAxIGZvciB1c3VhbCwKKyAgMiBmb3IgaWRlb2dyYW1zIChhcmUgdGhlcmUgMysgd2lkZSBjaGFycz8pLgorCisqIEJpZGlyZWN0aW9uYWwgaGFuZGxpbmcuIElmIHVzZXIgd2FudHMgdG8gZWNobyBhIHBocmFzZQorICBpbiBIZWJyZXcsIGhlIHR5cGVzOiBlY2hvICJzcmV0dGVsIHdlcmJlSCIKKworCUVkaXRvcnMgKHZpLCBlZCkKKworVGhpcyBjYXNlIGlzIGEgYml0IHNpbWlsYXIgdG8gInNoZWxsIGlucHV0IiwgYnV0IHVubGlrZSBzaGVsbCwKK2VkaXRvcnMgbWF5IGVuY291bnRlciBtYW55IG1vcmUgdW5leHBlY3RlZCB1bmljb2RlIHNlcXVlbmNlcworKHRyeSB0byBsb2FkIGEgcmFuZG9tIGJpbmFyeSBmaWxlLi4uKSwgYW5kIHRoZXkgbmVlZCB0byBwcmVzZXJ2ZQordGhlbSwgdW5saWtlIHNoZWxsIHdoaWNoIGNhbiBhZmZvcmQgdG8gZHJvcCBib2d1cyBpbnB1dC4KKworCW1vcmUsIGxlc3MKKworTmVlZCB0byBjb3JyZWN0bHkgZGlzcGxheSBhbnkgaW5wdXQgZmlsZS4gSWRlYWxseSwgd2l0aAorQVNDSUkvdW5pY29kZS9maWx0ZXJlZF91bmljb2RlIG9wdGlvbiBvciBrZXlib2FyZCBzd2l0Y2guCitOb3RlOiBuZWVkIHRvIGhhbmRsZSB0YWJzIGFuZCBiYWNrc3BhY2VzIHNwZWNpYWxseQorKGJrc3AgaXMgZm9yIG1hbnBhZ2UgY29tcGF0KS4KKworCWN1dCwgZm9sZCwgd2F0Y2gKKworTWF5IG5lZWQgYWJpbGl0eSB0byBjdXQgdW5pY29kZSBzdHJpbmcgdG8gc3BlY2lmaWVkIG51bWJlciBvZiB3Y2hhcnMKK2FuZC9vciB0byBzcGVjaWZpZWQgc2NyZWVuIHdpZHRoLiBOZWVkIHRvIGhhbmRsZSB0YWJzIHNwZWNpYWxseS4KKworCXNlZCwgYXdrLCBncmVwCisKK0hhbmRsZSB1bmljb2RlLWF3YXJlIHJlZ2V4cCBtYXRjaAorCisJbHMgKG11bHRpLWNvbHVtbiBkaXNwbGF5KQorCitscyB3aWxsIGZhaWwgdG8gbGluZSB1cCBjb2x1bW5hciBvdXRwdXQgaWYgaXQgd2lsbCBub3QgYWNjb3VudAorZm9yIGNoYXJhY3RlciB3aWR0aHMgKGFuZCBtYXliZSBmaWx0ZXIgb3V0IHNvbWUgb2YgdGhlbSwgc2VlCithYm92ZSkuIE9UT0gsIG5vbi1jb2x1bW5hciB2aWV3cyAobHMgLTEsIGxzIC1sLCBscyB8IGNhcikKK3Nob3VsZCBOT1QgZmlsdGVyIG91dCBiYWQgdW5pY29kZSAoYnV0IG5lZWQgdG8gZmlsdGVyIG91dAorY29udHJvbCBjaGFycyAoY29yZXV0aWxzIGRvZXMgdGhhdCkuIE5vdGUgdGhhdCB1bmxpa2UgbW9yZS9sZXNzLAordGFicyBhbmQgYmFja3NwYWNlcyBuZWVkIG5vdCBzcGVjaWFsIGhhbmRsaW5nLgorCisJdG9wLCBwcworCitOZWVkIHRvIHBlcmZvcm0gZmlsdGVyaW5nIHNpbWlsYXIgdG8gbHMuCisKKwlGaWxlbmFtZSBkaXNwbGF5IChpbiBlcnJvciBtZXNzYWdlcyBhbmQgZWxzZXdoZXJlKQorCitOZWVkIHRvIHBlcmZvcm0gZmlsdGVyaW5nIHNpbWlsYXIgdG8gbHMuCisKKworVE9ETzogd3JpdGUgYW4gZW1haWwgdG8gQXNtdXMgRnJleXRhZyAoYXNtdXNAdW5pY29kZS5vcmcpLAorYXV0aG9yIG9mIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMTEvCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL3VuaWNvZGVfVVRGLTgtdGVzdC50eHQgYi9idXN5Ym94LTEuMTkuMy9kb2NzL3VuaWNvZGVfVVRGLTgtdGVzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkMTZmNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2RvY3MvdW5pY29kZV9VVEYtOC10ZXN0LnR4dApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9kb2NzL3VuaWNvZGVfZnVsbC1ibXAudHh0IGIvYnVzeWJveC0xLjE5LjMvZG9jcy91bmljb2RlX2Z1bGwtYm1wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWVhYTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZG9jcy91bmljb2RlX2Z1bGwtYm1wLnR4dApAQCAtMCwwICsxLDIwNzkgQEAKKworRnVsbCBCTVAgVGVzdCBGaWxlCistLS0tLS0tLS0tLS0tLS0tLS0KKworTWFya3VzIEt1aG4gPGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS8+IC0tIDIwMDMtMDQtMjIKKworVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBVVEYtOCBzZXF1ZW5jZXMgb2YgYWxsIGNvZGUgcG9zaXRpb25zIGluIHRoZQorSVNPIDEwNjQ2LTEgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lLCBleGNlcHQgZm9yIHRoZSBDMCBhbmQgQzEgY29udHJvbAorY2hhcmFjdGVyIGFyZWFzLiBUaGlzIGNvcnJlc3BvbmRzIHRvIGFsbCBjb2RlcyBpbiB0aGUgcmFuZ2UgVSswMDIwIC0KK1UrMDA3RSBhbmQgVSswMEEwIC0gVStGRkZGLiBbdW5pc2V0ICswMDAwLi5mZmZmIHV0ZjgtbGlzdF0KKworCitCYXNpYyBMYXRpbiAoVSswMDAwLVUrMDA3Rik6CisKKyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl8KK2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4KKworTGF0aW4tMSBTdXBwbGVtZW50IChVKzAwODAtVSswMEZGKToKKworwqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zDncOew58KK8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w78KKworTGF0aW4gRXh0ZW5kZWQtQSAoVSswMTAwLVUrMDE3Rik6CisKK8SAxIHEgsSDxITEhcSGxIfEiMSJxIrEi8SMxI3EjsSPxJDEkcSSxJPElMSVxJbEl8SYxJnEmsSbxJzEncSexJ/EoMShxKLEo8SkxKXEpsSnxKjEqcSqxKvErMStxK7Er8SwxLHEssSzxLTEtcS2xLfEuMS5xLrEu8S8xL3EvsS/CivFgMWBxYLFg8WExYXFhsWHxYjFicWKxYvFjMWNxY7Fj8WQxZHFksWTxZTFlcWWxZfFmMWZxZrFm8WcxZ3FnsWfxaDFocWixaPFpMWlxabFp8WoxanFqsWrxazFrcWuxa/FsMWxxbLFs8W0xbXFtsW3xbjFucW6xbvFvMW9xb7FvworCitMYXRpbiBFeHRlbmRlZC1CIChVKzAxODAtVSswMjRGKToKKworxoDGgcaCxoPGhMaFxobGh8aIxonGisaLxozGjcaOxo/GkMaRxpLGk8aUxpXGlsaXxpjGmcaaxpvGnMadxp7Gn8agxqHGosajxqTGpcamxqfGqMapxqrGq8asxq3GrsavxrDGscayxrPGtMa1xrbGt8a4xrnGusa7xrzGvca+xr8KK8eAx4HHgseDx4THhceGx4fHiMeJx4rHi8eMx43HjsePx5DHkceSx5PHlMeVx5bHl8eYx5nHmsebx5zHnceex5/HoMehx6LHo8ekx6XHpsenx6jHqceqx6vHrMetx67Hr8ewx7HHssezx7THtce2x7fHuMe5x7rHu8e8x73Hvse/CivIgMiByILIg8iEyIXIhsiHyIjIiciKyIvIjMiNyI7Ij8iQyJHIksiTyJTIlciWyJfImMiZyJrIm8icyJ3InsifyKDIociiyKPIpMilyKbIp8ioyKnIqsiryKzIrciuyK/IsMixyLLIs8i0yLXItsi3yLjIuci6yLvIvMi9yL7IvworyYDJgcmCyYPJhMmFyYbJh8mIyYnJismLyYzJjcmOyY8KKworSVBBIEV4dGVuc2lvbnMgKFUrMDI1MC1VKzAyQUYpOgorCivJkMmRyZLJk8mUyZXJlsmXyZjJmcmayZvJnMmdyZ7Jn8mgyaHJosmjyaTJpcmmyafJqMmpyarJq8msya3JrsmvybDJscmyybPJtMm1ybbJt8m4ybnJusm7ybzJvcm+yb/KgMqByoLKg8qEyoXKhsqHyojKicqKyovKjMqNyo7KjworypDKkcqSypPKlMqVypbKl8qYypnKmsqbypzKncqeyp/KoMqhyqLKo8qkyqXKpsqnyqjKqcqqyqvKrMqtyq7KrworCitTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgKFUrMDJCMC1VKzAyRkYpOgorCivKsMqxyrLKs8q0yrXKtsq3yrjKucq6yrvKvMq9yr7Kv8uAy4HLgsuDy4TLhcuGy4fLiMuJy4rLi8uMy43LjsuPy5DLkcuSy5PLlMuVy5bLl8uYy5nLmsuby5zLncuey5/LoMuhy6LLo8uky6XLpsuny6jLqcuqy6vLrMuty67Lrwory7DLscuyy7PLtMu1y7bLt8u4y7nLusu7y7zLvcu+y78KKworQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIChVKzAzMDAtVSswMzZGKToKKwor4peMzIDil4zMgeKXjMyC4peMzIPil4zMhOKXjMyF4peMzIbil4zMh+KXjMyI4peMzInil4zMiuKXjMyL4peMzIzil4zMjeKXjMyO4peMzI/il4zMkOKXjMyR4peMzJLil4zMk+KXjMyU4peMzJXil4zMluKXjMyX4peMzJjil4zMmeKXjMya4peMzJvil4zMnOKXjMyd4peMzJ7il4zMn+KXjMyg4peMzKHil4zMouKXjMyj4peMzKTil4zMpeKXjMym4peMzKfil4zMqOKXjMyp4peMzKril4zMq+KXjMys4peMzK3il4zMruKXjMyv4peMzLDil4zMseKXjMyy4peMzLPil4zMtOKXjMy14peMzLbil4zMt+KXjMy44peMzLnil4zMuuKXjMy74peMzLzil4zMveKXjMy+4peMzL8KK+KXjM2A4peMzYHil4zNguKXjM2D4peMzYTil4zNheKXjM2G4peMzYfil4zNiOKXjM2J4peMzYril4zNi+KXjM2M4peMzY3il4zNjuKXjM2PzZDNkc2SzZPNlM2VzZbNl82YzZnNms2bzZzNnc2ezZ/il4zNoOKXjM2h4peMzaLil4zNo+KXjM2k4peMzaXil4zNpuKXjM2n4peMzajil4zNqeKXjM2q4peMzavil4zNrOKXjM2t4peMza7il4zNrworCitHcmVlayBhbmQgQ29wdGljIChVKzAzNzAtVSswM0ZGKToKKworzbDNsc2yzbPNtM21zbbNt824zbnNus27zbzNvc2+zb/OgM6BzoLOg86EzoXOhs6HzojOic6KzovOjM6Nzo7Oj86QzpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6izqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq8KK86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjc+Oz4/PkM+Rz5LPk8+Uz5XPls+Xz5jPmc+az5vPnM+dz57Pn8+gz6HPos+jz6TPpc+mz6fPqM+pz6rPq8+sz63Prs+vCivPsM+xz7LPs8+0z7XPts+3z7jPuc+6z7vPvM+9z77PvworCitDeXJpbGxpYyAoVSswNDAwLVUrMDRGRik6CisKK9CA0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CM0I3QjtCP0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/CivRgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9GQ0ZHRktGT0ZTRldGW0ZfRmNGZ0ZrRm9Gc0Z3RntGf0aDRodGi0aPRpNGl0abRp9Go0anRqtGr0azRrdGu0a/RsNGx0bLRs9G00bXRttG30bjRudG60bvRvNG90b7Rvwor0oDSgdKC4peM0oPil4zShOKXjNKF4peM0obShyDSiCDSidKK0ovSjNKN0o7Sj9KQ0pHSktKT0pTSldKW0pfSmNKZ0prSm9Kc0p3SntKf0qDSodKi0qPSpNKl0qbSp9Ko0qnSqtKr0qzSrdKu0q/SsNKx0rLSs9K00rXSttK30rjSudK60rvSvNK90r7Svwor04DTgdOC04PThNOF04bTh9OI04nTitOL04zTjdOO04/TkNOR05LTk9OU05XTltOX05jTmdOa05vTnNOd057Tn9Og06HTotOj06TTpdOm06fTqNOp06rTq9Os063TrtOv07DTsdOy07PTtNO107bTt9O407nTutO707zTvdO+078KKworQ3lyaWxsaWMgU3VwcGxlbWVudGFyeSAoVSswNTAwLVUrMDUyRik6CisKK9SA1IHUgtSD1ITUhdSG1IfUiNSJ1IrUi9SM1I3UjtSP1JDUkdSS1JPUlNSV1JbUl9SY1JnUmtSb1JzUndSe1J/UoNSh1KLUo9Sk1KXUptSn1KjUqdSq1KvUrNSt1K7UrworCitBcm1lbmlhbiAoVSswNTMwLVUrMDU4Rik6CisKK9Sw1LHUstSz1LTUtdS21LfUuNS51LrUu9S81L3UvtS/1YDVgdWC1YPVhNWF1YbVh9WI1YnVitWL1YzVjdWO1Y/VkNWR1ZLVk9WU1ZXVltWX1ZjVmdWa1ZvVnNWd1Z7Vn9Wg1aHVotWj1aTVpdWm1afVqNWp1arVq9Ws1a3VrtWvCivVsNWx1bLVs9W01bXVttW31bjVudW61bvVvNW91b7Vv9aA1oHWgtaD1oTWhdaG1ofWiNaJ1orWi9aM1o3WjtaPCisKK0hlYnJldyAoVSswNTkwLVUrMDVGRik6CisKK9aQ4peM1pHil4zWkuKXjNaT4peM1pTil4zWleKXjNaW4peM1pfil4zWmOKXjNaZ4peM1pril4zWm+KXjNac4peM1p3il4zWnuKXjNaf4peM1qDil4zWodai4peM1qPil4zWpOKXjNal4peM1qbil4zWp+KXjNao4peM1qnil4zWquKXjNar4peM1qzil4zWreKXjNau4peM1q/il4zWsOKXjNax4peM1rLil4zWs+KXjNa04peM1rXil4zWtuKXjNa34peM1rjil4zWuda64peM1rvil4zWvOKXjNa91r7il4zWv9eA4peM14Hil4zXgteD4peM14TXhdeG14fXiNeJ14rXi9eM143XjtePCivXkNeR15LXk9eU15XXlteX15jXmdea15vXnNed157Xn9eg16HXotej16TXpdem16fXqNep16rXq9es163Xrtev17DXsdey17PXtNe117bXt9e417nXute717zXvde+178KKworQXJhYmljIChVKzA2MDAtVSswNkZGKToKKwor2IDYgdiC2IPYhNiF2IbYh9iI2InYitiL2IzYjdiO2I/YkNiR2JLYk9iU2JXYltiX2JjYmdia2JvYnNid2J7Yn9ig2KHYotij2KTYpdim2KfYqNip2KrYq9is2K3Yrtiv2LDYsdiy2LPYtNi12LbYt9i42LnYuti72LzYvdi+2L8KK9mA2YHZgtmD2YTZhdmG2YfZiNmJ2Yril4zZi+KXjNmM4peM2Y3il4zZjuKXjNmP4peM2ZDil4zZkeKXjNmS4peM2ZPil4zZlOKXjNmV2ZbZl9mY2ZnZmtmb2ZzZndme2Z/ZoNmh2aLZo9mk2aXZptmn2ajZqdmq2avZrNmt2a7Zr+KXjNmw2bHZstmz2bTZtdm22bfZuNm52brZu9m82b3Zvtm/CivagNqB2oLag9qE2oXahtqH2ojaidqK2ovajNqN2o7aj9qQ2pHaktqT2pTaldqW2pfamNqZ2pram9qc2p3antqf2qDaodqi2qPapNql2qbap9qo2qnaqtqr2qzardqu2q/asNqx2rLas9q02rXattq32rjaudq62rvavNq92r7avwor24DbgduC24PbhNuF24bbh9uI24nbituL24zbjduO24/bkNuR25Lbk9uU25Xil4zbluKXjNuX4peM25jil4zbmeKXjNua4peM25vil4zbnNudINue4peM25/il4zboOKXjNuh4peM26Lil4zbo+KXjNuk26XbpuKXjNun4peM26jbqeKXjNuq4peM26vil4zbrOKXjNut267br9uw27Hbstuz27Tbtdu227fbuNu527rbu9u8273bvtu/CisKK1N5cmlhYyAoVSswNzAwLVUrMDc0Rik6CisKK9yA3IHcgtyD3ITchdyG3IfciNyJ3Irci9yM3I3cjtyP3JDil4zckdyS3JPclNyV3Jbcl9yY3Jncmtyb3Jzcndye3J/coNyh3KLco9yk3KXcptyn3Kjcqdyq3KvcrNyt3K7cr+KXjNyw4peM3LHil4zcsuKXjNyz4peM3LTil4zcteKXjNy24peM3Lfil4zcuOKXjNy54peM3Lril4zcu+KXjNy84peM3L3il4zcvuKXjNy/Civil4zdgOKXjN2B4peM3YLil4zdg+KXjN2E4peM3YXil4zdhuKXjN2H4peM3Yjil4zdieKXjN2K3YvdjN2N3Y7djworCitGcmVlIGJsb2NrIChVKzA3NTAtVSswNzdGKToKKwor3ZDdkd2S3ZPdlN2V3Zbdl92Y3Zndmt2b3Zzdnd2e3Z/doN2h3aLdo92k3aXdpt2n3ajdqd2q3avdrN2t3a7dr92w3bHdst2z3bTdtd223bfduN253brdu9283b3dvt2/CisKK1RoYWFuYSAoVSswNzgwLVUrMDdCRik6CisKK96A3oHegt6D3oTehd6G3ofeiN6J3orei96M3o3ejt6P3pDekd6S3pPelN6V3pbel96Y3pnemt6b3pzend6e3p/eoN6h3qLeo96k3qXil4zepuKXjN6n4peM3qjil4zeqeKXjN6q4peM3qvil4zerOKXjN6t4peM3q7il4zer+KXjN6w3rHest6z3rTetd623rfeuN653rreu9683r3evt6/CisKK0ZyZWUgYmxvY2sgKFUrMDdDMC1VKzA4RkYpOgorCivfgN+B34Lfg9+E34Xfht+H34jfid+K34vfjN+N347fj9+Q35Hfkt+T35Tfld+W35ffmN+Z35rfm9+c353fnt+f36Dfod+i36PfpN+l36bfp9+o36nfqt+r36zfrd+u36/fsN+x37Lfs9+037Xftt+337jfud+637vfvN+9377fvwor4KCA4KCB4KCC4KCD4KCE4KCF4KCG4KCH4KCI4KCJ4KCK4KCL4KCM4KCN4KCO4KCP4KCQ4KCR4KCS4KCT4KCU4KCV4KCW4KCX4KCY4KCZ4KCa4KCb4KCc4KCd4KCe4KCf4KCg4KCh4KCi4KCj4KCk4KCl4KCm4KCn4KCo4KCp4KCq4KCr4KCs4KCt4KCu4KCv4KCw4KCx4KCy4KCz4KC04KC14KC24KC34KC44KC54KC64KC74KC84KC94KC+4KC/CivgoYDgoYHgoYLgoYPgoYTgoYXgoYbgoYfgoYjgoYngoYrgoYvgoYzgoY3goY7goY/goZDgoZHgoZLgoZPgoZTgoZXgoZbgoZfgoZjgoZngoZrgoZvgoZzgoZ3goZ7goZ/goaDgoaHgoaLgoaPgoaTgoaXgoabgoafgoajgoangoargoavgoazgoa3goa7goa/gobDgobHgobLgobPgobTgobXgobbgobfgobjgobngobrgobvgobzgob3gob7gob8KK+CigOCigeCiguCig+CihOCiheCihuCih+CiiOCiieCiiuCii+CijOCijeCijuCij+CikOCikeCikuCik+CilOCileCiluCil+CimOCimeCimuCim+CinOCineCinuCin+CioOCioeCiouCio+CipOCipeCipuCip+CiqOCiqeCiquCiq+CirOCireCiruCir+CisOCiseCisuCis+CitOCiteCituCit+CiuOCiueCiuuCiu+CivOCiveCivuCivwor4KOA4KOB4KOC4KOD4KOE4KOF4KOG4KOH4KOI4KOJ4KOK4KOL4KOM4KON4KOO4KOP4KOQ4KOR4KOS4KOT4KOU4KOV4KOW4KOX4KOY4KOZ4KOa4KOb4KOc4KOd4KOe4KOf4KOg4KOh4KOi4KOj4KOk4KOl4KOm4KOn4KOo4KOp4KOq4KOr4KOs4KOt4KOu4KOv4KOw4KOx4KOy4KOz4KO04KO14KO24KO34KO44KO54KO64KO74KO84KO94KO+4KO/CisKK0RldmFuYWdhcmkgKFUrMDkwMC1VKzA5N0YpOgorCivgpIDil4zgpIHil4zgpILgpIPgpITgpIXgpIbgpIfgpIjgpIngpIrgpIvgpIzgpI3gpI7gpI/gpJDgpJHgpJLgpJPgpJTgpJXgpJbgpJfgpJjgpJngpJrgpJvgpJzgpJ3gpJ7gpJ/gpKDgpKHgpKLgpKPgpKTgpKXgpKbgpKfgpKjgpKngpKrgpKvgpKzgpK3gpK7gpK/gpLDgpLHgpLLgpLPgpLTgpLXgpLbgpLfgpLjgpLngpLrgpLvil4zgpLzgpL3gpL7gpL8KK+ClgOKXjOClgeKXjOClguKXjOClg+KXjOClhOKXjOClheKXjOClhuKXjOClh+KXjOCliOClieCliuCli+CljOKXjOCljeCljuClj+ClkOKXjOClkeKXjOClkuKXjOClk+KXjOCllOClleClluCll+ClmOClmeClmuClm+ClnOClneClnuCln+CloOCloeKXjOClouKXjOClo+ClpOClpeClpuClp+ClqOClqeClquClq+ClrOClreClruClr+ClsOClseClsuCls+CltOClteCltuClt+CluOClueCluuClu+ClvOClveClvuClvworCitCZW5nYWxpIChVKzA5ODAtVSswOUZGKToKKwor4KaA4peM4KaB4KaC4KaD4KaE4KaF4KaG4KaH4KaI4KaJ4KaK4KaL4KaM4KaN4KaO4KaP4KaQ4KaR4KaS4KaT4KaU4KaV4KaW4KaX4KaY4KaZ4Kaa4Kab4Kac4Kad4Kae4Kaf4Kag4Kah4Kai4Kaj4Kak4Kal4Kam4Kan4Kao4Kap4Kaq4Kar4Kas4Kat4Kau4Kav4Kaw4Kax4Kay4Kaz4Ka04Ka14Ka24Ka34Ka44Ka54Ka64Ka74peM4Ka84Ka94Ka+4Ka/Civgp4Dil4zgp4Hil4zgp4Lil4zgp4Pil4zgp4Tgp4Xgp4bgp4fgp4jgp4ngp4rgp4vgp4zil4zgp43gp47gp4/gp5Dgp5Hgp5Lgp5Pgp5Tgp5Xgp5bgp5fgp5jgp5ngp5rgp5vgp5zgp53gp57gp5/gp6Dgp6Hil4zgp6Lil4zgp6Pgp6Tgp6Xgp6bgp6fgp6jgp6ngp6rgp6vgp6zgp63gp67gp6/gp7Dgp7Hgp7Lgp7Pgp7Tgp7Xgp7bgp7fgp7jgp7ngp7rgp7vgp7zgp73gp77gp78KKworR3VybXVraGkgKFUrMEEwMC1VKzBBN0YpOgorCivgqIDgqIHil4zgqILgqIPgqITgqIXgqIbgqIfgqIjgqIngqIrgqIvgqIzgqI3gqI7gqI/gqJDgqJHgqJLgqJPgqJTgqJXgqJbgqJfgqJjgqJngqJrgqJvgqJzgqJ3gqJ7gqJ/gqKDgqKHgqKLgqKPgqKTgqKXgqKbgqKfgqKjgqKngqKrgqKvgqKzgqK3gqK7gqK/gqLDgqLHgqLLgqLPgqLTgqLXgqLbgqLfgqLjgqLngqLrgqLvil4zgqLzgqL3gqL7gqL8KK+CpgOKXjOCpgeKXjOCpguCpg+CphOCpheCphuKXjOCph+KXjOCpiOCpieCpiuKXjOCpi+KXjOCpjOKXjOCpjeCpjuCpj+CpkOCpkeCpkuCpk+CplOCpleCpluCpl+CpmOCpmeCpmuCpm+CpnOCpneCpnuCpn+CpoOCpoeCpouCpo+CppOCppeCppuCpp+CpqOCpqeCpquCpq+CprOCpreCpruCpr+KXjOCpsOKXjOCpseCpsuCps+CptOCpteCptuCpt+CpuOCpueCpuuCpu+CpvOCpveCpvuCpvworCitHdWphcmF0aSAoVSswQTgwLVUrMEFGRik6CisKK+CqgOKXjOCqgeKXjOCqguCqg+CqhOCqheCqhuCqh+CqiOCqieCqiuCqi+CqjOCqjeCqjuCqj+CqkOCqkeCqkuCqk+CqlOCqleCqluCql+CqmOCqmeCqmuCqm+CqnOCqneCqnuCqn+CqoOCqoeCqouCqo+CqpOCqpeCqpuCqp+CqqOCqqeCqquCqq+CqrOCqreCqruCqr+CqsOCqseCqsuCqs+CqtOCqteCqtuCqt+CquOCqueCquuCqu+KXjOCqvOCqveCqvuCqvwor4KuA4peM4KuB4peM4KuC4peM4KuD4peM4KuE4peM4KuF4KuG4peM4KuH4peM4KuI4KuJ4KuK4KuL4KuM4peM4KuN4KuO4KuP4KuQ4KuR4KuS4KuT4KuU4KuV4KuW4KuX4KuY4KuZ4Kua4Kub4Kuc4Kud4Kue4Kuf4Kug4Kuh4Kui4Kuj4Kuk4Kul4Kum4Kun4Kuo4Kup4Kuq4Kur4Kus4Kut4Kuu4Kuv4Kuw4Kux4Kuy4Kuz4Ku04Ku14Ku24Ku34Ku44Ku54Ku64Ku74Ku84Ku94Ku+4Ku/CisKK09yaXlhIChVKzBCMDAtVSswQjdGKToKKwor4KyA4peM4KyB4KyC4KyD4KyE4KyF4KyG4KyH4KyI4KyJ4KyK4KyL4KyM4KyN4KyO4KyP4KyQ4KyR4KyS4KyT4KyU4KyV4KyW4KyX4KyY4KyZ4Kya4Kyb4Kyc4Kyd4Kye4Kyf4Kyg4Kyh4Kyi4Kyj4Kyk4Kyl4Kym4Kyn4Kyo4Kyp4Kyq4Kyr4Kys4Kyt4Kyu4Kyv4Kyw4Kyx4Kyy4Kyz4Ky04Ky14Ky24Ky34Ky44Ky54Ky64Ky74peM4Ky84Ky94Ky+4peM4Ky/CivgrYDil4zgrYHil4zgrYLil4zgrYPgrYTgrYXgrYbgrYfgrYjgrYngrYrgrYvgrYzil4zgrY3grY7grY/grZDgrZHgrZLgrZPgrZTgrZXil4zgrZbgrZfgrZjgrZngrZrgrZvgrZzgrZ3grZ7grZ/graDgraHgraLgraPgraTgraXgrabgrafgrajgrangrargravgrazgra3gra7gra/grbDgrbHgrbLgrbPgrbTgrbXgrbbgrbfgrbjgrbngrbrgrbvgrbzgrb3grb7grb8KKworVGFtaWwgKFUrMEI4MC1VKzBCRkYpOgorCivgroDgroHil4zgroLgroPgroTgroXgrobgrofgrojgrongrorgrovgrozgro3gro7gro/grpDgrpHgrpLgrpPgrpTgrpXgrpbgrpfgrpjgrpngrprgrpvgrpzgrp3grp7grp/grqDgrqHgrqLgrqPgrqTgrqXgrqbgrqfgrqjgrqngrqrgrqvgrqzgrq3grq7grq/grrDgrrHgrrLgrrPgrrTgrrXgrrbgrrfgrrjgrrngrrrgrrvgrrzgrr3grr7grr8KK+KXjOCvgOCvgeCvguCvg+CvhOCvheCvhuCvh+CviOCvieCviuCvi+CvjOKXjOCvjeCvjuCvj+CvkOCvkeCvkuCvk+CvlOCvleCvluCvl+CvmOCvmeCvmuCvm+CvnOCvneCvnuCvn+CvoOCvoeCvouCvo+CvpOCvpeCvpuCvp+CvqOCvqeCvquCvq+CvrOCvreCvruCvr+CvsOCvseCvsuCvs+CvtOCvteCvtuCvt+CvuOCvueCvuuCvu+CvvOCvveCvvuCvvworCitUZWx1Z3UgKFUrMEMwMC1VKzBDN0YpOgorCivgsIDgsIHgsILgsIPgsITgsIXgsIbgsIfgsIjgsIngsIrgsIvgsIzgsI3gsI7gsI/gsJDgsJHgsJLgsJPgsJTgsJXgsJbgsJfgsJjgsJngsJrgsJvgsJzgsJ3gsJ7gsJ/gsKDgsKHgsKLgsKPgsKTgsKXgsKbgsKfgsKjgsKngsKrgsKvgsKzgsK3gsK7gsK/gsLDgsLHgsLLgsLPgsLTgsLXgsLbgsLfgsLjgsLngsLrgsLvgsLzgsL3il4zgsL7il4zgsL8KK+KXjOCxgOCxgeCxguCxg+CxhOCxheKXjOCxhuKXjOCxh+KXjOCxiOCxieKXjOCxiuKXjOCxi+KXjOCxjOKXjOCxjeCxjuCxj+CxkOCxkeCxkuCxk+CxlOKXjOCxleKXjOCxluCxl+CxmOCxmeCxmuCxm+CxnOCxneCxnuCxn+CxoOCxoeCxouCxo+CxpOCxpeCxpuCxp+CxqOCxqeCxquCxq+CxrOCxreCxruCxr+CxsOCxseCxsuCxs+CxtOCxteCxtuCxt+CxuOCxueCxuuCxu+CxvOCxveCxvuCxvworCitLYW5uYWRhIChVKzBDODAtVSswQ0ZGKToKKwor4LKA4LKB4LKC4LKD4LKE4LKF4LKG4LKH4LKI4LKJ4LKK4LKL4LKM4LKN4LKO4LKP4LKQ4LKR4LKS4LKT4LKU4LKV4LKW4LKX4LKY4LKZ4LKa4LKb4LKc4LKd4LKe4LKf4LKg4LKh4LKi4LKj4LKk4LKl4LKm4LKn4LKo4LKp4LKq4LKr4LKs4LKt4LKu4LKv4LKw4LKx4LKy4LKz4LK04LK14LK24LK34LK44LK54LK64LK74LK84LK94LK+4peM4LK/Civgs4Dgs4Hgs4Lgs4Pgs4Tgs4Xil4zgs4bgs4fgs4jgs4ngs4rgs4vil4zgs4zil4zgs43gs47gs4/gs5Dgs5Hgs5Lgs5Pgs5Tgs5Xgs5bgs5fgs5jgs5ngs5rgs5vgs5zgs53gs57gs5/gs6Dgs6Hgs6Lgs6Pgs6Tgs6Xgs6bgs6fgs6jgs6ngs6rgs6vgs6zgs63gs67gs6/gs7Dgs7Hgs7Lgs7Pgs7Tgs7Xgs7bgs7fgs7jgs7ngs7rgs7vgs7zgs73gs77gs78KKworTWFsYXlhbGFtIChVKzBEMDAtVSswRDdGKToKKwor4LSA4LSB4LSC4LSD4LSE4LSF4LSG4LSH4LSI4LSJ4LSK4LSL4LSM4LSN4LSO4LSP4LSQ4LSR4LSS4LST4LSU4LSV4LSW4LSX4LSY4LSZ4LSa4LSb4LSc4LSd4LSe4LSf4LSg4LSh4LSi4LSj4LSk4LSl4LSm4LSn4LSo4LSp4LSq4LSr4LSs4LSt4LSu4LSv4LSw4LSx4LSy4LSz4LS04LS14LS24LS34LS44LS54LS64LS74LS84LS94LS+4LS/CivgtYDil4zgtYHil4zgtYLil4zgtYPgtYTgtYXgtYbgtYfgtYjgtYngtYrgtYvgtYzil4zgtY3gtY7gtY/gtZDgtZHgtZLgtZPgtZTgtZXgtZbgtZfgtZjgtZngtZrgtZvgtZzgtZ3gtZ7gtZ/gtaDgtaHgtaLgtaPgtaTgtaXgtabgtafgtajgtangtargtavgtazgta3gta7gta/gtbDgtbHgtbLgtbPgtbTgtbXgtbbgtbfgtbjgtbngtbrgtbvgtbzgtb3gtb7gtb8KKworU2luaGFsYSAoVSswRDgwLVUrMERGRik6CisKK+C2gOC2geC2guC2g+C2hOC2heC2huC2h+C2iOC2ieC2iuC2i+C2jOC2jeC2juC2j+C2kOC2keC2kuC2k+C2lOC2leC2luC2l+C2mOC2meC2muC2m+C2nOC2neC2nuC2n+C2oOC2oeC2ouC2o+C2pOC2peC2puC2p+C2qOC2qeC2quC2q+C2rOC2reC2ruC2r+C2sOC2seC2suC2s+C2tOC2teC2tuC2t+C2uOC2ueC2uuC2u+C2vOC2veC2vuC2vwor4LeA4LeB4LeC4LeD4LeE4LeF4LeG4LeH4LeI4LeJ4peM4LeK4LeL4LeM4LeN4LeO4LeP4LeQ4LeR4peM4LeS4peM4LeT4peM4LeU4LeV4peM4LeW4LeX4LeY4LeZ4Lea4Leb4Lec4Led4Lee4Lef4Leg4Leh4Lei4Lej4Lek4Lel4Lem4Len4Leo4Lep4Leq4Ler4Les4Let4Leu4Lev4Lew4Lex4Ley4Lez4Le04Le14Le24Le34Le44Le54Le64Le74Le84Le94Le+4Le/CisKK1RoYWkgKFUrMEUwMC1VKzBFN0YpOgorCivguIDguIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDil4zguLHguLLguLPil4zguLTil4zguLXil4zguLbil4zguLfil4zguLjil4zguLnil4zguLrguLvguLzguL3guL7guL8KK+C5gOC5geC5guC5g+C5hOC5heC5huKXjOC5h+KXjOC5iOKXjOC5ieKXjOC5iuKXjOC5i+KXjOC5jOKXjOC5jeKXjOC5juC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5meC5muC5m+C5nOC5neC5nuC5n+C5oOC5oeC5ouC5o+C5pOC5peC5puC5p+C5qOC5qeC5quC5q+C5rOC5reC5ruC5r+C5sOC5seC5suC5s+C5tOC5teC5tuC5t+C5uOC5ueC5uuC5u+C5vOC5veC5vuC5vworCitMYW8gKFUrMEU4MC1VKzBFRkYpOgorCivguoDguoHguoLguoPguoTguoXguobguofguojguonguorguovguozguo3guo7guo/gupDgupHgupLgupPgupTgupXgupbgupfgupjgupnguprgupvgupzgup3gup7gup/guqDguqHguqLguqPguqTguqXguqbguqfguqjguqnguqrguqvguqzguq3guq7guq/gurDil4zgurHgurLgurPil4zgurTil4zgurXil4zgurbil4zgurfil4zgurjil4zgurngurril4zgurvil4zgurzgur3gur7gur8KK+C7gOC7geC7guC7g+C7hOC7heC7huC7h+KXjOC7iOKXjOC7ieKXjOC7iuKXjOC7i+KXjOC7jOKXjOC7jeC7juC7j+C7kOC7keC7kuC7k+C7lOC7leC7luC7l+C7mOC7meC7muC7m+C7nOC7neC7nuC7n+C7oOC7oeC7ouC7o+C7pOC7peC7puC7p+C7qOC7qeC7quC7q+C7rOC7reC7ruC7r+C7sOC7seC7suC7s+C7tOC7teC7tuC7t+C7uOC7ueC7uuC7u+C7vOC7veC7vuC7vworCitUaWJldGFuIChVKzBGMDAtVSswRkZGKToKKwor4LyA4LyB4LyC4LyD4LyE4LyF4LyG4LyH4LyI4LyJ4LyK4LyL4LyM4LyN4LyO4LyP4LyQ4LyR4LyS4LyT4LyU4LyV4LyW4LyX4peM4LyY4peM4LyZ4Lya4Lyb4Lyc4Lyd4Lye4Lyf4Lyg4Lyh4Lyi4Lyj4Lyk4Lyl4Lym4Lyn4Lyo4Lyp4Lyq4Lyr4Lys4Lyt4Lyu4Lyv4Lyw4Lyx4Lyy4Lyz4Ly04peM4Ly14Ly24peM4Ly34Ly44peM4Ly54Ly64Ly74Ly84Ly94Ly+4Ly/CivgvYDgvYHgvYLgvYPgvYTgvYXgvYbgvYfgvYjgvYngvYrgvYvgvYzgvY3gvY7gvY/gvZDgvZHgvZLgvZPgvZTgvZXgvZbgvZfgvZjgvZngvZrgvZvgvZzgvZ3gvZ7gvZ/gvaDgvaHgvaLgvaPgvaTgvaXgvabgvafgvajgvangvargvavgvazgva3gva7gva/gvbDil4zgvbHil4zgvbLil4zgvbPil4zgvbTil4zgvbXil4zgvbbil4zgvbfil4zgvbjil4zgvbnil4zgvbril4zgvbvil4zgvbzil4zgvb3il4zgvb7gvb8KK+KXjOC+gOKXjOC+geKXjOC+guKXjOC+g+KXjOC+hOC+heKXjOC+huKXjOC+h+C+iOC+ieC+iuC+i+C+jOC+jeC+juC+j+KXjOC+kOKXjOC+keKXjOC+kuKXjOC+k+KXjOC+lOKXjOC+leKXjOC+luKXjOC+l+C+mOKXjOC+meKXjOC+muKXjOC+m+KXjOC+nOKXjOC+neKXjOC+nuKXjOC+n+KXjOC+oOKXjOC+oeKXjOC+ouKXjOC+o+KXjOC+pOKXjOC+peKXjOC+puKXjOC+p+KXjOC+qOKXjOC+qeKXjOC+quKXjOC+q+KXjOC+rOKXjOC+reKXjOC+ruKXjOC+r+KXjOC+sOKXjOC+seKXjOC+suKXjOC+s+KXjOC+tOKXjOC+teKXjOC+tuKXjOC+t+KXjOC+uOKXjOC+ueKXjOC+uuKXjOC+u+KXjOC+vOC+veC+vuC+vwor4L+A4L+B4L+C4L+D4L+E4L+F4peM4L+G4L+H4L+I4L+J4L+K4L+L4L+M4L+N4L+O4L+P4L+Q4L+R4L+S4L+T4L+U4L+V4L+W4L+X4L+Y4L+Z4L+a4L+b4L+c4L+d4L+e4L+f4L+g4L+h4L+i4L+j4L+k4L+l4L+m4L+n4L+o4L+p4L+q4L+r4L+s4L+t4L+u4L+v4L+w4L+x4L+y4L+z4L+04L+14L+24L+34L+44L+54L+64L+74L+84L+94L++4L+/CisKK015YW5tYXIgKFUrMTAwMC1VKzEwOUYpOgorCivhgIDhgIHhgILhgIPhgIThgIXhgIbhgIfhgIjhgInhgIrhgIvhgIzhgI3hgI7hgI/hgJDhgJHhgJLhgJPhgJThgJXhgJbhgJfhgJjhgJnhgJrhgJvhgJzhgJ3hgJ7hgJ/hgKDhgKHhgKLhgKPhgKThgKXhgKbhgKfhgKjhgKnhgKrhgKvhgKzil4zhgK3il4zhgK7il4zhgK/il4zhgLDhgLHil4zhgLLhgLPhgLThgLXil4zhgLbil4zhgLfhgLjil4zhgLnhgLrhgLvhgLzhgL3hgL7hgL8KK+GBgOGBgeGBguGBg+GBhOGBheGBhuGBh+GBiOGBieGBiuGBi+GBjOGBjeGBjuGBj+GBkOGBkeGBkuGBk+GBlOGBleGBluGBl+KXjOGBmOKXjOGBmeGBmuGBm+GBnOGBneGBnuGBn+GBoOGBoeGBouGBo+GBpOGBpeGBpuGBp+GBqOGBqeGBquGBq+GBrOGBreGBruGBr+GBsOGBseGBsuGBs+GBtOGBteGBtuGBt+GBuOGBueGBuuGBu+GBvOGBveGBvuGBvwor4YKA4YKB4YKC4YKD4YKE4YKF4YKG4YKH4YKI4YKJ4YKK4YKL4YKM4YKN4YKO4YKP4YKQ4YKR4YKS4YKT4YKU4YKV4YKW4YKX4YKY4YKZ4YKa4YKb4YKc4YKd4YKe4YKfCisKK0dlb3JnaWFuIChVKzEwQTAtVSsxMEZGKToKKwor4YKg4YKh4YKi4YKj4YKk4YKl4YKm4YKn4YKo4YKp4YKq4YKr4YKs4YKt4YKu4YKv4YKw4YKx4YKy4YKz4YK04YK14YK24YK34YK44YK54YK64YK74YK84YK94YK+4YK/4YOA4YOB4YOC4YOD4YOE4YOF4YOG4YOH4YOI4YOJ4YOK4YOL4YOM4YON4YOO4YOP4YOQ4YOR4YOS4YOT4YOU4YOV4YOW4YOX4YOY4YOZ4YOa4YOb4YOc4YOd4YOe4YOfCivhg6Dhg6Hhg6Lhg6Phg6Thg6Xhg6bhg6fhg6jhg6nhg6rhg6vhg6zhg63hg67hg6/hg7Dhg7Hhg7Lhg7Phg7Thg7Xhg7bhg7fhg7jhg7nhg7rhg7vhg7zhg73hg77hg78KKworSGFuZ3VsIEphbW8gKFUrMTEwMC1VKzExRkYpOgorCivhhIDhhIHhhILhhIPhhIThhIXhhIbhhIfhhIjhhInhhIrhhIvhhIzhhI3hhI7hhI/hhJDhhJHhhJLhhJPhhJThhJXhhJbhhJfhhJjhhJnhhJrhhJvhhJzhhJ3hhJ7hhJ8KK+GEoOGEoeGEouGEo+GEpOGEpeGEpuGEp+GEqOGEqeGEquGEq+GErOGEreGEruGEr+GEsOGEseGEsuGEs+GEtOGEteGEtuGEt+GEuOGEueGEuuGEu+GEvOGEveGEvuGEvwor4YWA4YWB4YWC4YWD4YWE4YWF4YWG4YWH4YWI4YWJ4YWK4YWL4YWM4YWN4YWO4YWP4YWQ4YWR4YWS4YWT4YWU4YWV4YWW4YWX4YWY4YWZ4YWa4YWb4YWc4YWd4YWe4YWfCivhhaDhhaHhhaLhhaPhhaThhaXhhabhhafhhajhhanhharhhavhhazhha3hha7hha/hhbDhhbHhhbLhhbPhhbThhbXhhbbhhbfhhbjhhbnhhbrhhbvhhbzhhb3hhb7hhb/hhoDhhoHhhoLhhoPhhoThhoXhhobhhofhhojhhonhhorhhovhhozhho3hho7hho/hhpDhhpHhhpLhhpPhhpThhpXhhpbhhpfhhpjhhpnhhprhhpvhhpzhhp3hhp7hhp8KK+GGoOGGoeGGouGGo+GGpOGGpeGGpuGGp+GGqOGGqeGGquGGq+GGrOGGreGGruGGr+GGsOGGseGGsuGGs+GGtOGGteGGtuGGt+GGuOGGueGGuuGGu+GGvOGGveGGvuGGv+GHgOGHgeGHguGHg+GHhOGHheGHhuGHh+GHiOGHieGHiuGHi+GHjOGHjeGHjuGHj+GHkOGHkeGHkuGHk+GHlOGHleGHluGHl+GHmOGHmeGHmuGHm+GHnOGHneGHnuGHnwor4Yeg4Yeh4Yei4Yej4Yek4Yel4Yem4Yen4Yeo4Yep4Yeq4Yer4Yes4Yet4Yeu4Yev4Yew4Yex4Yey4Yez4Ye04Ye14Ye24Ye34Ye44Ye54Ye64Ye74Ye84Ye94Ye+4Ye/CisKK0V0aGlvcGljIChVKzEyMDAtVSsxMzdGKToKKwor4YiA4YiB4YiC4YiD4YiE4YiF4YiG4YiH4YiI4YiJ4YiK4YiL4YiM4YiN4YiO4YiP4YiQ4YiR4YiS4YiT4YiU4YiV4YiW4YiX4YiY4YiZ4Yia4Yib4Yic4Yid4Yie4Yif4Yig4Yih4Yii4Yij4Yik4Yil4Yim4Yin4Yio4Yip4Yiq4Yir4Yis4Yit4Yiu4Yiv4Yiw4Yix4Yiy4Yiz4Yi04Yi14Yi24Yi34Yi44Yi54Yi64Yi74Yi84Yi94Yi+4Yi/CivhiYDhiYHhiYLhiYPhiYThiYXhiYbhiYfhiYjhiYnhiYrhiYvhiYzhiY3hiY7hiY/hiZDhiZHhiZLhiZPhiZThiZXhiZbhiZfhiZjhiZnhiZrhiZvhiZzhiZ3hiZ7hiZ/hiaDhiaHhiaLhiaPhiaThiaXhiabhiafhiajhianhiarhiavhiazhia3hia7hia/hibDhibHhibLhibPhibThibXhibbhibfhibjhibnhibrhibvhibzhib3hib7hib8KK+GKgOGKgeGKguGKg+GKhOGKheGKhuGKh+GKiOGKieGKiuGKi+GKjOGKjeGKjuGKj+GKkOGKkeGKkuGKk+GKlOGKleGKluGKl+GKmOGKmeGKmuGKm+GKnOGKneGKnuGKn+GKoOGKoeGKouGKo+GKpOGKpeGKpuGKp+GKqOGKqeGKquGKq+GKrOGKreGKruGKr+GKsOGKseGKsuGKs+GKtOGKteGKtuGKt+GKuOGKueGKuuGKu+GKvOGKveGKvuGKvwor4YuA4YuB4YuC4YuD4YuE4YuF4YuG4YuH4YuI4YuJ4YuK4YuL4YuM4YuN4YuO4YuP4YuQ4YuR4YuS4YuT4YuU4YuV4YuW4YuX4YuY4YuZ4Yua4Yub4Yuc4Yud4Yue4Yuf4Yug4Yuh4Yui4Yuj4Yuk4Yul4Yum4Yun4Yuo4Yup4Yuq4Yur4Yus4Yut4Yuu4Yuv4Yuw4Yux4Yuy4Yuz4Yu04Yu14Yu24Yu34Yu44Yu54Yu64Yu74Yu84Yu94Yu+4Yu/CivhjIDhjIHhjILhjIPhjIThjIXhjIbhjIfhjIjhjInhjIrhjIvhjIzhjI3hjI7hjI/hjJDhjJHhjJLhjJPhjJThjJXhjJbhjJfhjJjhjJnhjJrhjJvhjJzhjJ3hjJ7hjJ/hjKDhjKHhjKLhjKPhjKThjKXhjKbhjKfhjKjhjKnhjKrhjKvhjKzhjK3hjK7hjK/hjLDhjLHhjLLhjLPhjLThjLXhjLbhjLfhjLjhjLnhjLrhjLvhjLzhjL3hjL7hjL8KK+GNgOGNgeGNguGNg+GNhOGNheGNhuGNh+GNiOGNieGNiuGNi+GNjOGNjeGNjuGNj+GNkOGNkeGNkuGNk+GNlOGNleGNluGNl+GNmOGNmeGNmuGNm+GNnOGNneGNnuGNn+GNoOGNoeGNouGNo+GNpOGNpeGNpuGNp+GNqOGNqeGNquGNq+GNrOGNreGNruGNr+GNsOGNseGNsuGNs+GNtOGNteGNtuGNt+GNuOGNueGNuuGNu+GNvOGNveGNvuGNvworCitGcmVlIGJsb2NrIChVKzEzODAtVSsxMzlGKToKKwor4Y6A4Y6B4Y6C4Y6D4Y6E4Y6F4Y6G4Y6H4Y6I4Y6J4Y6K4Y6L4Y6M4Y6N4Y6O4Y6P4Y6Q4Y6R4Y6S4Y6T4Y6U4Y6V4Y6W4Y6X4Y6Y4Y6Z4Y6a4Y6b4Y6c4Y6d4Y6e4Y6fCisKK0NoZXJva2VlIChVKzEzQTAtVSsxM0ZGKToKKwor4Y6g4Y6h4Y6i4Y6j4Y6k4Y6l4Y6m4Y6n4Y6o4Y6p4Y6q4Y6r4Y6s4Y6t4Y6u4Y6v4Y6w4Y6x4Y6y4Y6z4Y604Y614Y624Y634Y644Y654Y664Y674Y684Y694Y6+4Y6/4Y+A4Y+B4Y+C4Y+D4Y+E4Y+F4Y+G4Y+H4Y+I4Y+J4Y+K4Y+L4Y+M4Y+N4Y+O4Y+P4Y+Q4Y+R4Y+S4Y+T4Y+U4Y+V4Y+W4Y+X4Y+Y4Y+Z4Y+a4Y+b4Y+c4Y+d4Y+e4Y+fCivhj6Dhj6Hhj6Lhj6Phj6Thj6Xhj6bhj6fhj6jhj6nhj6rhj6vhj6zhj63hj67hj6/hj7Dhj7Hhj7Lhj7Phj7Thj7Xhj7bhj7fhj7jhj7nhj7rhj7vhj7zhj73hj77hj78KKworVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyAoVSsxNDAwLVUrMTY3Rik6CisKK+GQgOGQgeGQguGQg+GQhOGQheGQhuGQh+GQiOGQieGQiuGQi+GQjOGQjeGQjuGQj+GQkOGQkeGQkuGQk+GQlOGQleGQluGQl+GQmOGQmeGQmuGQm+GQnOGQneGQnuGQn+GQoOGQoeGQouGQo+GQpOGQpeGQpuGQp+GQqOGQqeGQquGQq+GQrOGQreGQruGQr+GQsOGQseGQsuGQs+GQtOGQteGQtuGQt+GQuOGQueGQuuGQu+GQvOGQveGQvuGQvwor4ZGA4ZGB4ZGC4ZGD4ZGE4ZGF4ZGG4ZGH4ZGI4ZGJ4ZGK4ZGL4ZGM4ZGN4ZGO4ZGP4ZGQ4ZGR4ZGS4ZGT4ZGU4ZGV4ZGW4ZGX4ZGY4ZGZ4ZGa4ZGb4ZGc4ZGd4ZGe4ZGf4ZGg4ZGh4ZGi4ZGj4ZGk4ZGl4ZGm4ZGn4ZGo4ZGp4ZGq4ZGr4ZGs4ZGt4ZGu4ZGv4ZGw4ZGx4ZGy4ZGz4ZG04ZG14ZG24ZG34ZG44ZG54ZG64ZG74ZG84ZG94ZG+4ZG/CivhkoDhkoHhkoLhkoPhkoThkoXhkobhkofhkojhkonhkorhkovhkozhko3hko7hko/hkpDhkpHhkpLhkpPhkpThkpXhkpbhkpfhkpjhkpnhkprhkpvhkpzhkp3hkp7hkp/hkqDhkqHhkqLhkqPhkqThkqXhkqbhkqfhkqjhkqnhkqrhkqvhkqzhkq3hkq7hkq/hkrDhkrHhkrLhkrPhkrThkrXhkrbhkrfhkrjhkrnhkrrhkrvhkrzhkr3hkr7hkr8KK+GTgOGTgeGTguGTg+GThOGTheGThuGTh+GTiOGTieGTiuGTi+GTjOGTjeGTjuGTj+GTkOGTkeGTkuGTk+GTlOGTleGTluGTl+GTmOGTmeGTmuGTm+GTnOGTneGTnuGTn+GToOGToeGTouGTo+GTpOGTpeGTpuGTp+GTqOGTqeGTquGTq+GTrOGTreGTruGTr+GTsOGTseGTsuGTs+GTtOGTteGTtuGTt+GTuOGTueGTuuGTu+GTvOGTveGTvuGTvwor4ZSA4ZSB4ZSC4ZSD4ZSE4ZSF4ZSG4ZSH4ZSI4ZSJ4ZSK4ZSL4ZSM4ZSN4ZSO4ZSP4ZSQ4ZSR4ZSS4ZST4ZSU4ZSV4ZSW4ZSX4ZSY4ZSZ4ZSa4ZSb4ZSc4ZSd4ZSe4ZSf4ZSg4ZSh4ZSi4ZSj4ZSk4ZSl4ZSm4ZSn4ZSo4ZSp4ZSq4ZSr4ZSs4ZSt4ZSu4ZSv4ZSw4ZSx4ZSy4ZSz4ZS04ZS14ZS24ZS34ZS44ZS54ZS64ZS74ZS84ZS94ZS+4ZS/CivhlYDhlYHhlYLhlYPhlYThlYXhlYbhlYfhlYjhlYnhlYrhlYvhlYzhlY3hlY7hlY/hlZDhlZHhlZLhlZPhlZThlZXhlZbhlZfhlZjhlZnhlZrhlZvhlZzhlZ3hlZ7hlZ/hlaDhlaHhlaLhlaPhlaThlaXhlabhlafhlajhlanhlarhlavhlazhla3hla7hla/hlbDhlbHhlbLhlbPhlbThlbXhlbbhlbfhlbjhlbnhlbrhlbvhlbzhlb3hlb7hlb8KK+GWgOGWgeGWguGWg+GWhOGWheGWhuGWh+GWiOGWieGWiuGWi+GWjOGWjeGWjuGWj+GWkOGWkeGWkuGWk+GWlOGWleGWluGWl+GWmOGWmeGWmuGWm+GWnOGWneGWnuGWn+GWoOGWoeGWouGWo+GWpOGWpeGWpuGWp+GWqOGWqeGWquGWq+GWrOGWreGWruGWr+GWsOGWseGWsuGWs+GWtOGWteGWtuGWt+GWuOGWueGWuuGWu+GWvOGWveGWvuGWvwor4ZeA4ZeB4ZeC4ZeD4ZeE4ZeF4ZeG4ZeH4ZeI4ZeJ4ZeK4ZeL4ZeM4ZeN4ZeO4ZeP4ZeQ4ZeR4ZeS4ZeT4ZeU4ZeV4ZeW4ZeX4ZeY4ZeZ4Zea4Zeb4Zec4Zed4Zee4Zef4Zeg4Zeh4Zei4Zej4Zek4Zel4Zem4Zen4Zeo4Zep4Zeq4Zer4Zes4Zet4Zeu4Zev4Zew4Zex4Zey4Zez4Ze04Ze14Ze24Ze34Ze44Ze54Ze64Ze74Ze84Ze94Ze+4Ze/CivhmIDhmIHhmILhmIPhmIThmIXhmIbhmIfhmIjhmInhmIrhmIvhmIzhmI3hmI7hmI/hmJDhmJHhmJLhmJPhmJThmJXhmJbhmJfhmJjhmJnhmJrhmJvhmJzhmJ3hmJ7hmJ/hmKDhmKHhmKLhmKPhmKThmKXhmKbhmKfhmKjhmKnhmKrhmKvhmKzhmK3hmK7hmK/hmLDhmLHhmLLhmLPhmLThmLXhmLbhmLfhmLjhmLnhmLrhmLvhmLzhmL3hmL7hmL8KK+GZgOGZgeGZguGZg+GZhOGZheGZhuGZh+GZiOGZieGZiuGZi+GZjOGZjeGZjuGZj+GZkOGZkeGZkuGZk+GZlOGZleGZluGZl+GZmOGZmeGZmuGZm+GZnOGZneGZnuGZn+GZoOGZoeGZouGZo+GZpOGZpeGZpuGZp+GZqOGZqeGZquGZq+GZrOGZreGZruGZr+GZsOGZseGZsuGZs+GZtOGZteGZtuGZt+GZuOGZueGZuuGZu+GZvOGZveGZvuGZvworCitPZ2hhbSAoVSsxNjgwLVUrMTY5Rik6CisKK+GagOGageGaguGag+GahOGaheGahuGah+GaiOGaieGaiuGai+GajOGajeGajuGaj+GakOGakeGakuGak+GalOGaleGaluGal+GamOGameGamuGam+GanOGaneGanuGanworCitSdW5pYyAoVSsxNkEwLVUrMTZGRik6CisKK+GaoOGaoeGaouGao+GapOGapeGapuGap+GaqOGaqeGaquGaq+GarOGareGaruGar+GasOGaseGasuGas+GatOGateGatuGat+GauOGaueGauuGau+GavOGaveGavuGav+GbgOGbgeGbguGbg+GbhOGbheGbhuGbh+GbiOGbieGbiuGbi+GbjOGbjeGbjuGbj+GbkOGbkeGbkuGbk+GblOGbleGbluGbl+GbmOGbmeGbmuGbm+GbnOGbneGbnuGbnwor4Zug4Zuh4Zui4Zuj4Zuk4Zul4Zum4Zun4Zuo4Zup4Zuq4Zur4Zus4Zut4Zuu4Zuv4Zuw4Zux4Zuy4Zuz4Zu04Zu14Zu24Zu34Zu44Zu54Zu64Zu74Zu84Zu94Zu+4Zu/CisKK1RhZ2Fsb2cgKFUrMTcwMC1VKzE3MUYpOgorCivhnIDhnIHhnILhnIPhnIThnIXhnIbhnIfhnIjhnInhnIrhnIvhnIzhnI3hnI7hnI/hnJDhnJHil4zhnJLil4zhnJPil4zhnJThnJXhnJbhnJfhnJjhnJnhnJrhnJvhnJzhnJ3hnJ7hnJ8KKworSGFudW5vbyAoVSsxNzIwLVUrMTczRik6CisKK+GcoOGcoeGcouGco+GcpOGcpeGcpuGcp+GcqOGcqeGcquGcq+GcrOGcreGcruGcr+GcsOGcseKXjOGcsuKXjOGcs+KXjOGctOGcteGctuGct+GcuOGcueGcuuGcu+GcvOGcveGcvuGcvworCitCdWhpZCAoVSsxNzQwLVUrMTc1Rik6CisKK+GdgOGdgeGdguGdg+GdhOGdheGdhuGdh+GdiOGdieGdiuGdi+GdjOGdjeGdjuGdj+GdkOGdkeKXjOGdkuKXjOGdk+GdlOGdleGdluGdl+GdmOGdmeGdmuGdm+GdnOGdneGdnuGdnworCitUYWdiYW53YSAoVSsxNzYwLVUrMTc3Rik6CisKK+GdoOGdoeGdouGdo+GdpOGdpeGdpuGdp+GdqOGdqeGdquGdq+GdrOGdreGdruGdr+GdsOGdseKXjOGdsuKXjOGds+GdtOGdteGdtuGdt+GduOGdueGduuGdu+GdvOGdveGdvuGdvworCitLaG1lciAoVSsxNzgwLVUrMTdGRik6CisKK+GegOGegeGeguGeg+GehOGeheGehuGeh+GeiOGeieGeiuGei+GejOGejeGejuGej+GekOGekeGekuGek+GelOGeleGeluGel+GemOGemeGemuGem+GenOGeneGenuGen+GeoOGeoeGeouGeo+GepOGepeGepuGep+GeqOGeqeGequGeq+GerOGereGeruGer+GesOGeseGesuGes+GetOGeteGetuKXjOGet+KXjOGeuOKXjOGeueKXjOGeuuKXjOGeu+KXjOGevOKXjOGeveGevuGevwor4Z+A4Z+B4Z+C4Z+D4Z+E4Z+F4peM4Z+G4Z+H4Z+I4peM4Z+J4peM4Z+K4peM4Z+L4peM4Z+M4peM4Z+N4peM4Z+O4peM4Z+P4peM4Z+Q4peM4Z+R4peM4Z+S4peM4Z+T4Z+U4Z+V4Z+W4Z+X4Z+Y4Z+Z4Z+a4Z+b4Z+c4Z+d4Z+e4Z+f4Z+g4Z+h4Z+i4Z+j4Z+k4Z+l4Z+m4Z+n4Z+o4Z+p4Z+q4Z+r4Z+s4Z+t4Z+u4Z+v4Z+w4Z+x4Z+y4Z+z4Z+04Z+14Z+24Z+34Z+44Z+54Z+64Z+74Z+84Z+94Z++4Z+/CisKK01vbmdvbGlhbiAoVSsxODAwLVUrMThBRik6CisKK+GggOGggeGgguGgg+GghOGgheGghuGgh+GgiOGgieGgiuKXjOGgi+KXjOGgjOKXjOGgjeGgjuGgj+GgkOGgkeGgkuGgk+GglOGgleGgluGgl+GgmOGgmeGgmuGgm+GgnOGgneGgnuGgn+GgoOGgoeGgouGgo+GgpOGgpeGgpuGgp+GgqOGgqeGgquGgq+GgrOGgreGgruGgr+GgsOGgseGgsuGgs+GgtOGgteGgtuGgt+GguOGgueGguuGgu+GgvOGgveGgvuGgvwor4aGA4aGB4aGC4aGD4aGE4aGF4aGG4aGH4aGI4aGJ4aGK4aGL4aGM4aGN4aGO4aGP4aGQ4aGR4aGS4aGT4aGU4aGV4aGW4aGX4aGY4aGZ4aGa4aGb4aGc4aGd4aGe4aGf4aGg4aGh4aGi4aGj4aGk4aGl4aGm4aGn4aGo4aGp4aGq4aGr4aGs4aGt4aGu4aGv4aGw4aGx4aGy4aGz4aG04aG14aG24aG34aG44aG54aG64aG74aG84aG94aG+4aG/CivhooDhooHhooLhooPhooThooXhoobhoofhoojhoonhoorhoovhoozhoo3hoo7hoo/hopDhopHhopLhopPhopThopXhopbhopfhopjhopnhoprhopvhopzhop3hop7hop/hoqDhoqHhoqLhoqPhoqThoqXhoqbhoqfhoqjil4zhoqnhoqrhoqvhoqzhoq3hoq7hoq8KKworRnJlZSBibG9jayAoVSsxOEIwLVUrMThGRik6CisKK+GisOGiseGisuGis+GitOGiteGituGit+GiuOGiueGiuuGiu+GivOGiveGivuGiv+GjgOGjgeGjguGjg+GjhOGjheGjhuGjh+GjiOGjieGjiuGji+GjjOGjjeGjjuGjj+GjkOGjkeGjkuGjk+GjlOGjleGjluGjl+GjmOGjmeGjmuGjm+GjnOGjneGjnuGjn+GjoOGjoeGjouGjo+GjpOGjpeGjpuGjp+GjqOGjqeGjquGjq+GjrOGjreGjruGjrwor4aOw4aOx4aOy4aOz4aO04aO14aO24aO34aO44aO54aO64aO74aO84aO94aO+4aO/CisKK0xpbWJ1IChVKzE5MDAtVSsxOTRGKToKKwor4aSA4aSB4aSC4aSD4aSE4aSF4aSG4aSH4aSI4aSJ4aSK4aSL4aSM4aSN4aSO4aSP4aSQ4aSR4aSS4aST4aSU4aSV4aSW4aSX4aSY4aSZ4aSa4aSb4aSc4aSd4aSe4aSf4aSg4aSh4aSi4aSj4aSk4aSl4aSm4aSn4aSo4aSp4aSq4aSr4aSs4aSt4aSu4aSv4aSw4aSx4aSy4aSz4aS04aS14aS24aS34aS44aS54aS64aS74aS84aS94aS+4aS/CivhpYDhpYHhpYLhpYPhpYThpYXhpYbhpYfhpYjhpYnhpYrhpYvhpYzhpY3hpY7hpY8KKworVGFpIExlIChVKzE5NTAtVSsxOTdGKToKKwor4aWQ4aWR4aWS4aWT4aWU4aWV4aWW4aWX4aWY4aWZ4aWa4aWb4aWc4aWd4aWe4aWf4aWg4aWh4aWi4aWj4aWk4aWl4aWm4aWn4aWo4aWp4aWq4aWr4aWs4aWt4aWu4aWv4aWw4aWx4aWy4aWz4aW04aW14aW24aW34aW44aW54aW64aW74aW84aW94aW+4aW/CisKK0ZyZWUgYmxvY2sgKFUrMTk4MC1VKzE5REYpOgorCivhpoDhpoHhpoLhpoPhpoThpoXhpobhpofhpojhponhporhpovhpozhpo3hpo7hpo/hppDhppHhppLhppPhppThppXhppbhppfhppjhppnhpprhppvhppzhpp3hpp7hpp/hpqDhpqHhpqLhpqPhpqThpqXhpqbhpqfhpqjhpqnhpqrhpqvhpqzhpq3hpq7hpq/hprDhprHhprLhprPhprThprXhprbhprfhprjhprnhprrhprvhprzhpr3hpr7hpr8KK+GngOGngeGnguGng+GnhOGnheGnhuGnh+GniOGnieGniuGni+GnjOGnjeGnjuGnj+GnkOGnkeGnkuGnk+GnlOGnleGnluGnl+GnmOGnmeGnmuGnm+GnnOGnneGnnuGnnworCitLaG1lciBTeW1ib2xzIChVKzE5RTAtVSsxOUZGKToKKwor4aeg4aeh4aei4aej4aek4ael4aem4aen4aeo4aep4aeq4aer4aes4aet4aeu4aev4aew4aex4aey4aez4ae04ae14ae24ae34ae44ae54ae64ae74ae84ae94ae+4ae/CisKK0ZyZWUgYmxvY2sgKFUrMUEwMC1VKzFDRkYpOgorCivhqIDhqIHhqILhqIPhqIThqIXhqIbhqIfhqIjhqInhqIrhqIvhqIzhqI3hqI7hqI/hqJDhqJHhqJLhqJPhqJThqJXhqJbhqJfhqJjhqJnhqJrhqJvhqJzhqJ3hqJ7hqJ/hqKDhqKHhqKLhqKPhqKThqKXhqKbhqKfhqKjhqKnhqKrhqKvhqKzhqK3hqK7hqK/hqLDhqLHhqLLhqLPhqLThqLXhqLbhqLfhqLjhqLnhqLrhqLvhqLzhqL3hqL7hqL8KK+GpgOGpgeGpguGpg+GphOGpheGphuGph+GpiOGpieGpiuGpi+GpjOGpjeGpjuGpj+GpkOGpkeGpkuGpk+GplOGpleGpluGpl+GpmOGpmeGpmuGpm+GpnOGpneGpnuGpn+GpoOGpoeGpouGpo+GppOGppeGppuGpp+GpqOGpqeGpquGpq+GprOGpreGpruGpr+GpsOGpseGpsuGps+GptOGpteGptuGpt+GpuOGpueGpuuGpu+GpvOGpveGpvuGpvwor4aqA4aqB4aqC4aqD4aqE4aqF4aqG4aqH4aqI4aqJ4aqK4aqL4aqM4aqN4aqO4aqP4aqQ4aqR4aqS4aqT4aqU4aqV4aqW4aqX4aqY4aqZ4aqa4aqb4aqc4aqd4aqe4aqf4aqg4aqh4aqi4aqj4aqk4aql4aqm4aqn4aqo4aqp4aqq4aqr4aqs4aqt4aqu4aqv4aqw4aqx4aqy4aqz4aq04aq14aq24aq34aq44aq54aq64aq74aq84aq94aq+4aq/Civhq4Dhq4Hhq4Lhq4Phq4Thq4Xhq4bhq4fhq4jhq4nhq4rhq4vhq4zhq43hq47hq4/hq5Dhq5Hhq5Lhq5Phq5Thq5Xhq5bhq5fhq5jhq5nhq5rhq5vhq5zhq53hq57hq5/hq6Dhq6Hhq6Lhq6Phq6Thq6Xhq6bhq6fhq6jhq6nhq6rhq6vhq6zhq63hq67hq6/hq7Dhq7Hhq7Lhq7Phq7Thq7Xhq7bhq7fhq7jhq7nhq7rhq7vhq7zhq73hq77hq78KK+GsgOGsgeGsguGsg+GshOGsheGshuGsh+GsiOGsieGsiuGsi+GsjOGsjeGsjuGsj+GskOGskeGskuGsk+GslOGsleGsluGsl+GsmOGsmeGsmuGsm+GsnOGsneGsnuGsn+GsoOGsoeGsouGso+GspOGspeGspuGsp+GsqOGsqeGsquGsq+GsrOGsreGsruGsr+GssOGsseGssuGss+GstOGsteGstuGst+GsuOGsueGsuuGsu+GsvOGsveGsvuGsvwor4a2A4a2B4a2C4a2D4a2E4a2F4a2G4a2H4a2I4a2J4a2K4a2L4a2M4a2N4a2O4a2P4a2Q4a2R4a2S4a2T4a2U4a2V4a2W4a2X4a2Y4a2Z4a2a4a2b4a2c4a2d4a2e4a2f4a2g4a2h4a2i4a2j4a2k4a2l4a2m4a2n4a2o4a2p4a2q4a2r4a2s4a2t4a2u4a2v4a2w4a2x4a2y4a2z4a204a214a224a234a244a254a264a274a284a294a2+4a2/CivhroDhroHhroLhroPhroThroXhrobhrofhrojhronhrorhrovhrozhro3hro7hro/hrpDhrpHhrpLhrpPhrpThrpXhrpbhrpfhrpjhrpnhrprhrpvhrpzhrp3hrp7hrp/hrqDhrqHhrqLhrqPhrqThrqXhrqbhrqfhrqjhrqnhrqrhrqvhrqzhrq3hrq7hrq/hrrDhrrHhrrLhrrPhrrThrrXhrrbhrrfhrrjhrrnhrrrhrrvhrrzhrr3hrr7hrr8KK+GvgOGvgeGvguGvg+GvhOGvheGvhuGvh+GviOGvieGviuGvi+GvjOGvjeGvjuGvj+GvkOGvkeGvkuGvk+GvlOGvleGvluGvl+GvmOGvmeGvmuGvm+GvnOGvneGvnuGvn+GvoOGvoeGvouGvo+GvpOGvpeGvpuGvp+GvqOGvqeGvquGvq+GvrOGvreGvruGvr+GvsOGvseGvsuGvs+GvtOGvteGvtuGvt+GvuOGvueGvuuGvu+GvvOGvveGvvuGvvwor4bCA4bCB4bCC4bCD4bCE4bCF4bCG4bCH4bCI4bCJ4bCK4bCL4bCM4bCN4bCO4bCP4bCQ4bCR4bCS4bCT4bCU4bCV4bCW4bCX4bCY4bCZ4bCa4bCb4bCc4bCd4bCe4bCf4bCg4bCh4bCi4bCj4bCk4bCl4bCm4bCn4bCo4bCp4bCq4bCr4bCs4bCt4bCu4bCv4bCw4bCx4bCy4bCz4bC04bC14bC24bC34bC44bC54bC64bC74bC84bC94bC+4bC/CivhsYDhsYHhsYLhsYPhsYThsYXhsYbhsYfhsYjhsYnhsYrhsYvhsYzhsY3hsY7hsY/hsZDhsZHhsZLhsZPhsZThsZXhsZbhsZfhsZjhsZnhsZrhsZvhsZzhsZ3hsZ7hsZ/hsaDhsaHhsaLhsaPhsaThsaXhsabhsafhsajhsanhsarhsavhsazhsa3hsa7hsa/hsbDhsbHhsbLhsbPhsbThsbXhsbbhsbfhsbjhsbnhsbrhsbvhsbzhsb3hsb7hsb8KK+GygOGygeGyguGyg+GyhOGyheGyhuGyh+GyiOGyieGyiuGyi+GyjOGyjeGyjuGyj+GykOGykeGykuGyk+GylOGyleGyluGyl+GymOGymeGymuGym+GynOGyneGynuGyn+GyoOGyoeGyouGyo+GypOGypeGypuGyp+GyqOGyqeGyquGyq+GyrOGyreGyruGyr+GysOGyseGysuGys+GytOGyteGytuGyt+GyuOGyueGyuuGyu+GyvOGyveGyvuGyvwor4bOA4bOB4bOC4bOD4bOE4bOF4bOG4bOH4bOI4bOJ4bOK4bOL4bOM4bON4bOO4bOP4bOQ4bOR4bOS4bOT4bOU4bOV4bOW4bOX4bOY4bOZ4bOa4bOb4bOc4bOd4bOe4bOf4bOg4bOh4bOi4bOj4bOk4bOl4bOm4bOn4bOo4bOp4bOq4bOr4bOs4bOt4bOu4bOv4bOw4bOx4bOy4bOz4bO04bO14bO24bO34bO44bO54bO64bO74bO84bO94bO+4bO/CisKK1Bob25ldGljIEV4dGVuc2lvbnMgKFUrMUQwMC1VKzFEN0YpOgorCivhtIDhtIHhtILhtIPhtIThtIXhtIbhtIfhtIjhtInhtIrhtIvhtIzhtI3htI7htI/htJDhtJHhtJLhtJPhtJThtJXhtJbhtJfhtJjhtJnhtJrhtJvhtJzhtJ3htJ7htJ/htKDhtKHhtKLhtKPhtKThtKXhtKbhtKfhtKjhtKnhtKrhtKvhtKzhtK3htK7htK/htLDhtLHhtLLhtLPhtLThtLXhtLbhtLfhtLjhtLnhtLrhtLvhtLzhtL3htL7htL8KK+G1gOG1geG1guG1g+G1hOG1heG1huG1h+G1iOG1ieG1iuG1i+G1jOG1jeG1juG1j+G1kOG1keG1kuG1k+G1lOG1leG1luG1l+G1mOG1meG1muG1m+G1nOG1neG1nuG1n+G1oOG1oeG1ouG1o+G1pOG1peG1puG1p+G1qOG1qeG1quG1q+G1rOG1reG1ruG1r+G1sOG1seG1suG1s+G1tOG1teG1tuG1t+G1uOG1ueG1uuG1u+G1vOG1veG1vuG1vworCitGcmVlIGJsb2NrIChVKzFEODAtVSsxREZGKToKKwor4baA4baB4baC4baD4baE4baF4baG4baH4baI4baJ4baK4baL4baM4baN4baO4baP4baQ4baR4baS4baT4baU4baV4baW4baX4baY4baZ4baa4bab4bac4bad4bae4baf4bag4bah4bai4baj4bak4bal4bam4ban4bao4bap4baq4bar4bas4bat4bau4bav4baw4bax4bay4baz4ba04ba14ba24ba34ba44ba54ba64ba74ba84ba94ba+4ba/Civht4Dht4Hht4Lht4Pht4Tht4Xht4bht4fht4jht4nht4rht4vht4zht43ht47ht4/ht5Dht5Hht5Lht5Pht5Tht5Xht5bht5fht5jht5nht5rht5vht5zht53ht57ht5/ht6Dht6Hht6Lht6Pht6Tht6Xht6bht6fht6jht6nht6rht6vht6zht63ht67ht6/ht7Dht7Hht7Lht7Pht7Tht7Xht7bht7fht7jht7nht7rht7vht7zht73ht77ht78KKworTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCAoVSsxRTAwLVUrMUVGRik6CisKK+G4gOG4geG4guG4g+G4hOG4heG4huG4h+G4iOG4ieG4iuG4i+G4jOG4jeG4juG4j+G4kOG4keG4kuG4k+G4lOG4leG4luG4l+G4mOG4meG4muG4m+G4nOG4neG4nuG4n+G4oOG4oeG4ouG4o+G4pOG4peG4puG4p+G4qOG4qeG4quG4q+G4rOG4reG4ruG4r+G4sOG4seG4suG4s+G4tOG4teG4tuG4t+G4uOG4ueG4uuG4u+G4vOG4veG4vuG4vwor4bmA4bmB4bmC4bmD4bmE4bmF4bmG4bmH4bmI4bmJ4bmK4bmL4bmM4bmN4bmO4bmP4bmQ4bmR4bmS4bmT4bmU4bmV4bmW4bmX4bmY4bmZ4bma4bmb4bmc4bmd4bme4bmf4bmg4bmh4bmi4bmj4bmk4bml4bmm4bmn4bmo4bmp4bmq4bmr4bms4bmt4bmu4bmv4bmw4bmx4bmy4bmz4bm04bm14bm24bm34bm44bm54bm64bm74bm84bm94bm+4bm/CivhuoDhuoHhuoLhuoPhuoThuoXhuobhuofhuojhuonhuorhuovhuozhuo3huo7huo/hupDhupHhupLhupPhupThupXhupbhupfhupjhupnhuprhupvhupzhup3hup7hup/huqDhuqHhuqLhuqPhuqThuqXhuqbhuqfhuqjhuqnhuqrhuqvhuqzhuq3huq7huq/hurDhurHhurLhurPhurThurXhurbhurfhurjhurnhurrhurvhurzhur3hur7hur8KK+G7gOG7geG7guG7g+G7hOG7heG7huG7h+G7iOG7ieG7iuG7i+G7jOG7jeG7juG7j+G7kOG7keG7kuG7k+G7lOG7leG7luG7l+G7mOG7meG7muG7m+G7nOG7neG7nuG7n+G7oOG7oeG7ouG7o+G7pOG7peG7puG7p+G7qOG7qeG7quG7q+G7rOG7reG7ruG7r+G7sOG7seG7suG7s+G7tOG7teG7tuG7t+G7uOG7ueG7uuG7u+G7vOG7veG7vuG7vworCitHcmVlayBFeHRlbmRlZCAoVSsxRjAwLVUrMUZGRik6CisKK+G8gOG8geG8guG8g+G8hOG8heG8huG8h+G8iOG8ieG8iuG8i+G8jOG8jeG8juG8j+G8kOG8keG8kuG8k+G8lOG8leG8luG8l+G8mOG8meG8muG8m+G8nOG8neG8nuG8n+G8oOG8oeG8ouG8o+G8pOG8peG8puG8p+G8qOG8qeG8quG8q+G8rOG8reG8ruG8r+G8sOG8seG8suG8s+G8tOG8teG8tuG8t+G8uOG8ueG8uuG8u+G8vOG8veG8vuG8vwor4b2A4b2B4b2C4b2D4b2E4b2F4b2G4b2H4b2I4b2J4b2K4b2L4b2M4b2N4b2O4b2P4b2Q4b2R4b2S4b2T4b2U4b2V4b2W4b2X4b2Y4b2Z4b2a4b2b4b2c4b2d4b2e4b2f4b2g4b2h4b2i4b2j4b2k4b2l4b2m4b2n4b2o4b2p4b2q4b2r4b2s4b2t4b2u4b2v4b2w4b2x4b2y4b2z4b204b214b224b234b244b254b264b274b284b294b2+4b2/CivhvoDhvoHhvoLhvoPhvoThvoXhvobhvofhvojhvonhvorhvovhvozhvo3hvo7hvo/hvpDhvpHhvpLhvpPhvpThvpXhvpbhvpfhvpjhvpnhvprhvpvhvpzhvp3hvp7hvp/hvqDhvqHhvqLhvqPhvqThvqXhvqbhvqfhvqjhvqnhvqrhvqvhvqzhvq3hvq7hvq/hvrDhvrHhvrLhvrPhvrThvrXhvrbhvrfhvrjhvrnhvrrhvrvhvrzhvr3hvr7hvr8KK+G/gOG/geG/guG/g+G/hOG/heG/huG/h+G/iOG/ieG/iuG/i+G/jOG/jeG/juG/j+G/kOG/keG/kuG/k+G/lOG/leG/luG/l+G/mOG/meG/muG/m+G/nOG/neG/nuG/n+G/oOG/oeG/ouG/o+G/pOG/peG/puG/p+G/qOG/qeG/quG/q+G/rOG/reG/ruG/r+G/sOG/seG/suG/s+G/tOG/teG/tuG/t+G/uOG/ueG/uuG/u+G/vOG/veG/vuG/vworCitHZW5lcmFsIFB1bmN0dWF0aW9uIChVKzIwMDAtVSsyMDZGKToKKwor4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCL4oCM4oCN4oCO4oCP4oCQ4oCR4oCS4oCT4oCU4oCV4oCW4oCX4oCY4oCZ4oCa4oCb4oCc4oCd4oCe4oCf4oCg4oCh4oCi4oCj4oCk4oCl4oCm4oCn4oCo4oCp4oCq4oCr4oCs4oCt4oCu4oCv4oCw4oCx4oCy4oCz4oC04oC14oC24oC34oC44oC54oC64oC74oC84oC94oC+4oC/CivigYDigYHigYLigYPigYTigYXigYbigYfigYjigYnigYrigYvigYzigY3igY7igY/igZDigZHigZLigZPigZTigZXigZbigZfigZjigZnigZrigZvigZzigZ3igZ7igZ/igaDigaHigaLigaPigaTigaXigabigafigajiganigarigavigaziga3iga7iga8KKworU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzIChVKzIwNzAtVSsyMDlGKToKKwor4oGw4oGx4oGy4oGz4oG04oG14oG24oG34oG44oG54oG64oG74oG84oG94oG+4oG/4oKA4oKB4oKC4oKD4oKE4oKF4oKG4oKH4oKI4oKJ4oKK4oKL4oKM4oKN4oKO4oKP4oKQ4oKR4oKS4oKT4oKU4oKV4oKW4oKX4oKY4oKZ4oKa4oKb4oKc4oKd4oKe4oKfCisKK0N1cnJlbmN5IFN5bWJvbHMgKFUrMjBBMC1VKzIwQ0YpOgorCivigqDigqHigqLigqPigqTigqXigqbigqfigqjigqnigqrigqvigqzigq3igq7igq/igrDigrHigrLigrPigrTigrXigrbigrfigrjigrnigrrigrvigrzigr3igr7igr/ig4Dig4Hig4Lig4Pig4Tig4Xig4big4fig4jig4nig4rig4vig4zig43ig47ig48KKworQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIGZvciBTeW1ib2xzIChVKzIwRDAtVSsyMEZGKToKKwor4peM4oOQ4peM4oOR4peM4oOS4peM4oOT4peM4oOU4peM4oOV4peM4oOW4peM4oOX4peM4oOY4peM4oOZ4peM4oOa4peM4oOb4peM4oOcIOKDnSDig54g4oOfIOKDoOKXjOKDoSDig6Ig4oOjIOKDpOKXjOKDpeKXjOKDpuKXjOKDp+KXjOKDqOKXjOKDqeKXjOKDquKDq+KDrOKDreKDruKDr+KDsOKDseKDsuKDs+KDtOKDteKDtuKDt+KDuOKDueKDuuKDu+KDvOKDveKDvuKDvworCitMZXR0ZXJsaWtlIFN5bWJvbHMgKFUrMjEwMC1VKzIxNEYpOgorCivihIDihIHihILihIPihITihIXihIbihIfihIjihInihIrihIvihIzihI3ihI7ihI/ihJDihJHihJLihJPihJTihJXihJbihJfihJjihJnihJrihJvihJzihJ3ihJ7ihJ/ihKDihKHihKLihKPihKTihKXihKbihKfihKjihKnihKrihKvihKzihK3ihK7ihK/ihLDihLHihLLihLPihLTihLXihLbihLfihLjihLnihLrihLvihLzihL3ihL7ihL8KK+KFgOKFgeKFguKFg+KFhOKFheKFhuKFh+KFiOKFieKFiuKFi+KFjOKFjeKFjuKFjworCitOdW1iZXIgRm9ybXMgKFUrMjE1MC1VKzIxOEYpOgorCivihZDihZHihZLihZPihZTihZXihZbihZfihZjihZnihZrihZvihZzihZ3ihZ7ihZ/ihaDihaHihaLihaPihaTihaXihabihafihajihaniharihavihaziha3iha7iha/ihbDihbHihbLihbPihbTihbXihbbihbfihbjihbnihbrihbvihbzihb3ihb7ihb/ihoDihoHihoLihoPihoTihoXihobihofihojihonihorihovihoziho3iho7iho8KKworQXJyb3dzIChVKzIxOTAtVSsyMUZGKToKKwor4oaQ4oaR4oaS4oaT4oaU4oaV4oaW4oaX4oaY4oaZ4oaa4oab4oac4oad4oae4oaf4oag4oah4oai4oaj4oak4oal4oam4oan4oao4oap4oaq4oar4oas4oat4oau4oav4oaw4oax4oay4oaz4oa04oa14oa24oa34oa44oa54oa64oa74oa84oa94oa+4oa/4oeA4oeB4oeC4oeD4oeE4oeF4oeG4oeH4oeI4oeJ4oeK4oeL4oeM4oeN4oeO4oePCivih5Dih5Hih5Lih5Pih5Tih5Xih5bih5fih5jih5nih5rih5vih5zih53ih57ih5/ih6Dih6Hih6Lih6Pih6Tih6Xih6bih6fih6jih6nih6rih6vih6zih63ih67ih6/ih7Dih7Hih7Lih7Pih7Tih7Xih7bih7fih7jih7nih7rih7vih7zih73ih77ih78KKworTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAoVSsyMjAwLVUrMjJGRik6CisKK+KIgOKIgeKIguKIg+KIhOKIheKIhuKIh+KIiOKIieKIiuKIi+KIjOKIjeKIjuKIj+KIkOKIkeKIkuKIk+KIlOKIleKIluKIl+KImOKImeKImuKIm+KInOKIneKInuKIn+KIoOKIoeKIouKIo+KIpOKIpeKIpuKIp+KIqOKIqeKIquKIq+KIrOKIreKIruKIr+KIsOKIseKIsuKIs+KItOKIteKItuKIt+KIuOKIueKIuuKIu+KIvOKIveKIvuKIvwor4omA4omB4omC4omD4omE4omF4omG4omH4omI4omJ4omK4omL4omM4omN4omO4omP4omQ4omR4omS4omT4omU4omV4omW4omX4omY4omZ4oma4omb4omc4omd4ome4omf4omg4omh4omi4omj4omk4oml4omm4omn4omo4omp4omq4omr4oms4omt4omu4omv4omw4omx4omy4omz4om04om14om24om34om44om54om64om74om84om94om+4om/CiviioDiioHiioLiioPiioTiioXiiobiiofiiojiioniioriioviioziio3iio7iio/iipDiipHiipLiipPiipTiipXiipbiipfiipjiipniipriipviipziip3iip7iip/iiqDiiqHiiqLiiqPiiqTiiqXiiqbiiqfiiqjiiqniiqriiqviiqziiq3iiq7iiq/iirDiirHiirLiirPiirTiirXiirbiirfiirjiirniirriirviirziir3iir7iir8KK+KLgOKLgeKLguKLg+KLhOKLheKLhuKLh+KLiOKLieKLiuKLi+KLjOKLjeKLjuKLj+KLkOKLkeKLkuKLk+KLlOKLleKLluKLl+KLmOKLmeKLmuKLm+KLnOKLneKLnuKLn+KLoOKLoeKLouKLo+KLpOKLpeKLpuKLp+KLqOKLqeKLquKLq+KLrOKLreKLruKLr+KLsOKLseKLsuKLs+KLtOKLteKLtuKLt+KLuOKLueKLuuKLu+KLvOKLveKLvuKLvworCitNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAoVSsyMzAwLVUrMjNGRik6CisKK+KMgOKMgeKMguKMg+KMhOKMheKMhuKMh+KMiOKMieKMiuKMi+KMjOKMjeKMjuKMj+KMkOKMkeKMkuKMk+KMlOKMleKMluKMl+KMmOKMmeKMmuKMm+KMnOKMneKMnuKMn+KMoOKMoeKMouKMo+KMpOKMpeKMpuKMp+KMqOKMqeKMquKMq+KMrOKMreKMruKMr+KMsOKMseKMsuKMs+KMtOKMteKMtuKMt+KMuOKMueKMuuKMu+KMvOKMvQor4oy+4oy/4o2A4o2B4o2C4o2D4o2E4o2F4o2G4o2H4o2I4o2J4o2K4o2L4o2M4o2N4o2O4o2P4o2Q4o2R4o2S4o2T4o2U4o2V4o2W4o2X4o2Y4o2Z4o2a4o2b4o2c4o2d4o2e4o2f4o2g4o2h4o2i4o2j4o2k4o2l4o2m4o2n4o2o4o2p4o2q4o2r4o2s4o2t4o2u4o2v4o2w4o2x4o2y4o2z4o204o214o224o234o244o254o264o274o284o29Civijb7ijb/ijoDijoHijoLijoPijoTijoXijobijofijojijonijorijovijozijo3ijo7ijo/ijpDijpHijpLijpPijpTijpXijpbijpfijpjijpnijprijpvijpzijp3ijp7ijp/ijqDijqHijqLijqPijqTijqXijqbijqfijqjijqnijqrijqvijqzijq3ijq7ijq/ijrDijrHijrLijrPijrTijrXijrbijrfijrjijrnijrrijrvijrzijr0KK+KOvuKOv+KPgOKPgeKPguKPg+KPhOKPheKPhuKPh+KPiOKPieKPiuKPi+KPjOKPjeKPjuKPj+KPkOKPkeKPkuKPk+KPlOKPleKPluKPl+KPmOKPmeKPmuKPm+KPnOKPneKPnuKPn+KPoOKPoeKPouKPo+KPpOKPpeKPpuKPp+KPqOKPqeKPquKPq+KPrOKPreKPruKPr+KPsOKPseKPsuKPs+KPtOKPteKPtuKPt+KPuOKPueKPuuKPu+KPvOKPvQor4o++4o+/CisKK0NvbnRyb2wgUGljdHVyZXMgKFUrMjQwMC1VKzI0M0YpOgorCivikIDikIHikILikIPikITikIXikIbikIfikIjikInikIrikIvikIzikI3ikI7ikI/ikJDikJHikJLikJPikJTikJXikJbikJfikJjikJnikJrikJvikJzikJ3ikJ7ikJ/ikKDikKHikKLikKPikKTikKXikKbikKfikKjikKnikKrikKvikKzikK3ikK7ikK/ikLDikLHikLLikLPikLTikLXikLbikLfikLjikLnikLrikLvikLzikL3ikL7ikL8KKworT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24gKFUrMjQ0MC1VKzI0NUYpOgorCivikYDikYHikYLikYPikYTikYXikYbikYfikYjikYnikYrikYvikYzikY3ikY7ikY/ikZDikZHikZLikZPikZTikZXikZbikZfikZjikZnikZrikZvikZzikZ3ikZ7ikZ8KKworRW5jbG9zZWQgQWxwaGFudW1lcmljcyAoVSsyNDYwLVUrMjRGRik6CisKK+KRoOKRoeKRouKRo+KRpOKRpeKRpuKRp+KRqOKRqeKRquKRq+KRrOKRreKRruKRr+KRsOKRseKRsuKRs+KRtOKRteKRtuKRt+KRuOKRueKRuuKRu+KRvOKRveKRvuKRv+KSgOKSgeKSguKSg+KShOKSheKShuKSh+KSiOKSieKSiuKSi+KSjOKSjeKSjuKSj+KSkOKSkeKSkuKSk+KSlOKSleKSluKSl+KSmOKSmeKSmuKSm+KSnOKSneKSnuKSnwor4pKg4pKh4pKi4pKj4pKk4pKl4pKm4pKn4pKo4pKp4pKq4pKr4pKs4pKt4pKu4pKv4pKw4pKx4pKy4pKz4pK04pK14pK24pK34pK44pK54pK64pK74pK84pK94pK+4pK/4pOA4pOB4pOC4pOD4pOE4pOF4pOG4pOH4pOI4pOJ4pOK4pOL4pOM4pON4pOO4pOP4pOQ4pOR4pOS4pOT4pOU4pOV4pOW4pOX4pOY4pOZ4pOa4pOb4pOc4pOd4pOe4pOfCivik6Dik6Hik6Lik6Pik6Tik6Xik6bik6fik6jik6nik6rik6vik6zik63ik67ik6/ik7Dik7Hik7Lik7Pik7Tik7Xik7bik7fik7jik7nik7rik7vik7zik73ik77ik78KKworQm94IERyYXdpbmcgKFUrMjUwMC1VKzI1N0YpOgorCivilIDilIHilILilIPilITilIXilIbilIfilIjilInilIrilIvilIzilI3ilI7ilI/ilJDilJHilJLilJPilJTilJXilJbilJfilJjilJnilJrilJvilJzilJ3ilJ7ilJ/ilKDilKHilKLilKPilKTilKXilKbilKfilKjilKnilKrilKvilKzilK3ilK7ilK/ilLDilLHilLLilLPilLTilLXilLbilLfilLjilLnilLrilLvilLzilL3ilL7ilL8KK+KVgOKVgeKVguKVg+KVhOKVheKVhuKVh+KViOKVieKViuKVi+KVjOKVjeKVjuKVj+KVkOKVkeKVkuKVk+KVlOKVleKVluKVl+KVmOKVmeKVmuKVm+KVnOKVneKVnuKVn+KVoOKVoeKVouKVo+KVpOKVpeKVpuKVp+KVqOKVqeKVquKVq+KVrOKVreKVruKVr+KVsOKVseKVsuKVs+KVtOKVteKVtuKVt+KVuOKVueKVuuKVu+KVvOKVveKVvuKVvworCitCbG9jayBFbGVtZW50cyAoVSsyNTgwLVUrMjU5Rik6CisKK+KWgOKWgeKWguKWg+KWhOKWheKWhuKWh+KWiOKWieKWiuKWi+KWjOKWjeKWjuKWj+KWkOKWkeKWkuKWk+KWlOKWleKWluKWl+KWmOKWmeKWmuKWm+KWnOKWneKWnuKWnworCitHZW9tZXRyaWMgU2hhcGVzIChVKzI1QTAtVSsyNUZGKToKKwor4pag4pah4pai4paj4pak4pal4pam4pan4pao4pap4paq4par4pas4pat4pau4pav4paw4pax4pay4paz4pa04pa14pa24pa34pa44pa54pa64pa74pa84pa94pa+4pa/4peA4peB4peC4peD4peE4peF4peG4peH4peI4peJ4peK4peL4peM4peN4peO4peP4peQ4peR4peS4peT4peU4peV4peW4peX4peY4peZ4pea4peb4pec4ped4pee4pefCivil6Dil6Hil6Lil6Pil6Til6Xil6bil6fil6jil6nil6ril6vil6zil63il67il6/il7Dil7Hil7Lil7Pil7Til7Xil7bil7fil7jil7nil7ril7vil7zil73il77il78KKworTWlzY2VsbGFuZW91cyBTeW1ib2xzIChVKzI2MDAtVSsyNkZGKToKKwor4piA4piB4piC4piD4piE4piF4piG4piH4piI4piJ4piK4piL4piM4piN4piO4piP4piQ4piR4piS4piT4piU4piV4piW4piX4piY4piZ4pia4pib4pic4pid4pie4pif4pig4pih4pii4pij4pik4pil4pim4pin4pio4pip4piq4pir4pis4pit4piu4piv4piw4pix4piy4piz4pi04pi14pi24pi34pi44pi54pi64pi74pi84pi94pi+4pi/CivimYDimYHimYLimYPimYTimYXimYbimYfimYjimYnimYrimYvimYzimY3imY7imY/imZDimZHimZLimZPimZTimZXimZbimZfimZjimZnimZrimZvimZzimZ3imZ7imZ/imaDimaHimaLimaPimaTimaXimabimafimajimanimarimavimazima3ima7ima/imbDimbHimbLimbPimbTimbXimbbimbfimbjimbnimbrimbvimbzimb3imb7imb8KK+KagOKageKaguKag+KahOKaheKahuKah+KaiOKaieKaiuKai+KajOKajeKajuKaj+KakOKakeKakuKak+KalOKaleKaluKal+KamOKameKamuKam+KanOKaneKanuKan+KaoOKaoeKaouKao+KapOKapeKapuKap+KaqOKaqeKaquKaq+KarOKareKaruKar+KasOKaseKasuKas+KatOKateKatuKat+KauOKaueKauuKau+KavOKaveKavuKavwor4puA4puB4puC4puD4puE4puF4puG4puH4puI4puJ4puK4puL4puM4puN4puO4puP4puQ4puR4puS4puT4puU4puV4puW4puX4puY4puZ4pua4pub4puc4pud4pue4puf4pug4puh4pui4puj4puk4pul4pum4pun4puo4pup4puq4pur4pus4put4puu4puv4puw4pux4puy4puz4pu04pu14pu24pu34pu44pu54pu64pu74pu84pu94pu+4pu/CisKK0RpbmdiYXRzIChVKzI3MDAtVSsyN0JGKToKKwor4pyA4pyB4pyC4pyD4pyE4pyF4pyG4pyH4pyI4pyJ4pyK4pyL4pyM4pyN4pyO4pyP4pyQ4pyR4pyS4pyT4pyU4pyV4pyW4pyX4pyY4pyZ4pya4pyb4pyc4pyd4pye4pyf4pyg4pyh4pyi4pyj4pyk4pyl4pym4pyn4pyo4pyp4pyq4pyr4pys4pyt4pyu4pyv4pyw4pyx4pyy4pyz4py04py14py24py34py44py54py64py74py84py94py+4py/CivinYDinYHinYLinYPinYTinYXinYbinYfinYjinYninYrinYvinYzinY3inY7inY/inZDinZHinZLinZPinZTinZXinZbinZfinZjinZninZrinZvinZzinZ3inZ7inZ/inaDinaHinaLinaPinaTinaXinabinafinajinaninarinavinazina3ina7ina/inbDinbHinbLinbPinbTinbXinbbinbfinbjinbninbrinbvinbzinb3inb7inb8KK+KegOKegeKeguKeg+KehOKeheKehuKeh+KeiOKeieKeiuKei+KejOKejeKejuKej+KekOKekeKekuKek+KelOKeleKeluKel+KemOKemeKemuKem+KenOKeneKenuKen+KeoOKeoeKeouKeo+KepOKepeKepuKep+KeqOKeqeKequKeq+KerOKereKeruKer+KesOKeseKesuKes+KetOKeteKetuKet+KeuOKeueKeuuKeu+KevOKeveKevuKevworCitNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUEgKFUrMjdDMC1VKzI3RUYpOgorCivin4Din4Hin4Lin4Pin4Tin4Xin4bin4fin4jin4nin4rin4vin4zin43in47in4/in5Din5Hin5Lin5Pin5Tin5Xin5bin5fin5jin5nin5rin5vin5zin53in57in5/in6Din6Hin6Lin6Pin6Tin6Xin6bin6fin6jin6nin6rin6vin6zin63in67in68KKworU3VwcGxlbWVudGFsIEFycm93cy1BIChVKzI3RjAtVSsyN0ZGKToKKwor4p+w4p+x4p+y4p+z4p+04p+14p+24p+34p+44p+54p+64p+74p+84p+94p++4p+/CisKK0JyYWlsbGUgUGF0dGVybnMgKFUrMjgwMC1VKzI4RkYpOgorCivioIDioIHioILioIPioITioIXioIbioIfioIjioInioIrioIvioIzioI3ioI7ioI/ioJDioJHioJLioJPioJTioJXioJbioJfioJjioJnioJrioJvioJzioJ3ioJ7ioJ/ioKDioKHioKLioKPioKTioKXioKbioKfioKjioKnioKrioKvioKzioK3ioK7ioK/ioLDioLHioLLioLPioLTioLXioLbioLfioLjioLnioLrioLvioLzioL3ioL7ioL8KK+KhgOKhgeKhguKhg+KhhOKhheKhhuKhh+KhiOKhieKhiuKhi+KhjOKhjeKhjuKhj+KhkOKhkeKhkuKhk+KhlOKhleKhluKhl+KhmOKhmeKhmuKhm+KhnOKhneKhnuKhn+KhoOKhoeKhouKho+KhpOKhpeKhpuKhp+KhqOKhqeKhquKhq+KhrOKhreKhruKhr+KhsOKhseKhsuKhs+KhtOKhteKhtuKht+KhuOKhueKhuuKhu+KhvOKhveKhvuKhvwor4qKA4qKB4qKC4qKD4qKE4qKF4qKG4qKH4qKI4qKJ4qKK4qKL4qKM4qKN4qKO4qKP4qKQ4qKR4qKS4qKT4qKU4qKV4qKW4qKX4qKY4qKZ4qKa4qKb4qKc4qKd4qKe4qKf4qKg4qKh4qKi4qKj4qKk4qKl4qKm4qKn4qKo4qKp4qKq4qKr4qKs4qKt4qKu4qKv4qKw4qKx4qKy4qKz4qK04qK14qK24qK34qK44qK54qK64qK74qK84qK94qK+4qK/Civio4Dio4Hio4Lio4Pio4Tio4Xio4bio4fio4jio4nio4rio4vio4zio43io47io4/io5Dio5Hio5Lio5Pio5Tio5Xio5bio5fio5jio5nio5rio5vio5zio53io57io5/io6Dio6Hio6Lio6Pio6Tio6Xio6bio6fio6jio6nio6rio6vio6zio63io67io6/io7Dio7Hio7Lio7Pio7Tio7Xio7bio7fio7jio7nio7rio7vio7zio73io77io78KKworU3VwcGxlbWVudGFsIEFycm93cy1CIChVKzI5MDAtVSsyOTdGKToKKwor4qSA4qSB4qSC4qSD4qSE4qSF4qSG4qSH4qSI4qSJ4qSK4qSL4qSM4qSN4qSO4qSP4qSQ4qSR4qSS4qST4qSU4qSV4qSW4qSX4qSY4qSZ4qSa4qSb4qSc4qSd4qSe4qSf4qSg4qSh4qSi4qSj4qSk4qSl4qSm4qSn4qSo4qSp4qSq4qSr4qSs4qSt4qSu4qSv4qSw4qSx4qSy4qSz4qS04qS14qS24qS34qS44qS54qS64qS74qS84qS94qS+4qS/CivipYDipYHipYLipYPipYTipYXipYbipYfipYjipYnipYripYvipYzipY3ipY7ipY/ipZDipZHipZLipZPipZTipZXipZbipZfipZjipZnipZripZvipZzipZ3ipZ7ipZ/ipaDipaHipaLipaPipaTipaXipabipafipajipaniparipavipazipa3ipa7ipa/ipbDipbHipbLipbPipbTipbXipbbipbfipbjipbnipbripbvipbzipb3ipb7ipb8KKworTWlzY2VsbGFuZW91cyBNYXRoZW1hdGljYWwgU3ltYm9scy1CIChVKzI5ODAtVSsyOUZGKToKKwor4qaA4qaB4qaC4qaD4qaE4qaF4qaG4qaH4qaI4qaJ4qaK4qaL4qaM4qaN4qaO4qaP4qaQ4qaR4qaS4qaT4qaU4qaV4qaW4qaX4qaY4qaZ4qaa4qab4qac4qad4qae4qaf4qag4qah4qai4qaj4qak4qal4qam4qan4qao4qap4qaq4qar4qas4qat4qau4qav4qaw4qax4qay4qaz4qa04qa14qa24qa34qa44qa54qa64qa74qa84qa94qa+4qa/Civip4Dip4Hip4Lip4Pip4Tip4Xip4bip4fip4jip4nip4rip4vip4zip43ip47ip4/ip5Dip5Hip5Lip5Pip5Tip5Xip5bip5fip5jip5nip5rip5vip5zip53ip57ip5/ip6Dip6Hip6Lip6Pip6Tip6Xip6bip6fip6jip6nip6rip6vip6zip63ip67ip6/ip7Dip7Hip7Lip7Pip7Tip7Xip7bip7fip7jip7nip7rip7vip7zip73ip77ip78KKworU3VwcGxlbWVudGFsIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgKFUrMkEwMC1VKzJBRkYpOgorCiviqIDiqIHiqILiqIPiqITiqIXiqIbiqIfiqIjiqIniqIriqIviqIziqI3iqI7iqI/iqJDiqJHiqJLiqJPiqJTiqJXiqJbiqJfiqJjiqJniqJriqJviqJziqJ3iqJ7iqJ/iqKDiqKHiqKLiqKPiqKTiqKXiqKbiqKfiqKjiqKniqKriqKviqKziqK3iqK7iqK/iqLDiqLHiqLLiqLPiqLTiqLXiqLbiqLfiqLjiqLniqLriqLviqLziqL3iqL7iqL8KK+KpgOKpgeKpguKpg+KphOKpheKphuKph+KpiOKpieKpiuKpi+KpjOKpjeKpjuKpj+KpkOKpkeKpkuKpk+KplOKpleKpluKpl+KpmOKpmeKpmuKpm+KpnOKpneKpnuKpn+KpoOKpoeKpouKpo+KppOKppeKppuKpp+KpqOKpqeKpquKpq+KprOKpreKpruKpr+KpsOKpseKpsuKps+KptOKpteKptuKpt+KpuOKpueKpuuKpu+KpvOKpveKpvuKpvwor4qqA4qqB4qqC4qqD4qqE4qqF4qqG4qqH4qqI4qqJ4qqK4qqL4qqM4qqN4qqO4qqP4qqQ4qqR4qqS4qqT4qqU4qqV4qqW4qqX4qqY4qqZ4qqa4qqb4qqc4qqd4qqe4qqf4qqg4qqh4qqi4qqj4qqk4qql4qqm4qqn4qqo4qqp4qqq4qqr4qqs4qqt4qqu4qqv4qqw4qqx4qqy4qqz4qq04qq14qq24qq34qq44qq54qq64qq74qq84qq94qq+4qq/Civiq4Diq4Hiq4Liq4Piq4Tiq4Xiq4biq4fiq4jiq4niq4riq4viq4ziq43iq47iq4/iq5Diq5Hiq5Liq5Piq5Tiq5Xiq5biq5fiq5jiq5niq5riq5viq5ziq53iq57iq5/iq6Diq6Hiq6Liq6Piq6Tiq6Xiq6biq6fiq6jiq6niq6riq6viq6ziq63iq67iq6/iq7Diq7Hiq7Liq7Piq7Tiq7Xiq7biq7fiq7jiq7niq7riq7viq7ziq73iq77iq78KKworTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBBcnJvd3MgKFUrMkIwMC1VKzJCRkYpOgorCivirIDirIHirILirIPirITirIXirIbirIfirIjirInirIrirIvirIzirI3irI7irI/irJDirJHirJLirJPirJTirJXirJbirJfirJjirJnirJrirJvirJzirJ3irJ7irJ/irKDirKHirKLirKPirKTirKXirKbirKfirKjirKnirKrirKvirKzirK3irK7irK/irLDirLHirLLirLPirLTirLXirLbirLfirLjirLnirLrirLvirLzirL3irL7irL8KK+KtgOKtgeKtguKtg+KthOKtheKthuKth+KtiOKtieKtiuKti+KtjOKtjeKtjuKtj+KtkOKtkeKtkuKtk+KtlOKtleKtluKtl+KtmOKtmeKtmuKtm+KtnOKtneKtnuKtn+KtoOKtoeKtouKto+KtpOKtpeKtpuKtp+KtqOKtqeKtquKtq+KtrOKtreKtruKtr+KtsOKtseKtsuKts+KttOKtteKttuKtt+KtuOKtueKtuuKtu+KtvOKtveKtvuKtvwor4q6A4q6B4q6C4q6D4q6E4q6F4q6G4q6H4q6I4q6J4q6K4q6L4q6M4q6N4q6O4q6P4q6Q4q6R4q6S4q6T4q6U4q6V4q6W4q6X4q6Y4q6Z4q6a4q6b4q6c4q6d4q6e4q6f4q6g4q6h4q6i4q6j4q6k4q6l4q6m4q6n4q6o4q6p4q6q4q6r4q6s4q6t4q6u4q6v4q6w4q6x4q6y4q6z4q604q614q624q634q644q654q664q674q684q694q6+4q6/Civir4Dir4Hir4Lir4Pir4Tir4Xir4bir4fir4jir4nir4rir4vir4zir43ir47ir4/ir5Dir5Hir5Lir5Pir5Tir5Xir5bir5fir5jir5nir5rir5vir5zir53ir57ir5/ir6Dir6Hir6Lir6Pir6Tir6Xir6bir6fir6jir6nir6rir6vir6zir63ir67ir6/ir7Dir7Hir7Lir7Pir7Tir7Xir7bir7fir7jir7nir7rir7vir7zir73ir77ir78KKworRnJlZSBibG9jayAoVSsyQzAwLVUrMkU3Rik6CisKK+KwgOKwgeKwguKwg+KwhOKwheKwhuKwh+KwiOKwieKwiuKwi+KwjOKwjeKwjuKwj+KwkOKwkeKwkuKwk+KwlOKwleKwluKwl+KwmOKwmeKwmuKwm+KwnOKwneKwnuKwn+KwoOKwoeKwouKwo+KwpOKwpeKwpuKwp+KwqOKwqeKwquKwq+KwrOKwreKwruKwr+KwsOKwseKwsuKws+KwtOKwteKwtuKwt+KwuOKwueKwuuKwu+KwvOKwveKwvuKwvwor4rGA4rGB4rGC4rGD4rGE4rGF4rGG4rGH4rGI4rGJ4rGK4rGL4rGM4rGN4rGO4rGP4rGQ4rGR4rGS4rGT4rGU4rGV4rGW4rGX4rGY4rGZ4rGa4rGb4rGc4rGd4rGe4rGf4rGg4rGh4rGi4rGj4rGk4rGl4rGm4rGn4rGo4rGp4rGq4rGr4rGs4rGt4rGu4rGv4rGw4rGx4rGy4rGz4rG04rG14rG24rG34rG44rG54rG64rG74rG84rG94rG+4rG/CivisoDisoHisoLisoPisoTisoXisobisofisojisonisorisovisoziso3iso7iso/ispDispHispLispPispTispXispbispfispjispnisprispvispzisp3isp7isp/isqDisqHisqLisqPisqTisqXisqbisqfisqjisqnisqrisqvisqzisq3isq7isq/isrDisrHisrLisrPisrTisrXisrbisrfisrjisrnisrrisrvisrzisr3isr7isr8KK+KzgOKzgeKzguKzg+KzhOKzheKzhuKzh+KziOKzieKziuKzi+KzjOKzjeKzjuKzj+KzkOKzkeKzkuKzk+KzlOKzleKzluKzl+KzmOKzmeKzmuKzm+KznOKzneKznuKzn+KzoOKzoeKzouKzo+KzpOKzpeKzpuKzp+KzqOKzqeKzquKzq+KzrOKzreKzruKzr+KzsOKzseKzsuKzs+KztOKzteKztuKzt+KzuOKzueKzuuKzu+KzvOKzveKzvuKzvwor4rSA4rSB4rSC4rSD4rSE4rSF4rSG4rSH4rSI4rSJ4rSK4rSL4rSM4rSN4rSO4rSP4rSQ4rSR4rSS4rST4rSU4rSV4rSW4rSX4rSY4rSZ4rSa4rSb4rSc4rSd4rSe4rSf4rSg4rSh4rSi4rSj4rSk4rSl4rSm4rSn4rSo4rSp4rSq4rSr4rSs4rSt4rSu4rSv4rSw4rSx4rSy4rSz4rS04rS14rS24rS34rS44rS54rS64rS74rS84rS94rS+4rS/CivitYDitYHitYLitYPitYTitYXitYbitYfitYjitYnitYritYvitYzitY3itY7itY/itZDitZHitZLitZPitZTitZXitZbitZfitZjitZnitZritZvitZzitZ3itZ7itZ/itaDitaHitaLitaPitaTitaXitabitafitajitanitaritavitazita3ita7ita/itbDitbHitbLitbPitbTitbXitbbitbfitbjitbnitbritbvitbzitb3itb7itb8KK+K2gOK2geK2guK2g+K2hOK2heK2huK2h+K2iOK2ieK2iuK2i+K2jOK2jeK2juK2j+K2kOK2keK2kuK2k+K2lOK2leK2luK2l+K2mOK2meK2muK2m+K2nOK2neK2nuK2n+K2oOK2oeK2ouK2o+K2pOK2peK2puK2p+K2qOK2qeK2quK2q+K2rOK2reK2ruK2r+K2sOK2seK2suK2s+K2tOK2teK2tuK2t+K2uOK2ueK2uuK2u+K2vOK2veK2vuK2vwor4reA4reB4reC4reD4reE4reF4reG4reH4reI4reJ4reK4reL4reM4reN4reO4reP4reQ4reR4reS4reT4reU4reV4reW4reX4reY4reZ4rea4reb4rec4red4ree4ref4reg4reh4rei4rej4rek4rel4rem4ren4reo4rep4req4rer4res4ret4reu4rev4rew4rex4rey4rez4re04re14re24re34re44re54re64re74re84re94re+4re/CiviuIDiuIHiuILiuIPiuITiuIXiuIbiuIfiuIjiuIniuIriuIviuIziuI3iuI7iuI/iuJDiuJHiuJLiuJPiuJTiuJXiuJbiuJfiuJjiuJniuJriuJviuJziuJ3iuJ7iuJ/iuKDiuKHiuKLiuKPiuKTiuKXiuKbiuKfiuKjiuKniuKriuKviuKziuK3iuK7iuK/iuLDiuLHiuLLiuLPiuLTiuLXiuLbiuLfiuLjiuLniuLriuLviuLziuL3iuL7iuL8KK+K5gOK5geK5guK5g+K5hOK5heK5huK5h+K5iOK5ieK5iuK5i+K5jOK5jeK5juK5j+K5kOK5keK5kuK5k+K5lOK5leK5luK5l+K5mOK5meK5muK5m+K5nOK5neK5nuK5n+K5oOK5oeK5ouK5o+K5pOK5peK5puK5p+K5qOK5qeK5quK5q+K5rOK5reK5ruK5r+K5sOK5seK5suK5s+K5tOK5teK5tuK5t+K5uOK5ueK5uuK5u+K5vOK5veK5vuK5vworCitDSksgUmFkaWNhbHMgU3VwcGxlbWVudCAoVSsyRTgwLVUrMkVGRik6CisKK+K6gOK6geK6guK6g+K6hOK6heK6huK6h+K6iOK6ieK6iuK6i+K6jOK6jeK6juK6j+K6kOK6keK6kuK6k+K6lOK6leK6luK6l+K6mOK6meK6muK6m+K6nOK6neK6nuK6nwor4rqg4rqh4rqi4rqj4rqk4rql4rqm4rqn4rqo4rqp4rqq4rqr4rqs4rqt4rqu4rqv4rqw4rqx4rqy4rqz4rq04rq14rq24rq34rq44rq54rq64rq74rq84rq94rq+4rq/Civiu4Diu4Hiu4Liu4Piu4Tiu4Xiu4biu4fiu4jiu4niu4riu4viu4ziu43iu47iu4/iu5Diu5Hiu5Liu5Piu5Tiu5Xiu5biu5fiu5jiu5niu5riu5viu5ziu53iu57iu58KK+K7oOK7oeK7ouK7o+K7pOK7peK7puK7p+K7qOK7qeK7quK7q+K7rOK7reK7ruK7r+K7sOK7seK7suK7s+K7tOK7teK7tuK7t+K7uOK7ueK7uuK7u+K7vOK7veK7vuK7vworCitLYW5neGkgUmFkaWNhbHMgKFUrMkYwMC1VKzJGREYpOgorCivivIDivIHivILivIPivITivIXivIbivIfivIjivInivIrivIvivIzivI3ivI7ivI/ivJDivJHivJLivJPivJTivJXivJbivJfivJjivJnivJrivJvivJzivJ3ivJ7ivJ8KK+K8oOK8oeK8ouK8o+K8pOK8peK8puK8p+K8qOK8qeK8quK8q+K8rOK8reK8ruK8r+K8sOK8seK8suK8s+K8tOK8teK8tuK8t+K8uOK8ueK8uuK8u+K8vOK8veK8vuK8vwor4r2A4r2B4r2C4r2D4r2E4r2F4r2G4r2H4r2I4r2J4r2K4r2L4r2M4r2N4r2O4r2P4r2Q4r2R4r2S4r2T4r2U4r2V4r2W4r2X4r2Y4r2Z4r2a4r2b4r2c4r2d4r2e4r2fCivivaDivaHivaLivaPivaTivaXivabivafivajivanivarivavivaziva3iva7iva/ivbDivbHivbLivbPivbTivbXivbbivbfivbjivbnivbrivbvivbzivb3ivb7ivb8KK+K+gOK+geK+guK+g+K+hOK+heK+huK+h+K+iOK+ieK+iuK+i+K+jOK+jeK+juK+j+K+kOK+keK+kuK+k+K+lOK+leK+luK+l+K+mOK+meK+muK+m+K+nOK+neK+nuK+nwor4r6g4r6h4r6i4r6j4r6k4r6l4r6m4r6n4r6o4r6p4r6q4r6r4r6s4r6t4r6u4r6v4r6w4r6x4r6y4r6z4r604r614r624r634r644r654r664r674r684r694r6+4r6/Civiv4Div4Hiv4Liv4Piv4Tiv4Xiv4biv4fiv4jiv4niv4riv4viv4ziv43iv47iv4/iv5Div5Hiv5Liv5Piv5Tiv5Xiv5biv5fiv5jiv5niv5riv5viv5ziv53iv57iv58KKworRnJlZSBibG9jayAoVSsyRkUwLVUrMkZFRik6CisKK+K/oOK/oeK/ouK/o+K/pOK/peK/puK/p+K/qOK/qeK/quK/q+K/rOK/reK/ruK/rworCitJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzIChVKzJGRjAtVSsyRkZGKToKKwor4r+w4r+x4r+y4r+z4r+04r+14r+24r+34r+44r+54r+64r+74r+84r+94r++4r+/CisKK0NKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiAoVSszMDAwLVUrMzAzRik6CisKK+OAgOOAgeOAguOAg+OAhOOAheOAhuOAh+OAiOOAieOAiuOAi+OAjOOAjeOAjuOAj+OAkOOAkeOAkuOAk+OAlOOAleOAluOAl+OAmOOAmeOAmuOAm+OAnOOAneOAnuOAnwor44Cg44Ch44Ci44Cj44Ck44Cl44Cm44Cn44Co44Cp4peM44Cq4peM44Cr4peM44Cs4peM44Ct4peM44Cu4peM44Cv44Cw44Cx44Cy44Cz44C044C144C244C344C444C544C644C744C844C944C+44C/CisKK0hpcmFnYW5hIChVKzMwNDAtVSszMDlGKToKKwor44GA44GB44GC44GD44GE44GF44GG44GH44GI44GJ44GK44GL44GM44GN44GO44GP44GQ44GR44GS44GT44GU44GV44GW44GX44GY44GZ44Ga44Gb44Gc44Gd44Ge44GfCivjgaDjgaHjgaLjgaPjgaTjgaXjgabjgafjgajjganjgarjgavjgazjga3jga7jga/jgbDjgbHjgbLjgbPjgbTjgbXjgbbjgbfjgbjjgbnjgbrjgbvjgbzjgb3jgb7jgb8KK+OCgOOCgeOCguOCg+OChOOCheOChuOCh+OCiOOCieOCiuOCi+OCjOOCjeOCjuOCj+OCkOOCkeOCkuOCk+OClOOCleOCluOCl+OCmOKXjOOCmeKXjOOCmuOCm+OCnOOCneOCnuOCnworCitLYXRha2FuYSAoVSszMEEwLVUrMzBGRik6CisKK+OCoOOCoeOCouOCo+OCpOOCpeOCpuOCp+OCqOOCqeOCquOCq+OCrOOCreOCruOCr+OCsOOCseOCsuOCs+OCtOOCteOCtuOCt+OCuOOCueOCuuOCu+OCvOOCveOCvuOCvwor44OA44OB44OC44OD44OE44OF44OG44OH44OI44OJ44OK44OL44OM44ON44OO44OP44OQ44OR44OS44OT44OU44OV44OW44OX44OY44OZ44Oa44Ob44Oc44Od44Oe44OfCivjg6Djg6Hjg6Ljg6Pjg6Tjg6Xjg6bjg6fjg6jjg6njg6rjg6vjg6zjg63jg67jg6/jg7Djg7Hjg7Ljg7Pjg7Tjg7Xjg7bjg7fjg7jjg7njg7rjg7vjg7zjg73jg77jg78KKworQm9wb21vZm8gKFUrMzEwMC1VKzMxMkYpOgorCivjhIDjhIHjhILjhIPjhITjhIXjhIbjhIfjhIjjhInjhIrjhIvjhIzjhI3jhI7jhI/jhJDjhJHjhJLjhJPjhJTjhJXjhJbjhJfjhJjjhJnjhJrjhJvjhJzjhJ3jhJ7jhJ8KK+OEoOOEoeOEouOEo+OEpOOEpeOEpuOEp+OEqOOEqeOEquOEq+OErOOEreOEruOErworCitIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vIChVKzMxMzAtVSszMThGKToKKwor44Sw44Sx44Sy44Sz44S044S144S244S344S444S544S644S744S844S944S+44S/44WA44WB44WC44WD44WE44WF44WG44WH44WI44WJ44WK44WL44WM44WN44WO44WPCivjhZDjhZHjhZLjhZPjhZTjhZXjhZbjhZfjhZjjhZnjhZrjhZvjhZzjhZ3jhZ7jhZ/jhaDjhaHjhaLjhaPjhaTjhaXjhabjhafjhajjhanjharjhavjhazjha3jha7jha8KK+OFsOOFseOFsuOFs+OFtOOFteOFtuOFt+OFuOOFueOFuuOFu+OFvOOFveOFvuOFv+OGgOOGgeOGguOGg+OGhOOGheOGhuOGh+OGiOOGieOGiuOGi+OGjOOGjeOGjuOGjworCitLYW5idW4gKFUrMzE5MC1VKzMxOUYpOgorCivjhpDjhpHjhpLjhpPjhpTjhpXjhpbjhpfjhpjjhpnjhprjhpvjhpzjhp3jhp7jhp8KKworQm9wb21vZm8gRXh0ZW5kZWQgKFUrMzFBMC1VKzMxQkYpOgorCivjhqDjhqHjhqLjhqPjhqTjhqXjhqbjhqfjhqjjhqnjhqrjhqvjhqzjhq3jhq7jhq/jhrDjhrHjhrLjhrPjhrTjhrXjhrbjhrfjhrjjhrnjhrrjhrvjhrzjhr3jhr7jhr8KKworRnJlZSBibG9jayAoVSszMUMwLVUrMzFFRik6CisKK+OHgOOHgeOHguOHg+OHhOOHheOHhuOHh+OHiOOHieOHiuOHi+OHjOOHjeOHjuOHj+OHkOOHkeOHkuOHk+OHlOOHleOHluOHl+OHmOOHmeOHmuOHm+OHnOOHneOHnuOHnwor44eg44eh44ei44ej44ek44el44em44en44eo44ep44eq44er44es44et44eu44evCisKK0thdGFrYW5hIFBob25ldGljIEV4dGVuc2lvbnMgKFUrMzFGMC1VKzMxRkYpOgorCivjh7Djh7Hjh7Ljh7Pjh7Tjh7Xjh7bjh7fjh7jjh7njh7rjh7vjh7zjh73jh77jh78KKworRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyAoVSszMjAwLVUrMzJGRik6CisKK+OIgOOIgeOIguOIg+OIhOOIheOIhuOIh+OIiOOIieOIiuOIi+OIjOOIjeOIjuOIj+OIkOOIkeOIkuOIk+OIlOOIleOIluOIl+OImOOImeOImuOIm+OInOOIneOInuOInwor44ig44ih44ii44ij44ik44il44im44in44io44ip44iq44ir44is44it44iu44iv44iw44ix44iy44iz44i044i144i244i344i444i544i644i744i844i944i+44i/CivjiYDjiYHjiYLjiYPjiYTjiYXjiYbjiYfjiYjjiYnjiYrjiYvjiYzjiY3jiY7jiY/jiZDjiZHjiZLjiZPjiZTjiZXjiZbjiZfjiZjjiZnjiZrjiZvjiZzjiZ3jiZ7jiZ8KK+OJoOOJoeOJouOJo+OJpOOJpeOJpuOJp+OJqOOJqeOJquOJq+OJrOOJreOJruOJr+OJsOOJseOJsuOJs+OJtOOJteOJtuOJt+OJuOOJueOJuuOJu+OJvOOJveOJvuOJvwor44qA44qB44qC44qD44qE44qF44qG44qH44qI44qJ44qK44qL44qM44qN44qO44qP44qQ44qR44qS44qT44qU44qV44qW44qX44qY44qZ44qa44qb44qc44qd44qe44qfCivjiqDjiqHjiqLjiqPjiqTjiqXjiqbjiqfjiqjjiqnjiqrjiqvjiqzjiq3jiq7jiq/jirDjirHjirLjirPjirTjirXjirbjirfjirjjirnjirrjirvjirzjir3jir7jir8KK+OLgOOLgeOLguOLg+OLhOOLheOLhuOLh+OLiOOLieOLiuOLi+OLjOOLjeOLjuOLj+OLkOOLkeOLkuOLk+OLlOOLleOLluOLl+OLmOOLmeOLmuOLm+OLnOOLneOLnuOLnwor44ug44uh44ui44uj44uk44ul44um44un44uo44up44uq44ur44us44ut44uu44uv44uw44ux44uy44uz44u044u144u244u344u444u544u644u744u844u944u+44u/CisKK0NKSyBDb21wYXRpYmlsaXR5IChVKzMzMDAtVSszM0ZGKToKKwor44yA44yB44yC44yD44yE44yF44yG44yH44yI44yJ44yK44yL44yM44yN44yO44yP44yQ44yR44yS44yT44yU44yV44yW44yX44yY44yZ44ya44yb44yc44yd44ye44yfCivjjKDjjKHjjKLjjKPjjKTjjKXjjKbjjKfjjKjjjKnjjKrjjKvjjKzjjK3jjK7jjK/jjLDjjLHjjLLjjLPjjLTjjLXjjLbjjLfjjLjjjLnjjLrjjLvjjLzjjL3jjL7jjL8KK+ONgOONgeONguONg+ONhOONheONhuONh+ONiOONieONiuONi+ONjOONjeONjuONj+ONkOONkeONkuONk+ONlOONleONluONl+ONmOONmeONmuONm+ONnOONneONnuONnwor442g442h442i442j442k442l442m442n442o442p442q442r442s442t442u442v442w442x442y442z4420442144224423442444254426442744284429442+442/CivjjoDjjoHjjoLjjoPjjoTjjoXjjobjjofjjojjjonjjorjjovjjozjjo3jjo7jjo/jjpDjjpHjjpLjjpPjjpTjjpXjjpbjjpfjjpjjjpnjjprjjpvjjpzjjp3jjp7jjp8KK+OOoOOOoeOOouOOo+OOpOOOpeOOpuOOp+OOqOOOqeOOquOOq+OOrOOOreOOruOOr+OOsOOOseOOsuOOs+OOtOOOteOOtuOOt+OOuOOOueOOuuOOu+OOvOOOveOOvuOOvwor44+A44+B44+C44+D44+E44+F44+G44+H44+I44+J44+K44+L44+M44+N44+O44+P44+Q44+R44+S44+T44+U44+V44+W44+X44+Y44+Z44+a44+b44+c44+d44+e44+fCivjj6Djj6Hjj6Ljj6Pjj6Tjj6Xjj6bjj6fjj6jjj6njj6rjj6vjj6zjj63jj67jj6/jj7Djj7Hjj7Ljj7Pjj7Tjj7Xjj7bjj7fjj7jjj7njj7rjj7vjj7zjj73jj77jj78KKworQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSAoVSszNDAwLVUrNERCRik6CisKK+OQgOOQgeOQguOQg+OQhOOQheOQhuOQh+OQiOOQieOQiuOQi+OQjOOQjeOQjuOQj+OQkOOQkeOQkuOQk+OQlOOQleOQluOQl+OQmOOQmeOQmuOQm+OQnOOQneOQnuOQnwor45Cg45Ch45Ci45Cj45Ck45Cl45Cm45Cn45Co45Cp45Cq45Cr45Cs45Ct45Cu45Cv45Cw45Cx45Cy45Cz45C045C145C245C345C445C545C645C745C845C945C+45C/CivjkYDjkYHjkYLjkYPjkYTjkYXjkYbjkYfjkYjjkYnjkYrjkYvjkYzjkY3jkY7jkY/jkZDjkZHjkZLjkZPjkZTjkZXjkZbjkZfjkZjjkZnjkZrjkZvjkZzjkZ3jkZ7jkZ8KK+ORoOORoeORouORo+ORpOORpeORpuORp+ORqOORqeORquORq+ORrOORreORruORr+ORsOORseORsuORs+ORtOORteORtuORt+ORuOORueORuuORu+ORvOORveORvuORvwor45KA45KB45KC45KD45KE45KF45KG45KH45KI45KJ45KK45KL45KM45KN45KO45KP45KQ45KR45KS45KT45KU45KV45KW45KX45KY45KZ45Ka45Kb45Kc45Kd45Ke45KfCivjkqDjkqHjkqLjkqPjkqTjkqXjkqbjkqfjkqjjkqnjkqrjkqvjkqzjkq3jkq7jkq/jkrDjkrHjkrLjkrPjkrTjkrXjkrbjkrfjkrjjkrnjkrrjkrvjkrzjkr3jkr7jkr8KK+OTgOOTgeOTguOTg+OThOOTheOThuOTh+OTiOOTieOTiuOTi+OTjOOTjeOTjuOTj+OTkOOTkeOTkuOTk+OTlOOTleOTluOTl+OTmOOTmeOTmuOTm+OTnOOTneOTnuOTnwor45Og45Oh45Oi45Oj45Ok45Ol45Om45On45Oo45Op45Oq45Or45Os45Ot45Ou45Ov45Ow45Ox45Oy45Oz45O045O145O245O345O445O545O645O745O845O945O+45O/CivjlIDjlIHjlILjlIPjlITjlIXjlIbjlIfjlIjjlInjlIrjlIvjlIzjlI3jlI7jlI/jlJDjlJHjlJLjlJPjlJTjlJXjlJbjlJfjlJjjlJnjlJrjlJvjlJzjlJ3jlJ7jlJ8KK+OUoOOUoeOUouOUo+OUpOOUpeOUpuOUp+OUqOOUqeOUquOUq+OUrOOUreOUruOUr+OUsOOUseOUsuOUs+OUtOOUteOUtuOUt+OUuOOUueOUuuOUu+OUvOOUveOUvuOUvwor45WA45WB45WC45WD45WE45WF45WG45WH45WI45WJ45WK45WL45WM45WN45WO45WP45WQ45WR45WS45WT45WU45WV45WW45WX45WY45WZ45Wa45Wb45Wc45Wd45We45WfCivjlaDjlaHjlaLjlaPjlaTjlaXjlabjlafjlajjlanjlarjlavjlazjla3jla7jla/jlbDjlbHjlbLjlbPjlbTjlbXjlbbjlbfjlbjjlbnjlbrjlbvjlbzjlb3jlb7jlb8KK+OWgOOWgeOWguOWg+OWhOOWheOWhuOWh+OWiOOWieOWiuOWi+OWjOOWjeOWjuOWj+OWkOOWkeOWkuOWk+OWlOOWleOWluOWl+OWmOOWmeOWmuOWm+OWnOOWneOWnuOWnwor45ag45ah45ai45aj45ak45al45am45an45ao45ap45aq45ar45as45at45au45av45aw45ax45ay45az45a045a145a245a345a445a545a645a745a845a945a+45a/Civjl4Djl4Hjl4Ljl4Pjl4Tjl4Xjl4bjl4fjl4jjl4njl4rjl4vjl4zjl43jl47jl4/jl5Djl5Hjl5Ljl5Pjl5Tjl5Xjl5bjl5fjl5jjl5njl5rjl5vjl5zjl53jl57jl58KK+OXoOOXoeOXouOXo+OXpOOXpeOXpuOXp+OXqOOXqeOXquOXq+OXrOOXreOXruOXr+OXsOOXseOXsuOXs+OXtOOXteOXtuOXt+OXuOOXueOXuuOXu+OXvOOXveOXvuOXvwor45iA45iB45iC45iD45iE45iF45iG45iH45iI45iJ45iK45iL45iM45iN45iO45iP45iQ45iR45iS45iT45iU45iV45iW45iX45iY45iZ45ia45ib45ic45id45ie45ifCivjmKDjmKHjmKLjmKPjmKTjmKXjmKbjmKfjmKjjmKnjmKrjmKvjmKzjmK3jmK7jmK/jmLDjmLHjmLLjmLPjmLTjmLXjmLbjmLfjmLjjmLnjmLrjmLvjmLzjmL3jmL7jmL8KK+OZgOOZgeOZguOZg+OZhOOZheOZhuOZh+OZiOOZieOZiuOZi+OZjOOZjeOZjuOZj+OZkOOZkeOZkuOZk+OZlOOZleOZluOZl+OZmOOZmeOZmuOZm+OZnOOZneOZnuOZnwor45mg45mh45mi45mj45mk45ml45mm45mn45mo45mp45mq45mr45ms45mt45mu45mv45mw45mx45my45mz45m045m145m245m345m445m545m645m745m845m945m+45m/CivjmoDjmoHjmoLjmoPjmoTjmoXjmobjmofjmojjmonjmorjmovjmozjmo3jmo7jmo/jmpDjmpHjmpLjmpPjmpTjmpXjmpbjmpfjmpjjmpnjmprjmpvjmpzjmp3jmp7jmp8KK+OaoOOaoeOaouOao+OapOOapeOapuOap+OaqOOaqeOaquOaq+OarOOareOaruOar+OasOOaseOasuOas+OatOOateOatuOat+OauOOaueOauuOau+OavOOaveOavuOavwor45uA45uB45uC45uD45uE45uF45uG45uH45uI45uJ45uK45uL45uM45uN45uO45uP45uQ45uR45uS45uT45uU45uV45uW45uX45uY45uZ45ua45ub45uc45ud45ue45ufCivjm6Djm6Hjm6Ljm6Pjm6Tjm6Xjm6bjm6fjm6jjm6njm6rjm6vjm6zjm63jm67jm6/jm7Djm7Hjm7Ljm7Pjm7Tjm7Xjm7bjm7fjm7jjm7njm7rjm7vjm7zjm73jm77jm78KK+OcgOOcgeOcguOcg+OchOOcheOchuOch+OciOOcieOciuOci+OcjOOcjeOcjuOcj+OckOOckeOckuOck+OclOOcleOcluOcl+OcmOOcmeOcmuOcm+OcnOOcneOcnuOcnwor45yg45yh45yi45yj45yk45yl45ym45yn45yo45yp45yq45yr45ys45yt45yu45yv45yw45yx45yy45yz45y045y145y245y345y445y545y645y745y845y945y+45y/CivjnYDjnYHjnYLjnYPjnYTjnYXjnYbjnYfjnYjjnYnjnYrjnYvjnYzjnY3jnY7jnY/jnZDjnZHjnZLjnZPjnZTjnZXjnZbjnZfjnZjjnZnjnZrjnZvjnZzjnZ3jnZ7jnZ8KK+OdoOOdoeOdouOdo+OdpOOdpeOdpuOdp+OdqOOdqeOdquOdq+OdrOOdreOdruOdr+OdsOOdseOdsuOds+OdtOOdteOdtuOdt+OduOOdueOduuOdu+OdvOOdveOdvuOdvwor456A456B456C456D456E456F456G456H456I456J456K456L456M456N456O456P456Q456R456S456T456U456V456W456X456Y456Z456a456b456c456d456e456fCivjnqDjnqHjnqLjnqPjnqTjnqXjnqbjnqfjnqjjnqnjnqrjnqvjnqzjnq3jnq7jnq/jnrDjnrHjnrLjnrPjnrTjnrXjnrbjnrfjnrjjnrnjnrrjnrvjnrzjnr3jnr7jnr8KK+OfgOOfgeOfguOfg+OfhOOfheOfhuOfh+OfiOOfieOfiuOfi+OfjOOfjeOfjuOfj+OfkOOfkeOfkuOfk+OflOOfleOfluOfl+OfmOOfmeOfmuOfm+OfnOOfneOfnuOfnwor45+g45+h45+i45+j45+k45+l45+m45+n45+o45+p45+q45+r45+s45+t45+u45+v45+w45+x45+y45+z45+045+145+245+345+445+545+645+745+845+945++45+/CivjoIDjoIHjoILjoIPjoITjoIXjoIbjoIfjoIjjoInjoIrjoIvjoIzjoI3joI7joI/joJDjoJHjoJLjoJPjoJTjoJXjoJbjoJfjoJjjoJnjoJrjoJvjoJzjoJ3joJ7joJ8KK+OgoOOgoeOgouOgo+OgpOOgpeOgpuOgp+OgqOOgqeOgquOgq+OgrOOgreOgruOgr+OgsOOgseOgsuOgs+OgtOOgteOgtuOgt+OguOOgueOguuOgu+OgvOOgveOgvuOgvwor46GA46GB46GC46GD46GE46GF46GG46GH46GI46GJ46GK46GL46GM46GN46GO46GP46GQ46GR46GS46GT46GU46GV46GW46GX46GY46GZ46Ga46Gb46Gc46Gd46Ge46GfCivjoaDjoaHjoaLjoaPjoaTjoaXjoabjoafjoajjoanjoarjoavjoazjoa3joa7joa/jobDjobHjobLjobPjobTjobXjobbjobfjobjjobnjobrjobvjobzjob3job7job8KK+OigOOigeOiguOig+OihOOiheOihuOih+OiiOOiieOiiuOii+OijOOijeOijuOij+OikOOikeOikuOik+OilOOileOiluOil+OimOOimeOimuOim+OinOOineOinuOinwor46Kg46Kh46Ki46Kj46Kk46Kl46Km46Kn46Ko46Kp46Kq46Kr46Ks46Kt46Ku46Kv46Kw46Kx46Ky46Kz46K046K146K246K346K446K546K646K746K846K946K+46K/Civjo4Djo4Hjo4Ljo4Pjo4Tjo4Xjo4bjo4fjo4jjo4njo4rjo4vjo4zjo43jo47jo4/jo5Djo5Hjo5Ljo5Pjo5Tjo5Xjo5bjo5fjo5jjo5njo5rjo5vjo5zjo53jo57jo58KK+OjoOOjoeOjouOjo+OjpOOjpeOjpuOjp+OjqOOjqeOjquOjq+OjrOOjreOjruOjr+OjsOOjseOjsuOjs+OjtOOjteOjtuOjt+OjuOOjueOjuuOju+OjvOOjveOjvuOjvwor46SA46SB46SC46SD46SE46SF46SG46SH46SI46SJ46SK46SL46SM46SN46SO46SP46SQ46SR46SS46ST46SU46SV46SW46SX46SY46SZ46Sa46Sb46Sc46Sd46Se46SfCivjpKDjpKHjpKLjpKPjpKTjpKXjpKbjpKfjpKjjpKnjpKrjpKvjpKzjpK3jpK7jpK/jpLDjpLHjpLLjpLPjpLTjpLXjpLbjpLfjpLjjpLnjpLrjpLvjpLzjpL3jpL7jpL8KK+OlgOOlgeOlguOlg+OlhOOlheOlhuOlh+OliOOlieOliuOli+OljOOljeOljuOlj+OlkOOlkeOlkuOlk+OllOOlleOlluOll+OlmOOlmeOlmuOlm+OlnOOlneOlnuOlnwor46Wg46Wh46Wi46Wj46Wk46Wl46Wm46Wn46Wo46Wp46Wq46Wr46Ws46Wt46Wu46Wv46Ww46Wx46Wy46Wz46W046W146W246W346W446W546W646W746W846W946W+46W/CivjpoDjpoHjpoLjpoPjpoTjpoXjpobjpofjpojjponjporjpovjpozjpo3jpo7jpo/jppDjppHjppLjppPjppTjppXjppbjppfjppjjppnjpprjppvjppzjpp3jpp7jpp8KK+OmoOOmoeOmouOmo+OmpOOmpeOmpuOmp+OmqOOmqeOmquOmq+OmrOOmreOmruOmr+OmsOOmseOmsuOms+OmtOOmteOmtuOmt+OmuOOmueOmuuOmu+OmvOOmveOmvuOmvwor46eA46eB46eC46eD46eE46eF46eG46eH46eI46eJ46eK46eL46eM46eN46eO46eP46eQ46eR46eS46eT46eU46eV46eW46eX46eY46eZ46ea46eb46ec46ed46ee46efCivjp6Djp6Hjp6Ljp6Pjp6Tjp6Xjp6bjp6fjp6jjp6njp6rjp6vjp6zjp63jp67jp6/jp7Djp7Hjp7Ljp7Pjp7Tjp7Xjp7bjp7fjp7jjp7njp7rjp7vjp7zjp73jp77jp78KK+OogOOogeOoguOog+OohOOoheOohuOoh+OoiOOoieOoiuOoi+OojOOojeOojuOoj+OokOOokeOokuOok+OolOOoleOoluOol+OomOOomeOomuOom+OonOOoneOonuOonwor46ig46ih46ii46ij46ik46il46im46in46io46ip46iq46ir46is46it46iu46iv46iw46ix46iy46iz46i046i146i246i346i446i546i646i746i846i946i+46i/CivjqYDjqYHjqYLjqYPjqYTjqYXjqYbjqYfjqYjjqYnjqYrjqYvjqYzjqY3jqY7jqY/jqZDjqZHjqZLjqZPjqZTjqZXjqZbjqZfjqZjjqZnjqZrjqZvjqZzjqZ3jqZ7jqZ8KK+OpoOOpoeOpouOpo+OppOOppeOppuOpp+OpqOOpqeOpquOpq+OprOOpreOpruOpr+OpsOOpseOpsuOps+OptOOpteOptuOpt+OpuOOpueOpuuOpu+OpvOOpveOpvuOpvwor46qA46qB46qC46qD46qE46qF46qG46qH46qI46qJ46qK46qL46qM46qN46qO46qP46qQ46qR46qS46qT46qU46qV46qW46qX46qY46qZ46qa46qb46qc46qd46qe46qfCivjqqDjqqHjqqLjqqPjqqTjqqXjqqbjqqfjqqjjqqnjqqrjqqvjqqzjqq3jqq7jqq/jqrDjqrHjqrLjqrPjqrTjqrXjqrbjqrfjqrjjqrnjqrrjqrvjqrzjqr3jqr7jqr8KK+OrgOOrgeOrguOrg+OrhOOrheOrhuOrh+OriOOrieOriuOri+OrjOOrjeOrjuOrj+OrkOOrkeOrkuOrk+OrlOOrleOrluOrl+OrmOOrmeOrmuOrm+OrnOOrneOrnuOrnwor46ug46uh46ui46uj46uk46ul46um46un46uo46up46uq46ur46us46ut46uu46uv46uw46ux46uy46uz46u046u146u246u346u446u546u646u746u846u946u+46u/CivjrIDjrIHjrILjrIPjrITjrIXjrIbjrIfjrIjjrInjrIrjrIvjrIzjrI3jrI7jrI/jrJDjrJHjrJLjrJPjrJTjrJXjrJbjrJfjrJjjrJnjrJrjrJvjrJzjrJ3jrJ7jrJ8KK+OsoOOsoeOsouOso+OspOOspeOspuOsp+OsqOOsqeOsquOsq+OsrOOsreOsruOsr+OssOOsseOssuOss+OstOOsteOstuOst+OsuOOsueOsuuOsu+OsvOOsveOsvuOsvwor462A462B462C462D462E462F462G462H462I462J462K462L462M462N462O462P462Q462R462S462T462U462V462W462X462Y462Z462a462b462c462d462e462fCivjraDjraHjraLjraPjraTjraXjrabjrafjrajjranjrarjravjrazjra3jra7jra/jrbDjrbHjrbLjrbPjrbTjrbXjrbbjrbfjrbjjrbnjrbrjrbvjrbzjrb3jrb7jrb8KK+OugOOugeOuguOug+OuhOOuheOuhuOuh+OuiOOuieOuiuOui+OujOOujeOujuOuj+OukOOukeOukuOuk+OulOOuleOuluOul+OumOOumeOumuOum+OunOOuneOunuOunwor466g466h466i466j466k466l466m466n466o466p466q466r466s466t466u466v466w466x466y466z4660466146624663466446654666466746684669466+466/Civjr4Djr4Hjr4Ljr4Pjr4Tjr4Xjr4bjr4fjr4jjr4njr4rjr4vjr4zjr43jr47jr4/jr5Djr5Hjr5Ljr5Pjr5Tjr5Xjr5bjr5fjr5jjr5njr5rjr5vjr5zjr53jr57jr58KK+OvoOOvoeOvouOvo+OvpOOvpeOvpuOvp+OvqOOvqeOvquOvq+OvrOOvreOvruOvr+OvsOOvseOvsuOvs+OvtOOvteOvtuOvt+OvuOOvueOvuuOvu+OvvOOvveOvvuOvvwor47CA47CB47CC47CD47CE47CF47CG47CH47CI47CJ47CK47CL47CM47CN47CO47CP47CQ47CR47CS47CT47CU47CV47CW47CX47CY47CZ47Ca47Cb47Cc47Cd47Ce47CfCivjsKDjsKHjsKLjsKPjsKTjsKXjsKbjsKfjsKjjsKnjsKrjsKvjsKzjsK3jsK7jsK/jsLDjsLHjsLLjsLPjsLTjsLXjsLbjsLfjsLjjsLnjsLrjsLvjsLzjsL3jsL7jsL8KK+OxgOOxgeOxguOxg+OxhOOxheOxhuOxh+OxiOOxieOxiuOxi+OxjOOxjeOxjuOxj+OxkOOxkeOxkuOxk+OxlOOxleOxluOxl+OxmOOxmeOxmuOxm+OxnOOxneOxnuOxnwor47Gg47Gh47Gi47Gj47Gk47Gl47Gm47Gn47Go47Gp47Gq47Gr47Gs47Gt47Gu47Gv47Gw47Gx47Gy47Gz47G047G147G247G347G447G547G647G747G847G947G+47G/CivjsoDjsoHjsoLjsoPjsoTjsoXjsobjsofjsojjsonjsorjsovjsozjso3jso7jso/jspDjspHjspLjspPjspTjspXjspbjspfjspjjspnjsprjspvjspzjsp3jsp7jsp8KK+OyoOOyoeOyouOyo+OypOOypeOypuOyp+OyqOOyqeOyquOyq+OyrOOyreOyruOyr+OysOOyseOysuOys+OytOOyteOytuOyt+OyuOOyueOyuuOyu+OyvOOyveOyvuOyvwor47OA47OB47OC47OD47OE47OF47OG47OH47OI47OJ47OK47OL47OM47ON47OO47OP47OQ47OR47OS47OT47OU47OV47OW47OX47OY47OZ47Oa47Ob47Oc47Od47Oe47OfCivjs6Djs6Hjs6Ljs6Pjs6Tjs6Xjs6bjs6fjs6jjs6njs6rjs6vjs6zjs63js67js6/js7Djs7Hjs7Ljs7Pjs7Tjs7Xjs7bjs7fjs7jjs7njs7rjs7vjs7zjs73js77js78KK+O0gOO0geO0guO0g+O0hOO0heO0huO0h+O0iOO0ieO0iuO0i+O0jOO0jeO0juO0j+O0kOO0keO0kuO0k+O0lOO0leO0luO0l+O0mOO0meO0muO0m+O0nOO0neO0nuO0nwor47Sg47Sh47Si47Sj47Sk47Sl47Sm47Sn47So47Sp47Sq47Sr47Ss47St47Su47Sv47Sw47Sx47Sy47Sz47S047S147S247S347S447S547S647S747S847S947S+47S/CivjtYDjtYHjtYLjtYPjtYTjtYXjtYbjtYfjtYjjtYnjtYrjtYvjtYzjtY3jtY7jtY/jtZDjtZHjtZLjtZPjtZTjtZXjtZbjtZfjtZjjtZnjtZrjtZvjtZzjtZ3jtZ7jtZ8KK+O1oOO1oeO1ouO1o+O1pOO1peO1puO1p+O1qOO1qeO1quO1q+O1rOO1reO1ruO1r+O1sOO1seO1suO1s+O1tOO1teO1tuO1t+O1uOO1ueO1uuO1u+O1vOO1veO1vuO1vwor47aA47aB47aC47aD47aE47aF47aG47aH47aI47aJ47aK47aL47aM47aN47aO47aP47aQ47aR47aS47aT47aU47aV47aW47aX47aY47aZ47aa47ab47ac47ad47ae47afCivjtqDjtqHjtqLjtqPjtqTjtqXjtqbjtqfjtqjjtqnjtqrjtqvjtqzjtq3jtq7jtq/jtrDjtrHjtrLjtrPjtrTjtrXjtrbjtrfjtrjjtrnjtrrjtrvjtrzjtr3jtr7jtr8KK+O3gOO3geO3guO3g+O3hOO3heO3huO3h+O3iOO3ieO3iuO3i+O3jOO3jeO3juO3j+O3kOO3keO3kuO3k+O3lOO3leO3luO3l+O3mOO3meO3muO3m+O3nOO3neO3nuO3nwor47eg47eh47ei47ej47ek47el47em47en47eo47ep47eq47er47es47et47eu47ev47ew47ex47ey47ez47e047e147e247e347e447e547e647e747e847e947e+47e/CivjuIDjuIHjuILjuIPjuITjuIXjuIbjuIfjuIjjuInjuIrjuIvjuIzjuI3juI7juI/juJDjuJHjuJLjuJPjuJTjuJXjuJbjuJfjuJjjuJnjuJrjuJvjuJzjuJ3juJ7juJ8KK+O4oOO4oeO4ouO4o+O4pOO4peO4puO4p+O4qOO4qeO4quO4q+O4rOO4reO4ruO4r+O4sOO4seO4suO4s+O4tOO4teO4tuO4t+O4uOO4ueO4uuO4u+O4vOO4veO4vuO4vwor47mA47mB47mC47mD47mE47mF47mG47mH47mI47mJ47mK47mL47mM47mN47mO47mP47mQ47mR47mS47mT47mU47mV47mW47mX47mY47mZ47ma47mb47mc47md47me47mfCivjuaDjuaHjuaLjuaPjuaTjuaXjuabjuafjuajjuanjuarjuavjuazjua3jua7jua/jubDjubHjubLjubPjubTjubXjubbjubfjubjjubnjubrjubvjubzjub3jub7jub8KK+O6gOO6geO6guO6g+O6hOO6heO6huO6h+O6iOO6ieO6iuO6i+O6jOO6jeO6juO6j+O6kOO6keO6kuO6k+O6lOO6leO6luO6l+O6mOO6meO6muO6m+O6nOO6neO6nuO6nwor47qg47qh47qi47qj47qk47ql47qm47qn47qo47qp47qq47qr47qs47qt47qu47qv47qw47qx47qy47qz47q047q147q247q347q447q547q647q747q847q947q+47q/Civju4Dju4Hju4Lju4Pju4Tju4Xju4bju4fju4jju4nju4rju4vju4zju43ju47ju4/ju5Dju5Hju5Lju5Pju5Tju5Xju5bju5fju5jju5nju5rju5vju5zju53ju57ju58KK+O7oOO7oeO7ouO7o+O7pOO7peO7puO7p+O7qOO7qeO7quO7q+O7rOO7reO7ruO7r+O7sOO7seO7suO7s+O7tOO7teO7tuO7t+O7uOO7ueO7uuO7u+O7vOO7veO7vuO7vwor47yA47yB47yC47yD47yE47yF47yG47yH47yI47yJ47yK47yL47yM47yN47yO47yP47yQ47yR47yS47yT47yU47yV47yW47yX47yY47yZ47ya47yb47yc47yd47ye47yfCivjvKDjvKHjvKLjvKPjvKTjvKXjvKbjvKfjvKjjvKnjvKrjvKvjvKzjvK3jvK7jvK/jvLDjvLHjvLLjvLPjvLTjvLXjvLbjvLfjvLjjvLnjvLrjvLvjvLzjvL3jvL7jvL8KK+O9gOO9geO9guO9g+O9hOO9heO9huO9h+O9iOO9ieO9iuO9i+O9jOO9jeO9juO9j+O9kOO9keO9kuO9k+O9lOO9leO9luO9l+O9mOO9meO9muO9m+O9nOO9neO9nuO9nwor472g472h472i472j472k472l472m472n472o472p472q472r472s472t472u472v472w472x472y472z4720472147224723472447254726472747284729472+472/CivjvoDjvoHjvoLjvoPjvoTjvoXjvobjvofjvojjvonjvorjvovjvozjvo3jvo7jvo/jvpDjvpHjvpLjvpPjvpTjvpXjvpbjvpfjvpjjvpnjvprjvpvjvpzjvp3jvp7jvp8KK+O+oOO+oeO+ouO+o+O+pOO+peO+puO+p+O+qOO+qeO+quO+q+O+rOO+reO+ruO+r+O+sOO+seO+suO+s+O+tOO+teO+tuO+t+O+uOO+ueO+uuO+u+O+vOO+veO+vuO+vwor47+A47+B47+C47+D47+E47+F47+G47+H47+I47+J47+K47+L47+M47+N47+O47+P47+Q47+R47+S47+T47+U47+V47+W47+X47+Y47+Z47+a47+b47+c47+d47+e47+fCivjv6Djv6Hjv6Ljv6Pjv6Tjv6Xjv6bjv6fjv6jjv6njv6rjv6vjv6zjv63jv67jv6/jv7Djv7Hjv7Ljv7Pjv7Tjv7Xjv7bjv7fjv7jjv7njv7rjv7vjv7zjv73jv77jv78KK+SAgOSAgeSAguSAg+SAhOSAheSAhuSAh+SAiOSAieSAiuSAi+SAjOSAjeSAjuSAj+SAkOSAkeSAkuSAk+SAlOSAleSAluSAl+SAmOSAmeSAmuSAm+SAnOSAneSAnuSAnwor5ICg5ICh5ICi5ICj5ICk5ICl5ICm5ICn5ICo5ICp5ICq5ICr5ICs5ICt5ICu5ICv5ICw5ICx5ICy5ICz5IC05IC15IC25IC35IC45IC55IC65IC75IC85IC95IC+5IC/CivkgYDkgYHkgYLkgYPkgYTkgYXkgYbkgYfkgYjkgYnkgYrkgYvkgYzkgY3kgY7kgY/kgZDkgZHkgZLkgZPkgZTkgZXkgZbkgZfkgZjkgZnkgZrkgZvkgZzkgZ3kgZ7kgZ8KK+SBoOSBoeSBouSBo+SBpOSBpeSBpuSBp+SBqOSBqeSBquSBq+SBrOSBreSBruSBr+SBsOSBseSBsuSBs+SBtOSBteSBtuSBt+SBuOSBueSBuuSBu+SBvOSBveSBvuSBvwor5IKA5IKB5IKC5IKD5IKE5IKF5IKG5IKH5IKI5IKJ5IKK5IKL5IKM5IKN5IKO5IKP5IKQ5IKR5IKS5IKT5IKU5IKV5IKW5IKX5IKY5IKZ5IKa5IKb5IKc5IKd5IKe5IKfCivkgqDkgqHkgqLkgqPkgqTkgqXkgqbkgqfkgqjkgqnkgqrkgqvkgqzkgq3kgq7kgq/kgrDkgrHkgrLkgrPkgrTkgrXkgrbkgrfkgrjkgrnkgrrkgrvkgrzkgr3kgr7kgr8KK+SDgOSDgeSDguSDg+SDhOSDheSDhuSDh+SDiOSDieSDiuSDi+SDjOSDjeSDjuSDj+SDkOSDkeSDkuSDk+SDlOSDleSDluSDl+SDmOSDmeSDmuSDm+SDnOSDneSDnuSDnwor5IOg5IOh5IOi5IOj5IOk5IOl5IOm5IOn5IOo5IOp5IOq5IOr5IOs5IOt5IOu5IOv5IOw5IOx5IOy5IOz5IO05IO15IO25IO35IO45IO55IO65IO75IO85IO95IO+5IO/CivkhIDkhIHkhILkhIPkhITkhIXkhIbkhIfkhIjkhInkhIrkhIvkhIzkhI3khI7khI/khJDkhJHkhJLkhJPkhJTkhJXkhJbkhJfkhJjkhJnkhJrkhJvkhJzkhJ3khJ7khJ8KK+SEoOSEoeSEouSEo+SEpOSEpeSEpuSEp+SEqOSEqeSEquSEq+SErOSEreSEruSEr+SEsOSEseSEsuSEs+SEtOSEteSEtuSEt+SEuOSEueSEuuSEu+SEvOSEveSEvuSEvwor5IWA5IWB5IWC5IWD5IWE5IWF5IWG5IWH5IWI5IWJ5IWK5IWL5IWM5IWN5IWO5IWP5IWQ5IWR5IWS5IWT5IWU5IWV5IWW5IWX5IWY5IWZ5IWa5IWb5IWc5IWd5IWe5IWfCivkhaDkhaHkhaLkhaPkhaTkhaXkhabkhafkhajkhankharkhavkhazkha3kha7kha/khbDkhbHkhbLkhbPkhbTkhbXkhbbkhbfkhbjkhbnkhbrkhbvkhbzkhb3khb7khb8KK+SGgOSGgeSGguSGg+SGhOSGheSGhuSGh+SGiOSGieSGiuSGi+SGjOSGjeSGjuSGj+SGkOSGkeSGkuSGk+SGlOSGleSGluSGl+SGmOSGmeSGmuSGm+SGnOSGneSGnuSGnwor5Iag5Iah5Iai5Iaj5Iak5Ial5Iam5Ian5Iao5Iap5Iaq5Iar5Ias5Iat5Iau5Iav5Iaw5Iax5Iay5Iaz5Ia05Ia15Ia25Ia35Ia45Ia55Ia65Ia75Ia85Ia95Ia+5Ia/Civkh4Dkh4Hkh4Lkh4Pkh4Tkh4Xkh4bkh4fkh4jkh4nkh4rkh4vkh4zkh43kh47kh4/kh5Dkh5Hkh5Lkh5Pkh5Tkh5Xkh5bkh5fkh5jkh5nkh5rkh5vkh5zkh53kh57kh58KK+SHoOSHoeSHouSHo+SHpOSHpeSHpuSHp+SHqOSHqeSHquSHq+SHrOSHreSHruSHr+SHsOSHseSHsuSHs+SHtOSHteSHtuSHt+SHuOSHueSHuuSHu+SHvOSHveSHvuSHvwor5IiA5IiB5IiC5IiD5IiE5IiF5IiG5IiH5IiI5IiJ5IiK5IiL5IiM5IiN5IiO5IiP5IiQ5IiR5IiS5IiT5IiU5IiV5IiW5IiX5IiY5IiZ5Iia5Iib5Iic5Iid5Iie5IifCivkiKDkiKHkiKLkiKPkiKTkiKXkiKbkiKfkiKjkiKnkiKrkiKvkiKzkiK3kiK7kiK/kiLDkiLHkiLLkiLPkiLTkiLXkiLbkiLfkiLjkiLnkiLrkiLvkiLzkiL3kiL7kiL8KK+SJgOSJgeSJguSJg+SJhOSJheSJhuSJh+SJiOSJieSJiuSJi+SJjOSJjeSJjuSJj+SJkOSJkeSJkuSJk+SJlOSJleSJluSJl+SJmOSJmeSJmuSJm+SJnOSJneSJnuSJnwor5Img5Imh5Imi5Imj5Imk5Iml5Imm5Imn5Imo5Imp5Imq5Imr5Ims5Imt5Imu5Imv5Imw5Imx5Imy5Imz5Im05Im15Im25Im35Im45Im55Im65Im75Im85Im95Im+5Im/CivkioDkioHkioLkioPkioTkioXkiobkiofkiojkionkiorkiovkiozkio3kio7kio/kipDkipHkipLkipPkipTkipXkipbkipfkipjkipnkiprkipvkipzkip3kip7kip8KK+SKoOSKoeSKouSKo+SKpOSKpeSKpuSKp+SKqOSKqeSKquSKq+SKrOSKreSKruSKr+SKsOSKseSKsuSKs+SKtOSKteSKtuSKt+SKuOSKueSKuuSKu+SKvOSKveSKvuSKvwor5IuA5IuB5IuC5IuD5IuE5IuF5IuG5IuH5IuI5IuJ5IuK5IuL5IuM5IuN5IuO5IuP5IuQ5IuR5IuS5IuT5IuU5IuV5IuW5IuX5IuY5IuZ5Iua5Iub5Iuc5Iud5Iue5IufCivki6Dki6Hki6Lki6Pki6Tki6Xki6bki6fki6jki6nki6rki6vki6zki63ki67ki6/ki7Dki7Hki7Lki7Pki7Tki7Xki7bki7fki7jki7nki7rki7vki7zki73ki77ki78KK+SMgOSMgeSMguSMg+SMhOSMheSMhuSMh+SMiOSMieSMiuSMi+SMjOSMjeSMjuSMj+SMkOSMkeSMkuSMk+SMlOSMleSMluSMl+SMmOSMmeSMmuSMm+SMnOSMneSMnuSMnwor5Iyg5Iyh5Iyi5Iyj5Iyk5Iyl5Iym5Iyn5Iyo5Iyp5Iyq5Iyr5Iys5Iyt5Iyu5Iyv5Iyw5Iyx5Iyy5Iyz5Iy05Iy15Iy25Iy35Iy45Iy55Iy65Iy75Iy85Iy95Iy+5Iy/CivkjYDkjYHkjYLkjYPkjYTkjYXkjYbkjYfkjYjkjYnkjYrkjYvkjYzkjY3kjY7kjY/kjZDkjZHkjZLkjZPkjZTkjZXkjZbkjZfkjZjkjZnkjZrkjZvkjZzkjZ3kjZ7kjZ8KK+SNoOSNoeSNouSNo+SNpOSNpeSNpuSNp+SNqOSNqeSNquSNq+SNrOSNreSNruSNr+SNsOSNseSNsuSNs+SNtOSNteSNtuSNt+SNuOSNueSNuuSNu+SNvOSNveSNvuSNvwor5I6A5I6B5I6C5I6D5I6E5I6F5I6G5I6H5I6I5I6J5I6K5I6L5I6M5I6N5I6O5I6P5I6Q5I6R5I6S5I6T5I6U5I6V5I6W5I6X5I6Y5I6Z5I6a5I6b5I6c5I6d5I6e5I6fCivkjqDkjqHkjqLkjqPkjqTkjqXkjqbkjqfkjqjkjqnkjqrkjqvkjqzkjq3kjq7kjq/kjrDkjrHkjrLkjrPkjrTkjrXkjrbkjrfkjrjkjrnkjrrkjrvkjrzkjr3kjr7kjr8KK+SPgOSPgeSPguSPg+SPhOSPheSPhuSPh+SPiOSPieSPiuSPi+SPjOSPjeSPjuSPj+SPkOSPkeSPkuSPk+SPlOSPleSPluSPl+SPmOSPmeSPmuSPm+SPnOSPneSPnuSPnwor5I+g5I+h5I+i5I+j5I+k5I+l5I+m5I+n5I+o5I+p5I+q5I+r5I+s5I+t5I+u5I+v5I+w5I+x5I+y5I+z5I+05I+15I+25I+35I+45I+55I+65I+75I+85I+95I++5I+/CivkkIDkkIHkkILkkIPkkITkkIXkkIbkkIfkkIjkkInkkIrkkIvkkIzkkI3kkI7kkI/kkJDkkJHkkJLkkJPkkJTkkJXkkJbkkJfkkJjkkJnkkJrkkJvkkJzkkJ3kkJ7kkJ8KK+SQoOSQoeSQouSQo+SQpOSQpeSQpuSQp+SQqOSQqeSQquSQq+SQrOSQreSQruSQr+SQsOSQseSQsuSQs+SQtOSQteSQtuSQt+SQuOSQueSQuuSQu+SQvOSQveSQvuSQvwor5JGA5JGB5JGC5JGD5JGE5JGF5JGG5JGH5JGI5JGJ5JGK5JGL5JGM5JGN5JGO5JGP5JGQ5JGR5JGS5JGT5JGU5JGV5JGW5JGX5JGY5JGZ5JGa5JGb5JGc5JGd5JGe5JGfCivkkaDkkaHkkaLkkaPkkaTkkaXkkabkkafkkajkkankkarkkavkkazkka3kka7kka/kkbDkkbHkkbLkkbPkkbTkkbXkkbbkkbfkkbjkkbnkkbrkkbvkkbzkkb3kkb7kkb8KK+SSgOSSgeSSguSSg+SShOSSheSShuSSh+SSiOSSieSSiuSSi+SSjOSSjeSSjuSSj+SSkOSSkeSSkuSSk+SSlOSSleSSluSSl+SSmOSSmeSSmuSSm+SSnOSSneSSnuSSnwor5JKg5JKh5JKi5JKj5JKk5JKl5JKm5JKn5JKo5JKp5JKq5JKr5JKs5JKt5JKu5JKv5JKw5JKx5JKy5JKz5JK05JK15JK25JK35JK45JK55JK65JK75JK85JK95JK+5JK/Civkk4Dkk4Hkk4Lkk4Pkk4Tkk4Xkk4bkk4fkk4jkk4nkk4rkk4vkk4zkk43kk47kk4/kk5Dkk5Hkk5Lkk5Pkk5Tkk5Xkk5bkk5fkk5jkk5nkk5rkk5vkk5zkk53kk57kk58KK+SToOSToeSTouSTo+STpOSTpeSTpuSTp+STqOSTqeSTquSTq+STrOSTreSTruSTr+STsOSTseSTsuSTs+STtOSTteSTtuSTt+STuOSTueSTuuSTu+STvOSTveSTvuSTvwor5JSA5JSB5JSC5JSD5JSE5JSF5JSG5JSH5JSI5JSJ5JSK5JSL5JSM5JSN5JSO5JSP5JSQ5JSR5JSS5JST5JSU5JSV5JSW5JSX5JSY5JSZ5JSa5JSb5JSc5JSd5JSe5JSfCivklKDklKHklKLklKPklKTklKXklKbklKfklKjklKnklKrklKvklKzklK3klK7klK/klLDklLHklLLklLPklLTklLXklLbklLfklLjklLnklLrklLvklLzklL3klL7klL8KK+SVgOSVgeSVguSVg+SVhOSVheSVhuSVh+SViOSVieSViuSVi+SVjOSVjeSVjuSVj+SVkOSVkeSVkuSVk+SVlOSVleSVluSVl+SVmOSVmeSVmuSVm+SVnOSVneSVnuSVnwor5JWg5JWh5JWi5JWj5JWk5JWl5JWm5JWn5JWo5JWp5JWq5JWr5JWs5JWt5JWu5JWv5JWw5JWx5JWy5JWz5JW05JW15JW25JW35JW45JW55JW65JW75JW85JW95JW+5JW/CivkloDkloHkloLkloPkloTkloXklobklofklojklonklorklovklozklo3klo7klo/klpDklpHklpLklpPklpTklpXklpbklpfklpjklpnklprklpvklpzklp3klp7klp8KK+SWoOSWoeSWouSWo+SWpOSWpeSWpuSWp+SWqOSWqeSWquSWq+SWrOSWreSWruSWr+SWsOSWseSWsuSWs+SWtOSWteSWtuSWt+SWuOSWueSWuuSWu+SWvOSWveSWvuSWvwor5JeA5JeB5JeC5JeD5JeE5JeF5JeG5JeH5JeI5JeJ5JeK5JeL5JeM5JeN5JeO5JeP5JeQ5JeR5JeS5JeT5JeU5JeV5JeW5JeX5JeY5JeZ5Jea5Jeb5Jec5Jed5Jee5JefCivkl6Dkl6Hkl6Lkl6Pkl6Tkl6Xkl6bkl6fkl6jkl6nkl6rkl6vkl6zkl63kl67kl6/kl7Dkl7Hkl7Lkl7Pkl7Tkl7Xkl7bkl7fkl7jkl7nkl7rkl7vkl7zkl73kl77kl78KK+SYgOSYgeSYguSYg+SYhOSYheSYhuSYh+SYiOSYieSYiuSYi+SYjOSYjeSYjuSYj+SYkOSYkeSYkuSYk+SYlOSYleSYluSYl+SYmOSYmeSYmuSYm+SYnOSYneSYnuSYnwor5Jig5Jih5Jii5Jij5Jik5Jil5Jim5Jin5Jio5Jip5Jiq5Jir5Jis5Jit5Jiu5Jiv5Jiw5Jix5Jiy5Jiz5Ji05Ji15Ji25Ji35Ji45Ji55Ji65Ji75Ji85Ji95Ji+5Ji/CivkmYDkmYHkmYLkmYPkmYTkmYXkmYbkmYfkmYjkmYnkmYrkmYvkmYzkmY3kmY7kmY/kmZDkmZHkmZLkmZPkmZTkmZXkmZbkmZfkmZjkmZnkmZrkmZvkmZzkmZ3kmZ7kmZ8KK+SZoOSZoeSZouSZo+SZpOSZpeSZpuSZp+SZqOSZqeSZquSZq+SZrOSZreSZruSZr+SZsOSZseSZsuSZs+SZtOSZteSZtuSZt+SZuOSZueSZuuSZu+SZvOSZveSZvuSZvwor5JqA5JqB5JqC5JqD5JqE5JqF5JqG5JqH5JqI5JqJ5JqK5JqL5JqM5JqN5JqO5JqP5JqQ5JqR5JqS5JqT5JqU5JqV5JqW5JqX5JqY5JqZ5Jqa5Jqb5Jqc5Jqd5Jqe5JqfCivkmqDkmqHkmqLkmqPkmqTkmqXkmqbkmqfkmqjkmqnkmqrkmqvkmqzkmq3kmq7kmq/kmrDkmrHkmrLkmrPkmrTkmrXkmrbkmrfkmrjkmrnkmrrkmrvkmrzkmr3kmr7kmr8KK+SbgOSbgeSbguSbg+SbhOSbheSbhuSbh+SbiOSbieSbiuSbi+SbjOSbjeSbjuSbj+SbkOSbkeSbkuSbk+SblOSbleSbluSbl+SbmOSbmeSbmuSbm+SbnOSbneSbnuSbnwor5Jug5Juh5Jui5Juj5Juk5Jul5Jum5Jun5Juo5Jup5Juq5Jur5Jus5Jut5Juu5Juv5Juw5Jux5Juy5Juz5Ju05Ju15Ju25Ju35Ju45Ju55Ju65Ju75Ju85Ju95Ju+5Ju/CivknIDknIHknILknIPknITknIXknIbknIfknIjknInknIrknIvknIzknI3knI7knI/knJDknJHknJLknJPknJTknJXknJbknJfknJjknJnknJrknJvknJzknJ3knJ7knJ8KK+ScoOScoeScouSco+ScpOScpeScpuScp+ScqOScqeScquScq+ScrOScreScruScr+ScsOScseScsuScs+SctOScteSctuSct+ScuOScueScuuScu+ScvOScveScvuScvwor5J2A5J2B5J2C5J2D5J2E5J2F5J2G5J2H5J2I5J2J5J2K5J2L5J2M5J2N5J2O5J2P5J2Q5J2R5J2S5J2T5J2U5J2V5J2W5J2X5J2Y5J2Z5J2a5J2b5J2c5J2d5J2e5J2fCivknaDknaHknaLknaPknaTknaXknabknafknajknanknarknavknazkna3kna7kna/knbDknbHknbLknbPknbTknbXknbbknbfknbjknbnknbrknbvknbzknb3knb7knb8KK+SegOSegeSeguSeg+SehOSeheSehuSeh+SeiOSeieSeiuSei+SejOSejeSejuSej+SekOSekeSekuSek+SelOSeleSeluSel+SemOSemeSemuSem+SenOSeneSenuSenwor5J6g5J6h5J6i5J6j5J6k5J6l5J6m5J6n5J6o5J6p5J6q5J6r5J6s5J6t5J6u5J6v5J6w5J6x5J6y5J6z5J605J615J625J635J645J655J665J675J685J695J6+5J6/Civkn4Dkn4Hkn4Lkn4Pkn4Tkn4Xkn4bkn4fkn4jkn4nkn4rkn4vkn4zkn43kn47kn4/kn5Dkn5Hkn5Lkn5Pkn5Tkn5Xkn5bkn5fkn5jkn5nkn5rkn5vkn5zkn53kn57kn58KK+SfoOSfoeSfouSfo+SfpOSfpeSfpuSfp+SfqOSfqeSfquSfq+SfrOSfreSfruSfr+SfsOSfseSfsuSfs+SftOSfteSftuSft+SfuOSfueSfuuSfu+SfvOSfveSfvuSfvwor5KCA5KCB5KCC5KCD5KCE5KCF5KCG5KCH5KCI5KCJ5KCK5KCL5KCM5KCN5KCO5KCP5KCQ5KCR5KCS5KCT5KCU5KCV5KCW5KCX5KCY5KCZ5KCa5KCb5KCc5KCd5KCe5KCfCivkoKDkoKHkoKLkoKPkoKTkoKXkoKbkoKfkoKjkoKnkoKrkoKvkoKzkoK3koK7koK/koLDkoLHkoLLkoLPkoLTkoLXkoLbkoLfkoLjkoLnkoLrkoLvkoLzkoL3koL7koL8KK+ShgOShgeShguShg+ShhOShheShhuShh+ShiOShieShiuShi+ShjOShjeShjuShj+ShkOShkeShkuShk+ShlOShleShluShl+ShmOShmeShmuShm+ShnOShneShnuShnwor5KGg5KGh5KGi5KGj5KGk5KGl5KGm5KGn5KGo5KGp5KGq5KGr5KGs5KGt5KGu5KGv5KGw5KGx5KGy5KGz5KG05KG15KG25KG35KG45KG55KG65KG75KG85KG95KG+5KG/CivkooDkooHkooLkooPkooTkooXkoobkoofkoojkoonkoorkoovkoozkoo3koo7koo/kopDkopHkopLkopPkopTkopXkopbkopfkopjkopnkoprkopvkopzkop3kop7kop8KK+SioOSioeSiouSio+SipOSipeSipuSip+SiqOSiqeSiquSiq+SirOSireSiruSir+SisOSiseSisuSis+SitOSiteSituSit+SiuOSiueSiuuSiu+SivOSiveSivuSivwor5KOA5KOB5KOC5KOD5KOE5KOF5KOG5KOH5KOI5KOJ5KOK5KOL5KOM5KON5KOO5KOP5KOQ5KOR5KOS5KOT5KOU5KOV5KOW5KOX5KOY5KOZ5KOa5KOb5KOc5KOd5KOe5KOfCivko6Dko6Hko6Lko6Pko6Tko6Xko6bko6fko6jko6nko6rko6vko6zko63ko67ko6/ko7Dko7Hko7Lko7Pko7Tko7Xko7bko7fko7jko7nko7rko7vko7zko73ko77ko78KK+SkgOSkgeSkguSkg+SkhOSkheSkhuSkh+SkiOSkieSkiuSki+SkjOSkjeSkjuSkj+SkkOSkkeSkkuSkk+SklOSkleSkluSkl+SkmOSkmeSkmuSkm+SknOSkneSknuSknwor5KSg5KSh5KSi5KSj5KSk5KSl5KSm5KSn5KSo5KSp5KSq5KSr5KSs5KSt5KSu5KSv5KSw5KSx5KSy5KSz5KS05KS15KS25KS35KS45KS55KS65KS75KS85KS95KS+5KS/CivkpYDkpYHkpYLkpYPkpYTkpYXkpYbkpYfkpYjkpYnkpYrkpYvkpYzkpY3kpY7kpY/kpZDkpZHkpZLkpZPkpZTkpZXkpZbkpZfkpZjkpZnkpZrkpZvkpZzkpZ3kpZ7kpZ8KK+SloOSloeSlouSlo+SlpOSlpeSlpuSlp+SlqOSlqeSlquSlq+SlrOSlreSlruSlr+SlsOSlseSlsuSls+SltOSlteSltuSlt+SluOSlueSluuSlu+SlvOSlveSlvuSlvwor5KaA5KaB5KaC5KaD5KaE5KaF5KaG5KaH5KaI5KaJ5KaK5KaL5KaM5KaN5KaO5KaP5KaQ5KaR5KaS5KaT5KaU5KaV5KaW5KaX5KaY5KaZ5Kaa5Kab5Kac5Kad5Kae5KafCivkpqDkpqHkpqLkpqPkpqTkpqXkpqbkpqfkpqjkpqnkpqrkpqvkpqzkpq3kpq7kpq/kprDkprHkprLkprPkprTkprXkprbkprfkprjkprnkprrkprvkprzkpr3kpr7kpr8KK+SngOSngeSnguSng+SnhOSnheSnhuSnh+SniOSnieSniuSni+SnjOSnjeSnjuSnj+SnkOSnkeSnkuSnk+SnlOSnleSnluSnl+SnmOSnmeSnmuSnm+SnnOSnneSnnuSnnwor5Keg5Keh5Kei5Kej5Kek5Kel5Kem5Ken5Keo5Kep5Keq5Ker5Kes5Ket5Keu5Kev5Kew5Kex5Key5Kez5Ke05Ke15Ke25Ke35Ke45Ke55Ke65Ke75Ke85Ke95Ke+5Ke/CivkqIDkqIHkqILkqIPkqITkqIXkqIbkqIfkqIjkqInkqIrkqIvkqIzkqI3kqI7kqI/kqJDkqJHkqJLkqJPkqJTkqJXkqJbkqJfkqJjkqJnkqJrkqJvkqJzkqJ3kqJ7kqJ8KK+SooOSooeSoouSoo+SopOSopeSopuSop+SoqOSoqeSoquSoq+SorOSoreSoruSor+SosOSoseSosuSos+SotOSoteSotuSot+SouOSoueSouuSou+SovOSoveSovuSovwor5KmA5KmB5KmC5KmD5KmE5KmF5KmG5KmH5KmI5KmJ5KmK5KmL5KmM5KmN5KmO5KmP5KmQ5KmR5KmS5KmT5KmU5KmV5KmW5KmX5KmY5KmZ5Kma5Kmb5Kmc5Kmd5Kme5KmfCivkqaDkqaHkqaLkqaPkqaTkqaXkqabkqafkqajkqankqarkqavkqazkqa3kqa7kqa/kqbDkqbHkqbLkqbPkqbTkqbXkqbbkqbfkqbjkqbnkqbrkqbvkqbzkqb3kqb7kqb8KK+SqgOSqgeSqguSqg+SqhOSqheSqhuSqh+SqiOSqieSqiuSqi+SqjOSqjeSqjuSqj+SqkOSqkeSqkuSqk+SqlOSqleSqluSql+SqmOSqmeSqmuSqm+SqnOSqneSqnuSqnwor5Kqg5Kqh5Kqi5Kqj5Kqk5Kql5Kqm5Kqn5Kqo5Kqp5Kqq5Kqr5Kqs5Kqt5Kqu5Kqv5Kqw5Kqx5Kqy5Kqz5Kq05Kq15Kq25Kq35Kq45Kq55Kq65Kq75Kq85Kq95Kq+5Kq/Civkq4Dkq4Hkq4Lkq4Pkq4Tkq4Xkq4bkq4fkq4jkq4nkq4rkq4vkq4zkq43kq47kq4/kq5Dkq5Hkq5Lkq5Pkq5Tkq5Xkq5bkq5fkq5jkq5nkq5rkq5vkq5zkq53kq57kq58KK+SroOSroeSrouSro+SrpOSrpeSrpuSrp+SrqOSrqeSrquSrq+SrrOSrreSrruSrr+SrsOSrseSrsuSrs+SrtOSrteSrtuSrt+SruOSrueSruuSru+SrvOSrveSrvuSrvwor5KyA5KyB5KyC5KyD5KyE5KyF5KyG5KyH5KyI5KyJ5KyK5KyL5KyM5KyN5KyO5KyP5KyQ5KyR5KyS5KyT5KyU5KyV5KyW5KyX5KyY5KyZ5Kya5Kyb5Kyc5Kyd5Kye5KyfCivkrKDkrKHkrKLkrKPkrKTkrKXkrKbkrKfkrKjkrKnkrKrkrKvkrKzkrK3krK7krK/krLDkrLHkrLLkrLPkrLTkrLXkrLbkrLfkrLjkrLnkrLrkrLvkrLzkrL3krL7krL8KK+StgOStgeStguStg+SthOStheSthuSth+StiOStieStiuSti+StjOStjeStjuStj+StkOStkeStkuStk+StlOStleStluStl+StmOStmeStmuStm+StnOStneStnuStnwor5K2g5K2h5K2i5K2j5K2k5K2l5K2m5K2n5K2o5K2p5K2q5K2r5K2s5K2t5K2u5K2v5K2w5K2x5K2y5K2z5K205K215K225K235K245K255K265K275K285K295K2+5K2/CivkroDkroHkroLkroPkroTkroXkrobkrofkrojkronkrorkrovkrozkro3kro7kro/krpDkrpHkrpLkrpPkrpTkrpXkrpbkrpfkrpjkrpnkrprkrpvkrpzkrp3krp7krp8KK+SuoOSuoeSuouSuo+SupOSupeSupuSup+SuqOSuqeSuquSuq+SurOSureSuruSur+SusOSuseSusuSus+SutOSuteSutuSut+SuuOSuueSuuuSuu+SuvOSuveSuvuSuvwor5K+A5K+B5K+C5K+D5K+E5K+F5K+G5K+H5K+I5K+J5K+K5K+L5K+M5K+N5K+O5K+P5K+Q5K+R5K+S5K+T5K+U5K+V5K+W5K+X5K+Y5K+Z5K+a5K+b5K+c5K+d5K+e5K+fCivkr6Dkr6Hkr6Lkr6Pkr6Tkr6Xkr6bkr6fkr6jkr6nkr6rkr6vkr6zkr63kr67kr6/kr7Dkr7Hkr7Lkr7Pkr7Tkr7Xkr7bkr7fkr7jkr7nkr7rkr7vkr7zkr73kr77kr78KK+SwgOSwgeSwguSwg+SwhOSwheSwhuSwh+SwiOSwieSwiuSwi+SwjOSwjeSwjuSwj+SwkOSwkeSwkuSwk+SwlOSwleSwluSwl+SwmOSwmeSwmuSwm+SwnOSwneSwnuSwnwor5LCg5LCh5LCi5LCj5LCk5LCl5LCm5LCn5LCo5LCp5LCq5LCr5LCs5LCt5LCu5LCv5LCw5LCx5LCy5LCz5LC05LC15LC25LC35LC45LC55LC65LC75LC85LC95LC+5LC/CivksYDksYHksYLksYPksYTksYXksYbksYfksYjksYnksYrksYvksYzksY3ksY7ksY/ksZDksZHksZLksZPksZTksZXksZbksZfksZjksZnksZrksZvksZzksZ3ksZ7ksZ8KK+SxoOSxoeSxouSxo+SxpOSxpeSxpuSxp+SxqOSxqeSxquSxq+SxrOSxreSxruSxr+SxsOSxseSxsuSxs+SxtOSxteSxtuSxt+SxuOSxueSxuuSxu+SxvOSxveSxvuSxvwor5LKA5LKB5LKC5LKD5LKE5LKF5LKG5LKH5LKI5LKJ5LKK5LKL5LKM5LKN5LKO5LKP5LKQ5LKR5LKS5LKT5LKU5LKV5LKW5LKX5LKY5LKZ5LKa5LKb5LKc5LKd5LKe5LKfCivksqDksqHksqLksqPksqTksqXksqbksqfksqjksqnksqrksqvksqzksq3ksq7ksq/ksrDksrHksrLksrPksrTksrXksrbksrfksrjksrnksrrksrvksrzksr3ksr7ksr8KK+SzgOSzgeSzguSzg+SzhOSzheSzhuSzh+SziOSzieSziuSzi+SzjOSzjeSzjuSzj+SzkOSzkeSzkuSzk+SzlOSzleSzluSzl+SzmOSzmeSzmuSzm+SznOSzneSznuSznwor5LOg5LOh5LOi5LOj5LOk5LOl5LOm5LOn5LOo5LOp5LOq5LOr5LOs5LOt5LOu5LOv5LOw5LOx5LOy5LOz5LO05LO15LO25LO35LO45LO55LO65LO75LO85LO95LO+5LO/CivktIDktIHktILktIPktITktIXktIbktIfktIjktInktIrktIvktIzktI3ktI7ktI/ktJDktJHktJLktJPktJTktJXktJbktJfktJjktJnktJrktJvktJzktJ3ktJ7ktJ8KK+S0oOS0oeS0ouS0o+S0pOS0peS0puS0p+S0qOS0qeS0quS0q+S0rOS0reS0ruS0r+S0sOS0seS0suS0s+S0tOS0teS0tuS0t+S0uOS0ueS0uuS0u+S0vOS0veS0vuS0vwor5LWA5LWB5LWC5LWD5LWE5LWF5LWG5LWH5LWI5LWJ5LWK5LWL5LWM5LWN5LWO5LWP5LWQ5LWR5LWS5LWT5LWU5LWV5LWW5LWX5LWY5LWZ5LWa5LWb5LWc5LWd5LWe5LWfCivktaDktaHktaLktaPktaTktaXktabktafktajktanktarktavktazkta3kta7kta/ktbDktbHktbLktbPktbTktbXktbbktbfktbjktbnktbrktbvktbzktb3ktb7ktb8KK+S2gOS2geS2guS2g+S2hOS2heS2huS2h+S2iOS2ieS2iuS2i+S2jOS2jeS2juS2j+S2kOS2keS2kuS2k+S2lOS2leS2luS2l+S2mOS2meS2muS2m+S2nOS2neS2nuS2nwor5Lag5Lah5Lai5Laj5Lak5Lal5Lam5Lan5Lao5Lap5Laq5Lar5Las5Lat5Lau5Lav5Law5Lax5Lay5Laz5La05La15La25La35La45La55La65La75La85La95La+5La/CisKK1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzIChVKzREQzAtVSs0REZGKToKKwor5LeA5LeB5LeC5LeD5LeE5LeF5LeG5LeH5LeI5LeJ5LeK5LeL5LeM5LeN5LeO5LeP5LeQ5LeR5LeS5LeT5LeU5LeV5LeW5LeX5LeY5LeZ5Lea5Leb5Lec5Led5Lee5LefCivkt6Dkt6Hkt6Lkt6Pkt6Tkt6Xkt6bkt6fkt6jkt6nkt6rkt6vkt6zkt63kt67kt6/kt7Dkt7Hkt7Lkt7Pkt7Tkt7Xkt7bkt7fkt7jkt7nkt7rkt7vkt7zkt73kt77kt78KKworQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyAoVSs0RTAwLVUrOUZGRik6CisKK+S4gOS4geS4guS4g+S4hOS4heS4huS4h+S4iOS4ieS4iuS4i+S4jOS4jeS4juS4j+S4kOS4keS4kuS4k+S4lOS4leS4luS4l+S4mOS4meS4muS4m+S4nOS4neS4nuS4nwor5Lig5Lih5Lii5Lij5Lik5Lil5Lim5Lin5Lio5Lip5Liq5Lir5Lis5Lit5Liu5Liv5Liw5Lix5Liy5Liz5Li05Li15Li25Li35Li45Li55Li65Li75Li85Li95Li+5Li/CivkuYDkuYHkuYLkuYPkuYTkuYXkuYbkuYfkuYjkuYnkuYrkuYvkuYzkuY3kuY7kuY/kuZDkuZHkuZLkuZPkuZTkuZXkuZbkuZfkuZjkuZnkuZrkuZvkuZzkuZ3kuZ7kuZ8KK+S5oOS5oeS5ouS5o+S5pOS5peS5puS5p+S5qOS5qeS5quS5q+S5rOS5reS5ruS5r+S5sOS5seS5suS5s+S5tOS5teS5tuS5t+S5uOS5ueS5uuS5u+S5vOS5veS5vuS5vwor5LqA5LqB5LqC5LqD5LqE5LqF5LqG5LqH5LqI5LqJ5LqK5LqL5LqM5LqN5LqO5LqP5LqQ5LqR5LqS5LqT5LqU5LqV5LqW5LqX5LqY5LqZ5Lqa5Lqb5Lqc5Lqd5Lqe5LqfCivkuqDkuqHkuqLkuqPkuqTkuqXkuqbkuqfkuqjkuqnkuqrkuqvkuqzkuq3kuq7kuq/kurDkurHkurLkurPkurTkurXkurbkurfkurjkurnkurrkurvkurzkur3kur7kur8KK+S7gOS7geS7guS7g+S7hOS7heS7huS7h+S7iOS7ieS7iuS7i+S7jOS7jeS7juS7j+S7kOS7keS7kuS7k+S7lOS7leS7luS7l+S7mOS7meS7muS7m+S7nOS7neS7nuS7nwor5Lug5Luh5Lui5Luj5Luk5Lul5Lum5Lun5Luo5Lup5Luq5Lur5Lus5Lut5Luu5Luv5Luw5Lux5Luy5Luz5Lu05Lu15Lu25Lu35Lu45Lu55Lu65Lu75Lu85Lu95Lu+5Lu/CivkvIDkvIHkvILkvIPkvITkvIXkvIbkvIfkvIjkvInkvIrkvIvkvIzkvI3kvI7kvI/kvJDkvJHkvJLkvJPkvJTkvJXkvJbkvJfkvJjkvJnkvJrkvJvkvJzkvJ3kvJ7kvJ8KK+S8oOS8oeS8ouS8o+S8pOS8peS8puS8p+S8qOS8qeS8quS8q+S8rOS8reS8ruS8r+S8sOS8seS8suS8s+S8tOS8teS8tuS8t+S8uOS8ueS8uuS8u+S8vOS8veS8vuS8vwor5L2A5L2B5L2C5L2D5L2E5L2F5L2G5L2H5L2I5L2J5L2K5L2L5L2M5L2N5L2O5L2P5L2Q5L2R5L2S5L2T5L2U5L2V5L2W5L2X5L2Y5L2Z5L2a5L2b5L2c5L2d5L2e5L2fCivkvaDkvaHkvaLkvaPkvaTkvaXkvabkvafkvajkvankvarkvavkvazkva3kva7kva/kvbDkvbHkvbLkvbPkvbTkvbXkvbbkvbfkvbjkvbnkvbrkvbvkvbzkvb3kvb7kvb8KK+S+gOS+geS+guS+g+S+hOS+heS+huS+h+S+iOS+ieS+iuS+i+S+jOS+jeS+juS+j+S+kOS+keS+kuS+k+S+lOS+leS+luS+l+S+mOS+meS+muS+m+S+nOS+neS+nuS+nwor5L6g5L6h5L6i5L6j5L6k5L6l5L6m5L6n5L6o5L6p5L6q5L6r5L6s5L6t5L6u5L6v5L6w5L6x5L6y5L6z5L605L615L625L635L645L655L665L675L685L695L6+5L6/Civkv4Dkv4Hkv4Lkv4Pkv4Tkv4Xkv4bkv4fkv4jkv4nkv4rkv4vkv4zkv43kv47kv4/kv5Dkv5Hkv5Lkv5Pkv5Tkv5Xkv5bkv5fkv5jkv5nkv5rkv5vkv5zkv53kv57kv58KK+S/oOS/oeS/ouS/o+S/pOS/peS/puS/p+S/qOS/qeS/quS/q+S/rOS/reS/ruS/r+S/sOS/seS/suS/s+S/tOS/teS/tuS/t+S/uOS/ueS/uuS/u+S/vOS/veS/vuS/vwor5YCA5YCB5YCC5YCD5YCE5YCF5YCG5YCH5YCI5YCJ5YCK5YCL5YCM5YCN5YCO5YCP5YCQ5YCR5YCS5YCT5YCU5YCV5YCW5YCX5YCY5YCZ5YCa5YCb5YCc5YCd5YCe5YCfCivlgKDlgKHlgKLlgKPlgKTlgKXlgKblgKflgKjlgKnlgKrlgKvlgKzlgK3lgK7lgK/lgLDlgLHlgLLlgLPlgLTlgLXlgLblgLflgLjlgLnlgLrlgLvlgLzlgL3lgL7lgL8KK+WBgOWBgeWBguWBg+WBhOWBheWBhuWBh+WBiOWBieWBiuWBi+WBjOWBjeWBjuWBj+WBkOWBkeWBkuWBk+WBlOWBleWBluWBl+WBmOWBmeWBmuWBm+WBnOWBneWBnuWBnwor5YGg5YGh5YGi5YGj5YGk5YGl5YGm5YGn5YGo5YGp5YGq5YGr5YGs5YGt5YGu5YGv5YGw5YGx5YGy5YGz5YG05YG15YG25YG35YG45YG55YG65YG75YG85YG95YG+5YG/CivlgoDlgoHlgoLlgoPlgoTlgoXlgoblgoflgojlgonlgorlgovlgozlgo3lgo7lgo/lgpDlgpHlgpLlgpPlgpTlgpXlgpblgpflgpjlgpnlgprlgpvlgpzlgp3lgp7lgp8KK+WCoOWCoeWCouWCo+WCpOWCpeWCpuWCp+WCqOWCqeWCquWCq+WCrOWCreWCruWCr+WCsOWCseWCsuWCs+WCtOWCteWCtuWCt+WCuOWCueWCuuWCu+WCvOWCveWCvuWCvwor5YOA5YOB5YOC5YOD5YOE5YOF5YOG5YOH5YOI5YOJ5YOK5YOL5YOM5YON5YOO5YOP5YOQ5YOR5YOS5YOT5YOU5YOV5YOW5YOX5YOY5YOZ5YOa5YOb5YOc5YOd5YOe5YOfCivlg6Dlg6Hlg6Llg6Plg6Tlg6Xlg6blg6flg6jlg6nlg6rlg6vlg6zlg63lg67lg6/lg7Dlg7Hlg7Llg7Plg7Tlg7Xlg7blg7flg7jlg7nlg7rlg7vlg7zlg73lg77lg78KK+WEgOWEgeWEguWEg+WEhOWEheWEhuWEh+WEiOWEieWEiuWEi+WEjOWEjeWEjuWEj+WEkOWEkeWEkuWEk+WElOWEleWEluWEl+WEmOWEmeWEmuWEm+WEnOWEneWEnuWEnwor5YSg5YSh5YSi5YSj5YSk5YSl5YSm5YSn5YSo5YSp5YSq5YSr5YSs5YSt5YSu5YSv5YSw5YSx5YSy5YSz5YS05YS15YS25YS35YS45YS55YS65YS75YS85YS95YS+5YS/CivlhYDlhYHlhYLlhYPlhYTlhYXlhYblhYflhYjlhYnlhYrlhYvlhYzlhY3lhY7lhY/lhZDlhZHlhZLlhZPlhZTlhZXlhZblhZflhZjlhZnlhZrlhZvlhZzlhZ3lhZ7lhZ8KK+WFoOWFoeWFouWFo+WFpOWFpeWFpuWFp+WFqOWFqeWFquWFq+WFrOWFreWFruWFr+WFsOWFseWFsuWFs+WFtOWFteWFtuWFt+WFuOWFueWFuuWFu+WFvOWFveWFvuWFvwor5YaA5YaB5YaC5YaD5YaE5YaF5YaG5YaH5YaI5YaJ5YaK5YaL5YaM5YaN5YaO5YaP5YaQ5YaR5YaS5YaT5YaU5YaV5YaW5YaX5YaY5YaZ5Yaa5Yab5Yac5Yad5Yae5YafCivlhqDlhqHlhqLlhqPlhqTlhqXlhqblhqflhqjlhqnlhqrlhqvlhqzlhq3lhq7lhq/lhrDlhrHlhrLlhrPlhrTlhrXlhrblhrflhrjlhrnlhrrlhrvlhrzlhr3lhr7lhr8KK+WHgOWHgeWHguWHg+WHhOWHheWHhuWHh+WHiOWHieWHiuWHi+WHjOWHjeWHjuWHj+WHkOWHkeWHkuWHk+WHlOWHleWHluWHl+WHmOWHmeWHmuWHm+WHnOWHneWHnuWHnwor5Yeg5Yeh5Yei5Yej5Yek5Yel5Yem5Yen5Yeo5Yep5Yeq5Yer5Yes5Yet5Yeu5Yev5Yew5Yex5Yey5Yez5Ye05Ye15Ye25Ye35Ye45Ye55Ye65Ye75Ye85Ye95Ye+5Ye/CivliIDliIHliILliIPliITliIXliIbliIfliIjliInliIrliIvliIzliI3liI7liI/liJDliJHliJLliJPliJTliJXliJbliJfliJjliJnliJrliJvliJzliJ3liJ7liJ8KK+WIoOWIoeWIouWIo+WIpOWIpeWIpuWIp+WIqOWIqeWIquWIq+WIrOWIreWIruWIr+WIsOWIseWIsuWIs+WItOWIteWItuWIt+WIuOWIueWIuuWIu+WIvOWIveWIvuWIvwor5YmA5YmB5YmC5YmD5YmE5YmF5YmG5YmH5YmI5YmJ5YmK5YmL5YmM5YmN5YmO5YmP5YmQ5YmR5YmS5YmT5YmU5YmV5YmW5YmX5YmY5YmZ5Yma5Ymb5Ymc5Ymd5Yme5YmfCivliaDliaHliaLliaPliaTliaXliabliafliajlianliarliavliazlia3lia7lia/libDlibHlibLlibPlibTlibXlibblibflibjlibnlibrlibvlibzlib3lib7lib8KK+WKgOWKgeWKguWKg+WKhOWKheWKhuWKh+WKiOWKieWKiuWKi+WKjOWKjeWKjuWKj+WKkOWKkeWKkuWKk+WKlOWKleWKluWKl+WKmOWKmeWKmuWKm+WKnOWKneWKnuWKnwor5Yqg5Yqh5Yqi5Yqj5Yqk5Yql5Yqm5Yqn5Yqo5Yqp5Yqq5Yqr5Yqs5Yqt5Yqu5Yqv5Yqw5Yqx5Yqy5Yqz5Yq05Yq15Yq25Yq35Yq45Yq55Yq65Yq75Yq85Yq95Yq+5Yq/Civli4Dli4Hli4Lli4Pli4Tli4Xli4bli4fli4jli4nli4rli4vli4zli43li47li4/li5Dli5Hli5Lli5Pli5Tli5Xli5bli5fli5jli5nli5rli5vli5zli53li57li58KK+WLoOWLoeWLouWLo+WLpOWLpeWLpuWLp+WLqOWLqeWLquWLq+WLrOWLreWLruWLr+WLsOWLseWLsuWLs+WLtOWLteWLtuWLt+WLuOWLueWLuuWLu+WLvOWLveWLvuWLvwor5YyA5YyB5YyC5YyD5YyE5YyF5YyG5YyH5YyI5YyJ5YyK5YyL5YyM5YyN5YyO5YyP5YyQ5YyR5YyS5YyT5YyU5YyV5YyW5YyX5YyY5YyZ5Yya5Yyb5Yyc5Yyd5Yye5YyfCivljKDljKHljKLljKPljKTljKXljKbljKfljKjljKnljKrljKvljKzljK3ljK7ljK/ljLDljLHljLLljLPljLTljLXljLbljLfljLjljLnljLrljLvljLzljL3ljL7ljL8KK+WNgOWNgeWNguWNg+WNhOWNheWNhuWNh+WNiOWNieWNiuWNi+WNjOWNjeWNjuWNj+WNkOWNkeWNkuWNk+WNlOWNleWNluWNl+WNmOWNmeWNmuWNm+WNnOWNneWNnuWNnwor5Y2g5Y2h5Y2i5Y2j5Y2k5Y2l5Y2m5Y2n5Y2o5Y2p5Y2q5Y2r5Y2s5Y2t5Y2u5Y2v5Y2w5Y2x5Y2y5Y2z5Y205Y215Y225Y235Y245Y255Y265Y275Y285Y295Y2+5Y2/CivljoDljoHljoLljoPljoTljoXljobljofljojljonljorljovljozljo3ljo7ljo/ljpDljpHljpLljpPljpTljpXljpbljpfljpjljpnljprljpvljpzljp3ljp7ljp8KK+WOoOWOoeWOouWOo+WOpOWOpeWOpuWOp+WOqOWOqeWOquWOq+WOrOWOreWOruWOr+WOsOWOseWOsuWOs+WOtOWOteWOtuWOt+WOuOWOueWOuuWOu+WOvOWOveWOvuWOvwor5Y+A5Y+B5Y+C5Y+D5Y+E5Y+F5Y+G5Y+H5Y+I5Y+J5Y+K5Y+L5Y+M5Y+N5Y+O5Y+P5Y+Q5Y+R5Y+S5Y+T5Y+U5Y+V5Y+W5Y+X5Y+Y5Y+Z5Y+a5Y+b5Y+c5Y+d5Y+e5Y+fCivlj6Dlj6Hlj6Llj6Plj6Tlj6Xlj6blj6flj6jlj6nlj6rlj6vlj6zlj63lj67lj6/lj7Dlj7Hlj7Llj7Plj7Tlj7Xlj7blj7flj7jlj7nlj7rlj7vlj7zlj73lj77lj78KK+WQgOWQgeWQguWQg+WQhOWQheWQhuWQh+WQiOWQieWQiuWQi+WQjOWQjeWQjuWQj+WQkOWQkeWQkuWQk+WQlOWQleWQluWQl+WQmOWQmeWQmuWQm+WQnOWQneWQnuWQnwor5ZCg5ZCh5ZCi5ZCj5ZCk5ZCl5ZCm5ZCn5ZCo5ZCp5ZCq5ZCr5ZCs5ZCt5ZCu5ZCv5ZCw5ZCx5ZCy5ZCz5ZC05ZC15ZC25ZC35ZC45ZC55ZC65ZC75ZC85ZC95ZC+5ZC/CivlkYDlkYHlkYLlkYPlkYTlkYXlkYblkYflkYjlkYnlkYrlkYvlkYzlkY3lkY7lkY/lkZDlkZHlkZLlkZPlkZTlkZXlkZblkZflkZjlkZnlkZrlkZvlkZzlkZ3lkZ7lkZ8KK+WRoOWRoeWRouWRo+WRpOWRpeWRpuWRp+WRqOWRqeWRquWRq+WRrOWRreWRruWRr+WRsOWRseWRsuWRs+WRtOWRteWRtuWRt+WRuOWRueWRuuWRu+WRvOWRveWRvuWRvwor5ZKA5ZKB5ZKC5ZKD5ZKE5ZKF5ZKG5ZKH5ZKI5ZKJ5ZKK5ZKL5ZKM5ZKN5ZKO5ZKP5ZKQ5ZKR5ZKS5ZKT5ZKU5ZKV5ZKW5ZKX5ZKY5ZKZ5ZKa5ZKb5ZKc5ZKd5ZKe5ZKfCivlkqDlkqHlkqLlkqPlkqTlkqXlkqblkqflkqjlkqnlkqrlkqvlkqzlkq3lkq7lkq/lkrDlkrHlkrLlkrPlkrTlkrXlkrblkrflkrjlkrnlkrrlkrvlkrzlkr3lkr7lkr8KK+WTgOWTgeWTguWTg+WThOWTheWThuWTh+WTiOWTieWTiuWTi+WTjOWTjeWTjuWTj+WTkOWTkeWTkuWTk+WTlOWTleWTluWTl+WTmOWTmeWTmuWTm+WTnOWTneWTnuWTnwor5ZOg5ZOh5ZOi5ZOj5ZOk5ZOl5ZOm5ZOn5ZOo5ZOp5ZOq5ZOr5ZOs5ZOt5ZOu5ZOv5ZOw5ZOx5ZOy5ZOz5ZO05ZO15ZO25ZO35ZO45ZO55ZO65ZO75ZO85ZO95ZO+5ZO/CivllIDllIHllILllIPllITllIXllIbllIfllIjllInllIrllIvllIzllI3llI7llI/llJDllJHllJLllJPllJTllJXllJbllJfllJjllJnllJrllJvllJzllJ3llJ7llJ8KK+WUoOWUoeWUouWUo+WUpOWUpeWUpuWUp+WUqOWUqeWUquWUq+WUrOWUreWUruWUr+WUsOWUseWUsuWUs+WUtOWUteWUtuWUt+WUuOWUueWUuuWUu+WUvOWUveWUvuWUvwor5ZWA5ZWB5ZWC5ZWD5ZWE5ZWF5ZWG5ZWH5ZWI5ZWJ5ZWK5ZWL5ZWM5ZWN5ZWO5ZWP5ZWQ5ZWR5ZWS5ZWT5ZWU5ZWV5ZWW5ZWX5ZWY5ZWZ5ZWa5ZWb5ZWc5ZWd5ZWe5ZWfCivllaDllaHllaLllaPllaTllaXllabllafllajllanllarllavllazlla3lla7lla/llbDllbHllbLllbPllbTllbXllbbllbfllbjllbnllbrllbvllbzllb3llb7llb8KK+WWgOWWgeWWguWWg+WWhOWWheWWhuWWh+WWiOWWieWWiuWWi+WWjOWWjeWWjuWWj+WWkOWWkeWWkuWWk+WWlOWWleWWluWWl+WWmOWWmeWWmuWWm+WWnOWWneWWnuWWnwor5Zag5Zah5Zai5Zaj5Zak5Zal5Zam5Zan5Zao5Zap5Zaq5Zar5Zas5Zat5Zau5Zav5Zaw5Zax5Zay5Zaz5Za05Za15Za25Za35Za45Za55Za65Za75Za85Za95Za+5Za/Civll4Dll4Hll4Lll4Pll4Tll4Xll4bll4fll4jll4nll4rll4vll4zll43ll47ll4/ll5Dll5Hll5Lll5Pll5Tll5Xll5bll5fll5jll5nll5rll5vll5zll53ll57ll58KK+WXoOWXoeWXouWXo+WXpOWXpeWXpuWXp+WXqOWXqeWXquWXq+WXrOWXreWXruWXr+WXsOWXseWXsuWXs+WXtOWXteWXtuWXt+WXuOWXueWXuuWXu+WXvOWXveWXvuWXvwor5ZiA5ZiB5ZiC5ZiD5ZiE5ZiF5ZiG5ZiH5ZiI5ZiJ5ZiK5ZiL5ZiM5ZiN5ZiO5ZiP5ZiQ5ZiR5ZiS5ZiT5ZiU5ZiV5ZiW5ZiX5ZiY5ZiZ5Zia5Zib5Zic5Zid5Zie5ZifCivlmKDlmKHlmKLlmKPlmKTlmKXlmKblmKflmKjlmKnlmKrlmKvlmKzlmK3lmK7lmK/lmLDlmLHlmLLlmLPlmLTlmLXlmLblmLflmLjlmLnlmLrlmLvlmLzlmL3lmL7lmL8KK+WZgOWZgeWZguWZg+WZhOWZheWZhuWZh+WZiOWZieWZiuWZi+WZjOWZjeWZjuWZj+WZkOWZkeWZkuWZk+WZlOWZleWZluWZl+WZmOWZmeWZmuWZm+WZnOWZneWZnuWZnwor5Zmg5Zmh5Zmi5Zmj5Zmk5Zml5Zmm5Zmn5Zmo5Zmp5Zmq5Zmr5Zms5Zmt5Zmu5Zmv5Zmw5Zmx5Zmy5Zmz5Zm05Zm15Zm25Zm35Zm45Zm55Zm65Zm75Zm85Zm95Zm+5Zm/CivlmoDlmoHlmoLlmoPlmoTlmoXlmoblmoflmojlmonlmorlmovlmozlmo3lmo7lmo/lmpDlmpHlmpLlmpPlmpTlmpXlmpblmpflmpjlmpnlmprlmpvlmpzlmp3lmp7lmp8KK+WaoOWaoeWaouWao+WapOWapeWapuWap+WaqOWaqeWaquWaq+WarOWareWaruWar+WasOWaseWasuWas+WatOWateWatuWat+WauOWaueWauuWau+WavOWaveWavuWavwor5ZuA5ZuB5ZuC5ZuD5ZuE5ZuF5ZuG5ZuH5ZuI5ZuJ5ZuK5ZuL5ZuM5ZuN5ZuO5ZuP5ZuQ5ZuR5ZuS5ZuT5ZuU5ZuV5ZuW5ZuX5ZuY5ZuZ5Zua5Zub5Zuc5Zud5Zue5ZufCivlm6Dlm6Hlm6Llm6Plm6Tlm6Xlm6blm6flm6jlm6nlm6rlm6vlm6zlm63lm67lm6/lm7Dlm7Hlm7Llm7Plm7Tlm7Xlm7blm7flm7jlm7nlm7rlm7vlm7zlm73lm77lm78KK+WcgOWcgeWcguWcg+WchOWcheWchuWch+WciOWcieWciuWci+WcjOWcjeWcjuWcj+WckOWckeWckuWck+WclOWcleWcluWcl+WcmOWcmeWcmuWcm+WcnOWcneWcnuWcnwor5Zyg5Zyh5Zyi5Zyj5Zyk5Zyl5Zym5Zyn5Zyo5Zyp5Zyq5Zyr5Zys5Zyt5Zyu5Zyv5Zyw5Zyx5Zyy5Zyz5Zy05Zy15Zy25Zy35Zy45Zy55Zy65Zy75Zy85Zy95Zy+5Zy/CivlnYDlnYHlnYLlnYPlnYTlnYXlnYblnYflnYjlnYnlnYrlnYvlnYzlnY3lnY7lnY/lnZDlnZHlnZLlnZPlnZTlnZXlnZblnZflnZjlnZnlnZrlnZvlnZzlnZ3lnZ7lnZ8KK+WdoOWdoeWdouWdo+WdpOWdpeWdpuWdp+WdqOWdqeWdquWdq+WdrOWdreWdruWdr+WdsOWdseWdsuWds+WdtOWdteWdtuWdt+WduOWdueWduuWdu+WdvOWdveWdvuWdvwor5Z6A5Z6B5Z6C5Z6D5Z6E5Z6F5Z6G5Z6H5Z6I5Z6J5Z6K5Z6L5Z6M5Z6N5Z6O5Z6P5Z6Q5Z6R5Z6S5Z6T5Z6U5Z6V5Z6W5Z6X5Z6Y5Z6Z5Z6a5Z6b5Z6c5Z6d5Z6e5Z6fCivlnqDlnqHlnqLlnqPlnqTlnqXlnqblnqflnqjlnqnlnqrlnqvlnqzlnq3lnq7lnq/lnrDlnrHlnrLlnrPlnrTlnrXlnrblnrflnrjlnrnlnrrlnrvlnrzlnr3lnr7lnr8KK+WfgOWfgeWfguWfg+WfhOWfheWfhuWfh+WfiOWfieWfiuWfi+WfjOWfjeWfjuWfj+WfkOWfkeWfkuWfk+WflOWfleWfluWfl+WfmOWfmeWfmuWfm+WfnOWfneWfnuWfnwor5Z+g5Z+h5Z+i5Z+j5Z+k5Z+l5Z+m5Z+n5Z+o5Z+p5Z+q5Z+r5Z+s5Z+t5Z+u5Z+v5Z+w5Z+x5Z+y5Z+z5Z+05Z+15Z+25Z+35Z+45Z+55Z+65Z+75Z+85Z+95Z++5Z+/CivloIDloIHloILloIPloITloIXloIbloIfloIjloInloIrloIvloIzloI3loI7loI/loJDloJHloJLloJPloJTloJXloJbloJfloJjloJnloJrloJvloJzloJ3loJ7loJ8KK+WgoOWgoeWgouWgo+WgpOWgpeWgpuWgp+WgqOWgqeWgquWgq+WgrOWgreWgruWgr+WgsOWgseWgsuWgs+WgtOWgteWgtuWgt+WguOWgueWguuWgu+WgvOWgveWgvuWgvwor5aGA5aGB5aGC5aGD5aGE5aGF5aGG5aGH5aGI5aGJ5aGK5aGL5aGM5aGN5aGO5aGP5aGQ5aGR5aGS5aGT5aGU5aGV5aGW5aGX5aGY5aGZ5aGa5aGb5aGc5aGd5aGe5aGfCivloaDloaHloaLloaPloaTloaXloabloafloajloanloarloavloazloa3loa7loa/lobDlobHlobLlobPlobTlobXlobblobflobjlobnlobrlobvlobzlob3lob7lob8KK+WigOWigeWiguWig+WihOWiheWihuWih+WiiOWiieWiiuWii+WijOWijeWijuWij+WikOWikeWikuWik+WilOWileWiluWil+WimOWimeWimuWim+WinOWineWinuWinwor5aKg5aKh5aKi5aKj5aKk5aKl5aKm5aKn5aKo5aKp5aKq5aKr5aKs5aKt5aKu5aKv5aKw5aKx5aKy5aKz5aK05aK15aK25aK35aK45aK55aK65aK75aK85aK95aK+5aK/Civlo4Dlo4Hlo4Llo4Plo4Tlo4Xlo4blo4flo4jlo4nlo4rlo4vlo4zlo43lo47lo4/lo5Dlo5Hlo5Llo5Plo5Tlo5Xlo5blo5flo5jlo5nlo5rlo5vlo5zlo53lo57lo58KK+WjoOWjoeWjouWjo+WjpOWjpeWjpuWjp+WjqOWjqeWjquWjq+WjrOWjreWjruWjr+WjsOWjseWjsuWjs+WjtOWjteWjtuWjt+WjuOWjueWjuuWju+WjvOWjveWjvuWjvwor5aSA5aSB5aSC5aSD5aSE5aSF5aSG5aSH5aSI5aSJ5aSK5aSL5aSM5aSN5aSO5aSP5aSQ5aSR5aSS5aST5aSU5aSV5aSW5aSX5aSY5aSZ5aSa5aSb5aSc5aSd5aSe5aSfCivlpKDlpKHlpKLlpKPlpKTlpKXlpKblpKflpKjlpKnlpKrlpKvlpKzlpK3lpK7lpK/lpLDlpLHlpLLlpLPlpLTlpLXlpLblpLflpLjlpLnlpLrlpLvlpLzlpL3lpL7lpL8KK+WlgOWlgeWlguWlg+WlhOWlheWlhuWlh+WliOWlieWliuWli+WljOWljeWljuWlj+WlkOWlkeWlkuWlk+WllOWlleWlluWll+WlmOWlmeWlmuWlm+WlnOWlneWlnuWlnwor5aWg5aWh5aWi5aWj5aWk5aWl5aWm5aWn5aWo5aWp5aWq5aWr5aWs5aWt5aWu5aWv5aWw5aWx5aWy5aWz5aW05aW15aW25aW35aW45aW55aW65aW75aW85aW95aW+5aW/CivlpoDlpoHlpoLlpoPlpoTlpoXlpoblpoflpojlponlporlpovlpozlpo3lpo7lpo/lppDlppHlppLlppPlppTlppXlppblppflppjlppnlpprlppvlppzlpp3lpp7lpp8KK+WmoOWmoeWmouWmo+WmpOWmpeWmpuWmp+WmqOWmqeWmquWmq+WmrOWmreWmruWmr+WmsOWmseWmsuWms+WmtOWmteWmtuWmt+WmuOWmueWmuuWmu+WmvOWmveWmvuWmvwor5aeA5aeB5aeC5aeD5aeE5aeF5aeG5aeH5aeI5aeJ5aeK5aeL5aeM5aeN5aeO5aeP5aeQ5aeR5aeS5aeT5aeU5aeV5aeW5aeX5aeY5aeZ5aea5aeb5aec5aed5aee5aefCivlp6Dlp6Hlp6Llp6Plp6Tlp6Xlp6blp6flp6jlp6nlp6rlp6vlp6zlp63lp67lp6/lp7Dlp7Hlp7Llp7Plp7Tlp7Xlp7blp7flp7jlp7nlp7rlp7vlp7zlp73lp77lp78KK+WogOWogeWoguWog+WohOWoheWohuWoh+WoiOWoieWoiuWoi+WojOWojeWojuWoj+WokOWokeWokuWok+WolOWoleWoluWol+WomOWomeWomuWom+WonOWoneWonuWonwor5aig5aih5aii5aij5aik5ail5aim5ain5aio5aip5aiq5air5ais5ait5aiu5aiv5aiw5aix5aiy5aiz5ai05ai15ai25ai35ai45ai55ai65ai75ai85ai95ai+5ai/CivlqYDlqYHlqYLlqYPlqYTlqYXlqYblqYflqYjlqYnlqYrlqYvlqYzlqY3lqY7lqY/lqZDlqZHlqZLlqZPlqZTlqZXlqZblqZflqZjlqZnlqZrlqZvlqZzlqZ3lqZ7lqZ8KK+WpoOWpoeWpouWpo+WppOWppeWppuWpp+WpqOWpqeWpquWpq+WprOWpreWpruWpr+WpsOWpseWpsuWps+WptOWpteWptuWpt+WpuOWpueWpuuWpu+WpvOWpveWpvuWpvwor5aqA5aqB5aqC5aqD5aqE5aqF5aqG5aqH5aqI5aqJ5aqK5aqL5aqM5aqN5aqO5aqP5aqQ5aqR5aqS5aqT5aqU5aqV5aqW5aqX5aqY5aqZ5aqa5aqb5aqc5aqd5aqe5aqfCivlqqDlqqHlqqLlqqPlqqTlqqXlqqblqqflqqjlqqnlqqrlqqvlqqzlqq3lqq7lqq/lqrDlqrHlqrLlqrPlqrTlqrXlqrblqrflqrjlqrnlqrrlqrvlqrzlqr3lqr7lqr8KK+WrgOWrgeWrguWrg+WrhOWrheWrhuWrh+WriOWrieWriuWri+WrjOWrjeWrjuWrj+WrkOWrkeWrkuWrk+WrlOWrleWrluWrl+WrmOWrmeWrmuWrm+WrnOWrneWrnuWrnwor5aug5auh5aui5auj5auk5aul5aum5aun5auo5aup5auq5aur5aus5aut5auu5auv5auw5aux5auy5auz5au05au15au25au35au45au55au65au75au85au95au+5au/CivlrIDlrIHlrILlrIPlrITlrIXlrIblrIflrIjlrInlrIrlrIvlrIzlrI3lrI7lrI/lrJDlrJHlrJLlrJPlrJTlrJXlrJblrJflrJjlrJnlrJrlrJvlrJzlrJ3lrJ7lrJ8KK+WsoOWsoeWsouWso+WspOWspeWspuWsp+WsqOWsqeWsquWsq+WsrOWsreWsruWsr+WssOWsseWssuWss+WstOWsteWstuWst+WsuOWsueWsuuWsu+WsvOWsveWsvuWsvwor5a2A5a2B5a2C5a2D5a2E5a2F5a2G5a2H5a2I5a2J5a2K5a2L5a2M5a2N5a2O5a2P5a2Q5a2R5a2S5a2T5a2U5a2V5a2W5a2X5a2Y5a2Z5a2a5a2b5a2c5a2d5a2e5a2fCivlraDlraHlraLlraPlraTlraXlrablraflrajlranlrarlravlrazlra3lra7lra/lrbDlrbHlrbLlrbPlrbTlrbXlrbblrbflrbjlrbnlrbrlrbvlrbzlrb3lrb7lrb8KK+WugOWugeWuguWug+WuhOWuheWuhuWuh+WuiOWuieWuiuWui+WujOWujeWujuWuj+WukOWukeWukuWuk+WulOWuleWuluWul+WumOWumeWumuWum+WunOWuneWunuWunwor5a6g5a6h5a6i5a6j5a6k5a6l5a6m5a6n5a6o5a6p5a6q5a6r5a6s5a6t5a6u5a6v5a6w5a6x5a6y5a6z5a605a615a625a635a645a655a665a675a685a695a6+5a6/Civlr4Dlr4Hlr4Llr4Plr4Tlr4Xlr4blr4flr4jlr4nlr4rlr4vlr4zlr43lr47lr4/lr5Dlr5Hlr5Llr5Plr5Tlr5Xlr5blr5flr5jlr5nlr5rlr5vlr5zlr53lr57lr58KK+WvoOWvoeWvouWvo+WvpOWvpeWvpuWvp+WvqOWvqeWvquWvq+WvrOWvreWvruWvr+WvsOWvseWvsuWvs+WvtOWvteWvtuWvt+WvuOWvueWvuuWvu+WvvOWvveWvvuWvvwor5bCA5bCB5bCC5bCD5bCE5bCF5bCG5bCH5bCI5bCJ5bCK5bCL5bCM5bCN5bCO5bCP5bCQ5bCR5bCS5bCT5bCU5bCV5bCW5bCX5bCY5bCZ5bCa5bCb5bCc5bCd5bCe5bCfCivlsKDlsKHlsKLlsKPlsKTlsKXlsKblsKflsKjlsKnlsKrlsKvlsKzlsK3lsK7lsK/lsLDlsLHlsLLlsLPlsLTlsLXlsLblsLflsLjlsLnlsLrlsLvlsLzlsL3lsL7lsL8KK+WxgOWxgeWxguWxg+WxhOWxheWxhuWxh+WxiOWxieWxiuWxi+WxjOWxjeWxjuWxj+WxkOWxkeWxkuWxk+WxlOWxleWxluWxl+WxmOWxmeWxmuWxm+WxnOWxneWxnuWxnwor5bGg5bGh5bGi5bGj5bGk5bGl5bGm5bGn5bGo5bGp5bGq5bGr5bGs5bGt5bGu5bGv5bGw5bGx5bGy5bGz5bG05bG15bG25bG35bG45bG55bG65bG75bG85bG95bG+5bG/CivlsoDlsoHlsoLlsoPlsoTlsoXlsoblsoflsojlsonlsorlsovlsozlso3lso7lso/lspDlspHlspLlspPlspTlspXlspblspflspjlspnlsprlspvlspzlsp3lsp7lsp8KK+WyoOWyoeWyouWyo+WypOWypeWypuWyp+WyqOWyqeWyquWyq+WyrOWyreWyruWyr+WysOWyseWysuWys+WytOWyteWytuWyt+WyuOWyueWyuuWyu+WyvOWyveWyvuWyvwor5bOA5bOB5bOC5bOD5bOE5bOF5bOG5bOH5bOI5bOJ5bOK5bOL5bOM5bON5bOO5bOP5bOQ5bOR5bOS5bOT5bOU5bOV5bOW5bOX5bOY5bOZ5bOa5bOb5bOc5bOd5bOe5bOfCivls6Dls6Hls6Lls6Pls6Tls6Xls6bls6fls6jls6nls6rls6vls6zls63ls67ls6/ls7Dls7Hls7Lls7Pls7Tls7Xls7bls7fls7jls7nls7rls7vls7zls73ls77ls78KK+W0gOW0geW0guW0g+W0hOW0heW0huW0h+W0iOW0ieW0iuW0i+W0jOW0jeW0juW0j+W0kOW0keW0kuW0k+W0lOW0leW0luW0l+W0mOW0meW0muW0m+W0nOW0neW0nuW0nwor5bSg5bSh5bSi5bSj5bSk5bSl5bSm5bSn5bSo5bSp5bSq5bSr5bSs5bSt5bSu5bSv5bSw5bSx5bSy5bSz5bS05bS15bS25bS35bS45bS55bS65bS75bS85bS95bS+5bS/CivltYDltYHltYLltYPltYTltYXltYbltYfltYjltYnltYrltYvltYzltY3ltY7ltY/ltZDltZHltZLltZPltZTltZXltZbltZfltZjltZnltZrltZvltZzltZ3ltZ7ltZ8KK+W1oOW1oeW1ouW1o+W1pOW1peW1puW1p+W1qOW1qeW1quW1q+W1rOW1reW1ruW1r+W1sOW1seW1suW1s+W1tOW1teW1tuW1t+W1uOW1ueW1uuW1u+W1vOW1veW1vuW1vwor5baA5baB5baC5baD5baE5baF5baG5baH5baI5baJ5baK5baL5baM5baN5baO5baP5baQ5baR5baS5baT5baU5baV5baW5baX5baY5baZ5baa5bab5bac5bad5bae5bafCivltqDltqHltqLltqPltqTltqXltqbltqfltqjltqnltqrltqvltqzltq3ltq7ltq/ltrDltrHltrLltrPltrTltrXltrbltrfltrjltrnltrrltrvltrzltr3ltr7ltr8KK+W3gOW3geW3guW3g+W3hOW3heW3huW3h+W3iOW3ieW3iuW3i+W3jOW3jeW3juW3j+W3kOW3keW3kuW3k+W3lOW3leW3luW3l+W3mOW3meW3muW3m+W3nOW3neW3nuW3nwor5beg5beh5bei5bej5bek5bel5bem5ben5beo5bep5beq5ber5bes5bet5beu5bev5bew5bex5bey5bez5be05be15be25be35be45be55be65be75be85be95be+5be/CivluIDluIHluILluIPluITluIXluIbluIfluIjluInluIrluIvluIzluI3luI7luI/luJDluJHluJLluJPluJTluJXluJbluJfluJjluJnluJrluJvluJzluJ3luJ7luJ8KK+W4oOW4oeW4ouW4o+W4pOW4peW4puW4p+W4qOW4qeW4quW4q+W4rOW4reW4ruW4r+W4sOW4seW4suW4s+W4tOW4teW4tuW4t+W4uOW4ueW4uuW4u+W4vOW4veW4vuW4vwor5bmA5bmB5bmC5bmD5bmE5bmF5bmG5bmH5bmI5bmJ5bmK5bmL5bmM5bmN5bmO5bmP5bmQ5bmR5bmS5bmT5bmU5bmV5bmW5bmX5bmY5bmZ5bma5bmb5bmc5bmd5bme5bmfCivluaDluaHluaLluaPluaTluaXluabluafluajluanluarluavluazlua3lua7lua/lubDlubHlubLlubPlubTlubXlubblubflubjlubnlubrlubvlubzlub3lub7lub8KK+W6gOW6geW6guW6g+W6hOW6heW6huW6h+W6iOW6ieW6iuW6i+W6jOW6jeW6juW6j+W6kOW6keW6kuW6k+W6lOW6leW6luW6l+W6mOW6meW6muW6m+W6nOW6neW6nuW6nwor5bqg5bqh5bqi5bqj5bqk5bql5bqm5bqn5bqo5bqp5bqq5bqr5bqs5bqt5bqu5bqv5bqw5bqx5bqy5bqz5bq05bq15bq25bq35bq45bq55bq65bq75bq85bq95bq+5bq/Civlu4Dlu4Hlu4Llu4Plu4Tlu4Xlu4blu4flu4jlu4nlu4rlu4vlu4zlu43lu47lu4/lu5Dlu5Hlu5Llu5Plu5Tlu5Xlu5blu5flu5jlu5nlu5rlu5vlu5zlu53lu57lu58KK+W7oOW7oeW7ouW7o+W7pOW7peW7puW7p+W7qOW7qeW7quW7q+W7rOW7reW7ruW7r+W7sOW7seW7suW7s+W7tOW7teW7tuW7t+W7uOW7ueW7uuW7u+W7vOW7veW7vuW7vwor5byA5byB5byC5byD5byE5byF5byG5byH5byI5byJ5byK5byL5byM5byN5byO5byP5byQ5byR5byS5byT5byU5byV5byW5byX5byY5byZ5bya5byb5byc5byd5bye5byfCivlvKDlvKHlvKLlvKPlvKTlvKXlvKblvKflvKjlvKnlvKrlvKvlvKzlvK3lvK7lvK/lvLDlvLHlvLLlvLPlvLTlvLXlvLblvLflvLjlvLnlvLrlvLvlvLzlvL3lvL7lvL8KK+W9gOW9geW9guW9g+W9hOW9heW9huW9h+W9iOW9ieW9iuW9i+W9jOW9jeW9juW9j+W9kOW9keW9kuW9k+W9lOW9leW9luW9l+W9mOW9meW9muW9m+W9nOW9neW9nuW9nwor5b2g5b2h5b2i5b2j5b2k5b2l5b2m5b2n5b2o5b2p5b2q5b2r5b2s5b2t5b2u5b2v5b2w5b2x5b2y5b2z5b205b215b225b235b245b255b265b275b285b295b2+5b2/CivlvoDlvoHlvoLlvoPlvoTlvoXlvoblvoflvojlvonlvorlvovlvozlvo3lvo7lvo/lvpDlvpHlvpLlvpPlvpTlvpXlvpblvpflvpjlvpnlvprlvpvlvpzlvp3lvp7lvp8KK+W+oOW+oeW+ouW+o+W+pOW+peW+puW+p+W+qOW+qeW+quW+q+W+rOW+reW+ruW+r+W+sOW+seW+suW+s+W+tOW+teW+tuW+t+W+uOW+ueW+uuW+u+W+vOW+veW+vuW+vwor5b+A5b+B5b+C5b+D5b+E5b+F5b+G5b+H5b+I5b+J5b+K5b+L5b+M5b+N5b+O5b+P5b+Q5b+R5b+S5b+T5b+U5b+V5b+W5b+X5b+Y5b+Z5b+a5b+b5b+c5b+d5b+e5b+fCivlv6Dlv6Hlv6Llv6Plv6Tlv6Xlv6blv6flv6jlv6nlv6rlv6vlv6zlv63lv67lv6/lv7Dlv7Hlv7Llv7Plv7Tlv7Xlv7blv7flv7jlv7nlv7rlv7vlv7zlv73lv77lv78KK+aAgOaAgeaAguaAg+aAhOaAheaAhuaAh+aAiOaAieaAiuaAi+aAjOaAjeaAjuaAj+aAkOaAkeaAkuaAk+aAlOaAleaAluaAl+aAmOaAmeaAmuaAm+aAnOaAneaAnuaAnwor5oCg5oCh5oCi5oCj5oCk5oCl5oCm5oCn5oCo5oCp5oCq5oCr5oCs5oCt5oCu5oCv5oCw5oCx5oCy5oCz5oC05oC15oC25oC35oC45oC55oC65oC75oC85oC95oC+5oC/CivmgYDmgYHmgYLmgYPmgYTmgYXmgYbmgYfmgYjmgYnmgYrmgYvmgYzmgY3mgY7mgY/mgZDmgZHmgZLmgZPmgZTmgZXmgZbmgZfmgZjmgZnmgZrmgZvmgZzmgZ3mgZ7mgZ8KK+aBoOaBoeaBouaBo+aBpOaBpeaBpuaBp+aBqOaBqeaBquaBq+aBrOaBreaBruaBr+aBsOaBseaBsuaBs+aBtOaBteaBtuaBt+aBuOaBueaBuuaBu+aBvOaBveaBvuaBvwor5oKA5oKB5oKC5oKD5oKE5oKF5oKG5oKH5oKI5oKJ5oKK5oKL5oKM5oKN5oKO5oKP5oKQ5oKR5oKS5oKT5oKU5oKV5oKW5oKX5oKY5oKZ5oKa5oKb5oKc5oKd5oKe5oKfCivmgqDmgqHmgqLmgqPmgqTmgqXmgqbmgqfmgqjmgqnmgqrmgqvmgqzmgq3mgq7mgq/mgrDmgrHmgrLmgrPmgrTmgrXmgrbmgrfmgrjmgrnmgrrmgrvmgrzmgr3mgr7mgr8KK+aDgOaDgeaDguaDg+aDhOaDheaDhuaDh+aDiOaDieaDiuaDi+aDjOaDjeaDjuaDj+aDkOaDkeaDkuaDk+aDlOaDleaDluaDl+aDmOaDmeaDmuaDm+aDnOaDneaDnuaDnwor5oOg5oOh5oOi5oOj5oOk5oOl5oOm5oOn5oOo5oOp5oOq5oOr5oOs5oOt5oOu5oOv5oOw5oOx5oOy5oOz5oO05oO15oO25oO35oO45oO55oO65oO75oO85oO95oO+5oO/CivmhIDmhIHmhILmhIPmhITmhIXmhIbmhIfmhIjmhInmhIrmhIvmhIzmhI3mhI7mhI/mhJDmhJHmhJLmhJPmhJTmhJXmhJbmhJfmhJjmhJnmhJrmhJvmhJzmhJ3mhJ7mhJ8KK+aEoOaEoeaEouaEo+aEpOaEpeaEpuaEp+aEqOaEqeaEquaEq+aErOaEreaEruaEr+aEsOaEseaEsuaEs+aEtOaEteaEtuaEt+aEuOaEueaEuuaEu+aEvOaEveaEvuaEvwor5oWA5oWB5oWC5oWD5oWE5oWF5oWG5oWH5oWI5oWJ5oWK5oWL5oWM5oWN5oWO5oWP5oWQ5oWR5oWS5oWT5oWU5oWV5oWW5oWX5oWY5oWZ5oWa5oWb5oWc5oWd5oWe5oWfCivmhaDmhaHmhaLmhaPmhaTmhaXmhabmhafmhajmhanmharmhavmhazmha3mha7mha/mhbDmhbHmhbLmhbPmhbTmhbXmhbbmhbfmhbjmhbnmhbrmhbvmhbzmhb3mhb7mhb8KK+aGgOaGgeaGguaGg+aGhOaGheaGhuaGh+aGiOaGieaGiuaGi+aGjOaGjeaGjuaGj+aGkOaGkeaGkuaGk+aGlOaGleaGluaGl+aGmOaGmeaGmuaGm+aGnOaGneaGnuaGnwor5oag5oah5oai5oaj5oak5oal5oam5oan5oao5oap5oaq5oar5oas5oat5oau5oav5oaw5oax5oay5oaz5oa05oa15oa25oa35oa45oa55oa65oa75oa85oa95oa+5oa/Civmh4Dmh4Hmh4Lmh4Pmh4Tmh4Xmh4bmh4fmh4jmh4nmh4rmh4vmh4zmh43mh47mh4/mh5Dmh5Hmh5Lmh5Pmh5Tmh5Xmh5bmh5fmh5jmh5nmh5rmh5vmh5zmh53mh57mh58KK+aHoOaHoeaHouaHo+aHpOaHpeaHpuaHp+aHqOaHqeaHquaHq+aHrOaHreaHruaHr+aHsOaHseaHsuaHs+aHtOaHteaHtuaHt+aHuOaHueaHuuaHu+aHvOaHveaHvuaHvwor5oiA5oiB5oiC5oiD5oiE5oiF5oiG5oiH5oiI5oiJ5oiK5oiL5oiM5oiN5oiO5oiP5oiQ5oiR5oiS5oiT5oiU5oiV5oiW5oiX5oiY5oiZ5oia5oib5oic5oid5oie5oifCivmiKDmiKHmiKLmiKPmiKTmiKXmiKbmiKfmiKjmiKnmiKrmiKvmiKzmiK3miK7miK/miLDmiLHmiLLmiLPmiLTmiLXmiLbmiLfmiLjmiLnmiLrmiLvmiLzmiL3miL7miL8KK+aJgOaJgeaJguaJg+aJhOaJheaJhuaJh+aJiOaJieaJiuaJi+aJjOaJjeaJjuaJj+aJkOaJkeaJkuaJk+aJlOaJleaJluaJl+aJmOaJmeaJmuaJm+aJnOaJneaJnuaJnwor5omg5omh5omi5omj5omk5oml5omm5omn5omo5omp5omq5omr5oms5omt5omu5omv5omw5omx5omy5omz5om05om15om25om35om45om55om65om75om85om95om+5om/CivmioDmioHmioLmioPmioTmioXmiobmiofmiojmionmiormiovmiozmio3mio7mio/mipDmipHmipLmipPmipTmipXmipbmipfmipjmipnmiprmipvmipzmip3mip7mip8KK+aKoOaKoeaKouaKo+aKpOaKpeaKpuaKp+aKqOaKqeaKquaKq+aKrOaKreaKruaKr+aKsOaKseaKsuaKs+aKtOaKteaKtuaKt+aKuOaKueaKuuaKu+aKvOaKveaKvuaKvwor5ouA5ouB5ouC5ouD5ouE5ouF5ouG5ouH5ouI5ouJ5ouK5ouL5ouM5ouN5ouO5ouP5ouQ5ouR5ouS5ouT5ouU5ouV5ouW5ouX5ouY5ouZ5oua5oub5ouc5oud5oue5oufCivmi6Dmi6Hmi6Lmi6Pmi6Tmi6Xmi6bmi6fmi6jmi6nmi6rmi6vmi6zmi63mi67mi6/mi7Dmi7Hmi7Lmi7Pmi7Tmi7Xmi7bmi7fmi7jmi7nmi7rmi7vmi7zmi73mi77mi78KK+aMgOaMgeaMguaMg+aMhOaMheaMhuaMh+aMiOaMieaMiuaMi+aMjOaMjeaMjuaMj+aMkOaMkeaMkuaMk+aMlOaMleaMluaMl+aMmOaMmeaMmuaMm+aMnOaMneaMnuaMnwor5oyg5oyh5oyi5oyj5oyk5oyl5oym5oyn5oyo5oyp5oyq5oyr5oys5oyt5oyu5oyv5oyw5oyx5oyy5oyz5oy05oy15oy25oy35oy45oy55oy65oy75oy85oy95oy+5oy/CivmjYDmjYHmjYLmjYPmjYTmjYXmjYbmjYfmjYjmjYnmjYrmjYvmjYzmjY3mjY7mjY/mjZDmjZHmjZLmjZPmjZTmjZXmjZbmjZfmjZjmjZnmjZrmjZvmjZzmjZ3mjZ7mjZ8KK+aNoOaNoeaNouaNo+aNpOaNpeaNpuaNp+aNqOaNqeaNquaNq+aNrOaNreaNruaNr+aNsOaNseaNsuaNs+aNtOaNteaNtuaNt+aNuOaNueaNuuaNu+aNvOaNveaNvuaNvwor5o6A5o6B5o6C5o6D5o6E5o6F5o6G5o6H5o6I5o6J5o6K5o6L5o6M5o6N5o6O5o6P5o6Q5o6R5o6S5o6T5o6U5o6V5o6W5o6X5o6Y5o6Z5o6a5o6b5o6c5o6d5o6e5o6fCivmjqDmjqHmjqLmjqPmjqTmjqXmjqbmjqfmjqjmjqnmjqrmjqvmjqzmjq3mjq7mjq/mjrDmjrHmjrLmjrPmjrTmjrXmjrbmjrfmjrjmjrnmjrrmjrvmjrzmjr3mjr7mjr8KK+aPgOaPgeaPguaPg+aPhOaPheaPhuaPh+aPiOaPieaPiuaPi+aPjOaPjeaPjuaPj+aPkOaPkeaPkuaPk+aPlOaPleaPluaPl+aPmOaPmeaPmuaPm+aPnOaPneaPnuaPnwor5o+g5o+h5o+i5o+j5o+k5o+l5o+m5o+n5o+o5o+p5o+q5o+r5o+s5o+t5o+u5o+v5o+w5o+x5o+y5o+z5o+05o+15o+25o+35o+45o+55o+65o+75o+85o+95o++5o+/CivmkIDmkIHmkILmkIPmkITmkIXmkIbmkIfmkIjmkInmkIrmkIvmkIzmkI3mkI7mkI/mkJDmkJHmkJLmkJPmkJTmkJXmkJbmkJfmkJjmkJnmkJrmkJvmkJzmkJ3mkJ7mkJ8KK+aQoOaQoeaQouaQo+aQpOaQpeaQpuaQp+aQqOaQqeaQquaQq+aQrOaQreaQruaQr+aQsOaQseaQsuaQs+aQtOaQteaQtuaQt+aQuOaQueaQuuaQu+aQvOaQveaQvuaQvwor5pGA5pGB5pGC5pGD5pGE5pGF5pGG5pGH5pGI5pGJ5pGK5pGL5pGM5pGN5pGO5pGP5pGQ5pGR5pGS5pGT5pGU5pGV5pGW5pGX5pGY5pGZ5pGa5pGb5pGc5pGd5pGe5pGfCivmkaDmkaHmkaLmkaPmkaTmkaXmkabmkafmkajmkanmkarmkavmkazmka3mka7mka/mkbDmkbHmkbLmkbPmkbTmkbXmkbbmkbfmkbjmkbnmkbrmkbvmkbzmkb3mkb7mkb8KK+aSgOaSgeaSguaSg+aShOaSheaShuaSh+aSiOaSieaSiuaSi+aSjOaSjeaSjuaSj+aSkOaSkeaSkuaSk+aSlOaSleaSluaSl+aSmOaSmeaSmuaSm+aSnOaSneaSnuaSnwor5pKg5pKh5pKi5pKj5pKk5pKl5pKm5pKn5pKo5pKp5pKq5pKr5pKs5pKt5pKu5pKv5pKw5pKx5pKy5pKz5pK05pK15pK25pK35pK45pK55pK65pK75pK85pK95pK+5pK/Civmk4Dmk4Hmk4Lmk4Pmk4Tmk4Xmk4bmk4fmk4jmk4nmk4rmk4vmk4zmk43mk47mk4/mk5Dmk5Hmk5Lmk5Pmk5Tmk5Xmk5bmk5fmk5jmk5nmk5rmk5vmk5zmk53mk57mk58KK+aToOaToeaTouaTo+aTpOaTpeaTpuaTp+aTqOaTqeaTquaTq+aTrOaTreaTruaTr+aTsOaTseaTsuaTs+aTtOaTteaTtuaTt+aTuOaTueaTuuaTu+aTvOaTveaTvuaTvwor5pSA5pSB5pSC5pSD5pSE5pSF5pSG5pSH5pSI5pSJ5pSK5pSL5pSM5pSN5pSO5pSP5pSQ5pSR5pSS5pST5pSU5pSV5pSW5pSX5pSY5pSZ5pSa5pSb5pSc5pSd5pSe5pSfCivmlKDmlKHmlKLmlKPmlKTmlKXmlKbmlKfmlKjmlKnmlKrmlKvmlKzmlK3mlK7mlK/mlLDmlLHmlLLmlLPmlLTmlLXmlLbmlLfmlLjmlLnmlLrmlLvmlLzmlL3mlL7mlL8KK+aVgOaVgeaVguaVg+aVhOaVheaVhuaVh+aViOaVieaViuaVi+aVjOaVjeaVjuaVj+aVkOaVkeaVkuaVk+aVlOaVleaVluaVl+aVmOaVmeaVmuaVm+aVnOaVneaVnuaVnwor5pWg5pWh5pWi5pWj5pWk5pWl5pWm5pWn5pWo5pWp5pWq5pWr5pWs5pWt5pWu5pWv5pWw5pWx5pWy5pWz5pW05pW15pW25pW35pW45pW55pW65pW75pW85pW95pW+5pW/CivmloDmloHmloLmloPmloTmloXmlobmlofmlojmlonmlormlovmlozmlo3mlo7mlo/mlpDmlpHmlpLmlpPmlpTmlpXmlpbmlpfmlpjmlpnmlprmlpvmlpzmlp3mlp7mlp8KK+aWoOaWoeaWouaWo+aWpOaWpeaWpuaWp+aWqOaWqeaWquaWq+aWrOaWreaWruaWr+aWsOaWseaWsuaWs+aWtOaWteaWtuaWt+aWuOaWueaWuuaWu+aWvOaWveaWvuaWvwor5peA5peB5peC5peD5peE5peF5peG5peH5peI5peJ5peK5peL5peM5peN5peO5peP5peQ5peR5peS5peT5peU5peV5peW5peX5peY5peZ5pea5peb5pec5ped5pee5pefCivml6Dml6Hml6Lml6Pml6Tml6Xml6bml6fml6jml6nml6rml6vml6zml63ml67ml6/ml7Dml7Hml7Lml7Pml7Tml7Xml7bml7fml7jml7nml7rml7vml7zml73ml77ml78KK+aYgOaYgeaYguaYg+aYhOaYheaYhuaYh+aYiOaYieaYiuaYi+aYjOaYjeaYjuaYj+aYkOaYkeaYkuaYk+aYlOaYleaYluaYl+aYmOaYmeaYmuaYm+aYnOaYneaYnuaYnwor5pig5pih5pii5pij5pik5pil5pim5pin5pio5pip5piq5pir5pis5pit5piu5piv5piw5pix5piy5piz5pi05pi15pi25pi35pi45pi55pi65pi75pi85pi95pi+5pi/CivmmYDmmYHmmYLmmYPmmYTmmYXmmYbmmYfmmYjmmYnmmYrmmYvmmYzmmY3mmY7mmY/mmZDmmZHmmZLmmZPmmZTmmZXmmZbmmZfmmZjmmZnmmZrmmZvmmZzmmZ3mmZ7mmZ8KK+aZoOaZoeaZouaZo+aZpOaZpeaZpuaZp+aZqOaZqeaZquaZq+aZrOaZreaZruaZr+aZsOaZseaZsuaZs+aZtOaZteaZtuaZt+aZuOaZueaZuuaZu+aZvOaZveaZvuaZvwor5pqA5pqB5pqC5pqD5pqE5pqF5pqG5pqH5pqI5pqJ5pqK5pqL5pqM5pqN5pqO5pqP5pqQ5pqR5pqS5pqT5pqU5pqV5pqW5pqX5pqY5pqZ5pqa5pqb5pqc5pqd5pqe5pqfCivmmqDmmqHmmqLmmqPmmqTmmqXmmqbmmqfmmqjmmqnmmqrmmqvmmqzmmq3mmq7mmq/mmrDmmrHmmrLmmrPmmrTmmrXmmrbmmrfmmrjmmrnmmrrmmrvmmrzmmr3mmr7mmr8KK+abgOabgeabguabg+abhOabheabhuabh+abiOabieabiuabi+abjOabjeabjuabj+abkOabkeabkuabk+ablOableabluabl+abmOabmeabmuabm+abnOabneabnuabnwor5pug5puh5pui5puj5puk5pul5pum5pun5puo5pup5puq5pur5pus5put5puu5puv5puw5pux5puy5puz5pu05pu15pu25pu35pu45pu55pu65pu75pu85pu95pu+5pu/CivmnIDmnIHmnILmnIPmnITmnIXmnIbmnIfmnIjmnInmnIrmnIvmnIzmnI3mnI7mnI/mnJDmnJHmnJLmnJPmnJTmnJXmnJbmnJfmnJjmnJnmnJrmnJvmnJzmnJ3mnJ7mnJ8KK+acoOacoeacouaco+acpOacpeacpuacp+acqOacqeacquacq+acrOacreacruacr+acsOacseacsuacs+actOacteactuact+acuOacueacuuacu+acvOacveacvuacvwor5p2A5p2B5p2C5p2D5p2E5p2F5p2G5p2H5p2I5p2J5p2K5p2L5p2M5p2N5p2O5p2P5p2Q5p2R5p2S5p2T5p2U5p2V5p2W5p2X5p2Y5p2Z5p2a5p2b5p2c5p2d5p2e5p2fCivmnaDmnaHmnaLmnaPmnaTmnaXmnabmnafmnajmnanmnarmnavmnazmna3mna7mna/mnbDmnbHmnbLmnbPmnbTmnbXmnbbmnbfmnbjmnbnmnbrmnbvmnbzmnb3mnb7mnb8KK+aegOaegeaeguaeg+aehOaeheaehuaeh+aeiOaeieaeiuaei+aejOaejeaejuaej+aekOaekeaekuaek+aelOaeleaeluael+aemOaemeaemuaem+aenOaeneaenuaenwor5p6g5p6h5p6i5p6j5p6k5p6l5p6m5p6n5p6o5p6p5p6q5p6r5p6s5p6t5p6u5p6v5p6w5p6x5p6y5p6z5p605p615p625p635p645p655p665p675p685p695p6+5p6/Civmn4Dmn4Hmn4Lmn4Pmn4Tmn4Xmn4bmn4fmn4jmn4nmn4rmn4vmn4zmn43mn47mn4/mn5Dmn5Hmn5Lmn5Pmn5Tmn5Xmn5bmn5fmn5jmn5nmn5rmn5vmn5zmn53mn57mn58KK+afoOafoeafouafo+afpOafpeafpuafp+afqOafqeafquafq+afrOafreafruafr+afsOafseafsuafs+aftOafteaftuaft+afuOafueafuuafu+afvOafveafvuafvwor5qCA5qCB5qCC5qCD5qCE5qCF5qCG5qCH5qCI5qCJ5qCK5qCL5qCM5qCN5qCO5qCP5qCQ5qCR5qCS5qCT5qCU5qCV5qCW5qCX5qCY5qCZ5qCa5qCb5qCc5qCd5qCe5qCfCivmoKDmoKHmoKLmoKPmoKTmoKXmoKbmoKfmoKjmoKnmoKrmoKvmoKzmoK3moK7moK/moLDmoLHmoLLmoLPmoLTmoLXmoLbmoLfmoLjmoLnmoLrmoLvmoLzmoL3moL7moL8KK+ahgOahgeahguahg+ahhOahheahhuahh+ahiOahieahiuahi+ahjOahjeahjuahj+ahkOahkeahkuahk+ahlOahleahluahl+ahmOahmeahmuahm+ahnOahneahnuahnwor5qGg5qGh5qGi5qGj5qGk5qGl5qGm5qGn5qGo5qGp5qGq5qGr5qGs5qGt5qGu5qGv5qGw5qGx5qGy5qGz5qG05qG15qG25qG35qG45qG55qG65qG75qG85qG95qG+5qG/CivmooDmooHmooLmooPmooTmooXmoobmoofmoojmoonmoormoovmoozmoo3moo7moo/mopDmopHmopLmopPmopTmopXmopbmopfmopjmopnmoprmopvmopzmop3mop7mop8KK+aioOaioeaiouaio+aipOaipeaipuaip+aiqOaiqeaiquaiq+airOaireairuair+aisOaiseaisuais+aitOaiteaituait+aiuOaiueaiuuaiu+aivOaiveaivuaivwor5qOA5qOB5qOC5qOD5qOE5qOF5qOG5qOH5qOI5qOJ5qOK5qOL5qOM5qON5qOO5qOP5qOQ5qOR5qOS5qOT5qOU5qOV5qOW5qOX5qOY5qOZ5qOa5qOb5qOc5qOd5qOe5qOfCivmo6Dmo6Hmo6Lmo6Pmo6Tmo6Xmo6bmo6fmo6jmo6nmo6rmo6vmo6zmo63mo67mo6/mo7Dmo7Hmo7Lmo7Pmo7Tmo7Xmo7bmo7fmo7jmo7nmo7rmo7vmo7zmo73mo77mo78KK+akgOakgeakguakg+akhOakheakhuakh+akiOakieakiuaki+akjOakjeakjuakj+akkOakkeakkuakk+aklOakleakluakl+akmOakmeakmuakm+aknOakneaknuaknwor5qSg5qSh5qSi5qSj5qSk5qSl5qSm5qSn5qSo5qSp5qSq5qSr5qSs5qSt5qSu5qSv5qSw5qSx5qSy5qSz5qS05qS15qS25qS35qS45qS55qS65qS75qS85qS95qS+5qS/CivmpYDmpYHmpYLmpYPmpYTmpYXmpYbmpYfmpYjmpYnmpYrmpYvmpYzmpY3mpY7mpY/mpZDmpZHmpZLmpZPmpZTmpZXmpZbmpZfmpZjmpZnmpZrmpZvmpZzmpZ3mpZ7mpZ8KK+aloOaloealoualo+alpOalpealpualp+alqOalqealqualq+alrOalrealrualr+alsOalsealsuals+altOaltealtualt+aluOaluealuualu+alvOalvealvualvwor5qaA5qaB5qaC5qaD5qaE5qaF5qaG5qaH5qaI5qaJ5qaK5qaL5qaM5qaN5qaO5qaP5qaQ5qaR5qaS5qaT5qaU5qaV5qaW5qaX5qaY5qaZ5qaa5qab5qac5qad5qae5qafCivmpqDmpqHmpqLmpqPmpqTmpqXmpqbmpqfmpqjmpqnmpqrmpqvmpqzmpq3mpq7mpq/mprDmprHmprLmprPmprTmprXmprbmprfmprjmprnmprrmprvmprzmpr3mpr7mpr8KK+angOangeanguang+anhOanheanhuanh+aniOanieaniuani+anjOanjeanjuanj+ankOankeankuank+anlOanleanluanl+anmOanmeanmuanm+annOanneannuannwor5qeg5qeh5qei5qej5qek5qel5qem5qen5qeo5qep5qeq5qer5qes5qet5qeu5qev5qew5qex5qey5qez5qe05qe15qe25qe35qe45qe55qe65qe75qe85qe95qe+5qe/CivmqIDmqIHmqILmqIPmqITmqIXmqIbmqIfmqIjmqInmqIrmqIvmqIzmqI3mqI7mqI/mqJDmqJHmqJLmqJPmqJTmqJXmqJbmqJfmqJjmqJnmqJrmqJvmqJzmqJ3mqJ7mqJ8KK+aooOaooeaoouaoo+aopOaopeaopuaop+aoqOaoqeaoquaoq+aorOaoreaoruaor+aosOaoseaosuaos+aotOaoteaotuaot+aouOaoueaouuaou+aovOaoveaovuaovwor5qmA5qmB5qmC5qmD5qmE5qmF5qmG5qmH5qmI5qmJ5qmK5qmL5qmM5qmN5qmO5qmP5qmQ5qmR5qmS5qmT5qmU5qmV5qmW5qmX5qmY5qmZ5qma5qmb5qmc5qmd5qme5qmfCivmqaDmqaHmqaLmqaPmqaTmqaXmqabmqafmqajmqanmqarmqavmqazmqa3mqa7mqa/mqbDmqbHmqbLmqbPmqbTmqbXmqbbmqbfmqbjmqbnmqbrmqbvmqbzmqb3mqb7mqb8KK+aqgOaqgeaqguaqg+aqhOaqheaqhuaqh+aqiOaqieaqiuaqi+aqjOaqjeaqjuaqj+aqkOaqkeaqkuaqk+aqlOaqleaqluaql+aqmOaqmeaqmuaqm+aqnOaqneaqnuaqnwor5qqg5qqh5qqi5qqj5qqk5qql5qqm5qqn5qqo5qqp5qqq5qqr5qqs5qqt5qqu5qqv5qqw5qqx5qqy5qqz5qq05qq15qq25qq35qq45qq55qq65qq75qq85qq95qq+5qq/Civmq4Dmq4Hmq4Lmq4Pmq4Tmq4Xmq4bmq4fmq4jmq4nmq4rmq4vmq4zmq43mq47mq4/mq5Dmq5Hmq5Lmq5Pmq5Tmq5Xmq5bmq5fmq5jmq5nmq5rmq5vmq5zmq53mq57mq58KK+aroOaroearouaro+arpOarpearpuarp+arqOarqearquarq+arrOarrearruarr+arsOarsearsuars+artOarteartuart+aruOaruearuuaru+arvOarvearvuarvwor5qyA5qyB5qyC5qyD5qyE5qyF5qyG5qyH5qyI5qyJ5qyK5qyL5qyM5qyN5qyO5qyP5qyQ5qyR5qyS5qyT5qyU5qyV5qyW5qyX5qyY5qyZ5qya5qyb5qyc5qyd5qye5qyfCivmrKDmrKHmrKLmrKPmrKTmrKXmrKbmrKfmrKjmrKnmrKrmrKvmrKzmrK3mrK7mrK/mrLDmrLHmrLLmrLPmrLTmrLXmrLbmrLfmrLjmrLnmrLrmrLvmrLzmrL3mrL7mrL8KK+atgOatgeatguatg+athOatheathuath+atiOatieatiuati+atjOatjeatjuatj+atkOatkeatkuatk+atlOatleatluatl+atmOatmeatmuatm+atnOatneatnuatnwor5q2g5q2h5q2i5q2j5q2k5q2l5q2m5q2n5q2o5q2p5q2q5q2r5q2s5q2t5q2u5q2v5q2w5q2x5q2y5q2z5q205q215q225q235q245q255q265q275q285q295q2+5q2/CivmroDmroHmroLmroPmroTmroXmrobmrofmrojmronmrormrovmrozmro3mro7mro/mrpDmrpHmrpLmrpPmrpTmrpXmrpbmrpfmrpjmrpnmrprmrpvmrpzmrp3mrp7mrp8KK+auoOauoeauouauo+aupOaupeaupuaup+auqOauqeauquauq+aurOaureauruaur+ausOauseausuaus+autOauteautuaut+auuOauueauuuauu+auvOauveauvuauvwor5q+A5q+B5q+C5q+D5q+E5q+F5q+G5q+H5q+I5q+J5q+K5q+L5q+M5q+N5q+O5q+P5q+Q5q+R5q+S5q+T5q+U5q+V5q+W5q+X5q+Y5q+Z5q+a5q+b5q+c5q+d5q+e5q+fCivmr6Dmr6Hmr6Lmr6Pmr6Tmr6Xmr6bmr6fmr6jmr6nmr6rmr6vmr6zmr63mr67mr6/mr7Dmr7Hmr7Lmr7Pmr7Tmr7Xmr7bmr7fmr7jmr7nmr7rmr7vmr7zmr73mr77mr78KK+awgOawgeawguawg+awhOawheawhuawh+awiOawieawiuawi+awjOawjeawjuawj+awkOawkeawkuawk+awlOawleawluawl+awmOawmeawmuawm+awnOawneawnuawnwor5rCg5rCh5rCi5rCj5rCk5rCl5rCm5rCn5rCo5rCp5rCq5rCr5rCs5rCt5rCu5rCv5rCw5rCx5rCy5rCz5rC05rC15rC25rC35rC45rC55rC65rC75rC85rC95rC+5rC/CivmsYDmsYHmsYLmsYPmsYTmsYXmsYbmsYfmsYjmsYnmsYrmsYvmsYzmsY3msY7msY/msZDmsZHmsZLmsZPmsZTmsZXmsZbmsZfmsZjmsZnmsZrmsZvmsZzmsZ3msZ7msZ8KK+axoOaxoeaxouaxo+axpOaxpeaxpuaxp+axqOaxqeaxquaxq+axrOaxreaxruaxr+axsOaxseaxsuaxs+axtOaxteaxtuaxt+axuOaxueaxuuaxu+axvOaxveaxvuaxvwor5rKA5rKB5rKC5rKD5rKE5rKF5rKG5rKH5rKI5rKJ5rKK5rKL5rKM5rKN5rKO5rKP5rKQ5rKR5rKS5rKT5rKU5rKV5rKW5rKX5rKY5rKZ5rKa5rKb5rKc5rKd5rKe5rKfCivmsqDmsqHmsqLmsqPmsqTmsqXmsqbmsqfmsqjmsqnmsqrmsqvmsqzmsq3msq7msq/msrDmsrHmsrLmsrPmsrTmsrXmsrbmsrfmsrjmsrnmsrrmsrvmsrzmsr3msr7msr8KK+azgOazgeazguazg+azhOazheazhuazh+aziOazieaziuazi+azjOazjeazjuazj+azkOazkeazkuazk+azlOazleazluazl+azmOazmeazmuazm+aznOazneaznuaznwor5rOg5rOh5rOi5rOj5rOk5rOl5rOm5rOn5rOo5rOp5rOq5rOr5rOs5rOt5rOu5rOv5rOw5rOx5rOy5rOz5rO05rO15rO25rO35rO45rO55rO65rO75rO85rO95rO+5rO/CivmtIDmtIHmtILmtIPmtITmtIXmtIbmtIfmtIjmtInmtIrmtIvmtIzmtI3mtI7mtI/mtJDmtJHmtJLmtJPmtJTmtJXmtJbmtJfmtJjmtJnmtJrmtJvmtJzmtJ3mtJ7mtJ8KK+a0oOa0oea0oua0o+a0pOa0pea0pua0p+a0qOa0qea0qua0q+a0rOa0rea0rua0r+a0sOa0sea0sua0s+a0tOa0tea0tua0t+a0uOa0uea0uua0u+a0vOa0vea0vua0vwor5rWA5rWB5rWC5rWD5rWE5rWF5rWG5rWH5rWI5rWJ5rWK5rWL5rWM5rWN5rWO5rWP5rWQ5rWR5rWS5rWT5rWU5rWV5rWW5rWX5rWY5rWZ5rWa5rWb5rWc5rWd5rWe5rWfCivmtaDmtaHmtaLmtaPmtaTmtaXmtabmtafmtajmtanmtarmtavmtazmta3mta7mta/mtbDmtbHmtbLmtbPmtbTmtbXmtbbmtbfmtbjmtbnmtbrmtbvmtbzmtb3mtb7mtb8KK+a2gOa2gea2gua2g+a2hOa2hea2hua2h+a2iOa2iea2iua2i+a2jOa2jea2jua2j+a2kOa2kea2kua2k+a2lOa2lea2lua2l+a2mOa2mea2mua2m+a2nOa2nea2nua2nwor5rag5rah5rai5raj5rak5ral5ram5ran5rao5rap5raq5rar5ras5rat5rau5rav5raw5rax5ray5raz5ra05ra15ra25ra35ra45ra55ra65ra75ra85ra95ra+5ra/Civmt4Dmt4Hmt4Lmt4Pmt4Tmt4Xmt4bmt4fmt4jmt4nmt4rmt4vmt4zmt43mt47mt4/mt5Dmt5Hmt5Lmt5Pmt5Tmt5Xmt5bmt5fmt5jmt5nmt5rmt5vmt5zmt53mt57mt58KK+a3oOa3oea3oua3o+a3pOa3pea3pua3p+a3qOa3qea3qua3q+a3rOa3rea3rua3r+a3sOa3sea3sua3s+a3tOa3tea3tua3t+a3uOa3uea3uua3u+a3vOa3vea3vua3vwor5riA5riB5riC5riD5riE5riF5riG5riH5riI5riJ5riK5riL5riM5riN5riO5riP5riQ5riR5riS5riT5riU5riV5riW5riX5riY5riZ5ria5rib5ric5rid5rie5rifCivmuKDmuKHmuKLmuKPmuKTmuKXmuKbmuKfmuKjmuKnmuKrmuKvmuKzmuK3muK7muK/muLDmuLHmuLLmuLPmuLTmuLXmuLbmuLfmuLjmuLnmuLrmuLvmuLzmuL3muL7muL8KK+a5gOa5gea5gua5g+a5hOa5hea5hua5h+a5iOa5iea5iua5i+a5jOa5jea5jua5j+a5kOa5kea5kua5k+a5lOa5lea5lua5l+a5mOa5mea5mua5m+a5nOa5nea5nua5nwor5rmg5rmh5rmi5rmj5rmk5rml5rmm5rmn5rmo5rmp5rmq5rmr5rms5rmt5rmu5rmv5rmw5rmx5rmy5rmz5rm05rm15rm25rm35rm45rm55rm65rm75rm85rm95rm+5rm/CivmuoDmuoHmuoLmuoPmuoTmuoXmuobmuofmuojmuonmuormuovmuozmuo3muo7muo/mupDmupHmupLmupPmupTmupXmupbmupfmupjmupnmuprmupvmupzmup3mup7mup8KK+a6oOa6oea6oua6o+a6pOa6pea6pua6p+a6qOa6qea6qua6q+a6rOa6rea6rua6r+a6sOa6sea6sua6s+a6tOa6tea6tua6t+a6uOa6uea6uua6u+a6vOa6vea6vua6vwor5ruA5ruB5ruC5ruD5ruE5ruF5ruG5ruH5ruI5ruJ5ruK5ruL5ruM5ruN5ruO5ruP5ruQ5ruR5ruS5ruT5ruU5ruV5ruW5ruX5ruY5ruZ5rua5rub5ruc5rud5rue5rufCivmu6Dmu6Hmu6Lmu6Pmu6Tmu6Xmu6bmu6fmu6jmu6nmu6rmu6vmu6zmu63mu67mu6/mu7Dmu7Hmu7Lmu7Pmu7Tmu7Xmu7bmu7fmu7jmu7nmu7rmu7vmu7zmu73mu77mu78KK+a8gOa8gea8gua8g+a8hOa8hea8hua8h+a8iOa8iea8iua8i+a8jOa8jea8jua8j+a8kOa8kea8kua8k+a8lOa8lea8lua8l+a8mOa8mea8mua8m+a8nOa8nea8nua8nwor5ryg5ryh5ryi5ryj5ryk5ryl5rym5ryn5ryo5ryp5ryq5ryr5rys5ryt5ryu5ryv5ryw5ryx5ryy5ryz5ry05ry15ry25ry35ry45ry55ry65ry75ry85ry95ry+5ry/CivmvYDmvYHmvYLmvYPmvYTmvYXmvYbmvYfmvYjmvYnmvYrmvYvmvYzmvY3mvY7mvY/mvZDmvZHmvZLmvZPmvZTmvZXmvZbmvZfmvZjmvZnmvZrmvZvmvZzmvZ3mvZ7mvZ8KK+a9oOa9oea9oua9o+a9pOa9pea9pua9p+a9qOa9qea9qua9q+a9rOa9rea9rua9r+a9sOa9sea9sua9s+a9tOa9tea9tua9t+a9uOa9uea9uua9u+a9vOa9vea9vua9vwor5r6A5r6B5r6C5r6D5r6E5r6F5r6G5r6H5r6I5r6J5r6K5r6L5r6M5r6N5r6O5r6P5r6Q5r6R5r6S5r6T5r6U5r6V5r6W5r6X5r6Y5r6Z5r6a5r6b5r6c5r6d5r6e5r6fCivmvqDmvqHmvqLmvqPmvqTmvqXmvqbmvqfmvqjmvqnmvqrmvqvmvqzmvq3mvq7mvq/mvrDmvrHmvrLmvrPmvrTmvrXmvrbmvrfmvrjmvrnmvrrmvrvmvrzmvr3mvr7mvr8KK+a/gOa/gea/gua/g+a/hOa/hea/hua/h+a/iOa/iea/iua/i+a/jOa/jea/jua/j+a/kOa/kea/kua/k+a/lOa/lea/lua/l+a/mOa/mea/mua/m+a/nOa/nea/nua/nwor5r+g5r+h5r+i5r+j5r+k5r+l5r+m5r+n5r+o5r+p5r+q5r+r5r+s5r+t5r+u5r+v5r+w5r+x5r+y5r+z5r+05r+15r+25r+35r+45r+55r+65r+75r+85r+95r++5r+/CivngIDngIHngILngIPngITngIXngIbngIfngIjngInngIrngIvngIzngI3ngI7ngI/ngJDngJHngJLngJPngJTngJXngJbngJfngJjngJnngJrngJvngJzngJ3ngJ7ngJ8KK+eAoOeAoeeAoueAo+eApOeApeeApueAp+eAqOeAqeeAqueAq+eArOeAreeArueAr+eAsOeAseeAsueAs+eAtOeAteeAtueAt+eAuOeAueeAuueAu+eAvOeAveeAvueAvwor54GA54GB54GC54GD54GE54GF54GG54GH54GI54GJ54GK54GL54GM54GN54GO54GP54GQ54GR54GS54GT54GU54GV54GW54GX54GY54GZ54Ga54Gb54Gc54Gd54Ge54GfCivngaDngaHngaLngaPngaTngaXngabngafngajnganngarngavngaznga3nga7nga/ngbDngbHngbLngbPngbTngbXngbbngbfngbjngbnngbrngbvngbzngb3ngb7ngb8KK+eCgOeCgeeCgueCg+eChOeCheeChueCh+eCiOeCieeCiueCi+eCjOeCjeeCjueCj+eCkOeCkeeCkueCk+eClOeCleeClueCl+eCmOeCmeeCmueCm+eCnOeCneeCnueCnwor54Kg54Kh54Ki54Kj54Kk54Kl54Km54Kn54Ko54Kp54Kq54Kr54Ks54Kt54Ku54Kv54Kw54Kx54Ky54Kz54K054K154K254K354K454K554K654K754K854K954K+54K/Civng4Dng4Hng4Lng4Png4Tng4Xng4bng4fng4jng4nng4rng4vng4zng43ng47ng4/ng5Dng5Hng5Lng5Png5Tng5Xng5bng5fng5jng5nng5rng5vng5zng53ng57ng58KK+eDoOeDoeeDoueDo+eDpOeDpeeDpueDp+eDqOeDqeeDqueDq+eDrOeDreeDrueDr+eDsOeDseeDsueDs+eDtOeDteeDtueDt+eDuOeDueeDuueDu+eDvOeDveeDvueDvwor54SA54SB54SC54SD54SE54SF54SG54SH54SI54SJ54SK54SL54SM54SN54SO54SP54SQ54SR54SS54ST54SU54SV54SW54SX54SY54SZ54Sa54Sb54Sc54Sd54Se54SfCivnhKDnhKHnhKLnhKPnhKTnhKXnhKbnhKfnhKjnhKnnhKrnhKvnhKznhK3nhK7nhK/nhLDnhLHnhLLnhLPnhLTnhLXnhLbnhLfnhLjnhLnnhLrnhLvnhLznhL3nhL7nhL8KK+eFgOeFgeeFgueFg+eFhOeFheeFhueFh+eFiOeFieeFiueFi+eFjOeFjeeFjueFj+eFkOeFkeeFkueFk+eFlOeFleeFlueFl+eFmOeFmeeFmueFm+eFnOeFneeFnueFnwor54Wg54Wh54Wi54Wj54Wk54Wl54Wm54Wn54Wo54Wp54Wq54Wr54Ws54Wt54Wu54Wv54Ww54Wx54Wy54Wz54W054W154W254W354W454W554W654W754W854W954W+54W/CivnhoDnhoHnhoLnhoPnhoTnhoXnhobnhofnhojnhonnhornhovnhoznho3nho7nho/nhpDnhpHnhpLnhpPnhpTnhpXnhpbnhpfnhpjnhpnnhprnhpvnhpznhp3nhp7nhp8KK+eGoOeGoeeGoueGo+eGpOeGpeeGpueGp+eGqOeGqeeGqueGq+eGrOeGreeGrueGr+eGsOeGseeGsueGs+eGtOeGteeGtueGt+eGuOeGueeGuueGu+eGvOeGveeGvueGvwor54eA54eB54eC54eD54eE54eF54eG54eH54eI54eJ54eK54eL54eM54eN54eO54eP54eQ54eR54eS54eT54eU54eV54eW54eX54eY54eZ54ea54eb54ec54ed54ee54efCivnh6Dnh6Hnh6Lnh6Pnh6Tnh6Xnh6bnh6fnh6jnh6nnh6rnh6vnh6znh63nh67nh6/nh7Dnh7Hnh7Lnh7Pnh7Tnh7Xnh7bnh7fnh7jnh7nnh7rnh7vnh7znh73nh77nh78KK+eIgOeIgeeIgueIg+eIhOeIheeIhueIh+eIiOeIieeIiueIi+eIjOeIjeeIjueIj+eIkOeIkeeIkueIk+eIlOeIleeIlueIl+eImOeImeeImueIm+eInOeIneeInueInwor54ig54ih54ii54ij54ik54il54im54in54io54ip54iq54ir54is54it54iu54iv54iw54ix54iy54iz54i054i154i254i354i454i554i654i754i854i954i+54i/CivniYDniYHniYLniYPniYTniYXniYbniYfniYjniYnniYrniYvniYzniY3niY7niY/niZDniZHniZLniZPniZTniZXniZbniZfniZjniZnniZrniZvniZzniZ3niZ7niZ8KK+eJoOeJoeeJoueJo+eJpOeJpeeJpueJp+eJqOeJqeeJqueJq+eJrOeJreeJrueJr+eJsOeJseeJsueJs+eJtOeJteeJtueJt+eJuOeJueeJuueJu+eJvOeJveeJvueJvwor54qA54qB54qC54qD54qE54qF54qG54qH54qI54qJ54qK54qL54qM54qN54qO54qP54qQ54qR54qS54qT54qU54qV54qW54qX54qY54qZ54qa54qb54qc54qd54qe54qfCivniqDniqHniqLniqPniqTniqXniqbniqfniqjniqnniqrniqvniqzniq3niq7niq/nirDnirHnirLnirPnirTnirXnirbnirfnirjnirnnirrnirvnirznir3nir7nir8KK+eLgOeLgeeLgueLg+eLhOeLheeLhueLh+eLiOeLieeLiueLi+eLjOeLjeeLjueLj+eLkOeLkeeLkueLk+eLlOeLleeLlueLl+eLmOeLmeeLmueLm+eLnOeLneeLnueLnwor54ug54uh54ui54uj54uk54ul54um54un54uo54up54uq54ur54us54ut54uu54uv54uw54ux54uy54uz54u054u154u254u354u454u554u654u754u854u954u+54u/CivnjIDnjIHnjILnjIPnjITnjIXnjIbnjIfnjIjnjInnjIrnjIvnjIznjI3njI7njI/njJDnjJHnjJLnjJPnjJTnjJXnjJbnjJfnjJjnjJnnjJrnjJvnjJznjJ3njJ7njJ8KK+eMoOeMoeeMoueMo+eMpOeMpeeMpueMp+eMqOeMqeeMqueMq+eMrOeMreeMrueMr+eMsOeMseeMsueMs+eMtOeMteeMtueMt+eMuOeMueeMuueMu+eMvOeMveeMvueMvwor542A542B542C542D542E542F542G542H542I542J542K542L542M542N542O542P542Q542R542S542T542U542V542W542X542Y542Z542a542b542c542d542e542fCivnjaDnjaHnjaLnjaPnjaTnjaXnjabnjafnjajnjannjarnjavnjaznja3nja7nja/njbDnjbHnjbLnjbPnjbTnjbXnjbbnjbfnjbjnjbnnjbrnjbvnjbznjb3njb7njb8KK+eOgOeOgeeOgueOg+eOhOeOheeOhueOh+eOiOeOieeOiueOi+eOjOeOjeeOjueOj+eOkOeOkeeOkueOk+eOlOeOleeOlueOl+eOmOeOmeeOmueOm+eOnOeOneeOnueOnwor546g546h546i546j546k546l546m546n546o546p546q546r546s546t546u546v546w546x546y546z5460546154625463546454655466546754685469546+546/Civnj4Dnj4Hnj4Lnj4Pnj4Tnj4Xnj4bnj4fnj4jnj4nnj4rnj4vnj4znj43nj47nj4/nj5Dnj5Hnj5Lnj5Pnj5Tnj5Xnj5bnj5fnj5jnj5nnj5rnj5vnj5znj53nj57nj58KK+ePoOePoeePouePo+ePpOePpeePpuePp+ePqOePqeePquePq+ePrOePreePruePr+ePsOePseePsuePs+ePtOePteePtuePt+ePuOePueePuuePu+ePvOePveePvuePvwor55CA55CB55CC55CD55CE55CF55CG55CH55CI55CJ55CK55CL55CM55CN55CO55CP55CQ55CR55CS55CT55CU55CV55CW55CX55CY55CZ55Ca55Cb55Cc55Cd55Ce55CfCivnkKDnkKHnkKLnkKPnkKTnkKXnkKbnkKfnkKjnkKnnkKrnkKvnkKznkK3nkK7nkK/nkLDnkLHnkLLnkLPnkLTnkLXnkLbnkLfnkLjnkLnnkLrnkLvnkLznkL3nkL7nkL8KK+eRgOeRgeeRgueRg+eRhOeRheeRhueRh+eRiOeRieeRiueRi+eRjOeRjeeRjueRj+eRkOeRkeeRkueRk+eRlOeRleeRlueRl+eRmOeRmeeRmueRm+eRnOeRneeRnueRnwor55Gg55Gh55Gi55Gj55Gk55Gl55Gm55Gn55Go55Gp55Gq55Gr55Gs55Gt55Gu55Gv55Gw55Gx55Gy55Gz55G055G155G255G355G455G555G655G755G855G955G+55G/CivnkoDnkoHnkoLnkoPnkoTnkoXnkobnkofnkojnkonnkornkovnkoznko3nko7nko/nkpDnkpHnkpLnkpPnkpTnkpXnkpbnkpfnkpjnkpnnkprnkpvnkpznkp3nkp7nkp8KK+eSoOeSoeeSoueSo+eSpOeSpeeSpueSp+eSqOeSqeeSqueSq+eSrOeSreeSrueSr+eSsOeSseeSsueSs+eStOeSteeStueSt+eSuOeSueeSuueSu+eSvOeSveeSvueSvwor55OA55OB55OC55OD55OE55OF55OG55OH55OI55OJ55OK55OL55OM55ON55OO55OP55OQ55OR55OS55OT55OU55OV55OW55OX55OY55OZ55Oa55Ob55Oc55Od55Oe55OfCivnk6Dnk6Hnk6Lnk6Pnk6Tnk6Xnk6bnk6fnk6jnk6nnk6rnk6vnk6znk63nk67nk6/nk7Dnk7Hnk7Lnk7Pnk7Tnk7Xnk7bnk7fnk7jnk7nnk7rnk7vnk7znk73nk77nk78KK+eUgOeUgeeUgueUg+eUhOeUheeUhueUh+eUiOeUieeUiueUi+eUjOeUjeeUjueUj+eUkOeUkeeUkueUk+eUlOeUleeUlueUl+eUmOeUmeeUmueUm+eUnOeUneeUnueUnwor55Sg55Sh55Si55Sj55Sk55Sl55Sm55Sn55So55Sp55Sq55Sr55Ss55St55Su55Sv55Sw55Sx55Sy55Sz55S055S155S255S355S455S555S655S755S855S955S+55S/CivnlYDnlYHnlYLnlYPnlYTnlYXnlYbnlYfnlYjnlYnnlYrnlYvnlYznlY3nlY7nlY/nlZDnlZHnlZLnlZPnlZTnlZXnlZbnlZfnlZjnlZnnlZrnlZvnlZznlZ3nlZ7nlZ8KK+eVoOeVoeeVoueVo+eVpOeVpeeVpueVp+eVqOeVqeeVqueVq+eVrOeVreeVrueVr+eVsOeVseeVsueVs+eVtOeVteeVtueVt+eVuOeVueeVuueVu+eVvOeVveeVvueVvwor55aA55aB55aC55aD55aE55aF55aG55aH55aI55aJ55aK55aL55aM55aN55aO55aP55aQ55aR55aS55aT55aU55aV55aW55aX55aY55aZ55aa55ab55ac55ad55ae55afCivnlqDnlqHnlqLnlqPnlqTnlqXnlqbnlqfnlqjnlqnnlqrnlqvnlqznlq3nlq7nlq/nlrDnlrHnlrLnlrPnlrTnlrXnlrbnlrfnlrjnlrnnlrrnlrvnlrznlr3nlr7nlr8KK+eXgOeXgeeXgueXg+eXhOeXheeXhueXh+eXiOeXieeXiueXi+eXjOeXjeeXjueXj+eXkOeXkeeXkueXk+eXlOeXleeXlueXl+eXmOeXmeeXmueXm+eXnOeXneeXnueXnwor55eg55eh55ei55ej55ek55el55em55en55eo55ep55eq55er55es55et55eu55ev55ew55ex55ey55ez55e055e155e255e355e455e555e655e755e855e955e+55e/CivnmIDnmIHnmILnmIPnmITnmIXnmIbnmIfnmIjnmInnmIrnmIvnmIznmI3nmI7nmI/nmJDnmJHnmJLnmJPnmJTnmJXnmJbnmJfnmJjnmJnnmJrnmJvnmJznmJ3nmJ7nmJ8KK+eYoOeYoeeYoueYo+eYpOeYpeeYpueYp+eYqOeYqeeYqueYq+eYrOeYreeYrueYr+eYsOeYseeYsueYs+eYtOeYteeYtueYt+eYuOeYueeYuueYu+eYvOeYveeYvueYvwor55mA55mB55mC55mD55mE55mF55mG55mH55mI55mJ55mK55mL55mM55mN55mO55mP55mQ55mR55mS55mT55mU55mV55mW55mX55mY55mZ55ma55mb55mc55md55me55mfCivnmaDnmaHnmaLnmaPnmaTnmaXnmabnmafnmajnmannmarnmavnmaznma3nma7nma/nmbDnmbHnmbLnmbPnmbTnmbXnmbbnmbfnmbjnmbnnmbrnmbvnmbznmb3nmb7nmb8KK+eagOeageeagueag+eahOeaheeahueah+eaiOeaieeaiueai+eajOeajeeajueaj+eakOeakeeakueak+ealOealeealueal+eamOeameeamueam+eanOeaneeanueanwor55qg55qh55qi55qj55qk55ql55qm55qn55qo55qp55qq55qr55qs55qt55qu55qv55qw55qx55qy55qz55q055q155q255q355q455q555q655q755q855q955q+55q/Civnm4Dnm4Hnm4Lnm4Pnm4Tnm4Xnm4bnm4fnm4jnm4nnm4rnm4vnm4znm43nm47nm4/nm5Dnm5Hnm5Lnm5Pnm5Tnm5Xnm5bnm5fnm5jnm5nnm5rnm5vnm5znm53nm57nm58KK+eboOeboeebouebo+ebpOebpeebpuebp+ebqOebqeebquebq+ebrOebreebruebr+ebsOebseebsuebs+ebtOebteebtuebt+ebuOebueebuuebu+ebvOebveebvuebvwor55yA55yB55yC55yD55yE55yF55yG55yH55yI55yJ55yK55yL55yM55yN55yO55yP55yQ55yR55yS55yT55yU55yV55yW55yX55yY55yZ55ya55yb55yc55yd55ye55yfCivnnKDnnKHnnKLnnKPnnKTnnKXnnKbnnKfnnKjnnKnnnKrnnKvnnKznnK3nnK7nnK/nnLDnnLHnnLLnnLPnnLTnnLXnnLbnnLfnnLjnnLnnnLrnnLvnnLznnL3nnL7nnL8KK+edgOedgeedguedg+edhOedheedhuedh+ediOedieediuedi+edjOedjeedjuedj+edkOedkeedkuedk+edlOedleedluedl+edmOedmeedmuedm+ednOedneednuednwor552g552h552i552j552k552l552m552n552o552p552q552r552s552t552u552v552w552x552y552z5520552155225523552455255526552755285529552+552/CivnnoDnnoHnnoLnnoPnnoTnnoXnnobnnofnnojnnonnnornnovnnoznno3nno7nno/nnpDnnpHnnpLnnpPnnpTnnpXnnpbnnpfnnpjnnpnnnprnnpvnnpznnp3nnp7nnp8KK+eeoOeeoeeeoueeo+eepOeepeeepueep+eeqOeeqeeequeeq+eerOeereeerueer+eesOeeseeesuees+eetOeeteeetueet+eeuOeeueeeuueeu+eevOeeveeevueevwor55+A55+B55+C55+D55+E55+F55+G55+H55+I55+J55+K55+L55+M55+N55+O55+P55+Q55+R55+S55+T55+U55+V55+W55+X55+Y55+Z55+a55+b55+c55+d55+e55+fCivnn6Dnn6Hnn6Lnn6Pnn6Tnn6Xnn6bnn6fnn6jnn6nnn6rnn6vnn6znn63nn67nn6/nn7Dnn7Hnn7Lnn7Pnn7Tnn7Xnn7bnn7fnn7jnn7nnn7rnn7vnn7znn73nn77nn78KK+eggOeggeegguegg+eghOegheeghuegh+egiOegieegiuegi+egjOegjeegjuegj+egkOegkeegkuegk+eglOegleegluegl+egmOegmeegmuegm+egnOegneegnuegnwor56Cg56Ch56Ci56Cj56Ck56Cl56Cm56Cn56Co56Cp56Cq56Cr56Cs56Ct56Cu56Cv56Cw56Cx56Cy56Cz56C056C156C256C356C456C556C656C756C856C956C+56C/CivnoYDnoYHnoYLnoYPnoYTnoYXnoYbnoYfnoYjnoYnnoYrnoYvnoYznoY3noY7noY/noZDnoZHnoZLnoZPnoZTnoZXnoZbnoZfnoZjnoZnnoZrnoZvnoZznoZ3noZ7noZ8KK+ehoOehoeehoueho+ehpOehpeehpuehp+ehqOehqeehquehq+ehrOehreehruehr+ehsOehseehsuehs+ehtOehteehtueht+ehuOehueehuuehu+ehvOehveehvuehvwor56KA56KB56KC56KD56KE56KF56KG56KH56KI56KJ56KK56KL56KM56KN56KO56KP56KQ56KR56KS56KT56KU56KV56KW56KX56KY56KZ56Ka56Kb56Kc56Kd56Ke56KfCivnoqDnoqHnoqLnoqPnoqTnoqXnoqbnoqfnoqjnoqnnoqrnoqvnoqznoq3noq7noq/norDnorHnorLnorPnorTnorXnorbnorfnorjnornnorrnorvnorznor3nor7nor8KK+ejgOejgeejguejg+ejhOejheejhuejh+ejiOejieejiueji+ejjOejjeejjuejj+ejkOejkeejkuejk+ejlOejleejluejl+ejmOejmeejmuejm+ejnOejneejnuejnwor56Og56Oh56Oi56Oj56Ok56Ol56Om56On56Oo56Op56Oq56Or56Os56Ot56Ou56Ov56Ow56Ox56Oy56Oz56O056O156O256O356O456O556O656O756O856O956O+56O/CivnpIDnpIHnpILnpIPnpITnpIXnpIbnpIfnpIjnpInnpIrnpIvnpIznpI3npI7npI/npJDnpJHnpJLnpJPnpJTnpJXnpJbnpJfnpJjnpJnnpJrnpJvnpJznpJ3npJ7npJ8KK+ekoOekoeekoueko+ekpOekpeekpuekp+ekqOekqeekquekq+ekrOekreekruekr+eksOekseeksueks+ektOekteektuekt+ekuOekueekuueku+ekvOekveekvuekvwor56WA56WB56WC56WD56WE56WF56WG56WH56WI56WJ56WK56WL56WM56WN56WO56WP56WQ56WR56WS56WT56WU56WV56WW56WX56WY56WZ56Wa56Wb56Wc56Wd56We56WfCivnpaDnpaHnpaLnpaPnpaTnpaXnpabnpafnpajnpannparnpavnpaznpa3npa7npa/npbDnpbHnpbLnpbPnpbTnpbXnpbbnpbfnpbjnpbnnpbrnpbvnpbznpb3npb7npb8KK+emgOemgeemguemg+emhOemheemhuemh+emiOemieemiuemi+emjOemjeemjuemj+emkOemkeemkuemk+emlOemleemlueml+emmOemmeemmuemm+emnOemneemnuemnwor56ag56ah56ai56aj56ak56al56am56an56ao56ap56aq56ar56as56at56au56av56aw56ax56ay56az56a056a156a256a356a456a556a656a756a856a956a+56a/Civnp4Dnp4Hnp4Lnp4Pnp4Tnp4Xnp4bnp4fnp4jnp4nnp4rnp4vnp4znp43np47np4/np5Dnp5Hnp5Lnp5Pnp5Tnp5Xnp5bnp5fnp5jnp5nnp5rnp5vnp5znp53np57np58KK+enoOenoeenoueno+enpOenpeenpuenp+enqOenqeenquenq+enrOenreenruenr+ensOenseensuens+entOenteentuent+enuOenueenuuenu+envOenveenvuenvwor56iA56iB56iC56iD56iE56iF56iG56iH56iI56iJ56iK56iL56iM56iN56iO56iP56iQ56iR56iS56iT56iU56iV56iW56iX56iY56iZ56ia56ib56ic56id56ie56ifCivnqKDnqKHnqKLnqKPnqKTnqKXnqKbnqKfnqKjnqKnnqKrnqKvnqKznqK3nqK7nqK/nqLDnqLHnqLLnqLPnqLTnqLXnqLbnqLfnqLjnqLnnqLrnqLvnqLznqL3nqL7nqL8KK+epgOepgeepguepg+ephOepheephueph+epiOepieepiuepi+epjOepjeepjuepj+epkOepkeepkuepk+eplOepleepluepl+epmOepmeepmuepm+epnOepneepnuepnwor56mg56mh56mi56mj56mk56ml56mm56mn56mo56mp56mq56mr56ms56mt56mu56mv56mw56mx56my56mz56m056m156m256m356m456m556m656m756m856m956m+56m/CivnqoDnqoHnqoLnqoPnqoTnqoXnqobnqofnqojnqonnqornqovnqoznqo3nqo7nqo/nqpDnqpHnqpLnqpPnqpTnqpXnqpbnqpfnqpjnqpnnqprnqpvnqpznqp3nqp7nqp8KK+eqoOeqoeeqoueqo+eqpOeqpeeqpueqp+eqqOeqqeeqqueqq+eqrOeqreeqrueqr+eqsOeqseeqsueqs+eqtOeqteeqtueqt+equOequeequuequ+eqvOeqveeqvueqvwor56uA56uB56uC56uD56uE56uF56uG56uH56uI56uJ56uK56uL56uM56uN56uO56uP56uQ56uR56uS56uT56uU56uV56uW56uX56uY56uZ56ua56ub56uc56ud56ue56ufCivnq6Dnq6Hnq6Lnq6Pnq6Tnq6Xnq6bnq6fnq6jnq6nnq6rnq6vnq6znq63nq67nq6/nq7Dnq7Hnq7Lnq7Pnq7Tnq7Xnq7bnq7fnq7jnq7nnq7rnq7vnq7znq73nq77nq78KK+esgOesgeesguesg+eshOesheeshuesh+esiOesieesiuesi+esjOesjeesjuesj+eskOeskeeskuesk+eslOesleesluesl+esmOesmeesmuesm+esnOesneesnuesnwor56yg56yh56yi56yj56yk56yl56ym56yn56yo56yp56yq56yr56ys56yt56yu56yv56yw56yx56yy56yz56y056y156y256y356y456y556y656y756y856y956y+56y/CivnrYDnrYHnrYLnrYPnrYTnrYXnrYbnrYfnrYjnrYnnrYrnrYvnrYznrY3nrY7nrY/nrZDnrZHnrZLnrZPnrZTnrZXnrZbnrZfnrZjnrZnnrZrnrZvnrZznrZ3nrZ7nrZ8KK+etoOetoeetoueto+etpOetpeetpuetp+etqOetqeetquetq+etrOetreetruetr+etsOetseetsuets+ettOetteettuett+etuOetueetuuetu+etvOetveetvuetvwor566A566B566C566D566E566F566G566H566I566J566K566L566M566N566O566P566Q566R566S566T566U566V566W566X566Y566Z566a566b566c566d566e566fCivnrqDnrqHnrqLnrqPnrqTnrqXnrqbnrqfnrqjnrqnnrqrnrqvnrqznrq3nrq7nrq/nrrDnrrHnrrLnrrPnrrTnrrXnrrbnrrfnrrjnrrnnrrrnrrvnrrznrr3nrr7nrr8KK+evgOevgeevguevg+evhOevheevhuevh+eviOevieeviuevi+evjOevjeevjuevj+evkOevkeevkuevk+evlOevleevluevl+evmOevmeevmuevm+evnOevneevnuevnwor56+g56+h56+i56+j56+k56+l56+m56+n56+o56+p56+q56+r56+s56+t56+u56+v56+w56+x56+y56+z56+056+156+256+356+456+556+656+756+856+956++56+/CivnsIDnsIHnsILnsIPnsITnsIXnsIbnsIfnsIjnsInnsIrnsIvnsIznsI3nsI7nsI/nsJDnsJHnsJLnsJPnsJTnsJXnsJbnsJfnsJjnsJnnsJrnsJvnsJznsJ3nsJ7nsJ8KK+ewoOewoeewouewo+ewpOewpeewpuewp+ewqOewqeewquewq+ewrOewreewruewr+ewsOewseewsuews+ewtOewteewtuewt+ewuOewueewuuewu+ewvOewveewvuewvwor57GA57GB57GC57GD57GE57GF57GG57GH57GI57GJ57GK57GL57GM57GN57GO57GP57GQ57GR57GS57GT57GU57GV57GW57GX57GY57GZ57Ga57Gb57Gc57Gd57Ge57GfCivnsaDnsaHnsaLnsaPnsaTnsaXnsabnsafnsajnsannsarnsavnsaznsa3nsa7nsa/nsbDnsbHnsbLnsbPnsbTnsbXnsbbnsbfnsbjnsbnnsbrnsbvnsbznsb3nsb7nsb8KK+eygOeygeeygueyg+eyhOeyheeyhueyh+eyiOeyieeyiueyi+eyjOeyjeeyjueyj+eykOeykeeykueyk+eylOeyleeylueyl+eymOeymeeymueym+eynOeyneeynueynwor57Kg57Kh57Ki57Kj57Kk57Kl57Km57Kn57Ko57Kp57Kq57Kr57Ks57Kt57Ku57Kv57Kw57Kx57Ky57Kz57K057K157K257K357K457K557K657K757K857K957K+57K/Civns4Dns4Hns4Lns4Pns4Tns4Xns4bns4fns4jns4nns4rns4vns4zns43ns47ns4/ns5Dns5Hns5Lns5Pns5Tns5Xns5bns5fns5jns5nns5rns5vns5zns53ns57ns58KK+ezoOezoeezouezo+ezpOezpeezpuezp+ezqOezqeezquezq+ezrOezreezruezr+ezsOezseezsuezs+eztOezteeztuezt+ezuOezueezuuezu+ezvOezveezvuezvwor57SA57SB57SC57SD57SE57SF57SG57SH57SI57SJ57SK57SL57SM57SN57SO57SP57SQ57SR57SS57ST57SU57SV57SW57SX57SY57SZ57Sa57Sb57Sc57Sd57Se57SfCivntKDntKHntKLntKPntKTntKXntKbntKfntKjntKnntKrntKvntKzntK3ntK7ntK/ntLDntLHntLLntLPntLTntLXntLbntLfntLjntLnntLrntLvntLzntL3ntL7ntL8KK+e1gOe1gee1gue1g+e1hOe1hee1hue1h+e1iOe1iee1iue1i+e1jOe1jee1jue1j+e1kOe1kee1kue1k+e1lOe1lee1lue1l+e1mOe1mee1mue1m+e1nOe1nee1nue1nwor57Wg57Wh57Wi57Wj57Wk57Wl57Wm57Wn57Wo57Wp57Wq57Wr57Ws57Wt57Wu57Wv57Ww57Wx57Wy57Wz57W057W157W257W357W457W557W657W757W857W957W+57W/CivntoDntoHntoLntoPntoTntoXntobntofntojntonntorntovntoznto3nto7nto/ntpDntpHntpLntpPntpTntpXntpbntpfntpjntpnntprntpvntpzntp3ntp7ntp8KK+e2oOe2oee2oue2o+e2pOe2pee2pue2p+e2qOe2qee2que2q+e2rOe2ree2rue2r+e2sOe2see2sue2s+e2tOe2tee2tue2t+e2uOe2uee2uue2u+e2vOe2vee2vue2vwor57eA57eB57eC57eD57eE57eF57eG57eH57eI57eJ57eK57eL57eM57eN57eO57eP57eQ57eR57eS57eT57eU57eV57eW57eX57eY57eZ57ea57eb57ec57ed57ee57efCivnt6Dnt6Hnt6Lnt6Pnt6Tnt6Xnt6bnt6fnt6jnt6nnt6rnt6vnt6znt63nt67nt6/nt7Dnt7Hnt7Lnt7Pnt7Tnt7Xnt7bnt7fnt7jnt7nnt7rnt7vnt7znt73nt77nt78KK+e4gOe4gee4gue4g+e4hOe4hee4hue4h+e4iOe4iee4iue4i+e4jOe4jee4jue4j+e4kOe4kee4kue4k+e4lOe4lee4lue4l+e4mOe4mee4mue4m+e4nOe4nee4nue4nwor57ig57ih57ii57ij57ik57il57im57in57io57ip57iq57ir57is57it57iu57iv57iw57ix57iy57iz57i057i157i257i357i457i557i657i757i857i957i+57i/CivnuYDnuYHnuYLnuYPnuYTnuYXnuYbnuYfnuYjnuYnnuYrnuYvnuYznuY3nuY7nuY/nuZDnuZHnuZLnuZPnuZTnuZXnuZbnuZfnuZjnuZnnuZrnuZvnuZznuZ3nuZ7nuZ8KK+e5oOe5oee5oue5o+e5pOe5pee5pue5p+e5qOe5qee5que5q+e5rOe5ree5rue5r+e5sOe5see5sue5s+e5tOe5tee5tue5t+e5uOe5uee5uue5u+e5vOe5vee5vue5vwor57qA57qB57qC57qD57qE57qF57qG57qH57qI57qJ57qK57qL57qM57qN57qO57qP57qQ57qR57qS57qT57qU57qV57qW57qX57qY57qZ57qa57qb57qc57qd57qe57qfCivnuqDnuqHnuqLnuqPnuqTnuqXnuqbnuqfnuqjnuqnnuqrnuqvnuqznuq3nuq7nuq/nurDnurHnurLnurPnurTnurXnurbnurfnurjnurnnurrnurvnurznur3nur7nur8KK+e7gOe7gee7gue7g+e7hOe7hee7hue7h+e7iOe7iee7iue7i+e7jOe7jee7jue7j+e7kOe7kee7kue7k+e7lOe7lee7lue7l+e7mOe7mee7mue7m+e7nOe7nee7nue7nwor57ug57uh57ui57uj57uk57ul57um57un57uo57up57uq57ur57us57ut57uu57uv57uw57ux57uy57uz57u057u157u257u357u457u557u657u757u857u957u+57u/CivnvIDnvIHnvILnvIPnvITnvIXnvIbnvIfnvIjnvInnvIrnvIvnvIznvI3nvI7nvI/nvJDnvJHnvJLnvJPnvJTnvJXnvJbnvJfnvJjnvJnnvJrnvJvnvJznvJ3nvJ7nvJ8KK+e8oOe8oee8oue8o+e8pOe8pee8pue8p+e8qOe8qee8que8q+e8rOe8ree8rue8r+e8sOe8see8sue8s+e8tOe8tee8tue8t+e8uOe8uee8uue8u+e8vOe8vee8vue8vwor572A572B572C572D572E572F572G572H572I572J572K572L572M572N572O572P572Q572R572S572T572U572V572W572X572Y572Z572a572b572c572d572e572fCivnvaDnvaHnvaLnvaPnvaTnvaXnvabnvafnvajnvannvarnvavnvaznva3nva7nva/nvbDnvbHnvbLnvbPnvbTnvbXnvbbnvbfnvbjnvbnnvbrnvbvnvbznvb3nvb7nvb8KK+e+gOe+gee+gue+g+e+hOe+hee+hue+h+e+iOe+iee+iue+i+e+jOe+jee+jue+j+e+kOe+kee+kue+k+e+lOe+lee+lue+l+e+mOe+mee+mue+m+e+nOe+nee+nue+nwor576g576h576i576j576k576l576m576n576o576p576q576r576s576t576u576v576w576x576y576z5760576157625763576457655766576757685769576+576/Civnv4Dnv4Hnv4Lnv4Pnv4Tnv4Xnv4bnv4fnv4jnv4nnv4rnv4vnv4znv43nv47nv4/nv5Dnv5Hnv5Lnv5Pnv5Tnv5Xnv5bnv5fnv5jnv5nnv5rnv5vnv5znv53nv57nv58KK+e/oOe/oee/oue/o+e/pOe/pee/pue/p+e/qOe/qee/que/q+e/rOe/ree/rue/r+e/sOe/see/sue/s+e/tOe/tee/tue/t+e/uOe/uee/uue/u+e/vOe/vee/vue/vwor6ICA6ICB6ICC6ICD6ICE6ICF6ICG6ICH6ICI6ICJ6ICK6ICL6ICM6ICN6ICO6ICP6ICQ6ICR6ICS6ICT6ICU6ICV6ICW6ICX6ICY6ICZ6ICa6ICb6ICc6ICd6ICe6ICfCivogKDogKHogKLogKPogKTogKXogKbogKfogKjogKnogKrogKvogKzogK3ogK7ogK/ogLDogLHogLLogLPogLTogLXogLbogLfogLjogLnogLrogLvogLzogL3ogL7ogL8KK+iBgOiBgeiBguiBg+iBhOiBheiBhuiBh+iBiOiBieiBiuiBi+iBjOiBjeiBjuiBj+iBkOiBkeiBkuiBk+iBlOiBleiBluiBl+iBmOiBmeiBmuiBm+iBnOiBneiBnuiBnwor6IGg6IGh6IGi6IGj6IGk6IGl6IGm6IGn6IGo6IGp6IGq6IGr6IGs6IGt6IGu6IGv6IGw6IGx6IGy6IGz6IG06IG16IG26IG36IG46IG56IG66IG76IG86IG96IG+6IG/CivogoDogoHogoLogoPogoTogoXogobogofogojogonogorogovogozogo3ogo7ogo/ogpDogpHogpLogpPogpTogpXogpbogpfogpjogpnogprogpvogpzogp3ogp7ogp8KK+iCoOiCoeiCouiCo+iCpOiCpeiCpuiCp+iCqOiCqeiCquiCq+iCrOiCreiCruiCr+iCsOiCseiCsuiCs+iCtOiCteiCtuiCt+iCuOiCueiCuuiCu+iCvOiCveiCvuiCvwor6IOA6IOB6IOC6IOD6IOE6IOF6IOG6IOH6IOI6IOJ6IOK6IOL6IOM6ION6IOO6IOP6IOQ6IOR6IOS6IOT6IOU6IOV6IOW6IOX6IOY6IOZ6IOa6IOb6IOc6IOd6IOe6IOfCivog6Dog6Hog6Log6Pog6Tog6Xog6bog6fog6jog6nog6rog6vog6zog63og67og6/og7Dog7Hog7Log7Pog7Tog7Xog7bog7fog7jog7nog7rog7vog7zog73og77og78KK+iEgOiEgeiEguiEg+iEhOiEheiEhuiEh+iEiOiEieiEiuiEi+iEjOiEjeiEjuiEj+iEkOiEkeiEkuiEk+iElOiEleiEluiEl+iEmOiEmeiEmuiEm+iEnOiEneiEnuiEnwor6ISg6ISh6ISi6ISj6ISk6ISl6ISm6ISn6ISo6ISp6ISq6ISr6ISs6ISt6ISu6ISv6ISw6ISx6ISy6ISz6IS06IS16IS26IS36IS46IS56IS66IS76IS86IS96IS+6IS/CivohYDohYHohYLohYPohYTohYXohYbohYfohYjohYnohYrohYvohYzohY3ohY7ohY/ohZDohZHohZLohZPohZTohZXohZbohZfohZjohZnohZrohZvohZzohZ3ohZ7ohZ8KK+iFoOiFoeiFouiFo+iFpOiFpeiFpuiFp+iFqOiFqeiFquiFq+iFrOiFreiFruiFr+iFsOiFseiFsuiFs+iFtOiFteiFtuiFt+iFuOiFueiFuuiFu+iFvOiFveiFvuiFvwor6IaA6IaB6IaC6IaD6IaE6IaF6IaG6IaH6IaI6IaJ6IaK6IaL6IaM6IaN6IaO6IaP6IaQ6IaR6IaS6IaT6IaU6IaV6IaW6IaX6IaY6IaZ6Iaa6Iab6Iac6Iad6Iae6IafCivohqDohqHohqLohqPohqTohqXohqbohqfohqjohqnohqrohqvohqzohq3ohq7ohq/ohrDohrHohrLohrPohrTohrXohrbohrfohrjohrnohrrohrvohrzohr3ohr7ohr8KK+iHgOiHgeiHguiHg+iHhOiHheiHhuiHh+iHiOiHieiHiuiHi+iHjOiHjeiHjuiHj+iHkOiHkeiHkuiHk+iHlOiHleiHluiHl+iHmOiHmeiHmuiHm+iHnOiHneiHnuiHnwor6Ieg6Ieh6Iei6Iej6Iek6Iel6Iem6Ien6Ieo6Iep6Ieq6Ier6Ies6Iet6Ieu6Iev6Iew6Iex6Iey6Iez6Ie06Ie16Ie26Ie36Ie46Ie56Ie66Ie76Ie86Ie96Ie+6Ie/CivoiIDoiIHoiILoiIPoiIToiIXoiIboiIfoiIjoiInoiIroiIvoiIzoiI3oiI7oiI/oiJDoiJHoiJLoiJPoiJToiJXoiJboiJfoiJjoiJnoiJroiJvoiJzoiJ3oiJ7oiJ8KK+iIoOiIoeiIouiIo+iIpOiIpeiIpuiIp+iIqOiIqeiIquiIq+iIrOiIreiIruiIr+iIsOiIseiIsuiIs+iItOiIteiItuiIt+iIuOiIueiIuuiIu+iIvOiIveiIvuiIvwor6ImA6ImB6ImC6ImD6ImE6ImF6ImG6ImH6ImI6ImJ6ImK6ImL6ImM6ImN6ImO6ImP6ImQ6ImR6ImS6ImT6ImU6ImV6ImW6ImX6ImY6ImZ6Ima6Imb6Imc6Imd6Ime6ImfCivoiaDoiaHoiaLoiaPoiaToiaXoiaboiafoiajoianoiaroiavoiazoia3oia7oia/oibDoibHoibLoibPoibToibXoibboibfoibjoibnoibroibvoibzoib3oib7oib8KK+iKgOiKgeiKguiKg+iKhOiKheiKhuiKh+iKiOiKieiKiuiKi+iKjOiKjeiKjuiKj+iKkOiKkeiKkuiKk+iKlOiKleiKluiKl+iKmOiKmeiKmuiKm+iKnOiKneiKnuiKnwor6Iqg6Iqh6Iqi6Iqj6Iqk6Iql6Iqm6Iqn6Iqo6Iqp6Iqq6Iqr6Iqs6Iqt6Iqu6Iqv6Iqw6Iqx6Iqy6Iqz6Iq06Iq16Iq26Iq36Iq46Iq56Iq66Iq76Iq86Iq96Iq+6Iq/Civoi4Doi4Hoi4Loi4Poi4Toi4Xoi4boi4foi4joi4noi4roi4voi4zoi43oi47oi4/oi5Doi5Hoi5Loi5Poi5Toi5Xoi5boi5foi5joi5noi5roi5voi5zoi53oi57oi58KK+iLoOiLoeiLouiLo+iLpOiLpeiLpuiLp+iLqOiLqeiLquiLq+iLrOiLreiLruiLr+iLsOiLseiLsuiLs+iLtOiLteiLtuiLt+iLuOiLueiLuuiLu+iLvOiLveiLvuiLvwor6IyA6IyB6IyC6IyD6IyE6IyF6IyG6IyH6IyI6IyJ6IyK6IyL6IyM6IyN6IyO6IyP6IyQ6IyR6IyS6IyT6IyU6IyV6IyW6IyX6IyY6IyZ6Iya6Iyb6Iyc6Iyd6Iye6IyfCivojKDojKHojKLojKPojKTojKXojKbojKfojKjojKnojKrojKvojKzojK3ojK7ojK/ojLDojLHojLLojLPojLTojLXojLbojLfojLjojLnojLrojLvojLzojL3ojL7ojL8KK+iNgOiNgeiNguiNg+iNhOiNheiNhuiNh+iNiOiNieiNiuiNi+iNjOiNjeiNjuiNj+iNkOiNkeiNkuiNk+iNlOiNleiNluiNl+iNmOiNmeiNmuiNm+iNnOiNneiNnuiNnwor6I2g6I2h6I2i6I2j6I2k6I2l6I2m6I2n6I2o6I2p6I2q6I2r6I2s6I2t6I2u6I2v6I2w6I2x6I2y6I2z6I206I216I226I236I246I256I266I276I286I296I2+6I2/CivojoDojoHojoLojoPojoTojoXojobojofojojojonojorojovojozojo3ojo7ojo/ojpDojpHojpLojpPojpTojpXojpbojpfojpjojpnojprojpvojpzojp3ojp7ojp8KK+iOoOiOoeiOouiOo+iOpOiOpeiOpuiOp+iOqOiOqeiOquiOq+iOrOiOreiOruiOr+iOsOiOseiOsuiOs+iOtOiOteiOtuiOt+iOuOiOueiOuuiOu+iOvOiOveiOvuiOvwor6I+A6I+B6I+C6I+D6I+E6I+F6I+G6I+H6I+I6I+J6I+K6I+L6I+M6I+N6I+O6I+P6I+Q6I+R6I+S6I+T6I+U6I+V6I+W6I+X6I+Y6I+Z6I+a6I+b6I+c6I+d6I+e6I+fCivoj6Doj6Hoj6Loj6Poj6Toj6Xoj6boj6foj6joj6noj6roj6voj6zoj63oj67oj6/oj7Doj7Hoj7Loj7Poj7Toj7Xoj7boj7foj7joj7noj7roj7voj7zoj73oj77oj78KK+iQgOiQgeiQguiQg+iQhOiQheiQhuiQh+iQiOiQieiQiuiQi+iQjOiQjeiQjuiQj+iQkOiQkeiQkuiQk+iQlOiQleiQluiQl+iQmOiQmeiQmuiQm+iQnOiQneiQnuiQnwor6JCg6JCh6JCi6JCj6JCk6JCl6JCm6JCn6JCo6JCp6JCq6JCr6JCs6JCt6JCu6JCv6JCw6JCx6JCy6JCz6JC06JC16JC26JC36JC46JC56JC66JC76JC86JC96JC+6JC/CivokYDokYHokYLokYPokYTokYXokYbokYfokYjokYnokYrokYvokYzokY3okY7okY/okZDokZHokZLokZPokZTokZXokZbokZfokZjokZnokZrokZvokZzokZ3okZ7okZ8KK+iRoOiRoeiRouiRo+iRpOiRpeiRpuiRp+iRqOiRqeiRquiRq+iRrOiRreiRruiRr+iRsOiRseiRsuiRs+iRtOiRteiRtuiRt+iRuOiRueiRuuiRu+iRvOiRveiRvuiRvwor6JKA6JKB6JKC6JKD6JKE6JKF6JKG6JKH6JKI6JKJ6JKK6JKL6JKM6JKN6JKO6JKP6JKQ6JKR6JKS6JKT6JKU6JKV6JKW6JKX6JKY6JKZ6JKa6JKb6JKc6JKd6JKe6JKfCivokqDokqHokqLokqPokqTokqXokqbokqfokqjokqnokqrokqvokqzokq3okq7okq/okrDokrHokrLokrPokrTokrXokrbokrfokrjokrnokrrokrvokrzokr3okr7okr8KK+iTgOiTgeiTguiTg+iThOiTheiThuiTh+iTiOiTieiTiuiTi+iTjOiTjeiTjuiTj+iTkOiTkeiTkuiTk+iTlOiTleiTluiTl+iTmOiTmeiTmuiTm+iTnOiTneiTnuiTnwor6JOg6JOh6JOi6JOj6JOk6JOl6JOm6JOn6JOo6JOp6JOq6JOr6JOs6JOt6JOu6JOv6JOw6JOx6JOy6JOz6JO06JO16JO26JO36JO46JO56JO66JO76JO86JO96JO+6JO/CivolIDolIHolILolIPolITolIXolIbolIfolIjolInolIrolIvolIzolI3olI7olI/olJDolJHolJLolJPolJTolJXolJbolJfolJjolJnolJrolJvolJzolJ3olJ7olJ8KK+iUoOiUoeiUouiUo+iUpOiUpeiUpuiUp+iUqOiUqeiUquiUq+iUrOiUreiUruiUr+iUsOiUseiUsuiUs+iUtOiUteiUtuiUt+iUuOiUueiUuuiUu+iUvOiUveiUvuiUvwor6JWA6JWB6JWC6JWD6JWE6JWF6JWG6JWH6JWI6JWJ6JWK6JWL6JWM6JWN6JWO6JWP6JWQ6JWR6JWS6JWT6JWU6JWV6JWW6JWX6JWY6JWZ6JWa6JWb6JWc6JWd6JWe6JWfCivolaDolaHolaLolaPolaTolaXolabolafolajolanolarolavolazola3ola7ola/olbDolbHolbLolbPolbTolbXolbbolbfolbjolbnolbrolbvolbzolb3olb7olb8KK+iWgOiWgeiWguiWg+iWhOiWheiWhuiWh+iWiOiWieiWiuiWi+iWjOiWjeiWjuiWj+iWkOiWkeiWkuiWk+iWlOiWleiWluiWl+iWmOiWmeiWmuiWm+iWnOiWneiWnuiWnwor6Jag6Jah6Jai6Jaj6Jak6Jal6Jam6Jan6Jao6Jap6Jaq6Jar6Jas6Jat6Jau6Jav6Jaw6Jax6Jay6Jaz6Ja06Ja16Ja26Ja36Ja46Ja56Ja66Ja76Ja86Ja96Ja+6Ja/Civol4Dol4Hol4Lol4Pol4Tol4Xol4bol4fol4jol4nol4rol4vol4zol43ol47ol4/ol5Dol5Hol5Lol5Pol5Tol5Xol5bol5fol5jol5nol5rol5vol5zol53ol57ol58KK+iXoOiXoeiXouiXo+iXpOiXpeiXpuiXp+iXqOiXqeiXquiXq+iXrOiXreiXruiXr+iXsOiXseiXsuiXs+iXtOiXteiXtuiXt+iXuOiXueiXuuiXu+iXvOiXveiXvuiXvwor6JiA6JiB6JiC6JiD6JiE6JiF6JiG6JiH6JiI6JiJ6JiK6JiL6JiM6JiN6JiO6JiP6JiQ6JiR6JiS6JiT6JiU6JiV6JiW6JiX6JiY6JiZ6Jia6Jib6Jic6Jid6Jie6JifCivomKDomKHomKLomKPomKTomKXomKbomKfomKjomKnomKromKvomKzomK3omK7omK/omLDomLHomLLomLPomLTomLXomLbomLfomLjomLnomLromLvomLzomL3omL7omL8KK+iZgOiZgeiZguiZg+iZhOiZheiZhuiZh+iZiOiZieiZiuiZi+iZjOiZjeiZjuiZj+iZkOiZkeiZkuiZk+iZlOiZleiZluiZl+iZmOiZmeiZmuiZm+iZnOiZneiZnuiZnwor6Jmg6Jmh6Jmi6Jmj6Jmk6Jml6Jmm6Jmn6Jmo6Jmp6Jmq6Jmr6Jms6Jmt6Jmu6Jmv6Jmw6Jmx6Jmy6Jmz6Jm06Jm16Jm26Jm36Jm46Jm56Jm66Jm76Jm86Jm96Jm+6Jm/CivomoDomoHomoLomoPomoTomoXomobomofomojomonomoromovomozomo3omo7omo/ompDompHompLompPompTompXompbompfompjompnomprompvompzomp3omp7omp8KK+iaoOiaoeiaouiao+iapOiapeiapuiap+iaqOiaqeiaquiaq+iarOiareiaruiar+iasOiaseiasuias+iatOiateiatuiat+iauOiaueiauuiau+iavOiaveiavuiavwor6JuA6JuB6JuC6JuD6JuE6JuF6JuG6JuH6JuI6JuJ6JuK6JuL6JuM6JuN6JuO6JuP6JuQ6JuR6JuS6JuT6JuU6JuV6JuW6JuX6JuY6JuZ6Jua6Jub6Juc6Jud6Jue6JufCivom6Dom6Hom6Lom6Pom6Tom6Xom6bom6fom6jom6nom6rom6vom6zom63om67om6/om7Dom7Hom7Lom7Pom7Tom7Xom7bom7fom7jom7nom7rom7vom7zom73om77om78KK+icgOicgeicguicg+ichOicheichuich+iciOicieiciuici+icjOicjeicjuicj+ickOickeickuick+iclOicleicluicl+icmOicmeicmuicm+icnOicneicnuicnwor6Jyg6Jyh6Jyi6Jyj6Jyk6Jyl6Jym6Jyn6Jyo6Jyp6Jyq6Jyr6Jys6Jyt6Jyu6Jyv6Jyw6Jyx6Jyy6Jyz6Jy06Jy16Jy26Jy36Jy46Jy56Jy66Jy76Jy86Jy96Jy+6Jy/CivonYDonYHonYLonYPonYTonYXonYbonYfonYjonYnonYronYvonYzonY3onY7onY/onZDonZHonZLonZPonZTonZXonZbonZfonZjonZnonZronZvonZzonZ3onZ7onZ8KK+idoOidoeidouido+idpOidpeidpuidp+idqOidqeidquidq+idrOidreidruidr+idsOidseidsuids+idtOidteidtuidt+iduOidueiduuidu+idvOidveidvuidvwor6J6A6J6B6J6C6J6D6J6E6J6F6J6G6J6H6J6I6J6J6J6K6J6L6J6M6J6N6J6O6J6P6J6Q6J6R6J6S6J6T6J6U6J6V6J6W6J6X6J6Y6J6Z6J6a6J6b6J6c6J6d6J6e6J6fCivonqDonqHonqLonqPonqTonqXonqbonqfonqjonqnonqronqvonqzonq3onq7onq/onrDonrHonrLonrPonrTonrXonrbonrfonrjonrnonrronrvonrzonr3onr7onr8KK+ifgOifgeifguifg+ifhOifheifhuifh+ifiOifieifiuifi+ifjOifjeifjuifj+ifkOifkeifkuifk+iflOifleifluifl+ifmOifmeifmuifm+ifnOifneifnuifnwor6J+g6J+h6J+i6J+j6J+k6J+l6J+m6J+n6J+o6J+p6J+q6J+r6J+s6J+t6J+u6J+v6J+w6J+x6J+y6J+z6J+06J+16J+26J+36J+46J+56J+66J+76J+86J+96J++6J+/CivooIDooIHooILooIPooITooIXooIbooIfooIjooInooIrooIvooIzooI3ooI7ooI/ooJDooJHooJLooJPooJTooJXooJbooJfooJjooJnooJrooJvooJzooJ3ooJ7ooJ8KK+igoOigoeigouigo+igpOigpeigpuigp+igqOigqeigquigq+igrOigreigruigr+igsOigseigsuigs+igtOigteigtuigt+iguOigueiguuigu+igvOigveigvuigvwor6KGA6KGB6KGC6KGD6KGE6KGF6KGG6KGH6KGI6KGJ6KGK6KGL6KGM6KGN6KGO6KGP6KGQ6KGR6KGS6KGT6KGU6KGV6KGW6KGX6KGY6KGZ6KGa6KGb6KGc6KGd6KGe6KGfCivooaDooaHooaLooaPooaTooaXooabooafooajooanooarooavooazooa3ooa7ooa/oobDoobHoobLoobPoobToobXoobboobfoobjoobnoobroobvoobzoob3oob7oob8KK+iigOiigeiiguiig+iihOiiheiihuiih+iiiOiiieiiiuiii+iijOiijeiijuiij+iikOiikeiikuiik+iilOiileiiluiil+iimOiimeiimuiim+iinOiineiinuiinwor6KKg6KKh6KKi6KKj6KKk6KKl6KKm6KKn6KKo6KKp6KKq6KKr6KKs6KKt6KKu6KKv6KKw6KKx6KKy6KKz6KK06KK16KK26KK36KK46KK56KK66KK76KK86KK96KK+6KK/Civoo4Doo4Hoo4Loo4Poo4Too4Xoo4boo4foo4joo4noo4roo4voo4zoo43oo47oo4/oo5Doo5Hoo5Loo5Poo5Too5Xoo5boo5foo5joo5noo5roo5voo5zoo53oo57oo58KK+ijoOijoeijouijo+ijpOijpeijpuijp+ijqOijqeijquijq+ijrOijreijruijr+ijsOijseijsuijs+ijtOijteijtuijt+ijuOijueijuuiju+ijvOijveijvuijvwor6KSA6KSB6KSC6KSD6KSE6KSF6KSG6KSH6KSI6KSJ6KSK6KSL6KSM6KSN6KSO6KSP6KSQ6KSR6KSS6KST6KSU6KSV6KSW6KSX6KSY6KSZ6KSa6KSb6KSc6KSd6KSe6KSfCivopKDopKHopKLopKPopKTopKXopKbopKfopKjopKnopKropKvopKzopK3opK7opK/opLDopLHopLLopLPopLTopLXopLbopLfopLjopLnopLropLvopLzopL3opL7opL8KK+ilgOilgeilguilg+ilhOilheilhuilh+iliOilieiliuili+iljOiljeiljuilj+ilkOilkeilkuilk+illOilleilluill+ilmOilmeilmuilm+ilnOilneilnuilnwor6KWg6KWh6KWi6KWj6KWk6KWl6KWm6KWn6KWo6KWp6KWq6KWr6KWs6KWt6KWu6KWv6KWw6KWx6KWy6KWz6KW06KW16KW26KW36KW46KW56KW66KW76KW86KW96KW+6KW/CivopoDopoHopoLopoPopoTopoXopobopofopojoponoporopovopozopo3opo7opo/oppDoppHoppLoppPoppToppXoppboppfoppjoppnopproppvoppzopp3opp7opp8KK+imoOimoeimouimo+impOimpeimpuimp+imqOimqeimquimq+imrOimreimruimr+imsOimseimsuims+imtOimteimtuimt+imuOimueimuuimu+imvOimveimvuimvwor6KeA6KeB6KeC6KeD6KeE6KeF6KeG6KeH6KeI6KeJ6KeK6KeL6KeM6KeN6KeO6KeP6KeQ6KeR6KeS6KeT6KeU6KeV6KeW6KeX6KeY6KeZ6Kea6Keb6Kec6Ked6Kee6KefCivop6Dop6Hop6Lop6Pop6Top6Xop6bop6fop6jop6nop6rop6vop6zop63op67op6/op7Dop7Hop7Lop7Pop7Top7Xop7bop7fop7jop7nop7rop7vop7zop73op77op78KK+iogOiogeioguiog+iohOioheiohuioh+ioiOioieioiuioi+iojOiojeiojuioj+iokOiokeiokuiok+iolOioleioluiol+iomOiomeiomuiom+ionOioneionuionwor6Kig6Kih6Kii6Kij6Kik6Kil6Kim6Kin6Kio6Kip6Kiq6Kir6Kis6Kit6Kiu6Kiv6Kiw6Kix6Kiy6Kiz6Ki06Ki16Ki26Ki36Ki46Ki56Ki66Ki76Ki86Ki96Ki+6Ki/CivoqYDoqYHoqYLoqYPoqYToqYXoqYboqYfoqYjoqYnoqYroqYvoqYzoqY3oqY7oqY/oqZDoqZHoqZLoqZPoqZToqZXoqZboqZfoqZjoqZnoqZroqZvoqZzoqZ3oqZ7oqZ8KK+ipoOipoeipouipo+ippOippeippuipp+ipqOipqeipquipq+iprOipreipruipr+ipsOipseipsuips+iptOipteiptuipt+ipuOipueipuuipu+ipvOipveipvuipvwor6KqA6KqB6KqC6KqD6KqE6KqF6KqG6KqH6KqI6KqJ6KqK6KqL6KqM6KqN6KqO6KqP6KqQ6KqR6KqS6KqT6KqU6KqV6KqW6KqX6KqY6KqZ6Kqa6Kqb6Kqc6Kqd6Kqe6KqfCivoqqDoqqHoqqLoqqPoqqToqqXoqqboqqfoqqjoqqnoqqroqqvoqqzoqq3oqq7oqq/oqrDoqrHoqrLoqrPoqrToqrXoqrboqrfoqrjoqrnoqrroqrvoqrzoqr3oqr7oqr8KK+irgOirgeirguirg+irhOirheirhuirh+iriOirieiriuiri+irjOirjeirjuirj+irkOirkeirkuirk+irlOirleirluirl+irmOirmeirmuirm+irnOirneirnuirnwor6Kug6Kuh6Kui6Kuj6Kuk6Kul6Kum6Kun6Kuo6Kup6Kuq6Kur6Kus6Kut6Kuu6Kuv6Kuw6Kux6Kuy6Kuz6Ku06Ku16Ku26Ku36Ku46Ku56Ku66Ku76Ku86Ku96Ku+6Ku/CivorIDorIHorILorIPorITorIXorIborIforIjorInorIrorIvorIzorI3orI7orI/orJDorJHorJLorJPorJTorJXorJborJforJjorJnorJrorJvorJzorJ3orJ7orJ8KK+isoOisoeisouiso+ispOispeispuisp+isqOisqeisquisq+isrOisreisruisr+issOisseissuiss+istOisteistuist+isuOisueisuuisu+isvOisveisvuisvwor6K2A6K2B6K2C6K2D6K2E6K2F6K2G6K2H6K2I6K2J6K2K6K2L6K2M6K2N6K2O6K2P6K2Q6K2R6K2S6K2T6K2U6K2V6K2W6K2X6K2Y6K2Z6K2a6K2b6K2c6K2d6K2e6K2fCivoraDoraHoraLoraPoraToraXoraboraforajoranoraroravorazora3ora7ora/orbDorbHorbLorbPorbTorbXorbborbforbjorbnorbrorbvorbzorb3orb7orb8KK+iugOiugeiuguiug+iuhOiuheiuhuiuh+iuiOiuieiuiuiui+iujOiujeiujuiuj+iukOiukeiukuiuk+iulOiuleiuluiul+iumOiumeiumuium+iunOiuneiunuiunwor6K6g6K6h6K6i6K6j6K6k6K6l6K6m6K6n6K6o6K6p6K6q6K6r6K6s6K6t6K6u6K6v6K6w6K6x6K6y6K6z6K606K616K626K636K646K656K666K676K686K696K6+6K6/Civor4Dor4Hor4Lor4Por4Tor4Xor4bor4for4jor4nor4ror4vor4zor43or47or4/or5Dor5Hor5Lor5Por5Tor5Xor5bor5for5jor5nor5ror5vor5zor53or57or58KK+ivoOivoeivouivo+ivpOivpeivpuivp+ivqOivqeivquivq+ivrOivreivruivr+ivsOivseivsuivs+ivtOivteivtuivt+ivuOivueivuuivu+ivvOivveivvuivvwor6LCA6LCB6LCC6LCD6LCE6LCF6LCG6LCH6LCI6LCJ6LCK6LCL6LCM6LCN6LCO6LCP6LCQ6LCR6LCS6LCT6LCU6LCV6LCW6LCX6LCY6LCZ6LCa6LCb6LCc6LCd6LCe6LCfCivosKDosKHosKLosKPosKTosKXosKbosKfosKjosKnosKrosKvosKzosK3osK7osK/osLDosLHosLLosLPosLTosLXosLbosLfosLjosLnosLrosLvosLzosL3osL7osL8KK+ixgOixgeixguixg+ixhOixheixhuixh+ixiOixieixiuixi+ixjOixjeixjuixj+ixkOixkeixkuixk+ixlOixleixluixl+ixmOixmeixmuixm+ixnOixneixnuixnwor6LGg6LGh6LGi6LGj6LGk6LGl6LGm6LGn6LGo6LGp6LGq6LGr6LGs6LGt6LGu6LGv6LGw6LGx6LGy6LGz6LG06LG16LG26LG36LG46LG56LG66LG76LG86LG96LG+6LG/CivosoDosoHosoLosoPosoTosoXosobosofosojosonosorosovosozoso3oso7oso/ospDospHospLospPospTospXospbospfospjospnosprospvospzosp3osp7osp8KK+iyoOiyoeiyouiyo+iypOiypeiypuiyp+iyqOiyqeiyquiyq+iyrOiyreiyruiyr+iysOiyseiysuiys+iytOiyteiytuiyt+iyuOiyueiyuuiyu+iyvOiyveiyvuiyvwor6LOA6LOB6LOC6LOD6LOE6LOF6LOG6LOH6LOI6LOJ6LOK6LOL6LOM6LON6LOO6LOP6LOQ6LOR6LOS6LOT6LOU6LOV6LOW6LOX6LOY6LOZ6LOa6LOb6LOc6LOd6LOe6LOfCivos6Dos6Hos6Los6Pos6Tos6Xos6bos6fos6jos6nos6ros6vos6zos63os67os6/os7Dos7Hos7Los7Pos7Tos7Xos7bos7fos7jos7nos7ros7vos7zos73os77os78KK+i0gOi0gei0gui0g+i0hOi0hei0hui0h+i0iOi0iei0iui0i+i0jOi0jei0jui0j+i0kOi0kei0kui0k+i0lOi0lei0lui0l+i0mOi0mei0mui0m+i0nOi0nei0nui0nwor6LSg6LSh6LSi6LSj6LSk6LSl6LSm6LSn6LSo6LSp6LSq6LSr6LSs6LSt6LSu6LSv6LSw6LSx6LSy6LSz6LS06LS16LS26LS36LS46LS56LS66LS76LS86LS96LS+6LS/CivotYDotYHotYLotYPotYTotYXotYbotYfotYjotYnotYrotYvotYzotY3otY7otY/otZDotZHotZLotZPotZTotZXotZbotZfotZjotZnotZrotZvotZzotZ3otZ7otZ8KK+i1oOi1oei1oui1o+i1pOi1pei1pui1p+i1qOi1qei1qui1q+i1rOi1rei1rui1r+i1sOi1sei1sui1s+i1tOi1tei1tui1t+i1uOi1uei1uui1u+i1vOi1vei1vui1vwor6LaA6LaB6LaC6LaD6LaE6LaF6LaG6LaH6LaI6LaJ6LaK6LaL6LaM6LaN6LaO6LaP6LaQ6LaR6LaS6LaT6LaU6LaV6LaW6LaX6LaY6LaZ6Laa6Lab6Lac6Lad6Lae6LafCivotqDotqHotqLotqPotqTotqXotqbotqfotqjotqnotqrotqvotqzotq3otq7otq/otrDotrHotrLotrPotrTotrXotrbotrfotrjotrnotrrotrvotrzotr3otr7otr8KK+i3gOi3gei3gui3g+i3hOi3hei3hui3h+i3iOi3iei3iui3i+i3jOi3jei3jui3j+i3kOi3kei3kui3k+i3lOi3lei3lui3l+i3mOi3mei3mui3m+i3nOi3nei3nui3nwor6Leg6Leh6Lei6Lej6Lek6Lel6Lem6Len6Leo6Lep6Leq6Ler6Les6Let6Leu6Lev6Lew6Lex6Ley6Lez6Le06Le16Le26Le36Le46Le56Le66Le76Le86Le96Le+6Le/CivouIDouIHouILouIPouITouIXouIbouIfouIjouInouIrouIvouIzouI3ouI7ouI/ouJDouJHouJLouJPouJTouJXouJbouJfouJjouJnouJrouJvouJzouJ3ouJ7ouJ8KK+i4oOi4oei4oui4o+i4pOi4pei4pui4p+i4qOi4qei4qui4q+i4rOi4rei4rui4r+i4sOi4sei4sui4s+i4tOi4tei4tui4t+i4uOi4uei4uui4u+i4vOi4vei4vui4vwor6LmA6LmB6LmC6LmD6LmE6LmF6LmG6LmH6LmI6LmJ6LmK6LmL6LmM6LmN6LmO6LmP6LmQ6LmR6LmS6LmT6LmU6LmV6LmW6LmX6LmY6LmZ6Lma6Lmb6Lmc6Lmd6Lme6LmfCivouaDouaHouaLouaPouaTouaXouabouafouajouanouarouavouazoua3oua7oua/oubDoubHoubLoubPoubToubXoubboubfoubjoubnoubroubvoubzoub3oub7oub8KK+i6gOi6gei6gui6g+i6hOi6hei6hui6h+i6iOi6iei6iui6i+i6jOi6jei6jui6j+i6kOi6kei6kui6k+i6lOi6lei6lui6l+i6mOi6mei6mui6m+i6nOi6nei6nui6nwor6Lqg6Lqh6Lqi6Lqj6Lqk6Lql6Lqm6Lqn6Lqo6Lqp6Lqq6Lqr6Lqs6Lqt6Lqu6Lqv6Lqw6Lqx6Lqy6Lqz6Lq06Lq16Lq26Lq36Lq46Lq56Lq66Lq76Lq86Lq96Lq+6Lq/Civou4Dou4Hou4Lou4Pou4Tou4Xou4bou4fou4jou4nou4rou4vou4zou43ou47ou4/ou5Dou5Hou5Lou5Pou5Tou5Xou5bou5fou5jou5nou5rou5vou5zou53ou57ou58KK+i7oOi7oei7oui7o+i7pOi7pei7pui7p+i7qOi7qei7qui7q+i7rOi7rei7rui7r+i7sOi7sei7sui7s+i7tOi7tei7tui7t+i7uOi7uei7uui7u+i7vOi7vei7vui7vwor6LyA6LyB6LyC6LyD6LyE6LyF6LyG6LyH6LyI6LyJ6LyK6LyL6LyM6LyN6LyO6LyP6LyQ6LyR6LyS6LyT6LyU6LyV6LyW6LyX6LyY6LyZ6Lya6Lyb6Lyc6Lyd6Lye6LyfCivovKDovKHovKLovKPovKTovKXovKbovKfovKjovKnovKrovKvovKzovK3ovK7ovK/ovLDovLHovLLovLPovLTovLXovLbovLfovLjovLnovLrovLvovLzovL3ovL7ovL8KK+i9gOi9gei9gui9g+i9hOi9hei9hui9h+i9iOi9iei9iui9i+i9jOi9jei9jui9j+i9kOi9kei9kui9k+i9lOi9lei9lui9l+i9mOi9mei9mui9m+i9nOi9nei9nui9nwor6L2g6L2h6L2i6L2j6L2k6L2l6L2m6L2n6L2o6L2p6L2q6L2r6L2s6L2t6L2u6L2v6L2w6L2x6L2y6L2z6L206L216L226L236L246L256L266L276L286L296L2+6L2/CivovoDovoHovoLovoPovoTovoXovobovofovojovonovorovovovozovo3ovo7ovo/ovpDovpHovpLovpPovpTovpXovpbovpfovpjovpnovprovpvovpzovp3ovp7ovp8KK+i+oOi+oei+oui+o+i+pOi+pei+pui+p+i+qOi+qei+qui+q+i+rOi+rei+rui+r+i+sOi+sei+sui+s+i+tOi+tei+tui+t+i+uOi+uei+uui+u+i+vOi+vei+vui+vwor6L+A6L+B6L+C6L+D6L+E6L+F6L+G6L+H6L+I6L+J6L+K6L+L6L+M6L+N6L+O6L+P6L+Q6L+R6L+S6L+T6L+U6L+V6L+W6L+X6L+Y6L+Z6L+a6L+b6L+c6L+d6L+e6L+fCivov6Dov6Hov6Lov6Pov6Tov6Xov6bov6fov6jov6nov6rov6vov6zov63ov67ov6/ov7Dov7Hov7Lov7Pov7Tov7Xov7bov7fov7jov7nov7rov7vov7zov73ov77ov78KK+mAgOmAgemAgumAg+mAhOmAhemAhumAh+mAiOmAiemAiumAi+mAjOmAjemAjumAj+mAkOmAkemAkumAk+mAlOmAlemAlumAl+mAmOmAmemAmumAm+mAnOmAnemAnumAnwor6YCg6YCh6YCi6YCj6YCk6YCl6YCm6YCn6YCo6YCp6YCq6YCr6YCs6YCt6YCu6YCv6YCw6YCx6YCy6YCz6YC06YC16YC26YC36YC46YC56YC66YC76YC86YC96YC+6YC/CivpgYDpgYHpgYLpgYPpgYTpgYXpgYbpgYfpgYjpgYnpgYrpgYvpgYzpgY3pgY7pgY/pgZDpgZHpgZLpgZPpgZTpgZXpgZbpgZfpgZjpgZnpgZrpgZvpgZzpgZ3pgZ7pgZ8KK+mBoOmBoemBoumBo+mBpOmBpemBpumBp+mBqOmBqemBqumBq+mBrOmBremBrumBr+mBsOmBsemBsumBs+mBtOmBtemBtumBt+mBuOmBuemBuumBu+mBvOmBvemBvumBvwor6YKA6YKB6YKC6YKD6YKE6YKF6YKG6YKH6YKI6YKJ6YKK6YKL6YKM6YKN6YKO6YKP6YKQ6YKR6YKS6YKT6YKU6YKV6YKW6YKX6YKY6YKZ6YKa6YKb6YKc6YKd6YKe6YKfCivpgqDpgqHpgqLpgqPpgqTpgqXpgqbpgqfpgqjpgqnpgqrpgqvpgqzpgq3pgq7pgq/pgrDpgrHpgrLpgrPpgrTpgrXpgrbpgrfpgrjpgrnpgrrpgrvpgrzpgr3pgr7pgr8KK+mDgOmDgemDgumDg+mDhOmDhemDhumDh+mDiOmDiemDiumDi+mDjOmDjemDjumDj+mDkOmDkemDkumDk+mDlOmDlemDlumDl+mDmOmDmemDmumDm+mDnOmDnemDnumDnwor6YOg6YOh6YOi6YOj6YOk6YOl6YOm6YOn6YOo6YOp6YOq6YOr6YOs6YOt6YOu6YOv6YOw6YOx6YOy6YOz6YO06YO16YO26YO36YO46YO56YO66YO76YO86YO96YO+6YO/CivphIDphIHphILphIPphITphIXphIbphIfphIjphInphIrphIvphIzphI3phI7phI/phJDphJHphJLphJPphJTphJXphJbphJfphJjphJnphJrphJvphJzphJ3phJ7phJ8KK+mEoOmEoemEoumEo+mEpOmEpemEpumEp+mEqOmEqemEqumEq+mErOmEremErumEr+mEsOmEsemEsumEs+mEtOmEtemEtumEt+mEuOmEuemEuumEu+mEvOmEvemEvumEvwor6YWA6YWB6YWC6YWD6YWE6YWF6YWG6YWH6YWI6YWJ6YWK6YWL6YWM6YWN6YWO6YWP6YWQ6YWR6YWS6YWT6YWU6YWV6YWW6YWX6YWY6YWZ6YWa6YWb6YWc6YWd6YWe6YWfCivphaDphaHphaLphaPphaTphaXphabphafphajphanpharphavphazpha3pha7pha/phbDphbHphbLphbPphbTphbXphbbphbfphbjphbnphbrphbvphbzphb3phb7phb8KK+mGgOmGgemGgumGg+mGhOmGhemGhumGh+mGiOmGiemGiumGi+mGjOmGjemGjumGj+mGkOmGkemGkumGk+mGlOmGlemGlumGl+mGmOmGmemGmumGm+mGnOmGnemGnumGnwor6Yag6Yah6Yai6Yaj6Yak6Yal6Yam6Yan6Yao6Yap6Yaq6Yar6Yas6Yat6Yau6Yav6Yaw6Yax6Yay6Yaz6Ya06Ya16Ya26Ya36Ya46Ya56Ya66Ya76Ya86Ya96Ya+6Ya/Civph4Dph4Hph4Lph4Pph4Tph4Xph4bph4fph4jph4nph4rph4vph4zph43ph47ph4/ph5Dph5Hph5Lph5Pph5Tph5Xph5bph5fph5jph5nph5rph5vph5zph53ph57ph58KK+mHoOmHoemHoumHo+mHpOmHpemHpumHp+mHqOmHqemHqumHq+mHrOmHremHrumHr+mHsOmHsemHsumHs+mHtOmHtemHtumHt+mHuOmHuemHuumHu+mHvOmHvemHvumHvwor6YiA6YiB6YiC6YiD6YiE6YiF6YiG6YiH6YiI6YiJ6YiK6YiL6YiM6YiN6YiO6YiP6YiQ6YiR6YiS6YiT6YiU6YiV6YiW6YiX6YiY6YiZ6Yia6Yib6Yic6Yid6Yie6YifCivpiKDpiKHpiKLpiKPpiKTpiKXpiKbpiKfpiKjpiKnpiKrpiKvpiKzpiK3piK7piK/piLDpiLHpiLLpiLPpiLTpiLXpiLbpiLfpiLjpiLnpiLrpiLvpiLzpiL3piL7piL8KK+mJgOmJgemJgumJg+mJhOmJhemJhumJh+mJiOmJiemJiumJi+mJjOmJjemJjumJj+mJkOmJkemJkumJk+mJlOmJlemJlumJl+mJmOmJmemJmumJm+mJnOmJnemJnumJnwor6Ymg6Ymh6Ymi6Ymj6Ymk6Yml6Ymm6Ymn6Ymo6Ymp6Ymq6Ymr6Yms6Ymt6Ymu6Ymv6Ymw6Ymx6Ymy6Ymz6Ym06Ym16Ym26Ym36Ym46Ym56Ym66Ym76Ym86Ym96Ym+6Ym/CivpioDpioHpioLpioPpioTpioXpiobpiofpiojpionpiorpiovpiozpio3pio7pio/pipDpipHpipLpipPpipTpipXpipbpipfpipjpipnpiprpipvpipzpip3pip7pip8KK+mKoOmKoemKoumKo+mKpOmKpemKpumKp+mKqOmKqemKqumKq+mKrOmKremKrumKr+mKsOmKsemKsumKs+mKtOmKtemKtumKt+mKuOmKuemKuumKu+mKvOmKvemKvumKvwor6YuA6YuB6YuC6YuD6YuE6YuF6YuG6YuH6YuI6YuJ6YuK6YuL6YuM6YuN6YuO6YuP6YuQ6YuR6YuS6YuT6YuU6YuV6YuW6YuX6YuY6YuZ6Yua6Yub6Yuc6Yud6Yue6YufCivpi6Dpi6Hpi6Lpi6Ppi6Tpi6Xpi6bpi6fpi6jpi6npi6rpi6vpi6zpi63pi67pi6/pi7Dpi7Hpi7Lpi7Ppi7Tpi7Xpi7bpi7fpi7jpi7npi7rpi7vpi7zpi73pi77pi78KK+mMgOmMgemMgumMg+mMhOmMhemMhumMh+mMiOmMiemMiumMi+mMjOmMjemMjumMj+mMkOmMkemMkumMk+mMlOmMlemMlumMl+mMmOmMmemMmumMm+mMnOmMnemMnumMnwor6Yyg6Yyh6Yyi6Yyj6Yyk6Yyl6Yym6Yyn6Yyo6Yyp6Yyq6Yyr6Yys6Yyt6Yyu6Yyv6Yyw6Yyx6Yyy6Yyz6Yy06Yy16Yy26Yy36Yy46Yy56Yy66Yy76Yy86Yy96Yy+6Yy/CivpjYDpjYHpjYLpjYPpjYTpjYXpjYbpjYfpjYjpjYnpjYrpjYvpjYzpjY3pjY7pjY/pjZDpjZHpjZLpjZPpjZTpjZXpjZbpjZfpjZjpjZnpjZrpjZvpjZzpjZ3pjZ7pjZ8KK+mNoOmNoemNoumNo+mNpOmNpemNpumNp+mNqOmNqemNqumNq+mNrOmNremNrumNr+mNsOmNsemNsumNs+mNtOmNtemNtumNt+mNuOmNuemNuumNu+mNvOmNvemNvumNvwor6Y6A6Y6B6Y6C6Y6D6Y6E6Y6F6Y6G6Y6H6Y6I6Y6J6Y6K6Y6L6Y6M6Y6N6Y6O6Y6P6Y6Q6Y6R6Y6S6Y6T6Y6U6Y6V6Y6W6Y6X6Y6Y6Y6Z6Y6a6Y6b6Y6c6Y6d6Y6e6Y6fCivpjqDpjqHpjqLpjqPpjqTpjqXpjqbpjqfpjqjpjqnpjqrpjqvpjqzpjq3pjq7pjq/pjrDpjrHpjrLpjrPpjrTpjrXpjrbpjrfpjrjpjrnpjrrpjrvpjrzpjr3pjr7pjr8KK+mPgOmPgemPgumPg+mPhOmPhemPhumPh+mPiOmPiemPiumPi+mPjOmPjemPjumPj+mPkOmPkemPkumPk+mPlOmPlemPlumPl+mPmOmPmemPmumPm+mPnOmPnemPnumPnwor6Y+g6Y+h6Y+i6Y+j6Y+k6Y+l6Y+m6Y+n6Y+o6Y+p6Y+q6Y+r6Y+s6Y+t6Y+u6Y+v6Y+w6Y+x6Y+y6Y+z6Y+06Y+16Y+26Y+36Y+46Y+56Y+66Y+76Y+86Y+96Y++6Y+/CivpkIDpkIHpkILpkIPpkITpkIXpkIbpkIfpkIjpkInpkIrpkIvpkIzpkI3pkI7pkI/pkJDpkJHpkJLpkJPpkJTpkJXpkJbpkJfpkJjpkJnpkJrpkJvpkJzpkJ3pkJ7pkJ8KK+mQoOmQoemQoumQo+mQpOmQpemQpumQp+mQqOmQqemQqumQq+mQrOmQremQrumQr+mQsOmQsemQsumQs+mQtOmQtemQtumQt+mQuOmQuemQuumQu+mQvOmQvemQvumQvwor6ZGA6ZGB6ZGC6ZGD6ZGE6ZGF6ZGG6ZGH6ZGI6ZGJ6ZGK6ZGL6ZGM6ZGN6ZGO6ZGP6ZGQ6ZGR6ZGS6ZGT6ZGU6ZGV6ZGW6ZGX6ZGY6ZGZ6ZGa6ZGb6ZGc6ZGd6ZGe6ZGfCivpkaDpkaHpkaLpkaPpkaTpkaXpkabpkafpkajpkanpkarpkavpkazpka3pka7pka/pkbDpkbHpkbLpkbPpkbTpkbXpkbbpkbfpkbjpkbnpkbrpkbvpkbzpkb3pkb7pkb8KK+mSgOmSgemSgumSg+mShOmShemShumSh+mSiOmSiemSiumSi+mSjOmSjemSjumSj+mSkOmSkemSkumSk+mSlOmSlemSlumSl+mSmOmSmemSmumSm+mSnOmSnemSnumSnwor6ZKg6ZKh6ZKi6ZKj6ZKk6ZKl6ZKm6ZKn6ZKo6ZKp6ZKq6ZKr6ZKs6ZKt6ZKu6ZKv6ZKw6ZKx6ZKy6ZKz6ZK06ZK16ZK26ZK36ZK46ZK56ZK66ZK76ZK86ZK96ZK+6ZK/Civpk4Dpk4Hpk4Lpk4Ppk4Tpk4Xpk4bpk4fpk4jpk4npk4rpk4vpk4zpk43pk47pk4/pk5Dpk5Hpk5Lpk5Ppk5Tpk5Xpk5bpk5fpk5jpk5npk5rpk5vpk5zpk53pk57pk58KK+mToOmToemToumTo+mTpOmTpemTpumTp+mTqOmTqemTqumTq+mTrOmTremTrumTr+mTsOmTsemTsumTs+mTtOmTtemTtumTt+mTuOmTuemTuumTu+mTvOmTvemTvumTvwor6ZSA6ZSB6ZSC6ZSD6ZSE6ZSF6ZSG6ZSH6ZSI6ZSJ6ZSK6ZSL6ZSM6ZSN6ZSO6ZSP6ZSQ6ZSR6ZSS6ZST6ZSU6ZSV6ZSW6ZSX6ZSY6ZSZ6ZSa6ZSb6ZSc6ZSd6ZSe6ZSfCivplKDplKHplKLplKPplKTplKXplKbplKfplKjplKnplKrplKvplKzplK3plK7plK/plLDplLHplLLplLPplLTplLXplLbplLfplLjplLnplLrplLvplLzplL3plL7plL8KK+mVgOmVgemVgumVg+mVhOmVhemVhumVh+mViOmViemViumVi+mVjOmVjemVjumVj+mVkOmVkemVkumVk+mVlOmVlemVlumVl+mVmOmVmemVmumVm+mVnOmVnemVnumVnwor6ZWg6ZWh6ZWi6ZWj6ZWk6ZWl6ZWm6ZWn6ZWo6ZWp6ZWq6ZWr6ZWs6ZWt6ZWu6ZWv6ZWw6ZWx6ZWy6ZWz6ZW06ZW16ZW26ZW36ZW46ZW56ZW66ZW76ZW86ZW96ZW+6ZW/CivploDploHploLploPploTploXplobplofplojplonplorplovplozplo3plo7plo/plpDplpHplpLplpPplpTplpXplpbplpfplpjplpnplprplpvplpzplp3plp7plp8KK+mWoOmWoemWoumWo+mWpOmWpemWpumWp+mWqOmWqemWqumWq+mWrOmWremWrumWr+mWsOmWsemWsumWs+mWtOmWtemWtumWt+mWuOmWuemWuumWu+mWvOmWvemWvumWvwor6ZeA6ZeB6ZeC6ZeD6ZeE6ZeF6ZeG6ZeH6ZeI6ZeJ6ZeK6ZeL6ZeM6ZeN6ZeO6ZeP6ZeQ6ZeR6ZeS6ZeT6ZeU6ZeV6ZeW6ZeX6ZeY6ZeZ6Zea6Zeb6Zec6Zed6Zee6ZefCivpl6Dpl6Hpl6Lpl6Ppl6Tpl6Xpl6bpl6fpl6jpl6npl6rpl6vpl6zpl63pl67pl6/pl7Dpl7Hpl7Lpl7Ppl7Tpl7Xpl7bpl7fpl7jpl7npl7rpl7vpl7zpl73pl77pl78KK+mYgOmYgemYgumYg+mYhOmYhemYhumYh+mYiOmYiemYiumYi+mYjOmYjemYjumYj+mYkOmYkemYkumYk+mYlOmYlemYlumYl+mYmOmYmemYmumYm+mYnOmYnemYnumYnwor6Zig6Zih6Zii6Zij6Zik6Zil6Zim6Zin6Zio6Zip6Ziq6Zir6Zis6Zit6Ziu6Ziv6Ziw6Zix6Ziy6Ziz6Zi06Zi16Zi26Zi36Zi46Zi56Zi66Zi76Zi86Zi96Zi+6Zi/CivpmYDpmYHpmYLpmYPpmYTpmYXpmYbpmYfpmYjpmYnpmYrpmYvpmYzpmY3pmY7pmY/pmZDpmZHpmZLpmZPpmZTpmZXpmZbpmZfpmZjpmZnpmZrpmZvpmZzpmZ3pmZ7pmZ8KK+mZoOmZoemZoumZo+mZpOmZpemZpumZp+mZqOmZqemZqumZq+mZrOmZremZrumZr+mZsOmZsemZsumZs+mZtOmZtemZtumZt+mZuOmZuemZuumZu+mZvOmZvemZvumZvwor6ZqA6ZqB6ZqC6ZqD6ZqE6ZqF6ZqG6ZqH6ZqI6ZqJ6ZqK6ZqL6ZqM6ZqN6ZqO6ZqP6ZqQ6ZqR6ZqS6ZqT6ZqU6ZqV6ZqW6ZqX6ZqY6ZqZ6Zqa6Zqb6Zqc6Zqd6Zqe6ZqfCivpmqDpmqHpmqLpmqPpmqTpmqXpmqbpmqfpmqjpmqnpmqrpmqvpmqzpmq3pmq7pmq/pmrDpmrHpmrLpmrPpmrTpmrXpmrbpmrfpmrjpmrnpmrrpmrvpmrzpmr3pmr7pmr8KK+mbgOmbgembgumbg+mbhOmbhembhumbh+mbiOmbiembiumbi+mbjOmbjembjumbj+mbkOmbkembkumbk+mblOmblemblumbl+mbmOmbmembmumbm+mbnOmbnembnumbnwor6Zug6Zuh6Zui6Zuj6Zuk6Zul6Zum6Zun6Zuo6Zup6Zuq6Zur6Zus6Zut6Zuu6Zuv6Zuw6Zux6Zuy6Zuz6Zu06Zu16Zu26Zu36Zu46Zu56Zu66Zu76Zu86Zu96Zu+6Zu/CivpnIDpnIHpnILpnIPpnITpnIXpnIbpnIfpnIjpnInpnIrpnIvpnIzpnI3pnI7pnI/pnJDpnJHpnJLpnJPpnJTpnJXpnJbpnJfpnJjpnJnpnJrpnJvpnJzpnJ3pnJ7pnJ8KK+mcoOmcoemcoumco+mcpOmcpemcpumcp+mcqOmcqemcqumcq+mcrOmcremcrumcr+mcsOmcsemcsumcs+mctOmctemctumct+mcuOmcuemcuumcu+mcvOmcvemcvumcvwor6Z2A6Z2B6Z2C6Z2D6Z2E6Z2F6Z2G6Z2H6Z2I6Z2J6Z2K6Z2L6Z2M6Z2N6Z2O6Z2P6Z2Q6Z2R6Z2S6Z2T6Z2U6Z2V6Z2W6Z2X6Z2Y6Z2Z6Z2a6Z2b6Z2c6Z2d6Z2e6Z2fCivpnaDpnaHpnaLpnaPpnaTpnaXpnabpnafpnajpnanpnarpnavpnazpna3pna7pna/pnbDpnbHpnbLpnbPpnbTpnbXpnbbpnbfpnbjpnbnpnbrpnbvpnbzpnb3pnb7pnb8KK+megOmegemegumeg+mehOmehemehumeh+meiOmeiemeiumei+mejOmejemejumej+mekOmekemekumek+melOmelemelumel+memOmemememumem+menOmenemenumenwor6Z6g6Z6h6Z6i6Z6j6Z6k6Z6l6Z6m6Z6n6Z6o6Z6p6Z6q6Z6r6Z6s6Z6t6Z6u6Z6v6Z6w6Z6x6Z6y6Z6z6Z606Z616Z626Z636Z646Z656Z666Z676Z686Z696Z6+6Z6/Civpn4Dpn4Hpn4Lpn4Ppn4Tpn4Xpn4bpn4fpn4jpn4npn4rpn4vpn4zpn43pn47pn4/pn5Dpn5Hpn5Lpn5Ppn5Tpn5Xpn5bpn5fpn5jpn5npn5rpn5vpn5zpn53pn57pn58KK+mfoOmfoemfoumfo+mfpOmfpemfpumfp+mfqOmfqemfqumfq+mfrOmfremfrumfr+mfsOmfsemfsumfs+mftOmftemftumft+mfuOmfuemfuumfu+mfvOmfvemfvumfvwor6aCA6aCB6aCC6aCD6aCE6aCF6aCG6aCH6aCI6aCJ6aCK6aCL6aCM6aCN6aCO6aCP6aCQ6aCR6aCS6aCT6aCU6aCV6aCW6aCX6aCY6aCZ6aCa6aCb6aCc6aCd6aCe6aCfCivpoKDpoKHpoKLpoKPpoKTpoKXpoKbpoKfpoKjpoKnpoKrpoKvpoKzpoK3poK7poK/poLDpoLHpoLLpoLPpoLTpoLXpoLbpoLfpoLjpoLnpoLrpoLvpoLzpoL3poL7poL8KK+mhgOmhgemhgumhg+mhhOmhhemhhumhh+mhiOmhiemhiumhi+mhjOmhjemhjumhj+mhkOmhkemhkumhk+mhlOmhlemhlumhl+mhmOmhmemhmumhm+mhnOmhnemhnumhnwor6aGg6aGh6aGi6aGj6aGk6aGl6aGm6aGn6aGo6aGp6aGq6aGr6aGs6aGt6aGu6aGv6aGw6aGx6aGy6aGz6aG06aG16aG26aG36aG46aG56aG66aG76aG86aG96aG+6aG/CivpooDpooHpooLpooPpooTpooXpoobpoofpoojpoonpoorpoovpoozpoo3poo7poo/popDpopHpopLpopPpopTpopXpopbpopfpopjpopnpoprpopvpopzpop3pop7pop8KK+mioOmioemioumio+mipOmipemipumip+miqOmiqemiqumiq+mirOmiremirumir+misOmisemisumis+mitOmitemitumit+miuOmiuemiuumiu+mivOmivemivumivwor6aOA6aOB6aOC6aOD6aOE6aOF6aOG6aOH6aOI6aOJ6aOK6aOL6aOM6aON6aOO6aOP6aOQ6aOR6aOS6aOT6aOU6aOV6aOW6aOX6aOY6aOZ6aOa6aOb6aOc6aOd6aOe6aOfCivpo6Dpo6Hpo6Lpo6Ppo6Tpo6Xpo6bpo6fpo6jpo6npo6rpo6vpo6zpo63po67po6/po7Dpo7Hpo7Lpo7Ppo7Tpo7Xpo7bpo7fpo7jpo7npo7rpo7vpo7zpo73po77po78KK+mkgOmkgemkgumkg+mkhOmkhemkhumkh+mkiOmkiemkiumki+mkjOmkjemkjumkj+mkkOmkkemkkumkk+mklOmklemklumkl+mkmOmkmemkmumkm+mknOmknemknumknwor6aSg6aSh6aSi6aSj6aSk6aSl6aSm6aSn6aSo6aSp6aSq6aSr6aSs6aSt6aSu6aSv6aSw6aSx6aSy6aSz6aS06aS16aS26aS36aS46aS56aS66aS76aS86aS96aS+6aS/CivppYDppYHppYLppYPppYTppYXppYbppYfppYjppYnppYrppYvppYzppY3ppY7ppY/ppZDppZHppZLppZPppZTppZXppZbppZfppZjppZnppZrppZvppZzppZ3ppZ7ppZ8KK+mloOmloemloumlo+mlpOmlpemlpumlp+mlqOmlqemlqumlq+mlrOmlremlrumlr+mlsOmlsemlsumls+mltOmltemltumlt+mluOmluemluumlu+mlvOmlvemlvumlvwor6aaA6aaB6aaC6aaD6aaE6aaF6aaG6aaH6aaI6aaJ6aaK6aaL6aaM6aaN6aaO6aaP6aaQ6aaR6aaS6aaT6aaU6aaV6aaW6aaX6aaY6aaZ6aaa6aab6aac6aad6aae6aafCivppqDppqHppqLppqPppqTppqXppqbppqfppqjppqnppqrppqvppqzppq3ppq7ppq/pprDpprHpprLpprPpprTpprXpprbpprfpprjpprnpprrpprvpprzppr3ppr7ppr8KK+mngOmngemngumng+mnhOmnhemnhumnh+mniOmniemniumni+mnjOmnjemnjumnj+mnkOmnkemnkumnk+mnlOmnlemnlumnl+mnmOmnmemnmumnm+mnnOmnnemnnumnnwor6aeg6aeh6aei6aej6aek6ael6aem6aen6aeo6aep6aeq6aer6aes6aet6aeu6aev6aew6aex6aey6aez6ae06ae16ae26ae36ae46ae56ae66ae76ae86ae96ae+6ae/CivpqIDpqIHpqILpqIPpqITpqIXpqIbpqIfpqIjpqInpqIrpqIvpqIzpqI3pqI7pqI/pqJDpqJHpqJLpqJPpqJTpqJXpqJbpqJfpqJjpqJnpqJrpqJvpqJzpqJ3pqJ7pqJ8KK+mooOmooemooumoo+mopOmopemopumop+moqOmoqemoqumoq+morOmoremorumor+mosOmosemosumos+motOmotemotumot+mouOmouemouumou+movOmovemovumovwor6amA6amB6amC6amD6amE6amF6amG6amH6amI6amJ6amK6amL6amM6amN6amO6amP6amQ6amR6amS6amT6amU6amV6amW6amX6amY6amZ6ama6amb6amc6amd6ame6amfCivpqaDpqaHpqaLpqaPpqaTpqaXpqabpqafpqajpqanpqarpqavpqazpqa3pqa7pqa/pqbDpqbHpqbLpqbPpqbTpqbXpqbbpqbfpqbjpqbnpqbrpqbvpqbzpqb3pqb7pqb8KK+mqgOmqgemqgumqg+mqhOmqhemqhumqh+mqiOmqiemqiumqi+mqjOmqjemqjumqj+mqkOmqkemqkumqk+mqlOmqlemqlumql+mqmOmqmemqmumqm+mqnOmqnemqnumqnwor6aqg6aqh6aqi6aqj6aqk6aql6aqm6aqn6aqo6aqp6aqq6aqr6aqs6aqt6aqu6aqv6aqw6aqx6aqy6aqz6aq06aq16aq26aq36aq46aq56aq66aq76aq86aq96aq+6aq/Civpq4Dpq4Hpq4Lpq4Ppq4Tpq4Xpq4bpq4fpq4jpq4npq4rpq4vpq4zpq43pq47pq4/pq5Dpq5Hpq5Lpq5Ppq5Tpq5Xpq5bpq5fpq5jpq5npq5rpq5vpq5zpq53pq57pq58KK+mroOmroemroumro+mrpOmrpemrpumrp+mrqOmrqemrqumrq+mrrOmrremrrumrr+mrsOmrsemrsumrs+mrtOmrtemrtumrt+mruOmruemruumru+mrvOmrvemrvumrvwor6ayA6ayB6ayC6ayD6ayE6ayF6ayG6ayH6ayI6ayJ6ayK6ayL6ayM6ayN6ayO6ayP6ayQ6ayR6ayS6ayT6ayU6ayV6ayW6ayX6ayY6ayZ6aya6ayb6ayc6ayd6aye6ayfCivprKDprKHprKLprKPprKTprKXprKbprKfprKjprKnprKrprKvprKzprK3prK7prK/prLDprLHprLLprLPprLTprLXprLbprLfprLjprLnprLrprLvprLzprL3prL7prL8KK+mtgOmtgemtgumtg+mthOmthemthumth+mtiOmtiemtiumti+mtjOmtjemtjumtj+mtkOmtkemtkumtk+mtlOmtlemtlumtl+mtmOmtmemtmumtm+mtnOmtnemtnumtnwor6a2g6a2h6a2i6a2j6a2k6a2l6a2m6a2n6a2o6a2p6a2q6a2r6a2s6a2t6a2u6a2v6a2w6a2x6a2y6a2z6a206a216a226a236a246a256a266a276a286a296a2+6a2/CivproDproHproLproPproTproXprobprofprojpronprorprovprozpro3pro7pro/prpDprpHprpLprpPprpTprpXprpbprpfprpjprpnprprprpvprpzprp3prp7prp8KK+muoOmuoemuoumuo+mupOmupemupumup+muqOmuqemuqumuq+murOmuremurumur+musOmusemusumus+mutOmutemutumut+muuOmuuemuuumuu+muvOmuvemuvumuvwor6a+A6a+B6a+C6a+D6a+E6a+F6a+G6a+H6a+I6a+J6a+K6a+L6a+M6a+N6a+O6a+P6a+Q6a+R6a+S6a+T6a+U6a+V6a+W6a+X6a+Y6a+Z6a+a6a+b6a+c6a+d6a+e6a+fCivpr6Dpr6Hpr6Lpr6Ppr6Tpr6Xpr6bpr6fpr6jpr6npr6rpr6vpr6zpr63pr67pr6/pr7Dpr7Hpr7Lpr7Ppr7Tpr7Xpr7bpr7fpr7jpr7npr7rpr7vpr7zpr73pr77pr78KK+mwgOmwgemwgumwg+mwhOmwhemwhumwh+mwiOmwiemwiumwi+mwjOmwjemwjumwj+mwkOmwkemwkumwk+mwlOmwlemwlumwl+mwmOmwmemwmumwm+mwnOmwnemwnumwnwor6bCg6bCh6bCi6bCj6bCk6bCl6bCm6bCn6bCo6bCp6bCq6bCr6bCs6bCt6bCu6bCv6bCw6bCx6bCy6bCz6bC06bC16bC26bC36bC46bC56bC66bC76bC86bC96bC+6bC/CivpsYDpsYHpsYLpsYPpsYTpsYXpsYbpsYfpsYjpsYnpsYrpsYvpsYzpsY3psY7psY/psZDpsZHpsZLpsZPpsZTpsZXpsZbpsZfpsZjpsZnpsZrpsZvpsZzpsZ3psZ7psZ8KK+mxoOmxoemxoumxo+mxpOmxpemxpumxp+mxqOmxqemxqumxq+mxrOmxremxrumxr+mxsOmxsemxsumxs+mxtOmxtemxtumxt+mxuOmxuemxuumxu+mxvOmxvemxvumxvwor6bKA6bKB6bKC6bKD6bKE6bKF6bKG6bKH6bKI6bKJ6bKK6bKL6bKM6bKN6bKO6bKP6bKQ6bKR6bKS6bKT6bKU6bKV6bKW6bKX6bKY6bKZ6bKa6bKb6bKc6bKd6bKe6bKfCivpsqDpsqHpsqLpsqPpsqTpsqXpsqbpsqfpsqjpsqnpsqrpsqvpsqzpsq3psq7psq/psrDpsrHpsrLpsrPpsrTpsrXpsrbpsrfpsrjpsrnpsrrpsrvpsrzpsr3psr7psr8KK+mzgOmzgemzgumzg+mzhOmzhemzhumzh+mziOmziemziumzi+mzjOmzjemzjumzj+mzkOmzkemzkumzk+mzlOmzlemzlumzl+mzmOmzmemzmumzm+mznOmznemznumznwor6bOg6bOh6bOi6bOj6bOk6bOl6bOm6bOn6bOo6bOp6bOq6bOr6bOs6bOt6bOu6bOv6bOw6bOx6bOy6bOz6bO06bO16bO26bO36bO46bO56bO66bO76bO86bO96bO+6bO/CivptIDptIHptILptIPptITptIXptIbptIfptIjptInptIrptIvptIzptI3ptI7ptI/ptJDptJHptJLptJPptJTptJXptJbptJfptJjptJnptJrptJvptJzptJ3ptJ7ptJ8KK+m0oOm0oem0oum0o+m0pOm0pem0pum0p+m0qOm0qem0qum0q+m0rOm0rem0rum0r+m0sOm0sem0sum0s+m0tOm0tem0tum0t+m0uOm0uem0uum0u+m0vOm0vem0vum0vwor6bWA6bWB6bWC6bWD6bWE6bWF6bWG6bWH6bWI6bWJ6bWK6bWL6bWM6bWN6bWO6bWP6bWQ6bWR6bWS6bWT6bWU6bWV6bWW6bWX6bWY6bWZ6bWa6bWb6bWc6bWd6bWe6bWfCivptaDptaHptaLptaPptaTptaXptabptafptajptanptarptavptazpta3pta7pta/ptbDptbHptbLptbPptbTptbXptbbptbfptbjptbnptbrptbvptbzptb3ptb7ptb8KK+m2gOm2gem2gum2g+m2hOm2hem2hum2h+m2iOm2iem2ium2i+m2jOm2jem2jum2j+m2kOm2kem2kum2k+m2lOm2lem2lum2l+m2mOm2mem2mum2m+m2nOm2nem2num2nwor6bag6bah6bai6baj6bak6bal6bam6ban6bao6bap6baq6bar6bas6bat6bau6bav6baw6bax6bay6baz6ba06ba16ba26ba36ba46ba56ba66ba76ba86ba96ba+6ba/Civpt4Dpt4Hpt4Lpt4Ppt4Tpt4Xpt4bpt4fpt4jpt4npt4rpt4vpt4zpt43pt47pt4/pt5Dpt5Hpt5Lpt5Ppt5Tpt5Xpt5bpt5fpt5jpt5npt5rpt5vpt5zpt53pt57pt58KK+m3oOm3oem3oum3o+m3pOm3pem3pum3p+m3qOm3qem3qum3q+m3rOm3rem3rum3r+m3sOm3sem3sum3s+m3tOm3tem3tum3t+m3uOm3uem3uum3u+m3vOm3vem3vum3vwor6biA6biB6biC6biD6biE6biF6biG6biH6biI6biJ6biK6biL6biM6biN6biO6biP6biQ6biR6biS6biT6biU6biV6biW6biX6biY6biZ6bia6bib6bic6bid6bie6bifCivpuKDpuKHpuKLpuKPpuKTpuKXpuKbpuKfpuKjpuKnpuKrpuKvpuKzpuK3puK7puK/puLDpuLHpuLLpuLPpuLTpuLXpuLbpuLfpuLjpuLnpuLrpuLvpuLzpuL3puL7puL8KK+m5gOm5gem5gum5g+m5hOm5hem5hum5h+m5iOm5iem5ium5i+m5jOm5jem5jum5j+m5kOm5kem5kum5k+m5lOm5lem5lum5l+m5mOm5mem5mum5m+m5nOm5nem5num5nwor6bmg6bmh6bmi6bmj6bmk6bml6bmm6bmn6bmo6bmp6bmq6bmr6bms6bmt6bmu6bmv6bmw6bmx6bmy6bmz6bm06bm16bm26bm36bm46bm56bm66bm76bm86bm96bm+6bm/CivpuoDpuoHpuoLpuoPpuoTpuoXpuobpuofpuojpuonpuorpuovpuozpuo3puo7puo/pupDpupHpupLpupPpupTpupXpupbpupfpupjpupnpuprpupvpupzpup3pup7pup8KK+m6oOm6oem6oum6o+m6pOm6pem6pum6p+m6qOm6qem6qum6q+m6rOm6rem6rum6r+m6sOm6sem6sum6s+m6tOm6tem6tum6t+m6uOm6uem6uum6u+m6vOm6vem6vum6vwor6buA6buB6buC6buD6buE6buF6buG6buH6buI6buJ6buK6buL6buM6buN6buO6buP6buQ6buR6buS6buT6buU6buV6buW6buX6buY6buZ6bua6bub6buc6bud6bue6bufCivpu6Dpu6Hpu6Lpu6Ppu6Tpu6Xpu6bpu6fpu6jpu6npu6rpu6vpu6zpu63pu67pu6/pu7Dpu7Hpu7Lpu7Ppu7Tpu7Xpu7bpu7fpu7jpu7npu7rpu7vpu7zpu73pu77pu78KK+m8gOm8gem8gum8g+m8hOm8hem8hum8h+m8iOm8iem8ium8i+m8jOm8jem8jum8j+m8kOm8kem8kum8k+m8lOm8lem8lum8l+m8mOm8mem8mum8m+m8nOm8nem8num8nwor6byg6byh6byi6byj6byk6byl6bym6byn6byo6byp6byq6byr6bys6byt6byu6byv6byw6byx6byy6byz6by06by16by26by36by46by56by66by76by86by96by+6by/CivpvYDpvYHpvYLpvYPpvYTpvYXpvYbpvYfpvYjpvYnpvYrpvYvpvYzpvY3pvY7pvY/pvZDpvZHpvZLpvZPpvZTpvZXpvZbpvZfpvZjpvZnpvZrpvZvpvZzpvZ3pvZ7pvZ8KK+m9oOm9oem9oum9o+m9pOm9pem9pum9p+m9qOm9qem9qum9q+m9rOm9rem9rum9r+m9sOm9sem9sum9s+m9tOm9tem9tum9t+m9uOm9uem9uum9u+m9vOm9vem9vum9vwor6b6A6b6B6b6C6b6D6b6E6b6F6b6G6b6H6b6I6b6J6b6K6b6L6b6M6b6N6b6O6b6P6b6Q6b6R6b6S6b6T6b6U6b6V6b6W6b6X6b6Y6b6Z6b6a6b6b6b6c6b6d6b6e6b6fCivpvqDpvqHpvqLpvqPpvqTpvqXpvqbpvqfpvqjpvqnpvqrpvqvpvqzpvq3pvq7pvq/pvrDpvrHpvrLpvrPpvrTpvrXpvrbpvrfpvrjpvrnpvrrpvrvpvrzpvr3pvr7pvr8KK+m/gOm/gem/gum/g+m/hOm/hem/hum/h+m/iOm/iem/ium/i+m/jOm/jem/jum/j+m/kOm/kem/kum/k+m/lOm/lem/lum/l+m/mOm/mem/mum/m+m/nOm/nem/num/nwor6b+g6b+h6b+i6b+j6b+k6b+l6b+m6b+n6b+o6b+p6b+q6b+r6b+s6b+t6b+u6b+v6b+w6b+x6b+y6b+z6b+06b+16b+26b+36b+46b+56b+66b+76b+86b+96b++6b+/CisKK1lpIFN5bGxhYmxlcyAoVStBMDAwLVUrQTQ4Rik6CisKK+qAgOqAgeqAguqAg+qAhOqAheqAhuqAh+qAiOqAieqAiuqAi+qAjOqAjeqAjuqAj+qAkOqAkeqAkuqAk+qAlOqAleqAluqAl+qAmOqAmeqAmuqAm+qAnOqAneqAnuqAnwor6oCg6oCh6oCi6oCj6oCk6oCl6oCm6oCn6oCo6oCp6oCq6oCr6oCs6oCt6oCu6oCv6oCw6oCx6oCy6oCz6oC06oC16oC26oC36oC46oC56oC66oC76oC86oC96oC+6oC/CivqgYDqgYHqgYLqgYPqgYTqgYXqgYbqgYfqgYjqgYnqgYrqgYvqgYzqgY3qgY7qgY/qgZDqgZHqgZLqgZPqgZTqgZXqgZbqgZfqgZjqgZnqgZrqgZvqgZzqgZ3qgZ7qgZ8KK+qBoOqBoeqBouqBo+qBpOqBpeqBpuqBp+qBqOqBqeqBquqBq+qBrOqBreqBruqBr+qBsOqBseqBsuqBs+qBtOqBteqBtuqBt+qBuOqBueqBuuqBu+qBvOqBveqBvuqBvwor6oKA6oKB6oKC6oKD6oKE6oKF6oKG6oKH6oKI6oKJ6oKK6oKL6oKM6oKN6oKO6oKP6oKQ6oKR6oKS6oKT6oKU6oKV6oKW6oKX6oKY6oKZ6oKa6oKb6oKc6oKd6oKe6oKfCivqgqDqgqHqgqLqgqPqgqTqgqXqgqbqgqfqgqjqgqnqgqrqgqvqgqzqgq3qgq7qgq/qgrDqgrHqgrLqgrPqgrTqgrXqgrbqgrfqgrjqgrnqgrrqgrvqgrzqgr3qgr7qgr8KK+qDgOqDgeqDguqDg+qDhOqDheqDhuqDh+qDiOqDieqDiuqDi+qDjOqDjeqDjuqDj+qDkOqDkeqDkuqDk+qDlOqDleqDluqDl+qDmOqDmeqDmuqDm+qDnOqDneqDnuqDnwor6oOg6oOh6oOi6oOj6oOk6oOl6oOm6oOn6oOo6oOp6oOq6oOr6oOs6oOt6oOu6oOv6oOw6oOx6oOy6oOz6oO06oO16oO26oO36oO46oO56oO66oO76oO86oO96oO+6oO/CivqhIDqhIHqhILqhIPqhITqhIXqhIbqhIfqhIjqhInqhIrqhIvqhIzqhI3qhI7qhI/qhJDqhJHqhJLqhJPqhJTqhJXqhJbqhJfqhJjqhJnqhJrqhJvqhJzqhJ3qhJ7qhJ8KK+qEoOqEoeqEouqEo+qEpOqEpeqEpuqEp+qEqOqEqeqEquqEq+qErOqEreqEruqEr+qEsOqEseqEsuqEs+qEtOqEteqEtuqEt+qEuOqEueqEuuqEu+qEvOqEveqEvuqEvwor6oWA6oWB6oWC6oWD6oWE6oWF6oWG6oWH6oWI6oWJ6oWK6oWL6oWM6oWN6oWO6oWP6oWQ6oWR6oWS6oWT6oWU6oWV6oWW6oWX6oWY6oWZ6oWa6oWb6oWc6oWd6oWe6oWfCivqhaDqhaHqhaLqhaPqhaTqhaXqhabqhafqhajqhanqharqhavqhazqha3qha7qha/qhbDqhbHqhbLqhbPqhbTqhbXqhbbqhbfqhbjqhbnqhbrqhbvqhbzqhb3qhb7qhb8KK+qGgOqGgeqGguqGg+qGhOqGheqGhuqGh+qGiOqGieqGiuqGi+qGjOqGjeqGjuqGj+qGkOqGkeqGkuqGk+qGlOqGleqGluqGl+qGmOqGmeqGmuqGm+qGnOqGneqGnuqGnwor6oag6oah6oai6oaj6oak6oal6oam6oan6oao6oap6oaq6oar6oas6oat6oau6oav6oaw6oax6oay6oaz6oa06oa16oa26oa36oa46oa56oa66oa76oa86oa96oa+6oa/Civqh4Dqh4Hqh4Lqh4Pqh4Tqh4Xqh4bqh4fqh4jqh4nqh4rqh4vqh4zqh43qh47qh4/qh5Dqh5Hqh5Lqh5Pqh5Tqh5Xqh5bqh5fqh5jqh5nqh5rqh5vqh5zqh53qh57qh58KK+qHoOqHoeqHouqHo+qHpOqHpeqHpuqHp+qHqOqHqeqHquqHq+qHrOqHreqHruqHr+qHsOqHseqHsuqHs+qHtOqHteqHtuqHt+qHuOqHueqHuuqHu+qHvOqHveqHvuqHvwor6oiA6oiB6oiC6oiD6oiE6oiF6oiG6oiH6oiI6oiJ6oiK6oiL6oiM6oiN6oiO6oiP6oiQ6oiR6oiS6oiT6oiU6oiV6oiW6oiX6oiY6oiZ6oia6oib6oic6oid6oie6oifCivqiKDqiKHqiKLqiKPqiKTqiKXqiKbqiKfqiKjqiKnqiKrqiKvqiKzqiK3qiK7qiK/qiLDqiLHqiLLqiLPqiLTqiLXqiLbqiLfqiLjqiLnqiLrqiLvqiLzqiL3qiL7qiL8KK+qJgOqJgeqJguqJg+qJhOqJheqJhuqJh+qJiOqJieqJiuqJi+qJjOqJjeqJjuqJj+qJkOqJkeqJkuqJk+qJlOqJleqJluqJl+qJmOqJmeqJmuqJm+qJnOqJneqJnuqJnwor6omg6omh6omi6omj6omk6oml6omm6omn6omo6omp6omq6omr6oms6omt6omu6omv6omw6omx6omy6omz6om06om16om26om36om46om56om66om76om86om96om+6om/CivqioDqioHqioLqioPqioTqioXqiobqiofqiojqionqiorqiovqiozqio3qio7qio/qipDqipHqipLqipPqipTqipXqipbqipfqipjqipnqiprqipvqipzqip3qip7qip8KK+qKoOqKoeqKouqKo+qKpOqKpeqKpuqKp+qKqOqKqeqKquqKq+qKrOqKreqKruqKr+qKsOqKseqKsuqKs+qKtOqKteqKtuqKt+qKuOqKueqKuuqKu+qKvOqKveqKvuqKvwor6ouA6ouB6ouC6ouD6ouE6ouF6ouG6ouH6ouI6ouJ6ouK6ouL6ouM6ouN6ouO6ouP6ouQ6ouR6ouS6ouT6ouU6ouV6ouW6ouX6ouY6ouZ6oua6oub6ouc6oud6oue6oufCivqi6Dqi6Hqi6Lqi6Pqi6Tqi6Xqi6bqi6fqi6jqi6nqi6rqi6vqi6zqi63qi67qi6/qi7Dqi7Hqi7Lqi7Pqi7Tqi7Xqi7bqi7fqi7jqi7nqi7rqi7vqi7zqi73qi77qi78KK+qMgOqMgeqMguqMg+qMhOqMheqMhuqMh+qMiOqMieqMiuqMi+qMjOqMjeqMjuqMj+qMkOqMkeqMkuqMk+qMlOqMleqMluqMl+qMmOqMmeqMmuqMm+qMnOqMneqMnuqMnwor6oyg6oyh6oyi6oyj6oyk6oyl6oym6oyn6oyo6oyp6oyq6oyr6oys6oyt6oyu6oyv6oyw6oyx6oyy6oyz6oy06oy16oy26oy36oy46oy56oy66oy76oy86oy96oy+6oy/CivqjYDqjYHqjYLqjYPqjYTqjYXqjYbqjYfqjYjqjYnqjYrqjYvqjYzqjY3qjY7qjY/qjZDqjZHqjZLqjZPqjZTqjZXqjZbqjZfqjZjqjZnqjZrqjZvqjZzqjZ3qjZ7qjZ8KK+qNoOqNoeqNouqNo+qNpOqNpeqNpuqNp+qNqOqNqeqNquqNq+qNrOqNreqNruqNr+qNsOqNseqNsuqNs+qNtOqNteqNtuqNt+qNuOqNueqNuuqNu+qNvOqNveqNvuqNvwor6o6A6o6B6o6C6o6D6o6E6o6F6o6G6o6H6o6I6o6J6o6K6o6L6o6M6o6N6o6O6o6P6o6Q6o6R6o6S6o6T6o6U6o6V6o6W6o6X6o6Y6o6Z6o6a6o6b6o6c6o6d6o6e6o6fCivqjqDqjqHqjqLqjqPqjqTqjqXqjqbqjqfqjqjqjqnqjqrqjqvqjqzqjq3qjq7qjq/qjrDqjrHqjrLqjrPqjrTqjrXqjrbqjrfqjrjqjrnqjrrqjrvqjrzqjr3qjr7qjr8KK+qPgOqPgeqPguqPg+qPhOqPheqPhuqPh+qPiOqPieqPiuqPi+qPjOqPjeqPjuqPj+qPkOqPkeqPkuqPk+qPlOqPleqPluqPl+qPmOqPmeqPmuqPm+qPnOqPneqPnuqPnwor6o+g6o+h6o+i6o+j6o+k6o+l6o+m6o+n6o+o6o+p6o+q6o+r6o+s6o+t6o+u6o+v6o+w6o+x6o+y6o+z6o+06o+16o+26o+36o+46o+56o+66o+76o+86o+96o++6o+/CivqkIDqkIHqkILqkIPqkITqkIXqkIbqkIfqkIjqkInqkIrqkIvqkIzqkI3qkI7qkI/qkJDqkJHqkJLqkJPqkJTqkJXqkJbqkJfqkJjqkJnqkJrqkJvqkJzqkJ3qkJ7qkJ8KK+qQoOqQoeqQouqQo+qQpOqQpeqQpuqQp+qQqOqQqeqQquqQq+qQrOqQreqQruqQr+qQsOqQseqQsuqQs+qQtOqQteqQtuqQt+qQuOqQueqQuuqQu+qQvOqQveqQvuqQvwor6pGA6pGB6pGC6pGD6pGE6pGF6pGG6pGH6pGI6pGJ6pGK6pGL6pGM6pGN6pGO6pGP6pGQ6pGR6pGS6pGT6pGU6pGV6pGW6pGX6pGY6pGZ6pGa6pGb6pGc6pGd6pGe6pGfCivqkaDqkaHqkaLqkaPqkaTqkaXqkabqkafqkajqkanqkarqkavqkazqka3qka7qka/qkbDqkbHqkbLqkbPqkbTqkbXqkbbqkbfqkbjqkbnqkbrqkbvqkbzqkb3qkb7qkb8KK+qSgOqSgeqSguqSg+qShOqSheqShuqSh+qSiOqSieqSiuqSi+qSjOqSjeqSjuqSjworCitZaSBSYWRpY2FscyAoVStBNDkwLVUrQTRDRik6CisKK+qSkOqSkeqSkuqSk+qSlOqSleqSluqSl+qSmOqSmeqSmuqSm+qSnOqSneqSnuqSn+qSoOqSoeqSouqSo+qSpOqSpeqSpuqSp+qSqOqSqeqSquqSq+qSrOqSreqSruqSrwor6pKw6pKx6pKy6pKz6pK06pK16pK26pK36pK46pK56pK66pK76pK86pK96pK+6pK/6pOA6pOB6pOC6pOD6pOE6pOF6pOG6pOH6pOI6pOJ6pOK6pOL6pOM6pON6pOO6pOPCisKK0ZyZWUgYmxvY2sgKFUrQTREMC1VK0FCRkYpOgorCivqk5Dqk5Hqk5Lqk5Pqk5Tqk5Xqk5bqk5fqk5jqk5nqk5rqk5vqk5zqk53qk57qk5/qk6Dqk6Hqk6Lqk6Pqk6Tqk6Xqk6bqk6fqk6jqk6nqk6rqk6vqk6zqk63qk67qk6/qk7Dqk7Hqk7Lqk7Pqk7Tqk7Xqk7bqk7fqk7jqk7nqk7rqk7vqk7zqk73qk77qk7/qlIDqlIHqlILqlIPqlITqlIXqlIbqlIfqlIjqlInqlIrqlIvqlIzqlI3qlI7qlI8KK+qUkOqUkeqUkuqUk+qUlOqUleqUluqUl+qUmOqUmeqUmuqUm+qUnOqUneqUnuqUn+qUoOqUoeqUouqUo+qUpOqUpeqUpuqUp+qUqOqUqeqUquqUq+qUrOqUreqUruqUr+qUsOqUseqUsuqUs+qUtOqUteqUtuqUt+qUuOqUueqUuuqUu+qUvOqUveqUvuqUv+qVgOqVgeqVguqVg+qVhOqVheqVhuqVh+qViOqVieqViuqVi+qVjOqVjeqVjuqVjwor6pWQ6pWR6pWS6pWT6pWU6pWV6pWW6pWX6pWY6pWZ6pWa6pWb6pWc6pWd6pWe6pWf6pWg6pWh6pWi6pWj6pWk6pWl6pWm6pWn6pWo6pWp6pWq6pWr6pWs6pWt6pWu6pWv6pWw6pWx6pWy6pWz6pW06pW16pW26pW36pW46pW56pW66pW76pW86pW96pW+6pW/6paA6paB6paC6paD6paE6paF6paG6paH6paI6paJ6paK6paL6paM6paN6paO6paPCivqlpDqlpHqlpLqlpPqlpTqlpXqlpbqlpfqlpjqlpnqlprqlpvqlpzqlp3qlp7qlp/qlqDqlqHqlqLqlqPqlqTqlqXqlqbqlqfqlqjqlqnqlqrqlqvqlqzqlq3qlq7qlq/qlrDqlrHqlrLqlrPqlrTqlrXqlrbqlrfqlrjqlrnqlrrqlrvqlrzqlr3qlr7qlr/ql4Dql4Hql4Lql4Pql4Tql4Xql4bql4fql4jql4nql4rql4vql4zql43ql47ql48KK+qXkOqXkeqXkuqXk+qXlOqXleqXluqXl+qXmOqXmeqXmuqXm+qXnOqXneqXnuqXn+qXoOqXoeqXouqXo+qXpOqXpeqXpuqXp+qXqOqXqeqXquqXq+qXrOqXreqXruqXr+qXsOqXseqXsuqXs+qXtOqXteqXtuqXt+qXuOqXueqXuuqXu+qXvOqXveqXvuqXv+qYgOqYgeqYguqYg+qYhOqYheqYhuqYh+qYiOqYieqYiuqYi+qYjOqYjeqYjuqYjwor6piQ6piR6piS6piT6piU6piV6piW6piX6piY6piZ6pia6pib6pic6pid6pie6pif6pig6pih6pii6pij6pik6pil6pim6pin6pio6pip6piq6pir6pis6pit6piu6piv6piw6pix6piy6piz6pi06pi16pi26pi36pi46pi56pi66pi76pi86pi96pi+6pi/6pmA6pmB6pmC6pmD6pmE6pmF6pmG6pmH6pmI6pmJ6pmK6pmL6pmM6pmN6pmO6pmPCivqmZDqmZHqmZLqmZPqmZTqmZXqmZbqmZfqmZjqmZnqmZrqmZvqmZzqmZ3qmZ7qmZ/qmaDqmaHqmaLqmaPqmaTqmaXqmabqmafqmajqmanqmarqmavqmazqma3qma7qma/qmbDqmbHqmbLqmbPqmbTqmbXqmbbqmbfqmbjqmbnqmbrqmbvqmbzqmb3qmb7qmb/qmoDqmoHqmoLqmoPqmoTqmoXqmobqmofqmojqmonqmorqmovqmozqmo3qmo7qmo8KK+qakOqakeqakuqak+qalOqaleqaluqal+qamOqameqamuqam+qanOqaneqanuqan+qaoOqaoeqaouqao+qapOqapeqapuqap+qaqOqaqeqaquqaq+qarOqareqaruqar+qasOqaseqasuqas+qatOqateqatuqat+qauOqaueqauuqau+qavOqaveqavuqav+qbgOqbgeqbguqbg+qbhOqbheqbhuqbh+qbiOqbieqbiuqbi+qbjOqbjeqbjuqbjwor6puQ6puR6puS6puT6puU6puV6puW6puX6puY6puZ6pua6pub6puc6pud6pue6puf6pug6puh6pui6puj6puk6pul6pum6pun6puo6pup6puq6pur6pus6put6puu6puv6puw6pux6puy6puz6pu06pu16pu26pu36pu46pu56pu66pu76pu86pu96pu+6pu/6pyA6pyB6pyC6pyD6pyE6pyF6pyG6pyH6pyI6pyJ6pyK6pyL6pyM6pyN6pyO6pyPCivqnJDqnJHqnJLqnJPqnJTqnJXqnJbqnJfqnJjqnJnqnJrqnJvqnJzqnJ3qnJ7qnJ/qnKDqnKHqnKLqnKPqnKTqnKXqnKbqnKfqnKjqnKnqnKrqnKvqnKzqnK3qnK7qnK/qnLDqnLHqnLLqnLPqnLTqnLXqnLbqnLfqnLjqnLnqnLrqnLvqnLzqnL3qnL7qnL/qnYDqnYHqnYLqnYPqnYTqnYXqnYbqnYfqnYjqnYnqnYrqnYvqnYzqnY3qnY7qnY8KK+qdkOqdkeqdkuqdk+qdlOqdleqdluqdl+qdmOqdmeqdmuqdm+qdnOqdneqdnuqdn+qdoOqdoeqdouqdo+qdpOqdpeqdpuqdp+qdqOqdqeqdquqdq+qdrOqdreqdruqdr+qdsOqdseqdsuqds+qdtOqdteqdtuqdt+qduOqdueqduuqdu+qdvOqdveqdvuqdv+qegOqegeqeguqeg+qehOqeheqehuqeh+qeiOqeieqeiuqei+qejOqejeqejuqejwor6p6Q6p6R6p6S6p6T6p6U6p6V6p6W6p6X6p6Y6p6Z6p6a6p6b6p6c6p6d6p6e6p6f6p6g6p6h6p6i6p6j6p6k6p6l6p6m6p6n6p6o6p6p6p6q6p6r6p6s6p6t6p6u6p6v6p6w6p6x6p6y6p6z6p606p616p626p636p646p656p666p676p686p696p6+6p6/6p+A6p+B6p+C6p+D6p+E6p+F6p+G6p+H6p+I6p+J6p+K6p+L6p+M6p+N6p+O6p+PCivqn5Dqn5Hqn5Lqn5Pqn5Tqn5Xqn5bqn5fqn5jqn5nqn5rqn5vqn5zqn53qn57qn5/qn6Dqn6Hqn6Lqn6Pqn6Tqn6Xqn6bqn6fqn6jqn6nqn6rqn6vqn6zqn63qn67qn6/qn7Dqn7Hqn7Lqn7Pqn7Tqn7Xqn7bqn7fqn7jqn7nqn7rqn7vqn7zqn73qn77qn7/qoIDqoIHqoILqoIPqoITqoIXqoIbqoIfqoIjqoInqoIrqoIvqoIzqoI3qoI7qoI8KK+qgkOqgkeqgkuqgk+qglOqgleqgluqgl+qgmOqgmeqgmuqgm+qgnOqgneqgnuqgn+qgoOqgoeqgouqgo+qgpOqgpeqgpuqgp+qgqOqgqeqgquqgq+qgrOqgreqgruqgr+qgsOqgseqgsuqgs+qgtOqgteqgtuqgt+qguOqgueqguuqgu+qgvOqgveqgvuqgv+qhgOqhgeqhguqhg+qhhOqhheqhhuqhh+qhiOqhieqhiuqhi+qhjOqhjeqhjuqhjwor6qGQ6qGR6qGS6qGT6qGU6qGV6qGW6qGX6qGY6qGZ6qGa6qGb6qGc6qGd6qGe6qGf6qGg6qGh6qGi6qGj6qGk6qGl6qGm6qGn6qGo6qGp6qGq6qGr6qGs6qGt6qGu6qGv6qGw6qGx6qGy6qGz6qG06qG16qG26qG36qG46qG56qG66qG76qG86qG96qG+6qG/6qKA6qKB6qKC6qKD6qKE6qKF6qKG6qKH6qKI6qKJ6qKK6qKL6qKM6qKN6qKO6qKPCivqopDqopHqopLqopPqopTqopXqopbqopfqopjqopnqoprqopvqopzqop3qop7qop/qoqDqoqHqoqLqoqPqoqTqoqXqoqbqoqfqoqjqoqnqoqrqoqvqoqzqoq3qoq7qoq/qorDqorHqorLqorPqorTqorXqorbqorfqorjqornqorrqorvqorzqor3qor7qor/qo4Dqo4Hqo4Lqo4Pqo4Tqo4Xqo4bqo4fqo4jqo4nqo4rqo4vqo4zqo43qo47qo48KK+qjkOqjkeqjkuqjk+qjlOqjleqjluqjl+qjmOqjmeqjmuqjm+qjnOqjneqjnuqjn+qjoOqjoeqjouqjo+qjpOqjpeqjpuqjp+qjqOqjqeqjquqjq+qjrOqjreqjruqjr+qjsOqjseqjsuqjs+qjtOqjteqjtuqjt+qjuOqjueqjuuqju+qjvOqjveqjvuqjv+qkgOqkgeqkguqkg+qkhOqkheqkhuqkh+qkiOqkieqkiuqki+qkjOqkjeqkjuqkjwor6qSQ6qSR6qSS6qST6qSU6qSV6qSW6qSX6qSY6qSZ6qSa6qSb6qSc6qSd6qSe6qSf6qSg6qSh6qSi6qSj6qSk6qSl6qSm6qSn6qSo6qSp6qSq6qSr6qSs6qSt6qSu6qSv6qSw6qSx6qSy6qSz6qS06qS16qS26qS36qS46qS56qS66qS76qS86qS96qS+6qS/6qWA6qWB6qWC6qWD6qWE6qWF6qWG6qWH6qWI6qWJ6qWK6qWL6qWM6qWN6qWO6qWPCivqpZDqpZHqpZLqpZPqpZTqpZXqpZbqpZfqpZjqpZnqpZrqpZvqpZzqpZ3qpZ7qpZ/qpaDqpaHqpaLqpaPqpaTqpaXqpabqpafqpajqpanqparqpavqpazqpa3qpa7qpa/qpbDqpbHqpbLqpbPqpbTqpbXqpbbqpbfqpbjqpbnqpbrqpbvqpbzqpb3qpb7qpb/qpoDqpoHqpoLqpoPqpoTqpoXqpobqpofqpojqponqporqpovqpozqpo3qpo7qpo8KK+qmkOqmkeqmkuqmk+qmlOqmleqmluqml+qmmOqmmeqmmuqmm+qmnOqmneqmnuqmn+qmoOqmoeqmouqmo+qmpOqmpeqmpuqmp+qmqOqmqeqmquqmq+qmrOqmreqmruqmr+qmsOqmseqmsuqms+qmtOqmteqmtuqmt+qmuOqmueqmuuqmu+qmvOqmveqmvuqmv+qngOqngeqnguqng+qnhOqnheqnhuqnh+qniOqnieqniuqni+qnjOqnjeqnjuqnjwor6qeQ6qeR6qeS6qeT6qeU6qeV6qeW6qeX6qeY6qeZ6qea6qeb6qec6qed6qee6qef6qeg6qeh6qei6qej6qek6qel6qem6qen6qeo6qep6qeq6qer6qes6qet6qeu6qev6qew6qex6qey6qez6qe06qe16qe26qe36qe46qe56qe66qe76qe86qe96qe+6qe/6qiA6qiB6qiC6qiD6qiE6qiF6qiG6qiH6qiI6qiJ6qiK6qiL6qiM6qiN6qiO6qiPCivqqJDqqJHqqJLqqJPqqJTqqJXqqJbqqJfqqJjqqJnqqJrqqJvqqJzqqJ3qqJ7qqJ/qqKDqqKHqqKLqqKPqqKTqqKXqqKbqqKfqqKjqqKnqqKrqqKvqqKzqqK3qqK7qqK/qqLDqqLHqqLLqqLPqqLTqqLXqqLbqqLfqqLjqqLnqqLrqqLvqqLzqqL3qqL7qqL/qqYDqqYHqqYLqqYPqqYTqqYXqqYbqqYfqqYjqqYnqqYrqqYvqqYzqqY3qqY7qqY8KK+qpkOqpkeqpkuqpk+qplOqpleqpluqpl+qpmOqpmeqpmuqpm+qpnOqpneqpnuqpn+qpoOqpoeqpouqpo+qppOqppeqppuqpp+qpqOqpqeqpquqpq+qprOqpreqpruqpr+qpsOqpseqpsuqps+qptOqpteqptuqpt+qpuOqpueqpuuqpu+qpvOqpveqpvuqpv+qqgOqqgeqqguqqg+qqhOqqheqqhuqqh+qqiOqqieqqiuqqi+qqjOqqjeqqjuqqjwor6qqQ6qqR6qqS6qqT6qqU6qqV6qqW6qqX6qqY6qqZ6qqa6qqb6qqc6qqd6qqe6qqf6qqg6qqh6qqi6qqj6qqk6qql6qqm6qqn6qqo6qqp6qqq6qqr6qqs6qqt6qqu6qqv6qqw6qqx6qqy6qqz6qq06qq16qq26qq36qq46qq56qq66qq76qq86qq96qq+6qq/6quA6quB6quC6quD6quE6quF6quG6quH6quI6quJ6quK6quL6quM6quN6quO6quPCivqq5Dqq5Hqq5Lqq5Pqq5Tqq5Xqq5bqq5fqq5jqq5nqq5rqq5vqq5zqq53qq57qq5/qq6Dqq6Hqq6Lqq6Pqq6Tqq6Xqq6bqq6fqq6jqq6nqq6rqq6vqq6zqq63qq67qq6/qq7Dqq7Hqq7Lqq7Pqq7Tqq7Xqq7bqq7fqq7jqq7nqq7rqq7vqq7zqq73qq77qq7/qrIDqrIHqrILqrIPqrITqrIXqrIbqrIfqrIjqrInqrIrqrIvqrIzqrI3qrI7qrI8KK+qskOqskeqskuqsk+qslOqsleqsluqsl+qsmOqsmeqsmuqsm+qsnOqsneqsnuqsn+qsoOqsoeqsouqso+qspOqspeqspuqsp+qsqOqsqeqsquqsq+qsrOqsreqsruqsr+qssOqsseqssuqss+qstOqsteqstuqst+qsuOqsueqsuuqsu+qsvOqsveqsvuqsv+qtgOqtgeqtguqtg+qthOqtheqthuqth+qtiOqtieqtiuqti+qtjOqtjeqtjuqtjwor6q2Q6q2R6q2S6q2T6q2U6q2V6q2W6q2X6q2Y6q2Z6q2a6q2b6q2c6q2d6q2e6q2f6q2g6q2h6q2i6q2j6q2k6q2l6q2m6q2n6q2o6q2p6q2q6q2r6q2s6q2t6q2u6q2v6q2w6q2x6q2y6q2z6q206q216q226q236q246q256q266q276q286q296q2+6q2/6q6A6q6B6q6C6q6D6q6E6q6F6q6G6q6H6q6I6q6J6q6K6q6L6q6M6q6N6q6O6q6PCivqrpDqrpHqrpLqrpPqrpTqrpXqrpbqrpfqrpjqrpnqrprqrpvqrpzqrp3qrp7qrp/qrqDqrqHqrqLqrqPqrqTqrqXqrqbqrqfqrqjqrqnqrqrqrqvqrqzqrq3qrq7qrq/qrrDqrrHqrrLqrrPqrrTqrrXqrrbqrrfqrrjqrrnqrrrqrrvqrrzqrr3qrr7qrr/qr4Dqr4Hqr4Lqr4Pqr4Tqr4Xqr4bqr4fqr4jqr4nqr4rqr4vqr4zqr43qr47qr48KK+qvkOqvkeqvkuqvk+qvlOqvleqvluqvl+qvmOqvmeqvmuqvm+qvnOqvneqvnuqvn+qvoOqvoeqvouqvo+qvpOqvpeqvpuqvp+qvqOqvqeqvquqvq+qvrOqvreqvruqvr+qvsOqvseqvsuqvs+qvtOqvteqvtuqvt+qvuOqvueqvuuqvu+qvvOqvveqvvuqvvworCitIYW5ndWwgU3lsbGFibGVzIChVK0FDMDAtVStEN0FGKToKKwor6rCA6rCB6rCC6rCD6rCE6rCF6rCG6rCH6rCI6rCJ6rCK6rCL6rCM6rCN6rCO6rCP6rCQ6rCR6rCS6rCT6rCU6rCV6rCW6rCX6rCY6rCZ6rCa6rCb6rCc6rCd6rCe6rCfCivqsKDqsKHqsKLqsKPqsKTqsKXqsKbqsKfqsKjqsKnqsKrqsKvqsKzqsK3qsK7qsK/qsLDqsLHqsLLqsLPqsLTqsLXqsLbqsLfqsLjqsLnqsLrqsLvqsLzqsL3qsL7qsL8KK+qxgOqxgeqxguqxg+qxhOqxheqxhuqxh+qxiOqxieqxiuqxi+qxjOqxjeqxjuqxj+qxkOqxkeqxkuqxk+qxlOqxleqxluqxl+qxmOqxmeqxmuqxm+qxnOqxneqxnuqxnwor6rGg6rGh6rGi6rGj6rGk6rGl6rGm6rGn6rGo6rGp6rGq6rGr6rGs6rGt6rGu6rGv6rGw6rGx6rGy6rGz6rG06rG16rG26rG36rG46rG56rG66rG76rG86rG96rG+6rG/CivqsoDqsoHqsoLqsoPqsoTqsoXqsobqsofqsojqsonqsorqsovqsozqso3qso7qso/qspDqspHqspLqspPqspTqspXqspbqspfqspjqspnqsprqspvqspzqsp3qsp7qsp8KK+qyoOqyoeqyouqyo+qypOqypeqypuqyp+qyqOqyqeqyquqyq+qyrOqyreqyruqyr+qysOqyseqysuqys+qytOqyteqytuqyt+qyuOqyueqyuuqyu+qyvOqyveqyvuqyvwor6rOA6rOB6rOC6rOD6rOE6rOF6rOG6rOH6rOI6rOJ6rOK6rOL6rOM6rON6rOO6rOP6rOQ6rOR6rOS6rOT6rOU6rOV6rOW6rOX6rOY6rOZ6rOa6rOb6rOc6rOd6rOe6rOfCivqs6Dqs6Hqs6Lqs6Pqs6Tqs6Xqs6bqs6fqs6jqs6nqs6rqs6vqs6zqs63qs67qs6/qs7Dqs7Hqs7Lqs7Pqs7Tqs7Xqs7bqs7fqs7jqs7nqs7rqs7vqs7zqs73qs77qs78KK+q0gOq0geq0guq0g+q0hOq0heq0huq0h+q0iOq0ieq0iuq0i+q0jOq0jeq0juq0j+q0kOq0keq0kuq0k+q0lOq0leq0luq0l+q0mOq0meq0muq0m+q0nOq0neq0nuq0nwor6rSg6rSh6rSi6rSj6rSk6rSl6rSm6rSn6rSo6rSp6rSq6rSr6rSs6rSt6rSu6rSv6rSw6rSx6rSy6rSz6rS06rS16rS26rS36rS46rS56rS66rS76rS86rS96rS+6rS/CivqtYDqtYHqtYLqtYPqtYTqtYXqtYbqtYfqtYjqtYnqtYrqtYvqtYzqtY3qtY7qtY/qtZDqtZHqtZLqtZPqtZTqtZXqtZbqtZfqtZjqtZnqtZrqtZvqtZzqtZ3qtZ7qtZ8KK+q1oOq1oeq1ouq1o+q1pOq1peq1puq1p+q1qOq1qeq1quq1q+q1rOq1req1ruq1r+q1sOq1seq1suq1s+q1tOq1teq1tuq1t+q1uOq1ueq1uuq1u+q1vOq1veq1vuq1vwor6raA6raB6raC6raD6raE6raF6raG6raH6raI6raJ6raK6raL6raM6raN6raO6raP6raQ6raR6raS6raT6raU6raV6raW6raX6raY6raZ6raa6rab6rac6rad6rae6rafCivqtqDqtqHqtqLqtqPqtqTqtqXqtqbqtqfqtqjqtqnqtqrqtqvqtqzqtq3qtq7qtq/qtrDqtrHqtrLqtrPqtrTqtrXqtrbqtrfqtrjqtrnqtrrqtrvqtrzqtr3qtr7qtr8KK+q3gOq3geq3guq3g+q3hOq3heq3huq3h+q3iOq3ieq3iuq3i+q3jOq3jeq3juq3j+q3kOq3keq3kuq3k+q3lOq3leq3luq3l+q3mOq3meq3muq3m+q3nOq3neq3nuq3nwor6reg6reh6rei6rej6rek6rel6rem6ren6reo6rep6req6rer6res6ret6reu6rev6rew6rex6rey6rez6re06re16re26re36re46re56re66re76re86re96re+6re/CivquIDquIHquILquIPquITquIXquIbquIfquIjquInquIrquIvquIzquI3quI7quI/quJDquJHquJLquJPquJTquJXquJbquJfquJjquJnquJrquJvquJzquJ3quJ7quJ8KK+q4oOq4oeq4ouq4o+q4pOq4peq4puq4p+q4qOq4qeq4quq4q+q4rOq4req4ruq4r+q4sOq4seq4suq4s+q4tOq4teq4tuq4t+q4uOq4ueq4uuq4u+q4vOq4veq4vuq4vwor6rmA6rmB6rmC6rmD6rmE6rmF6rmG6rmH6rmI6rmJ6rmK6rmL6rmM6rmN6rmO6rmP6rmQ6rmR6rmS6rmT6rmU6rmV6rmW6rmX6rmY6rmZ6rma6rmb6rmc6rmd6rme6rmfCivquaDquaHquaLquaPquaTquaXquabquafquajquanquarquavquazqua3qua7qua/qubDqubHqubLqubPqubTqubXqubbqubfqubjqubnqubrqubvqubzqub3qub7qub8KK+q6gOq6geq6guq6g+q6hOq6heq6huq6h+q6iOq6ieq6iuq6i+q6jOq6jeq6juq6j+q6kOq6keq6kuq6k+q6lOq6leq6luq6l+q6mOq6meq6muq6m+q6nOq6neq6nuq6nwor6rqg6rqh6rqi6rqj6rqk6rql6rqm6rqn6rqo6rqp6rqq6rqr6rqs6rqt6rqu6rqv6rqw6rqx6rqy6rqz6rq06rq16rq26rq36rq46rq56rq66rq76rq86rq96rq+6rq/Civqu4Dqu4Hqu4Lqu4Pqu4Tqu4Xqu4bqu4fqu4jqu4nqu4rqu4vqu4zqu43qu47qu4/qu5Dqu5Hqu5Lqu5Pqu5Tqu5Xqu5bqu5fqu5jqu5nqu5rqu5vqu5zqu53qu57qu58KK+q7oOq7oeq7ouq7o+q7pOq7peq7puq7p+q7qOq7qeq7quq7q+q7rOq7req7ruq7r+q7sOq7seq7suq7s+q7tOq7teq7tuq7t+q7uOq7ueq7uuq7u+q7vOq7veq7vuq7vwor6ryA6ryB6ryC6ryD6ryE6ryF6ryG6ryH6ryI6ryJ6ryK6ryL6ryM6ryN6ryO6ryP6ryQ6ryR6ryS6ryT6ryU6ryV6ryW6ryX6ryY6ryZ6rya6ryb6ryc6ryd6rye6ryfCivqvKDqvKHqvKLqvKPqvKTqvKXqvKbqvKfqvKjqvKnqvKrqvKvqvKzqvK3qvK7qvK/qvLDqvLHqvLLqvLPqvLTqvLXqvLbqvLfqvLjqvLnqvLrqvLvqvLzqvL3qvL7qvL8KK+q9gOq9geq9guq9g+q9hOq9heq9huq9h+q9iOq9ieq9iuq9i+q9jOq9jeq9juq9j+q9kOq9keq9kuq9k+q9lOq9leq9luq9l+q9mOq9meq9muq9m+q9nOq9neq9nuq9nwor6r2g6r2h6r2i6r2j6r2k6r2l6r2m6r2n6r2o6r2p6r2q6r2r6r2s6r2t6r2u6r2v6r2w6r2x6r2y6r2z6r206r216r226r236r246r256r266r276r286r296r2+6r2/CivqvoDqvoHqvoLqvoPqvoTqvoXqvobqvofqvojqvonqvorqvovqvozqvo3qvo7qvo/qvpDqvpHqvpLqvpPqvpTqvpXqvpbqvpfqvpjqvpnqvprqvpvqvpzqvp3qvp7qvp8KK+q+oOq+oeq+ouq+o+q+pOq+peq+puq+p+q+qOq+qeq+quq+q+q+rOq+req+ruq+r+q+sOq+seq+suq+s+q+tOq+teq+tuq+t+q+uOq+ueq+uuq+u+q+vOq+veq+vuq+vwor6r+A6r+B6r+C6r+D6r+E6r+F6r+G6r+H6r+I6r+J6r+K6r+L6r+M6r+N6r+O6r+P6r+Q6r+R6r+S6r+T6r+U6r+V6r+W6r+X6r+Y6r+Z6r+a6r+b6r+c6r+d6r+e6r+fCivqv6Dqv6Hqv6Lqv6Pqv6Tqv6Xqv6bqv6fqv6jqv6nqv6rqv6vqv6zqv63qv67qv6/qv7Dqv7Hqv7Lqv7Pqv7Tqv7Xqv7bqv7fqv7jqv7nqv7rqv7vqv7zqv73qv77qv78KK+uAgOuAgeuAguuAg+uAhOuAheuAhuuAh+uAiOuAieuAiuuAi+uAjOuAjeuAjuuAj+uAkOuAkeuAkuuAk+uAlOuAleuAluuAl+uAmOuAmeuAmuuAm+uAnOuAneuAnuuAnwor64Cg64Ch64Ci64Cj64Ck64Cl64Cm64Cn64Co64Cp64Cq64Cr64Cs64Ct64Cu64Cv64Cw64Cx64Cy64Cz64C064C164C264C364C464C564C664C764C864C964C+64C/CivrgYDrgYHrgYLrgYPrgYTrgYXrgYbrgYfrgYjrgYnrgYrrgYvrgYzrgY3rgY7rgY/rgZDrgZHrgZLrgZPrgZTrgZXrgZbrgZfrgZjrgZnrgZrrgZvrgZzrgZ3rgZ7rgZ8KK+uBoOuBoeuBouuBo+uBpOuBpeuBpuuBp+uBqOuBqeuBquuBq+uBrOuBreuBruuBr+uBsOuBseuBsuuBs+uBtOuBteuBtuuBt+uBuOuBueuBuuuBu+uBvOuBveuBvuuBvwor64KA64KB64KC64KD64KE64KF64KG64KH64KI64KJ64KK64KL64KM64KN64KO64KP64KQ64KR64KS64KT64KU64KV64KW64KX64KY64KZ64Ka64Kb64Kc64Kd64Ke64KfCivrgqDrgqHrgqLrgqPrgqTrgqXrgqbrgqfrgqjrgqnrgqrrgqvrgqzrgq3rgq7rgq/rgrDrgrHrgrLrgrPrgrTrgrXrgrbrgrfrgrjrgrnrgrrrgrvrgrzrgr3rgr7rgr8KK+uDgOuDgeuDguuDg+uDhOuDheuDhuuDh+uDiOuDieuDiuuDi+uDjOuDjeuDjuuDj+uDkOuDkeuDkuuDk+uDlOuDleuDluuDl+uDmOuDmeuDmuuDm+uDnOuDneuDnuuDnwor64Og64Oh64Oi64Oj64Ok64Ol64Om64On64Oo64Op64Oq64Or64Os64Ot64Ou64Ov64Ow64Ox64Oy64Oz64O064O164O264O364O464O564O664O764O864O964O+64O/CivrhIDrhIHrhILrhIPrhITrhIXrhIbrhIfrhIjrhInrhIrrhIvrhIzrhI3rhI7rhI/rhJDrhJHrhJLrhJPrhJTrhJXrhJbrhJfrhJjrhJnrhJrrhJvrhJzrhJ3rhJ7rhJ8KK+uEoOuEoeuEouuEo+uEpOuEpeuEpuuEp+uEqOuEqeuEquuEq+uErOuEreuEruuEr+uEsOuEseuEsuuEs+uEtOuEteuEtuuEt+uEuOuEueuEuuuEu+uEvOuEveuEvuuEvwor64WA64WB64WC64WD64WE64WF64WG64WH64WI64WJ64WK64WL64WM64WN64WO64WP64WQ64WR64WS64WT64WU64WV64WW64WX64WY64WZ64Wa64Wb64Wc64Wd64We64WfCivrhaDrhaHrhaLrhaPrhaTrhaXrhabrhafrhajrhanrharrhavrhazrha3rha7rha/rhbDrhbHrhbLrhbPrhbTrhbXrhbbrhbfrhbjrhbnrhbrrhbvrhbzrhb3rhb7rhb8KK+uGgOuGgeuGguuGg+uGhOuGheuGhuuGh+uGiOuGieuGiuuGi+uGjOuGjeuGjuuGj+uGkOuGkeuGkuuGk+uGlOuGleuGluuGl+uGmOuGmeuGmuuGm+uGnOuGneuGnuuGnwor64ag64ah64ai64aj64ak64al64am64an64ao64ap64aq64ar64as64at64au64av64aw64ax64ay64az64a064a164a264a364a464a564a664a764a864a964a+64a/Civrh4Drh4Hrh4Lrh4Prh4Trh4Xrh4brh4frh4jrh4nrh4rrh4vrh4zrh43rh47rh4/rh5Drh5Hrh5Lrh5Prh5Trh5Xrh5brh5frh5jrh5nrh5rrh5vrh5zrh53rh57rh58KK+uHoOuHoeuHouuHo+uHpOuHpeuHpuuHp+uHqOuHqeuHquuHq+uHrOuHreuHruuHr+uHsOuHseuHsuuHs+uHtOuHteuHtuuHt+uHuOuHueuHuuuHu+uHvOuHveuHvuuHvwor64iA64iB64iC64iD64iE64iF64iG64iH64iI64iJ64iK64iL64iM64iN64iO64iP64iQ64iR64iS64iT64iU64iV64iW64iX64iY64iZ64ia64ib64ic64id64ie64ifCivriKDriKHriKLriKPriKTriKXriKbriKfriKjriKnriKrriKvriKzriK3riK7riK/riLDriLHriLLriLPriLTriLXriLbriLfriLjriLnriLrriLvriLzriL3riL7riL8KK+uJgOuJgeuJguuJg+uJhOuJheuJhuuJh+uJiOuJieuJiuuJi+uJjOuJjeuJjuuJj+uJkOuJkeuJkuuJk+uJlOuJleuJluuJl+uJmOuJmeuJmuuJm+uJnOuJneuJnuuJnwor64mg64mh64mi64mj64mk64ml64mm64mn64mo64mp64mq64mr64ms64mt64mu64mv64mw64mx64my64mz64m064m164m264m364m464m564m664m764m864m964m+64m/CivrioDrioHrioLrioPrioTrioXriobriofriojrionriorriovriozrio3rio7rio/ripDripHripLripPripTripXripbripfripjripnriprripvripzrip3rip7rip8KK+uKoOuKoeuKouuKo+uKpOuKpeuKpuuKp+uKqOuKqeuKquuKq+uKrOuKreuKruuKr+uKsOuKseuKsuuKs+uKtOuKteuKtuuKt+uKuOuKueuKuuuKu+uKvOuKveuKvuuKvwor64uA64uB64uC64uD64uE64uF64uG64uH64uI64uJ64uK64uL64uM64uN64uO64uP64uQ64uR64uS64uT64uU64uV64uW64uX64uY64uZ64ua64ub64uc64ud64ue64ufCivri6Dri6Hri6Lri6Pri6Tri6Xri6bri6fri6jri6nri6rri6vri6zri63ri67ri6/ri7Dri7Hri7Lri7Pri7Tri7Xri7bri7fri7jri7nri7rri7vri7zri73ri77ri78KK+uMgOuMgeuMguuMg+uMhOuMheuMhuuMh+uMiOuMieuMiuuMi+uMjOuMjeuMjuuMj+uMkOuMkeuMkuuMk+uMlOuMleuMluuMl+uMmOuMmeuMmuuMm+uMnOuMneuMnuuMnwor64yg64yh64yi64yj64yk64yl64ym64yn64yo64yp64yq64yr64ys64yt64yu64yv64yw64yx64yy64yz64y064y164y264y364y464y564y664y764y864y964y+64y/CivrjYDrjYHrjYLrjYPrjYTrjYXrjYbrjYfrjYjrjYnrjYrrjYvrjYzrjY3rjY7rjY/rjZDrjZHrjZLrjZPrjZTrjZXrjZbrjZfrjZjrjZnrjZrrjZvrjZzrjZ3rjZ7rjZ8KK+uNoOuNoeuNouuNo+uNpOuNpeuNpuuNp+uNqOuNqeuNquuNq+uNrOuNreuNruuNr+uNsOuNseuNsuuNs+uNtOuNteuNtuuNt+uNuOuNueuNuuuNu+uNvOuNveuNvuuNvwor646A646B646C646D646E646F646G646H646I646J646K646L646M646N646O646P646Q646R646S646T646U646V646W646X646Y646Z646a646b646c646d646e646fCivrjqDrjqHrjqLrjqPrjqTrjqXrjqbrjqfrjqjrjqnrjqrrjqvrjqzrjq3rjq7rjq/rjrDrjrHrjrLrjrPrjrTrjrXrjrbrjrfrjrjrjrnrjrrrjrvrjrzrjr3rjr7rjr8KK+uPgOuPgeuPguuPg+uPhOuPheuPhuuPh+uPiOuPieuPiuuPi+uPjOuPjeuPjuuPj+uPkOuPkeuPkuuPk+uPlOuPleuPluuPl+uPmOuPmeuPmuuPm+uPnOuPneuPnuuPnwor64+g64+h64+i64+j64+k64+l64+m64+n64+o64+p64+q64+r64+s64+t64+u64+v64+w64+x64+y64+z64+064+164+264+364+464+564+664+764+864+964++64+/CivrkIDrkIHrkILrkIPrkITrkIXrkIbrkIfrkIjrkInrkIrrkIvrkIzrkI3rkI7rkI/rkJDrkJHrkJLrkJPrkJTrkJXrkJbrkJfrkJjrkJnrkJrrkJvrkJzrkJ3rkJ7rkJ8KK+uQoOuQoeuQouuQo+uQpOuQpeuQpuuQp+uQqOuQqeuQquuQq+uQrOuQreuQruuQr+uQsOuQseuQsuuQs+uQtOuQteuQtuuQt+uQuOuQueuQuuuQu+uQvOuQveuQvuuQvwor65GA65GB65GC65GD65GE65GF65GG65GH65GI65GJ65GK65GL65GM65GN65GO65GP65GQ65GR65GS65GT65GU65GV65GW65GX65GY65GZ65Ga65Gb65Gc65Gd65Ge65GfCivrkaDrkaHrkaLrkaPrkaTrkaXrkabrkafrkajrkanrkarrkavrkazrka3rka7rka/rkbDrkbHrkbLrkbPrkbTrkbXrkbbrkbfrkbjrkbnrkbrrkbvrkbzrkb3rkb7rkb8KK+uSgOuSgeuSguuSg+uShOuSheuShuuSh+uSiOuSieuSiuuSi+uSjOuSjeuSjuuSj+uSkOuSkeuSkuuSk+uSlOuSleuSluuSl+uSmOuSmeuSmuuSm+uSnOuSneuSnuuSnwor65Kg65Kh65Ki65Kj65Kk65Kl65Km65Kn65Ko65Kp65Kq65Kr65Ks65Kt65Ku65Kv65Kw65Kx65Ky65Kz65K065K165K265K365K465K565K665K765K865K965K+65K/Civrk4Drk4Hrk4Lrk4Prk4Trk4Xrk4brk4frk4jrk4nrk4rrk4vrk4zrk43rk47rk4/rk5Drk5Hrk5Lrk5Prk5Trk5Xrk5brk5frk5jrk5nrk5rrk5vrk5zrk53rk57rk58KK+uToOuToeuTouuTo+uTpOuTpeuTpuuTp+uTqOuTqeuTquuTq+uTrOuTreuTruuTr+uTsOuTseuTsuuTs+uTtOuTteuTtuuTt+uTuOuTueuTuuuTu+uTvOuTveuTvuuTvwor65SA65SB65SC65SD65SE65SF65SG65SH65SI65SJ65SK65SL65SM65SN65SO65SP65SQ65SR65SS65ST65SU65SV65SW65SX65SY65SZ65Sa65Sb65Sc65Sd65Se65SfCivrlKDrlKHrlKLrlKPrlKTrlKXrlKbrlKfrlKjrlKnrlKrrlKvrlKzrlK3rlK7rlK/rlLDrlLHrlLLrlLPrlLTrlLXrlLbrlLfrlLjrlLnrlLrrlLvrlLzrlL3rlL7rlL8KK+uVgOuVgeuVguuVg+uVhOuVheuVhuuVh+uViOuVieuViuuVi+uVjOuVjeuVjuuVj+uVkOuVkeuVkuuVk+uVlOuVleuVluuVl+uVmOuVmeuVmuuVm+uVnOuVneuVnuuVnwor65Wg65Wh65Wi65Wj65Wk65Wl65Wm65Wn65Wo65Wp65Wq65Wr65Ws65Wt65Wu65Wv65Ww65Wx65Wy65Wz65W065W165W265W365W465W565W665W765W865W965W+65W/CivrloDrloHrloLrloPrloTrloXrlobrlofrlojrlonrlorrlovrlozrlo3rlo7rlo/rlpDrlpHrlpLrlpPrlpTrlpXrlpbrlpfrlpjrlpnrlprrlpvrlpzrlp3rlp7rlp8KK+uWoOuWoeuWouuWo+uWpOuWpeuWpuuWp+uWqOuWqeuWquuWq+uWrOuWreuWruuWr+uWsOuWseuWsuuWs+uWtOuWteuWtuuWt+uWuOuWueuWuuuWu+uWvOuWveuWvuuWvwor65eA65eB65eC65eD65eE65eF65eG65eH65eI65eJ65eK65eL65eM65eN65eO65eP65eQ65eR65eS65eT65eU65eV65eW65eX65eY65eZ65ea65eb65ec65ed65ee65efCivrl6Drl6Hrl6Lrl6Prl6Trl6Xrl6brl6frl6jrl6nrl6rrl6vrl6zrl63rl67rl6/rl7Drl7Hrl7Lrl7Prl7Trl7Xrl7brl7frl7jrl7nrl7rrl7vrl7zrl73rl77rl78KK+uYgOuYgeuYguuYg+uYhOuYheuYhuuYh+uYiOuYieuYiuuYi+uYjOuYjeuYjuuYj+uYkOuYkeuYkuuYk+uYlOuYleuYluuYl+uYmOuYmeuYmuuYm+uYnOuYneuYnuuYnwor65ig65ih65ii65ij65ik65il65im65in65io65ip65iq65ir65is65it65iu65iv65iw65ix65iy65iz65i065i165i265i365i465i565i665i765i865i965i+65i/CivrmYDrmYHrmYLrmYPrmYTrmYXrmYbrmYfrmYjrmYnrmYrrmYvrmYzrmY3rmY7rmY/rmZDrmZHrmZLrmZPrmZTrmZXrmZbrmZfrmZjrmZnrmZrrmZvrmZzrmZ3rmZ7rmZ8KK+uZoOuZoeuZouuZo+uZpOuZpeuZpuuZp+uZqOuZqeuZquuZq+uZrOuZreuZruuZr+uZsOuZseuZsuuZs+uZtOuZteuZtuuZt+uZuOuZueuZuuuZu+uZvOuZveuZvuuZvwor65qA65qB65qC65qD65qE65qF65qG65qH65qI65qJ65qK65qL65qM65qN65qO65qP65qQ65qR65qS65qT65qU65qV65qW65qX65qY65qZ65qa65qb65qc65qd65qe65qfCivrmqDrmqHrmqLrmqPrmqTrmqXrmqbrmqfrmqjrmqnrmqrrmqvrmqzrmq3rmq7rmq/rmrDrmrHrmrLrmrPrmrTrmrXrmrbrmrfrmrjrmrnrmrrrmrvrmrzrmr3rmr7rmr8KK+ubgOubgeubguubg+ubhOubheubhuubh+ubiOubieubiuubi+ubjOubjeubjuubj+ubkOubkeubkuubk+ublOubleubluubl+ubmOubmeubmuubm+ubnOubneubnuubnwor65ug65uh65ui65uj65uk65ul65um65un65uo65up65uq65ur65us65ut65uu65uv65uw65ux65uy65uz65u065u165u265u365u465u565u665u765u865u965u+65u/CivrnIDrnIHrnILrnIPrnITrnIXrnIbrnIfrnIjrnInrnIrrnIvrnIzrnI3rnI7rnI/rnJDrnJHrnJLrnJPrnJTrnJXrnJbrnJfrnJjrnJnrnJrrnJvrnJzrnJ3rnJ7rnJ8KK+ucoOucoeucouuco+ucpOucpeucpuucp+ucqOucqeucquucq+ucrOucreucruucr+ucsOucseucsuucs+uctOucteuctuuct+ucuOucueucuuucu+ucvOucveucvuucvwor652A652B652C652D652E652F652G652H652I652J652K652L652M652N652O652P652Q652R652S652T652U652V652W652X652Y652Z652a652b652c652d652e652fCivrnaDrnaHrnaLrnaPrnaTrnaXrnabrnafrnajrnanrnarrnavrnazrna3rna7rna/rnbDrnbHrnbLrnbPrnbTrnbXrnbbrnbfrnbjrnbnrnbrrnbvrnbzrnb3rnb7rnb8KK+uegOuegeueguueg+uehOueheuehuueh+ueiOueieueiuuei+uejOuejeuejuuej+uekOuekeuekuuek+uelOueleueluuel+uemOuemeuemuuem+uenOueneuenuuenwor656g656h656i656j656k656l656m656n656o656p656q656r656s656t656u656v656w656x656y656z6560656165626563656465656566656765686569656+656/Civrn4Drn4Hrn4Lrn4Prn4Trn4Xrn4brn4frn4jrn4nrn4rrn4vrn4zrn43rn47rn4/rn5Drn5Hrn5Lrn5Prn5Trn5Xrn5brn5frn5jrn5nrn5rrn5vrn5zrn53rn57rn58KK+ufoOufoeufouufo+ufpOufpeufpuufp+ufqOufqeufquufq+ufrOufreufruufr+ufsOufseufsuufs+uftOufteuftuuft+ufuOufueufuuufu+ufvOufveufvuufvwor66CA66CB66CC66CD66CE66CF66CG66CH66CI66CJ66CK66CL66CM66CN66CO66CP66CQ66CR66CS66CT66CU66CV66CW66CX66CY66CZ66Ca66Cb66Cc66Cd66Ce66CfCivroKDroKHroKLroKProKTroKXroKbroKfroKjroKnroKrroKvroKzroK3roK7roK/roLDroLHroLLroLProLTroLXroLbroLfroLjroLnroLrroLvroLzroL3roL7roL8KK+uhgOuhgeuhguuhg+uhhOuhheuhhuuhh+uhiOuhieuhiuuhi+uhjOuhjeuhjuuhj+uhkOuhkeuhkuuhk+uhlOuhleuhluuhl+uhmOuhmeuhmuuhm+uhnOuhneuhnuuhnwor66Gg66Gh66Gi66Gj66Gk66Gl66Gm66Gn66Go66Gp66Gq66Gr66Gs66Gt66Gu66Gv66Gw66Gx66Gy66Gz66G066G166G266G366G466G566G666G766G866G966G+66G/CivrooDrooHrooLrooProoTrooXroobroofroojroonroorroovroozroo3roo7roo/ropDropHropLropPropTropXropbropfropjropnroprropvropzrop3rop7rop8KK+uioOuioeuiouuio+uipOuipeuipuuip+uiqOuiqeuiquuiq+uirOuireuiruuir+uisOuiseuisuuis+uitOuiteuituuit+uiuOuiueuiuuuiu+uivOuiveuivuuivwor66OA66OB66OC66OD66OE66OF66OG66OH66OI66OJ66OK66OL66OM66ON66OO66OP66OQ66OR66OS66OT66OU66OV66OW66OX66OY66OZ66Oa66Ob66Oc66Od66Oe66OfCivro6Dro6Hro6Lro6Pro6Tro6Xro6bro6fro6jro6nro6rro6vro6zro63ro67ro6/ro7Dro7Hro7Lro7Pro7Tro7Xro7bro7fro7jro7nro7rro7vro7zro73ro77ro78KK+ukgOukgeukguukg+ukhOukheukhuukh+ukiOukieukiuuki+ukjOukjeukjuukj+ukkOukkeukkuukk+uklOukleukluukl+ukmOukmeukmuukm+uknOukneuknuuknwor66Sg66Sh66Si66Sj66Sk66Sl66Sm66Sn66So66Sp66Sq66Sr66Ss66St66Su66Sv66Sw66Sx66Sy66Sz66S066S166S266S366S466S566S666S766S866S966S+66S/CivrpYDrpYHrpYLrpYPrpYTrpYXrpYbrpYfrpYjrpYnrpYrrpYvrpYzrpY3rpY7rpY/rpZDrpZHrpZLrpZPrpZTrpZXrpZbrpZfrpZjrpZnrpZrrpZvrpZzrpZ3rpZ7rpZ8KK+uloOuloeulouulo+ulpOulpeulpuulp+ulqOulqeulquulq+ulrOulreulruulr+ulsOulseulsuuls+ultOulteultuult+uluOulueuluuulu+ulvOulveulvuulvwor66aA66aB66aC66aD66aE66aF66aG66aH66aI66aJ66aK66aL66aM66aN66aO66aP66aQ66aR66aS66aT66aU66aV66aW66aX66aY66aZ66aa66ab66ac66ad66ae66afCivrpqDrpqHrpqLrpqPrpqTrpqXrpqbrpqfrpqjrpqnrpqrrpqvrpqzrpq3rpq7rpq/rprDrprHrprLrprPrprTrprXrprbrprfrprjrprnrprrrprvrprzrpr3rpr7rpr8KK+ungOungeunguung+unhOunheunhuunh+uniOunieuniuuni+unjOunjeunjuunj+unkOunkeunkuunk+unlOunleunluunl+unmOunmeunmuunm+unnOunneunnuunnwor66eg66eh66ei66ej66ek66el66em66en66eo66ep66eq66er66es66et66eu66ev66ew66ex66ey66ez66e066e166e266e366e466e566e666e766e866e966e+66e/CivrqIDrqIHrqILrqIPrqITrqIXrqIbrqIfrqIjrqInrqIrrqIvrqIzrqI3rqI7rqI/rqJDrqJHrqJLrqJPrqJTrqJXrqJbrqJfrqJjrqJnrqJrrqJvrqJzrqJ3rqJ7rqJ8KK+uooOuooeuoouuoo+uopOuopeuopuuop+uoqOuoqeuoquuoq+uorOuoreuoruuor+uosOuoseuosuuos+uotOuoteuotuuot+uouOuoueuouuuou+uovOuoveuovuuovwor66mA66mB66mC66mD66mE66mF66mG66mH66mI66mJ66mK66mL66mM66mN66mO66mP66mQ66mR66mS66mT66mU66mV66mW66mX66mY66mZ66ma66mb66mc66md66me66mfCivrqaDrqaHrqaLrqaPrqaTrqaXrqabrqafrqajrqanrqarrqavrqazrqa3rqa7rqa/rqbDrqbHrqbLrqbPrqbTrqbXrqbbrqbfrqbjrqbnrqbrrqbvrqbzrqb3rqb7rqb8KK+uqgOuqgeuqguuqg+uqhOuqheuqhuuqh+uqiOuqieuqiuuqi+uqjOuqjeuqjuuqj+uqkOuqkeuqkuuqk+uqlOuqleuqluuql+uqmOuqmeuqmuuqm+uqnOuqneuqnuuqnwor66qg66qh66qi66qj66qk66ql66qm66qn66qo66qp66qq66qr66qs66qt66qu66qv66qw66qx66qy66qz66q066q166q266q366q466q566q666q766q866q966q+66q/Civrq4Drq4Hrq4Lrq4Prq4Trq4Xrq4brq4frq4jrq4nrq4rrq4vrq4zrq43rq47rq4/rq5Drq5Hrq5Lrq5Prq5Trq5Xrq5brq5frq5jrq5nrq5rrq5vrq5zrq53rq57rq58KK+uroOuroeurouuro+urpOurpeurpuurp+urqOurqeurquurq+urrOurreurruurr+ursOurseursuurs+urtOurteurtuurt+uruOurueuruuuru+urvOurveurvuurvwor66yA66yB66yC66yD66yE66yF66yG66yH66yI66yJ66yK66yL66yM66yN66yO66yP66yQ66yR66yS66yT66yU66yV66yW66yX66yY66yZ66ya66yb66yc66yd66ye66yfCivrrKDrrKHrrKLrrKPrrKTrrKXrrKbrrKfrrKjrrKnrrKrrrKvrrKzrrK3rrK7rrK/rrLDrrLHrrLLrrLPrrLTrrLXrrLbrrLfrrLjrrLnrrLrrrLvrrLzrrL3rrL7rrL8KK+utgOutgeutguutg+uthOutheuthuuth+utiOutieutiuuti+utjOutjeutjuutj+utkOutkeutkuutk+utlOutleutluutl+utmOutmeutmuutm+utnOutneutnuutnwor662g662h662i662j662k662l662m662n662o662p662q662r662s662t662u662v662w662x662y662z6620662166226623662466256626662766286629662+662/CivrroDrroHrroLrroPrroTrroXrrobrrofrrojrronrrorrrovrrozrro3rro7rro/rrpDrrpHrrpLrrpPrrpTrrpXrrpbrrpfrrpjrrpnrrprrrpvrrpzrrp3rrp7rrp8KK+uuoOuuoeuuouuuo+uupOuupeuupuuup+uuqOuuqeuuquuuq+uurOuureuuruuur+uusOuuseuusuuus+uutOuuteuutuuut+uuuOuuueuuuuuuu+uuvOuuveuuvuuuvwor66+A66+B66+C66+D66+E66+F66+G66+H66+I66+J66+K66+L66+M66+N66+O66+P66+Q66+R66+S66+T66+U66+V66+W66+X66+Y66+Z66+a66+b66+c66+d66+e66+fCivrr6Drr6Hrr6Lrr6Prr6Trr6Xrr6brr6frr6jrr6nrr6rrr6vrr6zrr63rr67rr6/rr7Drr7Hrr7Lrr7Prr7Trr7Xrr7brr7frr7jrr7nrr7rrr7vrr7zrr73rr77rr78KK+uwgOuwgeuwguuwg+uwhOuwheuwhuuwh+uwiOuwieuwiuuwi+uwjOuwjeuwjuuwj+uwkOuwkeuwkuuwk+uwlOuwleuwluuwl+uwmOuwmeuwmuuwm+uwnOuwneuwnuuwnwor67Cg67Ch67Ci67Cj67Ck67Cl67Cm67Cn67Co67Cp67Cq67Cr67Cs67Ct67Cu67Cv67Cw67Cx67Cy67Cz67C067C167C267C367C467C567C667C767C867C967C+67C/CivrsYDrsYHrsYLrsYPrsYTrsYXrsYbrsYfrsYjrsYnrsYrrsYvrsYzrsY3rsY7rsY/rsZDrsZHrsZLrsZPrsZTrsZXrsZbrsZfrsZjrsZnrsZrrsZvrsZzrsZ3rsZ7rsZ8KK+uxoOuxoeuxouuxo+uxpOuxpeuxpuuxp+uxqOuxqeuxquuxq+uxrOuxreuxruuxr+uxsOuxseuxsuuxs+uxtOuxteuxtuuxt+uxuOuxueuxuuuxu+uxvOuxveuxvuuxvwor67KA67KB67KC67KD67KE67KF67KG67KH67KI67KJ67KK67KL67KM67KN67KO67KP67KQ67KR67KS67KT67KU67KV67KW67KX67KY67KZ67Ka67Kb67Kc67Kd67Ke67KfCivrsqDrsqHrsqLrsqPrsqTrsqXrsqbrsqfrsqjrsqnrsqrrsqvrsqzrsq3rsq7rsq/rsrDrsrHrsrLrsrPrsrTrsrXrsrbrsrfrsrjrsrnrsrrrsrvrsrzrsr3rsr7rsr8KK+uzgOuzgeuzguuzg+uzhOuzheuzhuuzh+uziOuzieuziuuzi+uzjOuzjeuzjuuzj+uzkOuzkeuzkuuzk+uzlOuzleuzluuzl+uzmOuzmeuzmuuzm+uznOuzneuznuuznwor67Og67Oh67Oi67Oj67Ok67Ol67Om67On67Oo67Op67Oq67Or67Os67Ot67Ou67Ov67Ow67Ox67Oy67Oz67O067O167O267O367O467O567O667O767O867O967O+67O/CivrtIDrtIHrtILrtIPrtITrtIXrtIbrtIfrtIjrtInrtIrrtIvrtIzrtI3rtI7rtI/rtJDrtJHrtJLrtJPrtJTrtJXrtJbrtJfrtJjrtJnrtJrrtJvrtJzrtJ3rtJ7rtJ8KK+u0oOu0oeu0ouu0o+u0pOu0peu0puu0p+u0qOu0qeu0quu0q+u0rOu0reu0ruu0r+u0sOu0seu0suu0s+u0tOu0teu0tuu0t+u0uOu0ueu0uuu0u+u0vOu0veu0vuu0vwor67WA67WB67WC67WD67WE67WF67WG67WH67WI67WJ67WK67WL67WM67WN67WO67WP67WQ67WR67WS67WT67WU67WV67WW67WX67WY67WZ67Wa67Wb67Wc67Wd67We67WfCivrtaDrtaHrtaLrtaPrtaTrtaXrtabrtafrtajrtanrtarrtavrtazrta3rta7rta/rtbDrtbHrtbLrtbPrtbTrtbXrtbbrtbfrtbjrtbnrtbrrtbvrtbzrtb3rtb7rtb8KK+u2gOu2geu2guu2g+u2hOu2heu2huu2h+u2iOu2ieu2iuu2i+u2jOu2jeu2juu2j+u2kOu2keu2kuu2k+u2lOu2leu2luu2l+u2mOu2meu2muu2m+u2nOu2neu2nuu2nwor67ag67ah67ai67aj67ak67al67am67an67ao67ap67aq67ar67as67at67au67av67aw67ax67ay67az67a067a167a267a367a467a567a667a767a867a967a+67a/Civrt4Drt4Hrt4Lrt4Prt4Trt4Xrt4brt4frt4jrt4nrt4rrt4vrt4zrt43rt47rt4/rt5Drt5Hrt5Lrt5Prt5Trt5Xrt5brt5frt5jrt5nrt5rrt5vrt5zrt53rt57rt58KK+u3oOu3oeu3ouu3o+u3pOu3peu3puu3p+u3qOu3qeu3quu3q+u3rOu3reu3ruu3r+u3sOu3seu3suu3s+u3tOu3teu3tuu3t+u3uOu3ueu3uuu3u+u3vOu3veu3vuu3vwor67iA67iB67iC67iD67iE67iF67iG67iH67iI67iJ67iK67iL67iM67iN67iO67iP67iQ67iR67iS67iT67iU67iV67iW67iX67iY67iZ67ia67ib67ic67id67ie67ifCivruKDruKHruKLruKPruKTruKXruKbruKfruKjruKnruKrruKvruKzruK3ruK7ruK/ruLDruLHruLLruLPruLTruLXruLbruLfruLjruLnruLrruLvruLzruL3ruL7ruL8KK+u5gOu5geu5guu5g+u5hOu5heu5huu5h+u5iOu5ieu5iuu5i+u5jOu5jeu5juu5j+u5kOu5keu5kuu5k+u5lOu5leu5luu5l+u5mOu5meu5muu5m+u5nOu5neu5nuu5nwor67mg67mh67mi67mj67mk67ml67mm67mn67mo67mp67mq67mr67ms67mt67mu67mv67mw67mx67my67mz67m067m167m267m367m467m567m667m767m867m967m+67m/CivruoDruoHruoLruoPruoTruoXruobruofruojruonruorruovruozruo3ruo7ruo/rupDrupHrupLrupPrupTrupXrupbrupfrupjrupnruprrupvrupzrup3rup7rup8KK+u6oOu6oeu6ouu6o+u6pOu6peu6puu6p+u6qOu6qeu6quu6q+u6rOu6reu6ruu6r+u6sOu6seu6suu6s+u6tOu6teu6tuu6t+u6uOu6ueu6uuu6u+u6vOu6veu6vuu6vwor67uA67uB67uC67uD67uE67uF67uG67uH67uI67uJ67uK67uL67uM67uN67uO67uP67uQ67uR67uS67uT67uU67uV67uW67uX67uY67uZ67ua67ub67uc67ud67ue67ufCivru6Dru6Hru6Lru6Pru6Tru6Xru6bru6fru6jru6nru6rru6vru6zru63ru67ru6/ru7Dru7Hru7Lru7Pru7Tru7Xru7bru7fru7jru7nru7rru7vru7zru73ru77ru78KK+u8gOu8geu8guu8g+u8hOu8heu8huu8h+u8iOu8ieu8iuu8i+u8jOu8jeu8juu8j+u8kOu8keu8kuu8k+u8lOu8leu8luu8l+u8mOu8meu8muu8m+u8nOu8neu8nuu8nwor67yg67yh67yi67yj67yk67yl67ym67yn67yo67yp67yq67yr67ys67yt67yu67yv67yw67yx67yy67yz67y067y167y267y367y467y567y667y767y867y967y+67y/CivrvYDrvYHrvYLrvYPrvYTrvYXrvYbrvYfrvYjrvYnrvYrrvYvrvYzrvY3rvY7rvY/rvZDrvZHrvZLrvZPrvZTrvZXrvZbrvZfrvZjrvZnrvZrrvZvrvZzrvZ3rvZ7rvZ8KK+u9oOu9oeu9ouu9o+u9pOu9peu9puu9p+u9qOu9qeu9quu9q+u9rOu9reu9ruu9r+u9sOu9seu9suu9s+u9tOu9teu9tuu9t+u9uOu9ueu9uuu9u+u9vOu9veu9vuu9vwor676A676B676C676D676E676F676G676H676I676J676K676L676M676N676O676P676Q676R676S676T676U676V676W676X676Y676Z676a676b676c676d676e676fCivrvqDrvqHrvqLrvqPrvqTrvqXrvqbrvqfrvqjrvqnrvqrrvqvrvqzrvq3rvq7rvq/rvrDrvrHrvrLrvrPrvrTrvrXrvrbrvrfrvrjrvrnrvrrrvrvrvrzrvr3rvr7rvr8KK+u/gOu/geu/guu/g+u/hOu/heu/huu/h+u/iOu/ieu/iuu/i+u/jOu/jeu/juu/j+u/kOu/keu/kuu/k+u/lOu/leu/luu/l+u/mOu/meu/muu/m+u/nOu/neu/nuu/nwor67+g67+h67+i67+j67+k67+l67+m67+n67+o67+p67+q67+r67+s67+t67+u67+v67+w67+x67+y67+z67+067+167+267+367+467+567+667+767+867+967++67+/CivsgIDsgIHsgILsgIPsgITsgIXsgIbsgIfsgIjsgInsgIrsgIvsgIzsgI3sgI7sgI/sgJDsgJHsgJLsgJPsgJTsgJXsgJbsgJfsgJjsgJnsgJrsgJvsgJzsgJ3sgJ7sgJ8KK+yAoOyAoeyAouyAo+yApOyApeyApuyAp+yAqOyAqeyAquyAq+yArOyAreyAruyAr+yAsOyAseyAsuyAs+yAtOyAteyAtuyAt+yAuOyAueyAuuyAu+yAvOyAveyAvuyAvwor7IGA7IGB7IGC7IGD7IGE7IGF7IGG7IGH7IGI7IGJ7IGK7IGL7IGM7IGN7IGO7IGP7IGQ7IGR7IGS7IGT7IGU7IGV7IGW7IGX7IGY7IGZ7IGa7IGb7IGc7IGd7IGe7IGfCivsgaDsgaHsgaLsgaPsgaTsgaXsgabsgafsgajsgansgarsgavsgazsga3sga7sga/sgbDsgbHsgbLsgbPsgbTsgbXsgbbsgbfsgbjsgbnsgbrsgbvsgbzsgb3sgb7sgb8KK+yCgOyCgeyCguyCg+yChOyCheyChuyCh+yCiOyCieyCiuyCi+yCjOyCjeyCjuyCj+yCkOyCkeyCkuyCk+yClOyCleyCluyCl+yCmOyCmeyCmuyCm+yCnOyCneyCnuyCnwor7IKg7IKh7IKi7IKj7IKk7IKl7IKm7IKn7IKo7IKp7IKq7IKr7IKs7IKt7IKu7IKv7IKw7IKx7IKy7IKz7IK07IK17IK27IK37IK47IK57IK67IK77IK87IK97IK+7IK/Civsg4Dsg4Hsg4Lsg4Psg4Tsg4Xsg4bsg4fsg4jsg4nsg4rsg4vsg4zsg43sg47sg4/sg5Dsg5Hsg5Lsg5Psg5Tsg5Xsg5bsg5fsg5jsg5nsg5rsg5vsg5zsg53sg57sg58KK+yDoOyDoeyDouyDo+yDpOyDpeyDpuyDp+yDqOyDqeyDquyDq+yDrOyDreyDruyDr+yDsOyDseyDsuyDs+yDtOyDteyDtuyDt+yDuOyDueyDuuyDu+yDvOyDveyDvuyDvwor7ISA7ISB7ISC7ISD7ISE7ISF7ISG7ISH7ISI7ISJ7ISK7ISL7ISM7ISN7ISO7ISP7ISQ7ISR7ISS7IST7ISU7ISV7ISW7ISX7ISY7ISZ7ISa7ISb7ISc7ISd7ISe7ISfCivshKDshKHshKLshKPshKTshKXshKbshKfshKjshKnshKrshKvshKzshK3shK7shK/shLDshLHshLLshLPshLTshLXshLbshLfshLjshLnshLrshLvshLzshL3shL7shL8KK+yFgOyFgeyFguyFg+yFhOyFheyFhuyFh+yFiOyFieyFiuyFi+yFjOyFjeyFjuyFj+yFkOyFkeyFkuyFk+yFlOyFleyFluyFl+yFmOyFmeyFmuyFm+yFnOyFneyFnuyFnwor7IWg7IWh7IWi7IWj7IWk7IWl7IWm7IWn7IWo7IWp7IWq7IWr7IWs7IWt7IWu7IWv7IWw7IWx7IWy7IWz7IW07IW17IW27IW37IW47IW57IW67IW77IW87IW97IW+7IW/CivshoDshoHshoLshoPshoTshoXshobshofshojshonshorshovshozsho3sho7sho/shpDshpHshpLshpPshpTshpXshpbshpfshpjshpnshprshpvshpzshp3shp7shp8KK+yGoOyGoeyGouyGo+yGpOyGpeyGpuyGp+yGqOyGqeyGquyGq+yGrOyGreyGruyGr+yGsOyGseyGsuyGs+yGtOyGteyGtuyGt+yGuOyGueyGuuyGu+yGvOyGveyGvuyGvwor7IeA7IeB7IeC7IeD7IeE7IeF7IeG7IeH7IeI7IeJ7IeK7IeL7IeM7IeN7IeO7IeP7IeQ7IeR7IeS7IeT7IeU7IeV7IeW7IeX7IeY7IeZ7Iea7Ieb7Iec7Ied7Iee7IefCivsh6Dsh6Hsh6Lsh6Psh6Tsh6Xsh6bsh6fsh6jsh6nsh6rsh6vsh6zsh63sh67sh6/sh7Dsh7Hsh7Lsh7Psh7Tsh7Xsh7bsh7fsh7jsh7nsh7rsh7vsh7zsh73sh77sh78KK+yIgOyIgeyIguyIg+yIhOyIheyIhuyIh+yIiOyIieyIiuyIi+yIjOyIjeyIjuyIj+yIkOyIkeyIkuyIk+yIlOyIleyIluyIl+yImOyImeyImuyIm+yInOyIneyInuyInwor7Iig7Iih7Iii7Iij7Iik7Iil7Iim7Iin7Iio7Iip7Iiq7Iir7Iis7Iit7Iiu7Iiv7Iiw7Iix7Iiy7Iiz7Ii07Ii17Ii27Ii37Ii47Ii57Ii67Ii77Ii87Ii97Ii+7Ii/CivsiYDsiYHsiYLsiYPsiYTsiYXsiYbsiYfsiYjsiYnsiYrsiYvsiYzsiY3siY7siY/siZDsiZHsiZLsiZPsiZTsiZXsiZbsiZfsiZjsiZnsiZrsiZvsiZzsiZ3siZ7siZ8KK+yJoOyJoeyJouyJo+yJpOyJpeyJpuyJp+yJqOyJqeyJquyJq+yJrOyJreyJruyJr+yJsOyJseyJsuyJs+yJtOyJteyJtuyJt+yJuOyJueyJuuyJu+yJvOyJveyJvuyJvwor7IqA7IqB7IqC7IqD7IqE7IqF7IqG7IqH7IqI7IqJ7IqK7IqL7IqM7IqN7IqO7IqP7IqQ7IqR7IqS7IqT7IqU7IqV7IqW7IqX7IqY7IqZ7Iqa7Iqb7Iqc7Iqd7Iqe7IqfCivsiqDsiqHsiqLsiqPsiqTsiqXsiqbsiqfsiqjsiqnsiqrsiqvsiqzsiq3siq7siq/sirDsirHsirLsirPsirTsirXsirbsirfsirjsirnsirrsirvsirzsir3sir7sir8KK+yLgOyLgeyLguyLg+yLhOyLheyLhuyLh+yLiOyLieyLiuyLi+yLjOyLjeyLjuyLj+yLkOyLkeyLkuyLk+yLlOyLleyLluyLl+yLmOyLmeyLmuyLm+yLnOyLneyLnuyLnwor7Iug7Iuh7Iui7Iuj7Iuk7Iul7Ium7Iun7Iuo7Iup7Iuq7Iur7Ius7Iut7Iuu7Iuv7Iuw7Iux7Iuy7Iuz7Iu07Iu17Iu27Iu37Iu47Iu57Iu67Iu77Iu87Iu97Iu+7Iu/CivsjIDsjIHsjILsjIPsjITsjIXsjIbsjIfsjIjsjInsjIrsjIvsjIzsjI3sjI7sjI/sjJDsjJHsjJLsjJPsjJTsjJXsjJbsjJfsjJjsjJnsjJrsjJvsjJzsjJ3sjJ7sjJ8KK+yMoOyMoeyMouyMo+yMpOyMpeyMpuyMp+yMqOyMqeyMquyMq+yMrOyMreyMruyMr+yMsOyMseyMsuyMs+yMtOyMteyMtuyMt+yMuOyMueyMuuyMu+yMvOyMveyMvuyMvwor7I2A7I2B7I2C7I2D7I2E7I2F7I2G7I2H7I2I7I2J7I2K7I2L7I2M7I2N7I2O7I2P7I2Q7I2R7I2S7I2T7I2U7I2V7I2W7I2X7I2Y7I2Z7I2a7I2b7I2c7I2d7I2e7I2fCivsjaDsjaHsjaLsjaPsjaTsjaXsjabsjafsjajsjansjarsjavsjazsja3sja7sja/sjbDsjbHsjbLsjbPsjbTsjbXsjbbsjbfsjbjsjbnsjbrsjbvsjbzsjb3sjb7sjb8KK+yOgOyOgeyOguyOg+yOhOyOheyOhuyOh+yOiOyOieyOiuyOi+yOjOyOjeyOjuyOj+yOkOyOkeyOkuyOk+yOlOyOleyOluyOl+yOmOyOmeyOmuyOm+yOnOyOneyOnuyOnwor7I6g7I6h7I6i7I6j7I6k7I6l7I6m7I6n7I6o7I6p7I6q7I6r7I6s7I6t7I6u7I6v7I6w7I6x7I6y7I6z7I607I617I627I637I647I657I667I677I687I697I6+7I6/Civsj4Dsj4Hsj4Lsj4Psj4Tsj4Xsj4bsj4fsj4jsj4nsj4rsj4vsj4zsj43sj47sj4/sj5Dsj5Hsj5Lsj5Psj5Tsj5Xsj5bsj5fsj5jsj5nsj5rsj5vsj5zsj53sj57sj58KK+yPoOyPoeyPouyPo+yPpOyPpeyPpuyPp+yPqOyPqeyPquyPq+yPrOyPreyPruyPr+yPsOyPseyPsuyPs+yPtOyPteyPtuyPt+yPuOyPueyPuuyPu+yPvOyPveyPvuyPvwor7JCA7JCB7JCC7JCD7JCE7JCF7JCG7JCH7JCI7JCJ7JCK7JCL7JCM7JCN7JCO7JCP7JCQ7JCR7JCS7JCT7JCU7JCV7JCW7JCX7JCY7JCZ7JCa7JCb7JCc7JCd7JCe7JCfCivskKDskKHskKLskKPskKTskKXskKbskKfskKjskKnskKrskKvskKzskK3skK7skK/skLDskLHskLLskLPskLTskLXskLbskLfskLjskLnskLrskLvskLzskL3skL7skL8KK+yRgOyRgeyRguyRg+yRhOyRheyRhuyRh+yRiOyRieyRiuyRi+yRjOyRjeyRjuyRj+yRkOyRkeyRkuyRk+yRlOyRleyRluyRl+yRmOyRmeyRmuyRm+yRnOyRneyRnuyRnwor7JGg7JGh7JGi7JGj7JGk7JGl7JGm7JGn7JGo7JGp7JGq7JGr7JGs7JGt7JGu7JGv7JGw7JGx7JGy7JGz7JG07JG17JG27JG37JG47JG57JG67JG77JG87JG97JG+7JG/CivskoDskoHskoLskoPskoTskoXskobskofskojskonskorskovskozsko3sko7sko/skpDskpHskpLskpPskpTskpXskpbskpfskpjskpnskprskpvskpzskp3skp7skp8KK+ySoOySoeySouySo+ySpOySpeySpuySp+ySqOySqeySquySq+ySrOySreySruySr+ySsOySseySsuySs+yStOySteyStuySt+ySuOySueySuuySu+ySvOySveySvuySvwor7JOA7JOB7JOC7JOD7JOE7JOF7JOG7JOH7JOI7JOJ7JOK7JOL7JOM7JON7JOO7JOP7JOQ7JOR7JOS7JOT7JOU7JOV7JOW7JOX7JOY7JOZ7JOa7JOb7JOc7JOd7JOe7JOfCivsk6Dsk6Hsk6Lsk6Psk6Tsk6Xsk6bsk6fsk6jsk6nsk6rsk6vsk6zsk63sk67sk6/sk7Dsk7Hsk7Lsk7Psk7Tsk7Xsk7bsk7fsk7jsk7nsk7rsk7vsk7zsk73sk77sk78KK+yUgOyUgeyUguyUg+yUhOyUheyUhuyUh+yUiOyUieyUiuyUi+yUjOyUjeyUjuyUj+yUkOyUkeyUkuyUk+yUlOyUleyUluyUl+yUmOyUmeyUmuyUm+yUnOyUneyUnuyUnwor7JSg7JSh7JSi7JSj7JSk7JSl7JSm7JSn7JSo7JSp7JSq7JSr7JSs7JSt7JSu7JSv7JSw7JSx7JSy7JSz7JS07JS17JS27JS37JS47JS57JS67JS77JS87JS97JS+7JS/CivslYDslYHslYLslYPslYTslYXslYbslYfslYjslYnslYrslYvslYzslY3slY7slY/slZDslZHslZLslZPslZTslZXslZbslZfslZjslZnslZrslZvslZzslZ3slZ7slZ8KK+yVoOyVoeyVouyVo+yVpOyVpeyVpuyVp+yVqOyVqeyVquyVq+yVrOyVreyVruyVr+yVsOyVseyVsuyVs+yVtOyVteyVtuyVt+yVuOyVueyVuuyVu+yVvOyVveyVvuyVvwor7JaA7JaB7JaC7JaD7JaE7JaF7JaG7JaH7JaI7JaJ7JaK7JaL7JaM7JaN7JaO7JaP7JaQ7JaR7JaS7JaT7JaU7JaV7JaW7JaX7JaY7JaZ7Jaa7Jab7Jac7Jad7Jae7JafCivslqDslqHslqLslqPslqTslqXslqbslqfslqjslqnslqrslqvslqzslq3slq7slq/slrDslrHslrLslrPslrTslrXslrbslrfslrjslrnslrrslrvslrzslr3slr7slr8KK+yXgOyXgeyXguyXg+yXhOyXheyXhuyXh+yXiOyXieyXiuyXi+yXjOyXjeyXjuyXj+yXkOyXkeyXkuyXk+yXlOyXleyXluyXl+yXmOyXmeyXmuyXm+yXnOyXneyXnuyXnwor7Jeg7Jeh7Jei7Jej7Jek7Jel7Jem7Jen7Jeo7Jep7Jeq7Jer7Jes7Jet7Jeu7Jev7Jew7Jex7Jey7Jez7Je07Je17Je27Je37Je47Je57Je67Je77Je87Je97Je+7Je/CivsmIDsmIHsmILsmIPsmITsmIXsmIbsmIfsmIjsmInsmIrsmIvsmIzsmI3smI7smI/smJDsmJHsmJLsmJPsmJTsmJXsmJbsmJfsmJjsmJnsmJrsmJvsmJzsmJ3smJ7smJ8KK+yYoOyYoeyYouyYo+yYpOyYpeyYpuyYp+yYqOyYqeyYquyYq+yYrOyYreyYruyYr+yYsOyYseyYsuyYs+yYtOyYteyYtuyYt+yYuOyYueyYuuyYu+yYvOyYveyYvuyYvwor7JmA7JmB7JmC7JmD7JmE7JmF7JmG7JmH7JmI7JmJ7JmK7JmL7JmM7JmN7JmO7JmP7JmQ7JmR7JmS7JmT7JmU7JmV7JmW7JmX7JmY7JmZ7Jma7Jmb7Jmc7Jmd7Jme7JmfCivsmaDsmaHsmaLsmaPsmaTsmaXsmabsmafsmajsmansmarsmavsmazsma3sma7sma/smbDsmbHsmbLsmbPsmbTsmbXsmbbsmbfsmbjsmbnsmbrsmbvsmbzsmb3smb7smb8KK+yagOyageyaguyag+yahOyaheyahuyah+yaiOyaieyaiuyai+yajOyajeyajuyaj+yakOyakeyakuyak+yalOyaleyaluyal+yamOyameyamuyam+yanOyaneyanuyanwor7Jqg7Jqh7Jqi7Jqj7Jqk7Jql7Jqm7Jqn7Jqo7Jqp7Jqq7Jqr7Jqs7Jqt7Jqu7Jqv7Jqw7Jqx7Jqy7Jqz7Jq07Jq17Jq27Jq37Jq47Jq57Jq67Jq77Jq87Jq97Jq+7Jq/Civsm4Dsm4Hsm4Lsm4Psm4Tsm4Xsm4bsm4fsm4jsm4nsm4rsm4vsm4zsm43sm47sm4/sm5Dsm5Hsm5Lsm5Psm5Tsm5Xsm5bsm5fsm5jsm5nsm5rsm5vsm5zsm53sm57sm58KK+yboOyboeybouybo+ybpOybpeybpuybp+ybqOybqeybquybq+ybrOybreybruybr+ybsOybseybsuybs+ybtOybteybtuybt+ybuOybueybuuybu+ybvOybveybvuybvwor7JyA7JyB7JyC7JyD7JyE7JyF7JyG7JyH7JyI7JyJ7JyK7JyL7JyM7JyN7JyO7JyP7JyQ7JyR7JyS7JyT7JyU7JyV7JyW7JyX7JyY7JyZ7Jya7Jyb7Jyc7Jyd7Jye7JyfCivsnKDsnKHsnKLsnKPsnKTsnKXsnKbsnKfsnKjsnKnsnKrsnKvsnKzsnK3snK7snK/snLDsnLHsnLLsnLPsnLTsnLXsnLbsnLfsnLjsnLnsnLrsnLvsnLzsnL3snL7snL8KK+ydgOydgeydguydg+ydhOydheydhuydh+ydiOydieydiuydi+ydjOydjeydjuydj+ydkOydkeydkuydk+ydlOydleydluydl+ydmOydmeydmuydm+ydnOydneydnuydnwor7J2g7J2h7J2i7J2j7J2k7J2l7J2m7J2n7J2o7J2p7J2q7J2r7J2s7J2t7J2u7J2v7J2w7J2x7J2y7J2z7J207J217J227J237J247J257J267J277J287J297J2+7J2/CivsnoDsnoHsnoLsnoPsnoTsnoXsnobsnofsnojsnonsnorsnovsnozsno3sno7sno/snpDsnpHsnpLsnpPsnpTsnpXsnpbsnpfsnpjsnpnsnprsnpvsnpzsnp3snp7snp8KK+yeoOyeoeyeouyeo+yepOyepeyepuyep+yeqOyeqeyequyeq+yerOyereyeruyer+yesOyeseyesuyes+yetOyeteyetuyet+yeuOyeueyeuuyeu+yevOyeveyevuyevwor7J+A7J+B7J+C7J+D7J+E7J+F7J+G7J+H7J+I7J+J7J+K7J+L7J+M7J+N7J+O7J+P7J+Q7J+R7J+S7J+T7J+U7J+V7J+W7J+X7J+Y7J+Z7J+a7J+b7J+c7J+d7J+e7J+fCivsn6Dsn6Hsn6Lsn6Psn6Tsn6Xsn6bsn6fsn6jsn6nsn6rsn6vsn6zsn63sn67sn6/sn7Dsn7Hsn7Lsn7Psn7Tsn7Xsn7bsn7fsn7jsn7nsn7rsn7vsn7zsn73sn77sn78KK+yggOyggeygguygg+yghOygheyghuygh+ygiOygieygiuygi+ygjOygjeygjuygj+ygkOygkeygkuygk+yglOygleygluygl+ygmOygmeygmuygm+ygnOygneygnuygnwor7KCg7KCh7KCi7KCj7KCk7KCl7KCm7KCn7KCo7KCp7KCq7KCr7KCs7KCt7KCu7KCv7KCw7KCx7KCy7KCz7KC07KC17KC27KC37KC47KC57KC67KC77KC87KC97KC+7KC/CivsoYDsoYHsoYLsoYPsoYTsoYXsoYbsoYfsoYjsoYnsoYrsoYvsoYzsoY3soY7soY/soZDsoZHsoZLsoZPsoZTsoZXsoZbsoZfsoZjsoZnsoZrsoZvsoZzsoZ3soZ7soZ8KK+yhoOyhoeyhouyho+yhpOyhpeyhpuyhp+yhqOyhqeyhquyhq+yhrOyhreyhruyhr+yhsOyhseyhsuyhs+yhtOyhteyhtuyht+yhuOyhueyhuuyhu+yhvOyhveyhvuyhvwor7KKA7KKB7KKC7KKD7KKE7KKF7KKG7KKH7KKI7KKJ7KKK7KKL7KKM7KKN7KKO7KKP7KKQ7KKR7KKS7KKT7KKU7KKV7KKW7KKX7KKY7KKZ7KKa7KKb7KKc7KKd7KKe7KKfCivsoqDsoqHsoqLsoqPsoqTsoqXsoqbsoqfsoqjsoqnsoqrsoqvsoqzsoq3soq7soq/sorDsorHsorLsorPsorTsorXsorbsorfsorjsornsorrsorvsorzsor3sor7sor8KK+yjgOyjgeyjguyjg+yjhOyjheyjhuyjh+yjiOyjieyjiuyji+yjjOyjjeyjjuyjj+yjkOyjkeyjkuyjk+yjlOyjleyjluyjl+yjmOyjmeyjmuyjm+yjnOyjneyjnuyjnwor7KOg7KOh7KOi7KOj7KOk7KOl7KOm7KOn7KOo7KOp7KOq7KOr7KOs7KOt7KOu7KOv7KOw7KOx7KOy7KOz7KO07KO17KO27KO37KO47KO57KO67KO77KO87KO97KO+7KO/CivspIDspIHspILspIPspITspIXspIbspIfspIjspInspIrspIvspIzspI3spI7spI/spJDspJHspJLspJPspJTspJXspJbspJfspJjspJnspJrspJvspJzspJ3spJ7spJ8KK+ykoOykoeykouyko+ykpOykpeykpuykp+ykqOykqeykquykq+ykrOykreykruykr+yksOykseyksuyks+yktOykteyktuykt+ykuOykueykuuyku+ykvOykveykvuykvwor7KWA7KWB7KWC7KWD7KWE7KWF7KWG7KWH7KWI7KWJ7KWK7KWL7KWM7KWN7KWO7KWP7KWQ7KWR7KWS7KWT7KWU7KWV7KWW7KWX7KWY7KWZ7KWa7KWb7KWc7KWd7KWe7KWfCivspaDspaHspaLspaPspaTspaXspabspafspajspansparspavspazspa3spa7spa/spbDspbHspbLspbPspbTspbXspbbspbfspbjspbnspbrspbvspbzspb3spb7spb8KK+ymgOymgeymguymg+ymhOymheymhuymh+ymiOymieymiuymi+ymjOymjeymjuymj+ymkOymkeymkuymk+ymlOymleymluyml+ymmOymmeymmuymm+ymnOymneymnuymnwor7Kag7Kah7Kai7Kaj7Kak7Kal7Kam7Kan7Kao7Kap7Kaq7Kar7Kas7Kat7Kau7Kav7Kaw7Kax7Kay7Kaz7Ka07Ka17Ka27Ka37Ka47Ka57Ka67Ka77Ka87Ka97Ka+7Ka/Civsp4Dsp4Hsp4Lsp4Psp4Tsp4Xsp4bsp4fsp4jsp4nsp4rsp4vsp4zsp43sp47sp4/sp5Dsp5Hsp5Lsp5Psp5Tsp5Xsp5bsp5fsp5jsp5nsp5rsp5vsp5zsp53sp57sp58KK+ynoOynoeynouyno+ynpOynpeynpuynp+ynqOynqeynquynq+ynrOynreynruynr+ynsOynseynsuyns+yntOynteyntuynt+ynuOynueynuuynu+ynvOynveynvuynvwor7KiA7KiB7KiC7KiD7KiE7KiF7KiG7KiH7KiI7KiJ7KiK7KiL7KiM7KiN7KiO7KiP7KiQ7KiR7KiS7KiT7KiU7KiV7KiW7KiX7KiY7KiZ7Kia7Kib7Kic7Kid7Kie7KifCivsqKDsqKHsqKLsqKPsqKTsqKXsqKbsqKfsqKjsqKnsqKrsqKvsqKzsqK3sqK7sqK/sqLDsqLHsqLLsqLPsqLTsqLXsqLbsqLfsqLjsqLnsqLrsqLvsqLzsqL3sqL7sqL8KK+ypgOypgeypguypg+yphOypheyphuyph+ypiOypieypiuypi+ypjOypjeypjuypj+ypkOypkeypkuypk+yplOypleypluypl+ypmOypmeypmuypm+ypnOypneypnuypnwor7Kmg7Kmh7Kmi7Kmj7Kmk7Kml7Kmm7Kmn7Kmo7Kmp7Kmq7Kmr7Kms7Kmt7Kmu7Kmv7Kmw7Kmx7Kmy7Kmz7Km07Km17Km27Km37Km47Km57Km67Km77Km87Km97Km+7Km/CivsqoDsqoHsqoLsqoPsqoTsqoXsqobsqofsqojsqonsqorsqovsqozsqo3sqo7sqo/sqpDsqpHsqpLsqpPsqpTsqpXsqpbsqpfsqpjsqpnsqprsqpvsqpzsqp3sqp7sqp8KK+yqoOyqoeyqouyqo+yqpOyqpeyqpuyqp+yqqOyqqeyqquyqq+yqrOyqreyqruyqr+yqsOyqseyqsuyqs+yqtOyqteyqtuyqt+yquOyqueyquuyqu+yqvOyqveyqvuyqvwor7KuA7KuB7KuC7KuD7KuE7KuF7KuG7KuH7KuI7KuJ7KuK7KuL7KuM7KuN7KuO7KuP7KuQ7KuR7KuS7KuT7KuU7KuV7KuW7KuX7KuY7KuZ7Kua7Kub7Kuc7Kud7Kue7KufCivsq6Dsq6Hsq6Lsq6Psq6Tsq6Xsq6bsq6fsq6jsq6nsq6rsq6vsq6zsq63sq67sq6/sq7Dsq7Hsq7Lsq7Psq7Tsq7Xsq7bsq7fsq7jsq7nsq7rsq7vsq7zsq73sq77sq78KK+ysgOysgeysguysg+yshOysheyshuysh+ysiOysieysiuysi+ysjOysjeysjuysj+yskOyskeyskuysk+yslOysleysluysl+ysmOysmeysmuysm+ysnOysneysnuysnwor7Kyg7Kyh7Kyi7Kyj7Kyk7Kyl7Kym7Kyn7Kyo7Kyp7Kyq7Kyr7Kys7Kyt7Kyu7Kyv7Kyw7Kyx7Kyy7Kyz7Ky07Ky17Ky27Ky37Ky47Ky57Ky67Ky77Ky87Ky97Ky+7Ky/CivsrYDsrYHsrYLsrYPsrYTsrYXsrYbsrYfsrYjsrYnsrYrsrYvsrYzsrY3srY7srY/srZDsrZHsrZLsrZPsrZTsrZXsrZbsrZfsrZjsrZnsrZrsrZvsrZzsrZ3srZ7srZ8KK+ytoOytoeytouyto+ytpOytpeytpuytp+ytqOytqeytquytq+ytrOytreytruytr+ytsOytseytsuyts+yttOytteyttuytt+ytuOytueytuuytu+ytvOytveytvuytvwor7K6A7K6B7K6C7K6D7K6E7K6F7K6G7K6H7K6I7K6J7K6K7K6L7K6M7K6N7K6O7K6P7K6Q7K6R7K6S7K6T7K6U7K6V7K6W7K6X7K6Y7K6Z7K6a7K6b7K6c7K6d7K6e7K6fCivsrqDsrqHsrqLsrqPsrqTsrqXsrqbsrqfsrqjsrqnsrqrsrqvsrqzsrq3srq7srq/srrDsrrHsrrLsrrPsrrTsrrXsrrbsrrfsrrjsrrnsrrrsrrvsrrzsrr3srr7srr8KK+yvgOyvgeyvguyvg+yvhOyvheyvhuyvh+yviOyvieyviuyvi+yvjOyvjeyvjuyvj+yvkOyvkeyvkuyvk+yvlOyvleyvluyvl+yvmOyvmeyvmuyvm+yvnOyvneyvnuyvnwor7K+g7K+h7K+i7K+j7K+k7K+l7K+m7K+n7K+o7K+p7K+q7K+r7K+s7K+t7K+u7K+v7K+w7K+x7K+y7K+z7K+07K+17K+27K+37K+47K+57K+67K+77K+87K+97K++7K+/CivssIDssIHssILssIPssITssIXssIbssIfssIjssInssIrssIvssIzssI3ssI7ssI/ssJDssJHssJLssJPssJTssJXssJbssJfssJjssJnssJrssJvssJzssJ3ssJ7ssJ8KK+ywoOywoeywouywo+ywpOywpeywpuywp+ywqOywqeywquywq+ywrOywreywruywr+ywsOywseywsuyws+ywtOywteywtuywt+ywuOywueywuuywu+ywvOywveywvuywvwor7LGA7LGB7LGC7LGD7LGE7LGF7LGG7LGH7LGI7LGJ7LGK7LGL7LGM7LGN7LGO7LGP7LGQ7LGR7LGS7LGT7LGU7LGV7LGW7LGX7LGY7LGZ7LGa7LGb7LGc7LGd7LGe7LGfCivssaDssaHssaLssaPssaTssaXssabssafssajssanssarssavssazssa3ssa7ssa/ssbDssbHssbLssbPssbTssbXssbbssbfssbjssbnssbrssbvssbzssb3ssb7ssb8KK+yygOyygeyyguyyg+yyhOyyheyyhuyyh+yyiOyyieyyiuyyi+yyjOyyjeyyjuyyj+yykOyykeyykuyyk+yylOyyleyyluyyl+yymOyymeyymuyym+yynOyyneyynuyynwor7LKg7LKh7LKi7LKj7LKk7LKl7LKm7LKn7LKo7LKp7LKq7LKr7LKs7LKt7LKu7LKv7LKw7LKx7LKy7LKz7LK07LK17LK27LK37LK47LK57LK67LK77LK87LK97LK+7LK/Civss4Dss4Hss4Lss4Pss4Tss4Xss4bss4fss4jss4nss4rss4vss4zss43ss47ss4/ss5Dss5Hss5Lss5Pss5Tss5Xss5bss5fss5jss5nss5rss5vss5zss53ss57ss58KK+yzoOyzoeyzouyzo+yzpOyzpeyzpuyzp+yzqOyzqeyzquyzq+yzrOyzreyzruyzr+yzsOyzseyzsuyzs+yztOyzteyztuyzt+yzuOyzueyzuuyzu+yzvOyzveyzvuyzvwor7LSA7LSB7LSC7LSD7LSE7LSF7LSG7LSH7LSI7LSJ7LSK7LSL7LSM7LSN7LSO7LSP7LSQ7LSR7LSS7LST7LSU7LSV7LSW7LSX7LSY7LSZ7LSa7LSb7LSc7LSd7LSe7LSfCivstKDstKHstKLstKPstKTstKXstKbstKfstKjstKnstKrstKvstKzstK3stK7stK/stLDstLHstLLstLPstLTstLXstLbstLfstLjstLnstLrstLvstLzstL3stL7stL8KK+y1gOy1gey1guy1g+y1hOy1hey1huy1h+y1iOy1iey1iuy1i+y1jOy1jey1juy1j+y1kOy1key1kuy1k+y1lOy1ley1luy1l+y1mOy1mey1muy1m+y1nOy1ney1nuy1nwor7LWg7LWh7LWi7LWj7LWk7LWl7LWm7LWn7LWo7LWp7LWq7LWr7LWs7LWt7LWu7LWv7LWw7LWx7LWy7LWz7LW07LW17LW27LW37LW47LW57LW67LW77LW87LW97LW+7LW/CivstoDstoHstoLstoPstoTstoXstobstofstojstonstorstovstozsto3sto7sto/stpDstpHstpLstpPstpTstpXstpbstpfstpjstpnstprstpvstpzstp3stp7stp8KK+y2oOy2oey2ouy2o+y2pOy2pey2puy2p+y2qOy2qey2quy2q+y2rOy2rey2ruy2r+y2sOy2sey2suy2s+y2tOy2tey2tuy2t+y2uOy2uey2uuy2u+y2vOy2vey2vuy2vwor7LeA7LeB7LeC7LeD7LeE7LeF7LeG7LeH7LeI7LeJ7LeK7LeL7LeM7LeN7LeO7LeP7LeQ7LeR7LeS7LeT7LeU7LeV7LeW7LeX7LeY7LeZ7Lea7Leb7Lec7Led7Lee7LefCivst6Dst6Hst6Lst6Pst6Tst6Xst6bst6fst6jst6nst6rst6vst6zst63st67st6/st7Dst7Hst7Lst7Pst7Tst7Xst7bst7fst7jst7nst7rst7vst7zst73st77st78KK+y4gOy4gey4guy4g+y4hOy4hey4huy4h+y4iOy4iey4iuy4i+y4jOy4jey4juy4j+y4kOy4key4kuy4k+y4lOy4ley4luy4l+y4mOy4mey4muy4m+y4nOy4ney4nuy4nwor7Lig7Lih7Lii7Lij7Lik7Lil7Lim7Lin7Lio7Lip7Liq7Lir7Lis7Lit7Liu7Liv7Liw7Lix7Liy7Liz7Li07Li17Li27Li37Li47Li57Li67Li77Li87Li97Li+7Li/CivsuYDsuYHsuYLsuYPsuYTsuYXsuYbsuYfsuYjsuYnsuYrsuYvsuYzsuY3suY7suY/suZDsuZHsuZLsuZPsuZTsuZXsuZbsuZfsuZjsuZnsuZrsuZvsuZzsuZ3suZ7suZ8KK+y5oOy5oey5ouy5o+y5pOy5pey5puy5p+y5qOy5qey5quy5q+y5rOy5rey5ruy5r+y5sOy5sey5suy5s+y5tOy5tey5tuy5t+y5uOy5uey5uuy5u+y5vOy5vey5vuy5vwor7LqA7LqB7LqC7LqD7LqE7LqF7LqG7LqH7LqI7LqJ7LqK7LqL7LqM7LqN7LqO7LqP7LqQ7LqR7LqS7LqT7LqU7LqV7LqW7LqX7LqY7LqZ7Lqa7Lqb7Lqc7Lqd7Lqe7LqfCivsuqDsuqHsuqLsuqPsuqTsuqXsuqbsuqfsuqjsuqnsuqrsuqvsuqzsuq3suq7suq/surDsurHsurLsurPsurTsurXsurbsurfsurjsurnsurrsurvsurzsur3sur7sur8KK+y7gOy7gey7guy7g+y7hOy7hey7huy7h+y7iOy7iey7iuy7i+y7jOy7jey7juy7j+y7kOy7key7kuy7k+y7lOy7ley7luy7l+y7mOy7mey7muy7m+y7nOy7ney7nuy7nwor7Lug7Luh7Lui7Luj7Luk7Lul7Lum7Lun7Luo7Lup7Luq7Lur7Lus7Lut7Luu7Luv7Luw7Lux7Luy7Luz7Lu07Lu17Lu27Lu37Lu47Lu57Lu67Lu77Lu87Lu97Lu+7Lu/CivsvIDsvIHsvILsvIPsvITsvIXsvIbsvIfsvIjsvInsvIrsvIvsvIzsvI3svI7svI/svJDsvJHsvJLsvJPsvJTsvJXsvJbsvJfsvJjsvJnsvJrsvJvsvJzsvJ3svJ7svJ8KK+y8oOy8oey8ouy8o+y8pOy8pey8puy8p+y8qOy8qey8quy8q+y8rOy8rey8ruy8r+y8sOy8sey8suy8s+y8tOy8tey8tuy8t+y8uOy8uey8uuy8u+y8vOy8vey8vuy8vwor7L2A7L2B7L2C7L2D7L2E7L2F7L2G7L2H7L2I7L2J7L2K7L2L7L2M7L2N7L2O7L2P7L2Q7L2R7L2S7L2T7L2U7L2V7L2W7L2X7L2Y7L2Z7L2a7L2b7L2c7L2d7L2e7L2fCivsvaDsvaHsvaLsvaPsvaTsvaXsvabsvafsvajsvansvarsvavsvazsva3sva7sva/svbDsvbHsvbLsvbPsvbTsvbXsvbbsvbfsvbjsvbnsvbrsvbvsvbzsvb3svb7svb8KK+y+gOy+gey+guy+g+y+hOy+hey+huy+h+y+iOy+iey+iuy+i+y+jOy+jey+juy+j+y+kOy+key+kuy+k+y+lOy+ley+luy+l+y+mOy+mey+muy+m+y+nOy+ney+nuy+nwor7L6g7L6h7L6i7L6j7L6k7L6l7L6m7L6n7L6o7L6p7L6q7L6r7L6s7L6t7L6u7L6v7L6w7L6x7L6y7L6z7L607L617L627L637L647L657L667L677L687L697L6+7L6/Civsv4Dsv4Hsv4Lsv4Psv4Tsv4Xsv4bsv4fsv4jsv4nsv4rsv4vsv4zsv43sv47sv4/sv5Dsv5Hsv5Lsv5Psv5Tsv5Xsv5bsv5fsv5jsv5nsv5rsv5vsv5zsv53sv57sv58KK+y/oOy/oey/ouy/o+y/pOy/pey/puy/p+y/qOy/qey/quy/q+y/rOy/rey/ruy/r+y/sOy/sey/suy/s+y/tOy/tey/tuy/t+y/uOy/uey/uuy/u+y/vOy/vey/vuy/vwor7YCA7YCB7YCC7YCD7YCE7YCF7YCG7YCH7YCI7YCJ7YCK7YCL7YCM7YCN7YCO7YCP7YCQ7YCR7YCS7YCT7YCU7YCV7YCW7YCX7YCY7YCZ7YCa7YCb7YCc7YCd7YCe7YCfCivtgKDtgKHtgKLtgKPtgKTtgKXtgKbtgKftgKjtgKntgKrtgKvtgKztgK3tgK7tgK/tgLDtgLHtgLLtgLPtgLTtgLXtgLbtgLftgLjtgLntgLrtgLvtgLztgL3tgL7tgL8KK+2BgO2Bge2Bgu2Bg+2BhO2Bhe2Bhu2Bh+2BiO2Bie2Biu2Bi+2BjO2Bje2Bju2Bj+2BkO2Bke2Bku2Bk+2BlO2Ble2Blu2Bl+2BmO2Bme2Bmu2Bm+2BnO2Bne2Bnu2Bnwor7YGg7YGh7YGi7YGj7YGk7YGl7YGm7YGn7YGo7YGp7YGq7YGr7YGs7YGt7YGu7YGv7YGw7YGx7YGy7YGz7YG07YG17YG27YG37YG47YG57YG67YG77YG87YG97YG+7YG/CivtgoDtgoHtgoLtgoPtgoTtgoXtgobtgoftgojtgontgortgovtgoztgo3tgo7tgo/tgpDtgpHtgpLtgpPtgpTtgpXtgpbtgpftgpjtgpntgprtgpvtgpztgp3tgp7tgp8KK+2CoO2Coe2Cou2Co+2CpO2Cpe2Cpu2Cp+2CqO2Cqe2Cqu2Cq+2CrO2Cre2Cru2Cr+2CsO2Cse2Csu2Cs+2CtO2Cte2Ctu2Ct+2CuO2Cue2Cuu2Cu+2CvO2Cve2Cvu2Cvwor7YOA7YOB7YOC7YOD7YOE7YOF7YOG7YOH7YOI7YOJ7YOK7YOL7YOM7YON7YOO7YOP7YOQ7YOR7YOS7YOT7YOU7YOV7YOW7YOX7YOY7YOZ7YOa7YOb7YOc7YOd7YOe7YOfCivtg6Dtg6Htg6Ltg6Ptg6Ttg6Xtg6btg6ftg6jtg6ntg6rtg6vtg6ztg63tg67tg6/tg7Dtg7Htg7Ltg7Ptg7Ttg7Xtg7btg7ftg7jtg7ntg7rtg7vtg7ztg73tg77tg78KK+2EgO2Ege2Egu2Eg+2EhO2Ehe2Ehu2Eh+2EiO2Eie2Eiu2Ei+2EjO2Eje2Eju2Ej+2EkO2Eke2Eku2Ek+2ElO2Ele2Elu2El+2EmO2Eme2Emu2Em+2EnO2Ene2Enu2Enwor7YSg7YSh7YSi7YSj7YSk7YSl7YSm7YSn7YSo7YSp7YSq7YSr7YSs7YSt7YSu7YSv7YSw7YSx7YSy7YSz7YS07YS17YS27YS37YS47YS57YS67YS77YS87YS97YS+7YS/CivthYDthYHthYLthYPthYTthYXthYbthYfthYjthYnthYrthYvthYzthY3thY7thY/thZDthZHthZLthZPthZTthZXthZbthZfthZjthZnthZrthZvthZzthZ3thZ7thZ8KK+2FoO2Foe2Fou2Fo+2FpO2Fpe2Fpu2Fp+2FqO2Fqe2Fqu2Fq+2FrO2Fre2Fru2Fr+2FsO2Fse2Fsu2Fs+2FtO2Fte2Ftu2Ft+2FuO2Fue2Fuu2Fu+2FvO2Fve2Fvu2Fvwor7YaA7YaB7YaC7YaD7YaE7YaF7YaG7YaH7YaI7YaJ7YaK7YaL7YaM7YaN7YaO7YaP7YaQ7YaR7YaS7YaT7YaU7YaV7YaW7YaX7YaY7YaZ7Yaa7Yab7Yac7Yad7Yae7YafCivthqDthqHthqLthqPthqTthqXthqbthqfthqjthqnthqrthqvthqzthq3thq7thq/thrDthrHthrLthrPthrTthrXthrbthrfthrjthrnthrrthrvthrzthr3thr7thr8KK+2HgO2Hge2Hgu2Hg+2HhO2Hhe2Hhu2Hh+2HiO2Hie2Hiu2Hi+2HjO2Hje2Hju2Hj+2HkO2Hke2Hku2Hk+2HlO2Hle2Hlu2Hl+2HmO2Hme2Hmu2Hm+2HnO2Hne2Hnu2Hnwor7Yeg7Yeh7Yei7Yej7Yek7Yel7Yem7Yen7Yeo7Yep7Yeq7Yer7Yes7Yet7Yeu7Yev7Yew7Yex7Yey7Yez7Ye07Ye17Ye27Ye37Ye47Ye57Ye67Ye77Ye87Ye97Ye+7Ye/CivtiIDtiIHtiILtiIPtiITtiIXtiIbtiIftiIjtiIntiIrtiIvtiIztiI3tiI7tiI/tiJDtiJHtiJLtiJPtiJTtiJXtiJbtiJftiJjtiJntiJrtiJvtiJztiJ3tiJ7tiJ8KK+2IoO2Ioe2Iou2Io+2IpO2Ipe2Ipu2Ip+2IqO2Iqe2Iqu2Iq+2IrO2Ire2Iru2Ir+2IsO2Ise2Isu2Is+2ItO2Ite2Itu2It+2IuO2Iue2Iuu2Iu+2IvO2Ive2Ivu2Ivwor7YmA7YmB7YmC7YmD7YmE7YmF7YmG7YmH7YmI7YmJ7YmK7YmL7YmM7YmN7YmO7YmP7YmQ7YmR7YmS7YmT7YmU7YmV7YmW7YmX7YmY7YmZ7Yma7Ymb7Ymc7Ymd7Yme7YmfCivtiaDtiaHtiaLtiaPtiaTtiaXtiabtiaftiajtiantiartiavtiaztia3tia7tia/tibDtibHtibLtibPtibTtibXtibbtibftibjtibntibrtibvtibztib3tib7tib8KK+2KgO2Kge2Kgu2Kg+2KhO2Khe2Khu2Kh+2KiO2Kie2Kiu2Ki+2KjO2Kje2Kju2Kj+2KkO2Kke2Kku2Kk+2KlO2Kle2Klu2Kl+2KmO2Kme2Kmu2Km+2KnO2Kne2Knu2Knwor7Yqg7Yqh7Yqi7Yqj7Yqk7Yql7Yqm7Yqn7Yqo7Yqp7Yqq7Yqr7Yqs7Yqt7Yqu7Yqv7Yqw7Yqx7Yqy7Yqz7Yq07Yq17Yq27Yq37Yq47Yq57Yq67Yq77Yq87Yq97Yq+7Yq/Civti4Dti4Hti4Lti4Pti4Tti4Xti4bti4fti4jti4nti4rti4vti4zti43ti47ti4/ti5Dti5Hti5Lti5Pti5Tti5Xti5bti5fti5jti5nti5rti5vti5zti53ti57ti58KK+2LoO2Loe2Lou2Lo+2LpO2Lpe2Lpu2Lp+2LqO2Lqe2Lqu2Lq+2LrO2Lre2Lru2Lr+2LsO2Lse2Lsu2Ls+2LtO2Lte2Ltu2Lt+2LuO2Lue2Luu2Lu+2LvO2Lve2Lvu2Lvwor7YyA7YyB7YyC7YyD7YyE7YyF7YyG7YyH7YyI7YyJ7YyK7YyL7YyM7YyN7YyO7YyP7YyQ7YyR7YyS7YyT7YyU7YyV7YyW7YyX7YyY7YyZ7Yya7Yyb7Yyc7Yyd7Yye7YyfCivtjKDtjKHtjKLtjKPtjKTtjKXtjKbtjKftjKjtjKntjKrtjKvtjKztjK3tjK7tjK/tjLDtjLHtjLLtjLPtjLTtjLXtjLbtjLftjLjtjLntjLrtjLvtjLztjL3tjL7tjL8KK+2NgO2Nge2Ngu2Ng+2NhO2Nhe2Nhu2Nh+2NiO2Nie2Niu2Ni+2NjO2Nje2Nju2Nj+2NkO2Nke2Nku2Nk+2NlO2Nle2Nlu2Nl+2NmO2Nme2Nmu2Nm+2NnO2Nne2Nnu2Nnwor7Y2g7Y2h7Y2i7Y2j7Y2k7Y2l7Y2m7Y2n7Y2o7Y2p7Y2q7Y2r7Y2s7Y2t7Y2u7Y2v7Y2w7Y2x7Y2y7Y2z7Y207Y217Y227Y237Y247Y257Y267Y277Y287Y297Y2+7Y2/CivtjoDtjoHtjoLtjoPtjoTtjoXtjobtjoftjojtjontjortjovtjoztjo3tjo7tjo/tjpDtjpHtjpLtjpPtjpTtjpXtjpbtjpftjpjtjpntjprtjpvtjpztjp3tjp7tjp8KK+2OoO2Ooe2Oou2Oo+2OpO2Ope2Opu2Op+2OqO2Oqe2Oqu2Oq+2OrO2Ore2Oru2Or+2OsO2Ose2Osu2Os+2OtO2Ote2Otu2Ot+2OuO2Oue2Ouu2Ou+2OvO2Ove2Ovu2Ovwor7Y+A7Y+B7Y+C7Y+D7Y+E7Y+F7Y+G7Y+H7Y+I7Y+J7Y+K7Y+L7Y+M7Y+N7Y+O7Y+P7Y+Q7Y+R7Y+S7Y+T7Y+U7Y+V7Y+W7Y+X7Y+Y7Y+Z7Y+a7Y+b7Y+c7Y+d7Y+e7Y+fCivtj6Dtj6Htj6Ltj6Ptj6Ttj6Xtj6btj6ftj6jtj6ntj6rtj6vtj6ztj63tj67tj6/tj7Dtj7Htj7Ltj7Ptj7Ttj7Xtj7btj7ftj7jtj7ntj7rtj7vtj7ztj73tj77tj78KK+2QgO2Qge2Qgu2Qg+2QhO2Qhe2Qhu2Qh+2QiO2Qie2Qiu2Qi+2QjO2Qje2Qju2Qj+2QkO2Qke2Qku2Qk+2QlO2Qle2Qlu2Ql+2QmO2Qme2Qmu2Qm+2QnO2Qne2Qnu2Qnwor7ZCg7ZCh7ZCi7ZCj7ZCk7ZCl7ZCm7ZCn7ZCo7ZCp7ZCq7ZCr7ZCs7ZCt7ZCu7ZCv7ZCw7ZCx7ZCy7ZCz7ZC07ZC17ZC27ZC37ZC47ZC57ZC67ZC77ZC87ZC97ZC+7ZC/CivtkYDtkYHtkYLtkYPtkYTtkYXtkYbtkYftkYjtkYntkYrtkYvtkYztkY3tkY7tkY/tkZDtkZHtkZLtkZPtkZTtkZXtkZbtkZftkZjtkZntkZrtkZvtkZztkZ3tkZ7tkZ8KK+2RoO2Roe2Rou2Ro+2RpO2Rpe2Rpu2Rp+2RqO2Rqe2Rqu2Rq+2RrO2Rre2Rru2Rr+2RsO2Rse2Rsu2Rs+2RtO2Rte2Rtu2Rt+2RuO2Rue2Ruu2Ru+2RvO2Rve2Rvu2Rvwor7ZKA7ZKB7ZKC7ZKD7ZKE7ZKF7ZKG7ZKH7ZKI7ZKJ7ZKK7ZKL7ZKM7ZKN7ZKO7ZKP7ZKQ7ZKR7ZKS7ZKT7ZKU7ZKV7ZKW7ZKX7ZKY7ZKZ7ZKa7ZKb7ZKc7ZKd7ZKe7ZKfCivtkqDtkqHtkqLtkqPtkqTtkqXtkqbtkqftkqjtkqntkqrtkqvtkqztkq3tkq7tkq/tkrDtkrHtkrLtkrPtkrTtkrXtkrbtkrftkrjtkrntkrrtkrvtkrztkr3tkr7tkr8KK+2TgO2Tge2Tgu2Tg+2ThO2The2Thu2Th+2TiO2Tie2Tiu2Ti+2TjO2Tje2Tju2Tj+2TkO2Tke2Tku2Tk+2TlO2Tle2Tlu2Tl+2TmO2Tme2Tmu2Tm+2TnO2Tne2Tnu2Tnwor7ZOg7ZOh7ZOi7ZOj7ZOk7ZOl7ZOm7ZOn7ZOo7ZOp7ZOq7ZOr7ZOs7ZOt7ZOu7ZOv7ZOw7ZOx7ZOy7ZOz7ZO07ZO17ZO27ZO37ZO47ZO57ZO67ZO77ZO87ZO97ZO+7ZO/CivtlIDtlIHtlILtlIPtlITtlIXtlIbtlIftlIjtlIntlIrtlIvtlIztlI3tlI7tlI/tlJDtlJHtlJLtlJPtlJTtlJXtlJbtlJftlJjtlJntlJrtlJvtlJztlJ3tlJ7tlJ8KK+2UoO2Uoe2Uou2Uo+2UpO2Upe2Upu2Up+2UqO2Uqe2Uqu2Uq+2UrO2Ure2Uru2Ur+2UsO2Use2Usu2Us+2UtO2Ute2Utu2Ut+2UuO2Uue2Uuu2Uu+2UvO2Uve2Uvu2Uvwor7ZWA7ZWB7ZWC7ZWD7ZWE7ZWF7ZWG7ZWH7ZWI7ZWJ7ZWK7ZWL7ZWM7ZWN7ZWO7ZWP7ZWQ7ZWR7ZWS7ZWT7ZWU7ZWV7ZWW7ZWX7ZWY7ZWZ7ZWa7ZWb7ZWc7ZWd7ZWe7ZWfCivtlaDtlaHtlaLtlaPtlaTtlaXtlabtlaftlajtlantlartlavtlaztla3tla7tla/tlbDtlbHtlbLtlbPtlbTtlbXtlbbtlbftlbjtlbntlbrtlbvtlbztlb3tlb7tlb8KK+2WgO2Wge2Wgu2Wg+2WhO2Whe2Whu2Wh+2WiO2Wie2Wiu2Wi+2WjO2Wje2Wju2Wj+2WkO2Wke2Wku2Wk+2WlO2Wle2Wlu2Wl+2WmO2Wme2Wmu2Wm+2WnO2Wne2Wnu2Wnwor7Zag7Zah7Zai7Zaj7Zak7Zal7Zam7Zan7Zao7Zap7Zaq7Zar7Zas7Zat7Zau7Zav7Zaw7Zax7Zay7Zaz7Za07Za17Za27Za37Za47Za57Za67Za77Za87Za97Za+7Za/Civtl4Dtl4Htl4Ltl4Ptl4Ttl4Xtl4btl4ftl4jtl4ntl4rtl4vtl4ztl43tl47tl4/tl5Dtl5Htl5Ltl5Ptl5Ttl5Xtl5btl5ftl5jtl5ntl5rtl5vtl5ztl53tl57tl58KK+2XoO2Xoe2Xou2Xo+2XpO2Xpe2Xpu2Xp+2XqO2Xqe2Xqu2Xq+2XrO2Xre2Xru2Xr+2XsO2Xse2Xsu2Xs+2XtO2Xte2Xtu2Xt+2XuO2Xue2Xuu2Xu+2XvO2Xve2Xvu2Xvwor7ZiA7ZiB7ZiC7ZiD7ZiE7ZiF7ZiG7ZiH7ZiI7ZiJ7ZiK7ZiL7ZiM7ZiN7ZiO7ZiP7ZiQ7ZiR7ZiS7ZiT7ZiU7ZiV7ZiW7ZiX7ZiY7ZiZ7Zia7Zib7Zic7Zid7Zie7ZifCivtmKDtmKHtmKLtmKPtmKTtmKXtmKbtmKftmKjtmKntmKrtmKvtmKztmK3tmK7tmK/tmLDtmLHtmLLtmLPtmLTtmLXtmLbtmLftmLjtmLntmLrtmLvtmLztmL3tmL7tmL8KK+2ZgO2Zge2Zgu2Zg+2ZhO2Zhe2Zhu2Zh+2ZiO2Zie2Ziu2Zi+2ZjO2Zje2Zju2Zj+2ZkO2Zke2Zku2Zk+2ZlO2Zle2Zlu2Zl+2ZmO2Zme2Zmu2Zm+2ZnO2Zne2Znu2Znwor7Zmg7Zmh7Zmi7Zmj7Zmk7Zml7Zmm7Zmn7Zmo7Zmp7Zmq7Zmr7Zms7Zmt7Zmu7Zmv7Zmw7Zmx7Zmy7Zmz7Zm07Zm17Zm27Zm37Zm47Zm57Zm67Zm77Zm87Zm97Zm+7Zm/CivtmoDtmoHtmoLtmoPtmoTtmoXtmobtmoftmojtmontmortmovtmoztmo3tmo7tmo/tmpDtmpHtmpLtmpPtmpTtmpXtmpbtmpftmpjtmpntmprtmpvtmpztmp3tmp7tmp8KK+2aoO2aoe2aou2ao+2apO2ape2apu2ap+2aqO2aqe2aqu2aq+2arO2are2aru2ar+2asO2ase2asu2as+2atO2ate2atu2at+2auO2aue2auu2au+2avO2ave2avu2avwor7ZuA7ZuB7ZuC7ZuD7ZuE7ZuF7ZuG7ZuH7ZuI7ZuJ7ZuK7ZuL7ZuM7ZuN7ZuO7ZuP7ZuQ7ZuR7ZuS7ZuT7ZuU7ZuV7ZuW7ZuX7ZuY7ZuZ7Zua7Zub7Zuc7Zud7Zue7ZufCivtm6Dtm6Htm6Ltm6Ptm6Ttm6Xtm6btm6ftm6jtm6ntm6rtm6vtm6ztm63tm67tm6/tm7Dtm7Htm7Ltm7Ptm7Ttm7Xtm7btm7ftm7jtm7ntm7rtm7vtm7ztm73tm77tm78KK+2cgO2cge2cgu2cg+2chO2che2chu2ch+2ciO2cie2ciu2ci+2cjO2cje2cju2cj+2ckO2cke2cku2ck+2clO2cle2clu2cl+2cmO2cme2cmu2cm+2cnO2cne2cnu2cnwor7Zyg7Zyh7Zyi7Zyj7Zyk7Zyl7Zym7Zyn7Zyo7Zyp7Zyq7Zyr7Zys7Zyt7Zyu7Zyv7Zyw7Zyx7Zyy7Zyz7Zy07Zy17Zy27Zy37Zy47Zy57Zy67Zy77Zy87Zy97Zy+7Zy/CivtnYDtnYHtnYLtnYPtnYTtnYXtnYbtnYftnYjtnYntnYrtnYvtnYztnY3tnY7tnY/tnZDtnZHtnZLtnZPtnZTtnZXtnZbtnZftnZjtnZntnZrtnZvtnZztnZ3tnZ7tnZ8KK+2doO2doe2dou2do+2dpO2dpe2dpu2dp+2dqO2dqe2dqu2dq+2drO2dre2dru2dr+2dsO2dse2dsu2ds+2dtO2dte2dtu2dt+2duO2due2duu2du+2dvO2dve2dvu2dvwor7Z6A7Z6B7Z6C7Z6D7Z6E7Z6F7Z6G7Z6H7Z6I7Z6J7Z6K7Z6L7Z6M7Z6N7Z6O7Z6P7Z6Q7Z6R7Z6S7Z6T7Z6U7Z6V7Z6W7Z6X7Z6Y7Z6Z7Z6a7Z6b7Z6c7Z6d7Z6e7Z6fCivtnqDtnqHtnqLtnqPtnqTtnqXtnqbtnqftnqjtnqntnqrtnqvtnqztnq3tnq7tnq8KKworRnJlZSBibG9jayAoVStEN0IwLVUrRDdGRik6CisKK+2esO2ese2esu2es+2etO2ete2etu2et+2euO2eue2euu2eu+2evO2eve2evu2ev+2fgO2fge2fgu2fg+2fhO2fhe2fhu2fh+2fiO2fie2fiu2fi+2fjO2fje2fju2fj+2fkO2fke2fku2fk+2flO2fle2flu2fl+2fmO2fme2fmu2fm+2fnO2fne2fnu2fn+2foO2foe2fou2fo+2fpO2fpe2fpu2fp+2fqO2fqe2fqu2fq+2frO2fre2fru2frwor7Z+w7Z+x7Z+y7Z+z7Z+07Z+17Z+27Z+37Z+47Z+57Z+67Z+77Z+87Z+97Z++7Z+/CisKK0hpZ2ggU3Vycm9nYXRlcyAoVStEODAwLVUrREI3Rik6CisKK+2ggO2gge2ggu2gg+2ghO2ghe2ghu2gh+2giO2gie2giu2gi+2gjO2gje2gju2gj+2gkO2gke2gku2gk+2glO2gle2glu2gl+2gmO2gme2gmu2gm+2gnO2gne2gnu2gn+2goO2goe2gou2go+2gpO2gpe2gpu2gp+2gqO2gqe2gqu2gq+2grO2gre2gru2gr+2gsO2gse2gsu2gs+2gtO2gte2gtu2gt+2guO2gue2guu2gu+2gvO2gve2gvu2gvwor7aGA7aGB7aGC7aGD7aGE7aGF7aGG7aGH7aGI7aGJ7aGK7aGL7aGM7aGN7aGO7aGP7aGQ7aGR7aGS7aGT7aGU7aGV7aGW7aGX7aGY7aGZ7aGa7aGb7aGc7aGd7aGe7aGf7aGg7aGh7aGi7aGj7aGk7aGl7aGm7aGn7aGo7aGp7aGq7aGr7aGs7aGt7aGu7aGv7aGw7aGx7aGy7aGz7aG07aG17aG27aG37aG47aG57aG67aG77aG87aG97aG+7aG/CivtooDtooHtooLtooPtooTtooXtoobtooftoojtoontoortoovtooztoo3too7too/topDtopHtopLtopPtopTtopXtopbtopftopjtopntoprtopvtopztop3top7top/toqDtoqHtoqLtoqPtoqTtoqXtoqbtoqftoqjtoqntoqrtoqvtoqztoq3toq7toq/torDtorHtorLtorPtorTtorXtorbtorftorjtorntorrtorvtorztor3tor7tor8KK+2jgO2jge2jgu2jg+2jhO2jhe2jhu2jh+2jiO2jie2jiu2ji+2jjO2jje2jju2jj+2jkO2jke2jku2jk+2jlO2jle2jlu2jl+2jmO2jme2jmu2jm+2jnO2jne2jnu2jn+2joO2joe2jou2jo+2jpO2jpe2jpu2jp+2jqO2jqe2jqu2jq+2jrO2jre2jru2jr+2jsO2jse2jsu2js+2jtO2jte2jtu2jt+2juO2jue2juu2ju+2jvO2jve2jvu2jvwor7aSA7aSB7aSC7aSD7aSE7aSF7aSG7aSH7aSI7aSJ7aSK7aSL7aSM7aSN7aSO7aSP7aSQ7aSR7aSS7aST7aSU7aSV7aSW7aSX7aSY7aSZ7aSa7aSb7aSc7aSd7aSe7aSf7aSg7aSh7aSi7aSj7aSk7aSl7aSm7aSn7aSo7aSp7aSq7aSr7aSs7aSt7aSu7aSv7aSw7aSx7aSy7aSz7aS07aS17aS27aS37aS47aS57aS67aS77aS87aS97aS+7aS/CivtpYDtpYHtpYLtpYPtpYTtpYXtpYbtpYftpYjtpYntpYrtpYvtpYztpY3tpY7tpY/tpZDtpZHtpZLtpZPtpZTtpZXtpZbtpZftpZjtpZntpZrtpZvtpZztpZ3tpZ7tpZ/tpaDtpaHtpaLtpaPtpaTtpaXtpabtpaftpajtpantpartpavtpaztpa3tpa7tpa/tpbDtpbHtpbLtpbPtpbTtpbXtpbbtpbftpbjtpbntpbrtpbvtpbztpb3tpb7tpb8KK+2mgO2mge2mgu2mg+2mhO2mhe2mhu2mh+2miO2mie2miu2mi+2mjO2mje2mju2mj+2mkO2mke2mku2mk+2mlO2mle2mlu2ml+2mmO2mme2mmu2mm+2mnO2mne2mnu2mn+2moO2moe2mou2mo+2mpO2mpe2mpu2mp+2mqO2mqe2mqu2mq+2mrO2mre2mru2mr+2msO2mse2msu2ms+2mtO2mte2mtu2mt+2muO2mue2muu2mu+2mvO2mve2mvu2mvwor7aeA7aeB7aeC7aeD7aeE7aeF7aeG7aeH7aeI7aeJ7aeK7aeL7aeM7aeN7aeO7aeP7aeQ7aeR7aeS7aeT7aeU7aeV7aeW7aeX7aeY7aeZ7aea7aeb7aec7aed7aee7aef7aeg7aeh7aei7aej7aek7ael7aem7aen7aeo7aep7aeq7aer7aes7aet7aeu7aev7aew7aex7aey7aez7ae07ae17ae27ae37ae47ae57ae67ae77ae87ae97ae+7ae/CivtqIDtqIHtqILtqIPtqITtqIXtqIbtqIftqIjtqIntqIrtqIvtqIztqI3tqI7tqI/tqJDtqJHtqJLtqJPtqJTtqJXtqJbtqJftqJjtqJntqJrtqJvtqJztqJ3tqJ7tqJ/tqKDtqKHtqKLtqKPtqKTtqKXtqKbtqKftqKjtqKntqKrtqKvtqKztqK3tqK7tqK/tqLDtqLHtqLLtqLPtqLTtqLXtqLbtqLftqLjtqLntqLrtqLvtqLztqL3tqL7tqL8KK+2pgO2pge2pgu2pg+2phO2phe2phu2ph+2piO2pie2piu2pi+2pjO2pje2pju2pj+2pkO2pke2pku2pk+2plO2ple2plu2pl+2pmO2pme2pmu2pm+2pnO2pne2pnu2pn+2poO2poe2pou2po+2ppO2ppe2ppu2pp+2pqO2pqe2pqu2pq+2prO2pre2pru2pr+2psO2pse2psu2ps+2ptO2pte2ptu2pt+2puO2pue2puu2pu+2pvO2pve2pvu2pvwor7aqA7aqB7aqC7aqD7aqE7aqF7aqG7aqH7aqI7aqJ7aqK7aqL7aqM7aqN7aqO7aqP7aqQ7aqR7aqS7aqT7aqU7aqV7aqW7aqX7aqY7aqZ7aqa7aqb7aqc7aqd7aqe7aqf7aqg7aqh7aqi7aqj7aqk7aql7aqm7aqn7aqo7aqp7aqq7aqr7aqs7aqt7aqu7aqv7aqw7aqx7aqy7aqz7aq07aq17aq27aq37aq47aq57aq67aq77aq87aq97aq+7aq/Civtq4Dtq4Htq4Ltq4Ptq4Ttq4Xtq4btq4ftq4jtq4ntq4rtq4vtq4ztq43tq47tq4/tq5Dtq5Htq5Ltq5Ptq5Ttq5Xtq5btq5ftq5jtq5ntq5rtq5vtq5ztq53tq57tq5/tq6Dtq6Htq6Ltq6Ptq6Ttq6Xtq6btq6ftq6jtq6ntq6rtq6vtq6ztq63tq67tq6/tq7Dtq7Htq7Ltq7Ptq7Ttq7Xtq7btq7ftq7jtq7ntq7rtq7vtq7ztq73tq77tq78KK+2sgO2sge2sgu2sg+2shO2she2shu2sh+2siO2sie2siu2si+2sjO2sje2sju2sj+2skO2ske2sku2sk+2slO2sle2slu2sl+2smO2sme2smu2sm+2snO2sne2snu2sn+2soO2soe2sou2so+2spO2spe2spu2sp+2sqO2sqe2squ2sq+2srO2sre2sru2sr+2ssO2sse2ssu2ss+2stO2ste2stu2st+2suO2sue2suu2su+2svO2sve2svu2svwor7a2A7a2B7a2C7a2D7a2E7a2F7a2G7a2H7a2I7a2J7a2K7a2L7a2M7a2N7a2O7a2P7a2Q7a2R7a2S7a2T7a2U7a2V7a2W7a2X7a2Y7a2Z7a2a7a2b7a2c7a2d7a2e7a2f7a2g7a2h7a2i7a2j7a2k7a2l7a2m7a2n7a2o7a2p7a2q7a2r7a2s7a2t7a2u7a2v7a2w7a2x7a2y7a2z7a207a217a227a237a247a257a267a277a287a297a2+7a2/CisKK0hpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlcyAoVStEQjgwLVUrREJGRik6CisKK+2ugO2uge2ugu2ug+2uhO2uhe2uhu2uh+2uiO2uie2uiu2ui+2ujO2uje2uju2uj+2ukO2uke2uku2uk+2ulO2ule2ulu2ul+2umO2ume2umu2um+2unO2une2unu2un+2uoO2uoe2uou2uo+2upO2upe2upu2up+2uqO2uqe2uqu2uq+2urO2ure2uru2ur+2usO2use2usu2us+2utO2ute2utu2ut+2uuO2uue2uuu2uu+2uvO2uve2uvu2uvwor7a+A7a+B7a+C7a+D7a+E7a+F7a+G7a+H7a+I7a+J7a+K7a+L7a+M7a+N7a+O7a+P7a+Q7a+R7a+S7a+T7a+U7a+V7a+W7a+X7a+Y7a+Z7a+a7a+b7a+c7a+d7a+e7a+f7a+g7a+h7a+i7a+j7a+k7a+l7a+m7a+n7a+o7a+p7a+q7a+r7a+s7a+t7a+u7a+v7a+w7a+x7a+y7a+z7a+07a+17a+27a+37a+47a+57a+67a+77a+87a+97a++7a+/CisKK0xvdyBTdXJyb2dhdGVzIChVK0RDMDAtVStERkZGKToKKwor7bCA7bCB7bCC7bCD7bCE7bCF7bCG7bCH7bCI7bCJ7bCK7bCL7bCM7bCN7bCO7bCP7bCQ7bCR7bCS7bCT7bCU7bCV7bCW7bCX7bCY7bCZ7bCa7bCb7bCc7bCd7bCe7bCf7bCg7bCh7bCi7bCj7bCk7bCl7bCm7bCn7bCo7bCp7bCq7bCr7bCs7bCt7bCu7bCv7bCw7bCx7bCy7bCz7bC07bC17bC27bC37bC47bC57bC67bC77bC87bC97bC+7bC/CivtsYDtsYHtsYLtsYPtsYTtsYXtsYbtsYftsYjtsYntsYrtsYvtsYztsY3tsY7tsY/tsZDtsZHtsZLtsZPtsZTtsZXtsZbtsZftsZjtsZntsZrtsZvtsZztsZ3tsZ7tsZ/tsaDtsaHtsaLtsaPtsaTtsaXtsabtsaftsajtsantsartsavtsaztsa3tsa7tsa/tsbDtsbHtsbLtsbPtsbTtsbXtsbbtsbftsbjtsbntsbrtsbvtsbztsb3tsb7tsb8KK+2ygO2yge2ygu2yg+2yhO2yhe2yhu2yh+2yiO2yie2yiu2yi+2yjO2yje2yju2yj+2ykO2yke2yku2yk+2ylO2yle2ylu2yl+2ymO2yme2ymu2ym+2ynO2yne2ynu2yn+2yoO2yoe2you2yo+2ypO2ype2ypu2yp+2yqO2yqe2yqu2yq+2yrO2yre2yru2yr+2ysO2yse2ysu2ys+2ytO2yte2ytu2yt+2yuO2yue2yuu2yu+2yvO2yve2yvu2yvwor7bOA7bOB7bOC7bOD7bOE7bOF7bOG7bOH7bOI7bOJ7bOK7bOL7bOM7bON7bOO7bOP7bOQ7bOR7bOS7bOT7bOU7bOV7bOW7bOX7bOY7bOZ7bOa7bOb7bOc7bOd7bOe7bOf7bOg7bOh7bOi7bOj7bOk7bOl7bOm7bOn7bOo7bOp7bOq7bOr7bOs7bOt7bOu7bOv7bOw7bOx7bOy7bOz7bO07bO17bO27bO37bO47bO57bO67bO77bO87bO97bO+7bO/CivttIDttIHttILttIPttITttIXttIbttIfttIjttInttIrttIvttIzttI3ttI7ttI/ttJDttJHttJLttJPttJTttJXttJbttJfttJjttJnttJrttJvttJzttJ3ttJ7ttJ/ttKDttKHttKLttKPttKTttKXttKbttKfttKjttKnttKrttKvttKzttK3ttK7ttK/ttLDttLHttLLttLPttLTttLXttLbttLfttLjttLnttLrttLvttLzttL3ttL7ttL8KK+21gO21ge21gu21g+21hO21he21hu21h+21iO21ie21iu21i+21jO21je21ju21j+21kO21ke21ku21k+21lO21le21lu21l+21mO21me21mu21m+21nO21ne21nu21n+21oO21oe21ou21o+21pO21pe21pu21p+21qO21qe21qu21q+21rO21re21ru21r+21sO21se21su21s+21tO21te21tu21t+21uO21ue21uu21u+21vO21ve21vu21vwor7baA7baB7baC7baD7baE7baF7baG7baH7baI7baJ7baK7baL7baM7baN7baO7baP7baQ7baR7baS7baT7baU7baV7baW7baX7baY7baZ7baa7bab7bac7bad7bae7baf7bag7bah7bai7baj7bak7bal7bam7ban7bao7bap7baq7bar7bas7bat7bau7bav7baw7bax7bay7baz7ba07ba17ba27ba37ba47ba57ba67ba77ba87ba97ba+7ba/Civtt4Dtt4Htt4Ltt4Ptt4Ttt4Xtt4btt4ftt4jtt4ntt4rtt4vtt4ztt43tt47tt4/tt5Dtt5Htt5Ltt5Ptt5Ttt5Xtt5btt5ftt5jtt5ntt5rtt5vtt5ztt53tt57tt5/tt6Dtt6Htt6Ltt6Ptt6Ttt6Xtt6btt6ftt6jtt6ntt6rtt6vtt6ztt63tt67tt6/tt7Dtt7Htt7Ltt7Ptt7Ttt7Xtt7btt7ftt7jtt7ntt7rtt7vtt7ztt73tt77tt78KK+24gO24ge24gu24g+24hO24he24hu24h+24iO24ie24iu24i+24jO24je24ju24j+24kO24ke24ku24k+24lO24le24lu24l+24mO24me24mu24m+24nO24ne24nu24n+24oO24oe24ou24o+24pO24pe24pu24p+24qO24qe24qu24q+24rO24re24ru24r+24sO24se24su24s+24tO24te24tu24t+24uO24ue24uu24u+24vO24ve24vu24vwor7bmA7bmB7bmC7bmD7bmE7bmF7bmG7bmH7bmI7bmJ7bmK7bmL7bmM7bmN7bmO7bmP7bmQ7bmR7bmS7bmT7bmU7bmV7bmW7bmX7bmY7bmZ7bma7bmb7bmc7bmd7bme7bmf7bmg7bmh7bmi7bmj7bmk7bml7bmm7bmn7bmo7bmp7bmq7bmr7bms7bmt7bmu7bmv7bmw7bmx7bmy7bmz7bm07bm17bm27bm37bm47bm57bm67bm77bm87bm97bm+7bm/CivtuoDtuoHtuoLtuoPtuoTtuoXtuobtuoftuojtuontuortuovtuoztuo3tuo7tuo/tupDtupHtupLtupPtupTtupXtupbtupftupjtupntuprtupvtupztup3tup7tup/tuqDtuqHtuqLtuqPtuqTtuqXtuqbtuqftuqjtuqntuqrtuqvtuqztuq3tuq7tuq/turDturHturLturPturTturXturbturfturjturnturrturvturztur3tur7tur8KK+27gO27ge27gu27g+27hO27he27hu27h+27iO27ie27iu27i+27jO27je27ju27j+27kO27ke27ku27k+27lO27le27lu27l+27mO27me27mu27m+27nO27ne27nu27n+27oO27oe27ou27o+27pO27pe27pu27p+27qO27qe27qu27q+27rO27re27ru27r+27sO27se27su27s+27tO27te27tu27t+27uO27ue27uu27u+27vO27ve27vu27vwor7byA7byB7byC7byD7byE7byF7byG7byH7byI7byJ7byK7byL7byM7byN7byO7byP7byQ7byR7byS7byT7byU7byV7byW7byX7byY7byZ7bya7byb7byc7byd7bye7byf7byg7byh7byi7byj7byk7byl7bym7byn7byo7byp7byq7byr7bys7byt7byu7byv7byw7byx7byy7byz7by07by17by27by37by47by57by67by77by87by97by+7by/CivtvYDtvYHtvYLtvYPtvYTtvYXtvYbtvYftvYjtvYntvYrtvYvtvYztvY3tvY7tvY/tvZDtvZHtvZLtvZPtvZTtvZXtvZbtvZftvZjtvZntvZrtvZvtvZztvZ3tvZ7tvZ/tvaDtvaHtvaLtvaPtvaTtvaXtvabtvaftvajtvantvartvavtvaztva3tva7tva/tvbDtvbHtvbLtvbPtvbTtvbXtvbbtvbftvbjtvbntvbrtvbvtvbztvb3tvb7tvb8KK+2+gO2+ge2+gu2+g+2+hO2+he2+hu2+h+2+iO2+ie2+iu2+i+2+jO2+je2+ju2+j+2+kO2+ke2+ku2+k+2+lO2+le2+lu2+l+2+mO2+me2+mu2+m+2+nO2+ne2+nu2+n+2+oO2+oe2+ou2+o+2+pO2+pe2+pu2+p+2+qO2+qe2+qu2+q+2+rO2+re2+ru2+r+2+sO2+se2+su2+s+2+tO2+te2+tu2+t+2+uO2+ue2+uu2+u+2+vO2+ve2+vu2+vwor7b+A7b+B7b+C7b+D7b+E7b+F7b+G7b+H7b+I7b+J7b+K7b+L7b+M7b+N7b+O7b+P7b+Q7b+R7b+S7b+T7b+U7b+V7b+W7b+X7b+Y7b+Z7b+a7b+b7b+c7b+d7b+e7b+f7b+g7b+h7b+i7b+j7b+k7b+l7b+m7b+n7b+o7b+p7b+q7b+r7b+s7b+t7b+u7b+v7b+w7b+x7b+y7b+z7b+07b+17b+27b+37b+47b+57b+67b+77b+87b+97b++7b+/CisKK1ByaXZhdGUgVXNlIEFyZWEgKFUrRTAwMC1VK0Y4RkYpOgorCivugIDugIHugILugIPugITugIXugIbugIfugIjugInugIrugIvugIzugI3ugI7ugI/ugJDugJHugJLugJPugJTugJXugJbugJfugJjugJnugJrugJvugJzugJ3ugJ7ugJ/ugKDugKHugKLugKPugKTugKXugKbugKfugKjugKnugKrugKvugKzugK3ugK7ugK/ugLDugLHugLLugLPugLTugLXugLbugLfugLjugLnugLrugLvugLzugL3ugL7ugL8KK+6BgO6Bge6Bgu6Bg+6BhO6Bhe6Bhu6Bh+6BiO6Bie6Biu6Bi+6BjO6Bje6Bju6Bj+6BkO6Bke6Bku6Bk+6BlO6Ble6Blu6Bl+6BmO6Bme6Bmu6Bm+6BnO6Bne6Bnu6Bn+6BoO6Boe6Bou6Bo+6BpO6Bpe6Bpu6Bp+6BqO6Bqe6Bqu6Bq+6BrO6Bre6Bru6Br+6BsO6Bse6Bsu6Bs+6BtO6Bte6Btu6Bt+6BuO6Bue6Buu6Bu+6BvO6Bve6Bvu6Bvwor7oKA7oKB7oKC7oKD7oKE7oKF7oKG7oKH7oKI7oKJ7oKK7oKL7oKM7oKN7oKO7oKP7oKQ7oKR7oKS7oKT7oKU7oKV7oKW7oKX7oKY7oKZ7oKa7oKb7oKc7oKd7oKe7oKf7oKg7oKh7oKi7oKj7oKk7oKl7oKm7oKn7oKo7oKp7oKq7oKr7oKs7oKt7oKu7oKv7oKw7oKx7oKy7oKz7oK07oK17oK27oK37oK47oK57oK67oK77oK87oK97oK+7oK/Civug4Dug4Hug4Lug4Pug4Tug4Xug4bug4fug4jug4nug4rug4vug4zug43ug47ug4/ug5Dug5Hug5Lug5Pug5Tug5Xug5bug5fug5jug5nug5rug5vug5zug53ug57ug5/ug6Dug6Hug6Lug6Pug6Tug6Xug6bug6fug6jug6nug6rug6vug6zug63ug67ug6/ug7Dug7Hug7Lug7Pug7Tug7Xug7bug7fug7jug7nug7rug7vug7zug73ug77ug78KK+6EgO6Ege6Egu6Eg+6EhO6Ehe6Ehu6Eh+6EiO6Eie6Eiu6Ei+6EjO6Eje6Eju6Ej+6EkO6Eke6Eku6Ek+6ElO6Ele6Elu6El+6EmO6Eme6Emu6Em+6EnO6Ene6Enu6En+6EoO6Eoe6Eou6Eo+6EpO6Epe6Epu6Ep+6EqO6Eqe6Equ6Eq+6ErO6Ere6Eru6Er+6EsO6Ese6Esu6Es+6EtO6Ete6Etu6Et+6EuO6Eue6Euu6Eu+6EvO6Eve6Evu6Evwor7oWA7oWB7oWC7oWD7oWE7oWF7oWG7oWH7oWI7oWJ7oWK7oWL7oWM7oWN7oWO7oWP7oWQ7oWR7oWS7oWT7oWU7oWV7oWW7oWX7oWY7oWZ7oWa7oWb7oWc7oWd7oWe7oWf7oWg7oWh7oWi7oWj7oWk7oWl7oWm7oWn7oWo7oWp7oWq7oWr7oWs7oWt7oWu7oWv7oWw7oWx7oWy7oWz7oW07oW17oW27oW37oW47oW57oW67oW77oW87oW97oW+7oW/CivuhoDuhoHuhoLuhoPuhoTuhoXuhobuhofuhojuhonuhoruhovuhozuho3uho7uho/uhpDuhpHuhpLuhpPuhpTuhpXuhpbuhpfuhpjuhpnuhpruhpvuhpzuhp3uhp7uhp/uhqDuhqHuhqLuhqPuhqTuhqXuhqbuhqfuhqjuhqnuhqruhqvuhqzuhq3uhq7uhq/uhrDuhrHuhrLuhrPuhrTuhrXuhrbuhrfuhrjuhrnuhrruhrvuhrzuhr3uhr7uhr8KK+6HgO6Hge6Hgu6Hg+6HhO6Hhe6Hhu6Hh+6HiO6Hie6Hiu6Hi+6HjO6Hje6Hju6Hj+6HkO6Hke6Hku6Hk+6HlO6Hle6Hlu6Hl+6HmO6Hme6Hmu6Hm+6HnO6Hne6Hnu6Hn+6HoO6Hoe6Hou6Ho+6HpO6Hpe6Hpu6Hp+6HqO6Hqe6Hqu6Hq+6HrO6Hre6Hru6Hr+6HsO6Hse6Hsu6Hs+6HtO6Hte6Htu6Ht+6HuO6Hue6Huu6Hu+6HvO6Hve6Hvu6Hvwor7oiA7oiB7oiC7oiD7oiE7oiF7oiG7oiH7oiI7oiJ7oiK7oiL7oiM7oiN7oiO7oiP7oiQ7oiR7oiS7oiT7oiU7oiV7oiW7oiX7oiY7oiZ7oia7oib7oic7oid7oie7oif7oig7oih7oii7oij7oik7oil7oim7oin7oio7oip7oiq7oir7ois7oit7oiu7oiv7oiw7oix7oiy7oiz7oi07oi17oi27oi37oi47oi57oi67oi77oi87oi97oi+7oi/CivuiYDuiYHuiYLuiYPuiYTuiYXuiYbuiYfuiYjuiYnuiYruiYvuiYzuiY3uiY7uiY/uiZDuiZHuiZLuiZPuiZTuiZXuiZbuiZfuiZjuiZnuiZruiZvuiZzuiZ3uiZ7uiZ/uiaDuiaHuiaLuiaPuiaTuiaXuiabuiafuiajuianuiaruiavuiazuia3uia7uia/uibDuibHuibLuibPuibTuibXuibbuibfuibjuibnuibruibvuibzuib3uib7uib8KK+6KgO6Kge6Kgu6Kg+6KhO6Khe6Khu6Kh+6KiO6Kie6Kiu6Ki+6KjO6Kje6Kju6Kj+6KkO6Kke6Kku6Kk+6KlO6Kle6Klu6Kl+6KmO6Kme6Kmu6Km+6KnO6Kne6Knu6Kn+6KoO6Koe6Kou6Ko+6KpO6Kpe6Kpu6Kp+6KqO6Kqe6Kqu6Kq+6KrO6Kre6Kru6Kr+6KsO6Kse6Ksu6Ks+6KtO6Kte6Ktu6Kt+6KuO6Kue6Kuu6Ku+6KvO6Kve6Kvu6Kvwor7ouA7ouB7ouC7ouD7ouE7ouF7ouG7ouH7ouI7ouJ7ouK7ouL7ouM7ouN7ouO7ouP7ouQ7ouR7ouS7ouT7ouU7ouV7ouW7ouX7ouY7ouZ7oua7oub7ouc7oud7oue7ouf7oug7ouh7oui7ouj7ouk7oul7oum7oun7ouo7oup7ouq7our7ous7out7ouu7ouv7ouw7oux7ouy7ouz7ou07ou17ou27ou37ou47ou57ou67ou77ou87ou97ou+7ou/CivujIDujIHujILujIPujITujIXujIbujIfujIjujInujIrujIvujIzujI3ujI7ujI/ujJDujJHujJLujJPujJTujJXujJbujJfujJjujJnujJrujJvujJzujJ3ujJ7ujJ/ujKDujKHujKLujKPujKTujKXujKbujKfujKjujKnujKrujKvujKzujK3ujK7ujK/ujLDujLHujLLujLPujLTujLXujLbujLfujLjujLnujLrujLvujLzujL3ujL7ujL8KK+6NgO6Nge6Ngu6Ng+6NhO6Nhe6Nhu6Nh+6NiO6Nie6Niu6Ni+6NjO6Nje6Nju6Nj+6NkO6Nke6Nku6Nk+6NlO6Nle6Nlu6Nl+6NmO6Nme6Nmu6Nm+6NnO6Nne6Nnu6Nn+6NoO6Noe6Nou6No+6NpO6Npe6Npu6Np+6NqO6Nqe6Nqu6Nq+6NrO6Nre6Nru6Nr+6NsO6Nse6Nsu6Ns+6NtO6Nte6Ntu6Nt+6NuO6Nue6Nuu6Nu+6NvO6Nve6Nvu6Nvwor7o6A7o6B7o6C7o6D7o6E7o6F7o6G7o6H7o6I7o6J7o6K7o6L7o6M7o6N7o6O7o6P7o6Q7o6R7o6S7o6T7o6U7o6V7o6W7o6X7o6Y7o6Z7o6a7o6b7o6c7o6d7o6e7o6f7o6g7o6h7o6i7o6j7o6k7o6l7o6m7o6n7o6o7o6p7o6q7o6r7o6s7o6t7o6u7o6v7o6w7o6x7o6y7o6z7o607o617o627o637o647o657o667o677o687o697o6+7o6/Civuj4Duj4Huj4Luj4Puj4Tuj4Xuj4buj4fuj4juj4nuj4ruj4vuj4zuj43uj47uj4/uj5Duj5Huj5Luj5Puj5Tuj5Xuj5buj5fuj5juj5nuj5ruj5vuj5zuj53uj57uj5/uj6Duj6Huj6Luj6Puj6Tuj6Xuj6buj6fuj6juj6nuj6ruj6vuj6zuj63uj67uj6/uj7Duj7Huj7Luj7Puj7Tuj7Xuj7buj7fuj7juj7nuj7ruj7vuj7zuj73uj77uj78KK+6QgO6Qge6Qgu6Qg+6QhO6Qhe6Qhu6Qh+6QiO6Qie6Qiu6Qi+6QjO6Qje6Qju6Qj+6QkO6Qke6Qku6Qk+6QlO6Qle6Qlu6Ql+6QmO6Qme6Qmu6Qm+6QnO6Qne6Qnu6Qn+6QoO6Qoe6Qou6Qo+6QpO6Qpe6Qpu6Qp+6QqO6Qqe6Qqu6Qq+6QrO6Qre6Qru6Qr+6QsO6Qse6Qsu6Qs+6QtO6Qte6Qtu6Qt+6QuO6Que6Quu6Qu+6QvO6Qve6Qvu6Qvwor7pGA7pGB7pGC7pGD7pGE7pGF7pGG7pGH7pGI7pGJ7pGK7pGL7pGM7pGN7pGO7pGP7pGQ7pGR7pGS7pGT7pGU7pGV7pGW7pGX7pGY7pGZ7pGa7pGb7pGc7pGd7pGe7pGf7pGg7pGh7pGi7pGj7pGk7pGl7pGm7pGn7pGo7pGp7pGq7pGr7pGs7pGt7pGu7pGv7pGw7pGx7pGy7pGz7pG07pG17pG27pG37pG47pG57pG67pG77pG87pG97pG+7pG/CivukoDukoHukoLukoPukoTukoXukobukofukojukonukorukovukozuko3uko7uko/ukpDukpHukpLukpPukpTukpXukpbukpfukpjukpnukprukpvukpzukp3ukp7ukp/ukqDukqHukqLukqPukqTukqXukqbukqfukqjukqnukqrukqvukqzukq3ukq7ukq/ukrDukrHukrLukrPukrTukrXukrbukrfukrjukrnukrrukrvukrzukr3ukr7ukr8KK+6TgO6Tge6Tgu6Tg+6ThO6The6Thu6Th+6TiO6Tie6Tiu6Ti+6TjO6Tje6Tju6Tj+6TkO6Tke6Tku6Tk+6TlO6Tle6Tlu6Tl+6TmO6Tme6Tmu6Tm+6TnO6Tne6Tnu6Tn+6ToO6Toe6Tou6To+6TpO6Tpe6Tpu6Tp+6TqO6Tqe6Tqu6Tq+6TrO6Tre6Tru6Tr+6TsO6Tse6Tsu6Ts+6TtO6Tte6Ttu6Tt+6TuO6Tue6Tuu6Tu+6TvO6Tve6Tvu6Tvwor7pSA7pSB7pSC7pSD7pSE7pSF7pSG7pSH7pSI7pSJ7pSK7pSL7pSM7pSN7pSO7pSP7pSQ7pSR7pSS7pST7pSU7pSV7pSW7pSX7pSY7pSZ7pSa7pSb7pSc7pSd7pSe7pSf7pSg7pSh7pSi7pSj7pSk7pSl7pSm7pSn7pSo7pSp7pSq7pSr7pSs7pSt7pSu7pSv7pSw7pSx7pSy7pSz7pS07pS17pS27pS37pS47pS57pS67pS77pS87pS97pS+7pS/CivulYDulYHulYLulYPulYTulYXulYbulYfulYjulYnulYrulYvulYzulY3ulY7ulY/ulZDulZHulZLulZPulZTulZXulZbulZfulZjulZnulZrulZvulZzulZ3ulZ7ulZ/ulaDulaHulaLulaPulaTulaXulabulafulajulanularulavulazula3ula7ula/ulbDulbHulbLulbPulbTulbXulbbulbfulbjulbnulbrulbvulbzulb3ulb7ulb8KK+6WgO6Wge6Wgu6Wg+6WhO6Whe6Whu6Wh+6WiO6Wie6Wiu6Wi+6WjO6Wje6Wju6Wj+6WkO6Wke6Wku6Wk+6WlO6Wle6Wlu6Wl+6WmO6Wme6Wmu6Wm+6WnO6Wne6Wnu6Wn+6WoO6Woe6Wou6Wo+6WpO6Wpe6Wpu6Wp+6WqO6Wqe6Wqu6Wq+6WrO6Wre6Wru6Wr+6WsO6Wse6Wsu6Ws+6WtO6Wte6Wtu6Wt+6WuO6Wue6Wuu6Wu+6WvO6Wve6Wvu6Wvwor7peA7peB7peC7peD7peE7peF7peG7peH7peI7peJ7peK7peL7peM7peN7peO7peP7peQ7peR7peS7peT7peU7peV7peW7peX7peY7peZ7pea7peb7pec7ped7pee7pef7peg7peh7pei7pej7pek7pel7pem7pen7peo7pep7peq7per7pes7pet7peu7pev7pew7pex7pey7pez7pe07pe17pe27pe37pe47pe57pe67pe77pe87pe97pe+7pe/CivumIDumIHumILumIPumITumIXumIbumIfumIjumInumIrumIvumIzumI3umI7umI/umJDumJHumJLumJPumJTumJXumJbumJfumJjumJnumJrumJvumJzumJ3umJ7umJ/umKDumKHumKLumKPumKTumKXumKbumKfumKjumKnumKrumKvumKzumK3umK7umK/umLDumLHumLLumLPumLTumLXumLbumLfumLjumLnumLrumLvumLzumL3umL7umL8KK+6ZgO6Zge6Zgu6Zg+6ZhO6Zhe6Zhu6Zh+6ZiO6Zie6Ziu6Zi+6ZjO6Zje6Zju6Zj+6ZkO6Zke6Zku6Zk+6ZlO6Zle6Zlu6Zl+6ZmO6Zme6Zmu6Zm+6ZnO6Zne6Znu6Zn+6ZoO6Zoe6Zou6Zo+6ZpO6Zpe6Zpu6Zp+6ZqO6Zqe6Zqu6Zq+6ZrO6Zre6Zru6Zr+6ZsO6Zse6Zsu6Zs+6ZtO6Zte6Ztu6Zt+6ZuO6Zue6Zuu6Zu+6ZvO6Zve6Zvu6Zvwor7pqA7pqB7pqC7pqD7pqE7pqF7pqG7pqH7pqI7pqJ7pqK7pqL7pqM7pqN7pqO7pqP7pqQ7pqR7pqS7pqT7pqU7pqV7pqW7pqX7pqY7pqZ7pqa7pqb7pqc7pqd7pqe7pqf7pqg7pqh7pqi7pqj7pqk7pql7pqm7pqn7pqo7pqp7pqq7pqr7pqs7pqt7pqu7pqv7pqw7pqx7pqy7pqz7pq07pq17pq27pq37pq47pq57pq67pq77pq87pq97pq+7pq/Civum4Dum4Hum4Lum4Pum4Tum4Xum4bum4fum4jum4num4rum4vum4zum43um47um4/um5Dum5Hum5Lum5Pum5Tum5Xum5bum5fum5jum5num5rum5vum5zum53um57um5/um6Dum6Hum6Lum6Pum6Tum6Xum6bum6fum6jum6num6rum6vum6zum63um67um6/um7Dum7Hum7Lum7Pum7Tum7Xum7bum7fum7jum7num7rum7vum7zum73um77um78KK+6cgO6cge6cgu6cg+6chO6che6chu6ch+6ciO6cie6ciu6ci+6cjO6cje6cju6cj+6ckO6cke6cku6ck+6clO6cle6clu6cl+6cmO6cme6cmu6cm+6cnO6cne6cnu6cn+6coO6coe6cou6co+6cpO6cpe6cpu6cp+6cqO6cqe6cqu6cq+6crO6cre6cru6cr+6csO6cse6csu6cs+6ctO6cte6ctu6ct+6cuO6cue6cuu6cu+6cvO6cve6cvu6cvwor7p2A7p2B7p2C7p2D7p2E7p2F7p2G7p2H7p2I7p2J7p2K7p2L7p2M7p2N7p2O7p2P7p2Q7p2R7p2S7p2T7p2U7p2V7p2W7p2X7p2Y7p2Z7p2a7p2b7p2c7p2d7p2e7p2f7p2g7p2h7p2i7p2j7p2k7p2l7p2m7p2n7p2o7p2p7p2q7p2r7p2s7p2t7p2u7p2v7p2w7p2x7p2y7p2z7p207p217p227p237p247p257p267p277p287p297p2+7p2/CivunoDunoHunoLunoPunoTunoXunobunofunojunonunorunovunozuno3uno7uno/unpDunpHunpLunpPunpTunpXunpbunpfunpjunpnunprunpvunpzunp3unp7unp/unqDunqHunqLunqPunqTunqXunqbunqfunqjunqnunqrunqvunqzunq3unq7unq/unrDunrHunrLunrPunrTunrXunrbunrfunrjunrnunrrunrvunrzunr3unr7unr8KK+6fgO6fge6fgu6fg+6fhO6fhe6fhu6fh+6fiO6fie6fiu6fi+6fjO6fje6fju6fj+6fkO6fke6fku6fk+6flO6fle6flu6fl+6fmO6fme6fmu6fm+6fnO6fne6fnu6fn+6foO6foe6fou6fo+6fpO6fpe6fpu6fp+6fqO6fqe6fqu6fq+6frO6fre6fru6fr+6fsO6fse6fsu6fs+6ftO6fte6ftu6ft+6fuO6fue6fuu6fu+6fvO6fve6fvu6fvwor7qCA7qCB7qCC7qCD7qCE7qCF7qCG7qCH7qCI7qCJ7qCK7qCL7qCM7qCN7qCO7qCP7qCQ7qCR7qCS7qCT7qCU7qCV7qCW7qCX7qCY7qCZ7qCa7qCb7qCc7qCd7qCe7qCf7qCg7qCh7qCi7qCj7qCk7qCl7qCm7qCn7qCo7qCp7qCq7qCr7qCs7qCt7qCu7qCv7qCw7qCx7qCy7qCz7qC07qC17qC27qC37qC47qC57qC67qC77qC87qC97qC+7qC/CivuoYDuoYHuoYLuoYPuoYTuoYXuoYbuoYfuoYjuoYnuoYruoYvuoYzuoY3uoY7uoY/uoZDuoZHuoZLuoZPuoZTuoZXuoZbuoZfuoZjuoZnuoZruoZvuoZzuoZ3uoZ7uoZ/uoaDuoaHuoaLuoaPuoaTuoaXuoabuoafuoajuoanuoaruoavuoazuoa3uoa7uoa/uobDuobHuobLuobPuobTuobXuobbuobfuobjuobnuobruobvuobzuob3uob7uob8KK+6igO6ige6igu6ig+6ihO6ihe6ihu6ih+6iiO6iie6iiu6ii+6ijO6ije6iju6ij+6ikO6ike6iku6ik+6ilO6ile6ilu6il+6imO6ime6imu6im+6inO6ine6inu6in+6ioO6ioe6iou6io+6ipO6ipe6ipu6ip+6iqO6iqe6iqu6iq+6irO6ire6iru6ir+6isO6ise6isu6is+6itO6ite6itu6it+6iuO6iue6iuu6iu+6ivO6ive6ivu6ivwor7qOA7qOB7qOC7qOD7qOE7qOF7qOG7qOH7qOI7qOJ7qOK7qOL7qOM7qON7qOO7qOP7qOQ7qOR7qOS7qOT7qOU7qOV7qOW7qOX7qOY7qOZ7qOa7qOb7qOc7qOd7qOe7qOf7qOg7qOh7qOi7qOj7qOk7qOl7qOm7qOn7qOo7qOp7qOq7qOr7qOs7qOt7qOu7qOv7qOw7qOx7qOy7qOz7qO07qO17qO27qO37qO47qO57qO67qO77qO87qO97qO+7qO/CivupIDupIHupILupIPupITupIXupIbupIfupIjupInupIrupIvupIzupI3upI7upI/upJDupJHupJLupJPupJTupJXupJbupJfupJjupJnupJrupJvupJzupJ3upJ7upJ/upKDupKHupKLupKPupKTupKXupKbupKfupKjupKnupKrupKvupKzupK3upK7upK/upLDupLHupLLupLPupLTupLXupLbupLfupLjupLnupLrupLvupLzupL3upL7upL8KK+6lgO6lge6lgu6lg+6lhO6lhe6lhu6lh+6liO6lie6liu6li+6ljO6lje6lju6lj+6lkO6lke6lku6lk+6llO6lle6llu6ll+6lmO6lme6lmu6lm+6lnO6lne6lnu6ln+6loO6loe6lou6lo+6lpO6lpe6lpu6lp+6lqO6lqe6lqu6lq+6lrO6lre6lru6lr+6lsO6lse6lsu6ls+6ltO6lte6ltu6lt+6luO6lue6luu6lu+6lvO6lve6lvu6lvwor7qaA7qaB7qaC7qaD7qaE7qaF7qaG7qaH7qaI7qaJ7qaK7qaL7qaM7qaN7qaO7qaP7qaQ7qaR7qaS7qaT7qaU7qaV7qaW7qaX7qaY7qaZ7qaa7qab7qac7qad7qae7qaf7qag7qah7qai7qaj7qak7qal7qam7qan7qao7qap7qaq7qar7qas7qat7qau7qav7qaw7qax7qay7qaz7qa07qa17qa27qa37qa47qa57qa67qa77qa87qa97qa+7qa/Civup4Dup4Hup4Lup4Pup4Tup4Xup4bup4fup4jup4nup4rup4vup4zup43up47up4/up5Dup5Hup5Lup5Pup5Tup5Xup5bup5fup5jup5nup5rup5vup5zup53up57up5/up6Dup6Hup6Lup6Pup6Tup6Xup6bup6fup6jup6nup6rup6vup6zup63up67up6/up7Dup7Hup7Lup7Pup7Tup7Xup7bup7fup7jup7nup7rup7vup7zup73up77up78KK+6ogO6oge6ogu6og+6ohO6ohe6ohu6oh+6oiO6oie6oiu6oi+6ojO6oje6oju6oj+6okO6oke6oku6ok+6olO6ole6olu6ol+6omO6ome6omu6om+6onO6one6onu6on+6ooO6ooe6oou6oo+6opO6ope6opu6op+6oqO6oqe6oqu6oq+6orO6ore6oru6or+6osO6ose6osu6os+6otO6ote6otu6ot+6ouO6oue6ouu6ou+6ovO6ove6ovu6ovwor7qmA7qmB7qmC7qmD7qmE7qmF7qmG7qmH7qmI7qmJ7qmK7qmL7qmM7qmN7qmO7qmP7qmQ7qmR7qmS7qmT7qmU7qmV7qmW7qmX7qmY7qmZ7qma7qmb7qmc7qmd7qme7qmf7qmg7qmh7qmi7qmj7qmk7qml7qmm7qmn7qmo7qmp7qmq7qmr7qms7qmt7qmu7qmv7qmw7qmx7qmy7qmz7qm07qm17qm27qm37qm47qm57qm67qm77qm87qm97qm+7qm/CivuqoDuqoHuqoLuqoPuqoTuqoXuqobuqofuqojuqonuqoruqovuqozuqo3uqo7uqo/uqpDuqpHuqpLuqpPuqpTuqpXuqpbuqpfuqpjuqpnuqpruqpvuqpzuqp3uqp7uqp/uqqDuqqHuqqLuqqPuqqTuqqXuqqbuqqfuqqjuqqnuqqruqqvuqqzuqq3uqq7uqq/uqrDuqrHuqrLuqrPuqrTuqrXuqrbuqrfuqrjuqrnuqrruqrvuqrzuqr3uqr7uqr8KK+6rgO6rge6rgu6rg+6rhO6rhe6rhu6rh+6riO6rie6riu6ri+6rjO6rje6rju6rj+6rkO6rke6rku6rk+6rlO6rle6rlu6rl+6rmO6rme6rmu6rm+6rnO6rne6rnu6rn+6roO6roe6rou6ro+6rpO6rpe6rpu6rp+6rqO6rqe6rqu6rq+6rrO6rre6rru6rr+6rsO6rse6rsu6rs+6rtO6rte6rtu6rt+6ruO6rue6ruu6ru+6rvO6rve6rvu6rvwor7qyA7qyB7qyC7qyD7qyE7qyF7qyG7qyH7qyI7qyJ7qyK7qyL7qyM7qyN7qyO7qyP7qyQ7qyR7qyS7qyT7qyU7qyV7qyW7qyX7qyY7qyZ7qya7qyb7qyc7qyd7qye7qyf7qyg7qyh7qyi7qyj7qyk7qyl7qym7qyn7qyo7qyp7qyq7qyr7qys7qyt7qyu7qyv7qyw7qyx7qyy7qyz7qy07qy17qy27qy37qy47qy57qy67qy77qy87qy97qy+7qy/CivurYDurYHurYLurYPurYTurYXurYburYfurYjurYnurYrurYvurYzurY3urY7urY/urZDurZHurZLurZPurZTurZXurZburZfurZjurZnurZrurZvurZzurZ3urZ7urZ/uraDuraHuraLuraPuraTuraXuraburafurajuranuraruravurazura3ura7ura/urbDurbHurbLurbPurbTurbXurbburbfurbjurbnurbrurbvurbzurb3urb7urb8KK+6ugO6uge6ugu6ug+6uhO6uhe6uhu6uh+6uiO6uie6uiu6ui+6ujO6uje6uju6uj+6ukO6uke6uku6uk+6ulO6ule6ulu6ul+6umO6ume6umu6um+6unO6une6unu6un+6uoO6uoe6uou6uo+6upO6upe6upu6up+6uqO6uqe6uqu6uq+6urO6ure6uru6ur+6usO6use6usu6us+6utO6ute6utu6ut+6uuO6uue6uuu6uu+6uvO6uve6uvu6uvwor7q+A7q+B7q+C7q+D7q+E7q+F7q+G7q+H7q+I7q+J7q+K7q+L7q+M7q+N7q+O7q+P7q+Q7q+R7q+S7q+T7q+U7q+V7q+W7q+X7q+Y7q+Z7q+a7q+b7q+c7q+d7q+e7q+f7q+g7q+h7q+i7q+j7q+k7q+l7q+m7q+n7q+o7q+p7q+q7q+r7q+s7q+t7q+u7q+v7q+w7q+x7q+y7q+z7q+07q+17q+27q+37q+47q+57q+67q+77q+87q+97q++7q+/CivusIDusIHusILusIPusITusIXusIbusIfusIjusInusIrusIvusIzusI3usI7usI/usJDusJHusJLusJPusJTusJXusJbusJfusJjusJnusJrusJvusJzusJ3usJ7usJ/usKDusKHusKLusKPusKTusKXusKbusKfusKjusKnusKrusKvusKzusK3usK7usK/usLDusLHusLLusLPusLTusLXusLbusLfusLjusLnusLrusLvusLzusL3usL7usL8KK+6xgO6xge6xgu6xg+6xhO6xhe6xhu6xh+6xiO6xie6xiu6xi+6xjO6xje6xju6xj+6xkO6xke6xku6xk+6xlO6xle6xlu6xl+6xmO6xme6xmu6xm+6xnO6xne6xnu6xn+6xoO6xoe6xou6xo+6xpO6xpe6xpu6xp+6xqO6xqe6xqu6xq+6xrO6xre6xru6xr+6xsO6xse6xsu6xs+6xtO6xte6xtu6xt+6xuO6xue6xuu6xu+6xvO6xve6xvu6xvwor7rKA7rKB7rKC7rKD7rKE7rKF7rKG7rKH7rKI7rKJ7rKK7rKL7rKM7rKN7rKO7rKP7rKQ7rKR7rKS7rKT7rKU7rKV7rKW7rKX7rKY7rKZ7rKa7rKb7rKc7rKd7rKe7rKf7rKg7rKh7rKi7rKj7rKk7rKl7rKm7rKn7rKo7rKp7rKq7rKr7rKs7rKt7rKu7rKv7rKw7rKx7rKy7rKz7rK07rK17rK27rK37rK47rK57rK67rK77rK87rK97rK+7rK/Civus4Dus4Hus4Lus4Pus4Tus4Xus4bus4fus4jus4nus4rus4vus4zus43us47us4/us5Dus5Hus5Lus5Pus5Tus5Xus5bus5fus5jus5nus5rus5vus5zus53us57us5/us6Dus6Hus6Lus6Pus6Tus6Xus6bus6fus6jus6nus6rus6vus6zus63us67us6/us7Dus7Hus7Lus7Pus7Tus7Xus7bus7fus7jus7nus7rus7vus7zus73us77us78KK+60gO60ge60gu60g+60hO60he60hu60h+60iO60ie60iu60i+60jO60je60ju60j+60kO60ke60ku60k+60lO60le60lu60l+60mO60me60mu60m+60nO60ne60nu60n+60oO60oe60ou60o+60pO60pe60pu60p+60qO60qe60qu60q+60rO60re60ru60r+60sO60se60su60s+60tO60te60tu60t+60uO60ue60uu60u+60vO60ve60vu60vwor7rWA7rWB7rWC7rWD7rWE7rWF7rWG7rWH7rWI7rWJ7rWK7rWL7rWM7rWN7rWO7rWP7rWQ7rWR7rWS7rWT7rWU7rWV7rWW7rWX7rWY7rWZ7rWa7rWb7rWc7rWd7rWe7rWf7rWg7rWh7rWi7rWj7rWk7rWl7rWm7rWn7rWo7rWp7rWq7rWr7rWs7rWt7rWu7rWv7rWw7rWx7rWy7rWz7rW07rW17rW27rW37rW47rW57rW67rW77rW87rW97rW+7rW/CivutoDutoHutoLutoPutoTutoXutobutofutojutonutorutovutozuto3uto7uto/utpDutpHutpLutpPutpTutpXutpbutpfutpjutpnutprutpvutpzutp3utp7utp/utqDutqHutqLutqPutqTutqXutqbutqfutqjutqnutqrutqvutqzutq3utq7utq/utrDutrHutrLutrPutrTutrXutrbutrfutrjutrnutrrutrvutrzutr3utr7utr8KK+63gO63ge63gu63g+63hO63he63hu63h+63iO63ie63iu63i+63jO63je63ju63j+63kO63ke63ku63k+63lO63le63lu63l+63mO63me63mu63m+63nO63ne63nu63n+63oO63oe63ou63o+63pO63pe63pu63p+63qO63qe63qu63q+63rO63re63ru63r+63sO63se63su63s+63tO63te63tu63t+63uO63ue63uu63u+63vO63ve63vu63vwor7riA7riB7riC7riD7riE7riF7riG7riH7riI7riJ7riK7riL7riM7riN7riO7riP7riQ7riR7riS7riT7riU7riV7riW7riX7riY7riZ7ria7rib7ric7rid7rie7rif7rig7rih7rii7rij7rik7ril7rim7rin7rio7rip7riq7rir7ris7rit7riu7riv7riw7rix7riy7riz7ri07ri17ri27ri37ri47ri57ri67ri77ri87ri97ri+7ri/CivuuYDuuYHuuYLuuYPuuYTuuYXuuYbuuYfuuYjuuYnuuYruuYvuuYzuuY3uuY7uuY/uuZDuuZHuuZLuuZPuuZTuuZXuuZbuuZfuuZjuuZnuuZruuZvuuZzuuZ3uuZ7uuZ/uuaDuuaHuuaLuuaPuuaTuuaXuuabuuafuuajuuanuuaruuavuuazuua3uua7uua/uubDuubHuubLuubPuubTuubXuubbuubfuubjuubnuubruubvuubzuub3uub7uub8KK+66gO66ge66gu66g+66hO66he66hu66h+66iO66ie66iu66i+66jO66je66ju66j+66kO66ke66ku66k+66lO66le66lu66l+66mO66me66mu66m+66nO66ne66nu66n+66oO66oe66ou66o+66pO66pe66pu66p+66qO66qe66qu66q+66rO66re66ru66r+66sO66se66su66s+66tO66te66tu66t+66uO66ue66uu66u+66vO66ve66vu66vwor7ruA7ruB7ruC7ruD7ruE7ruF7ruG7ruH7ruI7ruJ7ruK7ruL7ruM7ruN7ruO7ruP7ruQ7ruR7ruS7ruT7ruU7ruV7ruW7ruX7ruY7ruZ7rua7rub7ruc7rud7rue7ruf7rug7ruh7rui7ruj7ruk7rul7rum7run7ruo7rup7ruq7rur7rus7rut7ruu7ruv7ruw7rux7ruy7ruz7ru07ru17ru27ru37ru47ru57ru67ru77ru87ru97ru+7ru/CivuvIDuvIHuvILuvIPuvITuvIXuvIbuvIfuvIjuvInuvIruvIvuvIzuvI3uvI7uvI/uvJDuvJHuvJLuvJPuvJTuvJXuvJbuvJfuvJjuvJnuvJruvJvuvJzuvJ3uvJ7uvJ/uvKDuvKHuvKLuvKPuvKTuvKXuvKbuvKfuvKjuvKnuvKruvKvuvKzuvK3uvK7uvK/uvLDuvLHuvLLuvLPuvLTuvLXuvLbuvLfuvLjuvLnuvLruvLvuvLzuvL3uvL7uvL8KK+69gO69ge69gu69g+69hO69he69hu69h+69iO69ie69iu69i+69jO69je69ju69j+69kO69ke69ku69k+69lO69le69lu69l+69mO69me69mu69m+69nO69ne69nu69n+69oO69oe69ou69o+69pO69pe69pu69p+69qO69qe69qu69q+69rO69re69ru69r+69sO69se69su69s+69tO69te69tu69t+69uO69ue69uu69u+69vO69ve69vu69vwor7r6A7r6B7r6C7r6D7r6E7r6F7r6G7r6H7r6I7r6J7r6K7r6L7r6M7r6N7r6O7r6P7r6Q7r6R7r6S7r6T7r6U7r6V7r6W7r6X7r6Y7r6Z7r6a7r6b7r6c7r6d7r6e7r6f7r6g7r6h7r6i7r6j7r6k7r6l7r6m7r6n7r6o7r6p7r6q7r6r7r6s7r6t7r6u7r6v7r6w7r6x7r6y7r6z7r607r617r627r637r647r657r667r677r687r697r6+7r6/Civuv4Duv4Huv4Luv4Puv4Tuv4Xuv4buv4fuv4juv4nuv4ruv4vuv4zuv43uv47uv4/uv5Duv5Huv5Luv5Puv5Tuv5Xuv5buv5fuv5juv5nuv5ruv5vuv5zuv53uv57uv5/uv6Duv6Huv6Luv6Puv6Tuv6Xuv6buv6fuv6juv6nuv6ruv6vuv6zuv63uv67uv6/uv7Duv7Huv7Luv7Puv7Tuv7Xuv7buv7fuv7juv7nuv7ruv7vuv7zuv73uv77uv78KK++AgO+Age+Agu+Ag++AhO+Ahe+Ahu+Ah++AiO+Aie+Aiu+Ai++AjO+Aje+Aju+Aj++AkO+Ake+Aku+Ak++AlO+Ale+Alu+Al++AmO+Ame+Amu+Am++AnO+Ane+Anu+An++AoO+Aoe+Aou+Ao++ApO+Ape+Apu+Ap++AqO+Aqe+Aqu+Aq++ArO+Are+Aru+Ar++AsO+Ase+Asu+As++AtO+Ate+Atu+At++AuO+Aue+Auu+Au++AvO+Ave+Avu+Avwor74GA74GB74GC74GD74GE74GF74GG74GH74GI74GJ74GK74GL74GM74GN74GO74GP74GQ74GR74GS74GT74GU74GV74GW74GX74GY74GZ74Ga74Gb74Gc74Gd74Ge74Gf74Gg74Gh74Gi74Gj74Gk74Gl74Gm74Gn74Go74Gp74Gq74Gr74Gs74Gt74Gu74Gv74Gw74Gx74Gy74Gz74G074G174G274G374G474G574G674G774G874G974G+74G/CivvgoDvgoHvgoLvgoPvgoTvgoXvgobvgofvgojvgonvgorvgovvgozvgo3vgo7vgo/vgpDvgpHvgpLvgpPvgpTvgpXvgpbvgpfvgpjvgpnvgprvgpvvgpzvgp3vgp7vgp/vgqDvgqHvgqLvgqPvgqTvgqXvgqbvgqfvgqjvgqnvgqrvgqvvgqzvgq3vgq7vgq/vgrDvgrHvgrLvgrPvgrTvgrXvgrbvgrfvgrjvgrnvgrrvgrvvgrzvgr3vgr7vgr8KK++DgO+Dge+Dgu+Dg++DhO+Dhe+Dhu+Dh++DiO+Die+Diu+Di++DjO+Dje+Dju+Dj++DkO+Dke+Dku+Dk++DlO+Dle+Dlu+Dl++DmO+Dme+Dmu+Dm++DnO+Dne+Dnu+Dn++DoO+Doe+Dou+Do++DpO+Dpe+Dpu+Dp++DqO+Dqe+Dqu+Dq++DrO+Dre+Dru+Dr++DsO+Dse+Dsu+Ds++DtO+Dte+Dtu+Dt++DuO+Due+Duu+Du++DvO+Dve+Dvu+Dvwor74SA74SB74SC74SD74SE74SF74SG74SH74SI74SJ74SK74SL74SM74SN74SO74SP74SQ74SR74SS74ST74SU74SV74SW74SX74SY74SZ74Sa74Sb74Sc74Sd74Se74Sf74Sg74Sh74Si74Sj74Sk74Sl74Sm74Sn74So74Sp74Sq74Sr74Ss74St74Su74Sv74Sw74Sx74Sy74Sz74S074S174S274S374S474S574S674S774S874S974S+74S/CivvhYDvhYHvhYLvhYPvhYTvhYXvhYbvhYfvhYjvhYnvhYrvhYvvhYzvhY3vhY7vhY/vhZDvhZHvhZLvhZPvhZTvhZXvhZbvhZfvhZjvhZnvhZrvhZvvhZzvhZ3vhZ7vhZ/vhaDvhaHvhaLvhaPvhaTvhaXvhabvhafvhajvhanvharvhavvhazvha3vha7vha/vhbDvhbHvhbLvhbPvhbTvhbXvhbbvhbfvhbjvhbnvhbrvhbvvhbzvhb3vhb7vhb8KK++GgO+Gge+Ggu+Gg++GhO+Ghe+Ghu+Gh++GiO+Gie+Giu+Gi++GjO+Gje+Gju+Gj++GkO+Gke+Gku+Gk++GlO+Gle+Glu+Gl++GmO+Gme+Gmu+Gm++GnO+Gne+Gnu+Gn++GoO+Goe+Gou+Go++GpO+Gpe+Gpu+Gp++GqO+Gqe+Gqu+Gq++GrO+Gre+Gru+Gr++GsO+Gse+Gsu+Gs++GtO+Gte+Gtu+Gt++GuO+Gue+Guu+Gu++GvO+Gve+Gvu+Gvwor74eA74eB74eC74eD74eE74eF74eG74eH74eI74eJ74eK74eL74eM74eN74eO74eP74eQ74eR74eS74eT74eU74eV74eW74eX74eY74eZ74ea74eb74ec74ed74ee74ef74eg74eh74ei74ej74ek74el74em74en74eo74ep74eq74er74es74et74eu74ev74ew74ex74ey74ez74e074e174e274e374e474e574e674e774e874e974e+74e/CivviIDviIHviILviIPviITviIXviIbviIfviIjviInviIrviIvviIzviI3viI7viI/viJDviJHviJLviJPviJTviJXviJbviJfviJjviJnviJrviJvviJzviJ3viJ7viJ/viKDviKHviKLviKPviKTviKXviKbviKfviKjviKnviKrviKvviKzviK3viK7viK/viLDviLHviLLviLPviLTviLXviLbviLfviLjviLnviLrviLvviLzviL3viL7viL8KK++JgO+Jge+Jgu+Jg++JhO+Jhe+Jhu+Jh++JiO+Jie+Jiu+Ji++JjO+Jje+Jju+Jj++JkO+Jke+Jku+Jk++JlO+Jle+Jlu+Jl++JmO+Jme+Jmu+Jm++JnO+Jne+Jnu+Jn++JoO+Joe+Jou+Jo++JpO+Jpe+Jpu+Jp++JqO+Jqe+Jqu+Jq++JrO+Jre+Jru+Jr++JsO+Jse+Jsu+Js++JtO+Jte+Jtu+Jt++JuO+Jue+Juu+Ju++JvO+Jve+Jvu+Jvwor74qA74qB74qC74qD74qE74qF74qG74qH74qI74qJ74qK74qL74qM74qN74qO74qP74qQ74qR74qS74qT74qU74qV74qW74qX74qY74qZ74qa74qb74qc74qd74qe74qf74qg74qh74qi74qj74qk74ql74qm74qn74qo74qp74qq74qr74qs74qt74qu74qv74qw74qx74qy74qz74q074q174q274q374q474q574q674q774q874q974q+74q/Civvi4Dvi4Hvi4Lvi4Pvi4Tvi4Xvi4bvi4fvi4jvi4nvi4rvi4vvi4zvi43vi47vi4/vi5Dvi5Hvi5Lvi5Pvi5Tvi5Xvi5bvi5fvi5jvi5nvi5rvi5vvi5zvi53vi57vi5/vi6Dvi6Hvi6Lvi6Pvi6Tvi6Xvi6bvi6fvi6jvi6nvi6rvi6vvi6zvi63vi67vi6/vi7Dvi7Hvi7Lvi7Pvi7Tvi7Xvi7bvi7fvi7jvi7nvi7rvi7vvi7zvi73vi77vi78KK++MgO+Mge+Mgu+Mg++MhO+Mhe+Mhu+Mh++MiO+Mie+Miu+Mi++MjO+Mje+Mju+Mj++MkO+Mke+Mku+Mk++MlO+Mle+Mlu+Ml++MmO+Mme+Mmu+Mm++MnO+Mne+Mnu+Mn++MoO+Moe+Mou+Mo++MpO+Mpe+Mpu+Mp++MqO+Mqe+Mqu+Mq++MrO+Mre+Mru+Mr++MsO+Mse+Msu+Ms++MtO+Mte+Mtu+Mt++MuO+Mue+Muu+Mu++MvO+Mve+Mvu+Mvwor742A742B742C742D742E742F742G742H742I742J742K742L742M742N742O742P742Q742R742S742T742U742V742W742X742Y742Z742a742b742c742d742e742f742g742h742i742j742k742l742m742n742o742p742q742r742s742t742u742v742w742x742y742z7420742174227423742474257426742774287429742+742/CivvjoDvjoHvjoLvjoPvjoTvjoXvjobvjofvjojvjonvjorvjovvjozvjo3vjo7vjo/vjpDvjpHvjpLvjpPvjpTvjpXvjpbvjpfvjpjvjpnvjprvjpvvjpzvjp3vjp7vjp/vjqDvjqHvjqLvjqPvjqTvjqXvjqbvjqfvjqjvjqnvjqrvjqvvjqzvjq3vjq7vjq/vjrDvjrHvjrLvjrPvjrTvjrXvjrbvjrfvjrjvjrnvjrrvjrvvjrzvjr3vjr7vjr8KK++PgO+Pge+Pgu+Pg++PhO+Phe+Phu+Ph++PiO+Pie+Piu+Pi++PjO+Pje+Pju+Pj++PkO+Pke+Pku+Pk++PlO+Ple+Plu+Pl++PmO+Pme+Pmu+Pm++PnO+Pne+Pnu+Pn++PoO+Poe+Pou+Po++PpO+Ppe+Ppu+Pp++PqO+Pqe+Pqu+Pq++PrO+Pre+Pru+Pr++PsO+Pse+Psu+Ps++PtO+Pte+Ptu+Pt++PuO+Pue+Puu+Pu++PvO+Pve+Pvu+Pvwor75CA75CB75CC75CD75CE75CF75CG75CH75CI75CJ75CK75CL75CM75CN75CO75CP75CQ75CR75CS75CT75CU75CV75CW75CX75CY75CZ75Ca75Cb75Cc75Cd75Ce75Cf75Cg75Ch75Ci75Cj75Ck75Cl75Cm75Cn75Co75Cp75Cq75Cr75Cs75Ct75Cu75Cv75Cw75Cx75Cy75Cz75C075C175C275C375C475C575C675C775C875C975C+75C/CivvkYDvkYHvkYLvkYPvkYTvkYXvkYbvkYfvkYjvkYnvkYrvkYvvkYzvkY3vkY7vkY/vkZDvkZHvkZLvkZPvkZTvkZXvkZbvkZfvkZjvkZnvkZrvkZvvkZzvkZ3vkZ7vkZ/vkaDvkaHvkaLvkaPvkaTvkaXvkabvkafvkajvkanvkarvkavvkazvka3vka7vka/vkbDvkbHvkbLvkbPvkbTvkbXvkbbvkbfvkbjvkbnvkbrvkbvvkbzvkb3vkb7vkb8KK++SgO+Sge+Sgu+Sg++ShO+She+Shu+Sh++SiO+Sie+Siu+Si++SjO+Sje+Sju+Sj++SkO+Ske+Sku+Sk++SlO+Sle+Slu+Sl++SmO+Sme+Smu+Sm++SnO+Sne+Snu+Sn++SoO+Soe+Sou+So++SpO+Spe+Spu+Sp++SqO+Sqe+Squ+Sq++SrO+Sre+Sru+Sr++SsO+Sse+Ssu+Ss++StO+Ste+Stu+St++SuO+Sue+Suu+Su++SvO+Sve+Svu+Svwor75OA75OB75OC75OD75OE75OF75OG75OH75OI75OJ75OK75OL75OM75ON75OO75OP75OQ75OR75OS75OT75OU75OV75OW75OX75OY75OZ75Oa75Ob75Oc75Od75Oe75Of75Og75Oh75Oi75Oj75Ok75Ol75Om75On75Oo75Op75Oq75Or75Os75Ot75Ou75Ov75Ow75Ox75Oy75Oz75O075O175O275O375O475O575O675O775O875O975O+75O/CivvlIDvlIHvlILvlIPvlITvlIXvlIbvlIfvlIjvlInvlIrvlIvvlIzvlI3vlI7vlI/vlJDvlJHvlJLvlJPvlJTvlJXvlJbvlJfvlJjvlJnvlJrvlJvvlJzvlJ3vlJ7vlJ/vlKDvlKHvlKLvlKPvlKTvlKXvlKbvlKfvlKjvlKnvlKrvlKvvlKzvlK3vlK7vlK/vlLDvlLHvlLLvlLPvlLTvlLXvlLbvlLfvlLjvlLnvlLrvlLvvlLzvlL3vlL7vlL8KK++VgO+Vge+Vgu+Vg++VhO+Vhe+Vhu+Vh++ViO+Vie+Viu+Vi++VjO+Vje+Vju+Vj++VkO+Vke+Vku+Vk++VlO+Vle+Vlu+Vl++VmO+Vme+Vmu+Vm++VnO+Vne+Vnu+Vn++VoO+Voe+Vou+Vo++VpO+Vpe+Vpu+Vp++VqO+Vqe+Vqu+Vq++VrO+Vre+Vru+Vr++VsO+Vse+Vsu+Vs++VtO+Vte+Vtu+Vt++VuO+Vue+Vuu+Vu++VvO+Vve+Vvu+Vvwor75aA75aB75aC75aD75aE75aF75aG75aH75aI75aJ75aK75aL75aM75aN75aO75aP75aQ75aR75aS75aT75aU75aV75aW75aX75aY75aZ75aa75ab75ac75ad75ae75af75ag75ah75ai75aj75ak75al75am75an75ao75ap75aq75ar75as75at75au75av75aw75ax75ay75az75a075a175a275a375a475a575a675a775a875a975a+75a/Civvl4Dvl4Hvl4Lvl4Pvl4Tvl4Xvl4bvl4fvl4jvl4nvl4rvl4vvl4zvl43vl47vl4/vl5Dvl5Hvl5Lvl5Pvl5Tvl5Xvl5bvl5fvl5jvl5nvl5rvl5vvl5zvl53vl57vl5/vl6Dvl6Hvl6Lvl6Pvl6Tvl6Xvl6bvl6fvl6jvl6nvl6rvl6vvl6zvl63vl67vl6/vl7Dvl7Hvl7Lvl7Pvl7Tvl7Xvl7bvl7fvl7jvl7nvl7rvl7vvl7zvl73vl77vl78KK++YgO+Yge+Ygu+Yg++YhO+Yhe+Yhu+Yh++YiO+Yie+Yiu+Yi++YjO+Yje+Yju+Yj++YkO+Yke+Yku+Yk++YlO+Yle+Ylu+Yl++YmO+Yme+Ymu+Ym++YnO+Yne+Ynu+Yn++YoO+Yoe+You+Yo++YpO+Ype+Ypu+Yp++YqO+Yqe+Yqu+Yq++YrO+Yre+Yru+Yr++YsO+Yse+Ysu+Ys++YtO+Yte+Ytu+Yt++YuO+Yue+Yuu+Yu++YvO+Yve+Yvu+Yvwor75mA75mB75mC75mD75mE75mF75mG75mH75mI75mJ75mK75mL75mM75mN75mO75mP75mQ75mR75mS75mT75mU75mV75mW75mX75mY75mZ75ma75mb75mc75md75me75mf75mg75mh75mi75mj75mk75ml75mm75mn75mo75mp75mq75mr75ms75mt75mu75mv75mw75mx75my75mz75m075m175m275m375m475m575m675m775m875m975m+75m/CivvmoDvmoHvmoLvmoPvmoTvmoXvmobvmofvmojvmonvmorvmovvmozvmo3vmo7vmo/vmpDvmpHvmpLvmpPvmpTvmpXvmpbvmpfvmpjvmpnvmprvmpvvmpzvmp3vmp7vmp/vmqDvmqHvmqLvmqPvmqTvmqXvmqbvmqfvmqjvmqnvmqrvmqvvmqzvmq3vmq7vmq/vmrDvmrHvmrLvmrPvmrTvmrXvmrbvmrfvmrjvmrnvmrrvmrvvmrzvmr3vmr7vmr8KK++bgO+bge+bgu+bg++bhO+bhe+bhu+bh++biO+bie+biu+bi++bjO+bje+bju+bj++bkO+bke+bku+bk++blO+ble+blu+bl++bmO+bme+bmu+bm++bnO+bne+bnu+bn++boO+boe+bou+bo++bpO+bpe+bpu+bp++bqO+bqe+bqu+bq++brO+bre+bru+br++bsO+bse+bsu+bs++btO+bte+btu+bt++buO+bue+buu+bu++bvO+bve+bvu+bvwor75yA75yB75yC75yD75yE75yF75yG75yH75yI75yJ75yK75yL75yM75yN75yO75yP75yQ75yR75yS75yT75yU75yV75yW75yX75yY75yZ75ya75yb75yc75yd75ye75yf75yg75yh75yi75yj75yk75yl75ym75yn75yo75yp75yq75yr75ys75yt75yu75yv75yw75yx75yy75yz75y075y175y275y375y475y575y675y775y875y975y+75y/CivvnYDvnYHvnYLvnYPvnYTvnYXvnYbvnYfvnYjvnYnvnYrvnYvvnYzvnY3vnY7vnY/vnZDvnZHvnZLvnZPvnZTvnZXvnZbvnZfvnZjvnZnvnZrvnZvvnZzvnZ3vnZ7vnZ/vnaDvnaHvnaLvnaPvnaTvnaXvnabvnafvnajvnanvnarvnavvnazvna3vna7vna/vnbDvnbHvnbLvnbPvnbTvnbXvnbbvnbfvnbjvnbnvnbrvnbvvnbzvnb3vnb7vnb8KK++egO+ege+egu+eg++ehO+ehe+ehu+eh++eiO+eie+eiu+ei++ejO+eje+eju+ej++ekO+eke+eku+ek++elO+ele+elu+el++emO+eme+emu+em++enO+ene+enu+en++eoO+eoe+eou+eo++epO+epe+epu+ep++eqO+eqe+equ+eq++erO+ere+eru+er++esO+ese+esu+es++etO+ete+etu+et++euO+eue+euu+eu++evO+eve+evu+evwor75+A75+B75+C75+D75+E75+F75+G75+H75+I75+J75+K75+L75+M75+N75+O75+P75+Q75+R75+S75+T75+U75+V75+W75+X75+Y75+Z75+a75+b75+c75+d75+e75+f75+g75+h75+i75+j75+k75+l75+m75+n75+o75+p75+q75+r75+s75+t75+u75+v75+w75+x75+y75+z75+075+175+275+375+475+575+675+775+875+975++75+/CivvoIDvoIHvoILvoIPvoITvoIXvoIbvoIfvoIjvoInvoIrvoIvvoIzvoI3voI7voI/voJDvoJHvoJLvoJPvoJTvoJXvoJbvoJfvoJjvoJnvoJrvoJvvoJzvoJ3voJ7voJ/voKDvoKHvoKLvoKPvoKTvoKXvoKbvoKfvoKjvoKnvoKrvoKvvoKzvoK3voK7voK/voLDvoLHvoLLvoLPvoLTvoLXvoLbvoLfvoLjvoLnvoLrvoLvvoLzvoL3voL7voL8KK++hgO+hge+hgu+hg++hhO+hhe+hhu+hh++hiO+hie+hiu+hi++hjO+hje+hju+hj++hkO+hke+hku+hk++hlO+hle+hlu+hl++hmO+hme+hmu+hm++hnO+hne+hnu+hn++hoO+hoe+hou+ho++hpO+hpe+hpu+hp++hqO+hqe+hqu+hq++hrO+hre+hru+hr++hsO+hse+hsu+hs++htO+hte+htu+ht++huO+hue+huu+hu++hvO+hve+hvu+hvwor76KA76KB76KC76KD76KE76KF76KG76KH76KI76KJ76KK76KL76KM76KN76KO76KP76KQ76KR76KS76KT76KU76KV76KW76KX76KY76KZ76Ka76Kb76Kc76Kd76Ke76Kf76Kg76Kh76Ki76Kj76Kk76Kl76Km76Kn76Ko76Kp76Kq76Kr76Ks76Kt76Ku76Kv76Kw76Kx76Ky76Kz76K076K176K276K376K476K576K676K776K876K976K+76K/Civvo4Dvo4Hvo4Lvo4Pvo4Tvo4Xvo4bvo4fvo4jvo4nvo4rvo4vvo4zvo43vo47vo4/vo5Dvo5Hvo5Lvo5Pvo5Tvo5Xvo5bvo5fvo5jvo5nvo5rvo5vvo5zvo53vo57vo5/vo6Dvo6Hvo6Lvo6Pvo6Tvo6Xvo6bvo6fvo6jvo6nvo6rvo6vvo6zvo63vo67vo6/vo7Dvo7Hvo7Lvo7Pvo7Tvo7Xvo7bvo7fvo7jvo7nvo7rvo7vvo7zvo73vo77vo78KKworQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyAoVStGOTAwLVUrRkFGRik6CisKK++kgO+kge+kgu+kg++khO+khe+khu+kh++kiO+kie+kiu+ki++kjO+kje+kju+kj++kkO+kke+kku+kk++klO+kle+klu+kl++kmO+kme+kmu+km++knO+kne+knu+knwor76Sg76Sh76Si76Sj76Sk76Sl76Sm76Sn76So76Sp76Sq76Sr76Ss76St76Su76Sv76Sw76Sx76Sy76Sz76S076S176S276S376S476S576S676S776S876S976S+76S/CivvpYDvpYHvpYLvpYPvpYTvpYXvpYbvpYfvpYjvpYnvpYrvpYvvpYzvpY3vpY7vpY/vpZDvpZHvpZLvpZPvpZTvpZXvpZbvpZfvpZjvpZnvpZrvpZvvpZzvpZ3vpZ7vpZ8KK++loO+loe+lou+lo++lpO+lpe+lpu+lp++lqO+lqe+lqu+lq++lrO+lre+lru+lr++lsO+lse+lsu+ls++ltO+lte+ltu+lt++luO+lue+luu+lu++lvO+lve+lvu+lvwor76aA76aB76aC76aD76aE76aF76aG76aH76aI76aJ76aK76aL76aM76aN76aO76aP76aQ76aR76aS76aT76aU76aV76aW76aX76aY76aZ76aa76ab76ac76ad76ae76afCivvpqDvpqHvpqLvpqPvpqTvpqXvpqbvpqfvpqjvpqnvpqrvpqvvpqzvpq3vpq7vpq/vprDvprHvprLvprPvprTvprXvprbvprfvprjvprnvprrvprvvprzvpr3vpr7vpr8KK++ngO+nge+ngu+ng++nhO+nhe+nhu+nh++niO+nie+niu+ni++njO+nje+nju+nj++nkO+nke+nku+nk++nlO+nle+nlu+nl++nmO+nme+nmu+nm++nnO+nne+nnu+nnwor76eg76eh76ei76ej76ek76el76em76en76eo76ep76eq76er76es76et76eu76ev76ew76ex76ey76ez76e076e176e276e376e476e576e676e776e876e976e+76e/CivvqIDvqIHvqILvqIPvqITvqIXvqIbvqIfvqIjvqInvqIrvqIvvqIzvqI3vqI7vqI/vqJDvqJHvqJLvqJPvqJTvqJXvqJbvqJfvqJjvqJnvqJrvqJvvqJzvqJ3vqJ7vqJ8KK++ooO+ooe+oou+oo++opO+ope+opu+op++oqO+oqe+oqu+oq++orO+ore+oru+or++osO+ose+osu+os++otO+ote+otu+ot++ouO+oue+ouu+ou++ovO+ove+ovu+ovwor76mA76mB76mC76mD76mE76mF76mG76mH76mI76mJ76mK76mL76mM76mN76mO76mP76mQ76mR76mS76mT76mU76mV76mW76mX76mY76mZ76ma76mb76mc76md76me76mfCivvqaDvqaHvqaLvqaPvqaTvqaXvqabvqafvqajvqanvqarvqavvqazvqa3vqa7vqa/vqbDvqbHvqbLvqbPvqbTvqbXvqbbvqbfvqbjvqbnvqbrvqbvvqbzvqb3vqb7vqb8KK++qgO+qge+qgu+qg++qhO+qhe+qhu+qh++qiO+qie+qiu+qi++qjO+qje+qju+qj++qkO+qke+qku+qk++qlO+qle+qlu+ql++qmO+qme+qmu+qm++qnO+qne+qnu+qnwor76qg76qh76qi76qj76qk76ql76qm76qn76qo76qp76qq76qr76qs76qt76qu76qv76qw76qx76qy76qz76q076q176q276q376q476q576q676q776q876q976q+76q/Civvq4Dvq4Hvq4Lvq4Pvq4Tvq4Xvq4bvq4fvq4jvq4nvq4rvq4vvq4zvq43vq47vq4/vq5Dvq5Hvq5Lvq5Pvq5Tvq5Xvq5bvq5fvq5jvq5nvq5rvq5vvq5zvq53vq57vq58KK++roO+roe+rou+ro++rpO+rpe+rpu+rp++rqO+rqe+rqu+rq++rrO+rre+rru+rr++rsO+rse+rsu+rs++rtO+rte+rtu+rt++ruO+rue+ruu+ru++rvO+rve+rvu+rvworCitBbHBoYWJldGljIFByZXNlbnRhdGlvbiBGb3JtcyAoVStGQjAwLVUrRkI0Rik6CisKK++sgO+sge+sgu+sg++shO+she+shu+sh++siO+sie+siu+si++sjO+sje+sju+sj++skO+ske+sku+sk++slO+sle+slu+sl++smO+sme+smu+sm++snO+sneKXjO+snu+sn++soO+soe+sou+so++spO+spe+spu+sp++sqO+sqe+squ+sq++srO+sre+sru+sr++ssO+sse+ssu+ss++stO+ste+stu+st++suO+sue+suu+su++svO+sve+svu+svwor762A762B762C762D762E762F762G762H762I762J762K762L762M762N762O762PCisKK0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSAoVStGQjUwLVUrRkRGRik6CisKK++tkO+tke+tku+tk++tlO+tle+tlu+tl++tmO+tme+tmu+tm++tnO+tne+tnu+tn++toO+toe+tou+to++tpO+tpe+tpu+tp++tqO+tqe+tqu+tq++trO+tre+tru+tr++tsO+tse+tsu+ts++ttO+tte+ttu+tt++tuO+tue+tuu+tu++tvO+tve+tvu+tv++ugO+uge+ugu+ug++uhO+uhe+uhu+uh++uiO+uie+uiu+ui++ujO+uje+uju+ujwor766Q766R766S766T766U766V766W766X766Y766Z766a766b766c766d766e766f766g766h766i766j766k766l766m766n766o766p766q766r766s766t766u766v766w766x766y766z7660766176627663766476657666766776687669766+766/76+A76+B76+C76+D76+E76+F76+G76+H76+I76+J76+K76+L76+M76+N76+O76+PCivvr5Dvr5Hvr5Lvr5Pvr5Tvr5Xvr5bvr5fvr5jvr5nvr5rvr5vvr5zvr53vr57vr5/vr6Dvr6Hvr6Lvr6Pvr6Tvr6Xvr6bvr6fvr6jvr6nvr6rvr6vvr6zvr63vr67vr6/vr7Dvr7Hvr7Lvr7Pvr7Tvr7Xvr7bvr7fvr7jvr7nvr7rvr7vvr7zvr73vr77vr7/vsIDvsIHvsILvsIPvsITvsIXvsIbvsIfvsIjvsInvsIrvsIvvsIzvsI3vsI7vsI8KK++wkO+wke+wku+wk++wlO+wle+wlu+wl++wmO+wme+wmu+wm++wnO+wne+wnu+wn++woO+woe+wou+wo++wpO+wpe+wpu+wp++wqO+wqe+wqu+wq++wrO+wre+wru+wr++wsO+wse+wsu+ws++wtO+wte+wtu+wt++wuO+wue+wuu+wu++wvO+wve+wvu+wv++xgO+xge+xgu+xg++xhO+xhe+xhu+xh++xiO+xie+xiu+xi++xjO+xje+xju+xjwor77GQ77GR77GS77GT77GU77GV77GW77GX77GY77GZ77Ga77Gb77Gc77Gd77Ge77Gf77Gg77Gh77Gi77Gj77Gk77Gl77Gm77Gn77Go77Gp77Gq77Gr77Gs77Gt77Gu77Gv77Gw77Gx77Gy77Gz77G077G177G277G377G477G577G677G777G877G977G+77G/77KA77KB77KC77KD77KE77KF77KG77KH77KI77KJ77KK77KL77KM77KN77KO77KPCivvspDvspHvspLvspPvspTvspXvspbvspfvspjvspnvsprvspvvspzvsp3vsp7vsp/vsqDvsqHvsqLvsqPvsqTvsqXvsqbvsqfvsqjvsqnvsqrvsqvvsqzvsq3vsq7vsq/vsrDvsrHvsrLvsrPvsrTvsrXvsrbvsrfvsrjvsrnvsrrvsrvvsrzvsr3vsr7vsr/vs4Dvs4Hvs4Lvs4Pvs4Tvs4Xvs4bvs4fvs4jvs4nvs4rvs4vvs4zvs43vs47vs48KK++zkO+zke+zku+zk++zlO+zle+zlu+zl++zmO+zme+zmu+zm++znO+zne+znu+zn++zoO+zoe+zou+zo++zpO+zpe+zpu+zp++zqO+zqe+zqu+zq++zrO+zre+zru+zr++zsO+zse+zsu+zs++ztO+zte+ztu+zt++zuO+zue+zuu+zu++zvO+zve+zvu+zv++0gO+0ge+0gu+0g++0hO+0he+0hu+0h++0iO+0ie+0iu+0i++0jO+0je+0ju+0jwor77SQ77SR77SS77ST77SU77SV77SW77SX77SY77SZ77Sa77Sb77Sc77Sd77Se77Sf77Sg77Sh77Si77Sj77Sk77Sl77Sm77Sn77So77Sp77Sq77Sr77Ss77St77Su77Sv77Sw77Sx77Sy77Sz77S077S177S277S377S477S577S677S777S877S977S+77S/77WA77WB77WC77WD77WE77WF77WG77WH77WI77WJ77WK77WL77WM77WN77WO77WPCivvtZDvtZHvtZLvtZPvtZTvtZXvtZbvtZfvtZjvtZnvtZrvtZvvtZzvtZ3vtZ7vtZ/vtaDvtaHvtaLvtaPvtaTvtaXvtabvtafvtajvtanvtarvtavvtazvta3vta7vta/vtbDvtbHvtbLvtbPvtbTvtbXvtbbvtbfvtbjvtbnvtbrvtbvvtbzvtb3vtb7vtb/vtoDvtoHvtoLvtoPvtoTvtoXvtobvtofvtojvtonvtorvtovvtozvto3vto7vto8KK++2kO+2ke+2ku+2k++2lO+2le+2lu+2l++2mO+2me+2mu+2m++2nO+2ne+2nu+2n++2oO+2oe+2ou+2o++2pO+2pe+2pu+2p++2qO+2qe+2qu+2q++2rO+2re+2ru+2r++2sO+2se+2su+2s++2tO+2te+2tu+2t++2uO+2ue+2uu+2u++2vO+2ve+2vu+2v++3gO+3ge+3gu+3g++3hO+3he+3hu+3h++3iO+3ie+3iu+3i++3jO+3je+3ju+3jwor77eQ77eR77eS77eT77eU77eV77eW77eX77eY77eZ77ea77eb77ec77ed77ee77ef77eg77eh77ei77ej77ek77el77em77en77eo77ep77eq77er77es77et77eu77ev77ew77ex77ey77ez77e077e177e277e377e477e577e677e777e877e977e+77e/CisKK1ZhcmlhdGlvbiBTZWxlY3RvcnMgKFUrRkUwMC1VK0ZFMEYpOgorCivil4zvuIDil4zvuIHil4zvuILil4zvuIPil4zvuITil4zvuIXil4zvuIbil4zvuIfil4zvuIjil4zvuInil4zvuIril4zvuIvil4zvuIzil4zvuI3il4zvuI7il4zvuI8KKworRnJlZSBibG9jayAoVStGRTEwLVUrRkUxRik6CisKK++4kO+4ke+4ku+4k++4lO+4le+4lu+4l++4mO+4me+4mu+4m++4nO+4ne+4nu+4nworCitDb21iaW5pbmcgSGFsZiBNYXJrcyAoVStGRTIwLVUrRkUyRik6CisKK+KXjO+4oOKXjO+4oeKXjO+4ouKXjO+4o++4pO+4pe+4pu+4p++4qO+4qe+4qu+4q++4rO+4re+4ru+4rworCitDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyAoVStGRTMwLVUrRkU0Rik6CisKK++4sO+4se+4su+4s++4tO+4te+4tu+4t++4uO+4ue+4uu+4u++4vO+4ve+4vu+4v++5gO+5ge+5gu+5g++5hO+5he+5hu+5h++5iO+5ie+5iu+5i++5jO+5je+5ju+5jworCitTbWFsbCBGb3JtIFZhcmlhbnRzIChVK0ZFNTAtVStGRTZGKToKKwor77mQ77mR77mS77mT77mU77mV77mW77mX77mY77mZ77ma77mb77mc77md77me77mf77mg77mh77mi77mj77mk77ml77mm77mn77mo77mp77mq77mr77ms77mt77mu77mvCisKK0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiAoVStGRTcwLVUrRkVGRik6CisKK++5sO+5se+5su+5s++5tO+5te+5tu+5t++5uO+5ue+5uu+5u++5vO+5ve+5vu+5v++6gO+6ge+6gu+6g++6hO+6he+6hu+6h++6iO+6ie+6iu+6i++6jO+6je+6ju+6j++6kO+6ke+6ku+6k++6lO+6le+6lu+6l++6mO+6me+6mu+6m++6nO+6ne+6nu+6n++6oO+6oe+6ou+6o++6pO+6pe+6pu+6p++6qO+6qe+6qu+6q++6rO+6re+6ru+6rwor77qw77qx77qy77qz77q077q177q277q377q477q577q677q777q877q977q+77q/77uA77uB77uC77uD77uE77uF77uG77uH77uI77uJ77uK77uL77uM77uN77uO77uP77uQ77uR77uS77uT77uU77uV77uW77uX77uY77uZ77ua77ub77uc77ud77ue77uf77ug77uh77ui77uj77uk77ul77um77un77uo77up77uq77ur77us77ut77uu77uvCivvu7Dvu7Hvu7Lvu7Pvu7Tvu7Xvu7bvu7fvu7jvu7nvu7rvu7vvu7zvu73vu77vu78KKworSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMgKFUrRkYwMC1VK0ZGRUYpOgorCivvvIDvvIHvvILvvIPvvITvvIXvvIbvvIfvvIjvvInvvIrvvIvvvIzvvI3vvI7vvI/vvJDvvJHvvJLvvJPvvJTvvJXvvJbvvJfvvJjvvJnvvJrvvJvvvJzvvJ3vvJ7vvJ8KK++8oO+8oe+8ou+8o++8pO+8pe+8pu+8p++8qO+8qe+8qu+8q++8rO+8re+8ru+8r++8sO+8se+8su+8s++8tO+8te+8tu+8t++8uO+8ue+8uu+8u++8vO+8ve+8vu+8vwor772A772B772C772D772E772F772G772H772I772J772K772L772M772N772O772P772Q772R772S772T772U772V772W772X772Y772Z772a772b772c772d772e772fCivvvaDvvaHvvaLvvaPvvaTvvaXvvabvvafvvajvvanvvarvvavvvazvva3vva7vva/vvbDvvbHvvbLvvbPvvbTvvbXvvbbvvbfvvbjvvbnvvbrvvbvvvbzvvb3vvb7vvb/vvoDvvoHvvoLvvoPvvoTvvoXvvobvvofvvojvvonvvorvvovvvozvvo3vvo7vvo/vvpDvvpHvvpLvvpPvvpTvvpXvvpbvvpfvvpjvvpnvvprvvpvvvpzvvp3vvp4KK+++n+++oO++oe++ou++o+++pO++pe++pu++p+++qO++qe++qu++q+++rO++re++ru++r+++sO++se++su++s+++tO++te++tu++t+++uO++ue++uu++u+++vO++ve++vu++v++/gO+/ge+/gu+/g++/hO+/he+/hu+/h++/iO+/ie+/iu+/i++/jO+/je+/ju+/j++/kO+/ke+/ku+/k++/lO+/le+/lu+/l++/mO+/me+/mu+/m++/nO+/ne+/ngor77+f77+g77+h77+i77+j77+k77+l77+m77+n77+o77+p77+q77+r77+s77+t77+u77+vCisKK1NwZWNpYWxzIChVK0ZGRjAtVStGRkZGKToKKwor77+w77+x77+y77+z77+077+177+277+377+477+577+677+777+877+977++77+/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvQ29uZmlnLnNyYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0M2UxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDcxIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJMaW51eCBFeHQyIEZTIFByb2dzIgorCitJTlNFUlQKKworY29uZmlnIENIQVRUUgorCWJvb2wgImNoYXR0ciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjaGF0dHIgY2hhbmdlcyB0aGUgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtLgorCisjIyMgY29uZmlnIEUyRlNDSworIyMjCWJvb2wgImUyZnNjayIKKyMjIwlkZWZhdWx0IHkKKyMjIwloZWxwCisjIyMJICBlMmZzY2sgaXMgdXNlZCB0byBjaGVjayBMaW51eCBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW1zIChleHQyZnMpLgorIyMjCSAgZTJmc2NrIGFsc28gc3VwcG9ydHMgZXh0MiBmaWxlc3lzdGVtcyBjb3VudGFpbmluZyBhIGpvdXJuYWwgKGV4dDMpLgorIyMjCSAgVGhlIG5vcm1hbCBjb21wYXQgc3ltbGlua3MgJ2ZzY2suZXh0MicgYW5kICdmc2NrLmV4dDMnIGFyZSBhbHNvCisjIyMJICBwcm92aWRlZC4KKworY29uZmlnIEZTQ0sKKwlib29sICJmc2NrIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGZzY2sgaXMgdXNlZCB0byBjaGVjayBhbmQgb3B0aW9uYWxseSByZXBhaXIgb25lIG9yIG1vcmUgZmlsZXN5c3RlbXMuCisJICBJbiBhY3R1YWxpdHksIGZzY2sgaXMgc2ltcGx5IGEgZnJvbnQtZW5kIGZvciB0aGUgdmFyaW91cyBmaWxlIHN5c3RlbQorCSAgY2hlY2tlcnMgKGZzY2suZnN0eXBlKSBhdmFpbGFibGUgdW5kZXIgTGludXguCisKK2NvbmZpZyBMU0FUVFIKKwlib29sICJsc2F0dHIiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbHNhdHRyIGxpc3RzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb24gYSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0uCisKKyMjIyBjb25maWcgTUtFMkZTCisjIyMJYm9vbCAibWtlMmZzIgorIyMjCWRlZmF1bHQgeQorIyMjCWhlbHAKKyMjIwkgIG1rZTJmcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBleHQyL2V4dDMgZmlsZXN5c3RlbS4gVGhlIG5vcm1hbCBjb21wYXQKKyMjIwkgIHN5bWxpbmtzICdta2ZzLmV4dDInIGFuZCAnbWtmcy5leHQzJyBhcmUgYWxzbyBwcm92aWRlZC4KKworY29uZmlnIFRVTkUyRlMKKwlib29sICJ0dW5lMmZzIgorCWRlZmF1bHQgbiAgIyBvZmY6IGl0IGlzIHRvbyBsaW1pdGVkIGNvbXBhcmVkIHRvIHVwc3RyZWFtIHZlcnNpb24KKwloZWxwCisJICB0dW5lMmZzIGFsbG93cyB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IgdG8gYWRqdXN0IHZhcmlvdXMgdHVuYWJsZQorCSAgZmlsZXN5c3RlbSBwYXJhbWV0ZXJzIG9uIExpbnV4IGV4dDIvZXh0MyBmaWxlc3lzdGVtcy4KKworIyMjIGNvbmZpZyBFMkxBQkVMCisjIyMJYm9vbCAiZTJsYWJlbCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFRVTkUyRlMKKyMjIwloZWxwCisjIyMJICBlMmxhYmVsIHdpbGwgZGlzcGxheSBvciBjaGFuZ2UgdGhlIGZpbGVzeXN0ZW0gbGFiZWwgb24gdGhlIGV4dDIKKyMjIwkgIGZpbGVzeXN0ZW0gbG9jYXRlZCBvbiBkZXZpY2UuCisKKyMjIyBOQjogdGhpcyBvbmUgaXMgbm93IHByb3ZpZGVkIGJ5IHV0aWwtbGludXgvdm9sdW1lX2lkLyoKKyMjIyBjb25maWcgRklOREZTCisjIyMJYm9vbCAiZmluZGZzIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVFVORTJGUworIyMjCWhlbHAKKyMjIwkgIGZpbmRmcyB3aWxsIHNlYXJjaCB0aGUgZGlza3MgaW4gdGhlIHN5c3RlbSBsb29raW5nIGZvciBhIGZpbGVzeXN0ZW0KKyMjIwkgIHdoaWNoIGhhcyBhIGxhYmVsIG1hdGNoaW5nIGxhYmVsIG9yIGEgVVVJRCBlcXVhbCB0byB1dWlkLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTE0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE1IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoQ09ORklHX0NIQVRUUikgKz0gY2hhdHRyLm8gZTJmc19saWIubworbGliLSQoQ09ORklHX0xTQVRUUikgKz0gbHNhdHRyLm8gZTJmc19saWIubworCitsaWItJChDT05GSUdfRlNDSykgICAgKz0gZnNjay5vCitsaWItJChDT05GSUdfVFVORTJGUykgKz0gdHVuZTJmcy5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvUkVBRE1FIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjE1OGU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL1JFQURNRQpAQCAtMCwwICsxLDEyIEBACitBdXRob3JzIGFuZCBjb250cmlidXRvcnMgb2Ygb3JpZ2luYWwgZTJmc3Byb2dzOgorCitSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CitUaGVvZG9yZSBUcydvIDx0eXRzb0BtaXQuZWR1PgorU3RlcGhlbiBDLiBUd2VlZGllIDxzY3RAcmVkaGF0LmNvbT4KK0FuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KK0theiBLeWxoZWt1IDxrYXpAYXNoaS5mb290cHJpbnRzLm5ldD4KK0YuVy4gdGVuIFdvbGRlIDxmcmFua3lAZHV0ZWNhLmV0LnR1ZGVsZnQubmw+CitKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAemlwLmNvbS5hdT4KK00uSi5FLiBNb2wgPG1hcmNlbEBkdXRlY2EuZXQudHVkZWxmdC5ubD4KK01pcXVlbCB2YW4gU21vb3JlbmJ1cmcgPG1pcXVlbHNAZHJpbmtlbC5vdy5vcmc+CitVd2UgT2hzZSA8dXdlQHRpcmthLmd1bi5kZT4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9jaGF0dHIuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9jaGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWNjODM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL2NoYXR0ci5jCkBAIC0wLDAgKzEsMTk1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjaGF0dHIuYwkJLSBDaGFuZ2UgZmlsZSBhdHRyaWJ1dGVzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiA5My8xMC8zMAktIENyZWF0aW9uCisgKiA5My8xMS8xMwktIFJlcGxhY2Ugc3RhdCgpIGNhbGxzIGJ5IGxzdGF0KCkgdG8gYXZvaWQgbG9vcHMKKyAqIDk0LzAyLzI3CS0gSW50ZWdyYXRlZCBpbiBUZWQncyBkaXN0cmlidXRpb24KKyAqIDk4LzEyLzI5CS0gSWdub3JlIHN5bWxpbmtzIHdoZW4gd29ya2luZyByZWN1cnNpdmVseSAoRyBNIFNpcGUpCisgKiA5OC8xMi8yOQktIERpc3BsYXkgdmVyc2lvbiBpbmZvIG9ubHkgd2hlbiAtViBzcGVjaWZpZWQgKEcgTSBTaXBlKQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaGF0dHJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUl0gWy0rPUFhY0RkaWpzU3RUdV0gWy12IFZFUlNJT05dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBjaGF0dHJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2UgZmlsZSBhdHRyaWJ1dGVzIG9uIGFuIGV4dDIgZnNcbiIKKy8vdXNhZ2U6ICAgICAiXG5Nb2RpZmllcnM6IgorLy91c2FnZTogICAgICJcbgktCVJlbW92ZSBhdHRyaWJ1dGVzIgorLy91c2FnZTogICAgICJcbgkrCUFkZCBhdHRyaWJ1dGVzIgorLy91c2FnZTogICAgICJcbgk9CVNldCBhdHRyaWJ1dGVzIgorLy91c2FnZTogICAgICJcbkF0dHJpYnV0ZXM6IgorLy91c2FnZTogICAgICJcbglBCURvbid0IHRyYWNrIGF0aW1lIgorLy91c2FnZTogICAgICJcbglhCUFwcGVuZCBtb2RlIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCWMJRW5hYmxlIGNvbXByZXNzIgorLy91c2FnZTogICAgICJcbglECVdyaXRlIGRpciBjb250ZW50cyBzeW5jaHJvbm91c2x5IgorLy91c2FnZTogICAgICJcbglkCURvbid0IGJhY2t1cCB3aXRoIGR1bXAiCisvL3VzYWdlOiAgICAgIlxuCWkJQ2Fubm90IGJlIG1vZGlmaWVkIChpbW11dGFibGUpIgorLy91c2FnZTogICAgICJcbglqCVdyaXRlIGFsbCBkYXRhIHRvIGpvdXJuYWwgZmlyc3QiCisvL3VzYWdlOiAgICAgIlxuCXMJWmVybyBkaXNrIHN0b3JhZ2Ugd2hlbiBkZWxldGVkIgorLy91c2FnZTogICAgICJcbglTCVdyaXRlIGZpbGUgY29udGVudHMgc3luY2hyb25vdXNseSIKKy8vdXNhZ2U6ICAgICAiXG4JdAlEaXNhYmxlIHRhaWwtbWVyZ2luZyBvZiBwYXJ0aWFsIGJsb2NrcyB3aXRoIG90aGVyIGZpbGVzIgorLy91c2FnZTogICAgICJcbgl1CUFsbG93IGZpbGUgdG8gYmUgdW5kZWxldGVkIgorLy91c2FnZTogICAgICJcbgktUglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktdglTZXQgdGhlIGZpbGUncyB2ZXJzaW9uL2dlbmVyYXRpb24gbnVtYmVyIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJlMmZzX2xpYi5oIgorCisjZGVmaW5lIE9QVF9BREQgMQorI2RlZmluZSBPUFRfUkVNIDIKKyNkZWZpbmUgT1BUX1NFVCA0CisjZGVmaW5lIE9QVF9TRVRfVkVSIDgKKworc3RydWN0IGdsb2JhbHMgeworCXVuc2lnbmVkIGxvbmcgdmVyc2lvbjsKKwl1bnNpZ25lZCBsb25nIGFmOworCXVuc2lnbmVkIGxvbmcgcmY7CisJc21hbGxpbnQgZmxhZ3M7CisJc21hbGxpbnQgcmVjdXJzaXZlOworfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2ZsYWcoY2hhciBjKQoreworCWNvbnN0IGNoYXIgKmZwID0gc3RyY2hyKGUyYXR0cl9mbGFnc19zbmFtZV9jaGF0dHIsIGMpOworCWlmIChmcCkKKwkJcmV0dXJuIGUyYXR0cl9mbGFnc192YWx1ZV9jaGF0dHJbZnAgLSBlMmF0dHJfZmxhZ3Nfc25hbWVfY2hhdHRyXTsKKwliYl9zaG93X3VzYWdlKCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2FyZyhjb25zdCBjaGFyICphcmcsIHN0cnVjdCBnbG9iYWxzICpncCkKK3sKKwl1bnNpZ25lZCBsb25nICpmbDsKKwljaGFyIG9wdCA9ICphcmcrKzsKKworCWZsID0gJmdwLT5hZjsKKwlpZiAob3B0ID09ICctJykgeworCQlncC0+ZmxhZ3MgfD0gT1BUX1JFTTsKKwkJZmwgPSAmZ3AtPnJmOworCX0gZWxzZSBpZiAob3B0ID09ICcrJykgeworCQlncC0+ZmxhZ3MgfD0gT1BUX0FERDsKKwl9IGVsc2UgaWYgKG9wdCA9PSAnPScpIHsKKwkJZ3AtPmZsYWdzIHw9IE9QVF9TRVQ7CisJfSBlbHNlCisJCXJldHVybiAwOworCisJd2hpbGUgKCphcmcpCisJCSpmbCB8PSBnZXRfZmxhZygqYXJnKyspOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9hdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBnbG9iYWxzICpncCk7CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGNoYXR0cl9kaXJfcHJvYyhjb25zdCBjaGFyICpkaXJfbmFtZSwgc3RydWN0IGRpcmVudCAqZGUsIHZvaWQgKmdwKQoreworCWNoYXIgKnBhdGggPSBjb25jYXRfc3VicGF0aF9maWxlKGRpcl9uYW1lLCBkZS0+ZF9uYW1lKTsKKwkvKiBwYXRoIGlzIE5VTEwgaWYgZGUtPmRfbmFtZSBpcyAiLiIgb3IgIi4uIiwgZWxzZS4uLiAqLworCWlmIChwYXRoKSB7CisJCWNoYW5nZV9hdHRyaWJ1dGVzKHBhdGgsIGdwKTsKKwkJZnJlZShwYXRoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9hdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBnbG9iYWxzICpncCkKK3sKKwl1bnNpZ25lZCBsb25nIGZzZmxhZ3M7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAobHN0YXQobmFtZSwgJnN0KSAhPSAwKSB7CisJCWJiX3BlcnJvcl9tc2coInN0YXQgJXMiLCBuYW1lKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSAmJiBncC0+cmVjdXJzaXZlKQorCQlyZXR1cm47CisKKwkvKiBEb24ndCB0cnkgdG8gb3BlbiBkZXZpY2UgZmlsZXMsIGZpZm9zIGV0Yy4gIFdlIHByb2JhYmx5CisJICogb3VnaHQgdG8gZGlzcGxheSBhbiBlcnJvciBpZiB0aGUgZmlsZSB3YXMgZXhwbGljaXRseSBnaXZlbgorCSAqIG9uIHRoZSBjb21tYW5kIGxpbmUgKHdoZXRoZXIgb3Igbm90IHJlY3Vyc2l2ZSB3YXMKKwkgKiByZXF1ZXN0ZWQpLiAgKi8KKwlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkgJiYgIVNfSVNMTksoc3Quc3RfbW9kZSkgJiYgIVNfSVNESVIoc3Quc3RfbW9kZSkpCisJCXJldHVybjsKKworCWlmIChncC0+ZmxhZ3MgJiBPUFRfU0VUX1ZFUikKKwkJaWYgKGZzZXR2ZXJzaW9uKG5hbWUsIGdwLT52ZXJzaW9uKSAhPSAwKQorCQkJYmJfcGVycm9yX21zZygic2V0dGluZyB2ZXJzaW9uIG9uICVzIiwgbmFtZSk7CisKKwlpZiAoZ3AtPmZsYWdzICYgT1BUX1NFVCkgeworCQlmc2ZsYWdzID0gZ3AtPmFmOworCX0gZWxzZSB7CisJCWlmIChmZ2V0ZmxhZ3MobmFtZSwgJmZzZmxhZ3MpICE9IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coInJlYWRpbmcgZmxhZ3Mgb24gJXMiLCBuYW1lKTsKKwkJCWdvdG8gc2tpcF9zZXRmbGFnczsKKwkJfQorCQkvKmlmIChncC0+ZmxhZ3MgJiBPUFRfUkVNKSAtIG5vdCBuZWVkZWQsIHJmIGlzIHplcm8gb3RoZXJ3aXNlICovCisJCQlmc2ZsYWdzICY9IH5ncC0+cmY7CisJCS8qaWYgKGdwLT5mbGFncyAmIE9QVF9BREQpIC0gbm90IG5lZWRlZCwgYWYgaXMgemVybyBvdGhlcndpc2UgKi8KKwkJCWZzZmxhZ3MgfD0gZ3AtPmFmOworCQkvKiBXaGF0IGlzIHRoaXM/IEFuZCB3aHkgaXQncyBub3QgZG9uZSBmb3IgU0VUIGNhc2U/ICovCisJCWlmICghU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCWZzZmxhZ3MgJj0gfkVYVDJfRElSU1lOQ19GTDsKKwl9CisJaWYgKGZzZXRmbGFncyhuYW1lLCBmc2ZsYWdzKSAhPSAwKQorCQliYl9wZXJyb3JfbXNnKCJzZXR0aW5nIGZsYWdzIG9uICVzIiwgbmFtZSk7CisKKyBza2lwX3NldGZsYWdzOgorCWlmIChncC0+cmVjdXJzaXZlICYmIFNfSVNESVIoc3Quc3RfbW9kZSkpCisJCWl0ZXJhdGVfb25fZGlyKG5hbWUsIGNoYXR0cl9kaXJfcHJvYywgZ3ApOworfQorCitpbnQgY2hhdHRyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaGF0dHJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnbG9iYWxzIGc7CisJY2hhciAqYXJnOworCisJbWVtc2V0KCZnLCAwLCBzaXplb2YoZykpOworCisJLyogcGFyc2UgdGhlIGFyZ3MgKi8KKwl3aGlsZSAoKGFyZyA9ICorK2FyZ3YpKSB7CisJCS8qIHRha2UgY2FyZSBvZiAtUiBhbmQgLXYgPHZlcnNpb24+ICovCisJCWlmIChhcmdbMF0gPT0gJy0nCisJCSAmJiAoYXJnWzFdID09ICdSJyB8fCBhcmdbMV0gPT0gJ3YnKQorCQkgJiYgIWFyZ1syXQorCQkpIHsKKwkJCWlmIChhcmdbMV0gPT0gJ1InKSB7CisJCQkJZy5yZWN1cnNpdmUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogYXJnWzFdID09ICd2JyAqLworCQkJaWYgKCEqKythcmd2KQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWcudmVyc2lvbiA9IHhhdG91bCgqYXJndik7CisJCQlnLmZsYWdzIHw9IE9QVF9TRVRfVkVSOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWRlY29kZV9hcmcoYXJnLCAmZykpCisJCQlicmVhazsKKwl9CisKKwkvKiBydW4gc2FuaXR5IGNoZWNrcyBvbiBhbGwgdGhlIGFyZ3VtZW50cyBnaXZlbiB1cyAqLworCWlmICghKmFyZ3YpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAoKGcuZmxhZ3MgJiBPUFRfU0VUKSAmJiAoZy5mbGFncyAmIChPUFRfQUREfE9QVF9SRU0pKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIj0gaXMgaW5jb21wYXRpYmxlIHdpdGggLSBhbmQgKyIpOworCWlmIChnLnJmICYgZy5hZikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNldCBhbmQgdW5zZXQgYSBmbGFnIik7CisJaWYgKCFnLmZsYWdzKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibXVzdCB1c2UgJy12JywgPSwgLSBvciArIik7CisKKwkvKiBub3cgcnVuIGNoYXR0ciBvbiBhbGwgdGhlIGZpbGVzIHBhc3NlZCB0byB1cyAqLworCWRvIGNoYW5nZV9hdHRyaWJ1dGVzKCphcmd2LCAmZyk7IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvZTJmc19kZWZzLmggYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvZTJmc19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5NjQwZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9lMmZzX2RlZnMuaApAQCAtMCwwICsxLDU2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaWZuZGVmIExJTlVYX0VYVDJfRlNfSAorI2RlZmluZSBMSU5VWF9FWFQyX0ZTX0ggMQorCisvKgorICogU3BlY2lhbCBpbm9kZSBudW1iZXJzCisgKi8KKyNkZWZpbmUgRVhUMl9CQURfSU5PCQkgMQkvKiBCYWQgYmxvY2tzIGlub2RlICovCisjZGVmaW5lIEVYVDJfUk9PVF9JTk8JCSAyCS8qIFJvb3QgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9BQ0xfSURYX0lOTwkgMwkvKiBBQ0wgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9BQ0xfREFUQV9JTk8JIDQJLyogQUNMIGlub2RlICovCisjZGVmaW5lIEVYVDJfQk9PVF9MT0FERVJfSU5PCSA1CS8qIEJvb3QgbG9hZGVyIGlub2RlICovCisjZGVmaW5lIEVYVDJfVU5ERUxfRElSX0lOTwkgNgkvKiBVbmRlbGV0ZSBkaXJlY3RvcnkgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9SRVNJWkVfSU5PCQkgNwkvKiBSZXNlcnZlZCBncm91cCBkZXNjcmlwdG9ycyBpbm9kZSAqLworI2RlZmluZSBFWFQyX0pPVVJOQUxfSU5PCSA4CS8qIEpvdXJuYWwgaW5vZGUgKi8KKworLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlIGZvciBvbGQgZXh0MiBmaWxlc3lzdGVtcyAqLworI2RlZmluZSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTwkxMQorCisvKgorICogVGhlIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBtYWdpYyBudW1iZXIKKyAqLworI2RlZmluZSBFWFQyX1NVUEVSX01BR0lDCTB4RUY1MworCisvKiBBc3N1bWUgdGhhdCB1c2VyIG1vZGUgcHJvZ3JhbXMgYXJlIHBhc3NpbmcgaW4gYW4gZXh0MmZzIHN1cGVyYmxvY2ssIG5vdAorICogYSBrZXJuZWwgc3RydWN0IHN1cGVyX2Jsb2NrLiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNhbGwgdGhlIGZlYXR1cmUtdGVzdAorICogbWFjcm9zIGZyb20gdXNlciBsYW5kLiAqLworI2RlZmluZSBFWFQyX1NCKHNiKQkoc2IpCisKKy8qCisgKiBNYXhpbWFsIGNvdW50IG9mIGxpbmtzIHRvIGEgZmlsZQorICovCisjZGVmaW5lIEVYVDJfTElOS19NQVgJCTMyMDAwCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2Ugc2V2ZXJhbCBibG9jayBzaXplcworICovCisjZGVmaW5lIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFCQkxMAkvKiAxMDI0ICovCisjZGVmaW5lIEVYVDJfTUFYX0JMT0NLX0xPR19TSVpFCQkxNgkvKiA2NTUzNiAqLworI2RlZmluZSBFWFQyX01JTl9CTE9DS19TSVpFCSgxIDw8IEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKQorI2RlZmluZSBFWFQyX01BWF9CTE9DS19TSVpFCSgxIDw8IEVYVDJfTUFYX0JMT0NLX0xPR19TSVpFKQorI2RlZmluZSBFWFQyX0JMT0NLX1NJWkUocykJKEVYVDJfTUlOX0JMT0NLX1NJWkUgPDwgKHMpLT5zX2xvZ19ibG9ja19zaXplKQorI2RlZmluZSBFWFQyX0JMT0NLX1NJWkVfQklUUyhzKQkoKHMpLT5zX2xvZ19ibG9ja19zaXplICsgMTApCisjZGVmaW5lIEVYVDJfSU5PREVfU0laRShzKQkoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYpID8gXAorCQkJCSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUgOiAocyktPnNfaW5vZGVfc2l6ZSkKKyNkZWZpbmUgRVhUMl9GSVJTVF9JTk8ocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8gOiAocyktPnNfZmlyc3RfaW5vKQorI2RlZmluZSBFWFQyX0FERFJfUEVSX0JMT0NLKHMpCShFWFQyX0JMT0NLX1NJWkUocykgLyBzaXplb2YodWludDMyX3QpKQorCisvKgorICogTWFjcm8taW5zdHJ1Y3Rpb25zIHVzZWQgdG8gbWFuYWdlIGZyYWdtZW50cworICovCisjZGVmaW5lIEVYVDJfTUlOX0ZSQUdfU0laRQkJRVhUMl9NSU5fQkxPQ0tfU0laRQorI2RlZmluZSBFWFQyX01BWF9GUkFHX1NJWkUJCUVYVDJfTUFYX0JMT0NLX1NJWkUKKyNkZWZpbmUgRVhUMl9NSU5fRlJBR19MT0dfU0laRQkJRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUKKyNkZWZpbmUgRVhUMl9GUkFHX1NJWkUocykJCShFWFQyX01JTl9GUkFHX1NJWkUgPDwgKHMpLT5zX2xvZ19mcmFnX3NpemUpCisjZGVmaW5lIEVYVDJfRlJBR1NfUEVSX0JMT0NLKHMpCQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gRVhUMl9GUkFHX1NJWkUocykpCisKKy8qCisgKiBBQ0wgc3RydWN0dXJlcworICovCitzdHJ1Y3QgZXh0Ml9hY2xfaGVhZGVyIHsJLyogSGVhZGVyIG9mIEFjY2VzcyBDb250cm9sIExpc3RzICovCisJdWludDMyX3QJYWNsaF9zaXplOworCXVpbnQzMl90CWFjbGhfZmlsZV9jb3VudDsKKwl1aW50MzJfdAlhY2xoX2FjbGVfY291bnQ7CisJdWludDMyX3QJYWNsaF9maXJzdF9hY2xlOworfTsKKworc3RydWN0IGV4dDJfYWNsX2VudHJ5IHsJLyogQWNjZXNzIENvbnRyb2wgTGlzdCBFbnRyeSAqLworCXVpbnQzMl90CWFjbGVfc2l6ZTsKKwl1aW50MTZfdAlhY2xlX3Blcm1zOwkvKiBBY2Nlc3MgcGVybWlzc2lvbnMgKi8KKwl1aW50MTZfdAlhY2xlX3R5cGU7CS8qIFR5cGUgb2YgZW50cnkgKi8KKwl1aW50MTZfdAlhY2xlX3RhZzsJLyogVXNlciBvciBncm91cCBpZGVudGl0eSAqLworCXVpbnQxNl90CWFjbGVfcGFkMTsKKwl1aW50MzJfdAlhY2xlX25leHQ7CS8qIFBvaW50ZXIgb24gbmV4dCBlbnRyeSBmb3IgdGhlICovCisJCQkJCS8qIHNhbWUgaW5vZGUgb3Igb24gbmV4dCBmcmVlIGVudHJ5ICovCit9OworCisvKgorICogU3RydWN0dXJlIG9mIGEgYmxvY2tzIGdyb3VwIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyB7CisJdWludDMyX3QJYmdfYmxvY2tfYml0bWFwOwkvKiBCbG9ja3MgYml0bWFwIGJsb2NrICovCisJdWludDMyX3QJYmdfaW5vZGVfYml0bWFwOwkvKiBJbm9kZXMgYml0bWFwIGJsb2NrICovCisJdWludDMyX3QJYmdfaW5vZGVfdGFibGU7CQkvKiBJbm9kZXMgdGFibGUgYmxvY2sgKi8KKwl1aW50MTZfdAliZ19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwl1aW50MTZfdAliZ19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KKwl1aW50MTZfdAliZ191c2VkX2RpcnNfY291bnQ7CS8qIERpcmVjdG9yaWVzIGNvdW50ICovCisJdWludDE2X3QJYmdfcGFkOworCXVpbnQzMl90CWJnX3Jlc2VydmVkWzNdOworfTsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBkaXJlY3RvcnkgaW5kZXhpbmcgZmVhdHVyZQorICoKKyAqIE5vdGU6IGFsbCBvZiB0aGUgbXVsdGlieXRlIGludGVnZXIgZmllbGRzIGFyZSBsaXR0bGUgZW5kaWFuLgorICovCisKKy8qCisgKiBOb3RlOiBkeF9yb290X2luZm8gaXMgbGFpZCBvdXQgc28gdGhhdCBpZiBpdCBzaG91bGQgc29tZWhvdyBnZXQKKyAqIG92ZXJsYWlkIGJ5IGEgZGlyZW50IHRoZSB0d28gbG93IGJpdHMgb2YgdGhlIGhhc2ggdmVyc2lvbiB3aWxsIGJlCisgKiB6ZXJvLiAgVGhlcmVmb3JlLCB0aGUgaGFzaCB2ZXJzaW9uIG1vZCA0IHNob3VsZCBuZXZlciBiZSAwLgorICogU2luY2VyZWx5LCB0aGUgcGFyYW5vaWEgZGVwYXJ0bWVudC4KKyAqLworc3RydWN0IGV4dDJfZHhfcm9vdF9pbmZvIHsKKwl1aW50MzJfdAlyZXNlcnZlZF96ZXJvOworCXVpbnQ4X3QJCWhhc2hfdmVyc2lvbjsgLyogMCBub3csIDEgYXQgcmVsZWFzZSAqLworCXVpbnQ4X3QJCWluZm9fbGVuZ3RoOyAvKiA4ICovCisJdWludDhfdAkJaW5kaXJlY3RfbGV2ZWxzOworCXVpbnQ4X3QJCXVudXNlZF9mbGFnczsKK307CisKKyNkZWZpbmUgRVhUMl9IQVNIX0xFR0FDWQkwCisjZGVmaW5lIEVYVDJfSEFTSF9IQUxGX01ENAkxCisjZGVmaW5lIEVYVDJfSEFTSF9URUEJCTIKKworI2RlZmluZSBFWFQyX0hBU0hfRkxBR19JTkNPTVBBVAkweDEKKworc3RydWN0IGV4dDJfZHhfZW50cnkgeworCXVpbnQzMl90IGhhc2g7CisJdWludDMyX3QgYmxvY2s7Cit9OworCitzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0IHsKKwl1aW50MTZfdCBsaW1pdDsKKwl1aW50MTZfdCBjb3VudDsKK307CisKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBncm91cCBkZXNjcmlwdG9ycworICovCisjZGVmaW5lIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzKQkoRVhUMl9TQihzKS0+c19ibG9ja3NfcGVyX2dyb3VwKQorI2RlZmluZSBFWFQyX0lOT0RFU19QRVJfR1JPVVAocykJKEVYVDJfU0IocyktPnNfaW5vZGVzX3Blcl9ncm91cCkKKyNkZWZpbmUgRVhUMl9JTk9ERVNfUEVSX0JMT0NLKHMpCShFWFQyX0JMT0NLX1NJWkUocykvRVhUMl9JTk9ERV9TSVpFKHMpKQorLyogbGltaXRzIGltcG9zZWQgYnkgMTYtYml0IHZhbHVlIGdkX2ZyZWVfe2Jsb2Nrcyxpbm9kZX1fY291bnQgKi8KKyNkZWZpbmUgRVhUMl9NQVhfQkxPQ0tTX1BFUl9HUk9VUChzKQkoKDEgPDwgMTYpIC0gOCkKKyNkZWZpbmUgRVhUMl9NQVhfSU5PREVTX1BFUl9HUk9VUChzKQkoKDEgPDwgMTYpIC0gRVhUMl9JTk9ERVNfUEVSX0JMT0NLKHMpKQorI2RlZmluZSBFWFQyX0RFU0NfUEVSX0JMT0NLKHMpCQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKSkKKworLyoKKyAqIENvbnN0YW50cyByZWxhdGl2ZSB0byB0aGUgZGF0YSBibG9ja3MKKyAqLworI2RlZmluZSBFWFQyX05ESVJfQkxPQ0tTCQkxMgorI2RlZmluZSBFWFQyX0lORF9CTE9DSwkJCUVYVDJfTkRJUl9CTE9DS1MKKyNkZWZpbmUgRVhUMl9ESU5EX0JMT0NLCQkJKEVYVDJfSU5EX0JMT0NLICsgMSkKKyNkZWZpbmUgRVhUMl9USU5EX0JMT0NLCQkJKEVYVDJfRElORF9CTE9DSyArIDEpCisjZGVmaW5lIEVYVDJfTl9CTE9DS1MJCQkoRVhUMl9USU5EX0JMT0NLICsgMSkKKworLyoKKyAqIElub2RlIGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9TRUNSTV9GTAkJCTB4MDAwMDAwMDEgLyogU2VjdXJlIGRlbGV0aW9uICovCisjZGVmaW5lIEVYVDJfVU5STV9GTAkJCTB4MDAwMDAwMDIgLyogVW5kZWxldGUgKi8KKyNkZWZpbmUgRVhUMl9DT01QUl9GTAkJCTB4MDAwMDAwMDQgLyogQ29tcHJlc3MgZmlsZSAqLworI2RlZmluZSBFWFQyX1NZTkNfRkwJCQkweDAwMDAwMDA4IC8qIFN5bmNocm9ub3VzIHVwZGF0ZXMgKi8KKyNkZWZpbmUgRVhUMl9JTU1VVEFCTEVfRkwJCTB4MDAwMDAwMTAgLyogSW1tdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9BUFBFTkRfRkwJCQkweDAwMDAwMDIwIC8qIHdyaXRlcyB0byBmaWxlIG1heSBvbmx5IGFwcGVuZCAqLworI2RlZmluZSBFWFQyX05PRFVNUF9GTAkJCTB4MDAwMDAwNDAgLyogZG8gbm90IGR1bXAgZmlsZSAqLworI2RlZmluZSBFWFQyX05PQVRJTUVfRkwJCQkweDAwMDAwMDgwIC8qIGRvIG5vdCB1cGRhdGUgYXRpbWUgKi8KKy8qIFJlc2VydmVkIGZvciBjb21wcmVzc2lvbiB1c2FnZS4uLiAqLworI2RlZmluZSBFWFQyX0RJUlRZX0ZMCQkJMHgwMDAwMDEwMAorI2RlZmluZSBFWFQyX0NPTVBSQkxLX0ZMCQkweDAwMDAwMjAwIC8qIE9uZSBvciBtb3JlIGNvbXByZXNzZWQgY2x1c3RlcnMgKi8KKyNkZWZpbmUgRVhUMl9OT0NPTVBSX0ZMCQkJMHgwMDAwMDQwMCAvKiBBY2Nlc3MgcmF3IGNvbXByZXNzZWQgZGF0YSAqLworI2RlZmluZSBFWFQyX0VDT01QUl9GTAkJCTB4MDAwMDA4MDAgLyogQ29tcHJlc3Npb24gZXJyb3IgKi8KKy8qIEVuZCBjb21wcmVzc2lvbiBmbGFncyAtLS0gbWF5YmUgbm90IGFsbCB1c2VkICovCisjZGVmaW5lIEVYVDJfQlRSRUVfRkwJCQkweDAwMDAxMDAwIC8qIGJ0cmVlIGZvcm1hdCBkaXIgKi8KKyNkZWZpbmUgRVhUMl9JTkRFWF9GTAkJCTB4MDAwMDEwMDAgLyogaGFzaC1pbmRleGVkIGRpcmVjdG9yeSAqLworI2RlZmluZSBFWFQyX0lNQUdJQ19GTAkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRVhUM19KT1VSTkFMX0RBVEFfRkwJCTB4MDAwMDQwMDAgLyogZmlsZSBkYXRhIHNob3VsZCBiZSBqb3VybmFsZWQgKi8KKyNkZWZpbmUgRVhUMl9OT1RBSUxfRkwJCQkweDAwMDA4MDAwIC8qIGZpbGUgdGFpbCBzaG91bGQgbm90IGJlIG1lcmdlZCAqLworI2RlZmluZSBFWFQyX0RJUlNZTkNfRkwJCQkweDAwMDEwMDAwIC8qIFN5bmNocm9ub3VzIGRpcmVjdG9yeSBtb2RpZmljYXRpb25zICovCisjZGVmaW5lIEVYVDJfVE9QRElSX0ZMCQkJMHgwMDAyMDAwMCAvKiBUb3Agb2YgZGlyZWN0b3J5IGhpZXJhcmNoaWVzKi8KKyNkZWZpbmUgRVhUM19FWFRFTlRTX0ZMCQkJMHgwMDA4MDAwMCAvKiBJbm9kZSB1c2VzIGV4dGVudHMgKi8KKyNkZWZpbmUgRVhUMl9SRVNFUlZFRF9GTAkJMHg4MDAwMDAwMCAvKiByZXNlcnZlZCBmb3IgZXh0MiBsaWIgKi8KKworI2RlZmluZSBFWFQyX0ZMX1VTRVJfVklTSUJMRQkJMHgwMDAzREZGRiAvKiBVc2VyIHZpc2libGUgZmxhZ3MgKi8KKyNkZWZpbmUgRVhUMl9GTF9VU0VSX01PRElGSUFCTEUJCTB4MDAwMDgwRkYgLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcworICovCisjZGVmaW5lIEVYVDJfSU9DX0dFVEZMQUdTCQlfSU9SKCdmJywgMSwgbG9uZykKKyNkZWZpbmUgRVhUMl9JT0NfU0VURkxBR1MJCV9JT1coJ2YnLCAyLCBsb25nKQorI2RlZmluZSBFWFQyX0lPQ19HRVRWRVJTSU9OCQlfSU9SKCd2JywgMSwgbG9uZykKKyNkZWZpbmUgRVhUMl9JT0NfU0VUVkVSU0lPTgkJX0lPVygndicsIDIsIGxvbmcpCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYW4gaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDJfaW5vZGUgeworCXVpbnQxNl90CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCXVpbnQxNl90CWlfdWlkOwkJLyogTG93IDE2IGJpdHMgb2YgT3duZXIgVWlkICovCisJdWludDMyX3QJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCXVpbnQzMl90CWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJdWludDMyX3QJaV9jdGltZTsJLyogQ3JlYXRpb24gdGltZSAqLworCXVpbnQzMl90CWlfbXRpbWU7CS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisJdWludDMyX3QJaV9kdGltZTsJLyogRGVsZXRpb24gVGltZSAqLworCXVpbnQxNl90CWlfZ2lkOwkJLyogTG93IDE2IGJpdHMgb2YgR3JvdXAgSWQgKi8KKwl1aW50MTZfdAlpX2xpbmtzX2NvdW50OwkvKiBMaW5rcyBjb3VudCAqLworCXVpbnQzMl90CWlfYmxvY2tzOwkvKiBCbG9ja3MgY291bnQgKi8KKwl1aW50MzJfdAlpX2ZsYWdzOwkvKiBGaWxlIGZsYWdzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIGxfaV9yZXNlcnZlZDE7CisJCX0gbGludXgxOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIGhfaV90cmFuc2xhdG9yOworCQl9IGh1cmQxOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIG1faV9yZXNlcnZlZDE7CisJCX0gbWFzaXgxOworCX0gb3NkMTsJCQkJLyogT1MgZGVwZW5kZW50IDEgKi8KKwl1aW50MzJfdAlpX2Jsb2NrW0VYVDJfTl9CTE9DS1NdOy8qIFBvaW50ZXJzIHRvIGJsb2NrcyAqLworCXVpbnQzMl90CWlfZ2VuZXJhdGlvbjsJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworCXVpbnQzMl90CWlfZmlsZV9hY2w7CS8qIEZpbGUgQUNMICovCisJdWludDMyX3QJaV9kaXJfYWNsOwkvKiBEaXJlY3RvcnkgQUNMICovCisJdWludDMyX3QJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QJCWxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCXVpbnQ4X3QJCWxfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJdWludDE2X3QJaV9wYWQxOworCQkJdWludDE2X3QJbF9pX3VpZF9oaWdoOwkvKiB0aGVzZSAyIGZpZWxkcyAgICAqLworCQkJdWludDE2X3QJbF9pX2dpZF9oaWdoOwkvKiB3ZXJlIHJlc2VydmVkMlswXSAqLworCQkJdWludDMyX3QJbF9pX3Jlc2VydmVkMjsKKwkJfSBsaW51eDI7CisJCXN0cnVjdCB7CisJCQl1aW50OF90CQloX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQl1aW50OF90CQloX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCXVpbnQxNl90CWhfaV9tb2RlX2hpZ2g7CisJCQl1aW50MTZfdAloX2lfdWlkX2hpZ2g7CisJCQl1aW50MTZfdAloX2lfZ2lkX2hpZ2g7CisJCQl1aW50MzJfdAloX2lfYXV0aG9yOworCQl9IGh1cmQyOworCQlzdHJ1Y3QgeworCQkJdWludDhfdAkJbV9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJdWludDhfdAkJbV9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQl1aW50MTZfdAltX3BhZDE7CisJCQl1aW50MzJfdAltX2lfcmVzZXJ2ZWQyWzJdOworCQl9IG1hc2l4MjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCit9OworCisvKgorICogUGVybWFuZW50IHBhcnQgb2YgYW4gbGFyZ2UgaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgeworCXVpbnQxNl90CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCXVpbnQxNl90CWlfdWlkOwkJLyogTG93IDE2IGJpdHMgb2YgT3duZXIgVWlkICovCisJdWludDMyX3QJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCXVpbnQzMl90CWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJdWludDMyX3QJaV9jdGltZTsJLyogQ3JlYXRpb24gdGltZSAqLworCXVpbnQzMl90CWlfbXRpbWU7CS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisJdWludDMyX3QJaV9kdGltZTsJLyogRGVsZXRpb24gVGltZSAqLworCXVpbnQxNl90CWlfZ2lkOwkJLyogTG93IDE2IGJpdHMgb2YgR3JvdXAgSWQgKi8KKwl1aW50MTZfdAlpX2xpbmtzX2NvdW50OwkvKiBMaW5rcyBjb3VudCAqLworCXVpbnQzMl90CWlfYmxvY2tzOwkvKiBCbG9ja3MgY291bnQgKi8KKwl1aW50MzJfdAlpX2ZsYWdzOwkvKiBGaWxlIGZsYWdzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIGxfaV9yZXNlcnZlZDE7CisJCX0gbGludXgxOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIGhfaV90cmFuc2xhdG9yOworCQl9IGh1cmQxOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIG1faV9yZXNlcnZlZDE7CisJCX0gbWFzaXgxOworCX0gb3NkMTsJCQkJLyogT1MgZGVwZW5kZW50IDEgKi8KKwl1aW50MzJfdAlpX2Jsb2NrW0VYVDJfTl9CTE9DS1NdOy8qIFBvaW50ZXJzIHRvIGJsb2NrcyAqLworCXVpbnQzMl90CWlfZ2VuZXJhdGlvbjsJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworCXVpbnQzMl90CWlfZmlsZV9hY2w7CS8qIEZpbGUgQUNMICovCisJdWludDMyX3QJaV9kaXJfYWNsOwkvKiBEaXJlY3RvcnkgQUNMICovCisJdWludDMyX3QJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QJCWxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCXVpbnQ4X3QJCWxfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJdWludDE2X3QJaV9wYWQxOworCQkJdWludDE2X3QJbF9pX3VpZF9oaWdoOwkvKiB0aGVzZSAyIGZpZWxkcyAgICAqLworCQkJdWludDE2X3QJbF9pX2dpZF9oaWdoOwkvKiB3ZXJlIHJlc2VydmVkMlswXSAqLworCQkJdWludDMyX3QJbF9pX3Jlc2VydmVkMjsKKwkJfSBsaW51eDI7CisJCXN0cnVjdCB7CisJCQl1aW50OF90CQloX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQl1aW50OF90CQloX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCXVpbnQxNl90CWhfaV9tb2RlX2hpZ2g7CisJCQl1aW50MTZfdAloX2lfdWlkX2hpZ2g7CisJCQl1aW50MTZfdAloX2lfZ2lkX2hpZ2g7CisJCQl1aW50MzJfdAloX2lfYXV0aG9yOworCQl9IGh1cmQyOworCQlzdHJ1Y3QgeworCQkJdWludDhfdAkJbV9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJdWludDhfdAkJbV9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQl1aW50MTZfdAltX3BhZDE7CisJCQl1aW50MzJfdAltX2lfcmVzZXJ2ZWQyWzJdOworCQl9IG1hc2l4MjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCisJdWludDE2X3QJaV9leHRyYV9pc2l6ZTsKKwl1aW50MTZfdAlpX3BhZDE7Cit9OworCisjZGVmaW5lIGlfc2l6ZV9oaWdoCWlfZGlyX2FjbAorCisvKgorICogRmlsZSBzeXN0ZW0gc3RhdGVzCisgKi8KKyNkZWZpbmUgRVhUMl9WQUxJRF9GUwkJCTB4MDAwMQkvKiBVbm1vdW50ZWQgY2xlYW5seSAqLworI2RlZmluZSBFWFQyX0VSUk9SX0ZTCQkJMHgwMDAyCS8qIEVycm9ycyBkZXRlY3RlZCAqLworCisvKgorICogTW91bnQgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQyX01PVU5UX0NIRUNLCQkweDAwMDEJLyogRG8gbW91bnQtdGltZSBjaGVja3MgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9HUlBJRAkJMHgwMDA0CS8qIENyZWF0ZSBmaWxlcyB3aXRoIGRpcmVjdG9yeSdzIGdyb3VwICovCisjZGVmaW5lIEVYVDJfTU9VTlRfREVCVUcJCTB4MDAwOAkvKiBTb21lIGRlYnVnZ2luZyBtZXNzYWdlcyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19DT05UCQkweDAwMTAJLyogQ29udGludWUgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1JPCQkweDAwMjAJLyogUmVtb3VudCBmcyBybyBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfUEFOSUMJCTB4MDA0MAkvKiBQYW5pYyBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9NSU5JWF9ERgkJMHgwMDgwCS8qIE1pbWljcyB0aGUgTWluaXggc3RhdGZzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTk9fVUlEMzIJCTB4MDIwMCAgLyogRGlzYWJsZSAzMi1iaXQgVUlEcyAqLworCisjZGVmaW5lIGNsZWFyX29wdChvLCBvcHQpCQlvICY9IH5FWFQyX01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQobywgb3B0KQkJCW8gfD0gRVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSB0ZXN0X29wdChzYiwgb3B0KQkJKEVYVDJfU0Ioc2IpLT5zX21vdW50X29wdCAmIFwKKwkJCQkJIEVYVDJfTU9VTlRfIyNvcHQpCisvKgorICogTWF4aW1hbCBtb3VudCBjb3VudHMgYmV0d2VlbiB0d28gZmlsZXN5c3RlbSBjaGVja3MKKyAqLworI2RlZmluZSBFWFQyX0RGTF9NQVhfTU5UX0NPVU5UCQkyMAkvKiBBbGxvdyAyMCBtb3VudHMgKi8KKyNkZWZpbmUgRVhUMl9ERkxfQ0hFQ0tJTlRFUlZBTAkJMAkvKiBEb24ndCB1c2UgaW50ZXJ2YWwgY2hlY2sgKi8KKworLyoKKyAqIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMKKyAqLworI2RlZmluZSBFWFQyX0VSUk9SU19DT05USU5VRQkJMQkvKiBDb250aW51ZSBleGVjdXRpb24gKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfUk8JCQkyCS8qIFJlbW91bnQgZnMgcmVhZC1vbmx5ICovCisjZGVmaW5lIEVYVDJfRVJST1JTX1BBTklDCQkzCS8qIFBhbmljICovCisjZGVmaW5lIEVYVDJfRVJST1JTX0RFRkFVTFQJCUVYVDJfRVJST1JTX0NPTlRJTlVFCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHN1cGVyIGJsb2NrCisgKi8KK3N0cnVjdCBleHQyX3N1cGVyX2Jsb2NrIHsKKwl1aW50MzJfdAlzX2lub2Rlc19jb3VudDsJCS8qIElub2RlcyBjb3VudCAqLworCXVpbnQzMl90CXNfYmxvY2tzX2NvdW50OwkJLyogQmxvY2tzIGNvdW50ICovCisJdWludDMyX3QJc19yX2Jsb2Nrc19jb3VudDsJLyogUmVzZXJ2ZWQgYmxvY2tzIGNvdW50ICovCisJdWludDMyX3QJc19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwl1aW50MzJfdAlzX2ZyZWVfaW5vZGVzX2NvdW50OwkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCXVpbnQzMl90CXNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLworCXVpbnQzMl90CXNfbG9nX2Jsb2NrX3NpemU7CS8qIEJsb2NrIHNpemUgKi8KKwlpbnQzMl90CQlzX2xvZ19mcmFnX3NpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwl1aW50MzJfdAlzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCXVpbnQzMl90CXNfZnJhZ3NfcGVyX2dyb3VwOwkvKiAjIEZyYWdtZW50cyBwZXIgZ3JvdXAgKi8KKwl1aW50MzJfdAlzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLworCXVpbnQzMl90CXNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisJdWludDMyX3QJc193dGltZTsJCS8qIFdyaXRlIHRpbWUgKi8KKwl1aW50MTZfdAlzX21udF9jb3VudDsJCS8qIE1vdW50IGNvdW50ICovCisJaW50MTZfdAkJc19tYXhfbW50X2NvdW50OwkvKiBNYXhpbWFsIG1vdW50IGNvdW50ICovCisJdWludDE2X3QJc19tYWdpYzsJCS8qIE1hZ2ljIHNpZ25hdHVyZSAqLworCXVpbnQxNl90CXNfc3RhdGU7CQkvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworCXVpbnQxNl90CXNfZXJyb3JzOwkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCXVpbnQxNl90CXNfbWlub3JfcmV2X2xldmVsOwkvKiBtaW5vciByZXZpc2lvbiBsZXZlbCAqLworCXVpbnQzMl90CXNfbGFzdGNoZWNrOwkJLyogdGltZSBvZiBsYXN0IGNoZWNrICovCisJdWludDMyX3QJc19jaGVja2ludGVydmFsOwkvKiBtYXguIHRpbWUgYmV0d2VlbiBjaGVja3MgKi8KKwl1aW50MzJfdAlzX2NyZWF0b3Jfb3M7CQkvKiBPUyAqLworCXVpbnQzMl90CXNfcmV2X2xldmVsOwkJLyogUmV2aXNpb24gbGV2ZWwgKi8KKwl1aW50MTZfdAlzX2RlZl9yZXN1aWQ7CQkvKiBEZWZhdWx0IHVpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJdWludDE2X3QJc19kZWZfcmVzZ2lkOwkJLyogRGVmYXVsdCBnaWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBmb3IgRVhUMl9EWU5BTUlDX1JFViBzdXBlcmJsb2NrcyBvbmx5LgorCSAqCisJICogTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGF0aWJsZSBmZWF0dXJlIHNldCBhbmQKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IGlzIHRoYXQgaWYgdGhlcmUgaXMgYSBiaXQgc2V0CisJICogaW4gdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIGtub3cgYWJvdXQsIGl0IHNob3VsZCByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0uCisJICoKKwkgKiBlMmZzY2sncyByZXF1aXJlbWVudHMgYXJlIG1vcmUgc3RyaWN0OyBpZiBpdCBkb2Vzbid0IGtub3cKKwkgKiBhYm91dCBhIGZlYXR1cmUgaW4gZWl0aGVyIHRoZSBjb21wYXRpYmxlIG9yIGluY29tcGF0aWJsZQorCSAqIGZlYXR1cmUgc2V0LCBpdCBtdXN0IGFib3J0IGFuZCBub3QgdHJ5IHRvIG1lZGRsZSB3aXRoCisJICogdGhpbmdzIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZC4uLgorCSAqLworCXVpbnQzMl90CXNfZmlyc3RfaW5vOwkJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisJdWludDE2X3QJc19pbm9kZV9zaXplOwkJLyogc2l6ZSBvZiBpbm9kZSBzdHJ1Y3R1cmUgKi8KKwl1aW50MTZfdAlzX2Jsb2NrX2dyb3VwX25yOwkvKiBibG9jayBncm91cCAjIG9mIHRoaXMgc3VwZXJibG9jayAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9jb21wYXQ7CS8qIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwl1aW50MzJfdAlzX2ZlYXR1cmVfaW5jb21wYXQ7CS8qIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9yb19jb21wYXQ7CS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwl1aW50OF90CQlzX3V1aWRbMTZdOwkJLyogMTI4LWJpdCB1dWlkIGZvciB2b2x1bWUgKi8KKwljaGFyCQlzX3ZvbHVtZV9uYW1lWzE2XTsJLyogdm9sdW1lIG5hbWUgKi8KKwljaGFyCQlzX2xhc3RfbW91bnRlZFs2NF07CS8qIGRpcmVjdG9yeSB3aGVyZSBsYXN0IG1vdW50ZWQgKi8KKwl1aW50MzJfdAlzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7IC8qIEZvciBjb21wcmVzc2lvbiAqLworCS8qCisJICogUGVyZm9ybWFuY2UgaGludHMuICBEaXJlY3RvcnkgcHJlYWxsb2NhdGlvbiBzaG91bGQgb25seQorCSAqIGhhcHBlbiBpZiB0aGUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MgZmxhZyBpcyBvbi4KKwkgKi8KKwl1aW50OF90CXNfcHJlYWxsb2NfYmxvY2tzOwkvKiBOciBvZiBibG9ja3MgdG8gdHJ5IHRvIHByZWFsbG9jYXRlKi8KKwl1aW50OF90CXNfcHJlYWxsb2NfZGlyX2Jsb2NrczsJLyogTnIgdG8gcHJlYWxsb2NhdGUgZm9yIGRpcnMgKi8KKwl1aW50MTZfdAlzX3Jlc2VydmVkX2dkdF9ibG9ja3M7CS8qIFBlciBncm91cCB0YWJsZSBmb3Igb25saW5lIGdyb3d0aCAqLworCS8qCisJICogSm91cm5hbGluZyBzdXBwb3J0IHZhbGlkIGlmIEVYVDJfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgc2V0LgorCSAqLworCXVpbnQ4X3QJCXNfam91cm5hbF91dWlkWzE2XTsJLyogdXVpZCBvZiBqb3VybmFsIHN1cGVyYmxvY2sgKi8KKwl1aW50MzJfdAlzX2pvdXJuYWxfaW51bTsJCS8qIGlub2RlIG51bWJlciBvZiBqb3VybmFsIGZpbGUgKi8KKwl1aW50MzJfdAlzX2pvdXJuYWxfZGV2OwkJLyogZGV2aWNlIG51bWJlciBvZiBqb3VybmFsIGZpbGUgKi8KKwl1aW50MzJfdAlzX2xhc3Rfb3JwaGFuOwkJLyogc3RhcnQgb2YgbGlzdCBvZiBpbm9kZXMgdG8gZGVsZXRlICovCisJdWludDMyX3QJc19oYXNoX3NlZWRbNF07CQkvKiBIVFJFRSBoYXNoIHNlZWQgKi8KKwl1aW50OF90CQlzX2RlZl9oYXNoX3ZlcnNpb247CS8qIERlZmF1bHQgaGFzaCB2ZXJzaW9uIHRvIHVzZSAqLworCXVpbnQ4X3QJCXNfam5sX2JhY2t1cF90eXBlOwkvKiBEZWZhdWx0IHR5cGUgb2Ygam91cm5hbCBiYWNrdXAgKi8KKwl1aW50MTZfdAlzX3Jlc2VydmVkX3dvcmRfcGFkOworCXVpbnQzMl90CXNfZGVmYXVsdF9tb3VudF9vcHRzOworCXVpbnQzMl90CXNfZmlyc3RfbWV0YV9iZzsJLyogRmlyc3QgbWV0YWJsb2NrIGdyb3VwICovCisJdWludDMyX3QJc19ta2ZzX3RpbWU7CQkvKiBXaGVuIHRoZSBmaWxlc3lzdGVtIHdhcyBjcmVhdGVkICovCisJdWludDMyX3QJc19qbmxfYmxvY2tzWzE3XTsJLyogQmFja3VwIG9mIHRoZSBqb3VybmFsIGlub2RlICovCisJdWludDMyX3QJc19yZXNlcnZlZFsxNzJdOwkvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCit9OworCisvKgorICogQ29kZXMgZm9yIG9wZXJhdGluZyBzeXN0ZW1zCisgKi8KKyNkZWZpbmUgRVhUMl9PU19MSU5VWAkJMAorI2RlZmluZSBFWFQyX09TX0hVUkQJCTEKKyNkZWZpbmUgRVhUMl9PU19NQVNJWAkJMgorI2RlZmluZSBFWFQyX09TX0ZSRUVCU0QJCTMKKyNkZWZpbmUgRVhUMl9PU19MSVRFUwkJNAorCisvKgorICogUmV2aXNpb24gbGV2ZWxzCisgKi8KKyNkZWZpbmUgRVhUMl9HT09EX09MRF9SRVYJMAkvKiBUaGUgZ29vZCBvbGQgKG9yaWdpbmFsKSBmb3JtYXQgKi8KKyNkZWZpbmUgRVhUMl9EWU5BTUlDX1JFVgkxCS8qIFYyIGZvcm1hdCB3LyBkeW5hbWljIGlub2RlIHNpemVzICovCisKKyNkZWZpbmUgRVhUMl9DVVJSRU5UX1JFVglFWFQyX0dPT0RfT0xEX1JFVgorI2RlZmluZSBFWFQyX01BWF9TVVBQX1JFVglFWFQyX0RZTkFNSUNfUkVWCisKKyNkZWZpbmUgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDEyOAorCisvKgorICogSm91cm5hbCBpbm9kZSBiYWNrdXAgdHlwZXMKKyAqLworI2RlZmluZSBFWFQzX0pOTF9CQUNLVVBfQkxPQ0tTCTEKKworLyoKKyAqIEZlYXR1cmUgc2V0IGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDJfU0Ioc2IpLT5zX2ZlYXR1cmVfY29tcGF0ICYgKG1hc2spICkKKyNkZWZpbmUgRVhUMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIChtYXNrKSApCisjZGVmaW5lIEVYVDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19mZWF0dXJlX2luY29tcGF0ICYgKG1hc2spICkKKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9QUkVBTExPQwkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9JTUFHSUNfSU5PREVTCTB4MDAwMgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMCQkweDAwMDQKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUgkJMHgwMDA4CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFCTB4MDAxMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWAkJMHgwMDIwCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIJMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRQkweDAwMDIKKy8qICNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIJMHgwMDA0IG5vdCB1c2VkICovCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTSU9OCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUJCTB4MDAwMgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUgkJMHgwMDA0IC8qIE5lZWRzIHJlY292ZXJ5ICovCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVgkweDAwMDggLyogSm91cm5hbCBkZXZpY2UgKi8KKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcJCTB4MDAxMAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUwkJMHgwMDQwCisKKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX1NVUFAJMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSfCBcCisJCQkJCSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEV8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSKQorCisvKgorICogRGVmYXVsdCB2YWx1ZXMgZm9yIHVzZXIgYW5kL29yIGdyb3VwIHVzaW5nIHJlc2VydmVkIGJsb2NrcworICovCisjZGVmaW5lIEVYVDJfREVGX1JFU1VJRAkJMAorI2RlZmluZSBFWFQyX0RFRl9SRVNHSUQJCTAKKworLyoKKyAqIERlZmF1bHQgbW91bnQgb3B0aW9ucworICovCisjZGVmaW5lIEVYVDJfREVGTV9ERUJVRwkJMHgwMDAxCisjZGVmaW5lIEVYVDJfREVGTV9CU0RHUk9VUFMJMHgwMDAyCisjZGVmaW5lIEVYVDJfREVGTV9YQVRUUl9VU0VSCTB4MDAwNAorI2RlZmluZSBFWFQyX0RFRk1fQUNMCQkweDAwMDgKKyNkZWZpbmUgRVhUMl9ERUZNX1VJRDE2CQkweDAwMTAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFCQkweDAwNjAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX0RBVEEJMHgwMDIwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9PUkRFUkVECTB4MDA0MAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfV0JBQ0sJMHgwMDYwCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBkaXJlY3RvcnkgZW50cnkKKyAqLworI2RlZmluZSBFWFQyX05BTUVfTEVOIDI1NQorCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgeworCXVpbnQzMl90CWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLworCXVpbnQxNl90CXJlY19sZW47CQkvKiBEaXJlY3RvcnkgZW50cnkgbGVuZ3RoICovCisJdWludDE2X3QJbmFtZV9sZW47CQkvKiBOYW1lIGxlbmd0aCAqLworCWNoYXIJCW5hbWVbRVhUMl9OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworfTsKKworLyoKKyAqIFRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5LiAgU2luY2UgRVhUMiBzdHJ1Y3R1cmVzIGFyZQorICogc3RvcmVkIGluIGludGVsIGJ5dGUgb3JkZXIsIGFuZCB0aGUgbmFtZV9sZW4gZmllbGQgY291bGQgbmV2ZXIgYmUKKyAqIGJpZ2dlciB0aGFuIDI1NSBjaGFycywgaXQncyBzYWZlIHRvIHJlY2xhaW0gdGhlIGV4dHJhIGJ5dGUgZm9yIHRoZQorICogZmlsZV90eXBlIGZpZWxkLgorICovCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiB7CisJdWludDMyX3QJaW5vZGU7CQkJLyogSW5vZGUgbnVtYmVyICovCisJdWludDE2X3QJcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKwl1aW50OF90CQluYW1lX2xlbjsJCS8qIE5hbWUgbGVuZ3RoICovCisJdWludDhfdAkJZmlsZV90eXBlOworCWNoYXIJCW5hbWVbRVhUMl9OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworfTsKKworLyoKKyAqIEV4dDIgZGlyZWN0b3J5IGZpbGUgdHlwZXMuICBPbmx5IHRoZSBsb3cgMyBiaXRzIGFyZSB1c2VkLiAgVGhlCisgKiBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBmb3Igbm93LgorICovCisjZGVmaW5lIEVYVDJfRlRfVU5LTk9XTgkJMAorI2RlZmluZSBFWFQyX0ZUX1JFR19GSUxFCTEKKyNkZWZpbmUgRVhUMl9GVF9ESVIJCTIKKyNkZWZpbmUgRVhUMl9GVF9DSFJERVYJCTMKKyNkZWZpbmUgRVhUMl9GVF9CTEtERVYJCTQKKyNkZWZpbmUgRVhUMl9GVF9GSUZPCQk1CisjZGVmaW5lIEVYVDJfRlRfU09DSwkJNgorI2RlZmluZSBFWFQyX0ZUX1NZTUxJTksJCTcKKworI2RlZmluZSBFWFQyX0ZUX01BWAkJOAorCisvKgorICogRVhUMl9ESVJfUEFEIGRlZmluZXMgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGJvdW5kYXJpZXMKKyAqCisgKiBOT1RFOiBJdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNAorICovCisjZGVmaW5lIEVYVDJfRElSX1BBRAkJCTQKKyNkZWZpbmUgRVhUMl9ESVJfUk9VTkQJCQkoRVhUMl9ESVJfUEFEIC0gMSkKKyNkZWZpbmUgRVhUMl9ESVJfUkVDX0xFTihuYW1lX2xlbikJKCgobmFtZV9sZW4pICsgOCArIEVYVDJfRElSX1JPVU5EKSAmIFwKKwkJCQkJIH5FWFQyX0RJUl9ST1VORCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvZTJmc19saWIuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9lMmZzX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YWVjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvZTJmc19saWIuYwpAQCAtMCwwICsxLDIxMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU2VlIFJFQURNRSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiZTJmc19saWIuaCIKKworI2RlZmluZSBIQVZFX0VYVDJfSU9DVExTIDEKKworI2lmIElOVF9NQVggPT0gTE9OR19NQVgKKyNkZWZpbmUgSUZfTE9OR19JU19TQU1FKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgSUZfTE9OR19JU19XSURFUiguLi4pCisjZWxzZQorI2RlZmluZSBJRl9MT05HX0lTX1NBTUUoLi4uKQorI2RlZmluZSBJRl9MT05HX0lTX1dJREVSKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjbG9zZV9zaWxlbnRseShpbnQgZmQpCit7CisJaW50IGUgPSBlcnJubzsKKwljbG9zZShmZCk7CisJZXJybm8gPSBlOworfQorCisKKy8qIEl0ZXJhdGUgYSBmdW5jdGlvbiBvbiBlYWNoIGVudHJ5IG9mIGEgZGlyZWN0b3J5ICovCitpbnQgaXRlcmF0ZV9vbl9kaXIoY29uc3QgY2hhciAqZGlyX25hbWUsCisJCWludCBGQVNUX0ZVTkMgKCpmdW5jKShjb25zdCBjaGFyICosIHN0cnVjdCBkaXJlbnQgKiwgdm9pZCAqKSwKKwkJdm9pZCAqcHJpdmF0ZSkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKworCWRpciA9IG9wZW5kaXIoZGlyX25hbWUpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQlyZXR1cm4gLTE7CisJfQorCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJZnVuYyhkaXJfbmFtZSwgZGUsIHByaXZhdGUpOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQorCisKKy8qIEdldC9zZXQgYSBmaWxlIHZlcnNpb24gb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLworaW50IGZnZXRzZXR2ZXJzaW9uKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKmdldF92ZXJzaW9uLCB1bnNpZ25lZCBsb25nIHNldF92ZXJzaW9uKQoreworI2lmIEhBVkVfRVhUMl9JT0NUTFMKKwlpbnQgZmQsIHI7CisJSUZfTE9OR19JU19XSURFUihpbnQgdmVyOykKKworCWZkID0gb3BlbihuYW1lLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmICghZ2V0X3ZlcnNpb24pIHsKKwkJSUZfTE9OR19JU19XSURFUigKKwkJCXZlciA9IChpbnQpIHNldF92ZXJzaW9uOworCQkJciA9IGlvY3RsKGZkLCBFWFQyX0lPQ19TRVRWRVJTSU9OLCAmdmVyKTsKKwkJKQorCQlJRl9MT05HX0lTX1NBTUUoCisJCQlyID0gaW9jdGwoZmQsIEVYVDJfSU9DX1NFVFZFUlNJT04sICh2b2lkKikmc2V0X3ZlcnNpb24pOworCQkpCisJfSBlbHNlIHsKKwkJSUZfTE9OR19JU19XSURFUigKKwkJCXIgPSBpb2N0bChmZCwgRVhUMl9JT0NfR0VUVkVSU0lPTiwgJnZlcik7CisJCQkqZ2V0X3ZlcnNpb24gPSB2ZXI7CisJCSkKKwkJSUZfTE9OR19JU19TQU1FKAorCQkJciA9IGlvY3RsKGZkLCBFWFQyX0lPQ19HRVRWRVJTSU9OLCAodm9pZCopZ2V0X3ZlcnNpb24pOworCQkpCisJfQorCWNsb3NlX3NpbGVudGx5KGZkKTsKKwlyZXR1cm4gcjsKKyNlbHNlIC8qICEgSEFWRV9FWFQyX0lPQ1RMUyAqLworCWVycm5vID0gRU9QTk9UU1VQUDsKKwlyZXR1cm4gLTE7CisjZW5kaWYgLyogISBIQVZFX0VYVDJfSU9DVExTICovCit9CisKKworLyogR2V0L3NldCBhIGZpbGUgZmxhZ3Mgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLworaW50IGZnZXRzZXRmbGFncyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpnZXRfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc2V0X2ZsYWdzKQoreworI2lmIEhBVkVfRVhUMl9JT0NUTFMKKwlzdHJ1Y3Qgc3RhdCBidWY7CisJaW50IGZkLCByOworCUlGX0xPTkdfSVNfV0lERVIoaW50IGY7KQorCisJaWYgKHN0YXQobmFtZSwgJmJ1ZikgPT0gMCAvKiBzdGF0IGlzIG9rICovCisJICYmICFTX0lTUkVHKGJ1Zi5zdF9tb2RlKSAmJiAhU19JU0RJUihidWYuc3RfbW9kZSkKKwkpIHsKKwkJZ290byBub3RzdXBwOworCX0KKwlmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsgLyogbmVpdGhlciByZWFkIG5vciB3cml0ZSBhc2tlZCBmb3IgKi8KKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmICghZ2V0X2ZsYWdzKSB7CisJCUlGX0xPTkdfSVNfV0lERVIoCisJCQlmID0gKGludCkgc2V0X2ZsYWdzOworCQkJciA9IGlvY3RsKGZkLCBFWFQyX0lPQ19TRVRGTEFHUywgJmYpOworCQkpCisJCUlGX0xPTkdfSVNfU0FNRSgKKwkJCXIgPSBpb2N0bChmZCwgRVhUMl9JT0NfU0VURkxBR1MsICh2b2lkKikmc2V0X2ZsYWdzKTsKKwkJKQorCX0gZWxzZSB7CisJCUlGX0xPTkdfSVNfV0lERVIoCisJCQlyID0gaW9jdGwoZmQsIEVYVDJfSU9DX0dFVEZMQUdTLCAmZik7CisJCQkqZ2V0X2ZsYWdzID0gZjsKKwkJKQorCQlJRl9MT05HX0lTX1NBTUUoCisJCQlyID0gaW9jdGwoZmQsIEVYVDJfSU9DX0dFVEZMQUdTLCAodm9pZCopZ2V0X2ZsYWdzKTsKKwkJKQorCX0KKworCWNsb3NlX3NpbGVudGx5KGZkKTsKKwlyZXR1cm4gcjsKKyBub3RzdXBwOgorI2VuZGlmIC8qIEhBVkVfRVhUMl9JT0NUTFMgKi8KKwllcnJubyA9IEVPUE5PVFNVUFA7CisJcmV0dXJuIC0xOworfQorCisKKy8qIFByaW50IGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCitjb25zdCB1aW50MzJfdCBlMmF0dHJfZmxhZ3NfdmFsdWVbXSA9IHsKKyNpZmRlZiBFTkFCTEVfQ09NUFJFU1NJT04KKwlFWFQyX0NPTVBSQkxLX0ZMLAorCUVYVDJfRElSVFlfRkwsCisJRVhUMl9OT0NPTVBSX0ZMLAorCUVYVDJfRUNPTVBSX0ZMLAorI2VuZGlmCisJRVhUMl9JTkRFWF9GTCwKKwlFWFQyX1NFQ1JNX0ZMLAorCUVYVDJfVU5STV9GTCwKKwlFWFQyX1NZTkNfRkwsCisJRVhUMl9ESVJTWU5DX0ZMLAorCUVYVDJfSU1NVVRBQkxFX0ZMLAorCUVYVDJfQVBQRU5EX0ZMLAorCUVYVDJfTk9EVU1QX0ZMLAorCUVYVDJfTk9BVElNRV9GTCwKKwlFWFQyX0NPTVBSX0ZMLAorCUVYVDNfSk9VUk5BTF9EQVRBX0ZMLAorCUVYVDJfTk9UQUlMX0ZMLAorCUVYVDJfVE9QRElSX0ZMCit9OworCitjb25zdCBjaGFyIGUyYXR0cl9mbGFnc19zbmFtZVtdID0KKyNpZmRlZiBFTkFCTEVfQ09NUFJFU1NJT04KKwkiQlpYRSIKKyNlbmRpZgorCSJJIgorCSJzdVNEaWFkQWNqdFQiOworCitzdGF0aWMgY29uc3QgY2hhciBlMmF0dHJfZmxhZ3NfbG5hbWVbXSA9CisjaWZkZWYgRU5BQkxFX0NPTVBSRVNTSU9OCisJIkNvbXByZXNzZWRfRmlsZSIgIlwwIgorCSJDb21wcmVzc2VkX0RpcnR5X0ZpbGUiICJcMCIKKwkiQ29tcHJlc3Npb25fUmF3X0FjY2VzcyIgIlwwIgorCSJDb21wcmVzc2lvbl9FcnJvciIgIlwwIgorI2VuZGlmCisJIkluZGV4ZWRfZGlyZWN0b3J5IiAiXDAiCisJIlNlY3VyZV9EZWxldGlvbiIgIlwwIgorCSJVbmRlbGV0ZSIgIlwwIgorCSJTeW5jaHJvbm91c19VcGRhdGVzIiAiXDAiCisJIlN5bmNocm9ub3VzX0RpcmVjdG9yeV9VcGRhdGVzIiAiXDAiCisJIkltbXV0YWJsZSIgIlwwIgorCSJBcHBlbmRfT25seSIgIlwwIgorCSJOb19EdW1wIiAiXDAiCisJIk5vX0F0aW1lIiAiXDAiCisJIkNvbXByZXNzaW9uX1JlcXVlc3RlZCIgIlwwIgorCSJKb3VybmFsZWRfRGF0YSIgIlwwIgorCSJOb19UYWlsbWVyZ2luZyIgIlwwIgorCSJUb3Bfb2ZfRGlyZWN0b3J5X0hpZXJhcmNoaWVzIiAiXDAiCisJLyogQW5vdGhlciB0cmFpbGluZyBOVUwgaXMgYWRkZWQgYnkgY29tcGlsZXIgKi87CisKK3ZvaWQgcHJpbnRfZTJmbGFncyhGSUxFICpmLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBvcHRpb25zKQoreworCWNvbnN0IHVpbnQzMl90ICpmdjsKKwljb25zdCBjaGFyICpmbjsKKworCWZ2ID0gZTJhdHRyX2ZsYWdzX3ZhbHVlOworCWlmIChvcHRpb25zICYgUEZPUFRfTE9ORykgeworCQlpbnQgZmlyc3QgPSAxOworCQlmbiA9IGUyYXR0cl9mbGFnc19sbmFtZTsKKwkJZG8geworCQkJaWYgKGZsYWdzICYgKmZ2KSB7CisJCQkJaWYgKCFmaXJzdCkKKwkJCQkJZnB1dHMoIiwgIiwgZik7CisJCQkJZnB1dHMoZm4sIGYpOworCQkJCWZpcnN0ID0gMDsKKwkJCX0KKwkJCWZ2Kys7CisJCQlmbiArPSBzdHJsZW4oZm4pICsgMTsKKwkJfSB3aGlsZSAoKmZuKTsKKwkJaWYgKGZpcnN0KQorCQkJZnB1dHMoIi0tLSIsIGYpOworCX0gZWxzZSB7CisJCWZuID0gZTJhdHRyX2ZsYWdzX3NuYW1lOworCQlkbyAgeworCQkJY2hhciBjID0gJy0nOworCQkJaWYgKGZsYWdzICYgKmZ2KQorCQkJCWMgPSAqZm47CisJCQlmcHV0YyhjLCBmKTsKKwkJCWZ2Kys7CisJCQlmbisrOworCQl9IHdoaWxlICgqZm4pOworCX0KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9lMmZzX2xpYi5oIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL2UyZnNfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwNWVlNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9lMmZzX2xpYi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNlZSBSRUFETUUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKy8qIENvbnN0YW50cyBhbmQgc3RydWN0dXJlcyAqLworI2luY2x1ZGUgImUyZnNfZGVmcy5oIgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogSXRlcmF0ZSBhIGZ1bmN0aW9uIG9uIGVhY2ggZW50cnkgb2YgYSBkaXJlY3RvcnkgKi8KK2ludCBpdGVyYXRlX29uX2Rpcihjb25zdCBjaGFyICpkaXJfbmFtZSwKKwkJaW50IEZBU1RfRlVOQyAoKmZ1bmMpKGNvbnN0IGNoYXIgKiwgc3RydWN0IGRpcmVudCAqLCB2b2lkICopLAorCQl2b2lkICpwcml2YXRlKTsKKworLyogR2V0L3NldCBhIGZpbGUgdmVyc2lvbiBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCitpbnQgZmdldHNldHZlcnNpb24oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqZ2V0X3ZlcnNpb24sIHVuc2lnbmVkIGxvbmcgc2V0X3ZlcnNpb24pOworI2RlZmluZSBmZ2V0dmVyc2lvbihuYW1lLCB2ZXJzaW9uKSBmZ2V0c2V0dmVyc2lvbihuYW1lLCB2ZXJzaW9uLCAwKQorI2RlZmluZSBmc2V0dmVyc2lvbihuYW1lLCB2ZXJzaW9uKSBmZ2V0c2V0dmVyc2lvbihuYW1lLCBOVUxMLCB2ZXJzaW9uKQorCisvKiBHZXQvc2V0IGEgZmlsZSBmbGFncyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCitpbnQgZmdldHNldGZsYWdzKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKmdldF9mbGFncywgdW5zaWduZWQgbG9uZyBzZXRfZmxhZ3MpOworI2RlZmluZSBmZ2V0ZmxhZ3MobmFtZSwgZmxhZ3MpIGZnZXRzZXRmbGFncyhuYW1lLCBmbGFncywgMCkKKyNkZWZpbmUgZnNldGZsYWdzKG5hbWUsIGZsYWdzKSBmZ2V0c2V0ZmxhZ3MobmFtZSwgTlVMTCwgZmxhZ3MpCisKKy8qIE11c3QgYmUgMSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGBpbnQgbG9uZ19mb3JtYXQnLiAqLworI2RlZmluZSBQRk9QVF9MT05HICAxCisvKiBQcmludCBmaWxlIGF0dHJpYnV0ZXMgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwordm9pZCBwcmludF9lMmZsYWdzKEZJTEUgKmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIG9wdGlvbnMpOworCitleHRlcm4gY29uc3QgdWludDMyX3QgZTJhdHRyX2ZsYWdzX3ZhbHVlW107CitleHRlcm4gY29uc3QgY2hhciBlMmF0dHJfZmxhZ3Nfc25hbWVbXTsKKworLyogSWYgeW91IHBsYW4gdG8gRU5BQkxFX0NPTVBSRVNTSU9OLCBzZWUgZTJmc19saWIuYyBhbmQgY2hhdHRyLmMgLSAqLworLyogbWFrZSBzdXJlIHRoYXQgY2hhdHRyIGRvZXNuJ3QgYWNjZXB0IGJhZCBvcHRpb25zISAqLworI2lmZGVmIEVOQUJMRV9DT01QUkVTU0lPTgorI2RlZmluZSBlMmF0dHJfZmxhZ3NfdmFsdWVfY2hhdHRyICgmZTJhdHRyX2ZsYWdzX3ZhbHVlWzVdKQorI2RlZmluZSBlMmF0dHJfZmxhZ3Nfc25hbWVfY2hhdHRyICgmZTJhdHRyX2ZsYWdzX3NuYW1lWzVdKQorI2Vsc2UKKyNkZWZpbmUgZTJhdHRyX2ZsYWdzX3ZhbHVlX2NoYXR0ciAoJmUyYXR0cl9mbGFnc192YWx1ZVsxXSkKKyNkZWZpbmUgZTJhdHRyX2ZsYWdzX3NuYW1lX2NoYXR0ciAoJmUyYXR0cl9mbGFnc19zbmFtZVsxXSkKKyNlbmRpZgorCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL2ZzY2suYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9mc2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyZjc3NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9mc2NrLmMKQEAgLTAsMCArMSwxMDk2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmc2NrIC0tLSBBIGdlbmVyaWMsIHBhcmFsbGVsaXppbmcgZnJvbnQtZW5kIGZvciB0aGUgZnNjayBwcm9ncmFtLgorICogSXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBydW4gZnNjayBwcm9ncmFtcyBpbiBwYXJhbGxlbCBpZiB0aGUKKyAqIGRldmljZXMgYXJlIG9uIHNlcGFyYXRlIHNwaW5kbGVzLiAgSXQgaXMgYmFzZWQgb24gdGhlIHNhbWUgaWRlYXMgYXMKKyAqIHRoZSBnZW5lcmljIGZyb250IGVuZCBmb3IgZnNjayBieSBEYXZpZCBFbmdlbCBhbmQgRnJlZCB2YW4gS2VtcGVuLAorICogYnV0IGl0IGhhcyBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuIGZyb20gc2NyYXRjaCB0byBzdXBwb3J0CisgKiBwYXJhbGxlbCBleGVjdXRpb24uCisgKgorICogV3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCA8dHl0c29AbWl0LmVkdT4KKyAqCisgKiBNaXF1ZWwgdmFuIFNtb29yZW5idXJnIChtaXF1ZWxzQGRyaW5rZWwub3cub3JnKSAyMC1PY3QtMTk5NDoKKyAqICAgbyBDaGFuZ2VkIC10IGZzdHlwZSB0byBiZWhhdmUgbGlrZSB3aXRoIG1vdW50IHdoZW4gLUEgKGFsbCBmaWxlCisgKiAgICAgc3lzdGVtcykgb3IgLU0gKGxpa2UgbW91bnQpIGlzIHNwZWNpZmllZC4KKyAqICAgbyBmc2NrIGxvb2tzIGlmIGl0IGNhbiBmaW5kIHRoZSBmc2NrLnR5cGUgcHJvZ3JhbSB0byBkZWNpZGUKKyAqICAgICBpZiBpdCBzaG91bGQgaWdub3JlIHRoZSBmcyB0eXBlLiBUaGlzIHdheSBtb3JlIGZzY2sgcHJvZ3JhbXMKKyAqICAgICBjYW4gYmUgYWRkZWQgd2l0aG91dCBjaGFuZ2luZyB0aGlzIGZyb250LWVuZC4KKyAqICAgbyAtUiBmbGFnIHNraXAgcm9vdCBmaWxlIHN5c3RlbS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsCisgKiAgICAgIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgYnkgIFRoZW9kb3JlIFRzJ28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBBbGwgZmlsZXN5c3RlbSBzcGVjaWZpYyBob29rcyBoYXZlIGJlZW4gcmVtb3ZlZC4KKyAqIElmIGZpbGVzeXN0ZW0gY2Fubm90IGJlIGRldGVybWluZWQsIHdlIHdpbGwgZXhlY3V0ZQorICogImZzY2suYXV0byIuIEN1cnJlbnRseSB0aGlzIGFsc28gaGFwcGVucyBpZiB5b3Ugc3BlY2lmeQorICogVVVJRD14eHggb3IgTEFCRUw9eHh4IGFzIGFuIG9iamVjdCB0byBjaGVjay4KKyAqIERldGVjdGlvbiBjb2RlIGZvciB0aGF0IGlzIGFsc28gcHJvYmFibHkgaGFzIHRvIGJlIGluIGZzY2suYXV0by4KKyAqCisgKiBJbiBvdGhlciB3b3JkcywgdGhpcyBpcyBfcmVhbGx5XyBpcyBqdXN0IGEgZHJpdmVyIHByb2dyYW0gd2hpY2gKKyAqIHNwYXducyBhY3R1YWwgZnNjay5zb21ldGhpbmcgZm9yIGVhY2ggZmlsZXN5c3RlbSB0byBjaGVjay4KKyAqIEl0IGRvZXNuJ3QgZ3Vlc3MgZmlsZXN5c3RlbSB0eXBlcyBmcm9tIG9uLWRpc2sgZm9ybWF0LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmc2NrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLUFOUFJUVl0gWy1DIEZEXSBbLXQgRlNUWVBFXSBbRlNfT1BUU10gW0JMT0NLREVWXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBmc2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hlY2sgYW5kIHJlcGFpciBmaWxlc3lzdGVtc1xuIgorLy91c2FnZTogICAgICJcbgktQQlXYWxrIC9ldGMvZnN0YWIgYW5kIGNoZWNrIGFsbCBmaWxlc3lzdGVtcyIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JRG9uJ3QgZXhlY3V0ZSwganVzdCBzaG93IHdoYXQgd291bGQgYmUgZG9uZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJV2l0aCAtQSwgY2hlY2sgZmlsZXN5c3RlbXMgaW4gcGFyYWxsZWwiCisvL3VzYWdlOiAgICAgIlxuCS1SCVdpdGggLUEsIHNraXAgdGhlIHJvb3QgZmlsZXN5c3RlbSIKKy8vdXNhZ2U6ICAgICAiXG4JLVQJRG9uJ3Qgc2hvdyB0aXRsZSBvbiBzdGFydHVwIgorLy91c2FnZTogICAgICJcbgktVglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktQyBuCVdyaXRlIHN0YXR1cyBpbmZvcm1hdGlvbiB0byBzcGVjaWZpZWQgZmlsZWRlc2NyaXB0b3IiCisvL3VzYWdlOiAgICAgIlxuCS10IFRZUEUJTGlzdCBvZiBmaWxlc3lzdGVtIHR5cGVzIHRvIGNoZWNrIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogInByb2dyZXNzIGluZGljYXRvciIgY29kZSBpcyBzb21ld2hhdCBidWdneSBhbmQgZXh0WzIzXSBzcGVjaWZpYy4KKyAqIFdlIHNob3VsZCBiZSBmaWxlc3lzdGVtIGFnbm9zdGljLiBJT1c6IHRoZXJlIHNob3VsZCBiZSBhIHdlbGwtZGVmaW5lZAorICogQVBJIGZvciBmc2NrLnNvbWV0aGluZywgTk9UIGFkLWhvYyBoYWNrcyBpbiBnZW5lcmljIGZzY2suICovCisjZGVmaW5lIERPX1BST0dSRVNTX0lORElDQVRPUiAwCisKKy8qIGZzY2sgMS40MS40ICgyNy1KYW4tMjAwOSkgbWFucGFnZSBzYXlzOgorICogMCAgIC0gTm8gZXJyb3JzCisgKiAxICAgLSBGaWxlIHN5c3RlbSBlcnJvcnMgY29ycmVjdGVkCisgKiAyICAgLSBTeXN0ZW0gc2hvdWxkIGJlIHJlYm9vdGVkCisgKiA0ICAgLSBGaWxlIHN5c3RlbSBlcnJvcnMgbGVmdCB1bmNvcnJlY3RlZAorICogOCAgIC0gT3BlcmF0aW9uYWwgZXJyb3IKKyAqIDE2ICAtIFVzYWdlIG9yIHN5bnRheCBlcnJvcgorICogMzIgIC0gRnNjayBjYW5jZWxlZCBieSB1c2VyIHJlcXVlc3QKKyAqIDEyOCAtIFNoYXJlZCBsaWJyYXJ5IGVycm9yCisgKi8KKyNkZWZpbmUgRVhJVF9PSyAgICAgICAgICAwCisjZGVmaW5lIEVYSVRfTk9OREVTVFJVQ1QgMQorI2RlZmluZSBFWElUX0RFU1RSVUNUICAgIDIKKyNkZWZpbmUgRVhJVF9VTkNPUlJFQ1RFRCA0CisjZGVmaW5lIEVYSVRfRVJST1IgICAgICAgOAorI2RlZmluZSBFWElUX1VTQUdFICAgICAgIDE2CisjZGVmaW5lIEZTQ0tfQ0FOQ0VMRUQgICAgMzIgICAgIC8qIEFib3J0ZWQgd2l0aCBhIHNpZ25hbCBvciBeQyAqLworCisvKgorICogSW50ZXJuYWwgc3RydWN0dXJlIGZvciBtb3VudCB0YWJsZSBlbnRyaWVzLgorICovCitzdHJ1Y3QgZnNfaW5mbyB7CisJc3RydWN0IGZzX2luZm8gKm5leHQ7CisJY2hhcgkqZGV2aWNlOworCWNoYXIJKm1vdW50cHQ7CisJY2hhcgkqdHlwZTsKKwljaGFyCSpvcHRzOworCWludAlwYXNzbm87CisJaW50CWZsYWdzOworfTsKKworI2RlZmluZSBGTEFHX0RPTkUgMQorI2RlZmluZSBGTEFHX1BST0dSRVNTIDIKKy8qCisgKiBTdHJ1Y3R1cmUgdG8gYWxsb3cgZXhpdCBjb2RlcyB0byBiZSBzdG9yZWQKKyAqLworc3RydWN0IGZzY2tfaW5zdGFuY2UgeworCXN0cnVjdCBmc2NrX2luc3RhbmNlICpuZXh0OworCWludAlwaWQ7CisJaW50CWZsYWdzOworI2lmIERPX1BST0dSRVNTX0lORElDQVRPUgorCXRpbWVfdAlzdGFydF90aW1lOworI2VuZGlmCisJY2hhcgkqcHJvZzsKKwljaGFyCSpkZXZpY2U7CisJY2hhcgkqYmFzZV9kZXZpY2U7IC8qIC9kZXYvaGRhIGZvciAvZGV2L2hkYU4gZXRjICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciBpZ25vcmVkX3R5cGVzW10gQUxJR04xID0KKwkiaWdub3JlXDAiCisJImlzbzk2NjBcMCIKKwkibmZzXDAiCisJInByb2NcMCIKKwkic3dcMCIKKwkic3dhcFwwIgorCSJ0bXBmc1wwIgorCSJkZXZwdHNcMCI7CisKKyNpZiAwCitzdGF0aWMgY29uc3QgY2hhciByZWFsbHlfd2FudGVkW10gQUxJR04xID0KKwkibWluaXhcMCIKKwkiZXh0MlwwIgorCSJleHQzXDAiCisJImpmc1wwIgorCSJyZWlzZXJmc1wwIgorCSJ4aWFmc1wwIgorCSJ4ZnNcMCI7CisjZW5kaWYKKworI2RlZmluZSBCQVNFX01EICIvZGV2L21kIgorCitzdGF0aWMgY2hhciAqKmFyZ3M7CitzdGF0aWMgaW50IG51bV9hcmdzOworc3RhdGljIGludCB2ZXJib3NlOworCisjZGVmaW5lIEZTX1RZUEVfRkxBR19OT1JNQUwgMAorI2RlZmluZSBGU19UWVBFX0ZMQUdfT1BUICAgIDEKKyNkZWZpbmUgRlNfVFlQRV9GTEFHX05FR09QVCAyCitzdGF0aWMgY2hhciAqKmZzX3R5cGVfbGlzdDsKK3N0YXRpYyB1aW50OF90ICpmc190eXBlX2ZsYWc7CitzdGF0aWMgc21hbGxpbnQgZnNfdHlwZV9uZWdhdGVkOworCitzdGF0aWMgc21hbGxpbnQgbm9leGVjdXRlOworc3RhdGljIHNtYWxsaW50IHNlcmlhbGl6ZTsKK3N0YXRpYyBzbWFsbGludCBza2lwX3Jvb3Q7CisvKiBzdGF0aWMgc21hbGxpbnQgbGlrZV9tb3VudDsgKi8KK3N0YXRpYyBzbWFsbGludCBwYXJhbGxlbF9yb290Oworc3RhdGljIHNtYWxsaW50IGZvcmNlX2FsbF9wYXJhbGxlbDsKKworI2lmIERPX1BST0dSRVNTX0lORElDQVRPUgorc3RhdGljIHNtYWxsaW50IHByb2dyZXNzOworc3RhdGljIGludCBwcm9ncmVzc19mZDsKKyNlbmRpZgorCitzdGF0aWMgaW50IG51bV9ydW5uaW5nOworc3RhdGljIGludCBtYXhfcnVubmluZzsKK3N0YXRpYyBjaGFyICpmc3R5cGU7CitzdGF0aWMgc3RydWN0IGZzX2luZm8gKmZpbGVzeXNfaW5mbzsKK3N0YXRpYyBzdHJ1Y3QgZnNfaW5mbyAqZmlsZXN5c19sYXN0Oworc3RhdGljIHN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0YW5jZV9saXN0OworCisvKgorICogUmV0dXJuIHRoZSAiYmFzZSBkZXZpY2UiIGdpdmVuIGEgcGFydGljdWxhciBkZXZpY2U7IHRoaXMgaXMgdXNlZCB0bworICogYXNzdXJlIHRoYXQgd2Ugb25seSBmc2NrIG9uZSBwYXJ0aXRpb24gb24gYSBwYXJ0aWN1bGFyIGRyaXZlIGF0IGFueQorICogb25lIHRpbWUuICBPdGhlcndpc2UsIHRoZSBkaXNrIGhlYWRzIHdpbGwgYmUgc2Vla2luZyBhbGwgb3ZlciB0aGUKKyAqIHBsYWNlLiAgSWYgdGhlIGJhc2UgZGV2aWNlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCByZXR1cm4gTlVMTC4KKyAqCisgKiBUaGUgYmFzZV9kZXZpY2UoKSBmdW5jdGlvbiByZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgd2hpY2ggbXVzdAorICogYmUgZnJlZWQuCisgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9ERVZGUworLyoKKyAqIFJlcXVpcmVkIGZvciB0aGUgdWJlci1zaWxseSBkZXZmcyAvZGV2L2lkZS9ob3N0MS9idXMyL3RhcmdldDMvbHVuMworICogcGF0aGFtZXMuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBkZXZmc19oaWVyW10gPSB7CisJImhvc3QiLCAiYnVzIiwgInRhcmdldCIsICJsdW4iLCBOVUxMCit9OworI2VuZGlmCisKK3N0YXRpYyBjaGFyICpiYXNlX2RldmljZShjb25zdCBjaGFyICpkZXZpY2UpCit7CisJY2hhciAqc3RyLCAqY3A7CisjaWYgRU5BQkxFX0ZFQVRVUkVfREVWRlMKKwljb25zdCBjaGFyICpjb25zdCAqaGllcjsKKwljb25zdCBjaGFyICpkaXNrOworCWludCBsZW47CisjZW5kaWYKKwlzdHIgPSB4c3RyZHVwKGRldmljZSk7CisKKwkvKiBTa2lwIG92ZXIgIi9kZXYvIjsgaWYgaXQncyBub3QgcHJlc2VudCwgZ2l2ZSB1cCAqLworCWNwID0gc2tpcF9kZXZfcGZ4KHN0cik7CisJaWYgKGNwID09IHN0cikKKwkJZ290byBlcnJvdXQ7CisKKwkvKgorCSAqIEZvciBtZCBkZXZpY2VzLCB3ZSB0cmVhdCB0aGVtIGFsbCBhcyBpZiB0aGV5IHdlcmUgYWxsCisJICogb24gb25lIGRpc2ssIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIHBhcmFsbGVsaXplIHRoZW0uCisJICovCisJaWYgKGNwWzBdID09ICdtJyAmJiBjcFsxXSA9PSAnZCcpIHsKKwkJY3BbMl0gPSAwOworCQlyZXR1cm4gc3RyOworCX0KKworCS8qIEhhbmRsZSBEQUMgOTYwIGRldmljZXMgKi8KKwlpZiAoc3RybmNtcChjcCwgInJkLyIsIDMpID09IDApIHsKKwkJY3AgKz0gMzsKKwkJaWYgKGNwWzBdICE9ICdjJyB8fCAhaXNkaWdpdChjcFsxXSkKKwkJIHx8IGNwWzJdICE9ICdkJyB8fCAhaXNkaWdpdChjcFszXSkpCisJCQlnb3RvIGVycm91dDsKKwkJY3BbNF0gPSAwOworCQlyZXR1cm4gc3RyOworCX0KKworCS8qIE5vdyBsZXQncyBoYW5kbGUgL2Rldi9oZCogYW5kIC9kZXYvc2QqIGRldmljZXMuLi4uICovCisJaWYgKChjcFswXSA9PSAnaCcgfHwgY3BbMF0gPT0gJ3MnKSAmJiBjcFsxXSA9PSAnZCcpIHsKKwkJY3AgKz0gMjsKKwkJLyogSWYgdGhlcmUncyBhIHNpbmdsZSBudW1iZXIgYWZ0ZXIgL2Rldi9oZCwgc2tpcCBpdCAqLworCQlpZiAoaXNkaWdpdCgqY3ApKQorCQkJY3ArKzsKKwkJLyogV2hhdCBmb2xsb3dzIG11c3QgYmUgYW4gYWxwaGEgY2hhciwgb3IgZ2l2ZSB1cCAqLworCQlpZiAoIWlzYWxwaGEoKmNwKSkKKwkJCWdvdG8gZXJyb3V0OworCQljcFsxXSA9IDA7CisJCXJldHVybiBzdHI7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfREVWRlMKKwkvKiBOb3cgbGV0J3MgaGFuZGxlIGRldmZzICh1Z2gpIG5hbWVzICovCisJbGVuID0gMDsKKwlpZiAoc3RybmNtcChjcCwgImlkZS8iLCA0KSA9PSAwKQorCQlsZW4gPSA0OworCWlmIChzdHJuY21wKGNwLCAic2NzaS8iLCA1KSA9PSAwKQorCQlsZW4gPSA1OworCWlmIChsZW4pIHsKKwkJY3AgKz0gbGVuOworCQkvKgorCQkgKiBOb3cgd2UgcHJvY2VlZCBkb3duIHRoZSBleHBlY3RlZCBkZXZmcyBoaWVyYXJjaHkuCisJCSAqIGkuZS4sIC4uLi9ob3N0MS9idXMyL3RhcmdldDMvbHVuNC8uLi4KKwkJICogSWYgd2UgZG9uJ3QgZmluZCB0aGUgZXhwZWN0ZWQgdG9rZW4sIGZvbGxvd2VkIGJ5CisJCSAqIHNvbWUgbnVtYmVyIG9mIGRpZ2l0cyBhdCBlYWNoIGxldmVsLCBhYm9ydC4KKwkJICovCisJCWZvciAoaGllciA9IGRldmZzX2hpZXI7ICpoaWVyOyBoaWVyKyspIHsKKwkJCWxlbiA9IHN0cmxlbigqaGllcik7CisJCQlpZiAoc3RybmNtcChjcCwgKmhpZXIsIGxlbikgIT0gMCkKKwkJCQlnb3RvIGVycm91dDsKKwkJCWNwICs9IGxlbjsKKwkJCXdoaWxlICgqY3AgIT0gJy8nICYmICpjcCAhPSAwKSB7CisJCQkJaWYgKCFpc2RpZ2l0KCpjcCkpCisJCQkJCWdvdG8gZXJyb3V0OworCQkJCWNwKys7CisJCQl9CisJCQljcCsrOworCQl9CisJCWNwWy0xXSA9IDA7CisJCXJldHVybiBzdHI7CisJfQorCisJLyogTm93IGhhbmRsZSBkZXZmcyAvZGV2L2Rpc2Mgb3IgL2Rldi9kaXNrIG5hbWVzICovCisJZGlzayA9IDA7CisJaWYgKHN0cm5jbXAoY3AsICJkaXNjcy8iLCA2KSA9PSAwKQorCQlkaXNrID0gImRpc2MiOworCWVsc2UgaWYgKHN0cm5jbXAoY3AsICJkaXNrcy8iLCA2KSA9PSAwKQorCQlkaXNrID0gImRpc2siOworCWlmIChkaXNrKSB7CisJCWNwICs9IDY7CisJCWlmIChzdHJuY21wKGNwLCBkaXNrLCA0KSAhPSAwKQorCQkJZ290byBlcnJvdXQ7CisJCWNwICs9IDQ7CisJCXdoaWxlICgqY3AgIT0gJy8nICYmICpjcCAhPSAwKSB7CisJCQlpZiAoIWlzZGlnaXQoKmNwKSkKKwkJCQlnb3RvIGVycm91dDsKKwkJCWNwKys7CisJCX0KKwkJKmNwID0gMDsKKwkJcmV0dXJuIHN0cjsKKwl9CisjZW5kaWYKKyBlcnJvdXQ6CisJZnJlZShzdHIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2luc3RhbmNlKHN0cnVjdCBmc2NrX2luc3RhbmNlICpwKQoreworCWZyZWUocC0+cHJvZyk7CisJZnJlZShwLT5kZXZpY2UpOworCWZyZWUocC0+YmFzZV9kZXZpY2UpOworCWZyZWUocCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNfaW5mbyAqY3JlYXRlX2ZzX2RldmljZShjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm1udHBudCwKKwkJCQkJY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqb3B0cywKKwkJCQkJaW50IHBhc3NubykKK3sKKwlzdHJ1Y3QgZnNfaW5mbyAqZnM7CisKKwlmcyA9IHh6YWxsb2Moc2l6ZW9mKCpmcykpOworCWZzLT5kZXZpY2UgPSB4c3RyZHVwKGRldmljZSk7CisJZnMtPm1vdW50cHQgPSB4c3RyZHVwKG1udHBudCk7CisJaWYgKHN0cmNocih0eXBlLCAnLCcpKQorCQl0eXBlID0gKGNoYXIgKikiYXV0byI7CisJZnMtPnR5cGUgPSB4c3RyZHVwKHR5cGUpOworCWZzLT5vcHRzID0geHN0cmR1cChvcHRzID8gb3B0cyA6ICIiKTsKKwlmcy0+cGFzc25vID0gcGFzc25vIDwgMCA/IDEgOiBwYXNzbm87CisJLypmcy0+ZmxhZ3MgPSAwOyAqLworCS8qZnMtPm5leHQgPSBOVUxMOyAqLworCisJaWYgKCFmaWxlc3lzX2luZm8pCisJCWZpbGVzeXNfaW5mbyA9IGZzOworCWVsc2UKKwkJZmlsZXN5c19sYXN0LT5uZXh0ID0gZnM7CisJZmlsZXN5c19sYXN0ID0gZnM7CisKKwlyZXR1cm4gZnM7Cit9CisKKy8qIExvYWQgdGhlIGZpbGVzeXN0ZW0gZGF0YWJhc2UgZnJvbSAvZXRjL2ZzdGFiICovCitzdGF0aWMgdm9pZCBsb2FkX2ZzX2luZm8oY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqZnN0YWI7CisJc3RydWN0IG1udGVudCBtdGU7CisKKwlmc3RhYiA9IHNldG1udGVudChmaWxlbmFtZSwgInIiKTsKKwlpZiAoIWZzdGFiKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlYWQgJyVzJyIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8vIExvb3AgdGhyb3VnaCBlbnRyaWVzCisJd2hpbGUgKGdldG1udGVudF9yKGZzdGFiLCAmbXRlLCBiYl9jb21tb25fYnVmc2l6MSwgQ09NTU9OX0JVRlNJWkUpKSB7CisJCS8vYmJfaW5mb19tc2coIkNSRUFURVslc11bJXNdWyVzXVslc11bJWRdIiwgbXRlLm1udF9mc25hbWUsIG10ZS5tbnRfZGlyLAorCQkvLwltdGUubW50X3R5cGUsIG10ZS5tbnRfb3B0cywKKwkJLy8JbXRlLm1udF9wYXNzbm8pOworCQljcmVhdGVfZnNfZGV2aWNlKG10ZS5tbnRfZnNuYW1lLCBtdGUubW50X2RpciwKKwkJCW10ZS5tbnRfdHlwZSwgbXRlLm1udF9vcHRzLAorCQkJbXRlLm1udF9wYXNzbm8pOworCX0KKwllbmRtbnRlbnQoZnN0YWIpOworfQorCisvKiBMb29rdXAgZmlsZXN5cyBpbiAvZXRjL2ZzdGFiIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkuICovCitzdGF0aWMgc3RydWN0IGZzX2luZm8gKmxvb2t1cChjaGFyICpmaWxlc3lzKQoreworCXN0cnVjdCBmc19pbmZvICpmczsKKworCWZvciAoZnMgPSBmaWxlc3lzX2luZm87IGZzOyBmcyA9IGZzLT5uZXh0KSB7CisJCWlmIChzdHJjbXAoZmlsZXN5cywgZnMtPmRldmljZSkgPT0gMAorCQkgfHwgKGZzLT5tb3VudHB0ICYmIHN0cmNtcChmaWxlc3lzLCBmcy0+bW91bnRwdCkgPT0gMCkKKwkJKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZzOworfQorCisjaWYgRE9fUFJPR1JFU1NfSU5ESUNBVE9SCitzdGF0aWMgaW50IHByb2dyZXNzX2FjdGl2ZSh2b2lkKQoreworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCisJZm9yIChpbnN0ID0gaW5zdGFuY2VfbGlzdDsgaW5zdDsgaW5zdCA9IGluc3QtPm5leHQpIHsKKwkJaWYgKGluc3QtPmZsYWdzICYgRkxBR19ET05FKQorCQkJY29udGludWU7CisJCWlmIChpbnN0LT5mbGFncyAmIEZMQUdfUFJPR1JFU1MpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisvKgorICogU2VuZCBhIHNpZ25hbCB0byBhbGwgb3V0c3RhbmRpbmcgZnNjayBjaGlsZCBwcm9jZXNzZXMKKyAqLworc3RhdGljIHZvaWQga2lsbF9hbGxfaWZfZ290X3NpZ25hbCh2b2lkKQoreworCXN0YXRpYyBzbWFsbGludCBraWxsX3NlbnQ7CisKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdDsKKworCWlmICghYmJfZ290X3NpZ25hbCB8fCBraWxsX3NlbnQpCisJCXJldHVybjsKKworCWZvciAoaW5zdCA9IGluc3RhbmNlX2xpc3Q7IGluc3Q7IGluc3QgPSBpbnN0LT5uZXh0KSB7CisJCWlmIChpbnN0LT5mbGFncyAmIEZMQUdfRE9ORSkKKwkJCWNvbnRpbnVlOworCQlraWxsKGluc3QtPnBpZCwgU0lHVEVSTSk7CisJfQorCWtpbGxfc2VudCA9IDE7Cit9CisKKy8qCisgKiBXYWl0IGZvciBvbmUgY2hpbGQgcHJvY2VzcyB0byBleGl0OyB3aGVuIGl0IGRvZXMsIHVubGluayBpdCBmcm9tCisgKiB0aGUgbGlzdCBvZiBleGVjdXRpbmcgY2hpbGQgcHJvY2Vzc2VzLCBmcmVlLCBhbmQgcmV0dXJuIGl0cyBleGl0IHN0YXR1cy4KKyAqIElmIHRoZXJlIGlzIG5vIGV4aXRlZCBjaGlsZCwgcmV0dXJuIC0xLgorICovCitzdGF0aWMgaW50IHdhaXRfb25lKGludCBmbGFncykKK3sKKwlpbnQgc3RhdHVzOworCWludCBzaWc7CisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3QsICpwcmV2OworCXBpZF90IHBpZDsKKworCWlmICghaW5zdGFuY2VfbGlzdCkKKwkJcmV0dXJuIC0xOworCS8qIGlmIChub2V4ZWN1dGUpIHsgYWxyZWFkeSByZXR1cm5lZCAtMTsgfSAqLworCisJd2hpbGUgKDEpIHsKKwkJcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgZmxhZ3MpOworCQlraWxsX2FsbF9pZl9nb3Rfc2lnbmFsKCk7CisJCWlmIChwaWQgPT0gMCkgLyogZmxhZ3MgPT0gV05PSEFORyBhbmQgbm8gY2hpbGRyZW4gZXhpdGVkICovCisJCQlyZXR1cm4gLTE7CisJCWlmIChwaWQgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlpZiAoZXJybm8gPT0gRUNISUxEKSB7IC8qIHBhcmFub2lhICovCisJCQkJYmJfZXJyb3JfbXNnKCJ3YWl0OiBubyBtb3JlIGNoaWxkcmVuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYmJfcGVycm9yX21zZygid2FpdCIpOworCQkJY29udGludWU7CisJCX0KKwkJcHJldiA9IE5VTEw7CisJCWluc3QgPSBpbnN0YW5jZV9saXN0OworCQlkbyB7CisJCQlpZiAoaW5zdC0+cGlkID09IHBpZCkKKwkJCQlnb3RvIGNoaWxkX2RpZWQ7CisJCQlwcmV2ID0gaW5zdDsKKwkJCWluc3QgPSBpbnN0LT5uZXh0OworCQl9IHdoaWxlIChpbnN0KTsKKwl9CisgY2hpbGRfZGllZDoKKworCWlmIChXSUZFWElURUQoc3RhdHVzKSkKKwkJc3RhdHVzID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwllbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisJCXNpZyA9IFdURVJNU0lHKHN0YXR1cyk7CisJCXN0YXR1cyA9IEVYSVRfVU5DT1JSRUNURUQ7CisJCWlmIChzaWcgIT0gU0lHSU5UKSB7CisJCQlwcmludGYoIldhcm5pbmc6ICVzICVzIHRlcm1pbmF0ZWQgIgorCQkJCSJieSBzaWduYWwgJWRcbiIsCisJCQkJaW5zdC0+cHJvZywgaW5zdC0+ZGV2aWNlLCBzaWcpOworCQkJc3RhdHVzID0gRVhJVF9FUlJPUjsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ZigiJXMgJXM6IHN0YXR1cyBpcyAleCwgc2hvdWxkIG5ldmVyIGhhcHBlblxuIiwKKwkJCWluc3QtPnByb2csIGluc3QtPmRldmljZSwgc3RhdHVzKTsKKwkJc3RhdHVzID0gRVhJVF9FUlJPUjsKKwl9CisKKyNpZiBET19QUk9HUkVTU19JTkRJQ0FUT1IKKwlpZiAocHJvZ3Jlc3MgJiYgKGluc3QtPmZsYWdzICYgRkxBR19QUk9HUkVTUykgJiYgIXByb2dyZXNzX2FjdGl2ZSgpKSB7CisJCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0MjsKKwkJZm9yIChpbnN0MiA9IGluc3RhbmNlX2xpc3Q7IGluc3QyOyBpbnN0MiA9IGluc3QyLT5uZXh0KSB7CisJCQlpZiAoaW5zdDItPmZsYWdzICYgRkxBR19ET05FKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHN0cmNtcChpbnN0Mi0+dHlwZSwgImV4dDIiKSAhPSAwCisJCQkgJiYgc3RyY21wKGluc3QyLT50eXBlLCAiZXh0MyIpICE9IDAKKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogZXh0WzIzXSwgd2Ugd2lsbCBzZW5kIFVTUjEKKwkJCSAqIChyZXF1ZXN0IHRvIHN0YXJ0IGRpc3BsYXlpbmcgcHJvZ3Jlc3MgYmFyKQorCQkJICoKKwkJCSAqIElmIHdlJ3ZlIGp1c3Qgc3RhcnRlZCB0aGUgZnNjaywgd2FpdCBhIHRpbnkKKwkJCSAqIGJpdCBiZWZvcmUgc2VuZGluZyB0aGUga2lsbCwgdG8gZ2l2ZSBpdAorCQkJICogdGltZSB0byBzZXQgdXAgdGhlIHNpZ25hbCBoYW5kbGVyCisJCQkgKi8KKwkJCWlmIChpbnN0Mi0+c3RhcnRfdGltZSA+PSB0aW1lKE5VTEwpIC0gMSkKKwkJCQlzbGVlcCgxKTsKKwkJCWtpbGwoaW5zdDItPnBpZCwgU0lHVVNSMSk7CisJCQlpbnN0Mi0+ZmxhZ3MgfD0gRkxBR19QUk9HUkVTUzsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAocHJldikKKwkJcHJldi0+bmV4dCA9IGluc3QtPm5leHQ7CisJZWxzZQorCQlpbnN0YW5jZV9saXN0ID0gaW5zdC0+bmV4dDsKKwlpZiAodmVyYm9zZSA+IDEpCisJCXByaW50ZigiRmluaXNoZWQgd2l0aCAlcyAoZXhpdCBzdGF0dXMgJWQpXG4iLAorCQkgICAgICAgaW5zdC0+ZGV2aWNlLCBzdGF0dXMpOworCW51bV9ydW5uaW5nLS07CisJZnJlZV9pbnN0YW5jZShpbnN0KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBXYWl0IHVudGlsIGFsbCBleGVjdXRpbmcgY2hpbGQgcHJvY2Vzc2VzIGhhdmUgZXhpdGVkOyByZXR1cm4gdGhlCisgKiBsb2dpY2FsIE9SIG9mIGFsbCBvZiB0aGVpciBleGl0IGNvZGUgdmFsdWVzLgorICovCisjZGVmaW5lIEZMQUdfV0FJVF9BTEwgICAgICAgICAgIDAKKyNkZWZpbmUgRkxBR19XQUlUX0FUTEVBU1RfT05FICAgV05PSEFORworc3RhdGljIGludCB3YWl0X21hbnkoaW50IGZsYWdzKQoreworCWludCBleGl0X3N0YXR1czsKKwlpbnQgZ2xvYmFsX3N0YXR1cyA9IDA7CisJaW50IHdhaXRfZmxhZ3MgPSAwOworCisJd2hpbGUgKChleGl0X3N0YXR1cyA9IHdhaXRfb25lKHdhaXRfZmxhZ3MpKSAhPSAtMSkgeworCQlnbG9iYWxfc3RhdHVzIHw9IGV4aXRfc3RhdHVzOworCQl3YWl0X2ZsYWdzIHw9IGZsYWdzOworCX0KKwlyZXR1cm4gZ2xvYmFsX3N0YXR1czsKK30KKworLyoKKyAqIEV4ZWN1dGUgYSBwYXJ0aWN1bGFyIGZzY2sgcHJvZ3JhbSwgYW5kIGxpbmsgaXQgaW50byB0aGUgbGlzdCBvZgorICogY2hpbGQgcHJvY2Vzc2VzIHdlIGFyZSB3YWl0aW5nIGZvci4KKyAqLworc3RhdGljIHZvaWQgZXhlY3V0ZShjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpkZXZpY2UsCisJCWNvbnN0IGNoYXIgKm1udHB0IC8qLCBpbnQgaW50ZXJhY3RpdmUgKi8pCit7CisJaW50IGk7CisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3Q7CisJcGlkX3QgcGlkOworCisJYXJnc1swXSA9IHhhc3ByaW50ZigiZnNjay4lcyIsIHR5cGUpOworCisjaWYgRE9fUFJPR1JFU1NfSU5ESUNBVE9SCisJaWYgKHByb2dyZXNzICYmICFwcm9ncmVzc19hY3RpdmUoKSkgeworCQlpZiAoc3RyY21wKHR5cGUsICJleHQyIikgPT0gMAorCQkgfHwgc3RyY21wKHR5cGUsICJleHQzIikgPT0gMAorCQkpIHsKKwkJCWFyZ3NbWFhYXSA9IHhhc3ByaW50ZigiLUMlZCIsIHByb2dyZXNzX2ZkKTsgLyogMSAqLworCQkJaW5zdC0+ZmxhZ3MgfD0gRkxBR19QUk9HUkVTUzsKKwkJfQorCX0KKyNlbmRpZgorCisJYXJnc1tudW1fYXJncyAtIDJdID0gKGNoYXIqKWRldmljZTsKKwkvKiBhcmdzW251bV9hcmdzIC0gMV0gPSBOVUxMOyAtIGFscmVhZHkgaXMgKi8KKworCWlmICh2ZXJib3NlIHx8IG5vZXhlY3V0ZSkgeworCQlwcmludGYoIlslcyAoJWQpIC0tICVzXSIsIGFyZ3NbMF0sIG51bV9ydW5uaW5nLAorCQkJCQltbnRwdCA/IG1udHB0IDogZGV2aWNlKTsKKwkJZm9yIChpID0gMDsgYXJnc1tpXTsgaSsrKQorCQkJcHJpbnRmKCIgJXMiLCBhcmdzW2ldKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisKKwkvKiBGb3JrIGFuZCBleGVjdXRlIHRoZSBjb3JyZWN0IHByb2dyYW0uICovCisJcGlkID0gLTE7CisJaWYgKCFub2V4ZWN1dGUpIHsKKwkJcGlkID0gc3Bhd24oYXJncyk7CisJCWlmIChwaWQgPCAwKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coYXJnc1swXSk7CisJfQorCisjaWYgRE9fUFJPR1JFU1NfSU5ESUNBVE9SCisJZnJlZShhcmdzW1hYWF0pOworI2VuZGlmCisKKwkvKiBObyBjaGlsZCwgc28gZG9uJ3QgcmVjb3JkIGFuIGluc3RhbmNlICovCisJaWYgKHBpZCA8PSAwKSB7CisJCWZyZWUoYXJnc1swXSk7CisJCXJldHVybjsKKwl9CisKKwlpbnN0ID0geHphbGxvYyhzaXplb2YoKmluc3QpKTsKKwlpbnN0LT5waWQgPSBwaWQ7CisJaW5zdC0+cHJvZyA9IGFyZ3NbMF07CisJaW5zdC0+ZGV2aWNlID0geHN0cmR1cChkZXZpY2UpOworCWluc3QtPmJhc2VfZGV2aWNlID0gYmFzZV9kZXZpY2UoZGV2aWNlKTsKKyNpZiBET19QUk9HUkVTU19JTkRJQ0FUT1IKKwlpbnN0LT5zdGFydF90aW1lID0gdGltZShOVUxMKTsKKyNlbmRpZgorCisJLyogQWRkIHRvIHRoZSBsaXN0IG9mIHJ1bm5pbmcgZnNjaydzLgorCSAqICh3YXMgYWRkaW5nIHRvIHRoZSBlbmQsIGJ1dCBhZGRpbmcgdG8gdGhlIGZyb250IGlzIHNpbXBsZXIuLi4pICovCisJaW5zdC0+bmV4dCA9IGluc3RhbmNlX2xpc3Q7CisJaW5zdGFuY2VfbGlzdCA9IGluc3Q7Cit9CisKKy8qCisgKiBSdW4gdGhlIGZzY2sgcHJvZ3JhbSBvbiBhIHBhcnRpY3VsYXIgZGV2aWNlCisgKgorICogSWYgdGhlIHR5cGUgaXMgc3BlY2lmaWVkIHVzaW5nIC10LCBhbmQgaXQgaXNuJ3QgcHJlZml4ZWQgd2l0aCAibm8iCisgKiAoYXMgaW4gIm5vZXh0MiIpIGFuZCBvbmx5IG9uZSBmaWxlc3lzdGVtIHR5cGUgaXMgc3BlY2lmaWVkLCB0aGVuCisgKiB1c2UgdGhhdCB0eXBlIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpcyBzcGVjaWZpZWQgaW4gL2V0Yy9mc3RhYi4KKyAqCisgKiBJZiB0aGUgdHlwZSBpc24ndCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIHRoZW4gdXNlIGVpdGhlciB0aGUgdHlwZQorICogc3BlY2lmaWVkIGluIC9ldGMvZnN0YWIsIG9yICJhdXRvIi4KKyAqLworc3RhdGljIHZvaWQgZnNja19kZXZpY2Uoc3RydWN0IGZzX2luZm8gKmZzIC8qLCBpbnQgaW50ZXJhY3RpdmUgKi8pCit7CisJY29uc3QgY2hhciAqdHlwZTsKKworCWlmIChzdHJjbXAoZnMtPnR5cGUsICJhdXRvIikgIT0gMCkgeworCQl0eXBlID0gZnMtPnR5cGU7CisJCWlmICh2ZXJib3NlID4gMikKKwkJCWJiX2luZm9fbXNnKCJ1c2luZyBmaWxlc3lzdGVtIHR5cGUgJyVzJyAlcyIsCisJCQkJCXR5cGUsICJmcm9tIGZzdGFiIik7CisJfSBlbHNlIGlmIChmc3R5cGUKKwkgJiYgKGZzdHlwZVswXSAhPSAnbicgfHwgZnN0eXBlWzFdICE9ICdvJykgLyogIT0gIm5vIiAqLworCSAmJiBzdHJuY21wKGZzdHlwZSwgIm9wdHM9IiwgNSkgIT0gMAorCSAmJiBzdHJuY21wKGZzdHlwZSwgImxvb3AiLCA0KSAhPSAwCisJICYmICFzdHJjaHIoZnN0eXBlLCAnLCcpCisJKSB7CisJCXR5cGUgPSBmc3R5cGU7CisJCWlmICh2ZXJib3NlID4gMikKKwkJCWJiX2luZm9fbXNnKCJ1c2luZyBmaWxlc3lzdGVtIHR5cGUgJyVzJyAlcyIsCisJCQkJCXR5cGUsICJmcm9tIC10Iik7CisJfSBlbHNlIHsKKwkJdHlwZSA9ICJhdXRvIjsKKwkJaWYgKHZlcmJvc2UgPiAyKQorCQkJYmJfaW5mb19tc2coInVzaW5nIGZpbGVzeXN0ZW0gdHlwZSAnJXMnICVzIiwKKwkJCQkJdHlwZSwgIihkZWZhdWx0KSIpOworCX0KKworCW51bV9ydW5uaW5nKys7CisJZXhlY3V0ZSh0eXBlLCBmcy0+ZGV2aWNlLCBmcy0+bW91bnRwdCAvKiwgaW50ZXJhY3RpdmUgKi8pOworfQorCisvKgorICogUmV0dXJucyBUUlVFIGlmIGEgcGFydGl0aW9uIG9uIHRoZSBzYW1lIGRpc2sgaXMgYWxyZWFkeSBiZWluZworICogY2hlY2tlZC4KKyAqLworc3RhdGljIGludCBkZXZpY2VfYWxyZWFkeV9hY3RpdmUoY2hhciAqZGV2aWNlKQoreworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCWNoYXIgKmJhc2U7CisKKwlpZiAoZm9yY2VfYWxsX3BhcmFsbGVsKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIEJBU0VfTUQKKwkvKiBEb24ndCBjaGVjayBhIHNvZnQgcmFpZCBkaXNrIHdpdGggYW55IG90aGVyIGRpc2sgKi8KKwlpZiAoaW5zdGFuY2VfbGlzdAorCSAmJiAoIXN0cm5jbXAoaW5zdGFuY2VfbGlzdC0+ZGV2aWNlLCBCQVNFX01ELCBzaXplb2YoQkFTRV9NRCktMSkKKwkgICAgIHx8ICFzdHJuY21wKGRldmljZSwgQkFTRV9NRCwgc2l6ZW9mKEJBU0VfTUQpLTEpKQorCSkgeworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKworCWJhc2UgPSBiYXNlX2RldmljZShkZXZpY2UpOworCS8qCisJICogSWYgd2UgZG9uJ3Qga25vdyB0aGUgYmFzZSBkZXZpY2UsIGFzc3VtZSB0aGF0IHRoZSBkZXZpY2UgaXMKKwkgKiBhbHJlYWR5IGFjdGl2ZSBpZiB0aGVyZSBhcmUgYW55IGZzY2sgaW5zdGFuY2VzIHJ1bm5pbmcuCisJICovCisJaWYgKCFiYXNlKQorCQlyZXR1cm4gKGluc3RhbmNlX2xpc3QgIT0gTlVMTCk7CisKKwlmb3IgKGluc3QgPSBpbnN0YW5jZV9saXN0OyBpbnN0OyBpbnN0ID0gaW5zdC0+bmV4dCkgeworCQlpZiAoIWluc3QtPmJhc2VfZGV2aWNlIHx8ICFzdHJjbXAoYmFzZSwgaW5zdC0+YmFzZV9kZXZpY2UpKSB7CisJCQlmcmVlKGJhc2UpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlmcmVlKGJhc2UpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgYSBwYXJ0aWN1bGFyIG9wdGlvbiBhcHBlYXJzIGluIGEKKyAqIGNvbW1hLWRlbGltaXRlZCBvcHRpb25zIGxpc3QKKyAqLworc3RhdGljIGludCBvcHRfaW5fbGlzdChjaGFyICpvcHQsIGNoYXIgKm9wdGxpc3QpCit7CisJY2hhciAqczsKKwlpbnQgbGVuOworCisJaWYgKCFvcHRsaXN0KQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHN0cmxlbihvcHQpOworCXMgPSBvcHRsaXN0IC0gMTsKKwl3aGlsZSAoMSkgeworCQlzID0gc3Ryc3RyKHMgKyAxLCBvcHQpOworCQlpZiAoIXMpCisJCQlyZXR1cm4gMDsKKwkJLyogbmVpdGhlciAib3B0Li4iIG5vciAieHh4LG9wdC4uIj8gKi8KKwkJaWYgKHMgIT0gb3B0bGlzdCAmJiBzWy0xXSAhPSAnLCcpCisJCQljb250aW51ZTsKKwkJLyogbmVpdGhlciAiLi5vcHQiIG5vciAiLi5vcHQseHh4Ij8gKi8KKwkJaWYgKHNbbGVuXSAhPSAnXDAnICYmIHNbbGVuXSAhPSAnLCcpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiBTZWUgaWYgdGhlIGZpbGVzeXN0ZW0gbWF0Y2hlcyB0aGUgY3JpdGVyaWEgZ2l2ZW4gYnkgdGhlIC10IG9wdGlvbiAqLworc3RhdGljIGludCBmc19tYXRjaChzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisJaW50IG4sIHJldCwgY2hlY2tlZF90eXBlOworCWNoYXIgKmNwOworCisJaWYgKCFmc190eXBlX2xpc3QpCisJCXJldHVybiAxOworCisJcmV0ID0gMDsKKwljaGVja2VkX3R5cGUgPSAwOworCW4gPSAwOworCXdoaWxlICgxKSB7CisJCWNwID0gZnNfdHlwZV9saXN0W25dOworCQlpZiAoIWNwKQorCQkJYnJlYWs7CisJCXN3aXRjaCAoZnNfdHlwZV9mbGFnW25dKSB7CisJCWNhc2UgRlNfVFlQRV9GTEFHX05PUk1BTDoKKwkJCWNoZWNrZWRfdHlwZSsrOworCQkJaWYgKHN0cmNtcChjcCwgZnMtPnR5cGUpID09IDApCisJCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEZTX1RZUEVfRkxBR19ORUdPUFQ6CisJCQlpZiAob3B0X2luX2xpc3QoY3AsIGZzLT5vcHRzKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlIEZTX1RZUEVfRkxBR19PUFQ6CisJCQlpZiAoIW9wdF9pbl9saXN0KGNwLCBmcy0+b3B0cykpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCQluKys7CisJfQorCWlmIChjaGVja2VkX3R5cGUgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gKGZzX3R5cGVfbmVnYXRlZCA/ICFyZXQgOiByZXQpOworfQorCisvKiBDaGVjayBpZiB3ZSBzaG91bGQgaWdub3JlIHRoaXMgZmlsZXN5c3RlbS4gKi8KK3N0YXRpYyBpbnQgaWdub3JlKHN0cnVjdCBmc19pbmZvICpmcykKK3sKKwkvKgorCSAqIElmIHRoZSBwYXNzIG51bWJlciBpcyAwLCBpZ25vcmUgaXQuCisJICovCisJaWYgKGZzLT5wYXNzbm8gPT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIElmIGEgc3BlY2lmaWMgZnN0eXBlIGlzIHNwZWNpZmllZCwgYW5kIGl0IGRvZXNuJ3QgbWF0Y2gsCisJICogaWdub3JlIGl0LgorCSAqLworCWlmICghZnNfbWF0Y2goZnMpKQorCQlyZXR1cm4gMTsKKworCS8qIEFyZSB3ZSBpZ25vcmluZyB0aGlzIHR5cGU/ICovCisJaWYgKGluZGV4X2luX3N0cmluZ3MoaWdub3JlZF90eXBlcywgZnMtPnR5cGUpID49IDApCisJCXJldHVybiAxOworCisJLyogV2UgY2FuIGFuZCB3YW50IHRvIGNoZWNrIHRoaXMgZmlsZSBzeXN0ZW0gdHlwZS4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2sgYWxsIGZpbGUgc3lzdGVtcywgdXNpbmcgdGhlIC9ldGMvZnN0YWIgdGFibGUuICovCitzdGF0aWMgaW50IGNoZWNrX2FsbCh2b2lkKQoreworCXN0cnVjdCBmc19pbmZvICpmczsKKwlpbnQgc3RhdHVzID0gRVhJVF9PSzsKKwlzbWFsbGludCBub3RfZG9uZV95ZXQ7CisJc21hbGxpbnQgcGFzc19kb25lOworCWludCBwYXNzbm87CisKKwlpZiAodmVyYm9zZSkKKwkJcHV0cygiQ2hlY2tpbmcgYWxsIGZpbGVzeXN0ZW1zIik7CisKKwkvKgorCSAqIERvIGFuIGluaXRpYWwgc2NhbiBvdmVyIHRoZSBmaWxlc3lzdGVtOyBtYXJrIGZpbGVzeXN0ZW1zCisJICogd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgYXMgZG9uZSwgYW5kIHJlc29sdmUgYW55ICJhdXRvIgorCSAqIGZpbGVzeXN0ZW0gdHlwZXMgKGRvbmUgYXMgYSBzaWRlLWVmZmVjdCBvZiBjYWxsaW5nIGlnbm9yZSgpKS4KKwkgKi8KKwlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkKKwkJaWYgKGlnbm9yZShmcykpCisJCQlmcy0+ZmxhZ3MgfD0gRkxBR19ET05FOworCisJLyoKKwkgKiBGaW5kIGFuZCBjaGVjayB0aGUgcm9vdCBmaWxlc3lzdGVtLgorCSAqLworCWlmICghcGFyYWxsZWxfcm9vdCkgeworCQlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkgeworCQkJaWYgKExPTkVfQ0hBUihmcy0+bW91bnRwdCwgJy8nKSkgeworCQkJCWlmICghc2tpcF9yb290ICYmICFpZ25vcmUoZnMpKSB7CisJCQkJCWZzY2tfZGV2aWNlKGZzIC8qLCAxKi8pOworCQkJCQlzdGF0dXMgfD0gd2FpdF9tYW55KEZMQUdfV0FJVF9BTEwpOworCQkJCQlpZiAoc3RhdHVzID4gRVhJVF9OT05ERVNUUlVDVCkKKwkJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCQkJCWZzLT5mbGFncyB8PSBGTEFHX0RPTkU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBUaGlzIGlzIGZvciB0aGUgYm9uZS1oZWFkZWQgdXNlciB3aG8gaGFzIHJvb3QKKwkgKiBmaWxlc3lzdGVtIGxpc3RlZCB0d2ljZS4KKwkgKiAiU2tpcCByb290IiB3aWxsIHNraXAgX2FsbF8gcm9vdCBlbnRyaWVzLgorCSAqLworCWlmIChza2lwX3Jvb3QpCisJCWZvciAoZnMgPSBmaWxlc3lzX2luZm87IGZzOyBmcyA9IGZzLT5uZXh0KQorCQkJaWYgKExPTkVfQ0hBUihmcy0+bW91bnRwdCwgJy8nKSkKKwkJCQlmcy0+ZmxhZ3MgfD0gRkxBR19ET05FOworCisJbm90X2RvbmVfeWV0ID0gMTsKKwlwYXNzbm8gPSAxOworCXdoaWxlIChub3RfZG9uZV95ZXQpIHsKKwkJbm90X2RvbmVfeWV0ID0gMDsKKwkJcGFzc19kb25lID0gMTsKKworCQlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkgeworCQkJaWYgKGJiX2dvdF9zaWduYWwpCisJCQkJYnJlYWs7CisJCQlpZiAoZnMtPmZsYWdzICYgRkxBR19ET05FKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIElmIHRoZSBmaWxlc3lzdGVtJ3MgcGFzcyBudW1iZXIgaXMgaGlnaGVyCisJCQkgKiB0aGFuIHRoZSBjdXJyZW50IHBhc3MgbnVtYmVyLCB0aGVuIHdlIGRpZG4ndAorCQkJICogZG8gaXQgeWV0LgorCQkJICovCisJCQlpZiAoZnMtPnBhc3NubyA+IHBhc3NubykgeworCQkJCW5vdF9kb25lX3lldCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogSWYgYSBmaWxlc3lzdGVtIG9uIGEgcGFydGljdWxhciBkZXZpY2UgaGFzCisJCQkgKiBhbHJlYWR5IGJlZW4gc3Bhd25lZCwgdGhlbiB3ZSBuZWVkIHRvIGRlZmVyCisJCQkgKiB0aGlzIHRvIGFub3RoZXIgcGFzcy4KKwkJCSAqLworCQkJaWYgKGRldmljZV9hbHJlYWR5X2FjdGl2ZShmcy0+ZGV2aWNlKSkgeworCQkJCXBhc3NfZG9uZSA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogU3Bhd24gb2ZmIHRoZSBmc2NrIHByb2Nlc3MKKwkJCSAqLworCQkJZnNja19kZXZpY2UoZnMgLyosIHNlcmlhbGl6ZSovKTsKKwkJCWZzLT5mbGFncyB8PSBGTEFHX0RPTkU7CisKKwkJCS8qCisJCQkgKiBPbmx5IGRvIG9uZSBmaWxlc3lzdGVtIGF0IGEgdGltZSwgb3IgaWYgd2UKKwkJCSAqIGhhdmUgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGZzY2sncyBleHRhbnQKKwkJCSAqIGF0IG9uZSB0aW1lLCBhcHBseSB0aGF0IGxpbWl0LgorCQkJICovCisJCQlpZiAoc2VyaWFsaXplCisJCQkgfHwgKG1heF9ydW5uaW5nICYmIChudW1fcnVubmluZyA+PSBtYXhfcnVubmluZykpCisJCQkpIHsKKwkJCQlwYXNzX2RvbmUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChiYl9nb3Rfc2lnbmFsKQorCQkJYnJlYWs7CisJCWlmICh2ZXJib3NlID4gMSkKKwkJCXByaW50ZigiLS13YWl0aW5nLS0gKHBhc3MgJWQpXG4iLCBwYXNzbm8pOworCQlzdGF0dXMgfD0gd2FpdF9tYW55KHBhc3NfZG9uZSA/IEZMQUdfV0FJVF9BTEwgOgorCQkJCSAgICBGTEFHX1dBSVRfQVRMRUFTVF9PTkUpOworCQlpZiAocGFzc19kb25lKSB7CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJcHV0cygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQkJcGFzc25vKys7CisJCX0gZWxzZQorCQkJbm90X2RvbmVfeWV0ID0gMTsKKwl9CisJa2lsbF9hbGxfaWZfZ290X3NpZ25hbCgpOworCXN0YXR1cyB8PSB3YWl0X21hbnkoRkxBR19XQUlUX0FUTEVBU1RfT05FKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVhbCB3aXRoIHRoZSBmc2NrIC10IGFyZ3VtZW50LgorICogSHVoLCBmb3IgbW91bnQgIi10IG5vdmZhdCxuZnMiIG1lYW5zICJuZWl0aGVyIHZmYXQgbm9yIG5mcyIhCisgKiBXaHkgaGVyZSB3ZSByZXF1aXJlICItdCBub3ZmYXQsbm9uZnMiID8/CisgKi8KK3N0YXRpYyB2b2lkIGNvbXBpbGVfZnNfdHlwZShjaGFyICpmc190eXBlKQoreworCWNoYXIgKnM7CisJaW50IG51bSA9IDI7CisJc21hbGxpbnQgbmVnYXRlOworCisJcyA9IGZzX3R5cGU7CisJd2hpbGUgKChzID0gc3RyY2hyKHMsICcsJykpKSB7CisJCW51bSsrOworCQlzKys7CisJfQorCisJZnNfdHlwZV9saXN0ID0geHphbGxvYyhudW0gKiBzaXplb2YoZnNfdHlwZV9saXN0WzBdKSk7CisJZnNfdHlwZV9mbGFnID0geHphbGxvYyhudW0gKiBzaXplb2YoZnNfdHlwZV9mbGFnWzBdKSk7CisJZnNfdHlwZV9uZWdhdGVkID0gLTE7IC8qIG5vdCB5ZXQga25vd24gaXMgaXQgbmVnYXRlZCBvciBub3QgKi8KKworCW51bSA9IDA7CisJcyA9IGZzX3R5cGU7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqY29tbWE7CisKKwkJbmVnYXRlID0gMDsKKwkJaWYgKHNbMF0gPT0gJ24nICYmIHNbMV0gPT0gJ28nKSB7IC8qICJuby4uIiAqLworCQkJcyArPSAyOworCQkJbmVnYXRlID0gMTsKKwkJfSBlbHNlIGlmIChzWzBdID09ICchJykgeworCQkJcysrOworCQkJbmVnYXRlID0gMTsKKwkJfQorCisJCWlmIChzdHJjbXAocywgImxvb3AiKSA9PSAwKQorCQkJLyogbG9vcCBpcyByZWFsbHkgc2hvcnQtaGFuZCBmb3Igb3B0cz1sb29wICovCisJCQlnb3RvIGxvb3Bfc3BlY2lhbF9jYXNlOworCQlpZiAoc3RybmNtcChzLCAib3B0cz0iLCA1KSA9PSAwKSB7CisJCQlzICs9IDU7CisgbG9vcF9zcGVjaWFsX2Nhc2U6CisJCQlmc190eXBlX2ZsYWdbbnVtXSA9IG5lZ2F0ZSA/IEZTX1RZUEVfRkxBR19ORUdPUFQgOiBGU19UWVBFX0ZMQUdfT1BUOworCQl9IGVsc2UgeworCQkJaWYgKGZzX3R5cGVfbmVnYXRlZCA9PSAtMSkKKwkJCQlmc190eXBlX25lZ2F0ZWQgPSBuZWdhdGU7CisJCQlpZiAoZnNfdHlwZV9uZWdhdGVkICE9IG5lZ2F0ZSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKyJlaXRoZXIgYWxsIG9yIG5vbmUgb2YgdGhlIGZpbGVzeXN0ZW0gdHlwZXMgcGFzc2VkIHRvIC10IG11c3QgYmUgcHJlZml4ZWQgIgorIndpdGggJ25vJyBvciAnISciKTsKKwkJfQorCQljb21tYSA9IHN0cmNocihzLCAnLCcpOworCQlmc190eXBlX2xpc3RbbnVtKytdID0gY29tbWEgPyB4c3RybmR1cChzLCBjb21tYS1zKSA6IHhzdHJkdXAocyk7CisJCWlmICghY29tbWEpCisJCQlicmVhazsKKwkJcyA9IGNvbW1hICsgMTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICoqbmV3X2FyZ3Modm9pZCkKK3sKKwlhcmdzID0geHJlYWxsb2NfdmVjdG9yKGFyZ3MsIDIsIG51bV9hcmdzKTsKKwlyZXR1cm4gJmFyZ3NbbnVtX2FyZ3MrK107Cit9CisKK2ludCBmc2NrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmc2NrX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgc3RhdHVzOworCS8qaW50IGludGVyYWN0aXZlOyovCisJc3RydWN0IGZzX2luZm8gKmZzOworCWNvbnN0IGNoYXIgKmZzdGFiOworCWNoYXIgKnRtcDsKKwljaGFyICoqZGV2aWNlczsKKwlpbnQgbnVtX2RldmljZXM7CisJc21hbGxpbnQgb3B0c19mb3JfZnNjazsKKwlzbWFsbGludCBkb2FsbDsKKwlzbWFsbGludCBub3RpdGxlOworCisJLyogd2Ugd2FudCB3YWl0KCkgdG8gYmUgaW50ZXJydXB0aWJsZSAqLworCXNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHSU5ULCByZWNvcmRfc2lnbm8pOworCXNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHVEVSTSwgcmVjb3JkX3NpZ25vKTsKKworCXNldGJ1ZihzdGRvdXQsIE5VTEwpOworCisJb3B0c19mb3JfZnNjayA9IGRvYWxsID0gbm90aXRsZSA9IDA7CisJZGV2aWNlcyA9IE5VTEw7CisJbnVtX2RldmljZXMgPSAwOworCW5ld19hcmdzKCk7IC8qIGFyZ3NbMF0gPSBOVUxMLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGZzY2suPHR5cGU+ICovCisJLyogaW5zdGFuY2VfbGlzdCA9IE5VTEw7IC0gaW4gYnNzLCBzbyBhbHJlYWR5IHplcm9lZCAqLworCisJd2hpbGUgKCorK2FyZ3YpIHsKKwkJaW50IGo7CisJCWludCBvcHRwb3M7CisJCWNoYXIgKm9wdGlvbnM7CisJCWNoYXIgKmFyZyA9ICphcmd2OworCisJCS8qICIvZGV2L2JsayIgb3IgIi9wYXRoIiBvciAiVVVJRD14eHgiIG9yICJMQUJFTD14eHgiICovCisJCWlmICgoYXJnWzBdID09ICcvJyAmJiAhb3B0c19mb3JfZnNjaykgfHwgc3RyY2hyKGFyZywgJz0nKSkgeworLy8gRklYTUU6IG11c3QgY2hlY2sgdGhhdCBhcmcgaXMgYSBibGtkZXYsIG9yIHJlc29sdmUKKy8vICIvcGF0aCIsICJVVUlEPXh4eCIgb3IgIkxBQkVMPXh4eCIgaW50byBibG9jayBkZXZpY2UgbmFtZQorLy8gKCJVVUlEPXh4eCIvIkxBQkVMPXh4eCIgY2FuIHByb2JhYmx5IHNoaWZ0ZWQgdG8gZnNjay5hdXRvIGR1dGllcykKKwkJCWRldmljZXMgPSB4cmVhbGxvY192ZWN0b3IoZGV2aWNlcywgMiwgbnVtX2RldmljZXMpOworCQkJZGV2aWNlc1tudW1fZGV2aWNlcysrXSA9IGFyZzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGFyZ1swXSAhPSAnLScgfHwgb3B0c19mb3JfZnNjaykgeworCQkJKm5ld19hcmdzKCkgPSBhcmc7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChMT05FX0NIQVIoYXJnICsgMSwgJy0nKSkgeyAvKiAiLS0iID8gKi8KKwkJCW9wdHNfZm9yX2ZzY2sgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlvcHRwb3MgPSAwOworCQlvcHRpb25zID0gTlVMTDsKKwkJZm9yIChqID0gMTsgYXJnW2pdOyBqKyspIHsKKwkJCXN3aXRjaCAoYXJnW2pdKSB7CisJCQljYXNlICdBJzoKKwkJCQlkb2FsbCA9IDE7CisJCQkJYnJlYWs7CisjaWYgRE9fUFJPR1JFU1NfSU5ESUNBVE9SCisJCQljYXNlICdDJzoKKwkJCQlwcm9ncmVzcyA9IDE7CisJCQkJaWYgKGFyZ1srK2pdKSB7IC8qIC1DbiAqLworCQkJCQlwcm9ncmVzc19mZCA9IHhhdG9pX3Bvc2l0aXZlKCZhcmdbal0pOworCQkJCQlnb3RvIG5leHRfYXJnOworCQkJCX0KKwkJCQkvKiAtQyBuICovCisJCQkJaWYgKCEqKythcmd2KQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJcHJvZ3Jlc3NfZmQgPSB4YXRvaV9wb3NpdGl2ZSgqYXJndik7CisJCQkJZ290byBuZXh0X2FyZzsKKyNlbmRpZgorCQkJY2FzZSAnVic6CisJCQkJdmVyYm9zZSsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnTic6CisJCQkJbm9leGVjdXRlID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1InOgorCQkJCXNraXBfcm9vdCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdUJzoKKwkJCQlub3RpdGxlID0gMTsKKwkJCQlicmVhazsKKy8qCQkJY2FzZSAnTSc6CisJCQkJbGlrZV9tb3VudCA9IDE7CisJCQkJYnJlYWs7ICovCisJCQljYXNlICdQJzoKKwkJCQlwYXJhbGxlbF9yb290ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCXNlcmlhbGl6ZSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICd0JzoKKwkJCQlpZiAoZnN0eXBlKQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJaWYgKGFyZ1srK2pdKQorCQkJCQl0bXAgPSAmYXJnW2pdOworCQkJCWVsc2UgaWYgKCorK2FyZ3YpCisJCQkJCXRtcCA9ICphcmd2OworCQkJCWVsc2UKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCWZzdHlwZSA9IHhzdHJkdXAodG1wKTsKKwkJCQljb21waWxlX2ZzX3R5cGUoZnN0eXBlKTsKKwkJCQlnb3RvIG5leHRfYXJnOworCQkJY2FzZSAnPyc6CisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlvcHRwb3MrKzsKKwkJCQkvKiBvbmUgZXh0cmEgZm9yICdcMCcgKi8KKwkJCQlvcHRpb25zID0geHJlYWxsb2Mob3B0aW9ucywgb3B0cG9zICsgMik7CisJCQkJb3B0aW9uc1tvcHRwb3NdID0gYXJnW2pdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisgbmV4dF9hcmc6CisJCWlmIChvcHRwb3MpIHsKKwkJCW9wdGlvbnNbMF0gPSAnLSc7CisJCQlvcHRpb25zW29wdHBvcyArIDFdID0gJ1wwJzsKKwkJCSpuZXdfYXJncygpID0gb3B0aW9uczsKKwkJfQorCX0KKwlpZiAoZ2V0ZW52KCJGU0NLX0ZPUkNFX0FMTF9QQVJBTExFTCIpKQorCQlmb3JjZV9hbGxfcGFyYWxsZWwgPSAxOworCXRtcCA9IGdldGVudigiRlNDS19NQVhfSU5TVCIpOworCWlmICh0bXApCisJCW1heF9ydW5uaW5nID0geGF0b2kodG1wKTsKKwluZXdfYXJncygpOyAvKiBhcmdzW251bV9hcmdzIC0gMl0gd2lsbCBiZSByZXBsYWNlZCBieSA8ZGV2aWNlPiAqLworCW5ld19hcmdzKCk7IC8qIGFyZ3NbbnVtX2FyZ3MgLSAxXSBpcyB0aGUgbGFzdCwgTlVMTCBlbGVtZW50ICovCisKKwlpZiAoIW5vdGl0bGUpCisJCXB1dHMoImZzY2sgKGJ1c3lib3ggIkJCX1ZFUiIsICJCQl9CVCIpIik7CisKKwkvKiBFdmVuIHBsYWluICJmc2NrIC9kZXYvaGRhMSIgbmVlZHMgZnN0YWIgdG8gZ2V0IGZzIHR5cGUsCisJICogc28gd2UgYXJlIHNjYW5uaW5nIGl0IGFueXdheSAqLworCWZzdGFiID0gZ2V0ZW52KCJGU1RBQl9GSUxFIik7CisJaWYgKCFmc3RhYikKKwkJZnN0YWIgPSAiL2V0Yy9mc3RhYiI7CisJbG9hZF9mc19pbmZvKGZzdGFiKTsKKworCS8qaW50ZXJhY3RpdmUgPSAobnVtX2RldmljZXMgPT0gMSkgfCBzZXJpYWxpemU7Ki8KKworCWlmIChudW1fZGV2aWNlcyA9PSAwKQorCQkvKmludGVyYWN0aXZlID0qLyBzZXJpYWxpemUgPSBkb2FsbCA9IDE7CisJaWYgKGRvYWxsKQorCQlyZXR1cm4gY2hlY2tfYWxsKCk7CisKKwlzdGF0dXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisJCWlmIChiYl9nb3Rfc2lnbmFsKSB7CisJCQlraWxsX2FsbF9pZl9nb3Rfc2lnbmFsKCk7CisJCQlicmVhazsKKwkJfQorCisJCWZzID0gbG9va3VwKGRldmljZXNbaV0pOworCQlpZiAoIWZzKQorCQkJZnMgPSBjcmVhdGVfZnNfZGV2aWNlKGRldmljZXNbaV0sICIiLCAiYXV0byIsIE5VTEwsIC0xKTsKKwkJZnNja19kZXZpY2UoZnMgLyosIGludGVyYWN0aXZlICovKTsKKworCQlpZiAoc2VyaWFsaXplCisJCSB8fCAobWF4X3J1bm5pbmcgJiYgKG51bV9ydW5uaW5nID49IG1heF9ydW5uaW5nKSkKKwkJKSB7CisJCQlpbnQgZXhpdF9zdGF0dXMgPSB3YWl0X29uZSgwKTsKKwkJCWlmIChleGl0X3N0YXR1cyA+PSAwKQorCQkJCXN0YXR1cyB8PSBleGl0X3N0YXR1czsKKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlwdXRzKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJCX0KKwl9CisJc3RhdHVzIHw9IHdhaXRfbWFueShGTEFHX1dBSVRfQUxMKTsKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL2xzYXR0ci5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL2xzYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMTJmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvbHNhdHRyLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxzYXR0ci5jCQktIExpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiA5My8xMC8zMAktIENyZWF0aW9uCisgKiA5My8xMS8xMwktIFJlcGxhY2Ugc3RhdCgpIGNhbGxzIGJ5IGxzdGF0KCkgdG8gYXZvaWQgbG9vcHMKKyAqIDk0LzAyLzI3CS0gSW50ZWdyYXRlZCBpbiBUZWQncyBkaXN0cmlidXRpb24KKyAqIDk4LzEyLzI5CS0gRGlzcGxheSB2ZXJzaW9uIGluZm8gb25seSB3aGVuIC1WIHNwZWNpZmllZCAoRyBNIFNpcGUpCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxzYXR0cl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1SYWRsdl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGxzYXR0cl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGFuIGV4dDIgZnNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJRG9uJ3QgaGlkZSBlbnRyaWVzIHN0YXJ0aW5nIHdpdGggLiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJTGlzdCBkaXJlY3RvcnkgZW50cmllcyBpbnN0ZWFkIG9mIGNvbnRlbnRzIgorLy91c2FnZTogICAgICJcbgktbAlMaXN0IGxvbmcgZmxhZyBuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJTGlzdCB0aGUgZmlsZSdzIHZlcnNpb24vZ2VuZXJhdGlvbiBudW1iZXIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImUyZnNfbGliLmgiCisKK2VudW0geworCU9QVF9SRUNVUiAgICAgID0gMHgxLAorCU9QVF9BTEwgICAgICAgID0gMHgyLAorCU9QVF9ESVJTX09QVCAgID0gMHg0LAorCU9QVF9QRl9MT05HICAgID0gMHg4LAorCU9QVF9HRU5FUkFUSU9OID0gMHgxMCwKK307CisKK3N0YXRpYyB2b2lkIGxpc3RfYXR0cmlidXRlcyhjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZnNmbGFnczsKKwl1bnNpZ25lZCBsb25nIGdlbmVyYXRpb247CisKKwlpZiAoZmdldGZsYWdzKG5hbWUsICZmc2ZsYWdzKSAhPSAwKQorCQlnb3RvIHJlYWRfZXJyOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfR0VORVJBVElPTikgeworCQlpZiAoZmdldHZlcnNpb24obmFtZSwgJmdlbmVyYXRpb24pICE9IDApCisJCQlnb3RvIHJlYWRfZXJyOworCQlwcmludGYoIiU1bHUgIiwgZ2VuZXJhdGlvbik7CisJfQorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfUEZfTE9ORykgeworCQlwcmludGYoIiUtMjhzICIsIG5hbWUpOworCQlwcmludF9lMmZsYWdzKHN0ZG91dCwgZnNmbGFncywgUEZPUFRfTE9ORyk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfSBlbHNlIHsKKwkJcHJpbnRfZTJmbGFncyhzdGRvdXQsIGZzZmxhZ3MsIDApOworCQlwcmludGYoIiAlc1xuIiwgbmFtZSk7CisJfQorCisJcmV0dXJuOworIHJlYWRfZXJyOgorCWJiX3BlcnJvcl9tc2coInJlYWRpbmcgJXMiLCBuYW1lKTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgbHNhdHRyX2Rpcl9wcm9jKGNvbnN0IGNoYXIgKmRpcl9uYW1lLAorCQlzdHJ1Y3QgZGlyZW50ICpkZSwKKwkJdm9pZCAqcHJpdmF0ZSBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqcGF0aDsKKworCXBhdGggPSBjb25jYXRfcGF0aF9maWxlKGRpcl9uYW1lLCBkZS0+ZF9uYW1lKTsKKworCWlmIChsc3RhdChwYXRoLCAmc3QpICE9IDApCisJCWJiX3BlcnJvcl9tc2coInN0YXQgJXMiLCBwYXRoKTsKKwllbHNlIGlmIChkZS0+ZF9uYW1lWzBdICE9ICcuJyB8fCAob3B0aW9uX21hc2szMiAmIE9QVF9BTEwpKSB7CisJCWxpc3RfYXR0cmlidXRlcyhwYXRoKTsKKwkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkgJiYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfUkVDVVIpCisJCSAmJiAhRE9UX09SX0RPVERPVChkZS0+ZF9uYW1lKQorCQkpIHsKKwkJCXByaW50ZigiXG4lczpcbiIsIHBhdGgpOworCQkJaXRlcmF0ZV9vbl9kaXIocGF0aCwgbHNhdHRyX2Rpcl9wcm9jLCBOVUxMKTsKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCX0KKwl9CisKKwlmcmVlKHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsc2F0dHJfYXJncyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGxzdGF0KG5hbWUsICZzdCkgPT0gLTEpIHsKKwkJYmJfcGVycm9yX21zZygic3RhdCAlcyIsIG5hbWUpOworCX0gZWxzZSBpZiAoU19JU0RJUihzdC5zdF9tb2RlKSAmJiAhKG9wdGlvbl9tYXNrMzIgJiBPUFRfRElSU19PUFQpKSB7CisJCWl0ZXJhdGVfb25fZGlyKG5hbWUsIGxzYXR0cl9kaXJfcHJvYywgTlVMTCk7CisJfSBlbHNlIHsKKwkJbGlzdF9hdHRyaWJ1dGVzKG5hbWUpOworCX0KK30KKworaW50IGxzYXR0cl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHNhdHRyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlnZXRvcHQzMihhcmd2LCAiUmFkbHYiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciopIi4iOworCWRvIGxzYXR0cl9hcmdzKCphcmd2KyspOyB3aGlsZSAoKmFyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZWMwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9Db25maWcuc3JjCkBAIC0wLDAgKzEsNjkgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxpbnV4IEV4dDIgRlMgUHJvZ3MiCisKK0lOU0VSVAorCitjb25maWcgQ0hBVFRSCisJYm9vbCAiY2hhdHRyIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIGNoYXR0ciBjaGFuZ2VzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb24gYSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0uCisKK2NvbmZpZyBFMkZTQ0sKKwlib29sICJlMmZzY2siCisJZGVmYXVsdCBuCisJaGVscAorCSAgZTJmc2NrIGlzIHVzZWQgdG8gY2hlY2sgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtcyAoZXh0MmZzKS4KKwkgIGUyZnNjayBhbHNvIHN1cHBvcnRzIGV4dDIgZmlsZXN5c3RlbXMgY291bnRhaW5pbmcgYSBqb3VybmFsIChleHQzKS4KKwkgIFRoZSBub3JtYWwgY29tcGF0IHN5bWxpbmtzICdmc2NrLmV4dDInIGFuZCAnZnNjay5leHQzJyBhcmUgYWxzbworCSAgcHJvdmlkZWQuCisKK2NvbmZpZyBGU0NLCisJYm9vbCAiZnNjayIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBmc2NrIGlzIHVzZWQgdG8gY2hlY2sgYW5kIG9wdGlvbmFsbHkgcmVwYWlyIG9uZSBvciBtb3JlIGZpbGVzeXN0ZW1zLgorCSAgSW4gYWN0dWFsaXR5LCBmc2NrIGlzIHNpbXBseSBhIGZyb250LWVuZCBmb3IgdGhlIHZhcmlvdXMgZmlsZSBzeXN0ZW0KKwkgIGNoZWNrZXJzIChmc2NrLmZzdHlwZSkgYXZhaWxhYmxlIHVuZGVyIExpbnV4LgorCitjb25maWcgTFNBVFRSCisJYm9vbCAibHNhdHRyIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIGxzYXR0ciBsaXN0cyB0aGUgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtLgorCitjb25maWcgTUtFMkZTCisJYm9vbCAibWtlMmZzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIG1rZTJmcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBleHQyL2V4dDMgZmlsZXN5c3RlbS4gVGhlIG5vcm1hbCBjb21wYXQKKwkgIHN5bWxpbmtzICdta2ZzLmV4dDInIGFuZCAnbWtmcy5leHQzJyBhcmUgYWxzbyBwcm92aWRlZC4KKworY29uZmlnIFRVTkUyRlMKKwlib29sICJ0dW5lMmZzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIHR1bmUyZnMgYWxsb3dzIHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBhZGp1c3QgdmFyaW91cyB0dW5hYmxlCisJICBmaWxlc3lzdGVtIHBhcmFtZXRlcnMgb24gTGludXggZXh0Mi9leHQzIGZpbGVzeXN0ZW1zLgorCitjb25maWcgRTJMQUJFTAorCWJvb2wgImUybGFiZWwiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBUVU5FMkZTCisJaGVscAorCSAgZTJsYWJlbCB3aWxsIGRpc3BsYXkgb3IgY2hhbmdlIHRoZSBmaWxlc3lzdGVtIGxhYmVsIG9uIHRoZSBleHQyCisJICBmaWxlc3lzdGVtIGxvY2F0ZWQgb24gZGV2aWNlLgorCitjb25maWcgRklOREZTCisJYm9vbCAiZmluZGZzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVFVORTJGUworCWhlbHAKKwkgIGZpbmRmcyB3aWxsIHNlYXJjaCB0aGUgZGlza3MgaW4gdGhlIHN5c3RlbSBsb29raW5nIGZvciBhIGZpbGVzeXN0ZW0KKwkgIHdoaWNoIGhhcyBhIGxhYmVsIG1hdGNoaW5nIGxhYmVsIG9yIGEgVVVJRCBlcXVhbCB0byB1dWlkLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmYxYTBkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE4IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoQ09ORklHX0NIQVRUUikgICAgICs9IGNoYXR0ci5vCitsaWItJChDT05GSUdfRTJGU0NLKSAgICAgKz0gZTJmc2NrLm8gdXRpbC5vCitsaWItJChDT05GSUdfRlNDSykgICAgICAgKz0gZnNjay5vIHV0aWwubworbGliLSQoQ09ORklHX0xTQVRUUikgICAgICs9IGxzYXR0ci5vCitsaWItJChDT05GSUdfTUtFMkZTKSAgICAgKz0gbWtlMmZzLm8gdXRpbC5vCitsaWItJChDT05GSUdfVFVORTJGUykgICAgKz0gdHVuZTJmcy5vIHV0aWwubworCitDRkxBR1MgKz0gLWluY2x1ZGUgJChzcmN0cmVlKS9lMmZzcHJvZ3MvZTJmc2JiLmgKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL1JFQURNRSBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWMwOTAxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvUkVBRE1FCkBAIC0wLDAgKzEsMyBAQAorVGhpcyBpcyBhIHByZXR0eSBzdHJhaWdodCByaXAgZnJvbSB0aGUgZTJmc3Byb2dzIHBrZy4KKworU2VlIFJFQURNRSdzIGluIHN1YmRpcnMgZm9yIHNwZWNpZmljIGluZm8uCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmI0ZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDI2IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworTkVFREVELSQoQ09ORklHX0UyRlNDSykgPSB5CitORUVERUQtJChDT05GSUdfRlNDSykgPSB5CitORUVERUQtJChDT05GSUdfTUtFMkZTKSA9IHkKK05FRURFRC0kKENPTkZJR19UVU5FMkZTKSA9IHkKKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoTkVFREVELXkpICs9IGNhY2hlLm8gZGV2Lm8gZGV2bmFtZS5vIGRldm5vLm8gYmxraWRfZ2V0c2l6ZS5vIFwKKyAgICAgICAgICAgICAgICAgICBwcm9iZS5vIHJlYWQubyByZXNvbHZlLm8gc2F2ZS5vIHRhZy5vIGxpc3QubworCitDRkxBR1NfZGV2Lm8gICAgIDo9IC1pbmNsdWRlICQoc3JjdHJlZSkvaW5jbHVkZS9idXN5Ym94LmgKK0NGTEFHU19kZXZuYW1lLm8gOj0gLWluY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2J1c3lib3guaAorQ0ZMQUdTX2Rldm5vLm8gICA6PSAtaW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvYnVzeWJveC5oCitDRkxBR1NfYmxraWRfZ2V0c2l6ZS5vIDo9IC1pbmNsdWRlICQoc3JjdHJlZSkvaW5jbHVkZS9idXN5Ym94LmgKK0NGTEFHU19wcm9iZS5vICAgOj0gLWluY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2J1c3lib3guaAorQ0ZMQUdTX3NhdmUubyAgICA6PSAtaW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvYnVzeWJveC5oCitDRkxBR1NfdGFnLm8gICAgIDo9IC1pbmNsdWRlICQoc3JjdHJlZSkvaW5jbHVkZS9idXN5Ym94LmgKK0NGTEFHU19saXN0Lm8gICAgOj0gLWluY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2J1c3lib3guaApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvYmxraWQuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Jsa2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzYzJhZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Jsa2lkLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJsa2lkLmggLSBJbnRlcmZhY2UgZm9yIGxpYmJsa2lkLCBhIGxpYnJhcnkgdG8gaWRlbnRpZnkgYmxvY2sgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisjaWZuZGVmIEJMS0lEX0JMS0lEX0gKKyNkZWZpbmUgQkxLSURfQkxLSURfSCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQkxLSURfVkVSU0lPTgkiMS4wLjAiCisjZGVmaW5lIEJMS0lEX0RBVEUJIjEyLUZlYi0yMDAzIgorCit0eXBlZGVmIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2ICpibGtpZF9kZXY7Cit0eXBlZGVmIHN0cnVjdCBibGtpZF9zdHJ1Y3RfY2FjaGUgKmJsa2lkX2NhY2hlOwordHlwZWRlZiBfX3M2NCBibGtpZF9sb2ZmX3Q7CisKK3R5cGVkZWYgc3RydWN0IGJsa2lkX3N0cnVjdF90YWdfaXRlcmF0ZSAqYmxraWRfdGFnX2l0ZXJhdGU7Cit0eXBlZGVmIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2X2l0ZXJhdGUgKmJsa2lkX2Rldl9pdGVyYXRlOworCisvKgorICogRmxhZ3MgZm9yIGJsa2lkX2dldF9kZXYKKyAqCisgKiBCTEtJRF9ERVZfQ1JFQVRFCUNyZWF0ZSBhbiBlbXB0eSBkZXZpY2Ugc3RydWN0dXJlIGlmIG5vdCBmb3VuZAorICoJCQlpbiB0aGUgY2FjaGUuCisgKiBCTEtJRF9ERVZfVkVSSUZZCU1ha2Ugc3VyZSB0aGUgZGV2aWNlIHN0cnVjdHVyZSBjb3JyZXNwb25kcworICoJCQl3aXRoIHJlYWxpdHkuCisgKiBCTEtJRF9ERVZfRklORAlKdXN0IGxvb2sgdXAgYSBkZXZpY2UgZW50cnksIGFuZCByZXR1cm4gTlVMTAorICoJCQlpZiBpdCBpcyBub3QgZm91bmQuCisgKiBCTEtJRF9ERVZfTk9STUFMCUdldCBhIHZhbGlkIGRldmljZSBzdHJ1Y3R1cmUsIGVpdGhlciBmcm9tIHRoZQorICoJCQljYWNoZSBvciBieSBwcm9iaW5nIHRoZSBkZXZpY2UuCisgKi8KKyNkZWZpbmUgQkxLSURfREVWX0ZJTkQJCTB4MDAwMAorI2RlZmluZSBCTEtJRF9ERVZfQ1JFQVRFCTB4MDAwMQorI2RlZmluZSBCTEtJRF9ERVZfVkVSSUZZCTB4MDAwMgorI2RlZmluZSBCTEtJRF9ERVZfTk9STUFMCShCTEtJRF9ERVZfQ1JFQVRFIHwgQkxLSURfREVWX1ZFUklGWSkKKworLyogY2FjaGUuYyAqLworZXh0ZXJuIHZvaWQgYmxraWRfcHV0X2NhY2hlKGJsa2lkX2NhY2hlIGNhY2hlKTsKK2V4dGVybiBpbnQgYmxraWRfZ2V0X2NhY2hlKGJsa2lkX2NhY2hlICpjYWNoZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKiBkZXYuYyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmJsa2lkX2Rldl9kZXZuYW1lKGJsa2lkX2RldiBkZXYpOworCitleHRlcm4gYmxraWRfZGV2X2l0ZXJhdGUgYmxraWRfZGV2X2l0ZXJhdGVfYmVnaW4oYmxraWRfY2FjaGUgY2FjaGUpOworZXh0ZXJuIGludCBibGtpZF9kZXZfc2V0X3NlYXJjaChibGtpZF9kZXZfaXRlcmF0ZSBpdGVyLAorCQkJCWNoYXIgKnNlYXJjaF90eXBlLCBjaGFyICpzZWFyY2hfdmFsdWUpOworZXh0ZXJuIGludCBibGtpZF9kZXZfbmV4dChibGtpZF9kZXZfaXRlcmF0ZSBpdGVyYXRlLCBibGtpZF9kZXYgKmRldik7CitleHRlcm4gdm9pZCBibGtpZF9kZXZfaXRlcmF0ZV9lbmQoYmxraWRfZGV2X2l0ZXJhdGUgaXRlcmF0ZSk7CisKKy8qIGRldm5vLmMgKi8KK2V4dGVybiBjaGFyICpibGtpZF9kZXZub190b19kZXZuYW1lKGRldl90IGRldm5vKTsKKworLyogZGV2bmFtZS5jICovCitleHRlcm4gaW50IGJsa2lkX3Byb2JlX2FsbChibGtpZF9jYWNoZSBjYWNoZSk7CitleHRlcm4gaW50IGJsa2lkX3Byb2JlX2FsbF9uZXcoYmxraWRfY2FjaGUgY2FjaGUpOworZXh0ZXJuIGJsa2lkX2RldiBibGtpZF9nZXRfZGV2KGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICpkZXZuYW1lLAorCQkJICAgICAgIGludCBmbGFncyk7CisKKy8qIGdldHNpemUuYyAqLworZXh0ZXJuIGJsa2lkX2xvZmZfdCBibGtpZF9nZXRfZGV2X3NpemUoaW50IGZkKTsKKworLyogcHJvYmUuYyAqLworaW50IGJsa2lkX2tub3duX2ZzdHlwZShjb25zdCBjaGFyICpmc3R5cGUpOworZXh0ZXJuIGJsa2lkX2RldiBibGtpZF92ZXJpZnkoYmxraWRfY2FjaGUgY2FjaGUsIGJsa2lkX2RldiBkZXYpOworCisvKiByZWFkLmMgKi8KKworLyogcmVzb2x2ZS5jICovCitleHRlcm4gY2hhciAqYmxraWRfZ2V0X3RhZ192YWx1ZShibGtpZF9jYWNoZSBjYWNoZSwgY29uc3QgY2hhciAqdGFnbmFtZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqZGV2bmFtZSk7CitleHRlcm4gY2hhciAqYmxraWRfZ2V0X2Rldm5hbWUoYmxraWRfY2FjaGUgY2FjaGUsIGNvbnN0IGNoYXIgKnRva2VuLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworLyogdGFnLmMgKi8KK2V4dGVybiBibGtpZF90YWdfaXRlcmF0ZSBibGtpZF90YWdfaXRlcmF0ZV9iZWdpbihibGtpZF9kZXYgZGV2KTsKK2V4dGVybiBpbnQgYmxraWRfdGFnX25leHQoYmxraWRfdGFnX2l0ZXJhdGUgaXRlcmF0ZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKip0eXBlLCBjb25zdCBjaGFyICoqdmFsdWUpOworZXh0ZXJuIHZvaWQgYmxraWRfdGFnX2l0ZXJhdGVfZW5kKGJsa2lkX3RhZ19pdGVyYXRlIGl0ZXJhdGUpOworZXh0ZXJuIGludCBibGtpZF9kZXZfaGFzX3RhZyhibGtpZF9kZXYgZGV2LCBjb25zdCBjaGFyICp0eXBlLAorCQkJICAgICAgY29uc3QgY2hhciAqdmFsdWUpOworZXh0ZXJuIGJsa2lkX2RldiBibGtpZF9maW5kX2Rldl93aXRoX3RhZyhibGtpZF9jYWNoZSBjYWNoZSwKKwkJCQkJIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkJCSBjb25zdCBjaGFyICp2YWx1ZSk7CitleHRlcm4gaW50IGJsa2lkX3BhcnNlX3RhZ19zdHJpbmcoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKipyZXRfdHlwZSwKKwkJCQkgIGNoYXIgKipyZXRfdmFsKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9ibGtpZFAuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Jsa2lkUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjJiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9ibGtpZFAuaApAQCAtMCwwICsxLDE4NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmxraWRQLmggLSBJbnRlcm5hbCBpbnRlcmZhY2VzIGZvciBsaWJibGtpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisjaWZuZGVmIEJMS0lEX0JMS0lEUF9ICisjZGVmaW5lIEJMS0lEX0JMS0lEUF9IIDEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJibGtpZC5oIgorI2luY2x1ZGUgImxpc3QuaCIKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIF9fQkxLSURfQVRUUih4KSBfX2F0dHJpYnV0ZV9fKHgpCisjZWxzZQorI2RlZmluZSBfX0JMS0lEX0FUVFIoeCkKKyNlbmRpZgorCisKKy8qCisgKiBUaGlzIGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlcyBvZiBhIHNwZWNpZmljIGRldmljZS4KKyAqIFdlIGNhbiB0cmF2ZXJzZSBhbGwgb2YgdGhlIHRhZ3MgYnkgYmlkX3RhZ3MgKGxpbmtpbmcgdG8gdGhlIHRhZyBiaXRfbmFtZXMpLgorICogVGhlIGJpZF9sYWJlbCBhbmQgYmlkX3V1aWQgZmllbGRzIGFyZSBzaG9ydGN1dHMgdG8gdGhlIExBQkVMIGFuZCBVVUlEIHRhZworICogdmFsdWVzLCBpZiB0aGV5IGV4aXN0LgorICovCitzdHJ1Y3QgYmxraWRfc3RydWN0X2RldgoreworCXN0cnVjdCBsaXN0X2hlYWQJYmlkX2RldnM7CS8qIEFsbCBkZXZpY2VzIGluIHRoZSBjYWNoZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYmlkX3RhZ3M7CS8qIEFsbCB0YWdzIGZvciB0aGlzIGRldmljZSAqLworCWJsa2lkX2NhY2hlCQliaWRfY2FjaGU7CS8qIERldiBiZWxvbmdzIHRvIHRoaXMgY2FjaGUgKi8KKwljaGFyCQkJKmJpZF9uYW1lOwkvKiBEZXZpY2UgaW5vZGUgcGF0aG5hbWUgKi8KKwljaGFyCQkJKmJpZF90eXBlOwkvKiBQcmVmZXJyZWQgZGV2aWNlIFRZUEUgKi8KKwlpbnQJCQliaWRfcHJpOwkvKiBEZXZpY2UgcHJpb3JpdHkgKi8KKwlkZXZfdAkJCWJpZF9kZXZubzsJLyogRGV2aWNlIG1ham9yL21pbm9yIG51bWJlciAqLworCXRpbWVfdAkJCWJpZF90aW1lOwkvKiBMYXN0IHVwZGF0ZSB0aW1lIG9mIGRldmljZSAqLworCXVuc2lnbmVkIGludAkJYmlkX2ZsYWdzOwkvKiBEZXZpY2Ugc3RhdHVzIGJpdGZsYWdzICovCisJY2hhcgkJCSpiaWRfbGFiZWw7CS8qIFNob3J0Y3V0IHRvIGRldmljZSBMQUJFTCAqLworCWNoYXIJCQkqYmlkX3V1aWQ7CS8qIFNob3J0Y3V0IHRvIGJpbmFyeSBVVUlEICovCit9OworCisjZGVmaW5lIEJMS0lEX0JJRF9GTF9WRVJJRklFRAkweDAwMDEJLyogRGV2aWNlIGRhdGEgdmFsaWRhdGVkIGZyb20gZGlzayAqLworI2RlZmluZSBCTEtJRF9CSURfRkxfSU5WQUxJRAkweDAwMDQJLyogRGV2aWNlIGlzIGludmFsaWQgKi8KKworLyoKKyAqIEVhY2ggdGFnIGRlZmluZXMgYSBOQU1FPXZhbHVlIHBhaXIgZm9yIGEgcGFydGljdWxhciBkZXZpY2UuICBUaGUgdGFncworICogYXJlIGxpbmtlZCB2aWEgYml0X25hbWVzIGZvciBhIHNpbmdsZSBkZXZpY2UsIHNvIHRoYXQgdHJhdmVyc2luZyB0aGUKKyAqIG5hbWVzIGxpc3Qgd2lsbCBnZXQgeW91IGEgbGlzdCBvZiBhbGwgdGFncyBhc3NvY2lhdGVkIHdpdGggYSBkZXZpY2UuCisgKiBUaGV5IGFyZSBhbHNvIGxpbmtlZCB2aWEgYml0X3ZhbHVlcyBmb3IgYWxsIGRldmljZXMsIHNvIG9uZSBjYW4gZWFzaWx5CisgKiBzZWFyY2ggYWxsIHRhZ3Mgd2l0aCBhIGdpdmVuIE5BTUUgZm9yIGEgc3BlY2lmaWMgdmFsdWUuCisgKi8KK3N0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnCit7CisJc3RydWN0IGxpc3RfaGVhZAliaXRfdGFnczsJLyogQWxsIHRhZ3MgZm9yIHRoaXMgZGV2aWNlICovCisJc3RydWN0IGxpc3RfaGVhZAliaXRfbmFtZXM7CS8qIEFsbCB0YWdzIHdpdGggZ2l2ZW4gTkFNRSAqLworCWNoYXIJCQkqYml0X25hbWU7CS8qIE5BTUUgb2YgdGFnIChzaGFyZWQpICovCisJY2hhcgkJCSpiaXRfdmFsOwkvKiB2YWx1ZSBvZiB0YWcgKi8KKwlibGtpZF9kZXYJCWJpdF9kZXY7CS8qIHBvaW50ZXIgdG8gZGV2aWNlICovCit9OwordHlwZWRlZiBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZyAqYmxraWRfdGFnOworCisvKgorICogTWluaW11bSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGRldmljZSBwcm9iZXMsIGV2ZW4gd2hlbiByZWFkaW5nCisgKiBmcm9tIHRoZSBjYWNoZS4gIFRoaXMgaXMgdG8gYXZvaWQgcmUtcHJvYmluZyBhbGwgZGV2aWNlcyB3aGljaCB3ZXJlCisgKiBqdXN0IHByb2JlZCBieSBhbm90aGVyIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBzaGFyZSB0aGUgY2FjaGUuCisgKi8KKyNkZWZpbmUgQkxLSURfUFJPQkVfTUlOCQkyCisKKy8qCisgKiBUaW1lIGluIHNlY29uZHMgYW4gZW50cnkgcmVtYWlucyB2ZXJpZmllZCBpbiB0aGUgaW4tbWVtb3J5IGNhY2hlCisgKiBiZWZvcmUgYmVpbmcgcmV2ZXJpZmllZCAoaW4gY2FzZSBvZiBsb25nLXJ1bm5pbmcgcHJvY2Vzc2VzIHRoYXQKKyAqIGtlZXAgYSBjYWNoZSBpbiBtZW1vcnkgYW5kIGNvbnRpbnVlIHRvIHVzZSBpdCBmb3IgYSBsb25nIHRpbWUpLgorICovCisjZGVmaW5lIEJMS0lEX1BST0JFX0lOVEVSVkFMCTIwMAorCisvKiBUaGlzIGRlc2NyaWJlcyBhbiBlbnRpcmUgYmxraWQgY2FjaGUgZmlsZSBhbmQgcHJvYmVkIGRldmljZXMuCisgKiBXZSBjYW4gdHJhdmVyc2UgYWxsIG9mIHRoZSBmb3VuZCBkZXZpY2VzIHZpYSBiaWNfbGlzdC4KKyAqIFdlIGNhbiB0cmF2ZXJzZSBhbGwgb2YgdGhlIHRhZyB0eXBlcyBieSBiaWNfdGFncywgd2hpY2ggaG9sZCBlbXB0eSB0YWdzCisgKiBmb3IgZWFjaCB0YWcgdHlwZS4gIFRob3NlIHRhZ3MgY2FuIGJlIHVzZWQgYXMgbGlzdF9oZWFkcyBmb3IgaXRlcmF0aW5nCisgKiB0aHJvdWdoIGFsbCBkZXZpY2VzIHdpdGggYSBzcGVjaWZpYyB0YWcgdHlwZSAoZS5nLiBMQUJFTCkuCisgKi8KK3N0cnVjdCBibGtpZF9zdHJ1Y3RfY2FjaGUKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJpY19kZXZzOwkvKiBMaXN0IGhlYWQgb2YgYWxsIGRldmljZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJpY190YWdzOwkvKiBMaXN0IGhlYWQgb2YgYWxsIHRhZyB0eXBlcyAqLworCXRpbWVfdAkJCWJpY190aW1lOwkvKiBMYXN0IHByb2JlIHRpbWUgKi8KKwl0aW1lX3QJCQliaWNfZnRpbWU7CS8qIE1vZCB0aW1lIG9mIHRoZSBjYWNoZWZpbGUgKi8KKwl1bnNpZ25lZCBpbnQJCWJpY19mbGFnczsJLyogU3RhdHVzIGZsYWdzIG9mIHRoZSBjYWNoZSAqLworCWNoYXIJCQkqYmljX2ZpbGVuYW1lOwkvKiBmaWxlbmFtZSBvZiBjYWNoZSAqLworfTsKKworI2RlZmluZSBCTEtJRF9CSUNfRkxfUFJPQkVECTB4MDAwMgkvKiBXZSBwcm9iZWQgL3Byb2MvcGFydGl0aW9uIGRldmljZXMgKi8KKyNkZWZpbmUgQkxLSURfQklDX0ZMX0NIQU5HRUQJMHgwMDA0CS8qIENhY2hlIGhhcyBjaGFuZ2VkIGZyb20gZGlzayAqLworCitleHRlcm4gY2hhciAqYmxraWRfc3RyZHVwKGNvbnN0IGNoYXIgKnMpOworZXh0ZXJuIGNoYXIgKmJsa2lkX3N0cm5kdXAoY29uc3QgY2hhciAqcywgY29uc3QgaW50IGxlbmd0aCk7CisKKyNkZWZpbmUgQkxLSURfQ0FDSEVfRklMRSAiL2V0Yy9ibGtpZC50YWIiCitleHRlcm4gY29uc3QgY2hhciAqYmxraWRfZGV2ZGlyc1tdOworCisjZGVmaW5lIEJMS0lEX0VSUl9JTwkgNQorI2RlZmluZSBCTEtJRF9FUlJfUFJPQwkgOQorI2RlZmluZSBCTEtJRF9FUlJfTUVNCTEyCisjZGVmaW5lIEJMS0lEX0VSUl9DQUNIRQkxNAorI2RlZmluZSBCTEtJRF9FUlJfREVWCTE5CisjZGVmaW5lIEJMS0lEX0VSUl9QQVJBTQkyMgorI2RlZmluZSBCTEtJRF9FUlJfQklHCTI3CisKKy8qCisgKiBQcmlvcml0eSBzZXR0aW5ncyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGRldmljZXMKKyAqLworI2RlZmluZSBCTEtJRF9QUklfRVZNUwkzMAorI2RlZmluZSBCTEtJRF9QUklfTFZNCTIwCisjZGVmaW5lIEJMS0lEX1BSSV9NRAkxMAorCisjaWYgZGVmaW5lZChURVNUX1BST0dSQU0pICYmICFkZWZpbmVkKENPTkZJR19CTEtJRF9ERUJVRykKKyNkZWZpbmUgQ09ORklHX0JMS0lEX0RFQlVHCisjZW5kaWYKKworI2RlZmluZSBERUJVR19DQUNIRQkweDAwMDEKKyNkZWZpbmUgREVCVUdfRFVNUAkweDAwMDIKKyNkZWZpbmUgREVCVUdfREVWCTB4MDAwNAorI2RlZmluZSBERUJVR19ERVZOQU1FCTB4MDAwOAorI2RlZmluZSBERUJVR19ERVZOTwkweDAwMTAKKyNkZWZpbmUgREVCVUdfUFJPQkUJMHgwMDIwCisjZGVmaW5lIERFQlVHX1JFQUQJMHgwMDQwCisjZGVmaW5lIERFQlVHX1JFU09MVkUJMHgwMDgwCisjZGVmaW5lIERFQlVHX1NBVkUJMHgwMTAwCisjZGVmaW5lIERFQlVHX1RBRwkweDAyMDAKKyNkZWZpbmUgREVCVUdfSU5JVAkweDgwMDAKKyNkZWZpbmUgREVCVUdfQUxMCTB4RkZGRgorCisjaWZkZWYgQ09ORklHX0JMS0lEX0RFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4KK2V4dGVybiBpbnQgICAgICBibGtpZF9kZWJ1Z19tYXNrOworI2RlZmluZSBEQkcobSx4KQlpZiAoKG0pICYgYmxraWRfZGVidWdfbWFzaykgeDsKKyNlbHNlCisjZGVmaW5lIERCRyhtLHgpCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CTEtJRF9ERUJVRworZXh0ZXJuIHZvaWQgYmxraWRfZGVidWdfZHVtcF9kZXYoYmxraWRfZGV2IGRldik7CitleHRlcm4gdm9pZCBibGtpZF9kZWJ1Z19kdW1wX3RhZyhibGtpZF90YWcgdGFnKTsKKyNlbmRpZgorCisvKiBsc2Vlay5jICovCisvKiBleHRlcm4gYmxraWRfbG9mZl90IGJsa2lkX2xsc2VlayhpbnQgZmQsIGJsa2lkX2xvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOyAqLworI2lmZGVmIENPTkZJR19MRlMKKyMgZGVmaW5lIGJsa2lkX2xsc2VlayBsc2VlazY0CisjZWxzZQorIyBkZWZpbmUgYmxraWRfbGxzZWVrIGxzZWVrCisjZW5kaWYKKworLyogcmVhZC5jICovCitleHRlcm4gdm9pZCBibGtpZF9yZWFkX2NhY2hlKGJsa2lkX2NhY2hlIGNhY2hlKTsKKworLyogc2F2ZS5jICovCitleHRlcm4gaW50IGJsa2lkX2ZsdXNoX2NhY2hlKGJsa2lkX2NhY2hlIGNhY2hlKTsKKworLyoKKyAqIEZ1bmN0aW9ucyB0byBjcmVhdGUgYW5kIGZpbmQgYSBzcGVjaWZpYyB0YWcgdHlwZTogdGFnLmMKKyAqLworZXh0ZXJuIHZvaWQgYmxraWRfZnJlZV90YWcoYmxraWRfdGFnIHRhZyk7CitleHRlcm4gYmxraWRfdGFnIGJsa2lkX2ZpbmRfdGFnX2RldihibGtpZF9kZXYgZGV2LCBjb25zdCBjaGFyICp0eXBlKTsKK2V4dGVybiBpbnQgYmxraWRfc2V0X3RhZyhibGtpZF9kZXYgZGV2LCBjb25zdCBjaGFyICpuYW1lLAorCQkJIGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBpbnQgdmxlbmd0aCk7CisKKy8qCisgKiBGdW5jdGlvbnMgdG8gY3JlYXRlIGFuZCBmaW5kIGEgc3BlY2lmaWMgdGFnIHR5cGU6IGRldi5jCisgKi8KK2V4dGVybiBibGtpZF9kZXYgYmxraWRfbmV3X2Rldih2b2lkKTsKK2V4dGVybiB2b2lkIGJsa2lkX2ZyZWVfZGV2KGJsa2lkX2RldiBkZXYpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Jsa2lkX2dldHNpemUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Jsa2lkX2dldHNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWY2YmE2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvYmxraWRfZ2V0c2l6ZS5jCkBAIC0wLDAgKzEsMTc5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBnZXRzaXplLmMgLS0tIGdldCB0aGUgc2l6ZSBvZiBhIHBhcnRpdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTUgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKy8qIGluY2x1ZGUgdGhpcyBiZWZvcmUgc3lzL3F1ZXVlcy5oISAqLworI2luY2x1ZGUgImJsa2lkUC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0xJTlVYX0ZEX0gKKyNpbmNsdWRlIDxsaW51eC9mZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfRElTS0xBQkVMX0gKKyNpbmNsdWRlIDxzeXMvZGlza2xhYmVsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0RJU0tfSAorI2lmZGVmIEhBVkVfU1lTX1FVRVVFX0gKKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4gLyogZm9yIExJU1RfSEVBRCAqLworI2VuZGlmCisjaW5jbHVkZSA8c3lzL2Rpc2suaD4KKyNlbmRpZgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9JTykgJiYgIWRlZmluZWQoQkxLR0VUU0laRSkKKyNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikJLyogcmV0dXJuIGRldmljZSBzaXplICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9JT1IpICYmICFkZWZpbmVkKEJMS0dFVFNJWkU2NCkKKyNkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQkvKiByZXR1cm4gZGV2aWNlIHNpemUgaW4gYnl0ZXMgKHU2NCAqYXJnKSAqLworI2VuZGlmCisKKyNpZmRlZiBBUFBMRV9EQVJXSU4KKyNkZWZpbmUgQkxLR0VUU0laRSBES0lPQ0dFVEJMT0NLQ09VTlQzMgorI2VuZGlmIC8qIEFQUExFX0RBUldJTiAqLworCitzdGF0aWMgaW50IHZhbGlkX29mZnNldChpbnQgZmQsIGJsa2lkX2xvZmZfdCBvZmZzZXQpCit7CisJY2hhciBjaDsKKworCWlmIChibGtpZF9sbHNlZWsoZmQsIG9mZnNldCwgMCkgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAocmVhZChmZCwgJmNoLCAxKSA8IDEpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpbiBhIHBhcnRpdGlvbgorICovCitibGtpZF9sb2ZmX3QgYmxraWRfZ2V0X2Rldl9zaXplKGludCBmZCkKK3sKKwlpbnQgdmFsaWRfYmxrZ2V0c2l6ZTY0ID0gMTsKKyNpZmRlZiBfX2xpbnV4X18KKwlzdHJ1Y3QJCXV0c25hbWUgdXQ7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTY0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlibGtpZF9sb2ZmX3QgaGlnaCwgbG93OworI2lmZGVmIEZER0VUUFJNCisJc3RydWN0IGZsb3BweV9zdHJ1Y3QgdGhpc19mbG9wcHk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19ESVNLTEFCRUxfSAorCWludCBwYXJ0ID0gLTE7CisJc3RydWN0IGRpc2tsYWJlbCBsYWI7CisJc3RydWN0IHBhcnRpdGlvbiAqcHA7CisJY2hhciBjaDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKyNlbmRpZiAvKiBIQVZFX1NZU19ESVNLTEFCRUxfSCAqLworCisjaWZkZWYgREtJT0NHRVRCTE9DS0NPVU5UCS8qIEZvciBBcHBsZSBEYXJ3aW4gKi8KKwlpZiAoaW9jdGwoZmQsIERLSU9DR0VUQkxPQ0tDT1VOVCwgJnNpemU2NCkgPj0gMCkgeworCQlpZiAoKHNpemVvZihibGtpZF9sb2ZmX3QpIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpCisJCSAgICAmJiAoc2l6ZTY0IDw8IDkgPiAweEZGRkZGRkZGKSkKKwkJCXJldHVybiAwOyAvKiBFRkJJRyAqLworCQlyZXR1cm4gKGJsa2lkX2xvZmZfdCkgc2l6ZTY0IDw8IDk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBCTEtHRVRTSVpFNjQKKyNpZmRlZiBfX2xpbnV4X18KKwl1bmFtZSgmdXQpOworCWlmICgodXQucmVsZWFzZVswXSA9PSAnMicpICYmICh1dC5yZWxlYXNlWzFdID09ICcuJykgJiYKKwkgICAgICh1dC5yZWxlYXNlWzJdIDwgJzYnKSAmJiAodXQucmVsZWFzZVszXSA9PSAnLicpKQorCQl2YWxpZF9ibGtnZXRzaXplNjQgPSAwOworI2VuZGlmCisJaWYgKHZhbGlkX2Jsa2dldHNpemU2NCAmJgorCSAgICBpb2N0bChmZCwgQkxLR0VUU0laRTY0LCAmc2l6ZTY0KSA+PSAwKSB7CisJCWlmICgoc2l6ZW9mKGJsa2lkX2xvZmZfdCkgPCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkKKwkJICAgICYmICgoc2l6ZTY0KSA+IDB4RkZGRkZGRkYpKQorCQkJcmV0dXJuIDA7IC8qIEVGQklHICovCisJCXJldHVybiBzaXplNjQ7CisJfQorI2VuZGlmCisKKyNpZmRlZiBCTEtHRVRTSVpFCisJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkKKwkJcmV0dXJuIChibGtpZF9sb2ZmX3Qpc2l6ZSA8PCA5OworI2VuZGlmCisKKyNpZmRlZiBGREdFVFBSTQorCWlmIChpb2N0bChmZCwgRkRHRVRQUk0sICZ0aGlzX2Zsb3BweSkgPj0gMCkKKwkJcmV0dXJuIChibGtpZF9sb2ZmX3QpdGhpc19mbG9wcHkuc2l6ZSA8PCA5OworI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfRElTS0xBQkVMX0gKKyNpZiAwCisJLyoKKwkgKiBUaGlzIHNob3VsZCB3b3JrIGluIHRoZW9yeSBidXQgSSBoYXZlbid0IHRlc3RlZCBpdC4gIEFueW9uZQorCSAqIG9uIGEgQlNEIHN5c3RlbSB3YW50IHRvIHRlc3QgdGhpcyBmb3IgbWU/ICBJbiB0aGUgbWVhbnRpbWUsCisJICogYmluYXJ5IHNlYXJjaCBtZWNoYW5pc20gc2hvdWxkIHdvcmsganVzdCBmaW5lLgorCSAqLworCWlmICgoZnN0YXQoZmQsICZzdCkgPj0gMCkgJiYgU19JU0JMSyhzdC5zdF9tb2RlKSkKKwkJcGFydCA9IHN0LnN0X3JkZXYgJiA3OworCWlmIChwYXJ0ID49IDAgJiYgKGlvY3RsKGZkLCBESU9DR0RJTkZPLCAoY2hhciAqKSZsYWIpID49IDApKSB7CisJCXBwID0gJmxhYi5kX3BhcnRpdGlvbnNbcGFydF07CisJCWlmIChwcC0+cF9zaXplKQorCQkJcmV0dXJuIHBwLT5wX3NpemUgPDwgOTsKKwl9CisjZW5kaWYKKyNlbmRpZiAvKiBIQVZFX1NZU19ESVNLTEFCRUxfSCAqLworCisJLyoKKwkgKiBPSywgd2UgY291bGRuJ3QgZmlndXJlIGl0IG91dCBieSB1c2luZyBhIHNwZWNpYWxpemVkIGlvY3RsLAorCSAqIHdoaWNoIGlzIGdlbmVyYWxseSB0aGUgYmVzdCB3YXkuICBTbyBkbyBiaW5hcnkgc2VhcmNoIHRvCisJICogZmluZCB0aGUgc2l6ZSBvZiB0aGUgcGFydGl0aW9uLgorCSAqLworCWxvdyA9IDA7CisJZm9yIChoaWdoID0gMTAyNDsgdmFsaWRfb2Zmc2V0KGZkLCBoaWdoKTsgaGlnaCAqPSAyKQorCQlsb3cgPSBoaWdoOworCXdoaWxlIChsb3cgPCBoaWdoIC0gMSkKKwl7CisJCWNvbnN0IGJsa2lkX2xvZmZfdCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOworCisJCWlmICh2YWxpZF9vZmZzZXQoZmQsIG1pZCkpCisJCQlsb3cgPSBtaWQ7CisJCWVsc2UKKwkJCWhpZ2ggPSBtaWQ7CisJfQorCXJldHVybiBsb3cgKyAxOworfQorCisjaWZkZWYgVEVTVF9QUk9HUkFNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYmxraWRfbG9mZl90IGJ5dGVzOworCWludAlmZDsKKworCWlmIChhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBkZXZpY2VcbiIKKwkJCSJEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSBkZXZpY2VcbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKGZkID0gb3Blbihhcmd2WzFdLCBPX1JET05MWSkpIDwgMCkKKwkJcGVycm9yKGFyZ3ZbMF0pOworCisJYnl0ZXMgPSBibGtpZF9nZXRfZGV2X3NpemUoZmQpOworCXByaW50ZigiRGV2aWNlICVzIGhhcyAlbGxkIDFrIGJsb2Nrcy5cbiIsIGFyZ3ZbMV0sIGJ5dGVzID4+IDEwKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9jYWNoZS5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQyOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvY2FjaGUuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY2FjaGUuYyAtIGFsbG9jYXRpb24vaW5pdGlhbGl6YXRpb24vZnJlZSByb3V0aW5lcyBmb3IgY2FjaGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiYmxraWRQLmgiCisKK2ludCBibGtpZF9kZWJ1Z19tYXNrID0gMDsKKworaW50IGJsa2lkX2dldF9jYWNoZShibGtpZF9jYWNoZSAqcmV0X2NhY2hlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlibGtpZF9jYWNoZSBjYWNoZTsKKworI2lmZGVmIENPTkZJR19CTEtJRF9ERUJVRworCWlmICghKGJsa2lkX2RlYnVnX21hc2sgJiBERUJVR19JTklUKSkgeworCQljaGFyICpkc3RyID0gZ2V0ZW52KCJCTEtJRF9ERUJVRyIpOworCisJCWlmIChkc3RyKQorCQkJYmxraWRfZGVidWdfbWFzayA9IHN0cnRvdWwoZHN0ciwgMCwgMCk7CisJCWJsa2lkX2RlYnVnX21hc2sgfD0gREVCVUdfSU5JVDsKKwl9CisjZW5kaWYKKworCURCRyhERUJVR19DQUNIRSwgcHJpbnRmKCJjcmVhdGluZyBibGtpZCBjYWNoZSAodXNpbmcgJXMpXG4iLAorCQkJCWZpbGVuYW1lID8gZmlsZW5hbWUgOiAiZGVmYXVsdCBjYWNoZSIpKTsKKworCWNhY2hlID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGJsa2lkX3N0cnVjdF9jYWNoZSkpOworCisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5iaWNfZGV2cyk7CisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5iaWNfdGFncyk7CisKKwlpZiAoZmlsZW5hbWUgJiYgIXN0cmxlbihmaWxlbmFtZSkpCisJCWZpbGVuYW1lID0gMDsKKwlpZiAoIWZpbGVuYW1lICYmIChnZXR1aWQoKSA9PSBnZXRldWlkKCkpKQorCQlmaWxlbmFtZSA9IGdldGVudigiQkxLSURfRklMRSIpOworCWlmICghZmlsZW5hbWUpCisJCWZpbGVuYW1lID0gQkxLSURfQ0FDSEVfRklMRTsKKwljYWNoZS0+YmljX2ZpbGVuYW1lID0gYmxraWRfc3RyZHVwKGZpbGVuYW1lKTsKKworCWJsa2lkX3JlYWRfY2FjaGUoY2FjaGUpOworCisJKnJldF9jYWNoZSA9IGNhY2hlOworCXJldHVybiAwOworfQorCit2b2lkIGJsa2lkX3B1dF9jYWNoZShibGtpZF9jYWNoZSBjYWNoZSkKK3sKKwlpZiAoIWNhY2hlKQorCQlyZXR1cm47CisKKwkodm9pZCkgYmxraWRfZmx1c2hfY2FjaGUoY2FjaGUpOworCisJREJHKERFQlVHX0NBQ0hFLCBwcmludGYoImZyZWVpbmcgY2FjaGUgc3RydWN0XG4iKSk7CisKKwkvKiBEQkcoREVCVUdfQ0FDSEUsIGJsa2lkX2RlYnVnX2R1bXBfY2FjaGUoY2FjaGUpKTsgKi8KKworCXdoaWxlICghbGlzdF9lbXB0eSgmY2FjaGUtPmJpY19kZXZzKSkgeworCQlibGtpZF9kZXYgZGV2ID0gbGlzdF9lbnRyeShjYWNoZS0+YmljX2RldnMubmV4dCwKKwkJCQkJICAgc3RydWN0IGJsa2lkX3N0cnVjdF9kZXYsCisJCQkJCSAgICBiaWRfZGV2cyk7CisJCWJsa2lkX2ZyZWVfZGV2KGRldik7CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWNoZS0+YmljX3RhZ3MpKSB7CisJCWJsa2lkX3RhZyB0YWcgPSBsaXN0X2VudHJ5KGNhY2hlLT5iaWNfdGFncy5uZXh0LAorCQkJCQkgICBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywKKwkJCQkJICAgYml0X3RhZ3MpOworCisJCXdoaWxlICghbGlzdF9lbXB0eSgmdGFnLT5iaXRfbmFtZXMpKSB7CisJCQlibGtpZF90YWcgYmFkID0gbGlzdF9lbnRyeSh0YWctPmJpdF9uYW1lcy5uZXh0LAorCQkJCQkJICAgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsCisJCQkJCQkgICBiaXRfbmFtZXMpOworCisJCQlEQkcoREVCVUdfQ0FDSEUsIHByaW50Zigid2FybmluZzogdW5mcmVlZCB0YWcgJXM9JXNcbiIsCisJCQkJCQliYWQtPmJpdF9uYW1lLCBiYWQtPmJpdF92YWwpKTsKKwkJCWJsa2lkX2ZyZWVfdGFnKGJhZCk7CisJCX0KKwkJYmxraWRfZnJlZV90YWcodGFnKTsKKwl9CisJZnJlZShjYWNoZS0+YmljX2ZpbGVuYW1lKTsKKworCWZyZWUoY2FjaGUpOworfQorCisjaWZkZWYgVEVTVF9QUk9HUkFNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJYmxraWRfY2FjaGUgY2FjaGUgPSBOVUxMOworCWludCByZXQ7CisKKwlibGtpZF9kZWJ1Z19tYXNrID0gREVCVUdfQUxMOworCWlmICgoYXJnYyA+IDIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtmaWxlbmFtZV1cbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWlmICgocmV0ID0gYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgYXJndlsxXSkpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yICVkIHBhcnNpbmcgY2FjaGUgZmlsZSAlc1xuIiwgcmV0LAorCQkJYXJndlsxXSA/IGFyZ3ZbMV0gOiBCTEtJRF9DQUNIRV9GSUxFKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKChyZXQgPSBibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBiYl9kZXZfbnVsbCkpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgY3JlYXRpbmcgY2FjaGUgKCVkKVxuIiwKKwkJCWFyZ3ZbMF0sIHJldCk7CisJCWV4aXQoMSk7CisJfQorCWlmICgocmV0ID0gYmxraWRfcHJvYmVfYWxsKGNhY2hlKSA8IDApKQorCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIHByb2JpbmcgZGV2aWNlc1xuIik7CisKKwlibGtpZF9wdXRfY2FjaGUoY2FjaGUpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvZGV2LmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjBjYzkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvZGV2LmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRldi5jIC0gYWxsb2NhdGlvbi9pbml0aWFsaXphdGlvbi9mcmVlIHJvdXRpbmVzIGZvciBkZXYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJibGtpZFAuaCIKKworYmxraWRfZGV2IGJsa2lkX25ld19kZXYodm9pZCkKK3sKKwlibGtpZF9kZXYgZGV2OworCisJZGV2ID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGJsa2lkX3N0cnVjdF9kZXYpKTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmJpZF9kZXZzKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5iaWRfdGFncyk7CisKKwlyZXR1cm4gZGV2OworfQorCit2b2lkIGJsa2lkX2ZyZWVfZGV2KGJsa2lkX2RldiBkZXYpCit7CisJaWYgKCFkZXYpCisJCXJldHVybjsKKworCURCRyhERUJVR19ERVYsCisJICAgIHByaW50ZigiICBmcmVlaW5nIGRldiAlcyAoJXMpXG4iLCBkZXYtPmJpZF9uYW1lLCBkZXYtPmJpZF90eXBlKSk7CisJREJHKERFQlVHX0RFViwgYmxraWRfZGVidWdfZHVtcF9kZXYoZGV2KSk7CisKKwlsaXN0X2RlbCgmZGV2LT5iaWRfZGV2cyk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPmJpZF90YWdzKSkgeworCQlibGtpZF90YWcgdGFnID0gbGlzdF9lbnRyeShkZXYtPmJpZF90YWdzLm5leHQsCisJCQkJCSAgIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLAorCQkJCQkgICBiaXRfdGFncyk7CisJCWJsa2lkX2ZyZWVfdGFnKHRhZyk7CisJfQorCWlmIChkZXYtPmJpZF9uYW1lKQorCQlmcmVlKGRldi0+YmlkX25hbWUpOworCWZyZWUoZGV2KTsKK30KKworLyoKKyAqIEdpdmVuIGEgYmxraWQgZGV2aWNlLCByZXR1cm4gaXRzIG5hbWUKKyAqLworY29uc3QgY2hhciAqYmxraWRfZGV2X2Rldm5hbWUoYmxraWRfZGV2IGRldikKK3sKKwlyZXR1cm4gZGV2LT5iaWRfbmFtZTsKK30KKworI2lmZGVmIENPTkZJR19CTEtJRF9ERUJVRwordm9pZCBibGtpZF9kZWJ1Z19kdW1wX2RldihibGtpZF9kZXYgZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlpZiAoIWRldikgeworCQlwcmludGYoIiAgZGV2OiBOVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiICBkZXY6IG5hbWUgPSAlc1xuIiwgZGV2LT5iaWRfbmFtZSk7CisJcHJpbnRmKCIgIGRldjogREVWTk89XCIweCUwbGx4XCJcbiIsIGRldi0+YmlkX2Rldm5vKTsKKwlwcmludGYoIiAgZGV2OiBUSU1FPVwiJWx1XCJcbiIsIGRldi0+YmlkX3RpbWUpOworCXByaW50ZigiICBkZXY6IFBSST1cIiVkXCJcbiIsIGRldi0+YmlkX3ByaSk7CisJcHJpbnRmKCIgIGRldjogZmxhZ3MgPSAweCUwOFhcbiIsIGRldi0+YmlkX2ZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2gocCwgJmRldi0+YmlkX3RhZ3MpIHsKKwkJYmxraWRfdGFnIHRhZyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsIGJpdF90YWdzKTsKKwkJaWYgKHRhZykKKwkJCXByaW50ZigiICAgIHRhZzogJXM9XCIlc1wiXG4iLCB0YWctPmJpdF9uYW1lLAorCQkJICAgICAgIHRhZy0+Yml0X3ZhbCk7CisJCWVsc2UKKwkJCXByaW50ZigiICAgIHRhZzogTlVMTFxuIik7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisjZW5kaWYKKworLyoKKyAqIGRldiBpdGVyYXRpb24gcm91dGluZXMgZm9yIHRoZSBwdWJsaWMgbGliYmxraWQgaW50ZXJmYWNlLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIGRvIG5vdCBleHBvc2UgdGhlIGxpc3QuaCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggYXJlIGEKKyAqIGNvbnRhbWluYXRpb24gb2YgdGhlIG5hbWVzcGFjZSwgYW5kIHdoaWNoIGZvcmNlIHVzIHRvIHJldmVhbCBmYXIsIGZhcgorICogdG9vIG11Y2ggb2Ygb3VyIGludGVybmFsIGltcGxlbWVuYXRpb24uICBJJ20gbm90IGNvbnZpbmNlZCBJIHdhbnQKKyAqIHRvIGtlZXAgbGlzdC5oIGluIHRoZSBsb25nIHRlcm0sIGFueXdheS4gIEl0J3MgZmluZSBmb3Iga2VybmVsCisgKiBwcm9ncmFtbWluZywgYnV0IHBlcmZvcm1hbmNlIGlzIG5vdCB0aGUgIzEgcHJpb3JpdHkgZm9yIHRoaXMKKyAqIGxpYnJhcnksIGFuZCBJIHJlYWxseSBkb24ndCBsaWtlIHRoZSB0cmFkZW9mZiBvZiB0eXBlLXNhZmV0eSBmb3IKKyAqIHBlcmZvcm1hbmNlIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgW3R5dHNvOjIwMDMwMTI1LjIwMDdFU1RdCisgKi8KKworLyoKKyAqIFRoaXMgc2VyaWVzIG9mIGZ1bmN0aW9ucyBpdGVyYXRlIG92ZXIgYWxsIGRldmljZXMgaW4gYSBibGtpZCBjYWNoZQorICovCisjZGVmaW5lIERFVl9JVEVSQVRFX01BR0lDCTB4MDFhNTI4NGMKKworc3RydWN0IGJsa2lkX3N0cnVjdF9kZXZfaXRlcmF0ZSB7CisJaW50CQkJbWFnaWM7CisJYmxraWRfY2FjaGUJCWNhY2hlOworCXN0cnVjdCBsaXN0X2hlYWQJKnA7Cit9OworCitibGtpZF9kZXZfaXRlcmF0ZSBibGtpZF9kZXZfaXRlcmF0ZV9iZWdpbihibGtpZF9jYWNoZSBjYWNoZSkKK3sKKwlibGtpZF9kZXZfaXRlcmF0ZQlpdGVyOworCisJaXRlciA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2X2l0ZXJhdGUpKTsKKwlpdGVyLT5tYWdpYyA9IERFVl9JVEVSQVRFX01BR0lDOworCWl0ZXItPmNhY2hlID0gY2FjaGU7CisJaXRlci0+cAk9IGNhY2hlLT5iaWNfZGV2cy5uZXh0OworCXJldHVybiBpdGVyOworfQorCisvKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAqLworZXh0ZXJuIGludCBibGtpZF9kZXZfbmV4dChibGtpZF9kZXZfaXRlcmF0ZSBpdGVyLAorCQkJICBibGtpZF9kZXYgKmRldikKK3sKKwkqZGV2ID0gMDsKKwlpZiAoIWl0ZXIgfHwgaXRlci0+bWFnaWMgIT0gREVWX0lURVJBVEVfTUFHSUMgfHwKKwkgICAgaXRlci0+cCA9PSAmaXRlci0+Y2FjaGUtPmJpY19kZXZzKQorCQlyZXR1cm4gLTE7CisJKmRldiA9IGxpc3RfZW50cnkoaXRlci0+cCwgc3RydWN0IGJsa2lkX3N0cnVjdF9kZXYsIGJpZF9kZXZzKTsKKwlpdGVyLT5wID0gaXRlci0+cC0+bmV4dDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBibGtpZF9kZXZfaXRlcmF0ZV9lbmQoYmxraWRfZGV2X2l0ZXJhdGUgaXRlcikKK3sKKwlpZiAoIWl0ZXIgfHwgaXRlci0+bWFnaWMgIT0gREVWX0lURVJBVEVfTUFHSUMpCisJCXJldHVybjsKKwlpdGVyLT5tYWdpYyA9IDA7CisJZnJlZShpdGVyKTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQorI2lmZGVmIEhBVkVfR0VUT1BUX0gKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbHNlCitleHRlcm4gY2hhciAqb3B0YXJnOworZXh0ZXJuIGludCBvcHRpbmQ7CisjZW5kaWYKKwordm9pZCB1c2FnZShjaGFyICpwcm9nKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZiBibGtpZF9maWxlXSBbLW0gZGVidWdfbWFza11cbiIsIHByb2cpOworCWZwcmludGYoc3RkZXJyLCAiXHRMaXN0IGFsbCBkZXZpY2VzIGFuZCBleGl0XG4iLCBwcm9nKTsKKwlleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYmxraWRfZGV2X2l0ZXJhdGUJaXRlcjsKKwlibGtpZF9jYWNoZQkJY2FjaGUgPSBOVUxMOworCWJsa2lkX2RldgkJZGV2OworCWludAkJCWMsIHJldDsKKwljaGFyCQkJKnRtcDsKKwljaGFyCQkJKmZpbGUgPSBOVUxMOworCWNoYXIJCQkqc2VhcmNoX3R5cGUgPSBOVUxMOworCWNoYXIJCQkqc2VhcmNoX3ZhbHVlID0gTlVMTDsKKworCXdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgIm06ZjoiKSkgIT0gRU9GKQorCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnZic6CisJCQlmaWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJYmxraWRfZGVidWdfbWFzayA9IHN0cnRvdWwgKG9wdGFyZywgJnRtcCwgMCk7CisJCQlpZiAoKnRtcCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBkZWJ1ZyBtYXNrOiAlZFxuIiwKKwkJCQkJb3B0YXJnKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJdXNhZ2UoYXJndlswXSk7CisJCX0KKwlpZiAoYXJnYyA+PSBvcHRpbmQrMikgeworCQlzZWFyY2hfdHlwZSA9IGFyZ3Zbb3B0aW5kXTsKKwkJc2VhcmNoX3ZhbHVlID0gYXJndltvcHRpbmQrMV07CisJCW9wdGluZCArPSAyOworCX0KKwlpZiAoYXJnYyAhPSBvcHRpbmQpCisJCXVzYWdlKGFyZ3ZbMF0pOworCisJaWYgKChyZXQgPSBibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBmaWxlKSkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciBjcmVhdGluZyBjYWNoZSAoJWQpXG4iLAorCQkJYXJndlswXSwgcmV0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpdGVyID0gYmxraWRfZGV2X2l0ZXJhdGVfYmVnaW4oY2FjaGUpOworCWlmIChzZWFyY2hfdHlwZSkKKwkJYmxraWRfZGV2X3NldF9zZWFyY2goaXRlciwgc2VhcmNoX3R5cGUsIHNlYXJjaF92YWx1ZSk7CisJd2hpbGUgKGJsa2lkX2Rldl9uZXh0KGl0ZXIsICZkZXYpID09IDApIHsKKwkJcHJpbnRmKCJEZXZpY2U6ICVzXG4iLCBibGtpZF9kZXZfZGV2bmFtZShkZXYpKTsKKwl9CisJYmxraWRfZGV2X2l0ZXJhdGVfZW5kKGl0ZXIpOworCisKKwlibGtpZF9wdXRfY2FjaGUoY2FjaGUpOworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9kZXZuYW1lLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9kZXZuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkOTJjYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Rldm5hbWUuYwpAQCAtMCwwICsxLDM2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZGV2bmFtZS5jIC0gZ2V0IGEgZGV2IGJ5IGl0cyBkZXZpY2UgaW5vZGUgbmFtZQorICoKKyAqIENvcHlyaWdodCAoQykgQW5kcmllcyBCcm91d2VyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMgVGhlb2RvcmUgVHMnbworICogQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYXMgRGlsZ2VyCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX01LREVWX0gKKyNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImJsa2lkUC5oIgorCisvKgorICogRmluZCBhIGRldiBzdHJ1Y3QgaW4gdGhlIGNhY2hlIGJ5IGRldmljZSBuYW1lLCBpZiBhdmFpbGFibGUuCisgKgorICogSWYgdGhlcmUgaXMgbm8gZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIGRldmljZSBuYW1lLCBhbmQgdGhlIGNyZWF0ZQorICogZmxhZyBpcyBzZXQsIHRoZW4gY3JlYXRlIGFuIGVtcHR5IGRldmljZSBlbnRyeS4KKyAqLworYmxraWRfZGV2IGJsa2lkX2dldF9kZXYoYmxraWRfY2FjaGUgY2FjaGUsIGNvbnN0IGNoYXIgKmRldm5hbWUsIGludCBmbGFncykKK3sKKwlibGtpZF9kZXYgZGV2ID0gTlVMTCwgdG1wOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlpZiAoIWNhY2hlIHx8ICFkZXZuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gocCwgJmNhY2hlLT5iaWNfZGV2cykgeworCQl0bXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LCBiaWRfZGV2cyk7CisJCWlmIChzdHJjbXAodG1wLT5iaWRfbmFtZSwgZGV2bmFtZSkpCisJCQljb250aW51ZTsKKworCQlEQkcoREVCVUdfREVWTkFNRSwKKwkJICAgIHByaW50ZigiZm91bmQgZGV2bmFtZSAlcyBpbiBjYWNoZVxuIiwgdG1wLT5iaWRfbmFtZSkpOworCQlkZXYgPSB0bXA7CisJCWJyZWFrOworCX0KKworCWlmICghZGV2ICYmIChmbGFncyAmIEJMS0lEX0RFVl9DUkVBVEUpKSB7CisJCWRldiA9IGJsa2lkX25ld19kZXYoKTsKKwkJaWYgKCFkZXYpCisJCQlyZXR1cm4gTlVMTDsKKwkJZGV2LT5iaWRfbmFtZSA9IGJsa2lkX3N0cmR1cChkZXZuYW1lKTsKKwkJZGV2LT5iaWRfY2FjaGUgPSBjYWNoZTsKKwkJbGlzdF9hZGRfdGFpbCgmZGV2LT5iaWRfZGV2cywgJmNhY2hlLT5iaWNfZGV2cyk7CisJCWNhY2hlLT5iaWNfZmxhZ3MgfD0gQkxLSURfQklDX0ZMX0NIQU5HRUQ7CisJfQorCisJaWYgKGZsYWdzICYgQkxLSURfREVWX1ZFUklGWSkKKwkJZGV2ID0gYmxraWRfdmVyaWZ5KGNhY2hlLCBkZXYpOworCXJldHVybiBkZXY7Cit9CisKKy8qCisgKiBQcm9iZSBhIHNpbmdsZSBibG9jayBkZXZpY2UgdG8gYWRkIHRvIHRoZSBkZXZpY2UgY2FjaGUuCisgKi8KK3N0YXRpYyB2b2lkIHByb2JlX29uZShibGtpZF9jYWNoZSBjYWNoZSwgY29uc3QgY2hhciAqcHRuYW1lLAorCQkgICAgICBkZXZfdCBkZXZubywgaW50IHByaSkKK3sKKwlibGtpZF9kZXYgZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWNvbnN0IGNoYXIgKipkaXI7CisJY2hhciAqZGV2bmFtZSA9IE5VTEw7CisKKwkvKiBTZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgZGV2aWNlIG51bWJlciBpbiB0aGUgY2FjaGUuICovCisJbGlzdF9mb3JfZWFjaChwLCAmY2FjaGUtPmJpY19kZXZzKSB7CisJCWJsa2lkX2RldiB0bXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LAorCQkJCQkgICBiaWRfZGV2cyk7CisJCWlmICh0bXAtPmJpZF9kZXZubyA9PSBkZXZubykgeworCQkJZGV2ID0gYmxraWRfdmVyaWZ5KGNhY2hlLCB0bXApOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGRldiAmJiBkZXYtPmJpZF9kZXZubyA9PSBkZXZubykKKwkJZ290byBzZXRfcHJpOworCisJLyoKKwkgKiBUYWtlIGEgcXVpY2sgbG9vayBhdCAvZGV2L3B0bmFtZSBmb3IgdGhlIGRldmljZSBudW1iZXIuICBXZSBjaGVjaworCSAqIGFsbCBvZiB0aGUgbGlrZWx5IGRldmljZSBkaXJlY3Rvcmllcy4gIElmIHdlIGRvbid0IGZpbmQgaXQsIG9yIGlmCisJICogdGhlIHN0YXQgaW5mb3JtYXRpb24gZG9lc24ndCBjaGVjayBvdXQsIHVzZSBibGtpZF9kZXZub190b19kZXZuYW1lKCkKKwkgKiB0byBmaW5kIGl0IHZpYSBhbiBleGhhdXN0aXZlIHNlYXJjaCBmb3IgdGhlIGRldmljZSBtYWpvci9taW5vci4KKwkgKi8KKwlmb3IgKGRpciA9IGJsa2lkX2RldmRpcnM7ICpkaXI7IGRpcisrKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQljaGFyIGRldmljZVsyNTZdOworCisJCXNwcmludGYoZGV2aWNlLCAiJXMvJXMiLCAqZGlyLCBwdG5hbWUpOworCQlpZiAoKGRldiA9IGJsa2lkX2dldF9kZXYoY2FjaGUsIGRldmljZSwgQkxLSURfREVWX0ZJTkQpKSAmJgorCQkgICAgZGV2LT5iaWRfZGV2bm8gPT0gZGV2bm8pCisJCQlnb3RvIHNldF9wcmk7CisKKwkJaWYgKHN0YXQoZGV2aWNlLCAmc3QpID09IDAgJiYgU19JU0JMSyhzdC5zdF9tb2RlKSAmJgorCQkgICAgc3Quc3RfcmRldiA9PSBkZXZubykgeworCQkJZGV2bmFtZSA9IGJsa2lkX3N0cmR1cChkZXZpY2UpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFkZXZuYW1lKSB7CisJCWRldm5hbWUgPSBibGtpZF9kZXZub190b19kZXZuYW1lKGRldm5vKTsKKwkJaWYgKCFkZXZuYW1lKQorCQkJcmV0dXJuOworCX0KKwlkZXYgPSBibGtpZF9nZXRfZGV2KGNhY2hlLCBkZXZuYW1lLCBCTEtJRF9ERVZfTk9STUFMKTsKKwlmcmVlKGRldm5hbWUpOworCitzZXRfcHJpOgorCWlmICghcHJpICYmICFzdHJuY21wKHB0bmFtZSwgIm1kIiwgMikpCisJCXByaSA9IEJMS0lEX1BSSV9NRDsKKwlpZiAoZGV2KQorCQlkZXYtPmJpZF9wcmkgPSBwcmk7Cit9CisKKyNkZWZpbmUgUFJPQ19QQVJUSVRJT05TICIvcHJvYy9wYXJ0aXRpb25zIgorI2RlZmluZSBWR19ESVIJCSIvcHJvYy9sdm0vVkdzIgorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgVVVJRCBjYWNoZSB3aXRoIGRldmljZXMgZnJvbSB0aGUgTFZNCisgKiBwcm9jIGhpZXJhcmNoeS4gIFdlIGN1cnJlbnRseSBkZXBlbmQgb24gdGhlIG5hbWVzIG9mIHRoZSBMVk0KKyAqIGhpZXJhcmNoeSBnaXZpbmcgdXMgdGhlIGRldmljZSBzdHJ1Y3R1cmUgaW4gL2Rldi4gIChYWFggaXMgdGhpcyBhCisgKiBzYWZlIHRoaW5nIHRvIGRvPykKKyAqLworI2lmZGVmIFZHX0RJUgorI2luY2x1ZGUgPGRpcmVudC5oPgorc3RhdGljIGRldl90IGx2bV9nZXRfZGV2bm8oY29uc3QgY2hhciAqbHZtX2RldmljZSkKK3sKKwlGSUxFICpsdmY7CisJY2hhciBidWZbMTAyNF07CisJaW50IG1hLCBtaTsKKwlkZXZfdCByZXQgPSAwOworCisJREJHKERFQlVHX0RFVk5BTUUsIHByaW50Zigib3BlbmluZyAlc1xuIiwgbHZtX2RldmljZSkpOworCWlmICgobHZmID0gZm9wZW5fZm9yX3JlYWQobHZtX2RldmljZSkpID09IE5VTEwpIHsKKwkJREJHKERFQlVHX0RFVk5BTUUsIHByaW50ZigiJXM6ICglZCkgJXNcbiIsIGx2bV9kZXZpY2UsIGVycm5vLAorCQkJCQkgIHN0cmVycm9yKGVycm5vKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgbHZmKSkgeworCQlpZiAoc3NjYW5mKGJ1ZiwgImRldmljZTogJWQ6JWQiLCAmbWEsICZtaSkgPT0gMikgeworCQkJcmV0ID0gbWFrZWRldihtYSwgbWkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZmNsb3NlKGx2Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBsdm1fcHJvYmVfYWxsKGJsa2lkX2NhY2hlIGNhY2hlKQoreworCURJUgkJKnZnX2xpc3Q7CisJc3RydWN0IGRpcmVudAkqdmdfaXRlcjsKKwlpbnQJCXZnX2xlbiA9IHN0cmxlbihWR19ESVIpOworCWRldl90CQlkZXY7CisKKwlpZiAoKHZnX2xpc3QgPSBvcGVuZGlyKFZHX0RJUikpID09IE5VTEwpCisJCXJldHVybjsKKworCURCRyhERUJVR19ERVZOQU1FLCBwcmludGYoInByb2JpbmcgTFZNIGRldmljZXMgdW5kZXIgJXNcbiIsIFZHX0RJUikpOworCisJd2hpbGUgKCh2Z19pdGVyID0gcmVhZGRpcih2Z19saXN0KSkgIT0gTlVMTCkgeworCQlESVIJCSpsdl9saXN0OworCQljaGFyCQkqdmRpcm5hbWU7CisJCWNoYXIJCSp2Z19uYW1lOworCQlzdHJ1Y3QgZGlyZW50CSpsdl9pdGVyOworCisJCXZnX25hbWUgPSB2Z19pdGVyLT5kX25hbWU7CisJCWlmIChMT05FX0NIQVIodmdfbmFtZSwgJy4nKSB8fCAhc3RyY21wKHZnX25hbWUsICIuLiIpKQorCQkJY29udGludWU7CisJCXZkaXJuYW1lID0geG1hbGxvYyh2Z19sZW4gKyBzdHJsZW4odmdfbmFtZSkgKyA4KTsKKwkJc3ByaW50Zih2ZGlybmFtZSwgIiVzLyVzL0xWcyIsIFZHX0RJUiwgdmdfbmFtZSk7CisKKwkJbHZfbGlzdCA9IG9wZW5kaXIodmRpcm5hbWUpOworCQlmcmVlKHZkaXJuYW1lKTsKKwkJaWYgKGx2X2xpc3QgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlICgobHZfaXRlciA9IHJlYWRkaXIobHZfbGlzdCkpICE9IE5VTEwpIHsKKwkJCWNoYXIJCSpsdl9uYW1lLCAqbHZtX2RldmljZTsKKworCQkJbHZfbmFtZSA9IGx2X2l0ZXItPmRfbmFtZTsKKwkJCWlmIChMT05FX0NIQVIobHZfbmFtZSwgJy4nKSB8fCAhc3RyY21wKGx2X25hbWUsICIuLiIpKQorCQkJCWNvbnRpbnVlOworCisJCQlsdm1fZGV2aWNlID0geG1hbGxvYyh2Z19sZW4gKyBzdHJsZW4odmdfbmFtZSkgKworCQkJCQkgICAgc3RybGVuKGx2X25hbWUpICsgOCk7CisJCQlzcHJpbnRmKGx2bV9kZXZpY2UsICIlcy8lcy9MVnMvJXMiLCBWR19ESVIsIHZnX25hbWUsCisJCQkJbHZfbmFtZSk7CisJCQlkZXYgPSBsdm1fZ2V0X2Rldm5vKGx2bV9kZXZpY2UpOworCQkJc3ByaW50Zihsdm1fZGV2aWNlLCAiJXMvJXMiLCB2Z19uYW1lLCBsdl9uYW1lKTsKKwkJCURCRyhERUJVR19ERVZOQU1FLCBwcmludGYoIkxWTSBkZXYgJXM6IGRldm5vIDB4JTA0WFxuIiwKKwkJCQkJCSAgbHZtX2RldmljZSwKKwkJCQkJCSAgKHVuc2lnbmVkIGludCkgZGV2KSk7CisJCQlwcm9iZV9vbmUoY2FjaGUsIGx2bV9kZXZpY2UsIGRldiwgQkxLSURfUFJJX0xWTSk7CisJCQlmcmVlKGx2bV9kZXZpY2UpOworCQl9CisJCWNsb3NlZGlyKGx2X2xpc3QpOworCX0KKwljbG9zZWRpcih2Z19saXN0KTsKK30KKyNlbmRpZgorCisjZGVmaW5lIFBST0NfRVZNU19WT0xVTUVTICIvcHJvYy9ldm1zL3ZvbHVtZXMiCisKK3N0YXRpYyBpbnQKK2V2bXNfcHJvYmVfYWxsKGJsa2lkX2NhY2hlIGNhY2hlKQoreworCWNoYXIgbGluZVsxMDBdOworCWludCBtYSwgbWksIHN6LCBudW0gPSAwOworCUZJTEUgKnByb2NwdDsKKwljaGFyIGRldmljZVsxMTBdOworCisJcHJvY3B0ID0gZm9wZW5fZm9yX3JlYWQoUFJPQ19FVk1TX1ZPTFVNRVMpOworCWlmICghcHJvY3B0KQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBwcm9jcHQpKSB7CisJCWlmIChzc2NhbmYobGluZSwgIiAlZCAlZCAlZCAlKnMgJSpzICVbXlxuIF0iLAorCQkJICAgICZtYSwgJm1pLCAmc3osIGRldmljZSkgIT0gNCkKKwkJCWNvbnRpbnVlOworCisJCURCRyhERUJVR19ERVZOQU1FLCBwcmludGYoIkNoZWNraW5nIHBhcnRpdGlvbiAlcyAoJWQsICVkKVxuIiwKKwkJCQkJICBkZXZpY2UsIG1hLCBtaSkpOworCisJCXByb2JlX29uZShjYWNoZSwgZGV2aWNlLCBtYWtlZGV2KG1hLCBtaSksIEJMS0lEX1BSSV9FVk1TKTsKKwkJbnVtKys7CisJfQorCWZjbG9zZShwcm9jcHQpOworCXJldHVybiBudW07Cit9CisKKy8qCisgKiBSZWFkIHRoZSBkZXZpY2UgZGF0YSBmb3IgYWxsIGF2YWlsYWJsZSBibG9jayBkZXZpY2VzIGluIHRoZSBzeXN0ZW0uCisgKi8KK2ludCBibGtpZF9wcm9iZV9hbGwoYmxraWRfY2FjaGUgY2FjaGUpCit7CisJRklMRSAqcHJvYzsKKwljaGFyIGxpbmVbMTAyNF07CisJY2hhciBwdG5hbWUwWzEyOF0sIHB0bmFtZTFbMTI4XSwgKnB0bmFtZSA9IE5VTEw7CisJY2hhciAqcHRuYW1lc1syXTsKKwlkZXZfdCBkZXZzWzJdOworCWludCBtYSwgbWk7CisJdW5zaWduZWQgbG9uZyBsb25nIHN6OworCWludCBsZW5zWzJdID0geyAwLCAwIH07CisJaW50IHdoaWNoID0gMCwgbGFzdCA9IDA7CisKKwlwdG5hbWVzWzBdID0gcHRuYW1lMDsKKwlwdG5hbWVzWzFdID0gcHRuYW1lMTsKKworCWlmICghY2FjaGUpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJaWYgKGNhY2hlLT5iaWNfZmxhZ3MgJiBCTEtJRF9CSUNfRkxfUFJPQkVEICYmCisJICAgIHRpbWUoTlVMTCkgLSBjYWNoZS0+YmljX3RpbWUgPCBCTEtJRF9QUk9CRV9JTlRFUlZBTCkKKwkJcmV0dXJuIDA7CisKKwlibGtpZF9yZWFkX2NhY2hlKGNhY2hlKTsKKwlldm1zX3Byb2JlX2FsbChjYWNoZSk7CisjaWZkZWYgVkdfRElSCisJbHZtX3Byb2JlX2FsbChjYWNoZSk7CisjZW5kaWYKKworCXByb2MgPSBmb3Blbl9mb3JfcmVhZChQUk9DX1BBUlRJVElPTlMpOworCWlmICghcHJvYykKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUFJPQzsKKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHByb2MpKSB7CisJCWxhc3QgPSB3aGljaDsKKwkJd2hpY2ggXj0gMTsKKwkJcHRuYW1lID0gcHRuYW1lc1t3aGljaF07CisKKwkJaWYgKHNzY2FuZihsaW5lLCAiICVkICVkICVsbHUgJTEyOFteXG4gXSIsCisJCQkgICAmbWEsICZtaSwgJnN6LCBwdG5hbWUpICE9IDQpCisJCQljb250aW51ZTsKKwkJZGV2c1t3aGljaF0gPSBtYWtlZGV2KG1hLCBtaSk7CisKKwkJREJHKERFQlVHX0RFVk5BTUUsIHByaW50ZigicmVhZCBwYXJ0aXRpb24gbmFtZSAlc1xuIiwgcHRuYW1lKSk7CisKKwkJLyogU2tpcCB3aG9sZSBkaXNrIGRldnMgdW5sZXNzIHRoZXkgaGF2ZSBubyBwYXJ0aXRpb25zCisJCSAqIElmIHdlIGRvbid0IGhhdmUgYSBwYXJ0aXRpb24gb24gdGhpcyBkZXYsIGFsc28KKwkJICogY2hlY2sgcHJldmlvdXMgZGV2IHRvIHNlZSBpZiBpdCBkaWRuJ3QgaGF2ZSBhIHBhcnRuLgorCQkgKiBoZXVyaXN0aWM6IHBhcnRpdGlvbiBuYW1lIGVuZHMgaW4gYSBkaWdpdC4KKwkJICoKKwkJICogU2tpcCBleHRlbmRlZCBwYXJ0aXRpb25zLgorCQkgKiBoZXVyaXN0aWM6IHNpemUgaXMgMQorCQkgKgorCQkgKiBGSVhNRTogc2tpcCAvZGV2L3tpZGEsY2Npc3MscmR9IHdob2xlLWRpc2sgZGV2cworCQkgKi8KKworCQlsZW5zW3doaWNoXSA9IHN0cmxlbihwdG5hbWUpOworCQlpZiAoaXNkaWdpdChwdG5hbWVbbGVuc1t3aGljaF0gLSAxXSkpIHsKKwkJCURCRyhERUJVR19ERVZOQU1FLAorCQkJICAgIHByaW50ZigicGFydGl0aW9uIGRldiAlcywgZGV2bm8gMHglMDRYXG4iLAorCQkJCSAgIHB0bmFtZSwgKHVuc2lnbmVkIGludCkgZGV2c1t3aGljaF0pKTsKKworCQkJaWYgKHN6ID4gMSkKKwkJCQlwcm9iZV9vbmUoY2FjaGUsIHB0bmFtZSwgZGV2c1t3aGljaF0sIDApOworCQkJbGVuc1t3aGljaF0gPSAwOworCQkJbGVuc1tsYXN0XSA9IDA7CisJCX0gZWxzZSBpZiAobGVuc1tsYXN0XSAmJiBzdHJuY21wKHB0bmFtZXNbbGFzdF0sIHB0bmFtZSwKKwkJCQkJCSBsZW5zW2xhc3RdKSkgeworCQkJREJHKERFQlVHX0RFVk5BTUUsCisJCQkgICAgcHJpbnRmKCJ3aG9sZSBkZXYgJXMsIGRldm5vIDB4JTA0WFxuIiwKKwkJCQkgICBwdG5hbWVzW2xhc3RdLCAodW5zaWduZWQgaW50KSBkZXZzW2xhc3RdKSk7CisJCQlwcm9iZV9vbmUoY2FjaGUsIHB0bmFtZXNbbGFzdF0sIGRldnNbbGFzdF0sIDApOworCQkJbGVuc1tsYXN0XSA9IDA7CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgdGhlIGxhc3QgZGV2aWNlIGlmIGl0IHdhc24ndCBwYXJ0aXRpb25lZCAqLworCWlmIChsZW5zW3doaWNoXSkKKwkJcHJvYmVfb25lKGNhY2hlLCBwdG5hbWUsIGRldnNbd2hpY2hdLCAwKTsKKworCWZjbG9zZShwcm9jKTsKKworCWNhY2hlLT5iaWNfdGltZSA9IHRpbWUoTlVMTCk7CisJY2FjaGUtPmJpY19mbGFncyB8PSBCTEtJRF9CSUNfRkxfUFJPQkVEOworCWJsa2lkX2ZsdXNoX2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWJsa2lkX2NhY2hlIGNhY2hlID0gTlVMTDsKKwlpbnQgcmV0OworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoYXJnYyAhPSAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzXG4iCisJCQkiUHJvYmUgYWxsIGRldmljZXMgYW5kIGV4aXRcbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlpZiAoKHJldCA9IGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIGJiX2Rldl9udWxsKSkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciBjcmVhdGluZyBjYWNoZSAoJWQpXG4iLAorCQkJYXJndlswXSwgcmV0KTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKGJsa2lkX3Byb2JlX2FsbChjYWNoZSkgPCAwKQorCQlwcmludGYoIiVzOiBlcnJvciBwcm9iaW5nIGRldmljZXNcbiIsIGFyZ3ZbMF0pOworCisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvZGV2bm8uYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Rldm5vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzMjZmOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Rldm5vLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRldm5vLmMgLSBmaW5kIGEgcGFydGljdWxhciBkZXZpY2UgYnkgaXRzIGRldmljZSBudW1iZXIgKG1ham9yL21pbm9yKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMyBUaGVvZG9yZSBUcydvCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX01LREVWX0gKKyNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYmxraWRQLmgiCisKK3N0cnVjdCBkaXJfbGlzdCB7CisJY2hhcgkqbmFtZTsKKwlzdHJ1Y3QgZGlyX2xpc3QgKm5leHQ7Cit9OworCitjaGFyICpibGtpZF9zdHJuZHVwKGNvbnN0IGNoYXIgKnMsIGludCBsZW5ndGgpCit7CisJY2hhciAqcmV0OworCisJaWYgKCFzKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghbGVuZ3RoKQorCQlsZW5ndGggPSBzdHJsZW4ocyk7CisKKwlyZXQgPSB4bWFsbG9jKGxlbmd0aCArIDEpOworCXN0cm5jcHkocmV0LCBzLCBsZW5ndGgpOworCXJldFtsZW5ndGhdID0gJ1wwJzsKKwlyZXR1cm4gcmV0OworfQorCitjaGFyICpibGtpZF9zdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwlyZXR1cm4gYmxraWRfc3RybmR1cChzLCAwKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbiBlbnRyeSB0byB0aGUgZGlyZWN0b3J5IGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWRkX3RvX2Rpcmxpc3QoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRpcl9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZGlyX2xpc3QgKmRwOworCisJZHAgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZGlyX2xpc3QpKTsKKwlkcC0+bmFtZSA9IGJsa2lkX3N0cmR1cChuYW1lKTsKKwlkcC0+bmV4dCA9ICpsaXN0OworCSpsaXN0ID0gZHA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGEgZGlyZWN0b3J5IGxpc3QKKyAqLworc3RhdGljIHZvaWQgZnJlZV9kaXJsaXN0KHN0cnVjdCBkaXJfbGlzdCAqKmxpc3QpCit7CisJc3RydWN0IGRpcl9saXN0ICpkcCwgKm5leHQ7CisKKwlmb3IgKGRwID0gKmxpc3Q7IGRwOyBkcCA9IG5leHQpIHsKKwkJbmV4dCA9IGRwLT5uZXh0OworCQlmcmVlKGRwLT5uYW1lKTsKKwkJZnJlZShkcCk7CisJfQorCSpsaXN0ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2Nhbl9kaXIoY2hhciAqZGlyX25hbWUsIGRldl90IGRldm5vLCBzdHJ1Y3QgZGlyX2xpc3QgKipsaXN0LAorCQkJICAgIGNoYXIgKipkZXZuYW1lKQoreworCURJUgkqZGlyOworCXN0cnVjdCBkaXJlbnQgKmRwOworCWNoYXIJcGF0aFsxMDI0XTsKKwlpbnQJZGlybGVuOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKChkaXIgPSBvcGVuZGlyKGRpcl9uYW1lKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCWRpcmxlbiA9IHN0cmxlbihkaXJfbmFtZSkgKyAyOworCXdoaWxlICgoZHAgPSByZWFkZGlyKGRpcikpICE9IDApIHsKKwkJaWYgKGRpcmxlbiArIHN0cmxlbihkcC0+ZF9uYW1lKSA+PSBzaXplb2YocGF0aCkpCisJCQljb250aW51ZTsKKworCQlpZiAoZHAtPmRfbmFtZVswXSA9PSAnLicgJiYKKwkJICAgICgoZHAtPmRfbmFtZVsxXSA9PSAwKSB8fAorCQkgICAgICgoZHAtPmRfbmFtZVsxXSA9PSAnLicpICYmIChkcC0+ZF9uYW1lWzJdID09IDApKSkpCisJCQljb250aW51ZTsKKworCQlzcHJpbnRmKHBhdGgsICIlcy8lcyIsIGRpcl9uYW1lLCBkcC0+ZF9uYW1lKTsKKwkJaWYgKHN0YXQocGF0aCwgJnN0KSA8IDApCisJCQljb250aW51ZTsKKworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCWFkZF90b19kaXJsaXN0KHBhdGgsIGxpc3QpOworCQllbHNlIGlmIChTX0lTQkxLKHN0LnN0X21vZGUpICYmIHN0LnN0X3JkZXYgPT0gZGV2bm8pIHsKKwkJCSpkZXZuYW1lID0gYmxraWRfc3RyZHVwKHBhdGgpOworCQkJREJHKERFQlVHX0RFVk5PLAorCQkJICAgIHByaW50ZigiZm91bmQgMHglbGx4IGF0ICVzICglcClcbiIsIGRldm5vLAorCQkJCSAgIHBhdGgsICpkZXZuYW1lKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwljbG9zZWRpcihkaXIpOworfQorCisvKiBEaXJlY3RvcmllcyB3aGVyZSB3ZSB3aWxsIHRyeSB0byBzZWFyY2ggZm9yIGRldmljZSBudW1iZXJzICovCitjb25zdCBjaGFyICpibGtpZF9kZXZkaXJzW10gPSB7ICIvZGV2aWNlcyIsICIvZGV2ZnMiLCAiL2RldiIsIE5VTEwgfTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHBhdGhuYW1lIHRvIGEgYmxvY2sgZGV2aWNlIHdpdGggYSBnaXZlbgorICogZGV2aWNlIG51bWJlci4gIEl0IHJldHVybnMgYSBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgdG8gdGhlCisgKiBwYXRobmFtZSBvbiBzdWNjZXNzLCBhbmQgTlVMTCBvbiBmYWlsdXJlLgorICovCitjaGFyICpibGtpZF9kZXZub190b19kZXZuYW1lKGRldl90IGRldm5vKQoreworCXN0cnVjdCBkaXJfbGlzdCAqbGlzdCA9IE5VTEwsICpuZXdfbGlzdCA9IE5VTEw7CisJY2hhciAqZGV2bmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqKmRpcjsKKworCS8qCisJICogQWRkIHRoZSBzdGFydGluZyBkaXJlY3RvcmllcyB0byBzZWFyY2ggaW4gcmV2ZXJzZSBvcmRlciBvZgorCSAqIGltcG9ydGFuY2UsIHNpbmNlIHdlIGFyZSB1c2luZyBhIHN0YWNrLi4uCisJICovCisJZm9yIChkaXIgPSBibGtpZF9kZXZkaXJzOyAqZGlyOyBkaXIrKykKKwkJYWRkX3RvX2Rpcmxpc3QoKmRpciwgJmxpc3QpOworCisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGRpcl9saXN0ICpjdXJyZW50ID0gbGlzdDsKKworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJREJHKERFQlVHX0RFVk5PLCBwcmludGYoImRpcmVjdG9yeSAlc1xuIiwgY3VycmVudC0+bmFtZSkpOworCQlzY2FuX2RpcihjdXJyZW50LT5uYW1lLCBkZXZubywgJm5ld19saXN0LCAmZGV2bmFtZSk7CisJCWZyZWUoY3VycmVudC0+bmFtZSk7CisJCWZyZWUoY3VycmVudCk7CisJCWlmIChkZXZuYW1lKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIElmIHdlJ3JlIGRvbmUgY2hlY2tpbmcgYXQgdGhpcyBsZXZlbCwgZGVzY2VuZCB0bworCQkgKiB0aGUgbmV4dCBsZXZlbCBvZiBzdWJkaXJlY3Rvcmllcy4gKGJyZWFkdGgtZmlyc3QpCisJCSAqLworCQlpZiAobGlzdCA9PSBOVUxMKSB7CisJCQlsaXN0ID0gbmV3X2xpc3Q7CisJCQluZXdfbGlzdCA9IE5VTEw7CisJCX0KKwl9CisJZnJlZV9kaXJsaXN0KCZsaXN0KTsKKwlmcmVlX2Rpcmxpc3QoJm5ld19saXN0KTsKKworCWlmICghZGV2bmFtZSkgeworCQlEQkcoREVCVUdfREVWTk8sCisJCSAgICBwcmludGYoImJsa2lkOiBjYW5ub3QgZmluZCBkZXZubyAweCUwNGx4XG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpIGRldm5vKSk7CisJfSBlbHNlIHsKKwkJREJHKERFQlVHX0RFVk5PLAorCQkgICAgcHJpbnRmKCJmb3VuZCBkZXZubyAweCUwNGxseCBhcyAlc1xuIiwgZGV2bm8sIGRldm5hbWUpKTsKKwl9CisKKworCXJldHVybiBkZXZuYW1lOworfQorCisjaWZkZWYgVEVTVF9QUk9HUkFNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJY2hhcgkqZGV2bmFtZSwgKnRtcDsKKwlpbnQJbWFqb3IsIG1pbm9yOworCWRldl90CWRldm5vOworCWNvbnN0IGNoYXIgKmVycm1zZyA9ICJDYW5ub3QgcGFyc2UgJXM6ICVzXG4iOworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoKGFyZ2MgIT0gMikgJiYgKGFyZ2MgIT0gMykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTpcdCVzIGRldmljZV9udW1iZXJcblx0JXMgbWFqb3IgbWlub3JcbiIKKwkJCSJSZXNvbHZlIGEgZGV2aWNlIG51bWJlciB0byBhIGRldmljZSBuYW1lXG4iLAorCQkJYXJndlswXSwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChhcmdjID09IDIpIHsKKwkJZGV2bm8gPSBzdHJ0b3VsKGFyZ3ZbMV0sICZ0bXAsIDApOworCQlpZiAoKnRtcCkgeworCQkJZnByaW50ZihzdGRlcnIsIGVycm1zZywgImRldmljZSBudW1iZXIiLCBhcmd2WzFdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9IGVsc2UgeworCQltYWpvciA9IHN0cnRvdWwoYXJndlsxXSwgJnRtcCwgMCk7CisJCWlmICgqdG1wKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgZXJybXNnLCAibWFqb3IgbnVtYmVyIiwgYXJndlsxXSk7CisJCQlleGl0KDEpOworCQl9CisJCW1pbm9yID0gc3RydG91bChhcmd2WzJdLCAmdG1wLCAwKTsKKwkJaWYgKCp0bXApIHsKKwkJCWZwcmludGYoc3RkZXJyLCBlcnJtc2csICJtaW5vciBudW1iZXIiLCBhcmd2WzJdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJZGV2bm8gPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJfQorCXByaW50ZigiTG9va2luZyBmb3IgZGV2aWNlIDB4JTA0THhcbiIsIGRldm5vKTsKKwlkZXZuYW1lID0gYmxraWRfZGV2bm9fdG9fZGV2bmFtZShkZXZubyk7CisJZnJlZShkZXZuYW1lKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvbGlzdC5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDYxYTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9saXN0LmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworCisjaW5jbHVkZSAibGlzdC5oIgorCisvKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJldHdlZW4gdHdvIGtub3duIGNvbnNlY3V0aXZlIGVudHJpZXMuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLwordm9pZCBfX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKiBhZGQsCisJc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsCisJc3RydWN0IGxpc3RfaGVhZCAqIG5leHQpCit7CisJbmV4dC0+cHJldiA9IGFkZDsKKwlhZGQtPm5leHQgPSBuZXh0OworCWFkZC0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IGFkZDsKK30KKworLyoKKyAqIGxpc3RfYWRkIC0gYWRkIGEgbmV3IGVudHJ5CisgKiBAYWRkOgluZXcgZW50cnkgdG8gYmUgYWRkZWQKKyAqIEBoZWFkOglsaXN0IGhlYWQgdG8gYWRkIGl0IGFmdGVyCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgZ29vZCBmb3IgaW1wbGVtZW50aW5nIHN0YWNrcy4KKyAqLwordm9pZCBsaXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICphZGQsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2FkZChhZGQsIGhlYWQsIGhlYWQtPm5leHQpOworfQorCisvKgorICogbGlzdF9hZGRfdGFpbCAtIGFkZCBhIG5ldyBlbnRyeQorICogQGFkZDoJbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDoJbGlzdCBoZWFkIHRvIGFkZCBpdCBiZWZvcmUKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgcXVldWVzLgorICovCit2b2lkIGxpc3RfYWRkX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqYWRkLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQoYWRkLCBoZWFkLT5wcmV2LCBoZWFkKTsKK30KKworLyoKKyAqIERlbGV0ZSBhIGxpc3QgZW50cnkgYnkgbWFraW5nIHRoZSBwcmV2L25leHQgZW50cmllcworICogcG9pbnQgdG8gZWFjaCBvdGhlci4KKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCit2b2lkIF9fbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsIHN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXh0OworfQorCisvKgorICogbGlzdF9kZWwgLSBkZWxldGVzIGVudHJ5IGZyb20gbGlzdC4KKyAqIEBlbnRyeToJdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKgorICogbGlzdF9lbXB0eSgpIG9uIEBlbnRyeSBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBhZnRlciB0aGlzLCBAZW50cnkgaXMKKyAqIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KKyAqLwordm9pZCBsaXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKK3sKKwlfX2xpc3RfZGVsKGVudHJ5LT5wcmV2LCBlbnRyeS0+bmV4dCk7Cit9CisKKy8qCisgKiBsaXN0X2RlbF9pbml0IC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxpc3QgYW5kIHJlaW5pdGlhbGl6ZSBpdC4KKyAqIEBlbnRyeToJdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKi8KK3ZvaWQgbGlzdF9kZWxfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKK3sKKwlfX2xpc3RfZGVsKGVudHJ5LT5wcmV2LCBlbnRyeS0+bmV4dCk7CisJSU5JVF9MSVNUX0hFQUQoZW50cnkpOworfQorCisvKgorICogbGlzdF9lbXB0eSAtIHRlc3RzIHdoZXRoZXIgYSBsaXN0IGlzIGVtcHR5CisgKiBAaGVhZDoJdGhlIGxpc3QgdG8gdGVzdC4KKyAqLworaW50IGxpc3RfZW1wdHkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOworfQorCisvKgorICogbGlzdF9zcGxpY2UgLSBqb2luIHR3byBsaXN0cworICogQGxpc3Q6CXRoZSBuZXcgbGlzdCB0byBhZGQuCisgKiBAaGVhZDoJdGhlIHBsYWNlIHRvIGFkZCBpdCBpbiB0aGUgZmlyc3QgbGlzdC4KKyAqLwordm9pZCBsaXN0X3NwbGljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0ID0gbGlzdC0+bmV4dDsKKworCWlmIChmaXJzdCAhPSBsaXN0KSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmxhc3QgPSBsaXN0LT5wcmV2OworCQlzdHJ1Y3QgbGlzdF9oZWFkICphdCA9IGhlYWQtPm5leHQ7CisKKwkJZmlyc3QtPnByZXYgPSBoZWFkOworCQloZWFkLT5uZXh0ID0gZmlyc3Q7CisKKwkJbGFzdC0+bmV4dCA9IGF0OworCQlhdC0+cHJldiA9IGxhc3Q7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvbGlzdC5oIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNGJhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9saXN0LmgKQEAgLTAsMCArMSw3MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaWYgIWRlZmluZWQoX0JMS0lEX0xJU1RfSCkgJiYgIWRlZmluZWQoTElTVF9IRUFEKQorI2RlZmluZSBCTEtJRF9MSVNUX0ggMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFNvbWUgb2YgdGhlIGludGVybmFsIGZ1bmN0aW9ucyAoIl9feHh4IikgYXJlIHVzZWZ1bCB3aGVuCisgKiBtYW5pcHVsYXRpbmcgd2hvbGUgbGlzdHMgcmF0aGVyIHRoYW4gc2luZ2xlIGVudHJpZXMsIGFzCisgKiBzb21ldGltZXMgd2UgYWxyZWFkeSBrbm93IHRoZSBuZXh0L3ByZXYgZW50cmllcyBhbmQgd2UgY2FuCisgKiBnZW5lcmF0ZSBiZXR0ZXIgY29kZSBieSB1c2luZyB0aGVtIGRpcmVjdGx5IHJhdGhlciB0aGFuCisgKiB1c2luZyB0aGUgZ2VuZXJpYyBzaW5nbGUtZW50cnkgcm91dGluZXMuCisgKi8KKworc3RydWN0IGxpc3RfaGVhZCB7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7Cit9OworCisjZGVmaW5lIExJU1RfSEVBRF9JTklUKG5hbWUpIHsgJihuYW1lKSwgJihuYW1lKSB9CisKKyNkZWZpbmUgTElTVF9IRUFEKG5hbWUpIFwKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWUgPSBMSVNUX0hFQURfSU5JVChuYW1lKQorCisjZGVmaW5lIElOSVRfTElTVF9IRUFEKHB0cikgZG8geyBcCisJKHB0ciktPm5leHQgPSAocHRyKTsgKHB0ciktPnByZXYgPSAocHRyKTsgXAorfSB3aGlsZSAoMCkKKwordm9pZCBfX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKiBhZGQsIHN0cnVjdCBsaXN0X2hlYWQgKiBwcmV2LAlzdHJ1Y3QgbGlzdF9oZWFkICogbmV4dCk7Cit2b2lkIGxpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKmFkZCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Cit2b2lkIGxpc3RfYWRkX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqYWRkLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKK3ZvaWQgX19saXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICogcHJldiwgc3RydWN0IGxpc3RfaGVhZCAqIG5leHQpOwordm9pZCBsaXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSk7Cit2b2lkIGxpc3RfZGVsX2luaXQoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpOworaW50IGxpc3RfZW1wdHkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Cit2b2lkIGxpc3Rfc3BsaWNlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOworCisvKioKKyAqIGxpc3RfZW50cnkgLSBnZXQgdGhlIHN0cnVjdCBmb3IgdGhpcyBlbnRyeQorICogQHB0cjoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHBvaW50ZXIuCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIFwKKwkoKHR5cGUgKikoKGNoYXIgKikocHRyKS0odW5zaWduZWQgbG9uZykoJigodHlwZSAqKTApLT5tZW1iZXIpKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoIC0gaXRlcmF0ZSBvdmVyIGVsZW1lbnRzIGluIGEgbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX3NhZmUgLSBpdGVyYXRlIG92ZXIgZWxlbWVudHMgaW4gYSBsaXN0LCBidXQgZG9uJ3QgZGVyZWZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvcyBhZnRlciB0aGUgYm9keSBpcyBkb25lIChpbiBjYXNlIGl0IGlzIGZyZWVkKQorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBwbmV4dDoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgaXRlbS4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0IChub3QgaW5jbHVkZWQgaW4gaXRlcmF0aW9uKS4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBwbmV4dCwgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0LCBwbmV4dCA9IHBvcy0+bmV4dDsgcG9zICE9IChoZWFkKTsgXAorCSAgICAgcG9zID0gcG5leHQsIHBuZXh0ID0gcG9zLT5uZXh0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3Byb2JlLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9wcm9iZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YmZjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9wcm9iZS5jCkBAIC0wLDAgKzEsNzIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwcm9iZS5jIC0gaWRlbnRpZnkgYSBibG9jayBkZXZpY2UgYnkgaXRzIGNvbnRlbnRzLCBhbmQgcmV0dXJuIGEgZGV2CisgKiAgICAgICAgICAgc3RydWN0IHdpdGggdGhlIGRldGFpbHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgQW5kcmllcyBCcm91d2VyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMgYnkgVGhlb2RvcmUgVHMnbworICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgRGlsZ2VyCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19NS0RFVl9ICisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSAiYmxraWRQLmgiCisjaW5jbHVkZSAiLi4vdXVpZC91dWlkLmgiCisjaW5jbHVkZSAicHJvYmUuaCIKKworLyoKKyAqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgY29kZSB0byBjaGVjayBmb3IgYW4gTURSQUlEIGRldmljZS4gIFdlIGRvCisgKiB0aGlzIHNwZWNpYWwgc2luY2UgaXQgcmVxdWlyZXMgY2hlY2tpbmcgZm9yIGEgc3VwZXJibG9jayBhdCB0aGUgZW5kCisgKiBvZiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGNoZWNrX21kcmFpZChpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKnJldF91dWlkKQoreworCXN0cnVjdCBtZHBfc3VwZXJibG9ja19zICptZDsKKwlibGtpZF9sb2ZmX3QJCW9mZnNldDsKKwljaGFyCQkJYnVmWzQwOTZdOworCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlvZmZzZXQgPSAoYmxraWRfZ2V0X2Rldl9zaXplKGZkKSAmIH4oKGJsa2lkX2xvZmZfdCk2NTUzNSkpIC0gNjU1MzY7CisKKwlpZiAoYmxraWRfbGxzZWVrKGZkLCBvZmZzZXQsIDApIDwgMCB8fAorCSAgICByZWFkKGZkLCBidWYsIDQwOTYpICE9IDQwOTYpCisJCXJldHVybiAtQkxLSURfRVJSX0lPOworCisJLyogQ2hlY2sgZm9yIG1hZ2ljIG51bWJlciAqLworCWlmIChtZW1jbXAoIlwyNTErTlwzNzQiLCBidWYsIDQpKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCWlmICghcmV0X3V1aWQpCisJCXJldHVybiAwOworCSpyZXRfdXVpZCA9IDA7CisKKwkvKiBUaGUgTUQgVVVJRCBpcyBub3QgY29udGlndW91cyBpbiB0aGUgc3VwZXJibG9jaywgbWFrZSBpdCBzbyAqLworCW1kID0gKHN0cnVjdCBtZHBfc3VwZXJibG9ja19zICopYnVmOworCWlmIChtZC0+c2V0X3V1aWQwIHx8IG1kLT5zZXRfdXVpZDEgfHwgbWQtPnNldF91dWlkMiB8fCBtZC0+c2V0X3V1aWQzKSB7CisJCW1lbWNweShyZXRfdXVpZCwgJm1kLT5zZXRfdXVpZDAsIDQpOworCQltZW1jcHkocmV0X3V1aWQsICZtZC0+c2V0X3V1aWQxLCAxMik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfdXVpZChibGtpZF9kZXYgZGV2LCB1dWlkX3QgdXVpZCkKK3sKKwljaGFyCXN0clszN107CisKKwlpZiAoIXV1aWRfaXNfbnVsbCh1dWlkKSkgeworCQl1dWlkX3VucGFyc2UodXVpZCwgc3RyKTsKKwkJYmxraWRfc2V0X3RhZyhkZXYsICJVVUlEIiwgc3RyLCBzaXplb2Yoc3RyKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfZXh0Ml9pbmZvKGJsa2lkX2RldiBkZXYsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKikgYnVmOworCWNvbnN0IGNoYXIgKmxhYmVsID0gTlVMTDsKKworCURCRyhERUJVR19QUk9CRSwgcHJpbnRmKCJleHQyX3NiLmNvbXBhdCA9ICUwOFg6JTA4WDolMDhYXG4iLAorCQkgICBibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfY29tcGF0KSwKKwkJICAgYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX2luY29tcGF0KSwKKwkJICAgYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX3JvX2NvbXBhdCkpKTsKKworCWlmIChzdHJsZW4oZXMtPnNfdm9sdW1lX25hbWUpKQorCQlsYWJlbCA9IGVzLT5zX3ZvbHVtZV9uYW1lOworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCBsYWJlbCwgc2l6ZW9mKGVzLT5zX3ZvbHVtZV9uYW1lKSk7CisKKwlzZXRfdXVpZChkZXYsIGVzLT5zX3V1aWQpOworfQorCitzdGF0aWMgaW50IHByb2JlX2V4dDMoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIGJsa2lkX2RldiBkZXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplczsKKworCWVzID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopYnVmOworCisJLyogRGlzdGluZ3Vpc2ggYmV0d2VlbiBqYmQgYW5kIGV4dDIvMyBmcyAqLworCWlmIChibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCS8qIERpc3Rpbmd1aXNoIGJldHdlZW4gZXh0MyBhbmQgZXh0MiAqLworCWlmICghKGJsa2lkX2xlMzIoZXMtPnNfZmVhdHVyZV9jb21wYXQpICYKKwkgICAgICBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlnZXRfZXh0Ml9pbmZvKGRldiwgYnVmKTsKKworCWJsa2lkX3NldF90YWcoZGV2LCAiU0VDX1RZUEUiLCAiZXh0MiIsIHNpemVvZigiZXh0MiIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX2V4dDIoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIGJsa2lkX2RldiBkZXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplczsKKworCWVzID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopYnVmOworCisJLyogRGlzdGluZ3Vpc2ggYmV0d2VlbiBqYmQgYW5kIGV4dDIvMyBmcyAqLworCWlmIChibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCWdldF9leHQyX2luZm8oZGV2LCBidWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfamJkKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcyA9IChzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqKSBidWY7CisKKwlpZiAoIShibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgICBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYpKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCWdldF9leHQyX2luZm8oZGV2LCBidWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfdmZhdChpbnQgZmQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgYmxraWRfY2FjaGUgY2FjaGUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IHZmYXRfc3VwZXJfYmxvY2sgKnZzOworCWNoYXIgc2Vybm9bMTBdOworCWNvbnN0IGNoYXIgKmxhYmVsID0gTlVMTDsKKwlpbnQgbGFiZWxfbGVuID0gMDsKKworCXZzID0gKHN0cnVjdCB2ZmF0X3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKHN0cm5jbXAodnMtPnZzX2xhYmVsLCAiTk8gTkFNRSIsIDcpKSB7CisJCWNoYXIgKmVuZCA9IHZzLT52c19sYWJlbCArIHNpemVvZih2cy0+dnNfbGFiZWwpIC0gMTsKKworCQl3aGlsZSAoKmVuZCA9PSAnICcgJiYgZW5kID49IHZzLT52c19sYWJlbCkKKwkJCS0tZW5kOworCQlpZiAoZW5kID49IHZzLT52c19sYWJlbCkgeworCQkJbGFiZWwgPSB2cy0+dnNfbGFiZWw7CisJCQlsYWJlbF9sZW4gPSBlbmQgLSB2cy0+dnNfbGFiZWwgKyAxOworCQl9CisJfQorCisJLyogV2UgY2FuJ3QganVzdCBwcmludCB0aGVtIGFzICUwNFgsIGJlY2F1c2UgdGhleSBhcmUgdW5hbGlnbmVkICovCisJc3ByaW50ZihzZXJubywgIiUwMlglMDJYLSUwMlglMDJYIiwgdnMtPnZzX3Nlcm5vWzNdLCB2cy0+dnNfc2Vybm9bMl0sCisJCXZzLT52c19zZXJub1sxXSwgdnMtPnZzX3Nlcm5vWzBdKTsKKwlibGtpZF9zZXRfdGFnKGRldiwgIkxBQkVMIiwgbGFiZWwsIGxhYmVsX2xlbik7CisJYmxraWRfc2V0X3RhZyhkZXYsICJVVUlEIiwgc2Vybm8sIHNpemVvZihzZXJubykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfbXNkb3MoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbXNkb3Nfc3VwZXJfYmxvY2sgKm1zID0gKHN0cnVjdCBtc2Rvc19zdXBlcl9ibG9jayAqKSBidWY7CisJY2hhciBzZXJub1sxMF07CisJY29uc3QgY2hhciAqbGFiZWwgPSBOVUxMOworCWludCBsYWJlbF9sZW4gPSAwOworCisJaWYgKHN0cm5jbXAobXMtPm1zX2xhYmVsLCAiTk8gTkFNRSIsIDcpKSB7CisJCWNoYXIgKmVuZCA9IG1zLT5tc19sYWJlbCArIHNpemVvZihtcy0+bXNfbGFiZWwpIC0gMTsKKworCQl3aGlsZSAoKmVuZCA9PSAnICcgJiYgZW5kID49IG1zLT5tc19sYWJlbCkKKwkJCS0tZW5kOworCQlpZiAoZW5kID49IG1zLT5tc19sYWJlbCkgeworCQkJbGFiZWwgPSBtcy0+bXNfbGFiZWw7CisJCQlsYWJlbF9sZW4gPSBlbmQgLSBtcy0+bXNfbGFiZWwgKyAxOworCQl9CisJfQorCisJLyogV2UgY2FuJ3QganVzdCBwcmludCB0aGVtIGFzICUwNFgsIGJlY2F1c2UgdGhleSBhcmUgdW5hbGlnbmVkICovCisJc3ByaW50ZihzZXJubywgIiUwMlglMDJYLSUwMlglMDJYIiwgbXMtPm1zX3Nlcm5vWzNdLCBtcy0+bXNfc2Vybm9bMl0sCisJCW1zLT5tc19zZXJub1sxXSwgbXMtPm1zX3Nlcm5vWzBdKTsKKwlibGtpZF9zZXRfdGFnKGRldiwgIlVVSUQiLCBzZXJubywgMCk7CisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIGxhYmVsLCBsYWJlbF9sZW4pOworCWJsa2lkX3NldF90YWcoZGV2LCAiU0VDX1RZUEUiLCAibXNkb3MiLCBzaXplb2YoIm1zZG9zIikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfeGZzKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCB4ZnNfc3VwZXJfYmxvY2sgKnhzOworCWNvbnN0IGNoYXIgKmxhYmVsID0gTlVMTDsKKworCXhzID0gKHN0cnVjdCB4ZnNfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAoc3RybGVuKHhzLT54c19mbmFtZSkpCisJCWxhYmVsID0geHMtPnhzX2ZuYW1lOworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCBsYWJlbCwgc2l6ZW9mKHhzLT54c19mbmFtZSkpOworCXNldF91dWlkKGRldiwgeHMtPnhzX3V1aWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX3JlaXNlcmZzKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkJICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkJICBibGtpZF9kZXYgZGV2LAorCQkJICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKikgYnVmOworCXVuc2lnbmVkIGludCBibG9ja3NpemU7CisJY29uc3QgY2hhciAqbGFiZWwgPSBOVUxMOworCisJYmxvY2tzaXplID0gYmxraWRfbGUxNihycy0+cnNfYmxvY2tzaXplKTsKKworCS8qIElmIHRoZSBzdXBlcmJsb2NrIGlzIGluc2lkZSB0aGUgam91cm5hbCwgd2UgaGF2ZSB0aGUgd3Jvbmcgb25lICovCisJaWYgKGlkLT5iaW1fa2JvZmYvKGJsb2Nrc2l6ZT4+MTApID4gYmxraWRfbGUzMihycy0+cnNfam91cm5hbF9ibG9jaykpCisJCXJldHVybiAtQkxLSURfRVJSX0JJRzsKKworCS8qIExBQkVML1VVSUQgYXJlIG9ubHkgdmFsaWQgZm9yIGxhdGVyIHZlcnNpb25zIG9mIFJlaXNlcmZzIHYzLjYuICovCisJaWYgKCFzdHJjbXAoaWQtPmJpbV9tYWdpYywgIlJlSXNFcjJGcyIpIHx8CisJICAgICFzdHJjbXAoaWQtPmJpbV9tYWdpYywgIlJlSXNFcjNGcyIpKSB7CisJCWlmIChzdHJsZW4ocnMtPnJzX2xhYmVsKSkKKwkJCWxhYmVsID0gcnMtPnJzX2xhYmVsOworCQlzZXRfdXVpZChkZXYsIHJzLT5yc191dWlkKTsKKwl9CisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIGxhYmVsLCBzaXplb2YocnMtPnJzX2xhYmVsKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9qZnMoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgYmxraWRfY2FjaGUgY2FjaGUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICBibGtpZF9kZXYgZGV2LAorCQkgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IGpmc19zdXBlcl9ibG9jayAqanM7CisJY29uc3QgY2hhciAqbGFiZWwgPSBOVUxMOworCisJanMgPSAoc3RydWN0IGpmc19zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChzdHJsZW4oKGNoYXIgKikganMtPmpzX2xhYmVsKSkKKwkJbGFiZWwgPSAoY2hhciAqKSBqcy0+anNfbGFiZWw7CisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIGxhYmVsLCBzaXplb2YoanMtPmpzX2xhYmVsKSk7CisJc2V0X3V1aWQoZGV2LCBqcy0+anNfdXVpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfcm9tZnMoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgKnJvczsKKwljb25zdCBjaGFyICpsYWJlbCA9IE5VTEw7CisKKwlyb3MgPSAoc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKHN0cmxlbigoY2hhciAqKSByb3MtPnJvc192b2x1bWUpKQorCQlsYWJlbCA9IChjaGFyICopIHJvcy0+cm9zX3ZvbHVtZTsKKwlibGtpZF9zZXRfdGFnKGRldiwgIkxBQkVMIiwgbGFiZWwsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX2NyYW1mcyhpbnQgZmQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICBibGtpZF9kZXYgZGV2LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBjcmFtZnNfc3VwZXJfYmxvY2sgKmNzYjsKKwljb25zdCBjaGFyICpsYWJlbCA9IE5VTEw7CisKKwljc2IgPSAoc3RydWN0IGNyYW1mc19zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChzdHJsZW4oKGNoYXIgKikgY3NiLT5uYW1lKSkKKwkJbGFiZWwgPSAoY2hhciAqKSBjc2ItPm5hbWU7CisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIGxhYmVsLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9zd2FwMChpbnQgZmQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICBibGtpZF9kZXYgZGV2LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmIF9fQkxLSURfQVRUUigodW51c2VkKSkpCit7CisJYmxraWRfc2V0X3RhZyhkZXYsICJVVUlEIiwgMCwgMCk7CisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIDAsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX3N3YXAxKGludCBmZCwKKwkJICAgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICBibGtpZF9kZXYgZGV2LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmIF9fQkxLSURfQVRUUigodW51c2VkKSkpCit7CisJc3RydWN0IHN3YXBfaWRfYmxvY2sgKnN3czsKKworCXByb2JlX3N3YXAwKGZkLCBjYWNoZSwgZGV2LCBpZCwgYnVmKTsKKwkvKgorCSAqIFZlcnNpb24gMSBzd2FwIGhlYWRlcnMgYXJlIGFsd2F5cyBsb2NhdGVkIGF0IG9mZnNldCBvZiAxMDI0CisJICogYnl0ZXMsIGFsdGhvdWdoIHRoZSBzd2FwIHNpZ25hdHVyZSBpdHNlbGYgaXMgbG9jYXRlZCBhdCB0aGUKKwkgKiBlbmQgb2YgdGhlIHBhZ2UgKHdoaWNoIG1heSB2YXJ5IGRlcGVuZGluZyBvbiBoYXJkd2FyZQorCSAqIHBhZ2VzaXplKS4KKwkgKi8KKwlpZiAobHNlZWsoZmQsIDEwMjQsIFNFRUtfU0VUKSA8IDApIHJldHVybiAxOworCXN3cyA9IHhtYWxsb2MoMTAyNCk7CisJaWYgKHJlYWQoZmQsIHN3cywgMTAyNCkgIT0gMTAyNCkgeworCQlmcmVlKHN3cyk7CisJCXJldHVybiAxOworCX0KKworCS8qIGFyYml0cmFyeSBzYW5pdHkgY2hlY2suLiBpcyB0aGVyZSBhbnkgZ2FyYmFnZSBkb3duIHRoZXJlPyAqLworCWlmIChzd3MtPnN3c19wYWRbMzJdID09IDAgJiYgc3dzLT5zd3NfcGFkWzMzXSA9PSAwKSAgeworCQlpZiAoc3dzLT5zd3Nfdm9sdW1lWzBdKQorCQkJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIChjb25zdCBjaGFyKilzd3MtPnN3c192b2x1bWUsCisJCQkJICAgICAgc2l6ZW9mKHN3cy0+c3dzX3ZvbHVtZSkpOworCQlpZiAoc3dzLT5zd3NfdXVpZFswXSkKKwkJCXNldF91dWlkKGRldiwgc3dzLT5zd3NfdXVpZCk7CisJfQorCWZyZWUoc3dzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhcgorKiBjb25zdCB1ZGZfbWFnaWNbXSA9IHsgIkJFQTAxIiwgIkJPT1QyIiwgIkNEMDAxIiwgIkNEVzAyIiwgIk5TUjAyIiwKKwkJICJOU1IwMyIsICJURUEwMSIsIDAgfTsKKworc3RhdGljIGludCBwcm9iZV91ZGYoaW50IGZkLCBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIGJsa2lkX2RldiBkZXYgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgdW5zaWduZWQgY2hhciAqYnVmIF9fQkxLSURfQVRUUigodW51c2VkKSkpCit7CisJaW50IGosIGJzOworCXN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgaXNvc2I7CisJY29uc3QgY2hhciAqY29uc3QgKm07CisKKwkvKiBkZXRlcm1pbmUgdGhlIGJsb2NrIHNpemUgYnkgc2Nhbm5pbmcgaW4gMksgaW5jcmVtZW50cworCSAgIChibG9jayBzaXplcyBsYXJnZXIgdGhhbiAySyB3aWxsIGJlIG51bGwgcGFkZGVkKSAqLworCWZvciAoYnMgPSAxOyBicyA8IDE2OyBicysrKSB7CisJCWxzZWVrKGZkLCBicyoyMDQ4KzMyNzY4LCBTRUVLX1NFVCk7CisJCWlmIChyZWFkKGZkLCAoY2hhciAqKSZpc29zYiwgc2l6ZW9mKGlzb3NiKSkgIT0gc2l6ZW9mKGlzb3NiKSkKKwkJCXJldHVybiAxOworCQlpZiAoaXNvc2IuaWRbMF0pCisJCQlicmVhazsKKwl9CisKKwkvKiBTY2FuIHVwIHRvIGFub3RoZXIgNjQgYmxvY2tzIGxvb2tpbmcgZm9yIGFkZGl0aW9uYWwgVlNEJ3MgKi8KKwlmb3IgKGogPSAxOyBqIDwgNjQ7IGorKykgeworCQlpZiAoaiA+IDEpIHsKKwkJCWxzZWVrKGZkLCBqKmJzKjIwNDgrMzI3NjgsIFNFRUtfU0VUKTsKKwkJCWlmIChyZWFkKGZkLCAoY2hhciAqKSZpc29zYiwgc2l6ZW9mKGlzb3NiKSkKKwkJCSAgICAhPSBzaXplb2YoaXNvc2IpKQorCQkJCXJldHVybiAxOworCQl9CisJCS8qIElmIHdlIGZpbmQgTlNSMHggdGhlbiBjYWxsIGl0IHVkZjoKKwkJICAgTlNSMDEgZm9yIFVERiAxLjAwCisJCSAgIE5TUjAyIGZvciBVREYgMS41MAorCQkgICBOU1IwMyBmb3IgVURGIDIuMDAgKi8KKwkJaWYgKCFzdHJuY21wKGlzb3NiLmlkLCAiTlNSMCIsIDQpKQorCQkJcmV0dXJuIDA7CisJCWZvciAobSA9IHVkZl9tYWdpYzsgKm07IG0rKykKKwkJCWlmICghc3RybmNtcCgqbSwgaXNvc2IuaWQsIDUpKQorCQkJCWJyZWFrOworCQlpZiAoKm0gPT0gMCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwcm9iZV9vY2ZzKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBibGtpZF9kZXYgZGV2LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb2Nmc192b2x1bWVfaGVhZGVyIG92aDsKKwlzdHJ1Y3Qgb2Nmc192b2x1bWVfbGFiZWwgb3ZsOworCV9fdTMyIG1ham9yOworCisJbWVtY3B5KCZvdmgsIGJ1Ziwgc2l6ZW9mKG92aCkpOworCW1lbWNweSgmb3ZsLCBidWYrNTEyLCBzaXplb2Yob3ZsKSk7CisKKwltYWpvciA9IG9jZnNtYWpvcihvdmgpOworCWlmIChtYWpvciA9PSAxKQorCQlibGtpZF9zZXRfdGFnKGRldiwgIlNFQ19UWVBFIiwgIm9jZnMxIiwgc2l6ZW9mKCJvY2ZzMSIpKTsKKwllbHNlIGlmIChtYWpvciA+PSA5KQorCQlibGtpZF9zZXRfdGFnKGRldiwgIlNFQ19UWVBFIiwgIm50b2NmcyIsIHNpemVvZigibnRvY2ZzIikpOworCisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIChjb25zdCBjaGFyKilvdmwubGFiZWwsIG9jZnNsYWJlbGxlbihvdmwpKTsKKwlibGtpZF9zZXRfdGFnKGRldiwgIk1PVU5UIiwgKGNvbnN0IGNoYXIqKW92aC5tb3VudCwgb2Nmc21vdW50bGVuKG92aCkpOworCXNldF91dWlkKGRldiwgb3ZsLnZvbF9pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfb2NmczIoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXJfYmxvY2sgKm9zYjsKKworCW9zYiA9IChzdHJ1Y3Qgb2NmczJfc3VwZXJfYmxvY2sgKilidWY7CisKKwlibGtpZF9zZXRfdGFnKGRldiwgIkxBQkVMIiwgKGNvbnN0IGNoYXIqKW9zYi0+c19sYWJlbCwgc2l6ZW9mKG9zYi0+c19sYWJlbCkpOworCXNldF91dWlkKGRldiwgb3NiLT5zX3V1aWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX29yYWNsZWFzbShpbnQgZmQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCQkgICBibGtpZF9kZXYgZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkJICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBvcmFjbGVfYXNtX2Rpc2tfbGFiZWwgKmRsOworCisJZGwgPSAoc3RydWN0IG9yYWNsZV9hc21fZGlza19sYWJlbCAqKWJ1ZjsKKworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCBkbC0+ZGxfaWQsIHNpemVvZihkbC0+ZGxfaWQpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJMS0lEX0JMS19PRkZTIGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBoaWdoZXN0IGJpbV9rYm9mZiBkZWZpbmVkCisgKiBpbiB0aGUgdHlwZV9hcnJheSB0YWJsZSBiZWxvdyArIGJpbV9rYmFsaWduLgorICoKKyAqIFdoZW4gcHJvYmluZyBmb3IgYSBsb3Qgb2YgbWFnaWNzLCB3ZSBoYW5kbGUgZXZlcnl0aGluZyBpbiAxa0IgYnVmZmVycyBzbworICogdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHJlYWRpbmcgZWFjaCBjb21iaW5hdGlvbiBvZiBibG9jayBzaXplcy4KKyAqLworI2RlZmluZSBCTEtJRF9CTEtfT0ZGUwk2NAkvKiBjdXJyZW50bHkgcmVpc2VyZnMgKi8KKworLyoKKyAqIFZhcmlvdXMgZmlsZXN5c3RlbSBtYWdpY3MgdGhhdCB3ZSBjYW4gY2hlY2sgZm9yLiAgTm90ZSB0aGF0IGtib2ZmIGFuZAorICogc2JvZmYgYXJlIGluIGtpbG9ieXRlcyBhbmQgYnl0ZXMgcmVzcGVjdGl2ZWx5LiAgQWxsIG1hZ2ljcyBhcmUgaW4KKyAqIGJ5dGUgc3RyaW5ncyBzbyB3ZSBkb24ndCB3b3JyeSBhYm91dCBlbmRpYW4gaXNzdWVzLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljIHR5cGVfYXJyYXlbXSA9IHsKKy8qICB0eXBlICAgICBrYm9mZiAgIHNib2ZmIGxlbiAgbWFnaWMJCQlwcm9iZSAqLworICB7ICJvcmFjbGVhc20iLCAwLAkzMiwgIDgsICJPUkNMRElTSyIsCQlwcm9iZV9vcmFjbGVhc20gfSwKKyAgeyAibnRmcyIsICAgICAgMCwgICAgICAzLCAgOCwgIk5URlMgICAgIiwgICAgICAgICAgICAgMCB9LAorICB7ICJqYmQiLAkgMSwgICAweDM4LCAgMiwgIlwxMjNcMzU3IiwJCXByb2JlX2piZCB9LAorICB7ICJleHQzIiwJIDEsICAgMHgzOCwgIDIsICJcMTIzXDM1NyIsCQlwcm9iZV9leHQzIH0sCisgIHsgImV4dDIiLAkgMSwgICAweDM4LCAgMiwgIlwxMjNcMzU3IiwJCXByb2JlX2V4dDIgfSwKKyAgeyAicmVpc2VyZnMiLAkgOCwgICAweDM0LCAgOCwgIlJlSXNFckZzIiwJCXByb2JlX3JlaXNlcmZzIH0sCisgIHsgInJlaXNlcmZzIiwgNjQsICAgMHgzNCwgIDksICJSZUlzRXIyRnMiLAkJcHJvYmVfcmVpc2VyZnMgfSwKKyAgeyAicmVpc2VyZnMiLCA2NCwgICAweDM0LCAgOSwgIlJlSXNFcjNGcyIsCQlwcm9iZV9yZWlzZXJmcyB9LAorICB7ICJyZWlzZXJmcyIsIDY0LCAgIDB4MzQsICA4LCAiUmVJc0VyRnMiLAkJcHJvYmVfcmVpc2VyZnMgfSwKKyAgeyAicmVpc2VyZnMiLAkgOCwJMjAsICA4LCAiUmVJc0VyRnMiLAkJcHJvYmVfcmVpc2VyZnMgfSwKKyAgeyAidmZhdCIsICAgICAgMCwgICAweDUyLCAgNSwgIk1TV0lOIiwgICAgICAgICAgICAgICAgcHJvYmVfdmZhdCB9LAorICB7ICJ2ZmF0IiwgICAgICAwLCAgIDB4NTIsICA4LCAiRkFUMzIgICAiLCAgICAgICAgICAgICBwcm9iZV92ZmF0IH0sCisgIHsgInZmYXQiLCAgICAgIDAsICAgMHgzNiwgIDUsICJNU0RPUyIsICAgICAgICAgICAgICAgIHByb2JlX21zZG9zIH0sCisgIHsgInZmYXQiLCAgICAgIDAsICAgMHgzNiwgIDgsICJGQVQxNiAgICIsICAgICAgICAgICAgIHByb2JlX21zZG9zIH0sCisgIHsgInZmYXQiLCAgICAgIDAsICAgMHgzNiwgIDgsICJGQVQxMiAgICIsICAgICAgICAgICAgIHByb2JlX21zZG9zIH0sCisgIHsgIm1pbml4IiwgICAgIDEsICAgMHgxMCwgIDIsICJcMTc3XDAyMyIsICAgICAgICAgICAgIDAgfSwKKyAgeyAibWluaXgiLCAgICAgMSwgICAweDEwLCAgMiwgIlwyMTdcMDIzIiwgICAgICAgICAgICAgMCB9LAorICB7ICJtaW5peCIsCSAxLCAgIDB4MTAsICAyLCAiXDE1MFwwNDQiLAkJMCB9LAorICB7ICJtaW5peCIsCSAxLCAgIDB4MTAsICAyLCAiXDE3MFwwNDQiLAkJMCB9LAorICB7ICJ2eGZzIiwJIDEsCSAwLCAgNCwgIlwzNjVcMzc0XDAwMVwyNDUiLAkwIH0sCisgIHsgInhmcyIsCSAwLAkgMCwgIDQsICJYRlNCIiwJCQlwcm9iZV94ZnMgfSwKKyAgeyAicm9tZnMiLAkgMCwJIDAsICA4LCAiLXJvbTFmcy0iLAkJcHJvYmVfcm9tZnMgfSwKKyAgeyAiYmZzIiwJIDAsCSAwLCAgNCwgIlwzMTZcMzcyXDE3M1wwMzMiLAkwIH0sCisgIHsgImNyYW1mcyIsCSAwLAkgMCwgIDQsICJFPVwzMTVcMDUwIiwJCXByb2JlX2NyYW1mcyB9LAorICB7ICJxbng0IiwJIDAsCSA0LCAgNiwgIlFOWDRGUyIsCQkwIH0sCisgIHsgInVkZiIsCTMyLAkgMSwgIDUsICJCRUEwMSIsCQlwcm9iZV91ZGYgfSwKKyAgeyAidWRmIiwJMzIsCSAxLCAgNSwgIkJPT1QyIiwJCXByb2JlX3VkZiB9LAorICB7ICJ1ZGYiLAkzMiwJIDEsICA1LCAiQ0QwMDEiLAkJcHJvYmVfdWRmIH0sCisgIHsgInVkZiIsCTMyLAkgMSwgIDUsICJDRFcwMiIsCQlwcm9iZV91ZGYgfSwKKyAgeyAidWRmIiwJMzIsCSAxLCAgNSwgIk5TUjAyIiwJCXByb2JlX3VkZiB9LAorICB7ICJ1ZGYiLAkzMiwJIDEsICA1LCAiTlNSMDMiLAkJcHJvYmVfdWRmIH0sCisgIHsgInVkZiIsCTMyLAkgMSwgIDUsICJURUEwMSIsCQlwcm9iZV91ZGYgfSwKKyAgeyAiaXNvOTY2MCIsCTMyLAkgMSwgIDUsICJDRDAwMSIsCQkwIH0sCisgIHsgImlzbzk2NjAiLAkzMiwJIDksICA1LCAiQ0RST00iLAkJMCB9LAorICB7ICJqZnMiLAkzMiwJIDAsICA0LCAiSkZTMSIsCQkJcHJvYmVfamZzIH0sCisgIHsgImhmcyIsCSAxLAkgMCwgIDIsICJCRCIsCQkJMCB9LAorICB7ICJ1ZnMiLAkgOCwgIDB4NTVjLCAgNCwgIlRcMDMxXDAwMVwwMDAiLAkwIH0sCisgIHsgImhwZnMiLAkgOCwJIDAsICA0LCAiSVwzNTBcMjI1XDM3MSIsCTAgfSwKKyAgeyAic3lzdiIsCSAwLCAgMHgzZjgsICA0LCAiXDAyMH5cMDMwXDM3NSIsCTAgfSwKKyAgeyAic3dhcCIsCSAwLCAgMHhmZjYsIDEwLCAiU1dBUC1TUEFDRSIsCQlwcm9iZV9zd2FwMCB9LAorICB7ICJzd2FwIiwJIDAsICAweGZmNiwgMTAsICJTV0FQU1BBQ0UyIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3YXAiLAkgMCwgMHgxZmY2LCAxMCwgIlNXQVAtU1BBQ0UiLAkJcHJvYmVfc3dhcDAgfSwKKyAgeyAic3dhcCIsCSAwLCAweDFmZjYsIDEwLCAiU1dBUFNQQUNFMiIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd2FwIiwJIDAsIDB4M2ZmNiwgMTAsICJTV0FQLVNQQUNFIiwJCXByb2JlX3N3YXAwIH0sCisgIHsgInN3YXAiLAkgMCwgMHgzZmY2LCAxMCwgIlNXQVBTUEFDRTIiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAic3dhcCIsCSAwLCAweDdmZjYsIDEwLCAiU1dBUC1TUEFDRSIsCQlwcm9iZV9zd2FwMCB9LAorICB7ICJzd2FwIiwJIDAsIDB4N2ZmNiwgMTAsICJTV0FQU1BBQ0UyIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3YXAiLAkgMCwgMHhmZmY2LCAxMCwgIlNXQVAtU1BBQ0UiLAkJcHJvYmVfc3dhcDAgfSwKKyAgeyAic3dhcCIsCSAwLCAweGZmZjYsIDEwLCAiU1dBUFNQQUNFMiIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJvY2ZzIiwJIDAsCSA4LCAgOSwJIk9yYWNsZUNGUyIsCQlwcm9iZV9vY2ZzIH0sCisgIHsgIm9jZnMyIiwJIDEsCSAwLCAgNiwJIk9DRlNWMiIsCQlwcm9iZV9vY2ZzMiB9LAorICB7ICJvY2ZzMiIsCSAyLAkgMCwgIDYsCSJPQ0ZTVjIiLAkJcHJvYmVfb2NmczIgfSwKKyAgeyAib2NmczIiLAkgNCwJIDAsICA2LAkiT0NGU1YyIiwJCXByb2JlX29jZnMyIH0sCisgIHsgIm9jZnMyIiwJIDgsCSAwLCAgNiwJIk9DRlNWMiIsCQlwcm9iZV9vY2ZzMiB9LAorICB7ICAgTlVMTCwJIDAsCSAwLCAgMCwgTlVMTCwJCQlOVUxMIH0KK307CisKKy8qCisgKiBWZXJpZnkgdGhhdCB0aGUgZGF0YSBpbiBkZXYgaXMgY29uc2lzdGVudCB3aXRoIHdoYXQgaXMgb24gdGhlIGFjdHVhbAorICogYmxvY2sgZGV2aWNlICh1c2luZyB0aGUgZGV2bmFtZSBmaWVsZCBvbmx5KS4gIE5vcm1hbGx5IHRoaXMgd2lsbCBiZQorICogY2FsbGVkIHdoZW4gZmluZGluZyBpdGVtcyBpbiB0aGUgY2FjaGUsIGJ1dCBmb3IgbG9uZyBydW5uaW5nIHByb2Nlc3NlcworICogaXMgYWxzbyBkZXNpcmFibGUgdG8gcmV2YWxpZGF0ZSBhbiBpdGVtIGJlZm9yZSB1c2UuCisgKgorICogSWYgd2UgYXJlIHVuYWJsZSB0byByZXZhbGlkYXRlIHRoZSBkYXRhLCB3ZSByZXR1cm4gdGhlIG9sZCBkYXRhIGFuZAorICogZG8gbm90IHNldCB0aGUgQkxLSURfQklEX0ZMX1ZFUklGSUVEIGZsYWcgb24gaXQuCisgKi8KK2Jsa2lkX2RldiBibGtpZF92ZXJpZnkoYmxraWRfY2FjaGUgY2FjaGUsIGJsa2lkX2RldiBkZXYpCit7CisJY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZDsKKwl1bnNpZ25lZCBjaGFyICpidWZzW0JMS0lEX0JMS19PRkZTICsgMV0sICpidWY7CisJY29uc3QgY2hhciAqdHlwZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl0aW1lX3QgZGlmZiwgbm93OworCWludCBmZCwgaWR4OworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJbm93ID0gdGltZShOVUxMKTsKKwlkaWZmID0gbm93IC0gZGV2LT5iaWRfdGltZTsKKworCWlmICgobm93IDwgZGV2LT5iaWRfdGltZSkgfHwKKwkgICAgKGRpZmYgPCBCTEtJRF9QUk9CRV9NSU4pIHx8CisJICAgIChkZXYtPmJpZF9mbGFncyAmIEJMS0lEX0JJRF9GTF9WRVJJRklFRCAmJgorCSAgICAgZGlmZiA8IEJMS0lEX1BST0JFX0lOVEVSVkFMKSkKKwkJcmV0dXJuIGRldjsKKworCURCRyhERUJVR19QUk9CRSwKKwkgICAgcHJpbnRmKCJuZWVkIHRvIHJldmFsaWRhdGUgJXMgKHRpbWUgc2luY2UgbGFzdCBjaGVjayAlbHUpXG4iLAorCQkgICBkZXYtPmJpZF9uYW1lLCBkaWZmKSk7CisKKwlpZiAoKChmZCA9IG9wZW4oZGV2LT5iaWRfbmFtZSwgT19SRE9OTFkpKSA8IDApIHx8CisJICAgIChmc3RhdChmZCwgJnN0KSA8IDApKSB7CisJCWlmIChlcnJubyA9PSBFTlhJTyB8fCBlcnJubyA9PSBFTk9ERVYgfHwgZXJybm8gPT0gRU5PRU5UKSB7CisJCQlibGtpZF9mcmVlX2RldihkZXYpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogV2UgZG9uJ3QgaGF2ZSByZWFkIHBlcm1pc3Npb24sIGp1c3QgcmV0dXJuIGNhY2hlIGRhdGEuICovCisJCURCRyhERUJVR19QUk9CRSwKKwkJICAgIHByaW50ZigicmV0dXJuaW5nIHVudmVyaWZpZWQgZGF0YSBmb3IgJXNcbiIsCisJCQkgICBkZXYtPmJpZF9uYW1lKSk7CisJCXJldHVybiBkZXY7CisJfQorCisJbWVtc2V0KGJ1ZnMsIDAsIHNpemVvZihidWZzKSk7CisKKwkvKgorCSAqIEl0ZXJhdGUgb3ZlciB0aGUgdHlwZSBhcnJheS4gIElmIHdlIGFscmVhZHkga25vdyB0aGUgdHlwZSwKKwkgKiB0aGVuIHRyeSB0aGF0IGZpcnN0LiAgSWYgaXQgZG9lc24ndCB3b3JrLCB0aGVuIGJsb3cgYXdheQorCSAqIHRoZSB0eXBlIGluZm9ybWF0aW9uLCBhbmQgdHJ5IGFnYWluLgorCSAqCisJICovCit0cnlfYWdhaW46CisJdHlwZSA9IDA7CisJaWYgKCFkZXYtPmJpZF90eXBlIHx8ICFzdHJjbXAoZGV2LT5iaWRfdHlwZSwgIm1kcmFpZCIpKSB7CisJCXV1aWRfdAl1dWlkOworCisJCWlmIChjaGVja19tZHJhaWQoZmQsIHV1aWQpID09IDApIHsKKwkJCXNldF91dWlkKGRldiwgdXVpZCk7CisJCQl0eXBlID0gIm1kcmFpZCI7CisJCQlnb3RvIGZvdW5kX3R5cGU7CisJCX0KKwl9CisJZm9yIChpZCA9IHR5cGVfYXJyYXk7IGlkLT5iaW1fdHlwZTsgaWQrKykgeworCQlpZiAoZGV2LT5iaWRfdHlwZSAmJgorCQkgICAgc3RyY21wKGlkLT5iaW1fdHlwZSwgZGV2LT5iaWRfdHlwZSkpCisJCQljb250aW51ZTsKKworCQlpZHggPSBpZC0+YmltX2tib2ZmICsgKGlkLT5iaW1fc2JvZmYgPj4gMTApOworCQlpZiAoaWR4ID4gQkxLSURfQkxLX09GRlMgfHwgaWR4IDwgMCkKKwkJCWNvbnRpbnVlOworCQlidWYgPSBidWZzW2lkeF07CisJCWlmICghYnVmKSB7CisJCQlpZiAobHNlZWsoZmQsIGlkeCA8PCAxMCwgU0VFS19TRVQpIDwgMCkKKwkJCQljb250aW51ZTsKKworCQkJYnVmID0geG1hbGxvYygxMDI0KTsKKworCQkJaWYgKHJlYWQoZmQsIGJ1ZiwgMTAyNCkgIT0gMTAyNCkgeworCQkJCWZyZWUoYnVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJ1ZnNbaWR4XSA9IGJ1ZjsKKwkJfQorCisJCWlmIChtZW1jbXAoaWQtPmJpbV9tYWdpYywgYnVmICsgKGlkLT5iaW1fc2JvZmYmMHgzZmYpLAorCQkJICAgaWQtPmJpbV9sZW4pKQorCQkJY29udGludWU7CisKKwkJaWYgKChpZC0+YmltX3Byb2JlID09IE5VTEwpIHx8CisJCSAgICAoaWQtPmJpbV9wcm9iZShmZCwgY2FjaGUsIGRldiwgaWQsIGJ1ZikgPT0gMCkpIHsKKwkJCXR5cGUgPSBpZC0+YmltX3R5cGU7CisJCQlnb3RvIGZvdW5kX3R5cGU7CisJCX0KKwl9CisKKwlpZiAoIWlkLT5iaW1fdHlwZSAmJiBkZXYtPmJpZF90eXBlKSB7CisJCS8qCisJCSAqIFphcCB0aGUgZGV2aWNlIGZpbGVzeXN0ZW0gdHlwZSBhbmQgdHJ5IGFnYWluCisJCSAqLworCQlibGtpZF9zZXRfdGFnKGRldiwgIlRZUEUiLCAwLCAwKTsKKwkJYmxraWRfc2V0X3RhZyhkZXYsICJTRUNfVFlQRSIsIDAsIDApOworCQlibGtpZF9zZXRfdGFnKGRldiwgIkxBQkVMIiwgMCwgMCk7CisJCWJsa2lkX3NldF90YWcoZGV2LCAiVVVJRCIsIDAsIDApOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwlpZiAoIWRldi0+YmlkX3R5cGUpIHsKKwkJYmxraWRfZnJlZV9kZXYoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCitmb3VuZF90eXBlOgorCWlmIChkZXYgJiYgdHlwZSkgeworCQlkZXYtPmJpZF9kZXZubyA9IHN0LnN0X3JkZXY7CisJCWRldi0+YmlkX3RpbWUgPSB0aW1lKE5VTEwpOworCQlkZXYtPmJpZF9mbGFncyB8PSBCTEtJRF9CSURfRkxfVkVSSUZJRUQ7CisJCWNhY2hlLT5iaWNfZmxhZ3MgfD0gQkxLSURfQklDX0ZMX0NIQU5HRUQ7CisKKwkJYmxraWRfc2V0X3RhZyhkZXYsICJUWVBFIiwgdHlwZSwgMCk7CisKKwkJREJHKERFQlVHX1BST0JFLCBwcmludGYoIiVzOiBkZXZubyAweCUwNGxseCwgdHlwZSAlc1xuIiwKKwkJCSAgIGRldi0+YmlkX25hbWUsIHN0LnN0X3JkZXYsIHR5cGUpKTsKKwl9CisKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gZGV2OworfQorCitpbnQgYmxraWRfa25vd25fZnN0eXBlKGNvbnN0IGNoYXIgKmZzdHlwZSkKK3sKKwljb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkOworCisJZm9yIChpZCA9IHR5cGVfYXJyYXk7IGlkLT5iaW1fdHlwZTsgaWQrKykgeworCQlpZiAoc3RyY21wKGZzdHlwZSwgaWQtPmJpbV90eXBlKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgVEVTVF9QUk9HUkFNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYmxraWRfZGV2IGRldjsKKwlibGtpZF9jYWNoZSBjYWNoZTsKKwlpbnQgcmV0OworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoYXJnYyAhPSAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGRldmljZVxuIgorCQkJIlByb2JlIGEgc2luZ2xlIGRldmljZSB0byBkZXRlcm1pbmUgdHlwZVxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCWlmICgocmV0ID0gYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgYmJfZGV2X251bGwpKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGNyZWF0aW5nIGNhY2hlICglZClcbiIsCisJCQlhcmd2WzBdLCByZXQpOworCQlleGl0KDEpOworCX0KKwlkZXYgPSBibGtpZF9nZXRfZGV2KGNhY2hlLCBhcmd2WzFdLCBCTEtJRF9ERVZfTk9STUFMKTsKKwlpZiAoIWRldikgeworCQlwcmludGYoIiVzOiAlcyBoYXMgYW4gdW5zdXBwb3J0ZWQgdHlwZVxuIiwgYXJndlswXSwgYXJndlsxXSk7CisJCXJldHVybiAxOworCX0KKwlwcmludGYoIiVzIGlzIHR5cGUgJXNcbiIsIGFyZ3ZbMV0sIGRldi0+YmlkX3R5cGUgPworCQlkZXYtPmJpZF90eXBlIDogIihudWxsKSIpOworCWlmIChkZXYtPmJpZF9sYWJlbCkKKwkJcHJpbnRmKCJcdGxhYmVsIGlzICclcydcbiIsIGRldi0+YmlkX2xhYmVsKTsKKwlpZiAoZGV2LT5iaWRfdXVpZCkKKwkJcHJpbnRmKCJcdHV1aWQgaXMgJXNcbiIsIGRldi0+YmlkX3V1aWQpOworCisJYmxraWRfZnJlZV9kZXYoZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvcHJvYmUuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3Byb2JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkOGY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3Byb2JlLmgKQEAgLTAsMCArMSwzNzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHByb2JlLmggLSBjb25zdGFudHMgYW5kIG9uLWRpc2sgc3RydWN0dXJlcyBmb3IgZXh0cmFjdGluZyBkZXZpY2UgZGF0YQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBBbmRyaWVzIEJyb3V3ZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMyBieSBUaGVvZG9yZSBUcydvCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgQW5kcmVhcyBEaWxnZXIKKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisjaWZuZGVmIEJMS0lEX1BST0JFX0gKKyNkZWZpbmUgQkxLSURfUFJPQkVfSCAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgYmxraWRfbWFnaWM7CisKK3R5cGVkZWYgaW50ICgqYmxraWRfcHJvYmVfdCkoaW50IGZkLCBibGtpZF9jYWNoZSBjYWNoZSwgYmxraWRfZGV2IGRldiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCwgdW5zaWduZWQgY2hhciAqYnVmKTsKKworc3RydWN0IGJsa2lkX21hZ2ljIHsKKwljb25zdCBjaGFyCSpiaW1fdHlwZTsJLyogdHlwZSBuYW1lIGZvciB0aGlzIG1hZ2ljICovCisJbG9uZwkJYmltX2tib2ZmOwkvKiBraWxvYnl0ZSBvZmZzZXQgb2Ygc3VwZXJibG9jayAqLworCXVuc2lnbmVkCWJpbV9zYm9mZjsJLyogYnl0ZSBvZmZzZXQgd2l0aGluIHN1cGVyYmxvY2sgKi8KKwl1bnNpZ25lZAliaW1fbGVuOwkvKiBsZW5ndGggb2YgbWFnaWMgKi8KKwljb25zdCBjaGFyCSpiaW1fbWFnaWM7CS8qIG1hZ2ljIHN0cmluZyAqLworCWJsa2lkX3Byb2JlX3QJYmltX3Byb2JlOwkvKiBwcm9iZSBmdW5jdGlvbiAqLworfTsKKworLyoKKyAqIFN0cnVjdHVyZXMgZm9yIGVhY2ggb2YgdGhlIGNvbnRlbnQgdHlwZXMgd2Ugd2FudCB0byBleHRyYWN0IGluZm9ybWF0aW9uCisgKiBmcm9tLiAgV2UgZG8gbm90IG5lY2Vzc2FyaWx5IG5lZWQgdGhlIG1hZ2ljIGZpZWxkIGhlcmUsIGJlY2F1c2Ugd2UgaGF2ZQorICogYWxyZWFkeSBpZGVudGlmaWVkIHRoZSBjb250ZW50IHR5cGUgYmVmb3JlIHdlIGdldCB0aGlzIGZhci4gIEl0IG1heSBzdGlsbAorICogYmUgdXNlZnVsIGlmIHRoZXJlIGFyZSBwcm9iZSBmdW5jdGlvbnMgd2hpY2ggaGFuZGxlIG11bHRpcGxlIGNvbnRlbnQgdHlwZXMuCisgKi8KK3N0cnVjdCBleHQyX3N1cGVyX2Jsb2NrIHsKKwlfX3UzMgkJc19pbm9kZXNfY291bnQ7CisJX191MzIJCXNfYmxvY2tzX2NvdW50OworCV9fdTMyCQlzX3JfYmxvY2tzX2NvdW50OworCV9fdTMyCQlzX2ZyZWVfYmxvY2tzX2NvdW50OworCV9fdTMyCQlzX2ZyZWVfaW5vZGVzX2NvdW50OworCV9fdTMyCQlzX2ZpcnN0X2RhdGFfYmxvY2s7CisJX191MzIJCXNfbG9nX2Jsb2NrX3NpemU7CisJX191MzIJCXNfZHVtbXkzWzddOworCXVuc2lnbmVkIGNoYXIJc19tYWdpY1syXTsKKwlfX3UxNgkJc19zdGF0ZTsKKwlfX3UzMgkJc19kdW1teTVbOF07CisJX191MzIJCXNfZmVhdHVyZV9jb21wYXQ7CisJX191MzIJCXNfZmVhdHVyZV9pbmNvbXBhdDsKKwlfX3UzMgkJc19mZWF0dXJlX3JvX2NvbXBhdDsKKwl1bnNpZ25lZCBjaGFyICAgc191dWlkWzE2XTsKKwljaGFyCSAgIHNfdm9sdW1lX25hbWVbMTZdOworfTsKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTAkJMHgwMDAwMDAwNAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUgkJMHgwMDAwMDAwNAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYJMHgwMDAwMDAwOAorCitzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrIHsKKwl1bnNpZ25lZCBjaGFyCXhzX21hZ2ljWzRdOworCV9fdTMyCQl4c19ibG9ja3NpemU7CisJX191NjQJCXhzX2RibG9ja3M7CisJX191NjQJCXhzX3JibG9ja3M7CisJX191MzIJCXhzX2R1bW15MVsyXTsKKwl1bnNpZ25lZCBjaGFyCXhzX3V1aWRbMTZdOworCV9fdTMyCQl4c19kdW1teTJbMTVdOworCWNoYXIJCXhzX2ZuYW1lWzEyXTsKKwlfX3UzMgkJeHNfZHVtbXkzWzJdOworCV9fdTY0CQl4c19pY291bnQ7CisJX191NjQJCXhzX2lmcmVlOworCV9fdTY0CQl4c19mZGJsb2NrczsKK307CisKK3N0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayB7CisJX191MzIJCXJzX2Jsb2Nrc19jb3VudDsKKwlfX3UzMgkJcnNfZnJlZV9ibG9ja3M7CisJX191MzIJCXJzX3Jvb3RfYmxvY2s7CisJX191MzIJCXJzX2pvdXJuYWxfYmxvY2s7CisJX191MzIJCXJzX2pvdXJuYWxfZGV2OworCV9fdTMyCQlyc19vcmlnX2pvdXJuYWxfc2l6ZTsKKwlfX3UzMgkJcnNfZHVtbXkyWzVdOworCV9fdTE2CQlyc19ibG9ja3NpemU7CisJX191MTYJCXJzX2R1bW15M1szXTsKKwl1bnNpZ25lZCBjaGFyCXJzX21hZ2ljWzEyXTsKKwlfX3UzMgkJcnNfZHVtbXk0WzVdOworCXVuc2lnbmVkIGNoYXIJcnNfdXVpZFsxNl07CisJY2hhcgkJcnNfbGFiZWxbMTZdOworfTsKKworc3RydWN0IGpmc19zdXBlcl9ibG9jayB7CisJdW5zaWduZWQgY2hhcglqc19tYWdpY1s0XTsKKwlfX3UzMgkJanNfdmVyc2lvbjsKKwlfX3U2NAkJanNfc2l6ZTsKKwlfX3UzMgkJanNfYnNpemU7CisJX191MzIJCWpzX2R1bW15MTsKKwlfX3UzMgkJanNfcGJzaXplOworCV9fdTMyCQlqc19kdW1teTJbMjddOworCXVuc2lnbmVkIGNoYXIJanNfdXVpZFsxNl07CisJdW5zaWduZWQgY2hhcglqc19sYWJlbFsxNl07CisJdW5zaWduZWQgY2hhcglqc19sb2d1dWlkWzE2XTsKK307CisKK3N0cnVjdCByb21mc19zdXBlcl9ibG9jayB7CisJdW5zaWduZWQgY2hhcglyb3NfbWFnaWNbOF07CisJX191MzIJCXJvc19kdW1teTFbMl07CisJdW5zaWduZWQgY2hhcglyb3Nfdm9sdW1lWzE2XTsKK307CisKK3N0cnVjdCBjcmFtZnNfc3VwZXJfYmxvY2sgeworCV9fdTgJCW1hZ2ljWzRdOworCV9fdTMyCQlzaXplOworCV9fdTMyCQlmbGFnczsKKwlfX3UzMgkJZnV0dXJlOworCV9fdTgJCXNpZ25hdHVyZVsxNl07CisJc3RydWN0IGNyYW1mc19pbmZvIHsKKwkJX191MzIJCWNyYzsKKwkJX191MzIJCWVkaXRpb247CisJCV9fdTMyCQlibG9ja3M7CisJCV9fdTMyCQlmaWxlczsKKwl9IGluZm87CisJX191OAkJbmFtZVsxNl07Cit9OworCitzdHJ1Y3Qgc3dhcF9pZF9ibG9jayB7CisvKgl1bnNpZ25lZCBjaGFyCXN3c19ib290WzEwMjRdOyAqLworCV9fdTMyCQlzd3NfdmVyc2lvbjsKKwlfX3UzMgkJc3dzX2xhc3RwYWdlOworCV9fdTMyCQlzd3NfbnJiYWQ7CisJdW5zaWduZWQgY2hhcglzd3NfdXVpZFsxNl07CisJY2hhcgkJc3dzX3ZvbHVtZVsxNl07CisJdW5zaWduZWQgY2hhcglzd3NfcGFkWzExN107CisJX191MzIJCXN3c19iYWRwZzsKK307CisKKy8qIFl1Y2t5IG1pc2FsaWduZWQgdmFsdWVzICovCitzdHJ1Y3QgdmZhdF9zdXBlcl9ibG9jayB7CisvKiAwMCovCXVuc2lnbmVkIGNoYXIJdnNfaWdub3JlZFszXTsKKy8qIDAzKi8JdW5zaWduZWQgY2hhcgl2c19zeXNpZFs4XTsKKy8qIDBiKi8JdW5zaWduZWQgY2hhcgl2c19zZWN0b3Jfc2l6ZVsyXTsKKy8qIDBkKi8JX191OAkJdnNfY2x1c3Rlcl9zaXplOworLyogMGUqLwlfX3UxNgkJdnNfcmVzZXJ2ZWQ7CisvKiAxMCovCV9fdTgJCXZzX2ZhdHM7CisvKiAxMSovCXVuc2lnbmVkIGNoYXIJdnNfZGlyX2VudHJpZXNbMl07CisvKiAxMyovCXVuc2lnbmVkIGNoYXIJdnNfc2VjdG9yc1syXTsKKy8qIDE1Ki8JdW5zaWduZWQgY2hhcgl2c19tZWRpYTsKKy8qIDE2Ki8JX191MTYJCXZzX2ZhdF9sZW5ndGg7CisvKiAxOCovCV9fdTE2CQl2c19zZWNzX3RyYWNrOworLyogMWEqLwlfX3UxNgkJdnNfaGVhZHM7CisvKiAxYyovCV9fdTMyCQl2c19oaWRkZW47CisvKiAyMCovCV9fdTMyCQl2c190b3RhbF9zZWN0OworLyogMjQqLwlfX3UzMgkJdnNfZmF0MzJfbGVuZ3RoOworLyogMjgqLwlfX3UxNgkJdnNfZmxhZ3M7CisvKiAyYSovCV9fdTgJCXZzX3ZlcnNpb25bMl07CisvKiAyYyovCV9fdTMyCQl2c19yb290X2NsdXN0ZXI7CisvKiAzMCovCV9fdTE2CQl2c19pbnNmb19zZWN0b3I7CisvKiAzMiovCV9fdTE2CQl2c19iYWNrdXBfYm9vdDsKKy8qIDM0Ki8JX191MTYJCXZzX3Jlc2VydmVkMls2XTsKKy8qIDQwKi8JdW5zaWduZWQgY2hhcgl2c191bmtub3duWzNdOworLyogNDMqLwl1bnNpZ25lZCBjaGFyCXZzX3Nlcm5vWzRdOworLyogNDcqLwljaGFyCQl2c19sYWJlbFsxMV07CisvKiA1MiovCXVuc2lnbmVkIGNoYXIgICB2c19tYWdpY1s4XTsKKy8qIDVhKi8JdW5zaWduZWQgY2hhcgl2c19kdW1teTJbMTY0XTsKKy8qMWZlKi8JdW5zaWduZWQgY2hhcgl2c19wbWFnaWNbMl07Cit9OworCisvKiBZdWNreSBtaXNhbGlnbmVkIHZhbHVlcyAqLworc3RydWN0IG1zZG9zX3N1cGVyX2Jsb2NrIHsKKy8qIDAwKi8JdW5zaWduZWQgY2hhcgltc19pZ25vcmVkWzNdOworLyogMDMqLwl1bnNpZ25lZCBjaGFyCW1zX3N5c2lkWzhdOworLyogMGIqLwl1bnNpZ25lZCBjaGFyCW1zX3NlY3Rvcl9zaXplWzJdOworLyogMGQqLwlfX3U4CQltc19jbHVzdGVyX3NpemU7CisvKiAwZSovCV9fdTE2CQltc19yZXNlcnZlZDsKKy8qIDEwKi8JX191OAkJbXNfZmF0czsKKy8qIDExKi8JdW5zaWduZWQgY2hhcgltc19kaXJfZW50cmllc1syXTsKKy8qIDEzKi8JdW5zaWduZWQgY2hhcgltc19zZWN0b3JzWzJdOworLyogMTUqLwl1bnNpZ25lZCBjaGFyCW1zX21lZGlhOworLyogMTYqLwlfX3UxNgkJbXNfZmF0X2xlbmd0aDsKKy8qIDE4Ki8JX191MTYJCW1zX3NlY3NfdHJhY2s7CisvKiAxYSovCV9fdTE2CQltc19oZWFkczsKKy8qIDFjKi8JX191MzIJCW1zX2hpZGRlbjsKKy8qIDIwKi8JX191MzIJCW1zX3RvdGFsX3NlY3Q7CisvKiAyNCovCXVuc2lnbmVkIGNoYXIJbXNfdW5rbm93blszXTsKKy8qIDI3Ki8JdW5zaWduZWQgY2hhcgltc19zZXJub1s0XTsKKy8qIDJiKi8JY2hhcgkJbXNfbGFiZWxbMTFdOworLyogMzYqLwl1bnNpZ25lZCBjaGFyICAgbXNfbWFnaWNbOF07CisvKiAzZCovCXVuc2lnbmVkIGNoYXIJbXNfZHVtbXkyWzE5Ml07CisvKjFmZSovCXVuc2lnbmVkIGNoYXIJbXNfcG1hZ2ljWzJdOworfTsKKworc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrIHsKKwlfX3UxNgkJbXNfbmlub2RlczsKKwlfX3UxNgkJbXNfbnpvbmVzOworCV9fdTE2CQltc19pbWFwX2Jsb2NrczsKKwlfX3UxNgkJbXNfem1hcF9ibG9ja3M7CisJX191MTYJCW1zX2ZpcnN0ZGF0YXpvbmU7CisJX191MTYJCW1zX2xvZ196b25lX3NpemU7CisJX191MzIJCW1zX21heF9zaXplOworCXVuc2lnbmVkIGNoYXIJbXNfbWFnaWNbMl07CisJX191MTYJCW1zX3N0YXRlOworCV9fdTMyCQltc196b25lczsKK307CisKK3N0cnVjdCBtZHBfc3VwZXJibG9ja19zIHsKKwlfX3UzMiBtZF9tYWdpYzsKKwlfX3UzMiBtYWpvcl92ZXJzaW9uOworCV9fdTMyIG1pbm9yX3ZlcnNpb247CisJX191MzIgcGF0Y2hfdmVyc2lvbjsKKwlfX3UzMiBndmFsaWRfd29yZHM7CisJX191MzIgc2V0X3V1aWQwOworCV9fdTMyIGN0aW1lOworCV9fdTMyIGxldmVsOworCV9fdTMyIHNpemU7CisJX191MzIgbnJfZGlza3M7CisJX191MzIgcmFpZF9kaXNrczsKKwlfX3UzMiBtZF9taW5vcjsKKwlfX3UzMiBub3RfcGVyc2lzdGVudDsKKwlfX3UzMiBzZXRfdXVpZDE7CisJX191MzIgc2V0X3V1aWQyOworCV9fdTMyIHNldF91dWlkMzsKK307CisKK3N0cnVjdCBoZnNfc3VwZXJfYmxvY2sgeworCWNoYXIJaF9tYWdpY1syXTsKKwljaGFyCWhfZHVtbXlbMThdOworCV9fdTMyCWhfYmxrc2l6ZTsKK307CisKK3N0cnVjdCBvY2ZzX3ZvbHVtZV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIJbWlub3JfdmVyc2lvbls0XTsKKwl1bnNpZ25lZCBjaGFyCW1ham9yX3ZlcnNpb25bNF07CisJdW5zaWduZWQgY2hhcglzaWduYXR1cmVbMTI4XTsKKwljaGFyCQltb3VudFsxMjhdOworCXVuc2lnbmVkIGNoYXIgICBtb3VudF9sZW5bMl07Cit9OworCitzdHJ1Y3Qgb2Nmc192b2x1bWVfbGFiZWwgeworCXVuc2lnbmVkIGNoYXIJZGlza19sb2NrWzQ4XTsKKwljaGFyCQlsYWJlbFs2NF07CisJdW5zaWduZWQgY2hhcglsYWJlbF9sZW5bMl07CisJdW5zaWduZWQgY2hhciAgdm9sX2lkWzE2XTsKKwl1bnNpZ25lZCBjaGFyICB2b2xfaWRfbGVuWzJdOworfTsKKworI2RlZmluZSBvY2ZzbWFqb3IobykgKChfX3UzMilvLm1ham9yX3ZlcnNpb25bMF0gXAorICAgICAgICAgICAgICAgICAgICsgKCgoX191MzIpIG8ubWFqb3JfdmVyc2lvblsxXSkgPDwgOCkgXAorICAgICAgICAgICAgICAgICAgICsgKCgoX191MzIpIG8ubWFqb3JfdmVyc2lvblsyXSkgPDwgMTYpIFwKKyAgICAgICAgICAgICAgICAgICArICgoKF9fdTMyKSBvLm1ham9yX3ZlcnNpb25bM10pIDw8IDI0KSkKKyNkZWZpbmUgb2Nmc2xhYmVsbGVuKG8pCSgoX191MzIpby5sYWJlbF9sZW5bMF0gKyAoKChfX3UzMikgby5sYWJlbF9sZW5bMV0pIDw8IDgpKQorI2RlZmluZSBvY2ZzbW91bnRsZW4obykJKChfX3UzMilvLm1vdW50X2xlblswXSArICgoKF9fdTMyKSBvLm1vdW50X2xlblsxXSk8PDgpKQorCisjZGVmaW5lIE9DRlNfTUFHSUMgIk9yYWNsZUNGUyIKKworc3RydWN0IG9jZnMyX3N1cGVyX2Jsb2NrIHsKKwl1bnNpZ25lZCBjaGFyICBzaWduYXR1cmVbOF07CisJdW5zaWduZWQgY2hhciAgc19kdW1teTFbMTg0XTsKKwl1bnNpZ25lZCBjaGFyICBzX2R1bW15Mls4MF07CisJY2hhcgkgICAgICAgc19sYWJlbFs2NF07CisJdW5zaWduZWQgY2hhciAgc191dWlkWzE2XTsKK307CisKKyNkZWZpbmUgT0NGUzJfTUlOX0JMT0NLU0laRSAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgT0NGUzJfTUFYX0JMT0NLU0laRSAgICAgICAgICAgICA0MDk2CisKKyNkZWZpbmUgT0NGUzJfU1VQRVJfQkxPQ0tfQkxLTk8gICAgICAgICAyCisKKyNkZWZpbmUgT0NGUzJfU1VQRVJfQkxPQ0tfU0lHTkFUVVJFICAgICAiT0NGU1YyIgorCitzdHJ1Y3Qgb3JhY2xlX2FzbV9kaXNrX2xhYmVsIHsKKwljaGFyIGR1bW15WzMyXTsKKwljaGFyIGRsX3RhZ1s4XTsKKwljaGFyIGRsX2lkWzI0XTsKK307CisKKyNkZWZpbmUgT1JBQ0xFX0FTTV9ESVNLX0xBQkVMX01BUktFRCAgICAiT1JDTERJU0siCisjZGVmaW5lIE9SQUNMRV9BU01fRElTS19MQUJFTF9PRkZTRVQgICAgMzIKKworI2RlZmluZSBJU09EQ0woZnJvbSwgdG8pICh0byAtIGZyb20gKyAxKQorc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciB7CisJY2hhciB0eXBlW0lTT0RDTCgxLDEpXTsgLyogNzExICovCisJY2hhciBpZFtJU09EQ0woMiw2KV07CisJY2hhciB2ZXJzaW9uW0lTT0RDTCg3LDcpXTsKKwljaGFyIGRhdGFbSVNPRENMKDgsMjA0OCldOworfTsKKworLyoKKyAqIEJ5dGUgc3dhcCBmdW5jdGlvbnMKKyAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIF9JTkxJTkVfIHN0YXRpYyBfX2lubGluZV9fCisjZWxzZQkJCQkvKiBGb3IgV2F0Y29tIEMgKi8KKyNkZWZpbmUgX0lOTElORV8gc3RhdGljIGlubGluZQorI2VuZGlmCisKK3N0YXRpYyBfX3UxNiBibGtpZF9zd2FiMTYoX191MTYgdmFsKTsKK3N0YXRpYyBfX3UzMiBibGtpZF9zd2FiMzIoX191MzIgdmFsKTsKK3N0YXRpYyBfX3U2NCBibGtpZF9zd2FiNjQoX191NjQgdmFsKTsKKworI2lmICgoZGVmaW5lZCBfX0dOVUNfXykgJiYgXAorICAgICAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykpKQorCisjZGVmaW5lIF9CTEtJRF9IQVZFX0FTTV9CSVRPUFNfCisKK19JTkxJTkVfIF9fdTMyIGJsa2lkX3N3YWIzMihfX3UzMiB2YWwpCit7CisjaWZkZWYgRVhUMkZTX1JFUVVJUkVfNDg2CisJX19hc21fXygiYnN3YXAgJTAiIDogIj1yIiAodmFsKSA6ICIwIiAodmFsKSk7CisjZWxzZQorCV9fYXNtX18oInhjaGdiICViMCwlaDBcblx0IgkvKiBzd2FwIGxvd2VyIGJ5dGVzICAqLworCQkicm9ybCAkMTYsJTBcblx0IgkvKiBzd2FwIHdvcmRzICAgICAgICAqLworCQkieGNoZ2IgJWIwLCVoMCIJCS8qIHN3YXAgaGlnaGVyIGJ5dGVzICovCisJCToiPXEiICh2YWwpCisJCTogIjAiICh2YWwpKTsKKyNlbmRpZgorCXJldHVybiB2YWw7Cit9CisKK19JTkxJTkVfIF9fdTE2IGJsa2lkX3N3YWIxNihfX3UxNiB2YWwpCit7CisJX19hc21fXygieGNoZ2IgJWIwLCVoMCIJCS8qIHN3YXAgYnl0ZXMgKi8KKwkJOiAiPXEiICh2YWwpCisJCTogICIwIiAodmFsKSk7CisJCXJldHVybiB2YWw7Cit9CisKK19JTkxJTkVfIF9fdTY0IGJsa2lkX3N3YWI2NChfX3U2NCB2YWwpCit7CisJcmV0dXJuIGJsa2lkX3N3YWIzMih2YWwgPj4gMzIpIHwKKwkgICAgICAgKCAoKF9fdTY0KWJsa2lkX3N3YWIzMigoX191MzIpdmFsKSkgPDwgMzIgKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX0JMS0lEX0hBVkVfQVNNX0JJVE9QU18pCisKK19JTkxJTkVfICBfX3UxNiBibGtpZF9zd2FiMTYoX191MTYgdmFsKQoreworCXJldHVybiAodmFsID4+IDgpIHwgKHZhbCA8PCA4KTsKK30KKworX0lOTElORV8gX191MzIgYmxraWRfc3dhYjMyKF9fdTMyIHZhbCkKK3sKKwlyZXR1cm4gKHZhbD4+MjQpIHwgKCh2YWw+PjgpICYgMHhGRjAwKSB8CisJCSgodmFsPDw4KSAmIDB4RkYwMDAwKSB8ICh2YWw8PDI0KTsKK30KKworX0lOTElORV8gX191NjQgYmxraWRfc3dhYjY0KF9fdTY0IHZhbCkKK3sKKwlyZXR1cm4gYmxraWRfc3dhYjMyKHZhbCA+PiAzMikgfAorCSAgICAgICAoICgoX191NjQpYmxraWRfc3dhYjMyKChfX3UzMil2YWwpKSA8PCAzMiApOworfQorI2VuZGlmCisKKworCisjaWYgIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgYmxraWRfbGUxNih4KSBibGtpZF9zd2FiMTYoeCkKKyNkZWZpbmUgYmxraWRfbGUzMih4KSBibGtpZF9zd2FiMzIoeCkKKyNkZWZpbmUgYmxraWRfbGU2NCh4KSBibGtpZF9zd2FiNjQoeCkKKyNkZWZpbmUgYmxraWRfYmUxNih4KSAoeCkKKyNkZWZpbmUgYmxraWRfYmUzMih4KSAoeCkKKyNkZWZpbmUgYmxraWRfYmU2NCh4KSAoeCkKKyNlbHNlCisjZGVmaW5lIGJsa2lkX2xlMTYoeCkgKHgpCisjZGVmaW5lIGJsa2lkX2xlMzIoeCkgKHgpCisjZGVmaW5lIGJsa2lkX2xlNjQoeCkgKHgpCisjZGVmaW5lIGJsa2lkX2JlMTYoeCkgYmxraWRfc3dhYjE2KHgpCisjZGVmaW5lIGJsa2lkX2JlMzIoeCkgYmxraWRfc3dhYjMyKHgpCisjZGVmaW5lIGJsa2lkX2JlNjQoeCkgYmxraWRfc3dhYjY0KHgpCisjZW5kaWYKKworI3VuZGVmIF9JTkxJTkVfCisKKyNlbmRpZiAvKiBfQkxLSURfUFJPQkVfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvcmVhZC5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OTVhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9yZWFkLmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJlYWQuYyAtIHJlYWQgdGhlIGJsa2lkIGNhY2hlIGZyb20gZGlzaywgdG8gYXZvaWQgc2Nhbm5pbmcgYWxsIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMgVGhlb2RvcmUgWS4gVHMnbworICogQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYXMgRGlsZ2VyCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImJsa2lkUC5oIgorI2luY2x1ZGUgIi4uL3V1aWQvdXVpZC5oIgorCisjaWZkZWYgSEFWRV9TVFJUT1VMTAorI2RlZmluZSBfX1VTRV9JU09DOVgKKyNkZWZpbmUgU1RSVE9VTEwgc3RydG91bGwgLyogZGVmaW5lZCBpbiBzdGRsaWIuaCBpZiB5b3UgdHJ5IGhhcmQgZW5vdWdoICovCisjZWxzZQorLyogRklYTUU6IG5lZWQgdG8gc3VwcG9ydCByZWFsIHN0cnRvdWxsIGhlcmUgKi8KKyNkZWZpbmUgU1RSVE9VTEwgc3RydG91bAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIFRFU1RfUFJPR1JBTQorI2RlZmluZSBibGtpZF9kZWJ1Z19kdW1wX2RldihkZXYpICAoZGVidWdfZHVtcF9kZXYoZGV2KSkKK3N0YXRpYyB2b2lkIGRlYnVnX2R1bXBfZGV2KGJsa2lkX2RldiBkZXYpOworI2VuZGlmCisKKy8qCisgKiBGaWxlIGZvcm1hdDoKKyAqCisgKgk8ZGV2aWNlIFs8TkFNRT0idmFsdWUiPiAuLi5dPmRldmljZV9uYW1lPC9kZXZpY2U+CisgKgorICoJVGhlIGZvbGxvd2luZyB0YWdzIGFyZSByZXF1aXJlZCBmb3IgZWFjaCBlbnRyeToKKyAqCTxJRD0iaWQiPgl1bmlxdWUgKHdpdGhpbiB0aGlzIGZpbGUpIElEIG51bWJlciBvZiB0aGlzIGRldmljZQorICoJPFRJTUU9InRpbWUiPgkoYXNjaWkgdGltZV90KSB0aW1lIHRoaXMgZW50cnkgd2FzIGxhc3QgcmVhZCBmcm9tIGRpc2sKKyAqCTxUWVBFPSJ0eXBlIj4JKGRldGVjdGVkKSB0eXBlIG9mIGZpbGVzeXN0ZW0vZGF0YSBmb3IgdGhpcyBwYXJ0aXRpb24KKyAqCisgKglUaGUgZm9sbG93aW5nIHRhZ3MgbWF5IGJlIHByZXNlbnQsIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlIGNvbnRlbnRzCisgKgk8TEFCRUw9ImxhYmVsIj4JKHVzZXIgc3VwcGxpZWQpIGxhYmVsICh2b2x1bWUgbmFtZSwgZXRjKQorICoJPFVVSUQ9InV1aWQiPgkoZ2VuZXJhdGVkKSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciAoc2VyaWFsIG5vKQorICovCisKK3N0YXRpYyBjaGFyICpza2lwX292ZXJfYmxhbmsoY2hhciAqY3ApCit7CisJd2hpbGUgKCpjcCAmJiBpc3NwYWNlKCpjcCkpCisJCWNwKys7CisJcmV0dXJuIGNwOworfQorCitzdGF0aWMgY2hhciAqc2tpcF9vdmVyX3dvcmQoY2hhciAqY3ApCit7CisJY2hhciBjaDsKKworCXdoaWxlICgoY2ggPSAqY3ApKSB7CisJCS8qIElmIHdlIHNlZSBhIGJhY2tzbGFzaCwgc2tpcCB0aGUgbmV4dCBjaGFyYWN0ZXIgKi8KKwkJaWYgKGNoID09ICdcXCcpIHsKKwkJCWNwKys7CisJCQlpZiAoKmNwID09ICdcMCcpCisJCQkJYnJlYWs7CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGlzc3BhY2UoY2gpIHx8IGNoID09ICc8JyB8fCBjaCA9PSAnPicpCisJCQlicmVhazsKKwkJY3ArKzsKKwl9CisJcmV0dXJuIGNwOworfQorCitzdGF0aWMgY2hhciAqc3RyaXBfbGluZShjaGFyICpsaW5lKQoreworCWNoYXIJKnA7CisKKwlsaW5lID0gc2tpcF9vdmVyX2JsYW5rKGxpbmUpOworCisJcCA9IGxpbmUgKyBzdHJsZW4obGluZSkgLSAxOworCisJd2hpbGUgKCpsaW5lKSB7CisJCWlmIChpc3NwYWNlKCpwKSkKKwkJCSpwLS0gPSAnXDAnOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbGluZTsKK30KKworLyoKKyAqIFN0YXJ0IHBhcnNpbmcgYSBuZXcgbGluZSBmcm9tIHRoZSBjYWNoZS4KKyAqCisgKiBsaW5lIHN0YXJ0cyB3aXRoICI8ZGV2aWNlIiByZXR1cm4gMSAtPiBjb250aW51ZSBwYXJzaW5nIGxpbmUKKyAqIGxpbmUgc3RhcnRzIHdpdGggIjxmb28iLCBlbXB0eSwgb3IgIyByZXR1cm4gMCAtPiBza2lwIGxpbmUKKyAqIGxpbmUgc3RhcnRzIHdpdGggb3RoZXIsIHJldHVybiAtQkxLSURfRVJSX0NBQ0hFIC0+IGVycm9yCisgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfc3RhcnQoY2hhciAqKmNwKQoreworCWNoYXIgKnA7CisKKwlwID0gc3RyaXBfbGluZSgqY3ApOworCisJLyogU2tpcCBjb21tZW50IG9yIGJsYW5rIGxpbmVzLiAgV2UgY2FuJ3QganVzdCBOVUwgdGhlIGZpcnN0ICcjJyBjaGFyLAorCSAqIGluIGNhc2UgaXQgaXMgaW5zaWRlIHF1b3Rlcywgb3IgZXNjYXBlZC4KKwkgKi8KKwlpZiAoKnAgPT0gJ1wwJyB8fCAqcCA9PSAnIycpCisJCXJldHVybiAwOworCisJaWYgKCFzdHJuY21wKHAsICI8ZGV2aWNlIiwgNykpIHsKKwkJREJHKERFQlVHX1JFQUQsIHByaW50ZigiZm91bmQgZGV2aWNlIGhlYWRlcjogJThzXG4iLCBwKSk7CisJCXAgKz0gNzsKKworCQkqY3AgPSBwOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKnAgPT0gJzwnKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtQkxLSURfRVJSX0NBQ0hFOworfQorCisvKiBDb25zdW1lIHRoZSByZW1haW5pbmcgWE1MIG9uIHRoZSBsaW5lIChjb3NtZXRpYyBvbmx5KSAqLworc3RhdGljIGludCBwYXJzZV9lbmQoY2hhciAqKmNwKQoreworCSpjcCA9IHNraXBfb3Zlcl9ibGFuaygqY3ApOworCisJaWYgKCFzdHJuY21wKCpjcCwgIjwvZGV2aWNlPiIsIDkpKSB7CisJCURCRyhERUJVR19SRUFELCBwcmludGYoImZvdW5kIGRldmljZSB0cmFpbGVyICU5c1xuIiwgKmNwKSk7CisJCSpjcCArPSA5OworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUJMS0lEX0VSUl9DQUNIRTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGRldmljZSBzdHJ1Y3Qgd2l0aCBkZXZpY2UgbmFtZSBmaWxsZWQgaW4uICBXaWxsIGhhbmRsZQorICogZmluZGluZyB0aGUgZGV2aWNlIG9uIGxpbmVzIG9mIHRoZSBmb3JtOgorICogPGRldmljZSBmb289YmFyPmRldm5hbWU8L2RldmljZT4KKyAqIDxkZXZpY2U+ZGV2bmFtZTxmb28+YmFyPC9mb28+PC9kZXZpY2U+CisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfZGV2KGJsa2lkX2NhY2hlIGNhY2hlLCBibGtpZF9kZXYgKmRldiwgY2hhciAqKmNwKQoreworCWNoYXIgKnN0YXJ0LCAqdG1wLCAqZW5kLCAqbmFtZTsKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBwYXJzZV9zdGFydChjcCkpIDw9IDApCisJCXJldHVybiByZXQ7CisKKwlzdGFydCA9IHRtcCA9IHN0cmNocigqY3AsICc+Jyk7CisJaWYgKCFzdGFydCkgeworCQlEQkcoREVCVUdfUkVBRCwKKwkJICAgIHByaW50ZigiYmxraWQ6IHNob3J0IGxpbmUgcGFyc2luZyBkZXY6ICVzXG4iLCAqY3ApKTsKKwkJcmV0dXJuIC1CTEtJRF9FUlJfQ0FDSEU7CisJfQorCXN0YXJ0ID0gc2tpcF9vdmVyX2JsYW5rKHN0YXJ0ICsgMSk7CisJZW5kID0gc2tpcF9vdmVyX3dvcmQoc3RhcnQpOworCisJREJHKERFQlVHX1JFQUQsIHByaW50ZigiZGV2aWNlIHNob3VsZCBiZSAlKnNcbiIsIGVuZCAtIHN0YXJ0LCBzdGFydCkpOworCisJaWYgKCoqY3AgPT0gJz4nKQorCQkqY3AgPSBlbmQ7CisJZWxzZQorCQkoKmNwKSsrOworCisJKnRtcCA9ICdcMCc7CisKKwlpZiAoISh0bXAgPSBzdHJyY2hyKGVuZCwgJzwnKSkgfHwgcGFyc2VfZW5kKCZ0bXApIDwgMCkgeworCQlEQkcoREVCVUdfUkVBRCwKKwkJICAgIHByaW50ZigiYmxraWQ6IG1pc3NpbmcgPC9kZXZpY2U+IGVuZGluZzogJXNcbiIsIGVuZCkpOworCX0gZWxzZSBpZiAodG1wKQorCQkqdG1wID0gJ1wwJzsKKworCWlmIChlbmQgLSBzdGFydCA8PSAxKSB7CisJCURCRyhERUJVR19SRUFELCBwcmludGYoImJsa2lkOiBlbXB0eSBkZXZpY2UgbmFtZTogJXNcbiIsICpjcCkpOworCQlyZXR1cm4gLUJMS0lEX0VSUl9DQUNIRTsKKwl9CisKKwluYW1lID0gYmxraWRfc3RybmR1cChzdGFydCwgZW5kLXN0YXJ0KTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9NRU07CisKKwlEQkcoREVCVUdfUkVBRCwgcHJpbnRmKCJmb3VuZCBkZXYgJXNcbiIsIG5hbWUpKTsKKworCWlmICghKCpkZXYgPSBibGtpZF9nZXRfZGV2KGNhY2hlLCBuYW1lLCBCTEtJRF9ERVZfQ1JFQVRFKSkpCisJCXJldHVybiAtQkxLSURfRVJSX01FTTsKKworCWZyZWUobmFtZSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBFeHRyYWN0IGEgdGFnIG9mIHRoZSBmb3JtIE5BTUU9InZhbHVlIiBmcm9tIHRoZSBsaW5lLgorICovCitzdGF0aWMgaW50IHBhcnNlX3Rva2VuKGNoYXIgKipuYW1lLCBjaGFyICoqdmFsdWUsIGNoYXIgKipjcCkKK3sKKwljaGFyICplbmQ7CisKKwlpZiAoIW5hbWUgfHwgIXZhbHVlIHx8ICFjcCkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlpZiAoISgqdmFsdWUgPSBzdHJjaHIoKmNwLCAnPScpKSkKKwkJcmV0dXJuIDA7CisKKwkqKnZhbHVlID0gJ1wwJzsKKwkqbmFtZSA9IHN0cmlwX2xpbmUoKmNwKTsKKwkqdmFsdWUgPSBza2lwX292ZXJfYmxhbmsoKnZhbHVlICsgMSk7CisKKwlpZiAoKip2YWx1ZSA9PSAnIicpIHsKKwkJZW5kID0gc3RyY2hyKCp2YWx1ZSArIDEsICciJyk7CisJCWlmICghZW5kKSB7CisJCQlEQkcoREVCVUdfUkVBRCwKKwkJCSAgICBwcmludGYoInVuYmFsYW5jZWQgcXVvdGVzIGF0OiAlc1xuIiwgKnZhbHVlKSk7CisJCQkqY3AgPSAqdmFsdWU7CisJCQlyZXR1cm4gLUJMS0lEX0VSUl9DQUNIRTsKKwkJfQorCQkoKnZhbHVlKSsrOworCQkqZW5kID0gJ1wwJzsKKwkJZW5kKys7CisJfSBlbHNlIHsKKwkJZW5kID0gc2tpcF9vdmVyX3dvcmQoKnZhbHVlKTsKKwkJaWYgKCplbmQpIHsKKwkJCSplbmQgPSAnXDAnOworCQkJZW5kKys7CisJCX0KKwl9CisJKmNwID0gZW5kOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBFeHRyYWN0IGEgdGFnIG9mIHRoZSBmb3JtIDxOQU1FPnZhbHVlPC9OQU1FPiBmcm9tIHRoZSBsaW5lLgorICovCisvKgorc3RhdGljIGludCBwYXJzZV94bWwoY2hhciAqKm5hbWUsIGNoYXIgKip2YWx1ZSwgY2hhciAqKmNwKQoreworCWNoYXIgKmVuZDsKKworCWlmICghbmFtZSB8fCAhdmFsdWUgfHwgIWNwKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCSpuYW1lID0gc3RyaXBfbGluZSgqY3ApOworCisJaWYgKCgqbmFtZSlbMF0gIT0gJzwnIHx8ICgqbmFtZSlbMV0gPT0gJy8nKQorCQlyZXR1cm4gMDsKKworCUZJWE1FOiBmaW5pc2ggdGhpcy4KK30KKyovCisKKy8qCisgKiBFeHRyYWN0IGEgdGFnIGZyb20gdGhlIGxpbmUuCisgKgorICogUmV0dXJuIDEgaWYgYSB2YWxpZCB0YWcgd2FzIGZvdW5kLgorICogUmV0dXJuIDAgaWYgbm8gdGFnIGZvdW5kLgorICogUmV0dXJuIC12ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHBhcnNlX3RhZyhibGtpZF9jYWNoZSBjYWNoZSwgYmxraWRfZGV2IGRldiwgY2hhciAqKmNwKQoreworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsdWU7CisJaW50IHJldDsKKworCWlmICghY2FjaGUgfHwgIWRldikKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlpZiAoKHJldCA9IHBhcnNlX3Rva2VuKCZuYW1lLCAmdmFsdWUsIGNwKSkgPD0gMCAvKiAmJgorCSAgICAocmV0ID0gcGFyc2VfeG1sKCZuYW1lLCAmdmFsdWUsIGNwKSkgPD0gMCAqLykKKwkJcmV0dXJuIHJldDsKKworCS8qIFNvbWUgdGFncyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBkZXZpY2Ugc3RydWN0ICovCisJaWYgKCFzdHJjbXAobmFtZSwgIkRFVk5PIikpCisJCWRldi0+YmlkX2Rldm5vID0gU1RSVE9VTEwodmFsdWUsIDAsIDApOworCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlBSSSIpKQorCQlkZXYtPmJpZF9wcmkgPSBzdHJ0b2wodmFsdWUsIDAsIDApOworCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlRJTUUiKSkKKwkJLyogRklYTUU6IG5lZWQgdG8gcGFyc2UgYSBsb25nIGxvbmcgZXZlbnR1YWxseSAqLworCQlkZXYtPmJpZF90aW1lID0gc3RydG9sKHZhbHVlLCAwLCAwKTsKKwllbHNlCisJCXJldCA9IGJsa2lkX3NldF90YWcoZGV2LCBuYW1lLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisKKwlEQkcoREVCVUdfUkVBRCwgcHJpbnRmKCIgICAgdGFnOiAlcz1cIiVzXCJcbiIsIG5hbWUsIHZhbHVlKSk7CisKKwlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDE7Cit9CisKKy8qCisgKiBQYXJzZSBhIHNpbmdsZSBsaW5lIG9mIGRhdGEsIGFuZCByZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgZGV2IHN0cnVjdC4KKyAqIEFkZCB0aGUgbmV3IGRldmljZSB0byB0aGUgY2FjaGUgc3RydWN0LCBpZiBvbmUgd2FzIHJlYWQuCisgKgorICogTGluZXMgYXJlIG9mIHRoZSBmb3JtIDxkZXZpY2UgW1RBRz0idmFsdWUiIC4uLl0+L2Rldi9mb288L2RldmljZT4KKyAqCisgKiBSZXR1cm5zIC12ZSB2YWx1ZSBvbiBlcnJvci4KKyAqIFJldHVybnMgMCBvdGhlcndpc2UuCisgKiBJZiBhIHZhbGlkIGRldmljZSB3YXMgcmVhZCwgKmRldl9wIGlzIG5vbi1OVUxMLCBvdGhlcndpc2UgaXQgaXMgTlVMTAorICogKGUuZy4gY29tbWVudCBsaW5lcywgdW5rbm93biBYTUwgY29udGVudCwgZXRjKS4KKyAqLworc3RhdGljIGludCBibGtpZF9wYXJzZV9saW5lKGJsa2lkX2NhY2hlIGNhY2hlLCBibGtpZF9kZXYgKmRldl9wLCBjaGFyICpjcCkKK3sKKwlibGtpZF9kZXYgZGV2OworCWludCByZXQ7CisKKwlpZiAoIWNhY2hlIHx8ICFkZXZfcCkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwkqZGV2X3AgPSBOVUxMOworCisJREJHKERFQlVHX1JFQUQsIHByaW50ZigibGluZTogJXNcbiIsIGNwKSk7CisKKwlpZiAoKHJldCA9IHBhcnNlX2RldihjYWNoZSwgZGV2X3AsICZjcCkpIDw9IDApCisJCXJldHVybiByZXQ7CisKKwlkZXYgPSAqZGV2X3A7CisKKwl3aGlsZSAoKHJldCA9IHBhcnNlX3RhZyhjYWNoZSwgZGV2LCAmY3ApKSA+IDApIHsKKwkJOworCX0KKworCWlmIChkZXYtPmJpZF90eXBlID09IE5VTEwpIHsKKwkJREJHKERFQlVHX1JFQUQsCisJCSAgICBwcmludGYoImJsa2lkOiBkZXZpY2UgJXMgaGFzIG5vIFRZUEVcbiIsZGV2LT5iaWRfbmFtZSkpOworCQlibGtpZF9mcmVlX2RldihkZXYpOworCX0KKworCURCRyhERUJVR19SRUFELCBibGtpZF9kZWJ1Z19kdW1wX2RldihkZXYpKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQYXJzZSB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLCBhbmQgcmV0dXJuIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBvcgorICogYSBuZXdseSBhbGxvY2F0ZWQgY2FjaGUgc3RydWN0LiAgSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgcmV0dXJuIGEKKyAqIG5ldyBlbXB0eSBjYWNoZSBzdHJ1Y3QuCisgKi8KK3ZvaWQgYmxraWRfcmVhZF9jYWNoZShibGtpZF9jYWNoZSBjYWNoZSkKK3sKKwlGSUxFICpmaWxlOworCWNoYXIgYnVmWzQwOTZdOworCWludCBmZCwgbGluZW5vID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICghY2FjaGUpCisJCXJldHVybjsKKworCS8qCisJICogSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgdGhlbiB3ZSBqdXN0IHJldHVybiBhbiBlbXB0eQorCSAqIHN0cnVjdCBzbyB0aGF0IHRoZSBjYWNoZSBjYW4gYmUgcG9wdWxhdGVkLgorCSAqLworCWlmICgoZmQgPSBvcGVuKGNhY2hlLT5iaWNfZmlsZW5hbWUsIE9fUkRPTkxZKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGZzdGF0KGZkLCAmc3QpIDwgMCkKKwkJZ290byBlcnJvdXQ7CisJaWYgKChzdC5zdF9tdGltZSA9PSBjYWNoZS0+YmljX2Z0aW1lKSB8fAorCSAgICAoY2FjaGUtPmJpY19mbGFncyAmIEJMS0lEX0JJQ19GTF9DSEFOR0VEKSkgeworCQlEQkcoREVCVUdfQ0FDSEUsIHByaW50Zigic2tpcHBpbmcgcmUtcmVhZCBvZiAlc1xuIiwKKwkJCQkJY2FjaGUtPmJpY19maWxlbmFtZSkpOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlEQkcoREVCVUdfQ0FDSEUsIHByaW50ZigicmVhZGluZyBjYWNoZSBmaWxlICVzXG4iLAorCQkJCWNhY2hlLT5iaWNfZmlsZW5hbWUpKTsKKworCWZpbGUgPSB4ZmRvcGVuX2Zvcl9yZWFkKGZkKTsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmaWxlKSkgeworCQlibGtpZF9kZXYgZGV2OworCQl1bnNpZ25lZCBpbnQgZW5kOworCisJCWxpbmVubysrOworCQlpZiAoYnVmWzBdID09IDApCisJCQljb250aW51ZTsKKwkJZW5kID0gc3RybGVuKGJ1ZikgLSAxOworCQkvKiBDb250aW51ZSByZWFkaW5nIG5leHQgbGluZSBpZiBpdCBlbmRzIHdpdGggYSBiYWNrc2xhc2ggKi8KKwkJd2hpbGUgKGJ1ZltlbmRdID09ICdcXCcgJiYgZW5kIDwgc2l6ZW9mKGJ1ZikgLSAyICYmCisJCSAgICAgICBmZ2V0cyhidWYgKyBlbmQsIHNpemVvZihidWYpIC0gZW5kLCBmaWxlKSkgeworCQkJZW5kID0gc3RybGVuKGJ1ZikgLSAxOworCQkJbGluZW5vKys7CisJCX0KKworCQlpZiAoYmxraWRfcGFyc2VfbGluZShjYWNoZSwgJmRldiwgYnVmKSA8IDApIHsKKwkJCURCRyhERUJVR19SRUFELAorCQkJICAgIHByaW50ZigiYmxraWQ6IGJhZCBmb3JtYXQgb24gbGluZSAlZFxuIiwgbGluZW5vKSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlmY2xvc2UoZmlsZSk7CisKKwkvKgorCSAqIEluaXRpYWxseSB3ZSBkbyBub3QgbmVlZCB0byB3cml0ZSBvdXQgdGhlIGNhY2hlIGZpbGUuCisJICovCisJY2FjaGUtPmJpY19mbGFncyAmPSB+QkxLSURfQklDX0ZMX0NIQU5HRUQ7CisJY2FjaGUtPmJpY19mdGltZSA9IHN0LnN0X210aW1lOworCisJcmV0dXJuOworZXJyb3V0OgorCWNsb3NlKGZkKTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQorc3RhdGljIHZvaWQgZGVidWdfZHVtcF9kZXYoYmxraWRfZGV2IGRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRmKCIgIGRldjogTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIiAgZGV2OiBuYW1lID0gJXNcbiIsIGRldi0+YmlkX25hbWUpOworCXByaW50ZigiICBkZXY6IERFVk5PPVwiMHglMGxseFwiXG4iLCBkZXYtPmJpZF9kZXZubyk7CisJcHJpbnRmKCIgIGRldjogVElNRT1cIiVsdVwiXG4iLCBkZXYtPmJpZF90aW1lKTsKKwlwcmludGYoIiAgZGV2OiBQUkk9XCIlZFwiXG4iLCBkZXYtPmJpZF9wcmkpOworCXByaW50ZigiICBkZXY6IGZsYWdzID0gMHglMDhYXG4iLCBkZXYtPmJpZF9mbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZkZXYtPmJpZF90YWdzKSB7CisJCWJsa2lkX3RhZyB0YWcgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLCBiaXRfdGFncyk7CisJCWlmICh0YWcpCisJCQlwcmludGYoIiAgICB0YWc6ICVzPVwiJXNcIlxuIiwgdGFnLT5iaXRfbmFtZSwKKwkJCSAgICAgICB0YWctPmJpdF92YWwpOworCQllbHNlCisJCQlwcmludGYoIiAgICB0YWc6IE5VTExcbiIpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqYXJndikKK3sKKwlibGtpZF9jYWNoZSBjYWNoZSA9IE5VTEw7CisJaW50IHJldDsKKworCWJsa2lkX2RlYnVnX21hc2sgPSBERUJVR19BTEw7CisJaWYgKGFyZ2MgPiAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtmaWxlbmFtZV1cbiIKKwkJCSJUZXN0IHBhcnNpbmcgb2YgdGhlIGNhY2hlIChmaWxlbmFtZSlcbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlpZiAoKHJldCA9IGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIGFyZ3ZbMV0pKSA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IgJWQgcmVhZGluZyBjYWNoZSBmaWxlICVzXG4iLCByZXQsCisJCQlhcmd2WzFdID8gYXJndlsxXSA6IEJMS0lEX0NBQ0hFX0ZJTEUpOworCisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3Jlc29sdmUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3Jlc29sdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVjYTYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvcmVzb2x2ZS5jCkBAIC0wLDAgKzEsMTM5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZXNvbHZlLmMgLSByZXNvbHZlIG5hbWVzIGFuZCB0YWdzIGludG8gc3BlY2lmaWMgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMyBUaGVvZG9yZSBUcydvLgorICogQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYXMgRGlsZ2VyCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiYmxraWRQLmgiCisjaW5jbHVkZSAicHJvYmUuaCIKKworLyoKKyAqIEZpbmQgYSB0YWduYW1lIChlLmcuIExBQkVMIG9yIFVVSUQpIG9uIGEgc3BlY2lmaWMgZGV2aWNlLgorICovCitjaGFyICpibGtpZF9nZXRfdGFnX3ZhbHVlKGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICp0YWduYW1lLAorCQkJICBjb25zdCBjaGFyICpkZXZuYW1lKQoreworCWJsa2lkX3RhZyBmb3VuZDsKKwlibGtpZF9kZXYgZGV2OworCWJsa2lkX2NhY2hlIGMgPSBjYWNoZTsKKwljaGFyICpyZXQgPSBOVUxMOworCisJREJHKERFQlVHX1JFU09MVkUsIHByaW50ZigibG9va2luZyBmb3IgJXMgb24gJXNcbiIsIHRhZ25hbWUsIGRldm5hbWUpKTsKKworCWlmICghZGV2bmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWNhY2hlKSB7CisJCWlmIChibGtpZF9nZXRfY2FjaGUoJmMsIE5VTEwpIDwgMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmICgoZGV2ID0gYmxraWRfZ2V0X2RldihjLCBkZXZuYW1lLCBCTEtJRF9ERVZfTk9STUFMKSkgJiYKKwkgICAgKGZvdW5kID0gYmxraWRfZmluZF90YWdfZGV2KGRldiwgdGFnbmFtZSkpKQorCQlyZXQgPSBibGtpZF9zdHJkdXAoZm91bmQtPmJpdF92YWwpOworCisJaWYgKCFjYWNoZSkKKwkJYmxraWRfcHV0X2NhY2hlKGMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIExvY2F0ZSBhIGRldmljZSBuYW1lIGZyb20gYSB0b2tlbiAoTkFNRT12YWx1ZSBzdHJpbmcpLCBvciAobmFtZSwgdmFsdWUpCisgKiBwYWlyLiAgSW4gdGhlIGNhc2Ugb2YgYSB0b2tlbiwgdmFsdWUgaXMgaWdub3JlZC4gIElmIHRoZSAidG9rZW4iIGlzIG5vdAorICogb2YgdGhlIGZvcm0gIk5BTUU9dmFsdWUiIGFuZCB0aGVyZSBpcyBubyB2YWx1ZSBnaXZlbiwgdGhlbiBpdCBpcyBhc3N1bWVkCisgKiB0byBiZSB0aGUgYWN0dWFsIGRldm5hbWUgYW5kIGEgY29weSBpcyByZXR1cm5lZC4KKyAqLworY2hhciAqYmxraWRfZ2V0X2Rldm5hbWUoYmxraWRfY2FjaGUgY2FjaGUsIGNvbnN0IGNoYXIgKnRva2VuLAorCQkJY29uc3QgY2hhciAqdmFsdWUpCit7CisJYmxraWRfZGV2IGRldjsKKwlibGtpZF9jYWNoZSBjID0gY2FjaGU7CisJY2hhciAqdCA9IE5VTEwsICp2ID0gTlVMTDsKKwljaGFyICpyZXQgPSBOVUxMOworCisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWNhY2hlKSB7CisJCWlmIChibGtpZF9nZXRfY2FjaGUoJmMsIE5VTEwpIDwgMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCURCRyhERUJVR19SRVNPTFZFLAorCSAgICBwcmludGYoImxvb2tpbmcgZm9yICVzJXMlcyAlc1xuIiwgdG9rZW4sIHZhbHVlID8gIj0iIDogIiIsCisJCSAgIHZhbHVlID8gdmFsdWUgOiAiIiwgY2FjaGUgPyAiaW4gY2FjaGUiIDogImZyb20gZGlzayIpKTsKKworCWlmICghdmFsdWUpIHsKKwkJaWYgKCFzdHJjaHIodG9rZW4sICc9JykpCisJCQlyZXR1cm4gYmxraWRfc3RyZHVwKHRva2VuKTsKKwkJYmxraWRfcGFyc2VfdGFnX3N0cmluZyh0b2tlbiwgJnQsICZ2KTsKKwkJaWYgKCF0IHx8ICF2KQorCQkJZ290byBlcnJvdXQ7CisJCXRva2VuID0gdDsKKwkJdmFsdWUgPSB2OworCX0KKworCWRldiA9IGJsa2lkX2ZpbmRfZGV2X3dpdGhfdGFnKGMsIHRva2VuLCB2YWx1ZSk7CisJaWYgKCFkZXYpCisJCWdvdG8gZXJyb3V0OworCisJcmV0ID0gYmxraWRfc3RyZHVwKGJsa2lkX2Rldl9kZXZuYW1lKGRldikpOworCitlcnJvdXQ6CisJZnJlZSh0KTsKKwlmcmVlKHYpOworCWlmICghY2FjaGUpIHsKKwkJYmxraWRfcHV0X2NhY2hlKGMpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgVEVTVF9QUk9HUkFNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqdmFsdWU7CisJYmxraWRfY2FjaGUgY2FjaGU7CisKKwlibGtpZF9kZWJ1Z19tYXNrID0gREVCVUdfQUxMOworCWlmIChhcmdjICE9IDIgJiYgYXJnYyAhPSAzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6XHQlcyB0YWduYW1lPXZhbHVlXG4iCisJCQkiXHQlcyB0YWduYW1lIGRldm5hbWVcbiIKKwkJCSJGaW5kIHdoaWNoIGRldmljZSBob2xkcyBhIGdpdmVuIHRva2VuIG9yXG4iCisJCQkiRmluZCB3aGF0IHRoZSB2YWx1ZSBvZiBhIHRhZyBpcyBpbiBhIGRldmljZVxuIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlpZiAoYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgYmJfZGV2X251bGwpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGdldCBibGtpZCBjYWNoZVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKGFyZ3ZbMl0pIHsKKwkJdmFsdWUgPSBibGtpZF9nZXRfdGFnX3ZhbHVlKGNhY2hlLCBhcmd2WzFdLCBhcmd2WzJdKTsKKwkJcHJpbnRmKCIlcyBoYXMgdGFnICVzPSVzXG4iLCBhcmd2WzJdLCBhcmd2WzFdLAorCQkgICAgICAgdmFsdWUgPyB2YWx1ZSA6ICI8bWlzc2luZz4iKTsKKwl9IGVsc2UgeworCQl2YWx1ZSA9IGJsa2lkX2dldF9kZXZuYW1lKGNhY2hlLCBhcmd2WzFdLCBOVUxMKTsKKwkJcHJpbnRmKCIlcyBoYXMgdGFnICVzXG4iLCB2YWx1ZSA/IHZhbHVlIDogIjxub25lPiIsIGFyZ3ZbMV0pOworCX0KKwlibGtpZF9wdXRfY2FjaGUoY2FjaGUpOworCXJldHVybiB2YWx1ZSA/IDAgOiAxOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9zYXZlLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9zYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwY2NhNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3NhdmUuYwpAQCAtMCwwICsxLDE4OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2F2ZS5jIC0gd3JpdGUgdGhlIGNhY2hlIHN0cnVjdCB0byBkaXNrCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgRGlsZ2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhlb2RvcmUgVHMnbworICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX01LREVWX0gKKyNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlICJibGtpZFAuaCIKKworc3RhdGljIGludCBzYXZlX2RldihibGtpZF9kZXYgZGV2LCBGSUxFICpmaWxlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlpZiAoIWRldiB8fCBkZXYtPmJpZF9uYW1lWzBdICE9ICcvJykKKwkJcmV0dXJuIDA7CisKKwlEQkcoREVCVUdfU0FWRSwKKwkgICAgcHJpbnRmKCJkZXZpY2UgJXMsIHR5cGUgJXNcbiIsIGRldi0+YmlkX25hbWUsIGRldi0+YmlkX3R5cGUpKTsKKworCWZwcmludGYoZmlsZSwKKwkJIjxkZXZpY2UgREVWTk89XCIweCUwNGx4XCIgVElNRT1cIiVsdVwiIiwKKwkJKHVuc2lnbmVkIGxvbmcpIGRldi0+YmlkX2Rldm5vLCBkZXYtPmJpZF90aW1lKTsKKwlpZiAoZGV2LT5iaWRfcHJpKQorCQlmcHJpbnRmKGZpbGUsICIgUFJJPVwiJWRcIiIsIGRldi0+YmlkX3ByaSk7CisJbGlzdF9mb3JfZWFjaChwLCAmZGV2LT5iaWRfdGFncykgeworCQlibGtpZF90YWcgdGFnID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywgYml0X3RhZ3MpOworCQlmcHJpbnRmKGZpbGUsICIgJXM9XCIlc1wiIiwgdGFnLT5iaXRfbmFtZSx0YWctPmJpdF92YWwpOworCX0KKwlmcHJpbnRmKGZpbGUsICI+JXM8L2RldmljZT5cbiIsIGRldi0+YmlkX25hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgdGhlIGNhY2hlIHN0cnVjdCB0byB0aGUgY2FjaGUgZmlsZSBvbiBkaXNrLgorICovCitpbnQgYmxraWRfZmx1c2hfY2FjaGUoYmxraWRfY2FjaGUgY2FjaGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwljaGFyICp0bXAgPSBOVUxMOworCWNvbnN0IGNoYXIgKm9wZW5lZCA9IE5VTEw7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJRklMRSAqZmlsZSA9IE5VTEw7CisJaW50IGZkLCByZXQgPSAwOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlpZiAobGlzdF9lbXB0eSgmY2FjaGUtPmJpY19kZXZzKSB8fAorCSAgICAhKGNhY2hlLT5iaWNfZmxhZ3MgJiBCTEtJRF9CSUNfRkxfQ0hBTkdFRCkpIHsKKwkJREJHKERFQlVHX1NBVkUsIHByaW50Zigic2tpcHBpbmcgY2FjaGUgZmlsZSB3cml0ZVxuIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmaWxlbmFtZSA9IGNhY2hlLT5iaWNfZmlsZW5hbWUgPyBjYWNoZS0+YmljX2ZpbGVuYW1lOiBCTEtJRF9DQUNIRV9GSUxFOworCisJLyogSWYgd2UgY2FuJ3Qgd3JpdGUgdG8gdGhlIGNhY2hlIGZpbGUsIHRoZW4gZG9uJ3QgZXZlbiB0cnkgKi8KKwlpZiAoKChyZXQgPSBzdGF0KGZpbGVuYW1lLCAmc3QpKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UKSB8fAorCSAgICAocmV0ID09IDAgJiYgYWNjZXNzKGZpbGVuYW1lLCBXX09LKSA8IDApKSB7CisJCURCRyhERUJVR19TQVZFLAorCQkgICAgcHJpbnRmKCJjYW4ndCB3cml0ZSB0byBjYWNoZSBmaWxlICVzXG4iLCBmaWxlbmFtZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRyeSBhbmQgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHNvCisJICogdGhhdCBpbiBjYXNlIG9mIGVycm9yIHdlIGRvbid0IG92ZXJ3cml0ZSB0aGUgY2FjaGUgZmlsZS4KKwkgKiBJZiB0aGUgY2FjaGUgZmlsZSBkb2Vzbid0IHlldCBleGlzdCwgaXQgaXNuJ3QgYSByZWd1bGFyCisJICogZmlsZSAoZS5nLiAvZGV2L251bGwgb3IgYSBzb2NrZXQpLCBvciB3ZSBjb3VsZG4ndCBjcmVhdGUKKwkgKiBhIHRlbXBvcmFyeSBmaWxlIHRoZW4gd2Ugb3BlbiBpdCBkaXJlY3RseS4KKwkgKi8KKwlpZiAocmV0ID09IDAgJiYgU19JU1JFRyhzdC5zdF9tb2RlKSkgeworCQl0bXAgPSB4bWFsbG9jKHN0cmxlbihmaWxlbmFtZSkgKyA4KTsKKwkJc3ByaW50Zih0bXAsICIlcy1YWFhYWFgiLCBmaWxlbmFtZSk7CisJCWZkID0gbWtzdGVtcCh0bXApOworCQlpZiAoZmQgPj0gMCkgeworCQkJZmlsZSA9IHhmZG9wZW5fZm9yX3dyaXRlKGZkKTsKKwkJCW9wZW5lZCA9IHRtcDsKKwkJfQorCQlmY2htb2QoZmQsIDA2NDQpOworCX0KKworCWlmICghZmlsZSkgeworCQlmaWxlID0gZm9wZW5fZm9yX3dyaXRlKGZpbGVuYW1lKTsKKwkJb3BlbmVkID0gZmlsZW5hbWU7CisJfQorCisJREJHKERFQlVHX1NBVkUsCisJICAgIHByaW50Zigid3JpdGluZyBjYWNoZSBmaWxlICVzIChyZWFsbHkgJXMpXG4iLAorCQkgICBmaWxlbmFtZSwgb3BlbmVkKSk7CisKKwlpZiAoIWZpbGUpIHsKKwkJcmV0ID0gZXJybm87CisJCWdvdG8gZXJyb3V0OworCX0KKworCWxpc3RfZm9yX2VhY2gocCwgJmNhY2hlLT5iaWNfZGV2cykgeworCQlibGtpZF9kZXYgZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X2RldiwgYmlkX2RldnMpOworCQlpZiAoIWRldi0+YmlkX3R5cGUpCisJCQljb250aW51ZTsKKwkJaWYgKChyZXQgPSBzYXZlX2RldihkZXYsIGZpbGUpKSA8IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAocmV0ID49IDApIHsKKwkJY2FjaGUtPmJpY19mbGFncyAmPSB+QkxLSURfQklDX0ZMX0NIQU5HRUQ7CisJCXJldCA9IDE7CisJfQorCisJZmNsb3NlKGZpbGUpOworCWlmIChvcGVuZWQgIT0gZmlsZW5hbWUpIHsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXVubGluayhvcGVuZWQpOworCQkJREJHKERFQlVHX1NBVkUsCisJCQkgICAgcHJpbnRmKCJ1bmxpbmtlZCB0ZW1wIGNhY2hlICVzXG4iLCBvcGVuZWQpKTsKKwkJfSBlbHNlIHsKKwkJCWNoYXIgKmJhY2t1cDsKKworCQkJYmFja3VwID0geG1hbGxvYyhzdHJsZW4oZmlsZW5hbWUpICsgNSk7CisJCQlzcHJpbnRmKGJhY2t1cCwgIiVzLm9sZCIsIGZpbGVuYW1lKTsKKwkJCXVubGluayhiYWNrdXApOworCQkJbGluayhmaWxlbmFtZSwgYmFja3VwKTsKKwkJCWZyZWUoYmFja3VwKTsKKwkJCXJlbmFtZShvcGVuZWQsIGZpbGVuYW1lKTsKKwkJCURCRyhERUJVR19TQVZFLAorCQkJICAgIHByaW50ZigibW92ZWQgdGVtcCBjYWNoZSAlc1xuIiwgb3BlbmVkKSk7CisJCX0KKwl9CisKK2Vycm91dDoKKwlmcmVlKHRtcCk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWJsa2lkX2NhY2hlIGNhY2hlID0gTlVMTDsKKwlpbnQgcmV0OworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoYXJnYyA+IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW2ZpbGVuYW1lXVxuIgorCQkJIlRlc3QgbG9hZGluZy9zYXZpbmcgYSBjYWNoZSAoZmlsZW5hbWUpXG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoKHJldCA9IGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIGJiX2Rldl9udWxsKSkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciBjcmVhdGluZyBjYWNoZSAoJWQpXG4iLAorCQkJYXJndlswXSwgcmV0KTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKChyZXQgPSBibGtpZF9wcm9iZV9hbGwoY2FjaGUpKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciAoJWQpIHByb2JpbmcgZGV2aWNlc1xuIiwgcmV0KTsKKwkJZXhpdCgxKTsKKwl9CisJY2FjaGUtPmJpY19maWxlbmFtZSA9IGJsa2lkX3N0cmR1cChhcmd2WzFdKTsKKworCWlmICgocmV0ID0gYmxraWRfZmx1c2hfY2FjaGUoY2FjaGUpKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciAoJWQpIHNhdmluZyBjYWNoZVxuIiwgcmV0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlibGtpZF9wdXRfY2FjaGUoY2FjaGUpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvdGFnLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC90YWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM3YjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvdGFnLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHRhZy5jIC0gYWxsb2NhdGlvbi9pbml0aWFsaXphdGlvbi9mcmVlIHJvdXRpbmVzIGZvciB0YWcgc3RydWN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYmxraWRQLmgiCisKK3N0YXRpYyBibGtpZF90YWcgYmxraWRfbmV3X3RhZyh2b2lkKQoreworCWJsa2lkX3RhZyB0YWc7CisKKwl0YWcgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZykpOworCisJSU5JVF9MSVNUX0hFQUQoJnRhZy0+Yml0X3RhZ3MpOworCUlOSVRfTElTVF9IRUFEKCZ0YWctPmJpdF9uYW1lcyk7CisKKwlyZXR1cm4gdGFnOworfQorCisjaWZkZWYgQ09ORklHX0JMS0lEX0RFQlVHCit2b2lkIGJsa2lkX2RlYnVnX2R1bXBfdGFnKGJsa2lkX3RhZyB0YWcpCit7CisJaWYgKCF0YWcpIHsKKwkJcHJpbnRmKCIgICAgdGFnOiBOVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiICAgIHRhZzogJXM9XCIlc1wiXG4iLCB0YWctPmJpdF9uYW1lLCB0YWctPmJpdF92YWwpOworfQorI2VuZGlmCisKK3ZvaWQgYmxraWRfZnJlZV90YWcoYmxraWRfdGFnIHRhZykKK3sKKwlpZiAoIXRhZykKKwkJcmV0dXJuOworCisJREJHKERFQlVHX1RBRywgcHJpbnRmKCIgICAgZnJlZWluZyB0YWcgJXM9JXNcbiIsIHRhZy0+Yml0X25hbWUsCisJCSAgIHRhZy0+Yml0X3ZhbCA/IHRhZy0+Yml0X3ZhbCA6ICIoTlVMTCkiKSk7CisJREJHKERFQlVHX1RBRywgYmxraWRfZGVidWdfZHVtcF90YWcodGFnKSk7CisKKwlsaXN0X2RlbCgmdGFnLT5iaXRfdGFncyk7CS8qIGxpc3Qgb2YgdGFncyBmb3IgdGhpcyBkZXZpY2UgKi8KKwlsaXN0X2RlbCgmdGFnLT5iaXRfbmFtZXMpOwkvKiBsaXN0IG9mIHRhZ3Mgd2l0aCB0aGlzIHR5cGUgKi8KKworCWZyZWUodGFnLT5iaXRfbmFtZSk7CisJZnJlZSh0YWctPmJpdF92YWwpOworCWZyZWUodGFnKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGRlc2lyZWQgdGFnIG9uIGEgZGV2aWNlLiAgSWYgdmFsdWUgaXMgTlVMTCwgdGhlbiB0aGUKKyAqIGZpcnN0IHN1Y2ggdGFnIGlzIHJldHVybmVkLCBvdGhlcndpc2UgcmV0dXJuIG9ubHkgZXhhY3QgdGFnIGlmIGZvdW5kLgorICovCitibGtpZF90YWcgYmxraWRfZmluZF90YWdfZGV2KGJsa2lkX2RldiBkZXYsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWlmICghZGV2IHx8ICF0eXBlKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gocCwgJmRldi0+YmlkX3RhZ3MpIHsKKwkJYmxraWRfdGFnIHRtcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsCisJCQkJCSAgIGJpdF90YWdzKTsKKworCQlpZiAoIXN0cmNtcCh0bXAtPmJpdF9uYW1lLCB0eXBlKSkKKwkJCXJldHVybiB0bXA7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogRmluZCB0aGUgZGVzaXJlZCB0YWcgdHlwZSBpbiB0aGUgY2FjaGUuCisgKiBXZSByZXR1cm4gdGhlIGhlYWQgdGFnIGZvciB0aGlzIHRhZyB0eXBlLgorICovCitzdGF0aWMgYmxraWRfdGFnIGJsa2lkX2ZpbmRfaGVhZF9jYWNoZShibGtpZF9jYWNoZSBjYWNoZSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlibGtpZF90YWcgaGVhZCA9IE5VTEwsIHRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJaWYgKCFjYWNoZSB8fCAhdHlwZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZjYWNoZS0+YmljX3RhZ3MpIHsKKwkJdG1wID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywgYml0X3RhZ3MpOworCQlpZiAoIXN0cmNtcCh0bXAtPmJpdF9uYW1lLCB0eXBlKSkgeworCQkJREJHKERFQlVHX1RBRywKKwkJCSAgICBwcmludGYoIiAgICBmb3VuZCBjYWNoZSB0YWcgaGVhZCAlc1xuIiwgdHlwZSkpOworCQkJaGVhZCA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBoZWFkOworfQorCisvKgorICogU2V0IGEgdGFnIG9uIGFuIGV4aXN0aW5nIGRldmljZS4KKyAqCisgKiBJZiB2YWx1ZSBpcyBOVUxMLCB0aGVuIGRlbGV0ZSB0aGUgdGFnc2Zyb20gdGhlIGRldmljZS4KKyAqLworaW50IGJsa2lkX3NldF90YWcoYmxraWRfZGV2IGRldiwgY29uc3QgY2hhciAqbmFtZSwKKwkJICBjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgaW50IHZsZW5ndGgpCit7CisJYmxraWRfdGFnCXQgPSAwLCBoZWFkID0gMDsKKwljaGFyCQkqdmFsID0gTlVMTDsKKworCWlmICghZGV2IHx8ICFuYW1lKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCWlmICghKHZhbCA9IGJsa2lkX3N0cm5kdXAodmFsdWUsIHZsZW5ndGgpKSAmJiB2YWx1ZSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfTUVNOworCXQgPSBibGtpZF9maW5kX3RhZ19kZXYoZGV2LCBuYW1lKTsKKwlpZiAoIXZhbHVlKSB7CisJCWJsa2lkX2ZyZWVfdGFnKHQpOworCX0gZWxzZSBpZiAodCkgeworCQlpZiAoIXN0cmNtcCh0LT5iaXRfdmFsLCB2YWwpKSB7CisJCQkvKiBTYW1lIHRoaW5nLCBleGl0ICovCisJCQlmcmVlKHZhbCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmcmVlKHQtPmJpdF92YWwpOworCQl0LT5iaXRfdmFsID0gdmFsOworCX0gZWxzZSB7CisJCS8qIEV4aXN0aW5nIHRhZyBub3QgcHJlc2VudCwgYWRkIHRvIGRldmljZSAqLworCQlpZiAoISh0ID0gYmxraWRfbmV3X3RhZygpKSkKKwkJCWdvdG8gZXJyb3V0OworCQl0LT5iaXRfbmFtZSA9IGJsa2lkX3N0cmR1cChuYW1lKTsKKwkJdC0+Yml0X3ZhbCA9IHZhbDsKKwkJdC0+Yml0X2RldiA9IGRldjsKKworCQlsaXN0X2FkZF90YWlsKCZ0LT5iaXRfdGFncywgJmRldi0+YmlkX3RhZ3MpOworCisJCWlmIChkZXYtPmJpZF9jYWNoZSkgeworCQkJaGVhZCA9IGJsa2lkX2ZpbmRfaGVhZF9jYWNoZShkZXYtPmJpZF9jYWNoZSwKKwkJCQkJCSAgICAgdC0+Yml0X25hbWUpOworCQkJaWYgKCFoZWFkKSB7CisJCQkJaGVhZCA9IGJsa2lkX25ld190YWcoKTsKKwkJCQlpZiAoIWhlYWQpCisJCQkJCWdvdG8gZXJyb3V0OworCisJCQkJREJHKERFQlVHX1RBRywKKwkJCQkgICAgcHJpbnRmKCIgICAgY3JlYXRpbmcgbmV3IGNhY2hlIHRhZyBoZWFkICVzXG4iLCBuYW1lKSk7CisJCQkJaGVhZC0+Yml0X25hbWUgPSBibGtpZF9zdHJkdXAobmFtZSk7CisJCQkJaWYgKCFoZWFkLT5iaXRfbmFtZSkKKwkJCQkJZ290byBlcnJvdXQ7CisJCQkJbGlzdF9hZGRfdGFpbCgmaGVhZC0+Yml0X3RhZ3MsCisJCQkJCSAgICAgICZkZXYtPmJpZF9jYWNoZS0+YmljX3RhZ3MpOworCQkJfQorCQkJbGlzdF9hZGRfdGFpbCgmdC0+Yml0X25hbWVzLCAmaGVhZC0+Yml0X25hbWVzKTsKKwkJfQorCX0KKworCS8qIExpbmsgY29tbW9uIHRhZ3MgZGlyZWN0bHkgdG8gdGhlIGRldmljZSBzdHJ1Y3QgKi8KKwlpZiAoIXN0cmNtcChuYW1lLCAiVFlQRSIpKQorCQlkZXYtPmJpZF90eXBlID0gdmFsOworCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkxBQkVMIikpCisJCWRldi0+YmlkX2xhYmVsID0gdmFsOworCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlVVSUQiKSkKKwkJZGV2LT5iaWRfdXVpZCA9IHZhbDsKKworCWlmIChkZXYtPmJpZF9jYWNoZSkKKwkJZGV2LT5iaWRfY2FjaGUtPmJpY19mbGFncyB8PSBCTEtJRF9CSUNfRkxfQ0hBTkdFRDsKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCWJsa2lkX2ZyZWVfdGFnKHQpOworCWlmICghdCkKKwkJZnJlZSh2YWwpOworCWJsa2lkX2ZyZWVfdGFnKGhlYWQpOworCXJldHVybiAtQkxLSURfRVJSX01FTTsKK30KKworCisvKgorICogUGFyc2UgYSAiTkFNRT12YWx1ZSIgc3RyaW5nLiAgVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbgorICogcGFyc2VfdG9rZW4sIGJlY2F1c2UgdGhhdCB3aWxsIGVuZCBhbiB1bnF1b3RlZCB2YWx1ZSBhdCBhIHNwYWNlLCB3aGlsZQorICogdGhpcyB3aWxsIGFzc3VtZSB0aGF0IGFuIHVucXVvdGVkIHZhbHVlIGlzIHRoZSByZXN0IG9mIHRoZSB0b2tlbiAoZS5nLgorICogaWYgd2UgYXJlIHBhc3NlZCBhbiBhbHJlYWR5IHF1b3RlZCBzdHJpbmcgZnJvbSB0aGUgY29tbWFuZC1saW5lIHdlIGRvbid0CisgKiBoYXZlIHRvIGJvdGggcXVvdGUgYW5kIGVzY2FwZSBxdW90ZSBzbyB0aGF0IHRoZSBxdW90ZXMgbWFrZSBpdCB0bworICogdXMpLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbmQgLTEgb24gZmFpbHVyZS4KKyAqLworaW50IGJsa2lkX3BhcnNlX3RhZ19zdHJpbmcoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKipyZXRfdHlwZSwgY2hhciAqKnJldF92YWwpCit7CisJY2hhciAqbmFtZSwgKnZhbHVlLCAqY3A7CisKKwlEQkcoREVCVUdfVEFHLCBwcmludGYoInRyeWluZyB0byBwYXJzZSAnJXMnIGFzIGEgdGFnXG4iLCB0b2tlbikpOworCisJaWYgKCF0b2tlbiB8fCAhKGNwID0gc3RyY2hyKHRva2VuLCAnPScpKSkKKwkJcmV0dXJuIC0xOworCisJbmFtZSA9IGJsa2lkX3N0cmR1cCh0b2tlbik7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLTE7CisJdmFsdWUgPSBuYW1lICsgKGNwIC0gdG9rZW4pOworCSp2YWx1ZSsrID0gJ1wwJzsKKwlpZiAoKnZhbHVlID09ICciJyB8fCAqdmFsdWUgPT0gJ1wnJykgeworCQljaGFyIGMgPSAqdmFsdWUrKzsKKwkJaWYgKCEoY3AgPSBzdHJyY2hyKHZhbHVlLCBjKSkpCisJCQlnb3RvIGVycm91dDsgLyogbWlzc2luZyBjbG9zaW5nIHF1b3RlICovCisJCSpjcCA9ICdcMCc7CisJfQorCXZhbHVlID0gYmxraWRfc3RyZHVwKHZhbHVlKTsKKwlpZiAoIXZhbHVlKQorCQlnb3RvIGVycm91dDsKKworCSpyZXRfdHlwZSA9IG5hbWU7CisJKnJldF92YWwgPSB2YWx1ZTsKKworCXJldHVybiAwOworCitlcnJvdXQ6CisJZnJlZShuYW1lKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUYWcgaXRlcmF0aW9uIHJvdXRpbmVzIGZvciB0aGUgcHVibGljIGxpYmJsa2lkIGludGVyZmFjZS4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBkbyBub3QgZXhwb3NlIHRoZSBsaXN0LmggaW1wbGVtZW50YXRpb24sIHdoaWNoIGFyZSBhCisgKiBjb250YW1pbmF0aW9uIG9mIHRoZSBuYW1lc3BhY2UsIGFuZCB3aGljaCBmb3JjZSB1cyB0byByZXZlYWwgZmFyLCBmYXIKKyAqIHRvbyBtdWNoIG9mIG91ciBpbnRlcm5hbCBpbXBsZW1lbmF0aW9uLiAgSSdtIG5vdCBjb252aW5jZWQgSSB3YW50CisgKiB0byBrZWVwIGxpc3QuaCBpbiB0aGUgbG9uZyB0ZXJtLCBhbnl3YXkuICBJdCdzIGZpbmUgZm9yIGtlcm5lbAorICogcHJvZ3JhbW1pbmcsIGJ1dCBwZXJmb3JtYW5jZSBpcyBub3QgdGhlICMxIHByaW9yaXR5IGZvciB0aGlzCisgKiBsaWJyYXJ5LCBhbmQgSSByZWFsbHkgZG9uJ3QgbGlrZSB0aGUgdHJhZGVvZmYgb2YgdHlwZS1zYWZldHkgZm9yCisgKiBwZXJmb3JtYW5jZSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIFt0eXRzbzoyMDAzMDEyNS4yMDA3RVNUXQorICovCisKKy8qCisgKiBUaGlzIHNlcmllcyBvZiBmdW5jdGlvbnMgaXRlcmF0ZSBvdmVyIGFsbCB0YWdzIGluIGEgZGV2aWNlCisgKi8KKyNkZWZpbmUgVEFHX0lURVJBVEVfTUFHSUMJMHgwMWE1Mjg0YworCitzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZ19pdGVyYXRlIHsKKwlpbnQJCQltYWdpYzsKKwlibGtpZF9kZXYJCWRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpwOworfTsKKworYmxraWRfdGFnX2l0ZXJhdGUgYmxraWRfdGFnX2l0ZXJhdGVfYmVnaW4oYmxraWRfZGV2IGRldikKK3sKKwlibGtpZF90YWdfaXRlcmF0ZQlpdGVyOworCisJaXRlciA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnX2l0ZXJhdGUpKTsKKwlpdGVyLT5tYWdpYyA9IFRBR19JVEVSQVRFX01BR0lDOworCWl0ZXItPmRldiA9IGRldjsKKwlpdGVyLT5wCT0gZGV2LT5iaWRfdGFncy5uZXh0OworCXJldHVybiBpdGVyOworfQorCisvKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAqLworZXh0ZXJuIGludCBibGtpZF90YWdfbmV4dChibGtpZF90YWdfaXRlcmF0ZSBpdGVyLAorCQkJICBjb25zdCBjaGFyICoqdHlwZSwgY29uc3QgY2hhciAqKnZhbHVlKQoreworCWJsa2lkX3RhZyB0YWc7CisKKwkqdHlwZSA9IDA7CisJKnZhbHVlID0gMDsKKwlpZiAoIWl0ZXIgfHwgaXRlci0+bWFnaWMgIT0gVEFHX0lURVJBVEVfTUFHSUMgfHwKKwkgICAgaXRlci0+cCA9PSAmaXRlci0+ZGV2LT5iaWRfdGFncykKKwkJcmV0dXJuIC0xOworCXRhZyA9IGxpc3RfZW50cnkoaXRlci0+cCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsIGJpdF90YWdzKTsKKwkqdHlwZSA9IHRhZy0+Yml0X25hbWU7CisJKnZhbHVlID0gdGFnLT5iaXRfdmFsOworCWl0ZXItPnAgPSBpdGVyLT5wLT5uZXh0OworCXJldHVybiAwOworfQorCit2b2lkIGJsa2lkX3RhZ19pdGVyYXRlX2VuZChibGtpZF90YWdfaXRlcmF0ZSBpdGVyKQoreworCWlmICghaXRlciB8fCBpdGVyLT5tYWdpYyAhPSBUQUdfSVRFUkFURV9NQUdJQykKKwkJcmV0dXJuOworCWl0ZXItPm1hZ2ljID0gMDsKKwlmcmVlKGl0ZXIpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgZGV2aWNlIHdoaWNoIG1hdGNoZXMgYSBwYXJ0aWN1bGFyCisgKiB0eXBlL3ZhbHVlIHBhaXIuICBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGRldmljZSB0aGF0IG1hdGNoZXMgdGhlCisgKiBzZWFyY2ggc3BlY2lmaWNhdGlvbiwgaXQgcmV0dXJucyB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkKKyAqIHZhbHVlLiAgVGhpcyBhbGxvd3MgdXMgdG8gZ2l2ZSBwcmVmZXJlbmNlIHRvIEVWTVMgb3IgTFZNIGRldmljZXMuCisgKgorICogWFhYIHRoZXJlIHNob3VsZCBhbHNvIGJlIGFuIGludGVyZmFjZSB3aGljaCB1c2VzIGFuIGl0ZXJhdG9yIHNvIHdlCisgKiBjYW4gZ2V0IGFsbCBvZiB0aGUgZGV2aWNlcyB3aGljaCBtYXRjaCBhIHR5cGUvdmFsdWUgc2VhcmNoIHBhcmFtZXRlci4KKyAqLworZXh0ZXJuIGJsa2lkX2RldiBibGtpZF9maW5kX2Rldl93aXRoX3RhZyhibGtpZF9jYWNoZSBjYWNoZSwKKwkJCQkJIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkJCSBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlibGtpZF90YWcJaGVhZDsKKwlibGtpZF9kZXYJZGV2OworCWludAkJcHJpOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlpZiAoIWNhY2hlIHx8ICF0eXBlIHx8ICF2YWx1ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlibGtpZF9yZWFkX2NhY2hlKGNhY2hlKTsKKworCURCRyhERUJVR19UQUcsIHByaW50ZigibG9va2luZyBmb3IgJXM9JXMgaW4gY2FjaGVcbiIsIHR5cGUsIHZhbHVlKSk7CisKK3RyeV9hZ2FpbjoKKwlwcmkgPSAtMTsKKwlkZXYgPSAwOworCWhlYWQgPSBibGtpZF9maW5kX2hlYWRfY2FjaGUoY2FjaGUsIHR5cGUpOworCisJaWYgKGhlYWQpIHsKKwkJbGlzdF9mb3JfZWFjaChwLCAmaGVhZC0+Yml0X25hbWVzKSB7CisJCQlibGtpZF90YWcgdG1wID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywKKwkJCQkJCSAgIGJpdF9uYW1lcyk7CisKKwkJCWlmICghc3RyY21wKHRtcC0+Yml0X3ZhbCwgdmFsdWUpICYmCisJCQkgICAgdG1wLT5iaXRfZGV2LT5iaWRfcHJpID4gcHJpKSB7CisJCQkJZGV2ID0gdG1wLT5iaXRfZGV2OworCQkJCXByaSA9IGRldi0+YmlkX3ByaTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZGV2ICYmICEoZGV2LT5iaWRfZmxhZ3MgJiBCTEtJRF9CSURfRkxfVkVSSUZJRUQpKSB7CisJCWRldiA9IGJsa2lkX3ZlcmlmeShjYWNoZSwgZGV2KTsKKwkJaWYgKGRldiAmJiAoZGV2LT5iaWRfZmxhZ3MgJiBCTEtJRF9CSURfRkxfVkVSSUZJRUQpKQorCQkJZ290byB0cnlfYWdhaW47CisJfQorCisJaWYgKCFkZXYgJiYgIShjYWNoZS0+YmljX2ZsYWdzICYgQkxLSURfQklDX0ZMX1BST0JFRCkpIHsKKwkJaWYgKGJsa2lkX3Byb2JlX2FsbChjYWNoZSkgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKwlyZXR1cm4gZGV2OworfQorCisjaWZkZWYgVEVTVF9QUk9HUkFNCisjaWZkZWYgSEFWRV9HRVRPUFRfSAorI2luY2x1ZGUgPGdldG9wdC5oPgorI2Vsc2UKK2V4dGVybiBjaGFyICpvcHRhcmc7CitleHRlcm4gaW50IG9wdGluZDsKKyNlbmRpZgorCit2b2lkIHVzYWdlKGNoYXIgKnByb2cpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1mIGJsa2lkX2ZpbGVdIFstbSBkZWJ1Z19tYXNrXSBkZXZpY2UgIgorCQkiW3R5cGUgdmFsdWVdXG4iLAorCQlwcm9nKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0TGlzdCBhbGwgdGFncyBmb3IgYSBkZXZpY2UgYW5kIGV4aXRcbiIsIHByb2cpOworCWV4aXQoMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlibGtpZF90YWdfaXRlcmF0ZQlpdGVyOworCWJsa2lkX2NhY2hlCQljYWNoZSA9IE5VTEw7CisJYmxraWRfZGV2CQlkZXY7CisJaW50CQkJYywgcmV0LCBmb3VuZDsKKwlpbnQJCQlmbGFncyA9IEJMS0lEX0RFVl9GSU5EOworCWNoYXIJCQkqdG1wOworCWNoYXIJCQkqZmlsZSA9IE5VTEw7CisJY2hhcgkJCSpkZXZuYW1lID0gTlVMTDsKKwljaGFyCQkJKnNlYXJjaF90eXBlID0gTlVMTDsKKwljaGFyCQkJKnNlYXJjaF92YWx1ZSA9IE5VTEw7CisJY29uc3QgY2hhcgkJKnR5cGUsICp2YWx1ZTsKKworCXdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgIm06ZjoiKSkgIT0gRU9GKQorCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnZic6CisJCQlmaWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJYmxraWRfZGVidWdfbWFzayA9IHN0cnRvdWwgKG9wdGFyZywgJnRtcCwgMCk7CisJCQlpZiAoKnRtcCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBkZWJ1ZyBtYXNrOiAlZFxuIiwKKwkJCQkJb3B0YXJnKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJdXNhZ2UoYXJndlswXSk7CisJCX0KKwlpZiAoYXJnYyA+IG9wdGluZCkKKwkJZGV2bmFtZSA9IGFyZ3Zbb3B0aW5kKytdOworCWlmIChhcmdjID4gb3B0aW5kKQorCQlzZWFyY2hfdHlwZSA9IGFyZ3Zbb3B0aW5kKytdOworCWlmIChhcmdjID4gb3B0aW5kKQorCQlzZWFyY2hfdmFsdWUgPSBhcmd2W29wdGluZCsrXTsKKwlpZiAoIWRldm5hbWUgfHwgKGFyZ2MgIT0gb3B0aW5kKSkKKwkJdXNhZ2UoYXJndlswXSk7CisKKwlpZiAoKHJldCA9IGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIGZpbGUpKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGNyZWF0aW5nIGNhY2hlICglZClcbiIsCisJCQlhcmd2WzBdLCByZXQpOworCQlleGl0KDEpOworCX0KKworCWRldiA9IGJsa2lkX2dldF9kZXYoY2FjaGUsIGRldm5hbWUsIGZsYWdzKTsKKwlpZiAoIWRldikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgZmluZCBkZXZpY2UgaW4gYmxraWQgY2FjaGVcbiIpOworCQlleGl0KDEpOworCX0KKwlpZiAoc2VhcmNoX3R5cGUpIHsKKwkJZm91bmQgPSBibGtpZF9kZXZfaGFzX3RhZyhkZXYsIHNlYXJjaF90eXBlLCBzZWFyY2hfdmFsdWUpOworCQlwcmludGYoIkRldmljZSAlczogKCVzLCAlcykgJXNcbiIsIGJsa2lkX2Rldl9kZXZuYW1lKGRldiksCisJCSAgICAgICBzZWFyY2hfdHlwZSwgc2VhcmNoX3ZhbHVlID8gc2VhcmNoX3ZhbHVlIDogIk5VTEwiLAorCQkgICAgICAgZm91bmQgPyAiRk9VTkQiIDogIk5PVCBGT1VORCIpOworCQlyZXR1cm4gIWZvdW5kOworCX0KKwlwcmludGYoIkRldmljZSAlcy4uLlxuIiwgYmxraWRfZGV2X2Rldm5hbWUoZGV2KSk7CisKKwlpdGVyID0gYmxraWRfdGFnX2l0ZXJhdGVfYmVnaW4oZGV2KTsKKwl3aGlsZSAoYmxraWRfdGFnX25leHQoaXRlciwgJnR5cGUsICZ2YWx1ZSkgPT0gMCkgeworCQlwcmludGYoIlx0VGFnICVzIGhhcyB2YWx1ZSAlc1xuIiwgdHlwZSwgdmFsdWUpOworCX0KKwlibGtpZF90YWdfaXRlcmF0ZV9lbmQoaXRlcik7CisKKwlibGtpZF9wdXRfY2FjaGUoY2FjaGUpOworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9jaGF0dHIuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2NoYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMzlkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9jaGF0dHIuYwpAQCAtMCwwICsxLDIyMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY2hhdHRyLmMJCS0gQ2hhbmdlIGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKy8qCisgKiBIaXN0b3J5OgorICogOTMvMTAvMzAJLSBDcmVhdGlvbgorICogOTMvMTEvMTMJLSBSZXBsYWNlIHN0YXQoKSBjYWxscyBieSBsc3RhdCgpIHRvIGF2b2lkIGxvb3BzCisgKiA5NC8wMi8yNwktIEludGVncmF0ZWQgaW4gVGVkJ3MgZGlzdHJpYnV0aW9uCisgKiA5OC8xMi8yOQktIElnbm9yZSBzeW1saW5rcyB3aGVuIHdvcmtpbmcgcmVjdXJzaXZlbHkgKEcgTSBTaXBlKQorICogOTgvMTIvMjkJLSBEaXNwbGF5IHZlcnNpb24gaW5mbyBvbmx5IHdoZW4gLVYgc3BlY2lmaWVkIChHIE0gU2lwZSkKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJleHQyZnMvZXh0Ml9mcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIEVYVDJGU19BVFRSKHgpIF9fYXR0cmlidXRlX18oeCkKKyNlbHNlCisjIGRlZmluZSBFWFQyRlNfQVRUUih4KQorI2VuZGlmCisKKyNpbmNsdWRlICJlMmZzYmIuaCIKKyNpbmNsdWRlICJlMnAvZTJwLmgiCisKKyNkZWZpbmUgT1BUX0FERCAxCisjZGVmaW5lIE9QVF9SRU0gMgorI2RlZmluZSBPUFRfU0VUIDQKKyNkZWZpbmUgT1BUX1NFVF9WRVIgOAorc3RhdGljIGludCBmbGFnczsKK3N0YXRpYyBpbnQgcmVjdXJzaXZlOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2ZXJzaW9uOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhZjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJmOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2Y7CisKK3N0cnVjdCBmbGFnc19jaGFyIHsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJY2hhciBvcHRjaGFyOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmbGFnc19jaGFyIGZsYWdzX2FycmF5W10gPSB7CisJeyBFWFQyX05PQVRJTUVfRkwsICAgICAgJ0EnIH0sCisJeyBFWFQyX1NZTkNfRkwsICAgICAgICAgJ1MnIH0sCisJeyBFWFQyX0RJUlNZTkNfRkwsICAgICAgJ0QnIH0sCisJeyBFWFQyX0FQUEVORF9GTCwgICAgICAgJ2EnIH0sCisJeyBFWFQyX0NPTVBSX0ZMLCAgICAgICAgJ2MnIH0sCisJeyBFWFQyX05PRFVNUF9GTCwgICAgICAgJ2QnIH0sCisJeyBFWFQyX0lNTVVUQUJMRV9GTCwgICAgJ2knIH0sCisJeyBFWFQzX0pPVVJOQUxfREFUQV9GTCwgJ2onIH0sCisJeyBFWFQyX1NFQ1JNX0ZMLCAgICAgICAgJ3MnIH0sCisJeyBFWFQyX1VOUk1fRkwsICAgICAgICAgJ3UnIH0sCisJeyBFWFQyX05PVEFJTF9GTCwgICAgICAgJ3QnIH0sCisJeyBFWFQyX1RPUERJUl9GTCwgICAgICAgJ1QnIH0sCisJeyAwLCAwIH0KK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9mbGFnKGNoYXIgYykKK3sKKwljb25zdCBzdHJ1Y3QgZmxhZ3NfY2hhciAqZnA7CisJZm9yIChmcCA9IGZsYWdzX2FycmF5OyBmcC0+ZmxhZzsgZnArKykKKwkJaWYgKGZwLT5vcHRjaGFyID09IGMpCisJCQlyZXR1cm4gZnAtPmZsYWc7CisJYmJfc2hvd191c2FnZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hcmcoY2hhciAqYXJnKQoreworCXVuc2lnbmVkIGxvbmcgKmZsOworCWNoYXIgb3B0ID0gKmFyZysrOworCisJaWYgKG9wdCA9PSAnLScpIHsKKwkJZmxhZ3MgfD0gT1BUX1JFTTsKKwkJZmwgPSAmcmY7CisJfSBlbHNlIGlmIChvcHQgPT0gJysnKSB7CisJCWZsYWdzIHw9IE9QVF9BREQ7CisJCWZsID0gJmFmOworCX0gZWxzZSBpZiAob3B0ID09ICc9JykgeworCQlmbGFncyB8PSBPUFRfU0VUOworCQlmbCA9ICZzZjsKKwl9IGVsc2UKKwkJcmV0dXJuIEVPRjsKKworCWZvciAoOyAqYXJnOyArK2FyZykKKwkJKCpmbCkgfD0gZ2V0X2ZsYWcoKmFyZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGF0dHJfZGlyX3Byb2MoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGlyZW50ICosIHZvaWQgKik7CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9hdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiBuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZnNmbGFnczsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChsc3RhdChuYW1lLCAmc3QpID09IC0xKSB7CisJCWJiX2Vycm9yX21zZygic3RhdCAlcyBmYWlsZWQiLCBuYW1lKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSAmJiByZWN1cnNpdmUpCisJCXJldHVybjsKKworCS8qIERvbid0IHRyeSB0byBvcGVuIGRldmljZSBmaWxlcywgZmlmb3MgZXRjLiAgV2UgcHJvYmFibHkKKwkgKiBvdWdodCB0byBkaXNwbGF5IGFuIGVycm9yIGlmIHRoZSBmaWxlIHdhcyBleHBsaWNpdGx5IGdpdmVuCisJICogb24gdGhlIGNvbW1hbmQgbGluZSAod2hldGhlciBvciBub3QgcmVjdXJzaXZlIHdhcworCSAqIHJlcXVlc3RlZCkuICAqLworCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSAmJiAhU19JU0xOSyhzdC5zdF9tb2RlKSAmJiAhU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJcmV0dXJuOworCisJaWYgKGZsYWdzICYgT1BUX1NFVF9WRVIpCisJCWlmIChmc2V0dmVyc2lvbihuYW1lLCB2ZXJzaW9uKSA9PSAtMSkKKwkJCWJiX2Vycm9yX21zZygic2V0dGluZyB2ZXJzaW9uIG9uICVzIiwgbmFtZSk7CisKKwlpZiAoZmxhZ3MgJiBPUFRfU0VUKSB7CisJCWZzZmxhZ3MgPSBzZjsKKwl9IGVsc2UgeworCQlpZiAoZmdldGZsYWdzKG5hbWUsICZmc2ZsYWdzKSA9PSAtMSkgeworCQkJYmJfZXJyb3JfbXNnKCJyZWFkaW5nIGZsYWdzIG9uICVzIiwgbmFtZSk7CisJCQlnb3RvIHNraXBfc2V0ZmxhZ3M7CisJCX0KKwkJaWYgKGZsYWdzICYgT1BUX1JFTSkKKwkJCWZzZmxhZ3MgJj0gfnJmOworCQlpZiAoZmxhZ3MgJiBPUFRfQUREKQorCQkJZnNmbGFncyB8PSBhZjsKKwkJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJZnNmbGFncyAmPSB+RVhUMl9ESVJTWU5DX0ZMOworCX0KKwlpZiAoZnNldGZsYWdzKG5hbWUsIGZzZmxhZ3MpID09IC0xKQorCQliYl9lcnJvcl9tc2coInNldHRpbmcgZmxhZ3Mgb24gJXMiLCBuYW1lKTsKKworc2tpcF9zZXRmbGFnczoKKwlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSAmJiByZWN1cnNpdmUpCisJCWl0ZXJhdGVfb25fZGlyKG5hbWUsIGNoYXR0cl9kaXJfcHJvYywgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgY2hhdHRyX2Rpcl9wcm9jKGNvbnN0IGNoYXIgKmRpcl9uYW1lLCBzdHJ1Y3QgZGlyZW50ICpkZSwKKwkJCSAgIHZvaWQgKnByaXZhdGUgRVhUMkZTX0FUVFIoKHVudXNlZCkpKQoreworCS8qaWYgKHN0cmNtcChkZS0+ZF9uYW1lLCAiLiIpIHx8IHN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSkgeyovCisJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nCisJICYmICghZGUtPmRfbmFtZVsxXSB8fCAoZGUtPmRfbmFtZVsxXSA9PSAnLicgJiYgIWRlLT5kX25hbWVbMl0pKQorCSkgeworCQljaGFyICpwYXRoID0gY29uY2F0X3N1YnBhdGhfZmlsZShkaXJfbmFtZSwgZGUtPmRfbmFtZSk7CisJCWlmIChwYXRoKSB7CisJCQljaGFuZ2VfYXR0cmlidXRlcyhwYXRoKTsKKwkJCWZyZWUocGF0aCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGF0dHJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNoYXR0cl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwljaGFyICphcmc7CisKKwkvKiBwYXJzZSB0aGUgYXJncyAqLworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKwkJYXJnID0gYXJndltpXTsKKworCQkvKiB0YWtlIGNhcmUgb2YgLVIgYW5kIC12IDx2ZXJzaW9uPiAqLworCQlpZiAoYXJnWzBdID09ICctJykgeworCQkJaWYgKGFyZ1sxXSA9PSAnUicgJiYgYXJnWzJdID09ICdcMCcpIHsKKwkJCQlyZWN1cnNpdmUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChhcmdbMV0gPT0gJ3YnICYmIGFyZ1syXSA9PSAnXDAnKSB7CisJCQkJY2hhciAqdG1wOworCQkJCSsraTsKKwkJCQlpZiAoaSA+PSBhcmdjKQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJdmVyc2lvbiA9IHN0cnRvbChhcmd2W2ldLCAmdG1wLCAwKTsKKwkJCQlpZiAoKnRtcCkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCB2ZXJzaW9uICclcyciLCBhcmcpOworCQkJCWZsYWdzIHw9IE9QVF9TRVRfVkVSOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKGRlY29kZV9hcmcoYXJnKSA9PSBFT0YpCisJCQlicmVhazsKKwl9CisKKwkvKiBydW4gc2FuaXR5IGNoZWNrcyBvbiBhbGwgdGhlIGFyZ3VtZW50cyBnaXZlbiB1cyAqLworCWlmIChpID49IGFyZ2MpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAoKGZsYWdzICYgT1BUX1NFVCkgJiYgKChmbGFncyAmIE9QVF9BREQpIHx8IChmbGFncyAmIE9QVF9SRU0pKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIj0gaXMgaW5jb21wYXRpYmxlIHdpdGggLSBhbmQgKyIpOworCWlmICgocmYgJiBhZikgIT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkNhbid0IHNldCBhbmQgdW5zZXQgYSBmbGFnIik7CisJaWYgKCFmbGFncykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIk11c3QgdXNlICctdicsID0sIC0gb3IgKyIpOworCisJLyogbm93IHJ1biBjaGF0dHIgb24gYWxsIHRoZSBmaWxlcyBwYXNzZWQgdG8gdXMgKi8KKwl3aGlsZSAoaSA8IGFyZ2MpCisJCWNoYW5nZV9hdHRyaWJ1dGVzKGFyZ3ZbaSsrXSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJmc2JiLmggYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMmZzYmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzFjMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJmc2JiLmgKQEAgLTAsMCArMSw0MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogRmlsZTogZTJmc2JiLmgKKyAqCisgKiBSZWRlZmluZSBhIGJ1bmNoIG9mIGUyZnNwcm9ncyBzdHVmZiB0byB1c2UgYnVzeWJveCByb3V0aW5lcworICogaW5zdGVhZC4gIFRoaXMgbWFrZXMgdXBncmFkZSBiZXR3ZWVuIGUyZnNwcm9ncyB2ZXJzaW9ucyBlYXN5LgorICovCisKKyNpZm5kZWYgRTJGU0JCX0gKKyNkZWZpbmUgRTJGU0JCX0ggMQorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogdmVyc2lvbiB3ZSd2ZSBsYXN0IHN5bmNlZCBhZ2FpbnN0ICovCisjZGVmaW5lIEUyRlNQUk9HU19WRVJTSU9OICIxLjM4IgorI2RlZmluZSBFMkZTUFJPR1NfREFURSAiMzAtSnVuLTIwMDUiCisKK3R5cGVkZWYgbG9uZyBlcnJjb2RlX3Q7CisjZGVmaW5lIEVSUkNPREVfUkFOR0UgOAorI2RlZmluZSBlcnJvcl9tZXNzYWdlKGNvZGUpIHN0cmVycm9yKChpbnQpIChjb2RlICYgKCgxPDxFUlJDT0RFX1JBTkdFKS0xKSkpCisKKy8qIGhlYWRlciBkZWZpbmVzICovCisjZGVmaW5lIEVOQUJMRV9IVFJFRSAxCisjZGVmaW5lIEhBVkVfRVJSTk9fSCAxCisjZGVmaW5lIEhBVkVfRVhUMl9JT0NUTFMgMQorI2RlZmluZSBIQVZFX0xJTlVYX0ZEX0ggMQorI2RlZmluZSBIQVZFX01OVEVOVF9IIDEKKyNkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQorI2RlZmluZSBIQVZFX05FVF9JRl9IIDEKKyNkZWZpbmUgSEFWRV9TWVNfSU9DVExfSCAxCisjZGVmaW5lIEhBVkVfU1lTX01PVU5UX0ggMQorI2RlZmluZSBIQVZFX1NZU19RVUVVRV9IIDEKKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBFbmRpYW5uZXNzICovCisjaWYgQkJfQklHX0VORElBTgorI2RlZmluZSBFTkFCTEVfU1dBUEZTIDEKKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UyZnNjay5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJmc2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmZmE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UyZnNjay5jCkBAIC0wLDAgKzEsMTM1MjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGUyZnNjaworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEdhcnJldHQgS2FqbW93aWN6CisgKgorICogRGljdGlvbmFyeSBBYnN0cmFjdCBEYXRhIFR5cGUKKyAqIENvcHlyaWdodCAoQykgMTk5NyBLYXogS3lsaGVrdSA8a2F6QGFzaGkuZm9vdHByaW50cy5uZXQ+CisgKiBGcmVlIFNvZnR3YXJlIExpY2Vuc2U6CisgKiBBbGwgcmlnaHRzIGFyZSByZXNlcnZlZCBieSB0aGUgYXV0aG9yLCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBmcmVlbHkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsCisgKiBwb3NzaWJseSBpbiBleGNoYW5nZSBmb3IgYSBmZWUsIHByb3ZpZGVkIHRoYXQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMKKyAqIGludGFjdC4gUGVybWlzc2lvbiBpcyBhbHNvIGdyYW50ZWQgdG8gYWRhcHQgdGhpcyBzb2Z0d2FyZSB0byBwcm9kdWNlCisgKiBkZXJpdmF0aXZlIHdvcmtzLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9ucyBjYXJyeSB0aGlzIGNvcHlyaWdodAorICogbm90aWNlIGFuZCBhZGRpdGlvbmFsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoZSB3b3JrIGhhcyBiZWVuIG1vZGlmaWVkLgorICogVGhpcyBzb3VyY2UgY29kZSBtYXkgYmUgdHJhbnNsYXRlZCBpbnRvIGV4ZWN1dGFibGUgZm9ybSBhbmQgaW5jb3Jwb3JhdGVkCisgKiBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlOyB0aGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3Igc3VjaCBzb2Z0d2FyZSB0bworICogY29udGFpbiBhIGNvcHlyaWdodCBub3RpY2UgcmVsYXRlZCB0byB0aGlzIHNvdXJjZS4KKyAqCisgKiBsaW51eC9mcy9yZWNvdmVyeSAgYW5kIGxpbnV4L2ZzL3Jldm9rZQorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OQorICoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDAgUmVkIEhhdCBTb2Z0d2FyZSAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIEpvdXJuYWwgcmVjb3Zlcnkgcm91dGluZXMgZm9yIHRoZSBnZW5lcmljIGZpbGVzeXN0ZW0gam91cm5hbGluZyBjb2RlOworICogcGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKy8vdXNhZ2U6I2RlZmluZSBlMmZzY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstcGFueXJjZGZ2c3RERlNWXSBbLWIgc3VwZXJibG9ja10gWy1CIGJsb2Nrc2l6ZV0gIgorLy91c2FnZTogICAgICAgIlstSSBpbm9kZV9idWZmZXJfYmxvY2tzXSBbLVAgcHJvY2Vzc19pbm9kZV9zaXplXSAiCisvL3VzYWdlOiAgICAgICAiWy1sfC1MIGJhZF9ibG9ja3NfZmlsZV0gWy1DIGZkXSBbLWogZXh0ZXJuYWxfam91cm5hbF0gIgorLy91c2FnZTogICAgICAgIlstRSBleHRlbmRlZC1vcHRpb25zXSBkZXZpY2UiCisvL3VzYWdlOiNkZWZpbmUgZTJmc2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hlY2sgZXh0Mi9leHQzIGZpbGUgc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS1wCQlBdXRvbWF0aWMgcmVwYWlyIChubyBxdWVzdGlvbnMpIgorLy91c2FnZTogICAgICJcbgktbgkJTWFrZSBubyBjaGFuZ2VzIHRvIHRoZSBmaWxlc3lzdGVtIgorLy91c2FnZTogICAgICJcbgkteQkJQXNzdW1lICd5ZXMnIHRvIGFsbCBxdWVzdGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1jCQlDaGVjayBmb3IgYmFkIGJsb2NrcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhZGJsb2NrIGxpc3QiCisvL3VzYWdlOiAgICAgIlxuCS1mCQlGb3JjZSBjaGVja2luZyBldmVuIGlmIGZpbGVzeXN0ZW0gaXMgbWFya2VkIGNsZWFuIgorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgc3VwZXJibG9jawlVc2UgYWx0ZXJuYXRpdmUgc3VwZXJibG9jayIKKy8vdXNhZ2U6ICAgICAiXG4JLUIgYmxvY2tzaXplCUZvcmNlIGJsb2Nrc2l6ZSB3aGVuIGxvb2tpbmcgZm9yIHN1cGVyYmxvY2siCisvL3VzYWdlOiAgICAgIlxuCS1qIGpvdXJuYWwJU2V0IGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBqb3VybmFsIgorLy91c2FnZTogICAgICJcbgktbCBmaWxlCQlBZGQgdG8gYmFkYmxvY2tzIGxpc3QiCisvL3VzYWdlOiAgICAgIlxuCS1MIGZpbGUJCVNldCBiYWRibG9ja3MgbGlzdCIKKyovCisKKyNpbmNsdWRlICJlMmZzY2suaCIJLypQdXQgYWxsIG9mIG91ciBkZWZpbmVzIGhlcmUgdG8gY2xlYW4gdGhpbmdzIHVwKi8KKworI2RlZmluZSBfKHgpIHgKKyNkZWZpbmUgTl8oeCkgeAorCisvKgorICogUHJvY2VkdXJlIGRlY2xhcmF0aW9ucworICovCisKK3N0YXRpYyB2b2lkIGUyZnNja19wYXNzMV9kdXBibG9ja3MoZTJmc2NrX3QgY3R4LCBjaGFyICpibG9ja19idWYpOworCisvKiBwYXNzMS5jICovCitzdGF0aWMgdm9pZCBlMmZzY2tfdXNlX2lub2RlX3Nob3J0Y3V0cyhlMmZzY2tfdCBjdHgsIGludCBib29sKTsKKworLyogcGFzczIuYyAqLworc3RhdGljIGludCBlMmZzY2tfcHJvY2Vzc19iYWRfaW5vZGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGRpciwKKwkJCQkgICAgZXh0Ml9pbm9fdCBpbm8sIGNoYXIgKmJ1Zik7CisKKy8qIHBhc3MzLmMgKi8KK3N0YXRpYyBpbnQgZTJmc2NrX3JlY29ubmVjdF9maWxlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm9kZSk7CitzdGF0aWMgZXJyY29kZV90IGUyZnNja19leHBhbmRfZGlyZWN0b3J5KGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBkaXIsCisJCQkJCSBpbnQgbnVtLCBpbnQgZ2F1cmFudGVlZF9zaXplKTsKK3N0YXRpYyBleHQyX2lub190IGUyZnNja19nZXRfbG9zdF9hbmRfZm91bmQoZTJmc2NrX3QgY3R4LCBpbnQgZml4KTsKK3N0YXRpYyBlcnJjb2RlX3QgZTJmc2NrX2FkanVzdF9pbm9kZV9jb3VudChlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vLAorCQkJCQkgICBpbnQgYWRqKTsKKworLyogcmVoYXNoLmMgKi8KK3N0YXRpYyB2b2lkIGUyZnNja19yZWhhc2hfZGlyZWN0b3JpZXMoZTJmc2NrX3QgY3R4KTsKKworLyogdXRpbC5jICovCitzdGF0aWMgdm9pZCAqZTJmc2NrX2FsbG9jYXRlX21lbW9yeShlMmZzY2tfdCBjdHgsIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbik7CitzdGF0aWMgaW50IGFzayhlMmZzY2tfdCBjdHgsIGNvbnN0IGNoYXIgKiBzdHJpbmcsIGludCBkZWYpOworc3RhdGljIHZvaWQgZTJmc2NrX3JlYWRfYml0bWFwcyhlMmZzY2tfdCBjdHgpOworc3RhdGljIHZvaWQgcHJlZW5oYWx0KGUyZnNja190IGN0eCk7CitzdGF0aWMgdm9pZCBlMmZzY2tfcmVhZF9pbm9kZShlMmZzY2tfdCBjdHgsIHVuc2lnbmVkIGxvbmcgaW5vLAorCQkJICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqIHByb2MpOworc3RhdGljIHZvaWQgZTJmc2NrX3dyaXRlX2lub2RlKGUyZnNja190IGN0eCwgdW5zaWduZWQgbG9uZyBpbm8sCisJCQkgICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqIHByb2MpOworc3RhdGljIGJsa190IGdldF9iYWNrdXBfc2IoZTJmc2NrX3QgY3R4LCBleHQyX2ZpbHN5cyBmcywKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGlvX21hbmFnZXIgbWFuYWdlcik7CisKKy8qIHVuaXguYyAqLworc3RhdGljIHZvaWQgZTJmc2NrX2NsZWFyX3Byb2diYXIoZTJmc2NrX3QgY3R4KTsKK3N0YXRpYyBpbnQgZTJmc2NrX3NpbXBsZV9wcm9ncmVzcyhlMmZzY2tfdCBjdHgsIGNvbnN0IGNoYXIgKmxhYmVsLAorCQkJCSAgZmxvYXQgcGVyY2VudCwgdW5zaWduZWQgaW50IGRweW51bSk7CisKKworLyoKKyAqIHByb2JsZW0uaCAtLS0gZTJmc2NrIHByb2JsZW0gZXJyb3IgY29kZXMKKyAqLworCit0eXBlZGVmIF9fdTMyIHByb2JsZW1fdDsKKworc3RydWN0IHByb2JsZW1fY29udGV4dCB7CisJZXJyY29kZV90ICAgICAgIGVycmNvZGU7CisJZXh0Ml9pbm9fdCAgICAgIGlubywgaW5vMiwgZGlyOworCXN0cnVjdCBleHQyX2lub2RlICppbm9kZTsKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudDsKKwlibGtfdCAgICAgICAgICAgYmxrLCBibGsyOworCWUyX2Jsa2NudF90ICAgICBibGtjb3VudDsKKwlpbnQgICAgICAgICAgICAgZ3JvdXA7CisJX191NjQgICAgICAgICAgIG51bTsKKwljb25zdCBjaGFyICAgICAgKnN0cjsKK307CisKKworLyoKKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgaW50IGZpeF9wcm9ibGVtKGUyZnNja190IGN0eCwgcHJvYmxlbV90IGNvZGUsIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpOworc3RhdGljIGludCBlbmRfcHJvYmxlbV9sYXRjaChlMmZzY2tfdCBjdHgsIGludCBtYXNrKTsKK3N0YXRpYyBpbnQgc2V0X2xhdGNoX2ZsYWdzKGludCBtYXNrLCBpbnQgc2V0ZmxhZ3MsIGludCBjbGVhcmZsYWdzKTsKK3N0YXRpYyB2b2lkIGNsZWFyX3Byb2JsZW1fY29udGV4dChzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpjdHgpOworCisvKgorICogRGljdGlvbmFyeSBBYnN0cmFjdCBEYXRhIFR5cGUKKyAqIENvcHlyaWdodCAoQykgMTk5NyBLYXogS3lsaGVrdSA8a2F6QGFzaGkuZm9vdHByaW50cy5uZXQ+CisgKgorICogZGljdC5oIHYgMS4yMi4yLjYgMjAwMC8xMS8xMyAwMTozNjo0NCBrYXoKKyAqIGthemxpYl8xXzIwCisgKi8KKworI2lmbmRlZiBESUNUX0gKKyNkZWZpbmUgRElDVF9ICisKKy8qCisgKiBCbHVyYiBmb3IgaW5jbHVzaW9uIGludG8gQysrIHRyYW5zbGF0aW9uIHVuaXRzCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRpY3Rjb3VudF90OworI2RlZmluZSBESUNUQ09VTlRfVF9NQVggVUxPTkdfTUFYCisKKy8qCisgKiBUaGUgZGljdGlvbmFyeSBpcyBpbXBsZW1lbnRlZCBhcyBhIHJlZC1ibGFjayB0cmVlCisgKi8KKwordHlwZWRlZiBlbnVtIHsgZG5vZGVfcmVkLCBkbm9kZV9ibGFjayB9IGRub2RlX2NvbG9yX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRub2RlX3QgeworCXN0cnVjdCBkbm9kZV90ICpkaWN0X2xlZnQ7CisJc3RydWN0IGRub2RlX3QgKmRpY3RfcmlnaHQ7CisJc3RydWN0IGRub2RlX3QgKmRpY3RfcGFyZW50OworCWRub2RlX2NvbG9yX3QgZGljdF9jb2xvcjsKKwljb25zdCB2b2lkICpkaWN0X2tleTsKKwl2b2lkICpkaWN0X2RhdGE7Cit9IGRub2RlX3Q7CisKK3R5cGVkZWYgaW50ICgqZGljdF9jb21wX3QpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKK3R5cGVkZWYgdm9pZCAoKmRub2RlX2ZyZWVfdCkoZG5vZGVfdCAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgZGljdF90IHsKKwlkbm9kZV90IGRpY3Rfbmlsbm9kZTsKKwlkaWN0Y291bnRfdCBkaWN0X25vZGVjb3VudDsKKwlkaWN0Y291bnRfdCBkaWN0X21heGNvdW50OworCWRpY3RfY29tcF90IGRpY3RfY29tcGFyZTsKKwlkbm9kZV9mcmVlX3QgZGljdF9mcmVlbm9kZTsKKwlpbnQgZGljdF9kdXBlczsKK30gZGljdF90OworCit0eXBlZGVmIHZvaWQgKCpkbm9kZV9wcm9jZXNzX3QpKGRpY3RfdCAqLCBkbm9kZV90ICosIHZvaWQgKik7CisKK3R5cGVkZWYgc3RydWN0IGRpY3RfbG9hZF90IHsKKwlkaWN0X3QgKmRpY3RfZGljdHB0cjsKKwlkbm9kZV90IGRpY3Rfbmlsbm9kZTsKK30gZGljdF9sb2FkX3Q7CisKKyNkZWZpbmUgZGljdF9jb3VudChEKSAoKEQpLT5kaWN0X25vZGVjb3VudCkKKyNkZWZpbmUgZG5vZGVfZ2V0KE4pICgoTiktPmRpY3RfZGF0YSkKKyNkZWZpbmUgZG5vZGVfZ2V0a2V5KE4pICgoTiktPmRpY3Rfa2V5KQorCisjZW5kaWYKKworLyoKKyAqIENvbXBhdGliaWxpdHkgaGVhZGVyIGZpbGUgZm9yIGUyZnNjayB3aGljaCBzaG91bGQgYmUgaW5jbHVkZWQKKyAqIGluc3RlYWQgb2YgbGludXgvamZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3RlcGhlbiBDLiBUd2VlZGllCisgKi8KKworLyoKKyAqIFB1bGwgaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIGUyZnNjayBjb250ZXh0IHN0cnVjdHVyZQorICovCisKK3N0cnVjdCBidWZmZXJfaGVhZCB7CisJY2hhciAgICAgICAgICAgIGJfZGF0YVs4MTkyXTsKKwllMmZzY2tfdCAgICAgICAgYl9jdHg7CisJaW9fY2hhbm5lbCAgICAgIGJfaW87CisJaW50ICAgICAgICAgICAgIGJfc2l6ZTsKKwlibGtfdCAgICAgICAgICAgYl9ibG9ja25yOworCWludCAgICAgICAgICAgICBiX2RpcnR5OworCWludCAgICAgICAgICAgICBiX3VwdG9kYXRlOworCWludCAgICAgICAgICAgICBiX2VycjsKK307CisKKworI2RlZmluZSBLX0RFVl9GUyAgICAgICAgMQorI2RlZmluZSBLX0RFVl9KT1VSTkFMICAgMgorCisjZGVmaW5lIGxvY2tfYnVmZmVyKGJoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgdW5sb2NrX2J1ZmZlcihiaCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGJ1ZmZlcl9yZXEoYmgpIDEKKyNkZWZpbmUgZG9fcmVhZGFoZWFkKGpvdXJuYWwsIHN0YXJ0KSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGUyZnNja190IGUyZnNja19nbG9iYWxfY3R4OyAgLyogVHJ5IHlvdXIgdmVyeSBiZXN0IG5vdCB0byB1c2UgdGhpcyEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCAgICAgb2JqZWN0X2xlbmd0aDsKK30ga21lbV9jYWNoZV90OworCisjZGVmaW5lIGttZW1fY2FjaGVfYWxsb2MoY2FjaGUsZmxhZ3MpIG1hbGxvYygoY2FjaGUpLT5vYmplY3RfbGVuZ3RoKQorCisvKgorICogV2UgdXNlIHRoZSBzdGFuZGFyZCBsaWJleHQyZnMgcG9ydGFiaWxpdHkgdHJpY2tzIGZvciBpbmxpbmUKKyAqIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMga21lbV9jYWNoZV90ICogZG9fY2FjaGVfY3JlYXRlKGludCBsZW4pCit7CisJa21lbV9jYWNoZV90ICpuZXdfY2FjaGU7CisKKwluZXdfY2FjaGUgPSB4bWFsbG9jKHNpemVvZigqbmV3X2NhY2hlKSk7CisJbmV3X2NhY2hlLT5vYmplY3RfbGVuZ3RoID0gbGVuOworCXJldHVybiBuZXdfY2FjaGU7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NhY2hlX2Rlc3Ryb3koa21lbV9jYWNoZV90ICpjYWNoZSkKK3sKKwlmcmVlKGNhY2hlKTsKK30KKworCisvKgorICogRGljdGlvbmFyeSBBYnN0cmFjdCBEYXRhIFR5cGUKKyAqLworCisKKy8qCisgKiBUaGVzZSBtYWNyb3MgcHJvdmlkZSBzaG9ydCBjb252ZW5pZW50IG5hbWVzIGZvciBzdHJ1Y3R1cmUgbWVtYmVycywKKyAqIHdoaWNoIGFyZSBlbWJlbGxpc2hlZCB3aXRoIGRpY3RfIHByZWZpeGVzIHNvIHRoYXQgdGhleSBhcmUKKyAqIHByb3Blcmx5IGNvbmZpbmVkIHRvIHRoZSBkb2N1bWVudGVkIG5hbWVzcGFjZS4gSXQncyBsZWdhbCBmb3IgYQorICogcHJvZ3JhbSB3aGljaCB1c2VzIGRpY3QgdG8gZGVmaW5lLCBmb3IgaW5zdGFuY2UsIGEgbWFjcm8gY2FsbGVkIGBgcGFyZW50JycuCisgKiBTdWNoIGEgbWFjcm8gd291bGQgaW50ZXJmZXJlIHdpdGggdGhlIGRub2RlX3Qgc3RydWN0IGRlZmluaXRpb24uCisgKiBJbiBnZW5lcmFsLCBoaWdobHkgcG9ydGFibGUgYW5kIHJldXNhYmxlIEMgbW9kdWxlcyB3aGljaCBleHBvc2UgdGhlaXIKKyAqIHN0cnVjdHVyZXMgbmVlZCB0byBjb25maW5lIHN0cnVjdHVyZSBtZW1iZXIgbmFtZXMgdG8gd2VsbC1kZWZpbmVkIHNwYWNlcy4KKyAqIFRoZSByZXN1bHRpbmcgaWRlbnRpZmllcnMgYXJlbid0IG5lY2Vzc2FyaWx5IGNvbnZlbmllbnQgdG8gdXNlLCBub3IKKyAqIHJlYWRhYmxlLCBpbiB0aGUgaW1wbGVtZW50YXRpb24sIGhvd2V2ZXIhCisgKi8KKworI2RlZmluZSBsZWZ0IGRpY3RfbGVmdAorI2RlZmluZSByaWdodCBkaWN0X3JpZ2h0CisjZGVmaW5lIHBhcmVudCBkaWN0X3BhcmVudAorI2RlZmluZSBjb2xvciBkaWN0X2NvbG9yCisjZGVmaW5lIGtleSBkaWN0X2tleQorI2RlZmluZSBkYXRhIGRpY3RfZGF0YQorCisjZGVmaW5lIG5pbG5vZGUgZGljdF9uaWxub2RlCisjZGVmaW5lIG1heGNvdW50IGRpY3RfbWF4Y291bnQKKyNkZWZpbmUgY29tcGFyZSBkaWN0X2NvbXBhcmUKKyNkZWZpbmUgZHVwZXMgZGljdF9kdXBlcworCisjZGVmaW5lIGRpY3Rfcm9vdChEKSAoKEQpLT5uaWxub2RlLmxlZnQpCisjZGVmaW5lIGRpY3RfbmlsKEQpICgmKEQpLT5uaWxub2RlKQorCitzdGF0aWMgdm9pZCBkbm9kZV9mcmVlKGRub2RlX3QgKm5vZGUpOworCisvKgorICogUGVyZm9ybSBhIGBgbGVmdCByb3RhdGlvbicnIGFkanVzdG1lbnQgb24gdGhlIHRyZWUuICBUaGUgZ2l2ZW4gbm9kZSBQIGFuZAorICogaXRzIHJpZ2h0IGNoaWxkIEMgYXJlIHJlYXJyYW5nZWQgc28gdGhhdCB0aGUgUCBpbnN0ZWFkIGJlY29tZXMgdGhlIGxlZnQKKyAqIGNoaWxkIG9mIEMuICAgVGhlIGxlZnQgc3VidHJlZSBvZiBDIGlzIGluaGVyaXRlZCBhcyB0aGUgbmV3IHJpZ2h0IHN1YnRyZWUKKyAqIGZvciBQLiAgVGhlIG9yZGVyaW5nIG9mIHRoZSBrZXlzIHdpdGhpbiB0aGUgdHJlZSBpcyB0aHVzIHByZXNlcnZlZC4KKyAqLworCitzdGF0aWMgdm9pZCByb3RhdGVfbGVmdChkbm9kZV90ICp1cHBlcikKK3sKKwlkbm9kZV90ICpsb3dlciwgKmxvd2xlZnQsICp1cHBhcmVudDsKKworCWxvd2VyID0gdXBwZXItPnJpZ2h0OworCXVwcGVyLT5yaWdodCA9IGxvd2xlZnQgPSBsb3dlci0+bGVmdDsKKwlsb3dsZWZ0LT5wYXJlbnQgPSB1cHBlcjsKKworCWxvd2VyLT5wYXJlbnQgPSB1cHBhcmVudCA9IHVwcGVyLT5wYXJlbnQ7CisKKwkvKiBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciByb290IG5vZGUgaGVyZSBiZWNhdXNlIHJvb3QtPnBhcmVudCBpcworCSAgIHRoZSBzZW50aW5lbCBuaWwgbm9kZSwgYW5kIHJvb3QtPnBhcmVudC0+bGVmdCBwb2ludHMgYmFjayB0byByb290ICovCisKKwlpZiAodXBwZXIgPT0gdXBwYXJlbnQtPmxlZnQpIHsKKwkJdXBwYXJlbnQtPmxlZnQgPSBsb3dlcjsKKwl9IGVsc2UgeworCQlhc3NlcnQgKHVwcGVyID09IHVwcGFyZW50LT5yaWdodCk7CisJCXVwcGFyZW50LT5yaWdodCA9IGxvd2VyOworCX0KKworCWxvd2VyLT5sZWZ0ID0gdXBwZXI7CisJdXBwZXItPnBhcmVudCA9IGxvd2VyOworfQorCisvKgorICogVGhpcyBvcGVyYXRpb24gaXMgdGhlIGBgbWlycm9yJycgaW1hZ2Ugb2Ygcm90YXRlX2xlZnQuIEl0IGlzCisgKiB0aGUgc2FtZSBwcm9jZWR1cmUsIGJ1dCB3aXRoIGxlZnQgYW5kIHJpZ2h0IGludGVyY2hhbmdlZC4KKyAqLworCitzdGF0aWMgdm9pZCByb3RhdGVfcmlnaHQoZG5vZGVfdCAqdXBwZXIpCit7CisJZG5vZGVfdCAqbG93ZXIsICpsb3dyaWdodCwgKnVwcGFyZW50OworCisJbG93ZXIgPSB1cHBlci0+bGVmdDsKKwl1cHBlci0+bGVmdCA9IGxvd3JpZ2h0ID0gbG93ZXItPnJpZ2h0OworCWxvd3JpZ2h0LT5wYXJlbnQgPSB1cHBlcjsKKworCWxvd2VyLT5wYXJlbnQgPSB1cHBhcmVudCA9IHVwcGVyLT5wYXJlbnQ7CisKKwlpZiAodXBwZXIgPT0gdXBwYXJlbnQtPnJpZ2h0KSB7CisJCXVwcGFyZW50LT5yaWdodCA9IGxvd2VyOworCX0gZWxzZSB7CisJCWFzc2VydCAodXBwZXIgPT0gdXBwYXJlbnQtPmxlZnQpOworCQl1cHBhcmVudC0+bGVmdCA9IGxvd2VyOworCX0KKworCWxvd2VyLT5yaWdodCA9IHVwcGVyOworCXVwcGVyLT5wYXJlbnQgPSBsb3dlcjsKK30KKworLyoKKyAqIERvIGEgcG9zdG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZSByb290ZWQgYXQgdGhlIHNwZWNpZmllZAorICogbm9kZSBhbmQgZnJlZSBldmVyeXRoaW5nIHVuZGVyIGl0LiAgVXNlZCBieSBkaWN0X2ZyZWUoKS4KKyAqLworCitzdGF0aWMgdm9pZCBmcmVlX25vZGVzKGRpY3RfdCAqZGljdCwgZG5vZGVfdCAqbm9kZSwgZG5vZGVfdCAqbmlsKQoreworCWlmIChub2RlID09IG5pbCkKKwkJcmV0dXJuOworCWZyZWVfbm9kZXMoZGljdCwgbm9kZS0+bGVmdCwgbmlsKTsKKwlmcmVlX25vZGVzKGRpY3QsIG5vZGUtPnJpZ2h0LCBuaWwpOworCWRpY3QtPmRpY3RfZnJlZW5vZGUobm9kZSk7Cit9CisKKy8qCisgKiBWZXJpZnkgdGhhdCB0aGUgdHJlZSBjb250YWlucyB0aGUgZ2l2ZW4gbm9kZS4gVGhpcyBpcyBkb25lIGJ5CisgKiB0cmF2ZXJzaW5nIGFsbCBvZiB0aGUgbm9kZXMgYW5kIGNvbXBhcmluZyB0aGVpciBwb2ludGVycyB0byB0aGUKKyAqIGdpdmVuIHBvaW50ZXIuIFJldHVybnMgMSBpZiB0aGUgbm9kZSBpcyBmb3VuZCwgb3RoZXJ3aXNlCisgKiByZXR1cm5zIHplcm8uIEl0IGlzIGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKi8KKworc3RhdGljIGludCB2ZXJpZnlfZGljdF9oYXNfbm9kZShkbm9kZV90ICpuaWwsIGRub2RlX3QgKnJvb3QsIGRub2RlX3QgKm5vZGUpCit7CisJaWYgKHJvb3QgIT0gbmlsKSB7CisJCXJldHVybiByb290ID09IG5vZGUKKwkJCXx8IHZlcmlmeV9kaWN0X2hhc19ub2RlKG5pbCwgcm9vdC0+bGVmdCwgbm9kZSkKKwkJCXx8IHZlcmlmeV9kaWN0X2hhc19ub2RlKG5pbCwgcm9vdC0+cmlnaHQsIG5vZGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU2VsZWN0IGEgZGlmZmVyZW50IHNldCBvZiBub2RlIGFsbG9jYXRvciByb3V0aW5lcy4KKyAqLworCitzdGF0aWMgdm9pZCBkaWN0X3NldF9hbGxvY2F0b3IoZGljdF90ICpkaWN0LCBkbm9kZV9mcmVlX3QgZnIpCit7CisJYXNzZXJ0KGRpY3RfY291bnQoZGljdCkgPT0gMCk7CisJZGljdC0+ZGljdF9mcmVlbm9kZSA9IGZyOworfQorCisvKgorICogRnJlZSBhbGwgdGhlIG5vZGVzIGluIHRoZSBkaWN0aW9uYXJ5IGJ5IHVzaW5nIHRoZSBkaWN0aW9uYXJ5J3MKKyAqIGluc3RhbGxlZCBmcmVlIHJvdXRpbmUuIFRoZSBkaWN0aW9uYXJ5IGlzIGVtcHRpZWQuCisgKi8KKworc3RhdGljIHZvaWQgZGljdF9mcmVlX25vZGVzKGRpY3RfdCAqZGljdCkKK3sKKwlkbm9kZV90ICpuaWwgPSBkaWN0X25pbChkaWN0KSwgKnJvb3QgPSBkaWN0X3Jvb3QoZGljdCk7CisJZnJlZV9ub2RlcyhkaWN0LCByb290LCBuaWwpOworCWRpY3QtPmRpY3Rfbm9kZWNvdW50ID0gMDsKKwlkaWN0LT5uaWxub2RlLmxlZnQgPSAmZGljdC0+bmlsbm9kZTsKKwlkaWN0LT5uaWxub2RlLnJpZ2h0ID0gJmRpY3QtPm5pbG5vZGU7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgdXNlci1zdXBwbGllZCBkaWN0aW9uYXJ5IG9iamVjdC4KKyAqLworCitzdGF0aWMgZGljdF90ICpkaWN0X2luaXQoZGljdF90ICpkaWN0LCBkaWN0Y291bnRfdCBtYXhjb3VudCwgZGljdF9jb21wX3QgY29tcCkKK3sKKwlkaWN0LT5jb21wYXJlID0gY29tcDsKKwlkaWN0LT5kaWN0X2ZyZWVub2RlID0gZG5vZGVfZnJlZTsKKwlkaWN0LT5kaWN0X25vZGVjb3VudCA9IDA7CisJZGljdC0+bWF4Y291bnQgPSBtYXhjb3VudDsKKwlkaWN0LT5uaWxub2RlLmxlZnQgPSAmZGljdC0+bmlsbm9kZTsKKwlkaWN0LT5uaWxub2RlLnJpZ2h0ID0gJmRpY3QtPm5pbG5vZGU7CisJZGljdC0+bmlsbm9kZS5wYXJlbnQgPSAmZGljdC0+bmlsbm9kZTsKKwlkaWN0LT5uaWxub2RlLmNvbG9yID0gZG5vZGVfYmxhY2s7CisJZGljdC0+ZHVwZXMgPSAwOworCXJldHVybiBkaWN0OworfQorCisvKgorICogTG9jYXRlIGEgbm9kZSBpbiB0aGUgZGljdGlvbmFyeSBoYXZpbmcgdGhlIGdpdmVuIGtleS4KKyAqIElmIHRoZSBub2RlIGlzIG5vdCBmb3VuZCwgYSBudWxsIGEgcG9pbnRlciBpcyByZXR1cm5lZCAocmF0aGVyIHRoYW4KKyAqIGEgcG9pbnRlciB0aGF0IGRpY3Rpb25hcnkncyBuaWwgc2VudGluZWwgbm9kZSksIG90aGVyd2lzZSBhIHBvaW50ZXIgdG8gdGhlCisgKiBsb2NhdGVkIG5vZGUgaXMgcmV0dXJuZWQuCisgKi8KKworc3RhdGljIGRub2RlX3QgKmRpY3RfbG9va3VwKGRpY3RfdCAqZGljdCwgY29uc3Qgdm9pZCAqa2V5KQoreworCWRub2RlX3QgKnJvb3QgPSBkaWN0X3Jvb3QoZGljdCk7CisJZG5vZGVfdCAqbmlsID0gZGljdF9uaWwoZGljdCk7CisJZG5vZGVfdCAqc2F2ZWQ7CisJaW50IHJlc3VsdDsKKworCS8qIHNpbXBsZSBiaW5hcnkgc2VhcmNoIGFkYXB0ZWQgZm9yIHRyZWVzIHRoYXQgY29udGFpbiBkdXBsaWNhdGUga2V5cyAqLworCisJd2hpbGUgKHJvb3QgIT0gbmlsKSB7CisJCXJlc3VsdCA9IGRpY3QtPmNvbXBhcmUoa2V5LCByb290LT5rZXkpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCXJvb3QgPSByb290LT5sZWZ0OworCQllbHNlIGlmIChyZXN1bHQgPiAwKQorCQkJcm9vdCA9IHJvb3QtPnJpZ2h0OworCQllbHNlIHsKKwkJCWlmICghZGljdC0+ZHVwZXMpIHsgLyogbm8gZHVwbGljYXRlcywgcmV0dXJuIG1hdGNoICAgICAgICAgICovCisJCQkJcmV0dXJuIHJvb3Q7CisJCQl9IGVsc2UgeyAgICAgICAgICAgIC8qIGNvdWxkIGJlIGR1cGVzLCBmaW5kIGxlZnRtb3N0IG9uZSAgICAqLworCQkJCWRvIHsKKwkJCQkJc2F2ZWQgPSByb290OworCQkJCQlyb290ID0gcm9vdC0+bGVmdDsKKwkJCQkJd2hpbGUgKHJvb3QgIT0gbmlsICYmIGRpY3QtPmNvbXBhcmUoa2V5LCByb290LT5rZXkpKQorCQkJCQkJcm9vdCA9IHJvb3QtPnJpZ2h0OworCQkJCX0gd2hpbGUgKHJvb3QgIT0gbmlsKTsKKwkJCQlyZXR1cm4gc2F2ZWQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEluc2VydCBhIG5vZGUgaW50byB0aGUgZGljdGlvbmFyeS4gVGhlIG5vZGUgc2hvdWxkIGhhdmUgYmVlbgorICogaW5pdGlhbGl6ZWQgd2l0aCBhIGRhdGEgZmllbGQuIEFsbCBvdGhlciBmaWVsZHMgYXJlIGlnbm9yZWQuCisgKiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHRoZSB1c2VyIGF0dGVtcHRzIHRvIGluc2VydCBpbnRvCisgKiBhIGRpY3Rpb25hcnkgdGhhdCBpcyBhbHJlYWR5IGZ1bGwgKGZvciB3aGljaCB0aGUgZGljdF9pc2Z1bGwoKQorICogZnVuY3Rpb24gcmV0dXJucyB0cnVlKS4KKyAqLworCitzdGF0aWMgdm9pZCBkaWN0X2luc2VydChkaWN0X3QgKmRpY3QsIGRub2RlX3QgKm5vZGUsIGNvbnN0IHZvaWQgKmtleSkKK3sKKwlkbm9kZV90ICp3aGVyZSA9IGRpY3Rfcm9vdChkaWN0KSwgKm5pbCA9IGRpY3RfbmlsKGRpY3QpOworCWRub2RlX3QgKnBhcmVudCA9IG5pbCwgKnVuY2xlLCAqZ3JhbmRwYTsKKwlpbnQgcmVzdWx0ID0gLTE7CisKKwlub2RlLT5rZXkgPSBrZXk7CisKKwkvKiBiYXNpYyBiaW5hcnkgdHJlZSBpbnNlcnQgKi8KKworCXdoaWxlICh3aGVyZSAhPSBuaWwpIHsKKwkJcGFyZW50ID0gd2hlcmU7CisJCXJlc3VsdCA9IGRpY3QtPmNvbXBhcmUoa2V5LCB3aGVyZS0+a2V5KTsKKwkJLyogdHJhcCBhdHRlbXB0cyBhdCBkdXBsaWNhdGUga2V5IGluc2VydGlvbiB1bmxlc3MgaXQncyBleHBsaWNpdGx5IGFsbG93ZWQgKi8KKwkJYXNzZXJ0KGRpY3QtPmR1cGVzIHx8IHJlc3VsdCAhPSAwKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQl3aGVyZSA9IHdoZXJlLT5sZWZ0OworCQllbHNlCisJCQl3aGVyZSA9IHdoZXJlLT5yaWdodDsKKwl9CisKKwlhc3NlcnQod2hlcmUgPT0gbmlsKTsKKworCWlmIChyZXN1bHQgPCAwKQorCQlwYXJlbnQtPmxlZnQgPSBub2RlOworCWVsc2UKKwkJcGFyZW50LT5yaWdodCA9IG5vZGU7CisKKwlub2RlLT5wYXJlbnQgPSBwYXJlbnQ7CisJbm9kZS0+bGVmdCA9IG5pbDsKKwlub2RlLT5yaWdodCA9IG5pbDsKKworCWRpY3QtPmRpY3Rfbm9kZWNvdW50Kys7CisKKwkvKiByZWQgYmxhY2sgYWRqdXN0bWVudHMgKi8KKworCW5vZGUtPmNvbG9yID0gZG5vZGVfcmVkOworCisJd2hpbGUgKHBhcmVudC0+Y29sb3IgPT0gZG5vZGVfcmVkKSB7CisJCWdyYW5kcGEgPSBwYXJlbnQtPnBhcmVudDsKKwkJaWYgKHBhcmVudCA9PSBncmFuZHBhLT5sZWZ0KSB7CisJCQl1bmNsZSA9IGdyYW5kcGEtPnJpZ2h0OworCQkJaWYgKHVuY2xlLT5jb2xvciA9PSBkbm9kZV9yZWQpIHsgICAgLyogcmVkIHBhcmVudCwgcmVkIHVuY2xlICovCisJCQkJcGFyZW50LT5jb2xvciA9IGRub2RlX2JsYWNrOworCQkJCXVuY2xlLT5jb2xvciA9IGRub2RlX2JsYWNrOworCQkJCWdyYW5kcGEtPmNvbG9yID0gZG5vZGVfcmVkOworCQkJCW5vZGUgPSBncmFuZHBhOworCQkJCXBhcmVudCA9IGdyYW5kcGEtPnBhcmVudDsKKwkJCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZCBwYXJlbnQsIGJsYWNrIHVuY2xlICovCisJCQkJaWYgKG5vZGUgPT0gcGFyZW50LT5yaWdodCkgeworCQkJCQlyb3RhdGVfbGVmdChwYXJlbnQpOworCQkJCQlwYXJlbnQgPSBub2RlOworCQkJCQlhc3NlcnQgKGdyYW5kcGEgPT0gcGFyZW50LT5wYXJlbnQpOworCQkJCQkvKiByb3RhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQgcHJlc2VydmVzIGdyYW5kcGEgKi8KKwkJCQl9CisJCQkJcGFyZW50LT5jb2xvciA9IGRub2RlX2JsYWNrOworCQkJCWdyYW5kcGEtPmNvbG9yID0gZG5vZGVfcmVkOworCQkJCXJvdGF0ZV9yaWdodChncmFuZHBhKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsgICAgICAgIC8qIHN5bW1ldHJpYyBjYXNlczogcGFyZW50ID09IHBhcmVudC0+cGFyZW50LT5yaWdodCAqLworCQkJdW5jbGUgPSBncmFuZHBhLT5sZWZ0OworCQkJaWYgKHVuY2xlLT5jb2xvciA9PSBkbm9kZV9yZWQpIHsKKwkJCQlwYXJlbnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJCQkJdW5jbGUtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJCQkJZ3JhbmRwYS0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJCQkJbm9kZSA9IGdyYW5kcGE7CisJCQkJcGFyZW50ID0gZ3JhbmRwYS0+cGFyZW50OworCQkJfSBlbHNlIHsKKwkJCQlpZiAobm9kZSA9PSBwYXJlbnQtPmxlZnQpIHsKKwkJCQkJcm90YXRlX3JpZ2h0KHBhcmVudCk7CisJCQkJCXBhcmVudCA9IG5vZGU7CisJCQkJCWFzc2VydCAoZ3JhbmRwYSA9PSBwYXJlbnQtPnBhcmVudCk7CisJCQkJfQorCQkJCXBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKwkJCQlncmFuZHBhLT5jb2xvciA9IGRub2RlX3JlZDsKKwkJCQlyb3RhdGVfbGVmdChncmFuZHBhKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWRpY3Rfcm9vdChkaWN0KS0+Y29sb3IgPSBkbm9kZV9ibGFjazsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbm9kZSB1c2luZyB0aGUgZGljdGlvbmFyeSdzIGFsbG9jYXRvciByb3V0aW5lLCBnaXZlIGl0CisgKiB0aGUgZGF0YSBpdGVtLgorICovCisKK3N0YXRpYyBkbm9kZV90ICpkbm9kZV9pbml0KGRub2RlX3QgKmRub2RlLCB2b2lkICpkYXRhKQoreworCWRub2RlLT5kYXRhID0gZGF0YTsKKwlkbm9kZS0+cGFyZW50ID0gTlVMTDsKKwlkbm9kZS0+bGVmdCA9IE5VTEw7CisJZG5vZGUtPnJpZ2h0ID0gTlVMTDsKKwlyZXR1cm4gZG5vZGU7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9hbGxvY19pbnNlcnQoZGljdF90ICpkaWN0LCBjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEpCit7CisJZG5vZGVfdCAqbm9kZSA9IHhtYWxsb2Moc2l6ZW9mKGRub2RlX3QpKTsKKworCWRub2RlX2luaXQobm9kZSwgZGF0YSk7CisJZGljdF9pbnNlcnQoZGljdCwgbm9kZSwga2V5KTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbm9kZSB3aXRoIHRoZSBsb3dlc3QgKGxlZnRtb3N0KSBrZXkuIElmIHRoZSBkaWN0aW9uYXJ5IGlzIGVtcHR5CisgKiAodGhhdCBpcywgZGljdF9pc2VtcHR5KGRpY3QpIHJldHVybnMgMSkgYSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisgKi8KKworc3RhdGljIGRub2RlX3QgKmRpY3RfZmlyc3QoZGljdF90ICpkaWN0KQoreworCWRub2RlX3QgKm5pbCA9IGRpY3RfbmlsKGRpY3QpLCAqcm9vdCA9IGRpY3Rfcm9vdChkaWN0KSwgKmxlZnQ7CisKKwlpZiAocm9vdCAhPSBuaWwpCisJCXdoaWxlICgobGVmdCA9IHJvb3QtPmxlZnQpICE9IG5pbCkKKwkJCXJvb3QgPSBsZWZ0OworCisJcmV0dXJuIChyb290ID09IG5pbCkgPyBOVUxMIDogcm9vdDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgZ2l2ZW4gbm9kZSdzIHN1Y2Nlc3NvciBub2RlLS0tdGhlIG5vZGUgd2hpY2ggaGFzIHRoZQorICogbmV4dCBrZXkgaW4gdGhlIGxlZnQgdG8gcmlnaHQgb3JkZXJpbmcuIElmIHRoZSBub2RlIGhhcworICogbm8gc3VjY2Vzc29yLCBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZCByYXRoZXIgdGhhbiBhIHBvaW50ZXIgdG8KKyAqIHRoZSBuaWwgbm9kZS4KKyAqLworCitzdGF0aWMgZG5vZGVfdCAqZGljdF9uZXh0KGRpY3RfdCAqZGljdCwgZG5vZGVfdCAqY3VycikKK3sKKwlkbm9kZV90ICpuaWwgPSBkaWN0X25pbChkaWN0KSwgKnBhcmVudCwgKmxlZnQ7CisKKwlpZiAoY3Vyci0+cmlnaHQgIT0gbmlsKSB7CisJCWN1cnIgPSBjdXJyLT5yaWdodDsKKwkJd2hpbGUgKChsZWZ0ID0gY3Vyci0+bGVmdCkgIT0gbmlsKQorCQkJY3VyciA9IGxlZnQ7CisJCXJldHVybiBjdXJyOworCX0KKworCXBhcmVudCA9IGN1cnItPnBhcmVudDsKKworCXdoaWxlIChwYXJlbnQgIT0gbmlsICYmIGN1cnIgPT0gcGFyZW50LT5yaWdodCkgeworCQljdXJyID0gcGFyZW50OworCQlwYXJlbnQgPSBjdXJyLT5wYXJlbnQ7CisJfQorCisJcmV0dXJuIChwYXJlbnQgPT0gbmlsKSA/IE5VTEwgOiBwYXJlbnQ7Cit9CisKKworc3RhdGljIHZvaWQgZG5vZGVfZnJlZShkbm9kZV90ICpub2RlKQoreworCWZyZWUobm9kZSk7Cit9CisKKworI3VuZGVmIGxlZnQKKyN1bmRlZiByaWdodAorI3VuZGVmIHBhcmVudAorI3VuZGVmIGNvbG9yCisjdW5kZWYga2V5CisjdW5kZWYgZGF0YQorCisjdW5kZWYgbmlsbm9kZQorI3VuZGVmIG1heGNvdW50CisjdW5kZWYgY29tcGFyZQorI3VuZGVmIGR1cGVzCisKKworLyoKKyAqIGRpcmluZm8uYyAtLS0gbWFpbnRhaW5zIHRoZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gdGFibGUgZm9yIGUyZnNjay4KKyAqLworCisvKgorICogVGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCBkdXJpbmcgcGFzczEgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IGluZm8KKyAqIGVudHJ5LiAgRHVyaW5nIHBhc3MxLCB0aGUgcGFzc2VkLWluIHBhcmVudCBpcyAwOyBpdCB3aWxsIGdldCBmaWxsZWQKKyAqIGluIGR1cmluZyBwYXNzMi4KKyAqLworc3RhdGljIHZvaWQgZTJmc2NrX2FkZF9kaXJfaW5mbyhlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vLCBleHQyX2lub190IHBhcmVudCkKK3sKKwlzdHJ1Y3QgZGlyX2luZm8gKmRpcjsKKwlpbnQgICAgICAgICAgICAgaSwgajsKKwlleHQyX2lub190ICAgICAgbnVtX2RpcnM7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwl1bnNpZ25lZCBsb25nICAgb2xkX3NpemU7CisKKwlpZiAoIWN0eC0+ZGlyX2luZm8pIHsKKwkJY3R4LT5kaXJfaW5mb19jb3VudCA9IDA7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbnVtX2RpcnMoY3R4LT5mcywgJm51bV9kaXJzKTsKKwkJaWYgKHJldHZhbCkKKwkJCW51bV9kaXJzID0gMTAyNDsgICAgICAgIC8qIEd1ZXNzICovCisJCWN0eC0+ZGlyX2luZm9fc2l6ZSA9IG51bV9kaXJzICsgMTA7CisJCWN0eC0+ZGlyX2luZm8gID0gKHN0cnVjdCBkaXJfaW5mbyAqKQorCQkJZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsIGN0eC0+ZGlyX2luZm9fc2l6ZQorCQkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBkaXJfaW5mbyksCisJCQkJCSAgICAgICAiZGlyZWN0b3J5IG1hcCIpOworCX0KKworCWlmIChjdHgtPmRpcl9pbmZvX2NvdW50ID49IGN0eC0+ZGlyX2luZm9fc2l6ZSkgeworCQlvbGRfc2l6ZSA9IGN0eC0+ZGlyX2luZm9fc2l6ZSAqIHNpemVvZihzdHJ1Y3QgZGlyX2luZm8pOworCQljdHgtPmRpcl9pbmZvX3NpemUgKz0gMTA7CisJCXJldHZhbCA9IGV4dDJmc19yZXNpemVfbWVtKG9sZF9zaXplLCBjdHgtPmRpcl9pbmZvX3NpemUgKgorCQkJCQkgICBzaXplb2Yoc3RydWN0IGRpcl9pbmZvKSwKKwkJCQkJICAgJmN0eC0+ZGlyX2luZm8pOworCQlpZiAocmV0dmFsKSB7CisJCQljdHgtPmRpcl9pbmZvX3NpemUgLT0gMTA7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIE5vcm1hbGx5LCBhZGRfZGlyX2luZm8gaXMgY2FsbGVkIHdpdGggZWFjaCBpbm9kZSBpbgorCSAqIHNlcXVlbnRpYWwgb3JkZXI7IGJ1dCBvbmNlIGluIGEgd2hpbGUgKGxpa2Ugd2hlbiBwYXNzIDMKKwkgKiBuZWVkcyB0byByZWNyZWF0ZSB0aGUgcm9vdCBkaXJlY3Rvcnkgb3IgbG9zdCtmb3VuZAorCSAqIGRpcmVjdG9yeSkgaXQgaXMgY2FsbGVkIG91dCBvZiBvcmRlci4gIEluIHRob3NlIGNhc2VzLCB3ZQorCSAqIG5lZWQgdG8gbW92ZSB0aGUgZGlyX2luZm8gZW50cmllcyBkb3duIHRvIG1ha2Ugcm9vbSwgc2luY2UKKwkgKiB0aGUgZGlyX2luZm8gYXJyYXkgbmVlZHMgdG8gYmUgc29ydGVkIGJ5IGlub2RlIG51bWJlciBmb3IKKwkgKiBnZXRfZGlyX2luZm8oKSdzIHNha2UuCisJICovCisJaWYgKGN0eC0+ZGlyX2luZm9fY291bnQgJiYKKwkgICAgY3R4LT5kaXJfaW5mb1tjdHgtPmRpcl9pbmZvX2NvdW50LTFdLmlubyA+PSBpbm8pIHsKKwkJZm9yIChpID0gY3R4LT5kaXJfaW5mb19jb3VudC0xOyBpID4gMDsgaS0tKQorCQkJaWYgKGN0eC0+ZGlyX2luZm9baS0xXS5pbm8gPCBpbm8pCisJCQkJYnJlYWs7CisJCWRpciA9ICZjdHgtPmRpcl9pbmZvW2ldOworCQlpZiAoZGlyLT5pbm8gIT0gaW5vKQorCQkJZm9yIChqID0gY3R4LT5kaXJfaW5mb19jb3VudCsrOyBqID4gaTsgai0tKQorCQkJCWN0eC0+ZGlyX2luZm9bal0gPSBjdHgtPmRpcl9pbmZvW2otMV07CisJfSBlbHNlCisJCWRpciA9ICZjdHgtPmRpcl9pbmZvW2N0eC0+ZGlyX2luZm9fY291bnQrK107CisKKwlkaXItPmlubyA9IGlubzsKKwlkaXItPmRvdGRvdCA9IHBhcmVudDsKKwlkaXItPnBhcmVudCA9IHBhcmVudDsKK30KKworLyoKKyAqIGdldF9kaXJfaW5mbygpIC0tLSBnaXZlbiBhbiBpbm9kZSBudW1iZXIsIHRyeSB0byBmaW5kIHRoZSBkaXJlY3RvcnkKKyAqIGluZm9ybWF0aW9uIGVudHJ5IGZvciBpdC4KKyAqLworc3RhdGljIHN0cnVjdCBkaXJfaW5mbyAqZTJmc2NrX2dldF9kaXJfaW5mbyhlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vKQoreworCWludCAgICAgbG93LCBoaWdoLCBtaWQ7CisKKwlsb3cgPSAwOworCWhpZ2ggPSBjdHgtPmRpcl9pbmZvX2NvdW50LTE7CisJaWYgKCFjdHgtPmRpcl9pbmZvKQorCQlyZXR1cm4gMDsKKwlpZiAoaW5vID09IGN0eC0+ZGlyX2luZm9bbG93XS5pbm8pCisJCXJldHVybiAmY3R4LT5kaXJfaW5mb1tsb3ddOworCWlmICAoaW5vID09IGN0eC0+ZGlyX2luZm9baGlnaF0uaW5vKQorCQlyZXR1cm4gJmN0eC0+ZGlyX2luZm9baGlnaF07CisKKwl3aGlsZSAobG93IDwgaGlnaCkgeworCQltaWQgPSAobG93K2hpZ2gpLzI7CisJCWlmIChtaWQgPT0gbG93IHx8IG1pZCA9PSBoaWdoKQorCQkJYnJlYWs7CisJCWlmIChpbm8gPT0gY3R4LT5kaXJfaW5mb1ttaWRdLmlubykKKwkJCXJldHVybiAmY3R4LT5kaXJfaW5mb1ttaWRdOworCQlpZiAoaW5vIDwgY3R4LT5kaXJfaW5mb1ttaWRdLmlubykKKwkJCWhpZ2ggPSBtaWQ7CisJCWVsc2UKKwkJCWxvdyA9IG1pZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIHRoZSBkaXJfaW5mbyBzdHJ1Y3R1cmUgd2hlbiBpdCBpc24ndCBuZWVkZWQgYW55IG1vcmUuCisgKi8KK3N0YXRpYyB2b2lkIGUyZnNja19mcmVlX2Rpcl9pbmZvKGUyZnNja190IGN0eCkKK3sKKwlleHQyZnNfZnJlZV9tZW0oJmN0eC0+ZGlyX2luZm8pOworCWN0eC0+ZGlyX2luZm9fc2l6ZSA9IDA7CisJY3R4LT5kaXJfaW5mb19jb3VudCA9IDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGNvdW50IG9mIG51bWJlciBvZiBkaXJlY3RvcmllcyBpbiB0aGUgZGlyX2luZm8gc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbnQgZTJmc2NrX2dldF9udW1fZGlyaW5mbyhlMmZzY2tfdCBjdHgpCit7CisJcmV0dXJuIGN0eC0+ZGlyX2luZm9fY291bnQ7Cit9CisKKy8qCisgKiBBIHNpbXBsZSBpbnRlcmF0b3IgZnVuY3Rpb24KKyAqLworc3RhdGljIHN0cnVjdCBkaXJfaW5mbyAqZTJmc2NrX2Rpcl9pbmZvX2l0ZXIoZTJmc2NrX3QgY3R4LCBpbnQgKmNvbnRyb2wpCit7CisJaWYgKCpjb250cm9sID49IGN0eC0+ZGlyX2luZm9fY291bnQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGN0eC0+ZGlyX2luZm8gKyAoKmNvbnRyb2wpKys7Cit9CisKKy8qCisgKiBkaXJpbmZvLmMgLS0tIG1haW50YWlucyB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHRhYmxlIGZvciBlMmZzY2suCisgKgorICovCisKKyNpZmRlZiBFTkFCTEVfSFRSRUUKKworLyoKKyAqIFRoaXMgc3Vicm91dGluZSBpcyBjYWxsZWQgZHVyaW5nIHBhc3MxIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSBpbmZvCisgKiBlbnRyeS4gIER1cmluZyBwYXNzMSwgdGhlIHBhc3NlZC1pbiBwYXJlbnQgaXMgMDsgaXQgd2lsbCBnZXQgZmlsbGVkCisgKiBpbiBkdXJpbmcgcGFzczIuCisgKi8KK3N0YXRpYyB2b2lkIGUyZnNja19hZGRfZHhfZGlyKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8sIGludCBudW1fYmxvY2tzKQoreworCXN0cnVjdCBkeF9kaXJfaW5mbyAqZGlyOworCWludCAgICAgICAgICAgICBpLCBqOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJdW5zaWduZWQgbG9uZyAgIG9sZF9zaXplOworCisJaWYgKCFjdHgtPmR4X2Rpcl9pbmZvKSB7CisJCWN0eC0+ZHhfZGlyX2luZm9fY291bnQgPSAwOworCQljdHgtPmR4X2Rpcl9pbmZvX3NpemUgPSAxMDA7IC8qIEd1ZXNzICovCisJCWN0eC0+ZHhfZGlyX2luZm8gID0gKHN0cnVjdCBkeF9kaXJfaW5mbyAqKQorCQkJZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsIGN0eC0+ZHhfZGlyX2luZm9fc2l6ZQorCQkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBkeF9kaXJfaW5mbyksCisJCQkJCSAgICAgICAiZGlyZWN0b3J5IG1hcCIpOworCX0KKworCWlmIChjdHgtPmR4X2Rpcl9pbmZvX2NvdW50ID49IGN0eC0+ZHhfZGlyX2luZm9fc2l6ZSkgeworCQlvbGRfc2l6ZSA9IGN0eC0+ZHhfZGlyX2luZm9fc2l6ZSAqIHNpemVvZihzdHJ1Y3QgZHhfZGlyX2luZm8pOworCQljdHgtPmR4X2Rpcl9pbmZvX3NpemUgKz0gMTA7CisJCXJldHZhbCA9IGV4dDJmc19yZXNpemVfbWVtKG9sZF9zaXplLCBjdHgtPmR4X2Rpcl9pbmZvX3NpemUgKgorCQkJCQkgICBzaXplb2Yoc3RydWN0IGR4X2Rpcl9pbmZvKSwKKwkJCQkJICAgJmN0eC0+ZHhfZGlyX2luZm8pOworCQlpZiAocmV0dmFsKSB7CisJCQljdHgtPmR4X2Rpcl9pbmZvX3NpemUgLT0gMTA7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIE5vcm1hbGx5LCBhZGRfZHhfZGlyX2luZm8gaXMgY2FsbGVkIHdpdGggZWFjaCBpbm9kZSBpbgorCSAqIHNlcXVlbnRpYWwgb3JkZXI7IGJ1dCBvbmNlIGluIGEgd2hpbGUgKGxpa2Ugd2hlbiBwYXNzIDMKKwkgKiBuZWVkcyB0byByZWNyZWF0ZSB0aGUgcm9vdCBkaXJlY3Rvcnkgb3IgbG9zdCtmb3VuZAorCSAqIGRpcmVjdG9yeSkgaXQgaXMgY2FsbGVkIG91dCBvZiBvcmRlci4gIEluIHRob3NlIGNhc2VzLCB3ZQorCSAqIG5lZWQgdG8gbW92ZSB0aGUgZHhfZGlyX2luZm8gZW50cmllcyBkb3duIHRvIG1ha2Ugcm9vbSwgc2luY2UKKwkgKiB0aGUgZHhfZGlyX2luZm8gYXJyYXkgbmVlZHMgdG8gYmUgc29ydGVkIGJ5IGlub2RlIG51bWJlciBmb3IKKwkgKiBnZXRfZHhfZGlyX2luZm8oKSdzIHNha2UuCisJICovCisJaWYgKGN0eC0+ZHhfZGlyX2luZm9fY291bnQgJiYKKwkgICAgY3R4LT5keF9kaXJfaW5mb1tjdHgtPmR4X2Rpcl9pbmZvX2NvdW50LTFdLmlubyA+PSBpbm8pIHsKKwkJZm9yIChpID0gY3R4LT5keF9kaXJfaW5mb19jb3VudC0xOyBpID4gMDsgaS0tKQorCQkJaWYgKGN0eC0+ZHhfZGlyX2luZm9baS0xXS5pbm8gPCBpbm8pCisJCQkJYnJlYWs7CisJCWRpciA9ICZjdHgtPmR4X2Rpcl9pbmZvW2ldOworCQlpZiAoZGlyLT5pbm8gIT0gaW5vKQorCQkJZm9yIChqID0gY3R4LT5keF9kaXJfaW5mb19jb3VudCsrOyBqID4gaTsgai0tKQorCQkJCWN0eC0+ZHhfZGlyX2luZm9bal0gPSBjdHgtPmR4X2Rpcl9pbmZvW2otMV07CisJfSBlbHNlCisJCWRpciA9ICZjdHgtPmR4X2Rpcl9pbmZvW2N0eC0+ZHhfZGlyX2luZm9fY291bnQrK107CisKKwlkaXItPmlubyA9IGlubzsKKwlkaXItPm51bWJsb2NrcyA9IG51bV9ibG9ja3M7CisJZGlyLT5oYXNodmVyc2lvbiA9IDA7CisJZGlyLT5keF9ibG9jayA9IGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCBudW1fYmxvY2tzCisJCQkJICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgZHhfZGlyYmxvY2tfaW5mbyksCisJCQkJICAgICAgICJkeF9ibG9jayBpbmZvIGFycmF5Iik7Cit9CisKKy8qCisgKiBnZXRfZHhfZGlyX2luZm8oKSAtLS0gZ2l2ZW4gYW4gaW5vZGUgbnVtYmVyLCB0cnkgdG8gZmluZCB0aGUgZGlyZWN0b3J5CisgKiBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHhfZGlyX2luZm8gKmUyZnNja19nZXRfZHhfZGlyX2luZm8oZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubykKK3sKKwlpbnQgICAgIGxvdywgaGlnaCwgbWlkOworCisJbG93ID0gMDsKKwloaWdoID0gY3R4LT5keF9kaXJfaW5mb19jb3VudC0xOworCWlmICghY3R4LT5keF9kaXJfaW5mbykKKwkJcmV0dXJuIDA7CisJaWYgKGlubyA9PSBjdHgtPmR4X2Rpcl9pbmZvW2xvd10uaW5vKQorCQlyZXR1cm4gJmN0eC0+ZHhfZGlyX2luZm9bbG93XTsKKwlpZiAgKGlubyA9PSBjdHgtPmR4X2Rpcl9pbmZvW2hpZ2hdLmlubykKKwkJcmV0dXJuICZjdHgtPmR4X2Rpcl9pbmZvW2hpZ2hdOworCisJd2hpbGUgKGxvdyA8IGhpZ2gpIHsKKwkJbWlkID0gKGxvdytoaWdoKS8yOworCQlpZiAobWlkID09IGxvdyB8fCBtaWQgPT0gaGlnaCkKKwkJCWJyZWFrOworCQlpZiAoaW5vID09IGN0eC0+ZHhfZGlyX2luZm9bbWlkXS5pbm8pCisJCQlyZXR1cm4gJmN0eC0+ZHhfZGlyX2luZm9bbWlkXTsKKwkJaWYgKGlubyA8IGN0eC0+ZHhfZGlyX2luZm9bbWlkXS5pbm8pCisJCQloaWdoID0gbWlkOworCQllbHNlCisJCQlsb3cgPSBtaWQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRnJlZSB0aGUgZHhfZGlyX2luZm8gc3RydWN0dXJlIHdoZW4gaXQgaXNuJ3QgbmVlZGVkIGFueSBtb3JlLgorICovCitzdGF0aWMgdm9pZCBlMmZzY2tfZnJlZV9keF9kaXJfaW5mbyhlMmZzY2tfdCBjdHgpCit7CisJaW50ICAgICBpOworCXN0cnVjdCBkeF9kaXJfaW5mbyAqZGlyOworCisJaWYgKGN0eC0+ZHhfZGlyX2luZm8pIHsKKwkJZGlyID0gY3R4LT5keF9kaXJfaW5mbzsKKwkJZm9yIChpPTA7IGkgPCBjdHgtPmR4X2Rpcl9pbmZvX2NvdW50OyBpKyspIHsKKwkJCWV4dDJmc19mcmVlX21lbSgmZGlyLT5keF9ibG9jayk7CisJCX0KKwkJZXh0MmZzX2ZyZWVfbWVtKCZjdHgtPmR4X2Rpcl9pbmZvKTsKKwl9CisJY3R4LT5keF9kaXJfaW5mb19zaXplID0gMDsKKwljdHgtPmR4X2Rpcl9pbmZvX2NvdW50ID0gMDsKK30KKworLyoKKyAqIEEgc2ltcGxlIGludGVyYXRvciBmdW5jdGlvbgorICovCitzdGF0aWMgc3RydWN0IGR4X2Rpcl9pbmZvICplMmZzY2tfZHhfZGlyX2luZm9faXRlcihlMmZzY2tfdCBjdHgsIGludCAqY29udHJvbCkKK3sKKwlpZiAoKmNvbnRyb2wgPj0gY3R4LT5keF9kaXJfaW5mb19jb3VudCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY3R4LT5keF9kaXJfaW5mbyArICgqY29udHJvbCkrKzsKK30KKworI2VuZGlmIC8qIEVOQUJMRV9IVFJFRSAqLworLyoKKyAqIGUyZnNjay5jIC0gYSBjb25zaXN0ZW5jeSBjaGVja2VyIGZvciB0aGUgbmV3IGV4dGVuZGVkIGZpbGUgc3lzdGVtLgorICoKKyAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYW4gZTJmc2NrIGNvbnRleHQKKyAqLworc3RhdGljIGVycmNvZGVfdCBlMmZzY2tfYWxsb2NhdGVfY29udGV4dChlMmZzY2tfdCAqcmV0KQoreworCWUyZnNja190ICAgICAgICBjb250ZXh0OworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGUyZnNja19zdHJ1Y3QpLCAmY29udGV4dCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2Yoc3RydWN0IGUyZnNja19zdHJ1Y3QpKTsKKworCWNvbnRleHQtPnByb2Nlc3NfaW5vZGVfc2l6ZSA9IDI1NjsKKwljb250ZXh0LT5leHRfYXR0cl92ZXIgPSAyOworCisJKnJldCA9IGNvbnRleHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBlYV9yZWZjb3VudF9lbCB7CisJYmxrX3QgICBlYV9ibGs7CisJaW50ICAgICBlYV9jb3VudDsKK307CisKK3N0cnVjdCBlYV9yZWZjb3VudCB7CisJYmxrX3QgICAgICAgICAgIGNvdW50OworCWJsa190ICAgICAgICAgICBzaXplOworCWJsa190ICAgICAgICAgICBjdXJzb3I7CisJc3RydWN0IGVhX3JlZmNvdW50X2VsICAgKmxpc3Q7Cit9OworCitzdGF0aWMgdm9pZCBlYV9yZWZjb3VudF9mcmVlKGV4dDJfcmVmY291bnRfdCByZWZjb3VudCkKK3sKKwlpZiAoIXJlZmNvdW50KQorCQlyZXR1cm47CisKKwlleHQyZnNfZnJlZV9tZW0oJnJlZmNvdW50LT5saXN0KTsKKwlleHQyZnNfZnJlZV9tZW0oJnJlZmNvdW50KTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzZXRzIGFuIGUyZnNjayBjb250ZXh0OyBpdCBpcyBjYWxsZWQgd2hlbiBlMmZzY2sKKyAqIG5lZWRzIHRvIGJlIHJlc3RhcnRlZC4KKyAqLworc3RhdGljIGVycmNvZGVfdCBlMmZzY2tfcmVzZXRfY29udGV4dChlMmZzY2tfdCBjdHgpCit7CisJY3R4LT5mbGFncyA9IDA7CisJY3R4LT5sb3N0X2FuZF9mb3VuZCA9IDA7CisJY3R4LT5iYWRfbG9zdF9hbmRfZm91bmQgPSAwOworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwKTsKKwljdHgtPmlub2RlX3VzZWRfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwKTsKKwljdHgtPmlub2RlX2Rpcl9tYXAgPSAwOworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3JlZ19tYXApOworCWN0eC0+aW5vZGVfcmVnX21hcCA9IDA7CisJZXh0MmZzX2ZyZWVfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwKTsKKwljdHgtPmJsb2NrX2ZvdW5kX21hcCA9IDA7CisJZXh0MmZzX2ZyZWVfaWNvdW50KGN0eC0+aW5vZGVfbGlua19pbmZvKTsKKwljdHgtPmlub2RlX2xpbmtfaW5mbyA9IDA7CisJaWYgKGN0eC0+am91cm5hbF9pbykgeworCQlpZiAoY3R4LT5mcyAmJiBjdHgtPmZzLT5pbyAhPSBjdHgtPmpvdXJuYWxfaW8pCisJCQlpb19jaGFubmVsX2Nsb3NlKGN0eC0+am91cm5hbF9pbyk7CisJCWN0eC0+am91cm5hbF9pbyA9IDA7CisJfQorCWlmIChjdHgtPmZzKSB7CisJCWV4dDJmc19mcmVlX2RibGlzdChjdHgtPmZzLT5kYmxpc3QpOworCQljdHgtPmZzLT5kYmxpc3QgPSAwOworCX0KKwllMmZzY2tfZnJlZV9kaXJfaW5mbyhjdHgpOworI2lmZGVmIEVOQUJMRV9IVFJFRQorCWUyZnNja19mcmVlX2R4X2Rpcl9pbmZvKGN0eCk7CisjZW5kaWYKKwllYV9yZWZjb3VudF9mcmVlKGN0eC0+cmVmY291bnQpOworCWN0eC0+cmVmY291bnQgPSAwOworCWVhX3JlZmNvdW50X2ZyZWUoY3R4LT5yZWZjb3VudF9leHRyYSk7CisJY3R4LT5yZWZjb3VudF9leHRyYSA9IDA7CisJZXh0MmZzX2ZyZWVfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZHVwX21hcCk7CisJY3R4LT5ibG9ja19kdXBfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19lYV9tYXApOworCWN0eC0+YmxvY2tfZWFfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9iYWRfbWFwKTsKKwljdHgtPmlub2RlX2JhZF9tYXAgPSAwOworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2ltYWdpY19tYXApOworCWN0eC0+aW5vZGVfaW1hZ2ljX21hcCA9IDA7CisJZXh0MmZzX3UzMl9saXN0X2ZyZWUoY3R4LT5kaXJzX3RvX2hhc2gpOworCWN0eC0+ZGlyc190b19oYXNoID0gMDsKKworCS8qCisJICogQ2xlYXIgdGhlIGFycmF5IG9mIGludmFsaWQgbWV0YS1kYXRhIGZsYWdzCisJICovCisJZXh0MmZzX2ZyZWVfbWVtKCZjdHgtPmludmFsaWRfaW5vZGVfYml0bWFwX2ZsYWcpOworCWV4dDJmc19mcmVlX21lbSgmY3R4LT5pbnZhbGlkX2Jsb2NrX2JpdG1hcF9mbGFnKTsKKwlleHQyZnNfZnJlZV9tZW0oJmN0eC0+aW52YWxpZF9pbm9kZV90YWJsZV9mbGFnKTsKKworCS8qIENsZWFyIHN0YXRpc3RpYyBjb3VudGVycyAqLworCWN0eC0+ZnNfZGlyZWN0b3J5X2NvdW50ID0gMDsKKwljdHgtPmZzX3JlZ3VsYXJfY291bnQgPSAwOworCWN0eC0+ZnNfYmxvY2tkZXZfY291bnQgPSAwOworCWN0eC0+ZnNfY2hhcmRldl9jb3VudCA9IDA7CisJY3R4LT5mc19saW5rc19jb3VudCA9IDA7CisJY3R4LT5mc19zeW1saW5rc19jb3VudCA9IDA7CisJY3R4LT5mc19mYXN0X3N5bWxpbmtzX2NvdW50ID0gMDsKKwljdHgtPmZzX2ZpZm9fY291bnQgPSAwOworCWN0eC0+ZnNfdG90YWxfY291bnQgPSAwOworCWN0eC0+ZnNfc29ja2V0c19jb3VudCA9IDA7CisJY3R4LT5mc19pbmRfY291bnQgPSAwOworCWN0eC0+ZnNfZGluZF9jb3VudCA9IDA7CisJY3R4LT5mc190aW5kX2NvdW50ID0gMDsKKwljdHgtPmZzX2ZyYWdtZW50ZWQgPSAwOworCWN0eC0+bGFyZ2VfZmlsZXMgPSAwOworCisJLyogUmVzZXQgdGhlIHN1cGVyYmxvY2sgdG8gdGhlIHVzZXIncyByZXF1ZXN0ZWQgdmFsdWUgKi8KKwljdHgtPnN1cGVyYmxvY2sgPSBjdHgtPnVzZV9zdXBlcmJsb2NrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGUyZnNja19mcmVlX2NvbnRleHQoZTJmc2NrX3QgY3R4KQoreworCWlmICghY3R4KQorCQlyZXR1cm47CisKKwllMmZzY2tfcmVzZXRfY29udGV4dChjdHgpOworCWlmIChjdHgtPmJsa2lkKQorCQlibGtpZF9wdXRfY2FjaGUoY3R4LT5ibGtpZCk7CisKKwlleHQyZnNfZnJlZV9tZW0oJmN0eCk7Cit9CisKKy8qCisgKiBlYV9yZWZjb3VudC5jCisgKi8KKworLyoKKyAqIFRoZSBzdHJhdGVneSB3ZSB1c2UgZm9yIGtlZXBpbmcgdHJhY2sgb2YgRUEgcmVmY291bnRzIGlzIGFzCisgKiBmb2xsb3dzLiAgV2Uga2VlcCBhIHNvcnRlZCBhcnJheSBvZiBmaXJzdCBFQSBibG9ja3MgYW5kIGl0cworICogcmVmZXJlbmNlIGNvdW50cy4gIE9uY2UgdGhlIHJlZmNvdW50IGhhcyBkcm9wcGVkIHRvIHplcm8sIGl0IGlzCisgKiByZW1vdmVkIGZyb20gdGhlIGFycmF5IHRvIHNhdmUgbWVtb3J5IHNwYWNlLiAgT25jZSB0aGUgRUEgYmxvY2sgaXMKKyAqIGNoZWNrZWQsIGl0cyBiaXQgaXMgc2V0IGluIHRoZSBibG9ja19lYV9tYXAgYml0bWFwLgorICovCisKKworc3RhdGljIGVycmNvZGVfdCBlYV9yZWZjb3VudF9jcmVhdGUoaW50IHNpemUsIGV4dDJfcmVmY291bnRfdCAqcmV0KQoreworCWV4dDJfcmVmY291bnRfdCByZWZjb3VudDsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCXNpemVfdCAgICAgICAgICBieXRlczsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZWFfcmVmY291bnQpLCAmcmVmY291bnQpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KHJlZmNvdW50LCAwLCBzaXplb2Yoc3RydWN0IGVhX3JlZmNvdW50KSk7CisKKwlpZiAoIXNpemUpCisJCXNpemUgPSA1MDA7CisJcmVmY291bnQtPnNpemUgPSBzaXplOworCWJ5dGVzID0gKHNpemVfdCkgKHNpemUgKiBzaXplb2Yoc3RydWN0IGVhX3JlZmNvdW50X2VsKSk7CisjaWZkZWYgREVCVUcKKwlwcmludGYoIlJlZmNvdW50IGFsbG9jYXRlZCAlZCBlbnRyaWVzLCAlZCBieXRlcy5cbiIsCisJICAgICAgIHJlZmNvdW50LT5zaXplLCBieXRlcyk7CisjZW5kaWYKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShieXRlcywgJnJlZmNvdW50LT5saXN0KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQocmVmY291bnQtPmxpc3QsIDAsIGJ5dGVzKTsKKworCXJlZmNvdW50LT5jb3VudCA9IDA7CisJcmVmY291bnQtPmN1cnNvciA9IDA7CisKKwkqcmV0ID0gcmVmY291bnQ7CisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwllYV9yZWZjb3VudF9mcmVlKHJlZmNvdW50KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogY29sbGFwc2VfcmVmY291bnQoKSAtLS0gZ28gdGhyb3VnaCB0aGUgcmVmY291bnQgYXJyYXksIGFuZCBnZXQgcmlkCisgKiBvZiBhbnkgY291bnQgPT0gemVybyBlbnRyaWVzCisgKi8KK3N0YXRpYyB2b2lkIHJlZmNvdW50X2NvbGxhcHNlKGV4dDJfcmVmY291bnRfdCByZWZjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgICAgaSwgajsKKwlzdHJ1Y3QgZWFfcmVmY291bnRfZWwgICAqbGlzdDsKKworCWxpc3QgPSByZWZjb3VudC0+bGlzdDsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHJlZmNvdW50LT5jb3VudDsgaSsrKSB7CisJCWlmIChsaXN0W2ldLmVhX2NvdW50KSB7CisJCQlpZiAoaSAhPSBqKQorCQkJCWxpc3Rbal0gPSBsaXN0W2ldOworCQkJaisrOworCQl9CisJfQorI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoVEVTVF9QUk9HUkFNKQorCXByaW50ZigiUmVmY291bnRfY29sbGFwc2U6IHNpemUgd2FzICVkLCBub3cgJWRcbiIsCisJICAgICAgIHJlZmNvdW50LT5jb3VudCwgaik7CisjZW5kaWYKKwlyZWZjb3VudC0+Y291bnQgPSBqOworfQorCisKKy8qCisgKiBpbnNlcnRfcmVmY291bnRfZWwoKSAtLS0gSW5zZXJ0IGEgbmV3IGVudHJ5IGludG8gdGhlIHNvcnRlZCBsaXN0IGF0IGEKKyAqICAgICAgc3BlY2lmaWVkIHBvc2l0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGVhX3JlZmNvdW50X2VsICppbnNlcnRfcmVmY291bnRfZWwoZXh0Ml9yZWZjb3VudF90IHJlZmNvdW50LAorCQkJCQkJIGJsa190IGJsaywgaW50IHBvcykKK3sKKwlzdHJ1Y3QgZWFfcmVmY291bnRfZWwgICAqZWw7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgcmV0dmFsOworCWJsa190ICAgICAgICAgICAgICAgICAgIG5ld19zaXplID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBudW07CisKKwlpZiAocmVmY291bnQtPmNvdW50ID49IHJlZmNvdW50LT5zaXplKSB7CisJCW5ld19zaXplID0gcmVmY291bnQtPnNpemUgKyAxMDA7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCJSZWFsbG9jYXRpbmcgcmVmY291bnQgJWQgZW50cmllcy4uLlxuIiwgbmV3X3NpemUpOworI2VuZGlmCisJCXJldHZhbCA9IGV4dDJmc19yZXNpemVfbWVtKChzaXplX3QpIHJlZmNvdW50LT5zaXplICoKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBlYV9yZWZjb3VudF9lbCksCisJCQkJCSAgIChzaXplX3QpIG5ld19zaXplICoKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBlYV9yZWZjb3VudF9lbCksCisJCQkJCSAgICZyZWZjb3VudC0+bGlzdCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gMDsKKwkJcmVmY291bnQtPnNpemUgPSBuZXdfc2l6ZTsKKwl9CisJbnVtID0gKGludCkgcmVmY291bnQtPmNvdW50IC0gcG9zOworCWlmIChudW0gPCAwKQorCQlyZXR1cm4gMDsgICAgICAgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCWlmIChudW0pIHsKKwkJbWVtbW92ZSgmcmVmY291bnQtPmxpc3RbcG9zKzFdLCAmcmVmY291bnQtPmxpc3RbcG9zXSwKKwkJCXNpemVvZihzdHJ1Y3QgZWFfcmVmY291bnRfZWwpICogbnVtKTsKKwl9CisJcmVmY291bnQtPmNvdW50Kys7CisJZWwgPSAmcmVmY291bnQtPmxpc3RbcG9zXTsKKwllbC0+ZWFfY291bnQgPSAwOworCWVsLT5lYV9ibGsgPSBibGs7CisJcmV0dXJuIGVsOworfQorCisKKy8qCisgKiBnZXRfcmVmY291bnRfZWwoKSAtLS0gZ2l2ZW4gYW4gYmxvY2sgbnVtYmVyLCB0cnkgdG8gZmluZCByZWZjb3VudAorICogICAgICBpbmZvcm1hdGlvbiBpbiB0aGUgc29ydGVkIGxpc3QuICBJZiB0aGUgY3JlYXRlIGZsYWcgaXMgc2V0LAorICogICAgICBhbmQgd2UgY2FuJ3QgZmluZCBhbiBlbnRyeSwgY3JlYXRlIG9uZSBpbiB0aGUgc29ydGVkIGxpc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZWFfcmVmY291bnRfZWwgKmdldF9yZWZjb3VudF9lbChleHQyX3JlZmNvdW50X3QgcmVmY291bnQsCisJCQkJCSAgICAgIGJsa190IGJsaywgaW50IGNyZWF0ZSkKK3sKKwlmbG9hdCAgIHJhbmdlOworCWludCAgICAgbG93LCBoaWdoLCBtaWQ7CisJYmxrX3QgICBsb3d2YWwsIGhpZ2h2YWw7CisKKwlpZiAoIXJlZmNvdW50IHx8ICFyZWZjb3VudC0+bGlzdCkKKwkJcmV0dXJuIDA7CityZXRyeToKKwlsb3cgPSAwOworCWhpZ2ggPSAoaW50KSByZWZjb3VudC0+Y291bnQtMTsKKwlpZiAoY3JlYXRlICYmICgocmVmY291bnQtPmNvdW50ID09IDApIHx8CisJCSAgICAgICAoYmxrID4gcmVmY291bnQtPmxpc3RbaGlnaF0uZWFfYmxrKSkpIHsKKwkJaWYgKHJlZmNvdW50LT5jb3VudCA+PSByZWZjb3VudC0+c2l6ZSkKKwkJCXJlZmNvdW50X2NvbGxhcHNlKHJlZmNvdW50KTsKKworCQlyZXR1cm4gaW5zZXJ0X3JlZmNvdW50X2VsKHJlZmNvdW50LCBibGssCisJCQkJCSAgKHVuc2lnbmVkKSByZWZjb3VudC0+Y291bnQpOworCX0KKwlpZiAocmVmY291bnQtPmNvdW50ID09IDApCisJCXJldHVybiAwOworCisJaWYgKHJlZmNvdW50LT5jdXJzb3IgPj0gcmVmY291bnQtPmNvdW50KQorCQlyZWZjb3VudC0+Y3Vyc29yID0gMDsKKwlpZiAoYmxrID09IHJlZmNvdW50LT5saXN0W3JlZmNvdW50LT5jdXJzb3JdLmVhX2JsaykKKwkJcmV0dXJuICZyZWZjb3VudC0+bGlzdFtyZWZjb3VudC0+Y3Vyc29yKytdOworI2lmZGVmIERFQlVHCisJcHJpbnRmKCJOb24tY3Vyc29yIGdldF9yZWZjb3VudF9lbDogJXVcbiIsIGJsayk7CisjZW5kaWYKKwl3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJaWYgKGxvdyA9PSBoaWdoKQorCQkJbWlkID0gbG93OworCQllbHNlIHsKKwkJCS8qIEludGVycG9sYXRlIGZvciBlZmZpY2llbmN5ICovCisJCQlsb3d2YWwgPSByZWZjb3VudC0+bGlzdFtsb3ddLmVhX2JsazsKKwkJCWhpZ2h2YWwgPSByZWZjb3VudC0+bGlzdFtoaWdoXS5lYV9ibGs7CisKKwkJCWlmIChibGsgPCBsb3d2YWwpCisJCQkJcmFuZ2UgPSAwOworCQkJZWxzZSBpZiAoYmxrID4gaGlnaHZhbCkKKwkJCQlyYW5nZSA9IDE7CisJCQllbHNlCisJCQkJcmFuZ2UgPSAoKGZsb2F0KSAoYmxrIC0gbG93dmFsKSkgLworCQkJCQkoaGlnaHZhbCAtIGxvd3ZhbCk7CisJCQltaWQgPSBsb3cgKyAoKGludCkgKHJhbmdlICogKGhpZ2gtbG93KSkpOworCQl9CisKKwkJaWYgKGJsayA9PSByZWZjb3VudC0+bGlzdFttaWRdLmVhX2JsaykgeworCQkJcmVmY291bnQtPmN1cnNvciA9IG1pZCsxOworCQkJcmV0dXJuICZyZWZjb3VudC0+bGlzdFttaWRdOworCQl9CisJCWlmIChibGsgPCByZWZjb3VudC0+bGlzdFttaWRdLmVhX2JsaykKKwkJCWhpZ2ggPSBtaWQtMTsKKwkJZWxzZQorCQkJbG93ID0gbWlkKzE7CisJfQorCS8qCisJICogSWYgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgZW50cnksIGl0IHNob3VsZCBiZSByaWdodCBhdAorCSAqIGxvdyAod2hlcmUgaGlnaCB3aWxsIGJlIGxlZnQgYXQgbG93LTEpLgorCSAqLworCWlmIChjcmVhdGUpIHsKKwkJaWYgKHJlZmNvdW50LT5jb3VudCA+PSByZWZjb3VudC0+c2l6ZSkgeworCQkJcmVmY291bnRfY29sbGFwc2UocmVmY291bnQpOworCQkJaWYgKHJlZmNvdW50LT5jb3VudCA8IHJlZmNvdW50LT5zaXplKQorCQkJCWdvdG8gcmV0cnk7CisJCX0KKwkJcmV0dXJuIGluc2VydF9yZWZjb3VudF9lbChyZWZjb3VudCwgYmxrLCBsb3cpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdAorZWFfcmVmY291bnRfaW5jcmVtZW50KGV4dDJfcmVmY291bnRfdCByZWZjb3VudCwgYmxrX3QgYmxrLCBpbnQgKnJldCkKK3sKKwlzdHJ1Y3QgZWFfcmVmY291bnRfZWwgICAqZWw7CisKKwllbCA9IGdldF9yZWZjb3VudF9lbChyZWZjb3VudCwgYmxrLCAxKTsKKwlpZiAoIWVsKQorCQlyZXR1cm4gRVhUMl9FVF9OT19NRU1PUlk7CisJZWwtPmVhX2NvdW50Kys7CisKKwlpZiAocmV0KQorCQkqcmV0ID0gZWwtPmVhX2NvdW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90CitlYV9yZWZjb3VudF9kZWNyZW1lbnQoZXh0Ml9yZWZjb3VudF90IHJlZmNvdW50LCBibGtfdCBibGssIGludCAqcmV0KQoreworCXN0cnVjdCBlYV9yZWZjb3VudF9lbCAgICplbDsKKworCWVsID0gZ2V0X3JlZmNvdW50X2VsKHJlZmNvdW50LCBibGssIDApOworCWlmICghZWwgfHwgZWwtPmVhX2NvdW50ID09IDApCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwllbC0+ZWFfY291bnQtLTsKKworCWlmIChyZXQpCisJCSpyZXQgPSBlbC0+ZWFfY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QKK2VhX3JlZmNvdW50X3N0b3JlKGV4dDJfcmVmY291bnRfdCByZWZjb3VudCwgYmxrX3QgYmxrLCBpbnQgY291bnQpCit7CisJc3RydWN0IGVhX3JlZmNvdW50X2VsICAgKmVsOworCisJLyoKKwkgKiBHZXQgdGhlIHJlZmNvdW50IGVsZW1lbnQKKwkgKi8KKwllbCA9IGdldF9yZWZjb3VudF9lbChyZWZjb3VudCwgYmxrLCBjb3VudCA/IDEgOiAwKTsKKwlpZiAoIWVsKQorCQlyZXR1cm4gY291bnQgPyBFWFQyX0VUX05PX01FTU9SWSA6IDA7CisJZWwtPmVhX2NvdW50ID0gY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlYV9yZWZjb3VudF9pbnRyX2JlZ2luKGV4dDJfcmVmY291bnRfdCByZWZjb3VudCkKK3sKKwlyZWZjb3VudC0+Y3Vyc29yID0gMDsKK30KKworCitzdGF0aWMgYmxrX3QgZWFfcmVmY291bnRfaW50cl9uZXh0KGV4dDJfcmVmY291bnRfdCByZWZjb3VudCwgaW50ICpyZXQpCit7CisJc3RydWN0IGVhX3JlZmNvdW50X2VsICAgKmxpc3Q7CisKKwl3aGlsZSAoMSkgeworCQlpZiAocmVmY291bnQtPmN1cnNvciA+PSByZWZjb3VudC0+Y291bnQpCisJCQlyZXR1cm4gMDsKKwkJbGlzdCA9IHJlZmNvdW50LT5saXN0OworCQlpZiAobGlzdFtyZWZjb3VudC0+Y3Vyc29yXS5lYV9jb3VudCkgeworCQkJaWYgKHJldCkKKwkJCQkqcmV0ID0gbGlzdFtyZWZjb3VudC0+Y3Vyc29yXS5lYV9jb3VudDsKKwkJCXJldHVybiBsaXN0W3JlZmNvdW50LT5jdXJzb3IrK10uZWFfYmxrOworCQl9CisJCXJlZmNvdW50LT5jdXJzb3IrKzsKKwl9Cit9CisKKworLyoKKyAqIGVoYW5kbGVyLmMgLS0tIGhhbmRsZSBiYWQgYmxvY2sgZXJyb3JzIHdoaWNoIGNvbWUgdXAgZHVyaW5nIHRoZQorICogICAgICBjb3Vyc2Ugb2YgYW4gZTJmc2NrIHNlc3Npb24uCisgKi8KKworCitzdGF0aWMgY29uc3QgY2hhciAqb3BlcmF0aW9uOworCitzdGF0aWMgZXJyY29kZV90CitlMmZzY2tfaGFuZGxlX3JlYWRfZXJyb3IoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgY291bnQsCisJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSBpbnQgYWN0dWFsIEZTQ0tfQVRUUigodW51c2VkKSksIGVycmNvZGVfdCBlcnJvcikKK3sKKwlpbnQgICAgIGk7CisJY2hhciAgICAqcDsKKwlleHQyX2ZpbHN5cyBmcyA9IChleHQyX2ZpbHN5cykgY2hhbm5lbC0+YXBwX2RhdGE7CisJZTJmc2NrX3QgY3R4OworCisJY3R4ID0gKGUyZnNja190KSBmcy0+cHJpdl9kYXRhOworCisJLyoKKwkgKiBJZiBtb3JlIHRoYW4gb25lIGJsb2NrIHdhcyByZWFkLCB0cnkgcmVhZGluZyBlYWNoIGJsb2NrCisJICogc2VwYXJhdGVseS4gIFdlIGNvdWxkIHVzZSB0aGUgYWN0dWFsIGJ5dGVzIHJlYWQgdG8gZmlndXJlCisJICogb3V0IHdoZXJlIHRvIHN0YXJ0LCBidXQgd2UgZG9uJ3QgYm90aGVyLgorCSAqLworCWlmIChjb3VudCA+IDEpIHsKKwkJcCA9IChjaGFyICopIGRhdGE7CisJCWZvciAoaT0wOyBpIDwgY291bnQ7IGkrKywgcCArPSBjaGFubmVsLT5ibG9ja19zaXplLCBibG9jaysrKSB7CisJCQllcnJvciA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoY2hhbm5lbCwgYmxvY2ssCisJCQkJCQkgICAgMSwgcCk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAob3BlcmF0aW9uKQorCQlwcmludGYoXygiRXJyb3IgcmVhZGluZyBibG9jayAlbHUgKCVzKSB3aGlsZSAlcy4gICIpLCBibG9jaywKKwkJICAgICAgIGVycm9yX21lc3NhZ2UoZXJyb3IpLCBvcGVyYXRpb24pOworCWVsc2UKKwkJcHJpbnRmKF8oIkVycm9yIHJlYWRpbmcgYmxvY2sgJWx1ICglcykuICAiKSwgYmxvY2ssCisJCSAgICAgICBlcnJvcl9tZXNzYWdlKGVycm9yKSk7CisJcHJlZW5oYWx0KGN0eCk7CisJaWYgKGFzayhjdHgsIF8oIklnbm9yZSBlcnJvciIpLCAxKSkgeworCQlpZiAoYXNrKGN0eCwgXygiRm9yY2UgcmV3cml0ZSIpLCAxKSkKKwkJCWlvX2NoYW5uZWxfd3JpdGVfYmxrKGNoYW5uZWwsIGJsb2NrLCAxLCBkYXRhKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgZXJyY29kZV90CitlMmZzY2tfaGFuZGxlX3dyaXRlX2Vycm9yKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywgaW50IGNvdW50LAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCWludCBhY3R1YWwgRlNDS19BVFRSKCh1bnVzZWQpKSwgZXJyY29kZV90IGVycm9yKQoreworCWludCAgICAgICAgICAgICBpOworCWNvbnN0IGNoYXIgICAgICAqcDsKKwlleHQyX2ZpbHN5cyBmcyA9IChleHQyX2ZpbHN5cykgY2hhbm5lbC0+YXBwX2RhdGE7CisJZTJmc2NrX3QgY3R4OworCisJY3R4ID0gKGUyZnNja190KSBmcy0+cHJpdl9kYXRhOworCisJLyoKKwkgKiBJZiBtb3JlIHRoYW4gb25lIGJsb2NrIHdhcyB3cml0dGVuLCB0cnkgd3JpdGluZyBlYWNoIGJsb2NrCisJICogc2VwYXJhdGVseS4gIFdlIGNvdWxkIHVzZSB0aGUgYWN0dWFsIGJ5dGVzIHJlYWQgdG8gZmlndXJlCisJICogb3V0IHdoZXJlIHRvIHN0YXJ0LCBidXQgd2UgZG9uJ3QgYm90aGVyLgorCSAqLworCWlmIChjb3VudCA+IDEpIHsKKwkJcCA9IChjb25zdCBjaGFyICopIGRhdGE7CisJCWZvciAoaT0wOyBpIDwgY291bnQ7IGkrKywgcCArPSBjaGFubmVsLT5ibG9ja19zaXplLCBibG9jaysrKSB7CisJCQllcnJvciA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGNoYW5uZWwsIGJsb2NrLAorCQkJCQkJICAgICAxLCBwKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9wZXJhdGlvbikKKwkJcHJpbnRmKF8oIkVycm9yIHdyaXRpbmcgYmxvY2sgJWx1ICglcykgd2hpbGUgJXMuICAiKSwgYmxvY2ssCisJCSAgICAgICBlcnJvcl9tZXNzYWdlKGVycm9yKSwgb3BlcmF0aW9uKTsKKwllbHNlCisJCXByaW50ZihfKCJFcnJvciB3cml0aW5nIGJsb2NrICVsdSAoJXMpLiAgIiksIGJsb2NrLAorCQkgICAgICAgZXJyb3JfbWVzc2FnZShlcnJvcikpOworCXByZWVuaGFsdChjdHgpOworCWlmIChhc2soY3R4LCBfKCJJZ25vcmUgZXJyb3IiKSwgMSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZWhhbmRsZXJfb3BlcmF0aW9uKGNvbnN0IGNoYXIgKm9wKQoreworCWNvbnN0IGNoYXIgKnJldCA9IG9wZXJhdGlvbjsKKworCW9wZXJhdGlvbiA9IG9wOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVoYW5kbGVyX2luaXQoaW9fY2hhbm5lbCBjaGFubmVsKQoreworCWNoYW5uZWwtPnJlYWRfZXJyb3IgPSBlMmZzY2tfaGFuZGxlX3JlYWRfZXJyb3I7CisJY2hhbm5lbC0+d3JpdGVfZXJyb3IgPSBlMmZzY2tfaGFuZGxlX3dyaXRlX2Vycm9yOworfQorCisvKgorICogam91cm5hbC5jIC0tLSBjb2RlIGZvciBoYW5kbGluZyB0aGUgImV4dDMiIGpvdXJuYWwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMCBUaGVvZG9yZSBUcydvCisgKgorICogUGFydHMgb2YgdGhlIGNvZGUgYXJlIGJhc2VkIG9uIGZzL2pmcy9qb3VybmFsLmMgYnkgU3RlcGhlbiBDLiBUd2VlZGllCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUmVkIEhhdCBTb2Z0d2FyZQorICoKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IgYXQgeW91ciBkaXNjcmV0aW9uCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICogRGVmaW5lIFVTRV9JTk9ERV9JTyB0byB1c2UgdGhlIGlub2RlX2lvLmMgLyBmaWxlaW8uYyBjb2RlcGF0aHMuCisgKiBUaGlzIGNyZWF0ZXMgYSBsYXJnZXIgc3RhdGljIGJpbmFyeSwgYW5kIGEgc21hbGxlciBiaW5hcnkgdXNpbmcKKyAqIHNoYXJlZCBsaWJyYXJpZXMuICBJdCdzIGFsc28gcHJvYmFibHkgc2xpZ2h0bHkgbGVzcyBDUFUtZWZmaWNpZW50LAorICogd2hpY2ggaXMgd2h5IGl0J3Mgbm90IG9uIGJ5IGRlZmF1bHQuICBCdXQsIGl0J3MgYSBnb29kIHdheSBvZgorICogdGVzdGluZyB0aGUgZnVuY3Rpb25zIGluIGlub2RlX2lvLmMgYW5kIGZpbGVpby5jLgorICovCisjdW5kZWYgVVNFX0lOT0RFX0lPCisKKy8qIEtlcm5lbCBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgdGhlIGpvdXJuYWwuICBUaGVzZSBhbGxvdyB1cworICogdG8gdXNlIHRoZSByZWNvdmVyeS5jIGZpbGUgdmlydHVhbGx5IHVuY2hhbmdlZCBmcm9tIHRoZSBrZXJuZWwsIHNvIHdlCisgKiBkb24ndCBoYXZlIHRvIGRvIG11Y2ggdG8ga2VlcCBrZXJuZWwgYW5kIHVzZXIgcmVjb3ZlcnkgaW4gc3luYy4KKyAqLworc3RhdGljIGludCBqb3VybmFsX2JtYXAoam91cm5hbF90ICpqb3VybmFsLCBibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyAqcGh5cykKK3sKKyNpZmRlZiBVU0VfSU5PREVfSU8KKwkqcGh5cyA9IGJsb2NrOworCXJldHVybiAwOworI2Vsc2UKKwlzdHJ1Y3QgaW5vZGUgICAgKmlub2RlID0gam91cm5hbC0+al9pbm9kZTsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCWJsa190ICAgICAgICAgICBwYmxrOworCisJaWYgKCFpbm9kZSkgeworCQkqcGh5cyA9IGJsb2NrOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR2YWw9IGV4dDJmc19ibWFwKGlub2RlLT5pX2N0eC0+ZnMsIGlub2RlLT5pX2lubywKKwkJCSAgICAmaW5vZGUtPmlfZXh0MiwgTlVMTCwgMCwgYmxvY2ssICZwYmxrKTsKKwkqcGh5cyA9IHBibGs7CisJcmV0dXJuIHJldHZhbDsKKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpnZXRibGsoa2Rldl90IGtkZXYsIGJsa190IGJsb2NrbnIsIGludCBibG9ja3NpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWJoID0gZTJmc2NrX2FsbG9jYXRlX21lbW9yeShrZGV2LT5rX2N0eCwgc2l6ZW9mKCpiaCksICJibG9jayBidWZmZXIiKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gTlVMTDsKKworCWJoLT5iX2N0eCA9IGtkZXYtPmtfY3R4OworCWlmIChrZGV2LT5rX2RldiA9PSBLX0RFVl9GUykKKwkJYmgtPmJfaW8gPSBrZGV2LT5rX2N0eC0+ZnMtPmlvOworCWVsc2UKKwkJYmgtPmJfaW8gPSBrZGV2LT5rX2N0eC0+am91cm5hbF9pbzsKKwliaC0+Yl9zaXplID0gYmxvY2tzaXplOworCWJoLT5iX2Jsb2NrbnIgPSBibG9ja25yOworCisJcmV0dXJuIGJoOworfQorCitzdGF0aWMgdm9pZCBzeW5jX2Jsb2NrZGV2KGtkZXZfdCBrZGV2KQoreworCWlvX2NoYW5uZWwgICAgICBpbzsKKworCWlmIChrZGV2LT5rX2RldiA9PSBLX0RFVl9GUykKKwkJaW8gPSBrZGV2LT5rX2N0eC0+ZnMtPmlvOworCWVsc2UKKwkJaW8gPSBrZGV2LT5rX2N0eC0+am91cm5hbF9pbzsKKworCWlvX2NoYW5uZWxfZmx1c2goaW8pOworfQorCitzdGF0aWMgdm9pZCBsbF9yd19ibG9jayhpbnQgcncsIGludCBuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHBbXSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlmb3IgKDsgbnIgPiAwOyAtLW5yKSB7CisJCWJoID0gKmJocCsrOworCQlpZiAocncgPT0gUkVBRCAmJiAhYmgtPmJfdXB0b2RhdGUpIHsKKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoYmgtPmJfaW8sCisJCQkJCQkgICAgIGJoLT5iX2Jsb2NrbnIsCisJCQkJCQkgICAgIDEsIGJoLT5iX2RhdGEpOworCQkJaWYgKHJldHZhbCkgeworCQkJCWJiX2Vycm9yX21zZygid2hpbGUgcmVhZGluZyBibG9jayAlbHUiLAorCQkJCQkodW5zaWduZWQgbG9uZykgYmgtPmJfYmxvY2tucik7CisJCQkJYmgtPmJfZXJyID0gcmV0dmFsOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYmgtPmJfdXB0b2RhdGUgPSAxOworCQl9IGVsc2UgaWYgKHJ3ID09IFdSSVRFICYmIGJoLT5iX2RpcnR5KSB7CisJCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2JsayhiaC0+Yl9pbywKKwkJCQkJCSAgICAgIGJoLT5iX2Jsb2NrbnIsCisJCQkJCQkgICAgICAxLCBiaC0+Yl9kYXRhKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQliYl9lcnJvcl9tc2coIndoaWxlIHdyaXRpbmcgYmxvY2sgJWx1IiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIGJoLT5iX2Jsb2NrbnIpOworCQkJCWJoLT5iX2VyciA9IHJldHZhbDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJoLT5iX2RpcnR5ID0gMDsKKwkJCWJoLT5iX3VwdG9kYXRlID0gMTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbWFya19idWZmZXJfZGlydHkoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaC0+Yl9kaXJ0eSA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX2J1ZmZlcl9jbGVhbihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKwliaC0+Yl9kaXJ0eSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGJyZWxzZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmIChiaC0+Yl9kaXJ0eSkKKwkJbGxfcndfYmxvY2soV1JJVEUsIDEsICZiaCk7CisJZXh0MmZzX2ZyZWVfbWVtKCZiaCk7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX3VwdG9kYXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIGJoLT5iX3VwdG9kYXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19idWZmZXJfdXB0b2RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHZhbCkKK3sKKwliaC0+Yl91cHRvZGF0ZSA9IHZhbDsKK30KKworc3RhdGljIHZvaWQgd2FpdF9vbl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoIWJoLT5iX3VwdG9kYXRlKQorCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworfQorCisKK3N0YXRpYyB2b2lkIGUyZnNja19jbGVhcl9yZWNvdmVyKGUyZnNja190IGN0eCwgaW50IGVycm9yKQoreworCWN0eC0+ZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJj0gfkVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSOworCisJLyogaWYgd2UgaGFkIGFuIGVycm9yIGRvaW5nIGpvdXJuYWwgcmVjb3ZlcnksIHdlIG5lZWQgYSBmdWxsIGZzY2sgKi8KKwlpZiAoZXJyb3IpCisJCWN0eC0+ZnMtPnN1cGVyLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGN0eC0+ZnMpOworfQorCitzdGF0aWMgZXJyY29kZV90IGUyZnNja19nZXRfam91cm5hbChlMmZzY2tfdCBjdHgsIGpvdXJuYWxfdCAqKnJldF9qb3VybmFsKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYiA9IGN0eC0+ZnMtPnN1cGVyOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrIGpzdXBlcjsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCXN0cnVjdCBidWZmZXJfaGVhZCAgICAgICpiaDsKKwlzdHJ1Y3QgaW5vZGUgICAgICAgICAgICAqal9pbm9kZSA9IE5VTEw7CisJc3RydWN0IGtkZXZfcyAgICAgICAgICAgKmRldl9mcyA9IE5VTEwsICpkZXZfam91cm5hbDsKKwljb25zdCBjaGFyICAgICAgICAgICAgICAqam91cm5hbF9uYW1lID0gTlVMTDsKKwlqb3VybmFsX3QgICAgICAgICAgICAgICAqam91cm5hbCA9IE5VTEw7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgcmV0dmFsID0gMDsKKwlpb19tYW5hZ2VyICAgICAgICAgICAgICBpb19wdHIgPSAwOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHN0YXJ0ID0gMDsKKwlibGtfdCAgICAgICAgICAgICAgICAgICBibGs7CisJaW50ICAgICAgICAgICAgICAgICAgICAgZXh0X2pvdXJuYWwgPSAwOworCWludCAgICAgICAgICAgICAgICAgICAgIHRyaWVkX2JhY2t1cF9qbmwgPSAwOworCWludCAgICAgICAgICAgICAgICAgICAgIGk7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJam91cm5hbCA9IGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCBzaXplb2Yoam91cm5hbF90KSwgImpvdXJuYWwiKTsKKwlpZiAoIWpvdXJuYWwpIHsKKwkJcmV0dXJuIEVYVDJfRVRfTk9fTUVNT1JZOworCX0KKworCWRldl9mcyA9IGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCAyKnNpemVvZihzdHJ1Y3Qga2Rldl9zKSwgImtkZXYiKTsKKwlpZiAoIWRldl9mcykgeworCQlyZXR2YWwgPSBFWFQyX0VUX05PX01FTU9SWTsKKwkJZ290byBlcnJvdXQ7CisJfQorCWRldl9qb3VybmFsID0gZGV2X2ZzKzE7CisKKwlkZXZfZnMtPmtfY3R4ID0gZGV2X2pvdXJuYWwtPmtfY3R4ID0gY3R4OworCWRldl9mcy0+a19kZXYgPSBLX0RFVl9GUzsKKwlkZXZfam91cm5hbC0+a19kZXYgPSBLX0RFVl9KT1VSTkFMOworCisJam91cm5hbC0+al9kZXYgPSBkZXZfam91cm5hbDsKKwlqb3VybmFsLT5qX2ZzX2RldiA9IGRldl9mczsKKwlqb3VybmFsLT5qX2lub2RlID0gTlVMTDsKKwlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSA9IGN0eC0+ZnMtPmJsb2Nrc2l6ZTsKKworCWlmICh1dWlkX2lzX251bGwoc2ItPnNfam91cm5hbF91dWlkKSkgeworCQlpZiAoIXNiLT5zX2pvdXJuYWxfaW51bSkKKwkJCXJldHVybiBFWFQyX0VUX0JBRF9JTk9ERV9OVU07CisJCWpfaW5vZGUgPSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgc2l6ZW9mKCpqX2lub2RlKSwKKwkJCQkJCSAiam91cm5hbCBpbm9kZSIpOworCQlpZiAoIWpfaW5vZGUpIHsKKwkJCXJldHZhbCA9IEVYVDJfRVRfTk9fTUVNT1JZOworCQkJZ290byBlcnJvdXQ7CisJCX0KKworCQlqX2lub2RlLT5pX2N0eCA9IGN0eDsKKwkJal9pbm9kZS0+aV9pbm8gPSBzYi0+c19qb3VybmFsX2ludW07CisKKwkJaWYgKChyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShjdHgtPmZzLAorCQkJCQkJc2ItPnNfam91cm5hbF9pbnVtLAorCQkJCQkJJmpfaW5vZGUtPmlfZXh0MikpKSB7CisJCXRyeV9iYWNrdXBfam91cm5hbDoKKwkJCWlmIChzYi0+c19qbmxfYmFja3VwX3R5cGUgIT0gRVhUM19KTkxfQkFDS1VQX0JMT0NLUyB8fAorCQkJICAgIHRyaWVkX2JhY2t1cF9qbmwpCisJCQkJZ290byBlcnJvdXQ7CisJCQltZW1zZXQoJmpfaW5vZGUtPmlfZXh0MiwgMCwgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7CisJCQltZW1jcHkoJmpfaW5vZGUtPmlfZXh0Mi5pX2Jsb2NrWzBdLCBzYi0+c19qbmxfYmxvY2tzLAorCQkJICAgICAgIEVYVDJfTl9CTE9DS1MqNCk7CisJCQlqX2lub2RlLT5pX2V4dDIuaV9zaXplID0gc2ItPnNfam5sX2Jsb2Nrc1sxNl07CisJCQlqX2lub2RlLT5pX2V4dDIuaV9saW5rc19jb3VudCA9IDE7CisJCQlqX2lub2RlLT5pX2V4dDIuaV9tb2RlID0gTElOVVhfU19JRlJFRyB8IDA2MDA7CisJCQl0cmllZF9iYWNrdXBfam5sKys7CisJCX0KKwkJaWYgKCFqX2lub2RlLT5pX2V4dDIuaV9saW5rc19jb3VudCB8fAorCQkgICAgIUxJTlVYX1NfSVNSRUcoal9pbm9kZS0+aV9leHQyLmlfbW9kZSkpIHsKKwkJCXJldHZhbCA9IEVYVDJfRVRfTk9fSk9VUk5BTDsKKwkJCWdvdG8gdHJ5X2JhY2t1cF9qb3VybmFsOworCQl9CisJCWlmIChqX2lub2RlLT5pX2V4dDIuaV9zaXplIC8gam91cm5hbC0+al9ibG9ja3NpemUgPAorCQkgICAgSkZTX01JTl9KT1VSTkFMX0JMT0NLUykgeworCQkJcmV0dmFsID0gRVhUMl9FVF9KT1VSTkFMX1RPT19TTUFMTDsKKwkJCWdvdG8gdHJ5X2JhY2t1cF9qb3VybmFsOworCQl9CisJCWZvciAoaT0wOyBpIDwgRVhUMl9OX0JMT0NLUzsgaSsrKSB7CisJCQlibGsgPSBqX2lub2RlLT5pX2V4dDIuaV9ibG9ja1tpXTsKKwkJCWlmICghYmxrKSB7CisJCQkJaWYgKGkgPCBFWFQyX05ESVJfQkxPQ0tTKSB7CisJCQkJCXJldHZhbCA9IEVYVDJfRVRfSk9VUk5BTF9UT09fU01BTEw7CisJCQkJCWdvdG8gdHJ5X2JhY2t1cF9qb3VybmFsOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChibGsgPCBzYi0+c19maXJzdF9kYXRhX2Jsb2NrIHx8CisJCQkgICAgYmxrID49IHNiLT5zX2Jsb2Nrc19jb3VudCkgeworCQkJCXJldHZhbCA9IEVYVDJfRVRfQkFEX0JMT0NLX05VTTsKKwkJCQlnb3RvIHRyeV9iYWNrdXBfam91cm5hbDsKKwkJCX0KKwkJfQorCQlqb3VybmFsLT5qX21heGxlbiA9IGpfaW5vZGUtPmlfZXh0Mi5pX3NpemUgLyBqb3VybmFsLT5qX2Jsb2Nrc2l6ZTsKKworI2lmZGVmIFVTRV9JTk9ERV9JTworCQlyZXR2YWwgPSBleHQyZnNfaW5vZGVfaW9faW50ZXJuMihjdHgtPmZzLCBzYi0+c19qb3VybmFsX2ludW0sCisJCQkJCQkgJmpfaW5vZGUtPmlfZXh0MiwKKwkJCQkJCSAmam91cm5hbF9uYW1lKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3V0OworCisJCWlvX3B0ciA9IGlub2RlX2lvX21hbmFnZXI7CisjZWxzZQorCQlqb3VybmFsLT5qX2lub2RlID0gal9pbm9kZTsKKwkJY3R4LT5qb3VybmFsX2lvID0gY3R4LT5mcy0+aW87CisJCWlmICgocmV0dmFsID0gam91cm5hbF9ibWFwKGpvdXJuYWwsIDAsICZzdGFydCkpICE9IDApCisJCQlnb3RvIGVycm91dDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWV4dF9qb3VybmFsID0gMTsKKwkJaWYgKCFjdHgtPmpvdXJuYWxfbmFtZSkgeworCQkJY2hhciB1dWlkWzM3XTsKKworCQkJdXVpZF91bnBhcnNlKHNiLT5zX2pvdXJuYWxfdXVpZCwgdXVpZCk7CisJCQljdHgtPmpvdXJuYWxfbmFtZSA9IGJsa2lkX2dldF9kZXZuYW1lKGN0eC0+YmxraWQsCisJCQkJCQkJICAgICAgIlVVSUQiLCB1dWlkKTsKKwkJCWlmICghY3R4LT5qb3VybmFsX25hbWUpCisJCQkJY3R4LT5qb3VybmFsX25hbWUgPSBibGtpZF9kZXZub190b19kZXZuYW1lKHNiLT5zX2pvdXJuYWxfZGV2KTsKKwkJfQorCQlqb3VybmFsX25hbWUgPSBjdHgtPmpvdXJuYWxfbmFtZTsKKworCQlpZiAoIWpvdXJuYWxfbmFtZSkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX0NBTlRfRklORF9KT1VSTkFMLCAmcGN0eCk7CisJCQlyZXR1cm4gRVhUMl9FVF9MT0FEX0VYVF9KT1VSTkFMOworCQl9CisKKwkJaW9fcHRyID0gdW5peF9pb19tYW5hZ2VyOworCX0KKworI2lmbmRlZiBVU0VfSU5PREVfSU8KKwlpZiAoZXh0X2pvdXJuYWwpCisjZW5kaWYKKwkJcmV0dmFsID0gaW9fcHRyLT5vcGVuKGpvdXJuYWxfbmFtZSwgSU9fRkxBR19SVywKKwkJCQkgICAgICAmY3R4LT5qb3VybmFsX2lvKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKworCWlvX2NoYW5uZWxfc2V0X2Jsa3NpemUoY3R4LT5qb3VybmFsX2lvLCBjdHgtPmZzLT5ibG9ja3NpemUpOworCisJaWYgKGV4dF9qb3VybmFsKSB7CisJCWlmIChjdHgtPmZzLT5ibG9ja3NpemUgPT0gMTAyNCkKKwkJCXN0YXJ0ID0gMTsKKwkJYmggPSBnZXRibGsoZGV2X2pvdXJuYWwsIHN0YXJ0LCBjdHgtPmZzLT5ibG9ja3NpemUpOworCQlpZiAoIWJoKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX05PX01FTU9SWTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCWlmICgocmV0dmFsID0gYmgtPmJfZXJyKSAhPSAwKQorCQkJZ290byBlcnJvdXQ7CisJCW1lbWNweSgmanN1cGVyLCBzdGFydCA/IGJoLT5iX2RhdGEgOiAgYmgtPmJfZGF0YSArIDEwMjQsCisJCSAgICAgICBzaXplb2YoanN1cGVyKSk7CisJCWJyZWxzZShiaCk7CisjaWYgQkJfQklHX0VORElBTgorCQlpZiAoanN1cGVyLnNfbWFnaWMgPT0gZXh0MmZzX3N3YWIxNihFWFQyX1NVUEVSX01BR0lDKSkKKwkJCWV4dDJmc19zd2FwX3N1cGVyKCZqc3VwZXIpOworI2VuZGlmCisJCWlmIChqc3VwZXIuc19tYWdpYyAhPSBFWFQyX1NVUEVSX01BR0lDIHx8CisJCSAgICAhKGpzdXBlci5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYpKSB7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzBfRVhUX0pPVVJOQUxfQkFEX1NVUEVSLCAmcGN0eCk7CisJCQlyZXR2YWwgPSBFWFQyX0VUX0xPQURfRVhUX0pPVVJOQUw7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQkvKiBNYWtlIHN1cmUgdGhlIGpvdXJuYWwgVVVJRCBpcyBjb3JyZWN0ICovCisJCWlmIChtZW1jbXAoanN1cGVyLnNfdXVpZCwgY3R4LT5mcy0+c3VwZXItPnNfam91cm5hbF91dWlkLAorCQkJICAgc2l6ZW9mKGpzdXBlci5zX3V1aWQpKSkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX0pPVVJOQUxfQkFEX1VVSUQsICZwY3R4KTsKKwkJCXJldHZhbCA9IEVYVDJfRVRfTE9BRF9FWFRfSk9VUk5BTDsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisKKwkJam91cm5hbC0+al9tYXhsZW4gPSBqc3VwZXIuc19ibG9ja3NfY291bnQ7CisJCXN0YXJ0Kys7CisJfQorCisJaWYgKCEoYmggPSBnZXRibGsoZGV2X2pvdXJuYWwsIHN0YXJ0LCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSkpKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfTk9fTUVNT1JZOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOworCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7CisKKyNpZmRlZiBVU0VfSU5PREVfSU8KKwlleHQyZnNfZnJlZV9tZW0oJmpfaW5vZGUpOworI2VuZGlmCisKKwkqcmV0X2pvdXJuYWwgPSBqb3VybmFsOworCXJldHVybiAwOworCitlcnJvdXQ6CisJZXh0MmZzX2ZyZWVfbWVtKCZkZXZfZnMpOworCWV4dDJmc19mcmVlX21lbSgmal9pbm9kZSk7CisJZXh0MmZzX2ZyZWVfbWVtKCZqb3VybmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZXJyY29kZV90IGUyZnNja19qb3VybmFsX2ZpeF9iYWRfaW5vZGUoZTJmc2NrX3QgY3R4LAorCQkJCQkgICAgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYiA9IGN0eC0+ZnMtPnN1cGVyOworCWludCByZWNvdmVyID0gY3R4LT5mcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJCUVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSOworCWludCBoYXNfam91cm5hbCA9IGN0eC0+ZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYKKwkJRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTDsKKworCWlmIChoYXNfam91cm5hbCB8fCBzYi0+c19qb3VybmFsX2ludW0pIHsKKwkJLyogVGhlIGpvdXJuYWwgaW5vZGUgaXMgYm9ndXMsIHJlbW92ZSBhbmQgZm9yY2UgZnVsbCBmc2NrICovCisJCXBjdHgtPmlubyA9IHNiLT5zX2pvdXJuYWxfaW51bTsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX0JBRF9JTk9ERSwgcGN0eCkpIHsKKwkJCWlmIChoYXNfam91cm5hbCAmJiBzYi0+c19qb3VybmFsX2ludW0pCisJCQkJcHJpbnRmKCIqKiogZXh0MyBqb3VybmFsIGhhcyBiZWVuIGRlbGV0ZWQgLSAiCisJCQkJICAgICAgICJmaWxlc3lzdGVtIGlzIG5vdyBleHQyIG9ubHkgKioqXG5cbiIpOworCQkJc2ItPnNfZmVhdHVyZV9jb21wYXQgJj0gfkVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUw7CisJCQlzYi0+c19qb3VybmFsX2ludW0gPSAwOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19KT1VSTkFMX0lOT0RFOyAvKiBGSVhNRTogdG9kbyAqLworCQkJZTJmc2NrX2NsZWFyX3JlY292ZXIoY3R4LCAxKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiBFWFQyX0VUX0JBRF9JTk9ERV9OVU07CisJfSBlbHNlIGlmIChyZWNvdmVyKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzBfSk9VUk5BTF9SRUNPVkVSX1NFVCwgcGN0eCkpIHsKKwkJCWUyZnNja19jbGVhcl9yZWNvdmVyKGN0eCwgMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gRVhUMl9FVF9VTlNVUFBfRkVBVFVSRTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVjFfU0JfU0laRSAgICAgIDB4MDAyNAorc3RhdGljIHZvaWQgY2xlYXJfdjJfam91cm5hbF9maWVsZHMoam91cm5hbF90ICpqb3VybmFsKQoreworCWUyZnNja190IGN0eCA9IGpvdXJuYWwtPmpfZGV2LT5rX2N0eDsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzBfQ0xFQVJfVjJfSk9VUk5BTCwgJnBjdHgpKQorCQlyZXR1cm47CisKKwltZW1zZXQoKChjaGFyICopIGpvdXJuYWwtPmpfc3VwZXJibG9jaykgKyBWMV9TQl9TSVpFLCAwLAorCSAgICAgICBjdHgtPmZzLT5ibG9ja3NpemUtVjFfU0JfU0laRSk7CisJbWFya19idWZmZXJfZGlydHkoam91cm5hbC0+al9zYl9idWZmZXIpOworfQorCisKK3N0YXRpYyBlcnJjb2RlX3QgZTJmc2NrX2pvdXJuYWxfbG9hZChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJZTJmc2NrX3QgY3R4ID0gam91cm5hbC0+al9kZXYtPmtfY3R4OworCWpvdXJuYWxfc3VwZXJibG9ja190ICpqc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpqYmggPSBqb3VybmFsLT5qX3NiX2J1ZmZlcjsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJbGxfcndfYmxvY2soUkVBRCwgMSwgJmpiaCk7CisJaWYgKGpiaC0+Yl9lcnIpIHsKKwkJYmJfZXJyb3JfbXNnKF8oInJlYWRpbmcgam91cm5hbCBzdXBlcmJsb2NrIikpOworCQlyZXR1cm4gamJoLT5iX2VycjsKKwl9CisKKwlqc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisJLyogSWYgd2UgZG9uJ3QgZXZlbiBoYXZlIEpGU19NQUdJQywgd2UgcHJvYmFibHkgaGF2ZSBhIHdyb25nIGlub2RlICovCisJaWYgKGpzYi0+c19oZWFkZXIuaF9tYWdpYyAhPSBodG9ubChKRlNfTUFHSUNfTlVNQkVSKSkKKwkJcmV0dXJuIGUyZnNja19qb3VybmFsX2ZpeF9iYWRfaW5vZGUoY3R4LCAmcGN0eCk7CisKKwlzd2l0Y2ggKG50b2hsKGpzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUpKSB7CisJY2FzZSBKRlNfU1VQRVJCTE9DS19WMToKKwkJam91cm5hbC0+al9mb3JtYXRfdmVyc2lvbiA9IDE7CisJCWlmIChqc2ItPnNfZmVhdHVyZV9jb21wYXQgfHwKKwkJICAgIGpzYi0+c19mZWF0dXJlX2luY29tcGF0IHx8CisJCSAgICBqc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgfHwKKwkJICAgIGpzYi0+c19ucl91c2VycykKKwkJCWNsZWFyX3YyX2pvdXJuYWxfZmllbGRzKGpvdXJuYWwpOworCQlicmVhazsKKworCWNhc2UgSkZTX1NVUEVSQkxPQ0tfVjI6CisJCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAyOworCQlpZiAobnRvaGwoanNiLT5zX25yX3VzZXJzKSA+IDEgJiYKKwkJICAgIHV1aWRfaXNfbnVsbChjdHgtPmZzLT5zdXBlci0+c19qb3VybmFsX3V1aWQpKQorCQkJY2xlYXJfdjJfam91cm5hbF9maWVsZHMoam91cm5hbCk7CisJCWlmIChudG9obChqc2ItPnNfbnJfdXNlcnMpID4gMSkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX0pPVVJOQUxfVU5TVVBQX01VTFRJRlMsICZwY3R4KTsKKwkJCXJldHVybiBFWFQyX0VUX0pPVVJOQUxfVU5TVVBQX1ZFUlNJT047CisJCX0KKwkJYnJlYWs7CisKKwkvKgorCSAqIFRoZXNlIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gYSBqb3VybmFsIHN1cGVyIGJsb2NrLCBzbyBpZgorCSAqIHRoZXkgZG8sIHRoZSBqb3VybmFsIGlzIGJhZGx5IGNvcnJ1cHRlZC4KKwkgKi8KKwljYXNlIEpGU19ERVNDUklQVE9SX0JMT0NLOgorCWNhc2UgSkZTX0NPTU1JVF9CTE9DSzoKKwljYXNlIEpGU19SRVZPS0VfQkxPQ0s6CisJCXJldHVybiBFWFQyX0VUX0NPUlJVUFRfU1VQRVJCTE9DSzsKKworCS8qIElmIHdlIGRvbid0IHVuZGVyc3RhbmQgdGhlIHN1cGVyYmxvY2sgbWFqb3IgdHlwZSwgYnV0IHRoZXJlCisJICogaXMgYSBtYWdpYyBudW1iZXIsIHRoZW4gaXQgaXMgbGlrZWx5IHRvIGJlIGEgbmV3IGZvcm1hdCB3ZQorCSAqIGp1c3QgZG9uJ3QgdW5kZXJzdGFuZCwgc28gbGVhdmUgaXQgYWxvbmUuICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIEVYVDJfRVRfSk9VUk5BTF9VTlNVUFBfVkVSU0lPTjsKKwl9CisKKwlpZiAoSkZTX0hBU19JTkNPTVBBVF9GRUFUVVJFKGpvdXJuYWwsIH5KRlNfS05PV05fSU5DT01QQVRfRkVBVFVSRVMpKQorCQlyZXR1cm4gRVhUMl9FVF9VTlNVUFBfRkVBVFVSRTsKKworCWlmIChKRlNfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKGpvdXJuYWwsIH5KRlNfS05PV05fUk9DT01QQVRfRkVBVFVSRVMpKQorCQlyZXR1cm4gRVhUMl9FVF9ST19VTlNVUFBfRkVBVFVSRTsKKworCS8qIFdlIGhhdmUgbm93IGNoZWNrZWQgd2hldGhlciB3ZSBrbm93IGVub3VnaCBhYm91dCB0aGUgam91cm5hbAorCSAqIGZvcm1hdCB0byBiZSBhYmxlIHRvIHByb2NlZWQgc2FmZWx5LCBzbyBhbnkgb3RoZXIgY2hlY2tzIHRoYXQKKwkgKiBmYWlsIHdlIHNob3VsZCBhdHRlbXB0IHRvIHJlY292ZXIgZnJvbS4gKi8KKwlpZiAoanNiLT5zX2Jsb2Nrc2l6ZSAhPSBodG9ubChqb3VybmFsLT5qX2Jsb2Nrc2l6ZSkpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIiVzOiBubyB2YWxpZCBqb3VybmFsIHN1cGVyYmxvY2sgZm91bmQiKSwKKwkJCWN0eC0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gRVhUMl9FVF9DT1JSVVBUX1NVUEVSQkxPQ0s7CisJfQorCisJaWYgKG50b2hsKGpzYi0+c19tYXhsZW4pIDwgam91cm5hbC0+al9tYXhsZW4pCisJCWpvdXJuYWwtPmpfbWF4bGVuID0gbnRvaGwoanNiLT5zX21heGxlbik7CisJZWxzZSBpZiAobnRvaGwoanNiLT5zX21heGxlbikgPiBqb3VybmFsLT5qX21heGxlbikgeworCQliYl9lcnJvcl9tc2coXygiJXM6IGpvdXJuYWwgdG9vIHNob3J0IiksCisJCQljdHgtPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIEVYVDJfRVRfQ09SUlVQVF9TVVBFUkJMT0NLOworCX0KKworCWpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSA9IG50b2hsKGpzYi0+c19zZXF1ZW5jZSk7CisJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9IGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZTsKKwlqb3VybmFsLT5qX3RhaWwgPSBudG9obChqc2ItPnNfc3RhcnQpOworCWpvdXJuYWwtPmpfZmlyc3QgPSBudG9obChqc2ItPnNfZmlyc3QpOworCWpvdXJuYWwtPmpfbGFzdCA9IG50b2hsKGpzYi0+c19tYXhsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGUyZnNja19qb3VybmFsX3Jlc2V0X3N1cGVyKGUyZnNja190IGN0eCwgam91cm5hbF9zdXBlcmJsb2NrX3QgKmpzYiwKKwkJCQkgICAgICAgam91cm5hbF90ICpqb3VybmFsKQoreworCWNoYXIgKnA7CisJdW5pb24geworCQl1dWlkX3QgdXVpZDsKKwkJX191MzIgdmFsWzRdOworCX0gdTsKKwlfX3UzMiBuZXdfc2VxID0gMDsKKwlpbnQgaTsKKworCS8qIExlYXZlIGEgdmFsaWQgZXhpc3RpbmcgVjEgc3VwZXJibG9jayBzaWduYXR1cmUgYWxvbmUuCisJICogQW55dGhpbmcgdW5yZWNvZ25pemFibGUgd2Ugb3ZlcndyaXRlIHdpdGggYSBuZXcgVjIKKwkgKiBzaWduYXR1cmUuICovCisKKwlpZiAoanNiLT5zX2hlYWRlci5oX21hZ2ljICE9IGh0b25sKEpGU19NQUdJQ19OVU1CRVIpIHx8CisJICAgIGpzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUgIT0gaHRvbmwoSkZTX1NVUEVSQkxPQ0tfVjEpKSB7CisJCWpzYi0+c19oZWFkZXIuaF9tYWdpYyA9IGh0b25sKEpGU19NQUdJQ19OVU1CRVIpOworCQlqc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlID0gaHRvbmwoSkZTX1NVUEVSQkxPQ0tfVjIpOworCX0KKworCS8qIFplcm8gb3V0IGV2ZXJ5dGhpbmcgZWxzZSBiZXlvbmQgdGhlIHN1cGVyYmxvY2sgaGVhZGVyICovCisKKwlwID0gKChjaGFyICopIGpzYikgKyBzaXplb2Yoam91cm5hbF9oZWFkZXJfdCk7CisJbWVtc2V0IChwLCAwLCBjdHgtPmZzLT5ibG9ja3NpemUtc2l6ZW9mKGpvdXJuYWxfaGVhZGVyX3QpKTsKKworCWpzYi0+c19ibG9ja3NpemUgPSBodG9ubChjdHgtPmZzLT5ibG9ja3NpemUpOworCWpzYi0+c19tYXhsZW4gPSBodG9ubChqb3VybmFsLT5qX21heGxlbik7CisJanNiLT5zX2ZpcnN0ID0gaHRvbmwoMSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBqb3VybmFsIHNlcXVlbmNlIG51bWJlciBzbyB0aGF0IHRoZXJlIGlzICJubyIKKwkgKiBjaGFuY2Ugd2Ugd2lsbCBmaW5kIG9sZCAidmFsaWQiIHRyYW5zYWN0aW9ucyBpbiB0aGUgam91cm5hbC4KKwkgKiBUaGlzIGF2b2lkcyB0aGUgbmVlZCB0byB6ZXJvIHRoZSB3aG9sZSBqb3VybmFsIChzbG93IHRvIGRvLAorCSAqIGFuZCByaXNreSB3aGVuIHdlIGFyZSBqdXN0IHJlY292ZXJpbmcgdGhlIGZpbGVzeXN0ZW0pLgorCSAqLworCXV1aWRfZ2VuZXJhdGUodS51dWlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykKKwkJbmV3X3NlcSBePSB1LnZhbFtpXTsKKwlqc2ItPnNfc2VxdWVuY2UgPSBodG9ubChuZXdfc2VxKTsKKworCW1hcmtfYnVmZmVyX2RpcnR5KGpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKKwlsbF9yd19ibG9jayhXUklURSwgMSwgJmpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKK30KKworc3RhdGljIGVycmNvZGVfdCBlMmZzY2tfam91cm5hbF9maXhfY29ycnVwdF9zdXBlcihlMmZzY2tfdCBjdHgsCisJCQkJCQkgIGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkJCSAgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlpbnQgcmVjb3ZlciA9IGN0eC0+ZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCQlFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUjsKKworCWlmIChzYi0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX0JBRF9TVVBFUiwgcGN0eCkpIHsKKwkJCWUyZnNja19qb3VybmFsX3Jlc2V0X3N1cGVyKGN0eCwgam91cm5hbC0+al9zdXBlcmJsb2NrLAorCQkJCQkJICAgam91cm5hbCk7CisJCQlqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlID0gMTsKKwkJCWUyZnNja19jbGVhcl9yZWNvdmVyKGN0eCwgcmVjb3Zlcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gRVhUMl9FVF9DT1JSVVBUX1NVUEVSQkxPQ0s7CisJfSBlbHNlIGlmIChlMmZzY2tfam91cm5hbF9maXhfYmFkX2lub2RlKGN0eCwgcGN0eCkpCisJCXJldHVybiBFWFQyX0VUX0NPUlJVUFRfU1VQRVJCTE9DSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlMmZzY2tfam91cm5hbF9yZWxlYXNlKGUyZnNja190IGN0eCwgam91cm5hbF90ICpqb3VybmFsLAorCQkJCSAgIGludCByZXNldCwgaW50IGRyb3ApCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKmpzYjsKKworCWlmIChkcm9wKQorCQltYXJrX2J1ZmZlcl9jbGVhbihqb3VybmFsLT5qX3NiX2J1ZmZlcik7CisJZWxzZSBpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSkgeworCQlqc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisJCWpzYi0+c19zZXF1ZW5jZSA9IGh0b25sKGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UpOworCQlpZiAocmVzZXQpCisJCQlqc2ItPnNfc3RhcnQgPSAwOyAvKiB0aGlzIG1hcmtzIHRoZSBqb3VybmFsIGFzIGVtcHR5ICovCisJCW1hcmtfYnVmZmVyX2RpcnR5KGpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKKwl9CisJYnJlbHNlKGpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKKworCWlmIChjdHgtPmpvdXJuYWxfaW8pIHsKKwkJaWYgKGN0eC0+ZnMgJiYgY3R4LT5mcy0+aW8gIT0gY3R4LT5qb3VybmFsX2lvKQorCQkJaW9fY2hhbm5lbF9jbG9zZShjdHgtPmpvdXJuYWxfaW8pOworCQljdHgtPmpvdXJuYWxfaW8gPSAwOworCX0KKworI2lmbmRlZiBVU0VfSU5PREVfSU8KKwlleHQyZnNfZnJlZV9tZW0oJmpvdXJuYWwtPmpfaW5vZGUpOworI2VuZGlmCisJZXh0MmZzX2ZyZWVfbWVtKCZqb3VybmFsLT5qX2ZzX2Rldik7CisJZXh0MmZzX2ZyZWVfbWVtKCZqb3VybmFsKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHRoZSBzdXBlcmJsb2NrIGZpZWxkcyByZWdhcmRpbmcgdGhlCisgKiBqb3VybmFsIGFyZSBjb25zaXN0ZW50LgorICovCitzdGF0aWMgaW50IGUyZnNja19jaGVja19leHQzX2pvdXJuYWwoZTJmc2NrX3QgY3R4KQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYiA9IGN0eC0+ZnMtPnN1cGVyOworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgcmVjb3ZlciA9IGN0eC0+ZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCQlFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUjsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisJcHJvYmxlbV90IHByb2JsZW07CisJaW50IHJlc2V0ID0gMCwgZm9yY2VfZnNjayA9IDA7CisJaW50IHJldHZhbDsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgYW55IGpvdXJuYWwgZmVhdHVyZXMsIGRvbid0IGRvIGFueXRoaW5nIG1vcmUgKi8KKwlpZiAoIShzYi0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpICYmCisJICAgICFyZWNvdmVyICYmIHNiLT5zX2pvdXJuYWxfaW51bSA9PSAwICYmIHNiLT5zX2pvdXJuYWxfZGV2ID09IDAgJiYKKwkgICAgdXVpZF9pc19udWxsKHNiLT5zX2pvdXJuYWxfdXVpZCkpCisJCXJldHVybiAwOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwlwY3R4Lm51bSA9IHNiLT5zX2pvdXJuYWxfaW51bTsKKworCXJldHZhbCA9IGUyZnNja19nZXRfam91cm5hbChjdHgsICZqb3VybmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCWlmICgocmV0dmFsID09IEVYVDJfRVRfQkFEX0lOT0RFX05VTSkgfHwKKwkJICAgIChyZXR2YWwgPT0gRVhUMl9FVF9CQURfQkxPQ0tfTlVNKSB8fAorCQkgICAgKHJldHZhbCA9PSBFWFQyX0VUX0pPVVJOQUxfVE9PX1NNQUxMKSB8fAorCQkgICAgKHJldHZhbCA9PSBFWFQyX0VUX05PX0pPVVJOQUwpKQorCQkJcmV0dXJuIGUyZnNja19qb3VybmFsX2ZpeF9iYWRfaW5vZGUoY3R4LCAmcGN0eCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gZTJmc2NrX2pvdXJuYWxfbG9hZChqb3VybmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCWlmICgocmV0dmFsID09IEVYVDJfRVRfQ09SUlVQVF9TVVBFUkJMT0NLKSB8fAorCQkgICAgKChyZXR2YWwgPT0gRVhUMl9FVF9VTlNVUFBfRkVBVFVSRSkgJiYKKwkJICAgICghZml4X3Byb2JsZW0oY3R4LCBQUl8wX0pPVVJOQUxfVU5TVVBQX0lOQ09NUEFULAorCQkJCSAgJnBjdHgpKSkgfHwKKwkJICAgICgocmV0dmFsID09IEVYVDJfRVRfUk9fVU5TVVBQX0ZFQVRVUkUpICYmCisJCSAgICAoIWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX1VOU1VQUF9ST0NPTVBBVCwKKwkJCQkgICZwY3R4KSkpIHx8CisJCSAgICAoKHJldHZhbCA9PSBFWFQyX0VUX0pPVVJOQUxfVU5TVVBQX1ZFUlNJT04pICYmCisJCSAgICAoIWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX1VOU1VQUF9WRVJTSU9OLCAmcGN0eCkpKSkKKwkJCXJldHZhbCA9IGUyZnNja19qb3VybmFsX2ZpeF9jb3JydXB0X3N1cGVyKGN0eCwgam91cm5hbCwKKwkJCQkJCQkJICAmcGN0eCk7CisJCWUyZnNja19qb3VybmFsX3JlbGVhc2UoY3R4LCBqb3VybmFsLCAwLCAxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKgorCSAqIFdlIHdhbnQgdG8gbWFrZSB0aGUgZmxhZ3MgY29uc2lzdGVudCBoZXJlLiAgV2Ugd2lsbCBub3QgbGVhdmUgd2l0aAorCSAqIG5lZWRzX3JlY292ZXJ5IHNldCBidXQgaGFzX2pvdXJuYWwgY2xlYXIuICBXZSBjYW4ndCBnZXQgaW4gYSBsb29wCisJICogd2l0aCAteSwgLW4sIG9yIC1wLCBvbmx5IGlmIGEgdXNlciBpc24ndCBtYWtpbmcgdXAgdGhlaXIgbWluZC4KKwkgKi8KK25vX2hhc19qb3VybmFsOgorCWlmICghKHNiLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpIHsKKwkJcmVjb3ZlciA9IHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUjsKKwkJcGN0eC5zdHIgPSAiaW5vZGUiOworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8wX0pPVVJOQUxfSEFTX0pPVVJOQUwsICZwY3R4KSkgeworCQkJaWYgKHJlY292ZXIgJiYKKwkJCSAgICAhZml4X3Byb2JsZW0oY3R4LCBQUl8wX0pPVVJOQUxfUkVDT1ZFUl9TRVQsICZwY3R4KSkKKwkJCQlnb3RvIG5vX2hhc19qb3VybmFsOworCQkJLyoKKwkJCSAqIE5lZWQgYSBmdWxsIGZzY2sgaWYgd2UgYXJlIHJlbGVhc2luZyBhCisJCQkgKiBqb3VybmFsIHN0b3JlZCBvbiBhIHJlc2VydmVkIGlub2RlLgorCQkJICovCisJCQlmb3JjZV9mc2NrID0gcmVjb3ZlciB8fAorCQkJCShzYi0+c19qb3VybmFsX2ludW0gPCBFWFQyX0ZJUlNUX0lOT0RFKHNiKSk7CisJCQkvKiBDbGVhciBhbGwgb2YgdGhlIGpvdXJuYWwgZmllbGRzICovCisJCQlzYi0+c19qb3VybmFsX2ludW0gPSAwOworCQkJc2ItPnNfam91cm5hbF9kZXYgPSAwOworCQkJbWVtc2V0KHNiLT5zX2pvdXJuYWxfdXVpZCwgMCwKKwkJCSAgICAgICBzaXplb2Yoc2ItPnNfam91cm5hbF91dWlkKSk7CisJCQllMmZzY2tfY2xlYXJfcmVjb3ZlcihjdHgsIGZvcmNlX2ZzY2spOworCQl9IGVsc2UgaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkpIHsKKwkJCXNiLT5zX2ZlYXR1cmVfY29tcGF0IHw9IEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUw7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShjdHgtPmZzKTsKKwkJfQorCX0KKworCWlmIChzYi0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgJiYKKwkgICAgIShzYi0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpICYmCisJICAgIGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19zdGFydCAhPSAwKSB7CisJCS8qIFByaW50IHN0YXR1cyBpbmZvcm1hdGlvbiAqLworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzBfSk9VUk5BTF9SRUNPVkVSWV9DTEVBUiwgJnBjdHgpOworCQlpZiAoY3R4LT5zdXBlcmJsb2NrKQorCQkJcHJvYmxlbSA9IFBSXzBfSk9VUk5BTF9SVU5fREVGQVVMVDsKKwkJZWxzZQorCQkJcHJvYmxlbSA9IFBSXzBfSk9VUk5BTF9SVU47CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIHByb2JsZW0sICZwY3R4KSkgeworCQkJY3R4LT5vcHRpb25zIHw9IEUyRl9PUFRfRk9SQ0U7CisJCQlzYi0+c19mZWF0dXJlX2luY29tcGF0IHw9CisJCQkJRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVI7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShjdHgtPmZzKTsKKwkJfSBlbHNlIGlmIChmaXhfcHJvYmxlbShjdHgsCisJCQkJICAgICAgIFBSXzBfSk9VUk5BTF9SRVNFVF9KT1VSTkFMLCAmcGN0eCkpIHsKKwkJCXJlc2V0ID0gMTsKKwkJCXNiLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoY3R4LT5mcyk7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIHVzZXIgYW5zd2VycyBubyB0byB0aGUgYWJvdmUgcXVlc3Rpb24sIHdlCisJCSAqIGlnbm9yZSB0aGUgZmFjdCB0aGF0IGpvdXJuYWwgYXBwYXJlbnRseSBoYXMgZGF0YTsKKwkJICogYWNjaWRlbnRhbGx5IHJlcGxheWluZyBvdmVyIHZhbGlkIGRhdGEgd291bGQgYmUgZmFyCisJCSAqIHdvcnNlIHRoYW4gc2tpcHBpbmcgYSBxdWVzdGlvbmFibGUgcmVjb3ZlcnkuCisJCSAqCisJCSAqIFhYWCBzaG91bGQgd2UgYWJvcnQgd2l0aCBhIGZhdGFsIGVycm9yIGhlcmU/ICBXaGF0CisJCSAqIHdpbGwgdGhlIGV4dDMga2VybmVsIGNvZGUgZG8gaWYgYSBmaWxlc3lzdGVtIHdpdGgKKwkJICogIU5FRURTX1JFQ09WRVJZIGJ1dCB3aXRoIGEgbm9uLXplcm8KKwkJICogam91cm5hbC0+al9zdXBlcmJsb2NrLT5zX3N0YXJ0IGlzIG1vdW50ZWQ/CisJCSAqLworCX0KKworCWUyZnNja19qb3VybmFsX3JlbGVhc2UoY3R4LCBqb3VybmFsLCByZXNldCwgMCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCByZWNvdmVyX2V4dDNfam91cm5hbChlMmZzY2tfdCBjdHgpCit7CisJam91cm5hbF90ICpqb3VybmFsOworCWludCByZXR2YWw7CisKKwlqb3VybmFsX2luaXRfcmV2b2tlX2NhY2hlcygpOworCXJldHZhbCA9IGUyZnNja19nZXRfam91cm5hbChjdHgsICZqb3VybmFsKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dmFsID0gZTJmc2NrX2pvdXJuYWxfbG9hZChqb3VybmFsKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKworCXJldHZhbCA9IGpvdXJuYWxfaW5pdF9yZXZva2Uoam91cm5hbCwgMTAyNCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisKKwlyZXR2YWwgPSAtam91cm5hbF9yZWNvdmVyKGpvdXJuYWwpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCisJaWYgKGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19lcnJubykgeworCQljdHgtPmZzLT5zdXBlci0+c19zdGF0ZSB8PSBFWFQyX0VSUk9SX0ZTOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShjdHgtPmZzKTsKKwkJam91cm5hbC0+al9zdXBlcmJsb2NrLT5zX2Vycm5vID0gMDsKKwkJbWFya19idWZmZXJfZGlydHkoam91cm5hbC0+al9zYl9idWZmZXIpOworCX0KKworZXJyb3V0OgorCWpvdXJuYWxfZGVzdHJveV9yZXZva2Uoam91cm5hbCk7CisJam91cm5hbF9kZXN0cm95X3Jldm9rZV9jYWNoZXMoKTsKKwllMmZzY2tfam91cm5hbF9yZWxlYXNlKGN0eCwgam91cm5hbCwgMSwgMCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBlMmZzY2tfcnVuX2V4dDNfam91cm5hbChlMmZzY2tfdCBjdHgpCit7CisJaW9fbWFuYWdlciBpb19wdHIgPSBjdHgtPmZzLT5pby0+bWFuYWdlcjsKKwlpbnQgYmxvY2tzaXplID0gY3R4LT5mcy0+YmxvY2tzaXplOworCWVycmNvZGVfdCAgICAgICByZXR2YWwsIHJlY292ZXJfcmV0dmFsOworCisJcHJpbnRmKF8oIiVzOiByZWNvdmVyaW5nIGpvdXJuYWxcbiIpLCBjdHgtPmRldmljZV9uYW1lKTsKKwlpZiAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgeworCQlwcmludGYoXygiJXM6IHdvbid0IGRvIGpvdXJuYWwgcmVjb3Zlcnkgd2hpbGUgcmVhZC1vbmx5XG4iKSwKKwkJICAgICAgIGN0eC0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gRVhUMl9FVF9GSUxFX1JPOworCX0KKworCWlmIChjdHgtPmZzLT5mbGFncyAmIEVYVDJfRkxBR19ESVJUWSkKKwkJZXh0MmZzX2ZsdXNoKGN0eC0+ZnMpOyAgLyogRm9yY2Ugb3V0IGFueSBtb2RpZmljYXRpb25zICovCisKKwlyZWNvdmVyX3JldHZhbCA9IHJlY292ZXJfZXh0M19qb3VybmFsKGN0eCk7CisKKwkvKgorCSAqIFJlbG9hZCB0aGUgZmlsZXN5c3RlbSBjb250ZXh0IHRvIGdldCB1cC10by1kYXRlIGRhdGEgZnJvbSBkaXNrCisJICogYmVjYXVzZSBqb3VybmFsIHJlY292ZXJ5IHdpbGwgY2hhbmdlIHRoZSBmaWxlc3lzdGVtIHVuZGVyIHVzLgorCSAqLworCWV4dDJmc19jbG9zZShjdHgtPmZzKTsKKwlyZXR2YWwgPSBleHQyZnNfb3BlbihjdHgtPmZpbGVzeXN0ZW1fbmFtZSwgRVhUMl9GTEFHX1JXLAorCQkJICAgICBjdHgtPnN1cGVyYmxvY2ssIGJsb2Nrc2l6ZSwgaW9fcHRyLAorCQkJICAgICAmY3R4LT5mcyk7CisKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSB0cnlpbmcgdG8gcmUtb3BlbiAlcyIpLAorCQkJY3R4LT5kZXZpY2VfbmFtZSk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCX0KKwljdHgtPmZzLT5wcml2X2RhdGEgPSBjdHg7CisKKwkvKiBTZXQgdGhlIHN1cGVyYmxvY2sgZmxhZ3MgKi8KKwllMmZzY2tfY2xlYXJfcmVjb3ZlcihjdHgsIHJlY292ZXJfcmV0dmFsKTsKKwlyZXR1cm4gcmVjb3Zlcl9yZXR2YWw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbW92ZSB0aGUgam91cm5hbCBpbm9kZSBmcm9tIGEgdmlzaWJsZSBmaWxlIGluCisgKiB0aGUgZmlsZXN5c3RlbSBkaXJlY3RvcnkgaGllcmFyY2h5IHRvIHRoZSByZXNlcnZlZCBpbm9kZSBpZiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBqb3VybmFsX25hbWVzW10gPSB7CisJIi5qb3VybmFsIiwgImpvdXJuYWwiLCAiLmpvdXJuYWwuZGF0IiwgImpvdXJuYWwuZGF0IiwgMCB9OworCitzdGF0aWMgdm9pZCBlMmZzY2tfbW92ZV9leHQzX2pvdXJuYWwoZTJmc2NrX3QgY3R4KQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYiA9IGN0eC0+ZnMtPnN1cGVyOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJZXh0Ml9maWxzeXMgICAgICAgICAgICAgZnMgPSBjdHgtPmZzOworCWV4dDJfaW5vX3QgICAgICAgICAgICAgIGlubzsKKwllcnJjb2RlX3QgICAgICAgICAgICAgICByZXR2YWw7CisJY29uc3QgY2hhciAqY29uc3QgKiAgICBjcHA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgZ3JvdXAsIG1vdW50X2ZsYWdzOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCS8qCisJICogSWYgdGhlIGZpbGVzeXN0ZW0gaXMgb3BlbmVkIHJlYWQtb25seSwgb3IgdGhlcmUgaXMgbm8KKwkgKiBqb3VybmFsLCB0aGVuIGRvIG5vdGhpbmcuCisJICovCisJaWYgKChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSB8fAorCSAgICAoc2ItPnNfam91cm5hbF9pbnVtID09IDApIHx8CisJICAgICEoc2ItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBSZWFkIGluIHRoZSBqb3VybmFsIGlub2RlCisJICovCisJaWYgKGV4dDJmc19yZWFkX2lub2RlKGZzLCBzYi0+c19qb3VybmFsX2ludW0sICZpbm9kZSkgIT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiBpdCdzIG5lY2Vzc2FyeSB0byBiYWNrdXAgdGhlIGpvdXJuYWwgaW5vZGUsIGRvIHNvLgorCSAqLworCWlmICgoc2ItPnNfam5sX2JhY2t1cF90eXBlID09IDApIHx8CisJICAgICgoc2ItPnNfam5sX2JhY2t1cF90eXBlID09IEVYVDNfSk5MX0JBQ0tVUF9CTE9DS1MpICYmCisJICAgICBtZW1jbXAoaW5vZGUuaV9ibG9jaywgc2ItPnNfam5sX2Jsb2NrcywgRVhUMl9OX0JMT0NLUyo0KSkpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9CQUNLVVBfSk5MLCAmcGN0eCkpIHsKKwkJCW1lbWNweShzYi0+c19qbmxfYmxvY2tzLCBpbm9kZS5pX2Jsb2NrLAorCQkJICAgICAgIEVYVDJfTl9CTE9DS1MqNCk7CisJCQlzYi0+c19qbmxfYmxvY2tzWzE2XSA9IGlub2RlLmlfc2l6ZTsKKwkJCXNiLT5zX2pubF9iYWNrdXBfdHlwZSA9IEVYVDNfSk5MX0JBQ0tVUF9CTE9DS1M7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCQlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19NQVNURVJfU0JfT05MWTsKKwkJfQorCX0KKworCS8qCisJICogSWYgdGhlIGpvdXJuYWwgaXMgYWxyZWFkeSB0aGUgaGlkZGVuIGlub2RlLCB0aGVuIGRvIG5vdGhpbmcKKwkgKi8KKwlpZiAoc2ItPnNfam91cm5hbF9pbnVtID09IEVYVDJfSk9VUk5BTF9JTk8pCisJCXJldHVybjsKKworCS8qCisJICogVGhlIGpvdXJuYWwgaW5vZGUgaGFkIGJldHRlciBoYXZlIG9ubHkgb25lIGxpbmsgYW5kIG5vdCBiZSByZWFkYWJsZS4KKwkgKi8KKwlpZiAoaW5vZGUuaV9saW5rc19jb3VudCAhPSAxKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQsIG9yIHdlIGNhbid0IHRlbGwgd2hldGhlcgorCSAqIG9yIG5vdCBpdCdzIG1vdW50ZWQsIGRvIG5vdGhpbmcuCisJICovCisJcmV0dmFsID0gZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQoY3R4LT5maWxlc3lzdGVtX25hbWUsICZtb3VudF9mbGFncyk7CisJaWYgKHJldHZhbCB8fCAobW91bnRfZmxhZ3MgJiBFWFQyX01GX01PVU5URUQpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHdlIGNhbid0IGZpbmQgdGhlIG5hbWUgb2YgdGhlIGpvdXJuYWwgaW5vZGUsIHRoZW4gZG8KKwkgKiBub3RoaW5nLgorCSAqLworCWZvciAoY3BwID0gam91cm5hbF9uYW1lczsgKmNwcDsgY3BwKyspIHsKKwkJcmV0dmFsID0gZXh0MmZzX2xvb2t1cChmcywgRVhUMl9ST09UX0lOTywgKmNwcCwKKwkJCQkgICAgICAgc3RybGVuKCpjcHApLCAwLCAmaW5vKTsKKwkJaWYgKChyZXR2YWwgPT0gMCkgJiYgKGlubyA9PSBzYi0+c19qb3VybmFsX2ludW0pKQorCQkJYnJlYWs7CisJfQorCWlmICgqY3BwID09IDApCisJCXJldHVybjsKKworCS8qIFdlIG5lZWQgdGhlIGlub2RlIGJpdG1hcCB0byBiZSBsb2FkZWQgKi8KKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9iaXRtYXBzKGZzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm47CisKKwlwY3R4LnN0ciA9ICpjcHA7CisJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzBfTU9WRV9KT1VSTkFMLCAmcGN0eCkpCisJCXJldHVybjsKKworCS8qCisJICogT0ssIHdlJ3ZlIGRvbmUgYWxsIHRoZSBjaGVja3MsIGxldCdzIGFjdHVhbGx5IG1vdmUgdGhlCisJICogam91cm5hbCBpbm9kZS4gIEVycm9ycyBhdCB0aGlzIHBvaW50IG1lYW4gd2UgbmVlZCB0byBmb3JjZQorCSAqIGFuIGV4dDIgZmlsZXN5c3RlbSBjaGVjay4KKwkgKi8KKwlpZiAoKHJldHZhbCA9IGV4dDJmc191bmxpbmsoZnMsIEVYVDJfUk9PVF9JTk8sICpjcHAsIGlubywgMCkpICE9IDApCisJCWdvdG8gZXJyX291dDsKKwlpZiAoKHJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShmcywgRVhUMl9KT1VSTkFMX0lOTywgJmlub2RlKSkgIT0gMCkKKwkJZ290byBlcnJfb3V0OworCXNiLT5zX2pvdXJuYWxfaW51bSA9IEVYVDJfSk9VUk5BTF9JTk87CisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCWZzLT5mbGFncyAmPSB+RVhUMl9GTEFHX01BU1RFUl9TQl9PTkxZOworCWlub2RlLmlfbGlua3NfY291bnQgPSAwOworCWlub2RlLmlfZHRpbWUgPSB0aW1lKE5VTEwpOworCWlmICgocmV0dmFsID0gZXh0MmZzX3dyaXRlX2lub2RlKGZzLCBpbm8sICZpbm9kZSkpICE9IDApCisJCWdvdG8gZXJyX291dDsKKworCWdyb3VwID0gZXh0MmZzX2dyb3VwX29mX2lubyhmcywgaW5vKTsKKwlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwLCBpbm8pOworCWV4dDJmc19tYXJrX2liX2RpcnR5KGZzKTsKKwlmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfZnJlZV9pbm9kZXNfY291bnQrKzsKKwlmcy0+c3VwZXItPnNfZnJlZV9pbm9kZXNfY291bnQrKzsKKwlyZXR1cm47CisKK2Vycl9vdXQ6CisJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9FUlJfTU9WRV9KT1VSTkFMLCAmcGN0eCk7CisJZnMtPnN1cGVyLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKK30KKworLyoKKyAqIG1lc3NhZ2UuYyAtLS0gcHJpbnQgZTJmc2NrIG1lc3NhZ2VzICh3aXRoIGNvbXByZXNzaW9uKQorICoKKyAqIHByaW50X2UyZnNja19tZXNzYWdlKCkgcHJpbnRzIGEgbWVzc2FnZSB0byB0aGUgdXNlciwgdXNpbmcKKyAqIGNvbXByZXNzaW9uIHRlY2huaXF1ZXMgYW5kIGV4cGFuc2lvbnMgb2YgYWJicmV2aWF0aW9ucy4KKyAqCisgKiBUaGUgZm9sbG93aW5nICUgZXhwYW5zaW9ucyBhcmUgc3VwcG9ydGVkOgorICoKKyAqICAgICAgJWIgICAgICA8YmxrPiAgICAgICAgICAgICAgICAgICBibG9jayBudW1iZXIKKyAqICAgICAgJUIgICAgICA8YmxrY291bnQ+ICAgICAgICAgICAgICBpbnRlZ2VyCisgKiAgICAgICVjICAgICAgPGJsazI+ICAgICAgICAgICAgICAgICAgYmxvY2sgbnVtYmVyCisgKiAgICAgICVEaSAgICAgPGRpcmVudD4tPmlubyAgICAgICAgICAgaW5vZGUgbnVtYmVyCisgKiAgICAgICVEbiAgICAgPGRpcmVudD4tPm5hbWUgICAgICAgICAgc3RyaW5nCisgKiAgICAgICVEciAgICAgPGRpcmVudD4tPnJlY19sZW4KKyAqICAgICAgJURsICAgICA8ZGlyZW50Pi0+bmFtZV9sZW4KKyAqICAgICAgJUR0ICAgICA8ZGlyZW50Pi0+ZmlsZXR5cGUKKyAqICAgICAgJWQgICAgICA8ZGlyPiAgICAgICAgICAgICAgICAgICBpbm9kZSBudW1iZXIKKyAqICAgICAgJWcgICAgICA8Z3JvdXA+ICAgICAgICAgICAgICAgICBpbnRlZ2VyCisgKiAgICAgICVpICAgICAgPGlubz4gICAgICAgICAgICAgICAgICAgaW5vZGUgbnVtYmVyCisgKiAgICAgICVJcyAgICAgPGlub2RlPiAtPiBpX3NpemUKKyAqICAgICAgJUlTICAgICA8aW5vZGU+IC0+IGlfZXh0cmFfaXNpemUKKyAqICAgICAgJUliICAgICA8aW5vZGU+IC0+IGlfYmxvY2tzCisgKiAgICAgICVJbCAgICAgPGlub2RlPiAtPiBpX2xpbmtzX2NvdW50CisgKiAgICAgICVJbSAgICAgPGlub2RlPiAtPiBpX21vZGUKKyAqICAgICAgJUlNICAgICA8aW5vZGU+IC0+IGlfbXRpbWUKKyAqICAgICAgJUlGICAgICA8aW5vZGU+IC0+IGlfZmFkZHIKKyAqICAgICAgJUlmICAgICA8aW5vZGU+IC0+IGlfZmlsZV9hY2wKKyAqICAgICAgJUlkICAgICA8aW5vZGU+IC0+IGlfZGlyX2FjbAorICogICAgICAlSXUgICAgIDxpbm9kZT4gLT4gaV91aWQKKyAqICAgICAgJUlnICAgICA8aW5vZGU+IC0+IGlfZ2lkCisgKiAgICAgICVqICAgICAgPGlubzI+ICAgICAgICAgICAgICAgICAgaW5vZGUgbnVtYmVyCisgKiAgICAgICVtICAgICAgPGNvbV9lcnIgZXJyb3IgbWVzc2FnZT4KKyAqICAgICAgJU4gICAgICA8bnVtPgorICogICAgICAlcCAgICAgIGV4dDJmc19nZXRfcGF0aG5hbWUgb2YgZGlyZWN0b3J5IDxpbm8+CisgKiAgICAgICVQICAgICAgZXh0MmZzX2dldF9wYXRobmFtZSBvZiA8ZGlyZW50Pi0+aW5vIHdpdGggPGlubzI+IGFzCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udGFpbmluZyBkaXJlY3RvcnkuICAoSWYgZGlyZW50IGlzIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZW4gcmV0dXJuIHRoZSBwYXRobmFtZSBvZiBkaXJlY3RvcnkgPGlubzI+KQorICogICAgICAlcSAgICAgIGV4dDJmc19nZXRfcGF0aG5hbWUgb2YgZGlyZWN0b3J5IDxkaXI+CisgKiAgICAgICVRICAgICAgZXh0MmZzX2dldF9wYXRobmFtZSBvZiBkaXJlY3RvcnkgPGlubz4gd2l0aCA8ZGlyPiBhcworICogICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5LgorICogICAgICAlcyAgICAgIDxzdHI+ICAgICAgICAgICAgICAgICAgIG1pc2NlbGxhbmVvdXMgc3RyaW5nCisgKiAgICAgICVTICAgICAgYmFja3VwIHN1cGVyYmxvY2sKKyAqICAgICAgJVggICAgICA8bnVtPiBoZXhhZGVjaW1hbCBmb3JtYXQKKyAqCisgKiBUaGUgZm9sbG93aW5nICdAJyBleHBhbnNpb25zIGFyZSBzdXBwb3J0ZWQ6CisgKgorICogICAgICBAYSAgICAgIGV4dGVuZGVkIGF0dHJpYnV0ZQorICogICAgICBAQSAgICAgIGVycm9yIGFsbG9jYXRpbmcKKyAqICAgICAgQGIgICAgICBibG9jaworICogICAgICBAQiAgICAgIGJpdG1hcAorICogICAgICBAYyAgICAgIGNvbXByZXNzCisgKiAgICAgIEBDICAgICAgY29uZmxpY3RzIHdpdGggc29tZSBvdGhlciBmcyBibG9jaworICogICAgICBARCAgICAgIGRlbGV0ZWQKKyAqICAgICAgQGQgICAgICBkaXJlY3RvcnkKKyAqICAgICAgQGUgICAgICBlbnRyeQorICogICAgICBARSAgICAgIEVudHJ5ICclRG4nIGluICVwICglaSkKKyAqICAgICAgQGYgICAgICBmaWxlc3lzdGVtCisgKiAgICAgIEBGICAgICAgZm9yIEBpICVpICglUSkgaXMKKyAqICAgICAgQGcgICAgICBncm91cAorICogICAgICBAaCAgICAgIEhUUkVFIGRpcmVjdG9yeSBpbm9kZQorICogICAgICBAaSAgICAgIGlub2RlCisgKiAgICAgIEBJICAgICAgaWxsZWdhbAorICogICAgICBAaiAgICAgIGpvdXJuYWwKKyAqICAgICAgQGwgICAgICBsb3N0K2ZvdW5kCisgKiAgICAgIEBMICAgICAgaXMgYSBsaW5rCisgKiAgICAgIEBtICAgICAgbXVsdGlwbHktY2xhaW1lZAorICogICAgICBAbiAgICAgIGludmFsaWQKKyAqICAgICAgQG8gICAgICBvcnBoYW5lZAorICogICAgICBAcCAgICAgIHByb2JsZW0gaW4KKyAqICAgICAgQHIgICAgICByb290IGlub2RlCisgKiAgICAgIEBzICAgICAgc2hvdWxkIGJlCisgKiAgICAgIEBTICAgICAgc3VwZXJibG9jaworICogICAgICBAdSAgICAgIHVuYXR0YWNoZWQKKyAqICAgICAgQHYgICAgICBkZXZpY2UKKyAqICAgICAgQHogICAgICB6ZXJvLWxlbmd0aAorICovCisKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGFiYnJldmlhdGlvbnMgdXNlZCBieSB0aGUgdGV4dCBzdHJpbmdzCisgKiBiZWxvdy4gIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyBpcyB0aGUgaW5kZXggbGV0dGVyLiAgQW4KKyAqIGFiYnJldmlhdGlvbiBvZiB0aGUgZm9ybSAnQDxpPicgaXMgZXhwYW5kZWQgYnkgbG9va2luZyB1cCB0aGUgaW5kZXgKKyAqIGxldHRlciA8aT4gaW4gdGhlIHRhYmxlIGJlbG93LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWJicmV2c1tdID0geworCU5fKCJhZXh0ZW5kZWQgYXR0cmlidXRlIiksCisJTl8oIkFlcnJvciBhbGxvY2F0aW5nIiksCisJTl8oImJibG9jayIpLAorCU5fKCJCYml0bWFwIiksCisJTl8oImNjb21wcmVzcyIpLAorCU5fKCJDY29uZmxpY3RzIHdpdGggc29tZSBvdGhlciBmcyBAYiIpLAorCU5fKCJpaW5vZGUiKSwKKwlOXygiSWlsbGVnYWwiKSwKKwlOXygiampvdXJuYWwiKSwKKwlOXygiRGRlbGV0ZWQiKSwKKwlOXygiZGRpcmVjdG9yeSIpLAorCU5fKCJlZW50cnkiKSwKKwlOXygiRUBlICclRG4nIGluICVwICglaSkiKSwKKwlOXygiZmZpbGVzeXN0ZW0iKSwKKwlOXygiRmZvciBAaSAlaSAoJVEpIGlzIiksCisJTl8oImdncm91cCIpLAorCU5fKCJoSFRSRUUgQGQgQGkiKSwKKwlOXygibGxvc3QrZm91bmQiKSwKKwlOXygiTGlzIGEgbGluayIpLAorCU5fKCJtbXVsdGlwbHktY2xhaW1lZCIpLAorCU5fKCJuaW52YWxpZCIpLAorCU5fKCJvb3JwaGFuZWQiKSwKKwlOXygicHByb2JsZW0gaW4iKSwKKwlOXygicnJvb3QgQGkiKSwKKwlOXygic3Nob3VsZCBiZSIpLAorCU5fKCJTc3VwZXJAYiIpLAorCU5fKCJ1dW5hdHRhY2hlZCIpLAorCU5fKCJ2ZGV2aWNlIiksCisJTl8oInp6ZXJvLWxlbmd0aCIpLAorCSJAQCIsCisJMAorCX07CisKKy8qCisgKiBHaXZlIG1vcmUgdXNlciBmcmllbmRseSBuYW1lcyB0byB0aGUgInNwZWNpYWwiIGlub2Rlcy4KKyAqLworI2RlZmluZSBudW1fc3BlY2lhbF9pbm9kZXMgICAgICAxMQorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNwZWNpYWxfaW5vZGVfbmFtZVtdID0KK3sKKwlOXygiPFRoZSBOVUxMIGlub2RlPiIpLCAgICAgICAgICAgICAgICAgLyogMCAqLworCU5fKCI8VGhlIGJhZCBibG9ja3MgaW5vZGU+IiksICAgICAgICAgICAvKiAxICovCisJIi8iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgKi8KKwlOXygiPFRoZSBBQ0wgaW5kZXggaW5vZGU+IiksICAgICAgICAgICAgLyogMyAqLworCU5fKCI8VGhlIEFDTCBkYXRhIGlub2RlPiIpLCAgICAgICAgICAgICAvKiA0ICovCisJTl8oIjxUaGUgYm9vdCBsb2FkZXIgaW5vZGU+IiksICAgICAgICAgIC8qIDUgKi8KKwlOXygiPFRoZSB1bmRlbGV0ZSBkaXJlY3RvcnkgaW5vZGU+IiksICAgLyogNiAqLworCU5fKCI8VGhlIGdyb3VwIGRlc2NyaXB0b3IgaW5vZGU+IiksICAgICAvKiA3ICovCisJTl8oIjxUaGUgam91cm5hbCBpbm9kZT4iKSwgICAgICAgICAgICAgIC8qIDggKi8KKwlOXygiPFJlc2VydmVkIGlub2RlIDk+IiksICAgICAgICAgICAgICAgLyogOSAqLworCU5fKCI8UmVzZXJ2ZWQgaW5vZGUgMTA+IiksICAgICAgICAgICAgICAvKiAxMCAqLworfTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyAic2FmZSIgcHJpbnRpbmcuICBJdCB3aWxsIGNvbnZlcnQgbm9uLXByaW50YWJsZQorICogQVNDSUkgY2hhcmFjdGVycyB1c2luZyAnXicgYW5kIE0tIG5vdGF0aW9uLgorICovCitzdGF0aWMgdm9pZCBzYWZlX3ByaW50KGNvbnN0IGNoYXIgKmNwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgICBjaDsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSBzdHJsZW4oY3ApOworCisJd2hpbGUgKGxlbi0tKSB7CisJCWNoID0gKmNwKys7CisJCWlmIChjaCA+IDEyOCkgeworCQkJZnB1dHMoIk0tIiwgc3Rkb3V0KTsKKwkJCWNoIC09IDEyODsKKwkJfQorCQlpZiAoKGNoIDwgMzIpIHx8IChjaCA9PSAweDdmKSkgeworCQkJYmJfcHV0Y2hhcignXicpOworCQkJY2ggXj0gMHg0MDsgLyogXkAsIF5BLCBeQjsgXj8gZm9yIERFTCAqLworCQl9CisJCWJiX3B1dGNoYXIoY2gpOworCX0KK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBwcmludHMgYSBwYXRobmFtZSwgdXNpbmcgdGhlIGV4dDJmc19nZXRfcGF0aG5hbWUKKyAqIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X3BhdGhuYW1lKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwgZXh0Ml9pbm9fdCBpbm8pCit7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwljaGFyICAgICAgICAgICAgKnBhdGg7CisKKwlpZiAoIWRpciAmJiAoaW5vIDwgbnVtX3NwZWNpYWxfaW5vZGVzKSkgeworCQlmcHV0cyhfKHNwZWNpYWxfaW5vZGVfbmFtZVtpbm9dKSwgc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKworCXJldHZhbCA9IGV4dDJmc19nZXRfcGF0aG5hbWUoZnMsIGRpciwgaW5vLCAmcGF0aCk7CisJaWYgKHJldHZhbCkKKwkJZnB1dHMoIj8/PyIsIHN0ZG91dCk7CisJZWxzZSB7CisJCXNhZmVfcHJpbnQocGF0aCwgLTEpOworCQlleHQyZnNfZnJlZV9tZW0oJnBhdGgpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfZTJmc2NrX21lc3NhZ2UoZTJmc2NrX3QgY3R4LCBjb25zdCBjaGFyICptc2csCisJCQkgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgsIGludCBmaXJzdCk7CisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSAnQCcgZXhwYW5zaW9uLiAgV2UgYWxsb3cgcmVjdXJzaXZlCisgKiBleHBhbnNpb247IGFuIEAgZXhwcmVzc2lvbiBjYW4gY29udGFpbiBmdXJ0aGVyICdAJyBhbmQgJyUnCisgKiBleHByZXNzaW9ucy4KKyAqLworc3RhdGljIHZvaWQgZXhwYW5kX2F0X2V4cHJlc3Npb24oZTJmc2NrX3QgY3R4LCBjaGFyIGNoLAorCQkJCQkgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgsCisJCQkJCSAgaW50ICpmaXJzdCkKK3sKKwljb25zdCBjaGFyICpjb25zdCAqY3BwOworCWNvbnN0IGNoYXIgKnN0cjsKKworCS8qIFNlYXJjaCBmb3IgdGhlIGFiYnJldmlhdGlvbiAqLworCWZvciAoY3BwID0gYWJicmV2czsgKmNwcDsgY3BwKyspIHsKKwkJaWYgKGNoID09ICpjcHBbMF0pCisJCQlicmVhazsKKwl9CisJaWYgKCpjcHApIHsKKwkJc3RyID0gXygqY3BwKSArIDE7CisJCWlmICgqZmlyc3QgJiYgaXNsb3dlcigqc3RyKSkgeworCQkJKmZpcnN0ID0gMDsKKwkJCWJiX3B1dGNoYXIodG91cHBlcigqc3RyKyspKTsKKwkJfQorCQlwcmludF9lMmZzY2tfbWVzc2FnZShjdHgsIHN0ciwgcGN0eCwgKmZpcnN0KTsKKwl9IGVsc2UKKwkJcHJpbnRmKCJAJWMiLCBjaCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgJyVJWCcgZXhwcmVzc2lvbnMKKyAqLworc3RhdGljIHZvaWQgZXhwYW5kX2lub2RlX2V4cHJlc3Npb24oY2hhciBjaCwKKwkJCQkJICAgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgKmlub2RlOworCXN0cnVjdCBleHQyX2lub2RlX2xhcmdlICpsYXJnZV9pbm9kZTsKKwljaGFyICogICAgICAgICAgICAgICAgICB0aW1lX3N0cjsKKwl0aW1lX3QgICAgICAgICAgICAgICAgICB0OworCWludCAgICAgICAgICAgICAgICAgICAgIGRvX2dtdCA9IC0xOworCisJaWYgKCFjdHggfHwgIWN0eC0+aW5vZGUpCisJCWdvdG8gbm9faW5vZGU7CisKKwlpbm9kZSA9IGN0eC0+aW5vZGU7CisJbGFyZ2VfaW5vZGUgPSAoc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKikgaW5vZGU7CisKKwlzd2l0Y2ggKGNoKSB7CisJY2FzZSAncyc6CisJCWlmIChMSU5VWF9TX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJcHJpbnRmKCIldSIsIGlub2RlLT5pX3NpemUpOworCQllbHNlIHsKKwkJCXByaW50ZigiJSJQUkl1NjQsIChpbm9kZS0+aV9zaXplIHwKKwkJCQkJKCh1aW50NjRfdCkgaW5vZGUtPmlfc2l6ZV9oaWdoIDw8IDMyKSkpOworCQl9CisJCWJyZWFrOworCWNhc2UgJ1MnOgorCQlwcmludGYoIiV1IiwgbGFyZ2VfaW5vZGUtPmlfZXh0cmFfaXNpemUpOworCQlicmVhazsKKwljYXNlICdiJzoKKwkJcHJpbnRmKCIldSIsIGlub2RlLT5pX2Jsb2Nrcyk7CisJCWJyZWFrOworCWNhc2UgJ2wnOgorCQlwcmludGYoIiVkIiwgaW5vZGUtPmlfbGlua3NfY291bnQpOworCQlicmVhazsKKwljYXNlICdtJzoKKwkJcHJpbnRmKCIwJW8iLCBpbm9kZS0+aV9tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJCS8qIFRoZSBkaWV0IGxpYmMgZG9lc24ndCByZXNwZWN0IHRoZSBUWiBlbnZpcm9uZW1udCB2YXJpYWJsZSAqLworCQlpZiAoZG9fZ210ID09IC0xKSB7CisJCQl0aW1lX3N0ciA9IGdldGVudigiVFoiKTsKKwkJCWlmICghdGltZV9zdHIpCisJCQkJdGltZV9zdHIgPSAiIjsKKwkJCWRvX2dtdCA9ICFzdHJjbXAodGltZV9zdHIsICJHTVQiKTsKKwkJfQorCQl0ID0gaW5vZGUtPmlfbXRpbWU7CisJCXRpbWVfc3RyID0gYXNjdGltZShkb19nbXQgPyBnbXRpbWUoJnQpIDogbG9jYWx0aW1lKCZ0KSk7CisJCXByaW50ZigiJS4yNHMiLCB0aW1lX3N0cik7CisJCWJyZWFrOworCWNhc2UgJ0YnOgorCQlwcmludGYoIiV1IiwgaW5vZGUtPmlfZmFkZHIpOworCQlicmVhazsKKwljYXNlICdmJzoKKwkJcHJpbnRmKCIldSIsIGlub2RlLT5pX2ZpbGVfYWNsKTsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CisJCXByaW50ZigiJXUiLCAoTElOVVhfU19JU0RJUihpbm9kZS0+aV9tb2RlKSA/CisJCQkgICAgICBpbm9kZS0+aV9kaXJfYWNsIDogMCkpOworCQlicmVhazsKKwljYXNlICd1JzoKKwkJcHJpbnRmKCIlZCIsIChpbm9kZS0+aV91aWQgfAorCQkJICAgICAgKGlub2RlLT5vc2QyLmxpbnV4Mi5sX2lfdWlkX2hpZ2ggPDwgMTYpKSk7CisJCWJyZWFrOworCWNhc2UgJ2cnOgorCQlwcmludGYoIiVkIiwgKGlub2RlLT5pX2dpZCB8CisJCQkgICAgICAoaW5vZGUtPm9zZDIubGludXgyLmxfaV9naWRfaGlnaCA8PCAxNikpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwlub19pbm9kZToKKwkJcHJpbnRmKCIlJUklYyIsIGNoKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBleHBhbmRzICclZFgnIGV4cHJlc3Npb25zCisgKi8KK3N0YXRpYyB2b2lkIGV4cGFuZF9kaXJlbnRfZXhwcmVzc2lvbihjaGFyIGNoLAorCQkJCQkgICAgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICAgKmRpcmVudDsKKwlpbnQgICAgIGxlbjsKKworCWlmICghY3R4IHx8ICFjdHgtPmRpcmVudCkKKwkJZ290byBub19kaXJlbnQ7CisKKwlkaXJlbnQgPSBjdHgtPmRpcmVudDsKKworCXN3aXRjaCAoY2gpIHsKKwljYXNlICdpJzoKKwkJcHJpbnRmKCIldSIsIGRpcmVudC0+aW5vZGUpOworCQlicmVhazsKKwljYXNlICduJzoKKwkJbGVuID0gZGlyZW50LT5uYW1lX2xlbiAmIDB4RkY7CisJCWlmIChsZW4gPiBFWFQyX05BTUVfTEVOKQorCQkJbGVuID0gRVhUMl9OQU1FX0xFTjsKKwkJaWYgKGxlbiA+IGRpcmVudC0+cmVjX2xlbikKKwkJCWxlbiA9IGRpcmVudC0+cmVjX2xlbjsKKwkJc2FmZV9wcmludChkaXJlbnQtPm5hbWUsIGxlbik7CisJCWJyZWFrOworCWNhc2UgJ3InOgorCQlwcmludGYoIiV1IiwgZGlyZW50LT5yZWNfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSAnbCc6CisJCXByaW50ZigiJXUiLCBkaXJlbnQtPm5hbWVfbGVuICYgMHhGRik7CisJCWJyZWFrOworCWNhc2UgJ3QnOgorCQlwcmludGYoIiV1IiwgZGlyZW50LT5uYW1lX2xlbiA+PiA4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwlub19kaXJlbnQ6CisJCXByaW50ZigiJSVEJWMiLCBjaCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZXhwYW5kX3BlcmNlbnRfZXhwcmVzc2lvbihleHQyX2ZpbHN5cyBmcywgY2hhciBjaCwKKwkJCQkJICAgICAgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKmN0eCkKK3sKKwlpZiAoIWN0eCkKKwkJZ290byBub19jb250ZXh0OworCisJc3dpdGNoIChjaCkgeworCWNhc2UgJyUnOgorCQliYl9wdXRjaGFyKCclJyk7CisJCWJyZWFrOworCWNhc2UgJ2InOgorCQlwcmludGYoIiV1IiwgY3R4LT5ibGspOworCQlicmVhazsKKwljYXNlICdCJzoKKwkJcHJpbnRmKCIlIlBSSWk2NCwgY3R4LT5ibGtjb3VudCk7CisJCWJyZWFrOworCWNhc2UgJ2MnOgorCQlwcmludGYoIiV1IiwgY3R4LT5ibGsyKTsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CisJCXByaW50ZigiJXUiLCBjdHgtPmRpcik7CisJCWJyZWFrOworCWNhc2UgJ2cnOgorCQlwcmludGYoIiVkIiwgY3R4LT5ncm91cCk7CisJCWJyZWFrOworCWNhc2UgJ2knOgorCQlwcmludGYoIiV1IiwgY3R4LT5pbm8pOworCQlicmVhazsKKwljYXNlICdqJzoKKwkJcHJpbnRmKCIldSIsIGN0eC0+aW5vMik7CisJCWJyZWFrOworCWNhc2UgJ20nOgorCQlmcHV0cyhlcnJvcl9tZXNzYWdlKGN0eC0+ZXJyY29kZSksIHN0ZG91dCk7CisJCWJyZWFrOworCWNhc2UgJ04nOgorCQlwcmludGYoIiUiUFJJaTY0LCBjdHgtPm51bSk7CisJCWJyZWFrOworCWNhc2UgJ3AnOgorCQlwcmludF9wYXRobmFtZShmcywgY3R4LT5pbm8sIDApOworCQlicmVhazsKKwljYXNlICdQJzoKKwkJcHJpbnRfcGF0aG5hbWUoZnMsIGN0eC0+aW5vMiwKKwkJCSAgICAgICBjdHgtPmRpcmVudCA/IGN0eC0+ZGlyZW50LT5pbm9kZSA6IDApOworCQlicmVhazsKKwljYXNlICdxJzoKKwkJcHJpbnRfcGF0aG5hbWUoZnMsIGN0eC0+ZGlyLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAnUSc6CisJCXByaW50X3BhdGhuYW1lKGZzLCBjdHgtPmRpciwgY3R4LT5pbm8pOworCQlicmVhazsKKwljYXNlICdTJzoKKwkJcHJpbnRmKCIlZCIsIGdldF9iYWNrdXBfc2IoTlVMTCwgZnMsIE5VTEwsIE5VTEwpKTsKKwkJYnJlYWs7CisJY2FzZSAncyc6CisJCWZwdXRzKChjdHgtPnN0ciA/IGN0eC0+c3RyIDogIk5VTEwiKSwgc3Rkb3V0KTsKKwkJYnJlYWs7CisJY2FzZSAnWCc6CisJCXByaW50ZigiMHglIlBSSWk2NCwgY3R4LT5udW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCW5vX2NvbnRleHQ6CisJCXByaW50ZigiJSUlYyIsIGNoKTsKKwkJYnJlYWs7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHByaW50X2UyZnNja19tZXNzYWdlKGUyZnNja190IGN0eCwgY29uc3QgY2hhciAqbXNnLAorCQkJICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4LCBpbnQgZmlyc3QpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWNvbnN0IGNoYXIgKiAgICBjcDsKKwlpbnQgICAgICAgICAgICAgaTsKKworCWUyZnNja19jbGVhcl9wcm9nYmFyKGN0eCk7CisJZm9yIChjcCA9IG1zZzsgKmNwOyBjcCsrKSB7CisJCWlmIChjcFswXSA9PSAnQCcpIHsKKwkJCWNwKys7CisJCQlleHBhbmRfYXRfZXhwcmVzc2lvbihjdHgsICpjcCwgcGN0eCwgJmZpcnN0KTsKKwkJfSBlbHNlIGlmIChjcFswXSA9PSAnJScgJiYgY3BbMV0gPT0gJ0knKSB7CisJCQljcCArPSAyOworCQkJZXhwYW5kX2lub2RlX2V4cHJlc3Npb24oKmNwLCBwY3R4KTsKKwkJfSBlbHNlIGlmIChjcFswXSA9PSAnJScgJiYgY3BbMV0gPT0gJ0QnKSB7CisJCQljcCArPSAyOworCQkJZXhwYW5kX2RpcmVudF9leHByZXNzaW9uKCpjcCwgcGN0eCk7CisJCX0gZWxzZSBpZiAoKGNwWzBdID09ICclJykpIHsKKwkJCWNwKys7CisJCQlleHBhbmRfcGVyY2VudF9leHByZXNzaW9uKGZzLCAqY3AsIHBjdHgpOworCQl9IGVsc2UgeworCQkJZm9yIChpPTA7IGNwW2ldOyBpKyspCisJCQkJaWYgKChjcFtpXSA9PSAnQCcpIHx8IGNwW2ldID09ICclJykKKwkJCQkJYnJlYWs7CisJCQlwcmludGYoIiUuKnMiLCBpLCBjcCk7CisJCQljcCArPSBpLTE7CisJCX0KKwkJZmlyc3QgPSAwOworCX0KK30KKworCisvKgorICogcmVnaW9uLmMgLS0tIGNvZGUgd2hpY2ggbWFuYWdlcyBhbGxvY2F0aW9ucyB3aXRoaW4gYSByZWdpb24uCisgKi8KKworc3RydWN0IHJlZ2lvbl9lbCB7CisJcmVnaW9uX2FkZHJfdCAgIHN0YXJ0OworCXJlZ2lvbl9hZGRyX3QgICBlbmQ7CisJc3RydWN0IHJlZ2lvbl9lbCAqbmV4dDsKK307CisKK3N0cnVjdCByZWdpb25fc3RydWN0IHsKKwlyZWdpb25fYWRkcl90ICAgbWluOworCXJlZ2lvbl9hZGRyX3QgICBtYXg7CisJc3RydWN0IHJlZ2lvbl9lbCAqYWxsb2NhdGVkOworfTsKKworc3RhdGljIHJlZ2lvbl90IHJlZ2lvbl9jcmVhdGUocmVnaW9uX2FkZHJfdCBtaW4sIHJlZ2lvbl9hZGRyX3QgbWF4KQoreworCXJlZ2lvbl90ICAgICAgICByZWdpb247CisKKwlyZWdpb24gPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgcmVnaW9uX3N0cnVjdCkpOworCXJlZ2lvbi0+bWluID0gbWluOworCXJlZ2lvbi0+bWF4ID0gbWF4OworCXJldHVybiByZWdpb247Cit9CisKK3N0YXRpYyB2b2lkIHJlZ2lvbl9mcmVlKHJlZ2lvbl90IHJlZ2lvbikKK3sKKwlzdHJ1Y3QgcmVnaW9uX2VsICAgICAgICAqciwgKm5leHQ7CisKKwlmb3IgKHIgPSByZWdpb24tPmFsbG9jYXRlZDsgcjsgciA9IG5leHQpIHsKKwkJbmV4dCA9IHItPm5leHQ7CisJCWZyZWUocik7CisJfQorCW1lbXNldChyZWdpb24sIDAsIHNpemVvZihzdHJ1Y3QgcmVnaW9uX3N0cnVjdCkpOworCWZyZWUocmVnaW9uKTsKK30KKworc3RhdGljIGludCByZWdpb25fYWxsb2NhdGUocmVnaW9uX3QgcmVnaW9uLCByZWdpb25fYWRkcl90IHN0YXJ0LCBpbnQgbikKK3sKKwlzdHJ1Y3QgcmVnaW9uX2VsICAgICAgICAqciwgKm5ld19yZWdpb24sICpwcmV2LCAqbmV4dDsKKwlyZWdpb25fYWRkcl90IGVuZDsKKworCWVuZCA9IHN0YXJ0K247CisJaWYgKChzdGFydCA8IHJlZ2lvbi0+bWluKSB8fCAoZW5kID4gcmVnaW9uLT5tYXgpKQorCQlyZXR1cm4gLTE7CisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIFNlYXJjaCB0aHJvdWdoIHRoZSBsaW5rZWQgbGlzdC4gIElmIHdlIGZpbmQgdGhhdCBpdAorCSAqIGNvbmZsaWN0cyB3aXRpaCBzb21ldGhpbmcgdGhhdCdzIGFscmVhZHkgYWxsb2NhdGVkLCByZXR1cm4KKwkgKiAxOyBpZiB3ZSBjYW4gZmluZCBhbiBleGlzdGluZyByZWdpb24gd2hpY2ggd2UgY2FuIGdyb3csIGRvCisJICogc28uICBPdGhlcndpc2UsIHN0b3Agd2hlbiB3ZSBmaW5kIHRoZSBhcHByb3ByaWF0ZSBwbGFjZQorCSAqIGluc2VydCBhIG5ldyByZWdpb24gZWxlbWVudCBpbnRvIHRoZSBsaW5rZWQgbGlzdC4KKwkgKi8KKwlmb3IgKHIgPSByZWdpb24tPmFsbG9jYXRlZCwgcHJldj1OVUxMOyByOyBwcmV2ID0gciwgciA9IHItPm5leHQpIHsKKwkJaWYgKCgoc3RhcnQgPj0gci0+c3RhcnQpICYmIChzdGFydCA8IHItPmVuZCkpIHx8CisJCSAgICAoKGVuZCA+IHItPnN0YXJ0KSAmJiAoZW5kIDw9IHItPmVuZCkpIHx8CisJCSAgICAoKHN0YXJ0IDw9IHItPnN0YXJ0KSAmJiAoZW5kID49IHItPmVuZCkpKQorCQkJcmV0dXJuIDE7CisJCWlmIChlbmQgPT0gci0+c3RhcnQpIHsKKwkJCXItPnN0YXJ0ID0gc3RhcnQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc3RhcnQgPT0gci0+ZW5kKSB7CisJCQlpZiAoKG5leHQgPSByLT5uZXh0KSkgeworCQkJCWlmIChlbmQgPiBuZXh0LT5zdGFydCkKKwkJCQkJcmV0dXJuIDE7CisJCQkJaWYgKGVuZCA9PSBuZXh0LT5zdGFydCkgeworCQkJCQlyLT5lbmQgPSBuZXh0LT5lbmQ7CisJCQkJCXItPm5leHQgPSBuZXh0LT5uZXh0OworCQkJCQlmcmVlKG5leHQpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQlyLT5lbmQgPSBlbmQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc3RhcnQgPCByLT5zdGFydCkKKwkJCWJyZWFrOworCX0KKwkvKgorCSAqIEluc2VydCBhIG5ldyByZWdpb24gZWxlbWVudCBzdHJ1Y3R1cmUgaW50byB0aGUgbGlua2VkIGxpc3QKKwkgKi8KKwluZXdfcmVnaW9uID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHJlZ2lvbl9lbCkpOworCW5ld19yZWdpb24tPnN0YXJ0ID0gc3RhcnQ7CisJbmV3X3JlZ2lvbi0+ZW5kID0gc3RhcnQgKyBuOworCW5ld19yZWdpb24tPm5leHQgPSByOworCWlmIChwcmV2KQorCQlwcmV2LT5uZXh0ID0gbmV3X3JlZ2lvbjsKKwllbHNlCisJCXJlZ2lvbi0+YWxsb2NhdGVkID0gbmV3X3JlZ2lvbjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBhc3MxLmMgLS0gcGFzcyAjMSBvZiBlMmZzY2s6IHNlcXVlbnRpYWwgc2NhbiBvZiB0aGUgaW5vZGUgdGFibGUKKyAqCisgKiBQYXNzIDEgb2YgZTJmc2NrIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBpbm9kZXMgaW4gdGhlIGZpbGVzeXN0ZW1zLAorICogYW5kIGFwcGxpZXMgdGhlIGZvbGxvd2luZyB0ZXN0cyB0byBlYWNoIGlub2RlOgorICoKKyAqICAgICAgLSBUaGUgbW9kZSBmaWVsZCBvZiB0aGUgaW5vZGUgbXVzdCBiZSBsZWdhbC4KKyAqICAgICAgLSBUaGUgc2l6ZSBhbmQgYmxvY2sgY291bnQgZmllbGRzIG9mIHRoZSBpbm9kZSBhcmUgY29ycmVjdC4KKyAqICAgICAgLSBBIGRhdGEgYmxvY2sgbXVzdCBub3QgYmUgdXNlZCBieSBhbm90aGVyIGlub2RlCisgKgorICogUGFzcyAxIGFsc28gZ2F0aGVycyB0aGUgY29sbGVjdHMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKyAqCisgKiAgICAgIC0gQSBiaXRtYXAgb2Ygd2hpY2ggaW5vZGVzIGFyZSBpbiB1c2UuICAgICAgICAgIChpbm9kZV91c2VkX21hcCkKKyAqICAgICAgLSBBIGJpdG1hcCBvZiB3aGljaCBpbm9kZXMgYXJlIGRpcmVjdG9yaWVzLiAgICAgKGlub2RlX2Rpcl9tYXApCisgKiAgICAgIC0gQSBiaXRtYXAgb2Ygd2hpY2ggaW5vZGVzIGFyZSByZWd1bGFyIGZpbGVzLiAgIChpbm9kZV9yZWdfbWFwKQorICogICAgICAtIEEgYml0bWFwIG9mIHdoaWNoIGlub2RlcyBoYXZlIGJhZCBmaWVsZHMuICAgICAoaW5vZGVfYmFkX21hcCkKKyAqICAgICAgLSBBIGJpdG1hcCBvZiB3aGljaCBpbm9kZXMgYXJlIGltYWdpYyBpbm9kZXMuICAgKGlub2RlX2ltYWdpY19tYXApCisgKiAgICAgIC0gQSBiaXRtYXAgb2Ygd2hpY2ggYmxvY2tzIGFyZSBpbiB1c2UuICAgICAgICAgIChibG9ja19mb3VuZF9tYXApCisgKiAgICAgIC0gQSBiaXRtYXAgb2Ygd2hpY2ggYmxvY2tzIGFyZSBpbiB1c2UgYnkgdHdvIGlub2RlcyAgICAgKGJsb2NrX2R1cF9tYXApCisgKiAgICAgIC0gVGhlIGRhdGEgYmxvY2tzIG9mIHRoZSBkaXJlY3RvcnkgaW5vZGVzLiAgICAgIChkaXJfbWFwKQorICoKKyAqIFBhc3MgMSBpcyBkZXNpZ25lZCB0byBzdGFzaCBhd2F5IGVub3VnaCBpbmZvcm1hdGlvbiBzbyB0aGF0IHRoZQorICogb3RoZXIgcGFzc2VzIHNob3VsZCBub3QgbmVlZCB0byByZWFkIGluIHRoZSBpbm9kZSBpbmZvcm1hdGlvbgorICogZHVyaW5nIHRoZSBub3JtYWwgY291cnNlIG9mIGEgZmlsZXN5c3RlbSBjaGVjay4gIChBbHRob2doIGlmIGFuCisgKiBpbmNvbnNpc3RlbmN5IGlzIGRldGVjdGVkLCBvdGhlciBwYXNzZXMgbWF5IG5lZWQgdG8gcmVhZCBpbiBhbgorICogaW5vZGUgdG8gZml4IGl0LikKKyAqCisgKiBOb3RlIHRoYXQgcGFzcyAxQiB3aWxsIGJlIGludm9rZWQgaWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgYmxvY2tzCisgKiBmb3VuZC4KKyAqLworCisKK3N0YXRpYyBpbnQgcHJvY2Vzc19ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgICpibG9ja25yLAorCQkJIGUyX2Jsa2NudF90IGJsb2NrY250LCBibGtfdCByZWZfYmxrLAorCQkJIGludCByZWZfb2Zmc2V0LCB2b2lkICpwcml2X2RhdGEpOworc3RhdGljIGludCBwcm9jZXNzX2JhZF9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgKmJsb2NrX25yLAorCQkJICAgICBlMl9ibGtjbnRfdCBibG9ja2NudCwgYmxrX3QgcmVmX2JsaywKKwkJCSAgICAgaW50IHJlZl9vZmZzZXQsIHZvaWQgKnByaXZfZGF0YSk7CitzdGF0aWMgdm9pZCBjaGVja19ibG9ja3MoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4LAorCQkJIGNoYXIgKmJsb2NrX2J1Zik7CitzdGF0aWMgdm9pZCBtYXJrX3RhYmxlX2Jsb2NrcyhlMmZzY2tfdCBjdHgpOworc3RhdGljIHZvaWQgYWxsb2NfaW1hZ2ljX21hcChlMmZzY2tfdCBjdHgpOworc3RhdGljIHZvaWQgbWFya19pbm9kZV9iYWQoZTJmc2NrX3QgY3R4LCBpbm9fdCBpbm8pOworc3RhdGljIHZvaWQgaGFuZGxlX2ZzX2JhZF9ibG9ja3MoZTJmc2NrX3QgY3R4KTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfaW5vZGVzKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19pbm9kZV9jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CitzdGF0aWMgZXJyY29kZV90IHNjYW5fY2FsbGJhY2soZXh0Ml9maWxzeXMgZnMsCisJCQkJICBkZ3JwX3QgZ3JvdXAsIHZvaWQgKiBwcml2X2RhdGEpOworc3RhdGljIHZvaWQgYWRqdXN0X2V4dGF0dHJfcmVmY291bnQoZTJmc2NrX3QgY3R4LCBleHQyX3JlZmNvdW50X3QgcmVmY291bnQsCisJCQkJICAgIGNoYXIgKmJsb2NrX2J1ZiwgaW50IGFkanVzdF9zaWduKTsKKy8qIHN0YXRpYyBjaGFyICpkZXNjcmliZV9pbGxlZ2FsX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jayk7ICovCisKK3N0YXRpYyB2b2lkIGUyZnNja193cml0ZV9pbm9kZV9mdWxsKGUyZnNja190IGN0eCwgdW5zaWduZWQgbG9uZyBpbm8sCisJCQkgICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSwgaW50IGJ1ZnNpemUsCisJCQkgICAgICAgY29uc3QgY2hhciAqcHJvYyk7CisKK3N0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xIHsKKwlleHQyX2lub190ICAgICAgaW5vOworCXVuc2lnbmVkICAgICAgICBpc19kaXI6MSwgaXNfcmVnOjEsIGNsZWFyOjEsIHN1cHByZXNzOjEsCisJCQkJZnJhZ21lbnRlZDoxLCBjb21wcmVzc2VkOjEsIGJiY2hlY2s6MTsKKwlibGtfdCAgICAgICAgICAgbnVtX2Jsb2NrczsKKwlibGtfdCAgICAgICAgICAgbWF4X2Jsb2NrczsKKwllMl9ibGtjbnRfdCAgICAgbGFzdF9ibG9jazsKKwlpbnQgICAgICAgICAgICAgbnVtX2lsbGVnYWxfYmxvY2tzOworCWJsa190ICAgICAgICAgICBwcmV2aW91c19ibG9jazsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eDsKKwlleHQyZnNfYmxvY2tfYml0bWFwIGZzX21ldGFfYmxvY2tzOworCWUyZnNja190ICAgICAgICBjdHg7Cit9OworCitzdHJ1Y3QgcHJvY2Vzc19pbm9kZV9ibG9jayB7CisJZXh0Ml9pbm9fdCBpbm87CisJc3RydWN0IGV4dDJfaW5vZGUgaW5vZGU7Cit9OworCitzdHJ1Y3Qgc2Nhbl9jYWxsYmFja19zdHJ1Y3QgeworCWUyZnNja190ICAgICAgICBjdHg7CisJY2hhciAgICAgICAgICAgICpibG9ja19idWY7Cit9OworCisvKgorICogRm9yIHRoZSBpbm9kZXMgdG8gcHJvY2VzcyBsaXN0LgorICovCitzdGF0aWMgc3RydWN0IHByb2Nlc3NfaW5vZGVfYmxvY2sgKmlub2Rlc190b19wcm9jZXNzOworc3RhdGljIGludCBwcm9jZXNzX2lub2RlX2NvdW50OworCitzdGF0aWMgX191NjQgZXh0Ml9tYXhfc2l6ZXNbRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkUgLQorCQkJICAgIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFICsgMV07CisKKy8qCisgKiBGcmVlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IHBhc3MxIGluIHByZXBhcmF0aW9uIGZvciByZXN0YXJ0aW5nCisgKiB0aGluZ3MuCisgKi8KK3N0YXRpYyB2b2lkIHVud2luZF9wYXNzMSh2b2lkKQoreworCWV4dDJmc19mcmVlX21lbSgmaW5vZGVzX3RvX3Byb2Nlc3MpOworfQorCisvKgorICogQ2hlY2sgdG8gbWFrZSBzdXJlIGEgZGV2aWNlIGlub2RlIGlzIHJlYWwuICBSZXR1cm5zIDEgaWYgdGhlIGRldmljZQorICogY2hlY2tzIG91dCwgMCBpZiBub3QuCisgKgorICogTm90ZTogdGhpcyByb3V0aW5lIGlzIG5vdyBhbHNvIHVzZWQgdG8gY2hlY2sgRklGTydzIGFuZCBTb2NrZXRzLAorICogc2luY2UgdGhleSBoYXZlIHRoZSBzYW1lIHJlcXVpcmVtZW50OyB0aGUgaV9ibG9jayBmaWVsZHMgc2hvdWxkIGJlCisgKiB6ZXJvLgorICovCitzdGF0aWMgaW50CitlMmZzY2tfcGFzczFfY2hlY2tfZGV2aWNlX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpCit7CisJaW50ICAgICBpOworCisJLyoKKwkgKiBJZiBpX2Jsb2NrcyBpcyBub24temVybywgb3IgdGhlIGluZGV4IGZsYWcgaXMgc2V0LCB0aGVuCisJICogdGhpcyBpcyBhIGJvZ3VzIGRldmljZS9maWZvL3NvY2tldAorCSAqLworCWlmICgoZXh0MmZzX2lub2RlX2RhdGFfYmxvY2tzKGZzLCBpbm9kZSkgIT0gMCkgfHwKKwkgICAgKGlub2RlLT5pX2ZsYWdzICYgRVhUMl9JTkRFWF9GTCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBkbyB0aGUgdGVzdCBiZWxvdyBhbGwgdGhlIHRpbWUsIGJ1dAorCSAqIGJlY2F1c2UgdGhlIGtlcm5lbCBkb2Vzbid0IGZvcmNpYmx5IGNsZWFyIHRoZSBkZXZpY2UKKwkgKiBpbm9kZSdzIGFkZGl0aW9uYWwgaV9ibG9jayBmaWVsZHMsIHRoZXJlIGFyZSBzb21lIHJhcmUKKwkgKiBvY2Nhc2lvbnMgd2hlbiBhIGxlZ2l0aW1hdGUgZGV2aWNlIGlub2RlIHdpbGwgaGF2ZSBub24temVybworCSAqIGFkZGl0aW9uYWwgaV9ibG9jayBmaWVsZHMuICBTbyBmb3Igbm93LCB3ZSBvbmx5IGNvbXBsYWluCisJICogd2hlbiB0aGUgaW1tdXRhYmxlIGZsYWcgaXMgc2V0LCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuCisJICogZm9yIGRldmljZXMuICAoQW5kIHRoYXQncyB3aGVuIHRoZSBwcm9ibGVtIGlzIGNhdXNlZCwgc2luY2UKKwkgKiB5b3UgY2FuJ3Qgc2V0IG9yIGNsZWFyIGltbXV0YWJsZSBmbGFncyBmb3IgZGV2aWNlcy4pICBPbmNlCisJICogdGhlIGtlcm5lbCBoYXMgYmVlbiBmaXhlZCB3ZSBjYW4gY2hhbmdlIHRoaXMuLi4KKwkgKi8KKwlpZiAoaW5vZGUtPmlfZmxhZ3MgJiAoRVhUMl9JTU1VVEFCTEVfRkwgfCBFWFQyX0FQUEVORF9GTCkpIHsKKwkJZm9yIChpPTQ7IGkgPCBFWFQyX05fQkxPQ0tTOyBpKyspCisJCQlpZiAoaW5vZGUtPmlfYmxvY2tbaV0pCisJCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogQ2hlY2sgdG8gbWFrZSBzdXJlIGEgc3ltbGluayBpbm9kZSBpcyByZWFsLiAgUmV0dXJucyAxIGlmIHRoZSBzeW1saW5rCisgKiBjaGVja3Mgb3V0LCAwIGlmIG5vdC4KKyAqLworc3RhdGljIGludAorZTJmc2NrX3Bhc3MxX2NoZWNrX3N5bWxpbmsoZXh0Ml9maWxzeXMgZnMsIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGk7CisJYmxrX3QgICBibG9ja3M7CisKKwlpZiAoKGlub2RlLT5pX3NpemVfaGlnaCB8fCBpbm9kZS0+aV9zaXplID09IDApIHx8CisJICAgIChpbm9kZS0+aV9mbGFncyAmIEVYVDJfSU5ERVhfRkwpKQorCQlyZXR1cm4gMDsKKworCWJsb2NrcyA9IGV4dDJmc19pbm9kZV9kYXRhX2Jsb2NrcyhmcywgaW5vZGUpOworCWlmIChibG9ja3MpIHsKKwkJaWYgKChpbm9kZS0+aV9zaXplID49IGZzLT5ibG9ja3NpemUpIHx8CisJCSAgICAoYmxvY2tzICE9IGZzLT5ibG9ja3NpemUgPj4gOSkgfHwKKwkJICAgIChpbm9kZS0+aV9ibG9ja1swXSA8IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSB8fAorCQkgICAgKGlub2RlLT5pX2Jsb2NrWzBdID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpKQorCQkJcmV0dXJuIDA7CisKKwkJZm9yIChpID0gMTsgaSA8IEVYVDJfTl9CTE9DS1M7IGkrKykKKwkJCWlmIChpbm9kZS0+aV9ibG9ja1tpXSkKKwkJCQlyZXR1cm4gMDsKKworCQlpZiAoaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIGlub2RlLT5pX2Jsb2NrWzBdLCAxLCBidWYpKQorCQkJcmV0dXJuIDA7CisKKwkJbGVuID0gc3RybmxlbihidWYsIGZzLT5ibG9ja3NpemUpOworCQlpZiAobGVuID09IGZzLT5ibG9ja3NpemUpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAoaW5vZGUtPmlfc2l6ZSA+PSBzaXplb2YoaW5vZGUtPmlfYmxvY2spKQorCQkJcmV0dXJuIDA7CisKKwkJbGVuID0gc3RybmxlbigoY2hhciAqKWlub2RlLT5pX2Jsb2NrLCBzaXplb2YoaW5vZGUtPmlfYmxvY2spKTsKKwkJaWYgKGxlbiA9PSBzaXplb2YoaW5vZGUtPmlfYmxvY2spKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChsZW4gIT0gaW5vZGUtPmlfc2l6ZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJZiB0aGUgaW1tdXRhYmxlIChvciBhcHBlbmQtb25seSkgZmxhZyBpcyBzZXQgb24gdGhlIGlub2RlLCBvZmZlcgorICogdG8gY2xlYXIgaXQuCisgKi8KKyNkZWZpbmUgQkFEX1NQRUNJQUxfRkxBR1MgKEVYVDJfSU1NVVRBQkxFX0ZMIHwgRVhUMl9BUFBFTkRfRkwpCitzdGF0aWMgdm9pZCBjaGVja19pbW11dGFibGUoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCWlmICghKHBjdHgtPmlub2RlLT5pX2ZsYWdzICYgQkFEX1NQRUNJQUxfRkxBR1MpKQorCQlyZXR1cm47CisKKwlpZiAoIWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9TRVRfSU1NVVRBQkxFLCBwY3R4KSkKKwkJcmV0dXJuOworCisJcGN0eC0+aW5vZGUtPmlfZmxhZ3MgJj0gfkJBRF9TUEVDSUFMX0ZMQUdTOworCWUyZnNja193cml0ZV9pbm9kZShjdHgsIHBjdHgtPmlubywgcGN0eC0+aW5vZGUsICJwYXNzMSIpOworfQorCisvKgorICogSWYgZGV2aWNlLCBmaWZvIG9yIHNvY2tldCwgY2hlY2sgc2l6ZSBpcyB6ZXJvIC0tIGlmIG5vdCBvZmZlciB0bworICogY2xlYXIgaXQKKyAqLworc3RhdGljIHZvaWQgY2hlY2tfc2l6ZShlMmZzY2tfdCBjdHgsIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpCit7CisJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlID0gcGN0eC0+aW5vZGU7CisKKwlpZiAoKGlub2RlLT5pX3NpemUgPT0gMCkgJiYgKGlub2RlLT5pX3NpemVfaGlnaCA9PSAwKSkKKwkJcmV0dXJuOworCisJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzFfU0VUX05PTlpTSVpFLCBwY3R4KSkKKwkJcmV0dXJuOworCisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaW5vZGUtPmlfc2l6ZV9oaWdoID0gMDsKKwllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBwY3R4LT5pbm8sIHBjdHgtPmlub2RlLCAicGFzczEiKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZWFfaW5faW5vZGUoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYiA9IGN0eC0+ZnMtPnN1cGVyOworCXN0cnVjdCBleHQyX2lub2RlX2xhcmdlICppbm9kZTsKKwlzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSAqZW50cnk7CisJY2hhciAqc3RhcnQsICplbmQ7CisJaW50IHN0b3JhZ2Vfc2l6ZSwgcmVtYWluLCBvZmZzOworCWludCBwcm9ibGVtID0gMDsKKworCWlub2RlID0gKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIHBjdHgtPmlub2RlOworCXN0b3JhZ2Vfc2l6ZSA9IEVYVDJfSU5PREVfU0laRShjdHgtPmZzLT5zdXBlcikgLSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUgLQorCQlpbm9kZS0+aV9leHRyYV9pc2l6ZTsKKwlzdGFydCA9ICgoY2hhciAqKSBpbm9kZSkgKyBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUgKworCQlpbm9kZS0+aV9leHRyYV9pc2l6ZSArIHNpemVvZihfX3UzMik7CisJZW5kID0gKGNoYXIgKikgaW5vZGUgKyBFWFQyX0lOT0RFX1NJWkUoY3R4LT5mcy0+c3VwZXIpOworCWVudHJ5ID0gKHN0cnVjdCBleHQyX2V4dF9hdHRyX2VudHJ5ICopIHN0YXJ0OworCisJLyogc2NhbiBhbGwgZW50cnkncyBoZWFkZXJzIGZpcnN0ICovCisKKwkvKiB0YWtlIGZpbmlzaCBlbnRyeSAwVUwgaW50byBhY2NvdW50ICovCisJcmVtYWluID0gc3RvcmFnZV9zaXplIC0gc2l6ZW9mKF9fdTMyKTsKKwlvZmZzID0gZW5kIC0gc3RhcnQ7CisKKwl3aGlsZSAoIUVYVDJfRVhUX0lTX0xBU1RfRU5UUlkoZW50cnkpKSB7CisKKwkJLyogaGVhZGVyIGVhdHMgdGhpcyBzcGFjZSAqLworCQlyZW1haW4gLT0gc2l6ZW9mKHN0cnVjdCBleHQyX2V4dF9hdHRyX2VudHJ5KTsKKworCQkvKiBpcyBhdHRyaWJ1dGUgbmFtZSB2YWxpZD8gKi8KKwkJaWYgKEVYVDJfRVhUX0FUVFJfU0laRShlbnRyeS0+ZV9uYW1lX2xlbikgPiByZW1haW4pIHsKKwkJCXBjdHgtPm51bSA9IGVudHJ5LT5lX25hbWVfbGVuOworCQkJcHJvYmxlbSA9IFBSXzFfQVRUUl9OQU1FX0xFTjsKKwkJCWdvdG8gZml4OworCQl9CisKKwkJLyogYXR0cmlidXRlIGxlbiBlYXRzIHRoaXMgc3BhY2UgKi8KKwkJcmVtYWluIC09IEVYVDJfRVhUX0FUVFJfU0laRShlbnRyeS0+ZV9uYW1lX2xlbik7CisKKwkJLyogY2hlY2sgdmFsdWUgc2l6ZSAqLworCQlpZiAoZW50cnktPmVfdmFsdWVfc2l6ZSA9PSAwIHx8IGVudHJ5LT5lX3ZhbHVlX3NpemUgPiByZW1haW4pIHsKKwkJCXBjdHgtPm51bSA9IGVudHJ5LT5lX3ZhbHVlX3NpemU7CisJCQlwcm9ibGVtID0gUFJfMV9BVFRSX1ZBTFVFX1NJWkU7CisJCQlnb3RvIGZpeDsKKwkJfQorCisJCS8qIGNoZWNrIHZhbHVlIHBsYWNlbWVudCAqLworCQlpZiAoZW50cnktPmVfdmFsdWVfb2ZmcyArCisJCSAgICBFWFQyX1hBVFRSX1NJWkUoZW50cnktPmVfdmFsdWVfc2l6ZSkgIT0gb2ZmcykgeworCQkJcHJpbnRmKCIoZW50cnktPmVfdmFsdWVfb2ZmcyArIGVudHJ5LT5lX3ZhbHVlX3NpemU6ICVkLCBvZmZzOiAlZClcbiIsIGVudHJ5LT5lX3ZhbHVlX29mZnMgKyBlbnRyeS0+ZV92YWx1ZV9zaXplLCBvZmZzKTsKKwkJCXBjdHgtPm51bSA9IGVudHJ5LT5lX3ZhbHVlX29mZnM7CisJCQlwcm9ibGVtID0gUFJfMV9BVFRSX1ZBTFVFX09GRlNFVDsKKwkJCWdvdG8gZml4OworCQl9CisKKwkJLyogZV92YWx1ZV9ibG9jayBtdXN0IGJlIDAgaW4gaW5vZGUncyBlYSAqLworCQlpZiAoZW50cnktPmVfdmFsdWVfYmxvY2sgIT0gMCkgeworCQkJcGN0eC0+bnVtID0gZW50cnktPmVfdmFsdWVfYmxvY2s7CisJCQlwcm9ibGVtID0gUFJfMV9BVFRSX1ZBTFVFX0JMT0NLOworCQkJZ290byBmaXg7CisJCX0KKworCQkvKiBlX2hhc2ggbXVzdCBiZSAwIGluIGlub2RlJ3MgZWEgKi8KKwkJaWYgKGVudHJ5LT5lX2hhc2ggIT0gMCkgeworCQkJcGN0eC0+bnVtID0gZW50cnktPmVfaGFzaDsKKwkJCXByb2JsZW0gPSBQUl8xX0FUVFJfSEFTSDsKKwkJCWdvdG8gZml4OworCQl9CisKKwkJcmVtYWluIC09IGVudHJ5LT5lX3ZhbHVlX3NpemU7CisJCW9mZnMgLT0gRVhUMl9YQVRUUl9TSVpFKGVudHJ5LT5lX3ZhbHVlX3NpemUpOworCisJCWVudHJ5ID0gRVhUMl9FWFRfQVRUUl9ORVhUKGVudHJ5KTsKKwl9CitmaXg6CisJLyoKKwkgKiBpdCBzZWVtcyBsaWtlIGEgY29ycnVwdGlvbi4gaXQncyB2ZXJ5IHVubGlrZWx5IHdlIGNvdWxkIHJlcGFpcgorCSAqIEVBKHMpIGluIGF1dG9tYXRpYyBmYXNoaW9uIC1ienp6CisJICovCisJaWYgKHByb2JsZW0gPT0gMCB8fCAhZml4X3Byb2JsZW0oY3R4LCBwcm9ibGVtLCBwY3R4KSkKKwkJcmV0dXJuOworCisJLyogc2ltcGxlIHJlbW92ZSBhbGwgcG9zc2libGUgRUEocykgKi8KKwkqKChfX3UzMiAqKXN0YXJ0KSA9IDBVTDsKKwllMmZzY2tfd3JpdGVfaW5vZGVfZnVsbChjdHgsIHBjdHgtPmlubywgKHN0cnVjdCBleHQyX2lub2RlICopaW5vZGUsCisJCQkJRVhUMl9JTk9ERV9TSVpFKHNiKSwgInBhc3MxIik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2lub2RlX2V4dHJhX3NwYWNlKGUyZnNja190IGN0eCwgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqaW5vZGU7CisJX191MzIgKmVhbWFnaWM7CisJaW50IG1pbiwgbWF4OworCisJaW5vZGUgPSAoc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKikgcGN0eC0+aW5vZGU7CisJaWYgKEVYVDJfSU5PREVfU0laRShzYikgPT0gRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFKSB7CisJCS8qIHRoaXMgaXNuJ3QgbGFyZ2UgaW5vZGUuIHNvLCBub3RoaW5nIHRvIGNoZWNrICovCisJCXJldHVybjsKKwl9CisKKwkvKiBpX2V4dHJhX2lzaXplIG11c3QgY292ZXIgaV9leHRyYV9pc2l6ZSArIGlfcGFkMSBhdCBsZWFzdCAqLworCW1pbiA9IHNpemVvZihpbm9kZS0+aV9leHRyYV9pc2l6ZSkgKyBzaXplb2YoaW5vZGUtPmlfcGFkMSk7CisJbWF4ID0gRVhUMl9JTk9ERV9TSVpFKHNiKSAtIEVYVDJfR09PRF9PTERfSU5PREVfU0laRTsKKwkvKgorCSAqIEZvciBub3cgd2Ugd2lsbCBhbGxvdyBpX2V4dHJhX2lzaXplIHRvIGJlIDAsIGJ1dCByZWFsbHkKKwkgKiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5ldmVyIGFsbG93IGlfZXh0cmFfaXNpemUgdG8gYmUgMAorCSAqLworCWlmIChpbm9kZS0+aV9leHRyYV9pc2l6ZSAmJgorCSAgICAoaW5vZGUtPmlfZXh0cmFfaXNpemUgPCBtaW4gfHwgaW5vZGUtPmlfZXh0cmFfaXNpemUgPiBtYXgpKSB7CisJCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VYVFJBX0lTSVpFLCBwY3R4KSkKKwkJCXJldHVybjsKKwkJaW5vZGUtPmlfZXh0cmFfaXNpemUgPSBtaW47CisJCWUyZnNja193cml0ZV9pbm9kZV9mdWxsKGN0eCwgcGN0eC0+aW5vLCBwY3R4LT5pbm9kZSwKKwkJCQkJRVhUMl9JTk9ERV9TSVpFKHNiKSwgInBhc3MxIik7CisJCXJldHVybjsKKwl9CisKKwllYW1hZ2ljID0gKF9fdTMyICopICgoKGNoYXIgKikgaW5vZGUpICsgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFICsKKwkJCWlub2RlLT5pX2V4dHJhX2lzaXplKTsKKwlpZiAoKmVhbWFnaWMgPT0gRVhUMl9FWFRfQVRUUl9NQUdJQykgeworCQkvKiBpdCBzZWVtcyBpbm9kZSBoYXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlKHMpIGluIGJvZHkgKi8KKwkJY2hlY2tfZWFfaW5faW5vZGUoY3R4LCBwY3R4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGUyZnNja19wYXNzMShlMmZzY2tfdCBjdHgpCit7CisJaW50ICAgICBpOworCV9fdTY0ICAgbWF4X3NpemVzOworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlleHQyX2lub190ICAgICAgaW5vOworCXN0cnVjdCBleHQyX2lub2RlICppbm9kZTsKKwlleHQyX2lub2RlX3NjYW4gc2NhbjsKKwljaGFyICAgICAgICAgICAgKmJsb2NrX2J1ZjsKKwl1bnNpZ25lZCBjaGFyICAgZnJhZywgZnNpemU7CisJc3RydWN0ICAgICAgICAgIHByb2JsZW1fY29udGV4dCBwY3R4OworCXN0cnVjdCAgICAgICAgICBzY2FuX2NhbGxiYWNrX3N0cnVjdCBzY2FuX3N0cnVjdDsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlpbnQgICAgICAgICAgICAgaW1hZ2ljX2ZzOworCWludCAgICAgICAgICAgICBidXN0ZWRfZnNfdGltZSA9IDA7CisJaW50ICAgICAgICAgICAgIGlub2RlX3NpemU7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikpCisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9QQVNTX0hFQURFUiwgJnBjdHgpOworCisJaWYgKChmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCkgJiYKKwkgICAgIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX05PKSkgeworCQlpZiAoZXh0MmZzX3UzMl9saXN0X2NyZWF0ZSgmY3R4LT5kaXJzX3RvX2hhc2gsIDUwKSkKKwkJCWN0eC0+ZGlyc190b19oYXNoID0gMDsKKwl9CisKKwkvKiBQYXNzIDEgKi8KKworI2RlZmluZSBFWFQyX0JQUChiaXRzKSAoMVVMTCA8PCAoKGJpdHMpIC0gMikpCisKKwlmb3IgKGkgPSBFWFQyX01JTl9CTE9DS19MT0dfU0laRTsgaSA8PSBFWFQyX01BWF9CTE9DS19MT0dfU0laRTsgaSsrKSB7CisJCW1heF9zaXplcyA9IEVYVDJfTkRJUl9CTE9DS1MgKyBFWFQyX0JQUChpKTsKKwkJbWF4X3NpemVzID0gbWF4X3NpemVzICsgRVhUMl9CUFAoaSkgKiBFWFQyX0JQUChpKTsKKwkJbWF4X3NpemVzID0gbWF4X3NpemVzICsgRVhUMl9CUFAoaSkgKiBFWFQyX0JQUChpKSAqIEVYVDJfQlBQKGkpOworCQltYXhfc2l6ZXMgPSAobWF4X3NpemVzICogKDFVTCA8PCBpKSkgLSAxOworCQlleHQyX21heF9zaXplc1tpIC0gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkVdID0gbWF4X3NpemVzOworCX0KKyN1bmRlZiBFWFQyX0JQUAorCisJaW1hZ2ljX2ZzID0gKHNiLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9JTUFHSUNfSU5PREVTKTsKKworCS8qCisJICogQWxsb2NhdGUgYml0bWFwcyBzdHJ1Y3R1cmVzCisJICovCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2FsbG9jYXRlX2lub2RlX2JpdG1hcChmcywgXygiaW4tdXNlIGlub2RlIG1hcCIpLAorCQkJCQkgICAgICAmY3R4LT5pbm9kZV91c2VkX21hcCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4Lm51bSA9IDE7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BTExPQ0FURV9JQklUTUFQX0VSUk9SLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2FsbG9jYXRlX2lub2RlX2JpdG1hcChmcywKKwkJCQlfKCJkaXJlY3RvcnkgaW5vZGUgbWFwIiksICZjdHgtPmlub2RlX2Rpcl9tYXApOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5udW0gPSAyOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsCisJCQlfKCJyZWd1bGFyIGZpbGUgaW5vZGUgbWFwIiksICZjdHgtPmlub2RlX3JlZ19tYXApOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5udW0gPSA2OworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9ibG9ja19iaXRtYXAoZnMsIF8oImluLXVzZSBibG9jayBtYXAiKSwKKwkJCQkJICAgICAgJmN0eC0+YmxvY2tfZm91bmRfbWFwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHgubnVtID0gMTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX0JCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfY3JlYXRlX2ljb3VudDIoZnMsIDAsIDAsIDAsCisJCQkJCSAgICAgJmN0eC0+aW5vZGVfbGlua19pbmZvKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BTExPQ0FURV9JQ09VTlQsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlpbm9kZV9zaXplID0gRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcik7CisJaW5vZGUgPSAoc3RydWN0IGV4dDJfaW5vZGUgKikKKwkJZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsIGlub2RlX3NpemUsICJzY3JhdGNoIGlub2RlIik7CisKKwlpbm9kZXNfdG9fcHJvY2VzcyA9IChzdHJ1Y3QgcHJvY2Vzc19pbm9kZV9ibG9jayAqKQorCQllMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwKKwkJCQkgICAgICAgKGN0eC0+cHJvY2Vzc19pbm9kZV9zaXplICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBwcm9jZXNzX2lub2RlX2Jsb2NrKSksCisJCQkJICAgICAgICJhcnJheSBvZiBpbm9kZXMgdG8gcHJvY2VzcyIpOworCXByb2Nlc3NfaW5vZGVfY291bnQgPSAwOworCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2luaXRfZGJsaXN0KGZzLCAwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BTExPQ0FURV9EQkNPVU5ULCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBsYXN0IG9ycGhhbiBmaWVsZCBpcyBzZXQsIGNsZWFyIGl0LCBzaW5jZSB0aGUgcGFzczEKKwkgKiBwcm9jZXNzaW5nIHdpbGwgYXV0b21hdGljYWxseSBmaW5kIGFuZCBjbGVhciB0aGUgb3JwaGFucy4KKwkgKiBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgd2FudCB0byB0cnkgdXNpbmcgdGhlIGxhc3Rfb3JwaGFuCisJICogbGlua2VkIGxpc3Qgb3Vyc2VsdmVzLCBidXQgZm9yIG5vdywgd2UgY2xlYXIgaXQgc28gdGhhdCB0aGUKKwkgKiBleHQzIG1vdW50IGNvZGUgd29uJ3QgZ2V0IGNvbmZ1c2VkLgorCSAqLworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpKSB7CisJCWlmIChmcy0+c3VwZXItPnNfbGFzdF9vcnBoYW4pIHsKKwkJCWZzLT5zdXBlci0+c19sYXN0X29ycGhhbiA9IDA7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCX0KKwl9CisKKwltYXJrX3RhYmxlX2Jsb2NrcyhjdHgpOworCWJsb2NrX2J1ZiA9IChjaGFyICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCBmcy0+YmxvY2tzaXplICogMywKKwkJCQkJCSAgICAiYmxvY2sgaW50ZXJhdGUgYnVmZmVyIik7CisJZTJmc2NrX3VzZV9pbm9kZV9zaG9ydGN1dHMoY3R4LCAxKTsKKwllaGFuZGxlcl9vcGVyYXRpb24oXygiZG9pbmcgaW5vZGUgc2NhbiIpKTsKKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfb3Blbl9pbm9kZV9zY2FuKGZzLCBjdHgtPmlub2RlX2J1ZmZlcl9ibG9ja3MsCisJCQkJCSAgICAgICZzY2FuKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9JU0NBTl9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCWV4dDJmc19pbm9kZV9zY2FuX2ZsYWdzKHNjYW4sIEVYVDJfU0ZfU0tJUF9NSVNTSU5HX0lUQUJMRSwgMCk7CisJY3R4LT5zdGFzaGVkX2lub2RlID0gaW5vZGU7CisJc2Nhbl9zdHJ1Y3QuY3R4ID0gY3R4OworCXNjYW5fc3RydWN0LmJsb2NrX2J1ZiA9IGJsb2NrX2J1ZjsKKwlleHQyZnNfc2V0X2lub2RlX2NhbGxiYWNrKHNjYW4sIHNjYW5fY2FsbGJhY2ssICZzY2FuX3N0cnVjdCk7CisJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCWlmICgoY3R4LT5wcm9ncmVzcykoY3R4LCAxLCAwLCBjdHgtPmZzLT5ncm91cF9kZXNjX2NvdW50KSkKKwkJCXJldHVybjsKKwlpZiAoKGZzLT5zdXBlci0+c193dGltZSA8IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpIHx8CisJICAgIChmcy0+c3VwZXItPnNfbXRpbWUgPCBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KSkKKwkJYnVzdGVkX2ZzX3RpbWUgPSAxOworCisJd2hpbGUgKDEpIHsKKwkJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2dldF9uZXh0X2lub2RlX2Z1bGwoc2NhbiwgJmlubywKKwkJCQkJCQkgIGlub2RlLCBpbm9kZV9zaXplKTsKKwkJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJCXJldHVybjsKKwkJaWYgKHBjdHguZXJyY29kZSA9PSBFWFQyX0VUX0JBRF9CTE9DS19JTl9JTk9ERV9UQUJMRSkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0lTQ0FOX0VSUk9SLCAmcGN0eCk7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJcmV0dXJuOworCQl9CisJCWlmICghaW5vKQorCQkJYnJlYWs7CisJCXBjdHguaW5vID0gaW5vOworCQlwY3R4Lmlub2RlID0gaW5vZGU7CisJCWN0eC0+c3Rhc2hlZF9pbm8gPSBpbm87CisJCWlmIChpbm9kZS0+aV9saW5rc19jb3VudCkgeworCQkJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2xpbmtfaW5mbywKKwkJCQkJICAgaW5vLCBpbm9kZS0+aV9saW5rc19jb3VudCk7CisJCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQkJcGN0eC5udW0gPSBpbm9kZS0+aV9saW5rc19jb3VudDsKKwkJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfSUNPVU5UX1NUT1JFLCAmcGN0eCk7CisJCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJaWYgKGlubyA9PSBFWFQyX0JBRF9JTk8pIHsKKwkJCXN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xIHBiOworCisJCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfY29weV9iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsCisJCQkJCQkJICAmcGIuZnNfbWV0YV9ibG9ja3MpOworCQkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJCXBjdHgubnVtID0gNDsKKwkJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfQkJJVE1BUF9FUlJPUiwgJnBjdHgpOworCQkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcGIuaW5vID0gRVhUMl9CQURfSU5POworCQkJcGIubnVtX2Jsb2NrcyA9IHBiLmxhc3RfYmxvY2sgPSAwOworCQkJcGIubnVtX2lsbGVnYWxfYmxvY2tzID0gMDsKKwkJCXBiLnN1cHByZXNzID0gMDsgcGIuY2xlYXIgPSAwOyBwYi5pc19kaXIgPSAwOworCQkJcGIuaXNfcmVnID0gMDsgcGIuZnJhZ21lbnRlZCA9IDA7IHBiLmJiY2hlY2sgPSAwOworCQkJcGIuaW5vZGUgPSBpbm9kZTsKKwkJCXBiLnBjdHggPSAmcGN0eDsKKwkJCXBiLmN0eCA9IGN0eDsKKwkJCXBjdHguZXJyY29kZSA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLCAwLAorCQkJCSAgICAgYmxvY2tfYnVmLCBwcm9jZXNzX2JhZF9ibG9jaywgJnBiKTsKKwkJCWV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChwYi5mc19tZXRhX2Jsb2Nrcyk7CisJCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0JMT0NLX0lURVJBVEUsICZwY3R4KTsKKwkJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChwYi5iYmNoZWNrKQorCQkJCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8xX0JCSU5PREVfQkFEX01FVEFCTE9DS19QUk9NUFQsICZwY3R4KSkgeworCQkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsIGlubyk7CisJCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoaW5vID09IEVYVDJfUk9PVF9JTk8pIHsKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgdGhlIHJvb3QgaW5vZGUgaXMgYSBkaXJlY3Rvcnk7IGlmCisJCQkgKiBub3QsIG9mZmVyIHRvIGNsZWFyIGl0LiAgSXQgd2lsbCBiZQorCQkJICogcmVnbmVyYXRlZCBpbiBwYXNzICMzLgorCQkJICovCisJCQlpZiAoIUxJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX1JPT1RfTk9fRElSLCAmcGN0eCkpIHsKKwkJCQkJaW5vZGUtPmlfZHRpbWUgPSB0aW1lKE5VTEwpOworCQkJCQlpbm9kZS0+aV9saW5rc19jb3VudCA9IDA7CisJCQkJCWV4dDJmc19pY291bnRfc3RvcmUoY3R4LT5pbm9kZV9saW5rX2luZm8sCisJCQkJCQkJICAgIGlubywgMCk7CisJCQkJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgaW5vZGUsCisJCQkJCQkJICAgInBhc3MxIik7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIElmIGR0aW1lIGlzIHNldCwgb2ZmZXIgdG8gY2xlYXIgaXQuICBta2UyZnMKKwkJCSAqIHZlcnNpb24gMC4yYiBjcmVhdGVkIGZpbGVzeXN0ZW1zIHdpdGggdGhlCisJCQkgKiBkdGltZSBmaWVsZCBzZXQgZm9yIHRoZSByb290IGFuZCBsb3N0K2ZvdW5kCisJCQkgKiBkaXJlY3Rvcmllcy4gIFdlIHdvbid0IHdvcnJ5IGFib3V0CisJCQkgKiAvbG9zdCtmb3VuZCwgc2luY2UgdGhhdCBjYW4gYmUgcmVnZW5lcmF0ZWQKKwkJCSAqIGVhc2lseS4gIEJ1dCB3ZSB3aWxsIGZpeCB0aGUgcm9vdCBkaXJlY3RvcnkKKwkJCSAqIGFzIGEgc3BlY2lhbCBjYXNlLgorCQkJICovCisJCQlpZiAoaW5vZGUtPmlfZHRpbWUgJiYgaW5vZGUtPmlfbGlua3NfY291bnQpIHsKKwkJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX1JPT1RfRFRJTUUsICZwY3R4KSkgeworCQkJCQlpbm9kZS0+aV9kdGltZSA9IDA7CisJCQkJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgaW5vZGUsCisJCQkJCQkJICAgInBhc3MxIik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGlubyA9PSBFWFQyX0pPVVJOQUxfSU5PKSB7CisJCQlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaW5vKTsKKwkJCWlmIChmcy0+c3VwZXItPnNfam91cm5hbF9pbnVtID09IEVYVDJfSk9VUk5BTF9JTk8pIHsKKwkJCQlpZiAoIUxJTlVYX1NfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKKwkJCQkgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8xX0pPVVJOQUxfQkFEX01PREUsCisJCQkJCQkmcGN0eCkpIHsKKwkJCQkJaW5vZGUtPmlfbW9kZSA9IExJTlVYX1NfSUZSRUc7CisJCQkJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgaW5vZGUsCisJCQkJCQkJICAgInBhc3MxIik7CisJCQkJfQorCQkJCWNoZWNrX2Jsb2NrcyhjdHgsICZwY3R4LCBibG9ja19idWYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChpbm9kZS0+aV9saW5rc19jb3VudCB8fCBpbm9kZS0+aV9ibG9ja3MgfHwKKwkJCSAgICAgaW5vZGUtPmlfYmxvY2tzIHx8IGlub2RlLT5pX2Jsb2NrWzBdKSAmJgorCQkJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9KT1VSTkFMX0lOT0RFX05PVF9DTEVBUiwKKwkJCQkJJnBjdHgpKSB7CisJCQkJbWVtc2V0KGlub2RlLCAwLCBpbm9kZV9zaXplKTsKKwkJCQlleHQyZnNfaWNvdW50X3N0b3JlKGN0eC0+aW5vZGVfbGlua19pbmZvLAorCQkJCQkJICAgIGlubywgMCk7CisJCQkJZTJmc2NrX3dyaXRlX2lub2RlX2Z1bGwoY3R4LCBpbm8sIGlub2RlLAorCQkJCQkJCWlub2RlX3NpemUsICJwYXNzMSIpOworCQkJfQorCQl9IGVsc2UgaWYgKGlubyA8IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKSkgeworCQkJaW50ICAgICBwcm9ibGVtID0gMDsKKworCQkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsIGlubyk7CisJCQlpZiAoaW5vID09IEVYVDJfQk9PVF9MT0FERVJfSU5PKSB7CisJCQkJaWYgKExJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJCXByb2JsZW0gPSBQUl8xX1JFU0VSVkVEX0JBRF9NT0RFOworCQkJfSBlbHNlIGlmIChpbm8gPT0gRVhUMl9SRVNJWkVfSU5PKSB7CisJCQkJaWYgKGlub2RlLT5pX21vZGUgJiYKKwkJCQkgICAgIUxJTlVYX1NfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCQkJCXByb2JsZW0gPSBQUl8xX1JFU0VSVkVEX0JBRF9NT0RFOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaW5vZGUtPmlfbW9kZSAhPSAwKQorCQkJCQlwcm9ibGVtID0gUFJfMV9SRVNFUlZFRF9CQURfTU9ERTsKKwkJCX0KKwkJCWlmIChwcm9ibGVtKSB7CisJCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgcHJvYmxlbSwgJnBjdHgpKSB7CisJCQkJCWlub2RlLT5pX21vZGUgPSAwOworCQkJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sIGlub2RlLAorCQkJCQkJCSAgICJwYXNzMSIpOworCQkJCX0KKwkJCX0KKwkJCWNoZWNrX2Jsb2NrcyhjdHgsICZwY3R4LCBibG9ja19idWYpOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogQ2hlY2sgZm9yIGlub2RlcyB3aG8gbWlnaHQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlCisJCSAqIG9ycGhhbmVkIGxpc3QgbGlua2VkIGxpc3QuICBUaGV5IHNob3VsZCBoYXZlIGdvdHRlbgorCQkgKiBkZWFsdCB3aXRoIGJ5IG5vdywgdW5sZXNzIHRoZSBsaXN0IGhhZCBzb21laG93IGJlZW4KKwkJICogY29ycnVwdGVkLgorCQkgKgorCQkgKiBGSVhNRTogSW4gdGhlIGZ1dHVyZSwgaW5vZGVzIHdoaWNoIGFyZSBzdGlsbCBpbiB1c2UKKwkJICogKGFuZCB3aGljaCBhcmUgdGhlcmVmb3JlKSBwZW5kaW5nIHRydW5jYXRpb24gc2hvdWxkCisJCSAqIGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgUmlnaHQgbm93IHdlIGp1c3QgY2xlYXIgdGhlCisJCSAqIGR0aW1lIGZpZWxkLCBhbmQgdGhlIG5vcm1hbCBlMmZzY2sgaGFuZGxpbmcgb2YKKwkJICogaW5vZGVzIHdoZXJlIGlfc2l6ZSBhbmQgdGhlIGlub2RlIGJsb2NrcyBhcmUKKwkJICogaW5jb25zaXN0ZW50IGlzIHRvIGZpeCBpX3NpemUsIGluc3RlYWQgb2YgcmVsZWFzaW5nCisJCSAqIHRoZSBleHRyYSBibG9ja3MuICBUaGlzIHdvbid0IGNhdGNoIHRoZSBpbm9kZXMgdGhhdAorCQkgKiB3YXMgYXQgdGhlIGVuZCBvZiB0aGUgb3JwaGFuIGxpc3QsIGJ1dCBpdCdzIGJldHRlcgorCQkgKiB0aGFuIG5vdGhpbmcuICBUaGUgcmlnaHQgYW5zd2VyIGlzIHRoYXQgdGhlcmUKKwkJICogc2hvdWxkbid0IGJlIGFueSBidWdzIGluIHRoZSBvcnBoYW4gbGlzdCBoYW5kbGluZy4gIDotKQorCQkgKi8KKwkJaWYgKGlub2RlLT5pX2R0aW1lICYmICFidXN0ZWRfZnNfdGltZSAmJgorCQkgICAgaW5vZGUtPmlfZHRpbWUgPCBjdHgtPmZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfTE9XX0RUSU1FLCAmcGN0eCkpIHsKKwkJCQlpbm9kZS0+aV9kdGltZSA9IGlub2RlLT5pX2xpbmtzX2NvdW50ID8KKwkJCQkJMCA6IHRpbWUoTlVMTCk7CisJCQkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCBpbm9kZSwKKwkJCQkJCSAgICJwYXNzMSIpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBkZWxldGVkIGlub2RlcyBoYXZlCisJCSAqIGlfbGlua3NfY291bnQgc2V0IHRvIDAuCisJCSAqLworCQlpZiAoIWlub2RlLT5pX2xpbmtzX2NvdW50KSB7CisJCQlpZiAoIWlub2RlLT5pX2R0aW1lICYmIGlub2RlLT5pX21vZGUpIHsKKwkJCQlpZiAoZml4X3Byb2JsZW0oY3R4LAorCQkJCQkgICAgUFJfMV9aRVJPX0RUSU1FLCAmcGN0eCkpIHsKKwkJCQkJaW5vZGUtPmlfZHRpbWUgPSB0aW1lKE5VTEwpOworCQkJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sIGlub2RlLAorCQkJCQkJCSAgICJwYXNzMSIpOworCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIG4uYi4gIDAuM2MgZXh0MmZzIGNvZGUgZGlkbid0IGNsZWFyIGlfbGlua3NfY291bnQgZm9yCisJCSAqIGRlbGV0ZWQgZmlsZXMuICBPb3BzLgorCQkgKgorCQkgKiBTaW5jZSBhbGwgbmV3IGV4dDIgaW1wbGVtZW50YXRpb25zIGdldCB0aGlzIHJpZ2h0LAorCQkgKiB3ZSBub3cgYXNzdW1lIHRoYXQgdGhlIGNhc2Ugb2Ygbm9uLXplcm8KKwkJICogaV9saW5rc19jb3VudCBhbmQgbm9uLXplcm8gZHRpbWUgbWVhbnMgdGhhdCB3ZQorCQkgKiBzaG91bGQga2VlcCB0aGUgZmlsZSwgbm90IGRlbGV0ZSBpdC4KKwkJICoKKwkJICovCisJCWlmIChpbm9kZS0+aV9kdGltZSkgeworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9TRVRfRFRJTUUsICZwY3R4KSkgeworCQkJCWlub2RlLT5pX2R0aW1lID0gMDsKKwkJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sIGlub2RlLCAicGFzczEiKTsKKwkJCX0KKwkJfQorCisJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOworCQlzd2l0Y2ggKGZzLT5zdXBlci0+c19jcmVhdG9yX29zKSB7CisJCSAgICBjYXNlIEVYVDJfT1NfTElOVVg6CisJCQlmcmFnID0gaW5vZGUtPm9zZDIubGludXgyLmxfaV9mcmFnOworCQkJZnNpemUgPSBpbm9kZS0+b3NkMi5saW51eDIubF9pX2ZzaXplOworCQkJYnJlYWs7CisJCSAgICBjYXNlIEVYVDJfT1NfSFVSRDoKKwkJCWZyYWcgPSBpbm9kZS0+b3NkMi5odXJkMi5oX2lfZnJhZzsKKwkJCWZzaXplID0gaW5vZGUtPm9zZDIuaHVyZDIuaF9pX2ZzaXplOworCQkJYnJlYWs7CisJCSAgICBjYXNlIEVYVDJfT1NfTUFTSVg6CisJCQlmcmFnID0gaW5vZGUtPm9zZDIubWFzaXgyLm1faV9mcmFnOworCQkJZnNpemUgPSBpbm9kZS0+b3NkMi5tYXNpeDIubV9pX2ZzaXplOworCQkJYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkJZnJhZyA9IGZzaXplID0gMDsKKwkJfQorCisJCWlmIChpbm9kZS0+aV9mYWRkciB8fCBmcmFnIHx8IGZzaXplIHx8CisJCSAgICAoTElOVVhfU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBpbm9kZS0+aV9kaXJfYWNsKSkKKwkJCW1hcmtfaW5vZGVfYmFkKGN0eCwgaW5vKTsKKwkJaWYgKGlub2RlLT5pX2ZsYWdzICYgRVhUMl9JTUFHSUNfRkwpIHsKKwkJCWlmIChpbWFnaWNfZnMpIHsKKwkJCQlpZiAoIWN0eC0+aW5vZGVfaW1hZ2ljX21hcCkKKwkJCQkJYWxsb2NfaW1hZ2ljX21hcChjdHgpOworCQkJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2ltYWdpY19tYXAsCisJCQkJCQkJIGlubyk7CisJCQl9IGVsc2UgeworCQkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfU0VUX0lNQUdJQywgJnBjdHgpKSB7CisJCQkJCWlub2RlLT5pX2ZsYWdzICY9IH5FWFQyX0lNQUdJQ19GTDsKKwkJCQkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLAorCQkJCQkJCSAgIGlub2RlLCAicGFzczEiKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQljaGVja19pbm9kZV9leHRyYV9zcGFjZShjdHgsICZwY3R4KTsKKworCQlpZiAoTElOVVhfU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgaW5vKTsKKwkJCWUyZnNja19hZGRfZGlyX2luZm8oY3R4LCBpbm8sIDApOworCQkJY3R4LT5mc19kaXJlY3RvcnlfY291bnQrKzsKKwkJfSBlbHNlIGlmIChMSU5VWF9TX0lTUkVHIChpbm9kZS0+aV9tb2RlKSkgeworCQkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfcmVnX21hcCwgaW5vKTsKKwkJCWN0eC0+ZnNfcmVndWxhcl9jb3VudCsrOworCQl9IGVsc2UgaWYgKExJTlVYX1NfSVNDSFIgKGlub2RlLT5pX21vZGUpICYmCisJCQkgICBlMmZzY2tfcGFzczFfY2hlY2tfZGV2aWNlX2lub2RlKGZzLCBpbm9kZSkpIHsKKwkJCWNoZWNrX2ltbXV0YWJsZShjdHgsICZwY3R4KTsKKwkJCWNoZWNrX3NpemUoY3R4LCAmcGN0eCk7CisJCQljdHgtPmZzX2NoYXJkZXZfY291bnQrKzsKKwkJfSBlbHNlIGlmIChMSU5VWF9TX0lTQkxLIChpbm9kZS0+aV9tb2RlKSAmJgorCQkJICAgZTJmc2NrX3Bhc3MxX2NoZWNrX2RldmljZV9pbm9kZShmcywgaW5vZGUpKSB7CisJCQljaGVja19pbW11dGFibGUoY3R4LCAmcGN0eCk7CisJCQljaGVja19zaXplKGN0eCwgJnBjdHgpOworCQkJY3R4LT5mc19ibG9ja2Rldl9jb3VudCsrOworCQl9IGVsc2UgaWYgKExJTlVYX1NfSVNMTksgKGlub2RlLT5pX21vZGUpICYmCisJCQkgICBlMmZzY2tfcGFzczFfY2hlY2tfc3ltbGluayhmcywgaW5vZGUsIGJsb2NrX2J1ZikpIHsKKwkJCWNoZWNrX2ltbXV0YWJsZShjdHgsICZwY3R4KTsKKwkJCWN0eC0+ZnNfc3ltbGlua3NfY291bnQrKzsKKwkJCWlmIChleHQyZnNfaW5vZGVfZGF0YV9ibG9ja3MoZnMsIGlub2RlKSA9PSAwKSB7CisJCQkJY3R4LT5mc19mYXN0X3N5bWxpbmtzX2NvdW50Kys7CisJCQkJY2hlY2tfYmxvY2tzKGN0eCwgJnBjdHgsIGJsb2NrX2J1Zik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoTElOVVhfU19JU0ZJRk8gKGlub2RlLT5pX21vZGUpICYmCisJCQkgZTJmc2NrX3Bhc3MxX2NoZWNrX2RldmljZV9pbm9kZShmcywgaW5vZGUpKSB7CisJCQljaGVja19pbW11dGFibGUoY3R4LCAmcGN0eCk7CisJCQljaGVja19zaXplKGN0eCwgJnBjdHgpOworCQkJY3R4LT5mc19maWZvX2NvdW50Kys7CisJCX0gZWxzZSBpZiAoKExJTlVYX1NfSVNTT0NLIChpbm9kZS0+aV9tb2RlKSkgJiYKKwkJCSAgIGUyZnNja19wYXNzMV9jaGVja19kZXZpY2VfaW5vZGUoZnMsIGlub2RlKSkgeworCQkJY2hlY2tfaW1tdXRhYmxlKGN0eCwgJnBjdHgpOworCQkJY2hlY2tfc2l6ZShjdHgsICZwY3R4KTsKKwkJCWN0eC0+ZnNfc29ja2V0c19jb3VudCsrOworCQl9IGVsc2UKKwkJCW1hcmtfaW5vZGVfYmFkKGN0eCwgaW5vKTsKKwkJaWYgKGlub2RlLT5pX2Jsb2NrW0VYVDJfSU5EX0JMT0NLXSkKKwkJCWN0eC0+ZnNfaW5kX2NvdW50Kys7CisJCWlmIChpbm9kZS0+aV9ibG9ja1tFWFQyX0RJTkRfQkxPQ0tdKQorCQkJY3R4LT5mc19kaW5kX2NvdW50Kys7CisJCWlmIChpbm9kZS0+aV9ibG9ja1tFWFQyX1RJTkRfQkxPQ0tdKQorCQkJY3R4LT5mc190aW5kX2NvdW50Kys7CisJCWlmIChpbm9kZS0+aV9ibG9ja1tFWFQyX0lORF9CTE9DS10gfHwKKwkJICAgIGlub2RlLT5pX2Jsb2NrW0VYVDJfRElORF9CTE9DS10gfHwKKwkJICAgIGlub2RlLT5pX2Jsb2NrW0VYVDJfVElORF9CTE9DS10gfHwKKwkJICAgIGlub2RlLT5pX2ZpbGVfYWNsKSB7CisJCQlpbm9kZXNfdG9fcHJvY2Vzc1twcm9jZXNzX2lub2RlX2NvdW50XS5pbm8gPSBpbm87CisJCQlpbm9kZXNfdG9fcHJvY2Vzc1twcm9jZXNzX2lub2RlX2NvdW50XS5pbm9kZSA9ICppbm9kZTsKKwkJCXByb2Nlc3NfaW5vZGVfY291bnQrKzsKKwkJfSBlbHNlCisJCQljaGVja19ibG9ja3MoY3R4LCAmcGN0eCwgYmxvY2tfYnVmKTsKKworCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJcmV0dXJuOworCisJCWlmIChwcm9jZXNzX2lub2RlX2NvdW50ID49IGN0eC0+cHJvY2Vzc19pbm9kZV9zaXplKSB7CisJCQlwcm9jZXNzX2lub2RlcyhjdHgsIGJsb2NrX2J1Zik7CisKKwkJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCQkJcmV0dXJuOworCQl9CisJfQorCXByb2Nlc3NfaW5vZGVzKGN0eCwgYmxvY2tfYnVmKTsKKwlleHQyZnNfY2xvc2VfaW5vZGVfc2NhbihzY2FuKTsKKwllaGFuZGxlcl9vcGVyYXRpb24oMCk7CisKKwkvKgorCSAqIElmIGFueSBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2tzJyByZWZlcmVuY2UgY291bnRzIG5lZWQgdG8KKwkgKiBiZSBhZGp1c3RlZCwgZWl0aGVyIHVwIChjdHgtPnJlZmNvdW50X2V4dHJhKSwgb3IgZG93bgorCSAqIChjdHgtPnJlZmNvdW50KSwgdGhlbiBmaXggdGhlbS4KKwkgKi8KKwlpZiAoY3R4LT5yZWZjb3VudCkgeworCQlhZGp1c3RfZXh0YXR0cl9yZWZjb3VudChjdHgsIGN0eC0+cmVmY291bnQsIGJsb2NrX2J1ZiwgLTEpOworCQllYV9yZWZjb3VudF9mcmVlKGN0eC0+cmVmY291bnQpOworCQljdHgtPnJlZmNvdW50ID0gMDsKKwl9CisJaWYgKGN0eC0+cmVmY291bnRfZXh0cmEpIHsKKwkJYWRqdXN0X2V4dGF0dHJfcmVmY291bnQoY3R4LCBjdHgtPnJlZmNvdW50X2V4dHJhLAorCQkJCQlibG9ja19idWYsICsxKTsKKwkJZWFfcmVmY291bnRfZnJlZShjdHgtPnJlZmNvdW50X2V4dHJhKTsKKwkJY3R4LT5yZWZjb3VudF9leHRyYSA9IDA7CisJfQorCisJaWYgKGN0eC0+aW52YWxpZF9iaXRtYXBzKQorCQloYW5kbGVfZnNfYmFkX2Jsb2NrcyhjdHgpOworCisJLyogV2UgZG9uJ3QgbmVlZCB0aGUgYmxvY2tfZWFfbWFwIGFueSBtb3JlICovCisJZXh0MmZzX2ZyZWVfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZWFfbWFwKTsKKwljdHgtPmJsb2NrX2VhX21hcCA9IDA7CisKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1JFU0laRV9JTk9ERSkgeworCQlleHQyZnNfYmxvY2tfYml0bWFwIHNhdmVfYm1hcDsKKworCQlzYXZlX2JtYXAgPSBmcy0+YmxvY2tfbWFwOworCQlmcy0+YmxvY2tfbWFwID0gY3R4LT5ibG9ja19mb3VuZF9tYXA7CisJCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJCXBjdHguZXJyY29kZSA9IGV4dDJmc19jcmVhdGVfcmVzaXplX2lub2RlKGZzKTsKKwkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX1JFU0laRV9JTk9ERV9DUkVBVEUsICZwY3R4KTsKKwkJCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCQllMmZzY2tfcmVhZF9pbm9kZShjdHgsIEVYVDJfUkVTSVpFX0lOTywgaW5vZGUsCisJCQkJICAicmVjcmVhdGUgaW5vZGUiKTsKKwkJaW5vZGUtPmlfbXRpbWUgPSB0aW1lKE5VTEwpOworCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBFWFQyX1JFU0laRV9JTk8sIGlub2RlLAorCQkJCSAgInJlY3JlYXRlIGlub2RlIik7CisJCWZzLT5ibG9ja19tYXAgPSBzYXZlX2JtYXA7CisJCWN0eC0+ZmxhZ3MgJj0gfkUyRl9GTEFHX1JFU0laRV9JTk9ERTsKKwl9CisKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1JFU1RBUlQpIHsKKwkJLyoKKwkJICogT25seSB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHN1cGVyYmxvY2sgYW5kIGJsb2NrCisJCSAqIGdyb3VwIGRlc2NyaXB0b3JzIGFyZSBnb2luZyB0byBiZSB3cml0dGVuIGR1cmluZyBhCisJCSAqIHJlc3RhcnQsIHNvIHNldCB0aGUgc3VwZXJibG9jayB0byBiZSB1c2VkIHRvIGJlIHRoZQorCQkgKiBtYXN0ZXIgc3VwZXJibG9jay4KKwkJICovCisJCWN0eC0+dXNlX3N1cGVyYmxvY2sgPSAwOworCQl1bndpbmRfcGFzczEoKTsKKwkJZ290byBlbmRpdDsKKwl9CisKKwlpZiAoY3R4LT5ibG9ja19kdXBfbWFwKSB7CisJCWlmIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSB7CisJCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0RVUF9CTE9DS1NfUFJFRU5TVE9QLCAmcGN0eCk7CisJCX0KKwkJZTJmc2NrX3Bhc3MxX2R1cGJsb2NrcyhjdHgsIGJsb2NrX2J1Zik7CisJfQorCWV4dDJmc19mcmVlX21lbSgmaW5vZGVzX3RvX3Byb2Nlc3MpOworZW5kaXQ6CisJZTJmc2NrX3VzZV9pbm9kZV9zaG9ydGN1dHMoY3R4LCAwKTsKKworCWV4dDJmc19mcmVlX21lbSgmYmxvY2tfYnVmKTsKKwlleHQyZnNfZnJlZV9tZW0oJmlub2RlKTsKK30KKworLyoKKyAqIFdoZW4gdGhlIGlub2RlX3NjYW4gcm91dGluZXMgY2FsbCB0aGlzIGNhbGxiYWNrIGF0IHRoZSBlbmQgb2YgdGhlCisgKiBnbG9jayBncm91cCwgY2FsbCBwcm9jZXNzX2lub2Rlcy4KKyAqLworc3RhdGljIGVycmNvZGVfdCBzY2FuX2NhbGxiYWNrKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgICAgIGRncnBfdCBncm91cCwgdm9pZCAqIHByaXZfZGF0YSkKK3sKKwlzdHJ1Y3Qgc2Nhbl9jYWxsYmFja19zdHJ1Y3QgKnNjYW5fc3RydWN0OworCWUyZnNja190IGN0eDsKKworCXNjYW5fc3RydWN0ID0gKHN0cnVjdCBzY2FuX2NhbGxiYWNrX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJY3R4ID0gc2Nhbl9zdHJ1Y3QtPmN0eDsKKworCXByb2Nlc3NfaW5vZGVzKChlMmZzY2tfdCkgZnMtPnByaXZfZGF0YSwgc2Nhbl9zdHJ1Y3QtPmJsb2NrX2J1Zik7CisKKwlpZiAoY3R4LT5wcm9ncmVzcykKKwkJaWYgKChjdHgtPnByb2dyZXNzKShjdHgsIDEsIGdyb3VwKzEsCisJCQkJICAgIGN0eC0+ZnMtPmdyb3VwX2Rlc2NfY291bnQpKQorCQkJcmV0dXJuIEVYVDJfRVRfQ0FOQ0VMX1JFUVVFU1RFRDsKKworCXJldHVybiAwOworfQorCisvKgorICogUHJvY2VzcyB0aGUgaW5vZGVzIGluIHRoZSAiaW5vZGVzIHRvIHByb2Nlc3MiIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfaW5vZGVzKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKQoreworCWludCAgICAgICAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgKm9sZF9zdGFzaGVkX2lub2RlOworCWV4dDJfaW5vX3QgICAgICAgICAgICAgIG9sZF9zdGFzaGVkX2lubzsKKwljb25zdCBjaGFyICAgICAgICAgICAgICAqb2xkX29wZXJhdGlvbjsKKwljaGFyICAgICAgICAgICAgICAgICAgICBidWZbODBdOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisKKwkvKiBiZWdpbiBwcm9jZXNzX2lub2RlcyAqLworCWlmIChwcm9jZXNzX2lub2RlX2NvdW50ID09IDApCisJCXJldHVybjsKKwlvbGRfb3BlcmF0aW9uID0gZWhhbmRsZXJfb3BlcmF0aW9uKDApOworCW9sZF9zdGFzaGVkX2lub2RlID0gY3R4LT5zdGFzaGVkX2lub2RlOworCW9sZF9zdGFzaGVkX2lubyA9IGN0eC0+c3Rhc2hlZF9pbm87CisJcXNvcnQoaW5vZGVzX3RvX3Byb2Nlc3MsIHByb2Nlc3NfaW5vZGVfY291bnQsCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgcHJvY2Vzc19pbm9kZV9ibG9jayksIHByb2Nlc3NfaW5vZGVfY21wKTsKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCWZvciAoaT0wOyBpIDwgcHJvY2Vzc19pbm9kZV9jb3VudDsgaSsrKSB7CisJCXBjdHguaW5vZGUgPSBjdHgtPnN0YXNoZWRfaW5vZGUgPSAmaW5vZGVzX3RvX3Byb2Nlc3NbaV0uaW5vZGU7CisJCXBjdHguaW5vID0gY3R4LT5zdGFzaGVkX2lubyA9IGlub2Rlc190b19wcm9jZXNzW2ldLmlubzsKKwkJc3ByaW50ZihidWYsIF8oInJlYWRpbmcgaW5kaXJlY3QgYmxvY2tzIG9mIGlub2RlICV1IiksCisJCQlwY3R4Lmlubyk7CisJCWVoYW5kbGVyX29wZXJhdGlvbihidWYpOworCQljaGVja19ibG9ja3MoY3R4LCAmcGN0eCwgYmxvY2tfYnVmKTsKKwkJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJCWJyZWFrOworCX0KKwljdHgtPnN0YXNoZWRfaW5vZGUgPSBvbGRfc3Rhc2hlZF9pbm9kZTsKKwljdHgtPnN0YXNoZWRfaW5vID0gb2xkX3N0YXNoZWRfaW5vOworCXByb2Nlc3NfaW5vZGVfY291bnQgPSAwOworCS8qIGVuZCBwcm9jZXNzIGlub2RlcyAqLworCisJZWhhbmRsZXJfb3BlcmF0aW9uKG9sZF9vcGVyYXRpb24pOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfaW5vZGVfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IHByb2Nlc3NfaW5vZGVfYmxvY2sgKmliX2EgPQorCQkoY29uc3Qgc3RydWN0IHByb2Nlc3NfaW5vZGVfYmxvY2sgKikgYTsKKwljb25zdCBzdHJ1Y3QgcHJvY2Vzc19pbm9kZV9ibG9jayAqaWJfYiA9CisJCShjb25zdCBzdHJ1Y3QgcHJvY2Vzc19pbm9kZV9ibG9jayAqKSBiOworCWludCAgICAgcmV0OworCisJcmV0ID0gKGliX2EtPmlub2RlLmlfYmxvY2tbRVhUMl9JTkRfQkxPQ0tdIC0KKwkgICAgICAgaWJfYi0+aW5vZGUuaV9ibG9ja1tFWFQyX0lORF9CTE9DS10pOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gaWJfYS0+aW5vZGUuaV9maWxlX2FjbCAtIGliX2ItPmlub2RlLmlfZmlsZV9hY2w7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1hcmsgYW4gaW5vZGUgYXMgYmVpbmcgYmFkIGluIHNvbWUgd2hhdAorICovCitzdGF0aWMgdm9pZCBtYXJrX2lub2RlX2JhZChlMmZzY2tfdCBjdHgsIGlub190IGlubykKK3sKKwlzdHJ1Y3QgICAgICAgICAgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisKKwlpZiAoIWN0eC0+aW5vZGVfYmFkX21hcCkgeworCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoY3R4LT5mcywKKwkJCSAgICBfKCJiYWQgaW5vZGUgbWFwIiksICZjdHgtPmlub2RlX2JhZF9tYXApOworCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQlwY3R4Lm51bSA9IDM7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiwgJnBjdHgpOworCQkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJcmV0dXJuOworCQl9CisJfQorCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2JhZF9tYXAsIGlubyk7Cit9CisKKworLyoKKyAqIFRoaXMgcHJvY2VkdXJlIHdpbGwgYWxsb2NhdGUgdGhlIGlub2RlIGltYWdpYyB0YWJsZQorICovCitzdGF0aWMgdm9pZCBhbGxvY19pbWFnaWNfbWFwKGUyZnNja190IGN0eCkKK3sKKwlzdHJ1Y3QgICAgICAgICAgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoY3R4LT5mcywKKwkJCQkJICAgICAgXygiaW1hZ2ljIGlub2RlIG1hcCIpLAorCQkJCQkgICAgICAmY3R4LT5pbm9kZV9pbWFnaWNfbWFwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHgubnVtID0gNTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9Cit9CisKKy8qCisgKiBNYXJrcyBhIGJsb2NrIGFzIGluIHVzZSwgc2V0dGluZyB0aGUgZHVwX21hcCBpZiBpdCdzIGJlZW4gc2V0CisgKiBhbHJlYWR5LiAgQ2FsbGVkIGJ5IHByb2Nlc3NfYmxvY2sgYW5kIHByb2Nlc3NfYmFkX2Jsb2NrLgorICoKKyAqIFdBUk5JTkc6IEFzc3VtZXMgY2hlY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGRvbmUgdG8gbWFrZSBzdXJlIGJsb2NrCisgKiBpcyB2YWxpZC4gIFRoaXMgaXMgdHJ1ZSBpbiBib3RoIHByb2Nlc3NfYmxvY2sgYW5kIHByb2Nlc3NfYmFkX2Jsb2NrLgorICovCitzdGF0aWMgdm9pZCBtYXJrX2Jsb2NrX3VzZWQoZTJmc2NrX3QgY3R4LCBibGtfdCBibG9jaykKK3sKKwlzdHJ1Y3QgICAgICAgICAgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJaWYgKGV4dDJmc19mYXN0X3Rlc3RfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLCBibG9jaykpIHsKKwkJaWYgKCFjdHgtPmJsb2NrX2R1cF9tYXApIHsKKwkJCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9ibG9ja19iaXRtYXAoY3R4LT5mcywKKwkJCSAgICAgIF8oIm11bHRpcGx5IGNsYWltZWQgYmxvY2sgbWFwIiksCisJCQkgICAgICAmY3R4LT5ibG9ja19kdXBfbWFwKTsKKwkJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCQlwY3R4Lm51bSA9IDM7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX0JCSVRNQVBfRVJST1IsCisJCQkJCSAgICAmcGN0eCk7CisJCQkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZXh0MmZzX2Zhc3RfbWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19kdXBfbWFwLCBibG9jayk7CisJfSBlbHNlIHsKKwkJZXh0MmZzX2Zhc3RfbWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsIGJsb2NrKTsKKwl9Cit9CisKKy8qCisgKiBBZGp1c3QgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jaydzIHJlZmVyZW5jZSBjb3VudHMgYXQgdGhlIGVuZAorICogb2YgcGFzcyAxLCBlaXRoZXIgYnkgc3VidHJhY3Rpbmcgb3V0IHJlZmVyZW5jZXMgZm9yIEVBIGJsb2NrcyB0aGF0CisgKiBhcmUgc3RpbGwgcmVmZXJlbmNlZCBpbiBjdHgtPnJlZmNvdW50LCBvciBieSBhZGRpbmcgcmVmZXJlbmNlcyBmb3IKKyAqIEVBIGJsb2NrcyB0aGF0IGhhZCBleHRyYSByZWZlcmVuY2VzIGFzIGFjY291bnRlZCBmb3IgaW4KKyAqIGN0eC0+cmVmY291bnRfZXh0cmEuCisgKi8KK3N0YXRpYyB2b2lkIGFkanVzdF9leHRhdHRyX3JlZmNvdW50KGUyZnNja190IGN0eCwgZXh0Ml9yZWZjb3VudF90IHJlZmNvdW50LAorCQkJCSAgICBjaGFyICpibG9ja19idWYsIGludCBhZGp1c3Rfc2lnbikKK3sKKwlzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9oZWFkZXIgICAgICpoZWFkZXI7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgICAgICAgICBwY3R4OworCWV4dDJfZmlsc3lzICAgICAgICAgICAgICAgICAgICAgZnMgPSBjdHgtPmZzOworCWJsa190ICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrOworCV9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2JlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJZWFfcmVmY291bnRfaW50cl9iZWdpbihyZWZjb3VudCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKChibGsgPSBlYV9yZWZjb3VudF9pbnRyX25leHQocmVmY291bnQsICZjb3VudCkpID09IDApCisJCQlicmVhazsKKwkJcGN0eC5ibGsgPSBibGs7CisJCXBjdHguZXJyY29kZSA9IGV4dDJmc19yZWFkX2V4dF9hdHRyKGZzLCBibGssIGJsb2NrX2J1Zik7CisJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FWFRBVFRSX1JFQURfQUJPUlQsICZwY3R4KTsKKwkJCXJldHVybjsKKwkJfQorCQloZWFkZXIgPSAoc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyICopIGJsb2NrX2J1ZjsKKwkJcGN0eC5ibGtjb3VudCA9IGhlYWRlci0+aF9yZWZjb3VudDsKKwkJc2hvdWxkX2JlID0gaGVhZGVyLT5oX3JlZmNvdW50ICsgYWRqdXN0X3NpZ24gKiBjb3VudDsKKwkJcGN0eC5udW0gPSBzaG91bGRfYmU7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfRVhUQVRUUl9SRUZDT1VOVCwgJnBjdHgpKSB7CisJCQloZWFkZXItPmhfcmVmY291bnQgPSBzaG91bGRfYmU7CisJCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfd3JpdGVfZXh0X2F0dHIoZnMsIGJsaywKKwkJCQkJCQkgICAgIGJsb2NrX2J1Zik7CisJCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VYVEFUVFJfV1JJVEUsICZwY3R4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIEhhbmRsZSBwcm9jZXNzaW5nIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2tzCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZXh0X2F0dHIoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4LAorCQkJICAgY2hhciAqYmxvY2tfYnVmKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlleHQyX2lub190ICAgICAgaW5vID0gcGN0eC0+aW5vOworCXN0cnVjdCBleHQyX2lub2RlICppbm9kZSA9IHBjdHgtPmlub2RlOworCWJsa190ICAgICAgICAgICBibGs7CisJY2hhciAqICAgICAgICAgIGVuZDsKKwlzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSAqZW50cnk7CisJaW50ICAgICAgICAgICAgIGNvdW50OworCXJlZ2lvbl90ICAgICAgICByZWdpb247CisKKwlibGsgPSBpbm9kZS0+aV9maWxlX2FjbDsKKwlpZiAoYmxrID09IDApCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgRXh0ZW5kZWQgYXR0cmlidXRlIGZsYWcgaXNuJ3Qgc2V0LCB0aGVuIGEgbm9uLXplcm8KKwkgKiBmaWxlIGFjbCBtZWFucyB0aGF0IHRoZSBpbm9kZSBpcyBjb3JydXB0ZWQuCisJICoKKwkgKiBPciBpZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrIGlzIGFuIGludmFsaWQgYmxvY2ssCisJICogdGhlbiB0aGUgaW5vZGUgaXMgYWxzbyBjb3JydXB0ZWQuCisJICovCisJaWYgKCEoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUikgfHwKKwkgICAgKGJsayA8IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSB8fAorCSAgICAoYmxrID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpKSB7CisJCW1hcmtfaW5vZGVfYmFkKGN0eCwgaW5vKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgZWEgYml0bWFwIGhhc24ndCBiZWVuIGFsbG9jYXRlZCwgY3JlYXRlIGl0ICovCisJaWYgKCFjdHgtPmJsb2NrX2VhX21hcCkgeworCQlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX2FsbG9jYXRlX2Jsb2NrX2JpdG1hcChmcywKKwkJCQkJCSAgICAgIF8oImV4dCBhdHRyIGJsb2NrIG1hcCIpLAorCQkJCQkJICAgICAgJmN0eC0+YmxvY2tfZWFfbWFwKTsKKwkJaWYgKHBjdHgtPmVycmNvZGUpIHsKKwkJCXBjdHgtPm51bSA9IDI7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfQkJJVE1BUF9FUlJPUiwgcGN0eCk7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgdGhlIEVBIHJlZmNvdW50IHN0cnVjdHVyZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIWN0eC0+cmVmY291bnQpIHsKKwkJcGN0eC0+ZXJyY29kZSA9IGVhX3JlZmNvdW50X2NyZWF0ZSgwLCAmY3R4LT5yZWZjb3VudCk7CisJCWlmIChwY3R4LT5lcnJjb2RlKSB7CisJCQlwY3R4LT5udW0gPSAxOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX1JFRkNPVU5ULCBwY3R4KTsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIEhhdmUgd2Ugc2VlbiB0aGlzIEVBIGJsb2NrIGJlZm9yZT8gKi8KKwlpZiAoZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19lYV9tYXAsIGJsaykpIHsKKwkJaWYgKGVhX3JlZmNvdW50X2RlY3JlbWVudChjdHgtPnJlZmNvdW50LCBibGssIDApID09IDApCisJCQlyZXR1cm4gMTsKKwkJLyogT29vcHMsIHRoaXMgRUEgd2FzIHJlZmVyZW5jZWQgbW9yZSB0aGFuIGl0IHN0YXRlZCAqLworCQlpZiAoIWN0eC0+cmVmY291bnRfZXh0cmEpIHsKKwkJCXBjdHgtPmVycmNvZGUgPSBlYV9yZWZjb3VudF9jcmVhdGUoMCwKKwkJCQkJICAgJmN0eC0+cmVmY291bnRfZXh0cmEpOworCQkJaWYgKHBjdHgtPmVycmNvZGUpIHsKKwkJCQlwY3R4LT5udW0gPSAyOworCQkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BTExPQ0FURV9SRUZDT1VOVCwgcGN0eCk7CisJCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQllYV9yZWZjb3VudF9pbmNyZW1lbnQoY3R4LT5yZWZjb3VudF9leHRyYSwgYmxrLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBPSywgd2UgaGF2ZW4ndCBzZWVuIHRoaXMgRUEgYmxvY2sgeWV0LiAgU28gd2UgbmVlZCB0bworCSAqIHZhbGlkYXRlIGl0CisJICovCisJcGN0eC0+YmxrID0gYmxrOworCXBjdHgtPmVycmNvZGUgPSBleHQyZnNfcmVhZF9leHRfYXR0cihmcywgYmxrLCBibG9ja19idWYpOworCWlmIChwY3R4LT5lcnJjb2RlICYmIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9SRUFEX0VBX0JMT0NLLCBwY3R4KSkKKwkJZ290byBjbGVhcl9leHRhdHRyOworCWhlYWRlciA9IChzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9oZWFkZXIgKikgYmxvY2tfYnVmOworCXBjdHgtPmJsayA9IGlub2RlLT5pX2ZpbGVfYWNsOworCWlmICgoKGN0eC0+ZXh0X2F0dHJfdmVyID09IDEpICYmCisJICAgICAoaGVhZGVyLT5oX21hZ2ljICE9IEVYVDJfRVhUX0FUVFJfTUFHSUNfdjEpKSB8fAorCSAgICAoKGN0eC0+ZXh0X2F0dHJfdmVyID09IDIpICYmCisJICAgICAoaGVhZGVyLT5oX21hZ2ljICE9IEVYVDJfRVhUX0FUVFJfTUFHSUMpKSkgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0JBRF9FQV9CTE9DSywgcGN0eCkpCisJCQlnb3RvIGNsZWFyX2V4dGF0dHI7CisJfQorCisJaWYgKGhlYWRlci0+aF9ibG9ja3MgIT0gMSkgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VBX01VTFRJX0JMT0NLLCBwY3R4KSkKKwkJCWdvdG8gY2xlYXJfZXh0YXR0cjsKKwl9CisKKwlyZWdpb24gPSByZWdpb25fY3JlYXRlKDAsIGZzLT5ibG9ja3NpemUpOworCWlmICghcmVnaW9uKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FQV9BTExPQ19SRUdJT04sIHBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJlZ2lvbl9hbGxvY2F0ZShyZWdpb24sIDAsIHNpemVvZihzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9oZWFkZXIpKSkgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VBX0FMTE9DX0NPTExJU0lPTiwgcGN0eCkpCisJCQlnb3RvIGNsZWFyX2V4dGF0dHI7CisJfQorCisJZW50cnkgPSAoc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkgKikoaGVhZGVyKzEpOworCWVuZCA9IGJsb2NrX2J1ZiArIGZzLT5ibG9ja3NpemU7CisJd2hpbGUgKChjaGFyICopZW50cnkgPCBlbmQgJiYgKihfX3UzMiAqKWVudHJ5KSB7CisJCWlmIChyZWdpb25fYWxsb2NhdGUocmVnaW9uLCAoY2hhciAqKWVudHJ5IC0gKGNoYXIgKiloZWFkZXIsCisJCQkJICAgRVhUMl9FWFRfQVRUUl9MRU4oZW50cnktPmVfbmFtZV9sZW4pKSkgeworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FQV9BTExPQ19DT0xMSVNJT04sIHBjdHgpKQorCQkJCWdvdG8gY2xlYXJfZXh0YXR0cjsKKwkJfQorCQlpZiAoKGN0eC0+ZXh0X2F0dHJfdmVyID09IDEgJiYKKwkJICAgICAoZW50cnktPmVfbmFtZV9sZW4gPT0gMCB8fCBlbnRyeS0+ZV9uYW1lX2luZGV4ICE9IDApKSB8fAorCQkgICAgKGN0eC0+ZXh0X2F0dHJfdmVyID09IDIgJiYKKwkJICAgICBlbnRyeS0+ZV9uYW1lX2luZGV4ID09IDApKSB7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VBX0JBRF9OQU1FLCBwY3R4KSkKKwkJCQlnb3RvIGNsZWFyX2V4dGF0dHI7CisJCX0KKwkJaWYgKGVudHJ5LT5lX3ZhbHVlX2Jsb2NrICE9IDApIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfRUFfQkFEX1ZBTFVFLCBwY3R4KSkKKwkJCQlnb3RvIGNsZWFyX2V4dGF0dHI7CisJCX0KKwkJaWYgKGVudHJ5LT5lX3ZhbHVlX3NpemUgJiYKKwkJICAgIHJlZ2lvbl9hbGxvY2F0ZShyZWdpb24sIGVudHJ5LT5lX3ZhbHVlX29mZnMsCisJCQkJICAgIEVYVDJfRVhUX0FUVFJfU0laRShlbnRyeS0+ZV92YWx1ZV9zaXplKSkpIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfRUFfQUxMT0NfQ09MTElTSU9OLCBwY3R4KSkKKwkJCQlnb3RvIGNsZWFyX2V4dGF0dHI7CisJCX0KKwkJZW50cnkgPSBFWFQyX0VYVF9BVFRSX05FWFQoZW50cnkpOworCX0KKwlpZiAocmVnaW9uX2FsbG9jYXRlKHJlZ2lvbiwgKGNoYXIgKillbnRyeSAtIChjaGFyICopaGVhZGVyLCA0KSkgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VBX0FMTE9DX0NPTExJU0lPTiwgcGN0eCkpCisJCQlnb3RvIGNsZWFyX2V4dGF0dHI7CisJfQorCXJlZ2lvbl9mcmVlKHJlZ2lvbik7CisKKwljb3VudCA9IGhlYWRlci0+aF9yZWZjb3VudCAtIDE7CisJaWYgKGNvdW50KQorCQllYV9yZWZjb3VudF9zdG9yZShjdHgtPnJlZmNvdW50LCBibGssIGNvdW50KTsKKwltYXJrX2Jsb2NrX3VzZWQoY3R4LCBibGspOworCWV4dDJmc19mYXN0X21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZWFfbWFwLCBibGspOworCisJcmV0dXJuIDE7CisKK2NsZWFyX2V4dGF0dHI6CisJaW5vZGUtPmlfZmlsZV9hY2wgPSAwOworCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgaW5vZGUsICJjaGVja19leHRfYXR0ciIpOworCXJldHVybiAwOworfQorCisvKiBSZXR1cm5zIDEgaWYgYmFkIGh0cmVlLCAwIGlmIE9LICovCitzdGF0aWMgaW50IGhhbmRsZV9odHJlZShlMmZzY2tfdCBjdHgsIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgsCisJCQlleHQyX2lub190IGlubyBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLAorCQkJY2hhciAqYmxvY2tfYnVmKQoreworCXN0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyAgICAgICAgKnJvb3Q7CisJZXh0Ml9maWxzeXMgICAgICAgICAgICAgICAgICAgICBmcyA9IGN0eC0+ZnM7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgICAgICAgICByZXR2YWw7CisJYmxrX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBibGs7CisKKwlpZiAoKCFMSU5VWF9TX0lTRElSKGlub2RlLT5pX21vZGUpICYmCisJICAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzFfSFRSRUVfTk9ESVIsIHBjdHgpKSB8fAorCSAgICAoIShmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCkgJiYKKwkgICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9IVFJFRV9TRVQsIHBjdHgpKSkKKwkJcmV0dXJuIDE7CisKKwlibGsgPSBpbm9kZS0+aV9ibG9ja1swXTsKKwlpZiAoKChibGsgPT0gMCkgfHwKKwkgICAgIChibGsgPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkgICAgIChibGsgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkpICYmCisJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9IVFJFRV9CQURST09ULCBwY3R4KSkKKwkJcmV0dXJuIDE7CisKKwlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxrLCAxLCBibG9ja19idWYpOworCWlmIChyZXR2YWwgJiYgZml4X3Byb2JsZW0oY3R4LCBQUl8xX0hUUkVFX0JBRFJPT1QsIHBjdHgpKQorCQlyZXR1cm4gMTsKKworCS8qIFhYWCBzaG91bGQgY2hlY2sgdGhhdCBiZWdpbm5pbmcgbWF0Y2hlcyBhIGRpcmVjdG9yeSAqLworCXJvb3QgPSAoc3RydWN0IGV4dDJfZHhfcm9vdF9pbmZvICopIChibG9ja19idWYgKyAyNCk7CisKKwlpZiAoKHJvb3QtPnJlc2VydmVkX3plcm8gfHwgcm9vdC0+aW5mb19sZW5ndGggPCA4KSAmJgorCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzFfSFRSRUVfQkFEUk9PVCwgcGN0eCkpCisJCXJldHVybiAxOworCisJcGN0eC0+bnVtID0gcm9vdC0+aGFzaF92ZXJzaW9uOworCWlmICgocm9vdC0+aGFzaF92ZXJzaW9uICE9IEVYVDJfSEFTSF9MRUdBQ1kpICYmCisJICAgIChyb290LT5oYXNoX3ZlcnNpb24gIT0gRVhUMl9IQVNIX0hBTEZfTUQ0KSAmJgorCSAgICAocm9vdC0+aGFzaF92ZXJzaW9uICE9IEVYVDJfSEFTSF9URUEpICYmCisJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9IVFJFRV9IQVNIViwgcGN0eCkpCisJCXJldHVybiAxOworCisJaWYgKChyb290LT51bnVzZWRfZmxhZ3MgJiBFWFQyX0hBU0hfRkxBR19JTkNPTVBBVCkgJiYKKwkgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8xX0hUUkVFX0lOQ09NUEFULCBwY3R4KSkKKwkJcmV0dXJuIDE7CisKKwlwY3R4LT5udW0gPSByb290LT5pbmRpcmVjdF9sZXZlbHM7CisJaWYgKChyb290LT5pbmRpcmVjdF9sZXZlbHMgPiAxKSAmJgorCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzFfSFRSRUVfREVQVEgsIHBjdHgpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCBvbiBlYWNoIGlub2RlIHRvIGFjY291bnQgZm9yIGFsbCBvZiB0aGUKKyAqIGJsb2NrcyB1c2VkIGJ5IHRoYXQgaW5vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2Jsb2NrcyhlMmZzY2tfdCBjdHgsIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgsCisJCQkgY2hhciAqYmxvY2tfYnVmKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3RfMSBwYjsKKwlleHQyX2lub190ICAgICAgaW5vID0gcGN0eC0+aW5vOworCXN0cnVjdCBleHQyX2lub2RlICppbm9kZSA9IHBjdHgtPmlub2RlOworCWludCAgICAgICAgICAgICBiYWRfc2l6ZSA9IDA7CisJaW50ICAgICAgICAgICAgIGRpcnR5X2lub2RlID0gMDsKKwlfX3U2NCAgICAgICAgICAgc2l6ZTsKKworCXBiLmlubyA9IGlubzsKKwlwYi5udW1fYmxvY2tzID0gMDsKKwlwYi5sYXN0X2Jsb2NrID0gLTE7CisJcGIubnVtX2lsbGVnYWxfYmxvY2tzID0gMDsKKwlwYi5zdXBwcmVzcyA9IDA7IHBiLmNsZWFyID0gMDsKKwlwYi5mcmFnbWVudGVkID0gMDsKKwlwYi5jb21wcmVzc2VkID0gMDsKKwlwYi5wcmV2aW91c19ibG9jayA9IDA7CisJcGIuaXNfZGlyID0gTElOVVhfU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKwlwYi5pc19yZWcgPSBMSU5VWF9TX0lTUkVHKGlub2RlLT5pX21vZGUpOworCXBiLm1heF9ibG9ja3MgPSAxIDw8ICgzMSAtIGZzLT5zdXBlci0+c19sb2dfYmxvY2tfc2l6ZSk7CisJcGIuaW5vZGUgPSBpbm9kZTsKKwlwYi5wY3R4ID0gcGN0eDsKKwlwYi5jdHggPSBjdHg7CisJcGN0eC0+aW5vID0gaW5vOworCXBjdHgtPmVycmNvZGUgPSAwOworCisJaWYgKGlub2RlLT5pX2ZsYWdzICYgRVhUMl9DT01QUkJMS19GTCkgeworCQlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCQkgICAgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTSU9OKQorCQkJcGIuY29tcHJlc3NlZCA9IDE7CisJCWVsc2UgeworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9DT01QUl9TRVQsIHBjdHgpKSB7CisJCQkJaW5vZGUtPmlfZmxhZ3MgJj0gfkVYVDJfQ09NUFJCTEtfRkw7CisJCQkJZGlydHlfaW5vZGUrKzsKKwkJCX0KKwkJfQorCX0KKworCWlmIChpbm9kZS0+aV9maWxlX2FjbCAmJiBjaGVja19leHRfYXR0cihjdHgsIHBjdHgsIGJsb2NrX2J1ZikpCisJCXBiLm51bV9ibG9ja3MrKzsKKworCWlmIChleHQyZnNfaW5vZGVfaGFzX3ZhbGlkX2Jsb2Nrcyhpbm9kZSkpCisJCXBjdHgtPmVycmNvZGUgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywKKwkJCQkgICAgICAgcGIuaXNfZGlyID8gQkxPQ0tfRkxBR19IT0xFIDogMCwKKwkJCQkgICAgICAgYmxvY2tfYnVmLCBwcm9jZXNzX2Jsb2NrLCAmcGIpOworCWVuZF9wcm9ibGVtX2xhdGNoKGN0eCwgUFJfTEFUQ0hfQkxPQ0spOworCWVuZF9wcm9ibGVtX2xhdGNoKGN0eCwgUFJfTEFUQ0hfVE9PQklHKTsKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQlnb3RvIG91dDsKKwlpZiAocGN0eC0+ZXJyY29kZSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0JMT0NLX0lURVJBVEUsIHBjdHgpOworCisJaWYgKHBiLmZyYWdtZW50ZWQgJiYgcGIubnVtX2Jsb2NrcyA8IGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKQorCQljdHgtPmZzX2ZyYWdtZW50ZWQrKzsKKworCWlmIChwYi5jbGVhcikgeworCQlpbm9kZS0+aV9saW5rc19jb3VudCA9IDA7CisJCWV4dDJmc19pY291bnRfc3RvcmUoY3R4LT5pbm9kZV9saW5rX2luZm8sIGlubywgMCk7CisJCWlub2RlLT5pX2R0aW1lID0gdGltZShOVUxMKTsKKwkJZGlydHlfaW5vZGUrKzsKKwkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwLCBpbm8pOworCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3JlZ19tYXAsIGlubyk7CisJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsIGlubyk7CisJCS8qCisJCSAqIFRoZSBpbm9kZSB3YXMgcHJvYmFibHkgcGFydGlhbGx5IGFjY291bnRlZCBmb3IKKwkJICogYmVmb3JlIHByb2Nlc3Npbmcgd2FzIGFib3J0ZWQsIHNvIHdlIG5lZWQgdG8KKwkJICogcmVzdGFydCB0aGUgcGFzcyAxIHNjYW4uCisJCSAqLworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX1JFU1RBUlQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpbm9kZS0+aV9mbGFncyAmIEVYVDJfSU5ERVhfRkwpIHsKKwkJaWYgKGhhbmRsZV9odHJlZShjdHgsIHBjdHgsIGlubywgaW5vZGUsIGJsb2NrX2J1ZikpIHsKKwkJCWlub2RlLT5pX2ZsYWdzICY9IH5FWFQyX0lOREVYX0ZMOworCQkJZGlydHlfaW5vZGUrKzsKKwkJfSBlbHNlIHsKKyNpZmRlZiBFTkFCTEVfSFRSRUUKKwkJCWUyZnNja19hZGRfZHhfZGlyKGN0eCwgaW5vLCBwYi5sYXN0X2Jsb2NrKzEpOworI2VuZGlmCisJCX0KKwl9CisJaWYgKGN0eC0+ZGlyc190b19oYXNoICYmIHBiLmlzX2RpciAmJgorCSAgICAhKGlub2RlLT5pX2ZsYWdzICYgRVhUMl9JTkRFWF9GTCkgJiYKKwkgICAgKChpbm9kZS0+aV9zaXplIC8gZnMtPmJsb2Nrc2l6ZSkgPj0gMykpCisJCWV4dDJmc191MzJfbGlzdF9hZGQoY3R4LT5kaXJzX3RvX2hhc2gsIGlubyk7CisKKwlpZiAoIXBiLm51bV9ibG9ja3MgJiYgcGIuaXNfZGlyKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfWkVST19MRU5HVEhfRElSLCBwY3R4KSkgeworCQkJaW5vZGUtPmlfbGlua3NfY291bnQgPSAwOworCQkJZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2xpbmtfaW5mbywgaW5vLCAwKTsKKwkJCWlub2RlLT5pX2R0aW1lID0gdGltZShOVUxMKTsKKwkJCWRpcnR5X2lub2RlKys7CisJCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsIGlubyk7CisJCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3JlZ19tYXAsIGlubyk7CisJCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOworCQkJY3R4LT5mc19kaXJlY3RvcnlfY291bnQtLTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcGIubnVtX2Jsb2NrcyAqPSAoZnMtPmJsb2Nrc2l6ZSAvIDUxMik7CisKKwlpZiAocGIuaXNfZGlyKSB7CisJCWludCBuYmxvY2sgPSBpbm9kZS0+aV9zaXplID4+IEVYVDJfQkxPQ0tfU0laRV9CSVRTKGZzLT5zdXBlcik7CisJCWlmIChuYmxvY2sgPiAocGIubGFzdF9ibG9jayArIDEpKQorCQkJYmFkX3NpemUgPSAxOworCQllbHNlIGlmIChuYmxvY2sgPCAocGIubGFzdF9ibG9jayArIDEpKSB7CisJCQlpZiAoKChwYi5sYXN0X2Jsb2NrICsgMSkgLSBuYmxvY2spID4KKwkJCSAgICBmcy0+c3VwZXItPnNfcHJlYWxsb2NfZGlyX2Jsb2NrcykKKwkJCQliYWRfc2l6ZSA9IDI7CisJCX0KKwl9IGVsc2UgeworCQlzaXplID0gRVhUMl9JX1NJWkUoaW5vZGUpOworCQlpZiAoKHBiLmxhc3RfYmxvY2sgPj0gMCkgJiYKKwkJICAgIChzaXplIDwgKF9fdTY0KSBwYi5sYXN0X2Jsb2NrICogZnMtPmJsb2Nrc2l6ZSkpCisJCQliYWRfc2l6ZSA9IDM7CisJCWVsc2UgaWYgKHNpemUgPiBleHQyX21heF9zaXplc1tmcy0+c3VwZXItPnNfbG9nX2Jsb2NrX3NpemVdKQorCQkJYmFkX3NpemUgPSA0OworCX0KKwkvKiBpX3NpemUgZm9yIHN5bWxpbmtzIGlzIGNoZWNrZWQgZWxzZXdoZXJlICovCisJaWYgKGJhZF9zaXplICYmICFMSU5VWF9TX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCXBjdHgtPm51bSA9IChwYi5sYXN0X2Jsb2NrKzEpICogZnMtPmJsb2Nrc2l6ZTsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9CQURfSV9TSVpFLCBwY3R4KSkgeworCQkJaW5vZGUtPmlfc2l6ZSA9IHBjdHgtPm51bTsKKwkJCWlmICghTElOVVhfU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCQlpbm9kZS0+aV9zaXplX2hpZ2ggPSBwY3R4LT5udW0gPj4gMzI7CisJCQlkaXJ0eV9pbm9kZSsrOworCQl9CisJCXBjdHgtPm51bSA9IDA7CisJfQorCWlmIChMSU5VWF9TX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJICAgIChpbm9kZS0+aV9zaXplX2hpZ2ggfHwgaW5vZGUtPmlfc2l6ZSAmIDB4ODAwMDAwMDBVTCkpCisJCWN0eC0+bGFyZ2VfZmlsZXMrKzsKKwlpZiAocGIubnVtX2Jsb2NrcyAhPSBpbm9kZS0+aV9ibG9ja3MpIHsKKwkJcGN0eC0+bnVtID0gcGIubnVtX2Jsb2NrczsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9CQURfSV9CTE9DS1MsIHBjdHgpKSB7CisJCQlpbm9kZS0+aV9ibG9ja3MgPSBwYi5udW1fYmxvY2tzOworCQkJZGlydHlfaW5vZGUrKzsKKwkJfQorCQlwY3R4LT5udW0gPSAwOworCX0KK291dDoKKwlpZiAoZGlydHlfaW5vZGUpCisJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgaW5vZGUsICJjaGVja19ibG9ja3MiKTsKK30KKworCisvKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgY2hlY2tfYmxvY2tzKCkuCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19ibG9jayhleHQyX2ZpbHN5cyBmcywKKwkJICBibGtfdCAqYmxvY2tfbnIsCisJCSAgZTJfYmxrY250X3QgYmxvY2tjbnQsCisJCSAgYmxrX3QgcmVmX2Jsb2NrIEZTQ0tfQVRUUigodW51c2VkKSksCisJCSAgaW50IHJlZl9vZmZzZXQgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0XzEgKnA7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eDsKKwlibGtfdCAgIGJsayA9ICpibG9ja19ucjsKKwlpbnQgICAgIHJldF9jb2RlID0gMDsKKwlpbnQgICAgIHByb2JsZW0gPSAwOworCWUyZnNja190ICAgICAgICBjdHg7CisKKwlwID0gKHN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xICopIHByaXZfZGF0YTsKKwlwY3R4ID0gcC0+cGN0eDsKKwljdHggPSBwLT5jdHg7CisKKwlpZiAocC0+Y29tcHJlc3NlZCAmJiAoYmxrID09IEVYVDJGU19DT01QUkVTU0VEX0JMS0FERFIpKSB7CisJCS8qIHRvZG86IENoZWNrIHRoYXQgdGhlIGNvbXByYmxrX2ZsIGlzIGhpZ2gsIHRoYXQgdGhlCisJCSAgIGJsa2FkZHIgcGF0dGVybiBsb29rcyByaWdodCAoYWxsIG5vbi1ob2xlcyB1cCB0bworCQkgICBmaXJzdCBFWFQyRlNfQ09NUFJFU1NFRF9CTEtBRERSLCB0aGVuIGFsbAorCQkgICBFWFQyRlNfQ09NUFJFU1NFRF9CTEtBRERSIHVwIHRvIGVuZCBvZiBjbHVzdGVyKSwKKwkJICAgdGhhdCB0aGUgZmVhdHVyZV9pbmNvbXBhdCBiaXQgaXMgaGlnaCwgYW5kIHRoYXQgdGhlCisJCSAgIGlub2RlIGlzIGEgcmVndWxhciBmaWxlLiAgSWYgd2UncmUgZG9pbmcgYSAiZnVsbAorCQkgICBjaGVjayIgKGEgY29uY2VwdCBpbnRyb2R1Y2VkIHRvIGUyZnNjayBieSBlMmNvbXByLAorCQkgICBtZWFuaW5nIHRoYXQgd2UgbG9vayBhdCBkYXRhIGJsb2NrcyBhcyB3ZWxsIGFzCisJCSAgIG1ldGFkYXRhKSB0aGVuIGNhbGwgc29tZSBsaWJyYXJ5IHJvdXRpbmUgdGhhdAorCQkgICBjaGVja3MgdGhlIGNvbXByZXNzZWQgZGF0YS4gIEknbGwgaGF2ZSB0byB0aGluaworCQkgICBhYm91dCB0aGlzLCBiZWNhdXNlIG9uZSBwYXJ0aWN1bGFybHkgaW1wb3J0YW50CisJCSAgIHByb2JsZW0gdG8gYmUgYWJsZSB0byBmaXggaXMgdG8gcmVjYWxjdWxhdGUgdGhlCisJCSAgIGNsdXN0ZXIgc2l6ZSBpZiBuZWNlc3NhcnkuICBJIHRoaW5rIHRoYXQgcGVyaGFwcworCQkgICB3ZSdkIGJldHRlciBkbyBtb3N0L2FsbCBlMmNvbXByLXNwZWNpZmljIGNoZWNrcworCQkgICBzZXBhcmF0ZWx5LCBhZnRlciB0aGUgbm9uLWUyY29tcHIgY2hlY2tzLiAgSWYgbm90CisJCSAgIGRvaW5nIGEgZnVsbCBjaGVjaywgaXQgbWF5IGJlIHVzZWZ1bCB0byB0ZXN0IHRoYXQKKwkJICAgdGhlIHBlcnNvbmFsaXR5IGlzIGxpbnV4OyBlLmcuIGlmIGl0IGlzbid0IHRoZW4KKwkJICAgcGVyaGFwcyB0aGlzIHJlYWxseSBpcyBqdXN0IGFuIGlsbGVnYWwgYmxvY2suICovCisJCXJldHVybiAwOworCX0KKworCWlmIChibGsgPT0gMCkgeworCQlpZiAocC0+aXNfZGlyID09IDApIHsKKwkJCS8qCisJCQkgKiBTaG91bGQgbmV2ZXIgaGFwcGVuLCBzaW5jZSBvbmx5IGRpcmVjdG9yaWVzCisJCQkgKiBnZXQgY2FsbGVkIHdpdGggQkxPQ0tfRkxBR19IT0xFCisJCQkgKi8KKyNpZmRlZiBERUJVR19FMkZTQ0sKKwkJCXByaW50ZigicHJvY2Vzc19ibG9jaygpIGNhbGxlZCB3aXRoIGJsayA9PSAwLCAiCisJCQkgICAgICAgImJsb2NrY250PSVkLCBpbm9kZSAlbHU/Pz9cbiIsCisJCQkgICAgICAgYmxvY2tjbnQsIHAtPmlubyk7CisjZW5kaWYKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChibG9ja2NudCA8IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKGJsb2NrY250ICogZnMtPmJsb2Nrc2l6ZSA8IHAtPmlub2RlLT5pX3NpemUpIHsKKwkJCWdvdG8gbWFya19kaXI7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTaW1wbGlzdGljIGZyYWdtZW50YXRpb24gY2hlY2suICBXZSBtZXJlbHkgcmVxdWlyZSB0aGF0IHRoZQorCSAqIGZpbGUgYmUgY29udGlndW91cy4gIChXaGljaCBjYW4gbmV2ZXIgYmUgdHJ1ZSBmb3IgcmVhbGx5CisJICogYmlnIGZpbGVzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBhIGJsb2NrIGdyb3VwLikKKwkgKi8KKwlpZiAoIUhPTEVfQkxLQUREUihwLT5wcmV2aW91c19ibG9jaykpIHsKKwkJaWYgKHAtPnByZXZpb3VzX2Jsb2NrKzEgIT0gYmxrKQorCQkJcC0+ZnJhZ21lbnRlZCA9IDE7CisJfQorCXAtPnByZXZpb3VzX2Jsb2NrID0gYmxrOworCisJaWYgKHAtPmlzX2RpciAmJiBibG9ja2NudCA+ICgxIDw8ICgyMSAtIGZzLT5zdXBlci0+c19sb2dfYmxvY2tfc2l6ZSkpKQorCQlwcm9ibGVtID0gUFJfMV9UT09CSUdfRElSOworCWlmIChwLT5pc19yZWcgJiYgcC0+bnVtX2Jsb2NrcysxID49IHAtPm1heF9ibG9ja3MpCisJCXByb2JsZW0gPSBQUl8xX1RPT0JJR19SRUc7CisJaWYgKCFwLT5pc19kaXIgJiYgIXAtPmlzX3JlZyAmJiBibG9ja2NudCA+IDApCisJCXByb2JsZW0gPSBQUl8xX1RPT0JJR19TWU1MSU5LOworCisJaWYgKGJsayA8IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrIHx8CisJICAgIGJsayA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KQorCQlwcm9ibGVtID0gUFJfMV9JTExFR0FMX0JMT0NLX05VTTsKKworCWlmIChwcm9ibGVtKSB7CisJCXAtPm51bV9pbGxlZ2FsX2Jsb2NrcysrOworCQlpZiAoIXAtPnN1cHByZXNzICYmIChwLT5udW1faWxsZWdhbF9ibG9ja3MgJSAxMikgPT0gMCkgeworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9UT09fTUFOWV9CQURfQkxPQ0tTLCBwY3R4KSkgeworCQkJCXAtPmNsZWFyID0gMTsKKwkJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCQl9CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX1NVUFBSRVNTX01FU1NBR0VTLCBwY3R4KSkgeworCQkJCXAtPnN1cHByZXNzID0gMTsKKwkJCQlzZXRfbGF0Y2hfZmxhZ3MoUFJfTEFUQ0hfQkxPQ0ssCisJCQkJCQlQUkxfU1VQUFJFU1MsIDApOworCQkJfQorCQl9CisJCXBjdHgtPmJsayA9IGJsazsKKwkJcGN0eC0+YmxrY291bnQgPSBibG9ja2NudDsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgcHJvYmxlbSwgcGN0eCkpIHsKKwkJCWJsayA9ICpibG9ja19uciA9IDA7CisJCQlyZXRfY29kZSA9IEJMT0NLX0NIQU5HRUQ7CisJCQlnb3RvIG1hcmtfZGlyOworCQl9IGVsc2UKKwkJCXJldHVybiAwOworCX0KKworCWlmIChwLT5pbm8gPT0gRVhUMl9SRVNJWkVfSU5PKSB7CisJCS8qCisJCSAqIFRoZSByZXNpemUgaW5vZGUgaGFzIGFscmVhZHkgYmUgc2FuaXR5IGNoZWNrZWQKKwkJICogZHVyaW5nIHBhc3MgIzAgKHRoZSBzdXBlcmJsb2NrIGNoZWNrcykuICBBbGwgd2UKKwkJICogaGF2ZSB0byBkbyBpcyBtYXJrIHRoZSBkb3VibGUgaW5kaXJlY3QgYmxvY2sgYXMKKwkJICogYmVpbmcgaW4gdXNlOyBhbGwgb2YgdGhlIG90aGVyIGJsb2NrcyBhcmUgaGFuZGxlZAorCQkgKiBieSBtYXJrX3RhYmxlX2Jsb2NrcygpKS4KKwkJICovCisJCWlmIChibG9ja2NudCA9PSBCTE9DS19DT1VOVF9ESU5EKQorCQkJbWFya19ibG9ja191c2VkKGN0eCwgYmxrKTsKKwl9IGVsc2UKKwkJbWFya19ibG9ja191c2VkKGN0eCwgYmxrKTsKKwlwLT5udW1fYmxvY2tzKys7CisJaWYgKGJsb2NrY250ID49IDApCisJCXAtPmxhc3RfYmxvY2sgPSBibG9ja2NudDsKK21hcmtfZGlyOgorCWlmIChwLT5pc19kaXIgJiYgKGJsb2NrY250ID49IDApKSB7CisJCXBjdHgtPmVycmNvZGUgPSBleHQyZnNfYWRkX2Rpcl9ibG9jayhmcy0+ZGJsaXN0LCBwLT5pbm8sCisJCQkJCQkgICAgYmxrLCBibG9ja2NudCk7CisJCWlmIChwY3R4LT5lcnJjb2RlKSB7CisJCQlwY3R4LT5ibGsgPSBibGs7CisJCQlwY3R4LT5udW0gPSBibG9ja2NudDsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BRERfREJMT0NLLCBwY3R4KTsKKwkJCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0X2NvZGU7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19iYWRfYmxvY2soZXh0Ml9maWxzeXMgZnMgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgYmxrX3QgKmJsb2NrX25yLAorCQkgICAgICBlMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJICAgICAgYmxrX3QgcmVmX2Jsb2NrIEZTQ0tfQVRUUigodW51c2VkKSksCisJCSAgICAgIGludCByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCSAgICAgIHZvaWQgKnByaXZfZGF0YSBFWFQyRlNfQVRUUigodW51c2VkKSkpCit7CisJLyoKKwkgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBibG9ja3MgZm9yIHRoZSBiYWQgYmxvY2tzCisJICogaW5vZGUsIHdoaWNoIGlzIG5ldmVyIGNvbXByZXNzZWQuICBTbyB3ZSBkb24ndCB1c2UgSE9MRV9CTEtBRERSKCkuCisJICovCisKKwlwcmludGYoIlVucmVjb3ZlcmFibGUgRXJyb3I6IEZvdW5kICUiUFJJaTY0IiBiYWQgYmxvY2tzIHN0YXJ0aW5nIGF0IGJsb2NrIG51bWJlcjogJXVcbiIsIGJsb2NrY250LCAqYmxvY2tfbnIpOworCXJldHVybiBCTE9DS19FUlJPUjsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHBhc3MgMSBpZiBiYWQgYmxvY2tzIGFyZQorICogZGV0ZWN0ZWQgaW4gdGhlIHN1cGVyYmxvY2ssIGdyb3VwIGRlc2NyaXB0b3JzLCBpbm9kZV9iaXRtYXBzLCBvcgorICogYmxvY2sgYml0bWFwcy4gIEF0IHRoaXMgcG9pbnQsIGFsbCBvZiB0aGUgYmxvY2tzIGhhdmUgYmVlbiBtYXBwZWQKKyAqIG91dCwgc28gd2UgY2FuIHRyeSB0byBhbGxvY2F0ZSBuZXcgYmxvY2socykgdG8gcmVwbGFjZSB0aGUgYmFkCisgKiBibG9ja3MuCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9mc19iYWRfYmxvY2tzKGUyZnNja190IGN0eCkKK3sKKwlwcmludGYoIkJhZCBibG9ja3MgZGV0ZWN0ZWQgb24geW91ciBmaWxlc3lzdGVtXG4iCisJCSJZb3Ugc2hvdWxkIGdldCB5b3VyIGRhdGEgb2ZmIGFzIHRoZSBkZXZpY2Ugd2lsbCBzb29uIGRpZVxuIik7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgbWFya3MgYWxsIGJsb2NrcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgc3VwZXJibG9jaywKKyAqIGdyb3VwIGRlc2NyaXB0b3JzLCBpbm9kZSBiaXRtYXBzLCBhbmQgYmxvY2sgYml0bWFwcy4KKyAqLworc3RhdGljIHZvaWQgbWFya190YWJsZV9ibG9ja3MoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlibGtfdCAgIGJsb2NrLCBiOworCWRncnBfdCAgaTsKKwlpbnQgICAgIGo7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWJsb2NrID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJcGN0eC5ncm91cCA9IGk7CisKKwkJZXh0MmZzX3Jlc2VydmVfc3VwZXJfYW5kX2JnZChmcywgaSwgY3R4LT5ibG9ja19mb3VuZF9tYXApOworCisJCS8qCisJCSAqIE1hcmsgdGhlIGJsb2NrcyB1c2VkIGZvciB0aGUgaW5vZGUgdGFibGUKKwkJICovCisJCWlmIChmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV90YWJsZSkgeworCQkJZm9yIChqID0gMCwgYiA9IGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX3RhYmxlOworCQkJICAgICBqIDwgZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCQkgICAgIGorKywgYisrKSB7CisJCQkJaWYgKGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwKKwkJCQkJCQkgICAgIGIpKSB7CisJCQkJCXBjdHguYmxrID0gYjsKKwkJCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwKKwkJCQkJCVBSXzFfSVRBQkxFX0NPTkZMSUNULCAmcGN0eCkpIHsKKwkJCQkJCWN0eC0+aW52YWxpZF9pbm9kZV90YWJsZV9mbGFnW2ldKys7CisJCQkJCQljdHgtPmludmFsaWRfYml0bWFwcysrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLCBiKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBNYXJrIGJsb2NrIHVzZWQgZm9yIHRoZSBibG9jayBiaXRtYXAKKwkJICovCisJCWlmIChmcy0+Z3JvdXBfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXApIHsKKwkJCWlmIChleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsCisJCQkJICAgICBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXApKSB7CisJCQkJcGN0eC5ibGsgPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXA7CisJCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9CQl9DT05GTElDVCwgJnBjdHgpKSB7CisJCQkJCWN0eC0+aW52YWxpZF9ibG9ja19iaXRtYXBfZmxhZ1tpXSsrOworCQkJCQljdHgtPmludmFsaWRfYml0bWFwcysrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCQlmcy0+Z3JvdXBfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXApOworCQkJfQorCQl9CisJCS8qCisJCSAqIE1hcmsgYmxvY2sgdXNlZCBmb3IgdGhlIGlub2RlIGJpdG1hcAorCQkgKi8KKwkJaWYgKGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX2JpdG1hcCkgeworCQkJaWYgKGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwKKwkJCQkgICAgIGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX2JpdG1hcCkpIHsKKwkJCQlwY3R4LmJsayA9IGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX2JpdG1hcDsKKwkJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0lCX0NPTkZMSUNULCAmcGN0eCkpIHsKKwkJCQkJY3R4LT5pbnZhbGlkX2lub2RlX2JpdG1hcF9mbGFnW2ldKys7CisJCQkJCWN0eC0+aW52YWxpZF9iaXRtYXBzKys7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsCisJCQkJCWZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX2JpdG1hcCk7CisJCQl9CisJCX0KKwkJYmxvY2sgKz0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJfQorfQorCisvKgorICogVGhlcyBzdWJyb3V0aW5lcyBzaG9ydCBjaXJjdWl0cyBleHQyZnNfZ2V0X2Jsb2NrcyBhbmQKKyAqIGV4dDJmc19jaGVja19kaXJlY3Rvcnk7IHdlIHVzZSB0aGVtIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSB0aGUgaW5vZGUKKyAqIHN0cnVjdHVyZSwgc28gdGhlcmUncyBubyBwb2ludCBpbiBsZXR0aW5nIHRoZSBleHQyZnMgbGlicmFyeSByZWFkCisgKiB0aGUgaW5vZGUgYWdhaW4uCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgcGFzczFfZ2V0X2Jsb2NrcyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICBibGtfdCAqYmxvY2tzKQoreworCWUyZnNja190IGN0eCA9IChlMmZzY2tfdCkgZnMtPnByaXZfZGF0YTsKKwlpbnQgICAgIGk7CisKKwlpZiAoKGlubyAhPSBjdHgtPnN0YXNoZWRfaW5vKSB8fCAhY3R4LT5zdGFzaGVkX2lub2RlKQorCQlyZXR1cm4gRVhUMl9FVF9DQUxMQkFDS19OT1RIQU5ETEVEOworCisJZm9yIChpPTA7IGkgPCBFWFQyX05fQkxPQ0tTOyBpKyspCisJCWJsb2Nrc1tpXSA9IGN0eC0+c3Rhc2hlZF9pbm9kZS0+aV9ibG9ja1tpXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBwYXNzMV9yZWFkX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSkKK3sKKwllMmZzY2tfdCBjdHggPSAoZTJmc2NrX3QpIGZzLT5wcml2X2RhdGE7CisKKwlpZiAoKGlubyAhPSBjdHgtPnN0YXNoZWRfaW5vKSB8fCAhY3R4LT5zdGFzaGVkX2lub2RlKQorCQlyZXR1cm4gRVhUMl9FVF9DQUxMQkFDS19OT1RIQU5ETEVEOworCSppbm9kZSA9ICpjdHgtPnN0YXNoZWRfaW5vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgcGFzczFfd3JpdGVfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSkKK3sKKwllMmZzY2tfdCBjdHggPSAoZTJmc2NrX3QpIGZzLT5wcml2X2RhdGE7CisKKwlpZiAoKGlubyA9PSBjdHgtPnN0YXNoZWRfaW5vKSAmJiBjdHgtPnN0YXNoZWRfaW5vZGUpCisJCSpjdHgtPnN0YXNoZWRfaW5vZGUgPSAqaW5vZGU7CisJcmV0dXJuIEVYVDJfRVRfQ0FMTEJBQ0tfTk9USEFORExFRDsKK30KKworc3RhdGljIGVycmNvZGVfdCBwYXNzMV9jaGVja19kaXJlY3RvcnkoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vKQoreworCWUyZnNja190IGN0eCA9IChlMmZzY2tfdCkgZnMtPnByaXZfZGF0YTsKKworCWlmICgoaW5vICE9IGN0eC0+c3Rhc2hlZF9pbm8pIHx8ICFjdHgtPnN0YXNoZWRfaW5vZGUpCisJCXJldHVybiBFWFQyX0VUX0NBTExCQUNLX05PVEhBTkRMRUQ7CisKKwlpZiAoIUxJTlVYX1NfSVNESVIoY3R4LT5zdGFzaGVkX2lub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gRVhUMl9FVF9OT19ESVJFQ1RPUlk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZTJmc2NrX3VzZV9pbm9kZV9zaG9ydGN1dHMoZTJmc2NrX3QgY3R4LCBpbnQgYm9vbCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisKKwlpZiAoYm9vbCkgeworCQlmcy0+Z2V0X2Jsb2NrcyA9IHBhc3MxX2dldF9ibG9ja3M7CisJCWZzLT5jaGVja19kaXJlY3RvcnkgPSBwYXNzMV9jaGVja19kaXJlY3Rvcnk7CisJCWZzLT5yZWFkX2lub2RlID0gcGFzczFfcmVhZF9pbm9kZTsKKwkJZnMtPndyaXRlX2lub2RlID0gcGFzczFfd3JpdGVfaW5vZGU7CisJCWN0eC0+c3Rhc2hlZF9pbm8gPSAwOworCX0gZWxzZSB7CisJCWZzLT5nZXRfYmxvY2tzID0gMDsKKwkJZnMtPmNoZWNrX2RpcmVjdG9yeSA9IDA7CisJCWZzLT5yZWFkX2lub2RlID0gMDsKKwkJZnMtPndyaXRlX2lub2RlID0gMDsKKwl9Cit9CisKKy8qCisgKiBwYXNzMWIuYyAtLS0gUGFzcyAjMWIgb2YgZTJmc2NrCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHBhc3MxQiwgcGFzczFDLCBhbmQgcGFzczFEIG9mIGUyZnNjay4gIFRoZXkgYXJlCisgKiBvbmx5IGludm9rZWQgaWYgcGFzcyAxIGRpc2NvdmVyZWQgYmxvY2tzIHdoaWNoIGFyZSBpbiB1c2UgYnkgbW9yZQorICogdGhhbiBvbmUgaW5vZGUuCisgKgorICogUGFzczFCIHNjYW5zIHRoZSBkYXRhIGJsb2NrcyBvZiBhbGwgdGhlIGlub2RlcyBhZ2FpbiwgZ2VuZXJhdGluZyBhCisgKiBjb21wbGV0ZSBsaXN0IG9mIGR1cGxpY2F0ZSBibG9ja3MgYW5kIHdoaWNoIGlub2RlcyBoYXZlIGNsYWltZWQKKyAqIHRoZW0uCisgKgorICogUGFzczFDIGRvZXMgYSB0cmVlLXRyYXZlcnNhbCBvZiB0aGUgZmlsZXN5c3RlbSwgdG8gZGV0ZXJtaW5lIHRoZQorICogcGFyZW50IGRpcmVjdG9yaWVzIG9mIHRoZXNlIGlub2Rlcy4gIFRoaXMgc3RlcCBpcyBuZWNlc3Nhcnkgc28gdGhhdAorICogZTJmc2NrIGNhbiBwcmludCBvdXQgdGhlIHBhdGhuYW1lcyBvZiBhZmZlY3RlZCBpbm9kZXMuCisgKgorICogUGFzczFEIGlzIGEgcmVjb25jaWxpYXRpb24gcGFzcy4gIEZvciBlYWNoIGlub2RlIHdpdGggZHVwbGljYXRlCisgKiBibG9ja3MsIHRoZSB1c2VyIGlzIHByb21wdGVkIGlmIHMvaGUgd291bGQgbGlrZSB0byBjbG9uZSB0aGUgZmlsZQorICogKHNvIHRoYXQgdGhlIGZpbGUgZ2V0cyBhIGZyZXNoIGNvcHkgb2YgdGhlIGR1cGxpY2F0ZWQgYmxvY2tzKSBvcgorICogc2ltcGx5IHRvIGRlbGV0ZSB0aGUgZmlsZS4KKyAqCisgKi8KKworCisvKiBOZWVkZWQgZm9yIGFyY2hpdGVjdHVyZXMgd2hlcmUgc2l6ZW9mKGludCkgIT0gc2l6ZW9mKHZvaWQgKikgKi8KKyNkZWZpbmUgSU5UX1RPX1ZPSURQVFIodmFsKSAgKCh2b2lkICopKGludHB0cl90KSh2YWwpKQorI2RlZmluZSBWT0lEUFRSX1RPX0lOVChwdHIpICAoKGludCkoaW50cHRyX3QpKHB0cikpCisKKy8qIERlZmluZSBhbiBleHRlbnNpb24gdG8gdGhlIGV4dDIgbGlicmFyeSdzIGJsb2NrIGNvdW50IGluZm9ybWF0aW9uICovCisjZGVmaW5lIEJMT0NLX0NPVU5UX0VYVEFUVFIgICAgICgtNSkKKworc3RydWN0IGJsb2NrX2VsIHsKKwlibGtfdCAgIGJsb2NrOworCXN0cnVjdCBibG9ja19lbCAqbmV4dDsKK307CisKK3N0cnVjdCBpbm9kZV9lbCB7CisJZXh0Ml9pbm9fdCAgICAgIGlub2RlOworCXN0cnVjdCBpbm9kZV9lbCAqbmV4dDsKK307CisKK3N0cnVjdCBkdXBfYmxvY2sgeworCWludCAgICAgICAgICAgICBudW1fYmFkOworCXN0cnVjdCBpbm9kZV9lbCAqaW5vZGVfbGlzdDsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIGlub2RlIHdoaWNoCisgKiBpcyBzaGFyaW5nIGJsb2NrcyB3aXRoIG90aGVyIGlub2Rlcy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgY29sbGVjdGVkCisgKiB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLCBzbyB0aGF0IHRoZSB1c2VyIGtub3dzIHdoYXQgZmlsZXMgaGUgb3Igc2hlCisgKiBpcyBkZWFsaW5nIHdpdGgsIHdoZW4gdHJ5aW5nIHRvIGRlY2lkZSBob3cgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3QKKyAqIG9mIG11bHRpcGx5LWNsYWltZWQgYmxvY2tzLgorICovCitzdHJ1Y3QgZHVwX2lub2RlIHsKKwlleHQyX2lub190ICAgICAgICAgICAgICBkaXI7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbnVtX2R1cGJsb2NrczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKwlzdHJ1Y3QgYmxvY2tfZWwgICAgICAgICAqYmxvY2tfbGlzdDsKK307CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19wYXNzMWJfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190ICAgKmJsb2NrbnIsCisJCQkJZTJfYmxrY250X3QgYmxvY2tjbnQsIGJsa190IHJlZl9ibGssCisJCQkJaW50IHJlZl9vZmZzZXQsIHZvaWQgKnByaXZfZGF0YSk7CitzdGF0aWMgdm9pZCBkZWxldGVfZmlsZShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vLAorCQkJc3RydWN0IGR1cF9pbm9kZSAqZHAsIGNoYXIgKmJsb2NrX2J1Zik7CitzdGF0aWMgaW50IGNsb25lX2ZpbGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywKKwkJICAgICAgc3RydWN0IGR1cF9pbm9kZSAqZHAsIGNoYXIqIGJsb2NrX2J1Zik7CitzdGF0aWMgaW50IGNoZWNrX2lmX2ZzX2Jsb2NrKGUyZnNja190IGN0eCwgYmxrX3QgdGVzdF9ibGspOworCitzdGF0aWMgdm9pZCBwYXNzMWIoZTJmc2NrX3QgY3R4LCBjaGFyICpibG9ja19idWYpOworc3RhdGljIHZvaWQgcGFzczFjKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKTsKK3N0YXRpYyB2b2lkIHBhc3MxZChlMmZzY2tfdCBjdHgsIGNoYXIgKmJsb2NrX2J1Zik7CisKK3N0YXRpYyBpbnQgZHVwX2lub2RlX2NvdW50ID0gMDsKKworc3RhdGljIGRpY3RfdCBibGtfZGljdCwgaW5vX2RpY3Q7CisKK3N0YXRpYyBleHQyZnNfaW5vZGVfYml0bWFwIGlub2RlX2R1cF9tYXA7CisKK3N0YXRpYyBpbnQgZGljdF9pbnRfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJaW50cHRyX3QgICAgICAgIGlhLCBpYjsKKworCWlhID0gKGludHB0cl90KWE7CisJaWIgPSAoaW50cHRyX3QpYjsKKworCXJldHVybiAoaWEtaWIpOworfQorCisvKgorICogQWRkIGEgZHVwbGljYXRlIGJsb2NrIHJlY29yZAorICovCitzdGF0aWMgdm9pZCBhZGRfZHVwZShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vLCBibGtfdCBibGssCisJCSAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKQoreworCWRub2RlX3QgKm47CisJc3RydWN0IGR1cF9ibG9jayAgICAgICAgKmRiOworCXN0cnVjdCBkdXBfaW5vZGUgICAgICAgICpkaTsKKwlzdHJ1Y3QgYmxvY2tfZWwgICAgICAgICAqYmxrX2VsOworCXN0cnVjdCBpbm9kZV9lbCAgICAgICAgICppbm9fZWw7CisKKwluID0gZGljdF9sb29rdXAoJmJsa19kaWN0LCBJTlRfVE9fVk9JRFBUUihibGspKTsKKwlpZiAobikKKwkJZGIgPSAoc3RydWN0IGR1cF9ibG9jayAqKSBkbm9kZV9nZXQobik7CisJZWxzZSB7CisJCWRiID0gKHN0cnVjdCBkdXBfYmxvY2sgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJCQkgc2l6ZW9mKHN0cnVjdCBkdXBfYmxvY2spLCAiZHVwbGljYXRlIGJsb2NrIGhlYWRlciIpOworCQlkYi0+bnVtX2JhZCA9IDA7CisJCWRiLT5pbm9kZV9saXN0ID0gMDsKKwkJZGljdF9hbGxvY19pbnNlcnQoJmJsa19kaWN0LCBJTlRfVE9fVk9JRFBUUihibGspLCBkYik7CisJfQorCWlub19lbCA9IChzdHJ1Y3QgaW5vZGVfZWwgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJCQkgc2l6ZW9mKHN0cnVjdCBpbm9kZV9lbCksICJpbm9kZSBlbGVtZW50Iik7CisJaW5vX2VsLT5pbm9kZSA9IGlubzsKKwlpbm9fZWwtPm5leHQgPSBkYi0+aW5vZGVfbGlzdDsKKwlkYi0+aW5vZGVfbGlzdCA9IGlub19lbDsKKwlkYi0+bnVtX2JhZCsrOworCisJbiA9IGRpY3RfbG9va3VwKCZpbm9fZGljdCwgSU5UX1RPX1ZPSURQVFIoaW5vKSk7CisJaWYgKG4pCisJCWRpID0gKHN0cnVjdCBkdXBfaW5vZGUgKikgZG5vZGVfZ2V0KG4pOworCWVsc2UgeworCQlkaSA9IChzdHJ1Y3QgZHVwX2lub2RlICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCQkJIHNpemVvZihzdHJ1Y3QgZHVwX2lub2RlKSwgImR1cGxpY2F0ZSBpbm9kZSBoZWFkZXIiKTsKKwkJZGktPmRpciA9IChpbm8gPT0gRVhUMl9ST09UX0lOTykgPyBFWFQyX1JPT1RfSU5PIDogMDsKKwkJZGktPm51bV9kdXBibG9ja3MgPSAwOworCQlkaS0+YmxvY2tfbGlzdCA9IDA7CisJCWRpLT5pbm9kZSA9ICppbm9kZTsKKwkJZGljdF9hbGxvY19pbnNlcnQoJmlub19kaWN0LCBJTlRfVE9fVk9JRFBUUihpbm8pLCBkaSk7CisJfQorCWJsa19lbCA9IChzdHJ1Y3QgYmxvY2tfZWwgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJCQkgc2l6ZW9mKHN0cnVjdCBibG9ja19lbCksICJibG9jayBlbGVtZW50Iik7CisJYmxrX2VsLT5ibG9jayA9IGJsazsKKwlibGtfZWwtPm5leHQgPSBkaS0+YmxvY2tfbGlzdDsKKwlkaS0+YmxvY2tfbGlzdCA9IGJsa19lbDsKKwlkaS0+bnVtX2R1cGJsb2NrcysrOworfQorCisvKgorICogRnJlZSBhIGR1cGxpY2F0ZSBpbm9kZSByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgaW5vZGVfZG5vZGVfZnJlZShkbm9kZV90ICpub2RlKQoreworCXN0cnVjdCBkdXBfaW5vZGUgICAgICAgICpkaTsKKwlzdHJ1Y3QgYmxvY2tfZWwgICAgICAgICAqcCwgKm5leHQ7CisKKwlkaSA9IChzdHJ1Y3QgZHVwX2lub2RlICopIGRub2RlX2dldChub2RlKTsKKwlmb3IgKHAgPSBkaS0+YmxvY2tfbGlzdDsgcDsgcCA9IG5leHQpIHsKKwkJbmV4dCA9IHAtPm5leHQ7CisJCWZyZWUocCk7CisJfQorCWZyZWUobm9kZSk7Cit9CisKKy8qCisgKiBGcmVlIGEgZHVwbGljYXRlIGJsb2NrIHJlY29yZAorICovCitzdGF0aWMgdm9pZCBibG9ja19kbm9kZV9mcmVlKGRub2RlX3QgKm5vZGUpCit7CisJc3RydWN0IGR1cF9ibG9jayAgICAgICAgKmRiOworCXN0cnVjdCBpbm9kZV9lbCAgICAgICAgICpwLCAqbmV4dDsKKworCWRiID0gKHN0cnVjdCBkdXBfYmxvY2sgKikgZG5vZGVfZ2V0KG5vZGUpOworCWZvciAocCA9IGRiLT5pbm9kZV9saXN0OyBwOyBwID0gbmV4dCkgeworCQluZXh0ID0gcC0+bmV4dDsKKwkJZnJlZShwKTsKKwl9CisJZnJlZShub2RlKTsKK30KKworCisvKgorICogTWFpbiBwcm9jZWR1cmUgZm9yIGhhbmRsaW5nIGR1cGxpY2F0ZSBibG9ja3MKKyAqLwordm9pZCBlMmZzY2tfcGFzczFfZHVwYmxvY2tzKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKQoreworCWV4dDJfZmlsc3lzICAgICAgICAgICAgIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsCisJCSAgICAgIF8oIm11bHRpcGx5IGNsYWltZWQgaW5vZGUgbWFwIiksICZpbm9kZV9kdXBfbWFwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMUJfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCisJZGljdF9pbml0KCZpbm9fZGljdCwgRElDVENPVU5UX1RfTUFYLCBkaWN0X2ludF9jbXApOworCWRpY3RfaW5pdCgmYmxrX2RpY3QsIERJQ1RDT1VOVF9UX01BWCwgZGljdF9pbnRfY21wKTsKKwlkaWN0X3NldF9hbGxvY2F0b3IoJmlub19kaWN0LCBpbm9kZV9kbm9kZV9mcmVlKTsKKwlkaWN0X3NldF9hbGxvY2F0b3IoJmJsa19kaWN0LCBibG9ja19kbm9kZV9mcmVlKTsKKworCXBhc3MxYihjdHgsIGJsb2NrX2J1Zik7CisJcGFzczFjKGN0eCwgYmxvY2tfYnVmKTsKKwlwYXNzMWQoY3R4LCBibG9ja19idWYpOworCisJLyoKKwkgKiBUaW1lIHRvIGZyZWUgYWxsIG9mIHRoZSBhY2N1bXVsYXRlZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCB3ZQorCSAqIGRvbid0IG5lZWQgYW55bW9yZS4KKwkgKi8KKwlkaWN0X2ZyZWVfbm9kZXMoJmlub19kaWN0KTsKKwlkaWN0X2ZyZWVfbm9kZXMoJmJsa19kaWN0KTsKK30KKworLyoKKyAqIFNjYW4gdGhlIGlub2RlcyBsb29raW5nIGZvciBpbm9kZXMgdGhhdCBjb250YWluIGR1cGxpY2F0ZSBibG9ja3MuCisgKi8KK3N0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xYiB7CisJZTJmc2NrX3QgICAgICAgIGN0eDsKKwlleHQyX2lub190ICAgICAgaW5vOworCWludCAgICAgICAgICAgICBkdXBfYmxvY2tzOworCXN0cnVjdCBleHQyX2lub2RlICppbm9kZTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4OworfTsKKworc3RhdGljIHZvaWQgcGFzczFiKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlleHQyX2lub190IGlubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSBpbm9kZTsKKwlleHQyX2lub2RlX3NjYW4gc2NhbjsKKwlzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3RfMWIgcGI7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFCX1BBU1NfSEVBREVSLCAmcGN0eCk7CisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX29wZW5faW5vZGVfc2NhbihmcywgY3R4LT5pbm9kZV9idWZmZXJfYmxvY2tzLAorCQkJCQkgICAgICAmc2Nhbik7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFCX0lTQ0FOX0VSUk9SLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisJY3R4LT5zdGFzaGVkX2lub2RlID0gJmlub2RlOworCXBiLmN0eCA9IGN0eDsKKwlwYi5wY3R4ID0gJnBjdHg7CisJcGN0eC5zdHIgPSAicGFzczFiIjsKKwl3aGlsZSAoMSkgeworCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfZ2V0X25leHRfaW5vZGUoc2NhbiwgJmlubywgJmlub2RlKTsKKwkJaWYgKHBjdHguZXJyY29kZSA9PSBFWFQyX0VUX0JBRF9CTE9DS19JTl9JTk9ERV9UQUJMRSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFCX0lTQ0FOX0VSUk9SLCAmcGN0eCk7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJcmV0dXJuOworCQl9CisJCWlmICghaW5vKQorCQkJYnJlYWs7CisJCXBjdHguaW5vID0gY3R4LT5zdGFzaGVkX2lubyA9IGlubzsKKwkJaWYgKChpbm8gIT0gRVhUMl9CQURfSU5PKSAmJgorCQkgICAgIWV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pKQorCQkJY29udGludWU7CisKKwkJcGIuaW5vID0gaW5vOworCQlwYi5kdXBfYmxvY2tzID0gMDsKKwkJcGIuaW5vZGUgPSAmaW5vZGU7CisKKwkJaWYgKGV4dDJmc19pbm9kZV9oYXNfdmFsaWRfYmxvY2tzKCZpbm9kZSkgfHwKKwkJICAgIChpbm8gPT0gRVhUMl9CQURfSU5PKSkKKwkJCXBjdHguZXJyY29kZSA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLAorCQkJCSAgICAgMCwgYmxvY2tfYnVmLCBwcm9jZXNzX3Bhc3MxYl9ibG9jaywgJnBiKTsKKwkJaWYgKGlub2RlLmlfZmlsZV9hY2wpCisJCQlwcm9jZXNzX3Bhc3MxYl9ibG9jayhmcywgJmlub2RlLmlfZmlsZV9hY2wsCisJCQkJCSAgICAgQkxPQ0tfQ09VTlRfRVhUQVRUUiwgMCwgMCwgJnBiKTsKKwkJaWYgKHBiLmR1cF9ibG9ja3MpIHsKKwkJCWVuZF9wcm9ibGVtX2xhdGNoKGN0eCwgUFJfTEFUQ0hfREJMT0NLKTsKKwkJCWlmIChpbm8gPj0gRVhUMl9GSVJTVF9JTk9ERShmcy0+c3VwZXIpIHx8CisJCQkgICAgaW5vID09IEVYVDJfUk9PVF9JTk8pCisJCQkJZHVwX2lub2RlX2NvdW50Kys7CisJCX0KKwkJaWYgKHBjdHguZXJyY29kZSkKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMUJfQkxPQ0tfSVRFUkFURSwgJnBjdHgpOworCX0KKwlleHQyZnNfY2xvc2VfaW5vZGVfc2NhbihzY2FuKTsKKwllMmZzY2tfdXNlX2lub2RlX3Nob3J0Y3V0cyhjdHgsIDApOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcGFzczFiX2Jsb2NrKGV4dDJfZmlsc3lzIGZzIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkJYmxrX3QgICAqYmxvY2tfbnIsCisJCQkJZTJfYmxrY250X3QgYmxvY2tjbnQgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCQlibGtfdCByZWZfYmxrIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkJaW50IHJlZl9vZmZzZXQgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCQl2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0XzFiICpwOworCWUyZnNja190IGN0eDsKKworCWlmIChIT0xFX0JMS0FERFIoKmJsb2NrX25yKSkKKwkJcmV0dXJuIDA7CisJcCA9IChzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3RfMWIgKikgcHJpdl9kYXRhOworCWN0eCA9IHAtPmN0eDsKKworCWlmICghZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZHVwX21hcCwgKmJsb2NrX25yKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBPSywgdGhpcyBpcyBhIGR1cGxpY2F0ZSBibG9jayAqLworCWlmIChwLT5pbm8gIT0gRVhUMl9CQURfSU5PKSB7CisJCXAtPnBjdHgtPmJsayA9ICpibG9ja19ucjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xQl9EVVBfQkxPQ0ssIHAtPnBjdHgpOworCX0KKwlwLT5kdXBfYmxvY2tzKys7CisJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGlub2RlX2R1cF9tYXAsIHAtPmlubyk7CisKKwlhZGRfZHVwZShjdHgsIHAtPmlubywgKmJsb2NrX25yLCBwLT5pbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhc3MgMWM6IFNjYW4gZGlyZWN0b3JpZXMgZm9yIGlub2RlcyB3aXRoIGR1cGxpY2F0ZSBibG9ja3MuICBUaGlzCisgKiBpcyB1c2VkIHNvIHRoYXQgd2UgY2FuIHByaW50IHBhdGhuYW1lcyB3aGVuIHByb21wdGluZyB0aGUgdXNlciBmb3IKKyAqIHdoYXQgdG8gZG8uCisgKi8KK3N0cnVjdCBzZWFyY2hfZGlyX3N0cnVjdCB7CisJaW50ICAgICAgICAgICAgIGNvdW50OworCWV4dDJfaW5vX3QgICAgICBmaXJzdF9pbm9kZTsKKwlleHQyX2lub190ICAgICAgbWF4X2lub2RlOworfTsKKworc3RhdGljIGludCBzZWFyY2hfZGlyZW50X3Byb2MoZXh0Ml9pbm9fdCBkaXIsIGludCBlbnRyeSwKKwkJCSAgICAgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkJICAgICAgaW50IG9mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICAgaW50IGJsb2Nrc2l6ZSBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICAgY2hhciAqYnVmIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHNlYXJjaF9kaXJfc3RydWN0ICpzZDsKKwlzdHJ1Y3QgZHVwX2lub2RlICAgICAgICAqcDsKKwlkbm9kZV90ICAgICAgICAgICAgICAgICAqbjsKKworCXNkID0gKHN0cnVjdCBzZWFyY2hfZGlyX3N0cnVjdCAqKSBwcml2X2RhdGE7CisKKwlpZiAoZGlyZW50LT5pbm9kZSA+IHNkLT5tYXhfaW5vZGUpCisJCS8qIFNob3VsZCBhYm9ydCB0aGlzIGlub2RlLCBidXQgbm90IGV2ZXJ5dGhpbmcgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoKGRpcmVudC0+aW5vZGUgPCBzZC0+Zmlyc3RfaW5vZGUpIHx8IChlbnRyeSA8IERJUkVOVF9PVEhFUl9GSUxFKSB8fAorCSAgICAhZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGlub2RlX2R1cF9tYXAsIGRpcmVudC0+aW5vZGUpKQorCQlyZXR1cm4gMDsKKworCW4gPSBkaWN0X2xvb2t1cCgmaW5vX2RpY3QsIElOVF9UT19WT0lEUFRSKGRpcmVudC0+aW5vZGUpKTsKKwlpZiAoIW4pCisJCXJldHVybiAwOworCXAgPSAoc3RydWN0IGR1cF9pbm9kZSAqKSBkbm9kZV9nZXQobik7CisJcC0+ZGlyID0gZGlyOworCXNkLT5jb3VudC0tOworCisJcmV0dXJuIHNkLT5jb3VudCA/IDAgOiBESVJFTlRfQUJPUlQ7Cit9CisKKworc3RhdGljIHZvaWQgcGFzczFjKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3Qgc2VhcmNoX2Rpcl9zdHJ1Y3Qgc2Q7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFDX1BBU1NfSEVBREVSLCAmcGN0eCk7CisKKwkvKgorCSAqIFNlYXJjaCB0aHJvdWdoIGFsbCBkaXJlY3RvcmllcyB0byB0cmFuc2xhdGUgaW5vZGVzIHRvIG5hbWVzCisJICogKGJ5IHNlYXJjaGluZyBmb3IgdGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5IGZvciB0aGF0IGlub2RlLikKKwkgKi8KKwlzZC5jb3VudCA9IGR1cF9pbm9kZV9jb3VudDsKKwlzZC5maXJzdF9pbm9kZSA9IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKTsKKwlzZC5tYXhfaW5vZGUgPSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50OworCWV4dDJmc19kYmxpc3RfZGlyX2l0ZXJhdGUoZnMtPmRibGlzdCwgMCwgYmxvY2tfYnVmLAorCQkJCSAgc2VhcmNoX2RpcmVudF9wcm9jLCAmc2QpOworfQorCitzdGF0aWMgdm9pZCBwYXNzMWQoZTJmc2NrX3QgY3R4LCBjaGFyICpibG9ja19idWYpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCXN0cnVjdCBkdXBfaW5vZGUgICAgICAgICpwLCAqdDsKKwlzdHJ1Y3QgZHVwX2Jsb2NrICAgICAgICAqcTsKKwlleHQyX2lub190ICAgICAgICAgICAgICAqc2hhcmVkLCBpbm87CisJaW50ICAgICBzaGFyZWRfbGVuOworCWludCAgICAgaTsKKwlpbnQgICAgIGZpbGVfb2s7CisJaW50ICAgICBtZXRhX2RhdGEgPSAwOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgcGN0eDsKKwlkbm9kZV90ICpuLCAqbTsKKwlzdHJ1Y3QgYmxvY2tfZWwgKnM7CisJc3RydWN0IGlub2RlX2VsICpyOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFEX1BBU1NfSEVBREVSLCAmcGN0eCk7CisJZTJmc2NrX3JlYWRfYml0bWFwcyhjdHgpOworCisJcGN0eC5udW0gPSBkdXBfaW5vZGVfY291bnQ7IC8qIGRpY3RfY291bnQoJmlub19kaWN0KTsgKi8KKwlmaXhfcHJvYmxlbShjdHgsIFBSXzFEX05VTV9EVVBfSU5PREVTLCAmcGN0eCk7CisJc2hhcmVkID0gKGV4dDJfaW5vX3QgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJCQkJc2l6ZW9mKGV4dDJfaW5vX3QpICogZGljdF9jb3VudCgmaW5vX2RpY3QpLAorCQkJCSJTaGFyZWQgaW5vZGUgbGlzdCIpOworCWZvciAobiA9IGRpY3RfZmlyc3QoJmlub19kaWN0KTsgbjsgbiA9IGRpY3RfbmV4dCgmaW5vX2RpY3QsIG4pKSB7CisJCXAgPSAoc3RydWN0IGR1cF9pbm9kZSAqKSBkbm9kZV9nZXQobik7CisJCXNoYXJlZF9sZW4gPSAwOworCQlmaWxlX29rID0gMTsKKwkJaW5vID0gKGV4dDJfaW5vX3QpVk9JRFBUUl9UT19JTlQoZG5vZGVfZ2V0a2V5KG4pKTsKKwkJaWYgKGlubyA9PSBFWFQyX0JBRF9JTk8gfHwgaW5vID09IEVYVDJfUkVTSVpFX0lOTykKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEZpbmQgYWxsIG9mIHRoZSBpbm9kZXMgd2hpY2ggc2hhcmUgYmxvY2tzIHdpdGggdGhpcworCQkgKiBvbmUuICBGaXJzdCB3ZSBmaW5kIGFsbCBvZiB0aGUgZHVwbGljYXRlIGJsb2NrcworCQkgKiBiZWxvbmdpbmcgdG8gdGhpcyBpbm9kZSwgYW5kIHRoZW4gc2VhcmNoIGVhY2ggYmxvY2sKKwkJICogZ2V0IHRoZSBsaXN0IG9mIGlub2RlcywgYW5kIG1lcmdlIHRoZW0gdG9nZXRoZXIuCisJCSAqLworCQlmb3IgKHMgPSBwLT5ibG9ja19saXN0OyBzOyBzID0gcy0+bmV4dCkgeworCQkJbSA9IGRpY3RfbG9va3VwKCZibGtfZGljdCwgSU5UX1RPX1ZPSURQVFIocy0+YmxvY2spKTsKKwkJCWlmICghbSkKKwkJCQljb250aW51ZTsgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4uLiAqLworCQkJcSA9IChzdHJ1Y3QgZHVwX2Jsb2NrICopIGRub2RlX2dldChtKTsKKwkJCWlmIChxLT5udW1fYmFkID4gMSkKKwkJCQlmaWxlX29rID0gMDsKKwkJCWlmIChjaGVja19pZl9mc19ibG9jayhjdHgsIHMtPmJsb2NrKSkgeworCQkJCWZpbGVfb2sgPSAwOworCQkJCW1ldGFfZGF0YSA9IDE7CisJCQl9CisKKwkJCS8qCisJCQkgKiBBZGQgYWxsIGlub2RlcyB1c2VkIGJ5IHRoaXMgYmxvY2sgdG8gdGhlCisJCQkgKiBzaGFyZWRbXSAtLS0gd2hpY2ggaXMgYSB1bmlxdWUgbGlzdCwgc28KKwkJCSAqIGlmIGFuIGlub2RlIGlzIGFscmVhZHkgaW4gc2hhcmVkW10sIGRvbid0CisJCQkgKiBhZGQgaXQgYWdhaW4uCisJCQkgKi8KKwkJCWZvciAociA9IHEtPmlub2RlX2xpc3Q7IHI7IHIgPSByLT5uZXh0KSB7CisJCQkJaWYgKHItPmlub2RlID09IGlubykKKwkJCQkJY29udGludWU7CisJCQkJZm9yIChpID0gMDsgaSA8IHNoYXJlZF9sZW47IGkrKykKKwkJCQkJaWYgKHNoYXJlZFtpXSA9PSByLT5pbm9kZSkKKwkJCQkJCWJyZWFrOworCQkJCWlmIChpID09IHNoYXJlZF9sZW4pIHsKKwkJCQkJc2hhcmVkW3NoYXJlZF9sZW4rK10gPSByLT5pbm9kZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBSZXBvcnQgdGhlIGlub2RlIHRoYXQgd2UgYXJlIHdvcmtpbmcgb24KKwkJICovCisJCXBjdHguaW5vZGUgPSAmcC0+aW5vZGU7CisJCXBjdHguaW5vID0gaW5vOworCQlwY3R4LmRpciA9IHAtPmRpcjsKKwkJcGN0eC5ibGtjb3VudCA9IHAtPm51bV9kdXBibG9ja3M7CisJCXBjdHgubnVtID0gbWV0YV9kYXRhID8gc2hhcmVkX2xlbisxIDogc2hhcmVkX2xlbjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xRF9EVVBfRklMRSwgJnBjdHgpOworCQlwY3R4LmJsa2NvdW50ID0gMDsKKwkJcGN0eC5udW0gPSAwOworCisJCWlmIChtZXRhX2RhdGEpCisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFEX1NIQVJFX01FVEFEQVRBLCAmcGN0eCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNoYXJlZF9sZW47IGkrKykgeworCQkJbSA9IGRpY3RfbG9va3VwKCZpbm9fZGljdCwgSU5UX1RPX1ZPSURQVFIoc2hhcmVkW2ldKSk7CisJCQlpZiAoIW0pCisJCQkJY29udGludWU7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCXQgPSAoc3RydWN0IGR1cF9pbm9kZSAqKSBkbm9kZV9nZXQobSk7CisJCQkvKgorCQkJICogUmVwb3J0IHRoZSBpbm9kZSB0aGF0IHdlIGFyZSBzaGFyaW5nIHdpdGgKKwkJCSAqLworCQkJcGN0eC5pbm9kZSA9ICZ0LT5pbm9kZTsKKwkJCXBjdHguaW5vID0gc2hhcmVkW2ldOworCQkJcGN0eC5kaXIgPSB0LT5kaXI7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFEX0RVUF9GSUxFX0xJU1QsICZwY3R4KTsKKwkJfQorCQlpZiAoZmlsZV9vaykgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xRF9EVVBfQkxPQ0tTX0RFQUxULCAmcGN0eCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xRF9DTE9ORV9RVUVTVElPTiwgJnBjdHgpKSB7CisJCQlwY3R4LmVycmNvZGUgPSBjbG9uZV9maWxlKGN0eCwgaW5vLCBwLCBibG9ja19idWYpOworCQkJaWYgKHBjdHguZXJyY29kZSkKKwkJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFEX0NMT05FX0VSUk9SLCAmcGN0eCk7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMURfREVMRVRFX1FVRVNUSU9OLCAmcGN0eCkpCisJCQlkZWxldGVfZmlsZShjdHgsIGlubywgcCwgYmxvY2tfYnVmKTsKKwkJZWxzZQorCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJfQorCWV4dDJmc19mcmVlX21lbSgmc2hhcmVkKTsKK30KKworLyoKKyAqIERyb3AgdGhlIHJlZmNvdW50IG9uIHRoZSBkdXBfYmxvY2sgc3RydWN0dXJlLCBhbmQgY2xlYXIgdGhlIGVudHJ5CisgKiBpbiB0aGUgYmxvY2tfZHVwX21hcCBpZiBhcHByb3ByaWF0ZS4KKyAqLworc3RhdGljIHZvaWQgZGVjcmVtZW50X2JhZGNvdW50KGUyZnNja190IGN0eCwgYmxrX3QgYmxvY2ssIHN0cnVjdCBkdXBfYmxvY2sgKnApCit7CisJcC0+bnVtX2JhZC0tOworCWlmIChwLT5udW1fYmFkIDw9IDAgfHwKKwkgICAgKHAtPm51bV9iYWQgPT0gMSAmJiAhY2hlY2tfaWZfZnNfYmxvY2soY3R4LCBibG9jaykpKQorCQlleHQyZnNfdW5tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2R1cF9tYXAsIGJsb2NrKTsKK30KKworc3RhdGljIGludCBkZWxldGVfZmlsZV9ibG9jayhleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgYmxrX3QgICAgICAqYmxvY2tfbnIsCisJCQkgICAgIGUyX2Jsa2NudF90IGJsb2NrY250IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICAgIGJsa190IHJlZl9ibG9jayBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICBpbnQgcmVmX29mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0XzFiICpwYjsKKwlzdHJ1Y3QgZHVwX2Jsb2NrICpwOworCWRub2RlX3QgKm47CisJZTJmc2NrX3QgY3R4OworCisJcGIgPSAoc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0XzFiICopIHByaXZfZGF0YTsKKwljdHggPSBwYi0+Y3R4OworCisJaWYgKEhPTEVfQkxLQUREUigqYmxvY2tfbnIpKQorCQlyZXR1cm4gMDsKKworCWlmIChleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19kdXBfbWFwLCAqYmxvY2tfbnIpKSB7CisJCW4gPSBkaWN0X2xvb2t1cCgmYmxrX2RpY3QsIElOVF9UT19WT0lEUFRSKCpibG9ja19ucikpOworCQlpZiAobikgeworCQkJcCA9IChzdHJ1Y3QgZHVwX2Jsb2NrICopIGRub2RlX2dldChuKTsKKwkJCWRlY3JlbWVudF9iYWRjb3VudChjdHgsICpibG9ja19uciwgcCk7CisJCX0gZWxzZQorCQkJYmJfZXJyb3JfbXNnKF8oImludGVybmFsIGVycm9yOyBjYW4ndCBmaW5kIGR1cF9ibGsgZm9yICVkIiksCisJCQkJKmJsb2NrX25yKTsKKwl9IGVsc2UgeworCQlleHQyZnNfdW5tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgKmJsb2NrX25yKTsKKwkJZXh0MmZzX2Jsb2NrX2FsbG9jX3N0YXRzKGZzLCAqYmxvY2tfbnIsIC0xKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsZXRlX2ZpbGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywKKwkJCXN0cnVjdCBkdXBfaW5vZGUgKmRwLCBjaGFyKiBibG9ja19idWYpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCXN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xYiBwYjsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGNvdW50OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwlwY3R4LmlubyA9IHBiLmlubyA9IGlubzsKKwlwYi5kdXBfYmxvY2tzID0gZHAtPm51bV9kdXBibG9ja3M7CisJcGIuY3R4ID0gY3R4OworCXBjdHguc3RyID0gImRlbGV0ZV9maWxlIjsKKworCWUyZnNja19yZWFkX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJkZWxldGVfZmlsZSIpOworCWlmIChleHQyZnNfaW5vZGVfaGFzX3ZhbGlkX2Jsb2NrcygmaW5vZGUpKQorCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywgMCwgYmxvY2tfYnVmLAorCQkJCQkJICAgICBkZWxldGVfZmlsZV9ibG9jaywgJnBiKTsKKwlpZiAocGN0eC5lcnJjb2RlKQorCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFCX0JMT0NLX0lURVJBVEUsICZwY3R4KTsKKwlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOworCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgaW5vKTsKKwlpZiAoY3R4LT5pbm9kZV9iYWRfbWFwKQorCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2JhZF9tYXAsIGlubyk7CisJZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzMihmcywgaW5vLCAtMSwgTElOVVhfU19JU0RJUihpbm9kZS5pX21vZGUpKTsKKworCS8qIElub2RlIG1heSBoYXZlIGNoYW5nZWQgYnkgYmxvY2tfaXRlcmF0ZSwgc28gcmVyZWFkIGl0ICovCisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgImRlbGV0ZV9maWxlIik7CisJaW5vZGUuaV9saW5rc19jb3VudCA9IDA7CisJaW5vZGUuaV9kdGltZSA9IHRpbWUoTlVMTCk7CisJaWYgKGlub2RlLmlfZmlsZV9hY2wgJiYKKwkgICAgKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpKSB7CisJCWNvdW50ID0gMTsKKwkJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2FkanVzdF9lYV9yZWZjb3VudChmcywgaW5vZGUuaV9maWxlX2FjbCwKKwkJCQkJCSAgIGJsb2NrX2J1ZiwgLTEsICZjb3VudCk7CisJCWlmIChwY3R4LmVycmNvZGUgPT0gRVhUMl9FVF9CQURfRUFfQkxPQ0tfTlVNKSB7CisJCQlwY3R4LmVycmNvZGUgPSAwOworCQkJY291bnQgPSAxOworCQl9CisJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCXBjdHguYmxrID0gaW5vZGUuaV9maWxlX2FjbDsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMUJfQURKX0VBX1JFRkNPVU5ULCAmcGN0eCk7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIGNvdW50IGlzIHplcm8sIHRoZW4gYXJyYW5nZSB0byBoYXZlIHRoZQorCQkgKiBibG9jayBkZWxldGVkLiAgSWYgdGhlIGJsb2NrIGlzIGluIHRoZSBibG9ja19kdXBfbWFwLAorCQkgKiBhbHNvIGNhbGwgZGVsZXRlX2ZpbGVfYmxvY2sgc2luY2UgaXQgd2lsbCB0YWtlIGNhcmUKKwkJICogb2Yga2VlcGluZyB0aGUgYWNjb3VudGluZyBzdHJhaWdodC4KKwkJICovCisJCWlmICgoY291bnQgPT0gMCkgfHwKKwkJICAgIGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2R1cF9tYXAsCisJCQkJCSAgICAgaW5vZGUuaV9maWxlX2FjbCkpCisJCQlkZWxldGVfZmlsZV9ibG9jayhmcywgJmlub2RlLmlfZmlsZV9hY2wsCisJCQkJCSAgQkxPQ0tfQ09VTlRfRVhUQVRUUiwgMCwgMCwgJnBiKTsKKwl9CisJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJkZWxldGVfZmlsZSIpOworfQorCitzdHJ1Y3QgY2xvbmVfc3RydWN0IHsKKwllcnJjb2RlX3QgICAgICAgZXJyY29kZTsKKwlleHQyX2lub190ICAgICAgZGlyOworCWNoYXIgICAgKmJ1ZjsKKwllMmZzY2tfdCBjdHg7Cit9OworCitzdGF0aWMgaW50IGNsb25lX2ZpbGVfYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCQkgICAgYmxrX3QgICAgICAgKmJsb2NrX25yLAorCQkJICAgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJICAgIGJsa190IHJlZl9ibG9jayBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgIGludCByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBkdXBfYmxvY2sgKnA7CisJYmxrX3QgICBuZXdfYmxvY2s7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwlzdHJ1Y3QgY2xvbmVfc3RydWN0ICpjcyA9IChzdHJ1Y3QgY2xvbmVfc3RydWN0ICopIHByaXZfZGF0YTsKKwlkbm9kZV90ICpuOworCWUyZnNja190IGN0eDsKKworCWN0eCA9IGNzLT5jdHg7CisKKwlpZiAoSE9MRV9CTEtBRERSKCpibG9ja19ucikpCisJCXJldHVybiAwOworCisJaWYgKGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2R1cF9tYXAsICpibG9ja19ucikpIHsKKwkJbiA9IGRpY3RfbG9va3VwKCZibGtfZGljdCwgSU5UX1RPX1ZPSURQVFIoKmJsb2NrX25yKSk7CisJCWlmIChuKSB7CisJCQlwID0gKHN0cnVjdCBkdXBfYmxvY2sgKikgZG5vZGVfZ2V0KG4pOworCQkJcmV0dmFsID0gZXh0MmZzX25ld19ibG9jayhmcywgMCwgY3R4LT5ibG9ja19mb3VuZF9tYXAsCisJCQkJCQkgICZuZXdfYmxvY2spOworCQkJaWYgKHJldHZhbCkgeworCQkJCWNzLT5lcnJjb2RlID0gcmV0dmFsOworCQkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJCX0KKwkJCWlmIChjcy0+ZGlyICYmIChibG9ja2NudCA+PSAwKSkgeworCQkJCXJldHZhbCA9IGV4dDJmc19zZXRfZGlyX2Jsb2NrKGZzLT5kYmxpc3QsCisJCQkJICAgICAgY3MtPmRpciwgbmV3X2Jsb2NrLCBibG9ja2NudCk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQljcy0+ZXJyY29kZSA9IHJldHZhbDsKKwkJCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQkJCX0KKwkJCX0KKworCQkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sICpibG9ja19uciwgMSwKKwkJCQkJCSAgICAgY3MtPmJ1Zik7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJY3MtPmVycmNvZGUgPSByZXR2YWw7CisJCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQkJfQorCQkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBuZXdfYmxvY2ssIDEsCisJCQkJCQkgICAgICBjcy0+YnVmKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQljcy0+ZXJyY29kZSA9IHJldHZhbDsKKwkJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCQl9CisJCQlkZWNyZW1lbnRfYmFkY291bnQoY3R4LCAqYmxvY2tfbnIsIHApOworCQkJKmJsb2NrX25yID0gbmV3X2Jsb2NrOworCQkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCQkJIG5ld19ibG9jayk7CisJCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgbmV3X2Jsb2NrKTsKKwkJCXJldHVybiBCTE9DS19DSEFOR0VEOworCQl9IGVsc2UKKwkJCWJiX2Vycm9yX21zZyhfKCJpbnRlcm5hbCBlcnJvcjsgY2FuJ3QgZmluZCBkdXBfYmxrIGZvciAlZCIpLAorCQkJCSpibG9ja19ucik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsb25lX2ZpbGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywKKwkJICAgICAgc3RydWN0IGR1cF9pbm9kZSAqZHAsIGNoYXIqIGJsb2NrX2J1ZikKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwlzdHJ1Y3QgY2xvbmVfc3RydWN0IGNzOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJYmxrX3QgICAgICAgICAgIGJsazsKKwlkbm9kZV90ICAgICAgICAgKm47CisJc3RydWN0IGlub2RlX2VsICppbm9fZWw7CisJc3RydWN0IGR1cF9ibG9jayAgICAgICAgKmRiOworCXN0cnVjdCBkdXBfaW5vZGUgICAgICAgICpkaTsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJY3MuZXJyY29kZSA9IDA7CisJY3MuZGlyID0gMDsKKwljcy5jdHggPSBjdHg7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmNzLmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwLCBpbm8pKQorCQljcy5kaXIgPSBpbm87CisKKwlwY3R4LmlubyA9IGlubzsKKwlwY3R4LnN0ciA9ICJjbG9uZV9maWxlIjsKKwlpZiAoZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3MoJmRwLT5pbm9kZSkpCisJCXBjdHguZXJyY29kZSA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLCAwLCBibG9ja19idWYsCisJCQkJCQkgICAgIGNsb25lX2ZpbGVfYmxvY2ssICZjcyk7CisJZXh0MmZzX21hcmtfYmJfZGlydHkoZnMpOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xQl9CTE9DS19JVEVSQVRFLCAmcGN0eCk7CisJCXJldHZhbCA9IHBjdHguZXJyY29kZTsKKwkJZ290byBlcnJvdXQ7CisJfQorCWlmIChjcy5lcnJjb2RlKSB7CisJCWJiX2Vycm9yX21zZyhfKCJyZXR1cm5lZCBmcm9tIGNsb25lX2ZpbGVfYmxvY2siKSk7CisJCXJldHZhbCA9IGNzLmVycmNvZGU7CisJCWdvdG8gZXJyb3V0OworCX0KKwkvKiBUaGUgaW5vZGUgbWF5IGhhdmUgY2hhbmdlZCBvbiBkaXNrLCBzbyB3ZSBoYXZlIHRvIHJlLXJlYWQgaXQgKi8KKwllMmZzY2tfcmVhZF9pbm9kZShjdHgsIGlubywgJmRwLT5pbm9kZSwgImNsb25lIGZpbGUgRUEiKTsKKwlibGsgPSBkcC0+aW5vZGUuaV9maWxlX2FjbDsKKwlpZiAoYmxrICYmIChjbG9uZV9maWxlX2Jsb2NrKGZzLCAmZHAtPmlub2RlLmlfZmlsZV9hY2wsCisJCQkJICAgICBCTE9DS19DT1VOVF9FWFRBVFRSLCAwLCAwLCAmY3MpID09CisJCSAgICBCTE9DS19DSEFOR0VEKSkgeworCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sICZkcC0+aW5vZGUsICJjbG9uZSBmaWxlIEVBIik7CisJCS8qCisJCSAqIElmIHdlIGNsb25lZCB0aGUgRUEgYmxvY2ssIGZpbmQgYWxsIG90aGVyIGlub2RlcworCQkgKiB3aGljaCByZWZlcmVkIHRvIHRoYXQgRUEgYmxvY2ssIGFuZCBtb2RpZnkKKwkJICogdGhlbSB0byBwb2ludCB0byB0aGUgbmV3IEVBIGJsb2NrLgorCQkgKi8KKwkJbiA9IGRpY3RfbG9va3VwKCZibGtfZGljdCwgSU5UX1RPX1ZPSURQVFIoYmxrKSk7CisJCWRiID0gKHN0cnVjdCBkdXBfYmxvY2sgKikgZG5vZGVfZ2V0KG4pOworCQlmb3IgKGlub19lbCA9IGRiLT5pbm9kZV9saXN0OyBpbm9fZWw7IGlub19lbCA9IGlub19lbC0+bmV4dCkgeworCQkJaWYgKGlub19lbC0+aW5vZGUgPT0gaW5vKQorCQkJCWNvbnRpbnVlOworCQkJbiA9IGRpY3RfbG9va3VwKCZpbm9fZGljdCwgSU5UX1RPX1ZPSURQVFIoaW5vX2VsLT5pbm9kZSkpOworCQkJZGkgPSAoc3RydWN0IGR1cF9pbm9kZSAqKSBkbm9kZV9nZXQobik7CisJCQlpZiAoZGktPmlub2RlLmlfZmlsZV9hY2wgPT0gYmxrKSB7CisJCQkJZGktPmlub2RlLmlfZmlsZV9hY2wgPSBkcC0+aW5vZGUuaV9maWxlX2FjbDsKKwkJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm9fZWwtPmlub2RlLAorCQkJCQkgICAmZGktPmlub2RlLCAiY2xvbmUgZmlsZSBFQSIpOworCQkJCWRlY3JlbWVudF9iYWRjb3VudChjdHgsIGJsaywgZGIpOworCQkJfQorCQl9CisJfQorCXJldHZhbCA9IDA7CitlcnJvdXQ6CisJZXh0MmZzX2ZyZWVfbWVtKCZjcy5idWYpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyAxIGlmIGEgYmxvY2sgb3ZlcmxhcHMgd2l0aCBvbmUgb2YgdGhlIHN1cGVyYmxvY2tzLAorICogZ3JvdXAgZGVzY3JpcHRvcnMsIGlub2RlIGJpdG1hcHMsIG9yIGJsb2NrIGJpdG1hcHMuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaWZfZnNfYmxvY2soZTJmc2NrX3QgY3R4LCBibGtfdCB0ZXN0X2Jsb2NrKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlibGtfdCAgIGJsb2NrOworCWRncnBfdCAgaTsKKworCWJsb2NrID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKworCQkvKiBDaGVjayBzdXBlcmJsb2Nrcy9ibG9jayBncm91cCBkZXNjcmlwdHJvcyAqLworCQlpZiAoZXh0MmZzX2JnX2hhc19zdXBlcihmcywgaSkpIHsKKwkJCWlmICh0ZXN0X2Jsb2NrID49IGJsb2NrICYmCisJCQkgICAgKHRlc3RfYmxvY2sgPD0gYmxvY2sgKyBmcy0+ZGVzY19ibG9ja3MpKQorCQkJCXJldHVybiAxOworCQl9CisKKwkJLyogQ2hlY2sgdGhlIGlub2RlIHRhYmxlICovCisJCWlmICgoZnMtPmdyb3VwX2Rlc2NbaV0uYmdfaW5vZGVfdGFibGUpICYmCisJCSAgICAodGVzdF9ibG9jayA+PSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV90YWJsZSkgJiYKKwkJICAgICh0ZXN0X2Jsb2NrIDwgKGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX3RhYmxlICsKKwkJCQkgICBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCkpKQorCQkJcmV0dXJuIDE7CisKKwkJLyogQ2hlY2sgdGhlIGJpdG1hcCBibG9ja3MgKi8KKwkJaWYgKCh0ZXN0X2Jsb2NrID09IGZzLT5ncm91cF9kZXNjW2ldLmJnX2Jsb2NrX2JpdG1hcCkgfHwKKwkJICAgICh0ZXN0X2Jsb2NrID09IGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX2JpdG1hcCkpCisJCQlyZXR1cm4gMTsKKworCQlibG9jayArPSBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKKwl9CisJcmV0dXJuIDA7Cit9CisvKgorICogcGFzczIuYyAtLS0gY2hlY2sgZGlyZWN0b3J5IHN0cnVjdHVyZQorICoKKyAqIFBhc3MgMiBvZiBlMmZzY2sgaXRlcmF0ZXMgdGhyb3VnaCBhbGwgYWN0aXZlIGRpcmVjdG9yeSBpbm9kZXMsIGFuZAorICogYXBwbGllcyB0byBmb2xsb3dpbmcgdGVzdHMgdG8gZWFjaCBkaXJlY3RvcnkgZW50cnkgaW4gdGhlIGRpcmVjdG9yeQorICogYmxvY2tzIGluIHRoZSBpbm9kZXM6CisgKgorICogICAgICAtIFRoZSBsZW5ndGggb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSAocmVjX2xlbikgc2hvdWxkIGJlIGF0CisgKiAgICAgICAgICAgICAgbGVhc3QgOCBieXRlcywgYW5kIG5vIG1vcmUgdGhhbiB0aGUgcmVtYWluaW5nIHNwYWNlCisgKiAgICAgICAgICAgICAgbGVmdCBpbiB0aGUgZGlyZWN0b3J5IGJsb2NrLgorICogICAgICAtIFRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaW4gdGhlIGRpcmVjdG9yeSBlbnRyeSAobmFtZV9sZW4pCisgKiAgICAgICAgICAgICAgc2hvdWxkIGJlIGxlc3MgdGhhbiAocmVjX2xlbiAtIDgpLgorICogICAgICAtIFRoZSBpbm9kZSBudW1iZXIgaW4gdGhlIGRpcmVjdG9yeSBlbnRyeSBzaG91bGQgYmUgd2l0aGluCisgKiAgICAgICAgICAgICAgbGVnYWwgYm91bmRzLgorICogICAgICAtIFRoZSBpbm9kZSBudW1iZXIgc2hvdWxkIHJlZmVyIHRvIGEgaW4tdXNlIGlub2RlLgorICogICAgICAtIFRoZSBmaXJzdCBlbnRyeSBzaG91bGQgYmUgJy4nLCBhbmQgaXRzIGlub2RlIHNob3VsZCBiZQorICogICAgICAgICAgICAgIHRoZSBpbm9kZSBvZiB0aGUgZGlyZWN0b3J5LgorICogICAgICAtIFRoZSBzZWNvbmQgZW50cnkgc2hvdWxkIGJlICcuLicuCisgKgorICogVG8gbWluaW1pemUgZGlzayBzZWVrIHRpbWUsIHRoZSBkaXJlY3RvcnkgYmxvY2tzIGFyZSBwcm9jZXNzZWQgaW4KKyAqIHNvcnRlZCBvcmRlciBvZiBibG9jayBudW1iZXJzLgorICoKKyAqIFBhc3MgMiBhbHNvIGNvbGxlY3RzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgKiAgICAgIC0gVGhlIGlub2RlIG51bWJlcnMgb2YgdGhlIHN1YmRpcmVjdG9yaWVzIGZvciBlYWNoIGRpcmVjdG9yeS4KKyAqCisgKiBQYXNzIDIgcmVsaWVzIG9uIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gZnJvbSBwcmV2aW91cyBwYXNzZXM6CisgKiAgICAgIC0gVGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gcGFzcyAxLgorICogICAgICAtIFRoZSBpbm9kZV91c2VkX21hcCBiaXRtYXAKKyAqICAgICAgLSBUaGUgaW5vZGVfYmFkX21hcCBiaXRtYXAKKyAqICAgICAgLSBUaGUgaW5vZGVfZGlyX21hcCBiaXRtYXAKKyAqCisgKiBQYXNzIDIgZnJlZXMgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZXMKKyAqICAgICAgLSBUaGUgaW5vZGVfYmFkX21hcCBiaXRtYXAKKyAqICAgICAgLSBUaGUgaW5vZGVfcmVnX21hcCBiaXRtYXAKKyAqLworCisvKgorICogS2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGltZXMgYW4gaW5vZGUgaXMgcmVmZXJlbmNlZC4KKyAqLworc3RhdGljIHZvaWQgZGVhbGxvY2F0ZV9pbm9kZShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vLCBjaGFyKiBibG9ja19idWYpOworc3RhdGljIGludCBjaGVja19kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCQkgICBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGlyX2Jsb2Nrc19pbmZvLAorCQkJICAgdm9pZCAqcHJpdl9kYXRhKTsKK3N0YXRpYyBpbnQgYWxsb2NhdGVfZGlyX2Jsb2NrKGUyZnNja190IGN0eCwgc3RydWN0IGV4dDJfZGJfZW50cnkgKmRpcl9ibG9ja3NfaW5mbywKKwkJCSAgICAgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpOworc3RhdGljIGludCB1cGRhdGVfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgIGJsa190ICAgICAgICpibG9ja19uciwKKwkJCSAgICBlMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJCSAgICBibGtfdCAgICAgICByZWZfYmxvY2ssCisJCQkgICAgaW50ICAgICAgICAgcmVmX29mZnNldCwKKwkJCSAgICB2b2lkICAgICAgICAqcHJpdl9kYXRhKTsKK3N0YXRpYyB2b2lkIGNsZWFyX2h0cmVlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8pOworc3RhdGljIGludCBodHJlZV9kZXB0aChzdHJ1Y3QgZHhfZGlyX2luZm8gKmR4X2RpciwKKwkJICAgICAgIHN0cnVjdCBkeF9kaXJibG9ja19pbmZvICpkeF9kYik7CitzdGF0aWMgaW50IHNwZWNpYWxfZGlyX2Jsb2NrX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKKworc3RydWN0IGNoZWNrX2Rpcl9zdHJ1Y3QgeworCWNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCWludCAgICAgY291bnQsIG1heDsKKwllMmZzY2tfdCBjdHg7Cit9OworCitzdGF0aWMgdm9pZCBlMmZzY2tfcGFzczIoZTJmc2NrX3QgY3R4KQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYiA9IGN0eC0+ZnMtPnN1cGVyOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJZXh0Ml9maWxzeXMgICAgICAgICAgICAgZnMgPSBjdHgtPmZzOworCWNoYXIgICAgICAgICAgICAgICAgICAgICpidWY7CisJc3RydWN0IGRpcl9pbmZvICAgICAgICAgKmRpcjsKKwlzdHJ1Y3QgY2hlY2tfZGlyX3N0cnVjdCBjZDsKKwlzdHJ1Y3QgZHhfZGlyX2luZm8gICAgICAqZHhfZGlyOworCXN0cnVjdCBkeF9kaXJibG9ja19pbmZvICpkeF9kYiwgKmR4X3BhcmVudDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBiOworCWludCAgICAgICAgICAgICAgICAgICAgIGksIGRlcHRoOworCXByb2JsZW1fdCAgICAgICAgICAgICAgIGNvZGU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgYmFkX2RpcjsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmY2QucGN0eCk7CisKKwkvKiBQYXNzIDIgKi8KKworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQlmaXhfcHJvYmxlbShjdHgsIFBSXzJfUEFTU19IRUFERVIsICZjZC5wY3R4KTsKKworCWNkLnBjdHguZXJyY29kZSA9IGV4dDJmc19jcmVhdGVfaWNvdW50MihmcywgRVhUMl9JQ09VTlRfT1BUX0lOQ1JFTUVOVCwKKwkJCQkJCTAsIGN0eC0+aW5vZGVfbGlua19pbmZvLAorCQkJCQkJJmN0eC0+aW5vZGVfY291bnQpOworCWlmIChjZC5wY3R4LmVycmNvZGUpIHsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX0FMTE9DQVRFX0lDT1VOVCwgJmNkLnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCWJ1ZiA9IChjaGFyICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCAyKmZzLT5ibG9ja3NpemUsCisJCQkJCSAgICAgICJkaXJlY3Rvcnkgc2NhbiBidWZmZXIiKTsKKworCS8qCisJICogU2V0IHVwIHRoZSBwYXJlbnQgcG9pbnRlciBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5LCBpZgorCSAqIHByZXNlbnQuICAoSWYgdGhlIHJvb3QgZGlyZWN0b3J5IGlzIG5vdCBwcmVzZW50LCB3ZSB3aWxsCisJICogY3JlYXRlIGl0IGluIHBhc3MgMy4pCisJICovCisJZGlyID0gZTJmc2NrX2dldF9kaXJfaW5mbyhjdHgsIEVYVDJfUk9PVF9JTk8pOworCWlmIChkaXIpCisJCWRpci0+cGFyZW50ID0gRVhUMl9ST09UX0lOTzsKKworCWNkLmJ1ZiA9IGJ1ZjsKKwljZC5jdHggPSBjdHg7CisJY2QuY291bnQgPSAxOworCWNkLm1heCA9IGV4dDJmc19kYmxpc3RfY291bnQoZnMtPmRibGlzdCk7CisKKwlpZiAoY3R4LT5wcm9ncmVzcykKKwkJKHZvaWQpIChjdHgtPnByb2dyZXNzKShjdHgsIDIsIDAsIGNkLm1heCk7CisKKwlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpCisJCWV4dDJmc19kYmxpc3Rfc29ydChmcy0+ZGJsaXN0LCBzcGVjaWFsX2Rpcl9ibG9ja19jbXApOworCisJY2QucGN0eC5lcnJjb2RlID0gZXh0MmZzX2RibGlzdF9pdGVyYXRlKGZzLT5kYmxpc3QsIGNoZWNrX2Rpcl9ibG9jaywKKwkJCQkJCSZjZCk7CisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJcmV0dXJuOworCWlmIChjZC5wY3R4LmVycmNvZGUpIHsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX0RCTElTVF9JVEVSQVRFLCAmY2QucGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBFTkFCTEVfSFRSRUUKKwlmb3IgKGk9MDsgKGR4X2RpciA9IGUyZnNja19keF9kaXJfaW5mb19pdGVyKGN0eCwgJmkpKSAhPSAwOykgeworCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJcmV0dXJuOworCQlpZiAoZHhfZGlyLT5udW1ibG9ja3MgPT0gMCkKKwkJCWNvbnRpbnVlOworCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQliYWRfZGlyID0gMDsKKwkJcGN0eC5kaXIgPSBkeF9kaXItPmlubzsKKwkJZHhfZGIgPSBkeF9kaXItPmR4X2Jsb2NrOworCQlpZiAoZHhfZGItPmZsYWdzICYgRFhfRkxBR19SRUZFUkVOQ0VEKQorCQkJZHhfZGItPmZsYWdzIHw9IERYX0ZMQUdfRFVQX1JFRjsKKwkJZWxzZQorCQkJZHhfZGItPmZsYWdzIHw9IERYX0ZMQUdfUkVGRVJFTkNFRDsKKwkJLyoKKwkJICogRmluZCBhbGwgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IGxlYWYgYmxvY2tzLCBhbmQKKwkJICogdXBkYXRlIHRoZWlyIHBhcmVudCdzIG1pbiBhbmQgbWF4IGhhc2ggdmFsdWVzCisJCSAqLworCQlmb3IgKGI9MCwgZHhfZGIgPSBkeF9kaXItPmR4X2Jsb2NrOworCQkgICAgIGIgPCBkeF9kaXItPm51bWJsb2NrczsKKwkJICAgICBiKyssIGR4X2RiKyspIHsKKwkJCWlmICgoZHhfZGItPnR5cGUgIT0gRFhfRElSQkxPQ0tfTEVBRikgfHwKKwkJCSAgICAhKGR4X2RiLT5mbGFncyAmIChEWF9GTEFHX0ZJUlNUIHwgRFhfRkxBR19MQVNUKSkpCisJCQkJY29udGludWU7CisJCQlkeF9wYXJlbnQgPSAmZHhfZGlyLT5keF9ibG9ja1tkeF9kYi0+cGFyZW50XTsKKwkJCS8qCisJCQkgKiBYWFggTWFrZSBzdXJlIGR4X3BhcmVudC0+bWluX2hhc2ggPiBkeF9kYi0+bWluX2hhc2gKKwkJCSAqLworCQkJaWYgKGR4X2RiLT5mbGFncyAmIERYX0ZMQUdfRklSU1QpCisJCQkJZHhfcGFyZW50LT5taW5faGFzaCA9IGR4X2RiLT5taW5faGFzaDsKKwkJCS8qCisJCQkgKiBYWFggTWFrZSBzdXJlIGR4X3BhcmVudC0+bWF4X2hhc2ggPCBkeF9kYi0+bWF4X2hhc2gKKwkJCSAqLworCQkJaWYgKGR4X2RiLT5mbGFncyAmIERYX0ZMQUdfTEFTVCkKKwkJCQlkeF9wYXJlbnQtPm1heF9oYXNoID0gZHhfZGItPm1heF9oYXNoOworCQl9CisKKwkJZm9yIChiPTAsIGR4X2RiID0gZHhfZGlyLT5keF9ibG9jazsKKwkJICAgICBiIDwgZHhfZGlyLT5udW1ibG9ja3M7CisJCSAgICAgYisrLCBkeF9kYisrKSB7CisJCQlwY3R4LmJsa2NvdW50ID0gYjsKKwkJCXBjdHguZ3JvdXAgPSBkeF9kYi0+cGFyZW50OworCQkJY29kZSA9IDA7CisJCQlpZiAoIShkeF9kYi0+ZmxhZ3MgJiBEWF9GTEFHX0ZJUlNUKSAmJgorCQkJICAgIChkeF9kYi0+bWluX2hhc2ggPCBkeF9kYi0+bm9kZV9taW5faGFzaCkpIHsKKwkJCQlwY3R4LmJsayA9IGR4X2RiLT5taW5faGFzaDsKKwkJCQlwY3R4LmJsazIgPSBkeF9kYi0+bm9kZV9taW5faGFzaDsKKwkJCQljb2RlID0gUFJfMl9IVFJFRV9NSU5fSEFTSDsKKwkJCQlmaXhfcHJvYmxlbShjdHgsIGNvZGUsICZwY3R4KTsKKwkJCQliYWRfZGlyKys7CisJCQl9CisJCQlpZiAoZHhfZGItPnR5cGUgPT0gRFhfRElSQkxPQ0tfTEVBRikgeworCQkJCWRlcHRoID0gaHRyZWVfZGVwdGgoZHhfZGlyLCBkeF9kYik7CisJCQkJaWYgKGRlcHRoICE9IGR4X2Rpci0+ZGVwdGgpIHsKKwkJCQkJY29kZSA9IFBSXzJfSFRSRUVfQkFEX0RFUFRIOworCQkJCQlmaXhfcHJvYmxlbShjdHgsIGNvZGUsICZwY3R4KTsKKwkJCQkJYmFkX2RpcisrOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBUaGlzIHRlc3QgZG9lc24ndCBhcHBseSBmb3IgdGhlIHJvb3QgYmxvY2sKKwkJCSAqIGF0IGJsb2NrICMwCisJCQkgKi8KKwkJCWlmIChiICYmCisJCQkgICAgKGR4X2RiLT5tYXhfaGFzaCA+IGR4X2RiLT5ub2RlX21heF9oYXNoKSkgeworCQkJCXBjdHguYmxrID0gZHhfZGItPm1heF9oYXNoOworCQkJCXBjdHguYmxrMiA9IGR4X2RiLT5ub2RlX21heF9oYXNoOworCQkJCWNvZGUgPSBQUl8yX0hUUkVFX01BWF9IQVNIOworCQkJCWZpeF9wcm9ibGVtKGN0eCwgY29kZSwgJnBjdHgpOworCQkJCWJhZF9kaXIrKzsKKwkJCX0KKwkJCWlmICghKGR4X2RiLT5mbGFncyAmIERYX0ZMQUdfUkVGRVJFTkNFRCkpIHsKKwkJCQljb2RlID0gUFJfMl9IVFJFRV9OT1RSRUY7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBjb2RlLCAmcGN0eCk7CisJCQkJYmFkX2RpcisrOworCQkJfSBlbHNlIGlmIChkeF9kYi0+ZmxhZ3MgJiBEWF9GTEFHX0RVUF9SRUYpIHsKKwkJCQljb2RlID0gUFJfMl9IVFJFRV9EVVBSRUY7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBjb2RlLCAmcGN0eCk7CisJCQkJYmFkX2RpcisrOworCQkJfQorCQkJaWYgKGNvZGUgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYmFkX2RpciAmJiBmaXhfcHJvYmxlbShjdHgsIFBSXzJfSFRSRUVfQ0xFQVIsICZwY3R4KSkgeworCQkJY2xlYXJfaHRyZWUoY3R4LCBkeF9kaXItPmlubyk7CisJCQlkeF9kaXItPm51bWJsb2NrcyA9IDA7CisJCX0KKwl9CisjZW5kaWYKKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisJZXh0MmZzX2ZyZWVfZGJsaXN0KGZzLT5kYmxpc3QpOworCisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfYmFkX21hcCk7CisJY3R4LT5pbm9kZV9iYWRfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9yZWdfbWFwKTsKKwljdHgtPmlub2RlX3JlZ19tYXAgPSAwOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwlpZiAoY3R4LT5sYXJnZV9maWxlcykgeworCQlpZiAoIShzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJCSAgICAgIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRSkgJiYKKwkJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9GRUFUVVJFX0xBUkdFX0ZJTEVTLCAmcGN0eCkpIHsKKwkJCXNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0IHw9CisJCQkJRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQl9CisJCWlmIChzYi0+c19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYgJiYKKwkJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9GU19SRVZfTEVWRUwsICZwY3R4KSkgeworCQkJZXh0MmZzX3VwZGF0ZV9keW5hbWljX3Jldihmcyk7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCX0KKwl9IGVsc2UgaWYgKCFjdHgtPmxhcmdlX2ZpbGVzICYmCisJICAgIChzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJICAgICAgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFKSkgeworCQlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1JXKSB7CisJCQlzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmPQorCQkJCX5FWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEU7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgTUFYX0RFUFRIIDMyMDAwCitzdGF0aWMgaW50IGh0cmVlX2RlcHRoKHN0cnVjdCBkeF9kaXJfaW5mbyAqZHhfZGlyLAorCQkgICAgICAgc3RydWN0IGR4X2RpcmJsb2NrX2luZm8gKmR4X2RiKQoreworCWludCAgICAgZGVwdGggPSAwOworCisJd2hpbGUgKGR4X2RiLT50eXBlICE9IERYX0RJUkJMT0NLX1JPT1QgJiYgZGVwdGggPCBNQVhfREVQVEgpIHsKKwkJZHhfZGIgPSAmZHhfZGlyLT5keF9ibG9ja1tkeF9kYi0+cGFyZW50XTsKKwkJZGVwdGgrKzsKKwl9CisJcmV0dXJuIGRlcHRoOworfQorCitzdGF0aWMgaW50IGRpY3RfZGVfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkZV9hLCAqZGVfYjsKKwlpbnQgICAgIGFfbGVuLCBiX2xlbjsKKworCWRlX2EgPSAoY29uc3Qgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIGE7CisJYV9sZW4gPSBkZV9hLT5uYW1lX2xlbiAmIDB4RkY7CisJZGVfYiA9IChjb25zdCBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgYjsKKwliX2xlbiA9IGRlX2ItPm5hbWVfbGVuICYgMHhGRjsKKworCWlmIChhX2xlbiAhPSBiX2xlbikKKwkJcmV0dXJuIChhX2xlbiAtIGJfbGVuKTsKKworCXJldHVybiBzdHJuY21wKGRlX2EtPm5hbWUsIGRlX2ItPm5hbWUsIGFfbGVuKTsKK30KKworLyoKKyAqIFRoaXMgaXMgc3BlY2lhbCBzb3J0IGZ1bmN0aW9uIHRoYXQgbWFrZXMgc3VyZSB0aGF0IGRpcmVjdG9yeSBibG9ja3MKKyAqIHdpdGggYSBkaXJibG9jayBvZiB6ZXJvIGFyZSBzb3J0ZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4KKyAqIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSByb290IG5vZGUgb2YgdGhlIGh0cmVlIGRpcmVjdG9yaWVzIGFyZQorICogcHJvY2Vzc2VkIGZpcnN0LCBzbyB3ZSBrbm93IHdoYXQgaGFzaCB2ZXJzaW9uIHRvIHVzZS4KKyAqLworc3RhdGljIGludCBzcGVjaWFsX2Rpcl9ibG9ja19jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGJfYSA9CisJCShjb25zdCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqKSBhOworCWNvbnN0IHN0cnVjdCBleHQyX2RiX2VudHJ5ICpkYl9iID0KKwkJKGNvbnN0IHN0cnVjdCBleHQyX2RiX2VudHJ5ICopIGI7CisKKwlpZiAoZGJfYS0+YmxvY2tjbnQgJiYgIWRiX2ItPmJsb2NrY250KQorCQlyZXR1cm4gMTsKKworCWlmICghZGJfYS0+YmxvY2tjbnQgJiYgZGJfYi0+YmxvY2tjbnQpCisJCXJldHVybiAtMTsKKworCWlmIChkYl9hLT5ibGsgIT0gZGJfYi0+YmxrKQorCQlyZXR1cm4gKGludCkgKGRiX2EtPmJsayAtIGRiX2ItPmJsayk7CisKKwlpZiAoZGJfYS0+aW5vICE9IGRiX2ItPmlubykKKwkJcmV0dXJuIChpbnQpIChkYl9hLT5pbm8gLSBkYl9iLT5pbm8pOworCisJcmV0dXJuIChpbnQpIChkYl9hLT5ibG9ja2NudCAtIGRiX2ItPmJsb2NrY250KTsKK30KKworCisvKgorICogTWFrZSBzdXJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5IGlzICcuJywgYW5kIHRoYXQgdGhlCisgKiBkaXJlY3RvcnkgZW50cnkgaXMgc2FuZS4KKyAqLworc3RhdGljIGludCBjaGVja19kb3QoZTJmc2NrX3QgY3R4LAorCQkgICAgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkgICAgIGV4dDJfaW5vX3QgaW5vLCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqbmV4dGRpcjsKKwlpbnQgICAgIHN0YXR1cyA9IDA7CisJaW50ICAgICBjcmVhdGVkID0gMDsKKwlpbnQgICAgIG5ld19sZW47CisJaW50ICAgICBwcm9ibGVtID0gMDsKKworCWlmICghZGlyZW50LT5pbm9kZSkKKwkJcHJvYmxlbSA9IFBSXzJfTUlTU0lOR19ET1Q7CisJZWxzZSBpZiAoKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikgIT0gMSkgfHwKKwkJIChkaXJlbnQtPm5hbWVbMF0gIT0gJy4nKSkKKwkJcHJvYmxlbSA9IFBSXzJfMVNUX05PVF9ET1Q7CisJZWxzZSBpZiAoZGlyZW50LT5uYW1lWzFdICE9ICdcMCcpCisJCXByb2JsZW0gPSBQUl8yX0RPVF9OVUxMX1RFUk07CisKKwlpZiAocHJvYmxlbSkgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBwcm9ibGVtLCBwY3R4KSkgeworCQkJaWYgKGRpcmVudC0+cmVjX2xlbiA8IDEyKQorCQkJCWRpcmVudC0+cmVjX2xlbiA9IDEyOworCQkJZGlyZW50LT5pbm9kZSA9IGlubzsKKwkJCWRpcmVudC0+bmFtZV9sZW4gPSAxOworCQkJZGlyZW50LT5uYW1lWzBdID0gJy4nOworCQkJZGlyZW50LT5uYW1lWzFdID0gJ1wwJzsKKwkJCXN0YXR1cyA9IDE7CisJCQljcmVhdGVkID0gMTsKKwkJfQorCX0KKwlpZiAoZGlyZW50LT5pbm9kZSAhPSBpbm8pIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9CQURfSU5PREVfRE9ULCBwY3R4KSkgeworCQkJZGlyZW50LT5pbm9kZSA9IGlubzsKKwkJCXN0YXR1cyA9IDE7CisJCX0KKwl9CisJaWYgKGRpcmVudC0+cmVjX2xlbiA+IDEyKSB7CisJCW5ld19sZW4gPSBkaXJlbnQtPnJlY19sZW4gLSAxMjsKKwkJaWYgKG5ld19sZW4gPiAxMikgeworCQkJaWYgKGNyZWF0ZWQgfHwKKwkJCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzJfU1BMSVRfRE9ULCBwY3R4KSkgeworCQkJCW5leHRkaXIgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopCisJCQkJCSgoY2hhciAqKSBkaXJlbnQgKyAxMik7CisJCQkJZGlyZW50LT5yZWNfbGVuID0gMTI7CisJCQkJbmV4dGRpci0+cmVjX2xlbiA9IG5ld19sZW47CisJCQkJbmV4dGRpci0+aW5vZGUgPSAwOworCQkJCW5leHRkaXItPm5hbWVfbGVuID0gMDsKKwkJCQlzdGF0dXMgPSAxOworCQkJfQorCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgdGhlIHNlY29uZCBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5IGlzICcuLicsIGFuZCB0aGF0IHRoZQorICogZGlyZWN0b3J5IGVudHJ5IGlzIHNhbmUuICBXZSBkbyBub3QgY2hlY2sgdGhlIGlub2RlIG51bWJlciBvZiAnLi4nCisgKiBoZXJlOyB0aGlzIGdldHMgZG9uZSBpbiBwYXNzIDMuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZG90ZG90KGUyZnNja190IGN0eCwKKwkJCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkJc3RydWN0IGRpcl9pbmZvICpkaXIsIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpCit7CisJaW50ICAgICAgICAgICAgIHByb2JsZW0gPSAwOworCisJaWYgKCFkaXJlbnQtPmlub2RlKQorCQlwcm9ibGVtID0gUFJfMl9NSVNTSU5HX0RPVF9ET1Q7CisJZWxzZSBpZiAoKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikgIT0gMikgfHwKKwkJIChkaXJlbnQtPm5hbWVbMF0gIT0gJy4nKSB8fAorCQkgKGRpcmVudC0+bmFtZVsxXSAhPSAnLicpKQorCQlwcm9ibGVtID0gUFJfMl8yTkRfTk9UX0RPVF9ET1Q7CisJZWxzZSBpZiAoZGlyZW50LT5uYW1lWzJdICE9ICdcMCcpCisJCXByb2JsZW0gPSBQUl8yX0RPVF9ET1RfTlVMTF9URVJNOworCisJaWYgKHByb2JsZW0pIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgcHJvYmxlbSwgcGN0eCkpIHsKKwkJCWlmIChkaXJlbnQtPnJlY19sZW4gPCAxMikKKwkJCQlkaXJlbnQtPnJlY19sZW4gPSAxMjsKKwkJCS8qCisJCQkgKiBOb3RlOiB3ZSBkb24ndCBoYXZlIHRoZSBwYXJlbnQgaW5vZGUganVzdAorCQkJICogeWV0LCBzbyB3ZSB3aWxsIGZpbGwgaXQgaW4gd2l0aCB0aGUgcm9vdAorCQkJICogaW5vZGUuICBUaGlzIHdpbGwgZ2V0IGZpeGVkIGluIHBhc3MgMy4KKwkJCSAqLworCQkJZGlyZW50LT5pbm9kZSA9IEVYVDJfUk9PVF9JTk87CisJCQlkaXJlbnQtPm5hbWVfbGVuID0gMjsKKwkJCWRpcmVudC0+bmFtZVswXSA9ICcuJzsKKwkJCWRpcmVudC0+bmFtZVsxXSA9ICcuJzsKKwkJCWRpcmVudC0+bmFtZVsyXSA9ICdcMCc7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJZGlyLT5kb3Rkb3QgPSBkaXJlbnQtPmlub2RlOworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgdG8gbWFrZSBzdXJlIGEgZGlyZWN0b3J5IGVudHJ5IGRvZXNuJ3QgY29udGFpbiBhbnkgaWxsZWdhbAorICogY2hhcmFjdGVycy4KKyAqLworc3RhdGljIGludCBjaGVja19uYW1lKGUyZnNja190IGN0eCwKKwkJICAgICAgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCSAgICAgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpCit7CisJaW50ICAgICBpOworCWludCAgICAgZml4dXAgPSAtMTsKKwlpbnQgICAgIHJldCA9IDA7CisKKwlmb3IgKCBpID0gMDsgaSA8IChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRik7IGkrKykgeworCQlpZiAoZGlyZW50LT5uYW1lW2ldID09ICcvJyB8fCBkaXJlbnQtPm5hbWVbaV0gPT0gJ1wwJykgeworCQkJaWYgKGZpeHVwIDwgMCkgeworCQkJCWZpeHVwID0gZml4X3Byb2JsZW0oY3R4LCBQUl8yX0JBRF9OQU1FLCBwY3R4KTsKKwkJCX0KKwkJCWlmIChmaXh1cCkgeworCQkJCWRpcmVudC0+bmFtZVtpXSA9ICcuJzsKKwkJCQlyZXQgPSAxOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgZGlyZWN0b3J5IGZpbGV0eXBlIChpZiBwcmVzZW50KQorICovCisKKy8qCisgKiBHaXZlbiBhIG1vZGUsIHJldHVybiB0aGUgZXh0MiBmaWxlIHR5cGUKKyAqLworc3RhdGljIGludCBleHQyX2ZpbGVfdHlwZSh1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlpZiAoTElOVVhfU19JU1JFRyhtb2RlKSkKKwkJcmV0dXJuIEVYVDJfRlRfUkVHX0ZJTEU7CisKKwlpZiAoTElOVVhfU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuIEVYVDJfRlRfRElSOworCisJaWYgKExJTlVYX1NfSVNDSFIobW9kZSkpCisJCXJldHVybiBFWFQyX0ZUX0NIUkRFVjsKKworCWlmIChMSU5VWF9TX0lTQkxLKG1vZGUpKQorCQlyZXR1cm4gRVhUMl9GVF9CTEtERVY7CisKKwlpZiAoTElOVVhfU19JU0xOSyhtb2RlKSkKKwkJcmV0dXJuIEVYVDJfRlRfU1lNTElOSzsKKworCWlmIChMSU5VWF9TX0lTRklGTyhtb2RlKSkKKwkJcmV0dXJuIEVYVDJfRlRfRklGTzsKKworCWlmIChMSU5VWF9TX0lTU09DSyhtb2RlKSkKKwkJcmV0dXJuIEVYVDJfRlRfU09DSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2ZpbGV0eXBlKGUyZnNja190IGN0eCwKKwkJCQkgICBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCQkgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCWludCAgICAgZmlsZXR5cGUgPSBkaXJlbnQtPm5hbWVfbGVuID4+IDg7CisJaW50ICAgICBzaG91bGRfYmUgPSBFWFQyX0ZUX1VOS05PV047CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisKKwlpZiAoIShjdHgtPmZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkgICAgICBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpKSB7CisJCWlmIChmaWxldHlwZSA9PSAwIHx8CisJCSAgICAhZml4X3Byb2JsZW0oY3R4LCBQUl8yX0NMRUFSX0ZJTEVUWVBFLCBwY3R4KSkKKwkJCXJldHVybiAwOworCQlkaXJlbnQtPm5hbWVfbGVuID0gZGlyZW50LT5uYW1lX2xlbiAmIDB4RkY7CisJCXJldHVybiAxOworCX0KKworCWlmIChleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwLCBkaXJlbnQtPmlub2RlKSkgeworCQlzaG91bGRfYmUgPSBFWFQyX0ZUX0RJUjsKKwl9IGVsc2UgaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3JlZ19tYXAsCisJCQkJCSAgICBkaXJlbnQtPmlub2RlKSkgeworCQlzaG91bGRfYmUgPSBFWFQyX0ZUX1JFR19GSUxFOworCX0gZWxzZSBpZiAoY3R4LT5pbm9kZV9iYWRfbWFwICYmCisJCSAgIGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2JhZF9tYXAsCisJCQkJCSAgICBkaXJlbnQtPmlub2RlKSkKKwkJc2hvdWxkX2JlID0gMDsKKwllbHNlIHsKKwkJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBkaXJlbnQtPmlub2RlLCAmaW5vZGUsCisJCQkJICAiY2hlY2tfZmlsZXR5cGUiKTsKKwkJc2hvdWxkX2JlID0gZXh0Ml9maWxlX3R5cGUoaW5vZGUuaV9tb2RlKTsKKwl9CisJaWYgKGZpbGV0eXBlID09IHNob3VsZF9iZSkKKwkJcmV0dXJuIDA7CisJcGN0eC0+bnVtID0gc2hvdWxkX2JlOworCisJaWYgKGZpeF9wcm9ibGVtKGN0eCwgZmlsZXR5cGUgPyBQUl8yX0JBRF9GSUxFVFlQRSA6IFBSXzJfU0VUX0ZJTEVUWVBFLAorCQkJcGN0eCkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlkaXJlbnQtPm5hbWVfbGVuID0gKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSB8IHNob3VsZF9iZSA8PCA4OworCXJldHVybiAxOworfQorCisjaWZkZWYgRU5BQkxFX0hUUkVFCitzdGF0aWMgdm9pZCBwYXJzZV9pbnRfbm9kZShleHQyX2ZpbHN5cyBmcywKKwkJCSAgIHN0cnVjdCBleHQyX2RiX2VudHJ5ICpkYiwKKwkJCSAgIHN0cnVjdCBjaGVja19kaXJfc3RydWN0ICpjZCwKKwkJCSAgIHN0cnVjdCBkeF9kaXJfaW5mbyAgICpkeF9kaXIsCisJCQkgICBjaGFyICpibG9ja19idWYpCit7CisJc3RydWN0ICAgICAgICAgIGV4dDJfZHhfcm9vdF9pbmZvICAqcm9vdDsKKwlzdHJ1Y3QgICAgICAgICAgZXh0Ml9keF9lbnRyeSAqZW50OworCXN0cnVjdCAgICAgICAgICBleHQyX2R4X2NvdW50bGltaXQgKmxpbWl0OworCXN0cnVjdCBkeF9kaXJibG9ja19pbmZvICpkeF9kYjsKKwlpbnQgICAgICAgICAgICAgaSwgZXhwZWN0X2xpbWl0LCBjb3VudDsKKwlibGtfdCAgICAgICAgICAgYmxrOworCWV4dDJfZGlyaGFzaF90ICBtaW5faGFzaCA9IDB4ZmZmZmZmZmY7CisJZXh0Ml9kaXJoYXNoX3QgIG1heF9oYXNoID0gMDsKKwlleHQyX2Rpcmhhc2hfdCAgaGFzaCA9IDAsIHByZXZfaGFzaDsKKworCWlmIChkYi0+YmxvY2tjbnQgPT0gMCkgeworCQlyb290ID0gKHN0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyAqKSAoYmxvY2tfYnVmICsgMjQpOworCQllbnQgPSAoc3RydWN0IGV4dDJfZHhfZW50cnkgKikgKGJsb2NrX2J1ZiArIDI0ICsgcm9vdC0+aW5mb19sZW5ndGgpOworCX0gZWxzZSB7CisJCWVudCA9IChzdHJ1Y3QgZXh0Ml9keF9lbnRyeSAqKSAoYmxvY2tfYnVmKzgpOworCX0KKwlsaW1pdCA9IChzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0ICopIGVudDsKKworCWNvdW50ID0gZXh0MmZzX2xlMTZfdG9fY3B1KGxpbWl0LT5jb3VudCk7CisJZXhwZWN0X2xpbWl0ID0gKGZzLT5ibG9ja3NpemUgLSAoKGNoYXIgKikgZW50IC0gYmxvY2tfYnVmKSkgLworCQlzaXplb2Yoc3RydWN0IGV4dDJfZHhfZW50cnkpOworCWlmIChleHQyZnNfbGUxNl90b19jcHUobGltaXQtPmxpbWl0KSAhPSBleHBlY3RfbGltaXQpIHsKKwkJY2QtPnBjdHgubnVtID0gZXh0MmZzX2xlMTZfdG9fY3B1KGxpbWl0LT5saW1pdCk7CisJCWlmIChmaXhfcHJvYmxlbShjZC0+Y3R4LCBQUl8yX0hUUkVFX0JBRF9MSU1JVCwgJmNkLT5wY3R4KSkKKwkJCWdvdG8gY2xlYXJfYW5kX2V4aXQ7CisJfQorCWlmIChjb3VudCA+IGV4cGVjdF9saW1pdCkgeworCQljZC0+cGN0eC5udW0gPSBjb3VudDsKKwkJaWYgKGZpeF9wcm9ibGVtKGNkLT5jdHgsIFBSXzJfSFRSRUVfQkFEX0NPVU5ULCAmY2QtPnBjdHgpKQorCQkJZ290byBjbGVhcl9hbmRfZXhpdDsKKwkJY291bnQgPSBleHBlY3RfbGltaXQ7CisJfQorCisJZm9yIChpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXByZXZfaGFzaCA9IGhhc2g7CisJCWhhc2ggPSBpID8gKGV4dDJmc19sZTMyX3RvX2NwdShlbnRbaV0uaGFzaCkgJiB+MSkgOiAwOworCQlibGsgPSBleHQyZnNfbGUzMl90b19jcHUoZW50W2ldLmJsb2NrKSAmIDB4MGZmZmZmZjsKKwkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBibG9jayBpcyB2YWxpZCAqLworCQlpZiAoYmxrID4gKGJsa190KSBkeF9kaXItPm51bWJsb2NrcykgeworCQkJY2QtPnBjdHguYmxrID0gYmxrOworCQkJaWYgKGZpeF9wcm9ibGVtKGNkLT5jdHgsIFBSXzJfSFRSRUVfQkFEQkxLLAorCQkJCQkmY2QtPnBjdHgpKQorCQkJCWdvdG8gY2xlYXJfYW5kX2V4aXQ7CisJCX0KKwkJaWYgKGhhc2ggPCBwcmV2X2hhc2ggJiYKKwkJICAgIGZpeF9wcm9ibGVtKGNkLT5jdHgsIFBSXzJfSFRSRUVfSEFTSF9PUkRFUiwgJmNkLT5wY3R4KSkKKwkJCWdvdG8gY2xlYXJfYW5kX2V4aXQ7CisJCWR4X2RiID0gJmR4X2Rpci0+ZHhfYmxvY2tbYmxrXTsKKwkJaWYgKGR4X2RiLT5mbGFncyAmIERYX0ZMQUdfUkVGRVJFTkNFRCkgeworCQkJZHhfZGItPmZsYWdzIHw9IERYX0ZMQUdfRFVQX1JFRjsKKwkJfSBlbHNlIHsKKwkJCWR4X2RiLT5mbGFncyB8PSBEWF9GTEFHX1JFRkVSRU5DRUQ7CisJCQlkeF9kYi0+cGFyZW50ID0gZGItPmJsb2NrY250OworCQl9CisJCWlmIChoYXNoIDwgbWluX2hhc2gpCisJCQltaW5faGFzaCA9IGhhc2g7CisJCWlmIChoYXNoID4gbWF4X2hhc2gpCisJCQltYXhfaGFzaCA9IGhhc2g7CisJCWR4X2RiLT5ub2RlX21pbl9oYXNoID0gaGFzaDsKKwkJaWYgKChpKzEpIDwgY291bnQpCisJCQlkeF9kYi0+bm9kZV9tYXhfaGFzaCA9CisJCQkgIGV4dDJmc19sZTMyX3RvX2NwdShlbnRbaSsxXS5oYXNoKSAmIH4xOworCQllbHNlIHsKKwkJCWR4X2RiLT5ub2RlX21heF9oYXNoID0gMHhmZmZmZmZmZTsKKwkJCWR4X2RiLT5mbGFncyB8PSBEWF9GTEFHX0xBU1Q7CisJCX0KKwkJaWYgKGkgPT0gMCkKKwkJCWR4X2RiLT5mbGFncyB8PSBEWF9GTEFHX0ZJUlNUOworCX0KKwlkeF9kYiA9ICZkeF9kaXItPmR4X2Jsb2NrW2RiLT5ibG9ja2NudF07CisJZHhfZGItPm1pbl9oYXNoID0gbWluX2hhc2g7CisJZHhfZGItPm1heF9oYXNoID0gbWF4X2hhc2g7CisJcmV0dXJuOworCitjbGVhcl9hbmRfZXhpdDoKKwljbGVhcl9odHJlZShjZC0+Y3R4LCBjZC0+cGN0eC5pbm8pOworCWR4X2Rpci0+bnVtYmxvY2tzID0gMDsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSFRSRUUgKi8KKworLyoKKyAqIEdpdmVuIGEgYnVzdGVkIGRpcmVjdG9yeSwgdHJ5IHRvIHNhbHZhZ2UgaXQgc29tZWhvdy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNhbHZhZ2VfZGlyZWN0b3J5KGV4dDJfZmlsc3lzIGZzLAorCQkJICAgICAgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKnByZXYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKm9mZnNldCkKK3sKKwljaGFyICAgICpjcCA9IChjaGFyICopIGRpcmVudDsKKwlpbnQgbGVmdCA9IGZzLT5ibG9ja3NpemUgLSAqb2Zmc2V0IC0gZGlyZW50LT5yZWNfbGVuOworCWludCBuYW1lX2xlbiA9IGRpcmVudC0+bmFtZV9sZW4gJiAweEZGOworCisJLyoKKwkgKiBTcGVjaWFsIGNhc2Ugb2YgZGlyZWN0b3J5IGVudHJ5IG9mIHNpemUgODogY29weSB3aGF0J3MgbGVmdAorCSAqIG9mIHRoZSBkaXJlY3RvcnkgYmxvY2sgdXAgdG8gY292ZXIgdXAgdGhlIGludmFsaWQgaG9sZS4KKwkgKi8KKwlpZiAoKGxlZnQgPj0gMTIpICYmIChkaXJlbnQtPnJlY19sZW4gPT0gOCkpIHsKKwkJbWVtbW92ZShjcCwgY3ArOCwgbGVmdCk7CisJCW1lbXNldChjcCArIGxlZnQsIDAsIDgpOworCQlyZXR1cm47CisJfQorCS8qCisJICogSWYgdGhlIGRpcmVjdG9yeSBlbnRyeSBvdmVycnVucyB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnkKKwkgKiBibG9jaywgYW5kIHRoZSBuYW1lIGlzIHNtYWxsIGVub3VnaCB0byBmaXQsIHRoZW4gYWRqdXN0IHRoZQorCSAqIHJlY29yZCBsZW5ndGguCisJICovCisJaWYgKChsZWZ0IDwgMCkgJiYKKwkgICAgKG5hbWVfbGVuICsgOCA8PSBkaXJlbnQtPnJlY19sZW4gKyBsZWZ0KSAmJgorCSAgICBkaXJlbnQtPmlub2RlIDw9IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQgJiYKKwkgICAgc3RybmxlbihkaXJlbnQtPm5hbWUsIG5hbWVfbGVuKSA9PSBuYW1lX2xlbikgeworCQlkaXJlbnQtPnJlY19sZW4gKz0gbGVmdDsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIElmIHRoZSBkaXJlY3RvcnkgZW50cnkgaXMgYSBtdWx0aXBsZSBvZiBmb3VyLCBzbyBpdCBpcworCSAqIHZhbGlkLCBsZXQgdGhlIHByZXZpb3VzIGRpcmVjdG9yeSBlbnRyeSBhYnNvcmIgdGhlIGludmFsaWQKKwkgKiBvbmUuCisJICovCisJaWYgKHByZXYgJiYgZGlyZW50LT5yZWNfbGVuICYmIChkaXJlbnQtPnJlY19sZW4gJSA0KSA9PSAwKSB7CisJCXByZXYtPnJlY19sZW4gKz0gZGlyZW50LT5yZWNfbGVuOworCQkqb2Zmc2V0ICs9IGRpcmVudC0+cmVjX2xlbjsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIERlZmF1bHQgc2FsdmFnZSBtZXRob2QgLS0tIGtpbGwgYWxsIG9mIHRoZSBkaXJlY3RvcnkKKwkgKiBlbnRyaWVzIGZvciB0aGUgcmVzdCBvZiB0aGUgYmxvY2suICBXZSB3aWxsIGVpdGhlciB0cnkgdG8KKwkgKiBhYnNvcmIgaXQgaW50byB0aGUgcHJldmlvdXMgZGlyZWN0b3J5IGVudHJ5LCBvciBjcmVhdGUgYQorCSAqIG5ldyBlbXB0eSBkaXJlY3RvcnkgZW50cnkgdGhlIHJlc3Qgb2YgdGhlIGRpcmVjdG9yeSBibG9jay4KKwkgKi8KKwlpZiAocHJldikgeworCQlwcmV2LT5yZWNfbGVuICs9IGZzLT5ibG9ja3NpemUgLSAqb2Zmc2V0OworCQkqb2Zmc2V0ID0gZnMtPmJsb2Nrc2l6ZTsKKwl9IGVsc2UgeworCQlkaXJlbnQtPnJlY19sZW4gPSBmcy0+YmxvY2tzaXplIC0gKm9mZnNldDsKKwkJZGlyZW50LT5uYW1lX2xlbiA9IDA7CisJCWRpcmVudC0+aW5vZGUgPSAwOworCX0KK30KKworc3RhdGljIGludCBjaGVja19kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCQkgICBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGIsCisJCQkgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IGRpcl9pbmZvICAgICAgICAgKnN1YmRpciwgKmRpcjsKKwlzdHJ1Y3QgZHhfZGlyX2luZm8gICAgICAqZHhfZGlyOworI2lmZGVmIEVOQUJMRV9IVFJFRQorCXN0cnVjdCBkeF9kaXJibG9ja19pbmZvICpkeF9kYiA9IE5VTEw7CisjZW5kaWYgLyogRU5BQkxFX0hUUkVFICovCisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICAgKmRpcmVudCwgKnByZXY7CisJZXh0Ml9kaXJoYXNoX3QgICAgICAgICAgaGFzaDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvZmZzZXQgPSAwOworCWludCAgICAgICAgICAgICAgICAgICAgIGRpcl9tb2RpZmllZCA9IDA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgZG90X3N0YXRlOworCWJsa190ICAgICAgICAgICAgICAgICAgIGJsb2NrX25yID0gZGItPmJsazsKKwlleHQyX2lub190ICAgICAgICAgICAgICBpbm8gPSBkYi0+aW5vOworCV9fdTE2ICAgICAgICAgICAgICAgICAgIGxpbmtzOworCXN0cnVjdCBjaGVja19kaXJfc3RydWN0ICpjZDsKKwljaGFyICAgICAgICAgICAgICAgICAgICAqYnVmOworCWUyZnNja190ICAgICAgICAgICAgICAgIGN0eDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtOworCXN0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyAqcm9vdDsKKwlzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0ICpsaW1pdDsKKwlzdGF0aWMgZGljdF90IGRlX2RpY3Q7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlpbnQgICAgIGR1cHNfZm91bmQgPSAwOworCisJY2QgPSAoc3RydWN0IGNoZWNrX2Rpcl9zdHJ1Y3QgKikgcHJpdl9kYXRhOworCWJ1ZiA9IGNkLT5idWY7CisJY3R4ID0gY2QtPmN0eDsKKworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCXJldHVybiBESVJFTlRfQUJPUlQ7CisKKwlpZiAoY3R4LT5wcm9ncmVzcyAmJiAoY3R4LT5wcm9ncmVzcykoY3R4LCAyLCBjZC0+Y291bnQrKywgY2QtPm1heCkpCisJCXJldHVybiBESVJFTlRfQUJPUlQ7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgaW5vZGUgaXMgc3RpbGwgaW4gdXNlIChjb3VsZCBoYXZlIGJlZW4KKwkgKiBkZWxldGVkIGluIHRoZSBkdXBsaWNhdGUvYmFkIGJsb2NrcyBwYXNzLgorCSAqLworCWlmICghKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pKSkKKwkJcmV0dXJuIDA7CisKKwljZC0+cGN0eC5pbm8gPSBpbm87CisJY2QtPnBjdHguYmxrID0gYmxvY2tfbnI7CisJY2QtPnBjdHguYmxrY291bnQgPSBkYi0+YmxvY2tjbnQ7CisJY2QtPnBjdHguaW5vMiA9IDA7CisJY2QtPnBjdHguZGlyZW50ID0gMDsKKwljZC0+cGN0eC5udW0gPSAwOworCisJaWYgKGRiLT5ibGsgPT0gMCkgeworCQlpZiAoYWxsb2NhdGVfZGlyX2Jsb2NrKGN0eCwgZGIsICZjZC0+cGN0eCkpCisJCQlyZXR1cm4gMDsKKwkJYmxvY2tfbnIgPSBkYi0+YmxrOworCX0KKworCWlmIChkYi0+YmxvY2tjbnQpCisJCWRvdF9zdGF0ZSA9IDI7CisJZWxzZQorCQlkb3Rfc3RhdGUgPSAwOworCisJaWYgKGN0eC0+ZGlyc190b19oYXNoICYmCisJICAgIGV4dDJmc191MzJfbGlzdF90ZXN0KGN0eC0+ZGlyc190b19oYXNoLCBpbm8pKQorCQlkdXBzX2ZvdW5kKys7CisKKwljZC0+cGN0eC5lcnJjb2RlID0gZXh0MmZzX3JlYWRfZGlyX2Jsb2NrKGZzLCBibG9ja19uciwgYnVmKTsKKwlpZiAoY2QtPnBjdHguZXJyY29kZSA9PSBFWFQyX0VUX0RJUl9DT1JSVVBURUQpCisJCWNkLT5wY3R4LmVycmNvZGUgPSAwOyAvKiBXZSdsbCBoYW5kbGUgdGhpcyBvdXJzZWx2ZXMgKi8KKwlpZiAoY2QtPnBjdHguZXJyY29kZSkgeworCQlpZiAoIWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9SRUFEX0RJUkJMT0NLLCAmY2QtPnBjdHgpKSB7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJcmV0dXJuIERJUkVOVF9BQk9SVDsKKwkJfQorCQltZW1zZXQoYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKwl9CisjaWZkZWYgRU5BQkxFX0hUUkVFCisJZHhfZGlyID0gZTJmc2NrX2dldF9keF9kaXJfaW5mbyhjdHgsIGlubyk7CisJaWYgKGR4X2RpciAmJiBkeF9kaXItPm51bWJsb2NrcykgeworCQlpZiAoZGItPmJsb2NrY250ID49IGR4X2Rpci0+bnVtYmxvY2tzKSB7CisJCQlwcmludGYoIlhYWCBzaG91bGQgbmV2ZXIgaGFwcGVuISEhXG4iKTsKKwkJCWFib3J0KCk7CisJCX0KKwkJZHhfZGIgPSAmZHhfZGlyLT5keF9ibG9ja1tkYi0+YmxvY2tjbnRdOworCQlkeF9kYi0+dHlwZSA9IERYX0RJUkJMT0NLX0xFQUY7CisJCWR4X2RiLT5waHlzID0gYmxvY2tfbnI7CisJCWR4X2RiLT5taW5faGFzaCA9IH4wOworCQlkeF9kYi0+bWF4X2hhc2ggPSAwOworCisJCWRpcmVudCA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgYnVmOworCQlsaW1pdCA9IChzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0ICopIChidWYrOCk7CisJCWlmIChkYi0+YmxvY2tjbnQgPT0gMCkgeworCQkJcm9vdCA9IChzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8gKikgKGJ1ZiArIDI0KTsKKwkJCWR4X2RiLT50eXBlID0gRFhfRElSQkxPQ0tfUk9PVDsKKwkJCWR4X2RiLT5mbGFncyB8PSBEWF9GTEFHX0ZJUlNUIHwgRFhfRkxBR19MQVNUOworCQkJaWYgKChyb290LT5yZXNlcnZlZF96ZXJvIHx8CisJCQkgICAgIHJvb3QtPmluZm9fbGVuZ3RoIDwgOCB8fAorCQkJICAgICByb290LT5pbmRpcmVjdF9sZXZlbHMgPiAxKSAmJgorCQkJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9IVFJFRV9CQURfUk9PVCwgJmNkLT5wY3R4KSkgeworCQkJCWNsZWFyX2h0cmVlKGN0eCwgaW5vKTsKKwkJCQlkeF9kaXItPm51bWJsb2NrcyA9IDA7CisJCQkJZHhfZGIgPSAwOworCQkJfQorCQkJZHhfZGlyLT5oYXNodmVyc2lvbiA9IHJvb3QtPmhhc2hfdmVyc2lvbjsKKwkJCWR4X2Rpci0+ZGVwdGggPSByb290LT5pbmRpcmVjdF9sZXZlbHMgKyAxOworCQl9IGVsc2UgaWYgKChkaXJlbnQtPmlub2RlID09IDApICYmCisJCQkgICAoZGlyZW50LT5yZWNfbGVuID09IGZzLT5ibG9ja3NpemUpICYmCisJCQkgICAoZGlyZW50LT5uYW1lX2xlbiA9PSAwKSAmJgorCQkJICAgKGV4dDJmc19sZTE2X3RvX2NwdShsaW1pdC0+bGltaXQpID09CisJCQkgICAgKChmcy0+YmxvY2tzaXplLTgpIC8KKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBleHQyX2R4X2VudHJ5KSkpKQorCQkJZHhfZGItPnR5cGUgPSBEWF9ESVJCTE9DS19OT0RFOworCX0KKyNlbmRpZiAvKiBFTkFCTEVfSFRSRUUgKi8KKworCWRpY3RfaW5pdCgmZGVfZGljdCwgRElDVENPVU5UX1RfTUFYLCBkaWN0X2RlX2NtcCk7CisJcHJldiA9IDA7CisJZG8geworCQlwcm9ibGVtID0gMDsKKwkJZGlyZW50ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSAoYnVmICsgb2Zmc2V0KTsKKwkJY2QtPnBjdHguZGlyZW50ID0gZGlyZW50OworCQljZC0+cGN0eC5udW0gPSBvZmZzZXQ7CisJCWlmICgoKG9mZnNldCArIGRpcmVudC0+cmVjX2xlbikgPiBmcy0+YmxvY2tzaXplKSB8fAorCQkgICAgKGRpcmVudC0+cmVjX2xlbiA8IDEyKSB8fAorCQkgICAgKChkaXJlbnQtPnJlY19sZW4gJSA0KSAhPSAwKSB8fAorCQkgICAgKCgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpKzgpID4gZGlyZW50LT5yZWNfbGVuKSkgeworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9ESVJfQ09SUlVQVEVELCAmY2QtPnBjdHgpKSB7CisJCQkJc2FsdmFnZV9kaXJlY3RvcnkoZnMsIGRpcmVudCwgcHJldiwgJm9mZnNldCk7CisJCQkJZGlyX21vZGlmaWVkKys7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UKKwkJCQlnb3RvIGFib3J0X2ZyZWVfZGljdDsKKwkJfQorCQlpZiAoKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSA+IEVYVDJfTkFNRV9MRU4pIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfRklMRU5BTUVfTE9ORywgJmNkLT5wY3R4KSkgeworCQkJCWRpcmVudC0+bmFtZV9sZW4gPSBFWFQyX05BTUVfTEVOOworCQkJCWRpcl9tb2RpZmllZCsrOworCQkJfQorCQl9CisKKwkJaWYgKGRvdF9zdGF0ZSA9PSAwKSB7CisJCQlpZiAoY2hlY2tfZG90KGN0eCwgZGlyZW50LCBpbm8sICZjZC0+cGN0eCkpCisJCQkJZGlyX21vZGlmaWVkKys7CisJCX0gZWxzZSBpZiAoZG90X3N0YXRlID09IDEpIHsKKwkJCWRpciA9IGUyZnNja19nZXRfZGlyX2luZm8oY3R4LCBpbm8pOworCQkJaWYgKCFkaXIpIHsKKwkJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzJfTk9fRElSSU5GTywgJmNkLT5wY3R4KTsKKwkJCQlnb3RvIGFib3J0X2ZyZWVfZGljdDsKKwkJCX0KKwkJCWlmIChjaGVja19kb3Rkb3QoY3R4LCBkaXJlbnQsIGRpciwgJmNkLT5wY3R4KSkKKwkJCQlkaXJfbW9kaWZpZWQrKzsKKwkJfSBlbHNlIGlmIChkaXJlbnQtPmlub2RlID09IGlubykgeworCQkJcHJvYmxlbSA9IFBSXzJfTElOS19ET1Q7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8yX0xJTktfRE9ULCAmY2QtPnBjdHgpKSB7CisJCQkJZGlyZW50LT5pbm9kZSA9IDA7CisJCQkJZGlyX21vZGlmaWVkKys7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCWlmICghZGlyZW50LT5pbm9kZSkKKwkJCWdvdG8gbmV4dDsKKworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIGlub2RlIGxpc3RlZCBpcyBhIGxlZ2FsIG9uZS4KKwkJICovCisJCWlmICgoKGRpcmVudC0+aW5vZGUgIT0gRVhUMl9ST09UX0lOTykgJiYKKwkJICAgICAoZGlyZW50LT5pbm9kZSA8IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKSkpIHx8CisJCSAgICAoZGlyZW50LT5pbm9kZSA+IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpKSB7CisJCQlwcm9ibGVtID0gUFJfMl9CQURfSU5POworCQl9IGVsc2UgaWYgKCEoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsCisJCQkJCSAgICAgICBkaXJlbnQtPmlub2RlKSkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgaW5vZGUgaXMgdW51c2VkLCBvZmZlciB0byBjbGVhciBpdC4KKwkJCSAqLworCQkJcHJvYmxlbSA9IFBSXzJfVU5VU0VEX0lOT0RFOworCQl9IGVsc2UgaWYgKChkb3Rfc3RhdGUgPiAxKSAmJgorCQkJICAgKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikgPT0gMSkgJiYKKwkJCSAgIChkaXJlbnQtPm5hbWVbMF0gPT0gJy4nKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZXJlJ3MgYSAnLicgZW50cnkgaW4gYW55dGhpbmcgb3RoZXIKKwkJCSAqIHRoYW4gdGhlIGZpcnN0IGRpcmVjdG9yeSBlbnRyeSwgaXQncyBhCisJCQkgKiBkdXBsaWNhdGUgZW50cnkgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4KKwkJCSAqLworCQkJcHJvYmxlbSA9IFBSXzJfRFVQX0RPVDsKKwkJfSBlbHNlIGlmICgoZG90X3N0YXRlID4gMSkgJiYKKwkJCSAgICgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpID09IDIpICYmCisJCQkgICAoZGlyZW50LT5uYW1lWzBdID09ICcuJykgJiYKKwkJCSAgIChkaXJlbnQtPm5hbWVbMV0gPT0gJy4nKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZXJlJ3MgYSAnLi4nIGVudHJ5IGluIGFueXRoaW5nIG90aGVyCisJCQkgKiB0aGFuIHRoZSBzZWNvbmQgZGlyZWN0b3J5IGVudHJ5LCBpdCdzIGEKKwkJCSAqIGR1cGxpY2F0ZSBlbnRyeSB0aGF0IHNob3VsZCBiZSByZW1vdmVkLgorCQkJICovCisJCQlwcm9ibGVtID0gUFJfMl9EVVBfRE9UX0RPVDsKKwkJfSBlbHNlIGlmICgoZG90X3N0YXRlID4gMSkgJiYKKwkJCSAgIChkaXJlbnQtPmlub2RlID09IEVYVDJfUk9PVF9JTk8pKSB7CisJCQkvKgorCQkJICogRG9uJ3QgYWxsb3cgbGlua3MgdG8gdGhlIHJvb3QgZGlyZWN0b3J5LgorCQkJICogV2UgY2hlY2sgdGhpcyBzcGVjaWFsbHkgdG8gbWFrZSBzdXJlIHdlCisJCQkgKiBjYXRjaCB0aGlzIGVycm9yIGNhc2UgZXZlbiBpZiB0aGUgcm9vdAorCQkJICogZGlyZWN0b3J5IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LgorCQkJICovCisJCQlwcm9ibGVtID0gUFJfMl9MSU5LX1JPT1Q7CisJCX0gZWxzZSBpZiAoKGRvdF9zdGF0ZSA+IDEpICYmCisJCQkgICAoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpID09IDApIHsKKwkJCS8qCisJCQkgKiBEb24ndCBhbGxvdyB6ZXJvLWxlbmd0aCBkaXJlY3RvcnkgbmFtZXMuCisJCQkgKi8KKwkJCXByb2JsZW0gPSBQUl8yX05VTExfTkFNRTsKKwkJfQorCisJCWlmIChwcm9ibGVtKSB7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBwcm9ibGVtLCAmY2QtPnBjdHgpKSB7CisJCQkJZGlyZW50LT5pbm9kZSA9IDA7CisJCQkJZGlyX21vZGlmaWVkKys7CisJCQkJZ290byBuZXh0OworCQkJfSBlbHNlIHsKKwkJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwkJCQlpZiAocHJvYmxlbSA9PSBQUl8yX0JBRF9JTk8pCisJCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBpbm9kZSB3YXMgbWFya2VkIGFzIGhhdmluZyBiYWQgZmllbGRzIGluCisJCSAqIHBhc3MxLCBwcm9jZXNzIGl0IGFuZCBvZmZlciB0byBmaXgvY2xlYXIgaXQuCisJCSAqIChXZSB3YWl0IHVudGlsIG5vdyBzbyB0aGF0IHdlIGNhbiBkaXNwbGF5IHRoZQorCQkgKiBwYXRobmFtZSB0byB0aGUgdXNlci4pCisJCSAqLworCQlpZiAoY3R4LT5pbm9kZV9iYWRfbWFwICYmCisJCSAgICBleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9iYWRfbWFwLAorCQkJCQkgICAgIGRpcmVudC0+aW5vZGUpKSB7CisJCQlpZiAoZTJmc2NrX3Byb2Nlc3NfYmFkX2lub2RlKGN0eCwgaW5vLAorCQkJCQkJICAgICBkaXJlbnQtPmlub2RlLAorCQkJCQkJICAgICBidWYgKyBmcy0+YmxvY2tzaXplKSkgeworCQkJCWRpcmVudC0+aW5vZGUgPSAwOworCQkJCWRpcl9tb2RpZmllZCsrOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCQkJcmV0dXJuIERJUkVOVF9BQk9SVDsKKwkJfQorCisJCWlmIChjaGVja19uYW1lKGN0eCwgZGlyZW50LCAmY2QtPnBjdHgpKQorCQkJZGlyX21vZGlmaWVkKys7CisKKwkJaWYgKGNoZWNrX2ZpbGV0eXBlKGN0eCwgZGlyZW50LCAmY2QtPnBjdHgpKQorCQkJZGlyX21vZGlmaWVkKys7CisKKyNpZmRlZiBFTkFCTEVfSFRSRUUKKwkJaWYgKGR4X2RiKSB7CisJCQlleHQyZnNfZGlyaGFzaChkeF9kaXItPmhhc2h2ZXJzaW9uLCBkaXJlbnQtPm5hbWUsCisJCQkJICAgICAgIChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRiksCisJCQkJICAgICAgIGZzLT5zdXBlci0+c19oYXNoX3NlZWQsICZoYXNoLCAwKTsKKwkJCWlmIChoYXNoIDwgZHhfZGItPm1pbl9oYXNoKQorCQkJCWR4X2RiLT5taW5faGFzaCA9IGhhc2g7CisJCQlpZiAoaGFzaCA+IGR4X2RiLT5tYXhfaGFzaCkKKwkJCQlkeF9kYi0+bWF4X2hhc2ggPSBoYXNoOworCQl9CisjZW5kaWYKKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIGEgZGlyZWN0b3J5LCB0aGVuIG1hcmsgaXRzIHBhcmVudCBpbiBpdHMKKwkJICogZGlyX2luZm8gc3RydWN0dXJlLiAgSWYgdGhlIHBhcmVudCBmaWVsZCBpcyBhbHJlYWR5CisJCSAqIGZpbGxlZCBpbiwgdGhlbiB0aGlzIGRpcmVjdG9yeSBoYXMgbW9yZSB0aGFuIG9uZQorCQkgKiBoYXJkIGxpbmsuICBXZSBhc3N1bWUgdGhlIGZpcnN0IGxpbmsgaXMgY29ycmVjdCwKKwkJICogYW5kIGFzayB0aGUgdXNlciBpZiBoZS9zaGUgd2FudHMgdG8gY2xlYXIgdGhpcyBvbmUuCisJCSAqLworCQlpZiAoKGRvdF9zdGF0ZSA+IDEpICYmCisJCSAgICAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwKKwkJCQkJICAgICAgZGlyZW50LT5pbm9kZSkpKSB7CisJCQlzdWJkaXIgPSBlMmZzY2tfZ2V0X2Rpcl9pbmZvKGN0eCwgZGlyZW50LT5pbm9kZSk7CisJCQlpZiAoIXN1YmRpcikgeworCQkJCWNkLT5wY3R4LmlubyA9IGRpcmVudC0+aW5vZGU7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX05PX0RJUklORk8sICZjZC0+cGN0eCk7CisJCQkJZ290byBhYm9ydF9mcmVlX2RpY3Q7CisJCQl9CisJCQlpZiAoc3ViZGlyLT5wYXJlbnQpIHsKKwkJCQljZC0+cGN0eC5pbm8yID0gc3ViZGlyLT5wYXJlbnQ7CisJCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9MSU5LX0RJUiwKKwkJCQkJCSZjZC0+cGN0eCkpIHsKKwkJCQkJZGlyZW50LT5pbm9kZSA9IDA7CisJCQkJCWRpcl9tb2RpZmllZCsrOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJCWNkLT5wY3R4LmlubzIgPSAwOworCQkJfSBlbHNlCisJCQkJc3ViZGlyLT5wYXJlbnQgPSBpbm87CisJCX0KKworCQlpZiAoZHVwc19mb3VuZCkgeworCQkJOworCQl9IGVsc2UgaWYgKGRpY3RfbG9va3VwKCZkZV9kaWN0LCBkaXJlbnQpKSB7CisJCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQkJcGN0eC5pbm8gPSBpbm87CisJCQlwY3R4LmRpcmVudCA9IGRpcmVudDsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9SRVBPUlRfRFVQX0RJUkVOVCwgJnBjdHgpOworCQkJaWYgKCFjdHgtPmRpcnNfdG9faGFzaCkKKwkJCQlleHQyZnNfdTMyX2xpc3RfY3JlYXRlKCZjdHgtPmRpcnNfdG9faGFzaCwgNTApOworCQkJaWYgKGN0eC0+ZGlyc190b19oYXNoKQorCQkJCWV4dDJmc191MzJfbGlzdF9hZGQoY3R4LT5kaXJzX3RvX2hhc2gsIGlubyk7CisJCQlkdXBzX2ZvdW5kKys7CisJCX0gZWxzZQorCQkJZGljdF9hbGxvY19pbnNlcnQoJmRlX2RpY3QsIGRpcmVudCwgZGlyZW50KTsKKworCQlleHQyZnNfaWNvdW50X2luY3JlbWVudChjdHgtPmlub2RlX2NvdW50LCBkaXJlbnQtPmlub2RlLAorCQkJCQkmbGlua3MpOworCQlpZiAobGlua3MgPiAxKQorCQkJY3R4LT5mc19saW5rc19jb3VudCsrOworCQljdHgtPmZzX3RvdGFsX2NvdW50Kys7CisJbmV4dDoKKwkJcHJldiA9IGRpcmVudDsKKwkJb2Zmc2V0ICs9IGRpcmVudC0+cmVjX2xlbjsKKwkJZG90X3N0YXRlKys7CisJfSB3aGlsZSAob2Zmc2V0IDwgZnMtPmJsb2Nrc2l6ZSk7CisjaWZkZWYgRU5BQkxFX0hUUkVFCisJaWYgKGR4X2RiKSB7CisJCWNkLT5wY3R4LmRpciA9IGNkLT5wY3R4LmlubzsKKwkJaWYgKChkeF9kYi0+dHlwZSA9PSBEWF9ESVJCTE9DS19ST09UKSB8fAorCQkgICAgKGR4X2RiLT50eXBlID09IERYX0RJUkJMT0NLX05PREUpKQorCQkJcGFyc2VfaW50X25vZGUoZnMsIGRiLCBjZCwgZHhfZGlyLCBidWYpOworCX0KKyNlbmRpZiAvKiBFTkFCTEVfSFRSRUUgKi8KKwlpZiAob2Zmc2V0ICE9IGZzLT5ibG9ja3NpemUpIHsKKwkJY2QtPnBjdHgubnVtID0gZGlyZW50LT5yZWNfbGVuIC0gZnMtPmJsb2Nrc2l6ZSArIG9mZnNldDsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9GSU5BTF9SRUNMRU4sICZjZC0+cGN0eCkpIHsKKwkJCWRpcmVudC0+cmVjX2xlbiA9IGNkLT5wY3R4Lm51bTsKKwkJCWRpcl9tb2RpZmllZCsrOworCQl9CisJfQorCWlmIChkaXJfbW9kaWZpZWQpIHsKKwkJY2QtPnBjdHguZXJyY29kZSA9IGV4dDJmc193cml0ZV9kaXJfYmxvY2soZnMsIGJsb2NrX25yLCBidWYpOworCQlpZiAoY2QtPnBjdHguZXJyY29kZSkgeworCQkJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzJfV1JJVEVfRElSQkxPQ0ssCisJCQkJCSAmY2QtPnBjdHgpKQorCQkJCWdvdG8gYWJvcnRfZnJlZV9kaWN0OworCQl9CisJCWV4dDJmc19tYXJrX2NoYW5nZWQoZnMpOworCX0KKwlkaWN0X2ZyZWVfbm9kZXMoJmRlX2RpY3QpOworCXJldHVybiAwOworYWJvcnRfZnJlZV9kaWN0OgorCWRpY3RfZnJlZV9ub2RlcygmZGVfZGljdCk7CisJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwlyZXR1cm4gRElSRU5UX0FCT1JUOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVhbGxvY2F0ZSBhIGJsb2NrLCBhbmQgaXMgYW4gaW50ZXJhdG9yCisgKiBmdW5jdGlvbmVkIGNhbGxlZCBieSBkZWFsbG9jYXRlIGlub2RlIHZpYSBleHQyZnNfaXRlcmF0ZV9ibG9jaygpLgorICovCitzdGF0aWMgaW50IGRlYWxsb2NhdGVfaW5vZGVfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190ICpibG9ja19uciwKKwkJCQkgIGUyX2Jsa2NudF90IGJsb2NrY250IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkJICBibGtfdCByZWZfYmxvY2sgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCQkgIGludCByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkJICB2b2lkICpwcml2X2RhdGEpCit7CisJZTJmc2NrX3QgICAgICAgIGN0eCA9IChlMmZzY2tfdCkgcHJpdl9kYXRhOworCisJaWYgKEhPTEVfQkxLQUREUigqYmxvY2tfbnIpKQorCQlyZXR1cm4gMDsKKwlpZiAoKCpibG9ja19uciA8IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSB8fAorCSAgICAoKmJsb2NrX25yID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpKQorCQlyZXR1cm4gMDsKKwlleHQyZnNfdW5tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgKmJsb2NrX25yKTsKKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsICpibG9ja19uciwgLTEpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdWN0aW9uIGRlYWxsb2NhdGVzIGFuIGlub2RlCisgKi8KK3N0YXRpYyB2b2lkIGRlYWxsb2NhdGVfaW5vZGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywgY2hhciogYmxvY2tfYnVmKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCV9fdTMyICAgICAgICAgICAgICAgICAgIGNvdW50OworCisJZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2xpbmtfaW5mbywgaW5vLCAwKTsKKwllMmZzY2tfcmVhZF9pbm9kZShjdHgsIGlubywgJmlub2RlLCAiZGVhbGxvY2F0ZV9pbm9kZSIpOworCWlub2RlLmlfbGlua3NfY291bnQgPSAwOworCWlub2RlLmlfZHRpbWUgPSB0aW1lKE5VTEwpOworCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgJmlub2RlLCAiZGVhbGxvY2F0ZV9pbm9kZSIpOworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJcGN0eC5pbm8gPSBpbm87CisKKwkvKgorCSAqIEZpeCB1cCB0aGUgYml0bWFwcy4uLgorCSAqLworCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKwlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOworCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgaW5vKTsKKwlpZiAoY3R4LT5pbm9kZV9iYWRfbWFwKQorCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2JhZF9tYXAsIGlubyk7CisJZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzMihmcywgaW5vLCAtMSwgTElOVVhfU19JU0RJUihpbm9kZS5pX21vZGUpKTsKKworCWlmIChpbm9kZS5pX2ZpbGVfYWNsICYmCisJICAgIChmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKSkgeworCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfYWRqdXN0X2VhX3JlZmNvdW50KGZzLCBpbm9kZS5pX2ZpbGVfYWNsLAorCQkJCQkJICAgYmxvY2tfYnVmLCAtMSwgJmNvdW50KTsKKwkJaWYgKHBjdHguZXJyY29kZSA9PSBFWFQyX0VUX0JBRF9FQV9CTE9DS19OVU0pIHsKKwkJCXBjdHguZXJyY29kZSA9IDA7CisJCQljb3VudCA9IDE7CisJCX0KKwkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJcGN0eC5ibGsgPSBpbm9kZS5pX2ZpbGVfYWNsOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX0FESl9FQV9SRUZDT1VOVCwgJnBjdHgpOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoY291bnQgPT0gMCkgeworCQkJZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsCisJCQkJCQkgICBpbm9kZS5pX2ZpbGVfYWNsKTsKKwkJCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgaW5vZGUuaV9maWxlX2FjbCwgLTEpOworCQl9CisJCWlub2RlLmlfZmlsZV9hY2wgPSAwOworCX0KKworCWlmICghZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3MoJmlub2RlKSkKKwkJcmV0dXJuOworCisJaWYgKExJTlVYX1NfSVNSRUcoaW5vZGUuaV9tb2RlKSAmJgorCSAgICAoaW5vZGUuaV9zaXplX2hpZ2ggfHwgaW5vZGUuaV9zaXplICYgMHg4MDAwMDAwMFVMKSkKKwkJY3R4LT5sYXJnZV9maWxlcy0tOworCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBpbm8sIDAsIGJsb2NrX2J1ZiwKKwkJCQkJICAgIGRlYWxsb2NhdGVfaW5vZGVfYmxvY2ssIGN0eCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzJfREVBTExPQ19JTk9ERSwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorfQorCisvKgorICogVGhpcyBmdWN0aW9uIGNsZWFycyB0aGUgaHRyZWUgZmxhZyBvbiBhbiBpbm9kZQorICovCitzdGF0aWMgdm9pZCBjbGVhcl9odHJlZShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vKQoreworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgImNsZWFyX2h0cmVlIik7CisJaW5vZGUuaV9mbGFncyA9IGlub2RlLmlfZmxhZ3MgJiB+RVhUMl9JTkRFWF9GTDsKKwllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgImNsZWFyX2h0cmVlIik7CisJaWYgKGN0eC0+ZGlyc190b19oYXNoKQorCQlleHQyZnNfdTMyX2xpc3RfYWRkKGN0eC0+ZGlyc190b19oYXNoLCBpbm8pOworfQorCisKK3N0YXRpYyBpbnQgZTJmc2NrX3Byb2Nlc3NfYmFkX2lub2RlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBkaXIsCisJCQkJICAgIGV4dDJfaW5vX3QgaW5vLCBjaGFyICpidWYpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCWludCAgICAgICAgICAgICAgICAgICAgIGlub2RlX21vZGlmaWVkID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBub3RfZml4ZWQgPSAwOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICpmcmFnLCAqZnNpemU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlpbnQgICAgIHByb2JsZW0gPSAwOworCisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgInByb2Nlc3NfYmFkX2lub2RlIik7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCXBjdHguaW5vID0gaW5vOworCXBjdHguZGlyID0gZGlyOworCXBjdHguaW5vZGUgPSAmaW5vZGU7CisKKwlpZiAoaW5vZGUuaV9maWxlX2FjbCAmJgorCSAgICAhKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpICYmCisJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9GSUxFX0FDTF9aRVJPLCAmcGN0eCkpIHsKKwkJaW5vZGUuaV9maWxlX2FjbCA9IDA7CisjaWYgQkJfQklHX0VORElBTgorCQkvKgorCQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBrbHVkZ2UgdG8gZGVhbCB3aXRoIGxvbmcgc3ltbGlua3MKKwkJICogb24gYmlnIGVuZGlhbiBzeXN0ZW1zLiAgaV9ibG9ja3MgaGFkIGFscmVhZHkgYmVlbgorCQkgKiBkZWNyZW1lbnRlZCBlYXJsaWVyIGluIHBhc3MgMSwgYnV0IHNpbmNlIGlfZmlsZV9hY2wKKwkJICogaGFkbid0IHlldCBiZWVuIGNsZWFyZWQsIGV4dDJmc19yZWFkX2lub2RlKCkKKwkJICogYXNzdW1lZCB0aGF0IHRoZSBmaWxlIHdhcyBzaG9ydCBzeW1saW5rIGFuZCB3b3VsZAorCQkgKiBub3QgaGF2ZSBieXRlIHN3YXBwZWQgaV9ibG9ja1swXS4gIEhlbmNlLCB3ZSBoYXZlCisJCSAqIHRvIGJ5dGUtc3dhcCBpdCBoZXJlLgorCQkgKi8KKwkJaWYgKExJTlVYX1NfSVNMTksoaW5vZGUuaV9tb2RlKSAmJgorCQkgICAgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSAmJgorCQkgICAgKGlub2RlLmlfYmxvY2tzID09IGZzLT5ibG9ja3NpemUgPj4gOSkpCisJCQlpbm9kZS5pX2Jsb2NrWzBdID0gZXh0MmZzX3N3YWIzMihpbm9kZS5pX2Jsb2NrWzBdKTsKKyNlbmRpZgorCQlpbm9kZV9tb2RpZmllZCsrOworCX0gZWxzZQorCQlub3RfZml4ZWQrKzsKKworCWlmICghTElOVVhfU19JU0RJUihpbm9kZS5pX21vZGUpICYmICFMSU5VWF9TX0lTUkVHKGlub2RlLmlfbW9kZSkgJiYKKwkgICAgIUxJTlVYX1NfSVNDSFIoaW5vZGUuaV9tb2RlKSAmJiAhTElOVVhfU19JU0JMSyhpbm9kZS5pX21vZGUpICYmCisJICAgICFMSU5VWF9TX0lTTE5LKGlub2RlLmlfbW9kZSkgJiYgIUxJTlVYX1NfSVNGSUZPKGlub2RlLmlfbW9kZSkgJiYKKwkgICAgIShMSU5VWF9TX0lTU09DSyhpbm9kZS5pX21vZGUpKSkKKwkJcHJvYmxlbSA9IFBSXzJfQkFEX01PREU7CisJZWxzZSBpZiAoTElOVVhfU19JU0NIUihpbm9kZS5pX21vZGUpCisJCSAmJiAhZTJmc2NrX3Bhc3MxX2NoZWNrX2RldmljZV9pbm9kZShmcywgJmlub2RlKSkKKwkJcHJvYmxlbSA9IFBSXzJfQkFEX0NIQVJfREVWOworCWVsc2UgaWYgKExJTlVYX1NfSVNCTEsoaW5vZGUuaV9tb2RlKQorCQkgJiYgIWUyZnNja19wYXNzMV9jaGVja19kZXZpY2VfaW5vZGUoZnMsICZpbm9kZSkpCisJCXByb2JsZW0gPSBQUl8yX0JBRF9CTE9DS19ERVY7CisJZWxzZSBpZiAoTElOVVhfU19JU0ZJRk8oaW5vZGUuaV9tb2RlKQorCQkgJiYgIWUyZnNja19wYXNzMV9jaGVja19kZXZpY2VfaW5vZGUoZnMsICZpbm9kZSkpCisJCXByb2JsZW0gPSBQUl8yX0JBRF9GSUZPOworCWVsc2UgaWYgKExJTlVYX1NfSVNTT0NLKGlub2RlLmlfbW9kZSkKKwkJICYmICFlMmZzY2tfcGFzczFfY2hlY2tfZGV2aWNlX2lub2RlKGZzLCAmaW5vZGUpKQorCQlwcm9ibGVtID0gUFJfMl9CQURfU09DS0VUOworCWVsc2UgaWYgKExJTlVYX1NfSVNMTksoaW5vZGUuaV9tb2RlKQorCQkgJiYgIWUyZnNja19wYXNzMV9jaGVja19zeW1saW5rKGZzLCAmaW5vZGUsIGJ1ZikpIHsKKwkJcHJvYmxlbSA9IFBSXzJfSU5WQUxJRF9TWU1MSU5LOworCX0KKworCWlmIChwcm9ibGVtKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIHByb2JsZW0sICZwY3R4KSkgeworCQkJZGVhbGxvY2F0ZV9pbm9kZShjdHgsIGlubywgMCk7CisJCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZQorCQkJbm90X2ZpeGVkKys7CisJCXByb2JsZW0gPSAwOworCX0KKworCWlmIChpbm9kZS5pX2ZhZGRyKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfRkFERFJfWkVSTywgJnBjdHgpKSB7CisJCQlpbm9kZS5pX2ZhZGRyID0gMDsKKwkJCWlub2RlX21vZGlmaWVkKys7CisJCX0gZWxzZQorCQkJbm90X2ZpeGVkKys7CisJfQorCisJc3dpdGNoIChmcy0+c3VwZXItPnNfY3JlYXRvcl9vcykgeworCSAgICBjYXNlIEVYVDJfT1NfTElOVVg6CisJCWZyYWcgPSAmaW5vZGUub3NkMi5saW51eDIubF9pX2ZyYWc7CisJCWZzaXplID0gJmlub2RlLm9zZDIubGludXgyLmxfaV9mc2l6ZTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRVhUMl9PU19IVVJEOgorCQlmcmFnID0gJmlub2RlLm9zZDIuaHVyZDIuaF9pX2ZyYWc7CisJCWZzaXplID0gJmlub2RlLm9zZDIuaHVyZDIuaF9pX2ZzaXplOworCQlicmVhazsKKwkgICAgY2FzZSBFWFQyX09TX01BU0lYOgorCQlmcmFnID0gJmlub2RlLm9zZDIubWFzaXgyLm1faV9mcmFnOworCQlmc2l6ZSA9ICZpbm9kZS5vc2QyLm1hc2l4Mi5tX2lfZnNpemU7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlmcmFnID0gZnNpemUgPSAwOworCX0KKwlpZiAoZnJhZyAmJiAqZnJhZykgeworCQlwY3R4Lm51bSA9ICpmcmFnOworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8yX0ZSQUdfWkVSTywgJnBjdHgpKSB7CisJCQkqZnJhZyA9IDA7CisJCQlpbm9kZV9tb2RpZmllZCsrOworCQl9IGVsc2UKKwkJCW5vdF9maXhlZCsrOworCQlwY3R4Lm51bSA9IDA7CisJfQorCWlmIChmc2l6ZSAmJiAqZnNpemUpIHsKKwkJcGN0eC5udW0gPSAqZnNpemU7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfRlNJWkVfWkVSTywgJnBjdHgpKSB7CisJCQkqZnNpemUgPSAwOworCQkJaW5vZGVfbW9kaWZpZWQrKzsKKwkJfSBlbHNlCisJCQlub3RfZml4ZWQrKzsKKwkJcGN0eC5udW0gPSAwOworCX0KKworCWlmIChpbm9kZS5pX2ZpbGVfYWNsICYmCisJICAgICgoaW5vZGUuaV9maWxlX2FjbCA8IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSB8fAorCSAgICAgKGlub2RlLmlfZmlsZV9hY2wgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkpKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfRklMRV9BQ0xfQkFELCAmcGN0eCkpIHsKKwkJCWlub2RlLmlfZmlsZV9hY2wgPSAwOworCQkJaW5vZGVfbW9kaWZpZWQrKzsKKwkJfSBlbHNlCisJCQlub3RfZml4ZWQrKzsKKwl9CisJaWYgKGlub2RlLmlfZGlyX2FjbCAmJgorCSAgICBMSU5VWF9TX0lTRElSKGlub2RlLmlfbW9kZSkpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9ESVJfQUNMX1pFUk8sICZwY3R4KSkgeworCQkJaW5vZGUuaV9kaXJfYWNsID0gMDsKKwkJCWlub2RlX21vZGlmaWVkKys7CisJCX0gZWxzZQorCQkJbm90X2ZpeGVkKys7CisJfQorCisJaWYgKGlub2RlX21vZGlmaWVkKQorCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgInByb2Nlc3NfYmFkX2lub2RlIik7CisJaWYgKCFub3RfZml4ZWQpCisJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfYmFkX21hcCwgaW5vKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogYWxsb2NhdGVfZGlyX2Jsb2NrIC0tLSB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldyBkaXJlY3RvcnkKKyAqICAgICAgYmxvY2sgZm9yIGEgcGFydGljdWxhciBpbm9kZTsgdGhpcyBpcyBkb25lIGlmIGEgZGlyZWN0b3J5IGhhcworICogICAgICBhICJob2xlIiBpbiBpdCwgb3IgaWYgYSBkaXJlY3RvcnkgaGFzIGEgaWxsZWdhbCBibG9jayBudW1iZXIKKyAqICAgICAgdGhhdCB3YXMgemVyb2VkIG91dCBhbmQgbm93IG5lZWRzIHRvIGJlIHJlcGxhY2VkLgorICovCitzdGF0aWMgaW50IGFsbG9jYXRlX2Rpcl9ibG9jayhlMmZzY2tfdCBjdHgsIHN0cnVjdCBleHQyX2RiX2VudHJ5ICpkYiwKKwkJCSAgICAgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWJsa190ICAgICAgICAgICAgICAgICAgIGJsazsKKwljaGFyICAgICAgICAgICAgICAgICAgICAqYmxvY2s7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisKKwlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8yX0RJUkVDVE9SWV9IT0xFLCBwY3R4KSA9PSAwKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogUmVhZCB0aGUgaW5vZGUgYW5kIGJsb2NrIGJpdG1hcHMgaW47IHdlJ2xsIGJlIG1lc3Npbmcgd2l0aAorCSAqIHRoZW0uCisJICovCisJZTJmc2NrX3JlYWRfYml0bWFwcyhjdHgpOworCisJLyoKKwkgKiBGaXJzdCwgZmluZCBhIGZyZWUgYmxvY2sKKwkgKi8KKwlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX25ld19ibG9jayhmcywgMCwgY3R4LT5ibG9ja19mb3VuZF9tYXAsICZibGspOworCWlmIChwY3R4LT5lcnJjb2RlKSB7CisJCXBjdHgtPnN0ciA9ICJleHQyZnNfbmV3X2Jsb2NrIjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX0FMTE9DX0RJUkJPQ0ssIHBjdHgpOworCQlyZXR1cm4gMTsKKwl9CisJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLCBibGspOworCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChmcy0+YmxvY2tfbWFwLCBibGspOworCWV4dDJmc19tYXJrX2JiX2RpcnR5KGZzKTsKKworCS8qCisJICogTm93IGxldCdzIGNyZWF0ZSB0aGUgYWN0dWFsIGRhdGEgYmxvY2sgZm9yIHRoZSBpbm9kZQorCSAqLworCWlmIChkYi0+YmxvY2tjbnQpCisJCXBjdHgtPmVycmNvZGUgPSBleHQyZnNfbmV3X2Rpcl9ibG9jayhmcywgMCwgMCwgJmJsb2NrKTsKKwllbHNlCisJCXBjdHgtPmVycmNvZGUgPSBleHQyZnNfbmV3X2Rpcl9ibG9jayhmcywgZGItPmlubywKKwkJCQkJCSAgICAgRVhUMl9ST09UX0lOTywgJmJsb2NrKTsKKworCWlmIChwY3R4LT5lcnJjb2RlKSB7CisJCXBjdHgtPnN0ciA9ICJleHQyZnNfbmV3X2Rpcl9ibG9jayI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9BTExPQ19ESVJCT0NLLCBwY3R4KTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGN0eC0+ZXJyY29kZSA9IGV4dDJmc193cml0ZV9kaXJfYmxvY2soZnMsIGJsaywgYmxvY2spOworCWV4dDJmc19mcmVlX21lbSgmYmxvY2spOworCWlmIChwY3R4LT5lcnJjb2RlKSB7CisJCXBjdHgtPnN0ciA9ICJleHQyZnNfd3JpdGVfZGlyX2Jsb2NrIjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX0FMTE9DX0RJUkJPQ0ssIHBjdHgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgaW5vZGUgYmxvY2sgY291bnQKKwkgKi8KKwllMmZzY2tfcmVhZF9pbm9kZShjdHgsIGRiLT5pbm8sICZpbm9kZSwgImFsbG9jYXRlX2Rpcl9ibG9jayIpOworCWlub2RlLmlfYmxvY2tzICs9IGZzLT5ibG9ja3NpemUgLyA1MTI7CisJaWYgKGlub2RlLmlfc2l6ZSA8IChkYi0+YmxvY2tjbnQrMSkgKiBmcy0+YmxvY2tzaXplKQorCQlpbm9kZS5pX3NpemUgPSAoZGItPmJsb2NrY250KzEpICogZnMtPmJsb2Nrc2l6ZTsKKwllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBkYi0+aW5vLCAmaW5vZGUsICJhbGxvY2F0ZV9kaXJfYmxvY2siKTsKKworCS8qCisJICogRmluYWxseSwgdXBkYXRlIHRoZSBibG9jayBwb2ludGVycyBmb3IgdGhlIGlub2RlCisJICovCisJZGItPmJsayA9IGJsazsKKwlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBkYi0+aW5vLCBCTE9DS19GTEFHX0hPTEUsCisJCQkJICAgICAgMCwgdXBkYXRlX2Rpcl9ibG9jaywgZGIpOworCWlmIChwY3R4LT5lcnJjb2RlKSB7CisJCXBjdHgtPnN0ciA9ICJleHQyZnNfYmxvY2tfaXRlcmF0ZSI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9BTExPQ19ESVJCT0NLLCBwY3R4KTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBhbGxvY2F0ZV9kaXJfYmxvY2soKS4KKyAqLworc3RhdGljIGludCB1cGRhdGVfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICAgYmxrX3QgICAgICAgKmJsb2NrX25yLAorCQkJICAgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJICAgIGJsa190IHJlZl9ibG9jayBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgIGludCByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBleHQyX2RiX2VudHJ5ICpkYjsKKworCWRiID0gKHN0cnVjdCBleHQyX2RiX2VudHJ5ICopIHByaXZfZGF0YTsKKwlpZiAoZGItPmJsb2NrY250ID09IChpbnQpIGJsb2NrY250KSB7CisJCSpibG9ja19uciA9IGRiLT5ibGs7CisJCXJldHVybiBCTE9DS19DSEFOR0VEOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBhc3MzLmMgLS0gcGFzcyAjMyBvZiBlMmZzY2s6IENoZWNrIGZvciBkaXJlY3RvcnkgY29ubmVjdGl2aXR5CisgKgorICogUGFzcyAjMyBhc3N1cmVzIHRoYXQgYWxsIGRpcmVjdG9yaWVzIGFyZSBjb25uZWN0ZWQgdG8gdGhlCisgKiBmaWxlc3lzdGVtIHRyZWUsIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgorICoKKyAqIEZpcnN0LCB0aGUgcm9vdCBkaXJlY3RvcnkgaXMgY2hlY2tlZCB0byBtYWtlIHN1cmUgaXQgZXhpc3RzOyBpZgorICogbm90LCBlMmZzY2sgd2lsbCBvZmZlciB0byBjcmVhdGUgYSBuZXcgb25lLiAgSXQgaXMgdGhlbiBtYXJrZWQgYXMKKyAqICJkb25lIi4KKyAqCisgKiBUaGVuLCBwYXNzMyBpbnRlcmF0ZXMgb3ZlciBhbGwgZGlyZWN0b3J5IGlub2RlczsgZm9yIGVhY2ggZGlyZWN0b3J5CisgKiBpdCBhdHRlbXB0cyB0byB0cmFjZSB1cCB0aGUgZmlsZXN5c3RlbSB0cmVlLCB1c2luZyBkaXJpbmZvLnBhcmVudAorICogdW50aWwgaXQgcmVhY2hlcyBhIGRpcmVjdG9yeSB3aGljaCBoYXMgYmVlbiBtYXJrZWQgImRvbmUiLiAgSWYgaXQKKyAqIGNhbm5vdCBkbyBzbywgdGhlbiB0aGUgZGlyZWN0b3J5IG11c3QgYmUgZGlzY29ubmVjdGVkLCBhbmQgZTJmc2NrCisgKiB3aWxsIG9mZmVyIHRvIHJlY29ubmVjdCBpdCB0byAvbG9zdCtmb3VuZC4gIFdoaWxlIGl0IGlzIGNoYXNpbmcKKyAqIHBhcmVudCBwb2ludGVycyB1cCB0aGUgZmlsZXN5c3RlbSB0cmVlLCBpZiBwYXNzMyBzZWVzIGEgZGlyZWN0b3J5CisgKiB0d2ljZSwgdGhlbiBpdCBoYXMgZGV0ZWN0ZWQgYSBmaWxlc3lzdGVtIGxvb3AsIGFuZCBpdCB3aWxsIGFnYWluCisgKiBvZmZlciB0byByZWNvbm5lY3QgdGhlIGRpcmVjdG9yeSB0byAvbG9zdCtmb3VuZCBpbiB0byBicmVhayB0aGUKKyAqIGZpbGVzeXN0ZW0gbG9vcC4KKyAqCisgKiBQYXNzIDMgYWxzbyBjb250YWlucyB0aGUgc3Vicm91dGluZSwgZTJmc2NrX3JlY29ubmVjdF9maWxlKCkgdG8KKyAqIHJlY29ubmVjdCBpbm9kZXMgdG8gL2xvc3QrZm91bmQ7IHRoaXMgc3Vicm91dGluZSBpcyBhbHNvIHVzZWQgYnkKKyAqIHBhc3MgNC4gIGUyZnNja19yZWNvbm5lY3RfZmlsZSgpIGNhbGxzIGdldF9sb3N0X2FuZF9mb3VuZCgpLCB3aGljaAorICogaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIC9sb3N0K2ZvdW5kIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICoKKyAqIFBhc3MgMyBmcmVlcyB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlczoKKyAqICAgICAgLSBUaGUgZGlyaW5mbyBkaXJlY3RvcnkgaW5mb3JtYXRpb24gY2FjaGUuCisgKi8KKworc3RhdGljIHZvaWQgY2hlY2tfcm9vdChlMmZzY2tfdCBjdHgpOworc3RhdGljIGludCBjaGVja19kaXJlY3RvcnkoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgZGlyX2luZm8gKmRpciwKKwkJCSAgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpOworc3RhdGljIHZvaWQgZml4X2RvdGRvdChlMmZzY2tfdCBjdHgsIHN0cnVjdCBkaXJfaW5mbyAqZGlyLCBleHQyX2lub190IHBhcmVudCk7CisKK3N0YXRpYyBleHQyZnNfaW5vZGVfYml0bWFwIGlub2RlX2xvb3BfZGV0ZWN0Oworc3RhdGljIGV4dDJmc19pbm9kZV9iaXRtYXAgaW5vZGVfZG9uZV9tYXA7CisKK3N0YXRpYyB2b2lkIGUyZnNja19wYXNzMyhlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWludCAgICAgICAgICAgICBpOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJc3RydWN0IGRpcl9pbmZvICpkaXI7CisJdW5zaWduZWQgbG9uZyBtYXhkaXJzLCBjb3VudDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwkvKiBQYXNzIDMgKi8KKworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfUEFTU19IRUFERVIsICZwY3R4KTsKKworCS8qCisJICogQWxsb2NhdGUgc29tZSBiaXRtYXBzIHRvIGRvIGxvb3AgZGV0ZWN0aW9uLgorCSAqLworCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsIF8oImlub2RlIGRvbmUgYml0bWFwIiksCisJCQkJCQkgICAgJmlub2RlX2RvbmVfbWFwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHgubnVtID0gMjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJZ290byBhYm9ydF9leGl0OworCX0KKwljaGVja19yb290KGN0eCk7CisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJZ290byBhYm9ydF9leGl0OworCisJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGlub2RlX2RvbmVfbWFwLCBFWFQyX1JPT1RfSU5PKTsKKworCW1heGRpcnMgPSBlMmZzY2tfZ2V0X251bV9kaXJpbmZvKGN0eCk7CisJY291bnQgPSAxOworCisJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCWlmICgoY3R4LT5wcm9ncmVzcykoY3R4LCAzLCAwLCBtYXhkaXJzKSkKKwkJCWdvdG8gYWJvcnRfZXhpdDsKKworCWZvciAoaT0wOyAoZGlyID0gZTJmc2NrX2Rpcl9pbmZvX2l0ZXIoY3R4LCAmaSkpICE9IDA7KSB7CisJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCQlnb3RvIGFib3J0X2V4aXQ7CisJCWlmIChjdHgtPnByb2dyZXNzICYmIChjdHgtPnByb2dyZXNzKShjdHgsIDMsIGNvdW50KyssIG1heGRpcnMpKQorCQkJZ290byBhYm9ydF9leGl0OworCQlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgZGlyLT5pbm8pKQorCQkJaWYgKGNoZWNrX2RpcmVjdG9yeShjdHgsIGRpciwgJnBjdHgpKQorCQkJCWdvdG8gYWJvcnRfZXhpdDsKKwl9CisKKwkvKgorCSAqIEZvcmNlIHRoZSBjcmVhdGlvbiBvZiAvbG9zdCtmb3VuZCBpZiBub3QgcHJlc2VudAorCSAqLworCWlmICgoY3R4LT5mbGFncyAmIEUyRl9PUFRfUkVBRE9OTFkpID09IDApCisJCWUyZnNja19nZXRfbG9zdF9hbmRfZm91bmQoY3R4LCAxKTsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIGFueSBkaXJlY3RvcmllcyB0aGF0IG5lZWQgdG8gYmUgaW5kZXhlZCBvcgorCSAqIG9wdGltaXplZCwgZG8gaXQgaGVyZS4KKwkgKi8KKwllMmZzY2tfcmVoYXNoX2RpcmVjdG9yaWVzKGN0eCk7CisKK2Fib3J0X2V4aXQ6CisJZTJmc2NrX2ZyZWVfZGlyX2luZm8oY3R4KTsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoaW5vZGVfbG9vcF9kZXRlY3QpOworCWlub2RlX2xvb3BfZGV0ZWN0ID0gMDsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoaW5vZGVfZG9uZV9tYXApOworCWlub2RlX2RvbmVfbWFwID0gMDsKK30KKworLyoKKyAqIFRoaXMgbWFrZXMgc3VyZSB0aGUgcm9vdCBpbm9kZSBpcyBwcmVzZW50OyBpZiBub3QsIHdlIGFzayBpZiB0aGUKKyAqIHVzZXIgd2FudHMgdXMgdG8gY3JlYXRlIGl0LiAgTm90IGNyZWF0aW5nIGl0IGlzIGEgZmF0YWwgZXJyb3IuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3Jvb3QoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlibGtfdCAgICAgICAgICAgICAgICAgICBibGs7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJY2hhciAqICAgICAgICAgICAgICAgICAgYmxvY2s7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsIEVYVDJfUk9PVF9JTk8pKSB7CisJCS8qCisJCSAqIElmIHRoZSByb290IGlub2RlIGlzIG5vdCBhIGRpcmVjdG9yeSwgZGllIGhlcmUuICBUaGUKKwkJICogdXNlciBtdXN0IGhhdmUgYW5zd2VyZWQgJ25vJyBpbiBwYXNzMSB3aGVuIHdlCisJCSAqIG9mZmVyZWQgdG8gY2xlYXIgaXQuCisJCSAqLworCQlpZiAoIShleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwLAorCQkJCQkgICAgICAgRVhUMl9ST09UX0lOTykpKSB7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfUk9PVF9OT1RfRElSX0FCT1JULCAmcGN0eCk7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWZpeF9wcm9ibGVtKGN0eCwgUFJfM19OT19ST09UX0lOT0RFLCAmcGN0eCkpIHsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX05PX1JPT1RfSU5PREVfQUJPUlQsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKworCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKworCS8qCisJICogRmlyc3QsIGZpbmQgYSBmcmVlIGJsb2NrCisJICovCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX25ld19ibG9jayhmcywgMCwgY3R4LT5ibG9ja19mb3VuZF9tYXAsICZibGspOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5zdHIgPSAiZXh0MmZzX25ld19ibG9jayI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19DUkVBVEVfUk9PVF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgYmxrKTsKKwlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgYmxrKTsKKwlleHQyZnNfbWFya19iYl9kaXJ0eShmcyk7CisKKwkvKgorCSAqIE5vdyBsZXQncyBjcmVhdGUgdGhlIGFjdHVhbCBkYXRhIGJsb2NrIGZvciB0aGUgaW5vZGUKKwkgKi8KKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfbmV3X2Rpcl9ibG9jayhmcywgRVhUMl9ST09UX0lOTywgRVhUMl9ST09UX0lOTywKKwkJCQkJICAgICZibG9jayk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4LnN0ciA9ICJleHQyZnNfbmV3X2Rpcl9ibG9jayI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19DUkVBVEVfUk9PVF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX3dyaXRlX2Rpcl9ibG9jayhmcywgYmxrLCBibG9jayk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4LnN0ciA9ICJleHQyZnNfd3JpdGVfZGlyX2Jsb2NrIjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0NSRUFURV9ST09UX0VSUk9SLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZibG9jayk7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgaW5vZGUgc3RydWN0dXJlCisJICovCisJbWVtc2V0KCZpbm9kZSwgMCwgc2l6ZW9mKGlub2RlKSk7CisJaW5vZGUuaV9tb2RlID0gMDQwNzU1OworCWlub2RlLmlfc2l6ZSA9IGZzLT5ibG9ja3NpemU7CisJaW5vZGUuaV9hdGltZSA9IGlub2RlLmlfY3RpbWUgPSBpbm9kZS5pX210aW1lID0gdGltZShOVUxMKTsKKwlpbm9kZS5pX2xpbmtzX2NvdW50ID0gMjsKKwlpbm9kZS5pX2Jsb2NrcyA9IGZzLT5ibG9ja3NpemUgLyA1MTI7CisJaW5vZGUuaV9ibG9ja1swXSA9IGJsazsKKworCS8qCisJICogV3JpdGUgb3V0IHRoZSBpbm9kZS4KKwkgKi8KKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfd3JpdGVfbmV3X2lub2RlKGZzLCBFWFQyX1JPT1RfSU5PLCAmaW5vZGUpOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5zdHIgPSAiZXh0MmZzX3dyaXRlX2lub2RlIjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0NSRUFURV9ST09UX0VSUk9SLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIE1pc2NlbGxhbmVvdXMgYm9va2tlZXBpbmcuLi4KKwkgKi8KKwllMmZzY2tfYWRkX2Rpcl9pbmZvKGN0eCwgRVhUMl9ST09UX0lOTywgRVhUMl9ST09UX0lOTyk7CisJZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2NvdW50LCBFWFQyX1JPT1RfSU5PLCAyKTsKKwlleHQyZnNfaWNvdW50X3N0b3JlKGN0eC0+aW5vZGVfbGlua19pbmZvLCBFWFQyX1JPT1RfSU5PLCAyKTsKKworCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBFWFQyX1JPT1RfSU5PKTsKKwlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwLCBFWFQyX1JPT1RfSU5PKTsKKwlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoZnMtPmlub2RlX21hcCwgRVhUMl9ST09UX0lOTyk7CisJZXh0MmZzX21hcmtfaWJfZGlydHkoZnMpOworfQorCisvKgorICogVGhpcyBzdWJyb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgc3VyZSB0aGF0IGEgcGFydGljdWxhcgorICogZGlyZWN0b3J5IGlzIGNvbm5lY3RlZCB0byB0aGUgcm9vdDsgaWYgaXQgaXNuJ3Qgd2UgdHJhY2UgaXQgdXAgYXMKKyAqIGZhciBhcyB3ZSBjYW4gZ28sIGFuZCB0aGVuIG9mZmVyIHRvIGNvbm5lY3QgdGhlIHJlc3VsdGluZyBwYXJlbnQgdG8KKyAqIHRoZSBsb3N0K2ZvdW5kLiAgV2UgaGF2ZSB0byBkbyBsb29wIGRldGVjdGlvbjsgaWYgd2UgZXZlciBkaXNjb3ZlcgorICogYSBsb29wLCB3ZSB0cmVhdCB0aGF0IGFzIGEgZGlzY29ubmVjdGVkIGRpcmVjdG9yeSBhbmQgb2ZmZXIgdG8KKyAqIHJlcGFyZW50IGl0IHRvIGxvc3QrZm91bmQuCisgKgorICogSG93ZXZlciwgbG9vcCBkZXRlY3Rpb24gaXMgZXhwZW5zaXZlLCBiZWNhdXNlIGZvciB2ZXJ5IGxhcmdlCisgKiBmaWxlc3lzdGVtcywgdGhlIGlub2RlX2xvb3BfZGV0ZWN0IGJpdG1hcCBpcyBodWdlLCBhbmQgY2xlYXJpbmcgaXQKKyAqIGlzIG5vbi10cml2aWFsLiAgTG9vcHMgaW4gZmlsZXN5c3RlbXMgYXJlIGFsc28gYSByYXJlIGVycm9yIGNhc2UsCisgKiBhbmQgd2Ugc2hvdWxkbid0IG9wdGltaXplIGZvciBlcnJvciBjYXNlcy4gIFNvIHdlIHRyeSB0d28gcGFzc2VzIG9mCisgKiB0aGUgYWxnb3JpdGhtLiAgVGhlIGZpcnN0IHRpbWUsIHdlIGlnbm9yZSBsb29wIGRldGVjdGlvbiBhbmQgbWVyZWx5CisgKiBpbmNyZW1lbnQgYSBjb3VudGVyOyBpZiB0aGUgY291bnRlciBleGNlZWRzIHNvbWUgZXh0cmVtZSB0aHJlc2hvbGQsCisgKiB0aGVuIHdlIHRyeSBhZ2FpbiB3aXRoIHRoZSBsb29wIGRldGVjdGlvbiBiaXRtYXAgZW5hYmxlZC4KKyAqLworc3RhdGljIGludCBjaGVja19kaXJlY3RvcnkoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgZGlyX2luZm8gKmRpciwKKwkJCSAgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpCit7CisJZXh0Ml9maWxzeXMgICAgIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3QgZGlyX2luZm8gKnAgPSBkaXI7CisJaW50ICAgICAgICAgICAgIGxvb3BfcGFzcyA9IDAsIHBhcmVudF9jb3VudCA9IDA7CisKKwlpZiAoIXApCisJCXJldHVybiAwOworCisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogTWFyayB0aGlzIGlub2RlIGFzIGJlaW5nICJkb25lIjsgYnkgdGhlIHRpbWUgd2UKKwkJICogcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhlIGlub2RlIHdlIGVpdGhlciBiZQorCQkgKiB2ZXJpZmllZCBhcyBiZWluZyBjb25uZWN0ZWQgdG8gdGhlIGRpcmVjdG9yeSB0cmVlLAorCQkgKiBvciB3ZSB3aWxsIGhhdmUgb2ZmZXJlZCB0byByZWNvbm5lY3QgdGhpcyB0bworCQkgKiBsb3N0K2ZvdW5kLgorCQkgKgorCQkgKiBJZiBpdCB3YXMgbWFya2VkIGRvbmUgYWxyZWFkeSwgdGhlbiB3ZSd2ZSByZWFjaGVkIGEKKwkJICogcGFyZW50IHdlJ3ZlIGFscmVhZHkgY2hlY2tlZC4KKwkJICovCisJCWlmIChleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoaW5vZGVfZG9uZV9tYXAsIHAtPmlubykpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBJZiB0aGlzIGRpcmVjdG9yeSBkb2Vzbid0IGhhdmUgYSBwYXJlbnQsIG9yIHdlJ3ZlCisJCSAqIHNlZW4gdGhlIHBhcmVudCBvbmNlIGFscmVhZHksIHRoZW4gb2ZmZXIgdG8KKwkJICogcmVwYXJlbnQgaXQgdG8gbG9zdCtmb3VuZAorCQkgKi8KKwkJaWYgKCFwLT5wYXJlbnQgfHwKKwkJICAgIChsb29wX3Bhc3MgJiYKKwkJICAgICAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGlub2RlX2xvb3BfZGV0ZWN0LAorCQkJCQkgICAgICBwLT5wYXJlbnQpKSkpIHsKKwkJCXBjdHgtPmlubyA9IHAtPmlubzsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzNfVU5DT05ORUNURURfRElSLCBwY3R4KSkgeworCQkJCWlmIChlMmZzY2tfcmVjb25uZWN0X2ZpbGUoY3R4LCBwY3R4LT5pbm8pKQorCQkJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwkJCQllbHNlIHsKKwkJCQkJcCA9IGUyZnNja19nZXRfZGlyX2luZm8oY3R4LCBwY3R4LT5pbm8pOworCQkJCQlwLT5wYXJlbnQgPSBjdHgtPmxvc3RfYW5kX2ZvdW5kOworCQkJCQlmaXhfZG90ZG90KGN0eCwgcCwgY3R4LT5sb3N0X2FuZF9mb3VuZCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJcCA9IGUyZnNja19nZXRfZGlyX2luZm8oY3R4LCBwLT5wYXJlbnQpOworCQlpZiAoIXApIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19OT19ESVJJTkZPLCBwY3R4KTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChsb29wX3Bhc3MpIHsKKwkJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChpbm9kZV9sb29wX2RldGVjdCwKKwkJCQkJCSBwLT5pbm8pOworCQl9IGVsc2UgaWYgKHBhcmVudF9jb3VudCsrID4gMjA0OCkgeworCQkJLyoKKwkJCSAqIElmIHdlJ3ZlIHJ1biBpbnRvIGEgcGF0aCBkZXB0aCB0aGF0J3MKKwkJCSAqIGdyZWF0ZXIgdGhhbiAyMDQ4LCB0cnkgYWdhaW4gd2l0aCB0aGUgaW5vZGUKKwkJCSAqIGxvb3AgYml0bWFwIHR1cm5lZCBvbiBhbmQgc3RhcnQgZnJvbSB0aGUKKwkJCSAqIHRvcC4KKwkJCSAqLworCQkJbG9vcF9wYXNzID0gMTsKKwkJCWlmIChpbm9kZV9sb29wX2RldGVjdCkKKwkJCQlleHQyZnNfY2xlYXJfaW5vZGVfYml0bWFwKGlub2RlX2xvb3BfZGV0ZWN0KTsKKwkJCWVsc2UgeworCQkJCXBjdHgtPmVycmNvZGUgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGZzLCBfKCJpbm9kZSBsb29wIGRldGVjdGlvbiBiaXRtYXAiKSwgJmlub2RlX2xvb3BfZGV0ZWN0KTsKKwkJCQlpZiAocGN0eC0+ZXJyY29kZSkgeworCQkJCQlwY3R4LT5udW0gPSAxOworCQkJCQlmaXhfcHJvYmxlbShjdHgsCisJCQkJICAgIFBSXzNfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiwgcGN0eCk7CisJCQkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCQlwID0gZGlyOworCQl9CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCAuLiBhbmQgdGhlIHBhcmVudCBkaXJlY3RvcnkgYXJlIHRoZSBzYW1lOworCSAqIG9mZmVyIHRvIGZpeCBpdCBpZiBub3QuCisJICovCisJaWYgKGRpci0+cGFyZW50ICE9IGRpci0+ZG90ZG90KSB7CisJCXBjdHgtPmlubyA9IGRpci0+aW5vOworCQlwY3R4LT5pbm8yID0gZGlyLT5kb3Rkb3Q7CisJCXBjdHgtPmRpciA9IGRpci0+cGFyZW50OworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8zX0JBRF9ET1RfRE9ULCBwY3R4KSkKKwkJCWZpeF9kb3Rkb3QoY3R4LCBkaXIsIGRpci0+cGFyZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZ2V0cyB0aGUgbG9zdF9hbmRfZm91bmQgaW5vZGUsIG1ha2luZyBpdCBhIGRpcmVjdG9yeQorICogaWYgbmVjZXNzYXJ5CisgKi8KK2V4dDJfaW5vX3QgZTJmc2NrX2dldF9sb3N0X2FuZF9mb3VuZChlMmZzY2tfdCBjdHgsIGludCBmaXgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWV4dDJfaW5vX3QgICAgICAgICAgICAgICAgICAgICAgaW5vOworCWJsa190ICAgICAgICAgICAgICAgICAgIGJsazsKKwllcnJjb2RlX3QgICAgICAgICAgICAgICByZXR2YWw7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJY2hhciAqICAgICAgICAgICAgICAgICAgYmxvY2s7CisJc3RhdGljIGNvbnN0IGNoYXIgICAgICAgbmFtZVtdID0gImxvc3QrZm91bmQiOworCXN0cnVjdCAgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisJc3RydWN0IGRpcl9pbmZvICAgICAgICAgKmRpcmluZm87CisKKwlpZiAoY3R4LT5sb3N0X2FuZF9mb3VuZCkKKwkJcmV0dXJuIGN0eC0+bG9zdF9hbmRfZm91bmQ7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJcmV0dmFsID0gZXh0MmZzX2xvb2t1cChmcywgRVhUMl9ST09UX0lOTywgbmFtZSwKKwkJCSAgICAgICBzaXplb2YobmFtZSktMSwgMCwgJmlubyk7CisJaWYgKHJldHZhbCAmJiAhZml4KQorCQlyZXR1cm4gMDsKKwlpZiAoIXJldHZhbCkgeworCQlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgaW5vKSkgeworCQkJY3R4LT5sb3N0X2FuZF9mb3VuZCA9IGlubzsKKwkJCXJldHVybiBpbm87CisJCX0KKworCQkvKiBMb3N0K2ZvdW5kIGlzbid0IGEgZGlyZWN0b3J5ISAqLworCQlpZiAoIWZpeCkKKwkJCXJldHVybiAwOworCQlwY3R4LmlubyA9IGlubzsKKwkJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzNfTFBGX05PVERJUiwgJnBjdHgpKQorCQkJcmV0dXJuIDA7CisKKwkJLyogT0ssIHVubGluayB0aGUgb2xkIC9sb3N0K2ZvdW5kIGZpbGUuICovCisJCXBjdHguZXJyY29kZSA9IGV4dDJmc191bmxpbmsoZnMsIEVYVDJfUk9PVF9JTk8sIG5hbWUsIGlubywgMCk7CisJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCXBjdHguc3RyID0gImV4dDJmc191bmxpbmsiOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0NSRUFURV9MUEZfRVJST1IsICZwY3R4KTsKKwkJCXJldHVybiAwOworCQl9CisJCWRpcmluZm8gPSBlMmZzY2tfZ2V0X2Rpcl9pbmZvKGN0eCwgaW5vKTsKKwkJaWYgKGRpcmluZm8pCisJCQlkaXJpbmZvLT5wYXJlbnQgPSAwOworCQllMmZzY2tfYWRqdXN0X2lub2RlX2NvdW50KGN0eCwgaW5vLCAtMSk7CisJfSBlbHNlIGlmIChyZXR2YWwgIT0gRVhUMl9FVF9GSUxFX05PVF9GT1VORCkgeworCQlwY3R4LmVycmNvZGUgPSByZXR2YWw7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19FUlJfRklORF9MUEYsICZwY3R4KTsKKwl9CisJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzNfTk9fTEZfRElSLCAwKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFJlYWQgdGhlIGlub2RlIGFuZCBibG9jayBiaXRtYXBzIGluOyB3ZSdsbCBiZSBtZXNzaW5nIHdpdGgKKwkgKiB0aGVtLgorCSAqLworCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKworCS8qCisJICogRmlyc3QsIGZpbmQgYSBmcmVlIGJsb2NrCisJICovCisJcmV0dmFsID0gZXh0MmZzX25ld19ibG9jayhmcywgMCwgY3R4LT5ibG9ja19mb3VuZF9tYXAsICZibGspOworCWlmIChyZXR2YWwpIHsKKwkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfRVJSX0xQRl9ORVdfQkxPQ0ssICZwY3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgYmxrKTsKKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIGJsaywgKzEpOworCisJLyoKKwkgKiBOZXh0IGZpbmQgYSBmcmVlIGlub2RlLgorCSAqLworCXJldHZhbCA9IGV4dDJmc19uZXdfaW5vZGUoZnMsIEVYVDJfUk9PVF9JTk8sIDA0MDcwMCwKKwkJCQkgIGN0eC0+aW5vZGVfdXNlZF9tYXAsICZpbm8pOworCWlmIChyZXR2YWwpIHsKKwkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfRVJSX0xQRl9ORVdfSU5PREUsICZwY3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOworCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsIGlubyk7CisJZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzMihmcywgaW5vLCArMSwgMSk7CisKKwkvKgorCSAqIE5vdyBsZXQncyBjcmVhdGUgdGhlIGFjdHVhbCBkYXRhIGJsb2NrIGZvciB0aGUgaW5vZGUKKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfbmV3X2Rpcl9ibG9jayhmcywgaW5vLCBFWFQyX1JPT1RfSU5PLCAmYmxvY2spOworCWlmIChyZXR2YWwpIHsKKwkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfRVJSX0xQRl9ORVdfRElSX0JMT0NLLCAmcGN0eCk7CisJCXJldHVybiAwOworCX0KKworCXJldHZhbCA9IGV4dDJmc193cml0ZV9kaXJfYmxvY2soZnMsIGJsaywgYmxvY2spOworCWV4dDJmc19mcmVlX21lbSgmYmxvY2spOworCWlmIChyZXR2YWwpIHsKKwkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfRVJSX0xQRl9XUklURV9CTE9DSywgJnBjdHgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFNldCB1cCB0aGUgaW5vZGUgc3RydWN0dXJlCisJICovCisJbWVtc2V0KCZpbm9kZSwgMCwgc2l6ZW9mKGlub2RlKSk7CisJaW5vZGUuaV9tb2RlID0gMDQwNzAwOworCWlub2RlLmlfc2l6ZSA9IGZzLT5ibG9ja3NpemU7CisJaW5vZGUuaV9hdGltZSA9IGlub2RlLmlfY3RpbWUgPSBpbm9kZS5pX210aW1lID0gdGltZShOVUxMKTsKKwlpbm9kZS5pX2xpbmtzX2NvdW50ID0gMjsKKwlpbm9kZS5pX2Jsb2NrcyA9IGZzLT5ibG9ja3NpemUgLyA1MTI7CisJaW5vZGUuaV9ibG9ja1swXSA9IGJsazsKKworCS8qCisJICogTmV4dCwgd3JpdGUgb3V0IHRoZSBpbm9kZS4KKwkgKi8KKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfd3JpdGVfbmV3X2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4LnN0ciA9ICJleHQyZnNfd3JpdGVfaW5vZGUiOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfQ1JFQVRFX0xQRl9FUlJPUiwgJnBjdHgpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBGaW5hbGx5LCBjcmVhdGUgdGhlIGRpcmVjdG9yeSBsaW5rCisJICovCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2xpbmsoZnMsIEVYVDJfUk9PVF9JTk8sIG5hbWUsIGlubywgRVhUMl9GVF9ESVIpOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5zdHIgPSAiZXh0MmZzX2xpbmsiOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfQ1JFQVRFX0xQRl9FUlJPUiwgJnBjdHgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE1pc2NlbGxhbmVvdXMgYm9va2tlZXBpbmcgdGhhdCBuZWVkcyB0byBiZSBrZXB0IHN0cmFpZ2h0LgorCSAqLworCWUyZnNja19hZGRfZGlyX2luZm8oY3R4LCBpbm8sIEVYVDJfUk9PVF9JTk8pOworCWUyZnNja19hZGp1c3RfaW5vZGVfY291bnQoY3R4LCBFWFQyX1JPT1RfSU5PLCAxKTsKKwlleHQyZnNfaWNvdW50X3N0b3JlKGN0eC0+aW5vZGVfY291bnQsIGlubywgMik7CisJZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2xpbmtfaW5mbywgaW5vLCAyKTsKKwljdHgtPmxvc3RfYW5kX2ZvdW5kID0gaW5vOworCXJldHVybiBpbm87Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBjb25uZWN0IGEgZmlsZSB0byBsb3N0K2ZvdW5kCisgKi8KK2ludCBlMmZzY2tfcmVjb25uZWN0X2ZpbGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubykKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwljaGFyICAgICAgICAgICAgbmFtZVs4MF07CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKwlpbnQgICAgICAgICAgICAgZmlsZV90eXBlID0gMDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJcGN0eC5pbm8gPSBpbm87CisKKwlpZiAoIWN0eC0+YmFkX2xvc3RfYW5kX2ZvdW5kICYmICFjdHgtPmxvc3RfYW5kX2ZvdW5kKSB7CisJCWlmIChlMmZzY2tfZ2V0X2xvc3RfYW5kX2ZvdW5kKGN0eCwgMSkgPT0gMCkKKwkJCWN0eC0+YmFkX2xvc3RfYW5kX2ZvdW5kKys7CisJfQorCWlmIChjdHgtPmJhZF9sb3N0X2FuZF9mb3VuZCkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfTk9fTFBGLCAmcGN0eCk7CisJCXJldHVybiAxOworCX0KKworCXNwcmludGYobmFtZSwgIiMldSIsIGlubyk7CisJaWYgKGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZpbm9kZSkgPT0gMCkKKwkJZmlsZV90eXBlID0gZXh0Ml9maWxlX3R5cGUoaW5vZGUuaV9tb2RlKTsKKwlyZXR2YWwgPSBleHQyZnNfbGluayhmcywgY3R4LT5sb3N0X2FuZF9mb3VuZCwgbmFtZSwgaW5vLCBmaWxlX3R5cGUpOworCWlmIChyZXR2YWwgPT0gRVhUMl9FVF9ESVJfTk9fU1BBQ0UpIHsKKwkJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzNfRVhQQU5EX0xGX0RJUiwgJnBjdHgpKQorCQkJcmV0dXJuIDE7CisJCXJldHZhbCA9IGUyZnNja19leHBhbmRfZGlyZWN0b3J5KGN0eCwgY3R4LT5sb3N0X2FuZF9mb3VuZCwKKwkJCQkJCSAxLCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0NBTlRfRVhQQU5EX0xQRiwgJnBjdHgpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dmFsID0gZXh0MmZzX2xpbmsoZnMsIGN0eC0+bG9zdF9hbmRfZm91bmQsIG5hbWUsCisJCQkJICAgICBpbm8sIGZpbGVfdHlwZSk7CisJfQorCWlmIChyZXR2YWwpIHsKKwkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfQ0FOVF9SRUNPTk5FQ1QsICZwY3R4KTsKKwkJcmV0dXJuIDE7CisJfQorCWUyZnNja19hZGp1c3RfaW5vZGVfY291bnQoY3R4LCBpbm8sIDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmUgdG8gYWRqdXN0IHRoZSBpbm9kZSBjb3VudHMgb24gYW4gaW5vZGUuCisgKi8KK2VycmNvZGVfdCBlMmZzY2tfYWRqdXN0X2lub2RlX2NvdW50KGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8sIGludCBhZGopCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWVycmNvZGVfdCAgICAgICAgICAgICAgIHJldHZhbDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKworCWlmICghaW5vKQorCQlyZXR1cm4gMDsKKworCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChhZGogPT0gMSkgeworCQlleHQyZnNfaWNvdW50X2luY3JlbWVudChjdHgtPmlub2RlX2NvdW50LCBpbm8sIDApOworCQlpZiAoaW5vZGUuaV9saW5rc19jb3VudCA9PSAoX191MTYpIH4wKQorCQkJcmV0dXJuIDA7CisJCWV4dDJmc19pY291bnRfaW5jcmVtZW50KGN0eC0+aW5vZGVfbGlua19pbmZvLCBpbm8sIDApOworCQlpbm9kZS5pX2xpbmtzX2NvdW50Kys7CisJfSBlbHNlIGlmIChhZGogPT0gLTEpIHsKKwkJZXh0MmZzX2ljb3VudF9kZWNyZW1lbnQoY3R4LT5pbm9kZV9jb3VudCwgaW5vLCAwKTsKKwkJaWYgKGlub2RlLmlfbGlua3NfY291bnQgPT0gMCkKKwkJCXJldHVybiAwOworCQlleHQyZnNfaWNvdW50X2RlY3JlbWVudChjdHgtPmlub2RlX2xpbmtfaW5mbywgaW5vLCAwKTsKKwkJaW5vZGUuaV9saW5rc19jb3VudC0tOworCX0KKworCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShmcywgaW5vLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpeCBwYXJlbnQgLS0tIHRoaXMgcm91dGluZSBmaXhlcyB1cCB0aGUgcGFyZW50IG9mIGEgZGlyZWN0b3J5LgorICovCitzdHJ1Y3QgZml4X2RvdGRvdF9zdHJ1Y3QgeworCWV4dDJfZmlsc3lzICAgICBmczsKKwlleHQyX2lub190ICAgICAgcGFyZW50OworCWludCAgICAgICAgICAgICBkb25lOworCWUyZnNja190ICAgICAgICBjdHg7Cit9OworCitzdGF0aWMgaW50IGZpeF9kb3Rkb3RfcHJvYyhzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCSAgIGludCAgb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICBpbnQgIGJsb2Nrc2l6ZSBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgY2hhciAqYnVmIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IGZpeF9kb3Rkb3Rfc3RydWN0ICpmcCA9IChzdHJ1Y3QgZml4X2RvdGRvdF9zdHJ1Y3QgKikgcHJpdl9kYXRhOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCisJaWYgKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikgIT0gMikKKwkJcmV0dXJuIDA7CisJaWYgKHN0cm5jbXAoZGlyZW50LT5uYW1lLCAiLi4iLCAyKSkKKwkJcmV0dXJuIDA7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJcmV0dmFsID0gZTJmc2NrX2FkanVzdF9pbm9kZV9jb3VudChmcC0+Y3R4LCBkaXJlbnQtPmlub2RlLCAtMSk7CisJaWYgKHJldHZhbCkgeworCQlwY3R4LmVycmNvZGUgPSByZXR2YWw7CisJCWZpeF9wcm9ibGVtKGZwLT5jdHgsIFBSXzNfQURKVVNUX0lOT0RFLCAmcGN0eCk7CisJfQorCXJldHZhbCA9IGUyZnNja19hZGp1c3RfaW5vZGVfY291bnQoZnAtPmN0eCwgZnAtPnBhcmVudCwgMSk7CisJaWYgKHJldHZhbCkgeworCQlwY3R4LmVycmNvZGUgPSByZXR2YWw7CisJCWZpeF9wcm9ibGVtKGZwLT5jdHgsIFBSXzNfQURKVVNUX0lOT0RFLCAmcGN0eCk7CisJfQorCWRpcmVudC0+aW5vZGUgPSBmcC0+cGFyZW50OworCisJZnAtPmRvbmUrKzsKKwlyZXR1cm4gRElSRU5UX0FCT1JUIHwgRElSRU5UX0NIQU5HRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpeF9kb3Rkb3QoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgZGlyX2luZm8gKmRpciwgZXh0Ml9pbm9fdCBwYXJlbnQpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJc3RydWN0IGZpeF9kb3Rkb3Rfc3RydWN0IGZwOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgcGN0eDsKKworCWZwLmZzID0gZnM7CisJZnAucGFyZW50ID0gcGFyZW50OworCWZwLmRvbmUgPSAwOworCWZwLmN0eCA9IGN0eDsKKworCXJldHZhbCA9IGV4dDJmc19kaXJfaXRlcmF0ZShmcywgZGlyLT5pbm8sIERJUkVOVF9GTEFHX0lOQ0xVREVfRU1QVFksCisJCQkJICAgIDAsIGZpeF9kb3Rkb3RfcHJvYywgJmZwKTsKKwlpZiAocmV0dmFsIHx8ICFmcC5kb25lKSB7CisJCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJCXBjdHguaW5vID0gZGlyLT5pbm87CisJCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwkJZml4X3Byb2JsZW0oY3R4LCByZXR2YWwgPyBQUl8zX0ZJWF9QQVJFTlRfRVJSIDoKKwkJCSAgICBQUl8zX0ZJWF9QQVJFTlRfTk9GSU5ELCAmcGN0eCk7CisJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCX0KKwlkaXItPmRvdGRvdCA9IHBhcmVudDsKK30KKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgZXhwYW5kaW5nIGEgL2xvc3QrZm91bmQgaWYgaXQgaXMKKyAqIHRvbyBzbWFsbC4KKyAqLworCitzdHJ1Y3QgZXhwYW5kX2Rpcl9zdHJ1Y3QgeworCWludCAgICAgICAgICAgICAgICAgICAgIG51bTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBndWFyYW50ZWVkX3NpemU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbmV3YmxvY2tzOworCWludCAgICAgICAgICAgICAgICAgICAgIGxhc3RfYmxvY2s7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgZXJyOworCWUyZnNja190ICAgICAgICAgICAgICAgIGN0eDsKK307CisKK3N0YXRpYyBpbnQgZXhwYW5kX2Rpcl9wcm9jKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgYmxrX3QgICAgICAgICpibG9ja25yLAorCQkJICAgZTJfYmxrY250X3QgIGJsb2NrY250LAorCQkJICAgYmxrX3QgcmVmX2Jsb2NrIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICBpbnQgcmVmX29mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBleHBhbmRfZGlyX3N0cnVjdCAqZXMgPSAoc3RydWN0IGV4cGFuZF9kaXJfc3RydWN0ICopIHByaXZfZGF0YTsKKwlibGtfdCAgIG5ld19ibGs7CisJc3RhdGljIGJsa190ICAgIGxhc3RfYmxrID0gMDsKKwljaGFyICAgICAgICAgICAgKmJsb2NrOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJZTJmc2NrX3QgICAgICAgIGN0eDsKKworCWN0eCA9IGVzLT5jdHg7CisKKwlpZiAoZXMtPmd1YXJhbnRlZWRfc2l6ZSAmJiBibG9ja2NudCA+PSBlcy0+Z3VhcmFudGVlZF9zaXplKQorCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisKKwlpZiAoYmxvY2tjbnQgPiAwKQorCQllcy0+bGFzdF9ibG9jayA9IGJsb2NrY250OworCWlmICgqYmxvY2tucikgeworCQlsYXN0X2JsayA9ICpibG9ja25yOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dmFsID0gZXh0MmZzX25ld19ibG9jayhmcywgbGFzdF9ibGssIGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCSAgJm5ld19ibGspOworCWlmIChyZXR2YWwpIHsKKwkJZXMtPmVyciA9IHJldHZhbDsKKwkJcmV0dXJuIEJMT0NLX0FCT1JUOworCX0KKwlpZiAoYmxvY2tjbnQgPiAwKSB7CisJCXJldHZhbCA9IGV4dDJmc19uZXdfZGlyX2Jsb2NrKGZzLCAwLCAwLCAmYmxvY2spOworCQlpZiAocmV0dmFsKSB7CisJCQllcy0+ZXJyID0gcmV0dmFsOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJCWVzLT5udW0tLTsKKwkJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2Rpcl9ibG9jayhmcywgbmV3X2JsaywgYmxvY2spOworCX0gZWxzZSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZibG9jayk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWVzLT5lcnIgPSByZXR2YWw7CisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwkJbWVtc2V0KGJsb2NrLCAwLCBmcy0+YmxvY2tzaXplKTsKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBuZXdfYmxrLCAxLCBibG9jayk7CisJfQorCWlmIChyZXR2YWwpIHsKKwkJZXMtPmVyciA9IHJldHZhbDsKKwkJcmV0dXJuIEJMT0NLX0FCT1JUOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJmJsb2NrKTsKKwkqYmxvY2tuciA9IG5ld19ibGs7CisJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLCBuZXdfYmxrKTsKKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIG5ld19ibGssICsxKTsKKwllcy0+bmV3YmxvY2tzKys7CisKKwlpZiAoZXMtPm51bSA9PSAwKQorCQlyZXR1cm4gKEJMT0NLX0NIQU5HRUQgfCBCTE9DS19BQk9SVCk7CisJZWxzZQorCQlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKK30KKworZXJyY29kZV90IGUyZnNja19leHBhbmRfZGlyZWN0b3J5KGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBkaXIsCisJCQkJICBpbnQgbnVtLCBpbnQgZ3VhcmFudGVlZF9zaXplKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCXN0cnVjdCBleHBhbmRfZGlyX3N0cnVjdCBlczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKworCWlmICghKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykpCisJCXJldHVybiBFWFQyX0VUX1JPX0ZJTFNZUzsKKworCS8qCisJICogUmVhZCB0aGUgaW5vZGUgYW5kIGJsb2NrIGJpdG1hcHMgaW47IHdlJ2xsIGJlIG1lc3Npbmcgd2l0aAorCSAqIHRoZW0uCisJICovCisJZTJmc2NrX3JlYWRfYml0bWFwcyhjdHgpOworCisJcmV0dmFsID0gZXh0MmZzX2NoZWNrX2RpcmVjdG9yeShmcywgZGlyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJZXMubnVtID0gbnVtOworCWVzLmd1YXJhbnRlZWRfc2l6ZSA9IGd1YXJhbnRlZWRfc2l6ZTsKKwllcy5sYXN0X2Jsb2NrID0gMDsKKwllcy5lcnIgPSAwOworCWVzLm5ld2Jsb2NrcyA9IDA7CisJZXMuY3R4ID0gY3R4OworCisJcmV0dmFsID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBkaXIsIEJMT0NLX0ZMQUdfQVBQRU5ELAorCQkJCSAgICAgICAwLCBleHBhbmRfZGlyX3Byb2MsICZlcyk7CisKKwlpZiAoZXMuZXJyKQorCQlyZXR1cm4gZXMuZXJyOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIHNpemUgYW5kIGJsb2NrIGNvdW50IGZpZWxkcyBpbiB0aGUgaW5vZGUuCisJICovCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIGRpciwgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaW5vZGUuaV9zaXplID0gKGVzLmxhc3RfYmxvY2sgKyAxKSAqIGZzLT5ibG9ja3NpemU7CisJaW5vZGUuaV9ibG9ja3MgKz0gKGZzLT5ibG9ja3NpemUgLyA1MTIpICogZXMubmV3YmxvY2tzOworCisJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgZGlyLCAmaW5vZGUsICJleHBhbmRfZGlyZWN0b3J5Iik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBhc3M0LmMgLS0gcGFzcyAjNCBvZiBlMmZzY2s6IENoZWNrIHJlZmVyZW5jZSBjb3VudHMKKyAqCisgKiBQYXNzIDQgZnJlZXMgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZXM6CisgKiAgICAgIC0gQSBiaXRtYXAgb2Ygd2hpY2ggaW5vZGVzIGFyZSBpbWFnaWMgaW5vZGVzLiAgIChpbm9kZV9pbWFnaWNfbWFwKQorICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYW4gaW5vZGUgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUKKyAqIGRpcmVjdG9yeSB0cmVlLgorICoKKyAqIFRoaXMgc3Vicm91dGluZSByZXR1cm5zIDEgdGhlbiB0aGUgY2FsbGVyIHNob3VsZG4ndCBib3RoZXIgd2l0aCB0aGUKKyAqIHJlc3Qgb2YgdGhlIHBhc3MgNCB0ZXN0cy4KKyAqLworc3RhdGljIGludCBkaXNjb25uZWN0X2lub2RlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpLCAmaW5vZGUsICJwYXNzNDogZGlzY29ubmVjdF9pbm9kZSIpOworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJcGN0eC5pbm8gPSBpOworCXBjdHguaW5vZGUgPSAmaW5vZGU7CisKKwkvKgorCSAqIE9mZmVyIHRvIGRlbGV0ZSBhbnkgemVyby1sZW5ndGggZmlsZXMgdGhhdCBkb2VzIG5vdCBoYXZlCisJICogYmxvY2tzLiAgSWYgdGhlcmUgaXMgYW4gRUEgYmxvY2ssIGl0IG1pZ2h0IGhhdmUgdXNlZnVsCisJICogaW5mb3JtYXRpb24sIHNvIHdlIHdvbid0IHByb21wdCB0byBkZWxldGUgaXQsIGJ1dCBsZXQgaXQgYmUKKwkgKiByZWNvbm5lY3RlZCB0byBsb3N0K2ZvdW5kLgorCSAqLworCWlmICghaW5vZGUuaV9ibG9ja3MgJiYgKExJTlVYX1NfSVNSRUcoaW5vZGUuaV9tb2RlKSB8fAorCQkJCUxJTlVYX1NfSVNESVIoaW5vZGUuaV9tb2RlKSkpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfNF9aRVJPX0xFTl9JTk9ERSwgJnBjdHgpKSB7CisJCQlleHQyZnNfaWNvdW50X3N0b3JlKGN0eC0+aW5vZGVfbGlua19pbmZvLCBpLCAwKTsKKwkJCWlub2RlLmlfbGlua3NfY291bnQgPSAwOworCQkJaW5vZGUuaV9kdGltZSA9IHRpbWUoTlVMTCk7CisJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpLCAmaW5vZGUsCisJCQkJCSAgICJkaXNjb25uZWN0X2lub2RlIik7CisJCQkvKgorCQkJICogRml4IHVwIHRoZSBiaXRtYXBzLi4uCisJCQkgKi8KKwkJCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKwkJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsIGkpOworCQkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwLCBpKTsKKwkJCWV4dDJmc19pbm9kZV9hbGxvY19zdGF0czIoZnMsIGksIC0xLAorCQkJCQkJICBMSU5VWF9TX0lTRElSKGlub2RlLmlfbW9kZSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKgorCSAqIFByb21wdCB0byByZWNvbm5lY3QuCisJICovCisJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfNF9VTkFUVEFDSEVEX0lOT0RFLCAmcGN0eCkpIHsKKwkJaWYgKGUyZnNja19yZWNvbm5lY3RfZmlsZShjdHgsIGkpKQorCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgd2UgZG9uJ3QgYXR0YWNoIHRoZSBpbm9kZSwgdGhlbiBza2lwIHRoZQorCQkgKiBpX2xpbmtzX3Rlc3Qgc2luY2UgdGhlcmUncyBubyBwb2ludCBpbiB0cnlpbmcgdG8KKwkJICogZm9yY2UgaV9saW5rc19jb3VudCB0byB6ZXJvLgorCQkgKi8KKwkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBlMmZzY2tfcGFzczQoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlleHQyX2lub190ICAgICAgaTsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCV9fdTE2ICAgbGlua19jb3VudCwgbGlua19jb3VudGVkOworCWNoYXIgICAgKmJ1ZiA9IE5VTEw7CisJaW50ICAgICBncm91cCwgbWF4Z3JvdXA7CisKKwkvKiBQYXNzIDQgKi8KKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl80X1BBU1NfSEVBREVSLCAmcGN0eCk7CisKKwlncm91cCA9IDA7CisJbWF4Z3JvdXAgPSBmcy0+Z3JvdXBfZGVzY19jb3VudDsKKwlpZiAoY3R4LT5wcm9ncmVzcykKKwkJaWYgKChjdHgtPnByb2dyZXNzKShjdHgsIDQsIDAsIG1heGdyb3VwKSkKKwkJCXJldHVybjsKKworCWZvciAoaT0xOyBpIDw9IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQ7IGkrKykgeworCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJcmV0dXJuOworCQlpZiAoKGkgJSBmcy0+c3VwZXItPnNfaW5vZGVzX3Blcl9ncm91cCkgPT0gMCkgeworCQkJZ3JvdXArKzsKKwkJCWlmIChjdHgtPnByb2dyZXNzKQorCQkJCWlmICgoY3R4LT5wcm9ncmVzcykoY3R4LCA0LCBncm91cCwgbWF4Z3JvdXApKQorCQkJCQlyZXR1cm47CisJCX0KKwkJaWYgKGkgPT0gRVhUMl9CQURfSU5PIHx8CisJCSAgICAoaSA+IEVYVDJfUk9PVF9JTk8gJiYgaSA8IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCEoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsIGkpKSB8fAorCQkgICAgKGN0eC0+aW5vZGVfaW1hZ2ljX21hcCAmJgorCQkgICAgIGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2ltYWdpY19tYXAsIGkpKSkKKwkJCWNvbnRpbnVlOworCQlleHQyZnNfaWNvdW50X2ZldGNoKGN0eC0+aW5vZGVfbGlua19pbmZvLCBpLCAmbGlua19jb3VudCk7CisJCWV4dDJmc19pY291bnRfZmV0Y2goY3R4LT5pbm9kZV9jb3VudCwgaSwgJmxpbmtfY291bnRlZCk7CisJCWlmIChsaW5rX2NvdW50ZWQgPT0gMCkgeworCQkJaWYgKCFidWYpCisJCQkJYnVmID0gZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJCQkJICAgICBmcy0+YmxvY2tzaXplLCAiYmFkX2lub2RlIGJ1ZmZlciIpOworCQkJaWYgKGUyZnNja19wcm9jZXNzX2JhZF9pbm9kZShjdHgsIDAsIGksIGJ1ZikpCisJCQkJY29udGludWU7CisJCQlpZiAoZGlzY29ubmVjdF9pbm9kZShjdHgsIGkpKQorCQkJCWNvbnRpbnVlOworCQkJZXh0MmZzX2ljb3VudF9mZXRjaChjdHgtPmlub2RlX2xpbmtfaW5mbywgaSwKKwkJCQkJICAgICZsaW5rX2NvdW50KTsKKwkJCWV4dDJmc19pY291bnRfZmV0Y2goY3R4LT5pbm9kZV9jb3VudCwgaSwKKwkJCQkJICAgICZsaW5rX2NvdW50ZWQpOworCQl9CisJCWlmIChsaW5rX2NvdW50ZWQgIT0gbGlua19jb3VudCkgeworCQkJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpLCAmaW5vZGUsICJwYXNzNCIpOworCQkJcGN0eC5pbm8gPSBpOworCQkJcGN0eC5pbm9kZSA9ICZpbm9kZTsKKwkJCWlmIChsaW5rX2NvdW50ICE9IGlub2RlLmlfbGlua3NfY291bnQpIHsKKwkJCQlwY3R4Lm51bSA9IGxpbmtfY291bnQ7CisJCQkJZml4X3Byb2JsZW0oY3R4LAorCQkJCQkgICAgUFJfNF9JTkNPTlNJU1RFTlRfQ09VTlQsICZwY3R4KTsKKwkJCX0KKwkJCXBjdHgubnVtID0gbGlua19jb3VudGVkOworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfNF9CQURfUkVGX0NPVU5ULCAmcGN0eCkpIHsKKwkJCQlpbm9kZS5pX2xpbmtzX2NvdW50ID0gbGlua19jb3VudGVkOworCQkJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGksICZpbm9kZSwgInBhc3M0Iik7CisJCQl9CisJCX0KKwl9CisJZXh0MmZzX2ZyZWVfaWNvdW50KGN0eC0+aW5vZGVfbGlua19pbmZvKTsgY3R4LT5pbm9kZV9saW5rX2luZm8gPSAwOworCWV4dDJmc19mcmVlX2ljb3VudChjdHgtPmlub2RlX2NvdW50KTsgY3R4LT5pbm9kZV9jb3VudCA9IDA7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfaW1hZ2ljX21hcCk7CisJY3R4LT5pbm9kZV9pbWFnaWNfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7Cit9CisKKy8qCisgKiBwYXNzNS5jIC0tLSBjaGVjayBibG9jayBhbmQgaW5vZGUgYml0bWFwcyBhZ2FpbnN0IG9uLWRpc2sgYml0bWFwcworICovCisKKyNkZWZpbmUgTk9fQkxLICgoYmxrX3QpIC0xKQorCitzdGF0aWMgdm9pZCBwcmludF9iaXRtYXBfcHJvYmxlbShlMmZzY2tfdCBjdHgsIGludCBwcm9ibGVtLAorCQkJICAgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpCit7CisJc3dpdGNoIChwcm9ibGVtKSB7CisJY2FzZSBQUl81X0JMT0NLX1VOVVNFRDoKKwkJaWYgKHBjdHgtPmJsayA9PSBwY3R4LT5ibGsyKQorCQkJcGN0eC0+YmxrMiA9IDA7CisJCWVsc2UKKwkJCXByb2JsZW0gPSBQUl81X0JMT0NLX1JBTkdFX1VOVVNFRDsKKwkJYnJlYWs7CisJY2FzZSBQUl81X0JMT0NLX1VTRUQ6CisJCWlmIChwY3R4LT5ibGsgPT0gcGN0eC0+YmxrMikKKwkJCXBjdHgtPmJsazIgPSAwOworCQllbHNlCisJCQlwcm9ibGVtID0gUFJfNV9CTE9DS19SQU5HRV9VU0VEOworCQlicmVhazsKKwljYXNlIFBSXzVfSU5PREVfVU5VU0VEOgorCQlpZiAocGN0eC0+aW5vID09IHBjdHgtPmlubzIpCisJCQlwY3R4LT5pbm8yID0gMDsKKwkJZWxzZQorCQkJcHJvYmxlbSA9IFBSXzVfSU5PREVfUkFOR0VfVU5VU0VEOworCQlicmVhazsKKwljYXNlIFBSXzVfSU5PREVfVVNFRDoKKwkJaWYgKHBjdHgtPmlubyA9PSBwY3R4LT5pbm8yKQorCQkJcGN0eC0+aW5vMiA9IDA7CisJCWVsc2UKKwkJCXByb2JsZW0gPSBQUl81X0lOT0RFX1JBTkdFX1VTRUQ7CisJCWJyZWFrOworCX0KKwlmaXhfcHJvYmxlbShjdHgsIHByb2JsZW0sIHBjdHgpOworCXBjdHgtPmJsayA9IHBjdHgtPmJsazIgPSBOT19CTEs7CisJcGN0eC0+aW5vID0gcGN0eC0+aW5vMiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2Jsb2NrX2JpdG1hcHMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlibGtfdCAgIGk7CisJaW50ICAgICAqZnJlZV9hcnJheTsKKwlpbnQgICAgIGdyb3VwID0gMDsKKwl1bnNpZ25lZCBpbnQgICAgYmxvY2tzID0gMDsKKwl1bnNpZ25lZCBpbnQgICAgZnJlZV9ibG9ja3MgPSAwOworCWludCAgICAgZ3JvdXBfZnJlZSA9IDA7CisJaW50ICAgICBhY3R1YWwsIGJpdG1hcDsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCWludCAgICAgcHJvYmxlbSwgc2F2ZV9wcm9ibGVtLCBmaXhpdCwgaGFkX3Byb2JsZW07CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJZnJlZV9hcnJheSA9IChpbnQgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJICAgIGZzLT5ncm91cF9kZXNjX2NvdW50ICogc2l6ZW9mKGludCksICJmcmVlIGJsb2NrIGNvdW50IGFycmF5Iik7CisKKwlpZiAoKGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrIDwKKwkgICAgIGV4dDJmc19nZXRfYmxvY2tfYml0bWFwX3N0YXJ0KGN0eC0+YmxvY2tfZm91bmRfbWFwKSkgfHwKKwkgICAgKGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQtMSA+CisJICAgICBleHQyZnNfZ2V0X2Jsb2NrX2JpdG1hcF9lbmQoY3R4LT5ibG9ja19mb3VuZF9tYXApKSkgeworCQlwY3R4Lm51bSA9IDE7CisJCXBjdHguYmxrID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJCXBjdHguYmxrMiA9IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgLTE7CisJCXBjdHguaW5vID0gZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfc3RhcnQoY3R4LT5ibG9ja19mb3VuZF9tYXApOworCQlwY3R4LmlubzIgPSBleHQyZnNfZ2V0X2Jsb2NrX2JpdG1hcF9lbmQoY3R4LT5ibG9ja19mb3VuZF9tYXApOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzVfQk1BUF9FTkRQT0lOVFMsICZwY3R4KTsKKworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBmYXRhbCAqLworCQlyZXR1cm47CisJfQorCisJaWYgKChmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayA8CisJICAgICBleHQyZnNfZ2V0X2Jsb2NrX2JpdG1hcF9zdGFydChmcy0+YmxvY2tfbWFwKSkgfHwKKwkgICAgKGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQtMSA+CisJICAgICBleHQyZnNfZ2V0X2Jsb2NrX2JpdG1hcF9lbmQoZnMtPmJsb2NrX21hcCkpKSB7CisJCXBjdHgubnVtID0gMjsKKwkJcGN0eC5ibGsgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jazsKKwkJcGN0eC5ibGsyID0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCAtMTsKKwkJcGN0eC5pbm8gPSBleHQyZnNfZ2V0X2Jsb2NrX2JpdG1hcF9zdGFydChmcy0+YmxvY2tfbWFwKTsKKwkJcGN0eC5pbm8yID0gZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfZW5kKGZzLT5ibG9ja19tYXApOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzVfQk1BUF9FTkRQT0lOVFMsICZwY3R4KTsKKworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBmYXRhbCAqLworCQlyZXR1cm47CisJfQorCityZWRvX2NvdW50czoKKwloYWRfcHJvYmxlbSA9IDA7CisJc2F2ZV9wcm9ibGVtID0gMDsKKwlwY3R4LmJsayA9IHBjdHguYmxrMiA9IE5PX0JMSzsKKwlmb3IgKGkgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jazsKKwkgICAgIGkgPCBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50OworCSAgICAgaSsrKSB7CisJCWFjdHVhbCA9IGV4dDJmc19mYXN0X3Rlc3RfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLCBpKTsKKwkJYml0bWFwID0gZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgaSk7CisKKwkJaWYgKGFjdHVhbCA9PSBiaXRtYXApCisJCQlnb3RvIGRvX2NvdW50czsKKworCQlpZiAoIWFjdHVhbCAmJiBiaXRtYXApIHsKKwkJCS8qCisJCQkgKiBCbG9jayBub3QgdXNlZCwgYnV0IG1hcmtlZCBpbiB1c2UgaW4gdGhlIGJpdG1hcC4KKwkJCSAqLworCQkJcHJvYmxlbSA9IFBSXzVfQkxPQ0tfVU5VU0VEOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEJsb2NrIHVzZWQsIGJ1dCBub3QgbWFya2VkIGluIHVzZSBpbiB0aGUgYml0bWFwLgorCQkJICovCisJCQlwcm9ibGVtID0gUFJfNV9CTE9DS19VU0VEOworCQl9CisJCWlmIChwY3R4LmJsayA9PSBOT19CTEspIHsKKwkJCXBjdHguYmxrID0gcGN0eC5ibGsyID0gaTsKKwkJCXNhdmVfcHJvYmxlbSA9IHByb2JsZW07CisJCX0gZWxzZSB7CisJCQlpZiAoKHByb2JsZW0gPT0gc2F2ZV9wcm9ibGVtKSAmJgorCQkJICAgIChwY3R4LmJsazIgPT0gaS0xKSkKKwkJCQlwY3R4LmJsazIrKzsKKwkJCWVsc2UgeworCQkJCXByaW50X2JpdG1hcF9wcm9ibGVtKGN0eCwgc2F2ZV9wcm9ibGVtLCAmcGN0eCk7CisJCQkJcGN0eC5ibGsgPSBwY3R4LmJsazIgPSBpOworCQkJCXNhdmVfcHJvYmxlbSA9IHByb2JsZW07CisJCQl9CisJCX0KKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19QUk9HX1NVUFBSRVNTOworCQloYWRfcHJvYmxlbSsrOworCisJZG9fY291bnRzOgorCQlpZiAoIWJpdG1hcCkgeworCQkJZ3JvdXBfZnJlZSsrOworCQkJZnJlZV9ibG9ja3MrKzsKKwkJfQorCQlibG9ja3MgKys7CisJCWlmICgoYmxvY2tzID09IGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKSB8fAorCQkgICAgKGkgPT0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudC0xKSkgeworCQkJZnJlZV9hcnJheVtncm91cF0gPSBncm91cF9mcmVlOworCQkJZ3JvdXAgKys7CisJCQlibG9ja3MgPSAwOworCQkJZ3JvdXBfZnJlZSA9IDA7CisJCQlpZiAoY3R4LT5wcm9ncmVzcykKKwkJCQlpZiAoKGN0eC0+cHJvZ3Jlc3MpKGN0eCwgNSwgZ3JvdXAsCisJCQkJCQkgICAgZnMtPmdyb3VwX2Rlc2NfY291bnQqMikpCisJCQkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAocGN0eC5ibGsgIT0gTk9fQkxLKQorCQlwcmludF9iaXRtYXBfcHJvYmxlbShjdHgsIHNhdmVfcHJvYmxlbSwgJnBjdHgpOworCWlmIChoYWRfcHJvYmxlbSkKKwkJZml4aXQgPSBlbmRfcHJvYmxlbV9sYXRjaChjdHgsIFBSX0xBVENIX0JCSVRNQVApOworCWVsc2UKKwkJZml4aXQgPSAtMTsKKwljdHgtPmZsYWdzICY9IH5FMkZfRkxBR19QUk9HX1NVUFBSRVNTOworCisJaWYgKGZpeGl0ID09IDEpIHsKKwkJZXh0MmZzX2ZyZWVfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXApOworCQlyZXR2YWwgPSBleHQyZnNfY29weV9iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsCisJCQkJCQkgICZmcy0+YmxvY2tfbWFwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfNV9DT1BZX0JCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQlyZXR1cm47CisJCX0KKwkJZXh0MmZzX3NldF9iaXRtYXBfcGFkZGluZyhmcy0+YmxvY2tfbWFwKTsKKwkJZXh0MmZzX21hcmtfYmJfZGlydHkoZnMpOworCisJCS8qIFJlZG8gdGhlIGNvdW50cyAqLworCQlibG9ja3MgPSAwOyBmcmVlX2Jsb2NrcyA9IDA7IGdyb3VwX2ZyZWUgPSAwOyBncm91cCA9IDA7CisJCW1lbXNldChmcmVlX2FycmF5LCAwLCBmcy0+Z3JvdXBfZGVzY19jb3VudCAqIHNpemVvZihpbnQpKTsKKwkJZ290byByZWRvX2NvdW50czsKKwl9IGVsc2UgaWYgKGZpeGl0ID09IDApCisJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJaWYgKGZyZWVfYXJyYXlbaV0gIT0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfZnJlZV9ibG9ja3NfY291bnQpIHsKKwkJCXBjdHguZ3JvdXAgPSBpOworCQkJcGN0eC5ibGsgPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19mcmVlX2Jsb2Nrc19jb3VudDsKKwkJCXBjdHguYmxrMiA9IGZyZWVfYXJyYXlbaV07CisKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzVfRlJFRV9CTE9DS19DT1VOVF9HUk9VUCwKKwkJCQkJJnBjdHgpKSB7CisJCQkJZnMtPmdyb3VwX2Rlc2NbaV0uYmdfZnJlZV9ibG9ja3NfY291bnQgPQorCQkJCQlmcmVlX2FycmF5W2ldOworCQkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJCX0gZWxzZQorCQkJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCQl9CisJfQorCWlmIChmcmVlX2Jsb2NrcyAhPSBmcy0+c3VwZXItPnNfZnJlZV9ibG9ja3NfY291bnQpIHsKKwkJcGN0eC5ncm91cCA9IDA7CisJCXBjdHguYmxrID0gZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50OworCQlwY3R4LmJsazIgPSBmcmVlX2Jsb2NrczsKKworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl81X0ZSRUVfQkxPQ0tfQ09VTlQsICZwY3R4KSkgeworCQkJZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gZnJlZV9ibG9ja3M7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCX0gZWxzZQorCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJfQorCWV4dDJmc19mcmVlX21lbSgmZnJlZV9hcnJheSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2lub2RlX2JpdG1hcHMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlleHQyX2lub190ICAgICAgaTsKKwl1bnNpZ25lZCBpbnQgICAgZnJlZV9pbm9kZXMgPSAwOworCWludCAgICAgICAgICAgICBncm91cF9mcmVlID0gMDsKKwlpbnQgICAgICAgICAgICAgZGlyc19jb3VudCA9IDA7CisJaW50ICAgICAgICAgICAgIGdyb3VwID0gMDsKKwl1bnNpZ25lZCBpbnQgICAgaW5vZGVzID0gMDsKKwlpbnQgICAgICAgICAgICAgKmZyZWVfYXJyYXk7CisJaW50ICAgICAgICAgICAgICpkaXJfYXJyYXk7CisJaW50ICAgICAgICAgICAgIGFjdHVhbCwgYml0bWFwOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlpbnQgICAgICAgICAgICAgcHJvYmxlbSwgc2F2ZV9wcm9ibGVtLCBmaXhpdCwgaGFkX3Byb2JsZW07CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCWZyZWVfYXJyYXkgPSAoaW50ICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCSAgICBmcy0+Z3JvdXBfZGVzY19jb3VudCAqIHNpemVvZihpbnQpLCAiZnJlZSBpbm9kZSBjb3VudCBhcnJheSIpOworCisJZGlyX2FycmF5ID0gKGludCAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwKKwkgICBmcy0+Z3JvdXBfZGVzY19jb3VudCAqIHNpemVvZihpbnQpLCAiZGlyZWN0b3J5IGNvdW50IGFycmF5Iik7CisKKwlpZiAoKDEgPCBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9zdGFydChjdHgtPmlub2RlX3VzZWRfbWFwKSkgfHwKKwkgICAgKGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQgPgorCSAgICAgZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfZW5kKGN0eC0+aW5vZGVfdXNlZF9tYXApKSkgeworCQlwY3R4Lm51bSA9IDM7CisJCXBjdHguYmxrID0gMTsKKwkJcGN0eC5ibGsyID0gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudDsKKwkJcGN0eC5pbm8gPSBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9zdGFydChjdHgtPmlub2RlX3VzZWRfbWFwKTsKKwkJcGN0eC5pbm8yID0gZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfZW5kKGN0eC0+aW5vZGVfdXNlZF9tYXApOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzVfQk1BUF9FTkRQT0lOVFMsICZwY3R4KTsKKworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBmYXRhbCAqLworCQlyZXR1cm47CisJfQorCWlmICgoMSA8IGV4dDJmc19nZXRfaW5vZGVfYml0bWFwX3N0YXJ0KGZzLT5pbm9kZV9tYXApKSB8fAorCSAgICAoZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudCA+CisJICAgICBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9lbmQoZnMtPmlub2RlX21hcCkpKSB7CisJCXBjdHgubnVtID0gNDsKKwkJcGN0eC5ibGsgPSAxOworCQlwY3R4LmJsazIgPSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50OworCQlwY3R4LmlubyA9IGV4dDJmc19nZXRfaW5vZGVfYml0bWFwX3N0YXJ0KGZzLT5pbm9kZV9tYXApOworCQlwY3R4LmlubzIgPSBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9lbmQoZnMtPmlub2RlX21hcCk7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfNV9CTUFQX0VORFBPSU5UUywgJnBjdHgpOworCisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7IC8qIGZhdGFsICovCisJCXJldHVybjsKKwl9CisKK3JlZG9fY291bnRzOgorCWhhZF9wcm9ibGVtID0gMDsKKwlzYXZlX3Byb2JsZW0gPSAwOworCXBjdHguaW5vID0gcGN0eC5pbm8yID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQ7IGkrKykgeworCQlhY3R1YWwgPSBleHQyZnNfZmFzdF90ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpKTsKKwkJYml0bWFwID0gZXh0MmZzX2Zhc3RfdGVzdF9pbm9kZV9iaXRtYXAoZnMtPmlub2RlX21hcCwgaSk7CisKKwkJaWYgKGFjdHVhbCA9PSBiaXRtYXApCisJCQlnb3RvIGRvX2NvdW50czsKKworCQlpZiAoIWFjdHVhbCAmJiBiaXRtYXApIHsKKwkJCS8qCisJCQkgKiBJbm9kZSB3YXNuJ3QgdXNlZCwgYnV0IG1hcmtlZCBpbiBiaXRtYXAKKwkJCSAqLworCQkJcHJvYmxlbSA9IFBSXzVfSU5PREVfVU5VU0VEOworCQl9IGVsc2UgLyogaWYgKGFjdHVhbCAmJiAhYml0bWFwKSAqLyB7CisJCQkvKgorCQkJICogSW5vZGUgdXNlZCwgYnV0IG5vdCBpbiBiaXRtYXAKKwkJCSAqLworCQkJcHJvYmxlbSA9IFBSXzVfSU5PREVfVVNFRDsKKwkJfQorCQlpZiAocGN0eC5pbm8gPT0gMCkgeworCQkJcGN0eC5pbm8gPSBwY3R4LmlubzIgPSBpOworCQkJc2F2ZV9wcm9ibGVtID0gcHJvYmxlbTsKKwkJfSBlbHNlIHsKKwkJCWlmICgocHJvYmxlbSA9PSBzYXZlX3Byb2JsZW0pICYmCisJCQkgICAgKHBjdHguaW5vMiA9PSBpLTEpKQorCQkJCXBjdHguaW5vMisrOworCQkJZWxzZSB7CisJCQkJcHJpbnRfYml0bWFwX3Byb2JsZW0oY3R4LCBzYXZlX3Byb2JsZW0sICZwY3R4KTsKKwkJCQlwY3R4LmlubyA9IHBjdHguaW5vMiA9IGk7CisJCQkJc2F2ZV9wcm9ibGVtID0gcHJvYmxlbTsKKwkJCX0KKwkJfQorCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX1BST0dfU1VQUFJFU1M7CisJCWhhZF9wcm9ibGVtKys7CisKK2RvX2NvdW50czoKKwkJaWYgKCFiaXRtYXApIHsKKwkJCWdyb3VwX2ZyZWUrKzsKKwkJCWZyZWVfaW5vZGVzKys7CisJCX0gZWxzZSB7CisJCQlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgaSkpCisJCQkJZGlyc19jb3VudCsrOworCQl9CisJCWlub2RlcysrOworCQlpZiAoKGlub2RlcyA9PSBmcy0+c3VwZXItPnNfaW5vZGVzX3Blcl9ncm91cCkgfHwKKwkJICAgIChpID09IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpKSB7CisJCQlmcmVlX2FycmF5W2dyb3VwXSA9IGdyb3VwX2ZyZWU7CisJCQlkaXJfYXJyYXlbZ3JvdXBdID0gZGlyc19jb3VudDsKKwkJCWdyb3VwICsrOworCQkJaW5vZGVzID0gMDsKKwkJCWdyb3VwX2ZyZWUgPSAwOworCQkJZGlyc19jb3VudCA9IDA7CisJCQlpZiAoY3R4LT5wcm9ncmVzcykKKwkJCQlpZiAoKGN0eC0+cHJvZ3Jlc3MpKGN0eCwgNSwKKwkJCQkJICAgIGdyb3VwICsgZnMtPmdyb3VwX2Rlc2NfY291bnQsCisJCQkJCSAgICBmcy0+Z3JvdXBfZGVzY19jb3VudCoyKSkKKwkJCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChwY3R4LmlubykKKwkJcHJpbnRfYml0bWFwX3Byb2JsZW0oY3R4LCBzYXZlX3Byb2JsZW0sICZwY3R4KTsKKworCWlmIChoYWRfcHJvYmxlbSkKKwkJZml4aXQgPSBlbmRfcHJvYmxlbV9sYXRjaChjdHgsIFBSX0xBVENIX0lCSVRNQVApOworCWVsc2UKKwkJZml4aXQgPSAtMTsKKwljdHgtPmZsYWdzICY9IH5FMkZfRkxBR19QUk9HX1NVUFBSRVNTOworCisJaWYgKGZpeGl0ID09IDEpIHsKKwkJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGZzLT5pbm9kZV9tYXApOworCQlyZXR2YWwgPSBleHQyZnNfY29weV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwKKwkJCQkJCSAgJmZzLT5pbm9kZV9tYXApOworCQlpZiAocmV0dmFsKSB7CisJCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl81X0NPUFlfSUJJVE1BUF9FUlJPUiwgJnBjdHgpOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCQlleHQyZnNfc2V0X2JpdG1hcF9wYWRkaW5nKGZzLT5pbm9kZV9tYXApOworCQlleHQyZnNfbWFya19pYl9kaXJ0eShmcyk7CisKKwkJLyogcmVkbyBjb3VudHMgKi8KKwkJaW5vZGVzID0gMDsgZnJlZV9pbm9kZXMgPSAwOyBncm91cF9mcmVlID0gMDsKKwkJZGlyc19jb3VudCA9IDA7IGdyb3VwID0gMDsKKwkJbWVtc2V0KGZyZWVfYXJyYXksIDAsIGZzLT5ncm91cF9kZXNjX2NvdW50ICogc2l6ZW9mKGludCkpOworCQltZW1zZXQoZGlyX2FycmF5LCAwLCBmcy0+Z3JvdXBfZGVzY19jb3VudCAqIHNpemVvZihpbnQpKTsKKwkJZ290byByZWRvX2NvdW50czsKKwl9IGVsc2UgaWYgKGZpeGl0ID09IDApCisJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJaWYgKGZyZWVfYXJyYXlbaV0gIT0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQpIHsKKwkJCXBjdHguZ3JvdXAgPSBpOworCQkJcGN0eC5pbm8gPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19mcmVlX2lub2Rlc19jb3VudDsKKwkJCXBjdHguaW5vMiA9IGZyZWVfYXJyYXlbaV07CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl81X0ZSRUVfSU5PREVfQ09VTlRfR1JPVVAsCisJCQkJCSZwY3R4KSkgeworCQkJCWZzLT5ncm91cF9kZXNjW2ldLmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0KKwkJCQkJZnJlZV9hcnJheVtpXTsKKwkJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCQl9IGVsc2UKKwkJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwkJfQorCQlpZiAoZGlyX2FycmF5W2ldICE9IGZzLT5ncm91cF9kZXNjW2ldLmJnX3VzZWRfZGlyc19jb3VudCkgeworCQkJcGN0eC5ncm91cCA9IGk7CisJCQlwY3R4LmlubyA9IGZzLT5ncm91cF9kZXNjW2ldLmJnX3VzZWRfZGlyc19jb3VudDsKKwkJCXBjdHguaW5vMiA9IGRpcl9hcnJheVtpXTsKKworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfNV9GUkVFX0RJUl9DT1VOVF9HUk9VUCwKKwkJCQkJJnBjdHgpKSB7CisJCQkJZnMtPmdyb3VwX2Rlc2NbaV0uYmdfdXNlZF9kaXJzX2NvdW50ID0KKwkJCQkJZGlyX2FycmF5W2ldOworCQkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJCX0gZWxzZQorCQkJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCQl9CisJfQorCWlmIChmcmVlX2lub2RlcyAhPSBmcy0+c3VwZXItPnNfZnJlZV9pbm9kZXNfY291bnQpIHsKKwkJcGN0eC5ncm91cCA9IC0xOworCQlwY3R4LmlubyA9IGZzLT5zdXBlci0+c19mcmVlX2lub2Rlc19jb3VudDsKKwkJcGN0eC5pbm8yID0gZnJlZV9pbm9kZXM7CisKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfNV9GUkVFX0lOT0RFX0NPVU5ULCAmcGN0eCkpIHsKKwkJCWZzLT5zdXBlci0+c19mcmVlX2lub2Rlc19jb3VudCA9IGZyZWVfaW5vZGVzOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQl9IGVsc2UKKwkJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJmZyZWVfYXJyYXkpOworCWV4dDJmc19mcmVlX21lbSgmZGlyX2FycmF5KTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfaW5vZGVfZW5kKGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXh0Ml9pbm9fdCAgICAgIGVuZCwgc2F2ZV9pbm9kZXNfY291bnQsIGk7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwllbmQgPSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAqIGZzLT5ncm91cF9kZXNjX2NvdW50OworCXBjdHguZXJyY29kZSA9IGV4dDJmc19mdWRnZV9pbm9kZV9iaXRtYXBfZW5kKGZzLT5pbm9kZV9tYXAsIGVuZCwKKwkJCQkJCSAgICAgJnNhdmVfaW5vZGVzX2NvdW50KTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHgubnVtID0gMTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl81X0ZVREdFX0JJVE1BUF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBmYXRhbCAqLworCQlyZXR1cm47CisJfQorCWlmIChzYXZlX2lub2Rlc19jb3VudCA9PSBlbmQpCisJCXJldHVybjsKKworCWZvciAoaSA9IHNhdmVfaW5vZGVzX2NvdW50ICsgMTsgaSA8PSBlbmQ7IGkrKykgeworCQlpZiAoIWV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwLCBpKSkgeworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfNV9JTk9ERV9CTUFQX1BBRERJTkcsICZwY3R4KSkgeworCQkJCWZvciAoaSA9IHNhdmVfaW5vZGVzX2NvdW50ICsgMTsgaSA8PSBlbmQ7IGkrKykKKwkJCQkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGZzLT5pbm9kZV9tYXAsCisJCQkJCQkJCSBpKTsKKwkJCQlleHQyZnNfbWFya19pYl9kaXJ0eShmcyk7CisJCQl9IGVsc2UKKwkJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2Z1ZGdlX2lub2RlX2JpdG1hcF9lbmQoZnMtPmlub2RlX21hcCwKKwkJCQkJCSAgICAgc2F2ZV9pbm9kZXNfY291bnQsIDApOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5udW0gPSAyOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzVfRlVER0VfQklUTUFQX0VSUk9SLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7IC8qIGZhdGFsICovCisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2Jsb2NrX2VuZChlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWJsa190ICAgZW5kLCBzYXZlX2Jsb2Nrc19jb3VudCwgaTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWVuZCA9IGZzLT5ibG9ja19tYXAtPnN0YXJ0ICsKKwkJKEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChmcy0+c3VwZXIpICogZnMtPmdyb3VwX2Rlc2NfY291bnQpIC0gMTsKKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfZnVkZ2VfYmxvY2tfYml0bWFwX2VuZChmcy0+YmxvY2tfbWFwLCBlbmQsCisJCQkJCQkgICAgICZzYXZlX2Jsb2Nrc19jb3VudCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4Lm51bSA9IDM7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfNV9GVURHRV9CSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsgLyogZmF0YWwgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoc2F2ZV9ibG9ja3NfY291bnQgPT0gZW5kKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSBzYXZlX2Jsb2Nrc19jb3VudCArIDE7IGkgPD0gZW5kOyBpKyspIHsKKwkJaWYgKCFleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgaSkpIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzVfQkxPQ0tfQk1BUF9QQURESU5HLCAmcGN0eCkpIHsKKwkJCQlmb3IgKGkgPSBzYXZlX2Jsb2Nrc19jb3VudCArIDE7IGkgPD0gZW5kOyBpKyspCisJCQkJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChmcy0+YmxvY2tfbWFwLAorCQkJCQkJCQkgaSk7CisJCQkJZXh0MmZzX21hcmtfYmJfZGlydHkoZnMpOworCQkJfSBlbHNlCisJCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXBjdHguZXJyY29kZSA9IGV4dDJmc19mdWRnZV9ibG9ja19iaXRtYXBfZW5kKGZzLT5ibG9ja19tYXAsCisJCQkJCQkgICAgIHNhdmVfYmxvY2tzX2NvdW50LCAwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHgubnVtID0gNDsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl81X0ZVREdFX0JJVE1BUF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBmYXRhbCAqLworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCBlMmZzY2tfcGFzczUoZTJmc2NrX3QgY3R4KQoreworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisKKwkvKiBQYXNzIDUgKi8KKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl81X1BBU1NfSEVBREVSLCAmcGN0eCk7CisKKwlpZiAoY3R4LT5wcm9ncmVzcykKKwkJaWYgKChjdHgtPnByb2dyZXNzKShjdHgsIDUsIDAsIGN0eC0+ZnMtPmdyb3VwX2Rlc2NfY291bnQqMikpCisJCQlyZXR1cm47CisKKwllMmZzY2tfcmVhZF9iaXRtYXBzKGN0eCk7CisKKwljaGVja19ibG9ja19iaXRtYXBzKGN0eCk7CisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJcmV0dXJuOworCWNoZWNrX2lub2RlX2JpdG1hcHMoY3R4KTsKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQlyZXR1cm47CisJY2hlY2tfaW5vZGVfZW5kKGN0eCk7CisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJcmV0dXJuOworCWNoZWNrX2Jsb2NrX2VuZChjdHgpOworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCXJldHVybjsKKworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwKTsKKwljdHgtPmlub2RlX3VzZWRfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwKTsKKwljdHgtPmlub2RlX2Rpcl9tYXAgPSAwOworCWV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCk7CisJY3R4LT5ibG9ja19mb3VuZF9tYXAgPSAwOworfQorCisvKgorICogcHJvYmxlbS5jIC0tLSByZXBvcnQgZmlsZXN5c3RlbSBwcm9ibGVtcyB0byB0aGUgdXNlcgorICovCisKKyNkZWZpbmUgUFJfUFJFRU5fT0sgICAgIDB4MDAwMDAxIC8qIERvbid0IG5lZWQgdG8gZG8gcHJlZW5oYWx0ICovCisjZGVmaW5lIFBSX05PX09LICAgICAgICAweDAwMDAwMiAvKiBJZiB1c2VyIGFuc3dlcnMgbm8sIGRvbid0IG1ha2UgZnMgaW52YWxpZCAqLworI2RlZmluZSBQUl9OT19ERUZBVUxUICAgMHgwMDAwMDQgLyogRGVmYXVsdCB0byBubyAqLworI2RlZmluZSBQUl9NU0dfT05MWSAgICAgMHgwMDAwMDggLyogUHJpbnQgbWVzc2FnZSBvbmx5ICovCisKKy8qIEJpdCBwb3NpdGlvbnMgMHgwMDBmZjAgYXJlIHJlc2VydmVkIGZvciB0aGUgUFJfTEFUQ0ggZmxhZ3MgKi8KKworI2RlZmluZSBQUl9GQVRBTCAgICAgICAgMHgwMDEwMDAgLyogRmF0YWwgZXJyb3IgKi8KKyNkZWZpbmUgUFJfQUZURVJfQ09ERSAgIDB4MDAyMDAwIC8qIEFmdGVyIGFza2luZyB0aGUgZmlyc3QgcXVlc3Rpb24sICovCisJCQkJIC8qIGFzayBhbm90aGVyICovCisjZGVmaW5lIFBSX1BSRUVOX05PTVNHICAweDAwNDAwMCAvKiBEb24ndCBwcmludCBhIG1lc3NhZ2UgaWYgd2UncmUgcHJlZW5pbmcgKi8KKyNkZWZpbmUgUFJfTk9DT0xMQVRFICAgIDB4MDA4MDAwIC8qIERvbid0IGNvbGxhdGUgYW5zd2VycyBmb3IgdGhpcyBsYXRjaCAqLworI2RlZmluZSBQUl9OT19OT01TRyAgICAgMHgwMTAwMDAgLyogRG9uJ3QgcHJpbnQgYSBtZXNzYWdlIGlmIGUyZnNjayAtbiAqLworI2RlZmluZSBQUl9QUkVFTl9OTyAgICAgMHgwMjAwMDAgLyogVXNlIE5vIGFzIGFuIGFuc3dlciBpZiBwcmVlbmluZyAqLworI2RlZmluZSBQUl9QUkVFTl9OT0hEUiAgMHgwNDAwMDAgLyogRG9uJ3QgcHJpbnQgdGhlIHByZWVuIGhlYWRlciAqLworCisKKyNkZWZpbmUgUFJPTVBUX05PTkUgICAgIDAKKyNkZWZpbmUgUFJPTVBUX0ZJWCAgICAgIDEKKyNkZWZpbmUgUFJPTVBUX0NMRUFSICAgIDIKKyNkZWZpbmUgUFJPTVBUX1JFTE9DQVRFIDMKKyNkZWZpbmUgUFJPTVBUX0FMTE9DQVRFIDQKKyNkZWZpbmUgUFJPTVBUX0VYUEFORCAgIDUKKyNkZWZpbmUgUFJPTVBUX0NPTk5FQ1QgIDYKKyNkZWZpbmUgUFJPTVBUX0NSRUFURSAgIDcKKyNkZWZpbmUgUFJPTVBUX1NBTFZBR0UgIDgKKyNkZWZpbmUgUFJPTVBUX1RSVU5DQVRFIDkKKyNkZWZpbmUgUFJPTVBUX0NMRUFSX0lOT0RFIDEwCisjZGVmaW5lIFBST01QVF9BQk9SVCAgICAxMQorI2RlZmluZSBQUk9NUFRfU1BMSVQgICAgMTIKKyNkZWZpbmUgUFJPTVBUX0NPTlRJTlVFIDEzCisjZGVmaW5lIFBST01QVF9DTE9ORSAgICAxNAorI2RlZmluZSBQUk9NUFRfREVMRVRFICAgMTUKKyNkZWZpbmUgUFJPTVBUX1NVUFBSRVNTIDE2CisjZGVmaW5lIFBST01QVF9VTkxJTksgICAxNworI2RlZmluZSBQUk9NUFRfQ0xFQVJfSFRSRUUgMTgKKyNkZWZpbmUgUFJPTVBUX1JFQ1JFQVRFIDE5CisjZGVmaW5lIFBST01QVF9OVUxMICAgICAyMAorCitzdHJ1Y3QgZTJmc2NrX3Byb2JsZW0geworCXByb2JsZW1fdCAgICAgICBlMnBfY29kZTsKKwljb25zdCBjaGFyICogICAgZTJwX2Rlc2NyaXB0aW9uOworCWNoYXIgICAgICAgICAgICBwcm9tcHQ7CisJaW50ICAgICAgICAgICAgIGZsYWdzOworCXByb2JsZW1fdCAgICAgICBzZWNvbmRfY29kZTsKK307CisKK3N0cnVjdCBsYXRjaF9kZXNjciB7CisJaW50ICAgICAgICAgICAgIGxhdGNoX2NvZGU7CisJcHJvYmxlbV90ICAgICAgIHF1ZXN0aW9uOworCXByb2JsZW1fdCAgICAgICBlbmRfbWVzc2FnZTsKKwlpbnQgICAgICAgICAgICAgZmxhZ3M7Cit9OworCisvKgorICogVGhlc2UgYXJlIHRoZSBwcm9tcHRzIHdoaWNoIGFyZSB1c2VkIHRvIGFzayB0aGUgdXNlciBpZiB0aGV5IHdhbnQKKyAqIHRvIGZpeCBhIHByb2JsZW0uCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwcm9tcHRbXSA9IHsKKwlOXygiKG5vIHByb21wdCkiKSwgICAgICAvKiAwICovCisJTl8oIkZpeCIpLCAgICAgICAgICAgICAgLyogMSAqLworCU5fKCJDbGVhciIpLCAgICAgICAgICAgIC8qIDIgKi8KKwlOXygiUmVsb2NhdGUiKSwgICAgICAgICAvKiAzICovCisJTl8oIkFsbG9jYXRlIiksICAgICAgICAgLyogNCAqLworCU5fKCJFeHBhbmQiKSwgICAgICAgICAgIC8qIDUgKi8KKwlOXygiQ29ubmVjdCB0byAvbG9zdCtmb3VuZCIpLCAvKiA2ICovCisJTl8oIkNyZWF0ZSIpLCAgICAgICAgICAgLyogNyAqLworCU5fKCJTYWx2YWdlIiksICAgICAgICAgIC8qIDggKi8KKwlOXygiVHJ1bmNhdGUiKSwgICAgICAgICAvKiA5ICovCisJTl8oIkNsZWFyIGlub2RlIiksICAgICAgLyogMTAgKi8KKwlOXygiQWJvcnQiKSwgICAgICAgICAgICAvKiAxMSAqLworCU5fKCJTcGxpdCIpLCAgICAgICAgICAgIC8qIDEyICovCisJTl8oIkNvbnRpbnVlIiksICAgICAgICAgLyogMTMgKi8KKwlOXygiQ2xvbmUgbXVsdGlwbHktY2xhaW1lZCBibG9ja3MiKSwgLyogMTQgKi8KKwlOXygiRGVsZXRlIGZpbGUiKSwgICAgICAvKiAxNSAqLworCU5fKCJTdXBwcmVzcyBtZXNzYWdlcyIpLC8qIDE2ICovCisJTl8oIlVubGluayIpLCAgICAgICAgICAgLyogMTcgKi8KKwlOXygiQ2xlYXIgSFRyZWUgaW5kZXgiKSwvKiAxOCAqLworCU5fKCJSZWNyZWF0ZSIpLCAgICAgICAgIC8qIDE5ICovCisJIiIsICAgICAgICAgICAgICAgICAgICAgLyogMjAgKi8KK307CisKKy8qCisgKiBUaGVzZSBtZXNzYWdlcyBhcmUgcHJpbnRlZCB3aGVuIHdlIGFyZSBwcmVlbiBtb2RlIGFuZCB3ZSB3aWxsIGJlCisgKiBhdXRvbWF0aWNhbGx5IGZpeGluZyB0aGUgcHJvYmxlbS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHByZWVuX21zZ1tdID0geworCU5fKCIoTk9ORSkiKSwgICAgICAgICAgIC8qIDAgKi8KKwlOXygiRklYRUQiKSwgICAgICAgICAgICAvKiAxICovCisJTl8oIkNMRUFSRUQiKSwgICAgICAgICAgLyogMiAqLworCU5fKCJSRUxPQ0FURUQiKSwgICAgICAgIC8qIDMgKi8KKwlOXygiQUxMT0NBVEVEIiksICAgICAgICAvKiA0ICovCisJTl8oIkVYUEFOREVEIiksICAgICAgICAgLyogNSAqLworCU5fKCJSRUNPTk5FQ1RFRCIpLCAgICAgIC8qIDYgKi8KKwlOXygiQ1JFQVRFRCIpLCAgICAgICAgICAvKiA3ICovCisJTl8oIlNBTFZBR0VEIiksICAgICAgICAgLyogOCAqLworCU5fKCJUUlVOQ0FURUQiKSwgICAgICAgIC8qIDkgKi8KKwlOXygiSU5PREUgQ0xFQVJFRCIpLCAgICAvKiAxMCAqLworCU5fKCJBQk9SVEVEIiksICAgICAgICAgIC8qIDExICovCisJTl8oIlNQTElUIiksICAgICAgICAgICAgLyogMTIgKi8KKwlOXygiQ09OVElOVUlORyIpLCAgICAgICAvKiAxMyAqLworCU5fKCJNVUxUSVBMWS1DTEFJTUVEIEJMT0NLUyBDTE9ORUQiKSwgLyogMTQgKi8KKwlOXygiRklMRSBERUxFVEVEIiksICAgICAvKiAxNSAqLworCU5fKCJTVVBQUkVTU0VEIiksICAgICAgIC8qIDE2ICovCisJTl8oIlVOTElOS0VEIiksICAgICAgICAgLyogMTcgKi8KKwlOXygiSFRSRUUgSU5ERVggQ0xFQVJFRCIpLC8qIDE4ICovCisJTl8oIldJTEwgUkVDUkVBVEUiKSwgICAgLyogMTkgKi8KKwkiIiwgICAgICAgICAgICAgICAgICAgICAvKiAyMCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlMmZzY2tfcHJvYmxlbSBwcm9ibGVtX3RhYmxlW10gPSB7CisKKwkvKiBQcmUtUGFzcyAxIGVycm9ycyAqLworCisJLyogQmxvY2sgYml0bWFwIG5vdCBpbiBncm91cCAqLworCXsgUFJfMF9CQl9OT1RfR1JPVVAsIE5fKCJAYiBAQiBmb3IgQGcgJWcgaXMgbm90IGluIEBnLiAgKEBiICViKVxuIiksCisJICBQUk9NUFRfUkVMT0NBVEUsIFBSX0xBVENIX1JFTE9DIH0sCisKKwkvKiBJbm9kZSBiaXRtYXAgbm90IGluIGdyb3VwICovCisJeyBQUl8wX0lCX05PVF9HUk9VUCwgTl8oIkBpIEBCIGZvciBAZyAlZyBpcyBub3QgaW4gQGcuICAoQGIgJWIpXG4iKSwKKwkgIFBST01QVF9SRUxPQ0FURSwgUFJfTEFUQ0hfUkVMT0MgfSwKKworCS8qIElub2RlIHRhYmxlIG5vdCBpbiBncm91cCAqLworCXsgUFJfMF9JVEFCTEVfTk9UX0dST1VQLAorCSAgTl8oIkBpIHRhYmxlIGZvciBAZyAlZyBpcyBub3QgaW4gQGcuICAoQGIgJWIpXG4iCisJICAiV0FSTklORzogU0VWRVJFIERBVEEgTE9TUyBQT1NTSUJMRS5cbiIpLAorCSAgUFJPTVBUX1JFTE9DQVRFLCBQUl9MQVRDSF9SRUxPQyB9LAorCisJLyogU3VwZXJibG9jayBjb3JydXB0ICovCisJeyBQUl8wX1NCX0NPUlJVUFQsCisJICBOXygiXG5UaGUgQFMgY291bGQgbm90IGJlIHJlYWQgb3IgZG9lcyBub3QgZGVzY3JpYmUgYSBjb3JyZWN0IGV4dDJcbiIKKwkgICJAZi4gIElmIHRoZSBAdiBpcyB2YWxpZCBhbmQgaXQgcmVhbGx5IGNvbnRhaW5zIGFuIGV4dDJcbiIKKwkgICJAZiAoYW5kIG5vdCBzd2FwIG9yIHVmcyBvciBzb21ldGhpbmcgZWxzZSksIHRoZW4gdGhlIEBTXG4iCisJICAiaXMgY29ycnVwdCwgYW5kIHlvdSBtaWdodCB0cnkgcnVubmluZyBlMmZzY2sgd2l0aCBhbiBhbHRlcm5hdGUgQFM6XG4iCisJICAiICAgIGUyZnNjayAtYiAlUyA8QHY+XG5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBGaWxlc3lzdGVtIHNpemUgaXMgd3JvbmcgKi8KKwl7IFBSXzBfRlNfU0laRV9XUk9ORywKKwkgIE5fKCJUaGUgQGYgc2l6ZSAoYWNjb3JkaW5nIHRvIHRoZSBAUykgaXMgJWIgQGJzXG4iCisJICAiVGhlIHBoeXNpY2FsIHNpemUgb2YgdGhlIEB2IGlzICVjIEBic1xuIgorCSAgIkVpdGhlciB0aGUgQFMgb3IgdGhlIHBhcnRpdGlvbiB0YWJsZSBpcyBsaWtlbHkgdG8gYmUgY29ycnVwdCFcbiIpLAorCSAgUFJPTVBUX0FCT1JULCAwIH0sCisKKwkvKiBGcmFnbWVudHMgbm90IHN1cHBvcnRlZCAqLworCXsgUFJfMF9OT19GUkFHTUVOVFMsCisJICBOXygiQFMgQGJfc2l6ZSA9ICViLCBmcmFnc2l6ZSA9ICVjLlxuIgorCSAgIlRoaXMgdmVyc2lvbiBvZiBlMmZzY2sgZG9lcyBub3Qgc3VwcG9ydCBmcmFnbWVudCBzaXplcyBkaWZmZXJlbnRcbiIKKwkgICJmcm9tIHRoZSBAYiBzaXplLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCSAgLyogQmFkIGJsb2Nrc19wZXJfZ3JvdXAgKi8KKwl7IFBSXzBfQkxPQ0tTX1BFUl9HUk9VUCwKKwkgIE5fKCJAUyBAYnNfcGVyX2dyb3VwID0gJWIsIHNob3VsZCBoYXZlIGJlZW4gJWNcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0FGVEVSX0NPREUsIFBSXzBfU0JfQ09SUlVQVCB9LAorCisJLyogQmFkIGZpcnN0X2RhdGFfYmxvY2sgKi8KKwl7IFBSXzBfRklSU1RfREFUQV9CTE9DSywKKwkgIE5fKCJAUyBmaXJzdF9kYXRhX0BiID0gJWIsIHNob3VsZCBoYXZlIGJlZW4gJWNcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0FGVEVSX0NPREUsIFBSXzBfU0JfQ09SUlVQVCB9LAorCisJLyogQWRkaW5nIFVVSUQgdG8gZmlsZXN5c3RlbSAqLworCXsgUFJfMF9BRERfVVVJRCwKKwkgIE5fKCJAZiBkaWQgbm90IGhhdmUgYSBVVUlEOyBnZW5lcmF0aW5nIG9uZS5cblxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogUmVsb2NhdGUgaGludCAqLworCXsgUFJfMF9SRUxPQ0FURV9ISU5ULAorCSAgTl8oIk5vdGU6IGlmIHNldmVyYWwgaW5vZGUgb3IgYmxvY2sgYml0bWFwIGJsb2NrcyBvciBwYXJ0XG4iCisJICAib2YgdGhlIGlub2RlIHRhYmxlIHJlcXVpcmUgcmVsb2NhdGlvbiwgeW91IG1heSB3aXNoIHRvIHRyeVxuIgorCSAgInJ1bm5pbmcgZTJmc2NrIHdpdGggdGhlICctYiAlUycgb3B0aW9uIGZpcnN0LiAgVGhlIHByb2JsZW1cbiIKKwkgICJtYXkgbGllIG9ubHkgd2l0aCB0aGUgcHJpbWFyeSBibG9jayBncm91cCBkZXNjcmlwdG9ycywgYW5kXG4iCisJICAidGhlIGJhY2t1cCBibG9jayBncm91cCBkZXNjcmlwdG9ycyBtYXkgYmUgT0suXG5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX1BSRUVOX09LIHwgUFJfTk9DT0xMQVRFIH0sCisKKwkvKiBNaXNjZWxsYW5lb3VzIHN1cGVyYmxvY2sgY29ycnVwdGlvbiAqLworCXsgUFJfMF9NSVNDX0NPUlJVUFRfU1VQRVIsCisJICBOXygiQ29ycnVwdGlvbiBmb3VuZCBpbiBAUy4gICglcyA9ICVOKS5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0FGVEVSX0NPREUsIFBSXzBfU0JfQ09SUlVQVCB9LAorCisJLyogRXJyb3IgZGV0ZXJtaW5nIHBoeXNpY2FsIGRldmljZSBzaXplIG9mIGZpbGVzeXN0ZW0gKi8KKwl7IFBSXzBfR0VUU0laRV9FUlJPUiwKKwkgIE5fKCJFcnJvciBkZXRlcm1pbmluZyBzaXplIG9mIHRoZSBwaHlzaWNhbCBAdjogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBJbm9kZSBjb3VudCBpbiBzdXBlcmJsb2NrIGlzIGluY29ycmVjdCAqLworCXsgUFJfMF9JTk9ERV9DT1VOVF9XUk9ORywKKwkgIE5fKCJAaSBjb3VudCBpbiBAUyBpcyAlaSwgQHMgJWouXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCXsgUFJfMF9IVVJEX0NMRUFSX0ZJTEVUWVBFLAorCSAgTl8oIlRoZSBIdXJkIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpbGV0eXBlIGZlYXR1cmUuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogSm91cm5hbCBpbm9kZSBpcyBpbnZhbGlkICovCisJeyBQUl8wX0pPVVJOQUxfQkFEX0lOT0RFLAorCSAgTl8oIkBTIGhhcyBhbiBAbiBleHQzIEBqIChAaSAlaSkuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIFRoZSBleHRlcm5hbCBqb3VybmFsIGhhcyAodW5zdXBwb3J0ZWQpIG11bHRpcGxlIGZpbGVzeXN0ZW1zICovCisJeyBQUl8wX0pPVVJOQUxfVU5TVVBQX01VTFRJRlMsCisJICBOXygiRXh0ZXJuYWwgQGogaGFzIG11bHRpcGxlIEBmIHVzZXJzICh1bnN1cHBvcnRlZCkuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogQ2FuJ3QgZmluZCBleHRlcm5hbCBqb3VybmFsICovCisJeyBQUl8wX0NBTlRfRklORF9KT1VSTkFMLAorCSAgTl8oIkNhbid0IGZpbmQgZXh0ZXJuYWwgQGpcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFeHRlcm5hbCBqb3VybmFsIGhhcyBiYWQgc3VwZXJibG9jayAqLworCXsgUFJfMF9FWFRfSk9VUk5BTF9CQURfU1VQRVIsCisJICBOXygiRXh0ZXJuYWwgQGogaGFzIGJhZCBAU1xuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIFN1cGVyYmxvY2sgaGFzIGEgYmFkIGpvdXJuYWwgVVVJRCAqLworCXsgUFJfMF9KT1VSTkFMX0JBRF9VVUlELAorCSAgTl8oIkV4dGVybmFsIEBqIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBAZlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEpvdXJuYWwgaGFzIGFuIHVua25vd24gc3VwZXJibG9jayB0eXBlICovCisJeyBQUl8wX0pPVVJOQUxfVU5TVVBQX1NVUEVSLAorCSAgTl8oIkV4dDMgQGogQFMgaXMgdW5rbm93biB0eXBlICVOICh1bnN1cHBvcnRlZCkuXG4iCisJICAgICAiSXQgaXMgbGlrZWx5IHRoYXQgeW91ciBjb3B5IG9mIGUyZnNjayBpcyBvbGQgYW5kL29yIGRvZXNuJ3QgIgorCSAgICAgInN1cHBvcnQgdGhpcyBAaiBmb3JtYXQuXG4iCisJICAgICAiSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGUgQGogQFMgaXMgY29ycnVwdC5cbiIpLAorCSAgUFJPTVBUX0FCT1JULCBQUl9OT19PSyB8IFBSX0FGVEVSX0NPREUsIFBSXzBfSk9VUk5BTF9CQURfU1VQRVIgfSwKKworCS8qIEpvdXJuYWwgc3VwZXJibG9jayBpcyBjb3JydXB0ICovCisJeyBQUl8wX0pPVVJOQUxfQkFEX1NVUEVSLAorCSAgTl8oIkV4dDMgQGogQFMgaXMgY29ycnVwdC5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIFN1cGVyYmxvY2sgZmxhZyBzaG91bGQgYmUgY2xlYXJlZCAqLworCXsgUFJfMF9KT1VSTkFMX0hBU19KT1VSTkFMLAorCSAgTl8oIkBTIGRvZXNuJ3QgaGF2ZSBoYXNfQGogZmxhZywgYnV0IGhhcyBleHQzIEBqICVzLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBTdXBlcmJsb2NrIGZsYWcgaXMgaW5jb3JyZWN0ICovCisJeyBQUl8wX0pPVVJOQUxfUkVDT1ZFUl9TRVQsCisJICBOXygiQFMgaGFzIGV4dDMgbmVlZHNfcmVjb3ZlcnkgZmxhZyBzZXQsIGJ1dCBubyBAai5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9QUkVFTl9PSyB9LAorCisJLyogSm91cm5hbCBoYXMgZGF0YSwgYnV0IHJlY292ZXJ5IGZsYWcgaXMgY2xlYXIgKi8KKwl7IFBSXzBfSk9VUk5BTF9SRUNPVkVSWV9DTEVBUiwKKwkgIE5fKCJleHQzIHJlY292ZXJ5IGZsYWcgaXMgY2xlYXIsIGJ1dCBAaiBoYXMgZGF0YS5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEFzayBpZiB3ZSBzaG91bGQgY2xlYXIgdGhlIGpvdXJuYWwgKi8KKwl7IFBSXzBfSk9VUk5BTF9SRVNFVF9KT1VSTkFMLAorCSAgTl8oIkNsZWFyIEBqIiksCisJICBQUk9NUFRfTlVMTCwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEFzayBpZiB3ZSBzaG91bGQgcnVuIHRoZSBqb3VybmFsIGFueXdheSAqLworCXsgUFJfMF9KT1VSTkFMX1JVTiwKKwkgIE5fKCJSdW4gQGogYW55d2F5IiksCisJICBQUk9NUFRfTlVMTCwgMCB9LAorCisJLyogUnVuIHRoZSBqb3VybmFsIGJ5IGRlZmF1bHQgKi8KKwl7IFBSXzBfSk9VUk5BTF9SVU5fREVGQVVMVCwKKwkgIE5fKCJSZWNvdmVyeSBmbGFnIG5vdCBzZXQgaW4gYmFja3VwIEBTLCBzbyBydW5uaW5nIEBqIGFueXdheS5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIENsZWFyaW5nIG9ycGhhbiBpbm9kZSAqLworCXsgUFJfMF9PUlBIQU5fQ0xFQVJfSU5PREUsCisJICBOXygiJXMgQG8gQGkgJWkgKHVpZD0lSXUsIGdpZD0lSWcsIG1vZGU9JUltLCBzaXplPSVJcylcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIElsbGVnYWwgYmxvY2sgZm91bmQgaW4gb3JwaGFuZWQgaW5vZGUgKi8KKwl7IFBSXzBfT1JQSEFOX0lMTEVHQUxfQkxPQ0tfTlVNLAorCSAgIE5fKCJASSBAYiAjJUIgKCViKSBmb3VuZCBpbiBAbyBAaSAlaS5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEFscmVhZHkgY2xlYXJlZCBibG9jayBmb3VuZCBpbiBvcnBoYW5lZCBpbm9kZSAqLworCXsgUFJfMF9PUlBIQU5fQUxSRUFEWV9DTEVBUkVEX0JMT0NLLAorCSAgIE5fKCJBbHJlYWR5IGNsZWFyZWQgQGIgIyVCICglYikgZm91bmQgaW4gQG8gQGkgJWkuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBJbGxlZ2FsIG9ycGhhbiBpbm9kZSBpbiBzdXBlcmJsb2NrICovCisJeyBQUl8wX09SUEhBTl9JTExFR0FMX0hFQURfSU5PREUsCisJICBOXygiQEkgQG8gQGkgJWkgaW4gQFMuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBJbGxlZ2FsIGlub2RlIGluIG9ycGhhbmVkIGlub2RlIGxpc3QgKi8KKwl7IFBSXzBfT1JQSEFOX0lMTEVHQUxfSU5PREUsCisJICBOXygiQEkgQGkgJWkgaW4gQG8gQGkgbGlzdC5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEZpbGVzeXN0ZW0gcmV2aXNpb24gaXMgMCwgYnV0IGZlYXR1cmUgZmxhZ3MgYXJlIHNldCAqLworCXsgUFJfMF9GU19SRVZfTEVWRUwsCisJICBOXygiQGYgaGFzIGZlYXR1cmUgZmxhZyhzKSBzZXQsIGJ1dCBpcyBhIHJldmlzaW9uIDAgQGYuICAiKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIHwgUFJfTk9fT0sgfSwKKworCS8qIEpvdXJuYWwgc3VwZXJibG9jayBoYXMgYW4gdW5rbm93biByZWFkLW9ubHkgZmVhdHVyZSBmbGFnIHNldCAqLworCXsgUFJfMF9KT1VSTkFMX1VOU1VQUF9ST0NPTVBBVCwKKwkgIE5fKCJFeHQzIEBqIEBTIGhhcyBhbiB1bmtub3duIHJlYWQtb25seSBmZWF0dXJlIGZsYWcgc2V0LlxuIiksCisJICBQUk9NUFRfQUJPUlQsIDAgfSwKKworCS8qIEpvdXJuYWwgc3VwZXJibG9jayBoYXMgYW4gdW5rbm93biBpbmNvbXBhdGlibGUgZmVhdHVyZSBmbGFnIHNldCAqLworCXsgUFJfMF9KT1VSTkFMX1VOU1VQUF9JTkNPTVBBVCwKKwkgIE5fKCJFeHQzIEBqIEBTIGhhcyBhbiB1bmtub3duIGluY29tcGF0aWJsZSBmZWF0dXJlIGZsYWcgc2V0LlxuIiksCisJICBQUk9NUFRfQUJPUlQsIDAgfSwKKworCS8qIEpvdXJuYWwgaGFzIHVuc3VwcG9ydGVkIHZlcnNpb24gbnVtYmVyICovCisJeyBQUl8wX0pPVVJOQUxfVU5TVVBQX1ZFUlNJT04sCisJICBOXygiQGogdmVyc2lvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZTJmc2NrLlxuIiksCisJICBQUk9NUFRfQUJPUlQsIDAgfSwKKworCS8qIE1vdmluZyBqb3VybmFsIHRvIGhpZGRlbiBmaWxlICovCisJeyBQUl8wX01PVkVfSk9VUk5BTCwKKwkgIE5fKCJNb3ZpbmcgQGogZnJvbSAvJXMgdG8gaGlkZGVuIEBpLlxuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBFcnJvciBtb3Zpbmcgam91cm5hbCB0byBoaWRkZW4gZmlsZSAqLworCXsgUFJfMF9FUlJfTU9WRV9KT1VSTkFMLAorCSAgTl8oIkVycm9yIG1vdmluZyBAajogJW1cblxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQ2xlYXJpbmcgVjIgam91cm5hbCBzdXBlcmJsb2NrICovCisJeyBQUl8wX0NMRUFSX1YyX0pPVVJOQUwsCisJICBOXygiRm91bmQgQG4gVjIgQGogQFMgZmllbGRzIChmcm9tIFYxIEBqKS5cbiIKKwkgICAgICJDbGVhcmluZyBmaWVsZHMgYmV5b25kIHRoZSBWMSBAaiBAUy4uLlxuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBCYWNrdXAgam91cm5hbCBpbm9kZSBibG9ja3MgKi8KKwl7IFBSXzBfQkFDS1VQX0pOTCwKKwkgIE5fKCJCYWNraW5nIHVwIEBqIEBpIEBiIGluZm9ybWF0aW9uLlxuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBSZXNlcnZlZCBibG9ja3Mgdy9vIHJlc2l6ZV9pbm9kZSAqLworCXsgUFJfMF9OT05aRVJPX1JFU0VSVkVEX0dEVF9CTE9DS1MsCisJICBOXygiQGYgZG9lcyBub3QgaGF2ZSByZXNpemVfQGkgZW5hYmxlZCwgYnV0IHNfcmVzZXJ2ZWRfZ2R0X0Bic1xuIgorCSAgICAgImlzICVOOyBAcyB6ZXJvLiAgIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBSZXNpemVfaW5vZGUgbm90IGVuYWJsZWQsIGJ1dCByZXNpemUgaW5vZGUgaXMgbm9uLXplcm8gKi8KKwl7IFBSXzBfQ0xFQVJfUkVTSVpFX0lOT0RFLAorCSAgTl8oIlJlc2l6ZV9AaSBub3QgZW5hYmxlZCwgYnV0IHRoZSByZXNpemUgQGkgaXMgbm9uLXplcm8uICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogUmVzaXplIGlub2RlIGludmFsaWQgKi8KKwl7IFBSXzBfUkVTSVpFX0lOT0RFX0lOVkFMSUQsCisJICBOXygiUmVzaXplIEBpIG5vdCB2YWxpZC4gICIpLAorCSAgUFJPTVBUX1JFQ1JFQVRFLCAwIH0sCisKKwkvKiBQYXNzIDEgZXJyb3JzICovCisKKwkvKiBQYXNzIDE6IENoZWNraW5nIGlub2RlcywgYmxvY2tzLCBhbmQgc2l6ZXMgKi8KKwl7IFBSXzFfUEFTU19IRUFERVIsCisJICBOXygiUGFzcyAxOiBDaGVja2luZyBAaXMsIEBicywgYW5kIHNpemVzXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBSb290IGRpcmVjdG9yeSBpcyBub3QgYW4gaW5vZGUgKi8KKwl7IFBSXzFfUk9PVF9OT19ESVIsIE5fKCJAciBpcyBub3QgYSBAZC4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBSb290IGRpcmVjdG9yeSBoYXMgZHRpbWUgc2V0ICovCisJeyBQUl8xX1JPT1RfRFRJTUUsCisJICBOXygiQHIgaGFzIGR0aW1lIHNldCAocHJvYmFibHkgZHVlIHRvIG9sZCBta2UyZnMpLiAgIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB9LAorCisJLyogUmVzZXJ2ZWQgaW5vZGUgaGFzIGJhZCBtb2RlICovCisJeyBQUl8xX1JFU0VSVkVEX0JBRF9NT0RFLAorCSAgTl8oIlJlc2VydmVkIEBpICVpICglUSkgaGFzIEBuIG1vZGUuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIERlbGV0ZWQgaW5vZGUgaGFzIHplcm8gZHRpbWUgKi8KKwl7IFBSXzFfWkVST19EVElNRSwKKwkgIE5fKCJARCBAaSAlaSBoYXMgemVybyBkdGltZS4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIElub2RlIGluIHVzZSwgYnV0IGR0aW1lIHNldCAqLworCXsgUFJfMV9TRVRfRFRJTUUsCisJICBOXygiQGkgJWkgaXMgaW4gdXNlLCBidXQgaGFzIGR0aW1lIHNldC4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIFplcm8tbGVuZ3RoIGRpcmVjdG9yeSAqLworCXsgUFJfMV9aRVJPX0xFTkdUSF9ESVIsCisJICBOXygiQGkgJWkgaXMgYSBAeiBAZC4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9QUkVFTl9PSyB9LAorCisJLyogQmxvY2sgYml0bWFwIGNvbmZsaWN0cyB3aXRoIHNvbWUgb3RoZXIgZnMgYmxvY2sgKi8KKwl7IFBSXzFfQkJfQ09ORkxJQ1QsCisJICBOXygiQGcgJWcncyBAYiBAQiBhdCAlYiBAQy5cbiIpLAorCSAgUFJPTVBUX1JFTE9DQVRFLCAwIH0sCisKKwkvKiBJbm9kZSBiaXRtYXAgY29uZmxpY3RzIHdpdGggc29tZSBvdGhlciBmcyBibG9jayAqLworCXsgUFJfMV9JQl9DT05GTElDVCwKKwkgIE5fKCJAZyAlZydzIEBpIEBCIGF0ICViIEBDLlxuIiksCisJICBQUk9NUFRfUkVMT0NBVEUsIDAgfSwKKworCS8qIElub2RlIHRhYmxlIGNvbmZsaWN0cyB3aXRoIHNvbWUgb3RoZXIgZnMgYmxvY2sgKi8KKwl7IFBSXzFfSVRBQkxFX0NPTkZMSUNULAorCSAgTl8oIkBnICVnJ3MgQGkgdGFibGUgYXQgJWIgQEMuXG4iKSwKKwkgIFBST01QVF9SRUxPQ0FURSwgMCB9LAorCisJLyogQmxvY2sgYml0bWFwIGlzIG9uIGEgYmFkIGJsb2NrICovCisJeyBQUl8xX0JCX0JBRF9CTE9DSywKKwkgIE5fKCJAZyAlZydzIEBiIEBCICglYikgaXMgYmFkLiAgIiksCisJICBQUk9NUFRfUkVMT0NBVEUsIDAgfSwKKworCS8qIElub2RlIGJpdG1hcCBpcyBvbiBhIGJhZCBibG9jayAqLworCXsgUFJfMV9JQl9CQURfQkxPQ0ssCisJICBOXygiQGcgJWcncyBAaSBAQiAoJWIpIGlzIGJhZC4gICIpLAorCSAgUFJPTVBUX1JFTE9DQVRFLCAwIH0sCisKKwkvKiBJbm9kZSBoYXMgaW5jb3JyZWN0IGlfc2l6ZSAqLworCXsgUFJfMV9CQURfSV9TSVpFLAorCSAgTl8oIkBpICVpLCBpX3NpemUgaXMgJUlzLCBAcyAlTi4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIElub2RlIGhhcyBpbmNvcnJlY3QgaV9ibG9ja3MgKi8KKwl7IFBSXzFfQkFEX0lfQkxPQ0tTLAorCSAgTl8oIkBpICVpLCBpX0BicyBpcyAlSWIsIEBzICVOLiAgIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB9LAorCisJLyogSWxsZWdhbCBibG9ja251bWJlciBpbiBpbm9kZSAqLworCXsgUFJfMV9JTExFR0FMX0JMT0NLX05VTSwKKwkgIE5fKCJASSBAYiAjJUIgKCViKSBpbiBAaSAlaS4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9MQVRDSF9CTE9DSyB9LAorCisJLyogQmxvY2sgbnVtYmVyIG92ZXJsYXBzIGZzIG1ldGFkYXRhICovCisJeyBQUl8xX0JMT0NLX09WRVJMQVBTX01FVEFEQVRBLAorCSAgTl8oIkBiICMlQiAoJWIpIG92ZXJsYXBzIEBmIG1ldGFkYXRhIGluIEBpICVpLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX0xBVENIX0JMT0NLIH0sCisKKwkvKiBJbm9kZSBoYXMgaWxsZWdhbCBibG9ja3MgKGxhdGNoIHF1ZXN0aW9uKSAqLworCXsgUFJfMV9JTk9ERV9CTE9DS19MQVRDSCwKKwkgIE5fKCJAaSAlaSBoYXMgaWxsZWdhbCBAYihzKS4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBUb28gbWFueSBiYWQgYmxvY2tzIGluIGlub2RlICovCisJeyBQUl8xX1RPT19NQU5ZX0JBRF9CTE9DS1MsCisJICBOXygiVG9vIG1hbnkgaWxsZWdhbCBAYnMgaW4gQGkgJWkuXG4iKSwKKwkgIFBST01QVF9DTEVBUl9JTk9ERSwgUFJfTk9fT0sgfSwKKworCS8qIElsbGVnYWwgYmxvY2sgbnVtYmVyIGluIGJhZCBibG9jayBpbm9kZSAqLworCXsgUFJfMV9CQl9JTExFR0FMX0JMT0NLX05VTSwKKwkgIE5fKCJASSBAYiAjJUIgKCViKSBpbiBiYWQgQGIgQGkuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfTEFUQ0hfQkJMT0NLIH0sCisKKwkvKiBCYWQgYmxvY2sgaW5vZGUgaGFzIGlsbGVnYWwgYmxvY2tzIChsYXRjaCBxdWVzdGlvbikgKi8KKwl7IFBSXzFfSU5PREVfQkJMT0NLX0xBVENILAorCSAgTl8oIkJhZCBAYiBAaSBoYXMgaWxsZWdhbCBAYihzKS4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBEdXBsaWNhdGUgb3IgYmFkIGJsb2NrcyBpbiB1c2UhICovCisJeyBQUl8xX0RVUF9CTE9DS1NfUFJFRU5TVE9QLAorCSAgTl8oIkR1cGxpY2F0ZSBvciBiYWQgQGIgaW4gdXNlIVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQmFkIGJsb2NrIHVzZWQgYXMgYmFkIGJsb2NrIGluZGlyZWN0IGJsb2NrICovCisJeyBQUl8xX0JCSU5PREVfQkFEX01FVEFCTE9DSywKKwkgIE5fKCJCYWQgQGIgJWIgdXNlZCBhcyBiYWQgQGIgQGkgaW5kaXJlY3QgQGIuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfTEFUQ0hfQkJMT0NLIH0sCisKKwkvKiBJbmNvbnNpc3RlbmN5IGNhbid0IGJlIGZpeGVkIHByb21wdCAqLworCXsgUFJfMV9CQklOT0RFX0JBRF9NRVRBQkxPQ0tfUFJPTVBULAorCSAgTl8oIlxuVGhlIGJhZCBAYiBAaSBoYXMgcHJvYmFibHkgYmVlbiBjb3JydXB0ZWQuICBZb3UgcHJvYmFibHlcbiIKKwkgICAgICJzaG91bGQgc3RvcCBub3cgYW5kIHJ1biAiImUyZnNjayAtYyIiIHRvIHNjYW4gZm9yIGJhZCBibG9ja3NcbiIKKwkgICAgICJpbiB0aGUgQGYuXG4iKSwKKwkgIFBST01QVF9DT05USU5VRSwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEJhZCBwcmltYXJ5IGJsb2NrICovCisJeyBQUl8xX0JBRF9QUklNQVJZX0JMT0NLLAorCSAgTl8oIlxuSWYgdGhlIEBiIGlzIHJlYWxseSBiYWQsIHRoZSBAZiBjYW5ub3QgYmUgZml4ZWQuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9BRlRFUl9DT0RFLCBQUl8xX0JBRF9QUklNQVJZX0JMT0NLX1BST01QVCB9LAorCisJLyogQmFkIHByaW1hcnkgYmxvY2sgcHJvbXB0ICovCisJeyBQUl8xX0JBRF9QUklNQVJZX0JMT0NLX1BST01QVCwKKwkgIE5fKCJZb3UgY2FuIHJlbW92ZSB0aGlzIEBiIGZyb20gdGhlIGJhZCBAYiBsaXN0IGFuZCBob3BlXG4iCisJICAgICAidGhhdCB0aGUgQGIgaXMgcmVhbGx5IE9LLiAgQnV0IHRoZXJlIGFyZSBubyBndWFyYW50ZWVzLlxuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEJhZCBwcmltYXJ5IHN1cGVyYmxvY2sgKi8KKwl7IFBSXzFfQkFEX1BSSU1BUllfU1VQRVJCTE9DSywKKwkgIE5fKCJUaGUgcHJpbWFyeSBAUyAoJWIpIGlzIG9uIHRoZSBiYWQgQGIgbGlzdC5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0FGVEVSX0NPREUsIFBSXzFfQkFEX1BSSU1BUllfQkxPQ0sgfSwKKworCS8qIEJhZCBwcmltYXJ5IGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzICovCisJeyBQUl8xX0JBRF9QUklNQVJZX0dST1VQX0RFU0NSSVBUT1IsCisJICBOXygiQmxvY2sgJWIgaW4gdGhlIHByaW1hcnkgQGcgZGVzY3JpcHRvcnMgIgorCSAgImlzIG9uIHRoZSBiYWQgQGIgbGlzdFxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfQUZURVJfQ09ERSwgUFJfMV9CQURfUFJJTUFSWV9CTE9DSyB9LAorCisJLyogQmFkIHN1cGVyYmxvY2sgaW4gZ3JvdXAgKi8KKwl7IFBSXzFfQkFEX1NVUEVSQkxPQ0ssCisJICBOXygiV2FybmluZzogR3JvdXAgJWcncyBAUyAoJWIpIGlzIGJhZC5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEJhZCBibG9jayBncm91cCBkZXNjcmlwdG9ycyBpbiBncm91cCAqLworCXsgUFJfMV9CQURfR1JPVVBfREVTQ1JJUFRPUlMsCisJICBOXygiV2FybmluZzogR3JvdXAgJWcncyBjb3B5IG9mIHRoZSBAZyBkZXNjcmlwdG9ycyBoYXMgYSBiYWQgIgorCSAgIkBiICglYikuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBCbG9jayBjbGFpbWVkIGZvciBubyByZWFzb24gKi8KKwl7IFBSXzFfUFJPR0VSUl9DTEFJTUVEX0JMT0NLLAorCSAgTl8oIlByb2dyYW1taW5nIGVycm9yPyAgQGIgIyViIGNsYWltZWQgZm9yIG5vIHJlYXNvbiBpbiAiCisJICAicHJvY2Vzc19iYWRfQGIuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB9LAorCisJLyogRXJyb3IgYWxsb2NhdGluZyBibG9ja3MgZm9yIHJlbG9jYXRpbmcgbWV0YWRhdGEgKi8KKwl7IFBSXzFfUkVMT0NfQkxPQ0tfQUxMT0NBVEUsCisJICBOXygiQEEgJU4gY29udGlndW91cyBAYihzKSBpbiBAYiBAZyAlZyBmb3IgJXM6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB9LAorCisJLyogRXJyb3IgYWxsb2NhdGluZyBibG9jayBidWZmZXIgZHVyaW5nIHJlbG9jYXRpb24gcHJvY2VzcyAqLworCXsgUFJfMV9SRUxPQ19NRU1PUllfQUxMT0NBVEUsCisJICBOXygiQEEgQGIgYnVmZmVyIGZvciByZWxvY2F0aW5nICVzXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB9LAorCisJLyogUmVsb2NhdGluZyBtZXRhZGF0YSBncm91cCBpbmZvcm1hdGlvbiBmcm9tIFggdG8gWSAqLworCXsgUFJfMV9SRUxPQ19GUk9NX1RPLAorCSAgTl8oIlJlbG9jYXRpbmcgQGcgJWcncyAlcyBmcm9tICViIHRvICVjLi4uXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB9LAorCisJLyogUmVsb2NhdGluZyBtZXRhdGRhdGEgZ3JvdXAgaW5mb3JtYXRpb24gdG8gWCAqLworCXsgUFJfMV9SRUxPQ19UTywKKwkgIE5fKCJSZWxvY2F0aW5nIEBnICVnJ3MgJXMgdG8gJWMuLi5cbiIpLCAvKiB4Z2V0dGV4dDpuby1jLWZvcm1hdCAqLworCSAgUFJPTVBUX05PTkUsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBCbG9jayByZWFkIGVycm9yIGR1cmluZyByZWxvY2F0aW9uIHByb2Nlc3MgKi8KKwl7IFBSXzFfUkVMT0NfUkVBRF9FUlIsCisJICBOXygiV2FybmluZzogY291bGQgbm90IHJlYWQgQGIgJWIgb2YgJXM6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB9LAorCisJLyogQmxvY2sgd3JpdGUgZXJyb3IgZHVyaW5nIHJlbG9jYXRpb24gcHJvY2VzcyAqLworCXsgUFJfMV9SRUxPQ19XUklURV9FUlIsCisJICBOXygiV2FybmluZzogY291bGQgbm90IHdyaXRlIEBiICViIGZvciAlczogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBFcnJvciBhbGxvY2F0aW5nIGlub2RlIGJpdG1hcCAqLworCXsgUFJfMV9BTExPQ0FURV9JQklUTUFQX0VSUk9SLAorCSAgTl8oIkBBIEBpIEBCICglTik6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgYWxsb2NhdGluZyBibG9jayBiaXRtYXAgKi8KKwl7IFBSXzFfQUxMT0NBVEVfQkJJVE1BUF9FUlJPUiwKKwkgIE5fKCJAQSBAYiBAQiAoJU4pOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgaWNvdW50IHN0cnVjdHVyZSAqLworCXsgUFJfMV9BTExPQ0FURV9JQ09VTlQsCisJICBOXygiQEEgaWNvdW50IGxpbmsgaW5mb3JtYXRpb246ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgYWxsb2NhdGluZyBkYmNvdW50ICovCisJeyBQUl8xX0FMTE9DQVRFX0RCQ09VTlQsCisJICBOXygiQEEgQGQgQGIgYXJyYXk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3Igd2hpbGUgc2Nhbm5pbmcgaW5vZGVzICovCisJeyBQUl8xX0lTQ0FOX0VSUk9SLAorCSAgTl8oIkVycm9yIHdoaWxlIHNjYW5uaW5nIEBpcyAoJWkpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGJsb2NrcyAqLworCXsgUFJfMV9CTE9DS19JVEVSQVRFLAorCSAgTl8oIkVycm9yIHdoaWxlIGl0ZXJhdGluZyBvdmVyIEBicyBpbiBAaSAlaTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciB3aGlsZSBzdG9yaW5nIGlub2RlIGNvdW50IGluZm9ybWF0aW9uICovCisJeyBQUl8xX0lDT1VOVF9TVE9SRSwKKwkgIE5fKCJFcnJvciBzdG9yaW5nIEBpIGNvdW50IGluZm9ybWF0aW9uIChAaT0laSwgY291bnQ9JU4pOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIHdoaWxlIHN0b3JpbmcgZGlyZWN0b3J5IGJsb2NrIGluZm9ybWF0aW9uICovCisJeyBQUl8xX0FERF9EQkxPQ0ssCisJICBOXygiRXJyb3Igc3RvcmluZyBAZCBAYiBpbmZvcm1hdGlvbiAiCisJICAiKEBpPSVpLCBAYj0lYiwgbnVtPSVOKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciB3aGlsZSByZWFkaW5nIGlub2RlIChmb3IgY2xlYXJpbmcpICovCisJeyBQUl8xX1JFQURfSU5PREUsCisJICBOXygiRXJyb3IgcmVhZGluZyBAaSAlaTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBTdXBwcmVzcyBtZXNzYWdlcyBwcm9tcHQgKi8KKwl7IFBSXzFfU1VQUFJFU1NfTUVTU0FHRVMsICIiLCBQUk9NUFRfU1VQUFJFU1MsIFBSX05PX09LIH0sCisKKwkvKiBJbWFnaWMgZmxhZyBzZXQgb24gYW4gaW5vZGUgd2hlbiBmaWxlc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLworCXsgUFJfMV9TRVRfSU1BR0lDLAorCSAgTl8oIkBpICVpIGhhcyBpbWFnaWMgZmxhZyBzZXQuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogSW1tdXRhYmxlIGZsYWcgc2V0IG9uIGEgZGV2aWNlIG9yIHNvY2tldCBpbm9kZSAqLworCXsgUFJfMV9TRVRfSU1NVVRBQkxFLAorCSAgTl8oIlNwZWNpYWwgKEB2L3NvY2tldC9maWZvL3N5bWxpbmspIGZpbGUgKEBpICVpKSBoYXMgaW1tdXRhYmxlXG4iCisJICAgICAib3IgYXBwZW5kLW9ubHkgZmxhZyBzZXQuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OTyB8IFBSX05PX09LIH0sCisKKwkvKiBDb21wcmVzc2lvbiBmbGFnIHNldCBvbiBhbiBpbm9kZSB3aGVuIGZpbGVzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGl0ICovCisJeyBQUl8xX0NPTVBSX1NFVCwKKwkgIE5fKCJAaSAlaSBoYXMgQGNpb24gZmxhZyBzZXQgb24gQGYgd2l0aG91dCBAY2lvbiBzdXBwb3J0LiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIE5vbi16ZXJvIHNpemUgZm9yIGRldmljZSwgZmlmbyBvciBzb2NrZXQgaW5vZGUgKi8KKwl7IFBSXzFfU0VUX05PTlpTSVpFLAorCSAgTl8oIlNwZWNpYWwgKEB2L3NvY2tldC9maWZvKSBAaSAlaSBoYXMgbm9uLXplcm8gc2l6ZS4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEZpbGVzeXN0ZW0gcmV2aXNpb24gaXMgMCwgYnV0IGZlYXR1cmUgZmxhZ3MgYXJlIHNldCAqLworCXsgUFJfMV9GU19SRVZfTEVWRUwsCisJICBOXygiQGYgaGFzIGZlYXR1cmUgZmxhZyhzKSBzZXQsIGJ1dCBpcyBhIHJldmlzaW9uIDAgQGYuICAiKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIHwgUFJfTk9fT0sgfSwKKworCS8qIEpvdXJuYWwgaW5vZGUgaXMgbm90IGluIHVzZSwgYnV0IGNvbnRhaW5zIGRhdGEgKi8KKwl7IFBSXzFfSk9VUk5BTF9JTk9ERV9OT1RfQ0xFQVIsCisJICBOXygiQGogQGkgaXMgbm90IGluIHVzZSwgYnV0IGNvbnRhaW5zIGRhdGEuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEpvdXJuYWwgaGFzIGJhZCBtb2RlICovCisJeyBQUl8xX0pPVVJOQUxfQkFEX01PREUsCisJICBOXygiQGogaXMgbm90IHJlZ3VsYXIgZmlsZS4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIERlYWwgd2l0aCBpbm9kZXMgdGhhdCB3ZXJlIHBhcnQgb2Ygb3JwaGFuIGxpbmtlZCBsaXN0ICovCisJeyBQUl8xX0xPV19EVElNRSwKKwkgIE5fKCJAaSAlaSB3YXMgcGFydCBvZiB0aGUgQG8gQGkgbGlzdC4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfTEFUQ0hfTE9XX0RUSU1FLCAwIH0sCisKKwkvKiBEZWFsIHdpdGggaW5vZGVzIHRoYXQgd2VyZSBwYXJ0IG9mIGNvcnJ1cHRlZCBvcnBoYW4gbGlua2VkCisJICAgbGlzdCAobGF0Y2ggcXVlc3Rpb24pICovCisJeyBQUl8xX09SUEhBTl9MSVNUX1JFRlVHRUVTLAorCSAgTl8oIkBpcyB0aGF0IHdlcmUgcGFydCBvZiBhIGNvcnJ1cHRlZCBvcnBoYW4gbGlua2VkIGxpc3QgZm91bmQuICAiKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgcmVmY291bnQgc3RydWN0dXJlICovCisJeyBQUl8xX0FMTE9DQVRFX1JFRkNPVU5ULAorCSAgTl8oIkBBIHJlZmNvdW50IHN0cnVjdHVyZSAoJU4pOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIHJlYWRpbmcgZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrICovCisJeyBQUl8xX1JFQURfRUFfQkxPQ0ssCisJICBOXygiRXJyb3IgcmVhZGluZyBAYSBAYiAlYiBmb3IgQGkgJWkuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogSW52YWxpZCBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgKi8KKwl7IFBSXzFfQkFEX0VBX0JMT0NLLAorCSAgTl8oIkBpICVpIGhhcyBhIGJhZCBAYSBAYiAlYi4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBFcnJvciByZWFkaW5nIEV4dGVuZGVkIEF0dHJpYnV0ZSBibG9jayB3aGlsZSBmaXhpbmcgcmVmY291bnQgKi8KKwl7IFBSXzFfRVhUQVRUUl9SRUFEX0FCT1JULAorCSAgTl8oIkVycm9yIHJlYWRpbmcgQGEgQGIgJWIgKCVtKS4gICIpLAorCSAgUFJPTVBUX0FCT1JULCAwIH0sCisKKwkvKiBFeHRlbmRlZCBhdHRyaWJ1dGUgcmVmZXJlbmNlIGNvdW50IGluY29ycmVjdCAqLworCXsgUFJfMV9FWFRBVFRSX1JFRkNPVU5ULAorCSAgTl8oIkBhIEBiICViIGhhcyByZWZlcmVuY2UgY291bnQgJUIsIEBzICVOLiAgIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBFcnJvciB3cml0aW5nIEV4dGVuZGVkIEF0dHJpYnV0ZSBibG9jayB3aGlsZSBmaXhpbmcgcmVmY291bnQgKi8KKwl7IFBSXzFfRVhUQVRUUl9XUklURSwKKwkgIE5fKCJFcnJvciB3cml0aW5nIEBhIEBiICViICglbSkuICAiKSwKKwkgIFBST01QVF9BQk9SVCwgMCB9LAorCisJLyogTXVsdGlwbGUgRUEgYmxvY2tzIG5vdCBzdXBwb3J0ZWQgKi8KKwl7IFBSXzFfRUFfTVVMVElfQkxPQ0ssCisJICBOXygiQGEgQGIgJWIgaGFzIGhfQGJzID4gMS4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCAwfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgRUEgcmVnaW9uIGFsbG9jYXRpb24gc3RydWN0dXJlICovCisJeyBQUl8xX0VBX0FMTE9DX1JFR0lPTiwKKwkgIE5fKCJAQSBAYSBAYiAlYi4gICIpLAorCSAgUFJPTVBUX0FCT1JULCAwfSwKKworCS8qIEVycm9yIEVBIGFsbG9jYXRpb24gY29sbGlzaW9uICovCisJeyBQUl8xX0VBX0FMTE9DX0NPTExJU0lPTiwKKwkgIE5fKCJAYSBAYiAlYiBpcyBjb3JydXB0IChhbGxvY2F0aW9uIGNvbGxpc2lvbikuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMH0sCisKKwkvKiBCYWQgZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWUgKi8KKwl7IFBSXzFfRUFfQkFEX05BTUUsCisJICBOXygiQGEgQGIgJWIgaXMgY29ycnVwdCAoQG4gbmFtZSkuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMH0sCisKKwkvKiBCYWQgZXh0ZW5kZWQgYXR0cmlidXRlIHZhbHVlICovCisJeyBQUl8xX0VBX0JBRF9WQUxVRSwKKwkgIE5fKCJAYSBAYiAlYiBpcyBjb3JydXB0IChAbiB2YWx1ZSkuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMH0sCisKKwkvKiBJbm9kZSB0b28gYmlnIChsYXRjaCBxdWVzdGlvbikgKi8KKwl7IFBSXzFfSU5PREVfVE9PQklHLAorCSAgTl8oIkBpICVpIGlzIHRvbyBiaWcuICAiKSwgUFJPTVBUX1RSVU5DQVRFLCAwIH0sCisKKwkvKiBEaXJlY3RvcnkgdG9vIGJpZyAqLworCXsgUFJfMV9UT09CSUdfRElSLAorCSAgTl8oIkBiICMlQiAoJWIpIGNhdXNlcyBAZCB0byBiZSB0b28gYmlnLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX0xBVENIX1RPT0JJRyB9LAorCisJLyogUmVndWxhciBmaWxlIHRvbyBiaWcgKi8KKwl7IFBSXzFfVE9PQklHX1JFRywKKwkgIE5fKCJAYiAjJUIgKCViKSBjYXVzZXMgZmlsZSB0byBiZSB0b28gYmlnLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX0xBVENIX1RPT0JJRyB9LAorCisJLyogU3ltbGluayB0b28gYmlnICovCisJeyBQUl8xX1RPT0JJR19TWU1MSU5LLAorCSAgTl8oIkBiICMlQiAoJWIpIGNhdXNlcyBzeW1saW5rIHRvIGJlIHRvbyBiaWcuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfTEFUQ0hfVE9PQklHIH0sCisKKwkvKiBJTkRFWF9GTCBmbGFnIHNldCBvbiBhIG5vbi1IVFJFRSBmaWxlc3lzdGVtICovCisJeyBQUl8xX0hUUkVFX1NFVCwKKwkgIE5fKCJAaSAlaSBoYXMgSU5ERVhfRkwgZmxhZyBzZXQgb24gQGYgd2l0aG91dCBodHJlZSBzdXBwb3J0LlxuIiksCisJICBQUk9NUFRfQ0xFQVJfSFRSRUUsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBJTkRFWF9GTCBmbGFnIHNldCBvbiBhIG5vbi1kaXJlY3RvcnkgKi8KKwl7IFBSXzFfSFRSRUVfTk9ESVIsCisJICBOXygiQGkgJWkgaGFzIElOREVYX0ZMIGZsYWcgc2V0IGJ1dCBpcyBub3QgYSBAZC5cbiIpLAorCSAgUFJPTVBUX0NMRUFSX0hUUkVFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogSW52YWxpZCByb290IG5vZGUgaW4gSFRSRUUgZGlyZWN0b3J5ICovCisJeyBQUl8xX0hUUkVFX0JBRFJPT1QsCisJICBOXygiQGggJWkgaGFzIGFuIEBuIHJvb3Qgbm9kZS5cbiIpLAorCSAgUFJPTVBUX0NMRUFSX0hUUkVFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogVW5zdXBwb3J0ZWQgaGFzaCB2ZXJzaW9uIGluIEhUUkVFIGRpcmVjdG9yeSAqLworCXsgUFJfMV9IVFJFRV9IQVNIViwKKwkgIE5fKCJAaCAlaSBoYXMgYW4gdW5zdXBwb3J0ZWQgaGFzaCB2ZXJzaW9uICglTilcbiIpLAorCSAgUFJPTVBUX0NMRUFSX0hUUkVFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogSW5jb21wYXRpYmxlIGZsYWcgaW4gSFRSRUUgcm9vdCBub2RlICovCisJeyBQUl8xX0hUUkVFX0lOQ09NUEFULAorCSAgTl8oIkBoICVpIHVzZXMgYW4gaW5jb21wYXRpYmxlIGh0cmVlIHJvb3Qgbm9kZSBmbGFnLlxuIiksCisJICBQUk9NUFRfQ0xFQVJfSFRSRUUsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBIVFJFRSB0b28gZGVlcCAqLworCXsgUFJfMV9IVFJFRV9ERVBUSCwKKwkgIE5fKCJAaCAlaSBoYXMgYSB0cmVlIGRlcHRoICglTikgd2hpY2ggaXMgdG9vIGJpZ1xuIiksCisJICBQUk9NUFRfQ0xFQVJfSFRSRUUsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBCYWQgYmxvY2sgaGFzIGluZGlyZWN0IGJsb2NrIHRoYXQgY29uZmxpY3RzIHdpdGggZmlsZXN5c3RlbSBibG9jayAqLworCXsgUFJfMV9CQl9GU19CTE9DSywKKwkgIE5fKCJCYWQgQGIgQGkgaGFzIGFuIGluZGlyZWN0IEBiICglYikgdGhhdCBjb25mbGljdHMgd2l0aFxuIgorCSAgICAgIkBmIG1ldGFkYXRhLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX0xBVENIX0JCTE9DSyB9LAorCisJLyogUmVzaXplIGlub2RlIGZhaWxlZCAqLworCXsgUFJfMV9SRVNJWkVfSU5PREVfQ1JFQVRFLAorCSAgTl8oIlJlc2l6ZSBAaSAocmUpY3JlYXRpb24gZmFpbGVkOiAlbS4iKSwKKwkgIFBST01QVF9BQk9SVCwgMCB9LAorCisJLyogaW52YWxpZCBpbm9kZS0+aV9leHRyYV9pc2l6ZSAqLworCXsgUFJfMV9FWFRSQV9JU0laRSwKKwkgIE5fKCJAaSAlaSBoYXMgYSBleHRyYSBzaXplICglSVMpIHdoaWNoIGlzIEBuXG4iKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBpbnZhbGlkIGVhIGVudHJ5LT5lX25hbWVfbGVuICovCisJeyBQUl8xX0FUVFJfTkFNRV9MRU4sCisJICBOXygiQGEgaW4gQGkgJWkgaGFzIGEgbmFtZWxlbiAoJU4pIHdoaWNoIGlzIEBuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIGludmFsaWQgZWEgZW50cnktPmVfdmFsdWVfc2l6ZSAqLworCXsgUFJfMV9BVFRSX1ZBTFVFX1NJWkUsCisJICBOXygiQGEgaW4gQGkgJWkgaGFzIGEgdmFsdWUgc2l6ZSAoJU4pIHdoaWNoIGlzIEBuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIGludmFsaWQgZWEgZW50cnktPmVfdmFsdWVfb2ZmcyAqLworCXsgUFJfMV9BVFRSX1ZBTFVFX09GRlNFVCwKKwkgIE5fKCJAYSBpbiBAaSAlaSBoYXMgYSB2YWx1ZSBvZmZzZXQgKCVOKSB3aGljaCBpcyBAblxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBpbnZhbGlkIGVhIGVudHJ5LT5lX3ZhbHVlX2Jsb2NrICovCisJeyBQUl8xX0FUVFJfVkFMVUVfQkxPQ0ssCisJICBOXygiQGEgaW4gQGkgJWkgaGFzIGEgdmFsdWUgQGIgKCVOKSB3aGljaCBpcyBAbiAobXVzdCBiZSAwKVxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBpbnZhbGlkIGVhIGVudHJ5LT5lX2hhc2ggKi8KKwl7IFBSXzFfQVRUUl9IQVNILAorCSAgTl8oIkBhIGluIEBpICVpIGhhcyBhIGhhc2ggKCVOKSB3aGljaCBpcyBAbiAobXVzdCBiZSAwKVxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBQYXNzIDFiIGVycm9ycyAqLworCisJLyogUGFzcyAxQjogUmVzY2FuIGZvciBkdXBsaWNhdGUvYmFkIGJsb2NrcyAqLworCXsgUFJfMUJfUEFTU19IRUFERVIsCisJICBOXygiXG5SdW5uaW5nIGFkZGl0aW9uYWwgcGFzc2VzIHRvIHJlc29sdmUgQGJzIGNsYWltZWQgYnkgbW9yZSB0aGFuIG9uZSBAaS4uLlxuIgorCSAgIlBhc3MgMUI6IFJlc2Nhbm5pbmcgZm9yIEBtIEBic1xuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRHVwbGljYXRlL2JhZCBibG9jayhzKSBoZWFkZXIgKi8KKwl7IFBSXzFCX0RVUF9CTE9DS19IRUFERVIsCisJICBOXygiQG0gQGIocykgaW4gQGkgJWk6IiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRHVwbGljYXRlL2JhZCBibG9jayhzKSBpbiBpbm9kZSAqLworCXsgUFJfMUJfRFVQX0JMT0NLLAorCSAgIiAlYiIsCisJICBQUk9NUFRfTk9ORSwgUFJfTEFUQ0hfREJMT0NLIHwgUFJfUFJFRU5fTk9IRFIgfSwKKworCS8qIER1cGxpY2F0ZS9iYWQgYmxvY2socykgZW5kICovCisJeyBQUl8xQl9EVVBfQkxPQ0tfRU5ELAorCSAgIlxuIiwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9OT0hEUiB9LAorCisJLyogRXJyb3Igd2hpbGUgc2Nhbm5pbmcgaW5vZGVzICovCisJeyBQUl8xQl9JU0NBTl9FUlJPUiwKKwkgIE5fKCJFcnJvciB3aGlsZSBzY2FubmluZyBpbm9kZXMgKCVpKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciBhbGxvY2F0aW5nIGlub2RlIGJpdG1hcCAqLworCXsgUFJfMUJfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiwKKwkgIE5fKCJAQSBAaSBAQiAoQGlfZHVwX21hcCk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3Igd2hpbGUgaXRlcmF0aW5nIG92ZXIgYmxvY2tzICovCisJeyBQUl8xQl9CTE9DS19JVEVSQVRFLAorCSAgTl8oIkVycm9yIHdoaWxlIGl0ZXJhdGluZyBvdmVyIEBicyBpbiBAaSAlaSAoJXMpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRXJyb3IgYWRqdXN0aW5nIEVBIHJlZmNvdW50ICovCisJeyBQUl8xQl9BREpfRUFfUkVGQ09VTlQsCisJICBOXygiRXJyb3IgYWRqdXN0aW5nIHJlZmNvdW50IGZvciBAYSBAYiAlYiAoQGkgJWkpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisKKwkvKiBQYXNzIDFDOiBTY2FuIGRpcmVjdG9yaWVzIGZvciBpbm9kZXMgd2l0aCBtdWx0aXBseS1jbGFpbWVkIGJsb2Nrcy4gKi8KKwl7IFBSXzFDX1BBU1NfSEVBREVSLAorCSAgTl8oIlBhc3MgMUM6IFNjYW5uaW5nIGRpcmVjdG9yaWVzIGZvciBAaXMgd2l0aCBAbSBAYnMuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKworCS8qIFBhc3MgMUQ6IFJlY29uY2lsaW5nIG11bHRpcGx5LWNsYWltZWQgYmxvY2tzICovCisJeyBQUl8xRF9QQVNTX0hFQURFUiwKKwkgIE5fKCJQYXNzIDFEOiBSZWNvbmNpbGluZyBAbSBAYnNcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEZpbGUgaGFzIGR1cGxpY2F0ZSBibG9ja3MgKi8KKwl7IFBSXzFEX0RVUF9GSUxFLAorCSAgTl8oIkZpbGUgJVEgKEBpICMlaSwgbW9kIHRpbWUgJUlNKVxuIgorCSAgIiAgaGFzICVCIEBtIEBiKHMpLCBzaGFyZWQgd2l0aCAlTiBmaWxlKHMpOlxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogTGlzdCBvZiBmaWxlcyBzaGFyaW5nIGR1cGxpY2F0ZSBibG9ja3MgKi8KKwl7IFBSXzFEX0RVUF9GSUxFX0xJU1QsCisJICBOXygiXHQlUSAoQGkgIyVpLCBtb2QgdGltZSAlSU0pXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBGaWxlIHNoYXJpbmcgYmxvY2tzIHdpdGggZmlsZXN5c3RlbSBtZXRhZGF0YSAgKi8KKwl7IFBSXzFEX1NIQVJFX01FVEFEQVRBLAorCSAgTl8oIlx0PEBmIG1ldGFkYXRhPlxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogUmVwb3J0IG9mIGhvdyBtYW55IGR1cGxpY2F0ZS9iYWQgaW5vZGVzICovCisJeyBQUl8xRF9OVU1fRFVQX0lOT0RFUywKKwkgIE5fKCIoVGhlcmUgYXJlICVOIEBpcyBjb250YWluaW5nIEBtIEBicy4pXG5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIER1cGxpY2F0ZWQgYmxvY2tzIGFscmVhZHkgcmVhc3NpZ25lZCBvciBjbG9uZWQuICovCisJeyBQUl8xRF9EVVBfQkxPQ0tTX0RFQUxULAorCSAgTl8oIkBtIEBicyBhbHJlYWR5IHJlYXNzaWduZWQgb3IgY2xvbmVkLlxuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBDbG9uZSBkdXBsaWNhdGUvYmFkIGJsb2Nrcz8gKi8KKwl7IFBSXzFEX0NMT05FX1FVRVNUSU9OLAorCSAgIiIsIFBST01QVF9DTE9ORSwgUFJfTk9fT0sgfSwKKworCS8qIERlbGV0ZSBmaWxlPyAqLworCXsgUFJfMURfREVMRVRFX1FVRVNUSU9OLAorCSAgIiIsIFBST01QVF9ERUxFVEUsIDAgfSwKKworCS8qIENvdWxkbid0IGNsb25lIGZpbGUgKGVycm9yKSAqLworCXsgUFJfMURfQ0xPTkVfRVJST1IsCisJICBOXygiQ291bGRuJ3QgY2xvbmUgZmlsZTogJW1cbiIpLCBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogUGFzcyAyIGVycm9ycyAqLworCisJLyogUGFzcyAyOiBDaGVja2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlICovCisJeyBQUl8yX1BBU1NfSEVBREVSLAorCSAgTl8oIlBhc3MgMjogQ2hlY2tpbmcgQGQgc3RydWN0dXJlXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBCYWQgaW5vZGUgbnVtYmVyIGZvciAnLicgKi8KKwl7IFBSXzJfQkFEX0lOT0RFX0RPVCwKKwkgIE5fKCJAbiBAaSBudW1iZXIgZm9yICcuJyBpbiBAZCBAaSAlaS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogRGlyZWN0b3J5IGVudHJ5IGhhcyBiYWQgaW5vZGUgbnVtYmVyICovCisJeyBQUl8yX0JBRF9JTk8sCisJICBOXygiQEUgaGFzIEBuIEBpICM6ICVEaS5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBEaXJlY3RvcnkgZW50cnkgaGFzIGRlbGV0ZWQgb3IgdW51c2VkIGlub2RlICovCisJeyBQUl8yX1VOVVNFRF9JTk9ERSwKKwkgIE5fKCJARSBoYXMgQEQvdW51c2VkIEBpICVEaS4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9QUkVFTl9PSyB9LAorCisJLyogRGlyZWN0cnkgZW50cnkgaXMgbGluayB0byAnLicgKi8KKwl7IFBSXzJfTElOS19ET1QsCisJICBOXygiQEUgQEwgdG8gJy4nICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogRGlyZWN0b3J5IGVudHJ5IHBvaW50cyB0byBpbm9kZSBub3cgbG9jYXRlZCBpbiBhIGJhZCBibG9jayAqLworCXsgUFJfMl9CQl9JTk9ERSwKKwkgIE5fKCJARSBwb2ludHMgdG8gQGkgKCVEaSkgbG9jYXRlZCBpbiBhIGJhZCBAYi5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBEaXJlY3RvcnkgZW50cnkgY29udGFpbnMgYSBsaW5rIHRvIGEgZGlyZWN0b3J5ICovCisJeyBQUl8yX0xJTktfRElSLAorCSAgTl8oIkBFIEBMIHRvIEBkICVQICglRGkpLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIERpcmVjdG9yeSBlbnRyeSBjb250YWlucyBhIGxpbmsgdG8gdGhlIHJvb3QgZGlyZWN0cnkgKi8KKwl7IFBSXzJfTElOS19ST09ULAorCSAgTl8oIkBFIEBMIHRvIHRoZSBAci5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBEaXJlY3RvcnkgZW50cnkgaGFzIGlsbGVnYWwgY2hhcmFjdGVycyBpbiBpdHMgbmFtZSAqLworCXsgUFJfMl9CQURfTkFNRSwKKwkgIE5fKCJARSBoYXMgaWxsZWdhbCBjaGFyYWN0ZXJzIGluIGl0cyBuYW1lLlxuIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBNaXNzaW5nICcuJyBpbiBkaXJlY3RvcnkgaW5vZGUgKi8KKwl7IFBSXzJfTUlTU0lOR19ET1QsCisJICBOXygiTWlzc2luZyAnLicgaW4gQGQgQGkgJWkuXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIE1pc3NpbmcgJy4uJyBpbiBkaXJlY3RvcnkgaW5vZGUgKi8KKwl7IFBSXzJfTUlTU0lOR19ET1RfRE9ULAorCSAgTl8oIk1pc3NpbmcgJy4uJyBpbiBAZCBAaSAlaS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogRmlyc3QgZW50cnkgaW4gZGlyZWN0b3J5IGlub2RlIGRvZXNuJ3QgY29udGFpbiAnLicgKi8KKwl7IFBSXzJfMVNUX05PVF9ET1QsCisJICBOXygiRmlyc3QgQGUgJyVEbicgKEBpPSVEaSkgaW4gQGQgQGkgJWkgKCVwKSBAcyAnLidcbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogU2Vjb25kIGVudHJ5IGluIGRpcmVjdG9yeSBpbm9kZSBkb2Vzbid0IGNvbnRhaW4gJy4uJyAqLworCXsgUFJfMl8yTkRfTk9UX0RPVF9ET1QsCisJICBOXygiU2Vjb25kIEBlICclRG4nIChAaT0lRGkpIGluIEBkIEBpICVpIEBzICcuLidcbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogaV9mYWRkciBzaG91bGQgYmUgemVybyAqLworCXsgUFJfMl9GQUREUl9aRVJPLAorCSAgTl8oImlfZmFkZHIgQEYgJUlGLCBAcyB6ZXJvLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIGlfZmlsZV9hY2wgc2hvdWxkIGJlIHplcm8gKi8KKwl7IFBSXzJfRklMRV9BQ0xfWkVSTywKKwkgIE5fKCJpX2ZpbGVfYWNsIEBGICVJZiwgQHMgemVyby5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBpX2Rpcl9hY2wgc2hvdWxkIGJlIHplcm8gKi8KKwl7IFBSXzJfRElSX0FDTF9aRVJPLAorCSAgTl8oImlfZGlyX2FjbCBARiAlSWQsIEBzIHplcm8uXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogaV9mcmFnIHNob3VsZCBiZSB6ZXJvICovCisJeyBQUl8yX0ZSQUdfWkVSTywKKwkgIE5fKCJpX2ZyYWcgQEYgJU4sIEBzIHplcm8uXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogaV9mc2l6ZSBzaG91bGQgYmUgemVybyAqLworCXsgUFJfMl9GU0laRV9aRVJPLAorCSAgTl8oImlfZnNpemUgQEYgJU4sIEBzIHplcm8uXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogaW5vZGUgaGFzIGJhZCBtb2RlICovCisJeyBQUl8yX0JBRF9NT0RFLAorCSAgTl8oIkBpICVpICglUSkgaGFzIEBuIG1vZGUgKCVJbSkuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogZGlyZWN0b3J5IGNvcnJ1cHRlZCAqLworCXsgUFJfMl9ESVJfQ09SUlVQVEVELAorCSAgTl8oIkBkIEBpICVpLCBAYiAlQiwgb2Zmc2V0ICVOOiBAZCBjb3JydXB0ZWRcbiIpLAorCSAgUFJPTVBUX1NBTFZBR0UsIDAgfSwKKworCS8qIGZpbGVuYW1lIHRvbyBsb25nICovCisJeyBQUl8yX0ZJTEVOQU1FX0xPTkcsCisJICBOXygiQGQgQGkgJWksIEBiICVCLCBvZmZzZXQgJU46IGZpbGVuYW1lIHRvbyBsb25nXG4iKSwKKwkgIFBST01QVF9UUlVOQ0FURSwgMCB9LAorCisJLyogRGlyZWN0b3J5IGlub2RlIGhhcyBhIG1pc3NpbmcgYmxvY2sgKGhvbGUpICovCisJeyBQUl8yX0RJUkVDVE9SWV9IT0xFLAorCSAgTl8oIkBkIEBpICVpIGhhcyBhbiB1bmFsbG9jYXRlZCBAYiAjJUIuICAiKSwKKwkgIFBST01QVF9BTExPQ0FURSwgMCB9LAorCisJLyogJy4nIGlzIG5vdCBOVUxMIHRlcm1pbmF0ZWQgKi8KKwl7IFBSXzJfRE9UX05VTExfVEVSTSwKKwkgIE5fKCInLicgQGQgQGUgaW4gQGQgQGkgJWkgaXMgbm90IE5VTEwgdGVybWluYXRlZFxuIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiAnLi4nIGlzIG5vdCBOVUxMIHRlcm1pbmF0ZWQgKi8KKwl7IFBSXzJfRE9UX0RPVF9OVUxMX1RFUk0sCisJICBOXygiJy4uJyBAZCBAZSBpbiBAZCBAaSAlaSBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIElsbGVnYWwgY2hhcmFjdGVyIGRldmljZSBpbm9kZSAqLworCXsgUFJfMl9CQURfQ0hBUl9ERVYsCisJICBOXygiQGkgJWkgKCVRKSBpcyBhbiBASSBjaGFyYWN0ZXIgQHYuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogSWxsZWdhbCBibG9jayBkZXZpY2UgaW5vZGUgKi8KKwl7IFBSXzJfQkFEX0JMT0NLX0RFViwKKwkgIE5fKCJAaSAlaSAoJVEpIGlzIGFuIEBJIEBiIEB2LlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIER1cGxpY2F0ZSAnLicgZW50cnkgKi8KKwl7IFBSXzJfRFVQX0RPVCwKKwkgIE5fKCJARSBpcyBkdXBsaWNhdGUgJy4nIEBlLlxuIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBEdXBsaWNhdGUgJy4uJyBlbnRyeSAqLworCXsgUFJfMl9EVVBfRE9UX0RPVCwKKwkgIE5fKCJARSBpcyBkdXBsaWNhdGUgJy4uJyBAZS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogSW50ZXJuYWwgZXJyb3I6IGNvdWxkbid0IGZpbmQgZGlyX2luZm8gKi8KKwl7IFBSXzJfTk9fRElSSU5GTywKKwkgIE5fKCJJbnRlcm5hbCBlcnJvcjogY2Fubm90IGZpbmQgZGlyX2luZm8gZm9yICVpLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEZpbmFsIHJlY19sZW4gaXMgd3JvbmcgKi8KKwl7IFBSXzJfRklOQUxfUkVDTEVOLAorCSAgTl8oIkBFIGhhcyByZWNfbGVuIG9mICVEciwgQHMgJU4uXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgaWNvdW50IHN0cnVjdHVyZSAqLworCXsgUFJfMl9BTExPQ0FURV9JQ09VTlQsCisJICBOXygiQEEgaWNvdW50IHN0cnVjdHVyZTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciBpdGVyYXRpbmcgb3ZlciBkaXJlY3RvcnkgYmxvY2tzICovCisJeyBQUl8yX0RCTElTVF9JVEVSQVRFLAorCSAgTl8oIkVycm9yIGl0ZXJhdGluZyBvdmVyIEBkIEBiczogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciByZWFkaW5nIGRpcmVjdG9yeSBibG9jayAqLworCXsgUFJfMl9SRUFEX0RJUkJMT0NLLAorCSAgTl8oIkVycm9yIHJlYWRpbmcgQGQgQGIgJWIgKEBpICVpKTogJW1cbiIpLAorCSAgUFJPTVBUX0NPTlRJTlVFLCAwIH0sCisKKwkvKiBFcnJvciB3cml0aW5nIGRpcmVjdG9yeSBibG9jayAqLworCXsgUFJfMl9XUklURV9ESVJCTE9DSywKKwkgIE5fKCJFcnJvciB3cml0aW5nIEBkIEBiICViIChAaSAlaSk6ICVtXG4iKSwKKwkgIFBST01QVF9DT05USU5VRSwgMCB9LAorCisJLyogRXJyb3IgYWxsb2NhdGluZyBuZXcgZGlyZWN0b3J5IGJsb2NrICovCisJeyBQUl8yX0FMTE9DX0RJUkJPQ0ssCisJICBOXygiQEEgbmV3IEBkIEBiIGZvciBAaSAlaSAoJXMpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRXJyb3IgZGVhbGxvY2F0aW5nIGlub2RlICovCisJeyBQUl8yX0RFQUxMT0NfSU5PREUsCisJICBOXygiRXJyb3IgZGVhbGxvY2F0aW5nIEBpICVpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIERpcmVjdG9yeSBlbnRyeSBmb3IgJy4nIGlzIGJpZy4gIFNwbGl0PyAqLworCXsgUFJfMl9TUExJVF9ET1QsCisJICBOXygiQGQgQGUgZm9yICcuJyBpcyBiaWcuICAiKSwKKwkgIFBST01QVF9TUExJVCwgUFJfTk9fT0sgfSwKKworCS8qIElsbGVnYWwgRklGTyBpbm9kZSAqLworCXsgUFJfMl9CQURfRklGTywKKwkgIE5fKCJAaSAlaSAoJVEpIGlzIGFuIEBJIEZJRk8uXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogSWxsZWdhbCBzb2NrZXQgaW5vZGUgKi8KKwl7IFBSXzJfQkFEX1NPQ0tFVCwKKwkgIE5fKCJAaSAlaSAoJVEpIGlzIGFuIEBJIHNvY2tldC5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBEaXJlY3RvcnkgZmlsZXR5cGUgbm90IHNldCAqLworCXsgUFJfMl9TRVRfRklMRVRZUEUsCisJICBOXygiU2V0dGluZyBmaWxldHlwZSBmb3IgQEUgdG8gJU4uXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB8IFBSX05PX09LIHwgUFJfTk9fTk9NU0cgfSwKKworCS8qIERpcmVjdG9yeSBmaWxldHlwZSBpbmNvcnJlY3QgKi8KKwl7IFBSXzJfQkFEX0ZJTEVUWVBFLAorCSAgTl8oIkBFIGhhcyBhbiBpbmNvcnJlY3QgZmlsZXR5cGUgKHdhcyAlRHQsIEBzICVOKS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogRGlyZWN0b3J5IGZpbGV0eXBlIHNldCBvbiBmaWxlc3lzdGVtICovCisJeyBQUl8yX0NMRUFSX0ZJTEVUWVBFLAorCSAgTl8oIkBFIGhhcyBmaWxldHlwZSBzZXQuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIERpcmVjdG9yeSBmaWxlbmFtZSBpcyBudWxsICovCisJeyBQUl8yX05VTExfTkFNRSwKKwkgIE5fKCJARSBoYXMgYSBAeiBuYW1lLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIEludmFsaWQgc3ltbGluayAqLworCXsgUFJfMl9JTlZBTElEX1NZTUxJTkssCisJICBOXygiU3ltbGluayAlUSAoQGkgIyVpKSBpcyBAbi5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBpX2ZpbGVfYWNsIChleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2spIGlzIGJhZCAqLworCXsgUFJfMl9GSUxFX0FDTF9CQUQsCisJICBOXygiQGEgQGIgQEYgQG4gKCVJZikuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogRmlsZXN5c3RlbSBjb250YWlucyBsYXJnZSBmaWxlcywgYnV0IGhhcyBubyBzdWNoIGZsYWcgaW4gc2IgKi8KKwl7IFBSXzJfRkVBVFVSRV9MQVJHRV9GSUxFUywKKwkgIE5fKCJAZiBjb250YWlucyBsYXJnZSBmaWxlcywgYnV0IGxhY2tzIExBUkdFX0ZJTEUgZmxhZyBpbiBAUy5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogTm9kZSBpbiBIVFJFRSBkaXJlY3Rvcnkgbm90IHJlZmVyZW5jZWQgKi8KKwl7IFBSXzJfSFRSRUVfTk9UUkVGLAorCSAgTl8oIkBwIEBoICVkOiBub2RlICglQikgbm90IHJlZmVyZW5jZWRcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIE5vZGUgaW4gSFRSRUUgZGlyZWN0b3J5IHJlZmVyZW5jZWQgdHdpY2UgKi8KKwl7IFBSXzJfSFRSRUVfRFVQUkVGLAorCSAgTl8oIkBwIEBoICVkOiBub2RlICglQikgcmVmZXJlbmNlZCB0d2ljZVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogTm9kZSBpbiBIVFJFRSBkaXJlY3RvcnkgaGFzIGJhZCBtaW4gaGFzaCAqLworCXsgUFJfMl9IVFJFRV9NSU5fSEFTSCwKKwkgIE5fKCJAcCBAaCAlZDogbm9kZSAoJUIpIGhhcyBiYWQgbWluIGhhc2hcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIE5vZGUgaW4gSFRSRUUgZGlyZWN0b3J5IGhhcyBiYWQgbWF4IGhhc2ggKi8KKwl7IFBSXzJfSFRSRUVfTUFYX0hBU0gsCisJICBOXygiQHAgQGggJWQ6IG5vZGUgKCVCKSBoYXMgYmFkIG1heCBoYXNoXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBDbGVhciBpbnZhbGlkIEhUUkVFIGRpcmVjdG9yeSAqLworCXsgUFJfMl9IVFJFRV9DTEVBUiwKKwkgIE5fKCJAbiBAaCAlZCAoJXEpLiAgIiksIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogQmFkIGJsb2NrIGluIGh0cmVlIGludGVyaW9yIG5vZGUgKi8KKwl7IFBSXzJfSFRSRUVfQkFEQkxLLAorCSAgTl8oIkBwIEBoICVkICglcSk6IGJhZCBAYiBudW1iZXIgJWIuXG4iKSwKKwkgIFBST01QVF9DTEVBUl9IVFJFRSwgMCB9LAorCisJLyogRXJyb3IgYWRqdXN0aW5nIEVBIHJlZmNvdW50ICovCisJeyBQUl8yX0FESl9FQV9SRUZDT1VOVCwKKwkgIE5fKCJFcnJvciBhZGp1c3RpbmcgcmVmY291bnQgZm9yIEBhIEBiICViIChAaSAlaSk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogSW52YWxpZCBIVFJFRSByb290IG5vZGUgKi8KKwl7IFBSXzJfSFRSRUVfQkFEX1JPT1QsCisJICBOXygiQHAgQGggJWQ6IHJvb3Qgbm9kZSBpcyBAblxuIiksCisJICBQUk9NUFRfQ0xFQVJfSFRSRUUsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBJbnZhbGlkIEhUUkVFIGxpbWl0ICovCisJeyBQUl8yX0hUUkVFX0JBRF9MSU1JVCwKKwkgIE5fKCJAcCBAaCAlZDogbm9kZSAoJUIpIGhhcyBAbiBsaW1pdCAoJU4pXG4iKSwKKwkgIFBST01QVF9DTEVBUl9IVFJFRSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEludmFsaWQgSFRSRUUgY291bnQgKi8KKwl7IFBSXzJfSFRSRUVfQkFEX0NPVU5ULAorCSAgTl8oIkBwIEBoICVkOiBub2RlICglQikgaGFzIEBuIGNvdW50ICglTilcbiIpLAorCSAgUFJPTVBUX0NMRUFSX0hUUkVFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogSFRSRUUgaW50ZXJpb3Igbm9kZSBoYXMgb3V0LW9mLW9yZGVyIGhhc2hlcyBpbiB0YWJsZSAqLworCXsgUFJfMl9IVFJFRV9IQVNIX09SREVSLAorCSAgTl8oIkBwIEBoICVkOiBub2RlICglQikgaGFzIGFuIHVub3JkZXJlZCBoYXNoIHRhYmxlXG4iKSwKKwkgIFBST01QVF9DTEVBUl9IVFJFRSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIE5vZGUgaW4gSFRSRUUgZGlyZWN0b3J5IGhhcyBpbnZhbGlkIGRlcHRoICovCisJeyBQUl8yX0hUUkVFX0JBRF9ERVBUSCwKKwkgIE5fKCJAcCBAaCAlZDogbm9kZSAoJUIpIGhhcyBAbiBkZXB0aFxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRHVwbGljYXRlIGRpcmVjdG9yeSBlbnRyeSBmb3VuZCAqLworCXsgUFJfMl9EVVBMSUNBVEVfRElSRU5ULAorCSAgTl8oIkR1cGxpY2F0ZSBARSBmb3VuZC4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBOb24tdW5pcXVlIGZpbGVuYW1lIGZvdW5kICovCisJeyBQUl8yX05PTl9VTklRVUVfRklMRSwgLyogeGdldHRleHQ6IG5vLWMtZm9ybWF0ICovCisJICBOXygiQEUgaGFzIGEgbm9uLXVuaXF1ZSBmaWxlbmFtZS5cblJlbmFtZSB0byAlcyIpLAorCSAgUFJPTVBUX05VTEwsIDAgfSwKKworCS8qIER1cGxpY2F0ZSBkaXJlY3RvcnkgZW50cnkgZm91bmQgKi8KKwl7IFBSXzJfUkVQT1JUX0RVUF9ESVJFTlQsCisJICBOXygiRHVwbGljYXRlIEBlICclRG4nIGZvdW5kLlxuXHRNYXJraW5nICVwICglaSkgdG8gYmUgcmVidWlsdC5cblxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogUGFzcyAzIGVycm9ycyAqLworCisJLyogUGFzcyAzOiBDaGVja2luZyBkaXJlY3RvcnkgY29ubmVjdGl2aXR5ICovCisJeyBQUl8zX1BBU1NfSEVBREVSLAorCSAgTl8oIlBhc3MgMzogQ2hlY2tpbmcgQGQgY29ubmVjdGl2aXR5XG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBSb290IGlub2RlIG5vdCBhbGxvY2F0ZWQgKi8KKwl7IFBSXzNfTk9fUk9PVF9JTk9ERSwKKwkgIE5fKCJAciBub3QgYWxsb2NhdGVkLiAgIiksCisJICBQUk9NUFRfQUxMT0NBVEUsIDAgfSwKKworCS8qIE5vIHJvb20gaW4gbG9zdCtmb3VuZCAqLworCXsgUFJfM19FWFBBTkRfTEZfRElSLAorCSAgTl8oIk5vIHJvb20gaW4gQGwgQGQuICAiKSwKKwkgIFBST01QVF9FWFBBTkQsIDAgfSwKKworCS8qIFVuY29ubmVjdGVkIGRpcmVjdG9yeSBpbm9kZSAqLworCXsgUFJfM19VTkNPTk5FQ1RFRF9ESVIsCisJICBOXygiVW5jb25uZWN0ZWQgQGQgQGkgJWkgKCVwKVxuIiksCisJICBQUk9NUFRfQ09OTkVDVCwgMCB9LAorCisJLyogL2xvc3QrZm91bmQgbm90IGZvdW5kICovCisJeyBQUl8zX05PX0xGX0RJUiwKKwkgIE5fKCIvQGwgbm90IGZvdW5kLiAgIiksCisJICBQUk9NUFRfQ1JFQVRFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogLi4gZW50cnkgaXMgaW5jb3JyZWN0ICovCisJeyBQUl8zX0JBRF9ET1RfRE9ULAorCSAgTl8oIicuLicgaW4gJVEgKCVpKSBpcyAlUCAoJWopLCBAcyAlcSAoJWQpLlxuIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBCYWQgb3Igbm9uLWV4aXN0ZW50IC9sb3N0K2ZvdW5kLiAgQ2Fubm90IHJlY29ubmVjdCAqLworCXsgUFJfM19OT19MUEYsCisJICBOXygiQmFkIG9yIG5vbi1leGlzdGVudCAvQGwuICBDYW5ub3QgcmVjb25uZWN0LlxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQ291bGQgbm90IGV4cGFuZCAvbG9zdCtmb3VuZCAqLworCXsgUFJfM19DQU5UX0VYUEFORF9MUEYsCisJICBOXygiQ291bGQgbm90IGV4cGFuZCAvQGw6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBDb3VsZCBub3QgcmVjb25uZWN0IGlub2RlICovCisJeyBQUl8zX0NBTlRfUkVDT05ORUNULAorCSAgTl8oIkNvdWxkIG5vdCByZWNvbm5lY3QgJWk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBFcnJvciB3aGlsZSB0cnlpbmcgdG8gZmluZCAvbG9zdCtmb3VuZCAqLworCXsgUFJfM19FUlJfRklORF9MUEYsCisJICBOXygiRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGZpbmQgL0BsOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRXJyb3IgaW4gZXh0MmZzX25ld19ibG9jayB3aGlsZSBjcmVhdGluZyAvbG9zdCtmb3VuZCAqLworCXsgUFJfM19FUlJfTFBGX05FV19CTE9DSywKKwkgIE5fKCJleHQyZnNfbmV3X0BiOiAlbSB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIC9AbCBAZFxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRXJyb3IgaW4gZXh0MmZzX25ld19pbm9kZSB3aGlsZSBjcmVhdGluZyAvbG9zdCtmb3VuZCAqLworCXsgUFJfM19FUlJfTFBGX05FV19JTk9ERSwKKwkgIE5fKCJleHQyZnNfbmV3X0BpOiAlbSB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIC9AbCBAZFxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRXJyb3IgaW4gZXh0MmZzX25ld19kaXJfYmxvY2sgd2hpbGUgY3JlYXRpbmcgL2xvc3QrZm91bmQgKi8KKwl7IFBSXzNfRVJSX0xQRl9ORVdfRElSX0JMT0NLLAorCSAgTl8oImV4dDJmc19uZXdfZGlyX0BiOiAlbSB3aGlsZSBjcmVhdGluZyBuZXcgQGQgQGJcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEVycm9yIHdoaWxlIHdyaXRpbmcgZGlyZWN0b3J5IGJsb2NrIGZvciAvbG9zdCtmb3VuZCAqLworCXsgUFJfM19FUlJfTFBGX1dSSVRFX0JMT0NLLAorCSAgTl8oImV4dDJmc193cml0ZV9kaXJfQGI6ICVtIHdoaWxlIHdyaXRpbmcgdGhlIEBkIEBiIGZvciAvQGxcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEVycm9yIHdoaWxlIGFkanVzdGluZyBpbm9kZSBjb3VudCAqLworCXsgUFJfM19BREpVU1RfSU5PREUsCisJICBOXygiRXJyb3Igd2hpbGUgYWRqdXN0aW5nIEBpIGNvdW50IG9uIEBpICVpXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBDb3VsZG4ndCBmaXggcGFyZW50IGRpcmVjdG9yeSAtLSBlcnJvciAqLworCXsgUFJfM19GSVhfUEFSRU5UX0VSUiwKKwkgIE5fKCJDb3VsZG4ndCBmaXggcGFyZW50IG9mIEBpICVpOiAlbVxuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBDb3VsZG4ndCBmaXggcGFyZW50IGRpcmVjdG9yeSAtLSBjb3VsZG4ndCBmaW5kIGl0ICovCisJeyBQUl8zX0ZJWF9QQVJFTlRfTk9GSU5ELAorCSAgTl8oIkNvdWxkbid0IGZpeCBwYXJlbnQgb2YgQGkgJWk6IENvdWxkbid0IGZpbmQgcGFyZW50IEBkIEBlXG5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgaW5vZGUgYml0bWFwICovCisJeyBQUl8zX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsCisJICBOXygiQEEgQGkgQEIgKCVOKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciBjcmVhdGluZyByb290IGRpcmVjdG9yeSAqLworCXsgUFJfM19DUkVBVEVfUk9PVF9FUlJPUiwKKwkgIE5fKCJFcnJvciBjcmVhdGluZyByb290IEBkICglcyk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgY3JlYXRpbmcgbG9zdCBhbmQgZm91bmQgZGlyZWN0b3J5ICovCisJeyBQUl8zX0NSRUFURV9MUEZfRVJST1IsCisJICBOXygiRXJyb3IgY3JlYXRpbmcgL0BsIEBkICglcyk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogUm9vdCBpbm9kZSBpcyBub3QgZGlyZWN0b3J5OyBhYm9ydGluZyAqLworCXsgUFJfM19ST09UX05PVF9ESVJfQUJPUlQsCisJICBOXygiQHIgaXMgbm90IGEgQGQ7IGFib3J0aW5nLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIENhbm5vdCBwcm9jZWVkIHdpdGhvdXQgYSByb290IGlub2RlLiAqLworCXsgUFJfM19OT19ST09UX0lOT0RFX0FCT1JULAorCSAgTl8oImNhbid0IHByb2NlZWQgd2l0aG91dCBhIEByLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEludGVybmFsIGVycm9yOiBjb3VsZG4ndCBmaW5kIGRpcl9pbmZvICovCisJeyBQUl8zX05PX0RJUklORk8sCisJICBOXygiSW50ZXJuYWwgZXJyb3I6IGNhbm5vdCBmaW5kIGRpcl9pbmZvIGZvciAlaS5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBMb3N0K2ZvdW5kIG5vdCBhIGRpcmVjdG9yeSAqLworCXsgUFJfM19MUEZfTk9URElSLAorCSAgTl8oIi9AbCBpcyBub3QgYSBAZCAoaW5vPSVpKVxuIiksCisJICBQUk9NUFRfVU5MSU5LLCAwIH0sCisKKwkvKiBQYXNzIDNBIERpcmVjdG9yeSBPcHRpbWl6YXRpb24gICAgICAgKi8KKworCS8qIFBhc3MgM0E6IE9wdGltaXppbmcgZGlyZWN0b3JpZXMgKi8KKwl7IFBSXzNBX1BBU1NfSEVBREVSLAorCSAgTl8oIlBhc3MgM0E6IE9wdGltaXppbmcgZGlyZWN0b3JpZXNcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBFcnJvciBpdGVyYXRpbmcgb3ZlciBkaXJlY3RvcmllcyAqLworCXsgUFJfM0FfT1BUSU1JWkVfSVRFUiwKKwkgIE5fKCJGYWlsZWQgdG8gY3JlYXRlIGRpcnNfdG9faGFzaCBpdGVyYXRvcjogJW0iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBFcnJvciByZWhhc2ggZGlyZWN0b3J5ICovCisJeyBQUl8zQV9PUFRJTUlaRV9ESVJfRVJSLAorCSAgTl8oIkZhaWxlZCB0byBvcHRpbWl6ZSBkaXJlY3RvcnkgJXEgKCVkKTogJW0iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBSZWhhc2hpbmcgZGlyIGhlYWRlciAqLworCXsgUFJfM0FfT1BUSU1JWkVfRElSX0hFQURFUiwKKwkgIE5fKCJPcHRpbWl6aW5nIGRpcmVjdG9yaWVzOiAiKSwKKwkgIFBST01QVF9OT05FLCBQUl9NU0dfT05MWSB9LAorCisJLyogUmVoYXNoaW5nIGRpcmVjdG9yeSAlZCAqLworCXsgUFJfM0FfT1BUSU1JWkVfRElSLAorCSAgIiAlZCIsCisJICBQUk9NUFRfTk9ORSwgUFJfTEFUQ0hfT1BUSU1JWkVfRElSIHwgUFJfUFJFRU5fTk9IRFJ9LAorCisJLyogUmVoYXNoaW5nIGRpciBlbmQgKi8KKwl7IFBSXzNBX09QVElNSVpFX0RJUl9FTkQsCisJICAiXG4iLAorCSAgUFJPTVBUX05PTkUsIFBSX1BSRUVOX05PSERSIH0sCisKKwkvKiBQYXNzIDQgZXJyb3JzICovCisKKwkvKiBQYXNzIDQ6IENoZWNraW5nIHJlZmVyZW5jZSBjb3VudHMgKi8KKwl7IFBSXzRfUEFTU19IRUFERVIsCisJICBOXygiUGFzcyA0OiBDaGVja2luZyByZWZlcmVuY2UgY291bnRzXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBVbmF0dGFjaGVkIHplcm8tbGVuZ3RoIGlub2RlICovCisJeyBQUl80X1pFUk9fTEVOX0lOT0RFLAorCSAgTl8oIkB1IEB6IEBpICVpLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LfFBSX05PX09LIH0sCisKKwkvKiBVbmF0dGFjaGVkIGlub2RlICovCisJeyBQUl80X1VOQVRUQUNIRURfSU5PREUsCisJICBOXygiQHUgQGkgJWlcbiIpLAorCSAgUFJPTVBUX0NPTk5FQ1QsIDAgfSwKKworCS8qIElub2RlIHJlZiBjb3VudCB3cm9uZyAqLworCXsgUFJfNF9CQURfUkVGX0NPVU5ULAorCSAgTl8oIkBpICVpIHJlZiBjb3VudCBpcyAlSWwsIEBzICVOLiAgIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB9LAorCisJeyBQUl80X0lOQ09OU0lTVEVOVF9DT1VOVCwKKwkgIE5fKCJXQVJOSU5HOiBQUk9HUkFNTUlORyBCVUcgSU4gRTJGU0NLIVxuIgorCSAgIlx0T1IgU09NRSBCT05FSEVBRCAoWU9VKSBJUyBDSEVDS0lORyBBIE1PVU5URUQgKExJVkUpIEZJTEVTWVNURU0uXG4iCisJICAiQGlfbGlua19pbmZvWyVpXSBpcyAlTiwgQGkuaV9saW5rc19jb3VudCBpcyAlSWwuICAiCisJICAiVGhleSBAcyB0aGUgc2FtZSFcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIFBhc3MgNSBlcnJvcnMgKi8KKworCS8qIFBhc3MgNTogQ2hlY2tpbmcgZ3JvdXAgc3VtbWFyeSBpbmZvcm1hdGlvbiAqLworCXsgUFJfNV9QQVNTX0hFQURFUiwKKwkgIE5fKCJQYXNzIDU6IENoZWNraW5nIEBnIHN1bW1hcnkgaW5mb3JtYXRpb25cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIFBhZGRpbmcgYXQgZW5kIG9mIGlub2RlIGJpdG1hcCBpcyBub3Qgc2V0LiAqLworCXsgUFJfNV9JTk9ERV9CTUFQX1BBRERJTkcsCisJICBOXygiUGFkZGluZyBhdCBlbmQgb2YgQGkgQEIgaXMgbm90IHNldC4gIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB9LAorCisJLyogUGFkZGluZyBhdCBlbmQgb2YgYmxvY2sgYml0bWFwIGlzIG5vdCBzZXQuICovCisJeyBQUl81X0JMT0NLX0JNQVBfUEFERElORywKKwkgIE5fKCJQYWRkaW5nIGF0IGVuZCBvZiBAYiBAQiBpcyBub3Qgc2V0LiAiKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBCbG9jayBiaXRtYXAgZGlmZmVyZW5jZXMgaGVhZGVyICovCisJeyBQUl81X0JMT0NLX0JJVE1BUF9IRUFERVIsCisJICBOXygiQGIgQEIgZGlmZmVyZW5jZXM6ICIpLAorCSAgUFJPTVBUX05PTkUsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0d9LAorCisJLyogQmxvY2sgbm90IHVzZWQsIGJ1dCBtYXJrZWQgaW4gYml0bWFwICovCisJeyBQUl81X0JMT0NLX1VOVVNFRCwKKwkgICIgLSViIiwKKwkgIFBST01QVF9OT05FLCBQUl9MQVRDSF9CQklUTUFQIHwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogQmxvY2sgdXNlZCwgYnV0IG5vdCBtYXJrZWQgdXNlZCBpbiBiaXRtYXAgKi8KKwl7IFBSXzVfQkxPQ0tfVVNFRCwKKwkgICIgKyViIiwKKwkgIFBST01QVF9OT05FLCBQUl9MQVRDSF9CQklUTUFQIHwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogQmxvY2sgYml0bWFwIGRpZmZlcmVuY2VzIGVuZCAqLworCXsgUFJfNV9CTE9DS19CSVRNQVBfRU5ELAorCSAgIlxuIiwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIElub2RlIGJpdG1hcCBkaWZmZXJlbmNlcyBoZWFkZXIgKi8KKwl7IFBSXzVfSU5PREVfQklUTUFQX0hFQURFUiwKKwkgIE5fKCJAaSBAQiBkaWZmZXJlbmNlczogIiksCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogSW5vZGUgbm90IHVzZWQsIGJ1dCBtYXJrZWQgaW4gYml0bWFwICovCisJeyBQUl81X0lOT0RFX1VOVVNFRCwKKwkgICIgLSVpIiwKKwkgIFBST01QVF9OT05FLCBQUl9MQVRDSF9JQklUTUFQIHwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogSW5vZGUgdXNlZCwgYnV0IG5vdCBtYXJrZWQgdXNlZCBpbiBiaXRtYXAgKi8KKwl7IFBSXzVfSU5PREVfVVNFRCwKKwkgICIgKyVpIiwKKwkgIFBST01QVF9OT05FLCBQUl9MQVRDSF9JQklUTUFQIHwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogSW5vZGUgYml0bWFwIGRpZmZlcmVuY2VzIGVuZCAqLworCXsgUFJfNV9JTk9ERV9CSVRNQVBfRU5ELAorCSAgIlxuIiwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEZyZWUgaW5vZGVzIGNvdW50IGZvciBncm91cCB3cm9uZyAqLworCXsgUFJfNV9GUkVFX0lOT0RFX0NPVU5UX0dST1VQLAorCSAgTl8oIkZyZWUgQGlzIGNvdW50IHdyb25nIGZvciBAZyAjJWcgKCVpLCBjb3VudGVkPSVqKS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogRGlyZWN0b3JpZXMgY291bnQgZm9yIGdyb3VwIHdyb25nICovCisJeyBQUl81X0ZSRUVfRElSX0NPVU5UX0dST1VQLAorCSAgTl8oIkRpcmVjdG9yaWVzIGNvdW50IHdyb25nIGZvciBAZyAjJWcgKCVpLCBjb3VudGVkPSVqKS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogRnJlZSBpbm9kZXMgY291bnQgd3JvbmcgKi8KKwl7IFBSXzVfRlJFRV9JTk9ERV9DT1VOVCwKKwkgIE5fKCJGcmVlIEBpcyBjb3VudCB3cm9uZyAoJWksIGNvdW50ZWQ9JWopLlxuIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBGcmVlIGJsb2NrcyBjb3VudCBmb3IgZ3JvdXAgd3JvbmcgKi8KKwl7IFBSXzVfRlJFRV9CTE9DS19DT1VOVF9HUk9VUCwKKwkgIE5fKCJGcmVlIEBicyBjb3VudCB3cm9uZyBmb3IgQGcgIyVnICglYiwgY291bnRlZD0lYykuXG4iKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEZyZWUgYmxvY2tzIGNvdW50IHdyb25nICovCisJeyBQUl81X0ZSRUVfQkxPQ0tfQ09VTlQsCisJICBOXygiRnJlZSBAYnMgY291bnQgd3JvbmcgKCViLCBjb3VudGVkPSVjKS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogUHJvZ3JhbW1pbmcgZXJyb3I6IGJpdG1hcCBlbmRwb2ludHMgZG9uJ3QgbWF0Y2ggKi8KKwl7IFBSXzVfQk1BUF9FTkRQT0lOVFMsCisJICBOXygiUFJPR1JBTU1JTkcgRVJST1I6IEBmICgjJU4pIEBCIGVuZHBvaW50cyAoJWIsICVjKSBkb24ndCAiCisJICAibWF0Y2ggY2FsY3VsYXRlZCBAQiBlbmRwb2ludHMgKCVpLCAlailcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBJbnRlcm5hbCBlcnJvcjogZnVkZ2luZyBlbmQgb2YgYml0bWFwICovCisJeyBQUl81X0ZVREdFX0JJVE1BUF9FUlJPUiwKKwkgIE5fKCJJbnRlcm5hbCBlcnJvcjogZnVkZ2luZyBlbmQgb2YgYml0bWFwICglTilcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciBjb3B5aW5nIGluIHJlcGxhY2VtZW50IGlub2RlIGJpdG1hcCAqLworCXsgUFJfNV9DT1BZX0lCSVRNQVBfRVJST1IsCisJICBOXygiRXJyb3IgY29weWluZyBpbiByZXBsYWNlbWVudCBAaSBAQjogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciBjb3B5aW5nIGluIHJlcGxhY2VtZW50IGJsb2NrIGJpdG1hcCAqLworCXsgUFJfNV9DT1BZX0JCSVRNQVBfRVJST1IsCisJICBOXygiRXJyb3IgY29weWluZyBpbiByZXBsYWNlbWVudCBAYiBAQjogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBCbG9jayByYW5nZSBub3QgdXNlZCwgYnV0IG1hcmtlZCBpbiBiaXRtYXAgKi8KKwl7IFBSXzVfQkxPQ0tfUkFOR0VfVU5VU0VELAorCSAgIiAtKCViLS0lYykiLAorCSAgUFJPTVBUX05PTkUsIFBSX0xBVENIX0JCSVRNQVAgfCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBCbG9jayByYW5nZSB1c2VkLCBidXQgbm90IG1hcmtlZCB1c2VkIGluIGJpdG1hcCAqLworCXsgUFJfNV9CTE9DS19SQU5HRV9VU0VELAorCSAgIiArKCViLS0lYykiLAorCSAgUFJPTVBUX05PTkUsIFBSX0xBVENIX0JCSVRNQVAgfCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBJbm9kZSByYW5nZSBub3QgdXNlZCwgYnV0IG1hcmtlZCBpbiBiaXRtYXAgKi8KKwl7IFBSXzVfSU5PREVfUkFOR0VfVU5VU0VELAorCSAgIiAtKCVpLS0laikiLAorCSAgUFJPTVBUX05PTkUsIFBSX0xBVENIX0lCSVRNQVAgfCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBJbm9kZSByYW5nZSB1c2VkLCBidXQgbm90IG1hcmtlZCB1c2VkIGluIGJpdG1hcCAqLworCXsgUFJfNV9JTk9ERV9SQU5HRV9VU0VELAorCSAgIiArKCVpLS0laikiLAorCSAgUFJPTVBUX05PTkUsIFBSX0xBVENIX0lCSVRNQVAgfCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwl7IDAgfQorfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGxhdGNoIGZsYWdzIHJlZ2lzdGVyLiAgSXQgYWxsb3dzIHNldmVyYWwgcHJvYmxlbXMgdG8gYmUKKyAqICJsYXRjaGVkIiB0b2dldGhlci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBoYXMgdG8gYW5zd2VyIGJ1dCBvbmUKKyAqIHF1ZXN0aW9uIGZvciB0aGUgc2V0IG9mIHByb2JsZW1zLCBhbmQgYWxsIG9mIHRoZSBhc3NvY2lhdGVkCisgKiBwcm9ibGVtcyB3aWxsIGJlIGVpdGhlciBmaXhlZCBvciBub3QgZml4ZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGF0Y2hfZGVzY3IgcHJfbGF0Y2hfaW5mb1tdID0geworCXsgUFJfTEFUQ0hfQkxPQ0ssIFBSXzFfSU5PREVfQkxPQ0tfTEFUQ0gsIDAgfSwKKwl7IFBSX0xBVENIX0JCTE9DSywgUFJfMV9JTk9ERV9CQkxPQ0tfTEFUQ0gsIDAgfSwKKwl7IFBSX0xBVENIX0lCSVRNQVAsIFBSXzVfSU5PREVfQklUTUFQX0hFQURFUiwgUFJfNV9JTk9ERV9CSVRNQVBfRU5EIH0sCisJeyBQUl9MQVRDSF9CQklUTUFQLCBQUl81X0JMT0NLX0JJVE1BUF9IRUFERVIsIFBSXzVfQkxPQ0tfQklUTUFQX0VORCB9LAorCXsgUFJfTEFUQ0hfUkVMT0MsIFBSXzBfUkVMT0NBVEVfSElOVCwgMCB9LAorCXsgUFJfTEFUQ0hfREJMT0NLLCBQUl8xQl9EVVBfQkxPQ0tfSEVBREVSLCBQUl8xQl9EVVBfQkxPQ0tfRU5EIH0sCisJeyBQUl9MQVRDSF9MT1dfRFRJTUUsIFBSXzFfT1JQSEFOX0xJU1RfUkVGVUdFRVMsIDAgfSwKKwl7IFBSX0xBVENIX1RPT0JJRywgUFJfMV9JTk9ERV9UT09CSUcsIDAgfSwKKwl7IFBSX0xBVENIX09QVElNSVpFX0RJUiwgUFJfM0FfT1BUSU1JWkVfRElSX0hFQURFUiwgUFJfM0FfT1BUSU1JWkVfRElSX0VORCB9LAorCXsgLTEsIDAsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZTJmc2NrX3Byb2JsZW0gKmZpbmRfcHJvYmxlbShwcm9ibGVtX3QgY29kZSkKK3sKKwlpbnQgICAgIGk7CisKKwlmb3IgKGk9MDsgcHJvYmxlbV90YWJsZVtpXS5lMnBfY29kZTsgaSsrKSB7CisJCWlmIChwcm9ibGVtX3RhYmxlW2ldLmUycF9jb2RlID09IGNvZGUpCisJCQlyZXR1cm4gJnByb2JsZW1fdGFibGVbaV07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxhdGNoX2Rlc2NyICpmaW5kX2xhdGNoKGludCBjb2RlKQoreworCWludCAgICAgaTsKKworCWZvciAoaT0wOyBwcl9sYXRjaF9pbmZvW2ldLmxhdGNoX2NvZGUgPj0gMDsgaSsrKSB7CisJCWlmIChwcl9sYXRjaF9pbmZvW2ldLmxhdGNoX2NvZGUgPT0gY29kZSkKKwkJCXJldHVybiAmcHJfbGF0Y2hfaW5mb1tpXTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmRfcHJvYmxlbV9sYXRjaChlMmZzY2tfdCBjdHgsIGludCBtYXNrKQoreworCXN0cnVjdCBsYXRjaF9kZXNjciAqbGRlc2M7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCWludCBhbnN3ZXIgPSAtMTsKKworCWxkZXNjID0gZmluZF9sYXRjaChtYXNrKTsKKwlpZiAobGRlc2MtPmVuZF9tZXNzYWdlICYmIChsZGVzYy0+ZmxhZ3MgJiBQUkxfTEFUQ0hFRCkpIHsKKwkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwkJYW5zd2VyID0gZml4X3Byb2JsZW0oY3R4LCBsZGVzYy0+ZW5kX21lc3NhZ2UsICZwY3R4KTsKKwl9CisJbGRlc2MtPmZsYWdzICY9IH4oUFJMX1ZBUklBQkxFKTsKKwlyZXR1cm4gYW5zd2VyOworfQorCitpbnQgc2V0X2xhdGNoX2ZsYWdzKGludCBtYXNrLCBpbnQgc2V0ZmxhZ3MsIGludCBjbGVhcmZsYWdzKQoreworCXN0cnVjdCBsYXRjaF9kZXNjciAqbGRlc2M7CisKKwlsZGVzYyA9IGZpbmRfbGF0Y2gobWFzayk7CisJaWYgKCFsZGVzYykKKwkJcmV0dXJuIC0xOworCWxkZXNjLT5mbGFncyB8PSBzZXRmbGFnczsKKwlsZGVzYy0+ZmxhZ3MgJj0gfmNsZWFyZmxhZ3M7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYXJfcHJvYmxlbV9jb250ZXh0KHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKmN0eCkKK3sKKwltZW1zZXQoY3R4LCAwLCBzaXplb2Yoc3RydWN0IHByb2JsZW1fY29udGV4dCkpOworCWN0eC0+YmxrY291bnQgPSAtMTsKKwljdHgtPmdyb3VwID0gLTE7Cit9CisKK2ludCBmaXhfcHJvYmxlbShlMmZzY2tfdCBjdHgsIHByb2JsZW1fdCBjb2RlLCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwljb25zdCBzdHJ1Y3QgZTJmc2NrX3Byb2JsZW0gKnB0cjsKKwlzdHJ1Y3QgbGF0Y2hfZGVzY3IgKmxkZXNjID0gTlVMTDsKKwljb25zdCBjaGFyICptZXNzYWdlOworCWludCAgICAgICAgICAgICBkZWZfeW4sIGFuc3dlciwgYW5zOworCWludCAgICAgICAgICAgICBwcmludF9hbnN3ZXIgPSAwOworCWludCAgICAgICAgICAgICBzdXBwcmVzcyA9IDA7CisKKwlwdHIgPSBmaW5kX3Byb2JsZW0oY29kZSk7CisJaWYgKCFwdHIpIHsKKwkJcHJpbnRmKF8oIlVuaGFuZGxlZCBlcnJvciBjb2RlICgweCV4KSFcbiIpLCBjb2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCWRlZl95biA9IDE7CisJaWYgKChwdHItPmZsYWdzICYgUFJfTk9fREVGQVVMVCkgfHwKKwkgICAgKChwdHItPmZsYWdzICYgUFJfUFJFRU5fTk8pICYmIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkgfHwKKwkgICAgKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfTk8pKQorCQlkZWZfeW49IDA7CisKKwkvKgorCSAqIERvIHNwZWNpYWwgbGF0Y2ggcHJvY2Vzc2luZy4gIFRoaXMgaXMgd2hlcmUgd2UgYXNrIHRoZQorCSAqIGxhdGNoIHF1ZXN0aW9uLCBpZiBpdCBleGlzdHMKKwkgKi8KKwlpZiAocHRyLT5mbGFncyAmIFBSX0xBVENIX01BU0spIHsKKwkJbGRlc2MgPSBmaW5kX2xhdGNoKHB0ci0+ZmxhZ3MgJiBQUl9MQVRDSF9NQVNLKTsKKwkJaWYgKGxkZXNjLT5xdWVzdGlvbiAmJiAhKGxkZXNjLT5mbGFncyAmIFBSTF9MQVRDSEVEKSkgeworCQkJYW5zID0gZml4X3Byb2JsZW0oY3R4LCBsZGVzYy0+cXVlc3Rpb24sIHBjdHgpOworCQkJaWYgKGFucyA9PSAxKQorCQkJCWxkZXNjLT5mbGFncyB8PSBQUkxfWUVTOworCQkJaWYgKGFucyA9PSAwKQorCQkJCWxkZXNjLT5mbGFncyB8PSBQUkxfTk87CisJCQlsZGVzYy0+ZmxhZ3MgfD0gUFJMX0xBVENIRUQ7CisJCX0KKwkJaWYgKGxkZXNjLT5mbGFncyAmIFBSTF9TVVBQUkVTUykKKwkJCXN1cHByZXNzKys7CisJfQorCWlmICgocHRyLT5mbGFncyAmIFBSX1BSRUVOX05PTVNHKSAmJgorCSAgICAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikpCisJCXN1cHByZXNzKys7CisJaWYgKChwdHItPmZsYWdzICYgUFJfTk9fTk9NU0cpICYmCisJICAgIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX05PKSkKKwkJc3VwcHJlc3MrKzsKKwlpZiAoIXN1cHByZXNzKSB7CisJCW1lc3NhZ2UgPSBwdHItPmUycF9kZXNjcmlwdGlvbjsKKwkJaWYgKChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSAmJgorCQkgICAgIShwdHItPmZsYWdzICYgUFJfUFJFRU5fTk9IRFIpKSB7CisJCQlwcmludGYoIiVzOiAiLCBjdHgtPmRldmljZV9uYW1lID8KKwkJCSAgICAgICBjdHgtPmRldmljZV9uYW1lIDogY3R4LT5maWxlc3lzdGVtX25hbWUpOworCQl9CisJCWlmICgqbWVzc2FnZSkKKwkJCXByaW50X2UyZnNja19tZXNzYWdlKGN0eCwgXyhtZXNzYWdlKSwgcGN0eCwgMSk7CisJfQorCWlmICghKHB0ci0+ZmxhZ3MgJiBQUl9QUkVFTl9PSykgJiYgKHB0ci0+cHJvbXB0ICE9IFBST01QVF9OT05FKSkKKwkJcHJlZW5oYWx0KGN0eCk7CisKKwlpZiAocHRyLT5mbGFncyAmIFBSX0ZBVEFMKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKworCWlmIChwdHItPnByb21wdCA9PSBQUk9NUFRfTk9ORSkgeworCQlpZiAocHRyLT5mbGFncyAmIFBSX05PQ09MTEFURSkKKwkJCWFuc3dlciA9IC0xOworCQllbHNlCisJCQlhbnN3ZXIgPSBkZWZfeW47CisJfSBlbHNlIHsKKwkJaWYgKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pIHsKKwkJCWFuc3dlciA9IGRlZl95bjsKKwkJCWlmICghKHB0ci0+ZmxhZ3MgJiBQUl9QUkVFTl9OT01TRykpCisJCQkJcHJpbnRfYW5zd2VyID0gMTsKKwkJfSBlbHNlIGlmICgocHRyLT5mbGFncyAmIFBSX0xBVENIX01BU0spICYmCisJCQkgICAobGRlc2MtPmZsYWdzICYgKFBSTF9ZRVMgfCBQUkxfTk8pKSkgeworCQkJaWYgKCFzdXBwcmVzcykKKwkJCQlwcmludF9hbnN3ZXIgPSAxOworCQkJaWYgKGxkZXNjLT5mbGFncyAmIFBSTF9ZRVMpCisJCQkJYW5zd2VyID0gMTsKKwkJCWVsc2UKKwkJCQlhbnN3ZXIgPSAwOworCQl9IGVsc2UKKwkJCWFuc3dlciA9IGFzayhjdHgsIF8ocHJvbXB0WyhpbnQpIHB0ci0+cHJvbXB0XSksIGRlZl95bik7CisJCWlmICghYW5zd2VyICYmICEocHRyLT5mbGFncyAmIFBSX05PX09LKSkKKwkJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCisJCWlmIChwcmludF9hbnN3ZXIpCisJCQlwcmludGYoIiVzLlxuIiwgYW5zd2VyID8KKwkJCSAgICAgICBfKHByZWVuX21zZ1soaW50KSBwdHItPnByb21wdF0pIDogXygiSUdOT1JFRCIpKTsKKwl9CisKKwlpZiAoKHB0ci0+cHJvbXB0ID09IFBST01QVF9BQk9SVCkgJiYgYW5zd2VyKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKworCWlmIChwdHItPmZsYWdzICYgUFJfQUZURVJfQ09ERSkKKwkJYW5zd2VyID0gZml4X3Byb2JsZW0oY3R4LCBwdHItPnNlY29uZF9jb2RlLCBwY3R4KTsKKworCXJldHVybiBhbnN3ZXI7Cit9CisKKy8qCisgKiBsaW51eC9mcy9yZWNvdmVyeS5jCisgKgorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OQorICovCisKKy8qCisgKiBNYWludGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHJlY292ZXJ5IGpvYiwgc28gdGhhdAorICogdGhlIGRpZmZlcmVudCBwYXNzZXMgY2FuIGNhcnJ5IGluZm9ybWF0aW9uIGJldHdlZW4gdGhlbS4KKyAqLworc3RydWN0IHJlY292ZXJ5X2luZm8KK3sKKwl0aWRfdCAgICAgICAgICAgc3RhcnRfdHJhbnNhY3Rpb247CisJdGlkX3QgICAgICAgICAgIGVuZF90cmFuc2FjdGlvbjsKKworCWludCAgICAgICAgICAgICBucl9yZXBsYXlzOworCWludCAgICAgICAgICAgICBucl9yZXZva2VzOworCWludCAgICAgICAgICAgICBucl9yZXZva2VfaGl0czsKK307CisKK2VudW0gcGFzc3R5cGUge1BBU1NfU0NBTiwgUEFTU19SRVZPS0UsIFBBU1NfUkVQTEFZfTsKK3N0YXRpYyBpbnQgZG9fb25lX3Bhc3Moam91cm5hbF90ICpqb3VybmFsLAorCQkJCXN0cnVjdCByZWNvdmVyeV9pbmZvICppbmZvLCBlbnVtIHBhc3N0eXBlIHBhc3MpOworc3RhdGljIGludCBzY2FuX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWxfdCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKKwkJCQl0aWRfdCwgc3RydWN0IHJlY292ZXJ5X2luZm8gKik7CisKKy8qCisgKiBSZWFkIGEgYmxvY2sgZnJvbSB0aGUgam91cm5hbAorICovCisKK3N0YXRpYyBpbnQganJlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwLCBqb3VybmFsX3QgKmpvdXJuYWwsCisJCSB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBibG9ja25yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqYmhwID0gTlVMTDsKKworCWVyciA9IGpvdXJuYWxfYm1hcChqb3VybmFsLCBvZmZzZXQsICZibG9ja25yKTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRmKCJKQkQ6IGJhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsIG9mZnNldCk7CisJCXJldHVybiBlcnI7CisJfQorCisJYmggPSBnZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkvKiBJZiB0aGlzIGlzIGEgYnJhbmQgbmV3IGJ1ZmZlciwgc3RhcnQgcmVhZGFoZWFkLgorCQkgICBPdGhlcndpc2UsIHdlIGFzc3VtZSB3ZSBhcmUgYWxyZWFkeSByZWFkaW5nIGl0LiAgKi8KKwkJaWYgKCFidWZmZXJfcmVxKGJoKSkKKwkJCWRvX3JlYWRhaGVhZChqb3VybmFsLCBvZmZzZXQpOworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJfQorCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCXByaW50ZigiSkJEOiBGYWlsZWQgdG8gcmVhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsIG9mZnNldCk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAtRUlPOworCX0KKworCSpiaHAgPSBiaDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQ291bnQgdGhlIG51bWJlciBvZiBpbi11c2UgdGFncyBpbiBhIGpvdXJuYWwgZGVzY3JpcHRvciBibG9jay4KKyAqLworCitzdGF0aWMgaW50IGNvdW50X3RhZ3Moc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHNpemUpCit7CisJY2hhciAqICAgICAgICAgICAgICAgICAgdGFncDsKKwlqb3VybmFsX2Jsb2NrX3RhZ190ICogICB0YWc7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbnIgPSAwOworCisJdGFncCA9ICZiaC0+Yl9kYXRhW3NpemVvZihqb3VybmFsX2hlYWRlcl90KV07CisKKwl3aGlsZSAoKHRhZ3AgLSBiaC0+Yl9kYXRhICsgc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpKSA8PSBzaXplKSB7CisJCXRhZyA9IChqb3VybmFsX2Jsb2NrX3RhZ190ICopIHRhZ3A7CisKKwkJbnIrKzsKKwkJdGFncCArPSBzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCk7CisJCWlmICghKHRhZy0+dF9mbGFncyAmIGh0b25sKEpGU19GTEFHX1NBTUVfVVVJRCkpKQorCQkJdGFncCArPSAxNjsKKworCQlpZiAodGFnLT50X2ZsYWdzICYgaHRvbmwoSkZTX0ZMQUdfTEFTVF9UQUcpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5yOworfQorCisKKy8qIE1ha2Ugc3VyZSB3ZSB3cmFwIGFyb3VuZCB0aGUgbG9nIGNvcnJlY3RseSEgKi8KKyNkZWZpbmUgd3JhcChqb3VybmFsLCB2YXIpCQkJCQkgICAgICBcCitkbyB7CQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICh2YXIgPj0gKGpvdXJuYWwpLT5qX2xhc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXZhciAtPSAoKGpvdXJuYWwpLT5qX2xhc3QgLSAoam91cm5hbCktPmpfZmlyc3QpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqCisgKiBpbnQgam91cm5hbF9yZWNvdmVyKGpvdXJuYWxfdCAqam91cm5hbCkgLSByZWNvdmVycyBhIG9uLWRpc2sgam91cm5hbAorICogQGpvdXJuYWw6IHRoZSBqb3VybmFsIHRvIHJlY292ZXIKKyAqCisgKiBUaGUgcHJpbWFyeSBmdW5jdGlvbiBmb3IgcmVjb3ZlcmluZyB0aGUgbG9nIGNvbnRlbnRzIHdoZW4gbW91bnRpbmcgYQorICogam91cm5hbGVkIGRldmljZS4KKyAqCisgKiBSZWNvdmVyeSBpcyBkb25lIGluIHRocmVlIHBhc3Nlcy4gIEluIHRoZSBmaXJzdCBwYXNzLCB3ZSBsb29rIGZvciB0aGUKKyAqIGVuZCBvZiB0aGUgbG9nLiAgSW4gdGhlIHNlY29uZCwgd2UgYXNzZW1ibGUgdGhlIGxpc3Qgb2YgcmV2b2tlCisgKiBibG9ja3MuICBJbiB0aGUgdGhpcmQgYW5kIGZpbmFsIHBhc3MsIHdlIHJlcGxheSBhbnkgdW4tcmV2b2tlZCBibG9ja3MKKyAqIGluIHRoZSBsb2cuCisgKi8KK2ludCBqb3VybmFsX3JlY292ZXIoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCAgICAgICAgICAgICAgICAgICAgIGVycjsKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqICBzYjsKKworCXN0cnVjdCByZWNvdmVyeV9pbmZvICAgIGluZm87CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwkvKgorCSAqIFRoZSBqb3VybmFsIHN1cGVyYmxvY2sncyBzX3N0YXJ0IGZpZWxkICh0aGUgY3VycmVudCBsb2cgaGVhZCkKKwkgKiBpcyBhbHdheXMgemVybyBpZiwgYW5kIG9ubHkgaWYsIHRoZSBqb3VybmFsIHdhcyBjbGVhbmx5CisJICogdW5tb3VudGVkLgorCSAqLworCisJaWYgKCFzYi0+c19zdGFydCkgeworCQlqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlID0gbnRvaGwoc2ItPnNfc2VxdWVuY2UpICsgMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfU0NBTik7CisJaWYgKCFlcnIpCisJCWVyciA9IGRvX29uZV9wYXNzKGpvdXJuYWwsICZpbmZvLCBQQVNTX1JFVk9LRSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGRvX29uZV9wYXNzKGpvdXJuYWwsICZpbmZvLCBQQVNTX1JFUExBWSk7CisKKwkvKiBSZXN0YXJ0IHRoZSBsb2cgYXQgdGhlIG5leHQgdHJhbnNhY3Rpb24gSUQsIHRodXMgaW52YWxpZGF0aW5nCisJICogYW55IGV4aXN0aW5nIGNvbW1pdCByZWNvcmRzIGluIHRoZSBsb2cuICovCisJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CisKKwlqb3VybmFsX2NsZWFyX3Jldm9rZShqb3VybmFsKTsKKwlzeW5jX2Jsb2NrZGV2KGpvdXJuYWwtPmpfZnNfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX29uZV9wYXNzKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCXN0cnVjdCByZWNvdmVyeV9pbmZvICppbmZvLCBlbnVtIHBhc3N0eXBlIHBhc3MpCit7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZmlyc3RfY29tbWl0X0lELCBuZXh0X2NvbW1pdF9JRDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBuZXh0X2xvZ19ibG9jazsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlcnIsIHN1Y2Nlc3MgPSAwOworCWpvdXJuYWxfc3VwZXJibG9ja190ICogIHNiOworCWpvdXJuYWxfaGVhZGVyX3QgKiAgICAgIHRtcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiAgICBiaDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBzZXF1ZW5jZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBibG9ja3R5cGU7CisKKwkvKiBQcmVjb21wdXRlIHRoZSBtYXhpbXVtIG1ldGFkYXRhIGRlc2NyaXB0b3JzIGluIGEgZGVzY3JpcHRvciBibG9jayAqLworCWludCAgICAgICAgICAgICAgICAgICAgIE1BWF9CTE9DS1NfUEVSX0RFU0M7CisJTUFYX0JMT0NLU19QRVJfREVTQyA9ICgoam91cm5hbC0+al9ibG9ja3NpemUtc2l6ZW9mKGpvdXJuYWxfaGVhZGVyX3QpKQorCQkJICAgICAgIC8gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpKTsKKworCS8qCisJICogRmlyc3QgdGhpbmcgaXMgdG8gZXN0YWJsaXNoIHdoYXQgd2UgZXhwZWN0IHRvIGZpbmQgaW4gdGhlIGxvZworCSAqIChpbiB0ZXJtcyBvZiB0cmFuc2FjdGlvbiBJRHMpLCBhbmQgd2hlcmUgKGluIHRlcm1zIG9mIGxvZworCSAqIGJsb2NrIG9mZnNldHMpOiBxdWVyeSB0aGUgc3VwZXJibG9jay4KKwkgKi8KKworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCW5leHRfY29tbWl0X0lEID0gbnRvaGwoc2ItPnNfc2VxdWVuY2UpOworCW5leHRfbG9nX2Jsb2NrID0gbnRvaGwoc2ItPnNfc3RhcnQpOworCisJZmlyc3RfY29tbWl0X0lEID0gbmV4dF9jb21taXRfSUQ7CisJaWYgKHBhc3MgPT0gUEFTU19TQ0FOKQorCQlpbmZvLT5zdGFydF90cmFuc2FjdGlvbiA9IGZpcnN0X2NvbW1pdF9JRDsKKworCS8qCisJICogTm93IHdlIHdhbGsgdGhyb3VnaCB0aGUgbG9nLCB0cmFuc2FjdGlvbiBieSB0cmFuc2FjdGlvbiwKKwkgKiBtYWtpbmcgc3VyZSB0aGF0IGVhY2ggdHJhbnNhY3Rpb24gaGFzIGEgY29tbWl0IGJsb2NrIGluIHRoZQorCSAqIGV4cGVjdGVkIHBsYWNlLiAgRWFjaCBjb21wbGV0ZSB0cmFuc2FjdGlvbiBnZXRzIHJlcGxheWVkIGJhY2sKKwkgKiBpbnRvIHRoZSBtYWluIGZpbGVzeXN0ZW0uCisJICovCisKKwl3aGlsZSAoMSkgeworCQlpbnQgICAgICAgICAgICAgICAgICAgICBmbGFnczsKKwkJY2hhciAqICAgICAgICAgICAgICAgICAgdGFncDsKKwkJam91cm5hbF9ibG9ja190YWdfdCAqICAgdGFnOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiAgICBvYmg7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqICAgIG5iaDsKKworCQkvKiBJZiB3ZSBhbHJlYWR5IGtub3cgd2hlcmUgdG8gc3RvcCB0aGUgbG9nIHRyYXZlcnNhbCwKKwkJICogY2hlY2sgcmlnaHQgbm93IHRoYXQgd2UgaGF2ZW4ndCBnb25lIHBhc3QgdGhlIGVuZCBvZgorCQkgKiB0aGUgbG9nLiAqLworCisJCWlmIChwYXNzICE9IFBBU1NfU0NBTikKKwkJCWlmICh0aWRfZ2VxKG5leHRfY29tbWl0X0lELCBpbmZvLT5lbmRfdHJhbnNhY3Rpb24pKQorCQkJCWJyZWFrOworCisJCS8qIFNraXAgb3ZlciBlYWNoIGNodW5rIG9mIHRoZSB0cmFuc2FjdGlvbiBsb29raW5nCisJCSAqIGVpdGhlciB0aGUgbmV4dCBkZXNjcmlwdG9yIGJsb2NrIG9yIHRoZSBmaW5hbCBjb21taXQKKwkJICogcmVjb3JkLiAqLworCisJCWVyciA9IGpyZWFkKCZiaCwgam91cm5hbCwgbmV4dF9sb2dfYmxvY2spOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsZWQ7CisKKwkJbmV4dF9sb2dfYmxvY2srKzsKKwkJd3JhcChqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisKKwkJLyogV2hhdCBraW5kIG9mIGJ1ZmZlciBpcyBpdD8KKwkJICoKKwkJICogSWYgaXQgaXMgYSBkZXNjcmlwdG9yIGJsb2NrLCBjaGVjayB0aGF0IGl0IGhhcyB0aGUKKwkJICogZXhwZWN0ZWQgc2VxdWVuY2UgbnVtYmVyLiAgT3RoZXJ3aXNlLCB3ZSdyZSBhbGwgZG9uZQorCQkgKiBoZXJlLiAqLworCisJCXRtcCA9IChqb3VybmFsX2hlYWRlcl90ICopYmgtPmJfZGF0YTsKKworCQlpZiAodG1wLT5oX21hZ2ljICE9IGh0b25sKEpGU19NQUdJQ19OVU1CRVIpKSB7CisJCQlicmVsc2UoYmgpOworCQkJYnJlYWs7CisJCX0KKworCQlibG9ja3R5cGUgPSBudG9obCh0bXAtPmhfYmxvY2t0eXBlKTsKKwkJc2VxdWVuY2UgPSBudG9obCh0bXAtPmhfc2VxdWVuY2UpOworCisJCWlmIChzZXF1ZW5jZSAhPSBuZXh0X2NvbW1pdF9JRCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogT0ssIHdlIGhhdmUgYSB2YWxpZCBkZXNjcmlwdG9yIGJsb2NrIHdoaWNoIG1hdGNoZXMKKwkJICogYWxsIG9mIHRoZSBzZXF1ZW5jZSBudW1iZXIgY2hlY2tzLiAgV2hhdCBhcmUgd2UgZ29pbmcKKwkJICogdG8gZG8gd2l0aCBpdD8gIFRoYXQgZGVwZW5kcyBvbiB0aGUgcGFzcy4uLiAqLworCisJCXN3aXRjaCAoYmxvY2t0eXBlKSB7CisJCWNhc2UgSkZTX0RFU0NSSVBUT1JfQkxPQ0s6CisJCQkvKiBJZiBpdCBpcyBhIHZhbGlkIGRlc2NyaXB0b3IgYmxvY2ssIHJlcGxheSBpdAorCQkJICogaW4gcGFzcyBSRVBMQVk7IG90aGVyd2lzZSwganVzdCBza2lwIG92ZXIgdGhlCisJCQkgKiBibG9ja3MgaXQgZGVzY3JpYmVzLiAqLworCQkJaWYgKHBhc3MgIT0gUEFTU19SRVBMQVkpIHsKKwkJCQluZXh0X2xvZ19ibG9jayArPQorCQkJCQljb3VudF90YWdzKGJoLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJCQkJd3JhcChqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCQkJYnJlbHNlKGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogQSBkZXNjcmlwdG9yIGJsb2NrOiB3ZSBjYW4gbm93IHdyaXRlIGFsbCBvZgorCQkJICogdGhlIGRhdGEgYmxvY2tzLiAgWWF5LCB1c2VmdWwgd29yayBpcyBmaW5hbGx5CisJCQkgKiBnZXR0aW5nIGRvbmUgaGVyZSEgKi8KKworCQkJdGFncCA9ICZiaC0+Yl9kYXRhW3NpemVvZihqb3VybmFsX2hlYWRlcl90KV07CisJCQl3aGlsZSAoKHRhZ3AgLSBiaC0+Yl9kYXRhICtzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCkpCisJCQkgICAgICAgPD0gam91cm5hbC0+al9ibG9ja3NpemUpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGlvX2Jsb2NrOworCisJCQkJdGFnID0gKGpvdXJuYWxfYmxvY2tfdGFnX3QgKikgdGFncDsKKwkJCQlmbGFncyA9IG50b2hsKHRhZy0+dF9mbGFncyk7CisKKwkJCQlpb19ibG9jayA9IG5leHRfbG9nX2Jsb2NrKys7CisJCQkJd3JhcChqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCQkJZXJyID0ganJlYWQoJm9iaCwgam91cm5hbCwgaW9fYmxvY2spOworCQkJCWlmIChlcnIpIHsKKwkJCQkJLyogUmVjb3ZlciB3aGF0IHdlIGNhbiwgYnV0CisJCQkJCSAqIHJlcG9ydCBmYWlsdXJlIGF0IHRoZSBlbmQuICovCisJCQkJCXN1Y2Nlc3MgPSBlcnI7CisJCQkJCXByaW50ZigiSkJEOiBJTyBlcnJvciAlZCByZWNvdmVyaW5nICIKKwkJCQkJCSJibG9jayAlbGQgaW4gbG9nXG4iLAorCQkJCQkJZXJyLCBpb19ibG9jayk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5zaWduZWQgbG9uZyBibG9ja25yOworCisJCQkJCWJsb2NrbnIgPSBudG9obCh0YWctPnRfYmxvY2tucik7CisKKwkJCQkJLyogSWYgdGhlIGJsb2NrIGhhcyBiZWVuCisJCQkJCSAqIHJldm9rZWQsIHRoZW4gd2UncmUgYWxsIGRvbmUKKwkJCQkJICogaGVyZS4gKi8KKwkJCQkJaWYgKGpvdXJuYWxfdGVzdF9yZXZva2UKKwkJCQkJICAgIChqb3VybmFsLCBibG9ja25yLAorCQkJCQkgICAgIG5leHRfY29tbWl0X0lEKSkgeworCQkJCQkJYnJlbHNlKG9iaCk7CisJCQkJCQkrK2luZm8tPm5yX3Jldm9rZV9oaXRzOworCQkJCQkJZ290byBza2lwX3dyaXRlOworCQkJCQl9CisKKwkJCQkJLyogRmluZCBhIGJ1ZmZlciBmb3IgdGhlIG5ldworCQkJCQkgKiBkYXRhIGJlaW5nIHJlc3RvcmVkICovCisJCQkJCW5iaCA9IGdldGJsayhqb3VybmFsLT5qX2ZzX2RldiwKKwkJCQkJCSAgICAgICBibG9ja25yLAorCQkJCQkJICAgICBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJCQkJCWlmIChuYmggPT0gTlVMTCkgeworCQkJCQkJcHJpbnRmKCJKQkQ6IE91dCBvZiBtZW1vcnkgIgorCQkJCQkJICAgICAgICJkdXJpbmcgcmVjb3ZlcnkuXG4iKTsKKwkJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJCQlicmVsc2UoYmgpOworCQkJCQkJYnJlbHNlKG9iaCk7CisJCQkJCQlnb3RvIGZhaWxlZDsKKwkJCQkJfQorCisJCQkJCWxvY2tfYnVmZmVyKG5iaCk7CisJCQkJCW1lbWNweShuYmgtPmJfZGF0YSwgb2JoLT5iX2RhdGEsCisJCQkJCQkJam91cm5hbC0+al9ibG9ja3NpemUpOworCQkJCQlpZiAoZmxhZ3MgJiBKRlNfRkxBR19FU0NBUEUpIHsKKwkJCQkJCSooKHVuc2lnbmVkIGludCAqKWJoLT5iX2RhdGEpID0KKwkJCQkJCQlodG9ubChKRlNfTUFHSUNfTlVNQkVSKTsKKwkJCQkJfQorCisJCQkJCW1hcmtfYnVmZmVyX3VwdG9kYXRlKG5iaCwgMSk7CisJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KG5iaCk7CisJCQkJCSsraW5mby0+bnJfcmVwbGF5czsKKwkJCQkJLyogbGxfcndfYmxvY2soV1JJVEUsIDEsICZuYmgpOyAqLworCQkJCQl1bmxvY2tfYnVmZmVyKG5iaCk7CisJCQkJCWJyZWxzZShvYmgpOworCQkJCQlicmVsc2UobmJoKTsKKwkJCQl9CisKKwkJCXNraXBfd3JpdGU6CisJCQkJdGFncCArPSBzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCk7CisJCQkJaWYgKCEoZmxhZ3MgJiBKRlNfRkxBR19TQU1FX1VVSUQpKQorCQkJCQl0YWdwICs9IDE2OworCisJCQkJaWYgKGZsYWdzICYgSkZTX0ZMQUdfTEFTVF9UQUcpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlicmVsc2UoYmgpOworCQkJY29udGludWU7CisKKwkJY2FzZSBKRlNfQ09NTUlUX0JMT0NLOgorCQkJLyogRm91bmQgYW4gZXhwZWN0ZWQgY29tbWl0IGJsb2NrOiBub3QgbXVjaCB0bworCQkJICogZG8gb3RoZXIgdGhhbiBtb3ZlIG9uIHRvIHRoZSBuZXh0IHNlcXVlbmNlCisJCQkgKiBudW1iZXIuICovCisJCQlicmVsc2UoYmgpOworCQkJbmV4dF9jb21taXRfSUQrKzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgSkZTX1JFVk9LRV9CTE9DSzoKKwkJCS8qIElmIHdlIGFyZW4ndCBpbiB0aGUgUkVWT0tFIHBhc3MsIHRoZW4gd2UgY2FuCisJCQkgKiBqdXN0IHNraXAgb3ZlciB0aGlzIGJsb2NrLiAqLworCQkJaWYgKHBhc3MgIT0gUEFTU19SRVZPS0UpIHsKKwkJCQlicmVsc2UoYmgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQllcnIgPSBzY2FuX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWwsIGJoLAorCQkJCQkJICBuZXh0X2NvbW1pdF9JRCwgaW5mbyk7CisJCQlicmVsc2UoYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGZhaWxlZDsKKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKyBkb25lOgorCS8qCisJICogV2UgYnJva2Ugb3V0IG9mIHRoZSBsb2cgc2NhbiBsb29wOiBlaXRoZXIgd2UgY2FtZSB0byB0aGUKKwkgKiBrbm93biBlbmQgb2YgdGhlIGxvZyBvciB3ZSBmb3VuZCBhbiB1bmV4cGVjdGVkIGJsb2NrIGluIHRoZQorCSAqIGxvZy4gIElmIHRoZSBsYXR0ZXIgaGFwcGVuZWQsIHRoZW4gd2Uga25vdyB0aGF0IHRoZSAiY3VycmVudCIKKwkgKiB0cmFuc2FjdGlvbiBtYXJrcyB0aGUgZW5kIG9mIHRoZSB2YWxpZCBsb2cuCisJICovCisKKwlpZiAocGFzcyA9PSBQQVNTX1NDQU4pCisJCWluZm8tPmVuZF90cmFuc2FjdGlvbiA9IG5leHRfY29tbWl0X0lEOworCWVsc2UgeworCQkvKiBJdCdzIHJlYWxseSBiYWQgbmV3cyBpZiBkaWZmZXJlbnQgcGFzc2VzIGVuZCB1cCBhdAorCQkgKiBkaWZmZXJlbnQgcGxhY2VzIChidXQgcG9zc2libGUgZHVlIHRvIElPIGVycm9ycykuICovCisJCWlmIChpbmZvLT5lbmRfdHJhbnNhY3Rpb24gIT0gbmV4dF9jb21taXRfSUQpIHsKKwkJCXByaW50ZigiSkJEOiByZWNvdmVyeSBwYXNzICVkIGVuZGVkIGF0ICIKKwkJCQkidHJhbnNhY3Rpb24gJXUsIGV4cGVjdGVkICV1XG4iLAorCQkJCXBhc3MsIG5leHRfY29tbWl0X0lELCBpbmZvLT5lbmRfdHJhbnNhY3Rpb24pOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCXN1Y2Nlc3MgPSAtRUlPOworCQl9CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7CisKKyBmYWlsZWQ6CisJcmV0dXJuIGVycjsKK30KKworCisvKiBTY2FuIGEgcmV2b2tlIHJlY29yZCwgbWFya2luZyBhbGwgYmxvY2tzIG1lbnRpb25lZCBhcyByZXZva2VkLiAqLworCitzdGF0aWMgaW50IHNjYW5fcmV2b2tlX3JlY29yZHMoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJICAgICAgIHRpZF90IHNlcXVlbmNlLCBzdHJ1Y3QgcmVjb3ZlcnlfaW5mbyAqaW5mbykKK3sKKwlqb3VybmFsX3Jldm9rZV9oZWFkZXJfdCAqaGVhZGVyOworCWludCBvZmZzZXQsIG1heDsKKworCWhlYWRlciA9IChqb3VybmFsX3Jldm9rZV9oZWFkZXJfdCAqKSBiaC0+Yl9kYXRhOworCW9mZnNldCA9IHNpemVvZihqb3VybmFsX3Jldm9rZV9oZWFkZXJfdCk7CisJbWF4ID0gbnRvaGwoaGVhZGVyLT5yX2NvdW50KTsKKworCXdoaWxlIChvZmZzZXQgPCBtYXgpIHsKKwkJdW5zaWduZWQgbG9uZyBibG9ja25yOworCQlpbnQgZXJyOworCisJCWJsb2NrbnIgPSBudG9obCgqICgodW5zaWduZWQgaW50ICopIChiaC0+Yl9kYXRhK29mZnNldCkpKTsKKwkJb2Zmc2V0ICs9IDQ7CisJCWVyciA9IGpvdXJuYWxfc2V0X3Jldm9rZShqb3VybmFsLCBibG9ja25yLCBzZXF1ZW5jZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkrK2luZm8tPm5yX3Jldm9rZXM7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiByZWhhc2guYyAtLS0gcmVidWlsZCBoYXNoIHRyZWUgZGlyZWN0b3JpZXMKKyAqCisgKiBUaGlzIGFsZ29yaXRobSBpcyBkZXNpZ25lZCBmb3Igc2ltcGxpY2l0eSBvZiBpbXBsZW1lbnRhdGlvbiBhbmQgdG8KKyAqIHBhY2sgdGhlIGRpcmVjdG9yeSBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSXQgaG93ZXZlciByZXF1aXJlcyB0d2ljZQorICogYXMgbXVjaCBtZW1vcnkgYXMgdGhlIHNpemUgb2YgdGhlIGRpcmVjdG9yeS4gIFRoZSBtYXhpbXVtIHNpemUKKyAqIGRpcmVjdG9yeSBzdXBwb3J0ZWQgdXNpbmcgYSA0ayBibG9ja3NpemUgaXMgcm91Z2hseSBhIGdpZ2FieXRlLCBhbmQKKyAqIHNvIHRoZXJlIG1heSB2ZXJ5IHdlbGwgYmUgcHJvYmxlbXMgd2l0aCBtYWNoaW5lcyB0aGF0IGRvbid0IGhhdmUKKyAqIHZpcnR1YWwgbWVtb3J5LCBhbmQgb2JzY2VuZWx5IGxhcmdlIGRpcmVjdG9yaWVzLgorICoKKyAqIEFuIGFsdGVybmF0ZSBhbGdvcml0aG0gd2hpY2ggaXMgbXVjaCBtb3JlIGRpc2sgaW50ZW5zaXZlIGNvdWxkIGJlCisgKiB3cml0dGVuLCBhbmQgcHJvYmFibHkgd2lsbCBuZWVkIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIGZ1dHVyZS4gIFRoZQorICogZGVzaWduIGdvYWxzIG9mIHN1Y2ggYW4gYWxnb3JpdGhtIGFyZTogKGEpIHVzZSAocm91Z2hseSkgY29uc3RhbnQKKyAqIGFtb3VudHMgb2YgbWVtb3J5LCBubyBtYXR0ZXIgaG93IGxhcmdlIHRoZSBkaXJlY3RvcnksIChiKSB0aGUKKyAqIGRpcmVjdG9yeSBtdXN0IGJlIHNhZmUgYXQgYWxsIHRpbWVzLCBldmVuIGlmIGUyZnNjayBpcyBpbnRlcnJ1cHRlZAorICogaW4gdGhlIG1pZGRsZSwgKGMpIHdlIG11c3QgdXNlIG1pbmltYWwgYW1vdW50cyBvZiBleHRyYSBkaXNrCisgKiBibG9ja3MuICBUaGlzIHByZXR0eSBtdWNoIHJlcXVpcmVzIGFuIGluY3JlbWVudGFsIGFwcHJvYWNoLCB3aGVyZQorICogd2UgYXJlIHJlYWRpbmcgZnJvbSBvbmUgcGFydCBvZiB0aGUgZGlyZWN0b3J5LCBhbmQgaW5zZXJ0aW5nIGludG8KKyAqIHRoZSBmcm9udCBoYWxmLiAgU28gdGhlIGFsZ29yaXRobSB3aWxsIGhhdmUgdG8ga2VlcCB0cmFjayBvZiBhCisgKiBtb3ZpbmcgYmxvY2sgYm91bmRhcnkgYmV0d2VlbiB0aGUgbmV3IHRyZWUgYW5kIHRoZSBvbGQgdHJlZSwgYW5kCisgKiBmaWxlcyB3aWxsIG5lZWQgdG8gYmUgbW92ZWQgZnJvbSB0aGUgb2xkIGRpcmVjdG9yeSBhbmQgaW5zZXJ0ZWQKKyAqIGludG8gdGhlIG5ldyB0cmVlLiAgSWYgdGhlIG5ldyBkaXJlY3RvcnkgcmVxdWlyZXMgc3BhY2Ugd2hpY2ggaXNuJ3QKKyAqIHlldCBhdmFpbGFibGUsIGJsb2NrcyBmcm9tIHRoZSBiZWdpbm5pbmcgcGFydCBvZiB0aGUgb2xkIGRpcmVjdG9yeQorICogbWF5IG5lZWQgdG8gYmUgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5IHRvIG1ha2Ugcm9vbSBmb3IKKyAqIHRoZSBuZXcgdHJlZToKKyAqCisgKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgfCAgbmV3IHRyZWUgICB8ICAgICAgICB8IG9sZCB0cmVlICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgIF4gcHRyICAgIF5wdHIKKyAqICAgICAgICAgICAgICAgIHRhaWwgbmV3ICAgaGVhZCBvbGQKKyAqCisgKiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgcGFpbiBpbiB0aGUgdHVja3VzIHRvIGltcGxlbWVudCwgYW5kIHdpbGwKKyAqIHJlcXVpcmUgYSBsb3QgbW9yZSBkaXNrIGFjY2Vzc2VzLiAgU28gSSdtIGdvaW5nIHRvIHNraXAgaXQgZm9yIG5vdzsKKyAqIGl0J3Mgb25seSByZWFsbHkgZ29pbmcgdG8gYmUgYW4gaXNzdWUgZm9yIHJlYWxseSwgcmVhbGx5IGJpZworICogZmlsZXN5c3RlbXMgKHdoZW4gd2UgcmVhY2ggdGhlIGxldmVsIG9mIHRlbnMgb2YgbWlsbGlvbnMgb2YgZmlsZXMKKyAqIGluIGEgc2luZ2xlIGRpcmVjdG9yeSkuICBJdCB3aWxsIHByb2JhYmx5IGJlIGVhc2llciB0byBzaW1wbHkKKyAqIHJlcXVpcmUgdGhhdCBlMmZzY2sgdXNlIFZNIGZpcnN0LgorICovCisKK3N0cnVjdCBmaWxsX2Rpcl9zdHJ1Y3QgeworCWNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGU7CisJaW50IGVycjsKKwllMmZzY2tfdCBjdHg7CisJc3RydWN0IGhhc2hfZW50cnkgKmhhcnJheTsKKwlpbnQgbWF4X2FycmF5LCBudW1fYXJyYXk7CisJaW50IGRpcl9zaXplOworCWludCBjb21wcmVzczsKKwlpbm9fdCBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgaGFzaF9lbnRyeSB7CisJZXh0Ml9kaXJoYXNoX3QgIGhhc2g7CisJZXh0Ml9kaXJoYXNoX3QgIG1pbm9yX2hhc2g7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICAgKmRpcjsKK307CisKK3N0cnVjdCBvdXRfZGlyIHsKKwlpbnQgICAgICAgICAgICAgbnVtOworCWludCAgICAgICAgICAgICBtYXg7CisJY2hhciAgICAgICAgICAgICpidWY7CisJZXh0Ml9kaXJoYXNoX3QgICpoYXNoZXM7Cit9OworCitzdGF0aWMgaW50IGZpbGxfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLAorCQkJICBibGtfdCAqYmxvY2tfbnIsCisJCQkgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJICBibGtfdCByZWZfYmxvY2sgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgaW50IHJlZl9vZmZzZXQgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBmaWxsX2Rpcl9zdHJ1Y3QgICpmZCA9IChzdHJ1Y3QgZmlsbF9kaXJfc3RydWN0ICopIHByaXZfZGF0YTsKKwlzdHJ1Y3QgaGFzaF9lbnRyeSAgICAgICAqbmV3X2FycmF5LCAqZW50OworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAgICpkaXJlbnQ7CisJY2hhciAgICAgICAgICAgICAgICAgICAgKmRpcjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvZmZzZXQsIGRpcl9vZmZzZXQ7CisKKwlpZiAoYmxvY2tjbnQgPCAwKQorCQlyZXR1cm4gMDsKKworCW9mZnNldCA9IGJsb2NrY250ICogZnMtPmJsb2Nrc2l6ZTsKKwlpZiAob2Zmc2V0ICsgZnMtPmJsb2Nrc2l6ZSA+IGZkLT5pbm9kZS0+aV9zaXplKSB7CisJCWZkLT5lcnIgPSBFWFQyX0VUX0RJUl9DT1JSVVBURUQ7CisJCXJldHVybiBCTE9DS19BQk9SVDsKKwl9CisJZGlyID0gKGZkLT5idWYrb2Zmc2V0KTsKKwlpZiAoSE9MRV9CTEtBRERSKCpibG9ja19ucikpIHsKKwkJbWVtc2V0KGRpciwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisJCWRpcmVudCA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgZGlyOworCQlkaXJlbnQtPnJlY19sZW4gPSBmcy0+YmxvY2tzaXplOworCX0gZWxzZSB7CisJCWZkLT5lcnIgPSBleHQyZnNfcmVhZF9kaXJfYmxvY2soZnMsICpibG9ja19uciwgZGlyKTsKKwkJaWYgKGZkLT5lcnIpCisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJfQorCS8qIFdoaWxlIHRoZSBkaXJlY3RvcnkgYmxvY2sgaXMgImhvdCIsIGluZGV4IGl0LiAqLworCWRpcl9vZmZzZXQgPSAwOworCXdoaWxlIChkaXJfb2Zmc2V0IDwgZnMtPmJsb2Nrc2l6ZSkgeworCQlkaXJlbnQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIChkaXIgKyBkaXJfb2Zmc2V0KTsKKwkJaWYgKCgoZGlyX29mZnNldCArIGRpcmVudC0+cmVjX2xlbikgPiBmcy0+YmxvY2tzaXplKSB8fAorCQkgICAgKGRpcmVudC0+cmVjX2xlbiA8IDgpIHx8CisJCSAgICAoKGRpcmVudC0+cmVjX2xlbiAlIDQpICE9IDApIHx8CisJCSAgICAoKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikrOCkgPiBkaXJlbnQtPnJlY19sZW4pKSB7CisJCQlmZC0+ZXJyID0gRVhUMl9FVF9ESVJfQ09SUlVQVEVEOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJCWRpcl9vZmZzZXQgKz0gZGlyZW50LT5yZWNfbGVuOworCQlpZiAoZGlyZW50LT5pbm9kZSA9PSAwKQorCQkJY29udGludWU7CisJCWlmICghZmQtPmNvbXByZXNzICYmICgoZGlyZW50LT5uYW1lX2xlbiYweEZGKSA9PSAxKSAmJgorCQkgICAgKGRpcmVudC0+bmFtZVswXSA9PSAnLicpKQorCQkJY29udGludWU7CisJCWlmICghZmQtPmNvbXByZXNzICYmICgoZGlyZW50LT5uYW1lX2xlbiYweEZGKSA9PSAyKSAmJgorCQkgICAgKGRpcmVudC0+bmFtZVswXSA9PSAnLicpICYmIChkaXJlbnQtPm5hbWVbMV0gPT0gJy4nKSkgeworCQkJZmQtPnBhcmVudCA9IGRpcmVudC0+aW5vZGU7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZmQtPm51bV9hcnJheSA+PSBmZC0+bWF4X2FycmF5KSB7CisJCQluZXdfYXJyYXkgPSB4cmVhbGxvYyhmZC0+aGFycmF5LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgaGFzaF9lbnRyeSkgKiAoZmQtPm1heF9hcnJheSs1MDApKTsKKwkJCWZkLT5oYXJyYXkgPSBuZXdfYXJyYXk7CisJCQlmZC0+bWF4X2FycmF5ICs9IDUwMDsKKwkJfQorCQllbnQgPSBmZC0+aGFycmF5ICsgZmQtPm51bV9hcnJheSsrOworCQllbnQtPmRpciA9IGRpcmVudDsKKwkJZmQtPmRpcl9zaXplICs9IEVYVDJfRElSX1JFQ19MRU4oZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpOworCQlpZiAoZmQtPmNvbXByZXNzKQorCQkJZW50LT5oYXNoID0gZW50LT5taW5vcl9oYXNoID0gMDsKKwkJZWxzZSB7CisJCQlmZC0+ZXJyID0gZXh0MmZzX2Rpcmhhc2goZnMtPnN1cGVyLT5zX2RlZl9oYXNoX3ZlcnNpb24sCisJCQkJCQkgZGlyZW50LT5uYW1lLAorCQkJCQkJIGRpcmVudC0+bmFtZV9sZW4gJiAweEZGLAorCQkJCQkJIGZzLT5zdXBlci0+c19oYXNoX3NlZWQsCisJCQkJCQkgJmVudC0+aGFzaCwgJmVudC0+bWlub3JfaGFzaCk7CisJCQlpZiAoZmQtPmVycikKKwkJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVXNlZCBmb3Igc29ydGluZyB0aGUgaGFzaCBlbnRyeSAqLworc3RhdGljIGludCBuYW1lX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBoYXNoX2VudHJ5ICpoZV9hID0gKGNvbnN0IHN0cnVjdCBoYXNoX2VudHJ5ICopIGE7CisJY29uc3Qgc3RydWN0IGhhc2hfZW50cnkgKmhlX2IgPSAoY29uc3Qgc3RydWN0IGhhc2hfZW50cnkgKikgYjsKKwlpbnQgICAgIHJldDsKKwlpbnQgICAgIG1pbl9sZW47CisKKwltaW5fbGVuID0gaGVfYS0+ZGlyLT5uYW1lX2xlbjsKKwlpZiAobWluX2xlbiA+IGhlX2ItPmRpci0+bmFtZV9sZW4pCisJCW1pbl9sZW4gPSBoZV9iLT5kaXItPm5hbWVfbGVuOworCisJcmV0ID0gc3RybmNtcChoZV9hLT5kaXItPm5hbWUsIGhlX2ItPmRpci0+bmFtZSwgbWluX2xlbik7CisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChoZV9hLT5kaXItPm5hbWVfbGVuID4gaGVfYi0+ZGlyLT5uYW1lX2xlbikKKwkJCXJldCA9IDE7CisJCWVsc2UgaWYgKGhlX2EtPmRpci0+bmFtZV9sZW4gPCBoZV9iLT5kaXItPm5hbWVfbGVuKQorCQkJcmV0ID0gLTE7CisJCWVsc2UKKwkJCXJldCA9IGhlX2ItPmRpci0+aW5vZGUgLSBoZV9hLT5kaXItPmlub2RlOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBVc2VkIGZvciBzb3J0aW5nIHRoZSBoYXNoIGVudHJ5ICovCitzdGF0aWMgaW50IGhhc2hfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IGhhc2hfZW50cnkgKmhlX2EgPSAoY29uc3Qgc3RydWN0IGhhc2hfZW50cnkgKikgYTsKKwljb25zdCBzdHJ1Y3QgaGFzaF9lbnRyeSAqaGVfYiA9IChjb25zdCBzdHJ1Y3QgaGFzaF9lbnRyeSAqKSBiOworCWludCAgICAgcmV0OworCisJaWYgKGhlX2EtPmhhc2ggPiBoZV9iLT5oYXNoKQorCQlyZXQgPSAxOworCWVsc2UgaWYgKGhlX2EtPmhhc2ggPCBoZV9iLT5oYXNoKQorCQlyZXQgPSAtMTsKKwllbHNlIHsKKwkJaWYgKGhlX2EtPm1pbm9yX2hhc2ggPiBoZV9iLT5taW5vcl9oYXNoKQorCQkJcmV0ID0gMTsKKwkJZWxzZSBpZiAoaGVfYS0+bWlub3JfaGFzaCA8IGhlX2ItPm1pbm9yX2hhc2gpCisJCQlyZXQgPSAtMTsKKwkJZWxzZQorCQkJcmV0ID0gbmFtZV9jbXAoYSwgYik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgYWxsb2Nfc2l6ZV9kaXIoZXh0Ml9maWxzeXMgZnMsIHN0cnVjdCBvdXRfZGlyICpvdXRkaXIsCisJCQkJaW50IGJsb2NrcykKK3sKKwl2b2lkICAgICAgICAgICAgICAgICAgICAqbmV3X21lbTsKKworCWlmIChvdXRkaXItPm1heCkgeworCQluZXdfbWVtID0geHJlYWxsb2Mob3V0ZGlyLT5idWYsIGJsb2NrcyAqIGZzLT5ibG9ja3NpemUpOworCQlvdXRkaXItPmJ1ZiA9IG5ld19tZW07CisJCW5ld19tZW0gPSB4cmVhbGxvYyhvdXRkaXItPmhhc2hlcywKKwkJCQkgIGJsb2NrcyAqIHNpemVvZihleHQyX2Rpcmhhc2hfdCkpOworCQlvdXRkaXItPmhhc2hlcyA9IG5ld19tZW07CisJfSBlbHNlIHsKKwkJb3V0ZGlyLT5idWYgPSB4bWFsbG9jKGJsb2NrcyAqIGZzLT5ibG9ja3NpemUpOworCQlvdXRkaXItPmhhc2hlcyA9IHhtYWxsb2MoYmxvY2tzICogc2l6ZW9mKGV4dDJfZGlyaGFzaF90KSk7CisJCW91dGRpci0+bnVtID0gMDsKKwl9CisJb3V0ZGlyLT5tYXggPSBibG9ja3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfb3V0X2RpcihzdHJ1Y3Qgb3V0X2RpciAqb3V0ZGlyKQoreworCWZyZWUob3V0ZGlyLT5idWYpOworCWZyZWUob3V0ZGlyLT5oYXNoZXMpOworCW91dGRpci0+bWF4ID0gMDsKKwlvdXRkaXItPm51bSA9MDsKK30KKworc3RhdGljIGVycmNvZGVfdCBnZXRfbmV4dF9ibG9jayhleHQyX2ZpbHN5cyBmcywgc3RydWN0IG91dF9kaXIgKm91dGRpciwKKwkJCSBjaGFyICoqIHJldCkKK3sKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCisJaWYgKG91dGRpci0+bnVtID49IG91dGRpci0+bWF4KSB7CisJCXJldHZhbCA9IGFsbG9jX3NpemVfZGlyKGZzLCBvdXRkaXIsIG91dGRpci0+bWF4ICsgNTApOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJKnJldCA9IG91dGRpci0+YnVmICsgKG91dGRpci0+bnVtKysgKiBmcy0+YmxvY2tzaXplKTsKKwltZW1zZXQoKnJldCwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWFrZSBhIHVuaXF1ZSBmaWxlbmFtZS4gIFdlIGRvIHRoaXMgYnkKKyAqIGFwcGVuZGluZyB+MCwgYW5kIHRoZW4gaW5jcmVtZW50aW5nIHRoZSBudW1iZXIuICBIb3dldmVyLCB3ZSBjYW5ub3QKKyAqIGV4cGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlbmFtZSBiZXlvbmQgdGhlIHBhZGRpbmcgYXZhaWxhYmxlIGluCisgKiB0aGUgZGlyZWN0b3J5IGVudHJ5LgorICovCitzdGF0aWMgdm9pZCBtdXRhdGVfbmFtZShjaGFyICpzdHIsIF9fdTE2ICpsZW4pCit7CisJaW50ICAgICBpOworCV9fdTE2ICAgbCA9ICpsZW4gJiAweEZGLCBoID0gKmxlbiAmIDB4ZmYwMDsKKworCS8qCisJICogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGl0IGxvb2tzIHRoZSBuYW1lIGhhcyBiZWVuIG11dGF0ZWQKKwkgKiBhbHJlYWR5CisJICovCisJZm9yIChpID0gbC0xOyBpID4gMDsgaS0tKSB7CisJCWlmICghaXNkaWdpdChzdHJbaV0pKQorCQkJYnJlYWs7CisJfQorCWlmICgoaSA9PSBsLTEpIHx8IChzdHJbaV0gIT0gJ34nKSkgeworCQlpZiAoKChsLTEpICYgMykgPCAyKQorCQkJbCArPSAyOworCQllbHNlCisJCQlsID0gKGwrMykgJiB+MzsKKwkJc3RyW2wtMl0gPSAnfic7CisJCXN0cltsLTFdID0gJzAnOworCQkqbGVuID0gbCB8IGg7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gbC0xOyBpID49IDA7IGktLSkgeworCQlpZiAoaXNkaWdpdChzdHJbaV0pKSB7CisJCQlpZiAoc3RyW2ldID09ICc5JykKKwkJCQlzdHJbaV0gPSAnMCc7CisJCQllbHNlIHsKKwkJCQlzdHJbaV0rKzsKKwkJCQlyZXR1cm47CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaSA9PSAxKSB7CisJCQlpZiAoc3RyWzBdID09ICd6JykKKwkJCQlzdHJbMF0gPSAnQSc7CisJCQllbHNlIGlmIChzdHJbMF0gPT0gJ1onKSB7CisJCQkJc3RyWzBdID0gJ34nOworCQkJCXN0clsxXSA9ICcwJzsKKwkJCX0gZWxzZQorCQkJCXN0clswXSsrOworCQl9IGVsc2UgaWYgKGkgPiAwKSB7CisJCQlzdHJbaV0gPSAnMSc7CisJCQlzdHJbaS0xXSA9ICd+JzsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJbMF0gPT0gJ34nKQorCQkJCXN0clswXSA9ICdhJzsKKwkJCWVsc2UKKwkJCQlzdHJbMF0rKzsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHVwbGljYXRlX3NlYXJjaF9hbmRfZml4KGUyZnNja190IGN0eCwgZXh0Ml9maWxzeXMgZnMsCisJCQkJICAgIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgICBzdHJ1Y3QgZmlsbF9kaXJfc3RydWN0ICpmZCkKK3sKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCXN0cnVjdCBoYXNoX2VudHJ5ICAgICAgICplbnQsICpwcmV2OworCWludCAgICAgICAgICAgICAgICAgICAgIGksIGo7CisJaW50ICAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSAwOworCWNoYXIgICAgICAgICAgICAgICAgICAgIG5ld19uYW1lWzI1Nl07CisJX191MTYgICAgICAgICAgICAgICAgICAgbmV3X2xlbjsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJcGN0eC5pbm8gPSBpbm87CisKKwlmb3IgKGk9MTsgaSA8IGZkLT5udW1fYXJyYXk7IGkrKykgeworCQllbnQgPSBmZC0+aGFycmF5ICsgaTsKKwkJcHJldiA9IGVudCAtIDE7CisJCWlmICghZW50LT5kaXItPmlub2RlIHx8CisJCSAgICAoKGVudC0+ZGlyLT5uYW1lX2xlbiAmIDB4RkYpICE9CisJCSAgICAgKHByZXYtPmRpci0+bmFtZV9sZW4gJiAweEZGKSkgfHwKKwkJICAgIChzdHJuY21wKGVudC0+ZGlyLT5uYW1lLCBwcmV2LT5kaXItPm5hbWUsCisJCQkgICAgIGVudC0+ZGlyLT5uYW1lX2xlbiAmIDB4RkYpKSkKKwkJCWNvbnRpbnVlOworCQlwY3R4LmRpcmVudCA9IGVudC0+ZGlyOworCQlpZiAoKGVudC0+ZGlyLT5pbm9kZSA9PSBwcmV2LT5kaXItPmlub2RlKSAmJgorCQkgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8yX0RVUExJQ0FURV9ESVJFTlQsICZwY3R4KSkgeworCQkJZTJmc2NrX2FkanVzdF9pbm9kZV9jb3VudChjdHgsIGVudC0+ZGlyLT5pbm9kZSwgLTEpOworCQkJZW50LT5kaXItPmlub2RlID0gMDsKKwkJCWZpeGVkKys7CisJCQljb250aW51ZTsKKwkJfQorCQltZW1jcHkobmV3X25hbWUsIGVudC0+ZGlyLT5uYW1lLCBlbnQtPmRpci0+bmFtZV9sZW4gJiAweEZGKTsKKwkJbmV3X2xlbiA9IGVudC0+ZGlyLT5uYW1lX2xlbjsKKwkJbXV0YXRlX25hbWUobmV3X25hbWUsICZuZXdfbGVuKTsKKwkJZm9yIChqPTA7IGogPCBmZC0+bnVtX2FycmF5OyBqKyspIHsKKwkJCWlmICgoaT09aikgfHwKKwkJCSAgICAoKGVudC0+ZGlyLT5uYW1lX2xlbiAmIDB4RkYpICE9CisJCQkgICAgIChmZC0+aGFycmF5W2pdLmRpci0+bmFtZV9sZW4gJiAweEZGKSkgfHwKKwkJCSAgICAoc3RybmNtcChuZXdfbmFtZSwgZmQtPmhhcnJheVtqXS5kaXItPm5hbWUsCisJCQkJICAgICBuZXdfbGVuICYgMHhGRikpKQorCQkJCWNvbnRpbnVlOworCQkJbXV0YXRlX25hbWUobmV3X25hbWUsICZuZXdfbGVuKTsKKworCQkJaiA9IC0xOworCQl9CisJCW5ld19uYW1lW25ld19sZW4gJiAweEZGXSA9IDA7CisJCXBjdHguc3RyID0gbmV3X25hbWU7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfTk9OX1VOSVFVRV9GSUxFLCAmcGN0eCkpIHsKKwkJCW1lbWNweShlbnQtPmRpci0+bmFtZSwgbmV3X25hbWUsIG5ld19sZW4gJiAweEZGKTsKKwkJCWVudC0+ZGlyLT5uYW1lX2xlbiA9IG5ld19sZW47CisJCQlleHQyZnNfZGlyaGFzaChmcy0+c3VwZXItPnNfZGVmX2hhc2hfdmVyc2lvbiwKKwkJCQkgICAgICAgZW50LT5kaXItPm5hbWUsCisJCQkJICAgICAgIGVudC0+ZGlyLT5uYW1lX2xlbiAmIDB4RkYsCisJCQkJICAgICAgIGZzLT5zdXBlci0+c19oYXNoX3NlZWQsCisJCQkJICAgICAgICZlbnQtPmhhc2gsICZlbnQtPm1pbm9yX2hhc2gpOworCQkJZml4ZWQrKzsKKwkJfQorCX0KKwlyZXR1cm4gZml4ZWQ7Cit9CisKKworc3RhdGljIGVycmNvZGVfdCBjb3B5X2Rpcl9lbnRyaWVzKGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgc3RydWN0IGZpbGxfZGlyX3N0cnVjdCAqZmQsCisJCQkJICBzdHJ1Y3Qgb3V0X2RpciAqb3V0ZGlyKQoreworCWVycmNvZGVfdCAgICAgICAgICAgICAgIHJldHZhbDsKKwljaGFyICAgICAgICAgICAgICAgICAgICAqYmxvY2tfc3RhcnQ7CisJc3RydWN0IGhhc2hfZW50cnkgICAgICAgKmVudDsKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgICAqZGlyZW50OworCWludCAgICAgICAgICAgICAgICAgICAgIGksIHJlY19sZW4sIGxlZnQ7CisJZXh0Ml9kaXJoYXNoX3QgICAgICAgICAgcHJldl9oYXNoOworCWludCAgICAgICAgICAgICAgICAgICAgIG9mZnNldDsKKworCW91dGRpci0+bWF4ID0gMDsKKwlyZXR2YWwgPSBhbGxvY19zaXplX2Rpcihmcywgb3V0ZGlyLAorCQkJCShmZC0+ZGlyX3NpemUgLyBmcy0+YmxvY2tzaXplKSArIDIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJb3V0ZGlyLT5udW0gPSBmZC0+Y29tcHJlc3MgPyAwIDogMTsKKwlvZmZzZXQgPSAwOworCW91dGRpci0+aGFzaGVzWzBdID0gMDsKKwlwcmV2X2hhc2ggPSAxOworCWlmICgocmV0dmFsID0gZ2V0X25leHRfYmxvY2soZnMsIG91dGRpciwgJmJsb2NrX3N0YXJ0KSkpCisJCXJldHVybiByZXR2YWw7CisJZGlyZW50ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSBibG9ja19zdGFydDsKKwlsZWZ0ID0gZnMtPmJsb2Nrc2l6ZTsKKwlmb3IgKGk9MDsgaSA8IGZkLT5udW1fYXJyYXk7IGkrKykgeworCQllbnQgPSBmZC0+aGFycmF5ICsgaTsKKwkJaWYgKGVudC0+ZGlyLT5pbm9kZSA9PSAwKQorCQkJY29udGludWU7CisJCXJlY19sZW4gPSBFWFQyX0RJUl9SRUNfTEVOKGVudC0+ZGlyLT5uYW1lX2xlbiAmIDB4RkYpOworCQlpZiAocmVjX2xlbiA+IGxlZnQpIHsKKwkJCWlmIChsZWZ0KQorCQkJCWRpcmVudC0+cmVjX2xlbiArPSBsZWZ0OworCQkJaWYgKChyZXR2YWwgPSBnZXRfbmV4dF9ibG9jayhmcywgb3V0ZGlyLAorCQkJCQkJICAgICAgJmJsb2NrX3N0YXJ0KSkpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCW9mZnNldCA9IDA7CisJCX0KKwkJbGVmdCA9IGZzLT5ibG9ja3NpemUgLSBvZmZzZXQ7CisJCWRpcmVudCA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgKGJsb2NrX3N0YXJ0ICsgb2Zmc2V0KTsKKwkJaWYgKG9mZnNldCA9PSAwKSB7CisJCQlpZiAoZW50LT5oYXNoID09IHByZXZfaGFzaCkKKwkJCQlvdXRkaXItPmhhc2hlc1tvdXRkaXItPm51bS0xXSA9IGVudC0+aGFzaCB8IDE7CisJCQllbHNlCisJCQkJb3V0ZGlyLT5oYXNoZXNbb3V0ZGlyLT5udW0tMV0gPSBlbnQtPmhhc2g7CisJCX0KKwkJZGlyZW50LT5pbm9kZSA9IGVudC0+ZGlyLT5pbm9kZTsKKwkJZGlyZW50LT5uYW1lX2xlbiA9IGVudC0+ZGlyLT5uYW1lX2xlbjsKKwkJZGlyZW50LT5yZWNfbGVuID0gcmVjX2xlbjsKKwkJbWVtY3B5KGRpcmVudC0+bmFtZSwgZW50LT5kaXItPm5hbWUsIGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKTsKKwkJb2Zmc2V0ICs9IHJlY19sZW47CisJCWxlZnQgLT0gcmVjX2xlbjsKKwkJaWYgKGxlZnQgPCAxMikgeworCQkJZGlyZW50LT5yZWNfbGVuICs9IGxlZnQ7CisJCQlvZmZzZXQgKz0gbGVmdDsKKwkJCWxlZnQgPSAwOworCQl9CisJCXByZXZfaGFzaCA9IGVudC0+aGFzaDsKKwl9CisJaWYgKGxlZnQpCisJCWRpcmVudC0+cmVjX2xlbiArPSBsZWZ0OworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyAqc2V0X3Jvb3Rfbm9kZShleHQyX2ZpbHN5cyBmcywgY2hhciAqYnVmLAorCQkJCSAgICBleHQyX2lub190IGlubywgZXh0Ml9pbm9fdCBwYXJlbnQpCit7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICAgICAgICAgICAqZGlyOworCXN0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyAgICAgICAgKnJvb3Q7CisJc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAgICAgICAqbGltaXRzOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXR5cGUgPSAwOworCisJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKQorCQlmaWxldHlwZSA9IEVYVDJfRlRfRElSIDw8IDg7CisKKwltZW1zZXQoYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKwlkaXIgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIGJ1ZjsKKwlkaXItPmlub2RlID0gaW5vOworCWRpci0+bmFtZVswXSA9ICcuJzsKKwlkaXItPm5hbWVfbGVuID0gMSB8IGZpbGV0eXBlOworCWRpci0+cmVjX2xlbiA9IDEyOworCWRpciA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgKGJ1ZiArIDEyKTsKKwlkaXItPmlub2RlID0gcGFyZW50OworCWRpci0+bmFtZVswXSA9ICcuJzsKKwlkaXItPm5hbWVbMV0gPSAnLic7CisJZGlyLT5uYW1lX2xlbiA9IDIgfCBmaWxldHlwZTsKKwlkaXItPnJlY19sZW4gPSBmcy0+YmxvY2tzaXplIC0gMTI7CisKKwlyb290ID0gKHN0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyAqKSAoYnVmKzI0KTsKKwlyb290LT5yZXNlcnZlZF96ZXJvID0gMDsKKwlyb290LT5oYXNoX3ZlcnNpb24gPSBmcy0+c3VwZXItPnNfZGVmX2hhc2hfdmVyc2lvbjsKKwlyb290LT5pbmZvX2xlbmd0aCA9IDg7CisJcm9vdC0+aW5kaXJlY3RfbGV2ZWxzID0gMDsKKwlyb290LT51bnVzZWRfZmxhZ3MgPSAwOworCisJbGltaXRzID0gKHN0cnVjdCBleHQyX2R4X2NvdW50bGltaXQgKikgKGJ1ZiszMik7CisJbGltaXRzLT5saW1pdCA9IChmcy0+YmxvY2tzaXplIC0gMzIpIC8gc2l6ZW9mKHN0cnVjdCBleHQyX2R4X2VudHJ5KTsKKwlsaW1pdHMtPmNvdW50ID0gMDsKKworCXJldHVybiByb290OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZXh0Ml9keF9lbnRyeSAqc2V0X2ludF9ub2RlKGV4dDJfZmlsc3lzIGZzLCBjaGFyICpidWYpCit7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICAgICAgICAgICAqZGlyOworCXN0cnVjdCBleHQyX2R4X2NvdW50bGltaXQgICAgICAgKmxpbWl0czsKKworCW1lbXNldChidWYsIDAsIGZzLT5ibG9ja3NpemUpOworCWRpciA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgYnVmOworCWRpci0+aW5vZGUgPSAwOworCWRpci0+cmVjX2xlbiA9IGZzLT5ibG9ja3NpemU7CisKKwlsaW1pdHMgPSAoc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAqKSAoYnVmKzgpOworCWxpbWl0cy0+bGltaXQgPSAoZnMtPmJsb2Nrc2l6ZSAtIDgpIC8gc2l6ZW9mKHN0cnVjdCBleHQyX2R4X2VudHJ5KTsKKwlsaW1pdHMtPmNvdW50ID0gMDsKKworCXJldHVybiAoc3RydWN0IGV4dDJfZHhfZW50cnkgKikgbGltaXRzOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbGVhZiBub2RlcyB3aGljaCBoYXZlIGJlZW4gd3JpdHRlbiBpbgorICogb3V0ZGlyLCBhbmQgcG9wdWxhdGVzIHRoZSByb290IG5vZGUgYW5kIGFueSBuZWNlc3NhcnkgaW50ZXJpb3Igbm9kZXMuCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgY2FsY3VsYXRlX3RyZWUoZXh0Ml9maWxzeXMgZnMsCisJCQkJc3RydWN0IG91dF9kaXIgKm91dGRpciwKKwkJCQlleHQyX2lub190IGlubywKKwkJCQlleHQyX2lub190IHBhcmVudCkKK3sKKwlzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8gICAgICAgICpyb290X2luZm87CisJc3RydWN0IGV4dDJfZHhfZW50cnkgICAgICAgICAgICAqcm9vdCwgKmR4X2VudCA9IE5VTEw7CisJc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAgICAgICAqcm9vdF9saW1pdCwgKmxpbWl0OworCWVycmNvZGVfdCAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBibG9ja19zdGFydDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGMxLCBjMiwgbmJsa3M7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdF9vZmZzZXQsIHJvb3Rfb2Zmc2V0OworCisJcm9vdF9pbmZvID0gc2V0X3Jvb3Rfbm9kZShmcywgb3V0ZGlyLT5idWYsIGlubywgcGFyZW50KTsKKwlyb290X29mZnNldCA9IGxpbWl0X29mZnNldCA9ICgoY2hhciAqKSByb290X2luZm8gLSBvdXRkaXItPmJ1ZikgKworCQlyb290X2luZm8tPmluZm9fbGVuZ3RoOworCXJvb3RfbGltaXQgPSAoc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAqKSAob3V0ZGlyLT5idWYgKyBsaW1pdF9vZmZzZXQpOworCWMxID0gcm9vdF9saW1pdC0+bGltaXQ7CisJbmJsa3MgPSBvdXRkaXItPm51bTsKKworCS8qIFdyaXRlIG91dCB0aGUgcG9pbnRlciBibG9ja3MgKi8KKwlpZiAobmJsa3MtMSA8PSBjMSkgeworCQkvKiBKdXN0IHdyaXRlIG91dCB0aGUgcm9vdCBibG9jaywgYW5kIHdlJ3JlIGRvbmUgKi8KKwkJcm9vdCA9IChzdHJ1Y3QgZXh0Ml9keF9lbnRyeSAqKSAob3V0ZGlyLT5idWYgKyByb290X29mZnNldCk7CisJCWZvciAoaT0xOyBpIDwgbmJsa3M7IGkrKykgeworCQkJcm9vdC0+YmxvY2sgPSBleHQyZnNfY3B1X3RvX2xlMzIoaSk7CisJCQlpZiAoaSAhPSAxKQorCQkJCXJvb3QtPmhhc2ggPQorCQkJCQlleHQyZnNfY3B1X3RvX2xlMzIob3V0ZGlyLT5oYXNoZXNbaV0pOworCQkJcm9vdCsrOworCQkJYzEtLTsKKwkJfQorCX0gZWxzZSB7CisJCWMyID0gMDsKKwkJbGltaXQgPSAwOworCQlyb290X2luZm8tPmluZGlyZWN0X2xldmVscyA9IDE7CisJCWZvciAoaT0xOyBpIDwgbmJsa3M7IGkrKykgeworCQkJaWYgKGMxID09IDApCisJCQkJcmV0dXJuIEVOT1NQQzsKKwkJCWlmIChjMiA9PSAwKSB7CisJCQkJaWYgKGxpbWl0KQorCQkJCQlsaW1pdC0+bGltaXQgPSBsaW1pdC0+Y291bnQgPQorCQlleHQyZnNfY3B1X3RvX2xlMTYobGltaXQtPmxpbWl0KTsKKwkJCQlyb290ID0gKHN0cnVjdCBleHQyX2R4X2VudHJ5ICopCisJCQkJCShvdXRkaXItPmJ1ZiArIHJvb3Rfb2Zmc2V0KTsKKwkJCQlyb290LT5ibG9jayA9IGV4dDJmc19jcHVfdG9fbGUzMihvdXRkaXItPm51bSk7CisJCQkJaWYgKGkgIT0gMSkKKwkJCQkJcm9vdC0+aGFzaCA9CisJCQlleHQyZnNfY3B1X3RvX2xlMzIob3V0ZGlyLT5oYXNoZXNbaV0pOworCQkJCWlmICgocmV0dmFsID0gIGdldF9uZXh0X2Jsb2NrKGZzLCBvdXRkaXIsCisJCQkJCQkJICAgICAgJmJsb2NrX3N0YXJ0KSkpCisJCQkJCXJldHVybiByZXR2YWw7CisJCQkJZHhfZW50ID0gc2V0X2ludF9ub2RlKGZzLCBibG9ja19zdGFydCk7CisJCQkJbGltaXQgPSAoc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAqKSBkeF9lbnQ7CisJCQkJYzIgPSBsaW1pdC0+bGltaXQ7CisJCQkJcm9vdF9vZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBleHQyX2R4X2VudHJ5KTsKKwkJCQljMS0tOworCQkJfQorCQkJZHhfZW50LT5ibG9jayA9IGV4dDJmc19jcHVfdG9fbGUzMihpKTsKKwkJCWlmIChjMiAhPSBsaW1pdC0+bGltaXQpCisJCQkJZHhfZW50LT5oYXNoID0KKwkJCQkJZXh0MmZzX2NwdV90b19sZTMyKG91dGRpci0+aGFzaGVzW2ldKTsKKwkJCWR4X2VudCsrOworCQkJYzItLTsKKwkJfQorCQlsaW1pdC0+Y291bnQgPSBleHQyZnNfY3B1X3RvX2xlMTYobGltaXQtPmxpbWl0IC0gYzIpOworCQlsaW1pdC0+bGltaXQgPSBleHQyZnNfY3B1X3RvX2xlMTYobGltaXQtPmxpbWl0KTsKKwl9CisJcm9vdF9saW1pdCA9IChzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0ICopIChvdXRkaXItPmJ1ZiArIGxpbWl0X29mZnNldCk7CisJcm9vdF9saW1pdC0+Y291bnQgPSBleHQyZnNfY3B1X3RvX2xlMTYocm9vdF9saW1pdC0+bGltaXQgLSBjMSk7CisJcm9vdF9saW1pdC0+bGltaXQgPSBleHQyZnNfY3B1X3RvX2xlMTYocm9vdF9saW1pdC0+bGltaXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB3cml0ZV9kaXJfc3RydWN0IHsKKwlzdHJ1Y3Qgb3V0X2RpciAqb3V0ZGlyOworCWVycmNvZGVfdCAgICAgICBlcnI7CisJZTJmc2NrX3QgICAgICAgIGN0eDsKKwlpbnQgICAgICAgICAgICAgY2xlYXJlZDsKK307CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggd3JpdGVzIG91dCBhIGRpcmVjdG9yeSBibG9jay4KKyAqLworc3RhdGljIGludCB3cml0ZV9kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCQkgICBibGtfdCAgICAgICAgKmJsb2NrX25yLAorCQkJICAgZTJfYmxrY250X3QgYmxvY2tjbnQsCisJCQkgICBibGtfdCByZWZfYmxvY2sgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIGludCByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHdyaXRlX2Rpcl9zdHJ1Y3QgKndkID0gKHN0cnVjdCB3cml0ZV9kaXJfc3RydWN0ICopIHByaXZfZGF0YTsKKwlibGtfdCAgIGJsazsKKwljaGFyICAgICpkaXI7CisKKwlpZiAoKmJsb2NrX25yID09IDApCisJCXJldHVybiAwOworCWlmIChibG9ja2NudCA+PSB3ZC0+b3V0ZGlyLT5udW0pIHsKKwkJZTJmc2NrX3JlYWRfYml0bWFwcyh3ZC0+Y3R4KTsKKwkJYmxrID0gKmJsb2NrX25yOworCQlleHQyZnNfdW5tYXJrX2Jsb2NrX2JpdG1hcCh3ZC0+Y3R4LT5ibG9ja19mb3VuZF9tYXAsIGJsayk7CisJCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgYmxrLCAtMSk7CisJCSpibG9ja19uciA9IDA7CisJCXdkLT5jbGVhcmVkKys7CisJCXJldHVybiBCTE9DS19DSEFOR0VEOworCX0KKwlpZiAoYmxvY2tjbnQgPCAwKQorCQlyZXR1cm4gMDsKKworCWRpciA9IHdkLT5vdXRkaXItPmJ1ZiArIChibG9ja2NudCAqIGZzLT5ibG9ja3NpemUpOworCXdkLT5lcnIgPSBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGZzLCAqYmxvY2tfbnIsIGRpcik7CisJaWYgKHdkLT5lcnIpCisJCXJldHVybiBCTE9DS19BQk9SVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCB3cml0ZV9kaXJlY3RvcnkoZTJmc2NrX3QgY3R4LCBleHQyX2ZpbHN5cyBmcywKKwkJCQkgc3RydWN0IG91dF9kaXIgKm91dGRpciwKKwkJCQkgZXh0Ml9pbm9fdCBpbm8sIGludCBjb21wcmVzcykKK3sKKwlzdHJ1Y3Qgd3JpdGVfZGlyX3N0cnVjdCB3ZDsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCisJcmV0dmFsID0gZTJmc2NrX2V4cGFuZF9kaXJlY3RvcnkoY3R4LCBpbm8sIC0xLCBvdXRkaXItPm51bSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXdkLm91dGRpciA9IG91dGRpcjsKKwl3ZC5lcnIgPSAwOworCXdkLmN0eCA9IGN0eDsKKwl3ZC5jbGVhcmVkID0gMDsKKworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLCAwLCAwLAorCQkJCSAgICAgICB3cml0ZV9kaXJfYmxvY2ssICZ3ZCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAod2QuZXJyKQorCQlyZXR1cm4gd2QuZXJyOworCisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgInJlaGFzaF9kaXIiKTsKKwlpZiAoY29tcHJlc3MpCisJCWlub2RlLmlfZmxhZ3MgJj0gfkVYVDJfSU5ERVhfRkw7CisJZWxzZQorCQlpbm9kZS5pX2ZsYWdzIHw9IEVYVDJfSU5ERVhfRkw7CisJaW5vZGUuaV9zaXplID0gb3V0ZGlyLT5udW0gKiBmcy0+YmxvY2tzaXplOworCWlub2RlLmlfYmxvY2tzIC09IChmcy0+YmxvY2tzaXplIC8gNTEyKSAqIHdkLmNsZWFyZWQ7CisJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJyZWhhc2hfZGlyIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBlMmZzY2tfcmVoYXNoX2RpcihlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vKQoreworCWV4dDJfZmlsc3lzICAgICAgICAgICAgIGZzID0gY3R4LT5mczsKKwllcnJjb2RlX3QgICAgICAgICAgICAgICByZXR2YWw7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJY2hhciAgICAgICAgICAgICAgICAgICAgKmRpcl9idWYgPSBOVUxMOworCXN0cnVjdCBmaWxsX2Rpcl9zdHJ1Y3QgIGZkOworCXN0cnVjdCBvdXRfZGlyICAgICAgICAgIG91dGRpcjsKKworCW91dGRpci5tYXggPSBvdXRkaXIubnVtID0gMDsKKwlvdXRkaXIuYnVmID0gMDsKKwlvdXRkaXIuaGFzaGVzID0gMDsKKwllMmZzY2tfcmVhZF9pbm9kZShjdHgsIGlubywgJmlub2RlLCAicmVoYXNoX2RpciIpOworCisJcmV0dmFsID0gRU5PTUVNOworCWZkLmhhcnJheSA9IDA7CisJZGlyX2J1ZiA9IHhtYWxsb2MoaW5vZGUuaV9zaXplKTsKKworCWZkLm1heF9hcnJheSA9IGlub2RlLmlfc2l6ZSAvIDMyOworCWZkLm51bV9hcnJheSA9IDA7CisJZmQuaGFycmF5ID0geG1hbGxvYyhmZC5tYXhfYXJyYXkgKiBzaXplb2Yoc3RydWN0IGhhc2hfZW50cnkpKTsKKworCWZkLmN0eCA9IGN0eDsKKwlmZC5idWYgPSBkaXJfYnVmOworCWZkLmlub2RlID0gJmlub2RlOworCWZkLmVyciA9IDA7CisJZmQuZGlyX3NpemUgPSAwOworCWZkLmNvbXByZXNzID0gMDsKKwlpZiAoIShmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCkgfHwKKwkgICAgKGlub2RlLmlfc2l6ZSAvIGZzLT5ibG9ja3NpemUpIDwgMikKKwkJZmQuY29tcHJlc3MgPSAxOworCWZkLnBhcmVudCA9IDA7CisKKwkvKiBSZWFkIGluIHRoZSBlbnRpcmUgZGlyZWN0b3J5IGludG8gbWVtb3J5ICovCisJcmV0dmFsID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBpbm8sIDAsIDAsCisJCQkJICAgICAgIGZpbGxfZGlyX2Jsb2NrLCAmZmQpOworCWlmIChmZC5lcnIpIHsKKwkJcmV0dmFsID0gZmQuZXJyOworCQlnb3RvIGVycm91dDsKKwl9CisKKwkvKiBTb3J0IHRoZSBsaXN0ICovCityZXNvcnQ6CisJaWYgKGZkLmNvbXByZXNzKQorCQlxc29ydChmZC5oYXJyYXkrMiwgZmQubnVtX2FycmF5LTIsCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgaGFzaF9lbnRyeSksIG5hbWVfY21wKTsKKwllbHNlCisJCXFzb3J0KGZkLmhhcnJheSwgZmQubnVtX2FycmF5LAorCQkgICAgICBzaXplb2Yoc3RydWN0IGhhc2hfZW50cnkpLCBoYXNoX2NtcCk7CisKKwkvKgorCSAqIExvb2sgZm9yIGR1cGxpY2F0ZXMKKwkgKi8KKwlpZiAoZHVwbGljYXRlX3NlYXJjaF9hbmRfZml4KGN0eCwgZnMsIGlubywgJmZkKSkKKwkJZ290byByZXNvcnQ7CisKKwlpZiAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9OTykgeworCQlyZXR2YWwgPSAwOworCQlnb3RvIGVycm91dDsKKwl9CisKKwkvKgorCSAqIENvcHkgdGhlIGRpcmVjdG9yeSBlbnRyaWVzLiAgSW4gYSBodHJlZSBkaXJlY3RvcnkgdGhlc2UKKwkgKiB3aWxsIGJlY29tZSB0aGUgbGVhZiBub2Rlcy4KKwkgKi8KKwlyZXR2YWwgPSBjb3B5X2Rpcl9lbnRyaWVzKGZzLCAmZmQsICZvdXRkaXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCisJZnJlZShkaXJfYnVmKTsgZGlyX2J1ZiA9IDA7CisKKwlpZiAoIWZkLmNvbXByZXNzKSB7CisJCS8qIENhbGN1bGF0ZSB0aGUgaW50ZXJpb3Igbm9kZXMgKi8KKwkJcmV0dmFsID0gY2FsY3VsYXRlX3RyZWUoZnMsICZvdXRkaXIsIGlubywgZmQucGFyZW50KTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3V0OworCX0KKworCXJldHZhbCA9IHdyaXRlX2RpcmVjdG9yeShjdHgsIGZzLCAmb3V0ZGlyLCBpbm8sIGZkLmNvbXByZXNzKTsKKworZXJyb3V0OgorCWZyZWUoZGlyX2J1Zik7CisJZnJlZShmZC5oYXJyYXkpOworCisJZnJlZV9vdXRfZGlyKCZvdXRkaXIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgZTJmc2NrX3JlaGFzaF9kaXJlY3RvcmllcyhlMmZzY2tfdCBjdHgpCit7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlzdHJ1Y3QgZGlyX2luZm8gICAgICAgICAqZGlyOworCWV4dDJfdTMyX2l0ZXJhdGUgICAgICAgIGl0ZXI7CisJZXh0Ml9pbm9fdCAgICAgICAgICAgICAgaW5vOworCWVycmNvZGVfdCAgICAgICAgICAgICAgIHJldHZhbDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpLCBjdXIsIG1heCwgYWxsX2RpcnMsIGRpcl9pbmRleCwgZmlyc3QgPSAxOworCisJYWxsX2RpcnMgPSBjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX0NPTVBSRVNTX0RJUlM7CisKKwlpZiAoIWN0eC0+ZGlyc190b19oYXNoICYmICFhbGxfZGlycykKKwkJcmV0dXJuOworCisJZTJmc2NrX2dldF9sb3N0X2FuZF9mb3VuZChjdHgsIDApOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWRpcl9pbmRleCA9IGN0eC0+ZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVg7CisJY3VyID0gMDsKKwlpZiAoYWxsX2RpcnMpIHsKKwkJaSA9IDA7CisJCW1heCA9IGUyZnNja19nZXRfbnVtX2RpcmluZm8oY3R4KTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSBleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZV9iZWdpbihjdHgtPmRpcnNfdG9faGFzaCwKKwkJCQkJCSAgICAgICAmaXRlcik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM0FfT1BUSU1JWkVfSVRFUiwgJnBjdHgpOworCQkJcmV0dXJuOworCQl9CisJCW1heCA9IGV4dDJmc191MzJfbGlzdF9jb3VudChjdHgtPmRpcnNfdG9faGFzaCk7CisJfQorCXdoaWxlICgxKSB7CisJCWlmIChhbGxfZGlycykgeworCQkJaWYgKChkaXIgPSBlMmZzY2tfZGlyX2luZm9faXRlcihjdHgsICZpKSkgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlubyA9IGRpci0+aW5vOworCQl9IGVsc2UgeworCQkJaWYgKCFleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZShpdGVyLCAmaW5vKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaW5vID09IGN0eC0+bG9zdF9hbmRfZm91bmQpCisJCQljb250aW51ZTsKKwkJcGN0eC5kaXIgPSBpbm87CisJCWlmIChmaXJzdCkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8zQV9QQVNTX0hFQURFUiwgJnBjdHgpOworCQkJZmlyc3QgPSAwOworCQl9CisJCXBjdHguZXJyY29kZSA9IGUyZnNja19yZWhhc2hfZGlyKGN0eCwgaW5vKTsKKwkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJZW5kX3Byb2JsZW1fbGF0Y2goY3R4LCBQUl9MQVRDSF9PUFRJTUlaRV9ESVIpOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8zQV9PUFRJTUlaRV9ESVJfRVJSLCAmcGN0eCk7CisJCX0KKwkJaWYgKGN0eC0+cHJvZ3Jlc3MgJiYgIWN0eC0+cHJvZ3Jlc3NfZmQpCisJCQllMmZzY2tfc2ltcGxlX3Byb2dyZXNzKGN0eCwgIlJlYnVpbGRpbmcgZGlyZWN0b3J5IiwKKwkJCSAgICAgICAxMDAuMCAqIChmbG9hdCkgKCsrY3VyKSAvIChmbG9hdCkgbWF4LCBpbm8pOworCX0KKwllbmRfcHJvYmxlbV9sYXRjaChjdHgsIFBSX0xBVENIX09QVElNSVpFX0RJUik7CisJaWYgKCFhbGxfZGlycykKKwkJZXh0MmZzX3UzMl9saXN0X2l0ZXJhdGVfZW5kKGl0ZXIpOworCisJZXh0MmZzX3UzMl9saXN0X2ZyZWUoY3R4LT5kaXJzX3RvX2hhc2gpOworCWN0eC0+ZGlyc190b19oYXNoID0gMDsKK30KKworLyoKKyAqIGxpbnV4L2ZzL3Jldm9rZS5jCisgKgorICogSm91cm5hbCByZXZva2Ugcm91dGluZXMgZm9yIHRoZSBnZW5lcmljIGZpbGVzeXN0ZW0gam91cm5hbGluZyBjb2RlOworICogcGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLgorICoKKyAqIFJldm9rZSBpcyB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gcHJldmVudCBvbGQgbG9nIHJlY29yZHMgZm9yIGRlbGV0ZWQKKyAqIG1ldGFkYXRhIGZyb20gYmVpbmcgcmVwbGF5ZWQgb24gdG9wIG9mIG5ld2VyIGRhdGEgdXNpbmcgdGhlIHNhbWUKKyAqIGJsb2Nrcy4gIFRoZSByZXZva2UgbWVjaGFuaXNtIGlzIHVzZWQgaW4gdHdvIHNlcGFyYXRlIHBsYWNlczoKKyAqCisgKiArIENvbW1pdDogZHVyaW5nIGNvbW1pdCB3ZSB3cml0ZSB0aGUgZW50aXJlIGxpc3Qgb2YgdGhlIGN1cnJlbnQKKyAqICAgdHJhbnNhY3Rpb24ncyByZXZva2VkIGJsb2NrcyB0byB0aGUgam91cm5hbAorICoKKyAqICsgUmVjb3Zlcnk6IGR1cmluZyByZWNvdmVyeSB3ZSByZWNvcmQgdGhlIHRyYW5zYWN0aW9uIElEIG9mIGFsbAorICogICByZXZva2VkIGJsb2Nrcy4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSByZXZva2UgcmVjb3JkcyBpbiB0aGUgbG9nCisgKiAgIGZvciBhIHNpbmdsZSBibG9jaywgb25seSB0aGUgbGFzdCBvbmUgY291bnRzLCBhbmQgaWYgdGhlcmUgaXMgYSBsb2cKKyAqICAgZW50cnkgZm9yIGEgYmxvY2sgYmV5b25kIHRoZSBsYXN0IHJldm9rZSwgdGhlbiB0aGF0IGxvZyBlbnRyeSBzdGlsbAorICogICBnZXRzIHJlcGxheWVkLgorICoKKyAqIFdlIGNhbiBnZXQgaW50ZXJhY3Rpb25zIGJldHdlZW4gcmV2b2tlcyBhbmQgbmV3IGxvZyBkYXRhIHdpdGhpbiBhCisgKiBzaW5nbGUgdHJhbnNhY3Rpb246CisgKgorICogQmxvY2sgaXMgcmV2b2tlZCBhbmQgdGhlbiBqb3VybmFsZWQ6CisgKiAgIFRoZSBkZXNpcmVkIGVuZCByZXN1bHQgaXMgdGhlIGpvdXJuYWxpbmcgb2YgdGhlIG5ldyBibG9jaywgc28gd2UKKyAqICAgY2FuY2VsIHRoZSByZXZva2UgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLgorICoKKyAqIEJsb2NrIGlzIGpvdXJuYWxlZCBhbmQgdGhlbiByZXZva2VkOgorICogICBUaGUgcmV2b2tlIG11c3QgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHdyaXRlIG9mIHRoZSBibG9jaywgc28gd2UKKyAqICAgbmVlZCBlaXRoZXIgdG8gY2FuY2VsIHRoZSBqb3VybmFsIGVudHJ5IG9yIHRvIHdyaXRlIHRoZSByZXZva2UKKyAqICAgbGF0ZXIgaW4gdGhlIGxvZyB0aGFuIHRoZSBsb2cgYmxvY2suICBJbiB0aGlzIGNhc2UsIHdlIGNob29zZSB0aGUKKyAqICAgbGF0dGVyOiBqb3VybmFsaW5nIGEgYmxvY2sgY2FuY2VscyBhbnkgcmV2b2tlIHJlY29yZCBmb3IgdGhhdCBibG9jaworICogICBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgc28gYW55IHJldm9rZSBmb3IgdGhhdCBibG9jayBpbiB0aGUKKyAqICAgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGhhcHBlbmVkIGFmdGVyIHRoZSBibG9jayB3YXMgam91cm5hbGVkIGFuZCBzbworICogICB0aGUgcmV2b2tlIG11c3QgdGFrZSBwcmVjZWRlbmNlLgorICoKKyAqIEJsb2NrIGlzIHJldm9rZWQgYW5kIHRoZW4gd3JpdHRlbiBhcyBkYXRhOgorICogICBUaGUgZGF0YSB3cml0ZSBpcyBhbGxvd2VkIHRvIHN1Y2NlZWQsIGJ1dCB0aGUgcmV2b2tlIGlzIF9ub3RfCisgKiAgIGNhbmNlbGxlZC4gIFdlIHN0aWxsIG5lZWQgdG8gcHJldmVudCBvbGQgbG9nIHJlY29yZHMgZnJvbQorICogICBvdmVyd3JpdGluZyB0aGUgbmV3IGRhdGEuICBXZSBkb24ndCBldmVuIG5lZWQgdG8gY2xlYXIgdGhlIHJldm9rZQorICogICBiaXQgaGVyZS4KKyAqCisgKiBSZXZva2UgaW5mb3JtYXRpb24gb24gYnVmZmVycyBpcyBhIHRyaS1zdGF0ZSB2YWx1ZToKKyAqCisgKiBSZXZva2VWYWxpZCBjbGVhcjogICBubyBjYWNoZWQgcmV2b2tlIHN0YXR1cywgbmVlZCB0byBsb29rIGl0IHVwCisgKiBSZXZva2VWYWxpZCBzZXQsIFJldm9rZWQgY2xlYXI6CisgKiAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaGFzIG5vdCBiZWVuIHJldm9rZWQsIGFuZCBjYW5jZWxfcmV2b2tlCisgKiAgICAgICAgICAgICAgICAgICAgICBuZWVkIGRvIG5vdGhpbmcuCisgKiBSZXZva2VWYWxpZCBzZXQsIFJldm9rZWQgc2V0OgorICogICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGhhcyBiZWVuIHJldm9rZWQuCisgKi8KKworc3RhdGljIGttZW1fY2FjaGVfdCAqcmV2b2tlX3JlY29yZF9jYWNoZTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnJldm9rZV90YWJsZV9jYWNoZTsKKworLyogRWFjaCByZXZva2UgcmVjb3JkIHJlcHJlc2VudHMgb25lIHNpbmdsZSByZXZva2VkIGJsb2NrLiAgRHVyaW5nCisgICBqb3VybmFsIHJlcGxheSwgdGhpcyBpbnZvbHZlcyByZWNvcmRpbmcgdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZQorICAgbGFzdCB0cmFuc2FjdGlvbiB0byByZXZva2UgdGhpcyBibG9jay4gKi8KKworc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICBoYXNoOworCXRpZF90ICAgICAgICAgICAgIHNlcXVlbmNlOyAgICAgLyogVXNlZCBmb3IgcmVjb3Zlcnkgb25seSAqLworCXVuc2lnbmVkIGxvbmcgICAgIGJsb2NrbnI7Cit9OworCisKKy8qIFRoZSByZXZva2UgdGFibGUgaXMganVzdCBhIHNpbXBsZSBoYXNoIHRhYmxlIG9mIHJldm9rZSByZWNvcmRzLiAqLworc3RydWN0IGpiZF9yZXZva2VfdGFibGVfcworeworCS8qIEl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgd2UgbWlnaHQgd2FudCBhIGxhcmdlciBoYXNoIHRhYmxlCisJICogZm9yIHJlY292ZXJ5LiAgTXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gKi8KKwlpbnQgICAgICAgICAgICAgICBoYXNoX3NpemU7CisJaW50ICAgICAgICAgICAgICAgaGFzaF9zaGlmdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX3RhYmxlOworfTsKKworCisvKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBtYWludGFpbiB0aGUgcmV2b2tlIHRhYmxlICovCisKKy8qIEJvcnJvd2VkIGZyb20gYnVmZmVyLmM6IHRoaXMgaXMgYSB0cmllZCBhbmQgdGVzdGVkIGJsb2NrIGhhc2ggZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgaGFzaChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgYmxvY2spCit7CisJc3RydWN0IGpiZF9yZXZva2VfdGFibGVfcyAqdGFibGUgPSBqb3VybmFsLT5qX3Jldm9rZTsKKwlpbnQgaGFzaF9zaGlmdCA9IHRhYmxlLT5oYXNoX3NoaWZ0OworCisJcmV0dXJuICgoYmxvY2sgPDwgKGhhc2hfc2hpZnQgLSA2KSkgXgorCQkoYmxvY2sgPj4gMTMpIF4KKwkJKGJsb2NrIDw8IChoYXNoX3NoaWZ0IC0gMTIpKSkgJiAodGFibGUtPmhhc2hfc2l6ZSAtIDEpOworfQorCitzdGF0aWMgaW50IGluc2VydF9yZXZva2VfaGFzaChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwKKwkJCSAgICAgIHRpZF90IHNlcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworCXJlY29yZCA9IGttZW1fY2FjaGVfYWxsb2MocmV2b2tlX3JlY29yZF9jYWNoZSwgR0ZQX05PRlMpOworCWlmICghcmVjb3JkKQorCQlnb3RvIG9vbTsKKworCXJlY29yZC0+c2VxdWVuY2UgPSBzZXE7CisJcmVjb3JkLT5ibG9ja25yID0gYmxvY2tucjsKKwloYXNoX2xpc3QgPSAmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbaGFzaChqb3VybmFsLCBibG9ja25yKV07CisJbGlzdF9hZGQoJnJlY29yZC0+aGFzaCwgaGFzaF9saXN0KTsKKwlyZXR1cm4gMDsKKworb29tOgorCXJldHVybiAtRU5PTUVNOworfQorCisvKiBGaW5kIGEgcmV2b2tlIHJlY29yZCBpbiB0aGUgam91cm5hbCdzIGhhc2ggdGFibGUuICovCisKK3N0YXRpYyBzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqZmluZF9yZXZva2VfcmVjb3JkKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tucikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworCWhhc2hfbGlzdCA9ICZqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZVtoYXNoKGpvdXJuYWwsIGJsb2NrbnIpXTsKKworCXJlY29yZCA9IChzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqKSBoYXNoX2xpc3QtPm5leHQ7CisJd2hpbGUgKCYocmVjb3JkLT5oYXNoKSAhPSBoYXNoX2xpc3QpIHsKKwkJaWYgKHJlY29yZC0+YmxvY2tuciA9PSBibG9ja25yKQorCQkJcmV0dXJuIHJlY29yZDsKKwkJcmVjb3JkID0gKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICopIHJlY29yZC0+aGFzaC5uZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGpvdXJuYWxfaW5pdF9yZXZva2VfY2FjaGVzKHZvaWQpCit7CisJcmV2b2tlX3JlY29yZF9jYWNoZSA9IGRvX2NhY2hlX2NyZWF0ZShzaXplb2Yoc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MpKTsKKwlpZiAocmV2b2tlX3JlY29yZF9jYWNoZSA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldm9rZV90YWJsZV9jYWNoZSA9IGRvX2NhY2hlX2NyZWF0ZShzaXplb2Yoc3RydWN0IGpiZF9yZXZva2VfdGFibGVfcykpOworCWlmIChyZXZva2VfdGFibGVfY2FjaGUgPT0gMCkgeworCQlkb19jYWNoZV9kZXN0cm95KHJldm9rZV9yZWNvcmRfY2FjaGUpOworCQlyZXZva2VfcmVjb3JkX2NhY2hlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGpvdXJuYWxfZGVzdHJveV9yZXZva2VfY2FjaGVzKHZvaWQpCit7CisJZG9fY2FjaGVfZGVzdHJveShyZXZva2VfcmVjb3JkX2NhY2hlKTsKKwlyZXZva2VfcmVjb3JkX2NhY2hlID0gMDsKKwlkb19jYWNoZV9kZXN0cm95KHJldm9rZV90YWJsZV9jYWNoZSk7CisJcmV2b2tlX3RhYmxlX2NhY2hlID0gMDsKK30KKworLyogSW5pdGlhbGlzZSB0aGUgcmV2b2tlIHRhYmxlIGZvciBhIGdpdmVuIGpvdXJuYWwgdG8gYSBnaXZlbiBzaXplLiAqLworCitpbnQgam91cm5hbF9pbml0X3Jldm9rZShqb3VybmFsX3QgKmpvdXJuYWwsIGludCBoYXNoX3NpemUpCit7CisJaW50IHNoaWZ0LCB0bXA7CisKKwlqb3VybmFsLT5qX3Jldm9rZSA9IGttZW1fY2FjaGVfYWxsb2MocmV2b2tlX3RhYmxlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWpvdXJuYWwtPmpfcmV2b2tlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGhhc2hfc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLworCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CisKKwlzaGlmdCA9IDA7CisJdG1wID0gaGFzaF9zaXplOworCXdoaWxlICgodG1wID4+PSAxVUwpICE9IDBVTCkKKwkJc2hpZnQrKzsKKwlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaGlmdCA9IHNoaWZ0OworCisJam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGUgPSB4bWFsbG9jKGhhc2hfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSk7CisKKwlmb3IgKHRtcCA9IDA7IHRtcCA8IGhhc2hfc2l6ZTsgdG1wKyspCisJCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZVt0bXBdKTsKKworCXJldHVybiAwOworfQorCisvKiBEZXN0b3kgYSBqb3VybmFsJ3MgcmV2b2tlIHRhYmxlLiAgVGhlIHRhYmxlIG11c3QgYWxyZWFkeSBiZSBlbXB0eSEgKi8KKwordm9pZCBqb3VybmFsX2Rlc3Ryb3lfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zICp0YWJsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJaW50IGk7CisKKwl0YWJsZSA9IGpvdXJuYWwtPmpfcmV2b2tlOworCWlmICghdGFibGUpCisJCXJldHVybjsKKworCWZvciAoaT0wOyBpPHRhYmxlLT5oYXNoX3NpemU7IGkrKykgeworCQloYXNoX2xpc3QgPSAmdGFibGUtPmhhc2hfdGFibGVbaV07CisJfQorCisJZnJlZSh0YWJsZS0+aGFzaF90YWJsZSk7CisJZnJlZSh0YWJsZSk7CisJam91cm5hbC0+al9yZXZva2UgPSBOVUxMOworfQorCisvKgorICogUmV2b2tlIHN1cHBvcnQgZm9yIHJlY292ZXJ5LgorICoKKyAqIFJlY292ZXJ5IG5lZWRzIHRvIGJlIGFibGUgdG86CisgKgorICogIHJlY29yZCBhbGwgcmV2b2tlIHJlY29yZHMsIGluY2x1ZGluZyB0aGUgdGlkIG9mIHRoZSBsYXRlc3QgaW5zdGFuY2UKKyAqICBvZiBlYWNoIHJldm9rZSBpbiB0aGUgam91cm5hbAorICoKKyAqICBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gYmxvY2sgaW4gYSBnaXZlbiB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcmVwbGF5ZWQKKyAqICAoaWUuIGhhcyBub3QgYmVlbiByZXZva2VkIGJ5IGEgcmV2b2tlIHJlY29yZCBpbiB0aGF0IG9yIGEgc3Vic2VxdWVudAorICogIHRyYW5zYWN0aW9uKQorICoKKyAqICBlbXB0eSB0aGUgcmV2b2tlIHRhYmxlIGFmdGVyIHJlY292ZXJ5LgorICovCisKKy8qCisgKiBGaXJzdCwgc2V0dGluZyByZXZva2UgcmVjb3Jkcy4gIFdlIGNyZWF0ZSBhIG5ldyByZXZva2UgcmVjb3JkIGZvcgorICogZXZlcnkgYmxvY2sgZXZlciByZXZva2VkIGluIHRoZSBsb2cgYXMgd2Ugc2NhbiBpdCBmb3IgcmVjb3ZlcnksIGFuZAorICogd2UgdXBkYXRlIHRoZSBleGlzdGluZyByZWNvcmRzIGlmIHdlIGZpbmQgbXVsdGlwbGUgcmV2b2tlcyBmb3IgYQorICogc2luZ2xlIGJsb2NrLgorICovCisKK2ludCBqb3VybmFsX3NldF9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nIGJsb2NrbnIsCisJCSAgICAgICB0aWRfdCBzZXF1ZW5jZSkKK3sKKwlzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqcmVjb3JkOworCisJcmVjb3JkID0gZmluZF9yZXZva2VfcmVjb3JkKGpvdXJuYWwsIGJsb2NrbnIpOworCWlmIChyZWNvcmQpIHsKKwkJLyogSWYgd2UgaGF2ZSBtdWx0aXBsZSBvY2N1cmVuY2VzLCBvbmx5IHJlY29yZCB0aGUKKwkJICogbGF0ZXN0IHNlcXVlbmNlIG51bWJlciBpbiB0aGUgaGFzaGVkIHJlY29yZCAqLworCQlpZiAodGlkX2d0KHNlcXVlbmNlLCByZWNvcmQtPnNlcXVlbmNlKSkKKwkJCXJlY29yZC0+c2VxdWVuY2UgPSBzZXF1ZW5jZTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBpbnNlcnRfcmV2b2tlX2hhc2goam91cm5hbCwgYmxvY2tuciwgc2VxdWVuY2UpOworfQorCisvKgorICogVGVzdCByZXZva2UgcmVjb3Jkcy4gIEZvciBhIGdpdmVuIGJsb2NrIHJlZmVyZW5jZWQgaW4gdGhlIGxvZywgaGFzCisgKiB0aGF0IGJsb2NrIGJlZW4gcmV2b2tlZD8gIEEgcmV2b2tlIHJlY29yZCB3aXRoIGEgZ2l2ZW4gdHJhbnNhY3Rpb24KKyAqIHNlcXVlbmNlIG51bWJlciByZXZva2VzIGFsbCBibG9ja3MgaW4gdGhhdCB0cmFuc2FjdGlvbiBhbmQgZWFybGllcgorICogb25lcywgYnV0IGxhdGVyIHRyYW5zYWN0aW9ucyBzdGlsbCBuZWVkIHJlcGxheWVkLgorICovCisKK2ludCBqb3VybmFsX3Rlc3RfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBibG9ja25yLAorCQkJdGlkX3Qgc2VxdWVuY2UpCit7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworCXJlY29yZCA9IGZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsLCBibG9ja25yKTsKKwlpZiAoIXJlY29yZCkKKwkJcmV0dXJuIDA7CisJaWYgKHRpZF9ndChzZXF1ZW5jZSwgcmVjb3JkLT5zZXF1ZW5jZSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogRmluYWxseSwgb25jZSByZWNvdmVyeSBpcyBvdmVyLCB3ZSBuZWVkIHRvIGNsZWFyIHRoZSByZXZva2UgdGFibGUgc28KKyAqIHRoYXQgaXQgY2FuIGJlIHJldXNlZCBieSB0aGUgcnVubmluZyBmaWxlc3lzdGVtLgorICovCisKK3ZvaWQgam91cm5hbF9jbGVhcl9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBpOworCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hfbGlzdDsKKwlzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqcmVjb3JkOworCXN0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MgKnJldm9rZV92YXI7CisKKwlyZXZva2VfdmFyID0gam91cm5hbC0+al9yZXZva2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmV2b2tlX3Zhci0+aGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaF9saXN0ID0gJnJldm9rZV92YXItPmhhc2hfdGFibGVbaV07CisJCXdoaWxlICghbGlzdF9lbXB0eShoYXNoX2xpc3QpKSB7CisJCQlyZWNvcmQgPSAoc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MqKSBoYXNoX2xpc3QtPm5leHQ7CisJCQlsaXN0X2RlbCgmcmVjb3JkLT5oYXNoKTsKKwkJCWZyZWUocmVjb3JkKTsKKwkJfQorCX0KK30KKworLyoKKyAqIGUyZnNjay5jIC0gc3VwZXJibG9jayBjaGVja3MKKyAqLworCisjZGVmaW5lIE1JTl9DSEVDSyAxCisjZGVmaW5lIE1BWF9DSEVDSyAyCisKK3N0YXRpYyB2b2lkIGNoZWNrX3N1cGVyX3ZhbHVlKGUyZnNja190IGN0eCwgY29uc3QgY2hhciAqZGVzY3IsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgZmxhZ3MsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG1pbl92YWwsIHVuc2lnbmVkIGxvbmcgbWF4X3ZhbCkKK3sKKwlzdHJ1Y3QgICAgICAgICAgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisKKwlpZiAoKChmbGFncyAmIE1JTl9DSEVDSykgJiYgKHZhbHVlIDwgbWluX3ZhbCkpIHx8CisJICAgICgoZmxhZ3MgJiBNQVhfQ0hFQ0spICYmICh2YWx1ZSA+IG1heF92YWwpKSkgeworCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQlwY3R4Lm51bSA9IHZhbHVlOworCQlwY3R4LnN0ciA9IGRlc2NyOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzBfTUlTQ19DT1JSVVBUX1NVUEVSLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7IC8qIG5ldmVyIGdldCBoZXJlISAqLworCX0KK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBtYXkgZ2V0IHN0dWJiZWQgb3V0IGluIHNwZWNpYWwgY29tcGlsYXRpb25zIG9mIHRoZQorICogZTJmc2NrIGNvZGUuLgorICovCisjaWZuZGVmIEVYVDJfU1BFQ0lBTF9ERVZJQ0VfU0laRQorc3RhdGljIGVycmNvZGVfdCBlMmZzY2tfZ2V0X2RldmljZV9zaXplKGUyZnNja190IGN0eCkKK3sKKwlyZXR1cm4gKGV4dDJmc19nZXRfZGV2aWNlX3NpemUoY3R4LT5maWxlc3lzdGVtX25hbWUsCisJCQkJICAgICAgIEVYVDJfQkxPQ0tfU0laRShjdHgtPmZzLT5zdXBlciksCisJCQkJICAgICAgICZjdHgtPm51bV9ibG9ja3MpKTsKK30KKyNlbmRpZgorCisvKgorICogaGVscGVyIGZ1bmN0aW9uIHRvIHJlbGVhc2UgYW4gaW5vZGUKKyAqLworc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0IHsKKwllMmZzY2tfdCAgICAgICAgY3R4OworCWNoYXIgICAgICAgICAgICAqYnVmOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHg7CisJaW50ICAgICAgICAgICAgIHRydW5jYXRpbmc7CisJaW50ICAgICAgICAgICAgIHRydW5jYXRlX29mZnNldDsKKwllMl9ibGtjbnRfdCAgICAgdHJ1bmNhdGVfYmxvY2s7CisJaW50ICAgICAgICAgICAgIHRydW5jYXRlZF9ibG9ja3M7CisJaW50ICAgICAgICAgICAgIGFib3J0OworCWVycmNvZGVfdCAgICAgICBlcnJjb2RlOworfTsKKworc3RhdGljIGludCByZWxlYXNlX2lub2RlX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCAqYmxvY2tfbnIsCisJCQkgICAgICAgZTJfYmxrY250X3QgYmxvY2tjbnQsCisJCQkgICAgICAgYmxrX3QgICAgcmVmX2JsayBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICAgIGludCAgICAgIHJlZl9vZmZzZXQgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0ICpwYjsKKwllMmZzY2tfdCAgICAgICAgICAgICAgICBjdHg7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgKnBjdHg7CisJYmxrX3QgICAgICAgICAgICAgICAgICAgYmxrID0gKmJsb2NrX25yOworCWludCAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IDA7CisKKwlwYiA9IChzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3QgKikgcHJpdl9kYXRhOworCWN0eCA9IHBiLT5jdHg7CisJcGN0eCA9IHBiLT5wY3R4OworCisJcGN0eC0+YmxrID0gYmxrOworCXBjdHgtPmJsa2NvdW50ID0gYmxvY2tjbnQ7CisKKwlpZiAoSE9MRV9CTEtBRERSKGJsaykpCisJCXJldHVybiAwOworCisJaWYgKChibGsgPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkgICAgKGJsayA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzBfT1JQSEFOX0lMTEVHQUxfQkxPQ0tfTlVNLCBwY3R4KTsKKyByZXR1cm5fYWJvcnQ6CisJCXBiLT5hYm9ydCA9IDE7CisJCXJldHVybiBCTE9DS19BQk9SVDsKKwl9CisKKwlpZiAoIWV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChmcy0+YmxvY2tfbWFwLCBibGspKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9PUlBIQU5fQUxSRUFEWV9DTEVBUkVEX0JMT0NLLCBwY3R4KTsKKwkJZ290byByZXR1cm5fYWJvcnQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgZGVsZXRpbmcgYW4gb3JwaGFuLCB0aGVuIHdlIGxlYXZlIHRoZSBmaWVsZHMgYWxvbmUuCisJICogSWYgd2UgYXJlIHRydW5jYXRpbmcgYW4gb3JwaGFuLCB0aGVuIHVwZGF0ZSB0aGUgaW5vZGUgZmllbGRzCisJICogYW5kIGNsZWFuIHVwIGFueSBwYXJ0aWFsIGJsb2NrIGRhdGEuCisJICovCisJaWYgKHBiLT50cnVuY2F0aW5nKSB7CisJCS8qCisJCSAqIFdlIG9ubHkgcmVtb3ZlIGluZGlyZWN0IGJsb2NrcyBpZiB0aGV5IGFyZQorCQkgKiBjb21wbGV0ZWx5IGVtcHR5LgorCQkgKi8KKwkJaWYgKGJsb2NrY250IDwgMCkgeworCQkJaW50ICAgICBpLCBsaW1pdDsKKwkJCWJsa190ICAgKmJwOworCisJCQlwYi0+ZXJyY29kZSA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBibGssIDEsCisJCQkJCQkJcGItPmJ1Zik7CisJCQlpZiAocGItPmVycmNvZGUpCisJCQkJZ290byByZXR1cm5fYWJvcnQ7CisKKwkJCWxpbWl0ID0gZnMtPmJsb2Nrc2l6ZSA+PiAyOworCQkJZm9yIChpID0gMCwgYnAgPSAoYmxrX3QgKikgcGItPmJ1ZjsKKwkJCSAgICAgaSA8IGxpbWl0OyAgaSsrLCBicCsrKQorCQkJCWlmICgqYnApCisJCQkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIFdlIGRvbid0IHJlbW92ZSBkaXJlY3QgYmxvY2tzIHVudGlsIHdlJ3ZlIHJlYWNoZWQKKwkJICogdGhlIHRydW5jYXRpb24gYmxvY2suCisJCSAqLworCQlpZiAoYmxvY2tjbnQgPj0gMCAmJiBibG9ja2NudCA8IHBiLT50cnVuY2F0ZV9ibG9jaykKKwkJCXJldHVybiAwOworCQkvKgorCQkgKiBJZiBwYXJ0IG9mIHRoZSBsYXN0IGJsb2NrIG5lZWRzIHRydW5jYXRpbmcsIHdlIGRvCisJCSAqIGl0IGhlcmUuCisJCSAqLworCQlpZiAoKGJsb2NrY250ID09IHBiLT50cnVuY2F0ZV9ibG9jaykgJiYgcGItPnRydW5jYXRlX29mZnNldCkgeworCQkJcGItPmVycmNvZGUgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxrLCAxLAorCQkJCQkJCXBiLT5idWYpOworCQkJaWYgKHBiLT5lcnJjb2RlKQorCQkJCWdvdG8gcmV0dXJuX2Fib3J0OworCQkJbWVtc2V0KHBiLT5idWYgKyBwYi0+dHJ1bmNhdGVfb2Zmc2V0LCAwLAorCQkJICAgICAgIGZzLT5ibG9ja3NpemUgLSBwYi0+dHJ1bmNhdGVfb2Zmc2V0KTsKKwkJCXBiLT5lcnJjb2RlID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibGssIDEsCisJCQkJCQkJIHBiLT5idWYpOworCQkJaWYgKHBiLT5lcnJjb2RlKQorCQkJCWdvdG8gcmV0dXJuX2Fib3J0OworCQl9CisJCXBiLT50cnVuY2F0ZWRfYmxvY2tzKys7CisJCSpibG9ja19uciA9IDA7CisJCXJldHZhbCB8PSBCTE9DS19DSEFOR0VEOworCX0KKworCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgYmxrLCAtMSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYW4gaW5vZGUuICBSZXR1cm5zIDEgaWYgYW4gaW5jb25zaXN0ZW5jeSB3YXMKKyAqIGZvdW5kLiAgSWYgdGhlIGlub2RlIGhhcyBhIGxpbmsgY291bnQsIHRoZW4gaXQgaXMgYmVpbmcgdHJ1bmNhdGVkIGFuZAorICogbm90IGRlbGV0ZWQuCisgKi8KK3N0YXRpYyBpbnQgcmVsZWFzZV9pbm9kZV9ibG9ja3MoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywKKwkJCQlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsIGNoYXIgKmJsb2NrX2J1ZiwKKwkJCQlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCXN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdCAgICAgcGI7CisJZXh0Ml9maWxzeXMgICAgICAgICAgICAgICAgICAgICBmcyA9IGN0eC0+ZnM7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgICAgICAgICByZXR2YWw7CisJX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDsKKworCWlmICghZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3MoaW5vZGUpKQorCQlyZXR1cm4gMDsKKworCXBiLmJ1ZiA9IGJsb2NrX2J1ZiArIDMgKiBjdHgtPmZzLT5ibG9ja3NpemU7CisJcGIuY3R4ID0gY3R4OworCXBiLmFib3J0ID0gMDsKKwlwYi5lcnJjb2RlID0gMDsKKwlwYi5wY3R4ID0gcGN0eDsKKwlpZiAoaW5vZGUtPmlfbGlua3NfY291bnQpIHsKKwkJcGIudHJ1bmNhdGluZyA9IDE7CisJCXBiLnRydW5jYXRlX2Jsb2NrID0gKGUyX2Jsa2NudF90KQorCQkJKCgoKGxvbmcgbG9uZylpbm9kZS0+aV9zaXplX2hpZ2ggPDwgMzIpICsKKwkJCSAgaW5vZGUtPmlfc2l6ZSArIGZzLT5ibG9ja3NpemUgLSAxKSAvCisJCQkgZnMtPmJsb2Nrc2l6ZSk7CisJCXBiLnRydW5jYXRlX29mZnNldCA9IGlub2RlLT5pX3NpemUgJSBmcy0+YmxvY2tzaXplOworCX0gZWxzZSB7CisJCXBiLnRydW5jYXRpbmcgPSAwOworCQlwYi50cnVuY2F0ZV9ibG9jayA9IDA7CisJCXBiLnRydW5jYXRlX29mZnNldCA9IDA7CisJfQorCXBiLnRydW5jYXRlZF9ibG9ja3MgPSAwOworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLCBCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFLAorCQkJCSAgICAgIGJsb2NrX2J1ZiwgcmVsZWFzZV9pbm9kZV9ibG9jaywgJnBiKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSBjYWxsaW5nIGV4dDJmc19ibG9ja19pdGVyYXRlIGZvciBpbm9kZSAlZCIpLAorCQkJaW5vKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwYi5hYm9ydCkKKwkJcmV0dXJuIDE7CisKKwkvKiBSZWZyZXNoIHRoZSBpbm9kZSBzaW5jZSBleHQyZnNfYmxvY2tfaXRlcmF0ZSBtYXkgaGF2ZSBjaGFuZ2VkIGl0ICovCisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sIGlub2RlLCAicmVsZWFzZV9pbm9kZV9ibG9ja3MiKTsKKworCWlmIChwYi50cnVuY2F0ZWRfYmxvY2tzKQorCQlpbm9kZS0+aV9ibG9ja3MgLT0gcGIudHJ1bmNhdGVkX2Jsb2NrcyAqCisJCQkoZnMtPmJsb2Nrc2l6ZSAvIDUxMik7CisKKwlpZiAoaW5vZGUtPmlfZmlsZV9hY2wpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2FkanVzdF9lYV9yZWZjb3VudChmcywgaW5vZGUtPmlfZmlsZV9hY2wsCisJCQkJCQkgICBibG9ja19idWYsIC0xLCAmY291bnQpOworCQlpZiAocmV0dmFsID09IEVYVDJfRVRfQkFEX0VBX0JMT0NLX05VTSkgeworCQkJcmV0dmFsID0gMDsKKwkJCWNvdW50ID0gMTsKKwkJfQorCQlpZiAocmV0dmFsKSB7CisJCQliYl9lcnJvcl9tc2coXygid2hpbGUgY2FsbGluZyBleHQyZnNfYWRqdXN0X2VhX3JlZm9jdW50IGZvciBpbm9kZSAlZCIpLAorCQkJCWlubyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoY291bnQgPT0gMCkKKwkJCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgaW5vZGUtPmlfZmlsZV9hY2wsIC0xKTsKKwkJaW5vZGUtPmlfZmlsZV9hY2wgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYWxsIG9mIHRoZSBvcnBoYW4gaW5vZGVzLiAgSXQgcmV0dXJucyAxIGlmCisgKiBpdCBoaXQgc29tZSBlcnJvciwgYW5kIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCByZWxlYXNlX29ycGhhbl9pbm9kZXMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlleHQyX2lub190ICAgICAgaW5vLCBuZXh0X2lubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSBpbm9kZTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisJY2hhciAqYmxvY2tfYnVmOworCisJaWYgKChpbm8gPSBmcy0+c3VwZXItPnNfbGFzdF9vcnBoYW4pID09IDApCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXaW4gb3IgbG9zZSwgd2Ugd29uJ3QgYmUgdXNpbmcgdGhlIGhlYWQgb2YgdGhlIG9ycGhhbiBpbm9kZQorCSAqIGxpc3QgYWdhaW4uCisJICovCisJZnMtPnN1cGVyLT5zX2xhc3Rfb3JwaGFuID0gMDsKKwlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisKKwkvKgorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGNvbnRhaW5zIGVycm9ycywgZG9uJ3QgcnVuIHRoZSBvcnBoYW4KKwkgKiBsaXN0LCBzaW5jZSB0aGUgb3JwaGFuIGxpc3QgY2FuJ3QgYmUgdHJ1c3RlZDsgYW5kIHdlJ3JlCisJICogZ29pbmcgdG8gYmUgcnVubmluZyBhIGZ1bGwgZTJmc2NrIHJ1biBhbnl3YXkuLi4KKwkgKi8KKwlpZiAoZnMtPnN1cGVyLT5zX3N0YXRlICYgRVhUMl9FUlJPUl9GUykKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGlubyA8IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKSkgfHwKKwkgICAgKGlubyA+IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpKSB7CisJCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJCXBjdHguaW5vID0gaW5vOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzBfT1JQSEFOX0lMTEVHQUxfSEVBRF9JTk9ERSwgJnBjdHgpOworCQlyZXR1cm4gMTsKKwl9CisKKwlibG9ja19idWYgPSAoY2hhciAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgZnMtPmJsb2Nrc2l6ZSAqIDQsCisJCQkJCQkgICAgImJsb2NrIGl0ZXJhdGUgYnVmZmVyIik7CisJZTJmc2NrX3JlYWRfYml0bWFwcyhjdHgpOworCisJd2hpbGUgKGlubykgeworCQllMmZzY2tfcmVhZF9pbm9kZShjdHgsIGlubywgJmlub2RlLCAicmVsZWFzZV9vcnBoYW5faW5vZGVzIik7CisJCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJCXBjdHguaW5vID0gaW5vOworCQlwY3R4Lmlub2RlID0gJmlub2RlOworCQlwY3R4LnN0ciA9IGlub2RlLmlfbGlua3NfY291bnQgPyBfKCJUcnVuY2F0aW5nIikgOgorCQkJXygiQ2xlYXJpbmciKTsKKworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzBfT1JQSEFOX0NMRUFSX0lOT0RFLCAmcGN0eCk7CisKKwkJbmV4dF9pbm8gPSBpbm9kZS5pX2R0aW1lOworCQlpZiAobmV4dF9pbm8gJiYKKwkJICAgICgobmV4dF9pbm8gPCBFWFQyX0ZJUlNUX0lOT0RFKGZzLT5zdXBlcikpIHx8CisJCSAgICAgKG5leHRfaW5vID4gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudCkpKSB7CisJCQlwY3R4LmlubyA9IG5leHRfaW5vOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX09SUEhBTl9JTExFR0FMX0lOT0RFLCAmcGN0eCk7CisJCQlnb3RvIHJldHVybl9hYm9ydDsKKwkJfQorCisJCWlmIChyZWxlYXNlX2lub2RlX2Jsb2NrcyhjdHgsIGlubywgJmlub2RlLCBibG9ja19idWYsICZwY3R4KSkKKwkJCWdvdG8gcmV0dXJuX2Fib3J0OworCisJCWlmICghaW5vZGUuaV9saW5rc19jb3VudCkgeworCQkJZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzMihmcywgaW5vLCAtMSwKKwkJCQkJCSAgTElOVVhfU19JU0RJUihpbm9kZS5pX21vZGUpKTsKKwkJCWlub2RlLmlfZHRpbWUgPSB0aW1lKE5VTEwpOworCQl9IGVsc2UgeworCQkJaW5vZGUuaV9kdGltZSA9IDA7CisJCX0KKwkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJkZWxldGVfZmlsZSIpOworCQlpbm8gPSBuZXh0X2lubzsKKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZibG9ja19idWYpOworCXJldHVybiAwOworIHJldHVybl9hYm9ydDoKKwlleHQyZnNfZnJlZV9tZW0oJmJsb2NrX2J1Zik7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgcmVzaXplIGlub2RlIHRvIG1ha2Ugc3VyZSBpdCBpcyBzYW5lLiAgV2UgY2hlY2sgYm90aCBmb3IKKyAqIHRoZSBjYXNlIHdoZXJlIG9uLWxpbmUgcmVzaXppbmcgaXMgbm90IGVuYWJsZWQgKGluIHdoaWNoIGNhc2UgdGhlCisgKiByZXNpemUgaW5vZGUgc2hvdWxkIGJlIGNsZWFyZWQpIGFzIHdlbGwgYXMgdGhlIGNhc2Ugd2hlcmUgb24tbGluZQorICogcmVzaXppbmcgaXMgZW5hYmxlZC4KKyAqLworc3RhdGljIHZvaWQgY2hlY2tfcmVzaXplX2lub2RlKGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJc3RydWN0IGV4dDJfaW5vZGUgaW5vZGU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlpbnQgICAgICAgICAgICAgaSwgaiwgZ2R0X29mZiwgaW5kX29mZjsKKwlibGtfdCAgICAgICAgICAgYmxrLCBwYmxrLCBleHBlY3Q7CisJX191MzIgICAgICAgICAgICpkaW5kX2J1ZiA9IE5VTEwsICppbmRfYnVmOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJLyoKKwkgKiBJZiB0aGUgcmVzaXplIGlub2RlIGZlYXR1cmUgaXNuJ3Qgc2V0LCB0aGVuCisJICogc19yZXNlcnZlZF9nZHRfYmxvY2tzIG11c3QgYmUgemVyby4KKwkgKi8KKwlpZiAoIShmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJgorCSAgICAgIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFKSkgeworCQlpZiAoZnMtPnN1cGVyLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpIHsKKwkJCXBjdHgubnVtID0gZnMtPnN1cGVyLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3M7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8wX05PTlpFUk9fUkVTRVJWRURfR0RUX0JMT0NLUywKKwkJCQkJJnBjdHgpKSB7CisJCQkJZnMtPnN1cGVyLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MgPSAwOworCQkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlYWQgdGhlIHJlc2l6ZSBpbm9kZSAqLworCXBjdHguaW5vID0gRVhUMl9SRVNJWkVfSU5POworCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBFWFQyX1JFU0laRV9JTk8sICZpbm9kZSk7CisJaWYgKHJldHZhbCkgeworCQlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYKKwkJICAgIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFKQorCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19SRVNJWkVfSU5PREU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSByZXNpemUgaW5vZGUgZmVhdHVyZSBpc24ndCBzZXQsIGNoZWNrIHRvIG1ha2Ugc3VyZQorCSAqIHRoZSByZXNpemUgaW5vZGUgaXMgY2xlYXJlZDsgdGhlbiB3ZSdyZSBkb25lLgorCSAqLworCWlmICghKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmCisJICAgICAgRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUpKSB7CisJCWZvciAoaT0wOyBpIDwgRVhUMl9OX0JMT0NLUzsgaSsrKSB7CisJCQlpZiAoaW5vZGUuaV9ibG9ja1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoKGkgPCBFWFQyX05fQkxPQ0tTKSAmJgorCQkgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8wX0NMRUFSX1JFU0laRV9JTk9ERSwgJnBjdHgpKSB7CisJCQltZW1zZXQoJmlub2RlLCAwLCBzaXplb2YoaW5vZGUpKTsKKwkJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIEVYVDJfUkVTSVpFX0lOTywgJmlub2RlLAorCQkJCQkgICAiY2xlYXJfcmVzaXplIik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVGhlIHJlc2l6ZSBpbm9kZSBmZWF0dXJlIGlzIGVuYWJsZWQ7IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUKKwkgKiBvbmx5IGJsb2NrIGluIHVzZSBpcyB0aGUgZG91YmxlIGluZGlyZWN0IGJsb2NrCisJICovCisJYmxrID0gaW5vZGUuaV9ibG9ja1tFWFQyX0RJTkRfQkxPQ0tdOworCWZvciAoaT0wOyBpIDwgRVhUMl9OX0JMT0NLUzsgaSsrKSB7CisJCWlmIChpICE9IEVYVDJfRElORF9CTE9DSyAmJiBpbm9kZS5pX2Jsb2NrW2ldKQorCQkJYnJlYWs7CisJfQorCWlmICgoaSA8IEVYVDJfTl9CTE9DS1MpIHx8ICFibGsgfHwgIWlub2RlLmlfbGlua3NfY291bnQgfHwKKwkgICAgIShpbm9kZS5pX21vZGUgJiBMSU5VWF9TX0lGUkVHKSB8fAorCSAgICAoYmxrIDwgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2sgfHwKKwkgICAgIGJsayA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSkgeworIHJlc2l6ZV9pbm9kZV9pbnZhbGlkOgorCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8wX1JFU0laRV9JTk9ERV9JTlZBTElELCAmcGN0eCkpIHsKKwkJCW1lbXNldCgmaW5vZGUsIDAsIHNpemVvZihpbm9kZSkpOworCQkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgRVhUMl9SRVNJWkVfSU5PLCAmaW5vZGUsCisJCQkJCSAgICJjbGVhcl9yZXNpemUiKTsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfUkVTSVpFX0lOT0RFOworCQl9CisJCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpKSB7CisJCQlmcy0+c3VwZXItPnNfc3RhdGUgJj0gfkVYVDJfVkFMSURfRlM7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCX0KKwkJZ290byBjbGVhbnVwOworCX0KKwlkaW5kX2J1ZiA9IChfX3UzMiAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgZnMtPmJsb2Nrc2l6ZSAqIDIsCisJCQkJCQkgICAgInJlc2l6ZSBkaW5kIGJ1ZmZlciIpOworCWluZF9idWYgPSAoX191MzIgKikgKChjaGFyICopIGRpbmRfYnVmICsgZnMtPmJsb2Nrc2l6ZSk7CisKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbmRfYmxvY2soZnMsIGJsaywgZGluZF9idWYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcmVzaXplX2lub2RlX2ludmFsaWQ7CisKKwlnZHRfb2ZmID0gZnMtPmRlc2NfYmxvY2tzOworCXBibGsgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayArIDEgKyBmcy0+ZGVzY19ibG9ja3M7CisJZm9yIChpID0gMDsgaSA8IGZzLT5zdXBlci0+c19yZXNlcnZlZF9nZHRfYmxvY2tzIC8gNDsKKwkgICAgIGkrKywgZ2R0X29mZisrLCBwYmxrKyspIHsKKwkJZ2R0X29mZiAlPSBmcy0+YmxvY2tzaXplLzQ7CisJCWlmIChkaW5kX2J1ZltnZHRfb2ZmXSAhPSBwYmxrKQorCQkJZ290byByZXNpemVfaW5vZGVfaW52YWxpZDsKKwkJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5kX2Jsb2NrKGZzLCBwYmxrLCBpbmRfYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gcmVzaXplX2lub2RlX2ludmFsaWQ7CisJCWluZF9vZmYgPSAwOworCQlmb3IgKGogPSAxOyBqIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGorKykgeworCQkJaWYgKCFleHQyZnNfYmdfaGFzX3N1cGVyKGZzLCBqKSkKKwkJCQljb250aW51ZTsKKwkJCWV4cGVjdCA9IHBibGsgKyAoaiAqIGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKwkJCWlmIChpbmRfYnVmW2luZF9vZmZdICE9IGV4cGVjdCkKKwkJCQlnb3RvIHJlc2l6ZV9pbm9kZV9pbnZhbGlkOworCQkJaW5kX29mZisrOworCQl9CisJfQorCisgY2xlYW51cDoKKwlleHQyZnNfZnJlZV9tZW0oJmRpbmRfYnVmKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfc3VwZXJfYmxvY2soZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlibGtfdCAgIGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYiA9IGZzLT5zdXBlcjsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpnZDsKKwlibGtfdCAgIGJsb2Nrc19wZXJfZ3JvdXAgPSBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKKwlibGtfdCAgIGJwZ19tYXg7CisJaW50ICAgICBpbm9kZXNfcGVyX2Jsb2NrOworCWludCAgICAgaXBnX21heDsKKwlpbnQgICAgIGlub2RlX3NpemU7CisJZGdycF90ICBpOworCWJsa190ICAgc2hvdWxkX2JlOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJX191MzIgICBmcmVlX2Jsb2NrcyA9IDAsIGZyZWVfaW5vZGVzID0gMDsKKworCWlub2Rlc19wZXJfYmxvY2sgPSBFWFQyX0lOT0RFU19QRVJfQkxPQ0soZnMtPnN1cGVyKTsKKwlpcGdfbWF4ID0gaW5vZGVzX3Blcl9ibG9jayAqIChibG9ja3NfcGVyX2dyb3VwIC0gNCk7CisJaWYgKGlwZ19tYXggPiBFWFQyX01BWF9JTk9ERVNfUEVSX0dST1VQKHNiKSkKKwkJaXBnX21heCA9IEVYVDJfTUFYX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJwZ19tYXggPSA4ICogRVhUMl9CTE9DS19TSVpFKHNiKTsKKwlpZiAoYnBnX21heCA+IEVYVDJfTUFYX0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQlicGdfbWF4ID0gRVhUMl9NQVhfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisKKwljdHgtPmludmFsaWRfaW5vZGVfYml0bWFwX2ZsYWcgPSAoaW50ICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCQkgc2l6ZW9mKGludCkgKiBmcy0+Z3JvdXBfZGVzY19jb3VudCwgImludmFsaWRfaW5vZGVfYml0bWFwIik7CisJY3R4LT5pbnZhbGlkX2Jsb2NrX2JpdG1hcF9mbGFnID0gKGludCAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwKKwkJIHNpemVvZihpbnQpICogZnMtPmdyb3VwX2Rlc2NfY291bnQsICJpbnZhbGlkX2Jsb2NrX2JpdG1hcCIpOworCWN0eC0+aW52YWxpZF9pbm9kZV90YWJsZV9mbGFnID0gKGludCAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwKKwkJc2l6ZW9mKGludCkgKiBmcy0+Z3JvdXBfZGVzY19jb3VudCwgImludmFsaWRfaW5vZGVfdGFibGUiKTsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwkvKgorCSAqIFZlcmlmeSB0aGUgc3VwZXIgYmxvY2sgY29uc3RhbnRzLi4uCisJICovCisJY2hlY2tfc3VwZXJfdmFsdWUoY3R4LCAiaW5vZGVzX2NvdW50Iiwgc2ItPnNfaW5vZGVzX2NvdW50LAorCQkJICBNSU5fQ0hFQ0ssIDEsIDApOworCWNoZWNrX3N1cGVyX3ZhbHVlKGN0eCwgImJsb2Nrc19jb3VudCIsIHNiLT5zX2Jsb2Nrc19jb3VudCwKKwkJCSAgTUlOX0NIRUNLLCAxLCAwKTsKKwljaGVja19zdXBlcl92YWx1ZShjdHgsICJmaXJzdF9kYXRhX2Jsb2NrIiwgc2ItPnNfZmlyc3RfZGF0YV9ibG9jaywKKwkJCSAgTUFYX0NIRUNLLCAwLCBzYi0+c19ibG9ja3NfY291bnQpOworCWNoZWNrX3N1cGVyX3ZhbHVlKGN0eCwgImxvZ19ibG9ja19zaXplIiwgc2ItPnNfbG9nX2Jsb2NrX3NpemUsCisJCQkgIE1JTl9DSEVDSyB8IE1BWF9DSEVDSywgMCwKKwkJCSAgRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkUgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRSk7CisJY2hlY2tfc3VwZXJfdmFsdWUoY3R4LCAibG9nX2ZyYWdfc2l6ZSIsIHNiLT5zX2xvZ19mcmFnX3NpemUsCisJCQkgIE1JTl9DSEVDSyB8IE1BWF9DSEVDSywgMCwgc2ItPnNfbG9nX2Jsb2NrX3NpemUpOworCWNoZWNrX3N1cGVyX3ZhbHVlKGN0eCwgImZyYWdzX3Blcl9ncm91cCIsIHNiLT5zX2ZyYWdzX3Blcl9ncm91cCwKKwkJCSAgTUlOX0NIRUNLIHwgTUFYX0NIRUNLLCBzYi0+c19ibG9ja3NfcGVyX2dyb3VwLAorCQkJICBicGdfbWF4KTsKKwljaGVja19zdXBlcl92YWx1ZShjdHgsICJibG9ja3NfcGVyX2dyb3VwIiwgc2ItPnNfYmxvY2tzX3Blcl9ncm91cCwKKwkJCSAgTUlOX0NIRUNLIHwgTUFYX0NIRUNLLCA4LCBicGdfbWF4KTsKKwljaGVja19zdXBlcl92YWx1ZShjdHgsICJpbm9kZXNfcGVyX2dyb3VwIiwgc2ItPnNfaW5vZGVzX3Blcl9ncm91cCwKKwkJCSAgTUlOX0NIRUNLIHwgTUFYX0NIRUNLLCBpbm9kZXNfcGVyX2Jsb2NrLCBpcGdfbWF4KTsKKwljaGVja19zdXBlcl92YWx1ZShjdHgsICJyX2Jsb2Nrc19jb3VudCIsIHNiLT5zX3JfYmxvY2tzX2NvdW50LAorCQkJICBNQVhfQ0hFQ0ssIDAsIHNiLT5zX2Jsb2Nrc19jb3VudCAvIDIpOworCWNoZWNrX3N1cGVyX3ZhbHVlKGN0eCwgInJlc2VydmVkX2dkdF9ibG9ja3MiLAorCQkJICBzYi0+c19yZXNlcnZlZF9nZHRfYmxvY2tzLCBNQVhfQ0hFQ0ssIDAsCisJCQkgIGZzLT5ibG9ja3NpemUvNCk7CisJaW5vZGVfc2l6ZSA9IEVYVDJfSU5PREVfU0laRShzYik7CisJY2hlY2tfc3VwZXJfdmFsdWUoY3R4LCAiaW5vZGVfc2l6ZSIsCisJCQkgIGlub2RlX3NpemUsIE1JTl9DSEVDSyB8IE1BWF9DSEVDSywKKwkJCSAgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFLCBmcy0+YmxvY2tzaXplKTsKKwlpZiAoaW5vZGVfc2l6ZSAmIChpbm9kZV9zaXplIC0gMSkpIHsKKwkJcGN0eC5udW0gPSBpbm9kZV9zaXplOworCQlwY3R4LnN0ciA9ICJpbm9kZV9zaXplIjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX01JU0NfQ09SUlVQVF9TVVBFUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBuZXZlciBnZXQgaGVyZSEgKi8KKwkJcmV0dXJuOworCX0KKworCWlmICghY3R4LT5udW1fYmxvY2tzKSB7CisJCXBjdHguZXJyY29kZSA9IGUyZnNja19nZXRfZGV2aWNlX3NpemUoY3R4KTsKKwkJaWYgKHBjdHguZXJyY29kZSAmJiBwY3R4LmVycmNvZGUgIT0gRVhUMl9FVF9VTklNUExFTUVOVEVEKSB7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzBfR0VUU0laRV9FUlJPUiwgJnBjdHgpOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoKHBjdHguZXJyY29kZSAhPSBFWFQyX0VUX1VOSU1QTEVNRU5URUQpICYmCisJCSAgICAoY3R4LT5udW1fYmxvY2tzIDwgc2ItPnNfYmxvY2tzX2NvdW50KSkgeworCQkJcGN0eC5ibGsgPSBzYi0+c19ibG9ja3NfY291bnQ7CisJCQlwY3R4LmJsazIgPSBjdHgtPm51bV9ibG9ja3M7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8wX0ZTX1NJWkVfV1JPTkcsICZwY3R4KSkgeworCQkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJaWYgKHNiLT5zX2xvZ19ibG9ja19zaXplICE9IChfX3UzMikgc2ItPnNfbG9nX2ZyYWdfc2l6ZSkgeworCQlwY3R4LmJsayA9IEVYVDJfQkxPQ0tfU0laRShzYik7CisJCXBjdHguYmxrMiA9IEVYVDJfRlJBR19TSVpFKHNiKTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX05PX0ZSQUdNRU5UUywgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCisJc2hvdWxkX2JlID0gc2ItPnNfZnJhZ3NfcGVyX2dyb3VwID4+CisJCShzYi0+c19sb2dfYmxvY2tfc2l6ZSAtIHNiLT5zX2xvZ19mcmFnX3NpemUpOworCWlmIChzYi0+c19ibG9ja3NfcGVyX2dyb3VwICE9IHNob3VsZF9iZSkgeworCQlwY3R4LmJsayA9IHNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCXBjdHguYmxrMiA9IHNob3VsZF9iZTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX0JMT0NLU19QRVJfR1JPVVAsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKworCXNob3VsZF9iZSA9IChzYi0+c19sb2dfYmxvY2tfc2l6ZSA9PSAwKSA/IDEgOiAwOworCWlmIChzYi0+c19maXJzdF9kYXRhX2Jsb2NrICE9IHNob3VsZF9iZSkgeworCQlwY3R4LmJsayA9IHNiLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJCXBjdHguYmxrMiA9IHNob3VsZF9iZTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX0ZJUlNUX0RBVEFfQkxPQ0ssICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKworCXNob3VsZF9iZSA9IHNiLT5zX2lub2Rlc19wZXJfZ3JvdXAgKiBmcy0+Z3JvdXBfZGVzY19jb3VudDsKKwlpZiAoc2ItPnNfaW5vZGVzX2NvdW50ICE9IHNob3VsZF9iZSkgeworCQlwY3R4LmlubyA9IHNiLT5zX2lub2Rlc19jb3VudDsKKwkJcGN0eC5pbm8yID0gc2hvdWxkX2JlOworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8wX0lOT0RFX0NPVU5UX1dST05HLCAmcGN0eCkpIHsKKwkJCXNiLT5zX2lub2Rlc19jb3VudCA9IHNob3VsZF9iZTsKKwkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJfQorCX0KKworCS8qCisJICogVmVyaWZ5IHRoZSBncm91cCBkZXNjcmlwdG9ycy4uLi4KKwkgKi8KKwlmaXJzdF9ibG9jayA9ICBzYi0+c19maXJzdF9kYXRhX2Jsb2NrOworCWxhc3RfYmxvY2sgPSBmaXJzdF9ibG9jayArIGJsb2Nrc19wZXJfZ3JvdXA7CisKKwlmb3IgKGkgPSAwLCBnZD1mcy0+Z3JvdXBfZGVzYzsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyssIGdkKyspIHsKKwkJcGN0eC5ncm91cCA9IGk7CisKKwkJaWYgKGkgPT0gZnMtPmdyb3VwX2Rlc2NfY291bnQgLSAxKQorCQkJbGFzdF9ibG9jayA9IHNiLT5zX2Jsb2Nrc19jb3VudDsKKwkJaWYgKChnZC0+YmdfYmxvY2tfYml0bWFwIDwgZmlyc3RfYmxvY2spIHx8CisJCSAgICAoZ2QtPmJnX2Jsb2NrX2JpdG1hcCA+PSBsYXN0X2Jsb2NrKSkgeworCQkJcGN0eC5ibGsgPSBnZC0+YmdfYmxvY2tfYml0bWFwOworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9CQl9OT1RfR1JPVVAsICZwY3R4KSkKKwkJCQlnZC0+YmdfYmxvY2tfYml0bWFwID0gMDsKKwkJfQorCQlpZiAoZ2QtPmJnX2Jsb2NrX2JpdG1hcCA9PSAwKSB7CisJCQljdHgtPmludmFsaWRfYmxvY2tfYml0bWFwX2ZsYWdbaV0rKzsKKwkJCWN0eC0+aW52YWxpZF9iaXRtYXBzKys7CisJCX0KKwkJaWYgKChnZC0+YmdfaW5vZGVfYml0bWFwIDwgZmlyc3RfYmxvY2spIHx8CisJCSAgICAoZ2QtPmJnX2lub2RlX2JpdG1hcCA+PSBsYXN0X2Jsb2NrKSkgeworCQkJcGN0eC5ibGsgPSBnZC0+YmdfaW5vZGVfYml0bWFwOworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9JQl9OT1RfR1JPVVAsICZwY3R4KSkKKwkJCQlnZC0+YmdfaW5vZGVfYml0bWFwID0gMDsKKwkJfQorCQlpZiAoZ2QtPmJnX2lub2RlX2JpdG1hcCA9PSAwKSB7CisJCQljdHgtPmludmFsaWRfaW5vZGVfYml0bWFwX2ZsYWdbaV0rKzsKKwkJCWN0eC0+aW52YWxpZF9iaXRtYXBzKys7CisJCX0KKwkJaWYgKChnZC0+YmdfaW5vZGVfdGFibGUgPCBmaXJzdF9ibG9jaykgfHwKKwkJICAgICgoZ2QtPmJnX2lub2RlX3RhYmxlICsKKwkJICAgICAgZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXAgLSAxKSA+PSBsYXN0X2Jsb2NrKSkgeworCQkJcGN0eC5ibGsgPSBnZC0+YmdfaW5vZGVfdGFibGU7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8wX0lUQUJMRV9OT1RfR1JPVVAsICZwY3R4KSkKKwkJCQlnZC0+YmdfaW5vZGVfdGFibGUgPSAwOworCQl9CisJCWlmIChnZC0+YmdfaW5vZGVfdGFibGUgPT0gMCkgeworCQkJY3R4LT5pbnZhbGlkX2lub2RlX3RhYmxlX2ZsYWdbaV0rKzsKKwkJCWN0eC0+aW52YWxpZF9iaXRtYXBzKys7CisJCX0KKwkJZnJlZV9ibG9ja3MgKz0gZ2QtPmJnX2ZyZWVfYmxvY2tzX2NvdW50OworCQlmcmVlX2lub2RlcyArPSBnZC0+YmdfZnJlZV9pbm9kZXNfY291bnQ7CisJCWZpcnN0X2Jsb2NrICs9IHNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCWxhc3RfYmxvY2sgKz0gc2ItPnNfYmxvY2tzX3Blcl9ncm91cDsKKworCQlpZiAoKGdkLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA+IHNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXApIHx8CisJCSAgICAoZ2QtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID4gc2ItPnNfaW5vZGVzX3Blcl9ncm91cCkgfHwKKwkJICAgIChnZC0+YmdfdXNlZF9kaXJzX2NvdW50ID4gc2ItPnNfaW5vZGVzX3Blcl9ncm91cCkpCisJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgZ2xvYmFsIGNvdW50cyBmcm9tIHRoZSBibG9jayBncm91cCBjb3VudHMuICBUaGlzCisJICogaXMgbmVlZGVkIGZvciBhbiBleHBlcmltZW50YWwgcGF0Y2ggd2hpY2ggZWxpbWluYXRlcworCSAqIGxvY2tpbmcgdGhlIGVudGlyZSBmaWxlc3lzdGVtIHdoZW4gYWxsb2NhdGluZyBibG9ja3Mgb3IKKwkgKiBpbm9kZXM7IGlmIHRoZSBmaWxlc3lzdGVtIGlzIG5vdCB1bm1vdW50ZWQgY2xlYW5seSwgdGhlCisJICogZ2xvYmFsIGNvdW50cyBtYXkgbm90IGJlIGFjY3VyYXRlLgorCSAqLworCWlmICgoZnJlZV9ibG9ja3MgIT0gc2ItPnNfZnJlZV9ibG9ja3NfY291bnQpIHx8CisJICAgIChmcmVlX2lub2RlcyAhPSBzYi0+c19mcmVlX2lub2Rlc19jb3VudCkpIHsKKwkJaWYgKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpCisJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwkJZWxzZSB7CisJCQlzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGZyZWVfYmxvY2tzOworCQkJc2ItPnNfZnJlZV9pbm9kZXNfY291bnQgPSBmcmVlX2lub2RlczsKKwkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJfQorCX0KKworCWlmICgoc2ItPnNfZnJlZV9ibG9ja3NfY291bnQgPiBzYi0+c19ibG9ja3NfY291bnQpIHx8CisJICAgIChzYi0+c19mcmVlX2lub2Rlc19jb3VudCA+IHNiLT5zX2lub2Rlc19jb3VudCkpCisJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCisKKwkvKgorCSAqIElmIHdlIGhhdmUgaW52YWxpZCBiaXRtYXBzLCBzZXQgdGhlIGVycm9yIHN0YXRlIG9mIHRoZQorCSAqIGZpbGVzeXN0ZW0uCisJICovCisJaWYgKGN0eC0+aW52YWxpZF9iaXRtYXBzICYmICEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkpIHsKKwkJc2ItPnNfc3RhdGUgJj0gfkVYVDJfVkFMSURfRlM7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwl9CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJLyoKKwkgKiBJZiB0aGUgVVVJRCBmaWVsZCBpc24ndCBhc3NpZ25lZCwgYXNzaWduIGl0LgorCSAqLworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpICYmIHV1aWRfaXNfbnVsbChzYi0+c191dWlkKSkgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8wX0FERF9VVUlELCAmcGN0eCkpIHsKKwkJCXV1aWRfZ2VuZXJhdGUoc2ItPnNfdXVpZCk7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCQlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19NQVNURVJfU0JfT05MWTsKKwkJfQorCX0KKworCS8qIEZJWE1FIC0gSFVSRCBzdXBwb3J0PworCSAqIEZvciB0aGUgSHVyZCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxldHlwZSBvcHRpb24gaXMgc2V0LAorCSAqIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKwkgKi8KKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSAmJgorCSAgICBmcy0+c3VwZXItPnNfY3JlYXRvcl9vcyA9PSBFWFQyX09TX0hVUkQgJiYKKwkgICAgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkgICAgIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9IVVJEX0NMRUFSX0ZJTEVUWVBFLCAmcGN0eCkpIHsKKwkJCWZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICY9CisJCQkJfkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRTsKKwkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJfQorCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBhbnkgb2YgdGhlIGNvbXBhdGliaWxpdHkgZmxhZ3Mgc2V0LCB3ZSBuZWVkIHRvIGhhdmUgYQorCSAqIHJldmlzaW9uIDEgZmlsZXN5c3RlbS4gIE1vc3Qga2VybmVscyB3aWxsIG5vdCBjaGVjayB0aGUgZmxhZ3Mgb24KKwkgKiBhIHJldiAwIGZpbGVzeXN0ZW0gYW5kIHdlIG1heSBoYXZlIGNvcnJ1cHRpb24gaXNzdWVzIGJlY2F1c2Ugb2YKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlIGZpbGVzeXN0ZW0uCisJICovCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgJiYKKwkgICAgZnMtPnN1cGVyLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFViAmJgorCSAgICAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0IHx8CisJICAgICBmcy0+c3VwZXItPnNfZmVhdHVyZV9yb19jb21wYXQgfHwKKwkgICAgIGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0KSAmJgorCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzBfRlNfUkVWX0xFVkVMLCAmcGN0eCkpIHsKKwkJZXh0MmZzX3VwZGF0ZV9keW5hbWljX3Jldihmcyk7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwl9CisKKwljaGVja19yZXNpemVfaW5vZGUoY3R4KTsKKworCS8qCisJICogQ2xlYW4gdXAgYW55IG9ycGhhbiBpbm9kZXMsIGlmIHByZXNlbnQuCisJICovCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgJiYgcmVsZWFzZV9vcnBoYW5faW5vZGVzKGN0eCkpIHsKKwkJZnMtPnN1cGVyLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJfQorCisJLyoKKwkgKiBNb3ZlIHRoZSBleHQzIGpvdXJuYWwgZmlsZSwgaWYgbmVjZXNzYXJ5LgorCSAqLworCWUyZnNja19tb3ZlX2V4dDNfam91cm5hbChjdHgpOworfQorCisvKgorICogc3dhcGZzLmMgLS0tIGJ5dGUtc3dhcCBhbiBleHQyIGZpbGVzeXN0ZW0KKyAqLworCisjaWZkZWYgRU5BQkxFX1NXQVBGUworCitzdHJ1Y3Qgc3dhcF9ibG9ja19zdHJ1Y3QgeworCWV4dDJfaW5vX3QgICAgICBpbm87CisJaW50ICAgICAgICAgICAgIGlzZGlyOworCWVycmNvZGVfdCAgICAgICBlcnJjb2RlOworCWNoYXIgICAgICAgICAgICAqZGlyX2J1ZjsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGU7Cit9OworCisvKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgYmxvY2tfaXRlcmF0ZS4gIFdlIG1hcmsgYWxsIG9mIHRoZQorICogaW5kaXJlY3QgYW5kIGRpcmVjdCBibG9ja3MgYXMgY2hhbmdlZCwgc28gdGhhdCBibG9ja19pdGVyYXRlIHdpbGwKKyAqIHdyaXRlIHRoZW0gb3V0LgorICovCitzdGF0aWMgaW50IHN3YXBfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190ICpibG9ja19uciwgaW50IGJsb2NrY250LAorCQkgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKworCXN0cnVjdCBzd2FwX2Jsb2NrX3N0cnVjdCAqc2IgPSAoc3RydWN0IHN3YXBfYmxvY2tfc3RydWN0ICopIHByaXZfZGF0YTsKKworCWlmIChzYi0+aXNkaXIgJiYgKGJsb2NrY250ID49IDApICYmICpibG9ja19ucikgeworCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9kaXJfYmxvY2soZnMsICpibG9ja19uciwgc2ItPmRpcl9idWYpOworCQlpZiAocmV0dmFsKSB7CisJCQlzYi0+ZXJyY29kZSA9IHJldHZhbDsKKwkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJfQorCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGZzLCAqYmxvY2tfbnIsIHNiLT5kaXJfYnVmKTsKKwkJaWYgKHJldHZhbCkgeworCQkJc2ItPmVycmNvZGUgPSByZXR2YWw7CisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwl9CisJaWYgKGJsb2NrY250ID49IDApIHsKKwkJaWYgKGJsb2NrY250IDwgRVhUMl9ORElSX0JMT0NLUykKKwkJCXJldHVybiAwOworCQlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKKwl9CisJaWYgKGJsb2NrY250ID09IEJMT0NLX0NPVU5UX0lORCkgeworCQlpZiAoKmJsb2NrX25yID09IHNiLT5pbm9kZS0+aV9ibG9ja1tFWFQyX0lORF9CTE9DS10pCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIEJMT0NLX0NIQU5HRUQ7CisJfQorCWlmIChibG9ja2NudCA9PSBCTE9DS19DT1VOVF9ESU5EKSB7CisJCWlmICgqYmxvY2tfbnIgPT0gc2ItPmlub2RlLT5pX2Jsb2NrW0VYVDJfRElORF9CTE9DS10pCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIEJMT0NLX0NIQU5HRUQ7CisJfQorCWlmIChibG9ja2NudCA9PSBCTE9DS19DT1VOVF9USU5EKSB7CisJCWlmICgqYmxvY2tfbnIgPT0gc2ItPmlub2RlLT5pX2Jsb2NrW0VYVDJfVElORF9CTE9DS10pCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIEJMT0NLX0NIQU5HRUQ7CisJfQorCXJldHVybiBCTE9DS19DSEFOR0VEOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYnl0ZS1zd2FwcGluZyBhbGwgb2YgdGhlIGluZGlyZWN0LAorICogYmxvY2sgcG9pbnRlcnMuICBJdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBieXRlLXN3YXBwaW5nIGRpcmVjdG9yaWVzLgorICovCitzdGF0aWMgdm9pZCBzd2FwX2lub2RlX2Jsb2NrcyhlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vLCBjaGFyICpibG9ja19idWYsCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpCit7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgICAgICAgICByZXR2YWw7CisJc3RydWN0IHN3YXBfYmxvY2tfc3RydWN0ICAgICAgICBzYjsKKworCXNiLmlubyA9IGlubzsKKwlzYi5pbm9kZSA9IGlub2RlOworCXNiLmRpcl9idWYgPSBibG9ja19idWYgKyBjdHgtPmZzLT5ibG9ja3NpemUqMzsKKwlzYi5lcnJjb2RlID0gMDsKKwlzYi5pc2RpciA9IDA7CisJaWYgKExJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXNiLmlzZGlyID0gMTsKKworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlKGN0eC0+ZnMsIGlubywgMCwgYmxvY2tfYnVmLAorCQkJCSAgICAgIHN3YXBfYmxvY2ssICZzYik7CisJaWYgKHJldHZhbCkgeworCQliYl9lcnJvcl9tc2coXygid2hpbGUgY2FsbGluZyBleHQyZnNfYmxvY2tfaXRlcmF0ZSIpKTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlpZiAoc2IuZXJyY29kZSkgeworCQliYl9lcnJvcl9tc2coXygid2hpbGUgY2FsbGluZyBpdGVyYXRvciBmdW5jdGlvbiIpKTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgc3dhcF9pbm9kZXMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlkZ3JwX3QgICAgICAgICAgICAgICAgICBncm91cDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpOworCWV4dDJfaW5vX3QgICAgICAgICAgICAgIGlubyA9IDE7CisJY2hhciAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmJsb2NrX2J1ZjsKKwllcnJjb2RlX3QgICAgICAgICAgICAgICByZXR2YWw7CisJc3RydWN0IGV4dDJfaW5vZGUgKiAgICAgaW5vZGU7CisKKwllMmZzY2tfdXNlX2lub2RlX3Nob3J0Y3V0cyhjdHgsIDEpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSAqIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwLAorCQkJCSZidWYpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIGFsbG9jYXRpbmcgaW5vZGUgYnVmZmVyIikpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCWJsb2NrX2J1ZiA9IChjaGFyICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCBmcy0+YmxvY2tzaXplICogNCwKKwkJCQkJCSAgICAiYmxvY2sgaW50ZXJhdGUgYnVmZmVyIik7CisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGdyb3VwKyspIHsKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sCisJCSAgICAgIGZzLT5ncm91cF9kZXNjW2dyb3VwXS5iZ19pbm9kZV90YWJsZSwKKwkJICAgICAgZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXAsIGJ1Zik7CisJCWlmIChyZXR2YWwpIHsKKwkJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSByZWFkaW5nIGlub2RlIHRhYmxlIChncm91cCAlZCkiKSwKKwkJCQlncm91cCk7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJcmV0dXJuOworCQl9CisJCWlub2RlID0gKHN0cnVjdCBleHQyX2lub2RlICopIGJ1ZjsKKwkJZm9yIChpPTA7IGkgPCBmcy0+c3VwZXItPnNfaW5vZGVzX3Blcl9ncm91cDsKKwkJICAgICBpKyssIGlubysrLCBpbm9kZSsrKSB7CisJCQljdHgtPnN0YXNoZWRfaW5vID0gaW5vOworCQkJY3R4LT5zdGFzaGVkX2lub2RlID0gaW5vZGU7CisKKwkJCWlmIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKQorCQkJCWV4dDJmc19zd2FwX2lub2RlKGZzLCBpbm9kZSwgaW5vZGUsIDApOworCisJCQkvKgorCQkJICogU2tpcCBkZWxldGVkIGZpbGVzLgorCQkJICovCisJCQlpZiAoaW5vZGUtPmlfbGlua3NfY291bnQgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKExJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwKKwkJCSAgICAoKGlub2RlLT5pX2Jsb2NrW0VYVDJfSU5EX0JMT0NLXSB8fAorCQkJICAgICAgaW5vZGUtPmlfYmxvY2tbRVhUMl9ESU5EX0JMT0NLXSB8fAorCQkJICAgICAgaW5vZGUtPmlfYmxvY2tbRVhUMl9USU5EX0JMT0NLXSkgJiYKKwkJCSAgICAgZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3MoaW5vZGUpKSkKKwkJCQlzd2FwX2lub2RlX2Jsb2NrcyhjdHgsIGlubywgYmxvY2tfYnVmLCBpbm9kZSk7CisKKwkJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCQkJcmV0dXJuOworCisJCQlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpCisJCQkJZXh0MmZzX3N3YXBfaW5vZGUoZnMsIGlub2RlLCBpbm9kZSwgMSk7CisJCX0KKwkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLAorCQkgICAgICBmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfaW5vZGVfdGFibGUsCisJCSAgICAgIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwLCBidWYpOworCQlpZiAocmV0dmFsKSB7CisJCQliYl9lcnJvcl9tc2coXygid2hpbGUgd3JpdGluZyBpbm9kZSB0YWJsZSAoZ3JvdXAgJWQpIiksCisJCQkJZ3JvdXApOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisJZXh0MmZzX2ZyZWVfbWVtKCZibG9ja19idWYpOworCWUyZnNja191c2VfaW5vZGVfc2hvcnRjdXRzKGN0eCwgMCk7CisJZXh0MmZzX2ZsdXNoX2ljYWNoZShmcyk7Cit9CisKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiBCQl9CSUdfRU5ESUFOCisvKgorICogT24gdGhlIFBvd2VyUEMsIHRoZSBiaWctZW5kaWFuIHZhcmlhbnQgb2YgdGhlIGV4dDIgZmlsZXN5c3RlbQorICogaGFzIGl0cyBiaXRtYXBzIHN0b3JlZCBhcyAzMi1iaXQgd29yZHMgd2l0aCBiaXQgMCBhcyB0aGUgTFNCCisgKiBvZiBlYWNoIHdvcmQuICBUaHVzIGEgYml0bWFwIHdpdGggb25seSBiaXQgMCBzZXQgd291bGQgYmUsIGFzCisgKiBhIHN0cmluZyBvZiBieXRlcywgMDAgMDAgMDAgMDEgMDAgLi4uCisgKiBUbyBjb3BlIHdpdGggdGhpcywgd2UgYnl0ZS1yZXZlcnNlIGVhY2ggd29yZCBvZiBhIGJpdG1hcCBpZgorICogd2UgaGF2ZSBhIGJpZy1lbmRpYW4gZmlsZXN5c3RlbSwgdGhhdCBpcywgaWYgd2UgYXJlICpub3QqCisgKiBieXRlLXN3YXBwaW5nIG90aGVyIHdvcmQtc2l6ZWQgbnVtYmVycy4KKyAqLworI2RlZmluZSBFWFQyX0JJR19FTkRJQU5fQklUTUFQUworI2VuZGlmCisKKyNpZmRlZiBFWFQyX0JJR19FTkRJQU5fQklUTUFQUworc3RhdGljIHZvaWQgZXh0MmZzX3N3YXBfYml0bWFwKGV4dDJmc19nZW5lcmljX2JpdG1hcCBibWFwKQoreworCV9fdTMyICpwID0gKF9fdTMyICopIGJtYXAtPmJpdG1hcDsKKwlpbnQgbiwgbmJ5dGVzID0gKGJtYXAtPmVuZCAtIGJtYXAtPnN0YXJ0ICsgNykgLyA4OworCisJZm9yIChuID0gbmJ5dGVzIC8gc2l6ZW9mKF9fdTMyKTsgbiA+IDA7IC0tbiwgKytwKQorCQkqcCA9IGV4dDJmc19zd2FiMzIoKnApOworfQorI2VuZGlmCisKKworI2lmZGVmIEVOQUJMRV9TV0FQRlMKK3N0YXRpYyB2b2lkIHN3YXBfZmlsZXN5cyhlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQlwcmludGYoXygiUGFzcyAwOiBEb2luZyBieXRlLXN3YXAgb2YgZmlsZXN5c3RlbVxuIikpOworCisJLyogQnl0ZSBzd2FwICovCisKKwlpZiAoZnMtPnN1cGVyLT5zX21udF9jb3VudCkgeworCQlmcHJpbnRmKHN0ZGVyciwgXygiJXM6IHRoZSBmaWxlc3lzdGVtIG11c3QgYmUgZnJlc2hseSAiCisJCQkiY2hlY2tlZCB1c2luZyBmc2NrXG4iCisJCQkiYW5kIG5vdCBtb3VudGVkIGJlZm9yZSB0cnlpbmcgdG8gIgorCQkJImJ5dGUtc3dhcCBpdC5cbiIpLCBjdHgtPmRldmljZV9uYW1lKTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHsKKwkJZnMtPmZsYWdzICY9IH4oRVhUMl9GTEFHX1NXQVBfQllURVN8CisJCQkgICAgICAgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpOworCQlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRDsKKwl9IGVsc2UgeworCQlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQ7CisJCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURTsKKwl9CisJc3dhcF9pbm9kZXMoY3R4KTsKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQlyZXR1cm47CisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTX1dSSVRFKQorCQlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX1NXQVBfQllURVM7CisJZnMtPmZsYWdzICY9IH4oRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRHwKKwkJICAgICAgIEVYVDJfRkxBR19TV0FQX0JZVEVTX1dSSVRFKTsKKworI2lmZGVmIEVYVDJfQklHX0VORElBTl9CSVRNQVBTCisJZTJmc2NrX3JlYWRfYml0bWFwcyhjdHgpOworCWV4dDJmc19zd2FwX2JpdG1hcChmcy0+aW5vZGVfbWFwKTsKKwlleHQyZnNfc3dhcF9iaXRtYXAoZnMtPmJsb2NrX21hcCk7CisJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19CQl9ESVJUWSB8IEVYVDJfRkxBR19JQl9ESVJUWTsKKyNlbmRpZgorCWZzLT5mbGFncyAmPSB+RVhUMl9GTEFHX01BU1RFUl9TQl9PTkxZOworCWV4dDJmc19mbHVzaChmcyk7CisJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19NQVNURVJfU0JfT05MWTsKK30KKyNlbmRpZiAgLyogRU5BQkxFX1NXQVBGUyAqLworCisjZW5kaWYKKworLyoKKyAqIHV0aWwuYyAtLS0gbWlzY2VsbGFuZW91cyB1dGlsaXRpZXMKKyAqLworCisKK3ZvaWQgKmUyZnNja19hbGxvY2F0ZV9tZW1vcnkoZTJmc2NrX3QgY3R4LCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCSAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCit7CisJdm9pZCAqcmV0OworCWNoYXIgYnVmWzI1Nl07CisKKwlyZXQgPSB4emFsbG9jKHNpemUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjaGFyICpzdHJpbmdfY29weShjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJY2hhciAgICAqcmV0OworCisJaWYgKCFzdHIpCisJCXJldHVybiBOVUxMOworCWlmICghbGVuKQorCQlsZW4gPSBzdHJsZW4oc3RyKTsKKwlyZXQgPSB4bWFsbG9jKGxlbisxKTsKKwlzdHJuY3B5KHJldCwgc3RyLCBsZW4pOworCXJldFtsZW5dID0gMDsKKwlyZXR1cm4gcmV0OworfQorCisjaWZuZGVmIEhBVkVfQ09OSU9fSAorc3RhdGljIGludCByZWFkX2FfY2hhcih2b2lkKQoreworCWNoYXIgICAgYzsKKwlpbnQgICAgIHI7CisJaW50ICAgICBmYWlsID0gMDsKKworCXdoaWxlICgxKSB7CisJCWlmIChlMmZzY2tfZ2xvYmFsX2N0eCAmJgorCQkgICAgKGUyZnNja19nbG9iYWxfY3R4LT5mbGFncyAmIEUyRl9GTEFHX0NBTkNFTCkpIHsKKwkJCXJldHVybiAzOworCQl9CisJCXIgPSByZWFkKDAsICZjLCAxKTsKKwkJaWYgKHIgPT0gMSkKKwkJCXJldHVybiBjOworCQlpZiAoZmFpbCsrID4gMTAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBFT0Y7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhc2tfeW4oY29uc3QgY2hhciAqIHN0cmluZywgaW50IGRlZikKK3sKKwlpbnQgICAgICAgICAgICAgYzsKKwljb25zdCBjaGFyICAgICAgKmRlZnN0cjsKKwlzdGF0aWMgY29uc3QgY2hhciBzaG9ydF95ZXNbXSA9ICJ5WSI7CisJc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRfbm9bXSA9ICJuTiI7CisKKyNpZmRlZiBIQVZFX1RFUk1JT1NfSAorCXN0cnVjdCB0ZXJtaW9zICB0ZXJtaW9zLCB0bXA7CisKKwl0Y2dldGF0dHIgKDAsICZ0ZXJtaW9zKTsKKwl0bXAgPSB0ZXJtaW9zOworCXRtcC5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CisJdG1wLmNfY2NbVk1JTl0gPSAxOworCXRtcC5jX2NjW1ZUSU1FXSA9IDA7CisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnRtcCk7CisjZW5kaWYKKworCWlmIChkZWYgPT0gMSkKKwkJZGVmc3RyID0gIjx5PiI7CisJZWxzZSBpZiAoZGVmID09IDApCisJCWRlZnN0ciA9ICI8bj4iOworCWVsc2UKKwkJZGVmc3RyID0gIiAoeS9uKSI7CisJcHJpbnRmKCIlcyVzPyAiLCBzdHJpbmcsIGRlZnN0cik7CisJd2hpbGUgKDEpIHsKKwkJZmZsdXNoIChzdGRvdXQpOworCQlpZiAoKGMgPSByZWFkX2FfY2hhcigpKSA9PSBFT0YpCisJCQlicmVhazsKKwkJaWYgKGMgPT0gMykgeworI2lmZGVmIEhBVkVfVEVSTUlPU19ICisJCQl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmdGVybWlvcyk7CisjZW5kaWYKKwkJCWlmIChlMmZzY2tfZ2xvYmFsX2N0eCAmJgorCQkJICAgIGUyZnNja19nbG9iYWxfY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NFVEpNUF9PSykgeworCQkJCXB1dHMoIlxuIik7CisJCQkJbG9uZ2ptcChlMmZzY2tfZ2xvYmFsX2N0eC0+YWJvcnRfbG9jLCAxKTsKKwkJCX0KKwkJCXB1dHMoXygiY2FuY2VsbGVkIVxuIikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHN0cmNocihzaG9ydF95ZXMsIChjaGFyKSBjKSkgeworCQkJZGVmID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKHN0cmNocihzaG9ydF9ubywgKGNoYXIpIGMpKSB7CisJCQlkZWYgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoKGMgPT0gJyAnIHx8IGMgPT0gJ1xuJykgJiYgKGRlZiAhPSAtMSkpCisJCQlicmVhazsKKwl9CisJaWYgKGRlZikKKwkJcHV0cygieWVzXG4iKTsKKwllbHNlCisJCXB1dHMgKCJub1xuIik7CisjaWZkZWYgSEFWRV9URVJNSU9TX0gKKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmdGVybWlvcyk7CisjZW5kaWYKKwlyZXR1cm4gZGVmOworfQorCitpbnQgYXNrIChlMmZzY2tfdCBjdHgsIGNvbnN0IGNoYXIgKiBzdHJpbmcsIGludCBkZWYpCit7CisJaWYgKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfTk8pIHsKKwkJcHJpbnRmKF8oIiVzPyBub1xuXG4iKSwgc3RyaW5nKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1lFUykgeworCQlwcmludGYoXygiJXM/IHllc1xuXG4iKSwgc3RyaW5nKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSB7CisJCXByaW50ZigiJXM/ICVzXG5cbiIsIHN0cmluZywgZGVmID8gXygieWVzIikgOiBfKCJubyIpKTsKKwkJcmV0dXJuIGRlZjsKKwl9CisJcmV0dXJuIGFza195bihzdHJpbmcsIGRlZik7Cit9CisKK3ZvaWQgZTJmc2NrX3JlYWRfYml0bWFwcyhlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisKKwlpZiAoY3R4LT5pbnZhbGlkX2JpdG1hcHMpIHsKKwkJYmJfZXJyb3JfbXNnKF8oImUyZnNja19yZWFkX2JpdG1hcHM6IGlsbGVnYWwgYml0bWFwIGJsb2NrKHMpIGZvciAlcyIpLAorCQkJY3R4LT5kZXZpY2VfbmFtZSk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCX0KKworCWVoYW5kbGVyX29wZXJhdGlvbihfKCJyZWFkaW5nIGlub2RlIGFuZCBibG9jayBiaXRtYXBzIikpOworCXJldHZhbCA9IGV4dDJmc19yZWFkX2JpdG1hcHMoZnMpOworCWVoYW5kbGVyX29wZXJhdGlvbigwKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSByZXRyeWluZyB0byByZWFkIGJpdG1hcHMgZm9yICVzIiksCisJCQljdHgtPmRldmljZV9uYW1lKTsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlMmZzY2tfd3JpdGVfYml0bWFwcyhlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisKKwlpZiAoZXh0MmZzX3Rlc3RfYmJfZGlydHkoZnMpKSB7CisJCWVoYW5kbGVyX29wZXJhdGlvbihfKCJ3cml0aW5nIGJsb2NrIGJpdG1hcHMiKSk7CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9ibG9ja19iaXRtYXAoZnMpOworCQllaGFuZGxlcl9vcGVyYXRpb24oMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSByZXRyeWluZyB0byB3cml0ZSBibG9jayBiaXRtYXBzIGZvciAlcyIpLAorCQkJCWN0eC0+ZGV2aWNlX25hbWUpOworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJCX0KKwl9CisKKwlpZiAoZXh0MmZzX3Rlc3RfaWJfZGlydHkoZnMpKSB7CisJCWVoYW5kbGVyX29wZXJhdGlvbihfKCJ3cml0aW5nIGlub2RlIGJpdG1hcHMiKSk7CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZV9iaXRtYXAoZnMpOworCQllaGFuZGxlcl9vcGVyYXRpb24oMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSByZXRyeWluZyB0byB3cml0ZSBpbm9kZSBiaXRtYXBzIGZvciAlcyIpLAorCQkJCWN0eC0+ZGV2aWNlX25hbWUpOworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgcHJlZW5oYWx0KGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJcmV0dXJuOworCWZwcmludGYoc3RkZXJyLCBfKCJcblxuJXM6IFVORVhQRUNURUQgSU5DT05TSVNURU5DWTsgIgorCQkiUlVOIGZzY2sgTUFOVUFMTFkuXG5cdChpLmUuLCB3aXRob3V0IC1hIG9yIC1wIG9wdGlvbnMpXG4iKSwKKwkgICAgICAgY3R4LT5kZXZpY2VfbmFtZSk7CisJaWYgKGZzICE9IE5VTEwpIHsKKwkJZnMtPnN1cGVyLT5zX3N0YXRlIHw9IEVYVDJfRVJST1JfRlM7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJZXh0MmZzX2Nsb3NlKGZzKTsKKwl9CisJZXhpdChFWElUX1VOQ09SUkVDVEVEKTsKK30KKwordm9pZCBlMmZzY2tfcmVhZF9pbm9kZShlMmZzY2tfdCBjdHgsIHVuc2lnbmVkIGxvbmcgaW5vLAorCQkJICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqcHJvYykKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoY3R4LT5mcywgaW5vLCBpbm9kZSk7CisJaWYgKHJldHZhbCkgeworCQliYl9lcnJvcl9tc2coXygid2hpbGUgcmVhZGluZyBpbm9kZSAlbGQgaW4gJXMiKSwgaW5vLCBwcm9jKTsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJfQorfQorCitleHRlcm4gdm9pZCBlMmZzY2tfd3JpdGVfaW5vZGVfZnVsbChlMmZzY2tfdCBjdHgsIHVuc2lnbmVkIGxvbmcgaW5vLAorCQkJICAgICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUsIGludCBidWZzaXplLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb2MpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZV9mdWxsKGN0eC0+ZnMsIGlubywgaW5vZGUsIGJ1ZnNpemUpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHdyaXRpbmcgaW5vZGUgJWxkIGluICVzIiksIGlubywgcHJvYyk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCX0KK30KKworZXh0ZXJuIHZvaWQgZTJmc2NrX3dyaXRlX2lub2RlKGUyZnNja190IGN0eCwgdW5zaWduZWQgbG9uZyBpbm8sCisJCQkgICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqcHJvYykKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2lub2RlKGN0eC0+ZnMsIGlubywgaW5vZGUpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHdyaXRpbmcgaW5vZGUgJWxkIGluICVzIiksIGlubywgcHJvYyk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCX0KK30KKworYmxrX3QgZ2V0X2JhY2t1cF9zYihlMmZzY2tfdCBjdHgsIGV4dDJfZmlsc3lzIGZzLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICBpb19tYW5hZ2VyIG1hbmFnZXIpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiOworCWlvX2NoYW5uZWwgICAgICAgICAgICAgIGlvID0gTlVMTDsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAqYnVmID0gTlVMTDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBibG9ja3NpemU7CisJYmxrX3QgICAgICAgICAgICAgICAgICAgc3VwZXJibG9jaywgcmV0X3NiID0gODE5MzsKKworCWlmIChmcyAmJiBmcy0+c3VwZXIpIHsKKwkJcmV0X3NiID0gKGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwICsKKwkJCSAgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCQlpZiAoY3R4KSB7CisJCQljdHgtPnN1cGVyYmxvY2sgPSByZXRfc2I7CisJCQljdHgtPmJsb2Nrc2l6ZSA9IGZzLT5ibG9ja3NpemU7CisJCX0KKwkJcmV0dXJuIHJldF9zYjsKKwl9CisKKwlpZiAoY3R4KSB7CisJCWlmIChjdHgtPmJsb2Nrc2l6ZSkgeworCQkJcmV0X3NiID0gY3R4LT5ibG9ja3NpemUgKiA4OworCQkJaWYgKGN0eC0+YmxvY2tzaXplID09IDEwMjQpCisJCQkJcmV0X3NiKys7CisJCQljdHgtPnN1cGVyYmxvY2sgPSByZXRfc2I7CisJCQlyZXR1cm4gcmV0X3NiOworCQl9CisJCWN0eC0+c3VwZXJibG9jayA9IHJldF9zYjsKKwkJY3R4LT5ibG9ja3NpemUgPSAxMDI0OworCX0KKworCWlmICghbmFtZSB8fCAhbWFuYWdlcikKKwkJZ290byBjbGVhbnVwOworCisJaWYgKG1hbmFnZXItPm9wZW4obmFtZSwgMCwgJmlvKSAhPSAwKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoZXh0MmZzX2dldF9tZW0oU1VQRVJCTE9DS19TSVpFLCAmYnVmKSkKKwkJZ290byBjbGVhbnVwOworCXNiID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopIGJ1ZjsKKworCWZvciAoYmxvY2tzaXplID0gRVhUMl9NSU5fQkxPQ0tfU0laRTsKKwkgICAgIGJsb2Nrc2l6ZSA8PSBFWFQyX01BWF9CTE9DS19TSVpFOyBibG9ja3NpemUgKj0gMikgeworCQlzdXBlcmJsb2NrID0gYmxvY2tzaXplKjg7CisJCWlmIChibG9ja3NpemUgPT0gMTAyNCkKKwkJCXN1cGVyYmxvY2srKzsKKwkJaW9fY2hhbm5lbF9zZXRfYmxrc2l6ZShpbywgYmxvY2tzaXplKTsKKwkJaWYgKGlvX2NoYW5uZWxfcmVhZF9ibGsoaW8sIHN1cGVyYmxvY2ssCisJCQkJCS1TVVBFUkJMT0NLX1NJWkUsIGJ1ZikpCisJCQljb250aW51ZTsKKyNpZiBCQl9CSUdfRU5ESUFOCisJCWlmIChzYi0+c19tYWdpYyA9PSBleHQyZnNfc3dhYjE2KEVYVDJfU1VQRVJfTUFHSUMpKQorCQkJZXh0MmZzX3N3YXBfc3VwZXIoc2IpOworI2VuZGlmCisJCWlmIChzYi0+c19tYWdpYyA9PSBFWFQyX1NVUEVSX01BR0lDKSB7CisJCQlyZXRfc2IgPSBzdXBlcmJsb2NrOworCQkJaWYgKGN0eCkgeworCQkJCWN0eC0+c3VwZXJibG9jayA9IHN1cGVyYmxvY2s7CisJCQkJY3R4LT5ibG9ja3NpemUgPSBibG9ja3NpemU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworY2xlYW51cDoKKwlpZiAoaW8pCisJCWlvX2NoYW5uZWxfY2xvc2UoaW8pOworCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0X3NiOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgZTJmc2NrIHBhc3NlcyBhbmQgY2FsbHMgdGhlbSBhbGwsCisgKiByZXR1cm5pbmcgcmVzdGFydCwgYWJvcnQsIG9yIGNhbmNlbCBhcyBuZWNlc3NhcnkuLi4KKyAqLwordHlwZWRlZiB2b2lkICgqcGFzc190KShlMmZzY2tfdCBjdHgpOworCitzdGF0aWMgY29uc3QgcGFzc190IGUyZnNja19wYXNzZXNbXSA9IHsKKwllMmZzY2tfcGFzczEsIGUyZnNja19wYXNzMiwgZTJmc2NrX3Bhc3MzLCBlMmZzY2tfcGFzczQsCisJZTJmc2NrX3Bhc3M1LCAwIH07CisKKyNkZWZpbmUgRTJGX0ZMQUdfUlVOX1JFVFVSTiAgICAgKEUyRl9GTEFHX1NJR05BTF9NQVNLfEUyRl9GTEFHX1JFU1RBUlQpCisKK3N0YXRpYyBpbnQgZTJmc2NrX3J1bihlMmZzY2tfdCBjdHgpCit7CisJaW50ICAgICBpOworCXBhc3NfdCAgZTJmc2NrX3Bhc3M7CisKKwlpZiAoc2V0am1wKGN0eC0+YWJvcnRfbG9jKSkgeworCQljdHgtPmZsYWdzICY9IH5FMkZfRkxBR19TRVRKTVBfT0s7CisJCXJldHVybiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1JVTl9SRVRVUk4pOworCX0KKwljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX1NFVEpNUF9PSzsKKworCWZvciAoaT0wOyAoZTJmc2NrX3Bhc3MgPSBlMmZzY2tfcGFzc2VzW2ldKTsgaSsrKSB7CisJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfUlVOX1JFVFVSTikKKwkJCWJyZWFrOworCQllMmZzY2tfcGFzcyhjdHgpOworCQlpZiAoY3R4LT5wcm9ncmVzcykKKwkJCSh2b2lkKSAoY3R4LT5wcm9ncmVzcykoY3R4LCAwLCAwLCAwKTsKKwl9CisJY3R4LT5mbGFncyAmPSB+RTJGX0ZMQUdfU0VUSk1QX09LOworCisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19SVU5fUkVUVVJOKQorCQlyZXR1cm4gKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19SVU5fUkVUVVJOKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogdW5peC5jIC0gVGhlIHVuaXgtc3BlY2lmaWMgY29kZSBmb3IgZTJmc2NrCisgKi8KKworCisvKiBDb21tYW5kIGxpbmUgb3B0aW9ucyAqLworc3RhdGljIGludCBzd2FwZnM7CisjaWZkZWYgRU5BQkxFX1NXQVBGUworc3RhdGljIGludCBub3JtYWxpemVfc3dhcGZzOworI2VuZGlmCitzdGF0aWMgaW50IGNmbGFnOyAgICAgICAgICAgICAgIC8qIGNoZWNrIGRpc2sgKi8KK3N0YXRpYyBpbnQgc2hvd192ZXJzaW9uX29ubHk7CitzdGF0aWMgaW50IHZlcmJvc2U7CisKKyNkZWZpbmUgUF9FMihzaW5ndWxhciwgcGx1cmFsLCBuKSAgICAgICBuLCAoKG4pID09IDEgPyBzaW5ndWxhciA6IHBsdXJhbCkKKworc3RhdGljIHZvaWQgc2hvd19zdGF0cyhlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWludCBpbm9kZXMsIGlub2Rlc191c2VkLCBibG9ja3MsIGJsb2Nrc191c2VkOworCWludCBkaXJfbGlua3M7CisJaW50IG51bV9maWxlcywgbnVtX2xpbmtzOworCWludCBmcmFnX3BlcmNlbnQ7CisKKwlkaXJfbGlua3MgPSAyICogY3R4LT5mc19kaXJlY3RvcnlfY291bnQgLSAxOworCW51bV9maWxlcyA9IGN0eC0+ZnNfdG90YWxfY291bnQgLSBkaXJfbGlua3M7CisJbnVtX2xpbmtzID0gY3R4LT5mc19saW5rc19jb3VudCAtIGRpcl9saW5rczsKKwlpbm9kZXMgPSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50OworCWlub2Rlc191c2VkID0gKGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQgLQorCQkgICAgICAgZnMtPnN1cGVyLT5zX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwlibG9ja3MgPSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50OworCWJsb2Nrc191c2VkID0gKGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgLQorCQkgICAgICAgZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50KTsKKworCWZyYWdfcGVyY2VudCA9ICgxMDAwMCAqIGN0eC0+ZnNfZnJhZ21lbnRlZCkgLyBpbm9kZXNfdXNlZDsKKwlmcmFnX3BlcmNlbnQgPSAoZnJhZ19wZXJjZW50ICsgNSkgLyAxMDsKKworCWlmICghdmVyYm9zZSkgeworCQlwcmludGYoIiVzOiAlZC8lZCBmaWxlcyAoJTBkLiVkJSUgbm9uLWNvbnRpZ3VvdXMpLCAlZC8lZCBibG9ja3NcbiIsCisJCSAgICAgICBjdHgtPmRldmljZV9uYW1lLCBpbm9kZXNfdXNlZCwgaW5vZGVzLAorCQkgICAgICAgZnJhZ19wZXJjZW50IC8gMTAsIGZyYWdfcGVyY2VudCAlIDEwLAorCQkgICAgICAgYmxvY2tzX3VzZWQsIGJsb2Nrcyk7CisJCXJldHVybjsKKwl9CisJcHJpbnRmKCJcbiU4ZCBpbm9kZSVzIHVzZWQgKCVkJSUpXG4iLCBQX0UyKCIiLCAicyIsIGlub2Rlc191c2VkKSwKKwkJMTAwICogaW5vZGVzX3VzZWQgLyBpbm9kZXMpOworCXByaW50ZigiJThkIG5vbi1jb250aWd1b3VzIGlub2RlJXMgKCUwZC4lZCUlKVxuIiwKKwkJUF9FMigiIiwgInMiLCBjdHgtPmZzX2ZyYWdtZW50ZWQpLAorCQlmcmFnX3BlcmNlbnQgLyAxMCwgZnJhZ19wZXJjZW50ICUgMTApOworCXByaW50ZihfKCIgICAgICAgICAjIG9mIGlub2RlcyB3aXRoIGluZC9kaW5kL3RpbmQgYmxvY2tzOiAlZC8lZC8lZFxuIiksCisJCWN0eC0+ZnNfaW5kX2NvdW50LCBjdHgtPmZzX2RpbmRfY291bnQsIGN0eC0+ZnNfdGluZF9jb3VudCk7CisJcHJpbnRmKCIlOGQgYmxvY2slcyB1c2VkICglZCUlKVxuIiwgUF9FMigiIiwgInMiLCBibG9ja3NfdXNlZCksCisJCShpbnQpICgobG9uZyBsb25nKSAxMDAgKiBibG9ja3NfdXNlZCAvIGJsb2NrcykpOworCXByaW50ZigiJThkIGxhcmdlIGZpbGUlc1xuIiwgUF9FMigiIiwgInMiLCBjdHgtPmxhcmdlX2ZpbGVzKSk7CisJcHJpbnRmKCJcbiU4ZCByZWd1bGFyIGZpbGUlc1xuIiwgUF9FMigiIiwgInMiLCBjdHgtPmZzX3JlZ3VsYXJfY291bnQpKTsKKwlwcmludGYoIiU4ZCBkaXJlY3RvciVzXG4iLCBQX0UyKCJ5IiwgImllcyIsIGN0eC0+ZnNfZGlyZWN0b3J5X2NvdW50KSk7CisJcHJpbnRmKCIlOGQgY2hhcmFjdGVyIGRldmljZSBmaWxlJXNcbiIsIFBfRTIoIiIsICJzIiwgY3R4LT5mc19jaGFyZGV2X2NvdW50KSk7CisJcHJpbnRmKCIlOGQgYmxvY2sgZGV2aWNlIGZpbGUlc1xuIiwgUF9FMigiIiwgInMiLCBjdHgtPmZzX2Jsb2NrZGV2X2NvdW50KSk7CisJcHJpbnRmKCIlOGQgZmlmbyVzXG4iLCBQX0UyKCIiLCAicyIsIGN0eC0+ZnNfZmlmb19jb3VudCkpOworCXByaW50ZigiJThkIGxpbmslc1xuIiwgUF9FMigiIiwgInMiLCBjdHgtPmZzX2xpbmtzX2NvdW50IC0gZGlyX2xpbmtzKSk7CisJcHJpbnRmKCIlOGQgc3ltYm9saWMgbGluayVzIiwgUF9FMigiIiwgInMiLCBjdHgtPmZzX3N5bWxpbmtzX2NvdW50KSk7CisJcHJpbnRmKCIgKCVkIGZhc3Qgc3ltYm9saWMgbGluayVzKVxuIiwgUF9FMigiIiwgInMiLCBjdHgtPmZzX2Zhc3Rfc3ltbGlua3NfY291bnQpKTsKKwlwcmludGYoIiU4ZCBzb2NrZXQlcy0tLS0tLS0tXG5cbiIsIFBfRTIoIiIsICJzIiwgY3R4LT5mc19zb2NrZXRzX2NvdW50KSk7CisJcHJpbnRmKCIlOGQgZmlsZSVzXG4iLCBQX0UyKCIiLCAicyIsIGN0eC0+ZnNfdG90YWxfY291bnQgLSBkaXJfbGlua3MpKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfbW91bnQoZTJmc2NrX3QgY3R4KQoreworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJaW50ICAgICAgICAgICAgIGNvbnQ7CisKKwlyZXR2YWwgPSBleHQyZnNfY2hlY2tfaWZfbW91bnRlZChjdHgtPmZpbGVzeXN0ZW1fbmFtZSwKKwkJCQkJICZjdHgtPm1vdW50X2ZsYWdzKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSBkZXRlcm1pbmluZyB3aGV0aGVyICVzIGlzIG1vdW50ZWQiKSwKKwkJCWN0eC0+ZmlsZXN5c3RlbV9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgdGhlIGZpbGVzeXN0ZW0gaXNuJ3QgbW91bnRlZCwgb3IgaXQncyB0aGUgcm9vdCBmaWxlc3lzdGVtCisJICogYW5kIGl0J3MgbW91bnRlZCByZWFkLW9ubHksIHRoZW4gZXZlcnl0aGluZydzIGZpbmUuCisJICovCisJaWYgKCghKGN0eC0+bW91bnRfZmxhZ3MgJiBFWFQyX01GX01PVU5URUQpKSB8fAorCSAgICAoKGN0eC0+bW91bnRfZmxhZ3MgJiBFWFQyX01GX0lTUk9PVCkgJiYKKwkgICAgIChjdHgtPm1vdW50X2ZsYWdzICYgRVhUMl9NRl9SRUFET05MWSkpKQorCQlyZXR1cm47CisKKwlpZiAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgeworCQlwcmludGYoXygiV2FybmluZyEgICVzIGlzIG1vdW50ZWQuXG4iKSwgY3R4LT5maWxlc3lzdGVtX25hbWUpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKF8oIiVzIGlzIG1vdW50ZWQuICAiKSwgY3R4LT5maWxlc3lzdGVtX25hbWUpOworCWlmICghY3R4LT5pbnRlcmFjdGl2ZSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoXygiY2FuJ3QgY29udGludWUsIGFib3J0aW5nIikpOworCXByaW50ZihfKCJcblxuXDAwN1wwMDdcMDA3XDAwN1dBUk5JTkchISEgICIKKwkgICAgICAgIlJ1bm5pbmcgZTJmc2NrIG9uIGEgbW91bnRlZCBmaWxlc3lzdGVtIG1heSBjYXVzZVxuIgorCSAgICAgICAiU0VWRVJFIGZpbGVzeXN0ZW0gZGFtYWdlLlwwMDdcMDA3XDAwN1xuXG4iKSk7CisJY29udCA9IGFza195bihfKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWUiKSwgLTEpOworCWlmICghY29udCkgeworCQlwcmludGYoXygiY2hlY2sgYWJvcnRlZC5cbiIpKTsKKwkJZXhpdCgwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNfb25fYmF0dCh2b2lkKQoreworCUZJTEUgICAgKmY7CisJRElSICAgICAqZDsKKwljaGFyICAgIHRtcFs4MF0sIHRtcDJbODBdLCBmbmFtZVs4MF07CisJdW5zaWduZWQgaW50ICAgIGFjZmxhZzsKKwlzdHJ1Y3QgZGlyZW50KiAgZGU7CisKKwlmID0gZm9wZW5fZm9yX3JlYWQoIi9wcm9jL2FwbSIpOworCWlmIChmKSB7CisJCWlmIChmc2NhbmYoZiwgIiVzICVzICVzICV4IiwgdG1wLCB0bXAsIHRtcCwgJmFjZmxhZykgIT0gNCkKKwkJCWFjZmxhZyA9IDE7CisJCWZjbG9zZShmKTsKKwkJcmV0dXJuIChhY2ZsYWcgIT0gMSk7CisJfQorCWQgPSBvcGVuZGlyKCIvcHJvYy9hY3BpL2FjX2FkYXB0ZXIiKTsKKwlpZiAoZCkgeworCQl3aGlsZSAoKGRlPXJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKwkJCWlmICghc3RybmNtcCgiLiIsIGRlLT5kX25hbWUsIDEpKQorCQkJCWNvbnRpbnVlOworCQkJc25wcmludGYoZm5hbWUsIDgwLCAiL3Byb2MvYWNwaS9hY19hZGFwdGVyLyVzL3N0YXRlIiwKKwkJCQkgZGUtPmRfbmFtZSk7CisJCQlmID0gZm9wZW5fZm9yX3JlYWQoZm5hbWUpOworCQkJaWYgKCFmKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGZzY2FuZihmLCAiJXMgJXMiLCB0bXAyLCB0bXApICE9IDIpCisJCQkJdG1wWzBdID0gMDsKKwkJCWZjbG9zZShmKTsKKwkJCWlmIChzdHJuY21wKHRtcCwgIm9mZi1saW5lIiwgOCkgPT0gMCkgeworCQkJCWNsb3NlZGlyKGQpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCWNsb3NlZGlyKGQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgdG8gc2VlIGlmIGEgZmlsZXN5c3RlbSBjYW4gYmUgc2tpcHBlZDsgaWYgc28sCisgKiBpdCB3aWxsIGV4aXQgd2l0aCBFWElUX09LLiAgVW5kZXIgc29tZSBjb25kaXRpb25zIGl0IHdpbGwgcHJpbnQgYQorICogbWVzc2FnZSBleHBsYWluaW5nIHdoeSBhIGNoZWNrIGlzIGJlaW5nIGZvcmNlZC4KKyAqLworc3RhdGljIHZvaWQgY2hlY2tfaWZfc2tpcChlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWNvbnN0IGNoYXIgKnJlYXNvbiA9IE5VTEw7CisJdW5zaWduZWQgaW50IHJlYXNvbl9hcmcgPSAwOworCWxvbmcgbmV4dF9jaGVjazsKKwlpbnQgYmF0dCA9IGlzX29uX2JhdHQoKTsKKwl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKworCWlmICgoY3R4LT5vcHRpb25zICYgRTJGX09QVF9GT1JDRSkgfHwgY2ZsYWcgfHwgc3dhcGZzKQorCQlyZXR1cm47CisKKwlpZiAoKGZzLT5zdXBlci0+c19zdGF0ZSAmIEVYVDJfRVJST1JfRlMpIHx8CisJICAgICFleHQyZnNfdGVzdF92YWxpZChmcykpCisJCXJlYXNvbiA9IF8oIiBjb250YWlucyBhIGZpbGUgc3lzdGVtIHdpdGggZXJyb3JzIik7CisJZWxzZSBpZiAoKGZzLT5zdXBlci0+c19zdGF0ZSAmIEVYVDJfVkFMSURfRlMpID09IDApCisJCXJlYXNvbiA9IF8oIiB3YXMgbm90IGNsZWFubHkgdW5tb3VudGVkIik7CisJZWxzZSBpZiAoKGZzLT5zdXBlci0+c19tYXhfbW50X2NvdW50ID4gMCkgJiYKKwkJIChmcy0+c3VwZXItPnNfbW50X2NvdW50ID49CisJCSAgKHVuc2lnbmVkKSBmcy0+c3VwZXItPnNfbWF4X21udF9jb3VudCkpIHsKKwkJcmVhc29uID0gXygiIGhhcyBiZWVuIG1vdW50ZWQgJXUgdGltZXMgd2l0aG91dCBiZWluZyBjaGVja2VkIik7CisJCXJlYXNvbl9hcmcgPSBmcy0+c3VwZXItPnNfbW50X2NvdW50OworCQlpZiAoYmF0dCAmJiAoZnMtPnN1cGVyLT5zX21udF9jb3VudCA8CisJCQkgICAgICh1bnNpZ25lZCkgZnMtPnN1cGVyLT5zX21heF9tbnRfY291bnQqMikpCisJCQlyZWFzb24gPSAwOworCX0gZWxzZSBpZiAoZnMtPnN1cGVyLT5zX2NoZWNraW50ZXJ2YWwgJiYKKwkJICAgKChub3cgLSBmcy0+c3VwZXItPnNfbGFzdGNoZWNrKSA+PQorCQkgICAgZnMtPnN1cGVyLT5zX2NoZWNraW50ZXJ2YWwpKSB7CisJCXJlYXNvbiA9IF8oIiBoYXMgZ29uZSAldSBkYXlzIHdpdGhvdXQgYmVpbmcgY2hlY2tlZCIpOworCQlyZWFzb25fYXJnID0gKG5vdyAtIGZzLT5zdXBlci0+c19sYXN0Y2hlY2spLygzNjAwKjI0KTsKKwkJaWYgKGJhdHQgJiYgKChub3cgLSBmcy0+c3VwZXItPnNfbGFzdGNoZWNrKSA8CisJCQkgICAgIGZzLT5zdXBlci0+c19jaGVja2ludGVydmFsKjIpKQorCQkJcmVhc29uID0gMDsKKwl9CisJaWYgKHJlYXNvbikgeworCQlmcHV0cyhjdHgtPmRldmljZV9uYW1lLCBzdGRvdXQpOworCQlwcmludGYocmVhc29uLCByZWFzb25fYXJnKTsKKwkJZnB1dHMoXygiLCBjaGVjayBmb3JjZWQuXG4iKSwgc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKwlwcmludGYoXygiJXM6IGNsZWFuLCAlZC8lZCBmaWxlcywgJWQvJWQgYmxvY2tzIiksIGN0eC0+ZGV2aWNlX25hbWUsCisJICAgICAgIGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQgLSBmcy0+c3VwZXItPnNfZnJlZV9pbm9kZXNfY291bnQsCisJICAgICAgIGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQsCisJICAgICAgIGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgLSBmcy0+c3VwZXItPnNfZnJlZV9ibG9ja3NfY291bnQsCisJICAgICAgIGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpOworCW5leHRfY2hlY2sgPSAxMDAwMDA7CisJaWYgKGZzLT5zdXBlci0+c19tYXhfbW50X2NvdW50ID4gMCkgeworCQluZXh0X2NoZWNrID0gZnMtPnN1cGVyLT5zX21heF9tbnRfY291bnQgLSBmcy0+c3VwZXItPnNfbW50X2NvdW50OworCQlpZiAobmV4dF9jaGVjayA8PSAwKQorCQkJbmV4dF9jaGVjayA9IDE7CisJfQorCWlmIChmcy0+c3VwZXItPnNfY2hlY2tpbnRlcnZhbCAmJgorCSAgICAoKG5vdyAtIGZzLT5zdXBlci0+c19sYXN0Y2hlY2spID49IGZzLT5zdXBlci0+c19jaGVja2ludGVydmFsKSkKKwkJbmV4dF9jaGVjayA9IDE7CisJaWYgKG5leHRfY2hlY2sgPD0gNSkgeworCQlpZiAobmV4dF9jaGVjayA9PSAxKQorCQkJZnB1dHMoXygiIChjaGVjayBhZnRlciBuZXh0IG1vdW50KSIpLCBzdGRvdXQpOworCQllbHNlCisJCQlwcmludGYoXygiIChjaGVjayBpbiAlbGQgbW91bnRzKSIpLCBuZXh0X2NoZWNrKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKwlleHQyZnNfY2xvc2UoZnMpOworCWN0eC0+ZnMgPSBOVUxMOworCWUyZnNja19mcmVlX2NvbnRleHQoY3R4KTsKKwlleGl0KEVYSVRfT0spOworfQorCisvKgorICogRm9yIGNvbXBsZXRpb24gbm90aWNlCisgKi8KK3N0cnVjdCBwZXJjZW50X3RibCB7CisJaW50ICAgICBtYXhfcGFzczsKKwlpbnQgICAgIHRhYmxlWzMyXTsKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHBlcmNlbnRfdGJsIGUyZnNja190YmwgPSB7CisJNSwgeyAwLCA3MCwgOTAsIDkyLCAgOTUsIDEwMCB9Cit9OworCitzdGF0aWMgY2hhciBiYXJbMTI4XSwgc3BhY2VzWzEyOF07CisKK3N0YXRpYyBmbG9hdCBjYWxjX3BlcmNlbnQoY29uc3Qgc3RydWN0IHBlcmNlbnRfdGJsICp0YmwsIGludCBwYXNzLCBpbnQgY3VyciwKKwkJCSAgaW50IG1heCkKK3sKKwlmbG9hdCAgIHBlcmNlbnQ7CisKKwlpZiAocGFzcyA8PSAwKQorCQlyZXR1cm4gMC4wOworCWlmIChwYXNzID4gdGJsLT5tYXhfcGFzcyB8fCBtYXggPT0gMCkKKwkJcmV0dXJuIDEwMC4wOworCXBlcmNlbnQgPSAoKGZsb2F0KSBjdXJyKSAvICgoZmxvYXQpIG1heCk7CisJcmV0dXJuICgocGVyY2VudCAqICh0YmwtPnRhYmxlW3Bhc3NdIC0gdGJsLT50YWJsZVtwYXNzLTFdKSkKKwkJKyB0YmwtPnRhYmxlW3Bhc3MtMV0pOworfQorCit2b2lkIGUyZnNja19jbGVhcl9wcm9nYmFyKGUyZnNja190IGN0eCkKK3sKKwlpZiAoIShjdHgtPmZsYWdzICYgRTJGX0ZMQUdfUFJPR19CQVIpKQorCQlyZXR1cm47CisKKwlwcmludGYoIiVzJXNcciVzIiwgY3R4LT5zdGFydF9tZXRhLCBzcGFjZXMgKyAoc2l6ZW9mKHNwYWNlcykgLSA4MCksCisJICAgICAgIGN0eC0+c3RvcF9tZXRhKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwljdHgtPmZsYWdzICY9IH5FMkZfRkxBR19QUk9HX0JBUjsKK30KKworaW50IGUyZnNja19zaW1wbGVfcHJvZ3Jlc3MoZTJmc2NrX3QgY3R4LCBjb25zdCBjaGFyICpsYWJlbCwgZmxvYXQgcGVyY2VudCwKKwkJCSAgIHVuc2lnbmVkIGludCBkcHludW0pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc3Bpbm5lcltdID0gIlxcfC8tIjsKKwlpbnQgICAgIGk7CisJdW5zaWduZWQgaW50ICAgIHRpY2s7CisJc3RydWN0IHRpbWV2YWwgIHR2OworCWludCBkcHl3aWR0aDsKKwlpbnQgZml4ZWRfcGVyY2VudDsKKworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfUFJPR19TVVBQUkVTUykKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgbmV3IHByb2dyZXNzIHBvc2l0aW9uLiAgSWYgdGhlCisJICogcGVyY2VudGFnZSBoYXNuJ3QgY2hhbmdlZCwgdGhlbiB3ZSBza2lwIG91dCByaWdodAorCSAqIGF3YXkuCisJICovCisJZml4ZWRfcGVyY2VudCA9IChpbnQpICgoMTAgKiBwZXJjZW50KSArIDAuNSk7CisJaWYgKGN0eC0+cHJvZ3Jlc3NfbGFzdF9wZXJjZW50ID09IGZpeGVkX3BlcmNlbnQpCisJCXJldHVybiAwOworCWN0eC0+cHJvZ3Jlc3NfbGFzdF9wZXJjZW50ID0gZml4ZWRfcGVyY2VudDsKKworCS8qCisJICogSWYgd2UndmUgYWxyZWFkeSB1cGRhdGVkIHRoZSBzcGlubmVyIG9uY2Ugd2l0aGluCisJICogdGhlIGxhc3QgMS84dGggb2YgYSBzZWNvbmQsIG5vIHBvaW50IGRvaW5nIGl0CisJICogYWdhaW4uCisJICovCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJdGljayA9ICh0di50dl9zZWMgPDwgMykgKyAodHYudHZfdXNlYyAvICgxMDAwMDAwIC8gOCkpOworCWlmICgodGljayA9PSBjdHgtPnByb2dyZXNzX2xhc3RfdGltZSkgJiYKKwkgICAgKGZpeGVkX3BlcmNlbnQgIT0gMCkgJiYgKGZpeGVkX3BlcmNlbnQgIT0gMTAwMCkpCisJCXJldHVybiAwOworCWN0eC0+cHJvZ3Jlc3NfbGFzdF90aW1lID0gdGljazsKKworCS8qCisJICogQWR2YW5jZSB0aGUgc3Bpbm5lciwgYW5kIG5vdGUgdGhhdCB0aGUgcHJvZ3Jlc3MgYmFyCisJICogd2lsbCBiZSBvbiB0aGUgc2NyZWVuCisJICovCisJY3R4LT5wcm9ncmVzc19wb3MgPSAoY3R4LT5wcm9ncmVzc19wb3MrMSkgJiAzOworCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfUFJPR19CQVI7CisKKwlkcHl3aWR0aCA9IDY2IC0gc3RybGVuKGxhYmVsKTsKKwlkcHl3aWR0aCA9IDggKiAoZHB5d2lkdGggLyA4KTsKKwlpZiAoZHB5bnVtKQorCQlkcHl3aWR0aCAtPSA4OworCisJaSA9ICgocGVyY2VudCAqIGRweXdpZHRoKSArIDUwKSAvIDEwMDsKKwlwcmludGYoIiVzJXM6IHwlcyVzIiwgY3R4LT5zdGFydF9tZXRhLCBsYWJlbCwKKwkgICAgICAgYmFyICsgKHNpemVvZihiYXIpIC0gKGkrMSkpLAorCSAgICAgICBzcGFjZXMgKyAoc2l6ZW9mKHNwYWNlcykgLSAoZHB5d2lkdGggLSBpICsgMSkpKTsKKwlpZiAoZml4ZWRfcGVyY2VudCA9PSAxMDAwKQorCQliYl9wdXRjaGFyKCd8Jyk7CisJZWxzZQorCQliYl9wdXRjaGFyKHNwaW5uZXJbY3R4LT5wcm9ncmVzc19wb3MgJiAzXSk7CisJcHJpbnRmKCIgJTQuMWYlJSAgIiwgcGVyY2VudCk7CisJaWYgKGRweW51bSkKKwkJcHJpbnRmKCIldVxyIiwgZHB5bnVtKTsKKwllbHNlCisJCWZwdXRzKCIgXHIiLCBzdGRvdXQpOworCWZwdXRzKGN0eC0+c3RvcF9tZXRhLCBzdGRvdXQpOworCisJaWYgKGZpeGVkX3BlcmNlbnQgPT0gMTAwMCkKKwkJZTJmc2NrX2NsZWFyX3Byb2diYXIoY3R4KTsKKwlmZmx1c2goc3Rkb3V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGUyZnNja191cGRhdGVfcHJvZ3Jlc3MoZTJmc2NrX3QgY3R4LCBpbnQgcGFzcywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY3VyLCB1bnNpZ25lZCBsb25nIG1heCkKK3sKKwljaGFyIGJ1Zls4MF07CisJZmxvYXQgcGVyY2VudDsKKworCWlmIChwYXNzID09IDApCisJCXJldHVybiAwOworCisJaWYgKGN0eC0+cHJvZ3Jlc3NfZmQpIHsKKwkJc3ByaW50ZihidWYsICIlZCAlbHUgJWx1XG4iLCBwYXNzLCBjdXIsIG1heCk7CisJCXh3cml0ZV9zdHIoY3R4LT5wcm9ncmVzc19mZCwgYnVmKTsKKwl9IGVsc2UgeworCQlwZXJjZW50ID0gY2FsY19wZXJjZW50KCZlMmZzY2tfdGJsLCBwYXNzLCBjdXIsIG1heCk7CisJCWUyZnNja19zaW1wbGVfcHJvZ3Jlc3MoY3R4LCBjdHgtPmRldmljZV9uYW1lLAorCQkJCSAgICAgICBwZXJjZW50LCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2VydmVfc3RkaW9fZmRzKHZvaWQpCit7CisJaW50ICAgICBmZDsKKworCXdoaWxlICgxKSB7CisJCWZkID0gb3BlbihiYl9kZXZfbnVsbCwgT19SRFdSKTsKKwkJaWYgKGZkID4gMikKKwkJCWJyZWFrOworCQlpZiAoZmQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiRVJST1I6IENhbm5vdCBvcGVuICIKKwkJCQkiL2Rldi9udWxsICglcylcbiIpLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9wcm9ncmVzc19vbihpbnQgc2lnIEZTQ0tfQVRUUigodW51c2VkKSkpCit7CisJZTJmc2NrX3QgY3R4ID0gZTJmc2NrX2dsb2JhbF9jdHg7CisKKwlpZiAoIWN0eCkKKwkJcmV0dXJuOworCisJY3R4LT5wcm9ncmVzcyA9IGUyZnNja191cGRhdGVfcHJvZ3Jlc3M7CisJY3R4LT5wcm9ncmVzc19mZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9wcm9ncmVzc19vZmYoaW50IHNpZyBGU0NLX0FUVFIoKHVudXNlZCkpKQoreworCWUyZnNja190IGN0eCA9IGUyZnNja19nbG9iYWxfY3R4OworCisJaWYgKCFjdHgpCisJCXJldHVybjsKKworCWUyZnNja19jbGVhcl9wcm9nYmFyKGN0eCk7CisJY3R4LT5wcm9ncmVzcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9jYW5jZWwoaW50IHNpZyBGU0NLX0FUVFIoKHVudXNlZCkpKQoreworCWUyZnNja190IGN0eCA9IGUyZnNja19nbG9iYWxfY3R4OworCisJaWYgKCFjdHgpCisJCWV4aXQoRlNDS19DQU5DRUxFRCk7CisKKwljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0NBTkNFTDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfZXh0ZW5kZWRfb3B0cyhlMmZzY2tfdCBjdHgsIGNvbnN0IGNoYXIgKm9wdHMpCit7CisJY2hhciAgICAqYnVmLCAqdG9rZW4sICpuZXh0LCAqcCwgKmFyZzsKKwlpbnQgICAgIGVhX3ZlcjsKKwlpbnQgICAgIGV4dGVuZGVkX3VzYWdlID0gMDsKKworCWJ1ZiA9IHN0cmluZ19jb3B5KG9wdHMsIDApOworCWZvciAodG9rZW4gPSBidWY7IHRva2VuICYmICp0b2tlbjsgdG9rZW4gPSBuZXh0KSB7CisJCXAgPSBzdHJjaHIodG9rZW4sICcsJyk7CisJCW5leHQgPSAwOworCQlpZiAocCkgeworCQkJKnAgPSAwOworCQkJbmV4dCA9IHArMTsKKwkJfQorCQlhcmcgPSBzdHJjaHIodG9rZW4sICc9Jyk7CisJCWlmIChhcmcpIHsKKwkJCSphcmcgPSAwOworCQkJYXJnKys7CisJCX0KKwkJaWYgKHN0cmNtcCh0b2tlbiwgImVhX3ZlciIpID09IDApIHsKKwkJCWlmICghYXJnKSB7CisJCQkJZXh0ZW5kZWRfdXNhZ2UrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVhX3ZlciA9IHN0cnRvdWwoYXJnLCAmcCwgMCk7CisJCQlpZiAoKnAgfHwKKwkJCSAgICAoKGVhX3ZlciAhPSAxKSAmJiAoZWFfdmVyICE9IDIpKSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQlfKCJJbnZhbGlkIEVBIHZlcnNpb24uXG4iKSk7CisJCQkJZXh0ZW5kZWRfdXNhZ2UrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWN0eC0+ZXh0X2F0dHJfdmVyID0gZWFfdmVyOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIlVua25vd24gZXh0ZW5kZWQgb3B0aW9uOiAlc1xuIiksCisJCQkJdG9rZW4pOworCQkJZXh0ZW5kZWRfdXNhZ2UrKzsKKwkJfQorCX0KKwlpZiAoZXh0ZW5kZWRfdXNhZ2UpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkiRXh0ZW5kZWQgb3B0aW9ucyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcywgIgorCQkJImFuZCBtYXkgdGFrZSBhbiBhcmd1bWVudCB3aGljaFxuIgorCQkJImlzIHNldCBvZmYgYnkgYW4gZXF1YWxzICgnPScpIHNpZ24uICAiCisJCQkiVmFsaWQgZXh0ZW5kZWQgb3B0aW9ucyBhcmU6XG4iCisJCQkiXHRlYV92ZXI9PGVhX3ZlcnNpb24gKDEgb3IgMik+XG5cbiIpOworCX0KK30KKworCitzdGF0aWMgZXJyY29kZV90IFBSUyhpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGUyZnNja190ICpyZXRfY3R4KQoreworCWludCAgICAgICAgICAgICBmbHVzaCA9IDA7CisJaW50ICAgICAgICAgICAgIGMsIGZkOworCWUyZnNja190ICAgICAgICBjdHg7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uICAgICAgICBzYTsKKwljaGFyICAgICAgICAgICAgKmV4dGVuZGVkX29wdHMgPSBOVUxMOworCisJcmV0dmFsID0gZTJmc2NrX2FsbG9jYXRlX2NvbnRleHQoJmN0eCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCSpyZXRfY3R4ID0gY3R4OworCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgQlVGU0laKTsKKwlzZXR2YnVmKHN0ZGVyciwgTlVMTCwgX0lPTkJGLCBCVUZTSVopOworCWlmIChpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKSB7CisJCWN0eC0+aW50ZXJhY3RpdmUgPSAxOworCX0gZWxzZSB7CisJCWN0eC0+c3RhcnRfbWV0YVswXSA9ICdcMDAxJzsKKwkJY3R4LT5zdG9wX21ldGFbMF0gPSAnXDAwMic7CisJfQorCW1lbXNldChiYXIsICc9Jywgc2l6ZW9mKGJhciktMSk7CisJbWVtc2V0KHNwYWNlcywgJyAnLCBzaXplb2Yoc3BhY2VzKS0xKTsKKwlibGtpZF9nZXRfY2FjaGUoJmN0eC0+YmxraWQsIE5VTEwpOworCisJaWYgKGFyZ2MgJiYgKmFyZ3YpCisJCWN0eC0+cHJvZ3JhbV9uYW1lID0gKmFyZ3Y7CisJZWxzZQorCQljdHgtPnByb2dyYW1fbmFtZSA9ICJlMmZzY2siOworCXdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgInBhbnlyY0M6QjpkRTpmdnRGVk06YjpJOmo6UDpsOkw6TjpTc0RrIikpICE9IEVPRikKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ0MnOgorCQkJY3R4LT5wcm9ncmVzcyA9IGUyZnNja191cGRhdGVfcHJvZ3Jlc3M7CisJCQljdHgtPnByb2dyZXNzX2ZkID0gYXRvaShvcHRhcmcpOworCQkJaWYgKCFjdHgtPnByb2dyZXNzX2ZkKQorCQkJCWJyZWFrOworCQkJLyogVmFsaWRhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBhdm9pZCBkaXNhc3RlcnMgKi8KKwkJCWZkID0gZHVwKGN0eC0+cHJvZ3Jlc3NfZmQpOworCQkJaWYgKGZkIDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCV8oIkVycm9yIHZhbGlkYXRpbmcgZmlsZSBkZXNjcmlwdG9yICVkOiAlc1xuIiksCisJCQkJCWN0eC0+cHJvZ3Jlc3NfZmQsCisJCQkJCWVycm9yX21lc3NhZ2UoZXJybm8pKTsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShfKCJJbnZhbGlkIGNvbXBsZXRpb24gaW5mb3JtYXRpb24gZmlsZSBkZXNjcmlwdG9yIikpOworCQkJfSBlbHNlCisJCQkJY2xvc2UoZmQpOworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJY3R4LT5vcHRpb25zIHw9IEUyRl9PUFRfQ09NUFJFU1NfRElSUzsKKwkJCWJyZWFrOworCQljYXNlICdFJzoKKwkJCWV4dGVuZGVkX29wdHMgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCWNhc2UgJ2EnOgorCQkJaWYgKGN0eC0+b3B0aW9ucyAmIChFMkZfT1BUX1lFU3xFMkZfT1BUX05PKSkgeworCQkJY29uZmxpY3Rfb3B0OgorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKF8oIm9ubHkgb25lIHRoZSBvcHRpb25zIC1wLy1hLCAtbiBvciAteSBtYXkgYmUgc3BlY2lmaWVkIikpOworCQkJfQorCQkJY3R4LT5vcHRpb25zIHw9IEUyRl9PUFRfUFJFRU47CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlpZiAoY3R4LT5vcHRpb25zICYgKEUyRl9PUFRfWUVTfEUyRl9PUFRfUFJFRU4pKQorCQkJCWdvdG8gY29uZmxpY3Rfb3B0OworCQkJY3R4LT5vcHRpb25zIHw9IEUyRl9PUFRfTk87CisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlpZiAoY3R4LT5vcHRpb25zICYgKEUyRl9PUFRfUFJFRU58RTJGX09QVF9OTykpCisJCQkJZ290byBjb25mbGljdF9vcHQ7CisJCQljdHgtPm9wdGlvbnMgfD0gRTJGX09QVF9ZRVM7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQkvKiBGSVhNRSAtIFRoaXMgbmVlZHMgdG8gZ28gYXdheSBpbiBhIGZ1dHVyZSBwYXRoIC0gd2lsbCBjaGFuZ2UgYmluYXJ5ICovCisJCQlmcHJpbnRmKHN0ZGVyciwgXygiVGhlIC10IG9wdGlvbiBpcyBub3QgIgorCQkJCSJzdXBwb3J0ZWQgb24gdGhpcyB2ZXJzaW9uIG9mIGUyZnNjay5cbiIpKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWlmIChjZmxhZysrKQorCQkJCWN0eC0+b3B0aW9ucyB8PSBFMkZfT1BUX1dSSVRFQ0hFQ0s7CisJCQljdHgtPm9wdGlvbnMgfD0gRTJGX09QVF9DSEVDS0JMT0NLUzsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCS8qIFdoYXQgd2UgZG8gYnkgZGVmYXVsdCwgYW55d2F5ISAqLworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJY3R4LT51c2Vfc3VwZXJibG9jayA9IGF0b2kob3B0YXJnKTsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfU0JfU1BFQ0lGSUVEOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOgorCQkJY3R4LT5ibG9ja3NpemUgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnSSc6CisJCQljdHgtPmlub2RlX2J1ZmZlcl9ibG9ja3MgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnaic6CisJCQljdHgtPmpvdXJuYWxfbmFtZSA9IHN0cmluZ19jb3B5KG9wdGFyZywgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQljdHgtPnByb2Nlc3NfaW5vZGVfc2l6ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWN0eC0+b3B0aW9ucyB8PSBFMkZfT1BUX0RFQlVHOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJY3R4LT5vcHRpb25zIHw9IEUyRl9PUFRfRk9SQ0U7CisJCQlicmVhazsKKwkJY2FzZSAnRic6CisJCQlmbHVzaCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl2ZXJib3NlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXNob3dfdmVyc2lvbl9vbmx5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdOJzoKKwkJCWN0eC0+ZGV2aWNlX25hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKyNpZmRlZiBFTkFCTEVfU1dBUEZTCisJCWNhc2UgJ3MnOgorCQkJbm9ybWFsaXplX3N3YXBmcyA9IDE7CisJCWNhc2UgJ1MnOgorCQkJc3dhcGZzID0gMTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSAncyc6CisJCWNhc2UgJ1MnOgorCQkJZnByaW50ZihzdGRlcnIsIF8oIkJ5dGUtc3dhcHBpbmcgZmlsZXN5c3RlbXMgIgorCQkJCQkgICJub3QgY29tcGlsZWQgaW4gdGhpcyB2ZXJzaW9uICIKKwkJCQkJICAib2YgZTJmc2NrXG4iKSk7CisJCQlleGl0KDEpOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwlpZiAoc2hvd192ZXJzaW9uX29ubHkpCisJCXJldHVybiAwOworCWlmIChvcHRpbmQgIT0gYXJnYyAtIDEpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAoKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfTk8pICYmCisJICAgICFjZmxhZyAmJiAhc3dhcGZzICYmICEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9DT01QUkVTU19ESVJTKSkKKwkJY3R4LT5vcHRpb25zIHw9IEUyRl9PUFRfUkVBRE9OTFk7CisJY3R4LT5pb19vcHRpb25zID0gc3RyY2hyKGFyZ3Zbb3B0aW5kXSwgJz8nKTsKKwlpZiAoY3R4LT5pb19vcHRpb25zKQorCQkqY3R4LT5pb19vcHRpb25zKysgPSAwOworCWN0eC0+ZmlsZXN5c3RlbV9uYW1lID0gYmxraWRfZ2V0X2Rldm5hbWUoY3R4LT5ibGtpZCwgYXJndltvcHRpbmRdLCAwKTsKKwlpZiAoIWN0eC0+ZmlsZXN5c3RlbV9uYW1lKSB7CisJCWJiX2Vycm9yX21zZyhfKCJVbmFibGUgdG8gcmVzb2x2ZSAnJXMnIiksIGFyZ3Zbb3B0aW5kXSk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCX0KKwlpZiAoZXh0ZW5kZWRfb3B0cykKKwkJcGFyc2VfZXh0ZW5kZWRfb3B0cyhjdHgsIGV4dGVuZGVkX29wdHMpOworCisJaWYgKGZsdXNoKSB7CisJCWZkID0gb3BlbihjdHgtPmZpbGVzeXN0ZW1fbmFtZSwgT19SRE9OTFksIDApOworCQlpZiAoZmQgPCAwKSB7CisJCQliYl9lcnJvcl9tc2coXygid2hpbGUgb3BlbmluZyAlcyBmb3IgZmx1c2hpbmciKSwKKwkJCQljdHgtPmZpbGVzeXN0ZW1fbmFtZSk7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwkJfQorCQlpZiAoKHJldHZhbCA9IGV4dDJmc19zeW5jX2RldmljZShmZCwgMSkpKSB7CisJCQliYl9lcnJvcl9tc2coXygid2hpbGUgdHJ5aW5nIHRvIGZsdXNoICVzIiksCisJCQkJY3R4LT5maWxlc3lzdGVtX25hbWUpOworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJCX0KKwkJY2xvc2UoZmQpOworCX0KKyNpZmRlZiBFTkFCTEVfU1dBUEZTCisJaWYgKHN3YXBmcyAmJiBjZmxhZykgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIkluY29tcGF0aWJsZSBvcHRpb25zIG5vdCAiCisJCQkJCSAgImFsbG93ZWQgd2hlbiBieXRlLXN3YXBwaW5nLlxuIikpOworCQkJZXhpdChFWElUX1VTQUdFKTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIFNldCB1cCBzaWduYWwgYWN0aW9uCisJICovCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHN0cnVjdCBzaWdhY3Rpb24pKTsKKwlzYS5zYV9oYW5kbGVyID0gc2lnbmFsX2NhbmNlbDsKKwlzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIDApOworCXNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIDApOworI2lmZGVmIFNBX1JFU1RBUlQKKwlzYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7CisjZW5kaWYKKwllMmZzY2tfZ2xvYmFsX2N0eCA9IGN0eDsKKwlzYS5zYV9oYW5kbGVyID0gc2lnbmFsX3Byb2dyZXNzX29uOworCXNpZ2FjdGlvbihTSUdVU1IxLCAmc2EsIDApOworCXNhLnNhX2hhbmRsZXIgPSBzaWduYWxfcHJvZ3Jlc3Nfb2ZmOworCXNpZ2FjdGlvbihTSUdVU1IyLCAmc2EsIDApOworCisJLyogVXBkYXRlIG91ciBQQVRIIHRvIGluY2x1ZGUgL3NiaW4gaWYgd2UgbmVlZCB0byBydW4gYmFkYmxvY2tzICAqLworCWlmIChjZmxhZykKKwkJZTJmc19zZXRfc2Jpbl9wYXRoKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIG15X3Zlcl9zdHJpbmdbXSA9IEUyRlNQUk9HU19WRVJTSU9OOworc3RhdGljIGNvbnN0IGNoYXIgbXlfdmVyX2RhdGVbXSA9IEUyRlNQUk9HU19EQVRFOworCitpbnQgZTJmc2NrX21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZTJmc2NrX21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCWludCAgICAgICAgICAgICBleGl0X3ZhbHVlID0gRVhJVF9PSzsKKwlleHQyX2ZpbHN5cyAgICAgZnMgPSAwOworCWlvX21hbmFnZXIgICAgICBpb19wdHI7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiOworCWNvbnN0IGNoYXIgICAgICAqbGliX3Zlcl9kYXRlOworCWludCAgICAgICAgICAgICBteV92ZXIsIGxpYl92ZXI7CisJZTJmc2NrX3QgICAgICAgIGN0eDsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisJaW50IGZsYWdzLCBydW5fcmVzdWx0OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCW15X3ZlciA9IGV4dDJmc19wYXJzZV92ZXJzaW9uX3N0cmluZyhteV92ZXJfc3RyaW5nKTsKKwlsaWJfdmVyID0gZXh0MmZzX2dldF9saWJyYXJ5X3ZlcnNpb24oMCwgJmxpYl92ZXJfZGF0ZSk7CisJaWYgKG15X3ZlciA+IGxpYl92ZXIpIHsKKwkJZnByaW50Ziggc3RkZXJyLCBfKCJFcnJvcjogZXh0MmZzIGxpYnJhcnkgdmVyc2lvbiAiCisJCQkib3V0IG9mIGRhdGUhXG4iKSk7CisJCXNob3dfdmVyc2lvbl9vbmx5Kys7CisJfQorCisJcmV0dmFsID0gUFJTKGFyZ2MsIGFyZ3YsICZjdHgpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHRyeWluZyB0byBpbml0aWFsaXplIHByb2dyYW0iKSk7CisJCWV4aXQoRVhJVF9FUlJPUik7CisJfQorCXJlc2VydmVfc3RkaW9fZmRzKCk7CisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSB8fCBzaG93X3ZlcnNpb25fb25seSkKKwkJZnByaW50ZihzdGRlcnIsICJlMmZzY2sgJXMgKCVzKVxuIiwgbXlfdmVyX3N0cmluZywKKwkJCSBteV92ZXJfZGF0ZSk7CisKKwlpZiAoc2hvd192ZXJzaW9uX29ubHkpIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIlx0VXNpbmcgJXMsICVzXG4iKSwKKwkJCWVycm9yX21lc3NhZ2UoRVhUMl9FVF9CQVNFKSwgbGliX3Zlcl9kYXRlKTsKKwkJZXhpdChFWElUX09LKTsKKwl9CisKKwljaGVja19tb3VudChjdHgpOworCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikgJiYKKwkgICAgIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX05PKSAmJgorCSAgICAhKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfWUVTKSkgeworCQlpZiAoIWN0eC0+aW50ZXJhY3RpdmUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShfKCJuZWVkIHRlcm1pbmFsIGZvciBpbnRlcmFjdGl2ZSByZXBhaXJzIikpOworCX0KKwljdHgtPnN1cGVyYmxvY2sgPSBjdHgtPnVzZV9zdXBlcmJsb2NrOworcmVzdGFydDoKKyNpZmRlZiBDT05GSUdfVEVTVElPX0RFQlVHCisJaW9fcHRyID0gdGVzdF9pb19tYW5hZ2VyOworCXRlc3RfaW9fYmFja2luZ19tYW5hZ2VyID0gdW5peF9pb19tYW5hZ2VyOworI2Vsc2UKKwlpb19wdHIgPSB1bml4X2lvX21hbmFnZXI7CisjZW5kaWYKKwlmbGFncyA9IDA7CisJaWYgKChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSA9PSAwKQorCQlmbGFncyB8PSBFWFQyX0ZMQUdfUlc7CisKKwlpZiAoY3R4LT5zdXBlcmJsb2NrICYmIGN0eC0+YmxvY2tzaXplKSB7CisJCXJldHZhbCA9IGV4dDJmc19vcGVuMihjdHgtPmZpbGVzeXN0ZW1fbmFtZSwgY3R4LT5pb19vcHRpb25zLAorCQkJCSAgICAgIGZsYWdzLCBjdHgtPnN1cGVyYmxvY2ssIGN0eC0+YmxvY2tzaXplLAorCQkJCSAgICAgIGlvX3B0ciwgJmZzKTsKKwl9IGVsc2UgaWYgKGN0eC0+c3VwZXJibG9jaykgeworCQlpbnQgYmxvY2tzaXplOworCQlmb3IgKGJsb2Nrc2l6ZSA9IEVYVDJfTUlOX0JMT0NLX1NJWkU7CisJCSAgICAgYmxvY2tzaXplIDw9IEVYVDJfTUFYX0JMT0NLX1NJWkU7IGJsb2Nrc2l6ZSAqPSAyKSB7CisJCQlyZXR2YWwgPSBleHQyZnNfb3BlbjIoY3R4LT5maWxlc3lzdGVtX25hbWUsCisJCQkJCSAgICAgIGN0eC0+aW9fb3B0aW9ucywgZmxhZ3MsCisJCQkJCSAgICAgIGN0eC0+c3VwZXJibG9jaywgYmxvY2tzaXplLAorCQkJCQkgICAgICBpb19wdHIsICZmcyk7CisJCQlpZiAoIXJldHZhbCkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZQorCQlyZXR2YWwgPSBleHQyZnNfb3BlbjIoY3R4LT5maWxlc3lzdGVtX25hbWUsIGN0eC0+aW9fb3B0aW9ucywKKwkJCQkgICAgICBmbGFncywgMCwgMCwgaW9fcHRyLCAmZnMpOworCWlmICghY3R4LT5zdXBlcmJsb2NrICYmICEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikgJiYKKwkgICAgIShjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0JfU1BFQ0lGSUVEKSAmJgorCSAgICAoKHJldHZhbCA9PSBFWFQyX0VUX0JBRF9NQUdJQykgfHwKKwkgICAgICgocmV0dmFsID09IDApICYmIGV4dDJmc19jaGVja19kZXNjKGZzKSkpKSB7CisJCWlmICghZnMgfHwgKGZzLT5ncm91cF9kZXNjX2NvdW50ID4gMSkpIHsKKwkJCXByaW50ZihfKCIlcyB0cnlpbmcgYmFja3VwIGJsb2Nrcy4uLlxuIiksCisJCQkgICAgICAgcmV0dmFsID8gXygiQ291bGRuJ3QgZmluZCBleHQyIHN1cGVyYmxvY2ssIikgOgorCQkJICAgICAgIF8oIkdyb3VwIGRlc2NyaXB0b3JzIGxvb2sgYmFkLi4uIikpOworCQkJZ2V0X2JhY2t1cF9zYihjdHgsIGZzLCBjdHgtPmZpbGVzeXN0ZW1fbmFtZSwgaW9fcHRyKTsKKwkJCWlmIChmcykKKwkJCQlleHQyZnNfY2xvc2UoZnMpOworCQkJZ290byByZXN0YXJ0OworCQl9CisJfQorCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHRyeWluZyB0byBvcGVuICVzIiksCisJCQljdHgtPmZpbGVzeXN0ZW1fbmFtZSk7CisJCWlmIChyZXR2YWwgPT0gRVhUMl9FVF9SRVZfVE9PX0hJR0gpIHsKKwkJCXByaW50ZihfKCJUaGUgZmlsZXN5c3RlbSByZXZpc2lvbiBpcyBhcHBhcmVudGx5ICIKKwkJCSAgICAgICAidG9vIGhpZ2ggZm9yIHRoaXMgdmVyc2lvbiBvZiBlMmZzY2suXG4iCisJCQkgICAgICAgIihPciB0aGUgZmlsZXN5c3RlbSBzdXBlcmJsb2NrICIKKwkJCSAgICAgICAiaXMgY29ycnVwdClcblxuIikpOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX1NCX0NPUlJVUFQsICZwY3R4KTsKKwkJfSBlbHNlIGlmIChyZXR2YWwgPT0gRVhUMl9FVF9TSE9SVF9SRUFEKQorCQkJcHJpbnRmKF8oIkNvdWxkIHRoaXMgYmUgYSB6ZXJvLWxlbmd0aCBwYXJ0aXRpb24/XG4iKSk7CisJCWVsc2UgaWYgKChyZXR2YWwgPT0gRVBFUk0pIHx8IChyZXR2YWwgPT0gRUFDQ0VTKSkKKwkJCXByaW50ZihfKCJZb3UgbXVzdCBoYXZlICVzIGFjY2VzcyB0byB0aGUgIgorCQkJICAgICAgICJmaWxlc3lzdGVtIG9yIGJlIHJvb3RcbiIpLAorCQkJICAgICAgIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSA/CisJCQkgICAgICAgInIvbyIgOiAici93Iik7CisJCWVsc2UgaWYgKHJldHZhbCA9PSBFTlhJTykKKwkJCXByaW50ZihfKCJQb3NzaWJseSBub24tZXhpc3RlbnQgb3Igc3dhcCBkZXZpY2U/XG4iKSk7CisjaWZkZWYgRVJPRlMKKwkJZWxzZSBpZiAocmV0dmFsID09IEVST0ZTKQorCQkJcHJpbnRmKF8oIkRpc2sgd3JpdGUtcHJvdGVjdGVkOyB1c2UgdGhlIC1uIG9wdGlvbiAiCisJCQkgICAgICAgInRvIGRvIGEgcmVhZC1vbmx5XG4iCisJCQkgICAgICAgImNoZWNrIG9mIHRoZSBkZXZpY2UuXG4iKSk7CisjZW5kaWYKKwkJZWxzZQorCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX1NCX0NPUlJVUFQsICZwY3R4KTsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJfQorCWN0eC0+ZnMgPSBmczsKKwlmcy0+cHJpdl9kYXRhID0gY3R4OworCXNiID0gZnMtPnN1cGVyOworCWlmIChzYi0+c19yZXZfbGV2ZWwgPiBFMkZTQ0tfQ1VSUkVOVF9SRVYpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHRyeWluZyB0byBvcGVuICVzIiksCisJCQljdHgtPmZpbGVzeXN0ZW1fbmFtZSk7CisJZ2V0X25ld2VyOgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShfKCJHZXQgYSBuZXdlciB2ZXJzaW9uIG9mIGUyZnNjayEiKSk7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIGRldmljZSBuYW1lLCB3aGljaCBpcyB1c2VkIHdoZW5ldmVyIHdlIHByaW50IGVycm9yCisJICogb3IgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0byB0aGUgdXNlci4KKwkgKi8KKwlpZiAoY3R4LT5kZXZpY2VfbmFtZSA9PSAwICYmCisJICAgIChzYi0+c192b2x1bWVfbmFtZVswXSAhPSAwKSkgeworCQljdHgtPmRldmljZV9uYW1lID0gc3RyaW5nX2NvcHkoc2ItPnNfdm9sdW1lX25hbWUsCisJCQkJCSAgICAgICBzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKwl9CisJaWYgKGN0eC0+ZGV2aWNlX25hbWUgPT0gMCkKKwkJY3R4LT5kZXZpY2VfbmFtZSA9IGN0eC0+ZmlsZXN5c3RlbV9uYW1lOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIGV4dDMgc3VwZXJibG9jayBmaWVsZHMgYXJlIGNvbnNpc3RlbnQuCisJICovCisJcmV0dmFsID0gZTJmc2NrX2NoZWNrX2V4dDNfam91cm5hbChjdHgpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIGNoZWNraW5nIGV4dDMgam91cm5hbCBmb3IgJXMiKSwKKwkJCWN0eC0+ZGV2aWNlX25hbWUpOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGRvIGV4dDMtc3R5bGUgcmVjb3ZlcnkuICBJZiBzbywKKwkgKiBkbyBpdCwgYW5kIHRoZW4gcmVzdGFydCB0aGUgZnNjay4KKwkgKi8KKwlpZiAoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSB7CisJCWlmIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSB7CisJCQlwcmludGYoXygiV2FybmluZzogc2tpcHBpbmcgam91cm5hbCByZWNvdmVyeSAiCisJCQkJICJiZWNhdXNlIGRvaW5nIGEgcmVhZC1vbmx5IGZpbGVzeXN0ZW0gIgorCQkJCSAiY2hlY2suXG4iKSk7CisJCQlpb19jaGFubmVsX2ZsdXNoKGN0eC0+ZnMtPmlvKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfUkVTVEFSVEVEKSB7CisJCQkJLyoKKwkJCQkgKiBXaG9vcHMsIHdlIGF0dGVtcHRlZCB0byBydW4gdGhlCisJCQkJICogam91cm5hbCB0d2ljZS4gIFRoaXMgc2hvdWxkIG5ldmVyCisJCQkJICogaGFwcGVuLCB1bmxlc3MgdGhlIGhhcmR3YXJlIG9yCisJCQkJICogZGV2aWNlIGRyaXZlciBpcyBiZWluZyBib2d1cy4KKwkJCQkgKi8KKwkJCQliYl9lcnJvcl9tc2coXygiY2FuJ3Qgc2V0IHN1cGVyYmxvY2sgZmxhZ3Mgb24gJXMiKSwgY3R4LT5kZXZpY2VfbmFtZSk7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJCQl9CisJCQlyZXR2YWwgPSBlMmZzY2tfcnVuX2V4dDNfam91cm5hbChjdHgpOworCQkJaWYgKHJldHZhbCkgeworCQkJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSByZWNvdmVyaW5nIGV4dDMgam91cm5hbCBvZiAlcyIpLAorCQkJCQljdHgtPmRldmljZV9uYW1lKTsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwkJCX0KKwkJCWV4dDJmc19jbG9zZShjdHgtPmZzKTsKKwkJCWN0eC0+ZnMgPSAwOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19SRVNUQVJURUQ7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZlYXR1cmUgc2V0cy4gIFdlIG5lZWQgdG8KKwkgKiBiZSBtb3JlIHN0cmluZ2VudCB0aGFuIGV4dDJmc19vcGVuKCkuCisJICovCisJaWYgKChzYi0+c19mZWF0dXJlX2NvbXBhdCAmIH5FWFQyX0xJQl9GRUFUVVJFX0NPTVBBVF9TVVBQKSB8fAorCSAgICAoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIH5FWFQyX0xJQl9GRUFUVVJFX0lOQ09NUEFUX1NVUFApKSB7CisJCWJiX2Vycm9yX21zZygiKCVzKSIsIGN0eC0+ZGV2aWNlX25hbWUpOworCQlnb3RvIGdldF9uZXdlcjsKKwl9CisJaWYgKHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgfkVYVDJfTElCX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApIHsKKwkJYmJfZXJyb3JfbXNnKCIoJXMpIiwgY3R4LT5kZXZpY2VfbmFtZSk7CisJCWdvdG8gZ2V0X25ld2VyOworCX0KKyNpZmRlZiBFTkFCTEVfQ09NUFJFU1NJT04KKwkvKiBGSVhNRSAtIGRvIHdlIHN1cHBvcnQgdGhpcyBhdCBhbGw/ICovCisJaWYgKHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NJT04pCisJCWJiX2Vycm9yX21zZyhfKCJ3YXJuaW5nOiBjb21wcmVzc2lvbiBzdXBwb3J0IGlzIGV4cGVyaW1lbnRhbCIpKTsKKyNlbmRpZgorI2lmbmRlZiBFTkFCTEVfSFRSRUUKKwlpZiAoc2ItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCkgeworCQliYl9lcnJvcl9tc2coXygiRTJmc2NrIG5vdCBjb21waWxlZCB3aXRoIEhUUkVFIHN1cHBvcnQsXG5cdCIKKwkJCSAgImJ1dCBmaWxlc3lzdGVtICVzIGhhcyBIVFJFRSBkaXJlY3Rvcmllcy4iKSwKKwkJCWN0eC0+ZGV2aWNlX25hbWUpOworCQlnb3RvIGdldF9uZXdlcjsKKwl9CisjZW5kaWYKKworCS8qCisJICogSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGEgc3BlY2lmaWMgc3VwZXJibG9jaywgcHJlc3VtYWJseSB0aGUKKwkgKiBtYXN0ZXIgc3VwZXJibG9jayBoYXMgYmVlbiB0cmFzaGVkLiAgU28gd2UgbWFyayB0aGUKKwkgKiBzdXBlcmJsb2NrIGFzIGRpcnR5LCBzbyBpdCBjYW4gYmUgd3JpdHRlbiBvdXQuCisJICovCisJaWYgKGN0eC0+c3VwZXJibG9jayAmJgorCSAgICAhKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpKQorCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisKKwkvKgorCSAqIFdlIG9ubHkgdXBkYXRlIHRoZSBtYXN0ZXIgc3VwZXJibG9jayBiZWNhdXNlIChhKSBwYXJhbm9pYTsKKwkgKiB3ZSBkb24ndCB3YW50IHRvIGNvcnJ1cHQgdGhlIGJhY2t1cCBzdXBlcmJsb2NrcywgYW5kIChiKSB3ZQorCSAqIGRvbid0IG5lZWQgdG8gdXBkYXRlIHRoZSBtb3VudCBjb3VudCBhbmQgbGFzdCBjaGVja2VkCisJICogZmllbGRzIGluIHRoZSBiYWNrdXAgc3VwZXJibG9jayAodGhlIGtlcm5lbCBkb2Vzbid0CisJICogdXBkYXRlIHRoZSBiYWNrdXAgc3VwZXJibG9ja3MgYW55d2F5KS4KKwkgKi8KKwlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX01BU1RFUl9TQl9PTkxZOworCisJZWhhbmRsZXJfaW5pdChmcy0+aW8pOworCisJaWYgKGN0eC0+c3VwZXJibG9jaykKKwkJc2V0X2xhdGNoX2ZsYWdzKFBSX0xBVENIX1JFTE9DLCBQUkxfTEFUQ0hFRCwgMCk7CisJZXh0MmZzX21hcmtfdmFsaWQoZnMpOworCWNoZWNrX3N1cGVyX2Jsb2NrKGN0eCk7CisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJY2hlY2tfaWZfc2tpcChjdHgpOworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworI2lmZGVmIEVOQUJMRV9TV0FQRlMKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBOQVRJVkVfRkxBRyBFWFQyX0ZMQUdfU1dBUF9CWVRFUworI2Vsc2UKKyNkZWZpbmUgTkFUSVZFX0ZMQUcgMAorI2VuZGlmCisKKworCWlmIChub3JtYWxpemVfc3dhcGZzKSB7CisJCWlmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpID09IE5BVElWRV9GTEFHKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiJXM6IEZpbGVzeXN0ZW0gYnl0ZSBvcmRlciAiCisJCQkJImFscmVhZHkgbm9ybWFsaXplZC5cbiIpLCBjdHgtPmRldmljZV9uYW1lKTsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCQl9CisJfQorCWlmIChzd2FwZnMpIHsKKwkJc3dhcF9maWxlc3lzKGN0eCk7CisJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogTWFyayB0aGUgc3lzdGVtIGFzIHZhbGlkLCAndGlsIHByb3ZlbiBvdGhlcndpc2UKKwkgKi8KKwlleHQyZnNfbWFya192YWxpZChmcyk7CisKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9iYl9pbm9kZShmcywgJmZzLT5iYWRibG9ja3MpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHJlYWRpbmcgYmFkIGJsb2NrcyBpbm9kZSIpKTsKKwkJcHJlZW5oYWx0KGN0eCk7CisJCXByaW50ZihfKCJUaGlzIGRvZXNuJ3QgYm9kZSB3ZWxsLCIKKwkJCSAiIGJ1dCB3ZSdsbCB0cnkgdG8gZ28gb24uLi5cbiIpKTsKKwl9CisKKwlydW5fcmVzdWx0ID0gZTJmc2NrX3J1bihjdHgpOworCWUyZnNja19jbGVhcl9wcm9nYmFyKGN0eCk7CisJaWYgKHJ1bl9yZXN1bHQgPT0gRTJGX0ZMQUdfUkVTVEFSVCkgeworCQlwcmludGYoXygiUmVzdGFydGluZyBlMmZzY2sgZnJvbSB0aGUgYmVnaW5uaW5nLi4uXG4iKSk7CisJCXJldHZhbCA9IGUyZnNja19yZXNldF9jb250ZXh0KGN0eCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSByZXNldHRpbmcgY29udGV4dCIpKTsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCQl9CisJCWV4dDJmc19jbG9zZShmcyk7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJaWYgKHJ1bl9yZXN1bHQgJiBFMkZfRkxBR19DQU5DRUwpIHsKKwkJcHJpbnRmKF8oIiVzOiBlMmZzY2sgY2FuY2VsZWQuXG4iKSwgY3R4LT5kZXZpY2VfbmFtZSA/CisJCSAgICAgICBjdHgtPmRldmljZV9uYW1lIDogY3R4LT5maWxlc3lzdGVtX25hbWUpOworCQlleGl0X3ZhbHVlIHw9IEZTQ0tfQ0FOQ0VMRUQ7CisJfQorCWlmIChydW5fcmVzdWx0ICYgRTJGX0ZMQUdfQUJPUlQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKF8oImFib3J0ZWQiKSk7CisKKwkvKiBDbGVhbnVwICovCisJaWYgKGV4dDJmc190ZXN0X2NoYW5nZWQoZnMpKSB7CisJCWV4aXRfdmFsdWUgfD0gRVhJVF9OT05ERVNUUlVDVDsKKwkJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikpCisJCSAgICBwcmludGYoXygiXG4lczogKioqKiogRklMRSBTWVNURU0gV0FTIE1PRElGSUVEICoqKioqXG4iKSwKKwkJCSAgICAgICBjdHgtPmRldmljZV9uYW1lKTsKKwkJaWYgKGN0eC0+bW91bnRfZmxhZ3MgJiBFWFQyX01GX0lTUk9PVCkgeworCQkJcHJpbnRmKF8oIiVzOiAqKioqKiBSRUJPT1QgTElOVVggKioqKipcbiIpLAorCQkJICAgICAgIGN0eC0+ZGV2aWNlX25hbWUpOworCQkJZXhpdF92YWx1ZSB8PSBFWElUX0RFU1RSVUNUOworCQl9CisJfQorCWlmICghZXh0MmZzX3Rlc3RfdmFsaWQoZnMpKSB7CisJCXByaW50ZihfKCJcbiVzOiAqKioqKioqKioqIFdBUk5JTkc6IEZpbGVzeXN0ZW0gc3RpbGwgaGFzICIKKwkJCSAiZXJyb3JzICoqKioqKioqKipcblxuIiksIGN0eC0+ZGV2aWNlX25hbWUpOworCQlleGl0X3ZhbHVlIHw9IEVYSVRfVU5DT1JSRUNURUQ7CisJCWV4aXRfdmFsdWUgJj0gfkVYSVRfTk9OREVTVFJVQ1Q7CisJfQorCWlmIChleGl0X3ZhbHVlICYgRlNDS19DQU5DRUxFRCkKKwkJZXhpdF92YWx1ZSAmPSB+RVhJVF9OT05ERVNUUlVDVDsKKwllbHNlIHsKKwkJc2hvd19zdGF0cyhjdHgpOworCQlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSkgeworCQkJaWYgKGV4dDJmc190ZXN0X3ZhbGlkKGZzKSkgeworCQkJCWlmICghKHNiLT5zX3N0YXRlICYgRVhUMl9WQUxJRF9GUykpCisJCQkJCWV4aXRfdmFsdWUgfD0gRVhJVF9OT05ERVNUUlVDVDsKKwkJCQlzYi0+c19zdGF0ZSA9IEVYVDJfVkFMSURfRlM7CisJCQl9IGVsc2UKKwkJCQlzYi0+c19zdGF0ZSAmPSB+RVhUMl9WQUxJRF9GUzsKKwkJCXNiLT5zX21udF9jb3VudCA9IDA7CisJCQlzYi0+c19sYXN0Y2hlY2sgPSB0aW1lKE5VTEwpOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQl9CisJfQorCisJZTJmc2NrX3dyaXRlX2JpdG1hcHMoY3R4KTsKKworCWV4dDJmc19jbG9zZShmcyk7CisJY3R4LT5mcyA9IE5VTEw7CisJZnJlZShjdHgtPmZpbGVzeXN0ZW1fbmFtZSk7CisJZnJlZShjdHgtPmpvdXJuYWxfbmFtZSk7CisJZTJmc2NrX2ZyZWVfY29udGV4dChjdHgpOworCisJcmV0dXJuIGV4aXRfdmFsdWU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMmZzY2suaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UyZnNjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTlmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMmZzY2suaApAQCAtMCwwICsxLDYzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSAiZXh0MmZzL2tlcm5lbC1saXN0LmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIE5vdyBwdWxsIGluIHRoZSByZWFsIGxpbnV4L2pmcy5oIGRlZmluaXRpb25zLgorICovCisjaW5jbHVkZSAiZXh0MmZzL2tlcm5lbC1qYmQuaCIKKworCisKKyNpbmNsdWRlICJmc2NrLmgiCisKKyNpbmNsdWRlICJleHQyZnMvZXh0Ml9mcy5oIgorI2luY2x1ZGUgImJsa2lkL2Jsa2lkLmgiCisjaW5jbHVkZSAiZXh0MmZzL2V4dDJfZXh0X2F0dHIuaCIKKyNpbmNsdWRlICJ1dWlkL3V1aWQuaCIKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWZkZWYgSEFWRV9DT05JT19ICisjdW5kZWYgSEFWRV9URVJNSU9TX0gKKyNpbmNsdWRlIDxjb25pby5oPgorI2RlZmluZSByZWFkX2FfY2hhcigpICAgZ2V0Y2goKQorI2Vsc2UKKyNpZmRlZiBIQVZFX1RFUk1JT1NfSAorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIFRoZSBsYXN0IGV4dDJmcyByZXZpc2lvbiBsZXZlbCB0aGF0IHRoaXMgdmVyc2lvbiBvZiBlMmZzY2sgaXMgYWJsZSB0bworICogc3VwcG9ydAorICovCisjZGVmaW5lIEUyRlNDS19DVVJSRU5UX1JFViAgICAgIDEKKworLyogVXNlZCBieSB0aGUgcmVnaW9uIGFsbG9jYXRpb24gY29kZSAqLwordHlwZWRlZiBfX3UzMiByZWdpb25fYWRkcl90OwordHlwZWRlZiBzdHJ1Y3QgcmVnaW9uX3N0cnVjdCAqcmVnaW9uX3Q7CisKK3N0cnVjdCBkeF9kaXJibG9ja19pbmZvIHsKKwlpbnQgICAgICAgICAgICAgdHlwZTsKKwlibGtfdCAgICAgICAgICAgcGh5czsKKwlpbnQgICAgICAgICAgICAgZmxhZ3M7CisJYmxrX3QgICAgICAgICAgIHBhcmVudDsKKwlleHQyX2Rpcmhhc2hfdCAgbWluX2hhc2g7CisJZXh0Ml9kaXJoYXNoX3QgIG1heF9oYXNoOworCWV4dDJfZGlyaGFzaF90ICBub2RlX21pbl9oYXNoOworCWV4dDJfZGlyaGFzaF90ICBub2RlX21heF9oYXNoOworfTsKKworLyoKK1RoZXNlIGRlZmluZXMgYXJlIHVzZWQgaW4gdGhlIHR5cGUgZmllbGQgb2YgZHhfZGlyYmxvY2tfaW5mbworKi8KKworI2RlZmluZSBEWF9ESVJCTE9DS19ST09UICAgICAgICAxCisjZGVmaW5lIERYX0RJUkJMT0NLX0xFQUYgICAgICAgIDIKKyNkZWZpbmUgRFhfRElSQkxPQ0tfTk9ERSAgICAgICAgMworCisKKy8qCitUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgaW4gdGhlICdmbGFncycgZmllbGQgb2YgYSBkeF9kaXJibG9ja19pbmZvCisqLworI2RlZmluZSBEWF9GTEFHX1JFRkVSRU5DRUQgICAgICAxCisjZGVmaW5lIERYX0ZMQUdfRFVQX1JFRiAgICAgICAgIDIKKyNkZWZpbmUgRFhfRkxBR19GSVJTVCAgICAgICAgICAgNAorI2RlZmluZSBEWF9GTEFHX0xBU1QgICAgICAgICAgICA4CisKKy8qCisgKiBFMmZzY2sgb3B0aW9ucworICovCisjZGVmaW5lIEUyRl9PUFRfUkVBRE9OTFkgICAgICAgIDB4MDAwMQorI2RlZmluZSBFMkZfT1BUX1BSRUVOICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRTJGX09QVF9ZRVMgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEUyRl9PUFRfTk8gICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBFMkZfT1BUX1RJTUUgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRTJGX09QVF9DSEVDS0JMT0NLUyAgICAgMHgwMDQwCisjZGVmaW5lIEUyRl9PUFRfREVCVUcgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBFMkZfT1BUX0ZPUkNFICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgRTJGX09QVF9XUklURUNIRUNLICAgICAgMHgwMjAwCisjZGVmaW5lIEUyRl9PUFRfQ09NUFJFU1NfRElSUyAgIDB4MDQwMAorCisvKgorICogRTJmc2NrIGZsYWdzCisgKi8KKyNkZWZpbmUgRTJGX0ZMQUdfQUJPUlQgICAgICAgICAgMHgwMDAxIC8qIEFib3J0IHNpZ25hbGVkICovCisjZGVmaW5lIEUyRl9GTEFHX0NBTkNFTCAgICAgICAgIDB4MDAwMiAvKiBDYW5jZWwgc2lnbmFsZWQgKi8KKyNkZWZpbmUgRTJGX0ZMQUdfU0lHTkFMX01BU0sgICAgMHgwMDAzCisjZGVmaW5lIEUyRl9GTEFHX1JFU1RBUlQgICAgICAgIDB4MDAwNCAvKiBSZXN0YXJ0IHNpZ25hbGVkICovCisKKyNkZWZpbmUgRTJGX0ZMQUdfU0VUSk1QX09LICAgICAgMHgwMDEwIC8qIFNldGptcCB2YWxpZCBmb3IgYWJvcnQgKi8KKworI2RlZmluZSBFMkZfRkxBR19QUk9HX0JBUiAgICAgICAweDAwMjAgLyogUHJvZ3Jlc3MgYmFyIG9uIHNjcmVlbiAqLworI2RlZmluZSBFMkZfRkxBR19QUk9HX1NVUFBSRVNTICAweDAwNDAgLyogUHJvZ3Jlc3Mgc3VzcGVuZGVkICovCisjZGVmaW5lIEUyRl9GTEFHX0pPVVJOQUxfSU5PREUgIDB4MDA4MCAvKiBDcmVhdGUgYSBuZXcgZXh0MyBqb3VybmFsIGlub2RlICovCisjZGVmaW5lIEUyRl9GTEFHX1NCX1NQRUNJRklFRCAgIDB4MDEwMCAvKiBUaGUgc3VwZXJibG9jayB3YXMgZXhwbGljaXRseQorCQkJCQkqIHNwZWNpZmllZCBieSB0aGUgdXNlciAqLworI2RlZmluZSBFMkZfRkxBR19SRVNUQVJURUQgICAgICAweDAyMDAgLyogRTJmc2NrIGhhcyBiZWVuIHJlc3RhcnRlZCAqLworI2RlZmluZSBFMkZfRkxBR19SRVNJWkVfSU5PREUgICAweDA0MDAgLyogUmVxdWVzdCB0byByZWNyZWF0ZSByZXNpemUgaW5vZGUgKi8KKworCisvKkRvbid0IGtub3cgd2hlcmUgdGhlc2UgY29tZSBmcm9tKi8KKyNkZWZpbmUgUkVBRCAwCisjZGVmaW5lIFdSSVRFIDEKKyNkZWZpbmUgY3B1X3RvX2JlMzIobikgaHRvbmwobikKKyNkZWZpbmUgYmUzMl90b19jcHUobikgbnRvaGwobikKKworLyoKKyAqIFdlIGRlZmluZSBhIHNldCBvZiAibGF0Y2ggZ3JvdXBzIjsgdGhlc2UgYXJlIHByb2JsZW1zIHdoaWNoIGFyZQorICogaGFuZGxlZCBhcyBhIHNldC4gIFRoZSB1c2VyIGFuc3dlcnMgb25jZSBmb3IgYSBwYXJ0aWN1bGFyIGxhdGNoCisgKiBncm91cC4KKyAqLworI2RlZmluZSBQUl9MQVRDSF9NQVNLICAgICAgICAgMHgwZmYwIC8qIExhdGNoIG1hc2sgKi8KKyNkZWZpbmUgUFJfTEFUQ0hfQkxPQ0sgICAgICAgIDB4MDAxMCAvKiBMYXRjaCBmb3IgaWxsZWdhbCBibG9ja3MgKHBhc3MgMSkgKi8KKyNkZWZpbmUgUFJfTEFUQ0hfQkJMT0NLICAgICAgIDB4MDAyMCAvKiBMYXRjaCBmb3IgYmFkIGJsb2NrIGlub2RlIGJsb2NrcyAocGFzcyAxKSAqLworI2RlZmluZSBQUl9MQVRDSF9JQklUTUFQICAgICAgMHgwMDMwIC8qIExhdGNoIGZvciBwYXNzIDUgaW5vZGUgYml0bWFwIHByb2MuICovCisjZGVmaW5lIFBSX0xBVENIX0JCSVRNQVAgICAgICAweDAwNDAgLyogTGF0Y2ggZm9yIHBhc3MgNSBpbm9kZSBiaXRtYXAgcHJvYy4gKi8KKyNkZWZpbmUgUFJfTEFUQ0hfUkVMT0MgICAgICAgIDB4MDA1MCAvKiBMYXRjaCBmb3Igc3VwZXJibG9jayByZWxvY2F0ZSBoaW50ICovCisjZGVmaW5lIFBSX0xBVENIX0RCTE9DSyAgICAgICAweDAwNjAgLyogTGF0Y2ggZm9yIHBhc3MgMWIgZHVwIGJsb2NrIGhlYWRlcnMgKi8KKyNkZWZpbmUgUFJfTEFUQ0hfTE9XX0RUSU1FICAgIDB4MDA3MCAvKiBMYXRjaCBmb3IgcGFzczEgb3JwaGFuZWQgbGlzdCByZWZ1Z2VlcyAqLworI2RlZmluZSBQUl9MQVRDSF9UT09CSUcgICAgICAgMHgwMDgwIC8qIExhdGNoIGZvciBmaWxlIHRvIGJpZyBlcnJvcnMgKi8KKyNkZWZpbmUgUFJfTEFUQ0hfT1BUSU1JWkVfRElSIDB4MDA5MCAvKiBMYXRjaCBmb3Igb3B0aW1pemUgZGlyZWN0b3JpZXMgKi8KKworI2RlZmluZSBQUl9MQVRDSCh4KSAgICAgKCgoKHgpICYgUFJfTEFUQ0hfTUFTSykgPj4gNCkgLSAxKQorCisvKgorICogTGF0Y2ggZ3JvdXAgZGVzY3JpcHRvciBmbGFncworICovCisjZGVmaW5lIFBSTF9ZRVMgICAgICAgICAweDAwMDEgIC8qIEFuc3dlciB5ZXMgKi8KKyNkZWZpbmUgUFJMX05PICAgICAgICAgIDB4MDAwMiAgLyogQW5zd2VyIG5vICovCisjZGVmaW5lIFBSTF9MQVRDSEVEICAgICAweDAwMDQgIC8qIFRoZSBsYXRjaCBncm91cCBpcyBsYXRjaGVkICovCisjZGVmaW5lIFBSTF9TVVBQUkVTUyAgICAweDAwMDggIC8qIFN1cHByZXNzIGFsbCBsYXRjaCBncm91cCBxdWVzdGlvbnMgKi8KKworI2RlZmluZSBQUkxfVkFSSUFCTEUgICAgMHgwMDBmICAvKiBBbGwgdGhlIGZsYWdzIHRoYXQgbmVlZCB0byBiZSByZXNldCAqLworCisvKgorICogUHJlLVBhc3MgMSBlcnJvcnMKKyAqLworCisjZGVmaW5lIFBSXzBfQkJfTk9UX0dST1VQICAgICAgIDB4MDAwMDAxICAvKiBCbG9jayBiaXRtYXAgbm90IGluIGdyb3VwICovCisjZGVmaW5lIFBSXzBfSUJfTk9UX0dST1VQICAgICAgIDB4MDAwMDAyICAvKiBJbm9kZSBiaXRtYXAgbm90IGluIGdyb3VwICovCisjZGVmaW5lIFBSXzBfSVRBQkxFX05PVF9HUk9VUCAgIDB4MDAwMDAzICAvKiBJbm9kZSB0YWJsZSBub3QgaW4gZ3JvdXAgKi8KKyNkZWZpbmUgUFJfMF9TQl9DT1JSVVBUICAgICAgICAgMHgwMDAwMDQgIC8qIFN1cGVyYmxvY2sgY29ycnVwdCAqLworI2RlZmluZSBQUl8wX0ZTX1NJWkVfV1JPTkcgICAgICAweDAwMDAwNSAgLyogRmlsZXN5c3RlbSBzaXplIGlzIHdyb25nICovCisjZGVmaW5lIFBSXzBfTk9fRlJBR01FTlRTICAgICAgIDB4MDAwMDA2ICAvKiBGcmFnbWVudHMgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBQUl8wX0JMT0NLU19QRVJfR1JPVVAgICAweDAwMDAwNyAgLyogQmFkIGJsb2Nrc19wZXJfZ3JvdXAgKi8KKyNkZWZpbmUgUFJfMF9GSVJTVF9EQVRBX0JMT0NLICAgMHgwMDAwMDggIC8qIEJhZCBmaXJzdF9kYXRhX2Jsb2NrICovCisjZGVmaW5lIFBSXzBfQUREX1VVSUQgICAgICAgICAgIDB4MDAwMDA5ICAvKiBBZGRpbmcgVVVJRCB0byBmaWxlc3lzdGVtICovCisjZGVmaW5lIFBSXzBfUkVMT0NBVEVfSElOVCAgICAgIDB4MDAwMDBBICAvKiBSZWxvY2F0ZSBoaW50ICovCisjZGVmaW5lIFBSXzBfTUlTQ19DT1JSVVBUX1NVUEVSIDB4MDAwMDBCICAvKiBNaXNjZWxsYW5lb3VzIHN1cGVyYmxvY2sgY29ycnVwdGlvbiAqLworI2RlZmluZSBQUl8wX0dFVFNJWkVfRVJST1IgICAgICAweDAwMDAwQyAgLyogRXJyb3IgZGV0ZXJtaW5nIHBoeXNpY2FsIGRldmljZSBzaXplIG9mIGZpbGVzeXN0ZW0gKi8KKyNkZWZpbmUgUFJfMF9JTk9ERV9DT1VOVF9XUk9ORyAgMHgwMDAwMEQgIC8qIElub2RlIGNvdW50IGluIHRoZSBzdXBlcmJsb2NrIGluY29ycmVjdCAqLworI2RlZmluZSBQUl8wX0hVUkRfQ0xFQVJfRklMRVRZUEUgMHgwMDAwMEUgLyogVGhlIEh1cmQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZmlsZXR5cGUgZmVhdHVyZSAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfQkFEX0lOT0RFICAweDAwMDAwRiAgLyogVGhlIEh1cmQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZmlsZXR5cGUgZmVhdHVyZSAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfVU5TVVBQX01VTFRJRlMgMHgwMDAwMTAgLyogVGhlIGV4dGVybmFsIGpvdXJuYWwgaGFzIG11bHRpcGxlIGZpbGVzeXN0ZW1zICh3aGljaCB3ZSBjYW4ndCBoYW5kbGUgeWV0KSAqLworI2RlZmluZSBQUl8wX0NBTlRfRklORF9KT1VSTkFMICAweDAwMDAxMSAgLyogQ2FuJ3QgZmluZCBleHRlcm5hbCBqb3VybmFsICovCisjZGVmaW5lIFBSXzBfRVhUX0pPVVJOQUxfQkFEX1NVUEVSIDB4MDAwMDEyLyogRXh0ZXJuYWwgam91cm5hbCBoYXMgYmFkIHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX0JBRF9VVUlEICAgMHgwMDAwMTMgIC8qIFN1cGVyYmxvY2sgaGFzIGEgYmFkIGpvdXJuYWwgVVVJRCAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfVU5TVVBQX1NVUEVSIDB4MDAwMDE0IC8qIEpvdXJuYWwgaGFzIGFuIHVua25vd24gc3VwZXJibG9jayB0eXBlICovCisjZGVmaW5lIFBSXzBfSk9VUk5BTF9CQURfU1VQRVIgIDB4MDAwMDE1ICAvKiBKb3VybmFsIHN1cGVyYmxvY2sgaXMgY29ycnVwdCAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfSEFTX0pPVVJOQUwgMHgwMDAwMTYgLyogSm91cm5hbCBzdXBlcmJsb2NrIGlzIGNvcnJ1cHQgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX1JFQ09WRVJfU0VUIDB4MDAwMDE3IC8qIFN1cGVyYmxvY2sgaGFzIHJlY292ZXJ5IGZsYWcgc2V0IGJ1dCBubyBqb3VybmFsICovCisjZGVmaW5lIFBSXzBfSk9VUk5BTF9SRUNPVkVSWV9DTEVBUiAweDAwMDAxOCAvKiBKb3VybmFsIGhhcyBkYXRhLCBidXQgcmVjb3ZlcnkgZmxhZyBpcyBjbGVhciAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfUkVTRVRfSk9VUk5BTCAweDAwMDAxOSAvKiBBc2sgaWYgd2Ugc2hvdWxkIGNsZWFyIHRoZSBqb3VybmFsICovCisjZGVmaW5lIFBSXzBfRlNfUkVWX0xFVkVMICAgICAgIDB4MDAwMDFBICAvKiBGaWxlc3lzdGVtIHJldmlzaW9uIGlzIDAsIGJ1dCBmZWF0dXJlIGZsYWdzIGFyZSBzZXQgKi8KKyNkZWZpbmUgUFJfMF9PUlBIQU5fQ0xFQVJfSU5PREUgICAgICAgICAgICAgMHgwMDAwMjAgLyogQ2xlYXJpbmcgb3JwaGFuIGlub2RlICovCisjZGVmaW5lIFBSXzBfT1JQSEFOX0lMTEVHQUxfQkxPQ0tfTlVNICAgICAgIDB4MDAwMDIxIC8qIElsbGVnYWwgYmxvY2sgZm91bmQgaW4gb3JwaGFuZWQgaW5vZGUgKi8KKyNkZWZpbmUgUFJfMF9PUlBIQU5fQUxSRUFEWV9DTEVBUkVEX0JMT0NLICAgMHgwMDAwMjIgLyogQWxyZWFkeSBjbGVhcmVkIGJsb2NrIGZvdW5kIGluIG9ycGhhbmVkIGlub2RlICovCisjZGVmaW5lIFBSXzBfT1JQSEFOX0lMTEVHQUxfSEVBRF9JTk9ERSAgICAgIDB4MDAwMDIzIC8qIElsbGVnYWwgb3JwaGFuIGlub2RlIGluIHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUgUFJfMF9PUlBIQU5fSUxMRUdBTF9JTk9ERSAgICAgICAgICAgMHgwMDAwMjQgLyogSWxsZWdhbCBpbm9kZSBpbiBvcnBoYW5lZCBpbm9kZSBsaXN0ICovCisjZGVmaW5lIFBSXzBfSk9VUk5BTF9VTlNVUFBfUk9DT01QQVQgICAgICAgIDB4MDAwMDI1IC8qIEpvdXJuYWwgaGFzIHVuc3VwcG9ydGVkIHJlYWQtb25seSBmZWF0dXJlIC0gYWJvcnQgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX1VOU1VQUF9JTkNPTVBBVCAgICAgICAgMHgwMDAwMjYgLyogSm91cm5hbCBoYXMgdW5zdXBwb3J0ZWQgaW5jb21wYXRpYmxlIGZlYXR1cmUgLSBhYm9ydCAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfVU5TVVBQX1ZFUlNJT04gICAgICAgICAweDAwMDAyNyAvKiBKb3VybmFsIGhhcyB1bnN1cHBvcnRlZCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBQUl8wX01PVkVfSk9VUk5BTCAgICAgICAgICAgICAgICAgICAweDAwMDAyOCAvKiBNb3Zpbmcgam91cm5hbCB0byBoaWRkZW4gZmlsZSAqLworI2RlZmluZSBQUl8wX0VSUl9NT1ZFX0pPVVJOQUwgICAgICAgICAgICAgICAweDAwMDAyOSAvKiBFcnJvciBtb3Zpbmcgam91cm5hbCAqLworI2RlZmluZSBQUl8wX0NMRUFSX1YyX0pPVVJOQUwgICAgICAgICAgICAgICAweDAwMDAyQSAvKiBDbGVhcmluZyBWMiBqb3VybmFsIHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX1JVTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMkIgLyogUnVuIGpvdXJuYWwgYW55d2F5ICovCisjZGVmaW5lIFBSXzBfSk9VUk5BTF9SVU5fREVGQVVMVCAgICAgICAgICAgIDB4MDAwMDJDIC8qIFJ1biBqb3VybmFsIGFueXdheSBieSBkZWZhdWx0ICovCisjZGVmaW5lIFBSXzBfQkFDS1VQX0pOTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDJEIC8qIEJhY2t1cCBqb3VybmFsIGlub2RlIGJsb2NrcyAqLworI2RlZmluZSBQUl8wX05PTlpFUk9fUkVTRVJWRURfR0RUX0JMT0NLUyAgICAweDAwMDAyRSAvKiBSZXNlcnZlZCBibG9ja3Mgdy9vIHJlc2l6ZV9pbm9kZSAqLworI2RlZmluZSBQUl8wX0NMRUFSX1JFU0laRV9JTk9ERSAgICAgICAgICAgICAweDAwMDAyRiAvKiBSZXNpemVfaW5vZGUgbm90IGVuYWJsZWQsIGJ1dCByZXNpemUgaW5vZGUgaXMgbm9uLXplcm8gKi8KKyNkZWZpbmUgUFJfMF9SRVNJWkVfSU5PREVfSU5WQUxJRCAgICAgICAgICAgMHgwMDAwMzAgLyogUmVzaXplIGlub2RlIGludmFsaWQgKi8KKworLyoKKyAqIFBhc3MgMSBlcnJvcnMKKyAqLworCisjZGVmaW5lIFBSXzFfUEFTU19IRUFERVIgICAgICAgICAgICAgIDB4MDEwMDAwICAvKiBQYXNzIDE6IENoZWNraW5nIGlub2RlcywgYmxvY2tzLCBhbmQgc2l6ZXMgKi8KKyNkZWZpbmUgUFJfMV9ST09UX05PX0RJUiAgICAgICAgICAgICAgMHgwMTAwMDEgIC8qIFJvb3QgZGlyZWN0b3J5IGlzIG5vdCBhbiBpbm9kZSAqLworI2RlZmluZSBQUl8xX1JPT1RfRFRJTUUgICAgICAgICAgICAgICAweDAxMDAwMiAgLyogUm9vdCBkaXJlY3RvcnkgaGFzIGR0aW1lIHNldCAqLworI2RlZmluZSBQUl8xX1JFU0VSVkVEX0JBRF9NT0RFICAgICAgICAweDAxMDAwMyAgLyogUmVzZXJ2ZWQgaW5vZGUgaGFzIGJhZCBtb2RlICovCisjZGVmaW5lIFBSXzFfWkVST19EVElNRSAgICAgICAgICAgICAgIDB4MDEwMDA0ICAvKiBEZWxldGVkIGlub2RlIGhhcyB6ZXJvIGR0aW1lICovCisjZGVmaW5lIFBSXzFfU0VUX0RUSU1FICAgICAgICAgICAgICAgIDB4MDEwMDA1ICAvKiBJbm9kZSBpbiB1c2UsIGJ1dCBkdGltZSBzZXQgKi8KKyNkZWZpbmUgUFJfMV9aRVJPX0xFTkdUSF9ESVIgICAgICAgICAgMHgwMTAwMDYgIC8qIFplcm8tbGVuZ3RoIGRpcmVjdG9yeSAqLworI2RlZmluZSBQUl8xX0JCX0NPTkZMSUNUICAgICAgICAgICAgICAweDAxMDAwNyAgLyogQmxvY2sgYml0bWFwIGNvbmZsaWN0cyB3aXRoIHNvbWUgb3RoZXIgZnMgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMV9JQl9DT05GTElDVCAgICAgICAgICAgICAgMHgwMTAwMDggIC8qIElub2RlIGJpdG1hcCBjb25mbGljdHMgd2l0aCBzb21lIG90aGVyIGZzIGJsb2NrICovCisjZGVmaW5lIFBSXzFfSVRBQkxFX0NPTkZMSUNUICAgICAgICAgIDB4MDEwMDA5ICAvKiBJbm9kZSB0YWJsZSBjb25mbGljdHMgd2l0aCBzb21lIG90aGVyIGZzIGJsb2NrICovCisjZGVmaW5lIFBSXzFfQkJfQkFEX0JMT0NLICAgICAgICAgICAgIDB4MDEwMDBBICAvKiBCbG9jayBiaXRtYXAgaXMgb24gYSBiYWQgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMV9JQl9CQURfQkxPQ0sgICAgICAgICAgICAgMHgwMTAwMEIgIC8qIElub2RlIGJpdG1hcCBpcyBvbiBhIGJhZCBibG9jayAqLworI2RlZmluZSBQUl8xX0JBRF9JX1NJWkUgICAgICAgICAgICAgICAweDAxMDAwQyAgLyogSW5vZGUgaGFzIGluY29ycmVjdCBpX3NpemUgKi8KKyNkZWZpbmUgUFJfMV9CQURfSV9CTE9DS1MgICAgICAgICAgICAgMHgwMTAwMEQgIC8qIElub2RlIGhhcyBpbmNvcnJlY3QgaV9ibG9ja3MgKi8KKyNkZWZpbmUgUFJfMV9JTExFR0FMX0JMT0NLX05VTSAgICAgICAgMHgwMTAwMEUgIC8qIElsbGVnYWwgYmxvY2sgbnVtYmVyIGluIGlub2RlICovCisjZGVmaW5lIFBSXzFfQkxPQ0tfT1ZFUkxBUFNfTUVUQURBVEEgIDB4MDEwMDBGICAvKiBCbG9jayBudW1iZXIgb3ZlcmxhcHMgZnMgbWV0YWRhdGEgKi8KKyNkZWZpbmUgUFJfMV9JTk9ERV9CTE9DS19MQVRDSCAgICAgICAgMHgwMTAwMTAgIC8qIElub2RlIGhhcyBpbGxlZ2FsIGJsb2NrcyAobGF0Y2ggcXVlc3Rpb24pICovCisjZGVmaW5lIFBSXzFfVE9PX01BTllfQkFEX0JMT0NLUyAgICAgIDB4MDEwMDExICAvKiBUb28gbWFueSBiYWQgYmxvY2tzIGluIGlub2RlICovCisjZGVmaW5lIFBSXzFfQkJfSUxMRUdBTF9CTE9DS19OVU0gICAgIDB4MDEwMDEyICAvKiBJbGxlZ2FsIGJsb2NrIG51bWJlciBpbiBiYWQgYmxvY2sgaW5vZGUgKi8KKyNkZWZpbmUgUFJfMV9JTk9ERV9CQkxPQ0tfTEFUQ0ggICAgICAgMHgwMTAwMTMgIC8qIEJhZCBibG9jayBpbm9kZSBoYXMgaWxsZWdhbCBibG9ja3MgKGxhdGNoIHF1ZXN0aW9uKSAqLworI2RlZmluZSBQUl8xX0RVUF9CTE9DS1NfUFJFRU5TVE9QICAgICAweDAxMDAxNCAgLyogRHVwbGljYXRlIG9yIGJhZCBibG9ja3MgaW4gdXNlISAqLworI2RlZmluZSBQUl8xX0JCSU5PREVfQkFEX01FVEFCTE9DSyAgICAweDAxMDAxNSAgLyogQmFkIGJsb2NrIHVzZWQgYXMgYmFkIGJsb2NrIGluZGlyZWN0IGJsb2NrICovCisjZGVmaW5lIFBSXzFfQkJJTk9ERV9CQURfTUVUQUJMT0NLX1BST01QVCAweDAxMDAxNiAvKiBJbmNvbnNpc3RlbmN5IGNhbid0IGJlIGZpeGVkIHByb21wdCAqLworI2RlZmluZSBQUl8xX0JBRF9QUklNQVJZX0JMT0NLICAgICAgICAweDAxMDAxNyAgLyogQmFkIHByaW1hcnkgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMV9CQURfUFJJTUFSWV9CTE9DS19QUk9NUFQgMHgwMTAwMTggIC8qIEJhZCBwcmltYXJ5IGJsb2NrIHByb21wdCAqLworI2RlZmluZSBQUl8xX0JBRF9QUklNQVJZX1NVUEVSQkxPQ0sgICAweDAxMDAxOSAgLyogQmFkIHByaW1hcnkgc3VwZXJibG9jayAqLworI2RlZmluZSBQUl8xX0JBRF9QUklNQVJZX0dST1VQX0RFU0NSSVBUT1IgMHgwMTAwMUEgLyogQmFkIHByaW1hcnkgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUFJfMV9CQURfU1VQRVJCTE9DSyAgICAgICAgICAgMHgwMTAwMUIgIC8qIEJhZCBzdXBlcmJsb2NrIGluIGdyb3VwICovCisjZGVmaW5lIFBSXzFfQkFEX0dST1VQX0RFU0NSSVBUT1JTICAgIDB4MDEwMDFDICAvKiBCYWQgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMgaW4gZ3JvdXAgKi8KKyNkZWZpbmUgUFJfMV9QUk9HRVJSX0NMQUlNRURfQkxPQ0sgICAgMHgwMTAwMUQgIC8qIEJsb2NrIGNsYWltZWQgZm9yIG5vIHJlYXNvbiAqLworI2RlZmluZSBQUl8xX1JFTE9DX0JMT0NLX0FMTE9DQVRFICAgICAweDAxMDAxRSAgLyogRXJyb3IgYWxsb2NhdGluZyBibG9ja3MgZm9yIHJlbG9jYXRpbmcgbWV0YWRhdGEgKi8KKyNkZWZpbmUgUFJfMV9SRUxPQ19NRU1PUllfQUxMT0NBVEUgICAgMHgwMTAwMUYgIC8qIEVycm9yIGFsbG9jYXRpbmcgYmxvY2sgYnVmZmVyIGR1cmluZyByZWxvY2F0aW9uIHByb2Nlc3MgKi8KKyNkZWZpbmUgUFJfMV9SRUxPQ19GUk9NX1RPICAgICAgICAgICAgMHgwMTAwMjAgIC8qIFJlbG9jYXRpbmcgbWV0YWRhdGEgZ3JvdXAgaW5mb3JtYXRpb24gZnJvbSBYIHRvIFkgKi8KKyNkZWZpbmUgUFJfMV9SRUxPQ19UTyAgICAgICAgICAgICAgICAgMHgwMTAwMjEgIC8qIFJlbG9jYXRpbmcgbWV0YXRkYXRhIGdyb3VwIGluZm9ybWF0aW9uIHRvIFggKi8KKyNkZWZpbmUgUFJfMV9SRUxPQ19SRUFEX0VSUiAgICAgICAgICAgMHgwMTAwMjIgIC8qIEJsb2NrIHJlYWQgZXJyb3IgZHVyaW5nIHJlbG9jYXRpb24gcHJvY2VzcyAqLworI2RlZmluZSBQUl8xX1JFTE9DX1dSSVRFX0VSUiAgICAgICAgICAweDAxMDAyMyAgLyogQmxvY2sgd3JpdGUgZXJyb3IgZHVyaW5nIHJlbG9jYXRpb24gcHJvY2VzcyAqLworI2RlZmluZSBQUl8xX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IgICAweDAxMDAyNCAgLyogRXJyb3IgYWxsb2NhdGluZyBpbm9kZSBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfMV9BTExPQ0FURV9CQklUTUFQX0VSUk9SICAgMHgwMTAwMjUgIC8qIEVycm9yIGFsbG9jYXRpbmcgYmxvY2sgYml0bWFwICovCisjZGVmaW5lIFBSXzFfQUxMT0NBVEVfSUNPVU5UICAgICAgICAgIDB4MDEwMDI2ICAvKiBFcnJvciBhbGxvY2F0aW5nIGljb3VudCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUFJfMV9BTExPQ0FURV9EQkNPVU5UICAgICAgICAgMHgwMTAwMjcgIC8qIEVycm9yIGFsbG9jYXRpbmcgZGJjb3VudCAqLworI2RlZmluZSBQUl8xX0lTQ0FOX0VSUk9SICAgICAgICAgICAgICAweDAxMDAyOCAgLyogRXJyb3Igd2hpbGUgc2Nhbm5pbmcgaW5vZGVzICovCisjZGVmaW5lIFBSXzFfQkxPQ0tfSVRFUkFURSAgICAgICAgICAgIDB4MDEwMDI5ICAvKiBFcnJvciB3aGlsZSBpdGVyYXRpbmcgb3ZlciBibG9ja3MgKi8KKyNkZWZpbmUgUFJfMV9JQ09VTlRfU1RPUkUgICAgICAgICAgICAgMHgwMTAwMkEgIC8qIEVycm9yIHdoaWxlIHN0b3JpbmcgaW5vZGUgY291bnQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFJfMV9BRERfREJMT0NLICAgICAgICAgICAgICAgMHgwMTAwMkIgIC8qIEVycm9yIHdoaWxlIHN0b3JpbmcgZGlyZWN0b3J5IGJsb2NrIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFBSXzFfUkVBRF9JTk9ERSAgICAgICAgICAgICAgIDB4MDEwMDJDICAvKiBFcnJvciB3aGlsZSByZWFkaW5nIGlub2RlIChmb3IgY2xlYXJpbmcpICovCisjZGVmaW5lIFBSXzFfU1VQUFJFU1NfTUVTU0FHRVMgICAgICAgIDB4MDEwMDJEICAvKiBTdXBwcmVzcyBtZXNzYWdlcyBwcm9tcHQgKi8KKyNkZWZpbmUgUFJfMV9TRVRfSU1BR0lDICAgIDB4MDEwMDJGICAvKiBJbWFnaWMgZmxhZyBzZXQgb24gYW4gaW5vZGUgd2hlbiBmaWxlc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLworI2RlZmluZSBQUl8xX1NFVF9JTU1VVEFCTEUgICAgICAgICAgICAweDAxMDAzMCAgLyogSW1tdXRhYmxlIGZsYWcgc2V0IG9uIGEgZGV2aWNlIG9yIHNvY2tldCBpbm9kZSAqLworI2RlZmluZSBQUl8xX0NPTVBSX1NFVCAgICAgICAgICAgICAgICAweDAxMDAzMSAgLyogQ29tcHJlc3Npb24gZmxhZyBzZXQgb24gYSBub24tY29tcHJlc3NlZCBmaWxlc3lzdGVtICovCisjZGVmaW5lIFBSXzFfU0VUX05PTlpTSVpFICAgICAgICAgICAgIDB4MDEwMDMyICAvKiBOb24temVybyBzaXplIG9uIGRldmljZSwgZmlmbyBvciBzb2NrZXQgaW5vZGUgKi8KKyNkZWZpbmUgUFJfMV9GU19SRVZfTEVWRUwgICAgICAgICAgICAgMHgwMTAwMzMgIC8qIEZpbGVzeXN0ZW0gcmV2aXNpb24gaXMgMCwgYnV0IGZlYXR1cmUgZmxhZ3MgYXJlIHNldCAqLworI2RlZmluZSBQUl8xX0pPVVJOQUxfSU5PREVfTk9UX0NMRUFSICAweDAxMDAzNCAgLyogSm91cm5hbCBpbm9kZSBub3QgaW4gdXNlLCBuZWVkcyBjbGVhcmluZyAqLworI2RlZmluZSBQUl8xX0pPVVJOQUxfQkFEX01PREUgICAgICAgICAweDAxMDAzNSAgLyogSm91cm5hbCBpbm9kZSBoYXMgd3JvbmcgbW9kZSAqLworI2RlZmluZSBQUl8xX0xPV19EVElNRSAgICAgICAgICAgICAgICAweDAxMDAzNiAgLyogSW5vZGUgdGhhdCB3YXMgcGFydCBvZiBvcnBoYW4gbGlua2VkIGxpc3QgKi8KKyNkZWZpbmUgUFJfMV9PUlBIQU5fTElTVF9SRUZVR0VFUyAgICAgMHgwMTAwMzcgIC8qIExhdGNoIHF1ZXN0aW9uIHdoaWNoIGFza3MgaG93IHRvIGRlYWwgd2l0aCBsb3cgZHRpbWUgaW5vZGVzICovCisjZGVmaW5lIFBSXzFfQUxMT0NBVEVfUkVGQ09VTlQgICAgICAgIDB4MDEwMDM4ICAvKiBFcnJvciBhbGxvY2F0aW5nIHJlZmNvdW50IHN0cnVjdHVyZSAqLworI2RlZmluZSBQUl8xX1JFQURfRUFfQkxPQ0sgICAgICAgICAgICAweDAxMDAzOSAgLyogRXJyb3IgcmVhZGluZyBFeHRlbmRlZCBBdHRyaWJ1dGUgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMV9CQURfRUFfQkxPQ0sgICAgICAgICAgICAgMHgwMTAwM0EgIC8qIEludmFsaWQgRXh0ZW5kZWQgQXR0cmlidXRlIGJsb2NrICovCisjZGVmaW5lIFBSXzFfRVhUQVRUUl9SRUFEX0FCT1JUICAgMHgwMTAwM0IgIC8qIEVycm9yIHJlYWRpbmcgRXh0ZW5kZWQgQXR0cmlidXRlIGJsb2NrIHdoaWxlIGZpeGluZyByZWZjb3VudCAtLSBhYm9ydCAqLworI2RlZmluZSBQUl8xX0VYVEFUVFJfUkVGQ09VTlQgICAgICAgICAweDAxMDAzQyAgLyogRXh0ZW5kZWQgYXR0cmlidXRlIHJlZmVyZW5jZSBjb3VudCBpbmNvcnJlY3QgKi8KKyNkZWZpbmUgUFJfMV9FWFRBVFRSX1dSSVRFICAgICAgICAgICAgMHgwMTAwM0QgIC8qIEVycm9yIHdyaXRpbmcgRXh0ZW5kZWQgQXR0cmlidXRlIGJsb2NrIHdoaWxlIGZpeGluZyByZWZjb3VudCAqLworI2RlZmluZSBQUl8xX0VBX01VTFRJX0JMT0NLICAgICAgICAgICAweDAxMDAzRSAgLyogTXVsdGlwbGUgRUEgYmxvY2tzIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUFJfMV9FQV9BTExPQ19SRUdJT04gICAgICAgICAgMHgwMTAwM0YgIC8qIEVycm9yIGFsbG9jYXRpbmcgRUEgcmVnaW9uIGFsbG9jYXRpb24gc3RydWN0dXJlICovCisjZGVmaW5lIFBSXzFfRUFfQUxMT0NfQ09MTElTSU9OICAgICAgIDB4MDEwMDQwICAvKiBFcnJvciBFQSBhbGxvY2F0aW9uIGNvbGxpc2lvbiAqLworI2RlZmluZSBQUl8xX0VBX0JBRF9OQU1FICAgICAgICAgICAgICAweDAxMDA0MSAgLyogQmFkIGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lICovCisjZGVmaW5lIFBSXzFfRUFfQkFEX1ZBTFVFICAgICAgICAgICAgIDB4MDEwMDQyICAvKiBCYWQgZXh0ZW5kZWQgYXR0cmlidXRlIHZhbHVlICovCisjZGVmaW5lIFBSXzFfSU5PREVfVE9PQklHICAgICAgICAgICAgIDB4MDEwMDQzICAvKiBJbm9kZSB0b28gYmlnIChsYXRjaCBxdWVzdGlvbikgKi8KKyNkZWZpbmUgUFJfMV9UT09CSUdfRElSICAgICAgICAgICAgICAgMHgwMTAwNDQgIC8qIERpcmVjdG9yeSB0b28gYmlnICovCisjZGVmaW5lIFBSXzFfVE9PQklHX1JFRyAgICAgICAgICAgICAgIDB4MDEwMDQ1ICAvKiBSZWd1bGFyIGZpbGUgdG9vIGJpZyAqLworI2RlZmluZSBQUl8xX1RPT0JJR19TWU1MSU5LICAgICAgICAgICAweDAxMDA0NiAgLyogU3ltbGluayB0b28gYmlnICovCisjZGVmaW5lIFBSXzFfSFRSRUVfU0VUICAgICAgICAgICAgICAgIDB4MDEwMDQ3ICAvKiBJTkRFWF9GTCBmbGFnIHNldCBvbiBhIG5vbi1IVFJFRSBmaWxlc3lzdGVtICovCisjZGVmaW5lIFBSXzFfSFRSRUVfTk9ESVIgICAgICAgICAgICAgIDB4MDEwMDQ4ICAvKiBJTkRFWF9GTCBmbGFnIHNldCBvbiBhIG5vbi1kaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfMV9IVFJFRV9CQURST09UICAgICAgICAgICAgMHgwMTAwNDkgIC8qIEludmFsaWQgcm9vdCBub2RlIGluIEhUUkVFIGRpcmVjdG9yeSAqLworI2RlZmluZSBQUl8xX0hUUkVFX0hBU0hWICAgICAgICAgICAgICAweDAxMDA0QSAgLyogVW5zdXBwb3J0ZWQgaGFzaCB2ZXJzaW9uIGluIEhUUkVFIGRpcmVjdG9yeSAqLworI2RlZmluZSBQUl8xX0hUUkVFX0lOQ09NUEFUICAgICAgICAgICAweDAxMDA0QiAgLyogSW5jb21wYXRpYmxlIGZsYWcgaW4gSFRSRUUgcm9vdCBub2RlICovCisjZGVmaW5lIFBSXzFfSFRSRUVfREVQVEggICAgICAgICAgICAgIDB4MDEwMDRDICAvKiBIVFJFRSB0b28gZGVlcCAqLworI2RlZmluZSBQUl8xX0JCX0ZTX0JMT0NLICAgMHgwMTAwNEQgIC8qIEJhZCBibG9jayBoYXMgaW5kaXJlY3QgYmxvY2sgdGhhdCBjb25mbGljdHMgd2l0aCBmaWxlc3lzdGVtIGJsb2NrICovCisjZGVmaW5lIFBSXzFfUkVTSVpFX0lOT0RFX0NSRUFURSAgICAgIDB4MDEwMDRFICAvKiBSZXNpemUgaW5vZGUgZmFpbGVkICovCisjZGVmaW5lIFBSXzFfRVhUUkFfSVNJWkUgICAgICAgICAgICAgIDB4MDEwMDRGICAvKiBpbm9kZS0+aV9zaXplIGlzIHRvbyBsb25nICovCisjZGVmaW5lIFBSXzFfQVRUUl9OQU1FX0xFTiAgICAgICAgICAgIDB4MDEwMDUwICAvKiBhdHRyaWJ1dGUgbmFtZSBpcyB0b28gbG9uZyAqLworI2RlZmluZSBQUl8xX0FUVFJfVkFMVUVfT0ZGU0VUICAgICAgICAweDAxMDA1MSAgLyogd3JvbmcgRUEgdmFsdWUgb2Zmc2V0ICovCisjZGVmaW5lIFBSXzFfQVRUUl9WQUxVRV9CTE9DSyAgICAgICAgIDB4MDEwMDUyICAvKiB3cm9uZyBFQSBibG9ja251bWJlciAqLworI2RlZmluZSBQUl8xX0FUVFJfVkFMVUVfU0laRSAgICAgICAgICAweDAxMDA1MyAgLyogd3JvbmcgRUEgdmFsdWUgc2l6ZSAqLworI2RlZmluZSBQUl8xX0FUVFJfSEFTSCAgICAgICAgICAgICAgICAweDAxMDA1NCAgLyogd3JvbmcgRUEgaGFzaCB2YWx1ZSAqLworCisvKgorICogUGFzcyAxYiBlcnJvcnMKKyAqLworCisjZGVmaW5lIFBSXzFCX1BBU1NfSEVBREVSICAgICAgIDB4MDExMDAwICAvKiBQYXNzIDFCOiBSZXNjYW4gZm9yIGR1cGxpY2F0ZS9iYWQgYmxvY2tzICovCisjZGVmaW5lIFBSXzFCX0RVUF9CTE9DS19IRUFERVIgIDB4MDExMDAxICAvKiBEdXBsaWNhdGUvYmFkIGJsb2NrKHMpIGhlYWRlciAqLworI2RlZmluZSBQUl8xQl9EVVBfQkxPQ0sgICAgICAgICAweDAxMTAwMiAgLyogRHVwbGljYXRlL2JhZCBibG9jayhzKSBpbiBpbm9kZSAqLworI2RlZmluZSBQUl8xQl9EVVBfQkxPQ0tfRU5EICAgICAweDAxMTAwMyAgLyogRHVwbGljYXRlL2JhZCBibG9jayhzKSBlbmQgKi8KKyNkZWZpbmUgUFJfMUJfSVNDQU5fRVJST1IgICAgICAgMHgwMTEwMDQgIC8qIEVycm9yIHdoaWxlIHNjYW5uaW5nIGlub2RlcyAqLworI2RlZmluZSBQUl8xQl9BTExPQ0FURV9JQklUTUFQX0VSUk9SIDB4MDExMDA1ICAvKiBFcnJvciBhbGxvY2F0aW5nIGlub2RlIGJpdG1hcCAqLworI2RlZmluZSBQUl8xQl9CTE9DS19JVEVSQVRFICAgICAweDAxMTAwMDYgIC8qIEVycm9yIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGJsb2NrcyAqLworI2RlZmluZSBQUl8xQl9BREpfRUFfUkVGQ09VTlQgICAweDAxMTAwMDcgIC8qIEVycm9yIGFkanVzdGluZyBFQSByZWZjb3VudCAqLworI2RlZmluZSBQUl8xQ19QQVNTX0hFQURFUiAgICAgICAweDAxMjAwMCAgLyogUGFzcyAxQzogU2NhbiBkaXJlY3RvcmllcyBmb3IgaW5vZGVzIHdpdGggZHVwIGJsb2Nrcy4gKi8KKyNkZWZpbmUgUFJfMURfUEFTU19IRUFERVIgICAgICAgMHgwMTMwMDAgIC8qIFBhc3MgMUQ6IFJlY29uY2lsaW5nIGR1cGxpY2F0ZSBibG9ja3MgKi8KKyNkZWZpbmUgUFJfMURfRFVQX0ZJTEUgICAgICAgICAgMHgwMTMwMDEgIC8qIEZpbGUgaGFzIGR1cGxpY2F0ZSBibG9ja3MgKi8KKyNkZWZpbmUgUFJfMURfRFVQX0ZJTEVfTElTVCAgICAgMHgwMTMwMDIgIC8qIExpc3Qgb2YgZmlsZXMgc2hhcmluZyBkdXBsaWNhdGUgYmxvY2tzICovCisjZGVmaW5lIFBSXzFEX1NIQVJFX01FVEFEQVRBICAgIDB4MDEzMDAzICAvKiBGaWxlIHNoYXJpbmcgYmxvY2tzIHdpdGggZmlsZXN5c3RlbSBtZXRhZGF0YSAgKi8KKyNkZWZpbmUgUFJfMURfTlVNX0RVUF9JTk9ERVMgICAgMHgwMTMwMDQgIC8qIFJlcG9ydCBvZiBob3cgbWFueSBkdXBsaWNhdGUvYmFkIGlub2RlcyAqLworI2RlZmluZSBQUl8xRF9EVVBfQkxPQ0tTX0RFQUxUICAweDAxMzAwNSAgLyogRHVwbGljYXRlZCBibG9ja3MgYWxyZWFkeSByZWFzc2lnbmVkIG9yIGNsb25lZC4gKi8KKyNkZWZpbmUgUFJfMURfQ0xPTkVfUVVFU1RJT04gICAgMHgwMTMwMDYgIC8qIENsb25lIGR1cGxpY2F0ZS9iYWQgYmxvY2tzPyAqLworI2RlZmluZSBQUl8xRF9ERUxFVEVfUVVFU1RJT04gICAweDAxMzAwNyAgLyogRGVsZXRlIGZpbGU/ICovCisjZGVmaW5lIFBSXzFEX0NMT05FX0VSUk9SICAgICAgIDB4MDEzMDA4ICAvKiBDb3VsZG4ndCBjbG9uZSBmaWxlIChlcnJvcikgKi8KKworLyoKKyAqIFBhc3MgMiBlcnJvcnMKKyAqLworCisjZGVmaW5lIFBSXzJfUEFTU19IRUFERVIgICAgICAgIDB4MDIwMDAwICAvKiBQYXNzIDI6IENoZWNraW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUFJfMl9CQURfSU5PREVfRE9UICAgICAgMHgwMjAwMDEgIC8qIEJhZCBpbm9kZSBudW1iZXIgZm9yICcuJyAqLworI2RlZmluZSBQUl8yX0JBRF9JTk8gICAgICAgICAgICAweDAyMDAwMiAgLyogRGlyZWN0b3J5IGVudHJ5IGhhcyBiYWQgaW5vZGUgbnVtYmVyICovCisjZGVmaW5lIFBSXzJfVU5VU0VEX0lOT0RFICAgICAgIDB4MDIwMDAzICAvKiBEaXJlY3RvcnkgZW50cnkgaGFzIGRlbGV0ZWQgb3IgdW51c2VkIGlub2RlICovCisjZGVmaW5lIFBSXzJfTElOS19ET1QgICAgICAgICAgIDB4MDIwMDA0ICAvKiBEaXJlY3RyeSBlbnRyeSBpcyBsaW5rIHRvICcuJyAqLworI2RlZmluZSBQUl8yX0JCX0lOT0RFICAgICAgICAgICAweDAyMDAwNSAgLyogRGlyZWN0b3J5IGVudHJ5IHBvaW50cyB0byBpbm9kZSBub3cgbG9jYXRlZCBpbiBhIGJhZCBibG9jayAqLworI2RlZmluZSBQUl8yX0xJTktfRElSICAgICAgICAgICAweDAyMDAwNiAgLyogRGlyZWN0b3J5IGVudHJ5IGNvbnRhaW5zIGEgbGluayB0byBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBQUl8yX0xJTktfUk9PVCAgICAgICAgICAweDAyMDAwNyAgLyogRGlyZWN0b3J5IGVudHJ5IGNvbnRhaW5zIGEgbGluayB0byB0aGUgcm9vdCBkaXJlY3RyeSAqLworI2RlZmluZSBQUl8yX0JBRF9OQU1FICAgICAgICAgICAweDAyMDAwOCAgLyogRGlyZWN0b3J5IGVudHJ5IGhhcyBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gaXRzIG5hbWUgKi8KKyNkZWZpbmUgUFJfMl9NSVNTSU5HX0RPVCAgICAgICAgMHgwMjAwMDkgIC8qIE1pc3NpbmcgJy4nIGluIGRpcmVjdG9yeSBpbm9kZSAqLworI2RlZmluZSBQUl8yX01JU1NJTkdfRE9UX0RPVCAgICAweDAyMDAwQSAgLyogTWlzc2luZyAnLi4nIGluIGRpcmVjdG9yeSBpbm9kZSAqLworI2RlZmluZSBQUl8yXzFTVF9OT1RfRE9UICAgICAgICAweDAyMDAwQiAgLyogRmlyc3QgZW50cnkgaW4gZGlyZWN0b3J5IGlub2RlIGRvZXNuJ3QgY29udGFpbiAnLicgKi8KKyNkZWZpbmUgUFJfMl8yTkRfTk9UX0RPVF9ET1QgICAgMHgwMjAwMEMgIC8qIFNlY29uZCBlbnRyeSBpbiBkaXJlY3RvcnkgaW5vZGUgZG9lc24ndCBjb250YWluICcuLicgKi8KKyNkZWZpbmUgUFJfMl9GQUREUl9aRVJPICAgICAgICAgMHgwMjAwMEQgIC8qIGlfZmFkZHIgc2hvdWxkIGJlIHplcm8gKi8KKyNkZWZpbmUgUFJfMl9GSUxFX0FDTF9aRVJPICAgICAgMHgwMjAwMEUgIC8qIGlfZmlsZV9hY2wgc2hvdWxkIGJlIHplcm8gKi8KKyNkZWZpbmUgUFJfMl9ESVJfQUNMX1pFUk8gICAgICAgMHgwMjAwMEYgIC8qIGlfZGlyX2FjbCBzaG91bGQgYmUgemVybyAqLworI2RlZmluZSBQUl8yX0ZSQUdfWkVSTyAgICAgICAgICAweDAyMDAxMCAgLyogaV9mcmFnIHNob3VsZCBiZSB6ZXJvICovCisjZGVmaW5lIFBSXzJfRlNJWkVfWkVSTyAgICAgICAgIDB4MDIwMDExICAvKiBpX2ZzaXplIHNob3VsZCBiZSB6ZXJvICovCisjZGVmaW5lIFBSXzJfQkFEX01PREUgICAgICAgICAgIDB4MDIwMDEyICAvKiBpbm9kZSBoYXMgYmFkIG1vZGUgKi8KKyNkZWZpbmUgUFJfMl9ESVJfQ09SUlVQVEVEICAgICAgMHgwMjAwMTMgIC8qIGRpcmVjdG9yeSBjb3JydXB0ZWQgKi8KKyNkZWZpbmUgUFJfMl9GSUxFTkFNRV9MT05HICAgICAgMHgwMjAwMTQgIC8qIGZpbGVuYW1lIHRvbyBsb25nICovCisjZGVmaW5lIFBSXzJfRElSRUNUT1JZX0hPTEUgICAgIDB4MDIwMDE1ICAvKiBEaXJlY3RvcnkgaW5vZGUgaGFzIGEgbWlzc2luZyBibG9jayAoaG9sZSkgKi8KKyNkZWZpbmUgUFJfMl9ET1RfTlVMTF9URVJNICAgICAgMHgwMjAwMTYgIC8qICcuJyBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkICovCisjZGVmaW5lIFBSXzJfRE9UX0RPVF9OVUxMX1RFUk0gIDB4MDIwMDE3ICAvKiAnLi4nIGlzIG5vdCBOVUxMIHRlcm1pbmF0ZWQgKi8KKyNkZWZpbmUgUFJfMl9CQURfQ0hBUl9ERVYgICAgICAgMHgwMjAwMTggIC8qIElsbGVnYWwgY2hhcmFjdGVyIGRldmljZSBpbiBpbm9kZSAqLworI2RlZmluZSBQUl8yX0JBRF9CTE9DS19ERVYgICAgICAweDAyMDAxOSAgLyogSWxsZWdhbCBibG9jayBkZXZpY2UgaW4gaW5vZGUgKi8KKyNkZWZpbmUgUFJfMl9EVVBfRE9UICAgICAgICAgICAgMHgwMjAwMUEgIC8qIER1cGxpY2F0ZSAnLicgZW50cnkgKi8KKyNkZWZpbmUgUFJfMl9EVVBfRE9UX0RPVCAgICAgICAgMHgwMjAwMUIgIC8qIER1cGxpY2F0ZSAnLi4nIGVudHJ5ICovCisjZGVmaW5lIFBSXzJfTk9fRElSSU5GTyAgICAgICAgIDB4MDIwMDFDICAvKiBJbnRlcm5hbCBlcnJvcjogY291bGRuJ3QgZmluZCBkaXJfaW5mbyAqLworI2RlZmluZSBQUl8yX0ZJTkFMX1JFQ0xFTiAgICAgICAweDAyMDAxRCAgLyogRmluYWwgcmVjX2xlbiBpcyB3cm9uZyAqLworI2RlZmluZSBQUl8yX0FMTE9DQVRFX0lDT1VOVCAgICAweDAyMDAxRSAgLyogRXJyb3IgYWxsb2NhdGluZyBpY291bnQgc3RydWN0dXJlICovCisjZGVmaW5lIFBSXzJfREJMSVNUX0lURVJBVEUgICAgIDB4MDIwMDFGICAvKiBFcnJvciBpdGVyYXRpbmcgb3ZlciBkaXJlY3RvcnkgYmxvY2tzICovCisjZGVmaW5lIFBSXzJfUkVBRF9ESVJCTE9DSyAgICAgIDB4MDIwMDIwICAvKiBFcnJvciByZWFkaW5nIGRpcmVjdG9yeSBibG9jayAqLworI2RlZmluZSBQUl8yX1dSSVRFX0RJUkJMT0NLICAgICAweDAyMDAyMSAgLyogRXJyb3Igd3JpdGluZyBkaXJlY3RvcnkgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMl9BTExPQ19ESVJCT0NLICAgICAgMHgwMjAwMjIgIC8qIEVycm9yIGFsbG9jYXRpbmcgbmV3IGRpcmVjdG9yeSBibG9jayAqLworI2RlZmluZSBQUl8yX0RFQUxMT0NfSU5PREUgICAgICAweDAyMDAyMyAgLyogRXJyb3IgZGVhbGxvY2F0aW5nIGlub2RlICovCisjZGVmaW5lIFBSXzJfU1BMSVRfRE9UICAgICAgICAgIDB4MDIwMDI0ICAvKiBEaXJlY3RvcnkgZW50cnkgZm9yICcuJyBpcyBiaWcuICBTcGxpdD8gKi8KKyNkZWZpbmUgUFJfMl9CQURfRklGTyAgICAgICAgICAgMHgwMjAwMjUgIC8qIElsbGVnYWwgRklGTyAqLworI2RlZmluZSBQUl8yX0JBRF9TT0NLRVQgICAgICAgICAweDAyMDAyNiAgLyogSWxsZWdhbCBzb2NrZXQgKi8KKyNkZWZpbmUgUFJfMl9TRVRfRklMRVRZUEUgICAgICAgMHgwMjAwMjcgIC8qIERpcmVjdG9yeSBmaWxldHlwZSBub3Qgc2V0ICovCisjZGVmaW5lIFBSXzJfQkFEX0ZJTEVUWVBFICAgICAgIDB4MDIwMDI4ICAvKiBEaXJlY3RvcnkgZmlsZXR5cGUgaW5jb3JyZWN0ICovCisjZGVmaW5lIFBSXzJfQ0xFQVJfRklMRVRZUEUgICAgIDB4MDIwMDI5ICAvKiBEaXJlY3RvcnkgZmlsZXR5cGUgc2V0IHdoZW4gaXQgc2hvdWxkbid0IGJlICovCisjZGVmaW5lIFBSXzJfTlVMTF9OQU1FICAgICAgICAgIDB4MDIwMDMwICAvKiBEaXJlY3RvcnkgZmlsZW5hbWUgY2FuJ3QgYmUgemVyby1sZW5ndGggICovCisjZGVmaW5lIFBSXzJfSU5WQUxJRF9TWU1MSU5LICAgIDB4MDIwMDMxICAvKiBJbnZhbGlkIHN5bWxpbmsgKi8KKyNkZWZpbmUgUFJfMl9GSUxFX0FDTF9CQUQgICAgICAgMHgwMjAwMzIgIC8qIGlfZmlsZV9hY2wgKGV4dGVuZGVkIGF0dHJpYnV0ZSkgaXMgYmFkICovCisjZGVmaW5lIFBSXzJfRkVBVFVSRV9MQVJHRV9GSUxFUyAweDAyMDAzMyAgLyogRmlsZXN5c3RlbSBjb250YWlucyBsYXJnZSBmaWxlcywgYnV0IGhhcyBubyBzdWNoIGZsYWcgaW4gc2IgKi8KKyNkZWZpbmUgUFJfMl9IVFJFRV9OT1RSRUYgICAgICAgMHgwMjAwMzQgIC8qIE5vZGUgaW4gSFRSRUUgZGlyZWN0b3J5IG5vdCByZWZlcmVuY2VkICovCisjZGVmaW5lIFBSXzJfSFRSRUVfRFVQUkVGICAgICAgIDB4MDIwMDM1ICAvKiBOb2RlIGluIEhUUkVFIGRpcmVjdG9yeSByZWZlcmVuY2VkIHR3aWNlICovCisjZGVmaW5lIFBSXzJfSFRSRUVfTUlOX0hBU0ggICAgIDB4MDIwMDM2ICAvKiBOb2RlIGluIEhUUkVFIGRpcmVjdG9yeSBoYXMgYmFkIG1pbiBoYXNoICovCisjZGVmaW5lIFBSXzJfSFRSRUVfTUFYX0hBU0ggICAgIDB4MDIwMDM3ICAvKiBOb2RlIGluIEhUUkVFIGRpcmVjdG9yeSBoYXMgYmFkIG1heCBoYXNoICovCisjZGVmaW5lIFBSXzJfSFRSRUVfQ0xFQVIgICAgICAgIDB4MDIwMDM4ICAvKiBDbGVhciBpbnZhbGlkIEhUUkVFIGRpcmVjdG9yeSAqLworI2RlZmluZSBQUl8yX0hUUkVFX0JBREJMSyAgICAgICAweDAyMDAzQSAgLyogQmFkIGJsb2NrIGluIGh0cmVlIGludGVyaW9yIG5vZGUgKi8KKyNkZWZpbmUgUFJfMl9BREpfRUFfUkVGQ09VTlQgICAgMHgwMjAwM0IgIC8qIEVycm9yIGFkanVzdGluZyBFQSByZWZjb3VudCAqLworI2RlZmluZSBQUl8yX0hUUkVFX0JBRF9ST09UICAgICAweDAyMDAzQyAgLyogSW52YWxpZCBIVFJFRSByb290IG5vZGUgKi8KKyNkZWZpbmUgUFJfMl9IVFJFRV9CQURfTElNSVQgICAgMHgwMjAwM0QgIC8qIEludmFsaWQgSFRSRUUgbGltaXQgKi8KKyNkZWZpbmUgUFJfMl9IVFJFRV9CQURfQ09VTlQgICAgMHgwMjAwM0UgIC8qIEludmFsaWQgSFRSRUUgY291bnQgKi8KKyNkZWZpbmUgUFJfMl9IVFJFRV9IQVNIX09SREVSICAgMHgwMjAwM0YgIC8qIEhUUkVFIGludGVyaW9yIG5vZGUgaGFzIG91dC1vZi1vcmRlciBoYXNoZXMgaW4gdGFibGUgKi8KKyNkZWZpbmUgUFJfMl9IVFJFRV9CQURfREVQVEggICAgMHgwMjAwNDAgIC8qIE5vZGUgaW4gSFRSRUUgZGlyZWN0b3J5IGhhcyBiYWQgZGVwdGggKi8KKyNkZWZpbmUgUFJfMl9EVVBMSUNBVEVfRElSRU5UICAgMHgwMjAwNDEgIC8qIER1cGxpY2F0ZSBkaXJlY3RvcnkgZW50cnkgZm91bmQgKi8KKyNkZWZpbmUgUFJfMl9OT05fVU5JUVVFX0ZJTEUgICAgMHgwMjAwNDIgIC8qIE5vbi11bmlxdWUgZmlsZW5hbWUgZm91bmQgKi8KKyNkZWZpbmUgUFJfMl9SRVBPUlRfRFVQX0RJUkVOVCAgMHgwMjAwNDMgIC8qIER1cGxpY2F0ZSBkaXJlY3RvcnkgZW50cnkgZm91bmQgKi8KKworLyoKKyAqIFBhc3MgMyBlcnJvcnMKKyAqLworCisjZGVmaW5lIFBSXzNfUEFTU19IRUFERVIgICAgICAgICAgICAweDAzMDAwMCAgLyogUGFzcyAzOiBDaGVja2luZyBkaXJlY3RvcnkgY29ubmVjdGl2aXR5ICovCisjZGVmaW5lIFBSXzNfTk9fUk9PVF9JTk9ERSAgICAgICAgICAweDAzMDAwMSAgLyogUm9vdCBpbm9kZSBub3QgYWxsb2NhdGVkICovCisjZGVmaW5lIFBSXzNfRVhQQU5EX0xGX0RJUiAgICAgICAgICAweDAzMDAwMiAgLyogTm8gcm9vbSBpbiBsb3N0K2ZvdW5kICovCisjZGVmaW5lIFBSXzNfVU5DT05ORUNURURfRElSICAgICAgICAweDAzMDAwMyAgLyogVW5jb25uZWN0ZWQgZGlyZWN0b3J5IGlub2RlICovCisjZGVmaW5lIFBSXzNfTk9fTEZfRElSICAgICAgICAgICAgICAweDAzMDAwNCAgLyogL2xvc3QrZm91bmQgbm90IGZvdW5kICovCisjZGVmaW5lIFBSXzNfQkFEX0RPVF9ET1QgICAgICAgICAgICAweDAzMDAwNSAgLyogLi4gZW50cnkgaXMgaW5jb3JyZWN0ICovCisjZGVmaW5lIFBSXzNfTk9fTFBGICAgICAgICAgICAgICAgICAweDAzMDAwNiAgLyogQmFkIG9yIG5vbi1leGlzdGVudCAvbG9zdCtmb3VuZC4gIENhbm5vdCByZWNvbm5lY3QgKi8KKyNkZWZpbmUgUFJfM19DQU5UX0VYUEFORF9MUEYgICAgICAgIDB4MDMwMDA3ICAvKiBDb3VsZCBub3QgZXhwYW5kIC9sb3N0K2ZvdW5kICovCisjZGVmaW5lIFBSXzNfQ0FOVF9SRUNPTk5FQ1QgICAgICAgICAweDAzMDAwOCAgLyogQ291bGQgbm90IHJlY29ubmVjdCBpbm9kZSAqLworI2RlZmluZSBQUl8zX0VSUl9GSU5EX0xQRiAgICAgICAgICAgMHgwMzAwMDkgIC8qIEVycm9yIHdoaWxlIHRyeWluZyB0byBmaW5kIC9sb3N0K2ZvdW5kICovCisjZGVmaW5lIFBSXzNfRVJSX0xQRl9ORVdfQkxPQ0sgICAgICAweDAzMDAwQSAgLyogRXJyb3IgaW4gZXh0MmZzX25ld19ibG9jayB3aGlsZSBjcmVhdGluZyAvbG9zdCtmb3VuZCAqLworI2RlZmluZSBQUl8zX0VSUl9MUEZfTkVXX0lOT0RFICAgICAgMHgwMzAwMEIgIC8qIEVycm9yIGluIGV4dDJmc19uZXdfaW5vZGUgd2hpbGUgY3JlYXRpbmcgL2xvc3QrZm91bmQgKi8KKyNkZWZpbmUgUFJfM19FUlJfTFBGX05FV19ESVJfQkxPQ0sgIDB4MDMwMDBDICAvKiBFcnJvciBpbiBleHQyZnNfbmV3X2Rpcl9ibG9jayB3aGlsZSBjcmVhdGluZyAvbG9zdCtmb3VuZCAqLworI2RlZmluZSBQUl8zX0VSUl9MUEZfV1JJVEVfQkxPQ0sgICAgMHgwMzAwMEQgIC8qIEVycm9yIHdoaWxlIHdyaXRpbmcgZGlyZWN0b3J5IGJsb2NrIGZvciAvbG9zdCtmb3VuZCAqLworI2RlZmluZSBQUl8zX0FESlVTVF9JTk9ERSAgICAgICAgICAgMHgwMzAwMEUgIC8qIEVycm9yIHdoaWxlIGFkanVzdGluZyBpbm9kZSBjb3VudCAqLworI2RlZmluZSBQUl8zX0ZJWF9QQVJFTlRfRVJSICAgICAgICAgMHgwMzAwMEYgIC8qIENvdWxkbid0IGZpeCBwYXJlbnQgZGlyZWN0b3J5IC0tIGVycm9yICovCisjZGVmaW5lIFBSXzNfRklYX1BBUkVOVF9OT0ZJTkQgICAgICAweDAzMDAxMCAgLyogQ291bGRuJ3QgZml4IHBhcmVudCBkaXJlY3RvcnkgLS0gY291bGRuJ3QgZmluZCBpdCAqLworI2RlZmluZSBQUl8zX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IgMHgwMzAwMTEgIC8qIEVycm9yIGFsbG9jYXRpbmcgaW5vZGUgYml0bWFwICovCisjZGVmaW5lIFBSXzNfQ1JFQVRFX1JPT1RfRVJST1IgICAgICAweDAzMDAxMiAgLyogRXJyb3IgY3JlYXRpbmcgcm9vdCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfM19DUkVBVEVfTFBGX0VSUk9SICAgICAgIDB4MDMwMDEzICAvKiBFcnJvciBjcmVhdGluZyBsb3N0IGFuZCBmb3VuZCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfM19ST09UX05PVF9ESVJfQUJPUlQgICAgIDB4MDMwMDE0ICAvKiBSb290IGlub2RlIGlzIG5vdCBkaXJlY3Rvcnk7IGFib3J0aW5nICovCisjZGVmaW5lIFBSXzNfTk9fUk9PVF9JTk9ERV9BQk9SVCAgICAweDAzMDAxNSAgLyogQ2Fubm90IHByb2NlZWQgd2l0aG91dCBhIHJvb3QgaW5vZGUuICovCisjZGVmaW5lIFBSXzNfTk9fRElSSU5GTyAgICAgICAgICAgICAweDAzMDAxNiAgLyogSW50ZXJuYWwgZXJyb3I6IGNvdWxkbid0IGZpbmQgZGlyX2luZm8gKi8KKyNkZWZpbmUgUFJfM19MUEZfTk9URElSICAgICAgICAgICAgIDB4MDMwMDE3ICAvKiBMb3N0K2ZvdW5kIGlzIG5vdCBhIGRpcmVjdG9yeSAqLworCisvKgorICogUGFzcyAzYSAtLS0gcmVoYXNoaW5nIGRpcmV0b3JpZXMKKyAqLworI2RlZmluZSBQUl8zQV9QQVNTX0hFQURFUiAgICAgICAgIDB4MDMxMDAwICAvKiBQYXNzIDNhOiBSZWluZGV4aW5nIGRpcmVjdG9yaWVzICovCisjZGVmaW5lIFBSXzNBX09QVElNSVpFX0lURVIgICAgICAgMHgwMzEwMDEgIC8qIEVycm9yIGl0ZXJhdGluZyBvdmVyIGRpcmVjdG9yaWVzICovCisjZGVmaW5lIFBSXzNBX09QVElNSVpFX0RJUl9FUlIgICAgMHgwMzEwMDIgIC8qIEVycm9yIHJlaGFzaCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfM0FfT1BUSU1JWkVfRElSX0hFQURFUiAweDAzMTAwMyAgLyogUmVoYXNoaW5nIGRpciBoZWFkZXIgKi8KKyNkZWZpbmUgUFJfM0FfT1BUSU1JWkVfRElSICAgICAgICAweDAzMTAwNCAgLyogUmVoYXNoaW5nIGRpcmVjdG9yeSAlZCAqLworI2RlZmluZSBQUl8zQV9PUFRJTUlaRV9ESVJfRU5EICAgIDB4MDMxMDA1ICAvKiBSZWhhc2hpbmcgZGlyIGVuZCAqLworCisvKgorICogUGFzcyA0IGVycm9ycworICovCisKKyNkZWZpbmUgUFJfNF9QQVNTX0hFQURFUiAgICAgICAgMHgwNDAwMDAgIC8qIFBhc3MgNDogQ2hlY2tpbmcgcmVmZXJlbmNlIGNvdW50cyAqLworI2RlZmluZSBQUl80X1pFUk9fTEVOX0lOT0RFICAgICAweDA0MDAwMSAgLyogVW5hdHRhY2hlZCB6ZXJvLWxlbmd0aCBpbm9kZSAqLworI2RlZmluZSBQUl80X1VOQVRUQUNIRURfSU5PREUgICAweDA0MDAwMiAgLyogVW5hdHRhY2hlZCBpbm9kZSAqLworI2RlZmluZSBQUl80X0JBRF9SRUZfQ09VTlQgICAgICAweDA0MDAwMyAgLyogSW5vZGUgcmVmIGNvdW50IHdyb25nICovCisjZGVmaW5lIFBSXzRfSU5DT05TSVNURU5UX0NPVU5UIDB4MDQwMDA0ICAvKiBJbmNvbnNpc3RlbnQgaW5vZGUgY291bnQgaW5mb3JtYXRpb24gY2FjaGVkICovCisKKy8qCisgKiBQYXNzIDUgZXJyb3JzCisgKi8KKworI2RlZmluZSBQUl81X1BBU1NfSEVBREVSICAgICAgICAgICAgMHgwNTAwMDAgIC8qIFBhc3MgNTogQ2hlY2tpbmcgZ3JvdXAgc3VtbWFyeSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQUl81X0lOT0RFX0JNQVBfUEFERElORyAgICAgMHgwNTAwMDEgIC8qIFBhZGRpbmcgYXQgZW5kIG9mIGlub2RlIGJpdG1hcCBpcyBub3Qgc2V0LiAqLworI2RlZmluZSBQUl81X0JMT0NLX0JNQVBfUEFERElORyAgICAgMHgwNTAwMDIgIC8qIFBhZGRpbmcgYXQgZW5kIG9mIGJsb2NrIGJpdG1hcCBpcyBub3Qgc2V0LiAqLworI2RlZmluZSBQUl81X0JMT0NLX0JJVE1BUF9IRUFERVIgICAgMHgwNTAwMDMgIC8qIEJsb2NrIGJpdG1hcCBkaWZmZXJlbmNlcyBoZWFkZXIgKi8KKyNkZWZpbmUgUFJfNV9CTE9DS19VTlVTRUQgICAgICAgICAgIDB4MDUwMDA0ICAvKiBCbG9jayBub3QgdXNlZCwgYnV0IG1hcmtlZCBpbiBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfNV9CTE9DS19VU0VEICAgICAgICAgICAgIDB4MDUwMDA1ICAvKiBCbG9jayB1c2VkLCBidXQgbm90IG1hcmtlZCB1c2VkIGluIGJpdG1hcCAqLworI2RlZmluZSBQUl81X0JMT0NLX0JJVE1BUF9FTkQgICAgICAgMHgwNTAwMDYgIC8qIEJsb2NrIGJpdG1hcCBkaWZmZXJlbmNlcyBlbmQgKi8KKyNkZWZpbmUgUFJfNV9JTk9ERV9CSVRNQVBfSEVBREVSICAgIDB4MDUwMDA3ICAvKiBJbm9kZSBiaXRtYXAgZGlmZmVyZW5jZXMgaGVhZGVyICovCisjZGVmaW5lIFBSXzVfSU5PREVfVU5VU0VEICAgICAgICAgICAweDA1MDAwOCAgLyogSW5vZGUgbm90IHVzZWQsIGJ1dCBtYXJrZWQgaW4gYml0bWFwICovCisjZGVmaW5lIFBSXzVfSU5PREVfVVNFRCAgICAgICAgICAgICAweDA1MDAwOSAgLyogSW5vZGUgdXNlZCwgYnV0IG5vdCBtYXJrZWQgdXNlZCBpbiBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfNV9JTk9ERV9CSVRNQVBfRU5EICAgICAgIDB4MDUwMDBBICAvKiBJbm9kZSBiaXRtYXAgZGlmZmVyZW5jZXMgZW5kICovCisjZGVmaW5lIFBSXzVfRlJFRV9JTk9ERV9DT1VOVF9HUk9VUCAweDA1MDAwQiAgLyogRnJlZSBpbm9kZXMgY291bnQgZm9yIGdyb3VwIHdyb25nICovCisjZGVmaW5lIFBSXzVfRlJFRV9ESVJfQ09VTlRfR1JPVVAgICAweDA1MDAwQyAgLyogRGlyZWN0b3JpZXMgY291bnQgZm9yIGdyb3VwIHdyb25nICovCisjZGVmaW5lIFBSXzVfRlJFRV9JTk9ERV9DT1VOVCAgICAgICAweDA1MDAwRCAgLyogRnJlZSBpbm9kZXMgY291bnQgd3JvbmcgKi8KKyNkZWZpbmUgUFJfNV9GUkVFX0JMT0NLX0NPVU5UX0dST1VQIDB4MDUwMDBFICAvKiBGcmVlIGJsb2NrcyBjb3VudCBmb3IgZ3JvdXAgd3JvbmcgKi8KKyNkZWZpbmUgUFJfNV9GUkVFX0JMT0NLX0NPVU5UICAgICAgIDB4MDUwMDBGICAvKiBGcmVlIGJsb2NrcyBjb3VudCB3cm9uZyAqLworI2RlZmluZSBQUl81X0JNQVBfRU5EUE9JTlRTICAgICAgICAgMHgwNTAwMTAgIC8qIFByb2dyYW1taW5nIGVycm9yOiBiaXRtYXAgZW5kcG9pbnRzIGRvbid0IG1hdGNoICovCisjZGVmaW5lIFBSXzVfRlVER0VfQklUTUFQX0VSUk9SICAgICAweDA1MDAxMSAgLyogSW50ZXJuYWwgZXJyb3I6IGZ1ZGdpbmcgZW5kIG9mIGJpdG1hcCAqLworI2RlZmluZSBQUl81X0NPUFlfSUJJVE1BUF9FUlJPUiAgICAgMHgwNTAwMTIgIC8qIEVycm9yIGNvcHlpbmcgaW4gcmVwbGFjZW1lbnQgaW5vZGUgYml0bWFwICovCisjZGVmaW5lIFBSXzVfQ09QWV9CQklUTUFQX0VSUk9SICAgICAweDA1MDAxMyAgLyogRXJyb3IgY29weWluZyBpbiByZXBsYWNlbWVudCBibG9jayBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfNV9CTE9DS19SQU5HRV9VTlVTRUQgICAgIDB4MDUwMDE0ICAvKiBCbG9jayByYW5nZSBub3QgdXNlZCwgYnV0IG1hcmtlZCBpbiBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfNV9CTE9DS19SQU5HRV9VU0VEICAgICAgIDB4MDUwMDE1ICAvKiBCbG9jayByYW5nZSB1c2VkLCBidXQgbm90IG1hcmtlZCB1c2VkIGluIGJpdG1hcCAqLworI2RlZmluZSBQUl81X0lOT0RFX1JBTkdFX1VOVVNFRCAgICAgMHgwNTAwMTYgIC8qIElub2RlIHJhbmdlIG5vdCB1c2VkLCBidXQgbWFya2VkIGluIGJpdG1hcCAqLworI2RlZmluZSBQUl81X0lOT0RFX1JBTkdFX1VTRUQgICAgICAgMHgwNTAwMTcgIC8qIElub2RlIHJhbmdldXNlZCwgYnV0IG5vdCBtYXJrZWQgdXNlZCBpbiBiaXRtYXAgKi8KKworCisvKgorICogVGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmU7IHN0b3JlcyBkaXJlY3RvcnkgaW5mb3JtYXRpb24KKyAqIGNvbGxlY3RlZCBpbiBlYXJsaWVyIHBhc3NlcywgdG8gYXZvaWQgZGlzayBpL28gaW4gZmV0Y2hpbmcgdGhlCisgKiBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBkaXJfaW5mbyB7CisJZXh0Ml9pbm9fdCAgICAgICAgICAgICAgaW5vOyAgICAvKiBJbm9kZSBudW1iZXIgKi8KKwlleHQyX2lub190ICAgICAgICAgICAgICBkb3Rkb3Q7IC8qIFBhcmVudCBhY2NvcmRpbmcgdG8gJy4uJyAqLworCWV4dDJfaW5vX3QgICAgICAgICAgICAgIHBhcmVudDsgLyogUGFyZW50IGFjY29yZGluZyB0byB0cmVld2FsayAqLworfTsKKworCisKKy8qCisgKiBUaGUgaW5kZXhlZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24gc3RydWN0dXJlOyBzdG9yZXMgaW5mb3JtYXRpb24gZm9yCisgKiBkaXJlY3RvcmllcyB3aGljaCBjb250YWluIGEgaGFzaCB0cmVlIGluZGV4LgorICovCitzdHJ1Y3QgZHhfZGlyX2luZm8geworCWV4dDJfaW5vX3QgICAgICAgICAgICAgIGlubzsgICAgICAgICAgICAvKiBJbm9kZSBudW1iZXIgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBudW1ibG9ja3M7ICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyAqLworCWludCAgICAgICAgICAgICAgICAgICAgIGhhc2h2ZXJzaW9uOworCXNob3J0ICAgICAgICAgICAgICAgICAgIGRlcHRoOyAgICAgICAgICAvKiBkZXB0aCBvZiB0cmVlICovCisJc3RydWN0IGR4X2RpcmJsb2NrX2luZm8gKmR4X2Jsb2NrOyAgICAgIC8qIEFycmF5IG9mIHNpemUgbnVtYmxvY2tzICovCit9OworCisvKgorICogRGVmaW5lIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgcmVmY291bnQgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IGVhX3JlZmNvdW50ICpleHQyX3JlZmNvdW50X3Q7CisKK3N0cnVjdCBlMmZzY2tfc3RydWN0IHsKKwlleHQyX2ZpbHN5cyBmczsKKwljb25zdCBjaGFyICpwcm9ncmFtX25hbWU7CisJY2hhciAqZmlsZXN5c3RlbV9uYW1lOworCWNoYXIgKmRldmljZV9uYW1lOworCWNoYXIgKmlvX29wdGlvbnM7CisJaW50ICAgICBmbGFnczsgICAgICAgICAgLyogRTJmc2NrIGludGVybmFsIGZsYWdzICovCisJaW50ICAgICBvcHRpb25zOworCWJsa190ICAgdXNlX3N1cGVyYmxvY2s7IC8qIHNiIHJlcXVlc3RlZCBieSB1c2VyICovCisJYmxrX3QgICBzdXBlcmJsb2NrOyAgICAgLyogc2IgdXNlZCB0byBvcGVuIGZzICovCisJaW50ICAgICBibG9ja3NpemU7ICAgICAgLyogYmxvY2tzaXplICovCisJYmxrX3QgICBudW1fYmxvY2tzOyAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworCWludCAgICAgbW91bnRfZmxhZ3M7CisJYmxraWRfY2FjaGUgYmxraWQ7ICAgICAgLyogYmxraWQgY2FjaGUgKi8KKworCWptcF9idWYgYWJvcnRfbG9jOworCisJdW5zaWduZWQgbG9uZyBhYm9ydF9jb2RlOworCisJaW50ICgqcHJvZ3Jlc3MpKGUyZnNja190IGN0eCwgaW50IHBhc3MsIHVuc2lnbmVkIGxvbmcgY3VyLAorCQkJdW5zaWduZWQgbG9uZyBtYXgpOworCisJZXh0MmZzX2lub2RlX2JpdG1hcCBpbm9kZV91c2VkX21hcDsgLyogSW5vZGVzIHdoaWNoIGFyZSBpbiB1c2UgKi8KKwlleHQyZnNfaW5vZGVfYml0bWFwIGlub2RlX2JhZF9tYXA7IC8qIElub2RlcyB3aGljaCBhcmUgYmFkIHNvbWVob3cgKi8KKwlleHQyZnNfaW5vZGVfYml0bWFwIGlub2RlX2Rpcl9tYXA7IC8qIElub2RlcyB3aGljaCBhcmUgZGlyZWN0b3JpZXMgKi8KKwlleHQyZnNfaW5vZGVfYml0bWFwIGlub2RlX2ltYWdpY19tYXA7IC8qIEFGUyBpbm9kZXMgKi8KKwlleHQyZnNfaW5vZGVfYml0bWFwIGlub2RlX3JlZ19tYXA7IC8qIElub2RlcyB3aGljaCBhcmUgcmVndWxhciBmaWxlcyovCisKKwlleHQyZnNfYmxvY2tfYml0bWFwIGJsb2NrX2ZvdW5kX21hcDsgLyogQmxvY2tzIHdoaWNoIGFyZSBpbiB1c2UgKi8KKwlleHQyZnNfYmxvY2tfYml0bWFwIGJsb2NrX2R1cF9tYXA7IC8qIEJsa3MgcmVmZXJlbmNlZCBtb3JlIHRoYW4gb25jZSAqLworCWV4dDJmc19ibG9ja19iaXRtYXAgYmxvY2tfZWFfbWFwOyAvKiBCbG9ja3Mgd2hpY2ggYXJlIHVzZWQgYnkgRUEncyAqLworCisJLyoKKwkgKiBJbm9kZSBjb3VudCBhcnJheXMKKwkgKi8KKwlleHQyX2ljb3VudF90ICAgaW5vZGVfY291bnQ7CisJZXh0Ml9pY291bnRfdCBpbm9kZV9saW5rX2luZm87CisKKwlleHQyX3JlZmNvdW50X3QgcmVmY291bnQ7CisJZXh0Ml9yZWZjb3VudF90IHJlZmNvdW50X2V4dHJhOworCisJLyoKKwkgKiBBcnJheSBvZiBmbGFncyBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gaW5vZGUgYml0bWFwLCBibG9jaworCSAqIGJpdG1hcCwgb3IgaW5vZGUgdGFibGUgaXMgaW52YWxpZAorCSAqLworCWludCAqaW52YWxpZF9pbm9kZV9iaXRtYXBfZmxhZzsKKwlpbnQgKmludmFsaWRfYmxvY2tfYml0bWFwX2ZsYWc7CisJaW50ICppbnZhbGlkX2lub2RlX3RhYmxlX2ZsYWc7CisJaW50IGludmFsaWRfYml0bWFwczsgICAgLyogVGhlcmUgYXJlIGludmFsaWQgYml0bWFwcy9pdGFibGUgKi8KKworCS8qCisJICogQmxvY2sgYnVmZmVyCisJICovCisJY2hhciAqYmxvY2tfYnVmOworCisJLyoKKwkgKiBGb3IgcGFzczFfY2hlY2tfZGlyZWN0b3J5IGFuZCBwYXNzMV9nZXRfYmxvY2tzCisJICovCisJZXh0Ml9pbm9fdCBzdGFzaGVkX2lubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqc3Rhc2hlZF9pbm9kZTsKKworCS8qCisJICogTG9jYXRpb24gb2YgdGhlIGxvc3QgYW5kIGZvdW5kIGRpcmVjdG9yeQorCSAqLworCWV4dDJfaW5vX3QgbG9zdF9hbmRfZm91bmQ7CisJaW50IGJhZF9sb3N0X2FuZF9mb3VuZDsKKworCS8qCisJICogRGlyZWN0b3J5IGluZm9ybWF0aW9uCisJICovCisJaW50ICAgICAgICAgICAgIGRpcl9pbmZvX2NvdW50OworCWludCAgICAgICAgICAgICBkaXJfaW5mb19zaXplOworCXN0cnVjdCBkaXJfaW5mbyAqZGlyX2luZm87CisKKwkvKgorCSAqIEluZGV4ZWQgZGlyZWN0b3J5IGluZm9ybWF0aW9uCisJICovCisJaW50ICAgICAgICAgICAgIGR4X2Rpcl9pbmZvX2NvdW50OworCWludCAgICAgICAgICAgICBkeF9kaXJfaW5mb19zaXplOworCXN0cnVjdCBkeF9kaXJfaW5mbyAqZHhfZGlyX2luZm87CisKKwkvKgorCSAqIERpcmVjdG9yaWVzIHRvIGhhc2gKKwkgKi8KKwlleHQyX3UzMl9saXN0ICAgZGlyc190b19oYXNoOworCisJLyoKKwkgKiBUdW5pbmcgcGFyYW1ldGVycworCSAqLworCWludCBwcm9jZXNzX2lub2RlX3NpemU7CisJaW50IGlub2RlX2J1ZmZlcl9ibG9ja3M7CisKKwkvKgorCSAqIGV4dDMgam91cm5hbCBzdXBwb3J0CisJICovCisJaW9fY2hhbm5lbCAgICAgIGpvdXJuYWxfaW87CisJY2hhciAgICAqam91cm5hbF9uYW1lOworCisJLyoKKwkgKiBIb3cgd2UgZGlzcGxheSB0aGUgcHJvZ3Jlc3MgdXBkYXRlIChmb3IgdW5peCkKKwkgKi8KKwlpbnQgcHJvZ3Jlc3NfZmQ7CisJaW50IHByb2dyZXNzX3BvczsKKwlpbnQgcHJvZ3Jlc3NfbGFzdF9wZXJjZW50OworCXVuc2lnbmVkIGludCBwcm9ncmVzc19sYXN0X3RpbWU7CisJaW50IGludGVyYWN0aXZlOyAgICAgICAgLyogQXJlIHdlIGNvbm5lY3RlZCBkaXJlY3RseSB0byBhIHR0eT8gKi8KKwljaGFyIHN0YXJ0X21ldGFbMl0sIHN0b3BfbWV0YVsyXTsKKworCS8qIEZpbGUgY291bnRzICovCisJaW50IGZzX2RpcmVjdG9yeV9jb3VudDsKKwlpbnQgZnNfcmVndWxhcl9jb3VudDsKKwlpbnQgZnNfYmxvY2tkZXZfY291bnQ7CisJaW50IGZzX2NoYXJkZXZfY291bnQ7CisJaW50IGZzX2xpbmtzX2NvdW50OworCWludCBmc19zeW1saW5rc19jb3VudDsKKwlpbnQgZnNfZmFzdF9zeW1saW5rc19jb3VudDsKKwlpbnQgZnNfZmlmb19jb3VudDsKKwlpbnQgZnNfdG90YWxfY291bnQ7CisJaW50IGZzX3NvY2tldHNfY291bnQ7CisJaW50IGZzX2luZF9jb3VudDsKKwlpbnQgZnNfZGluZF9jb3VudDsKKwlpbnQgZnNfdGluZF9jb3VudDsKKwlpbnQgZnNfZnJhZ21lbnRlZDsKKwlpbnQgbGFyZ2VfZmlsZXM7CisJaW50IGZzX2V4dF9hdHRyX2lub2RlczsKKwlpbnQgZnNfZXh0X2F0dHJfYmxvY2tzOworCisJaW50IGV4dF9hdHRyX3ZlcjsKKworCS8qCisJICogRm9yIHRoZSB1c2Ugb2YgY2FsbGVycyBvZiB0aGUgZTJmc2NrIGZ1bmN0aW9uczsgbm90IHVzZWQgYnkKKwkgKiBlMmZzY2sgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuCisJICovCisJdm9pZCAqcHJpdl9kYXRhOworfTsKKworCisjZGVmaW5lIHRpZF9ndCh4LCB5KSAgKCh4IC0geSkgPiAwKQorCitzdGF0aWMgaW5saW5lIGludCB0aWRfZ2VxKHRpZF90IHgsIHRpZF90IHkpCit7CisJaW50IGRpZmZlcmVuY2UgPSAoeCAtIHkpOworCXJldHVybiAoZGlmZmVyZW5jZSA+PSAwKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyNjMwYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMTggQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitORUVERUQtJChDT05GSUdfQ0hBVFRSKSA9IHkKK05FRURFRC0kKENPTkZJR19MU0FUVFIpID0geQorTkVFREVELSQoQ09ORklHX01LRTJGUykgPSB5CitORUVERUQtJChDT05GSUdfVFVORTJGUykgPSB5CisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKE5FRURFRC15KSArPSBmZ2V0c2V0ZmxhZ3MubyBmZ2V0c2V0dmVyc2lvbi5vIHBmLm8gaW9kLm8gbW50b3B0cy5vIFwKKyAgICAgICAgICAgZmVhdHVyZS5vIGxzLm8gdXVpZC5vIHBlLm8gb3N0eXBlLm8gcHMubyBoYXNoc3RyLm8gXAorICAgICAgICAgICBwYXJzZV9udW0ubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2UycC5oIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2UycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDJkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvZTJwLmgKQEAgLTAsMCArMSw2NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIE5lZWRlZCBieSBkaXJlbnQuaCBvbiBuZXRic2QgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSAiLi4vZXh0MmZzL2V4dDJfZnMuaCIKKworI2RlZmluZSBFMlBfRkVBVFVSRV9DT01QQVQJMAorI2RlZmluZSBFMlBfRkVBVFVSRV9JTkNPTVBBVAkxCisjZGVmaW5lIEUyUF9GRUFUVVJFX1JPX0lOQ09NUEFUCTIKKyNpZm5kZWYgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMgICAgICAgICAgIDB4MDA0MAorI2VuZGlmCisKKy8qIGBvcHRpb25zJyBmb3IgcHJpbnRfZTJmbGFncygpICovCisKKyNkZWZpbmUgUEZPUFRfTE9ORyAgMSAvKiBNdXN0IGJlIDEgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBgaW50IGxvbmdfZm9ybWF0Jy4gKi8KKworLyppbnQgZmdldHZlcnNpb24gKGNvbnN0IGNoYXIgKiBuYW1lLCB1bnNpZ25lZCBsb25nICogdmVyc2lvbik7Ki8KKy8qaW50IGZzZXR2ZXJzaW9uIChjb25zdCBjaGFyICogbmFtZSwgdW5zaWduZWQgbG9uZyB2ZXJzaW9uKTsqLworaW50IGZnZXRzZXR2ZXJzaW9uKGNvbnN0IGNoYXIgKiBuYW1lLCB1bnNpZ25lZCBsb25nICogZ2V0X3ZlcnNpb24sIHVuc2lnbmVkIGxvbmcgc2V0X3ZlcnNpb24pOworI2RlZmluZSBmZ2V0dmVyc2lvbihuYW1lLCB2ZXJzaW9uKSBmZ2V0c2V0dmVyc2lvbihuYW1lLCB2ZXJzaW9uLCAwKQorI2RlZmluZSBmc2V0dmVyc2lvbihuYW1lLCB2ZXJzaW9uKSBmZ2V0c2V0dmVyc2lvbihuYW1lLCBOVUxMLCB2ZXJzaW9uKQorCisvKmludCBmZ2V0ZmxhZ3MgKGNvbnN0IGNoYXIgKiBuYW1lLCB1bnNpZ25lZCBsb25nICogZmxhZ3MpOyovCisvKmludCBmc2V0ZmxhZ3MgKGNvbnN0IGNoYXIgKiBuYW1lLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsqLworaW50IGZnZXRzZXRmbGFncyhjb25zdCBjaGFyICogbmFtZSwgdW5zaWduZWQgbG9uZyAqIGdldF9mbGFncywgdW5zaWduZWQgbG9uZyBzZXRfZmxhZ3MpOworI2RlZmluZSBmZ2V0ZmxhZ3MobmFtZSwgZmxhZ3MpIGZnZXRzZXRmbGFncyhuYW1lLCBmbGFncywgMCkKKyNkZWZpbmUgZnNldGZsYWdzKG5hbWUsIGZsYWdzKSBmZ2V0c2V0ZmxhZ3MobmFtZSwgTlVMTCwgZmxhZ3MpCisKK2ludCBnZXRmbGFncyAoaW50IGZkLCB1bnNpZ25lZCBsb25nICogZmxhZ3MpOworaW50IGdldHZlcnNpb24gKGludCBmZCwgdW5zaWduZWQgbG9uZyAqIHZlcnNpb24pOworaW50IGl0ZXJhdGVfb25fZGlyIChjb25zdCBjaGFyICogZGlyX25hbWUsCisJCSAgICBpbnQgKCpmdW5jKSAoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGlyZW50ICosIHZvaWQgKiksCisJCSAgICB2b2lkICogcHJpdmF0ZSk7CisvKnZvaWQgbGlzdF9zdXBlcihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIHMpOyovCit2b2lkIGxpc3Rfc3VwZXIyKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogcywgRklMRSAqZik7CisjZGVmaW5lIGxpc3Rfc3VwZXIocykgbGlzdF9zdXBlcjIocywgc3Rkb3V0KQordm9pZCBwcmludF9mc19lcnJvcnMgKEZJTEUgKmYsIHVuc2lnbmVkIHNob3J0IGVycm9ycyk7Cit2b2lkIHByaW50X2ZsYWdzIChGSUxFICpmLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBvcHRpb25zKTsKK3ZvaWQgcHJpbnRfZnNfc3RhdGUgKEZJTEUgKmYsIHVuc2lnbmVkIHNob3J0IHN0YXRlKTsKK2ludCBzZXRmbGFncyAoaW50IGZkLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBzZXR2ZXJzaW9uIChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgdmVyc2lvbik7CisKK2NvbnN0IGNoYXIgKmUycF9mZWF0dXJlMnN0cmluZyhpbnQgY29tcGF0LCB1bnNpZ25lZCBpbnQgbWFzayk7CitpbnQgZTJwX3N0cmluZzJmZWF0dXJlKGNoYXIgKnN0cmluZywgaW50ICpjb21wYXQsIHVuc2lnbmVkIGludCAqbWFzayk7CitpbnQgZTJwX2VkaXRfZmVhdHVyZShjb25zdCBjaGFyICpzdHIsIF9fdTMyICpjb21wYXRfYXJyYXksIF9fdTMyICpva19hcnJheSk7CisKK2ludCBlMnBfaXNfbnVsbF91dWlkKHZvaWQgKnV1KTsKK3ZvaWQgZTJwX3V1aWRfdG9fc3RyKHZvaWQgKnV1LCBjaGFyICpvdXQpOworY29uc3QgY2hhciAqZTJwX3V1aWQyc3RyKHZvaWQgKnV1KTsKKworY29uc3QgY2hhciAqZTJwX2hhc2gyc3RyaW5nKGludCBudW0pOworaW50IGUycF9zdHJpbmcyaGFzaChjaGFyICpzdHJpbmcpOworCitjb25zdCBjaGFyICplMnBfbW50b3B0MnN0cmluZyh1bnNpZ25lZCBpbnQgbWFzayk7CitpbnQgZTJwX3N0cmluZzJtbnRvcHQoY2hhciAqc3RyaW5nLCB1bnNpZ25lZCBpbnQgKm1hc2spOworaW50IGUycF9lZGl0X21udG9wdHMoY29uc3QgY2hhciAqc3RyLCBfX3UzMiAqbW50b3B0cywgX191MzIgb2spOworCit1bnNpZ25lZCBsb25nIHBhcnNlX251bV9ibG9ja3MoY29uc3QgY2hhciAqYXJnLCBpbnQgbG9nX2Jsb2NrX3NpemUpOworCitjaGFyICplMnBfb3Myc3RyaW5nKGludCBvc190eXBlKTsKK2ludCBlMnBfc3RyaW5nMm9zKGNoYXIgKnN0cik7CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvZmVhdHVyZS5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2ZlYXR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDU3NTRmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2ZlYXR1cmUuYwpAQCAtMCwwICsxLDE4NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmVhdHVyZS5jIC0tLSBjb252ZXJ0IGJldHdlZW4gZmVhdHVyZXMgYW5kIHN0cmluZ3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgIFRoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZTJwLmgiCisKK3N0cnVjdCBmZWF0dXJlIHsKKwlpbnQJCWNvbXBhdDsKKwl1bnNpZ25lZCBpbnQJbWFzazsKKwljb25zdCBjaGFyCSpzdHJpbmc7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZlYXR1cmUgZmVhdHVyZV9saXN0W10gPSB7CisJewlFMlBfRkVBVFVSRV9DT01QQVQsIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DLAorCQkJImRpcl9wcmVhbGxvYyIgfSwKKwl7CUUyUF9GRUFUVVJFX0NPTVBBVCwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCwKKwkJCSJoYXNfam91cm5hbCIgfSwKKwl7CUUyUF9GRUFUVVJFX0NPTVBBVCwgRVhUMl9GRUFUVVJFX0NPTVBBVF9JTUFHSUNfSU5PREVTLAorCQkJImltYWdpY19pbm9kZXMiIH0sCisJewlFMlBfRkVBVFVSRV9DT01QQVQsIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIsCisJCQkiZXh0X2F0dHIiIH0sCisJewlFMlBfRkVBVFVSRV9DT01QQVQsIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYLAorCQkJImRpcl9pbmRleCIgfSwKKwl7CUUyUF9GRUFUVVJFX0NPTVBBVCwgRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUsCisJCQkicmVzaXplX2lub2RlIiB9LAorCXsJRTJQX0ZFQVRVUkVfUk9fSU5DT01QQVQsIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSLAorCQkJInNwYXJzZV9zdXBlciIgfSwKKwl7CUUyUF9GRUFUVVJFX1JPX0lOQ09NUEFULCBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUsCisJCQkibGFyZ2VfZmlsZSIgfSwKKwl7CUUyUF9GRUFUVVJFX0lOQ09NUEFULCBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NJT04sCisJCQkiY29tcHJlc3Npb24iIH0sCisJewlFMlBfRkVBVFVSRV9JTkNPTVBBVCwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFLAorCQkJImZpbGV0eXBlIiB9LAorCXsJRTJQX0ZFQVRVUkVfSU5DT01QQVQsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSLAorCQkJIm5lZWRzX3JlY292ZXJ5IiB9LAorCXsJRTJQX0ZFQVRVUkVfSU5DT01QQVQsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFViwKKwkJCSJqb3VybmFsX2RldiIgfSwKKwl7CUUyUF9GRUFUVVJFX0lOQ09NUEFULCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUywKKwkJCSJleHRlbnRzIiB9LAorCXsJRTJQX0ZFQVRVUkVfSU5DT01QQVQsIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHLAorCQkJIm1ldGFfYmciIH0sCisJewkwLCAwLCAwIH0sCit9OworCitjb25zdCBjaGFyICplMnBfZmVhdHVyZTJzdHJpbmcoaW50IGNvbXBhdCwgdW5zaWduZWQgaW50IG1hc2spCit7CisJY29uc3Qgc3RydWN0IGZlYXR1cmUgKmY7CisJc3RhdGljIGNoYXIgYnVmWzIwXTsKKwljaGFyIGZjaGFyOworCWludCBmbnVtOworCisJZm9yIChmID0gZmVhdHVyZV9saXN0OyBmLT5zdHJpbmc7IGYrKykgeworCQlpZiAoKGNvbXBhdCA9PSBmLT5jb21wYXQpICYmCisJCSAgICAobWFzayA9PSBmLT5tYXNrKSkKKwkJCXJldHVybiBmLT5zdHJpbmc7CisJfQorCXN3aXRjaCAoY29tcGF0KSB7CisJY2FzZSBFMlBfRkVBVFVSRV9DT01QQVQ6CisJCWZjaGFyID0gJ0MnOworCQlicmVhazsKKwljYXNlIEUyUF9GRUFUVVJFX0lOQ09NUEFUOgorCQlmY2hhciA9ICdJJzsKKwkJYnJlYWs7CisJY2FzZSBFMlBfRkVBVFVSRV9ST19JTkNPTVBBVDoKKwkJZmNoYXIgPSAnUic7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZjaGFyID0gJz8nOworCQlicmVhazsKKwl9CisJZm9yIChmbnVtID0gMDsgbWFzayA+Pj0gMTsgZm51bSsrKTsKKwkJc3ByaW50ZihidWYsICJGRUFUVVJFXyVjJWQiLCBmY2hhciwgZm51bSk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IGUycF9zdHJpbmcyZmVhdHVyZShjaGFyICpzdHJpbmcsIGludCAqY29tcGF0X3R5cGUsIHVuc2lnbmVkIGludCAqbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgZmVhdHVyZSAqZjsKKwljaGFyICplcHRyOworCWludCBudW07CisKKwlmb3IgKGYgPSBmZWF0dXJlX2xpc3Q7IGYtPnN0cmluZzsgZisrKSB7CisJCWlmICghc3RyY2FzZWNtcChzdHJpbmcsIGYtPnN0cmluZykpIHsKKwkJCSpjb21wYXRfdHlwZSA9IGYtPmNvbXBhdDsKKwkJCSptYXNrID0gZi0+bWFzazsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChzdHJuY2FzZWNtcChzdHJpbmcsICJGRUFUVVJFXyIsIDgpKQorCQlyZXR1cm4gMTsKKworCXN3aXRjaCAoc3RyaW5nWzhdKSB7CisJY2FzZSAnYyc6CisJY2FzZSAnQyc6CisJCSpjb21wYXRfdHlwZSA9IEUyUF9GRUFUVVJFX0NPTVBBVDsKKwkJYnJlYWs7CisJY2FzZSAnaSc6CisJY2FzZSAnSSc6CisJCSpjb21wYXRfdHlwZSA9IEUyUF9GRUFUVVJFX0lOQ09NUEFUOworCQlicmVhazsKKwljYXNlICdyJzoKKwljYXNlICdSJzoKKwkJKmNvbXBhdF90eXBlID0gRTJQX0ZFQVRVUkVfUk9fSU5DT01QQVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KKwlpZiAoc3RyaW5nWzldID09IDApCisJCXJldHVybiAxOworCW51bSA9IHN0cnRvbChzdHJpbmcrOSwgJmVwdHIsIDEwKTsKKwlpZiAobnVtID4gMzIgfHwgbnVtIDwgMCkKKwkJcmV0dXJuIDE7CisJaWYgKCplcHRyKQorCQlyZXR1cm4gMTsKKwkqbWFzayA9IDEgPDwgbnVtOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKnNraXBfb3Zlcl9ibGFua3MoY2hhciAqY3ApCit7CisJd2hpbGUgKCpjcCAmJiBpc3NwYWNlKCpjcCkpCisJCWNwKys7CisJcmV0dXJuIGNwOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKnNraXBfb3Zlcl93b3JkKGNoYXIgKmNwKQoreworCXdoaWxlICgqY3AgJiYgIWlzc3BhY2UoKmNwKSAmJiAqY3AgIT0gJywnKQorCQljcCsrOworCXJldHVybiBjcDsKK30KKworLyoKKyAqIEVkaXQgYSBmZWF0dXJlIHNldCBhcnJheSBhcyByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuICBUaGUgb2tfYXJyYXksCisgKiBpZiBzZXQsIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gbGltaXQgd2hhdCBmZWF0dXJlcyB0aGUgdXNlciBpcworICogYWxsb3dlZCB0byBzZXQgb3IgY2xlYXIgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IGUycF9lZGl0X2ZlYXR1cmUoY29uc3QgY2hhciAqc3RyLCBfX3UzMiAqY29tcGF0X2FycmF5LCBfX3UzMiAqb2tfYXJyYXkpCit7CisJY2hhcgkqY3AsICpidWYsICpuZXh0OworCWludAluZWc7CisJdW5zaWduZWQgaW50CW1hc2s7CisJaW50CQljb21wYXRfdHlwZTsKKworCWJ1ZiA9IHhzdHJkdXAoc3RyKTsKKwljcCA9IGJ1ZjsKKwl3aGlsZSAoY3AgJiYgKmNwKSB7CisJCW5lZyA9IDA7CisJCWNwID0gc2tpcF9vdmVyX2JsYW5rcyhjcCk7CisJCW5leHQgPSBza2lwX292ZXJfd29yZChjcCk7CisJCWlmICgqbmV4dCA9PSAwKQorCQkJbmV4dCA9IDA7CisJCWVsc2UKKwkJCSpuZXh0ID0gMDsKKwkJc3dpdGNoICgqY3ApIHsKKwkJY2FzZSAnLSc6CisJCWNhc2UgJ14nOgorCQkJbmVnKys7CisJCWNhc2UgJysnOgorCQkJY3ArKzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlMnBfc3RyaW5nMmZlYXR1cmUoY3AsICZjb21wYXRfdHlwZSwgJm1hc2spKQorCQkJcmV0dXJuIDE7CisJCWlmIChva19hcnJheSAmJiAhKG9rX2FycmF5W2NvbXBhdF90eXBlXSAmIG1hc2spKQorCQkJcmV0dXJuIDE7CisJCWlmIChuZWcpCisJCQljb21wYXRfYXJyYXlbY29tcGF0X3R5cGVdICY9IH5tYXNrOworCQllbHNlCisJCQljb21wYXRfYXJyYXlbY29tcGF0X3R5cGVdIHw9IG1hc2s7CisJCWNwID0gbmV4dCA/IG5leHQrMSA6IDA7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2ZnZXRzZXRmbGFncy5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2ZnZXRzZXRmbGFncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGI3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvZmdldHNldGZsYWdzLmMKQEAgLTAsMCArMSw3MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmdldGZsYWdzLmMJCS0gR2V0IGEgZmlsZSBmbGFncyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKiBmc2V0ZmxhZ3MuYwkJLSBTZXQgYSBmaWxlIGZsYWdzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDkzLzEwLzMwCS0gQ3JlYXRpb24KKyAqLworCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWZkZWYgSEFWRV9FWFQyX0lPQ1RMUworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImUycC5oIgorCisjaWZkZWYgT19MQVJHRUZJTEUKKyNkZWZpbmUgT1BFTl9GTEFHUyAoT19SRE9OTFl8T19OT05CTE9DS3xPX0xBUkdFRklMRSkKKyNlbHNlCisjZGVmaW5lIE9QRU5fRkxBR1MgKE9fUkRPTkxZfE9fTk9OQkxPQ0spCisjZW5kaWYKKworaW50IGZnZXRzZXRmbGFncyAoY29uc3QgY2hhciAqIG5hbWUsIHVuc2lnbmVkIGxvbmcgKiBnZXRfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc2V0X2ZsYWdzKQoreworI2lmZGVmIEhBVkVfRVhUMl9JT0NUTFMKKwlzdHJ1Y3Qgc3RhdCBidWY7CisJaW50IGZkLCByLCBmLCBzYXZlX2Vycm5vID0gMDsKKworCWlmICghc3RhdChuYW1lLCAmYnVmKSAmJgorCSAgICAhU19JU1JFRyhidWYuc3RfbW9kZSkgJiYgIVNfSVNESVIoYnVmLnN0X21vZGUpKSB7CisJCWdvdG8gbm90c3VwcDsKKwl9CisJZmQgPSBvcGVuIChuYW1lLCBPUEVOX0ZMQUdTKTsKKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAoIWdldF9mbGFncykgeworCQlmID0gKGludCkgc2V0X2ZsYWdzOworCQlyID0gaW9jdGwgKGZkLCBFWFQyX0lPQ19TRVRGTEFHUywgJmYpOworCX0gZWxzZSB7CisJCXIgPSBpb2N0bCAoZmQsIEVYVDJfSU9DX0dFVEZMQUdTLCAmZik7CisJCSpnZXRfZmxhZ3MgPSBmOworCX0KKwlpZiAociA9PSAtMSkKKwkJc2F2ZV9lcnJubyA9IGVycm5vOworCWNsb3NlIChmZCk7CisJaWYgKHNhdmVfZXJybm8pCisJCWVycm5vID0gc2F2ZV9lcnJubzsKKwlyZXR1cm4gcjsKK25vdHN1cHA6CisjZW5kaWYgLyogSEFWRV9FWFQyX0lPQ1RMUyAqLworCWVycm5vID0gRU9QTk9UU1VQUDsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvZmdldHNldHZlcnNpb24uYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9mZ2V0c2V0dmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzkwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvZmdldHNldHZlcnNpb24uYwpAQCAtMCwwICsxLDcwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmZ2V0dmVyc2lvbi5jCS0gR2V0IGEgZmlsZSB2ZXJzaW9uIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KKyAqIGZzZXR2ZXJzaW9uLmMJLSBTZXQgYSBmaWxlIHZlcnNpb24gb24gYW4gZXh0MiBmaWxlIHN5c3RlbQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDkzLzEwLzMwCS0gQ3JlYXRpb24KKyAqLworCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlICJlMnAuaCIKKworI2lmZGVmIE9fTEFSR0VGSUxFCisjZGVmaW5lIE9QRU5fRkxBR1MgKE9fUkRPTkxZfE9fTk9OQkxPQ0t8T19MQVJHRUZJTEUpCisjZWxzZQorI2RlZmluZSBPUEVOX0ZMQUdTIChPX1JET05MWXxPX05PTkJMT0NLKQorI2VuZGlmCisKKy8qCisgICBUbyBkbyBmc2V0dmVyc2lvbjogICAgIHVuc2lnbmVkIGxvbmcgKnB0cl92ZXJzaW9uIG11c3QgYmUgc2V0IHRvIE5VTEwuCisJCSAgICAgIGFuZCB1bnNpZ25lZCBsb25nIHZlcnNpb24gbXVzdCBiZSBzZXQgdG8gYSB2YWx1ZQorICAgVG8gZG8gZmdldHZlcnNpb246ICAgICB1bnNpZ25lZCBsb25nICpwdHJfdmVyc2lvbiBtdXN0IE5PVCBiZSBzZXQgdG8gTlVMTAorCQkgICAgICBhbmQgdW5zaWduZWQgbG9uZyB2ZXJzaW9uIGlzIGlnbm9yZWQuCisJVElUTy4KKyovCisKK2ludCBmZ2V0c2V0dmVyc2lvbiAoY29uc3QgY2hhciAqIG5hbWUsIHVuc2lnbmVkIGxvbmcgKiBnZXRfdmVyc2lvbiwgdW5zaWduZWQgbG9uZyBzZXRfdmVyc2lvbikKK3sKKyNpZmRlZiBIQVZFX0VYVDJfSU9DVExTCisJaW50IGZkLCByLCB2ZXIsIHNhdmVfZXJybm8gPSAwOworCisJZmQgPSBvcGVuIChuYW1lLCBPUEVOX0ZMQUdTKTsKKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAoIWdldF92ZXJzaW9uKSB7CisJCXZlciA9IChpbnQpIHNldF92ZXJzaW9uOworCQlyID0gaW9jdGwgKGZkLCBFWFQyX0lPQ19TRVRWRVJTSU9OLCAmdmVyKTsKKwl9IGVsc2UgeworCQlyID0gaW9jdGwgKGZkLCBFWFQyX0lPQ19HRVRWRVJTSU9OLCAmdmVyKTsKKwkJKmdldF92ZXJzaW9uID0gdmVyOworCX0KKwlpZiAociA9PSAtMSkKKwkJc2F2ZV9lcnJubyA9IGVycm5vOworCWNsb3NlIChmZCk7CisJaWYgKHNhdmVfZXJybm8pCisJCWVycm5vID0gc2F2ZV9lcnJubzsKKwlyZXR1cm4gcjsKKyNlbHNlIC8qICEgSEFWRV9FWFQyX0lPQ1RMUyAqLworCWVycm5vID0gRU9QTk9UU1VQUDsKKwlyZXR1cm4gLTE7CisjZW5kaWYgLyogISBIQVZFX0VYVDJfSU9DVExTICovCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvaGFzaHN0ci5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2hhc2hzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTdmZmFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2hhc2hzdHIuYwpAQCAtMCwwICsxLDcwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmZWF0dXJlLmMgLS0tIGNvbnZlcnQgYmV0d2VlbiBmZWF0dXJlcyBhbmQgc3RyaW5ncworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSAgVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJlMnAuaCIKKworc3RydWN0IGhhc2ggeworCWludCBudW07CisJY29uc3QgY2hhciAqc3RyaW5nOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoYXNoIGhhc2hfbGlzdFtdID0geworCXsgRVhUMl9IQVNIX0xFR0FDWSwgICAibGVnYWN5IiB9LAorCXsgRVhUMl9IQVNIX0hBTEZfTUQ0LCAiaGFsZl9tZDQiIH0sCisJeyBFWFQyX0hBU0hfVEVBLCAgICAgICJ0ZWEiIH0sCisJeyAwLCAwIH0sCit9OworCitjb25zdCBjaGFyICplMnBfaGFzaDJzdHJpbmcoaW50IG51bSkKK3sKKwljb25zdCBzdHJ1Y3QgaGFzaCAqcDsKKwlzdGF0aWMgY2hhciBidWZbMjBdOworCisJZm9yIChwID0gaGFzaF9saXN0OyBwLT5zdHJpbmc7IHArKykgeworCQlpZiAobnVtID09IHAtPm51bSkKKwkJCXJldHVybiBwLT5zdHJpbmc7CisJfQorCXNwcmludGYoYnVmLCAiSEFTSEFMR18lZCIsIG51bSk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIGhhc2ggYWxnb3JpdGhtLCBvciAtMSBvbiBlcnJvcgorICovCitpbnQgZTJwX3N0cmluZzJoYXNoKGNoYXIgKnN0cmluZykKK3sKKwljb25zdCBzdHJ1Y3QgaGFzaCAqcDsKKwljaGFyICplcHRyOworCWludCBudW07CisKKwlmb3IgKHAgPSBoYXNoX2xpc3Q7IHAtPnN0cmluZzsgcCsrKSB7CisJCWlmICghc3RyY2FzZWNtcChzdHJpbmcsIHAtPnN0cmluZykpIHsKKwkJCXJldHVybiBwLT5udW07CisJCX0KKwl9CisJaWYgKHN0cm5jYXNlY21wKHN0cmluZywgIkhBU0hBTEdfIiwgOCkpCisJCXJldHVybiAtMTsKKworCWlmIChzdHJpbmdbOF0gPT0gMCkKKwkJcmV0dXJuIC0xOworCW51bSA9IHN0cnRvbChzdHJpbmcrOCwgJmVwdHIsIDEwKTsKKwlpZiAobnVtID4gMjU1IHx8IG51bSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoKmVwdHIpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gbnVtOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2lvZC5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2lvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYWI4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvaW9kLmMKQEAgLTAsMCArMSw1MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaW9kLmMJCS0gSXRlcmF0ZSBhIGZ1bmN0aW9uIG9uIGVhY2ggZW50cnkgb2YgYSBkaXJlY3RvcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDkzLzEwLzMwCS0gQ3JlYXRpb24KKyAqLworCisjaW5jbHVkZSAiZTJwLmgiCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBpdGVyYXRlX29uX2RpciAoY29uc3QgY2hhciAqIGRpcl9uYW1lLAorCQkgICAgaW50ICgqZnVuYykgKGNvbnN0IGNoYXIgKiwgc3RydWN0IGRpcmVudCAqLCB2b2lkICopLAorCQkgICAgdm9pZCAqIHByaXZhdGUpCit7CisJRElSICogZGlyOworCXN0cnVjdCBkaXJlbnQgKmRlLCAqZGVwOworCWludAltYXhfbGVuLCBsZW47CisKKwltYXhfbGVuID0gUEFUSF9NQVggKyBzaXplb2Yoc3RydWN0IGRpcmVudCk7CisJZGUgPSB4bWFsbG9jKG1heF9sZW4rMSk7CisJbWVtc2V0KGRlLCAwLCBtYXhfbGVuKzEpOworCisJZGlyID0gb3BlbmRpciAoZGlyX25hbWUpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQlmcmVlKGRlKTsKKwkJcmV0dXJuIC0xOworCX0KKwl3aGlsZSAoKGRlcCA9IHJlYWRkaXIgKGRpcikpKSB7CisJCWxlbiA9IHNpemVvZihzdHJ1Y3QgZGlyZW50KTsKKwkJaWYgKGxlbiA8IGRlcC0+ZF9yZWNsZW4pCisJCQlsZW4gPSBkZXAtPmRfcmVjbGVuOworCQlpZiAobGVuID4gbWF4X2xlbikKKwkJCWxlbiA9IG1heF9sZW47CisJCW1lbWNweShkZSwgZGVwLCBsZW4pOworCQkoKmZ1bmMpIChkaXJfbmFtZSwgZGUsIHByaXZhdGUpOworCX0KKwlmcmVlKGRlKTsKKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2xzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDI5ZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2xzLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxzLmMJCQktIExpc3QgdGhlIGNvbnRlbnRzIG9mIGFuIGV4dDJmcyBzdXBlcmJsb2NrCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyAgVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImUycC5oIgorCitzdGF0aWMgdm9pZCBwcmludF91c2VyKHVuc2lnbmVkIHNob3J0IHVpZCwgRklMRSAqZikKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisJZnByaW50ZihmLCAiJXUgKHVzZXIgJXMpXG4iLCB1aWQsCisJCQkocHcgPT0gTlVMTCA/ICJ1bmtub3duIiA6IHB3LT5wd19uYW1lKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2dyb3VwKHVuc2lnbmVkIHNob3J0IGdpZCwgRklMRSAqZikKK3sKKwlzdHJ1Y3QgZ3JvdXAgKmdyID0gZ2V0Z3JnaWQoZ2lkKTsKKwlmcHJpbnRmKGYsICIldSAoZ3JvdXAgJXMpXG4iLCBnaWQsCisJCQkoZ3IgPT0gTlVMTCA/ICJ1bmtub3duIiA6IGdyLT5ncl9uYW1lKSk7Cit9CisKKyNkZWZpbmUgTU9OVEhfSU5UICg4NjQwMCAqIDMwKQorI2RlZmluZSBXRUVLX0lOVCAoODY0MDAgKiA3KQorI2RlZmluZSBEQVlfSU5UCSg4NjQwMCkKKyNkZWZpbmUgSE9VUl9JTlQgKDYwICogNjApCisjZGVmaW5lIE1JTlVURV9JTlQgKDYwKQorCitzdGF0aWMgY29uc3QgY2hhciAqaW50ZXJ2YWxfc3RyaW5nKHVuc2lnbmVkIGludCBzZWNzKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdLCB0bXBbODBdOworCWludAkJaHIsIG1pbiwgbnVtOworCisJYnVmWzBdID0gMDsKKworCWlmIChzZWNzID09IDApCisJCXJldHVybiAiPG5vbmU+IjsKKworCWlmIChzZWNzID49IE1PTlRIX0lOVCkgeworCQludW0gPSBzZWNzIC8gTU9OVEhfSU5UOworCQlzZWNzIC09IG51bSpNT05USF9JTlQ7CisJCXNwcmludGYoYnVmLCAiJWQgbW9udGglcyIsIG51bSwgKG51bT4xKSA/ICJzIiA6ICIiKTsKKwl9CisJaWYgKHNlY3MgPj0gV0VFS19JTlQpIHsKKwkJbnVtID0gc2VjcyAvIFdFRUtfSU5UOworCQlzZWNzIC09IG51bSpXRUVLX0lOVDsKKwkJc3ByaW50Zih0bXAsICIlcyVkIHdlZWslcyIsIGJ1ZlswXSA/ICIsICIgOiAiIiwKKwkJCW51bSwgKG51bT4xKSA/ICJzIiA6ICIiKTsKKwkJc3RyY2F0KGJ1ZiwgdG1wKTsKKwl9CisJaWYgKHNlY3MgPj0gREFZX0lOVCkgeworCQludW0gPSBzZWNzIC8gREFZX0lOVDsKKwkJc2VjcyAtPSBudW0qREFZX0lOVDsKKwkJc3ByaW50Zih0bXAsICIlcyVkIGRheSVzIiwgYnVmWzBdID8gIiwgIiA6ICIiLAorCQkJbnVtLCAobnVtPjEpID8gInMiIDogIiIpOworCQlzdHJjYXQoYnVmLCB0bXApOworCX0KKwlpZiAoc2VjcyA+IDApIHsKKwkJaHIgPSBzZWNzIC8gSE9VUl9JTlQ7CisJCXNlY3MgLT0gaHIqSE9VUl9JTlQ7CisJCW1pbiA9IHNlY3MgLyBNSU5VVEVfSU5UOworCQlzZWNzIC09IG1pbipNSU5VVEVfSU5UOworCQlzcHJpbnRmKHRtcCwgIiVzJWQ6JTAyZDolMDJkIiwgYnVmWzBdID8gIiwgIiA6ICIiLAorCQkJaHIsIG1pbiwgc2Vjcyk7CisJCXN0cmNhdChidWYsIHRtcCk7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2ZlYXR1cmVzKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogcywgRklMRSAqZikKK3sKKyNpZmRlZiBFWFQyX0RZTkFNSUNfUkVWCisJaW50CWksIGosIHByaW50ZWQ9MDsKKwlfX3UzMgkqbWFzayA9ICZzLT5zX2ZlYXR1cmVfY29tcGF0LCBtOworCisJZnByaW50ZihmLCAiRmlsZXN5c3RlbSBmZWF0dXJlczogICAgICIpOworCWZvciAoaT0wOyBpIDwzOyBpKyssbWFzaysrKSB7CisJCWZvciAoaj0wLG09MTsgaiA8IDMyOyBqKyssIG08PD0xKSB7CisJCQlpZiAoKm1hc2sgJiBtKSB7CisJCQkJZnByaW50ZihmLCAiICVzIiwgZTJwX2ZlYXR1cmUyc3RyaW5nKGksIG0pKTsKKwkJCQlwcmludGVkKys7CisJCQl9CisJCX0KKwl9CisJaWYgKHByaW50ZWQgPT0gMCkKKwkJZnByaW50ZihmLCAiIChub25lKSIpOworCWZwcmludGYoZiwgIlxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbW50b3B0cyhzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIHMsIEZJTEUgKmYpCit7CisjaWZkZWYgRVhUMl9EWU5BTUlDX1JFVgorCWludAlpLCBwcmludGVkPTA7CisJX191MzIJbWFzayA9IHMtPnNfZGVmYXVsdF9tb3VudF9vcHRzLCBtOworCisJZnByaW50ZihmLCAiRGVmYXVsdCBtb3VudCBvcHRpb25zOiAgICIpOworCWlmIChtYXNrICYgRVhUM19ERUZNX0pNT0RFKSB7CisJCWZwcmludGYoZiwgIiAlcyIsIGUycF9tbnRvcHQyc3RyaW5nKG1hc2sgJiBFWFQzX0RFRk1fSk1PREUpKTsKKwkJcHJpbnRlZCsrOworCX0KKwlmb3IgKGk9MCxtPTE7IGkgPCAzMjsgaSsrLCBtPDw9MSkgeworCQlpZiAobSAmIEVYVDNfREVGTV9KTU9ERSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWFzayAmIG0pIHsKKwkJCWZwcmludGYoZiwgIiAlcyIsIGUycF9tbnRvcHQyc3RyaW5nKG0pKTsKKwkJCXByaW50ZWQrKzsKKwkJfQorCX0KKwlpZiAocHJpbnRlZCA9PSAwKQorCQlmcHJpbnRmKGYsICIgKG5vbmUpIik7CisJZnByaW50ZihmLCAiXG4iKTsKKyNlbmRpZgorfQorCisKKyNpZm5kZWYgRVhUMl9JTk9ERV9TSVpFCisjZGVmaW5lIEVYVDJfSU5PREVfU0laRShzKSBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpCisjZW5kaWYKKworI2lmbmRlZiBFWFQyX0dPT0RfT0xEX1JFVgorI2RlZmluZSBFWFQyX0dPT0RfT0xEX1JFViAwCisjZW5kaWYKKwordm9pZCBsaXN0X3N1cGVyMihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIHNiLCBGSUxFICpmKQoreworCWludCBpbm9kZV9ibG9ja3NfcGVyX2dyb3VwOworCWNoYXIgYnVmWzgwXSwgKnN0cjsKKwl0aW1lX3QJdG07CisKKwlpbm9kZV9ibG9ja3NfcGVyX2dyb3VwID0gKCgoc2ItPnNfaW5vZGVzX3Blcl9ncm91cCAqCisJCQkJICAgIEVYVDJfSU5PREVfU0laRShzYikpICsKKwkJCQkgICBFWFQyX0JMT0NLX1NJWkUoc2IpIC0gMSkgLworCQkJCSAgRVhUMl9CTE9DS19TSVpFKHNiKSk7CisJaWYgKHNiLT5zX3ZvbHVtZV9uYW1lWzBdKSB7CisJCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwkJc3RybmNweShidWYsIHNiLT5zX3ZvbHVtZV9uYW1lLCBzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKwl9IGVsc2UKKwkJc3RyY3B5KGJ1ZiwgIjxub25lPiIpOworCWZwcmludGYoZiwgIkZpbGVzeXN0ZW0gdm9sdW1lIG5hbWU6ICAgJXNcbiIsIGJ1Zik7CisJaWYgKHNiLT5zX2xhc3RfbW91bnRlZFswXSkgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXN0cm5jcHkoYnVmLCBzYi0+c19sYXN0X21vdW50ZWQsIHNpemVvZihzYi0+c19sYXN0X21vdW50ZWQpKTsKKwl9IGVsc2UKKwkJc3RyY3B5KGJ1ZiwgIjxub3QgYXZhaWxhYmxlPiIpOworCWZwcmludGYoZiwKKwkJIkxhc3QgbW91bnRlZCBvbjogICAgICAgICAgJXNcbiIKKwkJIkZpbGVzeXN0ZW0gVVVJRDogICAgICAgICAgJXNcbiIKKwkJIkZpbGVzeXN0ZW0gbWFnaWMgbnVtYmVyOiAgMHglMDRYXG4iCisJCSJGaWxlc3lzdGVtIHJldmlzaW9uICM6ICAgICVkIiwKKwkJYnVmLCBlMnBfdXVpZDJzdHIoc2ItPnNfdXVpZCksIHNiLT5zX21hZ2ljLCBzYi0+c19yZXZfbGV2ZWwpOworCWlmIChzYi0+c19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYpIHsKKwkJZnByaW50ZihmLCAiIChvcmlnaW5hbClcbiIpOworI2lmZGVmIEVYVDJfRFlOQU1JQ19SRVYKKwl9IGVsc2UgaWYgKHNiLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0RZTkFNSUNfUkVWKSB7CisJCWZwcmludGYoZiwgIiAoZHluYW1pYylcbiIpOworI2VuZGlmCisJfSBlbHNlCisJCWZwcmludGYoZiwgIiAodW5rbm93bilcbiIpOworCXByaW50X2ZlYXR1cmVzKHNiLCBmKTsKKwlwcmludF9tbnRvcHRzKHNiLCBmKTsKKwlmcHJpbnRmKGYsICJGaWxlc3lzdGVtIHN0YXRlOiAgICAgICAgIik7CisJcHJpbnRfZnNfc3RhdGUgKGYsIHNiLT5zX3N0YXRlKTsKKwlmcHJpbnRmKGYsICJcbkVycm9ycyBiZWhhdmlvcjogICAgICAgICAgIik7CisJcHJpbnRfZnNfZXJyb3JzKGYsIHNiLT5zX2Vycm9ycyk7CisJc3RyID0gZTJwX29zMnN0cmluZyhzYi0+c19jcmVhdG9yX29zKTsKKwlmcHJpbnRmKGYsCisJCSJcbiIKKwkJIkZpbGVzeXN0ZW0gT1MgdHlwZTogICAgICAgJXNcbiIKKwkJIklub2RlIGNvdW50OiAgICAgICAgICAgICAgJXVcbiIKKwkJIkJsb2NrIGNvdW50OiAgICAgICAgICAgICAgJXVcbiIKKwkJIlJlc2VydmVkIGJsb2NrIGNvdW50OiAgICAgJXVcbiIKKwkJIkZyZWUgYmxvY2tzOiAgICAgICAgICAgICAgJXVcbiIKKwkJIkZyZWUgaW5vZGVzOiAgICAgICAgICAgICAgJXVcbiIKKwkJIkZpcnN0IGJsb2NrOiAgICAgICAgICAgICAgJXVcbiIKKwkJIkJsb2NrIHNpemU6ICAgICAgICAgICAgICAgJXVcbiIKKwkJIkZyYWdtZW50IHNpemU6ICAgICAgICAgICAgJXVcbiIsCisJCXN0ciwgc2ItPnNfaW5vZGVzX2NvdW50LCBzYi0+c19ibG9ja3NfY291bnQsIHNiLT5zX3JfYmxvY2tzX2NvdW50LAorCQlzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCwgc2ItPnNfZnJlZV9pbm9kZXNfY291bnQsCisJCXNiLT5zX2ZpcnN0X2RhdGFfYmxvY2ssIEVYVDJfQkxPQ0tfU0laRShzYiksIEVYVDJfRlJBR19TSVpFKHNiKSk7CisJZnJlZShzdHIpOworCWlmIChzYi0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKQorCQlmcHJpbnRmKGYsICJSZXNlcnZlZCBHRFQgYmxvY2tzOiAgICAgICV1XG4iLAorCQkJc2ItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyk7CisJZnByaW50ZihmLAorCQkiQmxvY2tzIHBlciBncm91cDogICAgICAgICAldVxuIgorCQkiRnJhZ21lbnRzIHBlciBncm91cDogICAgICAldVxuIgorCQkiSW5vZGVzIHBlciBncm91cDogICAgICAgICAldVxuIgorCQkiSW5vZGUgYmxvY2tzIHBlciBncm91cDogICAldVxuIiwKKwkJc2ItPnNfYmxvY2tzX3Blcl9ncm91cCwgc2ItPnNfZnJhZ3NfcGVyX2dyb3VwLAorCQlzYi0+c19pbm9kZXNfcGVyX2dyb3VwLCBpbm9kZV9ibG9ja3NfcGVyX2dyb3VwKTsKKwlpZiAoc2ItPnNfZmlyc3RfbWV0YV9iZykKKwkJZnByaW50ZihmLCAiRmlyc3QgbWV0YSBibG9jayBncm91cDogICAldVxuIiwKKwkJCXNiLT5zX2ZpcnN0X21ldGFfYmcpOworCWlmIChzYi0+c19ta2ZzX3RpbWUpIHsKKwkJdG0gPSBzYi0+c19ta2ZzX3RpbWU7CisJCWZwcmludGYoZiwgIkZpbGVzeXN0ZW0gY3JlYXRlZDogICAgICAgJXMiLCBjdGltZSgmdG0pKTsKKwl9CisJdG0gPSBzYi0+c19tdGltZTsKKwlmcHJpbnRmKGYsICJMYXN0IG1vdW50IHRpbWU6ICAgICAgICAgICVzIiwKKwkJc2ItPnNfbXRpbWUgPyBjdGltZSgmdG0pIDogIm4vYVxuIik7CisJdG0gPSBzYi0+c193dGltZTsKKwlmcHJpbnRmKGYsCisJCSJMYXN0IHdyaXRlIHRpbWU6ICAgICAgICAgICVzIgorCQkiTW91bnQgY291bnQ6ICAgICAgICAgICAgICAldVxuIgorCQkiTWF4aW11bSBtb3VudCBjb3VudDogICAgICAlZFxuIiwKKwkJY3RpbWUoJnRtKSwgc2ItPnNfbW50X2NvdW50LCBzYi0+c19tYXhfbW50X2NvdW50KTsKKwl0bSA9IHNiLT5zX2xhc3RjaGVjazsKKwlmcHJpbnRmKGYsCisJCSJMYXN0IGNoZWNrZWQ6ICAgICAgICAgICAgICVzIgorCQkiQ2hlY2sgaW50ZXJ2YWw6ICAgICAgICAgICAldSAoJXMpXG4iLAorCQljdGltZSgmdG0pLAorCQlzYi0+c19jaGVja2ludGVydmFsLCBpbnRlcnZhbF9zdHJpbmcoc2ItPnNfY2hlY2tpbnRlcnZhbCkpOworCWlmIChzYi0+c19jaGVja2ludGVydmFsKQorCXsKKwkJdGltZV90IG5leHQ7CisKKwkJbmV4dCA9IHNiLT5zX2xhc3RjaGVjayArIHNiLT5zX2NoZWNraW50ZXJ2YWw7CisJCWZwcmludGYoZiwgIk5leHQgY2hlY2sgYWZ0ZXI6ICAgICAgICAgJXMiLCBjdGltZSgmbmV4dCkpOworCX0KKwlmcHJpbnRmKGYsICJSZXNlcnZlZCBibG9ja3MgdWlkOiAgICAgICIpOworCXByaW50X3VzZXIoc2ItPnNfZGVmX3Jlc3VpZCwgZik7CisJZnByaW50ZihmLCAiUmVzZXJ2ZWQgYmxvY2tzIGdpZDogICAgICAiKTsKKwlwcmludF9ncm91cChzYi0+c19kZWZfcmVzZ2lkLCBmKTsKKwlpZiAoc2ItPnNfcmV2X2xldmVsID49IEVYVDJfRFlOQU1JQ19SRVYpIHsKKwkJZnByaW50ZihmLAorCQkJIkZpcnN0IGlub2RlOiAgICAgICAgICAgICAgJWRcbiIKKwkJCSJJbm9kZSBzaXplOgkJICAlZFxuIiwKKwkJCXNiLT5zX2ZpcnN0X2lubywgc2ItPnNfaW5vZGVfc2l6ZSk7CisJfQorCWlmICghZTJwX2lzX251bGxfdXVpZChzYi0+c19qb3VybmFsX3V1aWQpKQorCQlmcHJpbnRmKGYsICJKb3VybmFsIFVVSUQ6ICAgICAgICAgICAgICVzXG4iLAorCQkJZTJwX3V1aWQyc3RyKHNiLT5zX2pvdXJuYWxfdXVpZCkpOworCWlmIChzYi0+c19qb3VybmFsX2ludW0pCisJCWZwcmludGYoZiwgIkpvdXJuYWwgaW5vZGU6ICAgICAgICAgICAgJXVcbiIsCisJCQlzYi0+c19qb3VybmFsX2ludW0pOworCWlmIChzYi0+c19qb3VybmFsX2RldikKKwkJZnByaW50ZihmLCAiSm91cm5hbCBkZXZpY2U6CSAgICAgICAgICAweCUwNHhcbiIsCisJCQlzYi0+c19qb3VybmFsX2Rldik7CisJaWYgKHNiLT5zX2xhc3Rfb3JwaGFuKQorCQlmcHJpbnRmKGYsICJGaXJzdCBvcnBoYW4gaW5vZGU6ICAgICAgICV1XG4iLAorCQkJc2ItPnNfbGFzdF9vcnBoYW4pOworCWlmICgoc2ItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCkgfHwKKwkgICAgc2ItPnNfZGVmX2hhc2hfdmVyc2lvbikKKwkJZnByaW50ZihmLCAiRGVmYXVsdCBkaXJlY3RvcnkgaGFzaDogICAlc1xuIiwKKwkJCWUycF9oYXNoMnN0cmluZyhzYi0+c19kZWZfaGFzaF92ZXJzaW9uKSk7CisJaWYgKCFlMnBfaXNfbnVsbF91dWlkKHNiLT5zX2hhc2hfc2VlZCkpCisJCWZwcmludGYoZiwgIkRpcmVjdG9yeSBIYXNoIFNlZWQ6ICAgICAgJXNcbiIsCisJCQllMnBfdXVpZDJzdHIoc2ItPnNfaGFzaF9zZWVkKSk7CisJaWYgKHNiLT5zX2pubF9iYWNrdXBfdHlwZSkgeworCQlmcHJpbnRmKGYsICJKb3VybmFsIGJhY2t1cDogICAgICAgICAgICIpOworCQlpZiAoc2ItPnNfam5sX2JhY2t1cF90eXBlID09IDEpCisJCQlmcHJpbnRmKGYsICJpbm9kZSBibG9ja3NcbiIpOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJ0eXBlICV1XG4iLCBzYi0+c19qbmxfYmFja3VwX3R5cGUpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9tbnRvcHRzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvbW50b3B0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YzI2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvbW50b3B0cy5jCkBAIC0wLDAgKzEsMTM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtb3VudG9wdHMuYyAtLS0gY29udmVydCBiZXR3ZWVuIGRlZmF1bHQgbW91bnQgb3B0aW9ucyBhbmQgc3RyaW5ncworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJlMnAuaCIKKworc3RydWN0IG1udG9wdCB7CisJdW5zaWduZWQgaW50CW1hc2s7CisJY29uc3QgY2hhcgkqc3RyaW5nOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtbnRvcHQgbW50b3B0X2xpc3RbXSA9IHsKKwl7IEVYVDJfREVGTV9ERUJVRywJImRlYnVnIiB9LAorCXsgRVhUMl9ERUZNX0JTREdST1VQUywJImJzZGdyb3VwcyIgfSwKKwl7IEVYVDJfREVGTV9YQVRUUl9VU0VSLAkidXNlcl94YXR0ciIgfSwKKwl7IEVYVDJfREVGTV9BQ0wsCSJhY2wiIH0sCisJeyBFWFQyX0RFRk1fVUlEMTYsCSJ1aWQxNiIgfSwKKwl7IEVYVDNfREVGTV9KTU9ERV9EQVRBLCAiam91cm5hbF9kYXRhIiB9LAorCXsgRVhUM19ERUZNX0pNT0RFX09SREVSRUQsICJqb3VybmFsX2RhdGFfb3JkZXJlZCIgfSwKKwl7IEVYVDNfREVGTV9KTU9ERV9XQkFDSywgImpvdXJuYWxfZGF0YV93cml0ZWJhY2siIH0sCisJeyAwLCAwIH0sCit9OworCitjb25zdCBjaGFyICplMnBfbW50b3B0MnN0cmluZyh1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgbW50b3B0ICAqZjsKKwlzdGF0aWMgY2hhciBidWZbMjBdOworCWludAlmbnVtOworCisJZm9yIChmID0gbW50b3B0X2xpc3Q7IGYtPnN0cmluZzsgZisrKSB7CisJCWlmIChtYXNrID09IGYtPm1hc2spCisJCQlyZXR1cm4gZi0+c3RyaW5nOworCX0KKwlmb3IgKGZudW0gPSAwOyBtYXNrID4+PSAxOyBmbnVtKyspOworCXNwcmludGYoYnVmLCAiTU5UT1BUXyVkIiwgZm51bSk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IGUycF9zdHJpbmcybW50b3B0KGNoYXIgKnN0cmluZywgdW5zaWduZWQgaW50ICptYXNrKQoreworCWNvbnN0IHN0cnVjdCBtbnRvcHQgICpmOworCWNoYXIJCSplcHRyOworCWludAkJbnVtOworCisJZm9yIChmID0gbW50b3B0X2xpc3Q7IGYtPnN0cmluZzsgZisrKSB7CisJCWlmICghc3RyY2FzZWNtcChzdHJpbmcsIGYtPnN0cmluZykpIHsKKwkJCSptYXNrID0gZi0+bWFzazsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChzdHJuY2FzZWNtcChzdHJpbmcsICJNTlRPUFRfIiwgOCkpCisJCXJldHVybiAxOworCisJaWYgKHN0cmluZ1s4XSA9PSAwKQorCQlyZXR1cm4gMTsKKwludW0gPSBzdHJ0b2woc3RyaW5nKzgsICZlcHRyLCAxMCk7CisJaWYgKG51bSA+IDMyIHx8IG51bSA8IDApCisJCXJldHVybiAxOworCWlmICgqZXB0cikKKwkJcmV0dXJuIDE7CisJKm1hc2sgPSAxIDw8IG51bTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnNraXBfb3Zlcl9ibGFua3MoY2hhciAqY3ApCit7CisJd2hpbGUgKCpjcCAmJiBpc3NwYWNlKCpjcCkpCisJCWNwKys7CisJcmV0dXJuIGNwOworfQorCitzdGF0aWMgY2hhciAqc2tpcF9vdmVyX3dvcmQoY2hhciAqY3ApCit7CisJd2hpbGUgKCpjcCAmJiAhaXNzcGFjZSgqY3ApICYmICpjcCAhPSAnLCcpCisJCWNwKys7CisJcmV0dXJuIGNwOworfQorCisvKgorICogRWRpdCBhIG1udG9wdCBzZXQgYXJyYXkgYXMgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLiAgVGhlIG9rCisgKiBwYXJhbWV0ZXIsIGlmIG5vbi16ZXJvLCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGxpbWl0IHdoYXQKKyAqIG1udG9wdHMgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBzZXQgb3IgY2xlYXIgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IGUycF9lZGl0X21udG9wdHMoY29uc3QgY2hhciAqc3RyLCBfX3UzMiAqbW50b3B0cywgX191MzIgb2spCit7CisJY2hhcgkqY3AsICpidWYsICpuZXh0OworCWludAluZWc7CisJdW5zaWduZWQgaW50CW1hc2s7CisKKwlidWYgPSB4c3RyZHVwKHN0cik7CisJY3AgPSBidWY7CisJd2hpbGUgKGNwICYmICpjcCkgeworCQluZWcgPSAwOworCQljcCA9IHNraXBfb3Zlcl9ibGFua3MoY3ApOworCQluZXh0ID0gc2tpcF9vdmVyX3dvcmQoY3ApOworCQlpZiAoKm5leHQgPT0gMCkKKwkJCW5leHQgPSAwOworCQllbHNlCisJCQkqbmV4dCA9IDA7CisJCXN3aXRjaCAoKmNwKSB7CisJCWNhc2UgJy0nOgorCQljYXNlICdeJzoKKwkJCW5lZysrOworCQljYXNlICcrJzoKKwkJCWNwKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZTJwX3N0cmluZzJtbnRvcHQoY3AsICZtYXNrKSkKKwkJCXJldHVybiAxOworCQlpZiAob2sgJiYgIShvayAmIG1hc2spKQorCQkJcmV0dXJuIDE7CisJCWlmIChtYXNrICYgRVhUM19ERUZNX0pNT0RFKQorCQkJKm1udG9wdHMgJj0gfkVYVDNfREVGTV9KTU9ERTsKKwkJaWYgKG5lZykKKwkJCSptbnRvcHRzICY9IH5tYXNrOworCQllbHNlCisJCQkqbW50b3B0cyB8PSBtYXNrOworCQljcCA9IG5leHQgPyBuZXh0KzEgOiAwOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9vc3R5cGUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9vc3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJmMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL29zdHlwZS5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGdldG9zdHlwZS5jICAgICAgICAgIC0gR2V0IHRoZSBGaWxlc3lzdGVtIE9TIHR5cGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKyNpbmNsdWRlICJlMnAuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG9zX3RhYltdID0KKwl7ICJMaW51eCIsCisJICAiSHVyZCIsCisJICAiTWFzaXgiLAorCSAgIkZyZWVCU0QiLAorCSAgIkxpdGVzIiwKKwkgIDAgfTsKKworLyoKKyAqIENvbnZlcnQgYW4gb3NfdHlwZSB0byBhIHN0cmluZworICovCitjaGFyICplMnBfb3Myc3RyaW5nKGludCBvc190eXBlKQoreworCWNvbnN0IGNoYXIgKm9zOworCWNoYXIgKnJldDsKKworCWlmIChvc190eXBlIDw9IEVYVDJfT1NfTElURVMpCisJCW9zID0gb3NfdGFiW29zX3R5cGVdOworCWVsc2UKKwkJb3MgPSAiKHVua25vd24gb3MpIjsKKworCXJldCA9IHhzdHJkdXAob3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuIG9zX3R5cGUgdG8gYSBzdHJpbmcKKyAqLworaW50IGUycF9zdHJpbmcyb3MoY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKmNvbnN0ICpjcHA7CisJaW50IGkgPSAwOworCisJZm9yIChjcHAgPSBvc190YWI7ICpjcHA7IGNwcCsrLCBpKyspIHsKKwkJaWYgKCFzdHJjYXNlY21wKHN0ciwgKmNwcCkpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC0xOworfQorCisjaWZkZWYgVEVTVF9QUk9HUkFNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhcgkqczsKKwlpbnQJaSwgb3M7CisKKwlmb3IgKGk9MDsgaSA8PSBFWFQyX09TX0xJVEVTOyBpKyspIHsKKwkJcyA9IGUycF9vczJzdHJpbmcoaSk7CisJCW9zID0gZTJwX3N0cmluZzJvcyhzKTsKKwkJcHJpbnRmKCIlZDogJXMgKCVkKVxuIiwgaSwgcywgb3MpOworCQlpZiAoaSAhPSBvcykgeworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsdXJlIVxuIik7CisJCQlleGl0KDEpOworCQl9CisJfQorCWV4aXQoMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wYXJzZV9udW0uYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wYXJzZV9udW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGIwNzZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL3BhcnNlX251bS5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBhcnNlX251bS5jCQktIFBhcnNlIHRoZSBudW1iZXIgb2YgYmxvY2tzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIFRoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisjaW5jbHVkZSAiZTJwLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordW5zaWduZWQgbG9uZyBwYXJzZV9udW1fYmxvY2tzKGNvbnN0IGNoYXIgKmFyZywgaW50IGxvZ19ibG9ja19zaXplKQoreworCWNoYXIgKnA7CisJdW5zaWduZWQgbG9uZyBsb25nIG51bTsKKworCW51bSA9IHN0cnRvdWxsKGFyZywgJnAsIDApOworCisJaWYgKHBbMF0gJiYgcFsxXSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKCpwKSB7CQkvKiBVc2luZyBmYWxsLXRocm91Z2ggbG9naWMgKi8KKwljYXNlICdUJzogY2FzZSAndCc6CisJCW51bSA8PD0gMTA7CisJY2FzZSAnRyc6IGNhc2UgJ2cnOgorCQludW0gPDw9IDEwOworCWNhc2UgJ00nOiBjYXNlICdtJzoKKwkJbnVtIDw8PSAxMDsKKwljYXNlICdLJzogY2FzZSAnayc6CisJCW51bSA+Pj0gbG9nX2Jsb2NrX3NpemU7CisJCWJyZWFrOworCWNhc2UgJ3MnOgorCQludW0gPj49IDE7CisJCWJyZWFrOworCWNhc2UgJ1wwJzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBudW07Cit9CisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgbnVtOworCWludCBsb2dfYmxvY2tfc2l6ZSA9IDA7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGFyZ1xuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJbnVtID0gcGFyc2VfbnVtX2Jsb2Nrcyhhcmd2WzFdLCBsb2dfYmxvY2tfc2l6ZSk7CisKKwlwcmludGYoIlBhcnNlZCBudW1iZXI6ICVsdVxuIiwgbnVtKTsKKwlleGl0KDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcGUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTI3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcGUuYwpAQCAtMCwwICsxLDMyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwZS5jCQkJLSBQcmludCBhIHNlY29uZCBleHRlbmRlZCBmaWxlc3lzdGVtIGVycm9ycyBiZWhhdmlvcgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCAgUmVteSBDYXJkIDxjYXJkQG1hc2kuaWJwLmZyPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJvcmF0b2lyZSBNQVNJLCBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKy8qCisgKiBIaXN0b3J5OgorICogOTQvMDEvMDkJLSBDcmVhdGlvbgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZTJwLmgiCisKK3ZvaWQgcHJpbnRfZnNfZXJyb3JzKEZJTEUgKmYsIHVuc2lnbmVkIHNob3J0IGVycm9ycykKK3sKKwljaGFyICpkaXNwID0gTlVMTDsKKwlzd2l0Y2ggKGVycm9ycykgeworCWNhc2UgRVhUMl9FUlJPUlNfQ09OVElOVUU6IGRpc3AgPSAiQ29udGludWUiOyBicmVhazsKKwljYXNlIEVYVDJfRVJST1JTX1JPOiAgICAgICBkaXNwID0gIlJlbW91bnQgcmVhZC1vbmx5IjsgYnJlYWs7CisJY2FzZSBFWFQyX0VSUk9SU19QQU5JQzogICAgZGlzcCA9ICJQYW5pYyI7IGJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIGRpc3AgPSAiVW5rbm93biAoY29udGludWUpIjsKKwl9CisJZnByaW50ZihmLCBkaXNwKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wZi5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL3BmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjYmVjNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wZi5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBmLmMJCQktIFByaW50IGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiA5My8xMC8zMAktIENyZWF0aW9uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJlMnAuaCIKKworc3RydWN0IGZsYWdzX25hbWUgeworCXVuc2lnbmVkIGxvbmcJZmxhZzsKKwljb25zdCBjaGFyCSpzaG9ydF9uYW1lOworCWNvbnN0IGNoYXIJKmxvbmdfbmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmxhZ3NfbmFtZSBmbGFnc19hcnJheVtdID0geworCXsgRVhUMl9TRUNSTV9GTCwgInMiLCAiU2VjdXJlX0RlbGV0aW9uIiB9LAorCXsgRVhUMl9VTlJNX0ZMLCAidSIgLCAiVW5kZWxldGUiIH0sCisJeyBFWFQyX1NZTkNfRkwsICJTIiwgIlN5bmNocm9ub3VzX1VwZGF0ZXMiIH0sCisJeyBFWFQyX0RJUlNZTkNfRkwsICJEIiwgIlN5bmNocm9ub3VzX0RpcmVjdG9yeV9VcGRhdGVzIiB9LAorCXsgRVhUMl9JTU1VVEFCTEVfRkwsICJpIiwgIkltbXV0YWJsZSIgfSwKKwl7IEVYVDJfQVBQRU5EX0ZMLCAiYSIsICJBcHBlbmRfT25seSIgfSwKKwl7IEVYVDJfTk9EVU1QX0ZMLCAiZCIsICJOb19EdW1wIiB9LAorCXsgRVhUMl9OT0FUSU1FX0ZMLCAiQSIsICJOb19BdGltZSIgfSwKKwl7IEVYVDJfQ09NUFJfRkwsICJjIiwgIkNvbXByZXNzaW9uX1JlcXVlc3RlZCIgfSwKKyNpZmRlZiBFTkFCTEVfQ09NUFJFU1NJT04KKwl7IEVYVDJfQ09NUFJCTEtfRkwsICJCIiwgIkNvbXByZXNzZWRfRmlsZSIgfSwKKwl7IEVYVDJfRElSVFlfRkwsICJaIiwgIkNvbXByZXNzZWRfRGlydHlfRmlsZSIgfSwKKwl7IEVYVDJfTk9DT01QUl9GTCwgIlgiLCAiQ29tcHJlc3Npb25fUmF3X0FjY2VzcyIgfSwKKwl7IEVYVDJfRUNPTVBSX0ZMLCAiRSIsICJDb21wcmVzc2lvbl9FcnJvciIgfSwKKyNlbmRpZgorCXsgRVhUM19KT1VSTkFMX0RBVEFfRkwsICJqIiwgIkpvdXJuYWxlZF9EYXRhIiB9LAorCXsgRVhUMl9JTkRFWF9GTCwgIkkiLCAiSW5kZXhlZF9kaXJlY2N0b3J5IiB9LAorCXsgRVhUMl9OT1RBSUxfRkwsICJ0IiwgIk5vX1RhaWxtZXJnaW5nIiB9LAorCXsgRVhUMl9UT1BESVJfRkwsICJUIiwgIlRvcF9vZl9EaXJlY3RvcnlfSGllcmFyY2hpZXMiIH0sCisJeyAwLCBOVUxMLCBOVUxMIH0KK307CisKK3ZvaWQgcHJpbnRfZmxhZ3MgKEZJTEUgKmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIG9wdGlvbnMpCit7CisJaW50IGxvbmdfb3B0ID0gKG9wdGlvbnMgJiBQRk9QVF9MT05HKTsKKwljb25zdCBzdHJ1Y3QgZmxhZ3NfbmFtZSAqZnA7CisJaW50CWZpcnN0ID0gMTsKKworCWZvciAoZnAgPSBmbGFnc19hcnJheTsgZnAtPmZsYWcgIT0gMDsgZnArKykgeworCQlpZiAoZmxhZ3MgJiBmcC0+ZmxhZykgeworCQkJaWYgKGxvbmdfb3B0KSB7CisJCQkJaWYgKGZpcnN0KQorCQkJCQlmaXJzdCA9IDA7CisJCQkJZWxzZQorCQkJCQlmcHV0cygiLCAiLCBmKTsKKwkJCQlmcHV0cyhmcC0+bG9uZ19uYW1lLCBmKTsKKwkJCX0gZWxzZQorCQkJCWZwdXRzKGZwLT5zaG9ydF9uYW1lLCBmKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghbG9uZ19vcHQpCisJCQkJZnB1dHMoIi0iLCBmKTsKKwkJfQorCX0KKwlpZiAobG9uZ19vcHQgJiYgZmlyc3QpCisJCWZwdXRzKCItLS0iLCBmKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wcy5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiNDA5OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wcy5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBzLmMJCQktIFByaW50IGZpbGVzeXN0ZW0gc3RhdGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDkzLzEyLzIyCS0gQ3JlYXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImUycC5oIgorCit2b2lkIHByaW50X2ZzX3N0YXRlKEZJTEUgKmYsIHVuc2lnbmVkIHNob3J0IHN0YXRlKQoreworCWZwcmludGYoZiwgKHN0YXRlICYgRVhUMl9WQUxJRF9GUyA/ICIgY2xlYW4iIDogIiBub3QgY2xlYW4iKSk7CisJaWYgKHN0YXRlICYgRVhUMl9FUlJPUl9GUykKKwkJZnByaW50ZihmLCAiIHdpdGggZXJyb3JzIik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvdXVpZC5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL3V1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzRkNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL3V1aWQuYwpAQCAtMCwwICsxLDc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1dWlkLmMgLS0gdXRpbGl0eSByb3V0aW5lcyBmb3IgbWFuaXB1bGF0aW5nIFVVSUQncy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICIuLi9leHQyZnMvZXh0Ml90eXBlcy5oIgorCisjaW5jbHVkZSAiZTJwLmgiCisKK3N0cnVjdCB1dWlkIHsKKwlfX3UzMgl0aW1lX2xvdzsKKwlfX3UxNgl0aW1lX21pZDsKKwlfX3UxNgl0aW1lX2hpX2FuZF92ZXJzaW9uOworCV9fdTE2CWNsb2NrX3NlcTsKKwlfX3U4CW5vZGVbNl07Cit9OworCisvKiBSZXR1cm5zIDEgaWYgdGhlIHV1aWQgaXMgdGhlIE5VTEwgdXVpZCAqLworaW50IGUycF9pc19udWxsX3V1aWQodm9pZCAqdXUpCit7CisJX191OAkqY3A7CisJaW50CWk7CisKKwlmb3IgKGk9MCwgY3AgPSB1dTsgaSA8IDE2OyBpKyspCisJCWlmICgqY3ApCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZTJwX3VucGFja191dWlkKHZvaWQgKmluLCBzdHJ1Y3QgdXVpZCAqdXUpCit7CisJX191OAkqcHRyID0gaW47CisJX191MzIJdG1wOworCisJdG1wID0gKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXV1LT50aW1lX2xvdyA9IHRtcDsKKworCXRtcCA9ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXV1LT50aW1lX21pZCA9IHRtcDsKKworCXRtcCA9ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXV1LT50aW1lX2hpX2FuZF92ZXJzaW9uID0gdG1wOworCisJdG1wID0gKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdXUtPmNsb2NrX3NlcSA9IHRtcDsKKworCW1lbWNweSh1dS0+bm9kZSwgcHRyLCA2KTsKK30KKwordm9pZCBlMnBfdXVpZF90b19zdHIodm9pZCAqdXUsIGNoYXIgKm91dCkKK3sKKwlzdHJ1Y3QgdXVpZCB1dWlkOworCisJZTJwX3VucGFja191dWlkKHV1LCAmdXVpZCk7CisJc3ByaW50ZihvdXQsCisJCSIlMDh4LSUwNHgtJTA0eC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQl1dWlkLnRpbWVfbG93LCB1dWlkLnRpbWVfbWlkLCB1dWlkLnRpbWVfaGlfYW5kX3ZlcnNpb24sCisJCXV1aWQuY2xvY2tfc2VxID4+IDgsIHV1aWQuY2xvY2tfc2VxICYgMHhGRiwKKwkJdXVpZC5ub2RlWzBdLCB1dWlkLm5vZGVbMV0sIHV1aWQubm9kZVsyXSwKKwkJdXVpZC5ub2RlWzNdLCB1dWlkLm5vZGVbNF0sIHV1aWQubm9kZVs1XSk7Cit9CisKK2NvbnN0IGNoYXIgKmUycF91dWlkMnN0cih2b2lkICp1dSkKK3sKKwlzdGF0aWMgY2hhciBidWZbODBdOworCWlmIChlMnBfaXNfbnVsbF91dWlkKHV1KSkKKwkJcmV0dXJuICI8bm9uZT4iOworCWUycF91dWlkX3RvX3N0cih1dSwgYnVmKTsKKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFkYzZlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwyNiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK05FRURFRC0kKENPTkZJR19FMkZTQ0spID0geQorTkVFREVELSQoQ09ORklHX0ZTQ0spID0geQorTkVFREVELSQoQ09ORklHX01LRTJGUykgPSB5CitORUVERUQtJChDT05GSUdfVFVORTJGUykgPSB5CisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKE5FRURFRC15KSArPSBnZW5fYml0bWFwLm8gYml0b3BzLm8gaXNtb3VudGVkLm8gbWtqb3VybmFsLm8gdW5peF9pby5vIFwKKyAgICAgICAgICAgICAgICAgICByd19iaXRtYXBzLm8gaW5pdGlhbGl6ZS5vIGJpdG1hcHMubyBibG9jay5vIFwKKyAgICAgICAgICAgICAgICAgICBpbmRfYmxvY2subyBpbm9kZS5vIGZyZWVmcy5vIGFsbG9jX3N0YXRzLm8gY2xvc2Vmcy5vIFwKKyAgICAgICAgICAgICAgICAgICBvcGVuZnMubyBpb19tYW5hZ2VyLm8gZmluZGRldi5vIHJlYWRfYmIubyBhbGxvYy5vIGJhZGJsb2Nrcy5vIFwKKyAgICAgICAgICAgICAgICAgICBnZXRzaXplLm8gZ2V0c2VjdHNpemUubyBhbGxvY190YWJsZXMubyByZWFkX2JiX2ZpbGUubyBta2Rpci5vIFwKKyAgICAgICAgICAgICAgICAgICBiYl9pbm9kZS5vIG5ld2Rpci5vIGFsbG9jX3NiLm8gbG9va3VwLm8gZGlyYmxvY2subyBleHBhbmRkaXIubyBcCisgICAgICAgICAgICAgICAgICAgZGlyX2l0ZXJhdGUubyBsaW5rLm8gcmVzX2dkdC5vIGljb3VudC5vIGdldF9wYXRobmFtZS5vIGRibGlzdC5vIFwKKyAgICAgICAgICAgICAgICAgICBkaXJoYXNoLm8gdmVyc2lvbi5vIGZsdXNoYi5vIHVubGluay5vIGNoZWNrX2Rlc2MubyB2YWxpZF9ibGsubyBcCisgICAgICAgICAgICAgICAgICAgZXh0X2F0dHIubyBibWFwLm8gZGJsaXN0X2Rpci5vIGV4dDJmc19pbmxpbmUubyBzd2FwZnMubworCitDRkxBR1MgKz0gLWluY2x1ZGUgJChzcmN0cmVlKS9lMmZzcHJvZ3MvZTJmc2JiLmgKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9hbGxvYy5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiNjNlMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9hbGxvYy5jCkBAIC0wLDAgKzEsMTczIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhbGxvYy5jIC0tLSBhbGxvY2F0ZSBuZXcgaW5vZGVzLCBibG9ja3MgZm9yIGV4dDJmcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBSaWdodCBub3csIGp1c3Qgc2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeSdzIGJsb2NrCisgKiBncm91cCB0byBmaW5kIHRoZSBuZXh0IGZyZWUgaW5vZGUuCisgKgorICogU2hvdWxkIGhhdmUgYSBzcGVjaWFsIHBvbGljeSBmb3IgZGlyZWN0b3JpZXMuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfbmV3X2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwKKwkJCSAgIGludCBtb2RlIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIGV4dDJmc19pbm9kZV9iaXRtYXAgbWFwLCBleHQyX2lub190ICpyZXQpCit7CisJZXh0Ml9pbm9fdAlkaXJfZ3JvdXAgPSAwOworCWV4dDJfaW5vX3QJaTsKKwlleHQyX2lub190CXN0YXJ0X2lub2RlOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICghbWFwKQorCQltYXAgPSBmcy0+aW5vZGVfbWFwOworCWlmICghbWFwKQorCQlyZXR1cm4gRVhUMl9FVF9OT19JTk9ERV9CSVRNQVA7CisKKwlpZiAoZGlyID4gMCkKKwkJZGlyX2dyb3VwID0gKGRpciAtIDEpIC8gRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzLT5zdXBlcik7CisKKwlzdGFydF9pbm9kZSA9IChkaXJfZ3JvdXAgKiBFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSkgKyAxOworCWlmIChzdGFydF9pbm9kZSA8IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKSkKKwkJc3RhcnRfaW5vZGUgPSBFWFQyX0ZJUlNUX0lOT0RFKGZzLT5zdXBlcik7CisJaSA9IHN0YXJ0X2lub2RlOworCisJZG8geworCQlpZiAoIWV4dDJmc19mYXN0X3Rlc3RfaW5vZGVfYml0bWFwKG1hcCwgaSkpCisJCQlicmVhazsKKwkJaSsrOworCQlpZiAoaSA+IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpCisJCQlpID0gRVhUMl9GSVJTVF9JTk9ERShmcy0+c3VwZXIpOworCX0gd2hpbGUgKGkgIT0gc3RhcnRfaW5vZGUpOworCisJaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChtYXAsIGkpKQorCQlyZXR1cm4gRVhUMl9FVF9JTk9ERV9BTExPQ19GQUlMOworCSpyZXQgPSBpOworCXJldHVybiAwOworfQorCisvKgorICogU3R1cGlkIGFsZ29yaXRobSAtLS0gd2Ugbm93IGp1c3Qgc2VhcmNoIGZvcndhcmQgc3RhcnRpbmcgZnJvbSB0aGUKKyAqIGdvYWwuICBTaG91bGQgcHV0IGluIGEgc21hcnRlciBvbmUgc29tZWRheS4uLi4KKyAqLworZXJyY29kZV90IGV4dDJmc19uZXdfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGdvYWwsCisJCQkgICBleHQyZnNfYmxvY2tfYml0bWFwIG1hcCwgYmxrX3QgKnJldCkKK3sKKwlibGtfdAlpOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICghbWFwKQorCQltYXAgPSBmcy0+YmxvY2tfbWFwOworCWlmICghbWFwKQorCQlyZXR1cm4gRVhUMl9FVF9OT19CTE9DS19CSVRNQVA7CisJaWYgKCFnb2FsIHx8IChnb2FsID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpKQorCQlnb2FsID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJaSA9IGdvYWw7CisJZG8geworCQlpZiAoIWV4dDJmc19mYXN0X3Rlc3RfYmxvY2tfYml0bWFwKG1hcCwgaSkpIHsKKwkJCSpyZXQgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaSsrOworCQlpZiAoaSA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KQorCQkJaSA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCX0gd2hpbGUgKGkgIT0gZ29hbCk7CisJcmV0dXJuIEVYVDJfRVRfQkxPQ0tfQUxMT0NfRkFJTDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gemVyb3Mgb3V0IHRoZSBhbGxvY2F0ZWQgYmxvY2ssIGFuZCB1cGRhdGVzIGFsbCBvZiB0aGUKKyAqIGFwcHJvcHJpYXRlIGZpbGVzeXN0ZW0gcmVjb3Jkcy4KKyAqLworZXJyY29kZV90IGV4dDJmc19hbGxvY19ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgZ29hbCwKKwkJCSAgICAgY2hhciAqYmxvY2tfYnVmLCBibGtfdCAqcmV0KQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJYmxrX3QJCWJsb2NrOworCWNoYXIJCSpidWYgPSBOVUxMOworCisJaWYgKCFibG9ja19idWYpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJ1Zik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlibG9ja19idWYgPSBidWY7CisJfQorCW1lbXNldChibG9ja19idWYsIDAsIGZzLT5ibG9ja3NpemUpOworCisJaWYgKCFmcy0+YmxvY2tfbWFwKSB7CisJCXJldHZhbCA9IGV4dDJmc19yZWFkX2Jsb2NrX2JpdG1hcChmcyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dmFsID0gZXh0MmZzX25ld19ibG9jayhmcywgZ29hbCwgMCwgJmJsb2NrKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZhaWw7CisKKwlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGJsb2NrLCAxLCBibG9ja19idWYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbDsKKworCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgYmxvY2ssICsxKTsKKwkqcmV0ID0gYmxvY2s7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKGJ1ZikKKwkJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZ2V0X2ZyZWVfYmxvY2tzKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBzdGFydCwgYmxrX3QgZmluaXNoLAorCQkJCSBpbnQgbnVtLCBleHQyZnNfYmxvY2tfYml0bWFwIG1hcCwgYmxrX3QgKnJldCkKK3sKKwlibGtfdAliID0gc3RhcnQ7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKCFtYXApCisJCW1hcCA9IGZzLT5ibG9ja19tYXA7CisJaWYgKCFtYXApCisJCXJldHVybiBFWFQyX0VUX05PX0JMT0NLX0JJVE1BUDsKKwlpZiAoIWIpCisJCWIgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jazsKKwlpZiAoIWZpbmlzaCkKKwkJZmluaXNoID0gc3RhcnQ7CisJaWYgKCFudW0pCisJCW51bSA9IDE7CisJZG8geworCQlpZiAoYitudW0tMSA+IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpCisJCQliID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJCWlmIChleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcF9yYW5nZShtYXAsIGIsIG51bSkpIHsKKwkJCSpyZXQgPSBiOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYisrOworCX0gd2hpbGUgKGIgIT0gZmluaXNoKTsKKwlyZXR1cm4gRVhUMl9FVF9CTE9DS19BTExPQ19GQUlMOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2FsbG9jX3NiLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2Nfc2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQzN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2FsbG9jX3NiLmMKQEAgLTAsMCArMSw1OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYWxsb2Nfc2IuYyAtLS0gQWxsb2NhdGUgdGhlIHN1cGVyYmxvY2sgYW5kIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzIGZvciBhCisgKiBuZXdseSBpbml0aWFsaXplZCBmaWxlc3lzdGVtLiAgVXNlZCBieSBta2UyZnMgd2hlbiBpbml0aWFsaXppbmcgYSBmaWxlc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAyMDAzIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK2ludCBleHQyZnNfcmVzZXJ2ZV9zdXBlcl9hbmRfYmdkKGV4dDJfZmlsc3lzIGZzLAorCQkJCSBkZ3JwX3QgZ3JvdXAsCisJCQkJIGV4dDJmc19ibG9ja19iaXRtYXAgYm1hcCkKK3sKKwlibGtfdAlzdXBlcl9ibGssIG9sZF9kZXNjX2JsaywgbmV3X2Rlc2NfYmxrOworCWludAlqLCBvbGRfZGVzY19ibG9ja3MsIG51bV9ibG9ja3M7CisKKwludW1fYmxvY2tzID0gZXh0MmZzX3N1cGVyX2FuZF9iZ2RfbG9jKGZzLCBncm91cCwgJnN1cGVyX2JsaywKKwkJCQkJICAgICAgJm9sZF9kZXNjX2JsaywgJm5ld19kZXNjX2JsaywgMCk7CisKKwlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykKKwkJb2xkX2Rlc2NfYmxvY2tzID0gZnMtPnN1cGVyLT5zX2ZpcnN0X21ldGFfYmc7CisJZWxzZQorCQlvbGRfZGVzY19ibG9ja3MgPQorCQkJZnMtPmRlc2NfYmxvY2tzICsgZnMtPnN1cGVyLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3M7CisKKwlpZiAoc3VwZXJfYmxrIHx8IChncm91cCA9PSAwKSkKKwkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGJtYXAsIHN1cGVyX2Jsayk7CisKKwlpZiAob2xkX2Rlc2NfYmxrKSB7CisJCWZvciAoaj0wOyBqIDwgb2xkX2Rlc2NfYmxvY2tzOyBqKyspCisJCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoYm1hcCwgb2xkX2Rlc2NfYmxrICsgaik7CisJfQorCWlmIChuZXdfZGVzY19ibGspCisJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChibWFwLCBuZXdfZGVzY19ibGspOworCisJcmV0dXJuIG51bV9ibG9ja3M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2Nfc3RhdHMuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9hbGxvY19zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYWIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2Nfc3RhdHMuYwpAQCAtMCwwICsxLDUzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhbGxvY19zdGF0cy5jIC0tLSBVcGRhdGUgYWxsb2NhdGlvbiBzdGF0aXN0aWNzIGZvciBleHQyZnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKwordm9pZCBleHQyZnNfaW5vZGVfYWxsb2Nfc3RhdHMyKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCSAgICAgICBpbnQgaW51c2UsIGludCBpc2RpcikKK3sKKwlpbnQJZ3JvdXAgPSBleHQyZnNfZ3JvdXBfb2ZfaW5vKGZzLCBpbm8pOworCisJaWYgKGludXNlID4gMCkKKwkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGZzLT5pbm9kZV9tYXAsIGlubyk7CisJZWxzZQorCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwLCBpbm8pOworCWZzLT5ncm91cF9kZXNjW2dyb3VwXS5iZ19mcmVlX2lub2Rlc19jb3VudCAtPSBpbnVzZTsKKwlpZiAoaXNkaXIpCisJCWZzLT5ncm91cF9kZXNjW2dyb3VwXS5iZ191c2VkX2RpcnNfY291bnQgKz0gaW51c2U7CisJZnMtPnN1cGVyLT5zX2ZyZWVfaW5vZGVzX2NvdW50IC09IGludXNlOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwlleHQyZnNfbWFya19pYl9kaXJ0eShmcyk7Cit9CisKK3ZvaWQgZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywgaW50IGludXNlKQoreworCWV4dDJmc19pbm9kZV9hbGxvY19zdGF0czIoZnMsIGlubywgaW51c2UsIDApOworfQorCit2b2lkIGV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxrLCBpbnQgaW51c2UpCit7CisJaW50CWdyb3VwID0gZXh0MmZzX2dyb3VwX29mX2JsayhmcywgYmxrKTsKKworCWlmIChpbnVzZSA+IDApCisJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChmcy0+YmxvY2tfbWFwLCBibGspOworCWVsc2UKKwkJZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgYmxrKTsKKwlmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfZnJlZV9ibG9ja3NfY291bnQgLT0gaW51c2U7CisJZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50IC09IGludXNlOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwlleHQyZnNfbWFya19iYl9kaXJ0eShmcyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2NfdGFibGVzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2NfdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MGUyYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9hbGxvY190YWJsZXMuYwpAQCAtMCwwICsxLDExNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYWxsb2NfdGFibGVzLmMgLS0tIEFsbG9jYXRlIHRhYmxlcyBmb3IgYSBuZXdseSBpbml0aWFsaXplZAorICogZmlsZXN5c3RlbS4gIFVzZWQgYnkgbWtlMmZzIHdoZW4gaW5pdGlhbGl6aW5nIGEgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitlcnJjb2RlX3QgZXh0MmZzX2FsbG9jYXRlX2dyb3VwX3RhYmxlKGV4dDJfZmlsc3lzIGZzLCBkZ3JwX3QgZ3JvdXAsCisJCQkJICAgICAgZXh0MmZzX2Jsb2NrX2JpdG1hcCBibWFwKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJYmxrX3QJCWdyb3VwX2Jsaywgc3RhcnRfYmxrLCBsYXN0X2JsaywgbmV3X2JsaywgYmxrOworCWludAkJajsKKworCWdyb3VwX2JsayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrICsKKwkJKGdyb3VwICogZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOworCisJbGFzdF9ibGsgPSBncm91cF9ibGsgKyBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKKwlpZiAobGFzdF9ibGsgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkKKwkJbGFzdF9ibGsgPSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IC0gMTsKKworCWlmICghYm1hcCkKKwkJYm1hcCA9IGZzLT5ibG9ja19tYXA7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBibG9jayBhbmQgaW5vZGUgYml0bWFwcywgaWYgbmVjZXNzYXJ5CisJICovCisJaWYgKGZzLT5zdHJpZGUpIHsKKwkJc3RhcnRfYmxrID0gZ3JvdXBfYmxrICsgZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCXN0YXJ0X2JsayArPSAoKGZzLT5zdHJpZGUgKiBncm91cCkgJQorCQkJICAgICAgKGxhc3RfYmxrIC0gc3RhcnRfYmxrKSk7CisJCWlmIChzdGFydF9ibGsgPiBsYXN0X2JsaykKKwkJCXN0YXJ0X2JsayA9IGdyb3VwX2JsazsKKwl9IGVsc2UKKwkJc3RhcnRfYmxrID0gZ3JvdXBfYmxrOworCisJaWYgKCFmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfYmxvY2tfYml0bWFwKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfZnJlZV9ibG9ja3MoZnMsIHN0YXJ0X2JsaywgbGFzdF9ibGssCisJCQkJCQkxLCBibWFwLCAmbmV3X2Jsayk7CisJCWlmIChyZXR2YWwgPT0gRVhUMl9FVF9CTE9DS19BTExPQ19GQUlMKQorCQkJcmV0dmFsID0gZXh0MmZzX2dldF9mcmVlX2Jsb2NrcyhmcywgZ3JvdXBfYmxrLAorCQkJCQlsYXN0X2JsaywgMSwgYm1hcCwgJm5ld19ibGspOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGJtYXAsIG5ld19ibGspOworCQlmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfYmxvY2tfYml0bWFwID0gbmV3X2JsazsKKwl9CisKKwlpZiAoIWZzLT5ncm91cF9kZXNjW2dyb3VwXS5iZ19pbm9kZV9iaXRtYXApIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9mcmVlX2Jsb2Nrcyhmcywgc3RhcnRfYmxrLCBsYXN0X2JsaywKKwkJCQkJCTEsIGJtYXAsICZuZXdfYmxrKTsKKwkJaWYgKHJldHZhbCA9PSBFWFQyX0VUX0JMT0NLX0FMTE9DX0ZBSUwpCisJCQlyZXR2YWwgPSBleHQyZnNfZ2V0X2ZyZWVfYmxvY2tzKGZzLCBncm91cF9ibGssCisJCQkJCWxhc3RfYmxrLCAxLCBibWFwLCAmbmV3X2Jsayk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoYm1hcCwgbmV3X2Jsayk7CisJCWZzLT5ncm91cF9kZXNjW2dyb3VwXS5iZ19pbm9kZV9iaXRtYXAgPSBuZXdfYmxrOworCX0KKworCS8qCisJICogQWxsb2NhdGUgdGhlIGlub2RlIHRhYmxlCisJICovCisJaWYgKCFmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfaW5vZGVfdGFibGUpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9mcmVlX2Jsb2NrcyhmcywgZ3JvdXBfYmxrLCBsYXN0X2JsaywKKwkJCQkJCWZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwLAorCQkJCQkJYm1hcCwgJm5ld19ibGspOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJZm9yIChqPTAsIGJsayA9IG5ld19ibGs7CisJCSAgICAgaiA8IGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwOworCQkgICAgIGorKywgYmxrKyspCisJCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoYm1hcCwgYmxrKTsKKwkJZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2lub2RlX3RhYmxlID0gbmV3X2JsazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV90YWJsZXMoZXh0Ml9maWxzeXMgZnMpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlkZ3JwX3QJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGkrKykgeworCQlyZXR2YWwgPSBleHQyZnNfYWxsb2NhdGVfZ3JvdXBfdGFibGUoZnMsIGksIGZzLT5ibG9ja19tYXApOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmFkYmxvY2tzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmFkYmxvY2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1Y2MxMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iYWRibG9ja3MuYwpAQCAtMCwwICsxLDMyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmFkYmxvY2tzLmMgLS0tIHJvdXRpbmVzIHRvIG1hbmlwdWxhdGUgdGhlIGJhZCBibG9jayBzdHJ1Y3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIG1ha2luZyBhIGJhZGJsb2NrcyBsaXN0CisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgbWFrZV91MzJfbGlzdChpbnQgc2l6ZSwgaW50IG51bSwgX191MzIgKmxpc3QsCisJCQkgICAgICAgZXh0Ml91MzJfbGlzdCAqcmV0KQoreworCWV4dDJfdTMyX2xpc3QJYmI7CisJZXJyY29kZV90CXJldHZhbDsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfdTMyX2xpc3QpLCAmYmIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KGJiLCAwLCBzaXplb2Yoc3RydWN0IGV4dDJfc3RydWN0X3UzMl9saXN0KSk7CisJYmItPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfTElTVDsKKwliYi0+c2l6ZSA9IHNpemUgPyBzaXplIDogMTA7CisJYmItPm51bSA9IG51bTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShiYi0+c2l6ZSAqIHNpemVvZihibGtfdCksICZiYi0+bGlzdCk7CisJaWYgKCFiYi0+bGlzdCkgeworCQlleHQyZnNfZnJlZV9tZW0oJmJiKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKGxpc3QpCisJCW1lbWNweShiYi0+bGlzdCwgbGlzdCwgYmItPnNpemUgKiBzaXplb2YoYmxrX3QpKTsKKwllbHNlCisJCW1lbXNldChiYi0+bGlzdCwgMCwgYmItPnNpemUgKiBzaXplb2YoYmxrX3QpKTsKKwkqcmV0ID0gYmI7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFRoaXMgcHJvY2VkdXJlIGNyZWF0ZXMgYW4gZW1wdHkgdTMyIGxpc3QuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfdTMyX2xpc3RfY3JlYXRlKGV4dDJfdTMyX2xpc3QgKnJldCwgaW50IHNpemUpCit7CisJcmV0dXJuIG1ha2VfdTMyX2xpc3Qoc2l6ZSwgMCwgMCwgcmV0KTsKK30KKworLyoKKyAqIFRoaXMgcHJvY2VkdXJlIGNyZWF0ZXMgYW4gZW1wdHkgYmFkYmxvY2tzIGxpc3QuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfY3JlYXRlKGV4dDJfYmFkYmxvY2tzX2xpc3QgKnJldCwgaW50IHNpemUpCit7CisJcmV0dXJuIG1ha2VfdTMyX2xpc3Qoc2l6ZSwgMCwgMCwgKGV4dDJfYmFkYmxvY2tzX2xpc3QgKikgcmV0KTsKK30KKworCisvKgorICogVGhpcyBwcm9jZWR1cmUgY29waWVzIGEgYmFkYmxvY2tzIGxpc3QKKyAqLworZXJyY29kZV90IGV4dDJmc191MzJfY29weShleHQyX3UzMl9saXN0IHNyYywgZXh0Ml91MzJfbGlzdCAqZGVzdCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisJcmV0dmFsID0gbWFrZV91MzJfbGlzdChzcmMtPnNpemUsIHNyYy0+bnVtLCBzcmMtPmxpc3QsIGRlc3QpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJKCpkZXN0KS0+YmFkYmxvY2tzX2ZsYWdzID0gc3JjLT5iYWRibG9ja3NfZmxhZ3M7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfYmFkYmxvY2tzX2NvcHkoZXh0Ml9iYWRibG9ja3NfbGlzdCBzcmMsCisJCQkJZXh0Ml9iYWRibG9ja3NfbGlzdCAqZGVzdCkKK3sKKwlyZXR1cm4gZXh0MmZzX3UzMl9jb3B5KChleHQyX3UzMl9saXN0KSBzcmMsCisJCQkgICAgICAgKGV4dDJfdTMyX2xpc3QgKikgZGVzdCk7Cit9CisKKy8qCisgKiBUaGlzIHByb2NlZHVyZSBmcmVlcyBhIGJhZGJsb2NrcyBsaXN0LgorICoKKyAqIChub3RlOiBtb3ZlZCB0byBjbG9zZWZzLmMpCisgKi8KKworCisvKgorICogVGhpcyBwcm9jZWR1cmUgYWRkcyBhIGJsb2NrIHRvIGEgYmFkYmxvY2tzIGxpc3QuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfdTMyX2xpc3RfYWRkKGV4dDJfdTMyX2xpc3QgYmIsIF9fdTMyIGJsaykKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWludAkJaSwgajsKKwl1bnNpZ25lZCBsb25nCW9sZF9zaXplOworCisJRVhUMl9DSEVDS19NQUdJQyhiYiwgRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfTElTVCk7CisKKwlpZiAoYmItPm51bSA+PSBiYi0+c2l6ZSkgeworCQlvbGRfc2l6ZSA9IGJiLT5zaXplICogc2l6ZW9mKF9fdTMyKTsKKwkJYmItPnNpemUgKz0gMTAwOworCQlyZXR2YWwgPSBleHQyZnNfcmVzaXplX21lbShvbGRfc2l6ZSwgYmItPnNpemUgKiBzaXplb2YoX191MzIpLAorCQkJCQkgICAmYmItPmxpc3QpOworCQlpZiAocmV0dmFsKSB7CisJCQliYi0+c2l6ZSAtPSAxMDA7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCisJLyoKKwkgKiBBZGQgc3BlY2lhbCBjYXNlIGNvZGUgZm9yIGFwcGVuZGluZyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisJICovCisJaSA9IGJiLT5udW0tMTsKKwlpZiAoKGJiLT5udW0gIT0gMCkgJiYgKGJiLT5saXN0W2ldID09IGJsaykpCisJCXJldHVybiAwOworCWlmICgoYmItPm51bSA9PSAwKSB8fCAoYmItPmxpc3RbaV0gPCBibGspKSB7CisJCWJiLT5saXN0W2JiLT5udW0rK10gPSBibGs7CisJCXJldHVybiAwOworCX0KKworCWogPSBiYi0+bnVtOworCWZvciAoaT0wOyBpIDwgYmItPm51bTsgaSsrKSB7CisJCWlmIChiYi0+bGlzdFtpXSA9PSBibGspCisJCQlyZXR1cm4gMDsKKwkJaWYgKGJiLT5saXN0W2ldID4gYmxrKSB7CisJCQlqID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZvciAoaT1iYi0+bnVtOyBpID4gajsgaS0tKQorCQliYi0+bGlzdFtpXSA9IGJiLT5saXN0W2ktMV07CisJYmItPmxpc3Rbal0gPSBibGs7CisJYmItPm51bSsrOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2FkZChleHQyX2JhZGJsb2Nrc19saXN0IGJiLCBibGtfdCBibGspCit7CisJcmV0dXJuIGV4dDJmc191MzJfbGlzdF9hZGQoKGV4dDJfdTMyX2xpc3QpIGJiLCAoX191MzIpIGJsayk7Cit9CisKKy8qCisgKiBUaGlzIHByb2NlZHVyZSBmaW5kcyBhIHBhcnRpY3VsYXIgYmxvY2sgaXMgb24gYSBiYWRibG9ja3MKKyAqIGxpc3QuCisgKi8KK2ludCBleHQyZnNfdTMyX2xpc3RfZmluZChleHQyX3UzMl9saXN0IGJiLCBfX3UzMiBibGspCit7CisJaW50CWxvdywgaGlnaCwgbWlkOworCisJaWYgKGJiLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0JBREJMT0NLU19MSVNUKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYmItPm51bSA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlsb3cgPSAwOworCWhpZ2ggPSBiYi0+bnVtLTE7CisJaWYgKGJsayA9PSBiYi0+bGlzdFtsb3ddKQorCQlyZXR1cm4gbG93OworCWlmIChibGsgPT0gYmItPmxpc3RbaGlnaF0pCisJCXJldHVybiBoaWdoOworCisJd2hpbGUgKGxvdyA8IGhpZ2gpIHsKKwkJbWlkID0gKGxvdytoaWdoKS8yOworCQlpZiAobWlkID09IGxvdyB8fCBtaWQgPT0gaGlnaCkKKwkJCWJyZWFrOworCQlpZiAoYmxrID09IGJiLT5saXN0W21pZF0pCisJCQlyZXR1cm4gbWlkOworCQlpZiAoYmxrIDwgYmItPmxpc3RbbWlkXSkKKwkJCWhpZ2ggPSBtaWQ7CisJCWVsc2UKKwkJCWxvdyA9IG1pZDsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogVGhpcyBwcm9jZWR1cmUgdGVzdHMgdG8gc2VlIGlmIGEgcGFydGljdWxhciBibG9jayBpcyBvbiBhIGJhZGJsb2NrcworICogbGlzdC4KKyAqLworaW50IGV4dDJmc191MzJfbGlzdF90ZXN0KGV4dDJfdTMyX2xpc3QgYmIsIF9fdTMyIGJsaykKK3sKKwlpZiAoZXh0MmZzX3UzMl9saXN0X2ZpbmQoYmIsIGJsaykgPCAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCitpbnQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X3Rlc3QoZXh0Ml9iYWRibG9ja3NfbGlzdCBiYiwgYmxrX3QgYmxrKQoreworCXJldHVybiBleHQyZnNfdTMyX2xpc3RfdGVzdCgoZXh0Ml91MzJfbGlzdCkgYmIsIChfX3UzMikgYmxrKTsKK30KKworCisvKgorICogUmVtb3ZlIGEgYmxvY2sgZnJvbSB0aGUgYmFkYmxvY2sgbGlzdAorICovCitpbnQgZXh0MmZzX3UzMl9saXN0X2RlbChleHQyX3UzMl9saXN0IGJiLCBfX3UzMiBibGspCit7CisJaW50CXJlbWxvYywgaTsKKworCWlmIChiYi0+bnVtID09IDApCisJCXJldHVybiAtMTsKKworCXJlbWxvYyA9IGV4dDJmc191MzJfbGlzdF9maW5kKGJiLCBibGspOworCWlmIChyZW1sb2MgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSByZW1sb2M7IGkgPCBiYi0+bnVtIC0gMTsgaSsrKQorCQliYi0+bGlzdFtpXSA9IGJiLT5saXN0W2krMV07CisJYmItPm51bS0tOworCXJldHVybiAwOworfQorCit2b2lkIGV4dDJmc19iYWRibG9ja3NfbGlzdF9kZWwoZXh0Ml91MzJfbGlzdCBiYiwgX191MzIgYmxrKQoreworCWV4dDJmc191MzJfbGlzdF9kZWwoYmIsIGJsayk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZV9iZWdpbihleHQyX3UzMl9saXN0IGJiLAorCQkJCQlleHQyX3UzMl9pdGVyYXRlICpyZXQpCit7CisJZXh0Ml91MzJfaXRlcmF0ZSBpdGVyOworCWVycmNvZGVfdAkJcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhiYiwgRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfTElTVCk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJfc3RydWN0X3UzMl9pdGVyYXRlKSwgJml0ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpdGVyLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0lURVJBVEU7CisJaXRlci0+YmIgPSBiYjsKKwlpdGVyLT5wdHIgPSAwOworCSpyZXQgPSBpdGVyOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGVfYmVnaW4oZXh0Ml9iYWRibG9ja3NfbGlzdCBiYiwKKwkJCQkJICAgICAgZXh0Ml9iYWRibG9ja3NfaXRlcmF0ZSAqcmV0KQoreworCXJldHVybiBleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZV9iZWdpbigoZXh0Ml91MzJfbGlzdCkgYmIsCisJCQkJCSAgICAgIChleHQyX3UzMl9pdGVyYXRlICopIHJldCk7Cit9CisKKworaW50IGV4dDJmc191MzJfbGlzdF9pdGVyYXRlKGV4dDJfdTMyX2l0ZXJhdGUgaXRlciwgX191MzIgKmJsaykKK3sKKwlleHQyX3UzMl9saXN0CWJiOworCisJaWYgKGl0ZXItPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0lURVJBVEUpCisJCXJldHVybiAwOworCisJYmIgPSBpdGVyLT5iYjsKKworCWlmIChiYi0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfTElTVCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaXRlci0+cHRyIDwgYmItPm51bSkgeworCQkqYmxrID0gYmItPmxpc3RbaXRlci0+cHRyKytdOworCQlyZXR1cm4gMTsKKwl9CisJKmJsayA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZShleHQyX2JhZGJsb2Nrc19pdGVyYXRlIGl0ZXIsIGJsa190ICpibGspCit7CisJcmV0dXJuIGV4dDJmc191MzJfbGlzdF9pdGVyYXRlKChleHQyX3UzMl9pdGVyYXRlKSBpdGVyLAorCQkJCSAgICAgICAoX191MzIgKikgYmxrKTsKK30KKworCit2b2lkIGV4dDJmc191MzJfbGlzdF9pdGVyYXRlX2VuZChleHQyX3UzMl9pdGVyYXRlIGl0ZXIpCit7CisJaWYgKCFpdGVyIHx8IChpdGVyLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0JBREJMT0NLU19JVEVSQVRFKSkKKwkJcmV0dXJuOworCisJaXRlci0+YmIgPSAwOworCWV4dDJmc19mcmVlX21lbSgmaXRlcik7Cit9CisKK3ZvaWQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGVfZW5kKGV4dDJfYmFkYmxvY2tzX2l0ZXJhdGUgaXRlcikKK3sKKwlleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZV9lbmQoKGV4dDJfdTMyX2l0ZXJhdGUpIGl0ZXIpOworfQorCisKK2ludCBleHQyZnNfdTMyX2xpc3RfZXF1YWwoZXh0Ml91MzJfbGlzdCBiYjEsIGV4dDJfdTMyX2xpc3QgYmIyKQoreworCUVYVDJfQ0hFQ0tfTUFHSUMoYmIxLCBFWFQyX0VUX01BR0lDX0JBREJMT0NLU19MSVNUKTsKKwlFWFQyX0NIRUNLX01BR0lDKGJiMiwgRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfTElTVCk7CisKKwlpZiAoYmIxLT5udW0gIT0gYmIyLT5udW0pCisJCXJldHVybiAwOworCisJaWYgKG1lbWNtcChiYjEtPmxpc3QsIGJiMi0+bGlzdCwgYmIxLT5udW0gKiBzaXplb2YoYmxrX3QpKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworaW50IGV4dDJmc19iYWRibG9ja3NfZXF1YWwoZXh0Ml9iYWRibG9ja3NfbGlzdCBiYjEsIGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIyKQoreworCXJldHVybiBleHQyZnNfdTMyX2xpc3RfZXF1YWwoKGV4dDJfdTMyX2xpc3QpIGJiMSwKKwkJCQkgICAgIChleHQyX3UzMl9saXN0KSBiYjIpOworfQorCitpbnQgZXh0MmZzX3UzMl9saXN0X2NvdW50KGV4dDJfdTMyX2xpc3QgYmIpCit7CisJcmV0dXJuIGJiLT5udW07Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmJfY29tcGF0LmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmJfY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5YWM3NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iYl9jb21wYXQuYwpAQCAtMCwwICsxLDY0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYl9jb21wYXQuYyAtLS0gY29tcGF0aWJpbGl0eSBiYWRibG9ja3Mgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKK2VycmNvZGVfdCBiYWRibG9ja3NfbGlzdF9jcmVhdGUoYmFkYmxvY2tzX2xpc3QgKnJldCwgaW50IHNpemUpCit7CisJcmV0dXJuIGV4dDJmc19iYWRibG9ja3NfbGlzdF9jcmVhdGUocmV0LCBzaXplKTsKK30KKwordm9pZCBiYWRibG9ja3NfbGlzdF9mcmVlKGJhZGJsb2Nrc19saXN0IGJiKQoreworCWV4dDJmc19iYWRibG9ja3NfbGlzdF9mcmVlKGJiKTsKK30KKworZXJyY29kZV90IGJhZGJsb2Nrc19saXN0X2FkZChiYWRibG9ja3NfbGlzdCBiYiwgYmxrX3QgYmxrKQoreworCXJldHVybiBleHQyZnNfYmFkYmxvY2tzX2xpc3RfYWRkKGJiLCBibGspOworfQorCitpbnQgYmFkYmxvY2tzX2xpc3RfdGVzdChiYWRibG9ja3NfbGlzdCBiYiwgYmxrX3QgYmxrKQoreworCXJldHVybiBleHQyZnNfYmFkYmxvY2tzX2xpc3RfdGVzdChiYiwgYmxrKTsKK30KKworZXJyY29kZV90IGJhZGJsb2Nrc19saXN0X2l0ZXJhdGVfYmVnaW4oYmFkYmxvY2tzX2xpc3QgYmIsCisJCQkJICAgICAgIGJhZGJsb2Nrc19pdGVyYXRlICpyZXQpCit7CisJcmV0dXJuIGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2JlZ2luKGJiLCByZXQpOworfQorCitpbnQgYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZShiYWRibG9ja3NfaXRlcmF0ZSBpdGVyLCBibGtfdCAqYmxrKQoreworCXJldHVybiBleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZShpdGVyLCBibGspOworfQorCit2b2lkIGJhZGJsb2Nrc19saXN0X2l0ZXJhdGVfZW5kKGJhZGJsb2Nrc19pdGVyYXRlIGl0ZXIpCit7CisJZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGVfZW5kKGl0ZXIpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JiX2lub2RlLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmJfaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY3ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JiX2lub2RlLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJiX2lub2RlLmMgLS0tIHJvdXRpbmVzIHRvIHVwZGF0ZSB0aGUgYmFkIGJsb2NrIGlub2RlLgorICoKKyAqIFdBUk5JTkc6IFRoaXMgcm91dGluZSBtb2RpZmllcyBhIGxvdCBvZiBzdGF0ZSBpbiB0aGUgZmlsZXN5c3RlbTsgaWYKKyAqIHRoaXMgcm91dGluZSByZXR1cm5zIGFuIGVycm9yLCB0aGUgYmFkIGJsb2NrIGlub2RlIG1heSBiZSBpbiBhbgorICogaW5jb25zaXN0ZW50IHN0YXRlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdHJ1Y3Qgc2V0X2JhZGJsb2NrX3JlY29yZCB7CisJZXh0Ml9iYWRibG9ja3NfaXRlcmF0ZQliYl9pdGVyOworCWludAkJYmFkX2Jsb2NrX2NvdW50OworCWJsa190CQkqaW5kX2Jsb2NrczsKKwlpbnQJCW1heF9pbmRfYmxvY2tzOworCWludAkJaW5kX2Jsb2Nrc19zaXplOworCWludAkJaW5kX2Jsb2Nrc19wdHI7CisJY2hhcgkJKmJsb2NrX2J1ZjsKKwllcnJjb2RlX3QJZXJyOworfTsKKworc3RhdGljIGludCBzZXRfYmFkX2Jsb2NrX3Byb2MoZXh0Ml9maWxzeXMgZnMsIGJsa190ICpibG9ja19uciwKKwkJCSAgICAgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJICAgICAgYmxrX3QgcmVmX2Jsb2NrLCBpbnQgcmVmX29mZnNldCwKKwkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSk7CitzdGF0aWMgaW50IGNsZWFyX2JhZF9ibG9ja19wcm9jKGV4dDJfZmlsc3lzIGZzLCBibGtfdCAqYmxvY2tfbnIsCisJCQkJZTJfYmxrY250X3QgYmxvY2tjbnQsCisJCQkJYmxrX3QgcmVmX2Jsb2NrLCBpbnQgcmVmX29mZnNldCwKKwkJCQl2b2lkICpwcml2X2RhdGEpOworCisvKgorICogR2l2ZW4gYSBiYWQgYmxvY2tzIGJpdG1hcCwgdXBkYXRlIHRoZSBiYWQgYmxvY2tzIGlub2RlIHRvIHJlZmxlY3QKKyAqIHRoZSBtYXAuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfdXBkYXRlX2JiX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2JhZGJsb2Nrc19saXN0IGJiX2xpc3QpCit7CisJZXJyY29kZV90CQkJcmV0dmFsOworCXN0cnVjdCBzZXRfYmFkYmxvY2tfcmVjb3JkCXJlYzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQkJaW5vZGU7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKCFmcy0+YmxvY2tfbWFwKQorCQlyZXR1cm4gRVhUMl9FVF9OT19CTE9DS19CSVRNQVA7CisKKwlyZWMuYmFkX2Jsb2NrX2NvdW50ID0gMDsKKwlyZWMuaW5kX2Jsb2Nrc19zaXplID0gcmVjLmluZF9ibG9ja3NfcHRyID0gMDsKKwlyZWMubWF4X2luZF9ibG9ja3MgPSAxMDsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShyZWMubWF4X2luZF9ibG9ja3MgKiBzaXplb2YoYmxrX3QpLAorCQkJCSZyZWMuaW5kX2Jsb2Nrcyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZW1zZXQocmVjLmluZF9ibG9ja3MsIDAsIHJlYy5tYXhfaW5kX2Jsb2NrcyAqIHNpemVvZihibGtfdCkpOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZyZWMuYmxvY2tfYnVmKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisJbWVtc2V0KHJlYy5ibG9ja19idWYsIDAsIGZzLT5ibG9ja3NpemUpOworCXJlYy5lcnIgPSAwOworCisJLyoKKwkgKiBGaXJzdCBjbGVhciB0aGUgb2xkIGJhZCBibG9ja3MgKHdoaWxlIHNhdmluZyB0aGUgaW5kaXJlY3QgYmxvY2tzKQorCSAqLworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgRVhUMl9CQURfSU5PLAorCQkJCSAgICAgICBCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFLCAwLAorCQkJCSAgICAgICBjbGVhcl9iYWRfYmxvY2tfcHJvYywgJnJlYyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCWlmIChyZWMuZXJyKSB7CisJCXJldHZhbCA9IHJlYy5lcnI7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIE5vdyBzZXQgdGhlIGJhZCBibG9ja3MhCisJICoKKwkgKiBGaXJzdCwgbWFyayB0aGUgYmFkIGJsb2NrcyBhcyB1c2VkLiAgVGhpcyBwcmV2ZW50cyBhIGJhZAorCSAqIGJsb2NrIGZyb20gYmVpbmcgdXNlZCBhcyBhbiBpbmRpcmVjdG8gYmxvY2sgZm9yIHRoZSBiYWQKKwkgKiBibG9jayBpbm9kZSAoISkuCisJICovCisJaWYgKGJiX2xpc3QpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGVfYmVnaW4oYmJfbGlzdCwKKwkJCQkJCQkgICAgICZyZWMuYmJfaXRlcik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgRVhUMl9CQURfSU5PLAorCQkJCQkgICAgICAgQkxPQ0tfRkxBR19BUFBFTkQsIDAsCisJCQkJCSAgICAgICBzZXRfYmFkX2Jsb2NrX3Byb2MsICZyZWMpOworCQlleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZV9lbmQocmVjLmJiX2l0ZXIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworCQlpZiAocmVjLmVycikgeworCQkJcmV0dmFsID0gcmVjLmVycjsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKworCS8qCisJICogVXBkYXRlIHRoZSBiYWQgYmxvY2sgaW5vZGUncyBtb2QgdGltZSBhbmQgYmxvY2sgY291bnQKKwkgKiBmaWVsZC4KKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgRVhUMl9CQURfSU5PLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCWlub2RlLmlfYXRpbWUgPSBpbm9kZS5pX210aW1lID0gdGltZShOVUxMKTsKKwlpZiAoIWlub2RlLmlfY3RpbWUpCisJCWlub2RlLmlfY3RpbWUgPSB0aW1lKE5VTEwpOworCWlub2RlLmlfYmxvY2tzID0gcmVjLmJhZF9ibG9ja19jb3VudCAqIChmcy0+YmxvY2tzaXplIC8gNTEyKTsKKwlpbm9kZS5pX3NpemUgPSByZWMuYmFkX2Jsb2NrX2NvdW50ICogZnMtPmJsb2Nrc2l6ZTsKKworCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShmcywgRVhUMl9CQURfSU5PLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworY2xlYW51cDoKKwlleHQyZnNfZnJlZV9tZW0oJnJlYy5pbmRfYmxvY2tzKTsKKwlleHQyZnNfZnJlZV9tZW0oJnJlYy5ibG9ja19idWYpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHVwZGF0ZV9iYl9pbm9kZSgpCisgKgorICogQ2xlYXIgdGhlIGJhZCBibG9ja3MgaW4gdGhlIGJhZCBibG9jayBpbm9kZSwgd2hpbGUgc2F2aW5nIHRoZQorICogaW5kaXJlY3QgYmxvY2tzLgorICovCisjaWZkZWYgX19UVVJCT0NfXworIyBwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorc3RhdGljIGludCBjbGVhcl9iYWRfYmxvY2tfcHJvYyhleHQyX2ZpbHN5cyBmcywgYmxrX3QgKmJsb2NrX25yLAorCQkJCWUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJCWJsa190IHJlZl9ibG9jayBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkJaW50IHJlZl9vZmZzZXQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJCXZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3Qgc2V0X2JhZGJsb2NrX3JlY29yZCAqcmVjID0gKHN0cnVjdCBzZXRfYmFkYmxvY2tfcmVjb3JkICopCisJCXByaXZfZGF0YTsKKwllcnJjb2RlX3QJcmV0dmFsOworCXVuc2lnbmVkIGxvbmcJb2xkX3NpemU7CisKKwlpZiAoISpibG9ja19ucikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHRoZSBibG9jayBudW1iZXIgaXMgb3V0cmFnZW91cywgY2xlYXIgaXQgYW5kIGlnbm9yZSBpdC4KKwkgKi8KKwlpZiAoKmJsb2NrX25yID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgfHwKKwkgICAgKmJsb2NrX25yIDwgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHsKKwkJKmJsb2NrX25yID0gMDsKKwkJcmV0dXJuIEJMT0NLX0NIQU5HRUQ7CisJfQorCisJaWYgKGJsb2NrY250IDwgMCkgeworCQlpZiAocmVjLT5pbmRfYmxvY2tzX3NpemUgPj0gcmVjLT5tYXhfaW5kX2Jsb2NrcykgeworCQkJb2xkX3NpemUgPSByZWMtPm1heF9pbmRfYmxvY2tzICogc2l6ZW9mKGJsa190KTsKKwkJCXJlYy0+bWF4X2luZF9ibG9ja3MgKz0gMTA7CisJCQlyZXR2YWwgPSBleHQyZnNfcmVzaXplX21lbShvbGRfc2l6ZSwKKwkJCQkgICByZWMtPm1heF9pbmRfYmxvY2tzICogc2l6ZW9mKGJsa190KSwKKwkJCQkgICAmcmVjLT5pbmRfYmxvY2tzKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlyZWMtPm1heF9pbmRfYmxvY2tzIC09IDEwOworCQkJCXJlYy0+ZXJyID0gcmV0dmFsOworCQkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJCX0KKwkJfQorCQlyZWMtPmluZF9ibG9ja3NbcmVjLT5pbmRfYmxvY2tzX3NpemUrK10gPSAqYmxvY2tfbnI7CisJfQorCisJLyoKKwkgKiBNYXJrIHRoZSBibG9jayBhcyB1bnVzZWQsIGFuZCB1cGRhdGUgYWNjb3VudGluZyBpbmZvcm1hdGlvbgorCSAqLworCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgKmJsb2NrX25yLCAtMSk7CisKKwkqYmxvY2tfbnIgPSAwOworCXJldHVybiBCTE9DS19DSEFOR0VEOworfQorCisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHVwZGF0ZV9iYl9pbm9kZSgpCisgKgorICogU2V0IHRoZSBibG9jayBsaXN0IGluIHRoZSBiYWQgYmxvY2sgaW5vZGUsIHVzaW5nIHRoZSBzdXBwbGllZCBiaXRtYXAuCisgKi8KKyNpZmRlZiBfX1RVUkJPQ19fCisgI3ByYWdtYSBhcmdzdXNlZAorI2VuZGlmCitzdGF0aWMgaW50IHNldF9iYWRfYmxvY2tfcHJvYyhleHQyX2ZpbHN5cyBmcywgYmxrX3QgKmJsb2NrX25yLAorCQkJICAgICAgZTJfYmxrY250X3QgYmxvY2tjbnQsCisJCQkgICAgICBibGtfdCByZWZfYmxvY2sgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICAgaW50IHJlZl9vZmZzZXQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBzZXRfYmFkYmxvY2tfcmVjb3JkICpyZWMgPSAoc3RydWN0IHNldF9iYWRibG9ja19yZWNvcmQgKikKKwkJcHJpdl9kYXRhOworCWVycmNvZGVfdAlyZXR2YWw7CisJYmxrX3QJCWJsazsKKworCWlmIChibG9ja2NudCA+PSAwKSB7CisJCS8qCisJCSAqIEdldCB0aGUgbmV4dCBiYWQgYmxvY2suCisJCSAqLworCQlpZiAoIWV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlKHJlYy0+YmJfaXRlciwgJmJsaykpCisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCXJlYy0+YmFkX2Jsb2NrX2NvdW50Kys7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQW4gaW5kaXJlY3QgYmxvY2s7IGZldGNoIGEgYmxvY2sgZnJvbSB0aGUKKwkJICogcHJldmlvdXNseSB1c2VkIGluZGlyZWN0IGJsb2NrIGxpc3QuICBUaGUgYmxvY2sKKwkJICogbW9zdCBiZSBub3QgbWFya2VkIGFzIHVzZWQ7IGlmIHNvLCBnZXQgYW5vdGhlciBvbmUuCisJCSAqIElmIHdlIHJ1biBvdXQgb2YgcmVzZXJ2ZWQgaW5kaXJlY3QgYmxvY2tzLCBhbGxvY2F0ZQorCQkgKiBhIG5ldyBvbmUuCisJCSAqLworCXJldHJ5OgorCQlpZiAocmVjLT5pbmRfYmxvY2tzX3B0ciA8IHJlYy0+aW5kX2Jsb2Nrc19zaXplKSB7CisJCQlibGsgPSByZWMtPmluZF9ibG9ja3NbcmVjLT5pbmRfYmxvY2tzX3B0cisrXTsKKwkJCWlmIChleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgYmxrKSkKKwkJCQlnb3RvIHJldHJ5OworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gZXh0MmZzX25ld19ibG9jayhmcywgMCwgMCwgJmJsayk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcmVjLT5lcnIgPSByZXR2YWw7CisJCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQkJfQorCQl9CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxrLCAxLCByZWMtPmJsb2NrX2J1Zik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJlYy0+ZXJyID0gcmV0dmFsOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJfQorCisJLyoKKwkgKiBVcGRhdGUgYmxvY2sgY291bnRzCisJICovCisJZXh0MmZzX2Jsb2NrX2FsbG9jX3N0YXRzKGZzLCBibGssICsxKTsKKworCSpibG9ja19uciA9IGJsazsKKwlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iaXRtYXBzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYml0bWFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2VkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYml0bWFwcy5jCkBAIC0wLDAgKzEsMjExIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiaXRtYXBzLmMgLS0tIHJvdXRpbmVzIHRvIHJlYWQsIHdyaXRlLCBhbmQgbWFuaXB1bGF0ZSB0aGUgaW5vZGUgYW5kCisgKiBibG9jayBiaXRtYXBzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdGF0aWMgZXJyY29kZV90IG1ha2VfYml0bWFwKF9fdTMyIHN0YXJ0LCBfX3UzMiBlbmQsIF9fdTMyIHJlYWxfZW5kLAorCQkJICAgICBjb25zdCBjaGFyICpkZXNjciwgY2hhciAqaW5pdF9tYXAsCisJCQkgICAgIGV4dDJmc19nZW5lcmljX2JpdG1hcCAqcmV0KQoreworCWV4dDJmc19nZW5lcmljX2JpdG1hcAliaXRtYXA7CisJZXJyY29kZV90CQlyZXR2YWw7CisJc2l6ZV90CQkJc2l6ZTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0MmZzX3N0cnVjdF9nZW5lcmljX2JpdG1hcCksCisJCQkJJmJpdG1hcCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWJpdG1hcC0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0dFTkVSSUNfQklUTUFQOworCWJpdG1hcC0+ZnMgPSBOVUxMOworCWJpdG1hcC0+c3RhcnQgPSBzdGFydDsKKwliaXRtYXAtPmVuZCA9IGVuZDsKKwliaXRtYXAtPnJlYWxfZW5kID0gcmVhbF9lbmQ7CisJYml0bWFwLT5iYXNlX2Vycm9yX2NvZGUgPSBFWFQyX0VUX0JBRF9HRU5FUklDX01BUks7CisJaWYgKGRlc2NyKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihkZXNjcikrMSwgJmJpdG1hcC0+ZGVzY3JpcHRpb24pOworCQlpZiAocmV0dmFsKSB7CisJCQlleHQyZnNfZnJlZV9tZW0oJmJpdG1hcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXN0cmNweShiaXRtYXAtPmRlc2NyaXB0aW9uLCBkZXNjcik7CisJfSBlbHNlCisJCWJpdG1hcC0+ZGVzY3JpcHRpb24gPSAwOworCisJc2l6ZSA9IChzaXplX3QpICgoKGJpdG1hcC0+cmVhbF9lbmQgLSBiaXRtYXAtPnN0YXJ0KSAvIDgpICsgMSk7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZSwgJmJpdG1hcC0+Yml0bWFwKTsKKwlpZiAocmV0dmFsKSB7CisJCWV4dDJmc19mcmVlX21lbSgmYml0bWFwLT5kZXNjcmlwdGlvbik7CisJCWV4dDJmc19mcmVlX21lbSgmYml0bWFwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoaW5pdF9tYXApCisJCW1lbWNweShiaXRtYXAtPmJpdG1hcCwgaW5pdF9tYXAsIHNpemUpOworCWVsc2UKKwkJbWVtc2V0KGJpdG1hcC0+Yml0bWFwLCAwLCBzaXplKTsKKwkqcmV0ID0gYml0bWFwOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2FsbG9jYXRlX2dlbmVyaWNfYml0bWFwKF9fdTMyIHN0YXJ0LAorCQkJCQkgX191MzIgZW5kLAorCQkJCQkgX191MzIgcmVhbF9lbmQsCisJCQkJCSBjb25zdCBjaGFyICpkZXNjciwKKwkJCQkJIGV4dDJmc19nZW5lcmljX2JpdG1hcCAqcmV0KQoreworCXJldHVybiBtYWtlX2JpdG1hcChzdGFydCwgZW5kLCByZWFsX2VuZCwgZGVzY3IsIDAsIHJldCk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfY29weV9iaXRtYXAoZXh0MmZzX2dlbmVyaWNfYml0bWFwIHNyYywKKwkJCSAgICAgZXh0MmZzX2dlbmVyaWNfYml0bWFwICpkZXN0KQoreworCWVycmNvZGVfdAkJcmV0dmFsOworCWV4dDJmc19nZW5lcmljX2JpdG1hcAluZXdfbWFwOworCisJcmV0dmFsID0gbWFrZV9iaXRtYXAoc3JjLT5zdGFydCwgc3JjLT5lbmQsIHNyYy0+cmVhbF9lbmQsCisJCQkgICAgIHNyYy0+ZGVzY3JpcHRpb24sIHNyYy0+Yml0bWFwLCAmbmV3X21hcCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwluZXdfbWFwLT5tYWdpYyA9IHNyYy0+bWFnaWM7CisJbmV3X21hcC0+ZnMgPSBzcmMtPmZzOworCW5ld19tYXAtPmJhc2VfZXJyb3JfY29kZSA9IHNyYy0+YmFzZV9lcnJvcl9jb2RlOworCSpkZXN0ID0gbmV3X21hcDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBleHQyZnNfc2V0X2JpdG1hcF9wYWRkaW5nKGV4dDJmc19nZW5lcmljX2JpdG1hcCBtYXApCit7CisJX191MzIJaSwgajsKKworCWZvciAoaT1tYXAtPmVuZCsxLCBqID0gaSAtIG1hcC0+c3RhcnQ7IGkgPD0gbWFwLT5yZWFsX2VuZDsgaSsrLCBqKyspCisJCWV4dDJmc19zZXRfYml0KGosIG1hcC0+Yml0bWFwKTsKK30KKworZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZXh0Ml9maWxzeXMgZnMsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRlc2NyLAorCQkJCSAgICAgICBleHQyZnNfaW5vZGVfYml0bWFwICpyZXQpCit7CisJZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXA7CisJZXJyY29kZV90CXJldHZhbDsKKwlfX3UzMgkJc3RhcnQsIGVuZCwgcmVhbF9lbmQ7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJZnMtPndyaXRlX2JpdG1hcHMgPSBleHQyZnNfd3JpdGVfYml0bWFwczsKKworCXN0YXJ0ID0gMTsKKwllbmQgPSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50OworCXJlYWxfZW5kID0gKEVYVDJfSU5PREVTX1BFUl9HUk9VUChmcy0+c3VwZXIpICogZnMtPmdyb3VwX2Rlc2NfY291bnQpOworCisJcmV0dmFsID0gZXh0MmZzX2FsbG9jYXRlX2dlbmVyaWNfYml0bWFwKHN0YXJ0LCBlbmQsIHJlYWxfZW5kLAorCQkJCQkJZGVzY3IsICZiaXRtYXApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwliaXRtYXAtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19JTk9ERV9CSVRNQVA7CisJYml0bWFwLT5mcyA9IGZzOworCWJpdG1hcC0+YmFzZV9lcnJvcl9jb2RlID0gRVhUMl9FVF9CQURfSU5PREVfTUFSSzsKKworCSpyZXQgPSBiaXRtYXA7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfYWxsb2NhdGVfYmxvY2tfYml0bWFwKGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpkZXNjciwKKwkJCQkgICAgICAgZXh0MmZzX2Jsb2NrX2JpdG1hcCAqcmV0KQoreworCWV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwOworCWVycmNvZGVfdAlyZXR2YWw7CisJX191MzIJCXN0YXJ0LCBlbmQsIHJlYWxfZW5kOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWZzLT53cml0ZV9iaXRtYXBzID0gZXh0MmZzX3dyaXRlX2JpdG1hcHM7CisKKwlzdGFydCA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCWVuZCA9IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQtMTsKKwlyZWFsX2VuZCA9IChFWFQyX0JMT0NLU19QRVJfR1JPVVAoZnMtPnN1cGVyKQorCQkgICAgKiBmcy0+Z3JvdXBfZGVzY19jb3VudCktMSArIHN0YXJ0OworCisJcmV0dmFsID0gZXh0MmZzX2FsbG9jYXRlX2dlbmVyaWNfYml0bWFwKHN0YXJ0LCBlbmQsIHJlYWxfZW5kLAorCQkJCQkJZGVzY3IsICZiaXRtYXApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwliaXRtYXAtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19CTE9DS19CSVRNQVA7CisJYml0bWFwLT5mcyA9IGZzOworCWJpdG1hcC0+YmFzZV9lcnJvcl9jb2RlID0gRVhUMl9FVF9CQURfQkxPQ0tfTUFSSzsKKworCSpyZXQgPSBiaXRtYXA7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZnVkZ2VfaW5vZGVfYml0bWFwX2VuZChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwKKwkJCQkJZXh0Ml9pbm9fdCBlbmQsIGV4dDJfaW5vX3QgKm9lbmQpCit7CisJRVhUMl9DSEVDS19NQUdJQyhiaXRtYXAsIEVYVDJfRVRfTUFHSUNfSU5PREVfQklUTUFQKTsKKworCWlmIChlbmQgPiBiaXRtYXAtPnJlYWxfZW5kKQorCQlyZXR1cm4gRVhUMl9FVF9GVURHRV9JTk9ERV9CSVRNQVBfRU5EOworCWlmIChvZW5kKQorCQkqb2VuZCA9IGJpdG1hcC0+ZW5kOworCWJpdG1hcC0+ZW5kID0gZW5kOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2Z1ZGdlX2Jsb2NrX2JpdG1hcF9lbmQoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCWJsa190IGVuZCwgYmxrX3QgKm9lbmQpCit7CisJRVhUMl9DSEVDS19NQUdJQyhiaXRtYXAsIEVYVDJfRVRfTUFHSUNfQkxPQ0tfQklUTUFQKTsKKworCWlmIChlbmQgPiBiaXRtYXAtPnJlYWxfZW5kKQorCQlyZXR1cm4gRVhUMl9FVF9GVURHRV9CTE9DS19CSVRNQVBfRU5EOworCWlmIChvZW5kKQorCQkqb2VuZCA9IGJpdG1hcC0+ZW5kOworCWJpdG1hcC0+ZW5kID0gZW5kOworCXJldHVybiAwOworfQorCit2b2lkIGV4dDJmc19jbGVhcl9pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXApCit7CisJaWYgKCFiaXRtYXAgfHwgKGJpdG1hcC0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19JTk9ERV9CSVRNQVApKQorCQlyZXR1cm47CisKKwltZW1zZXQoYml0bWFwLT5iaXRtYXAsIDAsCisJICAgICAgIChzaXplX3QpICgoKGJpdG1hcC0+cmVhbF9lbmQgLSBiaXRtYXAtPnN0YXJ0KSAvIDgpICsgMSkpOworfQorCit2b2lkIGV4dDJmc19jbGVhcl9ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXApCit7CisJaWYgKCFiaXRtYXAgfHwgKGJpdG1hcC0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19CTE9DS19CSVRNQVApKQorCQlyZXR1cm47CisKKwltZW1zZXQoYml0bWFwLT5iaXRtYXAsIDAsCisJICAgICAgIChzaXplX3QpICgoKGJpdG1hcC0+cmVhbF9lbmQgLSBiaXRtYXAtPnN0YXJ0KSAvIDgpICsgMSkpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JpdG9wcy5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JpdG9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDgzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYml0b3BzLmMKQEAgLTAsMCArMSw5MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYml0b3BzLmMgLS0tIEJpdG1hcCBmcm9iYmluZyBjb2RlLiAgU2VlIGJpdG9wcy5oIGZvciB0aGUgaW5saW5lZAorICoJcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworI2lmbmRlZiBfRVhUMl9IQVZFX0FTTV9CSVRPUFNfCisKKy8qCisgKiBGb3IgdGhlIGJlbmVmaXQgb2YgdGhvc2Ugd2hvIGFyZSB0cnlpbmcgdG8gcG9ydCBMaW51eCB0byBhbm90aGVyCisgKiBhcmNoaXRlY3R1cmUsIGhlcmUgYXJlIHNvbWUgQy1sYW5ndWFnZSBlcXVpdmFsZW50cy4gIFlvdSBzaG91bGQKKyAqIHJlY29kZSB0aGVzZSBpbiB0aGUgbmF0aXZlIGFzc21lYmx5IGxhbmd1YWdlLCBpZiBhdCBhbGwgcG9zc2libGUuCisgKgorICogQyBsYW5ndWFnZSBlcXVpdmFsZW50cyB3cml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDkvMjYvOTIuCisgKiBNb2RpZmllZCBieSBQZXRlIEEuIFphaXRjZXYgNy8xNC85NSB0byBiZSBwb3J0YWJsZSB0byBiaWcgZW5kaWFuCisgKiBzeXN0ZW1zLCBhcyB3ZWxsIGFzIG5vbi0zMiBiaXQgc3lzdGVtcy4KKyAqLworCitpbnQgZXh0MmZzX3NldF9iaXQodW5zaWduZWQgaW50IG5yLHZvaWQgKiBhZGRyKQoreworCWludAkJbWFzaywgcmV0dmFsOworCXVuc2lnbmVkIGNoYXIJKkFERFIgPSAodW5zaWduZWQgY2hhciAqKSBhZGRyOworCisJQUREUiArPSBuciA+PiAzOworCW1hc2sgPSAxIDw8IChuciAmIDB4MDcpOworCXJldHZhbCA9IG1hc2sgJiAqQUREUjsKKwkqQUREUiB8PSBtYXNrOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBleHQyZnNfY2xlYXJfYml0KHVuc2lnbmVkIGludCBuciwgdm9pZCAqIGFkZHIpCit7CisJaW50CQltYXNrLCByZXR2YWw7CisJdW5zaWduZWQgY2hhcgkqQUREUiA9ICh1bnNpZ25lZCBjaGFyICopIGFkZHI7CisKKwlBRERSICs9IG5yID4+IDM7CisJbWFzayA9IDEgPDwgKG5yICYgMHgwNyk7CisJcmV0dmFsID0gbWFzayAmICpBRERSOworCSpBRERSICY9IH5tYXNrOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBleHQyZnNfdGVzdF9iaXQodW5zaWduZWQgaW50IG5yLCBjb25zdCB2b2lkICogYWRkcikKK3sKKwlpbnQJCQltYXNrOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJKkFERFIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBhZGRyOworCisJQUREUiArPSBuciA+PiAzOworCW1hc2sgPSAxIDw8IChuciAmIDB4MDcpOworCXJldHVybiAobWFzayAmICpBRERSKTsKK30KKworI2VuZGlmICAvKiAhX0VYVDJfSEFWRV9BU01fQklUT1BTXyAqLworCit2b2lkIGV4dDJmc193YXJuX2JpdG1hcChlcnJjb2RlX3QgZXJyY29kZSwgdW5zaWduZWQgbG9uZyBhcmcsCisJCQljb25zdCBjaGFyICpkZXNjcmlwdGlvbikKK3sKKyNpZm5kZWYgT01JVF9DT01fRVJSCisJaWYgKGRlc2NyaXB0aW9uKQorCQliYl9lcnJvcl9tc2coIiMlbHUgZm9yICVzIiwgYXJnLCBkZXNjcmlwdGlvbik7CisJZWxzZQorCQliYl9lcnJvcl9tc2coIiMlbHUiLCBhcmcpOworI2VuZGlmCit9CisKK3ZvaWQgZXh0MmZzX3dhcm5fYml0bWFwMihleHQyZnNfZ2VuZXJpY19iaXRtYXAgYml0bWFwLAorCQkJICAgIGludCBjb2RlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyNpZm5kZWYgT01JVF9DT01fRVJSCisJaWYgKGJpdG1hcC0+ZGVzY3JpcHRpb24pCisJCWJiX2Vycm9yX21zZygiIyVsdSBmb3IgJXMiLCBhcmcsIGJpdG1hcC0+ZGVzY3JpcHRpb24pOworCWVsc2UKKwkJYmJfZXJyb3JfbXNnKCIjJWx1IiwgYXJnKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JpdG9wcy5oIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JpdG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzFhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYml0b3BzLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJpdG9wcy5oIC0tLSBCaXRtYXAgZnJvYmJpbmcgY29kZS4gIFRoZSBieXRlIHN3YXBwaW5nIHJvdXRpbmVzIGFyZQorICoJYWxzbyBpbmNsdWRlZCBoZXJlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKgorICogaTM4NiBiaXRvcHMgb3BlcmF0aW9ucyB0YWtlbiBmcm9tIDxhc20vYml0b3BzLmg+LCBDb3B5cmlnaHQgMTk5MiwKKyAqIExpbnVzIFRvcnZhbGRzLgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2V4dGVybiBpbnQgZXh0MmZzX3NldF9iaXQodW5zaWduZWQgaW50IG5yLHZvaWQgKiBhZGRyKTsKK2V4dGVybiBpbnQgZXh0MmZzX2NsZWFyX2JpdCh1bnNpZ25lZCBpbnQgbnIsIHZvaWQgKiBhZGRyKTsKK2V4dGVybiBpbnQgZXh0MmZzX3Rlc3RfYml0KHVuc2lnbmVkIGludCBuciwgY29uc3Qgdm9pZCAqIGFkZHIpOworZXh0ZXJuIF9fdTE2IGV4dDJmc19zd2FiMTYoX191MTYgdmFsKTsKK2V4dGVybiBfX3UzMiBleHQyZnNfc3dhYjMyKF9fdTMyIHZhbCk7CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgZXh0MmZzX2NwdV90b19sZTMyKHgpIGV4dDJmc19zd2FiMzIoKHgpKQorI2RlZmluZSBleHQyZnNfbGUzMl90b19jcHUoeCkgZXh0MmZzX3N3YWIzMigoeCkpCisjZGVmaW5lIGV4dDJmc19jcHVfdG9fbGUxNih4KSBleHQyZnNfc3dhYjE2KCh4KSkKKyNkZWZpbmUgZXh0MmZzX2xlMTZfdG9fY3B1KHgpIGV4dDJmc19zd2FiMTYoKHgpKQorI2RlZmluZSBleHQyZnNfY3B1X3RvX2JlMzIoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIGV4dDJmc19iZTMyX3RvX2NwdSh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgZXh0MmZzX2NwdV90b19iZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBleHQyZnNfYmUxNl90b19jcHUoeCkgKChfX3UxNikoeCkpCisjZWxzZQorI2RlZmluZSBleHQyZnNfY3B1X3RvX2xlMzIoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIGV4dDJmc19sZTMyX3RvX2NwdSh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgZXh0MmZzX2NwdV90b19sZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBleHQyZnNfbGUxNl90b19jcHUoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIGV4dDJmc19jcHVfdG9fYmUzMih4KSBleHQyZnNfc3dhYjMyKCh4KSkKKyNkZWZpbmUgZXh0MmZzX2JlMzJfdG9fY3B1KHgpIGV4dDJmc19zd2FiMzIoKHgpKQorI2RlZmluZSBleHQyZnNfY3B1X3RvX2JlMTYoeCkgZXh0MmZzX3N3YWIxNigoeCkpCisjZGVmaW5lIGV4dDJmc19iZTE2X3RvX2NwdSh4KSBleHQyZnNfc3dhYjE2KCh4KSkKKyNlbmRpZgorCisvKgorICogRVhUMkZTIGJpdG1hcCBtYW5pcHVsYXRpb24gcm91dGluZXMuCisgKi8KKworLyogU3VwcG9ydCBmb3Igc2VuZGluZyB3YXJuaW5nIG1lc3NhZ2VzIGZyb20gdGhlIGlubGluZSBzdWJyb3V0aW5lcyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmV4dDJmc19ibG9ja19zdHJpbmc7CitleHRlcm4gY29uc3QgY2hhciAqZXh0MmZzX2lub2RlX3N0cmluZzsKK2V4dGVybiBjb25zdCBjaGFyICpleHQyZnNfbWFya19zdHJpbmc7CitleHRlcm4gY29uc3QgY2hhciAqZXh0MmZzX3VubWFya19zdHJpbmc7CitleHRlcm4gY29uc3QgY2hhciAqZXh0MmZzX3Rlc3Rfc3RyaW5nOworZXh0ZXJuIHZvaWQgZXh0MmZzX3dhcm5fYml0bWFwKGVycmNvZGVfdCBlcnJjb2RlLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJCSAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbik7CitleHRlcm4gdm9pZCBleHQyZnNfd2Fybl9iaXRtYXAyKGV4dDJmc19nZW5lcmljX2JpdG1hcCBiaXRtYXAsCisJCQkJaW50IGNvZGUsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworZXh0ZXJuIGludCBleHQyZnNfbWFya19ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsIGJsa190IGJsb2NrKTsKK2V4dGVybiBpbnQgZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJICAgICAgIGJsa190IGJsb2NrKTsKK2V4dGVybiBpbnQgZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLCBibGtfdCBibG9jayk7CisKK2V4dGVybiBpbnQgZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLCBleHQyX2lub190IGlub2RlKTsKK2V4dGVybiBpbnQgZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXAsCisJCQkJICAgICAgIGV4dDJfaW5vX3QgaW5vZGUpOworZXh0ZXJuIGludCBleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXAsIGV4dDJfaW5vX3QgaW5vZGUpOworCitleHRlcm4gdm9pZCBleHQyZnNfZmFzdF9tYXJrX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICBibGtfdCBibG9jayk7CitleHRlcm4gdm9pZCBleHQyZnNfZmFzdF91bm1hcmtfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgYmxrX3QgYmxvY2spOworZXh0ZXJuIGludCBleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJIGJsa190IGJsb2NrKTsKKworZXh0ZXJuIHZvaWQgZXh0MmZzX2Zhc3RfbWFya19pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgZXh0Ml9pbm9fdCBpbm9kZSk7CitleHRlcm4gdm9pZCBleHQyZnNfZmFzdF91bm1hcmtfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgZXh0Ml9pbm9fdCBpbm9kZSk7CitleHRlcm4gaW50IGV4dDJmc19mYXN0X3Rlc3RfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCQkgZXh0Ml9pbm9fdCBpbm9kZSk7CitleHRlcm4gYmxrX3QgZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfc3RhcnQoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXApOworZXh0ZXJuIGV4dDJfaW5vX3QgZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfc3RhcnQoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXApOworZXh0ZXJuIGJsa190IGV4dDJmc19nZXRfYmxvY2tfYml0bWFwX2VuZChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCk7CitleHRlcm4gZXh0Ml9pbm9fdCBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9lbmQoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXApOworCitleHRlcm4gdm9pZCBleHQyZnNfbWFya19ibG9ja19iaXRtYXBfcmFuZ2UoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgIGJsa190IGJsb2NrLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGV4dDJmc191bm1hcmtfYmxvY2tfYml0bWFwX3JhbmdlKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgIGJsa190IGJsb2NrLCBpbnQgbnVtKTsKK2V4dGVybiBpbnQgZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwX3JhbmdlKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgIGJsa190IGJsb2NrLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGV4dDJmc19mYXN0X21hcmtfYmxvY2tfYml0bWFwX3JhbmdlKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkJYmxrX3QgYmxvY2ssIGludCBudW0pOworZXh0ZXJuIHZvaWQgZXh0MmZzX2Zhc3RfdW5tYXJrX2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJCSAgYmxrX3QgYmxvY2ssIGludCBudW0pOworZXh0ZXJuIGludCBleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgICAgIGJsa190IGJsb2NrLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGV4dDJmc19zZXRfYml0bWFwX3BhZGRpbmcoZXh0MmZzX2dlbmVyaWNfYml0bWFwIG1hcCk7CisKKy8qIFRoZXNlIHR3byByb3V0aW5lcyBtb3ZlZCB0byBnZW5fYml0bWFwLmMgKi8KK2V4dGVybiBpbnQgZXh0MmZzX21hcmtfZ2VuZXJpY19iaXRtYXAoZXh0MmZzX2dlbmVyaWNfYml0bWFwIGJpdG1hcCwKKwkJCQkJIF9fdTMyIGJpdG5vKTsKK2V4dGVybiBpbnQgZXh0MmZzX3VubWFya19nZW5lcmljX2JpdG1hcChleHQyZnNfZ2VuZXJpY19iaXRtYXAgYml0bWFwLAorCQkJCQkgICBibGtfdCBiaXRubyk7CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmxvY2suYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZDA0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmxvY2suYwpAQCAtMCwwICsxLDQzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmxvY2suYyAtLS0gaXRlcmF0ZSBvdmVyIGFsbCBibG9ja3MgaW4gYW4gaW5vZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdHJ1Y3QgYmxvY2tfY29udGV4dCB7CisJZXh0Ml9maWxzeXMJZnM7CisJaW50ICgqZnVuYykoZXh0Ml9maWxzeXMJZnMsCisJCSAgICBibGtfdAkqYmxvY2tuciwKKwkJICAgIGUyX2Jsa2NudF90CWJjb3VudCwKKwkJICAgIGJsa190CXJlZl9ibGssCisJCSAgICBpbnQJCXJlZl9vZmZzZXQsCisJCSAgICB2b2lkCSpwcml2X2RhdGEpOworCWUyX2Jsa2NudF90CWJjb3VudDsKKwlpbnQJCWJzaXplOworCWludAkJZmxhZ3M7CisJZXJyY29kZV90CWVycmNvZGU7CisJY2hhcgkqaW5kX2J1ZjsKKwljaGFyCSpkaW5kX2J1ZjsKKwljaGFyCSp0aW5kX2J1ZjsKKwl2b2lkCSpwcml2X2RhdGE7Cit9OworCitzdGF0aWMgaW50IGJsb2NrX2l0ZXJhdGVfaW5kKGJsa190ICppbmRfYmxvY2ssIGJsa190IHJlZl9ibG9jaywKKwkJCSAgICAgaW50IHJlZl9vZmZzZXQsIHN0cnVjdCBibG9ja19jb250ZXh0ICpjdHgpCit7CisJaW50CXJldCA9IDAsIGNoYW5nZWQgPSAwOworCWludAlpLCBmbGFncywgbGltaXQsIG9mZnNldDsKKwlibGtfdAkqYmxvY2tfbnI7CisKKwlsaW1pdCA9IGN0eC0+ZnMtPmJsb2Nrc2l6ZSA+PiAyOworCWlmICghKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFKSAmJgorCSAgICAhKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0RBVEFfT05MWSkpCisJCXJldCA9ICgqY3R4LT5mdW5jKShjdHgtPmZzLCBpbmRfYmxvY2ssCisJCQkJICAgQkxPQ0tfQ09VTlRfSU5ELCByZWZfYmxvY2ssCisJCQkJICAgcmVmX29mZnNldCwgY3R4LT5wcml2X2RhdGEpOworCWlmICghKmluZF9ibG9jayB8fCAocmV0ICYgQkxPQ0tfQUJPUlQpKSB7CisJCWN0eC0+YmNvdW50ICs9IGxpbWl0OworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoKmluZF9ibG9jayA+PSBjdHgtPmZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgfHwKKwkgICAgKmluZF9ibG9jayA8IGN0eC0+ZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHsKKwkJY3R4LT5lcnJjb2RlID0gRVhUMl9FVF9CQURfSU5EX0JMT0NLOworCQlyZXQgfD0gQkxPQ0tfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCWN0eC0+ZXJyY29kZSA9IGV4dDJmc19yZWFkX2luZF9ibG9jayhjdHgtPmZzLCAqaW5kX2Jsb2NrLAorCQkJCQkgICAgIGN0eC0+aW5kX2J1Zik7CisJaWYgKGN0eC0+ZXJyY29kZSkgeworCQlyZXQgfD0gQkxPQ0tfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCisJYmxvY2tfbnIgPSAoYmxrX3QgKikgY3R4LT5pbmRfYnVmOworCW9mZnNldCA9IDA7CisJaWYgKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0FQUEVORCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgY3R4LT5iY291bnQrKywgYmxvY2tfbnIrKykgeworCQkJZmxhZ3MgPSAoKmN0eC0+ZnVuYykoY3R4LT5mcywgYmxvY2tfbnIsIGN0eC0+YmNvdW50LAorCQkJCQkgICAgICppbmRfYmxvY2ssIG9mZnNldCwKKwkJCQkJICAgICBjdHgtPnByaXZfZGF0YSk7CisJCQljaGFuZ2VkCXw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgQkxPQ0tfQUJPUlQpIHsKKwkJCQlyZXQgfD0gQkxPQ0tfQUJPUlQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvZmZzZXQgKz0gc2l6ZW9mKGJsa190KTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBjdHgtPmJjb3VudCsrLCBibG9ja19ucisrKSB7CisJCQlpZiAoKmJsb2NrX25yID09IDApCisJCQkJY29udGludWU7CisJCQlmbGFncyA9ICgqY3R4LT5mdW5jKShjdHgtPmZzLCBibG9ja19uciwgY3R4LT5iY291bnQsCisJCQkJCSAgICAgKmluZF9ibG9jaywgb2Zmc2V0LAorCQkJCQkgICAgIGN0eC0+cHJpdl9kYXRhKTsKKwkJCWNoYW5nZWQJfD0gZmxhZ3M7CisJCQlpZiAoZmxhZ3MgJiBCTE9DS19BQk9SVCkgeworCQkJCXJldCB8PSBCTE9DS19BQk9SVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW9mZnNldCArPSBzaXplb2YoYmxrX3QpOworCQl9CisJfQorCWlmIChjaGFuZ2VkICYgQkxPQ0tfQ0hBTkdFRCkgeworCQljdHgtPmVycmNvZGUgPSBleHQyZnNfd3JpdGVfaW5kX2Jsb2NrKGN0eC0+ZnMsICppbmRfYmxvY2ssCisJCQkJCQkgICAgICBjdHgtPmluZF9idWYpOworCQlpZiAoY3R4LT5lcnJjb2RlKQorCQkJcmV0IHw9IEJMT0NLX0VSUk9SIHwgQkxPQ0tfQUJPUlQ7CisJfQorCWlmICgoY3R4LT5mbGFncyAmIEJMT0NLX0ZMQUdfREVQVEhfVFJBVkVSU0UpICYmCisJICAgICEoY3R4LT5mbGFncyAmIEJMT0NLX0ZMQUdfREFUQV9PTkxZKSAmJgorCSAgICAhKHJldCAmIEJMT0NLX0FCT1JUKSkKKwkJcmV0IHw9ICgqY3R4LT5mdW5jKShjdHgtPmZzLCBpbmRfYmxvY2ssCisJCQkJICAgIEJMT0NLX0NPVU5UX0lORCwgcmVmX2Jsb2NrLAorCQkJCSAgICByZWZfb2Zmc2V0LCBjdHgtPnByaXZfZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBibG9ja19pdGVyYXRlX2RpbmQoYmxrX3QgKmRpbmRfYmxvY2ssIGJsa190IHJlZl9ibG9jaywKKwkJCSAgICAgIGludCByZWZfb2Zmc2V0LCBzdHJ1Y3QgYmxvY2tfY29udGV4dCAqY3R4KQoreworCWludAlyZXQgPSAwLCBjaGFuZ2VkID0gMDsKKwlpbnQJaSwgZmxhZ3MsIGxpbWl0LCBvZmZzZXQ7CisJYmxrX3QJKmJsb2NrX25yOworCisJbGltaXQgPSBjdHgtPmZzLT5ibG9ja3NpemUgPj4gMjsKKwlpZiAoIShjdHgtPmZsYWdzICYgKEJMT0NLX0ZMQUdfREVQVEhfVFJBVkVSU0UgfAorCQkJICAgIEJMT0NLX0ZMQUdfREFUQV9PTkxZKSkpCisJCXJldCA9ICgqY3R4LT5mdW5jKShjdHgtPmZzLCBkaW5kX2Jsb2NrLAorCQkJCSAgIEJMT0NLX0NPVU5UX0RJTkQsIHJlZl9ibG9jaywKKwkJCQkgICByZWZfb2Zmc2V0LCBjdHgtPnByaXZfZGF0YSk7CisJaWYgKCEqZGluZF9ibG9jayB8fCAocmV0ICYgQkxPQ0tfQUJPUlQpKSB7CisJCWN0eC0+YmNvdW50ICs9IGxpbWl0KmxpbWl0OworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoKmRpbmRfYmxvY2sgPj0gY3R4LT5mcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IHx8CisJICAgICpkaW5kX2Jsb2NrIDwgY3R4LT5mcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgeworCQljdHgtPmVycmNvZGUgPSBFWFQyX0VUX0JBRF9ESU5EX0JMT0NLOworCQlyZXQgfD0gQkxPQ0tfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCWN0eC0+ZXJyY29kZSA9IGV4dDJmc19yZWFkX2luZF9ibG9jayhjdHgtPmZzLCAqZGluZF9ibG9jaywKKwkJCQkJICAgICBjdHgtPmRpbmRfYnVmKTsKKwlpZiAoY3R4LT5lcnJjb2RlKSB7CisJCXJldCB8PSBCTE9DS19FUlJPUjsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlibG9ja19uciA9IChibGtfdCAqKSBjdHgtPmRpbmRfYnVmOworCW9mZnNldCA9IDA7CisJaWYgKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0FQUEVORCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgYmxvY2tfbnIrKykgeworCQkJZmxhZ3MgPSBibG9ja19pdGVyYXRlX2luZChibG9ja19uciwKKwkJCQkJCSAgKmRpbmRfYmxvY2ssIG9mZnNldCwKKwkJCQkJCSAgY3R4KTsKKwkJCWNoYW5nZWQgfD0gZmxhZ3M7CisJCQlpZiAoZmxhZ3MgJiAoQkxPQ0tfQUJPUlQgfCBCTE9DS19FUlJPUikpIHsKKwkJCQlyZXQgfD0gZmxhZ3MgJiAoQkxPQ0tfQUJPUlQgfCBCTE9DS19FUlJPUik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvZmZzZXQgKz0gc2l6ZW9mKGJsa190KTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBibG9ja19ucisrKSB7CisJCQlpZiAoKmJsb2NrX25yID09IDApIHsKKwkJCQljdHgtPmJjb3VudCArPSBsaW1pdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZsYWdzID0gYmxvY2tfaXRlcmF0ZV9pbmQoYmxvY2tfbnIsCisJCQkJCQkgICpkaW5kX2Jsb2NrLCBvZmZzZXQsCisJCQkJCQkgIGN0eCk7CisJCQljaGFuZ2VkIHw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgKEJMT0NLX0FCT1JUIHwgQkxPQ0tfRVJST1IpKSB7CisJCQkJcmV0IHw9IGZsYWdzICYgKEJMT0NLX0FCT1JUIHwgQkxPQ0tfRVJST1IpOworCQkJCWJyZWFrOworCQkJfQorCQkJb2Zmc2V0ICs9IHNpemVvZihibGtfdCk7CisJCX0KKwl9CisJaWYgKGNoYW5nZWQgJiBCTE9DS19DSEFOR0VEKSB7CisJCWN0eC0+ZXJyY29kZSA9IGV4dDJmc193cml0ZV9pbmRfYmxvY2soY3R4LT5mcywgKmRpbmRfYmxvY2ssCisJCQkJCQkgICAgICBjdHgtPmRpbmRfYnVmKTsKKwkJaWYgKGN0eC0+ZXJyY29kZSkKKwkJCXJldCB8PSBCTE9DS19FUlJPUiB8IEJMT0NLX0FCT1JUOworCX0KKwlpZiAoKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFKSAmJgorCSAgICAhKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0RBVEFfT05MWSkgJiYKKwkgICAgIShyZXQgJiBCTE9DS19BQk9SVCkpCisJCXJldCB8PSAoKmN0eC0+ZnVuYykoY3R4LT5mcywgZGluZF9ibG9jaywKKwkJCQkgICAgQkxPQ0tfQ09VTlRfRElORCwgcmVmX2Jsb2NrLAorCQkJCSAgICByZWZfb2Zmc2V0LCBjdHgtPnByaXZfZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBibG9ja19pdGVyYXRlX3RpbmQoYmxrX3QgKnRpbmRfYmxvY2ssIGJsa190IHJlZl9ibG9jaywKKwkJCSAgICAgIGludCByZWZfb2Zmc2V0LCBzdHJ1Y3QgYmxvY2tfY29udGV4dCAqY3R4KQoreworCWludAlyZXQgPSAwLCBjaGFuZ2VkID0gMDsKKwlpbnQJaSwgZmxhZ3MsIGxpbWl0LCBvZmZzZXQ7CisJYmxrX3QJKmJsb2NrX25yOworCisJbGltaXQgPSBjdHgtPmZzLT5ibG9ja3NpemUgPj4gMjsKKwlpZiAoIShjdHgtPmZsYWdzICYgKEJMT0NLX0ZMQUdfREVQVEhfVFJBVkVSU0UgfAorCQkJICAgIEJMT0NLX0ZMQUdfREFUQV9PTkxZKSkpCisJCXJldCA9ICgqY3R4LT5mdW5jKShjdHgtPmZzLCB0aW5kX2Jsb2NrLAorCQkJCSAgIEJMT0NLX0NPVU5UX1RJTkQsIHJlZl9ibG9jaywKKwkJCQkgICByZWZfb2Zmc2V0LCBjdHgtPnByaXZfZGF0YSk7CisJaWYgKCEqdGluZF9ibG9jayB8fCAocmV0ICYgQkxPQ0tfQUJPUlQpKSB7CisJCWN0eC0+YmNvdW50ICs9IGxpbWl0KmxpbWl0KmxpbWl0OworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoKnRpbmRfYmxvY2sgPj0gY3R4LT5mcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IHx8CisJICAgICp0aW5kX2Jsb2NrIDwgY3R4LT5mcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgeworCQljdHgtPmVycmNvZGUgPSBFWFQyX0VUX0JBRF9USU5EX0JMT0NLOworCQlyZXQgfD0gQkxPQ0tfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCWN0eC0+ZXJyY29kZSA9IGV4dDJmc19yZWFkX2luZF9ibG9jayhjdHgtPmZzLCAqdGluZF9ibG9jaywKKwkJCQkJICAgICBjdHgtPnRpbmRfYnVmKTsKKwlpZiAoY3R4LT5lcnJjb2RlKSB7CisJCXJldCB8PSBCTE9DS19FUlJPUjsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlibG9ja19uciA9IChibGtfdCAqKSBjdHgtPnRpbmRfYnVmOworCW9mZnNldCA9IDA7CisJaWYgKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0FQUEVORCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgYmxvY2tfbnIrKykgeworCQkJZmxhZ3MgPSBibG9ja19pdGVyYXRlX2RpbmQoYmxvY2tfbnIsCisJCQkJCQkgICAqdGluZF9ibG9jaywKKwkJCQkJCSAgIG9mZnNldCwgY3R4KTsKKwkJCWNoYW5nZWQgfD0gZmxhZ3M7CisJCQlpZiAoZmxhZ3MgJiAoQkxPQ0tfQUJPUlQgfCBCTE9DS19FUlJPUikpIHsKKwkJCQlyZXQgfD0gZmxhZ3MgJiAoQkxPQ0tfQUJPUlQgfCBCTE9DS19FUlJPUik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvZmZzZXQgKz0gc2l6ZW9mKGJsa190KTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBibG9ja19ucisrKSB7CisJCQlpZiAoKmJsb2NrX25yID09IDApIHsKKwkJCQljdHgtPmJjb3VudCArPSBsaW1pdCpsaW1pdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZsYWdzID0gYmxvY2tfaXRlcmF0ZV9kaW5kKGJsb2NrX25yLAorCQkJCQkJICAgKnRpbmRfYmxvY2ssCisJCQkJCQkgICBvZmZzZXQsIGN0eCk7CisJCQljaGFuZ2VkIHw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgKEJMT0NLX0FCT1JUIHwgQkxPQ0tfRVJST1IpKSB7CisJCQkJcmV0IHw9IGZsYWdzICYgKEJMT0NLX0FCT1JUIHwgQkxPQ0tfRVJST1IpOworCQkJCWJyZWFrOworCQkJfQorCQkJb2Zmc2V0ICs9IHNpemVvZihibGtfdCk7CisJCX0KKwl9CisJaWYgKGNoYW5nZWQgJiBCTE9DS19DSEFOR0VEKSB7CisJCWN0eC0+ZXJyY29kZSA9IGV4dDJmc193cml0ZV9pbmRfYmxvY2soY3R4LT5mcywgKnRpbmRfYmxvY2ssCisJCQkJCQkgICAgICBjdHgtPnRpbmRfYnVmKTsKKwkJaWYgKGN0eC0+ZXJyY29kZSkKKwkJCXJldCB8PSBCTE9DS19FUlJPUiB8IEJMT0NLX0FCT1JUOworCX0KKwlpZiAoKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFKSAmJgorCSAgICAhKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0RBVEFfT05MWSkgJiYKKwkgICAgIShyZXQgJiBCTE9DS19BQk9SVCkpCisJCXJldCB8PSAoKmN0eC0+ZnVuYykoY3R4LT5mcywgdGluZF9ibG9jaywKKwkJCQkgICAgQkxPQ0tfQ09VTlRfVElORCwgcmVmX2Jsb2NrLAorCQkJCSAgICByZWZfb2Zmc2V0LCBjdHgtPnByaXZfZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitlcnJjb2RlX3QgZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGV4dDJfZmlsc3lzIGZzLAorCQkJCWV4dDJfaW5vX3QgaW5vLAorCQkJCWludAlmbGFncywKKwkJCQljaGFyICpibG9ja19idWYsCisJCQkJaW50ICgqZnVuYykoZXh0Ml9maWxzeXMgZnMsCisJCQkJCSAgICBibGtfdAkqYmxvY2tuciwKKwkJCQkJICAgIGUyX2Jsa2NudF90CWJsb2NrY250LAorCQkJCQkgICAgYmxrX3QJcmVmX2JsaywKKwkJCQkJICAgIGludAkJcmVmX29mZnNldCwKKwkJCQkJICAgIHZvaWQJKnByaXZfZGF0YSksCisJCQkJdm9pZCAqcHJpdl9kYXRhKQoreworCWludAlpOworCWludAlnb3RfaW5vZGUgPSAwOworCWludAlyZXQgPSAwOworCWJsa190CWJsb2Nrc1tFWFQyX05fQkxPQ0tTXTsJLyogZGlyZWN0b3J5IGRhdGEgYmxvY2tzICovCisJc3RydWN0IGV4dDJfaW5vZGUgaW5vZGU7CisJZXJyY29kZV90CXJldHZhbDsKKwlzdHJ1Y3QgYmxvY2tfY29udGV4dCBjdHg7CisJaW50CWxpbWl0OworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gbGltaXQgbGFyZ2UgZmlsZXMKKwkgKi8KKwlpZiAoZmxhZ3MgJiBCTE9DS19GTEFHX05PX0xBUkdFKSB7CisJCWN0eC5lcnJjb2RlID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIGlubywgJmlub2RlKTsKKwkJaWYgKGN0eC5lcnJjb2RlKQorCQkJcmV0dXJuIGN0eC5lcnJjb2RlOworCQlnb3RfaW5vZGUgPSAxOworCQlpZiAoIUxJTlVYX1NfSVNESVIoaW5vZGUuaV9tb2RlKSAmJgorCQkgICAgKGlub2RlLmlfc2l6ZV9oaWdoICE9IDApKQorCQkJcmV0dXJuIEVYVDJfRVRfRklMRV9UT09fQklHOworCX0KKworCXJldHZhbCA9IGV4dDJmc19nZXRfYmxvY2tzKGZzLCBpbm8sIGJsb2Nrcyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWxpbWl0ID0gZnMtPmJsb2Nrc2l6ZSA+PiAyOworCisJY3R4LmZzID0gZnM7CisJY3R4LmZ1bmMgPSBmdW5jOworCWN0eC5wcml2X2RhdGEgPSBwcml2X2RhdGE7CisJY3R4LmZsYWdzID0gZmxhZ3M7CisJY3R4LmJjb3VudCA9IDA7CisJaWYgKGJsb2NrX2J1ZikgeworCQljdHguaW5kX2J1ZiA9IGJsb2NrX2J1ZjsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplICogMywgJmN0eC5pbmRfYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCWN0eC5kaW5kX2J1ZiA9IGN0eC5pbmRfYnVmICsgZnMtPmJsb2Nrc2l6ZTsKKwljdHgudGluZF9idWYgPSBjdHguZGluZF9idWYgKyBmcy0+YmxvY2tzaXplOworCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgdGhlIEhVUkQgdHJhbnNsYXRvciBibG9jayAoaWYgcHJlc2VudCkKKwkgKi8KKwlpZiAoKGZzLT5zdXBlci0+c19jcmVhdG9yX29zID09IEVYVDJfT1NfSFVSRCkgJiYKKwkgICAgIShmbGFncyAmIEJMT0NLX0ZMQUdfREFUQV9PTkxZKSkgeworCQljdHguZXJyY29kZSA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJCWlmIChjdHguZXJyY29kZSkKKwkJCWdvdG8gYWJvcnRfZXhpdDsKKwkJZ290X2lub2RlID0gMTsKKwkJaWYgKGlub2RlLm9zZDEuaHVyZDEuaF9pX3RyYW5zbGF0b3IpIHsKKwkJCXJldCB8PSAoKmN0eC5mdW5jKShmcywKKwkJCQkJICAgJmlub2RlLm9zZDEuaHVyZDEuaF9pX3RyYW5zbGF0b3IsCisJCQkJCSAgIEJMT0NLX0NPVU5UX1RSQU5TTEFUT1IsCisJCQkJCSAgIDAsIDAsIHByaXZfZGF0YSk7CisJCQlpZiAocmV0ICYgQkxPQ0tfQUJPUlQpCisJCQkJZ290byBhYm9ydF9leGl0OworCQl9CisJfQorCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgbm9ybWFsIGRhdGEgYmxvY2tzCisJICovCisJZm9yIChpID0gMDsgaSA8IEVYVDJfTkRJUl9CTE9DS1M7IGkrKywgY3R4LmJjb3VudCsrKSB7CisJCWlmIChibG9ja3NbaV0gfHwgKGZsYWdzICYgQkxPQ0tfRkxBR19BUFBFTkQpKSB7CisJCQlyZXQgfD0gKCpjdHguZnVuYykoZnMsICZibG9ja3NbaV0sCisJCQkJCSAgICBjdHguYmNvdW50LCAwLCBpLCBwcml2X2RhdGEpOworCQkJaWYgKHJldCAmIEJMT0NLX0FCT1JUKQorCQkJCWdvdG8gYWJvcnRfZXhpdDsKKwkJfQorCX0KKwlpZiAoKihibG9ja3MgKyBFWFQyX0lORF9CTE9DSykgfHwgKGZsYWdzICYgQkxPQ0tfRkxBR19BUFBFTkQpKSB7CisJCXJldCB8PSBibG9ja19pdGVyYXRlX2luZChibG9ja3MgKyBFWFQyX0lORF9CTE9DSywKKwkJCQkJIDAsIEVYVDJfSU5EX0JMT0NLLCAmY3R4KTsKKwkJaWYgKHJldCAmIEJMT0NLX0FCT1JUKQorCQkJZ290byBhYm9ydF9leGl0OworCX0gZWxzZQorCQljdHguYmNvdW50ICs9IGxpbWl0OworCWlmICgqKGJsb2NrcyArIEVYVDJfRElORF9CTE9DSykgfHwgKGZsYWdzICYgQkxPQ0tfRkxBR19BUFBFTkQpKSB7CisJCXJldCB8PSBibG9ja19pdGVyYXRlX2RpbmQoYmxvY2tzICsgRVhUMl9ESU5EX0JMT0NLLAorCQkJCQkgIDAsIEVYVDJfRElORF9CTE9DSywgJmN0eCk7CisJCWlmIChyZXQgJiBCTE9DS19BQk9SVCkKKwkJCWdvdG8gYWJvcnRfZXhpdDsKKwl9IGVsc2UKKwkJY3R4LmJjb3VudCArPSBsaW1pdCAqIGxpbWl0OworCWlmICgqKGJsb2NrcyArIEVYVDJfVElORF9CTE9DSykgfHwgKGZsYWdzICYgQkxPQ0tfRkxBR19BUFBFTkQpKSB7CisJCXJldCB8PSBibG9ja19pdGVyYXRlX3RpbmQoYmxvY2tzICsgRVhUMl9USU5EX0JMT0NLLAorCQkJCQkgIDAsIEVYVDJfVElORF9CTE9DSywgJmN0eCk7CisJCWlmIChyZXQgJiBCTE9DS19BQk9SVCkKKwkJCWdvdG8gYWJvcnRfZXhpdDsKKwl9CisKK2Fib3J0X2V4aXQ6CisJaWYgKHJldCAmIEJMT0NLX0NIQU5HRUQpIHsKKwkJaWYgKCFnb3RfaW5vZGUpIHsKKwkJCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJZm9yIChpPTA7IGkgPCBFWFQyX05fQkxPQ0tTOyBpKyspCisJCQlpbm9kZS5pX2Jsb2NrW2ldID0gYmxvY2tzW2ldOworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIGlubywgJmlub2RlKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKCFibG9ja19idWYpCisJCWV4dDJmc19mcmVlX21lbSgmY3R4LmluZF9idWYpOworCisJcmV0dXJuIChyZXQgJiBCTE9DS19FUlJPUikgPyBjdHguZXJyY29kZSA6IDA7Cit9CisKKy8qCisgKiBFbXVsYXRlIHRoZSBvbGQgZXh0MmZzX2Jsb2NrX2l0ZXJhdGUgZnVuY3Rpb24hCisgKi8KKworc3RydWN0IHhsYXRlIHsKKwlpbnQgKCpmdW5jKShleHQyX2ZpbHN5cwlmcywKKwkJICAgIGJsa190CSpibG9ja25yLAorCQkgICAgaW50CQliY291bnQsCisJCSAgICB2b2lkCSpwcml2X2RhdGEpOworCXZvaWQgKnJlYWxfcHJpdmF0ZTsKK307CisKKyNpZmRlZiBfX1RVUkJPQ19fCisjIHByYWdtYSBhcmdzdXNlZAorI2VuZGlmCitzdGF0aWMgaW50IHhsYXRlX2Z1bmMoZXh0Ml9maWxzeXMgZnMsIGJsa190ICpibG9ja25yLCBlMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJICAgICAgYmxrX3QgcmVmX2Jsb2NrIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgaW50IHJlZl9vZmZzZXQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHhsYXRlICp4bCA9IChzdHJ1Y3QgeGxhdGUgKikgcHJpdl9kYXRhOworCisJcmV0dXJuICgqeGwtPmZ1bmMpKGZzLCBibG9ja25yLCAoaW50KSBibG9ja2NudCwgeGwtPnJlYWxfcHJpdmF0ZSk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfYmxvY2tfaXRlcmF0ZShleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgICBleHQyX2lub190IGlubywKKwkJCSAgICAgICBpbnQJZmxhZ3MsCisJCQkgICAgICAgY2hhciAqYmxvY2tfYnVmLAorCQkJICAgICAgIGludCAoKmZ1bmMpKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkgICBibGtfdAkqYmxvY2tuciwKKwkJCQkJICAgaW50CWJsb2NrY250LAorCQkJCQkgICB2b2lkCSpwcml2X2RhdGEpLAorCQkJICAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgeGxhdGUgeGw7CisKKwl4bC5yZWFsX3ByaXZhdGUgPSBwcml2X2RhdGE7CisJeGwuZnVuYyA9IGZ1bmM7CisKKwlyZXR1cm4gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBpbm8sIEJMT0NLX0ZMQUdfTk9fTEFSR0UgfCBmbGFncywKKwkJCQkgICAgIGJsb2NrX2J1ZiwgeGxhdGVfZnVuYywgJnhsKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ibWFwLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYm1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NmIwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYm1hcC5jCkBAIC0wLDAgKzEsMjYxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBibWFwLmMgLS0tIGxvZ2ljYWwgdG8gcGh5c2ljYWwgYmxvY2sgbWFwcGluZworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2JtYXAoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsCisJCQkgICAgIGNoYXIgKmJsb2NrX2J1ZiwgaW50IGJtYXBfZmxhZ3MsCisJCQkgICAgIGJsa190IGJsb2NrLCBibGtfdCAqcGh5c19ibGspOworCisjZGVmaW5lIGlub2RlX2JtYXAoaW5vZGUsIG5yKSAoKGlub2RlKS0+aV9ibG9ja1sobnIpXSkKKworc3RhdGljIGVycmNvZGVfdCBibG9ja19pbmRfYm1hcChleHQyX2ZpbHN5cyBmcywgaW50IGZsYWdzLAorCQkJCQkgICAgICBibGtfdCBpbmQsIGNoYXIgKmJsb2NrX2J1ZiwKKwkJCQkJICAgICAgaW50ICpibG9ja3NfYWxsb2MsCisJCQkJCSAgICAgIGJsa190IG5yLCBibGtfdCAqcmV0X2JsaykKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWJsa190CQliOworCisJaWYgKCFpbmQpIHsKKwkJaWYgKGZsYWdzICYgQk1BUF9TRVQpCisJCQlyZXR1cm4gRVhUMl9FVF9TRVRfQk1BUF9OT19JTkQ7CisJCSpyZXRfYmxrID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBpbmQsIDEsIGJsb2NrX2J1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChmbGFncyAmIEJNQVBfU0VUKSB7CisJCWIgPSAqcmV0X2JsazsKKyNpZiBCQl9CSUdfRU5ESUFOCisJCWlmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHx8CisJCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpKQorCQkJYiA9IGV4dDJmc19zd2FiMzIoYik7CisjZW5kaWYKKwkJKChibGtfdCAqKSBibG9ja19idWYpW25yXSA9IGI7CisJCXJldHVybiBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGluZCwgMSwgYmxvY2tfYnVmKTsKKwl9CisKKwliID0gKChibGtfdCAqKSBibG9ja19idWYpW25yXTsKKworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRCkpCisJCWIgPSBleHQyZnNfc3dhYjMyKGIpOworI2VuZGlmCisKKwlpZiAoIWIgJiYgKGZsYWdzICYgQk1BUF9BTExPQykpIHsKKwkJYiA9IG5yID8gKChibGtfdCAqKSBibG9ja19idWYpW25yLTFdIDogMDsKKwkJcmV0dmFsID0gZXh0MmZzX2FsbG9jX2Jsb2NrKGZzLCBiLAorCQkJCQkgICAgYmxvY2tfYnVmICsgZnMtPmJsb2Nrc2l6ZSwgJmIpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKworI2lmIEJCX0JJR19FTkRJQU4KKwkJaWYgKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkJICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURSkpCisJCQkoKGJsa190ICopIGJsb2NrX2J1ZilbbnJdID0gZXh0MmZzX3N3YWIzMihiKTsKKwkJZWxzZQorI2VuZGlmCisJCQkoKGJsa190ICopIGJsb2NrX2J1ZilbbnJdID0gYjsKKworCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGluZCwgMSwgYmxvY2tfYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisKKwkJKCpibG9ja3NfYWxsb2MpKys7CisJfQorCisJKnJldF9ibGsgPSBiOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGJsb2NrX2RpbmRfYm1hcChleHQyX2ZpbHN5cyBmcywgaW50IGZsYWdzLAorCQkJCQkgICAgICAgYmxrX3QgZGluZCwgY2hhciAqYmxvY2tfYnVmLAorCQkJCQkgICAgICAgaW50ICpibG9ja3NfYWxsb2MsCisJCQkJCSAgICAgICBibGtfdCBuciwgYmxrX3QgKnJldF9ibGspCit7CisJYmxrX3QJCWI7CisJZXJyY29kZV90CXJldHZhbDsKKwlibGtfdAkJYWRkcl9wZXJfYmxvY2s7CisKKwlhZGRyX3Blcl9ibG9jayA9IChibGtfdCkgZnMtPmJsb2Nrc2l6ZSA+PiAyOworCisJcmV0dmFsID0gYmxvY2tfaW5kX2JtYXAoZnMsIGZsYWdzICYgfkJNQVBfU0VULCBkaW5kLCBibG9ja19idWYsCisJCQkJYmxvY2tzX2FsbG9jLCBuciAvIGFkZHJfcGVyX2Jsb2NrLCAmYik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSBibG9ja19pbmRfYm1hcChmcywgZmxhZ3MsIGIsIGJsb2NrX2J1ZiwgYmxvY2tzX2FsbG9jLAorCQkJCW5yICUgYWRkcl9wZXJfYmxvY2ssIHJldF9ibGspOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgYmxvY2tfdGluZF9ibWFwKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmxhZ3MsCisJCQkJCSAgICAgICBibGtfdCB0aW5kLCBjaGFyICpibG9ja19idWYsCisJCQkJCSAgICAgICBpbnQgKmJsb2Nrc19hbGxvYywKKwkJCQkJICAgICAgIGJsa190IG5yLCBibGtfdCAqcmV0X2JsaykKK3sKKwlibGtfdAkJYjsKKwllcnJjb2RlX3QJcmV0dmFsOworCWJsa190CQlhZGRyX3Blcl9ibG9jazsKKworCWFkZHJfcGVyX2Jsb2NrID0gKGJsa190KSBmcy0+YmxvY2tzaXplID4+IDI7CisKKwlyZXR2YWwgPSBibG9ja19kaW5kX2JtYXAoZnMsIGZsYWdzICYgfkJNQVBfU0VULCB0aW5kLCBibG9ja19idWYsCisJCQkJIGJsb2Nrc19hbGxvYywgbnIgLyBhZGRyX3Blcl9ibG9jaywgJmIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gYmxvY2tfaW5kX2JtYXAoZnMsIGZsYWdzLCBiLCBibG9ja19idWYsIGJsb2Nrc19hbGxvYywKKwkJCQluciAlIGFkZHJfcGVyX2Jsb2NrLCByZXRfYmxrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2JtYXAoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLCBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsCisJCSAgICAgIGNoYXIgKmJsb2NrX2J1ZiwgaW50IGJtYXBfZmxhZ3MsIGJsa190IGJsb2NrLAorCQkgICAgICBibGtfdCAqcGh5c19ibGspCit7CisJc3RydWN0IGV4dDJfaW5vZGUgaW5vZGVfYnVmOworCWJsa190IGFkZHJfcGVyX2Jsb2NrOworCWJsa190CWI7CisJY2hhcgkqYnVmID0gTlVMTDsKKwllcnJjb2RlX3QJcmV0dmFsID0gMDsKKwlpbnQJCWJsb2Nrc19hbGxvYyA9IDAsIGlub2RlX2RpcnR5ID0gMDsKKworCWlmICghKGJtYXBfZmxhZ3MgJiBCTUFQX1NFVCkpCisJCSpwaHlzX2JsayA9IDA7CisKKwkvKiBSZWFkIGlub2RlIHN0cnVjdHVyZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIWlub2RlKSB7CisJCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZpbm9kZV9idWYpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaW5vZGUgPSAmaW5vZGVfYnVmOworCX0KKwlhZGRyX3Blcl9ibG9jayA9IChibGtfdCkgZnMtPmJsb2Nrc2l6ZSA+PiAyOworCisJaWYgKCFibG9ja19idWYpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSAqIDIsICZidWYpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJYmxvY2tfYnVmID0gYnVmOworCX0KKworCWlmIChibG9jayA8IEVYVDJfTkRJUl9CTE9DS1MpIHsKKwkJaWYgKGJtYXBfZmxhZ3MgJiBCTUFQX1NFVCkgeworCQkJYiA9ICpwaHlzX2JsazsKKyNpZiBCQl9CSUdfRU5ESUFOCisJCQlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCQkJICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKSkKKwkJCQliID0gZXh0MmZzX3N3YWIzMihiKTsKKyNlbmRpZgorCQkJaW5vZGVfYm1hcChpbm9kZSwgYmxvY2spID0gYjsKKwkJCWlub2RlX2RpcnR5Kys7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkqcGh5c19ibGsgPSBpbm9kZV9ibWFwKGlub2RlLCBibG9jayk7CisJCWIgPSBibG9jayA/IGlub2RlX2JtYXAoaW5vZGUsIGJsb2NrLTEpIDogMDsKKworCQlpZiAoKCpwaHlzX2JsayA9PSAwKSAmJiAoYm1hcF9mbGFncyAmIEJNQVBfQUxMT0MpKSB7CisJCQlyZXR2YWwgPSBleHQyZnNfYWxsb2NfYmxvY2soZnMsIGIsIGJsb2NrX2J1ZiwgJmIpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGRvbmU7CisJCQlpbm9kZV9ibWFwKGlub2RlLCBibG9jaykgPSBiOworCQkJYmxvY2tzX2FsbG9jKys7CisJCQkqcGh5c19ibGsgPSBiOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBJbmRpcmVjdCBibG9jayAqLworCWJsb2NrIC09IEVYVDJfTkRJUl9CTE9DS1M7CisJaWYgKGJsb2NrIDwgYWRkcl9wZXJfYmxvY2spIHsKKwkJYiA9IGlub2RlX2JtYXAoaW5vZGUsIEVYVDJfSU5EX0JMT0NLKTsKKwkJaWYgKCFiKSB7CisJCQlpZiAoIShibWFwX2ZsYWdzICYgQk1BUF9BTExPQykpIHsKKwkJCQlpZiAoYm1hcF9mbGFncyAmIEJNQVBfU0VUKQorCQkJCQlyZXR2YWwgPSBFWFQyX0VUX1NFVF9CTUFQX05PX0lORDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKKwkJCWIgPSBpbm9kZV9ibWFwKGlub2RlLCBFWFQyX0lORF9CTE9DSy0xKTsKKwkJCXJldHZhbCA9IGV4dDJmc19hbGxvY19ibG9jayhmcywgYiwgYmxvY2tfYnVmLCAmYik7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlub2RlX2JtYXAoaW5vZGUsIEVYVDJfSU5EX0JMT0NLKSA9IGI7CisJCQlibG9ja3NfYWxsb2MrKzsKKwkJfQorCQlyZXR2YWwgPSBibG9ja19pbmRfYm1hcChmcywgYm1hcF9mbGFncywgYiwgYmxvY2tfYnVmLAorCQkJCQkmYmxvY2tzX2FsbG9jLCBibG9jaywgcGh5c19ibGspOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogRG91Ymx5IGluZGlyZWN0IGJsb2NrICAqLworCWJsb2NrIC09IGFkZHJfcGVyX2Jsb2NrOworCWlmIChibG9jayA8IGFkZHJfcGVyX2Jsb2NrICogYWRkcl9wZXJfYmxvY2spIHsKKwkJYiA9IGlub2RlX2JtYXAoaW5vZGUsIEVYVDJfRElORF9CTE9DSyk7CisJCWlmICghYikgeworCQkJaWYgKCEoYm1hcF9mbGFncyAmIEJNQVBfQUxMT0MpKSB7CisJCQkJaWYgKGJtYXBfZmxhZ3MgJiBCTUFQX1NFVCkKKwkJCQkJcmV0dmFsID0gRVhUMl9FVF9TRVRfQk1BUF9OT19JTkQ7CisJCQkJZ290byBkb25lOworCQkJfQorCisJCQliID0gaW5vZGVfYm1hcChpbm9kZSwgRVhUMl9JTkRfQkxPQ0spOworCQkJcmV0dmFsID0gZXh0MmZzX2FsbG9jX2Jsb2NrKGZzLCBiLCBibG9ja19idWYsICZiKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBkb25lOworCQkJaW5vZGVfYm1hcChpbm9kZSwgRVhUMl9ESU5EX0JMT0NLKSA9IGI7CisJCQlibG9ja3NfYWxsb2MrKzsKKwkJfQorCQlyZXR2YWwgPSBibG9ja19kaW5kX2JtYXAoZnMsIGJtYXBfZmxhZ3MsIGIsIGJsb2NrX2J1ZiwKKwkJCQkJICZibG9ja3NfYWxsb2MsIGJsb2NrLCBwaHlzX2Jsayk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBUcmlwbHkgaW5kaXJlY3QgYmxvY2sgKi8KKwlibG9jayAtPSBhZGRyX3Blcl9ibG9jayAqIGFkZHJfcGVyX2Jsb2NrOworCWIgPSBpbm9kZV9ibWFwKGlub2RlLCBFWFQyX1RJTkRfQkxPQ0spOworCWlmICghYikgeworCQlpZiAoIShibWFwX2ZsYWdzICYgQk1BUF9BTExPQykpIHsKKwkJCWlmIChibWFwX2ZsYWdzICYgQk1BUF9TRVQpCisJCQkJcmV0dmFsID0gRVhUMl9FVF9TRVRfQk1BUF9OT19JTkQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQliID0gaW5vZGVfYm1hcChpbm9kZSwgRVhUMl9ESU5EX0JMT0NLKTsKKwkJcmV0dmFsID0gZXh0MmZzX2FsbG9jX2Jsb2NrKGZzLCBiLCBibG9ja19idWYsICZiKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZG9uZTsKKwkJaW5vZGVfYm1hcChpbm9kZSwgRVhUMl9USU5EX0JMT0NLKSA9IGI7CisJCWJsb2Nrc19hbGxvYysrOworCX0KKwlyZXR2YWwgPSBibG9ja190aW5kX2JtYXAoZnMsIGJtYXBfZmxhZ3MsIGIsIGJsb2NrX2J1ZiwKKwkJCQkgJmJsb2Nrc19hbGxvYywgYmxvY2ssIHBoeXNfYmxrKTsKK2RvbmU6CisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCWlmICgocmV0dmFsID09IDApICYmIChibG9ja3NfYWxsb2MgfHwgaW5vZGVfZGlydHkpKSB7CisJCWlub2RlLT5pX2Jsb2NrcyArPSAoYmxvY2tzX2FsbG9jICogZnMtPmJsb2Nrc2l6ZSkgLyA1MTI7CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShmcywgaW5vLCBpbm9kZSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYm1vdmUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ibW92ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOTI0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYm1vdmUuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYm1vdmUuYyAtLS0gTW92ZSBibG9ja3MgYXJvdW5kIHRvIG1ha2Ugd2F5IGZvciBhIHBhcnRpY3VsYXIKKyAqCWZpbGVzeXN0ZW0gc3RydWN0dXJlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBUaGVvZG9yZSBUcydvLiAgVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkCisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKK3N0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdCB7CisJZXh0Ml9pbm9fdAkJaW5vOworCXN0cnVjdCBleHQyX2lub2RlICoJaW5vZGU7CisJZXh0MmZzX2Jsb2NrX2JpdG1hcAlyZXNlcnZlOworCWV4dDJmc19ibG9ja19iaXRtYXAJYWxsb2NfbWFwOworCWVycmNvZGVfdAkJZXJyb3I7CisJY2hhcgkJCSpidWY7CisJaW50CQkJYWRkX2RpcjsKKwlpbnQJCQlmbGFnczsKK307CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QJKmJsb2NrX25yLAorCQkJIGUyX2Jsa2NudF90IGJsb2NrY250LCBibGtfdCByZWZfYmxvY2ssCisJCQkgaW50IHJlZl9vZmZzZXQsIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3QgKnBiOworCWVycmNvZGVfdAlyZXR2YWw7CisJaW50CQlyZXQ7CisJYmxrX3QJCWJsb2NrLCBvcmlnOworCisJcGIgPSAoc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0ICopIHByaXZfZGF0YTsKKwlibG9jayA9IG9yaWcgPSAqYmxvY2tfbnI7CisJcmV0ID0gMDsKKworCS8qCisJICogTGV0J3Mgc2VlIGlmIHRoaXMgaXMgb25lIHdoaWNoIHdlIG5lZWQgdG8gcmVsb2NhdGUKKwkgKi8KKwlpZiAoZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKHBiLT5yZXNlcnZlLCBibG9jaykpIHsKKwkJZG8geworCQkJaWYgKCsrYmxvY2sgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkKKwkJCQlibG9jayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCQkJaWYgKGJsb2NrID09IG9yaWcpIHsKKwkJCQlwYi0+ZXJyb3IgPSBFWFQyX0VUX0JMT0NLX0FMTE9DX0ZBSUw7CisJCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQkJfQorCQl9IHdoaWxlIChleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAocGItPnJlc2VydmUsIGJsb2NrKSB8fAorCQkJIGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChwYi0+YWxsb2NfbWFwLCBibG9jaykpOworCisJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBvcmlnLCAxLCBwYi0+YnVmKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcGItPmVycm9yID0gcmV0dmFsOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxvY2ssIDEsIHBiLT5idWYpOworCQlpZiAocmV0dmFsKSB7CisJCQlwYi0+ZXJyb3IgPSByZXR2YWw7CisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwkJKmJsb2NrX25yID0gYmxvY2s7CisJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChwYi0+YWxsb2NfbWFwLCBibG9jayk7CisJCXJldCA9IEJMT0NLX0NIQU5HRUQ7CisJCWlmIChwYi0+ZmxhZ3MgJiBFWFQyX0JNT1ZFX0RFQlVHKQorCQkJcHJpbnRmKCJpbm89JWxkLCBibG9ja2NudD0lbGxkLCAlZC0+JWRcbiIsIHBiLT5pbm8sCisJCQkgICAgICAgYmxvY2tjbnQsIG9yaWcsIGJsb2NrKTsKKwl9CisJaWYgKHBiLT5hZGRfZGlyKSB7CisJCXJldHZhbCA9IGV4dDJmc19hZGRfZGlyX2Jsb2NrKGZzLT5kYmxpc3QsIHBiLT5pbm8sCisJCQkJCSAgICAgIGJsb2NrLCAoaW50KSBibG9ja2NudCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXBiLT5lcnJvciA9IHJldHZhbDsKKwkJCXJldCB8PSBCTE9DS19BQk9SVDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitlcnJjb2RlX3QgZXh0MmZzX21vdmVfYmxvY2tzKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgICBleHQyZnNfYmxvY2tfYml0bWFwIHJlc2VydmUsCisJCQkgICAgIGV4dDJmc19ibG9ja19iaXRtYXAgYWxsb2NfbWFwLAorCQkJICAgICBpbnQgZmxhZ3MpCit7CisJZXh0Ml9pbm9fdAlpbm87CisJc3RydWN0IGV4dDJfaW5vZGUgaW5vZGU7CisJZXJyY29kZV90CXJldHZhbDsKKwlzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3QgcGI7CisJZXh0Ml9pbm9kZV9zY2FuCXNjYW47CisJY2hhcgkJKmJsb2NrX2J1ZjsKKworCXJldHZhbCA9IGV4dDJmc19vcGVuX2lub2RlX3NjYW4oZnMsIDAsICZzY2FuKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcGIucmVzZXJ2ZSA9IHJlc2VydmU7CisJcGIuZXJyb3IgPSAwOworCXBiLmFsbG9jX21hcCA9IGFsbG9jX21hcCA/IGFsbG9jX21hcCA6IGZzLT5ibG9ja19tYXA7CisJcGIuZmxhZ3MgPSBmbGFnczsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUgKiA0LCAmYmxvY2tfYnVmKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXBiLmJ1ZiA9IGJsb2NrX2J1ZiArIGZzLT5ibG9ja3NpemUgKiAzOworCisJLyoKKwkgKiBJZiBHRVRfREJMSVNUIGlzIHNldCBpbiB0aGUgZmxhZ3MgZmllbGQsIHRoZW4gd2Ugc2hvdWxkCisJICogZ2F0aGVyIGRpcmVjdG9yeSBibG9jayBpbmZvcm1hdGlvbiB3aGlsZSB3ZSdyZSBkb2luZyB0aGUKKwkgKiBibG9jayBtb3ZlLgorCSAqLworCWlmIChmbGFncyAmIEVYVDJfQk1PVkVfR0VUX0RCTElTVCkgeworCQlleHQyZnNfZnJlZV9kYmxpc3QoZnMtPmRibGlzdCk7CisJCWZzLT5kYmxpc3QgPSBOVUxMOworCQlyZXR2YWwgPSBleHQyZnNfaW5pdF9kYmxpc3QoZnMsIDApOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X25leHRfaW5vZGUoc2NhbiwgJmlubywgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJd2hpbGUgKGlubykgeworCQlpZiAoKGlub2RlLmlfbGlua3NfY291bnQgPT0gMCkgfHwKKwkJICAgICFleHQyZnNfaW5vZGVfaGFzX3ZhbGlkX2Jsb2NrcygmaW5vZGUpKQorCQkJZ290byBuZXh0OworCisJCXBiLmlubyA9IGlubzsKKwkJcGIuaW5vZGUgPSAmaW5vZGU7CisKKwkJcGIuYWRkX2RpciA9IChMSU5VWF9TX0lTRElSKGlub2RlLmlfbW9kZSkgJiYKKwkJCSAgICAgIGZsYWdzICYgRVhUMl9CTU9WRV9HRVRfREJMSVNUKTsKKworCQlyZXR2YWwgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywgMCwgYmxvY2tfYnVmLAorCQkJCQkgICAgICBwcm9jZXNzX2Jsb2NrLCAmcGIpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKHBiLmVycm9yKQorCQkJcmV0dXJuIHBiLmVycm9yOworCisJbmV4dDoKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9uZXh0X2lub2RlKHNjYW4sICZpbm8sICZpbm9kZSk7CisJCWlmIChyZXR2YWwgPT0gRVhUMl9FVF9CQURfQkxPQ0tfSU5fSU5PREVfVEFCTEUpCisJCQlnb3RvIG5leHQ7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JyZWwuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9icmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiZjcyYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9icmVsLmgKQEAgLTAsMCArMSw4NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYnJlbC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCitzdHJ1Y3QgZXh0Ml9ibG9ja19yZWxvY2F0ZV9lbnRyeSB7CisJYmxrX3QJbmV3OworCV9fczE2CW9mZnNldDsKKwlfX3UxNglmbGFnczsKKwl1bmlvbiB7CisJCWJsa190CQlibG9ja19yZWY7CisJCWV4dDJfaW5vX3QJaW5vZGVfcmVmOworCX0gb3duZXI7Cit9OworCisjZGVmaW5lIFJFTE9DQVRFX1RZUEVfUkVGICAweDAwMDcKKyNkZWZpbmUgUkVMT0NBVEVfQkxPQ0tfUkVGIDB4MDAwMQorI2RlZmluZSBSRUxPQ0FURV9JTk9ERV9SRUYgMHgwMDAyCisKK3R5cGVkZWYgc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGlvbl90YWJsZSAqZXh0Ml9icmVsOworCitzdHJ1Y3QgZXh0Ml9ibG9ja19yZWxvY2F0aW9uX3RhYmxlIHsKKwlfX3UzMgltYWdpYzsKKwljaGFyCSpuYW1lOworCWJsa190CWN1cnJlbnQ7CisJdm9pZAkqcHJpdl9kYXRhOworCisJLyoKKwkgKiBBZGQgYSBibG9jayByZWxvY2F0aW9uIGVudHJ5LgorCSAqLworCWVycmNvZGVfdCAoKnB1dCkoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCwKKwkJCSAgICAgIHN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRlX2VudHJ5ICplbnQpOworCisJLyoKKwkgKiBHZXQgYSBibG9jayByZWxvY2F0aW9uIGVudHJ5LgorCSAqLworCWVycmNvZGVfdCAoKmdldCkoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCwKKwkJCSAgICAgIHN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRlX2VudHJ5ICplbnQpOworCisJLyoKKwkgKiBJbml0aWFsaXplIGZvciBpdGVyYXRpbmcgb3ZlciB0aGUgYmxvY2sgcmVsb2NhdGlvbiBlbnRyaWVzLgorCSAqLworCWVycmNvZGVfdCAoKnN0YXJ0X2l0ZXIpKGV4dDJfYnJlbCBicmVsKTsKKworCS8qCisJICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGZvciB0aGUgaW5vZGUgcmVsb2NhdGlvbiBlbnRyaWVzLgorCSAqIFJldHVybnMgYW4gaW5vZGUgbnVtYmVyIG9mIDAgd2hlbiBvdXQgb2YgZW50cmllcy4KKwkgKi8KKwllcnJjb2RlX3QgKCpuZXh0KShleHQyX2JyZWwgYnJlbCwgYmxrX3QgKm9sZCwKKwkJCSAgc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkgKmVudCk7CisKKwkvKgorCSAqIE1vdmUgdGhlIGlub2RlIHJlbG9jYXRpb24gdGFibGUgZnJvbSBvbmUgYmxvY2sgbnVtYmVyIHRvCisJICogYW5vdGhlci4KKwkgKi8KKwllcnJjb2RlX3QgKCptb3ZlKShleHQyX2JyZWwgYnJlbCwgYmxrX3Qgb2xkLCBibGtfdCBuZXcpOworCisJLyoKKwkgKiBSZW1vdmUgYSBibG9jayByZWxvY2F0aW9uIGVudHJ5LgorCSAqLworCWVycmNvZGVfdCAoKmRlbGV0ZSkoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCk7CisKKworCS8qCisJICogRnJlZSB0aGUgYmxvY2sgcmVsb2NhdGlvbiB0YWJsZS4KKwkgKi8KKwllcnJjb2RlX3QgKCpmcmVlKShleHQyX2JyZWwgYnJlbCk7Cit9OworCitlcnJjb2RlX3QgZXh0MmZzX2JyZWxfbWVtYXJyYXlfY3JlYXRlKGNoYXIgKm5hbWUsIGJsa190IG1heF9ibG9jaywKKwkJCQkgICAgZXh0Ml9icmVsICpicmVsKTsKKworI2RlZmluZSBleHQyZnNfYnJlbF9wdXQoYnJlbCwgb2xkLCBlbnQpICgoYnJlbCktPnB1dCgoYnJlbCksIG9sZCwgZW50KSkKKyNkZWZpbmUgZXh0MmZzX2JyZWxfZ2V0KGJyZWwsIG9sZCwgZW50KSAoKGJyZWwpLT5nZXQoKGJyZWwpLCBvbGQsIGVudCkpCisjZGVmaW5lIGV4dDJmc19icmVsX3N0YXJ0X2l0ZXIoYnJlbCkgKChicmVsKS0+c3RhcnRfaXRlcigoYnJlbCkpKQorI2RlZmluZSBleHQyZnNfYnJlbF9uZXh0KGJyZWwsIG9sZCwgZW50KSAoKGJyZWwpLT5uZXh0KChicmVsKSwgb2xkLCBlbnQpKQorI2RlZmluZSBleHQyZnNfYnJlbF9tb3ZlKGJyZWwsIG9sZCwgbmV3KSAoKGJyZWwpLT5tb3ZlKChicmVsKSwgb2xkLCBuZXcpKQorI2RlZmluZSBleHQyZnNfYnJlbF9kZWxldGUoYnJlbCwgb2xkKSAoKGJyZWwpLT5kZWxldGUoKGJyZWwpLCBvbGQpKQorI2RlZmluZSBleHQyZnNfYnJlbF9mcmVlKGJyZWwpICgoYnJlbCktPmZyZWUoKGJyZWwpKSkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9icmVsX21hLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYnJlbF9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MmEzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYnJlbF9tYS5jCkBAIC0wLDAgKzEsMTk2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBicmVsX21hLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiBUT0RPOiByZXdyaXRlIHRvIG5vdCB1c2UgYSBkaXJlY3QgYXJyYXkhISEgIChGb3J0dW5hdGVseSB0aGlzCisgKiBtb2R1bGUgaXNuJ3QgcmVhbGx5IHVzZWQgeWV0LikKKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorI2luY2x1ZGUgImJyZWwuaCIKKworc3RhdGljIGVycmNvZGVfdCBibWFfcHV0KGV4dDJfYnJlbCBicmVsLCBibGtfdCBvbGQsCisJCQlzdHJ1Y3QgZXh0Ml9ibG9ja19yZWxvY2F0ZV9lbnRyeSAqZW50KTsKK3N0YXRpYyBlcnJjb2RlX3QgYm1hX2dldChleHQyX2JyZWwgYnJlbCwgYmxrX3Qgb2xkLAorCQkJc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkgKmVudCk7CitzdGF0aWMgZXJyY29kZV90IGJtYV9zdGFydF9pdGVyKGV4dDJfYnJlbCBicmVsKTsKK3N0YXRpYyBlcnJjb2RlX3QgYm1hX25leHQoZXh0Ml9icmVsIGJyZWwsIGJsa190ICpvbGQsCisJCQkgc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkgKmVudCk7CitzdGF0aWMgZXJyY29kZV90IGJtYV9tb3ZlKGV4dDJfYnJlbCBicmVsLCBibGtfdCBvbGQsIGJsa190IG5ldyk7CitzdGF0aWMgZXJyY29kZV90IGJtYV9kZWxldGUoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCk7CitzdGF0aWMgZXJyY29kZV90IGJtYV9mcmVlKGV4dDJfYnJlbCBicmVsKTsKKworc3RydWN0IGJyZWxfbWEgeworCV9fdTMyIG1hZ2ljOworCWJsa190IG1heF9ibG9jazsKKwlzdHJ1Y3QgZXh0Ml9ibG9ja19yZWxvY2F0ZV9lbnRyeSAqZW50cmllczsKK307CisKK2VycmNvZGVfdCBleHQyZnNfYnJlbF9tZW1hcnJheV9jcmVhdGUoY2hhciAqbmFtZSwgYmxrX3QgbWF4X2Jsb2NrLAorCQkJCSAgICAgIGV4dDJfYnJlbCAqbmV3X2JyZWwpCit7CisJZXh0Ml9icmVsCQlicmVsID0gMDsKKwllcnJjb2RlX3QJcmV0dmFsOworCXN0cnVjdCBicmVsX21hCSptYSA9IDA7CisJc2l6ZV90CQlzaXplOworCisJKm5ld19icmVsID0gMDsKKworCS8qCisJICogQWxsb2NhdGUgbWVtb3J5IHN0cnVjdHVyZXMKKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGlvbl90YWJsZSksCisJCQkJJmJyZWwpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChicmVsLCAwLCBzaXplb2Yoc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGlvbl90YWJsZSkpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKG5hbWUpKzEsICZicmVsLT5uYW1lKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwlzdHJjcHkoYnJlbC0+bmFtZSwgbmFtZSk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGJyZWxfbWEpLCAmbWEpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChtYSwgMCwgc2l6ZW9mKHN0cnVjdCBicmVsX21hKSk7CisJYnJlbC0+cHJpdl9kYXRhID0gbWE7CisKKwlzaXplID0gKHNpemVfdCkgKHNpemVvZihzdHJ1Y3QgZXh0Ml9ibG9ja19yZWxvY2F0ZV9lbnRyeSkgKgorCQkJIChtYXhfYmxvY2srMSkpOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemUsICZtYS0+ZW50cmllcyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJbWVtc2V0KG1hLT5lbnRyaWVzLCAwLCBzaXplKTsKKwltYS0+bWF4X2Jsb2NrID0gbWF4X2Jsb2NrOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBicmVsIGRhdGEgc3RydWN0dXJlCisJICovCisJYnJlbC0+cHV0ID0gYm1hX3B1dDsKKwlicmVsLT5nZXQgPSBibWFfZ2V0OworCWJyZWwtPnN0YXJ0X2l0ZXIgPSBibWFfc3RhcnRfaXRlcjsKKwlicmVsLT5uZXh0ID0gYm1hX25leHQ7CisJYnJlbC0+bW92ZSA9IGJtYV9tb3ZlOworCWJyZWwtPmRlbGV0ZSA9IGJtYV9kZWxldGU7CisJYnJlbC0+ZnJlZSA9IGJtYV9mcmVlOworCisJKm5ld19icmVsID0gYnJlbDsKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCWJtYV9mcmVlKGJyZWwpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgYm1hX3B1dChleHQyX2JyZWwgYnJlbCwgYmxrX3Qgb2xkLAorCQkJc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkgKmVudCkKK3sKKwlzdHJ1Y3QgYnJlbF9tYQkqbWE7CisKKwltYSA9IGJyZWwtPnByaXZfZGF0YTsKKwlpZiAob2xkID4gbWEtPm1heF9ibG9jaykKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwltYS0+ZW50cmllc1sodW5zaWduZWQpb2xkXSA9ICplbnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgYm1hX2dldChleHQyX2JyZWwgYnJlbCwgYmxrX3Qgb2xkLAorCQkJc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkgKmVudCkKK3sKKwlzdHJ1Y3QgYnJlbF9tYQkqbWE7CisKKwltYSA9IGJyZWwtPnByaXZfZGF0YTsKKwlpZiAob2xkID4gbWEtPm1heF9ibG9jaykKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwlpZiAobWEtPmVudHJpZXNbKHVuc2lnbmVkKW9sZF0ubmV3ID09IDApCisJCXJldHVybiBFTk9FTlQ7CisJKmVudCA9IG1hLT5lbnRyaWVzW29sZF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgYm1hX3N0YXJ0X2l0ZXIoZXh0Ml9icmVsIGJyZWwpCit7CisJYnJlbC0+Y3VycmVudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgYm1hX25leHQoZXh0Ml9icmVsIGJyZWwsIGJsa190ICpvbGQsCisJCQkgIHN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRlX2VudHJ5ICplbnQpCit7CisJc3RydWN0IGJyZWxfbWEJKm1hOworCisJbWEgPSBicmVsLT5wcml2X2RhdGE7CisJd2hpbGUgKCsrYnJlbC0+Y3VycmVudCA8IG1hLT5tYXhfYmxvY2spIHsKKwkJaWYgKG1hLT5lbnRyaWVzWyh1bnNpZ25lZClicmVsLT5jdXJyZW50XS5uZXcgPT0gMCkKKwkJCWNvbnRpbnVlOworCQkqb2xkID0gYnJlbC0+Y3VycmVudDsKKwkJKmVudCA9IG1hLT5lbnRyaWVzWyh1bnNpZ25lZClicmVsLT5jdXJyZW50XTsKKwkJcmV0dXJuIDA7CisJfQorCSpvbGQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGJtYV9tb3ZlKGV4dDJfYnJlbCBicmVsLCBibGtfdCBvbGQsIGJsa190IG5ldykKK3sKKwlzdHJ1Y3QgYnJlbF9tYQkqbWE7CisKKwltYSA9IGJyZWwtPnByaXZfZGF0YTsKKwlpZiAoKG9sZCA+IG1hLT5tYXhfYmxvY2spIHx8IChuZXcgPiBtYS0+bWF4X2Jsb2NrKSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwlpZiAobWEtPmVudHJpZXNbKHVuc2lnbmVkKW9sZF0ubmV3ID09IDApCisJCXJldHVybiBFTk9FTlQ7CisJbWEtPmVudHJpZXNbKHVuc2lnbmVkKW5ld10gPSBtYS0+ZW50cmllc1tvbGRdOworCW1hLT5lbnRyaWVzWyh1bnNpZ25lZClvbGRdLm5ldyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgYm1hX2RlbGV0ZShleHQyX2JyZWwgYnJlbCwgYmxrX3Qgb2xkKQoreworCXN0cnVjdCBicmVsX21hCSptYTsKKworCW1hID0gYnJlbC0+cHJpdl9kYXRhOworCWlmIChvbGQgPiBtYS0+bWF4X2Jsb2NrKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCWlmIChtYS0+ZW50cmllc1sodW5zaWduZWQpb2xkXS5uZXcgPT0gMCkKKwkJcmV0dXJuIEVOT0VOVDsKKwltYS0+ZW50cmllc1sodW5zaWduZWQpb2xkXS5uZXcgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGJtYV9mcmVlKGV4dDJfYnJlbCBicmVsKQoreworCXN0cnVjdCBicmVsX21hCSptYTsKKworCWlmICghYnJlbCkKKwkJcmV0dXJuIDA7CisKKwltYSA9IGJyZWwtPnByaXZfZGF0YTsKKworCWlmIChtYSkgeworCQlleHQyZnNfZnJlZV9tZW0oJm1hLT5lbnRyaWVzKTsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZtYSk7CisJfQorCWV4dDJmc19mcmVlX21lbSgmYnJlbC0+bmFtZSk7CisJZXh0MmZzX2ZyZWVfbWVtKCZicmVsKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9jaGVja19kZXNjLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvY2hlY2tfZGVzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNGIwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvY2hlY2tfZGVzYy5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNoZWNrX2Rlc2MuYyAtLS0gQ2hlY2sgdGhlIGdyb3VwIGRlc2NyaXB0b3JzIG9mIGFuIGV4dDIgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogVGhpcyByb3V0aW5lIHNhbml0eSBjaGVja3MgdGhlIGdyb3VwIGRlc2NyaXB0b3JzCisgKi8KK2VycmNvZGVfdCBleHQyZnNfY2hlY2tfZGVzYyhleHQyX2ZpbHN5cyBmcykKK3sKKwlkZ3JwX3QgaTsKKwlibGtfdCBibG9jayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCWJsa190IG5leHQ7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJbmV4dCA9IGJsb2NrICsgZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCS8qCisJCSAqIENoZWNrIHRvIG1ha2Ugc3VyZSBibG9jayBiaXRtYXAgZm9yIGdyb3VwIGlzCisJCSAqIGxvY2F0ZWQgd2l0aGluIHRoZSBncm91cC4KKwkJICovCisJCWlmIChmcy0+Z3JvdXBfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXAgPCBibG9jayB8fAorCQkgICAgZnMtPmdyb3VwX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwID49IG5leHQpCisJCQlyZXR1cm4gRVhUMl9FVF9HREVTQ19CQURfQkxPQ0tfTUFQOworCQkvKgorCQkgKiBDaGVjayB0byBtYWtlIHN1cmUgaW5vZGUgYml0bWFwIGZvciBncm91cCBpcworCQkgKiBsb2NhdGVkIHdpdGhpbiB0aGUgZ3JvdXAKKwkJICovCisJCWlmIChmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV9iaXRtYXAgPCBibG9jayB8fAorCQkgICAgZnMtPmdyb3VwX2Rlc2NbaV0uYmdfaW5vZGVfYml0bWFwID49IG5leHQpCisJCQlyZXR1cm4gRVhUMl9FVF9HREVTQ19CQURfSU5PREVfTUFQOworCQkvKgorCQkgKiBDaGVjayB0byBtYWtlIHN1cmUgaW5vZGUgdGFibGUgZm9yIGdyb3VwIGlzIGxvY2F0ZWQKKwkJICogd2l0aGluIHRoZSBncm91cAorCQkgKi8KKwkJaWYgKGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX3RhYmxlIDwgYmxvY2sgfHwKKwkJICAgICgoZnMtPmdyb3VwX2Rlc2NbaV0uYmdfaW5vZGVfdGFibGUgKworCQkgICAgICBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCkgPj0gbmV4dCkpCisJCQlyZXR1cm4gRVhUMl9FVF9HREVTQ19CQURfSU5PREVfVEFCTEU7CisKKwkJYmxvY2sgPSBuZXh0OworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9jbG9zZWZzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvY2xvc2Vmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTE1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvY2xvc2Vmcy5jCkBAIC0wLDAgKzEsMzgwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjbG9zZWZzLmMgLS0tIGNsb3NlIGFuIGV4dDIgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmc1AuaCIKKworc3RhdGljIGludCB0ZXN0X3Jvb3QoaW50IGEsIGludCBiKQoreworCWlmIChhID09IDApCisJCXJldHVybiAxOworCXdoaWxlICgxKSB7CisJCWlmIChhID09IDEpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGEgJSBiKQorCQkJcmV0dXJuIDA7CisJCWEgPSBhIC8gYjsKKwl9Cit9CisKK2ludCBleHQyZnNfYmdfaGFzX3N1cGVyKGV4dDJfZmlsc3lzIGZzLCBpbnQgZ3JvdXBfYmxvY2spCit7CisJaWYgKCEoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYKKwkgICAgICBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpCisJCXJldHVybiAxOworCisJaWYgKHRlc3Rfcm9vdChncm91cF9ibG9jaywgMykgfHwgKHRlc3Rfcm9vdChncm91cF9ibG9jaywgNSkpIHx8CisJICAgIHRlc3Rfcm9vdChncm91cF9ibG9jaywgNykpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBleHQyZnNfc3VwZXJfYW5kX2JnZF9sb2MoZXh0Ml9maWxzeXMgZnMsCisJCQkgICAgIGRncnBfdCBncm91cCwKKwkJCSAgICAgYmxrX3QgKnJldF9zdXBlcl9ibGssCisJCQkgICAgIGJsa190ICpyZXRfb2xkX2Rlc2NfYmxrLAorCQkJICAgICBibGtfdCAqcmV0X25ld19kZXNjX2JsaywKKwkJCSAgICAgaW50ICpyZXRfbWV0YV9iZykKK3sKKwlibGtfdAlncm91cF9ibG9jaywgc3VwZXJfYmxrID0gMCwgb2xkX2Rlc2NfYmxrID0gMCwgbmV3X2Rlc2NfYmxrID0gMDsKKwl1bnNpZ25lZCBpbnQgbWV0YV9iZywgbWV0YV9iZ19zaXplOworCWludAludW1ibG9ja3MsIGhhc19zdXBlcjsKKwlpbnQJb2xkX2Rlc2NfYmxvY2tzOworCisJZ3JvdXBfYmxvY2sgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayArCisJCShncm91cCAqIGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKworCWlmIChmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKQorCQlvbGRfZGVzY19ibG9ja3MgPSBmcy0+c3VwZXItPnNfZmlyc3RfbWV0YV9iZzsKKwllbHNlCisJCW9sZF9kZXNjX2Jsb2NrcyA9CisJCQlmcy0+ZGVzY19ibG9ja3MgKyBmcy0+c3VwZXItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsKKworCWlmIChncm91cCA9PSBmcy0+Z3JvdXBfZGVzY19jb3VudC0xKSB7CisJCW51bWJsb2NrcyA9IChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IC0KKwkJCSAgICAgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spICUKKwkJCWZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwOworCQlpZiAoIW51bWJsb2NrcykKKwkJCW51bWJsb2NrcyA9IGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwOworCX0gZWxzZQorCQludW1ibG9ja3MgPSBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKKworCWhhc19zdXBlciA9IGV4dDJmc19iZ19oYXNfc3VwZXIoZnMsIGdyb3VwKTsKKworCWlmIChoYXNfc3VwZXIpIHsKKwkJc3VwZXJfYmxrID0gZ3JvdXBfYmxvY2s7CisJCW51bWJsb2Nrcy0tOworCX0KKwltZXRhX2JnX3NpemUgPSAoZnMtPmJsb2Nrc2l6ZSAvIHNpemVvZiAoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYykpOworCW1ldGFfYmcgPSBncm91cCAvIG1ldGFfYmdfc2l6ZTsKKworCWlmICghKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIChtZXRhX2JnIDwgZnMtPnN1cGVyLT5zX2ZpcnN0X21ldGFfYmcpKSB7CisJCWlmIChoYXNfc3VwZXIpIHsKKwkJCW9sZF9kZXNjX2JsayA9IGdyb3VwX2Jsb2NrICsgMTsKKwkJCW51bWJsb2NrcyAtPSBvbGRfZGVzY19ibG9ja3M7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKChncm91cCAlIG1ldGFfYmdfc2l6ZSkgPT0gMCkgfHwKKwkJICAgICgoZ3JvdXAgJSBtZXRhX2JnX3NpemUpID09IDEpIHx8CisJCSAgICAoKGdyb3VwICUgbWV0YV9iZ19zaXplKSA9PSAobWV0YV9iZ19zaXplLTEpKSkgeworCQkJaWYgKGhhc19zdXBlcikKKwkJCQloYXNfc3VwZXIgPSAxOworCQkJbmV3X2Rlc2NfYmxrID0gZ3JvdXBfYmxvY2sgKyBoYXNfc3VwZXI7CisJCQludW1ibG9ja3MtLTsKKwkJfQorCX0KKworCW51bWJsb2NrcyAtPSAyICsgZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisKKwlpZiAocmV0X3N1cGVyX2JsaykKKwkJKnJldF9zdXBlcl9ibGsgPSBzdXBlcl9ibGs7CisJaWYgKHJldF9vbGRfZGVzY19ibGspCisJCSpyZXRfb2xkX2Rlc2NfYmxrID0gb2xkX2Rlc2NfYmxrOworCWlmIChyZXRfbmV3X2Rlc2NfYmxrKQorCQkqcmV0X25ld19kZXNjX2JsayA9IG5ld19kZXNjX2JsazsKKwlpZiAocmV0X21ldGFfYmcpCisJCSpyZXRfbWV0YV9iZyA9IG1ldGFfYmc7CisJcmV0dXJuIG51bWJsb2NrczsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBmb3JjZXMgb3V0IHRoZSBwcmltYXJ5IHN1cGVyYmxvY2suICBXZSBuZWVkIHRvIG9ubHkKKyAqIHdyaXRlIG91dCB0aG9zZSBmaWVsZHMgd2hpY2ggd2UgaGF2ZSBjaGFuZ2VkLCBzaW5jZSBpZiB0aGUKKyAqIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCwgaXQgbWF5IGhhdmUgY2hhbmdlZCBzb21lIG9mIHRoZSBvdGhlcgorICogZmllbGRzLgorICoKKyAqIEl0IHRha2VzIGFzIGlucHV0IGEgc3VwZXJibG9jayB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGJ5dGUgc3dhcHBlZAorICogKGlmIG5lY2Vzc2FyeSkuCisgKgorICovCitzdGF0aWMgZXJyY29kZV90IHdyaXRlX3ByaW1hcnlfc3VwZXJibG9jayhleHQyX2ZpbHN5cyBmcywKKwkJCQkJICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc3VwZXIpCit7CisJX191MTYJCSpvbGRfc3VwZXIsICpuZXdfc3VwZXI7CisJaW50CQljaGVja19pZHgsIHdyaXRlX2lkeCwgc2l6ZTsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKCFmcy0+aW8tPm1hbmFnZXItPndyaXRlX2J5dGUgfHwgIWZzLT5vcmlnX3N1cGVyKSB7CisJCWlvX2NoYW5uZWxfc2V0X2Jsa3NpemUoZnMtPmlvLCBTVVBFUkJMT0NLX09GRlNFVCk7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgMSwgLVNVUEVSQkxPQ0tfU0laRSwKKwkJCQkJICAgICAgc3VwZXIpOworCQlpb19jaGFubmVsX3NldF9ibGtzaXplKGZzLT5pbywgZnMtPmJsb2Nrc2l6ZSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJb2xkX3N1cGVyID0gKF9fdTE2ICopIGZzLT5vcmlnX3N1cGVyOworCW5ld19zdXBlciA9IChfX3UxNiAqKSBzdXBlcjsKKworCWZvciAoY2hlY2tfaWR4ID0gMDsgY2hlY2tfaWR4IDwgU1VQRVJCTE9DS19TSVpFLzI7IGNoZWNrX2lkeCsrKSB7CisJCWlmIChvbGRfc3VwZXJbY2hlY2tfaWR4XSA9PSBuZXdfc3VwZXJbY2hlY2tfaWR4XSkKKwkJCWNvbnRpbnVlOworCQl3cml0ZV9pZHggPSBjaGVja19pZHg7CisJCWZvciAoY2hlY2tfaWR4Kys7IGNoZWNrX2lkeCA8IFNVUEVSQkxPQ0tfU0laRS8yOyBjaGVja19pZHgrKykKKwkJCWlmIChvbGRfc3VwZXJbY2hlY2tfaWR4XSA9PSBuZXdfc3VwZXJbY2hlY2tfaWR4XSkKKwkJCQlicmVhazsKKwkJc2l6ZSA9IDIgKiAoY2hlY2tfaWR4IC0gd3JpdGVfaWR4KTsKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ieXRlKGZzLT5pbywKKwkJCSAgICAgICBTVVBFUkJMT0NLX09GRlNFVCArICgyICogd3JpdGVfaWR4KSwgc2l6ZSwKKwkJCQkJICAgICAgIG5ld19zdXBlciArIHdyaXRlX2lkeCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwltZW1jcHkoZnMtPm9yaWdfc3VwZXIsIHN1cGVyLCBTVVBFUkJMT0NLX1NJWkUpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBVcGRhdGVzIHRoZSByZXZpc2lvbiB0byBFWFQyX0RZTkFNSUNfUkVWCisgKi8KK3ZvaWQgZXh0MmZzX3VwZGF0ZV9keW5hbWljX3JldihleHQyX2ZpbHN5cyBmcykKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBmcy0+c3VwZXI7CisKKwlpZiAoc2ItPnNfcmV2X2xldmVsID4gRVhUMl9HT09EX09MRF9SRVYpCisJCXJldHVybjsKKworCXNiLT5zX3Jldl9sZXZlbCA9IEVYVDJfRFlOQU1JQ19SRVY7CisJc2ItPnNfZmlyc3RfaW5vID0gRVhUMl9HT09EX09MRF9GSVJTVF9JTk87CisJc2ItPnNfaW5vZGVfc2l6ZSA9IEVYVDJfR09PRF9PTERfSU5PREVfU0laRTsKKwkvKiBzX3V1aWQgaXMgaGFuZGxlZCBieSBlMmZzY2sgYWxyZWFkeSAqLworCS8qIG90aGVyIGZpZWxkcyBzaG91bGQgYmUgbGVmdCBhbG9uZSAqLworfQorCitzdGF0aWMgZXJyY29kZV90IHdyaXRlX2JhY2t1cF9zdXBlcihleHQyX2ZpbHN5cyBmcywgZGdycF90IGdyb3VwLAorCQkJCSAgICBibGtfdCBncm91cF9ibG9jaywKKwkJCQkgICAgc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnN1cGVyX3NoYWRvdykKK3sKKwlkZ3JwX3QJc2dycCA9IGdyb3VwOworCisJaWYgKHNncnAgPiAoKDEgPDwgMTYpIC0gMSkpCisJCXNncnAgPSAoMSA8PCAxNikgLSAxOworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpCisJCXN1cGVyX3NoYWRvdy0+c19ibG9ja19ncm91cF9uciA9IGV4dDJmc19zd2FiMTYoc2dycCk7CisJZWxzZQorI2VuZGlmCisJCWZzLT5zdXBlci0+c19ibG9ja19ncm91cF9uciA9IHNncnA7CisKKwlyZXR1cm4gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBncm91cF9ibG9jaywgLVNVUEVSQkxPQ0tfU0laRSwKKwkJCQkgICAgc3VwZXJfc2hhZG93KTsKK30KKworCitlcnJjb2RlX3QgZXh0MmZzX2ZsdXNoKGV4dDJfZmlsc3lzIGZzKQoreworCWRncnBfdAkJaTsKKwlibGtfdAkJZ3JvdXBfYmxvY2s7CisJZXJyY29kZV90CXJldHZhbDsKKwl1bnNpZ25lZCBsb25nCWZzX3N0YXRlOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzdXBlcl9zaGFkb3cgPSBOVUxMOworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmdyb3VwX3NoYWRvdyA9IE5VTEw7CisJY2hhcgkqZ3JvdXBfcHRyOworCWludAlvbGRfZGVzY19ibG9ja3M7CisjaWYgQkJfQklHX0VORElBTgorCWRncnBfdAkJajsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpzLCAqdDsKKyNlbmRpZgorCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWZzX3N0YXRlID0gZnMtPnN1cGVyLT5zX3N0YXRlOworCisJZnMtPnN1cGVyLT5zX3d0aW1lID0gdGltZShOVUxMKTsKKwlmcy0+c3VwZXItPnNfYmxvY2tfZ3JvdXBfbnIgPSAwOworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9OT19NRU1PUlk7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKFNVUEVSQkxPQ0tfU0laRSwgJnN1cGVyX3NoYWRvdyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oKHNpemVfdCkoZnMtPmJsb2Nrc2l6ZSAqCisJCQkJCQkgZnMtPmRlc2NfYmxvY2tzKSwKKwkJCQkJJmdyb3VwX3NoYWRvdyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKwkJbWVtc2V0KGdyb3VwX3NoYWRvdywgMCwgKHNpemVfdCkgZnMtPmJsb2Nrc2l6ZSAqCisJCSAgICAgICBmcy0+ZGVzY19ibG9ja3MpOworCisJCS8qIHN3YXAgdGhlIGdyb3VwIGRlc2NyaXB0b3JzICovCisJCWZvciAoaj0wLCBzPWZzLT5ncm91cF9kZXNjLCB0PWdyb3VwX3NoYWRvdzsKKwkJICAgICBqIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGorKywgdCsrLCBzKyspIHsKKwkJCSp0ID0gKnM7CisJCQlleHQyZnNfc3dhcF9ncm91cF9kZXNjKHQpOworCQl9CisJfSBlbHNlIHsKKwkJc3VwZXJfc2hhZG93ID0gZnMtPnN1cGVyOworCQlncm91cF9zaGFkb3cgPSBmcy0+Z3JvdXBfZGVzYzsKKwl9CisjZWxzZQorCXN1cGVyX3NoYWRvdyA9IGZzLT5zdXBlcjsKKwlncm91cF9zaGFkb3cgPSBmcy0+Z3JvdXBfZGVzYzsKKyNlbmRpZgorCisJLyoKKwkgKiBJZiB0aGlzIGlzIGFuIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlLCBkb24ndCB3cml0ZSBvdXQgdGhlCisJICogYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMgb3IgYW55IG9mIHRoZSBiYWNrdXAgc3VwZXJibG9ja3MKKwkgKi8KKwlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCSAgICBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYpCisJCWdvdG8gd3JpdGVfcHJpbWFyeV9zdXBlcmJsb2NrX29ubHk7CisKKwkvKgorCSAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIEZTIHRvIGJlIG5vbi12YWxpZC4gIChUaGUgc3RhdGUgaGFzCisJICogYWxyZWFkeSBiZWVuIGJhY2tlZCB1cCBlYXJsaWVyLCBhbmQgd2lsbCBiZSByZXN0b3JlZCBhZnRlcgorCSAqIHdlIHdyaXRlIG91dCB0aGUgYmFja3VwIHN1cGVyYmxvY2tzLikKKwkgKi8KKwlmcy0+c3VwZXItPnNfc3RhdGUgJj0gfkVYVDJfVkFMSURfRlM7CisjaWYgQkJfQklHX0VORElBTgorCWlmIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgeworCQkqc3VwZXJfc2hhZG93ID0gKmZzLT5zdXBlcjsKKwkJZXh0MmZzX3N3YXBfc3VwZXIoc3VwZXJfc2hhZG93KTsKKwl9CisjZW5kaWYKKworCS8qCisJICogV3JpdGUgb3V0IHRoZSBtYXN0ZXIgZ3JvdXAgZGVzY3JpcHRvcnMsIGFuZCB0aGUgYmFja3VwCisJICogc3VwZXJibG9ja3MgYW5kIGdyb3VwIGRlc2NyaXB0b3JzLgorCSAqLworCWdyb3VwX2Jsb2NrID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJZ3JvdXBfcHRyID0gKGNoYXIgKikgZ3JvdXBfc2hhZG93OworCWlmIChmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKQorCQlvbGRfZGVzY19ibG9ja3MgPSBmcy0+c3VwZXItPnNfZmlyc3RfbWV0YV9iZzsKKwllbHNlCisJCW9sZF9kZXNjX2Jsb2NrcyA9IGZzLT5kZXNjX2Jsb2NrczsKKworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCWJsa190CXN1cGVyX2Jsaywgb2xkX2Rlc2NfYmxrLCBuZXdfZGVzY19ibGs7CisJCWludAltZXRhX2JnOworCisJCWV4dDJmc19zdXBlcl9hbmRfYmdkX2xvYyhmcywgaSwgJnN1cGVyX2JsaywgJm9sZF9kZXNjX2JsaywKKwkJCQkJICZuZXdfZGVzY19ibGssICZtZXRhX2JnKTsKKworCQlpZiAoIShmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfTUFTVEVSX1NCX09OTFkpICYmaSAmJiBzdXBlcl9ibGspIHsKKwkJCXJldHZhbCA9IHdyaXRlX2JhY2t1cF9zdXBlcihmcywgaSwgc3VwZXJfYmxrLAorCQkJCQkJICAgIHN1cGVyX3NoYWRvdyk7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyb3V0OworCQl9CisJCWlmIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1VQRVJfT05MWSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKG9sZF9kZXNjX2JsaykgJiYKKwkJICAgICghKGZzLT5mbGFncyAmIEVYVDJfRkxBR19NQVNURVJfU0JfT05MWSkgfHwgKGkgPT0gMCkpKSB7CisJCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sCisJCQkgICAgICBvbGRfZGVzY19ibGssIG9sZF9kZXNjX2Jsb2NrcywgZ3JvdXBfcHRyKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBlcnJvdXQ7CisJCX0KKwkJaWYgKG5ld19kZXNjX2JsaykgeworCQkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBuZXdfZGVzY19ibGssCisJCQkJMSwgZ3JvdXBfcHRyICsgKG1ldGFfYmcqZnMtPmJsb2Nrc2l6ZSkpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGVycm91dDsKKwkJfQorCX0KKwlmcy0+c3VwZXItPnNfYmxvY2tfZ3JvdXBfbnIgPSAwOworCWZzLT5zdXBlci0+c19zdGF0ZSA9IGZzX3N0YXRlOworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHsKKwkJKnN1cGVyX3NoYWRvdyA9ICpmcy0+c3VwZXI7CisJCWV4dDJmc19zd2FwX3N1cGVyKHN1cGVyX3NoYWRvdyk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIElmIHRoZSB3cml0ZV9iaXRtYXBzKCkgZnVuY3Rpb24gaXMgcHJlc2VudCwgY2FsbCBpdCB0bworCSAqIGZsdXNoIHRoZSBiaXRtYXBzLiAgVGhpcyBpcyBkb25lIHRoaXMgd2F5IHNvIHRoYXQgYSBzaW1wbGUKKwkgKiBwcm9ncmFtIHRoYXQgZG9lc24ndCBtZXNzIHdpdGggdGhlIGJpdG1hcHMgZG9lc24ndCBuZWVkIHRvCisJICogZHJhZyBpbiB0aGUgYml0bWFwcy5jIGNvZGUuCisJICovCisJaWYgKGZzLT53cml0ZV9iaXRtYXBzKSB7CisJCXJldHZhbCA9IGZzLT53cml0ZV9iaXRtYXBzKGZzKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3V0OworCX0KKword3JpdGVfcHJpbWFyeV9zdXBlcmJsb2NrX29ubHk6CisJLyoKKwkgKiBXcml0ZSBvdXQgbWFzdGVyIHN1cGVyYmxvY2suICBUaGlzIGhhcyB0byBiZSBkb25lCisJICogc2VwYXJhdGVseSwgc2luY2UgaXQgaXMgbG9jYXRlZCBhdCBhIGZpeGVkIGxvY2F0aW9uCisJICogKFNVUEVSQkxPQ0tfT0ZGU0VUKS4gIFdlIGZsdXNoIGFsbCBvdGhlciBwZW5kaW5nIGNoYW5nZXMKKwkgKiBvdXQgdG8gZGlzayBmaXJzdCwganVzdCB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdpdGggYW4KKwkgKiBpbnN5LXRpbnN5IHdpbmRvdy4uLi4KKwkgKi8KKwlyZXR2YWwgPSBpb19jaGFubmVsX2ZsdXNoKGZzLT5pbyk7CisJcmV0dmFsID0gd3JpdGVfcHJpbWFyeV9zdXBlcmJsb2NrKGZzLCBzdXBlcl9zaGFkb3cpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCisJZnMtPmZsYWdzICY9IH5FWFQyX0ZMQUdfRElSVFk7CisKKwlyZXR2YWwgPSBpb19jaGFubmVsX2ZsdXNoKGZzLT5pbyk7CitlcnJvdXQ6CisJZnMtPnN1cGVyLT5zX3N0YXRlID0gZnNfc3RhdGU7CisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB7CisJCWlmIChzdXBlcl9zaGFkb3cpCisJCQlleHQyZnNfZnJlZV9tZW0oJnN1cGVyX3NoYWRvdyk7CisJCWlmIChncm91cF9zaGFkb3cpCisJCQlleHQyZnNfZnJlZV9tZW0oJmdyb3VwX3NoYWRvdyk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfY2xvc2UoZXh0Ml9maWxzeXMgZnMpCit7CisJZXJyY29kZV90CXJldHZhbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX0RJUlRZKSB7CisJCXJldHZhbCA9IGV4dDJmc19mbHVzaChmcyk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwlpZiAoZnMtPndyaXRlX2JpdG1hcHMpIHsKKwkJcmV0dmFsID0gZnMtPndyaXRlX2JpdG1hcHMoZnMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJZXh0MmZzX2ZyZWUoZnMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2NtcF9iaXRtYXBzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvY21wX2JpdG1hcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjc4ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2NtcF9iaXRtYXBzLmMKQEAgLTAsMCArMSw3MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY21wX2JpdG1hcHMuYyAtLS0gcm91dGluZXMgdG8gY29tcGFyZSBpbm9kZSBhbmQgYmxvY2sgYml0bWFwcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworZXJyY29kZV90IGV4dDJmc19jb21wYXJlX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJtMSwKKwkJCQkgICAgICBleHQyZnNfYmxvY2tfYml0bWFwIGJtMikKK3sKKwlibGtfdAlpOworCisJRVhUMl9DSEVDS19NQUdJQyhibTEsIEVYVDJfRVRfTUFHSUNfQkxPQ0tfQklUTUFQKTsKKwlFWFQyX0NIRUNLX01BR0lDKGJtMiwgRVhUMl9FVF9NQUdJQ19CTE9DS19CSVRNQVApOworCisJaWYgKChibTEtPnN0YXJ0ICE9IGJtMi0+c3RhcnQpIHx8CisJICAgIChibTEtPmVuZCAhPSBibTItPmVuZCkgfHwKKwkgICAgKG1lbWNtcChibTEtPmJpdG1hcCwgYm0yLT5iaXRtYXAsCisJCSAgICAoc2l6ZV90KSAoYm0xLT5lbmQgLSBibTEtPnN0YXJ0KS84KSkpCisJCXJldHVybiBFWFQyX0VUX05FUV9CTE9DS19CSVRNQVA7CisKKwlmb3IgKGkgPSBibTEtPmVuZCAtICgoYm0xLT5lbmQgLSBibTEtPnN0YXJ0KSAlIDgpOyBpIDw9IGJtMS0+ZW5kOyBpKyspCisJCWlmIChleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcChibTEsIGkpICE9CisJCSAgICBleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcChibTIsIGkpKQorCQkJcmV0dXJuIEVYVDJfRVRfTkVRX0JMT0NLX0JJVE1BUDsKKworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2NvbXBhcmVfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYm0xLAorCQkJCSAgICAgIGV4dDJmc19pbm9kZV9iaXRtYXAgYm0yKQoreworCWV4dDJfaW5vX3QJaTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoYm0xLCBFWFQyX0VUX01BR0lDX0lOT0RFX0JJVE1BUCk7CisJRVhUMl9DSEVDS19NQUdJQyhibTIsIEVYVDJfRVRfTUFHSUNfSU5PREVfQklUTUFQKTsKKworCWlmICgoYm0xLT5zdGFydCAhPSBibTItPnN0YXJ0KSB8fAorCSAgICAoYm0xLT5lbmQgIT0gYm0yLT5lbmQpIHx8CisJICAgIChtZW1jbXAoYm0xLT5iaXRtYXAsIGJtMi0+Yml0bWFwLAorCQkgICAgKHNpemVfdCkgKGJtMS0+ZW5kIC0gYm0xLT5zdGFydCkvOCkpKQorCQlyZXR1cm4gRVhUMl9FVF9ORVFfSU5PREVfQklUTUFQOworCisJZm9yIChpID0gYm0xLT5lbmQgLSAoKGJtMS0+ZW5kIC0gYm0xLT5zdGFydCkgJSA4KTsgaSA8PSBibTEtPmVuZDsgaSsrKQorCQlpZiAoZXh0MmZzX2Zhc3RfdGVzdF9pbm9kZV9iaXRtYXAoYm0xLCBpKSAhPQorCQkgICAgZXh0MmZzX2Zhc3RfdGVzdF9pbm9kZV9iaXRtYXAoYm0yLCBpKSkKKwkJCXJldHVybiBFWFQyX0VUX05FUV9JTk9ERV9CSVRNQVA7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kYmxpc3QuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kYmxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZmNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2RibGlzdC5jCkBAIC0wLDAgKzEsMjYwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBkYmxpc3QuYyAtLSBkaXJlY3RvcnkgYmxvY2sgbGlzdCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBieSBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmc1AuaCIKKworc3RhdGljIGludCBkaXJfYmxvY2tfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOworCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGluIHRoZSBmaWxlc3lzdGVtIGFzIHJlcG9ydGVkIGJ5CisgKiB0aGUgZ3JvdXAgZGVzY3JpcHRvcnMuICBPZiBjb3Vyc2UsIHRoZSBncm91cCBkZXNjcmlwdG9ycyBjb3VsZCBiZQorICogd3JvbmchCisgKi8KK2VycmNvZGVfdCBleHQyZnNfZ2V0X251bV9kaXJzKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190ICpyZXRfbnVtX2RpcnMpCit7CisJZGdycF90CWk7CisJZXh0Ml9pbm9fdAludW1fZGlycywgbWF4X2RpcnM7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJbnVtX2RpcnMgPSAwOworCW1heF9kaXJzID0gZnMtPnN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXA7CisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJaWYgKGZzLT5ncm91cF9kZXNjW2ldLmJnX3VzZWRfZGlyc19jb3VudCA+IG1heF9kaXJzKQorCQkJbnVtX2RpcnMgKz0gbWF4X2RpcnMgLyA4OworCQllbHNlCisJCQludW1fZGlycyArPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ191c2VkX2RpcnNfY291bnQ7CisJfQorCWlmIChudW1fZGlycyA+IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpCisJCW51bV9kaXJzID0gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudDsKKworCSpyZXRfbnVtX2RpcnMgPSBudW1fZGlyczsKKworCXJldHVybiAwOworfQorCisvKgorICogaGVscGVyIGZ1bmN0aW9uIGZvciBtYWtpbmcgYSBuZXcgZGlyZWN0b3J5IGJsb2NrIGxpc3QgKGZvcgorICogaW5pdGlhbGl6ZSBhbmQgY29weSkuCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgbWFrZV9kYmxpc3QoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3Qgc2l6ZSwgZXh0Ml9pbm9fdCBjb3VudCwKKwkJCSAgICAgc3RydWN0IGV4dDJfZGJfZW50cnkgKmxpc3QsCisJCQkgICAgIGV4dDJfZGJsaXN0ICpyZXRfZGJsaXN0KQoreworCWV4dDJfZGJsaXN0CWRibGlzdDsKKwllcnJjb2RlX3QJcmV0dmFsOworCXNpemVfdAkJbGVuOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICgocmV0X2RibGlzdCA9PSAwKSAmJiBmcy0+ZGJsaXN0ICYmCisJICAgIChmcy0+ZGJsaXN0LT5tYWdpYyA9PSBFWFQyX0VUX01BR0lDX0RCTElTVCkpCisJCXJldHVybiAwOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBleHQyX3N0cnVjdF9kYmxpc3QpLCAmZGJsaXN0KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW1lbXNldChkYmxpc3QsIDAsIHNpemVvZihzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfZGJsaXN0KSk7CisKKwlkYmxpc3QtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19EQkxJU1Q7CisJZGJsaXN0LT5mcyA9IGZzOworCWlmIChzaXplKQorCQlkYmxpc3QtPnNpemUgPSBzaXplOworCWVsc2UgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X251bV9kaXJzKGZzLCAmZGJsaXN0LT5zaXplKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwkJZGJsaXN0LT5zaXplID0gKGRibGlzdC0+c2l6ZSAqIDIpICsgMTI7CisJfQorCWxlbiA9IChzaXplX3QpIHNpemVvZihzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSkgKiBkYmxpc3QtPnNpemU7CisJZGJsaXN0LT5jb3VudCA9IGNvdW50OworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGxlbiwgJmRibGlzdC0+bGlzdCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKGxpc3QpCisJCW1lbWNweShkYmxpc3QtPmxpc3QsIGxpc3QsIGxlbik7CisJZWxzZQorCQltZW1zZXQoZGJsaXN0LT5saXN0LCAwLCBsZW4pOworCWlmIChyZXRfZGJsaXN0KQorCQkqcmV0X2RibGlzdCA9IGRibGlzdDsKKwllbHNlCisJCWZzLT5kYmxpc3QgPSBkYmxpc3Q7CisJcmV0dXJuIDA7CitjbGVhbnVwOgorCWV4dDJmc19mcmVlX21lbSgmZGJsaXN0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIGRpcmVjdG9yeSBibG9jayBsaXN0CisgKi8KK2VycmNvZGVfdCBleHQyZnNfaW5pdF9kYmxpc3QoZXh0Ml9maWxzeXMgZnMsIGV4dDJfZGJsaXN0ICpyZXRfZGJsaXN0KQoreworCWV4dDJfZGJsaXN0CWRibGlzdDsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJcmV0dmFsID0gbWFrZV9kYmxpc3QoZnMsIDAsIDAsIDAsICZkYmxpc3QpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlkYmxpc3QtPnNvcnRlZCA9IDE7CisJaWYgKHJldF9kYmxpc3QpCisJCSpyZXRfZGJsaXN0ID0gZGJsaXN0OworCWVsc2UKKwkJZnMtPmRibGlzdCA9IGRibGlzdDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29weSBhIGRpcmVjdG9yeSBibG9jayBsaXN0CisgKi8KK2VycmNvZGVfdCBleHQyZnNfY29weV9kYmxpc3QoZXh0Ml9kYmxpc3Qgc3JjLCBleHQyX2RibGlzdCAqZGVzdCkKK3sKKwlleHQyX2RibGlzdAlkYmxpc3Q7CisJZXJyY29kZV90CXJldHZhbDsKKworCXJldHZhbCA9IG1ha2VfZGJsaXN0KHNyYy0+ZnMsIHNyYy0+c2l6ZSwgc3JjLT5jb3VudCwgc3JjLT5saXN0LAorCQkJICAgICAmZGJsaXN0KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWRibGlzdC0+c29ydGVkID0gc3JjLT5zb3J0ZWQ7CisJKmRlc3QgPSBkYmxpc3Q7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbG9zZSBhIGRpcmVjdG9yeSBibG9jayBsaXN0CisgKgorICogKG1vdmVkIHRvIGNsb3NlZnMuYykKKyAqLworCisKKy8qCisgKiBBZGQgYSBkaXJlY3RvcnkgYmxvY2sgdG8gdGhlIGRpcmVjdG9yeSBibG9jayBsaXN0CisgKi8KK2VycmNvZGVfdCBleHQyZnNfYWRkX2Rpcl9ibG9jayhleHQyX2RibGlzdCBkYmxpc3QsIGV4dDJfaW5vX3QgaW5vLCBibGtfdCBibGssCisJCQkgICAgICAgaW50IGJsb2NrY250KQoreworCXN0cnVjdCBleHQyX2RiX2VudHJ5CSpuZXdfZW50cnk7CisJZXJyY29kZV90CQlyZXR2YWw7CisJdW5zaWduZWQgbG9uZwkJb2xkX3NpemU7CisKKwlFWFQyX0NIRUNLX01BR0lDKGRibGlzdCwgRVhUMl9FVF9NQUdJQ19EQkxJU1QpOworCisJaWYgKGRibGlzdC0+Y291bnQgPj0gZGJsaXN0LT5zaXplKSB7CisJCW9sZF9zaXplID0gZGJsaXN0LT5zaXplICogc2l6ZW9mKHN0cnVjdCBleHQyX2RiX2VudHJ5KTsKKwkJZGJsaXN0LT5zaXplICs9IDEwMDsKKwkJcmV0dmFsID0gZXh0MmZzX3Jlc2l6ZV9tZW0ob2xkX3NpemUsIChzaXplX3QpIGRibGlzdC0+c2l6ZSAqCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSksCisJCQkJCSAgICZkYmxpc3QtPmxpc3QpOworCQlpZiAocmV0dmFsKSB7CisJCQlkYmxpc3QtPnNpemUgLT0gMTAwOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKwluZXdfZW50cnkgPSBkYmxpc3QtPmxpc3QgKyAoIChpbnQpIGRibGlzdC0+Y291bnQrKyk7CisJbmV3X2VudHJ5LT5ibGsgPSBibGs7CisJbmV3X2VudHJ5LT5pbm8gPSBpbm87CisJbmV3X2VudHJ5LT5ibG9ja2NudCA9IGJsb2NrY250OworCisJZGJsaXN0LT5zb3J0ZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGRpcmVjdG9yeSBibG9jayB0byB0aGUgZGlyZWN0b3J5IGJsb2NrIGxpc3QKKyAqLworZXJyY29kZV90IGV4dDJmc19zZXRfZGlyX2Jsb2NrKGV4dDJfZGJsaXN0IGRibGlzdCwgZXh0Ml9pbm9fdCBpbm8sIGJsa190IGJsaywKKwkJCSAgICAgICBpbnQgYmxvY2tjbnQpCit7CisJZGdycF90CQkJaTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZGJsaXN0LCBFWFQyX0VUX01BR0lDX0RCTElTVCk7CisKKwlmb3IgKGk9MDsgaSA8IGRibGlzdC0+Y291bnQ7IGkrKykgeworCQlpZiAoKGRibGlzdC0+bGlzdFtpXS5pbm8gIT0gaW5vKSB8fAorCQkgICAgKGRibGlzdC0+bGlzdFtpXS5ibG9ja2NudCAhPSBibG9ja2NudCkpCisJCQljb250aW51ZTsKKwkJZGJsaXN0LT5saXN0W2ldLmJsayA9IGJsazsKKwkJZGJsaXN0LT5zb3J0ZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIEVYVDJfRVRfREJfTk9UX0ZPVU5EOworfQorCit2b2lkIGV4dDJmc19kYmxpc3Rfc29ydChleHQyX2RibGlzdCBkYmxpc3QsCisJCQlpbnQgKCpzb3J0ZnVuYykoY29uc3Qgdm9pZCAqLAorCQkJCQkJICAgIGNvbnN0IHZvaWQgKikpCit7CisJaWYgKCFzb3J0ZnVuYykKKwkJc29ydGZ1bmMgPSBkaXJfYmxvY2tfY21wOworCXFzb3J0KGRibGlzdC0+bGlzdCwgKHNpemVfdCkgZGJsaXN0LT5jb3VudCwKKwkgICAgICBzaXplb2Yoc3RydWN0IGV4dDJfZGJfZW50cnkpLCBzb3J0ZnVuYyk7CisJZGJsaXN0LT5zb3J0ZWQgPSAxOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyBvdmVyIHRoZSBkaXJlY3RvcnkgYmxvY2sgbGlzdAorICovCitlcnJjb2RlX3QgZXh0MmZzX2RibGlzdF9pdGVyYXRlKGV4dDJfZGJsaXN0IGRibGlzdCwKKwkJCQlpbnQgKCpmdW5jKShleHQyX2ZpbHN5cyBmcywKKwkJCQkJICAgIHN0cnVjdCBleHQyX2RiX2VudHJ5ICpkYl9pbmZvLAorCQkJCQkgICAgdm9pZAkqcHJpdl9kYXRhKSwKKwkJCQl2b2lkICpwcml2X2RhdGEpCit7CisJZXh0Ml9pbm9fdAlpOworCWludAkJcmV0OworCisJRVhUMl9DSEVDS19NQUdJQyhkYmxpc3QsIEVYVDJfRVRfTUFHSUNfREJMSVNUKTsKKworCWlmICghZGJsaXN0LT5zb3J0ZWQpCisJCWV4dDJmc19kYmxpc3Rfc29ydChkYmxpc3QsIDApOworCWZvciAoaT0wOyBpIDwgZGJsaXN0LT5jb3VudDsgaSsrKSB7CisJCXJldCA9ICgqZnVuYykoZGJsaXN0LT5mcywgJmRibGlzdC0+bGlzdFsoaW50KWldLCBwcml2X2RhdGEpOworCQlpZiAocmV0ICYgREJMSVNUX0FCT1JUKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpcl9ibG9ja19jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGJfYSA9CisJCShjb25zdCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqKSBhOworCWNvbnN0IHN0cnVjdCBleHQyX2RiX2VudHJ5ICpkYl9iID0KKwkJKGNvbnN0IHN0cnVjdCBleHQyX2RiX2VudHJ5ICopIGI7CisKKwlpZiAoZGJfYS0+YmxrICE9IGRiX2ItPmJsaykKKwkJcmV0dXJuIChpbnQpIChkYl9hLT5ibGsgLSBkYl9iLT5ibGspOworCisJaWYgKGRiX2EtPmlubyAhPSBkYl9iLT5pbm8pCisJCXJldHVybiAoaW50KSAoZGJfYS0+aW5vIC0gZGJfYi0+aW5vKTsKKworCXJldHVybiAoaW50KSAoZGJfYS0+YmxvY2tjbnQgLSBkYl9iLT5ibG9ja2NudCk7Cit9CisKK2ludCBleHQyZnNfZGJsaXN0X2NvdW50KGV4dDJfZGJsaXN0IGRibGlzdCkKK3sKKwlyZXR1cm4gKGludCkgZGJsaXN0LT5jb3VudDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kYmxpc3RfZGlyLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGJsaXN0X2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzkyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGJsaXN0X2Rpci5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRibGlzdF9kaXIuYyAtLS0gaXRlcmF0ZSBieSBkaXJlY3RvcnkgZW50cnkKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBieSBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmc1AuaCIKKworc3RhdGljIGludCBkYl9kaXJfcHJvYyhleHQyX2ZpbHN5cyBmcywgc3RydWN0IGV4dDJfZGJfZW50cnkgKmRiX2luZm8sCisJCSAgICAgICB2b2lkICpwcml2X2RhdGEpOworCitlcnJjb2RlX3QgZXh0MmZzX2RibGlzdF9kaXJfaXRlcmF0ZShleHQyX2RibGlzdCBkYmxpc3QsCisJCQkJICAgIGludAlmbGFncywKKwkJCQkgICAgY2hhcgkqYmxvY2tfYnVmLAorCQkJCSAgICBpbnQgKCpmdW5jKShleHQyX2lub190IGRpciwKKwkJCQkJCWludAllbnRyeSwKKwkJCQkJCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkJCQkJaW50CW9mZnNldCwKKwkJCQkJCWludAlibG9ja3NpemUsCisJCQkJCQljaGFyCSpidWYsCisJCQkJCQl2b2lkCSpwcml2X2RhdGEpLAorCQkJCSAgICB2b2lkICpwcml2X2RhdGEpCit7CisJZXJyY29kZV90CQlyZXR2YWw7CisJc3RydWN0IGRpcl9jb250ZXh0CWN0eDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZGJsaXN0LCBFWFQyX0VUX01BR0lDX0RCTElTVCk7CisKKwljdHguZGlyID0gMDsKKwljdHguZmxhZ3MgPSBmbGFnczsKKwlpZiAoYmxvY2tfYnVmKQorCQljdHguYnVmID0gYmxvY2tfYnVmOworCWVsc2UgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShkYmxpc3QtPmZzLT5ibG9ja3NpemUsICZjdHguYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCWN0eC5mdW5jID0gZnVuYzsKKwljdHgucHJpdl9kYXRhID0gcHJpdl9kYXRhOworCWN0eC5lcnJjb2RlID0gMDsKKworCXJldHZhbCA9IGV4dDJmc19kYmxpc3RfaXRlcmF0ZShkYmxpc3QsIGRiX2Rpcl9wcm9jLCAmY3R4KTsKKworCWlmICghYmxvY2tfYnVmKQorCQlleHQyZnNfZnJlZV9tZW0oJmN0eC5idWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGN0eC5lcnJjb2RlOworfQorCitzdGF0aWMgaW50IGRiX2Rpcl9wcm9jKGV4dDJfZmlsc3lzIGZzLCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGJfaW5mbywKKwkJICAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgZGlyX2NvbnRleHQJKmN0eDsKKworCWN0eCA9IChzdHJ1Y3QgZGlyX2NvbnRleHQgKikgcHJpdl9kYXRhOworCWN0eC0+ZGlyID0gZGJfaW5mby0+aW5vOworCisJcmV0dXJuIGV4dDJmc19wcm9jZXNzX2Rpcl9ibG9jayhmcywgJmRiX2luZm8tPmJsaywKKwkJCQkJZGJfaW5mby0+YmxvY2tjbnQsIDAsIDAsIHByaXZfZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGlyX2l0ZXJhdGUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kaXJfaXRlcmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNWRhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGlyX2l0ZXJhdGUuYwpAQCAtMCwwICsxLDIxOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZGlyX2l0ZXJhdGUuYyAtLS0gZXh0MmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gb3BlcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmc1AuaCIKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCBhIHBvdGVudGlhbCBkZWxldGVkCisgKiBkaXJlY3RvcnkgZW50cnkgbG9va3MgdmFsaWQuICBXaGF0IHdlIGRvIGlzIGNoZWNrIHRoZSBkZWxldGVkIGVudHJ5CisgKiBhbmQgZWFjaCBzdWNjZXNzaXZlIGVudHJ5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgYWxsIGxvb2sgdmFsaWQgYW5kCisgKiB0aGF0IHRoZSBsYXN0IGRlbGV0ZWQgZW50cnkgZW5kcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0CisgKiB1bmRlbGV0ZWQgZW50cnkuICBSZXR1cm5zIDEgaWYgdGhlIGRlbGV0ZWQgZW50cnkgbG9va3MgdmFsaWQsIHplcm8KKyAqIGlmIG5vdCB2YWxpZC4KKyAqLworc3RhdGljIGludCBleHQyZnNfdmFsaWRhdGVfZW50cnkoY2hhciAqYnVmLCBpbnQgb2Zmc2V0LCBpbnQgZmluYWxfb2Zmc2V0KQoreworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50OworCisJd2hpbGUgKG9mZnNldCA8IGZpbmFsX29mZnNldCkgeworCQlkaXJlbnQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopKGJ1ZiArIG9mZnNldCk7CisJCW9mZnNldCArPSBkaXJlbnQtPnJlY19sZW47CisJCWlmICgoZGlyZW50LT5yZWNfbGVuIDwgOCkgfHwKKwkJICAgICgoZGlyZW50LT5yZWNfbGVuICUgNCkgIT0gMCkgfHwKKwkJICAgICgoKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSs4KSA+IGRpcmVudC0+cmVjX2xlbikpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIChvZmZzZXQgPT0gZmluYWxfb2Zmc2V0KTsKK30KKworZXJyY29kZV90IGV4dDJmc19kaXJfaXRlcmF0ZTIoZXh0Ml9maWxzeXMgZnMsCisJCQkgICAgICBleHQyX2lub190IGRpciwKKwkJCSAgICAgIGludCBmbGFncywKKwkJCSAgICAgIGNoYXIgKmJsb2NrX2J1ZiwKKwkJCSAgICAgIGludCAoKmZ1bmMpKGV4dDJfaW5vX3QJZGlyLAorCQkJCQkgIGludAkJZW50cnksCisJCQkJCSAgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCQkJCSAgaW50CW9mZnNldCwKKwkJCQkJICBpbnQJYmxvY2tzaXplLAorCQkJCQkgIGNoYXIJKmJ1ZiwKKwkJCQkJICB2b2lkCSpwcml2X2RhdGEpLAorCQkJICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdAkJZGlyX2NvbnRleHQJY3R4OworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJcmV0dmFsID0gZXh0MmZzX2NoZWNrX2RpcmVjdG9yeShmcywgZGlyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJY3R4LmRpciA9IGRpcjsKKwljdHguZmxhZ3MgPSBmbGFnczsKKwlpZiAoYmxvY2tfYnVmKQorCQljdHguYnVmID0gYmxvY2tfYnVmOworCWVsc2UgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmY3R4LmJ1Zik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwljdHguZnVuYyA9IGZ1bmM7CisJY3R4LnByaXZfZGF0YSA9IHByaXZfZGF0YTsKKwljdHguZXJyY29kZSA9IDA7CisJcmV0dmFsID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBkaXIsIDAsIDAsCisJCQkJICAgICAgIGV4dDJmc19wcm9jZXNzX2Rpcl9ibG9jaywgJmN0eCk7CisJaWYgKCFibG9ja19idWYpCisJCWV4dDJmc19mcmVlX21lbSgmY3R4LmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gY3R4LmVycmNvZGU7Cit9CisKK3N0cnVjdCB4bGF0ZSB7CisJaW50ICgqZnVuYykoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCSAgICBpbnQJCW9mZnNldCwKKwkJICAgIGludAkJYmxvY2tzaXplLAorCQkgICAgY2hhcgkqYnVmLAorCQkgICAgdm9pZAkqcHJpdl9kYXRhKTsKKwl2b2lkICpyZWFsX3ByaXZhdGU7Cit9OworCitzdGF0aWMgaW50IHhsYXRlX2Z1bmMoZXh0Ml9pbm9fdCBkaXIgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBpbnQgZW50cnkgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwgaW50IG9mZnNldCwKKwkJICAgICAgaW50IGJsb2Nrc2l6ZSwgY2hhciAqYnVmLCB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHhsYXRlICp4bCA9IChzdHJ1Y3QgeGxhdGUgKikgcHJpdl9kYXRhOworCisJcmV0dXJuICgqeGwtPmZ1bmMpKGRpcmVudCwgb2Zmc2V0LCBibG9ja3NpemUsIGJ1ZiwgeGwtPnJlYWxfcHJpdmF0ZSk7Cit9CisKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2Rpcl9pdGVyYXRlKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgICAgZXh0Ml9pbm9fdCBkaXIsCisJCQkgICAgICBpbnQgZmxhZ3MsCisJCQkgICAgICBjaGFyICpibG9ja19idWYsCisJCQkgICAgICBpbnQgKCpmdW5jKShzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCQkJICBpbnQJb2Zmc2V0LAorCQkJCQkgIGludAlibG9ja3NpemUsCisJCQkJCSAgY2hhcgkqYnVmLAorCQkJCQkgIHZvaWQJKnByaXZfZGF0YSksCisJCQkgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHhsYXRlIHhsOworCisJeGwucmVhbF9wcml2YXRlID0gcHJpdl9kYXRhOworCXhsLmZ1bmMgPSBmdW5jOworCisJcmV0dXJuIGV4dDJmc19kaXJfaXRlcmF0ZTIoZnMsIGRpciwgZmxhZ3MsIGJsb2NrX2J1ZiwKKwkJCQkgICB4bGF0ZV9mdW5jLCAmeGwpOworfQorCisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggaXMgcHJpdmF0ZSB0byB0aGlzIG1vZHVsZS4gIFVzZWQgYnkKKyAqIGV4dDJmc19kaXJfaXRlcmF0ZSgpIGFuZCBleHQyZnNfZGJsaXN0X2Rpcl9pdGVyYXRlKCkKKyAqLworaW50IGV4dDJmc19wcm9jZXNzX2Rpcl9ibG9jayhleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgYmxrX3QJKmJsb2NrbnIsCisJCQkgICAgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJICAgICBibGtfdAlyZWZfYmxvY2sgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICBpbnQJcmVmX29mZnNldCBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgICAgIHZvaWQJKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgZGlyX2NvbnRleHQgKikgcHJpdl9kYXRhOworCXVuc2lnbmVkIGludAlvZmZzZXQgPSAwOworCXVuc2lnbmVkIGludAluZXh0X3JlYWxfZW50cnkgPSAwOworCWludAkJcmV0ID0gMDsKKwlpbnQJCWNoYW5nZWQgPSAwOworCWludAkJZG9fYWJvcnQgPSAwOworCWludAkJZW50cnksIHNpemU7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQ7CisKKwlpZiAoYmxvY2tjbnQgPCAwKQorCQlyZXR1cm4gMDsKKworCWVudHJ5ID0gYmxvY2tjbnQgPyBESVJFTlRfT1RIRVJfRklMRSA6IERJUkVOVF9ET1RfRklMRTsKKworCWN0eC0+ZXJyY29kZSA9IGV4dDJmc19yZWFkX2Rpcl9ibG9jayhmcywgKmJsb2NrbnIsIGN0eC0+YnVmKTsKKwlpZiAoY3R4LT5lcnJjb2RlKQorCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisKKwl3aGlsZSAob2Zmc2V0IDwgZnMtPmJsb2Nrc2l6ZSkgeworCQlkaXJlbnQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIChjdHgtPmJ1ZiArIG9mZnNldCk7CisJCWlmICgoKG9mZnNldCArIGRpcmVudC0+cmVjX2xlbikgPiBmcy0+YmxvY2tzaXplKSB8fAorCQkgICAgKGRpcmVudC0+cmVjX2xlbiA8IDgpIHx8CisJCSAgICAoKGRpcmVudC0+cmVjX2xlbiAlIDQpICE9IDApIHx8CisJCSAgICAoKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikrOCkgPiBkaXJlbnQtPnJlY19sZW4pKSB7CisJCQljdHgtPmVycmNvZGUgPSBFWFQyX0VUX0RJUl9DT1JSVVBURUQ7CisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwkJaWYgKCFkaXJlbnQtPmlub2RlICYmCisJCSAgICAhKGN0eC0+ZmxhZ3MgJiBESVJFTlRfRkxBR19JTkNMVURFX0VNUFRZKSkKKwkJCWdvdG8gbmV4dDsKKworCQlyZXQgPSAoY3R4LT5mdW5jKShjdHgtPmRpciwKKwkJCQkgIChuZXh0X3JlYWxfZW50cnkgPiBvZmZzZXQpID8KKwkJCQkgIERJUkVOVF9ERUxFVEVEX0ZJTEUgOiBlbnRyeSwKKwkJCQkgIGRpcmVudCwgb2Zmc2V0LAorCQkJCSAgZnMtPmJsb2Nrc2l6ZSwgY3R4LT5idWYsCisJCQkJICBjdHgtPnByaXZfZGF0YSk7CisJCWlmIChlbnRyeSA8IERJUkVOVF9PVEhFUl9GSUxFKQorCQkJZW50cnkrKzsKKworCQlpZiAocmV0ICYgRElSRU5UX0NIQU5HRUQpCisJCQljaGFuZ2VkKys7CisJCWlmIChyZXQgJiBESVJFTlRfQUJPUlQpIHsKKwkJCWRvX2Fib3J0Kys7CisJCQlicmVhazsKKwkJfQorbmV4dDoKKwkJaWYgKG5leHRfcmVhbF9lbnRyeSA9PSBvZmZzZXQpCisJCQluZXh0X3JlYWxfZW50cnkgKz0gZGlyZW50LT5yZWNfbGVuOworCisJCWlmIChjdHgtPmZsYWdzICYgRElSRU5UX0ZMQUdfSU5DTFVERV9SRU1PVkVEKSB7CisJCQlzaXplID0gKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikgKyAxMSkgJiB+MzsKKworCQkJaWYgKGRpcmVudC0+cmVjX2xlbiAhPSBzaXplKSAgeworCQkJCXVuc2lnbmVkIGludCBmaW5hbF9vZmZzZXQ7CisKKwkJCQlmaW5hbF9vZmZzZXQgPSBvZmZzZXQgKyBkaXJlbnQtPnJlY19sZW47CisJCQkJb2Zmc2V0ICs9IHNpemU7CisJCQkJd2hpbGUgKG9mZnNldCA8IGZpbmFsX29mZnNldCAmJgorCQkJCSAgICAgICAhZXh0MmZzX3ZhbGlkYXRlX2VudHJ5KGN0eC0+YnVmLAorCQkJCQkJCSAgICAgIG9mZnNldCwKKwkJCQkJCQkgICAgICBmaW5hbF9vZmZzZXQpKQorCQkJCQlvZmZzZXQgKz0gNDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlvZmZzZXQgKz0gZGlyZW50LT5yZWNfbGVuOworCX0KKworCWlmIChjaGFuZ2VkKSB7CisJCWN0eC0+ZXJyY29kZSA9IGV4dDJmc193cml0ZV9kaXJfYmxvY2soZnMsICpibG9ja25yLCBjdHgtPmJ1Zik7CisJCWlmIChjdHgtPmVycmNvZGUpCisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJfQorCWlmIChkb19hYm9ydCkKKwkJcmV0dXJuIEJMT0NLX0FCT1JUOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2RpcmJsb2NrLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGlyYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWM1YTEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2RpcmJsb2NrLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRpcmJsb2NrLmMgLS0tIGRpcmVjdG9yeSBibG9jayByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworZXJyY29kZV90IGV4dDJmc19yZWFkX2Rpcl9ibG9jazIoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLAorCQkJCSB2b2lkICpidWYsIGludCBmbGFncyBFWFQyRlNfQVRUUigodW51c2VkKSkpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwljaGFyCQkqcCwgKmVuZDsKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudDsKKwl1bnNpZ25lZCBpbnQJbmFtZV9sZW4sIHJlY19sZW47CisjaWYgQkJfQklHX0VORElBTgorCXVuc2lnbmVkIGludCBkb19zd2FwOworI2VuZGlmCisKKwlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxvY2ssIDEsIGJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKyNpZiBCQl9CSUdfRU5ESUFOCisJZG9fc3dhcCA9IChmcy0+ZmxhZ3MgJiAoRVhUMl9GTEFHX1NXQVBfQllURVN8CisJCQkJRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRCkpICE9IDA7CisjZW5kaWYKKwlwID0gKGNoYXIgKikgYnVmOworCWVuZCA9IChjaGFyICopIGJ1ZiArIGZzLT5ibG9ja3NpemU7CisJd2hpbGUgKHAgPCBlbmQtOCkgeworCQlkaXJlbnQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIHA7CisjaWYgQkJfQklHX0VORElBTgorCQlpZiAoZG9fc3dhcCkgeworCQkJZGlyZW50LT5pbm9kZSA9IGV4dDJmc19zd2FiMzIoZGlyZW50LT5pbm9kZSk7CisJCQlkaXJlbnQtPnJlY19sZW4gPSBleHQyZnNfc3dhYjE2KGRpcmVudC0+cmVjX2xlbik7CisJCQlkaXJlbnQtPm5hbWVfbGVuID0gZXh0MmZzX3N3YWIxNihkaXJlbnQtPm5hbWVfbGVuKTsKKwkJfQorI2VuZGlmCisJCW5hbWVfbGVuID0gZGlyZW50LT5uYW1lX2xlbjsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKwkJaWYgKGZsYWdzICYgRVhUMl9ESVJCTE9DS19WMl9TVFJVQ1QpCisJCQlkaXJlbnQtPm5hbWVfbGVuID0gZXh0MmZzX3N3YWIxNihkaXJlbnQtPm5hbWVfbGVuKTsKKyNlbmRpZgorCQlyZWNfbGVuID0gZGlyZW50LT5yZWNfbGVuOworCQlpZiAoKHJlY19sZW4gPCA4KSB8fCAocmVjX2xlbiAlIDQpKSB7CisJCQlyZWNfbGVuID0gODsKKwkJCXJldHZhbCA9IEVYVDJfRVRfRElSX0NPUlJVUFRFRDsKKwkJfQorCQlpZiAoKChuYW1lX2xlbiAmIDB4RkYpICsgOCkgPiBkaXJlbnQtPnJlY19sZW4pCisJCQlyZXR2YWwgPSBFWFQyX0VUX0RJUl9DT1JSVVBURUQ7CisJCXAgKz0gcmVjX2xlbjsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworZXJyY29kZV90IGV4dDJmc19yZWFkX2Rpcl9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxvY2ssCisJCQkJIHZvaWQgKmJ1ZikKK3sKKwlyZXR1cm4gZXh0MmZzX3JlYWRfZGlyX2Jsb2NrMihmcywgYmxvY2ssIGJ1ZiwgMCk7Cit9CisKKworZXJyY29kZV90IGV4dDJmc193cml0ZV9kaXJfYmxvY2syKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jaywKKwkJCQkgIHZvaWQgKmluYnVmLCBpbnQgZmxhZ3MgRVhUMkZTX0FUVFIoKHVudXNlZCkpKQoreworI2lmIEJCX0JJR19FTkRJQU4KKwlpbnQJCWRvX3N3YXAgPSAwOworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhcgkJKnAsICplbmQ7CisJY2hhcgkJKmJ1ZiA9IE5VTEw7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQ7CisKKwlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpKQorCQlkb19zd2FwID0gMTsKKworI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KKwlpZiAoIWRvX3N3YXApCisJCXJldHVybiBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGJsb2NrLCAxLCAoY2hhciAqKSBpbmJ1Zik7CisjZW5kaWYKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZidWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtY3B5KGJ1ZiwgaW5idWYsIGZzLT5ibG9ja3NpemUpOworCXAgPSBidWY7CisJZW5kID0gYnVmICsgZnMtPmJsb2Nrc2l6ZTsKKwl3aGlsZSAocCA8IGVuZCkgeworCQlkaXJlbnQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIHA7CisJCWlmICgoZGlyZW50LT5yZWNfbGVuIDwgOCkgfHwKKwkJICAgIChkaXJlbnQtPnJlY19sZW4gJSA0KSkgeworCQkJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCQkJcmV0dXJuIEVYVDJfRVRfRElSX0NPUlJVUFRFRDsKKwkJfQorCQlwICs9IGRpcmVudC0+cmVjX2xlbjsKKwkJaWYgKGRvX3N3YXApIHsKKwkJCWRpcmVudC0+aW5vZGUgPSBleHQyZnNfc3dhYjMyKGRpcmVudC0+aW5vZGUpOworCQkJZGlyZW50LT5yZWNfbGVuID0gZXh0MmZzX3N3YWIxNihkaXJlbnQtPnJlY19sZW4pOworCQkJZGlyZW50LT5uYW1lX2xlbiA9IGV4dDJmc19zd2FiMTYoZGlyZW50LT5uYW1lX2xlbik7CisJCX0KKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKwkJaWYgKGZsYWdzICYgRVhUMl9ESVJCTE9DS19WMl9TVFJVQ1QpCisJCQlkaXJlbnQtPm5hbWVfbGVuID0gZXh0MmZzX3N3YWIxNihkaXJlbnQtPm5hbWVfbGVuKTsKKyNlbmRpZgorCX0KKwlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGJsb2NrLCAxLCBidWYpOworCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworI2Vsc2UKKwlyZXR1cm4gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibG9jaywgMSwgKGNoYXIgKikgaW5idWYpOworI2VuZGlmCit9CisKKworZXJyY29kZV90IGV4dDJmc193cml0ZV9kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLAorCQkJCSB2b2lkICppbmJ1ZikKK3sKKwlyZXR1cm4gZXh0MmZzX3dyaXRlX2Rpcl9ibG9jazIoZnMsIGJsb2NrLCBpbmJ1ZiwgMCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGlyaGFzaC5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Rpcmhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWUzNGJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Rpcmhhc2guYwpAQCAtMCwwICsxLDIzNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZGlyaGFzaC5jIC0tIENhbGN1bGF0ZSB0aGUgaGFzaCBvZiBhIGRpcmVjdG9yeSBlbnRyeQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSAgRGFuaWVsIFBoaWxsaXBzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIEtleWVkIDMyLWJpdCBoYXNoIGZ1bmN0aW9uIHVzaW5nIFRFQSBpbiBhIERhdmlzLU1leWVyIGZ1bmN0aW9uCisgKiAgIEgwID0gS2V5CisgKiAgIEhpID0gRSBNaShIaS0xKSArIEhpLTEKKyAqCisgKiAoc2VlIEFwcGxpZWQgQ3J5cHRvZ3JhcGh5LCAybmQgZWRpdGlvbiwgcDQ0OCkuCisgKgorICogSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QHppcC5jb20uYXU+IDE5OTgKKyAqCisgKiBUaGlzIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwKKyAqLworI2RlZmluZSBERUxUQSAweDlFMzc3OUI5CisKK3N0YXRpYyB2b2lkIFRFQV90cmFuc2Zvcm0oX191MzIgYnVmWzRdLCBfX3UzMiBjb25zdCBpbltdKQoreworCV9fdTMyCXN1bSA9IDA7CisJX191MzIJYjAgPSBidWZbMF0sIGIxID0gYnVmWzFdOworCV9fdTMyCWEgPSBpblswXSwgYiA9IGluWzFdLCBjID0gaW5bMl0sIGQgPSBpblszXTsKKwlpbnQJbiA9IDE2OworCisJZG8geworCQlzdW0gKz0gREVMVEE7CisJCWIwICs9ICgoYjEgPDwgNCkrYSkgXiAoYjErc3VtKSBeICgoYjEgPj4gNSkrYik7CisJCWIxICs9ICgoYjAgPDwgNCkrYykgXiAoYjArc3VtKSBeICgoYjAgPj4gNSkrZCk7CisJfSB3aGlsZSAoLS1uKTsKKworCWJ1ZlswXSArPSBiMDsKKwlidWZbMV0gKz0gYjE7Cit9CisKKy8qIEYsIEcgYW5kIEggYXJlIGJhc2ljIE1ENCBmdW5jdGlvbnM6IHNlbGVjdGlvbiwgbWFqb3JpdHksIHBhcml0eSAqLworI2RlZmluZSBGKHgsIHksIHopICgoeikgXiAoKHgpICYgKCh5KSBeICh6KSkpKQorI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHkpKSArICgoKHgpIF4gKHkpKSAmICh6KSkpCisjZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKworLyoKKyAqIFRoZSBnZW5lcmljIHJvdW5kIGZ1bmN0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIGlzIHNvIHNwZWNpZmljIHRoYXQKKyAqIHdlIGRvbid0IGJvdGhlciBwcm90ZWN0aW5nIGFsbCB0aGUgYXJndW1lbnRzIHdpdGggcGFyZW5zLCBhcyBpcyBnZW5lcmFsbHkKKyAqIGdvb2QgbWFjcm8gcHJhY3RpY2UsIGluIGZhdm9yIG9mIGV4dHJhIGxlZ2liaWxpdHkuCisgKiBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbgorICovCisjZGVmaW5lIFJPVU5EKGYsIGEsIGIsIGMsIGQsIHgsIHMpCVwKKwkoYSArPSBmKGIsIGMsIGQpICsgeCwgYSA9IChhIDw8IHMpIHwgKGEgPj4gKDMyLXMpKSkKKyNkZWZpbmUgSzEgMAorI2RlZmluZSBLMiAwMTMyNDA0NzQ2MzFVTAorI2RlZmluZSBLMyAwMTU2NjYzNjU2NDFVTAorCisvKgorICogQmFzaWMgY3V0LWRvd24gTUQ0IHRyYW5zZm9ybS4gIFJldHVybnMgb25seSAzMiBiaXRzIG9mIHJlc3VsdC4KKyAqLworc3RhdGljIHZvaWQgaGFsZk1ENFRyYW5zZm9ybSAoX191MzIgYnVmWzRdLCBfX3UzMiBjb25zdCBpbltdKQoreworCV9fdTMyCWEgPSBidWZbMF0sIGIgPSBidWZbMV0sIGMgPSBidWZbMl0sIGQgPSBidWZbM107CisKKwkvKiBSb3VuZCAxICovCisJUk9VTkQoRiwgYSwgYiwgYywgZCwgaW5bMF0gKyBLMSwgIDMpOworCVJPVU5EKEYsIGQsIGEsIGIsIGMsIGluWzFdICsgSzEsICA3KTsKKwlST1VORChGLCBjLCBkLCBhLCBiLCBpblsyXSArIEsxLCAxMSk7CisJUk9VTkQoRiwgYiwgYywgZCwgYSwgaW5bM10gKyBLMSwgMTkpOworCVJPVU5EKEYsIGEsIGIsIGMsIGQsIGluWzRdICsgSzEsICAzKTsKKwlST1VORChGLCBkLCBhLCBiLCBjLCBpbls1XSArIEsxLCAgNyk7CisJUk9VTkQoRiwgYywgZCwgYSwgYiwgaW5bNl0gKyBLMSwgMTEpOworCVJPVU5EKEYsIGIsIGMsIGQsIGEsIGluWzddICsgSzEsIDE5KTsKKworCS8qIFJvdW5kIDIgKi8KKwlST1VORChHLCBhLCBiLCBjLCBkLCBpblsxXSArIEsyLCAgMyk7CisJUk9VTkQoRywgZCwgYSwgYiwgYywgaW5bM10gKyBLMiwgIDUpOworCVJPVU5EKEcsIGMsIGQsIGEsIGIsIGluWzVdICsgSzIsICA5KTsKKwlST1VORChHLCBiLCBjLCBkLCBhLCBpbls3XSArIEsyLCAxMyk7CisJUk9VTkQoRywgYSwgYiwgYywgZCwgaW5bMF0gKyBLMiwgIDMpOworCVJPVU5EKEcsIGQsIGEsIGIsIGMsIGluWzJdICsgSzIsICA1KTsKKwlST1VORChHLCBjLCBkLCBhLCBiLCBpbls0XSArIEsyLCAgOSk7CisJUk9VTkQoRywgYiwgYywgZCwgYSwgaW5bNl0gKyBLMiwgMTMpOworCisJLyogUm91bmQgMyAqLworCVJPVU5EKEgsIGEsIGIsIGMsIGQsIGluWzNdICsgSzMsICAzKTsKKwlST1VORChILCBkLCBhLCBiLCBjLCBpbls3XSArIEszLCAgOSk7CisJUk9VTkQoSCwgYywgZCwgYSwgYiwgaW5bMl0gKyBLMywgMTEpOworCVJPVU5EKEgsIGIsIGMsIGQsIGEsIGluWzZdICsgSzMsIDE1KTsKKwlST1VORChILCBhLCBiLCBjLCBkLCBpblsxXSArIEszLCAgMyk7CisJUk9VTkQoSCwgZCwgYSwgYiwgYywgaW5bNV0gKyBLMywgIDkpOworCVJPVU5EKEgsIGMsIGQsIGEsIGIsIGluWzBdICsgSzMsIDExKTsKKwlST1VORChILCBiLCBjLCBkLCBhLCBpbls0XSArIEszLCAxNSk7CisKKwlidWZbMF0gKz0gYTsKKwlidWZbMV0gKz0gYjsKKwlidWZbMl0gKz0gYzsKKwlidWZbM10gKz0gZDsKK30KKworI3VuZGVmIFJPVU5ECisjdW5kZWYgRgorI3VuZGVmIEcKKyN1bmRlZiBICisjdW5kZWYgSzEKKyN1bmRlZiBLMgorI3VuZGVmIEszCisKKy8qIFRoZSBvbGQgbGVnYWN5IGhhc2ggKi8KK3N0YXRpYyBleHQyX2Rpcmhhc2hfdCBkeF9oYWNrX2hhc2ggKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJX191MzIgaGFzaDAgPSAweDEyYTNmZTJkLCBoYXNoMSA9IDB4MzdhYmU4Zjk7CisJd2hpbGUgKGxlbi0tKSB7CisJCV9fdTMyIGhhc2ggPSBoYXNoMSArIChoYXNoMCBeICgqbmFtZSsrICogNzE1MjM3MykpOworCisJCWlmIChoYXNoICYgMHg4MDAwMDAwMCkgaGFzaCAtPSAweDdmZmZmZmZmOworCQloYXNoMSA9IGhhc2gwOworCQloYXNoMCA9IGhhc2g7CisJfQorCXJldHVybiAoaGFzaDAgPDwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cjJoYXNoYnVmKGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbiwgX191MzIgKmJ1ZiwgaW50IG51bSkKK3sKKwlfX3UzMglwYWQsIHZhbDsKKwlpbnQJaTsKKworCXBhZCA9IChfX3UzMilsZW4gfCAoKF9fdTMyKWxlbiA8PCA4KTsKKwlwYWQgfD0gcGFkIDw8IDE2OworCisJdmFsID0gcGFkOworCWlmIChsZW4gPiBudW0qNCkKKwkJbGVuID0gbnVtICogNDsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICgoaSAlIDQpID09IDApCisJCQl2YWwgPSBwYWQ7CisJCXZhbCA9IG1zZ1tpXSArICh2YWwgPDwgOCk7CisJCWlmICgoaSAlIDQpID09IDMpIHsKKwkJCSpidWYrKyA9IHZhbDsKKwkJCXZhbCA9IHBhZDsKKwkJCW51bS0tOworCQl9CisJfQorCWlmICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSB2YWw7CisJd2hpbGUgKC0tbnVtID49IDApCisJCSpidWYrKyA9IHBhZDsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIGhhc2ggb2YgYSBmaWxlbmFtZS4gIElmIGxlbiBpcyAwIGFuZCBuYW1lIGlzIE5VTEwsIHRoZW4KKyAqIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gdGVzdCB3aGV0aGVyIG9yIG5vdCBhIGhhc2ggdmVyc2lvbiBpcworICogc3VwcG9ydGVkLgorICoKKyAqIFRoZSBzZWVkIGlzIGFuIDQgbG9uZ3dvcmQgKDMyIGJpdHMpICJzZWNyZXQiIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisgKiB1bmlxdWlmeSBhIGhhc2guICBJZiB0aGUgc2VlZCBpcyBhbGwgemVybydzLCB0aGVuIHNvbWUgZGVmYXVsdCBzZWVkCisgKiBtYXkgYmUgdXNlZC4KKyAqCisgKiBBIHBhcnRpY3VsYXIgaGFzaCB2ZXJzaW9uIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VlZCBpcworICogcmVwcmVzZW50ZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgcmV0dXJuZWQgaGFzaCBpcyAzMiBiaXRzIG9yIDY0CisgKiBiaXRzLiAgMzIgYml0IGhhc2hlcyB3aWxsIHJldHVybiAwIGZvciB0aGUgbWlub3IgaGFzaC4KKyAqLworZXJyY29kZV90IGV4dDJmc19kaXJoYXNoKGludCB2ZXJzaW9uLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLAorCQkJIGNvbnN0IF9fdTMyICpzZWVkLAorCQkJIGV4dDJfZGlyaGFzaF90ICpyZXRfaGFzaCwKKwkJCSBleHQyX2Rpcmhhc2hfdCAqcmV0X21pbm9yX2hhc2gpCit7CisJX191MzIJaGFzaDsKKwlfX3UzMgltaW5vcl9oYXNoID0gMDsKKwljb25zdCBjaGFyCSpwOworCWludAkJaTsKKwlfX3UzMgkJaW5bOF0sIGJ1Zls0XTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgc2VlZCBmb3IgdGhlIGhhc2ggY2hlY2tzdW0gZnVuY3Rpb25zICovCisJYnVmWzBdID0gMHg2NzQ1MjMwMTsKKwlidWZbMV0gPSAweGVmY2RhYjg5OworCWJ1ZlsyXSA9IDB4OThiYWRjZmU7CisJYnVmWzNdID0gMHgxMDMyNTQ3NjsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc2VlZCBpcyBhbGwgemVybydzICovCisJaWYgKHNlZWQpIHsKKwkJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJCWlmIChzZWVkW2ldKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpIDwgNCkKKwkJCW1lbWNweShidWYsIHNlZWQsIHNpemVvZihidWYpKTsKKwl9CisKKwlzd2l0Y2ggKHZlcnNpb24pIHsKKwljYXNlIEVYVDJfSEFTSF9MRUdBQ1k6CisJCWhhc2ggPSBkeF9oYWNrX2hhc2gobmFtZSwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBFWFQyX0hBU0hfSEFMRl9NRDQ6CisJCXAgPSBuYW1lOworCQl3aGlsZSAobGVuID4gMCkgeworCQkJc3RyMmhhc2hidWYocCwgbGVuLCBpbiwgOCk7CisJCQloYWxmTUQ0VHJhbnNmb3JtKGJ1ZiwgaW4pOworCQkJbGVuIC09IDMyOworCQkJcCArPSAzMjsKKwkJfQorCQltaW5vcl9oYXNoID0gYnVmWzJdOworCQloYXNoID0gYnVmWzFdOworCQlicmVhazsKKwljYXNlIEVYVDJfSEFTSF9URUE6CisJCXAgPSBuYW1lOworCQl3aGlsZSAobGVuID4gMCkgeworCQkJc3RyMmhhc2hidWYocCwgbGVuLCBpbiwgNCk7CisJCQlURUFfdHJhbnNmb3JtKGJ1ZiwgaW4pOworCQkJbGVuIC09IDE2OworCQkJcCArPSAxNjsKKwkJfQorCQloYXNoID0gYnVmWzBdOworCQltaW5vcl9oYXNoID0gYnVmWzFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqcmV0X2hhc2ggPSAwOworCQlyZXR1cm4gRVhUMl9FVF9ESVJIQVNIX1VOU1VQUDsKKwl9CisJKnJldF9oYXNoID0gaGFzaCAmIH4xOworCWlmIChyZXRfbWlub3JfaGFzaCkKKwkJKnJldF9taW5vcl9oYXNoID0gbWlub3JfaGFzaDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kdXBmcy5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2R1cGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4NzkzNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kdXBmcy5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGR1cGZzLmMgLS0tIGR1cGxpY2F0ZSBhIGV4dDIgZmlsZXN5c3RlbSBoYW5kbGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDIwMDEsIDIwMDMsIDIwMDUgYnkgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKK2VycmNvZGVfdCBleHQyZnNfZHVwX2hhbmRsZShleHQyX2ZpbHN5cyBzcmMsIGV4dDJfZmlsc3lzICpkZXN0KQoreworCWV4dDJfZmlsc3lzCWZzOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKHNyYywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3Qgc3RydWN0X2V4dDJfZmlsc3lzKSwgJmZzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJKmZzID0gKnNyYzsKKwlmcy0+ZGV2aWNlX25hbWUgPSAwOworCWZzLT5zdXBlciA9IDA7CisJZnMtPm9yaWdfc3VwZXIgPSAwOworCWZzLT5ncm91cF9kZXNjID0gMDsKKwlmcy0+aW5vZGVfbWFwID0gMDsKKwlmcy0+YmxvY2tfbWFwID0gMDsKKwlmcy0+YmFkYmxvY2tzID0gMDsKKwlmcy0+ZGJsaXN0ID0gMDsKKworCWlvX2NoYW5uZWxfYnVtcGNvdW50KGZzLT5pbyk7CisJaWYgKGZzLT5pY2FjaGUpCisJCWZzLT5pY2FjaGUtPnJlZmNvdW50Kys7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzdHJsZW4oc3JjLT5kZXZpY2VfbmFtZSkrMSwgJmZzLT5kZXZpY2VfbmFtZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJc3RyY3B5KGZzLT5kZXZpY2VfbmFtZSwgc3JjLT5kZXZpY2VfbmFtZSk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShTVVBFUkJMT0NLX1NJWkUsICZmcy0+c3VwZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbWNweShmcy0+c3VwZXIsIHNyYy0+c3VwZXIsIFNVUEVSQkxPQ0tfU0laRSk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShTVVBFUkJMT0NLX1NJWkUsICZmcy0+b3JpZ19zdXBlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJbWVtY3B5KGZzLT5vcmlnX3N1cGVyLCBzcmMtPm9yaWdfc3VwZXIsIFNVUEVSQkxPQ0tfU0laRSk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbSgoc2l6ZV90KSBmcy0+ZGVzY19ibG9ja3MgKiBmcy0+YmxvY2tzaXplLAorCQkJCSZmcy0+Z3JvdXBfZGVzYyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJbWVtY3B5KGZzLT5ncm91cF9kZXNjLCBzcmMtPmdyb3VwX2Rlc2MsCisJICAgICAgIChzaXplX3QpIGZzLT5kZXNjX2Jsb2NrcyAqIGZzLT5ibG9ja3NpemUpOworCisJaWYgKHNyYy0+aW5vZGVfbWFwKSB7CisJCXJldHZhbCA9IGV4dDJmc19jb3B5X2JpdG1hcChzcmMtPmlub2RlX21hcCwgJmZzLT5pbm9kZV9tYXApOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvdXQ7CisJfQorCWlmIChzcmMtPmJsb2NrX21hcCkgeworCQlyZXR2YWwgPSBleHQyZnNfY29weV9iaXRtYXAoc3JjLT5ibG9ja19tYXAsICZmcy0+YmxvY2tfbWFwKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3V0OworCX0KKwlpZiAoc3JjLT5iYWRibG9ja3MpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2JhZGJsb2Nrc19jb3B5KHNyYy0+YmFkYmxvY2tzLCAmZnMtPmJhZGJsb2Nrcyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKwl9CisJaWYgKHNyYy0+ZGJsaXN0KSB7CisJCXJldHZhbCA9IGV4dDJmc19jb3B5X2RibGlzdChzcmMtPmRibGlzdCwgJmZzLT5kYmxpc3QpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvdXQ7CisJfQorCSpkZXN0ID0gZnM7CisJcmV0dXJuIDA7CitlcnJvdXQ6CisJZXh0MmZzX2ZyZWUoZnMpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZTJpbWFnZS5oIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2UyaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTk4ZDAxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2UyaW1hZ2UuaApAQCAtMCwwICsxLDM5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBlMmltYWdlLmggLS0tIGhlYWRlciBmaWxlIGRlc2NyaWJpbmcgdGhlIGV4dDIgaW1hZ2UgZm9ybWF0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRoZW9kb3JlIFRzJ28uCisgKgorICogTm90ZTogdGhpcyB1c2VzIHRoZSBQT1NJWCBJTyBpbnRlcmZhY2VzLCB1bmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIKKyAqIGZ1bmN0aW9ucyBpbiB0aGlzIGxpYnJhcnkuICBTbyBzdWUgbWUuCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisKK3N0cnVjdCBleHQyX2ltYWdlX2hkciB7CisJX191MzIJbWFnaWNfbnVtYmVyOwkvKiBUaGlzIG11c3QgYmUgRVhUMl9FVF9NQUdJQ19FMklNQUdFICovCisJY2hhcgltYWdpY19kZXNjcmlwdG9yWzE2XTsgLyogIkV4dDIgSW1hZ2UgMS4wIiwgdy8gbnVsbCBwYWRkaW5nICovCisJY2hhcglmc19ob3N0bmFtZVs2NF07LyogSG9zdG5hbWUgb2YgbWFjaGluZSBvZiBpbWFnZSAqLworCWNoYXIJZnNfbmV0YWRkclszMl07CS8qIE5ldHdvcmsgYWRkcmVzcyAqLworCV9fdTMyCWZzX25ldGFkZHJfdHlwZTsvKiAwID0gSVBWNCwgMSA9IElQVjYsIGV0Yy4gKi8KKwlfX3UzMglmc19kZXZpY2U7CS8qIERldmljZSBudW1iZXIgb2YgaW1hZ2UgKi8KKwljaGFyCWZzX2RldmljZV9uYW1lWzY0XTsgLyogRGV2aWNlIG5hbWUgKi8KKwljaGFyCWZzX3V1aWRbMTZdOwkvKiBVVUlEIG9mIGZpbGVzeXN0ZW0gKi8KKwlfX3UzMglmc19ibG9ja3NpemU7CS8qIEJsb2NrIHNpemUgb2YgdGhlIGZpbGVzeXN0ZW0gKi8KKwlfX3UzMglmc19yZXNlcnZlZFs4XTsKKworCV9fdTMyCWltYWdlX2RldmljZTsJLyogRGV2aWNlIG51bWJlciBvZiBpbWFnZSBmaWxlICovCisJX191MzIJaW1hZ2VfaW5vZGU7CS8qIElub2RlIG51bWJlciBvZiBpbWFnZSBmaWxlICovCisJX191MzIJaW1hZ2VfdGltZTsJLyogVGltZSBvZiBpbWFnZSBjcmVhdGlvbiAqLworCV9fdTMyCWltYWdlX3Jlc2VydmVkWzhdOworCisJX191MzIJb2Zmc2V0X3N1cGVyOwkvKiBCeXRlIG9mZnNldCBvZiB0aGUgc2IgYW5kIGRlc2NyaXB0b3JzICovCisJX191MzIJb2Zmc2V0X2lub2RlOwkvKiBCeXRlIG9mZnNldCBvZiB0aGUgaW5vZGUgdGFibGUgICovCisJX191MzIJb2Zmc2V0X2lub2RlbWFwOyAvKiBCeXRlIG9mZnNldCBvZiB0aGUgaW5vZGUgYml0bWFwcyAqLworCV9fdTMyCW9mZnNldF9ibG9ja21hcDsgLyogQnl0ZSBvZmZzZXQgb2YgdGhlIGlub2RlIGJpdG1hcHMgKi8KKwlfX3UzMglvZmZzZXRfcmVzZXJ2ZWRbOF07Cit9OwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4cGFuZGRpci5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4cGFuZGRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjlhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXhwYW5kZGlyLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGV4cGFuZC5jIC0tLSBleHBhbmQgYW4gZXh0MmZzIGRpcmVjdG9yeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSAgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdHJ1Y3QgZXhwYW5kX2Rpcl9zdHJ1Y3QgeworCWludAkJZG9uZTsKKwlpbnQJCW5ld2Jsb2NrczsKKwllcnJjb2RlX3QJZXJyOworfTsKKworc3RhdGljIGludCBleHBhbmRfZGlyX3Byb2MoZXh0Ml9maWxzeXMJZnMsCisJCQkgICBibGtfdAkqYmxvY2tuciwKKwkJCSAgIGUyX2Jsa2NudF90CWJsb2NrY250LAorCQkJICAgYmxrX3QJcmVmX2Jsb2NrIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIGludAkJcmVmX29mZnNldCBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgICB2b2lkCQkqcHJpdl9kYXRhKQoreworCXN0cnVjdCBleHBhbmRfZGlyX3N0cnVjdCAqZXMgPSAoc3RydWN0IGV4cGFuZF9kaXJfc3RydWN0ICopIHByaXZfZGF0YTsKKwlibGtfdAluZXdfYmxrOworCXN0YXRpYyBibGtfdAlsYXN0X2JsayA9IDA7CisJY2hhcgkJKmJsb2NrOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlpZiAoKmJsb2NrbnIpIHsKKwkJbGFzdF9ibGsgPSAqYmxvY2tucjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIGxhc3RfYmxrLCAwLCAmbmV3X2Jsayk7CisJaWYgKHJldHZhbCkgeworCQllcy0+ZXJyID0gcmV0dmFsOworCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJfQorCWlmIChibG9ja2NudCA+IDApIHsKKwkJcmV0dmFsID0gZXh0MmZzX25ld19kaXJfYmxvY2soZnMsIDAsIDAsICZibG9jayk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWVzLT5lcnIgPSByZXR2YWw7CisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwkJZXMtPmRvbmUgPSAxOworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGZzLCBuZXdfYmxrLCBibG9jayk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJsb2NrKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZXMtPmVyciA9IHJldHZhbDsKKwkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJfQorCQltZW1zZXQoYmxvY2ssIDAsIGZzLT5ibG9ja3NpemUpOworCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIG5ld19ibGssIDEsIGJsb2NrKTsKKwl9CisJaWYgKHJldHZhbCkgeworCQllcy0+ZXJyID0gcmV0dmFsOworCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJfQorCWV4dDJmc19mcmVlX21lbSgmYmxvY2spOworCSpibG9ja25yID0gbmV3X2JsazsKKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIG5ld19ibGssICsxKTsKKwllcy0+bmV3YmxvY2tzKys7CisKKwlpZiAoZXMtPmRvbmUpCisJCXJldHVybiAoQkxPQ0tfQ0hBTkdFRCB8IEJMT0NLX0FCT1JUKTsKKwllbHNlCisJCXJldHVybiBCTE9DS19DSEFOR0VEOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2V4cGFuZF9kaXIoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgZGlyKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJc3RydWN0IGV4cGFuZF9kaXJfc3RydWN0IGVzOworCXN0cnVjdCBleHQyX2lub2RlCWlub2RlOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICghKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykpCisJCXJldHVybiBFWFQyX0VUX1JPX0ZJTFNZUzsKKworCWlmICghZnMtPmJsb2NrX21hcCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fQkxPQ0tfQklUTUFQOworCisJcmV0dmFsID0gZXh0MmZzX2NoZWNrX2RpcmVjdG9yeShmcywgZGlyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJZXMuZG9uZSA9IDA7CisJZXMuZXJyID0gMDsKKwllcy5uZXdibG9ja3MgPSAwOworCisJcmV0dmFsID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBkaXIsIEJMT0NLX0ZMQUdfQVBQRU5ELAorCQkJCSAgICAgICAwLCBleHBhbmRfZGlyX3Byb2MsICZlcyk7CisKKwlpZiAoZXMuZXJyKQorCQlyZXR1cm4gZXMuZXJyOworCWlmICghZXMuZG9uZSkKKwkJcmV0dXJuIEVYVDJfRVRfRVhQQU5EX0RJUl9FUlI7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgc2l6ZSBhbmQgYmxvY2sgY291bnQgZmllbGRzIGluIHRoZSBpbm9kZS4KKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgZGlyLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpbm9kZS5pX3NpemUgKz0gZnMtPmJsb2Nrc2l6ZTsKKwlpbm9kZS5pX2Jsb2NrcyArPSAoZnMtPmJsb2Nrc2l6ZSAvIDUxMikgKiBlcy5uZXdibG9ja3M7CisKKwlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIGRpciwgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9lcnIuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX2Vyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDM1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9lcnIuaApAQCAtMCwwICsxLDExNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZXh0Ml9lcnIuaDoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LgorICovCisKKyNkZWZpbmUgRVhUMl9FVF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTMyOEwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyAgICAgICAgICAgICAgKDIxMzM1NzEzMjlMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0JBREJMT0NLU19MSVNUICAgICAgICAgICAgICgyMTMzNTcxMzMwTCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfSVRFUkFURSAgICAgICAgICAoMjEzMzU3MTMzMUwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfSU5PREVfU0NBTiAgICAgICAgICAgICAgICAgKDIxMzM1NzEzMzJMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwgICAgICAgICAgICAgICAgICgyMTMzNTcxMzMzTCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19VTklYX0lPX0NIQU5ORUwgICAgICAgICAgICAoMjEzMzU3MTMzNEwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfSU9fTUFOQUdFUiAgICAgICAgICAgICAgICAgKDIxMzM1NzEzMzVMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0JMT0NLX0JJVE1BUCAgICAgICAgICAgICAgICgyMTMzNTcxMzM2TCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19JTk9ERV9CSVRNQVAgICAgICAgICAgICAgICAoMjEzMzU3MTMzN0wpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfR0VORVJJQ19CSVRNQVAgICAgICAgICAgICAgKDIxMzM1NzEzMzhMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX1RFU1RfSU9fQ0hBTk5FTCAgICAgICAgICAgICgyMTMzNTcxMzM5TCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19EQkxJU1QgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM0MEwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfSUNPVU5UICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNDFMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX1BRX0lPX0NIQU5ORUwgICAgICAgICAgICAgICgyMTMzNTcxMzQyTCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19FWFQyX0ZJTEUgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM0M0wpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfRTJJTUFHRSAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNDRMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0lOT0RFX0lPX0NIQU5ORUwgICAgICAgICAgICgyMTMzNTcxMzQ1TCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19SRVNFUlZFRF85ICAgICAgICAgICAgICAgICAoMjEzMzU3MTM0NkwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX01BR0lDICAgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNDdMKQorI2RlZmluZSBFWFQyX0VUX1JFVl9UT09fSElHSCAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzQ4TCkKKyNkZWZpbmUgRVhUMl9FVF9ST19GSUxTWVMgICAgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM0OUwpCisjZGVmaW5lIEVYVDJfRVRfR0RFU0NfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNTBMKQorI2RlZmluZSBFWFQyX0VUX0dERVNDX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzUxTCkKKyNkZWZpbmUgRVhUMl9FVF9HREVTQ19CQURfQkxPQ0tfTUFQICAgICAgICAgICAgICAoMjEzMzU3MTM1MkwpCisjZGVmaW5lIEVYVDJfRVRfR0RFU0NfQkFEX0lOT0RFX01BUCAgICAgICAgICAgICAgKDIxMzM1NzEzNTNMKQorI2RlZmluZSBFWFQyX0VUX0dERVNDX0JBRF9JTk9ERV9UQUJMRSAgICAgICAgICAgICgyMTMzNTcxMzU0TCkKKyNkZWZpbmUgRVhUMl9FVF9JTk9ERV9CSVRNQVBfV1JJVEUgICAgICAgICAgICAgICAoMjEzMzU3MTM1NUwpCisjZGVmaW5lIEVYVDJfRVRfSU5PREVfQklUTUFQX1JFQUQgICAgICAgICAgICAgICAgKDIxMzM1NzEzNTZMKQorI2RlZmluZSBFWFQyX0VUX0JMT0NLX0JJVE1BUF9XUklURSAgICAgICAgICAgICAgICgyMTMzNTcxMzU3TCkKKyNkZWZpbmUgRVhUMl9FVF9CTE9DS19CSVRNQVBfUkVBRCAgICAgICAgICAgICAgICAoMjEzMzU3MTM1OEwpCisjZGVmaW5lIEVYVDJfRVRfSU5PREVfVEFCTEVfV1JJVEUgICAgICAgICAgICAgICAgKDIxMzM1NzEzNTlMKQorI2RlZmluZSBFWFQyX0VUX0lOT0RFX1RBQkxFX1JFQUQgICAgICAgICAgICAgICAgICgyMTMzNTcxMzYwTCkKKyNkZWZpbmUgRVhUMl9FVF9ORVhUX0lOT0RFX1JFQUQgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM2MUwpCisjZGVmaW5lIEVYVDJfRVRfVU5FWFBFQ1RFRF9CTE9DS19TSVpFICAgICAgICAgICAgKDIxMzM1NzEzNjJMKQorI2RlZmluZSBFWFQyX0VUX0RJUl9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzYzTCkKKyNkZWZpbmUgRVhUMl9FVF9TSE9SVF9SRUFEICAgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM2NEwpCisjZGVmaW5lIEVYVDJfRVRfU0hPUlRfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNjVMKQorI2RlZmluZSBFWFQyX0VUX0RJUl9OT19TUEFDRSAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzY2TCkKKyNkZWZpbmUgRVhUMl9FVF9OT19JTk9ERV9CSVRNQVAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM2N0wpCisjZGVmaW5lIEVYVDJfRVRfTk9fQkxPQ0tfQklUTUFQICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNjhMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9JTk9ERV9OVU0gICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzY5TCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfQkxPQ0tfTlVNICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM3MEwpCisjZGVmaW5lIEVYVDJfRVRfRVhQQU5EX0RJUl9FUlIgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNzFMKQorI2RlZmluZSBFWFQyX0VUX1RPT1NNQUxMICAgICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzcyTCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfQkxPQ0tfTUFSSyAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM3M0wpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0JMT0NLX1VOTUFSSyAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNzRMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9CTE9DS19URVNUICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzc1TCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfSU5PREVfTUFSSyAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM3NkwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0lOT0RFX1VOTUFSSyAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNzdMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9JTk9ERV9URVNUICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzc4TCkKKyNkZWZpbmUgRVhUMl9FVF9GVURHRV9CTE9DS19CSVRNQVBfRU5EICAgICAgICAgICAoMjEzMzU3MTM3OUwpCisjZGVmaW5lIEVYVDJfRVRfRlVER0VfSU5PREVfQklUTUFQX0VORCAgICAgICAgICAgKDIxMzM1NzEzODBMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9JTkRfQkxPQ0sgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzgxTCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfRElORF9CTE9DSyAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM4MkwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX1RJTkRfQkxPQ0sgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzODNMKQorI2RlZmluZSBFWFQyX0VUX05FUV9CTE9DS19CSVRNQVAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzg0TCkKKyNkZWZpbmUgRVhUMl9FVF9ORVFfSU5PREVfQklUTUFQICAgICAgICAgICAgICAgICAoMjEzMzU3MTM4NUwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0RFVklDRV9OQU1FICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzODZMKQorI2RlZmluZSBFWFQyX0VUX01JU1NJTkdfSU5PREVfVEFCTEUgICAgICAgICAgICAgICgyMTMzNTcxMzg3TCkKKyNkZWZpbmUgRVhUMl9FVF9DT1JSVVBUX1NVUEVSQkxPQ0sgICAgICAgICAgICAgICAoMjEzMzU3MTM4OEwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0dFTkVSSUNfTUFSSyAgICAgICAgICAgICAgICAgKDIxMzM1NzEzODlMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9HRU5FUklDX1VOTUFSSyAgICAgICAgICAgICAgICgyMTMzNTcxMzkwTCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfR0VORVJJQ19URVNUICAgICAgICAgICAgICAgICAoMjEzMzU3MTM5MUwpCisjZGVmaW5lIEVYVDJfRVRfU1lNTElOS19MT09QICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzOTJMKQorI2RlZmluZSBFWFQyX0VUX0NBTExCQUNLX05PVEhBTkRMRUQgICAgICAgICAgICAgICgyMTMzNTcxMzkzTCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfQkxPQ0tfSU5fSU5PREVfVEFCTEUgICAgICAgICAoMjEzMzU3MTM5NEwpCisjZGVmaW5lIEVYVDJfRVRfVU5TVVBQX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzOTVMKQorI2RlZmluZSBFWFQyX0VUX1JPX1VOU1VQUF9GRUFUVVJFICAgICAgICAgICAgICAgICgyMTMzNTcxMzk2TCkKKyNkZWZpbmUgRVhUMl9FVF9MTFNFRUtfRkFJTEVEICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM5N0wpCisjZGVmaW5lIEVYVDJfRVRfTk9fTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzOThMKQorI2RlZmluZSBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQgICAgICAgICAgICAgICAgICgyMTMzNTcxMzk5TCkKKyNkZWZpbmUgRVhUMl9FVF9CTE9DS19BTExPQ19GQUlMICAgICAgICAgICAgICAgICAoMjEzMzU3MTQwMEwpCisjZGVmaW5lIEVYVDJfRVRfSU5PREVfQUxMT0NfRkFJTCAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MDFMKQorI2RlZmluZSBFWFQyX0VUX05PX0RJUkVDVE9SWSAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDAyTCkKKyNkZWZpbmUgRVhUMl9FVF9UT09fTUFOWV9SRUZTICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQwM0wpCisjZGVmaW5lIEVYVDJfRVRfRklMRV9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MDRMKQorI2RlZmluZSBFWFQyX0VUX0ZJTEVfUk8gICAgICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDA1TCkKKyNkZWZpbmUgRVhUMl9FVF9EQl9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQwNkwpCisjZGVmaW5lIEVYVDJfRVRfRElSX0VYSVNUUyAgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MDdMKQorI2RlZmluZSBFWFQyX0VUX1VOSU1QTEVNRU5URUQgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDA4TCkKKyNkZWZpbmUgRVhUMl9FVF9DQU5DRUxfUkVRVUVTVEVEICAgICAgICAgICAgICAgICAoMjEzMzU3MTQwOUwpCisjZGVmaW5lIEVYVDJfRVRfRklMRV9UT09fQklHICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MTBMKQorI2RlZmluZSBFWFQyX0VUX0pPVVJOQUxfTk9UX0JMT0NLICAgICAgICAgICAgICAgICgyMTMzNTcxNDExTCkKKyNkZWZpbmUgRVhUMl9FVF9OT19KT1VSTkFMX1NCICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQxMkwpCisjZGVmaW5lIEVYVDJfRVRfSk9VUk5BTF9UT09fU01BTEwgICAgICAgICAgICAgICAgKDIxMzM1NzE0MTNMKQorI2RlZmluZSBFWFQyX0VUX0pPVVJOQUxfVU5TVVBQX1ZFUlNJT04gICAgICAgICAgICgyMTMzNTcxNDE0TCkKKyNkZWZpbmUgRVhUMl9FVF9MT0FEX0VYVF9KT1VSTkFMICAgICAgICAgICAgICAgICAoMjEzMzU3MTQxNUwpCisjZGVmaW5lIEVYVDJfRVRfTk9fSk9VUk5BTCAgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MTZMKQorI2RlZmluZSBFWFQyX0VUX0RJUkhBU0hfVU5TVVBQICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDE3TCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfRUFfQkxPQ0tfTlVNICAgICAgICAgICAgICAgICAoMjEzMzU3MTQxOEwpCisjZGVmaW5lIEVYVDJfRVRfVE9PX01BTllfSU5PREVTICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MTlMKQorI2RlZmluZSBFWFQyX0VUX05PVF9JTUFHRV9GSUxFICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDIwTCkKKyNkZWZpbmUgRVhUMl9FVF9SRVNfR0RUX0JMT0NLUyAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQyMUwpCisjZGVmaW5lIEVYVDJfRVRfUkVTSVpFX0lOT0RFX0NPUlJVUFQgICAgICAgICAgICAgKDIxMzM1NzE0MjJMKQorI2RlZmluZSBFWFQyX0VUX1NFVF9CTUFQX05PX0lORCAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDIzTCkKKworI2lmIDAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgZXRfZXh0Ml9lcnJvcl90YWJsZTsKK2V4dGVybiB2b2lkIGluaXRpYWxpemVfZXh0Ml9lcnJvcl90YWJsZSh2b2lkKTsKKworLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBIZWltZGFsICovCitleHRlcm4gdm9pZCBpbml0aWFsaXplX2V4dDJfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QpOworCisjZGVmaW5lIEVSUk9SX1RBQkxFX0JBU0VfZXh0MiAoMjEzMzU3MTMyOEwpCisKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMuLi4gKi8KKyNkZWZpbmUgaW5pdF9leHQyX2Vycl90YmwgaW5pdGlhbGl6ZV9leHQyX2Vycm9yX3RhYmxlCisjZGVmaW5lIGV4dDJfZXJyX2Jhc2UgRVJST1JfVEFCTEVfQkFTRV9leHQyCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX2V4dF9hdHRyLmggYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9leHRfYXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzA5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9leHRfYXR0ci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAgRmlsZTogbGludXgvZXh0Ml9leHRfYXR0ci5oCisKKyAgT24tZGlzayBmb3JtYXQgb2YgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgdGhlIGV4dDIgZmlsZXN5c3RlbS4KKworICAoQykgMjAwMCBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisqLworCisvKiBNYWdpYyB2YWx1ZSBpbiBhdHRyaWJ1dGUgYmxvY2tzICovCisjZGVmaW5lIEVYVDJfRVhUX0FUVFJfTUFHSUNfdjEJCTB4RUEwMTAwMDAKKyNkZWZpbmUgRVhUMl9FWFRfQVRUUl9NQUdJQwkJMHhFQTAyMDAwMAorCisvKiBNYXhpbXVtIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIG9uZSBhdHRyaWJ1dGUgYmxvY2sgKi8KKyNkZWZpbmUgRVhUMl9FWFRfQVRUUl9SRUZDT1VOVF9NQVgJMTAyNAorCitzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9oZWFkZXIgeworCV9fdTMyCWhfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KKwlfX3UzMgloX3JlZmNvdW50OwkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlfX3UzMgloX2Jsb2NrczsJLyogbnVtYmVyIG9mIGRpc2sgYmxvY2tzIHVzZWQgKi8KKwlfX3UzMgloX2hhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIGFsbCBhdHRyaWJ1dGVzICovCisJX191MzIJaF9yZXNlcnZlZFs0XTsJLyogemVybyByaWdodCBub3cgKi8KK307CisKK3N0cnVjdCBleHQyX2V4dF9hdHRyX2VudHJ5IHsKKwlfX3U4CWVfbmFtZV9sZW47CS8qIGxlbmd0aCBvZiBuYW1lICovCisJX191OAllX25hbWVfaW5kZXg7CS8qIGF0dHJpYnV0ZSBuYW1lIGluZGV4ICovCisJX191MTYJZV92YWx1ZV9vZmZzOwkvKiBvZmZzZXQgaW4gZGlzayBibG9jayBvZiB2YWx1ZSAqLworCV9fdTMyCWVfdmFsdWVfYmxvY2s7CS8qIGRpc2sgYmxvY2sgYXR0cmlidXRlIGlzIHN0b3JlZCBvbiAobi9pKSAqLworCV9fdTMyCWVfdmFsdWVfc2l6ZTsJLyogc2l6ZSBvZiBhdHRyaWJ1dGUgdmFsdWUgKi8KKwlfX3UzMgllX2hhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgYW5kIHZhbHVlICovCit9OworCisjZGVmaW5lIEVYVDJfRVhUX0FUVFJfUEFEX0JJVFMJCTIKKyNkZWZpbmUgRVhUMl9FWFRfQVRUUl9QQUQJCSgxPDxFWFQyX0VYVF9BVFRSX1BBRF9CSVRTKQorI2RlZmluZSBFWFQyX0VYVF9BVFRSX1JPVU5ECQkoRVhUMl9FWFRfQVRUUl9QQUQtMSkKKyNkZWZpbmUgRVhUMl9FWFRfQVRUUl9MRU4obmFtZV9sZW4pIFwKKwkoKChuYW1lX2xlbikgKyBFWFQyX0VYVF9BVFRSX1JPVU5EICsgXAorCXNpemVvZihzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSkpICYgfkVYVDJfRVhUX0FUVFJfUk9VTkQpCisjZGVmaW5lIEVYVDJfRVhUX0FUVFJfTkVYVChlbnRyeSkgXAorCSggKHN0cnVjdCBleHQyX2V4dF9hdHRyX2VudHJ5ICopKCBcCisJICAoY2hhciAqKShlbnRyeSkgKyBFWFQyX0VYVF9BVFRSX0xFTigoZW50cnkpLT5lX25hbWVfbGVuKSkgKQorI2RlZmluZSBFWFQyX0VYVF9BVFRSX1NJWkUoc2l6ZSkgXAorCSgoKHNpemUpICsgRVhUMl9FWFRfQVRUUl9ST1VORCkgJiB+RVhUMl9FWFRfQVRUUl9ST1VORCkKKyNkZWZpbmUgRVhUMl9FWFRfSVNfTEFTVF9FTlRSWShlbnRyeSkgKCooKF9fdTMyICopKGVudHJ5KSkgPT0gMFVMKQorI2RlZmluZSBFWFQyX0VYVF9BVFRSX05BTUUoZW50cnkpIFwKKwkoKChjaGFyICopIChlbnRyeSkpICsgc2l6ZW9mKHN0cnVjdCBleHQyX2V4dF9hdHRyX2VudHJ5KSkKKyNkZWZpbmUgRVhUMl9YQVRUUl9MRU4obmFtZV9sZW4pIFwKKwkoKChuYW1lX2xlbikgKyBFWFQyX0VYVF9BVFRSX1JPVU5EICsgXAorCXNpemVvZihzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSkpICYgfkVYVDJfRVhUX0FUVFJfUk9VTkQpCisjZGVmaW5lIEVYVDJfWEFUVFJfU0laRShzaXplKSBcCisJKCgoc2l6ZSkgKyBFWFQyX0VYVF9BVFRSX1JPVU5EKSAmIH5FWFQyX0VYVF9BVFRSX1JPVU5EKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfZnMuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0ZjcwOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX2ZzLmgKQEAgLTAsMCArMSw1NjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L21pbml4X2ZzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisjaWZuZGVmIExJTlVYX0VYVDJfRlNfSAorI2RlZmluZSBMSU5VWF9FWFQyX0ZTX0ggMQorCisjaW5jbHVkZSAiZXh0Ml90eXBlcy5oIgkJLyogQ2hhbmdlZCBmcm9tIGxpbnV4L3R5cGVzLmggKi8KKworLyoKKyAqIFNwZWNpYWwgaW5vZGUgbnVtYmVycworICovCisjZGVmaW5lIEVYVDJfQkFEX0lOTwkJIDEJLyogQmFkIGJsb2NrcyBpbm9kZSAqLworI2RlZmluZSBFWFQyX1JPT1RfSU5PCQkgMgkvKiBSb290IGlub2RlICovCisjZGVmaW5lIEVYVDJfQUNMX0lEWF9JTk8JIDMJLyogQUNMIGlub2RlICovCisjZGVmaW5lIEVYVDJfQUNMX0RBVEFfSU5PCSA0CS8qIEFDTCBpbm9kZSAqLworI2RlZmluZSBFWFQyX0JPT1RfTE9BREVSX0lOTwkgNQkvKiBCb290IGxvYWRlciBpbm9kZSAqLworI2RlZmluZSBFWFQyX1VOREVMX0RJUl9JTk8JIDYJLyogVW5kZWxldGUgZGlyZWN0b3J5IGlub2RlICovCisjZGVmaW5lIEVYVDJfUkVTSVpFX0lOTwkJIDcJLyogUmVzZXJ2ZWQgZ3JvdXAgZGVzY3JpcHRvcnMgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9KT1VSTkFMX0lOTwkgOAkvKiBKb3VybmFsIGlub2RlICovCisKKy8qIEZpcnN0IG5vbi1yZXNlcnZlZCBpbm9kZSBmb3Igb2xkIGV4dDIgZmlsZXN5c3RlbXMgKi8KKyNkZWZpbmUgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8JMTEKKworLyoKKyAqIFRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0gbWFnaWMgbnVtYmVyCisgKi8KKyNkZWZpbmUgRVhUMl9TVVBFUl9NQUdJQwkweEVGNTMKKworLyogQXNzdW1lIHRoYXQgdXNlciBtb2RlIHByb2dyYW1zIGFyZSBwYXNzaW5nIGluIGFuIGV4dDJmcyBzdXBlcmJsb2NrLCBub3QKKyAqIGEga2VybmVsIHN0cnVjdCBzdXBlcl9ibG9jay4gIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBjYWxsIHRoZSBmZWF0dXJlLXRlc3QKKyAqIG1hY3JvcyBmcm9tIHVzZXIgbGFuZC4gKi8KKyNkZWZpbmUgRVhUMl9TQihzYikJKHNiKQorCisvKgorICogTWF4aW1hbCBjb3VudCBvZiBsaW5rcyB0byBhIGZpbGUKKyAqLworI2RlZmluZSBFWFQyX0xJTktfTUFYCQkzMjAwMAorCisvKgorICogTWFjcm8taW5zdHJ1Y3Rpb25zIHVzZWQgdG8gbWFuYWdlIHNldmVyYWwgYmxvY2sgc2l6ZXMKKyAqLworI2RlZmluZSBFWFQyX01JTl9CTE9DS19MT0dfU0laRQkJMTAJLyogMTAyNCAqLworI2RlZmluZSBFWFQyX01BWF9CTE9DS19MT0dfU0laRQkJMTYJLyogNjU1MzYgKi8KKyNkZWZpbmUgRVhUMl9NSU5fQkxPQ0tfU0laRQkoMSA8PCBFWFQyX01JTl9CTE9DS19MT0dfU0laRSkKKyNkZWZpbmUgRVhUMl9NQVhfQkxPQ0tfU0laRQkoMSA8PCBFWFQyX01BWF9CTE9DS19MT0dfU0laRSkKKyNkZWZpbmUgRVhUMl9CTE9DS19TSVpFKHMpCShFWFQyX01JTl9CTE9DS19TSVpFIDw8IChzKS0+c19sb2dfYmxvY2tfc2l6ZSkKKyNkZWZpbmUgRVhUMl9CTE9DS19TSVpFX0JJVFMocykJKChzKS0+c19sb2dfYmxvY2tfc2l6ZSArIDEwKQorI2RlZmluZSBFWFQyX0lOT0RFX1NJWkUocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDogKHMpLT5zX2lub2RlX3NpemUpCisjZGVmaW5lIEVYVDJfRklSU1RfSU5PKHMpCSgoKHMpLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFVikgPyBcCisJCQkJIEVYVDJfR09PRF9PTERfRklSU1RfSU5PIDogKHMpLT5zX2ZpcnN0X2lubykKKyNkZWZpbmUgRVhUMl9BRERSX1BFUl9CTE9DSyhzKQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gc2l6ZW9mKF9fdTMyKSkKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBmcmFnbWVudHMKKyAqLworI2RlZmluZSBFWFQyX01JTl9GUkFHX1NJWkUJCUVYVDJfTUlOX0JMT0NLX1NJWkUKKyNkZWZpbmUgRVhUMl9NQVhfRlJBR19TSVpFCQlFWFQyX01BWF9CTE9DS19TSVpFCisjZGVmaW5lIEVYVDJfTUlOX0ZSQUdfTE9HX1NJWkUJCUVYVDJfTUlOX0JMT0NLX0xPR19TSVpFCisjIGRlZmluZSBFWFQyX0ZSQUdfU0laRShzKQkJKEVYVDJfTUlOX0ZSQUdfU0laRSA8PCAocyktPnNfbG9nX2ZyYWdfc2l6ZSkKKyMgZGVmaW5lIEVYVDJfRlJBR1NfUEVSX0JMT0NLKHMpCShFWFQyX0JMT0NLX1NJWkUocykgLyBFWFQyX0ZSQUdfU0laRShzKSkKKworLyoKKyAqIEFDTCBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBleHQyX2FjbF9oZWFkZXIJLyogSGVhZGVyIG9mIEFjY2VzcyBDb250cm9sIExpc3RzICovCit7CisJX191MzIJYWNsaF9zaXplOworCV9fdTMyCWFjbGhfZmlsZV9jb3VudDsKKwlfX3UzMglhY2xoX2FjbGVfY291bnQ7CisJX191MzIJYWNsaF9maXJzdF9hY2xlOworfTsKKworc3RydWN0IGV4dDJfYWNsX2VudHJ5CS8qIEFjY2VzcyBDb250cm9sIExpc3QgRW50cnkgKi8KK3sKKwlfX3UzMglhY2xlX3NpemU7CisJX191MTYJYWNsZV9wZXJtczsJLyogQWNjZXNzIHBlcm1pc3Npb25zICovCisJX191MTYJYWNsZV90eXBlOwkvKiBUeXBlIG9mIGVudHJ5ICovCisJX191MTYJYWNsZV90YWc7CS8qIFVzZXIgb3IgZ3JvdXAgaWRlbnRpdHkgKi8KKwlfX3UxNglhY2xlX3BhZDE7CisJX191MzIJYWNsZV9uZXh0OwkvKiBQb2ludGVyIG9uIG5leHQgZW50cnkgZm9yIHRoZSAqLworCQkJCQkvKiBzYW1lIGlub2RlIG9yIG9uIG5leHQgZnJlZSBlbnRyeSAqLworfTsKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGJsb2NrcyBncm91cCBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBleHQyX2dyb3VwX2Rlc2MKK3sKKwlfX3UzMgliZ19ibG9ja19iaXRtYXA7CQkvKiBCbG9ja3MgYml0bWFwIGJsb2NrICovCisJX191MzIJYmdfaW5vZGVfYml0bWFwOwkJLyogSW5vZGVzIGJpdG1hcCBibG9jayAqLworCV9fdTMyCWJnX2lub2RlX3RhYmxlOwkJLyogSW5vZGVzIHRhYmxlIGJsb2NrICovCisJX191MTYJYmdfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJX191MTYJYmdfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX191MTYJYmdfdXNlZF9kaXJzX2NvdW50OwkvKiBEaXJlY3RvcmllcyBjb3VudCAqLworCV9fdTE2CWJnX3BhZDsKKwlfX3UzMgliZ19yZXNlcnZlZFszXTsKK307CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgZGlyZWN0b3J5IGluZGV4aW5nIGZlYXR1cmUKKyAqCisgKiBOb3RlOiBhbGwgb2YgdGhlIG11bHRpYnl0ZSBpbnRlZ2VyIGZpZWxkcyBhcmUgbGl0dGxlIGVuZGlhbi4KKyAqLworCisvKgorICogTm90ZTogZHhfcm9vdF9pbmZvIGlzIGxhaWQgb3V0IHNvIHRoYXQgaWYgaXQgc2hvdWxkIHNvbWVob3cgZ2V0CisgKiBvdmVybGFpZCBieSBhIGRpcmVudCB0aGUgdHdvIGxvdyBiaXRzIG9mIHRoZSBoYXNoIHZlcnNpb24gd2lsbCBiZQorICogemVyby4gIFRoZXJlZm9yZSwgdGhlIGhhc2ggdmVyc2lvbiBtb2QgNCBzaG91bGQgbmV2ZXIgYmUgMC4KKyAqIFNpbmNlcmVseSwgdGhlIHBhcmFub2lhIGRlcGFydG1lbnQuCisgKi8KK3N0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyB7CisJX191MzIgcmVzZXJ2ZWRfemVybzsKKwlfX3U4IGhhc2hfdmVyc2lvbjsgLyogMCBub3csIDEgYXQgcmVsZWFzZSAqLworCV9fdTggaW5mb19sZW5ndGg7IC8qIDggKi8KKwlfX3U4IGluZGlyZWN0X2xldmVsczsKKwlfX3U4IHVudXNlZF9mbGFnczsKK307CisKKyNkZWZpbmUgRVhUMl9IQVNIX0xFR0FDWQkwCisjZGVmaW5lIEVYVDJfSEFTSF9IQUxGX01ENAkxCisjZGVmaW5lIEVYVDJfSEFTSF9URUEJCTIKKworI2RlZmluZSBFWFQyX0hBU0hfRkxBR19JTkNPTVBBVAkweDEKKworc3RydWN0IGV4dDJfZHhfZW50cnkgeworCV9fdTMyIGhhc2g7CisJX191MzIgYmxvY2s7Cit9OworCitzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0IHsKKwlfX3UxNiBsaW1pdDsKKwlfX3UxNiBjb3VudDsKK307CisKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBncm91cCBkZXNjcmlwdG9ycworICovCisjZGVmaW5lIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzKQkoRVhUMl9TQihzKS0+c19ibG9ja3NfcGVyX2dyb3VwKQorI2RlZmluZSBFWFQyX0lOT0RFU19QRVJfR1JPVVAocykJKEVYVDJfU0IocyktPnNfaW5vZGVzX3Blcl9ncm91cCkKKyNkZWZpbmUgRVhUMl9JTk9ERVNfUEVSX0JMT0NLKHMpCShFWFQyX0JMT0NLX1NJWkUocykvRVhUMl9JTk9ERV9TSVpFKHMpKQorLyogbGltaXRzIGltcG9zZWQgYnkgMTYtYml0IHZhbHVlIGdkX2ZyZWVfe2Jsb2Nrcyxpbm9kZX1fY291bnQgKi8KKyNkZWZpbmUgRVhUMl9NQVhfQkxPQ0tTX1BFUl9HUk9VUChzKQkoKDEgPDwgMTYpIC0gOCkKKyNkZWZpbmUgRVhUMl9NQVhfSU5PREVTX1BFUl9HUk9VUChzKQkoKDEgPDwgMTYpIC0gRVhUMl9JTk9ERVNfUEVSX0JMT0NLKHMpKQorI2RlZmluZSBFWFQyX0RFU0NfUEVSX0JMT0NLKHMpCQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKSkKKworLyoKKyAqIENvbnN0YW50cyByZWxhdGl2ZSB0byB0aGUgZGF0YSBibG9ja3MKKyAqLworI2RlZmluZSBFWFQyX05ESVJfQkxPQ0tTCQkxMgorI2RlZmluZSBFWFQyX0lORF9CTE9DSwkJCUVYVDJfTkRJUl9CTE9DS1MKKyNkZWZpbmUgRVhUMl9ESU5EX0JMT0NLCQkJKEVYVDJfSU5EX0JMT0NLICsgMSkKKyNkZWZpbmUgRVhUMl9USU5EX0JMT0NLCQkJKEVYVDJfRElORF9CTE9DSyArIDEpCisjZGVmaW5lIEVYVDJfTl9CTE9DS1MJCQkoRVhUMl9USU5EX0JMT0NLICsgMSkKKworLyoKKyAqIElub2RlIGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9TRUNSTV9GTAkJCTB4MDAwMDAwMDEgLyogU2VjdXJlIGRlbGV0aW9uICovCisjZGVmaW5lIEVYVDJfVU5STV9GTAkJCTB4MDAwMDAwMDIgLyogVW5kZWxldGUgKi8KKyNkZWZpbmUgRVhUMl9DT01QUl9GTAkJCTB4MDAwMDAwMDQgLyogQ29tcHJlc3MgZmlsZSAqLworI2RlZmluZSBFWFQyX1NZTkNfRkwJCQkweDAwMDAwMDA4IC8qIFN5bmNocm9ub3VzIHVwZGF0ZXMgKi8KKyNkZWZpbmUgRVhUMl9JTU1VVEFCTEVfRkwJCTB4MDAwMDAwMTAgLyogSW1tdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9BUFBFTkRfRkwJCQkweDAwMDAwMDIwIC8qIHdyaXRlcyB0byBmaWxlIG1heSBvbmx5IGFwcGVuZCAqLworI2RlZmluZSBFWFQyX05PRFVNUF9GTAkJCTB4MDAwMDAwNDAgLyogZG8gbm90IGR1bXAgZmlsZSAqLworI2RlZmluZSBFWFQyX05PQVRJTUVfRkwJCQkweDAwMDAwMDgwIC8qIGRvIG5vdCB1cGRhdGUgYXRpbWUgKi8KKy8qIFJlc2VydmVkIGZvciBjb21wcmVzc2lvbiB1c2FnZS4uLiAqLworI2RlZmluZSBFWFQyX0RJUlRZX0ZMCQkJMHgwMDAwMDEwMAorI2RlZmluZSBFWFQyX0NPTVBSQkxLX0ZMCQkweDAwMDAwMjAwIC8qIE9uZSBvciBtb3JlIGNvbXByZXNzZWQgY2x1c3RlcnMgKi8KKyNkZWZpbmUgRVhUMl9OT0NPTVBSX0ZMCQkJMHgwMDAwMDQwMCAvKiBBY2Nlc3MgcmF3IGNvbXByZXNzZWQgZGF0YSAqLworI2RlZmluZSBFWFQyX0VDT01QUl9GTAkJCTB4MDAwMDA4MDAgLyogQ29tcHJlc3Npb24gZXJyb3IgKi8KKy8qIEVuZCBjb21wcmVzc2lvbiBmbGFncyAtLS0gbWF5YmUgbm90IGFsbCB1c2VkICovCisjZGVmaW5lIEVYVDJfQlRSRUVfRkwJCQkweDAwMDAxMDAwIC8qIGJ0cmVlIGZvcm1hdCBkaXIgKi8KKyNkZWZpbmUgRVhUMl9JTkRFWF9GTAkJCTB4MDAwMDEwMDAgLyogaGFzaC1pbmRleGVkIGRpcmVjdG9yeSAqLworI2RlZmluZSBFWFQyX0lNQUdJQ19GTAkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRVhUM19KT1VSTkFMX0RBVEFfRkwJCTB4MDAwMDQwMDAgLyogZmlsZSBkYXRhIHNob3VsZCBiZSBqb3VybmFsZWQgKi8KKyNkZWZpbmUgRVhUMl9OT1RBSUxfRkwJCQkweDAwMDA4MDAwIC8qIGZpbGUgdGFpbCBzaG91bGQgbm90IGJlIG1lcmdlZCAqLworI2RlZmluZSBFWFQyX0RJUlNZTkNfRkwJCQkweDAwMDEwMDAwIC8qIFN5bmNocm9ub3VzIGRpcmVjdG9yeSBtb2RpZmljYXRpb25zICovCisjZGVmaW5lIEVYVDJfVE9QRElSX0ZMCQkJMHgwMDAyMDAwMCAvKiBUb3Agb2YgZGlyZWN0b3J5IGhpZXJhcmNoaWVzKi8KKyNkZWZpbmUgRVhUM19FWFRFTlRTX0ZMCQkJMHgwMDA4MDAwMCAvKiBJbm9kZSB1c2VzIGV4dGVudHMgKi8KKyNkZWZpbmUgRVhUMl9SRVNFUlZFRF9GTAkJMHg4MDAwMDAwMCAvKiByZXNlcnZlZCBmb3IgZXh0MiBsaWIgKi8KKworI2RlZmluZSBFWFQyX0ZMX1VTRVJfVklTSUJMRQkJMHgwMDAzREZGRiAvKiBVc2VyIHZpc2libGUgZmxhZ3MgKi8KKyNkZWZpbmUgRVhUMl9GTF9VU0VSX01PRElGSUFCTEUJCTB4MDAwMDgwRkYgLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcworICovCisjZGVmaW5lIEVYVDJfSU9DX0dFVEZMQUdTCQlfSU9SKCdmJywgMSwgbG9uZykKKyNkZWZpbmUgRVhUMl9JT0NfU0VURkxBR1MJCV9JT1coJ2YnLCAyLCBsb25nKQorI2RlZmluZSBFWFQyX0lPQ19HRVRWRVJTSU9OCQlfSU9SKCd2JywgMSwgbG9uZykKKyNkZWZpbmUgRVhUMl9JT0NfU0VUVkVSU0lPTgkJX0lPVygndicsIDIsIGxvbmcpCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYW4gaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDJfaW5vZGUgeworCV9fdTE2CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCV9fdTE2CWlfdWlkOwkJLyogTG93IDE2IGJpdHMgb2YgT3duZXIgVWlkICovCisJX191MzIJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCV9fdTMyCWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJX191MzIJaV9jdGltZTsJLyogQ3JlYXRpb24gdGltZSAqLworCV9fdTMyCWlfbXRpbWU7CS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisJX191MzIJaV9kdGltZTsJLyogRGVsZXRpb24gVGltZSAqLworCV9fdTE2CWlfZ2lkOwkJLyogTG93IDE2IGJpdHMgb2YgR3JvdXAgSWQgKi8KKwlfX3UxNglpX2xpbmtzX2NvdW50OwkvKiBMaW5rcyBjb3VudCAqLworCV9fdTMyCWlfYmxvY2tzOwkvKiBCbG9ja3MgY291bnQgKi8KKwlfX3UzMglpX2ZsYWdzOwkvKiBGaWxlIGZsYWdzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MzIgIGxfaV9yZXNlcnZlZDE7CisJCX0gbGludXgxOworCQlzdHJ1Y3QgeworCQkJX191MzIgIGhfaV90cmFuc2xhdG9yOworCQl9IGh1cmQxOworCQlzdHJ1Y3QgeworCQkJX191MzIgIG1faV9yZXNlcnZlZDE7CisJCX0gbWFzaXgxOworCX0gb3NkMTsJCQkJLyogT1MgZGVwZW5kZW50IDEgKi8KKwlfX3UzMglpX2Jsb2NrW0VYVDJfTl9CTE9DS1NdOy8qIFBvaW50ZXJzIHRvIGJsb2NrcyAqLworCV9fdTMyCWlfZ2VuZXJhdGlvbjsJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworCV9fdTMyCWlfZmlsZV9hY2w7CS8qIEZpbGUgQUNMICovCisJX191MzIJaV9kaXJfYWNsOwkvKiBEaXJlY3RvcnkgQUNMICovCisJX191MzIJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTgJbF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAlsX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CWlfcGFkMTsKKwkJCV9fdTE2CWxfaV91aWRfaGlnaDsJLyogdGhlc2UgMiBmaWVsZHMgICAgKi8KKwkJCV9fdTE2CWxfaV9naWRfaGlnaDsJLyogd2VyZSByZXNlcnZlZDJbMF0gKi8KKwkJCV9fdTMyCWxfaV9yZXNlcnZlZDI7CisJCX0gbGludXgyOworCQlzdHJ1Y3QgeworCQkJX191OAloX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQlfX3U4CWhfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJX191MTYJaF9pX21vZGVfaGlnaDsKKwkJCV9fdTE2CWhfaV91aWRfaGlnaDsKKwkJCV9fdTE2CWhfaV9naWRfaGlnaDsKKwkJCV9fdTMyCWhfaV9hdXRob3I7CisJCX0gaHVyZDI7CisJCXN0cnVjdCB7CisJCQlfX3U4CW1faV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJbV9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX3UxNgltX3BhZDE7CisJCQlfX3UzMgltX2lfcmVzZXJ2ZWQyWzJdOworCQl9IG1hc2l4MjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCit9OworCisvKgorICogUGVybWFuZW50IHBhcnQgb2YgYW4gbGFyZ2UgaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgeworCV9fdTE2CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCV9fdTE2CWlfdWlkOwkJLyogTG93IDE2IGJpdHMgb2YgT3duZXIgVWlkICovCisJX191MzIJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCV9fdTMyCWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJX191MzIJaV9jdGltZTsJLyogQ3JlYXRpb24gdGltZSAqLworCV9fdTMyCWlfbXRpbWU7CS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisJX191MzIJaV9kdGltZTsJLyogRGVsZXRpb24gVGltZSAqLworCV9fdTE2CWlfZ2lkOwkJLyogTG93IDE2IGJpdHMgb2YgR3JvdXAgSWQgKi8KKwlfX3UxNglpX2xpbmtzX2NvdW50OwkvKiBMaW5rcyBjb3VudCAqLworCV9fdTMyCWlfYmxvY2tzOwkvKiBCbG9ja3MgY291bnQgKi8KKwlfX3UzMglpX2ZsYWdzOwkvKiBGaWxlIGZsYWdzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MzIgIGxfaV9yZXNlcnZlZDE7CisJCX0gbGludXgxOworCQlzdHJ1Y3QgeworCQkJX191MzIgIGhfaV90cmFuc2xhdG9yOworCQl9IGh1cmQxOworCQlzdHJ1Y3QgeworCQkJX191MzIgIG1faV9yZXNlcnZlZDE7CisJCX0gbWFzaXgxOworCX0gb3NkMTsJCQkJLyogT1MgZGVwZW5kZW50IDEgKi8KKwlfX3UzMglpX2Jsb2NrW0VYVDJfTl9CTE9DS1NdOy8qIFBvaW50ZXJzIHRvIGJsb2NrcyAqLworCV9fdTMyCWlfZ2VuZXJhdGlvbjsJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworCV9fdTMyCWlfZmlsZV9hY2w7CS8qIEZpbGUgQUNMICovCisJX191MzIJaV9kaXJfYWNsOwkvKiBEaXJlY3RvcnkgQUNMICovCisJX191MzIJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTgJbF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAlsX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CWlfcGFkMTsKKwkJCV9fdTE2CWxfaV91aWRfaGlnaDsJLyogdGhlc2UgMiBmaWVsZHMgICAgKi8KKwkJCV9fdTE2CWxfaV9naWRfaGlnaDsJLyogd2VyZSByZXNlcnZlZDJbMF0gKi8KKwkJCV9fdTMyCWxfaV9yZXNlcnZlZDI7CisJCX0gbGludXgyOworCQlzdHJ1Y3QgeworCQkJX191OAloX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQlfX3U4CWhfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJX191MTYJaF9pX21vZGVfaGlnaDsKKwkJCV9fdTE2CWhfaV91aWRfaGlnaDsKKwkJCV9fdTE2CWhfaV9naWRfaGlnaDsKKwkJCV9fdTMyCWhfaV9hdXRob3I7CisJCX0gaHVyZDI7CisJCXN0cnVjdCB7CisJCQlfX3U4CW1faV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJbV9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX3UxNgltX3BhZDE7CisJCQlfX3UzMgltX2lfcmVzZXJ2ZWQyWzJdOworCQl9IG1hc2l4MjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCisJX191MTYJaV9leHRyYV9pc2l6ZTsKKwlfX3UxNglpX3BhZDE7Cit9OworCisjZGVmaW5lIGlfc2l6ZV9oaWdoCWlfZGlyX2FjbAorCisvKgorICogRmlsZSBzeXN0ZW0gc3RhdGVzCisgKi8KKyNkZWZpbmUgRVhUMl9WQUxJRF9GUwkJCTB4MDAwMQkvKiBVbm1vdW50ZWQgY2xlYW5seSAqLworI2RlZmluZSBFWFQyX0VSUk9SX0ZTCQkJMHgwMDAyCS8qIEVycm9ycyBkZXRlY3RlZCAqLworCisvKgorICogTW91bnQgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQyX01PVU5UX0NIRUNLCQkweDAwMDEJLyogRG8gbW91bnQtdGltZSBjaGVja3MgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9HUlBJRAkJMHgwMDA0CS8qIENyZWF0ZSBmaWxlcyB3aXRoIGRpcmVjdG9yeSdzIGdyb3VwICovCisjZGVmaW5lIEVYVDJfTU9VTlRfREVCVUcJCTB4MDAwOAkvKiBTb21lIGRlYnVnZ2luZyBtZXNzYWdlcyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19DT05UCQkweDAwMTAJLyogQ29udGludWUgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1JPCQkweDAwMjAJLyogUmVtb3VudCBmcyBybyBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfUEFOSUMJCTB4MDA0MAkvKiBQYW5pYyBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9NSU5JWF9ERgkJMHgwMDgwCS8qIE1pbWljcyB0aGUgTWluaXggc3RhdGZzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTk9fVUlEMzIJCTB4MDIwMCAgLyogRGlzYWJsZSAzMi1iaXQgVUlEcyAqLworCisjZGVmaW5lIGNsZWFyX29wdChvLCBvcHQpCQlvICY9IH5FWFQyX01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQobywgb3B0KQkJCW8gfD0gRVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSB0ZXN0X29wdChzYiwgb3B0KQkJKEVYVDJfU0Ioc2IpLT5zX21vdW50X29wdCAmIFwKKwkJCQkJIEVYVDJfTU9VTlRfIyNvcHQpCisvKgorICogTWF4aW1hbCBtb3VudCBjb3VudHMgYmV0d2VlbiB0d28gZmlsZXN5c3RlbSBjaGVja3MKKyAqLworI2RlZmluZSBFWFQyX0RGTF9NQVhfTU5UX0NPVU5UCQkyMAkvKiBBbGxvdyAyMCBtb3VudHMgKi8KKyNkZWZpbmUgRVhUMl9ERkxfQ0hFQ0tJTlRFUlZBTAkJMAkvKiBEb24ndCB1c2UgaW50ZXJ2YWwgY2hlY2sgKi8KKworLyoKKyAqIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMKKyAqLworI2RlZmluZSBFWFQyX0VSUk9SU19DT05USU5VRQkJMQkvKiBDb250aW51ZSBleGVjdXRpb24gKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfUk8JCQkyCS8qIFJlbW91bnQgZnMgcmVhZC1vbmx5ICovCisjZGVmaW5lIEVYVDJfRVJST1JTX1BBTklDCQkzCS8qIFBhbmljICovCisjZGVmaW5lIEVYVDJfRVJST1JTX0RFRkFVTFQJCUVYVDJfRVJST1JTX0NPTlRJTlVFCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHN1cGVyIGJsb2NrCisgKi8KK3N0cnVjdCBleHQyX3N1cGVyX2Jsb2NrIHsKKwlfX3UzMglzX2lub2Rlc19jb3VudDsJCS8qIElub2RlcyBjb3VudCAqLworCV9fdTMyCXNfYmxvY2tzX2NvdW50OwkJLyogQmxvY2tzIGNvdW50ICovCisJX191MzIJc19yX2Jsb2Nrc19jb3VudDsJLyogUmVzZXJ2ZWQgYmxvY2tzIGNvdW50ICovCisJX191MzIJc19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwlfX3UzMglzX2ZyZWVfaW5vZGVzX2NvdW50OwkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCV9fdTMyCXNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLworCV9fdTMyCXNfbG9nX2Jsb2NrX3NpemU7CS8qIEJsb2NrIHNpemUgKi8KKwlfX3MzMglzX2xvZ19mcmFnX3NpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwlfX3UzMglzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCV9fdTMyCXNfZnJhZ3NfcGVyX2dyb3VwOwkvKiAjIEZyYWdtZW50cyBwZXIgZ3JvdXAgKi8KKwlfX3UzMglzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLworCV9fdTMyCXNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisJX191MzIJc193dGltZTsJCS8qIFdyaXRlIHRpbWUgKi8KKwlfX3UxNglzX21udF9jb3VudDsJCS8qIE1vdW50IGNvdW50ICovCisJX19zMTYJc19tYXhfbW50X2NvdW50OwkvKiBNYXhpbWFsIG1vdW50IGNvdW50ICovCisJX191MTYJc19tYWdpYzsJCS8qIE1hZ2ljIHNpZ25hdHVyZSAqLworCV9fdTE2CXNfc3RhdGU7CQkvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworCV9fdTE2CXNfZXJyb3JzOwkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCV9fdTE2CXNfbWlub3JfcmV2X2xldmVsOwkvKiBtaW5vciByZXZpc2lvbiBsZXZlbCAqLworCV9fdTMyCXNfbGFzdGNoZWNrOwkJLyogdGltZSBvZiBsYXN0IGNoZWNrICovCisJX191MzIJc19jaGVja2ludGVydmFsOwkvKiBtYXguIHRpbWUgYmV0d2VlbiBjaGVja3MgKi8KKwlfX3UzMglzX2NyZWF0b3Jfb3M7CQkvKiBPUyAqLworCV9fdTMyCXNfcmV2X2xldmVsOwkJLyogUmV2aXNpb24gbGV2ZWwgKi8KKwlfX3UxNglzX2RlZl9yZXN1aWQ7CQkvKiBEZWZhdWx0IHVpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJX191MTYJc19kZWZfcmVzZ2lkOwkJLyogRGVmYXVsdCBnaWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBmb3IgRVhUMl9EWU5BTUlDX1JFViBzdXBlcmJsb2NrcyBvbmx5LgorCSAqCisJICogTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGF0aWJsZSBmZWF0dXJlIHNldCBhbmQKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IGlzIHRoYXQgaWYgdGhlcmUgaXMgYSBiaXQgc2V0CisJICogaW4gdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIGtub3cgYWJvdXQsIGl0IHNob3VsZCByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0uCisJICoKKwkgKiBlMmZzY2sncyByZXF1aXJlbWVudHMgYXJlIG1vcmUgc3RyaWN0OyBpZiBpdCBkb2Vzbid0IGtub3cKKwkgKiBhYm91dCBhIGZlYXR1cmUgaW4gZWl0aGVyIHRoZSBjb21wYXRpYmxlIG9yIGluY29tcGF0aWJsZQorCSAqIGZlYXR1cmUgc2V0LCBpdCBtdXN0IGFib3J0IGFuZCBub3QgdHJ5IHRvIG1lZGRsZSB3aXRoCisJICogdGhpbmdzIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZC4uLgorCSAqLworCV9fdTMyCXNfZmlyc3RfaW5vOwkJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisJX191MTYgICBzX2lub2RlX3NpemU7CQkvKiBzaXplIG9mIGlub2RlIHN0cnVjdHVyZSAqLworCV9fdTE2CXNfYmxvY2tfZ3JvdXBfbnI7CS8qIGJsb2NrIGdyb3VwICMgb2YgdGhpcyBzdXBlcmJsb2NrICovCisJX191MzIJc19mZWF0dXJlX2NvbXBhdDsJLyogY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fdTMyCXNfZmVhdHVyZV9pbmNvbXBhdDsJLyogaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX191MzIJc19mZWF0dXJlX3JvX2NvbXBhdDsJLyogcmVhZG9ubHktY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fdTgJc191dWlkWzE2XTsJCS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lICovCisJY2hhcglzX3ZvbHVtZV9uYW1lWzE2XTsJLyogdm9sdW1lIG5hbWUgKi8KKwljaGFyCXNfbGFzdF9tb3VudGVkWzY0XTsJLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworCV9fdTMyCXNfYWxnb3JpdGhtX3VzYWdlX2JpdG1hcDsgLyogRm9yIGNvbXByZXNzaW9uICovCisJLyoKKwkgKiBQZXJmb3JtYW5jZSBoaW50cy4gIERpcmVjdG9yeSBwcmVhbGxvY2F0aW9uIHNob3VsZCBvbmx5CisJICogaGFwcGVuIGlmIHRoZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9QUkVBTExPQyBmbGFnIGlzIG9uLgorCSAqLworCV9fdTgJc19wcmVhbGxvY19ibG9ja3M7CS8qIE5yIG9mIGJsb2NrcyB0byB0cnkgdG8gcHJlYWxsb2NhdGUqLworCV9fdTgJc19wcmVhbGxvY19kaXJfYmxvY2tzOwkvKiBOciB0byBwcmVhbGxvY2F0ZSBmb3IgZGlycyAqLworCV9fdTE2CXNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsJLyogUGVyIGdyb3VwIHRhYmxlIGZvciBvbmxpbmUgZ3Jvd3RoICovCisJLyoKKwkgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUMl9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCisJICovCisJX191OAlzX2pvdXJuYWxfdXVpZFsxNl07CS8qIHV1aWQgb2Ygam91cm5hbCBzdXBlcmJsb2NrICovCisJX191MzIJc19qb3VybmFsX2ludW07CQkvKiBpbm9kZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX191MzIJc19qb3VybmFsX2RldjsJCS8qIGRldmljZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX191MzIJc19sYXN0X29ycGhhbjsJCS8qIHN0YXJ0IG9mIGxpc3Qgb2YgaW5vZGVzIHRvIGRlbGV0ZSAqLworCV9fdTMyCXNfaGFzaF9zZWVkWzRdOwkJLyogSFRSRUUgaGFzaCBzZWVkICovCisJX191OAlzX2RlZl9oYXNoX3ZlcnNpb247CS8qIERlZmF1bHQgaGFzaCB2ZXJzaW9uIHRvIHVzZSAqLworCV9fdTgJc19qbmxfYmFja3VwX3R5cGU7CS8qIERlZmF1bHQgdHlwZSBvZiBqb3VybmFsIGJhY2t1cCAqLworCV9fdTE2CXNfcmVzZXJ2ZWRfd29yZF9wYWQ7CisJX191MzIJc19kZWZhdWx0X21vdW50X29wdHM7CisJX191MzIJc19maXJzdF9tZXRhX2JnOwkvKiBGaXJzdCBtZXRhYmxvY2sgZ3JvdXAgKi8KKwlfX3UzMglzX21rZnNfdGltZTsJCS8qIFdoZW4gdGhlIGZpbGVzeXN0ZW0gd2FzIGNyZWF0ZWQgKi8KKwlfX3UzMglzX2pubF9ibG9ja3NbMTddOwkvKiBCYWNrdXAgb2YgdGhlIGpvdXJuYWwgaW5vZGUgKi8KKwlfX3UzMglzX3Jlc2VydmVkWzE3Ml07CS8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KK307CisKKy8qCisgKiBDb2RlcyBmb3Igb3BlcmF0aW5nIHN5c3RlbXMKKyAqLworI2RlZmluZSBFWFQyX09TX0xJTlVYCQkwCisjZGVmaW5lIEVYVDJfT1NfSFVSRAkJMQorI2RlZmluZSBFWFQyX09TX01BU0lYCQkyCisjZGVmaW5lIEVYVDJfT1NfRlJFRUJTRAkJMworI2RlZmluZSBFWFQyX09TX0xJVEVTCQk0CisKKy8qCisgKiBSZXZpc2lvbiBsZXZlbHMKKyAqLworI2RlZmluZSBFWFQyX0dPT0RfT0xEX1JFVgkwCS8qIFRoZSBnb29kIG9sZCAob3JpZ2luYWwpIGZvcm1hdCAqLworI2RlZmluZSBFWFQyX0RZTkFNSUNfUkVWCTEJLyogVjIgZm9ybWF0IHcvIGR5bmFtaWMgaW5vZGUgc2l6ZXMgKi8KKworI2RlZmluZSBFWFQyX0NVUlJFTlRfUkVWCUVYVDJfR09PRF9PTERfUkVWCisjZGVmaW5lIEVYVDJfTUFYX1NVUFBfUkVWCUVYVDJfRFlOQU1JQ19SRVYKKworI2RlZmluZSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUgMTI4CisKKy8qCisgKiBKb3VybmFsIGlub2RlIGJhY2t1cCB0eXBlcworICovCisjZGVmaW5lIEVYVDNfSk5MX0JBQ0tVUF9CTE9DS1MJMQorCisvKgorICogRmVhdHVyZSBzZXQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUMl9TQihzYiktPnNfZmVhdHVyZV9jb21wYXQgJiAobWFzaykgKQorI2RlZmluZSBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDJfU0Ioc2IpLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgKG1hc2spICkKKyNkZWZpbmUgRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDJfU0Ioc2IpLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiAobWFzaykgKQorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0lNQUdJQ19JTk9ERVMJMHgwMDAyCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwJCTB4MDAwNAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSCQkweDAwMDgKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUJMHgwMDEwCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYCQkweDAwMjAKKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUgkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFCTB4MDAwMgorLyogI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0JUUkVFX0RJUgkweDAwMDQgbm90IHVzZWQgKi8KKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NJT04JMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRQkJMHgwMDAyCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSCQkweDAwMDQgLyogTmVlZHMgcmVjb3ZlcnkgKi8KKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWCTB4MDAwOCAvKiBKb3VybmFsIGRldmljZSAqLworI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRwkJMHgwMDEwCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTCQkweDAwNDAKKworCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfU1VQUAkwCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRXwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIpCisKKy8qCisgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdXNlciBhbmQvb3IgZ3JvdXAgdXNpbmcgcmVzZXJ2ZWQgYmxvY2tzCisgKi8KKyNkZWZpbmUgRVhUMl9ERUZfUkVTVUlECQkwCisjZGVmaW5lIEVYVDJfREVGX1JFU0dJRAkJMAorCisvKgorICogRGVmYXVsdCBtb3VudCBvcHRpb25zCisgKi8KKyNkZWZpbmUgRVhUMl9ERUZNX0RFQlVHCQkweDAwMDEKKyNkZWZpbmUgRVhUMl9ERUZNX0JTREdST1VQUwkweDAwMDIKKyNkZWZpbmUgRVhUMl9ERUZNX1hBVFRSX1VTRVIJMHgwMDA0CisjZGVmaW5lIEVYVDJfREVGTV9BQ0wJCTB4MDAwOAorI2RlZmluZSBFWFQyX0RFRk1fVUlEMTYJCTB4MDAxMAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREUJCTB4MDA2MAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfREFUQQkweDAwMjAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX09SREVSRUQJMHgwMDQwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9XQkFDSwkweDAwNjAKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGRpcmVjdG9yeSBlbnRyeQorICovCisjZGVmaW5lIEVYVDJfTkFNRV9MRU4gMjU1CisKK3N0cnVjdCBleHQyX2Rpcl9lbnRyeSB7CisJX191MzIJaW5vZGU7CQkJLyogSW5vZGUgbnVtYmVyICovCisJX191MTYJcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKwlfX3UxNgluYW1lX2xlbjsJCS8qIE5hbWUgbGVuZ3RoICovCisJY2hhcgluYW1lW0VYVDJfTkFNRV9MRU5dOwkvKiBGaWxlIG5hbWUgKi8KK307CisKKy8qCisgKiBUaGUgbmV3IHZlcnNpb24gb2YgdGhlIGRpcmVjdG9yeSBlbnRyeS4gIFNpbmNlIEVYVDIgc3RydWN0dXJlcyBhcmUKKyAqIHN0b3JlZCBpbiBpbnRlbCBieXRlIG9yZGVyLCBhbmQgdGhlIG5hbWVfbGVuIGZpZWxkIGNvdWxkIG5ldmVyIGJlCisgKiBiaWdnZXIgdGhhbiAyNTUgY2hhcnMsIGl0J3Mgc2FmZSB0byByZWNsYWltIHRoZSBleHRyYSBieXRlIGZvciB0aGUKKyAqIGZpbGVfdHlwZSBmaWVsZC4KKyAqLworc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgeworCV9fdTMyCWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLworCV9fdTE2CXJlY19sZW47CQkvKiBEaXJlY3RvcnkgZW50cnkgbGVuZ3RoICovCisJX191OAluYW1lX2xlbjsJCS8qIE5hbWUgbGVuZ3RoICovCisJX191OAlmaWxlX3R5cGU7CisJY2hhcgluYW1lW0VYVDJfTkFNRV9MRU5dOwkvKiBGaWxlIG5hbWUgKi8KK307CisKKy8qCisgKiBFeHQyIGRpcmVjdG9yeSBmaWxlIHR5cGVzLiAgT25seSB0aGUgbG93IDMgYml0cyBhcmUgdXNlZC4gIFRoZQorICogb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIG5vdy4KKyAqLworI2RlZmluZSBFWFQyX0ZUX1VOS05PV04JCTAKKyNkZWZpbmUgRVhUMl9GVF9SRUdfRklMRQkxCisjZGVmaW5lIEVYVDJfRlRfRElSCQkyCisjZGVmaW5lIEVYVDJfRlRfQ0hSREVWCQkzCisjZGVmaW5lIEVYVDJfRlRfQkxLREVWCQk0CisjZGVmaW5lIEVYVDJfRlRfRklGTwkJNQorI2RlZmluZSBFWFQyX0ZUX1NPQ0sJCTYKKyNkZWZpbmUgRVhUMl9GVF9TWU1MSU5LCQk3CisKKyNkZWZpbmUgRVhUMl9GVF9NQVgJCTgKKworLyoKKyAqIEVYVDJfRElSX1BBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBib3VuZGFyaWVzCisgKgorICogTk9URTogSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAqLworI2RlZmluZSBFWFQyX0RJUl9QQUQJCQk0CisjZGVmaW5lIEVYVDJfRElSX1JPVU5ECQkJKEVYVDJfRElSX1BBRCAtIDEpCisjZGVmaW5lIEVYVDJfRElSX1JFQ19MRU4obmFtZV9sZW4pCSgoKG5hbWVfbGVuKSArIDggKyBFWFQyX0RJUl9ST1VORCkgJiBcCisJCQkJCSB+RVhUMl9ESVJfUk9VTkQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfaW8uaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwMGE3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX2lvLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlvLmggLS0tIHRoZSBJL08gbWFuYWdlciBhYnN0cmFjdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKyNpZm5kZWYgRVhUMkZTX0VYVDJfSU9fSAorI2RlZmluZSBFWFQyRlNfRVhUMl9JT19IIDEKKworLyoKKyAqIGV4dDJfbG9mZl90IGlzIGRlZmluZWQgaGVyZSBzaW5jZSB1bml4X2lvLmMgbmVlZHMgaXQuCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKEhBU19MT05HX0xPTkcpCit0eXBlZGVmIGxvbmcgbG9uZwlleHQyX2xvZmZfdDsKKyNlbHNlCit0eXBlZGVmIGxvbmcJCWV4dDJfbG9mZl90OworI2VuZGlmCisKKy8qIGxsc2Vlay5jICovCisvKiBleHQyX2xvZmZfdCBleHQyZnNfbGxzZWVrIChpbnQsIGV4dDJfbG9mZl90LCBpbnQpOyAqLworI2lmZGVmIENPTkZJR19MRlMKKyMgZGVmaW5lIGV4dDJmc19sbHNlZWsgbHNlZWs2NAorI2Vsc2UKKyMgZGVmaW5lIGV4dDJmc19sbHNlZWsgbHNlZWsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfaW9fbWFuYWdlciAqaW9fbWFuYWdlcjsKK3R5cGVkZWYgc3RydWN0IHN0cnVjdF9pb19jaGFubmVsICppb19jaGFubmVsOworCisjZGVmaW5lIENIQU5ORUxfRkxBR1NfV1JJVEVUSFJPVUdICTB4MDEKKworc3RydWN0IHN0cnVjdF9pb19jaGFubmVsIHsKKwllcnJjb2RlX3QJbWFnaWM7CisJaW9fbWFuYWdlcgltYW5hZ2VyOworCWNoYXIJCSpuYW1lOworCWludAkJYmxvY2tfc2l6ZTsKKwllcnJjb2RlX3QJKCpyZWFkX2Vycm9yKShpb19jaGFubmVsIGNoYW5uZWwsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCQkgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgdm9pZCAqZGF0YSwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBpbnQgYWN0dWFsX2J5dGVzX3JlYWQsCisJCQkJICAgICAgZXJyY29kZV90IGVycm9yKTsKKwllcnJjb2RlX3QgICAgICAgKCp3cml0ZV9lcnJvcikoaW9fY2hhbm5lbCBjaGFubmVsLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJCSAgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICAgIHNpemVfdCBzaXplLAorCQkJCSAgICAgICBpbnQgYWN0dWFsX2J5dGVzX3dyaXR0ZW4sCisJCQkJICAgICAgIGVycmNvZGVfdCBlcnJvcik7CisJaW50CQlyZWZjb3VudDsKKwlpbnQJCWZsYWdzOworCWludAkJcmVzZXJ2ZWRbMTRdOworCXZvaWQJCSpwcml2YXRlX2RhdGE7CisJdm9pZAkJKmFwcF9kYXRhOworfTsKKworc3RydWN0IHN0cnVjdF9pb19tYW5hZ2VyIHsKKwllcnJjb2RlX3QgbWFnaWM7CisJY29uc3QgY2hhciAqbmFtZTsKKwllcnJjb2RlX3QgKCpvcGVuKShjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIGlvX2NoYW5uZWwgKmNoYW5uZWwpOworCWVycmNvZGVfdCAoKmNsb3NlKShpb19jaGFubmVsIGNoYW5uZWwpOworCWVycmNvZGVfdCAoKnNldF9ibGtzaXplKShpb19jaGFubmVsIGNoYW5uZWwsIGludCBibGtzaXplKTsKKwllcnJjb2RlX3QgKCpyZWFkX2JsaykoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJICAgICAgaW50IGNvdW50LCB2b2lkICpkYXRhKTsKKwllcnJjb2RlX3QgKCp3cml0ZV9ibGspKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgICBpbnQgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEpOworCWVycmNvZGVfdCAoKmZsdXNoKShpb19jaGFubmVsIGNoYW5uZWwpOworCWVycmNvZGVfdCAoKndyaXRlX2J5dGUpKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJaW50IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKKwllcnJjb2RlX3QgKCpzZXRfb3B0aW9uKShpb19jaGFubmVsIGNoYW5uZWwsIGNvbnN0IGNoYXIgKm9wdGlvbiwKKwkJCQljb25zdCBjaGFyICphcmcpOworCWludCAgICAgICAgICAgICByZXNlcnZlZFsxNF07Cit9OworCisjZGVmaW5lIElPX0ZMQUdfUlcJMQorCisvKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb25zLi4uLgorICovCisjZGVmaW5lIGlvX2NoYW5uZWxfY2xvc2UoYykJCSgoYyktPm1hbmFnZXItPmNsb3NlKChjKSkpCisjZGVmaW5lIGlvX2NoYW5uZWxfc2V0X2Jsa3NpemUoYyxzKQkoKGMpLT5tYW5hZ2VyLT5zZXRfYmxrc2l6ZSgoYykscykpCisjZGVmaW5lIGlvX2NoYW5uZWxfcmVhZF9ibGsoYyxiLG4sZCkJKChjKS0+bWFuYWdlci0+cmVhZF9ibGsoKGMpLGIsbixkKSkKKyNkZWZpbmUgaW9fY2hhbm5lbF93cml0ZV9ibGsoYyxiLG4sZCkJKChjKS0+bWFuYWdlci0+d3JpdGVfYmxrKChjKSxiLG4sZCkpCisjZGVmaW5lIGlvX2NoYW5uZWxfZmx1c2goYykJCSgoYyktPm1hbmFnZXItPmZsdXNoKChjKSkpCisjZGVmaW5lIGlvX2NoYW5uZWxfYnVtcGNvdW50KGMpCQkoKGMpLT5yZWZjb3VudCsrKQorCisvKiBpb19tYW5hZ2VyLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgaW9fY2hhbm5lbF9zZXRfb3B0aW9ucyhpb19jaGFubmVsIGNoYW5uZWwsCisJCQkJCWNvbnN0IGNoYXIgKm9wdGlvbnMpOworZXh0ZXJuIGVycmNvZGVfdCBpb19jaGFubmVsX3dyaXRlX2J5dGUoaW9fY2hhbm5lbCBjaGFubmVsLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICAgICAgaW50IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKKworLyogdW5peF9pby5jICovCitleHRlcm4gaW9fbWFuYWdlciB1bml4X2lvX21hbmFnZXI7CisKKy8qIHRlc3RfaW8uYyAqLworZXh0ZXJuIGlvX21hbmFnZXIgdGVzdF9pb19tYW5hZ2VyLCB0ZXN0X2lvX2JhY2tpbmdfbWFuYWdlcjsKK2V4dGVybiB2b2lkICgqdGVzdF9pb19jYl9yZWFkX2JsaykKKwkodW5zaWduZWQgbG9uZyBibG9jaywgaW50IGNvdW50LCBlcnJjb2RlX3QgZXJyKTsKK2V4dGVybiB2b2lkICgqdGVzdF9pb19jYl93cml0ZV9ibGspCisJKHVuc2lnbmVkIGxvbmcgYmxvY2ssIGludCBjb3VudCwgZXJyY29kZV90IGVycik7CitleHRlcm4gdm9pZCAoKnRlc3RfaW9fY2Jfc2V0X2Jsa3NpemUpCisJKGludCBibGtzaXplLCBlcnJjb2RlX3QgZXJyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml90eXBlcy5oIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzExOTZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfdHlwZXMuaApAQCAtMCwwICsxLDIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0MmZzLmggYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0MmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3NzIwMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyZnMuaApAQCAtMCwwICsxLDkyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZXh0MmZzLmggLS0tIGV4dDJmcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKyNpZm5kZWYgRVhUMkZTX0VYVDJGU19ICisjZGVmaW5lIEVYVDJGU19FWFQyRlNfSCAxCisKKworI2RlZmluZSBFWFQyRlNfQVRUUih4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBXaGVyZSB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHN1cGVyYmxvY2sgaXMgbG9jYXRlZCwgYW5kIGhvdyBiaWcKKyAqIHN1cGVyYmxvY2tzIGFyZSBzdXBwb3NlZCB0byBiZS4gIFdlIGRlZmluZSBTVVBFUkJMT0NLX1NJWkUgYmVjYXVzZQorICogdGhlIHNpemUgb2YgdGhlIHN1cGVyYmxvY2sgc3RydWN0dXJlIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVzdHdvcnRoeQorICogKHNvbWUgdmVyc2lvbnMgaGF2ZSB0aGUgcGFkZGluZyBzZXQgdXAgc28gdGhhdCB0aGUgc3VwZXJibG9jayBpcworICogMTAzMiBieXRlcyBsb25nKS4KKyAqLworI2RlZmluZSBTVVBFUkJMT0NLX09GRlNFVAkxMDI0CisjZGVmaW5lIFNVUEVSQkxPQ0tfU0laRQkJMTAyNAorCisvKgorICogVGhlIGxhc3QgZXh0MmZzIHJldmlzaW9uIGxldmVsIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGlzCisgKiBhYmxlIHRvIHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgRVhUMl9MSUJfQ1VSUkVOVF9SRVYJRVhUMl9EWU5BTUlDX1JFVgorCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZXh0Ml90eXBlcy5oIgorI2luY2x1ZGUgImV4dDJfZnMuaCIKKwordHlwZWRlZiBfX3UzMgkJZXh0Ml9pbm9fdDsKK3R5cGVkZWYgX191MzIJCWJsa190OwordHlwZWRlZiBfX3UzMgkJZGdycF90OwordHlwZWRlZiBfX3UzMgkJZXh0Ml9vZmZfdDsKK3R5cGVkZWYgX19zNjQJCWUyX2Jsa2NudF90OwordHlwZWRlZiBfX3UzMgkJZXh0Ml9kaXJoYXNoX3Q7CisKKyNpbmNsdWRlICJleHQyX2lvLmgiCisjaW5jbHVkZSAiZXh0Ml9lcnIuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgc3RydWN0X2V4dDJfZmlsc3lzICpleHQyX2ZpbHN5czsKKworc3RydWN0IGV4dDJmc19zdHJ1Y3RfZ2VuZXJpY19iaXRtYXAgeworCWVycmNvZGVfdAltYWdpYzsKKwlleHQyX2ZpbHN5cwlmczsKKwlfX3UzMgkJc3RhcnQsIGVuZDsKKwlfX3UzMgkJcmVhbF9lbmQ7CisJY2hhcgkqCWRlc2NyaXB0aW9uOworCWNoYXIJKgliaXRtYXA7CisJZXJyY29kZV90CWJhc2VfZXJyb3JfY29kZTsKKwlfX3UzMgkJcmVzZXJ2ZWRbN107Cit9OworCisjZGVmaW5lIEVYVDJGU19NQVJLX0VSUk9SCTAKKyNkZWZpbmUgRVhUMkZTX1VOTUFSS19FUlJPUgkxCisjZGVmaW5lIEVYVDJGU19URVNUX0VSUk9SCTIKKwordHlwZWRlZiBzdHJ1Y3QgZXh0MmZzX3N0cnVjdF9nZW5lcmljX2JpdG1hcCAqZXh0MmZzX2dlbmVyaWNfYml0bWFwOwordHlwZWRlZiBzdHJ1Y3QgZXh0MmZzX3N0cnVjdF9nZW5lcmljX2JpdG1hcCAqZXh0MmZzX2lub2RlX2JpdG1hcDsKK3R5cGVkZWYgc3RydWN0IGV4dDJmc19zdHJ1Y3RfZ2VuZXJpY19iaXRtYXAgKmV4dDJmc19ibG9ja19iaXRtYXA7CisKKyNkZWZpbmUgRVhUMl9GSVJTVF9JTk9ERShzKQlFWFQyX0ZJUlNUX0lOTyhzKQorCisvKgorICogYmFkYmxvY2tzIGxpc3QgZGVmaW5pdGlvbnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBleHQyX3N0cnVjdF91MzJfbGlzdCAqZXh0Ml9iYWRibG9ja3NfbGlzdDsKK3R5cGVkZWYgc3RydWN0IGV4dDJfc3RydWN0X3UzMl9pdGVyYXRlICpleHQyX2JhZGJsb2Nrc19pdGVyYXRlOworCit0eXBlZGVmIHN0cnVjdCBleHQyX3N0cnVjdF91MzJfbGlzdCAqZXh0Ml91MzJfbGlzdDsKK3R5cGVkZWYgc3RydWN0IGV4dDJfc3RydWN0X3UzMl9pdGVyYXRlICpleHQyX3UzMl9pdGVyYXRlOworCisvKiBvbGQgKi8KK3R5cGVkZWYgc3RydWN0IGV4dDJfc3RydWN0X3UzMl9saXN0ICpiYWRibG9ja3NfbGlzdDsKK3R5cGVkZWYgc3RydWN0IGV4dDJfc3RydWN0X3UzMl9pdGVyYXRlICpiYWRibG9ja3NfaXRlcmF0ZTsKKworI2RlZmluZSBCQURCTE9DS1NfRkxBR19ESVJUWQkxCisKKy8qCisgKiBleHQyX2RibGlzdCBzdHJ1Y3R1cmUgYW5kIGFic3RyYWN0aW9ucyAoc2VlIGRibGlzdC5jKQorICovCitzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSB7CisJZXh0Ml9pbm9fdAlpbm87CisJYmxrX3QJYmxrOworCWludAlibG9ja2NudDsKK307CisKK3R5cGVkZWYgc3RydWN0IGV4dDJfc3RydWN0X2RibGlzdCAqZXh0Ml9kYmxpc3Q7CisKKyNkZWZpbmUgREJMSVNUX0FCT1JUCTEKKworLyoKKyAqIGV4dDJfZmlsZWlvIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBFWFQyX0ZJTEVfV1JJVEUJCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZJTEVfQ1JFQVRFCTB4MDAwMgorCisjZGVmaW5lIEVYVDJfRklMRV9NQVNLCQkweDAwRkYKKworI2RlZmluZSBFWFQyX0ZJTEVfQlVGX0RJUlRZCTB4NDAwMAorI2RlZmluZSBFWFQyX0ZJTEVfQlVGX1ZBTElECTB4MjAwMAorCit0eXBlZGVmIHN0cnVjdCBleHQyX2ZpbGUgKmV4dDJfZmlsZV90OworCisjZGVmaW5lIEVYVDJfU0VFS19TRVQJMAorI2RlZmluZSBFWFQyX1NFRUtfQ1VSCTEKKyNkZWZpbmUgRVhUMl9TRUVLX0VORAkyCisKKy8qCisgKiBGbGFncyBmb3IgdGhlIGV4dDJfZmlsc3lzIHN0cnVjdHVyZSBhbmQgZm9yIGV4dDJmc19vcGVuKCkKKyAqLworI2RlZmluZSBFWFQyX0ZMQUdfUlcJCQkweDAxCisjZGVmaW5lIEVYVDJfRkxBR19DSEFOR0VECQkweDAyCisjZGVmaW5lIEVYVDJfRkxBR19ESVJUWQkJCTB4MDQKKyNkZWZpbmUgRVhUMl9GTEFHX1ZBTElECQkJMHgwOAorI2RlZmluZSBFWFQyX0ZMQUdfSUJfRElSVFkJCTB4MTAKKyNkZWZpbmUgRVhUMl9GTEFHX0JCX0RJUlRZCQkweDIwCisjZGVmaW5lIEVYVDJfRkxBR19TV0FQX0JZVEVTCQkweDQwCisjZGVmaW5lIEVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQJMHg4MAorI2RlZmluZSBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURQkweDEwMAorI2RlZmluZSBFWFQyX0ZMQUdfTUFTVEVSX1NCX09OTFkJMHgyMDAKKyNkZWZpbmUgRVhUMl9GTEFHX0ZPUkNFCQkJMHg0MDAKKyNkZWZpbmUgRVhUMl9GTEFHX1NVUEVSX09OTFkJCTB4ODAwCisjZGVmaW5lIEVYVDJfRkxBR19KT1VSTkFMX0RFVl9PSwkweDEwMDAKKyNkZWZpbmUgRVhUMl9GTEFHX0lNQUdFX0ZJTEUJCTB4MjAwMAorCisvKgorICogU3BlY2lhbCBmbGFnIGluIHRoZSBleHQyIGlub2RlIGlfZmxhZyBmaWVsZCB0aGF0IG1lYW5zIHRoYXQgdGhpcyBpcworICogYSBuZXcgaW5vZGUuICAoU28gdGhhdCBleHQyX3dyaXRlX2lub2RlKCkgY2FuIGNsZWFyIGV4dHJhIGZpZWxkcy4pCisgKi8KKyNkZWZpbmUgRVhUMl9ORVdfSU5PREVfRkwJMHg4MDAwMDAwMAorCisvKgorICogRmxhZ3MgZm9yIG1ram91cm5hbAorICoKKyAqIEVYVDJfTUtKT1VSTkFMX1YxX1NVUEVSCU1ha2UgYSAoZGVwcmVjYXRlZCkgVjEgam91cm5hbCBzdXBlcmJsb2NrCisgKi8KKyNkZWZpbmUgRVhUMl9NS0pPVVJOQUxfVjFfU1VQRVIJMHgwMDAwMDAxCisKK3N0cnVjdCBzdHJ1Y3RfZXh0Ml9maWxzeXMgeworCWVycmNvZGVfdAkJCW1hZ2ljOworCWlvX2NoYW5uZWwJCQlpbzsKKwlpbnQJCQkJZmxhZ3M7CisJY2hhciAqCQkJCWRldmljZV9uYW1lOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrCSoJc3VwZXI7CisJdW5zaWduZWQgaW50CQkJYmxvY2tzaXplOworCWludAkJCQlmcmFnc2l6ZTsKKwlkZ3JwX3QJCQkJZ3JvdXBfZGVzY19jb3VudDsKKwl1bnNpZ25lZCBsb25nCQkJZGVzY19ibG9ja3M7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqCWdyb3VwX2Rlc2M7CisJaW50CQkJCWlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisJZXh0MmZzX2lub2RlX2JpdG1hcAkJaW5vZGVfbWFwOworCWV4dDJmc19ibG9ja19iaXRtYXAJCWJsb2NrX21hcDsKKwllcnJjb2RlX3QgKCpnZXRfYmxvY2tzKShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sIGJsa190ICpibG9ja3MpOworCWVycmNvZGVfdCAoKmNoZWNrX2RpcmVjdG9yeSkoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vKTsKKwllcnJjb2RlX3QgKCp3cml0ZV9iaXRtYXBzKShleHQyX2ZpbHN5cyBmcyk7CisJZXJyY29kZV90ICgqcmVhZF9pbm9kZSkoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCXN0cnVjdCBleHQyX2lub2RlICppbm9kZSk7CisJZXJyY29kZV90ICgqd3JpdGVfaW5vZGUpKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpOworCWV4dDJfYmFkYmxvY2tzX2xpc3QJCWJhZGJsb2NrczsKKwlleHQyX2RibGlzdAkJCWRibGlzdDsKKwlfX3UzMgkJCQlzdHJpZGU7CS8qIGZvciBta2UyZnMgKi8KKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqCW9yaWdfc3VwZXI7CisJc3RydWN0IGV4dDJfaW1hZ2VfaGRyICoJCWltYWdlX2hlYWRlcjsKKwlfX3UzMgkJCQl1bWFzazsKKwkvKgorCSAqIFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uCisJICovCisJX191MzIJCQkJcmVzZXJ2ZWRbOF07CisKKwkvKgorCSAqIFJlc2VydmVkIGZvciB0aGUgdXNlIG9mIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgorCSAqLworCXZvaWQgKgkJCQlwcml2X2RhdGE7CisKKwkvKgorCSAqIElub2RlIGNhY2hlCisJICovCisJc3RydWN0IGV4dDJfaW5vZGVfY2FjaGUJCSppY2FjaGU7CisJaW9fY2hhbm5lbAkJCWltYWdlX2lvOworfTsKKworI2luY2x1ZGUgImJpdG9wcy5oIgorCisvKgorICogUmV0dXJuIGZsYWdzIGZvciB0aGUgYmxvY2sgaXRlcmF0b3IgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgQkxPQ0tfQ0hBTkdFRAkxCisjZGVmaW5lIEJMT0NLX0FCT1JUCTIKKyNkZWZpbmUgQkxPQ0tfRVJST1IJNAorCisvKgorICogQmxvY2sgaW50ZXJhdGUgZmxhZ3MKKyAqCisgKiBCTE9DS19GTEFHX0FQUEVORCwgb3IgQkxPQ0tfRkxBR19IT0xFLCBpbmRpY2F0ZXMgdGhhdCB0aGUgaW50ZXJhdG9yCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9uIGJsb2NrcyB3aGVyZSB0aGUgYmxvY2sgbnVtYmVyIGlzIHplcm8uCisgKiBUaGlzIGlzIHVzZWQgYnkgZXh0MmZzX2V4cGFuZF9kaXIoKSB0byBiZSBhYmxlIHRvIGFkZCBhIG5ldyBibG9jaworICogdG8gYW4gaW5vZGUuICBJdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBwcm9ncmFtcyB0aGF0IHdhbnQgdG8gYmUgYWJsZQorICogdG8gZGVhbCB3aXRoIGZpbGVzIHRoYXQgY29udGFpbiAiaG9sZXMiLgorICoKKyAqIEJMT0NLX0ZMQUdfVFJBVkVSU0UgaW5kaWNhdGVzIHRoYXQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGZvciB0aGUKKyAqIGluZGlyZWN0LCBkb3VibHkgaW5kaXJlY3QsIGV0Yy4gYmxvY2tzIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWxsCisgKiBvZiB0aGUgYmxvY2tzIGNvbnRhaW5pbmVkIGluIHRoZSBpbmRpcmVjdCBibG9ja3MgYXJlIHByb2Nlc3NlZC4KKyAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBhcmUgZ29pbmcgdG8gYmUgZGVhbGxvY2F0aW5nIGJsb2NrcyBmcm9tIGFuCisgKiBpbm9kZS4KKyAqCisgKiBCTE9DS19GTEFHX0RBVEFfT05MWSBpbmRpY2F0ZXMgdGhhdCB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gc2hvdWxkIGJlCisgKiBjYWxsZWQgZm9yIGRhdGEgYmxvY2tzIG9ubHkuCisgKgorICogQkxPQ0tfRkxBR19OT19MQVJHRSBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBJdCBpbmZvcm1zCisgKiBleHQyZnNfYmxvY2tfaXRlcmF0ZTIgdGhhdCBsYXJnZSBmaWxlcyB3b24ndCBiZSBhY2NlcHRlZC4KKyAqLworI2RlZmluZSBCTE9DS19GTEFHX0FQUEVORAkxCisjZGVmaW5lIEJMT0NLX0ZMQUdfSE9MRQkJMQorI2RlZmluZSBCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFCTIKKyNkZWZpbmUgQkxPQ0tfRkxBR19EQVRBX09OTFkJNAorCisjZGVmaW5lIEJMT0NLX0ZMQUdfTk9fTEFSR0UJMHgxMDAwCisKKy8qCisgKiBNYWdpYyAiYmxvY2sgY291bnQiIHJldHVybiB2YWx1ZXMgZm9yIHRoZSBibG9jayBpdGVyYXRvciBmdW5jdGlvbi4KKyAqLworI2RlZmluZSBCTE9DS19DT1VOVF9JTkQJCSgtMSkKKyNkZWZpbmUgQkxPQ0tfQ09VTlRfRElORAkoLTIpCisjZGVmaW5lIEJMT0NLX0NPVU5UX1RJTkQJKC0zKQorI2RlZmluZSBCTE9DS19DT1VOVF9UUkFOU0xBVE9SCSgtNCkKKworI2lmIDAKKy8qCisgKiBGbGFncyBmb3IgZXh0MmZzX21vdmVfYmxvY2tzCisgKi8KKyNkZWZpbmUgRVhUMl9CTU9WRV9HRVRfREJMSVNUCTB4MDAwMQorI2RlZmluZSBFWFQyX0JNT1ZFX0RFQlVHCTB4MDAwMgorI2VuZGlmCisKKy8qCisgKiBGbGFncyBmb3IgZGlyZWN0b3J5IGJsb2NrIHJlYWRpbmcgYW5kIHdyaXRpbmcgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgRVhUMl9ESVJCTE9DS19WMl9TVFJVQ1QJMHgwMDAxCisKKy8qCisgKiBSZXR1cm4gZmxhZ3MgZm9yIHRoZSBkaXJlY3RvcnkgaXRlcmF0b3IgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgRElSRU5UX0NIQU5HRUQJMQorI2RlZmluZSBESVJFTlRfQUJPUlQJMgorI2RlZmluZSBESVJFTlRfRVJST1IJMworCisvKgorICogRGlyZWN0b3J5IGl0ZXJhdG9yIGZsYWdzCisgKi8KKworI2RlZmluZSBESVJFTlRfRkxBR19JTkNMVURFX0VNUFRZCTEKKyNkZWZpbmUgRElSRU5UX0ZMQUdfSU5DTFVERV9SRU1PVkVECTIKKworI2RlZmluZSBESVJFTlRfRE9UX0ZJTEUJCTEKKyNkZWZpbmUgRElSRU5UX0RPVF9ET1RfRklMRQkyCisjZGVmaW5lIERJUkVOVF9PVEhFUl9GSUxFCTMKKyNkZWZpbmUgRElSRU5UX0RFTEVURURfRklMRQk0CisKKy8qCisgKiBJbm9kZSBzY2FuIGRlZmluaXRpb25zCisgKi8KK3R5cGVkZWYgc3RydWN0IGV4dDJfc3RydWN0X2lub2RlX3NjYW4gKmV4dDJfaW5vZGVfc2NhbjsKKworLyoKKyAqIGV4dDJmc19zY2FuIGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9TRl9DSEtfQkFEQkxPQ0tTCTB4MDAwMQorI2RlZmluZSBFWFQyX1NGX0JBRF9JTk9ERV9CTEsJMHgwMDAyCisjZGVmaW5lIEVYVDJfU0ZfQkFEX0VYVFJBX0JZVEVTCTB4MDAwNAorI2RlZmluZSBFWFQyX1NGX1NLSVBfTUlTU0lOR19JVEFCTEUJMHgwMDA4CisKKy8qCisgKiBleHQyZnNfY2hlY2tfaWZfbW91bnRlZCBmbGFncworICovCisjZGVmaW5lIEVYVDJfTUZfTU9VTlRFRAkJMQorI2RlZmluZSBFWFQyX01GX0lTUk9PVAkJMgorI2RlZmluZSBFWFQyX01GX1JFQURPTkxZCTQKKyNkZWZpbmUgRVhUMl9NRl9TV0FQCQk4CisjZGVmaW5lIEVYVDJfTUZfQlVTWQkJMTYKKworLyoKKyAqIEV4dDIvbGludXggbW9kZSBmbGFncy4gIFdlIGRlZmluZSB0aGVtIGhlcmUgc28gdGhhdCB3ZSBkb24ndCBuZWVkCisgKiB0byBkZXBlbmQgb24gdGhlIE9TJ3Mgc3lzL3N0YXQuaCwgc2luY2Ugd2UgbWF5IGJlIGNvbXBpbGluZyBvbiBhCisgKiBub24tTGludXggc3lzdGVtLgorICovCisjZGVmaW5lIExJTlVYX1NfSUZNVCAgMDAxNzAwMDAKKyNkZWZpbmUgTElOVVhfU19JRlNPQ0sgMDE0MDAwMAorI2RlZmluZSBMSU5VWF9TX0lGTE5LCSAwMTIwMDAwCisjZGVmaW5lIExJTlVYX1NfSUZSRUcgIDAxMDAwMDAKKyNkZWZpbmUgTElOVVhfU19JRkJMSyAgMDA2MDAwMAorI2RlZmluZSBMSU5VWF9TX0lGRElSICAwMDQwMDAwCisjZGVmaW5lIExJTlVYX1NfSUZDSFIgIDAwMjAwMDAKKyNkZWZpbmUgTElOVVhfU19JRklGTyAgMDAxMDAwMAorI2RlZmluZSBMSU5VWF9TX0lTVUlEICAwMDA0MDAwCisjZGVmaW5lIExJTlVYX1NfSVNHSUQgIDAwMDIwMDAKKyNkZWZpbmUgTElOVVhfU19JU1ZUWCAgMDAwMTAwMAorCisjZGVmaW5lIExJTlVYX1NfSVJXWFUgMDA3MDAKKyNkZWZpbmUgTElOVVhfU19JUlVTUiAwMDQwMAorI2RlZmluZSBMSU5VWF9TX0lXVVNSIDAwMjAwCisjZGVmaW5lIExJTlVYX1NfSVhVU1IgMDAxMDAKKworI2RlZmluZSBMSU5VWF9TX0lSV1hHIDAwMDcwCisjZGVmaW5lIExJTlVYX1NfSVJHUlAgMDAwNDAKKyNkZWZpbmUgTElOVVhfU19JV0dSUCAwMDAyMAorI2RlZmluZSBMSU5VWF9TX0lYR1JQIDAwMDEwCisKKyNkZWZpbmUgTElOVVhfU19JUldYTyAwMDAwNworI2RlZmluZSBMSU5VWF9TX0lST1RIIDAwMDA0CisjZGVmaW5lIExJTlVYX1NfSVdPVEggMDAwMDIKKyNkZWZpbmUgTElOVVhfU19JWE9USCAwMDAwMQorCisjZGVmaW5lIExJTlVYX1NfSVNMTksobSkJKCgobSkgJiBMSU5VWF9TX0lGTVQpID09IExJTlVYX1NfSUZMTkspCisjZGVmaW5lIExJTlVYX1NfSVNSRUcobSkJKCgobSkgJiBMSU5VWF9TX0lGTVQpID09IExJTlVYX1NfSUZSRUcpCisjZGVmaW5lIExJTlVYX1NfSVNESVIobSkJKCgobSkgJiBMSU5VWF9TX0lGTVQpID09IExJTlVYX1NfSUZESVIpCisjZGVmaW5lIExJTlVYX1NfSVNDSFIobSkJKCgobSkgJiBMSU5VWF9TX0lGTVQpID09IExJTlVYX1NfSUZDSFIpCisjZGVmaW5lIExJTlVYX1NfSVNCTEsobSkJKCgobSkgJiBMSU5VWF9TX0lGTVQpID09IExJTlVYX1NfSUZCTEspCisjZGVmaW5lIExJTlVYX1NfSVNGSUZPKG0pCSgoKG0pICYgTElOVVhfU19JRk1UKSA9PSBMSU5VWF9TX0lGSUZPKQorI2RlZmluZSBMSU5VWF9TX0lTU09DSyhtKQkoKChtKSAmIExJTlVYX1NfSUZNVCkgPT0gTElOVVhfU19JRlNPQ0spCisKKy8qCisgKiBleHQyIHNpemUgb2YgYW4gaW5vZGUKKyAqLworI2RlZmluZSBFWFQyX0lfU0laRShpKQkoKGkpLT5pX3NpemUgfCAoKF9fdTY0KSAoaSktPmlfc2l6ZV9oaWdoIDw8IDMyKSkKKworLyoKKyAqIGV4dDJfaWNvdW50X3QgYWJzdHJhY3Rpb24KKyAqLworI2RlZmluZSBFWFQyX0lDT1VOVF9PUFRfSU5DUkVNRU5UCTB4MDEKKwordHlwZWRlZiBzdHJ1Y3QgZXh0Ml9pY291bnQgKmV4dDJfaWNvdW50X3Q7CisKKy8qCisgKiBGbGFncyBmb3IgZXh0MmZzX2JtYXAKKyAqLworI2RlZmluZSBCTUFQX0FMTE9DCTB4MDAwMQorI2RlZmluZSBCTUFQX1NFVAkweDAwMDIKKworLyoKKyAqIEZsYWdzIGZvciBpbWFnZXIuYyBmdW5jdGlvbnMKKyAqLworI2RlZmluZSBJTUFHRVJfRkxBR19JTk9ERU1BUAkxCisjZGVmaW5lIElNQUdFUl9GTEFHX1NQQVJTRVdSSVRFCTIKKworLyoKKyAqIEZvciBjaGVja2luZyBzdHJ1Y3R1cmUgbWFnaWMgbnVtYmVycy4uLgorICovCisKKyNkZWZpbmUgRVhUMl9DSEVDS19NQUdJQyhzdHJ1Y3QsIGNvZGUpIFwKKwkgIGlmICgoc3RydWN0KS0+bWFnaWMgIT0gKGNvZGUpKSByZXR1cm4gKGNvZGUpCisKKworLyoKKyAqIEZvciBleHQyIGNvbXByZXNzaW9uIHN1cHBvcnQKKyAqLworI2RlZmluZSBFWFQyRlNfQ09NUFJFU1NFRF9CTEtBRERSICgoYmxrX3QpIDB4ZmZmZmZmZmYpCisjZGVmaW5lIEhPTEVfQkxLQUREUihfYikgKChfYikgPT0gMCB8fCAoX2IpID09IEVYVDJGU19DT01QUkVTU0VEX0JMS0FERFIpCisKKy8qCisgKiBGZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CisgKi8KKyNkZWZpbmUgRVhUMl9MSUJfRkVBVFVSRV9DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0N8XAorCQkJCQkgRVhUMl9GRUFUVVJFX0NPTVBBVF9JTUFHSUNfSU5PREVTfFwKKwkJCQkJIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUx8XAorCQkJCQkgRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREV8XAorCQkJCQkgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVh8XAorCQkJCQkgRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUikKKworLyogVGhpcyAjaWZkZWYgaXMgdGVtcG9yYXJ5IHVudGlsIGNvbXByZXNzaW9uIGlzIGZ1bGx5IHN1cHBvcnRlZCAqLworI2lmZGVmIEVOQUJMRV9DT01QUkVTU0lPTgorI2lmbmRlZiBJX0tOT1dfVEhBVF9DT01QUkVTU0lPTl9JU19FWFBFUklNRU5UQUwKKy8qIElmIHRoZSBiZWxvdyB3YXJuaW5nIGJ1Z3MgeW91LCB0aGVuIGhhdmUKKyAgIGBDUFBGTEFHUz0tRElfS05PV19USEFUX0NPTVBSRVNTSU9OX0lTX0VYUEVSSU1FTlRBTCcgaW4geW91cgorICAgZW52aXJvbm1lbnQgYXQgY29uZmlndXJlIHRpbWUuICovCisgI3dhcm5pbmcgIkNvbXByZXNzaW9uIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsIgorI2VuZGlmCisjZGVmaW5lIEVYVDJfTElCX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFfFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTnxcCisJCQkJCSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVZ8XAorCQkJCQkgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkd8XAorCQkJCQkgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpCisjZWxzZQorI2RlZmluZSBFWFQyX0xJQl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRXxcCisJCQkJCSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVZ8XAorCQkJCQkgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkd8XAorCQkJCQkgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpCisjZW5kaWYKKyNkZWZpbmUgRVhUMl9MSUJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8XAorCQkJCQkgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFKQorLyoKKyAqIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworCisvKiBhbGxvYy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19uZXdfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgZGlyLCBpbnQgbW9kZSwKKwkJCQkgIGV4dDJmc19pbm9kZV9iaXRtYXAgbWFwLCBleHQyX2lub190ICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfbmV3X2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBnb2FsLAorCQkJCSAgZXh0MmZzX2Jsb2NrX2JpdG1hcCBtYXAsIGJsa190ICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZ2V0X2ZyZWVfYmxvY2tzKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBzdGFydCwKKwkJCQkJYmxrX3QgZmluaXNoLCBpbnQgbnVtLAorCQkJCQlleHQyZnNfYmxvY2tfYml0bWFwIG1hcCwKKwkJCQkJYmxrX3QgKnJldCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19hbGxvY19ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgZ29hbCwKKwkJCQkgICAgY2hhciAqYmxvY2tfYnVmLCBibGtfdCAqcmV0KTsKKworLyogYWxsb2Nfc2IuYyAqLworZXh0ZXJuIGludCBleHQyZnNfcmVzZXJ2ZV9zdXBlcl9hbmRfYmdkKGV4dDJfZmlsc3lzIGZzLAorCQkJCQlkZ3JwX3QgZ3JvdXAsCisJCQkJCWV4dDJmc19ibG9ja19iaXRtYXAgYm1hcCk7CisKKy8qIGFsbG9jX3N0YXRzLmMgKi8KK3ZvaWQgZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywgaW50IGludXNlKTsKK3ZvaWQgZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzMihleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgICAgaW50IGludXNlLCBpbnQgaXNkaXIpOwordm9pZCBleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsaywgaW50IGludXNlKTsKKworLyogYWxsb2NfdGFibGVzLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2FsbG9jYXRlX3RhYmxlcyhleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV9ncm91cF90YWJsZShleHQyX2ZpbHN5cyBmcywgZGdycF90IGdyb3VwLAorCQkJCQkgICAgIGV4dDJmc19ibG9ja19iaXRtYXAgYm1hcCk7CisKKy8qIGJhZGJsb2Nrcy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc191MzJfbGlzdF9jcmVhdGUoZXh0Ml91MzJfbGlzdCAqcmV0LCBpbnQgc2l6ZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc191MzJfbGlzdF9hZGQoZXh0Ml91MzJfbGlzdCBiYiwgX191MzIgYmxrKTsKK2V4dGVybiBpbnQgZXh0MmZzX3UzMl9saXN0X2ZpbmQoZXh0Ml91MzJfbGlzdCBiYiwgX191MzIgYmxrKTsKK2V4dGVybiBpbnQgZXh0MmZzX3UzMl9saXN0X3Rlc3QoZXh0Ml91MzJfbGlzdCBiYiwgYmxrX3QgYmxrKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3UzMl9saXN0X2l0ZXJhdGVfYmVnaW4oZXh0Ml91MzJfbGlzdCBiYiwKKwkJCQkJICAgICAgIGV4dDJfdTMyX2l0ZXJhdGUgKnJldCk7CitleHRlcm4gaW50IGV4dDJmc191MzJfbGlzdF9pdGVyYXRlKGV4dDJfdTMyX2l0ZXJhdGUgaXRlciwgYmxrX3QgKmJsayk7CitleHRlcm4gdm9pZCBleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZV9lbmQoZXh0Ml91MzJfaXRlcmF0ZSBpdGVyKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3UzMl9jb3B5KGV4dDJfdTMyX2xpc3Qgc3JjLCBleHQyX3UzMl9saXN0ICpkZXN0KTsKK2V4dGVybiBpbnQgZXh0MmZzX3UzMl9saXN0X2VxdWFsKGV4dDJfdTMyX2xpc3QgYmIxLCBleHQyX3UzMl9saXN0IGJiMik7CisKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2NyZWF0ZShleHQyX2JhZGJsb2Nrc19saXN0ICpyZXQsCisJCQkJCSAgICBpbnQgc2l6ZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19iYWRibG9ja3NfbGlzdF9hZGQoZXh0Ml9iYWRibG9ja3NfbGlzdCBiYiwKKwkJCQkJICAgYmxrX3QgYmxrKTsKK2V4dGVybiBpbnQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X3Rlc3QoZXh0Ml9iYWRibG9ja3NfbGlzdCBiYiwKKwkJCQkgICAgYmxrX3QgYmxrKTsKK2V4dGVybiBpbnQgZXh0MmZzX3UzMl9saXN0X2RlbChleHQyX3UzMl9saXN0IGJiLCBfX3UzMiBibGspOworZXh0ZXJuIHZvaWQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2RlbChleHQyX3UzMl9saXN0IGJiLCBfX3UzMiBibGspOworZXh0ZXJuIGVycmNvZGVfdAorCWV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2JlZ2luKGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIsCisJCQkJCSAgICBleHQyX2JhZGJsb2Nrc19pdGVyYXRlICpyZXQpOworZXh0ZXJuIGludCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZShleHQyX2JhZGJsb2Nrc19pdGVyYXRlIGl0ZXIsCisJCQkJCSBibGtfdCAqYmxrKTsKK2V4dGVybiB2b2lkIGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2VuZChleHQyX2JhZGJsb2Nrc19pdGVyYXRlIGl0ZXIpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYmFkYmxvY2tzX2NvcHkoZXh0Ml9iYWRibG9ja3NfbGlzdCBzcmMsCisJCQkJICAgICAgIGV4dDJfYmFkYmxvY2tzX2xpc3QgKmRlc3QpOworZXh0ZXJuIGludCBleHQyZnNfYmFkYmxvY2tzX2VxdWFsKGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIxLAorCQkJCSAgZXh0Ml9iYWRibG9ja3NfbGlzdCBiYjIpOworZXh0ZXJuIGludCBleHQyZnNfdTMyX2xpc3RfY291bnQoZXh0Ml91MzJfbGlzdCBiYik7CisKKy8qIGJiX2NvbXBhdCAqLworZXh0ZXJuIGVycmNvZGVfdCBiYWRibG9ja3NfbGlzdF9jcmVhdGUoYmFkYmxvY2tzX2xpc3QgKnJldCwgaW50IHNpemUpOworZXh0ZXJuIGVycmNvZGVfdCBiYWRibG9ja3NfbGlzdF9hZGQoYmFkYmxvY2tzX2xpc3QgYmIsIGJsa190IGJsayk7CitleHRlcm4gaW50IGJhZGJsb2Nrc19saXN0X3Rlc3QoYmFkYmxvY2tzX2xpc3QgYmIsIGJsa190IGJsayk7CitleHRlcm4gZXJyY29kZV90IGJhZGJsb2Nrc19saXN0X2l0ZXJhdGVfYmVnaW4oYmFkYmxvY2tzX2xpc3QgYmIsCisJCQkJCSAgICAgIGJhZGJsb2Nrc19pdGVyYXRlICpyZXQpOworZXh0ZXJuIGludCBiYWRibG9ja3NfbGlzdF9pdGVyYXRlKGJhZGJsb2Nrc19pdGVyYXRlIGl0ZXIsIGJsa190ICpibGspOworZXh0ZXJuIHZvaWQgYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZV9lbmQoYmFkYmxvY2tzX2l0ZXJhdGUgaXRlcik7CitleHRlcm4gdm9pZCBiYWRibG9ja3NfbGlzdF9mcmVlKGJhZGJsb2Nrc19saXN0IGJiKTsKKworLyogYmJfaW5vZGUuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfdXBkYXRlX2JiX2lub2RlKGV4dDJfZmlsc3lzIGZzLAorCQkJCQlleHQyX2JhZGJsb2Nrc19saXN0IGJiX2xpc3QpOworCisvKiBiaXRtYXBzLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2lub2RlX2JpdG1hcChleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc193cml0ZV9ibG9ja19iaXRtYXAgKGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3JlYWRfaW5vZGVfYml0bWFwIChleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2Jsb2NrX2JpdG1hcChleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV9nZW5lcmljX2JpdG1hcChfX3UzMiBzdGFydCwKKwkJCQkJCV9fdTMyIGVuZCwKKwkJCQkJCV9fdTMyIHJlYWxfZW5kLAorCQkJCQkJY29uc3QgY2hhciAqZGVzY3IsCisJCQkJCQlleHQyZnNfZ2VuZXJpY19iaXRtYXAgKnJldCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV9ibG9ja19iaXRtYXAoZXh0Ml9maWxzeXMgZnMsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmRlc2NyLAorCQkJCQkgICAgICBleHQyZnNfYmxvY2tfYml0bWFwICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpkZXNjciwKKwkJCQkJICAgICAgZXh0MmZzX2lub2RlX2JpdG1hcCAqcmV0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2Z1ZGdlX2lub2RlX2JpdG1hcF9lbmQoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgICAgICBleHQyX2lub190IGVuZCwgZXh0Ml9pbm9fdCAqb2VuZCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19mdWRnZV9ibG9ja19iaXRtYXBfZW5kKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgICAgYmxrX3QgZW5kLCBibGtfdCAqb2VuZCk7CitleHRlcm4gdm9pZCBleHQyZnNfY2xlYXJfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwKTsKK2V4dGVybiB2b2lkIGV4dDJmc19jbGVhcl9ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXApOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9iaXRtYXBzKGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2JpdG1hcHMoZXh0Ml9maWxzeXMgZnMpOworCisvKiBibG9jay5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19ibG9ja19pdGVyYXRlKGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgICAgIGV4dDJfaW5vX3QJaW5vLAorCQkJCSAgICAgIGludAlmbGFncywKKwkJCQkgICAgICBjaGFyICpibG9ja19idWYsCisJCQkJICAgICAgaW50ICgqZnVuYykoZXh0Ml9maWxzeXMgZnMsCisJCQkJCQkgIGJsa190CSpibG9ja25yLAorCQkJCQkJICBpbnQJYmxvY2tjbnQsCisJCQkJCQkgIHZvaWQJKnByaXZfZGF0YSksCisJCQkJICAgICAgdm9pZCAqcHJpdl9kYXRhKTsKK2VycmNvZGVfdCBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZXh0Ml9maWxzeXMgZnMsCisJCQkJZXh0Ml9pbm9fdAlpbm8sCisJCQkJaW50CWZsYWdzLAorCQkJCWNoYXIgKmJsb2NrX2J1ZiwKKwkJCQlpbnQgKCpmdW5jKShleHQyX2ZpbHN5cyBmcywKKwkJCQkJICAgIGJsa190CSpibG9ja25yLAorCQkJCQkgICAgZTJfYmxrY250X3QJYmxvY2tjbnQsCisJCQkJCSAgICBibGtfdAlyZWZfYmxrLAorCQkJCQkgICAgaW50CQlyZWZfb2Zmc2V0LAorCQkJCQkgICAgdm9pZAkqcHJpdl9kYXRhKSwKKwkJCQl2b2lkICpwcml2X2RhdGEpOworCisvKiBibWFwLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2JtYXAoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsCisJCQkgICAgIGNoYXIgKmJsb2NrX2J1ZiwgaW50IGJtYXBfZmxhZ3MsCisJCQkgICAgIGJsa190IGJsb2NrLCBibGtfdCAqcGh5c19ibGspOworCisKKyNpZiAwCisvKiBibW92ZS5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19tb3ZlX2Jsb2NrcyhleHQyX2ZpbHN5cyBmcywKKwkJCQkgICAgZXh0MmZzX2Jsb2NrX2JpdG1hcCByZXNlcnZlLAorCQkJCSAgICBleHQyZnNfYmxvY2tfYml0bWFwIGFsbG9jX21hcCwKKwkJCQkgICAgaW50IGZsYWdzKTsKKyNlbmRpZgorCisvKiBjaGVja19kZXNjLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX2Rlc2MoZXh0Ml9maWxzeXMgZnMpOworCisvKiBjbG9zZWZzLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2Nsb3NlKGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZsdXNoKGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiBpbnQgZXh0MmZzX2JnX2hhc19zdXBlcihleHQyX2ZpbHN5cyBmcywgaW50IGdyb3VwX2Jsb2NrKTsKK2V4dGVybiBpbnQgZXh0MmZzX3N1cGVyX2FuZF9iZ2RfbG9jKGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgICBkZ3JwX3QgZ3JvdXAsCisJCQkJICAgIGJsa190ICpyZXRfc3VwZXJfYmxrLAorCQkJCSAgICBibGtfdCAqcmV0X29sZF9kZXNjX2JsaywKKwkJCQkgICAgYmxrX3QgKnJldF9uZXdfZGVzY19ibGssCisJCQkJICAgIGludCAqcmV0X21ldGFfYmcpOworZXh0ZXJuIHZvaWQgZXh0MmZzX3VwZGF0ZV9keW5hbWljX3JldihleHQyX2ZpbHN5cyBmcyk7CisKKy8qIGNtcF9iaXRtYXBzLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2NvbXBhcmVfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYm0xLAorCQkJCQkgICAgIGV4dDJmc19ibG9ja19iaXRtYXAgYm0yKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2NvbXBhcmVfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYm0xLAorCQkJCQkgICAgIGV4dDJmc19pbm9kZV9iaXRtYXAgYm0yKTsKKworLyogZGJsaXN0LmMgKi8KKworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZ2V0X251bV9kaXJzKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190ICpyZXRfbnVtX2RpcnMpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaW5pdF9kYmxpc3QoZXh0Ml9maWxzeXMgZnMsIGV4dDJfZGJsaXN0ICpyZXRfZGJsaXN0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2FkZF9kaXJfYmxvY2soZXh0Ml9kYmxpc3QgZGJsaXN0LCBleHQyX2lub190IGlubywKKwkJCQkgICAgICBibGtfdCBibGssIGludCBibG9ja2NudCk7CitleHRlcm4gdm9pZCBleHQyZnNfZGJsaXN0X3NvcnQoZXh0Ml9kYmxpc3QgZGJsaXN0LAorCQkJICAgICAgIGludCAoKnNvcnRmdW5jKShjb25zdCB2b2lkICosCisJCQkJCQkJICAgY29uc3Qgdm9pZCAqKSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19kYmxpc3RfaXRlcmF0ZShleHQyX2RibGlzdCBkYmxpc3QsCisJaW50ICgqZnVuYykoZXh0Ml9maWxzeXMgZnMsIHN0cnVjdCBleHQyX2RiX2VudHJ5ICpkYl9pbmZvLAorCQkgICAgdm9pZAkqcHJpdl9kYXRhKSwKKyAgICAgICB2b2lkICpwcml2X2RhdGEpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfc2V0X2Rpcl9ibG9jayhleHQyX2RibGlzdCBkYmxpc3QsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgICAgIGJsa190IGJsaywgaW50IGJsb2NrY250KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2NvcHlfZGJsaXN0KGV4dDJfZGJsaXN0IHNyYywKKwkJCQkgICAgZXh0Ml9kYmxpc3QgKmRlc3QpOworZXh0ZXJuIGludCBleHQyZnNfZGJsaXN0X2NvdW50KGV4dDJfZGJsaXN0IGRibGlzdCk7CisKKy8qIGRibGlzdF9kaXIuYyAqLworZXh0ZXJuIGVycmNvZGVfdAorCWV4dDJmc19kYmxpc3RfZGlyX2l0ZXJhdGUoZXh0Ml9kYmxpc3QgZGJsaXN0LAorCQkJCSAgaW50CWZsYWdzLAorCQkJCSAgY2hhcgkqYmxvY2tfYnVmLAorCQkJCSAgaW50ICgqZnVuYykoZXh0Ml9pbm9fdAlkaXIsCisJCQkJCSAgICAgIGludAkJZW50cnksCisJCQkJCSAgICAgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkJCQkgICAgICBpbnQJb2Zmc2V0LAorCQkJCQkgICAgICBpbnQJYmxvY2tzaXplLAorCQkJCQkgICAgICBjaGFyCSpidWYsCisJCQkJCSAgICAgIHZvaWQJKnByaXZfZGF0YSksCisJCQkJICB2b2lkICpwcml2X2RhdGEpOworCisvKiBkaXJibG9jay5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2Rpcl9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxvY2ssCisJCQkJICAgICAgIHZvaWQgKmJ1Zik7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2Rpcl9ibG9jazIoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLAorCQkJCQl2b2lkICpidWYsIGludCBmbGFncyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc193cml0ZV9kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLAorCQkJCQl2b2lkICpidWYpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrMihleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxvY2ssCisJCQkJCSB2b2lkICpidWYsIGludCBmbGFncyk7CisKKy8qIGRpcmhhc2guYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZGlyaGFzaChpbnQgdmVyc2lvbiwgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCQljb25zdCBfX3UzMiAqc2VlZCwKKwkJCQlleHQyX2Rpcmhhc2hfdCAqcmV0X2hhc2gsCisJCQkJZXh0Ml9kaXJoYXNoX3QgKnJldF9taW5vcl9oYXNoKTsKKworCisvKiBkaXJfaXRlcmF0ZS5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19kaXJfaXRlcmF0ZShleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgIGV4dDJfaW5vX3QgZGlyLAorCQkJICAgICAgaW50IGZsYWdzLAorCQkJICAgICAgY2hhciAqYmxvY2tfYnVmLAorCQkJICAgICAgaW50ICgqZnVuYykoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCQkJCSAgaW50CW9mZnNldCwKKwkJCQkJICBpbnQJYmxvY2tzaXplLAorCQkJCQkgIGNoYXIJKmJ1ZiwKKwkJCQkJICB2b2lkCSpwcml2X2RhdGEpLAorCQkJICAgICAgdm9pZCAqcHJpdl9kYXRhKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2Rpcl9pdGVyYXRlMihleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgIGV4dDJfaW5vX3QgZGlyLAorCQkJICAgICAgaW50IGZsYWdzLAorCQkJICAgICAgY2hhciAqYmxvY2tfYnVmLAorCQkJICAgICAgaW50ICgqZnVuYykoZXh0Ml9pbm9fdAlkaXIsCisJCQkJCSAgaW50CWVudHJ5LAorCQkJCQkgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkJCQkgIGludAlvZmZzZXQsCisJCQkJCSAgaW50CWJsb2Nrc2l6ZSwKKwkJCQkJICBjaGFyCSpidWYsCisJCQkJCSAgdm9pZAkqcHJpdl9kYXRhKSwKKwkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSk7CisKKy8qIGR1cGZzLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2R1cF9oYW5kbGUoZXh0Ml9maWxzeXMgc3JjLCBleHQyX2ZpbHN5cyAqZGVzdCk7CisKKy8qIGV4cGFuZGRpci5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19leHBhbmRfZGlyKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpcik7CisKKy8qIGV4dF9hdHRyLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3JlYWRfZXh0X2F0dHIoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLCB2b2lkICpidWYpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfd3JpdGVfZXh0X2F0dHIoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLAorCQkJCSAgICAgICB2b2lkICpidWYpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYWRqdXN0X2VhX3JlZmNvdW50KGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGssCisJCQkJCSAgIGNoYXIgKmJsb2NrX2J1ZiwKKwkJCQkJICAgaW50IGFkanVzdCwgX191MzIgKm5ld2NvdW50KTsKKworLyogZmlsZWlvLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfb3BlbjIoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSwKKwkJCQkgICBpbnQgZmxhZ3MsIGV4dDJfZmlsZV90ICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZmlsZV9vcGVuKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkgIGludCBmbGFncywgZXh0Ml9maWxlX3QgKnJldCk7CitleHRlcm4gZXh0Ml9maWxzeXMgZXh0MmZzX2ZpbGVfZ2V0X2ZzKGV4dDJfZmlsZV90IGZpbGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZmlsZV9jbG9zZShleHQyX2ZpbGVfdCBmaWxlKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfZmx1c2goZXh0Ml9maWxlX3QgZmlsZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19maWxlX3JlYWQoZXh0Ml9maWxlX3QgZmlsZSwgdm9pZCAqYnVmLAorCQkJCSAgdW5zaWduZWQgaW50IHdhbnRlZCwgdW5zaWduZWQgaW50ICpnb3QpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZmlsZV93cml0ZShleHQyX2ZpbGVfdCBmaWxlLCBjb25zdCB2b2lkICpidWYsCisJCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdW5zaWduZWQgaW50ICp3cml0dGVuKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfbGxzZWVrKGV4dDJfZmlsZV90IGZpbGUsIF9fdTY0IG9mZnNldCwKKwkJCQkgICBpbnQgd2hlbmNlLCBfX3U2NCAqcmV0X3Bvcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19maWxlX2xzZWVrKGV4dDJfZmlsZV90IGZpbGUsIGV4dDJfb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgIGludCB3aGVuY2UsIGV4dDJfb2ZmX3QgKnJldF9wb3MpOworZXJyY29kZV90IGV4dDJmc19maWxlX2dldF9sc2l6ZShleHQyX2ZpbGVfdCBmaWxlLCBfX3U2NCAqcmV0X3NpemUpOworZXh0ZXJuIGV4dDJfb2ZmX3QgZXh0MmZzX2ZpbGVfZ2V0X3NpemUoZXh0Ml9maWxlX3QgZmlsZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19maWxlX3NldF9zaXplKGV4dDJfZmlsZV90IGZpbGUsIGV4dDJfb2ZmX3Qgc2l6ZSk7CisKKy8qIGZpbmRkZXYuYyAqLworZXh0ZXJuIGNoYXIgKmV4dDJmc19maW5kX2Jsb2NrX2RldmljZShkZXZfdCBkZXZpY2UpOworCisvKiBmbHVzaGIuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfc3luY19kZXZpY2UoaW50IGZkLCBpbnQgZmx1c2hiKTsKKworLyogZnJlZWZzLmMgKi8KK2V4dGVybiB2b2lkIGV4dDJmc19mcmVlKGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiB2b2lkIGV4dDJmc19mcmVlX2dlbmVyaWNfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwKTsKK2V4dGVybiB2b2lkIGV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCk7CitleHRlcm4gdm9pZCBleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXApOworZXh0ZXJuIHZvaWQgZXh0MmZzX2ZyZWVfZGJsaXN0KGV4dDJfZGJsaXN0IGRibGlzdCk7CitleHRlcm4gdm9pZCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfZnJlZShleHQyX2JhZGJsb2Nrc19saXN0IGJiKTsKK2V4dGVybiB2b2lkIGV4dDJmc191MzJfbGlzdF9mcmVlKGV4dDJfdTMyX2xpc3QgYmIpOworCisvKiBnZXRzaXplLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2dldF9kZXZpY2Vfc2l6ZShjb25zdCBjaGFyICpmaWxlLCBpbnQgYmxvY2tzaXplLAorCQkJCQlibGtfdCAqcmV0YmxvY2tzKTsKKworLyogZ2V0c2VjdHNpemUuYyAqLworZXJyY29kZV90IGV4dDJmc19nZXRfZGV2aWNlX3NlY3RzaXplKGNvbnN0IGNoYXIgKmZpbGUsIGludCAqc2VjdHNpemUpOworCisvKiBpbWFnZXIuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaW1hZ2VfaW5vZGVfd3JpdGUoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwgaW50IGZsYWdzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ltYWdlX2lub2RlX3JlYWQoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwgaW50IGZsYWdzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ltYWdlX3N1cGVyX3dyaXRlKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsIGludCBmbGFncyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pbWFnZV9zdXBlcl9yZWFkKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsIGludCBmbGFncyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pbWFnZV9iaXRtYXBfd3JpdGUoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwgaW50IGZsYWdzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ltYWdlX2JpdG1hcF9yZWFkKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsIGludCBmbGFncyk7CisKKy8qIGluZF9ibG9jay5jICovCitlcnJjb2RlX3QgZXh0MmZzX3JlYWRfaW5kX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGssIHZvaWQgKmJ1Zik7CitlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2luZF9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxrLCB2b2lkICpidWYpOworCisvKiBpbml0aWFsaXplLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2luaXRpYWxpemUoY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLAorCQkJCSAgIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpwYXJhbSwKKwkJCQkgICBpb19tYW5hZ2VyIG1hbmFnZXIsIGV4dDJfZmlsc3lzICpyZXRfZnMpOworCisvKiBpY291bnQuYyAqLworZXh0ZXJuIHZvaWQgZXh0MmZzX2ZyZWVfaWNvdW50KGV4dDJfaWNvdW50X3QgaWNvdW50KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2NyZWF0ZV9pY291bnQyKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmxhZ3MsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgICBleHQyX2ljb3VudF90IGhpbnQsIGV4dDJfaWNvdW50X3QgKnJldCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jcmVhdGVfaWNvdW50KGV4dDJfZmlsc3lzIGZzLCBpbnQgZmxhZ3MsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJICAgICAgZXh0Ml9pY291bnRfdCAqcmV0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF9mZXRjaChleHQyX2ljb3VudF90IGljb3VudCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICAgICBfX3UxNiAqcmV0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF9pbmNyZW1lbnQoZXh0Ml9pY291bnRfdCBpY291bnQsIGV4dDJfaW5vX3QgaW5vLAorCQkJCQkgX191MTYgKnJldCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pY291bnRfZGVjcmVtZW50KGV4dDJfaWNvdW50X3QgaWNvdW50LCBleHQyX2lub190IGlubywKKwkJCQkJIF9fdTE2ICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaWNvdW50X3N0b3JlKGV4dDJfaWNvdW50X3QgaWNvdW50LCBleHQyX2lub190IGlubywKKwkJCQkgICAgIF9fdTE2IGNvdW50KTsKK2V4dGVybiBleHQyX2lub190IGV4dDJmc19nZXRfaWNvdW50X3NpemUoZXh0Ml9pY291bnRfdCBpY291bnQpOworZXJyY29kZV90IGV4dDJmc19pY291bnRfdmFsaWRhdGUoZXh0Ml9pY291bnRfdCBpY291bnQsIEZJTEUgKik7CisKKy8qIGlub2RlLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZsdXNoX2ljYWNoZShleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19nZXRfbmV4dF9pbm9kZV9mdWxsKGV4dDJfaW5vZGVfc2NhbiBzY2FuLAorCQkJCQkgICAgZXh0Ml9pbm9fdCAqaW5vLAorCQkJCQkgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLAorCQkJCQkgICAgaW50IGJ1ZnNpemUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfb3Blbl9pbm9kZV9zY2FuKGV4dDJfZmlsc3lzIGZzLCBpbnQgYnVmZmVyX2Jsb2NrcywKKwkJCQkgIGV4dDJfaW5vZGVfc2NhbiAqcmV0X3NjYW4pOworZXh0ZXJuIHZvaWQgZXh0MmZzX2Nsb3NlX2lub2RlX3NjYW4oZXh0Ml9pbm9kZV9zY2FuIHNjYW4pOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZ2V0X25leHRfaW5vZGUoZXh0Ml9pbm9kZV9zY2FuIHNjYW4sIGV4dDJfaW5vX3QgKmlubywKKwkJCSAgICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaW5vZGVfc2Nhbl9nb3RvX2Jsb2NrZ3JvdXAoZXh0Ml9pbm9kZV9zY2FuIHNjYW4sCisJCQkJCQkgICBpbnQJZ3JvdXApOworZXh0ZXJuIHZvaWQgZXh0MmZzX3NldF9pbm9kZV9jYWxsYmFjaworCShleHQyX2lub2RlX3NjYW4gc2NhbiwKKwkgZXJyY29kZV90ICgqZG9uZV9ncm91cCkoZXh0Ml9maWxzeXMgZnMsCisJCQkJIGRncnBfdCBncm91cCwKKwkJCQkgdm9pZCAqIHByaXZfZGF0YSksCisJIHZvaWQgKmRvbmVfZ3JvdXBfZGF0YSk7CitleHRlcm4gaW50IGV4dDJmc19pbm9kZV9zY2FuX2ZsYWdzKGV4dDJfaW5vZGVfc2NhbiBzY2FuLCBpbnQgc2V0X2ZsYWdzLAorCQkJCSAgIGludCBjbGVhcl9mbGFncyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2lub2RlX2Z1bGwoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCQlzdHJ1Y3QgZXh0Ml9pbm9kZSAqIGlub2RlLAorCQkJCQlpbnQgYnVmc2l6ZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2lub2RlIChleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc193cml0ZV9pbm9kZV9mdWxsKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkJIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUsCisJCQkJCSBpbnQgYnVmc2l6ZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc193cml0ZV9pbm9kZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc193cml0ZV9uZXdfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZ2V0X2Jsb2NrcyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sIGJsa190ICpibG9ja3MpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfY2hlY2tfZGlyZWN0b3J5KGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubyk7CisKKy8qIGlub2RlX2lvLmMgKi8KK2V4dGVybiBpb19tYW5hZ2VyIGlub2RlX2lvX21hbmFnZXI7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pbm9kZV9pb19pbnRlcm4oZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCQljaGFyICoqbmFtZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pbm9kZV9pb19pbnRlcm4yKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkJIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSwKKwkJCQkJIGNoYXIgKipuYW1lKTsKKworLyogaXNtb3VudGVkLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQoY29uc3QgY2hhciAqZmlsZSwgaW50ICptb3VudF9mbGFncyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jaGVja19tb3VudF9wb2ludChjb25zdCBjaGFyICpkZXZpY2UsIGludCAqbW91bnRfZmxhZ3MsCisJCQkJCSAgY2hhciAqbXRwdCwgaW50IG10bGVuKTsKKworLyogbmFtZWkuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfbG9va3VwKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBpbnQgbmFtZWxlbiwgY2hhciAqYnVmLCBleHQyX2lub190ICppbm9kZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19uYW1laShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCByb290LCBleHQyX2lub190IGN3ZCwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIGV4dDJfaW5vX3QgKmlub2RlKTsKK2VycmNvZGVfdCBleHQyZnNfbmFtZWlfZm9sbG93KGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHJvb3QsIGV4dDJfaW5vX3QgY3dkLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgZXh0Ml9pbm9fdCAqaW5vZGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZm9sbG93X2xpbmsoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3Qgcm9vdCwgZXh0Ml9pbm9fdCBjd2QsCisJCQlleHQyX2lub190IGlub2RlLCBleHQyX2lub190ICpyZXNfaW5vZGUpOworCisvKiBuYXRpdmUuYyAqLworaW50IGV4dDJmc19uYXRpdmVfZmxhZyh2b2lkKTsKKworLyogbmV3ZGlyLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX25ld19kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgZGlyX2lubywKKwkJCQlleHQyX2lub190IHBhcmVudF9pbm8sIGNoYXIgKipibG9jayk7CisKKy8qIG1rZGlyLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX21rZGlyKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHBhcmVudCwgZXh0Ml9pbm9fdCBpbnVtLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIG1ram91cm5hbC5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jcmVhdGVfam91cm5hbF9zdXBlcmJsb2NrKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkJICBfX3UzMiBzaXplLCBpbnQgZmxhZ3MsCisJCQkJCQkgIGNoYXIgICoqcmV0X2pzYik7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19hZGRfam91cm5hbF9kZXZpY2UoZXh0Ml9maWxzeXMgZnMsCisJCQkJCSAgIGV4dDJfZmlsc3lzIGpvdXJuYWxfZGV2KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2FkZF9qb3VybmFsX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBzaXplLAorCQkJCQkgIGludCBmbGFncyk7CisKKy8qIG9wZW5mcy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19vcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywgaW50IHN1cGVyYmxvY2ssCisJCQkgICAgIHVuc2lnbmVkIGludCBibG9ja19zaXplLCBpb19tYW5hZ2VyIG1hbmFnZXIsCisJCQkgICAgIGV4dDJfZmlsc3lzICpyZXRfZnMpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfb3BlbjIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaW9fb3B0aW9ucywKKwkJCSAgICAgIGludCBmbGFncywgaW50IHN1cGVyYmxvY2ssCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwgaW9fbWFuYWdlciBtYW5hZ2VyLAorCQkJICAgICAgZXh0Ml9maWxzeXMgKnJldF9mcyk7CitleHRlcm4gYmxrX3QgZXh0MmZzX2Rlc2NyaXB0b3JfYmxvY2tfbG9jKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBncm91cF9ibG9jaywKKwkJCQkJIGRncnBfdCBpKTsKK2VycmNvZGVfdCBleHQyZnNfZ2V0X2RhdGFfaW8oZXh0Ml9maWxzeXMgZnMsIGlvX2NoYW5uZWwgKm9sZF9pbyk7CitlcnJjb2RlX3QgZXh0MmZzX3NldF9kYXRhX2lvKGV4dDJfZmlsc3lzIGZzLCBpb19jaGFubmVsIG5ld19pbyk7CitlcnJjb2RlX3QgZXh0MmZzX3Jld3JpdGVfdG9faW8oZXh0Ml9maWxzeXMgZnMsIGlvX2NoYW5uZWwgbmV3X2lvKTsKKworLyogZ2V0X3BhdGhuYW1lLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2dldF9wYXRobmFtZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgICAgIGNoYXIgKipuYW1lKTsKKworLyogbGluay5jICovCitlcnJjb2RlX3QgZXh0MmZzX2xpbmsoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgZGlyLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICBleHQyX2lub190IGlubywgaW50IGZsYWdzKTsKK2VycmNvZGVfdCBleHQyZnNfdW5saW5rKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCWV4dDJfaW5vX3QgaW5vLCBpbnQgZmxhZ3MpOworCisvKiByZWFkX2JiLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3JlYWRfYmJfaW5vZGUoZXh0Ml9maWxzeXMgZnMsCisJCQkJICAgICAgZXh0Ml9iYWRibG9ja3NfbGlzdCAqYmJfbGlzdCk7CisKKy8qIHJlYWRfYmJfZmlsZS5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2JiX0ZJTEUyKGV4dDJfZmlsc3lzIGZzLCBGSUxFICpmLAorCQkJCSAgICAgIGV4dDJfYmFkYmxvY2tzX2xpc3QgKmJiX2xpc3QsCisJCQkJICAgICAgdm9pZCAqcHJpdl9kYXRhLAorCQkJCSAgICAgIHZvaWQgKCppbnZhbGlkKShleHQyX2ZpbHN5cyBmcywKKwkJCQkJCSAgICAgIGJsa190IGJsaywKKwkJCQkJCSAgICAgIGNoYXIgKmJhZHN0ciwKKwkJCQkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSkpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9iYl9GSUxFKGV4dDJfZmlsc3lzIGZzLCBGSUxFICpmLAorCQkJCSAgICAgZXh0Ml9iYWRibG9ja3NfbGlzdCAqYmJfbGlzdCwKKwkJCQkgICAgIHZvaWQgKCppbnZhbGlkKShleHQyX2ZpbHN5cyBmcywKKwkJCQkJCSAgICAgYmxrX3QgYmxrKSk7CisKKy8qIHJlc19nZHQuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfY3JlYXRlX3Jlc2l6ZV9pbm9kZShleHQyX2ZpbHN5cyBmcyk7CisKKy8qIHJzX2JpdG1hcC5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZXNpemVfZ2VuZXJpY19iaXRtYXAoX191MzIgbmV3X2VuZCwKKwkJCQkJICAgICAgX191MzIgbmV3X3JlYWxfZW5kLAorCQkJCQkgICAgICBleHQyZnNfZ2VuZXJpY19iaXRtYXAgYm1hcCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZXNpemVfaW5vZGVfYml0bWFwKF9fdTMyIG5ld19lbmQsIF9fdTMyIG5ld19yZWFsX2VuZCwKKwkJCQkJICAgIGV4dDJmc19pbm9kZV9iaXRtYXAgYm1hcCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZXNpemVfYmxvY2tfYml0bWFwKF9fdTMyIG5ld19lbmQsIF9fdTMyIG5ld19yZWFsX2VuZCwKKwkJCQkJICAgIGV4dDJmc19ibG9ja19iaXRtYXAgYm1hcCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jb3B5X2JpdG1hcChleHQyZnNfZ2VuZXJpY19iaXRtYXAgc3JjLAorCQkJCSAgICBleHQyZnNfZ2VuZXJpY19iaXRtYXAgKmRlc3QpOworCisvKiBzd2FwZnMuYyAqLworZXh0ZXJuIHZvaWQgZXh0MmZzX3N3YXBfZXh0X2F0dHIoY2hhciAqdG8sIGNoYXIgKmZyb20sIGludCBidWZzaXplLAorCQkJCSBpbnQgaGFzX2hlYWRlcik7CitleHRlcm4gdm9pZCBleHQyZnNfc3dhcF9zdXBlcihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIHN1cGVyKTsKK2V4dGVybiB2b2lkIGV4dDJmc19zd2FwX2dyb3VwX2Rlc2Moc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZ2RwKTsKK2V4dGVybiB2b2lkIGV4dDJmc19zd2FwX2lub2RlX2Z1bGwoZXh0Ml9maWxzeXMgZnMsIHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICp0LAorCQkJCSAgIHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICpmLCBpbnQgaG9zdG9yZGVyLAorCQkJCSAgIGludCBidWZzaXplKTsKK2V4dGVybiB2b2lkIGV4dDJmc19zd2FwX2lub2RlKGV4dDJfZmlsc3lzIGZzLHN0cnVjdCBleHQyX2lub2RlICp0LAorCQkJICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmYsIGludCBob3N0b3JkZXIpOworCisvKiB2YWxpZF9ibGsuYyAqLworZXh0ZXJuIGludCBleHQyZnNfaW5vZGVfaGFzX3ZhbGlkX2Jsb2NrcyhzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpOworCisvKiB2ZXJzaW9uLmMgKi8KK2V4dGVybiBpbnQgZXh0MmZzX3BhcnNlX3ZlcnNpb25fc3RyaW5nKGNvbnN0IGNoYXIgKnZlcl9zdHJpbmcpOworZXh0ZXJuIGludCBleHQyZnNfZ2V0X2xpYnJhcnlfdmVyc2lvbihjb25zdCBjaGFyICoqdmVyX3N0cmluZywKKwkJCQkgICAgICBjb25zdCBjaGFyICoqZGF0ZV9zdHJpbmcpOworCisvKiB3cml0ZV9iYl9maWxlLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2JiX0ZJTEUoZXh0Ml9iYWRibG9ja3NfbGlzdCBiYl9saXN0LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncywKKwkJCQkgICAgICBGSUxFICpmKTsKKworCisvKiBpbmxpbmUgZnVuY3Rpb25zICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19nZXRfbWVtKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqcHRyKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZyZWVfbWVtKHZvaWQgKnB0cik7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZXNpemVfbWVtKHVuc2lnbmVkIGxvbmcgb2xkX3NpemUsCisJCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpwdHIpOworZXh0ZXJuIHZvaWQgZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIHZvaWQgZXh0MmZzX21hcmtfY2hhbmdlZChleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gaW50IGV4dDJmc190ZXN0X2NoYW5nZWQoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIHZvaWQgZXh0MmZzX21hcmtfdmFsaWQoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIHZvaWQgZXh0MmZzX3VubWFya192YWxpZChleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gaW50IGV4dDJmc190ZXN0X3ZhbGlkKGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiB2b2lkIGV4dDJmc19tYXJrX2liX2RpcnR5KGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiB2b2lkIGV4dDJmc19tYXJrX2JiX2RpcnR5KGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiBpbnQgZXh0MmZzX3Rlc3RfaWJfZGlydHkoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGludCBleHQyZnNfdGVzdF9iYl9kaXJ0eShleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gaW50IGV4dDJmc19ncm91cF9vZl9ibGsoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsayk7CitleHRlcm4gaW50IGV4dDJmc19ncm91cF9vZl9pbm8oZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vKTsKK2V4dGVybiBibGtfdCBleHQyZnNfaW5vZGVfZGF0YV9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsCisJCQkJICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0MmZzUC5oIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJmc1AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTAyZTlhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJmc1AuaApAQCAtMCwwICsxLDg3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBleHQyZnNQLmggLS0tIHByaXZhdGUgaGVhZGVyIGZpbGUgZm9yIGV4dDIgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogQmFkYmxvY2tzIGxpc3QKKyAqLworc3RydWN0IGV4dDJfc3RydWN0X3UzMl9saXN0IHsKKwlpbnQJbWFnaWM7CisJaW50CW51bTsKKwlpbnQJc2l6ZTsKKwlfX3UzMgkqbGlzdDsKKwlpbnQJYmFkYmxvY2tzX2ZsYWdzOworfTsKKworc3RydWN0IGV4dDJfc3RydWN0X3UzMl9pdGVyYXRlIHsKKwlpbnQJCQltYWdpYzsKKwlleHQyX3UzMl9saXN0CQliYjsKKwlpbnQJCQlwdHI7Cit9OworCisKKy8qCisgKiBEaXJlY3RvcnkgYmxvY2sgaXRlcmF0b3IgZGVmaW5pdGlvbgorICovCitzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfZGJsaXN0IHsKKwlpbnQJCQltYWdpYzsKKwlleHQyX2ZpbHN5cwkJZnM7CisJZXh0Ml9pbm9fdAkJc2l6ZTsKKwlleHQyX2lub190CQljb3VudDsKKwlpbnQJCQlzb3J0ZWQ7CisJc3RydWN0IGV4dDJfZGJfZW50cnkgKglsaXN0OworfTsKKworLyoKKyAqIEZvciBkaXJlY3RvcnkgaXRlcmF0b3JzCisgKi8KK3N0cnVjdCBkaXJfY29udGV4dCB7CisJZXh0Ml9pbm9fdAkJZGlyOworCWludAkJZmxhZ3M7CisJY2hhcgkJKmJ1ZjsKKwlpbnQgKCpmdW5jKShleHQyX2lub190CWRpciwKKwkJICAgIGludAllbnRyeSwKKwkJICAgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkgICAgaW50CW9mZnNldCwKKwkJICAgIGludAlibG9ja3NpemUsCisJCSAgICBjaGFyCSpidWYsCisJCSAgICB2b2lkCSpwcml2X2RhdGEpOworCXZvaWQJCSpwcml2X2RhdGE7CisJZXJyY29kZV90CWVycmNvZGU7Cit9OworCisvKgorICogSW5vZGUgY2FjaGUgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBleHQyX2lub2RlX2NhY2hlIHsKKwl2b2lkICoJCQkJYnVmZmVyOworCWJsa190CQkJCWJ1ZmZlcl9ibGs7CisJaW50CQkJCWNhY2hlX2xhc3Q7CisJaW50CQkJCWNhY2hlX3NpemU7CisJaW50CQkJCXJlZmNvdW50OworCXN0cnVjdCBleHQyX2lub2RlX2NhY2hlX2VudAkqY2FjaGU7Cit9OworCitzdHJ1Y3QgZXh0Ml9pbm9kZV9jYWNoZV9lbnQgeworCWV4dDJfaW5vX3QJCWlubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQlpbm9kZTsKK307CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworZXh0ZXJuIGludCBleHQyZnNfcHJvY2Vzc19kaXJfYmxvY2soZXh0Ml9maWxzeXMJCWZzLAorCQkJCSAgICBibGtfdAkJKmJsb2NrbnIsCisJCQkJICAgIGUyX2Jsa2NudF90CQlibG9ja2NudCwKKwkJCQkgICAgYmxrX3QJCXJlZl9ibG9jaywKKwkJCQkgICAgaW50CQkJcmVmX29mZnNldCwKKwkJCQkgICAgdm9pZAkJKnByaXZfZGF0YSk7CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0MmZzX2lubGluZS5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJmc19pbmxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDM3ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJmc19pbmxpbmUuYwpAQCAtMCwwICsxLDM2NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZXh0MmZzLmggLS0tIGV4dDJmcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgImV4dDJmcy5oIgorI2luY2x1ZGUgImJpdG9wcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKgorICogIEFsbG9jYXRlIG1lbW9yeQorICovCitlcnJjb2RlX3QgZXh0MmZzX2dldF9tZW0odW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpwdHIpCit7CisJdm9pZCAqKnBwID0gKHZvaWQgKiopcHRyOworCisJKnBwID0gbWFsbG9jKHNpemUpOworCWlmICghKnBwKQorCQlyZXR1cm4gRVhUMl9FVF9OT19NRU1PUlk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIG1lbW9yeQorICovCitlcnJjb2RlX3QgZXh0MmZzX2ZyZWVfbWVtKHZvaWQgKnB0cikKK3sKKwl2b2lkICoqcHAgPSAodm9pZCAqKilwdHI7CisKKwlmcmVlKCpwcCk7CisJKnBwID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBSZXNpemUgbWVtb3J5CisgKi8KK2VycmNvZGVfdCBleHQyZnNfcmVzaXplX21lbSh1bnNpZ25lZCBsb25nIEVYVDJGU19BVFRSKCh1bnVzZWQpKSBvbGRfc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqcHRyKQoreworCXZvaWQgKnA7CisKKwkvKiBVc2UgIm1lbWNweSIgZm9yIHBvaW50ZXIgYXNzaWdubWVudHMgaGVyZSB0byBhdm9pZCBwcm9ibGVtcworCSAqIHdpdGggQzk5IHN0cmljdCB0eXBlIGFsaWFzaW5nIHJ1bGVzLiAqLworCW1lbWNweSgmcCwgcHRyLCBzaXplb2YgKHApKTsKKwlwID0geHJlYWxsb2MocCwgc2l6ZSk7CisJbWVtY3B5KHB0ciwgJnAsIHNpemVvZiAocCkpOworCXJldHVybiAwOworfQorCisvKgorICogTWFyayBhIGZpbGVzeXN0ZW0gc3VwZXJibG9jayBhcyBkaXJ0eQorICovCit2b2lkIGV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGV4dDJfZmlsc3lzIGZzKQoreworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfRElSVFkgfCBFWFQyX0ZMQUdfQ0hBTkdFRDsKK30KKworLyoKKyAqIE1hcmsgYSBmaWxlc3lzdGVtIGFzIGNoYW5nZWQKKyAqLwordm9pZCBleHQyZnNfbWFya19jaGFuZ2VkKGV4dDJfZmlsc3lzIGZzKQoreworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfQ0hBTkdFRDsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIGZpbGVzeXN0ZW0gaGFzIGNoYW5nZWQKKyAqLworaW50IGV4dDJmc190ZXN0X2NoYW5nZWQoZXh0Ml9maWxzeXMgZnMpCit7CisJcmV0dXJuIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfQ0hBTkdFRCk7Cit9CisKKy8qCisgKiBNYXJrIGEgZmlsZXN5c3RlbSBhcyB2YWxpZAorICovCit2b2lkIGV4dDJmc19tYXJrX3ZhbGlkKGV4dDJfZmlsc3lzIGZzKQoreworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfVkFMSUQ7Cit9CisKKy8qCisgKiBNYXJrIGEgZmlsZXN5c3RlbSBhcyBOT1QgdmFsaWQKKyAqLwordm9pZCBleHQyZnNfdW5tYXJrX3ZhbGlkKGV4dDJfZmlsc3lzIGZzKQoreworCWZzLT5mbGFncyAmPSB+RVhUMl9GTEFHX1ZBTElEOworfQorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIGEgZmlsZXN5c3RlbSBpcyB2YWxpZAorICovCitpbnQgZXh0MmZzX3Rlc3RfdmFsaWQoZXh0Ml9maWxzeXMgZnMpCit7CisJcmV0dXJuIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfVkFMSUQpOworfQorCisvKgorICogTWFyayB0aGUgaW5vZGUgYml0bWFwIGFzIGRpcnR5CisgKi8KK3ZvaWQgZXh0MmZzX21hcmtfaWJfZGlydHkoZXh0Ml9maWxzeXMgZnMpCit7CisJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19JQl9ESVJUWSB8IEVYVDJfRkxBR19DSEFOR0VEOworfQorCisvKgorICogTWFyayB0aGUgYmxvY2sgYml0bWFwIGFzIGRpcnR5CisgKi8KK3ZvaWQgZXh0MmZzX21hcmtfYmJfZGlydHkoZXh0Ml9maWxzeXMgZnMpCit7CisJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19CQl9ESVJUWSB8IEVYVDJfRkxBR19DSEFOR0VEOworfQorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIGEgZmlsZXN5c3RlbSdzIGlub2RlIGJpdG1hcCBpcyBkaXJ0eQorICovCitpbnQgZXh0MmZzX3Rlc3RfaWJfZGlydHkoZXh0Ml9maWxzeXMgZnMpCit7CisJcmV0dXJuIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfSUJfRElSVFkpOworfQorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIGEgZmlsZXN5c3RlbSdzIGJsb2NrIGJpdG1hcCBpcyBkaXJ0eQorICovCitpbnQgZXh0MmZzX3Rlc3RfYmJfZGlydHkoZXh0Ml9maWxzeXMgZnMpCit7CisJcmV0dXJuIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfQkJfRElSVFkpOworfQorCisvKgorICogUmV0dXJuIHRoZSBncm91cCAjIG9mIGEgYmxvY2sKKyAqLworaW50IGV4dDJmc19ncm91cF9vZl9ibGsoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsaykKK3sKKwlyZXR1cm4gKGJsayAtIGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSAvCisJCWZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwOworfQorCisvKgorICogUmV0dXJuIHRoZSBncm91cCAjIG9mIGFuIGlub2RlIG51bWJlcgorICovCitpbnQgZXh0MmZzX2dyb3VwX29mX2lubyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8pCit7CisJcmV0dXJuIChpbm8gLSAxKSAvIGZzLT5zdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwOworfQorCitibGtfdCBleHQyZnNfaW5vZGVfZGF0YV9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsCisJCQkJCXN0cnVjdCBleHQyX2lub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gaW5vZGUtPmlfYmxvY2tzIC0KKwkJKGlub2RlLT5pX2ZpbGVfYWNsID8gZnMtPmJsb2Nrc2l6ZSA+PiA5IDogMCk7Cit9CisKKworCisKKworCisKKworCitfX3UxNiBleHQyZnNfc3dhYjE2KF9fdTE2IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCA+PiA4KSB8ICh2YWwgPDwgOCk7Cit9CisKK19fdTMyIGV4dDJmc19zd2FiMzIoX191MzIgdmFsKQoreworCXJldHVybiAoKHZhbD4+MjQpIHwgKCh2YWw+PjgpJjB4RkYwMCkgfAorCQkoKHZhbDw8OCkmMHhGRjAwMDApIHwgKHZhbDw8MjQpKTsKK30KKworaW50IGV4dDJmc190ZXN0X2dlbmVyaWNfYml0bWFwKGV4dDJmc19nZW5lcmljX2JpdG1hcCBiaXRtYXAsCisJCQkJCWJsa190IGJpdG5vKTsKKworaW50IGV4dDJmc190ZXN0X2dlbmVyaWNfYml0bWFwKGV4dDJmc19nZW5lcmljX2JpdG1hcCBiaXRtYXAsCisJCQkJCWJsa190IGJpdG5vKQoreworCWlmICgoYml0bm8gPCBiaXRtYXAtPnN0YXJ0KSB8fCAoYml0bm8gPiBiaXRtYXAtPmVuZCkpIHsKKwkJZXh0MmZzX3dhcm5fYml0bWFwMihiaXRtYXAsIEVYVDJGU19URVNUX0VSUk9SLCBiaXRubyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZXh0MmZzX3Rlc3RfYml0KGJpdG5vIC0gYml0bWFwLT5zdGFydCwgYml0bWFwLT5iaXRtYXApOworfQorCitpbnQgZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCSAgICAgICBibGtfdCBibG9jaykKK3sKKwlyZXR1cm4gZXh0MmZzX21hcmtfZ2VuZXJpY19iaXRtYXAoKGV4dDJmc19nZW5lcmljX2JpdG1hcCkKKwkJCQkgICAgICAgYml0bWFwLAorCQkJCQkgIGJsb2NrKTsKK30KKworaW50IGV4dDJmc191bm1hcmtfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgYmxrX3QgYmxvY2spCit7CisJcmV0dXJuIGV4dDJmc191bm1hcmtfZ2VuZXJpY19iaXRtYXAoKGV4dDJmc19nZW5lcmljX2JpdG1hcCkgYml0bWFwLAorCQkJCQkgICAgYmxvY2spOworfQorCitpbnQgZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCSAgICAgICBibGtfdCBibG9jaykKK3sKKwlyZXR1cm4gZXh0MmZzX3Rlc3RfZ2VuZXJpY19iaXRtYXAoKGV4dDJmc19nZW5lcmljX2JpdG1hcCkgYml0bWFwLAorCQkJCQkgIGJsb2NrKTsKK30KKworaW50IGV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwKKwkJCQkgICAgICAgZXh0Ml9pbm9fdCBpbm9kZSkKK3sKKwlyZXR1cm4gZXh0MmZzX21hcmtfZ2VuZXJpY19iaXRtYXAoKGV4dDJmc19nZW5lcmljX2JpdG1hcCkgYml0bWFwLAorCQkJCQkgIGlub2RlKTsKK30KKworaW50IGV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCQkgZXh0Ml9pbm9fdCBpbm9kZSkKK3sKKwlyZXR1cm4gZXh0MmZzX3VubWFya19nZW5lcmljX2JpdG1hcCgoZXh0MmZzX2dlbmVyaWNfYml0bWFwKSBiaXRtYXAsCisJCQkJICAgICBpbm9kZSk7Cit9CisKK2ludCBleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXAsCisJCQkJICAgICAgIGV4dDJfaW5vX3QgaW5vZGUpCit7CisJcmV0dXJuIGV4dDJmc190ZXN0X2dlbmVyaWNfYml0bWFwKChleHQyZnNfZ2VuZXJpY19iaXRtYXApIGJpdG1hcCwKKwkJCQkJICBpbm9kZSk7Cit9CisKK3ZvaWQgZXh0MmZzX2Zhc3RfbWFya19ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgICBibGtfdCBibG9jaykKK3sKKwlleHQyZnNfc2V0X2JpdChibG9jayAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKwordm9pZCBleHQyZnNfZmFzdF91bm1hcmtfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgICBibGtfdCBibG9jaykKK3sKKwlleHQyZnNfY2xlYXJfYml0KGJsb2NrIC0gYml0bWFwLT5zdGFydCwgYml0bWFwLT5iaXRtYXApOworfQorCitpbnQgZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgICBibGtfdCBibG9jaykKK3sKKwlyZXR1cm4gZXh0MmZzX3Rlc3RfYml0KGJsb2NrIC0gYml0bWFwLT5zdGFydCwgYml0bWFwLT5iaXRtYXApOworfQorCit2b2lkIGV4dDJmc19mYXN0X21hcmtfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgZXh0Ml9pbm9fdCBpbm9kZSkKK3sKKwlleHQyZnNfc2V0X2JpdChpbm9kZSAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKwordm9pZCBleHQyZnNfZmFzdF91bm1hcmtfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgICBleHQyX2lub190IGlub2RlKQoreworCWV4dDJmc19jbGVhcl9iaXQoaW5vZGUgLSBiaXRtYXAtPnN0YXJ0LCBiaXRtYXAtPmJpdG1hcCk7Cit9CisKK2ludCBleHQyZnNfZmFzdF90ZXN0X2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgZXh0Ml9pbm9fdCBpbm9kZSkKK3sKKwlyZXR1cm4gZXh0MmZzX3Rlc3RfYml0KGlub2RlIC0gYml0bWFwLT5zdGFydCwgYml0bWFwLT5iaXRtYXApOworfQorCitibGtfdCBleHQyZnNfZ2V0X2Jsb2NrX2JpdG1hcF9zdGFydChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCkKK3sKKwlyZXR1cm4gYml0bWFwLT5zdGFydDsKK30KKworZXh0Ml9pbm9fdCBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9zdGFydChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCkKK3sKKwlyZXR1cm4gYml0bWFwLT5zdGFydDsKK30KKworYmxrX3QgZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfZW5kKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwKQoreworCXJldHVybiBiaXRtYXAtPmVuZDsKK30KKworZXh0Ml9pbm9fdCBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9lbmQoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXApCit7CisJcmV0dXJuIGJpdG1hcC0+ZW5kOworfQorCitpbnQgZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwX3JhbmdlKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgYmxrX3QgYmxvY2ssIGludCBudW0pCit7CisJaW50CWk7CisKKwlpZiAoKGJsb2NrIDwgYml0bWFwLT5zdGFydCkgfHwgKGJsb2NrK251bS0xID4gYml0bWFwLT5lbmQpKSB7CisJCWV4dDJmc193YXJuX2JpdG1hcChFWFQyX0VUX0JBRF9CTE9DS19URVNULAorCQkJCSAgIGJsb2NrLCBiaXRtYXAtPmRlc2NyaXB0aW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoaT0wOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKGV4dDJmc19mYXN0X3Rlc3RfYmxvY2tfYml0bWFwKGJpdG1hcCwgYmxvY2sraSkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludCBleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJCSBibGtfdCBibG9jaywgaW50IG51bSkKK3sKKwlpbnQJaTsKKworCWZvciAoaT0wOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKGV4dDJmc19mYXN0X3Rlc3RfYmxvY2tfYml0bWFwKGJpdG1hcCwgYmxvY2sraSkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwX3JhbmdlKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgIGJsa190IGJsb2NrLCBpbnQgbnVtKQoreworCWludAlpOworCisJaWYgKChibG9jayA8IGJpdG1hcC0+c3RhcnQpIHx8IChibG9jaytudW0tMSA+IGJpdG1hcC0+ZW5kKSkgeworCQlleHQyZnNfd2Fybl9iaXRtYXAoRVhUMl9FVF9CQURfQkxPQ0tfTUFSSywgYmxvY2ssCisJCQkJICAgYml0bWFwLT5kZXNjcmlwdGlvbik7CisJCXJldHVybjsKKwl9CisJZm9yIChpPTA7IGkgPCBudW07IGkrKykKKwkJZXh0MmZzX3NldF9iaXQoYmxvY2sgKyBpIC0gYml0bWFwLT5zdGFydCwgYml0bWFwLT5iaXRtYXApOworfQorCit2b2lkIGV4dDJmc19mYXN0X21hcmtfYmxvY2tfYml0bWFwX3JhbmdlKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkJICBibGtfdCBibG9jaywgaW50IG51bSkKK3sKKwlpbnQJaTsKKworCWZvciAoaT0wOyBpIDwgbnVtOyBpKyspCisJCWV4dDJmc19zZXRfYml0KGJsb2NrICsgaSAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKwordm9pZCBleHQyZnNfdW5tYXJrX2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgICAgIGJsa190IGJsb2NrLCBpbnQgbnVtKQoreworCWludAlpOworCisJaWYgKChibG9jayA8IGJpdG1hcC0+c3RhcnQpIHx8IChibG9jaytudW0tMSA+IGJpdG1hcC0+ZW5kKSkgeworCQlleHQyZnNfd2Fybl9iaXRtYXAoRVhUMl9FVF9CQURfQkxPQ0tfVU5NQVJLLCBibG9jaywKKwkJCQkgICBiaXRtYXAtPmRlc2NyaXB0aW9uKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGk9MDsgaSA8IG51bTsgaSsrKQorCQlleHQyZnNfY2xlYXJfYml0KGJsb2NrICsgaSAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKwordm9pZCBleHQyZnNfZmFzdF91bm1hcmtfYmxvY2tfYml0bWFwX3JhbmdlKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkJICAgIGJsa190IGJsb2NrLCBpbnQgbnVtKQoreworCWludAlpOworCWZvciAoaT0wOyBpIDwgbnVtOyBpKyspCisJCWV4dDJmc19jbGVhcl9iaXQoYmxvY2sgKyBpIC0gYml0bWFwLT5zdGFydCwgYml0bWFwLT5iaXRtYXApOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dF9hdHRyLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0X2F0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmJhMTJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dF9hdHRyLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGV4dF9hdHRyLmMgLS0tIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9ja3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJfZXh0X2F0dHIuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworZXJyY29kZV90IGV4dDJmc19yZWFkX2V4dF9hdHRyKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jaywgdm9pZCAqYnVmKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxvY2ssIDEsIGJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKyNpZiBCQl9CSUdfRU5ESUFOCisJaWYgKChmcy0+ZmxhZ3MgJiAoRVhUMl9GTEFHX1NXQVBfQllURVN8CisJCQkgIEVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQpKSAhPSAwKQorCQlleHQyZnNfc3dhcF9leHRfYXR0cihidWYsIGJ1ZiwgZnMtPmJsb2Nrc2l6ZSwgMSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc193cml0ZV9leHRfYXR0cihleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxvY2ssIHZvaWQgKmluYnVmKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhcgkJKndyaXRlX2J1ZjsKKwljaGFyCQkqYnVmID0gTlVMTDsKKworCWlmIChCQl9CSUdfRU5ESUFOICYmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHx8CisJICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURSkpKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZidWYpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJd3JpdGVfYnVmID0gYnVmOworCQlleHQyZnNfc3dhcF9leHRfYXR0cihidWYsIGluYnVmLCBmcy0+YmxvY2tzaXplLCAxKTsKKwl9IGVsc2UKKwkJd3JpdGVfYnVmID0gKGNoYXIgKikgaW5idWY7CisJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibG9jaywgMSwgd3JpdGVfYnVmKTsKKwlpZiAoYnVmKQorCQlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisJaWYgKCFyZXR2YWwpCisJCWV4dDJmc19tYXJrX2NoYW5nZWQoZnMpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFkanVzdHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgRUEgYmxvY2suCisgKi8KK2VycmNvZGVfdCBleHQyZnNfYWRqdXN0X2VhX3JlZmNvdW50KGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGssCisJCQkJICAgIGNoYXIgKmJsb2NrX2J1ZiwgaW50IGFkanVzdCwKKwkJCQkgICAgX191MzIgKm5ld2NvdW50KQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyICpoZWFkZXI7CisJY2hhcgkqYnVmID0gTlVMTDsKKworCWlmICgoYmxrID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpIHx8CisJICAgIChibGsgPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykpCisJCXJldHVybiBFWFQyX0VUX0JBRF9FQV9CTE9DS19OVU07CisKKwlpZiAoIWJsb2NrX2J1ZikgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJsb2NrX2J1ZiA9IGJ1ZjsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9leHRfYXR0cihmcywgYmxrLCBibG9ja19idWYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCisJaGVhZGVyID0gKHN0cnVjdCBleHQyX2V4dF9hdHRyX2hlYWRlciAqKSBibG9ja19idWY7CisJaGVhZGVyLT5oX3JlZmNvdW50ICs9IGFkanVzdDsKKwlpZiAobmV3Y291bnQpCisJCSpuZXdjb3VudCA9IGhlYWRlci0+aF9yZWZjb3VudDsKKworCXJldHZhbCA9IGV4dDJmc193cml0ZV9leHRfYXR0cihmcywgYmxrLCBibG9ja19idWYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCitlcnJvdXQ6CisJaWYgKGJ1ZikKKwkJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZmlsZWlvLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZmlsZWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1YWQzZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9maWxlaW8uYwpAQCAtMCwwICsxLDM3NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmlsZWlvLmMgLS0tIFNpbXBsZSBmaWxlIEkvTyByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK3N0cnVjdCBleHQyX2ZpbGUgeworCWVycmNvZGVfdAkJbWFnaWM7CisJZXh0Ml9maWxzeXMJCWZzOworCWV4dDJfaW5vX3QJCWlubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQlpbm9kZTsKKwlpbnQJCQlmbGFnczsKKwlfX3U2NAkJCXBvczsKKwlibGtfdAkJCWJsb2Nrbm87CisJYmxrX3QJCQlwaHlzYmxvY2s7CisJY2hhcgkJCSpidWY7Cit9OworCisjZGVmaW5lIEJNQVBfQlVGRkVSIChmaWxlLT5idWYgKyBmcy0+YmxvY2tzaXplKQorCitlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfb3BlbjIoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSwKKwkJCSAgICBpbnQgZmxhZ3MsIGV4dDJfZmlsZV90ICpyZXQpCit7CisJZXh0Ml9maWxlX3QJZmlsZTsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJLyoKKwkgKiBEb24ndCBsZXQgY2FsbGVyIGNyZWF0ZSBvciBvcGVuIGEgZmlsZSBmb3Igd3JpdGluZyBpZiB0aGUKKwkgKiBmaWxlc3lzdGVtIGlzIHJlYWQtb25seS4KKwkgKi8KKwlpZiAoKGZsYWdzICYgKEVYVDJfRklMRV9XUklURSB8IEVYVDJfRklMRV9DUkVBVEUpKSAmJgorCSAgICAhKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykpCisJCXJldHVybiBFWFQyX0VUX1JPX0ZJTFNZUzsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0Ml9maWxlKSwgJmZpbGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwltZW1zZXQoZmlsZSwgMCwgc2l6ZW9mKHN0cnVjdCBleHQyX2ZpbGUpKTsKKwlmaWxlLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfRVhUMl9GSUxFOworCWZpbGUtPmZzID0gZnM7CisJZmlsZS0+aW5vID0gaW5vOworCWZpbGUtPmZsYWdzID0gZmxhZ3MgJiBFWFQyX0ZJTEVfTUFTSzsKKworCWlmIChpbm9kZSkgeworCQltZW1jcHkoJmZpbGUtPmlub2RlLCBpbm9kZSwgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIGlubywgJmZpbGUtPmlub2RlKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplICogMywgJmZpbGUtPmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsOworCisJKnJldCA9IGZpbGU7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZXh0MmZzX2ZyZWVfbWVtKCZmaWxlLT5idWYpOworCWV4dDJmc19mcmVlX21lbSgmZmlsZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworZXJyY29kZV90IGV4dDJmc19maWxlX29wZW4oZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgaW50IGZsYWdzLCBleHQyX2ZpbGVfdCAqcmV0KQoreworCXJldHVybiBleHQyZnNfZmlsZV9vcGVuMihmcywgaW5vLCBOVUxMLCBmbGFncywgcmV0KTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlsZXN5c3RlbSBoYW5kbGUgb2YgYSBmaWxlIGZyb20gdGhlIHN0cnVjdHVyZQorICovCitleHQyX2ZpbHN5cyBleHQyZnNfZmlsZV9nZXRfZnMoZXh0Ml9maWxlX3QgZmlsZSkKK3sKKwlpZiAoZmlsZS0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19FWFQyX0ZJTEUpCisJCXJldHVybiAwOworCXJldHVybiBmaWxlLT5mczsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyB0aGUgZGlydHkgYmxvY2sgYnVmZmVyIG91dCB0byBkaXNrIGlmCisgKiBuZWNlc3NhcnkuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfZmlsZV9mbHVzaChleHQyX2ZpbGVfdCBmaWxlKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJZXh0Ml9maWxzeXMgZnM7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZpbGUsIEVYVDJfRVRfTUFHSUNfRVhUMl9GSUxFKTsKKwlmcyA9IGZpbGUtPmZzOworCisJaWYgKCEoZmlsZS0+ZmxhZ3MgJiBFWFQyX0ZJTEVfQlVGX1ZBTElEKSB8fAorCSAgICAhKGZpbGUtPmZsYWdzICYgRVhUMl9GSUxFX0JVRl9ESVJUWSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBPSywgdGhlIHBoeXNpY2FsIGJsb2NrIGhhc24ndCBiZWVuIGFsbG9jYXRlZCB5ZXQuCisJICogQWxsb2NhdGUgaXQuCisJICovCisJaWYgKCFmaWxlLT5waHlzYmxvY2spIHsKKwkJcmV0dmFsID0gZXh0MmZzX2JtYXAoZnMsIGZpbGUtPmlubywgJmZpbGUtPmlub2RlLAorCQkJCSAgICAgQk1BUF9CVUZGRVIsIGZpbGUtPmlubyA/IEJNQVBfQUxMT0MgOiAwLAorCQkJCSAgICAgZmlsZS0+YmxvY2tubywgJmZpbGUtPnBoeXNibG9jayk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgZmlsZS0+cGh5c2Jsb2NrLAorCQkJCSAgICAgIDEsIGZpbGUtPmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWZpbGUtPmZsYWdzICY9IH5FWFQyX0ZJTEVfQlVGX0RJUlRZOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc3luY2hyb25pemVzIHRoZSBmaWxlJ3MgYmxvY2sgYnVmZmVyIGFuZCB0aGUgY3VycmVudAorICogZmlsZSBwb3NpdGlvbiwgcG9zc2libHkgaW52YWxpZGF0aW5nIGJsb2NrIGJ1ZmZlciBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGVycmNvZGVfdCBzeW5jX2J1ZmZlcl9wb3NpdGlvbihleHQyX2ZpbGVfdCBmaWxlKQoreworCWJsa190CWI7CisJZXJyY29kZV90CXJldHZhbDsKKworCWIgPSBmaWxlLT5wb3MgLyBmaWxlLT5mcy0+YmxvY2tzaXplOworCWlmIChiICE9IGZpbGUtPmJsb2Nrbm8pIHsKKwkJcmV0dmFsID0gZXh0MmZzX2ZpbGVfZmx1c2goZmlsZSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlmaWxlLT5mbGFncyAmPSB+RVhUMl9GSUxFX0JVRl9WQUxJRDsKKwl9CisJZmlsZS0+YmxvY2tubyA9IGI7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGxvYWRzIHRoZSBmaWxlJ3MgYmxvY2sgYnVmZmVyIHdpdGggdmFsaWQgZGF0YSBmcm9tCisgKiB0aGUgZGlzayBhcyBuZWNlc3NhcnkuCisgKgorICogSWYgZG9udGZpbGwgaXMgdHJ1ZSwgdGhlbiBza2lwIGluaXRpYWxpemluZyB0aGUgYnVmZmVyIHNpbmNlIHdlJ3JlCisgKiBnb2luZyB0byBiZSByZXBsYWNpbmcgaXRzIGVudGlyZSBjb250ZW50cyBhbnl3YXkuICBJZiBzZXQsIHRoZW4gdGhlCisgKiBmdW5jdGlvbiBiYXNpY2FsbHkgb25seSBzZXRzIGZpbGUtPnBoeXNibG9jayBhbmQgRVhUMl9GSUxFX0JVRl9WQUxJRAorICovCisjZGVmaW5lIERPTlRGSUxMIDEKK3N0YXRpYyBlcnJjb2RlX3QgbG9hZF9idWZmZXIoZXh0Ml9maWxlX3QgZmlsZSwgaW50IGRvbnRmaWxsKQoreworCWV4dDJfZmlsc3lzCWZzID0gZmlsZS0+ZnM7CisJZXJyY29kZV90CXJldHZhbDsKKworCWlmICghKGZpbGUtPmZsYWdzICYgRVhUMl9GSUxFX0JVRl9WQUxJRCkpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2JtYXAoZnMsIGZpbGUtPmlubywgJmZpbGUtPmlub2RlLAorCQkJCSAgICAgQk1BUF9CVUZGRVIsIDAsIGZpbGUtPmJsb2Nrbm8sCisJCQkJICAgICAmZmlsZS0+cGh5c2Jsb2NrKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWlmICghZG9udGZpbGwpIHsKKwkJCWlmIChmaWxlLT5waHlzYmxvY2spIHsKKwkJCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywKKwkJCQkJCQkgICAgIGZpbGUtPnBoeXNibG9jaywKKwkJCQkJCQkgICAgIDEsIGZpbGUtPmJ1Zik7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0gZWxzZQorCQkJCW1lbXNldChmaWxlLT5idWYsIDAsIGZzLT5ibG9ja3NpemUpOworCQl9CisJCWZpbGUtPmZsYWdzIHw9IEVYVDJfRklMRV9CVUZfVkFMSUQ7CisJfQorCXJldHVybiAwOworfQorCisKK2VycmNvZGVfdCBleHQyZnNfZmlsZV9jbG9zZShleHQyX2ZpbGVfdCBmaWxlKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZpbGUsIEVYVDJfRVRfTUFHSUNfRVhUMl9GSUxFKTsKKworCXJldHZhbCA9IGV4dDJmc19maWxlX2ZsdXNoKGZpbGUpOworCisJZXh0MmZzX2ZyZWVfbWVtKCZmaWxlLT5idWYpOworCWV4dDJmc19mcmVlX21lbSgmZmlsZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK2VycmNvZGVfdCBleHQyZnNfZmlsZV9yZWFkKGV4dDJfZmlsZV90IGZpbGUsIHZvaWQgKmJ1ZiwKKwkJCSAgIHVuc2lnbmVkIGludCB3YW50ZWQsIHVuc2lnbmVkIGludCAqZ290KQoreworCWV4dDJfZmlsc3lzCWZzOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCXVuc2lnbmVkIGludAlzdGFydCwgYywgY291bnQgPSAwOworCV9fdTY0CQlsZWZ0OworCWNoYXIJCSpwdHIgPSAoY2hhciAqKSBidWY7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZpbGUsIEVYVDJfRVRfTUFHSUNfRVhUMl9GSUxFKTsKKwlmcyA9IGZpbGUtPmZzOworCisJd2hpbGUgKChmaWxlLT5wb3MgPCBFWFQyX0lfU0laRSgmZmlsZS0+aW5vZGUpKSAmJiAod2FudGVkID4gMCkpIHsKKwkJcmV0dmFsID0gc3luY19idWZmZXJfcG9zaXRpb24oZmlsZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGZhaWw7CisJCXJldHZhbCA9IGxvYWRfYnVmZmVyKGZpbGUsIDApOworCQlpZiAocmV0dmFsKQorCQkJZ290byBmYWlsOworCisJCXN0YXJ0ID0gZmlsZS0+cG9zICUgZnMtPmJsb2Nrc2l6ZTsKKwkJYyA9IGZzLT5ibG9ja3NpemUgLSBzdGFydDsKKwkJaWYgKGMgPiB3YW50ZWQpCisJCQljID0gd2FudGVkOworCQlsZWZ0ID0gRVhUMl9JX1NJWkUoJmZpbGUtPmlub2RlKSAtIGZpbGUtPnBvczsKKwkJaWYgKGMgPiBsZWZ0KQorCQkJYyA9IGxlZnQ7CisKKwkJbWVtY3B5KHB0ciwgZmlsZS0+YnVmK3N0YXJ0LCBjKTsKKwkJZmlsZS0+cG9zICs9IGM7CisJCXB0ciArPSBjOworCQljb3VudCArPSBjOworCQl3YW50ZWQgLT0gYzsKKwl9CisKK2ZhaWw6CisJaWYgKGdvdCkKKwkJKmdvdCA9IGNvdW50OworCXJldHVybiByZXR2YWw7Cit9CisKKworZXJyY29kZV90IGV4dDJmc19maWxlX3dyaXRlKGV4dDJfZmlsZV90IGZpbGUsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1bnNpZ25lZCBpbnQgKndyaXR0ZW4pCit7CisJZXh0Ml9maWxzeXMJZnM7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisJdW5zaWduZWQgaW50CXN0YXJ0LCBjLCBjb3VudCA9IDA7CisJY29uc3QgY2hhcgkqcHRyID0gKGNvbnN0IGNoYXIgKikgYnVmOworCisJRVhUMl9DSEVDS19NQUdJQyhmaWxlLCBFWFQyX0VUX01BR0lDX0VYVDJfRklMRSk7CisJZnMgPSBmaWxlLT5mczsKKworCWlmICghKGZpbGUtPmZsYWdzICYgRVhUMl9GSUxFX1dSSVRFKSkKKwkJcmV0dXJuIEVYVDJfRVRfRklMRV9STzsKKworCXdoaWxlIChuYnl0ZXMgPiAwKSB7CisJCXJldHZhbCA9IHN5bmNfYnVmZmVyX3Bvc2l0aW9uKGZpbGUpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBmYWlsOworCisJCXN0YXJ0ID0gZmlsZS0+cG9zICUgZnMtPmJsb2Nrc2l6ZTsKKwkJYyA9IGZzLT5ibG9ja3NpemUgLSBzdGFydDsKKwkJaWYgKGMgPiBuYnl0ZXMpCisJCQljID0gbmJ5dGVzOworCisJCS8qCisJCSAqIFdlIG9ubHkgbmVlZCB0byBkbyBhIHJlYWQtbW9kaWZ5LXVwZGF0ZSBjeWNsZSBpZgorCQkgKiB3ZSdyZSBkb2luZyBhIHBhcnRpYWwgd3JpdGUuCisJCSAqLworCQlyZXR2YWwgPSBsb2FkX2J1ZmZlcihmaWxlLCAoYyA9PSBmcy0+YmxvY2tzaXplKSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGZhaWw7CisKKwkJZmlsZS0+ZmxhZ3MgfD0gRVhUMl9GSUxFX0JVRl9ESVJUWTsKKwkJbWVtY3B5KGZpbGUtPmJ1ZitzdGFydCwgcHRyLCBjKTsKKwkJZmlsZS0+cG9zICs9IGM7CisJCXB0ciArPSBjOworCQljb3VudCArPSBjOworCQluYnl0ZXMgLT0gYzsKKwl9CisKK2ZhaWw6CisJaWYgKHdyaXR0ZW4pCisJCSp3cml0dGVuID0gY291bnQ7CisJcmV0dXJuIHJldHZhbDsKK30KKworZXJyY29kZV90IGV4dDJmc19maWxlX2xsc2VlayhleHQyX2ZpbGVfdCBmaWxlLCBfX3U2NCBvZmZzZXQsCisJCQkgICAgaW50IHdoZW5jZSwgX191NjQgKnJldF9wb3MpCit7CisJRVhUMl9DSEVDS19NQUdJQyhmaWxlLCBFWFQyX0VUX01BR0lDX0VYVDJfRklMRSk7CisKKwlpZiAod2hlbmNlID09IEVYVDJfU0VFS19TRVQpCisJCWZpbGUtPnBvcyA9IG9mZnNldDsKKwllbHNlIGlmICh3aGVuY2UgPT0gRVhUMl9TRUVLX0NVUikKKwkJZmlsZS0+cG9zICs9IG9mZnNldDsKKwllbHNlIGlmICh3aGVuY2UgPT0gRVhUMl9TRUVLX0VORCkKKwkJZmlsZS0+cG9zID0gRVhUMl9JX1NJWkUoJmZpbGUtPmlub2RlKSArIG9mZnNldDsKKwllbHNlCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwlpZiAocmV0X3BvcykKKwkJKnJldF9wb3MgPSBmaWxlLT5wb3M7CisKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19maWxlX2xzZWVrKGV4dDJfZmlsZV90IGZpbGUsIGV4dDJfb2ZmX3Qgb2Zmc2V0LAorCQkJICAgIGludCB3aGVuY2UsIGV4dDJfb2ZmX3QgKnJldF9wb3MpCit7CisJX191NjQJCWxvZmZzZXQsIHJldF9sb2Zmc2V0OworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlsb2Zmc2V0ID0gb2Zmc2V0OworCXJldHZhbCA9IGV4dDJmc19maWxlX2xsc2VlayhmaWxlLCBsb2Zmc2V0LCB3aGVuY2UsICZyZXRfbG9mZnNldCk7CisJaWYgKHJldF9wb3MpCisJCSpyZXRfcG9zID0gKGV4dDJfb2ZmX3QpIHJldF9sb2Zmc2V0OworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgYWNjb3JkaW5nIHRvIHRoZSBpbm9kZQorICovCitlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfZ2V0X2xzaXplKGV4dDJfZmlsZV90IGZpbGUsIF9fdTY0ICpyZXRfc2l6ZSkKK3sKKwlpZiAoZmlsZS0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19FWFQyX0ZJTEUpCisJCXJldHVybiBFWFQyX0VUX01BR0lDX0VYVDJfRklMRTsKKwkqcmV0X3NpemUgPSBFWFQyX0lfU0laRSgmZmlsZS0+aW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBmaWxlLCBhY2NvcmRpbmcgdG8gdGhlIGlub2RlCisgKi8KK2V4dDJfb2ZmX3QgZXh0MmZzX2ZpbGVfZ2V0X3NpemUoZXh0Ml9maWxlX3QgZmlsZSkKK3sKKwlfX3U2NAlzaXplOworCisJaWYgKGV4dDJmc19maWxlX2dldF9sc2l6ZShmaWxlLCAmc2l6ZSkpCisJCXJldHVybiAwOworCWlmICgoc2l6ZSA+PiAzMikgIT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHNpemUgb2YgdGhlIGZpbGUsIHRydW5jYXRpbmcgaXQgaWYgbmVjZXNzYXJ5CisgKgorICogWFhYIHN0aWxsIG5lZWQgdG8gY2FsbCB0cnVuY2F0ZQorICovCitlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfc2V0X3NpemUoZXh0Ml9maWxlX3QgZmlsZSwgZXh0Ml9vZmZfdCBzaXplKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJRVhUMl9DSEVDS19NQUdJQyhmaWxlLCBFWFQyX0VUX01BR0lDX0VYVDJfRklMRSk7CisKKwlmaWxlLT5pbm9kZS5pX3NpemUgPSBzaXplOworCWZpbGUtPmlub2RlLmlfc2l6ZV9oaWdoID0gMDsKKwlpZiAoZmlsZS0+aW5vKSB7CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShmaWxlLT5mcywgZmlsZS0+aW5vLCAmZmlsZS0+aW5vZGUpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKgorCSAqIFhYWCB0cnVuY2F0ZSBpbm9kZSBpZiBuZWNlc3NhcnkKKwkgKi8KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ZpbmRkZXYuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9maW5kZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllODNmZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9maW5kZGV2LmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGZpbmRkZXYuYyAtLSB0aGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gZmluZCBhIHBhcnRpY3VsYXIgZGV2aWNlIGluCisgKgkvZGV2CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX01LREVWX0gKKyNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdHJ1Y3QgZGlyX2xpc3QgeworCWNoYXIJKm5hbWU7CisJc3RydWN0IGRpcl9saXN0ICpuZXh0OworfTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbiBlbnRyeSB0byB0aGUgZGlyZWN0b3J5IGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWRkX3RvX2Rpcmxpc3QoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRpcl9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZGlyX2xpc3QgKmRwOworCisJZHAgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZGlyX2xpc3QpKTsKKwlkcC0+bmFtZSA9IHhtYWxsb2Moc3RybGVuKG5hbWUpKzEpOworCXN0cmNweShkcC0+bmFtZSwgbmFtZSk7CisJZHAtPm5leHQgPSAqbGlzdDsKKwkqbGlzdCA9IGRwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhIGRpcmVjdG9yeSBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfZGlybGlzdChzdHJ1Y3QgZGlyX2xpc3QgKipsaXN0KQoreworCXN0cnVjdCBkaXJfbGlzdCAqZHAsICpuZXh0OworCisJZm9yIChkcCA9ICpsaXN0OyBkcDsgZHAgPSBuZXh0KSB7CisJCW5leHQgPSBkcC0+bmV4dDsKKwkJZnJlZShkcC0+bmFtZSk7CisJCWZyZWUoZHApOworCX0KKwkqbGlzdCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgc2Nhbl9kaXIoY2hhciAqZGlyX25hbWUsIGRldl90IGRldmljZSwgc3RydWN0IGRpcl9saXN0ICoqbGlzdCwKKwkJICAgIGNoYXIgKipyZXRfcGF0aCkKK3sKKwlESVIJKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkcDsKKwljaGFyCXBhdGhbMTAyNF0sICpjcDsKKwlpbnQJZGlybGVuOworCXN0cnVjdCBzdGF0IHN0OworCisJZGlybGVuID0gc3RybGVuKGRpcl9uYW1lKTsKKwlpZiAoKGRpciA9IG9wZW5kaXIoZGlyX25hbWUpKSA9PSBOVUxMKQorCQlyZXR1cm4gZXJybm87CisJZHAgPSByZWFkZGlyKGRpcik7CisJd2hpbGUgKGRwKSB7CisJCWlmIChkaXJsZW4gKyBzdHJsZW4oZHAtPmRfbmFtZSkgKyAyID49IHNpemVvZihwYXRoKSkKKwkJCWdvdG8gc2tpcF90b19uZXh0OworCQlpZiAoZHAtPmRfbmFtZVswXSA9PSAnLicgJiYKKwkJICAgICgoZHAtPmRfbmFtZVsxXSA9PSAwKSB8fAorCQkgICAgICgoZHAtPmRfbmFtZVsxXSA9PSAnLicpICYmIChkcC0+ZF9uYW1lWzJdID09IDApKSkpCisJCQlnb3RvIHNraXBfdG9fbmV4dDsKKwkJc3ByaW50ZihwYXRoLCAiJXMvJXMiLCBkaXJfbmFtZSwgZHAtPmRfbmFtZSk7CisJCWlmIChzdGF0KHBhdGgsICZzdCkgPCAwKQorCQkJZ290byBza2lwX3RvX25leHQ7CisJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJYWRkX3RvX2Rpcmxpc3QocGF0aCwgbGlzdCk7CisJCWlmIChTX0lTQkxLKHN0LnN0X21vZGUpICYmIHN0LnN0X3JkZXYgPT0gZGV2aWNlKSB7CisJCQljcCA9IHhtYWxsb2Moc3RybGVuKHBhdGgpKzEpOworCQkJc3RyY3B5KGNwLCBwYXRoKTsKKwkJCSpyZXRfcGF0aCA9IGNwOworCQkJZ290byBzdWNjZXNzOworCQl9CisJc2tpcF90b19uZXh0OgorCQlkcCA9IHJlYWRkaXIoZGlyKTsKKwl9CitzdWNjZXNzOgorCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBwYXRobmFtZSB0byBhIGJsb2NrIGRldmljZSB3aXRoIGEgZ2l2ZW4KKyAqIGRldmljZSBudW1iZXIuICBJdCByZXR1cm5zIGEgcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5IHRvIHRoZQorICogcGF0aG5hbWUgb24gc3VjY2VzcywgYW5kIE5VTEwgb24gZmFpbHVyZS4KKyAqLworY2hhciAqZXh0MmZzX2ZpbmRfYmxvY2tfZGV2aWNlKGRldl90IGRldmljZSkKK3sKKwlzdHJ1Y3QgZGlyX2xpc3QgKmxpc3QgPSBOVUxMLCAqbmV3X2xpc3QgPSBOVUxMOworCXN0cnVjdCBkaXJfbGlzdCAqY3VycmVudDsKKwljaGFyCSpyZXRfcGF0aCA9IE5VTEw7CisKKwkvKgorCSAqIEFkZCB0aGUgc3RhcnRpbmcgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLi4uCisJICovCisJYWRkX3RvX2Rpcmxpc3QoIi9kZXZpY2VzIiwgJmxpc3QpOworCWFkZF90b19kaXJsaXN0KCIvZGV2ZnMiLCAmbGlzdCk7CisJYWRkX3RvX2Rpcmxpc3QoIi9kZXYiLCAmbGlzdCk7CisKKwl3aGlsZSAobGlzdCkgeworCQljdXJyZW50ID0gbGlzdDsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCJTY2FubmluZyBkaXJlY3RvcnkgJXNcbiIsIGN1cnJlbnQtPm5hbWUpOworI2VuZGlmCisJCXNjYW5fZGlyKGN1cnJlbnQtPm5hbWUsIGRldmljZSwgJm5ld19saXN0LCAmcmV0X3BhdGgpOworCQlmcmVlKGN1cnJlbnQtPm5hbWUpOworCQlmcmVlKGN1cnJlbnQpOworCQlpZiAocmV0X3BhdGgpCisJCQlicmVhazsKKwkJLyoKKwkJICogSWYgd2UncmUgZG9uZSBjaGVja2luZyBhdCB0aGlzIGxldmVsLCBkZXNjZW5kIHRvCisJCSAqIHRoZSBuZXh0IGxldmVsIG9mIHN1YmRpcmVjdG9yaWVzLiAoYnJlYWR0aC1maXJzdCkKKwkJICovCisJCWlmIChsaXN0ID09IDApIHsKKwkJCWxpc3QgPSBuZXdfbGlzdDsKKwkJCW5ld19saXN0ID0gMDsKKwkJfQorCX0KKwlmcmVlX2Rpcmxpc3QoJmxpc3QpOworCWZyZWVfZGlybGlzdCgmbmV3X2xpc3QpOworCXJldHVybiByZXRfcGF0aDsKK30KKworCisjaWZkZWYgREVCVUcKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwljaGFyCSpkZXZuYW1lLCAqdG1wOworCWludAltYWpvciwgbWlub3I7CisJZGV2X3QJZGV2aWNlOworCWNvbnN0IGNoYXIgKmVycm1zZyA9ICJDYW5ub3QgcGFyc2UgJXM6ICVzXG4iOworCisJaWYgKChhcmdjICE9IDIpICYmIChhcmdjICE9IDMpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGRldmljZV9udW1iZXJcbiIsIGFyZ3ZbMF0pOworCQlmcHJpbnRmKHN0ZGVyciwgIlx0OiAlcyBtYWpvciBtaW5vclxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChhcmdjID09IDIpIHsKKwkJZGV2aWNlID0gc3RydG91bChhcmd2WzFdLCAmdG1wLCAwKTsKKwkJaWYgKCp0bXApIHsKKwkJCWZwcmludGYoc3RkZXJyLCBlcnJtc2csICJkZXZpY2UgbnVtYmVyIiwgYXJndlsxXSk7CisJCQlleGl0KDEpOworCQl9CisJfSBlbHNlIHsKKwkJbWFqb3IgPSBzdHJ0b3VsKGFyZ3ZbMV0sICZ0bXAsIDApOworCQlpZiAoKnRtcCkgeworCQkJZnByaW50ZihzdGRlcnIsIGVycm1zZywgIm1ham9yIG51bWJlciIsIGFyZ3ZbMV0pOworCQkJZXhpdCgxKTsKKwkJfQorCQltaW5vciA9IHN0cnRvdWwoYXJndlsyXSwgJnRtcCwgMCk7CisJCWlmICgqdG1wKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgZXJybXNnLCAibWlub3IgbnVtYmVyIiwgYXJndlsyXSk7CisJCQlleGl0KDEpOworCQl9CisJCWRldmljZSA9IG1ha2VkZXYobWFqb3IsIG1pbm9yKTsKKwkJcHJpbnRmKCJMb29raW5nIGZvciBkZXZpY2UgMHglMDR4ICglZDolZClcbiIsIGRldmljZSwKKwkJICAgICAgIG1ham9yLCBtaW5vcik7CisJfQorCWRldm5hbWUgPSBleHQyZnNfZmluZF9ibG9ja19kZXZpY2UoZGV2aWNlKTsKKwlpZiAoZGV2bmFtZSkgeworCQlwcmludGYoIkZvdW5kIGRldmljZSEgICVzXG4iLCBkZXZuYW1lKTsKKwkJZnJlZShkZXZuYW1lKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkNhbm5vdCBmaW5kIGRldmljZS5cbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZmx1c2hiLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZmx1c2hiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZDc2NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9mbHVzaGIuYwpAQCAtMCwwICsxLDgzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmbHVzaGIuYyAtLS0gSGlkZXMgc3lzdGVtLWRlcGVuZGVudCBpbmZvcm1hdGlvbiBmb3IgYm90aCBzeW5jaW5nIGEKKyAqCWRldmljZSB0byBkaXNrIGFuZCB0byBmbHVzaCBhbnkgYnVmZmVycyBmcm9tIGRpc2sgY2FjaGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfTU9VTlRfSAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPiAgLyogVGhpcyBtYXkgZGVmaW5lIEJMS0ZMU0JVRiAqLworI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBGb3IgTGludXgsIGRlZmluZSBCTEtGTFNCVUYgYW5kIEZERkxVU0ggaWYgbmVjZXNzYXJ5LCBzaW5jZQorICogbm90IGFsbCBwb3J0YWJsZSBoZWFkZXIgZmlsZSBkb2VzIHNvIGZvciB1cy4gIFRoaXMgcmVhbGx5IHNob3VsZCBiZQorICogZml4ZWQgaW4gdGhlIGdsaWJjIGhlYWRlciBmaWxlcy4gIChSZWNlbnQgZ2xpYmNzIGFwcGVhciB0byBkZWZpbmUKKyAqIEJMS0ZMU0JVRiBpbiBzeXMvbW91bnQuaCwgYnV0IEZERkxVU0ggc3RpbGwgZG9lc24ndCBzZWVtIHRvIGJlCisgKiBkZWZpbmVkIGFueXdoZXJlIHBvcnRhYmxlLikgIFVudGlsIHRoZW4uLi4uCisgKi8KKyNpZmRlZiBfX2xpbnV4X18KKyNpZm5kZWYgQkxLRkxTQlVGCisjZGVmaW5lIEJMS0ZMU0JVRiAgX0lPKDB4MTIsOTcpICAvKiBmbHVzaCBidWZmZXIgY2FjaGUgKi8KKyNlbmRpZgorI2lmbmRlZiBGREZMVVNICisjZGVmaW5lIEZERkxVU0ggICAgX0lPKDIsMHg0YikgIC8qIGZsdXNoIGZsb3BweSBkaXNrICovCisjZW5kaWYKKyNlbmRpZgorCisvKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHN5bmMgYSBkZXZpY2UvZmlsZSwgYW5kIG9wdGlvbmFsbHkgYXR0ZW1wdCB0bworICogZmx1c2ggdGhlIGJ1ZmZlciBjYWNoZS4gIFRoZSBsYXR0ZXIgaXMgYmFzaWNhbGx5IG9ubHkgdXNlZnVsIGZvcgorICogc3lzdGVtIGJlbmNobWFya3MgYW5kIGZvciB0b3J0dXJpbmcgc3lzdGVtcyBpbiBidXJuLWluIHRlc3RzLiAgOikKKyAqLworZXJyY29kZV90IGV4dDJmc19zeW5jX2RldmljZShpbnQgZmQsIGludCBmbHVzaGIpCit7CisJLyoKKwkgKiBXZSBhbHdheXMgc3luYyB0aGUgZGV2aWNlIGluIGNhc2Ugd2UncmUgcnVubmluZyBvbiBvbGQKKwkgKiBrZXJuZWxzIGZvciB3aGljaCB3ZSBjYW4gbG9zZSBkYXRhIGlmIHdlIGRvbid0LiAgKFRoZXJlCisJICogc3RpbGwgaXMgYSByYWNlIGNvbmRpdGlvbiBmb3IgdGhvc2Uga2VybmVscywgYnV0IHRoaXMKKwkgKiByZWR1Y2VzIGl0IGdyZWF0bHkuKQorCSAqLworCWlmIChmc3luYyAoZmQpID09IC0xKQorCQlyZXR1cm4gZXJybm87CisKKwlpZiAoZmx1c2hiKSB7CisKKyNpZmRlZiBCTEtGTFNCVUYKKwkJaWYgKGlvY3RsIChmZCwgQkxLRkxTQlVGLCAwKSA9PSAwKQorCQkJcmV0dXJuIDA7CisjZWxzZQorI2lmZGVmIF9fR05VQ19fCisjIHdhcm5pbmcgQkxLRkxTQlVGIG5vdCBkZWZpbmVkCisjZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZgorI2lmZGVmIEZERkxVU0gKKwkJaW9jdGwgKGZkLCBGREZMVVNILCAwKTsgICAvKiBJbiBjYXNlIHRoaXMgaXMgYSBmbG9wcHkgKi8KKyNlbHNlCisjaWZkZWYgX19HTlVDX18KKyMgd2FybmluZyBGREZMVVNIIG5vdCBkZWZpbmVkCisjZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9mcmVlZnMuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9mcmVlZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzVkNDhiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ZyZWVmcy5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmcmVlZnMuYyAtLS0gZnJlZSBhbiBleHQyIGZpbGVzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmc1AuaCIKKworc3RhdGljIHZvaWQgZXh0MmZzX2ZyZWVfaW5vZGVfY2FjaGUoc3RydWN0IGV4dDJfaW5vZGVfY2FjaGUgKmljYWNoZSk7CisKK3ZvaWQgZXh0MmZzX2ZyZWUoZXh0Ml9maWxzeXMgZnMpCit7CisJaWYgKCFmcyB8fCAoZnMtPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUykpCisJCXJldHVybjsKKwlpZiAoZnMtPmltYWdlX2lvICE9IGZzLT5pbykgeworCQlpZiAoZnMtPmltYWdlX2lvKQorCQkJaW9fY2hhbm5lbF9jbG9zZShmcy0+aW1hZ2VfaW8pOworCX0KKwlpZiAoZnMtPmlvKSB7CisJCWlvX2NoYW5uZWxfY2xvc2UoZnMtPmlvKTsKKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZmcy0+ZGV2aWNlX25hbWUpOworCWV4dDJmc19mcmVlX21lbSgmZnMtPnN1cGVyKTsKKwlleHQyZnNfZnJlZV9tZW0oJmZzLT5vcmlnX3N1cGVyKTsKKwlleHQyZnNfZnJlZV9tZW0oJmZzLT5ncm91cF9kZXNjKTsKKwlleHQyZnNfZnJlZV9ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCk7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGZzLT5pbm9kZV9tYXApOworCisJZXh0MmZzX2JhZGJsb2Nrc19saXN0X2ZyZWUoZnMtPmJhZGJsb2Nrcyk7CisJZnMtPmJhZGJsb2NrcyA9IDA7CisKKwlleHQyZnNfZnJlZV9kYmxpc3QoZnMtPmRibGlzdCk7CisKKwlpZiAoZnMtPmljYWNoZSkKKwkJZXh0MmZzX2ZyZWVfaW5vZGVfY2FjaGUoZnMtPmljYWNoZSk7CisKKwlmcy0+bWFnaWMgPSAwOworCisJZXh0MmZzX2ZyZWVfbWVtKCZmcyk7Cit9CisKK3ZvaWQgZXh0MmZzX2ZyZWVfZ2VuZXJpY19iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXApCit7CisJaWYgKCFiaXRtYXAgfHwgKGJpdG1hcC0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19HRU5FUklDX0JJVE1BUCkpCisJCXJldHVybjsKKworCWJpdG1hcC0+bWFnaWMgPSAwOworCWV4dDJmc19mcmVlX21lbSgmYml0bWFwLT5kZXNjcmlwdGlvbik7CisJZXh0MmZzX2ZyZWVfbWVtKCZiaXRtYXAtPmJpdG1hcCk7CisJZXh0MmZzX2ZyZWVfbWVtKCZiaXRtYXApOworfQorCit2b2lkIGV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCkKK3sKKwlpZiAoIWJpdG1hcCB8fCAoYml0bWFwLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0lOT0RFX0JJVE1BUCkpCisJCXJldHVybjsKKworCWJpdG1hcC0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0dFTkVSSUNfQklUTUFQOworCWV4dDJmc19mcmVlX2dlbmVyaWNfYml0bWFwKGJpdG1hcCk7Cit9CisKK3ZvaWQgZXh0MmZzX2ZyZWVfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwKQoreworCWlmICghYml0bWFwIHx8IChiaXRtYXAtPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfQkxPQ0tfQklUTUFQKSkKKwkJcmV0dXJuOworCisJYml0bWFwLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfR0VORVJJQ19CSVRNQVA7CisJZXh0MmZzX2ZyZWVfZ2VuZXJpY19iaXRtYXAoYml0bWFwKTsKK30KKworLyoKKyAqIEZyZWUgdGhlIGlub2RlIGNhY2hlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBleHQyZnNfZnJlZV9pbm9kZV9jYWNoZShzdHJ1Y3QgZXh0Ml9pbm9kZV9jYWNoZSAqaWNhY2hlKQoreworCWlmICgtLWljYWNoZS0+cmVmY291bnQpCisJCXJldHVybjsKKwlleHQyZnNfZnJlZV9tZW0oJmljYWNoZS0+YnVmZmVyKTsKKwlleHQyZnNfZnJlZV9tZW0oJmljYWNoZS0+Y2FjaGUpOworCWljYWNoZS0+YnVmZmVyX2JsayA9IDA7CisJZXh0MmZzX2ZyZWVfbWVtKCZpY2FjaGUpOworfQorCisvKgorICogVGhpcyBwcm9jZWR1cmUgZnJlZXMgYSBiYWRibG9ja3MgbGlzdC4KKyAqLwordm9pZCBleHQyZnNfdTMyX2xpc3RfZnJlZShleHQyX3UzMl9saXN0IGJiKQoreworCWlmICghYmIgfHwgYmItPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0xJU1QpCisJCXJldHVybjsKKworCWV4dDJmc19mcmVlX21lbSgmYmItPmxpc3QpOworCWV4dDJmc19mcmVlX21lbSgmYmIpOworfQorCit2b2lkIGV4dDJmc19iYWRibG9ja3NfbGlzdF9mcmVlKGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIpCit7CisJZXh0MmZzX3UzMl9saXN0X2ZyZWUoKGV4dDJfdTMyX2xpc3QpIGJiKTsKK30KKworCisvKgorICogRnJlZSBhIGRpcmVjdG9yeSBibG9jayBsaXN0CisgKi8KK3ZvaWQgZXh0MmZzX2ZyZWVfZGJsaXN0KGV4dDJfZGJsaXN0IGRibGlzdCkKK3sKKwlpZiAoIWRibGlzdCB8fCAoZGJsaXN0LT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0RCTElTVCkpCisJCXJldHVybjsKKworCWV4dDJmc19mcmVlX21lbSgmZGJsaXN0LT5saXN0KTsKKwlpZiAoZGJsaXN0LT5mcyAmJiBkYmxpc3QtPmZzLT5kYmxpc3QgPT0gZGJsaXN0KQorCQlkYmxpc3QtPmZzLT5kYmxpc3QgPSAwOworCWRibGlzdC0+bWFnaWMgPSAwOworCWV4dDJmc19mcmVlX21lbSgmZGJsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9nZW5fYml0bWFwLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2VuX2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODY5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2VuX2JpdG1hcC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGdlbl9iaXRtYXAuYyAtLS0gR2VuZXJpYyBiaXRtYXAgcm91dGluZXMgdGhhdCB1c2VkIHRvIGJlIGlubGluZWQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworaW50IGV4dDJmc19tYXJrX2dlbmVyaWNfYml0bWFwKGV4dDJmc19nZW5lcmljX2JpdG1hcCBiaXRtYXAsCisJCQkJCSBfX3UzMiBiaXRubykKK3sKKwlpZiAoKGJpdG5vIDwgYml0bWFwLT5zdGFydCkgfHwgKGJpdG5vID4gYml0bWFwLT5lbmQpKSB7CisJCWV4dDJmc193YXJuX2JpdG1hcDIoYml0bWFwLCBFWFQyRlNfTUFSS19FUlJPUiwgYml0bm8pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGV4dDJmc19zZXRfYml0KGJpdG5vIC0gYml0bWFwLT5zdGFydCwgYml0bWFwLT5iaXRtYXApOworfQorCitpbnQgZXh0MmZzX3VubWFya19nZW5lcmljX2JpdG1hcChleHQyZnNfZ2VuZXJpY19iaXRtYXAgYml0bWFwLAorCQkJCQkgICBibGtfdCBiaXRubykKK3sKKwlpZiAoKGJpdG5vIDwgYml0bWFwLT5zdGFydCkgfHwgKGJpdG5vID4gYml0bWFwLT5lbmQpKSB7CisJCWV4dDJmc193YXJuX2JpdG1hcDIoYml0bWFwLCBFWFQyRlNfVU5NQVJLX0VSUk9SLCBiaXRubyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZXh0MmZzX2NsZWFyX2JpdChiaXRubyAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9nZXRfcGF0aG5hbWUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9nZXRfcGF0aG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmIxY2MyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2dldF9wYXRobmFtZS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBnZXRfcGF0aG5hbWUuYyAtLS0gZG8gZGlyZWN0cnkvaW5vZGUgLT4gbmFtZSB0cmFuc2xhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKgorICoJZXh0MmZzX2dldF9wYXRobmFtZShmcywgZGlyLCBpbm8sIG5hbWUpCisgKgorICoJVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRha2VzIHR3byBpbm9kZSBudW1iZXJzIGludG8gYQorICoJc3RyaW5nLCBwbGFjaW5nIHRoZSByZXN1bHQgaW4gPG5hbWU+LiAgPGRpcj4gaXMgdGhlIGNvbnRhaW5pbmcKKyAqCWRpcmVjdG9yeSBpbm9kZSwgYW5kIDxpbm8+IGlzIHRoZSBpbm9kZSBudW1iZXIgaXRzZWxmLiAgSWYKKyAqCTxpbm8+IGlzIHplcm8sIHRoZW4gZXh0MmZzX2dldF9wYXRobmFtZSB3aWxsIHJldHVybiBwYXRobmFtZQorICoJb2YgdGhlIGRpcmVjdG9yeSA8ZGlyPi4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK3N0cnVjdCBnZXRfcGF0aG5hbWVfc3RydWN0IHsKKwlleHQyX2lub190CXNlYXJjaF9pbm87CisJZXh0Ml9pbm9fdAlwYXJlbnQ7CisJY2hhcgkJKm5hbWU7CisJZXJyY29kZV90CWVycmNvZGU7Cit9OworCisjaWZkZWYgX19UVVJCT0NfXworIyBwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorc3RhdGljIGludCBnZXRfcGF0aG5hbWVfcHJvYyhzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCSAgICAgaW50CW9mZnNldCBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgICAgIGludAlibG9ja3NpemUgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICBjaGFyCSpidWYgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICB2b2lkCSpwcml2X2RhdGEpCit7CisJc3RydWN0IGdldF9wYXRobmFtZV9zdHJ1Y3QJKmdwOworCWVycmNvZGVfdAkJCXJldHZhbDsKKworCWdwID0gKHN0cnVjdCBnZXRfcGF0aG5hbWVfc3RydWN0ICopIHByaXZfZGF0YTsKKworCWlmICgoKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSA9PSAyKSAmJgorCSAgICAhc3RybmNtcChkaXJlbnQtPm5hbWUsICIuLiIsIDIpKQorCQlncC0+cGFyZW50ID0gZGlyZW50LT5pbm9kZTsKKwlpZiAoZGlyZW50LT5pbm9kZSA9PSBncC0+c2VhcmNoX2lubykgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbSgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpICsgMSwKKwkJCQkJJmdwLT5uYW1lKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZ3AtPmVycmNvZGUgPSByZXR2YWw7CisJCQlyZXR1cm4gRElSRU5UX0FCT1JUOworCQl9CisJCXN0cm5jcHkoZ3AtPm5hbWUsIGRpcmVudC0+bmFtZSwgKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSk7CisJCWdwLT5uYW1lW2RpcmVudC0+bmFtZV9sZW4gJiAweEZGXSA9ICdcMCc7CisJCXJldHVybiBESVJFTlRfQUJPUlQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGV4dDJmc19nZXRfcGF0aG5hbWVfaW50KGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwKKwkJCQkJIGV4dDJfaW5vX3QgaW5vLCBpbnQgbWF4ZGVwdGgsCisJCQkJCSBjaGFyICpidWYsIGNoYXIgKipuYW1lKQoreworCXN0cnVjdCBnZXRfcGF0aG5hbWVfc3RydWN0IGdwOworCWNoYXIJKnBhcmVudF9uYW1lLCAqcmV0OworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlpZiAoZGlyID09IGlubykgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbSgyLCBuYW1lKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXN0cmNweSgqbmFtZSwgKGRpciA9PSBFWFQyX1JPT1RfSU5PKSA/ICIvIiA6ICIuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghZGlyIHx8IChtYXhkZXB0aCA8IDApKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKDQsIG5hbWUpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJc3RyY3B5KCpuYW1lLCAiLi4uIik7CisJCXJldHVybiAwOworCX0KKworCWdwLnNlYXJjaF9pbm8gPSBpbm87CisJZ3AucGFyZW50ID0gMDsKKwlncC5uYW1lID0gMDsKKwlncC5lcnJjb2RlID0gMDsKKworCXJldHZhbCA9IGV4dDJmc19kaXJfaXRlcmF0ZShmcywgZGlyLCAwLCBidWYsIGdldF9wYXRobmFtZV9wcm9jLCAmZ3ApOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoZ3AuZXJyY29kZSkgeworCQlyZXR2YWwgPSBncC5lcnJjb2RlOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0dmFsID0gZXh0MmZzX2dldF9wYXRobmFtZV9pbnQoZnMsIGdwLnBhcmVudCwgZGlyLCBtYXhkZXB0aC0xLAorCQkJCQkgYnVmLCAmcGFyZW50X25hbWUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoIWlubykgeworCQkqbmFtZSA9IHBhcmVudF9uYW1lOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZ3AubmFtZSkKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKHBhcmVudF9uYW1lKStzdHJsZW4oZ3AubmFtZSkrMiwKKwkJCQkJJnJldCk7CisJZWxzZQorCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzdHJsZW4ocGFyZW50X25hbWUpKzUsICZyZXQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCXJldFswXSA9IDA7CisJaWYgKHBhcmVudF9uYW1lWzFdKQorCQlzdHJjYXQocmV0LCBwYXJlbnRfbmFtZSk7CisJc3RyY2F0KHJldCwgIi8iKTsKKwlpZiAoZ3AubmFtZSkKKwkJc3RyY2F0KHJldCwgZ3AubmFtZSk7CisJZWxzZQorCQlzdHJjYXQocmV0LCAiPz8/Iik7CisJKm5hbWUgPSByZXQ7CisJZXh0MmZzX2ZyZWVfbWVtKCZwYXJlbnRfbmFtZSk7CisJcmV0dmFsID0gMDsKKworY2xlYW51cDoKKwlleHQyZnNfZnJlZV9tZW0oJmdwLm5hbWUpOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZ2V0X3BhdGhuYW1lKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgICBjaGFyICoqbmFtZSkKK3sKKwljaGFyCSpidWY7CisJZXJyY29kZV90CXJldHZhbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmYnVmKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWlmIChkaXIgPT0gaW5vKQorCQlpbm8gPSAwOworCXJldHZhbCA9IGV4dDJmc19nZXRfcGF0aG5hbWVfaW50KGZzLCBkaXIsIGlubywgMzIsIGJ1ZiwgbmFtZSk7CisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2V0c2VjdHNpemUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9nZXRzZWN0c2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2VjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2V0c2VjdHNpemUuYwpAQCAtMCwwICsxLDU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBnZXRzZWN0c2l6ZS5jIC0tLSBnZXQgdGhlIHNlY3RvciBzaXplIG9mIGEgZGV2aWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NSBUaGVvZG9yZSBUcydvLgorICogQ29weXJpZ2h0IChDKSAyMDAzIFZNd2FyZSwgSW5jLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9MSU5VWF9GRF9ICisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZmQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX0lPKSAmJiAhZGVmaW5lZChCTEtTU1pHRVQpCisjZGVmaW5lIEJMS1NTWkdFVCAgX0lPKDB4MTIsMTA0KS8qIGdldCBibG9jayBkZXZpY2Ugc2VjdG9yIHNpemUgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpbiBhIHBhcnRpdGlvbgorICovCitlcnJjb2RlX3QgZXh0MmZzX2dldF9kZXZpY2Vfc2VjdHNpemUoY29uc3QgY2hhciAqZmlsZSwgaW50ICpzZWN0c2l6ZSkKK3sKKwlpbnQJZmQ7CisKKyNpZmRlZiBDT05GSUdfTEZTCisJZmQgPSBvcGVuNjQoZmlsZSwgT19SRE9OTFkpOworI2Vsc2UKKwlmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOworI2VuZGlmCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGVycm5vOworCisjaWZkZWYgQkxLU1NaR0VUCisJaWYgKGlvY3RsKGZkLCBCTEtTU1pHRVQsIHNlY3RzaXplKSA+PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJKnNlY3RzaXplID0gMDsKKwljbG9zZShmZCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2V0c2l6ZS5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2dldHNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTRiYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2dldHNpemUuYwpAQCAtMCwwICsxLDI5MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZ2V0c2l6ZS5jIC0tLSBnZXQgdGhlIHNpemUgb2YgYSBwYXJ0aXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk1IFRoZW9kb3JlIFRzJ28uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVk13YXJlLCBJbmMuCisgKgorICogV2luZG93cyB2ZXJzaW9uIG9mIGV4dDJmc19nZXRfZGV2aWNlX3NpemUgYnkgQ2hyaXMgTGksIFZNd2FyZS4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTElOVVhfRkRfSAorI2luY2x1ZGUgPGxpbnV4L2ZkLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19ESVNLTEFCRUxfSAorI2luY2x1ZGUgPHN5cy9kaXNrbGFiZWwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0RJU0tfSAorI2lmZGVmIEhBVkVfU1lTX1FVRVVFX0gKKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4gLyogZm9yIExJU1RfSEVBRCAqLworI2VuZGlmCisjaW5jbHVkZSA8c3lzL2Rpc2suaD4KKyNlbmRpZgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9JTykgJiYgIWRlZmluZWQoQkxLR0VUU0laRSkKKyNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikJLyogcmV0dXJuIGRldmljZSBzaXplICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9JT1IpICYmICFkZWZpbmVkKEJMS0dFVFNJWkU2NCkKKyNkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQkvKiByZXR1cm4gZGV2aWNlIHNpemUgaW4gYnl0ZXMgKHU2NCAqYXJnKSAqLworI2VuZGlmCisKKyNpZmRlZiBBUFBMRV9EQVJXSU4KKyNkZWZpbmUgQkxLR0VUU0laRSBES0lPQ0dFVEJMT0NLQ09VTlQzMgorI2VuZGlmIC8qIEFQUExFX0RBUldJTiAqLworCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKFdJTjMyKQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5pb2N0bC5oPgorCisjaWYgKF9XSU4zMl9XSU5OVCA+PSAweDA1MDApCisjZGVmaW5lIEhBVkVfR0VUX0ZJTEVfU0laRV9FWCAxCisjZW5kaWYKKworZXJyY29kZV90IGV4dDJmc19nZXRfZGV2aWNlX3NpemUoY29uc3QgY2hhciAqZmlsZSwgaW50IGJsb2Nrc2l6ZSwKKwkJCQkgYmxrX3QgKnJldGJsb2NrcykKK3sKKwlIQU5ETEUgZGV2OworCVBBUlRJVElPTl9JTkZPUk1BVElPTiBwaTsKKwlESVNLX0dFT01FVFJZIGdpOworCURXT1JEIHJldGJ5dGVzOworI2lmZGVmIEhBVkVfR0VUX0ZJTEVfU0laRV9FWAorCUxBUkdFX0lOVEVHRVIgZmlsZXNpemU7CisjZWxzZQorCURXT1JEIGZpbGVzaXplOworI2VuZGlmIC8qIEhBVkVfR0VUX0ZJTEVfU0laRV9FWCAqLworCisJZGV2ID0gQ3JlYXRlRmlsZShmaWxlLCBHRU5FUklDX1JFQUQsCisJCQkgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSAsCisJCQkgTlVMTCwgT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKKworCWlmIChkZXYgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJCXJldHVybiBFQkFERjsKKwlpZiAoRGV2aWNlSW9Db250cm9sKGRldiwgSU9DVExfRElTS19HRVRfUEFSVElUSU9OX0lORk8sCisJCQkgICAgJnBpLCBzaXplb2YoUEFSVElUSU9OX0lORk9STUFUSU9OKSwKKwkJCSAgICAmcGksIHNpemVvZihQQVJUSVRJT05fSU5GT1JNQVRJT04pLAorCQkJICAgICZyZXRieXRlcywgTlVMTCkpIHsKKworCQkqcmV0YmxvY2tzID0gcGkuUGFydGl0aW9uTGVuZ3RoLlF1YWRQYXJ0IC8gYmxvY2tzaXplOworCisJfSBlbHNlIGlmIChEZXZpY2VJb0NvbnRyb2woZGV2LCBJT0NUTF9ESVNLX0dFVF9EUklWRV9HRU9NRVRSWSwKKwkJCQkmZ2ksIHNpemVvZihESVNLX0dFT01FVFJZKSwKKwkJCQkmZ2ksIHNpemVvZihESVNLX0dFT01FVFJZKSwKKwkJCQkmcmV0Ynl0ZXMsIE5VTEwpKSB7CisKKwkJKnJldGJsb2NrcyA9IGdpLkJ5dGVzUGVyU2VjdG9yICoKKwkJCSAgICAgZ2kuU2VjdG9yc1BlclRyYWNrICoKKwkJCSAgICAgZ2kuVHJhY2tzUGVyQ3lsaW5kZXIgKgorCQkJICAgICBnaS5DeWxpbmRlcnMuUXVhZFBhcnQgLyBibG9ja3NpemU7CisKKyNpZmRlZiBIQVZFX0dFVF9GSUxFX1NJWkVfRVgKKwl9IGVsc2UgaWYgKEdldEZpbGVTaXplRXgoZGV2LCAmZmlsZXNpemUpKSB7CisJCSpyZXRibG9ja3MgPSBmaWxlc2l6ZS5RdWFkUGFydCAvIGJsb2Nrc2l6ZTsKKwl9CisjZWxzZQorCX0gZWxzZSB7CisJCWZpbGVzaXplID0gR2V0RmlsZVNpemUoZGV2LCBOVUxMKTsKKwkJaWYgKElOVkFMSURfRklMRV9TSVpFICE9IGZpbGVzaXplKSB7CisJCQkqcmV0YmxvY2tzID0gZmlsZXNpemUgLyBibG9ja3NpemU7CisJCX0KKwl9CisjZW5kaWYgLyogSEFWRV9HRVRfRklMRV9TSVpFX0VYICovCisKKwlDbG9zZUhhbmRsZShkZXYpOworCXJldHVybiAwOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IHZhbGlkX29mZnNldCAoaW50IGZkLCBleHQyX2xvZmZfdCBvZmZzZXQpCit7CisJY2hhciBjaDsKKworCWlmIChleHQyZnNfbGxzZWVrIChmZCwgb2Zmc2V0LCAwKSA8IDApCisJCXJldHVybiAwOworCWlmIChyZWFkIChmZCwgJmNoLCAxKSA8IDEpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpbiBhIHBhcnRpdGlvbgorICovCitlcnJjb2RlX3QgZXh0MmZzX2dldF9kZXZpY2Vfc2l6ZShjb25zdCBjaGFyICpmaWxlLCBpbnQgYmxvY2tzaXplLAorCQkJCSBibGtfdCAqcmV0YmxvY2tzKQoreworCWludAlmZDsKKwlpbnQgdmFsaWRfYmxrZ2V0c2l6ZTY0ID0gMTsKKyNpZmRlZiBfX2xpbnV4X18KKwlzdHJ1Y3QJCXV0c25hbWUgdXQ7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTY0OworCXVuc2lnbmVkIGxvbmcJc2l6ZTsKKwlleHQyX2xvZmZfdCBoaWdoLCBsb3c7CisjaWZkZWYgRkRHRVRQUk0KKwlzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB0aGlzX2Zsb3BweTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0RJU0tMQUJFTF9ICisJaW50IHBhcnQ7CisJc3RydWN0IGRpc2tsYWJlbCBsYWI7CisJc3RydWN0IHBhcnRpdGlvbiAqcHA7CisJY2hhciBjaDsKKyNlbmRpZiAvKiBIQVZFX1NZU19ESVNLTEFCRUxfSCAqLworCisjaWZkZWYgQ09ORklHX0xGUworCWZkID0gb3BlbjY0KGZpbGUsIE9fUkRPTkxZKTsKKyNlbHNlCisJZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKTsKKyNlbmRpZgorCWlmIChmZCA8IDApCisJCXJldHVybiBlcnJubzsKKworI2lmZGVmIERLSU9DR0VUQkxPQ0tDT1VOVAkvKiBGb3IgQXBwbGUgRGFyd2luICovCisJaWYgKGlvY3RsKGZkLCBES0lPQ0dFVEJMT0NLQ09VTlQsICZzaXplNjQpID49IDApIHsKKwkJaWYgKChzaXplb2YoKnJldGJsb2NrcykgPCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkKKwkJICAgICYmICgoc2l6ZTY0IC8gKGJsb2Nrc2l6ZSAvIDUxMikpID4gMHhGRkZGRkZGRikpCisJCQlyZXR1cm4gRUZCSUc7CisJCWNsb3NlKGZkKTsKKwkJKnJldGJsb2NrcyA9IHNpemU2NCAvIChibG9ja3NpemUgLyA1MTIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworI2lmZGVmIEJMS0dFVFNJWkU2NAorI2lmZGVmIF9fbGludXhfXworCXVuYW1lKCZ1dCk7CisJaWYgKCh1dC5yZWxlYXNlWzBdID09ICcyJykgJiYgKHV0LnJlbGVhc2VbMV0gPT0gJy4nKSAmJgorCSAgICAgKHV0LnJlbGVhc2VbMl0gPCAnNicpICYmICh1dC5yZWxlYXNlWzNdID09ICcuJykpCisJCXZhbGlkX2Jsa2dldHNpemU2NCA9IDA7CisjZW5kaWYKKwlpZiAodmFsaWRfYmxrZ2V0c2l6ZTY0ICYmCisJICAgIGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsICZzaXplNjQpID49IDApIHsKKwkJaWYgKChzaXplb2YoKnJldGJsb2NrcykgPCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkKKwkJICAgICYmICgoc2l6ZTY0IC8gYmxvY2tzaXplKSA+IDB4RkZGRkZGRkYpKQorCQkJcmV0dXJuIEVGQklHOworCQljbG9zZShmZCk7CisJCSpyZXRibG9ja3MgPSBzaXplNjQgLyBibG9ja3NpemU7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisjaWZkZWYgQkxLR0VUU0laRQorCWlmIChpb2N0bChmZCwgQkxLR0VUU0laRSwgJnNpemUpID49IDApIHsKKwkJY2xvc2UoZmQpOworCQkqcmV0YmxvY2tzID0gc2l6ZSAvIChibG9ja3NpemUgLyA1MTIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworI2lmZGVmIEZER0VUUFJNCisJaWYgKGlvY3RsKGZkLCBGREdFVFBSTSwgJnRoaXNfZmxvcHB5KSA+PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJKnJldGJsb2NrcyA9IHRoaXNfZmxvcHB5LnNpemUgLyAoYmxvY2tzaXplIC8gNTEyKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19ESVNLTEFCRUxfSAorI2lmIGRlZmluZWQoRElPQ0dNRURJQVNJWkUpCisJeworCSAgICBvZmZfdCBtczsKKwkgICAgdV9pbnQgYnM7CisJICAgIGlmIChpb2N0bChmZCwgRElPQ0dNRURJQVNJWkUsICZtcykgPj0gMCkgeworCQkqcmV0YmxvY2tzID0gbXMgLyBibG9ja3NpemU7CisJCXJldHVybiAwOworCSAgICB9CisJfQorI2VsaWYgZGVmaW5lZChESU9DR0RJTkZPKQorCS8qIG9sZCBkaXNrbGFiZWwgaW50ZXJmYWNlICovCisJcGFydCA9IHN0cmxlbihmaWxlKSAtIDE7CisJaWYgKHBhcnQgPj0gMCkgeworCQljaCA9IGZpbGVbcGFydF07CisJCWlmIChpc2RpZ2l0KGNoKSkKKwkJCXBhcnQgPSAwOworCQllbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2gnKQorCQkJcGFydCA9IGNoIC0gJ2EnOworCQllbHNlCisJCQlwYXJ0ID0gLTE7CisJfQorCWlmIChwYXJ0ID49IDAgJiYgKGlvY3RsKGZkLCBESU9DR0RJTkZPLCAoY2hhciAqKSZsYWIpID49IDApKSB7CisJCXBwID0gJmxhYi5kX3BhcnRpdGlvbnNbcGFydF07CisJCWlmIChwcC0+cF9zaXplKSB7CisJCQljbG9zZShmZCk7CisJCQkqcmV0YmxvY2tzID0gcHAtPnBfc2l6ZSAvIChibG9ja3NpemUgLyA1MTIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjZW5kaWYgLyogZGVmaW5lZChESU9DRyopICovCisjZW5kaWYgLyogSEFWRV9TWVNfRElTS0xBQkVMX0ggKi8KKworCS8qCisJICogT0ssIHdlIGNvdWxkbid0IGZpZ3VyZSBpdCBvdXQgYnkgdXNpbmcgYSBzcGVjaWFsaXplZCBpb2N0bCwKKwkgKiB3aGljaCBpcyBnZW5lcmFsbHkgdGhlIGJlc3Qgd2F5LiAgU28gZG8gYmluYXJ5IHNlYXJjaCB0bworCSAqIGZpbmQgdGhlIHNpemUgb2YgdGhlIHBhcnRpdGlvbi4KKwkgKi8KKwlsb3cgPSAwOworCWZvciAoaGlnaCA9IDEwMjQ7IHZhbGlkX29mZnNldCAoZmQsIGhpZ2gpOyBoaWdoICo9IDIpCisJCWxvdyA9IGhpZ2g7CisJd2hpbGUgKGxvdyA8IGhpZ2ggLSAxKQorCXsKKwkJY29uc3QgZXh0Ml9sb2ZmX3QgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKworCQlpZiAodmFsaWRfb2Zmc2V0IChmZCwgbWlkKSkKKwkJCWxvdyA9IG1pZDsKKwkJZWxzZQorCQkJaGlnaCA9IG1pZDsKKwl9CisJdmFsaWRfb2Zmc2V0IChmZCwgMCk7CisJY2xvc2UoZmQpOworCXNpemU2NCA9IGxvdyArIDE7CisJaWYgKChzaXplb2YoKnJldGJsb2NrcykgPCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkKKwkgICAgJiYgKChzaXplNjQgLyBibG9ja3NpemUpID4gMHhGRkZGRkZGRikpCisJCXJldHVybiBFRkJJRzsKKwkqcmV0YmxvY2tzID0gc2l6ZTY0IC8gYmxvY2tzaXplOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogV0lOMzIgKi8KKworI2lmZGVmIERFQlVHCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYmxrX3QJYmxvY2tzOworCWludAlyZXR2YWw7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgZGV2aWNlXG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X2RldmljZV9zaXplKGFyZ3ZbMV0sIDEwMjQsICZibG9ja3MpOworCWlmIChyZXR2YWwpIHsKKwkJY29tX2Vycihhcmd2WzBdLCByZXR2YWwsCisJCQkid2hpbGUgY2FsbGluZyBleHQyZnNfZ2V0X2RldmljZV9zaXplIik7CisJCWV4aXQoMSk7CisJfQorCXByaW50ZigiRGV2aWNlICVzIGhhcyAlZCAxayBibG9ja3MuXG4iLCBhcmd2WzFdLCBibG9ja3MpOworCWV4aXQoMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pY291bnQuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pY291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI1ZjUxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ljb3VudC5jCkBAIC0wLDAgKzEsNDY3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpY291bnQuYyAtLS0gYW4gZWZmaWNpZW50IGlub2RlIGNvdW50IGFic3RyYWN0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIFRoZSBkYXRhIHN0b3JhZ2Ugc3RyYXRlZ3kgdXNlZCBieSBpY291bnQgcmVsaWVzIG9uIHRoZSBvYnNlcnZhdGlvbgorICogdGhhdCBtb3N0IGlub2RlIGNvdW50cyBhcmUgZWl0aGVyIHplcm8gKGZvciBub24tYWxsb2NhdGVkIGlub2RlcyksCisgKiBvbmUgKGZvciBtb3N0IGZpbGVzKSwgYW5kIG9ubHkgYSBmZXcgdGhhdCBhcmUgdHdvIG9yIG1vcmUKKyAqIChkaXJlY3RvcmllcyBhbmQgZmlsZXMgdGhhdCBhcmUgbGlua2VkIHRvIG1vcmUgdGhhbiBvbmUgZGlyZWN0b3J5KS4KKyAqCisgKiBBbHNvLCBlMmZzY2sgdGVuZHMgdG8gbG9hZCB0aGUgaWNvdW50IGRhdGEgc2VxdWVudGlhbGx5LgorICoKKyAqIFNvLCB3ZSB1c2UgYW4gaW5vZGUgYml0bWFwIHRvIGluZGljYXRlIHdoaWNoIGlub2RlcyBoYXZlIGEgY291bnQgb2YKKyAqIG9uZSwgYW5kIHRoZW4gdXNlIGEgc29ydGVkIGxpc3QgdG8gc3RvcmUgdGhlIGNvdW50cyBmb3IgaW5vZGVzCisgKiB3aGljaCBhcmUgZ3JlYXRlciB0aGFuIG9uZS4KKyAqCisgKiBXZSBhbHNvIHVzZSBhbiBvcHRpb25hbCBiaXRtYXAgdG8gaW5kaWNhdGUgd2hpY2ggaW5vZGVzIGFyZSBhbHJlYWR5CisgKiBpbiB0aGUgc29ydGVkIGxpc3QsIHRvIHNwZWVkIHVwIHRoZSB1c2Ugb2YgdGhpcyBhYnN0cmFjdGlvbiBieQorICogZTJmc2NrJ3MgcGFzcyAyLiAgUGFzcyAyIGluY3JlbWVudHMgaW5vZGUgY291bnRzIGFzIGl0IGZpbmRzIHRoZW0sCisgKiBzbyB0aGlzIGV4dHJhIGJpdG1hcCBhdm9pZHMgc2VhcmNoaW5nIHRoZSBzb3J0ZWQgbGlzdCB0byBzZWUgaWYgYQorICogcGFydGljdWxhciBpbm9kZSBpcyBvbiB0aGUgc29ydGVkIGxpc3QgYWxyZWFkeS4KKyAqLworCitzdHJ1Y3QgZXh0Ml9pY291bnRfZWwgeworCWV4dDJfaW5vX3QJaW5vOworCV9fdTE2CWNvdW50OworfTsKKworc3RydWN0IGV4dDJfaWNvdW50IHsKKwllcnJjb2RlX3QJCW1hZ2ljOworCWV4dDJmc19pbm9kZV9iaXRtYXAJc2luZ2xlOworCWV4dDJmc19pbm9kZV9iaXRtYXAJbXVsdGlwbGU7CisJZXh0Ml9pbm9fdAkJY291bnQ7CisJZXh0Ml9pbm9fdAkJc2l6ZTsKKwlleHQyX2lub190CQludW1faW5vZGVzOworCWV4dDJfaW5vX3QJCWN1cnNvcjsKKwlzdHJ1Y3QgZXh0Ml9pY291bnRfZWwJKmxpc3Q7Cit9OworCit2b2lkIGV4dDJmc19mcmVlX2ljb3VudChleHQyX2ljb3VudF90IGljb3VudCkKK3sKKwlpZiAoIWljb3VudCkKKwkJcmV0dXJuOworCisJaWNvdW50LT5tYWdpYyA9IDA7CisJZXh0MmZzX2ZyZWVfbWVtKCZpY291bnQtPmxpc3QpOworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChpY291bnQtPnNpbmdsZSk7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGljb3VudC0+bXVsdGlwbGUpOworCWV4dDJmc19mcmVlX21lbSgmaWNvdW50KTsKK30KKworZXJyY29kZV90IGV4dDJmc19jcmVhdGVfaWNvdW50MihleHQyX2ZpbHN5cyBmcywgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQlleHQyX2ljb3VudF90IGhpbnQsIGV4dDJfaWNvdW50X3QgKnJldCkKK3sKKwlleHQyX2ljb3VudF90CWljb3VudDsKKwllcnJjb2RlX3QJcmV0dmFsOworCXNpemVfdAkJYnl0ZXM7CisJZXh0Ml9pbm9fdAlpOworCisJaWYgKGhpbnQpIHsKKwkJRVhUMl9DSEVDS19NQUdJQyhoaW50LCBFWFQyX0VUX01BR0lDX0lDT1VOVCk7CisJCWlmIChoaW50LT5zaXplID4gc2l6ZSkKKwkJCXNpemUgPSAoc2l6ZV90KSBoaW50LT5zaXplOworCX0KKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0Ml9pY291bnQpLCAmaWNvdW50KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW1lbXNldChpY291bnQsIDAsIHNpemVvZihzdHJ1Y3QgZXh0Ml9pY291bnQpKTsKKworCXJldHZhbCA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsIDAsCisJCQkJCSAgICAgICZpY291bnQtPnNpbmdsZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisKKwlpZiAoZmxhZ3MgJiBFWFQyX0lDT1VOVF9PUFRfSU5DUkVNRU5UKSB7CisJCXJldHZhbCA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsIDAsCisJCQkJCQkgICAgICAmaWNvdW50LT5tdWx0aXBsZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKwl9IGVsc2UKKwkJaWNvdW50LT5tdWx0aXBsZSA9IDA7CisKKwlpZiAoc2l6ZSkgeworCQlpY291bnQtPnNpemUgPSBzaXplOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZpZ3VyZSBvdXQgaG93IG1hbnkgc3BlY2lhbCBjYXNlIGlub2RlIGNvdW50cyB3ZSB3aWxsCisJCSAqIGhhdmUuICBXZSBrbm93IHdlIHdpbGwgbmVlZCBvbmUgZm9yIGVhY2ggZGlyZWN0b3J5OworCQkgKiB3ZSBhbHNvIG5lZWQgdG8gcmVzZXJ2ZSBzb21lIGV4dHJhIHJvb20gZm9yIGZpbGUgbGlua3MKKwkJICovCisJCXJldHZhbCA9IGV4dDJmc19nZXRfbnVtX2RpcnMoZnMsICZpY291bnQtPnNpemUpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvdXQ7CisJCWljb3VudC0+c2l6ZSArPSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50IC8gNTA7CisJfQorCisJYnl0ZXMgPSAoc2l6ZV90KSAoaWNvdW50LT5zaXplICogc2l6ZW9mKHN0cnVjdCBleHQyX2ljb3VudF9lbCkpOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGJ5dGVzLCAmaWNvdW50LT5saXN0KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQoaWNvdW50LT5saXN0LCAwLCBieXRlcyk7CisKKwlpY291bnQtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19JQ09VTlQ7CisJaWNvdW50LT5jb3VudCA9IDA7CisJaWNvdW50LT5jdXJzb3IgPSAwOworCWljb3VudC0+bnVtX2lub2RlcyA9IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQ7CisKKwkvKgorCSAqIFBvcHVsYXRlIHRoZSBzb3J0ZWQgbGlzdCB3aXRoIHRob3NlIGVudHJpZXMgd2hpY2ggd2VyZQorCSAqIGZvdW5kIGluIHRoZSBoaW50IGljb3VudCAoc2luY2UgdGhvc2UgYXJlIG9uZXMgd2hpY2ggd2lsbAorCSAqIGxpa2VseSBuZWVkIHRvIGJlIGluIHRoZSBzb3J0ZWQgbGlzdCB0aGlzIHRpbWUgYXJvdW5kKS4KKwkgKi8KKwlpZiAoaGludCkgeworCQlmb3IgKGk9MDsgaSA8IGhpbnQtPmNvdW50OyBpKyspCisJCQlpY291bnQtPmxpc3RbaV0uaW5vID0gaGludC0+bGlzdFtpXS5pbm87CisJCWljb3VudC0+Y291bnQgPSBoaW50LT5jb3VudDsKKwl9CisKKwkqcmV0ID0gaWNvdW50OworCXJldHVybiAwOworCitlcnJvdXQ6CisJZXh0MmZzX2ZyZWVfaWNvdW50KGljb3VudCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworZXJyY29kZV90IGV4dDJmc19jcmVhdGVfaWNvdW50KGV4dDJfZmlsc3lzIGZzLCBpbnQgZmxhZ3MsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkgICAgICAgZXh0Ml9pY291bnRfdCAqcmV0KQoreworCXJldHVybiBleHQyZnNfY3JlYXRlX2ljb3VudDIoZnMsIGZsYWdzLCBzaXplLCAwLCByZXQpOworfQorCisvKgorICogaW5zZXJ0X2ljb3VudF9lbCgpIC0tLSBJbnNlcnQgYSBuZXcgZW50cnkgaW50byB0aGUgc29ydGVkIGxpc3QgYXQgYQorICoJc3BlY2lmaWVkIHBvc2l0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGV4dDJfaWNvdW50X2VsICppbnNlcnRfaWNvdW50X2VsKGV4dDJfaWNvdW50X3QgaWNvdW50LAorCQkJCQkgICAgZXh0Ml9pbm9fdCBpbm8sIGludCBwb3MpCit7CisJc3RydWN0IGV4dDJfaWNvdW50X2VsCSplbDsKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlleHQyX2lub190CQkJbmV3X3NpemUgPSAwOworCWludAkJCW51bTsKKworCWlmIChpY291bnQtPmNvdW50ID49IGljb3VudC0+c2l6ZSkgeworCQlpZiAoaWNvdW50LT5jb3VudCkgeworCQkJbmV3X3NpemUgPSBpY291bnQtPmxpc3RbKHVuc2lnbmVkKWljb3VudC0+Y291bnQtMV0uaW5vOworCQkJbmV3X3NpemUgPSAoZXh0Ml9pbm9fdCkgKGljb3VudC0+Y291bnQgKgorCQkJCSgoZmxvYXQpIGljb3VudC0+bnVtX2lub2RlcyAvIG5ld19zaXplKSk7CisJCX0KKwkJaWYgKG5ld19zaXplIDwgKGljb3VudC0+c2l6ZSArIDEwMCkpCisJCQluZXdfc2l6ZSA9IGljb3VudC0+c2l6ZSArIDEwMDsKKwkJcmV0dmFsID0gZXh0MmZzX3Jlc2l6ZV9tZW0oKHNpemVfdCkgaWNvdW50LT5zaXplICoKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBleHQyX2ljb3VudF9lbCksCisJCQkJCSAgIChzaXplX3QpIG5ld19zaXplICoKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBleHQyX2ljb3VudF9lbCksCisJCQkJCSAgICZpY291bnQtPmxpc3QpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIDA7CisJCWljb3VudC0+c2l6ZSA9IG5ld19zaXplOworCX0KKwludW0gPSAoaW50KSBpY291bnQtPmNvdW50IC0gcG9zOworCWlmIChudW0gPCAwKQorCQlyZXR1cm4gMDsJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCWlmIChudW0pIHsKKwkJbWVtbW92ZSgmaWNvdW50LT5saXN0W3BvcysxXSwgJmljb3VudC0+bGlzdFtwb3NdLAorCQkJc2l6ZW9mKHN0cnVjdCBleHQyX2ljb3VudF9lbCkgKiBudW0pOworCX0KKwlpY291bnQtPmNvdW50Kys7CisJZWwgPSAmaWNvdW50LT5saXN0W3Bvc107CisJZWwtPmNvdW50ID0gMDsKKwllbC0+aW5vID0gaW5vOworCXJldHVybiBlbDsKK30KKworLyoKKyAqIGdldF9pY291bnRfZWwoKSAtLS0gZ2l2ZW4gYW4gaW5vZGUgbnVtYmVyLCB0cnkgdG8gZmluZCBpY291bnQKKyAqCWluZm9ybWF0aW9uIGluIHRoZSBzb3J0ZWQgbGlzdC4gIElmIHRoZSBjcmVhdGUgZmxhZyBpcyBzZXQsCisgKglhbmQgd2UgY2FuJ3QgZmluZCBhbiBlbnRyeSwgY3JlYXRlIG9uZSBpbiB0aGUgc29ydGVkIGxpc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZXh0Ml9pY291bnRfZWwgKmdldF9pY291bnRfZWwoZXh0Ml9pY291bnRfdCBpY291bnQsCisJCQkJCSAgICBleHQyX2lub190IGlubywgaW50IGNyZWF0ZSkKK3sKKwlmbG9hdAlyYW5nZTsKKwlpbnQJbG93LCBoaWdoLCBtaWQ7CisJZXh0Ml9pbm9fdAlsb3d2YWwsIGhpZ2h2YWw7CisKKwlpZiAoIWljb3VudCB8fCAhaWNvdW50LT5saXN0KQorCQlyZXR1cm4gMDsKKworCWlmIChjcmVhdGUgJiYgKChpY291bnQtPmNvdW50ID09IDApIHx8CisJCSAgICAgICAoaW5vID4gaWNvdW50LT5saXN0Wyh1bnNpZ25lZClpY291bnQtPmNvdW50LTFdLmlubykpKSB7CisJCXJldHVybiBpbnNlcnRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAodW5zaWduZWQpIGljb3VudC0+Y291bnQpOworCX0KKwlpZiAoaWNvdW50LT5jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChpY291bnQtPmN1cnNvciA+PSBpY291bnQtPmNvdW50KQorCQlpY291bnQtPmN1cnNvciA9IDA7CisJaWYgKGlubyA9PSBpY291bnQtPmxpc3RbaWNvdW50LT5jdXJzb3JdLmlubykKKwkJcmV0dXJuICZpY291bnQtPmxpc3RbaWNvdW50LT5jdXJzb3IrK107CisJbG93ID0gMDsKKwloaWdoID0gKGludCkgaWNvdW50LT5jb3VudC0xOworCXdoaWxlIChsb3cgPD0gaGlnaCkgeworCQlpZiAobG93ID09IGhpZ2gpCisJCQltaWQgPSBsb3c7CisJCWVsc2UgeworCQkJLyogSW50ZXJwb2xhdGUgZm9yIGVmZmljaWVuY3kgKi8KKwkJCWxvd3ZhbCA9IGljb3VudC0+bGlzdFtsb3ddLmlubzsKKwkJCWhpZ2h2YWwgPSBpY291bnQtPmxpc3RbaGlnaF0uaW5vOworCisJCQlpZiAoaW5vIDwgbG93dmFsKQorCQkJCXJhbmdlID0gMDsKKwkJCWVsc2UgaWYgKGlubyA+IGhpZ2h2YWwpCisJCQkJcmFuZ2UgPSAxOworCQkJZWxzZQorCQkJCXJhbmdlID0gKChmbG9hdCkgKGlubyAtIGxvd3ZhbCkpIC8KKwkJCQkJKGhpZ2h2YWwgLSBsb3d2YWwpOworCQkJbWlkID0gbG93ICsgKChpbnQpIChyYW5nZSAqIChoaWdoLWxvdykpKTsKKwkJfQorCQlpZiAoaW5vID09IGljb3VudC0+bGlzdFttaWRdLmlubykgeworCQkJaWNvdW50LT5jdXJzb3IgPSBtaWQrMTsKKwkJCXJldHVybiAmaWNvdW50LT5saXN0W21pZF07CisJCX0KKwkJaWYgKGlubyA8IGljb3VudC0+bGlzdFttaWRdLmlubykKKwkJCWhpZ2ggPSBtaWQtMTsKKwkJZWxzZQorCQkJbG93ID0gbWlkKzE7CisJfQorCS8qCisJICogSWYgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgZW50cnksIGl0IHNob3VsZCBiZSByaWdodCBhdAorCSAqIGxvdyAod2hlcmUgaGlnaCB3aWxsIGJlIGxlZnQgYXQgbG93LTEpLgorCSAqLworCWlmIChjcmVhdGUpCisJCXJldHVybiBpbnNlcnRfaWNvdW50X2VsKGljb3VudCwgaW5vLCBsb3cpOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF92YWxpZGF0ZShleHQyX2ljb3VudF90IGljb3VudCwgRklMRSAqb3V0KQoreworCWVycmNvZGVfdAlyZXQgPSAwOworCXVuc2lnbmVkIGludAlpOworCWNvbnN0IGNoYXIgKmJhZCA9ICJiYWQgaWNvdW50IjsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoaWNvdW50LCBFWFQyX0VUX01BR0lDX0lDT1VOVCk7CisKKwlpZiAoaWNvdW50LT5jb3VudCA+IGljb3VudC0+c2l6ZSkgeworCQlmcHJpbnRmKG91dCwgIiVzOiBjb3VudCA+IHNpemVcbiIsIGJhZCk7CisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJfQorCWZvciAoaT0xOyBpIDwgaWNvdW50LT5jb3VudDsgaSsrKSB7CisJCWlmIChpY291bnQtPmxpc3RbaS0xXS5pbm8gPj0gaWNvdW50LT5saXN0W2ldLmlubykgeworCQkJZnByaW50ZihvdXQsICIlczogbGlzdFslZF0uaW5vPSV1LCBsaXN0WyVkXS5pbm89JXVcbiIsCisJCQkJYmFkLCBpLTEsIGljb3VudC0+bGlzdFtpLTFdLmlubywKKwkJCQlpLCBpY291bnQtPmxpc3RbaV0uaW5vKTsKKwkJCXJldCA9IEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF9mZXRjaChleHQyX2ljb3VudF90IGljb3VudCwgZXh0Ml9pbm9fdCBpbm8sIF9fdTE2ICpyZXQpCit7CisJc3RydWN0IGV4dDJfaWNvdW50X2VsCSplbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoaWNvdW50LCBFWFQyX0VUX01BR0lDX0lDT1VOVCk7CisKKwlpZiAoIWlubyB8fCAoaW5vID4gaWNvdW50LT5udW1faW5vZGVzKSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCWlmIChleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoaWNvdW50LT5zaW5nbGUsIGlubykpIHsKKwkJKnJldCA9IDE7CisJCXJldHVybiAwOworCX0KKwlpZiAoaWNvdW50LT5tdWx0aXBsZSAmJgorCSAgICAhZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGljb3VudC0+bXVsdGlwbGUsIGlubykpIHsKKwkJKnJldCA9IDA7CisJCXJldHVybiAwOworCX0KKwllbCA9IGdldF9pY291bnRfZWwoaWNvdW50LCBpbm8sIDApOworCWlmICghZWwpIHsKKwkJKnJldCA9IDA7CisJCXJldHVybiAwOworCX0KKwkqcmV0ID0gZWwtPmNvdW50OworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF9pbmNyZW1lbnQoZXh0Ml9pY291bnRfdCBpY291bnQsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgX191MTYgKnJldCkKK3sKKwlzdHJ1Y3QgZXh0Ml9pY291bnRfZWwJKmVsOworCisJRVhUMl9DSEVDS19NQUdJQyhpY291bnQsIEVYVDJfRVRfTUFHSUNfSUNPVU5UKTsKKworCWlmICghaW5vIHx8IChpbm8gPiBpY291bnQtPm51bV9pbm9kZXMpKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChpY291bnQtPnNpbmdsZSwgaW5vKSkgeworCQkvKgorCQkgKiBJZiB0aGUgZXhpc3RpbmcgY291bnQgaXMgMSwgdGhlbiB3ZSBrbm93IHRoZXJlIGlzCisJCSAqIG5vIGVudHJ5IGluIHRoZSBsaXN0LgorCQkgKi8KKwkJZWwgPSBnZXRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAxKTsKKwkJaWYgKCFlbCkKKwkJCXJldHVybiBFWFQyX0VUX05PX01FTU9SWTsKKwkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoaWNvdW50LT5zaW5nbGUsIGlubyk7CisJCWVsLT5jb3VudCA9IDI7CisJfSBlbHNlIGlmIChpY291bnQtPm11bHRpcGxlKSB7CisJCS8qCisJCSAqIFRoZSBjb3VudCBpcyBlaXRoZXIgemVybyBvciBncmVhdGVyIHRoYW4gMTsgaWYgdGhlCisJCSAqIGlub2RlIGlzIHNldCBpbiBpY291bnQtPm11bHRpcGxlLCB0aGVuIHRoZXJlIHNob3VsZAorCQkgKiBiZSBhbiBlbnRyeSBpbiB0aGUgbGlzdCwgc28gZmluZCBpdCB1c2luZworCQkgKiBnZXRfaWNvdW50X2VsKCkuCisJCSAqLworCQlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGljb3VudC0+bXVsdGlwbGUsIGlubykpIHsKKwkJCWVsID0gZ2V0X2ljb3VudF9lbChpY291bnQsIGlubywgMSk7CisJCQlpZiAoIWVsKQorCQkJCXJldHVybiBFWFQyX0VUX05PX01FTU9SWTsKKwkJCWVsLT5jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBjb3VudCB3YXMgemVybzsgbWFyayB0aGUgc2luZ2xlIGJpdG1hcAorCQkJICogYW5kIHJldHVybi4KKwkJCSAqLworCQl6ZXJvX2NvdW50OgorCQkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pOworCQkJaWYgKHJldCkKKwkJCQkqcmV0ID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIGNvdW50IGlzIGVpdGhlciB6ZXJvIG9yIGdyZWF0ZXIgdGhhbiAxOyB0cnkgdG8KKwkJICogZmluZCBhbiBlbnRyeSBpbiB0aGUgbGlzdCB0byBkZXRlcm1pbmUgd2hpY2guCisJCSAqLworCQllbCA9IGdldF9pY291bnRfZWwoaWNvdW50LCBpbm8sIDApOworCQlpZiAoIWVsKSB7CisJCQkvKiBObyBlbnRyeSBtZWFucyB0aGUgY291bnQgd2FzIHplcm8gKi8KKwkJCWdvdG8gemVyb19jb3VudDsKKwkJfQorCQllbCA9IGdldF9pY291bnRfZWwoaWNvdW50LCBpbm8sIDEpOworCQlpZiAoIWVsKQorCQkJcmV0dXJuIEVYVDJfRVRfTk9fTUVNT1JZOworCQllbC0+Y291bnQrKzsKKwl9CisJaWYgKGljb3VudC0+bXVsdGlwbGUpCisJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChpY291bnQtPm11bHRpcGxlLCBpbm8pOworCWlmIChyZXQpCisJCSpyZXQgPSBlbC0+Y291bnQ7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfaWNvdW50X2RlY3JlbWVudChleHQyX2ljb3VudF90IGljb3VudCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICBfX3UxNiAqcmV0KQoreworCXN0cnVjdCBleHQyX2ljb3VudF9lbAkqZWw7CisKKwlpZiAoIWlubyB8fCAoaW5vID4gaWNvdW50LT5udW1faW5vZGVzKSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoaWNvdW50LCBFWFQyX0VUX01BR0lDX0lDT1VOVCk7CisKKwlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pKSB7CisJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pOworCQlpZiAoaWNvdW50LT5tdWx0aXBsZSkKKwkJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+bXVsdGlwbGUsIGlubyk7CisJCWVsc2UgeworCQkJZWwgPSBnZXRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAwKTsKKwkJCWlmIChlbCkKKwkJCQllbC0+Y291bnQgPSAwOworCQl9CisJCWlmIChyZXQpCisJCQkqcmV0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGljb3VudC0+bXVsdGlwbGUgJiYKKwkgICAgIWV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChpY291bnQtPm11bHRpcGxlLCBpbm8pKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJZWwgPSBnZXRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAwKTsKKwlpZiAoIWVsIHx8IGVsLT5jb3VudCA9PSAwKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJZWwtPmNvdW50LS07CisJaWYgKGVsLT5jb3VudCA9PSAxKQorCQlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoaWNvdW50LT5zaW5nbGUsIGlubyk7CisJaWYgKChlbC0+Y291bnQgPT0gMCkgJiYgaWNvdW50LT5tdWx0aXBsZSkKKwkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoaWNvdW50LT5tdWx0aXBsZSwgaW5vKTsKKworCWlmIChyZXQpCisJCSpyZXQgPSBlbC0+Y291bnQ7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfaWNvdW50X3N0b3JlKGV4dDJfaWNvdW50X3QgaWNvdW50LCBleHQyX2lub190IGlubywKKwkJCSAgICAgIF9fdTE2IGNvdW50KQoreworCXN0cnVjdCBleHQyX2ljb3VudF9lbAkqZWw7CisKKwlpZiAoIWlubyB8fCAoaW5vID4gaWNvdW50LT5udW1faW5vZGVzKSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoaWNvdW50LCBFWFQyX0VUX01BR0lDX0lDT1VOVCk7CisKKwlpZiAoY291bnQgPT0gMSkgeworCQlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoaWNvdW50LT5zaW5nbGUsIGlubyk7CisJCWlmIChpY291bnQtPm11bHRpcGxlKQorCQkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoaWNvdW50LT5tdWx0aXBsZSwgaW5vKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjb3VudCA9PSAwKSB7CisJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pOworCQlpZiAoaWNvdW50LT5tdWx0aXBsZSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBpY291bnQtPm11bHRpcGxlIGJpdG1hcCBpcyBlbmFibGVkLAorCQkJICogd2UgY2FuIGp1c3QgY2xlYXIgYm90aCBiaXRtYXBzIGFuZCB3ZSdyZSBkb25lCisJCQkgKi8KKwkJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+bXVsdGlwbGUsIGlubyk7CisJCX0gZWxzZSB7CisJCQllbCA9IGdldF9pY291bnRfZWwoaWNvdW50LCBpbm8sIDApOworCQkJaWYgKGVsKQorCQkJCWVsLT5jb3VudCA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGljb3VudCBlbGVtZW50CisJICovCisJZWwgPSBnZXRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAxKTsKKwlpZiAoIWVsKQorCQlyZXR1cm4gRVhUMl9FVF9OT19NRU1PUlk7CisJZWwtPmNvdW50ID0gY291bnQ7CisJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoaWNvdW50LT5zaW5nbGUsIGlubyk7CisJaWYgKGljb3VudC0+bXVsdGlwbGUpCisJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChpY291bnQtPm11bHRpcGxlLCBpbm8pOworCXJldHVybiAwOworfQorCitleHQyX2lub190IGV4dDJmc19nZXRfaWNvdW50X3NpemUoZXh0Ml9pY291bnRfdCBpY291bnQpCit7CisJaWYgKCFpY291bnQgfHwgaWNvdW50LT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0lDT1VOVCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaWNvdW50LT5zaXplOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ltYWdlci5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ltYWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOWNmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW1hZ2VyLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGltYWdlLmMgLS0tIHdyaXRlcyBvdXQgdGhlIGNyaXRpY2FsIHBhcnRzIG9mIHRoZSBmaWxlc3lzdGVtIGFzIGEKKyAqCWZsYXQgZmlsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgVGhlb2RvcmUgVHMnby4KKyAqCisgKiBOb3RlOiB0aGlzIHVzZXMgdGhlIFBPU0lYIElPIGludGVyZmFjZXMsIHVubGlrZSBtb3N0IG9mIHRoZSBvdGhlcgorICogZnVuY3Rpb25zIGluIHRoaXMgbGlicmFyeS4gIFNvIHN1ZSBtZS4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKyNpZm5kZWYgSEFWRV9UWVBFX1NTSVpFX1QKK3R5cGVkZWYgaW50IHNzaXplX3Q7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoZSBzcGVjaWZpZWQgYmxvY2sgaXMgYWxsIHplcm9zCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfemVyb19ibG9jayhjaGFyICpidWYsIGludCBibG9ja3NpemUpCit7CisJY2hhcgkqY3AgPSBidWY7CisJaW50CWxlZnQgPSBibG9ja3NpemU7CisKKwl3aGlsZSAobGVmdCA+IDApIHsKKwkJaWYgKCpjcCsrKQorCQkJcmV0dXJuIDA7CisJCWxlZnQtLTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgaW5vZGUgdGFibGUgb3V0IGFzIGEgc2luZ2xlIGJsb2NrLgorICovCisjZGVmaW5lIEJVRl9CTE9DS1MJMzIKKworZXJyY29kZV90IGV4dDJmc19pbWFnZV9pbm9kZV93cml0ZShleHQyX2ZpbHN5cyBmcywgaW50IGZkLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgaW50CWdyb3VwLCBsZWZ0LCBjLCBkOworCWNoYXIJCSpidWYsICpjcDsKKwlibGtfdAkJYmxrOworCXNzaXplX3QJCWFjdHVhbDsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJYnVmID0geG1hbGxvYyhmcy0+YmxvY2tzaXplICogQlVGX0JMT0NLUyk7CisKKwlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgZ3JvdXArKykgeworCQlibGsgPSBmcy0+Z3JvdXBfZGVzY1sodW5zaWduZWQpZ3JvdXBdLmJnX2lub2RlX3RhYmxlOworCQlpZiAoIWJsaykKKwkJCXJldHVybiBFWFQyX0VUX01JU1NJTkdfSU5PREVfVEFCTEU7CisJCWxlZnQgPSBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cDsKKwkJd2hpbGUgKGxlZnQpIHsKKwkJCWMgPSBCVUZfQkxPQ0tTOworCQkJaWYgKGMgPiBsZWZ0KQorCQkJCWMgPSBsZWZ0OworCQkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIGJsaywgYywgYnVmKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBlcnJvdXQ7CisJCQljcCA9IGJ1ZjsKKwkJCXdoaWxlIChjKSB7CisJCQkJaWYgKCEoZmxhZ3MgJiBJTUFHRVJfRkxBR19TUEFSU0VXUklURSkpIHsKKwkJCQkJZCA9IGM7CisJCQkJCWdvdG8gc2tpcF9zcGFyc2U7CisJCQkJfQorCQkJCS8qIFNraXAgemVybyBibG9ja3MgKi8KKwkJCQlpZiAoY2hlY2tfemVyb19ibG9jayhjcCwgZnMtPmJsb2Nrc2l6ZSkpIHsKKwkJCQkJYy0tOworCQkJCQlibGsrKzsKKwkJCQkJbGVmdC0tOworCQkJCQljcCArPSBmcy0+YmxvY2tzaXplOworCQkJCQlsc2VlayhmZCwgZnMtPmJsb2Nrc2l6ZSwgU0VFS19DVVIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogRmluZCBub24temVybyBibG9ja3MgKi8KKwkJCQlmb3IgKGQ9MTsgZCA8IGM7IGQrKykgeworCQkJCQlpZiAoY2hlY2tfemVyb19ibG9jayhjcCArIGQqZnMtPmJsb2Nrc2l6ZSwgZnMtPmJsb2Nrc2l6ZSkpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQlza2lwX3NwYXJzZToKKwkJCQlhY3R1YWwgPSB3cml0ZShmZCwgY3AsIGZzLT5ibG9ja3NpemUgKiBkKTsKKwkJCQlpZiAoYWN0dWFsID09IC0xKSB7CisJCQkJCXJldHZhbCA9IGVycm5vOworCQkJCQlnb3RvIGVycm91dDsKKwkJCQl9CisJCQkJaWYgKGFjdHVhbCAhPSAoc3NpemVfdCkgKGZzLT5ibG9ja3NpemUgKiBkKSkgeworCQkJCQlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1dSSVRFOworCQkJCQlnb3RvIGVycm91dDsKKwkJCQl9CisJCQkJYmxrICs9IGQ7CisJCQkJbGVmdCAtPSBkOworCQkJCWNwICs9IGZzLT5ibG9ja3NpemUgKiBkOworCQkJCWMgLT0gZDsKKwkJCX0KKwkJfQorCX0KKwlyZXR2YWwgPSAwOworCitlcnJvdXQ6CisJZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZWFkIGluIHRoZSBpbm9kZSB0YWJsZSBhbmQgc3R1ZmYgaXQgaW50byBwbGFjZQorICovCitlcnJjb2RlX3QgZXh0MmZzX2ltYWdlX2lub2RlX3JlYWQoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwKKwkJCQkgIGludCBmbGFncyBFWFQyRlNfQVRUUigodW51c2VkKSkpCit7CisJdW5zaWduZWQgaW50CWdyb3VwLCBjLCBsZWZ0OworCWNoYXIJCSpidWY7CisJYmxrX3QJCWJsazsKKwlzc2l6ZV90CQlhY3R1YWw7CisJZXJyY29kZV90CXJldHZhbDsKKworCWJ1ZiA9IHhtYWxsb2MoZnMtPmJsb2Nrc2l6ZSAqIEJVRl9CTE9DS1MpOworCisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGdyb3VwKyspIHsKKwkJYmxrID0gZnMtPmdyb3VwX2Rlc2NbKHVuc2lnbmVkKWdyb3VwXS5iZ19pbm9kZV90YWJsZTsKKwkJaWYgKCFibGspIHsKKwkJCXJldHZhbCA9IEVYVDJfRVRfTUlTU0lOR19JTk9ERV9UQUJMRTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCWxlZnQgPSBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cDsKKwkJd2hpbGUgKGxlZnQpIHsKKwkJCWMgPSBCVUZfQkxPQ0tTOworCQkJaWYgKGMgPiBsZWZ0KQorCQkJCWMgPSBsZWZ0OworCQkJYWN0dWFsID0gcmVhZChmZCwgYnVmLCBmcy0+YmxvY2tzaXplICogYyk7CisJCQlpZiAoYWN0dWFsID09IC0xKSB7CisJCQkJcmV0dmFsID0gZXJybm87CisJCQkJZ290byBlcnJvdXQ7CisJCQl9CisJCQlpZiAoYWN0dWFsICE9IChzc2l6ZV90KSAoZnMtPmJsb2Nrc2l6ZSAqIGMpKSB7CisJCQkJcmV0dmFsID0gRVhUMl9FVF9TSE9SVF9SRUFEOworCQkJCWdvdG8gZXJyb3V0OworCQkJfQorCQkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibGssIGMsIGJ1Zik7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyb3V0OworCisJCQlibGsgKz0gYzsKKwkJCWxlZnQgLT0gYzsKKwkJfQorCX0KKwlyZXR2YWwgPSBleHQyZnNfZmx1c2hfaWNhY2hlKGZzKTsKKworZXJyb3V0OgorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogV3JpdGUgb3V0IHN1cGVyYmxvY2sgYW5kIGdyb3VwIGRlc2NyaXB0b3JzCisgKi8KK2VycmNvZGVfdCBleHQyZnNfaW1hZ2Vfc3VwZXJfd3JpdGUoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwKKwkJCQkgICBpbnQgZmxhZ3MgRVhUMkZTX0FUVFIoKHVudXNlZCkpKQoreworCWNoYXIJCSpidWYsICpjcDsKKwlzc2l6ZV90CQlhY3R1YWw7CisJZXJyY29kZV90CXJldHZhbDsKKworCWJ1ZiA9IHhtYWxsb2MoZnMtPmJsb2Nrc2l6ZSk7CisKKwkvKgorCSAqIFdyaXRlIG91dCB0aGUgc3VwZXJibG9jaworCSAqLworCW1lbXNldChidWYsIDAsIGZzLT5ibG9ja3NpemUpOworCW1lbWNweShidWYsIGZzLT5zdXBlciwgU1VQRVJCTE9DS19TSVpFKTsKKwlhY3R1YWwgPSB3cml0ZShmZCwgYnVmLCBmcy0+YmxvY2tzaXplKTsKKwlpZiAoYWN0dWFsID09IC0xKSB7CisJCXJldHZhbCA9IGVycm5vOworCQlnb3RvIGVycm91dDsKKwl9CisJaWYgKGFjdHVhbCAhPSAoc3NpemVfdCkgZnMtPmJsb2Nrc2l6ZSkgeworCQlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1dSSVRFOworCQlnb3RvIGVycm91dDsKKwl9CisKKwkvKgorCSAqIE5vdyB3cml0ZSBvdXQgdGhlIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzCisJICovCisJY3AgPSAoY2hhciAqKSBmcy0+Z3JvdXBfZGVzYzsKKwlhY3R1YWwgPSB3cml0ZShmZCwgY3AsIGZzLT5ibG9ja3NpemUgKiBmcy0+ZGVzY19ibG9ja3MpOworCWlmIChhY3R1YWwgPT0gLTEpIHsKKwkJcmV0dmFsID0gZXJybm87CisJCWdvdG8gZXJyb3V0OworCX0KKwlpZiAoYWN0dWFsICE9IChzc2l6ZV90KSAoZnMtPmJsb2Nrc2l6ZSAqIGZzLT5kZXNjX2Jsb2NrcykpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9TSE9SVF9XUklURTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJcmV0dmFsID0gMDsKKworZXJyb3V0OgorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUmVhZCB0aGUgc3VwZXJibG9jayBhbmQgZ3JvdXAgZGVzY3JpcHRvcnMgYW5kIG92ZXJ3cml0ZSB0aGVtLgorICovCitlcnJjb2RlX3QgZXh0MmZzX2ltYWdlX3N1cGVyX3JlYWQoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwKKwkJCQkgIGludCBmbGFncyBFWFQyRlNfQVRUUigodW51c2VkKSkpCit7CisJY2hhcgkJKmJ1ZjsKKwlzc2l6ZV90CQlhY3R1YWwsIHNpemU7CisJZXJyY29kZV90CXJldHZhbDsKKworCXNpemUgPSBmcy0+YmxvY2tzaXplICogKGZzLT5ncm91cF9kZXNjX2NvdW50ICsgMSk7CisJYnVmID0geG1hbGxvYyhzaXplKTsKKworCS8qCisJICogUmVhZCBpdCBhbGwgaW4uCisJICovCisJYWN0dWFsID0gcmVhZChmZCwgYnVmLCBzaXplKTsKKwlpZiAoYWN0dWFsID09IC0xKSB7CisJCXJldHZhbCA9IGVycm5vOworCQlnb3RvIGVycm91dDsKKwl9CisJaWYgKGFjdHVhbCAhPSBzaXplKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfU0hPUlRfUkVBRDsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJLyoKKwkgKiBOb3cgY29weSBpbiB0aGUgc3VwZXJibG9jayBhbmQgZ3JvdXAgZGVzY3JpcHRvcnMKKwkgKi8KKwltZW1jcHkoZnMtPnN1cGVyLCBidWYsIFNVUEVSQkxPQ0tfU0laRSk7CisKKwltZW1jcHkoZnMtPmdyb3VwX2Rlc2MsIGJ1ZiArIGZzLT5ibG9ja3NpemUsCisJICAgICAgIGZzLT5ibG9ja3NpemUgKiBmcy0+Z3JvdXBfZGVzY19jb3VudCk7CisKKwlyZXR2YWwgPSAwOworCitlcnJvdXQ6CisJZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgYmxvY2svaW5vZGUgYml0bWFwcy4KKyAqLworZXJyY29kZV90IGV4dDJmc19pbWFnZV9iaXRtYXBfd3JpdGUoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwgaW50IGZsYWdzKQoreworCWNoYXIJCSpwdHI7CisJaW50CQljLCBzaXplOworCWNoYXIJCXplcm9fYnVmWzEwMjRdOworCXNzaXplX3QJCWFjdHVhbDsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKGZsYWdzICYgSU1BR0VSX0ZMQUdfSU5PREVNQVApIHsKKwkJaWYgKCFmcy0+aW5vZGVfbWFwKSB7CisJCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZV9iaXRtYXAoZnMpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXB0ciA9IGZzLT5pbm9kZV9tYXAtPmJpdG1hcDsKKwkJc2l6ZSA9IChFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAvIDgpOworCX0gZWxzZSB7CisJCWlmICghZnMtPmJsb2NrX21hcCkgeworCQkJcmV0dmFsID0gZXh0MmZzX3JlYWRfYmxvY2tfYml0bWFwKGZzKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlwdHIgPSBmcy0+YmxvY2tfbWFwLT5iaXRtYXA7CisJCXNpemUgPSBFWFQyX0JMT0NLU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAvIDg7CisJfQorCXNpemUgPSBzaXplICogZnMtPmdyb3VwX2Rlc2NfY291bnQ7CisKKwlhY3R1YWwgPSB3cml0ZShmZCwgcHRyLCBzaXplKTsKKwlpZiAoYWN0dWFsID09IC0xKSB7CisJCXJldHZhbCA9IGVycm5vOworCQlnb3RvIGVycm91dDsKKwl9CisJaWYgKGFjdHVhbCAhPSBzaXplKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfU0hPUlRfV1JJVEU7CisJCWdvdG8gZXJyb3V0OworCX0KKwlzaXplID0gc2l6ZSAlIGZzLT5ibG9ja3NpemU7CisJbWVtc2V0KHplcm9fYnVmLCAwLCBzaXplb2YoemVyb19idWYpKTsKKwlpZiAoc2l6ZSkgeworCQlzaXplID0gZnMtPmJsb2Nrc2l6ZSAtIHNpemU7CisJCXdoaWxlIChzaXplKSB7CisJCQljID0gc2l6ZTsKKwkJCWlmIChjID4gKGludCkgc2l6ZW9mKHplcm9fYnVmKSkKKwkJCQljID0gc2l6ZW9mKHplcm9fYnVmKTsKKwkJCWFjdHVhbCA9IHdyaXRlKGZkLCB6ZXJvX2J1ZiwgYyk7CisJCQlpZiAoYWN0dWFsID09IC0xKSB7CisJCQkJcmV0dmFsID0gZXJybm87CisJCQkJZ290byBlcnJvdXQ7CisJCQl9CisJCQlpZiAoYWN0dWFsICE9IGMpIHsKKwkJCQlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1dSSVRFOworCQkJCWdvdG8gZXJyb3V0OworCQkJfQorCQkJc2l6ZSAtPSBjOworCQl9CisJfQorCXJldHZhbCA9IDA7CitlcnJvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKgorICogUmVhZCB0aGUgYmxvY2svaW5vZGUgYml0bWFwcy4KKyAqLworZXJyY29kZV90IGV4dDJmc19pbWFnZV9iaXRtYXBfcmVhZChleHQyX2ZpbHN5cyBmcywgaW50IGZkLCBpbnQgZmxhZ3MpCit7CisJY2hhcgkJKnB0ciwgKmJ1ZiA9IE5VTEw7CisJaW50CQlzaXplOworCXNzaXplX3QJCWFjdHVhbDsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKGZsYWdzICYgSU1BR0VSX0ZMQUdfSU5PREVNQVApIHsKKwkJaWYgKCFmcy0+aW5vZGVfbWFwKSB7CisJCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZV9iaXRtYXAoZnMpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXB0ciA9IGZzLT5pbm9kZV9tYXAtPmJpdG1hcDsKKwkJc2l6ZSA9IChFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAvIDgpOworCX0gZWxzZSB7CisJCWlmICghZnMtPmJsb2NrX21hcCkgeworCQkJcmV0dmFsID0gZXh0MmZzX3JlYWRfYmxvY2tfYml0bWFwKGZzKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlwdHIgPSBmcy0+YmxvY2tfbWFwLT5iaXRtYXA7CisJCXNpemUgPSBFWFQyX0JMT0NLU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAvIDg7CisJfQorCXNpemUgPSBzaXplICogZnMtPmdyb3VwX2Rlc2NfY291bnQ7CisKKwlidWYgPSB4bWFsbG9jKHNpemUpOworCisJYWN0dWFsID0gcmVhZChmZCwgYnVmLCBzaXplKTsKKwlpZiAoYWN0dWFsID09IC0xKSB7CisJCXJldHZhbCA9IGVycm5vOworCQlnb3RvIGVycm91dDsKKwl9CisJaWYgKGFjdHVhbCAhPSBzaXplKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfU0hPUlRfV1JJVEU7CisJCWdvdG8gZXJyb3V0OworCX0KKwltZW1jcHkocHRyLCBidWYsIHNpemUpOworCisJcmV0dmFsID0gMDsKK2Vycm91dDoKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbmRfYmxvY2suYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbmRfYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTAzODMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2luZF9ibG9jay5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGluZF9ibG9jay5jIC0tLSBpbmRpcmVjdCBibG9jayBJL08gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsCisgKgkyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IGJ5ICBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK2VycmNvZGVfdCBleHQyZnNfcmVhZF9pbmRfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsaywgdm9pZCAqYnVmKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisjaWYgQkJfQklHX0VORElBTgorCWJsa190CQkqYmxvY2tfbnI7CisJaW50CQlpOworCWludAkJbGltaXQgPSBmcy0+YmxvY2tzaXplID4+IDI7CisjZW5kaWYKKworCWlmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX0lNQUdFX0ZJTEUpICYmCisJICAgIChmcy0+aW8gIT0gZnMtPmltYWdlX2lvKSkKKwkJbWVtc2V0KGJ1ZiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisJZWxzZSB7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBibGssIDEsIGJ1Zik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKyNpZiBCQl9CSUdfRU5ESUFOCisJaWYgKGZzLT5mbGFncyAmIChFWFQyX0ZMQUdfU1dBUF9CWVRFUyB8IEVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQpKSB7CisJCWJsb2NrX25yID0gKGJsa190ICopIGJ1ZjsKKwkJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyssIGJsb2NrX25yKyspCisJCQkqYmxvY2tfbnIgPSBleHQyZnNfc3dhYjMyKCpibG9ja19ucik7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfd3JpdGVfaW5kX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGssIHZvaWQgKmJ1ZikKK3sKKyNpZiBCQl9CSUdfRU5ESUFOCisJYmxrX3QJCSpibG9ja19ucjsKKwlpbnQJCWk7CisJaW50CQlsaW1pdCA9IGZzLT5ibG9ja3NpemUgPj4gMjsKKyNlbmRpZgorCisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19JTUFHRV9GSUxFKQorCQlyZXR1cm4gMDsKKworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoZnMtPmZsYWdzICYgKEVYVDJfRkxBR19TV0FQX0JZVEVTIHwgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpKSB7CisJCWJsb2NrX25yID0gKGJsa190ICopIGJ1ZjsKKwkJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyssIGJsb2NrX25yKyspCisJCQkqYmxvY2tfbnIgPSBleHQyZnNfc3dhYjMyKCpibG9ja19ucik7CisJfQorI2VuZGlmCisJcmV0dXJuIGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxrLCAxLCBidWYpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2luaXRpYWxpemUuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbml0aWFsaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxZDM0MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbml0aWFsaXplLmMKQEAgLTAsMCArMSwzODggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGluaXRpYWxpemUuYyAtLS0gaW5pdGlhbGl6ZSBhIGZpbGVzeXN0ZW0gaGFuZGxlIGdpdmVuIHN1cGVyYmxvY2sKKyAqCXBhcmFtZXRlcnMuICBVc2VkIGJ5IG1rZTJmcyB3aGVuIGluaXRpYWxpemluZyBhIGZpbGVzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgICAgJiYJZGVmaW5lZChFWFQyX09TX0xJTlVYKQorI2RlZmluZSBDUkVBVE9SX09TIEVYVDJfT1NfTElOVVgKKyNlbHNlCisjaWYgZGVmaW5lZChfX0dOVV9fKSAgICAgJiYJZGVmaW5lZChFWFQyX09TX0hVUkQpCisjZGVmaW5lIENSRUFUT1JfT1MgRVhUMl9PU19IVVJECisjZWxzZQorI2lmIGRlZmluZWQoX19GcmVlQlNEX18pICYmCWRlZmluZWQoRVhUMl9PU19GUkVFQlNEKQorI2RlZmluZSBDUkVBVE9SX09TIEVYVDJfT1NfRlJFRUJTRAorI2Vsc2UKKyNpZiBkZWZpbmVkKExJVEVTKQkgICAmJglkZWZpbmVkKEVYVDJfT1NfTElURVMpCisjZGVmaW5lIENSRUFUT1JfT1MgRVhUMl9PU19MSVRFUworI2Vsc2UKKyNkZWZpbmUgQ1JFQVRPUl9PUyBFWFQyX09TX0xJTlVYIC8qIGJ5IGRlZmF1bHQgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKExJVEVTKSAmJiBkZWZpbmVkKEVYVDJfT1NfTElURVMpICovCisjZW5kaWYgLyogZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgZGVmaW5lZChFWFQyX09TX0ZSRUVCU0QpICovCisjZW5kaWYgLyogZGVmaW5lZChfX0dOVV9fKSAgICAgJiYgZGVmaW5lZChFWFQyX09TX0hVUkQpICovCisjZW5kaWYgLyogZGVmaW5lZChfX2xpbnV4X18pICAgJiYgZGVmaW5lZChFWFQyX09TX0xJTlVYKSAqLworCisvKgorICogTm90ZSB3ZSBvdmVycmlkZSB0aGUga2VybmVsIGluY2x1ZGUgZmlsZSdzIGlkZWEgb2Ygd2hhdCB0aGUgZGVmYXVsdAorICogY2hlY2sgaW50ZXJ2YWwgKG5ldmVyKSBzaG91bGQgYmUuICBJdCdzIGEgZ29vZCBpZGVhIHRvIGNoZWNrIGF0CisgKiBsZWFzdCAqb2NjYXNpb25hbGx5Kiwgc3BlY2lhbGx5IHNpbmNlIHNlcnZlcnMgd2lsbCBuZXZlciByYXJlbHkgZ2V0CisgKiB0byByZWJvb3QsIHNpbmNlIExpbnV4IGlzIHNvIHJvYnVzdCB0aGVzZSBkYXlzLiAgOi0pCisgKgorICogMTgwIGRheXMgKHNpeCBtb250aHMpIHNlZW1zIGxpa2UgYSBnb29kIHZhbHVlLgorICovCisjaWZkZWYgRVhUMl9ERkxfQ0hFQ0tJTlRFUlZBTAorI3VuZGVmIEVYVDJfREZMX0NIRUNLSU5URVJWQUwKKyNlbmRpZgorI2RlZmluZSBFWFQyX0RGTF9DSEVDS0lOVEVSVkFMICg4NjQwMEwgKiAxODBMKQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgR0RUIGJsb2NrcyB0byByZXNlcnZlIGZvciBvbmxpbmUgZmlsZXN5c3RlbSBncm93dGguCisgKiBUaGUgYWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgR0RUIGJsb2NrcyB3ZSBjYW4gcmVzZXJ2ZSBpcyBkZXRlcm1pbmVkIGJ5CisgKiB0aGUgbnVtYmVyIG9mIGJsb2NrIHBvaW50ZXJzIHRoYXQgY2FuIGZpdCBpbnRvIGEgc2luZ2xlIGJsb2NrLgorICovCitzdGF0aWMgaW50IGNhbGNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyhleHQyX2ZpbHN5cyBmcykKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBmcy0+c3VwZXI7CisJdW5zaWduZWQgbG9uZyBicGcgPSBzYi0+c19ibG9ja3NfcGVyX2dyb3VwOworCXVuc2lnbmVkIGludCBnZHBiID0gZnMtPmJsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKTsKKwl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MgPSAweGZmZmZmZmZmOworCXVuc2lnbmVkIGxvbmcgcnN2X2dyb3VwczsKKwlpbnQgcnN2X2dkYjsKKworCS8qIFdlIHNldCBpdCBhdCAxMDI0eCB0aGUgY3VycmVudCBmaWxlc3lzdGVtIHNpemUsIG9yCisJICogdGhlIHVwcGVyIGJsb2NrIGNvdW50IGxpbWl0ICgyXjMyKSwgd2hpY2hldmVyIGlzIGxvd2VyLgorCSAqLworCWlmIChzYi0+c19ibG9ja3NfY291bnQgPCBtYXhfYmxvY2tzIC8gMTAyNCkKKwkJbWF4X2Jsb2NrcyA9IHNiLT5zX2Jsb2Nrc19jb3VudCAqIDEwMjQ7CisJcnN2X2dyb3VwcyA9IChtYXhfYmxvY2tzIC0gc2ItPnNfZmlyc3RfZGF0YV9ibG9jayArIGJwZyAtIDEpIC8gYnBnOworCXJzdl9nZGIgPSAocnN2X2dyb3VwcyArIGdkcGIgLSAxKSAvIGdkcGIgLSBmcy0+ZGVzY19ibG9ja3M7CisJaWYgKHJzdl9nZGIgPiBFWFQyX0FERFJfUEVSX0JMT0NLKHNiKSkKKwkJcnN2X2dkYiA9IEVYVDJfQUREUl9QRVJfQkxPQ0soc2IpOworI2lmZGVmIFJFU19HRFRfREVCVUcKKwlwcmludGYoIm1heF9ibG9ja3MgJWx1LCByc3ZfZ3JvdXBzID0gJWx1LCByc3ZfZ2RiID0gJWx1XG4iLAorCSAgICAgICBtYXhfYmxvY2tzLCByc3ZfZ3JvdXBzLCByc3ZfZ2RiKTsKKyNlbmRpZgorCisJcmV0dXJuIHJzdl9nZGI7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfaW5pdGlhbGl6ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsCisJCQkgICAgc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnBhcmFtLAorCQkJICAgIGlvX21hbmFnZXIgbWFuYWdlciwgZXh0Ml9maWxzeXMgKnJldF9mcykKK3sKKwlleHQyX2ZpbHN5cwlmczsKKwllcnJjb2RlX3QJcmV0dmFsOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzdXBlcjsKKwlpbnQJCWZyYWdzX3Blcl9ibG9jazsKKwl1bnNpZ25lZCBpbnQJcmVtOworCXVuc2lnbmVkIGludAlvdmVyaGVhZCA9IDA7CisJYmxrX3QJCWdyb3VwX2Jsb2NrOworCXVuc2lnbmVkIGludAlpcGc7CisJZGdycF90CQlpOworCWJsa190CQludW1ibG9ja3M7CisJaW50CQlyc3ZfZ2R0OworCWNoYXIJCSpidWY7CisKKwlpZiAoIXBhcmFtIHx8ICFwYXJhbS0+c19ibG9ja3NfY291bnQpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IHN0cnVjdF9leHQyX2ZpbHN5cyksICZmcyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCW1lbXNldChmcywgMCwgc2l6ZW9mKHN0cnVjdCBzdHJ1Y3RfZXh0Ml9maWxzeXMpKTsKKwlmcy0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVM7CisJZnMtPmZsYWdzID0gZmxhZ3MgfCBFWFQyX0ZMQUdfUlc7CisJZnMtPnVtYXNrID0gMDIyOworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfU1dBUF9CWVRFUzsKKyNlbmRpZgorCXJldHZhbCA9IG1hbmFnZXItPm9wZW4obmFtZSwgSU9fRkxBR19SVywgJmZzLT5pbyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCWZzLT5pbWFnZV9pbyA9IGZzLT5pbzsKKwlmcy0+aW8tPmFwcF9kYXRhID0gZnM7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKG5hbWUpKzEsICZmcy0+ZGV2aWNlX25hbWUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCXN0cmNweShmcy0+ZGV2aWNlX25hbWUsIG5hbWUpOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKFNVUEVSQkxPQ0tfU0laRSwgJnN1cGVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisJZnMtPnN1cGVyID0gc3VwZXI7CisKKwltZW1zZXQoc3VwZXIsIDAsIFNVUEVSQkxPQ0tfU0laRSk7CisKKyNkZWZpbmUgc2V0X2ZpZWxkKGZpZWxkLCBkZWZhdWx0KSAoc3VwZXItPmZpZWxkID0gcGFyYW0tPmZpZWxkID8gXAorCQkJCSAgIHBhcmFtLT5maWVsZCA6IChkZWZhdWx0KSkKKworCXN1cGVyLT5zX21hZ2ljID0gRVhUMl9TVVBFUl9NQUdJQzsKKwlzdXBlci0+c19zdGF0ZSA9IEVYVDJfVkFMSURfRlM7CisKKwlzZXRfZmllbGQoc19sb2dfYmxvY2tfc2l6ZSwgMCk7CS8qIGRlZmF1bHQgYmxvY2tzaXplOiAxMDI0IGJ5dGVzICovCisJc2V0X2ZpZWxkKHNfbG9nX2ZyYWdfc2l6ZSwgMCk7IC8qIGRlZmF1bHQgZnJhZ3NpemU6IDEwMjQgYnl0ZXMgKi8KKwlzZXRfZmllbGQoc19maXJzdF9kYXRhX2Jsb2NrLCBzdXBlci0+c19sb2dfYmxvY2tfc2l6ZSA/IDAgOiAxKTsKKwlzZXRfZmllbGQoc19tYXhfbW50X2NvdW50LCBFWFQyX0RGTF9NQVhfTU5UX0NPVU5UKTsKKwlzZXRfZmllbGQoc19lcnJvcnMsIEVYVDJfRVJST1JTX0RFRkFVTFQpOworCXNldF9maWVsZChzX2ZlYXR1cmVfY29tcGF0LCAwKTsKKwlzZXRfZmllbGQoc19mZWF0dXJlX2luY29tcGF0LCAwKTsKKwlzZXRfZmllbGQoc19mZWF0dXJlX3JvX2NvbXBhdCwgMCk7CisJc2V0X2ZpZWxkKHNfZmlyc3RfbWV0YV9iZywgMCk7CisJaWYgKHN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiB+RVhUMl9MSUJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfVU5TVVBQX0ZFQVRVUkU7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJaWYgKHN1cGVyLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgfkVYVDJfTElCX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9ST19VTlNVUFBfRkVBVFVSRTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXNldF9maWVsZChzX3Jldl9sZXZlbCwgRVhUMl9HT09EX09MRF9SRVYpOworCWlmIChzdXBlci0+c19yZXZfbGV2ZWwgPj0gRVhUMl9EWU5BTUlDX1JFVikgeworCQlzZXRfZmllbGQoc19maXJzdF9pbm8sIEVYVDJfR09PRF9PTERfRklSU1RfSU5PKTsKKwkJc2V0X2ZpZWxkKHNfaW5vZGVfc2l6ZSwgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFKTsKKwl9CisKKwlzZXRfZmllbGQoc19jaGVja2ludGVydmFsLCBFWFQyX0RGTF9DSEVDS0lOVEVSVkFMKTsKKwlzdXBlci0+c19ta2ZzX3RpbWUgPSBzdXBlci0+c19sYXN0Y2hlY2sgPSB0aW1lKE5VTEwpOworCisJc3VwZXItPnNfY3JlYXRvcl9vcyA9IENSRUFUT1JfT1M7CisKKwlmcy0+YmxvY2tzaXplID0gRVhUMl9CTE9DS19TSVpFKHN1cGVyKTsKKwlmcy0+ZnJhZ3NpemUgPSBFWFQyX0ZSQUdfU0laRShzdXBlcik7CisJZnJhZ3NfcGVyX2Jsb2NrID0gZnMtPmJsb2Nrc2l6ZSAvIGZzLT5mcmFnc2l6ZTsKKworCS8qIGRlZmF1bHQ6IChmcy0+YmxvY2tzaXplKjgpIGJsb2Nrcy9ncm91cCwgdXAgdG8gMl4xNiAoR0RUIGxpbWl0KSAqLworCXNldF9maWVsZChzX2Jsb2Nrc19wZXJfZ3JvdXAsIGZzLT5ibG9ja3NpemUgKiA4KTsKKwlpZiAoc3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCA+IEVYVDJfTUFYX0JMT0NLU19QRVJfR1JPVVAoc3VwZXIpKQorCQlzdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwID0gRVhUMl9NQVhfQkxPQ0tTX1BFUl9HUk9VUChzdXBlcik7CisJc3VwZXItPnNfZnJhZ3NfcGVyX2dyb3VwID0gc3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCAqIGZyYWdzX3Blcl9ibG9jazsKKworCXN1cGVyLT5zX2Jsb2Nrc19jb3VudCA9IHBhcmFtLT5zX2Jsb2Nrc19jb3VudDsKKwlzdXBlci0+c19yX2Jsb2Nrc19jb3VudCA9IHBhcmFtLT5zX3JfYmxvY2tzX2NvdW50OworCWlmIChzdXBlci0+c19yX2Jsb2Nrc19jb3VudCA+PSBwYXJhbS0+c19ibG9ja3NfY291bnQpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyoKKwkgKiBJZiB3ZSdyZSBjcmVhdGluZyBhbiBleHRlcm5hbCBqb3VybmFsIGRldmljZSwgd2UgZG9uJ3QgbmVlZAorCSAqIHRvIGJvdGhlciB3aXRoIHRoZSByZXN0LgorCSAqLworCWlmIChzdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSB7CisJCWZzLT5ncm91cF9kZXNjX2NvdW50ID0gMDsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQkqcmV0X2ZzID0gZnM7CisJCXJldHVybiAwOworCX0KKworcmV0cnk6CisJZnMtPmdyb3VwX2Rlc2NfY291bnQgPSAoc3VwZXItPnNfYmxvY2tzX2NvdW50IC0KKwkJCQlzdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrICsKKwkJCQlFWFQyX0JMT0NLU19QRVJfR1JPVVAoc3VwZXIpIC0gMSkKKwkJLyBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc3VwZXIpOworCWlmIChmcy0+Z3JvdXBfZGVzY19jb3VudCA9PSAwKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfVE9PU01BTEw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJZnMtPmRlc2NfYmxvY2tzID0gKGZzLT5ncm91cF9kZXNjX2NvdW50ICsKKwkJCSAgIEVYVDJfREVTQ19QRVJfQkxPQ0soc3VwZXIpIC0gMSkKKwkJLyBFWFQyX0RFU0NfUEVSX0JMT0NLKHN1cGVyKTsKKworCWkgPSBmcy0+YmxvY2tzaXplID49IDQwOTYgPyAxIDogNDA5NiAvIGZzLT5ibG9ja3NpemU7CisJc2V0X2ZpZWxkKHNfaW5vZGVzX2NvdW50LCBzdXBlci0+c19ibG9ja3NfY291bnQgLyBpKTsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgRVhUMl9GSVJTVF9JTk8gKyAxIGlub2Rlcywgc28KKwkgKiB0aGF0IHdlIGhhdmUgZW5vdWdoIGlub2RlcyBmb3IgdGhlIGZpbGVzeXN0ZW0oISkKKwkgKi8KKwlpZiAoc3VwZXItPnNfaW5vZGVzX2NvdW50IDwgRVhUMl9GSVJTVF9JTk9ERShzdXBlcikrMSkKKwkJc3VwZXItPnNfaW5vZGVzX2NvdW50ID0gRVhUMl9GSVJTVF9JTk9ERShzdXBlcikrMTsKKworCS8qCisJICogVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IGFzIG1hbnkgaW5vZGVzIGFzIHRoZSB1c2VyCisJICogcmVxdWVzdGVkLiAgRmlndXJlIG91dCBob3cgbWFueSBpbm9kZXMgcGVyIGdyb3VwIHRoYXQKKwkgKiBzaG91bGQgYmUuICBCdXQgbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgYWxsb2NhdGUgbW9yZSB0aGFuCisJICogb25lIGJpdG1hcCdzIHdvcnRoIG9mIGlub2RlcyBlYWNoIGdyb3VwLgorCSAqLworCWlwZyA9IChzdXBlci0+c19pbm9kZXNfY291bnQgKyBmcy0+Z3JvdXBfZGVzY19jb3VudCAtIDEpIC8KKwkJZnMtPmdyb3VwX2Rlc2NfY291bnQ7CisJaWYgKGlwZyA+IGZzLT5ibG9ja3NpemUgKiA4KSB7CisJCWlmIChzdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwID49IDI1NikgeworCQkJLyogVHJ5IGFnYWluIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IHBhcmFtZXRlcnMgKi8KKwkJCXN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgLT0gODsKKwkJCXN1cGVyLT5zX2Jsb2Nrc19jb3VudCA9IHBhcmFtLT5zX2Jsb2Nrc19jb3VudDsKKwkJCXN1cGVyLT5zX2ZyYWdzX3Blcl9ncm91cCA9IHN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgKgorCQkJCWZyYWdzX3Blcl9ibG9jazsKKwkJCWdvdG8gcmV0cnk7CisJCX0gZWxzZQorCQkJcmV0dXJuIEVYVDJfRVRfVE9PX01BTllfSU5PREVTOworCX0KKworCWlmIChpcGcgPiAodW5zaWduZWQpIEVYVDJfTUFYX0lOT0RFU19QRVJfR1JPVVAoc3VwZXIpKQorCQlpcGcgPSBFWFQyX01BWF9JTk9ERVNfUEVSX0dST1VQKHN1cGVyKTsKKworCXN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXAgPSBpcGc7CisJaWYgKHN1cGVyLT5zX2lub2Rlc19jb3VudCA+IGlwZyAqIGZzLT5ncm91cF9kZXNjX2NvdW50KQorCQlzdXBlci0+c19pbm9kZXNfY291bnQgPSBpcGcgKiBmcy0+Z3JvdXBfZGVzY19jb3VudDsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBudW1iZXIgb2YgaW5vZGVzIHBlciBncm91cCBjb21wbGV0ZWx5IGZpbGxzCisJICogdGhlIGlub2RlIHRhYmxlIGJsb2NrcyBpbiB0aGUgZGVzY3JpcHRvci4gIElmIG5vdCwgYWRkIHNvbWUKKwkgKiBhZGRpdGlvbmFsIGlub2Rlcy9ncm91cC4gIFdhc3RlIG5vdCwgd2FudCBub3QuLi4KKwkgKi8KKwlmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCA9ICgoKHN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXAgKgorCQkJCQlFWFQyX0lOT0RFX1NJWkUoc3VwZXIpKSArCisJCQkJICAgICAgIEVYVDJfQkxPQ0tfU0laRShzdXBlcikgLSAxKSAvCisJCQkJICAgICAgRVhUMl9CTE9DS19TSVpFKHN1cGVyKSk7CisJc3VwZXItPnNfaW5vZGVzX3Blcl9ncm91cCA9ICgoZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXAgKgorCQkJCSAgICAgIEVYVDJfQkxPQ0tfU0laRShzdXBlcikpIC8KKwkJCQkgICAgIEVYVDJfSU5PREVfU0laRShzdXBlcikpOworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoZSBudW1iZXIgb2YgaW5vZGVzIHBlciBncm91cCBpcyBhCisJICogbXVsdGlwbGUgb2YgOC4gIFRoaXMgaXMgbmVlZGVkIHRvIHNpbXBsaWZ5IHRoZSBiaXRtYXAKKwkgKiBzcGxpY2luZyBjb2RlLgorCSAqLworCXN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXAgJj0gfjc7CisJZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXAgPSAoKChzdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwICoKKwkJCQkJRVhUMl9JTk9ERV9TSVpFKHN1cGVyKSkgKworCQkJCSAgICAgICBFWFQyX0JMT0NLX1NJWkUoc3VwZXIpIC0gMSkgLworCQkJCSAgICAgIEVYVDJfQkxPQ0tfU0laRShzdXBlcikpOworCisJLyoKKwkgKiBhZGp1c3QgaW5vZGUgY291bnQgdG8gcmVmbGVjdCB0aGUgYWRqdXN0ZWQgaW5vZGVzX3Blcl9ncm91cAorCSAqLworCXN1cGVyLT5zX2lub2Rlc19jb3VudCA9IHN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXAgKgorCQlmcy0+Z3JvdXBfZGVzY19jb3VudDsKKwlzdXBlci0+c19mcmVlX2lub2Rlc19jb3VudCA9IHN1cGVyLT5zX2lub2Rlc19jb3VudDsKKworCS8qCisJICogY2hlY2sgdGhlIG51bWJlciBvZiByZXNlcnZlZCBncm91cCBkZXNjcmlwdG9yIHRhYmxlIGJsb2NrcworCSAqLworCWlmIChzdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFKQorCQlyc3ZfZ2R0ID0gY2FsY19yZXNlcnZlZF9nZHRfYmxvY2tzKGZzKTsKKwllbHNlCisJCXJzdl9nZHQgPSAwOworCXNldF9maWVsZChzX3Jlc2VydmVkX2dkdF9ibG9ja3MsIHJzdl9nZHQpOworCWlmIChzdXBlci0+c19yZXNlcnZlZF9nZHRfYmxvY2tzID4gRVhUMl9BRERSX1BFUl9CTE9DSyhzdXBlcikpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9SRVNfR0RUX0JMT0NLUzsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogT3ZlcmhlYWQgaXMgdGhlIG51bWJlciBvZiBib29ra2VlcGluZyBibG9ja3MgcGVyIGdyb3VwLiAgSXQKKwkgKiBpbmNsdWRlcyB0aGUgc3VwZXJibG9jayBiYWNrdXAsIHRoZSBncm91cCBkZXNjcmlwdG9yCisJICogYmFja3VwcywgdGhlIGlub2RlIGJpdG1hcCwgdGhlIGJsb2NrIGJpdG1hcCwgYW5kIHRoZSBpbm9kZQorCSAqIHRhYmxlLgorCSAqLworCisJb3ZlcmhlYWQgPSAoaW50KSAoMiArIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwKTsKKworCWlmIChleHQyZnNfYmdfaGFzX3N1cGVyKGZzLCBmcy0+Z3JvdXBfZGVzY19jb3VudCAtIDEpKQorCQlvdmVyaGVhZCArPSAxICsgZnMtPmRlc2NfYmxvY2tzICsgc3VwZXItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsKKworCS8qIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCB0b28gbWFueSBpbm9kZXMgKi8KKwlpZiAob3ZlcmhlYWQgPiBzdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKQorCQlyZXR1cm4gRVhUMl9FVF9UT09fTUFOWV9JTk9ERVM7CisKKwkvKgorCSAqIFNlZSBpZiB0aGUgbGFzdCBncm91cCBpcyBiaWcgZW5vdWdoIHRvIHN1cHBvcnQgdGhlCisJICogbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcy4gIElmIG5vdCwgd2UgbmVlZCB0byBnZXQgcmlkIG9mCisJICogaXQuCisJICovCisJcmVtID0gKChzdXBlci0+c19ibG9ja3NfY291bnQgLSBzdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSAlCisJICAgICAgIHN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOworCWlmICgoZnMtPmdyb3VwX2Rlc2NfY291bnQgPT0gMSkgJiYgcmVtICYmIChyZW0gPCBvdmVyaGVhZCkpCisJCXJldHVybiBFWFQyX0VUX1RPT1NNQUxMOworCWlmIChyZW0gJiYgKHJlbSA8IG92ZXJoZWFkKzUwKSkgeworCQlzdXBlci0+c19ibG9ja3NfY291bnQgLT0gcmVtOworCQlnb3RvIHJldHJ5OworCX0KKworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBrbm93IGhvdyBiaWcgdGhlIGZpbGVzeXN0ZW0gd2lsbCBiZS4gIFNvCisJICogd2UgY2FuIGRvIGFueSBhbmQgYWxsIGFsbG9jYXRpb25zIHRoYXQgZGVwZW5kIG9uIHRoZSBibG9jaworCSAqIGNvdW50LgorCSAqLworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKGZzLT5kZXZpY2VfbmFtZSkgKyA4MCwgJmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJc3ByaW50ZihidWYsICJibG9jayBiaXRtYXAgZm9yICVzIiwgZnMtPmRldmljZV9uYW1lKTsKKwlyZXR2YWwgPSBleHQyZnNfYWxsb2NhdGVfYmxvY2tfYml0bWFwKGZzLCBidWYsICZmcy0+YmxvY2tfbWFwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlzcHJpbnRmKGJ1ZiwgImlub2RlIGJpdG1hcCBmb3IgJXMiLCBmcy0+ZGV2aWNlX25hbWUpOworCXJldHZhbCA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsIGJ1ZiwgJmZzLT5pbm9kZV9tYXApOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKChzaXplX3QpIGZzLT5kZXNjX2Jsb2NrcyAqIGZzLT5ibG9ja3NpemUsCisJCQkJJmZzLT5ncm91cF9kZXNjKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwltZW1zZXQoZnMtPmdyb3VwX2Rlc2MsIDAsIChzaXplX3QpIGZzLT5kZXNjX2Jsb2NrcyAqIGZzLT5ibG9ja3NpemUpOworCisJLyoKKwkgKiBSZXNlcnZlIHRoZSBzdXBlcmJsb2NrIGFuZCBncm91cCBkZXNjcmlwdG9ycyBmb3IgZWFjaAorCSAqIGdyb3VwLCBhbmQgZmlsbCBpbiB0aGUgY29ycmVjdCBncm91cCBzdGF0aXN0aWNzIGZvciBncm91cC4KKwkgKiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIGJsb2NrIGJpdG1hcCwgaW5vZGUgYml0bWFwLCBhbmQKKwkgKiBpbm9kZSB0YWJsZSBoYXZlIG5vdCBiZWVuIGFsbG9jYXRlZCAoYW5kIGluIGZhY3Qgd29uJ3QgYmUKKwkgKiBieSB0aGlzIHJvdXRpbmUpLCB0aGV5IGFyZSBhY2NvdW50ZWQgZm9yIG5ldmVydGhlbGVzcy4KKwkgKi8KKwlncm91cF9ibG9jayA9IHN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJc3VwZXItPnNfZnJlZV9ibG9ja3NfY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCW51bWJsb2NrcyA9IGV4dDJmc19yZXNlcnZlX3N1cGVyX2FuZF9iZ2QoZnMsIGksIGZzLT5ibG9ja19tYXApOworCisJCXN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50ICs9IG51bWJsb2NrczsKKwkJZnMtPmdyb3VwX2Rlc2NbaV0uYmdfZnJlZV9ibG9ja3NfY291bnQgPSBudW1ibG9ja3M7CisJCWZzLT5ncm91cF9kZXNjW2ldLmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0KKwkJCWZzLT5zdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwOworCQlmcy0+Z3JvdXBfZGVzY1tpXS5iZ191c2VkX2RpcnNfY291bnQgPSAwOworCisJCWdyb3VwX2Jsb2NrICs9IHN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJfQorCisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCWV4dDJmc19tYXJrX2JiX2RpcnR5KGZzKTsKKwlleHQyZnNfbWFya19pYl9kaXJ0eShmcyk7CisKKwlpb19jaGFubmVsX3NldF9ibGtzaXplKGZzLT5pbywgZnMtPmJsb2Nrc2l6ZSk7CisKKwkqcmV0X2ZzID0gZnM7CisJcmV0dXJuIDA7CitjbGVhbnVwOgorCWV4dDJmc19mcmVlKGZzKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lubGluZS5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lubGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTdiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW5saW5lLmMKQEAgLTAsMCArMSwzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaW5saW5lLmMgLS0tIEluY2x1ZGVzIHRoZSBpbmxpbmVkIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBoZWFkZXIKKyAqIGZpbGVzIGFzIHN0YW5kYWxvbmUgZnVuY3Rpb25zLCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtCisgKiBpcyBjb21waWxlZCB3aXRoIGlubGluaW5nIHR1cm5lZCBvZmYuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNkZWZpbmUgSU5DTFVERV9JTkxJTkVfRlVOQ1MKKyNpbmNsdWRlICJleHQyZnMuaCIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbm9kZS5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExZDVjOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbm9kZS5jCkBAIC0wLDAgKzEsNzY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpbm9kZS5jIC0tLSB1dGlsaXR5IHJvdXRpbmVzIHRvIHJlYWQgYW5kIHdyaXRlIGlub2RlcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisjaW5jbHVkZSAiZTJpbWFnZS5oIgorCitzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfaW5vZGVfc2NhbiB7CisJZXJyY29kZV90CQltYWdpYzsKKwlleHQyX2ZpbHN5cwkJZnM7CisJZXh0Ml9pbm9fdAkJY3VycmVudF9pbm9kZTsKKwlibGtfdAkJCWN1cnJlbnRfYmxvY2s7CisJZGdycF90CQkJY3VycmVudF9ncm91cDsKKwlleHQyX2lub190CQlpbm9kZXNfbGVmdDsKKwlibGtfdAkJCWJsb2Nrc19sZWZ0OworCWRncnBfdAkJCWdyb3Vwc19sZWZ0OworCWJsa190CQkJaW5vZGVfYnVmZmVyX2Jsb2NrczsKKwljaGFyICoJCQlpbm9kZV9idWZmZXI7CisJaW50CQkJaW5vZGVfc2l6ZTsKKwljaGFyICoJCQlwdHI7CisJaW50CQkJYnl0ZXNfbGVmdDsKKwljaGFyCQkJKnRlbXBfYnVmZmVyOworCWVycmNvZGVfdAkJKCpkb25lX2dyb3VwKShleHQyX2ZpbHN5cyBmcywKKwkJCQkJICAgICAgZGdycF90IGdyb3VwLAorCQkJCQkgICAgICB2b2lkICogcHJpdl9kYXRhKTsKKwl2b2lkICoJCQlkb25lX2dyb3VwX2RhdGE7CisJaW50CQkJYmFkX2Jsb2NrX3B0cjsKKwlpbnQJCQlzY2FuX2ZsYWdzOworCWludAkJCXJlc2VydmVkWzZdOworfTsKKworLyoKKyAqIFRoaXMgcm91dGluZSBmbHVzaGVzIHRoZSBpY2FjaGUsIGlmIGl0IGV4aXN0cy4KKyAqLworZXJyY29kZV90IGV4dDJmc19mbHVzaF9pY2FjaGUoZXh0Ml9maWxzeXMgZnMpCit7CisJaW50CWk7CisKKwlpZiAoIWZzLT5pY2FjaGUpCisJCXJldHVybiAwOworCisJZm9yIChpPTA7IGkgPCBmcy0+aWNhY2hlLT5jYWNoZV9zaXplOyBpKyspCisJCWZzLT5pY2FjaGUtPmNhY2hlW2ldLmlubyA9IDA7CisKKwlmcy0+aWNhY2hlLT5idWZmZXJfYmxrID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBjcmVhdGVfaWNhY2hlKGV4dDJfZmlsc3lzIGZzKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlpZiAoZnMtPmljYWNoZSkKKwkJcmV0dXJuIDA7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX2NhY2hlKSwgJmZzLT5pY2FjaGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwltZW1zZXQoZnMtPmljYWNoZSwgMCwgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX2NhY2hlKSk7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmZzLT5pY2FjaGUtPmJ1ZmZlcik7CisJaWYgKHJldHZhbCkgeworCQlleHQyZnNfZnJlZV9tZW0oJmZzLT5pY2FjaGUpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlmcy0+aWNhY2hlLT5idWZmZXJfYmxrID0gMDsKKwlmcy0+aWNhY2hlLT5jYWNoZV9sYXN0ID0gLTE7CisJZnMtPmljYWNoZS0+Y2FjaGVfc2l6ZSA9IDQ7CisJZnMtPmljYWNoZS0+cmVmY291bnQgPSAxOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZV9jYWNoZV9lbnQpCisJCQkJKiBmcy0+aWNhY2hlLT5jYWNoZV9zaXplLAorCQkJCSZmcy0+aWNhY2hlLT5jYWNoZSk7CisJaWYgKHJldHZhbCkgeworCQlleHQyZnNfZnJlZV9tZW0oJmZzLT5pY2FjaGUtPmJ1ZmZlcik7CisJCWV4dDJmc19mcmVlX21lbSgmZnMtPmljYWNoZSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCWV4dDJmc19mbHVzaF9pY2FjaGUoZnMpOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX29wZW5faW5vZGVfc2NhbihleHQyX2ZpbHN5cyBmcywgaW50IGJ1ZmZlcl9ibG9ja3MsCisJCQkJIGV4dDJfaW5vZGVfc2NhbiAqcmV0X3NjYW4pCit7CisJZXh0Ml9pbm9kZV9zY2FuCXNjYW47CisJZXJyY29kZV90CXJldHZhbDsKKwllcnJjb2RlX3QgKCpzYXZlX2dldF9ibG9ja3MpKGV4dDJfZmlsc3lzIGYsIGV4dDJfaW5vX3QgaW5vLCBibGtfdCAqYmxvY2tzKTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwkvKgorCSAqIElmIGZzLT5iYWRibG9ja3MgaXNuJ3Qgc2V0LCB0aGVuIHNldCBpdCAtLS0gc2luY2UgdGhlIGlub2RlCisJICogc2Nhbm5pbmcgZnVuY3Rpb25zIHJlcXVpcmUgaXQuCisJICovCisJaWYgKGZzLT5iYWRibG9ja3MgPT0gMCkgeworCQkvKgorCQkgKiBUZW1wb3Jhcmx5IHNhdmUgZnMtPmdldF9ibG9ja3MgYW5kIHNldCBpdCB0byB6ZXJvLAorCQkgKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBlMmZzY2sncy4KKwkJICovCisJCXNhdmVfZ2V0X2Jsb2NrcyA9IGZzLT5nZXRfYmxvY2tzOworCQlmcy0+Z2V0X2Jsb2NrcyA9IDA7CisJCXJldHZhbCA9IGV4dDJmc19yZWFkX2JiX2lub2RlKGZzLCAmZnMtPmJhZGJsb2Nrcyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWV4dDJmc19iYWRibG9ja3NfbGlzdF9mcmVlKGZzLT5iYWRibG9ja3MpOworCQkJZnMtPmJhZGJsb2NrcyA9IDA7CisJCX0KKwkJZnMtPmdldF9ibG9ja3MgPSBzYXZlX2dldF9ibG9ja3M7CisJfQorCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBleHQyX3N0cnVjdF9pbm9kZV9zY2FuKSwgJnNjYW4pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KHNjYW4sIDAsIHNpemVvZihzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfaW5vZGVfc2NhbikpOworCisJc2Nhbi0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0lOT0RFX1NDQU47CisJc2Nhbi0+ZnMgPSBmczsKKwlzY2FuLT5pbm9kZV9zaXplID0gRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcik7CisJc2Nhbi0+Ynl0ZXNfbGVmdCA9IDA7CisJc2Nhbi0+Y3VycmVudF9ncm91cCA9IDA7CisJc2Nhbi0+Z3JvdXBzX2xlZnQgPSBmcy0+Z3JvdXBfZGVzY19jb3VudCAtIDE7CisJc2Nhbi0+aW5vZGVfYnVmZmVyX2Jsb2NrcyA9IGJ1ZmZlcl9ibG9ja3MgPyBidWZmZXJfYmxvY2tzIDogODsKKwlzY2FuLT5jdXJyZW50X2Jsb2NrID0gc2Nhbi0+ZnMtPgorCQlncm91cF9kZXNjW3NjYW4tPmN1cnJlbnRfZ3JvdXBdLmJnX2lub2RlX3RhYmxlOworCXNjYW4tPmlub2Rlc19sZWZ0ID0gRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNjYW4tPmZzLT5zdXBlcik7CisJc2Nhbi0+YmxvY2tzX2xlZnQgPSBzY2FuLT5mcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cDsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbSgoc2l6ZV90KSAoc2Nhbi0+aW5vZGVfYnVmZmVyX2Jsb2NrcyAqCisJCQkJCSAgZnMtPmJsb2Nrc2l6ZSksCisJCQkJJnNjYW4tPmlub2RlX2J1ZmZlcik7CisJc2Nhbi0+ZG9uZV9ncm91cCA9IDA7CisJc2Nhbi0+ZG9uZV9ncm91cF9kYXRhID0gMDsKKwlzY2FuLT5iYWRfYmxvY2tfcHRyID0gMDsKKwlpZiAocmV0dmFsKSB7CisJCWV4dDJmc19mcmVlX21lbSgmc2Nhbik7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNjYW4tPmlub2RlX3NpemUsICZzY2FuLT50ZW1wX2J1ZmZlcik7CisJaWYgKHJldHZhbCkgeworCQlleHQyZnNfZnJlZV9tZW0oJnNjYW4tPmlub2RlX2J1ZmZlcik7CisJCWV4dDJmc19mcmVlX21lbSgmc2Nhbik7CisJCXJldHVybiByZXR2YWw7CisJfQorCWlmIChzY2FuLT5mcy0+YmFkYmxvY2tzICYmIHNjYW4tPmZzLT5iYWRibG9ja3MtPm51bSkKKwkJc2Nhbi0+c2Nhbl9mbGFncyB8PSBFWFQyX1NGX0NIS19CQURCTE9DS1M7CisJKnJldF9zY2FuID0gc2NhbjsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBleHQyZnNfY2xvc2VfaW5vZGVfc2NhbihleHQyX2lub2RlX3NjYW4gc2NhbikKK3sKKwlpZiAoIXNjYW4gfHwgKHNjYW4tPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfSU5PREVfU0NBTikpCisJCXJldHVybjsKKworCWV4dDJmc19mcmVlX21lbSgmc2Nhbi0+aW5vZGVfYnVmZmVyKTsKKwlzY2FuLT5pbm9kZV9idWZmZXIgPSBOVUxMOworCWV4dDJmc19mcmVlX21lbSgmc2Nhbi0+dGVtcF9idWZmZXIpOworCXNjYW4tPnRlbXBfYnVmZmVyID0gTlVMTDsKKwlleHQyZnNfZnJlZV9tZW0oJnNjYW4pOworfQorCit2b2lkIGV4dDJmc19zZXRfaW5vZGVfY2FsbGJhY2soZXh0Ml9pbm9kZV9zY2FuIHNjYW4sCisJCQkgICAgICAgZXJyY29kZV90ICgqZG9uZV9ncm91cCkoZXh0Ml9maWxzeXMgZnMsCisJCQkJCQkgICAgICAgZGdycF90IGdyb3VwLAorCQkJCQkJICAgICAgIHZvaWQgKiBwcml2X2RhdGEpLAorCQkJICAgICAgIHZvaWQgKmRvbmVfZ3JvdXBfZGF0YSkKK3sKKwlpZiAoIXNjYW4gfHwgKHNjYW4tPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfSU5PREVfU0NBTikpCisJCXJldHVybjsKKworCXNjYW4tPmRvbmVfZ3JvdXAgPSBkb25lX2dyb3VwOworCXNjYW4tPmRvbmVfZ3JvdXBfZGF0YSA9IGRvbmVfZ3JvdXBfZGF0YTsKK30KKworaW50IGV4dDJmc19pbm9kZV9zY2FuX2ZsYWdzKGV4dDJfaW5vZGVfc2NhbiBzY2FuLCBpbnQgc2V0X2ZsYWdzLAorCQkJICAgIGludCBjbGVhcl9mbGFncykKK3sKKwlpbnQJb2xkX2ZsYWdzOworCisJaWYgKCFzY2FuIHx8IChzY2FuLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0lOT0RFX1NDQU4pKQorCQlyZXR1cm4gMDsKKworCW9sZF9mbGFncyA9IHNjYW4tPnNjYW5fZmxhZ3M7CisJc2Nhbi0+c2Nhbl9mbGFncyAmPSB+Y2xlYXJfZmxhZ3M7CisJc2Nhbi0+c2Nhbl9mbGFncyB8PSBzZXRfZmxhZ3M7CisJcmV0dXJuIG9sZF9mbGFnczsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV4dDJmc19nZXRfbmV4dF9pbm9kZSB3aGVuIGl0IG5lZWRzIHRvCisgKiBnZXQgcmVhZHkgdG8gcmVhZCBpbiBhIG5ldyBibG9ja2dyb3VwLgorICovCitzdGF0aWMgZXJyY29kZV90IGdldF9uZXh0X2Jsb2NrZ3JvdXAoZXh0Ml9pbm9kZV9zY2FuIHNjYW4pCit7CisJc2Nhbi0+Y3VycmVudF9ncm91cCsrOworCXNjYW4tPmdyb3Vwc19sZWZ0LS07CisKKwlzY2FuLT5jdXJyZW50X2Jsb2NrID0gc2Nhbi0+ZnMtPgorCQlncm91cF9kZXNjW3NjYW4tPmN1cnJlbnRfZ3JvdXBdLmJnX2lub2RlX3RhYmxlOworCisJc2Nhbi0+Y3VycmVudF9pbm9kZSA9IHNjYW4tPmN1cnJlbnRfZ3JvdXAgKgorCQlFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2Nhbi0+ZnMtPnN1cGVyKTsKKworCXNjYW4tPmJ5dGVzX2xlZnQgPSAwOworCXNjYW4tPmlub2Rlc19sZWZ0ID0gRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNjYW4tPmZzLT5zdXBlcik7CisJc2Nhbi0+YmxvY2tzX2xlZnQgPSBzY2FuLT5mcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cDsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19pbm9kZV9zY2FuX2dvdG9fYmxvY2tncm91cChleHQyX2lub2RlX3NjYW4gc2NhbiwKKwkJCQkJICAgIGludAlncm91cCkKK3sKKwlzY2FuLT5jdXJyZW50X2dyb3VwID0gZ3JvdXAgLSAxOworCXNjYW4tPmdyb3Vwc19sZWZ0ID0gc2Nhbi0+ZnMtPmdyb3VwX2Rlc2NfY291bnQgLSBncm91cDsKKwlyZXR1cm4gZ2V0X25leHRfYmxvY2tncm91cChzY2FuKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGdldF9uZXh0X2Jsb2NrcygpIHRvIGNoZWNrIGZvciBiYWQKKyAqIGJsb2NrcyBpbiB0aGUgaW5vZGUgdGFibGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYmFkYmxvY2tzX2xpc3QtPmxpc3QgaXMgc29ydGVkIGluCisgKiBpbmNyZWFzaW5nIG9yZGVyLgorICovCitzdGF0aWMgZXJyY29kZV90IGNoZWNrX2Zvcl9pbm9kZV9iYWRfYmxvY2tzKGV4dDJfaW5vZGVfc2NhbiBzY2FuLAorCQkJCQkgICAgYmxrX3QgKm51bV9ibG9ja3MpCit7CisJYmxrX3QJYmxrID0gc2Nhbi0+Y3VycmVudF9ibG9jazsKKwliYWRibG9ja3NfbGlzdAliYiA9IHNjYW4tPmZzLT5iYWRibG9ja3M7CisKKwkvKgorCSAqIElmIHRoZSBpbm9kZSB0YWJsZSBpcyBtaXNzaW5nLCB0aGVuIG9idmlvdXNseSB0aGVyZSBhcmUgbm8KKwkgKiBiYWQgYmxvY2tzLiAgOi0pCisJICovCisJaWYgKGJsayA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgdGhlIGN1cnJlbnQgYmxvY2sgaXMgZ3JlYXRlciB0aGFuIHRoZSBiYWQgYmxvY2sgbGlzdGVkCisJICogaW4gdGhlIGJhZCBibG9jayBsaXN0LCB0aGVuIGFkdmFuY2UgdGhlIHBvaW50ZXIgdW50aWwgdGhpcworCSAqIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gIElmIHdlIHJ1biBvdXQgb2YgYmFkIGJsb2NrcywgdGhlbgorCSAqIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IG1vcmUgY2hlY2tpbmchCisJICovCisJd2hpbGUgKGJsayA+IGJiLT5saXN0W3NjYW4tPmJhZF9ibG9ja19wdHJdKSB7CisJCWlmICgrK3NjYW4tPmJhZF9ibG9ja19wdHIgPj0gYmItPm51bSkgeworCQkJc2Nhbi0+c2Nhbl9mbGFncyAmPSB+RVhUMl9TRl9DSEtfQkFEQkxPQ0tTOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZSBjdXJyZW50IGJsb2NrIGlzIGVxdWFsIHRvIHRoZSBiYWQgYmxvY2sgbGlzdGVkIGluCisJICogdGhlIGJhZCBibG9jayBsaXN0LCB0aGVuIGhhbmRsZSB0aGF0IG9uZSBibG9jayBzcGVjaWFsbHkuCisJICogKFdlIGNvdWxkIHRyeSB0byBoYW5kbGUgcnVucyBvZiBiYWQgYmxvY2tzLCBidXQgdGhhdAorCSAqIG9ubHkgaW5jcmVhc2VzIENQVSBlZmZpY2llbmN5IGJ5IGEgc21hbGwgYW1vdW50LCBhdCB0aGUKKwkgKiBleHBlbnNlIG9mIGEgaHVnZSBleHBlbnNlIG9mIGNvZGUgY29tcGxleGl0eSwgYW5kIGZvciBhbgorCSAqIHVuY29tbW9uIGNhc2UgYXQgdGhhdC4pCisJICovCisJaWYgKGJsayA9PSBiYi0+bGlzdFtzY2FuLT5iYWRfYmxvY2tfcHRyXSkgeworCQlzY2FuLT5zY2FuX2ZsYWdzIHw9IEVYVDJfU0ZfQkFEX0lOT0RFX0JMSzsKKwkJKm51bV9ibG9ja3MgPSAxOworCQlpZiAoKytzY2FuLT5iYWRfYmxvY2tfcHRyID49IGJiLT5udW0pCisJCQlzY2FuLT5zY2FuX2ZsYWdzICY9IH5FWFQyX1NGX0NIS19CQURCTE9DS1M7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgYSBiYWQgYmxvY2sgaW4gdGhlIHJhbmdlIHRoYXQgd2UncmUgYWJvdXQgdG8KKwkgKiByZWFkIGluLCBhZGp1c3QgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gcmVhZCBzbyB0aGF0IHdlIHdlCisJICogZG9uJ3QgcmVhZCBpbiB0aGUgYmFkIGJsb2NrLiAgKFRoZW4gdGhlIG5leHQgYmxvY2sgdG8gcmVhZAorCSAqIHdpbGwgYmUgdGhlIGJhZCBibG9jaywgd2hpY2ggaXMgaGFuZGxlZCBpbiB0aGUgYWJvdmUgY2FzZS4pCisJICovCisJaWYgKChibGsgKyAqbnVtX2Jsb2NrcykgPiBiYi0+bGlzdFtzY2FuLT5iYWRfYmxvY2tfcHRyXSkKKwkJKm51bV9ibG9ja3MgPSAoaW50KSAoYmItPmxpc3Rbc2Nhbi0+YmFkX2Jsb2NrX3B0cl0gLSBibGspOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBleHQyZnNfZ2V0X25leHRfaW5vZGUgd2hlbiBpdCBuZWVkcyB0bworICogcmVhZCBpbiBtb3JlIGJsb2NrcyBmcm9tIHRoZSBjdXJyZW50IGJsb2NrZ3JvdXAncyBpbm9kZSB0YWJsZS4KKyAqLworc3RhdGljIGVycmNvZGVfdCBnZXRfbmV4dF9ibG9ja3MoZXh0Ml9pbm9kZV9zY2FuIHNjYW4pCit7CisJYmxrX3QJCW51bV9ibG9ja3M7CisJZXJyY29kZV90CXJldHZhbDsKKworCS8qCisJICogRmlndXJlIG91dCBob3cgbWFueSBibG9ja3MgdG8gcmVhZDsgd2UgcmVhZCBhdCBtb3N0CisJICogaW5vZGVfYnVmZmVyX2Jsb2NrcywgYW5kIHBlcmhhcHMgbGVzcyBpZiB0aGVyZSBhcmVuJ3QgdGhhdAorCSAqIG1hbnkgYmxvY2tzIGxlZnQgdG8gcmVhZC4KKwkgKi8KKwludW1fYmxvY2tzID0gc2Nhbi0+aW5vZGVfYnVmZmVyX2Jsb2NrczsKKwlpZiAobnVtX2Jsb2NrcyA+IHNjYW4tPmJsb2Nrc19sZWZ0KQorCQludW1fYmxvY2tzID0gc2Nhbi0+YmxvY2tzX2xlZnQ7CisKKwkvKgorCSAqIElmIHRoZSBwYXN0IGJsb2NrICJyZWFkIiB3YXMgYSBiYWQgYmxvY2ssIHRoZW4gbWFyayB0aGUKKwkgKiBsZWZ0LW92ZXIgZXh0cmEgYnl0ZXMgYXMgYWxzbyBiZWluZyBiYWQuCisJICovCisJaWYgKHNjYW4tPnNjYW5fZmxhZ3MgJiBFWFQyX1NGX0JBRF9JTk9ERV9CTEspIHsKKwkJaWYgKHNjYW4tPmJ5dGVzX2xlZnQpCisJCQlzY2FuLT5zY2FuX2ZsYWdzIHw9IEVYVDJfU0ZfQkFEX0VYVFJBX0JZVEVTOworCQlzY2FuLT5zY2FuX2ZsYWdzICY9IH5FWFQyX1NGX0JBRF9JTk9ERV9CTEs7CisJfQorCisJLyoKKwkgKiBEbyBpbm9kZSBiYWQgYmxvY2sgcHJvY2Vzc2luZywgaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmIChzY2FuLT5zY2FuX2ZsYWdzICYgRVhUMl9TRl9DSEtfQkFEQkxPQ0tTKSB7CisJCXJldHZhbCA9IGNoZWNrX2Zvcl9pbm9kZV9iYWRfYmxvY2tzKHNjYW4sICZudW1fYmxvY2tzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKChzY2FuLT5zY2FuX2ZsYWdzICYgRVhUMl9TRl9CQURfSU5PREVfQkxLKSB8fAorCSAgICAoc2Nhbi0+Y3VycmVudF9ibG9jayA9PSAwKSkgeworCQltZW1zZXQoc2Nhbi0+aW5vZGVfYnVmZmVyLCAwLAorCQkgICAgICAgKHNpemVfdCkgbnVtX2Jsb2NrcyAqIHNjYW4tPmZzLT5ibG9ja3NpemUpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoc2Nhbi0+ZnMtPmlvLAorCQkJCQkgICAgIHNjYW4tPmN1cnJlbnRfYmxvY2ssCisJCQkJCSAgICAgKGludCkgbnVtX2Jsb2NrcywKKwkJCQkJICAgICBzY2FuLT5pbm9kZV9idWZmZXIpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIEVYVDJfRVRfTkVYVF9JTk9ERV9SRUFEOworCX0KKwlzY2FuLT5wdHIgPSBzY2FuLT5pbm9kZV9idWZmZXI7CisJc2Nhbi0+Ynl0ZXNfbGVmdCA9IG51bV9ibG9ja3MgKiBzY2FuLT5mcy0+YmxvY2tzaXplOworCisJc2Nhbi0+YmxvY2tzX2xlZnQgLT0gbnVtX2Jsb2NrczsKKwlpZiAoc2Nhbi0+Y3VycmVudF9ibG9jaykKKwkJc2Nhbi0+Y3VycmVudF9ibG9jayArPSBudW1fYmxvY2tzOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2dldF9uZXh0X2lub2RlX2Z1bGwoZXh0Ml9pbm9kZV9zY2FuIHNjYW4sIGV4dDJfaW5vX3QgKmlubywKKwkJCQkgICAgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSwgaW50IGJ1ZnNpemUpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlpbnQJCWV4dHJhX2J5dGVzID0gMDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoc2NhbiwgRVhUMl9FVF9NQUdJQ19JTk9ERV9TQ0FOKTsKKworCS8qCisJICogRG8gd2UgbmVlZCB0byBzdGFydCByZWFkaW5nIGEgbmV3IGJsb2NrIGdyb3VwPworCSAqLworCWlmIChzY2FuLT5pbm9kZXNfbGVmdCA8PSAwKSB7CisJZm9yY2VfbmV3X2dyb3VwOgorCQlpZiAoc2Nhbi0+ZG9uZV9ncm91cCkgeworCQkJcmV0dmFsID0gKHNjYW4tPmRvbmVfZ3JvdXApCisJCQkJKHNjYW4tPmZzLCBzY2FuLT5jdXJyZW50X2dyb3VwLAorCQkJCSBzY2FuLT5kb25lX2dyb3VwX2RhdGEpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWlmIChzY2FuLT5ncm91cHNfbGVmdCA8PSAwKSB7CisJCQkqaW5vID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHZhbCA9IGdldF9uZXh0X2Jsb2NrZ3JvdXAoc2Nhbik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvKgorCSAqIFRoaXMgaXMgZG9uZSBvdXRzaWRlIHRoZSBhYm92ZSBpZiBzdGF0ZW1lbnQgc28gdGhhdCB0aGUKKwkgKiBjaGVjayBjYW4gYmUgZG9uZSBmb3IgYmxvY2sgZ3JvdXAgIzAuCisJICovCisJaWYgKHNjYW4tPmN1cnJlbnRfYmxvY2sgPT0gMCkgeworCQlpZiAoc2Nhbi0+c2Nhbl9mbGFncyAmIEVYVDJfU0ZfU0tJUF9NSVNTSU5HX0lUQUJMRSkgeworCQkJZ290byBmb3JjZV9uZXdfZ3JvdXA7CisJCX0gZWxzZQorCQkJcmV0dXJuIEVYVDJfRVRfTUlTU0lOR19JTk9ERV9UQUJMRTsKKwl9CisKKworCS8qCisJICogSGF2ZSB3ZSBydW4gb3V0IG9mIHNwYWNlIGluIHRoZSBpbm9kZSBidWZmZXI/ICBJZiBzbywgd2UKKwkgKiBuZWVkIHRvIHJlYWQgaW4gbW9yZSBibG9ja3MuCisJICovCisJaWYgKHNjYW4tPmJ5dGVzX2xlZnQgPCBzY2FuLT5pbm9kZV9zaXplKSB7CisJCW1lbWNweShzY2FuLT50ZW1wX2J1ZmZlciwgc2Nhbi0+cHRyLCBzY2FuLT5ieXRlc19sZWZ0KTsKKwkJZXh0cmFfYnl0ZXMgPSBzY2FuLT5ieXRlc19sZWZ0OworCisJCXJldHZhbCA9IGdldF9uZXh0X2Jsb2NrcyhzY2FuKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisjaWYgMAorCQkvKgorCQkgKiBYWFggdGVzdCAgTmVlZCBjaGVjayBmb3IgdXNlZCBpbm9kZSBzb21laG93LgorCQkgKiAoTm90ZTogdGhpcyBpcyBoYXJkLikKKwkJICovCisJCWlmIChpc19lbXB0eV9zY2FuKHNjYW4pKQorCQkJZ290byBmb3JjZV9uZXdfZ3JvdXA7CisjZW5kaWYKKwl9CisKKwlyZXR2YWwgPSAwOworCWlmIChleHRyYV9ieXRlcykgeworCQltZW1jcHkoc2Nhbi0+dGVtcF9idWZmZXIrZXh0cmFfYnl0ZXMsIHNjYW4tPnB0ciwKKwkJICAgICAgIHNjYW4tPmlub2RlX3NpemUgLSBleHRyYV9ieXRlcyk7CisJCXNjYW4tPnB0ciArPSBzY2FuLT5pbm9kZV9zaXplIC0gZXh0cmFfYnl0ZXM7CisJCXNjYW4tPmJ5dGVzX2xlZnQgLT0gc2Nhbi0+aW5vZGVfc2l6ZSAtIGV4dHJhX2J5dGVzOworCisjaWYgQkJfQklHX0VORElBTgorCQlpZiAoKHNjYW4tPmZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCQkgICAgKHNjYW4tPmZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQpKQorCQkJZXh0MmZzX3N3YXBfaW5vZGVfZnVsbChzY2FuLT5mcywKKwkJCQkoc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKikgaW5vZGUsCisJCQkJKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIHNjYW4tPnRlbXBfYnVmZmVyLAorCQkJCTAsIGJ1ZnNpemUpOworCQllbHNlCisjZW5kaWYKKwkJCSppbm9kZSA9ICooKHN0cnVjdCBleHQyX2lub2RlICopIHNjYW4tPnRlbXBfYnVmZmVyKTsKKwkJaWYgKHNjYW4tPnNjYW5fZmxhZ3MgJiBFWFQyX1NGX0JBRF9FWFRSQV9CWVRFUykKKwkJCXJldHZhbCA9IEVYVDJfRVRfQkFEX0JMT0NLX0lOX0lOT0RFX1RBQkxFOworCQlzY2FuLT5zY2FuX2ZsYWdzICY9IH5FWFQyX1NGX0JBRF9FWFRSQV9CWVRFUzsKKwl9IGVsc2UgeworI2lmIEJCX0JJR19FTkRJQU4KKwkJaWYgKChzY2FuLT5mcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkJICAgIChzY2FuLT5mcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKSkKKwkJCWV4dDJmc19zd2FwX2lub2RlX2Z1bGwoc2Nhbi0+ZnMsCisJCQkJKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIGlub2RlLAorCQkJCShzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSBzY2FuLT5wdHIsCisJCQkJMCwgYnVmc2l6ZSk7CisJCWVsc2UKKyNlbmRpZgorCQkJbWVtY3B5KGlub2RlLCBzY2FuLT5wdHIsIGJ1ZnNpemUpOworCQlzY2FuLT5wdHIgKz0gc2Nhbi0+aW5vZGVfc2l6ZTsKKwkJc2Nhbi0+Ynl0ZXNfbGVmdCAtPSBzY2FuLT5pbm9kZV9zaXplOworCQlpZiAoc2Nhbi0+c2Nhbl9mbGFncyAmIEVYVDJfU0ZfQkFEX0lOT0RFX0JMSykKKwkJCXJldHZhbCA9IEVYVDJfRVRfQkFEX0JMT0NLX0lOX0lOT0RFX1RBQkxFOworCX0KKworCXNjYW4tPmlub2Rlc19sZWZ0LS07CisJc2Nhbi0+Y3VycmVudF9pbm9kZSsrOworCSppbm8gPSBzY2FuLT5jdXJyZW50X2lub2RlOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZ2V0X25leHRfaW5vZGUoZXh0Ml9pbm9kZV9zY2FuIHNjYW4sIGV4dDJfaW5vX3QgKmlubywKKwkJCQlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGV4dDJmc19nZXRfbmV4dF9pbm9kZV9mdWxsKHNjYW4sIGlubywgaW5vZGUsCisJCQkJCQlzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpKTsKK30KKworLyoKKyAqIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBhIHNpbmdsZSBpbm9kZS4KKyAqLworZXJyY29kZV90IGV4dDJmc19yZWFkX2lub2RlX2Z1bGwoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSBzdHJ1Y3QgZXh0Ml9pbm9kZSAqIGlub2RlLCBpbnQgYnVmc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nCWdyb3VwLCBibG9jaywgYmxvY2tfbnIsIG9mZnNldDsKKwljaGFyCQkqcHRyOworCWVycmNvZGVfdAlyZXR2YWw7CisJaW50CQljbGVuLCBpLCBpbm9kZXNfcGVyX2Jsb2NrLCBsZW5ndGg7CisJaW9fY2hhbm5lbAlpbzsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdXNlciBoYXMgYW4gb3ZlcnJpZGUgZnVuY3Rpb24gKi8KKwlpZiAoZnMtPnJlYWRfaW5vZGUpIHsKKwkJcmV0dmFsID0gKGZzLT5yZWFkX2lub2RlKShmcywgaW5vLCBpbm9kZSk7CisJCWlmIChyZXR2YWwgIT0gRVhUMl9FVF9DQUxMQkFDS19OT1RIQU5ETEVEKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJLyogQ3JlYXRlIGlub2RlIGNhY2hlIGlmIG5vdCBwcmVzZW50ICovCisJaWYgKCFmcy0+aWNhY2hlKSB7CisJCXJldHZhbCA9IGNyZWF0ZV9pY2FjaGUoZnMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIGlub2RlIGNhY2hlICovCisJaWYgKGJ1ZnNpemUgPT0gc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSkgeworCQkvKiBvbmx5IG9sZCBnb29kIGlub2RlIGNhbiBiZSByZXRyaWV2ZSBmcm9tIHRoZSBjYWNoZSAqLworCQlmb3IgKGk9MDsgaSA8IGZzLT5pY2FjaGUtPmNhY2hlX3NpemU7IGkrKykgeworCQkJaWYgKGZzLT5pY2FjaGUtPmNhY2hlW2ldLmlubyA9PSBpbm8pIHsKKwkJCQkqaW5vZGUgPSBmcy0+aWNhY2hlLT5jYWNoZVtpXS5pbm9kZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoKGlubyA9PSAwKSB8fCAoaW5vID4gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudCkpCisJCXJldHVybiBFWFQyX0VUX0JBRF9JTk9ERV9OVU07CisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19JTUFHRV9GSUxFKSB7CisJCWlub2Rlc19wZXJfYmxvY2sgPSBmcy0+YmxvY2tzaXplIC8gRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcik7CisJCWJsb2NrX25yID0gZnMtPmltYWdlX2hlYWRlci0+b2Zmc2V0X2lub2RlIC8gZnMtPmJsb2Nrc2l6ZTsKKwkJYmxvY2tfbnIgKz0gKGlubyAtIDEpIC8gaW5vZGVzX3Blcl9ibG9jazsKKwkJb2Zmc2V0ID0gKChpbm8gLSAxKSAlIGlub2Rlc19wZXJfYmxvY2spICoKKwkJCUVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpOworCQlpbyA9IGZzLT5pbWFnZV9pbzsKKwl9IGVsc2UgeworCQlncm91cCA9IChpbm8gLSAxKSAvIEVYVDJfSU5PREVTX1BFUl9HUk9VUChmcy0+c3VwZXIpOworCQlvZmZzZXQgPSAoKGlubyAtIDEpICUgRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzLT5zdXBlcikpICoKKwkJCUVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpOworCQlibG9jayA9IG9mZnNldCA+PiBFWFQyX0JMT0NLX1NJWkVfQklUUyhmcy0+c3VwZXIpOworCQlpZiAoIWZzLT5ncm91cF9kZXNjWyh1bnNpZ25lZClncm91cF0uYmdfaW5vZGVfdGFibGUpCisJCQlyZXR1cm4gRVhUMl9FVF9NSVNTSU5HX0lOT0RFX1RBQkxFOworCQlibG9ja19uciA9IGZzLT5ncm91cF9kZXNjWyh1bnNpZ25lZClncm91cF0uYmdfaW5vZGVfdGFibGUgKworCQkJYmxvY2s7CisJCWlvID0gZnMtPmlvOworCX0KKwlvZmZzZXQgJj0gKEVYVDJfQkxPQ0tfU0laRShmcy0+c3VwZXIpIC0gMSk7CisKKwlsZW5ndGggPSBFWFQyX0lOT0RFX1NJWkUoZnMtPnN1cGVyKTsKKwlpZiAoYnVmc2l6ZSA8IGxlbmd0aCkKKwkJbGVuZ3RoID0gYnVmc2l6ZTsKKworCXB0ciA9IChjaGFyICopIGlub2RlOworCXdoaWxlIChsZW5ndGgpIHsKKwkJY2xlbiA9IGxlbmd0aDsKKwkJaWYgKChvZmZzZXQgKyBsZW5ndGgpID4gZnMtPmJsb2Nrc2l6ZSkKKwkJCWNsZW4gPSBmcy0+YmxvY2tzaXplIC0gb2Zmc2V0OworCisJCWlmIChibG9ja19uciAhPSBmcy0+aWNhY2hlLT5idWZmZXJfYmxrKSB7CisJCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGlvLCBibG9ja19uciwgMSwKKwkJCQkJCSAgICAgZnMtPmljYWNoZS0+YnVmZmVyKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCWZzLT5pY2FjaGUtPmJ1ZmZlcl9ibGsgPSBibG9ja19ucjsKKwkJfQorCisJCW1lbWNweShwdHIsICgoY2hhciAqKSBmcy0+aWNhY2hlLT5idWZmZXIpICsgKHVuc2lnbmVkKSBvZmZzZXQsCisJCSAgICAgICBjbGVuKTsKKworCQlvZmZzZXQgPSAwOworCQlsZW5ndGggLT0gY2xlbjsKKwkJcHRyICs9IGNsZW47CisJCWJsb2NrX25yKys7CisJfQorCisjaWYgQkJfQklHX0VORElBTgorCWlmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHx8CisJICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKSkKKwkJZXh0MmZzX3N3YXBfaW5vZGVfZnVsbChmcywgKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIGlub2RlLAorCQkJCSAgICAgICAoc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKikgaW5vZGUsCisJCQkJICAgICAgIDAsIGxlbmd0aCk7CisjZW5kaWYKKworCS8qIFVwZGF0ZSB0aGUgaW5vZGUgY2FjaGUgKi8KKwlmcy0+aWNhY2hlLT5jYWNoZV9sYXN0ID0gKGZzLT5pY2FjaGUtPmNhY2hlX2xhc3QgKyAxKSAlCisJCWZzLT5pY2FjaGUtPmNhY2hlX3NpemU7CisJZnMtPmljYWNoZS0+Y2FjaGVbZnMtPmljYWNoZS0+Y2FjaGVfbGFzdF0uaW5vID0gaW5vOworCWZzLT5pY2FjaGUtPmNhY2hlW2ZzLT5pY2FjaGUtPmNhY2hlX2xhc3RdLmlub2RlID0gKmlub2RlOworCisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfcmVhZF9pbm9kZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSkKK3sKKwlyZXR1cm4gZXh0MmZzX3JlYWRfaW5vZGVfZnVsbChmcywgaW5vLCBpbm9kZSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfd3JpdGVfaW5vZGVfZnVsbChleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqIGlub2RlLCBpbnQgYnVmc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGdyb3VwLCBibG9jaywgYmxvY2tfbnIsIG9mZnNldDsKKwllcnJjb2RlX3QgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSB0ZW1wX2lub2RlLCAqd19pbm9kZTsKKwljaGFyICpwdHI7CisJaW50IGNsZW4sIGksIGxlbmd0aDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdXNlciBwcm92aWRlZCBhbiBvdmVycmlkZSBmdW5jdGlvbiAqLworCWlmIChmcy0+d3JpdGVfaW5vZGUpIHsKKwkJcmV0dmFsID0gKGZzLT53cml0ZV9pbm9kZSkoZnMsIGlubywgaW5vZGUpOworCQlpZiAocmV0dmFsICE9IEVYVDJfRVRfQ0FMTEJBQ0tfTk9USEFORExFRCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbm9kZSBjYWNoZSBuZWVkcyB0byBiZSB1cGRhdGVkICovCisJaWYgKGZzLT5pY2FjaGUpIHsKKwkJZm9yIChpPTA7IGkgPCBmcy0+aWNhY2hlLT5jYWNoZV9zaXplOyBpKyspIHsKKwkJCWlmIChmcy0+aWNhY2hlLT5jYWNoZVtpXS5pbm8gPT0gaW5vKSB7CisJCQkJZnMtPmljYWNoZS0+Y2FjaGVbaV0uaW5vZGUgPSAqaW5vZGU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZXR2YWwgPSBjcmVhdGVfaWNhY2hlKGZzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKCEoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1JXKSkKKwkJcmV0dXJuIEVYVDJfRVRfUk9fRklMU1lTOworCisJaWYgKChpbm8gPT0gMCkgfHwgKGlubyA+IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpKQorCQlyZXR1cm4gRVhUMl9FVF9CQURfSU5PREVfTlVNOworCisJbGVuZ3RoID0gYnVmc2l6ZTsKKwlpZiAobGVuZ3RoIDwgRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcikpCisJCWxlbmd0aCA9IEVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpOworCisJaWYgKGxlbmd0aCA+IChpbnQpIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSkpIHsKKwkJd19pbm9kZSA9IHhtYWxsb2MobGVuZ3RoKTsKKwl9IGVsc2UKKwkJd19pbm9kZSA9ICZ0ZW1wX2lub2RlOworCW1lbXNldCh3X2lub2RlLCAwLCBsZW5ndGgpOworCisjaWYgQkJfQklHX0VORElBTgorCWlmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHx8CisJICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURSkpCisJCWV4dDJmc19zd2FwX2lub2RlX2Z1bGwoZnMsIHdfaW5vZGUsCisJCQkJICAgICAgIChzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSBpbm9kZSwKKwkJCQkgICAgICAgMSwgYnVmc2l6ZSk7CisJZWxzZQorI2VuZGlmCisJCW1lbWNweSh3X2lub2RlLCBpbm9kZSwgYnVmc2l6ZSk7CisKKwlncm91cCA9IChpbm8gLSAxKSAvIEVYVDJfSU5PREVTX1BFUl9HUk9VUChmcy0+c3VwZXIpOworCW9mZnNldCA9ICgoaW5vIC0gMSkgJSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSkgKgorCQlFWFQyX0lOT0RFX1NJWkUoZnMtPnN1cGVyKTsKKwlibG9jayA9IG9mZnNldCA+PiBFWFQyX0JMT0NLX1NJWkVfQklUUyhmcy0+c3VwZXIpOworCWlmICghZnMtPmdyb3VwX2Rlc2NbKHVuc2lnbmVkKSBncm91cF0uYmdfaW5vZGVfdGFibGUpCisJCXJldHVybiBFWFQyX0VUX01JU1NJTkdfSU5PREVfVEFCTEU7CisJYmxvY2tfbnIgPSBmcy0+Z3JvdXBfZGVzY1sodW5zaWduZWQpIGdyb3VwXS5iZ19pbm9kZV90YWJsZSArIGJsb2NrOworCisJb2Zmc2V0ICY9IChFWFQyX0JMT0NLX1NJWkUoZnMtPnN1cGVyKSAtIDEpOworCisJbGVuZ3RoID0gRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcik7CisJaWYgKGxlbmd0aCA+IGJ1ZnNpemUpCisJCWxlbmd0aCA9IGJ1ZnNpemU7CisKKwlwdHIgPSAoY2hhciAqKSB3X2lub2RlOworCisJd2hpbGUgKGxlbmd0aCkgeworCQljbGVuID0gbGVuZ3RoOworCQlpZiAoKG9mZnNldCArIGxlbmd0aCkgPiBmcy0+YmxvY2tzaXplKQorCQkJY2xlbiA9IGZzLT5ibG9ja3NpemUgLSBvZmZzZXQ7CisKKwkJaWYgKGZzLT5pY2FjaGUtPmJ1ZmZlcl9ibGsgIT0gYmxvY2tfbnIpIHsKKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBibG9ja19uciwgMSwKKwkJCQkJCSAgICAgZnMtPmljYWNoZS0+YnVmZmVyKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBlcnJvdXQ7CisJCQlmcy0+aWNhY2hlLT5idWZmZXJfYmxrID0gYmxvY2tfbnI7CisJCX0KKworCisJCW1lbWNweSgoY2hhciAqKSBmcy0+aWNhY2hlLT5idWZmZXIgKyAodW5zaWduZWQpIG9mZnNldCwKKwkJICAgICAgIHB0ciwgY2xlbik7CisKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibG9ja19uciwgMSwKKwkJCQkJICAgICAgZnMtPmljYWNoZS0+YnVmZmVyKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3V0OworCisJCW9mZnNldCA9IDA7CisJCXB0ciArPSBjbGVuOworCQlsZW5ndGggLT0gY2xlbjsKKwkJYmxvY2tfbnIrKzsKKwl9CisKKwlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX0NIQU5HRUQ7CitlcnJvdXQ6CisJaWYgKHdfaW5vZGUgJiYgd19pbm9kZSAhPSAmdGVtcF9pbm9kZSkKKwkJZnJlZSh3X2lub2RlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCSAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKQoreworCXJldHVybiBleHQyZnNfd3JpdGVfaW5vZGVfZnVsbChmcywgaW5vLCBpbm9kZSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB3cml0aW5nIGEgbmV3IGlub2RlLiAgSXQgbWFrZXMKKyAqIHN1cmUgdGhhdCBleHRyYSBwYXJ0IG9mIGxhcmdlIGlub2RlcyBpcyBpbml0aWFsaXplZCBwcm9wZXJseS4KKyAqLworZXJyY29kZV90IGV4dDJmc193cml0ZV9uZXdfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDJfaW5vZGUJKmJ1ZjsKKwlpbnQJCQlzaXplID0gRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcik7CisJc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UJKmxhcmdlX2lub2RlOworCisJaWYgKHNpemUgPT0gc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSkKKwkJcmV0dXJuIGV4dDJmc193cml0ZV9pbm9kZV9mdWxsKGZzLCBpbm8sIGlub2RlLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7CisKKwlidWYgPSB4bWFsbG9jKHNpemUpOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZSk7CisJKmJ1ZiA9ICppbm9kZTsKKworCWxhcmdlX2lub2RlID0gKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIGJ1ZjsKKwlsYXJnZV9pbm9kZS0+aV9leHRyYV9pc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSkgLQorCQlFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkU7CisKKwlyZXR1cm4gZXh0MmZzX3dyaXRlX2lub2RlX2Z1bGwoZnMsIGlubywgYnVmLCBzaXplKTsKK30KKworCitlcnJjb2RlX3QgZXh0MmZzX2dldF9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLCBibGtfdCAqYmxvY2tzKQoreworCXN0cnVjdCBleHQyX2lub2RlCWlub2RlOworCWludAkJCWk7CisJZXJyY29kZV90CQlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKGlubyA+IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpCisJCXJldHVybiBFWFQyX0VUX0JBRF9JTk9ERV9OVU07CisKKwlpZiAoZnMtPmdldF9ibG9ja3MpIHsKKwkJaWYgKCEoKmZzLT5nZXRfYmxvY2tzKShmcywgaW5vLCBibG9ja3MpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlmb3IgKGk9MDsgaSA8IEVYVDJfTl9CTE9DS1M7IGkrKykKKwkJYmxvY2tzW2ldID0gaW5vZGUuaV9ibG9ja1tpXTsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19jaGVja19kaXJlY3RvcnkoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vKQoreworCXN0cnVjdAlleHQyX2lub2RlCWlub2RlOworCWVycmNvZGVfdAkJcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmIChpbm8gPiBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KQorCQlyZXR1cm4gRVhUMl9FVF9CQURfSU5PREVfTlVNOworCisJaWYgKGZzLT5jaGVja19kaXJlY3RvcnkpIHsKKwkJcmV0dmFsID0gKGZzLT5jaGVja19kaXJlY3RvcnkpKGZzLCBpbm8pOworCQlpZiAocmV0dmFsICE9IEVYVDJfRVRfQ0FMTEJBQ0tfTk9USEFORExFRCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAoIUxJTlVYX1NfSVNESVIoaW5vZGUuaV9tb2RlKSkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fRElSRUNUT1JZOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lub2RlX2lvLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW5vZGVfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODYxZDVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lub2RlX2lvLmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlub2RlX2lvLmMgLS0tIFRoaXMgaXMgYWxsb3dzIGFuIGlub2RlIGluIGFuIGV4dDIgZmlsZXN5c3RlbSBpbWFnZQorICoJdG8gYmUgYWNjZXNzZWQgdmlhIHRoZSBJL08gbWFuYWdlciBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogRm9yIGNoZWNraW5nIHN0cnVjdHVyZSBtYWdpYyBudW1iZXJzLi4uCisgKi8KKworI2RlZmluZSBFWFQyX0NIRUNLX01BR0lDKHN0cnVjdCwgY29kZSkgXAorCSAgaWYgKChzdHJ1Y3QpLT5tYWdpYyAhPSAoY29kZSkpIHJldHVybiAoY29kZSkKKworc3RydWN0IGlub2RlX3ByaXZhdGVfZGF0YSB7CisJaW50CQkJCW1hZ2ljOworCWNoYXIJCQkJbmFtZVszMl07CisJZXh0Ml9maWxlX3QJCQlmaWxlOworCWV4dDJfZmlsc3lzCQkJZnM7CisJZXh0Ml9pbm9fdAkJCWlubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQkJaW5vZGU7CisJaW50CQkJCWZsYWdzOworCXN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEJKm5leHQ7Cit9OworCisjZGVmaW5lIENIQU5ORUxfSEFTX0lOT0RFCTB4ODAwMAorCitzdGF0aWMgc3RydWN0IGlub2RlX3ByaXZhdGVfZGF0YSAqdG9wX2ludGVybjsKK3N0YXRpYyBpbnQgaW5vX3VuaXF1ZSA9IDA7CisKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIGlvX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIGVycmNvZGVfdCBpbm9kZV9jbG9zZShpb19jaGFubmVsIGNoYW5uZWwpOworc3RhdGljIGVycmNvZGVfdCBpbm9kZV9zZXRfYmxrc2l6ZShpb19jaGFubmVsIGNoYW5uZWwsIGludCBibGtzaXplKTsKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfcmVhZF9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJICAgICAgIGludCBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgZXJyY29kZV90IGlub2RlX3dyaXRlX2Jsayhpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkJaW50IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfZmx1c2goaW9fY2hhbm5lbCBjaGFubmVsKTsKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfd3JpdGVfYnl0ZShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCWludCBzaXplLCBjb25zdCB2b2lkICpkYXRhKTsKKworc3RhdGljIHN0cnVjdCBzdHJ1Y3RfaW9fbWFuYWdlciBzdHJ1Y3RfaW5vZGVfbWFuYWdlciA9IHsKKwlFWFQyX0VUX01BR0lDX0lPX01BTkFHRVIsCisJIklub2RlIEkvTyBNYW5hZ2VyIiwKKwlpbm9kZV9vcGVuLAorCWlub2RlX2Nsb3NlLAorCWlub2RlX3NldF9ibGtzaXplLAorCWlub2RlX3JlYWRfYmxrLAorCWlub2RlX3dyaXRlX2JsaywKKwlpbm9kZV9mbHVzaCwKKwlpbm9kZV93cml0ZV9ieXRlCit9OworCitpb19tYW5hZ2VyIGlub2RlX2lvX21hbmFnZXIgPSAmc3RydWN0X2lub2RlX21hbmFnZXI7CisKK2VycmNvZGVfdCBleHQyZnNfaW5vZGVfaW9faW50ZXJuMihleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsCisJCQkJICBjaGFyICoqbmFtZSkKK3sKKwlzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhCSpkYXRhOworCWVycmNvZGVfdAkJCXJldHZhbDsKKworCWlmICgocmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEpLAorCQkJCSAgICAgJmRhdGEpKSkKKwkJcmV0dXJuIHJldHZhbDsKKwlkYXRhLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfSU5PREVfSU9fQ0hBTk5FTDsKKwlzcHJpbnRmKGRhdGEtPm5hbWUsICIldTolZCIsIGlubywgaW5vX3VuaXF1ZSsrKTsKKwlkYXRhLT5maWxlID0gMDsKKwlkYXRhLT5mcyA9IGZzOworCWRhdGEtPmlubyA9IGlubzsKKwlkYXRhLT5mbGFncyA9IDA7CisJaWYgKGlub2RlKSB7CisJCW1lbWNweSgmZGF0YS0+aW5vZGUsIGlub2RlLCBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpKTsKKwkJZGF0YS0+ZmxhZ3MgfD0gQ0hBTk5FTF9IQVNfSU5PREU7CisJfQorCWRhdGEtPm5leHQgPSB0b3BfaW50ZXJuOworCXRvcF9pbnRlcm4gPSBkYXRhOworCSpuYW1lID0gZGF0YS0+bmFtZTsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19pbm9kZV9pb19pbnRlcm4oZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSBjaGFyICoqbmFtZSkKK3sKKwlyZXR1cm4gZXh0MmZzX2lub2RlX2lvX2ludGVybjIoZnMsIGlubywgTlVMTCwgbmFtZSk7Cit9CisKKworc3RhdGljIGVycmNvZGVfdCBpbm9kZV9vcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywgaW9fY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlpb19jaGFubmVsCWlvID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICpwcmV2LCAqZGF0YSA9IE5VTEw7CisJZXJyY29kZV90CXJldHZhbDsKKwlpbnQJCW9wZW5fZmxhZ3M7CisKKwlpZiAobmFtZSA9PSAwKQorCQlyZXR1cm4gRVhUMl9FVF9CQURfREVWSUNFX05BTUU7CisKKwlmb3IgKGRhdGEgPSB0b3BfaW50ZXJuLCBwcmV2ID0gTlVMTDsgZGF0YTsKKwkgICAgIHByZXYgPSBkYXRhLCBkYXRhID0gZGF0YS0+bmV4dCkKKwkJaWYgKHN0cmNtcChuYW1lLCBkYXRhLT5uYW1lKSA9PSAwKQorCQkJYnJlYWs7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gRU5PRU5UOworCWlmIChwcmV2KQorCQlwcmV2LT5uZXh0ID0gZGF0YS0+bmV4dDsKKwllbHNlCisJCXRvcF9pbnRlcm4gPSBkYXRhLT5uZXh0OworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBzdHJ1Y3RfaW9fY2hhbm5lbCksICZpbyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCW1lbXNldChpbywgMCwgc2l6ZW9mKHN0cnVjdCBzdHJ1Y3RfaW9fY2hhbm5lbCkpOworCisJaW8tPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMOworCWlvLT5tYW5hZ2VyID0gaW5vZGVfaW9fbWFuYWdlcjsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzdHJsZW4obmFtZSkrMSwgJmlvLT5uYW1lKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlzdHJjcHkoaW8tPm5hbWUsIG5hbWUpOworCWlvLT5wcml2YXRlX2RhdGEgPSBkYXRhOworCWlvLT5ibG9ja19zaXplID0gMTAyNDsKKwlpby0+cmVhZF9lcnJvciA9IDA7CisJaW8tPndyaXRlX2Vycm9yID0gMDsKKwlpby0+cmVmY291bnQgPSAxOworCisJb3Blbl9mbGFncyA9IChmbGFncyAmIElPX0ZMQUdfUlcpID8gRVhUMl9GSUxFX1dSSVRFIDogMDsKKwlyZXR2YWwgPSBleHQyZnNfZmlsZV9vcGVuMihkYXRhLT5mcywgZGF0YS0+aW5vLAorCQkJCSAgIChkYXRhLT5mbGFncyAmIENIQU5ORUxfSEFTX0lOT0RFKSA/CisJCQkJICAgJmRhdGEtPmlub2RlIDogMCwgb3Blbl9mbGFncywKKwkJCQkgICAmZGF0YS0+ZmlsZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJKmNoYW5uZWwgPSBpbzsKKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwlpZiAoZGF0YSkgeworCQlleHQyZnNfZnJlZV9tZW0oJmRhdGEpOworCX0KKwlpZiAoaW8pCisJCWV4dDJmc19mcmVlX21lbSgmaW8pOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfY2xvc2UoaW9fY2hhbm5lbCBjaGFubmVsKQoreworCXN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfSU5PREVfSU9fQ0hBTk5FTCk7CisKKwlpZiAoLS1jaGFubmVsLT5yZWZjb3VudCA+IDApCisJCXJldHVybiAwOworCisJcmV0dmFsID0gZXh0MmZzX2ZpbGVfY2xvc2UoZGF0YS0+ZmlsZSk7CisKKwlleHQyZnNfZnJlZV9tZW0oJmNoYW5uZWwtPnByaXZhdGVfZGF0YSk7CisJaWYgKGNoYW5uZWwtPm5hbWUpCisJCWV4dDJmc19mcmVlX21lbSgmY2hhbm5lbC0+bmFtZSk7CisJZXh0MmZzX2ZyZWVfbWVtKCZjaGFubmVsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZXJyY29kZV90IGlub2RlX3NldF9ibGtzaXplKGlvX2NoYW5uZWwgY2hhbm5lbCwgaW50IGJsa3NpemUpCit7CisJc3RydWN0IGlub2RlX3ByaXZhdGVfZGF0YSAqZGF0YTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19JTk9ERV9JT19DSEFOTkVMKTsKKworCWNoYW5uZWwtPmJsb2NrX3NpemUgPSBibGtzaXplOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfcmVhZF9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJICAgICAgIGludCBjb3VudCwgdm9pZCAqYnVmKQoreworCXN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19JTk9ERV9JT19DSEFOTkVMKTsKKworCWlmICgocmV0dmFsID0gZXh0MmZzX2ZpbGVfbHNlZWsoZGF0YS0+ZmlsZSwKKwkJCQkJYmxvY2sgKiBjaGFubmVsLT5ibG9ja19zaXplLAorCQkJCQlFWFQyX1NFRUtfU0VULCAwKSkpCisJCXJldHVybiByZXR2YWw7CisKKwljb3VudCA9IChjb3VudCA8IDApID8gLWNvdW50IDogKGNvdW50ICogY2hhbm5lbC0+YmxvY2tfc2l6ZSk7CisKKwlyZXR1cm4gZXh0MmZzX2ZpbGVfcmVhZChkYXRhLT5maWxlLCBidWYsIGNvdW50LCAwKTsKK30KKworc3RhdGljIGVycmNvZGVfdCBpbm9kZV93cml0ZV9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJCWludCBjb3VudCwgY29uc3Qgdm9pZCAqYnVmKQoreworCXN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19JTk9ERV9JT19DSEFOTkVMKTsKKworCWlmICgocmV0dmFsID0gZXh0MmZzX2ZpbGVfbHNlZWsoZGF0YS0+ZmlsZSwKKwkJCQkJYmxvY2sgKiBjaGFubmVsLT5ibG9ja19zaXplLAorCQkJCQlFWFQyX1NFRUtfU0VULCAwKSkpCisJCXJldHVybiByZXR2YWw7CisKKwljb3VudCA9IChjb3VudCA8IDApID8gLWNvdW50IDogKGNvdW50ICogY2hhbm5lbC0+YmxvY2tfc2l6ZSk7CisKKwlyZXR1cm4gZXh0MmZzX2ZpbGVfd3JpdGUoZGF0YS0+ZmlsZSwgYnVmLCBjb3VudCwgMCk7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfd3JpdGVfYnl0ZShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSBpbnQgc2l6ZSwgY29uc3Qgdm9pZCAqYnVmKQoreworCXN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfSU5PREVfSU9fQ0hBTk5FTCk7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19maWxlX2xzZWVrKGRhdGEtPmZpbGUsIG9mZnNldCwKKwkJCQkJRVhUMl9TRUVLX1NFVCwgMCkpKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIGV4dDJmc19maWxlX3dyaXRlKGRhdGEtPmZpbGUsIGJ1Ziwgc2l6ZSwgMCk7Cit9CisKKy8qCisgKiBGbHVzaCBkYXRhIGJ1ZmZlcnMgdG8gZGlzay4KKyAqLworc3RhdGljIGVycmNvZGVfdCBpbm9kZV9mbHVzaChpb19jaGFubmVsIGNoYW5uZWwpCit7CisJc3RydWN0IGlub2RlX3ByaXZhdGVfZGF0YSAqZGF0YTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19JTk9ERV9JT19DSEFOTkVMKTsKKworCXJldHVybiBleHQyZnNfZmlsZV9mbHVzaChkYXRhLT5maWxlKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pb19tYW5hZ2VyLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW9fbWFuYWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzAzODYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW9fbWFuYWdlci5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlvX21hbmFnZXIuYyAtLS0gdGhlIEkvTyBtYW5hZ2VyIGFic3RyYWN0aW9uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitlcnJjb2RlX3QgaW9fY2hhbm5lbF9zZXRfb3B0aW9ucyhpb19jaGFubmVsIGNoYW5uZWwsIGNvbnN0IGNoYXIgKm9wdHMpCit7CisJZXJyY29kZV90IHJldHZhbCA9IDA7CisJY2hhciAqbmV4dCwgKnB0ciwgKm9wdGlvbnMsICphcmc7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisKKwlpZiAoIW9wdHMpCisJCXJldHVybiAwOworCisJaWYgKCFjaGFubmVsLT5tYW5hZ2VyLT5zZXRfb3B0aW9uKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJb3B0aW9ucyA9IG1hbGxvYyhzdHJsZW4ob3B0cykrMSk7CisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gRVhUMl9FVF9OT19NRU1PUlk7CisJc3RyY3B5KG9wdGlvbnMsIG9wdHMpOworCXB0ciA9IG9wdGlvbnM7CisKKwl3aGlsZSAocHRyICYmICpwdHIpIHsKKwkJbmV4dCA9IHN0cmNocihwdHIsICcmJyk7CisJCWlmIChuZXh0KQorCQkJKm5leHQrKyA9IDA7CisKKwkJYXJnID0gc3RyY2hyKHB0ciwgJz0nKTsKKwkJaWYgKGFyZykKKwkJCSphcmcrKyA9IDA7CisKKwkJcmV0dmFsID0gKGNoYW5uZWwtPm1hbmFnZXItPnNldF9vcHRpb24pKGNoYW5uZWwsIHB0ciwgYXJnKTsKKwkJaWYgKHJldHZhbCkKKwkJCWJyZWFrOworCQlwdHIgPSBuZXh0OworCX0KKwlmcmVlKG9wdGlvbnMpOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBpb19jaGFubmVsX3dyaXRlX2J5dGUoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQlpbnQgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCisJaWYgKGNoYW5uZWwtPm1hbmFnZXItPndyaXRlX2J5dGUpCisJCXJldHVybiBjaGFubmVsLT5tYW5hZ2VyLT53cml0ZV9ieXRlKGNoYW5uZWwsIG9mZnNldCwKKwkJCQkJCSAgICBjb3VudCwgZGF0YSk7CisKKwlyZXR1cm4gRVhUMl9FVF9VTklNUExFTUVOVEVEOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lyZWwuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pcmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkMWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pcmVsLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlyZWwuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlIHsKKwlibGtfdAlibG9jazsKKwlfX3UxNiBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSB7CisJZXh0Ml9pbm9fdAluZXc7CisJZXh0Ml9pbm9fdAlvcmlnOworCV9fdTE2CQlmbGFnczsKKwlfX3UxNgkJbWF4X3JlZnM7Cit9OworCit0eXBlZGVmIHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRpb25fdGFibGUgKmV4dDJfaXJlbDsKKworc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGlvbl90YWJsZSB7CisJX191MzIJbWFnaWM7CisJY2hhcgkqbmFtZTsKKwlleHQyX2lub190CWN1cnJlbnQ7CisJdm9pZAkqcHJpdl9kYXRhOworCisJLyoKKwkgKiBBZGQgYW4gaW5vZGUgcmVsb2NhdGlvbiBlbnRyeS4KKwkgKi8KKwllcnJjb2RlX3QgKCpwdXQpKGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9sZCwKKwkJCSAgICAgIHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQpOworCS8qCisJICogR2V0IGFuIGlub2RlIHJlbG9jYXRpb24gZW50cnkuCisJICovCisJZXJyY29kZV90ICgqZ2V0KShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvbGQsCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KTsKKworCS8qCisJICogR2V0IGFuIGlub2RlIHJlbG9jYXRpb24gZW50cnkgYnkgaXRzIG9yaWdpbmFsIGlub2RlIG51bWJlcgorCSAqLworCWVycmNvZGVfdCAoKmdldF9ieV9vcmlnKShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvcmlnLCBleHQyX2lub190ICpvbGQsCisJCQkJIHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQpOworCisJLyoKKwkgKiBJbml0aWFsaXplIGZvciBpdGVyYXRpbmcgb3ZlciB0aGUgaW5vZGUgcmVsb2NhdGlvbiBlbnRyaWVzLgorCSAqLworCWVycmNvZGVfdCAoKnN0YXJ0X2l0ZXIpKGV4dDJfaXJlbCBpcmVsKTsKKworCS8qCisJICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGZvciB0aGUgaW5vZGUgcmVsb2NhdGlvbiBlbnRyaWVzLgorCSAqIFJldHVybnMgYW4gaW5vZGUgbnVtYmVyIG9mIDAgd2hlbiBvdXQgb2YgZW50cmllcy4KKwkgKi8KKwllcnJjb2RlX3QgKCpuZXh0KShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCAqb2xkLAorCQkJICBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KTsKKworCS8qCisJICogQWRkIGFuIGlub2RlIHJlZmVyZW5jZSAoaS5lLiwgbm90ZSB0aGUgZmFjdCB0aGF0IGEKKwkgKiBwYXJ0aWN1bGFyIGJsb2NrL29mZnNldCBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhbiBpbm9kZSkKKwkgKi8KKwllcnJjb2RlX3QgKCphZGRfcmVmKShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgIHN0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSAqcmVmKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBmb3IgaXRlcmF0aW5nIG92ZXIgdGhlIGlub2RlIHJlZmVyZW5jZXMgZm9yIGEKKwkgKiBwYXJ0aWN1bGFyIGlub2RlLgorCSAqLworCWVycmNvZGVfdCAoKnN0YXJ0X2l0ZXJfcmVmKShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBpbm8pOworCisJLyoKKwkgKiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24gZm9yIHRoZSBpbm9kZSByZWZlcmVuY2VzIGZvciBhbgorCSAqIGlub2RlLiAgVGhlIHJlZmVyZW5jZXMgZm9yIG9ubHkgb25lIGlub2RlIGNhbiBiZSBpbnRlcmF0b3IKKwkgKiBvdmVyIGF0IGEgdGltZSwgYXMgdGhlIGl0ZXJhdG9yIHN0YXRlIGlzIHN0b3JlZCBpbiBleHQyX2lyZWwuCisJICovCisJZXJyY29kZV90ICgqbmV4dF9yZWYpKGV4dDJfaXJlbCBpcmVsLAorCQkJICAgICAgc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlICpyZWYpOworCisJLyoKKwkgKiBNb3ZlIHRoZSBpbm9kZSByZWxvY2F0aW9uIHRhYmxlIGZyb20gb25lIGlub2RlIG51bWJlciB0bworCSAqIGFub3RoZXIuICBOb3RlIHRoYXQgdGhlIGlub2RlIHJlZmVyZW5jZXMgYWxzbyBtdXN0IG1vdmUuCisJICovCisJZXJyY29kZV90ICgqbW92ZSkoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb2xkLCBleHQyX2lub190IG5ldyk7CisKKwkvKgorCSAqIFJlbW92ZSBhbiBpbm9kZSByZWxvY2F0aW9uIGVudHJ5LCBhbG9uZyB3aXRoIGFsbCBvZiB0aGUKKwkgKiBpbm9kZSByZWZlcmVuY2VzLgorCSAqLworCWVycmNvZGVfdCAoKmRlbGV0ZSkoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb2xkKTsKKworCS8qCisJICogRnJlZSB0aGUgaW5vZGUgcmVsb2NhdGlvbiB0YWJsZS4KKwkgKi8KKwllcnJjb2RlX3QgKCpmcmVlKShleHQyX2lyZWwgaXJlbCk7Cit9OworCitlcnJjb2RlX3QgZXh0MmZzX2lyZWxfbWVtYXJyYXlfY3JlYXRlKGNoYXIgKm5hbWUsIGV4dDJfaW5vX3QgbWF4X2lub2RlLAorCQkJCSAgICBleHQyX2lyZWwgKmlyZWwpOworCisjZGVmaW5lIGV4dDJmc19pcmVsX3B1dChpcmVsLCBvbGQsIGVudCkgKChpcmVsKS0+cHV0KChpcmVsKSwgb2xkLCBlbnQpKQorI2RlZmluZSBleHQyZnNfaXJlbF9nZXQoaXJlbCwgb2xkLCBlbnQpICgoaXJlbCktPmdldCgoaXJlbCksIG9sZCwgZW50KSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfZ2V0X2J5X29yaWcoaXJlbCwgb3JpZywgb2xkLCBlbnQpIFwKKwkJCSgoaXJlbCktPmdldF9ieV9vcmlnKChpcmVsKSwgb3JpZywgb2xkLCBlbnQpKQorI2RlZmluZSBleHQyZnNfaXJlbF9zdGFydF9pdGVyKGlyZWwpICgoaXJlbCktPnN0YXJ0X2l0ZXIoKGlyZWwpKSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfbmV4dChpcmVsLCBvbGQsIGVudCkgKChpcmVsKS0+bmV4dCgoaXJlbCksIG9sZCwgZW50KSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfYWRkX3JlZihpcmVsLCBpbm8sIHJlZikgKChpcmVsKS0+YWRkX3JlZigoaXJlbCksIGlubywgcmVmKSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfc3RhcnRfaXRlcl9yZWYoaXJlbCwgaW5vKSAoKGlyZWwpLT5zdGFydF9pdGVyX3JlZigoaXJlbCksIGlubykpCisjZGVmaW5lIGV4dDJmc19pcmVsX25leHRfcmVmKGlyZWwsIHJlZikgKChpcmVsKS0+bmV4dF9yZWYoKGlyZWwpLCByZWYpKQorI2RlZmluZSBleHQyZnNfaXJlbF9tb3ZlKGlyZWwsIG9sZCwgbmV3KSAoKGlyZWwpLT5tb3ZlKChpcmVsKSwgb2xkLCBuZXcpKQorI2RlZmluZSBleHQyZnNfaXJlbF9kZWxldGUoaXJlbCwgb2xkKSAoKGlyZWwpLT5kZWxldGUoKGlyZWwpLCBvbGQpKQorI2RlZmluZSBleHQyZnNfaXJlbF9mcmVlKGlyZWwpICgoaXJlbCktPmZyZWUoKGlyZWwpKSkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pcmVsX21hLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaXJlbF9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NzFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaXJlbF9tYS5jCkBAIC0wLDAgKzEsMzY3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpcmVsX21hLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorI2luY2x1ZGUgImlyZWwuaCIKKworc3RhdGljIGVycmNvZGVfdCBpbWFfcHV0KGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9sZCwKKwkJCSBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KTsKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX2dldChleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvbGQsCisJCQkgc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkgKmVudCk7CitzdGF0aWMgZXJyY29kZV90IGltYV9nZXRfYnlfb3JpZyhleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvcmlnLCBleHQyX2lub190ICpvbGQsCisJCQkJIHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQpOworc3RhdGljIGVycmNvZGVfdCBpbWFfc3RhcnRfaXRlcihleHQyX2lyZWwgaXJlbCk7CitzdGF0aWMgZXJyY29kZV90IGltYV9uZXh0KGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190ICpvbGQsCisJCQkgIHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQpOworc3RhdGljIGVycmNvZGVfdCBpbWFfYWRkX3JlZihleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgIHN0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSAqcmVmKTsKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX3N0YXJ0X2l0ZXJfcmVmKGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IGlubyk7CitzdGF0aWMgZXJyY29kZV90IGltYV9uZXh0X3JlZihleHQyX2lyZWwgaXJlbCwgc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlICpyZWYpOworc3RhdGljIGVycmNvZGVfdCBpbWFfbW92ZShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvbGQsIGV4dDJfaW5vX3QgbmV3KTsKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX2RlbGV0ZShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvbGQpOworc3RhdGljIGVycmNvZGVfdCBpbWFfZnJlZShleHQyX2lyZWwgaXJlbCk7CisKKy8qCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIHN0b3JlcyB0aGUgYXJyYXkgb2YgaW5vZGUgcmVmZXJlbmNlczsgdGhlcmUgaXMKKyAqIGEgc3RydWN0dXJlIGZvciBlYWNoIGlub2RlLgorICovCitzdHJ1Y3QgaW5vZGVfcmVmZXJlbmNlX2VudHJ5IHsKKwlfX3UxNiBudW07CisJc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlICpyZWZzOworfTsKKworc3RydWN0IGlyZWxfbWEgeworCV9fdTMyIG1hZ2ljOworCWV4dDJfaW5vX3QgbWF4X2lub2RlOworCWV4dDJfaW5vX3QgcmVmX2N1cnJlbnQ7CisJaW50ICAgcmVmX2l0ZXI7CisJZXh0Ml9pbm9fdAkqb3JpZ19tYXA7CisJc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkgKmVudHJpZXM7CisJc3RydWN0IGlub2RlX3JlZmVyZW5jZV9lbnRyeSAqcmVmX2VudHJpZXM7Cit9OworCitlcnJjb2RlX3QgZXh0MmZzX2lyZWxfbWVtYXJyYXlfY3JlYXRlKGNoYXIgKm5hbWUsIGV4dDJfaW5vX3QgbWF4X2lub2RlLAorCQkJCSAgICAgIGV4dDJfaXJlbCAqbmV3X2lyZWwpCit7CisJZXh0Ml9pcmVsCQlpcmVsID0gMDsKKwllcnJjb2RlX3QJcmV0dmFsOworCXN0cnVjdCBpcmVsX21hCSptYSA9IDA7CisJc2l6ZV90CQlzaXplOworCisJKm5ld19pcmVsID0gMDsKKworCS8qCisJICogQWxsb2NhdGUgbWVtb3J5IHN0cnVjdHVyZXMKKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGlvbl90YWJsZSksCisJCQkJJmlyZWwpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChpcmVsLCAwLCBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGlvbl90YWJsZSkpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKG5hbWUpKzEsICZpcmVsLT5uYW1lKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwlzdHJjcHkoaXJlbC0+bmFtZSwgbmFtZSk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGlyZWxfbWEpLCAmbWEpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChtYSwgMCwgc2l6ZW9mKHN0cnVjdCBpcmVsX21hKSk7CisJaXJlbC0+cHJpdl9kYXRhID0gbWE7CisKKwlzaXplID0gKHNpemVfdCkgKHNpemVvZihleHQyX2lub190KSAqIChtYXhfaW5vZGUrMSkpOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemUsICZtYS0+b3JpZ19tYXApOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChtYS0+b3JpZ19tYXAsIDAsIHNpemUpOworCisJc2l6ZSA9IChzaXplX3QpIChzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkpICoKKwkJCSAobWF4X2lub2RlKzEpKTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplLCAmbWEtPmVudHJpZXMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChtYS0+ZW50cmllcywgMCwgc2l6ZSk7CisKKwlzaXplID0gKHNpemVfdCkgKHNpemVvZihzdHJ1Y3QgaW5vZGVfcmVmZXJlbmNlX2VudHJ5KSAqCisJCQkgKG1heF9pbm9kZSsxKSk7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZSwgJm1hLT5yZWZfZW50cmllcyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJbWVtc2V0KG1hLT5yZWZfZW50cmllcywgMCwgc2l6ZSk7CisJbWEtPm1heF9pbm9kZSA9IG1heF9pbm9kZTsKKworCS8qCisJICogRmlsbCBpbiB0aGUgaXJlbCBkYXRhIHN0cnVjdHVyZQorCSAqLworCWlyZWwtPnB1dCA9IGltYV9wdXQ7CisJaXJlbC0+Z2V0ID0gaW1hX2dldDsKKwlpcmVsLT5nZXRfYnlfb3JpZyA9IGltYV9nZXRfYnlfb3JpZzsKKwlpcmVsLT5zdGFydF9pdGVyID0gaW1hX3N0YXJ0X2l0ZXI7CisJaXJlbC0+bmV4dCA9IGltYV9uZXh0OworCWlyZWwtPmFkZF9yZWYgPSBpbWFfYWRkX3JlZjsKKwlpcmVsLT5zdGFydF9pdGVyX3JlZiA9IGltYV9zdGFydF9pdGVyX3JlZjsKKwlpcmVsLT5uZXh0X3JlZiA9IGltYV9uZXh0X3JlZjsKKwlpcmVsLT5tb3ZlID0gaW1hX21vdmU7CisJaXJlbC0+ZGVsZXRlID0gaW1hX2RlbGV0ZTsKKwlpcmVsLT5mcmVlID0gaW1hX2ZyZWU7CisKKwkqbmV3X2lyZWwgPSBpcmVsOworCXJldHVybiAwOworCitlcnJvdXQ6CisJaW1hX2ZyZWUoaXJlbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCBpbWFfcHV0KGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9sZCwKKwkJCXN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQpCit7CisJc3RydWN0IGlub2RlX3JlZmVyZW5jZV9lbnRyeQkqcmVmX2VudDsKKwlzdHJ1Y3QgaXJlbF9tYQkJCSptYTsKKwllcnJjb2RlX3QJCQlyZXR2YWw7CisJc2l6ZV90CQkJCXNpemUsIG9sZF9zaXplOworCisJbWEgPSBpcmVsLT5wcml2X2RhdGE7CisJaWYgKG9sZCA+IG1hLT5tYXhfaW5vZGUpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwkvKgorCSAqIEZvcmNlIHRoZSBvcmlnIGZpZWxkIHRvIHRoZSBjb3JyZWN0IHZhbHVlOyB0aGUgYXBwbGljYXRpb24KKwkgKiBwcm9ncmFtIHNob3VsZG4ndCBiZSBtZXNzaW5nIHdpdGggdGhpcyBmaWVsZC4KKwkgKi8KKwlpZiAobWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm5ldyA9PSAwKQorCQllbnQtPm9yaWcgPSBvbGQ7CisJZWxzZQorCQllbnQtPm9yaWcgPSBtYS0+ZW50cmllc1sodW5zaWduZWQpIG9sZF0ub3JpZzsKKworCS8qCisJICogSWYgbWF4X3JlZnMgaGFzIGNoYW5nZWQsIHJlYWxsb2NhdGUgdGhlIHJlZnMgYXJyYXkKKwkgKi8KKwlyZWZfZW50ID0gbWEtPnJlZl9lbnRyaWVzICsgKHVuc2lnbmVkKSBvbGQ7CisJaWYgKHJlZl9lbnQtPnJlZnMgJiYgZW50LT5tYXhfcmVmcyAhPQorCSAgICBtYS0+ZW50cmllc1sodW5zaWduZWQpIG9sZF0ubWF4X3JlZnMpIHsKKwkJc2l6ZSA9IChzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlKSAqIGVudC0+bWF4X3JlZnMpOworCQlvbGRfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlKSAqCisJCQkgICAgbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm1heF9yZWZzKTsKKwkJcmV0dmFsID0gZXh0MmZzX3Jlc2l6ZV9tZW0ob2xkX3NpemUsIHNpemUsICZyZWZfZW50LT5yZWZzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdID0gKmVudDsKKwltYS0+b3JpZ19tYXBbKHVuc2lnbmVkKSBlbnQtPm9yaWddID0gb2xkOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGltYV9nZXQoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb2xkLAorCQkJc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkgKmVudCkKK3sKKwlzdHJ1Y3QgaXJlbF9tYQkqbWE7CisKKwltYSA9IGlyZWwtPnByaXZfZGF0YTsKKwlpZiAob2xkID4gbWEtPm1heF9pbm9kZSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwlpZiAobWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm5ldyA9PSAwKQorCQlyZXR1cm4gRU5PRU5UOworCSplbnQgPSBtYS0+ZW50cmllc1sodW5zaWduZWQpIG9sZF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX2dldF9ieV9vcmlnKGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9yaWcsIGV4dDJfaW5vX3QgKm9sZCwKKwkJCXN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQpCit7CisJc3RydWN0IGlyZWxfbWEJKm1hOworCWV4dDJfaW5vX3QJaW5vOworCisJbWEgPSBpcmVsLT5wcml2X2RhdGE7CisJaWYgKG9yaWcgPiBtYS0+bWF4X2lub2RlKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCWlubyA9IG1hLT5vcmlnX21hcFsodW5zaWduZWQpIG9yaWddOworCWlmIChpbm8gPT0gMCkKKwkJcmV0dXJuIEVOT0VOVDsKKwkqb2xkID0gaW5vOworCSplbnQgPSBtYS0+ZW50cmllc1sodW5zaWduZWQpIGlub107CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX3N0YXJ0X2l0ZXIoZXh0Ml9pcmVsIGlyZWwpCit7CisJaXJlbC0+Y3VycmVudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX25leHQoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3QgKm9sZCwKKwkJCSBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KQoreworCXN0cnVjdCBpcmVsX21hCSptYTsKKworCW1hID0gaXJlbC0+cHJpdl9kYXRhOworCXdoaWxlICgrK2lyZWwtPmN1cnJlbnQgPCBtYS0+bWF4X2lub2RlKSB7CisJCWlmIChtYS0+ZW50cmllc1sodW5zaWduZWQpIGlyZWwtPmN1cnJlbnRdLm5ldyA9PSAwKQorCQkJY29udGludWU7CisJCSpvbGQgPSBpcmVsLT5jdXJyZW50OworCQkqZW50ID0gbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBpcmVsLT5jdXJyZW50XTsKKwkJcmV0dXJuIDA7CisJfQorCSpvbGQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGltYV9hZGRfcmVmKGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IGlubywKKwkJCSAgICAgc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlICpyZWYpCit7CisJc3RydWN0IGlyZWxfbWEJKm1hOworCXNpemVfdAkJc2l6ZTsKKwlzdHJ1Y3QgaW5vZGVfcmVmZXJlbmNlX2VudHJ5ICpyZWZfZW50OworCXN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQ7CisJZXJyY29kZV90CQlyZXR2YWw7CisKKwltYSA9IGlyZWwtPnByaXZfZGF0YTsKKwlpZiAoaW5vID4gbWEtPm1heF9pbm9kZSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCXJlZl9lbnQgPSBtYS0+cmVmX2VudHJpZXMgKyAodW5zaWduZWQpIGlubzsKKwllbnQgPSBtYS0+ZW50cmllcyArICh1bnNpZ25lZCkgaW5vOworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgcmVmZXJlbmNlIGFycmF5IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdC4KKwkgKi8KKwlpZiAocmVmX2VudC0+cmVmcyA9PSAwKSB7CisJCXNpemUgPSAoc2l6ZV90KSAoKHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWZlcmVuY2UpICoKKwkJCQkgIGVudC0+bWF4X3JlZnMpKTsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZSwgJnJlZl9lbnQtPnJlZnMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJbWVtc2V0KHJlZl9lbnQtPnJlZnMsIDAsIHNpemUpOworCQlyZWZfZW50LT5udW0gPSAwOworCX0KKworCWlmIChyZWZfZW50LT5udW0gPj0gZW50LT5tYXhfcmVmcykKKwkJcmV0dXJuIEVYVDJfRVRfVE9PX01BTllfUkVGUzsKKworCXJlZl9lbnQtPnJlZnNbKHVuc2lnbmVkKSByZWZfZW50LT5udW0rK10gPSAqcmVmOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGltYV9zdGFydF9pdGVyX3JlZihleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBpbm8pCit7CisJc3RydWN0IGlyZWxfbWEJKm1hOworCisJbWEgPSBpcmVsLT5wcml2X2RhdGE7CisJaWYgKGlubyA+IG1hLT5tYXhfaW5vZGUpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJaWYgKG1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgaW5vXS5uZXcgPT0gMCkKKwkJcmV0dXJuIEVOT0VOVDsKKwltYS0+cmVmX2N1cnJlbnQgPSBpbm87CisJbWEtPnJlZl9pdGVyID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBpbWFfbmV4dF9yZWYoZXh0Ml9pcmVsIGlyZWwsCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWZlcmVuY2UgKnJlZikKK3sKKwlzdHJ1Y3QgaXJlbF9tYQkqbWE7CisJc3RydWN0IGlub2RlX3JlZmVyZW5jZV9lbnRyeSAqcmVmX2VudDsKKworCW1hID0gaXJlbC0+cHJpdl9kYXRhOworCisJcmVmX2VudCA9IG1hLT5yZWZfZW50cmllcyArIG1hLT5yZWZfY3VycmVudDsKKworCWlmICgocmVmX2VudC0+cmVmcyA9PSBOVUxMKSB8fAorCSAgICAobWEtPnJlZl9pdGVyID49IHJlZl9lbnQtPm51bSkpIHsKKwkJcmVmLT5ibG9jayA9IDA7CisJCXJlZi0+b2Zmc2V0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCSpyZWYgPSByZWZfZW50LT5yZWZzW21hLT5yZWZfaXRlcisrXTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgZXJyY29kZV90IGltYV9tb3ZlKGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9sZCwgZXh0Ml9pbm9fdCBuZXcpCit7CisJc3RydWN0IGlyZWxfbWEJKm1hOworCisJbWEgPSBpcmVsLT5wcml2X2RhdGE7CisJaWYgKChvbGQgPiBtYS0+bWF4X2lub2RlKSB8fCAobmV3ID4gbWEtPm1heF9pbm9kZSkpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJaWYgKG1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXS5uZXcgPT0gMCkKKwkJcmV0dXJuIEVOT0VOVDsKKworCW1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgbmV3XSA9IG1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXTsKKwlleHQyZnNfZnJlZV9tZW0oJm1hLT5yZWZfZW50cmllc1sodW5zaWduZWQpIG5ld10ucmVmcyk7CisJbWEtPnJlZl9lbnRyaWVzWyh1bnNpZ25lZCkgbmV3XSA9IG1hLT5yZWZfZW50cmllc1sodW5zaWduZWQpIG9sZF07CisKKwltYS0+ZW50cmllc1sodW5zaWduZWQpIG9sZF0ubmV3ID0gMDsKKwltYS0+cmVmX2VudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm51bSA9IDA7CisJbWEtPnJlZl9lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXS5yZWZzID0gMDsKKworCW1hLT5vcmlnX21hcFttYS0+ZW50cmllc1tuZXddLm9yaWddID0gbmV3OworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGltYV9kZWxldGUoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb2xkKQoreworCXN0cnVjdCBpcmVsX21hCSptYTsKKworCW1hID0gaXJlbC0+cHJpdl9kYXRhOworCWlmIChvbGQgPiBtYS0+bWF4X2lub2RlKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCWlmIChtYS0+ZW50cmllc1sodW5zaWduZWQpIG9sZF0ubmV3ID09IDApCisJCXJldHVybiBFTk9FTlQ7CisKKwltYS0+ZW50cmllc1tvbGRdLm5ldyA9IDA7CisJZXh0MmZzX2ZyZWVfbWVtKCZtYS0+cmVmX2VudHJpZXNbKHVuc2lnbmVkKSBvbGRdLnJlZnMpOworCW1hLT5vcmlnX21hcFttYS0+ZW50cmllc1sodW5zaWduZWQpIG9sZF0ub3JpZ10gPSAwOworCisJbWEtPnJlZl9lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXS5udW0gPSAwOworCW1hLT5yZWZfZW50cmllc1sodW5zaWduZWQpIG9sZF0ucmVmcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX2ZyZWUoZXh0Ml9pcmVsIGlyZWwpCit7CisJc3RydWN0IGlyZWxfbWEJKm1hOworCWV4dDJfaW5vX3QJaW5vOworCisJaWYgKCFpcmVsKQorCQlyZXR1cm4gMDsKKworCW1hID0gaXJlbC0+cHJpdl9kYXRhOworCisJaWYgKG1hKSB7CisJCWV4dDJmc19mcmVlX21lbSgmbWEtPm9yaWdfbWFwKTsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZtYS0+ZW50cmllcyk7CisJCWlmIChtYS0+cmVmX2VudHJpZXMpIHsKKwkJCWZvciAoaW5vID0gMDsgaW5vIDw9IG1hLT5tYXhfaW5vZGU7IGlubysrKSB7CisJCQkJZXh0MmZzX2ZyZWVfbWVtKCZtYS0+cmVmX2VudHJpZXNbKHVuc2lnbmVkKSBpbm9dLnJlZnMpOworCQkJfQorCQkJZXh0MmZzX2ZyZWVfbWVtKCZtYS0+cmVmX2VudHJpZXMpOworCQl9CisJCWV4dDJmc19mcmVlX21lbSgmbWEpOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJmlyZWwtPm5hbWUpOworCWV4dDJmc19mcmVlX21lbSgmaXJlbCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaXNtb3VudGVkLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaXNtb3VudGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmNmYzMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pc21vdW50ZWQuYwpAQCAtMCwwICsxLDM1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaXNtb3VudGVkLmMgLS0tIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZXN5c3RlbSB3YXMgbW91bnRlZAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCwxOTk5LDIwMDAgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfTElOVVhfRkRfSAorI2luY2x1ZGUgPGxpbnV4L2ZkLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX01OVEVOVF9ICisjaW5jbHVkZSA8bW50ZW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0dFVE1OVElORk8KKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2VuZGlmIC8qIEhBVkVfR0VUTU5USU5GTyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKyNpZmRlZiBIQVZFX01OVEVOVF9ICisvKgorICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNoZWNrcyBhIGZpbGUgaW4gL2V0Yy9tdGFiIGZvcm1hdCB0byBzZWUgaWYgYQorICogZmlsZXN5c3RlbSBpcyBtb3VudGVkLiAgUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0CisgKiBvciBjYW4ndCBiZSBvcGVuZWQuCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgY2hlY2tfbW50ZW50X2ZpbGUoY29uc3QgY2hhciAqbXRhYl9maWxlLCBjb25zdCBjaGFyICpmaWxlLAorCQkJCSAgIGludCAqbW91bnRfZmxhZ3MsIGNoYXIgKm10cHQsIGludCBtdGxlbikKK3sKKwlzdHJ1Y3QgbW50ZW50CSptbnQ7CisJc3RydWN0IHN0YXQJc3RfYnVmOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCWRldl90CQlmaWxlX2Rldj0wLCBmaWxlX3JkZXY9MDsKKwlpbm9fdAkJZmlsZV9pbm89MDsKKwlGSUxFCQkqZjsKKwlpbnQJCWZkOworCisJKm1vdW50X2ZsYWdzID0gMDsKKwlpZiAoKGYgPSBzZXRtbnRlbnQgKG10YWJfZmlsZSwgInIiKSkgPT0gTlVMTCkKKwkJcmV0dXJuIGVycm5vOworCWlmIChzdGF0KGZpbGUsICZzdF9idWYpID09IDApIHsKKwkJaWYgKFNfSVNCTEsoc3RfYnVmLnN0X21vZGUpKSB7CisjaWZuZGVmIF9fR05VX18gLyogVGhlIEdOVSBodXJkIGlzIGJyb2tlbiB3aXRoIHJlc3BlY3QgdG8gc3RhdCBkZXZpY2VzICovCisJCQlmaWxlX3JkZXYgPSBzdF9idWYuc3RfcmRldjsKKyNlbmRpZiAgLyogX19HTlVfXyAqLworCQl9IGVsc2UgeworCQkJZmlsZV9kZXYgPSBzdF9idWYuc3RfZGV2OworCQkJZmlsZV9pbm8gPSBzdF9idWYuc3RfaW5vOworCQl9CisJfQorCXdoaWxlICgobW50ID0gZ2V0bW50ZW50IChmKSkgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKGZpbGUsIG1udC0+bW50X2ZzbmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoc3RhdChtbnQtPm1udF9mc25hbWUsICZzdF9idWYpID09IDApIHsKKwkJCWlmIChTX0lTQkxLKHN0X2J1Zi5zdF9tb2RlKSkgeworI2lmbmRlZiBfX0dOVV9fCisJCQkJaWYgKGZpbGVfcmRldiAmJiAoZmlsZV9yZGV2ID09IHN0X2J1Zi5zdF9yZGV2KSkKKwkJCQkJYnJlYWs7CisjZW5kaWYgIC8qIF9fR05VX18gKi8KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZpbGVfZGV2ICYmICgoZmlsZV9kZXYgPT0gc3RfYnVmLnN0X2RldikgJiYKKwkJCQkJCSAoZmlsZV9pbm8gPT0gc3RfYnVmLnN0X2lubykpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChtbnQgPT0gMCkgeworI2lmbmRlZiBfX0dOVV9fIC8qIFRoZSBHTlUgaHVyZCBpcyBicm9rZW4gd2l0aCByZXNwZWN0IHRvIHN0YXQgZGV2aWNlcyAqLworCQkvKgorCQkgKiBEbyBhbiBleHRyYSBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgcm9vdCBkZXZpY2UuICBXZQorCQkgKiBjYW4ndCB0cnVzdCAvZXRjL210YWIsIGFuZCAvcHJvYy9tb3VudHMgd2lsbCBvbmx5IGxpc3QKKwkJICogL2Rldi9yb290IGZvciB0aGUgcm9vdCBmaWxlc3lzdGVtLiAgQXJnaC4gIEluc3RlYWQgd2UKKwkJICogY2hlY2sgaWYgdGhlIGdpdmVuIGRldmljZSBoYXMgdGhlIHNhbWUgbWFqb3IvbWlub3IgbnVtYmVyCisJCSAqIGFzIHRoZSBkZXZpY2UgdGhhdCB0aGUgcm9vdCBkaXJlY3RvcnkgaXMgb24uCisJCSAqLworCQlpZiAoZmlsZV9yZGV2ICYmIHN0YXQoIi8iLCAmc3RfYnVmKSA9PSAwKSB7CisJCQlpZiAoc3RfYnVmLnN0X2RldiA9PSBmaWxlX3JkZXYpIHsKKwkJCQkqbW91bnRfZmxhZ3MgPSBFWFQyX01GX01PVU5URUQ7CisJCQkJaWYgKG10cHQpCisJCQkJCXN0cm5jcHkobXRwdCwgIi8iLCBtdGxlbik7CisJCQkJZ290byBpc19yb290OworCQkJfQorCQl9CisjZW5kaWYgIC8qIF9fR05VX18gKi8KKwkJZ290byBlcnJvdXQ7CisJfQorI2lmbmRlZiBfX0dOVV9fIC8qIFRoZSBHTlUgaHVyZCBpcyBkZWZpY2llbnQ7IHdoYXQgZWxzZSBpcyBuZXc/ICovCisJLyogVmFsaWRhdGUgdGhlIGVudHJ5IGluIGNhc2UgL2V0Yy9tdGFiIGlzIG91dCBvZiBkYXRlICovCisJLyoKKwkgKiBXZSBuZWVkIHRvIGJlIHBhcmFub2lkLCBiZWNhdXNlIHNvbWUgYnJva2VuIGRpc3RyaWJ1dGlvbnMKKwkgKiAocmVhZDogU2xhY2t3YXJlKSBkb24ndCBpbml0aWFsaXplIC9ldGMvbXRhYiBiZWZvcmUgY2hlY2tpbmcKKwkgKiBhbGwgb2YgdGhlIG5vbi1yb290IGZpbGVzeXN0ZW1zIG9uIHRoZSBkaXNrLgorCSAqLworCWlmIChzdGF0KG1udC0+bW50X2RpciwgJnN0X2J1ZikgPCAwKSB7CisJCXJldHZhbCA9IGVycm5vOworCQlpZiAocmV0dmFsID09IEVOT0VOVCkgeworI2lmZGVmIERFQlVHCisJCQlwcmludGYoIkJvZ3VzIGVudHJ5IGluICVzISAgKCVzIGRvZXMgbm90IGV4aXN0KVxuIiwKKwkJCSAgICAgICBtdGFiX2ZpbGUsIG1udC0+bW50X2Rpcik7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCXJldHZhbCA9IDA7CisJCX0KKwkJZ290byBlcnJvdXQ7CisJfQorCWlmIChmaWxlX3JkZXYgJiYgKHN0X2J1Zi5zdF9kZXYgIT0gZmlsZV9yZGV2KSkgeworI2lmZGVmIERFQlVHCisJCXByaW50ZigiQm9ndXMgZW50cnkgaW4gJXMhICAoJXMgbm90IG1vdW50ZWQgb24gJXMpXG4iLAorCQkgICAgICAgbXRhYl9maWxlLCBmaWxlLCBtbnQtPm1udF9kaXIpOworI2VuZGlmIC8qIERFQlVHICovCisJCWdvdG8gZXJyb3V0OworCX0KKyNlbmRpZiAvKiBfX0dOVV9fICovCisJKm1vdW50X2ZsYWdzID0gRVhUMl9NRl9NT1VOVEVEOworCisjaWZkZWYgTU5UT1BUX1JPCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBybyBvcHRpb24gaXMgc2V0ICovCisJaWYgKGhhc21udG9wdChtbnQsIE1OVE9QVF9STykpCisJCSptb3VudF9mbGFncyB8PSBFWFQyX01GX1JFQURPTkxZOworI2VuZGlmCisKKwlpZiAobXRwdCkKKwkJc3RybmNweShtdHB0LCBtbnQtPm1udF9kaXIsIG10bGVuKTsKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSByZWZlcnJpbmcgdG8gdGhlIHJvb3QgZmlsZXN5c3RlbS4KKwkgKiBJZiBzbywgZG8gYSBtYW51YWwgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBvcGVuIC9ldGMvbXRhYgorCSAqIHJlYWQvd3JpdGUsIHNpbmNlIGlmIHRoZSByb290IGlzIG1vdW50ZWQgcmVhZC9vbmx5LCB0aGUKKwkgKiBjb250ZW50cyBvZiAvZXRjL210YWIgbWF5IG5vdCBiZSBhY2N1cmF0ZS4KKwkgKi8KKwlpZiAoTE9ORV9DSEFSKG1udC0+bW50X2RpciwgJy8nKSkgeworaXNfcm9vdDoKKyNkZWZpbmUgVEVTVF9GSUxFICIvLmlzbW91bnQtdGVzdC1maWxlIgorCQkqbW91bnRfZmxhZ3MgfD0gRVhUMl9NRl9JU1JPT1Q7CisJCWZkID0gb3BlbihURVNUX0ZJTEUsIE9fUkRXUnxPX0NSRUFUKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVST0ZTKQorCQkJCSptb3VudF9mbGFncyB8PSBFWFQyX01GX1JFQURPTkxZOworCQl9IGVsc2UKKwkJCWNsb3NlKGZkKTsKKwkJKHZvaWQpIHVubGluayhURVNUX0ZJTEUpOworCX0KKwlyZXR2YWwgPSAwOworZXJyb3V0OgorCWVuZG1udGVudCAoZik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCBjaGVja19tbnRlbnQoY29uc3QgY2hhciAqZmlsZSwgaW50ICptb3VudF9mbGFncywKKwkJCSAgICAgIGNoYXIgKm10cHQsIGludCBtdGxlbikKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisjaWZkZWYgREVCVUcKKwlyZXR2YWwgPSBjaGVja19tbnRlbnRfZmlsZSgiL3RtcC9tdGFiIiwgZmlsZSwgbW91bnRfZmxhZ3MsCisJCQkJICAgbXRwdCwgbXRsZW4pOworCWlmIChyZXR2YWwgPT0gMCkKKwkJcmV0dXJuIDA7CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBfX2xpbnV4X18KKwlyZXR2YWwgPSBjaGVja19tbnRlbnRfZmlsZSgiL3Byb2MvbW91bnRzIiwgZmlsZSwgbW91bnRfZmxhZ3MsCisJCQkJICAgbXRwdCwgbXRsZW4pOworCWlmIChyZXR2YWwgPT0gMCAmJiAoKm1vdW50X2ZsYWdzICE9IDApKQorCQlyZXR1cm4gMDsKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyNpZiBkZWZpbmVkKE1PVU5URUQpIHx8IGRlZmluZWQoX1BBVEhfTU9VTlRFRCkKKyNpZm5kZWYgTU9VTlRFRAorI2RlZmluZSBNT1VOVEVEIF9QQVRIX01PVU5URUQKKyNlbmRpZiAvKiBNT1VOVEVEICovCisJcmV0dmFsID0gY2hlY2tfbW50ZW50X2ZpbGUoTU9VTlRFRCwgZmlsZSwgbW91bnRfZmxhZ3MsIG10cHQsIG10bGVuKTsKKwlyZXR1cm4gcmV0dmFsOworI2Vsc2UKKwkqbW91bnRfZmxhZ3MgPSAwOworCXJldHVybiAwOworI2VuZGlmIC8qIGRlZmluZWQoTU9VTlRFRCkgfHwgZGVmaW5lZChfUEFUSF9NT1VOVEVEKSAqLworfQorCisjZWxzZQorI2lmIGRlZmluZWQoSEFWRV9HRVRNTlRJTkZPKQorCitzdGF0aWMgZXJyY29kZV90IGNoZWNrX2dldG1udGluZm8oY29uc3QgY2hhciAqZmlsZSwgaW50ICptb3VudF9mbGFncywKKwkJCQkgIGNoYXIgKm10cHQsIGludCBtdGxlbikKK3sKKwlzdHJ1Y3Qgc3RhdGZzICptcDsKKwlpbnQgICAgbGVuLCBuOworCWNvbnN0ICBjaGFyICAgKnMxOworCWNoYXIJKnMyOworCisJbiA9IGdldG1udGluZm8oJm1wLCBNTlRfTk9XQUlUKTsKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4gZXJybm87CisKKwlsZW4gPSBzaXplb2YoX1BBVEhfREVWKSAtIDE7CisJczEgPSBmaWxlOworCWlmIChzdHJuY21wKF9QQVRIX0RFViwgczEsIGxlbikgPT0gMCkKKwkJczEgKz0gbGVuOworCisJKm1vdW50X2ZsYWdzID0gMDsKKwl3aGlsZSAoLS1uID49IDApIHsKKwkJczIgPSBtcC0+Zl9tbnRmcm9tbmFtZTsKKwkJaWYgKHN0cm5jbXAoX1BBVEhfREVWLCBzMiwgbGVuKSA9PSAwKSB7CisJCQlzMiArPSBsZW4gLSAxOworCQkJKnMyID0gJ3InOworCQl9CisJCWlmIChzdHJjbXAoczEsIHMyKSA9PSAwIHx8IHN0cmNtcChzMSwgJnMyWzFdKSA9PSAwKSB7CisJCQkqbW91bnRfZmxhZ3MgPSBFWFQyX01GX01PVU5URUQ7CisJCQlicmVhazsKKwkJfQorCQkrK21wOworCX0KKwlpZiAobXRwdCkKKwkJc3RybmNweShtdHB0LCBtcC0+Zl9tbnRvbm5hbWUsIG10bGVuKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBIQVZFX0dFVE1OVElORk8gKi8KKyNlbmRpZiAvKiBIQVZFX01OVEVOVF9IICovCisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBzd2FwIGRldmljZS4KKyAqLworc3RhdGljIGludCBpc19zd2FwX2RldmljZShjb25zdCBjaGFyICpmaWxlKQoreworCUZJTEUJCSpmOworCWNoYXIJCWJ1ZlsxMDI0XSwgKmNwOworCWRldl90CQlmaWxlX2RldjsKKwlzdHJ1Y3Qgc3RhdAlzdF9idWY7CisJaW50CQlyZXQgPSAwOworCisJZmlsZV9kZXYgPSAwOworI2lmbmRlZiBfX0dOVV9fIC8qIFRoZSBHTlUgaHVyZCBpcyBicm9rZW4gd2l0aCByZXNwZWN0IHRvIHN0YXQgZGV2aWNlcyAqLworCWlmICgoc3RhdChmaWxlLCAmc3RfYnVmKSA9PSAwKSAmJgorCSAgICBTX0lTQkxLKHN0X2J1Zi5zdF9tb2RlKSkKKwkJZmlsZV9kZXYgPSBzdF9idWYuc3RfcmRldjsKKyNlbmRpZiAgLyogX19HTlVfXyAqLworCisJaWYgKCEoZiA9IGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9zd2FwcyIpKSkKKwkJcmV0dXJuIDA7CisJLyogU2tpcCB0aGUgZmlyc3QgbGluZSAqLworCWZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpOworCXdoaWxlICghZmVvZihmKSkgeworCQlpZiAoIWZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKQorCQkJYnJlYWs7CisJCWlmICgoY3AgPSBzdHJjaHIoYnVmLCAnICcpKSAhPSBOVUxMKQorCQkJKmNwID0gMDsKKwkJaWYgKChjcCA9IHN0cmNocihidWYsICdcdCcpKSAhPSBOVUxMKQorCQkJKmNwID0gMDsKKwkJaWYgKHN0cmNtcChidWYsIGZpbGUpID09IDApIHsKKwkJCXJldCsrOworCQkJYnJlYWs7CisJCX0KKyNpZm5kZWYgX19HTlVfXworCQlpZiAoZmlsZV9kZXYgJiYgKHN0YXQoYnVmLCAmc3RfYnVmKSA9PSAwKSAmJgorCQkgICAgU19JU0JMSyhzdF9idWYuc3RfbW9kZSkgJiYKKwkJICAgIGZpbGVfZGV2ID09IHN0X2J1Zi5zdF9yZGV2KSB7CisJCQlyZXQrKzsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgIC8qIF9fR05VX18gKi8KKwl9CisJZmNsb3NlKGYpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIGV4dDJmc19jaGVja19tb3VudF9wb2ludCgpIHJldHVybnMgMSBpZiB0aGUgZGV2aWNlIGlzIG1vdW50ZWQsIDAKKyAqIG90aGVyd2lzZS4gIElmIG10cHQgaXMgbm9uLU5VTEwsIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRldmljZSBpcworICogbW91bnRlZCBpcyBjb3BpZWQgdG8gd2hlcmUgbXRwdCBpcyBwb2ludGluZywgdXAgdG8gbXRsZW4KKyAqIGNoYXJhY3RlcnMuCisgKi8KKyNpZmRlZiBfX1RVUkJPQ19fCisjIHByYWdtYSBhcmdzdXNlZAorI2VuZGlmCitlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX21vdW50X3BvaW50KGNvbnN0IGNoYXIgKmRldmljZSwgaW50ICptb3VudF9mbGFncywKKwkJCQkgIGNoYXIgKm10cHQsIGludCBtdGxlbikKK3sKKwlpZiAoaXNfc3dhcF9kZXZpY2UoZGV2aWNlKSkgeworCQkqbW91bnRfZmxhZ3MgPSBFWFQyX01GX01PVU5URUQgfCBFWFQyX01GX1NXQVA7CisJCXN0cm5jcHkobXRwdCwgIjxzd2FwPiIsIG10bGVuKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIEhBVkVfTU5URU5UX0gKKwlyZXR1cm4gY2hlY2tfbW50ZW50KGRldmljZSwgbW91bnRfZmxhZ3MsIG10cHQsIG10bGVuKTsKKyNlbHNlCisjaWZkZWYgSEFWRV9HRVRNTlRJTkZPCisJcmV0dXJuIGNoZWNrX2dldG1udGluZm8oZGV2aWNlLCBtb3VudF9mbGFncywgbXRwdCwgbXRsZW4pOworI2Vsc2UKKyNpZmRlZiBfX0dOVUNfXworICN3YXJuaW5nICJDYW4ndCB1c2UgZ2V0bW50ZW50IG9yIGdldG1udGluZm8gdG8gY2hlY2sgZm9yIG1vdW50ZWQgZmlsZXN5c3RlbXMhIgorI2VuZGlmCisJKm1vdW50X2ZsYWdzID0gMDsKKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBIQVZFX0dFVE1OVElORk8gKi8KKyNlbmRpZiAvKiBIQVZFX01OVEVOVF9IICovCit9CisKKy8qCisgKiBleHQyZnNfY2hlY2tfaWZfbW91bnRlZCgpIHNldHMgdGhlIG1vdW50X2ZsYWdzIEVYVDJfTUZfTU9VTlRFRCwKKyAqIEVYVDJfTUZfUkVBRE9OTFksIGFuZCBFWFQyX01GX1JPT1QKKyAqCisgKi8KK2VycmNvZGVfdCBleHQyZnNfY2hlY2tfaWZfbW91bnRlZChjb25zdCBjaGFyICpmaWxlLCBpbnQgKm1vdW50X2ZsYWdzKQoreworCXJldHVybiBleHQyZnNfY2hlY2tfbW91bnRfcG9pbnQoZmlsZSwgbW91bnRfZmxhZ3MsIE5VTEwsIDApOworfQorCisjaWZkZWYgREVCVUcKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQJcmV0dmFsLCBtb3VudF9mbGFnczsKKwljaGFyCW1udHB0WzgwXTsKKworCWlmIChhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBkZXZpY2VcbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCW1udHB0WzBdID0gMDsKKwlyZXR2YWwgPSBleHQyZnNfY2hlY2tfbW91bnRfcG9pbnQoYXJndlsxXSwgJm1vdW50X2ZsYWdzLAorCQkJCQkgIG1udHB0LCBzaXplb2YobW50cHQpKTsKKwlpZiAocmV0dmFsKSB7CisJCWNvbV9lcnIoYXJndlswXSwgcmV0dmFsLAorCQkJIndoaWxlIGNhbGxpbmcgZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQiKTsKKwkJZXhpdCgxKTsKKwl9CisJcHJpbnRmKCJEZXZpY2UgJXMgcmVwb3J0cyBmbGFncyAlMDJ4XG4iLCBhcmd2WzFdLCBtb3VudF9mbGFncyk7CisJaWYgKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9CVVNZKQorCQlwcmludGYoIlx0JXMgaXMgYXBwYXJlbnRseSBpbiB1c2UuXG4iLCBhcmd2WzFdKTsKKwlpZiAobW91bnRfZmxhZ3MgJiBFWFQyX01GX01PVU5URUQpCisJCXByaW50ZigiXHQlcyBpcyBtb3VudGVkLlxuIiwgYXJndlsxXSk7CisJaWYgKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9TV0FQKQorCQlwcmludGYoIlx0JXMgaXMgYSBzd2FwIGRldmljZS5cbiIsIGFyZ3ZbMV0pOworCWlmIChtb3VudF9mbGFncyAmIEVYVDJfTUZfUkVBRE9OTFkpCisJCXByaW50ZigiXHQlcyBpcyByZWFkLW9ubHkuXG4iLCBhcmd2WzFdKTsKKwlpZiAobW91bnRfZmxhZ3MgJiBFWFQyX01GX0lTUk9PVCkKKwkJcHJpbnRmKCJcdCVzIGlzIHRoZSByb290IGZpbGVzeXN0ZW0uXG4iLCBhcmd2WzFdKTsKKwlpZiAobW50cHRbMF0pCisJCXByaW50ZigiXHQlcyBpcyBtb3VudGVkIG9uICVzLlxuIiwgYXJndlsxXSwgbW50cHQpOworCWV4aXQoMCk7Cit9CisjZW5kaWYgLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9qZnNfZGF0LmggYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvamZzX2RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YzU4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvamZzX2RhdC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGpmc19kYXQuaCAtLS0gc3RyaXBwZWQgZG93biBoZWFkZXIgZmlsZSB3aGljaCBvbmx5IGNvbnRhaW5zIHRoZSBKRlMKKyAqCW9uLWRpc2sgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KKworI2RlZmluZSBKRlNfTUFHSUNfTlVNQkVSIDB4YzAzYjM5OThVIC8qIFRoZSBmaXJzdCA0IGJ5dGVzIG9mIC9kZXYvcmFuZG9tISAqLworCisvKgorICogT24tZGlzayBzdHJ1Y3R1cmVzCisgKi8KKworLyoKKyAqIERlc2NyaXB0b3IgYmxvY2sgdHlwZXM6CisgKi8KKworI2RlZmluZSBKRlNfREVTQ1JJUFRPUl9CTE9DSwkxCisjZGVmaW5lIEpGU19DT01NSVRfQkxPQ0sJMgorI2RlZmluZSBKRlNfU1VQRVJCTE9DSwkJMworCisvKgorICogU3RhbmRhcmQgaGVhZGVyIGZvciBhbGwgZGVzY3JpcHRvciBibG9ja3M6CisgKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfaGVhZGVyX3MKK3sKKwlfX3UzMgkJaF9tYWdpYzsKKwlfX3UzMgkJaF9ibG9ja3R5cGU7CisJX191MzIJCWhfc2VxdWVuY2U7Cit9IGpvdXJuYWxfaGVhZGVyX3Q7CisKKworLyoKKyAqIFRoZSBibG9jayB0YWc6IHVzZWQgdG8gZGVzY3JpYmUgYSBzaW5nbGUgYnVmZmVyIGluIHRoZSBqb3VybmFsCisgKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfYmxvY2tfdGFnX3MKK3sKKwlfX3UzMgkJdF9ibG9ja25yOwkvKiBUaGUgb24tZGlzayBibG9jayBudW1iZXIgKi8KKwlfX3UzMgkJdF9mbGFnczsJLyogU2VlIGJlbG93ICovCit9IGpvdXJuYWxfYmxvY2tfdGFnX3Q7CisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgam91cm5hbCB0YWcgZmxhZ3Mgd29yZDogKi8KKyNkZWZpbmUgSkZTX0ZMQUdfRVNDQVBFCQkxCS8qIG9uLWRpc2sgYmxvY2sgaXMgZXNjYXBlZCAqLworI2RlZmluZSBKRlNfRkxBR19TQU1FX1VVSUQJMgkvKiBibG9jayBoYXMgc2FtZSB1dWlkIGFzIHByZXZpb3VzICovCisjZGVmaW5lIEpGU19GTEFHX0RFTEVURUQJNAkvKiBibG9jayBkZWxldGVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgSkZTX0ZMQUdfTEFTVF9UQUcJOAkvKiBsYXN0IHRhZyBpbiB0aGlzIGRlc2NyaXB0b3IgYmxvY2sgKi8KKworCisvKgorICogVGhlIGpvdXJuYWwgc3VwZXJibG9jaworICovCit0eXBlZGVmIHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfcworeworCWpvdXJuYWxfaGVhZGVyX3Qgc19oZWFkZXI7CisKKwkvKiBTdGF0aWMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgam91cm5hbCAqLworCV9fdTMyCQlzX2Jsb2Nrc2l6ZTsJLyogam91cm5hbCBkZXZpY2UgYmxvY2tzaXplICovCisJX191MzIJCXNfbWF4bGVuOwkvKiB0b3RhbCBibG9ja3MgaW4gam91cm5hbCBmaWxlICovCisJX191MzIJCXNfZmlyc3Q7CS8qIGZpcnN0IGJsb2NrIG9mIGxvZyBpbmZvcm1hdGlvbiAqLworCisJLyogRHluYW1pYyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsb2cgKi8KKwlfX3UzMgkJc19zZXF1ZW5jZTsJLyogZmlyc3QgY29tbWl0IElEIGV4cGVjdGVkIGluIGxvZyAqLworCV9fdTMyCQlzX3N0YXJ0OwkvKiBibG9ja25yIG9mIHN0YXJ0IG9mIGxvZyAqLworfSBqb3VybmFsX3N1cGVyYmxvY2tfdDsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9rZXJuZWwtamJkLmggYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMva2VybmVsLWpiZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2Q5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMva2VybmVsLWpiZC5oCkBAIC0wLDAgKzEsMjM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L2piZC5oCisgKgorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPgorICoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDAgUmVkIEhhdCwgSW5jIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogRGVmaW5pdGlvbnMgZm9yIHRyYW5zYWN0aW9uIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGJ1ZmZlciBjYWNoZQorICogZmlsZXN5c3RlbSBqb3VybmFsaW5nIHN1cHBvcnQuCisgKi8KKyNpZm5kZWYgTElOVVhfSkJEX0gKKyNkZWZpbmUgTElOVVhfSkJEX0ggMQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIFN0YW5kYXJkIGhlYWRlciBmb3IgYWxsIGRlc2NyaXB0b3IgYmxvY2tzOgorICovCisKK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfaGVhZGVyX3MKK3sKKwlfX3UzMgkJaF9tYWdpYzsKKwlfX3UzMgkJaF9ibG9ja3R5cGU7CisJX191MzIJCWhfc2VxdWVuY2U7Cit9IGpvdXJuYWxfaGVhZGVyX3Q7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBnbG9iYWwgZTJmc2NrIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZTJmc2NrX3N0cnVjdCAqZTJmc2NrX3Q7CisKKworc3RydWN0IGlub2RlIHsKKwllMmZzY2tfdCAgICAgICAgaV9jdHg7CisJZXh0Ml9pbm9fdCAgICAgIGlfaW5vOworCXN0cnVjdCBleHQyX2lub2RlIGlfZXh0MjsKK307CisKKworLyoKKyAqIFRoZSBqb3VybmFsIHN1cGVyYmxvY2suICBBbGwgZmllbGRzIGFyZSBpbiBiaWctZW5kaWFuIGJ5dGUgb3JkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfc3VwZXJibG9ja19zCit7CisvKiAweDAwMDAgKi8KKwlqb3VybmFsX2hlYWRlcl90IHNfaGVhZGVyOworCisvKiAweDAwMEMgKi8KKwkvKiBTdGF0aWMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgam91cm5hbCAqLworCV9fdTMyCXNfYmxvY2tzaXplOwkJLyogam91cm5hbCBkZXZpY2UgYmxvY2tzaXplICovCisJX191MzIJc19tYXhsZW47CQkvKiB0b3RhbCBibG9ja3MgaW4gam91cm5hbCBmaWxlICovCisJX191MzIJc19maXJzdDsJCS8qIGZpcnN0IGJsb2NrIG9mIGxvZyBpbmZvcm1hdGlvbiAqLworCisvKiAweDAwMTggKi8KKwkvKiBEeW5hbWljIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvZyAqLworCV9fdTMyCXNfc2VxdWVuY2U7CQkvKiBmaXJzdCBjb21taXQgSUQgZXhwZWN0ZWQgaW4gbG9nICovCisJX191MzIJc19zdGFydDsJCS8qIGJsb2NrbnIgb2Ygc3RhcnQgb2YgbG9nICovCisKKy8qIDB4MDAyMCAqLworCS8qIEVycm9yIHZhbHVlLCBhcyBzZXQgYnkgam91cm5hbF9hYm9ydCgpLiAqLworCV9fczMyCXNfZXJybm87CisKKy8qIDB4MDAyNCAqLworCS8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIG9ubHkgdmFsaWQgaW4gYSB2ZXJzaW9uLTIgc3VwZXJibG9jayAqLworCV9fdTMyCXNfZmVhdHVyZV9jb21wYXQ7CS8qIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX3UzMglzX2ZlYXR1cmVfaW5jb21wYXQ7CS8qIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fdTMyCXNfZmVhdHVyZV9yb19jb21wYXQ7CS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKy8qIDB4MDAzMCAqLworCV9fdTgJc191dWlkWzE2XTsJCS8qIDEyOC1iaXQgdXVpZCBmb3Igam91cm5hbCAqLworCisvKiAweDAwNDAgKi8KKwlfX3UzMglzX25yX3VzZXJzOwkJLyogTnIgb2YgZmlsZXN5c3RlbXMgc2hhcmluZyBsb2cgKi8KKworCV9fdTMyCXNfZHluc3VwZXI7CQkvKiBCbG9ja25yIG9mIGR5bmFtaWMgc3VwZXJibG9jayBjb3B5Ki8KKworLyogMHgwMDQ4ICovCisJX191MzIJc19tYXhfdHJhbnNhY3Rpb247CS8qIExpbWl0IG9mIGpvdXJuYWwgYmxvY2tzIHBlciB0cmFucy4qLworCV9fdTMyCXNfbWF4X3RyYW5zX2RhdGE7CS8qIExpbWl0IG9mIGRhdGEgYmxvY2tzIHBlciB0cmFucy4gKi8KKworLyogMHgwMDUwICovCisJX191MzIJc19wYWRkaW5nWzQ0XTsKKworLyogMHgwMTAwICovCisJX191OAlzX3VzZXJzWzE2KjQ4XTsJCS8qIGlkcyBvZiBhbGwgZnMnZXMgc2hhcmluZyB0aGUgbG9nICovCisvKiAweDA0MDAgKi8KK30gam91cm5hbF9zdXBlcmJsb2NrX3Q7CisKKworZXh0ZXJuIGludCBqb3VybmFsX2Jsb2Nrc19wZXJfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiBpbnQgamJkX2Jsb2Nrc19wZXJfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworI2RlZmluZSBKRlNfTUlOX0pPVVJOQUxfQkxPQ0tTIDEwMjQKKworCisvKgorICogSW50ZXJuYWwgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBsb2dnaW5nIG1lY2hhbmlzbToKKyAqLworCisjZGVmaW5lIEpGU19NQUdJQ19OVU1CRVIgMHhjMDNiMzk5OFUgLyogVGhlIGZpcnN0IDQgYnl0ZXMgb2YgL2Rldi9yYW5kb20hICovCisKKy8qCisgKiBEZXNjcmlwdG9yIGJsb2NrIHR5cGVzOgorICovCisKKyNkZWZpbmUgSkZTX0RFU0NSSVBUT1JfQkxPQ0sJMQorI2RlZmluZSBKRlNfQ09NTUlUX0JMT0NLCTIKKyNkZWZpbmUgSkZTX1NVUEVSQkxPQ0tfVjEJMworI2RlZmluZSBKRlNfU1VQRVJCTE9DS19WMgk0CisjZGVmaW5lIEpGU19SRVZPS0VfQkxPQ0sJNQorCisvKgorICogVGhlIGJsb2NrIHRhZzogdXNlZCB0byBkZXNjcmliZSBhIHNpbmdsZSBidWZmZXIgaW4gdGhlIGpvdXJuYWwKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgam91cm5hbF9ibG9ja190YWdfcworeworCV9fdTMyCQl0X2Jsb2NrbnI7CS8qIFRoZSBvbi1kaXNrIGJsb2NrIG51bWJlciAqLworCV9fdTMyCQl0X2ZsYWdzOwkvKiBTZWUgYmVsb3cgKi8KK30gam91cm5hbF9ibG9ja190YWdfdDsKKworLyoKKyAqIFRoZSByZXZva2UgZGVzY3JpcHRvcjogdXNlZCBvbiBkaXNrIHRvIGRlc2NyaWJlIGEgc2VyaWVzIG9mIGJsb2NrcyB0bworICogYmUgcmV2b2tlZCBmcm9tIHRoZSBsb2cKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgam91cm5hbF9yZXZva2VfaGVhZGVyX3MKK3sKKwlqb3VybmFsX2hlYWRlcl90IHJfaGVhZGVyOworCWludAkJIHJfY291bnQ7CS8qIENvdW50IG9mIGJ5dGVzIHVzZWQgaW4gdGhlIGJsb2NrICovCit9IGpvdXJuYWxfcmV2b2tlX2hlYWRlcl90OworCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgam91cm5hbCB0YWcgZmxhZ3Mgd29yZDogKi8KKyNkZWZpbmUgSkZTX0ZMQUdfRVNDQVBFCQkxCS8qIG9uLWRpc2sgYmxvY2sgaXMgZXNjYXBlZCAqLworI2RlZmluZSBKRlNfRkxBR19TQU1FX1VVSUQJMgkvKiBibG9jayBoYXMgc2FtZSB1dWlkIGFzIHByZXZpb3VzICovCisjZGVmaW5lIEpGU19GTEFHX0RFTEVURUQJNAkvKiBibG9jayBkZWxldGVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgSkZTX0ZMQUdfTEFTVF9UQUcJOAkvKiBsYXN0IHRhZyBpbiB0aGlzIGRlc2NyaXB0b3IgYmxvY2sgKi8KKworCisKKworI2RlZmluZSBKRlNfSEFTX0NPTVBBVF9GRUFUVVJFKGosbWFzaykJCQkJCVwKKwkoKGopLT5qX2Zvcm1hdF92ZXJzaW9uID49IDIgJiYJCQkJCVwKKwkgKChqKS0+al9zdXBlcmJsb2NrLT5zX2ZlYXR1cmVfY29tcGF0ICYgY3B1X3RvX2JlMzIoKG1hc2spKSkpCisjZGVmaW5lIEpGU19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoaixtYXNrKQkJCQlcCisJKChqKS0+al9mb3JtYXRfdmVyc2lvbiA+PSAyICYmCQkJCQlcCisJICgoaiktPmpfc3VwZXJibG9jay0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIGNwdV90b19iZTMyKChtYXNrKSkpKQorI2RlZmluZSBKRlNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoaixtYXNrKQkJCQlcCisJKChqKS0+al9mb3JtYXRfdmVyc2lvbiA+PSAyICYmCQkJCQlcCisJICgoaiktPmpfc3VwZXJibG9jay0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2JlMzIoKG1hc2spKSkpCisKKyNkZWZpbmUgSkZTX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFCTB4MDAwMDAwMDEKKworLyogRmVhdHVyZXMga25vd24gdG8gdGhpcyBrZXJuZWwgdmVyc2lvbjogKi8KKyNkZWZpbmUgSkZTX0tOT1dOX0NPTVBBVF9GRUFUVVJFUwkwCisjZGVmaW5lIEpGU19LTk9XTl9ST0NPTVBBVF9GRUFUVVJFUwkwCisjZGVmaW5lIEpGU19LTk9XTl9JTkNPTVBBVF9GRUFUVVJFUwlKRlNfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UKKworLyogQ29tcGFyaXNvbiBmdW5jdGlvbnMgZm9yIHRyYW5zYWN0aW9uIElEczogcGVyZm9ybSBjb21wYXJpc29ucyB1c2luZworICogbW9kdWxvIGFyaXRobWV0aWMgc28gdGhhdCB0aGV5IHdvcmsgb3ZlciBzZXF1ZW5jZSBudW1iZXIgd3JhcHMuICovCisKKworLyoKKyAqIERlZmluaXRpb25zIHdoaWNoIGF1Z21lbnQgdGhlIGJ1ZmZlcl9oZWFkIGxheWVyCisgKi8KKworLyogam91cm5hbGluZyBidWZmZXIgdHlwZXMgKi8KKyNkZWZpbmUgQkpfTm9uZQkJMAkvKiBOb3Qgam91cm5hbGVkICovCisjZGVmaW5lIEJKX1N5bmNEYXRhCTEJLyogTm9ybWFsIGRhdGE6IGZsdXNoIGJlZm9yZSBjb21taXQgKi8KKyNkZWZpbmUgQkpfQXN5bmNEYXRhCTIJLyogd3JpdGVwYWdlIGRhdGE6IHdhaXQgb24gaXQgYmVmb3JlIGNvbW1pdCAqLworI2RlZmluZSBCSl9NZXRhZGF0YQkzCS8qIE5vcm1hbCBqb3VybmFsZWQgbWV0YWRhdGEgKi8KKyNkZWZpbmUgQkpfRm9yZ2V0CTQJLyogQnVmZmVyIHN1cGVyY2VkZWQgYnkgdGhpcyB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBCSl9JTwkJNQkvKiBCdWZmZXIgaXMgZm9yIHRlbXBvcmFyeSBJTyB1c2UgKi8KKyNkZWZpbmUgQkpfU2hhZG93CTYJLyogQnVmZmVyIGNvbnRlbnRzIGJlaW5nIHNoYWRvd2VkIHRvIHRoZSBsb2cgKi8KKyNkZWZpbmUgQkpfTG9nQ3RsCTcJLyogQnVmZmVyIGNvbnRhaW5zIGxvZyBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBCSl9SZXNlcnZlZAk4CS8qIEJ1ZmZlciBpcyByZXNlcnZlZCBmb3IgYWNjZXNzIGJ5IGpvdXJuYWwgKi8KKyNkZWZpbmUgQkpfVHlwZXMJOQorCisKK3N0cnVjdCBrZGV2X3MgeworCWUyZnNja190ICAgICAgICBrX2N0eDsKKwlpbnQgICAgICAgICAgICAga19kZXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrZGV2X3MgKmtkZXZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHRpZF90OworCitzdHJ1Y3Qgam91cm5hbF9zCit7CisJdW5zaWduZWQgbG9uZwkJal9mbGFnczsKKwlpbnQJCQlqX2Vycm5vOworCXN0cnVjdCBidWZmZXJfaGVhZCAqCWpfc2JfYnVmZmVyOworCXN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfcyAqal9zdXBlcmJsb2NrOworCWludAkJCWpfZm9ybWF0X3ZlcnNpb247CisJdW5zaWduZWQgbG9uZwkJal9oZWFkOworCXVuc2lnbmVkIGxvbmcJCWpfdGFpbDsKKwl1bnNpZ25lZCBsb25nCQlqX2ZyZWU7CisJdW5zaWduZWQgbG9uZwkJal9maXJzdCwgal9sYXN0OworCWtkZXZfdAkJCWpfZGV2OworCWtkZXZfdAkJCWpfZnNfZGV2OworCWludAkJCWpfYmxvY2tzaXplOworCXVuc2lnbmVkIGludAkJal9ibGtfb2Zmc2V0OworCXVuc2lnbmVkIGludAkJal9tYXhsZW47CisJc3RydWN0IGlub2RlICoJCWpfaW5vZGU7CisJdGlkX3QJCQlqX3RhaWxfc2VxdWVuY2U7CisJdGlkX3QJCQlqX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCV9fdTgJCQlqX3V1aWRbMTZdOworCXN0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MgKmpfcmV2b2tlOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgam91cm5hbF9zIGpvdXJuYWxfdDsKKworZXh0ZXJuIGludAkgICBqb3VybmFsX3JlY292ZXIgICAgKGpvdXJuYWxfdCAqam91cm5hbCk7CitleHRlcm4gaW50CSAgIGpvdXJuYWxfc2tpcF9yZWNvdmVyeSAoam91cm5hbF90ICopOworCisvKiBQcmltYXJ5IHJldm9rZSBzdXBwb3J0ICovCitleHRlcm4gaW50CSAgIGpvdXJuYWxfaW5pdF9yZXZva2Uoam91cm5hbF90ICosIGludCk7CitleHRlcm4gdm9pZAkgICBqb3VybmFsX2Rlc3Ryb3lfcmV2b2tlX2NhY2hlcyh2b2lkKTsKK2V4dGVybiBpbnQJICAgam91cm5hbF9pbml0X3Jldm9rZV9jYWNoZXModm9pZCk7CisKKy8qIFJlY292ZXJ5IHJldm9rZSBzdXBwb3J0ICovCitleHRlcm4gaW50CSAgIGpvdXJuYWxfc2V0X3Jldm9rZShqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZywgdGlkX3QpOworZXh0ZXJuIGludAkgICBqb3VybmFsX3Rlc3RfcmV2b2tlKGpvdXJuYWxfdCAqLCB1bnNpZ25lZCBsb25nLCB0aWRfdCk7CitleHRlcm4gdm9pZAkgICBqb3VybmFsX2NsZWFyX3Jldm9rZShqb3VybmFsX3QgKik7CitleHRlcm4gdm9pZAkgICBqb3VybmFsX2JyZWxzZV9hcnJheShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJbXSwgaW50IG4pOworCitleHRlcm4gdm9pZAkgICBqb3VybmFsX2Rlc3Ryb3lfcmV2b2tlKGpvdXJuYWxfdCAqKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9rZXJuZWwtbGlzdC5oIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2tlcm5lbC1saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwNzE2YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9rZXJuZWwtbGlzdC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpZm5kZWYgTElOVVhfTElTVF9ICisjZGVmaW5lIExJTlVYX0xJU1RfSCAxCisKKy8qCisgKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFNvbWUgb2YgdGhlIGludGVybmFsIGZ1bmN0aW9ucyAoIl9feHh4IikgYXJlIHVzZWZ1bCB3aGVuCisgKiBtYW5pcHVsYXRpbmcgd2hvbGUgbGlzdHMgcmF0aGVyIHRoYW4gc2luZ2xlIGVudHJpZXMsIGFzCisgKiBzb21ldGltZXMgd2UgYWxyZWFkeSBrbm93IHRoZSBuZXh0L3ByZXYgZW50cmllcyBhbmQgd2UgY2FuCisgKiBnZW5lcmF0ZSBiZXR0ZXIgY29kZSBieSB1c2luZyB0aGVtIGRpcmVjdGx5IHJhdGhlciB0aGFuCisgKiB1c2luZyB0aGUgZ2VuZXJpYyBzaW5nbGUtZW50cnkgcm91dGluZXMuCisgKi8KKworc3RydWN0IGxpc3RfaGVhZCB7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7Cit9OworCisjZGVmaW5lIExJU1RfSEVBRF9JTklUKG5hbWUpIHsgJihuYW1lKSwgJihuYW1lKSB9CisKKyNkZWZpbmUgTElTVF9IRUFEKG5hbWUpIFwKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWUgPSB7ICZuYW1lLCAmbmFtZSB9CisKKyNkZWZpbmUgSU5JVF9MSVNUX0hFQUQocHRyKSBkbyB7IFwKKwkocHRyKS0+bmV4dCA9IChwdHIpOyAocHRyKS0+cHJldiA9IChwdHIpOyBcCit9IHdoaWxlICgwKQorCisjaWYgKCFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1dBVENPTUNfXykpCisjZGVmaW5lIF9faW5saW5lX18KKyNlbmRpZgorCisvKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJldHdlZW4gdHdvIGtub3duIGNvbnNlY3V0aXZlIGVudHJpZXMuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKiBuZXcsCisJc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsCisJc3RydWN0IGxpc3RfaGVhZCAqIG5leHQpCit7CisJbmV4dC0+cHJldiA9IG5ldzsKKwluZXctPm5leHQgPSBuZXh0OworCW5ldy0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5ldzsKK30KKworLyoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBhZnRlciB0aGUgc3BlY2lmaWVkIGhlYWQuLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfYWRkKG5ldywgaGVhZCwgaGVhZC0+bmV4dCk7Cit9CisKKy8qCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYXQgdGhlIHRhaWwKKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBsaXN0X2FkZF90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfYWRkKG5ldywgaGVhZC0+cHJldiwgaGVhZCk7Cit9CisKKy8qCisgKiBEZWxldGUgYSBsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKKyAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2xpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKiBwcmV2LAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqIG5leHQpCit7CisJbmV4dC0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5leHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbGlzdF9lbXB0eShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXJldHVybiBoZWFkLT5uZXh0ID09IGhlYWQ7Cit9CisKKy8qCisgKiBTcGxpY2UgaW4gImxpc3QiIGludG8gImhlYWQiCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlzdF9zcGxpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpmaXJzdCA9IGxpc3QtPm5leHQ7CisKKwlpZiAoZmlyc3QgIT0gbGlzdCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0ID0gbGlzdC0+cHJldjsKKwkJc3RydWN0IGxpc3RfaGVhZCAqYXQgPSBoZWFkLT5uZXh0OworCisJCWZpcnN0LT5wcmV2ID0gaGVhZDsKKwkJaGVhZC0+bmV4dCA9IGZpcnN0OworCisJCWxhc3QtPm5leHQgPSBhdDsKKwkJYXQtPnByZXYgPSBsYXN0OworCX0KK30KKworI2RlZmluZSBsaXN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJKCh0eXBlICopKChjaGFyICopKHB0ciktKHVuc2lnbmVkIGxvbmcpKCYoKHR5cGUgKikwKS0+bWVtYmVyKSkpCisKKyNkZWZpbmUgbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9saW5rLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YjJlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbGluay5jCkBAIC0wLDAgKzEsMTM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsaW5rLmMgLS0tIGNyZWF0ZSBsaW5rcyBpbiBhIGV4dDJmcyBkaXJlY3RvcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdHJ1Y3QgbGlua19zdHJ1Y3QgIHsKKwljb25zdCBjaGFyCSpuYW1lOworCWludAkJbmFtZWxlbjsKKwlleHQyX2lub190CWlub2RlOworCWludAkJZmxhZ3M7CisJaW50CQlkb25lOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYjsKK307CisKK3N0YXRpYyBpbnQgbGlua19wcm9jKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkgICAgIGludAlvZmZzZXQsCisJCSAgICAgaW50CWJsb2Nrc2l6ZSwKKwkJICAgICBjaGFyCSpidWYsCisJCSAgICAgdm9pZAkqcHJpdl9kYXRhKQoreworCXN0cnVjdCBsaW5rX3N0cnVjdCAqbHMgPSAoc3RydWN0IGxpbmtfc3RydWN0ICopIHByaXZfZGF0YTsKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKm5leHQ7CisJaW50IHJlY19sZW4sIG1pbl9yZWNfbGVuOworCWludCByZXQgPSAwOworCisJcmVjX2xlbiA9IEVYVDJfRElSX1JFQ19MRU4obHMtPm5hbWVsZW4pOworCisJLyoKKwkgKiBTZWUgaWYgdGhlIGZvbGxvd2luZyBkaXJlY3RvcnkgZW50cnkgKGlmIGFueSkgaXMgdW51c2VkOworCSAqIGlmIHNvLCBhYnNvcmIgaXQgaW50byB0aGlzIG9uZS4KKwkgKi8KKwluZXh0ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSAoYnVmICsgb2Zmc2V0ICsgZGlyZW50LT5yZWNfbGVuKTsKKwlpZiAoKG9mZnNldCArIGRpcmVudC0+cmVjX2xlbiA8IGJsb2Nrc2l6ZSAtIDgpICYmCisJICAgIChuZXh0LT5pbm9kZSA9PSAwKSAmJgorCSAgICAob2Zmc2V0ICsgZGlyZW50LT5yZWNfbGVuICsgbmV4dC0+cmVjX2xlbiA8PSBibG9ja3NpemUpKSB7CisJCWRpcmVudC0+cmVjX2xlbiArPSBuZXh0LT5yZWNfbGVuOworCQlyZXQgPSBESVJFTlRfQ0hBTkdFRDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBkaXJlY3RvcnkgZW50cnkgaXMgdXNlZCwgc2VlIGlmIHdlIGNhbiBzcGxpdCB0aGUKKwkgKiBkaXJlY3RvcnkgZW50cnkgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IG5hbWUuICBJZiBzbywKKwkgKiB0cnVuY2F0ZSBpdCBhbmQgcmV0dXJuLgorCSAqLworCWlmIChkaXJlbnQtPmlub2RlKSB7CisJCW1pbl9yZWNfbGVuID0gRVhUMl9ESVJfUkVDX0xFTihkaXJlbnQtPm5hbWVfbGVuICYgMHhGRik7CisJCWlmIChkaXJlbnQtPnJlY19sZW4gPCAobWluX3JlY19sZW4gKyByZWNfbGVuKSkKKwkJCXJldHVybiByZXQ7CisJCXJlY19sZW4gPSBkaXJlbnQtPnJlY19sZW4gLSBtaW5fcmVjX2xlbjsKKwkJZGlyZW50LT5yZWNfbGVuID0gbWluX3JlY19sZW47CisJCW5leHQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIChidWYgKyBvZmZzZXQgKworCQkJCQkJICBkaXJlbnQtPnJlY19sZW4pOworCQluZXh0LT5pbm9kZSA9IDA7CisJCW5leHQtPm5hbWVfbGVuID0gMDsKKwkJbmV4dC0+cmVjX2xlbiA9IHJlY19sZW47CisJCXJldHVybiBESVJFTlRfQ0hBTkdFRDsKKwl9CisKKwkvKgorCSAqIElmIHdlIGdldCB0aGlzIGZhciwgdGhlbiB0aGUgZGlyZWN0b3J5IGVudHJ5IGlzIG5vdCB1c2VkLgorCSAqIFNlZSBpZiB3ZSBjYW4gZml0IHRoZSByZXF1ZXN0IGVudHJ5IGluLiAgSWYgc28sIGRvIGl0LgorCSAqLworCWlmIChkaXJlbnQtPnJlY19sZW4gPCByZWNfbGVuKQorCQlyZXR1cm4gcmV0OworCWRpcmVudC0+aW5vZGUgPSBscy0+aW5vZGU7CisJZGlyZW50LT5uYW1lX2xlbiA9IGxzLT5uYW1lbGVuOworCXN0cm5jcHkoZGlyZW50LT5uYW1lLCBscy0+bmFtZSwgbHMtPm5hbWVsZW4pOworCWlmIChscy0+c2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkKKwkJZGlyZW50LT5uYW1lX2xlbiB8PSAobHMtPmZsYWdzICYgMHg3KSA8PCA4OworCisJbHMtPmRvbmUrKzsKKwlyZXR1cm4gRElSRU5UX0FCT1JUfERJUkVOVF9DSEFOR0VEOworfQorCisvKgorICogTm90ZTogdGhlIGxvdyAzIGJpdHMgb2YgdGhlIGZsYWdzIGZpZWxkIGFyZSB1c2VkIGFzIHRoZSBkaXJlY3RvcnkKKyAqIGVudHJ5IGZpbGV0eXBlLgorICovCisjaWZkZWYgX19UVVJCT0NfXworIyBwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorZXJyY29kZV90IGV4dDJmc19saW5rKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgZXh0Ml9pbm9fdCBpbm8sIGludCBmbGFncykKK3sKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlzdHJ1Y3QgbGlua19zdHJ1Y3QJbHM7CisJc3RydWN0IGV4dDJfaW5vZGUJaW5vZGU7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKCEoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1JXKSkKKwkJcmV0dXJuIEVYVDJfRVRfUk9fRklMU1lTOworCisJbHMubmFtZSA9IG5hbWU7CisJbHMubmFtZWxlbiA9IG5hbWUgPyBzdHJsZW4obmFtZSkgOiAwOworCWxzLmlub2RlID0gaW5vOworCWxzLmZsYWdzID0gZmxhZ3M7CisJbHMuZG9uZSA9IDA7CisJbHMuc2IgPSBmcy0+c3VwZXI7CisKKwlyZXR2YWwgPSBleHQyZnNfZGlyX2l0ZXJhdGUoZnMsIGRpciwgRElSRU5UX0ZMQUdfSU5DTFVERV9FTVBUWSwKKwkJCQkgICAgMCwgbGlua19wcm9jLCAmbHMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoIWxzLmRvbmUpCisJCXJldHVybiBFWFQyX0VUX0RJUl9OT19TUEFDRTsKKworCWlmICgocmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIGRpciwgJmlub2RlKSkgIT0gMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChpbm9kZS5pX2ZsYWdzICYgRVhUMl9JTkRFWF9GTCkgeworCQlpbm9kZS5pX2ZsYWdzICY9IH5FWFQyX0lOREVYX0ZMOworCQlpZiAoKHJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShmcywgZGlyLCAmaW5vZGUpKSAhPSAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9sb29rdXAuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9sb29rdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU4ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2xvb2t1cC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxvb2t1cC5jIC0tLSBleHQyZnMgZGlyZWN0b3J5IGxvb2t1cCBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk0LCAxOTk1IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RydWN0IGxvb2t1cF9zdHJ1Y3QgIHsKKwljb25zdCBjaGFyCSpuYW1lOworCWludAkJbGVuOworCWV4dDJfaW5vX3QJKmlub2RlOworCWludAkJZm91bmQ7Cit9OworCisjaWZkZWYgX19UVVJCT0NfXworIyBwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorc3RhdGljIGludCBsb29rdXBfcHJvYyhzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJICAgICAgIGludAlvZmZzZXQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgaW50CWJsb2Nrc2l6ZSBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCSAgICAgICBjaGFyCSpidWYgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgdm9pZAkqcHJpdl9kYXRhKQoreworCXN0cnVjdCBsb29rdXBfc3RydWN0ICpscyA9IChzdHJ1Y3QgbG9va3VwX3N0cnVjdCAqKSBwcml2X2RhdGE7CisKKwlpZiAobHMtPmxlbiAhPSAoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RybmNtcChscy0+bmFtZSwgZGlyZW50LT5uYW1lLCAoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpKSkKKwkJcmV0dXJuIDA7CisJKmxzLT5pbm9kZSA9IGRpcmVudC0+aW5vZGU7CisJbHMtPmZvdW5kKys7CisJcmV0dXJuIERJUkVOVF9BQk9SVDsKK30KKworCitlcnJjb2RlX3QgZXh0MmZzX2xvb2t1cChleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlpbnQgbmFtZWxlbiwgY2hhciAqYnVmLCBleHQyX2lub190ICppbm9kZSkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCXN0cnVjdCBsb29rdXBfc3RydWN0IGxzOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWxzLm5hbWUgPSBuYW1lOworCWxzLmxlbiA9IG5hbWVsZW47CisJbHMuaW5vZGUgPSBpbm9kZTsKKwlscy5mb3VuZCA9IDA7CisKKwlyZXR2YWwgPSBleHQyZnNfZGlyX2l0ZXJhdGUoZnMsIGRpciwgMCwgYnVmLCBsb29rdXBfcHJvYywgJmxzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIChscy5mb3VuZCkgPyAwIDogRVhUMl9FVF9GSUxFX05PVF9GT1VORDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ta2Rpci5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL21rZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2YWM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ta2Rpci5jCkBAIC0wLDAgKzEsMTM5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBta2Rpci5jIC0tLSBtYWtlIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKyNpZm5kZWYgRVhUMl9GVF9ESVIKKyNkZWZpbmUgRVhUMl9GVF9ESVIJCTIKKyNlbmRpZgorCitlcnJjb2RlX3QgZXh0MmZzX21rZGlyKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHBhcmVudCwgZXh0Ml9pbm9fdCBpbnVtLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQlwYXJlbnRfaW5vZGUsIGlub2RlOworCWV4dDJfaW5vX3QJCWlubyA9IGludW07CisJZXh0Ml9pbm9fdAkJc2NyYXRjaF9pbm87CisJYmxrX3QJCQlibGs7CisJY2hhcgkJCSpibG9jayA9IE5VTEw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbiBpbm9kZSwgaWYgbmVjZXNzYXJ5CisJICovCisJaWYgKCFpbm8pIHsKKwkJcmV0dmFsID0gZXh0MmZzX25ld19pbm9kZShmcywgcGFyZW50LCBMSU5VWF9TX0lGRElSIHwgMDc1NSwKKwkJCQkJICAwLCAmaW5vKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgZGF0YSBibG9jayBmb3IgdGhlIGRpcmVjdG9yeQorCSAqLworCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIDAsIDAsICZibGspOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCS8qCisJICogQ3JlYXRlIGEgc2NyYXRjaCB0ZW1wbGF0ZSBmb3IgdGhlIGRpcmVjdG9yeQorCSAqLworCXJldHZhbCA9IGV4dDJmc19uZXdfZGlyX2Jsb2NrKGZzLCBpbm8sIHBhcmVudCwgJmJsb2NrKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwkvKgorCSAqIEdldCB0aGUgcGFyZW50J3MgaW5vZGUsIGlmIG5lY2Vzc2FyeQorCSAqLworCWlmIChwYXJlbnQgIT0gaW5vKSB7CisJCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBwYXJlbnQsICZwYXJlbnRfaW5vZGUpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworCX0gZWxzZQorCQltZW1zZXQoJnBhcmVudF9pbm9kZSwgMCwgc2l6ZW9mKHBhcmVudF9pbm9kZSkpOworCisJLyoKKwkgKiBDcmVhdGUgdGhlIGlub2RlIHN0cnVjdHVyZS4uLi4KKwkgKi8KKwltZW1zZXQoJmlub2RlLCAwLCBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpKTsKKwlpbm9kZS5pX21vZGUgPSBMSU5VWF9TX0lGRElSIHwgKDA3NzcgJiB+ZnMtPnVtYXNrKTsKKwlpbm9kZS5pX3VpZCA9IGlub2RlLmlfZ2lkID0gMDsKKwlpbm9kZS5pX2Jsb2NrcyA9IGZzLT5ibG9ja3NpemUgLyA1MTI7CisJaW5vZGUuaV9ibG9ja1swXSA9IGJsazsKKwlpbm9kZS5pX2xpbmtzX2NvdW50ID0gMjsKKwlpbm9kZS5pX2N0aW1lID0gaW5vZGUuaV9hdGltZSA9IGlub2RlLmlfbXRpbWUgPSB0aW1lKE5VTEwpOworCWlub2RlLmlfc2l6ZSA9IGZzLT5ibG9ja3NpemU7CisKKwkvKgorCSAqIFdyaXRlIG91dCB0aGUgaW5vZGUgYW5kIGlub2RlIGRhdGEgYmxvY2sKKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGZzLCBibGssIGJsb2NrKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisJcmV0dmFsID0gZXh0MmZzX3dyaXRlX25ld19pbm9kZShmcywgaW5vLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCS8qCisJICogTGluayB0aGUgZGlyZWN0b3J5IGludG8gdGhlIGZpbGVzeXN0ZW0gaGllcmFyY2h5CisJICovCisJaWYgKG5hbWUpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2xvb2t1cChmcywgcGFyZW50LCBuYW1lLCBzdHJsZW4obmFtZSksIDAsCisJCQkJICAgICAgICZzY3JhdGNoX2lubyk7CisJCWlmICghcmV0dmFsKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX0RJUl9FWElTVFM7CisJCQluYW1lID0gMDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAocmV0dmFsICE9IEVYVDJfRVRfRklMRV9OT1RfRk9VTkQpCisJCQlnb3RvIGNsZWFudXA7CisJCXJldHZhbCA9IGV4dDJmc19saW5rKGZzLCBwYXJlbnQsIG5hbWUsIGlubywgRVhUMl9GVF9ESVIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogVXBkYXRlIHBhcmVudCBpbm9kZSdzIGNvdW50cworCSAqLworCWlmIChwYXJlbnQgIT0gaW5vKSB7CisJCXBhcmVudF9pbm9kZS5pX2xpbmtzX2NvdW50Kys7CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShmcywgcGFyZW50LCAmcGFyZW50X2lub2RlKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBhY2NvdW50aW5nLi4uLgorCSAqLworCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgYmxrLCArMSk7CisJZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzMihmcywgaW5vLCArMSwgMSk7CisKK2NsZWFudXA6CisJZXh0MmZzX2ZyZWVfbWVtKCZibG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ta2pvdXJuYWwuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ta2pvdXJuYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDhkOWFiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL21ram91cm5hbC5jCkBAIC0wLDAgKzEsNDI2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBta2pvdXJuYWwuYyAtLS0gbWFrZSBhIGpvdXJuYWwgZm9yIGEgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19JT0NUTF9ICisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKyNpZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgIi4uL2UycC9lMnAuaCIKKyNpbmNsdWRlICIuLi9lMmZzY2suaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKyNpbmNsdWRlICJrZXJuZWwtamJkLmgiCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgc2V0cyB1cCB0aGUgam91cm5hbCBzdXBlcmJsb2NrIGFuZAorICogcmV0dXJucyBpdCBhcyBhbiBhbGxvY2F0ZWQgYmxvY2suCisgKi8KK2VycmNvZGVfdCBleHQyZnNfY3JlYXRlX2pvdXJuYWxfc3VwZXJibG9jayhleHQyX2ZpbHN5cyBmcywKKwkJCQkJICAgX191MzIgc2l6ZSwgaW50IGZsYWdzLAorCQkJCQkgICBjaGFyICAqKnJldF9qc2IpCit7CisJZXJyY29kZV90CQlyZXR2YWw7CisJam91cm5hbF9zdXBlcmJsb2NrX3QJKmpzYjsKKworCWlmIChzaXplIDwgMTAyNCkKKwkJcmV0dXJuIEVYVDJfRVRfSk9VUk5BTF9UT09fU01BTEw7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZqc2IpKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCW1lbXNldCAoanNiLCAwLCBmcy0+YmxvY2tzaXplKTsKKworCWpzYi0+c19oZWFkZXIuaF9tYWdpYyA9IGh0b25sKEpGU19NQUdJQ19OVU1CRVIpOworCWlmIChmbGFncyAmIEVYVDJfTUtKT1VSTkFMX1YxX1NVUEVSKQorCQlqc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlID0gaHRvbmwoSkZTX1NVUEVSQkxPQ0tfVjEpOworCWVsc2UKKwkJanNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSA9IGh0b25sKEpGU19TVVBFUkJMT0NLX1YyKTsKKwlqc2ItPnNfYmxvY2tzaXplID0gaHRvbmwoZnMtPmJsb2Nrc2l6ZSk7CisJanNiLT5zX21heGxlbiA9IGh0b25sKHNpemUpOworCWpzYi0+c19ucl91c2VycyA9IGh0b25sKDEpOworCWpzYi0+c19maXJzdCA9IGh0b25sKDEpOworCWpzYi0+c19zZXF1ZW5jZSA9IGh0b25sKDEpOworCW1lbWNweShqc2ItPnNfdXVpZCwgZnMtPnN1cGVyLT5zX3V1aWQsIHNpemVvZihmcy0+c3VwZXItPnNfdXVpZCkpOworCS8qCisJICogSWYgd2UncmUgY3JlYXRpbmcgYW4gZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UsIHdlIG5lZWQgdG8KKwkgKiBhZGp1c3QgdGhlc2UgZmllbGRzLgorCSAqLworCWlmIChmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikgeworCQlqc2ItPnNfbnJfdXNlcnMgPSAwOworCQlpZiAoZnMtPmJsb2Nrc2l6ZSA9PSAxMDI0KQorCQkJanNiLT5zX2ZpcnN0ID0gaHRvbmwoMyk7CisJCWVsc2UKKwkJCWpzYi0+c19maXJzdCA9IGh0b25sKDIpOworCX0KKworCSpyZXRfanNiID0gKGNoYXIgKikganNiOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBqb3VybmFsIHVzaW5nIFBPU0lYIHJvdXRpbmVzLiAgSXQgaXMgdXNlZAorICogZm9yIGNyZWF0aW5nIGV4dGVybmFsIGpvdXJuYWxzIGFuZCBjcmVhdGluZyBqb3VybmFscyBvbiBsaXZlCisgKiBmaWxlc3lzdGVtcy4KKyAqLworc3RhdGljIGVycmNvZGVfdCB3cml0ZV9qb3VybmFsX2ZpbGUoZXh0Ml9maWxzeXMgZnMsIGNoYXIgKmZpbGVuYW1lLAorCQkJCSAgICBibGtfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwljaGFyCQkqYnVmID0gTlVMTDsKKwlpbnQJCWZkLCByZXRfc2l6ZTsKKwlibGtfdAkJaTsKKworCWlmICgocmV0dmFsID0gZXh0MmZzX2NyZWF0ZV9qb3VybmFsX3N1cGVyYmxvY2soZnMsIHNpemUsIGZsYWdzLCAmYnVmKSkpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBPcGVuIHRoZSBkZXZpY2Ugb3Igam91cm5hbCBmaWxlICovCisJaWYgKChmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZKSkgPCAwKSB7CisJCXJldHZhbCA9IGVycm5vOworCQlnb3RvIGVycm91dDsKKwl9CisKKwkvKiBXcml0ZSB0aGUgc3VwZXJibG9jayBvdXQgKi8KKwlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1dSSVRFOworCXJldF9zaXplID0gd3JpdGUoZmQsIGJ1ZiwgZnMtPmJsb2Nrc2l6ZSk7CisJaWYgKHJldF9zaXplIDwgMCkgeworCQlyZXR2YWwgPSBlcnJubzsKKwkJZ290byBlcnJvdXQ7CisJfQorCWlmIChyZXRfc2l6ZSAhPSAoaW50KSBmcy0+YmxvY2tzaXplKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQoYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKworCWZvciAoaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKKwkJcmV0X3NpemUgPSB3cml0ZShmZCwgYnVmLCBmcy0+YmxvY2tzaXplKTsKKwkJaWYgKHJldF9zaXplIDwgMCkgeworCQkJcmV0dmFsID0gZXJybm87CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQlpZiAocmV0X3NpemUgIT0gKGludCkgZnMtPmJsb2Nrc2l6ZSkKKwkJCWdvdG8gZXJyb3V0OworCX0KKwljbG9zZShmZCk7CisKKwlyZXR2YWwgPSAwOworZXJyb3V0OgorCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBjcmVhdGluZyB0aGUgam91cm5hbCB1c2luZyBkaXJlY3QgSS9PIHJvdXRpbmVzCisgKi8KK3N0cnVjdCBta2pvdXJuYWxfc3RydWN0IHsKKwlpbnQJCW51bV9ibG9ja3M7CisJaW50CQluZXdibG9ja3M7CisJY2hhcgkJKmJ1ZjsKKwllcnJjb2RlX3QJZXJyOworfTsKKworc3RhdGljIGludCBta2pvdXJuYWxfcHJvYyhleHQyX2ZpbHN5cwlmcywKKwkJCSAgIGJsa190CSpibG9ja25yLAorCQkJICAgZTJfYmxrY250X3QJYmxvY2tjbnQsCisJCQkgICBibGtfdAlyZWZfYmxvY2sgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgaW50CQlyZWZfb2Zmc2V0IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIHZvaWQJCSpwcml2X2RhdGEpCit7CisJc3RydWN0IG1ram91cm5hbF9zdHJ1Y3QgKmVzID0gKHN0cnVjdCBta2pvdXJuYWxfc3RydWN0ICopIHByaXZfZGF0YTsKKwlibGtfdAluZXdfYmxrOworCXN0YXRpYyBibGtfdAlsYXN0X2JsayA9IDA7CisJZXJyY29kZV90CXJldHZhbDsKKworCWlmICgqYmxvY2tucikgeworCQlsYXN0X2JsayA9ICpibG9ja25yOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dmFsID0gZXh0MmZzX25ld19ibG9jayhmcywgbGFzdF9ibGssIDAsICZuZXdfYmxrKTsKKwlpZiAocmV0dmFsKSB7CisJCWVzLT5lcnIgPSByZXR2YWw7CisJCXJldHVybiBCTE9DS19BQk9SVDsKKwl9CisJaWYgKGJsb2NrY250ID4gMCkKKwkJZXMtPm51bV9ibG9ja3MtLTsKKworCWVzLT5uZXdibG9ja3MrKzsKKwlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIG5ld19ibGssIDEsIGVzLT5idWYpOworCisJaWYgKGJsb2NrY250ID09IDApCisJCW1lbXNldChlcy0+YnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKworCWlmIChyZXR2YWwpIHsKKwkJZXMtPmVyciA9IHJldHZhbDsKKwkJcmV0dXJuIEJMT0NLX0FCT1JUOworCX0KKwkqYmxvY2tuciA9IG5ld19ibGs7CisJbGFzdF9ibGsgPSBuZXdfYmxrOworCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgbmV3X2JsaywgKzEpOworCisJaWYgKGVzLT5udW1fYmxvY2tzID09IDApCisJCXJldHVybiAoQkxPQ0tfQ0hBTkdFRCB8IEJMT0NLX0FCT1JUKTsKKwllbHNlCisJCXJldHVybiBCTE9DS19DSEFOR0VEOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgam91cm5hbCB1c2luZyBkaXJlY3QgSS9PIHJvdXRpbmVzLgorICovCitzdGF0aWMgZXJyY29kZV90IHdyaXRlX2pvdXJuYWxfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3Qgam91cm5hbF9pbm8sCisJCQkJICAgICBibGtfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJY2hhcgkJCSpidWY7CisJZXJyY29kZV90CQlyZXR2YWw7CisJc3RydWN0IGV4dDJfaW5vZGUJaW5vZGU7CisJc3RydWN0IG1ram91cm5hbF9zdHJ1Y3QJZXM7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19jcmVhdGVfam91cm5hbF9zdXBlcmJsb2NrKGZzLCBzaXplLCBmbGFncywgJmJ1ZikpKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKChyZXR2YWwgPSBleHQyZnNfcmVhZF9iaXRtYXBzKGZzKSkpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBqb3VybmFsX2lubywgJmlub2RlKSkpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoaW5vZGUuaV9ibG9ja3MgPiAwKQorCQlyZXR1cm4gRUVYSVNUOworCisJZXMubnVtX2Jsb2NrcyA9IHNpemU7CisJZXMubmV3YmxvY2tzID0gMDsKKwllcy5idWYgPSBidWY7CisJZXMuZXJyID0gMDsKKworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgam91cm5hbF9pbm8sIEJMT0NLX0ZMQUdfQVBQRU5ELAorCQkJCSAgICAgICAwLCBta2pvdXJuYWxfcHJvYywgJmVzKTsKKwlpZiAoZXMuZXJyKSB7CisJCXJldHZhbCA9IGVzLmVycjsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJaWYgKChyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgam91cm5hbF9pbm8sICZpbm9kZSkpKQorCQlnb3RvIGVycm91dDsKKworCWlub2RlLmlfc2l6ZSArPSBmcy0+YmxvY2tzaXplICogc2l6ZTsKKwlpbm9kZS5pX2Jsb2NrcyArPSAoZnMtPmJsb2Nrc2l6ZSAvIDUxMikgKiBlcy5uZXdibG9ja3M7CisJaW5vZGUuaV9tdGltZSA9IGlub2RlLmlfY3RpbWUgPSB0aW1lKE5VTEwpOworCWlub2RlLmlfbGlua3NfY291bnQgPSAxOworCWlub2RlLmlfbW9kZSA9IExJTlVYX1NfSUZSRUcgfCAwNjAwOworCisJaWYgKChyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIGpvdXJuYWxfaW5vLCAmaW5vZGUpKSkKKwkJZ290byBlcnJvdXQ7CisJcmV0dmFsID0gMDsKKworCW1lbWNweShmcy0+c3VwZXItPnNfam5sX2Jsb2NrcywgaW5vZGUuaV9ibG9jaywgRVhUMl9OX0JMT0NLUyo0KTsKKwlmcy0+c3VwZXItPnNfam5sX2Jsb2Nrc1sxNl0gPSBpbm9kZS5pX3NpemU7CisJZnMtPnN1cGVyLT5zX2pubF9iYWNrdXBfdHlwZSA9IEVYVDNfSk5MX0JBQ0tVUF9CTE9DS1M7CisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCitlcnJvdXQ6CisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBqb3VybmFsIGRldmljZSB0byBhIGZpbGVzeXN0ZW0KKyAqLworZXJyY29kZV90IGV4dDJmc19hZGRfam91cm5hbF9kZXZpY2UoZXh0Ml9maWxzeXMgZnMsIGV4dDJfZmlsc3lzIGpvdXJuYWxfZGV2KQoreworCXN0cnVjdCBzdGF0CXN0OworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhcgkJYnVmWzEwMjRdOworCWpvdXJuYWxfc3VwZXJibG9ja190CSpqc2I7CisJaW50CQlzdGFydDsKKwlfX3UzMgkJaSwgbnJfdXNlcnM7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGRldmljZSBleGlzdHMgYW5kIGlzIGEgYmxvY2sgZGV2aWNlICovCisJaWYgKHN0YXQoam91cm5hbF9kZXYtPmRldmljZV9uYW1lLCAmc3QpIDwgMCkKKwkJcmV0dXJuIGVycm5vOworCisJaWYgKCFTX0lTQkxLKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gRVhUMl9FVF9KT1VSTkFMX05PVF9CTE9DSzsgLyogTXVzdCBiZSBhIGJsb2NrIGRldmljZSAqLworCisJLyogR2V0IHRoZSBqb3VybmFsIHN1cGVyYmxvY2sgKi8KKwlzdGFydCA9IDE7CisJaWYgKGpvdXJuYWxfZGV2LT5ibG9ja3NpemUgPT0gMTAyNCkKKwkJc3RhcnQrKzsKKwlpZiAoKHJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoam91cm5hbF9kZXYtPmlvLCBzdGFydCwgLTEwMjQsIGJ1ZikpKQorCQlyZXR1cm4gcmV0dmFsOworCisJanNiID0gKGpvdXJuYWxfc3VwZXJibG9ja190ICopIGJ1ZjsKKwlpZiAoKGpzYi0+c19oZWFkZXIuaF9tYWdpYyAhPSAodW5zaWduZWQpIG50b2hsKEpGU19NQUdJQ19OVU1CRVIpKSB8fAorCSAgICAoanNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSAhPSAodW5zaWduZWQpIG50b2hsKEpGU19TVVBFUkJMT0NLX1YyKSkpCisJCXJldHVybiBFWFQyX0VUX05PX0pPVVJOQUxfU0I7CisKKwlpZiAobnRvaGwoanNiLT5zX2Jsb2Nrc2l6ZSkgIT0gKHVuc2lnbmVkIGxvbmcpIGZzLT5ibG9ja3NpemUpCisJCXJldHVybiBFWFQyX0VUX1VORVhQRUNURURfQkxPQ0tfU0laRTsKKworCS8qIENoZWNrIGFuZCBzZWUgaWYgdGhpcyBmaWxlc3lzdGVtIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgKi8KKwlucl91c2VycyA9IG50b2hsKGpzYi0+c19ucl91c2Vycyk7CisJZm9yIChpPTA7IGkgPCBucl91c2VyczsgaSsrKSB7CisJCWlmIChtZW1jbXAoZnMtPnN1cGVyLT5zX3V1aWQsCisJCQkgICAmanNiLT5zX3VzZXJzW2kqMTZdLCAxNikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA+PSBucl91c2VycykgeworCQltZW1jcHkoJmpzYi0+c191c2Vyc1tucl91c2VycyoxNl0sCisJCSAgICAgICBmcy0+c3VwZXItPnNfdXVpZCwgMTYpOworCQlqc2ItPnNfbnJfdXNlcnMgPSBodG9ubChucl91c2VycysxKTsKKwl9CisKKwkvKiBXcml0ZWJhY2sgdGhlIGpvdXJuYWwgc3VwZXJibG9jayAqLworCWlmICgocmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoam91cm5hbF9kZXYtPmlvLCBzdGFydCwgLTEwMjQsIGJ1ZikpKQorCQlyZXR1cm4gcmV0dmFsOworCisJZnMtPnN1cGVyLT5zX2pvdXJuYWxfaW51bSA9IDA7CisJZnMtPnN1cGVyLT5zX2pvdXJuYWxfZGV2ID0gc3Quc3RfcmRldjsKKwltZW1jcHkoZnMtPnN1cGVyLT5zX2pvdXJuYWxfdXVpZCwganNiLT5zX3V1aWQsCisJICAgICAgIHNpemVvZihmcy0+c3VwZXItPnNfam91cm5hbF91dWlkKSk7CisJZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0IHw9IEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUw7CisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBhZGRzIGEgam91cm5hbCBpbm9kZSB0byBhIGZpbGVzeXN0ZW0sIHVzaW5nIGVpdGhlcgorICogUE9TSVggcm91dGluZXMgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCwgb3IgdXNpbmcgZGlyZWN0IEkvTworICogZnVuY3Rpb25zIGlmIGl0IGlzIG5vdC4KKyAqLworZXJyY29kZV90IGV4dDJmc19hZGRfam91cm5hbF9pbm9kZShleHQyX2ZpbHN5cyBmcywgYmxrX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWVycmNvZGVfdAkJcmV0dmFsOworCWV4dDJfaW5vX3QJCWpvdXJuYWxfaW5vOworCXN0cnVjdCBzdGF0CQlzdDsKKwljaGFyCQkJamZpbGVbMTAyNF07CisJaW50CQkJZmQsIG1vdW50X2ZsYWdzLCBmOworCisJcmV0dmFsID0gZXh0MmZzX2NoZWNrX21vdW50X3BvaW50KGZzLT5kZXZpY2VfbmFtZSwgJm1vdW50X2ZsYWdzLAorCQkJCQkgICAgICAgamZpbGUsIHNpemVvZihqZmlsZSktMTApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAobW91bnRfZmxhZ3MgJiBFWFQyX01GX01PVU5URUQpIHsKKwkJc3RyY2F0KGpmaWxlLCAiLy5qb3VybmFsIik7CisKKwkJLyoKKwkJICogSWYgLi4uLy5qb3VybmFsIGFscmVhZHkgZXhpc3RzLCBtYWtlIHN1cmUgYW55CisJCSAqIGltbXV0YWJsZSBvciBhcHBlbmQtb25seSBmbGFncyBhcmUgY2xlYXJlZC4KKwkJICovCisjaWYgZGVmaW5lZChIQVZFX0NIRkxBR1MpICYmIGRlZmluZWQoVUZfTk9EVU1QKQorCQkodm9pZCkgY2hmbGFncyAoamZpbGUsIDApOworI2Vsc2UKKyNpZiBIQVZFX0VYVDJfSU9DVExTCisJCWZkID0gb3BlbihqZmlsZSwgT19SRE9OTFkpOworCQlpZiAoZmQgPj0gMCkgeworCQkJZiA9IDA7CisJCQlpb2N0bChmZCwgRVhUMl9JT0NfU0VURkxBR1MsICZmKTsKKwkJCWNsb3NlKGZkKTsKKwkJfQorI2VuZGlmCisjZW5kaWYKKworCQkvKiBDcmVhdGUgdGhlIGpvdXJuYWwgZmlsZSAqLworCQlpZiAoKGZkID0gb3BlbihqZmlsZSwgT19DUkVBVHxPX1dST05MWSwgMDYwMCkpIDwgMCkKKwkJCXJldHVybiBlcnJubzsKKworCQlpZiAoKHJldHZhbCA9IHdyaXRlX2pvdXJuYWxfZmlsZShmcywgamZpbGUsIHNpemUsIGZsYWdzKSkpCisJCQlnb3RvIGVycm91dDsKKworCQkvKiBHZXQgaW5vZGUgbnVtYmVyIG9mIHRoZSBqb3VybmFsIGZpbGUgKi8KKwkJaWYgKGZzdGF0KGZkLCAmc3QpIDwgMCkKKwkJCWdvdG8gZXJyb3V0OworCisjaWYgZGVmaW5lZChIQVZFX0NIRkxBR1MpICYmIGRlZmluZWQoVUZfTk9EVU1QKQorCQlyZXR2YWwgPSBmY2hmbGFncyAoZmQsIFVGX05PRFVNUHxVRl9JTU1VVEFCTEUpOworI2Vsc2UKKyNpZiBIQVZFX0VYVDJfSU9DVExTCisJCWYgPSBFWFQyX05PRFVNUF9GTCB8IEVYVDJfSU1NVVRBQkxFX0ZMOworCQlyZXR2YWwgPSBpb2N0bChmZCwgRVhUMl9JT0NfU0VURkxBR1MsICZmKTsKKyNlbmRpZgorI2VuZGlmCisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKworCQljbG9zZShmZCk7CisJCWpvdXJuYWxfaW5vID0gc3Quc3RfaW5vOworCX0gZWxzZSB7CisJCWpvdXJuYWxfaW5vID0gRVhUMl9KT1VSTkFMX0lOTzsKKwkJaWYgKChyZXR2YWwgPSB3cml0ZV9qb3VybmFsX2lub2RlKGZzLCBqb3VybmFsX2lubywKKwkJCQkJCSAgc2l6ZSwgZmxhZ3MpKSkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJZnMtPnN1cGVyLT5zX2pvdXJuYWxfaW51bSA9IGpvdXJuYWxfaW5vOworCWZzLT5zdXBlci0+c19qb3VybmFsX2RldiA9IDA7CisJbWVtc2V0KGZzLT5zdXBlci0+c19qb3VybmFsX3V1aWQsIDAsCisJICAgICAgIHNpemVvZihmcy0+c3VwZXItPnNfam91cm5hbF91dWlkKSk7CisJZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0IHw9IEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUw7CisKKwlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJcmV0dXJuIDA7CitlcnJvdXQ6CisJY2xvc2UoZmQpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBERUJVRworbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwljaGFyCQkqZGV2aWNlX25hbWU7CisJZXh0Ml9maWxzeXMJZnM7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgZmlsZXN5c3RlbVxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCWRldmljZV9uYW1lID0gYXJndlsxXTsKKworCXJldHZhbCA9IGV4dDJmc19vcGVuIChkZXZpY2VfbmFtZSwgRVhUMl9GTEFHX1JXLCAwLCAwLAorCQkJICAgICAgdW5peF9pb19tYW5hZ2VyLCAmZnMpOworCWlmIChyZXR2YWwpIHsKKwkJY29tX2Vycihhcmd2WzBdLCByZXR2YWwsICJ3aGlsZSBvcGVuaW5nICVzIiwgZGV2aWNlX25hbWUpOworCQlleGl0KDEpOworCX0KKworCXJldHZhbCA9IGV4dDJmc19hZGRfam91cm5hbF9pbm9kZShmcywgMTAyNCk7CisJaWYgKHJldHZhbCkgeworCQljb21fZXJyKGFyZ3ZbMF0sIHJldHZhbCwgIndoaWxlIGFkZGluZyBqb3VybmFsIHRvICVzIiwKKwkJCWRldmljZV9uYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJcmV0dmFsID0gZXh0MmZzX2ZsdXNoKGZzKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ZigiV2FybmluZywgaGFkIHRyb3VibGUgd3JpdGluZyBvdXQgc3VwZXJibG9ja3MuXG4iKTsKKwl9CisJZXh0MmZzX2Nsb3NlKGZzKTsKKwlleGl0KDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbmFtZWkuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MjQ0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbmFtZWkuYwpAQCAtMCwwICsxLDIwNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbmFtZWkuYyAtLS0gZXh0MmZzIGRpcmVjdG9yeSBsb29rdXAgb3BlcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NCwgMTk5NSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKy8qICNkZWZpbmUgTkFNRUlfREVCVUcgKi8KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RhdGljIGVycmNvZGVfdCBvcGVuX25hbWVpKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHJvb3QsIGV4dDJfaW5vX3QgYmFzZSwKKwkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgc2l6ZV90IHBhdGhsZW4sIGludCBmb2xsb3csCisJCQkgICAgaW50IGxpbmtfY291bnQsIGNoYXIgKmJ1ZiwgZXh0Ml9pbm9fdCAqcmVzX2lub2RlKTsKKworc3RhdGljIGVycmNvZGVfdCBmb2xsb3dfbGluayhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCByb290LCBleHQyX2lub190IGRpciwKKwkJCSAgICAgZXh0Ml9pbm9fdCBpbm9kZSwgaW50IGxpbmtfY291bnQsCisJCQkgICAgIGNoYXIgKmJ1ZiwgZXh0Ml9pbm9fdCAqcmVzX2lub2RlKQoreworCWNoYXIgKnBhdGhuYW1lOworCWNoYXIgKmJ1ZmZlciA9IE5VTEw7CisJZXJyY29kZV90IHJldHZhbDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSBlaTsKKworI2lmZGVmIE5BTUVJX0RFQlVHCisJcHJpbnRmKCJmb2xsb3dfbGluazogcm9vdD0lbHUsIGRpcj0lbHUsIGlub2RlPSVsdSwgbGM9JWRcbiIsCisJICAgICAgIHJvb3QsIGRpciwgaW5vZGUsIGxpbmtfY291bnQpOworCisjZW5kaWYKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZSAoZnMsIGlub2RlLCAmZWkpOworCWlmIChyZXR2YWwpIHJldHVybiByZXR2YWw7CisJaWYgKCFMSU5VWF9TX0lTTE5LIChlaS5pX21vZGUpKSB7CisJCSpyZXNfaW5vZGUgPSBpbm9kZTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChsaW5rX2NvdW50KysgPiA1KSB7CisJCXJldHVybiBFWFQyX0VUX1NZTUxJTktfTE9PUDsKKwl9CisJaWYgKGV4dDJmc19pbm9kZV9kYXRhX2Jsb2NrcyhmcywgJmVpKSkgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmYnVmZmVyKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBlaS5pX2Jsb2NrWzBdLCAxLCBidWZmZXIpOworCQlpZiAocmV0dmFsKSB7CisJCQlleHQyZnNfZnJlZV9tZW0oJmJ1ZmZlcik7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXBhdGhuYW1lID0gYnVmZmVyOworCX0gZWxzZQorCQlwYXRobmFtZSA9IChjaGFyICopJihlaS5pX2Jsb2NrWzBdKTsKKwlyZXR2YWwgPSBvcGVuX25hbWVpKGZzLCByb290LCBkaXIsIHBhdGhuYW1lLCBlaS5pX3NpemUsIDEsCisJCQkgICAgbGlua19jb3VudCwgYnVmLCByZXNfaW5vZGUpOworCWV4dDJmc19mcmVlX21lbSgmYnVmZmVyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGludGVycHJldHMgYSBwYXRobmFtZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudAorICogZGlyZWN0b3J5IGFuZCB0aGUgcm9vdCBkaXJlY3RvcnksIGFuZCByZXR1cm5zIHRoZSBpbm9kZSBvZiB0aGUKKyAqIGNvbnRhaW5pbmcgZGlyZWN0b3J5LCBhbmQgYSBwb2ludGVyIHRvIHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZQorICogKHBvaW50aW5nIGludG8gdGhlIHBhdGhuYW1lKSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZW5hbWUuCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgZGlyX25hbWVpKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHJvb3QsIGV4dDJfaW5vX3QgZGlyLAorCQkJICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBwYXRobGVuLAorCQkJICAgaW50IGxpbmtfY291bnQsIGNoYXIgKmJ1ZiwKKwkJCSAgIGNvbnN0IGNoYXIgKipuYW1lLCBpbnQgKm5hbWVsZW4sCisJCQkgICBleHQyX2lub190ICpyZXNfaW5vZGUpCit7CisJY2hhciBjOworCWNvbnN0IGNoYXIgKnRoaXNuYW1lOworCWludCBsZW47CisJZXh0Ml9pbm9fdCBpbm9kZTsKKwllcnJjb2RlX3QgcmV0dmFsOworCisJaWYgKChjID0gKnBhdGhuYW1lKSA9PSAnLycpIHsKKwkJZGlyID0gcm9vdDsKKwkJcGF0aG5hbWUrKzsKKwkJcGF0aGxlbi0tOworCX0KKwl3aGlsZSAoMSkgeworCQl0aGlzbmFtZSA9IHBhdGhuYW1lOworCQlmb3IgKGxlbj0wOyAtLXBhdGhsZW4gPj0gMDtsZW4rKykgeworCQkJYyA9ICoocGF0aG5hbWUrKyk7CisJCQlpZiAoYyA9PSAnLycpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBhdGhsZW4gPCAwKQorCQkJYnJlYWs7CisJCXJldHZhbCA9IGV4dDJmc19sb29rdXAgKGZzLCBkaXIsIHRoaXNuYW1lLCBsZW4sIGJ1ZiwgJmlub2RlKTsKKwkJaWYgKHJldHZhbCkgcmV0dXJuIHJldHZhbDsKKwkJcmV0dmFsID0gZm9sbG93X2xpbmsgKGZzLCByb290LCBkaXIsIGlub2RlLAorCQkJCSAgICAgIGxpbmtfY291bnQsIGJ1ZiwgJmRpcik7CisJCWlmIChyZXR2YWwpIHJldHVybiByZXR2YWw7CisJfQorCSpuYW1lID0gdGhpc25hbWU7CisJKm5hbWVsZW4gPSBsZW47CisJKnJlc19pbm9kZSA9IGRpcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBvcGVuX25hbWVpKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHJvb3QsIGV4dDJfaW5vX3QgYmFzZSwKKwkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgc2l6ZV90IHBhdGhsZW4sIGludCBmb2xsb3csCisJCQkgICAgaW50IGxpbmtfY291bnQsIGNoYXIgKmJ1ZiwgZXh0Ml9pbm9fdCAqcmVzX2lub2RlKQoreworCWNvbnN0IGNoYXIgKmJhc2VuYW1lOworCWludCBuYW1lbGVuOworCWV4dDJfaW5vX3QgZGlyLCBpbm9kZTsKKwllcnJjb2RlX3QgcmV0dmFsOworCisjaWZkZWYgTkFNRUlfREVCVUcKKwlwcmludGYoIm9wZW5fbmFtZWk6IHJvb3Q9JWx1LCBkaXI9JWx1LCBwYXRoPSUqcywgbGM9JWRcbiIsCisJICAgICAgIHJvb3QsIGJhc2UsIHBhdGhsZW4sIHBhdGhuYW1lLCBsaW5rX2NvdW50KTsKKyNlbmRpZgorCXJldHZhbCA9IGRpcl9uYW1laShmcywgcm9vdCwgYmFzZSwgcGF0aG5hbWUsIHBhdGhsZW4sCisJCQkgICBsaW5rX2NvdW50LCBidWYsICZiYXNlbmFtZSwgJm5hbWVsZW4sICZkaXIpOworCWlmIChyZXR2YWwpIHJldHVybiByZXR2YWw7CisJaWYgKCFuYW1lbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbCBjYXNlOiAnL3Vzci8nIGV0YyAqLworCQkqcmVzX2lub2RlPWRpcjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IGV4dDJmc19sb29rdXAgKGZzLCBkaXIsIGJhc2VuYW1lLCBuYW1lbGVuLCBidWYsICZpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAoZm9sbG93KSB7CisJCXJldHZhbCA9IGZvbGxvd19saW5rKGZzLCByb290LCBkaXIsIGlub2RlLCBsaW5rX2NvdW50LAorCQkJCSAgICAgYnVmLCAmaW5vZGUpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisjaWZkZWYgTkFNRUlfREVCVUcKKwlwcmludGYoIm9wZW5fbmFtZWk6IChsaW5rX2NvdW50PSVkKSByZXR1cm5zICVsdVxuIiwKKwkgICAgICAgbGlua19jb3VudCwgaW5vZGUpOworI2VuZGlmCisJKnJlc19pbm9kZSA9IGlub2RlOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX25hbWVpKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHJvb3QsIGV4dDJfaW5vX3QgY3dkLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgZXh0Ml9pbm9fdCAqaW5vZGUpCit7CisJY2hhciAqYnVmOworCWVycmNvZGVfdCByZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IG9wZW5fbmFtZWkoZnMsIHJvb3QsIGN3ZCwgbmFtZSwgc3RybGVuKG5hbWUpLCAwLCAwLAorCQkJICAgIGJ1ZiwgaW5vZGUpOworCisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfbmFtZWlfZm9sbG93KGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHJvb3QsIGV4dDJfaW5vX3QgY3dkLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgZXh0Ml9pbm9fdCAqaW5vZGUpCit7CisJY2hhciAqYnVmOworCWVycmNvZGVfdCByZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IG9wZW5fbmFtZWkoZnMsIHJvb3QsIGN3ZCwgbmFtZSwgc3RybGVuKG5hbWUpLCAxLCAwLAorCQkJICAgIGJ1ZiwgaW5vZGUpOworCisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZm9sbG93X2xpbmsoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3Qgcm9vdCwgZXh0Ml9pbm9fdCBjd2QsCisJCQlleHQyX2lub190IGlub2RlLCBleHQyX2lub190ICpyZXNfaW5vZGUpCit7CisJY2hhciAqYnVmOworCWVycmNvZGVfdCByZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGZvbGxvd19saW5rKGZzLCByb290LCBjd2QsIGlub2RlLCAwLCBidWYsIHJlc19pbm9kZSk7CisKKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9uZXdkaXIuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9uZXdkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE1NjYyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL25ld2Rpci5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG5ld2Rpci5jIC0tLSBjcmVhdGUgYSBuZXcgZGlyZWN0b3J5IGJsb2NrCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworI2lmbmRlZiBFWFQyX0ZUX0RJUgorI2RlZmluZSBFWFQyX0ZUX0RJUgkJMgorI2VuZGlmCisKKy8qCisgKiBDcmVhdGUgbmV3IGRpcmVjdG9yeSBibG9jaworICovCitlcnJjb2RlX3QgZXh0MmZzX25ld19kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgZGlyX2lubywKKwkJCSAgICAgICBleHQyX2lub190IHBhcmVudF9pbm8sIGNoYXIgKipibG9jaykKK3sKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkJKmRpciA9IE5VTEw7CisJZXJyY29kZV90CQlyZXR2YWw7CisJY2hhcgkJCSpidWY7CisJaW50CQkJcmVjX2xlbjsKKwlpbnQJCQlmaWxldHlwZSA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZW1zZXQoYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKwlkaXIgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIGJ1ZjsKKwlkaXItPnJlY19sZW4gPSBmcy0+YmxvY2tzaXplOworCisJaWYgKGRpcl9pbm8pIHsKKwkJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkJICAgIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkKKwkJCWZpbGV0eXBlID0gRVhUMl9GVF9ESVIgPDwgODsKKwkJLyoKKwkJICogU2V0IHVwIGVudHJ5IGZvciAnLicKKwkJICovCisJCWRpci0+aW5vZGUgPSBkaXJfaW5vOworCQlkaXItPm5hbWVfbGVuID0gMSB8IGZpbGV0eXBlOworCQlkaXItPm5hbWVbMF0gPSAnLic7CisJCXJlY19sZW4gPSBkaXItPnJlY19sZW4gLSBFWFQyX0RJUl9SRUNfTEVOKDEpOworCQlkaXItPnJlY19sZW4gPSBFWFQyX0RJUl9SRUNfTEVOKDEpOworCisJCS8qCisJCSAqIFNldCB1cCBlbnRyeSBmb3IgJy4uJworCQkgKi8KKwkJZGlyID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSAoYnVmICsgZGlyLT5yZWNfbGVuKTsKKwkJZGlyLT5yZWNfbGVuID0gcmVjX2xlbjsKKwkJZGlyLT5pbm9kZSA9IHBhcmVudF9pbm87CisJCWRpci0+bmFtZV9sZW4gPSAyIHwgZmlsZXR5cGU7CisJCWRpci0+bmFtZVswXSA9ICcuJzsKKwkJZGlyLT5uYW1lWzFdID0gJy4nOworCX0KKwkqYmxvY2sgPSBidWY7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvb3BlbmZzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvb3BlbmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyNzExOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9vcGVuZnMuYwpAQCAtMCwwICsxLDMzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogb3BlbmZzLmMgLS0tIG9wZW4gYW4gZXh0MiBmaWxlc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisKKworI2luY2x1ZGUgImV4dDJmcy5oIgorI2luY2x1ZGUgImUyaW1hZ2UuaCIKKworYmxrX3QgZXh0MmZzX2Rlc2NyaXB0b3JfYmxvY2tfbG9jKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBncm91cF9ibG9jaywgZGdycF90IGkpCit7CisJaW50CWJnOworCWludAloYXNfc3VwZXIgPSAwOworCWludAlyZXRfYmxrOworCisJaWYgKCEoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykgfHwKKwkgICAgKGkgPCBmcy0+c3VwZXItPnNfZmlyc3RfbWV0YV9iZykpCisJCXJldHVybiAoZ3JvdXBfYmxvY2sgKyBpICsgMSk7CisKKwliZyA9IChmcy0+YmxvY2tzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKSkgKiBpOworCWlmIChleHQyZnNfYmdfaGFzX3N1cGVyKGZzLCBiZykpCisJCWhhc19zdXBlciA9IDE7CisJcmV0X2JsayA9IChmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayArIGhhc19zdXBlciArCisJCSAgIChiZyAqIGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKSk7CisJLyoKKwkgKiBJZiBncm91cF9ibG9jayBpcyBub3QgdGhlIG5vcm1hbCB2YWx1ZSwgd2UncmUgdHJ5aW5nIHRvIHVzZQorCSAqIHRoZSBiYWNrdXAgZ3JvdXAgZGVzY3JpcHRvcnMgYW5kIHN1cGVyYmxvY2sgLS0tIHNvIHVzZSB0aGUKKwkgKiBhbHRlcm5hdGUgbG9jYXRpb24gb2YgdGhlIHNlY29uZCBibG9jayBncm91cCBpbiB0aGUKKwkgKiBtZXRhYmxvY2sgZ3JvdXAuICBJZGVhbGx5IHdlIHNob3VsZCBiZSB0ZXN0aW5nIGVhY2ggYmcKKwkgKiBkZXNjcmlwdG9yIGJsb2NrIGluZGl2aWR1YWxseSBmb3IgY29ycmVjdG5lc3MsIGJ1dCB3ZSBkb24ndAorCSAqIGhhdmUgdGhlIGluZnJhc3RydWN0dXJlIGluIHBsYWNlIHRvIGRvIHRoYXQuCisJICovCisJaWYgKGdyb3VwX2Jsb2NrICE9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrICYmCisJICAgICgocmV0X2JsayArIGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKSA8CisJICAgICBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSkKKwkJcmV0X2JsayArPSBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKKwlyZXR1cm4gcmV0X2JsazsKK30KKworZXJyY29kZV90IGV4dDJmc19vcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywgaW50IHN1cGVyYmxvY2ssCisJCSAgICAgIHVuc2lnbmVkIGludCBibG9ja19zaXplLCBpb19tYW5hZ2VyIG1hbmFnZXIsCisJCSAgICAgIGV4dDJfZmlsc3lzICpyZXRfZnMpCit7CisJcmV0dXJuIGV4dDJmc19vcGVuMihuYW1lLCAwLCBmbGFncywgc3VwZXJibG9jaywgYmxvY2tfc2l6ZSwKKwkJCSAgICBtYW5hZ2VyLCByZXRfZnMpOworfQorCisvKgorICogIE5vdGU6IGlmIHN1cGVyYmxvY2sgaXMgbm9uLXplcm8sIGJsb2NrLXNpemUgbXVzdCBhbHNvIGJlIG5vbi16ZXJvLgorICoJU3VwZXJibG9jayBhbmQgYmxvY2tfc2l6ZSBjYW4gYmUgemVybyB0byB1c2UgdGhlIGRlZmF1bHQgc2l6ZS4KKyAqCisgKiBWYWxpZCBmbGFncyBmb3IgZXh0MmZzX29wZW4oKQorICoKKyAqCUVYVDJfRkxBR19SVwktIE9wZW4gdGhlIGZpbGVzeXN0ZW0gZm9yIHJlYWQvd3JpdGUuCisgKglFWFQyX0ZMQUdfRk9SQ0UgLSBPcGVuIHRoZSBmaWxlc3lzdGVtIGV2ZW4gaWYgc29tZSBvZiB0aGUKKyAqCQkJCWZlYXR1cmVzIGFyZW4ndCBzdXBwb3J0ZWQuCisgKglFWFQyX0ZMQUdfSk9VUk5BTF9ERVZfT0sgLSBPcGVuIGFuIGV4dDMgam91cm5hbCBkZXZpY2UKKyAqLworZXJyY29kZV90IGV4dDJmc19vcGVuMihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICppb19vcHRpb25zLAorCQkgICAgICAgaW50IGZsYWdzLCBpbnQgc3VwZXJibG9jaywKKwkJICAgICAgIHVuc2lnbmVkIGludCBibG9ja19zaXplLCBpb19tYW5hZ2VyIG1hbmFnZXIsCisJCSAgICAgICBleHQyX2ZpbHN5cyAqcmV0X2ZzKQoreworCWV4dDJfZmlsc3lzCWZzOworCWVycmNvZGVfdAlyZXR2YWw7CisJdW5zaWduZWQgbG9uZwlpOworCWludAkJZ3JvdXBzX3Blcl9ibG9jaywgYmxvY2tzX3Blcl9ncm91cDsKKwlibGtfdAkJZ3JvdXBfYmxvY2ssIGJsazsKKwljaGFyCQkqZGVzdCwgKmNwOworI2lmIEJCX0JJR19FTkRJQU4KKwlpbnQgajsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpnZHA7CisjZW5kaWYKKworCUVYVDJfQ0hFQ0tfTUFHSUMobWFuYWdlciwgRVhUMl9FVF9NQUdJQ19JT19NQU5BR0VSKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3Qgc3RydWN0X2V4dDJfZmlsc3lzKSwgJmZzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJbWVtc2V0KGZzLCAwLCBzaXplb2Yoc3RydWN0IHN0cnVjdF9leHQyX2ZpbHN5cykpOworCWZzLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUzsKKwlmcy0+ZmxhZ3MgPSBmbGFnczsKKwlmcy0+dW1hc2sgPSAwMjI7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKG5hbWUpKzEsICZmcy0+ZGV2aWNlX25hbWUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwlzdHJjcHkoZnMtPmRldmljZV9uYW1lLCBuYW1lKTsKKwljcCA9IHN0cmNocihmcy0+ZGV2aWNlX25hbWUsICc/Jyk7CisJaWYgKCFpb19vcHRpb25zICYmIGNwKSB7CisJCSpjcCsrID0gMDsKKwkJaW9fb3B0aW9ucyA9IGNwOworCX0KKworCXJldHZhbCA9IG1hbmFnZXItPm9wZW4oZnMtPmRldmljZV9uYW1lLAorCQkJICAgICAgIChmbGFncyAmIEVYVDJfRkxBR19SVykgPyBJT19GTEFHX1JXIDogMCwKKwkJCSAgICAgICAmZnMtPmlvKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisJaWYgKGlvX29wdGlvbnMgJiYKKwkgICAgKHJldHZhbCA9IGlvX2NoYW5uZWxfc2V0X29wdGlvbnMoZnMtPmlvLCBpb19vcHRpb25zKSkpCisJCWdvdG8gY2xlYW51cDsKKwlmcy0+aW1hZ2VfaW8gPSBmcy0+aW87CisJZnMtPmlvLT5hcHBfZGF0YSA9IGZzOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKFNVUEVSQkxPQ0tfU0laRSwgJmZzLT5zdXBlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCWlmIChmbGFncyAmIEVYVDJfRkxBR19JTUFHRV9GSUxFKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0Ml9pbWFnZV9oZHIpLAorCQkJCQkmZnMtPmltYWdlX2hlYWRlcik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCAwLAorCQkJCQkgICAgIC0oaW50KXNpemVvZihzdHJ1Y3QgZXh0Ml9pbWFnZV9oZHIpLAorCQkJCQkgICAgIGZzLT5pbWFnZV9oZWFkZXIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworCQlpZiAoZnMtPmltYWdlX2hlYWRlci0+bWFnaWNfbnVtYmVyICE9IEVYVDJfRVRfTUFHSUNfRTJJTUFHRSkKKwkJCXJldHVybiBFWFQyX0VUX01BR0lDX0UySU1BR0U7CisJCXN1cGVyYmxvY2sgPSAxOworCQlibG9ja19zaXplID0gZnMtPmltYWdlX2hlYWRlci0+ZnNfYmxvY2tzaXplOworCX0KKworCS8qCisJICogSWYgdGhlIHVzZXIgc3BlY2lmaWVzIGEgc3BlY2lmaWMgYmxvY2sgIyBmb3IgdGhlCisJICogc3VwZXJibG9jaywgdGhlbiBoZS9zaGUgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIGJsb2NrIHNpemUhCisJICogT3RoZXJ3aXNlLCByZWFkIHRoZSBtYXN0ZXIgc3VwZXJibG9jayBsb2NhdGVkIGF0IG9mZnNldAorCSAqIFNVUEVSQkxPQ0tfT0ZGU0VUIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYXJ0aXRpb24uCisJICoKKwkgKiBOb3RlOiB3ZSBvbmx5IHNhdmUgYSBiYWNrdXAgY29weSBvZiB0aGUgc3VwZXJibG9jayBpZiB3ZQorCSAqIGFyZSByZWFkaW5nIHRoZSBzdXBlcmJsb2NrIGZyb20gdGhlIHByaW1hcnkgc3VwZXJibG9jayBsb2NhdGlvbi4KKwkgKi8KKwlpZiAoc3VwZXJibG9jaykgeworCQlpZiAoIWJsb2NrX3NpemUpIHsKKwkJCXJldHZhbCA9IEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpb19jaGFubmVsX3NldF9ibGtzaXplKGZzLT5pbywgYmxvY2tfc2l6ZSk7CisJCWdyb3VwX2Jsb2NrID0gc3VwZXJibG9jazsKKwkJZnMtPm9yaWdfc3VwZXIgPSAwOworCX0gZWxzZSB7CisJCWlvX2NoYW5uZWxfc2V0X2Jsa3NpemUoZnMtPmlvLCBTVVBFUkJMT0NLX09GRlNFVCk7CisJCXN1cGVyYmxvY2sgPSAxOworCQlncm91cF9ibG9jayA9IDA7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKFNVUEVSQkxPQ0tfU0laRSwgJmZzLT5vcmlnX3N1cGVyKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIHN1cGVyYmxvY2ssIC1TVVBFUkJMT0NLX1NJWkUsCisJCQkJICAgICBmcy0+c3VwZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoZnMtPm9yaWdfc3VwZXIpCisJCW1lbWNweShmcy0+b3JpZ19zdXBlciwgZnMtPnN1cGVyLCBTVVBFUkJMT0NLX1NJWkUpOworCisjaWYgQkJfQklHX0VORElBTgorCWlmICgoZnMtPnN1cGVyLT5zX21hZ2ljID09IGV4dDJmc19zd2FiMTYoRVhUMl9TVVBFUl9NQUdJQykpIHx8CisJICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykpIHsKKwkJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19TV0FQX0JZVEVTOworCisJCWV4dDJmc19zd2FwX3N1cGVyKGZzLT5zdXBlcik7CisJfQorI2VuZGlmCisKKwlpZiAoZnMtPnN1cGVyLT5zX21hZ2ljICE9IEVYVDJfU1VQRVJfTUFHSUMpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9CQURfTUFHSUM7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJaWYgKGZzLT5zdXBlci0+c19yZXZfbGV2ZWwgPiBFWFQyX0xJQl9DVVJSRU5UX1JFVikgeworCQlyZXR2YWwgPSBFWFQyX0VUX1JFVl9UT09fSElHSDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIGZlYXR1cmUgc2V0IGluY29tcGF0aWJpbGl0eQorCSAqLworCWlmICghKGZsYWdzICYgRVhUMl9GTEFHX0ZPUkNFKSkgeworCQlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCQkgICAgfkVYVDJfTElCX0ZFQVRVUkVfSU5DT01QQVRfU1VQUCkgeworCQkJcmV0dmFsID0gRVhUMl9FVF9VTlNVUFBfRkVBVFVSRTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoKGZsYWdzICYgRVhUMl9GTEFHX1JXKSAmJgorCQkgICAgKGZzLT5zdXBlci0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJCSAgICAgfkVYVDJfTElCX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX1JPX1VOU1VQUF9GRUFUVVJFOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWlmICghKGZsYWdzICYgRVhUMl9GTEFHX0pPVVJOQUxfREVWX09LKSAmJgorCQkgICAgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkJICAgICBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYpKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX1VOU1VQUF9GRUFUVVJFOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJZnMtPmJsb2Nrc2l6ZSA9IEVYVDJfQkxPQ0tfU0laRShmcy0+c3VwZXIpOworCWlmIChmcy0+YmxvY2tzaXplID09IDApIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9DT1JSVVBUX1NVUEVSQkxPQ0s7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJZnMtPmZyYWdzaXplID0gRVhUMl9GUkFHX1NJWkUoZnMtPnN1cGVyKTsKKwlmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCA9ICgoZnMtPnN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXAgKgorCQkJCSAgICAgICBFWFQyX0lOT0RFX1NJWkUoZnMtPnN1cGVyKSArCisJCQkJICAgICAgIEVYVDJfQkxPQ0tfU0laRShmcy0+c3VwZXIpIC0gMSkgLworCQkJCSAgICAgIEVYVDJfQkxPQ0tfU0laRShmcy0+c3VwZXIpKTsKKwlpZiAoYmxvY2tfc2l6ZSkgeworCQlpZiAoYmxvY2tfc2l6ZSAhPSBmcy0+YmxvY2tzaXplKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX1VORVhQRUNURURfQkxPQ0tfU0laRTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKwkvKgorCSAqIFNldCB0aGUgYmxvY2tzaXplIHRvIHRoZSBmaWxlc3lzdGVtJ3MgYmxvY2tzaXplLgorCSAqLworCWlvX2NoYW5uZWxfc2V0X2Jsa3NpemUoZnMtPmlvLCBmcy0+YmxvY2tzaXplKTsKKworCS8qCisJICogSWYgdGhpcyBpcyBhbiBleHRlcm5hbCBqb3VybmFsIGRldmljZSwgZG9uJ3QgdHJ5IHRvIHJlYWQKKwkgKiB0aGUgZ3JvdXAgZGVzY3JpcHRvcnMsIGJlY2F1c2UgdGhleSdyZSBub3QgdGhlcmUuCisJICovCisJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSB7CisJCWZzLT5ncm91cF9kZXNjX2NvdW50ID0gMDsKKwkJKnJldF9mcyA9IGZzOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFJlYWQgZ3JvdXAgZGVzY3JpcHRvcnMKKwkgKi8KKwlibG9ja3NfcGVyX2dyb3VwID0gRVhUMl9CTE9DS1NfUEVSX0dST1VQKGZzLT5zdXBlcik7CisJaWYgKGJsb2Nrc19wZXJfZ3JvdXAgPT0gMCB8fAorCSAgICBibG9ja3NfcGVyX2dyb3VwID4gRVhUMl9NQVhfQkxPQ0tTX1BFUl9HUk9VUChmcy0+c3VwZXIpIHx8CisJICAgIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwID4gRVhUMl9NQVhfSU5PREVTX1BFUl9HUk9VUChmcy0+c3VwZXIpKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfQ09SUlVQVF9TVVBFUkJMT0NLOworCQlnb3RvIGNsZWFudXA7CisJfQorCWZzLT5ncm91cF9kZXNjX2NvdW50ID0gKGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgLQorCQkJCWZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrICsKKwkJCQlibG9ja3NfcGVyX2dyb3VwIC0gMSkgLyBibG9ja3NfcGVyX2dyb3VwOworCWZzLT5kZXNjX2Jsb2NrcyA9IChmcy0+Z3JvdXBfZGVzY19jb3VudCArCisJCQkgICBFWFQyX0RFU0NfUEVSX0JMT0NLKGZzLT5zdXBlcikgLSAxKQorCQkvIEVYVDJfREVTQ19QRVJfQkxPQ0soZnMtPnN1cGVyKTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+ZGVzY19ibG9ja3MgKiBmcy0+YmxvY2tzaXplLAorCQkJCSZmcy0+Z3JvdXBfZGVzYyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCWlmICghZ3JvdXBfYmxvY2spCisJCWdyb3VwX2Jsb2NrID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJZGVzdCA9IChjaGFyICopIGZzLT5ncm91cF9kZXNjOworCWdyb3Vwc19wZXJfYmxvY2sgPSBmcy0+YmxvY2tzaXplIC8gc2l6ZW9mKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpOworCWZvciAoaSA9IDA7IGkgPCBmcy0+ZGVzY19ibG9ja3M7IGkrKykgeworCQlibGsgPSBleHQyZnNfZGVzY3JpcHRvcl9ibG9ja19sb2MoZnMsIGdyb3VwX2Jsb2NrLCBpKTsKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIGJsaywgMSwgZGVzdCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisjaWYgQkJfQklHX0VORElBTgorCQlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHsKKwkJCWdkcCA9IChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICopIGRlc3Q7CisJCQlmb3IgKGo9MDsgaiA8IGdyb3Vwc19wZXJfYmxvY2s7IGorKykKKwkJCQlleHQyZnNfc3dhcF9ncm91cF9kZXNjKGdkcCsrKTsKKwkJfQorI2VuZGlmCisJCWRlc3QgKz0gZnMtPmJsb2Nrc2l6ZTsKKwl9CisKKwkqcmV0X2ZzID0gZnM7CisJcmV0dXJuIDA7CitjbGVhbnVwOgorCWV4dDJmc19mcmVlKGZzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogU2V0L2dldCB0aGUgZmlsZXN5c3RlbSBkYXRhIEkvTyBjaGFubmVsLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSB2YWxpZCBpZiBFWFQyX0ZMQUdfSU1BR0VfRklMRSBpcyB0cnVlLgorICovCitlcnJjb2RlX3QgZXh0MmZzX2dldF9kYXRhX2lvKGV4dDJfZmlsc3lzIGZzLCBpb19jaGFubmVsICpvbGRfaW8pCit7CisJaWYgKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfSU1BR0VfRklMRSkgPT0gMCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9UX0lNQUdFX0ZJTEU7CisJaWYgKG9sZF9pbykgeworCQkqb2xkX2lvID0gKGZzLT5pbWFnZV9pbyA9PSBmcy0+aW8pID8gMCA6IGZzLT5pbzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfc2V0X2RhdGFfaW8oZXh0Ml9maWxzeXMgZnMsIGlvX2NoYW5uZWwgbmV3X2lvKQoreworCWlmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX0lNQUdFX0ZJTEUpID09IDApCisJCXJldHVybiBFWFQyX0VUX05PVF9JTUFHRV9GSUxFOworCWZzLT5pbyA9IG5ld19pbyA/IG5ld19pbyA6IGZzLT5pbWFnZV9pbzsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19yZXdyaXRlX3RvX2lvKGV4dDJfZmlsc3lzIGZzLCBpb19jaGFubmVsIG5ld19pbykKK3sKKwlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19JTUFHRV9GSUxFKSA9PSAwKQorCQlyZXR1cm4gRVhUMl9FVF9OT1RfSU1BR0VfRklMRTsKKwlmcy0+aW8gPSBmcy0+aW1hZ2VfaW8gPSBuZXdfaW87CisJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19ESVJUWSB8IEVYVDJfRkxBR19SVyB8CisJCUVYVDJfRkxBR19CQl9ESVJUWSB8IEVYVDJfRkxBR19JQl9ESVJUWTsKKwlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19JTUFHRV9GSUxFOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3JlYWRfYmIuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9yZWFkX2JiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3N2JjOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9yZWFkX2JiLmMKQEAgLTAsMCArMSw5NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcmVhZF9iYiAtLS0gcmVhZCB0aGUgYmFkIGJsb2NrcyBpbm9kZQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdHJ1Y3QgcmVhZF9iYl9yZWNvcmQgeworCWV4dDJfYmFkYmxvY2tzX2xpc3QJYmJfbGlzdDsKKwllcnJjb2RlX3QJZXJyOworfTsKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZXh0MmZzX3JlYWRfYmJfaW5vZGUoKQorICovCisjaWZkZWYgX19UVVJCT0NfXworIyBwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorc3RhdGljIGludCBtYXJrX2JhZF9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgKmJsb2NrX25yLAorCQkJICBlMl9ibGtjbnRfdCBibG9ja2NudCBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgIGJsa190IHJlZl9ibG9jayBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgIGludCByZWZfb2Zmc2V0IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCByZWFkX2JiX3JlY29yZCAqcmIgPSAoc3RydWN0IHJlYWRfYmJfcmVjb3JkICopIHByaXZfZGF0YTsKKworCWlmIChibG9ja2NudCA8IDApCisJCXJldHVybiAwOworCisJaWYgKCgqYmxvY2tfbnIgPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkgICAgKCpibG9ja19uciA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSkKKwkJcmV0dXJuIDA7CS8qIElnbm9yZSBpbGxlZ2FsIGJsb2NrcyAqLworCisJcmItPmVyciA9IGV4dDJmc19iYWRibG9ja3NfbGlzdF9hZGQocmItPmJiX2xpc3QsICpibG9ja19ucik7CisJaWYgKHJiLT5lcnIpCisJCXJldHVybiBCTE9DS19BQk9SVDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWRzIHRoZSBjdXJyZW50IGJhZCBibG9ja3MgZnJvbSB0aGUgYmFkIGJsb2NrcyBpbm9kZS4KKyAqLworZXJyY29kZV90IGV4dDJmc19yZWFkX2JiX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2JhZGJsb2Nrc19saXN0ICpiYl9saXN0KQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJc3RydWN0IHJlYWRfYmJfcmVjb3JkIHJiOworCXN0cnVjdCBleHQyX2lub2RlIGlub2RlOworCWJsa190CW51bWJsb2NrczsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoISpiYl9saXN0KSB7CisJCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBFWFQyX0JBRF9JTk8sICZpbm9kZSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlpZiAoaW5vZGUuaV9ibG9ja3MgPCA1MDApCisJCQludW1ibG9ja3MgPSAoaW5vZGUuaV9ibG9ja3MgLworCQkJCSAgICAgKGZzLT5ibG9ja3NpemUgLyA1MTIpKSArIDIwOworCQllbHNlCisJCQludW1ibG9ja3MgPSA1MDA7CisJCXJldHZhbCA9IGV4dDJmc19iYWRibG9ja3NfbGlzdF9jcmVhdGUoYmJfbGlzdCwgbnVtYmxvY2tzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJcmIuYmJfbGlzdCA9ICpiYl9saXN0OworCXJiLmVyciA9IDA7CisJcmV0dmFsID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBFWFQyX0JBRF9JTk8sIDAsIDAsCisJCQkJICAgICAgbWFya19iYWRfYmxvY2ssICZyYik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiByYi5lcnI7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcmVhZF9iYl9maWxlLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcmVhZF9iYl9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxZmMzMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9yZWFkX2JiX2ZpbGUuYwpAQCAtMCwwICsxLDk2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZWFkX2JiX2ZpbGUuYyAtLS0gcmVhZCBhIGxpc3Qgb2YgYmFkIGJsb2NrcyBmcm9tIGEgRklMRSAqCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAyMDAwIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBSZWFkcyBhIGxpc3Qgb2YgYmFkIGJsb2NrcyBmcm9tICBhIEZJTEUgKgorICovCitlcnJjb2RlX3QgZXh0MmZzX3JlYWRfYmJfRklMRTIoZXh0Ml9maWxzeXMgZnMsIEZJTEUgKmYsCisJCQkgICAgICAgZXh0Ml9iYWRibG9ja3NfbGlzdCAqYmJfbGlzdCwKKwkJCSAgICAgICB2b2lkICpwcml2X2RhdGEsCisJCQkgICAgICAgdm9pZCAoKmludmFsaWQpKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkgICAgICAgYmxrX3QgYmxrLAorCQkJCQkgICAgICAgY2hhciAqYmFkc3RyLAorCQkJCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhKSkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWJsa190CQlibG9ja25vOworCWludAkJY291bnQ7CisJY2hhcgkJYnVmWzEyOF07CisKKwlpZiAoZnMpCisJCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoISpiYl9saXN0KSB7CisJCXJldHZhbCA9IGV4dDJmc19iYWRibG9ja3NfbGlzdF9jcmVhdGUoYmJfbGlzdCwgMTApOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwl3aGlsZSAoIWZlb2YgKGYpKSB7CisJCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWNvdW50ID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJmJsb2Nrbm8pOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZnMgJiYKKwkJICAgICgoYmxvY2tubyA8IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSB8fAorCQkgICAgKGJsb2Nrbm8gPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkpKSB7CisJCQlpZiAoaW52YWxpZCkKKwkJCQkoaW52YWxpZCkoZnMsIGJsb2Nrbm8sIGJ1ZiwgcHJpdl9kYXRhKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJldHZhbCA9IGV4dDJmc19iYWRibG9ja3NfbGlzdF9hZGQoKmJiX2xpc3QsIGJsb2Nrbm8pOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGxfY29tcGF0X2ludmFsaWQoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsaywKKwkJCQljaGFyICpiYWRzdHIgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJCXZvaWQgKnByaXZfZGF0YSkKK3sKKwl2b2lkICgqaW52YWxpZCkoZXh0Ml9maWxzeXMsIGJsa190KTsKKworCWludmFsaWQgPSAodm9pZCAoKikoZXh0Ml9maWxzeXMsIGJsa190KSkgcHJpdl9kYXRhOworCWlmIChpbnZhbGlkKQorCQlpbnZhbGlkKGZzLCBibGspOworfQorCisKKy8qCisgKiBSZWFkcyBhIGxpc3Qgb2YgYmFkIGJsb2NrcyBmcm9tICBhIEZJTEUgKgorICovCitlcnJjb2RlX3QgZXh0MmZzX3JlYWRfYmJfRklMRShleHQyX2ZpbHN5cyBmcywgRklMRSAqZiwKKwkJCSAgICAgIGV4dDJfYmFkYmxvY2tzX2xpc3QgKmJiX2xpc3QsCisJCQkgICAgICB2b2lkICgqaW52YWxpZCkoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsaykpCit7CisJcmV0dXJuIGV4dDJmc19yZWFkX2JiX0ZJTEUyKGZzLCBmLCBiYl9saXN0LCAodm9pZCAqKSBpbnZhbGlkLAorCQkJCSAgICBjYWxsX2NvbXBhdF9pbnZhbGlkKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9yZXNfZ2R0LmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcmVzX2dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzQ2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcmVzX2dkdC5jCkBAIC0wLDAgKzEsMjIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZXNfZ2R0LmMgLS0tIHJlc2VydmUgYmxvY2tzIGZvciBncm93aW5nIHRoZSBncm91cCBkZXNjcmlwdG9yIHRhYmxlCisgKiAgICAgICAgICAgICAgIGR1cmluZyBvbmxpbmUgcmVzaXppbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEFuZHJlYXMgRGlsZ2VyCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogSXRlcmF0ZSB0aHJvdWdoIHRoZSBncm91cHMgd2hpY2ggaG9sZCBCQUNLVVAgc3VwZXJibG9jay9HRFQgY29waWVzIGluIGFuCisgKiBleHQzIGZpbGVzeXN0ZW0uICBUaGUgY291bnRlcnMgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIDEsIDUsIGFuZCA3IGJlZm9yZQorICogY2FsbGluZyB0aGlzIGZvciB0aGUgZmlyc3QgdGltZS4gIEluIGEgc3BhcnNlIGZpbGVzeXN0ZW0gaXQgd2lsbCBiZSB0aGUKKyAqIHNlcXVlbmNlIG9mIHBvd2VycyBvZiAzLCA1LCBhbmQgNzogMSwgMywgNSwgNywgOSwgMjUsIDI3LCA0OSwgODEsIC4uLgorICogRm9yIGEgbm9uLXNwYXJzZSBmaWxlc3lzdGVtIGl0IHdpbGwgYmUgZXZlcnkgZ3JvdXA6IDEsIDIsIDMsIDQsIC4uLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxpc3RfYmFja3VwcyhleHQyX2ZpbHN5cyBmcywgdW5zaWduZWQgaW50ICp0aHJlZSwKKwkJCQkgdW5zaWduZWQgaW50ICpmaXZlLCB1bnNpZ25lZCBpbnQgKnNldmVuKQoreworCXVuc2lnbmVkIGludCAqbWluID0gdGhyZWU7CisJaW50IG11bHQgPSAzOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlpZiAoIShmcy0+c3VwZXItPnNfZmVhdHVyZV9yb19jb21wYXQgJgorCSAgICAgIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSkgeworCQlyZXQgPSAqbWluOworCQkqbWluICs9IDE7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCpmaXZlIDwgKm1pbikgeworCQltaW4gPSBmaXZlOworCQltdWx0ID0gNTsKKwl9CisJaWYgKCpzZXZlbiA8ICptaW4pIHsKKwkJbWluID0gc2V2ZW47CisJCW11bHQgPSA3OworCX0KKworCXJldCA9ICptaW47CisJKm1pbiAqPSBtdWx0OworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHJlc2VydmVkIGJsb2NrcyBoYXZlIGFscmVhZHkgYmVlbiBtYXJrZWQgaW4tdXNlCisgKiBkdXJpbmcgZXh0MmZzX2luaXRpYWxpemUoKSwgc28gdGhhdCB0aGV5IGFyZSBub3QgYWxsb2NhdGVkIGZvciBvdGhlcgorICogdXNlcyBiZWZvcmUgd2UgY2FuIGFkZCB0aGVtIHRvIHRoZSByZXNpemUgaW5vZGUgKHdoaWNoIGhhcyB0byBjb21lCisgKiBhZnRlciB0aGUgY3JlYXRpb24gb2YgdGhlIGlub2RlIHRhYmxlKS4KKyAqLworZXJyY29kZV90IGV4dDJmc19jcmVhdGVfcmVzaXplX2lub2RlKGV4dDJfZmlsc3lzIGZzKQoreworCWVycmNvZGVfdAkJcmV0dmFsLCByZXR2YWwyOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrCSpzYjsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQlpbm9kZTsKKwlfX3UzMgkJCSpkaW5kaXJfYnVmLCAqZ2R0X2J1ZjsKKwlpbnQJCQlyc3ZfYWRkOworCXVuc2lnbmVkIGxvbmcgbG9uZwlhcGIsIGlub2RlX3NpemU7CisJYmxrX3QJCQlkaW5kaXJfYmxrLCByc3Zfb2ZmLCBnZHRfb2ZmLCBnZHRfYmxrOworCWludAkJCWRpbmRpcl9kaXJ0eSA9IDAsIGlub2RlX2RpcnR5ID0gMDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlzYiA9IGZzLT5zdXBlcjsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKDIgKiBmcy0+YmxvY2tzaXplLCAodm9pZCAqKSZkaW5kaXJfYnVmKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dF9mcmVlOworCWdkdF9idWYgPSAoX191MzIgKikoKGNoYXIgKilkaW5kaXJfYnVmICsgZnMtPmJsb2Nrc2l6ZSk7CisKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgRVhUMl9SRVNJWkVfSU5PLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKiBNYXhpbXVtIHBvc3NpYmxlIGZpbGUgc2l6ZSAod2UgZG9ubHkgdXNlIHRoZSBkaW5kaXJlY3QgYmxvY2tzKSAqLworCWFwYiA9IEVYVDJfQUREUl9QRVJfQkxPQ0soc2IpOworCXJzdl9hZGQgPSBmcy0+YmxvY2tzaXplIC8gNTEyOworCWlmICgoZGluZGlyX2JsayA9IGlub2RlLmlfYmxvY2tbRVhUMl9ESU5EX0JMT0NLXSkpIHsKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJCXByaW50ZigicmVhZGluZyBHRFQgZGluZGlyICV1XG4iLCBkaW5kaXJfYmxrKTsKKyNlbmRpZgorCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbmRfYmxvY2soZnMsIGRpbmRpcl9ibGssIGRpbmRpcl9idWYpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXRfaW5vZGU7CisJfSBlbHNlIHsKKwkJYmxrX3QgZ29hbCA9IDMgKyBzYi0+c19yZXNlcnZlZF9nZHRfYmxvY2tzICsKKwkJCWZzLT5kZXNjX2Jsb2NrcyArIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwOworCisJCXJldHZhbCA9IGV4dDJmc19hbGxvY19ibG9jayhmcywgZ29hbCwgMCwgJmRpbmRpcl9ibGspOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXRfZnJlZTsKKwkJaW5vZGUuaV9tb2RlID0gTElOVVhfU19JRlJFRyB8IDA2MDA7CisJCWlub2RlLmlfbGlua3NfY291bnQgPSAxOworCQlpbm9kZS5pX2Jsb2NrW0VYVDJfRElORF9CTE9DS10gPSBkaW5kaXJfYmxrOworCQlpbm9kZS5pX2Jsb2NrcyA9IHJzdl9hZGQ7CisJCW1lbXNldChkaW5kaXJfYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJCXByaW50ZigiYWxsb2NhdGVkIEdEVCBkaW5kaXIgJXVcbiIsIGRpbmRpcl9ibGspOworI2VuZGlmCisJCWRpbmRpcl9kaXJ0eSA9IGlub2RlX2RpcnR5ID0gMTsKKwkJaW5vZGVfc2l6ZSA9IGFwYiphcGIgKyBhcGIgKyBFWFQyX05ESVJfQkxPQ0tTOworCQlpbm9kZV9zaXplICo9IGZzLT5ibG9ja3NpemU7CisJCWlub2RlLmlfc2l6ZSA9IGlub2RlX3NpemUgJiAweEZGRkZGRkZGOworCQlpbm9kZS5pX3NpemVfaGlnaCA9IChpbm9kZV9zaXplID4+IDMyKSAmIDB4RkZGRkZGRkY7CisJCWlmIChpbm9kZS5pX3NpemVfaGlnaCkgeworCQkJc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgfD0KKwkJCQlFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEU7CisJCX0KKwkJaW5vZGUuaV9jdGltZSA9IHRpbWUoTlVMTCk7CisJfQorCisJZm9yIChyc3Zfb2ZmID0gMCwgZ2R0X29mZiA9IGZzLT5kZXNjX2Jsb2NrcywKKwkgICAgIGdkdF9ibGsgPSBzYi0+c19maXJzdF9kYXRhX2Jsb2NrICsgMSArIGZzLT5kZXNjX2Jsb2NrczsKKwkgICAgIHJzdl9vZmYgPCBzYi0+c19yZXNlcnZlZF9nZHRfYmxvY2tzOworCSAgICAgcnN2X29mZisrLCBnZHRfb2ZmKyssIGdkdF9ibGsrKykgeworCQl1bnNpZ25lZCBpbnQgdGhyZWUgPSAxLCBmaXZlID0gNSwgc2V2ZW4gPSA3OworCQl1bnNpZ25lZCBpbnQgZ3JwLCBsYXN0ID0gMDsKKwkJaW50IGdkdF9kaXJ0eSA9IDA7CisKKwkJZ2R0X29mZiAlPSBhcGI7CisJCWlmICghZGluZGlyX2J1ZltnZHRfb2ZmXSkgeworCQkJLyogRklYTUUgWFhYIFhYWAorCQkJYmxrX3QgbmV3X2JsazsKKworCQkJcmV0dmFsID0gZXh0MmZzX25ld19ibG9jayhmcywgZ2R0X2JsaywgMCwgJm5ld19ibGspOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJaWYgKG5ld19ibGsgIT0gZ2R0X2JsaykgeworCQkJCS8vIFhYWCBmcmVlIGJsb2NrCisJCQkJcmV0dmFsID0gLTE7IC8vIFhYWAorCQkJfQorCQkJKi8KKwkJCWdkdF9kaXJ0eSA9IGRpbmRpcl9kaXJ0eSA9IGlub2RlX2RpcnR5ID0gMTsKKwkJCW1lbXNldChnZHRfYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKwkJCWRpbmRpcl9idWZbZ2R0X29mZl0gPSBnZHRfYmxrOworCQkJaW5vZGUuaV9ibG9ja3MgKz0gcnN2X2FkZDsKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJCQlwcmludGYoImFkZGVkIHByaW1hcnkgR0RUIGJsb2NrICV1IGF0ICV1WyV1XVxuIiwKKwkJCSAgICAgICBnZHRfYmxrLCBkaW5kaXJfYmxrLCBnZHRfb2ZmKTsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKGRpbmRpcl9idWZbZ2R0X29mZl0gPT0gZ2R0X2JsaykgeworI2lmZGVmIFJFU19HRFRfREVCVUcKKwkJCXByaW50ZigicmVhZGluZyBwcmltYXJ5IEdEVCBibG9jayAldVxuIiwgZ2R0X2Jsayk7CisjZW5kaWYKKwkJCXJldHZhbCA9IGV4dDJmc19yZWFkX2luZF9ibG9jayhmcywgZ2R0X2JsaywgZ2R0X2J1Zik7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gb3V0X2RpbmRpcjsKKwkJfSBlbHNlIHsKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJCQlwcmludGYoImJhZCBwcmltYXJ5IEdEVCAldSAhPSAldSBhdCAldVsldV1cbiIsCisJCQkgICAgICAgZGluZGlyX2J1ZltnZHRfb2ZmXSwgZ2R0X2JsayxkaW5kaXJfYmxrLGdkdF9vZmYpOworI2VuZGlmCisJCQlyZXR2YWwgPSBFWFQyX0VUX1JFU0laRV9JTk9ERV9DT1JSVVBUOworCQkJZ290byBvdXRfZGluZGlyOworCQl9CisKKwkJd2hpbGUgKChncnAgPSBsaXN0X2JhY2t1cHMoZnMsICZ0aHJlZSwgJmZpdmUsICZzZXZlbikpIDwKKwkJICAgICAgIGZzLT5ncm91cF9kZXNjX2NvdW50KSB7CisJCQlibGtfdCBleHBlY3QgPSBnZHRfYmxrICsgZ3JwICogc2ItPnNfYmxvY2tzX3Blcl9ncm91cDsKKworCQkJaWYgKCFnZHRfYnVmW2xhc3RdKSB7CisjaWZkZWYgUkVTX0dEVF9ERUJVRworCQkJCXByaW50ZigiYWRkZWQgYmFja3VwIEdEVCAldSBncnAgJXVAJXVbJXVdXG4iLAorCQkJCSAgICAgICBleHBlY3QsIGdycCwgZ2R0X2JsaywgbGFzdCk7CisjZW5kaWYKKwkJCQlnZHRfYnVmW2xhc3RdID0gZXhwZWN0OworCQkJCWlub2RlLmlfYmxvY2tzICs9IHJzdl9hZGQ7CisJCQkJZ2R0X2RpcnR5ID0gaW5vZGVfZGlydHkgPSAxOworCQkJfSBlbHNlIGlmIChnZHRfYnVmW2xhc3RdICE9IGV4cGVjdCkgeworI2lmZGVmIFJFU19HRFRfREVCVUcKKwkJCQlwcmludGYoImJhZCBiYWNrdXAgR0RUICV1ICE9ICV1IGF0ICV1WyV1XVxuIiwKKwkJCQkgICAgICAgZ2R0X2J1ZltsYXN0XSwgZXhwZWN0LCBnZHRfYmxrLCBsYXN0KTsKKyNlbmRpZgorCQkJCXJldHZhbCA9IEVYVDJfRVRfUkVTSVpFX0lOT0RFX0NPUlJVUFQ7CisJCQkJZ290byBvdXRfZGluZGlyOworCQkJfQorCQkJbGFzdCsrOworCQl9CisJCWlmIChnZHRfZGlydHkpIHsKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJCQlwcmludGYoIndyaXRpbmcgcHJpbWFyeSBHRFQgYmxvY2sgJXVcbiIsIGdkdF9ibGspOworI2VuZGlmCisJCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5kX2Jsb2NrKGZzLCBnZHRfYmxrLCBnZHRfYnVmKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBvdXRfZGluZGlyOworCQl9CisJfQorCitvdXRfZGluZGlyOgorCWlmIChkaW5kaXJfZGlydHkpIHsKKwkJcmV0dmFsMiA9IGV4dDJmc193cml0ZV9pbmRfYmxvY2soZnMsIGRpbmRpcl9ibGssIGRpbmRpcl9idWYpOworCQlpZiAoIXJldHZhbCkKKwkJCXJldHZhbCA9IHJldHZhbDI7CisJfQorb3V0X2lub2RlOgorI2lmZGVmIFJFU19HRFRfREVCVUcKKwlwcmludGYoImlub2RlLmlfYmxvY2tzID0gJXUsIGlfc2l6ZSA9ICV1XG4iLCBpbm9kZS5pX2Jsb2NrcywKKwkgICAgICAgaW5vZGUuaV9zaXplKTsKKyNlbmRpZgorCWlmIChpbm9kZV9kaXJ0eSkgeworCQlpbm9kZS5pX2F0aW1lID0gaW5vZGUuaV9tdGltZSA9IHRpbWUoTlVMTCk7CisJCXJldHZhbDIgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIEVYVDJfUkVTSVpFX0lOTywgJmlub2RlKTsKKwkJaWYgKCFyZXR2YWwpCisJCQlyZXR2YWwgPSByZXR2YWwyOworCX0KK291dF9mcmVlOgorCWV4dDJmc19mcmVlX21lbSgodm9pZCAqKSZkaW5kaXJfYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3JzX2JpdG1hcC5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3JzX2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTg3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcnNfYml0bWFwLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJzX2JpdG1hcC5jIC0tLSByb3V0aW5lIGZvciBjaGFuZ2luZyB0aGUgc2l6ZSBvZiBhIGJpdG1hcAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitlcnJjb2RlX3QgZXh0MmZzX3Jlc2l6ZV9nZW5lcmljX2JpdG1hcChfX3UzMiBuZXdfZW5kLCBfX3UzMiBuZXdfcmVhbF9lbmQsCisJCQkJICAgICAgIGV4dDJmc19nZW5lcmljX2JpdG1hcCBibWFwKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJc2l6ZV90CQlzaXplLCBuZXdfc2l6ZTsKKwlfX3UzMgkJYml0bm87CisKKwlpZiAoIWJtYXApCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwlFWFQyX0NIRUNLX01BR0lDKGJtYXAsIEVYVDJfRVRfTUFHSUNfR0VORVJJQ19CSVRNQVApOworCisJLyoKKwkgKiBJZiB3ZSdyZSBleHBhbmRpbmcgdGhlIGJpdG1hcCwgbWFrZSBzdXJlIGFsbCBvZiB0aGUgbmV3CisJICogcGFydHMgb2YgdGhlIGJpdG1hcCBhcmUgemVyby4KKwkgKi8KKwlpZiAobmV3X2VuZCA+IGJtYXAtPmVuZCkgeworCQliaXRubyA9IGJtYXAtPnJlYWxfZW5kOworCQlpZiAoYml0bm8gPiBuZXdfZW5kKQorCQkJYml0bm8gPSBuZXdfZW5kOworCQlmb3IgKDsgYml0bm8gPiBibWFwLT5lbmQ7IGJpdG5vLS0pCisJCQlleHQyZnNfY2xlYXJfYml0KGJpdG5vIC0gYm1hcC0+c3RhcnQsIGJtYXAtPmJpdG1hcCk7CisJfQorCWlmIChuZXdfcmVhbF9lbmQgPT0gYm1hcC0+cmVhbF9lbmQpIHsKKwkJYm1hcC0+ZW5kID0gbmV3X2VuZDsKKwkJcmV0dXJuIDA7CisJfQorCisJc2l6ZSA9ICgoYm1hcC0+cmVhbF9lbmQgLSBibWFwLT5zdGFydCkgLyA4KSArIDE7CisJbmV3X3NpemUgPSAoKG5ld19yZWFsX2VuZCAtIGJtYXAtPnN0YXJ0KSAvIDgpICsgMTsKKworCWlmIChzaXplICE9IG5ld19zaXplKSB7CisJCXJldHZhbCA9IGV4dDJmc19yZXNpemVfbWVtKHNpemUsIG5ld19zaXplLCAmYm1hcC0+Yml0bWFwKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCWlmIChuZXdfc2l6ZSA+IHNpemUpCisJCW1lbXNldChibWFwLT5iaXRtYXAgKyBzaXplLCAwLCBuZXdfc2l6ZSAtIHNpemUpOworCisJYm1hcC0+ZW5kID0gbmV3X2VuZDsKKwlibWFwLT5yZWFsX2VuZCA9IG5ld19yZWFsX2VuZDsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19yZXNpemVfaW5vZGVfYml0bWFwKF9fdTMyIG5ld19lbmQsIF9fdTMyIG5ld19yZWFsX2VuZCwKKwkJCQkgICAgIGV4dDJmc19pbm9kZV9iaXRtYXAgYm1hcCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKCFibWFwKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJRVhUMl9DSEVDS19NQUdJQyhibWFwLCBFWFQyX0VUX01BR0lDX0lOT0RFX0JJVE1BUCk7CisKKwlibWFwLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfR0VORVJJQ19CSVRNQVA7CisJcmV0dmFsID0gZXh0MmZzX3Jlc2l6ZV9nZW5lcmljX2JpdG1hcChuZXdfZW5kLCBuZXdfcmVhbF9lbmQsCisJCQkJCSAgICAgIGJtYXApOworCWJtYXAtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19JTk9ERV9CSVRNQVA7CisJcmV0dXJuIHJldHZhbDsKK30KKworZXJyY29kZV90IGV4dDJmc19yZXNpemVfYmxvY2tfYml0bWFwKF9fdTMyIG5ld19lbmQsIF9fdTMyIG5ld19yZWFsX2VuZCwKKwkJCQkgICAgIGV4dDJmc19ibG9ja19iaXRtYXAgYm1hcCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKCFibWFwKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJRVhUMl9DSEVDS19NQUdJQyhibWFwLCBFWFQyX0VUX01BR0lDX0JMT0NLX0JJVE1BUCk7CisKKwlibWFwLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfR0VORVJJQ19CSVRNQVA7CisJcmV0dmFsID0gZXh0MmZzX3Jlc2l6ZV9nZW5lcmljX2JpdG1hcChuZXdfZW5kLCBuZXdfcmVhbF9lbmQsCisJCQkJCSAgICAgIGJtYXApOworCWJtYXAtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19CTE9DS19CSVRNQVA7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9yd19iaXRtYXBzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcndfYml0bWFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYTQzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcndfYml0bWFwcy5jCkBAIC0wLDAgKzEsMjk0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByd19iaXRtYXBzLmMgLS0tIHJvdXRpbmVzIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSAgaW5vZGUgYW5kIGJsb2NrIGJpdG1hcHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk0LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisjaW5jbHVkZSAiZTJpbWFnZS5oIgorCisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgJiYgQkJfQklHX0VORElBTgorLyoKKyAqIE9uIHRoZSBQb3dlclBDLCB0aGUgYmlnLWVuZGlhbiB2YXJpYW50IG9mIHRoZSBleHQyIGZpbGVzeXN0ZW0KKyAqIGhhcyBpdHMgYml0bWFwcyBzdG9yZWQgYXMgMzItYml0IHdvcmRzIHdpdGggYml0IDAgYXMgdGhlIExTQgorICogb2YgZWFjaCB3b3JkLiAgVGh1cyBhIGJpdG1hcCB3aXRoIG9ubHkgYml0IDAgc2V0IHdvdWxkIGJlLCBhcworICogYSBzdHJpbmcgb2YgYnl0ZXMsIDAwIDAwIDAwIDAxIDAwIC4uLgorICogVG8gY29wZSB3aXRoIHRoaXMsIHdlIGJ5dGUtcmV2ZXJzZSBlYWNoIHdvcmQgb2YgYSBiaXRtYXAgaWYKKyAqIHdlIGhhdmUgYSBiaWctZW5kaWFuIGZpbGVzeXN0ZW0sIHRoYXQgaXMsIGlmIHdlIGFyZSAqbm90KgorICogYnl0ZS1zd2FwcGluZyBvdGhlciB3b3JkLXNpemVkIG51bWJlcnMuCisgKi8KKyNkZWZpbmUgRVhUMl9CSUdfRU5ESUFOX0JJVE1BUFMKKyNlbmRpZgorCisjaWZkZWYgRVhUMl9CSUdfRU5ESUFOX0JJVE1BUFMKK3N0YXRpYyB2b2lkIGV4dDJmc19zd2FwX2JpdG1hcChleHQyX2ZpbHN5cyBmcywgY2hhciAqYml0bWFwLCBpbnQgbmJ5dGVzKQoreworCV9fdTMyICpwID0gKF9fdTMyICopIGJpdG1hcDsKKwlpbnQgbjsKKworCWZvciAobiA9IG5ieXRlcyAvIHNpemVvZihfX3UzMik7IG4gPiAwOyAtLW4sICsrcCkKKwkJKnAgPSBleHQyZnNfc3dhYjMyKCpwKTsKK30KKyNlbmRpZgorCitlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2lub2RlX2JpdG1hcChleHQyX2ZpbHN5cyBmcykKK3sKKwlkZ3JwX3QJCWk7CisJc2l6ZV90CQluYnl0ZXM7CisJZXJyY29kZV90CXJldHZhbDsKKwljaGFyICogaW5vZGVfYml0bWFwID0gZnMtPmlub2RlX21hcC0+Yml0bWFwOworCWNoYXIgKiBiaXRtYXBfYmxvY2sgPSBOVUxMOworCWJsa190CQlibGs7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKCEoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1JXKSkKKwkJcmV0dXJuIEVYVDJfRVRfUk9fRklMU1lTOworCWlmICghaW5vZGVfYml0bWFwKQorCQlyZXR1cm4gMDsKKwluYnl0ZXMgPSAoc2l6ZV90KSAoKEVYVDJfSU5PREVTX1BFUl9HUk9VUChmcy0+c3VwZXIpKzcpIC8gOCk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmYml0bWFwX2Jsb2NrKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW1lbXNldChiaXRtYXBfYmxvY2ssIDB4ZmYsIGZzLT5ibG9ja3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCW1lbWNweShiaXRtYXBfYmxvY2ssIGlub2RlX2JpdG1hcCwgbmJ5dGVzKTsKKwkJYmxrID0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfaW5vZGVfYml0bWFwOworCQlpZiAoYmxrKSB7CisjaWZkZWYgRVhUMl9CSUdfRU5ESUFOX0JJVE1BUFMKKwkJCWlmICghKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkJCSAgICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURSkpKQorCQkJCWV4dDJmc19zd2FwX2JpdG1hcChmcywgYml0bWFwX2Jsb2NrLCBuYnl0ZXMpOworI2VuZGlmCisJCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGJsaywgMSwKKwkJCQkJCSAgICAgIGJpdG1hcF9ibG9jayk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiBFWFQyX0VUX0lOT0RFX0JJVE1BUF9XUklURTsKKwkJfQorCQlpbm9kZV9iaXRtYXAgKz0gbmJ5dGVzOworCX0KKwlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19JQl9ESVJUWTsKKwlleHQyZnNfZnJlZV9tZW0oJmJpdG1hcF9ibG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfd3JpdGVfYmxvY2tfYml0bWFwIChleHQyX2ZpbHN5cyBmcykKK3sKKwlkZ3JwX3QJCWk7CisJdW5zaWduZWQgaW50CWo7CisJaW50CQluYnl0ZXM7CisJdW5zaWduZWQgaW50CW5iaXRzOworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhciAqIGJsb2NrX2JpdG1hcCA9IGZzLT5ibG9ja19tYXAtPmJpdG1hcDsKKwljaGFyICogYml0bWFwX2Jsb2NrID0gTlVMTDsKKwlibGtfdAkJYmxrOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICghKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykpCisJCXJldHVybiBFWFQyX0VUX1JPX0ZJTFNZUzsKKwlpZiAoIWJsb2NrX2JpdG1hcCkKKwkJcmV0dXJuIDA7CisJbmJ5dGVzID0gRVhUMl9CTE9DS1NfUEVSX0dST1VQKGZzLT5zdXBlcikgLyA4OworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZiaXRtYXBfYmxvY2spOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KGJpdG1hcF9ibG9jaywgMHhmZiwgZnMtPmJsb2Nrc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJbWVtY3B5KGJpdG1hcF9ibG9jaywgYmxvY2tfYml0bWFwLCBuYnl0ZXMpOworCQlpZiAoaSA9PSBmcy0+Z3JvdXBfZGVzY19jb3VudCAtIDEpIHsKKwkJCS8qIEZvcmNlIGJpdG1hcCBwYWRkaW5nIGZvciB0aGUgbGFzdCBncm91cCAqLworCQkJbmJpdHMgPSAoKGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQKKwkJCQkgIC0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spCisJCQkJICUgRVhUMl9CTE9DS1NfUEVSX0dST1VQKGZzLT5zdXBlcikpOworCQkJaWYgKG5iaXRzKQorCQkJCWZvciAoaiA9IG5iaXRzOyBqIDwgZnMtPmJsb2Nrc2l6ZSAqIDg7IGorKykKKwkJCQkJZXh0MmZzX3NldF9iaXQoaiwgYml0bWFwX2Jsb2NrKTsKKwkJfQorCQlibGsgPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXA7CisJCWlmIChibGspIHsKKyNpZmRlZiBFWFQyX0JJR19FTkRJQU5fQklUTUFQUworCQkJaWYgKCEoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCQkJICAgICAgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTX1dSSVRFKSkpCisJCQkJZXh0MmZzX3N3YXBfYml0bWFwKGZzLCBiaXRtYXBfYmxvY2ssIG5ieXRlcyk7CisjZW5kaWYKKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxrLCAxLAorCQkJCQkJICAgICAgYml0bWFwX2Jsb2NrKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIEVYVDJfRVRfQkxPQ0tfQklUTUFQX1dSSVRFOworCQl9CisJCWJsb2NrX2JpdG1hcCArPSBuYnl0ZXM7CisJfQorCWZzLT5mbGFncyAmPSB+RVhUMl9GTEFHX0JCX0RJUlRZOworCWV4dDJmc19mcmVlX21lbSgmYml0bWFwX2Jsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCByZWFkX2JpdG1hcHMoZXh0Ml9maWxzeXMgZnMsIGludCBkb19pbm9kZSwgaW50IGRvX2Jsb2NrKQoreworCWRncnBfdCBpOworCWNoYXIgKmJsb2NrX2JpdG1hcCA9IE5VTEwsICppbm9kZV9iaXRtYXAgPSBOVUxMOworCWNoYXIgKmJ1ZjsKKwllcnJjb2RlX3QgcmV0dmFsOworCWludCBibG9ja19uYnl0ZXMgPSAoaW50KSBFWFQyX0JMT0NLU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAvIDg7CisJaW50IGlub2RlX25ieXRlcyA9IChpbnQpIEVYVDJfSU5PREVTX1BFUl9HUk9VUChmcy0+c3VwZXIpIC8gODsKKwlibGtfdAlibGs7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJZnMtPndyaXRlX2JpdG1hcHMgPSBleHQyZnNfd3JpdGVfYml0bWFwczsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihmcy0+ZGV2aWNlX25hbWUpICsgODAsICZidWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKGRvX2Jsb2NrKSB7CisJCWV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChmcy0+YmxvY2tfbWFwKTsKKwkJc3ByaW50ZihidWYsICJibG9jayBiaXRtYXAgZm9yICVzIiwgZnMtPmRldmljZV9uYW1lKTsKKwkJcmV0dmFsID0gZXh0MmZzX2FsbG9jYXRlX2Jsb2NrX2JpdG1hcChmcywgYnVmLCAmZnMtPmJsb2NrX21hcCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJCWJsb2NrX2JpdG1hcCA9IGZzLT5ibG9ja19tYXAtPmJpdG1hcDsKKwl9CisJaWYgKGRvX2lub2RlKSB7CisJCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwKTsKKwkJc3ByaW50ZihidWYsICJpbm9kZSBiaXRtYXAgZm9yICVzIiwgZnMtPmRldmljZV9uYW1lKTsKKwkJcmV0dmFsID0gZXh0MmZzX2FsbG9jYXRlX2lub2RlX2JpdG1hcChmcywgYnVmLCAmZnMtPmlub2RlX21hcCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJCWlub2RlX2JpdG1hcCA9IGZzLT5pbm9kZV9tYXAtPmJpdG1hcDsKKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19JTUFHRV9GSUxFKSB7CisJCWlmIChpbm9kZV9iaXRtYXApIHsKKwkJCWJsayA9IChmcy0+aW1hZ2VfaGVhZGVyLT5vZmZzZXRfaW5vZGVtYXAgLworCQkJICAgICAgIGZzLT5ibG9ja3NpemUpOworCQkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW1hZ2VfaW8sIGJsaywKKwkJCSAgICAgLShpbm9kZV9uYnl0ZXMgKiBmcy0+Z3JvdXBfZGVzY19jb3VudCksCisJCQkgICAgIGlub2RlX2JpdG1hcCk7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoYmxvY2tfYml0bWFwKSB7CisJCQlibGsgPSAoZnMtPmltYWdlX2hlYWRlci0+b2Zmc2V0X2Jsb2NrbWFwIC8KKwkJCSAgICAgICBmcy0+YmxvY2tzaXplKTsKKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmltYWdlX2lvLCBibGssCisJCQkgICAgIC0oYmxvY2tfbmJ5dGVzICogZnMtPmdyb3VwX2Rlc2NfY291bnQpLAorCQkJICAgICBibG9ja19iaXRtYXApOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJaWYgKGJsb2NrX2JpdG1hcCkgeworCQkJYmxrID0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwOworCQkJaWYgKGJsaykgeworCQkJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBibGssCisJCQkJCSAgICAgLWJsb2NrX25ieXRlcywgYmxvY2tfYml0bWFwKTsKKwkJCQlpZiAocmV0dmFsKSB7CisJCQkJCXJldHZhbCA9IEVYVDJfRVRfQkxPQ0tfQklUTUFQX1JFQUQ7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisjaWZkZWYgRVhUMl9CSUdfRU5ESUFOX0JJVE1BUFMKKwkJCQlpZiAoISgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHx8CisJCQkJICAgICAgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQpKSkKKwkJCQkJZXh0MmZzX3N3YXBfYml0bWFwKGZzLCBibG9ja19iaXRtYXAsIGJsb2NrX25ieXRlcyk7CisjZW5kaWYKKwkJCX0gZWxzZQorCQkJCW1lbXNldChibG9ja19iaXRtYXAsIDAsIGJsb2NrX25ieXRlcyk7CisJCQlibG9ja19iaXRtYXAgKz0gYmxvY2tfbmJ5dGVzOworCQl9CisJCWlmIChpbm9kZV9iaXRtYXApIHsKKwkJCWJsayA9IGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX2JpdG1hcDsKKwkJCWlmIChibGspIHsKKwkJCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxrLAorCQkJCQkgICAgIC1pbm9kZV9uYnl0ZXMsIGlub2RlX2JpdG1hcCk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlyZXR2YWwgPSBFWFQyX0VUX0lOT0RFX0JJVE1BUF9SRUFEOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorI2lmZGVmIEVYVDJfQklHX0VORElBTl9CSVRNQVBTCisJCQkJaWYgKCEoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCQkJCSAgICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKSkpCisJCQkJCWV4dDJmc19zd2FwX2JpdG1hcChmcywgaW5vZGVfYml0bWFwLCBpbm9kZV9uYnl0ZXMpOworI2VuZGlmCisJCQl9IGVsc2UKKwkJCQltZW1zZXQoaW5vZGVfYml0bWFwLCAwLCBpbm9kZV9uYnl0ZXMpOworCQkJaW5vZGVfYml0bWFwICs9IGlub2RlX25ieXRlczsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwlpZiAoZG9fYmxvY2spIHsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZmcy0+YmxvY2tfbWFwKTsKKwl9CisJaWYgKGRvX2lub2RlKSB7CisJCWV4dDJmc19mcmVlX21lbSgmZnMtPmlub2RlX21hcCk7CisJfQorCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3JlYWRfaW5vZGVfYml0bWFwIChleHQyX2ZpbHN5cyBmcykKK3sKKwlyZXR1cm4gcmVhZF9iaXRtYXBzKGZzLCAxLCAwKTsKK30KKworZXJyY29kZV90IGV4dDJmc19yZWFkX2Jsb2NrX2JpdG1hcChleHQyX2ZpbHN5cyBmcykKK3sKKwlyZXR1cm4gcmVhZF9iaXRtYXBzKGZzLCAwLCAxKTsKK30KKworZXJyY29kZV90IGV4dDJmc19yZWFkX2JpdG1hcHMoZXh0Ml9maWxzeXMgZnMpCit7CisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmIChmcy0+aW5vZGVfbWFwICYmIGZzLT5ibG9ja19tYXApCisJCXJldHVybiAwOworCisJcmV0dXJuIHJlYWRfYml0bWFwcyhmcywgIWZzLT5pbm9kZV9tYXAsICFmcy0+YmxvY2tfbWFwKTsKK30KKworZXJyY29kZV90IGV4dDJmc193cml0ZV9iaXRtYXBzKGV4dDJfZmlsc3lzIGZzKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKGZzLT5ibG9ja19tYXAgJiYgZXh0MmZzX3Rlc3RfYmJfZGlydHkoZnMpKSB7CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9ibG9ja19iaXRtYXAoZnMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKGZzLT5pbm9kZV9tYXAgJiYgZXh0MmZzX3Rlc3RfaWJfZGlydHkoZnMpKSB7CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZV9iaXRtYXAoZnMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvc3BhcnNlLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvc3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkMzA3MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9zcGFyc2UuYwpAQCAtMCwwICsxLDc5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzcGFyc2UuYyAtLS0gZmluZCB0aGUgZ3JvdXBzIGluIGFuIGV4dDIgZmlsZXN5c3RlbSB3aXRoIG1ldGFkYXRhIGJhY2t1cHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBBbmRyZWFzIERpbGdlci4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmc1AuaCIKKworc3RhdGljIGludCB0ZXN0X3Jvb3QoaW50IGEsIGludCBiKQoreworCWlmIChhID09IDApCisJCXJldHVybiAxOworCXdoaWxlICgxKSB7CisJCWlmIChhID09IDEpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGEgJSBiKQorCQkJcmV0dXJuIDA7CisJCWEgPSBhIC8gYjsKKwl9Cit9CisKK2ludCBleHQyZnNfYmdfaGFzX3N1cGVyKGV4dDJfZmlsc3lzIGZzLCBpbnQgZ3JvdXBfYmxvY2spCit7CisJaWYgKCEoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYKKwkgICAgICBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpCisJCXJldHVybiAxOworCisJaWYgKHRlc3Rfcm9vdChncm91cF9ibG9jaywgMykgfHwgKHRlc3Rfcm9vdChncm91cF9ibG9jaywgNSkpIHx8CisJICAgIHRlc3Rfcm9vdChncm91cF9ibG9jaywgNykpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJdGVyYXRlIHRocm91Z2ggdGhlIGdyb3VwcyB3aGljaCBob2xkIEJBQ0tVUCBzdXBlcmJsb2NrL0dEVCBjb3BpZXMgaW4gYW4KKyAqIGV4dDMgZmlsZXN5c3RlbS4gIFRoZSBjb3VudGVycyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMSwgNSwgYW5kIDcgYmVmb3JlCisgKiBjYWxsaW5nIHRoaXMgZm9yIHRoZSBmaXJzdCB0aW1lLiAgSW4gYSBzcGFyc2UgZmlsZXN5c3RlbSBpdCB3aWxsIGJlIHRoZQorICogc2VxdWVuY2Ugb2YgcG93ZXJzIG9mIDMsIDUsIGFuZCA3OiAxLCAzLCA1LCA3LCA5LCAyNSwgMjcsIDQ5LCA4MSwgLi4uCisgKiBGb3IgYSBub24tc3BhcnNlIGZpbGVzeXN0ZW0gaXQgd2lsbCBiZSBldmVyeSBncm91cDogMSwgMiwgMywgNCwgLi4uCisgKi8KK3Vuc2lnbmVkIGludCBleHQyZnNfbGlzdF9iYWNrdXBzKGV4dDJfZmlsc3lzIGZzLCB1bnNpZ25lZCBpbnQgKnRocmVlLAorCQkJCSB1bnNpZ25lZCBpbnQgKmZpdmUsIHVuc2lnbmVkIGludCAqc2V2ZW4pCit7CisJdW5zaWduZWQgaW50ICptaW4gPSB0aHJlZTsKKwlpbnQgbXVsdCA9IDM7CisJdW5zaWduZWQgaW50IHJldDsKKworCWlmICghKGZzLT5zdXBlci0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJICAgICAgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpKSB7CisJCXJldCA9ICptaW47CisJCSptaW4gKz0gMTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoKmZpdmUgPCAqbWluKSB7CisJCW1pbiA9IGZpdmU7CisJCW11bHQgPSA1OworCX0KKwlpZiAoKnNldmVuIDwgKm1pbikgeworCQltaW4gPSBzZXZlbjsKKwkJbXVsdCA9IDc7CisJfQorCisJcmV0ID0gKm1pbjsKKwkqbWluICo9IG11bHQ7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3N3YXBmcy5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3N3YXBmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Yjc1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvc3dhcGZzLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHN3YXBmcy5jIC0tLSBzd2FwIGV4dDIgZmlsZXN5c3RlbSBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDIwMDIgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKyNpbmNsdWRlICJleHQyX2V4dF9hdHRyLmgiCisKKyNpZiBCQl9CSUdfRU5ESUFOCit2b2lkIGV4dDJmc19zd2FwX3N1cGVyKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogc2IpCit7CisJaW50IGk7CisJc2ItPnNfaW5vZGVzX2NvdW50ID0gZXh0MmZzX3N3YWIzMihzYi0+c19pbm9kZXNfY291bnQpOworCXNiLT5zX2Jsb2Nrc19jb3VudCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfYmxvY2tzX2NvdW50KTsKKwlzYi0+c19yX2Jsb2Nrc19jb3VudCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfcl9ibG9ja3NfY291bnQpOworCXNiLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gZXh0MmZzX3N3YWIzMihzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCk7CisJc2ItPnNfZnJlZV9pbm9kZXNfY291bnQgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwlzYi0+c19maXJzdF9kYXRhX2Jsb2NrID0gZXh0MmZzX3N3YWIzMihzYi0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlzYi0+c19sb2dfYmxvY2tfc2l6ZSA9IGV4dDJmc19zd2FiMzIoc2ItPnNfbG9nX2Jsb2NrX3NpemUpOworCXNiLT5zX2xvZ19mcmFnX3NpemUgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2xvZ19mcmFnX3NpemUpOworCXNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOworCXNiLT5zX2ZyYWdzX3Blcl9ncm91cCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfZnJhZ3NfcGVyX2dyb3VwKTsKKwlzYi0+c19pbm9kZXNfcGVyX2dyb3VwID0gZXh0MmZzX3N3YWIzMihzYi0+c19pbm9kZXNfcGVyX2dyb3VwKTsKKwlzYi0+c19tdGltZSA9IGV4dDJmc19zd2FiMzIoc2ItPnNfbXRpbWUpOworCXNiLT5zX3d0aW1lID0gZXh0MmZzX3N3YWIzMihzYi0+c193dGltZSk7CisJc2ItPnNfbW50X2NvdW50ID0gZXh0MmZzX3N3YWIxNihzYi0+c19tbnRfY291bnQpOworCXNiLT5zX21heF9tbnRfY291bnQgPSBleHQyZnNfc3dhYjE2KHNiLT5zX21heF9tbnRfY291bnQpOworCXNiLT5zX21hZ2ljID0gZXh0MmZzX3N3YWIxNihzYi0+c19tYWdpYyk7CisJc2ItPnNfc3RhdGUgPSBleHQyZnNfc3dhYjE2KHNiLT5zX3N0YXRlKTsKKwlzYi0+c19lcnJvcnMgPSBleHQyZnNfc3dhYjE2KHNiLT5zX2Vycm9ycyk7CisJc2ItPnNfbWlub3JfcmV2X2xldmVsID0gZXh0MmZzX3N3YWIxNihzYi0+c19taW5vcl9yZXZfbGV2ZWwpOworCXNiLT5zX2xhc3RjaGVjayA9IGV4dDJmc19zd2FiMzIoc2ItPnNfbGFzdGNoZWNrKTsKKwlzYi0+c19jaGVja2ludGVydmFsID0gZXh0MmZzX3N3YWIzMihzYi0+c19jaGVja2ludGVydmFsKTsKKwlzYi0+c19jcmVhdG9yX29zID0gZXh0MmZzX3N3YWIzMihzYi0+c19jcmVhdG9yX29zKTsKKwlzYi0+c19yZXZfbGV2ZWwgPSBleHQyZnNfc3dhYjMyKHNiLT5zX3Jldl9sZXZlbCk7CisJc2ItPnNfZGVmX3Jlc3VpZCA9IGV4dDJmc19zd2FiMTYoc2ItPnNfZGVmX3Jlc3VpZCk7CisJc2ItPnNfZGVmX3Jlc2dpZCA9IGV4dDJmc19zd2FiMTYoc2ItPnNfZGVmX3Jlc2dpZCk7CisJc2ItPnNfZmlyc3RfaW5vID0gZXh0MmZzX3N3YWIzMihzYi0+c19maXJzdF9pbm8pOworCXNiLT5zX2lub2RlX3NpemUgPSBleHQyZnNfc3dhYjE2KHNiLT5zX2lub2RlX3NpemUpOworCXNiLT5zX2Jsb2NrX2dyb3VwX25yID0gZXh0MmZzX3N3YWIxNihzYi0+c19ibG9ja19ncm91cF9ucik7CisJc2ItPnNfZmVhdHVyZV9jb21wYXQgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2ZlYXR1cmVfY29tcGF0KTsKKwlzYi0+c19mZWF0dXJlX2luY29tcGF0ID0gZXh0MmZzX3N3YWIzMihzYi0+c19mZWF0dXJlX2luY29tcGF0KTsKKwlzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfZmVhdHVyZV9yb19jb21wYXQpOworCXNiLT5zX2FsZ29yaXRobV91c2FnZV9iaXRtYXAgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2FsZ29yaXRobV91c2FnZV9iaXRtYXApOworCXNiLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MgPSBleHQyZnNfc3dhYjE2KHNiLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpOworCXNiLT5zX2pvdXJuYWxfaW51bSA9IGV4dDJmc19zd2FiMzIoc2ItPnNfam91cm5hbF9pbnVtKTsKKwlzYi0+c19qb3VybmFsX2RldiA9IGV4dDJmc19zd2FiMzIoc2ItPnNfam91cm5hbF9kZXYpOworCXNiLT5zX2xhc3Rfb3JwaGFuID0gZXh0MmZzX3N3YWIzMihzYi0+c19sYXN0X29ycGhhbik7CisJc2ItPnNfZGVmYXVsdF9tb3VudF9vcHRzID0gZXh0MmZzX3N3YWIzMihzYi0+c19kZWZhdWx0X21vdW50X29wdHMpOworCXNiLT5zX2ZpcnN0X21ldGFfYmcgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2ZpcnN0X21ldGFfYmcpOworCXNiLT5zX21rZnNfdGltZSA9IGV4dDJmc19zd2FiMzIoc2ItPnNfbWtmc190aW1lKTsKKwlmb3IgKGk9MDsgaSA8IDQ7IGkrKykKKwkJc2ItPnNfaGFzaF9zZWVkW2ldID0gZXh0MmZzX3N3YWIzMihzYi0+c19oYXNoX3NlZWRbaV0pOworCWZvciAoaT0wOyBpIDwgMTc7IGkrKykKKwkJc2ItPnNfam5sX2Jsb2Nrc1tpXSA9IGV4dDJmc19zd2FiMzIoc2ItPnNfam5sX2Jsb2Nrc1tpXSk7Cit9CisKK3ZvaWQgZXh0MmZzX3N3YXBfZ3JvdXBfZGVzYyhzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpnZHApCit7CisJZ2RwLT5iZ19ibG9ja19iaXRtYXAgPSBleHQyZnNfc3dhYjMyKGdkcC0+YmdfYmxvY2tfYml0bWFwKTsKKwlnZHAtPmJnX2lub2RlX2JpdG1hcCA9IGV4dDJmc19zd2FiMzIoZ2RwLT5iZ19pbm9kZV9iaXRtYXApOworCWdkcC0+YmdfaW5vZGVfdGFibGUgPSBleHQyZnNfc3dhYjMyKGdkcC0+YmdfaW5vZGVfdGFibGUpOworCWdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQgPSBleHQyZnNfc3dhYjE2KGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCWdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQgPSBleHQyZnNfc3dhYjE2KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpOworCWdkcC0+YmdfdXNlZF9kaXJzX2NvdW50ID0gZXh0MmZzX3N3YWIxNihnZHAtPmJnX3VzZWRfZGlyc19jb3VudCk7Cit9CisKK3ZvaWQgZXh0MmZzX3N3YXBfZXh0X2F0dHIoY2hhciAqdG8sIGNoYXIgKmZyb20sIGludCBidWZzaXplLCBpbnQgaGFzX2hlYWRlcikKK3sKKwlzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9oZWFkZXIgKmZyb21faGVhZGVyID0KKwkJKHN0cnVjdCBleHQyX2V4dF9hdHRyX2hlYWRlciAqKWZyb207CisJc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyICp0b19oZWFkZXIgPQorCQkoc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyICopdG87CisJc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkgKmZyb21fZW50cnksICp0b19lbnRyeTsKKwljaGFyICpmcm9tX2VuZCA9IChjaGFyICopZnJvbV9oZWFkZXIgKyBidWZzaXplOworCWludCBuOworCisJaWYgKHRvX2hlYWRlciAhPSBmcm9tX2hlYWRlcikKKwkJbWVtY3B5KHRvX2hlYWRlciwgZnJvbV9oZWFkZXIsIGJ1ZnNpemUpOworCisJZnJvbV9lbnRyeSA9IChzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSAqKWZyb21faGVhZGVyOworCXRvX2VudHJ5ICAgPSAoc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkgKil0b19oZWFkZXI7CisKKwlpZiAoaGFzX2hlYWRlcikgeworCQl0b19oZWFkZXItPmhfbWFnaWMgICAgPSBleHQyZnNfc3dhYjMyKGZyb21faGVhZGVyLT5oX21hZ2ljKTsKKwkJdG9faGVhZGVyLT5oX2Jsb2NrcyAgID0gZXh0MmZzX3N3YWIzMihmcm9tX2hlYWRlci0+aF9ibG9ja3MpOworCQl0b19oZWFkZXItPmhfcmVmY291bnQgPSBleHQyZnNfc3dhYjMyKGZyb21faGVhZGVyLT5oX3JlZmNvdW50KTsKKwkJZm9yIChuPTA7IG48NDsgbisrKQorCQkJdG9faGVhZGVyLT5oX3Jlc2VydmVkW25dID0KKwkJCQlleHQyZnNfc3dhYjMyKGZyb21faGVhZGVyLT5oX3Jlc2VydmVkW25dKTsKKwkJZnJvbV9lbnRyeSA9IChzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSAqKShmcm9tX2hlYWRlcisxKTsKKwkJdG9fZW50cnkgICA9IChzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSAqKSh0b19oZWFkZXIrMSk7CisJfQorCisJd2hpbGUgKChjaGFyICopZnJvbV9lbnRyeSA8IGZyb21fZW5kICYmICooX191MzIgKilmcm9tX2VudHJ5KSB7CisJCXRvX2VudHJ5LT5lX3ZhbHVlX29mZnMgID0KKwkJCWV4dDJmc19zd2FiMTYoZnJvbV9lbnRyeS0+ZV92YWx1ZV9vZmZzKTsKKwkJdG9fZW50cnktPmVfdmFsdWVfYmxvY2sgPQorCQkJZXh0MmZzX3N3YWIzMihmcm9tX2VudHJ5LT5lX3ZhbHVlX2Jsb2NrKTsKKwkJdG9fZW50cnktPmVfdmFsdWVfc2l6ZSAgPQorCQkJZXh0MmZzX3N3YWIzMihmcm9tX2VudHJ5LT5lX3ZhbHVlX3NpemUpOworCQlmcm9tX2VudHJ5ID0gRVhUMl9FWFRfQVRUUl9ORVhUKGZyb21fZW50cnkpOworCQl0b19lbnRyeSAgID0gRVhUMl9FWFRfQVRUUl9ORVhUKHRvX2VudHJ5KTsKKwl9Cit9CisKK3ZvaWQgZXh0MmZzX3N3YXBfaW5vZGVfZnVsbChleHQyX2ZpbHN5cyBmcywgc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKnQsCisJCQkgICAgc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKmYsIGludCBob3N0b3JkZXIsCisJCQkgICAgaW50IGJ1ZnNpemUpCit7CisJdW5zaWduZWQgaTsKKwlpbnQgaXNsbmsgPSAwOworCV9fdTMyICplYWYsICplYXQ7CisKKwlpZiAoaG9zdG9yZGVyICYmIExJTlVYX1NfSVNMTksoZi0+aV9tb2RlKSkKKwkJaXNsbmsgPSAxOworCXQtPmlfbW9kZSA9IGV4dDJmc19zd2FiMTYoZi0+aV9tb2RlKTsKKwlpZiAoIWhvc3RvcmRlciAmJiBMSU5VWF9TX0lTTE5LKHQtPmlfbW9kZSkpCisJCWlzbG5rID0gMTsKKwl0LT5pX3VpZCA9IGV4dDJmc19zd2FiMTYoZi0+aV91aWQpOworCXQtPmlfc2l6ZSA9IGV4dDJmc19zd2FiMzIoZi0+aV9zaXplKTsKKwl0LT5pX2F0aW1lID0gZXh0MmZzX3N3YWIzMihmLT5pX2F0aW1lKTsKKwl0LT5pX2N0aW1lID0gZXh0MmZzX3N3YWIzMihmLT5pX2N0aW1lKTsKKwl0LT5pX210aW1lID0gZXh0MmZzX3N3YWIzMihmLT5pX210aW1lKTsKKwl0LT5pX2R0aW1lID0gZXh0MmZzX3N3YWIzMihmLT5pX2R0aW1lKTsKKwl0LT5pX2dpZCA9IGV4dDJmc19zd2FiMTYoZi0+aV9naWQpOworCXQtPmlfbGlua3NfY291bnQgPSBleHQyZnNfc3dhYjE2KGYtPmlfbGlua3NfY291bnQpOworCXQtPmlfYmxvY2tzID0gZXh0MmZzX3N3YWIzMihmLT5pX2Jsb2Nrcyk7CisJdC0+aV9mbGFncyA9IGV4dDJmc19zd2FiMzIoZi0+aV9mbGFncyk7CisJdC0+aV9maWxlX2FjbCA9IGV4dDJmc19zd2FiMzIoZi0+aV9maWxlX2FjbCk7CisJdC0+aV9kaXJfYWNsID0gZXh0MmZzX3N3YWIzMihmLT5pX2Rpcl9hY2wpOworCWlmICghaXNsbmsgfHwgZXh0MmZzX2lub2RlX2RhdGFfYmxvY2tzKGZzLCAoc3RydWN0IGV4dDJfaW5vZGUgKil0KSkgeworCQlmb3IgKGkgPSAwOyBpIDwgRVhUMl9OX0JMT0NLUzsgaSsrKQorCQkJdC0+aV9ibG9ja1tpXSA9IGV4dDJmc19zd2FiMzIoZi0+aV9ibG9ja1tpXSk7CisJfSBlbHNlIGlmICh0ICE9IGYpIHsKKwkJZm9yIChpID0gMDsgaSA8IEVYVDJfTl9CTE9DS1M7IGkrKykKKwkJCXQtPmlfYmxvY2tbaV0gPSBmLT5pX2Jsb2NrW2ldOworCX0KKwl0LT5pX2dlbmVyYXRpb24gPSBleHQyZnNfc3dhYjMyKGYtPmlfZ2VuZXJhdGlvbik7CisJdC0+aV9mYWRkciA9IGV4dDJmc19zd2FiMzIoZi0+aV9mYWRkcik7CisKKwlzd2l0Y2ggKGZzLT5zdXBlci0+c19jcmVhdG9yX29zKSB7CisJY2FzZSBFWFQyX09TX0xJTlVYOgorCQl0LT5vc2QxLmxpbnV4MS5sX2lfcmVzZXJ2ZWQxID0KKwkJCWV4dDJmc19zd2FiMzIoZi0+b3NkMS5saW51eDEubF9pX3Jlc2VydmVkMSk7CisJCXQtPm9zZDIubGludXgyLmxfaV9mcmFnID0gZi0+b3NkMi5saW51eDIubF9pX2ZyYWc7CisJCXQtPm9zZDIubGludXgyLmxfaV9mc2l6ZSA9IGYtPm9zZDIubGludXgyLmxfaV9mc2l6ZTsKKwkJdC0+b3NkMi5saW51eDIuaV9wYWQxID0gZXh0MmZzX3N3YWIxNihmLT5vc2QyLmxpbnV4Mi5pX3BhZDEpOworCQl0LT5vc2QyLmxpbnV4Mi5sX2lfdWlkX2hpZ2ggPQorCQkgIGV4dDJmc19zd2FiMTYgKGYtPm9zZDIubGludXgyLmxfaV91aWRfaGlnaCk7CisJCXQtPm9zZDIubGludXgyLmxfaV9naWRfaGlnaCA9CisJCSAgZXh0MmZzX3N3YWIxNiAoZi0+b3NkMi5saW51eDIubF9pX2dpZF9oaWdoKTsKKwkJdC0+b3NkMi5saW51eDIubF9pX3Jlc2VydmVkMiA9CisJCQlleHQyZnNfc3dhYjMyKGYtPm9zZDIubGludXgyLmxfaV9yZXNlcnZlZDIpOworCQlicmVhazsKKwljYXNlIEVYVDJfT1NfSFVSRDoKKwkJdC0+b3NkMS5odXJkMS5oX2lfdHJhbnNsYXRvciA9CisJCSAgZXh0MmZzX3N3YWIzMiAoZi0+b3NkMS5odXJkMS5oX2lfdHJhbnNsYXRvcik7CisJCXQtPm9zZDIuaHVyZDIuaF9pX2ZyYWcgPSBmLT5vc2QyLmh1cmQyLmhfaV9mcmFnOworCQl0LT5vc2QyLmh1cmQyLmhfaV9mc2l6ZSA9IGYtPm9zZDIuaHVyZDIuaF9pX2ZzaXplOworCQl0LT5vc2QyLmh1cmQyLmhfaV9tb2RlX2hpZ2ggPQorCQkgIGV4dDJmc19zd2FiMTYgKGYtPm9zZDIuaHVyZDIuaF9pX21vZGVfaGlnaCk7CisJCXQtPm9zZDIuaHVyZDIuaF9pX3VpZF9oaWdoID0KKwkJICBleHQyZnNfc3dhYjE2IChmLT5vc2QyLmh1cmQyLmhfaV91aWRfaGlnaCk7CisJCXQtPm9zZDIuaHVyZDIuaF9pX2dpZF9oaWdoID0KKwkJICBleHQyZnNfc3dhYjE2IChmLT5vc2QyLmh1cmQyLmhfaV9naWRfaGlnaCk7CisJCXQtPm9zZDIuaHVyZDIuaF9pX2F1dGhvciA9CisJCSAgZXh0MmZzX3N3YWIzMiAoZi0+b3NkMi5odXJkMi5oX2lfYXV0aG9yKTsKKwkJYnJlYWs7CisJY2FzZSBFWFQyX09TX01BU0lYOgorCQl0LT5vc2QxLm1hc2l4MS5tX2lfcmVzZXJ2ZWQxID0KKwkJCWV4dDJmc19zd2FiMzIoZi0+b3NkMS5tYXNpeDEubV9pX3Jlc2VydmVkMSk7CisJCXQtPm9zZDIubWFzaXgyLm1faV9mcmFnID0gZi0+b3NkMi5tYXNpeDIubV9pX2ZyYWc7CisJCXQtPm9zZDIubWFzaXgyLm1faV9mc2l6ZSA9IGYtPm9zZDIubWFzaXgyLm1faV9mc2l6ZTsKKwkJdC0+b3NkMi5tYXNpeDIubV9wYWQxID0gZXh0MmZzX3N3YWIxNihmLT5vc2QyLm1hc2l4Mi5tX3BhZDEpOworCQl0LT5vc2QyLm1hc2l4Mi5tX2lfcmVzZXJ2ZWQyWzBdID0KKwkJCWV4dDJmc19zd2FiMzIoZi0+b3NkMi5tYXNpeDIubV9pX3Jlc2VydmVkMlswXSk7CisJCXQtPm9zZDIubWFzaXgyLm1faV9yZXNlcnZlZDJbMV0gPQorCQkJZXh0MmZzX3N3YWIzMihmLT5vc2QyLm1hc2l4Mi5tX2lfcmVzZXJ2ZWQyWzFdKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGJ1ZnNpemUgPCAoaW50KSAoc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSArIHNpemVvZihfX3UxNikpKQorCQlyZXR1cm47IC8qIG5vIGlfZXh0cmFfaXNpemUgZmllbGQgKi8KKworCXQtPmlfZXh0cmFfaXNpemUgPSBleHQyZnNfc3dhYjE2KGYtPmlfZXh0cmFfaXNpemUpOworCWlmICh0LT5pX2V4dHJhX2lzaXplID4gRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcikgLQorCQkJCXNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpIHsKKwkJLyogdGhpcyBpcyBlcnJvciBjYXNlOiBpX2V4dHJhX3NpemUgaXMgdG9vIGxhcmdlICovCisJCXJldHVybjsKKwl9CisKKwlpID0gc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSArIHQtPmlfZXh0cmFfaXNpemUgKyBzaXplb2YoX191MzIpOworCWlmIChidWZzaXplIDwgKGludCkgaSkKKwkJcmV0dXJuOyAvKiBubyBzcGFjZSBmb3IgRUEgbWFnaWMgKi8KKworCWVhZiA9IChfX3UzMiAqKSAoKChjaGFyICopIGYpICsgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSArCisJCQkJCWYtPmlfZXh0cmFfaXNpemUpOworCisJaWYgKGV4dDJmc19zd2FiMzIoKmVhZikgIT0gRVhUMl9FWFRfQVRUUl9NQUdJQykKKwkJcmV0dXJuOyAvKiBpdCBzZWVtcyBubyBtYWdpYyBoZXJlICovCisKKwllYXQgPSAoX191MzIgKikgKCgoY2hhciAqKSB0KSArIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkgKworCQkJCQlmLT5pX2V4dHJhX2lzaXplKTsKKwkqZWF0ID0gZXh0MmZzX3N3YWIzMigqZWFmKTsKKworCS8qIGNvbnZlcnQgRUEocykgKi8KKwlleHQyZnNfc3dhcF9leHRfYXR0cigoY2hhciAqKSAoZWF0ICsgMSksIChjaGFyICopIChlYWYgKyAxKSwKKwkJCSAgICAgYnVmc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkgLQorCQkJICAgICB0LT5pX2V4dHJhX2lzaXplIC0gc2l6ZW9mKF9fdTMyKSwgMCk7Cit9CisKK3ZvaWQgZXh0MmZzX3N3YXBfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIHN0cnVjdCBleHQyX2lub2RlICp0LAorCQkgICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmYsIGludCBob3N0b3JkZXIpCit7CisJZXh0MmZzX3N3YXBfaW5vZGVfZnVsbChmcywgKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIHQsCisJCQkJKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIGYsIGhvc3RvcmRlciwKKwkJCQlzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdGVzdF9pby5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3Rlc3RfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQwZDlhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3Rlc3RfaW8uYwpAQCAtMCwwICsxLDM4MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGVzdF9pby5jIC0tLSBUaGlzIGlzIHRoZSBUZXN0IEkvTyBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBGb3IgY2hlY2tpbmcgc3RydWN0dXJlIG1hZ2ljIG51bWJlcnMuLi4KKyAqLworCisjZGVmaW5lIEVYVDJfQ0hFQ0tfTUFHSUMoc3RydWN0LCBjb2RlKSBcCisJICBpZiAoKHN0cnVjdCktPm1hZ2ljICE9IChjb2RlKSkgcmV0dXJuIChjb2RlKQorCitzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgeworCWludAltYWdpYzsKKwlpb19jaGFubmVsIHJlYWw7CisJaW50IGZsYWdzOworCUZJTEUgKm91dGZpbGU7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwlpbnQgcmVhZF9hYm9ydF9jb3VudCwgd3JpdGVfYWJvcnRfY291bnQ7CisJdm9pZCAoKnJlYWRfYmxrKSh1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgY291bnQsIGVycmNvZGVfdCBlcnIpOworCXZvaWQgKCp3cml0ZV9ibGspKHVuc2lnbmVkIGxvbmcgYmxvY2ssIGludCBjb3VudCwgZXJyY29kZV90IGVycik7CisJdm9pZCAoKnNldF9ibGtzaXplKShpbnQgYmxrc2l6ZSwgZXJyY29kZV90IGVycik7CisJdm9pZCAoKndyaXRlX2J5dGUpKHVuc2lnbmVkIGxvbmcgYmxvY2ssIGludCBjb3VudCwgZXJyY29kZV90IGVycik7Cit9OworCitzdGF0aWMgZXJyY29kZV90IHRlc3Rfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIGlvX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIGVycmNvZGVfdCB0ZXN0X2Nsb3NlKGlvX2NoYW5uZWwgY2hhbm5lbCk7CitzdGF0aWMgZXJyY29kZV90IHRlc3Rfc2V0X2Jsa3NpemUoaW9fY2hhbm5lbCBjaGFubmVsLCBpbnQgYmxrc2l6ZSk7CitzdGF0aWMgZXJyY29kZV90IHRlc3RfcmVhZF9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJICAgICAgIGludCBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgZXJyY29kZV90IHRlc3Rfd3JpdGVfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCQlpbnQgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEpOworc3RhdGljIGVycmNvZGVfdCB0ZXN0X2ZsdXNoKGlvX2NoYW5uZWwgY2hhbm5lbCk7CitzdGF0aWMgZXJyY29kZV90IHRlc3Rfd3JpdGVfYnl0ZShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSBpbnQgY291bnQsIGNvbnN0IHZvaWQgKmJ1Zik7CitzdGF0aWMgZXJyY29kZV90IHRlc3Rfc2V0X29wdGlvbihpb19jaGFubmVsIGNoYW5uZWwsIGNvbnN0IGNoYXIgKm9wdGlvbiwKKwkJCQkgY29uc3QgY2hhciAqYXJnKTsKKworc3RhdGljIHN0cnVjdCBzdHJ1Y3RfaW9fbWFuYWdlciBzdHJ1Y3RfdGVzdF9tYW5hZ2VyID0geworCUVYVDJfRVRfTUFHSUNfSU9fTUFOQUdFUiwKKwkiVGVzdCBJL08gTWFuYWdlciIsCisJdGVzdF9vcGVuLAorCXRlc3RfY2xvc2UsCisJdGVzdF9zZXRfYmxrc2l6ZSwKKwl0ZXN0X3JlYWRfYmxrLAorCXRlc3Rfd3JpdGVfYmxrLAorCXRlc3RfZmx1c2gsCisJdGVzdF93cml0ZV9ieXRlLAorCXRlc3Rfc2V0X29wdGlvbgorfTsKKworaW9fbWFuYWdlciB0ZXN0X2lvX21hbmFnZXIgPSAmc3RydWN0X3Rlc3RfbWFuYWdlcjsKKworLyoKKyAqIFRoZXNlIGdsb2JhbCB2YXJpYWJsZSBjYW4gYmUgc2V0IGJ5IHRoZSB0ZXN0IHByb2dyYW0gYXMKKyAqIG5lY2Vzc2FyeSAqYmVmb3JlKiBjYWxsaW5nIHRlc3Rfb3BlbgorICovCitpb19tYW5hZ2VyIHRlc3RfaW9fYmFja2luZ19tYW5hZ2VyID0gMDsKK3ZvaWQgKCp0ZXN0X2lvX2NiX3JlYWRfYmxrKQorCSh1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgY291bnQsIGVycmNvZGVfdCBlcnIpID0gMDsKK3ZvaWQgKCp0ZXN0X2lvX2NiX3dyaXRlX2JsaykKKwkodW5zaWduZWQgbG9uZyBibG9jaywgaW50IGNvdW50LCBlcnJjb2RlX3QgZXJyKSA9IDA7Cit2b2lkICgqdGVzdF9pb19jYl9zZXRfYmxrc2l6ZSkKKwkoaW50IGJsa3NpemUsIGVycmNvZGVfdCBlcnIpID0gMDsKK3ZvaWQgKCp0ZXN0X2lvX2NiX3dyaXRlX2J5dGUpCisJKHVuc2lnbmVkIGxvbmcgYmxvY2ssIGludCBjb3VudCwgZXJyY29kZV90IGVycikgPSAwOworCisvKgorICogVGVzdCBmbGFncworICovCisjZGVmaW5lIFRFU1RfRkxBR19SRUFECQkJMHgwMQorI2RlZmluZSBURVNUX0ZMQUdfV1JJVEUJCQkweDAyCisjZGVmaW5lIFRFU1RfRkxBR19TRVRfQkxLU0laRQkJMHgwNAorI2RlZmluZSBURVNUX0ZMQUdfRkxVU0gJCQkweDA4CisjZGVmaW5lIFRFU1RfRkxBR19EVU1QCQkJMHgxMAorI2RlZmluZSBURVNUX0ZMQUdfU0VUX09QVElPTgkJMHgyMAorCitzdGF0aWMgdm9pZCB0ZXN0X2R1bXBfYmxvY2soaW9fY2hhbm5lbCBjaGFubmVsLAorCQkJICAgIHN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqZGF0YSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGJsb2NrLCBjb25zdCB2b2lkICpidWYpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY3A7CisJRklMRSAqZiA9IGRhdGEtPm91dGZpbGU7CisJaW50CWk7CisJdW5zaWduZWQgbG9uZwlja3N1bSA9IDA7CisKKwlmb3IgKGk9MCwgY3AgPSBidWY7IGkgPCBjaGFubmVsLT5ibG9ja19zaXplOyBpKyssIGNwKyspIHsKKwkJY2tzdW0gKz0gKmNwOworCX0KKwlmcHJpbnRmKGYsICJDb250ZW50cyBvZiBibG9jayAlbHUsIGNoZWNrc3VtICUwOGx1OlxuIiwgYmxvY2ssIGNrc3VtKTsKKwlmb3IgKGk9MCwgY3AgPSBidWY7IGkgPCBjaGFubmVsLT5ibG9ja19zaXplOyBpKyssIGNwKyspIHsKKwkJaWYgKChpICUgMTYpID09IDApCisJCQlmcHJpbnRmKGYsICIlMDR4OiAiLCBpKTsKKwkJZnByaW50ZihmLCAiJTAyeCVjIiwgKmNwLCAoKGkgJSAxNikgPT0gMTUpID8gJ1xuJyA6ICcgJyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2Fib3J0KGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaykKK3sKKwlzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKmRhdGE7CisJRklMRSAqZjsKKworCWRhdGEgPSAoc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlmID0gZGF0YS0+b3V0ZmlsZTsKKwl0ZXN0X2ZsdXNoKGNoYW5uZWwpOworCisJZnByaW50ZihmLCAiQWJvcnRpbmcgZHVlIHRvIEkvTyB0byBibG9jayAlbHVcbiIsIGJsb2NrKTsKKwlmZmx1c2goZik7CisJYWJvcnQoKTsKK30KKworc3RhdGljIGVycmNvZGVfdCB0ZXN0X29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBpb19jaGFubmVsICpjaGFubmVsKQoreworCWlvX2NoYW5uZWwJaW8gPSBOVUxMOworCXN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqZGF0YSA9IE5VTEw7CisJZXJyY29kZV90CXJldHZhbDsKKwljaGFyCQkqdmFsdWU7CisKKwlpZiAobmFtZSA9PSAwKQorCQlyZXR1cm4gRVhUMl9FVF9CQURfREVWSUNFX05BTUU7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBzdHJ1Y3RfaW9fY2hhbm5lbCksICZpbyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZW1zZXQoaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc3RydWN0X2lvX2NoYW5uZWwpKTsKKwlpby0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUw7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSksICZkYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXA7CisJfQorCWlvLT5tYW5hZ2VyID0gdGVzdF9pb19tYW5hZ2VyOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihuYW1lKSsxLCAmaW8tPm5hbWUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCXN0cmNweShpby0+bmFtZSwgbmFtZSk7CisJaW8tPnByaXZhdGVfZGF0YSA9IGRhdGE7CisJaW8tPmJsb2NrX3NpemUgPSAxMDI0OworCWlvLT5yZWFkX2Vycm9yID0gMDsKKwlpby0+d3JpdGVfZXJyb3IgPSAwOworCWlvLT5yZWZjb3VudCA9IDE7CisKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSkpOworCWRhdGEtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19URVNUX0lPX0NIQU5ORUw7CisJaWYgKHRlc3RfaW9fYmFja2luZ19tYW5hZ2VyKSB7CisJCXJldHZhbCA9IHRlc3RfaW9fYmFja2luZ19tYW5hZ2VyLT5vcGVuKG5hbWUsIGZsYWdzLAorCQkJCQkJICAgICAgICZkYXRhLT5yZWFsKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9IGVsc2UKKwkJZGF0YS0+cmVhbCA9IDA7CisJZGF0YS0+cmVhZF9ibGsgPQl0ZXN0X2lvX2NiX3JlYWRfYmxrOworCWRhdGEtPndyaXRlX2JsayA9CXRlc3RfaW9fY2Jfd3JpdGVfYmxrOworCWRhdGEtPnNldF9ibGtzaXplID0JdGVzdF9pb19jYl9zZXRfYmxrc2l6ZTsKKwlkYXRhLT53cml0ZV9ieXRlID0JdGVzdF9pb19jYl93cml0ZV9ieXRlOworCisJZGF0YS0+b3V0ZmlsZSA9IE5VTEw7CisJaWYgKCh2YWx1ZSA9IGdldGVudigiVEVTVF9JT19MT0dGSUxFIikpICE9IE5VTEwpCisJCWRhdGEtPm91dGZpbGUgPSBmb3Blbl9mb3Jfd3JpdGUodmFsdWUpOworCWlmICghZGF0YS0+b3V0ZmlsZSkKKwkJZGF0YS0+b3V0ZmlsZSA9IHN0ZGVycjsKKworCWRhdGEtPmZsYWdzID0gMDsKKwlpZiAoKHZhbHVlID0gZ2V0ZW52KCJURVNUX0lPX0ZMQUdTIikpICE9IE5VTEwpCisJCWRhdGEtPmZsYWdzID0gc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CisKKwlkYXRhLT5ibG9jayA9IDA7CisJaWYgKCh2YWx1ZSA9IGdldGVudigiVEVTVF9JT19CTE9DSyIpKSAhPSBOVUxMKQorCQlkYXRhLT5ibG9jayA9IHN0cnRvdWwodmFsdWUsIE5VTEwsIDApOworCisJZGF0YS0+cmVhZF9hYm9ydF9jb3VudCA9IDA7CisJaWYgKCh2YWx1ZSA9IGdldGVudigiVEVTVF9JT19SRUFEX0FCT1JUIikpICE9IE5VTEwpCisJCWRhdGEtPnJlYWRfYWJvcnRfY291bnQgPSBzdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKKworCWRhdGEtPndyaXRlX2Fib3J0X2NvdW50ID0gMDsKKwlpZiAoKHZhbHVlID0gZ2V0ZW52KCJURVNUX0lPX1dSSVRFX0FCT1JUIikpICE9IE5VTEwpCisJCWRhdGEtPndyaXRlX2Fib3J0X2NvdW50ID0gc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CisKKwkqY2hhbm5lbCA9IGlvOworCXJldHVybiAwOworCitjbGVhbnVwOgorCWV4dDJmc19mcmVlX21lbSgmaW8pOworCWV4dDJmc19mcmVlX21lbSgmZGF0YSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCB0ZXN0X2Nsb3NlKGlvX2NoYW5uZWwgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19URVNUX0lPX0NIQU5ORUwpOworCisJaWYgKC0tY2hhbm5lbC0+cmVmY291bnQgPiAwKQorCQlyZXR1cm4gMDsKKworCWlmIChkYXRhLT5yZWFsKQorCQlyZXR2YWwgPSBpb19jaGFubmVsX2Nsb3NlKGRhdGEtPnJlYWwpOworCisJaWYgKGRhdGEtPm91dGZpbGUgJiYgZGF0YS0+b3V0ZmlsZSAhPSBzdGRlcnIpCisJCWZjbG9zZShkYXRhLT5vdXRmaWxlKTsKKworCWV4dDJmc19mcmVlX21lbSgmY2hhbm5lbC0+cHJpdmF0ZV9kYXRhKTsKKwlleHQyZnNfZnJlZV9tZW0oJmNoYW5uZWwtPm5hbWUpOworCWV4dDJmc19mcmVlX21lbSgmY2hhbm5lbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCB0ZXN0X3NldF9ibGtzaXplKGlvX2NoYW5uZWwgY2hhbm5lbCwgaW50IGJsa3NpemUpCit7CisJc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVEVTVF9JT19DSEFOTkVMKTsKKworCWlmIChkYXRhLT5yZWFsKQorCQlyZXR2YWwgPSBpb19jaGFubmVsX3NldF9ibGtzaXplKGRhdGEtPnJlYWwsIGJsa3NpemUpOworCWlmIChkYXRhLT5zZXRfYmxrc2l6ZSkKKwkJZGF0YS0+c2V0X2Jsa3NpemUoYmxrc2l6ZSwgcmV0dmFsKTsKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBURVNUX0ZMQUdfU0VUX0JMS1NJWkUpCisJCWZwcmludGYoZGF0YS0+b3V0ZmlsZSwKKwkJCSJUZXN0X2lvOiBzZXRfYmxrc2l6ZSglZCkgcmV0dXJuZWQgJXNcbiIsCisJCQlibGtzaXplLCByZXR2YWwgPyBlcnJvcl9tZXNzYWdlKHJldHZhbCkgOiAiT0siKTsKKwljaGFubmVsLT5ibG9ja19zaXplID0gYmxrc2l6ZTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF9yZWFkX2Jsayhpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkgICAgICAgaW50IGNvdW50LCB2b2lkICpidWYpCit7CisJc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVEVTVF9JT19DSEFOTkVMKTsKKworCWlmIChkYXRhLT5yZWFsKQorCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGRhdGEtPnJlYWwsIGJsb2NrLCBjb3VudCwgYnVmKTsKKwlpZiAoZGF0YS0+cmVhZF9ibGspCisJCWRhdGEtPnJlYWRfYmxrKGJsb2NrLCBjb3VudCwgcmV0dmFsKTsKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBURVNUX0ZMQUdfUkVBRCkKKwkJZnByaW50ZihkYXRhLT5vdXRmaWxlLAorCQkJIlRlc3RfaW86IHJlYWRfYmxrKCVsdSwgJWQpIHJldHVybmVkICVzXG4iLAorCQkJYmxvY2ssIGNvdW50LCByZXR2YWwgPyBlcnJvcl9tZXNzYWdlKHJldHZhbCkgOiAiT0siKTsKKwlpZiAoZGF0YS0+YmxvY2sgJiYgZGF0YS0+YmxvY2sgPT0gYmxvY2spIHsKKwkJaWYgKGRhdGEtPmZsYWdzICYgVEVTVF9GTEFHX0RVTVApCisJCQl0ZXN0X2R1bXBfYmxvY2soY2hhbm5lbCwgZGF0YSwgYmxvY2ssIGJ1Zik7CisJCWlmICgtLWRhdGEtPnJlYWRfYWJvcnRfY291bnQgPT0gMCkKKwkJCXRlc3RfYWJvcnQoY2hhbm5lbCwgYmxvY2spOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZXJyY29kZV90IHRlc3Rfd3JpdGVfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgICBpbnQgY291bnQsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19URVNUX0lPX0NIQU5ORUwpOworCisJaWYgKGRhdGEtPnJlYWwpCisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGRhdGEtPnJlYWwsIGJsb2NrLCBjb3VudCwgYnVmKTsKKwlpZiAoZGF0YS0+d3JpdGVfYmxrKQorCQlkYXRhLT53cml0ZV9ibGsoYmxvY2ssIGNvdW50LCByZXR2YWwpOworCWlmIChkYXRhLT5mbGFncyAmIFRFU1RfRkxBR19XUklURSkKKwkJZnByaW50ZihkYXRhLT5vdXRmaWxlLAorCQkJIlRlc3RfaW86IHdyaXRlX2JsayglbHUsICVkKSByZXR1cm5lZCAlc1xuIiwKKwkJCWJsb2NrLCBjb3VudCwgcmV0dmFsID8gZXJyb3JfbWVzc2FnZShyZXR2YWwpIDogIk9LIik7CisJaWYgKGRhdGEtPmJsb2NrICYmIGRhdGEtPmJsb2NrID09IGJsb2NrKSB7CisJCWlmIChkYXRhLT5mbGFncyAmIFRFU1RfRkxBR19EVU1QKQorCQkJdGVzdF9kdW1wX2Jsb2NrKGNoYW5uZWwsIGRhdGEsIGJsb2NrLCBidWYpOworCQlpZiAoLS1kYXRhLT53cml0ZV9hYm9ydF9jb3VudCA9PSAwKQorCQkJdGVzdF9hYm9ydChjaGFubmVsLCBibG9jayk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF93cml0ZV9ieXRlKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICAgaW50IGNvdW50LCBjb25zdCB2b2lkICpidWYpCit7CisJc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVEVTVF9JT19DSEFOTkVMKTsKKworCWlmIChkYXRhLT5yZWFsICYmIGRhdGEtPnJlYWwtPm1hbmFnZXItPndyaXRlX2J5dGUpCisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYnl0ZShkYXRhLT5yZWFsLCBvZmZzZXQsIGNvdW50LCBidWYpOworCWlmIChkYXRhLT53cml0ZV9ieXRlKQorCQlkYXRhLT53cml0ZV9ieXRlKG9mZnNldCwgY291bnQsIHJldHZhbCk7CisJaWYgKGRhdGEtPmZsYWdzICYgVEVTVF9GTEFHX1dSSVRFKQorCQlmcHJpbnRmKGRhdGEtPm91dGZpbGUsCisJCQkiVGVzdF9pbzogd3JpdGVfYnl0ZSglbHUsICVkKSByZXR1cm5lZCAlc1xuIiwKKwkJCW9mZnNldCwgY291bnQsIHJldHZhbCA/IGVycm9yX21lc3NhZ2UocmV0dmFsKSA6ICJPSyIpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBGbHVzaCBkYXRhIGJ1ZmZlcnMgdG8gZGlzay4KKyAqLworc3RhdGljIGVycmNvZGVfdCB0ZXN0X2ZsdXNoKGlvX2NoYW5uZWwgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19URVNUX0lPX0NIQU5ORUwpOworCisJaWYgKGRhdGEtPnJlYWwpCisJCXJldHZhbCA9IGlvX2NoYW5uZWxfZmx1c2goZGF0YS0+cmVhbCk7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBURVNUX0ZMQUdfRkxVU0gpCisJCWZwcmludGYoZGF0YS0+b3V0ZmlsZSwgIlRlc3RfaW86IGZsdXNoKCkgcmV0dXJuZWQgJXNcbiIsCisJCQlyZXR2YWwgPyBlcnJvcl9tZXNzYWdlKHJldHZhbCkgOiAiT0siKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF9zZXRfb3B0aW9uKGlvX2NoYW5uZWwgY2hhbm5lbCwgY29uc3QgY2hhciAqb3B0aW9uLAorCQkJCSBjb25zdCBjaGFyICphcmcpCit7CisJc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVEVTVF9JT19DSEFOTkVMKTsKKworCisJaWYgKGRhdGEtPmZsYWdzICYgVEVTVF9GTEFHX1NFVF9PUFRJT04pCisJCWZwcmludGYoZGF0YS0+b3V0ZmlsZSwgIlRlc3RfaW86IHNldF9vcHRpb24oJXMsICVzKSAiLAorCQkJb3B0aW9uLCBhcmcpOworCWlmIChkYXRhLT5yZWFsICYmIGRhdGEtPnJlYWwtPm1hbmFnZXItPnNldF9vcHRpb24pIHsKKwkJcmV0dmFsID0gKGRhdGEtPnJlYWwtPm1hbmFnZXItPnNldF9vcHRpb24pKGRhdGEtPnJlYWwsCisJCQkJCQkJICAgb3B0aW9uLCBhcmcpOworCQlpZiAoZGF0YS0+ZmxhZ3MgJiBURVNUX0ZMQUdfU0VUX09QVElPTikKKwkJCWZwcmludGYoZGF0YS0+b3V0ZmlsZSwgInJldHVybmVkICVzXG4iLAorCQkJCXJldHZhbCA/IGVycm9yX21lc3NhZ2UocmV0dmFsKSA6ICJPSyIpOworCX0gZWxzZSB7CisJCWlmIChkYXRhLT5mbGFncyAmIFRFU1RfRkxBR19TRVRfT1BUSU9OKQorCQkJZnByaW50ZihkYXRhLT5vdXRmaWxlLCAibm90IGltcGxlbWVudGVkXG4iKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy91bml4X2lvLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdW5peF9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NGYwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdW5peF9pby5jCkBAIC0wLDAgKzEsNzAzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1bml4X2lvLmMgLS0tIFRoaXMgaXMgdGhlIFVuaXggKHdlbGwsIHJlYWxseSBQT1NJWCkgaW1wbGVtZW50YXRpb24KKyAqCW9mIHRoZSBJL08gbWFuYWdlci4KKyAqCisgKiBJbXBsZW1lbnRzIGEgb25lLWJsb2NrIHdyaXRlLXRocm91Z2ggY2FjaGUuCisgKgorICogSW5jbHVkZXMgc3VwcG9ydCBmb3IgV2luZG93cyBOVCBzdXBwb3J0IHVuZGVyIEN5Z3dpbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisgKgkyMDAyIGJ5IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIEZvciBjaGVja2luZyBzdHJ1Y3R1cmUgbWFnaWMgbnVtYmVycy4uLgorICovCisKKyNkZWZpbmUgRVhUMl9DSEVDS19NQUdJQyhzdHJ1Y3QsIGNvZGUpIFwKKwkgIGlmICgoc3RydWN0KS0+bWFnaWMgIT0gKGNvZGUpKSByZXR1cm4gKGNvZGUpCisKK3N0cnVjdCB1bml4X2NhY2hlIHsKKwljaGFyCQkqYnVmOworCXVuc2lnbmVkIGxvbmcJYmxvY2s7CisJaW50CQlhY2Nlc3NfdGltZTsKKwl1bnNpZ25lZAlkaXJ0eToxOworCXVuc2lnbmVkCWluX3VzZToxOworfTsKKworI2RlZmluZSBDQUNIRV9TSVpFIDgKKyNkZWZpbmUgV1JJVEVfRElSRUNUX1NJWkUgNAkvKiBNdXN0IGJlIHNtYWxsZXIgdGhhbiBDQUNIRV9TSVpFICovCisjZGVmaW5lIFJFQURfRElSRUNUX1NJWkUgNAkvKiBTaG91bGQgYmUgc21hbGxlciB0aGFuIENBQ0hFX1NJWkUgKi8KKworc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhIHsKKwlpbnQJbWFnaWM7CisJaW50CWRldjsKKwlpbnQJZmxhZ3M7CisJaW50CWFjY2Vzc190aW1lOworCWV4dDJfbG9mZl90IG9mZnNldDsKKwlzdHJ1Y3QgdW5peF9jYWNoZSBjYWNoZVtDQUNIRV9TSVpFXTsKK307CisKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9vcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywgaW9fY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgZXJyY29kZV90IHVuaXhfY2xvc2UoaW9fY2hhbm5lbCBjaGFubmVsKTsKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9zZXRfYmxrc2l6ZShpb19jaGFubmVsIGNoYW5uZWwsIGludCBibGtzaXplKTsKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9yZWFkX2Jsayhpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkgICAgICAgaW50IGNvdW50LCB2b2lkICpkYXRhKTsKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF93cml0ZV9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJCWludCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CitzdGF0aWMgZXJyY29kZV90IHVuaXhfZmx1c2goaW9fY2hhbm5lbCBjaGFubmVsKTsKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF93cml0ZV9ieXRlKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJaW50IHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworc3RhdGljIGVycmNvZGVfdCB1bml4X3NldF9vcHRpb24oaW9fY2hhbm5lbCBjaGFubmVsLCBjb25zdCBjaGFyICpvcHRpb24sCisJCQkJIGNvbnN0IGNoYXIgKmFyZyk7CisKK3N0YXRpYyB2b2lkIHJldXNlX2NhY2hlKGlvX2NoYW5uZWwgY2hhbm5lbCwgc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhLAorCQkgc3RydWN0IHVuaXhfY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGJsb2NrKTsKKworLyogX19GcmVlQlNEX2tlcm5lbF9fIGlzIGRlZmluZWQgYnkgR05VL2tGcmVlQlNEIC0gdGhlIEZyZWVCU0Qga2VybmVsCisgKiBkb2VzIG5vdCBrbm93IGJ1ZmZlcmVkIGJsb2NrIGRldmljZXMgLSBldmVyeXRoaW5nIGlzIHJhdy4gKi8KKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKQorI2RlZmluZSBORUVEX0JPVU5DRV9CVUZGRVIKKyNlbHNlCisjdW5kZWYgTkVFRF9CT1VOQ0VfQlVGRkVSCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdHJ1Y3RfaW9fbWFuYWdlciBzdHJ1Y3RfdW5peF9tYW5hZ2VyID0geworCUVYVDJfRVRfTUFHSUNfSU9fTUFOQUdFUiwKKwkiVW5peCBJL08gTWFuYWdlciIsCisJdW5peF9vcGVuLAorCXVuaXhfY2xvc2UsCisJdW5peF9zZXRfYmxrc2l6ZSwKKwl1bml4X3JlYWRfYmxrLAorCXVuaXhfd3JpdGVfYmxrLAorCXVuaXhfZmx1c2gsCisjaWZkZWYgTkVFRF9CT1VOQ0VfQlVGRkVSCisJMCwKKyNlbHNlCisJdW5peF93cml0ZV9ieXRlLAorI2VuZGlmCisJdW5peF9zZXRfb3B0aW9uCit9OworCitpb19tYW5hZ2VyIHVuaXhfaW9fbWFuYWdlciA9ICZzdHJ1Y3RfdW5peF9tYW5hZ2VyOworCisvKgorICogSGVyZSBhcmUgdGhlIHJhdyBJL08gZnVuY3Rpb25zCisgKi8KKyNpZm5kZWYgTkVFRF9CT1VOQ0VfQlVGRkVSCitzdGF0aWMgZXJyY29kZV90IHJhd19yZWFkX2Jsayhpb19jaGFubmVsIGNoYW5uZWwsCisJCQkgICAgICBzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJICAgICAgaW50IGNvdW50LCB2b2lkICpidWYpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlzc2l6ZV90CQlzaXplOworCWV4dDJfbG9mZl90CWxvY2F0aW9uOworCWludAkJYWN0dWFsID0gMDsKKworCXNpemUgPSAoY291bnQgPCAwKSA/IC1jb3VudCA6IGNvdW50ICogY2hhbm5lbC0+YmxvY2tfc2l6ZTsKKwlsb2NhdGlvbiA9ICgoZXh0Ml9sb2ZmX3QpIGJsb2NrICogY2hhbm5lbC0+YmxvY2tfc2l6ZSkgKyBkYXRhLT5vZmZzZXQ7CisJaWYgKGV4dDJmc19sbHNlZWsoZGF0YS0+ZGV2LCBsb2NhdGlvbiwgU0VFS19TRVQpICE9IGxvY2F0aW9uKSB7CisJCXJldHZhbCA9IGVycm5vID8gZXJybm8gOiBFWFQyX0VUX0xMU0VFS19GQUlMRUQ7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlhY3R1YWwgPSByZWFkKGRhdGEtPmRldiwgYnVmLCBzaXplKTsKKwlpZiAoYWN0dWFsICE9IHNpemUpIHsKKwkJaWYgKGFjdHVhbCA8IDApCisJCQlhY3R1YWwgPSAwOworCQlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1JFQUQ7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlyZXR1cm4gMDsKKworZXJyb3Jfb3V0OgorCW1lbXNldCgoY2hhciAqKSBidWYrYWN0dWFsLCAwLCBzaXplLWFjdHVhbCk7CisJaWYgKGNoYW5uZWwtPnJlYWRfZXJyb3IpCisJCXJldHZhbCA9IChjaGFubmVsLT5yZWFkX2Vycm9yKShjaGFubmVsLCBibG9jaywgY291bnQsIGJ1ZiwKKwkJCQkJICAgICAgIHNpemUsIGFjdHVhbCwgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorI2Vsc2UgLyogTkVFRF9CT1VOQ0VfQlVGRkVSICovCisvKgorICogV2luZG93cyBhbmQgRnJlZUJTRCBibG9jayBkZXZpY2VzIG9ubHkgYWxsb3cgc2VjdG9yIGFsaWdubWVudCBJTyBpbiBvZmZzZXQgYW5kIHNpemUKKyAqLworc3RhdGljIGVycmNvZGVfdCByYXdfcmVhZF9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLAorCQkJICAgICAgc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgIGludCBjb3VudCwgdm9pZCAqYnVmKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJc2l6ZV90CQlzaXplLCBhbGlnbnNpemUsIGZyYWdtZW50OworCWV4dDJfbG9mZl90CWxvY2F0aW9uOworCWludAkJdG90YWwgPSAwLCBhY3R1YWw7CisjZGVmaW5lIEJMT0NLQUxJR04gNTEyCisJY2hhcgkJc2VjdG9yW0JMT0NLQUxJR05dOworCisJc2l6ZSA9IChjb3VudCA8IDApID8gLWNvdW50IDogY291bnQgKiBjaGFubmVsLT5ibG9ja19zaXplOworCWxvY2F0aW9uID0gKChleHQyX2xvZmZfdCkgYmxvY2sgKiBjaGFubmVsLT5ibG9ja19zaXplKSArIGRhdGEtPm9mZnNldDsKKyNpZmRlZiBERUJVRworCXByaW50ZigiY291bnQ9JWQsIHNpemU9JWQsIGJsb2NrPSVkLCBibGtfc2l6ZT0lZCwgbG9jYXRpb249JWx4XG4iLAorCQkJY291bnQsIHNpemUsIGJsb2NrLCBjaGFubmVsLT5ibG9ja19zaXplLCBsb2NhdGlvbik7CisjZW5kaWYKKwlpZiAoZXh0MmZzX2xsc2VlayhkYXRhLT5kZXYsIGxvY2F0aW9uLCBTRUVLX1NFVCkgIT0gbG9jYXRpb24pIHsKKwkJcmV0dmFsID0gZXJybm8gPyBlcnJubyA6IEVYVDJfRVRfTExTRUVLX0ZBSUxFRDsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCWZyYWdtZW50ID0gc2l6ZSAlIEJMT0NLQUxJR047CisJYWxpZ25zaXplID0gc2l6ZSAtIGZyYWdtZW50OworCWlmIChhbGlnbnNpemUpIHsKKwkJYWN0dWFsID0gcmVhZChkYXRhLT5kZXYsIGJ1ZiwgYWxpZ25zaXplKTsKKwkJaWYgKGFjdHVhbCAhPSBhbGlnbnNpemUpCisJCQlnb3RvIHNob3J0X3JlYWQ7CisJfQorCWlmIChmcmFnbWVudCkgeworCQlhY3R1YWwgPSByZWFkKGRhdGEtPmRldiwgc2VjdG9yLCBCTE9DS0FMSUdOKTsKKwkJaWYgKGFjdHVhbCAhPSBCTE9DS0FMSUdOKQorCQkJZ290byBzaG9ydF9yZWFkOworCQltZW1jcHkoYnVmK2FsaWduc2l6ZSwgc2VjdG9yLCBmcmFnbWVudCk7CisJfQorCXJldHVybiAwOworCitzaG9ydF9yZWFkOgorCWlmIChhY3R1YWw+MCkKKwkJdG90YWwgKz0gYWN0dWFsOworCXJldHZhbCA9IEVYVDJfRVRfU0hPUlRfUkVBRDsKKworZXJyb3Jfb3V0OgorCW1lbXNldCgoY2hhciAqKSBidWYrdG90YWwsIDAsIHNpemUtYWN0dWFsKTsKKwlpZiAoY2hhbm5lbC0+cmVhZF9lcnJvcikKKwkJcmV0dmFsID0gKGNoYW5uZWwtPnJlYWRfZXJyb3IpKGNoYW5uZWwsIGJsb2NrLCBjb3VudCwgYnVmLAorCQkJCQkgICAgICAgc2l6ZSwgYWN0dWFsLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworc3RhdGljIGVycmNvZGVfdCByYXdfd3JpdGVfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwKKwkJCSAgICAgICBzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGEsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgICBpbnQgY291bnQsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzc2l6ZV90CQlzaXplOworCWV4dDJfbG9mZl90CWxvY2F0aW9uOworCWludAkJYWN0dWFsID0gMDsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKGNvdW50ID09IDEpCisJCXNpemUgPSBjaGFubmVsLT5ibG9ja19zaXplOworCWVsc2UgeworCQlpZiAoY291bnQgPCAwKQorCQkJc2l6ZSA9IC1jb3VudDsKKwkJZWxzZQorCQkJc2l6ZSA9IGNvdW50ICogY2hhbm5lbC0+YmxvY2tfc2l6ZTsKKwl9CisKKwlsb2NhdGlvbiA9ICgoZXh0Ml9sb2ZmX3QpIGJsb2NrICogY2hhbm5lbC0+YmxvY2tfc2l6ZSkgKyBkYXRhLT5vZmZzZXQ7CisJaWYgKGV4dDJmc19sbHNlZWsoZGF0YS0+ZGV2LCBsb2NhdGlvbiwgU0VFS19TRVQpICE9IGxvY2F0aW9uKSB7CisJCXJldHZhbCA9IGVycm5vID8gZXJybm8gOiBFWFQyX0VUX0xMU0VFS19GQUlMRUQ7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCWFjdHVhbCA9IHdyaXRlKGRhdGEtPmRldiwgYnVmLCBzaXplKTsKKwlpZiAoYWN0dWFsICE9IHNpemUpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9TSE9SVF9XUklURTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCXJldHVybiAwOworCitlcnJvcl9vdXQ6CisJaWYgKGNoYW5uZWwtPndyaXRlX2Vycm9yKQorCQlyZXR2YWwgPSAoY2hhbm5lbC0+d3JpdGVfZXJyb3IpKGNoYW5uZWwsIGJsb2NrLCBjb3VudCwgYnVmLAorCQkJCQkJc2l6ZSwgYWN0dWFsLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoKKyAqIEhlcmUgd2UgaW1wbGVtZW50IHRoZSBjYWNoZSBmdW5jdGlvbnMKKyAqLworCisvKiBBbGxvY2F0ZSB0aGUgY2FjaGUgYnVmZmVycyAqLworc3RhdGljIGVycmNvZGVfdCBhbGxvY19jYWNoZShpb19jaGFubmVsIGNoYW5uZWwsCisJCQkgICAgIHN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YSkKK3sKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlzdHJ1Y3QgdW5peF9jYWNoZQkqY2FjaGU7CisJaW50CQkJaTsKKworCWRhdGEtPmFjY2Vzc190aW1lID0gMDsKKwlmb3IgKGk9MCwgY2FjaGUgPSBkYXRhLT5jYWNoZTsgaSA8IENBQ0hFX1NJWkU7IGkrKywgY2FjaGUrKykgeworCQljYWNoZS0+YmxvY2sgPSAwOworCQljYWNoZS0+YWNjZXNzX3RpbWUgPSAwOworCQljYWNoZS0+ZGlydHkgPSAwOworCQljYWNoZS0+aW5fdXNlID0gMDsKKwkJaWYgKChyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShjaGFubmVsLT5ibG9ja19zaXplLAorCQkJCQkgICAgICZjYWNoZS0+YnVmKSkpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogRnJlZSB0aGUgY2FjaGUgYnVmZmVycyAqLworc3RhdGljIHZvaWQgZnJlZV9jYWNoZShzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHVuaXhfY2FjaGUJKmNhY2hlOworCWludAkJCWk7CisKKwlkYXRhLT5hY2Nlc3NfdGltZSA9IDA7CisJZm9yIChpPTAsIGNhY2hlID0gZGF0YS0+Y2FjaGU7IGkgPCBDQUNIRV9TSVpFOyBpKyssIGNhY2hlKyspIHsKKwkJY2FjaGUtPmJsb2NrID0gMDsKKwkJY2FjaGUtPmFjY2Vzc190aW1lID0gMDsKKwkJY2FjaGUtPmRpcnR5ID0gMDsKKwkJY2FjaGUtPmluX3VzZSA9IDA7CisJCWV4dDJmc19mcmVlX21lbSgmY2FjaGUtPmJ1Zik7CisJCWNhY2hlLT5idWYgPSAwOworCX0KK30KKworI2lmbmRlZiBOT19JT19DQUNIRQorLyoKKyAqIFRyeSB0byBmaW5kIGEgYmxvY2sgaW4gdGhlIGNhY2hlLiAgSWYgdGhlIGJsb2NrIGlzIG5vdCBmb3VuZCwgYW5kCisgKiBlbGRlc3QgaXMgYSBub24temVybyBwb2ludGVyLCB0aGVuIGZpbGwgaW4gZWxkZXN0IHdpdGggdGhlIGNhY2hlCisgKiBlbnRyeSB0byB0aGF0IHNob3VsZCBiZSByZXVzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdW5peF9jYWNoZSAqZmluZF9jYWNoZWRfYmxvY2soc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCQkJICAgIHN0cnVjdCB1bml4X2NhY2hlICoqZWxkZXN0KQoreworCXN0cnVjdCB1bml4X2NhY2hlCSpjYWNoZSwgKnVudXNlZF9jYWNoZSwgKm9sZGVzdF9jYWNoZTsKKwlpbnQJCQlpOworCisJdW51c2VkX2NhY2hlID0gb2xkZXN0X2NhY2hlID0gMDsKKwlmb3IgKGk9MCwgY2FjaGUgPSBkYXRhLT5jYWNoZTsgaSA8IENBQ0hFX1NJWkU7IGkrKywgY2FjaGUrKykgeworCQlpZiAoIWNhY2hlLT5pbl91c2UpIHsKKwkJCWlmICghdW51c2VkX2NhY2hlKQorCQkJCXVudXNlZF9jYWNoZSA9IGNhY2hlOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNhY2hlLT5ibG9jayA9PSBibG9jaykgeworCQkJY2FjaGUtPmFjY2Vzc190aW1lID0gKytkYXRhLT5hY2Nlc3NfdGltZTsKKwkJCXJldHVybiBjYWNoZTsKKwkJfQorCQlpZiAoIW9sZGVzdF9jYWNoZSB8fAorCQkgICAgKGNhY2hlLT5hY2Nlc3NfdGltZSA8IG9sZGVzdF9jYWNoZS0+YWNjZXNzX3RpbWUpKQorCQkJb2xkZXN0X2NhY2hlID0gY2FjaGU7CisJfQorCWlmIChlbGRlc3QpCisJCSplbGRlc3QgPSAodW51c2VkX2NhY2hlKSA/IHVudXNlZF9jYWNoZSA6IG9sZGVzdF9jYWNoZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldXNlIGEgcGFydGljdWxhciBjYWNoZSBlbnRyeSBmb3IgYW5vdGhlciBibG9jay4KKyAqLworc3RhdGljIHZvaWQgcmV1c2VfY2FjaGUoaW9fY2hhbm5lbCBjaGFubmVsLCBzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGEsCisJCSBzdHJ1Y3QgdW5peF9jYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgYmxvY2spCit7CisJaWYgKGNhY2hlLT5kaXJ0eSAmJiBjYWNoZS0+aW5fdXNlKQorCQlyYXdfd3JpdGVfYmxrKGNoYW5uZWwsIGRhdGEsIGNhY2hlLT5ibG9jaywgMSwgY2FjaGUtPmJ1Zik7CisKKwljYWNoZS0+aW5fdXNlID0gMTsKKwljYWNoZS0+ZGlydHkgPSAwOworCWNhY2hlLT5ibG9jayA9IGJsb2NrOworCWNhY2hlLT5hY2Nlc3NfdGltZSA9ICsrZGF0YS0+YWNjZXNzX3RpbWU7Cit9CisKKy8qCisgKiBGbHVzaCBhbGwgb2YgdGhlIGJsb2NrcyBpbiB0aGUgY2FjaGUKKyAqLworc3RhdGljIGVycmNvZGVfdCBmbHVzaF9jYWNoZWRfYmxvY2tzKGlvX2NoYW5uZWwgY2hhbm5lbCwKKwkJCQkgICAgIHN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YSwKKwkJCQkgICAgIGludCBpbnZhbGlkYXRlKQorCit7CisJc3RydWN0IHVuaXhfY2FjaGUJKmNhY2hlOworCWVycmNvZGVfdAkJcmV0dmFsLCByZXR2YWwyOworCWludAkJCWk7CisKKwlyZXR2YWwyID0gMDsKKwlmb3IgKGk9MCwgY2FjaGUgPSBkYXRhLT5jYWNoZTsgaSA8IENBQ0hFX1NJWkU7IGkrKywgY2FjaGUrKykgeworCQlpZiAoIWNhY2hlLT5pbl91c2UpCisJCQljb250aW51ZTsKKworCQlpZiAoaW52YWxpZGF0ZSkKKwkJCWNhY2hlLT5pbl91c2UgPSAwOworCisJCWlmICghY2FjaGUtPmRpcnR5KQorCQkJY29udGludWU7CisKKwkJcmV0dmFsID0gcmF3X3dyaXRlX2JsayhjaGFubmVsLCBkYXRhLAorCQkJCSAgICAgICBjYWNoZS0+YmxvY2ssIDEsIGNhY2hlLT5idWYpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dmFsMiA9IHJldHZhbDsKKwkJZWxzZQorCQkJY2FjaGUtPmRpcnR5ID0gMDsKKwl9CisJcmV0dXJuIHJldHZhbDI7Cit9CisjZW5kaWYgLyogTk9fSU9fQ0FDSEUgKi8KKworc3RhdGljIGVycmNvZGVfdCB1bml4X29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBpb19jaGFubmVsICpjaGFubmVsKQoreworCWlvX2NoYW5uZWwJaW8gPSBOVUxMOworCXN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YSA9IE5VTEw7CisJZXJyY29kZV90CXJldHZhbDsKKwlpbnQJCW9wZW5fZmxhZ3M7CisJc3RydWN0IHN0YXQJc3Q7CisjaWZkZWYgX19saW51eF9fCisJc3RydWN0CQl1dHNuYW1lIHV0OworI2VuZGlmCisKKwlpZiAobmFtZSA9PSAwKQorCQlyZXR1cm4gRVhUMl9FVF9CQURfREVWSUNFX05BTUU7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBzdHJ1Y3RfaW9fY2hhbm5lbCksICZpbyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZW1zZXQoaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc3RydWN0X2lvX2NoYW5uZWwpKTsKKwlpby0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUw7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSksICZkYXRhKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlpby0+bWFuYWdlciA9IHVuaXhfaW9fbWFuYWdlcjsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzdHJsZW4obmFtZSkrMSwgJmlvLT5uYW1lKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlzdHJjcHkoaW8tPm5hbWUsIG5hbWUpOworCWlvLT5wcml2YXRlX2RhdGEgPSBkYXRhOworCWlvLT5ibG9ja19zaXplID0gMTAyNDsKKwlpby0+cmVhZF9lcnJvciA9IDA7CisJaW8tPndyaXRlX2Vycm9yID0gMDsKKwlpby0+cmVmY291bnQgPSAxOworCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEpKTsKKwlkYXRhLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMOworCisJaWYgKChyZXR2YWwgPSBhbGxvY19jYWNoZShpbywgZGF0YSkpKQorCQlnb3RvIGNsZWFudXA7CisKKwlvcGVuX2ZsYWdzID0gKGZsYWdzICYgSU9fRkxBR19SVykgPyBPX1JEV1IgOiBPX1JET05MWTsKKyNpZmRlZiBDT05GSUdfTEZTCisJZGF0YS0+ZGV2ID0gb3BlbjY0KGlvLT5uYW1lLCBvcGVuX2ZsYWdzKTsKKyNlbHNlCisJZGF0YS0+ZGV2ID0gb3Blbihpby0+bmFtZSwgb3Blbl9mbGFncyk7CisjZW5kaWYKKwlpZiAoZGF0YS0+ZGV2IDwgMCkgeworCQlyZXR2YWwgPSBlcnJubzsKKwkJZ290byBjbGVhbnVwOworCX0KKworI2lmZGVmIF9fbGludXhfXworI3VuZGVmIFJMSU1fSU5GSU5JVFkKKyNpZiAoZGVmaW5lZChfX2FscGhhX18pIHx8ICgoZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19taXBzX18pKSAmJiAoU0laRU9GX0xPTkcgPT0gNCkpKQorI2RlZmluZSBSTElNX0lORklOSVRZCSgodW5zaWduZWQgbG9uZykofjBVTD4+MSkpCisjZWxzZQorI2RlZmluZSBSTElNX0lORklOSVRZICAofjBVTCkKKyNlbmRpZgorCS8qCisJICogV29yayBhcm91bmQgYSBidWcgaW4gMi40LjEwLTIuNC4xOCBrZXJuZWxzIHdoZXJlIHdyaXRlcyB0bworCSAqIGJsb2NrIGRldmljZXMgYXJlIHdyb25nbHkgZ2V0dGluZyBoaXQgYnkgdGhlIGZpbGVzaXplCisJICogbGltaXQuICBUaGlzIHdvcmthcm91bmQgaXNuJ3QgcGVyZmVjdCwgc2luY2UgaXQgd29uJ3Qgd29yaworCSAqIGlmIGdsaWJjIHdhc24ndCBidWlsdCBhZ2FpbnN0IDIuMiBoZWFkZXIgZmlsZXMuICAoU2lnaC4pCisJICoKKwkgKi8KKwlpZiAoKGZsYWdzICYgSU9fRkxBR19SVykgJiYKKwkgICAgKHVuYW1lKCZ1dCkgPT0gMCkgJiYKKwkgICAgKCh1dC5yZWxlYXNlWzBdID09ICcyJykgJiYgKHV0LnJlbGVhc2VbMV0gPT0gJy4nKSAmJgorCSAgICAgKHV0LnJlbGVhc2VbMl0gPT0gJzQnKSAmJiAodXQucmVsZWFzZVszXSA9PSAnLicpICYmCisJICAgICAodXQucmVsZWFzZVs0XSA9PSAnMScpICYmICh1dC5yZWxlYXNlWzVdID49ICcwJykgJiYKKwkgICAgICh1dC5yZWxlYXNlWzVdIDwgJzgnKSkgJiYKKwkgICAgKGZzdGF0KGRhdGEtPmRldiwgJnN0KSA9PSAwKSAmJgorCSAgICAoU19JU0JMSyhzdC5zdF9tb2RlKSkpIHsKKwkJc3RydWN0IHJsaW1pdAlybGltOworCisJCXJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gKHVuc2lnbmVkIGxvbmcpIFJMSU1fSU5GSU5JVFk7CisJCXNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybGltKTsKKwkJZ2V0cmxpbWl0KFJMSU1JVF9GU0laRSwgJnJsaW0pOworCQlpZiAoKCh1bnNpZ25lZCBsb25nKSBybGltLnJsaW1fY3VyKSA8CisJCSAgICAoKHVuc2lnbmVkIGxvbmcpIHJsaW0ucmxpbV9tYXgpKSB7CisJCQlybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heDsKKwkJCXNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybGltKTsKKwkJfQorCX0KKyNlbmRpZgorCSpjaGFubmVsID0gaW87CisJcmV0dXJuIDA7CisKK2NsZWFudXA6CisJaWYgKGRhdGEpIHsKKwkJZnJlZV9jYWNoZShkYXRhKTsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZkYXRhKTsKKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZpbyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCB1bml4X2Nsb3NlKGlvX2NoYW5uZWwgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19VTklYX0lPX0NIQU5ORUwpOworCisJaWYgKC0tY2hhbm5lbC0+cmVmY291bnQgPiAwKQorCQlyZXR1cm4gMDsKKworI2lmbmRlZiBOT19JT19DQUNIRQorCXJldHZhbCA9IGZsdXNoX2NhY2hlZF9ibG9ja3MoY2hhbm5lbCwgZGF0YSwgMCk7CisjZW5kaWYKKworCWlmIChjbG9zZShkYXRhLT5kZXYpIDwgMCkKKwkJcmV0dmFsID0gZXJybm87CisJZnJlZV9jYWNoZShkYXRhKTsKKworCWV4dDJmc19mcmVlX21lbSgmY2hhbm5lbC0+cHJpdmF0ZV9kYXRhKTsKKwlleHQyZnNfZnJlZV9tZW0oJmNoYW5uZWwtPm5hbWUpOworCWV4dDJmc19mcmVlX21lbSgmY2hhbm5lbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCB1bml4X3NldF9ibGtzaXplKGlvX2NoYW5uZWwgY2hhbm5lbCwgaW50IGJsa3NpemUpCit7CisJc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAkJcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMKTsKKworCWlmIChjaGFubmVsLT5ibG9ja19zaXplICE9IGJsa3NpemUpIHsKKyNpZm5kZWYgTk9fSU9fQ0FDSEUKKwkJaWYgKChyZXR2YWwgPSBmbHVzaF9jYWNoZWRfYmxvY2tzKGNoYW5uZWwsIGRhdGEsIDApKSkKKwkJCXJldHVybiByZXR2YWw7CisjZW5kaWYKKworCQljaGFubmVsLT5ibG9ja19zaXplID0gYmxrc2l6ZTsKKwkJZnJlZV9jYWNoZShkYXRhKTsKKwkJaWYgKChyZXR2YWwgPSBhbGxvY19jYWNoZShjaGFubmVsLCBkYXRhKSkpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgZXJyY29kZV90IHVuaXhfcmVhZF9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJICAgICAgIGludCBjb3VudCwgdm9pZCAqYnVmKQoreworCXN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgdW5peF9jYWNoZSAqY2FjaGUsICpyZXVzZVtSRUFEX0RJUkVDVF9TSVpFXTsKKwllcnJjb2RlX3QJcmV0dmFsOworCWNoYXIJCSpjcDsKKwlpbnQJCWksIGo7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19VTklYX0lPX0NIQU5ORUwpOworCisjaWZkZWYgTk9fSU9fQ0FDSEUKKwlyZXR1cm4gcmF3X3JlYWRfYmxrKGNoYW5uZWwsIGRhdGEsIGJsb2NrLCBjb3VudCwgYnVmKTsKKyNlbHNlCisJLyoKKwkgKiBJZiB3ZSdyZSBkb2luZyBhbiBvZGQtc2l6ZWQgcmVhZCBvciBhIHZlcnkgbGFyZ2UgcmVhZCwKKwkgKiBmbHVzaCBvdXQgdGhlIGNhY2hlIGFuZCB0aGVuIGRvIGEgZGlyZWN0IHJlYWQuCisJICovCisJaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+IFdSSVRFX0RJUkVDVF9TSVpFKSB7CisJCWlmICgocmV0dmFsID0gZmx1c2hfY2FjaGVkX2Jsb2NrcyhjaGFubmVsLCBkYXRhLCAwKSkpCisJCQlyZXR1cm4gcmV0dmFsOworCQlyZXR1cm4gcmF3X3JlYWRfYmxrKGNoYW5uZWwsIGRhdGEsIGJsb2NrLCBjb3VudCwgYnVmKTsKKwl9CisKKwljcCA9IGJ1ZjsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qIElmIGl0J3MgaW4gdGhlIGNhY2hlLCB1c2UgaXQhICovCisJCWlmICgoY2FjaGUgPSBmaW5kX2NhY2hlZF9ibG9jayhkYXRhLCBibG9jaywgJnJldXNlWzBdKSkpIHsKKyNpZmRlZiBERUJVRworCQkJcHJpbnRmKCJVc2luZyBjYWNoZWQgYmxvY2sgJWRcbiIsIGJsb2NrKTsKKyNlbmRpZgorCQkJbWVtY3B5KGNwLCBjYWNoZS0+YnVmLCBjaGFubmVsLT5ibG9ja19zaXplKTsKKwkJCWNvdW50LS07CisJCQlibG9jaysrOworCQkJY3AgKz0gY2hhbm5lbC0+YmxvY2tfc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIEZpbmQgdGhlIG51bWJlciBvZiB1bmNhY2hlZCBibG9ja3Mgc28gd2UgY2FuIGRvIGEKKwkJICogc2luZ2xlIHJlYWQgcmVxdWVzdAorCQkgKi8KKwkJZm9yIChpPTE7IGkgPCBjb3VudDsgaSsrKQorCQkJaWYgKGZpbmRfY2FjaGVkX2Jsb2NrKGRhdGEsIGJsb2NrK2ksICZyZXVzZVtpXSkpCisJCQkJYnJlYWs7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCJSZWFkaW5nICVkIGJsb2NrcyBzdGFydGluZyBhdCAlZFxuIiwgaSwgYmxvY2spOworI2VuZGlmCisJCWlmICgocmV0dmFsID0gcmF3X3JlYWRfYmxrKGNoYW5uZWwsIGRhdGEsIGJsb2NrLCBpLCBjcCkpKQorCQkJcmV0dXJuIHJldHZhbDsKKworCQkvKiBTYXZlIHRoZSByZXN1bHRzIGluIHRoZSBjYWNoZSAqLworCQlmb3IgKGo9MDsgaiA8IGk7IGorKykgeworCQkJY291bnQtLTsKKwkJCWNhY2hlID0gcmV1c2Vbal07CisJCQlyZXVzZV9jYWNoZShjaGFubmVsLCBkYXRhLCBjYWNoZSwgYmxvY2srKyk7CisJCQltZW1jcHkoY2FjaGUtPmJ1ZiwgY3AsIGNoYW5uZWwtPmJsb2NrX3NpemUpOworCQkJY3AgKz0gY2hhbm5lbC0+YmxvY2tfc2l6ZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBOT19JT19DQUNIRSAqLworfQorCitzdGF0aWMgZXJyY29kZV90IHVuaXhfd3JpdGVfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCQlpbnQgY291bnQsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGE7CisJc3RydWN0IHVuaXhfY2FjaGUgKmNhY2hlLCAqcmV1c2U7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisJY29uc3QgY2hhcgkqY3A7CisJaW50CQl3cml0ZXRocm91Z2g7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19VTklYX0lPX0NIQU5ORUwpOworCisjaWZkZWYgTk9fSU9fQ0FDSEUKKwlyZXR1cm4gcmF3X3dyaXRlX2JsayhjaGFubmVsLCBkYXRhLCBibG9jaywgY291bnQsIGJ1Zik7CisjZWxzZQorCS8qCisJICogSWYgd2UncmUgZG9pbmcgYW4gb2RkLXNpemVkIHdyaXRlIG9yIGEgdmVyeSBsYXJnZSB3cml0ZSwKKwkgKiBmbHVzaCBvdXQgdGhlIGNhY2hlIGNvbXBsZXRlbHkgYW5kIHRoZW4gZG8gYSBkaXJlY3Qgd3JpdGUuCisJICovCisJaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+IFdSSVRFX0RJUkVDVF9TSVpFKSB7CisJCWlmICgocmV0dmFsID0gZmx1c2hfY2FjaGVkX2Jsb2NrcyhjaGFubmVsLCBkYXRhLCAxKSkpCisJCQlyZXR1cm4gcmV0dmFsOworCQlyZXR1cm4gcmF3X3dyaXRlX2JsayhjaGFubmVsLCBkYXRhLCBibG9jaywgY291bnQsIGJ1Zik7CisJfQorCisJLyoKKwkgKiBGb3IgYSBtb2RlcmF0ZS1zaXplZCBtdWx0aS1ibG9jayB3cml0ZSwgZmlyc3QgZm9yY2UgYSB3cml0ZQorCSAqIGlmIHdlJ3JlIGluIHdyaXRlLXRocm91Z2ggY2FjaGUgbW9kZSwgYW5kIHRoZW4gZmlsbCB0aGUKKwkgKiBjYWNoZSB3aXRoIHRoZSBibG9ja3MuCisJICovCisJd3JpdGV0aHJvdWdoID0gY2hhbm5lbC0+ZmxhZ3MgJiBDSEFOTkVMX0ZMQUdTX1dSSVRFVEhST1VHSDsKKwlpZiAod3JpdGV0aHJvdWdoKQorCQlyZXR2YWwgPSByYXdfd3JpdGVfYmxrKGNoYW5uZWwsIGRhdGEsIGJsb2NrLCBjb3VudCwgYnVmKTsKKworCWNwID0gYnVmOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJY2FjaGUgPSBmaW5kX2NhY2hlZF9ibG9jayhkYXRhLCBibG9jaywgJnJldXNlKTsKKwkJaWYgKCFjYWNoZSkgeworCQkJY2FjaGUgPSByZXVzZTsKKwkJCXJldXNlX2NhY2hlKGNoYW5uZWwsIGRhdGEsIGNhY2hlLCBibG9jayk7CisJCX0KKwkJbWVtY3B5KGNhY2hlLT5idWYsIGNwLCBjaGFubmVsLT5ibG9ja19zaXplKTsKKwkJY2FjaGUtPmRpcnR5ID0gIXdyaXRldGhyb3VnaDsKKwkJY291bnQtLTsKKwkJYmxvY2srKzsKKwkJY3AgKz0gY2hhbm5lbC0+YmxvY2tfc2l6ZTsKKwl9CisJcmV0dXJuIHJldHZhbDsKKyNlbmRpZiAvKiBOT19JT19DQUNIRSAqLworfQorCitzdGF0aWMgZXJyY29kZV90IHVuaXhfd3JpdGVfYnl0ZShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSBpbnQgc2l6ZSwgY29uc3Qgdm9pZCAqYnVmKQoreworCXN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YTsKKwllcnJjb2RlX3QJcmV0dmFsID0gMDsKKwlzc2l6ZV90CQlhY3R1YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19VTklYX0lPX0NIQU5ORUwpOworCisjaWZuZGVmIE5PX0lPX0NBQ0hFCisJLyoKKwkgKiBGbHVzaCBvdXQgdGhlIGNhY2hlIGNvbXBsZXRlbHkKKwkgKi8KKwlpZiAoKHJldHZhbCA9IGZsdXNoX2NhY2hlZF9ibG9ja3MoY2hhbm5lbCwgZGF0YSwgMSkpKQorCQlyZXR1cm4gcmV0dmFsOworI2VuZGlmCisKKwlpZiAobHNlZWsoZGF0YS0+ZGV2LCBvZmZzZXQgKyBkYXRhLT5vZmZzZXQsIFNFRUtfU0VUKSA8IDApCisJCXJldHVybiBlcnJubzsKKworCWFjdHVhbCA9IHdyaXRlKGRhdGEtPmRldiwgYnVmLCBzaXplKTsKKwlpZiAoYWN0dWFsICE9IHNpemUpCisJCXJldHVybiBFWFQyX0VUX1NIT1JUX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGbHVzaCBkYXRhIGJ1ZmZlcnMgdG8gZGlzay4KKyAqLworc3RhdGljIGVycmNvZGVfdCB1bml4X2ZsdXNoKGlvX2NoYW5uZWwgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90IHJldHZhbCA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKikgY2hhbm5lbC0+cHJpdmF0ZV9kYXRhOworCUVYVDJfQ0hFQ0tfTUFHSUMoZGF0YSwgRVhUMl9FVF9NQUdJQ19VTklYX0lPX0NIQU5ORUwpOworCisjaWZuZGVmIE5PX0lPX0NBQ0hFCisJcmV0dmFsID0gZmx1c2hfY2FjaGVkX2Jsb2NrcyhjaGFubmVsLCBkYXRhLCAwKTsKKyNlbmRpZgorCWZzeW5jKGRhdGEtPmRldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCB1bml4X3NldF9vcHRpb24oaW9fY2hhbm5lbCBjaGFubmVsLCBjb25zdCBjaGFyICpvcHRpb24sCisJCQkJIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJY2hhciAqZW5kOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMKTsKKworCWlmICghc3RyY21wKG9wdGlvbiwgIm9mZnNldCIpKSB7CisJCWlmICghYXJnKQorCQkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCQl0bXAgPSBzdHJ0b3VsKGFyZywgJmVuZCwgMCk7CisJCWlmICgqZW5kKQorCQkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwkJZGF0YS0+b2Zmc2V0ID0gdG1wOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy91bmxpbmsuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy91bmxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE5ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3VubGluay5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHVubGluay5jIC0tLSBkZWxldGUgbGlua3MgaW4gYSBleHQyZnMgZGlyZWN0b3J5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RydWN0IGxpbmtfc3RydWN0ICB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwlpbnQJCW5hbWVsZW47CisJZXh0Ml9pbm9fdAlpbm9kZTsKKwlpbnQJCWZsYWdzOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqcHJldjsKKwlpbnQJCWRvbmU7Cit9OworCisjaWZkZWYgX19UVVJCT0NfXworIyBwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorc3RhdGljIGludCB1bmxpbmtfcHJvYyhzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJICAgICBpbnQJb2Zmc2V0IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICBpbnQJYmxvY2tzaXplIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICBjaGFyCSpidWYgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIHZvaWQJKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgbGlua19zdHJ1Y3QgKmxzID0gKHN0cnVjdCBsaW5rX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpwcmV2OworCisJcHJldiA9IGxzLT5wcmV2OworCWxzLT5wcmV2ID0gZGlyZW50OworCisJaWYgKGxzLT5uYW1lKSB7CisJCWlmICgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpICE9IGxzLT5uYW1lbGVuKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdHJuY21wKGxzLT5uYW1lLCBkaXJlbnQtPm5hbWUsIGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSkKKwkJCXJldHVybiAwOworCX0KKwlpZiAobHMtPmlub2RlKSB7CisJCWlmIChkaXJlbnQtPmlub2RlICE9IGxzLT5pbm9kZSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmICghZGlyZW50LT5pbm9kZSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChwcmV2KQorCQlwcmV2LT5yZWNfbGVuICs9IGRpcmVudC0+cmVjX2xlbjsKKwllbHNlCisJCWRpcmVudC0+aW5vZGUgPSAwOworCWxzLT5kb25lKys7CisJcmV0dXJuIERJUkVOVF9BQk9SVHxESVJFTlRfQ0hBTkdFRDsKK30KKworI2lmZGVmIF9fVFVSQk9DX18KKyAjcHJhZ21hIGFyZ3N1c2VkCisjZW5kaWYKK2VycmNvZGVfdCBleHQyZnNfdW5saW5rKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIGV4dDJfaW5vX3QgaW5vLAorCQkJaW50IGZsYWdzIEVYVDJGU19BVFRSKCh1bnVzZWQpKSkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCXN0cnVjdCBsaW5rX3N0cnVjdCBsczsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoIW5hbWUgJiYgIWlubykKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCWlmICghKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykpCisJCXJldHVybiBFWFQyX0VUX1JPX0ZJTFNZUzsKKworCWxzLm5hbWUgPSBuYW1lOworCWxzLm5hbWVsZW4gPSBuYW1lID8gc3RybGVuKG5hbWUpIDogMDsKKwlscy5pbm9kZSA9IGlubzsKKwlscy5mbGFncyA9IDA7CisJbHMuZG9uZSA9IDA7CisJbHMucHJldiA9IDA7CisKKwlyZXR2YWwgPSBleHQyZnNfZGlyX2l0ZXJhdGUoZnMsIGRpciwgRElSRU5UX0ZMQUdfSU5DTFVERV9FTVBUWSwKKwkJCQkgICAgMCwgdW5saW5rX3Byb2MsICZscyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiAobHMuZG9uZSkgPyAwIDogRVhUMl9FVF9ESVJfTk9fU1BBQ0U7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdmFsaWRfYmxrLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdmFsaWRfYmxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkNzdhZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy92YWxpZF9ibGsuYwpAQCAtMCwwICsxLDU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB2YWxpZF9ibGsuYyAtLS0gZG9lcyB0aGUgaW5vZGUgaGF2ZSB2YWxpZCBibG9ja3M/CisgKgorICogQ29weXJpZ2h0IDE5OTcgYnkgVGhlb2RvcmUgVHMnbworICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoZSBpbm9kZSdzIGJsb2NrIGVudHJpZXMgYWN0dWFsbHkKKyAqIGNvbnRhaW4gYmxvY2sgZW50cmllcy4KKyAqLworaW50IGV4dDJmc19pbm9kZV9oYXNfdmFsaWRfYmxvY2tzKHN0cnVjdCBleHQyX2lub2RlICppbm9kZSkKK3sKKwkvKgorCSAqIE9ubHkgZGlyZWN0b3JpZXMsIHJlZ3VsYXIgZmlsZXMsIGFuZCBzb21lIHN5bWJvbGljIGxpbmtzCisJICogaGF2ZSB2YWxpZCBibG9jayBlbnRyaWVzLgorCSAqLworCWlmICghTElOVVhfU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhTElOVVhfU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAhTElOVVhfU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHRoZSBzeW1ib2xpYyBsaW5rIGlzIGEgImZhc3Qgc3ltbGluayIsIHRoZW4gdGhlIHN5bWxpbmsKKwkgKiB0YXJnZXQgaXMgc3RvcmVkIGluIHRoZSBibG9jayBlbnRyaWVzLgorCSAqLworCWlmIChMSU5VWF9TX0lTTE5LIChpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoaW5vZGUtPmlfZmlsZV9hY2wgPT0gMCkgeworCQkJLyogV2l0aCBubyBFQSBibG9jaywgd2UgY2FuIHJlbHkgb24gaV9ibG9ja3MgKi8KKwkJCWlmIChpbm9kZS0+aV9ibG9ja3MgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFdpdGggYW4gRUEgYmxvY2ssIGxpZmUgZ2V0cyBtb3JlIHRyaWNreSAqLworCQkJaWYgKGlub2RlLT5pX3NpemUgPj0gRVhUMl9OX0JMT0NLUyo0KQorCQkJCXJldHVybiAxOyAvKiBkZWZpbml0ZWx5IHVzaW5nIGlfYmxvY2tbXSAqLworCQkJaWYgKGlub2RlLT5pX3NpemUgPiA0ICYmIGlub2RlLT5pX2Jsb2NrWzFdID09IDApCisJCQkJcmV0dXJuIDE7IC8qIGRlZmluaXRlbHkgdXNpbmcgaV9ibG9ja1tdICovCisJCQlyZXR1cm4gMDsgLyogUHJvYmFibHkgYSBmYXN0IHN5bWxpbmsgKi8KKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy92ZXJzaW9uLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTgxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdmVyc2lvbi5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHZlcnNpb24uYyAtLS0gUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBleHQyIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpsaWJfdmVyc2lvbiA9IEUyRlNQUk9HU19WRVJTSU9OOworc3RhdGljIGNvbnN0IGNoYXIgKmxpYl9kYXRlID0gRTJGU1BST0dTX0RBVEU7CisKK2ludCBleHQyZnNfcGFyc2VfdmVyc2lvbl9zdHJpbmcoY29uc3QgY2hhciAqdmVyX3N0cmluZykKK3sKKwljb25zdCBjaGFyICpjcDsKKwlpbnQgdmVyc2lvbiA9IDA7CisKKwlmb3IgKGNwID0gdmVyX3N0cmluZzsgKmNwOyBjcCsrKSB7CisJCWlmICgqY3AgPT0gJy4nKQorCQkJY29udGludWU7CisJCWlmICghaXNkaWdpdCgqY3ApKQorCQkJYnJlYWs7CisJCXZlcnNpb24gPSAodmVyc2lvbiAqIDEwKSArICgqY3AgLSAnMCcpOworCX0KKwlyZXR1cm4gdmVyc2lvbjsKK30KKworCitpbnQgZXh0MmZzX2dldF9saWJyYXJ5X3ZlcnNpb24oY29uc3QgY2hhciAqKnZlcl9zdHJpbmcsCisJCQkgICAgICAgY29uc3QgY2hhciAqKmRhdGVfc3RyaW5nKQoreworCWlmICh2ZXJfc3RyaW5nKQorCQkqdmVyX3N0cmluZyA9IGxpYl92ZXJzaW9uOworCWlmIChkYXRlX3N0cmluZykKKwkJKmRhdGVfc3RyaW5nID0gbGliX2RhdGU7CisKKwlyZXR1cm4gZXh0MmZzX3BhcnNlX3ZlcnNpb25fc3RyaW5nKGxpYl92ZXJzaW9uKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy93cml0ZV9iYl9maWxlLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvd3JpdGVfYmJfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTllZWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvd3JpdGVfYmJfZmlsZS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHdyaXRlX2JiX2ZpbGUuYyAtLS0gd3JpdGUgYSBsaXN0IG9mIGJhZCBibG9ja3MgdG8gYSBGSUxFICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2JiX0ZJTEUoZXh0Ml9iYWRibG9ja3NfbGlzdCBiYl9saXN0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncyBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgICAgICAgRklMRSAqZikKK3sKKwliYWRibG9ja3NfaXRlcmF0ZQliYl9pdGVyOworCWJsa190CQkJYmxrOworCWVycmNvZGVfdAkJcmV0dmFsOworCisJcmV0dmFsID0gZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGVfYmVnaW4oYmJfbGlzdCwgJmJiX2l0ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwl3aGlsZSAoZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGUoYmJfaXRlciwgJmJsaykpIHsKKwkJZnByaW50ZihmLCAiJWRcbiIsIGJsayk7CisJfQorCWV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2VuZChiYl9pdGVyKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2ZzY2suYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2ZzY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTA3NDNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZnNjay5jCkBAIC0wLDAgKzEsMTM3NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcGZzY2sgLS0tIEEgZ2VuZXJpYywgcGFyYWxsZWxpemluZyBmcm9udC1lbmQgZm9yIHRoZSBmc2NrIHByb2dyYW0uCisgKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIHJ1biBmc2NrIHByb2dyYW1zIGluIHBhcmFsbGVsIGlmIHRoZQorICogZGV2aWNlcyBhcmUgb24gc2VwYXJhdGUgc3BpbmRsZXMuICBJdCBpcyBiYXNlZCBvbiB0aGUgc2FtZSBpZGVhcyBhcworICogdGhlIGdlbmVyaWMgZnJvbnQgZW5kIGZvciBmc2NrIGJ5IERhdmlkIEVuZ2VsIGFuZCBGcmVkIHZhbiBLZW1wZW4sCisgKiBidXQgaXQgaGFzIGJlZW4gY29tcGxldGVseSByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoIHRvIHN1cHBvcnQKKyAqIHBhcmFsbGVsIGV4ZWN1dGlvbi4KKyAqCisgKiBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDx0eXRzb0BtaXQuZWR1PgorICoKKyAqIE1pcXVlbCB2YW4gU21vb3JlbmJ1cmcgKG1pcXVlbHNAZHJpbmtlbC5vdy5vcmcpIDIwLU9jdC0xOTk0OgorICogICBvIENoYW5nZWQgLXQgZnN0eXBlIHRvIGJlaGF2ZSBsaWtlIHdpdGggbW91bnQgd2hlbiAtQSAoYWxsIGZpbGUKKyAqICAgICBzeXN0ZW1zKSBvciAtTSAobGlrZSBtb3VudCkgaXMgc3BlY2lmaWVkLgorICogICBvIGZzY2sgbG9va3MgaWYgaXQgY2FuIGZpbmQgdGhlIGZzY2sudHlwZSBwcm9ncmFtIHRvIGRlY2lkZQorICogICAgIGlmIGl0IHNob3VsZCBpZ25vcmUgdGhlIGZzIHR5cGUuIFRoaXMgd2F5IG1vcmUgZnNjayBwcm9ncmFtcworICogICAgIGNhbiBiZSBhZGRlZCB3aXRob3V0IGNoYW5naW5nIHRoaXMgZnJvbnQtZW5kLgorICogICBvIC1SIGZsYWcgc2tpcCByb290IGZpbGUgc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKKyAqICAgICAgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBieSAgVGhlb2RvcmUgVHMnby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHBhdGhzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgImZzY2suaCIKKyNpbmNsdWRlICJibGtpZC9ibGtpZC5oIgorCisjaW5jbHVkZSAiZTJmc2JiLmgiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWZuZGVmIF9QQVRIX01OVFRBQgorI2RlZmluZSBfUEFUSF9NTlRUQUIgICAgIi9ldGMvZnN0YWIiCisjZW5kaWYKKworLyoKKyAqIGZzY2suaAorICovCisKKyNpZm5kZWYgREVGQVVMVF9GU1RZUEUKKyNkZWZpbmUgREVGQVVMVF9GU1RZUEUJImV4dDIiCisjZW5kaWYKKworI2RlZmluZSBNQVhfREVWSUNFUyAzMgorI2RlZmluZSBNQVhfQVJHUyAzMgorCisvKgorICogSW50ZXJuYWwgc3RydWN0dXJlIGZvciBtb3VudCB0YWJlbCBlbnRyaWVzLgorICovCisKK3N0cnVjdCBmc19pbmZvIHsKKwljaGFyICAqZGV2aWNlOworCWNoYXIgICptb3VudHB0OworCWNoYXIgICp0eXBlOworCWNoYXIgICpvcHRzOworCWludCAgIGZyZXE7CisJaW50ICAgcGFzc25vOworCWludCAgIGZsYWdzOworCXN0cnVjdCBmc19pbmZvICpuZXh0OworfTsKKworI2RlZmluZSBGTEFHX0RPTkUgMQorI2RlZmluZSBGTEFHX1BST0dSRVNTIDIKKworLyoKKyAqIFN0cnVjdHVyZSB0byBhbGxvdyBleGl0IGNvZGVzIHRvIGJlIHN0b3JlZAorICovCitzdHJ1Y3QgZnNja19pbnN0YW5jZSB7CisJaW50CXBpZDsKKwlpbnQJZmxhZ3M7CisJaW50CWV4aXRfc3RhdHVzOworCXRpbWVfdAlzdGFydF90aW1lOworCWNoYXIgKglwcm9nOworCWNoYXIgKgl0eXBlOworCWNoYXIgKglkZXZpY2U7CisJY2hhciAqCWJhc2VfZGV2aWNlOworCXN0cnVjdCBmc2NrX2luc3RhbmNlICpuZXh0OworfTsKKworLyoKKyAqIGJhc2VfZGV2aWNlLmMKKyAqCisgKiBSZXR1cm4gdGhlICJiYXNlIGRldmljZSIgZ2l2ZW4gYSBwYXJ0aWN1bGFyIGRldmljZTsgdGhpcyBpcyB1c2VkIHRvCisgKiBhc3N1cmUgdGhhdCB3ZSBvbmx5IGZzY2sgb25lIHBhcnRpdGlvbiBvbiBhIHBhcnRpY3VsYXIgZHJpdmUgYXQgYW55CisgKiBvbmUgdGltZS4gIE90aGVyd2lzZSwgdGhlIGRpc2sgaGVhZHMgd2lsbCBiZSBzZWVraW5nIGFsbCBvdmVyIHRoZQorICogcGxhY2UuICBJZiB0aGUgYmFzZSBkZXZpY2UgY2Fubm90IGJlIGRldGVybWluZWQsIHJldHVybiBOVUxMLgorICoKKyAqIFRoZSBiYXNlX2RldmljZSgpIGZ1bmN0aW9uIHJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZyB3aGljaCBtdXN0CisgKiBiZSBmcmVlZC4KKyAqCisgKi8KKworCisjaWZkZWYgQ09ORklHX0ZFQVRVUkVfREVWRlMKKy8qCisgKiBSZXF1aXJlZCBmb3IgdGhlIHViZXItc2lsbHkgZGV2ZnMgL2Rldi9pZGUvaG9zdDEvYnVzMi90YXJnZXQzL2x1bjMKKyAqIHBhdGhhbWVzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGV2ZnNfaGllcltdID0geworCSJob3N0IiwgImJ1cyIsICJ0YXJnZXQiLCAibHVuIiwgMAorfTsKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqYmFzZV9kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlKQoreworCWNoYXIgKnN0ciwgKmNwOworI2lmZGVmIENPTkZJR19GRUFUVVJFX0RFVkZTCisJY29uc3QgY2hhciAqY29uc3QgKmhpZXI7CisJY29uc3QgY2hhciAqZGlzazsKKwlpbnQgbGVuOworI2VuZGlmCisKKwljcCA9IHN0ciA9IHhzdHJkdXAoZGV2aWNlKTsKKworCS8qIFNraXAgb3ZlciAvZGV2LzsgaWYgaXQncyBub3QgcHJlc2VudCwgZ2l2ZSB1cC4gKi8KKwlpZiAoc3RybmNtcChjcCwgIi9kZXYvIiwgNSkgIT0gMCkKKwkJZ290byBlcnJvdXQ7CisJY3AgKz0gNTsKKworCS8qCisJICogRm9yIG1kIGRldmljZXMsIHdlIHRyZWF0IHRoZW0gYWxsIGFzIGlmIHRoZXkgd2VyZSBhbGwKKwkgKiBvbiBvbmUgZGlzaywgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gcGFyYWxsZWxpemUgdGhlbS4KKwkgKi8KKwlpZiAoY3BbMF0gPT0gJ20nICYmIGNwWzFdID09ICdkJykgeworCQkqKGNwKzIpID0gMDsKKwkJcmV0dXJuIHN0cjsKKwl9CisKKwkvKiBIYW5kbGUgREFDIDk2MCBkZXZpY2VzICovCisJaWYgKHN0cm5jbXAoY3AsICJyZC8iLCAzKSA9PSAwKSB7CisJCWNwICs9IDM7CisJCWlmIChjcFswXSAhPSAnYycgfHwgY3BbMl0gIT0gJ2QnIHx8CisJCSAgICAhaXNkaWdpdChjcFsxXSkgfHwgIWlzZGlnaXQoY3BbM10pKQorCQkJZ290byBlcnJvdXQ7CisJCSooY3ArNCkgPSAwOworCQlyZXR1cm4gc3RyOworCX0KKworCS8qIE5vdyBsZXQncyBoYW5kbGUgL2Rldi9oZCogYW5kIC9kZXYvc2QqIGRldmljZXMuLi4uICovCisJaWYgKChjcFswXSA9PSAnaCcgfHwgY3BbMF0gPT0gJ3MnKSAmJiAoY3BbMV0gPT0gJ2QnKSkgeworCQljcCArPSAyOworCQkvKiBJZiB0aGVyZSdzIGEgc2luZ2xlIG51bWJlciBhZnRlciAvZGV2L2hkLCBza2lwIGl0ICovCisJCWlmIChpc2RpZ2l0KCpjcCkpCisJCQljcCsrOworCQkvKiBXaGF0IGZvbGxvd3MgbXVzdCBiZSBhbiBhbHBoYSBjaGFyLCBvciBnaXZlIHVwICovCisJCWlmICghaXNhbHBoYSgqY3ApKQorCQkJZ290byBlcnJvdXQ7CisJCSooY3AgKyAxKSA9IDA7CisJCXJldHVybiBzdHI7CisJfQorCisjaWZkZWYgQ09ORklHX0ZFQVRVUkVfREVWRlMKKwkvKiBOb3cgbGV0J3MgaGFuZGxlIGRldmZzICh1Z2gpIG5hbWVzICovCisJbGVuID0gMDsKKwlpZiAoc3RybmNtcChjcCwgImlkZS8iLCA0KSA9PSAwKQorCQlsZW4gPSA0OworCWlmIChzdHJuY21wKGNwLCAic2NzaS8iLCA1KSA9PSAwKQorCQlsZW4gPSA1OworCWlmIChsZW4pIHsKKwkJY3AgKz0gbGVuOworCQkvKgorCQkgKiBOb3cgd2UgcHJvY2VlZCBkb3duIHRoZSBleHBlY3RlZCBkZXZmcyBoaWVyYXJjaHkuCisJCSAqIGkuZS4sIC4uLi9ob3N0MS9idXMyL3RhcmdldDMvbHVuNC8uLi4KKwkJICogSWYgd2UgZG9uJ3QgZmluZCB0aGUgZXhwZWN0ZWQgdG9rZW4sIGZvbGxvd2VkIGJ5CisJCSAqIHNvbWUgbnVtYmVyIG9mIGRpZ2l0cyBhdCBlYWNoIGxldmVsLCBhYm9ydC4KKwkJICovCisJCWZvciAoaGllciA9IGRldmZzX2hpZXI7ICpoaWVyOyBoaWVyKyspIHsKKwkJCWxlbiA9IHN0cmxlbigqaGllcik7CisJCQlpZiAoc3RybmNtcChjcCwgKmhpZXIsIGxlbikgIT0gMCkKKwkJCQlnb3RvIGVycm91dDsKKwkJCWNwICs9IGxlbjsKKwkJCXdoaWxlICgqY3AgIT0gJy8nICYmICpjcCAhPSAwKSB7CisJCQkJaWYgKCFpc2RpZ2l0KCpjcCkpCisJCQkJCWdvdG8gZXJyb3V0OworCQkJCWNwKys7CisJCQl9CisJCQljcCsrOworCQl9CisJCSooY3AgLSAxKSA9IDA7CisJCXJldHVybiBzdHI7CisJfQorCisJLyogTm93IGhhbmRsZSBkZXZmcyAvZGV2L2Rpc2Mgb3IgL2Rldi9kaXNrIG5hbWVzICovCisJZGlzayA9IDA7CisJaWYgKHN0cm5jbXAoY3AsICJkaXNjcy8iLCA2KSA9PSAwKQorCQlkaXNrID0gImRpc2MiOworCWVsc2UgaWYgKHN0cm5jbXAoY3AsICJkaXNrcy8iLCA2KSA9PSAwKQorCQlkaXNrID0gImRpc2siOworCWlmIChkaXNrKSB7CisJCWNwICs9IDY7CisJCWlmIChzdHJuY21wKGNwLCBkaXNrLCA0KSAhPSAwKQorCQkJZ290byBlcnJvdXQ7CisJCWNwICs9IDQ7CisJCXdoaWxlICgqY3AgIT0gJy8nICYmICpjcCAhPSAwKSB7CisJCQlpZiAoIWlzZGlnaXQoKmNwKSkKKwkJCQlnb3RvIGVycm91dDsKKwkJCWNwKys7CisJCX0KKwkJKmNwID0gMDsKKwkJcmV0dXJuIHN0cjsKKwl9CisjZW5kaWYKKworZXJyb3V0OgorCWZyZWUoc3RyKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaWdub3JlZF90eXBlc1tdID0geworCSJpZ25vcmUiLAorCSJpc285NjYwIiwKKwkibmZzIiwKKwkicHJvYyIsCisJInN3IiwKKwkic3dhcCIsCisJInRtcGZzIiwKKwkiZGV2cHRzIiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmVhbGx5X3dhbnRlZFtdID0geworCSJtaW5peCIsCisJImV4dDIiLAorCSJleHQzIiwKKwkiamZzIiwKKwkicmVpc2VyZnMiLAorCSJ4aWFmcyIsCisJInhmcyIsCisJTlVMTAorfTsKKworI2RlZmluZSBCQVNFX01EICIvZGV2L21kIgorCisvKgorICogR2xvYmFsIHZhcmlhYmxlcyBmb3Igb3B0aW9ucworICovCitzdGF0aWMgY2hhciAqZGV2aWNlc1tNQVhfREVWSUNFU107CitzdGF0aWMgY2hhciAqYXJnc1tNQVhfQVJHU107CitzdGF0aWMgaW50IG51bV9kZXZpY2VzLCBudW1fYXJnczsKKworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBkb2FsbDsKK3N0YXRpYyBpbnQgbm9leGVjdXRlOworc3RhdGljIGludCBzZXJpYWxpemU7CitzdGF0aWMgaW50IHNraXBfcm9vdDsKK3N0YXRpYyBpbnQgbGlrZV9tb3VudDsKK3N0YXRpYyBpbnQgbm90aXRsZTsKK3N0YXRpYyBpbnQgcGFyYWxsZWxfcm9vdDsKK3N0YXRpYyBpbnQgcHJvZ3Jlc3M7CitzdGF0aWMgaW50IHByb2dyZXNzX2ZkOworc3RhdGljIGludCBmb3JjZV9hbGxfcGFyYWxsZWw7CitzdGF0aWMgaW50IG51bV9ydW5uaW5nOworc3RhdGljIGludCBtYXhfcnVubmluZzsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY2FuY2VsX3JlcXVlc3RlZDsKK3N0YXRpYyBpbnQga2lsbF9zZW50Oworc3RhdGljIGNoYXIgKmZzdHlwZTsKK3N0YXRpYyBzdHJ1Y3QgZnNfaW5mbyAqZmlsZXN5c19pbmZvLCAqZmlsZXN5c19sYXN0Oworc3RhdGljIHN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0YW5jZV9saXN0Oworc3RhdGljIGNoYXIgKmZzY2tfcGF0aDsKK3N0YXRpYyBibGtpZF9jYWNoZSBjYWNoZTsKKworc3RhdGljIGNoYXIgKnN0cmluZ19jb3B5KGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAgICAqcmV0OworCisJaWYgKCFzKQorCQlyZXR1cm4gMDsKKwlyZXQgPSB4c3RyZHVwKHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3RyaW5nX3RvX2ludChjb25zdCBjaGFyICpzKQoreworCWxvbmcgbDsKKwljaGFyICpwOworCisJbCA9IHN0cnRvbChzLCAmcCwgMCk7CisJaWYgKCpwIHx8IGwgPT0gTE9OR19NSU4gfHwgbCA9PSBMT05HX01BWCB8fCBsIDwgMCB8fCBsID4gSU5UX01BWCkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIChpbnQpIGw7Cit9CisKK3N0YXRpYyBjaGFyICpza2lwX292ZXJfYmxhbmsoY2hhciAqY3ApCit7CisJd2hpbGUgKCpjcCAmJiBpc3NwYWNlKCpjcCkpCisJCWNwKys7CisJcmV0dXJuIGNwOworfQorCitzdGF0aWMgY2hhciAqc2tpcF9vdmVyX3dvcmQoY2hhciAqY3ApCit7CisJd2hpbGUgKCpjcCAmJiAhaXNzcGFjZSgqY3ApKQorCQljcCsrOworCXJldHVybiBjcDsKK30KKworc3RhdGljIHZvaWQgc3RyaXBfbGluZShjaGFyICpsaW5lKQoreworCWNoYXIgICAgKnA7CisKKwl3aGlsZSAoKmxpbmUpIHsKKwkJcCA9IGxpbmUgKyBzdHJsZW4obGluZSkgLSAxOworCQlpZiAoKCpwID09ICdcbicpIHx8ICgqcCA9PSAnXHInKSkKKwkJCSpwID0gMDsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgY2hhciAqcGFyc2Vfd29yZChjaGFyICoqYnVmKQoreworCWNoYXIgKndvcmQsICpuZXh0OworCisJd29yZCA9ICpidWY7CisJaWYgKCp3b3JkID09IDApCisJCXJldHVybiAwOworCisJd29yZCA9IHNraXBfb3Zlcl9ibGFuayh3b3JkKTsKKwluZXh0ID0gc2tpcF9vdmVyX3dvcmQod29yZCk7CisJaWYgKCpuZXh0KQorCQkqbmV4dCsrID0gMDsKKwkqYnVmID0gbmV4dDsKKwlyZXR1cm4gd29yZDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfZXNjYXBlKGNoYXIgKndvcmQpCit7CisJY2hhciAgICAqcSwgYzsKKwljb25zdCBjaGFyICpwOworCisJaWYgKCF3b3JkKQorCQlyZXR1cm47CisKKwlzdHJjcHlfYW5kX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlcyh3b3JkLCB3b3JkKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9pbnN0YW5jZShzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaSkKK3sKKwlpZiAoaS0+cHJvZykKKwkJZnJlZShpLT5wcm9nKTsKKwlpZiAoaS0+ZGV2aWNlKQorCQlmcmVlKGktPmRldmljZSk7CisJaWYgKGktPmJhc2VfZGV2aWNlKQorCQlmcmVlKGktPmJhc2VfZGV2aWNlKTsKKwlmcmVlKGkpOworfQorCitzdGF0aWMgc3RydWN0IGZzX2luZm8gKmNyZWF0ZV9mc19kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlLCBjb25zdCBjaGFyICptbnRwbnQsCisJCQkJCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9wdHMsCisJCQkJCWludCBmcmVxLCBpbnQgcGFzc25vKQoreworCXN0cnVjdCBmc19pbmZvICpmczsKKworCWZzID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGZzX2luZm8pKTsKKworCWZzLT5kZXZpY2UgPSBzdHJpbmdfY29weShkZXZpY2UpOworCWZzLT5tb3VudHB0ID0gc3RyaW5nX2NvcHkobW50cG50KTsKKwlmcy0+dHlwZSA9IHN0cmluZ19jb3B5KHR5cGUpOworCWZzLT5vcHRzID0gc3RyaW5nX2NvcHkob3B0cyA/IG9wdHMgOiAiIik7CisJZnMtPmZyZXEgPSBmcmVxOworCWZzLT5wYXNzbm8gPSBwYXNzbm87CisJZnMtPmZsYWdzID0gMDsKKwlmcy0+bmV4dCA9IE5VTEw7CisKKwlpZiAoIWZpbGVzeXNfaW5mbykKKwkJZmlsZXN5c19pbmZvID0gZnM7CisJZWxzZQorCQlmaWxlc3lzX2xhc3QtPm5leHQgPSBmczsKKwlmaWxlc3lzX2xhc3QgPSBmczsKKworCXJldHVybiBmczsKK30KKworCisKK3N0YXRpYyBpbnQgcGFyc2VfZnN0YWJfbGluZShjaGFyICpsaW5lLCBzdHJ1Y3QgZnNfaW5mbyAqKnJldF9mcykKK3sKKwljaGFyICAgICpkZXYsICpkZXZpY2UsICptbnRwbnQsICp0eXBlLCAqb3B0cywgKmZyZXEsICpwYXNzbm8sICpjcDsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnM7CisKKwkqcmV0X2ZzID0gMDsKKwlzdHJpcF9saW5lKGxpbmUpOworCWlmICgoY3AgPSBzdHJjaHIobGluZSwgJyMnKSkpCisJCSpjcCA9IDA7ICAgICAgICAvKiBJZ25vcmUgZXZlcnl0aGluZyBhZnRlciB0aGUgY29tbWVudCBjaGFyICovCisJY3AgPSBsaW5lOworCisJZGV2aWNlID0gcGFyc2Vfd29yZCgmY3ApOworCW1udHBudCA9IHBhcnNlX3dvcmQoJmNwKTsKKwl0eXBlID0gcGFyc2Vfd29yZCgmY3ApOworCW9wdHMgPSBwYXJzZV93b3JkKCZjcCk7CisJZnJlcSA9IHBhcnNlX3dvcmQoJmNwKTsKKwlwYXNzbm8gPSBwYXJzZV93b3JkKCZjcCk7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIDA7ICAgICAgIC8qIEFsbG93IGJsYW5rIGxpbmVzICovCisKKwlpZiAoIW1udHBudCB8fCAhdHlwZSkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfZXNjYXBlKGRldmljZSk7CisJcGFyc2VfZXNjYXBlKG1udHBudCk7CisJcGFyc2VfZXNjYXBlKHR5cGUpOworCXBhcnNlX2VzY2FwZShvcHRzKTsKKwlwYXJzZV9lc2NhcGUoZnJlcSk7CisJcGFyc2VfZXNjYXBlKHBhc3Nubyk7CisKKwlkZXYgPSBibGtpZF9nZXRfZGV2bmFtZShjYWNoZSwgZGV2aWNlLCBOVUxMKTsKKwlpZiAoZGV2KQorCQlkZXZpY2UgPSBkZXY7CisKKwlpZiAoc3RyY2hyKHR5cGUsICcsJykpCisJCXR5cGUgPSAwOworCisJZnMgPSBjcmVhdGVfZnNfZGV2aWNlKGRldmljZSwgbW50cG50LCB0eXBlID8gdHlwZSA6ICJhdXRvIiwgb3B0cywKKwkJCSAgICAgIGZyZXEgPyBhdG9pKGZyZXEpIDogLTEsCisJCQkgICAgICBwYXNzbm8gPyBhdG9pKHBhc3NubykgOiAtMSk7CisJaWYgKGRldikKKwkJZnJlZShkZXYpOworCisJaWYgKCFmcykKKwkJcmV0dXJuIC0xOworCSpyZXRfZnMgPSBmczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50ZXJwcmV0X3R5cGUoc3RydWN0IGZzX2luZm8gKmZzKQoreworCWNoYXIgICAgKnQ7CisKKwlpZiAoc3RyY21wKGZzLT50eXBlLCAiYXV0byIpICE9IDApCisJCXJldHVybjsKKwl0ID0gYmxraWRfZ2V0X3RhZ192YWx1ZShjYWNoZSwgIlRZUEUiLCBmcy0+ZGV2aWNlKTsKKwlpZiAodCkgeworCQlmcmVlKGZzLT50eXBlKTsKKwkJZnMtPnR5cGUgPSB0OworCX0KK30KKworLyoKKyAqIExvYWQgdGhlIGZpbGVzeXN0ZW0gZGF0YWJhc2UgZnJvbSAvZXRjL2ZzdGFiCisgKi8KK3N0YXRpYyB2b2lkIGxvYWRfZnNfaW5mbyhjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlGSUxFICAgICpmOworCWNoYXIgICAgYnVmWzEwMjRdOworCWludCAgICAgbGluZW5vID0gMDsKKwlpbnQgICAgIG9sZF9mc3RhYiA9IDE7CisJc3RydWN0IGZzX2luZm8gKmZzOworCisJaWYgKChmID0gZm9wZW5fb3Jfd2FybihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCXdoaWxlICghZmVvZihmKSkgeworCQlsaW5lbm8rKzsKKwkJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkKKwkJCWJyZWFrOworCQlidWZbc2l6ZW9mKGJ1ZiktMV0gPSAwOworCQlpZiAocGFyc2VfZnN0YWJfbGluZShidWYsICZmcykgPCAwKSB7CisJCQliYl9lcnJvcl9tc2coIldBUk5JTkc6IGJhZCBmb3JtYXQgIgorCQkJCSJvbiBsaW5lICVkIG9mICVzXG4iLCBsaW5lbm8sIGZpbGVuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZnMpCisJCQljb250aW51ZTsKKwkJaWYgKGZzLT5wYXNzbm8gPCAwKQorCQkJZnMtPnBhc3NubyA9IDA7CisJCWVsc2UKKwkJCW9sZF9mc3RhYiA9IDA7CisJfQorCisJZmNsb3NlKGYpOworCisJaWYgKG9sZF9mc3RhYikgeworCQlmcHV0cygiXDAwN1wwMDdcMDA3IgorCQkiV0FSTklORzogWW91ciAvZXRjL2ZzdGFiIGRvZXMgbm90IGNvbnRhaW4gdGhlIGZzY2sgcGFzc25vXG4iCisJCSIgICAgICAgZmllbGQuICBJIHdpbGwga2x1ZGdlIGFyb3VuZCB0aGluZ3MgZm9yIHlvdSwgYnV0IHlvdVxuIgorCQkiICAgICAgIHNob3VsZCBmaXggeW91ciAvZXRjL2ZzdGFiIGZpbGUgYXMgc29vbiBhcyB5b3UgY2FuLlxuXG4iLCBzdGRlcnIpOworCisJCWZvciAoZnMgPSBmaWxlc3lzX2luZm87IGZzOyBmcyA9IGZzLT5uZXh0KSB7CisJCQlmcy0+cGFzc25vID0gMTsKKwkJfQorCX0KK30KKworLyogTG9va3VwIGZpbGVzeXMgaW4gL2V0Yy9mc3RhYiBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5LiAqLworc3RhdGljIHN0cnVjdCBmc19pbmZvICpsb29rdXAoY2hhciAqZmlsZXN5cykKK3sKKwlzdHJ1Y3QgZnNfaW5mbyAqZnM7CisKKwkvKiBObyBmaWxlc3lzIG5hbWUgZ2l2ZW4uICovCisJaWYgKGZpbGVzeXMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkgeworCQlpZiAoIXN0cmNtcChmaWxlc3lzLCBmcy0+ZGV2aWNlKSB8fAorCQkgICAgKGZzLT5tb3VudHB0ICYmICFzdHJjbXAoZmlsZXN5cywgZnMtPm1vdW50cHQpKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBmczsKK30KKworLyogRmluZCBmc2NrIHByb2dyYW0gZm9yIGEgZ2l2ZW4gZnMgdHlwZS4gKi8KK3N0YXRpYyBjaGFyICpmaW5kX2ZzY2soY2hhciAqdHlwZSkKK3sKKwljaGFyICpzOworCWNvbnN0IGNoYXIgKnRwbDsKKwljaGFyICpwID0gc3RyaW5nX2NvcHkoZnNja19wYXRoKTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCS8qIEFyZSB3ZSBsb29raW5nIGZvciBhIHByb2dyYW0gb3IganVzdCBhIHR5cGU/ICovCisJdHBsID0gKHN0cm5jbXAodHlwZSwgImZzY2suIiwgNSkgPyAiJXMvZnNjay4lcyIgOiAiJXMvJXMiKTsKKworCWZvciAocyA9IHN0cnRvayhwLCAiOiIpOyBzOyBzID0gc3RydG9rKE5VTEwsICI6IikpIHsKKwkJcyA9IHhhc3ByaW50Zih0cGwsIHMsIHR5cGUpOworCQlpZiAoc3RhdChzLCAmc3QpID09IDApIGJyZWFrOworCQlmcmVlKHMpOworCX0KKwlmcmVlKHApOworCXJldHVybiBzOworfQorCitzdGF0aWMgaW50IHByb2dyZXNzX2FjdGl2ZSh2b2lkKQoreworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCisJZm9yIChpbnN0ID0gaW5zdGFuY2VfbGlzdDsgaW5zdDsgaW5zdCA9IGluc3QtPm5leHQpIHsKKwkJaWYgKGluc3QtPmZsYWdzICYgRkxBR19ET05FKQorCQkJY29udGludWU7CisJCWlmIChpbnN0LT5mbGFncyAmIEZMQUdfUFJPR1JFU1MpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFeGVjdXRlIGEgcGFydGljdWxhciBmc2NrIHByb2dyYW0sIGFuZCBsaW5rIGl0IGludG8gdGhlIGxpc3Qgb2YKKyAqIGNoaWxkIHByb2Nlc3NlcyB3ZSBhcmUgd2FpdGluZyBmb3IuCisgKi8KK3N0YXRpYyBpbnQgZXhlY3V0ZShjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm1udHB0LAorCQkgICBpbnQgaW50ZXJhY3RpdmUpCit7CisJY2hhciAqcywgKmFyZ3ZbODBdOworCWNoYXIgKnByb2c7CisJaW50ICBhcmdjLCBpOworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0LCAqcDsKKwlwaWRfdCAgIHBpZDsKKworCWluc3QgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgZnNja19pbnN0YW5jZSkpOworCisJcHJvZyA9IHhhc3ByaW50ZigiZnNjay4lcyIsIHR5cGUpOworCWFyZ3ZbMF0gPSBwcm9nOworCWFyZ2MgPSAxOworCisJZm9yIChpPTA7IGkgPG51bV9hcmdzOyBpKyspCisJCWFyZ3ZbYXJnYysrXSA9IHN0cmluZ19jb3B5KGFyZ3NbaV0pOworCisJaWYgKHByb2dyZXNzICYmICFwcm9ncmVzc19hY3RpdmUoKSkgeworCQlpZiAoKHN0cmNtcCh0eXBlLCAiZXh0MiIpID09IDApIHx8CisJCSAgICAoc3RyY21wKHR5cGUsICJleHQzIikgPT0gMCkpIHsKKwkJCWNoYXIgdG1wWzgwXTsKKwkJCXNucHJpbnRmKHRtcCwgODAsICItQyVkIiwgcHJvZ3Jlc3NfZmQpOworCQkJYXJndlthcmdjKytdID0gc3RyaW5nX2NvcHkodG1wKTsKKwkJCWluc3QtPmZsYWdzIHw9IEZMQUdfUFJPR1JFU1M7CisJCX0KKwl9CisKKwlhcmd2W2FyZ2MrK10gPSBzdHJpbmdfY29weShkZXZpY2UpOworCWFyZ3ZbYXJnY10gPSAwOworCisJcyA9IGZpbmRfZnNjayhwcm9nKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IG5vdCBmb3VuZCIsIHByb2cpOworCQlyZXR1cm4gRU5PRU5UOworCX0KKworCWlmICh2ZXJib3NlIHx8IG5vZXhlY3V0ZSkgeworCQlwcmludGYoIlslcyAoJWQpIC0tICVzXSAiLCBzLCBudW1fcnVubmluZywKKwkJICAgICAgIG1udHB0ID8gbW50cHQgOiBkZXZpY2UpOworCQlmb3IgKGk9MDsgaSA8IGFyZ2M7IGkrKykKKwkJCXByaW50ZigiJXMgIiwgYXJndltpXSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJLyogRm9yayBhbmQgZXhlY3V0ZSB0aGUgY29ycmVjdCBwcm9ncmFtLiAqLworCWlmIChub2V4ZWN1dGUpCisJCXBpZCA9IC0xOworCWVsc2UgaWYgKChwaWQgPSBmb3JrKCkpIDwgMCkgeworCQlwZXJyb3IoInZmb3JrIisxKTsKKwkJcmV0dXJuIGVycm5vOworCX0gZWxzZSBpZiAocGlkID09IDApIHsKKwkJaWYgKCFpbnRlcmFjdGl2ZSkKKwkJCWNsb3NlKDApOworCQkodm9pZCkgZXhlY3YocywgYXJndik7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7CisJfQorCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJZnJlZShhcmd2W2ldKTsKKworCWZyZWUocyk7CisJaW5zdC0+cGlkID0gcGlkOworCWluc3QtPnByb2cgPSBwcm9nOworCWluc3QtPnR5cGUgPSBzdHJpbmdfY29weSh0eXBlKTsKKwlpbnN0LT5kZXZpY2UgPSBzdHJpbmdfY29weShkZXZpY2UpOworCWluc3QtPmJhc2VfZGV2aWNlID0gYmFzZV9kZXZpY2UoZGV2aWNlKTsKKwlpbnN0LT5zdGFydF90aW1lID0gdGltZSgwKTsKKwlpbnN0LT5uZXh0ID0gTlVMTDsKKworCS8qCisJICogRmluZCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBzbyB3ZSBhZGQgdGhlIGluc3RhbmNlIG9uIGF0IHRoZSBlbmQuCisJICovCisJZm9yIChwID0gaW5zdGFuY2VfbGlzdDsgcCAmJiBwLT5uZXh0OyBwID0gcC0+bmV4dCk7CisKKwlpZiAocCkKKwkJcC0+bmV4dCA9IGluc3Q7CisJZWxzZQorCQlpbnN0YW5jZV9saXN0ID0gaW5zdDsKKworCXJldHVybiAwOworfQorCisvKgorICogU2VuZCBhIHNpZ25hbCB0byBhbGwgb3V0c3RhbmRpbmcgZnNjayBjaGlsZCBwcm9jZXNzZXMKKyAqLworc3RhdGljIGludCBraWxsX2FsbChpbnQgc2lnbnVtKQoreworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCWludCAgICAgbiA9IDA7CisKKwlmb3IgKGluc3QgPSBpbnN0YW5jZV9saXN0OyBpbnN0OyBpbnN0ID0gaW5zdC0+bmV4dCkgeworCQlpZiAoaW5zdC0+ZmxhZ3MgJiBGTEFHX0RPTkUpCisJCQljb250aW51ZTsKKwkJa2lsbChpbnN0LT5waWQsIHNpZ251bSk7CisJCW4rKzsKKwl9CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBXYWl0IGZvciBvbmUgY2hpbGQgcHJvY2VzcyB0byBleGl0OyB3aGVuIGl0IGRvZXMsIHVubGluayBpdCBmcm9tCisgKiB0aGUgbGlzdCBvZiBleGVjdXRpbmcgY2hpbGQgcHJvY2Vzc2VzLCBhbmQgcmV0dXJuIGl0LgorICovCitzdGF0aWMgc3RydWN0IGZzY2tfaW5zdGFuY2UgKndhaXRfb25lKGludCBmbGFncykKK3sKKwlpbnQgICAgIHN0YXR1czsKKwlpbnQgICAgIHNpZzsKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdCwgKmluc3QyLCAqcHJldjsKKwlwaWRfdCAgIHBpZDsKKworCWlmICghaW5zdGFuY2VfbGlzdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobm9leGVjdXRlKSB7CisJCWluc3QgPSBpbnN0YW5jZV9saXN0OworCQlwcmV2ID0gMDsKKyNpZmRlZiBSQU5ET01fREVCVUcKKwkJd2hpbGUgKGluc3QtPm5leHQgJiYgKHJhbmRvbSgpICYgMSkpIHsKKwkJCXByZXYgPSBpbnN0OworCQkJaW5zdCA9IGluc3QtPm5leHQ7CisJCX0KKyNlbmRpZgorCQlpbnN0LT5leGl0X3N0YXR1cyA9IDA7CisJCWdvdG8gcmV0X2luc3Q7CisJfQorCisJLyoKKwkgKiBnY2MgLVdhbGwgZmFpbHMgc2F2aW5nIHRocm93IGFnYWluc3Qgc3R1cGlkaXR5CisJICogKGluc3QgYW5kIHByZXYgYXJlIHRob3VnaHQgdG8gYmUgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMpCisJICovCisJaW5zdCA9IHByZXYgPSBOVUxMOworCisJZG8geworCQlwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBmbGFncyk7CisJCWlmIChjYW5jZWxfcmVxdWVzdGVkICYmICFraWxsX3NlbnQpIHsKKwkJCWtpbGxfYWxsKFNJR1RFUk0pOworCQkJa2lsbF9zZW50Kys7CisJCX0KKwkJaWYgKChwaWQgPT0gMCkgJiYgKGZsYWdzICYgV05PSEFORykpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHBpZCA8IDApIHsKKwkJCWlmICgoZXJybm8gPT0gRUlOVFIpIHx8IChlcnJubyA9PSBFQUdBSU4pKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGVycm5vID09IEVDSElMRCkgeworCQkJCWJiX2Vycm9yX21zZygid2FpdDogbm8gbW9yZSBjaGlsZCBwcm9jZXNzPyE/Iik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlwZXJyb3IoIndhaXQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAocHJldiA9IDAsIGluc3QgPSBpbnN0YW5jZV9saXN0OworCQkgICAgIGluc3Q7CisJCSAgICAgcHJldiA9IGluc3QsIGluc3QgPSBpbnN0LT5uZXh0KSB7CisJCQlpZiAoaW5zdC0+cGlkID09IHBpZCkKKwkJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCFpbnN0KTsKKworCWlmIChXSUZFWElURUQoc3RhdHVzKSkKKwkJc3RhdHVzID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwllbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisJCXNpZyA9IFdURVJNU0lHKHN0YXR1cyk7CisJCWlmIChzaWcgPT0gU0lHSU5UKSB7CisJCQlzdGF0dXMgPSBFWElUX1VOQ09SUkVDVEVEOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJXYXJuaW5nLi4uICVzIGZvciBkZXZpY2UgJXMgZXhpdGVkICIKKwkJCSAgICAgICAid2l0aCBzaWduYWwgJWQuXG4iLAorCQkJICAgICAgIGluc3QtPnByb2csIGluc3QtPmRldmljZSwgc2lnKTsKKwkJCXN0YXR1cyA9IEVYSVRfRVJST1I7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIiVzICVzOiBzdGF0dXMgaXMgJXgsIHNob3VsZCBuZXZlciBoYXBwZW4uXG4iLAorCQkgICAgICAgaW5zdC0+cHJvZywgaW5zdC0+ZGV2aWNlLCBzdGF0dXMpOworCQlzdGF0dXMgPSBFWElUX0VSUk9SOworCX0KKwlpbnN0LT5leGl0X3N0YXR1cyA9IHN0YXR1czsKKwlpZiAocHJvZ3Jlc3MgJiYgKGluc3QtPmZsYWdzICYgRkxBR19QUk9HUkVTUykgJiYKKwkgICAgIXByb2dyZXNzX2FjdGl2ZSgpKSB7CisJCWZvciAoaW5zdDIgPSBpbnN0YW5jZV9saXN0OyBpbnN0MjsgaW5zdDIgPSBpbnN0Mi0+bmV4dCkgeworCQkJaWYgKGluc3QyLT5mbGFncyAmIEZMQUdfRE9ORSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzdHJjbXAoaW5zdDItPnR5cGUsICJleHQyIikgJiYKKwkJCSAgICBzdHJjbXAoaW5zdDItPnR5cGUsICJleHQzIikpCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICogSWYgd2UndmUganVzdCBzdGFydGVkIHRoZSBmc2NrLCB3YWl0IGEgdGlueQorCQkJICogYml0IGJlZm9yZSBzZW5kaW5nIHRoZSBraWxsLCB0byBnaXZlIGl0CisJCQkgKiB0aW1lIHRvIHNldCB1cCB0aGUgc2lnbmFsIGhhbmRsZXIKKwkJCSAqLworCQkJaWYgKGluc3QyLT5zdGFydF90aW1lIDwgdGltZSgwKSsyKSB7CisJCQkJaWYgKGZvcmsoKSA9PSAwKSB7CisJCQkJCXNsZWVwKDEpOworCQkJCQlraWxsKGluc3QyLT5waWQsIFNJR1VTUjEpOworCQkJCQlleGl0KDApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWtpbGwoaW5zdDItPnBpZCwgU0lHVVNSMSk7CisJCQlpbnN0Mi0+ZmxhZ3MgfD0gRkxBR19QUk9HUkVTUzsKKwkJCWJyZWFrOworCQl9CisJfQorcmV0X2luc3Q6CisJaWYgKHByZXYpCisJCXByZXYtPm5leHQgPSBpbnN0LT5uZXh0OworCWVsc2UKKwkJaW5zdGFuY2VfbGlzdCA9IGluc3QtPm5leHQ7CisJaWYgKHZlcmJvc2UgPiAxKQorCQlwcmludGYoIkZpbmlzaGVkIHdpdGggJXMgKGV4aXQgc3RhdHVzICVkKVxuIiwKKwkJICAgICAgIGluc3QtPmRldmljZSwgaW5zdC0+ZXhpdF9zdGF0dXMpOworCW51bV9ydW5uaW5nLS07CisJcmV0dXJuIGluc3Q7Cit9CisKKyNkZWZpbmUgRkxBR19XQUlUX0FMTCAgICAgICAgICAgMAorI2RlZmluZSBGTEFHX1dBSVRfQVRMRUFTVF9PTkUgICAxCisvKgorICogV2FpdCB1bnRpbCBhbGwgZXhlY3V0aW5nIGNoaWxkIHByb2Nlc3NlcyBoYXZlIGV4aXRlZDsgcmV0dXJuIHRoZQorICogbG9naWNhbCBPUiBvZiBhbGwgb2YgdGhlaXIgZXhpdCBjb2RlIHZhbHVlcy4KKyAqLworc3RhdGljIGludCB3YWl0X21hbnkoaW50IGZsYWdzKQoreworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCWludCAgICAgZ2xvYmFsX3N0YXR1cyA9IDA7CisJaW50ICAgICB3YWl0X2ZsYWdzID0gMDsKKworCXdoaWxlICgoaW5zdCA9IHdhaXRfb25lKHdhaXRfZmxhZ3MpKSkgeworCQlnbG9iYWxfc3RhdHVzIHw9IGluc3QtPmV4aXRfc3RhdHVzOworCQlmcmVlX2luc3RhbmNlKGluc3QpOworI2lmZGVmIFJBTkRPTV9ERUJVRworCQlpZiAobm9leGVjdXRlICYmIChmbGFncyAmIFdOT0hBTkcpICYmICEocmFuZG9tKCkgJSAzKSkKKwkJCWJyZWFrOworI2VuZGlmCisJCWlmIChmbGFncyAmIEZMQUdfV0FJVF9BVExFQVNUX09ORSkKKwkJCXdhaXRfZmxhZ3MgPSBXTk9IQU5HOworCX0KKwlyZXR1cm4gZ2xvYmFsX3N0YXR1czsKK30KKworLyoKKyAqIFJ1biB0aGUgZnNjayBwcm9ncmFtIG9uIGEgcGFydGljdWxhciBkZXZpY2UKKyAqCisgKiBJZiB0aGUgdHlwZSBpcyBzcGVjaWZpZWQgdXNpbmcgLXQsIGFuZCBpdCBpc24ndCBwcmVmaXhlZCB3aXRoICJubyIKKyAqIChhcyBpbiAibm9leHQyIikgYW5kIG9ubHkgb25lIGZpbGVzeXN0ZW0gdHlwZSBpcyBzcGVjaWZpZWQsIHRoZW4KKyAqIHVzZSB0aGF0IHR5cGUgcmVnYXJkbGVzcyBvZiB3aGF0IGlzIHNwZWNpZmllZCBpbiAvZXRjL2ZzdGFiLgorICoKKyAqIElmIHRoZSB0eXBlIGlzbid0IHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB1c2UgZWl0aGVyIHRoZSB0eXBlCisgKiBzcGVjaWZpZWQgaW4gL2V0Yy9mc3RhYiwgb3IgREVGQVVMVF9GU1RZUEUuCisgKi8KK3N0YXRpYyB2b2lkIGZzY2tfZGV2aWNlKHN0cnVjdCBmc19pbmZvICpmcywgaW50IGludGVyYWN0aXZlKQoreworCWNvbnN0IGNoYXIgKnR5cGU7CisJaW50IHJldHZhbDsKKworCWludGVycHJldF90eXBlKGZzKTsKKworCWlmIChzdHJjbXAoZnMtPnR5cGUsICJhdXRvIikgIT0gMCkKKwkJdHlwZSA9IGZzLT50eXBlOworCWVsc2UgaWYgKGZzdHlwZSAmJiBzdHJuY21wKGZzdHlwZSwgIm5vIiwgMikgJiYKKwkgICAgc3RybmNtcChmc3R5cGUsICJvcHRzPSIsIDUpICYmIHN0cm5jbXAoZnN0eXBlLCAibG9vcCIsIDQpICYmCisJICAgICFzdHJjaHIoZnN0eXBlLCAnLCcpKQorCQl0eXBlID0gZnN0eXBlOworCWVsc2UKKwkJdHlwZSA9IERFRkFVTFRfRlNUWVBFOworCisJbnVtX3J1bm5pbmcrKzsKKwlyZXR2YWwgPSBleGVjdXRlKHR5cGUsIGZzLT5kZXZpY2UsIGZzLT5tb3VudHB0LCBpbnRlcmFjdGl2ZSk7CisJaWYgKHJldHZhbCkgeworCQliYl9lcnJvcl9tc2coImVycm9yICVkIHdoaWxlIGV4ZWN1dGluZyBmc2NrLiVzIGZvciAlcyIsCisJCQkJCQlyZXR2YWwsIHR5cGUsIGZzLT5kZXZpY2UpOworCQludW1fcnVubmluZy0tOworCX0KK30KKworCisvKgorICogRGVhbCB3aXRoIHRoZSBmc2NrIC10IGFyZ3VtZW50LgorICovCitzdHJ1Y3QgZnNfdHlwZV9jb21waWxlIHsKKwljaGFyICoqbGlzdDsKKwlpbnQgKnR5cGU7CisJaW50ICBuZWdhdGU7Cit9IGZzX3R5cGVfY29tcGlsZWQ7CisKKyNkZWZpbmUgRlNfVFlQRV9OT1JNQUwgIDAKKyNkZWZpbmUgRlNfVFlQRV9PUFQgICAgIDEKKyNkZWZpbmUgRlNfVFlQRV9ORUdPUFQgIDIKKworc3RhdGljIGNvbnN0IGNoYXIgZnNfdHlwZV9zeW50YXhfZXJyb3JbXSA9CisiRWl0aGVyIGFsbCBvciBub25lIG9mIHRoZSBmaWxlc3lzdGVtIHR5cGVzIHBhc3NlZCB0byAtdCBtdXN0IGJlIHByZWZpeGVkXG4iCisgICAid2l0aCAnbm8nIG9yICchJy4iOworCitzdGF0aWMgdm9pZCBjb21waWxlX2ZzX3R5cGUoY2hhciAqZnNfdHlwZSwgc3RydWN0IGZzX3R5cGVfY29tcGlsZSAqY21wKQoreworCWNoYXIgICAgKmNwLCAqbGlzdCwgKnM7CisJaW50ICAgICBudW0gPSAyOworCWludCAgICAgbmVnYXRlLCBmaXJzdF9uZWdhdGUgPSAxOworCisJaWYgKGZzX3R5cGUpIHsKKwkJZm9yIChjcD1mc190eXBlOyAqY3A7IGNwKyspIHsKKwkJCWlmICgqY3AgPT0gJywnKQorCQkJCW51bSsrOworCQl9CisJfQorCisJY21wLT5saXN0ID0geHphbGxvYyhudW0gKiBzaXplb2YoY2hhciAqKSk7CisJY21wLT50eXBlID0geHphbGxvYyhudW0gKiBzaXplb2YoaW50KSk7CisJY21wLT5uZWdhdGUgPSAwOworCisJaWYgKCFmc190eXBlKQorCQlyZXR1cm47CisKKwlsaXN0ID0gc3RyaW5nX2NvcHkoZnNfdHlwZSk7CisJbnVtID0gMDsKKwlzID0gc3RydG9rKGxpc3QsICIsIik7CisJd2hpbGUgKHMpIHsKKwkJbmVnYXRlID0gMDsKKwkJaWYgKHN0cm5jbXAocywgIm5vIiwgMikgPT0gMCkgeworCQkJcyArPSAyOworCQkJbmVnYXRlID0gMTsKKwkJfSBlbHNlIGlmICgqcyA9PSAnIScpIHsKKwkJCXMrKzsKKwkJCW5lZ2F0ZSA9IDE7CisJCX0KKwkJaWYgKHN0cmNtcChzLCAibG9vcCIpID09IDApCisJCQkvKiBsb29wIGlzIHJlYWxseSBzaG9ydC1oYW5kIGZvciBvcHRzPWxvb3AgKi8KKwkJCWdvdG8gbG9vcF9zcGVjaWFsX2Nhc2U7CisJCWVsc2UgaWYgKHN0cm5jbXAocywgIm9wdHM9IiwgNSkgPT0gMCkgeworCQkJcyArPSA1OworCQlsb29wX3NwZWNpYWxfY2FzZToKKwkJCWNtcC0+dHlwZVtudW1dID0gbmVnYXRlID8gRlNfVFlQRV9ORUdPUFQgOiBGU19UWVBFX09QVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChmaXJzdF9uZWdhdGUpIHsKKwkJCQljbXAtPm5lZ2F0ZSA9IG5lZ2F0ZTsKKwkJCQlmaXJzdF9uZWdhdGUgPSAwOworCQkJfQorCQkJaWYgKChuZWdhdGUgJiYgIWNtcC0+bmVnYXRlKSB8fAorCQkJICAgICghbmVnYXRlICYmIGNtcC0+bmVnYXRlKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyIsIGZzX3R5cGVfc3ludGF4X2Vycm9yKTsKKwkJCX0KKwkJfQorCQljbXAtPmxpc3RbbnVtKytdID0gc3RyaW5nX2NvcHkocyk7CisJCXMgPSBzdHJ0b2soTlVMTCwgIiwiKTsKKwl9CisJZnJlZShsaXN0KTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGEgcGFydGljdWxhciBvcHRpb24gYXBwZWFycyBpbiBhCisgKiBjb21tYS1kZWxpbWl0ZWQgb3B0aW9ucyBsaXN0CisgKi8KK3N0YXRpYyBpbnQgb3B0X2luX2xpc3QoY2hhciAqb3B0LCBjaGFyICpvcHRsaXN0KQoreworCWNoYXIgICAgKmxpc3QsICpzOworCisJaWYgKCFvcHRsaXN0KQorCQlyZXR1cm4gMDsKKwlsaXN0ID0gc3RyaW5nX2NvcHkob3B0bGlzdCk7CisKKwlzID0gc3RydG9rKGxpc3QsICIsIik7CisJd2hpbGUgKHMpIHsKKwkJaWYgKHN0cmNtcChzLCBvcHQpID09IDApIHsKKwkJCWZyZWUobGlzdCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzID0gc3RydG9rKE5VTEwsICIsIik7CisJfQorCWZyZWUobGlzdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNlZSBpZiB0aGUgZmlsZXN5c3RlbSBtYXRjaGVzIHRoZSBjcml0ZXJpYSBnaXZlbiBieSB0aGUgLXQgb3B0aW9uICovCitzdGF0aWMgaW50IGZzX21hdGNoKHN0cnVjdCBmc19pbmZvICpmcywgc3RydWN0IGZzX3R5cGVfY29tcGlsZSAqY21wKQoreworCWludCBuLCByZXQgPSAwLCBjaGVja2VkX3R5cGUgPSAwOworCWNoYXIgKmNwOworCisJaWYgKGNtcC0+bGlzdCA9PSAwIHx8IGNtcC0+bGlzdFswXSA9PSAwKQorCQlyZXR1cm4gMTsKKworCWZvciAobj0wOyAoY3AgPSBjbXAtPmxpc3Rbbl0pOyBuKyspIHsKKwkJc3dpdGNoIChjbXAtPnR5cGVbbl0pIHsKKwkJY2FzZSBGU19UWVBFX05PUk1BTDoKKwkJCWNoZWNrZWRfdHlwZSsrOworCQkJaWYgKHN0cmNtcChjcCwgZnMtPnR5cGUpID09IDApIHsKKwkJCQlyZXQgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRlNfVFlQRV9ORUdPUFQ6CisJCQlpZiAob3B0X2luX2xpc3QoY3AsIGZzLT5vcHRzKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlIEZTX1RZUEVfT1BUOgorCQkJaWYgKCFvcHRfaW5fbGlzdChjcCwgZnMtPm9wdHMpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGNoZWNrZWRfdHlwZSA9PSAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gKGNtcC0+bmVnYXRlID8gIXJldCA6IHJldCk7Cit9CisKKy8qIENoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgdGhpcyBmaWxlc3lzdGVtLiAqLworc3RhdGljIGludCBpZ25vcmUoc3RydWN0IGZzX2luZm8gKmZzKQoreworCWludCB3YW50ZWQ7CisJY2hhciAqczsKKworCS8qCisJICogSWYgdGhlIHBhc3MgbnVtYmVyIGlzIDAsIGlnbm9yZSBpdC4KKwkgKi8KKwlpZiAoZnMtPnBhc3NubyA9PSAwKQorCQlyZXR1cm4gMTsKKworCWludGVycHJldF90eXBlKGZzKTsKKworCS8qCisJICogSWYgYSBzcGVjaWZpYyBmc3R5cGUgaXMgc3BlY2lmaWVkLCBhbmQgaXQgZG9lc24ndCBtYXRjaCwKKwkgKiBpZ25vcmUgaXQuCisJICovCisJaWYgKCFmc19tYXRjaChmcywgJmZzX3R5cGVfY29tcGlsZWQpKSByZXR1cm4gMTsKKworCS8qIEFyZSB3ZSBpZ25vcmluZyB0aGlzIHR5cGU/ICovCisJaWYgKGluZGV4X2luX3N0cl9hcnJheShpZ25vcmVkX3R5cGVzLCBmcy0+dHlwZSkgPj0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKiBEbyB3ZSByZWFsbHkgcmVhbGx5IHdhbnQgdG8gY2hlY2sgdGhpcyBmcz8gKi8KKwl3YW50ZWQgPSBpbmRleF9pbl9zdHJfYXJyYXkocmVhbGx5X3dhbnRlZCwgZnMtPnR5cGUpID49IDA7CisKKwkvKiBTZWUgaWYgdGhlIDxmc2NrLmZzPiBwcm9ncmFtIGlzIGF2YWlsYWJsZS4gKi8KKwlzID0gZmluZF9mc2NrKGZzLT50eXBlKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJCWlmICh3YW50ZWQpCisJCQliYl9lcnJvcl9tc2coImNhbid0IGNoZWNrICVzOiBmc2NrLiVzIG5vdCBmb3VuZCIsCisJCQkJZnMtPmRldmljZSwgZnMtPnR5cGUpOworCQlyZXR1cm4gMTsKKwl9CisJZnJlZShzKTsKKworCS8qIFdlIGNhbiBhbmQgd2FudCB0byBjaGVjayB0aGlzIGZpbGUgc3lzdGVtIHR5cGUuICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm5zIFRSVUUgaWYgYSBwYXJ0aXRpb24gb24gdGhlIHNhbWUgZGlzayBpcyBhbHJlYWR5IGJlaW5nCisgKiBjaGVja2VkLgorICovCitzdGF0aWMgaW50IGRldmljZV9hbHJlYWR5X2FjdGl2ZShjaGFyICpkZXZpY2UpCit7CisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3Q7CisJY2hhciAqYmFzZTsKKworCWlmIChmb3JjZV9hbGxfcGFyYWxsZWwpCisJCXJldHVybiAwOworCisjaWZkZWYgQkFTRV9NRAorCS8qIERvbid0IGNoZWNrIGEgc29mdCByYWlkIGRpc2sgd2l0aCBhbnkgb3RoZXIgZGlzayAqLworCWlmIChpbnN0YW5jZV9saXN0ICYmCisJICAgICghc3RybmNtcChpbnN0YW5jZV9saXN0LT5kZXZpY2UsIEJBU0VfTUQsIHNpemVvZihCQVNFX01EKS0xKSB8fAorCSAgICAgIXN0cm5jbXAoZGV2aWNlLCBCQVNFX01ELCBzaXplb2YoQkFTRV9NRCktMSkpKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCisJYmFzZSA9IGJhc2VfZGV2aWNlKGRldmljZSk7CisJLyoKKwkgKiBJZiB3ZSBkb24ndCBrbm93IHRoZSBiYXNlIGRldmljZSwgYXNzdW1lIHRoYXQgdGhlIGRldmljZSBpcworCSAqIGFscmVhZHkgYWN0aXZlIGlmIHRoZXJlIGFyZSBhbnkgZnNjayBpbnN0YW5jZXMgcnVubmluZy4KKwkgKi8KKwlpZiAoIWJhc2UpCisJCXJldHVybiAoaW5zdGFuY2VfbGlzdCAhPSAwKTsKKwlmb3IgKGluc3QgPSBpbnN0YW5jZV9saXN0OyBpbnN0OyBpbnN0ID0gaW5zdC0+bmV4dCkgeworCQlpZiAoIWluc3QtPmJhc2VfZGV2aWNlIHx8ICFzdHJjbXAoYmFzZSwgaW5zdC0+YmFzZV9kZXZpY2UpKSB7CisJCQlmcmVlKGJhc2UpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJZnJlZShiYXNlKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2sgYWxsIGZpbGUgc3lzdGVtcywgdXNpbmcgdGhlIC9ldGMvZnN0YWIgdGFibGUuICovCitzdGF0aWMgaW50IGNoZWNrX2FsbCh2b2lkKQoreworCXN0cnVjdCBmc19pbmZvICpmcyA9IE5VTEw7CisJaW50IHN0YXR1cyA9IEVYSVRfT0s7CisJaW50IG5vdF9kb25lX3lldCA9IDE7CisJaW50IHBhc3NubyA9IDE7CisJaW50IHBhc3NfZG9uZTsKKworCWlmICh2ZXJib3NlKQorCQlmcHV0cygiQ2hlY2tpbmcgYWxsIGZpbGUgc3lzdGVtcy5cbiIsIHN0ZG91dCk7CisKKwkvKgorCSAqIERvIGFuIGluaXRpYWwgc2NhbiBvdmVyIHRoZSBmaWxlc3lzdGVtOyBtYXJrIGZpbGVzeXN0ZW1zCisJICogd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgYXMgZG9uZSwgYW5kIHJlc29sdmUgYW55ICJhdXRvIgorCSAqIGZpbGVzeXN0ZW0gdHlwZXMgKGRvbmUgYXMgYSBzaWRlLWVmZmVjdCBvZiBjYWxsaW5nIGlnbm9yZSgpKS4KKwkgKi8KKwlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkgeworCQlpZiAoaWdub3JlKGZzKSkKKwkJCWZzLT5mbGFncyB8PSBGTEFHX0RPTkU7CisJfQorCisJLyoKKwkgKiBGaW5kIGFuZCBjaGVjayB0aGUgcm9vdCBmaWxlc3lzdGVtLgorCSAqLworCWlmICghcGFyYWxsZWxfcm9vdCkgeworCQlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkgeworCQkJaWYgKExPTkVfQ0hBUihmcy0+bW91bnRwdCwgJy8nKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoZnMpIHsKKwkJCWlmICghc2tpcF9yb290ICYmICFpZ25vcmUoZnMpKSB7CisJCQkJZnNja19kZXZpY2UoZnMsIDEpOworCQkJCXN0YXR1cyB8PSB3YWl0X21hbnkoRkxBR19XQUlUX0FMTCk7CisJCQkJaWYgKHN0YXR1cyA+IEVYSVRfTk9OREVTVFJVQ1QpCisJCQkJCXJldHVybiBzdGF0dXM7CisJCQl9CisJCQlmcy0+ZmxhZ3MgfD0gRkxBR19ET05FOworCQl9CisJfQorCS8qCisJICogVGhpcyBpcyBmb3IgdGhlIGJvbmUtaGVhZGVkIHVzZXIgd2hvIGVudGVycyB0aGUgcm9vdAorCSAqIGZpbGVzeXN0ZW0gdHdpY2UuICBTa2lwIHJvb3Qgd2lsbCBza2VwIGFsbCByb290IGVudHJpZXMuCisJICovCisJaWYgKHNraXBfcm9vdCkKKwkJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpCisJCQlpZiAoTE9ORV9DSEFSKGZzLT5tb3VudHB0LCAnLycpKQorCQkJCWZzLT5mbGFncyB8PSBGTEFHX0RPTkU7CisKKwl3aGlsZSAobm90X2RvbmVfeWV0KSB7CisJCW5vdF9kb25lX3lldCA9IDA7CisJCXBhc3NfZG9uZSA9IDE7CisKKwkJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpIHsKKwkJCWlmIChjYW5jZWxfcmVxdWVzdGVkKQorCQkJCWJyZWFrOworCQkJaWYgKGZzLT5mbGFncyAmIEZMQUdfRE9ORSkKKwkJCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiBJZiB0aGUgZmlsZXN5c3RlbSdzIHBhc3MgbnVtYmVyIGlzIGhpZ2hlcgorCQkJICogdGhhbiB0aGUgY3VycmVudCBwYXNzIG51bWJlciwgdGhlbiB3ZSBkb24ndAorCQkJICogZG8gaXQgeWV0LgorCQkJICovCisJCQlpZiAoZnMtPnBhc3NubyA+IHBhc3NubykgeworCQkJCW5vdF9kb25lX3lldCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIElmIGEgZmlsZXN5c3RlbSBvbiBhIHBhcnRpY3VsYXIgZGV2aWNlIGhhcworCQkJICogYWxyZWFkeSBiZWVuIHNwYXduZWQsIHRoZW4gd2UgbmVlZCB0byBkZWZlcgorCQkJICogdGhpcyB0byBhbm90aGVyIHBhc3MuCisJCQkgKi8KKwkJCWlmIChkZXZpY2VfYWxyZWFkeV9hY3RpdmUoZnMtPmRldmljZSkpIHsKKwkJCQlwYXNzX2RvbmUgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIFNwYXduIG9mZiB0aGUgZnNjayBwcm9jZXNzCisJCQkgKi8KKwkJCWZzY2tfZGV2aWNlKGZzLCBzZXJpYWxpemUpOworCQkJZnMtPmZsYWdzIHw9IEZMQUdfRE9ORTsKKworCQkJLyoKKwkJCSAqIE9ubHkgZG8gb25lIGZpbGVzeXN0ZW0gYXQgYSB0aW1lLCBvciBpZiB3ZQorCQkJICogaGF2ZSBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZnNjaydzIGV4dGFudAorCQkJICogYXQgb25lIHRpbWUsIGFwcGx5IHRoYXQgbGltaXQuCisJCQkgKi8KKwkJCWlmIChzZXJpYWxpemUgfHwKKwkJCSAgICAobWF4X3J1bm5pbmcgJiYgKG51bV9ydW5uaW5nID49IG1heF9ydW5uaW5nKSkpIHsKKwkJCQlwYXNzX2RvbmUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChjYW5jZWxfcmVxdWVzdGVkKQorCQkJYnJlYWs7CisJCWlmICh2ZXJib3NlID4gMSkKKwkJCXByaW50ZigiLS13YWl0aW5nLS0gKHBhc3MgJWQpXG4iLCBwYXNzbm8pOworCQlzdGF0dXMgfD0gd2FpdF9tYW55KHBhc3NfZG9uZSA/IEZMQUdfV0FJVF9BTEwgOgorCQkJCSAgICBGTEFHX1dBSVRfQVRMRUFTVF9PTkUpOworCQlpZiAocGFzc19kb25lKSB7CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJCXBhc3NubysrOworCQl9IGVsc2UKKwkJCW5vdF9kb25lX3lldCsrOworCX0KKwlpZiAoY2FuY2VsX3JlcXVlc3RlZCAmJiAha2lsbF9zZW50KSB7CisJCWtpbGxfYWxsKFNJR1RFUk0pOworCQlraWxsX3NlbnQrKzsKKwl9CisJc3RhdHVzIHw9IHdhaXRfbWFueShGTEFHX1dBSVRfQVRMRUFTVF9PTkUpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9jYW5jZWwoaW50IHNpZyBGU0NLX0FUVFIoKHVudXNlZCkpKQoreworCWNhbmNlbF9yZXF1ZXN0ZWQrKzsKK30KKworc3RhdGljIHZvaWQgUFJTKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgICAgIGksIGo7CisJY2hhciAgICAqYXJnLCAqZGV2LCAqdG1wID0gTlVMTDsKKwljaGFyICAgIG9wdGlvbnNbMTI4XTsKKwlpbnQgICAgIG9wdCA9IDA7CisJaW50ICAgICBvcHRzX2Zvcl9mc2NrID0gMDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uICAgICAgICBzYTsKKworCS8qCisJICogU2V0IHVwIHNpZ25hbCBhY3Rpb24KKwkgKi8KKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc3RydWN0IHNpZ2FjdGlvbikpOworCXNhLnNhX2hhbmRsZXIgPSBzaWduYWxfY2FuY2VsOworCXNpZ2FjdGlvbihTSUdJTlQsICZzYSwgMCk7CisJc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgMCk7CisKKwludW1fZGV2aWNlcyA9IDA7CisJbnVtX2FyZ3MgPSAwOworCWluc3RhbmNlX2xpc3QgPSAwOworCisJZm9yIChpPTE7IGkgPCBhcmdjOyBpKyspIHsKKwkJYXJnID0gYXJndltpXTsKKwkJaWYgKCFhcmcpCisJCQljb250aW51ZTsKKwkJaWYgKChhcmdbMF0gPT0gJy8nICYmICFvcHRzX2Zvcl9mc2NrKSB8fCBzdHJjaHIoYXJnLCAnPScpKSB7CisJCQlpZiAobnVtX2RldmljZXMgPj0gTUFYX0RFVklDRVMpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgZGV2aWNlcyIpOworCQkJfQorCQkJZGV2ID0gYmxraWRfZ2V0X2Rldm5hbWUoY2FjaGUsIGFyZywgTlVMTCk7CisJCQlpZiAoIWRldiAmJiBzdHJjaHIoYXJnLCAnPScpKSB7CisJCQkJLyoKKwkJCQkgKiBDaGVjayB0byBzZWUgaWYgd2UgZmFpbGVkIGJlY2F1c2UKKwkJCQkgKiAvcHJvYy9wYXJ0aXRpb25zIGlzbid0IGZvdW5kLgorCQkJCSAqLworCQkJCWlmIChhY2Nlc3MoIi9wcm9jL3BhcnRpdGlvbnMiLCBSX09LKSA8IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuIC9wcm9jL3BhcnRpdGlvbnMgIgorCQkJCQkJCSIoaXMgL3Byb2MgbW91bnRlZD8pIik7CisJCQkJfQorCQkJCS8qCisJCQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYmVjYXVzZQorCQkJCSAqIHdlJ3JlIG5vdCBydW5uaW5nIGFzIHJvb3QKKwkJCQkgKi8KKwkJCQlpZiAoZ2V0ZXVpZCgpKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJIm11c3QgYmUgcm9vdCB0byBzY2FuIGZvciBtYXRjaGluZyBmaWxlc3lzdGVtczogJXNcbiIsIGFyZyk7CisJCQkJZWxzZQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJImNhbid0IGZpbmQgbWF0Y2hpbmcgZmlsZXN5c3RlbTogJXMiLCBhcmcpOworCQkJfQorCQkJZGV2aWNlc1tudW1fZGV2aWNlcysrXSA9IGRldiA/IGRldiA6IHN0cmluZ19jb3B5KGFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXJnWzBdICE9ICctJyB8fCBvcHRzX2Zvcl9mc2NrKSB7CisJCQlpZiAobnVtX2FyZ3MgPj0gTUFYX0FSR1MpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCQl9CisJCQlhcmdzW251bV9hcmdzKytdID0gc3RyaW5nX2NvcHkoYXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAoaj0xOyBhcmdbal07IGorKykgeworCQkJaWYgKG9wdHNfZm9yX2ZzY2spIHsKKwkJCQlvcHRpb25zWysrb3B0XSA9IGFyZ1tqXTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXN3aXRjaCAoYXJnW2pdKSB7CisJCQljYXNlICdBJzoKKwkJCQlkb2FsbCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnQyc6CisJCQkJcHJvZ3Jlc3MrKzsKKwkJCQlpZiAoYXJnW2orMV0pIHsKKwkJCQkJcHJvZ3Jlc3NfZmQgPSBzdHJpbmdfdG9faW50KGFyZytqKzEpOworCQkJCQlpZiAocHJvZ3Jlc3NfZmQgPCAwKQorCQkJCQkJcHJvZ3Jlc3NfZmQgPSAwOworCQkJCQllbHNlCisJCQkJCQlnb3RvIG5leHRfYXJnOworCQkJCX0gZWxzZSBpZiAoKGkrMSkgPCBhcmdjCisJCQkJICYmIGFyZ3ZbaSsxXVswXSAhPSAnLScpIHsKKwkJCQkJcHJvZ3Jlc3NfZmQgPSBzdHJpbmdfdG9faW50KGFyZ3ZbaV0pOworCQkJCQlpZiAocHJvZ3Jlc3NfZmQgPCAwKQorCQkJCQkJcHJvZ3Jlc3NfZmQgPSAwOworCQkJCQllbHNlIHsKKwkJCQkJCWdvdG8gbmV4dF9hcmc7CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdWJzoKKwkJCQl2ZXJib3NlKys7CisJCQkJYnJlYWs7CisJCQljYXNlICdOJzoKKwkJCQlub2V4ZWN1dGUrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1InOgorCQkJCXNraXBfcm9vdCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnVCc6CisJCQkJbm90aXRsZSsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnTSc6CisJCQkJbGlrZV9tb3VudCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnUCc6CisJCQkJcGFyYWxsZWxfcm9vdCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJc2VyaWFsaXplKys7CisJCQkJYnJlYWs7CisJCQljYXNlICd0JzoKKwkJCQl0bXAgPSAwOworCQkJCWlmIChmc3R5cGUpCisJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQlpZiAoYXJnW2orMV0pCisJCQkJCXRtcCA9IGFyZytqKzE7CisJCQkJZWxzZSBpZiAoKGkrMSkgPCBhcmdjKQorCQkJCQl0bXAgPSBhcmd2WysraV07CisJCQkJZWxzZQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJZnN0eXBlID0gc3RyaW5nX2NvcHkodG1wKTsKKwkJCQljb21waWxlX2ZzX3R5cGUoZnN0eXBlLCAmZnNfdHlwZV9jb21waWxlZCk7CisJCQkJZ290byBuZXh0X2FyZzsKKwkJCWNhc2UgJy0nOgorCQkJCW9wdHNfZm9yX2ZzY2srKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJz8nOgorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJb3B0aW9uc1srK29wdF0gPSBhcmdbal07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwluZXh0X2FyZzoKKwkJaWYgKG9wdCkgeworCQkJb3B0aW9uc1swXSA9ICctJzsKKwkJCW9wdGlvbnNbKytvcHRdID0gJ1wwJzsKKwkJCWlmIChudW1fYXJncyA+PSBNQVhfQVJHUykgeworCQkJCWJiX2Vycm9yX21zZygidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCQl9CisJCQlhcmdzW251bV9hcmdzKytdID0gc3RyaW5nX2NvcHkob3B0aW9ucyk7CisJCQlvcHQgPSAwOworCQl9CisJfQorCWlmIChnZXRlbnYoIkZTQ0tfRk9SQ0VfQUxMX1BBUkFMTEVMIikpCisJCWZvcmNlX2FsbF9wYXJhbGxlbCsrOworCWlmICgodG1wID0gZ2V0ZW52KCJGU0NLX01BWF9JTlNUIikpKQorCSAgICBtYXhfcnVubmluZyA9IGF0b2kodG1wKTsKK30KKworaW50IGZzY2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZzY2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIHN0YXR1cyA9IDA7CisJaW50IGludGVyYWN0aXZlID0gMDsKKwljb25zdCBjaGFyICpmc3RhYjsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnM7CisKKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCBCVUZTSVopOworCXNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9OQkYsIEJVRlNJWik7CisKKwlibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBOVUxMKTsKKwlQUlMoYXJnYywgYXJndik7CisKKwlpZiAoIW5vdGl0bGUpCisJCXByaW50ZigiZnNjayAlcyAoJXMpXG4iLCBFMkZTUFJPR1NfVkVSU0lPTiwgRTJGU1BST0dTX0RBVEUpOworCisJZnN0YWIgPSBnZXRlbnYoIkZTVEFCX0ZJTEUiKTsKKwlpZiAoIWZzdGFiKQorCQlmc3RhYiA9IF9QQVRIX01OVFRBQjsKKwlsb2FkX2ZzX2luZm8oZnN0YWIpOworCisJZnNja19wYXRoID0gZTJmc19zZXRfc2Jpbl9wYXRoKCk7CisKKwlpZiAoKG51bV9kZXZpY2VzID09IDEpIHx8IChzZXJpYWxpemUpKQorCQlpbnRlcmFjdGl2ZSA9IDE7CisKKwkvKiBJZiAtQSB3YXMgc3BlY2lmaWVkICgiY2hlY2sgYWxsIiksIGRvIHRoYXQhICovCisJaWYgKGRvYWxsKQorCQlyZXR1cm4gY2hlY2tfYWxsKCk7CisKKwlpZiAobnVtX2RldmljZXMgPT0gMCkgeworCQlzZXJpYWxpemUrKzsKKwkJaW50ZXJhY3RpdmUrKzsKKwkJcmV0dXJuIGNoZWNrX2FsbCgpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykgeworCQlpZiAoY2FuY2VsX3JlcXVlc3RlZCkgeworCQkJaWYgKCFraWxsX3NlbnQpIHsKKwkJCQlraWxsX2FsbChTSUdURVJNKTsKKwkJCQlraWxsX3NlbnQrKzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWZzID0gbG9va3VwKGRldmljZXNbaV0pOworCQlpZiAoIWZzKSB7CisJCQlmcyA9IGNyZWF0ZV9mc19kZXZpY2UoZGV2aWNlc1tpXSwgMCwgImF1dG8iLAorCQkJCQkgICAgICAwLCAtMSwgLTEpOworCQkJaWYgKCFmcykKKwkJCQljb250aW51ZTsKKwkJfQorCQlmc2NrX2RldmljZShmcywgaW50ZXJhY3RpdmUpOworCQlpZiAoc2VyaWFsaXplIHx8CisJCSAgICAobWF4X3J1bm5pbmcgJiYgKG51bV9ydW5uaW5nID49IG1heF9ydW5uaW5nKSkpIHsKKwkJCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCisJCQlpbnN0ID0gd2FpdF9vbmUoMCk7CisJCQlpZiAoaW5zdCkgeworCQkJCXN0YXR1cyB8PSBpbnN0LT5leGl0X3N0YXR1czsKKwkJCQlmcmVlX2luc3RhbmNlKGluc3QpOworCQkJfQorCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCX0KKwl9CisJc3RhdHVzIHw9IHdhaXRfbWFueShGTEFHX1dBSVRfQUxMKTsKKwlibGtpZF9wdXRfY2FjaGUoY2FjaGUpOworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9mc2NrLmggYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9mc2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhMmFmNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2ZzY2suaApAQCAtMCwwICsxLDE2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmc2NrLmgKKyAqLworCisjZGVmaW5lIEZTQ0tfQVRUUih4KSBfX2F0dHJpYnV0ZV9fKHgpCisKKyNkZWZpbmUgRVhJVF9PSyAgICAgICAgICAwCisjZGVmaW5lIEVYSVRfTk9OREVTVFJVQ1QgMQorI2RlZmluZSBFWElUX0RFU1RSVUNUICAgIDIKKyNkZWZpbmUgRVhJVF9VTkNPUlJFQ1RFRCA0CisjZGVmaW5lIEVYSVRfRVJST1IgICAgICAgOAorI2RlZmluZSBFWElUX1VTQUdFICAgICAgIDE2CisjZGVmaW5lIEZTQ0tfQ0FOQ0VMRUQgICAgMzIgICAgIC8qIEFib3J0ZWQgd2l0aCBhIHNpZ25hbCBvciBeQyAqLworCitleHRlcm4gY2hhciAqZTJmc19zZXRfc2Jpbl9wYXRoKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvbHNhdHRyLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9sc2F0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBlNGNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvbHNhdHRyLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxzYXR0ci5jCQktIExpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiA5My8xMC8zMCAtIENyZWF0aW9uCisgKiA5My8xMS8xMyAtIFJlcGxhY2Ugc3RhdCgpIGNhbGxzIGJ5IGxzdGF0KCkgdG8gYXZvaWQgbG9vcHMKKyAqIDk0LzAyLzI3IC0gSW50ZWdyYXRlZCBpbiBUZWQncyBkaXN0cmlidXRpb24KKyAqIDk4LzEyLzI5IC0gRGlzcGxheSB2ZXJzaW9uIGluZm8gb25seSB3aGVuIC1WIHNwZWNpZmllZCAoRyBNIFNpcGUpCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJleHQyZnMvZXh0Ml9mcy5oIgorI2luY2x1ZGUgImUyZnNiYi5oIgorI2luY2x1ZGUgImUycC9lMnAuaCIKKworI2RlZmluZSBPUFRfUkVDVVIgMQorI2RlZmluZSBPUFRfQUxMIDIKKyNkZWZpbmUgT1BUX0RJUlNfT1BUIDQKKyNkZWZpbmUgT1BUX1BGX0xPTkcgOAorI2RlZmluZSBPUFRfR0VORVJBVElPTiAxNgorc3RhdGljIGludCBmbGFnczsKKworc3RhdGljIHZvaWQgbGlzdF9hdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmc2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgZ2VuZXJhdGlvbjsKKworCWlmIChmZ2V0ZmxhZ3MobmFtZSwgJmZzZmxhZ3MpID09IC0xKQorCQlnb3RvIHJlYWRfZXJyOworCWlmIChmbGFncyAmIE9QVF9HRU5FUkFUSU9OKSB7CisJCWlmIChmZ2V0dmVyc2lvbihuYW1lLCAmZ2VuZXJhdGlvbikgPT0gLTEpCisJCQlnb3RvIHJlYWRfZXJyOworCQlwcmludGYoIiU1bHUgIiwgZ2VuZXJhdGlvbik7CisJfQorCisJaWYgKGZsYWdzICYgT1BUX1BGX0xPTkcpIHsKKwkJcHJpbnRmKCIlLTI4cyAiLCBuYW1lKTsKKwkJcHJpbnRfZTJmbGFncyhzdGRvdXQsIGZzZmxhZ3MsIFBGT1BUX0xPTkcpOworCQliYl9wdXRjaGFyKCdcbicpOworCX0gZWxzZSB7CisJCXByaW50X2UyZmxhZ3Moc3Rkb3V0LCBmc2ZsYWdzLCAwKTsKKwkJcHJpbnRmKCIgJXNcbiIsIG5hbWUpOworCX0KKworCXJldHVybjsKK3JlYWRfZXJyOgorCWJiX3BlcnJvcl9tc2coInJlYWRpbmcgJXMiLCBuYW1lKTsKK30KKworc3RhdGljIGludCBsc2F0dHJfZGlyX3Byb2MoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGlyZW50ICosIHZvaWQgKik7CisKK3N0YXRpYyB2b2lkIGxzYXR0cl9hcmdzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAobHN0YXQobmFtZSwgJnN0KSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnKCJzdGF0aW5nICVzIiwgbmFtZSk7CisJfSBlbHNlIHsKKwkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkgJiYgIShmbGFncyAmIE9QVF9ESVJTX09QVCkpCisJCQlpdGVyYXRlX29uX2RpcihuYW1lLCBsc2F0dHJfZGlyX3Byb2MsIE5VTEwpOworCQllbHNlCisJCQlsaXN0X2F0dHJpYnV0ZXMobmFtZSk7CisJfQorfQorCitzdGF0aWMgaW50IGxzYXR0cl9kaXJfcHJvYyhjb25zdCBjaGFyICpkaXJfbmFtZSwgc3RydWN0IGRpcmVudCAqZGUsCisJCQkgICB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNoYXIgKnBhdGg7CisKKwlwYXRoID0gY29uY2F0X3BhdGhfZmlsZShkaXJfbmFtZSwgZGUtPmRfbmFtZSk7CisKKwlpZiAobHN0YXQocGF0aCwgJnN0KSA9PSAtMSkKKwkJYmJfcGVycm9yX21zZyhwYXRoKTsKKwllbHNlIHsKKwkJaWYgKGRlLT5kX25hbWVbMF0gIT0gJy4nIHx8IChmbGFncyAmIE9QVF9BTEwpKSB7CisJCQlsaXN0X2F0dHJpYnV0ZXMocGF0aCk7CisJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSAmJiAoZmxhZ3MgJiBPUFRfUkVDVVIpICYmCisJCQkgICAoZGUtPmRfbmFtZVswXSAhPSAnLicgJiYgKGRlLT5kX25hbWVbMV0gIT0gJ1wwJyB8fAorCQkJICAgKGRlLT5kX25hbWVbMV0gIT0gJy4nICYmIGRlLT5kX25hbWVbMl0gIT0gJ1wwJykpKSkgeworCQkJCXByaW50ZigiXG4lczpcbiIsIHBhdGgpOworCQkJCWl0ZXJhdGVfb25fZGlyKHBhdGgsIGxzYXR0cl9kaXJfcHJvYywgTlVMTCk7CisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCX0KKwkJfQorCX0KKworCWZyZWUocGF0aCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGxzYXR0cl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHNhdHRyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAiUmFkbHYiKTsKKworCWlmIChvcHRpbmQgPiBhcmdjIC0gMSkKKwkJbHNhdHRyX2FyZ3MoIi4iKTsKKwllbHNlCisJCWZvciAoaSA9IG9wdGluZDsgaSA8IGFyZ2M7IGkrKykKKwkJCWxzYXR0cl9hcmdzKGFyZ3ZbaV0pOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL21rZTJmcy5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvbWtlMmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1NTY1MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL21rZTJmcy5jCkBAIC0wLDAgKzEsMTMzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtlMmZzLmMgLSBNYWtlIGEgZXh0MmZzIGZpbGVzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorICoJMjAwMywgMjAwNCwgMjAwNSBieSBUaGVvZG9yZSBUcydvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogVXNhZ2U6IG1rZTJmcyBbb3B0aW9uc10gZGV2aWNlCisgKgorICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CisgKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiZTJmc2JiLmgiCisjaW5jbHVkZSAiZXh0MmZzL2V4dDJfZnMuaCIKKyNpbmNsdWRlICJ1dWlkL3V1aWQuaCIKKyNpbmNsdWRlICJlMnAvZTJwLmgiCisjaW5jbHVkZSAiZXh0MmZzL2V4dDJmcy5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI2RlZmluZSBTVFJJREVfTEVOR1RIIDgKKworI2lmbmRlZiBfX3NwYXJjX18KKyNkZWZpbmUgWkFQX0JPT1RCTE9DSworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICogZGV2aWNlX25hbWU7CisKKy8qIENvbW1hbmQgbGluZSBvcHRpb25zICovCitzdGF0aWMgaW50CWNmbGFnOworc3RhdGljIGludAlxdWlldDsKK3N0YXRpYyBpbnQJc3VwZXJfb25seTsKK3N0YXRpYyBpbnQJZm9yY2U7CitzdGF0aWMgaW50CW5vYWN0aW9uOworc3RhdGljIGludAlqb3VybmFsX3NpemU7CitzdGF0aWMgaW50CWpvdXJuYWxfZmxhZ3M7CitzdGF0aWMgY29uc3QgY2hhciAqYmFkX2Jsb2Nrc19maWxlbmFtZTsKK3N0YXRpYyBfX3UzMglmc19zdHJpZGU7CisKK3N0YXRpYyBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayBwYXJhbTsKK3N0YXRpYyBjaGFyICpjcmVhdG9yX29zOworc3RhdGljIGNoYXIgKnZvbHVtZV9sYWJlbDsKK3N0YXRpYyBjaGFyICptb3VudF9kaXI7CitzdGF0aWMgY2hhciAqam91cm5hbF9kZXZpY2UgPSBOVUxMOworc3RhdGljIGludCAgIHN5bmNfa2x1ZGdlOyAvKiBTZXQgdXNpbmcgdGhlIE1LRTJGU19TWU5DIGVudi4gb3B0aW9uICovCisKK3N0YXRpYyBpbnQgc3lzX3BhZ2Vfc2l6ZSA9IDQwOTY7CitzdGF0aWMgaW50IGxpbnV4X3ZlcnNpb25fY29kZSA9IDA7CisKK3N0YXRpYyBpbnQgaW50X2xvZzIoaW50IGFyZykKK3sKKwlpbnQgbCA9IDA7CisKKwlhcmcgPj49IDE7CisJd2hpbGUgKGFyZykgeworCQlsKys7CisJCWFyZyA+Pj0gMTsKKwl9CisJcmV0dXJuIGw7Cit9CisKK3N0YXRpYyBpbnQgaW50X2xvZzEwKHVuc2lnbmVkIGludCBhcmcpCit7CisJaW50CWw7CisKKwlmb3IgKGwgPSAwOyBhcmc7IGwrKykKKwkJYXJnID0gYXJnIC8gMTA7CisJcmV0dXJuIGw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGRlZmF1bHQgcGFyYW1ldGVycyBmb3IgYSBmaWxlc3lzdGVtCisgKgorICogVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgVGhlIHNpemUgaXMgdGhlIG1heGltdW0gc2l6ZQorICogKGluIG1lZ2FieXRlcykgZm9yIHdoaWNoIGEgc2V0IG9mIHBhcmFtZXRlcnMgYXBwbGllcywgd2l0aCBhIHNpemUKKyAqIG9mIHplcm8gbWVhbmluZyB0aGF0IGl0IGlzIHRoZSBkZWZhdWx0IHBhcmFtZXRlciBmb3IgdGhlIHR5cGUuCisgKiBOb3RlIHRoYXQgb3JkZXIgaXMgaW1wb3J0YW50IGluIHRoZSB0YWJsZSBiZWxvdy4KKyAqLworI2RlZmluZSBERUZfTUFYX0JMT0NLU0laRSAtMQorc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdF9zdHJbXSA9ICJkZWZhdWx0IjsKK3N0cnVjdCBta2UyZnNfZGVmYXVsdHMgeworCWNvbnN0IGNoYXIJKnR5cGU7CisJaW50CQlzaXplOworCWludAkJYmxvY2tzaXplOworCWludAkJaW5vZGVfcmF0aW87Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1rZTJmc19kZWZhdWx0cyBzZXR0aW5nc1tdID0geworCXsgZGVmYXVsdF9zdHIsCSAwLCA0MDk2LCA4MTkyIH0sCisJeyBkZWZhdWx0X3N0ciwgNTEyLCAxMDI0LCA0MDk2IH0sCisJeyBkZWZhdWx0X3N0ciwJIDMsIDEwMjQsIDgxOTIgfSwKKwl7ICJqb3VybmFsIiwJIDAsIDQwOTYsIDgxOTIgfSwKKwl7ICJuZXdzIiwJIDAsIDQwOTYsIDQwOTYgfSwKKwl7ICJsYXJnZWZpbGUiLAkgMCwgNDA5NiwgMTAyNCAqIDEwMjQgfSwKKwl7ICJsYXJnZWZpbGU0IiwgIDAsIDQwOTYsIDQwOTYgKiAxMDI0IH0sCisJeyAwLAkJIDAsICAgIDAsIDB9LAorfTsKKworc3RhdGljIHZvaWQgc2V0X2ZzX2RlZmF1bHRzKGNvbnN0IGNoYXIgKmZzX3R5cGUsCisJCQkgICAgc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnN1cGVyLAorCQkJICAgIGludCBibG9ja3NpemUsIGludCBzZWN0b3Jfc2l6ZSwKKwkJCSAgICBpbnQgKmlub2RlX3JhdGlvKQoreworCWludAltZWdzOworCWludAlyYXRpbyA9IDA7CisJY29uc3Qgc3RydWN0IG1rZTJmc19kZWZhdWx0cyAqcDsKKwlpbnQJdXNlX2JzaXplID0gMTAyNDsKKworCW1lZ3MgPSBzdXBlci0+c19ibG9ja3NfY291bnQgKiAoRVhUMl9CTE9DS19TSVpFKHN1cGVyKSAvIDEwMjQpIC8gMTAyNDsKKwlpZiAoaW5vZGVfcmF0aW8pCisJCXJhdGlvID0gKmlub2RlX3JhdGlvOworCWlmICghZnNfdHlwZSkKKwkJZnNfdHlwZSA9IGRlZmF1bHRfc3RyOworCWZvciAocCA9IHNldHRpbmdzOyBwLT50eXBlOyBwKyspIHsKKwkJaWYgKChzdHJjbXAocC0+dHlwZSwgZnNfdHlwZSkgIT0gMCkgJiYKKwkJICAgIChzdHJjbXAocC0+dHlwZSwgZGVmYXVsdF9zdHIpICE9IDApKQorCQkJY29udGludWU7CisJCWlmICgocC0+c2l6ZSAhPSAwKSAmJiAobWVncyA+IHAtPnNpemUpKQorCQkJY29udGludWU7CisJCWlmIChyYXRpbyA9PSAwKQorCQkJKmlub2RlX3JhdGlvID0gcC0+aW5vZGVfcmF0aW8gPCBibG9ja3NpemUgPworCQkJCWJsb2Nrc2l6ZSA6IHAtPmlub2RlX3JhdGlvOworCQl1c2VfYnNpemUgPSBwLT5ibG9ja3NpemU7CisJfQorCWlmIChibG9ja3NpemUgPD0gMCkgeworCQlpZiAodXNlX2JzaXplID09IERFRl9NQVhfQkxPQ0tTSVpFKSB7CisJCQl1c2VfYnNpemUgPSBzeXNfcGFnZV9zaXplOworCQkJaWYgKChsaW51eF92ZXJzaW9uX2NvZGUgPCAoMio2NTUzNiArIDYqMjU2KSkgJiYKKwkJCSAgICAodXNlX2JzaXplID4gNDA5NikpCisJCQkJdXNlX2JzaXplID0gNDA5NjsKKwkJfQorCQlpZiAoc2VjdG9yX3NpemUgJiYgdXNlX2JzaXplIDwgc2VjdG9yX3NpemUpCisJCQl1c2VfYnNpemUgPSBzZWN0b3Jfc2l6ZTsKKwkJaWYgKChibG9ja3NpemUgPCAwKSAmJiAodXNlX2JzaXplIDwgKC1ibG9ja3NpemUpKSkKKwkJCXVzZV9ic2l6ZSA9IC1ibG9ja3NpemU7CisJCWJsb2Nrc2l6ZSA9IHVzZV9ic2l6ZTsKKwkJc3VwZXItPnNfYmxvY2tzX2NvdW50IC89IGJsb2Nrc2l6ZSAvIDEwMjQ7CisJfQorCXN1cGVyLT5zX2xvZ19mcmFnX3NpemUgPSBzdXBlci0+c19sb2dfYmxvY2tfc2l6ZSA9CisJCWludF9sb2cyKGJsb2Nrc2l6ZSA+PiBFWFQyX01JTl9CTE9DS19MT0dfU0laRSk7Cit9CisKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgcmVhZF9iYl9maWxlIGFuZCB0ZXN0X2Rpc2sKKyAqLworc3RhdGljIHZvaWQgaW52YWxpZF9ibG9jayhleHQyX2ZpbHN5cyBmcyBFWFQyRlNfQVRUUigodW51c2VkKSksIGJsa190IGJsaykKK3sKKwliYl9lcnJvcl9tc2coIkJhZCBibG9jayAldSBvdXQgb2YgcmFuZ2U7IGlnbm9yZWQiLCBibGspOworfQorCisvKgorICogQnVzeWJveCBzdHVmZgorICovCitzdGF0aWMgdm9pZCBta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUoaW50IHJldHZhbCwgY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK3N0YXRpYyB2b2lkIG1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShpbnQgcmV0dmFsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJaWYgKHJldHZhbCkgeworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJZnByaW50ZihzdGRlcnIsICJcbkNvdWxkIG5vdCAiKTsKKwkJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQl2YV9lbmQoYXApOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBta2UyZnNfdmVyYm9zZShjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworc3RhdGljIHZvaWQgbWtlMmZzX3ZlcmJvc2UoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCWlmICghcXVpZXQpIHsKKwkJdmFfc3RhcnQoYXAsIGZtdCk7CisJCXZmcHJpbnRmKHN0ZG91dCwgZm10LCBhcCk7CisJCWZmbHVzaChzdGRvdXQpOworCQl2YV9lbmQoYXApOworCX0KK30KKworc3RhdGljIHZvaWQgbWtlMmZzX3ZlcmJvc2VfZG9uZSh2b2lkKQoreworCW1rZTJmc192ZXJib3NlKCJkb25lXG4iKTsKK30KKworc3RhdGljIHZvaWQgbWtlMmZzX3dhcm5pbmdfbXNnKGludCByZXR2YWwsIGNoYXIgKmZtdCwgLi4uICkgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworc3RhdGljIHZvaWQgbWtlMmZzX3dhcm5pbmdfbXNnKGludCByZXR2YWwsIGNoYXIgKmZtdCwgLi4uICkKK3sKKwl2YV9saXN0IGFwOworCisJaWYgKHJldHZhbCkgeworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJZnByaW50ZihzdGRlcnIsICJcbldhcm5pbmc6ICIpOworCQl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJCXZhX2VuZChhcCk7CisJfQorfQorCisvKgorICogUmVhZHMgdGhlIGJhZCBibG9ja3MgbGlzdCBmcm9tIGEgZmlsZQorICovCitzdGF0aWMgdm9pZCByZWFkX2JiX2ZpbGUoZXh0Ml9maWxzeXMgZnMsIGJhZGJsb2Nrc19saXN0ICpiYl9saXN0LAorCQkJIGNvbnN0IGNoYXIgKmJhZF9ibG9ja3NfZmlsZSkKK3sKKwlGSUxFCQkqZjsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJZiA9IHhmb3Blbl9mb3JfcmVhZChiYWRfYmxvY2tzX2ZpbGUpOworCXJldHZhbCA9IGV4dDJmc19yZWFkX2JiX0ZJTEUoZnMsIGYsIGJiX2xpc3QsIGludmFsaWRfYmxvY2spOworCWZjbG9zZSAoZik7CisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgInJlYWQgYmFkIGJsb2NrcyBmcm9tIGxpc3QiKTsKK30KKworLyoKKyAqIFJ1bnMgdGhlIGJhZGJsb2NrcyBwcm9ncmFtIHRvIHRlc3QgdGhlIGRpc2sKKyAqLworc3RhdGljIHZvaWQgdGVzdF9kaXNrKGV4dDJfZmlsc3lzIGZzLCBiYWRibG9ja3NfbGlzdCAqYmJfbGlzdCkKK3sKKwlGSUxFCQkqZjsKKwllcnJjb2RlX3QJcmV0dmFsOworCWNoYXIJCWJ1ZlsxMDI0XTsKKworCXNwcmludGYoYnVmLCAiYmFkYmxvY2tzIC1iICVkICVzJXMlcyAlZCIsIGZzLT5ibG9ja3NpemUsCisJCXF1aWV0ID8gIiIgOiAiLXMgIiwgKGNmbGFnID4gMSkgPyAiLXcgIiA6ICIiLAorCQlmcy0+ZGV2aWNlX25hbWUsIGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpOworCW1rZTJmc192ZXJib3NlKCJSdW5uaW5nIGNvbW1hbmQ6ICVzXG4iLCBidWYpOworCWYgPSBwb3BlbihidWYsICJyIik7CisJaWYgKCFmKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcnVuICclcyciLCBidWYpOworCX0KKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9iYl9GSUxFKGZzLCBmLCBiYl9saXN0LCBpbnZhbGlkX2Jsb2NrKTsKKwlwY2xvc2UoZik7CisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgInJlYWQgYmFkIGJsb2NrcyBmcm9tIHByb2dyYW0iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2JhZF9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsIGJhZGJsb2Nrc19saXN0IGJiX2xpc3QpCit7CisJZGdycF90CQkJaTsKKwlibGtfdAkJCWo7CisJdW5zaWduZWQJCW11c3RfYmVfZ29vZDsKKwlibGtfdAkJCWJsazsKKwliYWRibG9ja3NfaXRlcmF0ZQliYl9pdGVyOworCWVycmNvZGVfdAkJcmV0dmFsOworCWJsa190CQkJZ3JvdXBfYmxvY2s7CisJaW50CQkJZ3JvdXA7CisJaW50CQkJZ3JvdXBfYmFkOworCisJaWYgKCFiYl9saXN0KQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRoZSBwcmltYXJ5IHN1cGVyYmxvY2sgYW5kIGdyb3VwIGRlc2NyaXB0b3JzICptdXN0KiBiZQorCSAqIGdvb2Q7IGlmIG5vdCwgYWJvcnQuCisJICovCisJbXVzdF9iZV9nb29kID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2sgKyAxICsgZnMtPmRlc2NfYmxvY2tzOworCWZvciAoaSA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOyBpIDw9IG11c3RfYmVfZ29vZDsgaSsrKSB7CisJCWlmIChleHQyZnNfYmFkYmxvY2tzX2xpc3RfdGVzdChiYl9saXN0LCBpKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJIkJsb2NrICVkIGluIHByaW1hcnkgc3VwZXJibG9jay9ncm91cCBkZXNjcmlwdG9yIGFyZWEgYmFkXG4iCisJCQkJIkJsb2NrcyAlZCB0aHJvdWdoICVkIG11c3QgYmUgZ29vZCBpbiBvcmRlciB0byBidWlsZCBhIGZpbGVzeXN0ZW1cbiIKKwkJCQkiQWJvcnRpbmcgLi4uIiwgaSwgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2ssIG11c3RfYmVfZ29vZCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNlZSBpZiBhbnkgb2YgdGhlIGJhZCBibG9ja3MgYXJlIHNob3dpbmcgdXAgaW4gdGhlIGJhY2t1cAorCSAqIHN1cGVyYmxvY2tzIGFuZC9vciBncm91cCBkZXNjcmlwdG9ycy4gIElmIHNvLCBpc3N1ZSBhCisJICogd2FybmluZyBhbmQgYWRqdXN0IHRoZSBibG9jayBjb3VudHMgYXBwcm9wcmlhdGVseS4KKwkgKi8KKwlncm91cF9ibG9jayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrICsKKwkJZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisKKwlmb3IgKGkgPSAxOyBpIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGkrKykgeworCQlncm91cF9iYWQgPSAwOworCQlmb3IgKGo9MDsgaiA8IGZzLT5kZXNjX2Jsb2NrcysxOyBqKyspIHsKKwkJCWlmIChleHQyZnNfYmFkYmxvY2tzX2xpc3RfdGVzdChiYl9saXN0LAorCQkJCQkJICAgICAgIGdyb3VwX2Jsb2NrICsgaikpIHsKKwkJCQlta2UyZnNfd2FybmluZ19tc2coIWdyb3VwX2JhZCwKKwkJCQkJInRoZSBiYWNrdXAgc3VwZXJibG9jay9ncm91cCBkZXNjcmlwdG9ycyBhdCBibG9jayAlZCBjb250YWluXG4iCisJCQkJCSJiYWQgYmxvY2tzXG4iLCBncm91cF9ibG9jayk7CisJCQkJZ3JvdXBfYmFkKys7CisJCQkJZ3JvdXAgPSBleHQyZnNfZ3JvdXBfb2ZfYmxrKGZzLCBncm91cF9ibG9jaytqKTsKKwkJCQlmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfZnJlZV9ibG9ja3NfY291bnQrKzsKKwkJCQlmcy0+c3VwZXItPnNfZnJlZV9ibG9ja3NfY291bnQrKzsKKwkJCX0KKwkJfQorCQlncm91cF9ibG9jayArPSBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKKwl9CisKKwkvKgorCSAqIE1hcmsgYWxsIHRoZSBiYWQgYmxvY2tzIGFzIHVzZWQuLi4KKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZV9iZWdpbihiYl9saXN0LCAmYmJfaXRlcik7CisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgIm1hcmsgYmFkIGJsb2NrcyBhcyB1c2VkIik7CisKKwl3aGlsZSAoZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGUoYmJfaXRlciwgJmJsaykpCisJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChmcy0+YmxvY2tfbWFwLCBibGspOworCWV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2VuZChiYl9pdGVyKTsKK30KKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYSBnZW5lcmFsaXplZCBwcm9ncmVzcyBtZXRlci4KKyAqLworc3RydWN0IHByb2dyZXNzX3N0cnVjdCB7CisJY2hhcgkJZm9ybWF0WzIwXTsKKwljaGFyCQliYWNrdXBbODBdOworCV9fdTMyCQltYXg7CisJaW50CQlza2lwX3Byb2dyZXNzOworfTsKKworc3RhdGljIHZvaWQgcHJvZ3Jlc3NfaW5pdChzdHJ1Y3QgcHJvZ3Jlc3Nfc3RydWN0ICpwcm9ncmVzcywKKwkJCSAgY29uc3QgY2hhciAqbGFiZWwsX191MzIgbWF4KQoreworCWludAlpOworCisJbWVtc2V0KHByb2dyZXNzLCAwLCBzaXplb2Yoc3RydWN0IHByb2dyZXNzX3N0cnVjdCkpOworCWlmIChxdWlldCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IGRpZ2l0cyB3ZSBuZWVkCisJICovCisJaSA9IGludF9sb2cxMChtYXgpOworCXNwcmludGYocHJvZ3Jlc3MtPmZvcm1hdCwgIiUlJWRkLyUlJWRsZCIsIGksIGkpOworCW1lbXNldChwcm9ncmVzcy0+YmFja3VwLCAnXGInLCBzaXplb2YocHJvZ3Jlc3MtPmJhY2t1cCktMSk7CisJcHJvZ3Jlc3MtPmJhY2t1cFtzaXplb2YocHJvZ3Jlc3MtPmJhY2t1cCktMV0gPSAwOworCWlmICgoMippKSsxIDwgKGludCkgc2l6ZW9mKHByb2dyZXNzLT5iYWNrdXApKQorCQlwcm9ncmVzcy0+YmFja3VwWygyKmkpKzFdID0gMDsKKwlwcm9ncmVzcy0+bWF4ID0gbWF4OworCisJcHJvZ3Jlc3MtPnNraXBfcHJvZ3Jlc3MgPSAwOworCWlmIChnZXRlbnYoIk1LRTJGU19TS0lQX1BST0dSRVNTIikpCisJCXByb2dyZXNzLT5za2lwX3Byb2dyZXNzKys7CisKKwlmcHV0cyhsYWJlbCwgc3Rkb3V0KTsKKwlmZmx1c2goc3Rkb3V0KTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3Jlc3NfdXBkYXRlKHN0cnVjdCBwcm9ncmVzc19zdHJ1Y3QgKnByb2dyZXNzLCBfX3UzMiB2YWwpCit7CisJaWYgKChwcm9ncmVzcy0+Zm9ybWF0WzBdID09IDApIHx8IHByb2dyZXNzLT5za2lwX3Byb2dyZXNzKQorCQlyZXR1cm47CisJcHJpbnRmKHByb2dyZXNzLT5mb3JtYXQsIHZhbCwgcHJvZ3Jlc3MtPm1heCk7CisJZnB1dHMocHJvZ3Jlc3MtPmJhY2t1cCwgc3Rkb3V0KTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3Jlc3NfY2xvc2Uoc3RydWN0IHByb2dyZXNzX3N0cnVjdCAqcHJvZ3Jlc3MpCit7CisJaWYgKHByb2dyZXNzLT5mb3JtYXRbMF0gPT0gMCkKKwkJcmV0dXJuOworCXByaW50ZigiJS0yOHNcbiIsICJkb25lIik7Cit9CisKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB3aGljaCB6ZXJvcyBvdXQgX251bV8gYmxvY2tzIHN0YXJ0aW5nIGF0IF9ibGtfLiAgSW4KKyAqIGNhc2Ugb2YgYW4gZXJyb3IsIHRoZSBkZXRhaWxzIG9mIHRoZSBlcnJvciBpcyByZXR1cm5lZCB2aWEgX3JldF9ibGtfCisgKiBhbmQgX3JldF9jb3VudF8gaWYgdGhleSBhcmUgbm9uLU5VTEwgcG9pbnRlcnMuICBSZXR1cm5zIDAgb24KKyAqIHN1Y2Nlc3MsIGFuZCBhbiBlcnJvciBjb2RlIG9uIGFuIGVycm9yLgorICoKKyAqIEFzIGEgc3BlY2lhbCBjYXNlLCBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgTlVMTCwgdGhlbiBpdCB3aWxsCisgKiBhdHRlbXB0IHRvIGZyZWUgdGhlIHN0YXRpYyB6ZXJvaXppbmcgYnVmZmVyLiAgKFRoaXMgaXMgdG8ga2VlcAorICogcHJvZ3JhbXMgdGhhdCBjaGVjayBmb3IgbWVtb3J5IGxlYWtzIGhhcHB5LikKKyAqLworc3RhdGljIGVycmNvZGVfdCB6ZXJvX2Jsb2NrcyhleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxrLCBpbnQgbnVtLAorCQkJICAgICBzdHJ1Y3QgcHJvZ3Jlc3Nfc3RydWN0ICpwcm9ncmVzcywKKwkJCSAgICAgYmxrX3QgKnJldF9ibGssIGludCAqcmV0X2NvdW50KQoreworCWludAkJaiwgY291bnQsIG5leHRfdXBkYXRlLCBuZXh0X3VwZGF0ZV9pbmNyOworCXN0YXRpYyBjaGFyCSpidWY7CisJZXJyY29kZV90CXJldHZhbDsKKworCS8qIElmIGZzIGlzIG51bGwsIGNsZWFuIHVwIHRoZSBzdGF0aWMgYnVmZmVyIGFuZCByZXR1cm4gKi8KKwlpZiAoIWZzKSB7CisJCWlmIChidWYpIHsKKwkJCWZyZWUoYnVmKTsKKwkJCWJ1ZiA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCS8qIEFsbG9jYXRlIHRoZSB6ZXJvaXppbmcgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworCWlmICghYnVmKSB7CisJCWJ1ZiA9IHh6YWxsb2MoZnMtPmJsb2Nrc2l6ZSAqIFNUUklERV9MRU5HVEgpOworCX0KKwkvKiBPSywgZG8gdGhlIHdyaXRlIGxvb3AgKi8KKwluZXh0X3VwZGF0ZSA9IDA7CisJbmV4dF91cGRhdGVfaW5jciA9IG51bSAvIDEwMDsKKwlpZiAobmV4dF91cGRhdGVfaW5jciA8IDEpCisJCW5leHRfdXBkYXRlX2luY3IgPSAxOworCWZvciAoaj0wOyBqIDwgbnVtOyBqICs9IFNUUklERV9MRU5HVEgsIGJsayArPSBTVFJJREVfTEVOR1RIKSB7CisJCWNvdW50ID0gbnVtIC0gajsKKwkJaWYgKGNvdW50ID4gU1RSSURFX0xFTkdUSCkKKwkJCWNvdW50ID0gU1RSSURFX0xFTkdUSDsKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibGssIGNvdW50LCBidWYpOworCQlpZiAocmV0dmFsKSB7CisJCQlpZiAocmV0X2NvdW50KQorCQkJCSpyZXRfY291bnQgPSBjb3VudDsKKwkJCWlmIChyZXRfYmxrKQorCQkJCSpyZXRfYmxrID0gYmxrOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlpZiAocHJvZ3Jlc3MgJiYgaiA+IG5leHRfdXBkYXRlKSB7CisJCQluZXh0X3VwZGF0ZSArPSBudW0gLyAxMDA7CisJCQlwcm9ncmVzc191cGRhdGUocHJvZ3Jlc3MsIGJsayk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2lub2RlX3RhYmxlcyhleHQyX2ZpbHN5cyBmcykKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWJsa190CQlibGs7CisJZGdycF90CQlpOworCWludAkJbnVtOworCXN0cnVjdCBwcm9ncmVzc19zdHJ1Y3QgcHJvZ3Jlc3M7CisKKwlpZiAocXVpZXQpCisJCW1lbXNldCgmcHJvZ3Jlc3MsIDAsIHNpemVvZihwcm9ncmVzcykpOworCWVsc2UKKwkJcHJvZ3Jlc3NfaW5pdCgmcHJvZ3Jlc3MsICJXcml0aW5nIGlub2RlIHRhYmxlczogIiwKKwkJCSAgICAgIGZzLT5ncm91cF9kZXNjX2NvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCXByb2dyZXNzX3VwZGF0ZSgmcHJvZ3Jlc3MsIGkpOworCisJCWJsayA9IGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX3RhYmxlOworCQludW0gPSBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cDsKKworCQlyZXR2YWwgPSB6ZXJvX2Jsb2NrcyhmcywgYmxrLCBudW0sIDAsICZibGssICZudW0pOworCQlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLAorCQkJIndyaXRlICVkIGJsb2NrcyBpbiBpbm9kZSB0YWJsZSBzdGFydGluZyBhdCAlZC4iLAorCQkJbnVtLCBibGspOworCQlpZiAoc3luY19rbHVkZ2UpIHsKKwkJCWlmIChzeW5jX2tsdWRnZSA9PSAxKQorCQkJCXN5bmMoKTsKKwkJCWVsc2UgaWYgKChpICUgc3luY19rbHVkZ2UpID09IDApCisJCQkJc3luYygpOworCQl9CisJfQorCXplcm9fYmxvY2tzKDAsIDAsIDAsIDAsIDAsIDApOworCXByb2dyZXNzX2Nsb3NlKCZwcm9ncmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9yb290X2RpcihleHQyX2ZpbHN5cyBmcykKK3sKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQlpbm9kZTsKKworCXJldHZhbCA9IGV4dDJmc19ta2RpcihmcywgRVhUMl9ST09UX0lOTywgRVhUMl9ST09UX0lOTywgMCk7CisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgImNyZWF0ZSByb290IGRpciIpOworCWlmIChnZXRldWlkKCkpIHsKKwkJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIEVYVDJfUk9PVF9JTk8sICZpbm9kZSk7CisJCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJyZWFkIHJvb3QgaW5vZGUiKTsKKwkJaW5vZGUuaV91aWQgPSBnZXR1aWQoKTsKKwkJaWYgKGlub2RlLmlfdWlkKQorCQkJaW5vZGUuaV9naWQgPSBnZXRnaWQoKTsKKwkJcmV0dmFsID0gZXh0MmZzX3dyaXRlX25ld19pbm9kZShmcywgRVhUMl9ST09UX0lOTywgJmlub2RlKTsKKwkJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgInNldCByb290IGlub2RlIG93bmVyc2hpcCIpOworCX0KK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2xvc3RfYW5kX2ZvdW5kKGV4dDJfZmlsc3lzIGZzKQoreworCWVycmNvZGVfdAkJcmV0dmFsOworCWV4dDJfaW5vX3QJCWlubzsKKwljb25zdCBjaGFyCQkqbmFtZSA9ICJsb3N0K2ZvdW5kIjsKKwlpbnQJCQlpID0gMTsKKwljaGFyCQkJKm1zZyA9ICJjcmVhdGUiOworCWludAkJCWxwZl9zaXplID0gMDsKKworCWZzLT51bWFzayA9IDA3NzsKKwlyZXR2YWwgPSBleHQyZnNfbWtkaXIoZnMsIEVYVDJfUk9PVF9JTk8sIDAsIG5hbWUpOworCWlmIChyZXR2YWwpIHsKKwkJZ290byBDUkVBVEVfTE9TVF9BTkRfRk9VTkRfRVJST1I7CisJfQorCisJcmV0dmFsID0gZXh0MmZzX2xvb2t1cChmcywgRVhUMl9ST09UX0lOTywgbmFtZSwgc3RybGVuKG5hbWUpLCAwLCAmaW5vKTsKKwlpZiAocmV0dmFsKSB7CisJCW1zZyA9ICJsb29rdXAiOworCQlnb3RvIENSRUFURV9MT1NUX0FORF9GT1VORF9FUlJPUjsKKwl9CisKKwlmb3IgKDsgaSA8IEVYVDJfTkRJUl9CTE9DS1M7IGkrKykgeworCQlpZiAoKGxwZl9zaXplICs9IGZzLT5ibG9ja3NpemUpID49IDE2KjEwMjQpCisJCQlicmVhazsKKwkJcmV0dmFsID0gZXh0MmZzX2V4cGFuZF9kaXIoZnMsIGlubyk7CisJCW1zZyA9ICJleHBhbmQiOworQ1JFQVRFX0xPU1RfQU5EX0ZPVU5EX0VSUk9SOgorCQlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCAiJXMgJXMiLCBtc2csIG5hbWUpOworCX0KK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2JhZF9ibG9ja19pbm9kZShleHQyX2ZpbHN5cyBmcywgYmFkYmxvY2tzX2xpc3QgYmJfbGlzdCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGZzLT5pbm9kZV9tYXAsIEVYVDJfQkFEX0lOTyk7CisJZnMtPmdyb3VwX2Rlc2NbMF0uYmdfZnJlZV9pbm9kZXNfY291bnQtLTsKKwlmcy0+c3VwZXItPnNfZnJlZV9pbm9kZXNfY291bnQtLTsKKwlyZXR2YWwgPSBleHQyZnNfdXBkYXRlX2JiX2lub2RlKGZzLCBiYl9saXN0KTsKKwlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCAic2V0IGJhZCBibG9jayBpbm9kZSIpOworfQorCitzdGF0aWMgdm9pZCByZXNlcnZlX2lub2RlcyhleHQyX2ZpbHN5cyBmcykKK3sKKwlleHQyX2lub190CWk7CisJaW50CQlncm91cDsKKworCWZvciAoaSA9IEVYVDJfUk9PVF9JTk8gKyAxOyBpIDwgRVhUMl9GSVJTVF9JTk9ERShmcy0+c3VwZXIpOyBpKyspIHsKKwkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGZzLT5pbm9kZV9tYXAsIGkpOworCQlncm91cCA9IGV4dDJmc19ncm91cF9vZl9pbm8oZnMsIGkpOworCQlmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfZnJlZV9pbm9kZXNfY291bnQtLTsKKwkJZnMtPnN1cGVyLT5zX2ZyZWVfaW5vZGVzX2NvdW50LS07CisJfQorCWV4dDJmc19tYXJrX2liX2RpcnR5KGZzKTsKK30KKworI2RlZmluZSBCU0RfRElTS01BR0lDICAgKDB4ODI1NjQ1NTdVTCkgIC8qIFRoZSBkaXNrIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCU0RfTUFHSUNESVNLICAgKDB4NTc0NTU2ODJVTCkgIC8qIFRoZSBkaXNrIG1hZ2ljIG51bWJlciByZXZlcnNlZCAqLworI2RlZmluZSBCU0RfTEFCRUxfT0ZGU0VUICAgICAgICA2NAorCitzdGF0aWMgdm9pZCB6YXBfc2VjdG9yKGV4dDJfZmlsc3lzIGZzLCBpbnQgc2VjdCwgaW50IG5zZWN0KQoreworCWNoYXIgKmJ1ZjsKKwljaGFyICpmbXQgPSAiY291bGQgbm90ICVzICVkIjsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGludCAqbWFnaWM7CisKKwlidWYgPSB4bWFsbG9jKDUxMipuc2VjdCk7CisKKwlpZiAoc2VjdCA9PSAwKSB7CisJCS8qIENoZWNrIGZvciBhIEJTRCBkaXNrbGFiZWwsIGFuZCBkb24ndCBlcmFzZSBpdCBpZiBzbyAqLworCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgMCwgLTUxMiwgYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCW1rZTJmc193YXJuaW5nX21zZyhyZXR2YWwsIGZtdCwgInJlYWQgYmxvY2siLCAwKTsKKwkJZWxzZSB7CisJCQltYWdpYyA9ICh1bnNpZ25lZCBpbnQgKikgKGJ1ZiArIEJTRF9MQUJFTF9PRkZTRVQpOworCQkJaWYgKCgqbWFnaWMgPT0gQlNEX0RJU0tNQUdJQykgfHwKKwkJCSAgICAoKm1hZ2ljID09IEJTRF9NQUdJQ0RJU0spKQorCQkJCXJldHVybjsKKwkJfQorCX0KKworCW1lbXNldChidWYsIDAsIDUxMipuc2VjdCk7CisJaW9fY2hhbm5lbF9zZXRfYmxrc2l6ZShmcy0+aW8sIDUxMik7CisJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBzZWN0LCAtNTEyKm5zZWN0LCBidWYpOworCWlvX2NoYW5uZWxfc2V0X2Jsa3NpemUoZnMtPmlvLCBmcy0+YmxvY2tzaXplKTsKKwlmcmVlKGJ1Zik7CisJbWtlMmZzX3dhcm5pbmdfbXNnKHJldHZhbCwgZm10LCAiZXJhc2Ugc2VjdG9yIiwgc2VjdCk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9qb3VybmFsX2RldihleHQyX2ZpbHN5cyBmcykKK3sKKwlzdHJ1Y3QgcHJvZ3Jlc3Nfc3RydWN0CXByb2dyZXNzOworCWVycmNvZGVfdAkJcmV0dmFsOworCWNoYXIJCQkqYnVmOworCWNoYXIJCQkqZm10ID0gIiVzIGpvdXJuYWwgc3VwZXJibG9jayI7CisJYmxrX3QJCQlibGs7CisJaW50CQkJY291bnQ7CisKKwlyZXR2YWwgPSBleHQyZnNfY3JlYXRlX2pvdXJuYWxfc3VwZXJibG9jayhmcywKKwkJCQkgIGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQsIDAsICZidWYpOworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsIGZtdCwgImluaXQiKTsKKwlpZiAocXVpZXQpCisJCW1lbXNldCgmcHJvZ3Jlc3MsIDAsIHNpemVvZihwcm9ncmVzcykpOworCWVsc2UKKwkJcHJvZ3Jlc3NfaW5pdCgmcHJvZ3Jlc3MsICJaZXJvaW5nIGpvdXJuYWwgZGV2aWNlOiAiLAorCQkJICAgICAgZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCk7CisKKwlyZXR2YWwgPSB6ZXJvX2Jsb2NrcyhmcywgMCwgZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCwKKwkJCSAgICAgJnByb2dyZXNzLCAmYmxrLCAmY291bnQpOworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJ6ZXJvIGpvdXJuYWwgZGV2aWNlIChibG9jayAldSwgY291bnQgJWQpIiwKKwkJCWJsaywgY291bnQpOworCXplcm9fYmxvY2tzKDAsIDAsIDAsIDAsIDAsIDApOworCisJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLAorCQkJCSAgICAgIGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKzEsCisJCQkJICAgICAgMSwgYnVmKTsKKwlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCBmbXQsICJ3cml0ZSIpOworCXByb2dyZXNzX2Nsb3NlKCZwcm9ncmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHMoZXh0Ml9maWxzeXMgZnMpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnMgPSBmcy0+c3VwZXI7CisJY2hhcgkJCSpvczsKKwlibGtfdAkJCWdyb3VwX2Jsb2NrOworCWRncnBfdAkJCWk7CisJaW50CQkJbmVlZCwgY29sX2xlZnQ7CisKKwlta2UyZnNfd2FybmluZ19tc2coKHBhcmFtLnNfYmxvY2tzX2NvdW50ICE9IHMtPnNfYmxvY2tzX2NvdW50KSwKKwkJIiVkIGJsb2NrcyB1bnVzZWRcbiIsIHBhcmFtLnNfYmxvY2tzX2NvdW50IC0gcy0+c19ibG9ja3NfY291bnQpOworCW9zID0gZTJwX29zMnN0cmluZyhmcy0+c3VwZXItPnNfY3JlYXRvcl9vcyk7CisJcHJpbnRmKAkiRmlsZXN5c3RlbSBsYWJlbD0lLipzXG4iCisJCQkiT1MgdHlwZTogJXNcbiIKKwkJCSJCbG9jayBzaXplPSV1IChsb2c9JXUpXG4iCisJCQkiRnJhZ21lbnQgc2l6ZT0ldSAobG9nPSV1KVxuIgorCQkJIiV1IGlub2RlcywgJXUgYmxvY2tzXG4iCisJCQkiJXUgYmxvY2tzICglMi4yZiUlKSByZXNlcnZlZCBmb3IgdGhlIHN1cGVyIHVzZXJcbiIKKwkJCSJGaXJzdCBkYXRhIGJsb2NrPSV1XG4iLAorCQkJKGludCkgc2l6ZW9mKHMtPnNfdm9sdW1lX25hbWUpLAorCQkJcy0+c192b2x1bWVfbmFtZSwKKwkJCW9zLAorCQkJZnMtPmJsb2Nrc2l6ZSwgcy0+c19sb2dfYmxvY2tfc2l6ZSwKKwkJCWZzLT5mcmFnc2l6ZSwgcy0+c19sb2dfZnJhZ19zaXplLAorCQkJcy0+c19pbm9kZXNfY291bnQsIHMtPnNfYmxvY2tzX2NvdW50LAorCQkJcy0+c19yX2Jsb2Nrc19jb3VudCwgMTAwLjAgKiBzLT5zX3JfYmxvY2tzX2NvdW50IC8gcy0+c19ibG9ja3NfY291bnQsCisJCQlzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWZyZWUob3MpOworCWlmIChzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpIHsKKwkJcHJpbnRmKCJNYXhpbXVtIGZpbGVzeXN0ZW0gYmxvY2tzPSVsdVxuIiwKKwkJICAgICAgIChzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MgKyBmcy0+ZGVzY19ibG9ja3MpICoKKwkJICAgICAgIChmcy0+YmxvY2tzaXplIC8gc2l6ZW9mKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpKSAqCisJCSAgICAgICBzLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOworCX0KKwlwcmludGYoCSIldSBibG9jayBncm91cCVzXG4iCisJCQkiJXUgYmxvY2tzIHBlciBncm91cCwgJXUgZnJhZ21lbnRzIHBlciBncm91cFxuIgorCQkJIiV1IGlub2RlcyBwZXIgZ3JvdXBcbiIsCisJCQlmcy0+Z3JvdXBfZGVzY19jb3VudCwgKGZzLT5ncm91cF9kZXNjX2NvdW50ID4gMSkgPyAicyIgOiAiIiwKKwkJCXMtPnNfYmxvY2tzX3Blcl9ncm91cCwgcy0+c19mcmFnc19wZXJfZ3JvdXAsCisJCQlzLT5zX2lub2Rlc19wZXJfZ3JvdXApOworCWlmIChmcy0+Z3JvdXBfZGVzY19jb3VudCA9PSAxKSB7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIlN1cGVyYmxvY2sgYmFja3VwcyBzdG9yZWQgb24gYmxvY2tzOiAiKTsKKwlncm91cF9ibG9jayA9IHMtPnNfZmlyc3RfZGF0YV9ibG9jazsKKwljb2xfbGVmdCA9IDA7CisJZm9yIChpID0gMTsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJZ3JvdXBfYmxvY2sgKz0gcy0+c19ibG9ja3NfcGVyX2dyb3VwOworCQlpZiAoIWV4dDJmc19iZ19oYXNfc3VwZXIoZnMsIGkpKQorCQkJY29udGludWU7CisJCWlmIChpICE9IDEpCisJCQlwcmludGYoIiwgIik7CisJCW5lZWQgPSBpbnRfbG9nMTAoZ3JvdXBfYmxvY2spICsgMjsKKwkJaWYgKG5lZWQgPiBjb2xfbGVmdCkgeworCQkJcHJpbnRmKCJcblx0Iik7CisJCQljb2xfbGVmdCA9IDcyOworCQl9CisJCWNvbF9sZWZ0IC09IG5lZWQ7CisJCXByaW50ZigiJXUiLCBncm91cF9ibG9jayk7CisJfQorCXB1dHMoIlxuIik7Cit9CisKKy8qCisgKiBTZXQgdGhlIFNfQ1JFQVRPUl9PUyBmaWVsZC4gIFJldHVybiB0cnVlIGlmIE9TIGlzIGtub3duLAorICogb3RoZXJ3aXNlLCAwLgorICovCitzdGF0aWMgaW50IHNldF9vcyhzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IsIGNoYXIgKm9zKQoreworCWlmIChpc2RpZ2l0ICgqb3MpKSB7CisJCXNiLT5zX2NyZWF0b3Jfb3MgPSBhdG9pKG9zKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKChzYi0+c19jcmVhdG9yX29zID0gZTJwX3N0cmluZzJvcyhvcykpID49IDApIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmICghc3RyY2FzZWNtcCgiR05VIiwgb3MpKSB7CisJCXNiLT5zX2NyZWF0b3Jfb3MgPSBFWFQyX09TX0hVUkQ7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfZXh0ZW5kZWRfb3B0cyhzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2JfcGFyYW0sCisJCQkJY29uc3QgY2hhciAqb3B0cykKK3sKKwljaGFyCSpidWYsICp0b2tlbiwgKm5leHQsICpwLCAqYXJnOworCWludAlyX3VzYWdlID0gMDsKKworCWJ1ZiA9IHhzdHJkdXAob3B0cyk7CisJZm9yICh0b2tlbiA9IGJ1ZjsgdG9rZW4gJiYgKnRva2VuOyB0b2tlbiA9IG5leHQpIHsKKwkJcCA9IHN0cmNocih0b2tlbiwgJywnKTsKKwkJbmV4dCA9IDA7CisJCWlmIChwKSB7CisJCQkqcCA9IDA7CisJCQluZXh0ID0gcCsxOworCQl9CisJCWFyZyA9IHN0cmNocih0b2tlbiwgJz0nKTsKKwkJaWYgKGFyZykgeworCQkJKmFyZyA9IDA7CisJCQlhcmcrKzsKKwkJfQorCQlpZiAoc3RyY21wKHRva2VuLCAic3RyaWRlIikgPT0gMCkgeworCQkJaWYgKCFhcmcpIHsKKwkJCQlyX3VzYWdlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmc19zdHJpZGUgPSBzdHJ0b3VsKGFyZywgJnAsIDApOworCQkJaWYgKCpwIHx8IChmc19zdHJpZGUgPT0gMCkpIHsKKwkJCQliYl9lcnJvcl9tc2coIkludmFsaWQgc3RyaWRlIHBhcmFtZXRlcjogJXMiLCBhcmcpOworCQkJCXJfdXNhZ2UrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKHRva2VuLCAicmVzaXplIikpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcmVzaXplLCBicGcsIHJzdl9ncm91cHM7CisJCQl1bnNpZ25lZCBsb25nIGdyb3VwX2Rlc2NfY291bnQsIGRlc2NfYmxvY2tzOworCQkJdW5zaWduZWQgaW50IGdkcGIsIGJsb2Nrc2l6ZTsKKwkJCWludCByc3ZfZ2RiOworCisJCQlpZiAoIWFyZykgeworCQkJCXJfdXNhZ2UrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcmVzaXplID0gcGFyc2VfbnVtX2Jsb2NrcyhhcmcsCisJCQkJCQkgIHNiX3BhcmFtLT5zX2xvZ19ibG9ja19zaXplKTsKKworCQkJaWYgKHJlc2l6ZSA9PSAwKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJJbnZhbGlkIHJlc2l6ZSBwYXJhbWV0ZXI6ICVzIiwgYXJnKTsKKwkJCQlyX3VzYWdlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocmVzaXplIDw9IHNiX3BhcmFtLT5zX2Jsb2Nrc19jb3VudCkgeworCQkJCWJiX2Vycm9yX21zZygiVGhlIHJlc2l6ZSBtYXhpbXVtIG11c3QgYmUgZ3JlYXRlciAiCisJCQkJCQkidGhhbiB0aGUgZmlsZXN5c3RlbSBzaXplIik7CisJCQkJcl91c2FnZSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlibG9ja3NpemUgPSBFWFQyX0JMT0NLX1NJWkUoc2JfcGFyYW0pOworCQkJYnBnID0gc2JfcGFyYW0tPnNfYmxvY2tzX3Blcl9ncm91cDsKKwkJCWlmICghYnBnKQorCQkJCWJwZyA9IGJsb2Nrc2l6ZSAqIDg7CisJCQlnZHBiID0gYmxvY2tzaXplIC8gc2l6ZW9mKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpOworCQkJZ3JvdXBfZGVzY19jb3VudCA9IChzYl9wYXJhbS0+c19ibG9ja3NfY291bnQgKworCQkJCQkgICAgYnBnIC0gMSkgLyBicGc7CisJCQlkZXNjX2Jsb2NrcyA9IChncm91cF9kZXNjX2NvdW50ICsKKwkJCQkgICAgICAgZ2RwYiAtIDEpIC8gZ2RwYjsKKwkJCXJzdl9ncm91cHMgPSAocmVzaXplICsgYnBnIC0gMSkgLyBicGc7CisJCQlyc3ZfZ2RiID0gKHJzdl9ncm91cHMgKyBnZHBiIC0gMSkgLyBnZHBiIC0KKwkJCQlkZXNjX2Jsb2NrczsKKwkJCWlmIChyc3ZfZ2RiID4gRVhUMl9BRERSX1BFUl9CTE9DSyhzYl9wYXJhbSkpCisJCQkJcnN2X2dkYiA9IEVYVDJfQUREUl9QRVJfQkxPQ0soc2JfcGFyYW0pOworCisJCQlpZiAocnN2X2dkYiA+IDApIHsKKwkJCQlzYl9wYXJhbS0+c19mZWF0dXJlX2NvbXBhdCB8PQorCQkJCQlFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERTsKKworCQkJCXNiX3BhcmFtLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MgPSByc3ZfZ2RiOworCQkJfQorCQl9IGVsc2UKKwkJCXJfdXNhZ2UrKzsKKwl9CisJaWYgKHJfdXNhZ2UpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkiXG5CYWQgb3B0aW9ucyBzcGVjaWZpZWQuXG5cbiIKKwkJCSJFeHRlbmRlZCBvcHRpb25zIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLCAiCisJCQkiYW5kIG1heSB0YWtlIGFuIGFyZ3VtZW50IHdoaWNoXG4iCisJCQkiXHRpcyBzZXQgb2ZmIGJ5IGFuIGVxdWFscyAoJz0nKSBzaWduLlxuXG4iCisJCQkiVmFsaWQgZXh0ZW5kZWQgb3B0aW9ucyBhcmU6XG4iCisJCQkiXHRzdHJpZGU9PHN0cmlkZSBsZW5ndGggaW4gYmxvY2tzPlxuIgorCQkJIlx0cmVzaXplPTxyZXNpemUgbWF4aW11bSBzaXplIGluIGJsb2Nrcz5cbiIpOworCX0KK30KKworc3RhdGljIF9fdTMyIG9rX2ZlYXR1cmVzWzNdID0geworCUVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgfAorCQlFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERSB8CisJCUVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYLCAgLyogQ29tcGF0ICovCisJRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFfCAgICAgICAgIC8qIEluY29tcGF0ICovCisJCUVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVnwKKwkJRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcsCisJRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIgICAgIC8qIFIvTyBjb21wYXQgKi8KK307CisKK3N0YXRpYyBpbnQgUFJTKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQJCWM7CisJaW50CQlzaXplOworCWNoYXIgKgkJdG1wOworCWludAkJYmxvY2tzaXplID0gMDsKKwlpbnQJCWlub2RlX3JhdGlvID0gMDsKKwlpbnQJCWlub2RlX3NpemUgPSAwOworCWludAkJcmVzZXJ2ZWRfcmF0aW8gPSA1OworCWludAkJc2VjdG9yX3NpemUgPSAwOworCWludAkJc2hvd192ZXJzaW9uX29ubHkgPSAwOworCWV4dDJfaW5vX3QJbnVtX2lub2RlcyA9IDA7CisJZXJyY29kZV90CXJldHZhbDsKKwljaGFyICoJCWV4dGVuZGVkX29wdHMgPSBOVUxMOworCWNvbnN0IGNoYXIgKglmc190eXBlID0gTlVMTDsKKwlibGtfdAkJZGV2X3NpemU7CisJbG9uZwkJc3lzdmFsOworCisJLyogVXBkYXRlIG91ciBQQVRIIHRvIGluY2x1ZGUgL3NiaW4gICovCisJZTJmc19zZXRfc2Jpbl9wYXRoKCk7CisKKwl0bXAgPSBnZXRlbnYoIk1LRTJGU19TWU5DIik7CisJaWYgKHRtcCkKKwkJc3luY19rbHVkZ2UgPSBhdG9pKHRtcCk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIHN5c3RlbSBwYWdlIHNpemUgaWYgcG9zc2libGUgKi8KKyNpZiAoIWRlZmluZWQoX1NDX1BBR0VTSVpFKSAmJiBkZWZpbmVkKF9TQ19QQUdFX1NJWkUpKQorI2RlZmluZSBfU0NfUEFHRVNJWkUgX1NDX1BBR0VfU0laRQorI2VuZGlmCisjaWZkZWYgX1NDX1BBR0VTSVpFCisJc3lzdmFsID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworCWlmIChzeXN2YWwgPiAwKQorCQlzeXNfcGFnZV9zaXplID0gc3lzdmFsOworI2VuZGlmIC8qIF9TQ19QQUdFU0laRSAqLworCisJc2V0YnVmKHN0ZG91dCwgTlVMTCk7CisJc2V0YnVmKHN0ZGVyciwgTlVMTCk7CisJbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrKSk7CisJcGFyYW0uc19yZXZfbGV2ZWwgPSAxOyAgLyogQ3JlYXRlIHJldmlzaW9uIDEgZmlsZXN5c3RlbXMgbm93ICovCisJcGFyYW0uc19mZWF0dXJlX2luY29tcGF0IHw9IEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRTsKKwlwYXJhbS5zX2ZlYXR1cmVfcm9fY29tcGF0IHw9IEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSOworCisjaWZkZWYgX19saW51eF9fCisJbGludXhfdmVyc2lvbl9jb2RlID0gZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpOworCWlmIChsaW51eF92ZXJzaW9uX2NvZGUgJiYgbGludXhfdmVyc2lvbl9jb2RlIDwgS0VSTkVMX1ZFUlNJT04oMiwyLDApKSB7CisJCXBhcmFtLnNfcmV2X2xldmVsID0gMDsKKwkJcGFyYW0uc19mZWF0dXJlX2luY29tcGF0ID0gMDsKKwkJcGFyYW0uc19mZWF0dXJlX2NvbXBhdCA9IDA7CisJCXBhcmFtLnNfZmVhdHVyZV9yb19jb21wYXQgPSAwOworCX0KKyNlbmRpZgorCisJLyogSWYgY2FsbGVkIGFzIG1rZnMuZXh0MywgY3JlYXRlIGEgam91cm5hbCBpbm9kZSAqLworCWlmIChsYXN0X2NoYXJfaXMoYXBwbGV0X25hbWUsICczJykpCisJCWpvdXJuYWxfc2l6ZSA9IC0xOworCisJd2hpbGUgKChjID0gZ2V0b3B0IChhcmdjLCBhcmd2LAorCQkgICAgImI6Y0U6ZjpnOmk6amw6bTpubzpxcjpSOnM6dHZJOko6U1Q6Rkw6TTpOOk86ViIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2InOgorCQkJYmxvY2tzaXplID0geGF0b3VfcmFuZ2Uob3B0YXJnLCBFWFQyX01JTl9CTE9DS19TSVpFLCBFWFQyX01BWF9CTE9DS19TSVpFKTsKKwkJCW1rZTJmc193YXJuaW5nX21zZygoYmxvY2tzaXplID4gNDA5NiksCisJCQkJImJsb2Nrc2l6ZSAlZCBub3QgdXNhYmxlIG9uIG1vc3Qgc3lzdGVtcyIsCisJCQkJYmxvY2tzaXplKTsKKwkJCXBhcmFtLnNfbG9nX2Jsb2NrX3NpemUgPQorCQkJCWludF9sb2cyKGJsb2Nrc2l6ZSA+PiBFWFQyX01JTl9CTE9DS19MT0dfU0laRSk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CS8qIENoZWNrIGZvciBiYWQgYmxvY2tzICovCisJCWNhc2UgJ3QnOgkvKiBkZXByZWNhdGVkICovCisJCQljZmxhZysrOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJc2l6ZSA9IHhhdG91X3JhbmdlKG9wdGFyZywgRVhUMl9NSU5fQkxPQ0tfU0laRSwgRVhUMl9NQVhfQkxPQ0tfU0laRSk7CisJCQlwYXJhbS5zX2xvZ19mcmFnX3NpemUgPQorCQkJCWludF9sb2cyKHNpemUgPj4gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpOworCQkJbWtlMmZzX3dhcm5pbmdfbXNnKDEsICJmcmFnbWVudHMgbm90IHN1cHBvcnRlZC4gSWdub3JpbmcgLWYgb3B0aW9uIik7CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisJCQlwYXJhbS5zX2Jsb2Nrc19wZXJfZ3JvdXAgPSB4YXRvdTMyKG9wdGFyZyk7CisJCQlpZiAoKHBhcmFtLnNfYmxvY2tzX3Blcl9ncm91cCAlIDgpICE9IDApIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmxvY2tzIHBlciBncm91cCBtdXN0IGJlIG11bHRpcGxlIG9mIDgiKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCS8qIEh1aD8gaXMgIiogMTAyNCIgY29ycmVjdD8gKi8KKwkJCWlub2RlX3JhdGlvID0geGF0b3VfcmFuZ2Uob3B0YXJnLCBFWFQyX01JTl9CTE9DS19TSVpFLCBFWFQyX01BWF9CTE9DS19TSVpFICogMTAyNCk7CisJCQlicmVhazsKKwkJY2FzZSAnSic6CisJCQlwYXJzZV9qb3VybmFsX29wdHMoJmpvdXJuYWxfZGV2aWNlLCAmam91cm5hbF9mbGFncywgJmpvdXJuYWxfc2l6ZSwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdqJzoKKwkJCXBhcmFtLnNfZmVhdHVyZV9jb21wYXQgfD0KKwkJCQlFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMOworCQkJaWYgKCFqb3VybmFsX3NpemUpCisJCQkJam91cm5hbF9zaXplID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQliYWRfYmxvY2tzX2ZpbGVuYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJcmVzZXJ2ZWRfcmF0aW8gPSB4YXRvdV9yYW5nZShvcHRhcmcsIDAsIDUwKTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5vYWN0aW9uKys7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQljcmVhdG9yX29zID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcGFyYW0uc19yZXZfbGV2ZWwgPSB4YXRvaV9wb3NpdGl2ZShvcHRhcmcpOworCQkJaWYgKHBhcmFtLnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSB7CisJCQkJcGFyYW0uc19mZWF0dXJlX2luY29tcGF0ID0gMDsKKwkJCQlwYXJhbS5zX2ZlYXR1cmVfY29tcGF0ID0gMDsKKwkJCQlwYXJhbS5zX2ZlYXR1cmVfcm9fY29tcGF0ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdzJzoJLyogZGVwcmVjYXRlZCAqLworCQkJaWYgKHhhdG91KG9wdGFyZykpCisJCQkJcGFyYW0uc19mZWF0dXJlX3JvX2NvbXBhdCB8PQorCQkJCQlFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUjsKKwkJCWVsc2UKKwkJCQlwYXJhbS5zX2ZlYXR1cmVfcm9fY29tcGF0ICY9CisJCQkJCX5FWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUjsKKwkJCWJyZWFrOworI2lmZGVmIEVYVDJfRFlOQU1JQ19SRVYKKwkJY2FzZSAnSSc6CisJCQlpbm9kZV9zaXplID0geGF0b2lfcG9zaXRpdmUob3B0YXJnKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgJ04nOgorCQkJbnVtX2lub2RlcyA9IHhhdG9pX3Bvc2l0aXZlKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlxdWlldCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlxdWlldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnRic6CisJCQlmb3JjZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnTCc6CisJCQl2b2x1bWVfbGFiZWwgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQltb3VudF9kaXIgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnTyc6CisJCQlpZiAoIXN0cmNtcChvcHRhcmcsICJub25lIikpIHsKKwkJCQlwYXJhbS5zX2ZlYXR1cmVfY29tcGF0ID0gMDsKKwkJCQlwYXJhbS5zX2ZlYXR1cmVfaW5jb21wYXQgPSAwOworCQkJCXBhcmFtLnNfZmVhdHVyZV9yb19jb21wYXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGUycF9lZGl0X2ZlYXR1cmUob3B0YXJnLAorCQkJCQkgICAgJnBhcmFtLnNfZmVhdHVyZV9jb21wYXQsCisJCQkJCSAgICBva19mZWF0dXJlcykpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiSW52YWxpZCBmaWxlc3lzdGVtIG9wdGlvbiBzZXQ6ICVzIiwgb3B0YXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdFJzoKKwkJY2FzZSAnUic6CisJCQlleHRlbmRlZF9vcHRzID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJc3VwZXJfb25seSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlmc190eXBlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJLyogUHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQgKi8KKwkJCXNob3dfdmVyc2lvbl9vbmx5ID0gMTsKKwkJCXF1aWV0ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCWlmICgob3B0aW5kID09IGFyZ2MpIC8qJiYgIXNob3dfdmVyc2lvbl9vbmx5Ki8pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlkZXZpY2VfbmFtZSA9IGFyZ3Zbb3B0aW5kKytdOworCisJbWtlMmZzX3ZlcmJvc2UoIm1rZTJmcyAlcyAoJXMpXG4iLCBFMkZTUFJPR1NfVkVSU0lPTiwgRTJGU1BST0dTX0RBVEUpOworCisJaWYgKHNob3dfdmVyc2lvbl9vbmx5KSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgdGhlcmUncyBubyBibG9ja3NpemUgc3BlY2lmaWVkIGFuZCB0aGVyZSBpcyBhIGpvdXJuYWwKKwkgKiBkZXZpY2UsIHVzZSBpdCB0byBmaWd1cmUgb3V0IHRoZSBibG9ja3NpemUKKwkgKi8KKwlpZiAoYmxvY2tzaXplIDw9IDAgJiYgam91cm5hbF9kZXZpY2UpIHsKKwkJZXh0Ml9maWxzeXMgICAgIGpmczsKKwkJaW9fbWFuYWdlciAgICAgIGlvX3B0cjsKKworI2lmZGVmIENPTkZJR19URVNUSU9fREVCVUcKKwkJaW9fcHRyID0gdGVzdF9pb19tYW5hZ2VyOworCQl0ZXN0X2lvX2JhY2tpbmdfbWFuYWdlciA9IHVuaXhfaW9fbWFuYWdlcjsKKyNlbHNlCisJCWlvX3B0ciA9IHVuaXhfaW9fbWFuYWdlcjsKKyNlbmRpZgorCQlyZXR2YWwgPSBleHQyZnNfb3Blbihqb3VybmFsX2RldmljZSwKKwkJCQkgICAgIEVYVDJfRkxBR19KT1VSTkFMX0RFVl9PSywgMCwKKwkJCQkgICAgIDAsIGlvX3B0ciwgJmpmcyk7CisJCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJvcGVuIGpvdXJuYWwgZGV2aWNlICVzIiwgam91cm5hbF9kZXZpY2UpOworCQlpZiAoKGJsb2Nrc2l6ZSA8IDApICYmIChqZnMtPmJsb2Nrc2l6ZSA8ICh1bnNpZ25lZCkgKC1ibG9ja3NpemUpKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJIkpvdXJuYWwgZGV2IGJsb2Nrc2l6ZSAoJWQpIHNtYWxsZXIgdGhhbiAiCisJCQkJIm1pbmltdW0gYmxvY2tzaXplICVkXG4iLCBqZnMtPmJsb2Nrc2l6ZSwKKwkJCQktYmxvY2tzaXplKTsKKwkJfQorCQlibG9ja3NpemUgPSBqZnMtPmJsb2Nrc2l6ZTsKKwkJcGFyYW0uc19sb2dfYmxvY2tfc2l6ZSA9CisJCQlpbnRfbG9nMihibG9ja3NpemUgPj4gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpOworCQlleHQyZnNfY2xvc2UoamZzKTsKKwl9CisKKwlpZiAoYmxvY2tzaXplID4gc3lzX3BhZ2Vfc2l6ZSkgeworCQlta2UyZnNfd2FybmluZ19tc2coMSwgIiVkLWJ5dGUgYmxvY2tzIHRvbyBiaWcgZm9yIHN5c3RlbSAobWF4ICVkKSIsCisJCQlibG9ja3NpemUsIHN5c19wYWdlX3NpemUpOworCQlpZiAoIWZvcmNlKSB7CisJCQlwcm9jZWVkX3F1ZXN0aW9uKCk7CisJCX0KKwkJYmJfZXJyb3JfbXNnKCJGb3JjZWQgdG8gY29udGludWUiKTsKKwl9CisJbWtlMmZzX3dhcm5pbmdfbXNnKCgoYmxvY2tzaXplID4gNDA5NikgJiYKKwkJKHBhcmFtLnNfZmVhdHVyZV9jb21wYXQgJiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSksCisJCSJzb21lIDIuNCBrZXJuZWxzIGRvIG5vdCBzdXBwb3J0ICIKKwkJImJsb2Nrc2l6ZXMgZ3JlYXRlciB0aGFuIDQwOTYgdXNpbmcgZXh0My5cbiIKKwkJIlVzZSAtYiA0MDk2IGlmIHRoaXMgaXMgYW4gaXNzdWUgZm9yIHlvdVxuIik7CisKKwlpZiAob3B0aW5kIDwgYXJnYykgeworCQlwYXJhbS5zX2Jsb2Nrc19jb3VudCA9IHBhcnNlX251bV9ibG9ja3MoYXJndltvcHRpbmQrK10sCisJCQkJcGFyYW0uc19sb2dfYmxvY2tfc2l6ZSk7CisJCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZSghcGFyYW0uc19ibG9ja3NfY291bnQsICJpbnZhbGlkIGJsb2NrcyBjb3VudCAtICVzIiwgYXJndltvcHRpbmQgLSAxXSk7CisJfQorCWlmIChvcHRpbmQgPCBhcmdjKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlpZiAocGFyYW0uc19mZWF0dXJlX2luY29tcGF0ICYgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSB7CisJCWlmICghZnNfdHlwZSkKKwkJCWZzX3R5cGUgPSAiam91cm5hbCI7CisJCXJlc2VydmVkX3JhdGlvID0gMDsKKwkJcGFyYW0uc19mZWF0dXJlX2luY29tcGF0ID0gRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWOworCQlwYXJhbS5zX2ZlYXR1cmVfY29tcGF0ID0gMDsKKwkJcGFyYW0uc19mZWF0dXJlX3JvX2NvbXBhdCA9IDA7CisJfQorCWlmIChwYXJhbS5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFViAmJgorCSAgICAocGFyYW0uc19mZWF0dXJlX2NvbXBhdCB8fCBwYXJhbS5zX2ZlYXR1cmVfcm9fY29tcGF0IHx8CisJICAgICBwYXJhbS5zX2ZlYXR1cmVfaW5jb21wYXQpKQorCQlwYXJhbS5zX3Jldl9sZXZlbCA9IDE7CS8qIENyZWF0ZSBhIHJldmlzaW9uIDEgZmlsZXN5c3RlbSAqLworCisJY2hlY2tfcGxhdXNpYmlsaXR5KGRldmljZV9uYW1lICwgZm9yY2UpOworCWNoZWNrX21vdW50KGRldmljZV9uYW1lLCBmb3JjZSwgImZpbGVzeXN0ZW0iKTsKKworCXBhcmFtLnNfbG9nX2ZyYWdfc2l6ZSA9IHBhcmFtLnNfbG9nX2Jsb2NrX3NpemU7CisKKwlpZiAobm9hY3Rpb24gJiYgcGFyYW0uc19ibG9ja3NfY291bnQpIHsKKwkJZGV2X3NpemUgPSBwYXJhbS5zX2Jsb2Nrc19jb3VudDsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgeworCXJldHJ5OgorCQlyZXR2YWwgPSBleHQyZnNfZ2V0X2RldmljZV9zaXplKGRldmljZV9uYW1lLAorCQkJCQkJRVhUMl9CTE9DS19TSVpFKCZwYXJhbSksCisJCQkJCQkmZGV2X3NpemUpOworCQlpZiAoKHJldHZhbCA9PSBFRkJJRykgJiYKKwkJICAgIChibG9ja3NpemUgPT0gMCkgJiYKKwkJICAgIChwYXJhbS5zX2xvZ19ibG9ja19zaXplID09IDApKSB7CisJCQlwYXJhbS5zX2xvZ19ibG9ja19zaXplID0gMjsKKwkJCWJsb2Nrc2l6ZSA9IDQwOTY7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKChyZXR2YWwgJiYgKHJldHZhbCAhPSBFWFQyX0VUX1VOSU1QTEVNRU5URUQpKSwiZGV0ZXJtaW5lIGZpbGVzeXN0ZW0gc2l6ZSIpOworCisJaWYgKCFwYXJhbS5zX2Jsb2Nrc19jb3VudCkgeworCQlpZiAocmV0dmFsID09IEVYVDJfRVRfVU5JTVBMRU1FTlRFRCkgeworCQkJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKDEsCisJCQkJImRldGVybWluZSBkZXZpY2Ugc2l6ZTsgeW91ICIKKwkJCQkibXVzdCBzcGVjaWZ5XG50aGUgc2l6ZSBvZiB0aGUgIgorCQkJCSJmaWxlc3lzdGVtIik7CisJCX0gZWxzZSB7CisJCQlpZiAoZGV2X3NpemUgPT0gMCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCQkiRGV2aWNlIHNpemUgcmVwb3J0ZWQgdG8gYmUgemVyby4gICIKKwkJCQkJIkludmFsaWQgcGFydGl0aW9uIHNwZWNpZmllZCwgb3Jcblx0IgorCQkJCQkicGFydGl0aW9uIHRhYmxlIHdhc24ndCByZXJlYWQgIgorCQkJCQkiYWZ0ZXIgcnVubmluZyBmZGlzaywgZHVlIHRvXG5cdCIKKwkJCQkJImEgbW9kaWZpZWQgcGFydGl0aW9uIGJlaW5nIGJ1c3kgIgorCQkJCQkiYW5kIGluIHVzZS4gIFlvdSBtYXkgbmVlZCB0byByZWJvb3Rcblx0IgorCQkJCQkidG8gcmUtcmVhZCB5b3VyIHBhcnRpdGlvbiB0YWJsZS5cbiIKKwkJCQkpOworCQkJfQorCQkJcGFyYW0uc19ibG9ja3NfY291bnQgPSBkZXZfc2l6ZTsKKwkJCWlmIChzeXNfcGFnZV9zaXplID4gRVhUMl9CTE9DS19TSVpFKCZwYXJhbSkpCisJCQkJcGFyYW0uc19ibG9ja3NfY291bnQgJj0gfigoc3lzX3BhZ2Vfc2l6ZSAvCisJCQkJCQkJICAgRVhUMl9CTE9DS19TSVpFKCZwYXJhbSkpLTEpOworCQl9CisKKwl9IGVsc2UgaWYgKCFmb3JjZSAmJiAocGFyYW0uc19ibG9ja3NfY291bnQgPiBkZXZfc2l6ZSkpIHsKKwkJYmJfZXJyb3JfbXNnKCJGaWxlc3lzdGVtIGxhcmdlciB0aGFuIGFwcGFyZW50IGRldmljZSBzaXplIik7CisJCXByb2NlZWRfcXVlc3Rpb24oKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSB1c2VyIGFza2VkIGZvciBIQVNfSk9VUk5BTCwgdGhlbiBtYWtlIHN1cmUgYSBqb3VybmFsCisJICogZ2V0cyBjcmVhdGVkLgorCSAqLworCWlmICgocGFyYW0uc19mZWF0dXJlX2NvbXBhdCAmIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpICYmCisJICAgICFqb3VybmFsX3NpemUpCisJCWpvdXJuYWxfc2l6ZSA9IC0xOworCisJLyogU2V0IGZpcnN0IG1ldGEgYmxvY2tncm91cCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKwkvKiAodGhpcyBpcyBtb3N0bHkgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcykgKi8KKwlpZiAoKHBhcmFtLnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKSAmJgorCSAgICAoKHRtcCA9IGdldGVudigiTUtFMkZTX0ZJUlNUX01FVEFfQkciKSkpKQorCQlwYXJhbS5zX2ZpcnN0X21ldGFfYmcgPSBhdG9pKHRtcCk7CisKKwkvKiBHZXQgdGhlIGhhcmR3YXJlIHNlY3RvciBzaXplLCBpZiBhdmFpbGFibGUgKi8KKwlyZXR2YWwgPSBleHQyZnNfZ2V0X2RldmljZV9zZWN0c2l6ZShkZXZpY2VfbmFtZSwgJnNlY3Rvcl9zaXplKTsKKwlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCAiZGV0ZXJtaW5lIGhhcmR3YXJlIHNlY3RvciBzaXplIik7CisKKwlpZiAoKHRtcCA9IGdldGVudigiTUtFMkZTX0RFVklDRV9TRUNUU0laRSIpKSAhPSBOVUxMKQorCQlzZWN0b3Jfc2l6ZSA9IGF0b2kodG1wKTsKKworCXNldF9mc19kZWZhdWx0cyhmc190eXBlLCAmcGFyYW0sIGJsb2Nrc2l6ZSwgc2VjdG9yX3NpemUsICZpbm9kZV9yYXRpbyk7CisJYmxvY2tzaXplID0gRVhUMl9CTE9DS19TSVpFKCZwYXJhbSk7CisKKwlpZiAoZXh0ZW5kZWRfb3B0cykKKwkJcGFyc2VfZXh0ZW5kZWRfb3B0cygmcGFyYW0sIGV4dGVuZGVkX29wdHMpOworCisJLyogU2luY2Ugc3BhcnNlX3N1cGVyIGlzIHRoZSBkZWZhdWx0LCB3ZSB3b3VsZCBvbmx5IGhhdmUgYSBwcm9ibGVtCisJICogaGVyZSBpZiBpdCB3YXMgZXhwbGljaXRseSBkaXNhYmxlZC4KKwkgKi8KKwlpZiAoKHBhcmFtLnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERSkgJiYKKwkgICAgIShwYXJhbS5zX2ZlYXR1cmVfcm9fY29tcGF0JkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVzZXJ2ZWQgb25saW5lIHJlc2l6ZSBibG9ja3Mgbm90IHN1cHBvcnRlZCAiCisJCQkgICJvbiBub24tc3BhcnNlIGZpbGVzeXN0ZW0iKTsKKwl9CisKKwlpZiAocGFyYW0uc19ibG9ja3NfcGVyX2dyb3VwKSB7CisJCWlmIChwYXJhbS5zX2Jsb2Nrc19wZXJfZ3JvdXAgPCAyNTYgfHwKKwkJICAgIHBhcmFtLnNfYmxvY2tzX3Blcl9ncm91cCA+IDggKiAodW5zaWduZWQpIGJsb2Nrc2l6ZSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJsb2NrcyBwZXIgZ3JvdXAgY291bnQgb3V0IG9mIHJhbmdlIik7CisJCX0KKwl9CisKKwlpZiAoIWZvcmNlICYmIHBhcmFtLnNfYmxvY2tzX2NvdW50ID49ICgxIDw8IDMxKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiRmlsZXN5c3RlbSB0b28gbGFyZ2UuICBObyBtb3JlIHRoYW4gMioqMzEtMSBibG9ja3NcbiIKKwkJCSJcdCAoOFRCIHVzaW5nIGEgYmxvY2tzaXplIG9mIDRrKSBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4iKTsKKwl9CisKKwlpZiAoaW5vZGVfc2l6ZSkgeworCQlpZiAoaW5vZGVfc2l6ZSA8IEVYVDJfR09PRF9PTERfSU5PREVfU0laRSB8fAorCQkgICAgaW5vZGVfc2l6ZSA+IEVYVDJfQkxPQ0tfU0laRSgmcGFyYW0pIHx8CisJCSAgICBpbm9kZV9zaXplICYgKGlub2RlX3NpemUgLSAxKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgaW5vZGUgc2l6ZSAlZCAobWluICVkL21heCAlZCkiLAorCQkJCWlub2RlX3NpemUsIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSwKKwkJCQlibG9ja3NpemUpOworCQl9CisJCW1rZTJmc193YXJuaW5nX21zZygoaW5vZGVfc2l6ZSAhPSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUpLAorCQkJIiVkLWJ5dGUgaW5vZGVzIG5vdCB1c2FibGUgb24gbW9zdCBzeXN0ZW1zIiwKKwkJCWlub2RlX3NpemUpOworCQlwYXJhbS5zX2lub2RlX3NpemUgPSBpbm9kZV9zaXplOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIG51bWJlciBvZiBpbm9kZXMgYmFzZWQgb24gdGhlIGlub2RlIHJhdGlvCisJICovCisJcGFyYW0uc19pbm9kZXNfY291bnQgPSBudW1faW5vZGVzID8gbnVtX2lub2RlcyA6CisJCSgoX191NjQpIHBhcmFtLnNfYmxvY2tzX2NvdW50ICogYmxvY2tzaXplKQorCQkJLyBpbm9kZV9yYXRpbzsKKworCS8qCisJICogQ2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgdG8gcmVzZXJ2ZQorCSAqLworCXBhcmFtLnNfcl9ibG9ja3NfY291bnQgPSAocGFyYW0uc19ibG9ja3NfY291bnQgKiByZXNlcnZlZF9yYXRpbykgLyAxMDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG1rZTJmc19jbGVhbl91cCh2b2lkKQoreworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBqb3VybmFsX2RldmljZSkgZnJlZShqb3VybmFsX2RldmljZSk7Cit9CisKK2ludCBta2UyZnNfbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBta2UyZnNfbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJZXh0Ml9maWxzeXMJZnM7CisJYmFkYmxvY2tzX2xpc3QJYmJfbGlzdCA9IDA7CisJdW5zaWduZWQgaW50CWk7CisJaW50CQl2YWw7CisJaW9fbWFuYWdlcglpb19wdHI7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWF0ZXhpdChta2UyZnNfY2xlYW5fdXApOworCWlmICghUFJTKGFyZ2MsIGFyZ3YpKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIENPTkZJR19URVNUSU9fREVCVUcKKwlpb19wdHIgPSB0ZXN0X2lvX21hbmFnZXI7CisJdGVzdF9pb19iYWNraW5nX21hbmFnZXIgPSB1bml4X2lvX21hbmFnZXI7CisjZWxzZQorCWlvX3B0ciA9IHVuaXhfaW9fbWFuYWdlcjsKKyNlbmRpZgorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBzdXBlcmJsb2NrLi4uLgorCSAqLworCXJldHZhbCA9IGV4dDJmc19pbml0aWFsaXplKGRldmljZV9uYW1lLCAwLCAmcGFyYW0sCisJCQkJICAgaW9fcHRyLCAmZnMpOworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJzZXQgdXAgc3VwZXJibG9jayIpOworCisJLyoKKwkgKiBXaXBlIG91dCB0aGUgb2xkIG9uLWRpc2sgc3VwZXJibG9jaworCSAqLworCWlmICghbm9hY3Rpb24pCisJCXphcF9zZWN0b3IoZnMsIDIsIDYpOworCisJLyoKKwkgKiBHZW5lcmF0ZSBhIFVVSUQgZm9yIGl0Li4uCisJICovCisJdXVpZF9nZW5lcmF0ZShmcy0+c3VwZXItPnNfdXVpZCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGRpcmVjdG9yeSBpbmRleCB2YXJpYWJsZXMKKwkgKi8KKwlmcy0+c3VwZXItPnNfZGVmX2hhc2hfdmVyc2lvbiA9IEVYVDJfSEFTSF9URUE7CisJdXVpZF9nZW5lcmF0ZSgodW5zaWduZWQgY2hhciAqKSBmcy0+c3VwZXItPnNfaGFzaF9zZWVkKTsKKworCS8qCisJICogQWRkICJqaXR0ZXIiIHRvIHRoZSBzdXBlcmJsb2NrJ3MgY2hlY2sgaW50ZXJ2YWwgc28gdGhhdCB3ZQorCSAqIGRvbid0IGNoZWNrIGFsbCB0aGUgZmlsZXN5c3RlbXMgYXQgdGhlIHNhbWUgdGltZS4gIFdlIHVzZSBhCisJICoga2x1ZGd5IGhhY2sgb2YgdXNpbmcgdGhlIFVVSUQgdG8gZGVyaXZlIGEgcmFuZG9tIGppdHRlciB2YWx1ZS4KKwkgKi8KKwlmb3IgKGkgPSAwLCB2YWwgPSAwOyBpIDwgc2l6ZW9mKGZzLT5zdXBlci0+c191dWlkKTsgaSsrKQorCQl2YWwgKz0gZnMtPnN1cGVyLT5zX3V1aWRbaV07CisJZnMtPnN1cGVyLT5zX21heF9tbnRfY291bnQgKz0gdmFsICUgRVhUMl9ERkxfTUFYX01OVF9DT1VOVDsKKworCS8qCisJICogT3ZlcnJpZGUgdGhlIGNyZWF0b3IgT1MsIGlmIGFwcGxpY2FibGUKKwkgKi8KKwlpZiAoY3JlYXRvcl9vcyAmJiAhc2V0X29zKGZzLT5zdXBlciwgY3JlYXRvcl9vcykpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gb3MgLSAlcyIsIGNyZWF0b3Jfb3MpOworCX0KKworCS8qCisJICogRm9yIHRoZSBIdXJkLCB3ZSB3aWxsIHR1cm4gb2ZmIGZpbGV0eXBlIHNpbmNlIGl0IGRvZXNuJ3QKKwkgKiBzdXBwb3J0IGl0LgorCSAqLworCWlmIChmcy0+c3VwZXItPnNfY3JlYXRvcl9vcyA9PSBFWFQyX09TX0hVUkQpCisJCWZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICY9CisJCQl+RVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFOworCisJLyoKKwkgKiBTZXQgdGhlIHZvbHVtZSBsYWJlbC4uLgorCSAqLworCWlmICh2b2x1bWVfbGFiZWwpIHsKKwkJc25wcmludGYoZnMtPnN1cGVyLT5zX3ZvbHVtZV9uYW1lLCBzaXplb2YoZnMtPnN1cGVyLT5zX3ZvbHVtZV9uYW1lKSwgIiVzIiwgdm9sdW1lX2xhYmVsKTsKKwl9CisKKwkvKgorCSAqIFNldCB0aGUgbGFzdCBtb3VudCBkaXJlY3RvcnkKKwkgKi8KKwlpZiAobW91bnRfZGlyKSB7CisJCXNucHJpbnRmKGZzLT5zdXBlci0+c19sYXN0X21vdW50ZWQsIHNpemVvZihmcy0+c3VwZXItPnNfbGFzdF9tb3VudGVkKSwgIiVzIiwgbW91bnRfZGlyKTsKKwl9CisKKwlpZiAoIXF1aWV0IHx8IG5vYWN0aW9uKQorCQlzaG93X3N0YXRzKGZzKTsKKworCWlmIChub2FjdGlvbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCSAgICBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYpIHsKKwkJY3JlYXRlX2pvdXJuYWxfZGV2KGZzKTsKKwkJcmV0dXJuIChleHQyZnNfY2xvc2UoZnMpID8gMSA6IDApOworCX0KKworCWlmIChiYWRfYmxvY2tzX2ZpbGVuYW1lKQorCQlyZWFkX2JiX2ZpbGUoZnMsICZiYl9saXN0LCBiYWRfYmxvY2tzX2ZpbGVuYW1lKTsKKwlpZiAoY2ZsYWcpCisJCXRlc3RfZGlzayhmcywgJmJiX2xpc3QpOworCisJaGFuZGxlX2JhZF9ibG9ja3MoZnMsIGJiX2xpc3QpOworCWZzLT5zdHJpZGUgPSBmc19zdHJpZGU7CisJcmV0dmFsID0gZXh0MmZzX2FsbG9jYXRlX3RhYmxlcyhmcyk7CisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgImFsbG9jYXRlIGZpbGVzeXN0ZW0gdGFibGVzIik7CisJaWYgKHN1cGVyX29ubHkpIHsKKwkJZnMtPnN1cGVyLT5zX3N0YXRlIHw9IEVYVDJfRVJST1JfRlM7CisJCWZzLT5mbGFncyAmPSB+KEVYVDJfRkxBR19JQl9ESVJUWXxFWFQyX0ZMQUdfQkJfRElSVFkpOworCX0gZWxzZSB7CisJCS8qIHJzdiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICg2NGtCIGlzIE1EIFJBSUQgc2IgYWxpZ25tZW50KSAqLworCQl1bnNpZ25lZCBpbnQgcnN2ID0gNjU1MzYgLyBmcy0+YmxvY2tzaXplOworCQl1bnNpZ25lZCBsb25nIGJsb2NrcyA9IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQ7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJCWJsa190IHJldF9ibGs7CisKKyNpZmRlZiBaQVBfQk9PVEJMT0NLCisJCXphcF9zZWN0b3IoZnMsIDAsIDIpOworI2VuZGlmCisKKwkJLyoKKwkJICogV2lwZSBvdXQgYW55IG9sZCBNRCBSQUlEIChvciBvdGhlcikgbWV0YWRhdGEgYXQgdGhlIGVuZAorCQkgKiBvZiB0aGUgZGV2aWNlLiAgVGhpcyB3aWxsIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGRldmljZSBpcworCQkgKiBhcyBsYXJnZSBhcyB3ZSB0aGluay4gIEJlIGNhcmVmdWwgd2l0aCB2ZXJ5IHNtYWxsIGRldmljZXMuCisJCSAqLworCQlzdGFydCA9IChibG9ja3MgJiB+KHJzdiAtIDEpKTsKKwkJaWYgKHN0YXJ0ID4gcnN2KQorCQkJc3RhcnQgLT0gcnN2OworCQlpZiAoc3RhcnQgPiAwKQorCQkJcmV0dmFsID0gemVyb19ibG9ja3MoZnMsIHN0YXJ0LCBibG9ja3MgLSBzdGFydCwKKwkJCQkJICAgICBOVUxMLCAmcmV0X2JsaywgTlVMTCk7CisKKwkJbWtlMmZzX3dhcm5pbmdfbXNnKHJldHZhbCwgImNhbid0IHplcm8gYmxvY2sgJXUgYXQgZW5kIG9mIGZpbGVzeXN0ZW0iLCByZXRfYmxrKTsKKwkJd3JpdGVfaW5vZGVfdGFibGVzKGZzKTsKKwkJY3JlYXRlX3Jvb3RfZGlyKGZzKTsKKwkJY3JlYXRlX2xvc3RfYW5kX2ZvdW5kKGZzKTsKKwkJcmVzZXJ2ZV9pbm9kZXMoZnMpOworCQljcmVhdGVfYmFkX2Jsb2NrX2lub2RlKGZzLCBiYl9saXN0KTsKKwkJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmCisJCSAgICBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERSkgeworCQkJcmV0dmFsID0gZXh0MmZzX2NyZWF0ZV9yZXNpemVfaW5vZGUoZnMpOworCQkJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgInJlc2VydmUgYmxvY2tzIGZvciBvbmxpbmUgcmVzaXplIik7CisJCX0KKwl9CisKKwlpZiAoam91cm5hbF9kZXZpY2UpIHsKKwkJbWFrZV9qb3VybmFsX2RldmljZShqb3VybmFsX2RldmljZSwgZnMsIHF1aWV0LCBmb3JjZSk7CisJfSBlbHNlIGlmIChqb3VybmFsX3NpemUpIHsKKwkJbWFrZV9qb3VybmFsX2Jsb2Nrcyhmcywgam91cm5hbF9zaXplLCBqb3VybmFsX2ZsYWdzLCBxdWlldCk7CisJfQorCisJbWtlMmZzX3ZlcmJvc2UoIldyaXRpbmcgc3VwZXJibG9ja3MgYW5kIGZpbGVzeXN0ZW0gYWNjb3VudGluZyBpbmZvcm1hdGlvbjogIik7CisJcmV0dmFsID0gZXh0MmZzX2ZsdXNoKGZzKTsKKwlta2UyZnNfd2FybmluZ19tc2cocmV0dmFsLCAiaGFkIHRyb3VibGUgd3JpdGluZyBvdXQgc3VwZXJibG9ja3MiKTsKKwlta2UyZnNfdmVyYm9zZV9kb25lKCk7CisJaWYgKCFxdWlldCAmJiAhZ2V0ZW52KCJNS0UyRlNfU0tJUF9DSEVDS19NU0ciKSkKKwkJcHJpbnRfY2hlY2tfbWVzc2FnZShmcyk7CisJdmFsID0gZXh0MmZzX2Nsb3NlKGZzKTsKKwlyZXR1cm4gKHJldHZhbCB8fCB2YWwpID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy90dW5lMmZzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy90dW5lMmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzZjRhZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3R1bmUyZnMuYwpAQCAtMCwwICsxLDcxMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdHVuZTJmcy5jIC0gQ2hhbmdlIHRoZSBmaWxlIHN5c3RlbSBwYXJhbWV0ZXJzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgYnkgVGhlb2RvcmUgVHMnby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBIaXN0b3J5OgorICogOTMvMDYvMDEJLSBDcmVhdGlvbgorICogOTMvMTAvMzEJLSBBZGRlZCB0aGUgLWMgb3B0aW9uIHRvIGNoYW5nZSB0aGUgbWF4aW1hbCBtb3VudCBjb3VudHMKKyAqIDkzLzEyLzE0CS0gQWRkZWQgLWwgZmxhZyB0byBsaXN0IGNvbnRlbnRzIG9mIHN1cGVyYmxvY2sKKyAqICAgICAgICAgICAgICAgIE0uSi5FLiBNb2wgKG1hcmNlbEBkdXRlY2EuZXQudHVkZWxmdC5ubCkKKyAqICAgICAgICAgICAgICAgIEYuVy4gdGVuIFdvbGRlIChmcmFua3lAZHV0ZWNhLmV0LnR1ZGVsZnQubmwpCisgKiA5My8xMi8yOQktIEFkZGVkIHRoZSAtZSBvcHRpb24gdG8gY2hhbmdlIGVycm9ycyBiZWhhdmlvcgorICogOTQvMDIvMjcJLSBQb3J0ZWQgdG8gdXNlIHRoZSBleHQyZnMgbGlicmFyeQorICogOTQvMDMvMDYJLSBBZGRlZCB0aGUgY2hlY2tzIGludGVydmFsIGZyb20gVXdlIE9oc2UgKHV3ZUB0aXJrYS5ndW4uZGUpCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlICJlMmZzYmIuaCIKKyNpbmNsdWRlICJleHQyZnMvZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy9leHQyZnMuaCIKKyNpbmNsdWRlICJ1dWlkL3V1aWQuaCIKKyNpbmNsdWRlICJlMnAvZTJwLmgiCisjaW5jbHVkZSAiZXh0MmZzL2tlcm5lbC1qYmQuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAiYmxraWQvYmxraWQuaCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyBjaGFyICogZGV2aWNlX25hbWUgPSBOVUxMOworc3RhdGljIGNoYXIgKiBuZXdfbGFiZWwsICpuZXdfbGFzdF9tb3VudGVkLCAqbmV3X1VVSUQ7CitzdGF0aWMgY2hhciAqIGlvX29wdGlvbnM7CitzdGF0aWMgaW50IGNfZmxhZywgQ19mbGFnLCBlX2ZsYWcsIGZfZmxhZywgZ19mbGFnLCBpX2ZsYWcsIGxfZmxhZywgTF9mbGFnOworc3RhdGljIGludCBtX2ZsYWcsIE1fZmxhZywgcl9mbGFnLCBzX2ZsYWcgPSAtMSwgdV9mbGFnLCBVX2ZsYWcsIFRfZmxhZzsKK3N0YXRpYyB0aW1lX3QgbGFzdF9jaGVja190aW1lOworc3RhdGljIGludCBwcmludF9sYWJlbDsKK3N0YXRpYyBpbnQgbWF4X21vdW50X2NvdW50LCBtb3VudF9jb3VudCwgbW91bnRfZmxhZ3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCwgcmVzZXJ2ZWRfYmxvY2tzOworc3RhdGljIHVuc2lnbmVkIHJlc2VydmVkX3JhdGlvOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzZ2lkLCByZXN1aWQ7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZXJyb3JzOworc3RhdGljIGludCBvcGVuX2ZsYWc7CitzdGF0aWMgY2hhciAqZmVhdHVyZXNfY21kOworc3RhdGljIGNoYXIgKm1udG9wdHNfY21kOworCitzdGF0aWMgaW50IGpvdXJuYWxfc2l6ZSwgam91cm5hbF9mbGFnczsKK3N0YXRpYyBjaGFyICpqb3VybmFsX2RldmljZSA9IE5VTEw7CisKK3N0YXRpYyBjb25zdCBjaGFyICpwbGVhc2VfZnNjayA9ICJQbGVhc2UgcnVuIGUyZnNjayBvbiB0aGUgZmlsZXN5c3RlbVxuIjsKKworc3RhdGljIF9fdTMyIG9rX2ZlYXR1cmVzWzNdID0geworCUVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgfCBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCwKKwlFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUsCisJRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIKK307CisKKy8qCisgKiBSZW1vdmUgYW4gZXh0ZXJuYWwgam91cm5hbCBmcm9tIHRoZSBmaWxlc3lzdGVtCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9qb3VybmFsX2RldmljZShleHQyX2ZpbHN5cyBmcykKK3sKKwljaGFyCQkqam91cm5hbF9wYXRoOworCWV4dDJfZmlsc3lzCWpmczsKKwljaGFyCQlidWZbMTAyNF07CisJam91cm5hbF9zdXBlcmJsb2NrX3QJKmpzYjsKKwlpbnQJCWksIG5yX3VzZXJzOworCWVycmNvZGVfdAlyZXR2YWw7CisJaW50CQljb21taXRfcmVtb3ZlX2pvdXJuYWwgPSAwOworCWlvX21hbmFnZXIJaW9fcHRyOworCisJaWYgKGZfZmxhZykKKwkJY29tbWl0X3JlbW92ZV9qb3VybmFsID0gMTsgLyogZm9yY2UgcmVtb3ZhbCBldmVuIGlmIGVycm9yICovCisKKwl1dWlkX3VucGFyc2UoZnMtPnN1cGVyLT5zX2pvdXJuYWxfdXVpZCwgYnVmKTsKKwlqb3VybmFsX3BhdGggPSBibGtpZF9nZXRfZGV2bmFtZShOVUxMLCAiVVVJRCIsIGJ1Zik7CisKKwlpZiAoIWpvdXJuYWxfcGF0aCkgeworCQlqb3VybmFsX3BhdGggPQorCQkJZXh0MmZzX2ZpbmRfYmxvY2tfZGV2aWNlKGZzLT5zdXBlci0+c19qb3VybmFsX2Rldik7CisJCWlmICgham91cm5hbF9wYXRoKQorCQkJcmV0dXJuOworCX0KKworCWlvX3B0ciA9IHVuaXhfaW9fbWFuYWdlcjsKKwlyZXR2YWwgPSBleHQyZnNfb3Blbihqb3VybmFsX3BhdGgsIEVYVDJfRkxBR19SV3wKKwkJCSAgICAgRVhUMl9GTEFHX0pPVVJOQUxfREVWX09LLCAwLAorCQkJICAgICBmcy0+YmxvY2tzaXplLCBpb19wdHIsICZqZnMpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKCJGYWlsZWQgdG8gb3BlbiBleHRlcm5hbCBqb3VybmFsIik7CisJCWdvdG8gbm9fdmFsaWRfam91cm5hbDsKKwl9CisJaWYgKCEoamZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSkgeworCQliYl9lcnJvcl9tc2coIiVzIGlzIG5vdCBhIGpvdXJuYWwgZGV2aWNlIiwgam91cm5hbF9wYXRoKTsKKwkJZ290byBub192YWxpZF9qb3VybmFsOworCX0KKworCS8qIEdldCB0aGUgam91cm5hbCBzdXBlcmJsb2NrICovCisJaWYgKChyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGpmcy0+aW8sIDEsIC0xMDI0LCBidWYpKSkgeworCQliYl9lcnJvcl9tc2coIkZhaWxlZCB0byByZWFkIGpvdXJuYWwgc3VwZXJibG9jayIpOworCQlnb3RvIG5vX3ZhbGlkX2pvdXJuYWw7CisJfQorCisJanNiID0gKGpvdXJuYWxfc3VwZXJibG9ja190ICopIGJ1ZjsKKwlpZiAoKGpzYi0+c19oZWFkZXIuaF9tYWdpYyAhPSAodW5zaWduZWQpIG50b2hsKEpGU19NQUdJQ19OVU1CRVIpKSB8fAorCSAgICAoanNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSAhPSAodW5zaWduZWQpIG50b2hsKEpGU19TVVBFUkJMT0NLX1YyKSkpIHsKKwkJYmJfZXJyb3JfbXNnKCJKb3VybmFsIHN1cGVyYmxvY2sgbm90IGZvdW5kISIpOworCQlnb3RvIG5vX3ZhbGlkX2pvdXJuYWw7CisJfQorCisJLyogRmluZCB0aGUgZmlsZXN5c3RlbSBVVUlEICovCisJbnJfdXNlcnMgPSBudG9obChqc2ItPnNfbnJfdXNlcnMpOworCWZvciAoaT0wOyBpIDwgbnJfdXNlcnM7IGkrKykgeworCQlpZiAobWVtY21wKGZzLT5zdXBlci0+c191dWlkLAorCQkJICAgJmpzYi0+c191c2Vyc1tpKjE2XSwgMTYpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gbnJfdXNlcnMpIHsKKwkJYmJfZXJyb3JfbXNnKCJGaWxlc3lzdGVtJ3MgVVVJRCBub3QgZm91bmQgb24gam91cm5hbCBkZXZpY2UiKTsKKwkJY29tbWl0X3JlbW92ZV9qb3VybmFsID0gMTsKKwkJZ290byBub192YWxpZF9qb3VybmFsOworCX0KKwlucl91c2Vycy0tOworCWZvciAoaT0wOyBpIDwgbnJfdXNlcnM7IGkrKykKKwkJbWVtY3B5KCZqc2ItPnNfdXNlcnNbaSoxNl0sICZqc2ItPnNfdXNlcnNbKGkrMSkqMTZdLCAxNik7CisJanNiLT5zX25yX3VzZXJzID0gaHRvbmwobnJfdXNlcnMpOworCisJLyogV3JpdGUgYmFjayB0aGUgam91cm5hbCBzdXBlcmJsb2NrICovCisJaWYgKChyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2JsayhqZnMtPmlvLCAxLCAtMTAyNCwgYnVmKSkpIHsKKwkJYmJfZXJyb3JfbXNnKCJGYWlsZWQgdG8gd3JpdGUgam91cm5hbCBzdXBlcmJsb2NrIik7CisJCWdvdG8gbm9fdmFsaWRfam91cm5hbDsKKwl9CisKKwljb21taXRfcmVtb3ZlX2pvdXJuYWwgPSAxOworCitub192YWxpZF9qb3VybmFsOgorCWlmIChjb21taXRfcmVtb3ZlX2pvdXJuYWwgPT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkpvdXJuYWwgTk9UIHJlbW92ZWQiKTsKKwlmcy0+c3VwZXItPnNfam91cm5hbF9kZXYgPSAwOworCXV1aWRfY2xlYXIoZnMtPnN1cGVyLT5zX2pvdXJuYWxfdXVpZCk7CisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCXB1dHMoIkpvdXJuYWwgcmVtb3ZlZCIpOworCWZyZWUoam91cm5hbF9wYXRoKTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciByZW1vdmVfam91cm5hbF9pbm9kZSAqLworc3RhdGljIGludCByZWxlYXNlX2Jsb2Nrc19wcm9jKGV4dDJfZmlsc3lzIGZzLCBibGtfdCAqYmxvY2tuciwKKwkJCSAgICAgICBpbnQgYmxvY2tjbnQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICAgIHZvaWQgKnByaXZhdGUgRVhUMkZTX0FUVFIoKHVudXNlZCkpKQoreworCWJsa190CWJsb2NrOworCWludAlncm91cDsKKworCWJsb2NrID0gKmJsb2NrbnI7CisJZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCxibG9jayk7CisJZ3JvdXAgPSBleHQyZnNfZ3JvdXBfb2ZfYmxrKGZzLCBibG9jayk7CisJZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2ZyZWVfYmxvY2tzX2NvdW50Kys7CisJZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50Kys7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIGpvdXJuYWwgaW5vZGUgZnJvbSB0aGUgZmlsZXN5c3RlbQorICovCitzdGF0aWMgdm9pZCByZW1vdmVfam91cm5hbF9pbm9kZShleHQyX2ZpbHN5cyBmcykKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQlpbm9kZTsKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlpbm9fdAkJCWlubyA9IGZzLT5zdXBlci0+c19qb3VybmFsX2ludW07CisJY2hhciAqbXNnID0gInRvIHJlYWQiOworCWNoYXIgKnMgPSAiam91cm5hbCBpbm9kZSI7CisKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgaW5vLCAgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIFJFTU9WRV9KT1VSTkFMX0lOT0RFX0VSUk9SOworCWlmIChpbm8gPT0gRVhUMl9KT1VSTkFMX0lOTykgeworCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9iaXRtYXBzKGZzKTsKKwkJaWYgKHJldHZhbCkgeworCQkJbXNnID0gInRvIHJlYWQgYml0bWFwcyI7CisJCQlzID0gIiI7CisJCQlnb3RvIFJFTU9WRV9KT1VSTkFMX0lOT0RFX0VSUk9SOworCQl9CisJCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlKGZzLCBpbm8sIDAsIE5VTEwsCisJCQkJCSAgICAgIHJlbGVhc2VfYmxvY2tzX3Byb2MsIE5VTEwpOworCQlpZiAocmV0dmFsKSB7CisJCQltc2cgPSAiY2xlYXJpbmciOworCQkJZ290byBSRU1PVkVfSk9VUk5BTF9JTk9ERV9FUlJPUjsKKwkJfQorCQltZW1zZXQoJmlub2RlLCAwLCBzaXplb2YoaW5vZGUpKTsKKwkJZXh0MmZzX21hcmtfYmJfZGlydHkoZnMpOworCQlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19TVVBFUl9PTkxZOworCX0gZWxzZQorCQlpbm9kZS5pX2ZsYWdzICY9IH5FWFQyX0lNTVVUQUJMRV9GTDsKKwlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIGlubywgJmlub2RlKTsKKwlpZiAocmV0dmFsKSB7CisJCW1zZyA9ICJ3cml0aW5nIjsKK1JFTU9WRV9KT1VSTkFMX0lOT0RFX0VSUk9SOgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiRmFpbGVkICVzICVzIiwgbXNnLCBzKTsKKwl9CisJZnMtPnN1cGVyLT5zX2pvdXJuYWxfaW51bSA9IDA7CisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworfQorCisvKgorICogVXBkYXRlIHRoZSBkZWZhdWx0IG1vdW50IG9wdGlvbnMKKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX21udG9wdHMoZXh0Ml9maWxzeXMgZnMsIGNoYXIgKm1udG9wdHMpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiPSBmcy0+c3VwZXI7CisKKwlpZiAoZTJwX2VkaXRfbW50b3B0cyhtbnRvcHRzLCAmc2ItPnNfZGVmYXVsdF9tb3VudF9vcHRzLCB+MCkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJJbnZhbGlkIG1vdW50IG9wdGlvbiBzZXQ6ICVzIiwgbW50b3B0cyk7CisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworfQorCisvKgorICogVXBkYXRlIHRoZSBmZWF0dXJlIHNldCBhcyBwcm92aWRlZCBieSB0aGUgdXNlci4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX2ZlYXR1cmVfc2V0KGV4dDJfZmlsc3lzIGZzLCBjaGFyICpmZWF0dXJlcykKK3sKKwlpbnQgc3BhcnNlLCBvbGRfc3BhcnNlLCBmaWxldHlwZSwgb2xkX2ZpbGV0eXBlOworCWludCBqb3VybmFsLCBvbGRfam91cm5hbCwgZHhkaXIsIG9sZF9keGRpcjsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2I9IGZzLT5zdXBlcjsKKwlfX3UzMglvbGRfY29tcGF0LCBvbGRfaW5jb21wYXQsIG9sZF9yb19jb21wYXQ7CisKKwlvbGRfY29tcGF0ID0gc2ItPnNfZmVhdHVyZV9jb21wYXQ7CisJb2xkX3JvX2NvbXBhdCA9IHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0OworCW9sZF9pbmNvbXBhdCA9IHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQ7CisKKwlvbGRfc3BhcnNlID0gc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJgorCQlFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUjsKKwlvbGRfZmlsZXR5cGUgPSBzYi0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkJRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFOworCW9sZF9qb3VybmFsID0gc2ItPnNfZmVhdHVyZV9jb21wYXQgJgorCQlFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMOworCW9sZF9keGRpciA9IHNiLT5zX2ZlYXR1cmVfY29tcGF0ICYKKwkJRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVg7CisJaWYgKGUycF9lZGl0X2ZlYXR1cmUoZmVhdHVyZXMsICZzYi0+c19mZWF0dXJlX2NvbXBhdCwgb2tfZmVhdHVyZXMpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiSW52YWxpZCBmaWxlc3lzdGVtIG9wdGlvbiBzZXQ6ICVzIiwgZmVhdHVyZXMpOworCXNwYXJzZSA9IHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYKKwkJRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVI7CisJZmlsZXR5cGUgPSBzYi0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkJRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFOworCWpvdXJuYWwgPSBzYi0+c19mZWF0dXJlX2NvbXBhdCAmCisJCUVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUw7CisJZHhkaXIgPSBzYi0+c19mZWF0dXJlX2NvbXBhdCAmCisJCUVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYOworCWlmIChvbGRfam91cm5hbCAmJiAham91cm5hbCkgeworCQlpZiAoKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9NT1VOVEVEKSAmJgorCQkgICAgIShtb3VudF9mbGFncyAmIEVYVDJfTUZfUkVBRE9OTFkpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJCQkiVGhlIGhhc19qb3VybmFsIGZsYWcgbWF5IG9ubHkgYmUgIgorCQkJCSJjbGVhcmVkIHdoZW4gdGhlIGZpbGVzeXN0ZW0gaXNcbiIKKwkJCQkidW5tb3VudGVkIG9yIG1vdW50ZWQgIgorCQkJCSJyZWFkLW9ubHkiKTsKKwkJfQorCQlpZiAoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJCSAgICBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJIlRoZSBuZWVkc19yZWNvdmVyeSBmbGFnIGlzIHNldC4gICIKKwkJCQkiJXMgYmVmb3JlIGNsZWFyaW5nIHRoZSBoYXNfam91cm5hbCBmbGFnLiIsCisJCQkJcGxlYXNlX2ZzY2spOworCQl9CisJCWlmIChzYi0+c19qb3VybmFsX2ludW0pIHsKKwkJCXJlbW92ZV9qb3VybmFsX2lub2RlKGZzKTsKKwkJfQorCQlpZiAoc2ItPnNfam91cm5hbF9kZXYpIHsKKwkJCXJlbW92ZV9qb3VybmFsX2RldmljZShmcyk7CisJCX0KKwl9CisJaWYgKGpvdXJuYWwgJiYgIW9sZF9qb3VybmFsKSB7CisJCS8qCisJCSAqIElmIGFkZGluZyBhIGpvdXJuYWwgZmxhZywgbGV0IHRoZSBjcmVhdGUgam91cm5hbAorCQkgKiBjb2RlIGJlbG93IGhhbmRsZSBjcmVhdGluZyBzZXR0aW5nIHRoZSBmbGFnIGFuZAorCQkgKiBjcmVhdGluZyB0aGUgam91cm5hbC4gIFdlIHN1cHBseSBhIGRlZmF1bHQgc2l6ZSBpZgorCQkgKiBuZWNlc3NhcnkuCisJCSAqLworCQlpZiAoIWpvdXJuYWxfc2l6ZSkKKwkJCWpvdXJuYWxfc2l6ZSA9IC0xOworCQlzYi0+c19mZWF0dXJlX2NvbXBhdCAmPSB+RVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTDsKKwl9CisJaWYgKGR4ZGlyICYmICFvbGRfZHhkaXIpIHsKKwkJaWYgKCFzYi0+c19kZWZfaGFzaF92ZXJzaW9uKQorCQkJc2ItPnNfZGVmX2hhc2hfdmVyc2lvbiA9IEVYVDJfSEFTSF9URUE7CisJCWlmICh1dWlkX2lzX251bGwoKHVuc2lnbmVkIGNoYXIgKikgc2ItPnNfaGFzaF9zZWVkKSkKKwkJCXV1aWRfZ2VuZXJhdGUoKHVuc2lnbmVkIGNoYXIgKikgc2ItPnNfaGFzaF9zZWVkKTsKKwl9CisKKwlpZiAoc2ItPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWICYmCisJICAgIChzYi0+c19mZWF0dXJlX2NvbXBhdCB8fCBzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCB8fAorCSAgICAgc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCkpCisJCWV4dDJmc191cGRhdGVfZHluYW1pY19yZXYoZnMpOworCWlmICgoc3BhcnNlICE9IG9sZF9zcGFyc2UpIHx8CisJICAgIChmaWxldHlwZSAhPSBvbGRfZmlsZXR5cGUpKSB7CisJCXNiLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworCQlwcmludGYoIlxuJXNcbiIsIHBsZWFzZV9mc2NrKTsKKwl9CisJaWYgKChvbGRfY29tcGF0ICE9IHNiLT5zX2ZlYXR1cmVfY29tcGF0KSB8fAorCSAgICAob2xkX3JvX2NvbXBhdCAhPSBzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCkgfHwKKwkgICAgKG9sZF9pbmNvbXBhdCAhPSBzYi0+c19mZWF0dXJlX2luY29tcGF0KSkKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworfQorCisvKgorICogQWRkIGEgam91cm5hbCB0byB0aGUgZmlsZXN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgYWRkX2pvdXJuYWwoZXh0Ml9maWxzeXMgZnMpCit7CisJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmCisJICAgIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlRoZSBmaWxlc3lzdGVtIGFscmVhZHkgaGFzIGEgam91cm5hbCIpOworCX0KKwlpZiAoam91cm5hbF9kZXZpY2UpIHsKKwkJbWFrZV9qb3VybmFsX2RldmljZShqb3VybmFsX2RldmljZSwgZnMsIDAsIDApOworCX0gZWxzZSBpZiAoam91cm5hbF9zaXplKSB7CisJCW1ha2Vfam91cm5hbF9ibG9ja3MoZnMsIGpvdXJuYWxfc2l6ZSwgam91cm5hbF9mbGFncywgMCk7CisJCS8qCisJCSAqIElmIHRoZSBmaWxlc3lzdGVtIHdhc24ndCBtb3VudGVkLCB3ZSBuZWVkIHRvIGZvcmNlCisJCSAqIHRoZSBibG9jayBncm91cCBkZXNjcmlwdG9ycyBvdXQuCisJCSAqLworCQlpZiAoKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9NT1VOVEVEKSA9PSAwKQorCQkJZnMtPmZsYWdzICY9IH5FWFQyX0ZMQUdfU1VQRVJfT05MWTsKKwl9CisJcHJpbnRfY2hlY2tfbWVzc2FnZShmcyk7Cit9CisKKy8qCisgKiBCdXN5Ym94IHN0dWZmCisgKi8KK3N0YXRpYyBjaGFyICogeF9ibGtpZF9nZXRfZGV2bmFtZShjb25zdCBjaGFyICp0b2tlbikKK3sKKwljaGFyICogZGV2X25hbWU7CisKKwlpZiAoIShkZXZfbmFtZSA9IGJsa2lkX2dldF9kZXZuYW1lKE5VTEwsIHRva2VuLCBOVUxMKSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJVbmFibGUgdG8gcmVzb2x2ZSAnJXMnIiwgdG9rZW4pOworCXJldHVybiBkZXZfbmFtZTsKK30KKworI2lmZGVmIENPTkZJR19FMkxBQkVMCitzdGF0aWMgdm9pZCBwYXJzZV9lMmxhYmVsX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKwlpZiAoKGFyZ2MgPCAyKSB8fCAoYXJnYyA+IDMpKQorCQliYl9zaG93X3VzYWdlKCk7CisJaW9fb3B0aW9ucyA9IHN0cmNocihhcmd2WzFdLCAnPycpOworCWlmIChpb19vcHRpb25zKQorCQkqaW9fb3B0aW9ucysrID0gMDsKKwlkZXZpY2VfbmFtZSA9IHhfYmxraWRfZ2V0X2Rldm5hbWUoYXJndlsxXSk7CisJaWYgKGFyZ2MgPT0gMykgeworCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlcgfCBFWFQyX0ZMQUdfSk9VUk5BTF9ERVZfT0s7CisJCUxfZmxhZyA9IDE7CisJCW5ld19sYWJlbCA9IGFyZ3ZbMl07CisJfSBlbHNlCisJCXByaW50X2xhYmVsKys7Cit9CisjZWxzZQorI2RlZmluZSBwYXJzZV9lMmxhYmVsX29wdGlvbnMoeCx5KQorI2VuZGlmCisKK3N0YXRpYyB0aW1lX3QgcGFyc2VfdGltZShjaGFyICpzdHIpCit7CisJc3RydWN0CXRtCXRzOworCisJaWYgKHN0cmNtcChzdHIsICJub3ciKSA9PSAwKSB7CisJCXJldHVybiB0aW1lKDApOworCX0KKwltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKKyNpZmRlZiBIQVZFX1NUUlBUSU1FCisJc3RycHRpbWUoc3RyLCAiJVklbSVkJUglTSVTIiwgJnRzKTsKKyNlbHNlCisJc3NjYW5mKHN0ciwgIiU0ZCUyZCUyZCUyZCUyZCUyZCIsICZ0cy50bV95ZWFyLCAmdHMudG1fbW9uLAorCSAgICAgICAmdHMudG1fbWRheSwgJnRzLnRtX2hvdXIsICZ0cy50bV9taW4sICZ0cy50bV9zZWMpOworCXRzLnRtX3llYXIgLT0gMTkwMDsKKwl0cy50bV9tb24gLT0gMTsKKwlpZiAodHMudG1feWVhciA8IDAgfHwgdHMudG1fbW9uIDwgMCB8fCB0cy50bV9tb24gPiAxMSB8fAorCSAgICB0cy50bV9tZGF5IDwgMCB8fCB0cy50bV9tZGF5ID4gMzEgfHwgdHMudG1faG91ciA+IDIzIHx8CisJICAgIHRzLnRtX21pbiA+IDU5IHx8IHRzLnRtX3NlYyA+IDYxKQorCQl0cy50bV9tZGF5ID0gMDsKKyNlbmRpZgorCWlmICh0cy50bV9tZGF5ID09IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHBhcnNlIGRhdGUvdGltZSBzcGVjaWZpZXI6ICVzIiwgc3RyKTsKKwl9CisJcmV0dXJuIG1rdGltZSgmdHMpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV90dW5lMmZzX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjOworCWNoYXIgKiB0bXA7CisKKwlwcmludGYoInR1bmUyZnMgJXMgKCVzKVxuIiwgRTJGU1BST0dTX1ZFUlNJT04sIEUyRlNQUk9HU19EQVRFKTsKKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImM6ZTpmZzppOmpsbTpvOnI6czp1OkM6SjpMOk06TzpUOlU6IikpICE9IEVPRikKKwkJc3dpdGNoIChjKQorCQl7CisJCQljYXNlICdjJzoKKwkJCQltYXhfbW91bnRfY291bnQgPSB4YXRvdV9yYW5nZShvcHRhcmcsIDAsIDE2MDAwKTsKKwkJCQlpZiAobWF4X21vdW50X2NvdW50ID09IDApCisJCQkJCW1heF9tb3VudF9jb3VudCA9IC0xOworCQkJCWNfZmxhZyA9IDE7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCQkJY2FzZSAnQyc6CisJCQkJbW91bnRfY291bnQgPSB4YXRvdV9yYW5nZShvcHRhcmcsIDAsIDE2MDAwKTsKKwkJCQlDX2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2UnOgorCQkJCWlmIChzdHJjbXAgKG9wdGFyZywgImNvbnRpbnVlIikgPT0gMCkKKwkJCQkJZXJyb3JzID0gRVhUMl9FUlJPUlNfQ09OVElOVUU7CisJCQkJZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJyZW1vdW50LXJvIikgPT0gMCkKKwkJCQkJZXJyb3JzID0gRVhUMl9FUlJPUlNfUk87CisJCQkJZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJwYW5pYyIpID09IDApCisJCQkJCWVycm9ycyA9IEVYVDJfRVJST1JTX1BBTklDOworCQkJCWVsc2UgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGVycm9yIGJlaGF2aW9yIC0gJXMiLCBvcHRhcmcpOworCQkJCX0KKwkJCQllX2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2YnOiAvKiBGb3JjZSAqLworCQkJCWZfZmxhZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdnJzoKKwkJCQlyZXNnaWQgPSBiYl9zdHJ0b3VsKG9wdGFyZywgTlVMTCwgMTApOworCQkJCWlmIChlcnJubykKKwkJCQkJcmVzZ2lkID0geGdyb3VwMmdpZChvcHRhcmcpOworCQkJCWdfZmxhZyA9IDE7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCQkJY2FzZSAnaSc6CisJCQkJaW50ZXJ2YWwgPSBzdHJ0b3VsKG9wdGFyZywgJnRtcCwgMCk7CisJCQkJc3dpdGNoICgqdG1wKSB7CisJCQkJY2FzZSAncyc6CisJCQkJCXRtcCsrOworCQkJCQlicmVhazsKKwkJCQljYXNlICdcMCc6CisJCQkJY2FzZSAnZCc6CisJCQkJY2FzZSAnRCc6IC8qIGRheXMgKi8KKwkJCQkJaW50ZXJ2YWwgKj0gODY0MDA7CisJCQkJCWlmICgqdG1wICE9ICdcMCcpCisJCQkJCQl0bXArKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnbSc6CisJCQkJY2FzZSAnTSc6IC8qIG1vbnRocyEgKi8KKwkJCQkJaW50ZXJ2YWwgKj0gODY0MDAgKiAzMDsKKwkJCQkJdG1wKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3cnOgorCQkJCWNhc2UgJ1cnOiAvKiB3ZWVrcyAqLworCQkJCQlpbnRlcnZhbCAqPSA4NjQwMCAqIDc7CisJCQkJCXRtcCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCp0bXAgfHwgaW50ZXJ2YWwgPiAoMzY1ICogODY0MDApKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgaW50ZXJ2YWwgLSAlcyIsIG9wdGFyZyk7CisJCQkJfQorCQkJCWlfZmxhZyA9IDE7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCQkJY2FzZSAnaic6CisJCQkJaWYgKCFqb3VybmFsX3NpemUpCisJCQkJCWpvdXJuYWxfc2l6ZSA9IC0xOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0onOgorCQkJCXBhcnNlX2pvdXJuYWxfb3B0cygmam91cm5hbF9kZXZpY2UsICZqb3VybmFsX2ZsYWdzLCAmam91cm5hbF9zaXplLCBvcHRhcmcpOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCWxfZmxhZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdMJzoKKwkJCQluZXdfbGFiZWwgPSBvcHRhcmc7CisJCQkJTF9mbGFnID0gMTsKKwkJCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlcgfAorCQkJCQlFWFQyX0ZMQUdfSk9VUk5BTF9ERVZfT0s7CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCQlyZXNlcnZlZF9yYXRpbyA9IHhhdG91X3JhbmdlKG9wdGFyZywgMCwgNTApOworCQkJCW1fZmxhZyA9IDE7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCQkJY2FzZSAnTSc6CisJCQkJbmV3X2xhc3RfbW91bnRlZCA9IG9wdGFyZzsKKwkJCQlNX2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ28nOgorCQkJCWlmIChtbnRvcHRzX2NtZCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiLW8gbWF5IG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UiKTsKKwkJCQl9CisJCQkJbW50b3B0c19jbWQgPSBvcHRhcmc7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCisJCQljYXNlICdPJzoKKwkJCQlpZiAoZmVhdHVyZXNfY21kKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCItTyBtYXkgb25seSBiZSBzcGVjaWZpZWQgb25jZSIpOworCQkJCX0KKwkJCQlmZWF0dXJlc19jbWQgPSBvcHRhcmc7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCQkJY2FzZSAncic6CisJCQkJcmVzZXJ2ZWRfYmxvY2tzID0geGF0b3VsKG9wdGFyZyk7CisJCQkJcl9mbGFnID0gMTsKKwkJCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlc7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoKKwkJCQlzX2ZsYWcgPSBhdG9pKG9wdGFyZyk7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCQkJY2FzZSAnVCc6CisJCQkJVF9mbGFnID0gMTsKKwkJCQlsYXN0X2NoZWNrX3RpbWUgPSBwYXJzZV90aW1lKG9wdGFyZyk7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCQkJY2FzZSAndSc6CisJCQkJcmVzdWlkID0gYmJfc3RydG91bChvcHRhcmcsIE5VTEwsIDEwKTsKKwkJCQlpZiAoZXJybm8pCisJCQkJCXJlc3VpZCA9IHh1bmFtZTJ1aWQob3B0YXJnKTsKKwkJCQl1X2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1UnOgorCQkJCW5ld19VVUlEID0gb3B0YXJnOworCQkJCVVfZmxhZyA9IDE7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXIHwKKwkJCQkJRVhUMl9GTEFHX0pPVVJOQUxfREVWX09LOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwlpZiAob3B0aW5kIDwgYXJnYyAtIDEgfHwgb3B0aW5kID09IGFyZ2MpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAoIW9wZW5fZmxhZyAmJiAhbF9mbGFnKQorCQliYl9zaG93X3VzYWdlKCk7CisJaW9fb3B0aW9ucyA9IHN0cmNocihhcmd2W29wdGluZF0sICc/Jyk7CisJaWYgKGlvX29wdGlvbnMpCisJCSppb19vcHRpb25zKysgPSAwOworCWRldmljZV9uYW1lID0geF9ibGtpZF9nZXRfZGV2bmFtZShhcmd2W29wdGluZF0pOworfQorCitzdGF0aWMgdm9pZCB0dW5lMmZzX2NsZWFuX3VwKHZvaWQpCit7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQICYmIGRldmljZV9uYW1lKSBmcmVlKGRldmljZV9uYW1lKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgam91cm5hbF9kZXZpY2UpIGZyZWUoam91cm5hbF9kZXZpY2UpOworfQorCitpbnQgdHVuZTJmc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHVuZTJmc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwllcnJjb2RlX3QgcmV0dmFsOworCWV4dDJfZmlsc3lzIGZzOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYjsKKwlpb19tYW5hZ2VyIGlvX3B0cjsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJYXRleGl0KHR1bmUyZnNfY2xlYW5fdXApOworCisJaWYgKEVOQUJMRV9FMkxBQkVMICYmIChhcHBsZXRfbmFtZVswXSA9PSAnZScpKSAvKiBlMmxhYmVsICovCisJCXBhcnNlX2UybGFiZWxfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKwllbHNlCisJCXBhcnNlX3R1bmUyZnNfb3B0aW9ucyhhcmdjLCBhcmd2KTsgIC8qIHR1bmUyZnMgKi8KKworCWlvX3B0ciA9IHVuaXhfaW9fbWFuYWdlcjsKKwlyZXR2YWwgPSBleHQyZnNfb3BlbjIoZGV2aWNlX25hbWUsIGlvX29wdGlvbnMsIG9wZW5fZmxhZywKKwkJCSAgICAgIDAsIDAsIGlvX3B0ciwgJmZzKTsKKwlpZiAocmV0dmFsKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiTm8gdmFsaWQgc3VwZXJibG9jayBvbiAlcyIsIGRldmljZV9uYW1lKTsKKwlzYiA9IGZzLT5zdXBlcjsKKwlpZiAocHJpbnRfbGFiZWwpIHsKKwkJLyogRm9yIGUybGFiZWwgZW11bGF0aW9uICovCisJCXByaW50ZigiJS4qc1xuIiwgKGludCkgc2l6ZW9mKHNiLT5zX3ZvbHVtZV9uYW1lKSwKKwkJICAgICAgIHNiLT5zX3ZvbHVtZV9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IGV4dDJmc19jaGVja19pZl9tb3VudGVkKGRldmljZV9uYW1lLCAmbW91bnRfZmxhZ3MpOworCWlmIChyZXR2YWwpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBkZXRlcm1pbmUgaWYgJXMgaXMgbW91bnRlZCIsIGRldmljZV9uYW1lKTsKKwkvKiBOb3JtYWxseSB3ZSBvbmx5IG5lZWQgdG8gd3JpdGUgb3V0IHRoZSBzdXBlcmJsb2NrICovCisJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19TVVBFUl9PTkxZOworCisJaWYgKGNfZmxhZykgeworCQlzYi0+c19tYXhfbW50X2NvdW50ID0gbWF4X21vdW50X2NvdW50OworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCXByaW50ZigiU2V0dGluZyBtYXhpbWFsIG1vdW50IGNvdW50IHRvICVkXG4iLCBtYXhfbW91bnRfY291bnQpOworCX0KKwlpZiAoQ19mbGFnKSB7CisJCXNiLT5zX21udF9jb3VudCA9IG1vdW50X2NvdW50OworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCXByaW50ZigiU2V0dGluZyBjdXJyZW50IG1vdW50IGNvdW50IHRvICVkXG4iLCBtb3VudF9jb3VudCk7CisJfQorCWlmIChlX2ZsYWcpIHsKKwkJc2ItPnNfZXJyb3JzID0gZXJyb3JzOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCXByaW50ZigiU2V0dGluZyBlcnJvciBiZWhhdmlvciB0byAlZFxuIiwgZXJyb3JzKTsKKwl9CisJaWYgKGdfZmxhZykgeworCQlzYi0+c19kZWZfcmVzZ2lkID0gcmVzZ2lkOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCXByaW50ZigiU2V0dGluZyByZXNlcnZlZCBibG9ja3MgZ2lkIHRvICVsdVxuIiwgcmVzZ2lkKTsKKwl9CisJaWYgKGlfZmxhZykgeworCQlzYi0+c19jaGVja2ludGVydmFsID0gaW50ZXJ2YWw7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJcHJpbnRmKCJTZXR0aW5nIGludGVydmFsIGJldHdlZW4gY2hlY2sgJWx1IHNlY29uZHNcbiIsIGludGVydmFsKTsKKwl9CisJaWYgKG1fZmxhZykgeworCQlzYi0+c19yX2Jsb2Nrc19jb3VudCA9IChzYi0+c19ibG9ja3NfY291bnQgLyAxMDApCisJCQkJKiByZXNlcnZlZF9yYXRpbzsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQlwcmludGYoIlNldHRpbmcgcmVzZXJ2ZWQgYmxvY2tzIHBlcmNlbnRhZ2UgdG8gJXUgKCV1IGJsb2NrcylcbiIsCisJCQlyZXNlcnZlZF9yYXRpbywgc2ItPnNfcl9ibG9ja3NfY291bnQpOworCX0KKwlpZiAocl9mbGFnKSB7CisJCWlmIChyZXNlcnZlZF9ibG9ja3MgPj0gc2ItPnNfYmxvY2tzX2NvdW50LzIpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVzZXJ2ZWQgYmxvY2tzIGNvdW50IGlzIHRvbyBiaWcgKCVsdSkiLCByZXNlcnZlZF9ibG9ja3MpOworCQlzYi0+c19yX2Jsb2Nrc19jb3VudCA9IHJlc2VydmVkX2Jsb2NrczsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQlwcmludGYoIlNldHRpbmcgcmVzZXJ2ZWQgYmxvY2tzIGNvdW50IHRvICVsdVxuIiwgcmVzZXJ2ZWRfYmxvY2tzKTsKKwl9CisJaWYgKHNfZmxhZyA9PSAxKSB7CisJCWlmIChzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJCSAgICBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikKKwkJCWJiX2Vycm9yX21zZygiXG5UaGUgZmlsZXN5c3RlbSBhbHJlYWR5IGhhcyBzcGFyc2Ugc3VwZXJibG9ja3MiKTsKKwkJZWxzZSB7CisJCQlzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCB8PQorCQkJCUVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSOworCQkJc2ItPnNfc3RhdGUgJj0gfkVYVDJfVkFMSURfRlM7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCQlwcmludGYoIlxuU3BhcnNlIHN1cGVyYmxvY2sgZmxhZyBzZXQuICAlcyIsIHBsZWFzZV9mc2NrKTsKKwkJfQorCX0KKwlpZiAoc19mbGFnID09IDApIHsKKwkJaWYgKCEoc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJgorCQkgICAgICBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpCisJCQliYl9lcnJvcl9tc2coIlxuVGhlIGZpbGVzeXN0ZW0gYWxyZWFkeSBoYXMgc3BhcnNlIHN1cGVyYmxvY2tzIGRpc2FibGVkIik7CisJCWVsc2UgeworCQkJc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJj0KKwkJCQl+RVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVI7CisJCQlzYi0+c19zdGF0ZSAmPSB+RVhUMl9WQUxJRF9GUzsKKwkJCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfTUFTVEVSX1NCX09OTFk7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCQlwcmludGYoIlxuU3BhcnNlIHN1cGVyYmxvY2sgZmxhZyBjbGVhcmVkLiAgJXMiLCBwbGVhc2VfZnNjayk7CisJCX0KKwl9CisJaWYgKFRfZmxhZykgeworCQlzYi0+c19sYXN0Y2hlY2sgPSBsYXN0X2NoZWNrX3RpbWU7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJcHJpbnRmKCJTZXR0aW5nIHRpbWUgZmlsZXN5c3RlbSBsYXN0IGNoZWNrZWQgdG8gJXNcbiIsCisJCSAgICAgICBjdGltZSgmbGFzdF9jaGVja190aW1lKSk7CisJfQorCWlmICh1X2ZsYWcpIHsKKwkJc2ItPnNfZGVmX3Jlc3VpZCA9IHJlc3VpZDsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQlwcmludGYoIlNldHRpbmcgcmVzZXJ2ZWQgYmxvY2tzIHVpZCB0byAlbHVcbiIsIHJlc3VpZCk7CisJfQorCWlmIChMX2ZsYWcpIHsKKwkJaWYgKHN0cmxlbihuZXdfbGFiZWwpID4gc2l6ZW9mKHNiLT5zX3ZvbHVtZV9uYW1lKSkKKwkJCWJiX2Vycm9yX21zZygiV2FybmluZzogbGFiZWwgdG9vIGxvbmcsIHRydW5jYXRpbmciKTsKKwkJbWVtc2V0KHNiLT5zX3ZvbHVtZV9uYW1lLCAwLCBzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKwkJc2FmZV9zdHJuY3B5KHNiLT5zX3ZvbHVtZV9uYW1lLCBuZXdfbGFiZWwsCisJCQlzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCX0KKwlpZiAoTV9mbGFnKSB7CisJCW1lbXNldChzYi0+c19sYXN0X21vdW50ZWQsIDAsIHNpemVvZihzYi0+c19sYXN0X21vdW50ZWQpKTsKKwkJc2FmZV9zdHJuY3B5KHNiLT5zX2xhc3RfbW91bnRlZCwgbmV3X2xhc3RfbW91bnRlZCwKKwkJCXNpemVvZihzYi0+c19sYXN0X21vdW50ZWQpKTsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCX0KKwlpZiAobW50b3B0c19jbWQpCisJCXVwZGF0ZV9tbnRvcHRzKGZzLCBtbnRvcHRzX2NtZCk7CisJaWYgKGZlYXR1cmVzX2NtZCkKKwkJdXBkYXRlX2ZlYXR1cmVfc2V0KGZzLCBmZWF0dXJlc19jbWQpOworCWlmIChqb3VybmFsX3NpemUgfHwgam91cm5hbF9kZXZpY2UpCisJCWFkZF9qb3VybmFsKGZzKTsKKworCWlmIChVX2ZsYWcpIHsKKwkJaWYgKChzdHJjYXNlY21wKG5ld19VVUlELCAibnVsbCIpID09IDApIHx8CisJCSAgICAoc3RyY2FzZWNtcChuZXdfVVVJRCwgImNsZWFyIikgPT0gMCkpIHsKKwkJCXV1aWRfY2xlYXIoc2ItPnNfdXVpZCk7CisJCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChuZXdfVVVJRCwgInRpbWUiKSA9PSAwKSB7CisJCQl1dWlkX2dlbmVyYXRlX3RpbWUoc2ItPnNfdXVpZCk7CisJCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChuZXdfVVVJRCwgInJhbmRvbSIpID09IDApIHsKKwkJCXV1aWRfZ2VuZXJhdGUoc2ItPnNfdXVpZCk7CisJCX0gZWxzZSBpZiAodXVpZF9wYXJzZShuZXdfVVVJRCwgc2ItPnNfdXVpZCkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJJbnZhbGlkIFVVSUQgZm9ybWF0Iik7CisJCX0KKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCX0KKworCWlmIChsX2ZsYWcpCisJCWxpc3Rfc3VwZXIgKHNiKTsKKwlyZXR1cm4gKGV4dDJmc19jbG9zZSAoZnMpID8gMSA6IDApOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXRpbC5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWFiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dGlsLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHV0aWwuYyAtLS0gaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGJ5IHR1bmUyZnMgYW5kIG1rZTJmcworICoKKyAqIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIGJ5IFRoZW9kb3JlIFRzJ28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgImUyZnNiYi5oIgorI2luY2x1ZGUgImUycC9lMnAuaCIKKyNpbmNsdWRlICJleHQyZnMvZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy9leHQyZnMuaCIKKyNpbmNsdWRlICJibGtpZC9ibGtpZC5oIgorI2luY2x1ZGUgInV0aWwuaCIKKwordm9pZCBwcm9jZWVkX3F1ZXN0aW9uKHZvaWQpCit7CisJZnB1dHMoIlByb2NlZWQgYW55d2F5PyAoeSxuKSAiLCBzdGRvdXQpOworCWlmIChiYl9hc2tfY29uZmlybWF0aW9uKCkgPT0gMCkKKwkJZXhpdCgxKTsKK30KKwordm9pZCBjaGVja19wbGF1c2liaWxpdHkoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgZm9yY2UpCit7CisJaW50IHZhbDsKKwlzdHJ1Y3Qgc3RhdCBzOworCXZhbCA9IHN0YXQoZGV2aWNlLCAmcyk7CisJaWYgKGZvcmNlKQorCQlyZXR1cm47CisJaWYgKHZhbCA9PSAtMSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzdGF0ICclcyciLCBkZXZpY2UpOworCWlmICghU19JU0JMSyhzLnN0X21vZGUpKSB7CisJCXByaW50ZigiJXMgaXMgbm90IGEgYmxvY2sgc3BlY2lhbCBkZXZpY2UuXG4iLCBkZXZpY2UpOworCQlwcm9jZWVkX3F1ZXN0aW9uKCk7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBIQVZFX0xJTlVYX01BSk9SX0gKKyNpZm5kZWYgTUFKT1IKKyNkZWZpbmUgTUFKT1IoZGV2KQkoKGRldik+PjgpCisjZGVmaW5lIE1JTk9SKGRldikJKChkZXYpICYgMHhmZikKKyNlbmRpZgorI2lmbmRlZiBTQ1NJX0JMS19NQUpPUgorI2lmZGVmIFNDU0lfRElTSzBfTUFKT1IKKyNpZmRlZiBTQ1NJX0RJU0s4X01BSk9SCisjZGVmaW5lIFNDU0lfRElTS19NQUpPUihNKSAoKE0pID09IFNDU0lfRElTSzBfTUFKT1IgfHwgXAorICAoKE0pID49IFNDU0lfRElTSzFfTUFKT1IgJiYgKE0pIDw9IFNDU0lfRElTSzdfTUFKT1IpIHx8IFwKKyAgKChNKSA+PSBTQ1NJX0RJU0s4X01BSk9SICYmIChNKSA8PSBTQ1NJX0RJU0sxNV9NQUpPUikpCisjZWxzZQorI2RlZmluZSBTQ1NJX0RJU0tfTUFKT1IoTSkgKChNKSA9PSBTQ1NJX0RJU0swX01BSk9SIHx8IFwKKyAgKChNKSA+PSBTQ1NJX0RJU0sxX01BSk9SICYmIChNKSA8PSBTQ1NJX0RJU0s3X01BSk9SKSkKKyNlbmRpZiAvKiBkZWZpbmVkKFNDU0lfRElTSzhfTUFKT1IpICovCisjZGVmaW5lIFNDU0lfQkxLX01BSk9SKE0pIChTQ1NJX0RJU0tfTUFKT1IoKE0pKSB8fCAoTSkgPT0gU0NTSV9DRFJPTV9NQUpPUikKKyNlbHNlCisjZGVmaW5lIFNDU0lfQkxLX01BSk9SKE0pICAoKE0pID09IFNDU0lfRElTS19NQUpPUiB8fCAoTSkgPT0gU0NTSV9DRFJPTV9NQUpPUikKKyNlbmRpZiAvKiBkZWZpbmVkKFNDU0lfRElTSzBfTUFKT1IpICovCisjZW5kaWYgLyogZGVmaW5lZChTQ1NJX0JMS19NQUpPUikgKi8KKwlpZiAoKChNQUpPUihzLnN0X3JkZXYpID09IEhEX01BSk9SICYmCisJICAgICAgTUlOT1Iocy5zdF9yZGV2KSU2NCA9PSAwKSB8fAorCSAgICAgKFNDU0lfQkxLX01BSk9SKE1BSk9SKHMuc3RfcmRldikpICYmCisJICAgICAgTUlOT1Iocy5zdF9yZGV2KSUxNiA9PSAwKSkpIHsKKwkJcHJpbnRmKCIlcyBpcyBlbnRpcmUgZGV2aWNlLCBub3QganVzdCBvbmUgcGFydGl0aW9uIVxuIiwgZGV2aWNlKTsKKwkJcHJvY2VlZF9xdWVzdGlvbigpOworCX0KKyNlbmRpZgorfQorCit2b2lkIGNoZWNrX21vdW50KGNvbnN0IGNoYXIgKmRldmljZSwgaW50IGZvcmNlLCBjb25zdCBjaGFyICp0eXBlKQoreworCWVycmNvZGVfdCByZXR2YWw7CisJaW50IG1vdW50X2ZsYWdzOworCisJcmV0dmFsID0gZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQoZGV2aWNlLCAmbW91bnRfZmxhZ3MpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBkZXRlcm1pbmUgaWYgJXMgaXMgbW91bnRlZCIsIGRldmljZSk7CisJCXJldHVybjsKKwl9CisJaWYgKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9NT1VOVEVEKSB7CisJCWJiX2Vycm9yX21zZygiJXMgaXMgbW91bnRlZCAhIiwgZGV2aWNlKTsKK2ZvcmNlX2NoZWNrOgorCQlpZiAoZm9yY2UpCisJCQliYl9lcnJvcl9tc2coImJhZGJsb2NrcyBmb3JjZWQgYW55d2F5cyIpOworCQllbHNlCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaXQncyBub3Qgc2FmZSB0byBydW4gYmFkYmxvY2tzISIpOworCX0KKworCWlmIChtb3VudF9mbGFncyAmIEVYVDJfTUZfQlVTWSkgeworCQliYl9lcnJvcl9tc2coIiVzIGlzIGFwcGFyZW50bHkgaW4gdXNlIGJ5IHRoZSBzeXN0ZW0iLCBkZXZpY2UpOworCQlnb3RvIGZvcmNlX2NoZWNrOworCX0KK30KKwordm9pZCBwYXJzZV9qb3VybmFsX29wdHMoY2hhciAqKmpvdXJuYWxfZGV2aWNlLCBpbnQgKmpvdXJuYWxfZmxhZ3MsCisJCQlpbnQgKmpvdXJuYWxfc2l6ZSwgY29uc3QgY2hhciAqb3B0cykKK3sKKwljaGFyICpidWYsICp0b2tlbiwgKm5leHQsICpwLCAqYXJnOworCWludCBqb3VybmFsX3VzYWdlID0gMDsKKwlidWYgPSB4c3RyZHVwKG9wdHMpOworCWZvciAodG9rZW4gPSBidWY7IHRva2VuICYmICp0b2tlbjsgdG9rZW4gPSBuZXh0KSB7CisJCXAgPSBzdHJjaHIodG9rZW4sICcsJyk7CisJCW5leHQgPSAwOworCQlpZiAocCkgeworCQkJKnAgPSAwOworCQkJbmV4dCA9IHArMTsKKwkJfQorCQlhcmcgPSBzdHJjaHIodG9rZW4sICc9Jyk7CisJCWlmIChhcmcpIHsKKwkJCSphcmcgPSAwOworCQkJYXJnKys7CisJCX0KKwkJaWYgKHN0cmNtcCh0b2tlbiwgImRldmljZSIpID09IDApIHsKKwkJCSpqb3VybmFsX2RldmljZSA9IGJsa2lkX2dldF9kZXZuYW1lKE5VTEwsIGFyZywgTlVMTCk7CisJCQlpZiAoIWpvdXJuYWxfZGV2aWNlKSB7CisJCQkJam91cm5hbF91c2FnZSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgInNpemUiKSA9PSAwKSB7CisJCQlpZiAoIWFyZykgeworCQkJCWpvdXJuYWxfdXNhZ2UrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSgqam91cm5hbF9zaXplKSA9IHN0cnRvdWwoYXJnLCAmcCwgMCk7CisJCQlpZiAoKnApCisJCQkJam91cm5hbF91c2FnZSsrOworCQl9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgInYxX3N1cGVyYmxvY2siKSA9PSAwKSB7CisJCQkoKmpvdXJuYWxfZmxhZ3MpIHw9IEVYVDJfTUtKT1VSTkFMX1YxX1NVUEVSOworCQkJY29udGludWU7CisJCX0gZWxzZQorCQkJam91cm5hbF91c2FnZSsrOworCX0KKwlpZiAoam91cm5hbF91c2FnZSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkiXG5CYWQgam91cm5hbCBvcHRpb25zIHNwZWNpZmllZC5cblxuIgorCQkJIkpvdXJuYWwgb3B0aW9ucyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcywgIgorCQkJImFuZCBtYXkgdGFrZSBhbiBhcmd1bWVudCB3aGljaFxuIgorCQkJIlx0aXMgc2V0IG9mZiBieSBhbiBlcXVhbHMgKCc9Jykgc2lnbi5cblxuIgorCQkJIlZhbGlkIGpvdXJuYWwgb3B0aW9ucyBhcmU6XG4iCisJCQkiXHRzaXplPTxqb3VybmFsIHNpemUgaW4gbWVnYWJ5dGVzPlxuIgorCQkJIlx0ZGV2aWNlPTxqb3VybmFsIGRldmljZT5cblxuIgorCQkJIlRoZSBqb3VybmFsIHNpemUgbXVzdCBiZSBiZXR3ZWVuICIKKwkJCSIxMDI0IGFuZCAxMDI0MDAgZmlsZXN5c3RlbSBibG9ja3MuXG5cbiIpOworfQorCisvKgorICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygam91cm5hbCBibG9ja3MgdG8gdXNlLCBlaXRoZXIgdmlhCisgKiB1c2VyLXNwZWNpZmllZCAjIG9mIG1lZ2FieXRlcywgb3IgdmlhIHNvbWUgaW50ZWxsaWdlbnRseSBzZWxlY3RlZAorICogZGVmYXVsdHMuCisgKgorICogRmluZCBhIHJlYXNvbmFibGUgam91cm5hbCBmaWxlIHNpemUgKGluIGJsb2NrcykgZ2l2ZW4gdGhlIG51bWJlciBvZiBibG9ja3MKKyAqIGluIHRoZSBmaWxlc3lzdGVtLiAgRm9yIHZlcnkgc21hbGwgZmlsZXN5c3RlbXMsIGl0IGlzIG5vdCByZWFzb25hYmxlIHRvCisgKiBoYXZlIGEgam91cm5hbCB0aGF0IGZpbGxzIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBmaWxlc3lzdGVtLgorICovCitpbnQgZmlndXJlX2pvdXJuYWxfc2l6ZShpbnQgc2l6ZSwgZXh0Ml9maWxzeXMgZnMpCit7CisJYmxrX3Qgal9ibG9ja3M7CisKKwlpZiAoZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCA8IDIwNDgpIHsKKwkJYmJfZXJyb3JfbXNnKCJGaWxlc3lzdGVtIHRvbyBzbWFsbCBmb3IgYSBqb3VybmFsIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzaXplID49IDApIHsKKwkJal9ibG9ja3MgPSBzaXplICogMTAyNCAvIChmcy0+YmxvY2tzaXplCS8gMTAyNCk7CisJCWlmIChqX2Jsb2NrcyA8IDEwMjQgfHwgal9ibG9ja3MgPiAxMDI0MDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiXG5UaGUgcmVxdWVzdGVkIGpvdXJuYWwgIgorCQkJCSJzaXplIGlzICVkIGJsb2NrcztcbiBpdCBtdXN0IGJlICIKKwkJCQkiYmV0d2VlbiAxMDI0IGFuZCAxMDI0MDAgYmxvY2tzOyBBYm9ydGluZyIsCisJCQkJal9ibG9ja3MpOworCQlpZiAoal9ibG9ja3MgPiBmcy0+c3VwZXItPnNfZnJlZV9ibG9ja3NfY291bnQpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiSm91cm5hbCBzaXplIHRvbyBiaWcgZm9yIGZpbGVzeXN0ZW0iKTsKKwkJcmV0dXJuIGpfYmxvY2tzOworCX0KKworCWlmIChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IDwgMzI3NjgpCisJCWpfYmxvY2tzID0gMTAyNDsKKwllbHNlIGlmIChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IDwgMjU2KjEwMjQpCisJCWpfYmxvY2tzID0gNDA5NjsKKwllbHNlIGlmIChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IDwgNTEyKjEwMjQpCisJCWpfYmxvY2tzID0gODE5MjsKKwllbHNlIGlmIChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IDwgMTAyNCoxMDI0KQorCQlqX2Jsb2NrcyA9IDE2Mzg0OworCWVsc2UKKwkJal9ibG9ja3MgPSAzMjc2ODsKKworCXJldHVybiBqX2Jsb2NrczsKK30KKwordm9pZCBwcmludF9jaGVja19tZXNzYWdlKGV4dDJfZmlsc3lzIGZzKQoreworCXByaW50ZigiVGhpcyBmaWxlc3lzdGVtIHdpbGwgYmUgYXV0b21hdGljYWxseSAiCisJCSAiY2hlY2tlZCBldmVyeSAlZCBtb3VudHMgb3JcbiIKKwkJICIlZyBkYXlzLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuICAiCisJCSAiVXNlIHR1bmUyZnMgLWMgb3IgLWkgdG8gb3ZlcnJpZGUuXG4iLAorCSAgICAgICBmcy0+c3VwZXItPnNfbWF4X21udF9jb3VudCwKKwkgICAgICAgKGRvdWJsZSlmcy0+c3VwZXItPnNfY2hlY2tpbnRlcnZhbCAvICgzNjAwICogMjQpKTsKK30KKwordm9pZCBtYWtlX2pvdXJuYWxfZGV2aWNlKGNoYXIgKmpvdXJuYWxfZGV2aWNlLCBleHQyX2ZpbHN5cyBmcywgaW50IHF1aWV0LCBpbnQgZm9yY2UpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlleHQyX2ZpbHN5cwlqZnM7CisJaW9fbWFuYWdlcglpb19wdHI7CisKKwljaGVja19wbGF1c2liaWxpdHkoam91cm5hbF9kZXZpY2UsIGZvcmNlKTsKKwljaGVja19tb3VudChqb3VybmFsX2RldmljZSwgZm9yY2UsICJqb3VybmFsIik7CisJaW9fcHRyID0gdW5peF9pb19tYW5hZ2VyOworCXJldHZhbCA9IGV4dDJmc19vcGVuKGpvdXJuYWxfZGV2aWNlLCBFWFQyX0ZMQUdfUld8CisJCQkJCUVYVDJfRkxBR19KT1VSTkFMX0RFVl9PSywgMCwKKwkJCQkJZnMtPmJsb2Nrc2l6ZSwgaW9fcHRyLCAmamZzKTsKKwlpZiAocmV0dmFsKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgam91cm5hbCBkZXZpY2UgJXMiLCBqb3VybmFsX2RldmljZSk7CisJaWYgKCFxdWlldCkKKwkJcHJpbnRmKCJBZGRpbmcgam91cm5hbCB0byBkZXZpY2UgJXM6ICIsIGpvdXJuYWxfZGV2aWNlKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlyZXR2YWwgPSBleHQyZnNfYWRkX2pvdXJuYWxfZGV2aWNlKGZzLCBqZnMpOworCWlmIChyZXR2YWwpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJcbkZhaWxlZCB0byBhZGQgam91cm5hbCB0byBkZXZpY2UgJXMiLCBqb3VybmFsX2RldmljZSk7CisJaWYgKCFxdWlldCkKKwkJcHV0cygiZG9uZSIpOworCWV4dDJmc19jbG9zZShqZnMpOworfQorCit2b2lkIG1ha2Vfam91cm5hbF9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsIGludCBqb3VybmFsX3NpemUsIGludCBqb3VybmFsX2ZsYWdzLCBpbnQgcXVpZXQpCit7CisJdW5zaWduZWQgbG9uZyBqb3VybmFsX2Jsb2NrczsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJam91cm5hbF9ibG9ja3MgPSBmaWd1cmVfam91cm5hbF9zaXplKGpvdXJuYWxfc2l6ZSwgZnMpOworCWlmICgham91cm5hbF9ibG9ja3MpIHsKKwkJZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICY9CisJCQl+RVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTDsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXF1aWV0KQorCQlwcmludGYoIkNyZWF0aW5nIGpvdXJuYWwgKCVsZCBibG9ja3MpOiAiLCBqb3VybmFsX2Jsb2Nrcyk7CisJZmZsdXNoKHN0ZG91dCk7CisJcmV0dmFsID0gZXh0MmZzX2FkZF9qb3VybmFsX2lub2RlKGZzLCBqb3VybmFsX2Jsb2NrcywKKwkJCQkJCSAgam91cm5hbF9mbGFncyk7CisJaWYgKHJldHZhbCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNyZWF0ZSBqb3VybmFsIik7CisJaWYgKCFxdWlldCkKKwkJcHV0cygiZG9uZSIpOworfQorCitjaGFyICplMmZzX3NldF9zYmluX3BhdGgodm9pZCkKK3sKKwljaGFyICpvbGRwYXRoID0gZ2V0ZW52KCJQQVRIIik7CisJLyogVXBkYXRlIG91ciBQQVRIIHRvIGluY2x1ZGUgL3NiaW4gICovCisjZGVmaW5lIFBBVEhfU0VUICIvc2JpbiIKKwlpZiAob2xkcGF0aCkKKwkJb2xkcGF0aCA9IHhhc3ByaW50ZigiJXM6JXMiLCBQQVRIX1NFVCwgb2xkcGF0aCk7CisJIGVsc2UKKwkJb2xkcGF0aCA9IFBBVEhfU0VUOworCXB1dGVudihvbGRwYXRoKTsKKwlyZXR1cm4gb2xkcGF0aDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V0aWwuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQyNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXRpbC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHV0aWwuaCAtLS0gaGVhZGVyIGZpbGUgZGVmaW5pbmcgcHJvdG90eXBlcyBmb3IgaGVscGVyIGZ1bmN0aW9ucworICogdXNlZCBieSB0dW5lMmZzIGFuZCBta2UyZnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBieSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworZXh0ZXJuIHZvaWQgcHJvY2VlZF9xdWVzdGlvbih2b2lkKTsKK2V4dGVybiB2b2lkIGNoZWNrX3BsYXVzaWJpbGl0eShjb25zdCBjaGFyICpkZXZpY2UsIGludCBmb3JjZSk7CitleHRlcm4gdm9pZCBwYXJzZV9qb3VybmFsX29wdHMoY2hhciAqKiwgaW50ICosIGludCAqLCBjb25zdCBjaGFyICpvcHRzKTsKK2V4dGVybiB2b2lkIGNoZWNrX21vdW50KGNvbnN0IGNoYXIgKmRldmljZSwgaW50IGZvcmNlLCBjb25zdCBjaGFyICp0eXBlKTsKK2V4dGVybiBpbnQgZmlndXJlX2pvdXJuYWxfc2l6ZShpbnQgc2l6ZSwgZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIHZvaWQgcHJpbnRfY2hlY2tfbWVzc2FnZShleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gdm9pZCBtYWtlX2pvdXJuYWxfZGV2aWNlKGNoYXIgKmpvdXJuYWxfZGV2aWNlLCBleHQyX2ZpbHN5cyBmcywgaW50IHF1aWV0LCBpbnQgZm9yY2UpOworZXh0ZXJuIHZvaWQgbWFrZV9qb3VybmFsX2Jsb2NrcyhleHQyX2ZpbHN5cyBmcywgaW50IGpvdXJuYWxfc2l6ZSwgaW50IGpvdXJuYWxfZmxhZ3MsIGludCBxdWlldCk7CitleHRlcm4gY2hhciAqZTJmc19zZXRfc2Jpbl9wYXRoKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzY4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxNiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK05FRURFRC0kKENPTkZJR19FMkZTQ0spID0geQorTkVFREVELSQoQ09ORklHX0ZTQ0spID0geQorTkVFREVELSQoQ09ORklHX01LRTJGUykgPSB5CitORUVERUQtJChDT05GSUdfVFVORTJGUykgPSB5CisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChORUVERUQteSkgKz0gY29tcGFyZS5vIGdlbl91dWlkLm8gcGFjay5vIHBhcnNlLm8gdW5wYWNrLm8gdW5wYXJzZS5vIFwKKyAgICAgICAgICAgICAgICAgICB1dWlkX3RpbWUubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9jb21wYXJlLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL2NvbXBhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDhlYTdjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9jb21wYXJlLmMKQEAgLTAsMCArMSw1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY29tcGFyZS5jIC0tLSBjb21wYXJlIHdoZXRoZXIgb3Igbm90IHR3byBVVUlEJ3MgYXJlIHRoZSBzYW1lCisgKgorICogUmV0dXJucyAwIGlmIHRoZSB0d28gVVVJRCdzIGFyZSBkaWZmZXJlbnQsIGFuZCAxIGlmIHRoZXkgYXJlIHRoZSBzYW1lLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlICJ1dWlkUC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFVVQ01QKHUxLHUyKSBpZiAodTEgIT0gdTIpIHJldHVybiAodTEgPCB1MikgPyAtMSA6IDE7CisKK2ludCB1dWlkX2NvbXBhcmUoY29uc3QgdXVpZF90IHV1MSwgY29uc3QgdXVpZF90IHV1MikKK3sKKwlzdHJ1Y3QgdXVpZAl1dWlkMSwgdXVpZDI7CisKKwl1dWlkX3VucGFjayh1dTEsICZ1dWlkMSk7CisJdXVpZF91bnBhY2sodXUyLCAmdXVpZDIpOworCisJVVVDTVAodXVpZDEudGltZV9sb3csIHV1aWQyLnRpbWVfbG93KTsKKwlVVUNNUCh1dWlkMS50aW1lX21pZCwgdXVpZDIudGltZV9taWQpOworCVVVQ01QKHV1aWQxLnRpbWVfaGlfYW5kX3ZlcnNpb24sIHV1aWQyLnRpbWVfaGlfYW5kX3ZlcnNpb24pOworCVVVQ01QKHV1aWQxLmNsb2NrX3NlcSwgdXVpZDIuY2xvY2tfc2VxKTsKKwlyZXR1cm4gbWVtY21wKHV1aWQxLm5vZGUsIHV1aWQyLm5vZGUsIDYpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9nZW5fdXVpZC5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9nZW5fdXVpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTBjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL2dlbl91dWlkLmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGdlbl91dWlkLmMgLS0tIGdlbmVyYXRlIGEgRENFLWNvbXBhdGlibGUgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tJT19ICisjaW5jbHVkZSA8c3lzL3NvY2tpby5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVRfSUZfSAorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVF9JRl9ETF9ICisjaW5jbHVkZSA8bmV0L2lmX2RsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInV1aWRQLmgiCisKKyNpZmRlZiBIQVZFX1NSQU5ET00KKyNkZWZpbmUgc3JhbmQoeCkJc3JhbmRvbSh4KQorI2RlZmluZSByYW5kKCkJCXJhbmRvbSgpCisjZW5kaWYKKworc3RhdGljIGludCBnZXRfcmFuZG9tX2ZkKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwJdHY7CisJc3RhdGljIGludAlmZCA9IC0yOworCWludAkJaTsKKworCWlmIChmZCA9PSAtMikgeworCQlnZXR0aW1lb2ZkYXkoJnR2LCAwKTsKKwkJZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisJCWlmIChmZCA9PSAtMSkKKwkJCWZkID0gb3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOworCQlzcmFuZCgoZ2V0cGlkKCkgPDwgMTYpIF4gZ2V0dWlkKCkgXiB0di50dl9zZWMgXiB0di50dl91c2VjKTsKKwl9CisJLyogQ3JhbmsgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGEgZmV3IHRpbWVzICovCisJZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisJZm9yIChpID0gKHR2LnR2X3NlYyBeIHR2LnR2X3VzZWMpICYgMHgxRjsgaSA+IDA7IGktLSkKKwkJcmFuZCgpOworCXJldHVybiBmZDsKK30KKworCisvKgorICogR2VuZXJhdGUgYSBzZXJpZXMgb2YgcmFuZG9tIGJ5dGVzLiAgVXNlIC9kZXYvdXJhbmRvbSBpZiBwb3NzaWJsZSwKKyAqIGFuZCBpZiBub3QsIHVzZSBzcmFuZG9tL3JhbmRvbS4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3JhbmRvbV9ieXRlcyh2b2lkICpidWYsIGludCBuYnl0ZXMpCit7CisJaW50IGksIG4gPSBuYnl0ZXMsIGZkID0gZ2V0X3JhbmRvbV9mZCgpOworCWludCBsb3NlX2NvdW50ZXIgPSAwOworCXVuc2lnbmVkIGNoYXIgKmNwID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOworCisJaWYgKGZkID49IDApIHsKKwkJd2hpbGUgKG4gPiAwKSB7CisJCQlpID0gcmVhZChmZCwgY3AsIG4pOworCQkJaWYgKGkgPD0gMCkgeworCQkJCWlmIChsb3NlX2NvdW50ZXIrKyA+IDE2KQorCQkJCQlicmVhazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW4gLT0gaTsKKwkJCWNwICs9IGk7CisJCQlsb3NlX2NvdW50ZXIgPSAwOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBkbyB0aGlzIGFsbCB0aGUgdGltZSwgYnV0IHRoaXMgaXMgdGhlIG9ubHkgc291cmNlIG9mCisJICogcmFuZG9tbmVzcyBpZiAvZGV2L3JhbmRvbS91cmFuZG9tIGlzIG91dCB0byBsdW5jaC4KKwkgKi8KKwlmb3IgKGNwID0gYnVmLCBpID0gMDsgaSA8IG5ieXRlczsgaSsrKQorCQkqY3ArKyBePSAocmFuZCgpID4+IDcpICYgMHhGRjsKK30KKworLyoKKyAqIEdldCB0aGUgZXRoZXJuZXQgaGFyZHdhcmUgYWRkcmVzcywgaWYgd2UgY2FuIGZpbmQgaXQuLi4KKyAqLworc3RhdGljIGludCBnZXRfbm9kZV9pZCh1bnNpZ25lZCBjaGFyICpub2RlX2lkKQoreworI2lmZGVmIEhBVkVfTkVUX0lGX0gKKwlpbnQJCXNkOworCXN0cnVjdCBpZnJlcQlpZnIsICppZnJwOworCXN0cnVjdCBpZmNvbmYJaWZjOworCWNoYXIgYnVmWzEwMjRdOworCWludAkJbiwgaTsKKwl1bnNpZ25lZCBjaGFyCSphOworI2lmZGVmIEhBVkVfTkVUX0lGX0RMX0gKKwlzdHJ1Y3Qgc29ja2FkZHJfZGwgKnNkbHA7CisjZW5kaWYKKworLyoKKyAqIEJTRCA0LjQgZGVmaW5lcyB0aGUgc2l6ZSBvZiBhbiBpZnJlcSB0byBiZQorICogbWF4KHNpemVvZihpZnJlcSksIHNpemVvZihpZnJlcS5pZnJfbmFtZSkraWZyZXEuaWZyX2FkZHIuc2FfbGVuCisgKiBIb3dldmVyLCB1bmRlciBlYXJsaWVyIHN5c3RlbXMsIHNhX2xlbiBpc24ndCBwcmVzZW50LCBzbyB0aGUgc2l6ZSBpcworICoganVzdCBzaXplb2Yoc3RydWN0IGlmcmVxKQorICovCisjaWZkZWYgSEFWRV9TQV9MRU4KKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNkZWZpbmUgaWZyZXFfc2l6ZShpKSBtYXgoc2l6ZW9mKHN0cnVjdCBpZnJlcSksXAorICAgICBzaXplb2YoKGkpLmlmcl9uYW1lKSsoaSkuaWZyX2FkZHIuc2FfbGVuKQorI2Vsc2UKKyNkZWZpbmUgaWZyZXFfc2l6ZShpKSBzaXplb2Yoc3RydWN0IGlmcmVxKQorI2VuZGlmIC8qIEhBVkVfU0FfTEVOKi8KKworCXNkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fSVApOworCWlmIChzZCA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJaWZjLmlmY19sZW4gPSBzaXplb2YoYnVmKTsKKwlpZmMuaWZjX2J1ZiA9IGJ1ZjsKKwlpZiAoaW9jdGwgKHNkLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKKwkJY2xvc2Uoc2QpOworCQlyZXR1cm4gLTE7CisJfQorCW4gPSBpZmMuaWZjX2xlbjsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSs9IGlmcmVxX3NpemUoKmlmcnApICkgeworCQlpZnJwID0gKHN0cnVjdCBpZnJlcSAqKSgoY2hhciAqKSBpZmMuaWZjX2J1ZitpKTsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmcnAtPmlmcl9uYW1lKTsKKyNpZmRlZiBTSU9DR0lGSFdBRERSCisJCWlmIChpb2N0bChzZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKQorCQkJY29udGludWU7CisJCWEgPSAodW5zaWduZWQgY2hhciAqKSAmaWZyLmlmcl9od2FkZHIuc2FfZGF0YTsKKyNlbHNlCisjaWZkZWYgU0lPQ0dFTkFERFIKKwkJaWYgKGlvY3RsKHNkLCBTSU9DR0VOQUREUiwgJmlmcikgPCAwKQorCQkJY29udGludWU7CisJCWEgPSAodW5zaWduZWQgY2hhciAqKSBpZnIuaWZyX2VuYWRkcjsKKyNlbHNlCisjaWZkZWYgSEFWRV9ORVRfSUZfRExfSAorCQlzZGxwID0gKHN0cnVjdCBzb2NrYWRkcl9kbCAqKSAmaWZycC0+aWZyX2FkZHI7CisJCWlmICgoc2RscC0+c2RsX2ZhbWlseSAhPSBBRl9MSU5LKSB8fCAoc2RscC0+c2RsX2FsZW4gIT0gNikpCisJCQljb250aW51ZTsKKwkJYSA9ICh1bnNpZ25lZCBjaGFyICopICZzZGxwLT5zZGxfZGF0YVtzZGxwLT5zZGxfbmxlbl07CisjZWxzZQorCQkvKgorCQkgKiBYWFggd2UgZG9uJ3QgaGF2ZSBhIHdheSBvZiBnZXR0aW5nIHRoZSBoYXJkd2FyZQorCQkgKiBhZGRyZXNzCisJCSAqLworCQljbG9zZShzZCk7CisJCXJldHVybiAwOworI2VuZGlmIC8qIEhBVkVfTkVUX0lGX0RMX0ggKi8KKyNlbmRpZiAvKiBTSU9DR0VOQUREUiAqLworI2VuZGlmIC8qIFNJT0NHSUZIV0FERFIgKi8KKwkJaWYgKCFhWzBdICYmICFhWzFdICYmICFhWzJdICYmICFhWzNdICYmICFhWzRdICYmICFhWzVdKQorCQkJY29udGludWU7CisJCWlmIChub2RlX2lkKSB7CisJCQltZW1jcHkobm9kZV9pZCwgYSwgNik7CisJCQljbG9zZShzZCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwljbG9zZShzZCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogQXNzdW1lIHRoYXQgdGhlIGdldHRpbWVvZmRheSgpIGhhcyBtaWNyb3NlY29uZCBncmFudWxhcml0eSAqLworI2RlZmluZSBNQVhfQURKVVNUTUVOVCAxMAorCitzdGF0aWMgaW50IGdldF9jbG9jayh1aW50MzJfdCAqY2xvY2tfaGlnaCwgdWludDMyX3QgKmNsb2NrX2xvdywgdWludDE2X3QgKnJldF9jbG9ja19zZXEpCit7CisJc3RhdGljIGludAkJCWFkanVzdG1lbnQgPSAwOworCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbAkJbGFzdCA9IHswLCAwfTsKKwlzdGF0aWMgdWludDE2X3QJCQljbG9ja19zZXE7CisJc3RydWN0IHRpbWV2YWwJCQl0djsKKwl1bnNpZ25lZCBsb25nIGxvbmcJCWNsb2NrX3JlZzsKKwordHJ5X2FnYWluOgorCWdldHRpbWVvZmRheSgmdHYsIDApOworCWlmICgobGFzdC50dl9zZWMgPT0gMCkgJiYgKGxhc3QudHZfdXNlYyA9PSAwKSkgeworCQlnZXRfcmFuZG9tX2J5dGVzKCZjbG9ja19zZXEsIHNpemVvZihjbG9ja19zZXEpKTsKKwkJY2xvY2tfc2VxICY9IDB4M0ZGRjsKKwkJbGFzdCA9IHR2OworCQlsYXN0LnR2X3NlYy0tOworCX0KKwlpZiAoKHR2LnR2X3NlYyA8IGxhc3QudHZfc2VjKSB8fAorCSAgICAoKHR2LnR2X3NlYyA9PSBsYXN0LnR2X3NlYykgJiYKKwkgICAgICh0di50dl91c2VjIDwgbGFzdC50dl91c2VjKSkpIHsKKwkJY2xvY2tfc2VxID0gKGNsb2NrX3NlcSsxKSAmIDB4M0ZGRjsKKwkJYWRqdXN0bWVudCA9IDA7CisJCWxhc3QgPSB0djsKKwl9IGVsc2UgaWYgKCh0di50dl9zZWMgPT0gbGFzdC50dl9zZWMpICYmCisJICAgICh0di50dl91c2VjID09IGxhc3QudHZfdXNlYykpIHsKKwkJaWYgKGFkanVzdG1lbnQgPj0gTUFYX0FESlVTVE1FTlQpCisJCQlnb3RvIHRyeV9hZ2FpbjsKKwkJYWRqdXN0bWVudCsrOworCX0gZWxzZSB7CisJCWFkanVzdG1lbnQgPSAwOworCQlsYXN0ID0gdHY7CisJfQorCisJY2xvY2tfcmVnID0gdHYudHZfdXNlYyoxMCArIGFkanVzdG1lbnQ7CisJY2xvY2tfcmVnICs9ICgodW5zaWduZWQgbG9uZyBsb25nKSB0di50dl9zZWMpKjEwMDAwMDAwOworCWNsb2NrX3JlZyArPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpIDB4MDFCMjFERDIpIDw8IDMyKSArIDB4MTM4MTQwMDA7CisKKwkqY2xvY2tfaGlnaCA9IGNsb2NrX3JlZyA+PiAzMjsKKwkqY2xvY2tfbG93ID0gY2xvY2tfcmVnOworCSpyZXRfY2xvY2tfc2VxID0gY2xvY2tfc2VxOworCXJldHVybiAwOworfQorCit2b2lkIHV1aWRfZ2VuZXJhdGVfdGltZSh1dWlkX3Qgb3V0KQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG5vZGVfaWRbNl07CisJc3RhdGljIGludCBoYXNfaW5pdCA9IDA7CisJc3RydWN0IHV1aWQgdXU7CisJdWludDMyX3QJY2xvY2tfbWlkOworCisJaWYgKCFoYXNfaW5pdCkgeworCQlpZiAoZ2V0X25vZGVfaWQobm9kZV9pZCkgPD0gMCkgeworCQkJZ2V0X3JhbmRvbV9ieXRlcyhub2RlX2lkLCA2KTsKKwkJCS8qCisJCQkgKiBTZXQgbXVsdGljYXN0IGJpdCwgdG8gcHJldmVudCBjb25mbGljdHMKKwkJCSAqIHdpdGggSUVFRSA4MDIgYWRkcmVzc2VzIG9idGFpbmVkIGZyb20KKwkJCSAqIG5ldHdvcmsgY2FyZHMKKwkJCSAqLworCQkJbm9kZV9pZFswXSB8PSAweDAxOworCQl9CisJCWhhc19pbml0ID0gMTsKKwl9CisJZ2V0X2Nsb2NrKCZjbG9ja19taWQsICZ1dS50aW1lX2xvdywgJnV1LmNsb2NrX3NlcSk7CisJdXUuY2xvY2tfc2VxIHw9IDB4ODAwMDsKKwl1dS50aW1lX21pZCA9ICh1aW50MTZfdCkgY2xvY2tfbWlkOworCXV1LnRpbWVfaGlfYW5kX3ZlcnNpb24gPSAoKGNsb2NrX21pZCA+PiAxNikgJiAweDBGRkYpIHwgMHgxMDAwOworCW1lbWNweSh1dS5ub2RlLCBub2RlX2lkLCA2KTsKKwl1dWlkX3BhY2soJnV1LCBvdXQpOworfQorCit2b2lkIHV1aWRfZ2VuZXJhdGVfcmFuZG9tKHV1aWRfdCBvdXQpCit7CisJdXVpZF90CWJ1ZjsKKwlzdHJ1Y3QgdXVpZCB1dTsKKworCWdldF9yYW5kb21fYnl0ZXMoYnVmLCBzaXplb2YoYnVmKSk7CisJdXVpZF91bnBhY2soYnVmLCAmdXUpOworCisJdXUuY2xvY2tfc2VxID0gKHV1LmNsb2NrX3NlcSAmIDB4M0ZGRikgfCAweDgwMDA7CisJdXUudGltZV9oaV9hbmRfdmVyc2lvbiA9ICh1dS50aW1lX2hpX2FuZF92ZXJzaW9uICYgMHgwRkZGKSB8IDB4NDAwMDsKKwl1dWlkX3BhY2soJnV1LCBvdXQpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBmcm9udC1lbmQgdG8gdXVpZF9nZW5lcmF0ZV9yYW5kb20gYW5kCisgKiB1dWlkX2dlbmVyYXRlX3RpbWUuICBJdCB1c2VzIHV1aWRfZ2VuZXJhdGVfcmFuZG9tIG9ubHkgaWYKKyAqIC9kZXYvdXJhbmRvbSBpcyBhdmFpbGFibGUsIHNpbmNlIG90aGVyd2lzZSB3ZSB3b24ndCBoYXZlCisgKiBoaWdoLXF1YWxpdHkgcmFuZG9tbmVzcy4KKyAqLwordm9pZCB1dWlkX2dlbmVyYXRlKHV1aWRfdCBvdXQpCit7CisJaWYgKGdldF9yYW5kb21fZmQoKSA+PSAwKQorCQl1dWlkX2dlbmVyYXRlX3JhbmRvbShvdXQpOworCWVsc2UKKwkJdXVpZF9nZW5lcmF0ZV90aW1lKG91dCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3BhY2suYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvcGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2NmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3BhY2suYwpAQCAtMCwwICsxLDY5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lIGZvciBwYWNraW5nIFVVSUQncworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ1dWlkUC5oIgorCit2b2lkIHV1aWRfcGFjayhjb25zdCBzdHJ1Y3QgdXVpZCAqdXUsIHV1aWRfdCBwdHIpCit7CisJdWludDMyX3QgdG1wOworCXVuc2lnbmVkIGNoYXIgKm91dCA9IHB0cjsKKworCXRtcCA9IHV1LT50aW1lX2xvdzsKKwlvdXRbM10gPSAodW5zaWduZWQgY2hhcikgdG1wOworCXRtcCA+Pj0gODsKKwlvdXRbMl0gPSAodW5zaWduZWQgY2hhcikgdG1wOworCXRtcCA+Pj0gODsKKwlvdXRbMV0gPSAodW5zaWduZWQgY2hhcikgdG1wOworCXRtcCA+Pj0gODsKKwlvdXRbMF0gPSAodW5zaWduZWQgY2hhcikgdG1wOworCisJdG1wID0gdXUtPnRpbWVfbWlkOworCW91dFs1XSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisJdG1wID4+PSA4OworCW91dFs0XSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisKKwl0bXAgPSB1dS0+dGltZV9oaV9hbmRfdmVyc2lvbjsKKwlvdXRbN10gPSAodW5zaWduZWQgY2hhcikgdG1wOworCXRtcCA+Pj0gODsKKwlvdXRbNl0gPSAodW5zaWduZWQgY2hhcikgdG1wOworCisJdG1wID0gdXUtPmNsb2NrX3NlcTsKKwlvdXRbOV0gPSAodW5zaWduZWQgY2hhcikgdG1wOworCXRtcCA+Pj0gODsKKwlvdXRbOF0gPSAodW5zaWduZWQgY2hhcikgdG1wOworCisJbWVtY3B5KG91dCsxMCwgdXUtPm5vZGUsIDYpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9wYXJzZS5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2Y5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3BhcnNlLmMKQEAgLTAsMCArMSw4MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcGFyc2UuYyAtLS0gVVVJRCBwYXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorICogICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQUxMIE9GCisgKiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV1aWRQLmgiCisKK2ludCB1dWlkX3BhcnNlKGNvbnN0IGNoYXIgKmluLCB1dWlkX3QgdXUpCit7CisJc3RydWN0IHV1aWQJdXVpZDsKKwlpbnQJCWk7CisJY29uc3QgY2hhcgkqY3A7CisJY2hhcgkJYnVmWzNdOworCisJaWYgKHN0cmxlbihpbikgIT0gMzYpCisJCXJldHVybiAtMTsKKwlmb3IgKGk9MCwgY3AgPSBpbjsgaSA8PSAzNjsgaSsrLGNwKyspIHsKKwkJaWYgKChpID09IDgpIHx8IChpID09IDEzKSB8fCAoaSA9PSAxOCkgfHwKKwkJICAgIChpID09IDIzKSkgeworCQkJaWYgKCpjcCA9PSAnLScpCisJCQkJY29udGludWU7CisJCQllbHNlCisJCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChpPT0gMzYpCisJCQlpZiAoKmNwID09IDApCisJCQkJY29udGludWU7CisJCWlmICghaXN4ZGlnaXQoKmNwKSkKKwkJCXJldHVybiAtMTsKKwl9CisJdXVpZC50aW1lX2xvdyA9IHN0cnRvdWwoaW4sIE5VTEwsIDE2KTsKKwl1dWlkLnRpbWVfbWlkID0gc3RydG91bChpbis5LCBOVUxMLCAxNik7CisJdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uID0gc3RydG91bChpbisxNCwgTlVMTCwgMTYpOworCXV1aWQuY2xvY2tfc2VxID0gc3RydG91bChpbisxOSwgTlVMTCwgMTYpOworCWNwID0gaW4rMjQ7CisJYnVmWzJdID0gMDsKKwlmb3IgKGk9MDsgaSA8IDY7IGkrKykgeworCQlidWZbMF0gPSAqY3ArKzsKKwkJYnVmWzFdID0gKmNwKys7CisJCXV1aWQubm9kZVtpXSA9IHN0cnRvdWwoYnVmLCBOVUxMLCAxNik7CisJfQorCisJdXVpZF9wYWNrKCZ1dWlkLCB1dSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3VucGFjay5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91bnBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQzYWFiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91bnBhY2suYwpAQCAtMCwwICsxLDYzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lIGZvciB1bnBhY2tpbmcgVVVJRAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ1dWlkUC5oIgorCit2b2lkIHV1aWRfdW5wYWNrKGNvbnN0IHV1aWRfdCBpbiwgc3RydWN0IHV1aWQgKnV1KQoreworCWNvbnN0IHVpbnQ4X3QgKnB0ciA9IGluOworCXVpbnQzMl90IHRtcDsKKworCXRtcCA9ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl1dS0+dGltZV9sb3cgPSB0bXA7CisKKwl0bXAgPSAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl1dS0+dGltZV9taWQgPSB0bXA7CisKKwl0bXAgPSAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl1dS0+dGltZV9oaV9hbmRfdmVyc2lvbiA9IHRtcDsKKworCXRtcCA9ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXV1LT5jbG9ja19zZXEgPSB0bXA7CisKKwltZW1jcHkodXUtPm5vZGUsIHB0ciwgNik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3VucGFyc2UuYyBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdW5wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTQ4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3VucGFyc2UuYwpAQCAtMCwwICsxLDc3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1bnBhcnNlLmMgLS0gY29udmVydCBhIFVVSUQgdG8gc3RyaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorICogICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQUxMIE9GCisgKiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ1dWlkUC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqZm10X2xvd2VyID0KKwkiJTA4eC0lMDR4LSUwNHgtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IjsKKworc3RhdGljIGNvbnN0IGNoYXIgKmZtdF91cHBlciA9CisJIiUwOFgtJTA0WC0lMDRYLSUwMlglMDJYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCI7CisKKyNpZmRlZiBVVUlEX1VOUEFSU0VfREVGQVVMVF9VUFBFUgorI2RlZmluZSBGTVRfREVGQVVMVCBmbXRfdXBwZXIKKyNlbHNlCisjZGVmaW5lIEZNVF9ERUZBVUxUIGZtdF9sb3dlcgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHV1aWRfdW5wYXJzZV94KGNvbnN0IHV1aWRfdCB1dSwgY2hhciAqb3V0LCBjb25zdCBjaGFyICpmbXQpCit7CisJc3RydWN0IHV1aWQgdXVpZDsKKworCXV1aWRfdW5wYWNrKHV1LCAmdXVpZCk7CisJc3ByaW50ZihvdXQsIGZtdCwKKwkJdXVpZC50aW1lX2xvdywgdXVpZC50aW1lX21pZCwgdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uLAorCQl1dWlkLmNsb2NrX3NlcSA+PiA4LCB1dWlkLmNsb2NrX3NlcSAmIDB4RkYsCisJCXV1aWQubm9kZVswXSwgdXVpZC5ub2RlWzFdLCB1dWlkLm5vZGVbMl0sCisJCXV1aWQubm9kZVszXSwgdXVpZC5ub2RlWzRdLCB1dWlkLm5vZGVbNV0pOworfQorCit2b2lkIHV1aWRfdW5wYXJzZV9sb3dlcihjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCkKK3sKKwl1dWlkX3VucGFyc2VfeCh1dSwgb3V0LAlmbXRfbG93ZXIpOworfQorCit2b2lkIHV1aWRfdW5wYXJzZV91cHBlcihjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCkKK3sKKwl1dWlkX3VucGFyc2VfeCh1dSwgb3V0LAlmbXRfdXBwZXIpOworfQorCit2b2lkIHV1aWRfdW5wYXJzZShjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCkKK3sKKwl1dWlkX3VucGFyc2VfeCh1dSwgb3V0LCBGTVRfREVGQVVMVCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3V1aWQuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdXVpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTcwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3V1aWQuaApAQCAtMCwwICsxLDEwMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUHVibGljIGluY2x1ZGUgZmlsZSBmb3IgdGhlIFVVSUQgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisjaWZuZGVmIFVVSURfVVVJRF9ICisjZGVmaW5lIFVVSURfVVVJRF9IIDEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHV1aWRfdFsxNl07CisKKy8qIFVVSUQgVmFyaWFudCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBVVUlEX1ZBUklBTlRfTkNTCTAKKyNkZWZpbmUgVVVJRF9WQVJJQU5UX0RDRQkxCisjZGVmaW5lIFVVSURfVkFSSUFOVF9NSUNST1NPRlQJMgorI2RlZmluZSBVVUlEX1ZBUklBTlRfT1RIRVIJMworCisvKiBVVUlEIFR5cGUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVVVJRF9UWVBFX0RDRV9USU1FICAgMQorI2RlZmluZSBVVUlEX1RZUEVfRENFX1JBTkRPTSA0CisKKy8qIEFsbG93IFVVSUQgY29uc3RhbnRzIHRvIGJlIGRlZmluZWQgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBVVUlEX0RFRklORShuYW1lLHUwLHUxLHUyLHUzLHU0LHU1LHU2LHU3LHU4LHU5LHUxMCx1MTEsdTEyLHUxMyx1MTQsdTE1KSBcCisJc3RhdGljIGNvbnN0IHV1aWRfdCBuYW1lIFVOVVNFRF9QQVJBTSA9IHt1MCx1MSx1Mix1Myx1NCx1NSx1Nix1Nyx1OCx1OSx1MTAsdTExLHUxMix1MTMsdTE0LHUxNX0KKyNlbHNlCisjZGVmaW5lIFVVSURfREVGSU5FKG5hbWUsdTAsdTEsdTIsdTMsdTQsdTUsdTYsdTcsdTgsdTksdTEwLHUxMSx1MTIsdTEzLHUxNCx1MTUpIFwKKwlzdGF0aWMgY29uc3QgdXVpZF90IG5hbWUgPSB7dTAsdTEsdTIsdTMsdTQsdTUsdTYsdTcsdTgsdTksdTEwLHUxMSx1MTIsdTEzLHUxNCx1MTV9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBjbGVhci5jICovCisvKnZvaWQgdXVpZF9jbGVhcih1dWlkX3QgdXUpOyovCisjZGVmaW5lIHV1aWRfY2xlYXIodXUpIG1lbXNldCh1dSwgMCwgc2l6ZW9mKHV1KSkKKworLyogY29tcGFyZS5jICovCitpbnQgdXVpZF9jb21wYXJlKGNvbnN0IHV1aWRfdCB1dTEsIGNvbnN0IHV1aWRfdCB1dTIpOworCisvKiBjb3B5LmMgKi8KKy8qdm9pZCB1dWlkX2NvcHkodXVpZF90IGRzdCwgY29uc3QgdXVpZF90IHNyYyk7Ki8KKyNkZWZpbmUgdXVpZF9jb3B5KGRzdCxzcmMpIG1lbWNweShkc3QsIHNyYywgc2l6ZW9mKGRzdCkpCisKKy8qIGdlbl91dWlkLmMgKi8KK3ZvaWQgdXVpZF9nZW5lcmF0ZSh1dWlkX3Qgb3V0KTsKK3ZvaWQgdXVpZF9nZW5lcmF0ZV9yYW5kb20odXVpZF90IG91dCk7Cit2b2lkIHV1aWRfZ2VuZXJhdGVfdGltZSh1dWlkX3Qgb3V0KTsKKworLyogaXNudWxsLmMgKi8KKy8qaW50IHV1aWRfaXNfbnVsbChjb25zdCB1dWlkX3QgdXUpOyovCisjZGVmaW5lIHV1aWRfaXNfbnVsbCh1dSkgKCFtZW1jbXAodXUsICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIsIHNpemVvZih1dSkpKQorCisvKiBwYXJzZS5jICovCitpbnQgdXVpZF9wYXJzZShjb25zdCBjaGFyICppbiwgdXVpZF90IHV1KTsKKworLyogdW5wYXJzZS5jICovCit2b2lkIHV1aWRfdW5wYXJzZShjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCk7Cit2b2lkIHV1aWRfdW5wYXJzZV9sb3dlcihjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCk7Cit2b2lkIHV1aWRfdW5wYXJzZV91cHBlcihjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCk7CisKKy8qIHV1aWRfdGltZS5jICovCit0aW1lX3QgdXVpZF90aW1lKGNvbnN0IHV1aWRfdCB1dSwgc3RydWN0IHRpbWV2YWwgKnJldF90dik7CitpbnQgdXVpZF90eXBlKGNvbnN0IHV1aWRfdCB1dSk7CitpbnQgdXVpZF92YXJpYW50KGNvbnN0IHV1aWRfdCB1dSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfVVVJRF9VVUlEX0ggKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdXVpZFAuaCBiL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdXVpZFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzA0MWVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91dWlkUC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHV1aWQuaCAtLSBwcml2YXRlIGhlYWRlciBmaWxlIGZvciB1dWlkcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAidXVpZC5oIgorCisvKgorICogT2Zmc2V0IGJldHdlZW4gMTUtT2N0LTE1ODIgYW5kIDEtSmFuLTcwCisgKi8KKyNkZWZpbmUgVElNRV9PRkZTRVRfSElHSCAweDAxQjIxREQyCisjZGVmaW5lIFRJTUVfT0ZGU0VUX0xPVyAgMHgxMzgxNDAwMAorCitzdHJ1Y3QgdXVpZCB7CisJdWludDMyX3QJdGltZV9sb3c7CisJdWludDE2X3QJdGltZV9taWQ7CisJdWludDE2X3QJdGltZV9oaV9hbmRfdmVyc2lvbjsKKwl1aW50MTZfdAljbG9ja19zZXE7CisJdWludDhfdAlub2RlWzZdOworfTsKKworCisvKgorICogcHJvdG90eXBlcworICovCit2b2lkIHV1aWRfcGFjayhjb25zdCBzdHJ1Y3QgdXVpZCAqdXUsIHV1aWRfdCBwdHIpOwordm9pZCB1dWlkX3VucGFjayhjb25zdCB1dWlkX3QgaW4sIHN0cnVjdCB1dWlkICp1dSk7CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3V1aWRfdGltZS5jIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91dWlkX3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY3M2U2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91dWlkX3RpbWUuYwpAQCAtMCwwICsxLDE2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdXVpZF90aW1lLmMgLS0tIEludGVycHJldCB0aGUgdGltZSBmaWVsZCBmcm9tIGEgdXVpZC4gIFRoaXMgcHJvZ3JhbQorICoJdmlvbGF0ZXMgdGhlIFVVSUQgYWJzdHJhY3Rpb24gYmFycmllciBieSByZWFjaGluZyBpbnRvIHRoZSBndXRzCisgKglvZiBhIFVVSUQgYW5kIGludGVycHJldGluZyBpdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJ1dWlkUC5oIgorCit0aW1lX3QgdXVpZF90aW1lKGNvbnN0IHV1aWRfdCB1dSwgc3RydWN0IHRpbWV2YWwgKnJldF90dikKK3sKKwlzdHJ1Y3QgdXVpZAkJdXVpZDsKKwl1aW50MzJfdAkJCWhpZ2g7CisJc3RydWN0IHRpbWV2YWwJCXR2OworCXVuc2lnbmVkIGxvbmcgbG9uZwljbG9ja19yZWc7CisKKwl1dWlkX3VucGFjayh1dSwgJnV1aWQpOworCisJaGlnaCA9IHV1aWQudGltZV9taWQgfCAoKHV1aWQudGltZV9oaV9hbmRfdmVyc2lvbiAmIDB4RkZGKSA8PCAxNik7CisJY2xvY2tfcmVnID0gdXVpZC50aW1lX2xvdyB8ICgodW5zaWduZWQgbG9uZyBsb25nKSBoaWdoIDw8IDMyKTsKKworCWNsb2NrX3JlZyAtPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpIDB4MDFCMjFERDIpIDw8IDMyKSArIDB4MTM4MTQwMDA7CisJdHYudHZfc2VjID0gY2xvY2tfcmVnIC8gMTAwMDAwMDA7CisJdHYudHZfdXNlYyA9IChjbG9ja19yZWcgJSAxMDAwMDAwMCkgLyAxMDsKKworCWlmIChyZXRfdHYpCisJCSpyZXRfdHYgPSB0djsKKworCXJldHVybiB0di50dl9zZWM7Cit9CisKK2ludCB1dWlkX3R5cGUoY29uc3QgdXVpZF90IHV1KQoreworCXN0cnVjdCB1dWlkCQl1dWlkOworCisJdXVpZF91bnBhY2sodXUsICZ1dWlkKTsKKwlyZXR1cm4gKCh1dWlkLnRpbWVfaGlfYW5kX3ZlcnNpb24gPj4gMTIpICYgMHhGKTsKK30KKworaW50IHV1aWRfdmFyaWFudChjb25zdCB1dWlkX3QgdXUpCit7CisJc3RydWN0IHV1aWQJCXV1aWQ7CisJaW50CQkJdmFyOworCisJdXVpZF91bnBhY2sodXUsICZ1dWlkKTsKKwl2YXIgPSB1dWlkLmNsb2NrX3NlcTsKKworCWlmICgodmFyICYgMHg4MDAwKSA9PSAwKQorCQlyZXR1cm4gVVVJRF9WQVJJQU5UX05DUzsKKwlpZiAoKHZhciAmIDB4NDAwMCkgPT0gMCkKKwkJcmV0dXJuIFVVSURfVkFSSUFOVF9EQ0U7CisJaWYgKCh2YXIgJiAweDIwMDApID09IDApCisJCXJldHVybiBVVUlEX1ZBUklBTlRfTUlDUk9TT0ZUOworCXJldHVybiBVVUlEX1ZBUklBTlRfT1RIRVI7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKnZhcmlhbnRfc3RyaW5nKGludCB2YXJpYW50KQoreworCXN3aXRjaCAodmFyaWFudCkgeworCWNhc2UgVVVJRF9WQVJJQU5UX05DUzoKKwkJcmV0dXJuICJOQ1MiOworCWNhc2UgVVVJRF9WQVJJQU5UX0RDRToKKwkJcmV0dXJuICJEQ0UiOworCWNhc2UgVVVJRF9WQVJJQU5UX01JQ1JPU09GVDoKKwkJcmV0dXJuICJNaWNyb3NvZnQiOworCWRlZmF1bHQ6CisJCXJldHVybiAiT3RoZXIiOworCX0KK30KKworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXV1aWRfdAkJYnVmOworCXRpbWVfdAkJdGltZV9yZWc7CisJc3RydWN0IHRpbWV2YWwJdHY7CisJaW50CQl0eXBlLCB2YXJpYW50OworCisJaWYgKGFyZ2MgIT0gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyB1dWlkXG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHV1aWRfcGFyc2UoYXJndlsxXSwgYnVmKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgVVVJRDogJXNcbiIsIGFyZ3ZbMV0pOworCQlleGl0KDEpOworCX0KKwl2YXJpYW50ID0gdXVpZF92YXJpYW50KGJ1Zik7CisJdHlwZSA9IHV1aWRfdHlwZShidWYpOworCXRpbWVfcmVnID0gdXVpZF90aW1lKGJ1ZiwgJnR2KTsKKworCXByaW50ZigiVVVJRCB2YXJpYW50IGlzICVkICglcylcbiIsIHZhcmlhbnQsIHZhcmlhbnRfc3RyaW5nKHZhcmlhbnQpKTsKKwlpZiAodmFyaWFudCAhPSBVVUlEX1ZBUklBTlRfRENFKSB7CisJCXByaW50ZigiV2FybmluZzogVGhpcyBwcm9ncmFtIG9ubHkga25vd3MgaG93IHRvIGludGVycHJldCAiCisJCSAgICAgICAiRENFIFVVSURzLlxuXHRUaGUgcmVzdCBvZiB0aGUgb3V0cHV0IGlzIGxpa2VseSAiCisJCSAgICAgICAidG8gYmUgaW5jb3JyZWN0ISFcbiIpOworCX0KKwlwcmludGYoIlVVSUQgdHlwZSBpcyAlZCIsIHR5cGUpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMToKKwkJcHJpbnRmKCIgKHRpbWUgYmFzZWQpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcmludGYoIiAoRENFKVxuIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcHJpbnRmKCIgKG5hbWUtYmFzZWQpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlwcmludGYoIiAocmFuZG9tKVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCWlmICh0eXBlICE9IDEpIHsKKwkJcHJpbnRmKCJXYXJuaW5nOiBub3QgYSB0aW1lLWJhc2VkIFVVSUQsIHNvIFVVSUQgdGltZSAiCisJCSAgICAgICAiZGVjb2Rpbmcgd2lsbCBsaWtlbHkgbm90IHdvcmshXG4iKTsKKwl9CisJcHJpbnRmKCJVVUlEIHRpbWUgaXM6ICglbGQsICVsZCk6ICVzXG4iLCB0di50dl9zZWMsIHR2LnR2X3VzZWMsCisJICAgICAgIGN0aW1lKCZ0aW1lX3JlZykpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2UyZnNwcm9ncy90dW5lMmZzLmMgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvdHVuZTJmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWVjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lMmZzcHJvZ3MvdHVuZTJmcy5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0dW5lMmZzOiB1dGlsaXR5IHRvIG1vZGlmeSBFWFQyIGZpbGVzeXN0ZW0KKyAqCisgKiBCdXN5Ym94J2VkICgyMDA5KSBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisKKy8vIHN0b3JhZ2UgaGVscGVycworY2hhciBCVUdfd3JvbmdfZmllbGRfc2l6ZSh2b2lkKTsKKyNkZWZpbmUgU1RPUkVfTEUoZmllbGQsIHZhbHVlKSBcCitkbyB7IFwKKwlpZiAoc2l6ZW9mKGZpZWxkKSA9PSA0KSBcCisJCWZpZWxkID0gU1dBUF9MRTMyKHZhbHVlKTsgXAorCWVsc2UgaWYgKHNpemVvZihmaWVsZCkgPT0gMikgXAorCQlmaWVsZCA9IFNXQVBfTEUxNih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDEpIFwKKwkJZmllbGQgPSAodmFsdWUpOyBcCisJZWxzZSBcCisJCUJVR193cm9uZ19maWVsZF9zaXplKCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRkVUQ0hfTEUzMihmaWVsZCkgXAorCShzaXplb2YoZmllbGQpID09IDQgPyBTV0FQX0xFMzIoZmllbGQpIDogQlVHX3dyb25nX2ZpZWxkX3NpemUoKSkKKworLy91c2FnZTojZGVmaW5lIHR1bmUyZnNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyBNT1VOVF9DTlRdICIKKy8vLy91c2FnZTogICAgICJbLWUgZXJyb3JzLWJlaGF2aW9yXSBbLWcgZ3JvdXBdICIKKy8vdXNhZ2U6ICAgICAgICJbLWkgREFZU10gIgorLy8vL3VzYWdlOiAgICAgIlstal0gWy1KIGpvdXJuYWwtb3B0aW9uc10gWy1sXSBbLXMgc3BhcnNlLWZsYWddICIKKy8vLy91c2FnZTogICAgICJbLW0gcmVzZXJ2ZWQtYmxvY2tzLXBlcmNlbnRdIFstbyBbXl1tb3VudC1vcHRpb25zWywuLi5dXSAiCisvLy8vdXNhZ2U6ICAgICAiWy1yIHJlc2VydmVkLWJsb2Nrcy1jb3VudF0gWy11IHVzZXJdIFstQyBtb3VudC1jb3VudF0gIgorLy91c2FnZTogICAgICAgIlstTCBMQUJFTF0gIgorLy8vL3VzYWdlOiAgICAgIlstTSBsYXN0LW1vdW50ZWQtZGlyXSBbLU8gW15dZmVhdHVyZVssLi4uXV0gIgorLy8vL3VzYWdlOiAgICAgIlstVCBsYXN0LWNoZWNrLXRpbWVdIFstVSBVVUlEXSAiCisvL3VzYWdlOiAgICAgICAiQkxPQ0tERVYiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHR1bmUyZnNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJBZGp1c3QgZmlsZXN5c3RlbSBvcHRpb25zIG9uIGV4dFsyM10gZmlsZXN5c3RlbXMiCisKK2VudW0geworCU9QVF9MID0gMSA8PCAwLCAvLyBsYWJlbAorCU9QVF9jID0gMSA8PCAxLCAvLyBtYXggbW91bnQgY291bnQKKwlPUFRfaSA9IDEgPDwgMiwgLy8gY2hlY2sgaW50ZXJ2YWwKK307CisKK2ludCB0dW5lMmZzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0dW5lMmZzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWNvbnN0IGNoYXIgKmxhYmVsLCAqc3RyX2MsICpzdHJfaTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2I7CisJaW50IGZkOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiTDpjOmk6IiwgJmxhYmVsLCAmc3RyX2MsICZzdHJfaSk7CisJaWYgKCFvcHRzKQorCQliYl9zaG93X3VzYWdlKCk7CisJYXJndiArPSBvcHRpbmQ7IC8vIGFyZ3ZbMF0gLS0gZGV2aWNlCisKKwkvLyByZWFkIHN1cGVyYmxvY2sKKwlmZCA9IHhvcGVuKGFyZ3ZbMF0sIE9fUkRXUik7CisJeGxzZWVrKGZkLCAxMDI0LCBTRUVLX1NFVCk7CisJc2IgPSB4emFsbG9jKDEwMjQpOworCXhyZWFkKGZkLCBzYiwgMTAyNCk7CisKKwkvLyBtYW5nbGUgc3VwZXJibG9jaworCS8vU1RPUkVfTEUoc2ItPnNfd3RpbWUsIHRpbWUoTlVMTCkpOyAtIHdoeSBib3RoZXI/CisKKwkvLyBzZXQgdGhlIGxhYmVsCisJaWYgKG9wdHMgJiBPUFRfTCkKKwkJc2FmZV9zdHJuY3B5KChjaGFyICopc2ItPnNfdm9sdW1lX25hbWUsIGxhYmVsLCBzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKworCWlmIChvcHRzICYgT1BUX2MpIHsKKwkJaW50IG4gPSB4YXRvaV9yYW5nZShzdHJfYywgLTEsIDB4ZmZmZSk7CisJCWlmIChuID09IDApCisJCQluID0gLTE7CisJCVNUT1JFX0xFKHNiLT5zX21heF9tbnRfY291bnQsICh1bnNpZ25lZCluKTsKKwl9CisKKwlpZiAob3B0cyAmIE9QVF9pKSB7CisJCXVuc2lnbmVkIG4gPSB4YXRvdV9yYW5nZShzdHJfaSwgMCwgKHVuc2lnbmVkKTB4ZmZmZmZmZmYgLyAoMjQqNjAqNjApKSAqIDI0KjYwKjYwOworCQlTVE9SRV9MRShzYi0+c19jaGVja2ludGVydmFsLCBuKTsKKwl9CisKKwkvLyB3cml0ZSBzdXBlcmJsb2NrCisJeGxzZWVrKGZkLCAxMDI0LCBTRUVLX1NFVCk7CisJeHdyaXRlKGZkLCBzYiwgMTAyNCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShzYik7CisJfQorCisJeGNsb3NlKGZkKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9Db25maWcuc3JjIGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWUxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lZGl0b3JzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSw3OCBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiRWRpdG9ycyIKKworSU5TRVJUCisKK2NvbmZpZyBBV0sKKwlib29sICJhd2siCisJZGVmYXVsdCB5CisJaGVscAorCSAgQXdrIGlzIHVzZWQgYXMgYSBwYXR0ZXJuIHNjYW5uaW5nIGFuZCBwcm9jZXNzaW5nIGxhbmd1YWdlLiBUaGlzIGlzCisJICB0aGUgQnVzeUJveCBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IHByb2dyYW1taW5nIGxhbmd1YWdlLgorCitjb25maWcgRkVBVFVSRV9BV0tfTElCTQorCWJvb2wgIkVuYWJsZSBtYXRoIGZ1bmN0aW9ucyAocmVxdWlyZXMgbGlibSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBV0sKKwloZWxwCisJICBFbmFibGUgbWF0aCBmdW5jdGlvbnMgb2YgdGhlIEF3ayBwcm9ncmFtbWluZyBsYW5ndWFnZS4KKwkgIE5PVEU6IFRoaXMgd2lsbCByZXF1aXJlIGxpYm0gdG8gYmUgcHJlc2VudCBmb3IgbGlua2luZy4KKworY29uZmlnIENNUAorCWJvb2wgImNtcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjbXAgaXMgdXNlZCB0byBjb21wYXJlIHR3byBmaWxlcyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0CisJICB0byBzdGFuZGFyZCBvdXRwdXQuCisKK2NvbmZpZyBESUZGCisJYm9vbCAiZGlmZiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBkaWZmIGNvbXBhcmVzIHR3byBmaWxlcyBvciBkaXJlY3RvcmllcyBhbmQgb3V0cHV0cyB0aGUKKwkgIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlbSBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgZ2l2ZW4gdG8KKwkgIHRoZSBwYXRjaCBjb21tYW5kLgorCitjb25maWcgRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBESUZGICYmIExPTkdfT1BUUworCWhlbHAKKwkgIEVuYWJsZSB1c2Ugb2YgbG9uZyBvcHRpb25zLgorCitjb25maWcgRkVBVFVSRV9ESUZGX0RJUgorCWJvb2wgIkVuYWJsZSBkaXJlY3Rvcnkgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERJRkYKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGRpcmVjdG9yeSBhbmQgc3ViZGlyZWN0b3J5CisJICBjb21wYXJpc29uLgorCitjb25maWcgRUQKKwlib29sICJlZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgb3JpZ2luYWwgMTk3MCdzIFVuaXggdGV4dCBlZGl0b3IsIGZyb20gdGhlIGRheXMgb2YgdGVsZXR5cGVzLgorCSAgU21hbGwsIHNpbXBsZSwgZXZpbC4gUGFydCBvZiBTVVN2My4gSWYgeW91J3JlIG5vdCBhbHJlYWR5IHVzaW5nCisJICB0aGlzLCB5b3UgZG9uJ3QgbmVlZCBpdC4KKworY29uZmlnIFNFRAorCWJvb2wgInNlZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzZWQgaXMgdXNlZCB0byBwZXJmb3JtIHRleHQgdHJhbnNmb3JtYXRpb25zIG9uIGEgZmlsZQorCSAgb3IgaW5wdXQgZnJvbSBhIHBpcGVsaW5lLgorCitjb25maWcgRkVBVFVSRV9BTExPV19FWEVDCisJYm9vbCAiQWxsb3cgdmkgYW5kIGF3ayB0byBleGVjdXRlIHNoZWxsIGNvbW1hbmRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVkkgfHwgQVdLCisJaGVscAorCSAgRW5hYmxlcyB2aSBhbmQgYXdrIGZlYXR1cmVzIHdoaWNoIGFsbG93cyB1c2VyIHRvIGV4ZWN1dGUKKwkgIHNoZWxsIGNvbW1hbmRzICh1c2luZyBzeXN0ZW0oKSBDIGNhbGwpLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lZGl0b3JzL0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9lZGl0b3JzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4OGNiYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE0IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19BV0spICAgICAgICs9IGF3ay5vCitsaWItJChDT05GSUdfQ01QKSAgICAgICArPSBjbXAubworbGliLSQoQ09ORklHX0RJRkYpICAgICAgKz0gZGlmZi5vCitsaWItJChDT05GSUdfRUQpICAgICAgICArPSBlZC5vCitsaWItJChDT05GSUdfU0VEKSAgICAgICArPSBzZWQubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9hd2suYyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvYXdrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4NTU0NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvYXdrLmMKQEAgLTAsMCArMSwzMTM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhd2sgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgRG1pdHJ5IFpha2hhcm92IDxkbWl0QGNycC5iYW5rLmdvdi51YT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhd2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbQVdLX1BST0dSQU1dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBhd2tfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLXYgVkFSPVZBTAlTZXQgdmFyaWFibGUiCisvL3VzYWdlOiAgICAgIlxuCS1GIFNFUAkJVXNlIFNFUCBhcyBmaWVsZCBzZXBhcmF0b3IiCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJCVJlYWQgcHJvZ3JhbSBmcm9tIEZJTEUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInhyZWdleC5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisvKiBJZiB5b3UgY29tbWVudCBvdXQgb25lIG9mIHRoZXNlIGJlbG93LCBpdCB3aWxsIGJlICNkZWZpbmVkIGxhdGVyCisgKiB0byBwZXJmb3JtIGRlYnVnIHByaW50ZnMgdG8gc3RkZXJyOiAqLworI2RlZmluZSBkZWJ1Z19wcmludGZfd2Fsa2VyKC4uLikgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfZXZhbCguLi4pICBkbyB7fSB3aGlsZSAoMCkKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfd2Fsa2VyCisjIGRlZmluZSBkZWJ1Z19wcmludGZfd2Fsa2VyKC4uLikgKGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKyNpZm5kZWYgZGVidWdfcHJpbnRmX2V2YWwKKyMgZGVmaW5lIGRlYnVnX3ByaW50Zl9ldmFsKC4uLikgKGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworCisKKyNkZWZpbmUJTUFYVkFSRk1UICAgICAgIDI0MAorI2RlZmluZQlNSU5OVkJMT0NLICAgICAgNjQKKworLyogdmFyaWFibGUgZmxhZ3MgKi8KKyNkZWZpbmUJVkZfTlVNQkVSICAgICAgIDB4MDAwMQkvKiAxID0gcHJpbWFyeSB0eXBlIGlzIG51bWJlciAqLworI2RlZmluZQlWRl9BUlJBWSAgICAgICAgMHgwMDAyCS8qIDEgPSBpdCdzIGFuIGFycmF5ICovCisKKyNkZWZpbmUJVkZfQ0FDSEVEICAgICAgIDB4MDEwMAkvKiAxID0gbnVtL3N0ciB2YWx1ZSBoYXMgY2FjaGVkIHN0ci9udW0gZXEgKi8KKyNkZWZpbmUJVkZfVVNFUiAgICAgICAgIDB4MDIwMAkvKiAxID0gdXNlciBpbnB1dCAobWF5IGJlIG51bWVyaWMgc3RyaW5nKSAqLworI2RlZmluZQlWRl9TUEVDSUFMICAgICAgMHgwNDAwCS8qIDEgPSByZXF1aXJlcyBleHRyYSBoYW5kbGluZyB3aGVuIGNoYW5nZWQgKi8KKyNkZWZpbmUJVkZfV0FMSyAgICAgICAgIDB4MDgwMAkvKiAxID0gdmFyaWFibGUgaGFzIGFsbG9jJ2QgeC53YWxrZXIgbGlzdCAqLworI2RlZmluZQlWRl9GU1RSICAgICAgICAgMHgxMDAwCS8qIDEgPSB2YXI6OnN0cmluZyBwb2ludHMgdG8gZnN0cmluZyBidWZmZXIgKi8KKyNkZWZpbmUJVkZfQ0hJTEQgICAgICAgIDB4MjAwMAkvKiAxID0gZnVuY3Rpb24gYXJnOyB4LnBhcmVudCBwb2ludHMgdG8gc291cmNlICovCisjZGVmaW5lCVZGX0RJUlRZICAgICAgICAweDQwMDAJLyogMSA9IHZhcmlhYmxlIHdhcyBzZXQgZXhwbGljaXRseSAqLworCisvKiB0aGVzZSBmbGFncyBhcmUgc3RhdGljLCBkb24ndCBjaGFuZ2UgdGhlbSB3aGVuIHZhbHVlIGlzIGNoYW5nZWQgKi8KKyNkZWZpbmUJVkZfRE9OVFRPVUNIICAgIChWRl9BUlJBWSB8IFZGX1NQRUNJQUwgfCBWRl9XQUxLIHwgVkZfQ0hJTEQgfCBWRl9ESVJUWSkKKwordHlwZWRlZiBzdHJ1Y3Qgd2Fsa2VyX2xpc3QgeworCWNoYXIgKmVuZDsKKwljaGFyICpjdXI7CisJc3RydWN0IHdhbGtlcl9saXN0ICpwcmV2OworCWNoYXIgd2J1ZlsxXTsKK30gd2Fsa2VyX2xpc3Q7CisKKy8qIFZhcmlhYmxlICovCit0eXBlZGVmIHN0cnVjdCB2YXJfcyB7CisJdW5zaWduZWQgdHlwZTsgICAgICAgICAgICAvKiBmbGFncyAqLworCWRvdWJsZSBudW1iZXI7CisJY2hhciAqc3RyaW5nOworCXVuaW9uIHsKKwkJaW50IGFpZHg7ICAgICAgICAgICAgICAgLyogZnVuYyBhcmcgaWR4IChmb3IgY29tcGlsYXRpb24gc3RhZ2UpICovCisJCXN0cnVjdCB4aGFzaF9zICphcnJheTsgIC8qIGFycmF5IHB0ciAqLworCQlzdHJ1Y3QgdmFyX3MgKnBhcmVudDsgICAvKiBmb3IgZnVuYyBhcmdzLCBwdHIgdG8gYWN0dWFsIHBhcmFtZXRlciAqLworCQl3YWxrZXJfbGlzdCAqd2Fsa2VyOyAgICAvKiBsaXN0IG9mIGFycmF5IGVsZW1lbnRzIChmb3IuLmluKSAqLworCX0geDsKK30gdmFyOworCisvKiBOb2RlIGNoYWluIChwYXR0ZXJuLWFjdGlvbiBjaGFpbiwgQkVHSU4sIEVORCwgZnVuY3Rpb24gYm9kaWVzKSAqLwordHlwZWRlZiBzdHJ1Y3QgY2hhaW5fcyB7CisJc3RydWN0IG5vZGVfcyAqZmlyc3Q7CisJc3RydWN0IG5vZGVfcyAqbGFzdDsKKwljb25zdCBjaGFyICpwcm9ncmFtbmFtZTsKK30gY2hhaW47CisKKy8qIEZ1bmN0aW9uICovCit0eXBlZGVmIHN0cnVjdCBmdW5jX3MgeworCXVuc2lnbmVkIG5hcmdzOworCXN0cnVjdCBjaGFpbl9zIGJvZHk7Cit9IGZ1bmM7CisKKy8qIEkvTyBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0IHJzdHJlYW1fcyB7CisJRklMRSAqRjsKKwljaGFyICpidWZmZXI7CisJaW50IGFkdjsKKwlpbnQgc2l6ZTsKKwlpbnQgcG9zOworCXNtYWxsaW50IGlzX3BpcGU7Cit9IHJzdHJlYW07CisKK3R5cGVkZWYgc3RydWN0IGhhc2hfaXRlbV9zIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB2YXJfcyB2OyAgICAgICAgIC8qIHZhcmlhYmxlL2FycmF5IGhhc2ggKi8KKwkJc3RydWN0IHJzdHJlYW1fcyByczsgICAgLyogcmVkaXJlY3Qgc3RyZWFtcyBoYXNoICovCisJCXN0cnVjdCBmdW5jX3MgZjsgICAgICAgIC8qIGZ1bmN0aW9ucyBoYXNoICovCisJfSBkYXRhOworCXN0cnVjdCBoYXNoX2l0ZW1fcyAqbmV4dDsgICAgICAgLyogbmV4dCBpbiBjaGFpbiAqLworCWNoYXIgbmFtZVsxXTsgICAgICAgICAgICAgICAgICAgLyogcmVhbGx5IGl0J3MgbG9uZ2VyICovCit9IGhhc2hfaXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgeGhhc2hfcyB7CisJdW5zaWduZWQgbmVsOyAgICAgICAgICAgLyogbnVtIG9mIGVsZW1lbnRzICovCisJdW5zaWduZWQgY3NpemU7ICAgICAgICAgLyogY3VycmVudCBoYXNoIHNpemUgKi8KKwl1bnNpZ25lZCBucHJpbWU7ICAgICAgICAvKiBuZXh0IGhhc2ggc2l6ZSBpbiBQUklNRVNbXSAqLworCXVuc2lnbmVkIGdsZW47ICAgICAgICAgIC8qIHN1bW1hcnkgbGVuZ3RoIG9mIGl0ZW0gbmFtZXMgKi8KKwlzdHJ1Y3QgaGFzaF9pdGVtX3MgKippdGVtczsKK30geGhhc2g7CisKKy8qIFRyZWUgbm9kZSAqLwordHlwZWRlZiBzdHJ1Y3Qgbm9kZV9zIHsKKwl1aW50MzJfdCBpbmZvOworCXVuc2lnbmVkIGxpbmVubzsKKwl1bmlvbiB7CisJCXN0cnVjdCBub2RlX3MgKm47CisJCXZhciAqdjsKKwkJaW50IGFpZHg7CisJCWNoYXIgKm5ld19wcm9nbmFtZTsKKwkJcmVnZXhfdCAqcmU7CisJfSBsOworCXVuaW9uIHsKKwkJc3RydWN0IG5vZGVfcyAqbjsKKwkJcmVnZXhfdCAqaXJlOworCQlmdW5jICpmOworCX0gcjsKKwl1bmlvbiB7CisJCXN0cnVjdCBub2RlX3MgKm47CisJfSBhOworfSBub2RlOworCisvKiBCbG9jayBvZiB0ZW1wb3JhcnkgdmFyaWFibGVzICovCit0eXBlZGVmIHN0cnVjdCBudmJsb2NrX3MgeworCWludCBzaXplOworCXZhciAqcG9zOworCXN0cnVjdCBudmJsb2NrX3MgKnByZXY7CisJc3RydWN0IG52YmxvY2tfcyAqbmV4dDsKKwl2YXIgbnZbXTsKK30gbnZibG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgdHNwbGl0dGVyX3MgeworCW5vZGUgbjsKKwlyZWdleF90IHJlWzJdOworfSB0c3BsaXR0ZXI7CisKKy8qIHNpbXBsZSB0b2tlbiBjbGFzc2VzICovCisvKiBPcmRlciBhbmQgaGV4IHZhbHVlcyBhcmUgdmVyeSBpbXBvcnRhbnQhISEgIFNlZSBuZXh0X3Rva2VuKCkgKi8KKyNkZWZpbmUJVENfU0VRU1RBUlQJIDEJCQkJLyogKCAqLworI2RlZmluZQlUQ19TRVFURVJNCSgxIDw8IDEpCQkvKiApICovCisjZGVmaW5lCVRDX1JFR0VYUAkoMSA8PCAyKQkJLyogLy4uLi8gKi8KKyNkZWZpbmUJVENfT1VUUkRSCSgxIDw8IDMpCQkvKiB8ID4gPj4gKi8KKyNkZWZpbmUJVENfVU9QUE9TVAkoMSA8PCA0KQkJLyogdW5hcnkgcG9zdGZpeCBvcGVyYXRvciAqLworI2RlZmluZQlUQ19VT1BQUkUxCSgxIDw8IDUpCQkvKiB1bmFyeSBwcmVmaXggb3BlcmF0b3IgKi8KKyNkZWZpbmUJVENfQklOT1BYCSgxIDw8IDYpCQkvKiB0d28tb3BuZCBvcGVyYXRvciAqLworI2RlZmluZQlUQ19JTgkJKDEgPDwgNykKKyNkZWZpbmUJVENfQ09NTUEJKDEgPDwgOCkKKyNkZWZpbmUJVENfUElQRQkJKDEgPDwgOSkJCS8qIGlucHV0IHJlZGlyZWN0aW9uIHBpcGUgKi8KKyNkZWZpbmUJVENfVU9QUFJFMgkoMSA8PCAxMCkJCS8qIHVuYXJ5IHByZWZpeCBvcGVyYXRvciAqLworI2RlZmluZQlUQ19BUlJURVJNCSgxIDw8IDExKQkJLyogXSAqLworI2RlZmluZQlUQ19HUlBTVEFSVAkoMSA8PCAxMikJCS8qIHsgKi8KKyNkZWZpbmUJVENfR1JQVEVSTQkoMSA8PCAxMykJCS8qIH0gKi8KKyNkZWZpbmUJVENfU0VNSUNPTAkoMSA8PCAxNCkKKyNkZWZpbmUJVENfTkVXTElORQkoMSA8PCAxNSkKKyNkZWZpbmUJVENfU1RBVFgJKDEgPDwgMTYpCQkvKiBjdGwgc3RhdGVtZW50IChmb3IsIG5leHQuLi4pICovCisjZGVmaW5lCVRDX1dISUxFCSgxIDw8IDE3KQorI2RlZmluZQlUQ19FTFNFCQkoMSA8PCAxOCkKKyNkZWZpbmUJVENfQlVJTFRJTgkoMSA8PCAxOSkKKyNkZWZpbmUJVENfR0VUTElORQkoMSA8PCAyMCkKKyNkZWZpbmUJVENfRlVOQ0RFQ0wJKDEgPDwgMjEpCQkvKiBgZnVuY3Rpb24nIGBmdW5jJyAqLworI2RlZmluZQlUQ19CRUdJTgkoMSA8PCAyMikKKyNkZWZpbmUJVENfRU5ECQkoMSA8PCAyMykKKyNkZWZpbmUJVENfRU9GCQkoMSA8PCAyNCkKKyNkZWZpbmUJVENfVkFSSUFCTEUJKDEgPDwgMjUpCisjZGVmaW5lCVRDX0FSUkFZCSgxIDw8IDI2KQorI2RlZmluZQlUQ19GVU5DVElPTgkoMSA8PCAyNykKKyNkZWZpbmUJVENfU1RSSU5HCSgxIDw8IDI4KQorI2RlZmluZQlUQ19OVU1CRVIJKDEgPDwgMjkpCisKKyNkZWZpbmUJVENfVU9QUFJFICAoVENfVU9QUFJFMSB8IFRDX1VPUFBSRTIpCisKKy8qIGNvbWJpbmVkIHRva2VuIGNsYXNzZXMgKi8KKyNkZWZpbmUJVENfQklOT1AgICAoVENfQklOT1BYIHwgVENfQ09NTUEgfCBUQ19QSVBFIHwgVENfSU4pCisjZGVmaW5lCVRDX1VOQVJZT1AgKFRDX1VPUFBSRSB8IFRDX1VPUFBPU1QpCisjZGVmaW5lCVRDX09QRVJBTkQgKFRDX1ZBUklBQkxFIHwgVENfQVJSQVkgfCBUQ19GVU5DVElPTiBcCisgICAgICAgICAgICAgICAgICAgfCBUQ19CVUlMVElOIHwgVENfR0VUTElORSB8IFRDX1NFUVNUQVJUIHwgVENfU1RSSU5HIHwgVENfTlVNQkVSKQorCisjZGVmaW5lCVRDX1NUQVRFTU5UIChUQ19TVEFUWCB8IFRDX1dISUxFKQorI2RlZmluZQlUQ19PUFRFUk0gIChUQ19TRU1JQ09MIHwgVENfTkVXTElORSkKKworLyogd29yZCB0b2tlbnMsIGNhbm5vdCBtZWFuIHNvbWV0aGluZyBlbHNlIGlmIG5vdCBleHBlY3RlZCAqLworI2RlZmluZQlUQ19XT1JEICAgIChUQ19JTiB8IFRDX1NUQVRFTU5UIHwgVENfRUxTRSB8IFRDX0JVSUxUSU4gXAorICAgICAgICAgICAgICAgICAgIHwgVENfR0VUTElORSB8IFRDX0ZVTkNERUNMIHwgVENfQkVHSU4gfCBUQ19FTkQpCisKKy8qIGRpc2NhcmQgbmV3bGluZXMgYWZ0ZXIgdGhlc2UgKi8KKyNkZWZpbmUJVENfTk9URVJNICAoVENfQ09NTUEgfCBUQ19HUlBTVEFSVCB8IFRDX0dSUFRFUk0gXAorICAgICAgICAgICAgICAgICAgIHwgVENfQklOT1AgfCBUQ19PUFRFUk0pCisKKy8qIHdoYXQgY2FuIGV4cHJlc3Npb24gYmVnaW4gd2l0aCAqLworI2RlZmluZQlUQ19PUFNFUSAgIChUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfUkVHRVhQKQorLyogd2hhdCBjYW4gZ3JvdXAgYmVnaW4gd2l0aCAqLworI2RlZmluZQlUQ19HUlBTRVEgIChUQ19PUFNFUSB8IFRDX09QVEVSTSB8IFRDX1NUQVRFTU5UIHwgVENfR1JQU1RBUlQpCisKKy8qIGlmIHByZXZpb3VzIHRva2VuIGNsYXNzIGlzIENPTkNBVDEgYW5kIG5leHQgaXMgQ09OQ0FUMiwgY29uY2F0ZW5hdGlvbiAqLworLyogb3BlcmF0b3IgaXMgaW5zZXJ0ZWQgYmV0d2VlbiB0aGVtICovCisjZGVmaW5lCVRDX0NPTkNBVDEgKFRDX1ZBUklBQkxFIHwgVENfQVJSVEVSTSB8IFRDX1NFUVRFUk0gXAorICAgICAgICAgICAgICAgICAgIHwgVENfU1RSSU5HIHwgVENfTlVNQkVSIHwgVENfVU9QUE9TVCkKKyNkZWZpbmUJVENfQ09OQ0FUMiAoVENfT1BFUkFORCB8IFRDX1VPUFBSRSkKKworI2RlZmluZQlPRl9SRVMxICAgIDB4MDEwMDAwCisjZGVmaW5lCU9GX1JFUzIgICAgMHgwMjAwMDAKKyNkZWZpbmUJT0ZfU1RSMSAgICAweDA0MDAwMAorI2RlZmluZQlPRl9TVFIyICAgIDB4MDgwMDAwCisjZGVmaW5lCU9GX05VTTEgICAgMHgxMDAwMDAKKyNkZWZpbmUJT0ZfQ0hFQ0tFRCAweDIwMDAwMAorCisvKiBjb21iaW5lZCBvcGVyYXRvciBmbGFncyAqLworI2RlZmluZQl4eAkwCisjZGVmaW5lCXhWCU9GX1JFUzIKKyNkZWZpbmUJeFMJKE9GX1JFUzIgfCBPRl9TVFIyKQorI2RlZmluZQlWeAlPRl9SRVMxCisjZGVmaW5lCVZWCShPRl9SRVMxIHwgT0ZfUkVTMikKKyNkZWZpbmUJTngJKE9GX1JFUzEgfCBPRl9OVU0xKQorI2RlZmluZQlOVgkoT0ZfUkVTMSB8IE9GX05VTTEgfCBPRl9SRVMyKQorI2RlZmluZQlTeAkoT0ZfUkVTMSB8IE9GX1NUUjEpCisjZGVmaW5lCVNWCShPRl9SRVMxIHwgT0ZfU1RSMSB8IE9GX1JFUzIpCisjZGVmaW5lCVNTCShPRl9SRVMxIHwgT0ZfU1RSMSB8IE9GX1JFUzIgfCBPRl9TVFIyKQorCisjZGVmaW5lCU9QQ0xTTUFTSyAweEZGMDAKKyNkZWZpbmUJT1BOTUFTSyAgIDB4MDA3RgorCisvKiBvcGVyYXRvciBwcmlvcml0eSBpcyBhIGhpZ2hlc3QgYnl0ZSAoZXZlbjogci0+bCwgb2RkOiBsLT5yIGdyb3VwaW5nKQorICogRm9yIGJ1aWx0aW5zIGl0IGhhcyBkaWZmZXJlbnQgbWVhbmluZzogbiBuIHMzIHMyIHMxIHYzIHYyIHYxLAorICogbiAtIG1pbi4gbnVtYmVyIG9mIGFyZ3MsIHZOIC0gcmVzb2x2ZSBOdGggYXJnIHRvIHZhciwgc04gLSByZXNvbHZlIHRvIHN0cmluZworICovCisjZGVmaW5lIFAoeCkgICAgICAoeCA8PCAyNCkKKyNkZWZpbmUgUFJJTUFTSyAgIDB4N0YwMDAwMDAKKyNkZWZpbmUgUFJJTUFTSzIgIDB4N0UwMDAwMDAKKworLyogT3BlcmF0aW9uIGNsYXNzZXMgKi8KKworI2RlZmluZQlTSElGVF9USUxfVEhJUwkweDA2MDAKKyNkZWZpbmUJUkVDVVJfRlJPTV9USElTCTB4MTAwMAorCitlbnVtIHsKKwlPQ19ERUxFVEUgPSAweDAxMDAsICAgICBPQ19FWEVDID0gMHgwMjAwLCAgICAgICBPQ19ORVdTT1VSQ0UgPSAweDAzMDAsCisJT0NfUFJJTlQgPSAweDA0MDAsICAgICAgT0NfUFJJTlRGID0gMHgwNTAwLCAgICAgT0NfV0FMS0lOSVQgPSAweDA2MDAsCisKKwlPQ19CUiA9IDB4MDcwMCwgICAgICAgICBPQ19CUkVBSyA9IDB4MDgwMCwgICAgICBPQ19DT05USU5VRSA9IDB4MDkwMCwKKwlPQ19FWElUID0gMHgwYTAwLCAgICAgICBPQ19ORVhUID0gMHgwYjAwLCAgICAgICBPQ19ORVhURklMRSA9IDB4MGMwMCwKKwlPQ19URVNUID0gMHgwZDAwLCAgICAgICBPQ19XQUxLTkVYVCA9IDB4MGUwMCwKKworCU9DX0JJTkFSWSA9IDB4MTAwMCwgICAgIE9DX0JVSUxUSU4gPSAweDExMDAsICAgIE9DX0NPTE9OID0gMHgxMjAwLAorCU9DX0NPTU1BID0gMHgxMzAwLCAgICAgIE9DX0NPTVBBUkUgPSAweDE0MDAsICAgIE9DX0NPTkNBVCA9IDB4MTUwMCwKKwlPQ19GQkxUSU4gPSAweDE2MDAsICAgICBPQ19GSUVMRCA9IDB4MTcwMCwgICAgICBPQ19GTkFSRyA9IDB4MTgwMCwKKwlPQ19GVU5DID0gMHgxOTAwLCAgICAgICBPQ19HRVRMSU5FID0gMHgxYTAwLCAgICBPQ19JTiA9IDB4MWIwMCwKKwlPQ19MQU5EID0gMHgxYzAwLCAgICAgICBPQ19MT1IgPSAweDFkMDAsICAgICAgICBPQ19NQVRDSCA9IDB4MWUwMCwKKwlPQ19NT1ZFID0gMHgxZjAwLCAgICAgICBPQ19QR0VUTElORSA9IDB4MjAwMCwgICBPQ19SRUdFWFAgPSAweDIxMDAsCisJT0NfUkVQTEFDRSA9IDB4MjIwMCwgICAgT0NfUkVUVVJOID0gMHgyMzAwLCAgICAgT0NfU1BSSU5URiA9IDB4MjQwMCwKKwlPQ19URVJOQVJZID0gMHgyNTAwLCAgICBPQ19VTkFSWSA9IDB4MjYwMCwgICAgICBPQ19WQVIgPSAweDI3MDAsCisJT0NfRE9ORSA9IDB4MjgwMCwKKworCVNUX0lGID0gMHgzMDAwLCAgICAgICAgIFNUX0RPID0gMHgzMTAwLCAgICAgICAgIFNUX0ZPUiA9IDB4MzIwMCwKKwlTVF9XSElMRSA9IDB4MzMwMAorfTsKKworLyogc2ltcGxlIGJ1aWx0aW5zICovCitlbnVtIHsKKwlGX2luLAlGX3JuLAlGX2NvLAlGX2V4LAlGX2xnLAlGX3NpLAlGX3NxLAlGX3NyLAorCUZfdGksCUZfbGUsCUZfc3ksCUZfZmYsCUZfY2wKK307CisKKy8qIGJ1aWx0aW5zICovCitlbnVtIHsKKwlCX2EyLAlCX2l4LAlCX21hLAlCX3NwLAlCX3NzLAlCX3RpLCAgIEJfbXQsCUJfbG8sCUJfdXAsCisJQl9nZSwJQl9ncywJQl9zdSwKKwlCX2FuLAlCX2NvLAlCX2xzLAlCX29yLAlCX3JzLAlCX3hvLAorfTsKKworLyogdG9rZW5zIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGluZm8gdmFsdWVzICovCisKKyNkZWZpbmUgTlRDICAgICAiXDM3NyIgIC8qIHN3aXRjaCB0byBuZXh0IHRva2VuIGNsYXNzICh0Yzw8MSkgKi8KKyNkZWZpbmUgTlRDQyAgICAnXDM3NycKKworI2RlZmluZSBPQ19CICBPQ19CVUlMVElOCisKK3N0YXRpYyBjb25zdCBjaGFyIHRva2VubGlzdFtdIEFMSUdOMSA9CisJIlwxKCIgICAgICAgICBOVEMKKwkiXDEpIiAgICAgICAgIE5UQworCSJcMS8iICAgICAgICAgTlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRUdFWFAgKi8KKwkiXDI+PiIgICAgICAgICJcMT4iICAgICAgICAgIlwxfCIgICAgICAgTlRDICAgICAgICAgLyogT1VUUkRSICovCisJIlwyKysiICAgICAgICAiXDItLSIgICAgICAgIE5UQyAgICAgICAgICAgICAgICAgICAgIC8qIFVPUFBPU1QgKi8KKwkiXDIrKyIgICAgICAgICJcMi0tIiAgICAgICAgIlwxJCIgICAgICAgTlRDICAgICAgICAgLyogVU9QUFJFMSAqLworCSJcMj09IiAgICAgICAgIlwxPSIgICAgICAgICAiXDIrPSIgICAgICAiXDItPSIgICAgICAvKiBCSU5PUFggKi8KKwkiXDIqPSIgICAgICAgICJcMi89IiAgICAgICAgIlwyJT0iICAgICAgIlwyXj0iCisJIlwxKyIgICAgICAgICAiXDEtIiAgICAgICAgICJcMyoqPSIgICAgICJcMioqIgorCSJcMS8iICAgICAgICAgIlwxJSIgICAgICAgICAiXDFeIiAgICAgICAiXDEqIgorCSJcMiE9IiAgICAgICAgIlwyPj0iICAgICAgICAiXDI8PSIgICAgICAiXDE+IgorCSJcMTwiICAgICAgICAgIlwyIX4iICAgICAgICAiXDF+IiAgICAgICAiXDImJiIKKwkiXDJ8fCIgICAgICAgICJcMT8iICAgICAgICAgIlwxOiIgICAgICAgTlRDCisJIlwyaW4iICAgICAgICBOVEMKKwkiXDEsIiAgICAgICAgIE5UQworCSJcMXwiICAgICAgICAgTlRDCisJIlwxKyIgICAgICAgICAiXDEtIiAgICAgICAgICJcMSEiICAgICAgIE5UQyAgICAgICAgIC8qIFVPUFBSRTIgKi8KKwkiXDFdIiAgICAgICAgIE5UQworCSJcMXsiICAgICAgICAgTlRDCisJIlwxfSIgICAgICAgICBOVEMKKwkiXDE7IiAgICAgICAgIE5UQworCSJcMVxuIiAgICAgICAgTlRDCisJIlwyaWYiICAgICAgICAiXDJkbyIgICAgICAgICJcM2ZvciIgICAgICJcNWJyZWFrIiAgIC8qIFNUQVRYICovCisJIlwxMGNvbnRpbnVlIiAiXDZkZWxldGUiICAgICJcNXByaW50IgorCSJcNnByaW50ZiIgICAgIlw0bmV4dCIgICAgICAiXDEwbmV4dGZpbGUiCisJIlw2cmV0dXJuIiAgICAiXDRleGl0IiAgICAgIE5UQworCSJcNXdoaWxlIiAgICAgTlRDCisJIlw0ZWxzZSIgICAgICBOVEMKKworCSJcM2FuZCIgICAgICAgIlw1Y29tcGwiICAgICAiXDZsc2hpZnQiICAiXDJvciIKKwkiXDZyc2hpZnQiICAgICJcM3hvciIKKwkiXDVjbG9zZSIgICAgICJcNnN5c3RlbSIgICAgIlw2ZmZsdXNoIiAgIlw1YXRhbjIiICAgLyogQlVJTFRJTiAqLworCSJcM2NvcyIgICAgICAgIlwzZXhwIiAgICAgICAiXDNpbnQiICAgICAiXDNsb2ciCisJIlw0cmFuZCIgICAgICAiXDNzaW4iICAgICAgICJcNHNxcnQiICAgICJcNXNyYW5kIgorCSJcNmdlbnN1YiIgICAgIlw0Z3N1YiIgICAgICAiXDVpbmRleCIgICAiXDZsZW5ndGgiCisJIlw1bWF0Y2giICAgICAiXDVzcGxpdCIgICAgICJcN3NwcmludGYiICJcM3N1YiIKKwkiXDZzdWJzdHIiICAgICJcN3N5c3RpbWUiICAgIlwxMHN0cmZ0aW1lIiAiXDZta3RpbWUiCisJIlw3dG9sb3dlciIgICAiXDd0b3VwcGVyIiAgIE5UQworCSJcN2dldGxpbmUiICAgTlRDCisJIlw0ZnVuYyIgICAgICAiXDEwZnVuY3Rpb24iIE5UQworCSJcNUJFR0lOIiAgICAgTlRDCisJIlwzRU5EIgorCS8qIGNvbXBpbGVyIGFkZHMgdHJhaWxpbmcgIlwwIiAqLworCTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHRva2VuaW5mb1tdID0geworCTAsCisJMCwKKwlPQ19SRUdFWFAsCisJeFN8J2EnLCAgICAgICAgICAgICAgICAgIHhTfCd3JywgICAgICAgICAgICAgICAgICB4U3wnfCcsCisJT0NfVU5BUll8eFZ8UCg5KXwncCcsICAgIE9DX1VOQVJZfHhWfFAoOSl8J20nLAorCU9DX1VOQVJZfHhWfFAoOSl8J1AnLCAgICBPQ19VTkFSWXx4VnxQKDkpfCdNJywgICAgT0NfRklFTER8eFZ8UCg1KSwKKwlPQ19DT01QQVJFfFZWfFAoMzkpfDUsICAgT0NfTU9WRXxWVnxQKDc0KSwgICAgICAgIE9DX1JFUExBQ0V8TlZ8UCg3NCl8JysnLCBPQ19SRVBMQUNFfE5WfFAoNzQpfCctJywKKwlPQ19SRVBMQUNFfE5WfFAoNzQpfCcqJywgT0NfUkVQTEFDRXxOVnxQKDc0KXwnLycsIE9DX1JFUExBQ0V8TlZ8UCg3NCl8JyUnLCBPQ19SRVBMQUNFfE5WfFAoNzQpfCcmJywKKwlPQ19CSU5BUll8TlZ8UCgyOSl8JysnLCAgT0NfQklOQVJZfE5WfFAoMjkpfCctJywgIE9DX1JFUExBQ0V8TlZ8UCg3NCl8JyYnLCBPQ19CSU5BUll8TlZ8UCgxNSl8JyYnLAorCU9DX0JJTkFSWXxOVnxQKDI1KXwnLycsICBPQ19CSU5BUll8TlZ8UCgyNSl8JyUnLCAgT0NfQklOQVJZfE5WfFAoMTUpfCcmJywgIE9DX0JJTkFSWXxOVnxQKDI1KXwnKicsCisJT0NfQ09NUEFSRXxWVnxQKDM5KXw0LCAgIE9DX0NPTVBBUkV8VlZ8UCgzOSl8MywgICBPQ19DT01QQVJFfFZWfFAoMzkpfDAsICAgT0NfQ09NUEFSRXxWVnxQKDM5KXwxLAorCU9DX0NPTVBBUkV8VlZ8UCgzOSl8MiwgICBPQ19NQVRDSHxTeHxQKDQ1KXwnIScsICAgT0NfTUFUQ0h8U3h8UCg0NSl8J34nLCAgIE9DX0xBTkR8Vnh8UCg1NSksCisJT0NfTE9SfFZ4fFAoNTkpLCAgICAgICAgIE9DX1RFUk5BUll8Vnh8UCg2NCl8Jz8nLCBPQ19DT0xPTnx4eHxQKDY3KXwnOicsCisJT0NfSU58U1Z8UCg0OSksIC8qIGluICovCisJT0NfQ09NTUF8U1N8UCg4MCksCisJT0NfUEdFVExJTkV8U1Z8UCgzNyksCisJT0NfVU5BUll8eFZ8UCgxOSl8JysnLCAgIE9DX1VOQVJZfHhWfFAoMTkpfCctJywgICBPQ19VTkFSWXx4VnxQKDE5KXwnIScsCisJMCwgLyogXSAqLworCTAsCisJMCwKKwkwLAorCTAsIC8qIFxuICovCisJU1RfSUYsICAgICAgICBTVF9ETywgICAgICAgIFNUX0ZPUiwgICAgICBPQ19CUkVBSywKKwlPQ19DT05USU5VRSwgIE9DX0RFTEVURXxWeCwgT0NfUFJJTlQsCisJT0NfUFJJTlRGLCAgICBPQ19ORVhULCAgICAgIE9DX05FWFRGSUxFLAorCU9DX1JFVFVSTnxWeCwgT0NfRVhJVHxOeCwKKwlTVF9XSElMRSwKKwkwLCAvKiBlbHNlICovCisKKwlPQ19CfEJfYW58UCgweDgzKSwgT0NfQnxCX2NvfFAoMHg0MSksIE9DX0J8Ql9sc3xQKDB4ODMpLCBPQ19CfEJfb3J8UCgweDgzKSwKKwlPQ19CfEJfcnN8UCgweDgzKSwgT0NfQnxCX3hvfFAoMHg4MyksCisJT0NfRkJMVElOfFN4fEZfY2wsIE9DX0ZCTFRJTnxTeHxGX3N5LCBPQ19GQkxUSU58U3h8Rl9mZiwgT0NfQnxCX2EyfFAoMHg4MyksCisJT0NfRkJMVElOfE54fEZfY28sIE9DX0ZCTFRJTnxOeHxGX2V4LCBPQ19GQkxUSU58Tnh8Rl9pbiwgT0NfRkJMVElOfE54fEZfbGcsCisJT0NfRkJMVElOfEZfcm4sICAgIE9DX0ZCTFRJTnxOeHxGX3NpLCBPQ19GQkxUSU58Tnh8Rl9zcSwgT0NfRkJMVElOfE54fEZfc3IsCisJT0NfQnxCX2dlfFAoMHhkNiksIE9DX0J8Ql9nc3xQKDB4YjYpLCBPQ19CfEJfaXh8UCgweDliKSwgT0NfRkJMVElOfFN4fEZfbGUsCisJT0NfQnxCX21hfFAoMHg4OSksIE9DX0J8Ql9zcHxQKDB4OGIpLCBPQ19TUFJJTlRGLCAgICAgICAgT0NfQnxCX3N1fFAoMHhiNiksCisJT0NfQnxCX3NzfFAoMHg4ZiksIE9DX0ZCTFRJTnxGX3RpLCAgICBPQ19CfEJfdGl8UCgweDBiKSwgT0NfQnxCX210fFAoMHgwYiksCisJT0NfQnxCX2xvfFAoMHg0OSksIE9DX0J8Ql91cHxQKDB4NDkpLAorCU9DX0dFVExJTkV8U1Z8UCgwKSwKKwkwLCAgICAgICAgICAgICAgICAgMCwKKwkwLAorCTAgLyogRU5EICovCit9OworCisvKiBpbnRlcm5hbCB2YXJpYWJsZSBuYW1lcyBhbmQgdGhlaXIgaW5pdGlhbCB2YWx1ZXMgICAgICAgKi8KKy8qIGFzdGVyaXNrIG1hcmtzIFNQRUNJQUwgdmFyczsgJCBpcyBqdXN0IG5vLW5hbWVkIEZpZWxkMCAqLworZW51bSB7CisJQ09OVkZNVCwgICAgT0ZNVCwgICAgICAgRlMsICAgICAgICAgT0ZTLAorCU9SUywgICAgICAgIFJTLCAgICAgICAgIFJULCAgICAgICAgIEZJTEVOQU1FLAorCVNVQlNFUCwgICAgIEYwLCAgICAgICAgIEFSR0lORCwgICAgIEFSR0MsCisJQVJHViwgICAgICAgRVJSTk8sICAgICAgRk5SLCAgICAgICAgTlIsCisJTkYsICAgICAgICAgSUdOT1JFQ0FTRSwgRU5WSVJPTiwgICAgTlVNX0lOVEVSTkFMX1ZBUlMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIHZOYW1lc1tdIEFMSUdOMSA9CisJIkNPTlZGTVRcMCIgIk9GTVRcMCIgICAgIkZTXDAqIiAgICAgIk9GU1wwIgorCSJPUlNcMCIgICAgICJSU1wwKiIgICAgICJSVFwwIiAgICAgICJGSUxFTkFNRVwwIgorCSJTVUJTRVBcMCIgICIkXDAqIiAgICAgICJBUkdJTkRcMCIgICJBUkdDXDAiCisJIkFSR1ZcMCIgICAgIkVSUk5PXDAiICAgIkZOUlwwIiAgICAgIk5SXDAiCisJIk5GXDAqIiAgICAgIklHTk9SRUNBU0VcMCoiICJFTlZJUk9OXDAiICJcMCI7CisKK3N0YXRpYyBjb25zdCBjaGFyIHZWYWx1ZXNbXSBBTElHTjEgPQorCSIlLjZnXDAiICAgICIlLjZnXDAiICAgICIgXDAiICAgICAgICIgXDAiCisJIlxuXDAiICAgICAgIlxuXDAiICAgICAgIlwwIiAgICAgICAgIlwwIgorCSJcMDM0XDAiICAgICJcMCIgICAgICAgICJcMzc3IjsKKworLyogaGFzaCBzaXplIG1heSBncm93IHRvIHRoZXNlIHZhbHVlcyAqLworI2RlZmluZSBGSVJTVF9QUklNRSA2MQorc3RhdGljIGNvbnN0IHVpbnQxNl90IFBSSU1FU1tdIEFMSUdOMiA9IHsgMjUxLCAxMDIxLCA0MDkzLCAxNjM4MSwgNjU1MjEgfTsKKworCisvKiBHbG9iYWxzLiBTcGxpdCBpbiB0d28gcGFydHMgc28gdGhhdCBmaXJzdCBvbmUgaXMgYWRkcmVzc2VkCisgKiB3aXRoIChtb3N0bHkgc2hvcnQpIG5lZ2F0aXZlIG9mZnNldHMuCisgKiBOQjogaXQncyB1bnNhZmUgdG8gcHV0IG1lbWJlcnMgb2YgdHlwZSAiZG91YmxlIgorICogaW50byBnbG9iYWxzMiAoZ2NjIG1heSBmYWlsIHRvIGFsaWduIHRoZW0pLgorICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJZG91YmxlIHRfZG91YmxlOworCWNoYWluIGJlZ2luc2VxLCBtYWluc2VxLCBlbmRzZXE7CisJY2hhaW4gKnNlcTsKKwlub2RlICpicmVha19wdHIsICpjb250aW51ZV9wdHI7CisJcnN0cmVhbSAqaUY7CisJeGhhc2ggKnZoYXNoLCAqYWhhc2gsICpmZGhhc2gsICpmbmhhc2g7CisJY29uc3QgY2hhciAqZ19wcm9nbmFtZTsKKwlpbnQgZ19saW5lbm87CisJaW50IG5maWVsZHM7CisJaW50IG1heGZpZWxkczsgLyogdXNlZCBpbiBmc3JlYWxsb2MoKSBvbmx5ICovCisJdmFyICpGaWVsZHM7CisJbnZibG9jayAqZ19jYjsKKwljaGFyICpnX3BvczsKKwljaGFyICpnX2J1ZjsKKwlzbWFsbGludCBpY2FzZTsKKwlzbWFsbGludCBleGl0aW5nOworCXNtYWxsaW50IG5leHRyZWM7CisJc21hbGxpbnQgbmV4dGZpbGU7CisJc21hbGxpbnQgaXNfZjBfc3BsaXQ7Cit9Oworc3RydWN0IGdsb2JhbHMyIHsKKwl1aW50MzJfdCB0X2luZm87IC8qIG9mdGVuIHVzZWQgKi8KKwl1aW50MzJfdCB0X3RjbGFzczsKKwljaGFyICp0X3N0cmluZzsKKwlpbnQgdF9saW5lbm87CisJaW50IHRfcm9sbGJhY2s7CisKKwl2YXIgKmludHZhcltOVU1fSU5URVJOQUxfVkFSU107IC8qIG9mdGVuIHVzZWQgKi8KKworCS8qIGZvcm1lciBzdGF0aWNzIGZyb20gdmFyaW91cyBmdW5jdGlvbnMgKi8KKwljaGFyICpzcGxpdF9mMF9fZnN0cmluZ3M7CisKKwl1aW50MzJfdCBuZXh0X3Rva2VuX19zYXZlX3RjbGFzczsKKwl1aW50MzJfdCBuZXh0X3Rva2VuX19zYXZlX2luZm87CisJdWludDMyX3QgbmV4dF90b2tlbl9fbHRjbGFzczsKKwlzbWFsbGludCBuZXh0X3Rva2VuX19jb25jYXRfaW5zZXJ0ZWQ7CisKKwlzbWFsbGludCBuZXh0X2lucHV0X2ZpbGVfX2ZpbGVzX2hhcHBlbjsKKwlyc3RyZWFtIG5leHRfaW5wdXRfZmlsZV9fcnNtOworCisJdmFyICpldmFsdWF0ZV9fZm5hcmdzOworCXVuc2lnbmVkIGV2YWx1YXRlX19zZWVkOworCXJlZ2V4X3QgZXZhbHVhdGVfX3NyZWc7CisKKwl2YXIgcHRlc3RfX3Y7CisKKwl0c3BsaXR0ZXIgZXhlY19idWlsdGluX190c3BsOworCisJLyogYmlnZ2VzdCBhbmQgbGVhc3QgdXNlZCBtZW1iZXJzIGdvIGxhc3QgKi8KKwl0c3BsaXR0ZXIgZnNwbGl0dGVyLCByc3BsaXR0ZXI7Cit9OworI2RlZmluZSBHMSAocHRyX3RvX2dsb2JhbHNbLTFdKQorI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzMiAqKXB0cl90b19nbG9iYWxzKQorLyogRm9yIGRlYnVnLiBubSAtLXNpemUtc29ydCBhd2subyB8IGdyZXAgLXZpICcgW3RyXSAnICovCisvKmNoYXIgRzFzaXplW3NpemVvZihHMSldOyAtIDB4NzQgKi8KKy8qY2hhciBHc2l6ZVtzaXplb2YoRyldOyAtIDB4MWM0ICovCisvKiBUcnlpbmcgdG8ga2VlcCBtb3N0IG9mIG1lbWJlcnMgYWNjZXNzaWJsZSB3aXRoIHNob3J0IG9mZnNldHM6ICovCisvKmNoYXIgR29mc19zZWVkW29mZnNldG9mKHN0cnVjdCBnbG9iYWxzMiwgZXZhbHVhdGVfX3NlZWQpXTsgLSAweDkwICovCisjZGVmaW5lIHRfZG91YmxlICAgICAoRzEudF9kb3VibGUgICAgKQorI2RlZmluZSBiZWdpbnNlcSAgICAgKEcxLmJlZ2luc2VxICAgICkKKyNkZWZpbmUgbWFpbnNlcSAgICAgIChHMS5tYWluc2VxICAgICApCisjZGVmaW5lIGVuZHNlcSAgICAgICAoRzEuZW5kc2VxICAgICAgKQorI2RlZmluZSBzZXEgICAgICAgICAgKEcxLnNlcSAgICAgICAgICkKKyNkZWZpbmUgYnJlYWtfcHRyICAgIChHMS5icmVha19wdHIgICApCisjZGVmaW5lIGNvbnRpbnVlX3B0ciAoRzEuY29udGludWVfcHRyKQorI2RlZmluZSBpRiAgICAgICAgICAgKEcxLmlGICAgICAgICAgICkKKyNkZWZpbmUgdmhhc2ggICAgICAgIChHMS52aGFzaCAgICAgICApCisjZGVmaW5lIGFoYXNoICAgICAgICAoRzEuYWhhc2ggICAgICAgKQorI2RlZmluZSBmZGhhc2ggICAgICAgKEcxLmZkaGFzaCAgICAgICkKKyNkZWZpbmUgZm5oYXNoICAgICAgIChHMS5mbmhhc2ggICAgICApCisjZGVmaW5lIGdfcHJvZ25hbWUgICAoRzEuZ19wcm9nbmFtZSAgKQorI2RlZmluZSBnX2xpbmVubyAgICAgKEcxLmdfbGluZW5vICAgICkKKyNkZWZpbmUgbmZpZWxkcyAgICAgIChHMS5uZmllbGRzICAgICApCisjZGVmaW5lIG1heGZpZWxkcyAgICAoRzEubWF4ZmllbGRzICAgKQorI2RlZmluZSBGaWVsZHMgICAgICAgKEcxLkZpZWxkcyAgICAgICkKKyNkZWZpbmUgZ19jYiAgICAgICAgIChHMS5nX2NiICAgICAgICApCisjZGVmaW5lIGdfcG9zICAgICAgICAoRzEuZ19wb3MgICAgICAgKQorI2RlZmluZSBnX2J1ZiAgICAgICAgKEcxLmdfYnVmICAgICAgICkKKyNkZWZpbmUgaWNhc2UgICAgICAgIChHMS5pY2FzZSAgICAgICApCisjZGVmaW5lIGV4aXRpbmcgICAgICAoRzEuZXhpdGluZyAgICAgKQorI2RlZmluZSBuZXh0cmVjICAgICAgKEcxLm5leHRyZWMgICAgICkKKyNkZWZpbmUgbmV4dGZpbGUgICAgIChHMS5uZXh0ZmlsZSAgICApCisjZGVmaW5lIGlzX2YwX3NwbGl0ICAoRzEuaXNfZjBfc3BsaXQgKQorI2RlZmluZSB0X2luZm8gICAgICAgKEcudF9pbmZvICAgICAgKQorI2RlZmluZSB0X3RjbGFzcyAgICAgKEcudF90Y2xhc3MgICAgKQorI2RlZmluZSB0X3N0cmluZyAgICAgKEcudF9zdHJpbmcgICAgKQorI2RlZmluZSB0X2xpbmVubyAgICAgKEcudF9saW5lbm8gICAgKQorI2RlZmluZSB0X3JvbGxiYWNrICAgKEcudF9yb2xsYmFjayAgKQorI2RlZmluZSBpbnR2YXIgICAgICAgKEcuaW50dmFyICAgICAgKQorI2RlZmluZSBmc3BsaXR0ZXIgICAgKEcuZnNwbGl0dGVyICAgKQorI2RlZmluZSByc3BsaXR0ZXIgICAgKEcucnNwbGl0dGVyICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoKGNoYXIqKXh6YWxsb2Moc2l6ZW9mKEcxKStzaXplb2YoRykpICsgc2l6ZW9mKEcxKSk7IFwKKwlHLm5leHRfdG9rZW5fX2x0Y2xhc3MgPSBUQ19PUFRFUk07IFwKKwlHLmV2YWx1YXRlX19zZWVkID0gMTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBoYW5kbGVfc3BlY2lhbCh2YXIgKik7CitzdGF0aWMgbm9kZSAqcGFyc2VfZXhwcih1aW50MzJfdCk7CitzdGF0aWMgdm9pZCBjaGFpbl9ncm91cCh2b2lkKTsKK3N0YXRpYyB2YXIgKmV2YWx1YXRlKG5vZGUgKiwgdmFyICopOworc3RhdGljIHJzdHJlYW0gKm5leHRfaW5wdXRfZmlsZSh2b2lkKTsKK3N0YXRpYyBpbnQgZm10X251bShjaGFyICosIGludCwgY29uc3QgY2hhciAqLCBkb3VibGUsIGludCk7CitzdGF0aWMgaW50IGF3a19leGl0KGludCkgTk9SRVRVUk47CisKKy8qIC0tLS0gZXJyb3IgaGFuZGxpbmcgLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBFTVNHX0lOVEVSTkFMX0VSUk9SW10gQUxJR04xID0gIkludGVybmFsIGVycm9yIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfVU5FWFBfRU9TW10gQUxJR04xID0gIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZyI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX1VORVhQX1RPS0VOW10gQUxJR04xID0gIlVuZXhwZWN0ZWQgdG9rZW4iOworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19ESVZfQllfWkVST1tdIEFMSUdOMSA9ICJEaXZpc2lvbiBieSB6ZXJvIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfSU5WX0ZNVFtdIEFMSUdOMSA9ICJJbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXIiOworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19UT09fRkVXX0FSR1NbXSBBTElHTjEgPSAiVG9vIGZldyBhcmd1bWVudHMgZm9yIGJ1aWx0aW4iOworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19OT1RfQVJSQVlbXSBBTElHTjEgPSAiTm90IGFuIGFycmF5IjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfUE9TU0lCTEVfRVJST1JbXSBBTElHTjEgPSAiUG9zc2libGUgc3ludGF4IGVycm9yIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfVU5ERUZfRlVOQ1tdIEFMSUdOMSA9ICJDYWxsIHRvIHVuZGVmaW5lZCBmdW5jdGlvbiI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX05PX01BVEhbXSBBTElHTjEgPSAiTWF0aCBzdXBwb3J0IGlzIG5vdCBjb21waWxlZCBpbiI7CisKK3N0YXRpYyB2b2lkIHplcm9fb3V0X3Zhcih2YXIgKnZwKQoreworCW1lbXNldCh2cCwgMCwgc2l6ZW9mKCp2cCkpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6JWk6ICVzIiwgZ19wcm9nbmFtZSwgZ19saW5lbm8sIG1lc3NhZ2UpOworfQorCisvKiAtLS0tIGhhc2ggc3R1ZmYgLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgaGFzaGlkeChjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGlkeCA9IDA7CisKKwl3aGlsZSAoKm5hbWUpCisJCWlkeCA9ICpuYW1lKysgKyAoaWR4IDw8IDYpIC0gaWR4OworCXJldHVybiBpZHg7Cit9CisKKy8qIGNyZWF0ZSBuZXcgaGFzaCAqLworc3RhdGljIHhoYXNoICpoYXNoX2luaXQodm9pZCkKK3sKKwl4aGFzaCAqbmV3aGFzaDsKKworCW5ld2hhc2ggPSB4emFsbG9jKHNpemVvZigqbmV3aGFzaCkpOworCW5ld2hhc2gtPmNzaXplID0gRklSU1RfUFJJTUU7CisJbmV3aGFzaC0+aXRlbXMgPSB4emFsbG9jKEZJUlNUX1BSSU1FICogc2l6ZW9mKG5ld2hhc2gtPml0ZW1zWzBdKSk7CisKKwlyZXR1cm4gbmV3aGFzaDsKK30KKworLyogZmluZCBpdGVtIGluIGhhc2gsIHJldHVybiBwdHIgdG8gZGF0YSwgTlVMTCBpZiBub3QgZm91bmQgKi8KK3N0YXRpYyB2b2lkICpoYXNoX3NlYXJjaCh4aGFzaCAqaGFzaCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwloYXNoX2l0ZW0gKmhpOworCisJaGkgPSBoYXNoLT5pdGVtc1toYXNoaWR4KG5hbWUpICUgaGFzaC0+Y3NpemVdOworCXdoaWxlIChoaSkgeworCQlpZiAoc3RyY21wKGhpLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICZoaS0+ZGF0YTsKKwkJaGkgPSBoaS0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGdyb3cgaGFzaCBpZiBpdCBiZWNvbWVzIHRvbyBiaWcgKi8KK3N0YXRpYyB2b2lkIGhhc2hfcmVidWlsZCh4aGFzaCAqaGFzaCkKK3sKKwl1bnNpZ25lZCBuZXdzaXplLCBpLCBpZHg7CisJaGFzaF9pdGVtICoqbmV3aXRlbXMsICpoaSwgKnRoaTsKKworCWlmIChoYXNoLT5ucHJpbWUgPT0gQVJSQVlfU0laRShQUklNRVMpKQorCQlyZXR1cm47CisKKwluZXdzaXplID0gUFJJTUVTW2hhc2gtPm5wcmltZSsrXTsKKwluZXdpdGVtcyA9IHh6YWxsb2MobmV3c2l6ZSAqIHNpemVvZihuZXdpdGVtc1swXSkpOworCisJZm9yIChpID0gMDsgaSA8IGhhc2gtPmNzaXplOyBpKyspIHsKKwkJaGkgPSBoYXNoLT5pdGVtc1tpXTsKKwkJd2hpbGUgKGhpKSB7CisJCQl0aGkgPSBoaTsKKwkJCWhpID0gdGhpLT5uZXh0OworCQkJaWR4ID0gaGFzaGlkeCh0aGktPm5hbWUpICUgbmV3c2l6ZTsKKwkJCXRoaS0+bmV4dCA9IG5ld2l0ZW1zW2lkeF07CisJCQluZXdpdGVtc1tpZHhdID0gdGhpOworCQl9CisJfQorCisJZnJlZShoYXNoLT5pdGVtcyk7CisJaGFzaC0+Y3NpemUgPSBuZXdzaXplOworCWhhc2gtPml0ZW1zID0gbmV3aXRlbXM7Cit9CisKKy8qIGZpbmQgaXRlbSBpbiBoYXNoLCBhZGQgaXQgaWYgbmVjZXNzYXJ5LiBSZXR1cm4gcHRyIHRvIGRhdGEgKi8KK3N0YXRpYyB2b2lkICpoYXNoX2ZpbmQoeGhhc2ggKmhhc2gsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaGFzaF9pdGVtICpoaTsKKwl1bnNpZ25lZCBpZHg7CisJaW50IGw7CisKKwloaSA9IGhhc2hfc2VhcmNoKGhhc2gsIG5hbWUpOworCWlmICghaGkpIHsKKwkJaWYgKCsraGFzaC0+bmVsIC8gaGFzaC0+Y3NpemUgPiAxMCkKKwkJCWhhc2hfcmVidWlsZChoYXNoKTsKKworCQlsID0gc3RybGVuKG5hbWUpICsgMTsKKwkJaGkgPSB4emFsbG9jKHNpemVvZigqaGkpICsgbCk7CisJCXN0cmNweShoaS0+bmFtZSwgbmFtZSk7CisKKwkJaWR4ID0gaGFzaGlkeChuYW1lKSAlIGhhc2gtPmNzaXplOworCQloaS0+bmV4dCA9IGhhc2gtPml0ZW1zW2lkeF07CisJCWhhc2gtPml0ZW1zW2lkeF0gPSBoaTsKKwkJaGFzaC0+Z2xlbiArPSBsOworCX0KKwlyZXR1cm4gJmhpLT5kYXRhOworfQorCisjZGVmaW5lIGZpbmR2YXIoaGFzaCwgbmFtZSkgKCh2YXIqKSAgICBoYXNoX2ZpbmQoKGhhc2gpLCAobmFtZSkpKQorI2RlZmluZSBuZXd2YXIobmFtZSkgICAgICAgICgodmFyKikgICAgaGFzaF9maW5kKHZoYXNoLCAobmFtZSkpKQorI2RlZmluZSBuZXdmaWxlKG5hbWUpICAgICAgICgocnN0cmVhbSopaGFzaF9maW5kKGZkaGFzaCwgKG5hbWUpKSkKKyNkZWZpbmUgbmV3ZnVuYyhuYW1lKSAgICAgICAoKGZ1bmMqKSAgIGhhc2hfZmluZChmbmhhc2gsIChuYW1lKSkpCisKK3N0YXRpYyB2b2lkIGhhc2hfcmVtb3ZlKHhoYXNoICpoYXNoLCBjb25zdCBjaGFyICpuYW1lKQoreworCWhhc2hfaXRlbSAqaGksICoqcGhpOworCisJcGhpID0gJmhhc2gtPml0ZW1zW2hhc2hpZHgobmFtZSkgJSBoYXNoLT5jc2l6ZV07CisJd2hpbGUgKCpwaGkpIHsKKwkJaGkgPSAqcGhpOworCQlpZiAoc3RyY21wKGhpLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQloYXNoLT5nbGVuIC09IChzdHJsZW4obmFtZSkgKyAxKTsKKwkJCWhhc2gtPm5lbC0tOworCQkJKnBoaSA9IGhpLT5uZXh0OworCQkJZnJlZShoaSk7CisJCQlicmVhazsKKwkJfQorCQlwaGkgPSAmaGktPm5leHQ7CisJfQorfQorCisvKiAtLS0tLS0gc29tZSB1c2VmdWwgZnVuY3Rpb25zIC0tLS0tLSAqLworCitzdGF0aWMgY2hhciAqc2tpcF9zcGFjZXMoY2hhciAqcCkKK3sKKwl3aGlsZSAoMSkgeworCQlpZiAoKnAgPT0gJ1xcJyAmJiBwWzFdID09ICdcbicpIHsKKwkJCXArKzsKKwkJCXRfbGluZW5vKys7CisJCX0gZWxzZSBpZiAoKnAgIT0gJyAnICYmICpwICE9ICdcdCcpIHsKKwkJCWJyZWFrOworCQl9CisJCXArKzsKKwl9CisJcmV0dXJuIHA7Cit9CisKKy8qIHJldHVybnMgb2xkICpzLCBhZHZhbmNlcyAqcyBwYXN0IHdvcmQgYW5kIHRlcm1pbmF0aW5nIE5VTCAqLworc3RhdGljIGNoYXIgKm5leHR3b3JkKGNoYXIgKipzKQoreworCWNoYXIgKnAgPSAqczsKKwl3aGlsZSAoKigqcykrKyAhPSAnXDAnKQorCQljb250aW51ZTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgbmV4dGNoYXIoY2hhciAqKnMpCit7CisJY2hhciBjLCAqcHBzOworCisJYyA9ICooKnMpKys7CisJcHBzID0gKnM7CisJaWYgKGMgPT0gJ1xcJykKKwkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKChjb25zdCBjaGFyKiopcyk7CisJaWYgKGMgPT0gJ1xcJyAmJiAqcyA9PSBwcHMpIHsgLyogdW5yZWNvZ25pemVkIFx6PyAqLworCQljID0gKigqcyk7IC8qIHllcywgZmV0Y2ggeiAqLworCQlpZiAoYykKKwkJCSgqcykrKzsgLyogYWR2YW5jZSB1bmxlc3MgeiA9IE5VTCAqLworCX0KKwlyZXR1cm4gYzsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IGlzYWxudW1fKGludCBjKQoreworCXJldHVybiAoaXNhbG51bShjKSB8fCBjID09ICdfJyk7Cit9CisKK3N0YXRpYyBkb3VibGUgbXlfc3RydG9kKGNoYXIgKipwcCkKK3sKKwljaGFyICpjcCA9ICpwcDsKKwlpZiAoRU5BQkxFX0RFU0tUT1AgJiYgY3BbMF0gPT0gJzAnKSB7CisJCS8qIE1pZ2h0IGJlIGhleCBvciBvY3RhbCBpbnRlZ2VyOiAweDEyM2FiYyBvciAwNzc3NyAqLworCQljaGFyIGMgPSAoY3BbMV0gfCAweDIwKTsKKwkJaWYgKGMgPT0gJ3gnIHx8IGlzZGlnaXQoY3BbMV0pKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgdWxsID0gc3RydG91bGwoY3AsIHBwLCAwKTsKKwkJCWlmIChjID09ICd4JykKKwkJCQlyZXR1cm4gdWxsOworCQkJYyA9ICoqcHA7CisJCQlpZiAoIWlzZGlnaXQoYykgJiYgYyAhPSAnLicpCisJCQkJcmV0dXJuIHVsbDsKKwkJCS8qIGVsc2U6IGl0IG1heSBiZSBhIGZsb2F0aW5nIG51bWJlci4gRXhhbXBsZXM6CisJCQkgKiAwMDkuMTIzICgqcHAgcG9pbnRzIHRvICc5JykKKwkJCSAqIDAwMC4xMjMgKCpwcCBwb2ludHMgdG8gJy4nKQorCQkJICogZmFsbCB0aHJvdWdoIHRvIHN0cnRvZC4KKwkJCSAqLworCQl9CisJfQorCXJldHVybiBzdHJ0b2QoY3AsIHBwKTsKK30KKworLyogLS0tLS0tLS0gd29ya2luZyB3aXRoIHZhcmlhYmxlcyAoc2V0L2dldC9jb3B5L2V0YykgLS0tLS0tLS0gKi8KKworc3RhdGljIHhoYXNoICppYW1hcnJheSh2YXIgKnYpCit7CisJdmFyICphID0gdjsKKworCXdoaWxlIChhLT50eXBlICYgVkZfQ0hJTEQpCisJCWEgPSBhLT54LnBhcmVudDsKKworCWlmICghKGEtPnR5cGUgJiBWRl9BUlJBWSkpIHsKKwkJYS0+dHlwZSB8PSBWRl9BUlJBWTsKKwkJYS0+eC5hcnJheSA9IGhhc2hfaW5pdCgpOworCX0KKwlyZXR1cm4gYS0+eC5hcnJheTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfYXJyYXkoeGhhc2ggKmFycmF5KQoreworCXVuc2lnbmVkIGk7CisJaGFzaF9pdGVtICpoaSwgKnRoaTsKKworCWZvciAoaSA9IDA7IGkgPCBhcnJheS0+Y3NpemU7IGkrKykgeworCQloaSA9IGFycmF5LT5pdGVtc1tpXTsKKwkJd2hpbGUgKGhpKSB7CisJCQl0aGkgPSBoaTsKKwkJCWhpID0gaGktPm5leHQ7CisJCQlmcmVlKHRoaS0+ZGF0YS52LnN0cmluZyk7CisJCQlmcmVlKHRoaSk7CisJCX0KKwkJYXJyYXktPml0ZW1zW2ldID0gTlVMTDsKKwl9CisJYXJyYXktPmdsZW4gPSBhcnJheS0+bmVsID0gMDsKK30KKworLyogY2xlYXIgYSB2YXJpYWJsZSAqLworc3RhdGljIHZhciAqY2xydmFyKHZhciAqdikKK3sKKwlpZiAoISh2LT50eXBlICYgVkZfRlNUUikpCisJCWZyZWUodi0+c3RyaW5nKTsKKworCXYtPnR5cGUgJj0gVkZfRE9OVFRPVUNIOworCXYtPnR5cGUgfD0gVkZfRElSVFk7CisJdi0+c3RyaW5nID0gTlVMTDsKKwlyZXR1cm4gdjsKK30KKworLyogYXNzaWduIHN0cmluZyB2YWx1ZSB0byB2YXJpYWJsZSAqLworc3RhdGljIHZhciAqc2V0dmFyX3AodmFyICp2LCBjaGFyICp2YWx1ZSkKK3sKKwljbHJ2YXIodik7CisJdi0+c3RyaW5nID0gdmFsdWU7CisJaGFuZGxlX3NwZWNpYWwodik7CisJcmV0dXJuIHY7Cit9CisKKy8qIHNhbWUgYXMgc2V0dmFyX3AgYnV0IG1ha2UgYSBjb3B5IG9mIHN0cmluZyAqLworc3RhdGljIHZhciAqc2V0dmFyX3ModmFyICp2LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlyZXR1cm4gc2V0dmFyX3AodiwgKHZhbHVlICYmICp2YWx1ZSkgPyB4c3RyZHVwKHZhbHVlKSA6IE5VTEwpOworfQorCisvKiBzYW1lIGFzIHNldHZhcl9zIGJ1dCBzZXRzIFVTRVIgZmxhZyAqLworc3RhdGljIHZhciAqc2V0dmFyX3UodmFyICp2LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwl2ID0gc2V0dmFyX3ModiwgdmFsdWUpOworCXYtPnR5cGUgfD0gVkZfVVNFUjsKKwlyZXR1cm4gdjsKK30KKworLyogc2V0IGFycmF5IGVsZW1lbnQgdG8gdXNlciBzdHJpbmcgKi8KK3N0YXRpYyB2b2lkIHNldGFyaV91KHZhciAqYSwgaW50IGlkeCwgY29uc3QgY2hhciAqcykKK3sKKwl2YXIgKnY7CisKKwl2ID0gZmluZHZhcihpYW1hcnJheShhKSwgaXRvYShpZHgpKTsKKwlzZXR2YXJfdSh2LCBzKTsKK30KKworLyogYXNzaWduIG51bWVyaWMgdmFsdWUgdG8gdmFyaWFibGUgKi8KK3N0YXRpYyB2YXIgKnNldHZhcl9pKHZhciAqdiwgZG91YmxlIHZhbHVlKQoreworCWNscnZhcih2KTsKKwl2LT50eXBlIHw9IFZGX05VTUJFUjsKKwl2LT5udW1iZXIgPSB2YWx1ZTsKKwloYW5kbGVfc3BlY2lhbCh2KTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldHZhcl9zKHZhciAqdikKK3sKKwkvKiBpZiB2IGlzIG51bWVyaWMgYW5kIGhhcyBubyBjYWNoZWQgc3RyaW5nLCBjb252ZXJ0IGl0IHRvIHN0cmluZyAqLworCWlmICgodi0+dHlwZSAmIChWRl9OVU1CRVIgfCBWRl9DQUNIRUQpKSA9PSBWRl9OVU1CRVIpIHsKKwkJZm10X251bShnX2J1ZiwgTUFYVkFSRk1ULCBnZXR2YXJfcyhpbnR2YXJbQ09OVkZNVF0pLCB2LT5udW1iZXIsIFRSVUUpOworCQl2LT5zdHJpbmcgPSB4c3RyZHVwKGdfYnVmKTsKKwkJdi0+dHlwZSB8PSBWRl9DQUNIRUQ7CisJfQorCXJldHVybiAodi0+c3RyaW5nID09IE5VTEwpID8gIiIgOiB2LT5zdHJpbmc7Cit9CisKK3N0YXRpYyBkb3VibGUgZ2V0dmFyX2kodmFyICp2KQoreworCWNoYXIgKnM7CisKKwlpZiAoKHYtPnR5cGUgJiAoVkZfTlVNQkVSIHwgVkZfQ0FDSEVEKSkgPT0gMCkgeworCQl2LT5udW1iZXIgPSAwOworCQlzID0gdi0+c3RyaW5nOworCQlpZiAocyAmJiAqcykgeworCQkJZGVidWdfcHJpbnRmX2V2YWwoImdldHZhcl9pOiAnJXMnLT4iLCBzKTsKKwkJCXYtPm51bWJlciA9IG15X3N0cnRvZCgmcyk7CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiJWYgKHM6JyVzJylcbiIsIHYtPm51bWJlciwgcyk7CisJCQlpZiAodi0+dHlwZSAmIFZGX1VTRVIpIHsKKwkJCQlzID0gc2tpcF9zcGFjZXMocyk7CisJCQkJaWYgKCpzICE9ICdcMCcpCisJCQkJCXYtPnR5cGUgJj0gflZGX1VTRVI7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiZ2V0dmFyX2k6ICclcyctPnplcm9cbiIsIHMpOworCQkJdi0+dHlwZSAmPSB+VkZfVVNFUjsKKwkJfQorCQl2LT50eXBlIHw9IFZGX0NBQ0hFRDsKKwl9CisJZGVidWdfcHJpbnRmX2V2YWwoImdldHZhcl9pOiAlZlxuIiwgdi0+bnVtYmVyKTsKKwlyZXR1cm4gdi0+bnVtYmVyOworfQorCisvKiBVc2VkIGZvciBvcGVyYW5kcyBvZiBiaXR3aXNlIG9wcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0dmFyX2lfaW50KHZhciAqdikKK3sKKwlkb3VibGUgZCA9IGdldHZhcl9pKHYpOworCisJLyogQ2FzdGluZyBkb3VibGVzIHRvIGxvbmdzIGlzIHVuZGVmaW5lZCBmb3IgdmFsdWVzIG91dHNpZGUKKwkgKiBvZiB0YXJnZXQgdHlwZSByYW5nZS4gVHJ5IHRvIHdpZGVuIGl0IGFzIG11Y2ggYXMgcG9zc2libGUgKi8KKwlpZiAoZCA+PSAwKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZDsKKwkvKiBXaHk/IFRoaW5rIGFib3V0IGQgPT0gLTQyOTQ5NjcyOTUuMCAoYXNzdW1pbmcgMzJiaXQgbG9uZ3MpICovCisJcmV0dXJuIC0gKGxvbmcpICh1bnNpZ25lZCBsb25nKSAoLWQpOworfQorCitzdGF0aWMgdmFyICpjb3B5dmFyKHZhciAqZGVzdCwgY29uc3QgdmFyICpzcmMpCit7CisJaWYgKGRlc3QgIT0gc3JjKSB7CisJCWNscnZhcihkZXN0KTsKKwkJZGVzdC0+dHlwZSB8PSAoc3JjLT50eXBlICYgfihWRl9ET05UVE9VQ0ggfCBWRl9GU1RSKSk7CisJCWRlYnVnX3ByaW50Zl9ldmFsKCJjb3B5dmFyOiBudW1iZXI6JWYgc3RyaW5nOiclcydcbiIsIHNyYy0+bnVtYmVyLCBzcmMtPnN0cmluZyk7CisJCWRlc3QtPm51bWJlciA9IHNyYy0+bnVtYmVyOworCQlpZiAoc3JjLT5zdHJpbmcpCisJCQlkZXN0LT5zdHJpbmcgPSB4c3RyZHVwKHNyYy0+c3RyaW5nKTsKKwl9CisJaGFuZGxlX3NwZWNpYWwoZGVzdCk7CisJcmV0dXJuIGRlc3Q7Cit9CisKK3N0YXRpYyB2YXIgKmluY3Zhcih2YXIgKnYpCit7CisJcmV0dXJuIHNldHZhcl9pKHYsIGdldHZhcl9pKHYpICsgMS4wKTsKK30KKworLyogcmV0dXJuIHRydWUgaWYgdiBpcyBudW1iZXIgb3IgbnVtZXJpYyBzdHJpbmcgKi8KK3N0YXRpYyBpbnQgaXNfbnVtZXJpYyh2YXIgKnYpCit7CisJZ2V0dmFyX2kodik7CisJcmV0dXJuICgodi0+dHlwZSBeIFZGX0RJUlRZKSAmIChWRl9OVU1CRVIgfCBWRl9VU0VSIHwgVkZfRElSVFkpKTsKK30KKworLyogcmV0dXJuIDEgd2hlbiB2YWx1ZSBvZiB2IGNvcnJlc3BvbmRzIHRvIHRydWUsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IGlzdHJ1ZSh2YXIgKnYpCit7CisJaWYgKGlzX251bWVyaWModikpCisJCXJldHVybiAodi0+bnVtYmVyICE9IDApOworCXJldHVybiAodi0+c3RyaW5nICYmIHYtPnN0cmluZ1swXSk7Cit9CisKKy8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgYWxsb2NhdG9yLiBMYXN0IGFsbG9jYXRlZCBzaG91bGQgYmUgZmlyc3QgZnJlZWQgKi8KK3N0YXRpYyB2YXIgKm52YWxsb2MoaW50IG4pCit7CisJbnZibG9jayAqcGIgPSBOVUxMOworCXZhciAqdiwgKnI7CisJaW50IHNpemU7CisKKwl3aGlsZSAoZ19jYikgeworCQlwYiA9IGdfY2I7CisJCWlmICgoZ19jYi0+cG9zIC0gZ19jYi0+bnYpICsgbiA8PSBnX2NiLT5zaXplKQorCQkJYnJlYWs7CisJCWdfY2IgPSBnX2NiLT5uZXh0OworCX0KKworCWlmICghZ19jYikgeworCQlzaXplID0gKG4gPD0gTUlOTlZCTE9DSykgPyBNSU5OVkJMT0NLIDogbjsKKwkJZ19jYiA9IHh6YWxsb2Moc2l6ZW9mKG52YmxvY2spICsgc2l6ZSAqIHNpemVvZih2YXIpKTsKKwkJZ19jYi0+c2l6ZSA9IHNpemU7CisJCWdfY2ItPnBvcyA9IGdfY2ItPm52OworCQlnX2NiLT5wcmV2ID0gcGI7CisJCS8qZ19jYi0+bmV4dCA9IE5VTEw7IC0geHphbGxvYyBkaWQgaXQgKi8KKwkJaWYgKHBiKQorCQkJcGItPm5leHQgPSBnX2NiOworCX0KKworCXYgPSByID0gZ19jYi0+cG9zOworCWdfY2ItPnBvcyArPSBuOworCisJd2hpbGUgKHYgPCBnX2NiLT5wb3MpIHsKKwkJdi0+dHlwZSA9IDA7CisJCXYtPnN0cmluZyA9IE5VTEw7CisJCXYrKzsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgbnZmcmVlKHZhciAqdikKK3sKKwl2YXIgKnA7CisKKwlpZiAodiA8IGdfY2ItPm52IHx8IHYgPj0gZ19jYi0+cG9zKQorCQlzeW50YXhfZXJyb3IoRU1TR19JTlRFUk5BTF9FUlJPUik7CisKKwlmb3IgKHAgPSB2OyBwIDwgZ19jYi0+cG9zOyBwKyspIHsKKwkJaWYgKChwLT50eXBlICYgKFZGX0FSUkFZIHwgVkZfQ0hJTEQpKSA9PSBWRl9BUlJBWSkgeworCQkJY2xlYXJfYXJyYXkoaWFtYXJyYXkocCkpOworCQkJZnJlZShwLT54LmFycmF5LT5pdGVtcyk7CisJCQlmcmVlKHAtPnguYXJyYXkpOworCQl9CisJCWlmIChwLT50eXBlICYgVkZfV0FMSykgeworCQkJd2Fsa2VyX2xpc3QgKm47CisJCQl3YWxrZXJfbGlzdCAqdyA9IHAtPngud2Fsa2VyOworCQkJZGVidWdfcHJpbnRmX3dhbGtlcigibnZmcmVlOiBmcmVlaW5nIHdhbGtlciBAJXBcbiIsICZwLT54LndhbGtlcik7CisJCQlwLT54LndhbGtlciA9IE5VTEw7CisJCQl3aGlsZSAodykgeworCQkJCW4gPSB3LT5wcmV2OworCQkJCWRlYnVnX3ByaW50Zl93YWxrZXIoIiBmcmVlKCVwKVxuIiwgdyk7CisJCQkJZnJlZSh3KTsKKwkJCQl3ID0gbjsKKwkJCX0KKwkJfQorCQljbHJ2YXIocCk7CisJfQorCisJZ19jYi0+cG9zID0gdjsKKwl3aGlsZSAoZ19jYi0+cHJldiAmJiBnX2NiLT5wb3MgPT0gZ19jYi0+bnYpIHsKKwkJZ19jYiA9IGdfY2ItPnByZXY7CisJfQorfQorCisvKiAtLS0tLS0tIGF3ayBwcm9ncmFtIHRleHQgcGFyc2luZyAtLS0tLS0tICovCisKKy8qIFBhcnNlIG5leHQgdG9rZW4gcG9pbnRlZCBieSBnbG9iYWwgcG9zLCBwbGFjZSByZXN1bHRzIGludG8gZ2xvYmFsIHR0dC4KKyAqIElmIHRva2VuIGlzbid0IGV4cGVjdGVkLCBnaXZlIGF3YXkuIFJldHVybiB0b2tlbiBjbGFzcworICovCitzdGF0aWMgdWludDMyX3QgbmV4dF90b2tlbih1aW50MzJfdCBleHBlY3RlZCkKK3sKKyNkZWZpbmUgY29uY2F0X2luc2VydGVkIChHLm5leHRfdG9rZW5fX2NvbmNhdF9pbnNlcnRlZCkKKyNkZWZpbmUgc2F2ZV90Y2xhc3MgICAgIChHLm5leHRfdG9rZW5fX3NhdmVfdGNsYXNzKQorI2RlZmluZSBzYXZlX2luZm8gICAgICAgKEcubmV4dF90b2tlbl9fc2F2ZV9pbmZvKQorLyogSW5pdGlhbGl6ZWQgdG8gVENfT1BURVJNOiAqLworI2RlZmluZSBsdGNsYXNzICAgICAgICAgKEcubmV4dF90b2tlbl9fbHRjbGFzcykKKworCWNoYXIgKnAsICpzOworCWNvbnN0IGNoYXIgKnRsOworCXVpbnQzMl90IHRjOworCWNvbnN0IHVpbnQzMl90ICp0aTsKKworCWlmICh0X3JvbGxiYWNrKSB7CisJCXRfcm9sbGJhY2sgPSBGQUxTRTsKKworCX0gZWxzZSBpZiAoY29uY2F0X2luc2VydGVkKSB7CisJCWNvbmNhdF9pbnNlcnRlZCA9IEZBTFNFOworCQl0X3RjbGFzcyA9IHNhdmVfdGNsYXNzOworCQl0X2luZm8gPSBzYXZlX2luZm87CisKKwl9IGVsc2UgeworCQlwID0gZ19wb3M7CisgcmVhZG5leHQ6CisJCXAgPSBza2lwX3NwYWNlcyhwKTsKKwkJZ19saW5lbm8gPSB0X2xpbmVubzsKKwkJaWYgKCpwID09ICcjJykKKwkJCXdoaWxlICgqcCAhPSAnXG4nICYmICpwICE9ICdcMCcpCisJCQkJcCsrOworCisJCWlmICgqcCA9PSAnXG4nKQorCQkJdF9saW5lbm8rKzsKKworCQlpZiAoKnAgPT0gJ1wwJykgeworCQkJdGMgPSBUQ19FT0Y7CisKKwkJfSBlbHNlIGlmICgqcCA9PSAnXCInKSB7CisJCQkvKiBpdCdzIGEgc3RyaW5nICovCisJCQl0X3N0cmluZyA9IHMgPSArK3A7CisJCQl3aGlsZSAoKnAgIT0gJ1wiJykgeworCQkJCWNoYXIgKnBwOworCQkJCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICdcbicpCisJCQkJCXN5bnRheF9lcnJvcihFTVNHX1VORVhQX0VPUyk7CisJCQkJcHAgPSBwOworCQkJCSpzKysgPSBuZXh0Y2hhcigmcHApOworCQkJCXAgPSBwcDsKKwkJCX0KKwkJCXArKzsKKwkJCSpzID0gJ1wwJzsKKwkJCXRjID0gVENfU1RSSU5HOworCisJCX0gZWxzZSBpZiAoKGV4cGVjdGVkICYgVENfUkVHRVhQKSAmJiAqcCA9PSAnLycpIHsKKwkJCS8qIGl0J3MgcmVnZXhwICovCisJCQl0X3N0cmluZyA9IHMgPSArK3A7CisJCQl3aGlsZSAoKnAgIT0gJy8nKSB7CisJCQkJaWYgKCpwID09ICdcMCcgfHwgKnAgPT0gJ1xuJykKKwkJCQkJc3ludGF4X2Vycm9yKEVNU0dfVU5FWFBfRU9TKTsKKwkJCQkqcyA9ICpwKys7CisJCQkJaWYgKCpzKysgPT0gJ1xcJykgeworCQkJCQljaGFyICpwcCA9IHA7CisJCQkJCXNbLTFdID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoKGNvbnN0IGNoYXIgKiopJnBwKTsKKwkJCQkJaWYgKCpwID09ICdcXCcpCisJCQkJCQkqcysrID0gJ1xcJzsKKwkJCQkJaWYgKHBwID09IHApCisJCQkJCQkqcysrID0gKnArKzsKKwkJCQkJZWxzZQorCQkJCQkJcCA9IHBwOworCQkJCX0KKwkJCX0KKwkJCXArKzsKKwkJCSpzID0gJ1wwJzsKKwkJCXRjID0gVENfUkVHRVhQOworCisJCX0gZWxzZSBpZiAoKnAgPT0gJy4nIHx8IGlzZGlnaXQoKnApKSB7CisJCQkvKiBpdCdzIGEgbnVtYmVyICovCisJCQljaGFyICpwcCA9IHA7CisJCQl0X2RvdWJsZSA9IG15X3N0cnRvZCgmcHApOworCQkJcCA9IHBwOworCQkJaWYgKCpwID09ICcuJykKKwkJCQlzeW50YXhfZXJyb3IoRU1TR19VTkVYUF9UT0tFTik7CisJCQl0YyA9IFRDX05VTUJFUjsKKworCQl9IGVsc2UgeworCQkJLyogc2VhcmNoIGZvciBzb21ldGhpbmcga25vd24gKi8KKwkJCXRsID0gdG9rZW5saXN0OworCQkJdGMgPSAweDAwMDAwMDAxOworCQkJdGkgPSB0b2tlbmluZm87CisJCQl3aGlsZSAoKnRsKSB7CisJCQkJaW50IGwgPSAodW5zaWduZWQgY2hhcikgKnRsKys7CisJCQkJaWYgKGwgPT0gKHVuc2lnbmVkIGNoYXIpIE5UQ0MpIHsKKwkJCQkJdGMgPDw9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBpZiB0b2tlbiBjbGFzcyBpcyBleHBlY3RlZCwKKwkJCQkgKiB0b2tlbiBtYXRjaGVzLAorCQkJCSAqIGFuZCBpdCdzIG5vdCBhIGxvbmdlciB3b3JkLAorCQkJCSAqLworCQkJCWlmICgodGMgJiAoZXhwZWN0ZWQgfCBUQ19XT1JEIHwgVENfTkVXTElORSkpCisJCQkJICYmIHN0cm5jbXAocCwgdGwsIGwpID09IDAKKwkJCQkgJiYgISgodGMgJiBUQ19XT1JEKSAmJiBpc2FsbnVtXyhwW2xdKSkKKwkJCQkpIHsKKwkJCQkJLyogdGhlbiB0aGlzIGlzIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJCQkJCXRfaW5mbyA9ICp0aTsKKwkJCQkJcCArPSBsOworCQkJCQlnb3RvIHRva2VuX2ZvdW5kOworCQkJCX0KKwkJCQl0aSsrOworCQkJCXRsICs9IGw7CisJCQl9CisJCQkvKiBub3QgYSBrbm93biB0b2tlbiAqLworCisJCQkvKiBpcyBpdCBhIG5hbWU/ICh2YXIvYXJyYXkvZnVuY3Rpb24pICovCisJCQlpZiAoIWlzYWxudW1fKCpwKSkKKwkJCQlzeW50YXhfZXJyb3IoRU1TR19VTkVYUF9UT0tFTik7IC8qIG5vICovCisJCQkvKiB5ZXMgKi8KKwkJCXRfc3RyaW5nID0gLS1wOworCQkJd2hpbGUgKGlzYWxudW1fKCorK3ApKSB7CisJCQkJcFstMV0gPSAqcDsKKwkJCX0KKwkJCXBbLTFdID0gJ1wwJzsKKwkJCXRjID0gVENfVkFSSUFCTEU7CisJCQkvKiBhbHNvIGNvbnN1bWUgd2hpdGVzcGFjZSBiZXR3ZWVuIGZ1bmN0aW9ubmFtZSBhbmQgYnJhY2tldCAqLworCQkJaWYgKCEoZXhwZWN0ZWQgJiBUQ19WQVJJQUJMRSkgfHwgKGV4cGVjdGVkICYgVENfQVJSQVkpKQorCQkJCXAgPSBza2lwX3NwYWNlcyhwKTsKKwkJCWlmICgqcCA9PSAnKCcpIHsKKwkJCQl0YyA9IFRDX0ZVTkNUSU9OOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKnAgPT0gJ1snKSB7CisJCQkJCXArKzsKKwkJCQkJdGMgPSBUQ19BUlJBWTsKKwkJCQl9CisJCQl9CisgdG9rZW5fZm91bmQ6IDsKKwkJfQorCQlnX3BvcyA9IHA7CisKKwkJLyogc2tpcHBpbmcgbmV3bGluZXMgaW4gc29tZSBjYXNlcyAqLworCQlpZiAoKGx0Y2xhc3MgJiBUQ19OT1RFUk0pICYmICh0YyAmIFRDX05FV0xJTkUpKQorCQkJZ290byByZWFkbmV4dDsKKworCQkvKiBpbnNlcnQgY29uY2F0ZW5hdGlvbiBvcGVyYXRvciB3aGVuIG5lZWRlZCAqLworCQlpZiAoKGx0Y2xhc3MgJiBUQ19DT05DQVQxKSAmJiAodGMgJiBUQ19DT05DQVQyKSAmJiAoZXhwZWN0ZWQgJiBUQ19CSU5PUCkpIHsKKwkJCWNvbmNhdF9pbnNlcnRlZCA9IFRSVUU7CisJCQlzYXZlX3RjbGFzcyA9IHRjOworCQkJc2F2ZV9pbmZvID0gdF9pbmZvOworCQkJdGMgPSBUQ19CSU5PUDsKKwkJCXRfaW5mbyA9IE9DX0NPTkNBVCB8IFNTIHwgUCgzNSk7CisJCX0KKworCQl0X3RjbGFzcyA9IHRjOworCX0KKwlsdGNsYXNzID0gdF90Y2xhc3M7CisKKwkvKiBBcmUgd2UgcmVhZHkgZm9yIHRoaXM/ICovCisJaWYgKCEobHRjbGFzcyAmIGV4cGVjdGVkKSkKKwkJc3ludGF4X2Vycm9yKChsdGNsYXNzICYgKFRDX05FV0xJTkUgfCBUQ19FT0YpKSA/CisJCQkJRU1TR19VTkVYUF9FT1MgOiBFTVNHX1VORVhQX1RPS0VOKTsKKworCXJldHVybiBsdGNsYXNzOworI3VuZGVmIGNvbmNhdF9pbnNlcnRlZAorI3VuZGVmIHNhdmVfdGNsYXNzCisjdW5kZWYgc2F2ZV9pbmZvCisjdW5kZWYgbHRjbGFzcworfQorCitzdGF0aWMgdm9pZCByb2xsYmFja190b2tlbih2b2lkKQoreworCXRfcm9sbGJhY2sgPSBUUlVFOworfQorCitzdGF0aWMgbm9kZSAqbmV3X25vZGUodWludDMyX3QgaW5mbykKK3sKKwlub2RlICpuOworCisJbiA9IHh6YWxsb2Moc2l6ZW9mKG5vZGUpKTsKKwluLT5pbmZvID0gaW5mbzsKKwluLT5saW5lbm8gPSBnX2xpbmVubzsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgbWtfcmVfbm9kZShjb25zdCBjaGFyICpzLCBub2RlICpuLCByZWdleF90ICpyZSkKK3sKKwluLT5pbmZvID0gT0NfUkVHRVhQOworCW4tPmwucmUgPSByZTsKKwluLT5yLmlyZSA9IHJlICsgMTsKKwl4cmVnY29tcChyZSwgcywgUkVHX0VYVEVOREVEKTsKKwl4cmVnY29tcChyZSArIDEsIHMsIFJFR19FWFRFTkRFRCB8IFJFR19JQ0FTRSk7Cit9CisKK3N0YXRpYyBub2RlICpjb25kaXRpb24odm9pZCkKK3sKKwluZXh0X3Rva2VuKFRDX1NFUVNUQVJUKTsKKwlyZXR1cm4gcGFyc2VfZXhwcihUQ19TRVFURVJNKTsKK30KKworLyogcGFyc2UgZXhwcmVzc2lvbiB0ZXJtaW5hdGVkIGJ5IGdpdmVuIGFyZ3VtZW50LCByZXR1cm4gcHRyCisgKiB0byBidWlsdCBzdWJ0cmVlLiBUZXJtaW5hdG9yIGlzIGVhdGVuIGJ5IHBhcnNlX2V4cHIgKi8KK3N0YXRpYyBub2RlICpwYXJzZV9leHByKHVpbnQzMl90IGlleHApCit7CisJbm9kZSBzbjsKKwlub2RlICpjbiA9ICZzbjsKKwlub2RlICp2biwgKmdscHRyOworCXVpbnQzMl90IHRjLCB4dGM7CisJdmFyICp2OworCisJc24uaW5mbyA9IFBSSU1BU0s7CisJc24uci5uID0gZ2xwdHIgPSBOVUxMOworCXh0YyA9IFRDX09QRVJBTkQgfCBUQ19VT1BQUkUgfCBUQ19SRUdFWFAgfCBpZXhwOworCisJd2hpbGUgKCEoKHRjID0gbmV4dF90b2tlbih4dGMpKSAmIGlleHApKSB7CisKKwkJaWYgKGdscHRyICYmICh0X2luZm8gPT0gKE9DX0NPTVBBUkUgfCBWViB8IFAoMzkpIHwgMikpKSB7CisJCQkvKiBpbnB1dCByZWRpcmVjdGlvbiAoPCkgYXR0YWNoZWQgdG8gZ2xwdHIgbm9kZSAqLworCQkJY24gPSBnbHB0ci0+bC5uID0gbmV3X25vZGUoT0NfQ09OQ0FUIHwgU1MgfCBQKDM3KSk7CisJCQljbi0+YS5uID0gZ2xwdHI7CisJCQl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFOworCQkJZ2xwdHIgPSBOVUxMOworCisJCX0gZWxzZSBpZiAodGMgJiAoVENfQklOT1AgfCBUQ19VT1BQT1NUKSkgeworCQkJLyogZm9yIGJpbmFyeSBhbmQgcG9zdGZpeC11bmFyeSBvcGVyYXRvcnMsIGp1bXAgYmFjayBvdmVyCisJCQkgKiBwcmV2aW91cyBvcGVyYXRvcnMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgKi8KKwkJCXZuID0gY247CisJCQl3aGlsZSAoKCh0X2luZm8gJiBQUklNQVNLKSA+ICh2bi0+YS5uLT5pbmZvICYgUFJJTUFTSzIpKQorCQkJICAgIHx8ICgodF9pbmZvID09IHZuLT5pbmZvKSAmJiAoKHRfaW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfQ09MT04pKQorCQkJKSB7CisJCQkJdm4gPSB2bi0+YS5uOworCQkJfQorCQkJaWYgKCh0X2luZm8gJiBPUENMU01BU0spID09IE9DX1RFUk5BUlkpCisJCQkJdF9pbmZvICs9IFAoNik7CisJCQljbiA9IHZuLT5hLm4tPnIubiA9IG5ld19ub2RlKHRfaW5mbyk7CisJCQljbi0+YS5uID0gdm4tPmEubjsKKwkJCWlmICh0YyAmIFRDX0JJTk9QKSB7CisJCQkJY24tPmwubiA9IHZuOworCQkJCXh0YyA9IFRDX09QRVJBTkQgfCBUQ19VT1BQUkUgfCBUQ19SRUdFWFA7CisJCQkJaWYgKCh0X2luZm8gJiBPUENMU01BU0spID09IE9DX1BHRVRMSU5FKSB7CisJCQkJCS8qIGl0J3MgYSBwaXBlICovCisJCQkJCW5leHRfdG9rZW4oVENfR0VUTElORSk7CisJCQkJCS8qIGdpdmUgbWF4aW11bSBwcmlvcml0eSB0byB0aGlzIHBpcGUgKi8KKwkJCQkJY24tPmluZm8gJj0gflBSSU1BU0s7CisJCQkJCXh0YyA9IFRDX09QRVJBTkQgfCBUQ19VT1BQUkUgfCBUQ19CSU5PUCB8IGlleHA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljbi0+ci5uID0gdm47CisJCQkJeHRjID0gVENfT1BFUkFORCB8IFRDX1VPUFBSRSB8IFRDX0JJTk9QIHwgaWV4cDsKKwkJCX0KKwkJCXZuLT5hLm4gPSBjbjsKKworCQl9IGVsc2UgeworCQkJLyogZm9yIG9wZXJhbmRzIGFuZCBwcmVmaXgtdW5hcnkgb3BlcmF0b3JzLCBhdHRhY2ggdGhlbQorCQkJICogdG8gbGFzdCBub2RlICovCisJCQl2biA9IGNuOworCQkJY24gPSB2bi0+ci5uID0gbmV3X25vZGUodF9pbmZvKTsKKwkJCWNuLT5hLm4gPSB2bjsKKwkJCXh0YyA9IFRDX09QRVJBTkQgfCBUQ19VT1BQUkUgfCBUQ19SRUdFWFA7CisJCQlpZiAodGMgJiAoVENfT1BFUkFORCB8IFRDX1JFR0VYUCkpIHsKKwkJCQl4dGMgPSBUQ19VT1BQUkUgfCBUQ19VT1BQT1NUIHwgVENfQklOT1AgfCBUQ19PUEVSQU5EIHwgaWV4cDsKKwkJCQkvKiBvbmUgc2hvdWxkIGJlIHZlcnkgY2FyZWZ1bCB3aXRoIHN3aXRjaCBvbiB0Y2xhc3MgLQorCQkJCSAqIG9ubHkgc2ltcGxlIHRjbGFzc2VzIHNob3VsZCBiZSB1c2VkISAqLworCQkJCXN3aXRjaCAodGMpIHsKKwkJCQljYXNlIFRDX1ZBUklBQkxFOgorCQkJCWNhc2UgVENfQVJSQVk6CisJCQkJCWNuLT5pbmZvID0gT0NfVkFSOworCQkJCQl2ID0gaGFzaF9zZWFyY2goYWhhc2gsIHRfc3RyaW5nKTsKKwkJCQkJaWYgKHYgIT0gTlVMTCkgeworCQkJCQkJY24tPmluZm8gPSBPQ19GTkFSRzsKKwkJCQkJCWNuLT5sLmFpZHggPSB2LT54LmFpZHg7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljbi0+bC52ID0gbmV3dmFyKHRfc3RyaW5nKTsKKwkJCQkJfQorCQkJCQlpZiAodGMgJiBUQ19BUlJBWSkgeworCQkJCQkJY24tPmluZm8gfD0geFM7CisJCQkJCQljbi0+ci5uID0gcGFyc2VfZXhwcihUQ19BUlJURVJNKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgVENfTlVNQkVSOgorCQkJCWNhc2UgVENfU1RSSU5HOgorCQkJCQljbi0+aW5mbyA9IE9DX1ZBUjsKKwkJCQkJdiA9IGNuLT5sLnYgPSB4emFsbG9jKHNpemVvZih2YXIpKTsKKwkJCQkJaWYgKHRjICYgVENfTlVNQkVSKQorCQkJCQkJc2V0dmFyX2kodiwgdF9kb3VibGUpOworCQkJCQllbHNlCisJCQkJCQlzZXR2YXJfcyh2LCB0X3N0cmluZyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUQ19SRUdFWFA6CisJCQkJCW1rX3JlX25vZGUodF9zdHJpbmcsIGNuLCB4emFsbG9jKHNpemVvZihyZWdleF90KSoyKSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUQ19GVU5DVElPTjoKKwkJCQkJY24tPmluZm8gPSBPQ19GVU5DOworCQkJCQljbi0+ci5mID0gbmV3ZnVuYyh0X3N0cmluZyk7CisJCQkJCWNuLT5sLm4gPSBjb25kaXRpb24oKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFRDX1NFUVNUQVJUOgorCQkJCQljbiA9IHZuLT5yLm4gPSBwYXJzZV9leHByKFRDX1NFUVRFUk0pOworCQkJCQljbi0+YS5uID0gdm47CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUQ19HRVRMSU5FOgorCQkJCQlnbHB0ciA9IGNuOworCQkJCQl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfQklOT1AgfCBpZXhwOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVENfQlVJTFRJTjoKKwkJCQkJY24tPmwubiA9IGNvbmRpdGlvbigpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHNuLnIubjsKK30KKworLyogYWRkIG5vZGUgdG8gY2hhaW4uIFJldHVybiBwdHIgdG8gYWxsb2MnZCBub2RlICovCitzdGF0aWMgbm9kZSAqY2hhaW5fbm9kZSh1aW50MzJfdCBpbmZvKQoreworCW5vZGUgKm47CisKKwlpZiAoIXNlcS0+Zmlyc3QpCisJCXNlcS0+Zmlyc3QgPSBzZXEtPmxhc3QgPSBuZXdfbm9kZSgwKTsKKworCWlmIChzZXEtPnByb2dyYW1uYW1lICE9IGdfcHJvZ25hbWUpIHsKKwkJc2VxLT5wcm9ncmFtbmFtZSA9IGdfcHJvZ25hbWU7CisJCW4gPSBjaGFpbl9ub2RlKE9DX05FV1NPVVJDRSk7CisJCW4tPmwubmV3X3Byb2duYW1lID0geHN0cmR1cChnX3Byb2duYW1lKTsKKwl9CisKKwluID0gc2VxLT5sYXN0OworCW4tPmluZm8gPSBpbmZvOworCXNlcS0+bGFzdCA9IG4tPmEubiA9IG5ld19ub2RlKE9DX0RPTkUpOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIGNoYWluX2V4cHIodWludDMyX3QgaW5mbykKK3sKKwlub2RlICpuOworCisJbiA9IGNoYWluX25vZGUoaW5mbyk7CisJbi0+bC5uID0gcGFyc2VfZXhwcihUQ19PUFRFUk0gfCBUQ19HUlBURVJNKTsKKwlpZiAodF90Y2xhc3MgJiBUQ19HUlBURVJNKQorCQlyb2xsYmFja190b2tlbigpOworfQorCitzdGF0aWMgbm9kZSAqY2hhaW5fbG9vcChub2RlICpubikKK3sKKwlub2RlICpuLCAqbjIsICpzYXZlX2JyaywgKnNhdmVfY29udDsKKworCXNhdmVfYnJrID0gYnJlYWtfcHRyOworCXNhdmVfY29udCA9IGNvbnRpbnVlX3B0cjsKKworCW4gPSBjaGFpbl9ub2RlKE9DX0JSIHwgVngpOworCWNvbnRpbnVlX3B0ciA9IG5ld19ub2RlKE9DX0VYRUMpOworCWJyZWFrX3B0ciA9IG5ld19ub2RlKE9DX0VYRUMpOworCWNoYWluX2dyb3VwKCk7CisJbjIgPSBjaGFpbl9ub2RlKE9DX0VYRUMgfCBWeCk7CisJbjItPmwubiA9IG5uOworCW4yLT5hLm4gPSBuOworCWNvbnRpbnVlX3B0ci0+YS5uID0gbjI7CisJYnJlYWtfcHRyLT5hLm4gPSBuLT5yLm4gPSBzZXEtPmxhc3Q7CisKKwljb250aW51ZV9wdHIgPSBzYXZlX2NvbnQ7CisJYnJlYWtfcHRyID0gc2F2ZV9icms7CisKKwlyZXR1cm4gbjsKK30KKworLyogcGFyc2UgZ3JvdXAgYW5kIGF0dGFjaCBpdCB0byBjaGFpbiAqLworc3RhdGljIHZvaWQgY2hhaW5fZ3JvdXAodm9pZCkKK3sKKwl1aW50MzJfdCBjOworCW5vZGUgKm4sICpuMiwgKm4zOworCisJZG8geworCQljID0gbmV4dF90b2tlbihUQ19HUlBTRVEpOworCX0gd2hpbGUgKGMgJiBUQ19ORVdMSU5FKTsKKworCWlmIChjICYgVENfR1JQU1RBUlQpIHsKKwkJd2hpbGUgKG5leHRfdG9rZW4oVENfR1JQU0VRIHwgVENfR1JQVEVSTSkgIT0gVENfR1JQVEVSTSkgeworCQkJaWYgKHRfdGNsYXNzICYgVENfTkVXTElORSkKKwkJCQljb250aW51ZTsKKwkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQljaGFpbl9ncm91cCgpOworCQl9CisJfSBlbHNlIGlmIChjICYgKFRDX09QU0VRIHwgVENfT1BURVJNKSkgeworCQlyb2xsYmFja190b2tlbigpOworCQljaGFpbl9leHByKE9DX0VYRUMgfCBWeCk7CisJfSBlbHNlIHsJCQkJCQkvKiBUQ19TVEFURU1OVCAqLworCQlzd2l0Y2ggKHRfaW5mbyAmIE9QQ0xTTUFTSykgeworCQljYXNlIFNUX0lGOgorCQkJbiA9IGNoYWluX25vZGUoT0NfQlIgfCBWeCk7CisJCQluLT5sLm4gPSBjb25kaXRpb24oKTsKKwkJCWNoYWluX2dyb3VwKCk7CisJCQluMiA9IGNoYWluX25vZGUoT0NfRVhFQyk7CisJCQluLT5yLm4gPSBzZXEtPmxhc3Q7CisJCQlpZiAobmV4dF90b2tlbihUQ19HUlBTRVEgfCBUQ19HUlBURVJNIHwgVENfRUxTRSkgPT0gVENfRUxTRSkgeworCQkJCWNoYWluX2dyb3VwKCk7CisJCQkJbjItPmEubiA9IHNlcS0+bGFzdDsKKwkJCX0gZWxzZSB7CisJCQkJcm9sbGJhY2tfdG9rZW4oKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1RfV0hJTEU6CisJCQluMiA9IGNvbmRpdGlvbigpOworCQkJbiA9IGNoYWluX2xvb3AoTlVMTCk7CisJCQluLT5sLm4gPSBuMjsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RfRE86CisJCQluMiA9IGNoYWluX25vZGUoT0NfRVhFQyk7CisJCQluID0gY2hhaW5fbG9vcChOVUxMKTsKKwkJCW4yLT5hLm4gPSBuLT5hLm47CisJCQluZXh0X3Rva2VuKFRDX1dISUxFKTsKKwkJCW4tPmwubiA9IGNvbmRpdGlvbigpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVF9GT1I6CisJCQluZXh0X3Rva2VuKFRDX1NFUVNUQVJUKTsKKwkJCW4yID0gcGFyc2VfZXhwcihUQ19TRU1JQ09MIHwgVENfU0VRVEVSTSk7CisJCQlpZiAodF90Y2xhc3MgJiBUQ19TRVFURVJNKSB7CS8qIGZvci1pbiAqLworCQkJCWlmICgobjItPmluZm8gJiBPUENMU01BU0spICE9IE9DX0lOKQorCQkJCQlzeW50YXhfZXJyb3IoRU1TR19VTkVYUF9UT0tFTik7CisJCQkJbiA9IGNoYWluX25vZGUoT0NfV0FMS0lOSVQgfCBWVik7CisJCQkJbi0+bC5uID0gbjItPmwubjsKKwkJCQluLT5yLm4gPSBuMi0+ci5uOworCQkJCW4gPSBjaGFpbl9sb29wKE5VTEwpOworCQkJCW4tPmluZm8gPSBPQ19XQUxLTkVYVCB8IFZ4OworCQkJCW4tPmwubiA9IG4yLT5sLm47CisJCQl9IGVsc2UgewkJCS8qIGZvciAoOzspICovCisJCQkJbiA9IGNoYWluX25vZGUoT0NfRVhFQyB8IFZ4KTsKKwkJCQluLT5sLm4gPSBuMjsKKwkJCQluMiA9IHBhcnNlX2V4cHIoVENfU0VNSUNPTCk7CisJCQkJbjMgPSBwYXJzZV9leHByKFRDX1NFUVRFUk0pOworCQkJCW4gPSBjaGFpbl9sb29wKG4zKTsKKwkJCQluLT5sLm4gPSBuMjsKKwkJCQlpZiAoIW4yKQorCQkJCQluLT5pbmZvID0gT0NfRVhFQzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0NfUFJJTlQ6CisJCWNhc2UgT0NfUFJJTlRGOgorCQkJbiA9IGNoYWluX25vZGUodF9pbmZvKTsKKwkJCW4tPmwubiA9IHBhcnNlX2V4cHIoVENfT1BURVJNIHwgVENfT1VUUkRSIHwgVENfR1JQVEVSTSk7CisJCQlpZiAodF90Y2xhc3MgJiBUQ19PVVRSRFIpIHsKKwkJCQluLT5pbmZvIHw9IHRfaW5mbzsKKwkJCQluLT5yLm4gPSBwYXJzZV9leHByKFRDX09QVEVSTSB8IFRDX0dSUFRFUk0pOworCQkJfQorCQkJaWYgKHRfdGNsYXNzICYgVENfR1JQVEVSTSkKKwkJCQlyb2xsYmFja190b2tlbigpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPQ19CUkVBSzoKKwkJCW4gPSBjaGFpbl9ub2RlKE9DX0VYRUMpOworCQkJbi0+YS5uID0gYnJlYWtfcHRyOworCQkJYnJlYWs7CisKKwkJY2FzZSBPQ19DT05USU5VRToKKwkJCW4gPSBjaGFpbl9ub2RlKE9DX0VYRUMpOworCQkJbi0+YS5uID0gY29udGludWVfcHRyOworCQkJYnJlYWs7CisKKwkJLyogZGVsZXRlLCBuZXh0LCBuZXh0ZmlsZSwgcmV0dXJuLCBleGl0ICovCisJCWRlZmF1bHQ6CisJCQljaGFpbl9leHByKHRfaW5mbyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3Byb2dyYW0oY2hhciAqcCkKK3sKKwl1aW50MzJfdCB0Y2xhc3M7CisJbm9kZSAqY247CisJZnVuYyAqZjsKKwl2YXIgKnY7CisKKwlnX3BvcyA9IHA7CisJdF9saW5lbm8gPSAxOworCXdoaWxlICgodGNsYXNzID0gbmV4dF90b2tlbihUQ19FT0YgfCBUQ19PUFNFUSB8IFRDX0dSUFNUQVJUIHwKKwkJCVRDX09QVEVSTSB8IFRDX0JFR0lOIHwgVENfRU5EIHwgVENfRlVOQ0RFQ0wpKSAhPSBUQ19FT0YpIHsKKworCQlpZiAodGNsYXNzICYgVENfT1BURVJNKQorCQkJY29udGludWU7CisKKwkJc2VxID0gJm1haW5zZXE7CisJCWlmICh0Y2xhc3MgJiBUQ19CRUdJTikgeworCQkJc2VxID0gJmJlZ2luc2VxOworCQkJY2hhaW5fZ3JvdXAoKTsKKworCQl9IGVsc2UgaWYgKHRjbGFzcyAmIFRDX0VORCkgeworCQkJc2VxID0gJmVuZHNlcTsKKwkJCWNoYWluX2dyb3VwKCk7CisKKwkJfSBlbHNlIGlmICh0Y2xhc3MgJiBUQ19GVU5DREVDTCkgeworCQkJbmV4dF90b2tlbihUQ19GVU5DVElPTik7CisJCQlnX3BvcysrOworCQkJZiA9IG5ld2Z1bmModF9zdHJpbmcpOworCQkJZi0+Ym9keS5maXJzdCA9IE5VTEw7CisJCQlmLT5uYXJncyA9IDA7CisJCQl3aGlsZSAobmV4dF90b2tlbihUQ19WQVJJQUJMRSB8IFRDX1NFUVRFUk0pICYgVENfVkFSSUFCTEUpIHsKKwkJCQl2ID0gZmluZHZhcihhaGFzaCwgdF9zdHJpbmcpOworCQkJCXYtPnguYWlkeCA9IGYtPm5hcmdzKys7CisKKwkJCQlpZiAobmV4dF90b2tlbihUQ19DT01NQSB8IFRDX1NFUVRFUk0pICYgVENfU0VRVEVSTSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzZXEgPSAmZi0+Ym9keTsKKwkJCWNoYWluX2dyb3VwKCk7CisJCQljbGVhcl9hcnJheShhaGFzaCk7CisKKwkJfSBlbHNlIGlmICh0Y2xhc3MgJiBUQ19PUFNFUSkgeworCQkJcm9sbGJhY2tfdG9rZW4oKTsKKwkJCWNuID0gY2hhaW5fbm9kZShPQ19URVNUKTsKKwkJCWNuLT5sLm4gPSBwYXJzZV9leHByKFRDX09QVEVSTSB8IFRDX0VPRiB8IFRDX0dSUFNUQVJUKTsKKwkJCWlmICh0X3RjbGFzcyAmIFRDX0dSUFNUQVJUKSB7CisJCQkJcm9sbGJhY2tfdG9rZW4oKTsKKwkJCQljaGFpbl9ncm91cCgpOworCQkJfSBlbHNlIHsKKwkJCQljaGFpbl9ub2RlKE9DX1BSSU5UKTsKKwkJCX0KKwkJCWNuLT5yLm4gPSBtYWluc2VxLmxhc3Q7CisKKwkJfSBlbHNlIC8qIGlmICh0Y2xhc3MgJiBUQ19HUlBTVEFSVCkgKi8geworCQkJcm9sbGJhY2tfdG9rZW4oKTsKKwkJCWNoYWluX2dyb3VwKCk7CisJCX0KKwl9Cit9CisKKworLyogLS0tLS0tLS0gcHJvZ3JhbSBleGVjdXRpb24gcGFydCAtLS0tLS0tLSAqLworCitzdGF0aWMgbm9kZSAqbWtfc3BsaXR0ZXIoY29uc3QgY2hhciAqcywgdHNwbGl0dGVyICpzcGwpCit7CisJcmVnZXhfdCAqcmUsICppcmU7CisJbm9kZSAqbjsKKworCXJlID0gJnNwbC0+cmVbMF07CisJaXJlID0gJnNwbC0+cmVbMV07CisJbiA9ICZzcGwtPm47CisJaWYgKChuLT5pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19SRUdFWFApIHsKKwkJcmVnZnJlZShyZSk7CisJCXJlZ2ZyZWUoaXJlKTsgLy8gVE9ETzogbnVrZSBpcmUsIHVzZSByZSsxPworCX0KKwlpZiAoc1swXSAmJiBzWzFdKSB7IC8qIHN0cmxlbihzKSA+IDEgKi8KKwkJbWtfcmVfbm9kZShzLCBuLCByZSk7CisJfSBlbHNlIHsKKwkJbi0+aW5mbyA9ICh1aW50MzJfdCkgc1swXTsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworLyogdXNlIG5vZGUgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24uIFN1cHBsaWVkIHdpdGggbm9kZSBwdHIgYW5kIHJlZ2V4X3QKKyAqIHN0b3JhZ2Ugc3BhY2UuIFJldHVybiBwdHIgdG8gcmVnZXggKGlmIHJlc3VsdCBwb2ludHMgdG8gcHJlZywgaXQgc2hvdWxkCisgKiBiZSBsYXRlciByZWdmcmVlJ2QgbWFudWFsbHkKKyAqLworc3RhdGljIHJlZ2V4X3QgKmFzX3JlZ2V4KG5vZGUgKm9wLCByZWdleF90ICpwcmVnKQoreworCWludCBjZmxhZ3M7CisJdmFyICp2OworCWNvbnN0IGNoYXIgKnM7CisKKwlpZiAoKG9wLT5pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19SRUdFWFApIHsKKwkJcmV0dXJuIGljYXNlID8gb3AtPnIuaXJlIDogb3AtPmwucmU7CisJfQorCXYgPSBudmFsbG9jKDEpOworCXMgPSBnZXR2YXJfcyhldmFsdWF0ZShvcCwgdikpOworCisJY2ZsYWdzID0gaWNhc2UgPyBSRUdfRVhURU5ERUQgfCBSRUdfSUNBU0UgOiBSRUdfRVhURU5ERUQ7CisJLyogVGVzdGNhc2Ugd2hlcmUgUkVHX0VYVEVOREVEIGZhaWxzICh1bnBhaXJlZCAneycpOgorCSAqIGVjaG8gSGkgfCBhd2sgJ2dzdWIoIkAoc2FtcHxjb2RlfGZpbGUpXHsiLCIiKTsnCisJICogZ2F3ayAzLjEuNSBlYXRzIHRoaXMuIFdlIHJldmVydCB0byB+UkVHX0VYVEVOREVECisJICogKG1heWJlIGdzdWIgaXMgbm90IHN1cHBvc2VkIHRvIHVzZSBSRUdfRVhURU5ERUQ/KS4KKwkgKi8KKwlpZiAocmVnY29tcChwcmVnLCBzLCBjZmxhZ3MpKSB7CisJCWNmbGFncyAmPSB+UkVHX0VYVEVOREVEOworCQl4cmVnY29tcChwcmVnLCBzLCBjZmxhZ3MpOworCX0KKwludmZyZWUodik7CisJcmV0dXJuIHByZWc7Cit9CisKKy8qIGdyYWR1YWxseSBpbmNyZWFzaW5nIGJ1ZmZlci4KKyAqIG5vdGUgdGhhdCB3ZSByZWFsbG9jYXRlIGV2ZW4gaWYgbiA9PSBvbGRfc2l6ZSwKKyAqIGFuZCB0aHVzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBleHRyYSBhbGxvY2F0ZWQgYnl0ZS4KKyAqLworc3RhdGljIGNoYXIqIHFyZWFsbG9jKGNoYXIgKmIsIGludCBuLCBpbnQgKnNpemUpCit7CisJaWYgKCFiIHx8IG4gPj0gKnNpemUpIHsKKwkJKnNpemUgPSBuICsgKG4+PjEpICsgODA7CisJCWIgPSB4cmVhbGxvYyhiLCAqc2l6ZSk7CisJfQorCXJldHVybiBiOworfQorCisvKiByZXNpemUgZmllbGQgc3RvcmFnZSBzcGFjZSAqLworc3RhdGljIHZvaWQgZnNyZWFsbG9jKGludCBzaXplKQoreworCWludCBpOworCisJaWYgKHNpemUgPj0gbWF4ZmllbGRzKSB7CisJCWkgPSBtYXhmaWVsZHM7CisJCW1heGZpZWxkcyA9IHNpemUgKyAxNjsKKwkJRmllbGRzID0geHJlYWxsb2MoRmllbGRzLCBtYXhmaWVsZHMgKiBzaXplb2YoRmllbGRzWzBdKSk7CisJCWZvciAoOyBpIDwgbWF4ZmllbGRzOyBpKyspIHsKKwkJCUZpZWxkc1tpXS50eXBlID0gVkZfU1BFQ0lBTDsKKwkJCUZpZWxkc1tpXS5zdHJpbmcgPSBOVUxMOworCQl9CisJfQorCS8qIGlmIHNpemUgPCBuZmllbGRzLCBjbGVhciBleHRyYSBmaWVsZCB2YXJpYWJsZXMgKi8KKwlmb3IgKGkgPSBzaXplOyBpIDwgbmZpZWxkczsgaSsrKSB7CisJCWNscnZhcihGaWVsZHMgKyBpKTsKKwl9CisJbmZpZWxkcyA9IHNpemU7Cit9CisKK3N0YXRpYyBpbnQgYXdrX3NwbGl0KGNvbnN0IGNoYXIgKnMsIG5vZGUgKnNwbCwgY2hhciAqKnNsaXN0KQoreworCWludCBsLCBuOworCWNoYXIgY1s0XTsKKwljaGFyICpzMTsKKwlyZWdtYXRjaF90IHBtYXRjaFsyXTsgLy8gVE9ETzogd2h5IFsyXT8gWzFdIGlzIGVub3VnaC4uLgorCisJLyogaW4gd29yc3QgY2FzZSwgZWFjaCBjaGFyIHdvdWxkIGJlIGEgc2VwYXJhdGUgZmllbGQgKi8KKwkqc2xpc3QgPSBzMSA9IHh6YWxsb2Moc3RybGVuKHMpICogMiArIDMpOworCXN0cmNweShzMSwgcyk7CisKKwljWzBdID0gY1sxXSA9IChjaGFyKXNwbC0+aW5mbzsKKwljWzJdID0gY1szXSA9ICdcMCc7CisJaWYgKCpnZXR2YXJfcyhpbnR2YXJbUlNdKSA9PSAnXDAnKQorCQljWzJdID0gJ1xuJzsKKworCW4gPSAwOworCWlmICgoc3BsLT5pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19SRUdFWFApIHsgIC8qIHJlZ2V4IHNwbGl0ICovCisJCWlmICghKnMpCisJCQlyZXR1cm4gbjsgLyogIiI6IHplcm8gZmllbGRzICovCisJCW4rKzsgLyogYXQgbGVhc3Qgb25lIGZpZWxkIHdpbGwgYmUgdGhlcmUgKi8KKwkJZG8geworCQkJbCA9IHN0cmNzcG4ocywgYysyKTsgLyogbGVuIHRpbGwgbmV4dCBOVUwgb3IgXG4gKi8KKwkJCWlmIChyZWdleGVjKGljYXNlID8gc3BsLT5yLmlyZSA6IHNwbC0+bC5yZSwgcywgMSwgcG1hdGNoLCAwKSA9PSAwCisJCQkgJiYgcG1hdGNoWzBdLnJtX3NvIDw9IGwKKwkJCSkgeworCQkJCWwgPSBwbWF0Y2hbMF0ucm1fc287CisJCQkJaWYgKHBtYXRjaFswXS5ybV9lbyA9PSAwKSB7CisJCQkJCWwrKzsKKwkJCQkJcG1hdGNoWzBdLnJtX2VvKys7CisJCQkJfQorCQkJCW4rKzsgLyogd2Ugc2F3IHlldCBhbm90aGVyIGRlbGltaXRlciAqLworCQkJfSBlbHNlIHsKKwkJCQlwbWF0Y2hbMF0ucm1fZW8gPSBsOworCQkJCWlmIChzW2xdKQorCQkJCQlwbWF0Y2hbMF0ucm1fZW8rKzsKKwkJCX0KKwkJCW1lbWNweShzMSwgcywgbCk7CisJCQkvKiBtYWtlIHN1cmUgd2UgcmVtb3ZlICphbGwqIG9mIHRoZSBzZXBhcmF0b3IgY2hhcnMgKi8KKwkJCWRvIHsKKwkJCQlzMVtsXSA9ICdcMCc7CisJCQl9IHdoaWxlICgrK2wgPCBwbWF0Y2hbMF0ucm1fZW8pOworCQkJbmV4dHdvcmQoJnMxKTsKKwkJCXMgKz0gcG1hdGNoWzBdLnJtX2VvOworCQl9IHdoaWxlICgqcyk7CisJCXJldHVybiBuOworCX0KKwlpZiAoY1swXSA9PSAnXDAnKSB7ICAvKiBudWxsIHNwbGl0ICovCisJCXdoaWxlICgqcykgeworCQkJKnMxKysgPSAqcysrOworCQkJKnMxKysgPSAnXDAnOworCQkJbisrOworCQl9CisJCXJldHVybiBuOworCX0KKwlpZiAoY1swXSAhPSAnICcpIHsgIC8qIHNpbmdsZS1jaGFyYWN0ZXIgc3BsaXQgKi8KKwkJaWYgKGljYXNlKSB7CisJCQljWzBdID0gdG91cHBlcihjWzBdKTsKKwkJCWNbMV0gPSB0b2xvd2VyKGNbMV0pOworCQl9CisJCWlmICgqczEpCisJCQluKys7CisJCXdoaWxlICgoczEgPSBzdHJwYnJrKHMxLCBjKSkgIT0gTlVMTCkgeworCQkJKnMxKysgPSAnXDAnOworCQkJbisrOworCQl9CisJCXJldHVybiBuOworCX0KKwkvKiBzcGFjZSBzcGxpdCAqLworCXdoaWxlICgqcykgeworCQlzID0gc2tpcF93aGl0ZXNwYWNlKHMpOworCQlpZiAoISpzKQorCQkJYnJlYWs7CisJCW4rKzsKKwkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkKKwkJCSpzMSsrID0gKnMrKzsKKwkJKnMxKysgPSAnXDAnOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgc3BsaXRfZjAodm9pZCkKK3sKKy8qIHN0YXRpYyBjaGFyICpmc3RyaW5nczsgKi8KKyNkZWZpbmUgZnN0cmluZ3MgKEcuc3BsaXRfZjBfX2ZzdHJpbmdzKQorCisJaW50IGksIG47CisJY2hhciAqczsKKworCWlmIChpc19mMF9zcGxpdCkKKwkJcmV0dXJuOworCisJaXNfZjBfc3BsaXQgPSBUUlVFOworCWZyZWUoZnN0cmluZ3MpOworCWZzcmVhbGxvYygwKTsKKwluID0gYXdrX3NwbGl0KGdldHZhcl9zKGludHZhcltGMF0pLCAmZnNwbGl0dGVyLm4sICZmc3RyaW5ncyk7CisJZnNyZWFsbG9jKG4pOworCXMgPSBmc3RyaW5nczsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCUZpZWxkc1tpXS5zdHJpbmcgPSBuZXh0d29yZCgmcyk7CisJCUZpZWxkc1tpXS50eXBlIHw9IChWRl9GU1RSIHwgVkZfVVNFUiB8IFZGX0RJUlRZKTsKKwl9CisKKwkvKiBzZXQgTkYgbWFudWFsbHkgdG8gYXZvaWQgc2lkZSBlZmZlY3RzICovCisJY2xydmFyKGludHZhcltORl0pOworCWludHZhcltORl0tPnR5cGUgPSBWRl9OVU1CRVIgfCBWRl9TUEVDSUFMOworCWludHZhcltORl0tPm51bWJlciA9IG5maWVsZHM7CisjdW5kZWYgZnN0cmluZ3MKK30KKworLyogcGVyZm9ybSBhZGRpdGlvbmFsIGFjdGlvbnMgd2hlbiBzb21lIGludGVybmFsIHZhcmlhYmxlcyBjaGFuZ2VkICovCitzdGF0aWMgdm9pZCBoYW5kbGVfc3BlY2lhbCh2YXIgKnYpCit7CisJaW50IG47CisJY2hhciAqYjsKKwljb25zdCBjaGFyICpzZXAsICpzOworCWludCBzbCwgbCwgbGVuLCBpLCBic2l6ZTsKKworCWlmICghKHYtPnR5cGUgJiBWRl9TUEVDSUFMKSkKKwkJcmV0dXJuOworCisJaWYgKHYgPT0gaW50dmFyW05GXSkgeworCQluID0gKGludClnZXR2YXJfaSh2KTsKKwkJZnNyZWFsbG9jKG4pOworCisJCS8qIHJlY2FsY3VsYXRlICQwICovCisJCXNlcCA9IGdldHZhcl9zKGludHZhcltPRlNdKTsKKwkJc2wgPSBzdHJsZW4oc2VwKTsKKwkJYiA9IE5VTEw7CisJCWxlbiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCXMgPSBnZXR2YXJfcygmRmllbGRzW2ldKTsKKwkJCWwgPSBzdHJsZW4ocyk7CisJCQlpZiAoYikgeworCQkJCW1lbWNweShiK2xlbiwgc2VwLCBzbCk7CisJCQkJbGVuICs9IHNsOworCQkJfQorCQkJYiA9IHFyZWFsbG9jKGIsIGxlbitsK3NsLCAmYnNpemUpOworCQkJbWVtY3B5KGIrbGVuLCBzLCBsKTsKKwkJCWxlbiArPSBsOworCQl9CisJCWlmIChiKQorCQkJYltsZW5dID0gJ1wwJzsKKwkJc2V0dmFyX3AoaW50dmFyW0YwXSwgYik7CisJCWlzX2YwX3NwbGl0ID0gVFJVRTsKKworCX0gZWxzZSBpZiAodiA9PSBpbnR2YXJbRjBdKSB7CisJCWlzX2YwX3NwbGl0ID0gRkFMU0U7CisKKwl9IGVsc2UgaWYgKHYgPT0gaW50dmFyW0ZTXSkgeworCQlta19zcGxpdHRlcihnZXR2YXJfcyh2KSwgJmZzcGxpdHRlcik7CisKKwl9IGVsc2UgaWYgKHYgPT0gaW50dmFyW1JTXSkgeworCQlta19zcGxpdHRlcihnZXR2YXJfcyh2KSwgJnJzcGxpdHRlcik7CisKKwl9IGVsc2UgaWYgKHYgPT0gaW50dmFyW0lHTk9SRUNBU0VdKSB7CisJCWljYXNlID0gaXN0cnVlKHYpOworCisJfSBlbHNlIHsJCQkJLyogJG4gKi8KKwkJbiA9IGdldHZhcl9pKGludHZhcltORl0pOworCQlzZXR2YXJfaShpbnR2YXJbTkZdLCBuID4gdi1GaWVsZHMgPyBuIDogdi1GaWVsZHMrMSk7CisJCS8qIHJpZ2h0IGhlcmUgdiBpcyBpbnZhbGlkLiBKdXN0IHRvIG5vdGUuLi4gKi8KKwl9Cit9CisKKy8qIHN0ZXAgdGhyb3VnaCBmdW5jL2J1aWx0aW4vZXRjIGFyZ3VtZW50cyAqLworc3RhdGljIG5vZGUgKm5leHRhcmcobm9kZSAqKnBuKQoreworCW5vZGUgKm47CisKKwluID0gKnBuOworCWlmIChuICYmIChuLT5pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19DT01NQSkgeworCQkqcG4gPSBuLT5yLm47CisJCW4gPSBuLT5sLm47CisJfSBlbHNlIHsKKwkJKnBuID0gTlVMTDsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIGhhc2h3YWxrX2luaXQodmFyICp2LCB4aGFzaCAqYXJyYXkpCit7CisJaGFzaF9pdGVtICpoaTsKKwl1bnNpZ25lZCBpOworCXdhbGtlcl9saXN0ICp3OworCXdhbGtlcl9saXN0ICpwcmV2X3dhbGtlcjsKKworCWlmICh2LT50eXBlICYgVkZfV0FMSykgeworCQlwcmV2X3dhbGtlciA9IHYtPngud2Fsa2VyOworCX0gZWxzZSB7CisJCXYtPnR5cGUgfD0gVkZfV0FMSzsKKwkJcHJldl93YWxrZXIgPSBOVUxMOworCX0KKwlkZWJ1Z19wcmludGZfd2Fsa2VyKCJoYXNod2Fsa19pbml0OiBwcmV2X3dhbGtlcjolcFxuIiwgcHJldl93YWxrZXIpOworCisJdyA9IHYtPngud2Fsa2VyID0geHphbGxvYyhzaXplb2YoKncpICsgYXJyYXktPmdsZW4gKyAxKTsgLyogd2h5ICsgMT8gKi8KKwlkZWJ1Z19wcmludGZfd2Fsa2VyKCIgd2Fsa2VyQCVwPSVwXG4iLCAmdi0+eC53YWxrZXIsIHcpOworCXctPmN1ciA9IHctPmVuZCA9IHctPndidWY7CisJdy0+cHJldiA9IHByZXZfd2Fsa2VyOworCWZvciAoaSA9IDA7IGkgPCBhcnJheS0+Y3NpemU7IGkrKykgeworCQloaSA9IGFycmF5LT5pdGVtc1tpXTsKKwkJd2hpbGUgKGhpKSB7CisJCQlzdHJjcHkody0+ZW5kLCBoaS0+bmFtZSk7CisJCQluZXh0d29yZCgmdy0+ZW5kKTsKKwkJCWhpID0gaGktPm5leHQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaGFzaHdhbGtfbmV4dCh2YXIgKnYpCit7CisJd2Fsa2VyX2xpc3QgKncgPSB2LT54LndhbGtlcjsKKworCWlmICh3LT5jdXIgPj0gdy0+ZW5kKSB7CisJCXdhbGtlcl9saXN0ICpwcmV2X3dhbGtlciA9IHctPnByZXY7CisKKwkJZGVidWdfcHJpbnRmX3dhbGtlcigiZW5kIG9mIGl0ZXJhdGlvbiwgZnJlZSh3YWxrZXJAJXA6JXApLCBwcmV2X3dhbGtlcjolcFxuIiwgJnYtPngud2Fsa2VyLCB3LCBwcmV2X3dhbGtlcik7CisJCWZyZWUodyk7CisJCXYtPngud2Fsa2VyID0gcHJldl93YWxrZXI7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlzZXR2YXJfcyh2LCBuZXh0d29yZCgmdy0+Y3VyKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qIGV2YWx1YXRlIG5vZGUsIHJldHVybiAxIHdoZW4gcmVzdWx0IGlzIHRydWUsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IHB0ZXN0KG5vZGUgKnBhdHRlcm4pCit7CisJLyogcHRlc3RfX3YgaXMgInN0YXRpYyI6IHRvIHNhdmUgc3RhY2sgc3BhY2U/ICovCisJcmV0dXJuIGlzdHJ1ZShldmFsdWF0ZShwYXR0ZXJuLCAmRy5wdGVzdF9fdikpOworfQorCisvKiByZWFkIG5leHQgcmVjb3JkIGZyb20gc3RyZWFtIHJzbSBpbnRvIGEgdmFyaWFibGUgdiAqLworc3RhdGljIGludCBhd2tfZ2V0bGluZShyc3RyZWFtICpyc20sIHZhciAqdikKK3sKKwljaGFyICpiOworCXJlZ21hdGNoX3QgcG1hdGNoWzJdOworCWludCBzaXplLCBhLCBwLCBwcCA9IDA7CisJaW50IGZkLCBzbywgZW8sIHIsIHJwOworCWNoYXIgYywgKm0sICpzOworCisJZGVidWdfcHJpbnRmX2V2YWwoImVudGVyZWQgJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogd2UncmUgdXNpbmcgb3VyIG93biBidWZmZXIgc2luY2Ugd2UgbmVlZCBhY2Nlc3MgdG8gYWNjdW11bGF0aW5nCisJICogY2hhcmFjdGVycworCSAqLworCWZkID0gZmlsZW5vKHJzbS0+Rik7CisJbSA9IHJzbS0+YnVmZmVyOworCWEgPSByc20tPmFkdjsKKwlwID0gcnNtLT5wb3M7CisJc2l6ZSA9IHJzbS0+c2l6ZTsKKwljID0gKGNoYXIpIHJzcGxpdHRlci5uLmluZm87CisJcnAgPSAwOworCisJaWYgKCFtKQorCQltID0gcXJlYWxsb2MobSwgMjU2LCAmc2l6ZSk7CisKKwlkbyB7CisJCWIgPSBtICsgYTsKKwkJc28gPSBlbyA9IHA7CisJCXIgPSAxOworCQlpZiAocCA+IDApIHsKKwkJCWlmICgocnNwbGl0dGVyLm4uaW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfUkVHRVhQKSB7CisJCQkJaWYgKHJlZ2V4ZWMoaWNhc2UgPyByc3BsaXR0ZXIubi5yLmlyZSA6IHJzcGxpdHRlci5uLmwucmUsCisJCQkJCQkJYiwgMSwgcG1hdGNoLCAwKSA9PSAwKSB7CisJCQkJCXNvID0gcG1hdGNoWzBdLnJtX3NvOworCQkJCQllbyA9IHBtYXRjaFswXS5ybV9lbzsKKwkJCQkJaWYgKGJbZW9dICE9ICdcMCcpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGMgIT0gJ1wwJykgeworCQkJCXMgPSBzdHJjaHIoYitwcCwgYyk7CisJCQkJaWYgKCFzKQorCQkJCQlzID0gbWVtY2hyKGIrcHAsICdcMCcsIHAgLSBwcCk7CisJCQkJaWYgKHMpIHsKKwkJCQkJc28gPSBlbyA9IHMtYjsKKwkJCQkJZW8rKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoYltycF0gPT0gJ1xuJykKKwkJCQkJcnArKzsKKwkJCQlzID0gc3Ryc3RyKGIrcnAsICJcblxuIik7CisJCQkJaWYgKHMpIHsKKwkJCQkJc28gPSBlbyA9IHMtYjsKKwkJCQkJd2hpbGUgKGJbZW9dID09ICdcbicpCisJCQkJCQllbysrOworCQkJCQlpZiAoYltlb10gIT0gJ1wwJykKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChhID4gMCkgeworCQkJbWVtbW92ZShtLCBtK2EsIHArMSk7CisJCQliID0gbTsKKwkJCWEgPSAwOworCQl9CisKKwkJbSA9IHFyZWFsbG9jKG0sIGErcCsxMjgsICZzaXplKTsKKwkJYiA9IG0gKyBhOworCQlwcCA9IHA7CisJCXAgKz0gc2FmZV9yZWFkKGZkLCBiK3AsIHNpemUtcC0xKTsKKwkJaWYgKHAgPCBwcCkgeworCQkJcCA9IDA7CisJCQlyID0gMDsKKwkJCXNldHZhcl9pKGludHZhcltFUlJOT10sIGVycm5vKTsKKwkJfQorCQliW3BdID0gJ1wwJzsKKworCX0gd2hpbGUgKHAgPiBwcCk7CisKKwlpZiAocCA9PSAwKSB7CisJCXItLTsKKwl9IGVsc2UgeworCQljID0gYltzb107IGJbc29dID0gJ1wwJzsKKwkJc2V0dmFyX3ModiwgYitycCk7CisJCXYtPnR5cGUgfD0gVkZfVVNFUjsKKwkJYltzb10gPSBjOworCQljID0gYltlb107IGJbZW9dID0gJ1wwJzsKKwkJc2V0dmFyX3MoaW50dmFyW1JUXSwgYitzbyk7CisJCWJbZW9dID0gYzsKKwl9CisKKwlyc20tPmJ1ZmZlciA9IG07CisJcnNtLT5hZHYgPSBhICsgZW87CisJcnNtLT5wb3MgPSBwIC0gZW87CisJcnNtLT5zaXplID0gc2l6ZTsKKworCWRlYnVnX3ByaW50Zl9ldmFsKCJyZXR1cm5pbmcgZnJvbSAlcygpOiAlZFxuIiwgX19mdW5jX18sIHIpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZm10X251bShjaGFyICpiLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCBkb3VibGUgbiwgaW50IGludF9hc19pbnQpCit7CisJaW50IHIgPSAwOworCWNoYXIgYzsKKwljb25zdCBjaGFyICpzID0gZm9ybWF0OworCisJaWYgKGludF9hc19pbnQgJiYgbiA9PSAoaW50KW4pIHsKKwkJciA9IHNucHJpbnRmKGIsIHNpemUsICIlZCIsIChpbnQpbik7CisJfSBlbHNlIHsKKwkJZG8geyBjID0gKnM7IH0gd2hpbGUgKGMgJiYgKisrcyk7CisJCWlmIChzdHJjaHIoImRpb3V4WCIsIGMpKSB7CisJCQlyID0gc25wcmludGYoYiwgc2l6ZSwgZm9ybWF0LCAoaW50KW4pOworCQl9IGVsc2UgaWYgKHN0cmNocigiZUVmZ0ciLCBjKSkgeworCQkJciA9IHNucHJpbnRmKGIsIHNpemUsIGZvcm1hdCwgbik7CisJCX0gZWxzZSB7CisJCQlzeW50YXhfZXJyb3IoRU1TR19JTlZfRk1UKTsKKwkJfQorCX0KKwlyZXR1cm4gcjsKK30KKworLyogZm9ybWF0dGVkIG91dHB1dCBpbnRvIGFuIGFsbG9jYXRlZCBidWZmZXIsIHJldHVybiBwdHIgdG8gYnVmZmVyICovCitzdGF0aWMgY2hhciAqYXdrX3ByaW50Zihub2RlICpuKQoreworCWNoYXIgKmIgPSBOVUxMOworCWNoYXIgKmZtdCwgKnMsICpmOworCWNvbnN0IGNoYXIgKnMxOworCWludCBpLCBqLCBpbmNyLCBic2l6ZTsKKwljaGFyIGMsIGMxOworCXZhciAqdiwgKmFyZzsKKworCXYgPSBudmFsbG9jKDEpOworCWZtdCA9IGYgPSB4c3RyZHVwKGdldHZhcl9zKGV2YWx1YXRlKG5leHRhcmcoJm4pLCB2KSkpOworCisJaSA9IDA7CisJd2hpbGUgKCpmKSB7CisJCXMgPSBmOworCQl3aGlsZSAoKmYgJiYgKCpmICE9ICclJyB8fCAqKytmID09ICclJykpCisJCQlmKys7CisJCXdoaWxlICgqZiAmJiAhaXNhbHBoYSgqZikpIHsKKwkJCWlmICgqZiA9PSAnKicpCisJCQkJc3ludGF4X2Vycm9yKCIlKnggZm9ybWF0cyBhcmUgbm90IHN1cHBvcnRlZCIpOworCQkJZisrOworCQl9CisKKwkJaW5jciA9IChmIC0gcykgKyBNQVhWQVJGTVQ7CisJCWIgPSBxcmVhbGxvYyhiLCBpbmNyICsgaSwgJmJzaXplKTsKKwkJYyA9ICpmOworCQlpZiAoYyAhPSAnXDAnKQorCQkJZisrOworCQljMSA9ICpmOworCQkqZiA9ICdcMCc7CisJCWFyZyA9IGV2YWx1YXRlKG5leHRhcmcoJm4pLCB2KTsKKworCQlqID0gaTsKKwkJaWYgKGMgPT0gJ2MnIHx8ICFjKSB7CisJCQlpICs9IHNwcmludGYoYitpLCBzLCBpc19udW1lcmljKGFyZykgPworCQkJCQkoY2hhcilnZXR2YXJfaShhcmcpIDogKmdldHZhcl9zKGFyZykpOworCQl9IGVsc2UgaWYgKGMgPT0gJ3MnKSB7CisJCQlzMSA9IGdldHZhcl9zKGFyZyk7CisJCQliID0gcXJlYWxsb2MoYiwgaW5jcitpK3N0cmxlbihzMSksICZic2l6ZSk7CisJCQlpICs9IHNwcmludGYoYitpLCBzLCBzMSk7CisJCX0gZWxzZSB7CisJCQlpICs9IGZtdF9udW0oYitpLCBpbmNyLCBzLCBnZXR2YXJfaShhcmcpLCBGQUxTRSk7CisJCX0KKwkJKmYgPSBjMTsKKworCQkvKiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgc3ByaW50ZiwgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlICovCisJCWlmIChpIDwgaikKKwkJCWkgPSBqOworCX0KKworCWZyZWUoZm10KTsKKwludmZyZWUodik7CisJYiA9IHhyZWFsbG9jKGIsIGkgKyAxKTsKKwliW2ldID0gJ1wwJzsKKwlyZXR1cm4gYjsKK30KKworLyogQ29tbW9uIHN1YnN0aXR1dGlvbiByb3V0aW5lLgorICogUmVwbGFjZSAobm0pJ3RoIHN1YnN0cmluZyBvZiAoc3JjKSB0aGF0IG1hdGNoZXMgKHJuKSB3aXRoIChyZXBsKSwKKyAqIHN0b3JlIHJlc3VsdCBpbnRvIChkZXN0KSwgcmV0dXJuIG51bWJlciBvZiBzdWJzdGl0dXRpb25zLgorICogSWYgbm0gPSAwLCByZXBsYWNlIGFsbCBtYXRjaGVzLgorICogSWYgc3JjIG9yIGRzdCBpcyBOVUxMLCB1c2UgJDAuCisgKiBJZiBzdWJleHAgIT0gMCwgZW5hYmxlIHN1YmV4cHJlc3Npb24gbWF0Y2hpbmcgKFwxLVw5KS4KKyAqLworc3RhdGljIGludCBhd2tfc3ViKG5vZGUgKnJuLCBjb25zdCBjaGFyICpyZXBsLCBpbnQgbm0sIHZhciAqc3JjLCB2YXIgKmRlc3QsIGludCBzdWJleHApCit7CisJY2hhciAqcmVzYnVmOworCWNvbnN0IGNoYXIgKnNwOworCWludCBtYXRjaF9ubywgcmVzaWR4LCByZXBsZW4sIHJlc2J1ZnNpemU7CisJaW50IHJlZ2V4ZWNfZmxhZ3M7CisJcmVnbWF0Y2hfdCBwbWF0Y2hbMTBdOworCXJlZ2V4X3Qgc3JlZywgKnJlZ2V4OworCisJcmVzYnVmID0gTlVMTDsKKwlyZXNpZHggPSAwOworCW1hdGNoX25vID0gMDsKKwlyZWdleGVjX2ZsYWdzID0gMDsKKwlyZWdleCA9IGFzX3JlZ2V4KHJuLCAmc3JlZyk7CisJc3AgPSBnZXR2YXJfcyhzcmMgPyBzcmMgOiBpbnR2YXJbRjBdKTsKKwlyZXBsZW4gPSBzdHJsZW4ocmVwbCk7CisJd2hpbGUgKHJlZ2V4ZWMocmVnZXgsIHNwLCAxMCwgcG1hdGNoLCByZWdleGVjX2ZsYWdzKSA9PSAwKSB7CisJCWludCBzbyA9IHBtYXRjaFswXS5ybV9zbzsKKwkJaW50IGVvID0gcG1hdGNoWzBdLnJtX2VvOworCisJCS8vYmJfZXJyb3JfbXNnKCJtYXRjaCAldTogWyV1LCV1XSAnJXMnJXAiLCBtYXRjaF9ubysxLCBzbywgZW8sIHNwLHNwKTsKKwkJcmVzYnVmID0gcXJlYWxsb2MocmVzYnVmLCByZXNpZHggKyBlbyArIHJlcGxlbiwgJnJlc2J1ZnNpemUpOworCQltZW1jcHkocmVzYnVmICsgcmVzaWR4LCBzcCwgZW8pOworCQlyZXNpZHggKz0gZW87CisJCWlmICgrK21hdGNoX25vID49IG5tKSB7CisJCQljb25zdCBjaGFyICpzOworCQkJaW50IG5iczsKKworCQkJLyogcmVwbGFjZSAqLworCQkJcmVzaWR4IC09IChlbyAtIHNvKTsKKwkJCW5icyA9IDA7CisJCQlmb3IgKHMgPSByZXBsOyAqczsgcysrKSB7CisJCQkJY2hhciBjID0gcmVzYnVmW3Jlc2lkeCsrXSA9ICpzOworCQkJCWlmIChjID09ICdcXCcpIHsKKwkJCQkJbmJzKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoYyA9PSAnJicgfHwgKHN1YmV4cCAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykpIHsKKwkJCQkJaW50IGo7CisJCQkJCXJlc2lkeCAtPSAoKG5icyArIDMpID4+IDEpOworCQkJCQlqID0gMDsKKwkJCQkJaWYgKGMgIT0gJyYnKSB7CisJCQkJCQlqID0gYyAtICcwJzsKKwkJCQkJCW5icysrOworCQkJCQl9CisJCQkJCWlmIChuYnMgJSAyKSB7CisJCQkJCQlyZXNidWZbcmVzaWR4KytdID0gYzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWludCBuID0gcG1hdGNoW2pdLnJtX2VvIC0gcG1hdGNoW2pdLnJtX3NvOworCQkJCQkJcmVzYnVmID0gcXJlYWxsb2MocmVzYnVmLCByZXNpZHggKyByZXBsZW4gKyBuLCAmcmVzYnVmc2l6ZSk7CisJCQkJCQltZW1jcHkocmVzYnVmICsgcmVzaWR4LCBzcCArIHBtYXRjaFtqXS5ybV9zbywgbik7CisJCQkJCQlyZXNpZHggKz0gbjsKKwkJCQkJfQorCQkJCX0KKwkJCQluYnMgPSAwOworCQkJfQorCQl9CisKKwkJcmVnZXhlY19mbGFncyA9IFJFR19OT1RCT0w7CisJCXNwICs9IGVvOworCQlpZiAobWF0Y2hfbm8gPT0gbm0pCisJCQlicmVhazsKKwkJaWYgKGVvID09IHNvKSB7CisJCQkvKiBFbXB0eSBtYXRjaCAoZS5nLiAiYioiIHdpbGwgbWF0Y2ggYW55d2hlcmUpLgorCQkJICogQWR2YW5jZSBieSBvbmUgY2hhci4gKi8KKy8vQlVHIChidWcgMTMzMyk6CisvL2dzdWIoL1w8YiovLCIiKSBvbiAiYWJjIiB3aWxsIHJlYWNoIHRoaXMgcG9pbnQsIGFkdmFuY2UgdG8gImJjIgorLy8uLi4gYW5kIHdpbGwgZXJyb25lb3VzbHkgbWF0Y2ggImIiIGV2ZW4gdGhvdWdoIGl0IGlzIE5PVCBhdCB0aGUgd29yZCBzdGFydC4KKy8vd2UgbmVlZCBSRUdfTk9UQk9XIGJ1dCBpdCBkb2VzIG5vdCBleGlzdC4uLgorLy9UT0RPOiBpZiBFWFRSQV9DT01QQVQ9eSwgdXNlIEdOVSBtYXRjaGluZyBhbmQgcmVfc2VhcmNoLAorLy9pdCBzaG91bGQgYmUgYWJsZSB0byBkbyBpdCBjb3JyZWN0bHkuCisJCQkvKiBTdWJ0bGU6IHRoaXMgaXMgc2FmZSBvbmx5IGJlY2F1c2UKKwkJCSAqIHFyZWFsbG9jIGFsbG9jYXRlZCBhdCBsZWFzdCBvbmUgZXh0cmEgYnl0ZSAqLworCQkJcmVzYnVmW3Jlc2lkeF0gPSAqc3A7CisJCQlpZiAoKnNwID09ICdcMCcpCisJCQkJZ290byByZXQ7CisJCQlzcCsrOworCQkJcmVzaWR4Kys7CisJCX0KKwl9CisKKwlyZXNidWYgPSBxcmVhbGxvYyhyZXNidWYsIHJlc2lkeCArIHN0cmxlbihzcCksICZyZXNidWZzaXplKTsKKwlzdHJjcHkocmVzYnVmICsgcmVzaWR4LCBzcCk7CisgcmV0OgorCS8vYmJfZXJyb3JfbXNnKCJlbmQgc3A6JyVzJyVwIiwgc3Asc3ApOworCXNldHZhcl9wKGRlc3QgPyBkZXN0IDogaW50dmFyW0YwXSwgcmVzYnVmKTsKKwlpZiAocmVnZXggPT0gJnNyZWcpCisJCXJlZ2ZyZWUocmVnZXgpOworCXJldHVybiBtYXRjaF9ubzsKK30KKworc3RhdGljIE5PSU5MSU5FIGludCBkb19ta3RpbWUoY29uc3QgY2hhciAqZHMpCit7CisJc3RydWN0IHRtIHRoZW47CisJaW50IGNvdW50OworCisJLyptZW1zZXQoJnRoZW4sIDAsIHNpemVvZih0aGVuKSk7IC0gbm90IG5lZWRlZCAqLworCXRoZW4udG1faXNkc3QgPSAtMTsgLyogZGVmYXVsdCBpcyB1bmtub3duICovCisKKwkvKiBtYW5wYWdlIG9mIG1rdGltZSBzYXlzIHRoZXNlIGZpZWxkcyBhcmUgaW50cywKKwkgKiBzbyB3ZSBjYW4gc3NjYW5mIHN0dWZmIGRpcmVjdGx5IGludG8gdGhlbSAqLworCWNvdW50ID0gc3NjYW5mKGRzLCAiJXUgJXUgJXUgJXUgJXUgJXUgJWQiLAorCQkmdGhlbi50bV95ZWFyLCAmdGhlbi50bV9tb24sICZ0aGVuLnRtX21kYXksCisJCSZ0aGVuLnRtX2hvdXIsICZ0aGVuLnRtX21pbiwgJnRoZW4udG1fc2VjLAorCQkmdGhlbi50bV9pc2RzdCk7CisKKwlpZiAoY291bnQgPCA2CisJIHx8ICh1bnNpZ25lZCl0aGVuLnRtX21vbiA8IDEKKwkgfHwgKHVuc2lnbmVkKXRoZW4udG1feWVhciA8IDE5MDAKKwkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXRoZW4udG1fbW9uIC09IDE7CisJdGhlbi50bV95ZWFyIC09IDE5MDA7CisKKwlyZXR1cm4gbWt0aW1lKCZ0aGVuKTsKK30KKworc3RhdGljIE5PSU5MSU5FIHZhciAqZXhlY19idWlsdGluKG5vZGUgKm9wLCB2YXIgKnJlcykKK3sKKyNkZWZpbmUgdHNwbCAoRy5leGVjX2J1aWx0aW5fX3RzcGwpCisKKwl2YXIgKnR2OworCW5vZGUgKmFuWzRdOworCXZhciAqYXZbNF07CisJY29uc3QgY2hhciAqYXNbNF07CisJcmVnbWF0Y2hfdCBwbWF0Y2hbMl07CisJcmVnZXhfdCBzcmVnLCAqcmU7CisJbm9kZSAqc3BsOworCXVpbnQzMl90IGlzciwgaW5mbzsKKwlpbnQgbmFyZ3M7CisJdGltZV90IHR0OworCWludCBpLCBsLCBsbCwgbjsKKworCXR2ID0gbnZhbGxvYyg0KTsKKwlpc3IgPSBpbmZvID0gb3AtPmluZm87CisJb3AgPSBvcC0+bC5uOworCisJYXZbMl0gPSBhdlszXSA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IDQgJiYgb3A7IGkrKykgeworCQlhbltpXSA9IG5leHRhcmcoJm9wKTsKKwkJaWYgKGlzciAmIDB4MDkwMDAwMDApCisJCQlhdltpXSA9IGV2YWx1YXRlKGFuW2ldLCAmdHZbaV0pOworCQlpZiAoaXNyICYgMHgwODAwMDAwMCkKKwkJCWFzW2ldID0gZ2V0dmFyX3MoYXZbaV0pOworCQlpc3IgPj49IDE7CisJfQorCisJbmFyZ3MgPSBpOworCWlmICgodWludDMyX3QpbmFyZ3MgPCAoaW5mbyA+PiAzMCkpCisJCXN5bnRheF9lcnJvcihFTVNHX1RPT19GRVdfQVJHUyk7CisKKwlpbmZvICY9IE9QTk1BU0s7CisJc3dpdGNoIChpbmZvKSB7CisKKwljYXNlIEJfYTI6CisJCWlmIChFTkFCTEVfRkVBVFVSRV9BV0tfTElCTSkKKwkJCXNldHZhcl9pKHJlcywgYXRhbjIoZ2V0dmFyX2koYXZbMF0pLCBnZXR2YXJfaShhdlsxXSkpKTsKKwkJZWxzZQorCQkJc3ludGF4X2Vycm9yKEVNU0dfTk9fTUFUSCk7CisJCWJyZWFrOworCisJY2FzZSBCX3NwOiB7CisJCWNoYXIgKnMsICpzMTsKKworCQlpZiAobmFyZ3MgPiAyKSB7CisJCQlzcGwgPSAoYW5bMl0tPmluZm8gJiBPUENMU01BU0spID09IE9DX1JFR0VYUCA/CisJCQkJYW5bMl0gOiBta19zcGxpdHRlcihnZXR2YXJfcyhldmFsdWF0ZShhblsyXSwgJnR2WzJdKSksICZ0c3BsKTsKKwkJfSBlbHNlIHsKKwkJCXNwbCA9ICZmc3BsaXR0ZXIubjsKKwkJfQorCisJCW4gPSBhd2tfc3BsaXQoYXNbMF0sIHNwbCwgJnMpOworCQlzMSA9IHM7CisJCWNsZWFyX2FycmF5KGlhbWFycmF5KGF2WzFdKSk7CisJCWZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKQorCQkJc2V0YXJpX3UoYXZbMV0sIGksIG5leHR3b3JkKCZzKSk7CisJCWZyZWUoczEpOworCQlzZXR2YXJfaShyZXMsIG4pOworCQlicmVhazsKKwl9CisKKwljYXNlIEJfc3M6IHsKKwkJY2hhciAqczsKKworCQlsID0gc3RybGVuKGFzWzBdKTsKKwkJaSA9IGdldHZhcl9pKGF2WzFdKSAtIDE7CisJCWlmIChpID4gbCkKKwkJCWkgPSBsOworCQlpZiAoaSA8IDApCisJCQlpID0gMDsKKwkJbiA9IChuYXJncyA+IDIpID8gZ2V0dmFyX2koYXZbMl0pIDogbC1pOworCQlpZiAobiA8IDApCisJCQluID0gMDsKKwkJcyA9IHhzdHJuZHVwKGFzWzBdK2ksIG4pOworCQlzZXR2YXJfcChyZXMsIHMpOworCQlicmVhazsKKwl9CisKKwkvKiBCaXR3aXNlIG9wcyBtdXN0IGFzc3VtZSB0aGF0IG9wZXJhbmRzIGFyZSB1bnNpZ25lZC4gR05VIEF3ayAzLjEuNToKKwkgKiBhd2sgJ3sgcHJpbnQgb3IoLTEsMSkgfScgZ2l2ZXMgIjQuMjk0OTdlKzA5Iiwgbm90ICItMi54eHhlKzA5IiAqLworCWNhc2UgQl9hbjoKKwkJc2V0dmFyX2kocmVzLCBnZXR2YXJfaV9pbnQoYXZbMF0pICYgZ2V0dmFyX2lfaW50KGF2WzFdKSk7CisJCWJyZWFrOworCisJY2FzZSBCX2NvOgorCQlzZXR2YXJfaShyZXMsIH5nZXR2YXJfaV9pbnQoYXZbMF0pKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfbHM6CisJCXNldHZhcl9pKHJlcywgZ2V0dmFyX2lfaW50KGF2WzBdKSA8PCBnZXR2YXJfaV9pbnQoYXZbMV0pKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfb3I6CisJCXNldHZhcl9pKHJlcywgZ2V0dmFyX2lfaW50KGF2WzBdKSB8IGdldHZhcl9pX2ludChhdlsxXSkpOworCQlicmVhazsKKworCWNhc2UgQl9yczoKKwkJc2V0dmFyX2kocmVzLCBnZXR2YXJfaV9pbnQoYXZbMF0pID4+IGdldHZhcl9pX2ludChhdlsxXSkpOworCQlicmVhazsKKworCWNhc2UgQl94bzoKKwkJc2V0dmFyX2kocmVzLCBnZXR2YXJfaV9pbnQoYXZbMF0pIF4gZ2V0dmFyX2lfaW50KGF2WzFdKSk7CisJCWJyZWFrOworCisJY2FzZSBCX2xvOgorCWNhc2UgQl91cDogeworCQljaGFyICpzLCAqczE7CisJCXMxID0gcyA9IHhzdHJkdXAoYXNbMF0pOworCQl3aGlsZSAoKnMxKSB7CisJCQkvLypzMSA9IChpbmZvID09IEJfdXApID8gdG91cHBlcigqczEpIDogdG9sb3dlcigqczEpOworCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSgoKnMxIHwgMHgyMCkgLSAnYScpIDw9ICgneicgLSAnYScpKQorCQkJCSpzMSA9IChpbmZvID09IEJfdXApID8gKCpzMSAmIDB4ZGYpIDogKCpzMSB8IDB4MjApOworCQkJczErKzsKKwkJfQorCQlzZXR2YXJfcChyZXMsIHMpOworCQlicmVhazsKKwl9CisKKwljYXNlIEJfaXg6CisJCW4gPSAwOworCQlsbCA9IHN0cmxlbihhc1sxXSk7CisJCWwgPSBzdHJsZW4oYXNbMF0pIC0gbGw7CisJCWlmIChsbCA+IDAgJiYgbCA+PSAwKSB7CisJCQlpZiAoIWljYXNlKSB7CisJCQkJY2hhciAqcyA9IHN0cnN0cihhc1swXSwgYXNbMV0pOworCQkJCWlmIChzKQorCQkJCQluID0gKHMgLSBhc1swXSkgKyAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiB0aGlzIHBpZWNlIG9mIGNvZGUgaXMgdGVycmlibHkgc2xvdyBhbmQKKwkJCQkgKiByZWFsbHkgc2hvdWxkIGJlIHJld3JpdHRlbgorCQkJCSAqLworCQkJCWZvciAoaSA9IDA7IGkgPD0gbDsgaSsrKSB7CisJCQkJCWlmIChzdHJuY2FzZWNtcChhc1swXStpLCBhc1sxXSwgbGwpID09IDApIHsKKwkJCQkJCW4gPSBpKzE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlzZXR2YXJfaShyZXMsIG4pOworCQlicmVhazsKKworCWNhc2UgQl90aToKKwkJaWYgKG5hcmdzID4gMSkKKwkJCXR0ID0gZ2V0dmFyX2koYXZbMV0pOworCQllbHNlCisJCQl0aW1lKCZ0dCk7CisJCS8vcyA9IChuYXJncyA+IDApID8gYXNbMF0gOiAiJWEgJWIgJWQgJUg6JU06JVMgJVogJVkiOworCQlpID0gc3RyZnRpbWUoZ19idWYsIE1BWFZBUkZNVCwKKwkJCSgobmFyZ3MgPiAwKSA/IGFzWzBdIDogIiVhICViICVkICVIOiVNOiVTICVaICVZIiksCisJCQlsb2NhbHRpbWUoJnR0KSk7CisJCWdfYnVmW2ldID0gJ1wwJzsKKwkJc2V0dmFyX3MocmVzLCBnX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBCX210OgorCQlzZXR2YXJfaShyZXMsIGRvX21rdGltZShhc1swXSkpOworCQlicmVhazsKKworCWNhc2UgQl9tYToKKwkJcmUgPSBhc19yZWdleChhblsxXSwgJnNyZWcpOworCQluID0gcmVnZXhlYyhyZSwgYXNbMF0sIDEsIHBtYXRjaCwgMCk7CisJCWlmIChuID09IDApIHsKKwkJCXBtYXRjaFswXS5ybV9zbysrOworCQkJcG1hdGNoWzBdLnJtX2VvKys7CisJCX0gZWxzZSB7CisJCQlwbWF0Y2hbMF0ucm1fc28gPSAwOworCQkJcG1hdGNoWzBdLnJtX2VvID0gLTE7CisJCX0KKwkJc2V0dmFyX2kobmV3dmFyKCJSU1RBUlQiKSwgcG1hdGNoWzBdLnJtX3NvKTsKKwkJc2V0dmFyX2kobmV3dmFyKCJSTEVOR1RIIiksIHBtYXRjaFswXS5ybV9lbyAtIHBtYXRjaFswXS5ybV9zbyk7CisJCXNldHZhcl9pKHJlcywgcG1hdGNoWzBdLnJtX3NvKTsKKwkJaWYgKHJlID09ICZzcmVnKQorCQkJcmVnZnJlZShyZSk7CisJCWJyZWFrOworCisJY2FzZSBCX2dlOgorCQlhd2tfc3ViKGFuWzBdLCBhc1sxXSwgZ2V0dmFyX2koYXZbMl0pLCBhdlszXSwgcmVzLCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfZ3M6CisJCXNldHZhcl9pKHJlcywgYXdrX3N1YihhblswXSwgYXNbMV0sIDAsIGF2WzJdLCBhdlsyXSwgRkFMU0UpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfc3U6CisJCXNldHZhcl9pKHJlcywgYXdrX3N1YihhblswXSwgYXNbMV0sIDEsIGF2WzJdLCBhdlsyXSwgRkFMU0UpKTsKKwkJYnJlYWs7CisJfQorCisJbnZmcmVlKHR2KTsKKwlyZXR1cm4gcmVzOworI3VuZGVmIHRzcGwKK30KKworLyoKKyAqIEV2YWx1YXRlIG5vZGUgLSB0aGUgaGVhcnQgb2YgdGhlIHByb2dyYW0uIFN1cHBsaWVkIHdpdGggc3VidHJlZQorICogYW5kIHBsYWNlIHdoZXJlIHRvIHN0b3JlIHJlc3VsdC4gcmV0dXJucyBwdHIgdG8gcmVzdWx0LgorICovCisjZGVmaW5lIFhDKG4pICgobikgPj4gOCkKKworc3RhdGljIHZhciAqZXZhbHVhdGUobm9kZSAqb3AsIHZhciAqcmVzKQoreworLyogVGhpcyBwcm9jZWR1cmUgaXMgcmVjdXJzaXZlIHNvIHdlIHNob3VsZCBjb3VudCBldmVyeSBieXRlICovCisjZGVmaW5lIGZuYXJncyAoRy5ldmFsdWF0ZV9fZm5hcmdzKQorLyogc2VlZCBpcyBpbml0aWFsaXplZCB0byAxICovCisjZGVmaW5lIHNlZWQgICAoRy5ldmFsdWF0ZV9fc2VlZCkKKyNkZWZpbmUgc3JlZyAgIChHLmV2YWx1YXRlX19zcmVnKQorCisJdmFyICp2MTsKKworCWlmICghb3ApCisJCXJldHVybiBzZXR2YXJfcyhyZXMsIE5VTEwpOworCisJZGVidWdfcHJpbnRmX2V2YWwoImVudGVyZWQgJXMoKVxuIiwgX19mdW5jX18pOworCisJdjEgPSBudmFsbG9jKDIpOworCisJd2hpbGUgKG9wKSB7CisJCXN0cnVjdCB7CisJCQl2YXIgKnY7CisJCQljb25zdCBjaGFyICpzOworCQl9IEwgPSBMOyAvKiBmb3IgY29tcGlsZXIgKi8KKwkJc3RydWN0IHsKKwkJCXZhciAqdjsKKwkJCWNvbnN0IGNoYXIgKnM7CisJCX0gUiA9IFI7CisJCWRvdWJsZSBMX2QgPSBMX2Q7CisJCXVpbnQzMl90IG9waW5mbzsKKwkJaW50IG9wbjsKKwkJbm9kZSAqb3AxOworCisJCW9waW5mbyA9IG9wLT5pbmZvOworCQlvcG4gPSAob3BpbmZvICYgT1BOTUFTSyk7CisJCWdfbGluZW5vID0gb3AtPmxpbmVubzsKKwkJb3AxID0gb3AtPmwubjsKKwkJZGVidWdfcHJpbnRmX2V2YWwoIm9waW5mbzolMDh4IG9wbjolMDh4XG4iLCBvcGluZm8sIG9wbik7CisKKwkJLyogZXhlY3V0ZSBpbmV2aXRhYmxlIHRoaW5ncyAqLworCQlpZiAob3BpbmZvICYgT0ZfUkVTMSkKKwkJCUwudiA9IGV2YWx1YXRlKG9wMSwgdjEpOworCQlpZiAob3BpbmZvICYgT0ZfUkVTMikKKwkJCVIudiA9IGV2YWx1YXRlKG9wLT5yLm4sIHYxKzEpOworCQlpZiAob3BpbmZvICYgT0ZfU1RSMSkgeworCQkJTC5zID0gZ2V0dmFyX3MoTC52KTsKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJMLnM6JyVzJ1xuIiwgTC5zKTsKKwkJfQorCQlpZiAob3BpbmZvICYgT0ZfU1RSMikgeworCQkJUi5zID0gZ2V0dmFyX3MoUi52KTsKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJSLnM6JyVzJ1xuIiwgUi5zKTsKKwkJfQorCQlpZiAob3BpbmZvICYgT0ZfTlVNMSkgeworCQkJTF9kID0gZ2V0dmFyX2koTC52KTsKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJMX2Q6JWZcbiIsIExfZCk7CisJCX0KKworCQlkZWJ1Z19wcmludGZfZXZhbCgic3dpdGNoKDB4JXgpXG4iLCBYQyhvcGluZm8gJiBPUENMU01BU0spKTsKKwkJc3dpdGNoIChYQyhvcGluZm8gJiBPUENMU01BU0spKSB7CisKKwkJLyogLS0gaXRlcmF0aXZlIG5vZGUgdHlwZSAtLSAqLworCisJCS8qIHRlc3QgcGF0dGVybiAqLworCQljYXNlIFhDKCBPQ19URVNUICk6CisJCQlpZiAoKG9wMS0+aW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfQ09NTUEpIHsKKwkJCQkvKiBpdCdzIHJhbmdlIHBhdHRlcm4gKi8KKwkJCQlpZiAoKG9waW5mbyAmIE9GX0NIRUNLRUQpIHx8IHB0ZXN0KG9wMS0+bC5uKSkgeworCQkJCQlvcC0+aW5mbyB8PSBPRl9DSEVDS0VEOworCQkJCQlpZiAocHRlc3Qob3AxLT5yLm4pKQorCQkJCQkJb3AtPmluZm8gJj0gfk9GX0NIRUNLRUQ7CisJCQkJCW9wID0gb3AtPmEubjsKKwkJCQl9IGVsc2UgeworCQkJCQlvcCA9IG9wLT5yLm47CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlvcCA9IHB0ZXN0KG9wMSkgPyBvcC0+YS5uIDogb3AtPnIubjsKKwkJCX0KKwkJCWJyZWFrOworCisJCS8qIGp1c3QgZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiwgYWxzbyB1c2VkIGFzIHVuY29uZGl0aW9uYWwganVtcCAqLworCQljYXNlIFhDKCBPQ19FWEVDICk6CisJCQlicmVhazsKKworCQkvKiBicmFuY2gsIHVzZWQgaW4gaWYtZWxzZSBhbmQgdmFyaW91cyBsb29wcyAqLworCQljYXNlIFhDKCBPQ19CUiApOgorCQkJb3AgPSBpc3RydWUoTC52KSA/IG9wLT5hLm4gOiBvcC0+ci5uOworCQkJYnJlYWs7CisKKwkJLyogaW5pdGlhbGl6ZSBmb3ItaW4gbG9vcCAqLworCQljYXNlIFhDKCBPQ19XQUxLSU5JVCApOgorCQkJaGFzaHdhbGtfaW5pdChMLnYsIGlhbWFycmF5KFIudikpOworCQkJYnJlYWs7CisKKwkJLyogZ2V0IG5leHQgYXJyYXkgaXRlbSAqLworCQljYXNlIFhDKCBPQ19XQUxLTkVYVCApOgorCQkJb3AgPSBoYXNod2Fsa19uZXh0KEwudikgPyBvcC0+YS5uIDogb3AtPnIubjsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX1BSSU5UICk6CisJCWNhc2UgWEMoIE9DX1BSSU5URiApOiB7CisJCQlGSUxFICpGID0gc3Rkb3V0OworCisJCQlpZiAob3AtPnIubikgeworCQkJCXJzdHJlYW0gKnJzbSA9IG5ld2ZpbGUoUi5zKTsKKwkJCQlpZiAoIXJzbS0+RikgeworCQkJCQlpZiAob3BuID09ICd8JykgeworCQkJCQkJcnNtLT5GID0gcG9wZW4oUi5zLCAidyIpOworCQkJCQkJaWYgKHJzbS0+RiA9PSBOVUxMKQorCQkJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicG9wZW4iKTsKKwkJCQkJCXJzbS0+aXNfcGlwZSA9IDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyc20tPkYgPSB4Zm9wZW4oUi5zLCBvcG49PSd3JyA/ICJ3IiA6ICJhIik7CisJCQkJCX0KKwkJCQl9CisJCQkJRiA9IHJzbS0+RjsKKwkJCX0KKworCQkJaWYgKChvcGluZm8gJiBPUENMU01BU0spID09IE9DX1BSSU5UKSB7CisJCQkJaWYgKCFvcDEpIHsKKwkJCQkJZnB1dHMoZ2V0dmFyX3MoaW50dmFyW0YwXSksIEYpOworCQkJCX0gZWxzZSB7CisJCQkJCXdoaWxlIChvcDEpIHsKKwkJCQkJCXZhciAqdiA9IGV2YWx1YXRlKG5leHRhcmcoJm9wMSksIHYxKTsKKwkJCQkJCWlmICh2LT50eXBlICYgVkZfTlVNQkVSKSB7CisJCQkJCQkJZm10X251bShnX2J1ZiwgTUFYVkFSRk1ULCBnZXR2YXJfcyhpbnR2YXJbT0ZNVF0pLAorCQkJCQkJCQkJZ2V0dmFyX2kodiksIFRSVUUpOworCQkJCQkJCWZwdXRzKGdfYnVmLCBGKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZnB1dHMoZ2V0dmFyX3ModiksIEYpOworCQkJCQkJfQorCisJCQkJCQlpZiAob3AxKQorCQkJCQkJCWZwdXRzKGdldHZhcl9zKGludHZhcltPRlNdKSwgRik7CisJCQkJCX0KKwkJCQl9CisJCQkJZnB1dHMoZ2V0dmFyX3MoaW50dmFyW09SU10pLCBGKTsKKworCQkJfSBlbHNlIHsJLyogT0NfUFJJTlRGICovCisJCQkJY2hhciAqcyA9IGF3a19wcmludGYob3AxKTsKKwkJCQlmcHV0cyhzLCBGKTsKKwkJCQlmcmVlKHMpOworCQkJfQorCQkJZmZsdXNoKEYpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFhDKCBPQ19ERUxFVEUgKTogeworCQkJdWludDMyX3QgaW5mbyA9IG9wMS0+aW5mbyAmIE9QQ0xTTUFTSzsKKwkJCXZhciAqdjsKKworCQkJaWYgKGluZm8gPT0gT0NfVkFSKSB7CisJCQkJdiA9IG9wMS0+bC52OworCQkJfSBlbHNlIGlmIChpbmZvID09IE9DX0ZOQVJHKSB7CisJCQkJdiA9ICZmbmFyZ3Nbb3AxLT5sLmFpZHhdOworCQkJfSBlbHNlIHsKKwkJCQlzeW50YXhfZXJyb3IoRU1TR19OT1RfQVJSQVkpOworCQkJfQorCisJCQlpZiAob3AxLT5yLm4pIHsKKwkJCQljb25zdCBjaGFyICpzOworCQkJCWNscnZhcihMLnYpOworCQkJCXMgPSBnZXR2YXJfcyhldmFsdWF0ZShvcDEtPnIubiwgdjEpKTsKKwkJCQloYXNoX3JlbW92ZShpYW1hcnJheSh2KSwgcyk7CisJCQl9IGVsc2UgeworCQkJCWNsZWFyX2FycmF5KGlhbWFycmF5KHYpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBYQyggT0NfTkVXU09VUkNFICk6CisJCQlnX3Byb2duYW1lID0gb3AtPmwubmV3X3Byb2duYW1lOworCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfUkVUVVJOICk6CisJCQljb3B5dmFyKHJlcywgTC52KTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX05FWFRGSUxFICk6CisJCQluZXh0ZmlsZSA9IFRSVUU7CisJCWNhc2UgWEMoIE9DX05FWFQgKToKKwkJCW5leHRyZWMgPSBUUlVFOworCQljYXNlIFhDKCBPQ19ET05FICk6CisJCQljbHJ2YXIocmVzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX0VYSVQgKToKKwkJCWF3a19leGl0KExfZCk7CisKKwkJLyogLS0gcmVjdXJzaXZlIG5vZGUgdHlwZSAtLSAqLworCisJCWNhc2UgWEMoIE9DX1ZBUiApOgorCQkJTC52ID0gb3AtPmwudjsKKwkJCWlmIChMLnYgPT0gaW50dmFyW05GXSkKKwkJCQlzcGxpdF9mMCgpOworCQkJZ290byB2X2NvbnQ7CisKKwkJY2FzZSBYQyggT0NfRk5BUkcgKToKKwkJCUwudiA9ICZmbmFyZ3Nbb3AtPmwuYWlkeF07Cisgdl9jb250OgorCQkJcmVzID0gb3AtPnIubiA/IGZpbmR2YXIoaWFtYXJyYXkoTC52KSwgUi5zKSA6IEwudjsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX0lOICk6CisJCQlzZXR2YXJfaShyZXMsIGhhc2hfc2VhcmNoKGlhbWFycmF5KFIudiksIEwucykgPyAxIDogMCk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19SRUdFWFAgKToKKwkJCW9wMSA9IG9wOworCQkJTC5zID0gZ2V0dmFyX3MoaW50dmFyW0YwXSk7CisJCQlnb3RvIHJlX2NvbnQ7CisKKwkJY2FzZSBYQyggT0NfTUFUQ0ggKToKKwkJCW9wMSA9IG9wLT5yLm47CisgcmVfY29udDoKKwkJCXsKKwkJCQlyZWdleF90ICpyZSA9IGFzX3JlZ2V4KG9wMSwgJnNyZWcpOworCQkJCWludCBpID0gcmVnZXhlYyhyZSwgTC5zLCAwLCBOVUxMLCAwKTsKKwkJCQlpZiAocmUgPT0gJnNyZWcpCisJCQkJCXJlZ2ZyZWUocmUpOworCQkJCXNldHZhcl9pKHJlcywgKGkgPT0gMCkgXiAob3BuID09ICchJykpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfTU9WRSApOgorCQkJZGVidWdfcHJpbnRmX2V2YWwoIk1PVkVcbiIpOworCQkJLyogaWYgc291cmNlIGlzIGEgdGVtcG9yYXJ5IHN0cmluZywganVzayByZWxpbmsgaXQgdG8gZGVzdCAqLworLy9EaXNhYmxlZDogaWYgUi52IGlzIG51bWVyaWMgYnV0IGhhcHBlbnMgdG8gaGF2ZSBjYWNoZWQgUi52LT5zdHJpbmcsCisvL3RoZW4gTC52IGVuZHMgdXAgYmVpbmcgYSBzdHJpbmcsIHdoaWNoIGlzIHdyb25nCisvLwkJCWlmIChSLnYgPT0gdjErMSAmJiBSLnYtPnN0cmluZykgeworLy8JCQkJcmVzID0gc2V0dmFyX3AoTC52LCBSLnYtPnN0cmluZyk7CisvLwkJCQlSLnYtPnN0cmluZyA9IE5VTEw7CisvLwkJCX0gZWxzZSB7CisJCQkJcmVzID0gY29weXZhcihMLnYsIFIudik7CisvLwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX1RFUk5BUlkgKToKKwkJCWlmICgob3AtPnIubi0+aW5mbyAmIE9QQ0xTTUFTSykgIT0gT0NfQ09MT04pCisJCQkJc3ludGF4X2Vycm9yKEVNU0dfUE9TU0lCTEVfRVJST1IpOworCQkJcmVzID0gZXZhbHVhdGUoaXN0cnVlKEwudikgPyBvcC0+ci5uLT5sLm4gOiBvcC0+ci5uLT5yLm4sIHJlcyk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19GVU5DICk6IHsKKwkJCXZhciAqdmJlZywgKnY7CisJCQljb25zdCBjaGFyICpzdl9wcm9nbmFtZTsKKworCQkJaWYgKCFvcC0+ci5mLT5ib2R5LmZpcnN0KQorCQkJCXN5bnRheF9lcnJvcihFTVNHX1VOREVGX0ZVTkMpOworCisJCQl2YmVnID0gdiA9IG52YWxsb2Mob3AtPnIuZi0+bmFyZ3MgKyAxKTsKKwkJCXdoaWxlIChvcDEpIHsKKwkJCQl2YXIgKmFyZyA9IGV2YWx1YXRlKG5leHRhcmcoJm9wMSksIHYxKTsKKwkJCQljb3B5dmFyKHYsIGFyZyk7CisJCQkJdi0+dHlwZSB8PSBWRl9DSElMRDsKKwkJCQl2LT54LnBhcmVudCA9IGFyZzsKKwkJCQlpZiAoKyt2IC0gdmJlZyA+PSBvcC0+ci5mLT5uYXJncykKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCXYgPSBmbmFyZ3M7CisJCQlmbmFyZ3MgPSB2YmVnOworCQkJc3ZfcHJvZ25hbWUgPSBnX3Byb2duYW1lOworCisJCQlyZXMgPSBldmFsdWF0ZShvcC0+ci5mLT5ib2R5LmZpcnN0LCByZXMpOworCisJCQlnX3Byb2duYW1lID0gc3ZfcHJvZ25hbWU7CisJCQludmZyZWUoZm5hcmdzKTsKKwkJCWZuYXJncyA9IHY7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBYQyggT0NfR0VUTElORSApOgorCQljYXNlIFhDKCBPQ19QR0VUTElORSApOiB7CisJCQlyc3RyZWFtICpyc207CisJCQlpbnQgaTsKKworCQkJaWYgKG9wMSkgeworCQkJCXJzbSA9IG5ld2ZpbGUoTC5zKTsKKwkJCQlpZiAoIXJzbS0+RikgeworCQkJCQlpZiAoKG9waW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfUEdFVExJTkUpIHsKKwkJCQkJCXJzbS0+RiA9IHBvcGVuKEwucywgInIiKTsKKwkJCQkJCXJzbS0+aXNfcGlwZSA9IFRSVUU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyc20tPkYgPSBmb3Blbl9mb3JfcmVhZChMLnMpOyAgLyogbm90IHhmb3BlbiEgKi8KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFpRikKKwkJCQkJaUYgPSBuZXh0X2lucHV0X2ZpbGUoKTsKKwkJCQlyc20gPSBpRjsKKwkJCX0KKworCQkJaWYgKCFyc20tPkYpIHsKKwkJCQlzZXR2YXJfaShpbnR2YXJbRVJSTk9dLCBlcnJubyk7CisJCQkJc2V0dmFyX2kocmVzLCAtMSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghb3AtPnIubikKKwkJCQlSLnYgPSBpbnR2YXJbRjBdOworCisJCQlpID0gYXdrX2dldGxpbmUocnNtLCBSLnYpOworCQkJaWYgKGkgPiAwICYmICFvcDEpIHsKKwkJCQlpbmN2YXIoaW50dmFyW0ZOUl0pOworCQkJCWluY3ZhcihpbnR2YXJbTlJdKTsKKwkJCX0KKwkJCXNldHZhcl9pKHJlcywgaSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHNpbXBsZSBidWlsdGlucyAqLworCQljYXNlIFhDKCBPQ19GQkxUSU4gKTogeworCQkJZG91YmxlIFJfZCA9IFJfZDsgLyogZm9yIGNvbXBpbGVyICovCisKKwkJCXN3aXRjaCAob3BuKSB7CisJCQljYXNlIEZfaW46CisJCQkJUl9kID0gKGludClMX2Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRl9ybjoKKwkJCQlSX2QgPSAoZG91YmxlKXJhbmQoKSAvIChkb3VibGUpUkFORF9NQVg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRl9jbzoKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVdLX0xJQk0pIHsKKwkJCQkJUl9kID0gY29zKExfZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBGX2V4OgorCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9BV0tfTElCTSkgeworCQkJCQlSX2QgPSBleHAoTF9kKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIEZfbGc6CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0FXS19MSUJNKSB7CisJCQkJCVJfZCA9IGxvZyhMX2QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRl9zaToKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVdLX0xJQk0pIHsKKwkJCQkJUl9kID0gc2luKExfZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBGX3NxOgorCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9BV0tfTElCTSkgeworCQkJCQlSX2QgPSBzcXJ0KExfZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXN5bnRheF9lcnJvcihFTVNHX05PX01BVEgpOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfc3I6CisJCQkJUl9kID0gKGRvdWJsZSlzZWVkOworCQkJCXNlZWQgPSBvcDEgPyAodW5zaWduZWQpTF9kIDogKHVuc2lnbmVkKXRpbWUoTlVMTCk7CisJCQkJc3JhbmQoc2VlZCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRl90aToKKwkJCQlSX2QgPSB0aW1lKE5VTEwpOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfbGU6CisJCQkJaWYgKCFvcDEpCisJCQkJCUwucyA9IGdldHZhcl9zKGludHZhcltGMF0pOworCQkJCVJfZCA9IHN0cmxlbihMLnMpOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfc3k6CisJCQkJZmZsdXNoX2FsbCgpOworCQkJCVJfZCA9IChFTkFCTEVfRkVBVFVSRV9BTExPV19FWEVDICYmIEwucyAmJiAqTC5zKQorCQkJCQkJPyAoc3lzdGVtKEwucykgPj4gOCkgOiAwOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfZmY6CisJCQkJaWYgKCFvcDEpIHsKKwkJCQkJZmZsdXNoKHN0ZG91dCk7CisJCQkJfSBlbHNlIGlmIChMLnMgJiYgKkwucykgeworCQkJCQlyc3RyZWFtICpyc20gPSBuZXdmaWxlKEwucyk7CisJCQkJCWZmbHVzaChyc20tPkYpOworCQkJCX0gZWxzZSB7CisJCQkJCWZmbHVzaF9hbGwoKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRl9jbDogeworCQkJCXJzdHJlYW0gKnJzbTsKKwkJCQlpbnQgZXJyID0gMDsKKwkJCQlyc20gPSAocnN0cmVhbSAqKWhhc2hfc2VhcmNoKGZkaGFzaCwgTC5zKTsKKwkJCQlkZWJ1Z19wcmludGZfZXZhbCgiT0NfRkJMVElOIEZfY2wgcnNtOiVwXG4iLCByc20pOworCQkJCWlmIChyc20pIHsKKwkJCQkJZGVidWdfcHJpbnRmX2V2YWwoIk9DX0ZCTFRJTiBGX2NsICIKKwkJCQkJCSJyc20tPmlzX3BpcGU6JWQsIC0+RjolcFxuIiwKKwkJCQkJCXJzbS0+aXNfcGlwZSwgcnNtLT5GKTsKKwkJCQkJLyogQ2FuIGJlIE5VTEwgaWYgb3BlbiBmYWlsZWQuIEV4YW1wbGU6CisJCQkJCSAqIGdldGxpbmUgbGluZSA8ImRvZXNudF9leGlzdCI7CisJCQkJCSAqIGNsb3NlKCJkb2VzbnRfZXhpc3QiKTsgPC0tLSBoZXJlIHJzbS0+RiBpcyBOVUxMCisJCQkJCSAqLworCQkJCQlpZiAocnNtLT5GKQorCQkJCQkJZXJyID0gcnNtLT5pc19waXBlID8gcGNsb3NlKHJzbS0+RikgOiBmY2xvc2UocnNtLT5GKTsKKwkJCQkJZnJlZShyc20tPmJ1ZmZlcik7CisJCQkJCWhhc2hfcmVtb3ZlKGZkaGFzaCwgTC5zKTsKKwkJCQl9CisJCQkJaWYgKGVycikKKwkJCQkJc2V0dmFyX2koaW50dmFyW0VSUk5PXSwgZXJybm8pOworCQkJCVJfZCA9IChkb3VibGUpZXJyOworCQkJCWJyZWFrOworCQkJfQorCQkJfSAvKiBzd2l0Y2ggKi8KKwkJCXNldHZhcl9pKHJlcywgUl9kKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBYQyggT0NfQlVJTFRJTiApOgorCQkJcmVzID0gZXhlY19idWlsdGluKG9wLCByZXMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfU1BSSU5URiApOgorCQkJc2V0dmFyX3AocmVzLCBhd2tfcHJpbnRmKG9wMSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfVU5BUlkgKTogeworCQkJZG91YmxlIExkLCBSX2Q7CisKKwkJCUxkID0gUl9kID0gZ2V0dmFyX2koUi52KTsKKwkJCXN3aXRjaCAob3BuKSB7CisJCQljYXNlICdQJzoKKwkJCQlMZCA9ICsrUl9kOworCQkJCWdvdG8gcl9vcF9jaGFuZ2U7CisJCQljYXNlICdwJzoKKwkJCQlSX2QrKzsKKwkJCQlnb3RvIHJfb3BfY2hhbmdlOworCQkJY2FzZSAnTSc6CisJCQkJTGQgPSAtLVJfZDsKKwkJCQlnb3RvIHJfb3BfY2hhbmdlOworCQkJY2FzZSAnbSc6CisJCQkJUl9kLS07Cisgcl9vcF9jaGFuZ2U6CisJCQkJc2V0dmFyX2koUi52LCBSX2QpOworCQkJCWJyZWFrOworCQkJY2FzZSAnISc6CisJCQkJTGQgPSAhaXN0cnVlKFIudik7CisJCQkJYnJlYWs7CisJCQljYXNlICctJzoKKwkJCQlMZCA9IC1SX2Q7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZXR2YXJfaShyZXMsIExkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBYQyggT0NfRklFTEQgKTogeworCQkJaW50IGkgPSAoaW50KWdldHZhcl9pKFIudik7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJcmVzID0gaW50dmFyW0YwXTsKKwkJCX0gZWxzZSB7CisJCQkJc3BsaXRfZjAoKTsKKwkJCQlpZiAoaSA+IG5maWVsZHMpCisJCQkJCWZzcmVhbGxvYyhpKTsKKwkJCQlyZXMgPSAmRmllbGRzW2kgLSAxXTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogY29uY2F0ZW5hdGlvbiAoIiAiKSBhbmQgaW5kZXggam9pbmluZyAoIiwiKSAqLworCQljYXNlIFhDKCBPQ19DT05DQVQgKToKKwkJY2FzZSBYQyggT0NfQ09NTUEgKTogeworCQkJY29uc3QgY2hhciAqc2VwID0gIiI7CisJCQlpZiAoKG9waW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfQ09NTUEpCisJCQkJc2VwID0gZ2V0dmFyX3MoaW50dmFyW1NVQlNFUF0pOworCQkJc2V0dmFyX3AocmVzLCB4YXNwcmludGYoIiVzJXMlcyIsIEwucywgc2VwLCBSLnMpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBYQyggT0NfTEFORCApOgorCQkJc2V0dmFyX2kocmVzLCBpc3RydWUoTC52KSA/IHB0ZXN0KG9wLT5yLm4pIDogMCk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19MT1IgKToKKwkJCXNldHZhcl9pKHJlcywgaXN0cnVlKEwudikgPyAxIDogcHRlc3Qob3AtPnIubikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfQklOQVJZICk6CisJCWNhc2UgWEMoIE9DX1JFUExBQ0UgKTogeworCQkJZG91YmxlIFJfZCA9IGdldHZhcl9pKFIudik7CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiQklOQVJZL1JFUExBQ0U6IFJfZDolZiBvcG46JWNcbiIsIFJfZCwgb3BuKTsKKwkJCXN3aXRjaCAob3BuKSB7CisJCQljYXNlICcrJzoKKwkJCQlMX2QgKz0gUl9kOworCQkJCWJyZWFrOworCQkJY2FzZSAnLSc6CisJCQkJTF9kIC09IFJfZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyonOgorCQkJCUxfZCAqPSBSX2Q7CisJCQkJYnJlYWs7CisJCQljYXNlICcvJzoKKwkJCQlpZiAoUl9kID09IDApCisJCQkJCXN5bnRheF9lcnJvcihFTVNHX0RJVl9CWV9aRVJPKTsKKwkJCQlMX2QgLz0gUl9kOworCQkJCWJyZWFrOworCQkJY2FzZSAnJic6CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0FXS19MSUJNKQorCQkJCQlMX2QgPSBwb3coTF9kLCBSX2QpOworCQkJCWVsc2UKKwkJCQkJc3ludGF4X2Vycm9yKEVNU0dfTk9fTUFUSCk7CisJCQkJYnJlYWs7CisJCQljYXNlICclJzoKKwkJCQlpZiAoUl9kID09IDApCisJCQkJCXN5bnRheF9lcnJvcihFTVNHX0RJVl9CWV9aRVJPKTsKKwkJCQlMX2QgLT0gKGludCkoTF9kIC8gUl9kKSAqIFJfZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJCSU5BUlkvUkVQTEFDRSByZXN1bHQ6JWZcbiIsIExfZCk7CisJCQlyZXMgPSBzZXR2YXJfaSgoKG9waW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfQklOQVJZKSA/IHJlcyA6IEwudiwgTF9kKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBYQyggT0NfQ09NUEFSRSApOiB7CisJCQlpbnQgaSA9IGk7IC8qIGZvciBjb21waWxlciAqLworCQkJZG91YmxlIExkOworCisJCQlpZiAoaXNfbnVtZXJpYyhMLnYpICYmIGlzX251bWVyaWMoUi52KSkgeworCQkJCUxkID0gZ2V0dmFyX2koTC52KSAtIGdldHZhcl9pKFIudik7CisJCQl9IGVsc2UgeworCQkJCWNvbnN0IGNoYXIgKmwgPSBnZXR2YXJfcyhMLnYpOworCQkJCWNvbnN0IGNoYXIgKnIgPSBnZXR2YXJfcyhSLnYpOworCQkJCUxkID0gaWNhc2UgPyBzdHJjYXNlY21wKGwsIHIpIDogc3RyY21wKGwsIHIpOworCQkJfQorCQkJc3dpdGNoIChvcG4gJiAweGZlKSB7CisJCQljYXNlIDA6CisJCQkJaSA9IChMZCA+IDApOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWkgPSAoTGQgPj0gMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJaSA9IChMZCA9PSAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNldHZhcl9pKHJlcywgKGkgPT0gMCkgXiAob3BuICYgMSkpOworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQkJc3ludGF4X2Vycm9yKEVNU0dfUE9TU0lCTEVfRVJST1IpOworCQl9CisJCWlmICgob3BpbmZvICYgT1BDTFNNQVNLKSA8PSBTSElGVF9USUxfVEhJUykKKwkJCW9wID0gb3AtPmEubjsKKwkJaWYgKChvcGluZm8gJiBPUENMU01BU0spID49IFJFQ1VSX0ZST01fVEhJUykKKwkJCWJyZWFrOworCQlpZiAobmV4dHJlYykKKwkJCWJyZWFrOworCX0gLyogd2hpbGUgKG9wKSAqLworCisJbnZmcmVlKHYxKTsKKwlkZWJ1Z19wcmludGZfZXZhbCgicmV0dXJuaW5nIGZyb20gJXMoKTogJXBcbiIsIF9fZnVuY19fLCByZXMpOworCXJldHVybiByZXM7CisjdW5kZWYgZm5hcmdzCisjdW5kZWYgc2VlZAorI3VuZGVmIHNyZWcKK30KKworCisvKiAtLS0tLS0tLSBtYWluICYgY28uIC0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYXdrX2V4aXQoaW50IHIpCit7CisJdmFyIHR2OworCXVuc2lnbmVkIGk7CisJaGFzaF9pdGVtICpoaTsKKworCXplcm9fb3V0X3ZhcigmdHYpOworCisJaWYgKCFleGl0aW5nKSB7CisJCWV4aXRpbmcgPSBUUlVFOworCQluZXh0cmVjID0gRkFMU0U7CisJCWV2YWx1YXRlKGVuZHNlcS5maXJzdCwgJnR2KTsKKwl9CisKKwkvKiB3YWl0aW5nIGZvciBjaGlsZHJlbiAqLworCWZvciAoaSA9IDA7IGkgPCBmZGhhc2gtPmNzaXplOyBpKyspIHsKKwkJaGkgPSBmZGhhc2gtPml0ZW1zW2ldOworCQl3aGlsZSAoaGkpIHsKKwkJCWlmIChoaS0+ZGF0YS5ycy5GICYmIGhpLT5kYXRhLnJzLmlzX3BpcGUpCisJCQkJcGNsb3NlKGhpLT5kYXRhLnJzLkYpOworCQkJaGkgPSBoaS0+bmV4dDsKKwkJfQorCX0KKworCWV4aXQocik7Cit9CisKKy8qIGlmIGV4cHIgbG9va3MgbGlrZSAidmFyPXZhbHVlIiwgcGVyZm9ybSBhc3NpZ25tZW50IGFuZCByZXR1cm4gMSwKKyAqIG90aGVyd2lzZSByZXR1cm4gMCAqLworc3RhdGljIGludCBpc19hc3NpZ25tZW50KGNvbnN0IGNoYXIgKmV4cHIpCit7CisJY2hhciAqZXhwcmMsICp2YWwsICpzLCAqczE7CisKKwlpZiAoIWlzYWxudW1fKCpleHByKSB8fCAodmFsID0gc3RyY2hyKGV4cHIsICc9JykpID09IE5VTEwpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWV4cHJjID0geHN0cmR1cChleHByKTsKKwl2YWwgPSBleHByYyArICh2YWwgLSBleHByKTsKKwkqdmFsKysgPSAnXDAnOworCisJcyA9IHMxID0gdmFsOworCXdoaWxlICgoKnMxID0gbmV4dGNoYXIoJnMpKSAhPSAnXDAnKQorCQlzMSsrOworCisJc2V0dmFyX3UobmV3dmFyKGV4cHJjKSwgdmFsKTsKKwlmcmVlKGV4cHJjKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyogc3dpdGNoIHRvIG5leHQgaW5wdXQgZmlsZSAqLworc3RhdGljIHJzdHJlYW0gKm5leHRfaW5wdXRfZmlsZSh2b2lkKQoreworI2RlZmluZSByc20gICAgICAgICAgKEcubmV4dF9pbnB1dF9maWxlX19yc20pCisjZGVmaW5lIGZpbGVzX2hhcHBlbiAoRy5uZXh0X2lucHV0X2ZpbGVfX2ZpbGVzX2hhcHBlbikKKworCUZJTEUgKkYgPSBOVUxMOworCWNvbnN0IGNoYXIgKmZuYW1lLCAqaW5kOworCisJaWYgKHJzbS5GKQorCQlmY2xvc2UocnNtLkYpOworCXJzbS5GID0gTlVMTDsKKwlyc20ucG9zID0gcnNtLmFkdiA9IDA7CisKKwlkbyB7CisJCWlmIChnZXR2YXJfaShpbnR2YXJbQVJHSU5EXSkrMSA+PSBnZXR2YXJfaShpbnR2YXJbQVJHQ10pKSB7CisJCQlpZiAoZmlsZXNfaGFwcGVuKQorCQkJCXJldHVybiBOVUxMOworCQkJZm5hbWUgPSAiLSI7CisJCQlGID0gc3RkaW47CisJCX0gZWxzZSB7CisJCQlpbmQgPSBnZXR2YXJfcyhpbmN2YXIoaW50dmFyW0FSR0lORF0pKTsKKwkJCWZuYW1lID0gZ2V0dmFyX3MoZmluZHZhcihpYW1hcnJheShpbnR2YXJbQVJHVl0pLCBpbmQpKTsKKwkJCWlmIChmbmFtZSAmJiAqZm5hbWUgJiYgIWlzX2Fzc2lnbm1lbnQoZm5hbWUpKQorCQkJCUYgPSB4Zm9wZW5fc3RkaW4oZm5hbWUpOworCQl9CisJfSB3aGlsZSAoIUYpOworCisJZmlsZXNfaGFwcGVuID0gVFJVRTsKKwlzZXR2YXJfcyhpbnR2YXJbRklMRU5BTUVdLCBmbmFtZSk7CisJcnNtLkYgPSBGOworCXJldHVybiAmcnNtOworI3VuZGVmIHJzbQorI3VuZGVmIGZpbGVzX2hhcHBlbgorfQorCitpbnQgYXdrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhd2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWNoYXIgKm9wdF9GLCAqb3B0X1c7CisJbGxpc3RfdCAqbGlzdF92ID0gTlVMTDsKKwlsbGlzdF90ICpsaXN0X2YgPSBOVUxMOworCWludCBpLCBqOworCXZhciAqdjsKKwl2YXIgdHY7CisJY2hhciAqKmVudnA7CisJY2hhciAqdm5hbWVzID0gKGNoYXIgKil2TmFtZXM7IC8qIGNoZWF0ICovCisJY2hhciAqdnZhbHVlcyA9IChjaGFyICopdlZhbHVlczsKKworCUlOSVRfRygpOworCisJLyogVW5kbyBidXN5Ym94LmMsIG9yIGVsc2Ugc3RydG9kIG1heSBlYXQgJywnISBUaGlzIGJyZWFrcyBwYXJzaW5nOgorCSAqICQxLCQyID09ICckMSwnICckMicsIE5PVCAnJDEnICcsJyAnJDInICovCisJaWYgKEVOQUJMRV9MT0NBTEVfU1VQUE9SVCkKKwkJc2V0bG9jYWxlKExDX05VTUVSSUMsICJDIik7CisKKwl6ZXJvX291dF92YXIoJnR2KTsKKworCS8qIGFsbG9jYXRlIGdsb2JhbCBidWZmZXIgKi8KKwlnX2J1ZiA9IHhtYWxsb2MoTUFYVkFSRk1UICsgMSk7CisKKwl2aGFzaCA9IGhhc2hfaW5pdCgpOworCWFoYXNoID0gaGFzaF9pbml0KCk7CisJZmRoYXNoID0gaGFzaF9pbml0KCk7CisJZm5oYXNoID0gaGFzaF9pbml0KCk7CisKKwkvKiBpbml0aWFsaXplIHZhcmlhYmxlcyAqLworCWZvciAoaSA9IDA7ICp2bmFtZXM7IGkrKykgeworCQlpbnR2YXJbaV0gPSB2ID0gbmV3dmFyKG5leHR3b3JkKCZ2bmFtZXMpKTsKKwkJaWYgKCp2dmFsdWVzICE9ICdcMzc3JykKKwkJCXNldHZhcl9zKHYsIG5leHR3b3JkKCZ2dmFsdWVzKSk7CisJCWVsc2UKKwkJCXNldHZhcl9pKHYsIDApOworCisJCWlmICgqdm5hbWVzID09ICcqJykgeworCQkJdi0+dHlwZSB8PSBWRl9TUEVDSUFMOworCQkJdm5hbWVzKys7CisJCX0KKwl9CisKKwloYW5kbGVfc3BlY2lhbChpbnR2YXJbRlNdKTsKKwloYW5kbGVfc3BlY2lhbChpbnR2YXJbUlNdKTsKKworCW5ld2ZpbGUoIi9kZXYvc3RkaW4iKS0+RiA9IHN0ZGluOworCW5ld2ZpbGUoIi9kZXYvc3Rkb3V0IiktPkYgPSBzdGRvdXQ7CisJbmV3ZmlsZSgiL2Rldi9zdGRlcnIiKS0+RiA9IHN0ZGVycjsKKworCS8qIEh1aCwgcGVvcGxlIHJlcG9ydCB0aGF0IHNvbWV0aW1lcyBlbnZpcm9uIGlzIE5VTEwuIE9oIHdlbGwuICovCisJaWYgKGVudmlyb24pIGZvciAoZW52cCA9IGVudmlyb247ICplbnZwOyBlbnZwKyspIHsKKwkJLyogZW52aXJvbiBpcyB3cml0YWJsZSwgdGh1cyB3ZSBkb24ndCBzdHJkdXAgaXQgbmVlZGxlc3NseSAqLworCQljaGFyICpzID0gKmVudnA7CisJCWNoYXIgKnMxID0gc3RyY2hyKHMsICc9Jyk7CisJCWlmIChzMSkgeworCQkJKnMxID0gJ1wwJzsKKwkJCS8qIEJvdGggZmluZHZhciBhbmQgc2V0dmFyX3UgdGFrZSBjb25zdCBjaGFyKgorCQkJICogYXMgMm5kIGFyZyAtPiBlbnZpcm9ubWVudCBpcyBub3QgdHJhc2hlZCAqLworCQkJc2V0dmFyX3UoZmluZHZhcihpYW1hcnJheShpbnR2YXJbRU5WSVJPTl0pLCBzKSwgczEgKyAxKTsKKwkJCSpzMSA9ICc9JzsKKwkJfQorCX0KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ2OjpmOjoiOyAvKiAtdiBhbmQgLWYgY2FuIG9jY3VyIG11bHRpcGxlIHRpbWVzICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIkY6djpmOlc6IiwgJm9wdF9GLCAmbGlzdF92LCAmbGlzdF9mLCAmb3B0X1cpOworCWFyZ3YgKz0gb3B0aW5kOworCWFyZ2MgLT0gb3B0aW5kOworCWlmIChvcHQgJiAweDEpCisJCXNldHZhcl9zKGludHZhcltGU10sIG9wdF9GKTsgLy8gLUYKKwl3aGlsZSAobGlzdF92KSB7IC8qIC12ICovCisJCWlmICghaXNfYXNzaWdubWVudChsbGlzdF9wb3AoJmxpc3RfdikpKQorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKwlpZiAobGlzdF9mKSB7IC8qIC1mICovCisJCWRvIHsKKwkJCWNoYXIgKnMgPSBOVUxMOworCQkJRklMRSAqZnJvbV9maWxlOworCisJCQlnX3Byb2duYW1lID0gbGxpc3RfcG9wKCZsaXN0X2YpOworCQkJZnJvbV9maWxlID0geGZvcGVuX3N0ZGluKGdfcHJvZ25hbWUpOworCQkJLyogb25lIGJ5dGUgaXMgcmVzZXJ2ZWQgZm9yIHNvbWUgdHJpY2sgaW4gbmV4dF90b2tlbiAqLworCQkJZm9yIChpID0gaiA9IDE7IGogPiAwOyBpICs9IGopIHsKKwkJCQlzID0geHJlYWxsb2MocywgaSArIDQwOTYpOworCQkJCWogPSBmcmVhZChzICsgaSwgMSwgNDA5NCwgZnJvbV9maWxlKTsKKwkJCX0KKwkJCXNbaV0gPSAnXDAnOworCQkJZmNsb3NlKGZyb21fZmlsZSk7CisJCQlwYXJzZV9wcm9ncmFtKHMgKyAxKTsKKwkJCWZyZWUocyk7CisJCX0gd2hpbGUgKGxpc3RfZik7CisJCWFyZ2MrKzsKKwl9IGVsc2UgeyAvLyBubyAtZjogdGFrZSBwcm9ncmFtIGZyb20gMXN0IHBhcmFtZXRlcgorCQlpZiAoIWFyZ2MpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWdfcHJvZ25hbWUgPSAiY21kLiBsaW5lIjsKKwkJcGFyc2VfcHJvZ3JhbSgqYXJndisrKTsKKwl9CisJaWYgKG9wdCAmIDB4OCkgLy8gLVcKKwkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiB1bnJlY29nbml6ZWQgb3B0aW9uICctVyAlcycgaWdub3JlZCIsIG9wdF9XKTsKKworCS8qIGZpbGwgaW4gQVJHViBhcnJheSAqLworCXNldHZhcl9pKGludHZhcltBUkdDXSwgYXJnYyk7CisJc2V0YXJpX3UoaW50dmFyW0FSR1ZdLCAwLCAiYXdrIik7CisJaSA9IDA7CisJd2hpbGUgKCphcmd2KQorCQlzZXRhcmlfdShpbnR2YXJbQVJHVl0sICsraSwgKmFyZ3YrKyk7CisKKwlldmFsdWF0ZShiZWdpbnNlcS5maXJzdCwgJnR2KTsKKwlpZiAoIW1haW5zZXEuZmlyc3QgJiYgIWVuZHNlcS5maXJzdCkKKwkJYXdrX2V4aXQoRVhJVF9TVUNDRVNTKTsKKworCS8qIGlucHV0IGZpbGUgY291bGQgYWxyZWFkeSBiZSBvcGVuZWQgaW4gQkVHSU4gYmxvY2sgKi8KKwlpZiAoIWlGKQorCQlpRiA9IG5leHRfaW5wdXRfZmlsZSgpOworCisJLyogcGFzc2luZyB0aHJvdWdoIGlucHV0IGZpbGVzICovCisJd2hpbGUgKGlGKSB7CisJCW5leHRmaWxlID0gRkFMU0U7CisJCXNldHZhcl9pKGludHZhcltGTlJdLCAwKTsKKworCQl3aGlsZSAoKGkgPSBhd2tfZ2V0bGluZShpRiwgaW50dmFyW0YwXSkpID4gMCkgeworCQkJbmV4dHJlYyA9IEZBTFNFOworCQkJaW5jdmFyKGludHZhcltOUl0pOworCQkJaW5jdmFyKGludHZhcltGTlJdKTsKKwkJCWV2YWx1YXRlKG1haW5zZXEuZmlyc3QsICZ0dik7CisKKwkJCWlmIChuZXh0ZmlsZSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgMCkKKwkJCXN5bnRheF9lcnJvcihzdHJlcnJvcihlcnJubykpOworCisJCWlGID0gbmV4dF9pbnB1dF9maWxlKCk7CisJfQorCisJYXdrX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkvKnJldHVybiAwOyovCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lZGl0b3JzL2NtcC5jIGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU2Yjk3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9jbXAuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjbXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSBieSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgKHZpcnR1YWxseSkgY29tcGxpYW50IC0tIHVzZXMgbmljZXIgR05VIGZvcm1hdCBmb3IgLWwuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NtcC5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSBjbXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbF0gWy1zXSBGSUxFMSBbRklMRTIiIElGX0RFU0tUT1AoIiBbU0tJUDEgW1NLSVAyXV0iKSAiXSIKKy8vdXNhZ2U6I2RlZmluZSBjbXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21wYXJlIEZJTEUxIHdpdGggRklMRTIgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktbAlXcml0ZSB0aGUgYnl0ZSBudW1iZXJzIChkZWNpbWFsKSBhbmQgdmFsdWVzIChvY3RhbCkiCisvL3VzYWdlOiAgICAgIlxuCQlmb3IgYWxsIGRpZmZlcmluZyBieXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJUXVpZXQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBmbXRfZW9mW10gQUxJR04xID0gImNtcDogRU9GIG9uICVzXG4iOworc3RhdGljIGNvbnN0IGNoYXIgZm10X2RpZmZlcltdIEFMSUdOMSA9ICIlcyAlcyBkaWZmZXI6IGNoYXIgJSJPRkZfRk1UInUsIGxpbmUgJXVcbiI7CisvLyBUaGlzIGZtdF9sX29wdCB1c2VzIGdudS1pc21zLiAgU1VTdjMgd291bGQgYmUgIiUuMHMlLjBzJSJPRkZfRk1UInUgJW8gJW9cbiIKK3N0YXRpYyBjb25zdCBjaGFyIGZtdF9sX29wdFtdIEFMSUdOMSA9ICIlLjBzJS4wcyUiT0ZGX0ZNVCJ1ICUzbyAlM29cbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIG9wdF9jaGFyc1tdIEFMSUdOMSA9ICJzbCI7CisjZGVmaW5lIENNUF9PUFRfcyAoMTw8MCkKKyNkZWZpbmUgQ01QX09QVF9sICgxPDwxKQorCitpbnQgY21wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjbXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUZJTEUgKmZwMSwgKmZwMiwgKm91dGZpbGUgPSBzdGRvdXQ7CisJY29uc3QgY2hhciAqZmlsZW5hbWUxLCAqZmlsZW5hbWUyID0gIi0iOworCW9mZl90IHNraXAxID0gMCwgc2tpcDIgPSAwLCBjaGFyX3BvcyA9IDA7CisJaW50IGxpbmVfcG9zID0gMTsgLyogSG9wZWZ1bGx5IHdvbid0IG92ZXJmbG93Li4uICovCisJY29uc3QgY2hhciAqZm10OworCWludCBjMSwgYzI7CisJdW5zaWduZWQgb3B0OworCWludCByZXR2YWwgPSAwOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiCisJCQlJRl9ERVNLVE9QKCI6PzQiKQorCQkJSUZfTk9UX0RFU0tUT1AoIjo/MiIpCisJCQkiOmwtLXM6cy0tbCI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgb3B0X2NoYXJzKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWZpbGVuYW1lMSA9ICphcmd2OworCWlmICgqKythcmd2KSB7CisJCWZpbGVuYW1lMiA9ICphcmd2OworCQlpZiAoRU5BQkxFX0RFU0tUT1AgJiYgKisrYXJndikgeworCQkJc2tpcDEgPSBYQVRPT0ZGKCphcmd2KTsKKwkJCWlmICgqKythcmd2KSB7CisJCQkJc2tpcDIgPSBYQVRPT0ZGKCphcmd2KTsKKwkJCX0KKwkJfQorCX0KKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7ICAvKiBtaXNzaW5nIGZpbGUgcmVzdWx0cyBpbiBleGl0Y29kZSAyICovCisJaWYgKG9wdCAmIENNUF9PUFRfcykKKwkJbG9nbW9kZSA9IDA7ICAvKiAtcyBzdXBwcmVzc2VzIG9wZW4gZXJyb3IgbWVzc2FnZXMgKi8KKwlmcDEgPSB4Zm9wZW5fc3RkaW4oZmlsZW5hbWUxKTsKKwlmcDIgPSB4Zm9wZW5fc3RkaW4oZmlsZW5hbWUyKTsKKwlpZiAoZnAxID09IGZwMikgewkJLyogUGFyYW5vaWEgY2hlY2suLi4gc3RkaW4gPT0gc3RkaW4/ICovCisJCS8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgcmVhZGluZyBzdGRpbi4gIE5laXRoZXIgZG9lcyBnbnUgd2MuCisJCSAqIEJ1dCBwZXJoYXBzIHdlIHNob3VsZCwgc28gdGhhdCBvdGhlciBhcHBzIGRvd24gdGhlIGNoYWluIGRvbid0CisJCSAqIGdldCB0aGUgaW5wdXQuICBDb25zaWRlciAnZWNobyBoZWxsbyB8IChjbXAgLSAtICYmIGNhdCAtKScuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisJbG9nbW9kZSA9IExPR01PREVfU1RESU87CisKKwlpZiAob3B0ICYgQ01QX09QVF9sKQorCQlmbXQgPSBmbXRfbF9vcHQ7CisJZWxzZQorCQlmbXQgPSBmbXRfZGlmZmVyOworCisJaWYgKEVOQUJMRV9ERVNLVE9QKSB7CisJCXdoaWxlIChza2lwMSkgeyBnZXRjKGZwMSk7IHNraXAxLS07IH0KKwkJd2hpbGUgKHNraXAyKSB7IGdldGMoZnAyKTsgc2tpcDItLTsgfQorCX0KKwlkbyB7CisJCWMxID0gZ2V0YyhmcDEpOworCQljMiA9IGdldGMoZnAyKTsKKwkJKytjaGFyX3BvczsKKwkJaWYgKGMxICE9IGMyKSB7CQkJLyogUmVtZW1iZXI6IGEgcmVhZCBlcnJvciBtYXkgaGF2ZSBvY2N1cnJlZC4gKi8KKwkJCXJldHZhbCA9IDE7CQkvKiBCdXQgYXNzdW1lIHRoZSBmaWxlcyBhcmUgZGlmZmVyZW50IGZvciBub3cuICovCisJCQlpZiAoYzIgPT0gRU9GKSB7CisJCQkJLyogV2Uga25vdyB0aGF0IGZwMSBpc24ndCBhdCBFT0Ygb3IgaW4gYW4gZXJyb3Igc3RhdGUuICBCdXQgdG8KKwkJCQkgKiBzYXZlIHNwYWNlIGJlbG93LCB0aGluZ3MgYXJlIHNldHVwIHRvIGV4cGVjdCBhbiBFT0YgaW4gZnAxCisJCQkJICogaWYgYW4gRU9GIG9jY3VycmVkLiAgU28sIHN3YXAgdGhpbmdzIGFyb3VuZC4KKwkJCQkgKi8KKwkJCQlmcDEgPSBmcDI7CisJCQkJZmlsZW5hbWUxID0gZmlsZW5hbWUyOworCQkJCWMxID0gYzI7CisJCQl9CisJCQlpZiAoYzEgPT0gRU9GKSB7CisJCQkJZGllX2lmX2ZlcnJvcihmcDEsIGZpbGVuYW1lMSk7CisJCQkJZm10ID0gZm10X2VvZjsJLyogV2VsbCwgbm8gZXJyb3IsIHNvIGl0IG11c3QgcmVhbGx5IGJlIEVPRi4gKi8KKwkJCQlvdXRmaWxlID0gc3RkZXJyOworCQkJCS8qIFRoZXJlIG1heSBoYXZlIGJlZW4gb3V0cHV0IHRvIHN0ZG91dCAob3B0aW9uIC1sKSwgc28KKwkJCQkgKiBtYWtlIHN1cmUgd2UgZmZsdXNoIGJlZm9yZSB3cml0aW5nIHRvIHN0ZGVyci4gKi8KKwkJCQlmZmx1c2hfYWxsKCk7CisJCQl9CisJCQlpZiAoIShvcHQgJiBDTVBfT1BUX3MpKSB7CisJCQkJaWYgKG9wdCAmIENNUF9PUFRfbCkgeworCQkJCQlsaW5lX3BvcyA9IGMxOwkvKiBsaW5lX3BvcyBpcyB1bnVzZWQgaW4gdGhlIC1sIGNhc2UuICovCisJCQkJfQorCQkJCWZwcmludGYob3V0ZmlsZSwgZm10LCBmaWxlbmFtZTEsIGZpbGVuYW1lMiwgY2hhcl9wb3MsIGxpbmVfcG9zLCBjMik7CisJCQkJaWYgKG9wdCkgewkvKiBUaGlzIG11c3QgYmUgLWwgc2luY2Ugbm90IC1zLiAqLworCQkJCQkvKiBJZiB3ZSBlbmNvdW50ZXJlZCBhbiBFT0YsCisJCQkJCSAqIHRoZSB3aGlsZSBjaGVjayB3aWxsIGNhdGNoIGl0LiAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlpZiAoYzEgPT0gJ1xuJykgeworCQkJKytsaW5lX3BvczsKKwkJfQorCX0gd2hpbGUgKGMxICE9IEVPRik7CisKKwlkaWVfaWZfZmVycm9yKGZwMSwgZmlsZW5hbWUxKTsKKwlkaWVfaWZfZmVycm9yKGZwMiwgZmlsZW5hbWUyKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQocmV0dmFsKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvZGlmZi5jIGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzMzM0NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvZGlmZi5jCkBAIC0wLDAgKzEsMTAyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBkaWZmIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94LCBhZGFwdGVkIGZyb20gT3BlbkJTRCBkaWZmLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBieSBNYXRoZXVzIEl6dmVrb3YgPG1penZla292QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBSb2JlcnQgU3VsbGl2YW4gPGNvZ2l0by5lcmdvLmNvZ2l0b0Bob3RtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwMyBUb2RkIEMuIE1pbGxlciA8VG9kZC5NaWxsZXJAY291cnRlc2FuLmNvbT4KKyAqCisgKiBTcG9uc29yZWQgaW4gcGFydCBieSB0aGUgRGVmZW5zZSBBZHZhbmNlZCBSZXNlYXJjaCBQcm9qZWN0cworICogQWdlbmN5IChEQVJQQSkgYW5kIEFpciBGb3JjZSBSZXNlYXJjaCBMYWJvcmF0b3J5LCBBaXIgRm9yY2UKKyAqIE1hdGVyaWVsIENvbW1hbmQsIFVTQUYsIHVuZGVyIGFncmVlbWVudCBudW1iZXIgRjM5NTAyLTk5LTEtMDUxMi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgdXNlcyBhbiBhbGdvcml0aG0gZHVlIHRvIEhhcm9sZCBTdG9uZSwKKyAqIHdoaWNoIGZpbmRzIGEgcGFpciBvZiBsb25nZXN0IGlkZW50aWNhbCBzdWJzZXF1ZW5jZXMgaW4KKyAqIHRoZSB0d28gZmlsZXMuCisgKgorICogVGhlIG1ham9yIGdvYWwgaXMgdG8gZ2VuZXJhdGUgdGhlIG1hdGNoIHZlY3RvciBKLgorICogSltpXSBpcyB0aGUgaW5kZXggb2YgdGhlIGxpbmUgaW4gZmlsZTEgY29ycmVzcG9uZGluZworICogdG8gbGluZSBpIGluIGZpbGUwLiBKW2ldID0gMCBpZiB0aGVyZSBpcyBubworICogc3VjaCBsaW5lIGluIGZpbGUxLgorICoKKyAqIExpbmVzIGFyZSBoYXNoZWQgc28gYXMgdG8gd29yayBpbiBjb3JlLiBBbGwgcG90ZW50aWFsCisgKiBtYXRjaGVzIGFyZSBsb2NhdGVkIGJ5IHNvcnRpbmcgdGhlIGxpbmVzIG9mIGVhY2ggZmlsZQorICogb24gdGhlIGhhc2ggKGNhbGxlZCAidmFsdWUiKS4gSW4gcGFydGljdWxhciwgdGhpcworICogY29sbGVjdHMgdGhlIGVxdWl2YWxlbmNlIGNsYXNzZXMgaW4gZmlsZTEgdG9nZXRoZXIuCisgKiBTdWJyb3V0aW5lIGVxdWl2IHJlcGxhY2VzIHRoZSB2YWx1ZSBvZiBlYWNoIGxpbmUgaW4KKyAqIGZpbGUwIGJ5IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBpdHMKKyAqIG1hdGNoaW5nIGVxdWl2YWxlbmNlIGluICh0aGUgcmVvcmRlcmVkKSBmaWxlMS4KKyAqIFRvIHNhdmUgc3BhY2UgZXF1aXYgc3F1ZWV6ZXMgZmlsZTEgaW50byBhIHNpbmdsZQorICogYXJyYXkgbWVtYmVyIGluIHdoaWNoIHRoZSBlcXVpdmFsZW5jZSBjbGFzc2VzCisgKiBhcmUgc2ltcGx5IGNvbmNhdGVuYXRlZCwgZXhjZXB0IHRoYXQgdGhlaXIgZmlyc3QKKyAqIG1lbWJlcnMgYXJlIGZsYWdnZWQgYnkgY2hhbmdpbmcgc2lnbi4KKyAqCisgKiBOZXh0IHRoZSBpbmRpY2VzIHRoYXQgcG9pbnQgaW50byBtZW1iZXIgYXJlIHVuc29ydGVkIGludG8KKyAqIGFycmF5IGNsYXNzIGFjY29yZGluZyB0byB0aGUgb3JpZ2luYWwgb3JkZXIgb2YgZmlsZTAuCisgKgorICogVGhlIGNsZXZlcm5lc3MgbGllcyBpbiByb3V0aW5lIHN0b25lLiBUaGlzIG1hcmNoZXMKKyAqIHRocm91Z2ggdGhlIGxpbmVzIG9mIGZpbGUwLCBkZXZlbG9waW5nIGEgdmVjdG9yIGtsaXN0CisgKiBvZiAiay1jYW5kaWRhdGVzIi4gQXQgc3RlcCBpIGEgay1jYW5kaWRhdGUgaXMgYSBtYXRjaGVkCisgKiBwYWlyIG9mIGxpbmVzIHgseSAoeCBpbiBmaWxlMCwgeSBpbiBmaWxlMSkgc3VjaCB0aGF0CisgKiB0aGVyZSBpcyBhIGNvbW1vbiBzdWJzZXF1ZW5jZSBvZiBsZW5ndGggaworICogYmV0d2VlbiB0aGUgZmlyc3QgaSBsaW5lcyBvZiBmaWxlMCBhbmQgdGhlIGZpcnN0IHkKKyAqIGxpbmVzIG9mIGZpbGUxLCBidXQgdGhlcmUgaXMgbm8gc3VjaCBzdWJzZXF1ZW5jZSBmb3IKKyAqIGFueSBzbWFsbGVyIHkuIHggaXMgdGhlIGVhcmxpZXN0IHBvc3NpYmxlIG1hdGUgdG8geQorICogdGhhdCBvY2N1cnMgaW4gc3VjaCBhIHN1YnNlcXVlbmNlLgorICoKKyAqIFdoZW5ldmVyIGFueSBvZiB0aGUgbWVtYmVycyBvZiB0aGUgZXF1aXZhbGVuY2UgY2xhc3Mgb2YKKyAqIGxpbmVzIGluIGZpbGUxIG1hdGFibGUgdG8gYSBsaW5lIGluIGZpbGUwIGhhcyBzZXJpYWwgbnVtYmVyCisgKiBsZXNzIHRoYW4gdGhlIHkgb2Ygc29tZSBrLWNhbmRpZGF0ZSwgdGhhdCBrLWNhbmRpZGF0ZQorICogd2l0aCB0aGUgc21hbGxlc3Qgc3VjaCB5IGlzIHJlcGxhY2VkLiBUaGUgbmV3CisgKiBrLWNhbmRpZGF0ZSBpcyBjaGFpbmVkICh2aWEgcHJlZCkgdG8gdGhlIGN1cnJlbnQKKyAqIGstMSBjYW5kaWRhdGUgc28gdGhhdCB0aGUgYWN0dWFsIHN1YnNlcXVlbmNlIGNhbgorICogYmUgcmVjb3ZlcmVkLiBXaGVuIGEgbWVtYmVyIGhhcyBzZXJpYWwgbnVtYmVyIGdyZWF0ZXIKKyAqIHRoYXQgdGhlIHkgb2YgYWxsIGstY2FuZGlkYXRlcywgdGhlIGtsaXN0IGlzIGV4dGVuZGVkLgorICogQXQgdGhlIGVuZCwgdGhlIGxvbmdlc3Qgc3Vic2VxdWVuY2UgaXMgcHVsbGVkIG91dAorICogYW5kIHBsYWNlZCBpbiB0aGUgYXJyYXkgSiBieSB1bnJhdmVsCisgKgorICogV2l0aCBKIGluIGhhbmQsIHRoZSBtYXRjaGVzIHRoZXJlIHJlY29yZGVkIGFyZQorICogY2hlY2tlZCBhZ2FpbnN0IHJlYWxpdHkgdG8gYXNzdXJlIHRoYXQgbm8gc3B1cmlvdXMKKyAqIG1hdGNoZXMgaGF2ZSBjcmVwdCBpbiBkdWUgdG8gaGFzaGluZy4gSWYgdGhleSBoYXZlLAorICogdGhleSBhcmUgYnJva2VuLCBhbmQgImphY2twb3QiIGlzIHJlY29yZGVkLS1hIGhhcm1sZXNzCisgKiBtYXR0ZXIgZXhjZXB0IHRoYXQgYSB0cnVlIG1hdGNoIGZvciBhIHNwdXJpb3VzbHkKKyAqIG1hdGVkIGxpbmUgbWF5IG5vdyBiZSB1bm5lY2Vzc2FyaWx5IHJlcG9ydGVkIGFzIGEgY2hhbmdlLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIHByb2dyYW0gY29tZXMgc2ltcGx5CisgKiBmcm9tIHRyeWluZyB0byBtaW5pbWl6ZSBjb3JlIHV0aWxpemF0aW9uIGFuZAorICogbWF4aW1pemUgdGhlIHJhbmdlIG9mIGRvYWJsZSBwcm9ibGVtcyBieSBkeW5hbWljYWxseQorICogYWxsb2NhdGluZyB3aGF0IGlzIG5lZWRlZCBhbmQgcmV1c2luZyB3aGF0IGlzIG5vdC4KKyAqIFRoZSBjb3JlIHJlcXVpcmVtZW50cyBmb3IgcHJvYmxlbXMgbGFyZ2VyIHRoYW4gc29tZXdoYXQKKyAqIGFyZSAoaW4gd29yZHMpIDIqbGVuZ3RoKGZpbGUwKSArIGxlbmd0aChmaWxlMSkgKworICogMyoobnVtYmVyIG9mIGstY2FuZGlkYXRlcyBpbnN0YWxsZWQpLCB0eXBpY2FsbHkgYWJvdXQKKyAqIDZuIHdvcmRzIGZvciBmaWxlcyBvZiBsZW5ndGggbi4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZGlmZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hYkJkaU5xclRzdHddIFstTCBMQUJFTF0gWy1TIEZJTEVdIFstVSBMSU5FU10gRklMRTEgRklMRTIiCisvL3VzYWdlOiNkZWZpbmUgZGlmZl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbXBhcmUgZmlsZXMgbGluZSBieSBsaW5lIGFuZCBvdXRwdXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlbS5cbiIKKy8vdXNhZ2U6ICAgICAgICJUaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHVuaWZpZWQgZGlmZnMgb25seS5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJVHJlYXQgYWxsIGZpbGVzIGFzIHRleHQiCisvL3VzYWdlOiAgICAgIlxuCS1iCUlnbm9yZSBjaGFuZ2VzIGluIHRoZSBhbW91bnQgb2Ygd2hpdGVzcGFjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLUIJSWdub3JlIGNoYW5nZXMgd2hvc2UgbGluZXMgYXJlIGFsbCBibGFuayIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJVHJ5IGhhcmQgdG8gZmluZCBhIHNtYWxsZXIgc2V0IG9mIGNoYW5nZXMiCisvL3VzYWdlOiAgICAgIlxuCS1pCUlnbm9yZSBjYXNlIGRpZmZlcmVuY2VzIgorLy91c2FnZTogICAgICJcbgktTAlVc2UgTEFCRUwgaW5zdGVhZCBvZiB0aGUgZmlsZW5hbWUgaW4gdGhlIHVuaWZpZWQgaGVhZGVyIgorLy91c2FnZTogICAgICJcbgktTglUcmVhdCBhYnNlbnQgZmlsZXMgYXMgZW1wdHkiCisvL3VzYWdlOiAgICAgIlxuCS1xCU91dHB1dCBvbmx5IHdoZXRoZXIgZmlsZXMgZGlmZmVyIgorLy91c2FnZTogICAgICJcbgktcglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktUwlTdGFydCB3aXRoIEZJTEUgd2hlbiBjb21wYXJpbmcgZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxuCS1UCU1ha2UgdGFicyBsaW5lIHVwIGJ5IHByZWZpeGluZyBhIHRhYiB3aGVuIG5lY2Vzc2FyeSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJUmVwb3J0IHdoZW4gdHdvIGZpbGVzIGFyZSB0aGUgc2FtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJRXhwYW5kIHRhYnMgdG8gc3BhY2VzIGluIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLVUJT3V0cHV0IExJTkVTIGxpbmVzIG9mIGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS13CUlnbm9yZSBhbGwgd2hpdGVzcGFjZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiAwCisjIGRlZmluZSBkYmdfZXJyb3JfbXNnKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIGRiZ19lcnJvcl9tc2coLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCitlbnVtIHsgICAgICAgICAgICAgICAgICAvKiBwcmludF9zdGF0dXMoKSBhbmQgZGlmZnJlZygpIHJldHVybiB2YWx1ZXMgKi8KKwlTVEFUVVNfU0FNRSwgICAgLyogZmlsZXMgYXJlIHRoZSBzYW1lICovCisJU1RBVFVTX0RJRkZFUiwgIC8qIGZpbGVzIGRpZmZlciAqLworCVNUQVRVU19CSU5BUlksICAvKiBiaW5hcnkgZmlsZXMgZGlmZmVyICovCit9OworCitlbnVtIHsgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kbGluZSBmbGFncyAqLworCUZMQUdfYSwKKwlGTEFHX2IsCisJRkxBR19kLAorCUZMQUdfaSwKKwlGTEFHX0wsICAgICAgICAgLyogbmV2ZXIgdXNlZCwgaGFuZGxlZCBieSBnZXRvcHQzMiAqLworCUZMQUdfTiwKKwlGTEFHX3EsCisJRkxBR19yLAorCUZMQUdfcywKKwlGTEFHX1MsICAgICAgICAgLyogbmV2ZXIgdXNlZCwgaGFuZGxlZCBieSBnZXRvcHQzMiAqLworCUZMQUdfdCwKKwlGTEFHX1QsCisJRkxBR19VLCAgICAgICAgIC8qIG5ldmVyIHVzZWQsIGhhbmRsZWQgYnkgZ2V0b3B0MzIgKi8KKwlGTEFHX3csCisJRkxBR191LCAgICAgICAgIC8qIGlnbm9yZWQsIHRoaXMgaXMgdGhlIGRlZmF1bHQgKi8KKwlGTEFHX3AsICAgICAgICAgLyogbm90IGltcGxlbWVudGVkICovCisJRkxBR19CLAorCUZMQUdfRSwgICAgICAgICAvKiBub3QgaW1wbGVtZW50ZWQgKi8KK307CisjZGVmaW5lIEZMQUcoeCkgKDEgPDwgRkxBR18jI3gpCisKKy8qIFdlIGNhY2hlIGZpbGUgcG9zaXRpb24gdG8gYXZvaWQgZXhjZXNzaXZlIHNlZWtpbmcgKi8KK3R5cGVkZWYgc3RydWN0IEZJTEVfYW5kX3Bvc190IHsKKwlGSUxFICpmdF9mcDsKKwlvZmZfdCBmdF9wb3M7Cit9IEZJTEVfYW5kX3Bvc190OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc21hbGxpbnQgZXhpdF9zdGF0dXM7CisJaW50IG9wdF9VX2NvbnRleHQ7CisJY29uc3QgY2hhciAqb3RoZXJfZGlyOworCWNoYXIgKmxhYmVsWzJdOworCXN0cnVjdCBzdGF0IHN0YlsyXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgZXhpdF9zdGF0dXMgICAgICAgIChHLmV4aXRfc3RhdHVzICAgICAgICkKKyNkZWZpbmUgb3B0X1VfY29udGV4dCAgICAgIChHLm9wdF9VX2NvbnRleHQgICAgICkKKyNkZWZpbmUgbGFiZWwgICAgICAgICAgICAgIChHLmxhYmVsICAgICAgICAgICAgICkKKyNkZWZpbmUgc3RiICAgICAgICAgICAgICAgIChHLnN0YiAgICAgICAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlvcHRfVV9jb250ZXh0ID0gMzsgXAorfSB3aGlsZSAoMCkKKwordHlwZWRlZiBpbnQgdG9rZW5fdDsKKworZW51bSB7CisJLyogUHVibGljICovCisJVE9LX0VNUFRZID0gMSA8PCA5LCAgLyogTGluZSBmdWxseSBwcm9jZXNzZWQsIHlvdSBjYW4gcHJvY2VlZCB0byB0aGUgbmV4dCAqLworCVRPS19FT0YgICA9IDEgPDwgMTAsIC8qIEZpbGUgZW5kZWQgKi8KKwkvKiBQcml2YXRlIChPbmx5IHRvIGJlIHVzZWQgYnkgcmVhZF90b2tlbigpICovCisJVE9LX0VPTCAgID0gMSA8PCAxMSwgLyogd2Ugc2F3IEVPTCAoc3RpY2t5KSAqLworCVRPS19TUEFDRSA9IDEgPDwgMTIsIC8qIHVzZWQgLWIgY29kZSwgbWVhbnMgd2UgYXJlIHNraXBwaW5nIHNwYWNlcyAqLworCVNISUZUX0VPRiA9IChzaXplb2YodG9rZW5fdCkqOCAtIDgpIC0gMSwKKwlDSEFSX01BU0sgPSAweDFmZiwgICAvKiA4dGggYml0IGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggRU9GIGZyb20gMHhmZiAqLworfTsKKworLyogUmVzdG9yZXMgZnVsbCBFT0YgZnJvbSBvbmUgOHRoIGJpdDogKi8KKy8vI2RlZmluZSBUT0syQ0hBUih0KSAoKCh0KSA8PCBTSElGVF9FT0YpID4+IFNISUZUX0VPRikKKy8qIFdlIGRvbid0IHJlYWxseSBuZWVkIHRoZSBhYm92ZSwgd2Ugb25seSBuZWVkIHRvIGhhdmUgRU9GICE9IGFueV9yZWFsX2NoYXI6ICovCisjZGVmaW5lIFRPSzJDSEFSKHQpICgodCkgJiBDSEFSX01BU0spCisKK3N0YXRpYyB2b2lkIHNlZWtfZnQoRklMRV9hbmRfcG9zX3QgKmZ0LCBvZmZfdCBwb3MpCit7CisJaWYgKGZ0LT5mdF9wb3MgIT0gcG9zKSB7CisJCWZ0LT5mdF9wb3MgPSBwb3M7CisJCWZzZWVrbyhmdC0+ZnRfZnAsIHBvcywgU0VFS19TRVQpOworCX0KK30KKworLyogUmVhZHMgdG9rZW5zIGZyb20gZ2l2ZW4gZnAsIGhhbmRsaW5nIC1iIGFuZCAtdyBmbGFncworICogVGhlIHVzZXIgbXVzdCByZXNldCB0b2sgZXZlcnkgbGluZSBzdGFydAorICovCitzdGF0aWMgaW50IHJlYWRfdG9rZW4oRklMRV9hbmRfcG9zX3QgKmZ0LCB0b2tlbl90IHRvaykKK3sKKwl0b2sgfD0gVE9LX0VNUFRZOworCXdoaWxlICghKHRvayAmIFRPS19FT0wpKSB7CisJCWJvb2wgaXNfc3BhY2U7CisJCWludCB0OworCisJCXQgPSBmZ2V0YyhmdC0+ZnRfZnApOworCQlpZiAodCAhPSBFT0YpCisJCQlmdC0+ZnRfcG9zKys7CisJCWlzX3NwYWNlID0gKHQgPT0gRU9GIHx8IGlzc3BhY2UodCkpOworCisJCS8qIElmIHQgPT0gRU9GICgtMSksIHNldCBib3RoIFRPS19FT0YgYW5kIFRPS19FT0wgKi8KKwkJdG9rIHw9ICh0ICYgKFRPS19FT0YgKyBUT0tfRU9MKSk7CisJCS8qIE9ubHkgRU9MPyAqLworCQlpZiAodCA9PSAnXG4nKQorCQkJdG9rIHw9IFRPS19FT0w7CisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKGkpKSAvKiBIYW5kY29kZWQgdG9sb3dlcigpICovCisJCQl0ID0gKHQgPj0gJ0EnICYmIHQgPD0gJ1onKSA/IHQgLSAoJ0EnIC0gJ2EnKSA6IHQ7CisKKwkJaWYgKChvcHRpb25fbWFzazMyICYgRkxBRyh3KSkgJiYgaXNfc3BhY2UpCisJCQljb250aW51ZTsKKworCQkvKiBUcmltIGNoYXIgdmFsdWUgdG8gbG93IDkgYml0cyAqLworCQl0ICY9IENIQVJfTUFTSzsKKworCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUcoYikpIHsKKwkJCS8qIFdhcyBwcmV2IGNoYXIgd2hpdGVzcGFjZT8gKi8KKwkJCWlmICh0b2sgJiBUT0tfU1BBQ0UpIHsgLyogeWVzICovCisJCQkJaWYgKGlzX3NwYWNlKSAvKiB0aGlzIG9uZSB0b28sIGlnbm9yZSBpdCAqLworCQkJCQljb250aW51ZTsKKwkJCQl0b2sgJj0gflRPS19TUEFDRTsKKwkJCX0gZWxzZSBpZiAoaXNfc3BhY2UpIHsKKwkJCQkvKiAxc3Qgd2hpdGVzcGFjZSBjaGFyLgorCQkJCSAqIFNldCBUT0tfU1BBQ0UgYW5kIHJlcGxhY2UgY2hhciBieSAnICcgKi8KKwkJCQl0ID0gVE9LX1NQQUNFICsgJyAnOworCQkJfQorCQl9CisJCS8qIENsZWFyIEVNUFRZICovCisJCXRvayAmPSB+KFRPS19FTVBUWSArIENIQVJfTUFTSyk7CisJCS8qIEFzc2lnbiBjaGFyIHZhbHVlIChsb3cgOSBiaXRzKSBhbmQgbWF5YmUgc2V0IFRPS19TUEFDRSAqLworCQl0b2sgfD0gdDsKKwkJYnJlYWs7CisJfQorI2lmIDAKKwliYl9lcnJvcl9tc2coImZwOiVwIHRvazoleCAnJWMnJXMlcyVzJXMiLCBmcCwgdG9rLCB0b2sgJiAweGZmCisJCSwgdG9rICYgVE9LX0VPRiA/ICIgRU9GIiA6ICIiCisJCSwgdG9rICYgVE9LX0VPTCA/ICIgRU9MIiA6ICIiCisJCSwgdG9rICYgVE9LX0VNUFRZID8gIiBFTVBUWSIgOiAiIgorCQksIHRvayAmIFRPS19TUEFDRSA/ICIgU1BBQ0UiIDogIiIKKwkpOworI2VuZGlmCisJcmV0dXJuIHRvazsKK30KKworc3RydWN0IGNhbmQgeworCWludCB4OworCWludCB5OworCWludCBwcmVkOworfTsKKworc3RhdGljIGludCBzZWFyY2goY29uc3QgaW50ICpjLCBpbnQgaywgaW50IHksIGNvbnN0IHN0cnVjdCBjYW5kICpsaXN0KQoreworCWludCBpLCBqOworCisJaWYgKGxpc3RbY1trXV0ueSA8IHkpICAvKiBxdWljayBsb29rIGZvciB0eXBpY2FsIGNhc2UgKi8KKwkJcmV0dXJuIGsgKyAxOworCisJZm9yIChpID0gMCwgaiA9IGsgKyAxOzspIHsKKwkJY29uc3QgaW50IGwgPSAoaSArIGopID4+IDE7CisJCWlmIChsID4gaSkgeworCQkJY29uc3QgaW50IHQgPSBsaXN0W2NbbF1dLnk7CisJCQlpZiAodCA+IHkpCisJCQkJaiA9IGw7CisJCQllbHNlIGlmICh0IDwgeSkKKwkJCQlpID0gbDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gbDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gbCArIDE7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaXNxcnQodW5zaWduZWQgbikKK3sKKwl1bnNpZ25lZCB4ID0gMTsKKwl3aGlsZSAoMSkgeworCQljb25zdCB1bnNpZ25lZCB5ID0geDsKKwkJeCA9ICgobiAvIHgpICsgeCkgPj4gMTsKKwkJaWYgKHggPD0gKHkgKyAxKSAmJiB4ID49ICh5IC0gMSkpCisJCQlyZXR1cm4geDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0b25lKGNvbnN0IGludCAqYSwgaW50IG4sIGNvbnN0IGludCAqYiwgaW50ICpKLCBpbnQgcHJlZikKK3sKKwljb25zdCB1bnNpZ25lZCBpc3EgPSBpc3FydChuKTsKKwljb25zdCB1bnNpZ25lZCBib3VuZCA9CisJCShvcHRpb25fbWFzazMyICYgRkxBRyhkKSkgPyBVSU5UX01BWCA6IE1BWCgyNTYsIGlzcSk7CisJaW50IGNsZW4gPSAxOworCWludCBjbGlzdGxlbiA9IDEwMDsKKwlpbnQgayA9IDA7CisJc3RydWN0IGNhbmQgKmNsaXN0ID0geHphbGxvYyhjbGlzdGxlbiAqIHNpemVvZihjbGlzdFswXSkpOworCXN0cnVjdCBjYW5kIGNhbmQ7CisJc3RydWN0IGNhbmQgKnE7CisJaW50ICprbGlzdCA9IHh6YWxsb2MoKG4gKyAyKSAqIHNpemVvZihrbGlzdFswXSkpOworCS8qY2xpc3RbMF0gPSAoc3RydWN0IGNhbmQpezB9OyAtIHh6YWxsb2MgZGlkIGl0ICovCisJLyprbGlzdFswXSA9IDA7ICovCisKKwlmb3IgKGNhbmQueCA9IDE7IGNhbmQueCA8PSBuOyBjYW5kLngrKykgeworCQlpbnQgaiA9IGFbY2FuZC54XSwgb2xkbCA9IDA7CisJCXVuc2lnbmVkIG51bXRyaWVzID0gMDsKKwkJaWYgKGogPT0gMCkKKwkJCWNvbnRpbnVlOworCQljYW5kLnkgPSAtYltqXTsKKwkJY2FuZC5wcmVkID0ga2xpc3RbMF07CisJCWRvIHsKKwkJCWludCBsLCB0YzsKKwkJCWlmIChjYW5kLnkgPD0gY2xpc3RbY2FuZC5wcmVkXS55KQorCQkJCWNvbnRpbnVlOworCQkJbCA9IHNlYXJjaChrbGlzdCwgaywgY2FuZC55LCBjbGlzdCk7CisJCQlpZiAobCAhPSBvbGRsICsgMSkKKwkJCQljYW5kLnByZWQgPSBrbGlzdFtsIC0gMV07CisJCQlpZiAobCA8PSBrICYmIGNsaXN0W2tsaXN0W2xdXS55IDw9IGNhbmQueSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjbGVuID09IGNsaXN0bGVuKSB7CisJCQkJY2xpc3RsZW4gPSBjbGlzdGxlbiAqIDExIC8gMTA7CisJCQkJY2xpc3QgPSB4cmVhbGxvYyhjbGlzdCwgY2xpc3RsZW4gKiBzaXplb2YoY2xpc3RbMF0pKTsKKwkJCX0KKwkJCWNsaXN0W2NsZW5dID0gY2FuZDsKKwkJCXRjID0ga2xpc3RbbF07CisJCQlrbGlzdFtsXSA9IGNsZW4rKzsKKwkJCWlmIChsIDw9IGspIHsKKwkJCQljYW5kLnByZWQgPSB0YzsKKwkJCQlvbGRsID0gbDsKKwkJCQludW10cmllcysrOworCQkJfSBlbHNlIHsKKwkJCQlrKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKChjYW5kLnkgPSBiWysral0pID4gMCAmJiBudW10cmllcyA8IGJvdW5kKTsKKwl9CisJLyogVW5yYXZlbCAqLworCWZvciAocSA9IGNsaXN0ICsga2xpc3Rba107IHEtPnk7IHEgPSBjbGlzdCArIHEtPnByZWQpCisJCUpbcS0+eCArIHByZWZdID0gcS0+eSArIHByZWY7CisJZnJlZShrbGlzdCk7CisJZnJlZShjbGlzdCk7Cit9CisKK3N0cnVjdCBsaW5lIHsKKwkvKiAnc2VyaWFsJyBpcyBub3QgdXNlZCBpbiB0aGUgYmVnaW5pbmcsIHNvIHdlIHJldXNlIGl0CisJICogdG8gc3RvcmUgbGluZSBvZmZzZXRzLCB0aHVzIHJlZHVjaW5nIG1lbW9yeSBwcmVzc3VyZQorCSAqLworCXVuaW9uIHsKKwkJdW5zaWduZWQgc2VyaWFsOworCQlvZmZfdCBvZmZzZXQ7CisJfTsKKwl1bnNpZ25lZCB2YWx1ZTsKK307CisKK3N0YXRpYyB2b2lkIGVxdWl2KHN0cnVjdCBsaW5lICphLCBpbnQgbiwgc3RydWN0IGxpbmUgKmIsIGludCBtLCBpbnQgKmMpCit7CisJaW50IGkgPSAxLCBqID0gMTsKKworCXdoaWxlIChpIDw9IG4gJiYgaiA8PSBtKSB7CisJCWlmIChhW2ldLnZhbHVlIDwgYltqXS52YWx1ZSkKKwkJCWFbaSsrXS52YWx1ZSA9IDA7CisJCWVsc2UgaWYgKGFbaV0udmFsdWUgPT0gYltqXS52YWx1ZSkKKwkJCWFbaSsrXS52YWx1ZSA9IGo7CisJCWVsc2UKKwkJCWorKzsKKwl9CisJd2hpbGUgKGkgPD0gbikKKwkJYVtpKytdLnZhbHVlID0gMDsKKwliW20gKyAxXS52YWx1ZSA9IDA7CisJaiA9IDA7CisJd2hpbGUgKCsraiA8PSBtKSB7CisJCWNbal0gPSAtYltqXS5zZXJpYWw7CisJCXdoaWxlIChiW2ogKyAxXS52YWx1ZSA9PSBiW2pdLnZhbHVlKSB7CisJCQlqKys7CisJCQljW2pdID0gYltqXS5zZXJpYWw7CisJCX0KKwl9CisJY1tqXSA9IC0xOworfQorCitzdGF0aWMgdm9pZCB1bnNvcnQoY29uc3Qgc3RydWN0IGxpbmUgKmYsIGludCBsLCBpbnQgKmIpCit7CisJaW50IGk7CisJaW50ICphID0geG1hbGxvYygobCArIDEpICogc2l6ZW9mKGFbMF0pKTsKKwlmb3IgKGkgPSAxOyBpIDw9IGw7IGkrKykKKwkJYVtmW2ldLnNlcmlhbF0gPSBmW2ldLnZhbHVlOworCWZvciAoaSA9IDE7IGkgPD0gbDsgaSsrKQorCQliW2ldID0gYVtpXTsKKwlmcmVlKGEpOworfQorCitzdGF0aWMgaW50IGxpbmVfY29tcGFyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisjZGVmaW5lIGwwICgoY29uc3Qgc3RydWN0IGxpbmUqKWEpCisjZGVmaW5lIGwxICgoY29uc3Qgc3RydWN0IGxpbmUqKWIpCisJaW50IHIgPSBsMC0+dmFsdWUgLSBsMS0+dmFsdWU7CisJaWYgKHIpCisJCXJldHVybiByOworCXJldHVybiBsMC0+c2VyaWFsIC0gbDEtPnNlcmlhbDsKKyN1bmRlZiBsMAorI3VuZGVmIGwxCit9CisKK3N0YXRpYyB2b2lkIGZldGNoKEZJTEVfYW5kX3Bvc190ICpmdCwgY29uc3Qgb2ZmX3QgKml4LCBpbnQgYSwgaW50IGIsIGludCBjaCkKK3sKKwlpbnQgaSwgaiwgY29sOworCWZvciAoaSA9IGE7IGkgPD0gYjsgaSsrKSB7CisJCXNlZWtfZnQoZnQsIGl4W2kgLSAxXSk7CisJCXB1dGNoYXIoY2gpOworCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUcoVCkpCisJCQlwdXRjaGFyKCdcdCcpOworCQlmb3IgKGogPSAwLCBjb2wgPSAwOyBqIDwgaXhbaV0gLSBpeFtpIC0gMV07IGorKykgeworCQkJaW50IGMgPSBmZ2V0YyhmdC0+ZnRfZnApOworCQkJaWYgKGMgPT0gRU9GKSB7CisJCQkJcHJpbnRmKCJcblxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGVcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWZ0LT5mdF9wb3MrKzsKKwkJCWlmIChjID09ICdcdCcgJiYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKHQpKSkKKwkJCQlkbyBwdXRjaGFyKCcgJyk7IHdoaWxlICgrK2NvbCAmIDcpOworCQkJZWxzZSB7CisJCQkJcHV0Y2hhcihjKTsKKwkJCQljb2wrKzsKKwkJCX0KKwkJfQorCX0KK30KKworLyogQ3JlYXRlcyB0aGUgbWF0Y2ggdmVjdG9yIEosIHdoZXJlIEpbaV0gaXMgdGhlIGluZGV4CisgKiBvZiB0aGUgbGluZSBpbiB0aGUgbmV3IGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgbGluZSBpCisgKiBpbiB0aGUgb2xkIGZpbGUuIExpbmVzIHN0YXJ0IGF0IDEgaW5zdGVhZCBvZiAwLCB0aGF0IHZhbHVlCisgKiBiZWluZyB1c2VkIGluc3RlYWQgdG8gZGVub3RlIG5vIGNvcnJlc3BvbmRpbmcgbGluZS4KKyAqIFRoaXMgdmVjdG9yIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqICogZnAgaXMgYW4gaW5wdXQgcGFyYW1ldGVyLCB3aGVyZSBmcFswXSBhbmQgZnBbMV0gYXJlIHRoZSBvcGVuCisgKiAgIG9sZCBmaWxlIGFuZCBuZXcgZmlsZSByZXNwZWN0aXZlbHkuCisgKiAqIG5sZW4gaXMgYW4gb3V0cHV0IHZhcmlhYmxlLCB3aGVyZSBubGVuWzBdIGFuZCBubGVuWzFdCisgKiAgIGdldHMgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgb2xkIGFuZCBuZXcgZmlsZSByZXNwZWN0aXZlbHkuCisgKiAqIGl4IGlzIGFuIG91dHB1dCB2YXJpYWJsZSwgd2hlcmUgaXhbMF0gYW5kIGl4WzFdIGdldHMKKyAqICAgYXNzaWduZWQgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHZlY3RvcnMgb2YgdGhlIG9mZnNldHMgb2YgdGhlIGxpbmVzCisgKiAgIG9mIHRoZSBvbGQgYW5kIG5ldyBmaWxlIHJlc3BlY3RpdmVseS4gVGhlc2UgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgTk9JTkxJTkUgaW50ICpjcmVhdGVfSihGSUxFX2FuZF9wb3NfdCBmdFsyXSwgaW50IG5sZW5bMl0sIG9mZl90ICppeFsyXSkKK3sKKwlpbnQgKkosIHNsZW5bMl0sICpjbGFzcywgKm1lbWJlcjsKKwlzdHJ1Y3QgbGluZSAqbmZpbGVbMl0sICpzZmlsZVsyXTsKKwlpbnQgcHJlZiA9IDAsIHN1ZmYgPSAwLCBpLCBqLCBkZWx0YTsKKworCS8qIExpbmVzIG9mIGJvdGggZmlsZXMgYXJlIGhhc2hlZCwgYW5kIGluIHRoZSBwcm9jZXNzCisJICogdGhlaXIgb2Zmc2V0cyBhcmUgc3RvcmVkIGluIHRoZSBhcnJheSBpeFtmaWxlbm9dCisJICogd2hlcmUgZmlsZW5vID09IDAgcG9pbnRzIHRvIHRoZSBvbGQgZmlsZSwgYW5kCisJICogZmlsZW5vID09IDEgcG9pbnRzIHRvIHRoZSBuZXcgb25lLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdW5zaWduZWQgaGFzaDsKKwkJdG9rZW5fdCB0b2s7CisJCXNpemVfdCBzeiA9IDEwMDsKKwkJbmZpbGVbaV0gPSB4bWFsbG9jKChzeiArIDMpICogc2l6ZW9mKG5maWxlW2ldWzBdKSk7CisJCS8qIGZ0IGdldHMgaGVyZSB3aXRob3V0IHRoZSBjb3JyZWN0IHBvc2l0aW9uLCBjYW50IHVzZSBzZWVrX2Z0ICovCisJCWZ0W2ldLmZ0X3BvcyA9IDA7CisJCWZzZWVrbyhmdFtpXS5mdF9mcCwgMCwgU0VFS19TRVQpOworCisJCW5sZW5baV0gPSAwOworCQkvKiBXZSBjb3VsZCB6YWxsb2MgbmZpbGUsIGJ1dCB0aGVuIHphbGxvYyBzdGFydHMgc2hvd2luZyBpbiBncHJvZiBhdCB+MSUgKi8KKwkJbmZpbGVbaV1bMF0ub2Zmc2V0ID0gMDsKKwkJZ290byBzdGFydDsgLyogc2F2ZXMgY29kZSAqLworCQl3aGlsZSAoMSkgeworCQkJdG9rID0gcmVhZF90b2tlbigmZnRbaV0sIHRvayk7CisJCQlpZiAoISh0b2sgJiBUT0tfRU1QVFkpKSB7CisJCQkJLyogSGFzaCBhbGdvcml0aG0gdGFrZW4gZnJvbSBSb2JlcnQgU2VkZ2V3aWNrLCBBbGdvcml0aG1zIGluIEMsIDNkIGVkLiwgcCA1NzguICovCisJCQkJLypoYXNoID0gaGFzaCAqIDEyOCAtIGhhc2ggKyBUT0syQ0hBUih0b2spOworCQkJCSAqIGdjYyBpbnNpc3RzIG9uIG9wdGltaXppbmcgYWJvdmUgdG8gImhhc2ggKiAxMjcgKyAuLi4iLCB0aHVzLi4uICovCisJCQkJdW5zaWduZWQgbyA9IGhhc2ggLSBUT0syQ0hBUih0b2spOworCQkJCWhhc2ggPSBoYXNoICogMTI4IC0gbzsgLyogd2Ugd2FudCBTUEVFRCBoZXJlICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAobmxlbltpXSsrID09IHN6KSB7CisJCQkJc3ogPSBzeiAqIDMgLyAyOworCQkJCW5maWxlW2ldID0geHJlYWxsb2MobmZpbGVbaV0sIChzeiArIDMpICogc2l6ZW9mKG5maWxlW2ldWzBdKSk7CisJCQl9CisJCQkvKiBsaW5lX2NvbXBhciBuZWVkcyBoYXNoZXMgZml0IGludG8gcG9zaXRpdmUgaW50ICovCisJCQluZmlsZVtpXVtubGVuW2ldXS52YWx1ZSA9IGhhc2ggJiBJTlRfTUFYOworCQkJLyogbGlrZSBmdGVsbG8oZnRbaV0uZnRfZnApIGJ1dCBmYXN0ZXIgKGF2b2lkcyBsc2VlayBzeXNjYWxsKSAqLworCQkJbmZpbGVbaV1bbmxlbltpXV0ub2Zmc2V0ID0gZnRbaV0uZnRfcG9zOworCQkJaWYgKHRvayAmIFRPS19FT0YpIHsKKwkJCQkvKiBFT0YgY291bnRzIGFzIGEgdG9rZW4sIHNvIHdlIGhhdmUgdG8gYWRqdXN0IGl0IGhlcmUgKi8KKwkJCQluZmlsZVtpXVtubGVuW2ldXS5vZmZzZXQrKzsKKwkJCQlicmVhazsKKwkJCX0KK3N0YXJ0OgorCQkJaGFzaCA9IHRvayA9IDA7CisJCX0KKwkJLyogRXhjbHVkZSBsb25lIEVPRiBsaW5lIGZyb20gdGhlIGVuZCBvZiB0aGUgZmlsZSwgdG8gbWFrZSBmZXRjaCgpJ3Mgam9iIGVhc2llciAqLworCQlpZiAobmZpbGVbaV1bbmxlbltpXV0ub2Zmc2V0IC0gbmZpbGVbaV1bbmxlbltpXSAtIDFdLm9mZnNldCA9PSAxKQorCQkJbmxlbltpXS0tOworCQkvKiBOb3cgd2UgY29weSB0aGUgbGluZSBvZmZzZXRzIGludG8gaXggKi8KKwkJaXhbaV0gPSB4bWFsbG9jKChubGVuW2ldICsgMikgKiBzaXplb2YoaXhbaV1bMF0pKTsKKwkJZm9yIChqID0gMDsgaiA8IG5sZW5baV0gKyAxOyBqKyspCisJCQlpeFtpXVtqXSA9IG5maWxlW2ldW2pdLm9mZnNldDsKKwl9CisKKwkvKiBsZW5ndGggb2YgcHJlZml4IGFuZCBzdWZmaXggaXMgY2FsY3VsYXRlZCAqLworCWZvciAoOyBwcmVmIDwgbmxlblswXSAmJiBwcmVmIDwgbmxlblsxXSAmJgorCSAgICAgICBuZmlsZVswXVtwcmVmICsgMV0udmFsdWUgPT0gbmZpbGVbMV1bcHJlZiArIDFdLnZhbHVlOworCSAgICAgICBwcmVmKyspOworCWZvciAoOyBzdWZmIDwgbmxlblswXSAtIHByZWYgJiYgc3VmZiA8IG5sZW5bMV0gLSBwcmVmICYmCisJICAgICAgIG5maWxlWzBdW25sZW5bMF0gLSBzdWZmXS52YWx1ZSA9PSBuZmlsZVsxXVtubGVuWzFdIC0gc3VmZl0udmFsdWU7CisJICAgICAgIHN1ZmYrKyk7CisJLyogQXJyYXlzIGFyZSBwcnVuZWQgYnkgdGhlIHN1ZmZpeCBhbmQgcHJlZml4IGxlbmd0aCwKKwkgKiB0aGUgcmVzdWx0IGJlaW5nIHNvcnRlZCBhbmQgc3RvcmVkIGluIHNmaWxlW2ZpbGVub10sCisJICogYW5kIHRoZWlyIHNpemVzIGFyZSBzdG9yZWQgaW4gc2xlbltmaWxlbm9dCisJICovCisJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQlzZmlsZVtqXSA9IG5maWxlW2pdICsgcHJlZjsKKwkJc2xlbltqXSA9IG5sZW5bal0gLSBwcmVmIC0gc3VmZjsKKwkJZm9yIChpID0gMDsgaSA8PSBzbGVuW2pdOyBpKyspCisJCQlzZmlsZVtqXVtpXS5zZXJpYWwgPSBpOworCQlxc29ydChzZmlsZVtqXSArIDEsIHNsZW5bal0sIHNpemVvZigqc2ZpbGVbal0pLCBsaW5lX2NvbXBhcik7CisJfQorCS8qIG5maWxlIGFycmF5cyBhcmUgcmV1c2VkIHRvIHJlZHVjZSBtZW1vcnkgcHJlc3N1cmUKKwkgKiBUaGUgI2lmIHplcm9lZCBvdXQgc2VjdGlvbiBwZXJmb3JtcyB0aGUgc2FtZSB0YXNrIGFzIHRoZQorCSAqIG9uZSBpbiB0aGUgI2Vsc2Ugc2VjdGlvbi4KKwkgKiBQZWFrIG1lbW9yeSB1c2FnZSBpcyBoaWdoZXIsIGJ1dCBvbmUgYXJyYXkgY29weSBpcyBhdm9pZGVkCisJICogYnkgbm90IHVzaW5nIHVuc29ydCgpCisJICovCisjaWYgMAorCW1lbWJlciA9IHhtYWxsb2MoKHNsZW5bMV0gKyAyKSAqIHNpemVvZihtZW1iZXJbMF0pKTsKKwllcXVpdihzZmlsZVswXSwgc2xlblswXSwgc2ZpbGVbMV0sIHNsZW5bMV0sIG1lbWJlcik7CisJZnJlZShuZmlsZVsxXSk7CisKKwljbGFzcyA9IHhtYWxsb2MoKHNsZW5bMF0gKyAxKSAqIHNpemVvZihjbGFzc1swXSkpOworCWZvciAoaSA9IDE7IGkgPD0gc2xlblswXTsgaSsrKSAvKiBVbnNvcnRpbmcgKi8KKwkJY2xhc3Nbc2ZpbGVbMF1baV0uc2VyaWFsXSA9IHNmaWxlWzBdW2ldLnZhbHVlOworCWZyZWUobmZpbGVbMF0pOworI2Vsc2UKKwltZW1iZXIgPSAoaW50ICopbmZpbGVbMV07CisJZXF1aXYoc2ZpbGVbMF0sIHNsZW5bMF0sIHNmaWxlWzFdLCBzbGVuWzFdLCBtZW1iZXIpOworCW1lbWJlciA9IHhyZWFsbG9jKG1lbWJlciwgKHNsZW5bMV0gKyAyKSAqIHNpemVvZihtZW1iZXJbMF0pKTsKKworCWNsYXNzID0gKGludCAqKW5maWxlWzBdOworCXVuc29ydChzZmlsZVswXSwgc2xlblswXSwgKGludCAqKW5maWxlWzBdKTsKKwljbGFzcyA9IHhyZWFsbG9jKGNsYXNzLCAoc2xlblswXSArIDIpICogc2l6ZW9mKGNsYXNzWzBdKSk7CisjZW5kaWYKKwlKID0geG1hbGxvYygobmxlblswXSArIDIpICogc2l6ZW9mKEpbMF0pKTsKKwkvKiBUaGUgZWxlbWVudHMgb2YgSiB3aGljaCBmYWxsIGluc2lkZSB0aGUgcHJlZml4IGFuZCBzdWZmaXggcmVnaW9ucworCSAqIGFyZSBtYXJrZWQgYXMgdW5jaGFuZ2VkLCB3aGlsZSB0aGUgb25lcyB3aGljaCBmYWxsIG91dHNpZGUKKwkgKiBhcmUgaW5pdGlhbGl6ZWQgd2l0aCAwIChubyBtYXRjaGVzKSwgc28gdGhhdCBmdW5jdGlvbiBzdG9uZSBjYW4KKwkgKiB0aGVuIGFzc2lnbiB0aGVtIHRoZWlyIHJpZ2h0IHZhbHVlcworCSAqLworCWZvciAoaSA9IDAsIGRlbHRhID0gbmxlblsxXSAtIG5sZW5bMF07IGkgPD0gbmxlblswXTsgaSsrKQorCQlKW2ldID0gaSA8PSBwcmVmICAgICAgICAgICAgPyAgaSA6CisJCSAgICAgICBpID4gKG5sZW5bMF0gLSBzdWZmKSA/IChpICsgZGVsdGEpIDogMDsKKwkvKiBIZXJlIHRoZSBtYWdpYyBpcyBwZXJmb3JtZWQgKi8KKwlzdG9uZShjbGFzcywgc2xlblswXSwgbWVtYmVyLCBKLCBwcmVmKTsKKwlKW25sZW5bMF0gKyAxXSA9IG5sZW5bMV0gKyAxOworCisJZnJlZShjbGFzcyk7CisJZnJlZShtZW1iZXIpOworCisJLyogQm90aCBmaWxlcyBhcmUgcmVzY2FubmVkLCBpbiBhbiBlZmZvcnQgdG8gZmluZCBhbnkgbGluZXMKKwkgKiB3aGljaCwgZHVlIHRvIGxpbWl0YXRpb25zIGludHJpbnNpYyB0byBhbnkgaGFzaGluZyBhbGdvcml0aG0sCisJICogYXJlIGRpZmZlcmVudCBidXQgZW5kZWQgdXAgY29uZm91bmRlZCBhcyB0aGUgc2FtZQorCSAqLworCWZvciAoaSA9IDE7IGkgPD0gbmxlblswXTsgaSsrKSB7CisJCWlmICghSltpXSkKKwkJCWNvbnRpbnVlOworCisJCXNlZWtfZnQoJmZ0WzBdLCBpeFswXVtpIC0gMV0pOworCQlzZWVrX2Z0KCZmdFsxXSwgaXhbMV1bSltpXSAtIDFdKTsKKworCQlmb3IgKGogPSBKW2ldOyBpIDw9IG5sZW5bMF0gJiYgSltpXSA9PSBqOyBpKyssIGorKykgeworCQkJdG9rZW5fdCB0b2swID0gMCwgdG9rMSA9IDA7CisJCQlkbyB7CisJCQkJdG9rMCA9IHJlYWRfdG9rZW4oJmZ0WzBdLCB0b2swKTsKKwkJCQl0b2sxID0gcmVhZF90b2tlbigmZnRbMV0sIHRvazEpOworCisJCQkJaWYgKCgodG9rMCBeIHRvazEpICYgVE9LX0VNUFRZKSAhPSAwIC8qIG9uZSBpcyBlbXB0eSAobm90IGJvdGgpICovCisJCQkJIHx8ICghKHRvazAgJiBUT0tfRU1QVFkpICYmIFRPSzJDSEFSKHRvazApICE9IFRPSzJDSEFSKHRvazEpKQorCQkJCSkgeworCQkJCQlKW2ldID0gMDsgLyogQnJlYWsgdGhlIGNvcnJlc3BvbmRlbmNlICovCisJCQkJfQorCQkJfSB3aGlsZSAoISh0b2swICYgdG9rMSAmIFRPS19FTVBUWSkpOworCQl9CisJfQorCisJcmV0dXJuIEo7Cit9CisKK3N0YXRpYyBib29sIGRpZmYoRklMRSogZnBbMl0sIGNoYXIgKmZpbGVbMl0pCit7CisJaW50IG5sZW5bMl07CisJb2ZmX3QgKml4WzJdOworCUZJTEVfYW5kX3Bvc190IGZ0WzJdOworCXR5cGVkZWYgc3RydWN0IHsgaW50IGEsIGI7IH0gdmVjX3RbMl07CisJdmVjX3QgKnZlYyA9IE5VTEw7CisJaW50IGkgPSAxLCBqLCBrLCBpZHggPSAtMTsKKwlib29sIGFueWNoYW5nZSA9IGZhbHNlOworCWludCAqSjsKKworCWZ0WzBdLmZ0X2ZwID0gZnBbMF07CisJZnRbMV0uZnRfZnAgPSBmcFsxXTsKKwkvKiBub3RlIHRoYXQgZnRbaV0uZnRfcG9zIGlzIHVuaW50aXRhbGl6ZWQsIGNyZWF0ZV9KKCkKKwkgKiBtdXN0IG5vdCBhc3N1bWUgb3RoZXJ3aXNlICovCisJSiA9IGNyZWF0ZV9KKGZ0LCBubGVuLCBpeCk7CisKKwlkbyB7CisJCWJvb2wgbm9uZW1wdHkgPSBmYWxzZTsKKworCQl3aGlsZSAoMSkgeworCQkJdmVjX3QgdjsKKworCQkJZm9yICh2WzBdLmEgPSBpOyB2WzBdLmEgPD0gbmxlblswXSAmJiBKW3ZbMF0uYV0gPT0gSlt2WzBdLmEgLSAxXSArIDE7IHZbMF0uYSsrKQorCQkJCWNvbnRpbnVlOworCQkJdlsxXS5hID0gSlt2WzBdLmEgLSAxXSArIDE7CisKKwkJCWZvciAodlswXS5iID0gdlswXS5hIC0gMTsgdlswXS5iIDwgbmxlblswXSAmJiAhSlt2WzBdLmIgKyAxXTsgdlswXS5iKyspCisJCQkJY29udGludWU7CisJCQl2WzFdLmIgPSBKW3ZbMF0uYiArIDFdIC0gMTsKKwkJCS8qCisJCQkgKiBJbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGxpbmVzIGEgYW5kIGIgb2YgdGhlICdmcm9tJyBmaWxlCisJCQkgKiB0byBnZXQgdG8gbGluZXMgYyB0byBkIG9mIHRoZSAndG8nIGZpbGUuIElmIGEgaXMgZ3JlYXRlciB0aGFuIGIgdGhlbiB0aGVyZQorCQkJICogYXJlIG5vIGxpbmVzIGluIHRoZSAnZnJvbScgZmlsZSBpbnZvbHZlZCBhbmQgdGhpcyBtZWFucyB0aGF0IHRoZXJlIHdlcmUKKwkJCSAqIGxpbmVzIGFwcGVuZGVkIChiZWdpbm5pbmcgYXQgYikuICBJZiBjIGlzIGdyZWF0ZXIgdGhhbiBkIHRoZW4gdGhlcmUgYXJlCisJCQkgKiBsaW5lcyBtaXNzaW5nIGZyb20gdGhlICd0bycgZmlsZS4KKwkJCSAqLworCQkJaWYgKHZbMF0uYSA8PSB2WzBdLmIgfHwgdlsxXS5hIDw9IHZbMV0uYikgeworCQkJCS8qCisJCQkJICogSWYgdGhpcyBjaGFuZ2UgaXMgbW9yZSB0aGFuICdjb250ZXh0JyBsaW5lcyBmcm9tIHRoZQorCQkJCSAqIHByZXZpb3VzIGNoYW5nZSwgZHVtcCB0aGUgcmVjb3JkIGFuZCByZXNldCBpdC4KKwkJCQkgKi8KKwkJCQlpbnQgY3QgPSAoMiAqIG9wdF9VX2NvbnRleHQpICsgMTsKKwkJCQlpZiAoaWR4ID49IDAKKwkJCQkgJiYgdlswXS5hID4gdmVjW2lkeF1bMF0uYiArIGN0CisJCQkJICYmIHZbMV0uYSA+IHZlY1tpZHhdWzFdLmIgKyBjdAorCQkJCSkgeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJCQlmb3IgKGsgPSB2W2pdLmE7IGsgPCB2W2pdLmI7IGsrKykKKwkJCQkJCW5vbmVtcHR5IHw9IChpeFtqXVtrKzFdIC0gaXhbal1ba10gIT0gMSk7CisKKwkJCQl2ZWMgPSB4cmVhbGxvY192ZWN0b3IodmVjLCA2LCArK2lkeCk7CisJCQkJbWVtY3B5KHZlY1tpZHhdLCB2LCBzaXplb2YodikpOworCQkJfQorCisJCQlpID0gdlswXS5iICsgMTsKKwkJCWlmIChpID4gbmxlblswXSkKKwkJCQlicmVhazsKKwkJCUpbdlswXS5iXSA9IHZbMV0uYjsKKwkJfQorCQlpZiAoaWR4IDwgMCB8fCAoKG9wdGlvbl9tYXNrMzIgJiBGTEFHKEIpKSAmJiAhbm9uZW1wdHkpKQorCQkJZ290byBjb250OworCQlpZiAoIShvcHRpb25fbWFzazMyICYgRkxBRyhxKSkpIHsKKwkJCWludCBsb3dhOworCQkJdmVjX3Qgc3BhbiwgKmN2cCA9IHZlYzsKKworCQkJaWYgKCFhbnljaGFuZ2UpIHsKKwkJCQkvKiBQcmludCB0aGUgY29udGV4dC91bmlkaWZmIGhlYWRlciBmaXJzdCB0aW1lIHRocm91Z2ggKi8KKwkJCQlwcmludGYoIi0tLSAlc1xuIiwgbGFiZWxbMF0gPyBsYWJlbFswXSA6IGZpbGVbMF0pOworCQkJCXByaW50ZigiKysrICVzXG4iLCBsYWJlbFsxXSA/IGxhYmVsWzFdIDogZmlsZVsxXSk7CisJCQl9CisKKwkJCXByaW50ZigiQEAiKTsKKwkJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCQlpbnQgYSA9IHNwYW5bal0uYSA9IE1BWCgxLCAoKmN2cClbal0uYSAtIG9wdF9VX2NvbnRleHQpOworCQkJCWludCBiID0gc3BhbltqXS5iID0gTUlOKG5sZW5bal0sIHZlY1tpZHhdW2pdLmIgKyBvcHRfVV9jb250ZXh0KTsKKworCQkJCXByaW50ZigiICVjJWQiLCBqID8gJysnIDogJy0nLCBNSU4oYSwgYikpOworCQkJCWlmIChhID09IGIpCisJCQkJCWNvbnRpbnVlOworCQkJCXByaW50ZigiLCVkIiwgKGEgPCBiKSA/IGIgLSBhICsgMSA6IDApOworCQkJfQorCQkJcHJpbnRmKCIgQEBcbiIpOworCQkJLyoKKwkJCSAqIE91dHB1dCBjaGFuZ2VzIGluICJ1bmlmaWVkIiBkaWZmIGZvcm1hdC0tdGhlIG9sZCBhbmQgbmV3IGxpbmVzCisJCQkgKiBhcmUgcHJpbnRlZCB0b2dldGhlci4KKwkJCSAqLworCQkJZm9yIChsb3dhID0gc3BhblswXS5hOyA7IGxvd2EgPSAoKmN2cCsrKVswXS5iICsgMSkgeworCQkJCWJvb2wgZW5kID0gY3ZwID4gJnZlY1tpZHhdOworCQkJCWZldGNoKCZmdFswXSwgaXhbMF0sIGxvd2EsIGVuZCA/IHNwYW5bMF0uYiA6ICgqY3ZwKVswXS5hIC0gMSwgJyAnKTsKKwkJCQlpZiAoZW5kKQorCQkJCQlicmVhazsKKwkJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJCQlmZXRjaCgmZnRbal0sIGl4W2pdLCAoKmN2cClbal0uYSwgKCpjdnApW2pdLmIsIGogPyAnKycgOiAnLScpOworCQkJfQorCQl9CisJCWFueWNoYW5nZSA9IHRydWU7CisgY29udDoKKwkJaWR4ID0gLTE7CisJfSB3aGlsZSAoaSA8PSBubGVuWzBdKTsKKworCWZyZWUodmVjKTsKKwlmcmVlKGl4WzBdKTsKKwlmcmVlKGl4WzFdKTsKKwlmcmVlKEopOworCXJldHVybiBhbnljaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgZGlmZnJlZyhjaGFyICpmaWxlWzJdKQoreworCUZJTEUgKmZwWzJdOworCWJvb2wgYmluYXJ5ID0gZmFsc2UsIGRpZmZlciA9IGZhbHNlOworCWludCBzdGF0dXMgPSBTVEFUVVNfU0FNRSwgaTsKKworCWZwWzBdID0gc3RkaW47CisJZnBbMV0gPSBzdGRpbjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWludCBmZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbihmaWxlW2ldKTsKKwkJaWYgKGZkID09IC0xKQorCQkJZ290byBvdXQ7CisJCS8qIE91ciBkaWZmIGltcGxlbWVudGF0aW9uIGlzIHVzaW5nIHNlZWsuCisJCSAqIFdoZW4gd2UgbWVldCBub24tc2Vla2FibGUgZmlsZSwgd2UgbXVzdCBtYWtlIGEgdGVtcCBjb3B5LgorCQkgKi8KKwkJaWYgKGxzZWVrKGZkLCAwLCBTRUVLX1NFVCkgPT0gLTEgJiYgZXJybm8gPT0gRVNQSVBFKSB7CisJCQljaGFyIG5hbWVbXSA9ICIvdG1wL2RpZlhYWFhYWCI7CisJCQlpbnQgZmRfdG1wID0geG1rc3RlbXAobmFtZSk7CisKKwkJCXVubGluayhuYW1lKTsKKwkJCWlmIChiYl9jb3B5ZmRfZW9mKGZkLCBmZF90bXApIDwgMCkKKwkJCQl4ZnVuY19kaWUoKTsKKwkJCWlmIChmZCkgLyogUHJldmVudHMgY2xvc2luZyBvZiBzdGRpbiAqLworCQkJCWNsb3NlKGZkKTsKKwkJCWZkID0gZmRfdG1wOworCQl9CisJCWZwW2ldID0gZmRvcGVuKGZkLCAiciIpOworCX0KKworCXdoaWxlICgxKSB7CisJCWNvbnN0IHNpemVfdCBzeiA9IENPTU1PTl9CVUZTSVpFIC8gMjsKKwkJY2hhciAqY29uc3QgYnVmMCA9IGJiX2NvbW1vbl9idWZzaXoxOworCQljaGFyICpjb25zdCBidWYxID0gYnVmMCArIHN6OworCQlpbnQgaiwgazsKKwkJaSA9IGZyZWFkKGJ1ZjAsIDEsIHN6LCBmcFswXSk7CisJCWogPSBmcmVhZChidWYxLCAxLCBzeiwgZnBbMV0pOworCQlpZiAoaSAhPSBqKSB7CisJCQlkaWZmZXIgPSB0cnVlOworCQkJaSA9IE1JTihpLCBqKTsKKwkJfQorCQlpZiAoaSA9PSAwKQorCQkJYnJlYWs7CisJCWZvciAoayA9IDA7IGsgPCBpOyBrKyspIHsKKwkJCWlmICghYnVmMFtrXSB8fCAhYnVmMVtrXSkKKwkJCQliaW5hcnkgPSB0cnVlOworCQkJaWYgKGJ1ZjBba10gIT0gYnVmMVtrXSkKKwkJCQlkaWZmZXIgPSB0cnVlOworCQl9CisJfQorCWlmIChkaWZmZXIpIHsKKwkJaWYgKGJpbmFyeSAmJiAhKG9wdGlvbl9tYXNrMzIgJiBGTEFHKGEpKSkKKwkJCXN0YXR1cyA9IFNUQVRVU19CSU5BUlk7CisJCWVsc2UgaWYgKGRpZmYoZnAsIGZpbGUpKQorCQkJc3RhdHVzID0gU1RBVFVTX0RJRkZFUjsKKwl9CisJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU0FNRSkKKwkJZXhpdF9zdGF0dXMgfD0gMTsKK291dDoKKwlmY2xvc2VfaWZfbm90X3N0ZGluKGZwWzBdKTsKKwlmY2xvc2VfaWZfbm90X3N0ZGluKGZwWzFdKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXR1cyhpbnQgc3RhdHVzLCBjaGFyICpwYXRoWzJdKQoreworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBTVEFUVVNfQklOQVJZOgorCWNhc2UgU1RBVFVTX0RJRkZFUjoKKwkJaWYgKChvcHRpb25fbWFzazMyICYgRkxBRyhxKSkgfHwgc3RhdHVzID09IFNUQVRVU19CSU5BUlkpCisJCQlwcmludGYoIkZpbGVzICVzIGFuZCAlcyBkaWZmZXJcbiIsIHBhdGhbMF0sIHBhdGhbMV0pOworCQlicmVhazsKKwljYXNlIFNUQVRVU19TQU1FOgorCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUcocykpCisJCQlwcmludGYoIkZpbGVzICVzIGFuZCAlcyBhcmUgaWRlbnRpY2FsXG4iLCBwYXRoWzBdLCBwYXRoWzFdKTsKKwkJYnJlYWs7CisJfQorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRElGRl9ESVIKK3N0cnVjdCBkbGlzdCB7CisJc2l6ZV90IGxlbjsKKwlpbnQgcywgZTsKKwljaGFyICoqZGw7Cit9OworCisvKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBmaWxlbmFtZSB0byBkbCwgdGhlIGRpcmVjdG9yeSBsaXN0aW5nLiAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYWRkX3RvX2Rpcmxpc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCXN0cnVjdCBzdGF0ICpzYiBVTlVTRURfUEFSQU0sCisJCXZvaWQgKnVzZXJkYXRhLCBpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBkbGlzdCAqY29uc3QgbCA9IHVzZXJkYXRhOworCWNvbnN0IGNoYXIgKmZpbGUgPSBmaWxlbmFtZSArIGwtPmxlbjsKKwl3aGlsZSAoKmZpbGUgPT0gJy8nKQorCQlmaWxlKys7CisJbC0+ZGwgPSB4cmVhbGxvY192ZWN0b3IobC0+ZGwsIDYsIGwtPmUpOworCWwtPmRsW2wtPmVdID0geHN0cmR1cChmaWxlKTsKKwlsLT5lKys7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qIElmIHJlY3Vyc2lvbiBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIGFkZHMgdGhlIGRpcmVjdG9yeQorICogdG8gdGhlIGxpc3QgYW5kIHByZXZlbnRzIHJlY3Vyc2l2ZV9hY3Rpb24gZnJvbSByZWN1cnNpbmcgaW50byBpdC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgc2tpcF9kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCXN0cnVjdCBzdGF0ICpzYiwgdm9pZCAqdXNlcmRhdGEsCisJCWludCBkZXB0aCkKK3sKKwlpZiAoIShvcHRpb25fbWFzazMyICYgRkxBRyhyKSkgJiYgZGVwdGgpIHsKKwkJYWRkX3RvX2Rpcmxpc3QoZmlsZW5hbWUsIHNiLCB1c2VyZGF0YSwgZGVwdGgpOworCQlyZXR1cm4gU0tJUDsKKwl9CisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUcoTikpKSB7CisJCS8qIC1yIHdpdGhvdXQgLU46IG5vIG5lZWQgdG8gcmVjdXJzZSBpbnRvIGRpcnMKKwkJICogd2hpY2ggZG8gbm90IGV4aXN0IG9uIHRoZSAib3RoZXIgc2lkZSIuCisJCSAqIFRlc3RjYXNlOiBkaWZmIC1yIC90bXAgLworCQkgKiAoaXQgd291bGQgcmVjdXJzZSBkZWVwIGludG8gL3Byb2Mgd2l0aG91dCB0aGlzIGNvZGUpICovCisJCXN0cnVjdCBkbGlzdCAqY29uc3QgbCA9IHVzZXJkYXRhOworCQlmaWxlbmFtZSArPSBsLT5sZW47CisJCWlmIChmaWxlbmFtZVswXSkgeworCQkJc3RydWN0IHN0YXQgb3NiOworCQkJY2hhciAqb3RoZXJuYW1lID0gY29uY2F0X3BhdGhfZmlsZShHLm90aGVyX2RpciwgZmlsZW5hbWUpOworCQkJaW50IHIgPSBzdGF0KG90aGVybmFtZSwgJm9zYik7CisJCQlmcmVlKG90aGVybmFtZSk7CisJCQlpZiAociAhPSAwIHx8ICFTX0lTRElSKG9zYi5zdF9tb2RlKSkgeworCQkJCS8qIG90aGVyIGRpciBkb2Vzbid0IGhhdmUgc2ltaWxhcmx5IG5hbWVkCisJCQkJICogZGlyZWN0b3J5LCBkb24ndCByZWN1cnNlOyByZXR1cm4gMSB1cG9uCisJCQkJICogZXhpdCwganVzdCBsaWtlIGRpZmZ1dGlscycgZGlmZiAqLworCQkJCWV4aXRfc3RhdHVzIHw9IDE7CisJCQkJcmV0dXJuIFNLSVA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZkaXIoY2hhciAqcFsyXSwgY29uc3QgY2hhciAqc19zdGFydCkKK3sKKwlzdHJ1Y3QgZGxpc3QgbGlzdFsyXTsKKwlpbnQgaTsKKworCW1lbXNldCgmbGlzdCwgMCwgc2l6ZW9mKGxpc3QpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCS8qbGlzdFtpXS5zID0gbGlzdFtpXS5lID0gMDsgLSBtZW1zZXQgZGlkIGl0ICovCisJCS8qbGlzdFtpXS5kbCA9IE5VTEw7ICovCisKKwkJRy5vdGhlcl9kaXIgPSBwWzEgLSBpXTsKKwkJLyogV2UgbmVlZCB0byB0cmltIHJvb3QgZGlyZWN0b3J5IHByZWZpeC4KKwkJICogVXNpbmcgbGlzdC5sZW4gdG8gc3BlY2lmeSBpdHMgbGVuZ3RoLAorCQkgKiBhZGRfdG9fZGlybGlzdCB3aWxsIHJlbW92ZSBpdC4gKi8KKwkJbGlzdFtpXS5sZW4gPSBzdHJsZW4ocFtpXSk7CisJCXJlY3Vyc2l2ZV9hY3Rpb24ocFtpXSwgQUNUSU9OX1JFQ1VSU0UgfCBBQ1RJT05fRk9MTE9XTElOS1MsCisJCSAgICAgICAgICAgICAgICAgYWRkX3RvX2Rpcmxpc3QsIHNraXBfZGlyLCAmbGlzdFtpXSwgMCk7CisJCS8qIFNvcnQgZGwgYWxwaGFiZXRpY2FsbHkuCisJCSAqIEdOVSBkaWZmIGRvZXMgdGhpcyBpZ25vcmluZyBhbnkgbnVtYmVyIG9mIHRyYWlsaW5nIGRvdHMuCisJCSAqIFdlIGRvbid0LCBzbyBmb3IgdXMgZG90dGVkIGZpbGVzIGFsbW9zdCBhbHdheXMgYXJlCisJCSAqIGZpcnN0IG9uIHRoZSBsaXN0LgorCQkgKi8KKwkJcXNvcnRfc3RyaW5nX3ZlY3RvcihsaXN0W2ldLmRsLCBsaXN0W2ldLmUpOworCQkvKiBJZiAtUyB3YXMgc2V0LCBmaW5kIHRoZSBzdGFydGluZyBwb2ludC4gKi8KKwkJaWYgKCFzX3N0YXJ0KQorCQkJY29udGludWU7CisJCXdoaWxlIChsaXN0W2ldLnMgPCBsaXN0W2ldLmUgJiYgc3RyY21wKGxpc3RbaV0uZGxbbGlzdFtpXS5zXSwgc19zdGFydCkgPCAwKQorCQkJbGlzdFtpXS5zKys7CisJfQorCS8qIE5vdyB0aGF0IGJvdGggZGlybGlzdDEgYW5kIGRpcmxpc3QyIGNvbnRhaW4gc29ydGVkIGRpcmVjdG9yeQorCSAqIGxpc3RpbmdzLCB3ZSBjYW4gc3RhcnQgdG8gZ28gdGhyb3VnaCBkaXJsaXN0MS4gSWYgYm90aCBsaXN0aW5ncworCSAqIGNvbnRhaW4gdGhlIHNhbWUgZmlsZSwgdGhlbiBkbyBhIG5vcm1hbCBkaWZmLiBPdGhlcndpc2UsIGJlaGF2aW91cgorCSAqIGlzIGRldGVybWluZWQgYnkgd2hldGhlciB0aGUgLU4gZmxhZyBpcyBzZXQuICovCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqZHBbMl07CisJCWludCBwb3M7CisJCWludCBrOworCisJCWRwWzBdID0gbGlzdFswXS5zIDwgbGlzdFswXS5lID8gbGlzdFswXS5kbFtsaXN0WzBdLnNdIDogTlVMTDsKKwkJZHBbMV0gPSBsaXN0WzFdLnMgPCBsaXN0WzFdLmUgPyBsaXN0WzFdLmRsW2xpc3RbMV0uc10gOiBOVUxMOworCQlpZiAoIWRwWzBdICYmICFkcFsxXSkKKwkJCWJyZWFrOworCQlwb3MgPSAhZHBbMF0gPyAxIDogKCFkcFsxXSA/IC0xIDogc3RyY21wKGRwWzBdLCBkcFsxXSkpOworCQlrID0gcG9zID4gMDsKKwkJaWYgKHBvcyAmJiAhKG9wdGlvbl9tYXNrMzIgJiBGTEFHKE4pKSkgeworCQkJcHJpbnRmKCJPbmx5IGluICVzOiAlc1xuIiwgcFtrXSwgZHBba10pOworCQkJZXhpdF9zdGF0dXMgfD0gMTsKKwkJfSBlbHNlIHsKKwkJCWNoYXIgKmZ1bGxwYXRoWzJdLCAqcGF0aFsyXTsgLyogaWYgLU4gKi8KKworCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJCWlmIChwb3MgPT0gMCB8fCBpID09IGspIHsKKwkJCQkJcGF0aFtpXSA9IGZ1bGxwYXRoW2ldID0gY29uY2F0X3BhdGhfZmlsZShwW2ldLCBkcFtpXSk7CisJCQkJCXN0YXQoZnVsbHBhdGhbaV0sICZzdGJbaV0pOworCQkJCX0gZWxzZSB7CisJCQkJCWZ1bGxwYXRoW2ldID0gY29uY2F0X3BhdGhfZmlsZShwW2ldLCBkcFsxIC0gaV0pOworCQkJCQlwYXRoW2ldID0gKGNoYXIgKiliYl9kZXZfbnVsbDsKKwkJCQl9CisJCQl9CisJCQlpZiAocG9zKQorCQkJCXN0YXQoZnVsbHBhdGhba10sICZzdGJbMSAtIGtdKTsKKworCQkJaWYgKFNfSVNESVIoc3RiWzBdLnN0X21vZGUpICYmIFNfSVNESVIoc3RiWzFdLnN0X21vZGUpKQorCQkJCXByaW50ZigiQ29tbW9uIHN1YmRpcmVjdG9yaWVzOiAlcyBhbmQgJXNcbiIsIGZ1bGxwYXRoWzBdLCBmdWxscGF0aFsxXSk7CisJCQllbHNlIGlmICghU19JU1JFRyhzdGJbMF0uc3RfbW9kZSkgJiYgIVNfSVNESVIoc3RiWzBdLnN0X21vZGUpKQorCQkJCXByaW50ZigiRmlsZSAlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZFxuIiwgZnVsbHBhdGhbMF0pOworCQkJZWxzZSBpZiAoIVNfSVNSRUcoc3RiWzFdLnN0X21vZGUpICYmICFTX0lTRElSKHN0YlsxXS5zdF9tb2RlKSkKKwkJCQlwcmludGYoIkZpbGUgJXMgaXMgbm90IGEgcmVndWxhciBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgd2FzIHNraXBwZWRcbiIsIGZ1bGxwYXRoWzFdKTsKKwkJCWVsc2UgaWYgKFNfSVNESVIoc3RiWzBdLnN0X21vZGUpICE9IFNfSVNESVIoc3RiWzFdLnN0X21vZGUpKSB7CisJCQkJaWYgKFNfSVNESVIoc3RiWzBdLnN0X21vZGUpKQorCQkJCQlwcmludGYoIkZpbGUgJXMgaXMgYSAlcyB3aGlsZSBmaWxlICVzIGlzIGEgJXNcbiIsIGZ1bGxwYXRoWzBdLCAiZGlyZWN0b3J5IiwgZnVsbHBhdGhbMV0sICJyZWd1bGFyIGZpbGUiKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiRmlsZSAlcyBpcyBhICVzIHdoaWxlIGZpbGUgJXMgaXMgYSAlc1xuIiwgZnVsbHBhdGhbMF0sICJyZWd1bGFyIGZpbGUiLCBmdWxscGF0aFsxXSwgImRpcmVjdG9yeSIpOworCQkJfSBlbHNlCisJCQkJcHJpbnRfc3RhdHVzKGRpZmZyZWcocGF0aCksIGZ1bGxwYXRoKTsKKworCQkJZnJlZShmdWxscGF0aFswXSk7CisJCQlmcmVlKGZ1bGxwYXRoWzFdKTsKKwkJfQorCQlmcmVlKGRwW2tdKTsKKwkJbGlzdFtrXS5zKys7CisJCWlmIChwb3MgPT0gMCkgeworCQkJZnJlZShkcFsxIC0ga10pOworCQkJbGlzdFsxIC0ga10ucysrOworCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKGxpc3RbMF0uZGwpOworCQlmcmVlKGxpc3RbMV0uZGwpOworCX0KK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRElGRl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIGRpZmZfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJpZ25vcmUtY2FzZVwwIiAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImkiCisJImlnbm9yZS10YWItZXhwYW5zaW9uXDAiICAgICBOb19hcmd1bWVudCAgICAgICAiRSIKKwkiaWdub3JlLXNwYWNlLWNoYW5nZVwwIiAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJiIgorCSJpZ25vcmUtYWxsLXNwYWNlXDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInciCisJImlnbm9yZS1ibGFuay1saW5lc1wwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAiQiIKKwkidGV4dFwwIiAgICAgICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJhIgorCSJ1bmlmaWVkXDAiICAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlUiCisJImxhYmVsXDAiICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiTCIKKwkic2hvdy1jLWZ1bmN0aW9uXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJwIgorCSJicmllZlwwIiAgICAgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInEiCisJImV4cGFuZC10YWJzXDAiICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAidCIKKwkiaW5pdGlhbC10YWJcMCIgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJUIgorCSJyZWN1cnNpdmVcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInIiCisJIm5ldy1maWxlXDAiICAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiTiIKKwkicmVwb3J0LWlkZW50aWNhbC1maWxlc1wwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCSJzdGFydGluZy1maWxlXDAiICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlMiCisJIm1pbmltYWxcMCIgICAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiZCIKKwk7CisjZW5kaWYKKworaW50IGRpZmZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRpZmZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBnb3RzdGRpbiA9IDAsIGk7CisJY2hhciAqZmlsZVsyXSwgKnNfc3RhcnQgPSBOVUxMOworCWxsaXN0X3QgKkxfYXJnID0gTlVMTDsKKworCUlOSVRfRygpOworCisJLyogZXhhY3RseSAyIHBhcmFtczsgY29sbGVjdCBtdWx0aXBsZSAtTCA8bGFiZWw+OyAtVSBOICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTI6TDo6VSsiOworI2lmIEVOQUJMRV9GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGRpZmZfbG9uZ29wdHM7CisjZW5kaWYKKwlnZXRvcHQzMihhcmd2LCAiYWJkaUw6TnFyc1M6dFRVOnd1cEJFIiwKKwkJCSZMX2FyZywgJnNfc3RhcnQsICZvcHRfVV9jb250ZXh0KTsKKwlhcmd2ICs9IG9wdGluZDsKKwl3aGlsZSAoTF9hcmcpCisJCWxhYmVsWyEhbGFiZWxbMF1dID0gbGxpc3RfcG9wKCZMX2FyZyk7CisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWZpbGVbaV0gPSBhcmd2W2ldOworCQkvKiBDb21wYXQ6ICJkaWZmIGZpbGUgbmFtZV93aGljaF9kb2VzbnRfZXhpc3QiIGV4aXRzIHdpdGggMiAqLworCQlpZiAoTE9ORV9EQVNIKGZpbGVbaV0pKSB7CisJCQlmc3RhdChTVERJTl9GSUxFTk8sICZzdGJbaV0pOworCQkJZ290c3RkaW4rKzsKKwkJfSBlbHNlCisJCQl4c3RhdChmaWxlW2ldLCAmc3RiW2ldKTsKKwl9CisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMTsKKwlpZiAoZ290c3RkaW4gJiYgKFNfSVNESVIoc3RiWzBdLnN0X21vZGUpIHx8IFNfSVNESVIoc3RiWzFdLnN0X21vZGUpKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNvbXBhcmUgc3RkaW4gdG8gYSBkaXJlY3RvcnkiKTsKKworCS8qIENvbXBhcmUgbWV0YWRhdGEgdG8gY2hlY2sgaWYgdGhlIGZpbGVzIGFyZSB0aGUgc2FtZSBwaHlzaWNhbCBmaWxlLgorCSAqCisJICogQ29tbWVudCBmcm9tIGRpZmZ1dGlscyBzb3VyY2Ugc2F5czoKKwkgKiBQT1NJWCBzYXlzIHRoYXQgdHdvIGZpbGVzIGFyZSBpZGVudGljYWwgaWYgc3RfaW5vIGFuZCBzdF9kZXYgYXJlCisJICogdGhlIHNhbWUsIGJ1dCBtYW55IGZpbGUgc3lzdGVtcyBpbmNvcnJlY3RseSBhc3NpZ24gdGhlIHNhbWUgKGRldmljZSwKKwkgKiBpbm9kZSkgcGFpciB0byB0d28gZGlzdGluY3QgZmlsZXMsIGluY2x1ZGluZzoKKwkgKiBHTlUvTGludXggTkZTIHNlcnZlcnMgdGhhdCBleHBvcnQgYWxsIGxvY2FsIGZpbGUgc3lzdGVtcyBhcyBhCisJICogc2luZ2xlIE5GUyBmaWxlIHN5c3RlbSwgaWYgYSBsb2NhbCBkZXZpY2UgbnVtYmVyIChzdF9kZXYpIGV4Y2VlZHMKKwkgKiAyNTUsIG9yIGlmIGEgbG9jYWwgaW5vZGUgbnVtYmVyIChzdF9pbm8pIGV4Y2VlZHMgMTY3NzcyMTUuCisJICovCisJaWYgKEVOQUJMRV9ERVNLVE9QCisJICYmIHN0YlswXS5zdF9pbm8gPT0gc3RiWzFdLnN0X2lubworCSAmJiBzdGJbMF0uc3RfZGV2ID09IHN0YlsxXS5zdF9kZXYKKwkgJiYgc3RiWzBdLnN0X3NpemUgPT0gc3RiWzFdLnN0X3NpemUKKwkgJiYgc3RiWzBdLnN0X210aW1lID09IHN0YlsxXS5zdF9tdGltZQorCSAmJiBzdGJbMF0uc3RfY3RpbWUgPT0gc3RiWzFdLnN0X2N0aW1lCisJICYmIHN0YlswXS5zdF9tb2RlID09IHN0YlsxXS5zdF9tb2RlCisJICYmIHN0YlswXS5zdF9ubGluayA9PSBzdGJbMV0uc3RfbmxpbmsKKwkgJiYgc3RiWzBdLnN0X3VpZCA9PSBzdGJbMV0uc3RfdWlkCisJICYmIHN0YlswXS5zdF9naWQgPT0gc3RiWzFdLnN0X2dpZAorCSkgeworCQkvKiBmaWxlcyBhcmUgcGh5c2ljYWxseSB0aGUgc2FtZTsgbm8gbmVlZCB0byBjb21wYXJlIHRoZW0gKi8KKwkJcmV0dXJuIFNUQVRVU19TQU1FOworCX0KKworCWlmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSAmJiBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0RJRkZfRElSCisJCWRpZmZkaXIoZmlsZSwgc19zdGFydCk7CisjZWxzZQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gc3VwcG9ydCBmb3IgZGlyZWN0b3J5IGNvbXBhcmlzb24iKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWJvb2wgZGlyZmlsZSA9IFNfSVNESVIoc3RiWzBdLnN0X21vZGUpIHx8IFNfSVNESVIoc3RiWzFdLnN0X21vZGUpOworCQlib29sIGRpciA9IFNfSVNESVIoc3RiWzFdLnN0X21vZGUpOworCQlpZiAoZGlyZmlsZSkgeworCQkJY29uc3QgY2hhciAqc2xhc2ggPSBzdHJyY2hyKGZpbGVbIWRpcl0sICcvJyk7CisJCQlmaWxlW2Rpcl0gPSBjb25jYXRfcGF0aF9maWxlKGZpbGVbZGlyXSwgc2xhc2ggPyBzbGFzaCArIDEgOiBmaWxlWyFkaXJdKTsKKwkJCXhzdGF0KGZpbGVbZGlyXSwgJnN0YltkaXJdKTsKKwkJfQorCQkvKiBkaWZmcmVnIGNhbiBnZXQgbm9uLXJlZ3VsYXIgZmlsZXMgaGVyZSAqLworCQlwcmludF9zdGF0dXMoZ290c3RkaW4gPiAxID8gU1RBVFVTX1NBTUUgOiBkaWZmcmVnKGZpbGUpLCBmaWxlKTsKKworCQlpZiAoZGlyZmlsZSkKKwkJCWZyZWUoZmlsZVtkaXJdKTsKKwl9CisKKwlyZXR1cm4gZXhpdF9zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9lZGl0b3JzL2VkLmMgYi9idXN5Ym94LTEuMTkuMy9lZGl0b3JzL2VkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNTEzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvZWQuYwpAQCAtMCwwICsxLDEwMzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBieSBEYXZpZCBJLiBCZWxsCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBkaXN0cmlidXRlLCBvciBtb2RpZnkgdGhpcyBzb3VyY2UsCisgKiBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0IG5vdGljZSByZW1haW5zIGludGFjdC4KKyAqCisgKiBUaGUgImVkIiBidWlsdC1pbiBjb21tYW5kIChtdWNoIHNpbXBsaWZpZWQpCisgKi8KKworLy91c2FnZTojZGVmaW5lIGVkX3RyaXZpYWxfdXNhZ2UgIiIKKy8vdXNhZ2U6I2RlZmluZSBlZF9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCit0eXBlZGVmIHN0cnVjdCBMSU5FIHsKKwlzdHJ1Y3QgTElORSAqbmV4dDsKKwlzdHJ1Y3QgTElORSAqcHJldjsKKwlpbnQgbGVuOworCWNoYXIgZGF0YVsxXTsKK30gTElORTsKKworCisjZGVmaW5lIHNlYXJjaFN0cmluZyBiYl9jb21tb25fYnVmc2l6MQorCitlbnVtIHsKKwlVU0VSU0laRSA9IHNpemVvZihzZWFyY2hTdHJpbmcpID4gMTAyNCA/IDEwMjQKKwkgICAgICAgICA6IHNpemVvZihzZWFyY2hTdHJpbmcpIC0gMSwgLyogbWF4IGxpbmUgbGVuZ3RoIHR5cGVkIGluIGJ5IHVzZXIgKi8KKwlJTklUQlVGX1NJWkUgPSAxMDI0LCAvKiBpbml0aWFsIGJ1ZmZlciBzaXplICovCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IGN1ck51bTsKKwlpbnQgbGFzdE51bTsKKwlpbnQgYnVmVXNlZDsKKwlpbnQgYnVmU2l6ZTsKKwlMSU5FICpjdXJMaW5lOworCWNoYXIgKmJ1ZkJhc2U7CisJY2hhciAqYnVmUHRyOworCWNoYXIgKmZpbGVOYW1lOworCUxJTkUgbGluZXM7CisJc21hbGxpbnQgZGlydHk7CisJaW50IG1hcmtzWzI2XTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgY3VyTGluZSAgICAgICAgICAgIChHLmN1ckxpbmUgICAgICAgICAgICkKKyNkZWZpbmUgYnVmQmFzZSAgICAgICAgICAgIChHLmJ1ZkJhc2UgICAgICAgICAgICkKKyNkZWZpbmUgYnVmUHRyICAgICAgICAgICAgIChHLmJ1ZlB0ciAgICAgICAgICAgICkKKyNkZWZpbmUgZmlsZU5hbWUgICAgICAgICAgIChHLmZpbGVOYW1lICAgICAgICAgICkKKyNkZWZpbmUgY3VyTnVtICAgICAgICAgICAgIChHLmN1ck51bSAgICAgICAgICAgICkKKyNkZWZpbmUgbGFzdE51bSAgICAgICAgICAgIChHLmxhc3ROdW0gICAgICAgICAgICkKKyNkZWZpbmUgYnVmVXNlZCAgICAgICAgICAgIChHLmJ1ZlVzZWQgICAgICAgICAgICkKKyNkZWZpbmUgYnVmU2l6ZSAgICAgICAgICAgIChHLmJ1ZlNpemUgICAgICAgICAgICkKKyNkZWZpbmUgZGlydHkgICAgICAgICAgICAgIChHLmRpcnR5ICAgICAgICAgICAgICkKKyNkZWZpbmUgbGluZXMgICAgICAgICAgICAgIChHLmxpbmVzICAgICAgICAgICAgICkKKyNkZWZpbmUgbWFya3MgICAgICAgICAgICAgIChHLm1hcmtzICAgICAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIHZvaWQgZG9Db21tYW5kcyh2b2lkKTsKK3N0YXRpYyB2b2lkIHN1YkNvbW1hbmQoY29uc3QgY2hhciAqY21kLCBpbnQgbnVtMSwgaW50IG51bTIpOworc3RhdGljIGludCBnZXROdW0oY29uc3QgY2hhciAqKnJldGNwLCBzbWFsbGludCAqcmV0SGF2ZU51bSwgaW50ICpyZXROdW0pOworc3RhdGljIGludCBzZXRDdXJOdW0oaW50IG51bSk7CitzdGF0aWMgdm9pZCBhZGRMaW5lcyhpbnQgbnVtKTsKK3N0YXRpYyBpbnQgaW5zZXJ0TGluZShpbnQgbnVtLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGRlbGV0ZUxpbmVzKGludCBudW0xLCBpbnQgbnVtMik7CitzdGF0aWMgaW50IHByaW50TGluZXMoaW50IG51bTEsIGludCBudW0yLCBpbnQgZXhwYW5kRmxhZyk7CitzdGF0aWMgaW50IHdyaXRlTGluZXMoY29uc3QgY2hhciAqZmlsZSwgaW50IG51bTEsIGludCBudW0yKTsKK3N0YXRpYyBpbnQgcmVhZExpbmVzKGNvbnN0IGNoYXIgKmZpbGUsIGludCBudW0pOworc3RhdGljIGludCBzZWFyY2hMaW5lcyhjb25zdCBjaGFyICpzdHIsIGludCBudW0xLCBpbnQgbnVtMik7CitzdGF0aWMgTElORSAqZmluZExpbmUoaW50IG51bSk7CitzdGF0aWMgaW50IGZpbmRTdHJpbmcoY29uc3QgTElORSAqbHAsIGNvbnN0IGNoYXIgKiBzdHIsIGludCBsZW4sIGludCBvZmZzZXQpOworCisKK3N0YXRpYyBpbnQgYmFkX251bXMoaW50IG51bTEsIGludCBudW0yLCBjb25zdCBjaGFyICpmb3Jfd2hhdCkKK3sKKwlpZiAoKG51bTEgPCAxKSB8fCAobnVtMiA+IGxhc3ROdW0pIHx8IChudW0xID4gbnVtMikpIHsKKwkJYmJfZXJyb3JfbXNnKCJiYWQgbGluZSByYW5nZSBmb3IgJXMiLCBmb3Jfd2hhdCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY2hhciAqc2tpcF9ibGFuayhjb25zdCBjaGFyICpjcCkKK3sKKwl3aGlsZSAoaXNibGFuaygqY3ApKQorCQljcCsrOworCXJldHVybiAoY2hhciAqKWNwOworfQorCisKK2ludCBlZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZWRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUlOSVRfRygpOworCisJYnVmU2l6ZSA9IElOSVRCVUZfU0laRTsKKwlidWZCYXNlID0geG1hbGxvYyhidWZTaXplKTsKKwlidWZQdHIgPSBidWZCYXNlOworCWxpbmVzLm5leHQgPSAmbGluZXM7CisJbGluZXMucHJldiA9ICZsaW5lczsKKworCWlmIChhcmd2WzFdKSB7CisJCWZpbGVOYW1lID0geHN0cmR1cChhcmd2WzFdKTsKKwkJaWYgKCFyZWFkTGluZXMoZmlsZU5hbWUsIDEpKSB7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJCWlmIChsYXN0TnVtKQorCQkJc2V0Q3VyTnVtKDEpOworCQlkaXJ0eSA9IEZBTFNFOworCX0KKworCWRvQ29tbWFuZHMoKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisvKgorICogUmVhZCBjb21tYW5kcyB1bnRpbCB3ZSBhcmUgdG9sZCB0byBzdG9wLgorICovCitzdGF0aWMgdm9pZCBkb0NvbW1hbmRzKHZvaWQpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqZW5kYnVmLCBidWZbVVNFUlNJWkVdOworCWludCBsZW4sIG51bTEsIG51bTI7CisJc21hbGxpbnQgaGF2ZTEsIGhhdmUyOworCisJd2hpbGUgKFRSVUUpIHsKKwkJLyogUmV0dXJuczoKKwkJICogLTEgb24gcmVhZCBlcnJvcnMgb3IgRU9GLCBvciBvbiBiYXJlIEN0cmwtRC4KKwkJICogMCAgb24gY3RybC1DLAorCQkgKiA+MCBsZW5ndGggb2YgaW5wdXQgc3RyaW5nLCBpbmNsdWRpbmcgdGVybWluYXRpbmcgJ1xuJworCQkgKi8KKwkJbGVuID0gcmVhZF9saW5lX2lucHV0KE5VTEwsICI6ICIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIC8qdGltZW91dCovIC0xKTsKKwkJaWYgKGxlbiA8PSAwKQorCQkJcmV0dXJuOworCQllbmRidWYgPSAmYnVmW2xlbiAtIDFdOworCQl3aGlsZSAoKGVuZGJ1ZiA+IGJ1ZikgJiYgaXNibGFuayhlbmRidWZbLTFdKSkKKwkJCWVuZGJ1Zi0tOworCQkqZW5kYnVmID0gJ1wwJzsKKworCQljcCA9IHNraXBfYmxhbmsoYnVmKTsKKwkJaGF2ZTEgPSBGQUxTRTsKKwkJaGF2ZTIgPSBGQUxTRTsKKworCQlpZiAoKGN1ck51bSA9PSAwKSAmJiAobGFzdE51bSA+IDApKSB7CisJCQljdXJOdW0gPSAxOworCQkJY3VyTGluZSA9IGxpbmVzLm5leHQ7CisJCX0KKworCQlpZiAoIWdldE51bSgmY3AsICZoYXZlMSwgJm51bTEpKQorCQkJY29udGludWU7CisKKwkJY3AgPSBza2lwX2JsYW5rKGNwKTsKKworCQlpZiAoKmNwID09ICcsJykgeworCQkJY3ArKzsKKwkJCWlmICghZ2V0TnVtKCZjcCwgJmhhdmUyLCAmbnVtMikpCisJCQkJY29udGludWU7CisJCQlpZiAoIWhhdmUxKQorCQkJCW51bTEgPSAxOworCQkJaWYgKCFoYXZlMikKKwkJCQludW0yID0gbGFzdE51bTsKKwkJCWhhdmUxID0gVFJVRTsKKwkJCWhhdmUyID0gVFJVRTsKKwkJfQorCQlpZiAoIWhhdmUxKQorCQkJbnVtMSA9IGN1ck51bTsKKwkJaWYgKCFoYXZlMikKKwkJCW51bTIgPSBudW0xOworCisJCXN3aXRjaCAoKmNwKyspIHsKKwkJY2FzZSAnYSc6CisJCQlhZGRMaW5lcyhudW0xICsgMSk7CisJCQlicmVhazsKKworCQljYXNlICdjJzoKKwkJCWRlbGV0ZUxpbmVzKG51bTEsIG51bTIpOworCQkJYWRkTGluZXMobnVtMSk7CisJCQlicmVhazsKKworCQljYXNlICdkJzoKKwkJCWRlbGV0ZUxpbmVzKG51bTEsIG51bTIpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnZic6CisJCQlpZiAoKmNwICYmICFpc2JsYW5rKCpjcCkpIHsKKwkJCQliYl9lcnJvcl9tc2coImJhZCBmaWxlIGNvbW1hbmQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNwID0gc2tpcF9ibGFuayhjcCk7CisJCQlpZiAoKmNwID09ICdcMCcpIHsKKwkJCQlpZiAoZmlsZU5hbWUpCisJCQkJCXByaW50ZigiXCIlc1wiXG4iLCBmaWxlTmFtZSk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIk5vIGZpbGUgbmFtZVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmcmVlKGZpbGVOYW1lKTsKKwkJCWZpbGVOYW1lID0geHN0cmR1cChjcCk7CisJCQlicmVhazsKKworCQljYXNlICdpJzoKKwkJCWFkZExpbmVzKG51bTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnayc6CisJCQljcCA9IHNraXBfYmxhbmsoY3ApOworCQkJaWYgKCgqY3AgPCAnYScpIHx8ICgqY3AgPiAneicpIHx8IGNwWzFdKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJiYWQgbWFyayBuYW1lIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltYXJrc1sqY3AgLSAnYSddID0gbnVtMjsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2wnOgorCQkJcHJpbnRMaW5lcyhudW0xLCBudW0yLCBUUlVFKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3AnOgorCQkJcHJpbnRMaW5lcyhudW0xLCBudW0yLCBGQUxTRSk7CisJCQlicmVhazsKKworCQljYXNlICdxJzoKKwkJCWNwID0gc2tpcF9ibGFuayhjcCk7CisJCQlpZiAoaGF2ZTEgfHwgKmNwKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJiYWQgcXVpdCBjb21tYW5kIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWRpcnR5KQorCQkJCXJldHVybjsKKwkJCWxlbiA9IHJlYWRfbGluZV9pbnB1dChOVUxMLCAiUmVhbGx5IHF1aXQ/ICIsIGJ1ZiwgMTYsIC8qdGltZW91dCovIC0xKTsKKwkJCS8qIHJlYWQgZXJyb3IvRU9GIC0gbm8gd2F5IHRvIGNvbnRpbnVlICovCisJCQlpZiAobGVuIDwgMCkKKwkJCQlyZXR1cm47CisJCQljcCA9IHNraXBfYmxhbmsoYnVmKTsKKwkJCWlmICgoKmNwIHwgMHgyMCkgPT0gJ3knKSAvKiBZIG9yIHkgKi8KKwkJCQlyZXR1cm47CisJCQlicmVhazsKKworCQljYXNlICdyJzoKKwkJCWlmICgqY3AgJiYgIWlzYmxhbmsoKmNwKSkgeworCQkJCWJiX2Vycm9yX21zZygiYmFkIHJlYWQgY29tbWFuZCIpOworCQkJCWJyZWFrOworCQkJfQorCQkJY3AgPSBza2lwX2JsYW5rKGNwKTsKKwkJCWlmICgqY3AgPT0gJ1wwJykgeworCQkJCWJiX2Vycm9yX21zZygibm8gZmlsZSBuYW1lIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWhhdmUxKQorCQkJCW51bTEgPSBsYXN0TnVtOworCQkJaWYgKHJlYWRMaW5lcyhjcCwgbnVtMSArIDEpKQorCQkJCWJyZWFrOworCQkJaWYgKGZpbGVOYW1lID09IE5VTEwpCisJCQkJZmlsZU5hbWUgPSB4c3RyZHVwKGNwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3MnOgorCQkJc3ViQ29tbWFuZChjcCwgbnVtMSwgbnVtMik7CisJCQlicmVhazsKKworCQljYXNlICd3JzoKKwkJCWlmICgqY3AgJiYgIWlzYmxhbmsoKmNwKSkgeworCQkJCWJiX2Vycm9yX21zZygiYmFkIHdyaXRlIGNvbW1hbmQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNwID0gc2tpcF9ibGFuayhjcCk7CisJCQlpZiAoIWhhdmUxKSB7CisJCQkJbnVtMSA9IDE7CisJCQkJbnVtMiA9IGxhc3ROdW07CisJCQl9CisJCQlpZiAoKmNwID09ICdcMCcpCisJCQkJY3AgPSBmaWxlTmFtZTsKKwkJCWlmIChjcCA9PSBOVUxMKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJubyBmaWxlIG5hbWUgc3BlY2lmaWVkIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQl3cml0ZUxpbmVzKGNwLCBudW0xLCBudW0yKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3onOgorCQkJc3dpdGNoICgqY3ApIHsKKwkJCWNhc2UgJy0nOgorCQkJCXByaW50TGluZXMoY3VyTnVtIC0gMjEsIGN1ck51bSwgRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSAnLic6CisJCQkJcHJpbnRMaW5lcyhjdXJOdW0gLSAxMSwgY3VyTnVtICsgMTAsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRMaW5lcyhjdXJOdW0sIGN1ck51bSArIDIxLCBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICcuJzoKKwkJCWlmIChoYXZlMSkgeworCQkJCWJiX2Vycm9yX21zZygibm8gYXJndW1lbnRzIGFsbG93ZWQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXByaW50TGluZXMoY3VyTnVtLCBjdXJOdW0sIEZBTFNFKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJy0nOgorCQkJaWYgKHNldEN1ck51bShjdXJOdW0gLSAxKSkKKwkJCQlwcmludExpbmVzKGN1ck51bSwgY3VyTnVtLCBGQUxTRSk7CisJCQlicmVhazsKKworCQljYXNlICc9JzoKKwkJCXByaW50ZigiJWRcbiIsIG51bTEpOworCQkJYnJlYWs7CisJCWNhc2UgJ1wwJzoKKwkJCWlmIChoYXZlMSkgeworCQkJCXByaW50TGluZXMobnVtMiwgbnVtMiwgRkFMU0UpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNldEN1ck51bShjdXJOdW0gKyAxKSkKKwkJCQlwcmludExpbmVzKGN1ck51bSwgY3VyTnVtLCBGQUxTRSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYmJfZXJyb3JfbXNnKCJ1bmltcGxlbWVudGVkIGNvbW1hbmQiKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKKy8qCisgKiBEbyB0aGUgc3Vic3RpdHV0ZSBjb21tYW5kLgorICogVGhlIGN1cnJlbnQgbGluZSBpcyBzZXQgdG8gdGhlIGxhc3Qgc3Vic3RpdHV0aW9uIGRvbmUuCisgKi8KK3N0YXRpYyB2b2lkIHN1YkNvbW1hbmQoY29uc3QgY2hhciAqY21kLCBpbnQgbnVtMSwgaW50IG51bTIpCit7CisJY2hhciAqY3AsICpvbGRTdHIsICpuZXdTdHIsIGJ1ZltVU0VSU0laRV07CisJaW50IGRlbGltLCBvbGRMZW4sIG5ld0xlbiwgZGVsdGFMZW4sIG9mZnNldDsKKwlMSU5FICpscCwgKm5scDsKKwlpbnQgZ2xvYmFsRmxhZywgcHJpbnRGbGFnLCBkaWRTdWIsIG5lZWRQcmludDsKKworCWlmIChiYWRfbnVtcyhudW0xLCBudW0yLCAic3Vic3RpdHV0ZSIpKQorCQlyZXR1cm47CisKKwlnbG9iYWxGbGFnID0gRkFMU0U7CisJcHJpbnRGbGFnID0gRkFMU0U7CisJZGlkU3ViID0gRkFMU0U7CisJbmVlZFByaW50ID0gRkFMU0U7CisKKwkvKgorCSAqIENvcHkgdGhlIGNvbW1hbmQgc28gd2UgY2FuIG1vZGlmeSBpdC4KKwkgKi8KKwlzdHJjcHkoYnVmLCBjbWQpOworCWNwID0gYnVmOworCisJaWYgKGlzYmxhbmsoKmNwKSB8fCAoKmNwID09ICdcMCcpKSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGRlbGltaXRlciBmb3Igc3Vic3RpdHV0ZSIpOworCQlyZXR1cm47CisJfQorCisJZGVsaW0gPSAqY3ArKzsKKwlvbGRTdHIgPSBjcDsKKworCWNwID0gc3RyY2hyKGNwLCBkZWxpbSk7CisJaWYgKGNwID09IE5VTEwpIHsKKwkJYmJfZXJyb3JfbXNnKCJtaXNzaW5nIDJuZCBkZWxpbWl0ZXIgZm9yIHN1YnN0aXR1dGUiKTsKKwkJcmV0dXJuOworCX0KKworCSpjcCsrID0gJ1wwJzsKKworCW5ld1N0ciA9IGNwOworCWNwID0gc3RyY2hyKGNwLCBkZWxpbSk7CisKKwlpZiAoY3ApCisJCSpjcCsrID0gJ1wwJzsKKwllbHNlCisJCWNwID0gKGNoYXIqKSIiOworCisJd2hpbGUgKCpjcCkgc3dpdGNoICgqY3ArKykgeworCQljYXNlICdnJzoKKwkJCWdsb2JhbEZsYWcgPSBUUlVFOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcHJpbnRGbGFnID0gVFJVRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIG9wdGlvbiBmb3Igc3Vic3RpdHV0ZSIpOworCQkJcmV0dXJuOworCX0KKworCWlmICgqb2xkU3RyID09ICdcMCcpIHsKKwkJaWYgKHNlYXJjaFN0cmluZ1swXSA9PSAnXDAnKSB7CisJCQliYl9lcnJvcl9tc2coIm5vIHByZXZpb3VzIHNlYXJjaCBzdHJpbmciKTsKKwkJCXJldHVybjsKKwkJfQorCQlvbGRTdHIgPSBzZWFyY2hTdHJpbmc7CisJfQorCisJaWYgKG9sZFN0ciAhPSBzZWFyY2hTdHJpbmcpCisJCXN0cmNweShzZWFyY2hTdHJpbmcsIG9sZFN0cik7CisKKwlscCA9IGZpbmRMaW5lKG51bTEpOworCWlmIChscCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlvbGRMZW4gPSBzdHJsZW4ob2xkU3RyKTsKKwluZXdMZW4gPSBzdHJsZW4obmV3U3RyKTsKKwlkZWx0YUxlbiA9IG5ld0xlbiAtIG9sZExlbjsKKwlvZmZzZXQgPSAwOworCW5scCA9IE5VTEw7CisKKwl3aGlsZSAobnVtMSA8PSBudW0yKSB7CisJCW9mZnNldCA9IGZpbmRTdHJpbmcobHAsIG9sZFN0ciwgb2xkTGVuLCBvZmZzZXQpOworCisJCWlmIChvZmZzZXQgPCAwKSB7CisJCQlpZiAobmVlZFByaW50KSB7CisJCQkJcHJpbnRMaW5lcyhudW0xLCBudW0xLCBGQUxTRSk7CisJCQkJbmVlZFByaW50ID0gRkFMU0U7CisJCQl9CisJCQlvZmZzZXQgPSAwOworCQkJbHAgPSBscC0+bmV4dDsKKwkJCW51bTErKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbmVlZFByaW50ID0gcHJpbnRGbGFnOworCQlkaWRTdWIgPSBUUlVFOworCQlkaXJ0eSA9IFRSVUU7CisKKwkJLyoKKwkJICogSWYgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBpcyB0aGUgc2FtZSBzaXplIG9yIHNob3J0ZXIKKwkJICogdGhhbiB0aGUgb2xkIHN0cmluZywgdGhlbiB0aGUgc3Vic3RpdHV0aW9uIGlzIGVhc3kuCisJCSAqLworCQlpZiAoZGVsdGFMZW4gPD0gMCkgeworCQkJbWVtY3B5KCZscC0+ZGF0YVtvZmZzZXRdLCBuZXdTdHIsIG5ld0xlbik7CisJCQlpZiAoZGVsdGFMZW4pIHsKKwkJCQltZW1jcHkoJmxwLT5kYXRhW29mZnNldCArIG5ld0xlbl0sCisJCQkJCSZscC0+ZGF0YVtvZmZzZXQgKyBvbGRMZW5dLAorCQkJCQlscC0+bGVuIC0gb2Zmc2V0IC0gb2xkTGVuKTsKKworCQkJCWxwLT5sZW4gKz0gZGVsdGFMZW47CisJCQl9CisJCQlvZmZzZXQgKz0gbmV3TGVuOworCQkJaWYgKGdsb2JhbEZsYWcpCisJCQkJY29udGludWU7CisJCQlpZiAobmVlZFByaW50KSB7CisJCQkJcHJpbnRMaW5lcyhudW0xLCBudW0xLCBGQUxTRSk7CisJCQkJbmVlZFByaW50ID0gRkFMU0U7CisJCQl9CisJCQlscCA9IGxwLT5uZXh0OworCQkJbnVtMSsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBUaGUgbmV3IHN0cmluZyBpcyBsYXJnZXIsIHNvIGFsbG9jYXRlIGEgbmV3IGxpbmUKKwkJICogc3RydWN0dXJlIGFuZCB1c2UgdGhhdC4gIExpbmsgaXQgaW4gcGxhY2Ugb2YKKwkJICogdGhlIG9sZCBsaW5lIHN0cnVjdHVyZS4KKwkJICovCisJCW5scCA9IHhtYWxsb2Moc2l6ZW9mKExJTkUpICsgbHAtPmxlbiArIGRlbHRhTGVuKTsKKworCQlubHAtPmxlbiA9IGxwLT5sZW4gKyBkZWx0YUxlbjsKKworCQltZW1jcHkobmxwLT5kYXRhLCBscC0+ZGF0YSwgb2Zmc2V0KTsKKwkJbWVtY3B5KCZubHAtPmRhdGFbb2Zmc2V0XSwgbmV3U3RyLCBuZXdMZW4pOworCQltZW1jcHkoJm5scC0+ZGF0YVtvZmZzZXQgKyBuZXdMZW5dLAorCQkJJmxwLT5kYXRhW29mZnNldCArIG9sZExlbl0sCisJCQlscC0+bGVuIC0gb2Zmc2V0IC0gb2xkTGVuKTsKKworCQlubHAtPm5leHQgPSBscC0+bmV4dDsKKwkJbmxwLT5wcmV2ID0gbHAtPnByZXY7CisJCW5scC0+cHJldi0+bmV4dCA9IG5scDsKKwkJbmxwLT5uZXh0LT5wcmV2ID0gbmxwOworCisJCWlmIChjdXJMaW5lID09IGxwKQorCQkJY3VyTGluZSA9IG5scDsKKworCQlmcmVlKGxwKTsKKwkJbHAgPSBubHA7CisKKwkJb2Zmc2V0ICs9IG5ld0xlbjsKKworCQlpZiAoZ2xvYmFsRmxhZykKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZWVkUHJpbnQpIHsKKwkJCXByaW50TGluZXMobnVtMSwgbnVtMSwgRkFMU0UpOworCQkJbmVlZFByaW50ID0gRkFMU0U7CisJCX0KKworCQlscCA9IGxwLT5uZXh0OworCQludW0xKys7CisJfQorCisJaWYgKCFkaWRTdWIpCisJCWJiX2Vycm9yX21zZygibm8gc3Vic3RpdHV0aW9ucyBmb3VuZCBmb3IgXCIlc1wiIiwgb2xkU3RyKTsKK30KKworCisvKgorICogU2VhcmNoIGEgbGluZSBmb3IgdGhlIHNwZWNpZmllZCBzdHJpbmcgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZAorICogb2Zmc2V0IGluIHRoZSBsaW5lLiAgUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBmb3VuZCBzdHJpbmcsIG9yIC0xLgorICovCitzdGF0aWMgaW50IGZpbmRTdHJpbmcoY29uc3QgTElORSAqbHAsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbiwgaW50IG9mZnNldCkKK3sKKwlpbnQgbGVmdDsKKwljb25zdCBjaGFyICpjcCwgKm5jcDsKKworCWNwID0gJmxwLT5kYXRhW29mZnNldF07CisJbGVmdCA9IGxwLT5sZW4gLSBvZmZzZXQ7CisKKwl3aGlsZSAobGVmdCA+PSBsZW4pIHsKKwkJbmNwID0gbWVtY2hyKGNwLCAqc3RyLCBsZWZ0KTsKKwkJaWYgKG5jcCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQlsZWZ0IC09IChuY3AgLSBjcCk7CisJCWlmIChsZWZ0IDwgbGVuKQorCQkJcmV0dXJuIC0xOworCQljcCA9IG5jcDsKKwkJaWYgKG1lbWNtcChjcCwgc3RyLCBsZW4pID09IDApCisJCQlyZXR1cm4gKGNwIC0gbHAtPmRhdGEpOworCQljcCsrOworCQlsZWZ0LS07CisJfQorCisJcmV0dXJuIC0xOworfQorCisKKy8qCisgKiBBZGQgbGluZXMgd2hpY2ggYXJlIHR5cGVkIGluIGJ5IHRoZSB1c2VyLgorICogVGhlIGxpbmVzIGFyZSBpbnNlcnRlZCBqdXN0IGJlZm9yZSB0aGUgc3BlY2lmaWVkIGxpbmUgbnVtYmVyLgorICogVGhlIGxpbmVzIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgbGluZSBjb250YWluaW5nIGEgc2luZ2xlIGRvdCAodWdseSEpLAorICogb3IgYnkgYW4gZW5kIG9mIGZpbGUuCisgKi8KK3N0YXRpYyB2b2lkIGFkZExpbmVzKGludCBudW0pCit7CisJaW50IGxlbjsKKwljaGFyIGJ1ZltVU0VSU0laRSArIDFdOworCisJd2hpbGUgKDEpIHsKKwkJLyogUmV0dXJuczoKKwkJICogLTEgb24gcmVhZCBlcnJvcnMgb3IgRU9GLCBvciBvbiBiYXJlIEN0cmwtRC4KKwkJICogMCAgb24gY3RybC1DLAorCQkgKiA+MCBsZW5ndGggb2YgaW5wdXQgc3RyaW5nLCBpbmNsdWRpbmcgdGVybWluYXRpbmcgJ1xuJworCQkgKi8KKwkJbGVuID0gcmVhZF9saW5lX2lucHV0KE5VTEwsICIiLCBidWYsIHNpemVvZihidWYpLCAvKnRpbWVvdXQqLyAtMSk7CisJCWlmIChsZW4gPD0gMCkgeworCQkJLyogUHJldmlvdXNseSwgY3RybC1DIHdhcyBleGl0aW5nIHRvIHNoZWxsLgorCQkJICogTm93IHdlIGV4aXQgdG8gZWQgcHJvbXB0LiBJcyBpbiBpbXBvcnRhbnQ/ICovCisJCQlyZXR1cm47CisJCX0KKwkJaWYgKChidWZbMF0gPT0gJy4nKSAmJiAoYnVmWzFdID09ICdcbicpICYmIChidWZbMl0gPT0gJ1wwJykpCisJCQlyZXR1cm47CisJCWlmICghaW5zZXJ0TGluZShudW0rKywgYnVmLCBsZW4pKQorCQkJcmV0dXJuOworCX0KK30KKworCisvKgorICogUGFyc2UgYSBsaW5lIG51bWJlciBhcmd1bWVudCBpZiBpdCBpcyBwcmVzZW50LiAgVGhpcyBpcyBhIHN1bQorICogb3IgZGlmZmVyZW5jZSBvZiBudW1iZXJzLCAnLicsICckJywgJ3gsIG9yIGEgc2VhcmNoIHN0cmluZy4KKyAqIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsICh3aGV0aGVyIG9yIG5vdCB0aGVyZSB3YXMgYSBudW1iZXIpLgorICogUmV0dXJucyBGQUxTRSBpZiB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yLCB3aXRoIGEgbWVzc2FnZSBvdXRwdXQuCisgKiBXaGV0aGVyIHRoZXJlIHdhcyBhIG51bWJlciBpcyByZXR1cm5lZCBpbmRpcmVjdGx5LCBhcyBpcyB0aGUgbnVtYmVyLgorICogVGhlIGNoYXJhY3RlciBwb2ludGVyIHdoaWNoIHN0b3BwZWQgdGhlIHNjYW4gaXMgYWxzbyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBnZXROdW0oY29uc3QgY2hhciAqKnJldGNwLCBzbWFsbGludCAqcmV0SGF2ZU51bSwgaW50ICpyZXROdW0pCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqZW5kU3RyLCBzdHJbVVNFUlNJWkVdOworCWludCB2YWx1ZSwgbnVtOworCXNtYWxsaW50IGhhdmVOdW0sIG1pbnVzOworCisJY3AgPSAqcmV0Y3A7CisJdmFsdWUgPSAwOworCWhhdmVOdW0gPSBGQUxTRTsKKwltaW51cyA9IDA7CisKKwl3aGlsZSAoVFJVRSkgeworCQljcCA9IHNraXBfYmxhbmsoY3ApOworCisJCXN3aXRjaCAoKmNwKSB7CisJCQljYXNlICcuJzoKKwkJCQloYXZlTnVtID0gVFJVRTsKKwkJCQludW0gPSBjdXJOdW07CisJCQkJY3ArKzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnJCc6CisJCQkJaGF2ZU51bSA9IFRSVUU7CisJCQkJbnVtID0gbGFzdE51bTsKKwkJCQljcCsrOworCQkJCWJyZWFrOworCisJCQljYXNlICdcJyc6CisJCQkJY3ArKzsKKwkJCQlpZiAoKCpjcCA8ICdhJykgfHwgKCpjcCA+ICd6JykpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJiYWQgbWFyayBuYW1lIik7CisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQl9CisJCQkJaGF2ZU51bSA9IFRSVUU7CisJCQkJbnVtID0gbWFya3NbKmNwKysgLSAnYSddOworCQkJCWJyZWFrOworCisJCQljYXNlICcvJzoKKwkJCQlzdHJjcHkoc3RyLCArK2NwKTsKKwkJCQllbmRTdHIgPSBzdHJjaHIoc3RyLCAnLycpOworCQkJCWlmIChlbmRTdHIpIHsKKwkJCQkJKmVuZFN0cisrID0gJ1wwJzsKKwkJCQkJY3AgKz0gKGVuZFN0ciAtIHN0cik7CisJCQkJfSBlbHNlCisJCQkJCWNwID0gIiI7CisJCQkJbnVtID0gc2VhcmNoTGluZXMoc3RyLCBjdXJOdW0sIGxhc3ROdW0pOworCQkJCWlmIChudW0gPT0gMCkKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCWhhdmVOdW0gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWlmICghaXNkaWdpdCgqY3ApKSB7CisJCQkJCSpyZXRjcCA9IGNwOworCQkJCQkqcmV0SGF2ZU51bSA9IGhhdmVOdW07CisJCQkJCSpyZXROdW0gPSB2YWx1ZTsKKwkJCQkJcmV0dXJuIFRSVUU7CisJCQkJfQorCQkJCW51bSA9IDA7CisJCQkJd2hpbGUgKGlzZGlnaXQoKmNwKSkKKwkJCQkJbnVtID0gbnVtICogMTAgKyAqY3ArKyAtICcwJzsKKwkJCQloYXZlTnVtID0gVFJVRTsKKwkJCQlicmVhazsKKwkJfQorCisJCXZhbHVlICs9IChtaW51cyA/IC1udW0gOiBudW0pOworCisJCWNwID0gc2tpcF9ibGFuayhjcCk7CisKKwkJc3dpdGNoICgqY3ApIHsKKwkJCWNhc2UgJy0nOgorCQkJCW1pbnVzID0gMTsKKwkJCQljcCsrOworCQkJCWJyZWFrOworCisJCQljYXNlICcrJzoKKwkJCQltaW51cyA9IDA7CisJCQkJY3ArKzsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkqcmV0Y3AgPSBjcDsKKwkJCQkqcmV0SGF2ZU51bSA9IGhhdmVOdW07CisJCQkJKnJldE51bSA9IHZhbHVlOworCQkJCXJldHVybiBUUlVFOworCQl9CisJfQorfQorCisKKy8qCisgKiBSZWFkIGxpbmVzIGZyb20gYSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgbGluZSBudW1iZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLgorICovCitzdGF0aWMgaW50IHJlYWRMaW5lcyhjb25zdCBjaGFyICpmaWxlLCBpbnQgbnVtKQoreworCWludCBmZCwgY2M7CisJaW50IGxlbiwgbGluZUNvdW50LCBjaGFyQ291bnQ7CisJY2hhciAqY3A7CisKKwlpZiAoKG51bSA8IDEpIHx8IChudW0gPiBsYXN0TnVtICsgMSkpIHsKKwkJYmJfZXJyb3JfbXNnKCJiYWQgbGluZSBmb3IgcmVhZCIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJZmQgPSBvcGVuKGZpbGUsIDApOworCWlmIChmZCA8IDApIHsKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlidWZQdHIgPSBidWZCYXNlOworCWJ1ZlVzZWQgPSAwOworCWxpbmVDb3VudCA9IDA7CisJY2hhckNvdW50ID0gMDsKKwljYyA9IDA7CisKKwlwcmludGYoIlwiJXNcIiwgIiwgZmlsZSk7CisJZmZsdXNoX2FsbCgpOworCisJZG8geworCQljcCA9IG1lbWNocihidWZQdHIsICdcbicsIGJ1ZlVzZWQpOworCisJCWlmIChjcCkgeworCQkJbGVuID0gKGNwIC0gYnVmUHRyKSArIDE7CisJCQlpZiAoIWluc2VydExpbmUobnVtLCBidWZQdHIsIGxlbikpIHsKKwkJCQljbG9zZShmZCk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnVmUHRyICs9IGxlbjsKKwkJCWJ1ZlVzZWQgLT0gbGVuOworCQkJY2hhckNvdW50ICs9IGxlbjsKKwkJCWxpbmVDb3VudCsrOworCQkJbnVtKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChidWZQdHIgIT0gYnVmQmFzZSkgeworCQkJbWVtY3B5KGJ1ZkJhc2UsIGJ1ZlB0ciwgYnVmVXNlZCk7CisJCQlidWZQdHIgPSBidWZCYXNlICsgYnVmVXNlZDsKKwkJfQorCisJCWlmIChidWZVc2VkID49IGJ1ZlNpemUpIHsKKwkJCWxlbiA9IChidWZTaXplICogMykgLyAyOworCQkJY3AgPSB4cmVhbGxvYyhidWZCYXNlLCBsZW4pOworCQkJYnVmQmFzZSA9IGNwOworCQkJYnVmUHRyID0gYnVmQmFzZSArIGJ1ZlVzZWQ7CisJCQlidWZTaXplID0gbGVuOworCQl9CisKKwkJY2MgPSBzYWZlX3JlYWQoZmQsIGJ1ZlB0ciwgYnVmU2l6ZSAtIGJ1ZlVzZWQpOworCQlidWZVc2VkICs9IGNjOworCQlidWZQdHIgPSBidWZCYXNlOworCisJfSB3aGlsZSAoY2MgPiAwKTsKKworCWlmIChjYyA8IDApIHsKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChidWZVc2VkKSB7CisJCWlmICghaW5zZXJ0TGluZShudW0sIGJ1ZlB0ciwgYnVmVXNlZCkpIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlsaW5lQ291bnQrKzsKKwkJY2hhckNvdW50ICs9IGJ1ZlVzZWQ7CisJfQorCisJY2xvc2UoZmQpOworCisJcHJpbnRmKCIlZCBsaW5lcyVzLCAlZCBjaGFyc1xuIiwgbGluZUNvdW50LAorCQkoYnVmVXNlZCA/ICIgKGluY29tcGxldGUpIiA6ICIiKSwgY2hhckNvdW50KTsKKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBXcml0ZSB0aGUgc3BlY2lmaWVkIGxpbmVzIG91dCB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCisgKiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgb3IgRkFMU0Ugb24gYW4gZXJyb3Igd2l0aCBhIG1lc3NhZ2Ugb3V0cHV0LgorICovCitzdGF0aWMgaW50IHdyaXRlTGluZXMoY29uc3QgY2hhciAqZmlsZSwgaW50IG51bTEsIGludCBudW0yKQoreworCUxJTkUgKmxwOworCWludCBmZCwgbGluZUNvdW50LCBjaGFyQ291bnQ7CisKKwlpZiAoYmFkX251bXMobnVtMSwgbnVtMiwgIndyaXRlIikpCisJCXJldHVybiBGQUxTRTsKKworCWxpbmVDb3VudCA9IDA7CisJY2hhckNvdW50ID0gMDsKKworCWZkID0gY3JlYXQoZmlsZSwgMDY2Nik7CisJaWYgKGZkIDwgMCkgeworCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXByaW50ZigiXCIlc1wiLCAiLCBmaWxlKTsKKwlmZmx1c2hfYWxsKCk7CisKKwlscCA9IGZpbmRMaW5lKG51bTEpOworCWlmIChscCA9PSBOVUxMKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXdoaWxlIChudW0xKysgPD0gbnVtMikgeworCQlpZiAoZnVsbF93cml0ZShmZCwgbHAtPmRhdGEsIGxwLT5sZW4pICE9IGxwLT5sZW4pIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGUpOworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCWNoYXJDb3VudCArPSBscC0+bGVuOworCQlsaW5lQ291bnQrKzsKKwkJbHAgPSBscC0+bmV4dDsKKwl9CisKKwlpZiAoY2xvc2UoZmQpIDwgMCkgeworCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXByaW50ZigiJWQgbGluZXMsICVkIGNoYXJzXG4iLCBsaW5lQ291bnQsIGNoYXJDb3VudCk7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFByaW50IGxpbmVzIGluIGEgc3BlY2lmaWVkIHJhbmdlLgorICogVGhlIGxhc3QgbGluZSBwcmludGVkIGJlY29tZXMgdGhlIGN1cnJlbnQgbGluZS4KKyAqIElmIGV4cGFuZEZsYWcgaXMgVFJVRSwgdGhlbiB0aGUgbGluZSBpcyBwcmludGVkIHNwZWNpYWxseSB0bworICogc2hvdyBtYWdpYyBjaGFyYWN0ZXJzLgorICovCitzdGF0aWMgaW50IHByaW50TGluZXMoaW50IG51bTEsIGludCBudW0yLCBpbnQgZXhwYW5kRmxhZykKK3sKKwljb25zdCBMSU5FICpscDsKKwljb25zdCBjaGFyICpjcDsKKwlpbnQgY2gsIGNvdW50OworCisJaWYgKGJhZF9udW1zKG51bTEsIG51bTIsICJwcmludCIpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlscCA9IGZpbmRMaW5lKG51bTEpOworCWlmIChscCA9PSBOVUxMKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSAobnVtMSA8PSBudW0yKSB7CisJCWlmICghZXhwYW5kRmxhZykgeworCQkJd3JpdGUoU1RET1VUX0ZJTEVOTywgbHAtPmRhdGEsIGxwLT5sZW4pOworCQkJc2V0Q3VyTnVtKG51bTErKyk7CisJCQlscCA9IGxwLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBTaG93IGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgY2hhcmFjdGVycyB3aXRoIHRoZQorCQkgKiBoaWdoIGJpdCBzZXQgc3BlY2lhbGx5LgorCQkgKi8KKwkJY3AgPSBscC0+ZGF0YTsKKwkJY291bnQgPSBscC0+bGVuOworCisJCWlmICgoY291bnQgPiAwKSAmJiAoY3BbY291bnQgLSAxXSA9PSAnXG4nKSkKKwkJCWNvdW50LS07CisKKwkJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCQljaCA9ICh1bnNpZ25lZCBjaGFyKSAqY3ArKzsKKwkJCWZwdXRjX3ByaW50YWJsZShjaCB8IFBSSU5UQUJMRV9NRVRBLCBzdGRvdXQpOworCQl9CisKKwkJZnB1dHMoIiRcbiIsIHN0ZG91dCk7CisKKwkJc2V0Q3VyTnVtKG51bTErKyk7CisJCWxwID0gbHAtPm5leHQ7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIEluc2VydCBhIG5ldyBsaW5lIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgorICogVGhlIGxpbmUgaXMgaW5zZXJ0ZWQgc28gYXMgdG8gYmVjb21lIHRoZSBzcGVjaWZpZWQgbGluZSwKKyAqIHRodXMgcHVzaGluZyBhbnkgZXhpc3RpbmcgYW5kIGZ1cnRoZXIgbGluZXMgZG93biBvbmUuCisgKiBUaGUgaW5zZXJ0ZWQgbGluZSBpcyBhbHNvIHNldCB0byBiZWNvbWUgdGhlIGN1cnJlbnQgbGluZS4KKyAqIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgaW50IGluc2VydExpbmUoaW50IG51bSwgY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlMSU5FICpuZXdMcCwgKmxwOworCisJaWYgKChudW0gPCAxKSB8fCAobnVtID4gbGFzdE51bSArIDEpKSB7CisJCWJiX2Vycm9yX21zZygiaW5zZXJ0aW5nIGF0IGJhZCBsaW5lIG51bWJlciIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJbmV3THAgPSB4bWFsbG9jKHNpemVvZihMSU5FKSArIGxlbiAtIDEpOworCisJbWVtY3B5KG5ld0xwLT5kYXRhLCBkYXRhLCBsZW4pOworCW5ld0xwLT5sZW4gPSBsZW47CisKKwlpZiAobnVtID4gbGFzdE51bSkKKwkJbHAgPSAmbGluZXM7CisJZWxzZSB7CisJCWxwID0gZmluZExpbmUobnVtKTsKKwkJaWYgKGxwID09IE5VTEwpIHsKKwkJCWZyZWUoKGNoYXIgKikgbmV3THApOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJbmV3THAtPm5leHQgPSBscDsKKwluZXdMcC0+cHJldiA9IGxwLT5wcmV2OworCWxwLT5wcmV2LT5uZXh0ID0gbmV3THA7CisJbHAtPnByZXYgPSBuZXdMcDsKKworCWxhc3ROdW0rKzsKKwlkaXJ0eSA9IFRSVUU7CisJcmV0dXJuIHNldEN1ck51bShudW0pOworfQorCisKKy8qCisgKiBEZWxldGUgbGluZXMgZnJvbSB0aGUgZ2l2ZW4gcmFuZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGRlbGV0ZUxpbmVzKGludCBudW0xLCBpbnQgbnVtMikKK3sKKwlMSU5FICpscCwgKm5scCwgKnBscDsKKwlpbnQgY291bnQ7CisKKwlpZiAoYmFkX251bXMobnVtMSwgbnVtMiwgImRlbGV0ZSIpKQorCQlyZXR1cm47CisKKwlscCA9IGZpbmRMaW5lKG51bTEpOworCWlmIChscCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKGN1ck51bSA+PSBudW0xKSAmJiAoY3VyTnVtIDw9IG51bTIpKSB7CisJCWlmIChudW0yIDwgbGFzdE51bSkKKwkJCXNldEN1ck51bShudW0yICsgMSk7CisJCWVsc2UgaWYgKG51bTEgPiAxKQorCQkJc2V0Q3VyTnVtKG51bTEgLSAxKTsKKwkJZWxzZQorCQkJY3VyTnVtID0gMDsKKwl9CisKKwljb3VudCA9IG51bTIgLSBudW0xICsgMTsKKwlpZiAoY3VyTnVtID4gbnVtMikKKwkJY3VyTnVtIC09IGNvdW50OworCWxhc3ROdW0gLT0gY291bnQ7CisKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJbmxwID0gbHAtPm5leHQ7CisJCXBscCA9IGxwLT5wcmV2OworCQlwbHAtPm5leHQgPSBubHA7CisJCW5scC0+cHJldiA9IHBscDsKKwkJZnJlZShscCk7CisJCWxwID0gbmxwOworCX0KKworCWRpcnR5ID0gVFJVRTsKK30KKworCisvKgorICogU2VhcmNoIGZvciBhIGxpbmUgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgKiBJZiB0aGUgc3RyaW5nIGlzICIiLCB0aGVuIHRoZSBwcmV2aW91c2x5IHNlYXJjaGVkIGZvciBzdHJpbmcKKyAqIGlzIHVzZWQuICBUaGUgY3VycmVudGx5IHNlYXJjaGVkIGZvciBzdHJpbmcgaXMgc2F2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgKiBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciB3aGljaCBtYXRjaGVzLCBvciAwIGlmIHRoZXJlIHdhcyBubyBtYXRjaAorICogd2l0aCBhbiBlcnJvciBwcmludGVkLgorICovCitzdGF0aWMgTk9JTkxJTkUgaW50IHNlYXJjaExpbmVzKGNvbnN0IGNoYXIgKnN0ciwgaW50IG51bTEsIGludCBudW0yKQoreworCWNvbnN0IExJTkUgKmxwOworCWludCBsZW47CisKKwlpZiAoYmFkX251bXMobnVtMSwgbnVtMiwgInNlYXJjaCIpKQorCQlyZXR1cm4gMDsKKworCWlmICgqc3RyID09ICdcMCcpIHsKKwkJaWYgKHNlYXJjaFN0cmluZ1swXSA9PSAnXDAnKSB7CisJCQliYl9lcnJvcl9tc2coIm5vIHByZXZpb3VzIHNlYXJjaCBzdHJpbmciKTsKKwkJCXJldHVybiAwOworCQl9CisJCXN0ciA9IHNlYXJjaFN0cmluZzsKKwl9CisKKwlpZiAoc3RyICE9IHNlYXJjaFN0cmluZykKKwkJc3RyY3B5KHNlYXJjaFN0cmluZywgc3RyKTsKKworCWxlbiA9IHN0cmxlbihzdHIpOworCisJbHAgPSBmaW5kTGluZShudW0xKTsKKwlpZiAobHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobnVtMSA8PSBudW0yKSB7CisJCWlmIChmaW5kU3RyaW5nKGxwLCBzdHIsIGxlbiwgMCkgPj0gMCkKKwkJCXJldHVybiBudW0xOworCQludW0xKys7CisJCWxwID0gbHAtPm5leHQ7CisJfQorCisJYmJfZXJyb3JfbXNnKCJjYW4ndCBmaW5kIHN0cmluZyBcIiVzXCIiLCBzdHIpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgbGluZSBudW1iZXIuCisgKi8KK3N0YXRpYyBMSU5FICpmaW5kTGluZShpbnQgbnVtKQoreworCUxJTkUgKmxwOworCWludCBsbnVtOworCisJaWYgKChudW0gPCAxKSB8fCAobnVtID4gbGFzdE51bSkpIHsKKwkJYmJfZXJyb3JfbXNnKCJsaW5lIG51bWJlciAlZCBkb2VzIG5vdCBleGlzdCIsIG51bSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChjdXJOdW0gPD0gMCkgeworCQljdXJOdW0gPSAxOworCQljdXJMaW5lID0gbGluZXMubmV4dDsKKwl9CisKKwlpZiAobnVtID09IGN1ck51bSkKKwkJcmV0dXJuIGN1ckxpbmU7CisKKwlscCA9IGN1ckxpbmU7CisJbG51bSA9IGN1ck51bTsKKwlpZiAobnVtIDwgKGN1ck51bSAvIDIpKSB7CisJCWxwID0gbGluZXMubmV4dDsKKwkJbG51bSA9IDE7CisJfSBlbHNlIGlmIChudW0gPiAoKGN1ck51bSArIGxhc3ROdW0pIC8gMikpIHsKKwkJbHAgPSBsaW5lcy5wcmV2OworCQlsbnVtID0gbGFzdE51bTsKKwl9CisKKwl3aGlsZSAobG51bSA8IG51bSkgeworCQlscCA9IGxwLT5uZXh0OworCQlsbnVtKys7CisJfQorCisJd2hpbGUgKGxudW0gPiBudW0pIHsKKwkJbHAgPSBscC0+cHJldjsKKwkJbG51bS0tOworCX0KKwlyZXR1cm4gbHA7Cit9CisKKworLyoKKyAqIFNldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgaW50IHNldEN1ck51bShpbnQgbnVtKQoreworCUxJTkUgKmxwOworCisJbHAgPSBmaW5kTGluZShudW0pOworCWlmIChscCA9PSBOVUxMKQorCQlyZXR1cm4gRkFMU0U7CisJY3VyTnVtID0gbnVtOworCWN1ckxpbmUgPSBscDsKKwlyZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvcGF0Y2guYyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvcGF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJhNDliCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9wYXRjaC5jCkBAIC0wLDAgKzEsNTUwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDoKKyAqCisgKiBBcHBseSBhICJ1bml2ZXJzYWwiIGRpZmYuCisgKiBBZGFwdGVkIGZyb20gdG95Ym94J3MgcGF0Y2ggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMDcgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBzZWUgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy9wYXRjaC5odG1sCisgKiAoQnV0IG9ubHkgZG9lcyAtdSwgYmVjYXVzZSB3aG8gc3RpbGwgY2FyZXMgYWJvdXQgImVkIj8pCisgKgorICogVE9ETzoKKyAqIC1iIGJhY2t1cAorICogLWwgdHJlYXQgYWxsIHdoaXRlc3BhY2UgYXMgYSBzaW5nbGUgc3BhY2UKKyAqIC1kIGNoZGlyIGZpcnN0CisgKiAtRCBkZWZpbmUgd3JhcCAjaWZkZWYgYW5kICNpZm5kZWYgYXJvdW5kIGNoYW5nZXMKKyAqIC1vIG91dGZpbGUgb3V0cHV0IGhlcmUgaW5zdGVhZCBvZiBpbiBwbGFjZQorICogLXIgcmVqZWN0ZmlsZSB3cml0ZSByZWplY3RlZCBodW5rcyB0byB0aGlzIGZpbGUKKyAqIC0tZHJ5LXJ1biAocmVncmVzc2lvbiEpCisgKgorICogLWYgZm9yY2UgKG5vIHF1ZXN0aW9ucyBhc2tlZCkKKyAqIC1GIGZ1enogKG51bWJlciwgZGVmYXVsdCAyKQorICogW2ZpbGVdIHdoaWNoIGZpbGUgdG8gcGF0Y2gKKyAqLworCisvL2NvbmZpZzpjb25maWcgUEFUQ0gKKy8vY29uZmlnOglib29sICJwYXRjaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBcHBseSBhIHVuaWZpZWQgZGlmZiBmb3JtYXR0ZWQgcGF0Y2guCisKKy8vYXBwbGV0OklGX1BBVENIKEFQUExFVChwYXRjaCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19QQVRDSCkgKz0gcGF0Y2gubworCisvL3VzYWdlOiNkZWZpbmUgcGF0Y2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbT1JJR0ZJTEUgW1BBVENIRklMRV1dIgorLy91c2FnZTojZGVmaW5lIHBhdGNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOglJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgICAiCS1wLC0tc3RyaXAgTgkJU3RyaXAgTiBsZWFkaW5nIGNvbXBvbmVudHMgZnJvbSBmaWxlIG5hbWVzIgorLy91c2FnZTogICAgICJcbgktaSwtLWlucHV0IERJRkYJCVJlYWQgRElGRiBpbnN0ZWFkIG9mIHN0ZGluIgorLy91c2FnZTogICAgICJcbgktUiwtLXJldmVyc2UJCVJldmVyc2UgcGF0Y2giCisvL3VzYWdlOiAgICAgIlxuCS1OLC0tZm9yd2FyZAkJSWdub3JlIGFscmVhZHkgYXBwbGllZCBwYXRjaGVzIgorLyp1c2FnZTogICAgICJcbgktLWRyeS1ydW4JCURvbid0IGFjdHVhbGx5IGNoYW5nZSBmaWxlcyIgLSBUT0RPICovCisvL3VzYWdlOiAgICAgIlxuCS1FLC0tcmVtb3ZlLWVtcHR5LWZpbGVzCVJlbW92ZSBvdXRwdXQgZmlsZXMgaWYgdGhleSBiZWNvbWUgZW1wdHkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICAgIgktcCBOCVN0cmlwIE4gbGVhZGluZyBjb21wb25lbnRzIGZyb20gZmlsZSBuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWkgRElGRglSZWFkIERJRkYgaW5zdGVhZCBvZiBzdGRpbiIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmV2ZXJzZSBwYXRjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JSWdub3JlIGFscmVhZHkgYXBwbGllZCBwYXRjaGVzIgorLy91c2FnZTogICAgICJcbgktRQlSZW1vdmUgb3V0cHV0IGZpbGVzIGlmIHRoZXkgYmVjb21lIGVtcHR5IgorLy91c2FnZToJKQorLyogLXUgImludGVycHJldCBhcyB1bmlmaWVkIGRpZmYiIGlzIHN1cHBvcnRlZCBidXQgbm90IGRvY3VtZW50ZWQ6IHRoaXMgaW5mbyBpcyBub3QgdXNlZnVsIGZvciAtLWhlbHAgKi8KKy8qIC14ICJkZWJ1ZyIgaXMgc3VwcG9ydGVkIGJ1dCBkb2VzIG5vdGhpbmcgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcGF0Y2hfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcGF0Y2ggLXAxIDwgZXhhbXBsZS5kaWZmXG4iCisvL3VzYWdlOiAgICAgICAiJCBwYXRjaCAtcDAgLWkgZXhhbXBsZS5kaWZmIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworCisvLyBsaWJiYiBjYW5kaWRhdGU/CisKK3N0cnVjdCBkb3VibGVfbGlzdCB7CisJc3RydWN0IGRvdWJsZV9saXN0ICpuZXh0OworCXN0cnVjdCBkb3VibGVfbGlzdCAqcHJldjsKKwljaGFyICpkYXRhOworfTsKKworLy8gRnJlZSBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgbGlua2VkIGxpc3QKKy8vIENhbGwgZnJlZWl0KCkgb24gZWFjaCBlbGVtZW50IGJlZm9yZSBmcmVlaW5nIGl0Lgorc3RhdGljIHZvaWQgZGxpc3RfZnJlZShzdHJ1Y3QgZG91YmxlX2xpc3QgKmxpc3QsIHZvaWQgKCpmcmVlaXQpKHZvaWQgKmRhdGEpKQoreworCXdoaWxlIChsaXN0KSB7CisJCXZvaWQgKnBvcCA9IGxpc3Q7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlmcmVlaXQocG9wKTsKKwkJLy8gQmFpbCBvdXQgYWxzbyBpZiBsaXN0IGlzIGNpcmN1bGFyLgorCQlpZiAobGlzdCA9PSBwb3ApIGJyZWFrOworCX0KK30KKworLy8gQWRkIGFuIGVudHJ5IGJlZm9yZSAibGlzdCIgZWxlbWVudCBpbiAoY2lyY3VsYXIpIGRvdWJseSBsaW5rZWQgbGlzdAorc3RhdGljIHN0cnVjdCBkb3VibGVfbGlzdCAqZGxpc3RfYWRkKHN0cnVjdCBkb3VibGVfbGlzdCAqKmxpc3QsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGRvdWJsZV9saXN0ICpsbGlzdDsKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKmxpbmUgPSB4bWFsbG9jKHNpemVvZigqbGluZSkpOworCisJbGluZS0+ZGF0YSA9IGRhdGE7CisJbGxpc3QgPSAqbGlzdDsKKwlpZiAobGxpc3QpIHsKKwkJc3RydWN0IGRvdWJsZV9saXN0ICpwOworCQlsaW5lLT5uZXh0ID0gbGxpc3Q7CisJCXAgPSBsaW5lLT5wcmV2ID0gbGxpc3QtPnByZXY7CisJCS8vIChsaXN0IGlzIGNpcmN1bGFyLCB3ZSBhc3N1bWUgcCBpcyBuZXZlciBOVUxMKQorCQlwLT5uZXh0ID0gbGluZTsKKwkJbGxpc3QtPnByZXYgPSBsaW5lOworCX0gZWxzZQorCQkqbGlzdCA9IGxpbmUtPm5leHQgPSBsaW5lLT5wcmV2ID0gbGluZTsKKworCXJldHVybiBsaW5lOworfQorCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICppbmZpbGU7CisJbG9uZyBwcmVmaXg7CisKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKmN1cnJlbnRfaHVuazsKKworCWxvbmcgb2xkbGluZSwgb2xkbGVuLCBuZXdsaW5lLCBuZXdsZW47CisJbG9uZyBsaW5lbnVtOworCWludCBjb250ZXh0LCBzdGF0ZSwgaHVua251bTsKKwlpbnQgZmlsZWluLCBmaWxlb3V0OworCWNoYXIgKnRlbXBuYW1lOworCisJaW50IGV4aXR2YWw7Cit9OworI2RlZmluZSBUVCAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX1RUKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKFRUKSkpOyBcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgRkxBR19TVFIgIlJ1cDppOk5FeCIKKy8qIEZMQUdfUkVWRVJTRSBtdXN0IGJlID09IDEhIENvZGUgdXNlcyB0aGlzIGZhY3QuICovCisjZGVmaW5lIEZMQUdfUkVWRVJTRSAoMSA8PCAwKQorI2RlZmluZSBGTEFHX3UgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgRkxBR19QQVRITEVOICgxIDw8IDIpCisjZGVmaW5lIEZMQUdfSU5QVVQgICAoMSA8PCAzKQorI2RlZmluZSBGTEFHX0lHTk9SRSAgKDEgPDwgNCkKKyNkZWZpbmUgRkxBR19STUVNUFRZICgxIDw8IDUpCisvKiBFbmFibGUgdGhpcyBiaXQgYW5kIHVzZSAteCBmb3IgZGVidWcgb3V0cHV0OiAqLworI2RlZmluZSBGTEFHX0RFQlVHICAgKDAgPDwgNikKKworLy8gRGlzcG9zZSBvZiBhIGxpbmUgb2YgaW5wdXQsIGVpdGhlciBieSB3cml0aW5nIGl0IG91dCBvciBkaXNjYXJkaW5nIGl0LgorCisvLyBzdGF0ZSA8IDI6IGp1c3QgZnJlZQorLy8gc3RhdGUgPSAyOiB3cml0ZSB3aG9sZSBsaW5lIHRvIHN0ZGVycgorLy8gc3RhdGUgPSAzOiB3cml0ZSB3aG9sZSBsaW5lIHRvIGZpbGVvdXQKKy8vIHN0YXRlID4gMzogd3JpdGUgbGluZSsxIHRvIGZpbGVvdXQgd2hlbiAqbGluZSAhPSBzdGF0ZQorCisjZGVmaW5lIFBBVENIX0RFQlVHIChvcHRpb25fbWFzazMyICYgRkxBR19ERUJVRykKKworc3RhdGljIHZvaWQgZG9fbGluZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkb3VibGVfbGlzdCAqZGxpc3QgPSBkYXRhOworCisJaWYgKFRULnN0YXRlPjEgJiYgKmRsaXN0LT5kYXRhICE9IFRULnN0YXRlKQorCQlmZHByaW50ZihUVC5zdGF0ZSA9PSAyID8gMiA6IFRULmZpbGVvdXQsCisJCQkiJXNcbiIsIGRsaXN0LT5kYXRhKyhUVC5zdGF0ZT4zID8gMSA6IDApKTsKKworCWlmIChQQVRDSF9ERUJVRykgZmRwcmludGYoMiwgIkRPICVkOiAlc1xuIiwgVFQuc3RhdGUsIGRsaXN0LT5kYXRhKTsKKworCWZyZWUoZGxpc3QtPmRhdGEpOworCWZyZWUoZGxpc3QpOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfb2xkZmlsZSh2b2lkKQoreworCWlmIChUVC50ZW1wbmFtZSkgeworCQkvLyBDb3B5IHRoZSByZXN0IG9mIHRoZSBkYXRhIGFuZCByZXBsYWNlIHRoZSBvcmlnaW5hbCB3aXRoIHRoZSBjb3B5LgorCQljaGFyICp0ZW1wOworCisJCWlmIChUVC5maWxlaW4gIT0gLTEpIHsKKwkJCWJiX2NvcHlmZF9lb2YoVFQuZmlsZWluLCBUVC5maWxlb3V0KTsKKwkJCXhjbG9zZShUVC5maWxlaW4pOworCQl9CisJCXhjbG9zZShUVC5maWxlb3V0KTsKKworCQl0ZW1wID0geHN0cmR1cChUVC50ZW1wbmFtZSk7CisJCXRlbXBbc3RybGVuKHRlbXApIC0gNl0gPSAnXDAnOworCQlyZW5hbWUoVFQudGVtcG5hbWUsIHRlbXApOworCQlmcmVlKHRlbXApOworCisJCWZyZWUoVFQudGVtcG5hbWUpOworCQlUVC50ZW1wbmFtZSA9IE5VTEw7CisJfQorCVRULmZpbGVvdXQgPSBUVC5maWxlaW4gPSAtMTsKK30KKworc3RhdGljIHZvaWQgZmFpbF9odW5rKHZvaWQpCit7CisJaWYgKCFUVC5jdXJyZW50X2h1bmspIHJldHVybjsKKworCWZkcHJpbnRmKDIsICJIdW5rICVkIEZBSUxFRCAlbGQvJWxkLlxuIiwgVFQuaHVua251bSwgVFQub2xkbGluZSwgVFQubmV3bGluZSk7CisJVFQuZXhpdHZhbCA9IDE7CisKKwkvLyBJZiB3ZSBnb3QgdG8gdGhpcyBwb2ludCwgd2UndmUgc2Vla2VkIHRvIHRoZSBlbmQuICBEaXNjYXJkIGNoYW5nZXMgdG8KKwkvLyB0aGlzIGZpbGUgYW5kIGFkdmFuY2UgdG8gbmV4dCBmaWxlLgorCisJVFQuc3RhdGUgPSAyOworCVRULmN1cnJlbnRfaHVuay0+cHJldi0+bmV4dCA9IE5VTEw7CisJZGxpc3RfZnJlZShUVC5jdXJyZW50X2h1bmssIGRvX2xpbmUpOworCVRULmN1cnJlbnRfaHVuayA9IE5VTEw7CisKKwkvLyBBYm9ydCB0aGUgY29weSBhbmQgZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZS4KKwljbG9zZShUVC5maWxlaW4pOworCWNsb3NlKFRULmZpbGVvdXQpOworCXVubGluayhUVC50ZW1wbmFtZSk7CisJZnJlZShUVC50ZW1wbmFtZSk7CisJVFQudGVtcG5hbWUgPSBOVUxMOworCisJVFQuc3RhdGUgPSAwOworfQorCisvLyBHaXZlbiBhIGh1bmsgb2YgYSB1bmlmaWVkIGRpZmYsIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSB0byB0aGUgZmlsZS4KKy8vIFRoaXMgZG9lcyBub3QgdXNlIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IGluc3RlYWQgdHJlYXRzIGEgaHVuaworLy8gYXMgYSBzb3J0IG9mIHJlZ2V4LiAgQ29waWVzIGRhdGEgZnJvbSBpbnB1dCB0byBvdXRwdXQgdW50aWwgaXQgZmluZHMKKy8vIHRoZSBjaGFuZ2UgdG8gYmUgbWFkZSwgdGhlbiBvdXRwdXRzIHRoZSBjaGFuZ2VkIGRhdGEgYW5kIHJldHVybnMuCisvLyAoRmluZGluZyBFT0YgZmlyc3QgaXMgYW4gZXJyb3IuKSAgVGhpcyBpcyBhIHNpbmdsZSBwYXNzIG9wZXJhdGlvbiwgc28KKy8vIG11bHRpcGxlIGh1bmtzIG11c3Qgb2NjdXIgaW4gb3JkZXIgaW4gdGhlIGZpbGUuCisKK3N0YXRpYyBpbnQgYXBwbHlfb25lX2h1bmsodm9pZCkKK3sKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKnBsaXN0LCAqYnVmID0gTlVMTCwgKmNoZWNrOworCWludCBtYXRjaGVvZiA9IDAsIHJldmVyc2UgPSBvcHRpb25fbWFzazMyICYgRkxBR19SRVZFUlNFLCBiYWNrd2FybiA9IDA7CisJLyogRG8gd2UgdHJ5ICJkdW1teSIgcmV2ZXJ0IHRvIGNoZWNrIHdoZXRoZXIKKwkgKiB0byBzaWxlbnRseSBza2lwIHRoaXMgaHVuaz8gVXNlZCB0byBpbXBsZW1lbnQgLU4uCisJICovCisJaW50IGR1bW15X3JldmVydCA9IDA7CisKKwkvLyBCcmVhayBkb3VibHkgbGlua2VkIGxpc3Qgc28gd2UgY2FuIHVzZSBzaW5nbHkgbGlua2VkIHRyYXZlcnNhbCBmdW5jdGlvbi4KKwlUVC5jdXJyZW50X2h1bmstPnByZXYtPm5leHQgPSBOVUxMOworCisJLy8gTWF0Y2ggRU9GIGlmIHRoZXJlIGFyZW4ndCBhcyBtYW55IGVuZGluZyBjb250ZXh0IGxpbmVzIGFzIGJlZ2lubmluZworCWZvciAocGxpc3QgPSBUVC5jdXJyZW50X2h1bms7IHBsaXN0OyBwbGlzdCA9IHBsaXN0LT5uZXh0KSB7CisJCWlmIChwbGlzdC0+ZGF0YVswXT09JyAnKSBtYXRjaGVvZisrOworCQllbHNlIG1hdGNoZW9mID0gMDsKKwkJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCAiSFVOSzolc1xuIiwgcGxpc3QtPmRhdGEpOworCX0KKwltYXRjaGVvZiA9ICFtYXRjaGVvZiB8fCBtYXRjaGVvZiA8IFRULmNvbnRleHQ7CisKKwlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsIk1BVENIRU9GPSVjXG4iLCBtYXRjaGVvZiA/ICdZJyA6ICdOJyk7CisKKwkvLyBMb29wIHRocm91Z2ggaW5wdXQgZGF0YSBzZWFyY2hpbmcgZm9yIHRoaXMgaHVuay4gIE1hdGNoIGFsbCBjb250ZXh0CisJLy8gbGluZXMgYW5kIGFsbCBsaW5lcyB0byBiZSByZW1vdmVkIHVudGlsIHdlJ3ZlIGZvdW5kIHRoZSBlbmQgb2YgYQorCS8vIGNvbXBsZXRlIGh1bmsuCisJcGxpc3QgPSBUVC5jdXJyZW50X2h1bms7CisJYnVmID0gTlVMTDsKKwlpZiAocmV2ZXJzZSA/IFRULm9sZGxlbiA6IFRULm5ld2xlbikgZm9yICg7OykgeworCQljaGFyICpkYXRhID0geG1hbGxvY19yZWFkcyhUVC5maWxlaW4sIE5VTEwpOworCisJCVRULmxpbmVudW0rKzsKKworCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGxpbmUgb2YgaHVuayB0byBjb21wYXJlIHdpdGggbmV4dC4gIChTa2lwIGxpbmVzCisJCS8vIG9mIHRoZSBodW5rIHdlJ2QgYmUgYWRkaW5nLikKKwkJd2hpbGUgKHBsaXN0ICYmICpwbGlzdC0+ZGF0YSA9PSAiKy0iW3JldmVyc2VdKSB7CisJCQlpZiAoZGF0YSAmJiAhc3RyY21wKGRhdGEsIHBsaXN0LT5kYXRhKzEpKSB7CisJCQkJaWYgKCFiYWNrd2FybikgeworCQkJCQliYWNrd2FybiA9IFRULmxpbmVudW07CisJCQkJCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19JR05PUkUpIHsKKwkJCQkJCWR1bW15X3JldmVydCA9IDE7CisJCQkJCQlyZXZlcnNlIF49IDE7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CisJCX0KKworCQkvLyBJcyB0aGlzIEVPRj8KKwkJaWYgKCFkYXRhKSB7CisJCQlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJJTkVPRlxuIik7CisKKwkJCS8vIERvZXMgdGhpcyBodW5rIG5lZWQgdG8gbWF0Y2ggRU9GPworCQkJaWYgKCFwbGlzdCAmJiBtYXRjaGVvZikgYnJlYWs7CisKKwkJCWlmIChiYWNrd2FybikKKwkJCQlmZHByaW50ZigyLCJQb3NzaWJseSByZXZlcnNlZCBodW5rICVkIGF0ICVsZFxuIiwKKwkJCQkJVFQuaHVua251bSwgVFQubGluZW51bSk7CisKKwkJCS8vIEZpbGUgZW5kZWQgYmVmb3JlIHdlIGZvdW5kIGEgcGxhY2UgZm9yIHRoaXMgaHVuay4KKwkJCWZhaWxfaHVuaygpOworCQkJZ290byBkb25lOworCQl9CisKKwkJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCAiSU46ICVzXG4iLCBkYXRhKTsKKwkJY2hlY2sgPSBkbGlzdF9hZGQoJmJ1ZiwgZGF0YSk7CisKKwkJLy8gQ29tcGFyZSB0aGlzIGxpbmUgd2l0aCBuZXh0IGV4cGVjdGVkIGxpbmUgb2YgaHVuay4KKwkJLy8gdG9kbzogdGVhY2ggdGhlIHN0cmNtcCgpIHRvIGlnbm9yZSB3aGl0ZXNwYWNlLgorCisJCS8vIEEgbWF0Y2ggY2FuIGZhaWwgYmVjYXVzZSB0aGUgbmV4dCBsaW5lIGRvZXNuJ3QgbWF0Y2gsIG9yIGJlY2F1c2UKKwkJLy8gd2UgaGl0IHRoZSBlbmQgb2YgYSBodW5rIHRoYXQgbmVlZGVkIEVPRiwgYW5kIHRoaXMgaXNuJ3QgRU9GLgorCisJCS8vIElmIG1hdGNoIGZhaWxlZCwgZmx1c2ggZmlyc3QgbGluZSBvZiBidWZmZXJlZCBkYXRhIGFuZAorCQkvLyByZWNoZWNrIGJ1ZmZlcmVkIGRhdGEgZm9yIGEgbmV3IG1hdGNoIHVudGlsIHdlIGZpbmQgb25lIG9yIHJ1bgorCQkvLyBvdXQgb2YgYnVmZmVyLgorCisJCWZvciAoOzspIHsKKwkJCWlmICghcGxpc3QgfHwgc3RyY21wKGNoZWNrLT5kYXRhLCBwbGlzdC0+ZGF0YSsxKSkgeworCQkJCS8vIE1hdGNoIGZhaWxlZC4gIFdyaXRlIG91dCBmaXJzdCBsaW5lIG9mIGJ1ZmZlcmVkIGRhdGEgYW5kCisJCQkJLy8gcmVjaGVjayByZW1haW5pbmcgYnVmZmVyZWQgZGF0YSBmb3IgYSBuZXcgbWF0Y2guCisKKwkJCQlpZiAoUEFUQ0hfREVCVUcpCisJCQkJCWZkcHJpbnRmKDIsICJOT1Q6ICVzXG4iLCBwbGlzdC0+ZGF0YSk7CisKKwkJCQlUVC5zdGF0ZSA9IDM7CisJCQkJY2hlY2sgPSBidWY7CisJCQkJYnVmID0gYnVmLT5uZXh0OworCQkJCWNoZWNrLT5wcmV2LT5uZXh0ID0gYnVmOworCQkJCWJ1Zi0+cHJldiA9IGNoZWNrLT5wcmV2OworCQkJCWRvX2xpbmUoY2hlY2spOworCQkJCXBsaXN0ID0gVFQuY3VycmVudF9odW5rOworCisJCQkJLy8gSWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2l0aG91dCBjb25maXJtaW5nIGEKKwkJCQkvLyBtYXRjaCwgcmVhZCBtb3JlIGxpbmVzLgorCQkJCWlmIChjaGVjayA9PSBidWYpIHsKKwkJCQkJYnVmID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNoZWNrID0gYnVmOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoUEFUQ0hfREVCVUcpCisJCQkJCWZkcHJpbnRmKDIsICJNQVlCRTogJXNcbiIsIHBsaXN0LT5kYXRhKTsKKwkJCQkvLyBUaGlzIGxpbmUgbWF0Y2hlcy4gIEFkdmFuY2UgcGxpc3QsIGRldGVjdCBzdWNjZXNzZnVsIG1hdGNoLgorCQkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CisJCQkJaWYgKCFwbGlzdCAmJiAhbWF0Y2hlb2YpIGdvdG8gb3V0OworCQkJCWNoZWNrID0gY2hlY2stPm5leHQ7CisJCQkJaWYgKGNoZWNrID09IGJ1ZikgYnJlYWs7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJLy8gV2UgaGF2ZSBhIG1hdGNoLiAgRW1pdCBjaGFuZ2VkIGRhdGEuCisJVFQuc3RhdGUgPSAiLSsiW3JldmVyc2UgXiBkdW1teV9yZXZlcnRdOworCWRsaXN0X2ZyZWUoVFQuY3VycmVudF9odW5rLCBkb19saW5lKTsKKwlUVC5jdXJyZW50X2h1bmsgPSBOVUxMOworCVRULnN0YXRlID0gMTsKK2RvbmU6CisJaWYgKGJ1ZikgeworCQlidWYtPnByZXYtPm5leHQgPSBOVUxMOworCQlkbGlzdF9mcmVlKGJ1ZiwgZG9fbGluZSk7CisJfQorCisJcmV0dXJuIFRULnN0YXRlOworfQorCisvLyBSZWFkIGEgcGF0Y2ggZmlsZSBhbmQgZmluZCBodW5rcywgb3BlbmluZy9jcmVhdGluZy9kZWxldGluZyBmaWxlcy4KKy8vIENhbGwgYXBwbHlfb25lX2h1bmsoKSBvbiBlYWNoIGh1bmsuCisKKy8vIHN0YXRlIDA6IE5vdCBpbiBhIGh1bmssIGxvb2sgZm9yICsrKy4KKy8vIHN0YXRlIDE6IEZvdW5kICsrKyBmaWxlIGluZGljYXRvciwgbG9vayBmb3IgQEAKKy8vIHN0YXRlIDI6IEluIGh1bms6IGNvdW50aW5nIGluaXRpYWwgY29udGV4dCBsaW5lcworLy8gc3RhdGUgMzogSW4gaHVuazogZ2V0dGluZyBib2R5CisKK2ludCBwYXRjaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGF0Y2hfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBvcHRzOworCWludCByZXZlcnNlLCBzdGF0ZSA9IDA7CisJY2hhciAqb2xkbmFtZSA9IE5VTEwsICpuZXduYW1lID0gTlVMTDsKKwljaGFyICpvcHRfcCwgKm9wdF9pOworCWxvbmcgb2xkbGVuID0gb2xkbGVuOyAvKiBmb3IgY29tcGlsZXIgKi8KKwlsb25nIG5ld2xlbiA9IG5ld2xlbjsgLyogZm9yIGNvbXBpbGVyICovCisKKwlJTklUX1RUKCk7CisKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgRkxBR19TVFIsICZvcHRfcCwgJm9wdF9pKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlyZXZlcnNlID0gb3B0cyAmIEZMQUdfUkVWRVJTRTsKKwlUVC5wcmVmaXggPSAob3B0cyAmIEZMQUdfUEFUSExFTikgPyB4YXRvaShvcHRfcCkgOiAwOyAvLyBjYW4gYmUgbmVnYXRpdmUhCisJVFQuZmlsZWluID0gVFQuZmlsZW91dCA9IC0xOworCWlmIChvcHRzICYgRkxBR19JTlBVVCkgeworCQl4bW92ZV9mZCh4b3Blbl9zdGRpbihvcHRfaSksIFNURElOX0ZJTEVOTyk7CisJfSBlbHNlIHsKKwkJaWYgKGFyZ3ZbMF0gJiYgYXJndlsxXSkgeworCQkJeG1vdmVfZmQoeG9wZW5fc3RkaW4oYXJndlsxXSksIFNURElOX0ZJTEVOTyk7CisJCX0KKwl9CisJaWYgKGFyZ3ZbMF0pIHsKKwkJb2xkbmFtZSA9IHhzdHJkdXAoYXJndlswXSk7CisJCW5ld25hbWUgPSB4c3RyZHVwKGFyZ3ZbMF0pOworCX0KKworCS8vIExvb3AgdGhyb3VnaCB0aGUgbGluZXMgaW4gdGhlIHBhdGNoCisJZm9yKDs7KSB7CisJCWNoYXIgKnBhdGNobGluZTsKKworCQlwYXRjaGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHN0ZGluKTsKKwkJaWYgKCFwYXRjaGxpbmUpIGJyZWFrOworCisJCS8vIE90aGVyIHZlcnNpb25zIG9mIHBhdGNoIGFjY2VwdCBkYW1hZ2VkIHBhdGNoZXMsCisJCS8vIHNvIHdlIG5lZWQgdG8gYWxzby4KKwkJaWYgKCEqcGF0Y2hsaW5lKSB7CisJCQlmcmVlKHBhdGNobGluZSk7CisJCQlwYXRjaGxpbmUgPSB4c3RyZHVwKCIgIik7CisJCX0KKworCQkvLyBBcmUgd2UgYXNzZW1ibGluZyBhIGh1bms/CisJCWlmIChzdGF0ZSA+PSAyKSB7CisJCQlpZiAoKnBhdGNobGluZT09JyAnIHx8ICpwYXRjaGxpbmU9PScrJyB8fCAqcGF0Y2hsaW5lPT0nLScpIHsKKwkJCQlkbGlzdF9hZGQoJlRULmN1cnJlbnRfaHVuaywgcGF0Y2hsaW5lKTsKKworCQkJCWlmICgqcGF0Y2hsaW5lICE9ICcrJykgb2xkbGVuLS07CisJCQkJaWYgKCpwYXRjaGxpbmUgIT0gJy0nKSBuZXdsZW4tLTsKKworCQkJCS8vIENvbnRleHQgbGluZT8KKwkJCQlpZiAoKnBhdGNobGluZT09JyAnICYmIHN0YXRlPT0yKSBUVC5jb250ZXh0Kys7CisJCQkJZWxzZSBzdGF0ZT0zOworCisJCQkJLy8gSWYgd2UndmUgY29uc3VtZWQgYWxsIGV4cGVjdGVkIGh1bmsgbGluZXMsIGFwcGx5IHRoZSBodW5rLgorCisJCQkJaWYgKCFvbGRsZW4gJiYgIW5ld2xlbikgc3RhdGUgPSBhcHBseV9vbmVfaHVuaygpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZmFpbF9odW5rKCk7CisJCQlzdGF0ZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIE9wZW4gYSBuZXcgZmlsZT8KKwkJaWYgKCFzdHJuY21wKCItLS0gIiwgcGF0Y2hsaW5lLCA0KSB8fCAhc3RybmNtcCgiKysrICIsIHBhdGNobGluZSwgNCkpIHsKKwkJCWNoYXIgKnMsICoqbmFtZSA9IHJldmVyc2UgPyAmbmV3bmFtZSA6ICZvbGRuYW1lOworCQkJaW50IGk7CisKKwkJCWlmICgqcGF0Y2hsaW5lID09ICcrJykgeworCQkJCW5hbWUgPSByZXZlcnNlID8gJm9sZG5hbWUgOiAmbmV3bmFtZTsKKwkJCQlzdGF0ZSA9IDE7CisJCQl9CisKKwkJCWZpbmlzaF9vbGRmaWxlKCk7CisKKwkJCWlmICghYXJndlswXSkgeworCQkJCWZyZWUoKm5hbWUpOworCQkJCS8vIFRyaW0gZGF0ZSBmcm9tIGVuZCBvZiBmaWxlbmFtZSAoaWYgYW55KS4gIFdlIGRvbid0IGNhcmUuCisJCQkJZm9yIChzID0gcGF0Y2hsaW5lKzQ7ICpzICYmICpzIT0nXHQnOyBzKyspCisJCQkJCWlmICgqcz09J1xcJyAmJiBzWzFdKSBzKys7CisJCQkJaSA9IGF0b2kocyk7CisJCQkJaWYgKGk+MTkwMCAmJiBpPD0xOTcwKQorCQkJCQkqbmFtZSA9IHhzdHJkdXAoIi9kZXYvbnVsbCIpOworCQkJCWVsc2UgeworCQkJCQkqcyA9IDA7CisJCQkJCSpuYW1lID0geHN0cmR1cChwYXRjaGxpbmUrNCk7CisJCQkJfQorCQkJfQorCisJCQkvLyBXZSBkZWZlciBhY3R1YWxseSBvcGVuaW5nIHRoZSBmaWxlIGJlY2F1c2Ugc3ZuIHByb2R1Y2VzIGJyb2tlbgorCQkJLy8gcGF0Y2hlcyB0aGF0IGRvbid0IHNpZ25hbCB0aGV5IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGZpbGUgdGhlCisJCQkvLyB3YXkgdGhlIHBhdGNoIG1hbiBwYWdlIHNheXMsIHNvIHlvdSBoYXZlIHRvIHJlYWQgdGhlIGZpcnN0IGh1bmsKKwkJCS8vIGFuZCBfZ3Vlc3NfLgorCisJCS8vIFN0YXJ0IGEgbmV3IGh1bms/ICBVc3VhbGx5IEBAIC1vbGRsaW5lLG9sZGxlbiArbmV3bGluZSxuZXdsZW4gQEAKKwkJLy8gYnV0IGEgbWlzc2luZyAsdmFsdWUgbWVhbnMgdGhlIHZhbHVlIGlzIDEuCisJCX0gZWxzZSBpZiAoc3RhdGUgPT0gMSAmJiAhc3RybmNtcCgiQEAgLSIsIHBhdGNobGluZSwgNCkpIHsKKwkJCWludCBpOworCQkJY2hhciAqcyA9IHBhdGNobGluZSs0OworCisJCQkvLyBSZWFkIG9sZGxpbmVbLG9sZGxlbl0gK25ld2xpbmVbLG5ld2xlbl0KKworCQkJVFQub2xkbGVuID0gb2xkbGVuID0gVFQubmV3bGVuID0gbmV3bGVuID0gMTsKKwkJCVRULm9sZGxpbmUgPSBzdHJ0b2wocywgJnMsIDEwKTsKKwkJCWlmICgqcyA9PSAnLCcpIFRULm9sZGxlbiA9IG9sZGxlbiA9IHN0cnRvbChzKzEsICZzLCAxMCk7CisJCQlUVC5uZXdsaW5lID0gc3RydG9sKHMrMiwgJnMsIDEwKTsKKwkJCWlmICgqcyA9PSAnLCcpIFRULm5ld2xlbiA9IG5ld2xlbiA9IHN0cnRvbChzKzEsICZzLCAxMCk7CisKKwkJCWlmIChvbGRsZW4gPCAxICYmIG5ld2xlbiA8IDEpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlJlYWxseT8gJXMiLCBwYXRjaGxpbmUpOworCisJCQlUVC5jb250ZXh0ID0gMDsKKwkJCXN0YXRlID0gMjsKKworCQkJLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaHVuaywgb3BlbiB0aGUgZmlsZS4KKwkJCWlmIChUVC5maWxlaW4gPT0gLTEpIHsKKwkJCQlpbnQgb2xkc3VtLCBuZXdzdW0sIGVtcHR5ID0gMDsKKwkJCQljaGFyICpuYW1lOworCisJCQkJb2xkc3VtID0gVFQub2xkbGluZSArIG9sZGxlbjsKKwkJCQluZXdzdW0gPSBUVC5uZXdsaW5lICsgbmV3bGVuOworCisJCQkJbmFtZSA9IHJldmVyc2UgPyBvbGRuYW1lIDogbmV3bmFtZTsKKworCQkJCS8vIFdlJ3JlIGRlbGV0aW5nIG9sZG5hbWUgaWYgbmV3IGZpbGUgaXMgL2Rldi9udWxsIChiZWZvcmUgLXApCisJCQkJLy8gb3IgaWYgbmV3IGh1bmsgaXMgZW1wdHkgKHplcm8gY29udGV4dCkgYWZ0ZXIgcGF0Y2hpbmcKKwkJCQlpZiAoIXN0cmNtcChuYW1lLCAiL2Rldi9udWxsIikgfHwgIShyZXZlcnNlID8gb2xkc3VtIDogbmV3c3VtKSkKKwkJCQl7CisJCQkJCW5hbWUgPSByZXZlcnNlID8gbmV3bmFtZSA6IG9sZG5hbWU7CisJCQkJCWVtcHR5Kys7CisJCQkJfQorCisJCQkJLy8gaGFuZGxlIC1wIHBhdGggdHJ1bmNhdGlvbi4KKwkJCQlmb3IgKGk9MCwgcyA9IG5hbWU7ICpzOykgeworCQkJCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1BBVEhMRU4pICYmIFRULnByZWZpeCA9PSBpKSBicmVhazsKKwkJCQkJaWYgKCoocysrKT09Jy8nKSB7CisJCQkJCQluYW1lID0gczsKKwkJCQkJCWkrKzsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChlbXB0eSkgeworCQkJCQkvLyBGaWxlIGlzIGVtcHR5IGFmdGVyIHRoZSBwYXRjaGVzIGhhdmUgYmVlbiBhcHBsaWVkCisJCQkJCXN0YXRlID0gMDsKKwkJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1JNRU1QVFkpIHsKKwkJCQkJCS8vIElmIGZsYWcgLUUgb3IgLS1yZW1vdmUtZW1wdHktZmlsZXMgaXMgc2V0CisJCQkJCQlwcmludGYoInJlbW92aW5nICVzXG4iLCBuYW1lKTsKKwkJCQkJCXh1bmxpbmsobmFtZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGYoInBhdGNoaW5nIGZpbGUgJXNcbiIsIG5hbWUpOworCQkJCQkJeGNsb3NlKHhvcGVuKG5hbWUsIE9fV1JPTkxZIHwgT19UUlVOQykpOworCQkJCQl9CisJCQkJLy8gSWYgd2UndmUgZ290IGEgZmlsZSB0byBvcGVuLCBkbyBzby4KKwkJCQl9IGVsc2UgaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfUEFUSExFTikgfHwgaSA8PSBUVC5wcmVmaXgpIHsKKwkJCQkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKworCQkJCQkvLyBJZiB0aGUgb2xkIGZpbGUgd2FzIG51bGwsIHdlJ3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4KKwkJCQkJaWYgKCFzdHJjbXAob2xkbmFtZSwgIi9kZXYvbnVsbCIpIHx8ICFvbGRzdW0pIHsKKwkJCQkJCXByaW50ZigiY3JlYXRpbmcgJXNcbiIsIG5hbWUpOworCQkJCQkJcyA9IHN0cnJjaHIobmFtZSwgJy8nKTsKKwkJCQkJCWlmIChzKSB7CisJCQkJCQkJKnMgPSAwOworCQkJCQkJCWJiX21ha2VfZGlyZWN0b3J5KG5hbWUsIC0xLCBGSUxFVVRJTFNfUkVDVVIpOworCQkJCQkJCSpzID0gJy8nOworCQkJCQkJfQorCQkJCQkJVFQuZmlsZWluID0geG9wZW4obmFtZSwgT19DUkVBVHxPX0VYQ0x8T19SRFdSKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByaW50ZigicGF0Y2hpbmcgZmlsZSAlc1xuIiwgbmFtZSk7CisJCQkJCQlUVC5maWxlaW4gPSB4b3BlbihuYW1lLCBPX1JET05MWSk7CisJCQkJCX0KKworCQkJCQlUVC50ZW1wbmFtZSA9IHhhc3ByaW50ZigiJXNYWFhYWFgiLCBuYW1lKTsKKwkJCQkJVFQuZmlsZW91dCA9IHhta3N0ZW1wKFRULnRlbXBuYW1lKTsKKwkJCQkJLy8gU2V0IHBlcm1pc3Npb25zIG9mIG91dHB1dCBmaWxlCisJCQkJCWZzdGF0KFRULmZpbGVpbiwgJnN0YXRidWYpOworCQkJCQlmY2htb2QoVFQuZmlsZW91dCwgc3RhdGJ1Zi5zdF9tb2RlKTsKKworCQkJCQlUVC5saW5lbnVtID0gMDsKKwkJCQkJVFQuaHVua251bSA9IDA7CisJCQkJfQorCQkJfQorCisJCQlUVC5odW5rbnVtKys7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gSWYgd2UgZGlkbid0IGNvbnRpbnVlIGFib3ZlLCBkaXNjYXJkIHRoaXMgbGluZS4KKwkJZnJlZShwYXRjaGxpbmUpOworCX0KKworCWZpbmlzaF9vbGRmaWxlKCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShvbGRuYW1lKTsKKwkJZnJlZShuZXduYW1lKTsKKwl9CisKKwlyZXR1cm4gVFQuZXhpdHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvcGF0Y2hfYmJveC5jIGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9wYXRjaF9iYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYTVmZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvcGF0Y2hfYmJveC5jCkBAIC0wLDAgKzEsMzA2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBidXN5Ym94IHBhdGNoIGFwcGxldCB0byBoYW5kbGUgdGhlIHVuaWZpZWQgZGlmZiBmb3JtYXQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBhcHBsZXQgaXMgd3JpdHRlbiB0byB3b3JrIHdpdGggcGF0Y2hlcyBnZW5lcmF0ZWQgYnkgR05VIGRpZmYsCisgKiB3aGVyZSB0aGVyZSBpcyBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHkgYnVzeWJveCBwYXRjaCBzaGFsbCBiZWhhdmUKKyAqIGFzIHBlciBHTlUgcGF0Y2guCisgKgorICogVGhlcmUgaXMgYSBTVVN2MyBzcGVjaWZpY2F0aW9uIGZvciBwYXRjaCwgaG93ZXZlciBpdCBsb29rcyB0byBiZQorICogaW5jb21wbGV0ZSwgaXQgZG9lc250IGV2ZW4gbWVudGlvbiB1bmlmaWVkIGRpZmYgZm9ybWF0LgorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9wYXRjaC5odG1sCisgKgorICogSXNzdWVzCisgKiAtIE5vbi1pbnRlcmFjdGl2ZQorICogLSBQYXRjaGVzIG11c3QgYXBwbHkgY2xlYW5seSBvciBwYXRjaCAobm90IGp1c3Qgb25lIGh1bmspIHdpbGwgZmFpbC4KKyAqIC0gUmVqZWN0IGZpbGUgaXNudCBzYXZlZAorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdW5zaWduZWQgY29weV9saW5lcyhGSUxFICpzcmNfc3RyZWFtLCBGSUxFICpkc3Rfc3RyZWFtLCB1bnNpZ25lZCBsaW5lc19jb3VudCkKK3sKKwl3aGlsZSAoc3JjX3N0cmVhbSAmJiBsaW5lc19jb3VudCkgeworCQljaGFyICpsaW5lOworCQlsaW5lID0geG1hbGxvY19mZ2V0cyhzcmNfc3RyZWFtKTsKKwkJaWYgKGxpbmUgPT0gTlVMTCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZwdXRzKGxpbmUsIGRzdF9zdHJlYW0pID09IEVPRikgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcnJvciB3cml0aW5nIHRvIG5ldyBmaWxlIik7CisJCX0KKwkJZnJlZShsaW5lKTsKKwkJbGluZXNfY291bnQtLTsKKwl9CisJcmV0dXJuIGxpbmVzX2NvdW50OworfQorCisvKiBJZiBwYXRjaF9sZXZlbCBpcyAtMSBpdCB3aWxsIHJlbW92ZSBhbGwgZGlyZWN0b3J5IG5hbWVzCisgKiBjaGFyICpsaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQgY2hhcnMKKyAqIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBkb2VzbnQgZXhpc3Qgb3IgZXJyb3IKKyAqIHJldHVybnMgbWFsbG9jJ2VkIGZpbGVuYW1lCisgKiBOQjogZnJlZXMgMXN0IGFyZ3VtZW50IQorICovCitzdGF0aWMgY2hhciAqZXh0cmFjdF9maWxlbmFtZShjaGFyICpsaW5lLCBpbnQgcGF0Y2hfbGV2ZWwsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKwljaGFyICp0ZW1wID0gTlVMTCwgKmZpbGVuYW1lX3N0YXJ0X3B0ciA9IGxpbmUgKyA0OworCisJaWYgKHN0cm5jbXAobGluZSwgcGF0LCA0KSA9PSAwKSB7CisJCS8qIFRlcm1pbmF0ZSBzdHJpbmcgYXQgZW5kIG9mIHNvdXJjZSBmaWxlbmFtZSAqLworCQlsaW5lW3N0cmNzcG4obGluZSwgIlx0XG5cciIpXSA9ICdcMCc7CisKKwkJLyogU2tpcCBvdmVyIChwYXRjaF9sZXZlbCkgbnVtYmVyIG9mIGxlYWRpbmcgZGlyZWN0b3JpZXMgKi8KKwkJd2hpbGUgKHBhdGNoX2xldmVsLS0pIHsKKwkJCXRlbXAgPSBzdHJjaHIoZmlsZW5hbWVfc3RhcnRfcHRyLCAnLycpOworCQkJaWYgKCF0ZW1wKQorCQkJCWJyZWFrOworCQkJZmlsZW5hbWVfc3RhcnRfcHRyID0gdGVtcCArIDE7CisJCX0KKwkJdGVtcCA9IHhzdHJkdXAoZmlsZW5hbWVfc3RhcnRfcHRyKTsKKwl9CisJZnJlZShsaW5lKTsKKwlyZXR1cm4gdGVtcDsKK30KKworaW50IHBhdGNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwYXRjaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc2F2ZWRfc3RhdDsKKwljaGFyICpwYXRjaF9saW5lOworCUZJTEUgKnBhdGNoX2ZpbGU7CisJaW50IHBhdGNoX2xldmVsOworCWludCByZXQgPSAwOworCWNoYXIgcGx1cyA9ICcrJzsKKwl1bnNpZ25lZCBvcHQ7CisJZW51bSB7CisJCU9QVF9SID0gKDEgPDwgMiksCisJCU9QVF9OID0gKDEgPDwgMyksCisJCS8qT1BUX2YgPSAoMSA8PCA0KSwgaWdub3JlZCAqLworCQkvKk9QVF9FID0gKDEgPDwgNSksIGlnbm9yZWQsIHRoaXMgaXMgdGhlIGRlZmF1bHQgKi8KKwkJLypPUFRfZyA9ICgxIDw8IDYpLCBpZ25vcmVkICovCisJCU9QVF9kcnlfcnVuID0gKDEgPDwgNykgKiBFTkFCTEVfTE9OR19PUFRTLAorCX07CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyOworCXsKKwkJY29uc3QgY2hhciAqcCA9ICItMSI7CisJCWNvbnN0IGNoYXIgKmkgPSAiLSI7IC8qIGNvbXBhdCAqLworI2lmIEVOQUJMRV9MT05HX09QVFMKKwkJc3RhdGljIGNvbnN0IGNoYXIgcGF0Y2hfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkJInN0cmlwXDAiICAgICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAicCIKKwkJCSJpbnB1dFwwIiAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImkiCisJCQkicmV2ZXJzZVwwIiAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJSIgorCQkJImZvcndhcmRcMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiTiIKKwkJLyogIkFzc3VtZSB1c2VyIGtub3dzIHdoYXQgW3NdaGUgaXMgZG9pbmcsIGRvIG5vdCBhc2sgYW55IHF1ZXN0aW9ucyI6ICovCisJCQkiZm9yY2VcMCIgICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJmIiAvKmlnbm9yZWQqLworIyBpZiBFTkFCTEVfREVTS1RPUAorCQkJInJlbW92ZS1lbXB0eS1maWxlc1wwIiAgICBOb19hcmd1bWVudCAgICAgICAiRSIgLyppZ25vcmVkKi8KKwkJLyogIkNvbnRyb2xzIGFjdGlvbnMgd2hlbiBhIGZpbGUgaXMgdW5kZXIgUkNTIG9yIFNDQ1MgY29udHJvbCwKKwkJICogYW5kIGRvZXMgbm90IGV4aXN0IG9yIGlzIHJlYWQtb25seSBhbmQgbWF0Y2hlcyB0aGUgZGVmYXVsdCB2ZXJzaW9uLAorCQkgKiBvciB3aGVuIGEgZmlsZSBpcyB1bmRlciBDbGVhckNhc2UgY29udHJvbCBhbmQgZG9lcyBub3QgZXhpc3QuLi4iCisJCSAqIElPVzogcmF0aGVyIG9ic2N1cmUgb3B0aW9uLgorCQkgKiBCdXQgR2VudG9vJ3MgcG9ydGFnZSBkb2VzIHVzZSAtZzAgKi8KKwkJCSJnZXRcMCIgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImciIC8qaWdub3JlZCovCisjIGVuZGlmCisJCQkiZHJ5LXJ1blwwIiAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJceGZkIgorIyBpZiBFTkFCTEVfREVTS1RPUAorCQkJImJhY2t1cC1pZi1taXNtYXRjaFwwIiAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZSIgLyppZ25vcmVkKi8KKwkJCSJuby1iYWNrdXAtaWYtbWlzbWF0Y2hcMCIgTm9fYXJndW1lbnQgICAgICAgIlx4ZmYiIC8qaWdub3JlZCovCisjIGVuZGlmCisJCQk7CisJCWFwcGxldF9sb25nX29wdGlvbnMgPSBwYXRjaF9sb25nb3B0czsKKyNlbmRpZgorCQkvKiAtZiwtRSwtZyBhcmUgaWdub3JlZCAqLworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAicDppOlJOIiJmRWc6IiwgJnAsICZpLCBOVUxMKTsKKwkJaWYgKG9wdCAmIE9QVF9SKQorCQkJcGx1cyA9ICctJzsKKwkJcGF0Y2hfbGV2ZWwgPSB4YXRvaShwKTsgLyogY2FuIGJlIG5lZ2F0aXZlISAqLworCQlwYXRjaF9maWxlID0geGZvcGVuX3N0ZGluKGkpOworCX0KKworCXBhdGNoX2xpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHBhdGNoX2ZpbGUpOworCXdoaWxlIChwYXRjaF9saW5lKSB7CisJCUZJTEUgKnNyY19zdHJlYW07CisJCUZJTEUgKmRzdF9zdHJlYW07CisJCS8vY2hhciAqb2xkX2ZpbGVuYW1lOworCQljaGFyICpuZXdfZmlsZW5hbWU7CisJCWNoYXIgKmJhY2t1cF9maWxlbmFtZSA9IE5VTEw7CisJCXVuc2lnbmVkIHNyY19jdXJfbGluZSA9IDE7CisJCXVuc2lnbmVkIGRzdF9jdXJfbGluZSA9IDA7CisJCXVuc2lnbmVkIGRzdF9iZWdfbGluZTsKKwkJdW5zaWduZWQgYmFkX2h1bmtfY291bnQgPSAwOworCQl1bnNpZ25lZCBodW5rX2NvdW50ID0gMDsKKwkJc21hbGxpbnQgY29weV90cmFpbGluZ19saW5lc19mbGFnID0gMDsKKworCQkvKiBTa2lwIGV2ZXJ5dGhpbmcgdXB0byB0aGUgIi0tLSIgbWFya2VyCisJCSAqIE5vIG5lZWQgdG8gcGFyc2UgdGhlIGxpbmVzICJPbmx5IGluIDxkaXI+IiwgYW5kICJkaWZmIDxhcmdzPiIKKwkJICovCisJCWRvIHsKKwkJCS8qIEV4dHJhY3QgdGhlIGZpbGVuYW1lIHVzZWQgYmVmb3JlIHRoZSBwYXRjaCB3YXMgZ2VuZXJhdGVkICovCisJCQluZXdfZmlsZW5hbWUgPSBleHRyYWN0X2ZpbGVuYW1lKHBhdGNoX2xpbmUsIHBhdGNoX2xldmVsLCAiLS0tICIpOworCQkJLy8gd2FzIG9sZF9maWxlbmFtZSBhYm92ZQorCQkJcGF0Y2hfbGluZSA9IHhtYWxsb2NfZmdldGxpbmUocGF0Y2hfZmlsZSk7CisJCQlpZiAoIXBhdGNoX2xpbmUpIGdvdG8gcXVpdDsKKwkJfSB3aGlsZSAoIW5ld19maWxlbmFtZSk7CisJCWZyZWUobmV3X2ZpbGVuYW1lKTsgLy8gInNvdXJjZSIgZmlsZW5hbWUgaXMgaXJyZWxldmFudAorCisJCW5ld19maWxlbmFtZSA9IGV4dHJhY3RfZmlsZW5hbWUocGF0Y2hfbGluZSwgcGF0Y2hfbGV2ZWwsICIrKysgIik7CisJCWlmICghbmV3X2ZpbGVuYW1lKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBwYXRjaCIpOworCQl9CisKKwkJLyogR2V0IGFjY2VzcyByaWdodHMgZnJvbSB0aGUgZmlsZSB0byBiZSBwYXRjaGVkICovCisJCWlmIChzdGF0KG5ld19maWxlbmFtZSwgJnNhdmVkX3N0YXQpICE9IDApIHsKKwkJCWNoYXIgKnNsYXNoID0gc3RycmNocihuZXdfZmlsZW5hbWUsICcvJyk7CisJCQlpZiAoc2xhc2gpIHsKKwkJCQkvKiBDcmVhdGUgbGVhZGluZyBkaXJlY3RvcmllcyAqLworCQkJCSpzbGFzaCA9ICdcMCc7CisJCQkJYmJfbWFrZV9kaXJlY3RvcnkobmV3X2ZpbGVuYW1lLCAtMSwgRklMRVVUSUxTX1JFQ1VSKTsKKwkJCQkqc2xhc2ggPSAnLyc7CisJCQl9CisJCQlzcmNfc3RyZWFtID0gTlVMTDsKKwkJCXNhdmVkX3N0YXQuc3RfbW9kZSA9IDA2NDQ7CisJCX0gZWxzZSBpZiAoIShvcHQgJiBPUFRfZHJ5X3J1bikpIHsKKwkJCWJhY2t1cF9maWxlbmFtZSA9IHhhc3ByaW50ZigiJXMub3JpZyIsIG5ld19maWxlbmFtZSk7CisJCQl4cmVuYW1lKG5ld19maWxlbmFtZSwgYmFja3VwX2ZpbGVuYW1lKTsKKwkJCXNyY19zdHJlYW0gPSB4Zm9wZW5fZm9yX3JlYWQoYmFja3VwX2ZpbGVuYW1lKTsKKwkJfSBlbHNlCisJCQlzcmNfc3RyZWFtID0geGZvcGVuX2Zvcl9yZWFkKG5ld19maWxlbmFtZSk7CisKKwkJaWYgKG9wdCAmIE9QVF9kcnlfcnVuKSB7CisJCQlkc3Rfc3RyZWFtID0geGZvcGVuX2Zvcl93cml0ZSgiL2Rldi9udWxsIik7CisJCX0gZWxzZSB7CisJCQlkc3Rfc3RyZWFtID0geGZvcGVuX2Zvcl93cml0ZShuZXdfZmlsZW5hbWUpOworCQkJZmNobW9kKGZpbGVubyhkc3Rfc3RyZWFtKSwgc2F2ZWRfc3RhdC5zdF9tb2RlKTsKKwkJfQorCisJCXByaW50ZigicGF0Y2hpbmcgZmlsZSAlc1xuIiwgbmV3X2ZpbGVuYW1lKTsKKworCQkvKiBIYW5kbGUgYWxsIGh1bmtzIGZvciB0aGlzIGZpbGUgKi8KKwkJcGF0Y2hfbGluZSA9IHhtYWxsb2NfZmdldHMocGF0Y2hfZmlsZSk7CisJCXdoaWxlIChwYXRjaF9saW5lKSB7CisJCQl1bnNpZ25lZCBjb3VudDsKKwkJCXVuc2lnbmVkIHNyY19iZWdfbGluZTsKKwkJCXVuc2lnbmVkIGh1bmtfb2Zmc2V0X3N0YXJ0OworCQkJdW5zaWduZWQgc3JjX2xhc3RfbGluZSA9IDE7CisJCQl1bnNpZ25lZCBkc3RfbGFzdF9saW5lID0gMTsKKworCQkJaWYgKChzc2NhbmYocGF0Y2hfbGluZSwgIkBAIC0lZCwlZCArJWQsJWQiLCAmc3JjX2JlZ19saW5lLCAmc3JjX2xhc3RfbGluZSwgJmRzdF9iZWdfbGluZSwgJmRzdF9sYXN0X2xpbmUpIDwgMykKKwkJCSAmJiAoc3NjYW5mKHBhdGNoX2xpbmUsICJAQCAtJWQgKyVkLCVkIiwgJnNyY19iZWdfbGluZSwgJmRzdF9iZWdfbGluZSwgJmRzdF9sYXN0X2xpbmUpIDwgMikKKwkJCSkgeworCQkJCS8qIE5vIG1vcmUgaHVua3MgZm9yIHRoaXMgZmlsZSAqLworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBsdXMgIT0gJysnKSB7CisJCQkJLyogcmV2ZXJzZSBwYXRjaCAqLworCQkJCXVuc2lnbmVkIHRtcCA9IHNyY19sYXN0X2xpbmU7CisJCQkJc3JjX2xhc3RfbGluZSA9IGRzdF9sYXN0X2xpbmU7CisJCQkJZHN0X2xhc3RfbGluZSA9IHRtcDsKKwkJCQl0bXAgPSBzcmNfYmVnX2xpbmU7CisJCQkJc3JjX2JlZ19saW5lID0gZHN0X2JlZ19saW5lOworCQkJCWRzdF9iZWdfbGluZSA9IHRtcDsKKwkJCX0KKwkJCWh1bmtfY291bnQrKzsKKworCQkJaWYgKHNyY19iZWdfbGluZSAmJiBkc3RfYmVnX2xpbmUpIHsKKwkJCQkvKiBDb3B5IHVubW9kaWZpZWQgbGluZXMgdXB0byBzdGFydCBvZiBodW5rICovCisJCQkJLyogc3JjX2JlZ19saW5lIHdpbGwgYmUgMCBpZiBpdCdzIGEgbmV3IGZpbGUgKi8KKwkJCQljb3VudCA9IHNyY19iZWdfbGluZSAtIHNyY19jdXJfbGluZTsKKwkJCQlpZiAoY29weV9saW5lcyhzcmNfc3RyZWFtLCBkc3Rfc3RyZWFtLCBjb3VudCkpIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBzcmMgZmlsZSIpOworCQkJCX0KKwkJCQlzcmNfY3VyX2xpbmUgKz0gY291bnQ7CisJCQkJZHN0X2N1cl9saW5lICs9IGNvdW50OworCQkJCWNvcHlfdHJhaWxpbmdfbGluZXNfZmxhZyA9IDE7CisJCQl9CisJCQlzcmNfbGFzdF9saW5lICs9IGh1bmtfb2Zmc2V0X3N0YXJ0ID0gc3JjX2N1cl9saW5lOworCQkJZHN0X2xhc3RfbGluZSArPSBkc3RfY3VyX2xpbmU7CisKKwkJCXdoaWxlICgxKSB7CisJCQkJZnJlZShwYXRjaF9saW5lKTsKKwkJCQlwYXRjaF9saW5lID0geG1hbGxvY19mZ2V0cyhwYXRjaF9maWxlKTsKKwkJCQlpZiAocGF0Y2hfbGluZSA9PSBOVUxMKQorCQkJCQlicmVhazsgLyogRU9GICovCisJCQkJaWYgKCEqcGF0Y2hfbGluZSkgeworCQkJCQkvKiB3aGl0ZXNwYWNlLWRhbWFnZWQgcGF0Y2ggd2l0aCAiIiBsaW5lcyAqLworCQkJCQlmcmVlKHBhdGNoX2xpbmUpOworCQkJCQlwYXRjaF9saW5lID0geHN0cmR1cCgiICIpOworCQkJCX0KKwkJCQlpZiAoKCpwYXRjaF9saW5lICE9ICctJykgJiYgKCpwYXRjaF9saW5lICE9ICcrJykKKwkJCQkgJiYgKCpwYXRjaF9saW5lICE9ICcgJykKKwkJCQkpIHsKKwkJCQkJYnJlYWs7IC8qIEVuZCBvZiBodW5rICovCisJCQkJfQorCQkJCWlmICgqcGF0Y2hfbGluZSAhPSBwbHVzKSB7IC8qICctJyBvciAnICcgKi8KKwkJCQkJY2hhciAqc3JjX2xpbmUgPSBOVUxMOworCQkJCQlpZiAoc3JjX2N1cl9saW5lID09IHNyY19sYXN0X2xpbmUpCisJCQkJCQlicmVhazsKKwkJCQkJaWYgKHNyY19zdHJlYW0pIHsKKwkJCQkJCXNyY19saW5lID0geG1hbGxvY19mZ2V0cyhzcmNfc3RyZWFtKTsKKwkJCQkJCWlmIChzcmNfbGluZSkgeworCQkJCQkJCWludCBkaWZmID0gc3RyY21wKHNyY19saW5lLCBwYXRjaF9saW5lICsgMSk7CisJCQkJCQkJc3JjX2N1cl9saW5lKys7CisJCQkJCQkJZnJlZShzcmNfbGluZSk7CisJCQkJCQkJaWYgKGRpZmYpCisJCQkJCQkJCXNyY19saW5lID0gTlVMTDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKiBEbyBub3QgcGF0Y2ggYW4gYWxyZWFkeSBwYXRjaGVkIGh1bmsgd2l0aCAtTiAqLworCQkJCQlpZiAoc3JjX2xpbmUgPT0gMCAmJiAob3B0ICYgT1BUX04pKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlpZiAoIXNyY19saW5lKSB7CisJCQkJCQliYl9lcnJvcl9tc2coImh1bmsgIyV1IEZBSUxFRCBhdCAldSIsIGh1bmtfY291bnQsIGh1bmtfb2Zmc2V0X3N0YXJ0KTsKKwkJCQkJCWJhZF9odW5rX2NvdW50Kys7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoKnBhdGNoX2xpbmUgIT0gJyAnKSB7IC8qICctJyAqLworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGRzdF9jdXJfbGluZSA9PSBkc3RfbGFzdF9saW5lKQorCQkJCQlicmVhazsKKwkJCQlmcHV0cyhwYXRjaF9saW5lICsgMSwgZHN0X3N0cmVhbSk7CisJCQkJZHN0X2N1cl9saW5lKys7CisJCQl9IC8qIGVuZCBvZiB3aGlsZSBsb29wIGhhbmRsaW5nIG9uZSBodW5rICovCisJCX0gLyogZW5kIG9mIHdoaWxlIGxvb3AgaGFuZGxpbmcgb25lIGZpbGUgKi8KKworCQkvKiBDbGVhbnVwIGxhc3QgcGF0Y2hlZCBmaWxlICovCisJCWlmIChjb3B5X3RyYWlsaW5nX2xpbmVzX2ZsYWcpIHsKKwkJCWNvcHlfbGluZXMoc3JjX3N0cmVhbSwgZHN0X3N0cmVhbSwgKHVuc2lnbmVkKSgtMSkpOworCQl9CisJCWlmIChzcmNfc3RyZWFtKSB7CisJCQlmY2xvc2Uoc3JjX3N0cmVhbSk7CisJCX0KKwkJZmNsb3NlKGRzdF9zdHJlYW0pOworCQlpZiAoYmFkX2h1bmtfY291bnQpIHsKKwkJCXJldCA9IDE7CisJCQliYl9lcnJvcl9tc2coIiV1IG91dCBvZiAldSBodW5rIEZBSUxFRCIsIGJhZF9odW5rX2NvdW50LCBodW5rX2NvdW50KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEl0IHdvcmtlZCwgd2UgY2FuIHJlbW92ZSB0aGUgYmFja3VwICovCisJCQlpZiAoYmFja3VwX2ZpbGVuYW1lKSB7CisJCQkJdW5saW5rKGJhY2t1cF9maWxlbmFtZSk7CisJCQl9CisJCQlpZiAoIShvcHQgJiBPUFRfZHJ5X3J1bikKKwkJCSAmJiAoKGRzdF9jdXJfbGluZSA9PSAwKSB8fCAoZHN0X2JlZ19saW5lID09IDApKQorCQkJKSB7CisJCQkJLyogVGhlIG5ldyBwYXRjaGVkIGZpbGUgaXMgZW1wdHksIHJlbW92ZSBpdCAqLworCQkJCXh1bmxpbmsobmV3X2ZpbGVuYW1lKTsKKwkJCQkvLyAvKiBvbGRfZmlsZW5hbWUgYW5kIG5ld19maWxlbmFtZSBtYXkgYmUgdGhlIHNhbWUgZmlsZSAqLworCQkJCS8vIHVubGluayhvbGRfZmlsZW5hbWUpOworCQkJfQorCQl9CisJCWZyZWUoYmFja3VwX2ZpbGVuYW1lKTsKKwkJLy9mcmVlKG9sZF9maWxlbmFtZSk7CisJCWZyZWUobmV3X2ZpbGVuYW1lKTsKKwl9IC8qIGVuZCBvZiAid2hpbGUgdGhlcmUgYXJlIHBhdGNoIGxpbmVzIiAqLworIHF1aXQ6CisJLyogMCA9IFNVQ0NFU1MKKwkgKiAxID0gU29tZSBodW5rcyBmYWlsZWQKKwkgKiAyID0gTW9yZSBzZXJpb3VzIHByb2JsZW1zIChleGl0ZWQgZWFybGllcikKKwkgKi8KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9wYXRjaF90b3lib3guYyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvcGF0Y2hfdG95Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwYmYwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvcGF0Y2hfdG95Ym94LmMKQEAgLTAsMCArMSw1OTEgQEAKKy8qIEFkYXB0ZWQgZnJvbSB0b3lib3gncyBwYXRjaC4gKi8KKworLyogdmk6IHNldCBzdz00IHRzPTQ6CisgKgorICogcGF0Y2guYyAtIEFwcGx5IGEgInVuaXZlcnNhbCIgZGlmZi4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIHNlZSBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3BhdGNoLmh0bWwKKyAqIChCdXQgb25seSBkb2VzIC11LCBiZWNhdXNlIHdobyBzdGlsbCBjYXJlcyBhYm91dCAiZWQiPykKKyAqCisgKiBUT0RPOgorICogLWIgYmFja3VwCisgKiAtbCB0cmVhdCBhbGwgd2hpdGVzcGFjZSBhcyBhIHNpbmdsZSBzcGFjZQorICogLU4gaWdub3JlIGFscmVhZHkgYXBwbGllZAorICogLWQgY2hkaXIgZmlyc3QKKyAqIC1EIGRlZmluZSB3cmFwICNpZmRlZiBhbmQgI2lmbmRlZiBhcm91bmQgY2hhbmdlcworICogLW8gb3V0ZmlsZSBvdXRwdXQgaGVyZSBpbnN0ZWFkIG9mIGluIHBsYWNlCisgKiAtciByZWplY3RmaWxlIHdyaXRlIHJlamVjdGVkIGh1bmtzIHRvIHRoaXMgZmlsZQorICoKKyAqIC1FIHJlbW92ZSBlbXB0eSBmaWxlcyAtLXJlbW92ZS1lbXB0eS1maWxlcworICogLWYgZm9yY2UgKG5vIHF1ZXN0aW9ucyBhc2tlZCkKKyAqIC1GIGZ1enogKG51bWJlciwgZGVmYXVsdCAyKQorICogW2ZpbGVdIHdoaWNoIGZpbGUgdG8gcGF0Y2gKKworVVNFX1BBVENIKE5FV1RPWShwYXRjaCwgVVNFX1RPWUJPWF9ERUJVRygieCIpInVwI2k6UiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFBBVENICisJYm9vbCAicGF0Y2giCisJZGVmYXVsdCB5CisJaGVscAorCSAgdXNhZ2U6IHBhdGNoIFstaSBmaWxlXSBbLXAgZGVwdGhdIFstUnVdCisKKwkgIEFwcGx5IGEgdW5pZmllZCBkaWZmIHRvIG9uZSBvciBtb3JlIGZpbGVzLgorCisJICAtaQlJbnB1dCBmaWxlIChkZWZhdWx0cz1zdGRpbikKKwkgIC1wCW51bWJlciBvZiAnLycgdG8gc3RyaXAgZnJvbSBzdGFydCBvZiBmaWxlIHBhdGhzIChkZWZhdWx0PWFsbCkKKwkgIC1SCVJldmVyc2UgcGF0Y2guCisJICAtdQlJZ25vcmVkIChvbmx5IGhhbmRsZXMgInVuaWZpZWQiIGRpZmZzKQorCisJICBUaGlzIHZlcnNpb24gb2YgcGF0Y2ggb25seSBoYW5kbGVzIHVuaWZpZWQgZGlmZnMsIGFuZCBvbmx5IG1vZGlmaWVzCisJICBhIGZpbGUgd2hlbiBhbGwgYWxsIGh1bmtzIHRvIHRoYXQgZmlsZSBhcHBseS4gIFBhdGNoIHByaW50cyBmYWlsZWQKKwkgIGh1bmtzIHRvIHN0ZGVyciwgYW5kIGV4aXRzIHdpdGggbm9uemVybyBzdGF0dXMgaWYgYW55IGh1bmtzIGZhaWwuCisKKwkgIEEgZmlsZSBjb21wYXJlZCBhZ2FpbnN0IC9kZXYvbnVsbCAob3Igd2l0aCBhIGRhdGUgPD0gdGhlIGVwb2NoKSBpcworCSAgY3JlYXRlZC9kZWxldGVkIGFzIGFwcHJvcHJpYXRlLgorKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdHJ1Y3QgZG91YmxlX2xpc3QgeworCXN0cnVjdCBkb3VibGVfbGlzdCAqbmV4dDsKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKnByZXY7CisJY2hhciAqZGF0YTsKK307CisKKy8vIFJldHVybiB0aGUgZmlyc3QgaXRlbSBmcm9tIHRoZSBsaXN0LCBhZHZhbmNpbmcgdGhlIGxpc3QgKHdoaWNoIG11c3QgYmUgY2FsbGVkCisvLyBhcyAmbGlzdCkKK3N0YXRpYwordm9pZCAqVE9ZX2xsaXN0X3BvcCh2b2lkICpsaXN0KQoreworCS8vIEknZCB1c2UgYSB2b2lkICoqIGZvciB0aGUgYXJndW1lbnQsIGFuZCBldmVuIGFjY2VwdCB0aGUgdHlwZWNhc3QgaW4gYWxsCisJLy8gY2FsbGVycyBhcyBkb2N1bWVudGF0aW9uIHlvdSBuZWVkIHRoZSAmLCBleGNlcHQgdGhlIHN0dXBpZCBjb21waWxlcgorCS8vIHdvdWxkIHRoZW4gc2NyZWFtIGFib3V0IHR5cGUtcHVubmVkIHBvaW50ZXJzLiAgU2NyZXcgaXQuCisJdm9pZCAqKmxsaXN0ID0gKHZvaWQgKiopbGlzdDsKKwl2b2lkICoqbmV4dCA9ICh2b2lkICoqKSpsbGlzdDsKKwkqbGxpc3QgPSAqbmV4dDsKKworCXJldHVybiAodm9pZCAqKW5leHQ7Cit9CisKKy8vIEZyZWUgYWxsIHRoZSBlbGVtZW50cyBvZiBhIGxpbmtlZCBsaXN0CisvLyBpZiBmcmVlaXQhPU5VTEwgY2FsbCBmcmVlaXQoKSBvbiBlYWNoIGVsZW1lbnQgYmVmb3JlIGZyZWVpbmcgaXQuCitzdGF0aWMKK3ZvaWQgVE9ZX2xsaXN0X2ZyZWUodm9pZCAqbGlzdCwgdm9pZCAoKmZyZWVpdCkodm9pZCAqZGF0YSkpCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJdm9pZCAqcG9wID0gVE9ZX2xsaXN0X3BvcCgmbGlzdCk7CisJCWlmIChmcmVlaXQpIGZyZWVpdChwb3ApOworCQllbHNlIGZyZWUocG9wKTsKKworCQkvLyBFbmQgZG91Ymx5IGxpbmtlZCBsaXN0IHRvby4KKwkJaWYgKGxpc3Q9PXBvcCkgYnJlYWs7CisJfQorfQorCisvLyBBZGQgYW4gZW50cnkgdG8gdGhlIGVuZCBvZmYgYSBkb3VibHkgbGlua2VkIGxpc3QKK3N0YXRpYworc3RydWN0IGRvdWJsZV9saXN0ICpkbGlzdF9hZGQoc3RydWN0IGRvdWJsZV9saXN0ICoqbGlzdCwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKmxpbmUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZG91YmxlX2xpc3QpKTsKKworCWxpbmUtPmRhdGEgPSBkYXRhOworCWlmICgqbGlzdCkgeworCQlsaW5lLT5uZXh0ID0gKmxpc3Q7CisJCWxpbmUtPnByZXYgPSAoKmxpc3QpLT5wcmV2OworCQkoKmxpc3QpLT5wcmV2LT5uZXh0ID0gbGluZTsKKwkJKCpsaXN0KS0+cHJldiA9IGxpbmU7CisJfSBlbHNlICpsaXN0ID0gbGluZS0+bmV4dCA9IGxpbmUtPnByZXYgPSBsaW5lOworCisJcmV0dXJuIGxpbmU7Cit9CisKKy8vIEVuc3VyZSBlbnRpcmUgcGF0aCBleGlzdHMuCisvLyBJZiBtb2RlICE9IC0xIHNldCBwZXJtaXNzaW9ucyBvbiBuZXdseSBjcmVhdGVkIGRpcnMuCisvLyBSZXF1aXJlcyB0aGF0IHBhdGggc3RyaW5nIGJlIHdyaXRhYmxlIChmb3IgdGVtcG9yYXJ5IG51bGwgdGVybWluYXRvcnMpLgorc3RhdGljCit2b2lkIHhta3BhdGgoY2hhciAqcGF0aCwgaW50IG1vZGUpCit7CisJY2hhciAqcCwgb2xkOworCW1vZGVfdCBtYXNrOworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWZvciAocCA9IHBhdGg7IDsgcCsrKSB7CisJCWlmICghKnAgfHwgKnAgPT0gJy8nKSB7CisJCQlvbGQgPSAqcDsKKwkJCSpwID0gcmMgPSAwOworCQkJaWYgKHN0YXQocGF0aCwgJnN0KSB8fCAhU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCWlmIChtb2RlICE9IC0xKSB7CisJCQkJCW1hc2sgPSB1bWFzaygwKTsKKwkJCQkJcmMgPSBta2RpcihwYXRoLCBtb2RlKTsKKwkJCQkJdW1hc2sobWFzayk7CisJCQkJfSBlbHNlIHJjID0gbWtkaXIocGF0aCwgMDc3Nyk7CisJCQl9CisJCQkqcCA9IG9sZDsKKwkJCWlmKHJjKSBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoIm1rcGF0aCAnJXMnIiwgcGF0aCk7CisJCX0KKwkJaWYgKCEqcCkgYnJlYWs7CisJfQorfQorCisvLyBTbG93LCBidXQgc21hbGwuCitzdGF0aWMKK2NoYXIgKmdldF9yYXdsaW5lKGludCBmZCwgbG9uZyAqcGxlbiwgY2hhciBlbmQpCit7CisJY2hhciBjLCAqYnVmID0gTlVMTDsKKwlsb25nIGxlbiA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWlmICgxPnJlYWQoZmQsICZjLCAxKSkgYnJlYWs7CisJCWlmICghKGxlbiAmIDYzKSkgYnVmPXhyZWFsbG9jKGJ1ZiwgbGVuKzY1KTsKKwkJaWYgKChidWZbbGVuKytdPWMpID09IGVuZCkgYnJlYWs7CisJfQorCWlmIChidWYpIGJ1ZltsZW5dPTA7CisJaWYgKHBsZW4pICpwbGVuID0gbGVuOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljCitjaGFyICpnZXRfbGluZShpbnQgZmQpCit7CisJbG9uZyBsZW47CisJY2hhciAqYnVmID0gZ2V0X3Jhd2xpbmUoZmQsICZsZW4sICdcbicpOworCisJaWYgKGJ1ZiAmJiBidWZbLS1sZW5dPT0nXG4nKSBidWZbbGVuXT0wOworCisJcmV0dXJuIGJ1ZjsKK30KKworLy8gQ29weSB0aGUgcmVzdCBvZiBpbiB0byBvdXQgYW5kIGNsb3NlIGJvdGggZmlsZXMuCitzdGF0aWMKK3ZvaWQgeHNlbmRmaWxlKGludCBpbiwgaW50IG91dCkKK3sKKwlsb25nIGxlbjsKKwljaGFyIGJ1Zls0MDk2XTsKKworCWlmIChpbjwwKSByZXR1cm47CisJZm9yICg7OykgeworCQlsZW4gPSBzYWZlX3JlYWQoaW4sIGJ1ZiwgNDA5Nik7CisJCWlmIChsZW48MSkgYnJlYWs7CisJCXh3cml0ZShvdXQsIGJ1ZiwgbGVuKTsKKwl9Cit9CisKKy8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgYW5kIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHdpdGggdGhlIGNvcHkuCitzdGF0aWMKK3ZvaWQgcmVwbGFjZV90ZW1wZmlsZShpbnQgZmRpbiwgaW50IGZkb3V0LCBjaGFyICoqdGVtcG5hbWUpCit7CisJY2hhciAqdGVtcCA9IHhzdHJkdXAoKnRlbXBuYW1lKTsKKworCXRlbXBbc3RybGVuKHRlbXApLTZdPTA7CisJaWYgKGZkaW4gIT0gLTEpIHsKKwkJeHNlbmRmaWxlKGZkaW4sIGZkb3V0KTsKKwkJeGNsb3NlKGZkaW4pOworCX0KKwl4Y2xvc2UoZmRvdXQpOworCXJlbmFtZSgqdGVtcG5hbWUsIHRlbXApOworCWZyZWUoKnRlbXBuYW1lKTsKKwlmcmVlKHRlbXApOworCSp0ZW1wbmFtZSA9IE5VTEw7Cit9CisKKy8vIE9wZW4gYSB0ZW1wb3JhcnkgZmlsZSB0byBjb3B5IGFuIGV4aXN0aW5nIGZpbGUgaW50by4KK3N0YXRpYworaW50IGNvcHlfdGVtcGZpbGUoaW50IGZkaW4sIGNoYXIgKm5hbWUsIGNoYXIgKip0ZW1wbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCBmZDsKKworCSp0ZW1wbmFtZSA9IHhhc3ByaW50ZigiJXNYWFhYWFgiLCBuYW1lKTsKKwlmZCA9IG1rc3RlbXAoKnRlbXBuYW1lKTsKKwlpZigtMSA9PSBmZCkgYmJfcGVycm9yX21zZ19hbmRfZGllKCJubyB0ZW1wIGZpbGUiKTsKKworCS8vIFNldCBwZXJtaXNzaW9ucyBvZiBvdXRwdXQgZmlsZQorCWZzdGF0KGZkaW4sICZzdGF0YnVmKTsKKwlmY2htb2QoZmQsIHN0YXRidWYuc3RfbW9kZSk7CisKKwlyZXR1cm4gZmQ7Cit9CisKKy8vIEFib3J0IHRoZSBjb3B5IGFuZCBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlLgorc3RhdGljCit2b2lkIGRlbGV0ZV90ZW1wZmlsZShpbnQgZmRpbiwgaW50IGZkb3V0LCBjaGFyICoqdGVtcG5hbWUpCit7CisJY2xvc2UoZmRpbik7CisJY2xvc2UoZmRvdXQpOworCXVubGluaygqdGVtcG5hbWUpOworCWZyZWUoKnRlbXBuYW1lKTsKKwkqdGVtcG5hbWUgPSBOVUxMOworfQorCisKKworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgKmluZmlsZTsKKwlsb25nIHByZWZpeDsKKworCXN0cnVjdCBkb3VibGVfbGlzdCAqY3VycmVudF9odW5rOworCWxvbmcgb2xkbGluZSwgb2xkbGVuLCBuZXdsaW5lLCBuZXdsZW4sIGxpbmVudW07CisJaW50IGNvbnRleHQsIHN0YXRlLCBmaWxlaW4sIGZpbGVvdXQsIGZpbGVwYXRjaCwgaHVua251bTsKKwljaGFyICp0ZW1wbmFtZTsKKworCS8vIHdhcyB0b3lzLmZvbzoKKwlpbnQgZXhpdHZhbDsKK307CisjZGVmaW5lIFRUICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfVFQoKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoVFQpKSk7IFwKK30gd2hpbGUgKDApCisKKworLy9iYm94IGhhZDogInA6aTpSTiIKKyNkZWZpbmUgRkxBR19TVFIgIlJ1cDppOngiCisvKiBGTEFHX1JFVkVSU0UgbXVzdCBiZSA9PSAxISBDb2RlIHVzZXMgdGhpcyBmYWN0LiAqLworI2RlZmluZSBGTEFHX1JFVkVSU0UgKDEgPDwgMCkKKyNkZWZpbmUgRkxBR191ICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEZMQUdfUEFUSExFTiAoMSA8PCAyKQorI2RlZmluZSBGTEFHX0lOUFVUICAgKDEgPDwgMykKKy8vbm9uLXN0YW5kYXJkOgorI2RlZmluZSBGTEFHX0RFQlVHICAgKDEgPDwgNCkKKworLy8gRGlzcG9zZSBvZiBhIGxpbmUgb2YgaW5wdXQsIGVpdGhlciBieSB3cml0aW5nIGl0IG91dCBvciBkaXNjYXJkaW5nIGl0LgorCisvLyBzdGF0ZSA8IDI6IGp1c3QgZnJlZQorLy8gc3RhdGUgPSAyOiB3cml0ZSB3aG9sZSBsaW5lIHRvIHN0ZGVycgorLy8gc3RhdGUgPSAzOiB3cml0ZSB3aG9sZSBsaW5lIHRvIGZpbGVvdXQKKy8vIHN0YXRlID4gMzogd3JpdGUgbGluZSsxIHRvIGZpbGVvdXQgd2hlbiAqbGluZSAhPSBzdGF0ZQorCisjZGVmaW5lIFBBVENIX0RFQlVHIChvcHRpb25fbWFzazMyICYgRkxBR19ERUJVRykKKworc3RhdGljIHZvaWQgZG9fbGluZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkb3VibGVfbGlzdCAqZGxpc3QgPSAoc3RydWN0IGRvdWJsZV9saXN0ICopZGF0YTsKKworCWlmIChUVC5zdGF0ZT4xICYmICpkbGlzdC0+ZGF0YSAhPSBUVC5zdGF0ZSkKKwkJZmRwcmludGYoVFQuc3RhdGUgPT0gMiA/IDIgOiBUVC5maWxlb3V0LAorCQkJIiVzXG4iLCBkbGlzdC0+ZGF0YSsoVFQuc3RhdGU+MyA/IDEgOiAwKSk7CisKKwlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJETyAlZDogJXNcbiIsIFRULnN0YXRlLCBkbGlzdC0+ZGF0YSk7CisKKwlmcmVlKGRsaXN0LT5kYXRhKTsKKwlmcmVlKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfb2xkZmlsZSh2b2lkKQoreworCWlmIChUVC50ZW1wbmFtZSkgcmVwbGFjZV90ZW1wZmlsZShUVC5maWxlaW4sIFRULmZpbGVvdXQsICZUVC50ZW1wbmFtZSk7CisJVFQuZmlsZW91dCA9IFRULmZpbGVpbiA9IC0xOworfQorCitzdGF0aWMgdm9pZCBmYWlsX2h1bmsodm9pZCkKK3sKKwlpZiAoIVRULmN1cnJlbnRfaHVuaykgcmV0dXJuOworCVRULmN1cnJlbnRfaHVuay0+cHJldi0+bmV4dCA9IDA7CisKKwlmZHByaW50ZigyLCAiSHVuayAlZCBGQUlMRUQgJWxkLyVsZC5cbiIsIFRULmh1bmtudW0sIFRULm9sZGxpbmUsIFRULm5ld2xpbmUpOworCVRULmV4aXR2YWwgPSAxOworCisJLy8gSWYgd2UgZ290IHRvIHRoaXMgcG9pbnQsIHdlJ3ZlIHNlZWtlZCB0byB0aGUgZW5kLiAgRGlzY2FyZCBjaGFuZ2VzIHRvCisJLy8gdGhpcyBmaWxlIGFuZCBhZHZhbmNlIHRvIG5leHQgZmlsZS4KKworCVRULnN0YXRlID0gMjsKKwlUT1lfbGxpc3RfZnJlZShUVC5jdXJyZW50X2h1bmssIGRvX2xpbmUpOworCVRULmN1cnJlbnRfaHVuayA9IE5VTEw7CisJZGVsZXRlX3RlbXBmaWxlKFRULmZpbGVpbiwgVFQuZmlsZW91dCwgJlRULnRlbXBuYW1lKTsKKwlUVC5zdGF0ZSA9IDA7Cit9CisKKy8vIEdpdmVuIGEgaHVuayBvZiBhIHVuaWZpZWQgZGlmZiwgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIHRvIHRoZSBmaWxlLgorLy8gVGhpcyBkb2VzIG5vdCB1c2UgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgaW5zdGVhZCB0cmVhdHMgYSBodW5rCisvLyBhcyBhIHNvcnQgb2YgcmVnZXguICBDb3BpZXMgZGF0YSBmcm9tIGlucHV0IHRvIG91dHB1dCB1bnRpbCBpdCBmaW5kcworLy8gdGhlIGNoYW5nZSB0byBiZSBtYWRlLCB0aGVuIG91dHB1dHMgdGhlIGNoYW5nZWQgZGF0YSBhbmQgcmV0dXJucy4KKy8vIChGaW5kaW5nIEVPRiBmaXJzdCBpcyBhbiBlcnJvci4pICBUaGlzIGlzIGEgc2luZ2xlIHBhc3Mgb3BlcmF0aW9uLCBzbworLy8gbXVsdGlwbGUgaHVua3MgbXVzdCBvY2N1ciBpbiBvcmRlciBpbiB0aGUgZmlsZS4KKworc3RhdGljIGludCBhcHBseV9vbmVfaHVuayh2b2lkKQoreworCXN0cnVjdCBkb3VibGVfbGlzdCAqcGxpc3QsICpidWYgPSBOVUxMLCAqY2hlY2s7CisJaW50IG1hdGNoZW9mID0gMCwgcmV2ZXJzZSA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX1JFVkVSU0UsIGJhY2t3YXJuID0gMDsKKworCS8vIEJyZWFrIGRvdWJseSBsaW5rZWQgbGlzdCBzbyB3ZSBjYW4gdXNlIHNpbmdseSBsaW5rZWQgdHJhdmVyc2FsIGZ1bmN0aW9uLgorCVRULmN1cnJlbnRfaHVuay0+cHJldi0+bmV4dCA9IE5VTEw7CisKKwkvLyBNYXRjaCBFT0YgaWYgdGhlcmUgYXJlbid0IGFzIG1hbnkgZW5kaW5nIGNvbnRleHQgbGluZXMgYXMgYmVnaW5uaW5nCisJZm9yIChwbGlzdCA9IFRULmN1cnJlbnRfaHVuazsgcGxpc3Q7IHBsaXN0ID0gcGxpc3QtPm5leHQpIHsKKwkJaWYgKHBsaXN0LT5kYXRhWzBdPT0nICcpIG1hdGNoZW9mKys7CisJCWVsc2UgbWF0Y2hlb2YgPSAwOworCQlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJIVU5LOiVzXG4iLCBwbGlzdC0+ZGF0YSk7CisJfQorCW1hdGNoZW9mID0gbWF0Y2hlb2YgPCBUVC5jb250ZXh0OworCisJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCJNQVRDSEVPRj0lY1xuIiwgbWF0Y2hlb2YgPyAnWScgOiAnTicpOworCisJLy8gTG9vcCB0aHJvdWdoIGlucHV0IGRhdGEgc2VhcmNoaW5nIGZvciB0aGlzIGh1bmsuICBNYXRjaCBhbGwgY29udGV4dAorCS8vIGxpbmVzIGFuZCBhbGwgbGluZXMgdG8gYmUgcmVtb3ZlZCB1bnRpbCB3ZSd2ZSBmb3VuZCB0aGUgZW5kIG9mIGEKKwkvLyBjb21wbGV0ZSBodW5rLgorCXBsaXN0ID0gVFQuY3VycmVudF9odW5rOworCWJ1ZiA9IE5VTEw7CisJaWYgKFRULmNvbnRleHQpIGZvciAoOzspIHsKKwkJY2hhciAqZGF0YSA9IGdldF9saW5lKFRULmZpbGVpbik7CisKKwkJVFQubGluZW51bSsrOworCisJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggbGluZSBvZiBodW5rIHRvIGNvbXBhcmUgd2l0aCBuZXh0LiAgKFNraXAgbGluZXMKKwkJLy8gb2YgdGhlIGh1bmsgd2UnZCBiZSBhZGRpbmcuKQorCQl3aGlsZSAocGxpc3QgJiYgKnBsaXN0LT5kYXRhID09ICIrLSJbcmV2ZXJzZV0pIHsKKwkJCWlmIChkYXRhICYmICFzdHJjbXAoZGF0YSwgcGxpc3QtPmRhdGErMSkpIHsKKwkJCQlpZiAoIWJhY2t3YXJuKSB7CisJCQkJCWZkcHJpbnRmKDIsIlBvc3NpYmx5IHJldmVyc2VkIGh1bmsgJWQgYXQgJWxkXG4iLAorCQkJCQkJVFQuaHVua251bSwgVFQubGluZW51bSk7CisJCQkJCWJhY2t3YXJuKys7CisJCQkJfQorCQkJfQorCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKKwkJfQorCisJCS8vIElzIHRoaXMgRU9GPworCQlpZiAoIWRhdGEpIHsKKwkJCWlmIChQQVRDSF9ERUJVRykgZmRwcmludGYoMiwgIklORU9GXG4iKTsKKworCQkJLy8gRG9lcyB0aGlzIGh1bmsgbmVlZCB0byBtYXRjaCBFT0Y/CisJCQlpZiAoIXBsaXN0ICYmIG1hdGNoZW9mKSBicmVhazsKKworCQkJLy8gRmlsZSBlbmRlZCBiZWZvcmUgd2UgZm91bmQgYSBwbGFjZSBmb3IgdGhpcyBodW5rLgorCQkJZmFpbF9odW5rKCk7CisJCQlnb3RvIGRvbmU7CisJCX0gZWxzZSBpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJJTjogJXNcbiIsIGRhdGEpOworCQljaGVjayA9IGRsaXN0X2FkZCgmYnVmLCBkYXRhKTsKKworCQkvLyBDb21wYXJlIHRoaXMgbGluZSB3aXRoIG5leHQgZXhwZWN0ZWQgbGluZSBvZiBodW5rLgorCQkvLyB0b2RvOiB0ZWFjaCB0aGUgc3RyY21wKCkgdG8gaWdub3JlIHdoaXRlc3BhY2UuCisKKwkJLy8gQSBtYXRjaCBjYW4gZmFpbCBiZWNhdXNlIHRoZSBuZXh0IGxpbmUgZG9lc24ndCBtYXRjaCwgb3IgYmVjYXVzZQorCQkvLyB3ZSBoaXQgdGhlIGVuZCBvZiBhIGh1bmsgdGhhdCBuZWVkZWQgRU9GLCBhbmQgdGhpcyBpc24ndCBFT0YuCisKKwkJLy8gSWYgbWF0Y2ggZmFpbGVkLCBmbHVzaCBmaXJzdCBsaW5lIG9mIGJ1ZmZlcmVkIGRhdGEgYW5kCisJCS8vIHJlY2hlY2sgYnVmZmVyZWQgZGF0YSBmb3IgYSBuZXcgbWF0Y2ggdW50aWwgd2UgZmluZCBvbmUgb3IgcnVuCisJCS8vIG91dCBvZiBidWZmZXIuCisKKwkJZm9yICg7OykgeworCQkJaWYgKCFwbGlzdCB8fCBzdHJjbXAoY2hlY2stPmRhdGEsIHBsaXN0LT5kYXRhKzEpKSB7CisJCQkJLy8gTWF0Y2ggZmFpbGVkLiAgV3JpdGUgb3V0IGZpcnN0IGxpbmUgb2YgYnVmZmVyZWQgZGF0YSBhbmQKKwkJCQkvLyByZWNoZWNrIHJlbWFpbmluZyBidWZmZXJlZCBkYXRhIGZvciBhIG5ldyBtYXRjaC4KKworCQkJCWlmIChQQVRDSF9ERUJVRykKKwkJCQkJZmRwcmludGYoMiwgIk5PVDogJXNcbiIsIHBsaXN0LT5kYXRhKTsKKworCQkJCVRULnN0YXRlID0gMzsKKwkJCQljaGVjayA9IFRPWV9sbGlzdF9wb3AoJmJ1Zik7CisJCQkJY2hlY2stPnByZXYtPm5leHQgPSBidWY7CisJCQkJYnVmLT5wcmV2ID0gY2hlY2stPnByZXY7CisJCQkJZG9fbGluZShjaGVjayk7CisJCQkJcGxpc3QgPSBUVC5jdXJyZW50X2h1bms7CisKKwkJCQkvLyBJZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aXRob3V0IGNvbmZpcm1pbmcgYQorCQkJCS8vIG1hdGNoLCByZWFkIG1vcmUgbGluZXMuCisJCQkJaWYgKGNoZWNrPT1idWYpIHsKKwkJCQkJYnVmID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNoZWNrID0gYnVmOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoUEFUQ0hfREVCVUcpCisJCQkJCWZkcHJpbnRmKDIsICJNQVlCRTogJXNcbiIsIHBsaXN0LT5kYXRhKTsKKwkJCQkvLyBUaGlzIGxpbmUgbWF0Y2hlcy4gIEFkdmFuY2UgcGxpc3QsIGRldGVjdCBzdWNjZXNzZnVsIG1hdGNoLgorCQkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CisJCQkJaWYgKCFwbGlzdCAmJiAhbWF0Y2hlb2YpIGdvdG8gb3V0OworCQkJCWNoZWNrID0gY2hlY2stPm5leHQ7CisJCQkJaWYgKGNoZWNrID09IGJ1ZikgYnJlYWs7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJLy8gV2UgaGF2ZSBhIG1hdGNoLiAgRW1pdCBjaGFuZ2VkIGRhdGEuCisJVFQuc3RhdGUgPSAiLSsiW3JldmVyc2VdOworCVRPWV9sbGlzdF9mcmVlKFRULmN1cnJlbnRfaHVuaywgZG9fbGluZSk7CisJVFQuY3VycmVudF9odW5rID0gTlVMTDsKKwlUVC5zdGF0ZSA9IDE7Citkb25lOgorCWlmIChidWYpIHsKKwkJYnVmLT5wcmV2LT5uZXh0ID0gTlVMTDsKKwkJVE9ZX2xsaXN0X2ZyZWUoYnVmLCBkb19saW5lKTsKKwl9CisKKwlyZXR1cm4gVFQuc3RhdGU7Cit9CisKKy8vIFJlYWQgYSBwYXRjaCBmaWxlIGFuZCBmaW5kIGh1bmtzLCBvcGVuaW5nL2NyZWF0aW5nL2RlbGV0aW5nIGZpbGVzLgorLy8gQ2FsbCBhcHBseV9vbmVfaHVuaygpIG9uIGVhY2ggaHVuay4KKworLy8gc3RhdGUgMDogTm90IGluIGEgaHVuaywgbG9vayBmb3IgKysrLgorLy8gc3RhdGUgMTogRm91bmQgKysrIGZpbGUgaW5kaWNhdG9yLCBsb29rIGZvciBAQAorLy8gc3RhdGUgMjogSW4gaHVuazogY291bnRpbmcgaW5pdGlhbCBjb250ZXh0IGxpbmVzCisvLyBzdGF0ZSAzOiBJbiBodW5rOiBnZXR0aW5nIGJvZHkKKworaW50IHBhdGNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwYXRjaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdHM7CisJaW50IHJldmVyc2UsIHN0YXRlID0gMDsKKwljaGFyICpvbGRuYW1lID0gTlVMTCwgKm5ld25hbWUgPSBOVUxMOworCWNoYXIgKm9wdF9wLCAqb3B0X2k7CisKKwlJTklUX1RUKCk7CisKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgRkxBR19TVFIsICZvcHRfcCwgJm9wdF9pKTsKKwlyZXZlcnNlID0gb3B0cyAmIEZMQUdfUkVWRVJTRTsKKwlUVC5wcmVmaXggPSAob3B0cyAmIEZMQUdfUEFUSExFTikgPyB4YXRvaShvcHRfcCkgOiAwOyAvLyBjYW4gYmUgbmVnYXRpdmUhCisJaWYgKG9wdHMgJiBGTEFHX0lOUFVUKSBUVC5maWxlcGF0Y2ggPSB4b3BlbihvcHRfaSwgT19SRE9OTFkpOworCVRULmZpbGVpbiA9IFRULmZpbGVvdXQgPSAtMTsKKworCS8vIExvb3AgdGhyb3VnaCB0aGUgbGluZXMgaW4gdGhlIHBhdGNoCisJZm9yKDs7KSB7CisJCWNoYXIgKnBhdGNobGluZTsKKworCQlwYXRjaGxpbmUgPSBnZXRfbGluZShUVC5maWxlcGF0Y2gpOworCQlpZiAoIXBhdGNobGluZSkgYnJlYWs7CisKKwkJLy8gT3RoZXIgdmVyc2lvbnMgb2YgcGF0Y2ggYWNjZXB0IGRhbWFnZWQgcGF0Y2hlcywKKwkJLy8gc28gd2UgbmVlZCB0byBhbHNvLgorCQlpZiAoISpwYXRjaGxpbmUpIHsKKwkJCWZyZWUocGF0Y2hsaW5lKTsKKwkJCXBhdGNobGluZSA9IHhzdHJkdXAoIiAiKTsKKwkJfQorCisJCS8vIEFyZSB3ZSBhc3NlbWJsaW5nIGEgaHVuaz8KKwkJaWYgKHN0YXRlID49IDIpIHsKKwkJCWlmICgqcGF0Y2hsaW5lPT0nICcgfHwgKnBhdGNobGluZT09JysnIHx8ICpwYXRjaGxpbmU9PSctJykgeworCQkJCWRsaXN0X2FkZCgmVFQuY3VycmVudF9odW5rLCBwYXRjaGxpbmUpOworCisJCQkJaWYgKCpwYXRjaGxpbmUgIT0gJysnKSBUVC5vbGRsZW4tLTsKKwkJCQlpZiAoKnBhdGNobGluZSAhPSAnLScpIFRULm5ld2xlbi0tOworCisJCQkJLy8gQ29udGV4dCBsaW5lPworCQkJCWlmICgqcGF0Y2hsaW5lPT0nICcgJiYgc3RhdGU9PTIpIFRULmNvbnRleHQrKzsKKwkJCQllbHNlIHN0YXRlPTM7CisKKwkJCQkvLyBJZiB3ZSd2ZSBjb25zdW1lZCBhbGwgZXhwZWN0ZWQgaHVuayBsaW5lcywgYXBwbHkgdGhlIGh1bmsuCisKKwkJCQlpZiAoIVRULm9sZGxlbiAmJiAhVFQubmV3bGVuKSBzdGF0ZSA9IGFwcGx5X29uZV9odW5rKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmYWlsX2h1bmsoKTsKKwkJCXN0YXRlID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gT3BlbiBhIG5ldyBmaWxlPworCQlpZiAoIXN0cm5jbXAoIi0tLSAiLCBwYXRjaGxpbmUsIDQpIHx8ICFzdHJuY21wKCIrKysgIiwgcGF0Y2hsaW5lLCA0KSkgeworCQkJY2hhciAqcywgKipuYW1lID0gcmV2ZXJzZSA/ICZuZXduYW1lIDogJm9sZG5hbWU7CisJCQlpbnQgaTsKKworCQkJaWYgKCpwYXRjaGxpbmUgPT0gJysnKSB7CisJCQkJbmFtZSA9IHJldmVyc2UgPyAmb2xkbmFtZSA6ICZuZXduYW1lOworCQkJCXN0YXRlID0gMTsKKwkJCX0KKworCQkJZnJlZSgqbmFtZSk7CisJCQlmaW5pc2hfb2xkZmlsZSgpOworCisJCQkvLyBUcmltIGRhdGUgZnJvbSBlbmQgb2YgZmlsZW5hbWUgKGlmIGFueSkuICBXZSBkb24ndCBjYXJlLgorCQkJZm9yIChzID0gcGF0Y2hsaW5lKzQ7ICpzICYmICpzIT0nXHQnOyBzKyspCisJCQkJaWYgKCpzPT0nXFwnICYmIHNbMV0pIHMrKzsKKwkJCWkgPSBhdG9pKHMpOworCQkJaWYgKGk+MTkwMCAmJiBpPD0xOTcwKQorCQkJCSpuYW1lID0geHN0cmR1cCgiL2Rldi9udWxsIik7CisJCQllbHNlIHsKKwkJCQkqcyA9IDA7CisJCQkJKm5hbWUgPSB4c3RyZHVwKHBhdGNobGluZSs0KTsKKwkJCX0KKworCQkJLy8gV2UgZGVmZXIgYWN0dWFsbHkgb3BlbmluZyB0aGUgZmlsZSBiZWNhdXNlIHN2biBwcm9kdWNlcyBicm9rZW4KKwkJCS8vIHBhdGNoZXMgdGhhdCBkb24ndCBzaWduYWwgdGhleSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBmaWxlIHRoZQorCQkJLy8gd2F5IHRoZSBwYXRjaCBtYW4gcGFnZSBzYXlzLCBzbyB5b3UgaGF2ZSB0byByZWFkIHRoZSBmaXJzdCBodW5rCisJCQkvLyBhbmQgX2d1ZXNzXy4KKworCQkvLyBTdGFydCBhIG5ldyBodW5rPworCQl9IGVsc2UgaWYgKHN0YXRlID09IDEgJiYgIXN0cm5jbXAoIkBAIC0iLCBwYXRjaGxpbmUsIDQpKSB7CisJCQlpbnQgaTsKKworCQkJaSA9IHNzY2FuZihwYXRjaGxpbmUrNCwgIiVsZCwlbGQgKyVsZCwlbGQiLCAmVFQub2xkbGluZSwKKwkJCQkJCSZUVC5vbGRsZW4sICZUVC5uZXdsaW5lLCAmVFQubmV3bGVuKTsKKwkJCWlmIChpICE9IDQpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHQgaHVuayAlZCBhdCAlbGQiLCBUVC5odW5rbnVtLCBUVC5saW5lbnVtKTsKKworCQkJVFQuY29udGV4dCA9IDA7CisJCQlzdGF0ZSA9IDI7CisKKwkJCS8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGh1bmssIG9wZW4gdGhlIGZpbGUuCisJCQlpZiAoVFQuZmlsZWluID09IC0xKSB7CisJCQkJaW50IG9sZHN1bSwgbmV3c3VtLCBkZWwgPSAwOworCQkJCWNoYXIgKnMsICpuYW1lOworCisJCQkJb2xkc3VtID0gVFQub2xkbGluZSArIFRULm9sZGxlbjsKKwkJCQluZXdzdW0gPSBUVC5uZXdsaW5lICsgVFQubmV3bGVuOworCisJCQkJbmFtZSA9IHJldmVyc2UgPyBvbGRuYW1lIDogbmV3bmFtZTsKKworCQkJCS8vIFdlJ3JlIGRlbGV0aW5nIG9sZG5hbWUgaWYgbmV3IGZpbGUgaXMgL2Rldi9udWxsIChiZWZvcmUgLXApCisJCQkJLy8gb3IgaWYgbmV3IGh1bmsgaXMgZW1wdHkgKHplcm8gY29udGV4dCkgYWZ0ZXIgcGF0Y2hpbmcKKwkJCQlpZiAoIXN0cmNtcChuYW1lLCAiL2Rldi9udWxsIikgfHwgIShyZXZlcnNlID8gb2xkc3VtIDogbmV3c3VtKSkKKwkJCQl7CisJCQkJCW5hbWUgPSByZXZlcnNlID8gbmV3bmFtZSA6IG9sZG5hbWU7CisJCQkJCWRlbCsrOworCQkJCX0KKworCQkJCS8vIGhhbmRsZSAtcCBwYXRoIHRydW5jYXRpb24uCisJCQkJZm9yIChpPTAsIHMgPSBuYW1lOyAqczspIHsKKwkJCQkJaWYgKChvcHRpb25fbWFzazMyICYgRkxBR19QQVRITEVOKSAmJiBUVC5wcmVmaXggPT0gaSkgYnJlYWs7CisJCQkJCWlmICgqKHMrKyk9PScvJykgeworCQkJCQkJbmFtZSA9IHM7CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoZGVsKSB7CisJCQkJCXByaW50ZigicmVtb3ZpbmcgJXNcbiIsIG5hbWUpOworCQkJCQl4dW5saW5rKG5hbWUpOworCQkJCQlzdGF0ZSA9IDA7CisJCQkJLy8gSWYgd2UndmUgZ290IGEgZmlsZSB0byBvcGVuLCBkbyBzby4KKwkJCQl9IGVsc2UgaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfUEFUSExFTikgfHwgaSA8PSBUVC5wcmVmaXgpIHsKKwkJCQkJLy8gSWYgdGhlIG9sZCBmaWxlIHdhcyBudWxsLCB3ZSdyZSBjcmVhdGluZyBhIG5ldyBvbmUuCisJCQkJCWlmICghc3RyY21wKG9sZG5hbWUsICIvZGV2L251bGwiKSB8fCAhb2xkc3VtKSB7CisJCQkJCQlwcmludGYoImNyZWF0aW5nICVzXG4iLCBuYW1lKTsKKwkJCQkJCXMgPSBzdHJyY2hyKG5hbWUsICcvJyk7CisJCQkJCQlpZiAocykgeworCQkJCQkJCSpzID0gMDsKKwkJCQkJCQl4bWtwYXRoKG5hbWUsIC0xKTsKKwkJCQkJCQkqcyA9ICcvJzsKKwkJCQkJCX0KKwkJCQkJCVRULmZpbGVpbiA9IHhvcGVuKG5hbWUsIE9fQ1JFQVR8T19FWENMfE9fUkRXUik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGYoInBhdGNoaW5nIGZpbGUgJXNcbiIsIG5hbWUpOworCQkJCQkJVFQuZmlsZWluID0geG9wZW4obmFtZSwgT19SRFdSKTsKKwkJCQkJfQorCQkJCQlUVC5maWxlb3V0ID0gY29weV90ZW1wZmlsZShUVC5maWxlaW4sIG5hbWUsICZUVC50ZW1wbmFtZSk7CisJCQkJCVRULmxpbmVudW0gPSAwOworCQkJCQlUVC5odW5rbnVtID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCVRULmh1bmtudW0rKzsKKworCQkJY29udGludWU7CisJCX0KKworCQkvLyBJZiB3ZSBkaWRuJ3QgY29udGludWUgYWJvdmUsIGRpc2NhcmQgdGhpcyBsaW5lLgorCQlmcmVlKHBhdGNobGluZSk7CisJfQorCisJZmluaXNoX29sZGZpbGUoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShUVC5maWxlcGF0Y2gpOworCQlmcmVlKG9sZG5hbWUpOworCQlmcmVlKG5ld25hbWUpOworCX0KKworCXJldHVybiBUVC5leGl0dmFsOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9zZWQuYyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvc2VkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1MmNmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvc2VkLmMKQEAgLTAsMCArMSwxNDgzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZWQuYyAtIHZlcnkgbWluaW1hbGlzdCB2ZXJzaW9uIG9mIHNlZAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgTGluZW8sIGluYy4gYW5kIE1hcmsgV2hpdGxleQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBNYXJrIFdoaXRsZXkgPG1hcmt3QGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMiAgTWF0dCBLcmFhaQorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IEdsZW5uIE1jR3JhdGgKKyAqIENvcHlyaWdodCAoQykgMjAwMywyMDA0IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTUFJTlRBSU5FUjogUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIENvZGUgb3ZlcnZpZXcuCisgKgorICogRmlsZXMgYXJlIGxhaWQgb3V0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gIFNvIGZvcgorICogZXhhbXBsZSwgZXZlcnkgZnVuY3Rpb24gYWRkX2NtZCBjYWxscyBvY2N1cnMgYmVmb3JlIGFkZF9jbWQgaW4gdGhpcyBmaWxlLgorICoKKyAqIGFkZF9jbWQoKSBpcyBjYWxsZWQgb24gZWFjaCBsaW5lIG9mIHNlZCBjb21tYW5kIHRleHQgKGZyb20gYSBmaWxlIG9yIGZyb20KKyAqIHRoZSBjb21tYW5kIGxpbmUpLiAgSXQgY2FsbHMgZ2V0X2FkZHJlc3MoKSBhbmQgcGFyc2VfY21kX2FyZ3MoKS4gIFRoZQorICogcmVzdWx0aW5nIHNlZF9jbWRfdCBzdHJ1Y3R1cmVzIGFyZSBhcHBlbmRlZCB0byBhIGxpbmtlZCBsaXN0CisgKiAoRy5zZWRfY21kX2hlYWQvRy5zZWRfY21kX3RhaWwpLgorICoKKyAqIGFkZF9pbnB1dF9maWxlKCkgYWRkcyBhIEZJTEUqIHRvIHRoZSBsaXN0IG9mIGlucHV0IGZpbGVzLiAgV2UgbmVlZCB0bworICoga25vdyBhbGwgaW5wdXQgc291cmNlcyBhaGVhZCBvZiB0aW1lIHRvIGZpbmQgdGhlIGxhc3QgbGluZSBmb3IgdGhlICQgbWF0Y2guCisgKgorICogcHJvY2Vzc19maWxlcygpIGRvZXMgYWN0dWFsIHNlZGRpbmcsIHJlYWRpbmcgZGF0YSBsaW5lcyBmcm9tIGVhY2ggaW5wdXQgRklMRSAqCisgKiAod2hpY2ggY291bGQgYmUgc3RkaW4pIGFuZCBhcHBseWluZyB0aGUgc2VkIGNvbW1hbmQgbGlzdCAoc2VkX2NtZF9oZWFkKSB0bworICogZWFjaCBvZiB0aGUgcmVzdWx0aW5nIGxpbmVzLgorICoKKyAqIHNlZF9tYWluKCkgaXMgd2hlcmUgZXh0ZXJuYWwgY29kZSBjYWxscyBpbnRvIHRoaXMsIHdpdGggYSBjb21tYW5kIGxpbmUuCisgKi8KKworLyogU3VwcG9ydGVkIGZlYXR1cmVzIGFuZCBjb21tYW5kcyBpbiB0aGlzIHZlcnNpb24gb2Ygc2VkOgorICoKKyAqIC0gY29tbWVudHMgKCcjJykKKyAqIC0gYWRkcmVzcyBtYXRjaGluZzogbnVtfC9tYXRjaHN0ci9bLG51bXwvbWF0Y2hzdHIvfCRdY29tbWFuZAorICogLSBjb21tYW5kczogKHApcmludCwgKGQpZWxldGUsIChzKXVic3RpdHVlICh3aXRoIGcgJiBJIGZsYWdzKQorICogLSBlZGl0IGNvbW1hbmRzOiAoYSlwcGVuZCwgKGkpbnNlcnQsIChjKWhhbmdlCisgKiAtIGZpbGUgY29tbWFuZHM6IChyKWVhZAorICogLSBiYWNrcmVmZXJlbmNlcyBpbiBzdWJzdGl0dXRpb24gZXhwcmVzc2lvbnMgKFwwLCBcMSwgXDIuLi5cOSkKKyAqIC0gZ3JvdXBlZCBjb21tYW5kczoge2NtZDE7Y21kMn0KKyAqIC0gdHJhbnNsaXRlcmF0aW9uICh5L3NvdXJjZS1jaGFycy9kZXN0LWNoYXJzLykKKyAqIC0gcGF0dGVybiBzcGFjZSBob2xkIHNwYWNlIHN0b3JpbmcgLyBzd2FwcGluZyAoZywgaCwgeCkKKyAqIC0gbGFiZWxzIC8gYnJhbmNoaW5nICg6IGxhYmVsLCBiLCB0LCBUKQorICoKKyAqIChOb3RlOiBTcGVjaWZ5aW5nIGFuIGFkZHJlc3MgKHJhbmdlKSB0byBtYXRjaCBpcyAqb3B0aW9uYWwqOyBjb21tYW5kcworICogZGVmYXVsdCB0byB0aGUgd2hvbGUgcGF0dGVybiBzcGFjZSBpZiBubyBzcGVjaWZpYyBhZGRyZXNzIG1hdGNoIHdhcworICogcmVxdWVzdGVkLikKKyAqCisgKiBUb2RvOgorICogLSBDcmVhdGUgYSB3cmFwcGVyIGFyb3VuZCByZWdleCB0byBtYWtlIGxpYmMncyByZWdleCBjb25mb3JtIHdpdGggc2VkCisgKgorICogUmVmZXJlbmNlIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvc2VkLmh0bWwKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc2VkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWVmaW5yXSBTRURfQ01EIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzZWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWUgQ01ECUFkZCBDTUQgdG8gc2VkIGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFCUFkZCBGSUxFIGNvbnRlbnRzIHRvIHNlZCBjb21tYW5kcyB0byBiZSBleGVjdXRlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJRWRpdCBmaWxlcyBpbi1wbGFjZSAoZWxzZSBzZW5kcyByZXN1bHQgdG8gc3Rkb3V0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JU3VwcHJlc3MgYXV0b21hdGljIHByaW50aW5nIG9mIHBhdHRlcm4gc3BhY2UiCisvL3VzYWdlOiAgICAgIlxuCS1yCVVzZSBleHRlbmRlZCByZWdleCBzeW50YXgiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbklmIG5vIC1lIG9yIC1mLCB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudCBpcyB0aGUgc2VkIGNvbW1hbmQgc3RyaW5nLiIKKy8vdXNhZ2U6ICAgICAiXG5SZW1haW5pbmcgYXJndW1lbnRzIGFyZSBpbnB1dCBmaWxlcyAoc3RkaW4gaWYgbm9uZSkuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzZWRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZWNobyBcImZvb1wiIHwgc2VkIC1lICdzL2ZbYS16QS1aXW8vYmFyL2cnXG4iCisvL3VzYWdlOiAgICAgICAiYmFyXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInhyZWdleC5oIgorCisjaWYgMAorIyBkZWZpbmUgZGJnKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIGRiZyguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKworZW51bSB7CisJT1BUX2luX3BsYWNlID0gMSA8PCAwLAorfTsKKworLyogRWFjaCBzZWQgY29tbWFuZCB0dXJucyBpbnRvIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc2VkX2NtZF9zIHsKKwkvKiBPcmRlcmVkIGJ5IGFsaWdubWVudCByZXF1aXJlbWVudHM6IGN1cnJlbnRseSAzNiBieXRlcyBvbiB4ODYgKi8KKwlzdHJ1Y3Qgc2VkX2NtZF9zICpuZXh0OyAvKiBOZXh0IGNvbW1hbmQgKGxpbmtlZCBsaXN0LCBOVUxMIHRlcm1pbmF0ZWQpICovCisKKwkvKiBhZGRyZXNzIHN0b3JhZ2UgKi8KKwlyZWdleF90ICpiZWdfbWF0Y2g7ICAgICAvKiBzZWQgLWUgJy9tYXRjaC9jbWQnICovCisJcmVnZXhfdCAqZW5kX21hdGNoOyAgICAgLyogc2VkIC1lICcvbWF0Y2gvLC9lbmRfbWF0Y2gvY21kJyAqLworCXJlZ2V4X3QgKnN1Yl9tYXRjaDsgICAgIC8qIEZvciAncy9zdWJfbWF0Y2gvc3RyaW5nLycgKi8KKwlpbnQgYmVnX2xpbmU7ICAgICAgICAgICAvKiAnc2VkIDFwJyAgIDAgPT0gYXBwbHkgY29tbWFuZHMgdG8gYWxsIGxpbmVzICovCisJaW50IGJlZ19saW5lX29yaWc7ICAgICAgLyogY29weSBvZiB0aGUgYWJvdmUsIG5lZWRlZCBmb3IgLWkgKi8KKwlpbnQgZW5kX2xpbmU7ICAgICAgICAgICAvKiAnc2VkIDEsM3AnIDAgPT0gb25lIGxpbmUgb25seS4gLTEgPSBsYXN0IGxpbmUgKCQpICovCisKKwlGSUxFICpzd19maWxlOyAgICAgICAgICAvKiBGaWxlIChzdykgY29tbWFuZCB3cml0ZXMgdG8sIC0xIGZvciBub25lLiAqLworCWNoYXIgKnN0cmluZzsgICAgICAgICAgIC8qIERhdGEgc3RyaW5nIGZvciAoc2FpY3l0YikgY29tbWFuZHMuICovCisKKwl1bnNpZ25lZCB3aGljaF9tYXRjaDsgICAvKiAocykgV2hpY2ggbWF0Y2ggdG8gcmVwbGFjZSAoMCBmb3IgYWxsKSAqLworCisJLyogQml0ZmllbGRzIChnY2Mgd29uJ3QgZ3JvdXAgdGhlbSBpZiB3ZSBkb24ndCkgKi8KKwl1bnNpZ25lZCBpbnZlcnQ6MTsgICAgICAvKiB0aGUgJyEnIGFmdGVyIHRoZSBhZGRyZXNzICovCisJdW5zaWduZWQgaW5fbWF0Y2g6MTsgICAgLyogTmV4dCBsaW5lIGFsc28gaW5jbHVkZWQgaW4gbWF0Y2g/ICovCisJdW5zaWduZWQgc3ViX3A6MTsgICAgICAgLyogKHMpIHByaW50IG9wdGlvbiAqLworCisJY2hhciBzd19sYXN0X2NoYXI7ICAgICAgLyogTGFzdCBsaW5lIHdyaXR0ZW4gYnkgKHN3KSBoYWQgbm8gJ1xuJyAqLworCisJLyogR0VORVJBTCBGSUVMRFMgKi8KKwljaGFyIGNtZDsgICAgICAgICAgICAgICAvKiBUaGUgY29tbWFuZCBjaGFyOiBhYmNkRGdHaEhpbG5OcFBxcnN0d3h5Oj17fSAqLworfSBzZWRfY21kX3Q7CisKK3N0YXRpYyBjb25zdCBjaGFyIHNlbWljb2xvbl93aGl0ZXNwYWNlW10gQUxJR04xID0gIjsgXG5cclx0XHYiOworCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogb3B0aW9ucyAqLworCWludCBiZV9xdWlldCwgcmVnZXhfdHlwZTsKKwlGSUxFICpub25zdGRvdXQ7CisJY2hhciAqb3V0bmFtZSwgKmhvbGRfc3BhY2U7CisKKwkvKiBMaXN0IG9mIGlucHV0IGZpbGVzICovCisJaW50IGlucHV0X2ZpbGVfY291bnQsIGN1cnJlbnRfaW5wdXRfZmlsZTsKKwlGSUxFICoqaW5wdXRfZmlsZV9saXN0OworCisJcmVnbWF0Y2hfdCByZWdtYXRjaFsxMF07CisJcmVnZXhfdCAqcHJldmlvdXNfcmVnZXhfcHRyOworCisJLyogbGlua2VkIGxpc3Qgb2Ygc2VkIGNvbW1hbmRzICovCisJc2VkX2NtZF90ICpzZWRfY21kX2hlYWQsICoqc2VkX2NtZF90YWlsOworCisJLyogTGlua2VkIGxpc3Qgb2YgYXBwZW5kIGxpbmVzICovCisJbGxpc3RfdCAqYXBwZW5kX2hlYWQ7CisKKwljaGFyICphZGRfY21kX2xpbmU7CisKKwlzdHJ1Y3QgcGlwZWxpbmUgeworCQljaGFyICpidWY7ICAvKiBTcGFjZSB0byBob2xkIHN0cmluZyAqLworCQlpbnQgaWR4OyAgICAvKiBTcGFjZSB1c2VkICovCisJCWludCBsZW47ICAgIC8qIFNwYWNlIGFsbG9jYXRlZCAqLworCX0gcGlwZWxpbmU7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorc3RydWN0IEJVR19HX3Rvb19iaWcgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJRy5zZWRfY21kX3RhaWwgPSAmRy5zZWRfY21kX2hlYWQ7IFwKK30gd2hpbGUgKDApCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCitzdGF0aWMgdm9pZCBzZWRfZnJlZV9hbmRfY2xvc2Vfc3R1ZmYodm9pZCkKK3sKKwlzZWRfY21kX3QgKnNlZF9jbWQgPSBHLnNlZF9jbWRfaGVhZDsKKworCWxsaXN0X2ZyZWUoRy5hcHBlbmRfaGVhZCwgZnJlZSk7CisKKwl3aGlsZSAoc2VkX2NtZCkgeworCQlzZWRfY21kX3QgKnNlZF9jbWRfbmV4dCA9IHNlZF9jbWQtPm5leHQ7CisKKwkJaWYgKHNlZF9jbWQtPnN3X2ZpbGUpCisJCQl4cHJpbnRfYW5kX2Nsb3NlX2ZpbGUoc2VkX2NtZC0+c3dfZmlsZSk7CisKKwkJaWYgKHNlZF9jbWQtPmJlZ19tYXRjaCkgeworCQkJcmVnZnJlZShzZWRfY21kLT5iZWdfbWF0Y2gpOworCQkJZnJlZShzZWRfY21kLT5iZWdfbWF0Y2gpOworCQl9CisJCWlmIChzZWRfY21kLT5lbmRfbWF0Y2gpIHsKKwkJCXJlZ2ZyZWUoc2VkX2NtZC0+ZW5kX21hdGNoKTsKKwkJCWZyZWUoc2VkX2NtZC0+ZW5kX21hdGNoKTsKKwkJfQorCQlpZiAoc2VkX2NtZC0+c3ViX21hdGNoKSB7CisJCQlyZWdmcmVlKHNlZF9jbWQtPnN1Yl9tYXRjaCk7CisJCQlmcmVlKHNlZF9jbWQtPnN1Yl9tYXRjaCk7CisJCX0KKwkJZnJlZShzZWRfY21kLT5zdHJpbmcpOworCQlmcmVlKHNlZF9jbWQpOworCQlzZWRfY21kID0gc2VkX2NtZF9uZXh0OworCX0KKworCWZyZWUoRy5ob2xkX3NwYWNlKTsKKworCXdoaWxlIChHLmN1cnJlbnRfaW5wdXRfZmlsZSA8IEcuaW5wdXRfZmlsZV9jb3VudCkKKwkJZmNsb3NlKEcuaW5wdXRfZmlsZV9saXN0W0cuY3VycmVudF9pbnB1dF9maWxlKytdKTsKK30KKyNlbHNlCit2b2lkIHNlZF9mcmVlX2FuZF9jbG9zZV9zdHVmZih2b2lkKTsKKyNlbmRpZgorCisvKiBJZiBzb21ldGhpbmcgYmFkIGhhcHBlbnMgZHVyaW5nIC1pIG9wZXJhdGlvbiwgZGVsZXRlIHRlbXAgZmlsZSAqLworCitzdGF0aWMgdm9pZCBjbGVhbnVwX291dG5hbWUodm9pZCkKK3sKKwlpZiAoRy5vdXRuYW1lKSB1bmxpbmsoRy5vdXRuYW1lKTsKK30KKworLyogc3RyY3B5LCByZXBsYWNpbmcgIlxmcm9tIiB3aXRoICd0bycuIElmIHRvIGlzIE5VTCwgcmVwbGFjaW5nICJcYW55IiB3aXRoICdhbnknICovCisKK3N0YXRpYyB2b2lkIHBhcnNlX2VzY2FwZXMoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgbGVuLCBjaGFyIGZyb20sIGNoYXIgdG8pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCBsZW4pIHsKKwkJaWYgKHN0cmluZ1tpXSA9PSAnXFwnKSB7CisJCQlpZiAoIXRvIHx8IHN0cmluZ1tpKzFdID09IGZyb20pIHsKKwkJCQkqZGVzdCsrID0gdG8gPyB0byA6IHN0cmluZ1tpKzFdOworCQkJCWkgKz0gMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSpkZXN0KysgPSBzdHJpbmdbaSsrXTsKKwkJfQorCQkvKiBUT0RPOiBpcyBpdCBzYWZlIHdydCBhIHN0cmluZyB3aXRoIHRyYWlsaW5nICdcXCcgPyAqLworCQkqZGVzdCsrID0gc3RyaW5nW2krK107CisJfQorCSpkZXN0ID0gJ1wwJzsKK30KKworc3RhdGljIGNoYXIgKmNvcHlfcGFyc2luZ19lc2NhcGVzKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICpzOworCWNoYXIgKmRlc3QgPSB4bWFsbG9jKGxlbiArIDEpOworCisJLyogc2VkIHJlY29nbml6ZXMgXG4gKi8KKwkvKiBHTlUgc2VkIGFsc28gcmVjb2duaXplcyBcdCBhbmQgXHIgKi8KKwlmb3IgKHMgPSAiXG5uXHR0XHJyIjsgKnM7IHMgKz0gMikgeworCQlwYXJzZV9lc2NhcGVzKGRlc3QsIHN0cmluZywgbGVuLCBzWzFdLCBzWzBdKTsKKwkJc3RyaW5nID0gZGVzdDsKKwkJbGVuID0gc3RybGVuKGRlc3QpOworCX0KKwlyZXR1cm4gZGVzdDsKK30KKworCisvKgorICogaW5kZXhfb2ZfbmV4dF91bmVzY2FwZWRfcmVnZXhwX2RlbGltIC0gd2Fsa3MgbGVmdCB0byByaWdodCB0aHJvdWdoIGEgc3RyaW5nCisgKiBiZWdpbm5pbmcgYXQgYSBzcGVjaWZpZWQgaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHJlZ3VsYXIKKyAqIGV4cHJlc3Npb24gZGVsaW1pdGVyICh0eXBpY2FsbHkgYSBmb3J3YXJkIHNsYXNoICgnLycpKSBub3QgcHJlY2VkZWQgYnkKKyAqIGEgYmFja3NsYXNoICgnXCcpLiAgQSBuZWdhdGl2ZSBkZWxpbWl0ZXIgZGlzYWJsZXMgc3F1YXJlIGJyYWNrZXQgY2hlY2tpbmcuCisgKi8KK3N0YXRpYyBpbnQgaW5kZXhfb2ZfbmV4dF91bmVzY2FwZWRfcmVnZXhwX2RlbGltKGludCBkZWxpbWl0ZXIsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgYnJhY2tldCA9IC0xOworCWludCBlc2NhcGVkID0gMDsKKwlpbnQgaWR4ID0gMDsKKwljaGFyIGNoOworCisJaWYgKGRlbGltaXRlciA8IDApIHsKKwkJYnJhY2tldC0tOworCQlkZWxpbWl0ZXIgPSAtZGVsaW1pdGVyOworCX0KKworCWZvciAoOyAoY2ggPSBzdHJbaWR4XSkgIT0gJ1wwJzsgaWR4KyspIHsKKwkJaWYgKGJyYWNrZXQgPj0gMCkgeworCQkJaWYgKGNoID09ICddJworCQkJICYmICEoYnJhY2tldCA9PSBpZHggLSAxIHx8IChicmFja2V0ID09IGlkeCAtIDIgJiYgc3RyW2lkeCAtIDFdID09ICdeJykpCisJCQkpIHsKKwkJCQlicmFja2V0ID0gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoZXNjYXBlZCkKKwkJCWVzY2FwZWQgPSAwOworCQllbHNlIGlmIChjaCA9PSAnXFwnKQorCQkJZXNjYXBlZCA9IDE7CisJCWVsc2UgaWYgKGJyYWNrZXQgPT0gLTEgJiYgY2ggPT0gJ1snKQorCQkJYnJhY2tldCA9IGlkeDsKKwkJZWxzZSBpZiAoY2ggPT0gZGVsaW1pdGVyKQorCQkJcmV0dXJuIGlkeDsKKwl9CisKKwkvKiBpZiB3ZSBtYWtlIGl0IHRvIGhlcmUsIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5tYXRjaGVkICclYyciLCBkZWxpbWl0ZXIpOworfQorCisvKgorICogIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0aGlyZCBkZWxpbWl0ZXIKKyAqLworc3RhdGljIGludCBwYXJzZV9yZWdleF9kZWxpbShjb25zdCBjaGFyICpjbWRzdHIsIGNoYXIgKiptYXRjaCwgY2hhciAqKnJlcGxhY2UpCit7CisJY29uc3QgY2hhciAqY21kc3RyX3B0ciA9IGNtZHN0cjsKKwljaGFyIGRlbGltaXRlcjsKKwlpbnQgaWR4ID0gMDsKKworCS8qIHZlcmlmeSB0aGF0IHRoZSAncycgb3IgJ3knIGlzIGZvbGxvd2VkIGJ5IHNvbWV0aGluZy4gIFRoYXQgc29tZXRoaW5nCisJICogKHR5cGljYWxseSBhICdzbGFzaCcpIGlzIG5vdyBvdXIgcmVnZXhwIGRlbGltaXRlci4uLiAqLworCWlmICgqY21kc3RyID09ICdcMCcpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IGluIHN1YnN0aXR1dGlvbiBleHByZXNzaW9uIik7CisJZGVsaW1pdGVyID0gKmNtZHN0cl9wdHIrKzsKKworCS8qIHNhdmUgdGhlIG1hdGNoIHN0cmluZyAqLworCWlkeCA9IGluZGV4X29mX25leHRfdW5lc2NhcGVkX3JlZ2V4cF9kZWxpbShkZWxpbWl0ZXIsIGNtZHN0cl9wdHIpOworCSptYXRjaCA9IGNvcHlfcGFyc2luZ19lc2NhcGVzKGNtZHN0cl9wdHIsIGlkeCk7CisKKwkvKiBzYXZlIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgKi8KKwljbWRzdHJfcHRyICs9IGlkeCArIDE7CisJaWR4ID0gaW5kZXhfb2ZfbmV4dF91bmVzY2FwZWRfcmVnZXhwX2RlbGltKC1kZWxpbWl0ZXIsIGNtZHN0cl9wdHIpOworCSpyZXBsYWNlID0gY29weV9wYXJzaW5nX2VzY2FwZXMoY21kc3RyX3B0ciwgaWR4KTsKKworCXJldHVybiAoKGNtZHN0cl9wdHIgLSBjbWRzdHIpICsgaWR4KTsKK30KKworLyoKKyAqIHJldHVybnMgdGhlIGluZGV4IGluIHRoZSBzdHJpbmcganVzdCBwYXN0IHdoZXJlIHRoZSBhZGRyZXNzIGVuZHMuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2FkZHJlc3MoY29uc3QgY2hhciAqbXlfc3RyLCBpbnQgKmxpbmVudW0sIHJlZ2V4X3QgKiogcmVnZXgpCit7CisJY29uc3QgY2hhciAqcG9zID0gbXlfc3RyOworCisJaWYgKGlzZGlnaXQoKm15X3N0cikpIHsKKwkJKmxpbmVudW0gPSBzdHJ0b2wobXlfc3RyLCAoY2hhcioqKSZwb3MsIDEwKTsKKwkJLyogZW5kc3RyIHNob3VsZG50IGV2ZXIgZXF1YWwgTlVMTCAqLworCX0gZWxzZSBpZiAoKm15X3N0ciA9PSAnJCcpIHsKKwkJKmxpbmVudW0gPSAtMTsKKwkJcG9zKys7CisJfSBlbHNlIGlmICgqbXlfc3RyID09ICcvJyB8fCAqbXlfc3RyID09ICdcXCcpIHsKKwkJaW50IG5leHQ7CisJCWNoYXIgZGVsaW1pdGVyOworCQljaGFyICp0ZW1wOworCisJCWRlbGltaXRlciA9ICcvJzsKKwkJaWYgKCpteV9zdHIgPT0gJ1xcJykgZGVsaW1pdGVyID0gKisrcG9zOworCQluZXh0ID0gaW5kZXhfb2ZfbmV4dF91bmVzY2FwZWRfcmVnZXhwX2RlbGltKGRlbGltaXRlciwgKytwb3MpOworCQl0ZW1wID0gY29weV9wYXJzaW5nX2VzY2FwZXMocG9zLCBuZXh0KTsKKwkJKnJlZ2V4ID0geG1hbGxvYyhzaXplb2YocmVnZXhfdCkpOworCQl4cmVnY29tcCgqcmVnZXgsIHRlbXAsIEcucmVnZXhfdHlwZXxSRUdfTkVXTElORSk7CisJCWZyZWUodGVtcCk7CisJCS8qIE1vdmUgcG9zaXRpb24gdG8gbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIgbGFzdCBkZWxpbWl0ZXIgKi8KKwkJcG9zICs9IChuZXh0KzEpOworCX0KKwlyZXR1cm4gcG9zIC0gbXlfc3RyOworfQorCisvKiBHcmFiIGEgZmlsZW5hbWUuICBXaGl0ZXNwYWNlIGF0IHN0YXJ0IGlzIHNraXBwZWQsIHRoZW4gZ29lcyB0byBFT0wuICovCitzdGF0aWMgaW50IHBhcnNlX2ZpbGVfY21kKC8qc2VkX2NtZF90ICpzZWRfY21kLCovIGNvbnN0IGNoYXIgKmZpbGVjbWRzdHIsIGNoYXIgKipyZXR2YWwpCit7CisJaW50IHN0YXJ0ID0gMCwgaWR4LCBoYWNrID0gMDsKKworCS8qIFNraXAgd2hpdGVzcGFjZSwgdGhlbiBncmFiIGZpbGVuYW1lIHRvIGVuZCBvZiBsaW5lICovCisJd2hpbGUgKGlzc3BhY2UoZmlsZWNtZHN0cltzdGFydF0pKQorCQlzdGFydCsrOworCWlkeCA9IHN0YXJ0OworCXdoaWxlIChmaWxlY21kc3RyW2lkeF0gJiYgZmlsZWNtZHN0cltpZHhdICE9ICdcbicpCisJCWlkeCsrOworCisJLyogSWYgbGluZXMgZ2x1ZWQgdG9nZXRoZXIsIHB1dCBiYWNrc2xhc2ggYmFjay4gKi8KKwlpZiAoZmlsZWNtZHN0cltpZHhdID09ICdcbicpCisJCWhhY2sgPSAxOworCWlmIChpZHggPT0gc3RhcnQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlbXB0eSBmaWxlbmFtZSIpOworCSpyZXR2YWwgPSB4c3RybmR1cChmaWxlY21kc3RyK3N0YXJ0LCBpZHgtc3RhcnQraGFjaysxKTsKKwlpZiAoaGFjaykKKwkJKCpyZXR2YWwpW2lkeF0gPSAnXFwnOworCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGludCBwYXJzZV9zdWJzdF9jbWQoc2VkX2NtZF90ICpzZWRfY21kLCBjb25zdCBjaGFyICpzdWJzdHIpCit7CisJaW50IGNmbGFncyA9IEcucmVnZXhfdHlwZTsKKwljaGFyICptYXRjaDsKKwlpbnQgaWR4OworCisJLyoKKwkgKiBBIHN1YnN0aXR1dGlvbiBjb21tYW5kIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CisJICogICAgcy9tYXRjaC9yZXBsYWNlLyAjZ0lwdworCSAqICAgIHx8ICAgICB8ICAgICAgICB8fHwKKwkgKiAgICBtYW5kYXRvcnkgICAgICAgb3B0aW9uYWwKKwkgKi8KKwlpZHggPSBwYXJzZV9yZWdleF9kZWxpbShzdWJzdHIsICZtYXRjaCwgJnNlZF9jbWQtPnN0cmluZyk7CisKKwkvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiYWNrIHJlZmVyZW5jZXMgaW4gdGhlIG1hdGNoIHN0cmluZyAqLworCS8qIE5vdGU6IHdlIGNvbXB1dGUgdGhpcyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBkb19zdWJzdF9jb21tYW5kKCkKKwkgKiBmdW5jdGlvbiB0byBzYXZlIHByb2Nlc3NvciB0aW1lLCBhdCB0aGUgZXhwZW5zZSBvZiBhIGxpdHRsZSBtb3JlIG1lbW9yeQorCSAqICg0IGJpdHMpIHBlciBzZWRfY21kICovCisKKwkvKiBwcm9jZXNzIHRoZSBmbGFncyAqLworCisJc2VkX2NtZC0+d2hpY2hfbWF0Y2ggPSAxOworCXdoaWxlIChzdWJzdHJbKytpZHhdKSB7CisJCS8qIFBhcnNlIG1hdGNoIG51bWJlciAqLworCQlpZiAoaXNkaWdpdChzdWJzdHJbaWR4XSkpIHsKKwkJCWlmIChtYXRjaFswXSAhPSAnXicpIHsKKwkJCQkvKiBNYXRjaCAwIHRyZWF0ZWQgYXMgYWxsLCBtdWx0aXBsZSBtYXRjaGVzIHdlIHRha2UgdGhlIGxhc3Qgb25lLiAqLworCQkJCWNvbnN0IGNoYXIgKnBvcyA9IHN1YnN0ciArIGlkeDsKKy8qIEZJWE1FOiBlcnJvciBjaGVjaz8gKi8KKwkJCQlzZWRfY21kLT53aGljaF9tYXRjaCA9ICh1bnNpZ25lZClzdHJ0b2woc3Vic3RyK2lkeCwgKGNoYXIqKikgJnBvcywgMTApOworCQkJCWlkeCA9IHBvcyAtIHN1YnN0cjsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFNraXAgc3BhY2VzICovCisJCWlmIChpc3NwYWNlKHN1YnN0cltpZHhdKSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoc3Vic3RyW2lkeF0pIHsKKwkJLyogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgKi8KKwkJY2FzZSAnZyc6CisJCQlpZiAobWF0Y2hbMF0gIT0gJ14nKQorCQkJCXNlZF9jbWQtPndoaWNoX21hdGNoID0gMDsKKwkJCWJyZWFrOworCQkvKiBQcmludCBwYXR0ZXJuIHNwYWNlICovCisJCWNhc2UgJ3AnOgorCQkJc2VkX2NtZC0+c3ViX3AgPSAxOworCQkJYnJlYWs7CisJCS8qIFdyaXRlIHRvIGZpbGUgKi8KKwkJY2FzZSAndyc6CisJCXsKKwkJCWNoYXIgKnRlbXA7CisJCQlpZHggKz0gcGFyc2VfZmlsZV9jbWQoLypzZWRfY21kLCovIHN1YnN0citpZHgsICZ0ZW1wKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIElnbm9yZSBjYXNlIChnbnUgZXhlbnNpb24pICovCisJCWNhc2UgJ0knOgorCQkJY2ZsYWdzIHw9IFJFR19JQ0FTRTsKKwkJCWJyZWFrOworCQkvKiBDb21tZW50ICovCisJCWNhc2UgJyMnOgorCQkJLy8gd2hpbGUgKHN1YnN0clsrK2lkeF0pIGNvbnRpbnVlOworCQkJaWR4ICs9IHN0cmxlbihzdWJzdHIgKyBpZHgpOyAvLyBzYW1lCisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJLyogRW5kIG9mIGNvbW1hbmQgKi8KKwkJY2FzZSAnOyc6CisJCWNhc2UgJ30nOgorCQkJZ290byBvdXQ7CisJCWRlZmF1bHQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIG9wdGlvbiBpbiBzdWJzdGl0dXRpb24gZXhwcmVzc2lvbiIpOworCQl9CisJfQorIG91dDoKKwkvKiBjb21waWxlIHRoZSBtYXRjaCBzdHJpbmcgaW50byBhIHJlZ2V4ICovCisJaWYgKCptYXRjaCAhPSAnXDAnKSB7CisJCS8qIElmIG1hdGNoIGlzIGVtcHR5LCB3ZSB1c2UgbGFzdCByZWdleCB1c2VkIGF0IHJ1bnRpbWUgKi8KKwkJc2VkX2NtZC0+c3ViX21hdGNoID0geG1hbGxvYyhzaXplb2YocmVnZXhfdCkpOworCQl4cmVnY29tcChzZWRfY21kLT5zdWJfbWF0Y2gsIG1hdGNoLCBjZmxhZ3MpOworCX0KKwlmcmVlKG1hdGNoKTsKKworCXJldHVybiBpZHg7Cit9CisKKy8qCisgKiAgUHJvY2VzcyB0aGUgY29tbWFuZHMgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwYXJzZV9jbWRfYXJncyhzZWRfY21kX3QgKnNlZF9jbWQsIGNvbnN0IGNoYXIgKmNtZHN0cikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBjbWRfbGV0dGVyc1tdID0gInNhaWNydzpidFR5ZERnR2hIbG5OcFBxeD17fSI7CisJZW51bSB7CisJCUlEWF9zID0gMCwKKwkJSURYX2EsCisJCUlEWF9pLAorCQlJRFhfYywKKwkJSURYX3IsCisJCUlEWF93LAorCQlJRFhfY29sb24sCisJCUlEWF9iLAorCQlJRFhfdCwKKwkJSURYX1QsCisJCUlEWF95LAorCQlJRFhfZCwKKwkJSURYX0QsCisJCUlEWF9nLAorCQlJRFhfRywKKwkJSURYX2gsCisJCUlEWF9ILAorCQlJRFhfbCwKKwkJSURYX24sCisJCUlEWF9OLAorCQlJRFhfcCwKKwkJSURYX1AsCisJCUlEWF9xLAorCQlJRFhfeCwKKwkJSURYX2VxdWFsLAorCQlJRFhfbGJyYWNlLAorCQlJRFhfcmJyYWNlLAorCQlJRFhfbnVsCisJfTsKKwlzdHJ1Y3QgY2hrIHsgY2hhciBjaGtbc2l6ZW9mKGNtZF9sZXR0ZXJzKS0xID09IElEWF9udWwgPyAxIDogLTFdOyB9OworCisJdW5zaWduZWQgaWR4ID0gc3RyY2hybnVsKGNtZF9sZXR0ZXJzLCBzZWRfY21kLT5jbWQpIC0gY21kX2xldHRlcnM7CisKKwkvKiBoYW5kbGUgKHMpdWJzdGl0dXRpb24gY29tbWFuZCAqLworCWlmIChpZHggPT0gSURYX3MpIHsKKwkJY21kc3RyICs9IHBhcnNlX3N1YnN0X2NtZChzZWRfY21kLCBjbWRzdHIpOworCX0KKwkvKiBoYW5kbGUgZWRpdCBjbWRzOiAoYSlwcGVuZCwgKGkpbnNlcnQsIGFuZCAoYyloYW5nZSAqLworCWVsc2UgaWYgKGlkeCA8PSBJRFhfYykgeyAvKiBhLGksYyAqLworCQlpZiAoKHNlZF9jbWQtPmVuZF9saW5lIHx8IHNlZF9jbWQtPmVuZF9tYXRjaCkgJiYgc2VkX2NtZC0+Y21kICE9ICdjJykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvbmx5IGEgYmVnaW5uaW5nIGFkZHJlc3MgY2FuIGJlIHNwZWNpZmllZCBmb3IgZWRpdCBjb21tYW5kcyIpOworCQlmb3IgKDs7KSB7CisJCQlpZiAoKmNtZHN0ciA9PSAnXG4nIHx8ICpjbWRzdHIgPT0gJ1xcJykgeworCQkJCWNtZHN0cisrOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFpc3NwYWNlKCpjbWRzdHIpKQorCQkJCWJyZWFrOworCQkJY21kc3RyKys7CisJCX0KKwkJc2VkX2NtZC0+c3RyaW5nID0geHN0cmR1cChjbWRzdHIpOworCQkvKiAiXGFueWNoYXIiIC0+ICJhbnljaGFyIiAqLworCQlwYXJzZV9lc2NhcGVzKHNlZF9jbWQtPnN0cmluZywgc2VkX2NtZC0+c3RyaW5nLCBzdHJsZW4oY21kc3RyKSwgJ1wwJywgJ1wwJyk7CisJCWNtZHN0ciArPSBzdHJsZW4oY21kc3RyKTsKKwl9CisJLyogaGFuZGxlIGZpbGUgY21kczogKHIpZWFkICovCisJZWxzZSBpZiAoaWR4IDw9IElEWF93KSB7IC8qIHIsdyAqLworCQlpZiAoc2VkX2NtZC0+ZW5kX2xpbmUgfHwgc2VkX2NtZC0+ZW5kX21hdGNoKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvbW1hbmQgb25seSB1c2VzIG9uZSBhZGRyZXNzIik7CisJCWNtZHN0ciArPSBwYXJzZV9maWxlX2NtZCgvKnNlZF9jbWQsKi8gY21kc3RyLCAmc2VkX2NtZC0+c3RyaW5nKTsKKwkJaWYgKHNlZF9jbWQtPmNtZCA9PSAndycpIHsKKwkJCXNlZF9jbWQtPnN3X2ZpbGUgPSB4Zm9wZW5fZm9yX3dyaXRlKHNlZF9jbWQtPnN0cmluZyk7CisJCQlzZWRfY21kLT5zd19sYXN0X2NoYXIgPSAnXG4nOworCQl9CisJfQorCS8qIGhhbmRsZSBicmFuY2ggY29tbWFuZHMgKi8KKwllbHNlIGlmIChpZHggPD0gSURYX1QpIHsgLyogOixiLHQsVCAqLworCQlpbnQgbGVuZ3RoOworCisJCWNtZHN0ciA9IHNraXBfd2hpdGVzcGFjZShjbWRzdHIpOworCQlsZW5ndGggPSBzdHJjc3BuKGNtZHN0ciwgc2VtaWNvbG9uX3doaXRlc3BhY2UpOworCQlpZiAobGVuZ3RoKSB7CisJCQlzZWRfY21kLT5zdHJpbmcgPSB4c3RybmR1cChjbWRzdHIsIGxlbmd0aCk7CisJCQljbWRzdHIgKz0gbGVuZ3RoOworCQl9CisJfQorCS8qIHRyYW5zbGF0aW9uIGNvbW1hbmQgKi8KKwllbHNlIGlmIChpZHggPT0gSURYX3kpIHsKKwkJY2hhciAqbWF0Y2gsICpyZXBsYWNlOworCQlpbnQgaSA9IGNtZHN0clswXTsKKworCQljbWRzdHIgKz0gcGFyc2VfcmVnZXhfZGVsaW0oY21kc3RyLCAmbWF0Y2gsICZyZXBsYWNlKSsxOworCQkvKiBcbiBhbHJlYWR5IHBhcnNlZCwgYnV0IFxkZWxpbWl0ZXIgbmVlZHMgdW5lc2NhcGluZy4gKi8KKwkJcGFyc2VfZXNjYXBlcyhtYXRjaCwgbWF0Y2gsIHN0cmxlbihtYXRjaCksIGksIGkpOworCQlwYXJzZV9lc2NhcGVzKHJlcGxhY2UsIHJlcGxhY2UsIHN0cmxlbihyZXBsYWNlKSwgaSwgaSk7CisKKwkJc2VkX2NtZC0+c3RyaW5nID0geHphbGxvYygoc3RybGVuKG1hdGNoKSArIDEpICogMik7CisJCWZvciAoaSA9IDA7IG1hdGNoW2ldICYmIHJlcGxhY2VbaV07IGkrKykgeworCQkJc2VkX2NtZC0+c3RyaW5nW2kqMl0gPSBtYXRjaFtpXTsKKwkJCXNlZF9jbWQtPnN0cmluZ1tpKjIrMV0gPSByZXBsYWNlW2ldOworCQl9CisJCWZyZWUobWF0Y2gpOworCQlmcmVlKHJlcGxhY2UpOworCX0KKwkvKiBpZiBpdCB3YXNudCBhIHNpbmdsZS1sZXR0ZXIgY29tbWFuZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cworCSAqIHRoZW4gaXQgbXVzdCBiZSBhbiBpbnZhbGlkIGNvbW1hbmQuCisJICovCisJZWxzZSBpZiAoaWR4ID49IElEWF9udWwpIHsgLyogbm90IGQsRCxnLEcsaCxILGwsbixOLHAsUCxxLHgsPSx7LH0gKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIGNvbW1hbmQgJWMiLCBzZWRfY21kLT5jbWQpOworCX0KKworCS8qIGdpdmUgYmFjayB3aGF0ZXZlcidzIGxlZnQgb3ZlciAqLworCXJldHVybiBjbWRzdHI7Cit9CisKKworLyogUGFyc2UgYWRkcmVzcytjb21tYW5kIHNldHMsIHNraXBwaW5nIGNvbW1lbnQgbGluZXMuICovCisKK3N0YXRpYyB2b2lkIGFkZF9jbWQoY29uc3QgY2hhciAqY21kc3RyKQoreworCXNlZF9jbWRfdCAqc2VkX2NtZDsKKwl1bnNpZ25lZCBsZW4sIG47CisKKwkvKiBBcHBlbmQgdGhpcyBsaW5lIHRvIGFueSB1bmZpbmlzaGVkIGxpbmUgZnJvbSBsYXN0IHRpbWUuICovCisJaWYgKEcuYWRkX2NtZF9saW5lKSB7CisJCWNoYXIgKnRwID0geGFzcHJpbnRmKCIlc1xuJXMiLCBHLmFkZF9jbWRfbGluZSwgY21kc3RyKTsKKwkJZnJlZShHLmFkZF9jbWRfbGluZSk7CisJCWNtZHN0ciA9IEcuYWRkX2NtZF9saW5lID0gdHA7CisJfQorCisJLyogSWYgdGhpcyBsaW5lIGVuZHMgd2l0aCB1bmVzY2FwZWQgYmFja3NsYXNoLCByZXF1ZXN0IG5leHQgbGluZS4gKi8KKwluID0gbGVuID0gc3RybGVuKGNtZHN0cik7CisJd2hpbGUgKG4gJiYgY21kc3RyW24tMV0gPT0gJ1xcJykKKwkJbi0tOworCWlmICgobGVuIC0gbikgJiAxKSB7IC8qIGlmIG9kZCBudW1iZXIgb2YgdHJhaWxpbmcgYmFja3NsYXNoZXMgKi8KKwkJaWYgKCFHLmFkZF9jbWRfbGluZSkKKwkJCUcuYWRkX2NtZF9saW5lID0geHN0cmR1cChjbWRzdHIpOworCQlHLmFkZF9jbWRfbGluZVtsZW4tMV0gPSAnXDAnOworCQlyZXR1cm47CisJfQorCisJLyogTG9vcCBwYXJzaW5nIGFsbCBjb21tYW5kcyBpbiB0aGlzIGxpbmUuICovCisJd2hpbGUgKCpjbWRzdHIpIHsKKwkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHNlbWljb2xvbnMgKi8KKwkJY21kc3RyICs9IHN0cnNwbihjbWRzdHIsIHNlbWljb2xvbl93aGl0ZXNwYWNlKTsKKworCQkvKiBJZiBubyBtb3JlIGNvbW1hbmRzLCBleGl0LiAqLworCQlpZiAoISpjbWRzdHIpIGJyZWFrOworCisJCS8qIGlmIHRoaXMgaXMgYSBjb21tZW50LCBqdW1wIHBhc3QgaXQgYW5kIGtlZXAgZ29pbmcgKi8KKwkJaWYgKCpjbWRzdHIgPT0gJyMnKSB7CisJCQkvKiAiI24iIGlzIHRoZSBzYW1lIGFzIHVzaW5nIC1uIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKwkJCWlmIChjbWRzdHJbMV0gPT0gJ24nKQorCQkJCUcuYmVfcXVpZXQrKzsKKwkJCWNtZHN0ciA9IHN0cnBicmsoY21kc3RyLCAiXG5cciIpOworCQkJaWYgKCFjbWRzdHIpIGJyZWFrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBwYXJzZSB0aGUgY29tbWFuZAorCQkgKiBmb3JtYXQgaXM6IFthZGRyXVssYWRkcl1bIV1jbWQKKwkJICogICAgICAgICAgICB8LS0tLXx8LS0tLS18fC18CisJCSAqICAgICAgICAgICAgcGFydDEgcGFydDIgIHBhcnQzCisJCSAqLworCisJCXNlZF9jbWQgPSB4emFsbG9jKHNpemVvZihzZWRfY21kX3QpKTsKKworCQkvKiBmaXJzdCBwYXJ0IChpZiBwcmVzZW50KSBpcyBhbiBhZGRyZXNzOiBlaXRoZXIgYSAnJCcsIGEgbnVtYmVyIG9yIGEgL3JlZ2V4LyAqLworCQljbWRzdHIgKz0gZ2V0X2FkZHJlc3MoY21kc3RyLCAmc2VkX2NtZC0+YmVnX2xpbmUsICZzZWRfY21kLT5iZWdfbWF0Y2gpOworCQlzZWRfY21kLT5iZWdfbGluZV9vcmlnID0gc2VkX2NtZC0+YmVnX2xpbmU7CisKKwkJLyogc2Vjb25kIHBhcnQgKGlmIHByZXNlbnQpIHdpbGwgYmVnaW4gd2l0aCBhIGNvbW1hICovCisJCWlmICgqY21kc3RyID09ICcsJykgeworCQkJaW50IGlkeDsKKworCQkJY21kc3RyKys7CisJCQlpZHggPSBnZXRfYWRkcmVzcyhjbWRzdHIsICZzZWRfY21kLT5lbmRfbGluZSwgJnNlZF9jbWQtPmVuZF9tYXRjaCk7CisJCQlpZiAoIWlkeCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gYWRkcmVzcyBhZnRlciBjb21tYSIpOworCQkJY21kc3RyICs9IGlkeDsKKwkJfQorCisJCS8qIHNraXAgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIGNvbW1hbmQgKi8KKwkJY21kc3RyID0gc2tpcF93aGl0ZXNwYWNlKGNtZHN0cik7CisKKwkJLyogQ2hlY2sgZm9yIGludmVyc2lvbiBmbGFnICovCisJCWlmICgqY21kc3RyID09ICchJykgeworCQkJc2VkX2NtZC0+aW52ZXJ0ID0gMTsKKwkJCWNtZHN0cisrOworCisJCQkvKiBza2lwIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBjb21tYW5kICovCisJCQljbWRzdHIgPSBza2lwX3doaXRlc3BhY2UoY21kc3RyKTsKKwkJfQorCisJCS8qIGxhc3QgcGFydCAobWFuZGF0b3J5KSB3aWxsIGJlIGEgY29tbWFuZCAqLworCQlpZiAoISpjbWRzdHIpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzc2luZyBjb21tYW5kIik7CisJCXNlZF9jbWQtPmNtZCA9ICpjbWRzdHIrKzsKKwkJY21kc3RyID0gcGFyc2VfY21kX2FyZ3Moc2VkX2NtZCwgY21kc3RyKTsKKworCQkvKiBBZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGNvbW1hbmQgYXJyYXkgKi8KKwkJKkcuc2VkX2NtZF90YWlsID0gc2VkX2NtZDsKKwkJRy5zZWRfY21kX3RhaWwgPSAmc2VkX2NtZC0+bmV4dDsKKwl9CisKKwkvKiBJZiB3ZSBnbHVlZCBtdWx0aXBsZSBsaW5lcyB0b2dldGhlciwgZnJlZSB0aGUgbWVtb3J5LiAqLworCWZyZWUoRy5hZGRfY21kX2xpbmUpOworCUcuYWRkX2NtZF9saW5lID0gTlVMTDsKK30KKworLyogQXBwZW5kIHRvIGEgc3RyaW5nLCByZWFsbG9jYXRpbmcgbWVtb3J5IGFzIG5lY2Vzc2FyeS4gKi8KKworI2RlZmluZSBQSVBFX0dST1cgNjQKKworc3RhdGljIHZvaWQgcGlwZV9wdXRjKGNoYXIgYykKK3sKKwlpZiAoRy5waXBlbGluZS5pZHggPT0gRy5waXBlbGluZS5sZW4pIHsKKwkJRy5waXBlbGluZS5idWYgPSB4cmVhbGxvYyhHLnBpcGVsaW5lLmJ1ZiwKKwkJCQlHLnBpcGVsaW5lLmxlbiArIFBJUEVfR1JPVyk7CisJCUcucGlwZWxpbmUubGVuICs9IFBJUEVfR1JPVzsKKwl9CisJRy5waXBlbGluZS5idWZbRy5waXBlbGluZS5pZHgrK10gPSBjOworfQorCitzdGF0aWMgdm9pZCBkb19zdWJzdF93X2JhY2tyZWZzKGNoYXIgKmxpbmUsIGNoYXIgKnJlcGxhY2UpCit7CisJaW50IGksIGo7CisKKwkvKiBnbyB0aHJvdWdoIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgKi8KKwlmb3IgKGkgPSAwOyByZXBsYWNlW2ldOyBpKyspIHsKKwkJLyogaWYgd2UgZmluZCBhIGJhY2tyZWZlcmVuY2UgKFwxLCBcMiwgZXRjLikgcHJpbnQgdGhlIGJhY2tyZWYnZWQgKiB0ZXh0ICovCisJCWlmIChyZXBsYWNlW2ldID09ICdcXCcpIHsKKwkJCXVuc2lnbmVkIGJhY2tyZWYgPSByZXBsYWNlWysraV0gLSAnMCc7CisJCQlpZiAoYmFja3JlZiA8PSA5KSB7CisJCQkJLyogcHJpbnQgb3V0IHRoZSB0ZXh0IGhlbGQgaW4gRy5yZWdtYXRjaFtiYWNrcmVmXSAqLworCQkJCWlmIChHLnJlZ21hdGNoW2JhY2tyZWZdLnJtX3NvICE9IC0xKSB7CisJCQkJCWogPSBHLnJlZ21hdGNoW2JhY2tyZWZdLnJtX3NvOworCQkJCQl3aGlsZSAoaiA8IEcucmVnbWF0Y2hbYmFja3JlZl0ucm1fZW8pCisJCQkJCQlwaXBlX3B1dGMobGluZVtqKytdKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBJIF90aGlua18gaXQgaXMgaW1wb3NzaWJsZSB0byBnZXQgJ1wnIHRvIGJlCisJCQkgKiB0aGUgbGFzdCBjaGFyIGluIHJlcGxhY2Ugc3RyaW5nLiBUaHVzIHdlIGRvbnQgY2hlY2sKKwkJCSAqIGZvciByZXBsYWNlW2ldID09IE5VTC4gKGNvdW50ZXJleGFtcGxlIGFueW9uZT8pICovCisJCQkvKiBpZiB3ZSBmaW5kIGEgYmFja3NsYXNoIGVzY2FwZWQgY2hhcmFjdGVyLCBwcmludCB0aGUgY2hhcmFjdGVyICovCisJCQlwaXBlX3B1dGMocmVwbGFjZVtpXSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBpZiB3ZSBmaW5kIGFuIHVuZXNjYXBlZCAnJicgcHJpbnQgb3V0IHRoZSB3aG9sZSBtYXRjaGVkIHRleHQuICovCisJCWlmIChyZXBsYWNlW2ldID09ICcmJykgeworCQkJaiA9IEcucmVnbWF0Y2hbMF0ucm1fc287CisJCQl3aGlsZSAoaiA8IEcucmVnbWF0Y2hbMF0ucm1fZW8pCisJCQkJcGlwZV9wdXRjKGxpbmVbaisrXSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBPdGhlcndpc2UganVzdCBvdXRwdXQgdGhlIGNoYXJhY3Rlci4gKi8KKwkJcGlwZV9wdXRjKHJlcGxhY2VbaV0pOworCX0KK30KKworc3RhdGljIGludCBkb19zdWJzdF9jb21tYW5kKHNlZF9jbWRfdCAqc2VkX2NtZCwgY2hhciAqKmxpbmVfcCkKK3sKKwljaGFyICpsaW5lID0gKmxpbmVfcDsKKwlpbnQgYWx0ZXJlZCA9IDA7CisJdW5zaWduZWQgbWF0Y2hfY291bnQgPSAwOworCXJlZ2V4X3QgKmN1cnJlbnRfcmVnZXg7CisKKwljdXJyZW50X3JlZ2V4ID0gc2VkX2NtZC0+c3ViX21hdGNoOworCS8qIEhhbmRsZSBlbXB0eSByZWdleC4gKi8KKwlpZiAoIWN1cnJlbnRfcmVnZXgpIHsKKwkJY3VycmVudF9yZWdleCA9IEcucHJldmlvdXNfcmVnZXhfcHRyOworCQlpZiAoIWN1cnJlbnRfcmVnZXgpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gcHJldmlvdXMgcmVnZXhwIik7CisJfQorCUcucHJldmlvdXNfcmVnZXhfcHRyID0gY3VycmVudF9yZWdleDsKKworCS8qIEZpbmQgdGhlIGZpcnN0IG1hdGNoICovCisJaWYgKFJFR19OT01BVENIID09IHJlZ2V4ZWMoY3VycmVudF9yZWdleCwgbGluZSwgMTAsIEcucmVnbWF0Y2gsIDApKQorCQlyZXR1cm4gMDsKKworCS8qIEluaXRpYWxpemUgdGVtcG9yYXJ5IG91dHB1dCBidWZmZXIuICovCisJRy5waXBlbGluZS5idWYgPSB4bWFsbG9jKFBJUEVfR1JPVyk7CisJRy5waXBlbGluZS5sZW4gPSBQSVBFX0dST1c7CisJRy5waXBlbGluZS5pZHggPSAwOworCisJLyogTm93IGxvb3AgdGhyb3VnaCwgc3Vic3RpdHV0aW5nIGZvciBtYXRjaGVzICovCisJZG8geworCQlpbnQgaTsKKworCQkvKiBXb3JrIGFyb3VuZCBidWcgaW4gZ2xpYmMgcmVnZXhlYywgZGVtb25zdHJhdGVkIGJ5OgorCQkgICBlY2hvICIgYS5iIiB8IGJ1c3lib3ggc2VkICdzIFteIC5dKiB4IGcnCisJCSAgIFRoZSBtYXRjaF9jb3VudCBjaGVjayBpcyBzbyBub3QgdG8gYnJlYWsKKwkJICAgZWNobyAiaGkiIHwgYnVzeWJveCBzZWQgJ3MvXi8hL2cnICovCisJCWlmICghRy5yZWdtYXRjaFswXS5ybV9zbyAmJiAhRy5yZWdtYXRjaFswXS5ybV9lbyAmJiBtYXRjaF9jb3VudCkgeworCQkJcGlwZV9wdXRjKCpsaW5lKyspOworCQkJY29udGludWU7CisJCX0KKworCQltYXRjaF9jb3VudCsrOworCisJCS8qIElmIHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoaXMgbWF0Y2gsIG91dHB1dCBvbGQgbGluZSB0bworCQkgICBlbmQgb2YgbWF0Y2ggYW5kIGNvbnRpbnVlICovCisJCWlmIChzZWRfY21kLT53aGljaF9tYXRjaAorCQkgJiYgKHNlZF9jbWQtPndoaWNoX21hdGNoICE9IG1hdGNoX2NvdW50KQorCQkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBHLnJlZ21hdGNoWzBdLnJtX2VvOyBpKyspCisJCQkJcGlwZV9wdXRjKCpsaW5lKyspOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBwcmludCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgbWF0Y2ggKi8KKwkJZm9yIChpID0gMDsgaSA8IEcucmVnbWF0Y2hbMF0ucm1fc287IGkrKykKKwkJCXBpcGVfcHV0YyhsaW5lW2ldKTsKKworCQkvKiB0aGVuIHByaW50IHRoZSBzdWJzdGl0dXRpb24gc3RyaW5nICovCisJCWRvX3N1YnN0X3dfYmFja3JlZnMobGluZSwgc2VkX2NtZC0+c3RyaW5nKTsKKworCQkvKiBhZHZhbmNlIHBhc3QgdGhlIG1hdGNoICovCisJCWxpbmUgKz0gRy5yZWdtYXRjaFswXS5ybV9lbzsKKwkJLyogZmxhZyB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLworCQlhbHRlcmVkKys7CisKKwkJLyogaWYgd2UncmUgbm90IGRvaW5nIHRoaXMgZ2xvYmFsbHksIGdldCBvdXQgbm93ICovCisJCWlmIChzZWRfY21kLT53aGljaF9tYXRjaCkKKwkJCWJyZWFrOworCisvL21heWJlIChHLnJlZ21hdGNoWzBdLnJtX2VvID8gUkVHX05PVEJPTCA6IDApIGluc3RlYWQgb2YgdW5jb25kaXRpb25hbCBSRUdfTk9UQk9MPworCX0gd2hpbGUgKCpsaW5lICYmIHJlZ2V4ZWMoY3VycmVudF9yZWdleCwgbGluZSwgMTAsIEcucmVnbWF0Y2gsIFJFR19OT1RCT0wpICE9IFJFR19OT01BVENIKTsKKworCS8qIENvcHkgcmVzdCBvZiBzdHJpbmcgaW50byBvdXRwdXQgcGlwZWxpbmUgKi8KKwl3aGlsZSAoMSkgeworCQljaGFyIGMgPSAqbGluZSsrOworCQlwaXBlX3B1dGMoYyk7CisJCWlmIChjID09ICdcMCcpCisJCQlicmVhazsKKwl9CisKKwlmcmVlKCpsaW5lX3ApOworCSpsaW5lX3AgPSBHLnBpcGVsaW5lLmJ1ZjsKKwlyZXR1cm4gYWx0ZXJlZDsKK30KKworLyogU2V0IGNvbW1hbmQgcG9pbnRlciB0byBwb2ludCB0byB0aGlzIGxhYmVsLiAgKERvZXMgbm90IGhhbmRsZSBudWxsIGxhYmVsLikgKi8KK3N0YXRpYyBzZWRfY21kX3QgKmJyYW5jaF90byhjaGFyICpsYWJlbCkKK3sKKwlzZWRfY21kX3QgKnNlZF9jbWQ7CisKKwlmb3IgKHNlZF9jbWQgPSBHLnNlZF9jbWRfaGVhZDsgc2VkX2NtZDsgc2VkX2NtZCA9IHNlZF9jbWQtPm5leHQpIHsKKwkJaWYgKHNlZF9jbWQtPmNtZCA9PSAnOicgJiYgc2VkX2NtZC0+c3RyaW5nICYmICFzdHJjbXAoc2VkX2NtZC0+c3RyaW5nLCBsYWJlbCkpIHsKKwkJCXJldHVybiBzZWRfY21kOworCQl9CisJfQorCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIGxhYmVsIGZvciBqdW1wIHRvICclcyciLCBsYWJlbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZChjaGFyICpzKQoreworCWxsaXN0X2FkZF90b19lbmQoJkcuYXBwZW5kX2hlYWQsIHhzdHJkdXAocykpOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF9hcHBlbmQodm9pZCkKK3sKKwljaGFyICpkYXRhOworCisJLyogT3V0cHV0IGFwcGVuZGVkIGxpbmVzLiAqLworCXdoaWxlICgoZGF0YSA9IChjaGFyICopbGxpc3RfcG9wKCZHLmFwcGVuZF9oZWFkKSkpIHsKKwkJZnByaW50ZihHLm5vbnN0ZG91dCwgIiVzXG4iLCBkYXRhKTsKKwkJZnJlZShkYXRhKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9pbnB1dF9maWxlKEZJTEUgKmZpbGUpCit7CisJRy5pbnB1dF9maWxlX2xpc3QgPSB4cmVhbGxvY192ZWN0b3IoRy5pbnB1dF9maWxlX2xpc3QsIDIsIEcuaW5wdXRfZmlsZV9jb3VudCk7CisJRy5pbnB1dF9maWxlX2xpc3RbRy5pbnB1dF9maWxlX2NvdW50KytdID0gZmlsZTsKK30KKworLyogR2V0IG5leHQgbGluZSBvZiBpbnB1dCBmcm9tIEcuaW5wdXRfZmlsZV9saXN0LCBmbHVzaGluZyBhcHBlbmQgYnVmZmVyIGFuZAorICogbm90aW5nIGlmIHdlIHJhbiBvdXQgb2YgZmlsZXMgd2l0aG91dCBhIG5ld2xpbmUgb24gdGhlIGxhc3QgbGluZSB3ZSByZWFkLgorICovCitlbnVtIHsKKwlOT19FT0xfQ0hBUiA9IDEsCisJTEFTVF9JU19OVUwgPSAyLAorfTsKK3N0YXRpYyBjaGFyICpnZXRfbmV4dF9saW5lKGNoYXIgKmdldHNfY2hhcikKK3sKKwljaGFyICp0ZW1wID0gTlVMTDsKKwlpbnQgbGVuOworCWNoYXIgZ2M7CisKKwlmbHVzaF9hcHBlbmQoKTsKKworCS8qIHdpbGwgYmUgcmV0dXJuZWQgaWYgbGFzdCBsaW5lIGluIHRoZSBmaWxlCisJICogZG9lc24ndCBlbmQgd2l0aCBlaXRoZXIgJ1xuJyBvciAnXDAnICovCisJZ2MgPSBOT19FT0xfQ0hBUjsKKwl3aGlsZSAoRy5jdXJyZW50X2lucHV0X2ZpbGUgPCBHLmlucHV0X2ZpbGVfY291bnQpIHsKKwkJRklMRSAqZnAgPSBHLmlucHV0X2ZpbGVfbGlzdFtHLmN1cnJlbnRfaW5wdXRfZmlsZV07CisJCS8qIFJlYWQgbGluZSB1cCB0byBhIG5ld2xpbmUgb3IgTlVMIGJ5dGUsIGluY2x1c2l2ZSwKKwkJICogcmV0dXJuIG1hbGxvYydlZCBjaGFyW10uIGxlbmd0aCBvZiB0aGUgY2h1bmsgcmVhZAorCQkgKiBpcyBzdG9yZWQgaW4gbGVuLiBOVUxMIGlmIEVPRi9lcnJvciAqLworCQl0ZW1wID0gYmJfZ2V0X2NodW5rX2Zyb21fZmlsZShmcCwgJmxlbik7CisJCWlmICh0ZW1wKSB7CisJCQkvKiBsZW4gPiAwIGhlcmUsIGl0J3Mgb2sgdG8gZG8gdGVtcFtsZW4tMV0gKi8KKwkJCWNoYXIgYyA9IHRlbXBbbGVuLTFdOworCQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdcMCcpIHsKKwkJCQl0ZW1wW2xlbi0xXSA9ICdcMCc7CisJCQkJZ2MgPSBjOworCQkJCWlmIChjID09ICdcMCcpIHsKKwkJCQkJaW50IGNoID0gZmdldGMoZnApOworCQkJCQlpZiAoY2ggIT0gRU9GKQorCQkJCQkJdW5nZXRjKGNoLCBmcCk7CisJCQkJCWVsc2UKKwkJCQkJCWdjID0gTEFTVF9JU19OVUw7CisJCQkJfQorCQkJfQorCQkJLyogZWxzZSB3ZSBwdXQgTk9fRU9MX0NIQVIgaW50byAqZ2V0c19jaGFyICovCisJCQlicmVhazsKKworCQkvKiBOQjogSSBoYWQgdGhlIGlkZWEgb2YgcGVla2luZyBuZXh0IGZpbGUocykgYW5kIHJldHVybmluZworCQkgKiBOT19FT0xfQ0hBUiBvbmx5IGlmIGl0IGlzIHRoZSAqbGFzdCogbm9uLWVtcHR5CisJCSAqIGlucHV0IGZpbGUuIEJ1dCB0aGVyZSBpcyBhIGNhc2Ugd2hlcmUgdGhpcyB3b24ndCB3b3JrOgorCQkgKiBmaWxlMTogImEgd29vXG5iIHdvbyIKKwkJICogZmlsZTI6ICJjIG5vXG5kIG5vIgorCQkgKiBzZWQgLW5lICdzL3dvby9iYW5nL3AnIGlucHV0MSBpbnB1dDIgPT4gImEgYmFuZ1xuYiBiYW5nIgorCQkgKiAobm90ZTogKm5vKiBuZXdsaW5lIGFmdGVyICJiIGJhbmciISkgKi8KKwkJfQorCQkvKiBDbG9zZSB0aGlzIGZpbGUgYW5kIGFkdmFuY2UgdG8gbmV4dCBvbmUgKi8KKwkJZmNsb3NlKGZwKTsKKwkJRy5jdXJyZW50X2lucHV0X2ZpbGUrKzsKKwl9CisJKmdldHNfY2hhciA9IGdjOworCXJldHVybiB0ZW1wOworfQorCisvKiBPdXRwdXQgbGluZSBvZiB0ZXh0LiAqLworLyogTm90ZToKKyAqIFRoZSB0cmlja3Mgd2l0aCBOT19FT0xfQ0hBUiBhbmQgbGFzdF9wdXRzX2NoYXIgYXJlIHRoZXJlIHRvIGVtdWxhdGUgZ251IHNlZC4KKyAqIFdpdGhvdXQgdGhlbSwgd2UgaGFkIHRoaXM6CisgKiBlY2hvIC1uIHRoaW5neSA+ejEKKyAqIGVjaG8gLW4gYWdhaW4gPnoyCisgKiA+em51bGwKKyAqIHNlZCAicy9pL3ovIiB6MSB6MiB6bnVsbCB8IGhleGR1bXAgLXZDCisgKiBvdXRwdXQ6CisgKiBnbnUgc2VkIDQuMS41OgorICogMDAwMDAwMDAgIDc0IDY4IDdhIDZlIDY3IDc5IDBhIDYxICA2NyA2MSA3YSA2ZSAgICAgICAgICAgICAgfHRoem5neS5hZ2F6bnwKKyAqIGJib3g6CisgKiAwMDAwMDAwMCAgNzQgNjggN2EgNmUgNjcgNzkgNjEgNjcgIDYxIDdhIDZlICAgICAgICAgICAgICAgICB8dGh6bmd5YWdhem58CisgKi8KK3N0YXRpYyB2b2lkIHB1dHNfbWF5YmVfbmV3bGluZShjaGFyICpzLCBGSUxFICpmaWxlLCBjaGFyICpsYXN0X3B1dHNfY2hhciwgY2hhciBsYXN0X2dldHNfY2hhcikKK3sKKwljaGFyIGxwYyA9ICpsYXN0X3B1dHNfY2hhcjsKKworCS8qIE5lZWQgdG8gaW5zZXJ0IGEgJ1xuJyBiZXR3ZWVuIHR3byBmaWxlcyBiZWNhdXNlIGZpcnN0IGZpbGUncworCSAqIGxhc3QgbGluZSB3YXNuJ3QgdGVybWluYXRlZD8gKi8KKwlpZiAobHBjICE9ICdcbicgJiYgbHBjICE9ICdcMCcpIHsKKwkJZnB1dGMoJ1xuJywgZmlsZSk7CisJCWxwYyA9ICdcbic7CisJfQorCWZwdXRzKHMsIGZpbGUpOworCisJLyogJ3gnIC0ganVzdCBzb21ldGhpbmcgd2hpY2ggaXMgbm90ICdcbicsICdcMCcgb3IgTk9fRU9MX0NIQVIgKi8KKwlpZiAoc1swXSkKKwkJbHBjID0gJ3gnOworCisJLyogaGFkIHRyYWlsaW5nICdcMCcgYW5kIGl0IHdhcyBsYXN0IGNoYXIgb2YgZmlsZT8gKi8KKwlpZiAobGFzdF9nZXRzX2NoYXIgPT0gTEFTVF9JU19OVUwpIHsKKwkJZnB1dGMoJ1wwJywgZmlsZSk7CisJCWxwYyA9ICd4JzsgLyogKi8KKwl9IGVsc2UKKwkvKiBoYWQgdHJhaWxpbmcgJ1xuJyBvciAnXDAnPyAqLworCWlmIChsYXN0X2dldHNfY2hhciAhPSBOT19FT0xfQ0hBUikgeworCQlmcHV0YyhsYXN0X2dldHNfY2hhciwgZmlsZSk7CisJCWxwYyA9IGxhc3RfZ2V0c19jaGFyOworCX0KKworCWlmIChmZXJyb3IoZmlsZSkpIHsKKwkJeGZ1bmNfZXJyb3JfcmV0dmFsID0gNDsgIC8qIEl0J3Mgd2hhdCBnbnUgc2VkIGV4aXRzIHdpdGguLi4gKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3dyaXRlX2Vycm9yKTsKKwl9CisJKmxhc3RfcHV0c19jaGFyID0gbHBjOworfQorCisjZGVmaW5lIHNlZF9wdXRzKHMsIG4pIChwdXRzX21heWJlX25ld2xpbmUocywgRy5ub25zdGRvdXQsICZsYXN0X3B1dHNfY2hhciwgbikpCisKK3N0YXRpYyBpbnQgYmVnX21hdGNoKHNlZF9jbWRfdCAqc2VkX2NtZCwgY29uc3QgY2hhciAqcGF0dGVybl9zcGFjZSkKK3sKKwlpbnQgcmV0dmFsID0gc2VkX2NtZC0+YmVnX21hdGNoICYmICFyZWdleGVjKHNlZF9jbWQtPmJlZ19tYXRjaCwgcGF0dGVybl9zcGFjZSwgMCwgTlVMTCwgMCk7CisJaWYgKHJldHZhbCkKKwkJRy5wcmV2aW91c19yZWdleF9wdHIgPSBzZWRfY21kLT5iZWdfbWF0Y2g7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogUHJvY2VzcyBhbGwgdGhlIGxpbmVzIGluIGFsbCB0aGUgZmlsZXMgKi8KKworc3RhdGljIHZvaWQgcHJvY2Vzc19maWxlcyh2b2lkKQoreworCWNoYXIgKnBhdHRlcm5fc3BhY2UsICpuZXh0X2xpbmU7CisJaW50IGxpbmVudW0gPSAwOworCWNoYXIgbGFzdF9wdXRzX2NoYXIgPSAnXG4nOworCWNoYXIgbGFzdF9nZXRzX2NoYXIsIG5leHRfZ2V0c19jaGFyOworCXNlZF9jbWRfdCAqc2VkX2NtZDsKKwlpbnQgc3Vic3RpdHV0ZWQ7CisKKwkvKiBQcmltZSB0aGUgcHVtcCAqLworCW5leHRfbGluZSA9IGdldF9uZXh0X2xpbmUoJm5leHRfZ2V0c19jaGFyKTsKKworCS8qIEdvIHRocm91Z2ggZXZlcnkgbGluZSBpbiBlYWNoIGZpbGUgKi8KKyBhZ2FpbjoKKwlzdWJzdGl0dXRlZCA9IDA7CisKKwkvKiBBZHZhbmNlIHRvIG5leHQgbGluZS4gIFN0b3AgaWYgb3V0IG9mIGxpbmVzLiAqLworCXBhdHRlcm5fc3BhY2UgPSBuZXh0X2xpbmU7CisJaWYgKCFwYXR0ZXJuX3NwYWNlKQorCQlyZXR1cm47CisJbGFzdF9nZXRzX2NoYXIgPSBuZXh0X2dldHNfY2hhcjsKKworCS8qIFJlYWQgb25lIGxpbmUgaW4gYWR2YW5jZSBzbyB3ZSBjYW4gYWN0IG9uIHRoZSBsYXN0IGxpbmUsCisJICogdGhlICckJyBhZGRyZXNzICovCisJbmV4dF9saW5lID0gZ2V0X25leHRfbGluZSgmbmV4dF9nZXRzX2NoYXIpOworCWxpbmVudW0rKzsKKworCS8qIEZvciBldmVyeSBsaW5lLCBnbyB0aHJvdWdoIGFsbCB0aGUgY29tbWFuZHMgKi8KKyByZXN0YXJ0OgorCWZvciAoc2VkX2NtZCA9IEcuc2VkX2NtZF9oZWFkOyBzZWRfY21kOyBzZWRfY21kID0gc2VkX2NtZC0+bmV4dCkgeworCQlpbnQgb2xkX21hdGNoZWQsIG1hdGNoZWQ7CisKKwkJb2xkX21hdGNoZWQgPSBzZWRfY21kLT5pbl9tYXRjaDsKKworCQkvKiBEZXRlcm1pbmUgaWYgdGhpcyBjb21tYW5kIG1hdGNoZXMgdGhpcyBsaW5lOiAqLworCisJCWRiZygibWF0Y2gxOiVkIiwgc2VkX2NtZC0+aW5fbWF0Y2gpOworCQlkYmcoIm1hdGNoMjolZCIsICghc2VkX2NtZC0+YmVnX2xpbmUgJiYgIXNlZF9jbWQtPmVuZF9saW5lCisJCQkJJiYgIXNlZF9jbWQtPmJlZ19tYXRjaCAmJiAhc2VkX2NtZC0+ZW5kX21hdGNoKSk7CisJCWRiZygibWF0Y2gzOiVkIiwgKHNlZF9jbWQtPmJlZ19saW5lID4gMAorCQkJJiYgKHNlZF9jbWQtPmVuZF9saW5lIHx8IHNlZF9jbWQtPmVuZF9tYXRjaAorCQkJICAgID8gKHNlZF9jbWQtPmJlZ19saW5lIDw9IGxpbmVudW0pCisJCQkgICAgOiAoc2VkX2NtZC0+YmVnX2xpbmUgPT0gbGluZW51bSkKKwkJCSAgICApCisJCQkpKTsKKwkJZGJnKCJtYXRjaDQ6JWQiLCAoYmVnX21hdGNoKHNlZF9jbWQsIHBhdHRlcm5fc3BhY2UpKSk7CisJCWRiZygibWF0Y2g1OiVkIiwgKHNlZF9jbWQtPmJlZ19saW5lID09IC0xICYmIG5leHRfbGluZSA9PSBOVUxMKSk7CisKKwkJLyogQXJlIHdlIGNvbnRpbnVpbmcgYSBwcmV2aW91cyBtdWx0aS1saW5lIG1hdGNoPyAqLworCQlzZWRfY21kLT5pbl9tYXRjaCA9IHNlZF9jbWQtPmluX21hdGNoCisJCQkvKiBPciBpcyBubyByYW5nZSBuZWNlc3Nhcnk/ICovCisJCQl8fCAoIXNlZF9jbWQtPmJlZ19saW5lICYmICFzZWRfY21kLT5lbmRfbGluZQorCQkJCSYmICFzZWRfY21kLT5iZWdfbWF0Y2ggJiYgIXNlZF9jbWQtPmVuZF9tYXRjaCkKKwkJCS8qIE9yIGRpZCB3ZSBtYXRjaCB0aGUgc3RhcnQgb2YgYSBudW1lcmljYWwgcmFuZ2U/ICovCisJCQl8fCAoc2VkX2NtZC0+YmVnX2xpbmUgPiAwCisJCQkgICAgJiYgKHNlZF9jbWQtPmVuZF9saW5lIHx8IHNlZF9jbWQtPmVuZF9tYXRjaAorCQkJCSAgLyogbm90ZTogZXZlbiBpZiBlbmQgaXMgbnVtZXJpYyBhbmQgaXMgPCBsaW5lbnVtIHRvbywKKwkJCQkgICAqIEdOVSBzZWQgbWF0Y2hlcyEgV2UgbWF0Y2ggdG9vLCB0aGVyZWZvcmUgd2UgZG9uJ3QKKwkJCQkgICAqIGNoZWNrIGhlcmUgdGhhdCBsaW5lbnVtIDw9IGVuZC4KKwkJCQkgICAqIEV4YW1wbGU6CisJCQkJICAgKiBwcmludGYgJzFcbjJcbjNcbjRcbicgfCBzZWQgLW4gJzF7TjtOO2R9OzFwOzIsM3A7M3A7NHAnCisJCQkJICAgKiBmaXJzdCB0aHJlZSBpbnB1dCBsaW5lcyBhcmUgZGVsZXRlZDsKKwkJCQkgICAqIDR0aCBsaW5lIGlzIG1hdGNoZWQgYW5kIHByaW50ZWQKKwkJCQkgICAqIGJ5ICIyLDMiICghKSBhbmQgYnkgIjQiIHJhbmdlcworCQkJCSAgICovCisJCQkJPyAoc2VkX2NtZC0+YmVnX2xpbmUgPD0gbGluZW51bSkgICAgLyogTixlbmQgKi8KKwkJCQk6IChzZWRfY21kLT5iZWdfbGluZSA9PSBsaW5lbnVtKSAgICAvKiBOICovCisJCQkJKQorCQkJICAgICkKKwkJCS8qIE9yIGRvZXMgdGhpcyBsaW5lIG1hdGNoIG91ciBiZWdpbiBhZGRyZXNzIHJlZ2V4PyAqLworCQkJfHwgKGJlZ19tYXRjaChzZWRfY21kLCBwYXR0ZXJuX3NwYWNlKSkKKwkJCS8qIE9yIGRpZCB3ZSBtYXRjaCBsYXN0IGxpbmUgb2YgaW5wdXQ/ICovCisJCQl8fCAoc2VkX2NtZC0+YmVnX2xpbmUgPT0gLTEgJiYgbmV4dF9saW5lID09IE5VTEwpOworCisJCS8qIFNuYXBzaG90IHRoZSB2YWx1ZSAqLworCQltYXRjaGVkID0gc2VkX2NtZC0+aW5fbWF0Y2g7CisKKwkJZGJnKCJjbWQ6JyVjJyBtYXRjaGVkOiVkIGJlZ19saW5lOiVkIGVuZF9saW5lOiVkIGxpbmVudW06JWQiLAorCQkJc2VkX2NtZC0+Y21kLCBtYXRjaGVkLCBzZWRfY21kLT5iZWdfbGluZSwgc2VkX2NtZC0+ZW5kX2xpbmUsIGxpbmVudW0pOworCisJCS8qIElzIHRoaXMgbGluZSB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoPyAqLworCisJCWlmIChtYXRjaGVkKSB7CisJCQkvKiBvbmNlIG1hdGNoZWQsICJuLHh4eCIgcmFuZ2UgaXMgZGVhZCwgZGlzYWJsaW5nIGl0ICovCisJCQlpZiAoc2VkX2NtZC0+YmVnX2xpbmUgPiAwKSB7CisJCQkJc2VkX2NtZC0+YmVnX2xpbmUgPSAtMjsKKwkJCX0KKwkJCXNlZF9jbWQtPmluX21hdGNoID0gISgKKwkJCQkvKiBoYXMgdGhlIGVuZGluZyBsaW5lIGNvbWUsIG9yIGlzIHRoaXMgYSBzaW5nbGUgYWRkcmVzcyBjb21tYW5kPyAqLworCQkJCShzZWRfY21kLT5lbmRfbGluZQorCQkJCQk/IHNlZF9jbWQtPmVuZF9saW5lID09IC0xCisJCQkJCQk/ICFuZXh0X2xpbmUKKwkJCQkJCTogKHNlZF9jbWQtPmVuZF9saW5lIDw9IGxpbmVudW0pCisJCQkJCTogIXNlZF9jbWQtPmVuZF9tYXRjaAorCQkJCSkKKwkJCQkvKiBvciBkb2VzIHRoaXMgbGluZSBtYXRjaGVzIG91ciBsYXN0IGFkZHJlc3MgcmVnZXggKi8KKwkJCQl8fCAoc2VkX2NtZC0+ZW5kX21hdGNoICYmIG9sZF9tYXRjaGVkCisJCQkJICAgICAmJiAocmVnZXhlYyhzZWRfY21kLT5lbmRfbWF0Y2gsCisJCQkJICAgICAgICAgICAgICAgICBwYXR0ZXJuX3NwYWNlLCAwLCBOVUxMLCAwKSA9PSAwKQorCQkJCSkKKwkJCSk7CisJCX0KKworCQkvKiBTa2lwIGJsb2NrcyBvZiBjb21tYW5kcyB3ZSBkaWRuJ3QgbWF0Y2ggKi8KKwkJaWYgKHNlZF9jbWQtPmNtZCA9PSAneycpIHsKKwkJCWlmIChzZWRfY21kLT5pbnZlcnQgPyBtYXRjaGVkIDogIW1hdGNoZWQpIHsKKwkJCQl1bnNpZ25lZCBuZXN0X2NudCA9IDA7CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJaWYgKHNlZF9jbWQtPmNtZCA9PSAneycpCisJCQkJCQluZXN0X2NudCsrOworCQkJCQlpZiAoc2VkX2NtZC0+Y21kID09ICd9JykgeworCQkJCQkJbmVzdF9jbnQtLTsKKwkJCQkJCWlmIChuZXN0X2NudCA9PSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXNlZF9jbWQgPSBzZWRfY21kLT5uZXh0OworCQkJCQlpZiAoIXNlZF9jbWQpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW50ZXJtaW5hdGVkIHsiKTsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE9rYXksIHNvIGRpZCB0aGlzIGxpbmUgbWF0Y2g/ICovCisJCWlmIChzZWRfY21kLT5pbnZlcnQgPyBtYXRjaGVkIDogIW1hdGNoZWQpCisJCQljb250aW51ZTsgLyogbm8gKi8KKworCQkvKiBVcGRhdGUgbGFzdCB1c2VkIHJlZ2V4IGluIGNhc2UgYSBibGFuayBzdWJzdGl0dXRlIEJSRSBpcyBmb3VuZCAqLworCQlpZiAoc2VkX2NtZC0+YmVnX21hdGNoKSB7CisJCQlHLnByZXZpb3VzX3JlZ2V4X3B0ciA9IHNlZF9jbWQtPmJlZ19tYXRjaDsKKwkJfQorCisJCS8qIGFjdHVhbCBzZWRkaW5nICovCisJCS8vYmJfZXJyb3JfbXNnKCJwYXR0ZXJuX3NwYWNlOiclcycgbmV4dF9saW5lOiclcycgY21kOiVjIiwKKwkJLy9wYXR0ZXJuX3NwYWNlLCBuZXh0X2xpbmUsIHNlZF9jbWQtPmNtZCk7CisJCXN3aXRjaCAoc2VkX2NtZC0+Y21kKSB7CisKKwkJLyogUHJpbnQgbGluZSBudW1iZXIgKi8KKwkJY2FzZSAnPSc6CisJCQlmcHJpbnRmKEcubm9uc3Rkb3V0LCAiJWRcbiIsIGxpbmVudW0pOworCQkJYnJlYWs7CisKKwkJLyogV3JpdGUgdGhlIGN1cnJlbnQgcGF0dGVybiBzcGFjZSB1cCB0byB0aGUgZmlyc3QgbmV3bGluZSAqLworCQljYXNlICdQJzoKKwkJeworCQkJY2hhciAqdG1wID0gc3RyY2hyKHBhdHRlcm5fc3BhY2UsICdcbicpOworCQkJaWYgKHRtcCkgeworCQkJCSp0bXAgPSAnXDAnOworCQkJCS8qIFRPRE86IGV4cGxhaW4gd2h5ICdcbicgYmVsb3cgKi8KKwkJCQlzZWRfcHV0cyhwYXR0ZXJuX3NwYWNlLCAnXG4nKTsKKwkJCQkqdG1wID0gJ1xuJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEZhbGwgVGhyb3VnaCAqLworCQl9CisKKwkJLyogV3JpdGUgdGhlIGN1cnJlbnQgcGF0dGVybiBzcGFjZSB0byBvdXRwdXQgKi8KKwkJY2FzZSAncCc6CisJCQkvKiBOQjogd2UgcHJpbnQgdGhpcyBfYmVmb3JlXyB0aGUgbGFzdCBsaW5lCisJCQkgKiAob2YgY3VycmVudCBmaWxlKSBpcyBwcmludGVkLiBFdmVuIGlmCisJCQkgKiB0aGF0IGxpbmUgaXMgbm9udGVybWluYXRlZCwgd2UgcHJpbnQKKwkJCSAqICdcbicgaGVyZSAoZ251IHNlZCBkb2VzIHRoZSBzYW1lKSAqLworCQkJc2VkX3B1dHMocGF0dGVybl9zcGFjZSwgJ1xuJyk7CisJCQlicmVhazsKKwkJLyogRGVsZXRlIHVwIHRocm91Z2ggZmlyc3QgbmV3bGluZSAqLworCQljYXNlICdEJzoKKwkJeworCQkJY2hhciAqdG1wID0gc3RyY2hyKHBhdHRlcm5fc3BhY2UsICdcbicpOworCQkJaWYgKHRtcCkgeworCQkJCW92ZXJsYXBwaW5nX3N0cmNweShwYXR0ZXJuX3NwYWNlLCB0bXAgKyAxKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJLyogZGlzY2FyZCB0aGlzIGxpbmUuICovCisJCWNhc2UgJ2QnOgorCQkJZ290byBkaXNjYXJkX2xpbmU7CisKKwkJLyogU3Vic3RpdHV0ZSB3aXRoIHJlZ2V4ICovCisJCWNhc2UgJ3MnOgorCQkJaWYgKCFkb19zdWJzdF9jb21tYW5kKHNlZF9jbWQsICZwYXR0ZXJuX3NwYWNlKSkKKwkJCQlicmVhazsKKwkJCXN1YnN0aXR1dGVkIHw9IDE7CisKKwkJCS8qIGhhbmRsZSBwIG9wdGlvbiAqLworCQkJaWYgKHNlZF9jbWQtPnN1Yl9wKQorCQkJCXNlZF9wdXRzKHBhdHRlcm5fc3BhY2UsIGxhc3RfZ2V0c19jaGFyKTsKKwkJCS8qIGhhbmRsZSB3IG9wdGlvbiAqLworCQkJaWYgKHNlZF9jbWQtPnN3X2ZpbGUpCisJCQkJcHV0c19tYXliZV9uZXdsaW5lKAorCQkJCQlwYXR0ZXJuX3NwYWNlLCBzZWRfY21kLT5zd19maWxlLAorCQkJCQkmc2VkX2NtZC0+c3dfbGFzdF9jaGFyLCBsYXN0X2dldHNfY2hhcik7CisJCQlicmVhazsKKworCQkvKiBBcHBlbmQgbGluZSB0byBsaW5rZWQgbGlzdCB0byBiZSBwcmludGVkIGxhdGVyICovCisJCWNhc2UgJ2EnOgorCQkJYXBwZW5kKHNlZF9jbWQtPnN0cmluZyk7CisJCQlicmVhazsKKworCQkvKiBJbnNlcnQgdGV4dCBiZWZvcmUgdGhpcyBsaW5lICovCisJCWNhc2UgJ2knOgorCQkJc2VkX3B1dHMoc2VkX2NtZC0+c3RyaW5nLCAnXG4nKTsKKwkJCWJyZWFrOworCisJCS8qIEN1dCBhbmQgcGFzdGUgdGV4dCAocmVwbGFjZSkgKi8KKwkJY2FzZSAnYyc6CisJCQkvKiBPbmx5IHRyaWdnZXJzIG9uIGxhc3QgbGluZSBvZiBhIG1hdGNoaW5nIHJhbmdlLiAqLworCQkJaWYgKCFzZWRfY21kLT5pbl9tYXRjaCkKKwkJCQlzZWRfcHV0cyhzZWRfY21kLT5zdHJpbmcsICdcbicpOworCQkJZ290byBkaXNjYXJkX2xpbmU7CisKKwkJLyogUmVhZCBmaWxlLCBhcHBlbmQgY29udGVudHMgdG8gb3V0cHV0ICovCisJCWNhc2UgJ3InOgorCQl7CisJCQlGSUxFICpyZmlsZTsKKwkJCXJmaWxlID0gZm9wZW5fZm9yX3JlYWQoc2VkX2NtZC0+c3RyaW5nKTsKKwkJCWlmIChyZmlsZSkgeworCQkJCWNoYXIgKmxpbmU7CisKKwkJCQl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHJmaWxlKSkKKwkJCQkJCSE9IE5VTEwpCisJCQkJCWFwcGVuZChsaW5lKTsKKwkJCQl4cHJpbnRfYW5kX2Nsb3NlX2ZpbGUocmZpbGUpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8qIFdyaXRlIHBhdHRlcm4gc3BhY2UgdG8gZmlsZS4gKi8KKwkJY2FzZSAndyc6CisJCQlwdXRzX21heWJlX25ld2xpbmUoCisJCQkJcGF0dGVybl9zcGFjZSwgc2VkX2NtZC0+c3dfZmlsZSwKKwkJCQkmc2VkX2NtZC0+c3dfbGFzdF9jaGFyLCBsYXN0X2dldHNfY2hhcik7CisJCQlicmVhazsKKworCQkvKiBSZWFkIG5leHQgbGluZSBmcm9tIGlucHV0ICovCisJCWNhc2UgJ24nOgorCQkJaWYgKCFHLmJlX3F1aWV0KQorCQkJCXNlZF9wdXRzKHBhdHRlcm5fc3BhY2UsIGxhc3RfZ2V0c19jaGFyKTsKKwkJCWlmIChuZXh0X2xpbmUpIHsKKwkJCQlmcmVlKHBhdHRlcm5fc3BhY2UpOworCQkJCXBhdHRlcm5fc3BhY2UgPSBuZXh0X2xpbmU7CisJCQkJbGFzdF9nZXRzX2NoYXIgPSBuZXh0X2dldHNfY2hhcjsKKwkJCQluZXh0X2xpbmUgPSBnZXRfbmV4dF9saW5lKCZuZXh0X2dldHNfY2hhcik7CisJCQkJc3Vic3RpdHV0ZWQgPSAwOworCQkJCWxpbmVudW0rKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCS8qIFF1aXQuICBFbmQgb2Ygc2NyaXB0LCBlbmQgb2YgaW5wdXQuICovCisJCWNhc2UgJ3EnOgorCQkJLyogRXhpdCB0aGUgb3V0ZXIgd2hpbGUgbG9vcCAqLworCQkJZnJlZShuZXh0X2xpbmUpOworCQkJbmV4dF9saW5lID0gTlVMTDsKKwkJCWdvdG8gZGlzY2FyZF9jb21tYW5kczsKKworCQkvKiBBcHBlbmQgdGhlIG5leHQgbGluZSB0byB0aGUgY3VycmVudCBsaW5lICovCisJCWNhc2UgJ04nOgorCQl7CisJCQlpbnQgbGVuOworCQkJLyogSWYgbm8gbmV4dCBsaW5lLCBqdW1wIHRvIGVuZCBvZiBzY3JpcHQgYW5kIGV4aXQuICovCisJCQkvKiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvc2VkL21hbnVhbC9zZWQuaHRtbDoKKwkJCSAqICJNb3N0IHZlcnNpb25zIG9mIHNlZCBleGl0IHdpdGhvdXQgcHJpbnRpbmcgYW55dGhpbmcKKwkJCSAqIHdoZW4gdGhlIE4gY29tbWFuZCBpcyBpc3N1ZWQgb24gdGhlIGxhc3QgbGluZSBvZgorCQkJICogYSBmaWxlLiBHTlUgc2VkIHByaW50cyBwYXR0ZXJuIHNwYWNlIGJlZm9yZSBleGl0aW5nCisJCQkgKiB1bmxlc3Mgb2YgY291cnNlIHRoZSAtbiBjb21tYW5kIHN3aXRjaCBoYXMgYmVlbgorCQkJICogc3BlY2lmaWVkLiBUaGlzIGNob2ljZSBpcyBieSBkZXNpZ24uIgorCQkJICovCisJCQlpZiAobmV4dF9saW5lID09IE5VTEwpIHsKKwkJCQkvL2dvdG8gZGlzY2FyZF9saW5lOworCQkJCWdvdG8gZGlzY2FyZF9jb21tYW5kczsgLyogR05VIGJlaGF2aW9yICovCisJCQl9CisJCQkvKiBBcHBlbmQgbmV4dF9saW5lLCByZWFkIG5ldyBuZXh0X2xpbmUuICovCisJCQlsZW4gPSBzdHJsZW4ocGF0dGVybl9zcGFjZSk7CisJCQlwYXR0ZXJuX3NwYWNlID0geHJlYWxsb2MocGF0dGVybl9zcGFjZSwgbGVuICsgc3RybGVuKG5leHRfbGluZSkgKyAyKTsKKwkJCXBhdHRlcm5fc3BhY2VbbGVuXSA9ICdcbic7CisJCQlzdHJjcHkocGF0dGVybl9zcGFjZSArIGxlbisxLCBuZXh0X2xpbmUpOworCQkJbGFzdF9nZXRzX2NoYXIgPSBuZXh0X2dldHNfY2hhcjsKKwkJCW5leHRfbGluZSA9IGdldF9uZXh0X2xpbmUoJm5leHRfZ2V0c19jaGFyKTsKKwkJCWxpbmVudW0rKzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVGVzdC9icmFuY2ggaWYgc3Vic3RpdHV0aW9uIG9jY3VycmVkICovCisJCWNhc2UgJ3QnOgorCQkJaWYgKCFzdWJzdGl0dXRlZCkgYnJlYWs7CisJCQlzdWJzdGl0dXRlZCA9IDA7CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJLyogVGVzdC9icmFuY2ggaWYgc3Vic3RpdHV0aW9uIGRpZG4ndCBvY2N1ciAqLworCQljYXNlICdUJzoKKwkJCWlmIChzdWJzdGl0dXRlZCkgYnJlYWs7CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJLyogQnJhbmNoIHRvIGxhYmVsICovCisJCWNhc2UgJ2InOgorCQkJaWYgKCFzZWRfY21kLT5zdHJpbmcpIGdvdG8gZGlzY2FyZF9jb21tYW5kczsKKwkJCWVsc2Ugc2VkX2NtZCA9IGJyYW5jaF90byhzZWRfY21kLT5zdHJpbmcpOworCQkJYnJlYWs7CisJCS8qIFRyYW5zbGl0ZXJhdGUgY2hhcmFjdGVycyAqLworCQljYXNlICd5JzoKKwkJeworCQkJaW50IGksIGo7CisJCQlmb3IgKGkgPSAwOyBwYXR0ZXJuX3NwYWNlW2ldOyBpKyspIHsKKwkJCQlmb3IgKGogPSAwOyBzZWRfY21kLT5zdHJpbmdbal07IGogKz0gMikgeworCQkJCQlpZiAocGF0dGVybl9zcGFjZVtpXSA9PSBzZWRfY21kLT5zdHJpbmdbal0pIHsKKwkJCQkJCXBhdHRlcm5fc3BhY2VbaV0gPSBzZWRfY21kLT5zdHJpbmdbaiArIDFdOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ2cnOgkvKiBSZXBsYWNlIHBhdHRlcm4gc3BhY2Ugd2l0aCBob2xkIHNwYWNlICovCisJCQlmcmVlKHBhdHRlcm5fc3BhY2UpOworCQkJcGF0dGVybl9zcGFjZSA9IHhzdHJkdXAoRy5ob2xkX3NwYWNlID8gRy5ob2xkX3NwYWNlIDogIiIpOworCQkJYnJlYWs7CisJCWNhc2UgJ0cnOgkvKiBBcHBlbmQgbmV3bGluZSBhbmQgaG9sZCBzcGFjZSB0byBwYXR0ZXJuIHNwYWNlICovCisJCXsKKwkJCWludCBwYXR0ZXJuX3NwYWNlX3NpemUgPSAyOworCQkJaW50IGhvbGRfc3BhY2Vfc2l6ZSA9IDA7CisKKwkJCWlmIChwYXR0ZXJuX3NwYWNlKQorCQkJCXBhdHRlcm5fc3BhY2Vfc2l6ZSArPSBzdHJsZW4ocGF0dGVybl9zcGFjZSk7CisJCQlpZiAoRy5ob2xkX3NwYWNlKQorCQkJCWhvbGRfc3BhY2Vfc2l6ZSA9IHN0cmxlbihHLmhvbGRfc3BhY2UpOworCQkJcGF0dGVybl9zcGFjZSA9IHhyZWFsbG9jKHBhdHRlcm5fc3BhY2UsCisJCQkJCXBhdHRlcm5fc3BhY2Vfc2l6ZSArIGhvbGRfc3BhY2Vfc2l6ZSk7CisJCQlpZiAocGF0dGVybl9zcGFjZV9zaXplID09IDIpCisJCQkJcGF0dGVybl9zcGFjZVswXSA9IDA7CisJCQlzdHJjYXQocGF0dGVybl9zcGFjZSwgIlxuIik7CisJCQlpZiAoRy5ob2xkX3NwYWNlKQorCQkJCXN0cmNhdChwYXR0ZXJuX3NwYWNlLCBHLmhvbGRfc3BhY2UpOworCQkJbGFzdF9nZXRzX2NoYXIgPSAnXG4nOworCisJCQlicmVhazsKKwkJfQorCQljYXNlICdoJzoJLyogUmVwbGFjZSBob2xkIHNwYWNlIHdpdGggcGF0dGVybiBzcGFjZSAqLworCQkJZnJlZShHLmhvbGRfc3BhY2UpOworCQkJRy5ob2xkX3NwYWNlID0geHN0cmR1cChwYXR0ZXJuX3NwYWNlKTsKKwkJCWJyZWFrOworCQljYXNlICdIJzoJLyogQXBwZW5kIG5ld2xpbmUgYW5kIHBhdHRlcm4gc3BhY2UgdG8gaG9sZCBzcGFjZSAqLworCQl7CisJCQlpbnQgaG9sZF9zcGFjZV9zaXplID0gMjsKKwkJCWludCBwYXR0ZXJuX3NwYWNlX3NpemUgPSAwOworCisJCQlpZiAoRy5ob2xkX3NwYWNlKQorCQkJCWhvbGRfc3BhY2Vfc2l6ZSArPSBzdHJsZW4oRy5ob2xkX3NwYWNlKTsKKwkJCWlmIChwYXR0ZXJuX3NwYWNlKQorCQkJCXBhdHRlcm5fc3BhY2Vfc2l6ZSA9IHN0cmxlbihwYXR0ZXJuX3NwYWNlKTsKKwkJCUcuaG9sZF9zcGFjZSA9IHhyZWFsbG9jKEcuaG9sZF9zcGFjZSwKKwkJCQkJaG9sZF9zcGFjZV9zaXplICsgcGF0dGVybl9zcGFjZV9zaXplKTsKKworCQkJaWYgKGhvbGRfc3BhY2Vfc2l6ZSA9PSAyKQorCQkJCSpHLmhvbGRfc3BhY2UgPSAwOworCQkJc3RyY2F0KEcuaG9sZF9zcGFjZSwgIlxuIik7CisJCQlpZiAocGF0dGVybl9zcGFjZSkKKwkJCQlzdHJjYXQoRy5ob2xkX3NwYWNlLCBwYXR0ZXJuX3NwYWNlKTsKKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAneCc6IC8qIEV4Y2hhbmdlIGhvbGQgYW5kIHBhdHRlcm4gc3BhY2UgKi8KKwkJeworCQkJY2hhciAqdG1wID0gcGF0dGVybl9zcGFjZTsKKwkJCXBhdHRlcm5fc3BhY2UgPSBHLmhvbGRfc3BhY2UgPyBHLmhvbGRfc3BhY2UgOiB4emFsbG9jKDEpOworCQkJbGFzdF9nZXRzX2NoYXIgPSAnXG4nOworCQkJRy5ob2xkX3NwYWNlID0gdG1wOworCQkJYnJlYWs7CisJCX0KKwkJfSAvKiBzd2l0Y2ggKi8KKwl9IC8qIGZvciBlYWNoIGNtZCAqLworCisJLyoKKwkgKiBFeGl0IHBvaW50IGZyb20gc2VkZGluZy4uLgorCSAqLworIGRpc2NhcmRfY29tbWFuZHM6CisJLyogd2Ugd2lsbCBwcmludCB0aGUgbGluZSB1bmxlc3Mgd2Ugd2VyZSB0b2xkIHRvIGJlIHF1aWV0ICgnLW4nKQorCSAgIG9yIGlmIHRoZSBsaW5lIHdhcyBzdXBwcmVzc2VkIChhbGEgJ2QnZWxldGUpICovCisJaWYgKCFHLmJlX3F1aWV0KQorCQlzZWRfcHV0cyhwYXR0ZXJuX3NwYWNlLCBsYXN0X2dldHNfY2hhcik7CisKKwkvKiBEZWxldGUgYW5kIHN1Y2gganVtcCBoZXJlLiAqLworIGRpc2NhcmRfbGluZToKKwlmbHVzaF9hcHBlbmQoKTsKKwlmcmVlKHBhdHRlcm5fc3BhY2UpOworCisJZ290byBhZ2FpbjsKK30KKworLyogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aXRoIGVtYmVkZGVkCisgKiBuZXdsaW5lcy4gIFRoaXMgY291bnRzIGFzIG11bHRpcGxlIGNvbW1hbmQgbGluZXMuCisgKiBIb3dldmVyLCBuZXdsaW5lIGNhbiBiZSBlc2NhcGVkOiAncy9lL3pcPG5ld2xpbmU+ei8nCisgKiBXZSBjaGVjayBmb3IgdGhpcy4KKyAqLworCitzdGF0aWMgdm9pZCBhZGRfY21kX2Jsb2NrKGNoYXIgKmNtZHN0cikKK3sKKwljaGFyICpzdiwgKmVvbDsKKworCWNtZHN0ciA9IHN2ID0geHN0cmR1cChjbWRzdHIpOworCWRvIHsKKwkJZW9sID0gc3RyY2hyKGNtZHN0ciwgJ1xuJyk7CisgbmV4dDoKKwkJaWYgKGVvbCkgeworCQkJLyogQ291bnQgcHJlY2VkaW5nIHNsYXNoZXMgKi8KKwkJCWludCBzbGFzaGVzID0gMDsKKwkJCWNoYXIgKnNsID0gZW9sOworCisJCQl3aGlsZSAoc2wgIT0gY21kc3RyICYmICotLXNsID09ICdcXCcpCisJCQkJc2xhc2hlcysrOworCQkJLyogT2RkIG51bWJlciBvZiBwcmVjZWRpbmcgc2xhc2hlcyAtIG5ld2xpbmUgaXMgZXNjYXBlZCAqLworCQkJaWYgKHNsYXNoZXMgJiAxKSB7CisJCQkJb3ZlcmxhcHBpbmdfc3RyY3B5KGVvbCAtIDEsIGVvbCk7CisJCQkJZW9sID0gc3RyY2hyKGVvbCwgJ1xuJyk7CisJCQkJZ290byBuZXh0OworCQkJfQorCQkJKmVvbCA9ICdcMCc7CisJCX0KKwkJYWRkX2NtZChjbWRzdHIpOworCQljbWRzdHIgPSBlb2wgKyAxOworCX0gd2hpbGUgKGVvbCk7CisJZnJlZShzdik7Cit9CisKK2ludCBzZWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNlZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWxsaXN0X3QgKm9wdF9lLCAqb3B0X2Y7CisJaW50IHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKworCUlOSVRfRygpOworCisJLyogZGVzdHJveSBjb21tYW5kIHN0cmluZ3Mgb24gZXhpdCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgYXRleGl0KHNlZF9mcmVlX2FuZF9jbG9zZV9zdHVmZik7CisKKwkvKiBMaWUgdG8gYXV0b2NvbmYgd2hlbiBpdCBzdGFydHMgYXNraW5nIHN0dXBpZCBxdWVzdGlvbnMuICovCisJaWYgKGFyZ3ZbMV0gJiYgIXN0cmNtcChhcmd2WzFdLCAiLS12ZXJzaW9uIikpIHsKKwkJcHV0cygiVGhpcyBpcyBub3QgR05VIHNlZCB2ZXJzaW9uIDQuMCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkbyBub3JtYWwgb3B0aW9uIHBhcnNpbmcgKi8KKwlvcHRfZSA9IG9wdF9mID0gTlVMTDsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJlOjpmOjoiIC8qIGNhbiBvY2N1ciBtdWx0aXBsZSB0aW1lcyAqLworCSAgICAgICAgICAgICAgICAgICAgIm5uIjsgLyogY291bnQgLW4gKi8KKwkvKiAtaSBtdXN0IGJlIGZpcnN0LCB0byBtYXRjaCBPUFRfaW5fcGxhY2UgZGVmaW5pdGlvbiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJpcm5lOmY6IiwgJm9wdF9lLCAmb3B0X2YsCisJCQkgICAgJkcuYmVfcXVpZXQpOyAvKiBjb3VudGVyIGZvciAtbiAqLworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIE9QVF9pbl9wbGFjZSkgeyAvLyAtaQorCQlhdGV4aXQoY2xlYW51cF9vdXRuYW1lKTsKKwl9CisJaWYgKG9wdCAmIDB4MikgRy5yZWdleF90eXBlIHw9IFJFR19FWFRFTkRFRDsgLy8gLXIKKwkvL2lmIChvcHQgJiAweDQpIEcuYmVfcXVpZXQrKzsgLy8gLW4KKwl3aGlsZSAob3B0X2UpIHsgLy8gLWUKKwkJYWRkX2NtZF9ibG9jayhsbGlzdF9wb3AoJm9wdF9lKSk7CisJfQorCXdoaWxlIChvcHRfZikgeyAvLyAtZgorCQljaGFyICpsaW5lOworCQlGSUxFICpjbWRmaWxlOworCQljbWRmaWxlID0geGZvcGVuX2Zvcl9yZWFkKGxsaXN0X3BvcCgmb3B0X2YpKTsKKwkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShjbWRmaWxlKSkgIT0gTlVMTCkgeworCQkJYWRkX2NtZChsaW5lKTsKKwkJCWZyZWUobGluZSk7CisJCX0KKwkJZmNsb3NlKGNtZGZpbGUpOworCX0KKwkvKiBpZiB3ZSBkaWRuJ3QgZ2V0IGEgcGF0dGVybiBmcm9tIC1lIG9yIC1mLCB1c2UgYXJndlswXSAqLworCWlmICghKG9wdCAmIDB4MTgpKSB7CisJCWlmICghKmFyZ3YpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWFkZF9jbWRfYmxvY2soKmFyZ3YrKyk7CisJfQorCS8qIEZsdXNoIGFueSB1bmZpbmlzaGVkIGNvbW1hbmRzLiAqLworCWFkZF9jbWQoIiIpOworCisJLyogQnkgZGVmYXVsdCwgd2Ugd3JpdGUgdG8gc3Rkb3V0ICovCisJRy5ub25zdGRvdXQgPSBzdGRvdXQ7CisKKwkvKiBhcmd2WzAuLihhcmdjLTEpXSBzaG91bGQgYmUgbmFtZXMgb2YgZmlsZSB0byBwcm9jZXNzLiBJZiBubworCSAqIGZpbGVzIHdlcmUgc3BlY2lmaWVkIG9yICctJyB3YXMgc3BlY2lmaWVkLCB0YWtlIGlucHV0IGZyb20gc3RkaW4uCisJICogT3RoZXJ3aXNlLCB3ZSBwcm9jZXNzIGFsbCB0aGUgZmlsZXMgc3BlY2lmaWVkLiAqLworCWlmIChhcmd2WzBdID09IE5VTEwpIHsKKwkJaWYgKG9wdCAmIE9QVF9pbl9wbGFjZSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsICItaSIpOworCQlhZGRfaW5wdXRfZmlsZShzdGRpbik7CisJfSBlbHNlIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCQkJaW50IG5vbnN0ZG91dGZkOworCQkJRklMRSAqZmlsZTsKKwkJCXNlZF9jbWRfdCAqc2VkX2NtZDsKKworCQkJaWYgKExPTkVfREFTSChhcmd2W2ldKSAmJiAhKG9wdCAmIE9QVF9pbl9wbGFjZSkpIHsKKwkJCQlhZGRfaW5wdXRfZmlsZShzdGRpbik7CisJCQkJcHJvY2Vzc19maWxlcygpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZmlsZSA9IGZvcGVuX29yX3dhcm4oYXJndltpXSwgInIiKTsKKwkJCWlmICghZmlsZSkgeworCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWFkZF9pbnB1dF9maWxlKGZpbGUpOworCQkJaWYgKCEob3B0ICYgT1BUX2luX3BsYWNlKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiAtaTogcHJvY2VzcyBlYWNoIEZJTEUgc2VwYXJhdGVseTogKi8KKworCQkJRy5vdXRuYW1lID0geGFzcHJpbnRmKCIlc1hYWFhYWCIsIGFyZ3ZbaV0pOworCQkJbm9uc3Rkb3V0ZmQgPSB4bWtzdGVtcChHLm91dG5hbWUpOworCQkJRy5ub25zdGRvdXQgPSB4ZmRvcGVuX2Zvcl93cml0ZShub25zdGRvdXRmZCk7CisKKwkJCS8qIFNldCBwZXJtaXNzaW9ucy9vd25lciBvZiBvdXRwdXQgZmlsZSAqLworCQkJZnN0YXQoZmlsZW5vKGZpbGUpLCAmc3RhdGJ1Zik7CisJCQkvKiBjaG1vZCdpbmcgQUZURVIgY2hvd24gd291bGQgcHJlc2VydmUgc3VpZC9zZ2lkIGJpdHMsCisJCQkgKiBidXQgR05VIHNlZCA0LjIuMSBkb2VzIG5vdCBwcmVzZXJ2ZSB0aGVtIGVpdGhlciAqLworCQkJZmNobW9kKG5vbnN0ZG91dGZkLCBzdGF0YnVmLnN0X21vZGUpOworCQkJZmNob3duKG5vbnN0ZG91dGZkLCBzdGF0YnVmLnN0X3VpZCwgc3RhdGJ1Zi5zdF9naWQpOworCisJCQlwcm9jZXNzX2ZpbGVzKCk7CisJCQlmY2xvc2UoRy5ub25zdGRvdXQpOworCQkJRy5ub25zdGRvdXQgPSBzdGRvdXQ7CisKKwkJCS8qIHVubGluayhhcmd2W2ldKTsgKi8KKwkJCXhyZW5hbWUoRy5vdXRuYW1lLCBhcmd2W2ldKTsKKwkJCWZyZWUoRy5vdXRuYW1lKTsKKwkJCUcub3V0bmFtZSA9IE5VTEw7CisKKwkJCS8qIFJlLWVuYWJsZSBkaXNhYmxlZCByYW5nZSBtYXRjaGVzICovCisJCQlmb3IgKHNlZF9jbWQgPSBHLnNlZF9jbWRfaGVhZDsgc2VkX2NtZDsgc2VkX2NtZCA9IHNlZF9jbWQtPm5leHQpIHsKKwkJCQlzZWRfY21kLT5iZWdfbGluZSA9IHNlZF9jbWQtPmJlZ19saW5lX29yaWc7CisJCQl9CisJCX0KKwkJLyogSGVyZSwgdG8gaGFuZGxlICJzZWQgJ2NtZHMnIG5vbmV4aXN0ZW50X2ZpbGUiIGNhc2Ugd2UgZGlkOgorCQkgKiBpZiAoRy5jdXJyZW50X2lucHV0X2ZpbGUgPj0gRy5pbnB1dF9maWxlX2NvdW50KQorCQkgKglyZXR1cm4gc3RhdHVzOworCQkgKiBidXQgaXQncyBub3QgbmVlZGVkIHNpbmNlIHByb2Nlc3NfZmlsZXMoKSB3b3JrcyBjb3JyZWN0bHkKKwkJICogaW4gdGhpcyBjYXNlIHRvby4gKi8KKwl9CisJcHJvY2Vzc19maWxlcygpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvc2VkMWxpbmUudHh0IGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9zZWQxbGluZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhMmUzNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvc2VkMWxpbmUudHh0CkBAIC0wLDAgKzEsNDI1IEBACitodHRwOi8vd3d3LnN0dWRlbnQubm9ydGhwYXJrLmVkdS9wZW1lbnRlL3NlZC9zZWQxbGluZS50eHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0hBTkRZIE9ORS1MSU5FUlMgRk9SIFNFRCAoVW5peCBzdHJlYW0gZWRpdG9yKSAgICAgICAgICAgICAgIEFwci4gMjYsIDIwMDQKK2NvbXBpbGVkIGJ5IEVyaWMgUGVtZW50IC0gcGVtZW50ZVthdF1ub3J0aHBhcmtbZG90XWVkdSAgICAgICAgdmVyc2lvbiA1LjQKK0xhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpcyB1c3VhbGx5IGF0OgorICAgaHR0cDovL3NlZC5zb3VyY2Vmb3JnZS5uZXQvc2VkMWxpbmUudHh0CisgICBodHRwOi8vd3d3LnN0dWRlbnQubm9ydGhwYXJrLmVkdS9wZW1lbnRlL3NlZC9zZWQxbGluZS50eHQKK1RoaXMgZmlsZSBpcyBhbHNvIGF2YWlsYWJsZSBpbiBQb3J0dWd1ZXNlIGF0OgorICAgaHR0cDovL3d3dy5scnYudWZzYy5ici93bWFrZXIvc2VkX3B0QlIuaHRtbAorCitGSUxFIFNQQUNJTkc6CisKKyAjIGRvdWJsZSBzcGFjZSBhIGZpbGUKKyBzZWQgRworCisgIyBkb3VibGUgc3BhY2UgYSBmaWxlIHdoaWNoIGFscmVhZHkgaGFzIGJsYW5rIGxpbmVzIGluIGl0LiBPdXRwdXQgZmlsZQorICMgc2hvdWxkIGNvbnRhaW4gbm8gbW9yZSB0aGFuIG9uZSBibGFuayBsaW5lIGJldHdlZW4gbGluZXMgb2YgdGV4dC4KKyBzZWQgJy9eJC9kO0cnCisKKyAjIHRyaXBsZSBzcGFjZSBhIGZpbGUKKyBzZWQgJ0c7RycKKworICMgdW5kbyBkb3VibGUtc3BhY2luZyAoYXNzdW1lcyBldmVuLW51bWJlcmVkIGxpbmVzIGFyZSBhbHdheXMgYmxhbmspCisgc2VkICduO2QnCisKKyAjIGluc2VydCBhIGJsYW5rIGxpbmUgYWJvdmUgZXZlcnkgbGluZSB3aGljaCBtYXRjaGVzICJyZWdleCIKKyBzZWQgJy9yZWdleC97eDtwO3g7fScKKworICMgaW5zZXJ0IGEgYmxhbmsgbGluZSBiZWxvdyBldmVyeSBsaW5lIHdoaWNoIG1hdGNoZXMgInJlZ2V4IgorIHNlZCAnL3JlZ2V4L0cnCisKKyAjIGluc2VydCBhIGJsYW5rIGxpbmUgYWJvdmUgYW5kIGJlbG93IGV2ZXJ5IGxpbmUgd2hpY2ggbWF0Y2hlcyAicmVnZXgiCisgc2VkICcvcmVnZXgve3g7cDt4O0c7fScKKworTlVNQkVSSU5HOgorCisgIyBudW1iZXIgZWFjaCBsaW5lIG9mIGEgZmlsZSAoc2ltcGxlIGxlZnQgYWxpZ25tZW50KS4gVXNpbmcgYSB0YWIgKHNlZQorICMgbm90ZSBvbiAnXHQnIGF0IGVuZCBvZiBmaWxlKSBpbnN0ZWFkIG9mIHNwYWNlIHdpbGwgcHJlc2VydmUgbWFyZ2lucy4KKyBzZWQgPSBmaWxlbmFtZSB8IHNlZCAnTjtzL1xuL1x0LycKKworICMgbnVtYmVyIGVhY2ggbGluZSBvZiBhIGZpbGUgKG51bWJlciBvbiBsZWZ0LCByaWdodC1hbGlnbmVkKQorIHNlZCA9IGZpbGVuYW1lIHwgc2VkICdOOyBzL14vICAgICAvOyBzLyAqXCguXHs2LFx9XClcbi9cMSAgLycKKworICMgbnVtYmVyIGVhY2ggbGluZSBvZiBmaWxlLCBidXQgb25seSBwcmludCBudW1iZXJzIGlmIGxpbmUgaXMgbm90IGJsYW5rCisgc2VkICcvLi89JyBmaWxlbmFtZSB8IHNlZCAnLy4vTjsgcy9cbi8gLycKKworICMgY291bnQgbGluZXMgKGVtdWxhdGVzICJ3YyAtbCIpCisgc2VkIC1uICckPScKKworVEVYVCBDT05WRVJTSU9OIEFORCBTVUJTVElUVVRJT046CisKKyAjIElOIFVOSVggRU5WSVJPTk1FTlQ6IGNvbnZlcnQgRE9TIG5ld2xpbmVzIChDUi9MRikgdG8gVW5peCBmb3JtYXQKKyBzZWQgJ3MvLiQvLycgICAgICAgICAgICAgICAjIGFzc3VtZXMgdGhhdCBhbGwgbGluZXMgZW5kIHdpdGggQ1IvTEYKKyBzZWQgJ3MvXk0kLy8nICAgICAgICAgICAgICAjIGluIGJhc2gvdGNzaCwgcHJlc3MgQ3RybC1WIHRoZW4gQ3RybC1NCisgc2VkICdzL1x4MEQkLy8nICAgICAgICAgICAgIyBnc2VkIDMuMDIuODAsIGJ1dCB0b3Agc2NyaXB0IGlzIGVhc2llcgorCisgIyBJTiBVTklYIEVOVklST05NRU5UOiBjb252ZXJ0IFVuaXggbmV3bGluZXMgKExGKSB0byBET1MgZm9ybWF0Cisgc2VkICJzLyQvYGVjaG8gLWUgXFxccmAvIiAgICAgICAgICAgICMgY29tbWFuZCBsaW5lIHVuZGVyIGtzaAorIHNlZCAncy8kJyIvYGVjaG8gXFxccmAvIiAgICAgICAgICAgICAjIGNvbW1hbmQgbGluZSB1bmRlciBiYXNoCisgc2VkICJzLyQvYGVjaG8gXFxccmAvIiAgICAgICAgICAgICAgICMgY29tbWFuZCBsaW5lIHVuZGVyIHpzaAorIHNlZCAncy8kL1xyLycgICAgICAgICAgICAgICAgICAgICAgICAjIGdzZWQgMy4wMi44MAorCisgIyBJTiBET1MgRU5WSVJPTk1FTlQ6IGNvbnZlcnQgVW5peCBuZXdsaW5lcyAoTEYpIHRvIERPUyBmb3JtYXQKKyBzZWQgInMvJC8vIiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMQorIHNlZCAtbiBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAyCisKKyAjIElOIERPUyBFTlZJUk9OTUVOVDogY29udmVydCBET1MgbmV3bGluZXMgKENSL0xGKSB0byBVbml4IGZvcm1hdAorICMgQ2FuIG9ubHkgYmUgZG9uZSB3aXRoIFVueFV0aWxzIHNlZCwgdmVyc2lvbiA0LjAuNyBvciBoaWdoZXIuCisgIyBDYW5ub3QgYmUgZG9uZSB3aXRoIG90aGVyIERPUyB2ZXJzaW9ucyBvZiBzZWQuIFVzZSAidHIiIGluc3RlYWQuCisgc2VkICJzL1xyLy8iIGluZmlsZSA+b3V0ZmlsZSAgICAgICAgICMgVW54VXRpbHMgc2VkIHY0LjAuNyBvciBoaWdoZXIKKyB0ciAtZCBcciA8aW5maWxlID5vdXRmaWxlICAgICAgICAgICAgIyBHTlUgdHIgdmVyc2lvbiAxLjIyIG9yIGhpZ2hlcgorCisgIyBkZWxldGUgbGVhZGluZyB3aGl0ZXNwYWNlIChzcGFjZXMsIHRhYnMpIGZyb20gZnJvbnQgb2YgZWFjaCBsaW5lCisgIyBhbGlnbnMgYWxsIHRleHQgZmx1c2ggbGVmdAorIHNlZCAncy9eWyBcdF0qLy8nICAgICAgICAgICAgICAgICAgICAjIHNlZSBub3RlIG9uICdcdCcgYXQgZW5kIG9mIGZpbGUKKworICMgZGVsZXRlIHRyYWlsaW5nIHdoaXRlc3BhY2UgKHNwYWNlcywgdGFicykgZnJvbSBlbmQgb2YgZWFjaCBsaW5lCisgc2VkICdzL1sgXHRdKiQvLycgICAgICAgICAgICAgICAgICAgICMgc2VlIG5vdGUgb24gJ1x0JyBhdCBlbmQgb2YgZmlsZQorCisgIyBkZWxldGUgQk9USCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gZWFjaCBsaW5lCisgc2VkICdzL15bIFx0XSovLztzL1sgXHRdKiQvLycKKworICMgaW5zZXJ0IDUgYmxhbmsgc3BhY2VzIGF0IGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgKG1ha2UgcGFnZSBvZmZzZXQpCisgc2VkICdzL14vICAgICAvJworCisgIyBhbGlnbiBhbGwgdGV4dCBmbHVzaCByaWdodCBvbiBhIDc5LWNvbHVtbiB3aWR0aAorIHNlZCAtZSA6YSAtZSAncy9eLlx7MSw3OFx9JC8gJi87dGEnICAjIHNldCBhdCA3OCBwbHVzIDEgc3BhY2UKKworICMgY2VudGVyIGFsbCB0ZXh0IGluIHRoZSBtaWRkbGUgb2YgNzktY29sdW1uIHdpZHRoLiBJbiBtZXRob2QgMSwKKyAjIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGFyZSBzaWduaWZpY2FudCwgYW5kIHRyYWlsaW5nCisgIyBzcGFjZXMgYXJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuIEluIG1ldGhvZCAyLCBzcGFjZXMgYXQKKyAjIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgYXJlIGRpc2NhcmRlZCBpbiBjZW50ZXJpbmcgdGhlIGxpbmUsIGFuZAorICMgbm8gdHJhaWxpbmcgc3BhY2VzIGFwcGVhciBhdCB0aGUgZW5kIG9mIGxpbmVzLgorIHNlZCAgLWUgOmEgLWUgJ3MvXi5cezEsNzdcfSQvICYgLzt0YScgICAgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAxCisgc2VkICAtZSA6YSAtZSAncy9eLlx7MSw3N1x9JC8gJi87dGEnIC1lICdzL1woICpcKVwxL1wxLycgICMgbWV0aG9kIDIKKworICMgc3Vic3RpdHV0ZSAoZmluZCBhbmQgcmVwbGFjZSkgImZvbyIgd2l0aCAiYmFyIiBvbiBlYWNoIGxpbmUKKyBzZWQgJ3MvZm9vL2Jhci8nICAgICAgICAgICAgICMgcmVwbGFjZXMgb25seSAxc3QgaW5zdGFuY2UgaW4gYSBsaW5lCisgc2VkICdzL2Zvby9iYXIvNCcgICAgICAgICAgICAjIHJlcGxhY2VzIG9ubHkgNHRoIGluc3RhbmNlIGluIGEgbGluZQorIHNlZCAncy9mb28vYmFyL2cnICAgICAgICAgICAgIyByZXBsYWNlcyBBTEwgaW5zdGFuY2VzIGluIGEgbGluZQorIHNlZCAncy9cKC4qXClmb29cKC4qZm9vXCkvXDFiYXJcMi8nICMgcmVwbGFjZSB0aGUgbmV4dC10by1sYXN0IGNhc2UKKyBzZWQgJ3MvXCguKlwpZm9vL1wxYmFyLycgICAgICAgICAgICAjIHJlcGxhY2Ugb25seSB0aGUgbGFzdCBjYXNlCisKKyAjIHN1YnN0aXR1dGUgImZvbyIgd2l0aCAiYmFyIiBPTkxZIGZvciBsaW5lcyB3aGljaCBjb250YWluICJiYXoiCisgc2VkICcvYmF6L3MvZm9vL2Jhci9nJworCisgIyBzdWJzdGl0dXRlICJmb28iIHdpdGggImJhciIgRVhDRVBUIGZvciBsaW5lcyB3aGljaCBjb250YWluICJiYXoiCisgc2VkICcvYmF6LyFzL2Zvby9iYXIvZycKKworICMgY2hhbmdlICJzY2FybGV0IiBvciAicnVieSIgb3IgInB1Y2UiIHRvICJyZWQiCisgc2VkICdzL3NjYXJsZXQvcmVkL2c7cy9ydWJ5L3JlZC9nO3MvcHVjZS9yZWQvZycgICAjIG1vc3Qgc2VkcworIGdzZWQgJ3Mvc2NhcmxldFx8cnVieVx8cHVjZS9yZWQvZycgICAgICAgICAgICAgICAgIyBHTlUgc2VkIG9ubHkKKworICMgcmV2ZXJzZSBvcmRlciBvZiBsaW5lcyAoZW11bGF0ZXMgInRhYyIpCisgIyBidWcvZmVhdHVyZSBpbiBISHNlZCB2MS41IGNhdXNlcyBibGFuayBsaW5lcyB0byBiZSBkZWxldGVkCisgc2VkICcxIUc7aDskIWQnICAgICAgICAgICAgICAgIyBtZXRob2QgMQorIHNlZCAtbiAnMSFHO2g7JHAnICAgICAgICAgICAgICMgbWV0aG9kIDIKKworICMgcmV2ZXJzZSBlYWNoIGNoYXJhY3RlciBvbiB0aGUgbGluZSAoZW11bGF0ZXMgInJldiIpCisgc2VkICcvXG4vIUc7cy9cKC5cKVwoLipcblwpLyZcMlwxLzsvL0Q7cy8uLy8nCisKKyAjIGpvaW4gcGFpcnMgb2YgbGluZXMgc2lkZS1ieS1zaWRlIChsaWtlICJwYXN0ZSIpCisgc2VkICckIU47cy9cbi8gLycKKworICMgaWYgYSBsaW5lIGVuZHMgd2l0aCBhIGJhY2tzbGFzaCwgYXBwZW5kIHRoZSBuZXh0IGxpbmUgdG8gaXQKKyBzZWQgLWUgOmEgLWUgJy9cXCQvTjsgcy9cXFxuLy87IHRhJworCisgIyBpZiBhIGxpbmUgYmVnaW5zIHdpdGggYW4gZXF1YWwgc2lnbiwgYXBwZW5kIGl0IHRvIHRoZSBwcmV2aW91cyBsaW5lCisgIyBhbmQgcmVwbGFjZSB0aGUgIj0iIHdpdGggYSBzaW5nbGUgc3BhY2UKKyBzZWQgLWUgOmEgLWUgJyQhTjtzL1xuPS8gLzt0YScgLWUgJ1A7RCcKKworICMgYWRkIGNvbW1hcyB0byBudW1lcmljIHN0cmluZ3MsIGNoYW5naW5nICIxMjM0NTY3IiB0byAiMSwyMzQsNTY3IgorIGdzZWQgJzphO3MvXEJbMC05XVx7M1x9XD4vLCYvO3RhJyAgICAgICAgICAgICAgICAgICAgICMgR05VIHNlZAorIHNlZCAtZSA6YSAtZSAncy9cKC4qWzAtOV1cKVwoWzAtOV1cezNcfVwpL1wxLFwyLzt0YScgICMgb3RoZXIgc2VkcworCisgIyBhZGQgY29tbWFzIHRvIG51bWJlcnMgd2l0aCBkZWNpbWFsIHBvaW50cyBhbmQgbWludXMgc2lnbnMgKEdOVSBzZWQpCisgZ3NlZCAnOmE7cy9cKF5cfFteMC05Ll1cKVwoWzAtOV1cK1wpXChbMC05XVx7M1x9XCkvXDFcMixcMy9nO3RhJworCisgIyBhZGQgYSBibGFuayBsaW5lIGV2ZXJ5IDUgbGluZXMgKGFmdGVyIGxpbmVzIDUsIDEwLCAxNSwgMjAsIGV0Yy4pCisgZ3NlZCAnMH41RycgICAgICAgICAgICAgICAgICAjIEdOVSBzZWQgb25seQorIHNlZCAnbjtuO247bjtHOycgICAgICAgICAgICAgIyBvdGhlciBzZWRzCisKK1NFTEVDVElWRSBQUklOVElORyBPRiBDRVJUQUlOIExJTkVTOgorCisgIyBwcmludCBmaXJzdCAxMCBsaW5lcyBvZiBmaWxlIChlbXVsYXRlcyBiZWhhdmlvciBvZiAiaGVhZCIpCisgc2VkIDEwcQorCisgIyBwcmludCBmaXJzdCBsaW5lIG9mIGZpbGUgKGVtdWxhdGVzICJoZWFkIC0xIikKKyBzZWQgcQorCisgIyBwcmludCB0aGUgbGFzdCAxMCBsaW5lcyBvZiBhIGZpbGUgKGVtdWxhdGVzICJ0YWlsIikKKyBzZWQgLWUgOmEgLWUgJyRxO047MTEsJEQ7YmEnCisKKyAjIHByaW50IHRoZSBsYXN0IDIgbGluZXMgb2YgYSBmaWxlIChlbXVsYXRlcyAidGFpbCAtMiIpCisgc2VkICckIU47JCFEJworCisgIyBwcmludCB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZSAoZW11bGF0ZXMgInRhaWwgLTEiKQorIHNlZCAnJCFkJyAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMQorIHNlZCAtbiAnJHAnICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMgorCisgIyBwcmludCBvbmx5IGxpbmVzIHdoaWNoIG1hdGNoIHJlZ3VsYXIgZXhwcmVzc2lvbiAoZW11bGF0ZXMgImdyZXAiKQorIHNlZCAtbiAnL3JlZ2V4cC9wJyAgICAgICAgICAgIyBtZXRob2QgMQorIHNlZCAnL3JlZ2V4cC8hZCcgICAgICAgICAgICAgIyBtZXRob2QgMgorCisgIyBwcmludCBvbmx5IGxpbmVzIHdoaWNoIGRvIE5PVCBtYXRjaCByZWdleHAgKGVtdWxhdGVzICJncmVwIC12IikKKyBzZWQgLW4gJy9yZWdleHAvIXAnICAgICAgICAgICMgbWV0aG9kIDEsIGNvcnJlc3BvbmRzIHRvIGFib3ZlCisgc2VkICcvcmVnZXhwL2QnICAgICAgICAgICAgICAjIG1ldGhvZCAyLCBzaW1wbGVyIHN5bnRheAorCisgIyBwcmludCB0aGUgbGluZSBpbW1lZGlhdGVseSBiZWZvcmUgYSByZWdleHAsIGJ1dCBub3QgdGhlIGxpbmUKKyAjIGNvbnRhaW5pbmcgdGhlIHJlZ2V4cAorIHNlZCAtbiAnL3JlZ2V4cC97ZzsxIXA7fTtoJworCisgIyBwcmludCB0aGUgbGluZSBpbW1lZGlhdGVseSBhZnRlciBhIHJlZ2V4cCwgYnV0IG5vdCB0aGUgbGluZQorICMgY29udGFpbmluZyB0aGUgcmVnZXhwCisgc2VkIC1uICcvcmVnZXhwL3tuO3A7fScKKworICMgcHJpbnQgMSBsaW5lIG9mIGNvbnRleHQgYmVmb3JlIGFuZCBhZnRlciByZWdleHAsIHdpdGggbGluZSBudW1iZXIKKyAjIGluZGljYXRpbmcgd2hlcmUgdGhlIHJlZ2V4cCBvY2N1cnJlZCAoc2ltaWxhciB0byAiZ3JlcCAtQTEgLUIxIikKKyBzZWQgLW4gLWUgJy9yZWdleHAvez07eDsxIXA7ZzskIU47cDtEO30nIC1lIGgKKworICMgZ3JlcCBmb3IgQUFBIGFuZCBCQkIgYW5kIENDQyAoaW4gYW55IG9yZGVyKQorIHNlZCAnL0FBQS8hZDsgL0JCQi8hZDsgL0NDQy8hZCcKKworICMgZ3JlcCBmb3IgQUFBIGFuZCBCQkIgYW5kIENDQyAoaW4gdGhhdCBvcmRlcikKKyBzZWQgJy9BQUEuKkJCQi4qQ0NDLyFkJworCisgIyBncmVwIGZvciBBQUEgb3IgQkJCIG9yIENDQyAoZW11bGF0ZXMgImVncmVwIikKKyBzZWQgLWUgJy9BQUEvYicgLWUgJy9CQkIvYicgLWUgJy9DQ0MvYicgLWUgZCAgICAjIG1vc3Qgc2VkcworIGdzZWQgJy9BQUFcfEJCQlx8Q0NDLyFkJyAgICAgICAgICAgICAgICAgICAgICAgICMgR05VIHNlZCBvbmx5CisKKyAjIHByaW50IHBhcmFncmFwaCBpZiBpdCBjb250YWlucyBBQUEgKGJsYW5rIGxpbmVzIHNlcGFyYXRlIHBhcmFncmFwaHMpCisgIyBISHNlZCB2MS41IG11c3QgaW5zZXJ0IGEgJ0c7JyBhZnRlciAneDsnIGluIHRoZSBuZXh0IDMgc2NyaXB0cyBiZWxvdworIHNlZCAtZSAnLy4ve0g7JCFkO30nIC1lICd4Oy9BQUEvIWQ7JworCisgIyBwcmludCBwYXJhZ3JhcGggaWYgaXQgY29udGFpbnMgQUFBIGFuZCBCQkIgYW5kIENDQyAoaW4gYW55IG9yZGVyKQorIHNlZCAtZSAnLy4ve0g7JCFkO30nIC1lICd4Oy9BQUEvIWQ7L0JCQi8hZDsvQ0NDLyFkJworCisgIyBwcmludCBwYXJhZ3JhcGggaWYgaXQgY29udGFpbnMgQUFBIG9yIEJCQiBvciBDQ0MKKyBzZWQgLWUgJy8uL3tIOyQhZDt9JyAtZSAneDsvQUFBL2InIC1lICcvQkJCL2InIC1lICcvQ0NDL2InIC1lIGQKKyBnc2VkICcvLi97SDskIWQ7fTt4Oy9BQUFcfEJCQlx8Q0NDL2I7ZCcgICAgICAgICAjIEdOVSBzZWQgb25seQorCisgIyBwcmludCBvbmx5IGxpbmVzIG9mIDY1IGNoYXJhY3RlcnMgb3IgbG9uZ2VyCisgc2VkIC1uICcvXi5cezY1XH0vcCcKKworICMgcHJpbnQgb25seSBsaW5lcyBvZiBsZXNzIHRoYW4gNjUgY2hhcmFjdGVycworIHNlZCAtbiAnL14uXHs2NVx9LyFwJyAgICAgICAgIyBtZXRob2QgMSwgY29ycmVzcG9uZHMgdG8gYWJvdmUKKyBzZWQgJy9eLlx7NjVcfS9kJyAgICAgICAgICAgICMgbWV0aG9kIDIsIHNpbXBsZXIgc3ludGF4CisKKyAjIHByaW50IHNlY3Rpb24gb2YgZmlsZSBmcm9tIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBlbmQgb2YgZmlsZQorIHNlZCAtbiAnL3JlZ2V4cC8sJHAnCisKKyAjIHByaW50IHNlY3Rpb24gb2YgZmlsZSBiYXNlZCBvbiBsaW5lIG51bWJlcnMgKGxpbmVzIDgtMTIsIGluY2x1c2l2ZSkKKyBzZWQgLW4gJzgsMTJwJyAgICAgICAgICAgICAgICMgbWV0aG9kIDEKKyBzZWQgJzgsMTIhZCcgICAgICAgICAgICAgICAgICMgbWV0aG9kIDIKKworICMgcHJpbnQgbGluZSBudW1iZXIgNTIKKyBzZWQgLW4gJzUycCcgICAgICAgICAgICAgICAgICMgbWV0aG9kIDEKKyBzZWQgJzUyIWQnICAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDIKKyBzZWQgJzUycTtkJyAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDMsIGVmZmljaWVudCBvbiBsYXJnZSBmaWxlcworCisgIyBiZWdpbm5pbmcgYXQgbGluZSAzLCBwcmludCBldmVyeSA3dGggbGluZQorIGdzZWQgLW4gJzN+N3AnICAgICAgICAgICAgICAgIyBHTlUgc2VkIG9ubHkKKyBzZWQgLW4gJzMsJHtwO247bjtuO247bjtuO30nICMgb3RoZXIgc2VkcworCisgIyBwcmludCBzZWN0aW9uIG9mIGZpbGUgYmV0d2VlbiB0d28gcmVndWxhciBleHByZXNzaW9ucyAoaW5jbHVzaXZlKQorIHNlZCAtbiAnL0lvd2EvLC9Nb250YW5hL3AnICAgICAgICAgICAgICMgY2FzZSBzZW5zaXRpdmUKKworU0VMRUNUSVZFIERFTEVUSU9OIE9GIENFUlRBSU4gTElORVM6CisKKyAjIHByaW50IGFsbCBvZiBmaWxlIEVYQ0VQVCBzZWN0aW9uIGJldHdlZW4gMiByZWd1bGFyIGV4cHJlc3Npb25zCisgc2VkICcvSW93YS8sL01vbnRhbmEvZCcKKworICMgZGVsZXRlIGR1cGxpY2F0ZSwgY29uc2VjdXRpdmUgbGluZXMgZnJvbSBhIGZpbGUgKGVtdWxhdGVzICJ1bmlxIikuCisgIyBGaXJzdCBsaW5lIGluIGEgc2V0IG9mIGR1cGxpY2F0ZSBsaW5lcyBpcyBrZXB0LCByZXN0IGFyZSBkZWxldGVkLgorIHNlZCAnJCFOOyAvXlwoLipcKVxuXDEkLyFQOyBEJworCisgIyBkZWxldGUgZHVwbGljYXRlLCBub25jb25zZWN1dGl2ZSBsaW5lcyBmcm9tIGEgZmlsZS4gQmV3YXJlIG5vdCB0bworICMgb3ZlcmZsb3cgdGhlIGJ1ZmZlciBzaXplIG9mIHRoZSBob2xkIHNwYWNlLCBvciBlbHNlIHVzZSBHTlUgc2VkLgorIHNlZCAtbiAnRzsgcy9cbi8mJi87IC9eXChbIC1+XSpcblwpLipcblwxL2Q7IHMvXG4vLzsgaDsgUCcKKworICMgZGVsZXRlIGFsbCBsaW5lcyBleGNlcHQgZHVwbGljYXRlIGxpbmVzIChlbXVsYXRlcyAidW5pcSAtZCIpLgorIHNlZCAnJCFOOyBzL15cKC4qXClcblwxJC9cMS87IHQ7IEQnCisKKyAjIGRlbGV0ZSB0aGUgZmlyc3QgMTAgbGluZXMgb2YgYSBmaWxlCisgc2VkICcxLDEwZCcKKworICMgZGVsZXRlIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlCisgc2VkICckZCcKKworICMgZGVsZXRlIHRoZSBsYXN0IDIgbGluZXMgb2YgYSBmaWxlCisgc2VkICdOOyQhUDskIUQ7JGQnCisKKyAjIGRlbGV0ZSB0aGUgbGFzdCAxMCBsaW5lcyBvZiBhIGZpbGUKKyBzZWQgLWUgOmEgLWUgJyRkO047MiwxMGJhJyAtZSAnUDtEJyAgICMgbWV0aG9kIDEKKyBzZWQgLW4gLWUgOmEgLWUgJzEsMTAhe1A7TjtEO307TjtiYScgICMgbWV0aG9kIDIKKworICMgZGVsZXRlIGV2ZXJ5IDh0aCBsaW5lCisgZ3NlZCAnMH44ZCcgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEdOVSBzZWQgb25seQorIHNlZCAnbjtuO247bjtuO247bjtkOycgICAgICAgICAgICAgICAgIyBvdGhlciBzZWRzCisKKyAjIGRlbGV0ZSBBTEwgYmxhbmsgbGluZXMgZnJvbSBhIGZpbGUgKHNhbWUgYXMgImdyZXAgJy4nICIpCisgc2VkICcvXiQvZCcgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAxCisgc2VkICcvLi8hZCcgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAyCisKKyAjIGRlbGV0ZSBhbGwgQ09OU0VDVVRJVkUgYmxhbmsgbGluZXMgZnJvbSBmaWxlIGV4Y2VwdCB0aGUgZmlyc3Q7IGFsc28KKyAjIGRlbGV0ZXMgYWxsIGJsYW5rIGxpbmVzIGZyb20gdG9wIGFuZCBlbmQgb2YgZmlsZSAoZW11bGF0ZXMgImNhdCAtcyIpCisgc2VkICcvLi8sL14kLyFkJyAgICAgICAgICAjIG1ldGhvZCAxLCBhbGxvd3MgMCBibGFua3MgYXQgdG9wLCAxIGF0IEVPRgorIHNlZCAnL14kL047L1xuJC9EJyAgICAgICAgIyBtZXRob2QgMiwgYWxsb3dzIDEgYmxhbmsgYXQgdG9wLCAwIGF0IEVPRgorCisgIyBkZWxldGUgYWxsIENPTlNFQ1VUSVZFIGJsYW5rIGxpbmVzIGZyb20gZmlsZSBleGNlcHQgdGhlIGZpcnN0IDI6Cisgc2VkICcvXiQvTjsvXG4kL047Ly9EJworCisgIyBkZWxldGUgYWxsIGxlYWRpbmcgYmxhbmsgbGluZXMgYXQgdG9wIG9mIGZpbGUKKyBzZWQgJy8uLywkIWQnCisKKyAjIGRlbGV0ZSBhbGwgdHJhaWxpbmcgYmxhbmsgbGluZXMgYXQgZW5kIG9mIGZpbGUKKyBzZWQgLWUgOmEgLWUgJy9eXG4qJC97JGQ7TjtiYScgLWUgJ30nICAjIHdvcmtzIG9uIGFsbCBzZWRzCisgc2VkIC1lIDphIC1lICcvXlxuKiQvTjsvXG4kL2JhJyAgICAgICAgIyBkaXR0bywgZXhjZXB0IGZvciBnc2VkIDMuMDIqCisKKyAjIGRlbGV0ZSB0aGUgbGFzdCBsaW5lIG9mIGVhY2ggcGFyYWdyYXBoCisgc2VkIC1uICcvXiQve3A7aDt9Oy8uL3t4Oy8uL3A7fScKKworU1BFQ0lBTCBBUFBMSUNBVElPTlM6CisKKyAjIHJlbW92ZSBucm9mZiBvdmVyc3RyaWtlcyAoY2hhciwgYmFja3NwYWNlKSBmcm9tIG1hbiBwYWdlcy4gVGhlICdlY2hvJworICMgY29tbWFuZCBtYXkgbmVlZCBhbiAtZSBzd2l0Y2ggaWYgeW91IHVzZSBVbml4IFN5c3RlbSBWIG9yIGJhc2ggc2hlbGwuCisgc2VkICJzLy5gZWNobyBcXFxiYC8vZyIgICAgIyBkb3VibGUgcXVvdGVzIHJlcXVpcmVkIGZvciBVbml4IGVudmlyb25tZW50Cisgc2VkICdzLy5eSC8vZycgICAgICAgICAgICAgIyBpbiBiYXNoL3Rjc2gsIHByZXNzIEN0cmwtViBhbmQgdGhlbiBDdHJsLUgKKyBzZWQgJ3MvLlx4MDgvL2cnICAgICAgICAgICAjIGhleCBleHByZXNzaW9uIGZvciBzZWQgdjEuNQorCisgIyBnZXQgVXNlbmV0L2UtbWFpbCBtZXNzYWdlIGhlYWRlcgorIHNlZCAnL14kL3EnICAgICAgICAgICAgICAgICMgZGVsZXRlcyBldmVyeXRoaW5nIGFmdGVyIGZpcnN0IGJsYW5rIGxpbmUKKworICMgZ2V0IFVzZW5ldC9lLW1haWwgbWVzc2FnZSBib2R5Cisgc2VkICcxLC9eJC9kJyAgICAgICAgICAgICAgIyBkZWxldGVzIGV2ZXJ5dGhpbmcgdXAgdG8gZmlyc3QgYmxhbmsgbGluZQorCisgIyBnZXQgU3ViamVjdCBoZWFkZXIsIGJ1dCByZW1vdmUgaW5pdGlhbCAiU3ViamVjdDogIiBwb3J0aW9uCisgc2VkICcvXlN1YmplY3Q6ICovIWQ7IHMvLy87cScKKworICMgZ2V0IHJldHVybiBhZGRyZXNzIGhlYWRlcgorIHNlZCAnL15SZXBseS1UbzovcTsgL15Gcm9tOi9oOyAvLi9kO2c7cScKKworICMgcGFyc2Ugb3V0IHRoZSBhZGRyZXNzIHByb3Blci4gUHVsbHMgb3V0IHRoZSBlLW1haWwgYWRkcmVzcyBieSBpdHNlbGYKKyAjIGZyb20gdGhlIDEtbGluZSByZXR1cm4gYWRkcmVzcyBoZWFkZXIgKHNlZSBwcmVjZWRpbmcgc2NyaXB0KQorIHNlZCAncy8gKiguKikvLzsgcy8+LiovLzsgcy8uKls6PF0gKi8vJworCisgIyBhZGQgYSBsZWFkaW5nIGFuZ2xlIGJyYWNrZXQgYW5kIHNwYWNlIHRvIGVhY2ggbGluZSAocXVvdGUgYSBtZXNzYWdlKQorIHNlZCAncy9eLz4gLycKKworICMgZGVsZXRlIGxlYWRpbmcgYW5nbGUgYnJhY2tldCAmIHNwYWNlIGZyb20gZWFjaCBsaW5lICh1bnF1b3RlIGEgbWVzc2FnZSkKKyBzZWQgJ3MvXj4gLy8nCisKKyAjIHJlbW92ZSBtb3N0IEhUTUwgdGFncyAoYWNjb21tb2RhdGVzIG11bHRpcGxlLWxpbmUgdGFncykKKyBzZWQgLWUgOmEgLWUgJ3MvPFtePl0qPi8vZzsvPC9OOy8vYmEnCisKKyAjIGV4dHJhY3QgbXVsdGktcGFydCB1dWVuY29kZWQgYmluYXJpZXMsIHJlbW92aW5nIGV4dHJhbmVvdXMgaGVhZGVyCisgIyBpbmZvLCBzbyB0aGF0IG9ubHkgdGhlIHV1ZW5jb2RlZCBwb3J0aW9uIHJlbWFpbnMuIEZpbGVzIHBhc3NlZCB0bworICMgc2VkIG11c3QgYmUgcGFzc2VkIGluIHRoZSBwcm9wZXIgb3JkZXIuIFZlcnNpb24gMSBjYW4gYmUgZW50ZXJlZAorICMgZnJvbSB0aGUgY29tbWFuZCBsaW5lOyB2ZXJzaW9uIDIgY2FuIGJlIG1hZGUgaW50byBhbiBleGVjdXRhYmxlCisgIyBVbml4IHNoZWxsIHNjcmlwdC4gKE1vZGlmaWVkIGZyb20gYSBzY3JpcHQgYnkgUmFodWwgRGhlc2kuKQorIHNlZCAnL15lbmQvLC9eYmVnaW4vZCcgZmlsZTEgZmlsZTIgLi4uIGZpbGVYIHwgdXVkZWNvZGUgICAjIHZlcnMuIDEKKyBzZWQgJy9eZW5kLywvXmJlZ2luL2QnICIkQCIgfCB1dWRlY29kZSAgICAgICAgICAgICAgICAgICAgIyB2ZXJzLiAyCisKKyAjIHppcCB1cCBlYWNoIC5UWFQgZmlsZSBpbmRpdmlkdWFsbHksIGRlbGV0aW5nIHRoZSBzb3VyY2UgZmlsZSBhbmQKKyAjIHNldHRpbmcgdGhlIG5hbWUgb2YgZWFjaCAuWklQIGZpbGUgdG8gdGhlIGJhc2VuYW1lIG9mIHRoZSAuVFhUIGZpbGUKKyAjICh1bmRlciBET1M6IHRoZSAiZGlyIC9iIiBzd2l0Y2ggcmV0dXJucyBiYXJlIGZpbGVuYW1lcyBpbiBhbGwgY2FwcykuCisgZWNobyBAZWNobyBvZmYgPnppcHVwLmJhdAorIGRpciAvYiAqLnR4dCB8IHNlZCAicy9eXCguKlwpXC5UWFQvcGt6aXAgLW1vIFwxIFwxLlRYVC8iID4+emlwdXAuYmF0CisKK1RZUElDQUwgVVNFOiBTZWQgdGFrZXMgb25lIG9yIG1vcmUgZWRpdGluZyBjb21tYW5kcyBhbmQgYXBwbGllcyBhbGwgb2YKK3RoZW0sIGluIHNlcXVlbmNlLCB0byBlYWNoIGxpbmUgb2YgaW5wdXQuIEFmdGVyIGFsbCB0aGUgY29tbWFuZHMgaGF2ZQorYmVlbiBhcHBsaWVkIHRvIHRoZSBmaXJzdCBpbnB1dCBsaW5lLCB0aGF0IGxpbmUgaXMgb3V0cHV0IGFuZCBhIHNlY29uZAoraW5wdXQgbGluZSBpcyB0YWtlbiBmb3IgcHJvY2Vzc2luZywgYW5kIHRoZSBjeWNsZSByZXBlYXRzLiBUaGUKK3ByZWNlZGluZyBleGFtcGxlcyBhc3N1bWUgdGhhdCBpbnB1dCBjb21lcyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dAorZGV2aWNlIChpLmUsIHRoZSBjb25zb2xlLCBub3JtYWxseSB0aGlzIHdpbGwgYmUgcGlwZWQgaW5wdXQpLiBPbmUgb3IKK21vcmUgZmlsZW5hbWVzIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lIGlmIHRoZSBpbnB1dCBkb2VzCitub3QgY29tZSBmcm9tIHN0ZGluLiBPdXRwdXQgaXMgc2VudCB0byBzdGRvdXQgKHRoZSBzY3JlZW4pLiBUaHVzOgorCisgY2F0IGZpbGVuYW1lIHwgc2VkICcxMHEnICAgICAgICAjIHVzZXMgcGlwZWQgaW5wdXQKKyBzZWQgJzEwcScgZmlsZW5hbWUgICAgICAgICAgICAgICMgc2FtZSBlZmZlY3QsIGF2b2lkcyBhIHVzZWxlc3MgImNhdCIKKyBzZWQgJzEwcScgZmlsZW5hbWUgPiBuZXdmaWxlICAgICMgcmVkaXJlY3RzIG91dHB1dCB0byBkaXNrCisKK0ZvciBhZGRpdGlvbmFsIHN5bnRheCBpbnN0cnVjdGlvbnMsIGluY2x1ZGluZyB0aGUgd2F5IHRvIGFwcGx5IGVkaXRpbmcKK2NvbW1hbmRzIGZyb20gYSBkaXNrIGZpbGUgaW5zdGVhZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBjb25zdWx0ICJzZWQgJgorYXdrLCAybmQgRWRpdGlvbiwiIGJ5IERhbGUgRG91Z2hlcnR5IGFuZCBBcm5vbGQgUm9iYmlucyAoTydSZWlsbHksCisxOTk3OyBodHRwOi8vd3d3Lm9yYS5jb20pLCAiVU5JWCBUZXh0IFByb2Nlc3NpbmcsIiBieSBEYWxlIERvdWdoZXJ0eQorYW5kIFRpbSBPJ1JlaWxseSAoSGF5ZGVuIEJvb2tzLCAxOTg3KSBvciB0aGUgdHV0b3JpYWxzIGJ5IE1pa2UgQXJzdAorZGlzdHJpYnV0ZWQgaW4gVS1TRURJVDIuWklQIChtYW55IHNpdGVzKS4gVG8gZnVsbHkgZXhwbG9pdCB0aGUgcG93ZXIKK29mIHNlZCwgb25lIG11c3QgdW5kZXJzdGFuZCAicmVndWxhciBleHByZXNzaW9ucy4iIEZvciB0aGlzLCBzZWUKKyJNYXN0ZXJpbmcgUmVndWxhciBFeHByZXNzaW9ucyIgYnkgSmVmZnJleSBGcmllZGwgKE8nUmVpbGx5LCAxOTk3KS4KK1RoZSBtYW51YWwgKCJtYW4iKSBwYWdlcyBvbiBVbml4IHN5c3RlbXMgbWF5IGJlIGhlbHBmdWwgKHRyeSAibWFuCitzZWQiLCAibWFuIHJlZ2V4cCIsIG9yIHRoZSBzdWJzZWN0aW9uIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gIm1hbgorZWQiKSwgYnV0IG1hbiBwYWdlcyBhcmUgbm90b3Jpb3VzbHkgZGlmZmljdWx0LiBUaGV5IGFyZSBub3Qgd3JpdHRlbiB0bwordGVhY2ggc2VkIHVzZSBvciByZWdleHBzIHRvIGZpcnN0LXRpbWUgdXNlcnMsIGJ1dCBhcyBhIHJlZmVyZW5jZSB0ZXh0Citmb3IgdGhvc2UgYWxyZWFkeSBhY3F1YWludGVkIHdpdGggdGhlc2UgdG9vbHMuCisKK1FVT1RJTkcgU1lOVEFYOiBUaGUgcHJlY2VkaW5nIGV4YW1wbGVzIHVzZSBzaW5nbGUgcXVvdGVzICgnLi4uJykKK2luc3RlYWQgb2YgZG91YmxlIHF1b3RlcyAoIi4uLiIpIHRvIGVuY2xvc2UgZWRpdGluZyBjb21tYW5kcywgc2luY2UKK3NlZCBpcyB0eXBpY2FsbHkgdXNlZCBvbiBhIFVuaXggcGxhdGZvcm0uIFNpbmdsZSBxdW90ZXMgcHJldmVudCB0aGUKK1VuaXggc2hlbGwgZnJvbSBpbnRyZXByZXRpbmcgdGhlIGRvbGxhciBzaWduICgkKSBhbmQgYmFja3F1b3RlcworKGAuLi5gKSwgd2hpY2ggYXJlIGV4cGFuZGVkIGJ5IHRoZSBzaGVsbCBpZiB0aGV5IGFyZSBlbmNsb3NlZCBpbgorZG91YmxlIHF1b3Rlcy4gVXNlcnMgb2YgdGhlICJjc2giIHNoZWxsIGFuZCBkZXJpdmF0aXZlcyB3aWxsIGFsc28gbmVlZAordG8gcXVvdGUgdGhlIGV4Y2xhbWF0aW9uIG1hcmsgKCEpIHdpdGggdGhlIGJhY2tzbGFzaCAoaS5lLiwgXCEpIHRvCitwcm9wZXJseSBydW4gdGhlIGV4YW1wbGVzIGxpc3RlZCBhYm92ZSwgZXZlbiB3aXRoaW4gc2luZ2xlIHF1b3Rlcy4KK1ZlcnNpb25zIG9mIHNlZCB3cml0dGVuIGZvciBET1MgaW52YXJpYWJseSByZXF1aXJlIGRvdWJsZSBxdW90ZXMKKygiLi4uIikgaW5zdGVhZCBvZiBzaW5nbGUgcXVvdGVzIHRvIGVuY2xvc2UgZWRpdGluZyBjb21tYW5kcy4KKworVVNFIE9GICdcdCcgSU4gU0VEIFNDUklQVFM6IEZvciBjbGFyaXR5IGluIGRvY3VtZW50YXRpb24sIHdlIGhhdmUgdXNlZAordGhlIGV4cHJlc3Npb24gJ1x0JyB0byBpbmRpY2F0ZSBhIHRhYiBjaGFyYWN0ZXIgKDB4MDkpIGluIHRoZSBzY3JpcHRzLgorSG93ZXZlciwgbW9zdCB2ZXJzaW9ucyBvZiBzZWQgZG8gbm90IHJlY29nbml6ZSB0aGUgJ1x0JyBhYmJyZXZpYXRpb24sCitzbyB3aGVuIHR5cGluZyB0aGVzZSBzY3JpcHRzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91IHNob3VsZCBwcmVzcwordGhlIFRBQiBrZXkgaW5zdGVhZC4gJ1x0JyBpcyBzdXBwb3J0ZWQgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24KK21ldGFjaGFyYWN0ZXIgaW4gYXdrLCBwZXJsLCBhbmQgSEhzZWQsIHNlZG1vZCwgYW5kIEdOVSBzZWQgdjMuMDIuODAuCisKK1ZFUlNJT05TIE9GIFNFRDogVmVyc2lvbnMgb2Ygc2VkIGRvIGRpZmZlciwgYW5kIHNvbWUgc2xpZ2h0IHN5bnRheAordmFyaWF0aW9uIGlzIHRvIGJlIGV4cGVjdGVkLiBJbiBwYXJ0aWN1bGFyLCBtb3N0IGRvIG5vdCBzdXBwb3J0IHRoZQordXNlIG9mIGxhYmVscyAoOm5hbWUpIG9yIGJyYW5jaCBpbnN0cnVjdGlvbnMgKGIsdCkgd2l0aGluIGVkaXRpbmcKK2NvbW1hbmRzLCBleGNlcHQgYXQgdGhlIGVuZCBvZiB0aG9zZSBjb21tYW5kcy4gV2UgaGF2ZSB1c2VkIHRoZSBzeW50YXgKK3doaWNoIHdpbGwgYmUgcG9ydGFibGUgdG8gbW9zdCB1c2VycyBvZiBzZWQsIGV2ZW4gdGhvdWdoIHRoZSBwb3B1bGFyCitHTlUgdmVyc2lvbnMgb2Ygc2VkIGFsbG93IGEgbW9yZSBzdWNjaW5jdCBzeW50YXguIFdoZW4gdGhlIHJlYWRlciBzZWVzCithIGZhaXJseSBsb25nIGNvbW1hbmQgc3VjaCBhcyB0aGlzOgorCisgICBzZWQgLWUgJy9BQUEvYicgLWUgJy9CQkIvYicgLWUgJy9DQ0MvYicgLWUgZAorCitpdCBpcyBoZWFydGVuaW5nIHRvIGtub3cgdGhhdCBHTlUgc2VkIHdpbGwgbGV0IHlvdSByZWR1Y2UgaXQgdG86CisKKyAgIHNlZCAnL0FBQS9iOy9CQkIvYjsvQ0NDL2I7ZCcgICAgICAjIG9yIGV2ZW4KKyAgIHNlZCAnL0FBQVx8QkJCXHxDQ0MvYjtkJworCitJbiBhZGRpdGlvbiwgcmVtZW1iZXIgdGhhdCB3aGlsZSBtYW55IHZlcnNpb25zIG9mIHNlZCBhY2NlcHQgYSBjb21tYW5kCitsaWtlICIvb25lLyBzL1JFMS9SRTIvIiwgc29tZSBkbyBOT1QgYWxsb3cgIi9vbmUvISBzL1JFMS9SRTIvIiwgd2hpY2gKK2NvbnRhaW5zIHNwYWNlIGJlZm9yZSB0aGUgJ3MnLiBPbWl0IHRoZSBzcGFjZSB3aGVuIHR5cGluZyB0aGUgY29tbWFuZC4KKworT1BUSU1JWklORyBGT1IgU1BFRUQ6IElmIGV4ZWN1dGlvbiBzcGVlZCBuZWVkcyB0byBiZSBpbmNyZWFzZWQgKGR1ZSB0bworbGFyZ2UgaW5wdXQgZmlsZXMgb3Igc2xvdyBwcm9jZXNzb3JzIG9yIGhhcmQgZGlza3MpLCBzdWJzdGl0dXRpb24gd2lsbAorYmUgZXhlY3V0ZWQgbW9yZSBxdWlja2x5IGlmIHRoZSAiZmluZCIgZXhwcmVzc2lvbiBpcyBzcGVjaWZpZWQgYmVmb3JlCitnaXZpbmcgdGhlICJzLy4uLi8uLi4vIiBpbnN0cnVjdGlvbi4gVGh1czoKKworICAgc2VkICdzL2Zvby9iYXIvZycgZmlsZW5hbWUgICAgICAgICAjIHN0YW5kYXJkIHJlcGxhY2UgY29tbWFuZAorICAgc2VkICcvZm9vLyBzL2Zvby9iYXIvZycgZmlsZW5hbWUgICAjIGV4ZWN1dGVzIG1vcmUgcXVpY2tseQorICAgc2VkICcvZm9vLyBzLy9iYXIvZycgZmlsZW5hbWUgICAgICAjIHNob3J0aGFuZCBzZWQgc3ludGF4CisKK09uIGxpbmUgc2VsZWN0aW9uIG9yIGRlbGV0aW9uIGluIHdoaWNoIHlvdSBvbmx5IG5lZWQgdG8gb3V0cHV0IGxpbmVzCitmcm9tIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlLCBhICJxdWl0IiBjb21tYW5kIChxKSBpbiB0aGUgc2NyaXB0Cit3aWxsIGRyYXN0aWNhbGx5IHJlZHVjZSBwcm9jZXNzaW5nIHRpbWUgZm9yIGxhcmdlIGZpbGVzLiBUaHVzOgorCisgICBzZWQgLW4gJzQ1LDUwcCcgZmlsZW5hbWUgICAgICAgICAgICMgcHJpbnQgbGluZSBub3MuIDQ1LTUwIG9mIGEgZmlsZQorICAgc2VkIC1uICc1MXE7NDUsNTBwJyBmaWxlbmFtZSAgICAgICAjIHNhbWUsIGJ1dCBleGVjdXRlcyBtdWNoIGZhc3RlcgorCitJZiB5b3UgaGF2ZSBhbnkgYWRkaXRpb25hbCBzY3JpcHRzIHRvIGNvbnRyaWJ1dGUgb3IgaWYgeW91IGZpbmQgZXJyb3JzCitpbiB0aGlzIGRvY3VtZW50LCBwbGVhc2Ugc2VuZCBlLW1haWwgdG8gdGhlIGNvbXBpbGVyLiBJbmRpY2F0ZSB0aGUKK3ZlcnNpb24gb2Ygc2VkIHlvdSB1c2VkLCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpdCB3YXMgY29tcGlsZWQgZm9yLCBhbmQKK3RoZSBuYXR1cmUgb2YgdGhlIHByb2JsZW0uIFZhcmlvdXMgc2NyaXB0cyBpbiB0aGlzIGZpbGUgd2VyZSB3cml0dGVuCitvciBjb250cmlidXRlZCBieToKKworIEFsIEFhYiA8YWYxMzdAZnJlZW5ldC50b3JvbnRvLm9uLmNhPiAgICMgInNlZGVycyIgbGlzdCBtb2RlcmF0b3IKKyBFZGdhciBBbGxlbiA8ZXJhQHNreS5uZXQ+ICAgICAgICAgICAgICAjIHZhcmlvdXMKKyBZaW9yZ29zIEFkYW1vcG91bG9zIDxhZGFtb0Bzb2Z0bGFiLmVjZS5udHVhLmdyPgorIERhbGUgRG91Z2hlcnR5IDxkYWxlQHNvbmdsaW5lLmNvbT4gICAgICMgYXV0aG9yIG9mICJzZWQgJiBhd2siCisgQ2FybG9zIER1YXJ0ZSA8Y2R1YUBhbGdvcy5pbmVzYy5wdD4gICAgIyBhdXRob3Igb2YgImRvIGl0IHdpdGggc2VkIgorIEVyaWMgUGVtZW50IDxwZW1lbnRlQG5vcnRocGFyay5lZHU+ICAgICMgYXV0aG9yIG9mIHRoaXMgZG9jdW1lbnQKKyBLZW4gUGl6emluaSA8a2VuQGhhbGN5b24uY29tPiAgICAgICAgICAjIGF1dGhvciBvZiBHTlUgc2VkIHYzLjAyCisgUy5HLiBSYXZlbmhhbGwgPHN0ZXcucmF2ZW5oYWxsQHRvdGFsaXNlLmNvLnVrPiAjIGdyZWF0IGRlLWh0bWwgc2NyaXB0CisgR3JlZyBVYmJlbiA8Z3N1QHJvbXVsdXMubmNzYy5taWw+ICAgICAgIyBtYW55IGNvbnRyaWJ1dGlvbnMgJiBtdWNoIGhlbHAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvc2VkX3N1bW1hcnkuaHRtIGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy9zZWRfc3VtbWFyeS5odG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlNzJiMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2VkaXRvcnMvc2VkX3N1bW1hcnkuaHRtCkBAIC0wLDAgKzEsMjIzIEBACis8aHRtbD4KKworPGhlYWQ+PHRpdGxlPkNvbW1hbmQgU3VtbWFyeSBmb3Igc2VkIChzZWQgJiBhd2ssIFNlY29uZCBFZGl0aW9uKTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+Q29tbWFuZCBTdW1tYXJ5IGZvciBzZWQ8L2gyPgorCis8ZGw+CisKKzxkdD48Yj46IDwvYj4gPGI+IDo8L2I+PGVtPmxhYmVsPC9lbT48L2R0PgorPGRkPkxhYmVsIGEgbGluZSBpbiB0aGUgc2NyaXB0IGZvciB0aGUgdHJhbnNmZXIgb2YgY29udHJvbCBieQorPGI+YjwvYj4gb3IgPGI+dDwvYj4uCis8ZW0+bGFiZWw8L2VtPiBtYXkgY29udGFpbiB1cCB0byBzZXZlbiBjaGFyYWN0ZXJzLgorKFRoZSBQT1NJWCBzdGFuZGFyZCBzYXlzIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY2FuIGFsbG93IGxvbmdlcgorbGFiZWxzIGlmIGl0IHdpc2hlcyB0by4gR05VIHNlZCBhbGxvd3MgbGFiZWxzIHRvIGJlIG9mIGFueSBsZW5ndGguKQorPC9wPjwvZGQ+CisKKworPGR0PjxiPj08L2I+IFs8ZW0+YWRkcmVzczwvZW0+XTxiPj08L2I+PC9kdD4KKzxkZD5Xcml0ZSB0byBzdGFuZGFyZCBvdXRwdXQgdGhlIGxpbmUgbnVtYmVyIG9mIGFkZHJlc3NlZCBsaW5lLjwvcD48L2RkPgorCisKKzxkdD48Yj5hPC9iPiBbPGVtPmFkZHJlc3M8L2VtPl08Yj5hXDwvYj48L2R0PgorPGRkPjxlbT50ZXh0PC9lbT48L3A+CisKKzxwPkFwcGVuZCA8ZW0+dGV4dDwvZW0+Citmb2xsb3dpbmcgZWFjaCBsaW5lIG1hdGNoZWQgYnkgPGVtPmFkZHJlc3M8L2VtPi4gIElmCis8ZW0+dGV4dDwvZW0+IGdvZXMgb3ZlciBtb3JlIHRoYW4gb25lIGxpbmUsIG5ld2xpbmVzCittdXN0IGJlICJoaWRkZW4iIGJ5IHByZWNlZGluZyB0aGVtIHdpdGggYSBiYWNrc2xhc2guICBUaGUKKzxlbT50ZXh0PC9lbT4gd2lsbCBiZSB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdAorbmV3bGluZSB0aGF0IGlzIG5vdCBoaWRkZW4gaW4gdGhpcyB3YXkuICBUaGUKKzxlbT50ZXh0PC9lbT4gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgcGF0dGVybiBzcGFjZQorYW5kIHN1YnNlcXVlbnQgY29tbWFuZHMgY2Fubm90IGJlIGFwcGxpZWQgdG8gaXQuICBUaGUgcmVzdWx0cyBvZiB0aGlzCitjb21tYW5kIGFyZSBzZW50IHRvIHN0YW5kYXJkIG91dHB1dCB3aGVuIHRoZSBsaXN0IG9mIGVkaXRpbmcgY29tbWFuZHMKK2lzIGZpbmlzaGVkLCByZWdhcmRsZXNzIG9mIHdoYXQgaGFwcGVucyB0byB0aGUgY3VycmVudCBsaW5lIGluIHRoZQorcGF0dGVybiBzcGFjZS48L3A+PC9kZD4KKworCis8ZHQ+PGI+YjwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+YjwvYj5bPGVtPmxhYmVsPC9lbT5dPC9kdD4KKzxkZD5UcmFuc2ZlciBjb250cm9sIHVuY29uZGl0aW9uYWxseSAoYnJhbmNoKSB0bworPGI+OjwvYj48ZW0+bGFiZWw8L2VtPiBlbHNld2hlcmUgaW4KK3NjcmlwdC4gIFRoYXQgaXMsIHRoZSBjb21tYW5kIGZvbGxvd2luZyB0aGUKKzxlbT5sYWJlbDwvZW0+IGlzIHRoZSBuZXh0IGNvbW1hbmQgYXBwbGllZCB0byB0aGUKK2N1cnJlbnQgbGluZS4gIElmIG5vIDxlbT5sYWJlbDwvZW0+IGlzIHNwZWNpZmllZCwKK2NvbnRyb2wgZmFsbHMgdGhyb3VnaCB0byB0aGUgZW5kIG9mIHRoZSBzY3JpcHQsIHNvIG5vIG1vcmUgY29tbWFuZHMKK2FyZSBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IGxpbmUuPC9wPjwvZGQ+CisKKworPGR0PjxiPmM8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPmNcPC9iPjwvZHQ+Cis8ZGQ+PGVtPnRleHQ8L2VtPjwvcD4KKworPHA+UmVwbGFjZSAoY2hhbmdlKSB0aGUgbGluZXMgc2VsZWN0ZWQgYnkgdGhlIGFkZHJlc3Mgd2l0aAorPGVtPnRleHQ8L2VtPi4gIFdoZW4gYSByYW5nZSBvZiBsaW5lcyBpcyBzcGVjaWZpZWQsCithbGwgbGluZXMgYXMgYSBncm91cCBhcmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgY29weSBvZgorPGVtPnRleHQ8L2VtPi4gIFRoZSBuZXdsaW5lIGZvbGxvd2luZyBlYWNoIGxpbmUgb2YKKzxlbT50ZXh0PC9lbT4gbXVzdCBiZSBlc2NhcGVkIGJ5IGEgYmFja3NsYXNoLCBleGNlcHQKK3RoZSBsYXN0IGxpbmUuICBUaGUgY29udGVudHMgb2YgdGhlIHBhdHRlcm4gc3BhY2UgYXJlLCBpbiBlZmZlY3QsCitkZWxldGVkIGFuZCBubyBzdWJzZXF1ZW50IGVkaXRpbmcgY29tbWFuZHMgY2FuIGJlIGFwcGxpZWQgdG8gaXQgKG9yIHRvCis8ZW0+dGV4dDwvZW0+KS48L3A+PC9kZD4KKworCis8ZHQ+PGI+ZDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+ZDwvYj48L2R0PgorPGRkPkRlbGV0ZSBsaW5lKHMpIGZyb20gcGF0dGVybiBzcGFjZS4gIFRodXMsIHRoZSBsaW5lIGlzIG5vdCBwYXNzZWQgdG8gc3RhbmRhcmQKK291dHB1dC4gQSBuZXcgbGluZSBvZiBpbnB1dCBpcyByZWFkIGFuZCBlZGl0aW5nIHJlc3VtZXMgd2l0aCBmaXJzdAorY29tbWFuZCBpbiBzY3JpcHQuPC9wPjwvZGQ+CisKKworPGR0PjxiPkQ8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPkQ8L2I+PC9kdD4KKzxkZD5EZWxldGUgZmlyc3QgcGFydCAodXAgdG8gZW1iZWRkZWQgbmV3bGluZSkgb2YgbXVsdGlsaW5lIHBhdHRlcm4gc3BhY2UgY3JlYXRlZAorYnkgPGI+TjwvYj4gY29tbWFuZCBhbmQgcmVzdW1lIGVkaXRpbmcgd2l0aCBmaXJzdCBjb21tYW5kIGluCitzY3JpcHQuICBJZiB0aGlzIGNvbW1hbmQgZW1wdGllcyB0aGUgcGF0dGVybiBzcGFjZSwgdGhlbiBhIG5ldyBsaW5lCitvZiBpbnB1dCBpcyByZWFkLCBhcyBpZiB0aGUgPGI+ZDwvYj4gY29tbWFuZCBoYWQgYmVlbiBleGVjdXRlZC48L3A+PC9kZD4KKworCis8ZHQ+PGI+ZzwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+ZzwvYj48L2R0PgorPGRkPkNvcHkgKGdldCkgY29udGVudHMgb2YgaG9sZCBzcGFjZSAoc2VlIDxiPmg8L2I+IG9yCis8Yj5IPC9iPiBjb21tYW5kKSBpbnRvIHRoZSBwYXR0ZXJuIHNwYWNlLCB3aXBpbmcgb3V0CitwcmV2aW91cyBjb250ZW50cy48L3A+PC9kZD4KKworCis8ZHQ+PGI+RzwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+RzwvYj48L2R0PgorPGRkPkFwcGVuZCBuZXdsaW5lIGZvbGxvd2VkIGJ5IGNvbnRlbnRzIG9mIGhvbGQgc3BhY2UgKHNlZQorPGI+aDwvYj4gb3IgPGI+SDwvYj4gY29tbWFuZCkgdG8gY29udGVudHMgb2YKK3RoZSBwYXR0ZXJuIHNwYWNlLiAgSWYgaG9sZCBzcGFjZSBpcyBlbXB0eSwgYSBuZXdsaW5lIGlzIHN0aWxsCithcHBlbmRlZCB0byB0aGUgcGF0dGVybiBzcGFjZS48L3A+PC9kZD4KKworCis8ZHQ+PGI+aDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+aDwvYj48L2R0PgorPGRkPkNvcHkgcGF0dGVybiBzcGFjZSBpbnRvIGhvbGQgc3BhY2UsIGEgc3BlY2lhbCB0ZW1wb3JhcnkgYnVmZmVyLgorUHJldmlvdXMgY29udGVudHMgb2YgaG9sZCBzcGFjZSBhcmUgd2lwZWQgb3V0LjwvcD48L2RkPgorCisKKzxkdD48Yj5IPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5IPC9iPjwvZHQ+Cis8ZGQ+QXBwZW5kIG5ld2xpbmUgYW5kIGNvbnRlbnRzIG9mIHBhdHRlcm4gc3BhY2UgdG8gY29udGVudHMgb2YgdGhlIGhvbGQKK3NwYWNlLiAgRXZlbiBpZiBob2xkIHNwYWNlIGlzIGVtcHR5LCB0aGlzIGNvbW1hbmQgc3RpbGwgYXBwZW5kcyB0aGUKK25ld2xpbmUgZmlyc3QuPC9wPjwvZGQ+CisKKworPGR0PjxiPmk8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPl08Yj5pXDwvYj48L2R0PgorPGRkPjxlbT50ZXh0PC9lbT48L3A+CisKKzxwPkluc2VydCA8ZW0+dGV4dDwvZW0+IGJlZm9yZSBlYWNoIGxpbmUgbWF0Y2hlZCBieQorPGVtPmFkZHJlc3M8L2VtPi4gKFNlZSA8Yj5hPC9iPiBmb3IKK2RldGFpbHMgb24gPGVtPnRleHQ8L2VtPi4pPC9wPjwvZGQ+CisKKworPGR0PjxiPmw8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPmw8L2I+PC9kdD4KKzxkZD5MaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgcGF0dGVybiBzcGFjZSwgc2hvd2luZyBub25wcmludGluZyBjaGFyYWN0ZXJzCithcyBBU0NJSSBjb2Rlcy4gIExvbmcgbGluZXMgYXJlIHdyYXBwZWQuPC9wPjwvZGQ+CisKKworPGR0PjxiPm48L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPm48L2I+PC9kdD4KKzxkZD5SZWFkIG5leHQgbGluZSBvZiBpbnB1dCBpbnRvIHBhdHRlcm4gc3BhY2UuICBDdXJyZW50IGxpbmUgaXMgc2VudCB0bworc3RhbmRhcmQgb3V0cHV0LiAgTmV3IGxpbmUgYmVjb21lcyBjdXJyZW50IGxpbmUgYW5kIGluY3JlbWVudHMgbGluZQorY291bnRlci4gIENvbnRyb2wgcGFzc2VzIHRvIGNvbW1hbmQgZm9sbG93aW5nIDxiPm48L2I+CitpbnN0ZWFkIG9mIHJlc3VtaW5nIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmlwdC48L3A+PC9kZD4KKworCis8ZHQ+PGI+TjwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+TjwvYj48L2R0PgorPGRkPkFwcGVuZCBuZXh0IGlucHV0IGxpbmUgdG8gY29udGVudHMgb2YgcGF0dGVybiBzcGFjZTsgdGhlIG5ldyBsaW5lIGlzCitzZXBhcmF0ZWQgZnJvbSB0aGUgcHJldmlvdXMgY29udGVudHMgb2YgdGhlIHBhdHRlcm4gc3BhY2UgYnkgYSBuZXdsaW5lLgorKFRoaXMgY29tbWFuZCBpcyBkZXNpZ25lZCB0byBhbGxvdyBwYXR0ZXJuIG1hdGNoZXMgYWNyb3NzIHR3bworbGluZXMuICBVc2luZyBcbiB0byBtYXRjaCB0aGUgZW1iZWRkZWQgbmV3bGluZSwgeW91IGNhbiBtYXRjaAorcGF0dGVybnMgYWNyb3NzIG11bHRpcGxlIGxpbmVzLik8L3A+PC9kZD4KKworCis8ZHQ+PGI+cDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+cDwvYj48L2R0PgorPGRkPlByaW50IHRoZSBhZGRyZXNzZWQgbGluZShzKS4gIE5vdGUgdGhhdCB0aGlzIGNhbiByZXN1bHQgaW4gZHVwbGljYXRlCitvdXRwdXQgdW5sZXNzIGRlZmF1bHQgb3V0cHV0IGlzIHN1cHByZXNzZWQgYnkgdXNpbmcgIiNuIiBvcgordGhlIDxzcGFuIGNsYXNzPSJvcHRpb24iPi1uPC9zcGFuPgorCitjb21tYW5kLWxpbmUgb3B0aW9uLiAgVHlwaWNhbGx5IHVzZWQgYmVmb3JlIGNvbW1hbmRzIHRoYXQgY2hhbmdlIGZsb3cKK2NvbnRyb2wgKDxiPmQ8L2I+LCA8Yj5uPC9iPiwKKzxiPmI8L2I+KSBhbmQgbWlnaHQgcHJldmVudCB0aGUgY3VycmVudCBsaW5lIGZyb20gYmVpbmcKK291dHB1dC48L3A+PC9kZD4KKworCis8ZHQ+PGI+UDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+UDwvYj48L2R0PgorPGRkPlByaW50IGZpcnN0IHBhcnQgKHVwIHRvIGVtYmVkZGVkIG5ld2xpbmUpIG9mIG11bHRpbGluZSBwYXR0ZXJuIHNwYWNlCitjcmVhdGVkIGJ5IDxiPk48L2I+IGNvbW1hbmQuICBTYW1lIGFzIDxiPnA8L2I+CitpZiA8Yj5OPC9iPiBoYXMgbm90IGJlZW4gYXBwbGllZCB0byBhIGxpbmUuPC9wPjwvZGQ+CisKKworPGR0PjxiPnE8L2I+IFs8ZW0+YWRkcmVzczwvZW0+XTxiPnE8L2I+PC9kdD4KKzxkZD5RdWl0IHdoZW4gPGVtPmFkZHJlc3M8L2VtPiBpcyBlbmNvdW50ZXJlZC4gIFRoZQorYWRkcmVzc2VkIGxpbmUgaXMgZmlyc3Qgd3JpdHRlbiB0byBvdXRwdXQgKGlmIGRlZmF1bHQgb3V0cHV0IGlzIG5vdAorc3VwcHJlc3NlZCksIGFsb25nIHdpdGggYW55IHRleHQgYXBwZW5kZWQgdG8gaXQgYnkgcHJldmlvdXMKKzxiPmE8L2I+IG9yIDxiPnI8L2I+IGNvbW1hbmRzLjwvcD48L2RkPgorCisKKzxkdD48Yj5yPC9iPiBbPGVtPmFkZHJlc3M8L2VtPl08Yj5yPC9iPiA8ZW0+ZmlsZTwvZW0+PC9kdD4KKzxkZD5SZWFkIGNvbnRlbnRzIG9mIDxlbT5maWxlPC9lbT4gYW5kIGFwcGVuZCBhZnRlciB0aGUKK2NvbnRlbnRzIG9mIHRoZSBwYXR0ZXJuIHNwYWNlLiAgRXhhY3RseSBvbmUgc3BhY2UgbXVzdCBiZSBwdXQgYmV0d2VlbgorPGI+cjwvYj4gYW5kIHRoZSBmaWxlbmFtZS48L3A+PC9kZD4KKworCis8ZHQ+PGI+czwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+czwvYj4vPGVtPnBhdHRlcm48L2VtPi88ZW0+cmVwbGFjZW1lbnQ8L2VtPi9bPGVtPmZsYWdzPC9lbT5dPC9kdD4KKzxkZD5TdWJzdGl0dXRlIDxlbT5yZXBsYWNlbWVudDwvZW0+IGZvcgorPGVtPnBhdHRlcm48L2VtPiBvbiBlYWNoIGFkZHJlc3NlZCBsaW5lLiAgSWYgcGF0dGVybgorYWRkcmVzc2VzIGFyZSB1c2VkLCB0aGUgcGF0dGVybiA8Yj4vLzwvYj4gcmVwcmVzZW50cyB0aGUKK2xhc3QgcGF0dGVybiBhZGRyZXNzIHNwZWNpZmllZC4gIFRoZSBmb2xsb3dpbmcgZmxhZ3MgY2FuIGJlIHNwZWNpZmllZDo8L3A+CisKKwk8ZGw+CisKKwk8ZHQ+PGI+bjwvYj48L2R0PgorCTxkZD5SZXBsYWNlIDxlbT5uPC9lbT50aCBpbnN0YW5jZSBvZgorCS88ZW0+cGF0dGVybjwvZW0+LyBvbiBlYWNoIGFkZHJlc3NlZCBsaW5lLgorCTxlbT5uPC9lbT4gaXMgYW55IG51bWJlciBpbiB0aGUgcmFuZ2UgMSB0byA1MTIsIGFuZAorCXRoZSBkZWZhdWx0IGlzIDEuPC9wPjwvZGQ+CisKKwk8ZHQ+PGI+ZzwvYj48L2R0PgorCTxkZD5SZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgLzxlbT5wYXR0ZXJuPC9lbT4vIG9uIGVhY2gKKwlhZGRyZXNzZWQgbGluZSwgbm90IGp1c3QgdGhlIGZpcnN0IGluc3RhbmNlLjwvcD48L2RkPgorCisJPGR0PjxiPkk8L2I+PC9kdD4KKwk8ZGQ+TWF0Y2hpbmcgaXMgY2FzZS1pbnNlbnNpdGl2ZS48cD48L3A+PC9kZD4KKworCTxkdD48Yj5wPC9iPjwvZHQ+CisJPGRkPlByaW50IHRoZSBsaW5lIGlmIGEgc3VjY2Vzc2Z1bCBzdWJzdGl0dXRpb24gaXMgZG9uZS4gIElmIHNldmVyYWwKKwlzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbnMgYXJlIGRvbmUsIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgbGluZSB3aWxsIGJlCisJcHJpbnRlZC48L3A+PC9kZD4KKworCTxkdD48Yj53PC9iPiA8ZW0+ZmlsZTwvZW0+PC9kdD4KKwk8ZGQ+V3JpdGUgdGhlIGxpbmUgdG8gPGVtPmZpbGU8L2VtPiBpZiBhIHJlcGxhY2VtZW50CisJd2FzIGRvbmUuICBBIG1heGltdW0gb2YgMTAgZGlmZmVyZW50IDxlbT5maWxlczwvZW0+IGNhbiBiZSBvcGVuZWQuPC9wPjwvZGQ+CisKKwk8L2RsPgorCis8L2RkPgorCisKKzxkdD48Yj50PC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj50IDwvYj5bPGVtPmxhYmVsPC9lbT5dPC9kdD4KKzxkZD5UZXN0IGlmIHN1Y2Nlc3NmdWwgc3Vic3RpdHV0aW9ucyBoYXZlIGJlZW4gbWFkZSBvbiBhZGRyZXNzZWQgbGluZXMsCithbmQgaWYgc28sIGJyYW5jaCB0byBsaW5lIG1hcmtlZCBieSA6PGVtPmxhYmVsPC9lbT4uCisoU2VlIDxiPmI8L2I+IGFuZCA8Yj46PC9iPi4pICBJZiBsYWJlbCBpcyBub3QKK3NwZWNpZmllZCwgY29udHJvbCBmYWxscyB0aHJvdWdoIHRvIGJvdHRvbSBvZiBzY3JpcHQuPC9wPjwvZGQ+CisKKworPGR0PjxiPnc8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPnc8L2I+IDxlbT5maWxlPC9lbT48L2R0PgorPGRkPkFwcGVuZCBjb250ZW50cyBvZiBwYXR0ZXJuIHNwYWNlIHRvIDxlbT5maWxlPC9lbT4uCitUaGlzIGFjdGlvbiBvY2N1cnMgd2hlbiB0aGUgY29tbWFuZCBpcyBlbmNvdW50ZXJlZCByYXRoZXIgdGhhbiB3aGVuCit0aGUgcGF0dGVybiBzcGFjZSBpcyBvdXRwdXQuICBFeGFjdGx5IG9uZSBzcGFjZSBtdXN0IHNlcGFyYXRlIHRoZQorPGI+dzwvYj4gYW5kIHRoZSBmaWxlbmFtZS4gIEEgbWF4aW11bSBvZiAxMCBkaWZmZXJlbnQKK2ZpbGVzIGNhbiBiZSBvcGVuZWQgaW4gYSBzY3JpcHQuICBUaGlzIGNvbW1hbmQgd2lsbCBjcmVhdGUgdGhlIGZpbGUgaWYKK2l0IGRvZXMgbm90IGV4aXN0OyBpZiB0aGUgZmlsZSBleGlzdHMsIGl0cyBjb250ZW50cyB3aWxsIGJlCitvdmVyd3JpdHRlbiBlYWNoIHRpbWUgdGhlIHNjcmlwdCBpcyBleGVjdXRlZC4gIE11bHRpcGxlIHdyaXRlIGNvbW1hbmRzCit0aGF0IGRpcmVjdCBvdXRwdXQgdG8gdGhlIHNhbWUgZmlsZSBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS48L3A+PC9kZD4KKworCis8ZHQ+PGI+eDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+eDwvYj48L2R0PgorPGRkPkV4Y2hhbmdlIGNvbnRlbnRzIG9mIHRoZSBwYXR0ZXJuIHNwYWNlIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBob2xkCitzcGFjZS48L3A+PC9kZD4KKworCis8ZHQ+PGI+eTwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+eTwvYj4vPGVtPmFiYzwvZW0+LzxlbT54eXo8L2VtPi88L2R0PgorPGRkPlRyYW5zZm9ybSBlYWNoIGNoYXJhY3RlciBieSBwb3NpdGlvbiBpbiBzdHJpbmcKKzxlbT5hYmM8L2VtPiB0byBpdHMgZXF1aXZhbGVudCBpbiBzdHJpbmcKKzxlbT54eXo8L2VtPi48L3A+PC9kZD4KKworCis8L2RsPgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy92aS5jIGIvYnVzeWJveC0xLjE5LjMvZWRpdG9ycy92aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTBjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9lZGl0b3JzL3ZpLmMKQEAgLTAsMCArMSw0MTU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0aW55IHZpLmM6IEEgc21hbGwgJ3ZpJyBjbG9uZQorICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIFN0ZXJsaW5nIEh1eGxleSA8c3RlcmxpbmdAZXVyb3BhLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBUaGluZ3MgVG8gRG86CisgKglFWElOSVQKKyAqCSRIT01FLy5leHJjICBhbmQgIC4vLmV4cmMKKyAqCWFkZCBtYWdpYyB0byBzZWFyY2gJL2Zvby4qYmFyCisgKglhZGQgOmhlbHAgY29tbWFuZAorICoJOm1hcCBtYWNyb3MKKyAqCWlmIG1hcmtbXSB2YWx1ZXMgd2VyZSBsaW5lIG51bWJlcnMgcmF0aGVyIHRoYW4gcG9pbnRlcnMKKyAqCSAgIGl0IHdvdWxkIGJlIGVhc2llciB0byBjaGFuZ2UgdGhlIG1hcmsgd2hlbiBhZGQvZGVsZXRlIGxpbmVzCisgKglNb3JlIGludGVsbGlnZW5jZSBpbiByZWZyZXNoKCkKKyAqCSI6ciAhY21kIiAgYW5kICAiIWNtZCIgIHRvIGZpbHRlciB0ZXh0IHRocm91Z2ggYW4gZXh0ZXJuYWwgY29tbWFuZAorICoJQSB0cnVlICJ1bmRvIiBmYWNpbGl0eQorICoJQW4gImV4IiBsaW5lIG9yaWVudGVkIG1vZGUtIG1heWJlIHVzaW5nICJjbWRlZGl0IgorICovCisKKy8vY29uZmlnOmNvbmZpZyBWSQorLy9jb25maWc6CWJvb2wgInZpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgICd2aScgaXMgYSB0ZXh0IGVkaXRvci4gTW9yZSBzcGVjaWZpY2FsbHksIGl0IGlzIHRoZSBPbmUgVHJ1ZQorLy9jb25maWc6CSAgdGV4dCBlZGl0b3IgPGdyaW4+LiBJdCBkb2VzLCBob3dldmVyLCBoYXZlIGEgcmF0aGVyIHN0ZWVwCisvL2NvbmZpZzoJICBsZWFybmluZyBjdXJ2ZS4gSWYgeW91IGFyZSBub3QgYWxyZWFkeSBjb21mb3J0YWJsZSB3aXRoICd2aScKKy8vY29uZmlnOgkgIHlvdSBtYXkgd2lzaCB0byB1c2Ugc29tZXRoaW5nIGVsc2UuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX01BWF9MRU4KKy8vY29uZmlnOglpbnQgIk1heGltdW0gc2NyZWVuIHdpZHRoIGluIHZpIgorLy9jb25maWc6CXJhbmdlIDI1NiAxNjM4NAorLy9jb25maWc6CWRlZmF1bHQgNDA5NgorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDb250cmFyeSB0byB3aGF0IHlvdSBtYXkgdGhpbmssIHRoaXMgaXMgbm90IGVhdGluZyBtdWNoLgorLy9jb25maWc6CSAgTWFrZSBpdCBzbWFsbGVyIHRoYW4gNGsgb25seSBpZiB5b3UgYXJlIHZlcnkgbGltaXRlZCBvbiBtZW1vcnkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJXzhCSVQKKy8vY29uZmlnOglib29sICJBbGxvdyB2aSB0byBkaXNwbGF5IDgtYml0IGNoYXJzIChvdGhlcndpc2Ugc2hvd3MgZG90cykiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHlvdXIgdGVybWluYWwgY2FuIGRpc3BsYXkgY2hhcmFjdGVycyB3aXRoIGhpZ2ggYml0IHNldCwKKy8vY29uZmlnOgkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcy4gTm90ZTogdmkgaXMgbm90IFVuaWNvZGUtY2FwYWJsZS4KKy8vY29uZmlnOgkgIElmIHlvdXIgdGVybWluYWwgY29tYmluZXMgc2V2ZXJhbCA4LWJpdCBieXRlcyBpbnRvIG9uZSBjaGFyYWN0ZXIKKy8vY29uZmlnOgkgIChhcyBpbiBVbmljb2RlIG1vZGUpLCB0aGlzIHdpbGwgbm90IHdvcmsgcHJvcGVybHkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX0NPTE9OCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIFwiOlwiIGNvbG9uIGNvbW1hbmRzIChubyBcImV4XCIgbW9kZSkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBhIGxpbWl0ZWQgc2V0IG9mIGNvbG9uIGNvbW1hbmRzIGZvciB2aS4gVGhpcyBkb2VzIG5vdAorLy9jb25maWc6CSAgcHJvdmlkZSBhbiAiZXgiIG1vZGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1lBTktNQVJLCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHlhbmsvcHV0IGNvbW1hbmRzIGFuZCBtYXJrIGNtZHMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgd2lsbCBlbmFibGUgeW91IHRvIHVzZSB5YW5rIGFuZCBwdXQsIGFzIHdlbGwgYXMgbWFyayBpbgorLy9jb25maWc6CSAgYnVzeWJveCB2aS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfU0VBUkNICisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHNlYXJjaCBhbmQgcmVwbGFjZSBjbWRzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTZWxlY3QgdGhpcyBpZiB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIGRvIHNlYXJjaCBhbmQgcmVwbGFjZSBpbgorLy9jb25maWc6CSAgYnVzeWJveCB2aS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfUkVHRVhfU0VBUkNICisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHJlZ2V4IGluIHNlYXJjaCBhbmQgcmVwbGFjZSIKKy8vY29uZmlnOglkZWZhdWx0IG4gICAjIFVzZXMgR05VIHJlZ2V4LCB3aGljaCBtYXkgYmUgdW5hdmFpbGFibGUuIEZJWE1FCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX1ZJX1NFQVJDSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFVzZSBleHRlbmRlZCByZWdleCBzZWFyY2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCisvL2NvbmZpZzoJYm9vbCAiQ2F0Y2ggc2lnbmFscyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgbWFrZSBidXN5Ym94IHZpIHNpZ25hbCBhd2FyZS4gVGhpcyB3aWxsCisvL2NvbmZpZzoJICBtYWtlIGJ1c3lib3ggdmkgc3VwcG9ydCBTSUdXSU5DSCB0byBkZWFsIHdpdGggV2luZG93IENoYW5nZXMsIGNhdGNoCisvL2NvbmZpZzoJICBDdHJsLVogYW5kIEN0cmwtQyBhbmQgYWxhcm1zLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9ET1RfQ01ECisvL2NvbmZpZzoJYm9vbCAiUmVtZW1iZXIgcHJldmlvdXMgY21kIGFuZCBcIi5cIiBjbWQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1ha2UgYnVzeWJveCB2aSByZW1lbWJlciB0aGUgbGFzdCBjb21tYW5kIGFuZCBiZSBhYmxlIHRvIHJlcGVhdCBpdC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfUkVBRE9OTFkKKy8vY29uZmlnOglib29sICJFbmFibGUgLVIgb3B0aW9uIGFuZCBcInZpZXdcIiBtb2RlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgdGhlIHJlYWQtb25seSBjb21tYW5kIGxpbmUgb3B0aW9uLCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8KKy8vY29uZmlnOgkgIG9wZW4gYSBmaWxlIGluIHJlYWQtb25seSBtb2RlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9TRVRPUFRTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHNldC1hYmxlIG9wdGlvbnMsIGFpIGljIHNob3dtYXRjaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHRoZSBlZGl0b3IgdG8gc2V0IHNvbWUgKGFpLCBpYywgc2hvd21hdGNoKSBvcHRpb25zLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9TRVQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGZvciA6c2V0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IGZvciAiOnNldCIuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1dJTl9SRVNJWkUKKy8vY29uZmlnOglib29sICJIYW5kbGUgd2luZG93IHJlc2l6ZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWFrZSBidXN5Ym94IHZpIGJlaGF2ZSBuaWNlbHkgd2l0aCB0ZXJtaW5hbHMgdGhhdCBnZXQgcmVzaXplZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfQVNLX1RFUk1JTkFMCisvL2NvbmZpZzoJYm9vbCAiVXNlICd0ZWxsIG1lIGN1cnNvciBwb3NpdGlvbicgRVNDIHNlcXVlbmNlIHRvIG1lYXN1cmUgd2luZG93IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBJZiB0ZXJtaW5hbCBzaXplIGNhbid0IGJlIHJldHJpZXZlZCBhbmQgJExJTkVTLyRDT0xVTU5TIGFyZSBub3Qgc2V0LAorLy9jb25maWc6CSAgdGhpcyBvcHRpb24gbWFrZXMgdmkgcGVyZm9ybSBhIGxhc3QtZGl0Y2ggZWZmb3J0IHRvIGZpbmQgaXQ6CisvL2NvbmZpZzoJICBwb3NpdGlvbiBjdXJzb3IgdG8gOTk5LDk5OSBhbmQgYXNrIHRlcm1pbmFsIHRvIHJlcG9ydCByZWFsCisvL2NvbmZpZzoJICBjdXJzb3IgcG9zaXRpb24gdXNpbmcgIkVTQyBbIDYgbiIgZXNjYXBlIHNlcXVlbmNlLCB0aGVuIHJlYWQgc3RkaW4uCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoaXMgaXMgbm90IGNsZWFuIGJ1dCBoZWxwcyBhIGxvdCBvbiBzZXJpYWwgbGluZXMgYW5kIHN1Y2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX09QVElNSVpFX0NVUlNPUgorLy9jb25maWc6CWJvb2wgIk9wdGltaXplIGN1cnNvciBtb3ZlbWVudCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyB3aWxsIG1ha2UgdGhlIGN1cnNvciBtb3ZlbWVudCBmYXN0ZXIsIGJ1dCByZXF1aXJlcyBtb3JlIG1lbW9yeQorLy9jb25maWc6CSAgYW5kIGl0IG1ha2VzIHRoZSBhcHBsZXQgYSB0aW55IGJpdCBsYXJnZXIuCisKKy8vYXBwbGV0OklGX1ZJKEFQUExFVCh2aSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1ZJKSArPSB2aS5vCisKKy8vdXNhZ2U6I2RlZmluZSB2aV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB2aV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkVkaXQgRklMRVxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9WSV9DT0xPTigKKy8vdXNhZ2U6ICAgICAiXG4JLWMJSW5pdGlhbCBjb21tYW5kIHRvIHJ1biAoJEVYSU5JVCBhbHNvIGF2YWlsYWJsZSkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1ZJX1JFQURPTkxZKAorLy91c2FnZTogICAgICJcbgktUglSZWFkLW9ubHkiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1ICVNob3J0IGhlbHAgcmVnYXJkaW5nIGF2YWlsYWJsZSBmZWF0dXJlcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBTaG91bGQgYmUgYWZ0ZXIgbGliYmIuaDogb24gc29tZSBzeXN0ZW1zIHJlZ2V4LmggbmVlZHMgc3lzL3R5cGVzLmg6ICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfUkVHRVhfU0VBUkNICisjIGluY2x1ZGUgPHJlZ2V4Lmg+CisjZW5kaWYKKworLyogdGhlIENSQVNITUUgY29kZSBpcyB1bm1haW50YWluZWQsIGFuZCBkb2Vzbid0IGN1cnJlbnRseSBidWlsZCAqLworI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FIDAKKworCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV84QklUCisvL0ZJWE1FOiB0aGlzIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgZm9yIFVuaWNvZGUgYW55d2F5CisjIGRlZmluZSBJc3ByaW50KGMpIChpc3ByaW50KShjKQorI2Vsc2UKKyMgZGVmaW5lIElzcHJpbnQoYykgaXNwcmludF9hc2NpaW9ubHkoYykKKyNlbmRpZgorCisjZWxzZQorCisvKiAweDliIGlzIE1ldGEtRVNDICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfOEJJVAorIyBkZWZpbmUgSXNwcmludChjKSAoKHVuc2lnbmVkIGNoYXIpKGMpID49ICcgJyAmJiAoYykgIT0gMHg3ZiAmJiAodW5zaWduZWQgY2hhcikoYykgIT0gMHg5YikKKyNlbHNlCisjIGRlZmluZSBJc3ByaW50KGMpICgodW5zaWduZWQgY2hhcikoYykgPj0gJyAnICYmICh1bnNpZ25lZCBjaGFyKShjKSA8IDB4N2YpCisjZW5kaWYKKworI2VuZGlmCisKKworZW51bSB7CisJTUFYX1RBQlNUT1AgPSAzMiwgLy8gc2FuaXR5IGxpbWl0CisJLy8gVXNlciBpbnB1dCBsZW4uIE5lZWQgbm90IGJlIGV4dHJhIGJpZy4KKwkvLyBMaW5lcyBpbiBmaWxlIGJlaW5nIGVkaXRlZCAqY2FuKiBiZSBiaWdnZXIgdGhhbiB0aGlzLgorCU1BWF9JTlBVVF9MRU4gPSAxMjgsCisJLy8gU2FuaXR5IGxpbWl0cy4gV2UgaGF2ZSBvbmx5IG9uZSBidWZmZXIgb2YgdGhpcyBzaXplLgorCU1BWF9TQ1JfQ09MUyA9IENPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU4sCisJTUFYX1NDUl9ST1dTID0gQ09ORklHX0ZFQVRVUkVfVklfTUFYX0xFTiwKK307CisKKy8qIHZ0MTAyIHR5cGljYWwgRVNDIHNlcXVlbmNlICovCisvKiB0ZXJtaW5hbCBzdGFuZG91dCBzdGFydC9ub3JtYWwgRVNDIHNlcXVlbmNlICovCisjZGVmaW5lIFNPcyAiXDAzM1s3bSIKKyNkZWZpbmUgU09uICJcMDMzWzBtIgorLyogdGVybWluYWwgYmVsbCBzZXF1ZW5jZSAqLworI2RlZmluZSBiZWxsICJcMDA3IgorLyogQ2xlYXItZW5kLW9mLWxpbmUgYW5kIENsZWFyLWVuZC1vZi1zY3JlZW4gRVNDIHNlcXVlbmNlICovCisjZGVmaW5lIENlb2wgIlwwMzNbSyIKKyNkZWZpbmUgQ2VvcyAiXDAzM1tKIgorLyogQ3Vyc29yIG1vdGlvbiBhcmJpdHJhcnkgZGVzdGluYXRpb24gRVNDIHNlcXVlbmNlICovCisjZGVmaW5lIENNcmMgIlwwMzNbJXU7JXVIIgorLyogQ3Vyc29yIG1vdGlvbiB1cCBhbmQgZG93biBFU0Mgc2VxdWVuY2UgKi8KKyNkZWZpbmUgQ011cCAiXDAzM1tBIgorI2RlZmluZSBDTWRvd24gIlxuIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRCB8fCBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworLy8gY21kcyBtb2RpZnlpbmcgdGV4dFtdCisvLyB2ZGE6IHJlbW92ZWQgImFBaUlzIiBhcyB0aGV5IHN3aXRjaCB1cyBpbnRvIGluc2VydCBtb2RlCisvLyBhbmQgcmVtZW1iZXJpbmcgaW5wdXQgZm9yIHJlcGxheSBhZnRlciB0aGVtIG1ha2VzIG5vIHNlbnNlCitzdGF0aWMgY29uc3QgY2hhciBtb2RpZnlpbmdfY21kc1tdID0gImNDZERKb09wUHJSeFg8Pn4iOworI2VuZGlmCisKK2VudW0geworCVlBTktPTkxZID0gRkFMU0UsCisJWUFOS0RFTCA9IFRSVUUsCisJRk9SV0FSRCA9IDEsCS8vIGNvZGUgZGVwZW5kcyBvbiAiMSIgIGZvciBhcnJheSBpbmRleAorCUJBQ0sgPSAtMSwJLy8gY29kZSBkZXBlbmRzIG9uICItMSIgZm9yIGFycmF5IGluZGV4CisJTElNSVRFRCA9IDAsCS8vIGhvdyBtdWNoIG9mIHRleHRbXSBpbiBjaGFyX3NlYXJjaAorCUZVTEwgPSAxLAkvLyBob3cgbXVjaCBvZiB0ZXh0W10gaW4gY2hhcl9zZWFyY2gKKworCVNfQkVGT1JFX1dTID0gMSwJLy8gdXNlZCBpbiBza2lwX3RoaW5nKCkgZm9yIG1vdmluZyAiZG90IgorCVNfVE9fV1MgPSAyLAkJLy8gdXNlZCBpbiBza2lwX3RoaW5nKCkgZm9yIG1vdmluZyAiZG90IgorCVNfT1ZFUl9XUyA9IDMsCQkvLyB1c2VkIGluIHNraXBfdGhpbmcoKSBmb3IgbW92aW5nICJkb3QiCisJU19FTkRfUFVOQ1QgPSA0LAkvLyB1c2VkIGluIHNraXBfdGhpbmcoKSBmb3IgbW92aW5nICJkb3QiCisJU19FTkRfQUxOVU0gPSA1LAkvLyB1c2VkIGluIHNraXBfdGhpbmcoKSBmb3IgbW92aW5nICJkb3QiCit9OworCisKKy8qIHZpLmMgZXhwZWN0cyBjaGFycyB0byBiZSB1bnNpZ25lZC4gKi8KKy8qIGJ1c3lib3ggYnVpbGQgc3lzdGVtIHByb3ZpZGVzIHRoYXQsIGJ1dCBpdCdzIGJldHRlciAqLworLyogdG8gYXVkaXQgYW5kIGZpeCB0aGUgc291cmNlICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwkvKiBtYW55IHJlZmVyZW5jZXMgLSBrZWVwIG5lYXIgdGhlIHRvcCBvZiBnbG9iYWxzICovCisJY2hhciAqdGV4dCwgKmVuZDsgICAgICAgLy8gcG9pbnRlcnMgdG8gdGhlIHVzZXIgZGF0YSBpbiBtZW1vcnkKKwljaGFyICpkb3Q7ICAgICAgICAgICAgICAvLyB3aGVyZSBhbGwgdGhlIGFjdGlvbiB0YWtlcyBwbGFjZQorCWludCB0ZXh0X3NpemU7CQkvLyBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyCisKKwkvKiB0aGUgcmVzdCAqLworCXNtYWxsaW50IHZpX3NldG9wczsKKyNkZWZpbmUgVklfQVVUT0lOREVOVCAxCisjZGVmaW5lIFZJX1NIT1dNQVRDSCAgMgorI2RlZmluZSBWSV9JR05PUkVDQVNFIDQKKyNkZWZpbmUgVklfRVJSX01FVEhPRCA4CisjZGVmaW5lIGF1dG9pbmRlbnQgKHZpX3NldG9wcyAmIFZJX0FVVE9JTkRFTlQpCisjZGVmaW5lIHNob3dtYXRjaCAgKHZpX3NldG9wcyAmIFZJX1NIT1dNQVRDSCApCisjZGVmaW5lIGlnbm9yZWNhc2UgKHZpX3NldG9wcyAmIFZJX0lHTk9SRUNBU0UpCisvKiBpbmRpY2F0ZSBlcnJvciB3aXRoIGJlZXAgb3IgZmxhc2ggKi8KKyNkZWZpbmUgZXJyX21ldGhvZCAodmlfc2V0b3BzICYgVklfRVJSX01FVEhPRCkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJc21hbGxpbnQgcmVhZG9ubHlfbW9kZTsKKyNkZWZpbmUgU0VUX1JFQURPTkxZX0ZJTEUoZmxhZ3MpICAgICAgICAoKGZsYWdzKSB8PSAweDAxKQorI2RlZmluZSBTRVRfUkVBRE9OTFlfTU9ERShmbGFncykgICAgICAgICgoZmxhZ3MpIHw9IDB4MDIpCisjZGVmaW5lIFVOU0VUX1JFQURPTkxZX0ZJTEUoZmxhZ3MpICAgICAgKChmbGFncykgJj0gMHhmZSkKKyNlbHNlCisjZGVmaW5lIFNFVF9SRUFET05MWV9GSUxFKGZsYWdzKSAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIFNFVF9SRUFET05MWV9NT0RFKGZsYWdzKSAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIFVOU0VUX1JFQURPTkxZX0ZJTEUoZmxhZ3MpICAgICAgKCh2b2lkKTApCisjZW5kaWYKKworCXNtYWxsaW50IGVkaXRpbmc7ICAgICAgICAvLyA+MCB3aGlsZSB3ZSBhcmUgZWRpdGluZyBhIGZpbGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gW2NvZGUgYXVkaXQgc2F5cyAiY2FuIGJlIDAsIDEgb3IgMiBvbmx5Il0KKwlzbWFsbGludCBjbWRfbW9kZTsgICAgICAgLy8gMD1jb21tYW5kICAxPWluc2VydCAyPXJlcGxhY2UKKwlpbnQgZmlsZV9tb2RpZmllZDsgICAgICAgLy8gYnVmZmVyIGNvbnRlbnRzIGNoYW5nZWQgKGNvdW50ZXIsIG5vdCBmbGFnISkKKwlpbnQgbGFzdF9maWxlX21vZGlmaWVkOyAgLy8gPSAtMTsKKwlpbnQgZm5fc3RhcnQ7ICAgICAgICAgICAgLy8gaW5kZXggb2YgZmlyc3QgY21kIGxpbmUgZmlsZSBuYW1lCisJaW50IHNhdmVfYXJnYzsgICAgICAgICAgIC8vIGhvdyBtYW55IGZpbGUgbmFtZXMgb24gY21kIGxpbmUKKwlpbnQgY21kY250OyAgICAgICAgICAgICAgLy8gcmVwZXRpdGlvbiBjb3VudAorCXVuc2lnbmVkIHJvd3MsIGNvbHVtbnM7CSAvLyB0aGUgdGVybWluYWwgc2NyZWVuIGlzIHRoaXMgc2l6ZQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0FTS19URVJNSU5BTAorCWludCBnZXRfcm93Y29sX2Vycm9yOworI2VuZGlmCisJaW50IGNyb3csIGNjb2w7ICAgICAgICAgIC8vIGN1cnNvciBpcyBvbiBDcm93IHggQ2NvbAorCWludCBvZmZzZXQ7ICAgICAgICAgICAgICAvLyBjaGFycyBzY3JvbGxlZCBvZmYgdGhlIHNjcmVlbiB0byB0aGUgbGVmdAorCWludCBoYXZlX3N0YXR1c19tc2c7ICAgICAvLyBpcyBkZWZhdWx0IGVkaXQgc3RhdHVzIG5lZWRlZD8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gW2Rvbid0IG1ha2Ugc21hbGxpbnQhXQorCWludCBsYXN0X3N0YXR1c19ja3N1bTsgICAvLyBoYXNoIG9mIGN1cnJlbnQgc3RhdHVzIGxpbmUKKwljaGFyICpjdXJyZW50X2ZpbGVuYW1lOworCWNoYXIgKnNjcmVlbmJlZ2luOyAgICAgICAvLyBpbmRleCBpbnRvIHRleHRbXSwgb2YgdG9wIGxpbmUgb24gdGhlIHNjcmVlbgorCWNoYXIgKnNjcmVlbjsgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSB2aXJ0dWFsIHNjcmVlbiBidWZmZXIKKwlpbnQgc2NyZWVuc2l6ZTsgICAgICAgICAgLy8gICAgICAgICAgICBhbmQgaXRzIHNpemUKKwlpbnQgdGFic3RvcDsKKwlpbnQgbGFzdF9mb3J3YXJkX2NoYXI7ICAgLy8gbGFzdCBjaGFyIHNlYXJjaGVkIGZvciB3aXRoICdmJyAoaW50IGJlY2F1c2Ugb2YgVW5pY29kZSkKKwljaGFyIGVyYXNlX2NoYXI7ICAgICAgICAgLy8gdGhlIHVzZXJzIGVyYXNlIGNoYXJhY3RlcgorCWNoYXIgbGFzdF9pbnB1dF9jaGFyOyAgICAvLyBsYXN0IGNoYXIgcmVhZCBmcm9tIHVzZXIKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwlzbWFsbGludCBhZGRpbmcycTsJIC8vIGFyZSB3ZSBjdXJyZW50bHkgYWRkaW5nIHVzZXIgaW5wdXQgdG8gcQorCWludCBsbWNfbGVuOyAgICAgICAgICAgICAvLyBsZW5ndGggb2YgbGFzdF9tb2RpZnlpbmdfY21kCisJY2hhciAqaW9xLCAqaW9xX3N0YXJ0OyAgIC8vIHBvaW50ZXIgdG8gc3RyaW5nIGZvciBnZXRfb25lX2NoYXIgdG8gInJlYWQiCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1IKKwlpbnQgbGFzdF9yb3c7CQkgLy8gd2hlcmUgdGhlIGN1cnNvciB3YXMgbGFzdCBtb3ZlZCB0bworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVVNFX1NJR05BTFMgfHwgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCWludCBteV9waWQ7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gKKwljaGFyICpsYXN0X3NlYXJjaF9wYXR0ZXJuOyAvLyBsYXN0IHBhdHRlcm4gZnJvbSBhICcvJyBvciAnPycgc2VhcmNoCisjZW5kaWYKKworCS8qIGZvcm1lciBzdGF0aWNzICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwljaGFyICplZGl0X2ZpbGVfX2N1cl9saW5lOworI2VuZGlmCisJaW50IHJlZnJlc2hfX29sZF9vZmZzZXQ7CisJaW50IGZvcm1hdF9lZGl0X3N0YXR1c19fdG90OworCisJLyogYSBmZXcgcmVmZXJlbmNlcyBvbmx5ICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwlpbnQgWURyZWcsIFVyZWc7ICAgICAgICAvLyBkZWZhdWx0IGRlbGV0ZSByZWdpc3RlciBhbmQgb3JpZyBsaW5lIGZvciAiVSIKKwljaGFyICpyZWdbMjhdOyAgICAgICAgICAvLyBuYW1lZCByZWdpc3RlciBhLXosICJEIiwgYW5kICJVIiAwLTI1LDI2LDI3CisJY2hhciAqbWFya1syOF07ICAgICAgICAgLy8gdXNlciBtYXJrcyBwb2ludHMgc29tZXdoZXJlIGluIHRleHRbXS0gIGEteiBhbmQgcHJldmlvdXMgY29udGV4dCAnJworCWNoYXIgKmNvbnRleHRfc3RhcnQsICpjb250ZXh0X2VuZDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCisJc2lnam1wX2J1ZiByZXN0YXJ0OyAgICAgLy8gY2F0Y2hfc2lnKCkKKyNlbmRpZgorCXN0cnVjdCB0ZXJtaW9zIHRlcm1fb3JpZywgdGVybV92aTsgLy8gcmVtZW1iZXIgd2hhdCB0aGUgY29va2VkIG1vZGUgd2FzCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04KKwljaGFyICppbml0aWFsX2NtZHNbM107ICAvLyBjdXJyZW50bHkgMiBlbnRyaWVzLCBOVUxMIHRlcm1pbmF0ZWQKKyNlbmRpZgorCS8vIFNob3VsZCBiZSBqdXN0IGVub3VnaCB0byBob2xkIGEga2V5IHNlcXVlbmNlLAorCS8vIGJ1dCBDUkFTSE1FIG1vZGUgdXNlcyBpdCBhcyBnZW5lcmF0ZWQgY29tbWFuZCBidWZmZXIgdG9vCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCWNoYXIgcmVhZGJ1ZmZlclsxMjhdOworI2Vsc2UKKwljaGFyIHJlYWRidWZmZXJbS0VZQ09ERV9CVUZGRVJfU0laRV07CisjZW5kaWYKKyNkZWZpbmUgU1RBVFVTX0JVRkZFUl9MRU4gIDIwMAorCWNoYXIgc3RhdHVzX2J1ZmZlcltTVEFUVVNfQlVGRkVSX0xFTl07IC8vIG1lc3NhZ2VzIHRvIHRoZSB1c2VyCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCWNoYXIgbGFzdF9tb2RpZnlpbmdfY21kW01BWF9JTlBVVF9MRU5dOwkvLyBsYXN0IG1vZGlmeWluZyBjbWQgZm9yICIuIgorI2VuZGlmCisJY2hhciBnZXRfaW5wdXRfbGluZV9fYnVmW01BWF9JTlBVVF9MRU5dOyAvKiBmb3JtZXIgc3RhdGljICovCisKKwljaGFyIHNjcl9vdXRfYnVmW01BWF9TQ1JfQ09MUyArIE1BWF9UQUJTVE9QICogMl07Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIHRleHQgICAgICAgICAgIChHLnRleHQgICAgICAgICAgKQorI2RlZmluZSB0ZXh0X3NpemUgICAgICAoRy50ZXh0X3NpemUgICAgICkKKyNkZWZpbmUgZW5kICAgICAgICAgICAgKEcuZW5kICAgICAgICAgICApCisjZGVmaW5lIGRvdCAgICAgICAgICAgIChHLmRvdCAgICAgICAgICAgKQorI2RlZmluZSByZWcgICAgICAgICAgICAoRy5yZWcgICAgICAgICAgICkKKworI2RlZmluZSB2aV9zZXRvcHMgICAgICAgICAgICAgICAoRy52aV9zZXRvcHMgICAgICAgICAgKQorI2RlZmluZSBlZGl0aW5nICAgICAgICAgICAgICAgICAoRy5lZGl0aW5nICAgICAgICAgICAgKQorI2RlZmluZSBjbWRfbW9kZSAgICAgICAgICAgICAgICAoRy5jbWRfbW9kZSAgICAgICAgICAgKQorI2RlZmluZSBmaWxlX21vZGlmaWVkICAgICAgICAgICAoRy5maWxlX21vZGlmaWVkICAgICAgKQorI2RlZmluZSBsYXN0X2ZpbGVfbW9kaWZpZWQgICAgICAoRy5sYXN0X2ZpbGVfbW9kaWZpZWQgKQorI2RlZmluZSBmbl9zdGFydCAgICAgICAgICAgICAgICAoRy5mbl9zdGFydCAgICAgICAgICAgKQorI2RlZmluZSBzYXZlX2FyZ2MgICAgICAgICAgICAgICAoRy5zYXZlX2FyZ2MgICAgICAgICAgKQorI2RlZmluZSBjbWRjbnQgICAgICAgICAgICAgICAgICAoRy5jbWRjbnQgICAgICAgICAgICAgKQorI2RlZmluZSByb3dzICAgICAgICAgICAgICAgICAgICAoRy5yb3dzICAgICAgICAgICAgICAgKQorI2RlZmluZSBjb2x1bW5zICAgICAgICAgICAgICAgICAoRy5jb2x1bW5zICAgICAgICAgICAgKQorI2RlZmluZSBjcm93ICAgICAgICAgICAgICAgICAgICAoRy5jcm93ICAgICAgICAgICAgICAgKQorI2RlZmluZSBjY29sICAgICAgICAgICAgICAgICAgICAoRy5jY29sICAgICAgICAgICAgICAgKQorI2RlZmluZSBvZmZzZXQgICAgICAgICAgICAgICAgICAoRy5vZmZzZXQgICAgICAgICAgICAgKQorI2RlZmluZSBzdGF0dXNfYnVmZmVyICAgICAgICAgICAoRy5zdGF0dXNfYnVmZmVyICAgICAgKQorI2RlZmluZSBoYXZlX3N0YXR1c19tc2cgICAgICAgICAoRy5oYXZlX3N0YXR1c19tc2cgICAgKQorI2RlZmluZSBsYXN0X3N0YXR1c19ja3N1bSAgICAgICAoRy5sYXN0X3N0YXR1c19ja3N1bSAgKQorI2RlZmluZSBjdXJyZW50X2ZpbGVuYW1lICAgICAgICAoRy5jdXJyZW50X2ZpbGVuYW1lICAgKQorI2RlZmluZSBzY3JlZW4gICAgICAgICAgICAgICAgICAoRy5zY3JlZW4gICAgICAgICAgICAgKQorI2RlZmluZSBzY3JlZW5zaXplICAgICAgICAgICAgICAoRy5zY3JlZW5zaXplICAgICAgICAgKQorI2RlZmluZSBzY3JlZW5iZWdpbiAgICAgICAgICAgICAoRy5zY3JlZW5iZWdpbiAgICAgICAgKQorI2RlZmluZSB0YWJzdG9wICAgICAgICAgICAgICAgICAoRy50YWJzdG9wICAgICAgICAgICAgKQorI2RlZmluZSBsYXN0X2ZvcndhcmRfY2hhciAgICAgICAoRy5sYXN0X2ZvcndhcmRfY2hhciAgKQorI2RlZmluZSBlcmFzZV9jaGFyICAgICAgICAgICAgICAoRy5lcmFzZV9jaGFyICAgICAgICAgKQorI2RlZmluZSBsYXN0X2lucHV0X2NoYXIgICAgICAgICAoRy5sYXN0X2lucHV0X2NoYXIgICAgKQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisjZGVmaW5lIHJlYWRvbmx5X21vZGUgICAgICAgICAgIChHLnJlYWRvbmx5X21vZGUgICAgICApCisjZWxzZQorI2RlZmluZSByZWFkb25seV9tb2RlICAgICAgICAgICAwCisjZW5kaWYKKyNkZWZpbmUgYWRkaW5nMnEgICAgICAgICAgICAgICAgKEcuYWRkaW5nMnEgICAgICAgICAgICkKKyNkZWZpbmUgbG1jX2xlbiAgICAgICAgICAgICAgICAgKEcubG1jX2xlbiAgICAgICAgICAgICkKKyNkZWZpbmUgaW9xICAgICAgICAgICAgICAgICAgICAgKEcuaW9xICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgaW9xX3N0YXJ0ICAgICAgICAgICAgICAgKEcuaW9xX3N0YXJ0ICAgICAgICAgICkKKyNkZWZpbmUgbGFzdF9yb3cgICAgICAgICAgICAgICAgKEcubGFzdF9yb3cgICAgICAgICAgICkKKyNkZWZpbmUgbXlfcGlkICAgICAgICAgICAgICAgICAgKEcubXlfcGlkICAgICAgICAgICAgICkKKyNkZWZpbmUgbGFzdF9zZWFyY2hfcGF0dGVybiAgICAgKEcubGFzdF9zZWFyY2hfcGF0dGVybikKKworI2RlZmluZSBlZGl0X2ZpbGVfX2N1cl9saW5lICAgICAoRy5lZGl0X2ZpbGVfX2N1cl9saW5lKQorI2RlZmluZSByZWZyZXNoX19vbGRfb2Zmc2V0ICAgICAoRy5yZWZyZXNoX19vbGRfb2Zmc2V0KQorI2RlZmluZSBmb3JtYXRfZWRpdF9zdGF0dXNfX3RvdCAoRy5mb3JtYXRfZWRpdF9zdGF0dXNfX3RvdCkKKworI2RlZmluZSBZRHJlZyAgICAgICAgICAoRy5ZRHJlZyAgICAgICAgICkKKyNkZWZpbmUgVXJlZyAgICAgICAgICAgKEcuVXJlZyAgICAgICAgICApCisjZGVmaW5lIG1hcmsgICAgICAgICAgIChHLm1hcmsgICAgICAgICAgKQorI2RlZmluZSBjb250ZXh0X3N0YXJ0ICAoRy5jb250ZXh0X3N0YXJ0ICkKKyNkZWZpbmUgY29udGV4dF9lbmQgICAgKEcuY29udGV4dF9lbmQgICApCisjZGVmaW5lIHJlc3RhcnQgICAgICAgIChHLnJlc3RhcnQgICAgICAgKQorI2RlZmluZSB0ZXJtX29yaWcgICAgICAoRy50ZXJtX29yaWcgICAgICkKKyNkZWZpbmUgdGVybV92aSAgICAgICAgKEcudGVybV92aSAgICAgICApCisjZGVmaW5lIGluaXRpYWxfY21kcyAgIChHLmluaXRpYWxfY21kcyAgKQorI2RlZmluZSByZWFkYnVmZmVyICAgICAoRy5yZWFkYnVmZmVyICAgICkKKyNkZWZpbmUgc2NyX291dF9idWYgICAgKEcuc2NyX291dF9idWYgICApCisjZGVmaW5lIGxhc3RfbW9kaWZ5aW5nX2NtZCAgKEcubGFzdF9tb2RpZnlpbmdfY21kICkKKyNkZWZpbmUgZ2V0X2lucHV0X2xpbmVfX2J1ZiAoRy5nZXRfaW5wdXRfbGluZV9fYnVmKQorCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJbGFzdF9maWxlX21vZGlmaWVkID0gLTE7IFwKKwkvKiAiIiBidXQgaGFzIHNwYWNlIGZvciAyIGNoYXJzOiAqLyBcCisJSUZfRkVBVFVSRV9WSV9TRUFSQ0gobGFzdF9zZWFyY2hfcGF0dGVybiA9IHh6YWxsb2MoMik7KSBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyBpbnQgaW5pdF90ZXh0X2J1ZmZlcihjaGFyICopOyAvLyBpbml0IGZyb20gZmlsZSBvciBjcmVhdGUgbmV3CitzdGF0aWMgdm9pZCBlZGl0X2ZpbGUoY2hhciAqKTsJLy8gZWRpdCBvbmUgZmlsZQorc3RhdGljIHZvaWQgZG9fY21kKGludCk7CS8vIGV4ZWN1dGUgYSBjb21tYW5kCitzdGF0aWMgaW50IG5leHRfdGFic3RvcChpbnQpOworc3RhdGljIHZvaWQgc3luY19jdXJzb3IoY2hhciAqLCBpbnQgKiwgaW50ICopOwkvLyBzeW5jaHJvbml6ZSB0aGUgc2NyZWVuIGN1cnNvciB0byBkb3QKK3N0YXRpYyBjaGFyICpiZWdpbl9saW5lKGNoYXIgKik7CS8vIHJldHVybiBwb2ludGVyIHRvIGN1ciBsaW5lIEItby1sCitzdGF0aWMgY2hhciAqZW5kX2xpbmUoY2hhciAqKTsJLy8gcmV0dXJuIHBvaW50ZXIgdG8gY3VyIGxpbmUgRS1vLWwKK3N0YXRpYyBjaGFyICpwcmV2X2xpbmUoY2hhciAqKTsJLy8gcmV0dXJuIHBvaW50ZXIgdG8gcHJldiBsaW5lIEItby1sCitzdGF0aWMgY2hhciAqbmV4dF9saW5lKGNoYXIgKik7CS8vIHJldHVybiBwb2ludGVyIHRvIG5leHQgbGluZSBCLW8tbAorc3RhdGljIGNoYXIgKmVuZF9zY3JlZW4odm9pZCk7CS8vIGdldCBwb2ludGVyIHRvIGxhc3QgY2hhciBvbiBzY3JlZW4KK3N0YXRpYyBpbnQgY291bnRfbGluZXMoY2hhciAqLCBjaGFyICopOwkvLyBjb3VudCBsaW5lIGZyb20gc3RhcnQgdG8gc3RvcAorc3RhdGljIGNoYXIgKmZpbmRfbGluZShpbnQpOwkvLyBmaW5kIGJlZ2luaW5nIG9mIGxpbmUgI2xpCitzdGF0aWMgY2hhciAqbW92ZV90b19jb2woY2hhciAqLCBpbnQpOwkvLyBtb3ZlICJwIiB0byBjb2x1bW4gbAorc3RhdGljIHZvaWQgZG90X2xlZnQodm9pZCk7CS8vIG1vdmUgZG90IGxlZnQtIGRvbnQgbGVhdmUgbGluZQorc3RhdGljIHZvaWQgZG90X3JpZ2h0KHZvaWQpOwkvLyBtb3ZlIGRvdCByaWdodC0gZG9udCBsZWF2ZSBsaW5lCitzdGF0aWMgdm9pZCBkb3RfYmVnaW4odm9pZCk7CS8vIG1vdmUgZG90IHRvIEItby1sCitzdGF0aWMgdm9pZCBkb3RfZW5kKHZvaWQpOwkvLyBtb3ZlIGRvdCB0byBFLW8tbAorc3RhdGljIHZvaWQgZG90X25leHQodm9pZCk7CS8vIG1vdmUgZG90IHRvIG5leHQgbGluZSBCLW8tbAorc3RhdGljIHZvaWQgZG90X3ByZXYodm9pZCk7CS8vIG1vdmUgZG90IHRvIHByZXYgbGluZSBCLW8tbAorc3RhdGljIHZvaWQgZG90X3Njcm9sbChpbnQsIGludCk7CS8vIG1vdmUgdGhlIHNjcmVlbiB1cCBvciBkb3duCitzdGF0aWMgdm9pZCBkb3Rfc2tpcF9vdmVyX3dzKHZvaWQpOwkvLyBtb3ZlIGRvdCBwYXQgV1MKK3N0YXRpYyB2b2lkIGRvdF9kZWxldGUodm9pZCk7CS8vIGRlbGV0ZSB0aGUgY2hhciBhdCAnZG90Jworc3RhdGljIGNoYXIgKmJvdW5kX2RvdChjaGFyICopOwkvLyBtYWtlIHN1cmUgIHRleHRbMF0gPD0gUCA8ICJlbmQiCitzdGF0aWMgY2hhciAqbmV3X3NjcmVlbihpbnQsIGludCk7CS8vIG1hbGxvYyB2aXJ0dWFsIHNjcmVlbiBtZW1vcnkKK3N0YXRpYyBjaGFyICpjaGFyX2luc2VydChjaGFyICosIGNoYXIpOwkvLyBpbnNlcnQgdGhlIGNoYXIgYyBhdCAncCcKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSBzdHVwaWRfaW5zZXJ0KHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCBzdHVwaWRfaW5zZXJ0KGNoYXIgKiwgY2hhcik7CS8vIHN0dXBpZGx5IGluc2VydCB0aGUgY2hhciBjIGF0ICdwJworc3RhdGljIGludCBmaW5kX3JhbmdlKGNoYXIgKiosIGNoYXIgKiosIGNoYXIpOwkvLyByZXR1cm4gcG9pbnRlcnMgZm9yIGFuIG9iamVjdAorc3RhdGljIGludCBzdF90ZXN0KGNoYXIgKiwgaW50LCBpbnQsIGNoYXIgKik7CS8vIGhlbHBlciBmb3Igc2tpcF90aGluZygpCitzdGF0aWMgY2hhciAqc2tpcF90aGluZyhjaGFyICosIGludCwgaW50LCBpbnQpOwkvLyBza2lwIHNvbWUgb2JqZWN0CitzdGF0aWMgY2hhciAqZmluZF9wYWlyKGNoYXIgKiwgY2hhcik7CS8vIGZpbmQgbWF0Y2hpbmcgcGFpciAoKSAgW10gIHt9CitzdGF0aWMgY2hhciAqdGV4dF9ob2xlX2RlbGV0ZShjaGFyICosIGNoYXIgKik7CS8vIGF0ICJwIiwgZGVsZXRlIGEgJ3NpemUnIGJ5dGUgaG9sZQorLy8gbWlnaHQgcmVhbGxvY2F0ZSB0ZXh0W10hIHVzZSBwICs9IHRleHRfaG9sZV9tYWtlKHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCB0ZXh0X2hvbGVfbWFrZShjaGFyICosIGludCk7CS8vIGF0ICJwIiwgbWFrZSBhICdzaXplJyBieXRlIGhvbGUKK3N0YXRpYyBjaGFyICp5YW5rX2RlbGV0ZShjaGFyICosIGNoYXIgKiwgaW50LCBpbnQpOwkvLyB5YW5rIHRleHRbXSBpbnRvIHJlZ2lzdGVyIHRoZW4gZGVsZXRlCitzdGF0aWMgdm9pZCBzaG93X2hlbHAodm9pZCk7CS8vIGRpc3BsYXkgc29tZSBoZWxwIGluZm8KK3N0YXRpYyB2b2lkIHJhd21vZGUodm9pZCk7CS8vIHNldCAicmF3IiBtb2RlIG9uIHR0eQorc3RhdGljIHZvaWQgY29va21vZGUodm9pZCk7CS8vIHJldHVybiB0byAiY29va2VkIiBtb2RlIG9uIHR0eQorLy8gc2xlZXAgZm9yICdoJyAxLzEwMCBzZWNvbmRzLCByZXR1cm4gMS8wIGlmIHN0ZGluIGlzIChyZWFkeSBmb3IgcmVhZCkvKG5vdCByZWFkeSkKK3N0YXRpYyBpbnQgbXlzbGVlcChpbnQpOworc3RhdGljIGludCByZWFkaXQodm9pZCk7CS8vIHJlYWQgKG1heWJlIGN1cnNvcikga2V5IGZyb20gc3RkaW4KK3N0YXRpYyBpbnQgZ2V0X29uZV9jaGFyKHZvaWQpOwkvLyByZWFkIDEgY2hhciBmcm9tIHN0ZGluCitzdGF0aWMgaW50IGZpbGVfc2l6ZShjb25zdCBjaGFyICopOyAgIC8vIHdoYXQgaXMgdGhlIGJ5dGUgc2l6ZSBvZiAiZm4iCisjaWYgIUVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisjZGVmaW5lIGZpbGVfaW5zZXJ0KGZuLCBwLCB1cGRhdGVfcm9fc3RhdHVzKSBmaWxlX2luc2VydChmbiwgcCkKKyNlbmRpZgorLy8gZmlsZV9pbnNlcnQgbWlnaHQgcmVhbGxvY2F0ZSB0ZXh0W10hCitzdGF0aWMgaW50IGZpbGVfaW5zZXJ0KGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBmaWxlX3dyaXRlKGNoYXIgKiwgY2hhciAqLCBjaGFyICopOworI2lmICFFTkFCTEVfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1IKKyNkZWZpbmUgcGxhY2VfY3Vyc29yKGEsIGIsIG9wdGltaXplKSBwbGFjZV9jdXJzb3IoYSwgYikKKyNlbmRpZgorc3RhdGljIHZvaWQgcGxhY2VfY3Vyc29yKGludCwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgc2NyZWVuX2VyYXNlKHZvaWQpOworc3RhdGljIHZvaWQgY2xlYXJfdG9fZW9sKHZvaWQpOworc3RhdGljIHZvaWQgY2xlYXJfdG9fZW9zKHZvaWQpOworc3RhdGljIHZvaWQgZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2wodm9pZCk7CitzdGF0aWMgdm9pZCBzdGFuZG91dF9zdGFydCh2b2lkKTsJLy8gc2VuZCAic3RhcnQgcmV2ZXJzZSB2aWRlbyIgc2VxdWVuY2UKK3N0YXRpYyB2b2lkIHN0YW5kb3V0X2VuZCh2b2lkKTsJLy8gc2VuZCAiZW5kIHJldmVyc2UgdmlkZW8iIHNlcXVlbmNlCitzdGF0aWMgdm9pZCBmbGFzaChpbnQpOwkJLy8gZmxhc2ggdGhlIHRlcm1pbmFsIHNjcmVlbgorc3RhdGljIHZvaWQgc2hvd19zdGF0dXNfbGluZSh2b2lkKTsJLy8gcHV0IGEgbWVzc2FnZSBvbiB0aGUgYm90dG9tIGxpbmUKK3N0YXRpYyB2b2lkIHN0YXR1c19saW5lKGNvbnN0IGNoYXIgKiwgLi4uKTsgICAgIC8vIHByaW50IHRvIHN0YXR1cyBidWYKK3N0YXRpYyB2b2lkIHN0YXR1c19saW5lX2JvbGQoY29uc3QgY2hhciAqLCAuLi4pOworc3RhdGljIHZvaWQgbm90X2ltcGxlbWVudGVkKGNvbnN0IGNoYXIgKik7IC8vIGRpc3BsYXkgIk5vdCBpbXBsZW1lbnRlZCIgbWVzc2FnZQorc3RhdGljIGludCBmb3JtYXRfZWRpdF9zdGF0dXModm9pZCk7CS8vIGZvcm1hdCBmaWxlIHN0YXR1cyBvbiBzdGF0dXMgbGluZQorc3RhdGljIHZvaWQgcmVkcmF3KGludCk7CS8vIGZvcmNlIGEgZnVsbCBzY3JlZW4gcmVmcmVzaAorc3RhdGljIGNoYXIqIGZvcm1hdF9saW5lKGNoYXIqIC8qLCBpbnQqLyk7CitzdGF0aWMgdm9pZCByZWZyZXNoKGludCk7CS8vIHVwZGF0ZSB0aGUgdGVybWluYWwgZnJvbSBzY3JlZW5bXQorCitzdGF0aWMgdm9pZCBJbmRpY2F0ZV9FcnJvcih2b2lkKTsgICAgICAgLy8gdXNlIGZsYXNoIG9yIGJlZXAgdG8gaW5kaWNhdGUgZXJyb3IKKyNkZWZpbmUgaW5kaWNhdGVfZXJyb3IoYykgSW5kaWNhdGVfRXJyb3IoKQorc3RhdGljIHZvaWQgSGl0X1JldHVybih2b2lkKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFQVJDSAorc3RhdGljIGNoYXIgKmNoYXJfc2VhcmNoKGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCk7CS8vIHNlYXJjaCBmb3IgcGF0dGVybiBzdGFydGluZyBhdCBwCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DT0xPTgorc3RhdGljIGNoYXIgKmdldF9vbmVfYWRkcmVzcyhjaGFyICosIGludCAqKTsJLy8gZ2V0IGNvbG9uIGFkZHIsIGlmIHByZXNlbnQKK3N0YXRpYyBjaGFyICpnZXRfYWRkcmVzcyhjaGFyICosIGludCAqLCBpbnQgKik7CS8vIGdldCB0d28gY29sb24gYWRkcnMsIGlmIHByZXNlbnQKK3N0YXRpYyB2b2lkIGNvbG9uKGNoYXIgKik7CS8vIGV4ZWN1dGUgdGhlICJjb2xvbiIgbW9kZSBjbWRzCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworc3RhdGljIHZvaWQgd2luY2hfc2lnKGludCk7CS8vIGNhdGNoIHdpbmRvdyBzaXplIGNoYW5nZXMKK3N0YXRpYyB2b2lkIHN1c3BlbmRfc2lnKGludCk7CS8vIGNhdGNoIGN0cmwtWgorc3RhdGljIHZvaWQgY2F0Y2hfc2lnKGludCk7ICAgICAvLyBjYXRjaCBjdHJsLUMgYW5kIGFsYXJtIHRpbWUtb3V0cworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorc3RhdGljIHZvaWQgc3RhcnRfbmV3X2NtZF9xKGNoYXIpOwkvLyBuZXcgcXVldWUgZm9yIGNvbW1hbmQKK3N0YXRpYyB2b2lkIGVuZF9jbWRfcSh2b2lkKTsJLy8gc3RvcCBzYXZpbmcgaW5wdXQgY2hhcnMKKyNlbHNlCisjZGVmaW5lIGVuZF9jbWRfcSgpICgodm9pZCkwKQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworc3RhdGljIHZvaWQgc2hvd21hdGNoaW5nKGNoYXIgKik7CS8vIHNob3cgdGhlIG1hdGNoaW5nIHBhaXIgKCkgIFtdICB7fQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksgfHwgKEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OICYmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFQVJDSCkgfHwgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorLy8gbWlnaHQgcmVhbGxvY2F0ZSB0ZXh0W10hIHVzZSBwICs9IHN0cmluZ19pbnNlcnQocCwgLi4uKSwKKy8vIGFuZCBiZSBjYXJlZnVsIHRvIG5vdCB1c2UgcG9pbnRlcnMgaW50byBwb3RlbnRpYWxseSBmcmVlZCB0ZXh0W10hCitzdGF0aWMgdWludHB0cl90IHN0cmluZ19pbnNlcnQoY2hhciAqLCBjb25zdCBjaGFyICopOwkvLyBpbnNlcnQgdGhlIHN0cmluZyBhdCAncCcKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCitzdGF0aWMgY2hhciAqdGV4dF95YW5rKGNoYXIgKiwgY2hhciAqLCBpbnQpOwkvLyBzYXZlIGNvcHkgb2YgInAiIGludG8gYSByZWdpc3Rlcgorc3RhdGljIGNoYXIgd2hhdF9yZWcodm9pZCk7CQkvLyB3aGF0IGlzIGxldHRlciBvZiBjdXJyZW50IFlEcmVnCitzdGF0aWMgdm9pZCBjaGVja19jb250ZXh0KGNoYXIpOwkvLyByZW1lbWJlciBjb250ZXh0IGZvciAnJyBjb21tYW5kCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCitzdGF0aWMgdm9pZCBjcmFzaF9kdW1teSgpOworc3RhdGljIHZvaWQgY3Jhc2hfdGVzdCgpOworc3RhdGljIGludCBjcmFzaG1lID0gMDsKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHdyaXRlMShjb25zdCBjaGFyICpvdXQpCit7CisJZnB1dHMob3V0LCBzdGRvdXQpOworfQorCitpbnQgdmlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHZpX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjOworCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUyB8fCBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCisJbXlfcGlkID0gZ2V0cGlkKCk7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCisJc3JhbmQoKGxvbmcpIG15X3BpZCk7CisjZW5kaWYKKyNpZmRlZiBOT19TVUNIX0FQUExFVF9ZRVQKKwkvKiBJZiB3ZSBhcmVuJ3QgInZpIiwgd2UgYXJlICJ2aWV3IiAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9WSV9SRUFET05MWSAmJiBhcHBsZXRfbmFtZVsyXSkgeworCQlTRVRfUkVBRE9OTFlfTU9ERShyZWFkb25seV9tb2RlKTsKKwl9CisjZW5kaWYKKworCXZpX3NldG9wcyA9IFZJX0FVVE9JTkRFTlQgfCBWSV9TSE9XTUFUQ0ggfCBWSV9JR05PUkVDQVNFOworCS8vICAxLSAgcHJvY2VzcyAkSE9NRS8uZXhyYyBmaWxlIChub3QgaW5wbGVtZW50ZWQgeWV0KQorCS8vICAyLSAgcHJvY2VzcyBFWElOSVQgdmFyaWFibGUgZnJvbSBlbnZpcm9ubWVudAorCS8vICAzLSAgcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJncworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OCisJeworCQljaGFyICpwID0gZ2V0ZW52KCJFWElOSVQiKTsKKwkJaWYgKHAgJiYgKnApCisJCQlpbml0aWFsX2NtZHNbMF0gPSB4c3RybmR1cChwLCBNQVhfSU5QVVRfTEVOKTsKKwl9CisjZW5kaWYKKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhDUkgiIElGX0ZFQVRVUkVfVklfQ09MT04oImM6IikpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCisJCWNhc2UgJ0MnOgorCQkJY3Jhc2htZSA9IDE7CisJCQlicmVhazsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJCWNhc2UgJ1InOgkJLy8gUmVhZC1vbmx5IGZsYWcKKwkJCVNFVF9SRUFET05MWV9NT0RFKHJlYWRvbmx5X21vZGUpOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DT0xPTgorCQljYXNlICdjJzoJCS8vIGNtZCBsaW5lIHZpIGNvbW1hbmQKKwkJCWlmICgqb3B0YXJnKQorCQkJCWluaXRpYWxfY21kc1tpbml0aWFsX2NtZHNbMF0gIT0gMF0gPSB4c3RybmR1cChvcHRhcmcsIE1BWF9JTlBVVF9MRU4pOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAnSCc6CisJCQlzaG93X2hlbHAoKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvLyBUaGUgYXJndiBhcnJheSBjYW4gYmUgdXNlZCBieSB0aGUgIjpuZXh0IiAgYW5kICI6cmV3aW5kIiBjb21tYW5kcworCS8vIHNhdmUgb3B0aW5kLgorCWZuX3N0YXJ0ID0gb3B0aW5kOwkvLyByZW1lbWJlciBmaXJzdCBmaWxlIG5hbWUgZm9yIDpuZXh0IGFuZCA6cmV3CisJc2F2ZV9hcmdjID0gYXJnYzsKKworCS8vLS0tLS0gVGhpcyBpcyB0aGUgbWFpbiBmaWxlIGhhbmRsaW5nIGxvb3AgLS0tLS0tLS0tLS0tLS0KKwl3aGlsZSAoMSkgeworCQllZGl0X2ZpbGUoYXJndltvcHRpbmRdKTsgLyogcGFyYW0gbWlnaHQgYmUgTlVMTCAqLworCQlpZiAoKytvcHRpbmQgPj0gYXJnYykKKwkJCWJyZWFrOworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCB0ZXh0IGZyb20gZmlsZSBvciBjcmVhdGUgYW4gZW1wdHkgYnVmICovCisvKiB3aWxsIGFsc28gdXBkYXRlIGN1cnJlbnRfZmlsZW5hbWUgKi8KK3N0YXRpYyBpbnQgaW5pdF90ZXh0X2J1ZmZlcihjaGFyICpmbikKK3sKKwlpbnQgcmM7CisJaW50IHNpemUgPSBmaWxlX3NpemUoZm4pOwkvLyBmaWxlIHNpemUuIC0xIG1lYW5zIGRvZXMgbm90IGV4aXN0LgorCisJLyogYWxsb2NhdGUvcmVhbGxvY2F0ZSB0ZXh0IGJ1ZmZlciAqLworCWZyZWUodGV4dCk7CisJdGV4dF9zaXplID0gc2l6ZSArIDEwMjQwOworCXNjcmVlbmJlZ2luID0gZG90ID0gZW5kID0gdGV4dCA9IHh6YWxsb2ModGV4dF9zaXplKTsKKworCWlmIChmbiAhPSBjdXJyZW50X2ZpbGVuYW1lKSB7CisJCWZyZWUoY3VycmVudF9maWxlbmFtZSk7CisJCWN1cnJlbnRfZmlsZW5hbWUgPSB4c3RyZHVwKGZuKTsKKwl9CisJaWYgKHNpemUgPCAwKSB7CisJCS8vIGZpbGUgZG9udCBleGlzdC4gU3RhcnQgZW1wdHkgYnVmIHdpdGggZHVtbXkgbGluZQorCQljaGFyX2luc2VydCh0ZXh0LCAnXG4nKTsKKwkJcmMgPSAwOworCX0gZWxzZSB7CisJCXJjID0gZmlsZV9pbnNlcnQoZm4sIHRleHQsIDEpOworCX0KKwlmaWxlX21vZGlmaWVkID0gMDsKKwlsYXN0X2ZpbGVfbW9kaWZpZWQgPSAtMTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCS8qIGluaXQgdGhlIG1hcmtzLiAqLworCW1lbXNldChtYXJrLCAwLCBzaXplb2YobWFyaykpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfV0lOX1JFU0laRQorc3RhdGljIGludCBxdWVyeV9zY3JlZW5fZGltZW5zaW9ucyh2b2lkKQoreworCWludCBlcnIgPSBnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURElOX0ZJTEVOTywgJmNvbHVtbnMsICZyb3dzKTsKKwlpZiAocm93cyA+IE1BWF9TQ1JfUk9XUykKKwkJcm93cyA9IE1BWF9TQ1JfUk9XUzsKKwlpZiAoY29sdW1ucyA+IE1BWF9TQ1JfQ09MUykKKwkJY29sdW1ucyA9IE1BWF9TQ1JfQ09MUzsKKwlyZXR1cm4gZXJyOworfQorI2Vsc2UKKyMgZGVmaW5lIHF1ZXJ5X3NjcmVlbl9kaW1lbnNpb25zKCkgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgZWRpdF9maWxlKGNoYXIgKmZuKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisjZGVmaW5lIGN1cl9saW5lIGVkaXRfZmlsZV9fY3VyX2xpbmUKKyNlbmRpZgorCWludCBjOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCisJaW50IHNpZzsKKyNlbmRpZgorCisJZWRpdGluZyA9IDE7CS8vIDAgPSBleGl0LCAxID0gb25lIGZpbGUsIDIgPSBtdWx0aXBsZSBmaWxlcworCXJhd21vZGUoKTsKKwlyb3dzID0gMjQ7CisJY29sdW1ucyA9IDgwOworCUlGX0ZFQVRVUkVfVklfQVNLX1RFUk1JTkFMKEcuZ2V0X3Jvd2NvbF9lcnJvciA9KSBxdWVyeV9zY3JlZW5fZGltZW5zaW9ucygpOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0FTS19URVJNSU5BTAorCWlmIChHLmdldF9yb3djb2xfZXJyb3IgLyogVE9ETz8gJiYgbm8gaW5wdXQgb24gc3RkaW4gKi8pIHsKKwkJdWludDY0X3QgazsKKwkJd3JpdGUxKCJcMDMzWzk5OTs5OTlIIiAiXDAzM1s2biIpOworCQlmZmx1c2hfYWxsKCk7CisJCWsgPSByZWFkX2tleShTVERJTl9GSUxFTk8sIHJlYWRidWZmZXIsIC8qdGltZW91dF9tczoqLyAxMDApOworCQlpZiAoKGludDMyX3QpayA9PSBLRVlDT0RFX0NVUlNPUl9QT1MpIHsKKwkJCXVpbnQzMl90IHJjID0gKGsgPj4gMzIpOworCQkJY29sdW1ucyA9IChyYyAmIDB4N2ZmZik7CisJCQlpZiAoY29sdW1ucyA+IE1BWF9TQ1JfQ09MUykKKwkJCQljb2x1bW5zID0gTUFYX1NDUl9DT0xTOworCQkJcm93cyA9ICgocmMgPj4gMTYpICYgMHg3ZmZmKTsKKwkJCWlmIChyb3dzID4gTUFYX1NDUl9ST1dTKQorCQkJCXJvd3MgPSBNQVhfU0NSX1JPV1M7CisJCX0KKwl9CisjZW5kaWYKKwluZXdfc2NyZWVuKHJvd3MsIGNvbHVtbnMpOwkvLyBnZXQgbWVtb3J5IGZvciB2aXJ0dWFsIHNjcmVlbgorCWluaXRfdGV4dF9idWZmZXIoZm4pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwlZRHJlZyA9IDI2OwkJCS8vIGRlZmF1bHQgWWFuay9EZWxldGUgcmVnCisJVXJlZyA9IDI3OwkJCS8vIGhvbGQgb3JpZyBsaW5lIGZvciAiVSIgY21kCisJbWFya1syNl0gPSBtYXJrWzI3XSA9IHRleHQ7CS8vIGluaXQgInByZXZpb3VzIGNvbnRleHQiCisjZW5kaWYKKworCWxhc3RfZm9yd2FyZF9jaGFyID0gbGFzdF9pbnB1dF9jaGFyID0gJ1wwJzsKKwljcm93ID0gMDsKKwljY29sID0gMDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCisJc2lnbmFsKFNJR0lOVCwgY2F0Y2hfc2lnKTsKKwlzaWduYWwoU0lHV0lOQ0gsIHdpbmNoX3NpZyk7CisJc2lnbmFsKFNJR1RTVFAsIHN1c3BlbmRfc2lnKTsKKwlzaWcgPSBzaWdzZXRqbXAocmVzdGFydCwgMSk7CisJaWYgKHNpZyAhPSAwKSB7CisJCXNjcmVlbmJlZ2luID0gZG90ID0gdGV4dDsKKwl9CisjZW5kaWYKKworCWNtZF9tb2RlID0gMDsJCS8vIDA9Y29tbWFuZCAgMT1pbnNlcnQgIDI9J1InZXBsYWNlCisJY21kY250ID0gMDsKKwl0YWJzdG9wID0gODsKKwlvZmZzZXQgPSAwOwkJCS8vIG5vIGhvcml6b250YWwgb2Zmc2V0CisJYyA9ICdcMCc7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCWZyZWUoaW9xX3N0YXJ0KTsKKwlpb3EgPSBpb3Ffc3RhcnQgPSBOVUxMOworCWxtY19sZW4gPSAwOworCWFkZGluZzJxID0gMDsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04KKwl7CisJCWNoYXIgKnAsICpxOworCQlpbnQgbiA9IDA7CisKKwkJd2hpbGUgKChwID0gaW5pdGlhbF9jbWRzW25dKSAhPSBOVUxMKSB7CisJCQlkbyB7CisJCQkJcSA9IHA7CisJCQkJcCA9IHN0cmNocihxLCAnXG4nKTsKKwkJCQlpZiAocCkKKwkJCQkJd2hpbGUgKCpwID09ICdcbicpCisJCQkJCQkqcCsrID0gJ1wwJzsKKwkJCQlpZiAoKnEpCisJCQkJCWNvbG9uKHEpOworCQkJfSB3aGlsZSAocCk7CisJCQlmcmVlKGluaXRpYWxfY21kc1tuXSk7CisJCQlpbml0aWFsX2NtZHNbbl0gPSBOVUxMOworCQkJbisrOworCQl9CisJfQorI2VuZGlmCisJcmVkcmF3KEZBTFNFKTsJCQkvLyBkb250IGZvcmNlIGV2ZXJ5IGNvbCByZS1kcmF3CisJLy8tLS0tLS1UaGlzIGlzIHRoZSBtYWluIFZpIGNtZCBoYW5kbGluZyBsb29wIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJd2hpbGUgKGVkaXRpbmcgPiAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCQlpZiAoY3Jhc2htZSA+IDApIHsKKwkJCWlmICgoZW5kIC0gdGV4dCkgPiAxKSB7CisJCQkJY3Jhc2hfZHVtbXkoKTsJLy8gZ2VuZXJhdGUgYSByYW5kb20gY29tbWFuZAorCQkJfSBlbHNlIHsKKwkJCQljcmFzaG1lID0gMDsKKwkJCQlzdHJpbmdfaW5zZXJ0KHRleHQsICJcblxuIyMjIyMgIFJhbiBvdXQgb2YgdGV4dCB0byB3b3JrIG9uLiAgIyMjIyNcblxuIik7IC8vIGluc2VydCB0aGUgc3RyaW5nCisJCQkJZG90ID0gdGV4dDsKKwkJCQlyZWZyZXNoKEZBTFNFKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWxhc3RfaW5wdXRfY2hhciA9IGMgPSBnZXRfb25lX2NoYXIoKTsJLy8gZ2V0IGEgY21kIGZyb20gdXNlcgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJCS8vIHNhdmUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGxpbmUtIGZvciB0aGUgJ1UiIGNvbW1hbmQKKwkJaWYgKGJlZ2luX2xpbmUoZG90KSAhPSBjdXJfbGluZSkgeworCQkJY3VyX2xpbmUgPSBiZWdpbl9saW5lKGRvdCk7CisJCQl0ZXh0X3lhbmsoYmVnaW5fbGluZShkb3QpLCBlbmRfbGluZShkb3QpLCBVcmVnKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCQkvLyBUaGVzZSBhcmUgY29tbWFuZHMgdGhhdCBjaGFuZ2UgdGV4dFtdLgorCQkvLyBSZW1lbWJlciB0aGUgaW5wdXQgZm9yIHRoZSAiLiIgY29tbWFuZAorCQlpZiAoIWFkZGluZzJxICYmIGlvcV9zdGFydCA9PSBOVUxMCisJCSAmJiBjbWRfbW9kZSA9PSAwIC8vIGNvbW1hbmQgbW9kZQorCQkgJiYgYyA+ICdcMCcgLy8gZXhjbHVkZSBOVUwgYW5kIG5vbi1BU0NJSSBjaGFycworCQkgJiYgYyA8IDB4N2YgLy8gKFVuaWNvZGUgYW5kIHN1Y2gpCisJCSAmJiBzdHJjaHIobW9kaWZ5aW5nX2NtZHMsIGMpCisJCSkgeworCQkJc3RhcnRfbmV3X2NtZF9xKGMpOworCQl9CisjZW5kaWYKKwkJZG9fY21kKGMpOwkJLy8gZXhlY3V0ZSB0aGUgdXNlciBjb21tYW5kCisKKwkJLy8gcG9sbCB0byBzZWUgaWYgdGhlcmUgaXMgaW5wdXQgYWxyZWFkeSB3YWl0aW5nLiBpZiB3ZSBhcmUKKwkJLy8gbm90IGFibGUgdG8gZGlzcGxheSBvdXRwdXQgZmFzdCBlbm91Z2ggdG8ga2VlcCB1cCwgc2tpcAorCQkvLyB0aGUgZGlzcGxheSB1cGRhdGUgdW50aWwgd2UgY2F0Y2ggdXAgd2l0aCBpbnB1dC4KKwkJaWYgKCFyZWFkYnVmZmVyWzBdICYmIG15c2xlZXAoMCkgPT0gMCkgeworCQkJLy8gbm8gaW5wdXQgcGVuZGluZyAtIHNvIHVwZGF0ZSBvdXRwdXQKKwkJCXJlZnJlc2goRkFMU0UpOworCQkJc2hvd19zdGF0dXNfbGluZSgpOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCQlpZiAoY3Jhc2htZSA+IDApCisJCQljcmFzaF90ZXN0KCk7CS8vIHRlc3QgZWRpdG9yIHZhcmlhYmxlcworI2VuZGlmCisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwljb29rbW9kZSgpOworI3VuZGVmIGN1cl9saW5lCit9CisKKy8vLS0tLS0gVGhlIENvbG9uIGNvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DT0xPTgorc3RhdGljIGNoYXIgKmdldF9vbmVfYWRkcmVzcyhjaGFyICpwLCBpbnQgKmFkZHIpCS8vIGdldCBjb2xvbiBhZGRyLCBpZiBwcmVzZW50Cit7CisJaW50IHN0OworCWNoYXIgKnE7CisJSUZfRkVBVFVSRV9WSV9ZQU5LTUFSSyhjaGFyIGM7KQorCUlGX0ZFQVRVUkVfVklfU0VBUkNIKGNoYXIgKnBhdDspCisKKwkqYWRkciA9IC0xOwkJCS8vIGFzc3VtZSBubyBhZGRyCisJaWYgKCpwID09ICcuJykgewkvLyB0aGUgY3VycmVudCBsaW5lCisJCXArKzsKKwkJcSA9IGJlZ2luX2xpbmUoZG90KTsKKwkJKmFkZHIgPSBjb3VudF9saW5lcyh0ZXh0LCBxKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwllbHNlIGlmICgqcCA9PSAnXCcnKSB7CS8vIGlzIHRoaXMgYSBtYXJrIGFkZHIKKwkJcCsrOworCQljID0gdG9sb3dlcigqcCk7CisJCXArKzsKKwkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisJCQkvLyB3ZSBoYXZlIGEgbWFyaworCQkJYyA9IGMgLSAnYSc7CisJCQlxID0gbWFya1sodW5zaWduZWQgY2hhcikgY107CisJCQlpZiAocSAhPSBOVUxMKSB7CS8vIGlzIG1hcmsgdmFsaWQKKwkJCQkqYWRkciA9IGNvdW50X2xpbmVzKHRleHQsIHEpOworCQkJfQorCQl9CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisJZWxzZSBpZiAoKnAgPT0gJy8nKSB7CS8vIGEgc2VhcmNoIHBhdHRlcm4KKwkJcSA9IHN0cmNocm51bCgrK3AsICcvJyk7CisJCXBhdCA9IHhzdHJuZHVwKHAsIHEgLSBwKTsgLy8gc2F2ZSBjb3B5IG9mIHBhdHRlcm4KKwkJcCA9IHE7CisJCWlmICgqcCA9PSAnLycpCisJCQlwKys7CisJCXEgPSBjaGFyX3NlYXJjaChkb3QsIHBhdCwgRk9SV0FSRCwgRlVMTCk7CisJCWlmIChxICE9IE5VTEwpIHsKKwkJCSphZGRyID0gY291bnRfbGluZXModGV4dCwgcSk7CisJCX0KKwkJZnJlZShwYXQpOworCX0KKyNlbmRpZgorCWVsc2UgaWYgKCpwID09ICckJykgewkvLyB0aGUgbGFzdCBsaW5lIGluIGZpbGUKKwkJcCsrOworCQlxID0gYmVnaW5fbGluZShlbmQgLSAxKTsKKwkJKmFkZHIgPSBjb3VudF9saW5lcyh0ZXh0LCBxKTsKKwl9IGVsc2UgaWYgKGlzZGlnaXQoKnApKSB7CS8vIHNwZWNpZmljIGxpbmUgbnVtYmVyCisJCXNzY2FuZihwLCAiJWQlbiIsIGFkZHIsICZzdCk7CisJCXAgKz0gc3Q7CisJfSBlbHNlIHsKKwkJLy8gdW5yZWNvZ25pemVkIGFkZHJlc3MgLSBhc3N1bWUgLTEKKwkJKmFkZHIgPSAtMTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfYWRkcmVzcyhjaGFyICpwLCBpbnQgKmIsIGludCAqZSkJLy8gZ2V0IHR3byBjb2xvbiBhZGRycywgaWYgcHJlc2VudAoreworCS8vLS0tLS0gZ2V0IHRoZSBhZGRyZXNzJyBpLmUuLCAxLDMgICAnYSwnYiAgLS0tLS0KKwkvLyBnZXQgRklSU1QgYWRkciwgaWYgcHJlc2VudAorCXdoaWxlIChpc2JsYW5rKCpwKSkKKwkJcCsrOwkJCQkvLyBza2lwIG92ZXIgbGVhZGluZyBzcGFjZXMKKwlpZiAoKnAgPT0gJyUnKSB7CQkJLy8gYWxpYXMgZm9yIDEsJAorCQlwKys7CisJCSpiID0gMTsKKwkJKmUgPSBjb3VudF9saW5lcyh0ZXh0LCBlbmQtMSk7CisJCWdvdG8gZ2EwOworCX0KKwlwID0gZ2V0X29uZV9hZGRyZXNzKHAsIGIpOworCXdoaWxlIChpc2JsYW5rKCpwKSkKKwkJcCsrOworCWlmICgqcCA9PSAnLCcpIHsJCQkvLyBpcyB0aGVyZSBhIGFkZHJlc3Mgc2VwYXJhdG9yCisJCXArKzsKKwkJd2hpbGUgKGlzYmxhbmsoKnApKQorCQkJcCsrOworCQkvLyBnZXQgU0VDT05EIGFkZHIsIGlmIHByZXNlbnQKKwkJcCA9IGdldF9vbmVfYWRkcmVzcyhwLCBlKTsKKwl9CisgZ2EwOgorCXdoaWxlIChpc2JsYW5rKCpwKSkKKwkJcCsrOwkJCQkvLyBza2lwIG92ZXIgdHJhaWxpbmcgc3BhY2VzCisJcmV0dXJuIHA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVQgJiYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworc3RhdGljIHZvaWQgc2V0b3BzKGNvbnN0IGNoYXIgKmFyZ3MsIGNvbnN0IGNoYXIgKm9wbmFtZSwgaW50IGZsZ19ubywKKwkJCWNvbnN0IGNoYXIgKnNob3J0X29wbmFtZSwgaW50IG9wdCkKK3sKKwljb25zdCBjaGFyICphID0gYXJncyArIGZsZ19ubzsKKwlpbnQgbCA9IHN0cmxlbihvcG5hbWUpIC0gMTsgLyogb3BuYW1lIGhhdmUgKyAnICcgKi8KKworCS8vIG1heWJlIHN0cm5jbXA/IHdlIGhhZCB0b25zIG9mIGVycm9uZW91cyBzdHJuY2FzZWNtcCdzLi4uCisJaWYgKHN0cm5jYXNlY21wKGEsIG9wbmFtZSwgbCkgPT0gMAorCSB8fCBzdHJuY2FzZWNtcChhLCBzaG9ydF9vcG5hbWUsIDIpID09IDAKKwkpIHsKKwkJaWYgKGZsZ19ubykKKwkJCXZpX3NldG9wcyAmPSB+b3B0OworCQllbHNlCisJCQl2aV9zZXRvcHMgfD0gb3B0OworCX0KK30KKyNlbmRpZgorCisvLyBidWYgbXVzdCBiZSBubyBsb25nZXIgdGhhbiBNQVhfSU5QVVRfTEVOIQorc3RhdGljIHZvaWQgY29sb24oY2hhciAqYnVmKQoreworCWNoYXIgYywgKm9yaWdfYnVmLCAqYnVmMSwgKnEsICpyOworCWNoYXIgKmZuLCBjbWRbTUFYX0lOUFVUX0xFTl0sIGFyZ3NbTUFYX0lOUFVUX0xFTl07CisJaW50IGksIGwsIGxpLCBjaCwgYiwgZTsKKwlpbnQgdXNlZm9yY2UsIGZvcmNlZCA9IEZBTFNFOworCisJLy8gOjMxNTQJLy8gaWYgKC1lIGxpbmUgMzE1NCkgZ290byBpdCAgZWxzZSBzdGF5IHB1dAorCS8vIDo0LDMzdyEgZm9vCS8vIHdyaXRlIGEgcG9ydGlvbiBvZiBidWZmZXIgdG8gZmlsZSAiZm9vIgorCS8vIDp3CQkvLyB3cml0ZSBhbGwgb2YgYnVmZmVyIHRvIGN1cnJlbnQgZmlsZQorCS8vIDpxCQkvLyBxdWl0CisJLy8gOnEhCQkvLyBxdWl0LSBkb250IGNhcmUgYWJvdXQgbW9kaWZpZWQgZmlsZQorCS8vIDonYSwneiFzb3J0IC11ICAgLy8gZmlsdGVyIGJsb2NrIHRocm91Z2ggc29ydAorCS8vIDonZgkJLy8gZ290byBtYXJrICJmIgorCS8vIDonZmwJCS8vIGxpc3QgbGl0ZXJhbCB0aGUgbWFyayAiZiIgbGluZQorCS8vIDouciBiYXIJLy8gcmVhZCBmaWxlICJiYXIiIGludG8gYnVmZmVyIGJlZm9yZSBkb3QKKwkvLyA6LzEyMy8sL2FiYy9kICAgIC8vIGRlbGV0ZSBsaW5lcyBmcm9tICIxMjMiIGxpbmUgdG8gImFiYyIgbGluZQorCS8vIDoveHl6LwkvLyBnb3RvIHRoZSAieHl6IiBsaW5lCisJLy8gOnMvZmluZC9yZXBsYWNlLyAvLyBzdWJzdGl0dXRlIHBhdHRlcm4gImZpbmQiIHdpdGggInJlcGxhY2UiCisJLy8gOiE8Y21kPgkvLyBydW4gPGNtZD4gdGhlbiByZXR1cm4KKwkvLworCisJaWYgKCFidWZbMF0pCisJCWdvdG8gcmV0OworCWlmICgqYnVmID09ICc6JykKKwkJYnVmKys7CQkJLy8gbW92ZSBwYXN0IHRoZSAnOicKKworCWxpID0gY2ggPSBpID0gMDsKKwliID0gZSA9IC0xOworCXEgPSB0ZXh0OwkJCS8vIGFzc3VtZSAxLCQgZm9yIHRoZSByYW5nZQorCXIgPSBlbmQgLSAxOworCWxpID0gY291bnRfbGluZXModGV4dCwgZW5kIC0gMSk7CisJZm4gPSBjdXJyZW50X2ZpbGVuYW1lOworCisJLy8gbG9vayBmb3Igb3B0aW9uYWwgYWRkcmVzcyhlcykgIDouICA6MSAgOjEsOSAgIDoncSwnYSAgIDolCisJYnVmID0gZ2V0X2FkZHJlc3MoYnVmLCAmYiwgJmUpOworCisJLy8gcmVtZW1iZXIgb3JpZyBjb21tYW5kIGxpbmUKKwlvcmlnX2J1ZiA9IGJ1ZjsKKworCS8vIGdldCB0aGUgQ09NTUFORCBpbnRvIGNtZFtdCisJYnVmMSA9IGNtZDsKKwl3aGlsZSAoKmJ1ZiAhPSAnXDAnKSB7CisJCWlmIChpc3NwYWNlKCpidWYpKQorCQkJYnJlYWs7CisJCSpidWYxKysgPSAqYnVmKys7CisJfQorCSpidWYxID0gJ1wwJzsKKwkvLyBnZXQgYW55IEFSR3VtZW50cworCXdoaWxlIChpc2JsYW5rKCpidWYpKQorCQlidWYrKzsKKwlzdHJjcHkoYXJncywgYnVmKTsKKwl1c2Vmb3JjZSA9IEZBTFNFOworCWJ1ZjEgPSBsYXN0X2NoYXJfaXMoY21kLCAnIScpOworCWlmIChidWYxKSB7CisJCXVzZWZvcmNlID0gVFJVRTsKKwkJKmJ1ZjEgPSAnXDAnOyAgIC8vIGdldCByaWQgb2YgIQorCX0KKwlpZiAoYiA+PSAwKSB7CisJCS8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIGFkZHIsIHRoZW4gdGhlIGFkZHIKKwkJLy8gaXMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzaW5nbGUgbGluZSB0aGUKKwkJLy8gdXNlciB3YW50cy4gU28sIHJlc2V0IHRoZSBlbmQKKwkJLy8gcG9pbnRlciB0byBwb2ludCBhdCBlbmQgb2YgdGhlICJiIiBsaW5lCisJCXEgPSBmaW5kX2xpbmUoYik7CS8vIHdoYXQgbGluZSBpcyAjYgorCQlyID0gZW5kX2xpbmUocSk7CisJCWxpID0gMTsKKwl9CisJaWYgKGUgPj0gMCkgeworCQkvLyB3ZSB3ZXJlIGdpdmVuIHR3byBhZGRycy4gIGNoYW5nZSB0aGUKKwkJLy8gZW5kIHBvaW50ZXIgdG8gdGhlIGFkZHIgZ2l2ZW4gYnkgdXNlci4KKwkJciA9IGZpbmRfbGluZShlKTsJLy8gd2hhdCBsaW5lIGlzICNlCisJCXIgPSBlbmRfbGluZShyKTsKKwkJbGkgPSBlIC0gYiArIDE7CisJfQorCS8vIC0tLS0tLS0tLS0tLSBub3cgbG9vayBmb3IgdGhlIGNvbW1hbmQgLS0tLS0tLS0tLS0tCisJaSA9IHN0cmxlbihjbWQpOworCWlmIChpID09IDApIHsJCS8vIDoxMjNDUiBnb3RvIGxpbmUgIzEyMworCQlpZiAoYiA+PSAwKSB7CisJCQlkb3QgPSBmaW5kX2xpbmUoYik7CS8vIHdoYXQgbGluZSBpcyAjYgorCQkJZG90X3NraXBfb3Zlcl93cygpOworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0FMTE9XX0VYRUMKKwllbHNlIGlmIChjbWRbMF0gPT0gJyEnKSB7CS8vIHJ1biBhIGNtZAorCQlpbnQgcmV0Y29kZTsKKwkJLy8gOiFscyAgIHJ1biB0aGUgPGNtZD4KKwkJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwkJY29va21vZGUoKTsKKwkJcmV0Y29kZSA9IHN5c3RlbShvcmlnX2J1ZiArIDEpOwkvLyBydW4gdGhlIGNtZAorCQlpZiAocmV0Y29kZSkKKwkJCXByaW50ZigiXG5zaGVsbCByZXR1cm5lZCAlaVxuXG4iLCByZXRjb2RlKTsKKwkJcmF3bW9kZSgpOworCQlIaXRfUmV0dXJuKCk7CQkJLy8gbGV0IHVzZXIgc2VlIHJlc3VsdHMKKwl9CisjZW5kaWYKKwllbHNlIGlmIChjbWRbMF0gPT0gJz0nICYmICFjbWRbMV0pIHsJLy8gd2hlcmUgaXMgdGhlIGFkZHJlc3MKKwkJaWYgKGIgPCAwKSB7CS8vIG5vIGFkZHIgZ2l2ZW4tIHVzZSBkZWZhdWx0cworCQkJYiA9IGUgPSBjb3VudF9saW5lcyh0ZXh0LCBkb3QpOworCQl9CisJCXN0YXR1c19saW5lKCIlZCIsIGIpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJkZWxldGUiLCBpKSA9PSAwKSB7CS8vIGRlbGV0ZSBsaW5lcworCQlpZiAoYiA8IDApIHsJLy8gbm8gYWRkciBnaXZlbi0gdXNlIGRlZmF1bHRzCisJCQlxID0gYmVnaW5fbGluZShkb3QpOwkvLyBhc3N1bWUgLiwuIGZvciB0aGUgcmFuZ2UKKwkJCXIgPSBlbmRfbGluZShkb3QpOworCQl9CisJCWRvdCA9IHlhbmtfZGVsZXRlKHEsIHIsIDEsIFlBTktERUwpOwkvLyBzYXZlLCB0aGVuIGRlbGV0ZSBsaW5lcworCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgImVkaXQiLCBpKSA9PSAwKSB7CS8vIEVkaXQgYSBmaWxlCisJCS8vIGRvbid0IGVkaXQsIGlmIHRoZSBjdXJyZW50IGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQKKwkJaWYgKGZpbGVfbW9kaWZpZWQgJiYgIXVzZWZvcmNlKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoOmVkaXQhIG92ZXJyaWRlcykiKTsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChhcmdzWzBdKSB7CisJCQkvLyB0aGUgdXNlciBzdXBwbGllZCBhIGZpbGUgbmFtZQorCQkJZm4gPSBhcmdzOworCQl9IGVsc2UgaWYgKGN1cnJlbnRfZmlsZW5hbWUgJiYgY3VycmVudF9maWxlbmFtZVswXSkgeworCQkJLy8gbm8gdXNlciBzdXBwbGllZCBuYW1lLSB1c2UgdGhlIGN1cnJlbnQgZmlsZW5hbWUKKwkJCS8vIGZuID0gY3VycmVudF9maWxlbmFtZTsgIHdhcyBzZXQgYnkgZGVmYXVsdAorCQl9IGVsc2UgeworCQkJLy8gbm8gdXNlciBmaWxlIG5hbWUsIG5vIGN1cnJlbnQgbmFtZS0gcHVudAorCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gY3VycmVudCBmaWxlbmFtZSIpOworCQkJZ290byByZXQ7CisJCX0KKworCQlpZiAoaW5pdF90ZXh0X2J1ZmZlcihmbikgPCAwKQorCQkJZ290byByZXQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCQlpZiAoVXJlZyA+PSAwICYmIFVyZWcgPCAyOCAmJiByZWdbVXJlZ10gIT0gMCkgeworCQkJZnJlZShyZWdbVXJlZ10pOwkvLyAgIGZyZWUgb3JpZyBsaW5lIHJlZy0gZm9yICdVJworCQkJcmVnW1VyZWddPSAwOworCQl9CisJCWlmIChZRHJlZyA+PSAwICYmIFlEcmVnIDwgMjggJiYgcmVnW1lEcmVnXSAhPSAwKSB7CisJCQlmcmVlKHJlZ1tZRHJlZ10pOwkvLyAgIGZyZWUgZGVmYXVsdCB5YW5rL2RlbGV0ZSByZWdpc3RlcgorCQkJcmVnW1lEcmVnXT0gMDsKKwkJfQorI2VuZGlmCisJCS8vIGhvdyBtYW55IGxpbmVzIGluIHRleHRbXT8KKwkJbGkgPSBjb3VudF9saW5lcyh0ZXh0LCBlbmQgLSAxKTsKKwkJc3RhdHVzX2xpbmUoIlwiJXNcIiVzIgorCQkJSUZfRkVBVFVSRV9WSV9SRUFET05MWSgiJXMiKQorCQkJIiAlZEwsICVkQyIsIGN1cnJlbnRfZmlsZW5hbWUsCisJCQkoZmlsZV9zaXplKGZuKSA8IDAgPyAiIFtOZXcgZmlsZV0iIDogIiIpLAorCQkJSUZfRkVBVFVSRV9WSV9SRUFET05MWSgKKwkJCQkoKHJlYWRvbmx5X21vZGUpID8gIiBbUmVhZG9ubHldIiA6ICIiKSwKKwkJCSkKKwkJCWxpLCBjaCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgImZpbGUiLCBpKSA9PSAwKSB7CS8vIHdoYXQgRmlsZSBpcyB0aGlzCisJCWlmIChiICE9IC0xIHx8IGUgIT0gLTEpIHsKKwkJCXN0YXR1c19saW5lX2JvbGQoIk5vIGFkZHJlc3MgYWxsb3dlZCBvbiB0aGlzIGNvbW1hbmQiKTsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChhcmdzWzBdKSB7CisJCQkvLyB1c2VyIHdhbnRzIGEgbmV3IGZpbGVuYW1lCisJCQlmcmVlKGN1cnJlbnRfZmlsZW5hbWUpOworCQkJY3VycmVudF9maWxlbmFtZSA9IHhzdHJkdXAoYXJncyk7CisJCX0gZWxzZSB7CisJCQkvLyB1c2VyIHdhbnRzIGZpbGUgc3RhdHVzIGluZm8KKwkJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCQl9CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgImZlYXR1cmVzIiwgaSkgPT0gMCkgewkvLyB3aGF0IGZlYXR1cmVzIGFyZSBhdmFpbGFibGUKKwkJLy8gcHJpbnQgb3V0IHZhbHVlcyBvZiBhbGwgZmVhdHVyZXMKKwkJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwkJY29va21vZGUoKTsKKwkJc2hvd19oZWxwKCk7CisJCXJhd21vZGUoKTsKKwkJSGl0X1JldHVybigpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJsaXN0IiwgaSkgPT0gMCkgewkvLyBsaXRlcmFsIHByaW50IGxpbmUKKwkJaWYgKGIgPCAwKSB7CS8vIG5vIGFkZHIgZ2l2ZW4tIHVzZSBkZWZhdWx0cworCQkJcSA9IGJlZ2luX2xpbmUoZG90KTsJLy8gYXNzdW1lIC4sLiBmb3IgdGhlIHJhbmdlCisJCQlyID0gZW5kX2xpbmUoZG90KTsKKwkJfQorCQlnb19ib3R0b21fYW5kX2NsZWFyX3RvX2VvbCgpOworCQlwdXRzKCJcciIpOworCQlmb3IgKDsgcSA8PSByOyBxKyspIHsKKwkJCWludCBjX2lzX25vX3ByaW50OworCisJCQljID0gKnE7CisJCQljX2lzX25vX3ByaW50ID0gKGMgJiAweDgwKSAmJiAhSXNwcmludChjKTsKKwkJCWlmIChjX2lzX25vX3ByaW50KSB7CisJCQkJYyA9ICcuJzsKKwkJCQlzdGFuZG91dF9zdGFydCgpOworCQkJfQorCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCXdyaXRlMSgiJFxyIik7CisJCQl9IGVsc2UgaWYgKGMgPCAnICcgfHwgYyA9PSAxMjcpIHsKKwkJCQliYl9wdXRjaGFyKCdeJyk7CisJCQkJaWYgKGMgPT0gMTI3KQorCQkJCQljID0gJz8nOworCQkJCWVsc2UKKwkJCQkJYyArPSAnQCc7CisJCQl9CisJCQliYl9wdXRjaGFyKGMpOworCQkJaWYgKGNfaXNfbm9fcHJpbnQpCisJCQkJc3RhbmRvdXRfZW5kKCk7CisJCX0KKwkJSGl0X1JldHVybigpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJxdWl0IiwgaSkgPT0gMCAvLyBxdWl0CisJICAgICAgICB8fCBzdHJuY21wKGNtZCwgIm5leHQiLCBpKSA9PSAwIC8vIGVkaXQgbmV4dCBmaWxlCisJKSB7CisJCWludCBuOworCQlpZiAodXNlZm9yY2UpIHsKKwkJCS8vIGZvcmNlIGVuZCBvZiBhcmd2IGxpc3QKKwkJCWlmICgqY21kID09ICdxJykgeworCQkJCW9wdGluZCA9IHNhdmVfYXJnYzsKKwkJCX0KKwkJCWVkaXRpbmcgPSAwOworCQkJZ290byByZXQ7CisJCX0KKwkJLy8gZG9uJ3QgZXhpdCBpZiB0aGUgZmlsZSBiZWVuIG1vZGlmaWVkCisJCWlmIChmaWxlX21vZGlmaWVkKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoOiVzISBvdmVycmlkZXMpIiwKKwkJCQkgKCpjbWQgPT0gJ3EnID8gInF1aXQiIDogIm5leHQiKSk7CisJCQlnb3RvIHJldDsKKwkJfQorCQkvLyBhcmUgdGhlcmUgb3RoZXIgZmlsZSB0byBlZGl0CisJCW4gPSBzYXZlX2FyZ2MgLSBvcHRpbmQgLSAxOworCQlpZiAoKmNtZCA9PSAncScgJiYgbiA+IDApIHsKKwkJCXN0YXR1c19saW5lX2JvbGQoIiVkIG1vcmUgZmlsZShzKSB0byBlZGl0Iiwgbik7CisJCQlnb3RvIHJldDsKKwkJfQorCQlpZiAoKmNtZCA9PSAnbicgJiYgbiA8PSAwKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJObyBtb3JlIGZpbGVzIHRvIGVkaXQiKTsKKwkJCWdvdG8gcmV0OworCQl9CisJCWVkaXRpbmcgPSAwOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJyZWFkIiwgaSkgPT0gMCkgewkvLyByZWFkIGZpbGUgaW50byB0ZXh0W10KKwkJZm4gPSBhcmdzOworCQlpZiAoIWZuWzBdKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJObyBmaWxlbmFtZSBnaXZlbiIpOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKGIgPCAwKSB7CS8vIG5vIGFkZHIgZ2l2ZW4tIHVzZSBkZWZhdWx0cworCQkJcSA9IGJlZ2luX2xpbmUoZG90KTsJLy8gYXNzdW1lICJkb3QiCisJCX0KKwkJLy8gcmVhZCBhZnRlciBjdXJyZW50IGxpbmUtIHVubGVzcyB1c2VyIHNhaWQgIjowciBmb28iCisJCWlmIChiICE9IDApCisJCQlxID0gbmV4dF9saW5lKHEpOworCQl7IC8vIGRhbmNlIGFyb3VuZCBwb3RlbnRpYWxseS1yZWFsbG9jYXRlZCB0ZXh0W10KKwkJCXVpbnRwdHJfdCBvZnMgPSBxIC0gdGV4dDsKKwkJCWNoID0gZmlsZV9pbnNlcnQoZm4sIHEsIDApOworCQkJcSA9IHRleHQgKyBvZnM7CisJCX0KKwkJaWYgKGNoIDwgMCkKKwkJCWdvdG8gcmV0OwkvLyBub3RoaW5nIHdhcyBpbnNlcnRlZAorCQkvLyBob3cgbWFueSBsaW5lcyBpbiB0ZXh0W10/CisJCWxpID0gY291bnRfbGluZXMocSwgcSArIGNoIC0gMSk7CisJCXN0YXR1c19saW5lKCJcIiVzXCIiCisJCQlJRl9GRUFUVVJFX1ZJX1JFQURPTkxZKCIlcyIpCisJCQkiICVkTCwgJWRDIiwgZm4sCisJCQlJRl9GRUFUVVJFX1ZJX1JFQURPTkxZKChyZWFkb25seV9tb2RlID8gIiBbUmVhZG9ubHldIiA6ICIiKSwpCisJCQlsaSwgY2gpOworCQlpZiAoY2ggPiAwKSB7CisJCQkvLyBpZiB0aGUgaW5zZXJ0IGlzIGJlZm9yZSAiZG90IiB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlCisJCQlpZiAocSA8PSBkb3QpCisJCQkJZG90ICs9IGNoOworCQkJLypmaWxlX21vZGlmaWVkKys7IC0gZG9uZSBieSBmaWxlX2luc2VydCAqLworCQl9CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgInJld2luZCIsIGkpID09IDApIHsJLy8gcmV3aW5kIGNtZCBsaW5lIGFyZ3MKKwkJaWYgKGZpbGVfbW9kaWZpZWQgJiYgIXVzZWZvcmNlKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoOnJld2luZCEgb3ZlcnJpZGVzKSIpOworCQl9IGVsc2UgeworCQkJLy8gcmVzZXQgdGhlIGZpbGVuYW1lcyB0byBlZGl0CisJCQlvcHRpbmQgPSBmbl9zdGFydCAtIDE7CisJCQllZGl0aW5nID0gMDsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVAorCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJzZXQiLCBpKSA9PSAwKSB7CS8vIHNldCBvciBjbGVhciBmZWF0dXJlcworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKKwkJY2hhciAqYXJncDsKKyNlbmRpZgorCQlpID0gMDsJCQkvLyBvZmZzZXQgaW50byBhcmdzCisJCS8vIG9ubHkgYmxhbmsgaXMgcmVnYXJkZWQgYXMgYXJncyBkZWxtaXRlci4gV2hhdCBhYm91dCB0YWIgJ1x0JyA/CisJCWlmICghYXJnc1swXSB8fCBzdHJjYXNlY21wKGFyZ3MsICJhbGwiKSA9PSAwKSB7CisJCQkvLyBwcmludCBvdXQgdmFsdWVzIG9mIGFsbCBvcHRpb25zCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworCQkJc3RhdHVzX2xpbmVfYm9sZCgKKwkJCQkiJXNhdXRvaW5kZW50ICIKKwkJCQkiJXNmbGFzaCAiCisJCQkJIiVzaWdub3JlY2FzZSAiCisJCQkJIiVzc2hvd21hdGNoICIKKwkJCQkidGFic3RvcD0ldSIsCisJCQkJYXV0b2luZGVudCA/ICIiIDogIm5vIiwKKwkJCQllcnJfbWV0aG9kID8gIiIgOiAibm8iLAorCQkJCWlnbm9yZWNhc2UgPyAiIiA6ICJubyIsCisJCQkJc2hvd21hdGNoID8gIiIgOiAibm8iLAorCQkJCXRhYnN0b3AKKwkJCSk7CisjZW5kaWYKKwkJCWdvdG8gcmV0OworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworCQlhcmdwID0gYXJnczsKKwkJd2hpbGUgKCphcmdwKSB7CisJCQlpZiAoc3RybmNtcChhcmdwLCAibm8iLCAyKSA9PSAwKQorCQkJCWkgPSAyOwkJLy8gIjpzZXQgbm9hdXRvaW5kZW50IgorCQkJc2V0b3BzKGFyZ3AsICJhdXRvaW5kZW50ICIsIGksICJhaSIsIFZJX0FVVE9JTkRFTlQpOworCQkJc2V0b3BzKGFyZ3AsICJmbGFzaCAiICAgICAsIGksICJmbCIsIFZJX0VSUl9NRVRIT0QpOworCQkJc2V0b3BzKGFyZ3AsICJpZ25vcmVjYXNlICIsIGksICJpYyIsIFZJX0lHTk9SRUNBU0UpOworCQkJc2V0b3BzKGFyZ3AsICJzaG93bWF0Y2ggIiAsIGksICJzbSIsIFZJX1NIT1dNQVRDSCApOworCQkJaWYgKHN0cm5jbXAoYXJncCArIGksICJ0YWJzdG9wPSIsIDgpID09IDApIHsKKwkJCQlpbnQgdCA9IDA7CisJCQkJc3NjYW5mKGFyZ3AgKyBpKzgsICIldSIsICZ0KTsKKwkJCQlpZiAodCA+IDAgJiYgdCA8PSBNQVhfVEFCU1RPUCkKKwkJCQkJdGFic3RvcCA9IHQ7CisJCQl9CisJCQlhcmdwID0gc2tpcF9ub25fd2hpdGVzcGFjZShhcmdwKTsKKwkJCWFyZ3AgPSBza2lwX3doaXRlc3BhY2UoYXJncCk7CisJCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1NFVE9QVFMgKi8KKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1NFVCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFQVJDSAorCX0gZWxzZSBpZiAoY21kWzBdID09ICdzJykgewkvLyBzdWJzdGl0dXRlIGEgcGF0dGVybiB3aXRoIGEgcmVwbGFjZW1lbnQgcGF0dGVybgorCQljaGFyICpscywgKkYsICpSOworCQlpbnQgZ2ZsYWc7CisKKwkJLy8gRiBwb2ludHMgdG8gdGhlICJmaW5kIiBwYXR0ZXJuCisJCS8vIFIgcG9pbnRzIHRvIHRoZSAicmVwbGFjZSIgcGF0dGVybgorCQkvLyByZXBsYWNlIHRoZSBjbWQgbGluZSBkZWxpbWl0ZXJzICIvIiB3aXRoIE5VTExzCisJCWdmbGFnID0gMDsJCS8vIGdsb2JhbCByZXBsYWNlIGZsYWcKKwkJYyA9IG9yaWdfYnVmWzFdOwkvLyB3aGF0IGlzIHRoZSBkZWxpbWl0ZXIKKwkJRiA9IG9yaWdfYnVmICsgMjsJLy8gc3RhcnQgb2YgImZpbmQiCisJCVIgPSBzdHJjaHIoRiwgYyk7CS8vIG1pZGRsZSBkZWxpbWl0ZXIKKwkJaWYgKCFSKQorCQkJZ290byBjb2xvbl9zX2ZhaWw7CisJCSpSKysgPSAnXDAnOwkvLyB0ZXJtaW5hdGUgImZpbmQiCisJCWJ1ZjEgPSBzdHJjaHIoUiwgYyk7CisJCWlmICghYnVmMSkKKwkJCWdvdG8gY29sb25fc19mYWlsOworCQkqYnVmMSsrID0gJ1wwJzsJLy8gdGVybWluYXRlICJyZXBsYWNlIgorCQlpZiAoKmJ1ZjEgPT0gJ2cnKSB7CS8vIDpzL2Zvby9iYXIvZworCQkJYnVmMSsrOworCQkJZ2ZsYWcrKzsJLy8gdHVybiBvbiBnZmxhZworCQl9CisJCXEgPSBiZWdpbl9saW5lKHEpOworCQlpZiAoYiA8IDApIHsJLy8gbWF5YmUgOnMvZm9vL2Jhci8KKwkJCXEgPSBiZWdpbl9saW5lKGRvdCk7CS8vIHN0YXJ0IHdpdGggY3VyIGxpbmUKKwkJCWIgPSBjb3VudF9saW5lcyh0ZXh0LCBxKTsJLy8gY3VyIGxpbmUgbnVtYmVyCisJCX0KKwkJaWYgKGUgPCAwKQorCQkJZSA9IGI7CQkvLyBtYXliZSA6LnMvZm9vL2Jhci8KKwkJZm9yIChpID0gYjsgaSA8PSBlOyBpKyspIHsJLy8gc28sIDoyMCwyMyBzIFwwIGZpbmQgXDAgcmVwbGFjZSBcMAorCQkJbHMgPSBxOwkJLy8gb3JpZyBsaW5lIHN0YXJ0CisgdmM0OgorCQkJYnVmMSA9IGNoYXJfc2VhcmNoKHEsIEYsIEZPUldBUkQsIExJTUlURUQpOwkvLyBzZWFyY2ggY3VyIGxpbmUgb25seSBmb3IgImZpbmQiCisJCQlpZiAoYnVmMSkgeworCQkJCXVpbnRwdHJfdCBiaWFzOworCQkJCS8vIHdlIGZvdW5kIHRoZSAiZmluZCIgcGF0dGVybiAtIGRlbGV0ZSBpdAorCQkJCXRleHRfaG9sZV9kZWxldGUoYnVmMSwgYnVmMSArIHN0cmxlbihGKSAtIDEpOworCQkJCS8vIGluc2V0IHRoZSAicmVwbGFjZSIgcGF0ZXJuCisJCQkJYmlhcyA9IHN0cmluZ19pbnNlcnQoYnVmMSwgUik7CS8vIGluc2VydCB0aGUgc3RyaW5nCisJCQkJYnVmMSArPSBiaWFzOworCQkJCWxzICs9IGJpYXM7CisJCQkJLypxICs9IGJpYXM7IC0gcmVjYWxjdWxhdGVkIGFueXdheSAqLworCQkJCS8vIGNoZWNrIGZvciAiZ2xvYmFsIiAgOnMvZm9vL2Jhci9nCisJCQkJaWYgKGdmbGFnID09IDEpIHsKKwkJCQkJaWYgKChidWYxICsgc3RybGVuKFIpKSA8IGVuZF9saW5lKGxzKSkgeworCQkJCQkJcSA9IGJ1ZjEgKyBzdHJsZW4oUik7CisJCQkJCQlnb3RvIHZjNDsJLy8gZG9uJ3QgbGV0IHEgbW92ZSBwYXN0IGN1ciBsaW5lCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlxID0gbmV4dF9saW5lKGxzKTsKKwkJfQorI2VuZGlmIC8qIEZFQVRVUkVfVklfU0VBUkNIICovCisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgInZlcnNpb24iLCBpKSA9PSAwKSB7ICAvLyBzaG93IHNvZnR3YXJlIHZlcnNpb24KKwkJc3RhdHVzX2xpbmUoQkJfVkVSICIgIiBCQl9CVCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgIndyaXRlIiwgaSkgPT0gMCAgLy8gd3JpdGUgdGV4dCB0byBmaWxlCisJICAgICAgICB8fCBzdHJuY21wKGNtZCwgIndxIiwgaSkgPT0gMAorCSAgICAgICAgfHwgc3RybmNtcChjbWQsICJ3biIsIGkpID09IDAKKwkgICAgICAgIHx8IChjbWRbMF0gPT0gJ3gnICYmICFjbWRbMV0pCisJKSB7CisJCS8vIGlzIHRoZXJlIGEgZmlsZSBuYW1lIHRvIHdyaXRlIHRvPworCQlpZiAoYXJnc1swXSkgeworCQkJZm4gPSBhcmdzOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfUkVBRE9OTFkKKwkJaWYgKHJlYWRvbmx5X21vZGUgJiYgIXVzZWZvcmNlKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJcIiVzXCIgRmlsZSBpcyByZWFkIG9ubHkiLCBmbik7CisJCQlnb3RvIHJldDsKKwkJfQorI2VuZGlmCisJCS8vIGhvdyBtYW55IGxpbmVzIGluIHRleHRbXT8KKwkJbGkgPSBjb3VudF9saW5lcyhxLCByKTsKKwkJY2ggPSByIC0gcSArIDE7CisJCS8vIHNlZSBpZiBmaWxlIGV4aXN0cy0gaWYgbm90LCBpdHMganVzdCBhIG5ldyBmaWxlIHJlcXVlc3QKKwkJaWYgKHVzZWZvcmNlKSB7CisJCQkvLyBpZiAiZm4iIGlzIG5vdCB3cml0ZS1hYmxlLCBjaG1vZCB1K3cKKwkJCS8vIHNwcmludGYoc3lzY21kLCAiY2htb2QgdSt3ICVzIiwgZm4pOworCQkJLy8gc3lzdGVtKHN5c2NtZCk7CisJCQlmb3JjZWQgPSBUUlVFOworCQl9CisJCWwgPSBmaWxlX3dyaXRlKGZuLCBxLCByKTsKKwkJaWYgKHVzZWZvcmNlICYmIGZvcmNlZCkgeworCQkJLy8gY2htb2QgdS13CisJCQkvLyBzcHJpbnRmKHN5c2NtZCwgImNobW9kIHUtdyAlcyIsIGZuKTsKKwkJCS8vIHN5c3RlbShzeXNjbWQpOworCQkJZm9yY2VkID0gRkFMU0U7CisJCX0KKwkJaWYgKGwgPCAwKSB7CisJCQlpZiAobCA9PSAtMSkKKwkJCQlzdGF0dXNfbGluZV9ib2xkKCJcIiVzXCIgJXMiLCBmbiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1c19saW5lKCJcIiVzXCIgJWRMLCAlZEMiLCBmbiwgbGksIGwpOworCQkJaWYgKHEgPT0gdGV4dCAmJiByID09IGVuZCAtIDEgJiYgbCA9PSBjaCkgeworCQkJCWZpbGVfbW9kaWZpZWQgPSAwOworCQkJCWxhc3RfZmlsZV9tb2RpZmllZCA9IC0xOworCQkJfQorCQkJaWYgKChjbWRbMF0gPT0gJ3gnIHx8IGNtZFsxXSA9PSAncScgfHwgY21kWzFdID09ICduJworCQkJICAgIHx8IGNtZFswXSA9PSAnWCcgfHwgY21kWzFdID09ICdRJyB8fCBjbWRbMV0gPT0gJ04nCisJCQkgICAgKQorCQkJICYmIGwgPT0gY2gKKwkJCSkgeworCQkJCWVkaXRpbmcgPSAwOworCQkJfQorCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAieWFuayIsIGkpID09IDApIHsJLy8geWFuayBsaW5lcworCQlpZiAoYiA8IDApIHsJLy8gbm8gYWRkciBnaXZlbi0gdXNlIGRlZmF1bHRzCisJCQlxID0gYmVnaW5fbGluZShkb3QpOwkvLyBhc3N1bWUgLiwuIGZvciB0aGUgcmFuZ2UKKwkJCXIgPSBlbmRfbGluZShkb3QpOworCQl9CisJCXRleHRfeWFuayhxLCByLCBZRHJlZyk7CisJCWxpID0gY291bnRfbGluZXMocSwgcik7CisJCXN0YXR1c19saW5lKCJZYW5rICVkIGxpbmVzICglZCBjaGFycykgaW50byBbJWNdIiwKKwkJCQlsaSwgc3RybGVuKHJlZ1tZRHJlZ10pLCB3aGF0X3JlZygpKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCS8vIGNtZCB1bmtub3duCisJCW5vdF9pbXBsZW1lbnRlZChjbWQpOworCX0KKyByZXQ6CisJZG90ID0gYm91bmRfZG90KGRvdCk7CS8vIG1ha2Ugc3VyZSAiZG90IiBpcyB2YWxpZAorCXJldHVybjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gKKyBjb2xvbl9zX2ZhaWw6CisJc3RhdHVzX2xpbmUoIjpzIGV4cHJlc3Npb24gbWlzc2luZyBkZWxpbWl0ZXJzIik7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfVklfQ09MT04gKi8KKworc3RhdGljIHZvaWQgSGl0X1JldHVybih2b2lkKQoreworCWludCBjOworCisJc3RhbmRvdXRfc3RhcnQoKTsKKwl3cml0ZTEoIltIaXQgcmV0dXJuIHRvIGNvbnRpbnVlXSIpOworCXN0YW5kb3V0X2VuZCgpOworCXdoaWxlICgoYyA9IGdldF9vbmVfY2hhcigpKSAhPSAnXG4nICYmIGMgIT0gJ1xyJykKKwkJY29udGludWU7CisJcmVkcmF3KFRSVUUpOwkJLy8gZm9yY2UgcmVkcmF3IGFsbAorfQorCitzdGF0aWMgaW50IG5leHRfdGFic3RvcChpbnQgY29sKQoreworCXJldHVybiBjb2wgKyAoKHRhYnN0b3AgLSAxKSAtIChjb2wgJSB0YWJzdG9wKSk7Cit9CisKKy8vLS0tLS0gU3luY2hyb25pemUgdGhlIGN1cnNvciB0byBEb3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBOT0lOTElORSB2b2lkIHN5bmNfY3Vyc29yKGNoYXIgKmQsIGludCAqcm93LCBpbnQgKmNvbCkKK3sKKwljaGFyICpiZWdfY3VyOwkvLyBiZWdpbiBhbmQgZW5kIG9mICJkIiBsaW5lCisJY2hhciAqdHA7CisJaW50IGNudCwgcm8sIGNvOworCisJYmVnX2N1ciA9IGJlZ2luX2xpbmUoZCk7CS8vIGZpcnN0IGNoYXIgb2YgY3VyIGxpbmUKKworCWlmIChiZWdfY3VyIDwgc2NyZWVuYmVnaW4pIHsKKwkJLy8gImQiIGlzIGJlZm9yZSB0b3AgbGluZSBvbiBzY3JlZW4KKwkJLy8gaG93IG1hbnkgbGluZXMgZG8gd2UgaGF2ZSB0byBtb3ZlCisJCWNudCA9IGNvdW50X2xpbmVzKGJlZ19jdXIsIHNjcmVlbmJlZ2luKTsKKyBzYzE6CisJCXNjcmVlbmJlZ2luID0gYmVnX2N1cjsKKwkJaWYgKGNudCA+IChyb3dzIC0gMSkgLyAyKSB7CisJCQkvLyB3ZSBtb3ZlZCB0b28gbWFueSBsaW5lcy4gcHV0ICJkb3QiIGluIG1pZGRsZSBvZiBzY3JlZW4KKwkJCWZvciAoY250ID0gMDsgY250IDwgKHJvd3MgLSAxKSAvIDI7IGNudCsrKSB7CisJCQkJc2NyZWVuYmVnaW4gPSBwcmV2X2xpbmUoc2NyZWVuYmVnaW4pOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJY2hhciAqZW5kX3NjcjsJLy8gYmVnaW4gYW5kIGVuZCBvZiBzY3JlZW4KKwkJZW5kX3NjciA9IGVuZF9zY3JlZW4oKTsJLy8gbGFzdCBjaGFyIG9mIHNjcmVlbgorCQlpZiAoYmVnX2N1ciA+IGVuZF9zY3IpIHsKKwkJCS8vICJkIiBpcyBhZnRlciBib3R0b20gbGluZSBvbiBzY3JlZW4KKwkJCS8vIGhvdyBtYW55IGxpbmVzIGRvIHdlIGhhdmUgdG8gbW92ZQorCQkJY250ID0gY291bnRfbGluZXMoZW5kX3NjciwgYmVnX2N1cik7CisJCQlpZiAoY250ID4gKHJvd3MgLSAxKSAvIDIpCisJCQkJZ290byBzYzE7CS8vIHRvbyBtYW55IGxpbmVzCisJCQlmb3IgKHJvID0gMDsgcm8gPCBjbnQgLSAxOyBybysrKSB7CisJCQkJLy8gbW92ZSBzY3JlZW4gYmVnaW4gdGhlIHNhbWUgYW1vdW50CisJCQkJc2NyZWVuYmVnaW4gPSBuZXh0X2xpbmUoc2NyZWVuYmVnaW4pOworCQkJCS8vIG5vdywgbW92ZSB0aGUgZW5kIG9mIHNjcmVlbgorCQkJCWVuZF9zY3IgPSBuZXh0X2xpbmUoZW5kX3Njcik7CisJCQkJZW5kX3NjciA9IGVuZF9saW5lKGVuZF9zY3IpOworCQkJfQorCQl9CisJfQorCS8vICJkIiBpcyBvbiBzY3JlZW4tIGZpbmQgb3V0IHdoaWNoIHJvdworCXRwID0gc2NyZWVuYmVnaW47CisJZm9yIChybyA9IDA7IHJvIDwgcm93cyAtIDE7IHJvKyspIHsJLy8gZHJpdmUgInJvIiB0byBjb3JyZWN0IHJvdworCQlpZiAodHAgPT0gYmVnX2N1cikKKwkJCWJyZWFrOworCQl0cCA9IG5leHRfbGluZSh0cCk7CisJfQorCisJLy8gZmluZCBvdXQgd2hhdCBjb2wgImQiIGlzIG9uCisJY28gPSAwOworCXdoaWxlICh0cCA8IGQpIHsgLy8gZHJpdmUgImNvIiB0byBjb3JyZWN0IGNvbHVtbgorCQlpZiAoKnRwID09ICdcbicpIC8vdmRhIHx8ICp0cCA9PSAnXDAnKQorCQkJYnJlYWs7CisJCWlmICgqdHAgPT0gJ1x0JykgeworCQkJLy8gaGFuZGxlIHRhYnMgbGlrZSByZWFsIHZpCisJCQlpZiAoZCA9PSB0cCAmJiBjbWRfbW9kZSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJY28gPSBuZXh0X3RhYnN0b3AoY28pOworCQl9IGVsc2UgaWYgKCh1bnNpZ25lZCBjaGFyKSp0cCA8ICcgJyB8fCAqdHAgPT0gMHg3ZikgeworCQkJY28rKzsgLy8gZGlzcGxheSBhcyBeWCwgdXNlIDIgY29sdW1ucworCQl9CisJCWNvKys7CisJCXRwKys7CisJfQorCisJLy8gImNvIiBpcyB0aGUgY29sdW1uIHdoZXJlICJkb3QiIGlzLgorCS8vIFRoZSBzY3JlZW4gaGFzICJjb2x1bW5zIiBjb2x1bW5zLgorCS8vIFRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNvbHVtbnMgYXJlICAwK29mZnNldCAtLSBjb2x1bW5zK29mc2V0CisJLy8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisJLy8gICAgICAgICAgICAgICBeIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKwkvLyAgICAgICAgb2Zmc2V0IHwgfC0tLS0tLS0gY29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tfAorCS8vCisJLy8gSWYgImNvIiBpcyBhbHJlYWR5IGluIHRoaXMgcmFuZ2UgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byBhZGp1c3Qgb2Zmc2V0CisJLy8gICAgICBidXQsIHdlIGRvIGhhdmUgdG8gc3VidHJhY3QgdGhlICJvZmZzZXQiIGJpYXMgZnJvbSAiY28iLgorCS8vIElmICJjbyIgaXMgb3V0c2lkZSB0aGlzIHJhbmdlIHRoZW4gd2UgaGF2ZSB0byBjaGFuZ2UgIm9mZnNldCIuCisJLy8gSWYgdGhlIGZpcnN0IGNoYXIgb2YgYSBsaW5lIGlzIGEgdGFiIHRoZSBjdXJzb3Igd2lsbCB0cnkgdG8gc3RheQorCS8vICBpbiBjb2x1bW4gNywgYnV0IHdlIGhhdmUgdG8gc2V0IG9mZnNldCB0byAwLgorCisJaWYgKGNvIDwgMCArIG9mZnNldCkgeworCQlvZmZzZXQgPSBjbzsKKwl9CisJaWYgKGNvID49IGNvbHVtbnMgKyBvZmZzZXQpIHsKKwkJb2Zmc2V0ID0gY28gLSBjb2x1bW5zICsgMTsKKwl9CisJLy8gaWYgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGxpbmUgaXMgYSB0YWIsIGFuZCAiZG90IiBpcyBzaXR0aW5nIG9uIGl0CisJLy8gIGZvcmNlIG9mZnNldCB0byAwLgorCWlmIChkID09IGJlZ19jdXIgJiYgKmQgPT0gJ1x0JykgeworCQlvZmZzZXQgPSAwOworCX0KKwljbyAtPSBvZmZzZXQ7CisKKwkqcm93ID0gcm87CisJKmNvbCA9IGNvOworfQorCisvLy0tLS0tIFRleHQgTW92ZW1lbnQgUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgY2hhciAqYmVnaW5fbGluZShjaGFyICpwKSAvLyByZXR1cm4gcG9pbnRlciB0byBmaXJzdCBjaGFyIGN1ciBsaW5lCit7CisJaWYgKHAgPiB0ZXh0KSB7CisJCXAgPSBtZW1yY2hyKHRleHQsICdcbicsIHAgLSB0ZXh0KTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIHRleHQ7CisJCXJldHVybiBwICsgMTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICplbmRfbGluZShjaGFyICpwKSAvLyByZXR1cm4gcG9pbnRlciB0byBOTCBvZiBjdXIgbGluZQoreworCWlmIChwIDwgZW5kIC0gMSkgeworCQlwID0gbWVtY2hyKHAsICdcbicsIGVuZCAtIHAgLSAxKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIGVuZCAtIDE7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqZG9sbGFyX2xpbmUoY2hhciAqcCkgLy8gcmV0dXJuIHBvaW50ZXIgdG8ganVzdCBiZWZvcmUgTkwgbGluZQoreworCXAgPSBlbmRfbGluZShwKTsKKwkvLyBUcnkgdG8gc3RheSBvZmYgb2YgdGhlIE5ld2xpbmUKKwlpZiAoKnAgPT0gJ1xuJyAmJiAocCAtIGJlZ2luX2xpbmUocCkpID4gMCkKKwkJcC0tOworCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqcHJldl9saW5lKGNoYXIgKnApIC8vIHJldHVybiBwb2ludGVyIGZpcnN0IGNoYXIgcHJldiBsaW5lCit7CisJcCA9IGJlZ2luX2xpbmUocCk7CS8vIGdvdG8gYmVnaW5pbmcgb2YgY3VyIGxpbmUKKwlpZiAocCA+IHRleHQgJiYgcFstMV0gPT0gJ1xuJykKKwkJcC0tOwkJCS8vIHN0ZXAgdG8gcHJldiBsaW5lCisJcCA9IGJlZ2luX2xpbmUocCk7CS8vIGdvdG8gYmVnaW5pbmcgb2YgcHJldiBsaW5lCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICpuZXh0X2xpbmUoY2hhciAqcCkgLy8gcmV0dXJuIHBvaW50ZXIgZmlyc3QgY2hhciBuZXh0IGxpbmUKK3sKKwlwID0gZW5kX2xpbmUocCk7CisJaWYgKHAgPCBlbmQgLSAxICYmICpwID09ICdcbicpCisJCXArKzsJCQkvLyBzdGVwIHRvIG5leHQgbGluZQorCXJldHVybiBwOworfQorCisvLy0tLS0tIFRleHQgSW5mb3JtYXRpb24gUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgY2hhciAqZW5kX3NjcmVlbih2b2lkKQoreworCWNoYXIgKnE7CisJaW50IGNudDsKKworCS8vIGZpbmQgbmV3IGJvdHRvbSBsaW5lCisJcSA9IHNjcmVlbmJlZ2luOworCWZvciAoY250ID0gMDsgY250IDwgcm93cyAtIDI7IGNudCsrKQorCQlxID0gbmV4dF9saW5lKHEpOworCXEgPSBlbmRfbGluZShxKTsKKwlyZXR1cm4gcTsKK30KKworLy8gY291bnQgbGluZSBmcm9tIHN0YXJ0IHRvIHN0b3AKK3N0YXRpYyBpbnQgY291bnRfbGluZXMoY2hhciAqc3RhcnQsIGNoYXIgKnN0b3ApCit7CisJY2hhciAqcTsKKwlpbnQgY250OworCisJaWYgKHN0b3AgPCBzdGFydCkgeyAvLyBzdGFydCBhbmQgc3RvcCBhcmUgYmFja3dhcmRzLSByZXZlcnNlIHRoZW0KKwkJcSA9IHN0YXJ0OworCQlzdGFydCA9IHN0b3A7CisJCXN0b3AgPSBxOworCX0KKwljbnQgPSAwOworCXN0b3AgPSBlbmRfbGluZShzdG9wKTsKKwl3aGlsZSAoc3RhcnQgPD0gc3RvcCAmJiBzdGFydCA8PSBlbmQgLSAxKSB7CisJCXN0YXJ0ID0gZW5kX2xpbmUoc3RhcnQpOworCQlpZiAoKnN0YXJ0ID09ICdcbicpCisJCQljbnQrKzsKKwkJc3RhcnQrKzsKKwl9CisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGNoYXIgKmZpbmRfbGluZShpbnQgbGkpCS8vIGZpbmQgYmVnaW5pbmcgb2YgbGluZSAjbGkKK3sKKwljaGFyICpxOworCisJZm9yIChxID0gdGV4dDsgbGkgPiAxOyBsaS0tKSB7CisJCXEgPSBuZXh0X2xpbmUocSk7CisJfQorCXJldHVybiBxOworfQorCisvLy0tLS0tIERvdCBNb3ZlbWVudCBSb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBkb3RfbGVmdCh2b2lkKQoreworCWlmIChkb3QgPiB0ZXh0ICYmIGRvdFstMV0gIT0gJ1xuJykKKwkJZG90LS07Cit9CisKK3N0YXRpYyB2b2lkIGRvdF9yaWdodCh2b2lkKQoreworCWlmIChkb3QgPCBlbmQgLSAxICYmICpkb3QgIT0gJ1xuJykKKwkJZG90Kys7Cit9CisKK3N0YXRpYyB2b2lkIGRvdF9iZWdpbih2b2lkKQoreworCWRvdCA9IGJlZ2luX2xpbmUoZG90KTsJLy8gcmV0dXJuIHBvaW50ZXIgdG8gZmlyc3QgY2hhciBjdXIgbGluZQorfQorCitzdGF0aWMgdm9pZCBkb3RfZW5kKHZvaWQpCit7CisJZG90ID0gZW5kX2xpbmUoZG90KTsJLy8gcmV0dXJuIHBvaW50ZXIgdG8gbGFzdCBjaGFyIGN1ciBsaW5lCit9CisKK3N0YXRpYyBjaGFyICptb3ZlX3RvX2NvbChjaGFyICpwLCBpbnQgbCkKK3sKKwlpbnQgY287CisKKwlwID0gYmVnaW5fbGluZShwKTsKKwljbyA9IDA7CisJd2hpbGUgKGNvIDwgbCAmJiBwIDwgZW5kKSB7CisJCWlmICgqcCA9PSAnXG4nKSAvL3ZkYSB8fCAqcCA9PSAnXDAnKQorCQkJYnJlYWs7CisJCWlmICgqcCA9PSAnXHQnKSB7CisJCQljbyA9IG5leHRfdGFic3RvcChjbyk7CisJCX0gZWxzZSBpZiAoKnAgPCAnICcgfHwgKnAgPT0gMTI3KSB7CisJCQljbysrOyAvLyBkaXNwbGF5IGFzIF5YLCB1c2UgMiBjb2x1bW5zCisJCX0KKwkJY28rKzsKKwkJcCsrOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgZG90X25leHQodm9pZCkKK3sKKwlkb3QgPSBuZXh0X2xpbmUoZG90KTsKK30KKworc3RhdGljIHZvaWQgZG90X3ByZXYodm9pZCkKK3sKKwlkb3QgPSBwcmV2X2xpbmUoZG90KTsKK30KKworc3RhdGljIHZvaWQgZG90X3Njcm9sbChpbnQgY250LCBpbnQgZGlyKQoreworCWNoYXIgKnE7CisKKwlmb3IgKDsgY250ID4gMDsgY250LS0pIHsKKwkJaWYgKGRpciA8IDApIHsKKwkJCS8vIHNjcm9sbCBCYWNrd2FyZHMKKwkJCS8vIGN0cmwtWSBzY3JvbGwgdXAgb25lIGxpbmUKKwkJCXNjcmVlbmJlZ2luID0gcHJldl9saW5lKHNjcmVlbmJlZ2luKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHNjcm9sbCBGb3J3YXJkcworCQkJLy8gY3RybC1FIHNjcm9sbCBkb3duIG9uZSBsaW5lCisJCQlzY3JlZW5iZWdpbiA9IG5leHRfbGluZShzY3JlZW5iZWdpbik7CisJCX0KKwl9CisJLy8gbWFrZSBzdXJlICJkb3QiIHN0YXlzIG9uIHRoZSBzY3JlZW4gc28gd2UgZG9udCBzY3JvbGwgb2ZmCisJaWYgKGRvdCA8IHNjcmVlbmJlZ2luKQorCQlkb3QgPSBzY3JlZW5iZWdpbjsKKwlxID0gZW5kX3NjcmVlbigpOwkvLyBmaW5kIG5ldyBib3R0b20gbGluZQorCWlmIChkb3QgPiBxKQorCQlkb3QgPSBiZWdpbl9saW5lKHEpOwkvLyBpcyBkb3QgaXMgYmVsb3cgYm90dG9tIGxpbmU/CisJZG90X3NraXBfb3Zlcl93cygpOworfQorCitzdGF0aWMgdm9pZCBkb3Rfc2tpcF9vdmVyX3dzKHZvaWQpCit7CisJLy8gc2tpcCBXUworCXdoaWxlIChpc3NwYWNlKCpkb3QpICYmICpkb3QgIT0gJ1xuJyAmJiBkb3QgPCBlbmQgLSAxKQorCQlkb3QrKzsKK30KKworc3RhdGljIHZvaWQgZG90X2RlbGV0ZSh2b2lkKQkvLyBkZWxldGUgdGhlIGNoYXIgYXQgJ2RvdCcKK3sKKwl0ZXh0X2hvbGVfZGVsZXRlKGRvdCwgZG90KTsKK30KKworc3RhdGljIGNoYXIgKmJvdW5kX2RvdChjaGFyICpwKSAvLyBtYWtlIHN1cmUgIHRleHRbMF0gPD0gUCA8ICJlbmQiCit7CisJaWYgKHAgPj0gZW5kICYmIGVuZCA+IHRleHQpIHsKKwkJcCA9IGVuZCAtIDE7CisJCWluZGljYXRlX2Vycm9yKCcxJyk7CisJfQorCWlmIChwIDwgdGV4dCkgeworCQlwID0gdGV4dDsKKwkJaW5kaWNhdGVfZXJyb3IoJzInKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKKy8vLS0tLS0gSGVscGVyIFV0aWxpdHkgUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tIENoYXIgUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIENoYXJzIHRoYXQgYXJlIHBhcnQgb2YgYSB3b3JkLQorICogICAgMDEyMzQ1Njc4OV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisgKiBDaGFycyB0aGF0IGFyZSBOb3QgcGFydCBvZiBhIHdvcmQgKHN0b3BwZXJzKQorICogICAgISIjJCUmJygpKissLS4vOjs8PT4/QFtcXV5ge3x9fgorICogQ2hhcnMgdGhhdCBhcmUgV2hpdGVTcGFjZQorICogICAgVEFCIE5FV0xJTkUgVlQgRkYgUkVUVVJOIFNQQUNFCisgKiBETyBOT1QgQ09VTlQgTkVXTElORSBBUyBXSElURVNQQUNFCisgKi8KKworc3RhdGljIGNoYXIgKm5ld19zY3JlZW4oaW50IHJvLCBpbnQgY28pCit7CisJaW50IGxpOworCisJZnJlZShzY3JlZW4pOworCXNjcmVlbnNpemUgPSBybyAqIGNvICsgODsKKwlzY3JlZW4gPSB4bWFsbG9jKHNjcmVlbnNpemUpOworCS8vIGluaXRpYWxpemUgdGhlIG5ldyBzY3JlZW4uIGFzc3VtZSB0aGlzIHdpbGwgYmUgYSBlbXB0eSBmaWxlLgorCXNjcmVlbl9lcmFzZSgpOworCS8vICAgbm9uLWV4aXN0ZW50IHRleHRbXSBsaW5lcyBzdGFydCB3aXRoIGEgdGlsZGUgKH4pLgorCWZvciAobGkgPSAxOyBsaSA8IHJvIC0gMTsgbGkrKykgeworCQlzY3JlZW5bKGxpICogY28pICsgMF0gPSAnfic7CisJfQorCXJldHVybiBzY3JlZW47Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0gKKworLy8gc2VhcmNoIGZvciBwYXR0ZXJuIHN0YXJ0aW5nIGF0IHAKK3N0YXRpYyBjaGFyICpjaGFyX3NlYXJjaChjaGFyICpwLCBjb25zdCBjaGFyICpwYXQsIGludCBkaXIsIGludCByYW5nZSkKK3sKKwljaGFyICpxOworCXN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciBwcmVnOworCWludCBpOworCWludCBzaXplOworCisJcmVfc3ludGF4X29wdGlvbnMgPSBSRV9TWU5UQVhfUE9TSVhfRVhURU5ERUQ7CisJcHJlZy50cmFuc2xhdGUgPSAwOworCXByZWcuZmFzdG1hcCA9IDA7CisJcHJlZy5idWZmZXIgPSAwOworCXByZWcuYWxsb2NhdGVkID0gMDsKKworCS8vIGFzc3VtZSBhIExJTUlURUQgZm9yd2FyZCBzZWFyY2gKKwlxID0gbmV4dF9saW5lKHApOworCXEgPSBlbmRfbGluZShxKTsKKwlxID0gZW5kIC0gMTsKKwlpZiAoZGlyID09IEJBQ0spIHsKKwkJcSA9IHByZXZfbGluZShwKTsKKwkJcSA9IHRleHQ7CisJfQorCS8vIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhcnMgdG8gc2VhcmNoIG92ZXIsIGZvcndhcmQgb3IgYmFja3dhcmQKKwlzaXplID0gcSAtIHA7CisJaWYgKHNpemUgPCAwKQorCQlzaXplID0gcCAtIHE7CisJLy8gUkFOR0UgY291bGQgYmUgbmVnYXRpdmUgaWYgd2UgYXJlIHNlYXJjaGluZyBiYWNrd2FyZHMKKwlyYW5nZSA9IHEgLSBwOworCisJcSA9IChjaGFyICopcmVfY29tcGlsZV9wYXR0ZXJuKHBhdCwgc3RybGVuKHBhdCksIChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKikmcHJlZyk7CisJaWYgKHEgIT0gMCkgeworCQkvLyBUaGUgcGF0dGVybiB3YXMgbm90IGNvbXBpbGVkCisJCXN0YXR1c19saW5lX2JvbGQoImJhZCBzZWFyY2ggcGF0dGVybjogXCIlc1wiOiAlcyIsIHBhdCwgcSk7CisJCWkgPSAwOwkJCS8vIHJldHVybiBwIGlmIHBhdHRlcm4gbm90IGNvbXBpbGVkCisJCWdvdG8gY3MxOworCX0KKworCXEgPSBwOworCWlmIChyYW5nZSA8IDApIHsKKwkJcSA9IHAgLSBzaXplOworCQlpZiAocSA8IHRleHQpCisJCQlxID0gdGV4dDsKKwl9CisJLy8gc2VhcmNoIGZvciB0aGUgY29tcGlsZWQgcGF0dGVybiwgcHJlZywgaW4gcFtdCisJLy8gcmFuZ2UgPCAwLSAgc2VhcmNoIGJhY2t3YXJkCisJLy8gcmFuZ2UgPiAwLSAgc2VhcmNoIGZvcndhcmQKKwkvLyAwIDwgc3RhcnQgPCBzaXplCisJLy8gcmVfc2VhcmNoKCkgPCAwICBub3QgZm91bmQgb3IgZXJyb3IKKwkvLyByZV9zZWFyY2goKSA+IDAgIGluZGV4IG9mIGZvdW5kIHBhdHRlcm4KKwkvLyAgICAgICAgICAgIHN0cnVjdCBwYXR0ZXJuICAgIGNoYXIgICAgIGludCAgICBpbnQgICAgaW50ICAgICBzdHJ1Y3QgcmVnCisJLy8gcmVfc2VhcmNoICgqcGF0dGVybl9idWZmZXIsICAqc3RyaW5nLCBzaXplLCAgc3RhcnQsIHJhbmdlLCAgKnJlZ3MpCisJaSA9IHJlX3NlYXJjaCgmcHJlZywgcSwgc2l6ZSwgMCwgcmFuZ2UsIDApOworCWlmIChpID09IC0xKSB7CisJCXAgPSAwOworCQlpID0gMDsJCQkvLyByZXR1cm4gTlVMTCBpZiBwYXR0ZXJuIG5vdCBmb3VuZAorCX0KKyBjczE6CisJaWYgKGRpciA9PSBGT1JXQVJEKSB7CisJCXAgPSBwICsgaTsKKwl9IGVsc2UgeworCQlwID0gcCAtIGk7CisJfQorCXJldHVybiBwOworfQorCisjIGVsc2UKKworIyAgaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworc3RhdGljIGludCBteWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGludCBsZW4pCit7CisJaWYgKGlnbm9yZWNhc2UpIHsKKwkJcmV0dXJuIHN0cm5jYXNlY21wKHMxLCBzMiwgbGVuKTsKKwl9CisJcmV0dXJuIHN0cm5jbXAoczEsIHMyLCBsZW4pOworfQorIyAgZWxzZQorIyAgIGRlZmluZSBteWNtcCBzdHJuY21wCisjICBlbmRpZgorCitzdGF0aWMgY2hhciAqY2hhcl9zZWFyY2goY2hhciAqcCwgY29uc3QgY2hhciAqcGF0LCBpbnQgZGlyLCBpbnQgcmFuZ2UpCit7CisJY2hhciAqc3RhcnQsICpzdG9wOworCWludCBsZW47CisKKwlsZW4gPSBzdHJsZW4ocGF0KTsKKwlpZiAoZGlyID09IEZPUldBUkQpIHsKKwkJc3RvcCA9IGVuZCAtIDE7CS8vIGFzc3VtZSByYW5nZSBpcyBwIC0gZW5kLTEKKwkJaWYgKHJhbmdlID09IExJTUlURUQpCisJCQlzdG9wID0gbmV4dF9saW5lKHApOwkvLyByYW5nZSBpcyB0byBuZXh0IGxpbmUKKwkJZm9yIChzdGFydCA9IHA7IHN0YXJ0IDwgc3RvcDsgc3RhcnQrKykgeworCQkJaWYgKG15Y21wKHN0YXJ0LCBwYXQsIGxlbikgPT0gMCkgeworCQkJCXJldHVybiBzdGFydDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZGlyID09IEJBQ0spIHsKKwkJc3RvcCA9IHRleHQ7CS8vIGFzc3VtZSByYW5nZSBpcyB0ZXh0IC0gcAorCQlpZiAocmFuZ2UgPT0gTElNSVRFRCkKKwkJCXN0b3AgPSBwcmV2X2xpbmUocCk7CS8vIHJhbmdlIGlzIHRvIHByZXYgbGluZQorCQlmb3IgKHN0YXJ0ID0gcCAtIGxlbjsgc3RhcnQgPj0gc3RvcDsgc3RhcnQtLSkgeworCQkJaWYgKG15Y21wKHN0YXJ0LCBwYXQsIGxlbikgPT0gMCkgeworCQkJCXJldHVybiBzdGFydDsKKwkJCX0KKwkJfQorCX0KKwkvLyBwYXR0ZXJuIG5vdCBmb3VuZAorCXJldHVybiBOVUxMOworfQorCisjIGVuZGlmCisKKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1NFQVJDSCAqLworCitzdGF0aWMgY2hhciAqY2hhcl9pbnNlcnQoY2hhciAqcCwgY2hhciBjKSAvLyBpbnNlcnQgdGhlIGNoYXIgYyBhdCAncCcKK3sKKwlpZiAoYyA9PSAyMikgewkJLy8gSXMgdGhpcyBhbiBjdHJsLVY/CisJCXAgKz0gc3R1cGlkX2luc2VydChwLCAnXicpOwkvLyB1c2UgXiB0byBpbmRpY2F0ZSBsaXRlcmFsIG5leHQKKwkJcmVmcmVzaChGQUxTRSk7CS8vIHNob3cgdGhlIF4KKwkJYyA9IGdldF9vbmVfY2hhcigpOworCQkqcCA9IGM7CisJCXArKzsKKwkJZmlsZV9tb2RpZmllZCsrOworCX0gZWxzZSBpZiAoYyA9PSAyNykgewkvLyBJcyB0aGlzIGFuIEVTQz8KKwkJY21kX21vZGUgPSAwOworCQljbWRjbnQgPSAwOworCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCQlsYXN0X3N0YXR1c19ja3N1bSA9IDA7CS8vIGZvcmNlIHN0YXR1cyB1cGRhdGUKKwkJaWYgKChwWy0xXSAhPSAnXG4nKSAmJiAoZG90ID4gdGV4dCkpIHsKKwkJCXAtLTsKKwkJfQorCX0gZWxzZSBpZiAoYyA9PSBlcmFzZV9jaGFyIHx8IGMgPT0gOCB8fCBjID09IDEyNykgeyAvLyBJcyB0aGlzIGEgQlMKKwkJLy8gICAgIDEyMzQ1Njc4OQorCQlpZiAoKHBbLTFdICE9ICdcbicpICYmIChkb3Q+dGV4dCkpIHsKKwkJCXAtLTsKKwkJCXAgPSB0ZXh0X2hvbGVfZGVsZXRlKHAsIHApOwkvLyBzaHJpbmsgYnVmZmVyIDEgY2hhcgorCQl9CisJfSBlbHNlIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCisJCS8vIGluc2VydCBhIGNoYXIgaW50byB0ZXh0W10KKwkJY2hhciAqc3A7CQkvLyAic2F2ZSBwIgorI2VuZGlmCisKKwkJaWYgKGMgPT0gMTMpCisJCQljID0gJ1xuJzsJLy8gdHJhbnNsYXRlIFxyIHRvIFxuCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworCQlzcCA9IHA7CQkJLy8gcmVtZW1iZXIgYWRkciBvZiBpbnNlcnQKKyNlbmRpZgorCQlwICs9IDEgKyBzdHVwaWRfaW5zZXJ0KHAsIGMpOwkvLyBpbnNlcnQgdGhlIGNoYXIKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCisJCWlmIChzaG93bWF0Y2ggJiYgc3RyY2hyKCIpXX0iLCAqc3ApICE9IE5VTEwpIHsKKwkJCXNob3dtYXRjaGluZyhzcCk7CisJCX0KKwkJaWYgKGF1dG9pbmRlbnQgJiYgYyA9PSAnXG4nKSB7CS8vIGF1dG8gaW5kZW50IHRoZSBuZXcgbGluZQorCQkJY2hhciAqcTsKKwkJCXNpemVfdCBsZW47CisJCQlxID0gcHJldl9saW5lKHApOwkvLyB1c2UgcHJldiBsaW5lIGFzIHRlbXBsYXRlCisJCQlsZW4gPSBzdHJzcG4ocSwgIiBcdCIpOyAvLyBzcGFjZSBvciB0YWIKKwkJCWlmIChsZW4pIHsKKwkJCQl1aW50cHRyX3QgYmlhczsKKwkJCQliaWFzID0gdGV4dF9ob2xlX21ha2UocCwgbGVuKTsKKwkJCQlwICs9IGJpYXM7CisJCQkJcSArPSBiaWFzOworCQkJCW1lbWNweShwLCBxLCBsZW4pOworCQkJCXAgKz0gbGVuOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisJcmV0dXJuIHA7Cit9CisKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSBzdHVwaWRfaW5zZXJ0KHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCBzdHVwaWRfaW5zZXJ0KGNoYXIgKnAsIGNoYXIgYykgLy8gc3R1cGlkbHkgaW5zZXJ0IHRoZSBjaGFyIGMgYXQgJ3AnCit7CisJdWludHB0cl90IGJpYXM7CisJYmlhcyA9IHRleHRfaG9sZV9tYWtlKHAsIDEpOworCXAgKz0gYmlhczsKKwkqcCA9IGM7CisJLy9maWxlX21vZGlmaWVkKys7IC0gZG9uZSBieSB0ZXh0X2hvbGVfbWFrZSgpCisJcmV0dXJuIGJpYXM7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9yYW5nZShjaGFyICoqc3RhcnQsIGNoYXIgKipzdG9wLCBjaGFyIGMpCit7CisJY2hhciAqc2F2ZV9kb3QsICpwLCAqcSwgKnQ7CisJaW50IGNudCwgbXVsdGlsaW5lID0gMDsKKworCXNhdmVfZG90ID0gZG90OworCXAgPSBxID0gZG90OworCisJaWYgKHN0cmNocigiY2R5PjwiLCBjKSkgeworCQkvLyB0aGVzZSBjbWRzIG9wZXJhdGUgb24gd2hvbGUgbGluZXMKKwkJcCA9IHEgPSBiZWdpbl9saW5lKHApOworCQlmb3IgKGNudCA9IDE7IGNudCA8IGNtZGNudDsgY250KyspIHsKKwkJCXEgPSBuZXh0X2xpbmUocSk7CisJCX0KKwkJcSA9IGVuZF9saW5lKHEpOworCX0gZWxzZSBpZiAoc3RyY2hyKCJeJSQwYkJlRWZ0aFxiXDE3NyIsIGMpKSB7CisJCS8vIFRoZXNlIGNtZHMgb3BlcmF0ZSBvbiBjaGFyIHBvc2l0aW9ucworCQlkb19jbWQoYyk7CQkvLyBleGVjdXRlIG1vdmVtZW50IGNtZAorCQlxID0gZG90OworCX0gZWxzZSBpZiAoc3RyY2hyKCJ3VyIsIGMpKSB7CisJCWRvX2NtZChjKTsJCS8vIGV4ZWN1dGUgbW92ZW1lbnQgY21kCisJCS8vIGlmIHdlIGFyZSBhdCB0aGUgbmV4dCB3b3JkJ3MgZmlyc3QgY2hhcgorCQkvLyBzdGVwIGJhY2sgb25lIGNoYXIKKwkJLy8gYnV0IGNoZWNrIHRoZSBwb3NzaWJpbGl0aWVzIHdoZW4gaXQgaXMgdHJ1ZQorCQlpZiAoZG90ID4gdGV4dCAmJiAoKGlzc3BhY2UoZG90Wy0xXSkgJiYgIWlzc3BhY2UoZG90WzBdKSkKKwkJCQl8fCAoaXNwdW5jdChkb3RbLTFdKSAmJiAhaXNwdW5jdChkb3RbMF0pKQorCQkJCXx8IChpc2FsbnVtKGRvdFstMV0pICYmICFpc2FsbnVtKGRvdFswXSkpKSkKKwkJCWRvdC0tOwkJLy8gbW92ZSBiYWNrIG9mZiBvZiBuZXh0IHdvcmQKKwkJaWYgKGRvdCA+IHRleHQgJiYgKmRvdCA9PSAnXG4nKQorCQkJZG90LS07CQkvLyBzdGF5IG9mZiBOTAorCQlxID0gZG90OworCX0gZWxzZSBpZiAoc3RyY2hyKCJILWt7IiwgYykpIHsKKwkJLy8gdGhlc2Ugb3BlcmF0ZSBvbiBtdWx0aS1saW5lcyBiYWNrd2FyZHMKKwkJcSA9IGVuZF9saW5lKGRvdCk7CS8vIGZpbmQgTkwKKwkJZG9fY21kKGMpOwkJLy8gZXhlY3V0ZSBtb3ZlbWVudCBjbWQKKwkJZG90X2JlZ2luKCk7CisJCXAgPSBkb3Q7CisJfSBlbHNlIGlmIChzdHJjaHIoIkwran1cclxuIiwgYykpIHsKKwkJLy8gdGhlc2Ugb3BlcmF0ZSBvbiBtdWx0aS1saW5lcyBmb3J3YXJkcworCQlwID0gYmVnaW5fbGluZShkb3QpOworCQlkb19jbWQoYyk7CQkvLyBleGVjdXRlIG1vdmVtZW50IGNtZAorCQlkb3RfZW5kKCk7CQkvLyBmaW5kIE5MCisJCXEgPSBkb3Q7CisJfSBlbHNlIHsKKwkgICAgLy8gbm90aGluZyAtLSB0aGlzIGNhdXNlcyBhbnkgb3RoZXIgdmFsdWVzIG9mIGMgdG8KKwkgICAgLy8gcmVwcmVzZW50IHRoZSBvbmUtY2hhcmFjdGVyIHJhbmdlIHVuZGVyIHRoZQorCSAgICAvLyBjdXJzb3IuICB0aGlzIGlzIGNvcnJlY3QgZm9yICcgJyBhbmQgJ2wnLCBidXQKKwkgICAgLy8gcGVyaGFwcyBubyBvdGhlcnMuCisJICAgIC8vCisJfQorCWlmIChxIDwgcCkgeworCQl0ID0gcTsKKwkJcSA9IHA7CisJCXAgPSB0OworCX0KKworCS8vIGJhY2t3YXJkIGNoYXIgbW92ZW1lbnRzIGRvbid0IGluY2x1ZGUgc3RhcnQgcG9zaXRpb24KKwlpZiAocSA+IHAgJiYgc3RyY2hyKCJeMGJCaFxiXDE3NyIsIGMpKSBxLS07CisKKwltdWx0aWxpbmUgPSAwOworCWZvciAodCA9IHA7IHQgPD0gcTsgdCsrKSB7CisJCWlmICgqdCA9PSAnXG4nKSB7CisJCQltdWx0aWxpbmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkqc3RhcnQgPSBwOworCSpzdG9wID0gcTsKKwlkb3QgPSBzYXZlX2RvdDsKKwlyZXR1cm4gbXVsdGlsaW5lOworfQorCitzdGF0aWMgaW50IHN0X3Rlc3QoY2hhciAqcCwgaW50IHR5cGUsIGludCBkaXIsIGNoYXIgKnRlc3RlZCkKK3sKKwljaGFyIGMsIGMwLCBjaTsKKwlpbnQgdGVzdCwgaW5jOworCisJaW5jID0gZGlyOworCWMgPSBjMCA9IHBbMF07CisJY2kgPSBwW2luY107CisJdGVzdCA9IDA7CisKKwlpZiAodHlwZSA9PSBTX0JFRk9SRV9XUykgeworCQljID0gY2k7CisJCXRlc3QgPSAoIWlzc3BhY2UoYykgfHwgYyA9PSAnXG4nKTsKKwl9CisJaWYgKHR5cGUgPT0gU19UT19XUykgeworCQljID0gYzA7CisJCXRlc3QgPSAoIWlzc3BhY2UoYykgfHwgYyA9PSAnXG4nKTsKKwl9CisJaWYgKHR5cGUgPT0gU19PVkVSX1dTKSB7CisJCWMgPSBjMDsKKwkJdGVzdCA9IGlzc3BhY2UoYyk7CisJfQorCWlmICh0eXBlID09IFNfRU5EX1BVTkNUKSB7CisJCWMgPSBjaTsKKwkJdGVzdCA9IGlzcHVuY3QoYyk7CisJfQorCWlmICh0eXBlID09IFNfRU5EX0FMTlVNKSB7CisJCWMgPSBjaTsKKwkJdGVzdCA9IChpc2FsbnVtKGMpIHx8IGMgPT0gJ18nKTsKKwl9CisJKnRlc3RlZCA9IGM7CisJcmV0dXJuIHRlc3Q7Cit9CisKK3N0YXRpYyBjaGFyICpza2lwX3RoaW5nKGNoYXIgKnAsIGludCBsaW5lY250LCBpbnQgZGlyLCBpbnQgdHlwZSkKK3sKKwljaGFyIGM7CisKKwl3aGlsZSAoc3RfdGVzdChwLCB0eXBlLCBkaXIsICZjKSkgeworCQkvLyBtYWtlIHN1cmUgd2UgbGltaXQgc2VhcmNoIHRvIGNvcnJlY3QgbnVtYmVyIG9mIGxpbmVzCisJCWlmIChjID09ICdcbicgJiYgLS1saW5lY250IDwgMSkKKwkJCWJyZWFrOworCQlpZiAoZGlyID49IDAgJiYgcCA+PSBlbmQgLSAxKQorCQkJYnJlYWs7CisJCWlmIChkaXIgPCAwICYmIHAgPD0gdGV4dCkKKwkJCWJyZWFrOworCQlwICs9IGRpcjsJCS8vIG1vdmUgdG8gbmV4dCBjaGFyCisJfQorCXJldHVybiBwOworfQorCisvLyBmaW5kIG1hdGNoaW5nIGNoYXIgb2YgcGFpciAgKCkgIFtdICB7fQorc3RhdGljIGNoYXIgKmZpbmRfcGFpcihjaGFyICpwLCBjb25zdCBjaGFyIGMpCit7CisJY2hhciBtYXRjaCwgKnE7CisJaW50IGRpciwgbGV2ZWw7CisKKwltYXRjaCA9ICcpJzsKKwlsZXZlbCA9IDE7CisJZGlyID0gMTsJCQkvLyBhc3N1bWUgZm9yd2FyZAorCXN3aXRjaCAoYykgeworCWNhc2UgJygnOiBtYXRjaCA9ICcpJzsgYnJlYWs7CisJY2FzZSAnWyc6IG1hdGNoID0gJ10nOyBicmVhazsKKwljYXNlICd7JzogbWF0Y2ggPSAnfSc7IGJyZWFrOworCWNhc2UgJyknOiBtYXRjaCA9ICcoJzsgZGlyID0gLTE7IGJyZWFrOworCWNhc2UgJ10nOiBtYXRjaCA9ICdbJzsgZGlyID0gLTE7IGJyZWFrOworCWNhc2UgJ30nOiBtYXRjaCA9ICd7JzsgZGlyID0gLTE7IGJyZWFrOworCX0KKwlmb3IgKHEgPSBwICsgZGlyOyB0ZXh0IDw9IHEgJiYgcSA8IGVuZDsgcSArPSBkaXIpIHsKKwkJLy8gbG9vayBmb3IgbWF0Y2gsIGNvdW50IGxldmVscyBvZiBwYWlycyAgKCggKSkKKwkJaWYgKCpxID09IGMpCisJCQlsZXZlbCsrOwkvLyBpbmNyZWFzZSBwYWlyIGxldmVscworCQlpZiAoKnEgPT0gbWF0Y2gpCisJCQlsZXZlbC0tOwkvLyByZWR1Y2UgcGFpciBsZXZlbAorCQlpZiAobGV2ZWwgPT0gMCkKKwkJCWJyZWFrOwkJLy8gZm91bmQgbWF0Y2hpbmcgcGFpcgorCX0KKwlpZiAobGV2ZWwgIT0gMCkKKwkJcSA9IE5VTEw7CQkvLyBpbmRpY2F0ZSBubyBtYXRjaAorCXJldHVybiBxOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworLy8gc2hvdyB0aGUgbWF0Y2hpbmcgY2hhciBvZiBhIHBhaXIsICAoKSAgW10gIHt9CitzdGF0aWMgdm9pZCBzaG93bWF0Y2hpbmcoY2hhciAqcCkKK3sKKwljaGFyICpxLCAqc2F2ZV9kb3Q7CisKKwkvLyB3ZSBmb3VuZCBoYWxmIG9mIGEgcGFpcgorCXEgPSBmaW5kX3BhaXIocCwgKnApOwkvLyBnZXQgbG9jIG9mIG1hdGNoaW5nIGNoYXIKKwlpZiAocSA9PSBOVUxMKSB7CisJCWluZGljYXRlX2Vycm9yKCczJyk7CS8vIG5vIG1hdGNoaW5nIGNoYXIKKwl9IGVsc2UgeworCQkvLyAicSIgbm93IHBvaW50cyB0byBtYXRjaGluZyBwYWlyCisJCXNhdmVfZG90ID0gZG90OwkvLyByZW1lbWJlciB3aGVyZSB3ZSBhcmUKKwkJZG90ID0gcTsJCS8vIGdvIHRvIG5ldyBsb2MKKwkJcmVmcmVzaChGQUxTRSk7CS8vIGxldCB0aGUgdXNlciBzZWUgaXQKKwkJbXlzbGVlcCg0MCk7CS8vIGdpdmUgdXNlciBzb21lIHRpbWUKKwkJZG90ID0gc2F2ZV9kb3Q7CS8vIGdvIGJhY2sgdG8gb2xkIGxvYworCQlyZWZyZXNoKEZBTFNFKTsKKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9WSV9TRVRPUFRTICovCisKKy8vIG9wZW4gYSBob2xlIGluIHRleHRbXQorLy8gbWlnaHQgcmVhbGxvY2F0ZSB0ZXh0W10hIHVzZSBwICs9IHRleHRfaG9sZV9tYWtlKHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCB0ZXh0X2hvbGVfbWFrZShjaGFyICpwLCBpbnQgc2l6ZSkJLy8gYXQgInAiLCBtYWtlIGEgJ3NpemUnIGJ5dGUgaG9sZQoreworCXVpbnRwdHJfdCBiaWFzID0gMDsKKworCWlmIChzaXplIDw9IDApCisJCXJldHVybiBiaWFzOworCWVuZCArPSBzaXplOwkJLy8gYWRqdXN0IHRoZSBuZXcgRU5ECisJaWYgKGVuZCA+PSAodGV4dCArIHRleHRfc2l6ZSkpIHsKKwkJY2hhciAqbmV3X3RleHQ7CisJCXRleHRfc2l6ZSArPSBlbmQgLSAodGV4dCArIHRleHRfc2l6ZSkgKyAxMDI0MDsKKwkJbmV3X3RleHQgPSB4cmVhbGxvYyh0ZXh0LCB0ZXh0X3NpemUpOworCQliaWFzID0gKG5ld190ZXh0IC0gdGV4dCk7CisJCXNjcmVlbmJlZ2luICs9IGJpYXM7CisJCWRvdCAgICAgICAgICs9IGJpYXM7CisJCWVuZCAgICAgICAgICs9IGJpYXM7CisJCXAgICAgICAgICAgICs9IGJpYXM7CisJCXRleHQgPSBuZXdfdGV4dDsKKwl9CisJbWVtbW92ZShwICsgc2l6ZSwgcCwgZW5kIC0gc2l6ZSAtIHApOworCW1lbXNldChwLCAnICcsIHNpemUpOwkvLyBjbGVhciBuZXcgaG9sZQorCWZpbGVfbW9kaWZpZWQrKzsKKwlyZXR1cm4gYmlhczsKK30KKworLy8gIGNsb3NlIGEgaG9sZSBpbiB0ZXh0W10KK3N0YXRpYyBjaGFyICp0ZXh0X2hvbGVfZGVsZXRlKGNoYXIgKnAsIGNoYXIgKnEpIC8vIGRlbGV0ZSAicCIgdGhyb3VnaCAicSIsIGluY2x1c2l2ZQoreworCWNoYXIgKnNyYywgKmRlc3Q7CisJaW50IGNudCwgaG9sZV9zaXplOworCisJLy8gbW92ZSBmb3J3YXJkcywgZnJvbSBiZWdpbm5pbmcKKwkvLyBhc3N1bWUgcCA8PSBxCisJc3JjID0gcSArIDE7CisJZGVzdCA9IHA7CisJaWYgKHEgPCBwKSB7CQkvLyB0aGV5IGFyZSBiYWNrd2FyZC0gc3dhcCB0aGVtCisJCXNyYyA9IHAgKyAxOworCQlkZXN0ID0gcTsKKwl9CisJaG9sZV9zaXplID0gcSAtIHAgKyAxOworCWNudCA9IGVuZCAtIHNyYzsKKwlpZiAoc3JjIDwgdGV4dCB8fCBzcmMgPiBlbmQpCisJCWdvdG8gdGhkMDsKKwlpZiAoZGVzdCA8IHRleHQgfHwgZGVzdCA+PSBlbmQpCisJCWdvdG8gdGhkMDsKKwlpZiAoc3JjID49IGVuZCkKKwkJZ290byB0aGRfYXRlbmQ7CS8vIGp1c3QgZGVsZXRlIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorCW1lbW1vdmUoZGVzdCwgc3JjLCBjbnQpOworIHRoZF9hdGVuZDoKKwllbmQgPSBlbmQgLSBob2xlX3NpemU7CS8vIGFkanVzdCB0aGUgbmV3IEVORAorCWlmIChkZXN0ID49IGVuZCkKKwkJZGVzdCA9IGVuZCAtIDE7CS8vIG1ha2Ugc3VyZSBkZXN0IGluIGJlbG93IGVuZC0xCisJaWYgKGVuZCA8PSB0ZXh0KQorCQlkZXN0ID0gZW5kID0gdGV4dDsJLy8ga2VlcCBwb2ludGVycyB2YWxpZAorCWZpbGVfbW9kaWZpZWQrKzsKKyB0aGQwOgorCXJldHVybiBkZXN0OworfQorCisvLyBjb3B5IHRleHQgaW50byByZWdpc3RlciwgdGhlbiBkZWxldGUgdGV4dC4KKy8vIGlmIGRpc3QgPD0gMCwgZG8gbm90IGluY2x1ZGUsIG9yIGdvIHBhc3QsIGEgTmV3TGluZQorLy8KK3N0YXRpYyBjaGFyICp5YW5rX2RlbGV0ZShjaGFyICpzdGFydCwgY2hhciAqc3RvcCwgaW50IGRpc3QsIGludCB5ZikKK3sKKwljaGFyICpwOworCisJLy8gbWFrZSBzdXJlIHN0YXJ0IDw9IHN0b3AKKwlpZiAoc3RhcnQgPiBzdG9wKSB7CisJCS8vIHRoZXkgYXJlIGJhY2t3YXJkcywgcmV2ZXJzZSB0aGVtCisJCXAgPSBzdGFydDsKKwkJc3RhcnQgPSBzdG9wOworCQlzdG9wID0gcDsKKwl9CisJaWYgKGRpc3QgPD0gMCkgeworCQkvLyB3ZSBjYW5ub3QgY3Jvc3MgTkwgYm91bmRhcmllcworCQlwID0gc3RhcnQ7CisJCWlmICgqcCA9PSAnXG4nKQorCQkJcmV0dXJuIHA7CisJCS8vIGRvbnQgZ28gcGFzdCBhIE5ld0xpbmUKKwkJZm9yICg7IHAgKyAxIDw9IHN0b3A7IHArKykgeworCQkJaWYgKHBbMV0gPT0gJ1xuJykgeworCQkJCXN0b3AgPSBwOwkvLyAic3RvcCIganVzdCBiZWZvcmUgTmV3TGluZQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXAgPSBzdGFydDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCXRleHRfeWFuayhzdGFydCwgc3RvcCwgWURyZWcpOworI2VuZGlmCisJaWYgKHlmID09IFlBTktERUwpIHsKKwkJcCA9IHRleHRfaG9sZV9kZWxldGUoc3RhcnQsIHN0b3ApOworCX0JCQkJCS8vIGRlbGV0ZSBsaW5lcworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBzaG93X2hlbHAodm9pZCkKK3sKKwlwdXRzKCJUaGVzZSBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlOiIKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gKKwkiXG5cdFBhdHRlcm4gc2VhcmNoZXMgd2l0aCAvIGFuZCA/IgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCSJcblx0TGFzdCBjb21tYW5kIHJlcGVhdCB3aXRoIFwnLlwnIgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwkiXG5cdExpbmUgbWFya2luZyB3aXRoICd4IgorCSJcblx0TmFtZWQgYnVmZmVycyB3aXRoIFwieCIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJLy9ub3QgaW1wbGVtZW50ZWQ6ICJcblx0UmVhZG9ubHkgaWYgdmkgaXMgY2FsbGVkIGFzIFwidmlld1wiIgorCS8vcmVkdW5kYW50OiB1c2FnZSB0ZXh0IHNheXMgdGhpcyB0b286ICJcblx0UmVhZG9ubHkgd2l0aCAtUiBjb21tYW5kIGxpbmUgYXJnIgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUCisJIlxuXHRTb21lIGNvbG9uIG1vZGUgY29tbWFuZHMgd2l0aCBcJzpcJyIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKKwkiXG5cdFNldHRhYmxlIG9wdGlvbnMgd2l0aCBcIjpzZXRcIiIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCisJIlxuXHRTaWduYWwgY2F0Y2hpbmctIF5DIgorCSJcblx0Sm9iIHN1c3BlbmQgYW5kIHJlc3VtZSB3aXRoIF5aIgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfV0lOX1JFU0laRQorCSJcblx0QWRhcHQgdG8gd2luZG93IHJlLXNpemVzIgorI2VuZGlmCisJKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKK3N0YXRpYyB2b2lkIHN0YXJ0X25ld19jbWRfcShjaGFyIGMpCit7CisJLy8gZ2V0IGJ1ZmZlciBmb3IgbmV3IGNtZAorCS8vIGlmIHRoZXJlIGlzIGEgY3VycmVudCBjbWQgY291bnQgcHV0IGl0IGluIHRoZSBidWZmZXIgZmlyc3QKKwlpZiAoY21kY250ID4gMCkgeworCQlsbWNfbGVuID0gc3ByaW50ZihsYXN0X21vZGlmeWluZ19jbWQsICIlZCVjIiwgY21kY250LCBjKTsKKwl9IGVsc2UgeyAvLyBqdXN0IHNhdmUgY2hhciBjIG9udG8gcXVldWUKKwkJbGFzdF9tb2RpZnlpbmdfY21kWzBdID0gYzsKKwkJbG1jX2xlbiA9IDE7CisJfQorCWFkZGluZzJxID0gMTsKK30KKworc3RhdGljIHZvaWQgZW5kX2NtZF9xKHZvaWQpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwlZRHJlZyA9IDI2OwkJCS8vIGdvIGJhY2sgdG8gZGVmYXVsdCBZYW5rL0RlbGV0ZSByZWcKKyNlbmRpZgorCWFkZGluZzJxID0gMDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX0RPVF9DTUQgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLIFwKKyB8fCAoRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04gJiYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNIKSBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorLy8gbWlnaHQgcmVhbGxvY2F0ZSB0ZXh0W10hIHVzZSBwICs9IHN0cmluZ19pbnNlcnQocCwgLi4uKSwKKy8vIGFuZCBiZSBjYXJlZnVsIHRvIG5vdCB1c2UgcG9pbnRlcnMgaW50byBwb3RlbnRpYWxseSBmcmVlZCB0ZXh0W10hCitzdGF0aWMgdWludHB0cl90IHN0cmluZ19pbnNlcnQoY2hhciAqcCwgY29uc3QgY2hhciAqcykgLy8gaW5zZXJ0IHRoZSBzdHJpbmcgYXQgJ3AnCit7CisJdWludHB0cl90IGJpYXM7CisJaW50IGk7CisKKwlpID0gc3RybGVuKHMpOworCWJpYXMgPSB0ZXh0X2hvbGVfbWFrZShwLCBpKTsKKwlwICs9IGJpYXM7CisJbWVtY3B5KHAsIHMsIGkpOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJeworCQlpbnQgY250OworCQlmb3IgKGNudCA9IDA7ICpzICE9ICdcMCc7IHMrKykgeworCQkJaWYgKCpzID09ICdcbicpCisJCQkJY250Kys7CisJCX0KKwkJc3RhdHVzX2xpbmUoIlB1dCAlZCBsaW5lcyAoJWQgY2hhcnMpIGZyb20gWyVjXSIsIGNudCwgaSwgd2hhdF9yZWcoKSk7CisJfQorI2VuZGlmCisJcmV0dXJuIGJpYXM7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCitzdGF0aWMgY2hhciAqdGV4dF95YW5rKGNoYXIgKnAsIGNoYXIgKnEsIGludCBkZXN0KQkvLyBjb3B5IHRleHQgaW50byBhIHJlZ2lzdGVyCit7CisJaW50IGNudCA9IHEgLSBwOworCWlmIChjbnQgPCAwKSB7CQkvLyB0aGV5IGFyZSBiYWNrd2FyZHMtIHJldmVyc2UgdGhlbQorCQlwID0gcTsKKwkJY250ID0gLWNudDsKKwl9CisJZnJlZShyZWdbZGVzdF0pOwkvLyAgaWYgYWxyZWFkeSBhIHlhbmsgcmVnaXN0ZXIsIGZyZWUgaXQKKwlyZWdbZGVzdF0gPSB4c3RybmR1cChwLCBjbnQgKyAxKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgd2hhdF9yZWcodm9pZCkKK3sKKwljaGFyIGM7CisKKwljID0gJ0QnOwkJCS8vIGRlZmF1bHQgdG8gRC1yZWcKKwlpZiAoMCA8PSBZRHJlZyAmJiBZRHJlZyA8PSAyNSkKKwkJYyA9ICdhJyArIChjaGFyKSBZRHJlZzsKKwlpZiAoWURyZWcgPT0gMjYpCisJCWMgPSAnRCc7CisJaWYgKFlEcmVnID09IDI3KQorCQljID0gJ1UnOworCXJldHVybiBjOworfQorCitzdGF0aWMgdm9pZCBjaGVja19jb250ZXh0KGNoYXIgY21kKQoreworCS8vIEEgY29udGV4dCBpcyBkZWZpbmVkIHRvIGJlICJtb2RpZnlpbmcgdGV4dCIKKwkvLyBBbnkgbW9kaWZ5aW5nIGNvbW1hbmQgZXN0YWJsaXNoZXMgYSBuZXcgY29udGV4dC4KKworCWlmIChkb3QgPCBjb250ZXh0X3N0YXJ0IHx8IGRvdCA+IGNvbnRleHRfZW5kKSB7CisJCWlmIChzdHJjaHIobW9kaWZ5aW5nX2NtZHMsIGNtZCkgIT0gTlVMTCkgeworCQkJLy8gd2UgYXJlIHRyeWluZyB0byBtb2RpZnkgdGV4dFtdLSBtYWtlIHRoaXMgdGhlIGN1cnJlbnQgY29udGV4dAorCQkJbWFya1syN10gPSBtYXJrWzI2XTsJLy8gbW92ZSBjdXIgdG8gcHJldgorCQkJbWFya1syNl0gPSBkb3Q7CS8vIG1vdmUgbG9jYWwgdG8gY3VyCisJCQljb250ZXh0X3N0YXJ0ID0gcHJldl9saW5lKHByZXZfbGluZShkb3QpKTsKKwkJCWNvbnRleHRfZW5kID0gbmV4dF9saW5lKG5leHRfbGluZShkb3QpKTsKKwkJCS8vbG9pdGVyPSBzdGFydF9sb2l0ZXI9IG5vdzsKKwkJfQorCX0KK30KKworc3RhdGljIGNoYXIgKnN3YXBfY29udGV4dChjaGFyICpwKSAvLyBnb3RvIG5ldyBjb250ZXh0IGZvciAnJyBjb21tYW5kIG1ha2UgdGhpcyB0aGUgY3VycmVudCBjb250ZXh0Cit7CisJY2hhciAqdG1wOworCisJLy8gdGhlIGN1cnJlbnQgY29udGV4dCBpcyBpbiBtYXJrWzI2XQorCS8vIHRoZSBwcmV2aW91cyBjb250ZXh0IGlzIGluIG1hcmtbMjddCisJLy8gb25seSBzd2FwIGNvbnRleHQgaWYgb3RoZXIgY29udGV4dCBpcyB2YWxpZAorCWlmICh0ZXh0IDw9IG1hcmtbMjddICYmIG1hcmtbMjddIDw9IGVuZCAtIDEpIHsKKwkJdG1wID0gbWFya1syN107CisJCW1hcmtbMjddID0gbWFya1syNl07CisJCW1hcmtbMjZdID0gdG1wOworCQlwID0gbWFya1syNl07CS8vIHdoZXJlIHdlIGFyZSBnb2luZy0gcHJldmlvdXMgY29udGV4dAorCQljb250ZXh0X3N0YXJ0ID0gcHJldl9saW5lKHByZXZfbGluZShwcmV2X2xpbmUocCkpKTsKKwkJY29udGV4dF9lbmQgPSBuZXh0X2xpbmUobmV4dF9saW5lKG5leHRfbGluZShwKSkpOworCX0KKwlyZXR1cm4gcDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1lBTktNQVJLICovCisKKy8vLS0tLS0gU2V0IHRlcm1pbmFsIGF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHJhd21vZGUodm9pZCkKK3sKKwl0Y2dldGF0dHIoMCwgJnRlcm1fb3JpZyk7CisJdGVybV92aSA9IHRlcm1fb3JpZzsKKwl0ZXJtX3ZpLmNfbGZsYWcgJj0gKH5JQ0FOT04gJiB+RUNITyk7CS8vIGxlYXZlIElTSUcgT04tIGFsbG93IGludHIncworCXRlcm1fdmkuY19pZmxhZyAmPSAofklYT04gJiB+SUNSTkwpOworCXRlcm1fdmkuY19vZmxhZyAmPSAofk9OTENSKTsKKwl0ZXJtX3ZpLmNfY2NbVk1JTl0gPSAxOworCXRlcm1fdmkuY19jY1tWVElNRV0gPSAwOworCWVyYXNlX2NoYXIgPSB0ZXJtX3ZpLmNfY2NbVkVSQVNFXTsKKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmdGVybV92aSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvb2ttb2RlKHZvaWQpCit7CisJZmZsdXNoX2FsbCgpOworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0ZXJtX29yaWcpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVVNFX1NJR05BTFMKKy8vLS0tLS0gQ29tZSBoZXJlIHdoZW4gd2UgZ2V0IGEgd2luZG93IHJlc2l6ZSBzaWduYWwgLS0tLS0tLS0tCitzdGF0aWMgdm9pZCB3aW5jaF9zaWcoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKwkvLyBGSVhNRTogZG8gaXQgaW4gbWFpbiBsb29wISEhCisJc2lnbmFsKFNJR1dJTkNILCB3aW5jaF9zaWcpOworCXF1ZXJ5X3NjcmVlbl9kaW1lbnNpb25zKCk7CisJbmV3X3NjcmVlbihyb3dzLCBjb2x1bW5zKTsJLy8gZ2V0IG1lbW9yeSBmb3IgdmlydHVhbCBzY3JlZW4KKwlyZWRyYXcoVFJVRSk7CQkvLyByZS1kcmF3IHRoZSBzY3JlZW4KKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKKy8vLS0tLS0gQ29tZSBoZXJlIHdoZW4gd2UgZ2V0IGEgY29udGludWUgc2lnbmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIGNvbnRfc2lnKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisJcmF3bW9kZSgpOyAvLyB0ZXJtaW5hbCB0byAicmF3IgorCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsgLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCXJlZHJhdyhUUlVFKTsgLy8gcmUtZHJhdyB0aGUgc2NyZWVuCisKKwlzaWduYWwoU0lHVFNUUCwgc3VzcGVuZF9zaWcpOworCXNpZ25hbChTSUdDT05ULCBTSUdfREZMKTsKKwkvL2tpbGwobXlfcGlkLCBTSUdDT05UKTsgLy8gaHVoPyB3aHk/IHdlIGFyZSBhbHJlYWR5ICJjb250aW51ZWQiLi4uCisJZXJybm8gPSBzYXZlX2Vycm5vOworfQorCisvLy0tLS0tIENvbWUgaGVyZSB3aGVuIHdlIGdldCBhIFN1c3BlbmQgc2lnbmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHN1c3BlbmRfc2lnKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwljb29rbW9kZSgpOyAvLyB0ZXJtaW5hbCB0byAiY29va2VkIgorCisJc2lnbmFsKFNJR0NPTlQsIGNvbnRfc2lnKTsKKwlzaWduYWwoU0lHVFNUUCwgU0lHX0RGTCk7CisJa2lsbChteV9waWQsIFNJR1RTVFApOworCWVycm5vID0gc2F2ZV9lcnJubzsKK30KKworLy8tLS0tLSBDb21lIGhlcmUgd2hlbiB3ZSBnZXQgYSBzaWduYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBjYXRjaF9zaWcoaW50IHNpZykKK3sKKwlzaWduYWwoU0lHSU5ULCBjYXRjaF9zaWcpOworCXNpZ2xvbmdqbXAocmVzdGFydCwgc2lnKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1VTRV9TSUdOQUxTICovCisKK3N0YXRpYyBpbnQgbXlzbGVlcChpbnQgaHVuZCkJLy8gc2xlZXAgZm9yICdodW5kJyAxLzEwMCBzZWNvbmRzIG9yIHN0ZGluIHJlYWR5Cit7CisJc3RydWN0IHBvbGxmZCBwZmRbMV07CisKKwlwZmRbMF0uZmQgPSBTVERJTl9GSUxFTk87CisJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwlyZXR1cm4gc2FmZV9wb2xsKHBmZCwgMSwgaHVuZCoxMCkgPiAwOworfQorCisvLy0tLS0tIElPIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaW50IHJlYWRpdCh2b2lkKSAvLyByZWFkIChtYXliZSBjdXJzb3IpIGtleSBmcm9tIHN0ZGluCit7CisJaW50IGM7CisKKwlmZmx1c2hfYWxsKCk7CisJYyA9IHJlYWRfa2V5KFNURElOX0ZJTEVOTywgcmVhZGJ1ZmZlciwgLyp0aW1lb3V0IG9mZjoqLyAtMik7CisJaWYgKGMgPT0gLTEpIHsgLy8gRU9GL2Vycm9yCisJCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJCWNvb2ttb2RlKCk7IC8vIHRlcm1pbmFsIHRvICJjb29rZWQiCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZWFkIHVzZXIgaW5wdXQiKTsKKwl9CisJcmV0dXJuIGM7Cit9CisKKy8vLS0tLS0gSU8gUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBpbnQgZ2V0X29uZV9jaGFyKHZvaWQpCit7CisJaW50IGM7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ET1RfQ01ECisJaWYgKCFhZGRpbmcycSkgeworCQkvLyB3ZSBhcmUgbm90IGFkZGluZyB0byB0aGUgcS4KKwkJLy8gYnV0LCB3ZSBtYXkgYmUgcmVhZGluZyBmcm9tIGEgcQorCQlpZiAoaW9xID09IDApIHsKKwkJCS8vIHRoZXJlIGlzIG5vIGN1cnJlbnQgcSwgcmVhZCBmcm9tIFNURElOCisJCQljID0gcmVhZGl0KCk7CS8vIGdldCB0aGUgdXNlcnMgaW5wdXQKKwkJfSBlbHNlIHsKKwkJCS8vIHRoZXJlIGlzIGEgcXVldWUgdG8gZ2V0IGNoYXJzIGZyb20gZmlyc3QKKwkJCS8vIGNhcmVmdWwgd2l0aCBjb3JyZWN0IHNpZ24gZXhwYW5zaW9uIQorCQkJYyA9ICh1bnNpZ25lZCBjaGFyKSppb3ErKzsKKwkJCWlmIChjID09ICdcMCcpIHsKKwkJCQkvLyB0aGUgZW5kIG9mIHRoZSBxLCByZWFkIGZyb20gU1RESU4KKwkJCQlmcmVlKGlvcV9zdGFydCk7CisJCQkJaW9xX3N0YXJ0ID0gaW9xID0gMDsKKwkJCQljID0gcmVhZGl0KCk7CS8vIGdldCB0aGUgdXNlcnMgaW5wdXQKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8vIGFkZGluZyBTVERJTiBjaGFycyB0byBxCisJCWMgPSByZWFkaXQoKTsJLy8gZ2V0IHRoZSB1c2VycyBpbnB1dAorCQlpZiAobG1jX2xlbiA+PSBNQVhfSU5QVVRfTEVOIC0gMSkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgibGFzdF9tb2RpZnlpbmdfY21kIG92ZXJydW4iKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGFkZCBuZXcgY2hhciB0byBxCisJCQlsYXN0X21vZGlmeWluZ19jbWRbbG1jX2xlbisrXSA9IGM7CisJCX0KKwl9CisjZWxzZQorCWMgPSByZWFkaXQoKTsJCS8vIGdldCB0aGUgdXNlcnMgaW5wdXQKKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX0RPVF9DTUQgKi8KKwlyZXR1cm4gYzsKK30KKworLy8gR2V0IGlucHV0IGxpbmUgKHVzZXMgInN0YXR1cyBsaW5lIiBhcmVhKQorc3RhdGljIGNoYXIgKmdldF9pbnB1dF9saW5lKGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKwkvLyBjaGFyIFtNQVhfSU5QVVRfTEVOXQorI2RlZmluZSBidWYgZ2V0X2lucHV0X2xpbmVfX2J1ZgorCisJaW50IGM7CisJaW50IGk7CisKKwlzdHJjcHkoYnVmLCBwcm9tcHQpOworCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJd3JpdGUxKHByb21wdCk7ICAgICAgLy8gd3JpdGUgb3V0IHRoZSA6LCAvLCBvciA/IHByb21wdAorCisJaSA9IHN0cmxlbihidWYpOworCXdoaWxlIChpIDwgTUFYX0lOUFVUX0xFTikgeworCQljID0gZ2V0X29uZV9jaGFyKCk7CisJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gMjcpCisJCQlicmVhazsJCS8vIHRoaXMgaXMgZW5kIG9mIGlucHV0CisJCWlmIChjID09IGVyYXNlX2NoYXIgfHwgYyA9PSA4IHx8IGMgPT0gMTI3KSB7CisJCQkvLyB1c2VyIHdhbnRzIHRvIGVyYXNlIHByZXYgY2hhcgorCQkJYnVmWy0taV0gPSAnXDAnOworCQkJd3JpdGUxKCJcYiBcYiIpOyAvLyBlcmFzZSBjaGFyIG9uIHNjcmVlbgorCQkJaWYgKGkgPD0gMCkgLy8gdXNlciBiYWNrcyB1cCBiZWZvcmUgYi1vLWwsIGV4aXQKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmIChjID4gMCAmJiBjIDwgMjU2KSB7IC8vIGV4Y2x1ZGUgVW5pY29kZQorCQkJLy8gKFRPRE86IG5lZWQgdG8gaGFuZGxlIFVuaWNvZGUpCisJCQlidWZbaV0gPSBjOworCQkJYnVmWysraV0gPSAnXDAnOworCQkJYmJfcHV0Y2hhcihjKTsKKwkJfQorCX0KKwlyZWZyZXNoKEZBTFNFKTsKKwlyZXR1cm4gYnVmOworI3VuZGVmIGJ1ZgorfQorCitzdGF0aWMgaW50IGZpbGVfc2l6ZShjb25zdCBjaGFyICpmbikgLy8gd2hhdCBpcyB0aGUgYnl0ZSBzaXplIG9mICJmbiIKK3sKKwlzdHJ1Y3Qgc3RhdCBzdF9idWY7CisJaW50IGNudDsKKworCWNudCA9IC0xOworCWlmIChmbiAmJiBzdGF0KGZuLCAmc3RfYnVmKSA9PSAwKQkvLyBzZWUgaWYgZmlsZSBleGlzdHMKKwkJY250ID0gKGludCkgc3RfYnVmLnN0X3NpemU7CisJcmV0dXJuIGNudDsKK30KKworLy8gbWlnaHQgcmVhbGxvY2F0ZSB0ZXh0W10hCitzdGF0aWMgaW50IGZpbGVfaW5zZXJ0KGNvbnN0IGNoYXIgKmZuLCBjaGFyICpwLCBpbnQgdXBkYXRlX3JvX3N0YXR1cykKK3sKKwlpbnQgY250ID0gLTE7CisJaW50IGZkLCBzaXplOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwkvKiBWYWxpZGF0ZSBmaWxlICovCisJaWYgKHN0YXQoZm4sICZzdGF0YnVmKSA8IDApIHsKKwkJc3RhdHVzX2xpbmVfYm9sZCgiXCIlc1wiICVzIiwgZm4sIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmkwOworCX0KKwlpZiAoIVNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQkvLyBUaGlzIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZQorCQlzdGF0dXNfbGluZV9ib2xkKCJcIiVzXCIgTm90IGEgcmVndWxhciBmaWxlIiwgZm4pOworCQlnb3RvIGZpMDsKKwl9CisJaWYgKHAgPCB0ZXh0IHx8IHAgPiBlbmQpIHsKKwkJc3RhdHVzX2xpbmVfYm9sZCgiVHJ5aW5nIHRvIGluc2VydCBmaWxlIG91dHNpZGUgb2YgbWVtb3J5Iik7CisJCWdvdG8gZmkwOworCX0KKworCS8vIHJlYWQgZmlsZSB0byBidWZmZXIKKwlmZCA9IG9wZW4oZm4sIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCXN0YXR1c19saW5lX2JvbGQoIlwiJXNcIiAlcyIsIGZuLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGZpMDsKKwl9CisJc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKKwlwICs9IHRleHRfaG9sZV9tYWtlKHAsIHNpemUpOworCWNudCA9IHNhZmVfcmVhZChmZCwgcCwgc2l6ZSk7CisJaWYgKGNudCA8IDApIHsKKwkJc3RhdHVzX2xpbmVfYm9sZCgiXCIlc1wiICVzIiwgZm4sIHN0cmVycm9yKGVycm5vKSk7CisJCXAgPSB0ZXh0X2hvbGVfZGVsZXRlKHAsIHAgKyBzaXplIC0gMSk7CS8vIHVuLWRvIGJ1ZmZlciBpbnNlcnQKKwl9IGVsc2UgaWYgKGNudCA8IHNpemUpIHsKKwkJLy8gVGhlcmUgd2FzIGEgcGFydGlhbCByZWFkLCBzaHJpbmsgdW51c2VkIHNwYWNlIHRleHRbXQorCQlwID0gdGV4dF9ob2xlX2RlbGV0ZShwICsgY250LCBwICsgKHNpemUgLSBjbnQpIC0gMSk7CS8vIHVuLWRvIGJ1ZmZlciBpbnNlcnQKKwkJc3RhdHVzX2xpbmVfYm9sZCgiY2FuJ3QgcmVhZCBhbGwgb2YgZmlsZSBcIiVzXCIiLCBmbik7CisJfQorCWlmIChjbnQgPj0gc2l6ZSkKKwkJZmlsZV9tb2RpZmllZCsrOworCWNsb3NlKGZkKTsKKyBmaTA6CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfUkVBRE9OTFkKKwlpZiAodXBkYXRlX3JvX3N0YXR1cworCSAmJiAoKGFjY2VzcyhmbiwgV19PSykgPCAwKSB8fAorCQkvKiByb290IHdpbGwgYWx3YXlzIGhhdmUgYWNjZXNzKCkKKwkJICogc28gd2UgY2hlY2sgZmlsZXBlcm1zIHRvbyAqLworCQkhKHN0YXRidWYuc3RfbW9kZSAmIChTX0lXVVNSIHwgU19JV0dSUCB8IFNfSVdPVEgpKQorCSAgICApCisJKSB7CisJCVNFVF9SRUFET05MWV9GSUxFKHJlYWRvbmx5X21vZGUpOworCX0KKyNlbmRpZgorCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgZmlsZV93cml0ZShjaGFyICpmbiwgY2hhciAqZmlyc3QsIGNoYXIgKmxhc3QpCit7CisJaW50IGZkLCBjbnQsIGNoYXJjbnQ7CisKKwlpZiAoZm4gPT0gMCkgeworCQlzdGF0dXNfbGluZV9ib2xkKCJObyBjdXJyZW50IGZpbGVuYW1lIik7CisJCXJldHVybiAtMjsKKwl9CisJLyogQnkgcG9wdWxhciByZXF1ZXN0IHdlIGRvIG5vdCBvcGVuIGZpbGUgd2l0aCBPX1RSVU5DLAorCSAqIGJ1dCBpbnN0ZWFkIGZ0cnVuY2F0ZSgpIGl0IF9hZnRlcl8gc3VjY2Vzc2Z1bCB3cml0ZS4KKwkgKiBNaWdodCByZWR1Y2UgYW1vdW50IG9mIGRhdGEgbG9zdCBvbiBwb3dlciBmYWlsIGV0Yy4KKwkgKi8KKwlmZCA9IG9wZW4oZm4sIChPX1dST05MWSB8IE9fQ1JFQVQpLCAwNjY2KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisJY250ID0gbGFzdCAtIGZpcnN0ICsgMTsKKwljaGFyY250ID0gZnVsbF93cml0ZShmZCwgZmlyc3QsIGNudCk7CisJZnRydW5jYXRlKGZkLCBjaGFyY250KTsKKwlpZiAoY2hhcmNudCA9PSBjbnQpIHsKKwkJLy8gZ29vZCB3cml0ZQorCQkvL2ZpbGVfbW9kaWZpZWQgPSBGQUxTRTsKKwl9IGVsc2UgeworCQljaGFyY250ID0gMDsKKwl9CisJY2xvc2UoZmQpOworCXJldHVybiBjaGFyY250OworfQorCisvLy0tLS0tIFRlcm1pbmFsIERyYXdpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgdGVybWluYWwgaXMgbWFkZSB1cCBvZiAncm93cycgbGluZSBvZiAnY29sdW1ucycgY29sdW1ucy4KKy8vIGNsYXNzaWNhbGx5IHRoaXMgd291bGQgYmUgMjQgeCA4MC4KKy8vICBzY3JlZW4gY29vcmRpbmF0ZXMKKy8vICAwLDAgICAgIC4uLiAgICAgMCw3OQorLy8gIDEsMCAgICAgLi4uICAgICAxLDc5CisvLyAgLiAgICAgICAuLi4gICAgIC4KKy8vICAuICAgICAgIC4uLiAgICAgLgorLy8gIDIyLDAgICAgLi4uICAgICAyMiw3OQorLy8gIDIzLDAgICAgLi4uICAgICAyMyw3OSAgIDwtIHN0YXR1cyBsaW5lCisKKy8vLS0tLS0gTW92ZSB0aGUgY3Vyc29yIHRvIHJvdyB4IGNvbCAoY291bnQgZnJvbSAwLCBub3QgMSkgLS0tLS0tLQorc3RhdGljIHZvaWQgcGxhY2VfY3Vyc29yKGludCByb3csIGludCBjb2wsIGludCBvcHRpbWl6ZSkKK3sKKwljaGFyIGNtMVtzaXplb2YoQ01yYykgKyBzaXplb2YoaW50KSozICogMl07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SCisJZW51bSB7CisJCVNaX1VQID0gc2l6ZW9mKENNdXApLAorCQlTWl9ETiA9IHNpemVvZihDTWRvd24pLAorCQlTRVFfU0laRSA9IFNaX1VQID4gU1pfRE4gPyBTWl9VUCA6IFNaX0ROLAorCX07CisJY2hhciBjbTJbU0VRX1NJWkUgKiA1ICsgMzJdOyAvLyBiaWdnZXIgdGhhbiB3b3JzdCBjYXNlIHNpemUKKyNlbmRpZgorCWNoYXIgKmNtOworCisJaWYgKHJvdyA8IDApIHJvdyA9IDA7CisJaWYgKHJvdyA+PSByb3dzKSByb3cgPSByb3dzIC0gMTsKKwlpZiAoY29sIDwgMCkgY29sID0gMDsKKwlpZiAoY29sID49IGNvbHVtbnMpIGNvbCA9IGNvbHVtbnMgLSAxOworCisJLy8tLS0tLSAxLiAgVHJ5IHRoZSBzdGFuZGFyZCB0ZXJtaW5hbCBFU0Mgc2VxdWVuY2UKKwlzcHJpbnRmKGNtMSwgQ01yYywgcm93ICsgMSwgY29sICsgMSk7CisJY20gPSBjbTE7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1IKKwlpZiAob3B0aW1pemUgJiYgY29sIDwgMTYpIHsKKwkJY2hhciAqc2NyZWVucDsKKwkJaW50IFJyb3cgPSBsYXN0X3JvdzsKKwkJaW50IGRpZmYgPSBScm93IC0gcm93OworCisJCWlmIChkaWZmIDwgLTUgfHwgZGlmZiA+IDUpCisJCQlnb3RvIHNraXA7CisKKwkJLy8tLS0tLSBmaW5kIHRoZSBtaW5pbXVtICMgb2YgY2hhcnMgdG8gbW92ZSBjdXJzb3IgLS0tLS0tLS0tLS0tLQorCQkvLy0tLS0tIDIuICBUcnkgbW92aW5nIHdpdGggZGlzY3JlZXQgY2hhcnMgKE5ld2xpbmUsIFtiYWNrXXNwYWNlLCAuLi4pCisJCWNtMlswXSA9ICdcMCc7CisKKwkJLy8gbW92ZSB0byB0aGUgY29ycmVjdCByb3cKKwkJd2hpbGUgKHJvdyA8IFJyb3cpIHsKKwkJCS8vIHRoZSBjdXJzb3IgaGFzIHRvIG1vdmUgdXAKKwkJCXN0cmNhdChjbTIsIENNdXApOworCQkJUnJvdy0tOworCQl9CisJCXdoaWxlIChyb3cgPiBScm93KSB7CisJCQkvLyB0aGUgY3Vyc29yIGhhcyB0byBtb3ZlIGRvd24KKwkJCXN0cmNhdChjbTIsIENNZG93bik7CisJCQlScm93Kys7CisJCX0KKworCQkvLyBub3cgbW92ZSB0byB0aGUgY29ycmVjdCBjb2x1bW4KKwkJc3RyY2F0KGNtMiwgIlxyIik7CQkJLy8gc3RhcnQgYXQgY29sIDAKKwkJLy8ganVzdCBzZW5kIG91dCBvcmlnbmFsIHNvdXJjZSBjaGFyIHRvIGdldCB0byBjb3JyZWN0IHBsYWNlCisJCXNjcmVlbnAgPSAmc2NyZWVuW3JvdyAqIGNvbHVtbnNdOwkvLyBzdGFydCBvZiBzY3JlZW4gbGluZQorCQlzdHJuY2F0KGNtMiwgc2NyZWVucCwgY29sKTsKKworCQkvLyBwaWNrIHRoZSBzaG9ydGVzdCBjdXJzb3IgbW90aW9uIHRvIHNlbmQgb3V0CisJCWlmIChzdHJsZW4oY20yKSA8IHN0cmxlbihjbSkpIHsKKwkJCWNtID0gY20yOworCQl9Cisgc2tpcDogOworCX0KKwlsYXN0X3JvdyA9IHJvdzsKKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX09QVElNSVpFX0NVUlNPUiAqLworCXdyaXRlMShjbSk7Cit9CisKKy8vLS0tLS0gRXJhc2UgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIGNsZWFyX3RvX2VvbCh2b2lkKQoreworCXdyaXRlMShDZW9sKTsgICAvLyBFcmFzZSBmcm9tIGN1cnNvciB0byBlbmQgb2YgbGluZQorfQorCitzdGF0aWMgdm9pZCBnb19ib3R0b21fYW5kX2NsZWFyX3RvX2VvbCh2b2lkKQoreworCXBsYWNlX2N1cnNvcihyb3dzIC0gMSwgMCwgRkFMU0UpOyAvLyBnbyB0byBib3R0b20gb2Ygc2NyZWVuCisJY2xlYXJfdG9fZW9sKCk7IC8vIGVyYXNlIHRvIGVuZCBvZiBsaW5lCit9CisKKy8vLS0tLS0gRXJhc2UgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIHNjcmVlbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgY2xlYXJfdG9fZW9zKHZvaWQpCit7CisJd3JpdGUxKENlb3MpOyAgIC8vIEVyYXNlIGZyb20gY3Vyc29yIHRvIGVuZCBvZiBzY3JlZW4KK30KKworLy8tLS0tLSBTdGFydCBzdGFuZG91dCBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgc3RhbmRvdXRfc3RhcnQodm9pZCkgLy8gc2VuZCAic3RhcnQgcmV2ZXJzZSB2aWRlbyIgc2VxdWVuY2UKK3sKKwl3cml0ZTEoU09zKTsgICAgIC8vIFN0YXJ0IHJldmVyc2UgdmlkZW8gbW9kZQorfQorCisvLy0tLS0tIEVuZCBzdGFuZG91dCBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBzdGFuZG91dF9lbmQodm9pZCkgLy8gc2VuZCAiZW5kIHJldmVyc2UgdmlkZW8iIHNlcXVlbmNlCit7CisJd3JpdGUxKFNPbik7ICAgICAvLyBFbmQgcmV2ZXJzZSB2aWRlbyBtb2RlCit9CisKKy8vLS0tLS0gRmxhc2ggdGhlIHNjcmVlbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIGZsYXNoKGludCBoKQoreworCXN0YW5kb3V0X3N0YXJ0KCk7CS8vIHNlbmQgInN0YXJ0IHJldmVyc2UgdmlkZW8iIHNlcXVlbmNlCisJcmVkcmF3KFRSVUUpOworCW15c2xlZXAoaCk7CisJc3RhbmRvdXRfZW5kKCk7CQkvLyBzZW5kICJlbmQgcmV2ZXJzZSB2aWRlbyIgc2VxdWVuY2UKKwlyZWRyYXcoVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkIEluZGljYXRlX0Vycm9yKHZvaWQpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCWlmIChjcmFzaG1lID4gMCkKKwkJcmV0dXJuOwkJCS8vIGdlbmVyYXRlIGEgcmFuZG9tIGNvbW1hbmQKKyNlbmRpZgorCWlmICghZXJyX21ldGhvZCkgeworCQl3cml0ZTEoYmVsbCk7ICAgLy8gc2VuZCBvdXQgYSBiZWxsIGNoYXJhY3RlcgorCX0gZWxzZSB7CisJCWZsYXNoKDEwKTsKKwl9Cit9CisKKy8vLS0tLS0gU2NyZWVuW10gUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0gRXJhc2UgdGhlIFNjcmVlbltdIG1lbW9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHNjcmVlbl9lcmFzZSh2b2lkKQoreworCW1lbXNldChzY3JlZW4sICcgJywgc2NyZWVuc2l6ZSk7CS8vIGNsZWFyIG5ldyBzY3JlZW4KK30KKworc3RhdGljIGludCBidWZzdW0oY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IHN1bSA9IDA7CisJY2hhciAqZSA9IGJ1ZiArIGNvdW50OworCisJd2hpbGUgKGJ1ZiA8IGUpCisJCXN1bSArPSAodW5zaWduZWQgY2hhcikgKmJ1ZisrOworCXJldHVybiBzdW07Cit9CisKKy8vLS0tLS0gRHJhdyB0aGUgc3RhdHVzIGxpbmUgYXQgYm90dG9tIG9mIHRoZSBzY3JlZW4gLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgc2hvd19zdGF0dXNfbGluZSh2b2lkKQoreworCWludCBjbnQgPSAwLCBja3N1bSA9IDA7CisKKwkvLyBlaXRoZXIgd2UgYWxyZWFkeSBoYXZlIGFuIGVycm9yIG9yIHN0YXR1cyBtZXNzYWdlLCBvciB3ZQorCS8vIGNyZWF0ZSBvbmUuCisJaWYgKCFoYXZlX3N0YXR1c19tc2cpIHsKKwkJY250ID0gZm9ybWF0X2VkaXRfc3RhdHVzKCk7CisJCWNrc3VtID0gYnVmc3VtKHN0YXR1c19idWZmZXIsIGNudCk7CisJfQorCWlmIChoYXZlX3N0YXR1c19tc2cgfHwgKChjbnQgPiAwICYmIGxhc3Rfc3RhdHVzX2Nrc3VtICE9IGNrc3VtKSkpIHsKKwkJbGFzdF9zdGF0dXNfY2tzdW0gPSBja3N1bTsJCS8vIHJlbWVtYmVyIGlmIHdlIGhhdmUgc2VlbiB0aGlzIGxpbmUKKwkJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwkJd3JpdGUxKHN0YXR1c19idWZmZXIpOworCQlpZiAoaGF2ZV9zdGF0dXNfbXNnKSB7CisJCQlpZiAoKChpbnQpc3RybGVuKHN0YXR1c19idWZmZXIpIC0gKGhhdmVfc3RhdHVzX21zZyAtIDEpKSA+CisJCQkJCShjb2x1bW5zIC0gMSkgKSB7CisJCQkJaGF2ZV9zdGF0dXNfbXNnID0gMDsKKwkJCQlIaXRfUmV0dXJuKCk7CisJCQl9CisJCQloYXZlX3N0YXR1c19tc2cgPSAwOworCQl9CisJCXBsYWNlX2N1cnNvcihjcm93LCBjY29sLCBGQUxTRSk7CS8vIHB1dCBjdXJzb3IgYmFjayBpbiBjb3JyZWN0IHBsYWNlCisJfQorCWZmbHVzaF9hbGwoKTsKK30KKworLy8tLS0tLSBmb3JtYXQgdGhlIHN0YXR1cyBidWZmZXIsIHRoZSBib3R0b20gbGluZSBvZiBzY3JlZW4gLS0tLS0tCisvLyBmb3JtYXQgc3RhdHVzIGJ1ZmZlciwgd2l0aCBTVEFORE9VVCBtb2RlCitzdGF0aWMgdm9pZCBzdGF0dXNfbGluZV9ib2xkKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJc3RyY3B5KHN0YXR1c19idWZmZXIsIFNPcyk7CS8vIFRlcm1pbmFsIHN0YW5kb3V0IG1vZGUgb24KKwl2c3ByaW50ZihzdGF0dXNfYnVmZmVyICsgc2l6ZW9mKFNPcyktMSwgZm9ybWF0LCBhcmdzKTsKKwlzdHJjYXQoc3RhdHVzX2J1ZmZlciwgU09uKTsJLy8gVGVybWluYWwgc3RhbmRvdXQgbW9kZSBvZmYKKwl2YV9lbmQoYXJncyk7CisKKwloYXZlX3N0YXR1c19tc2cgPSAxICsgc2l6ZW9mKFNPcykgKyBzaXplb2YoU09uKSAtIDI7Cit9CisKKy8vIGZvcm1hdCBzdGF0dXMgYnVmZmVyCitzdGF0aWMgdm9pZCBzdGF0dXNfbGluZShjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCXZzcHJpbnRmKHN0YXR1c19idWZmZXIsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJaGF2ZV9zdGF0dXNfbXNnID0gMTsKK30KKworLy8gY29weSBzIHRvIGJ1ZiwgY29udmVydCB1bnByaW50YWJsZQorc3RhdGljIHZvaWQgcHJpbnRfbGl0ZXJhbChjaGFyICpidWYsIGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAqZDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlidWZbMF0gPSAnXDAnOworCWlmICghc1swXSkKKwkJcyA9ICIoTlVMTCkiOworCisJZCA9IGJ1ZjsKKwlmb3IgKDsgKnM7IHMrKykgeworCQlpbnQgY19pc19ub19wcmludDsKKworCQljID0gKnM7CisJCWNfaXNfbm9fcHJpbnQgPSAoYyAmIDB4ODApICYmICFJc3ByaW50KGMpOworCQlpZiAoY19pc19ub19wcmludCkgeworCQkJc3RyY3B5KGQsIFNPbik7CisJCQlkICs9IHNpemVvZihTT24pLTE7CisJCQljID0gJy4nOworCQl9CisJCWlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgeworCQkJKmQrKyA9ICdeJzsKKwkJCWMgfD0gJ0AnOyAvKiAweDQwICovCisJCQlpZiAoYyA9PSAweDdmKQorCQkJCWMgPSAnPyc7CisJCX0KKwkJKmQrKyA9IGM7CisJCSpkID0gJ1wwJzsKKwkJaWYgKGNfaXNfbm9fcHJpbnQpIHsKKwkJCXN0cmNweShkLCBTT3MpOworCQkJZCArPSBzaXplb2YoU09zKS0xOworCQl9CisJCWlmICgqcyA9PSAnXG4nKSB7CisJCQkqZCsrID0gJyQnOworCQkJKmQgPSAnXDAnOworCQl9CisJCWlmIChkIC0gYnVmID4gTUFYX0lOUFVUX0xFTiAtIDEwKSAvLyBwYXJhbm9pYQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBub3RfaW1wbGVtZW50ZWQoY29uc3QgY2hhciAqcykKK3sKKwljaGFyIGJ1ZltNQVhfSU5QVVRfTEVOXTsKKworCXByaW50X2xpdGVyYWwoYnVmLCBzKTsKKwlzdGF0dXNfbGluZV9ib2xkKCJcJyVzXCcgaXMgbm90IGltcGxlbWVudGVkIiwgYnVmKTsKK30KKworLy8gc2hvdyBmaWxlIHN0YXR1cyBvbiBzdGF0dXMgbGluZQorc3RhdGljIGludCBmb3JtYXRfZWRpdF9zdGF0dXModm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBjbWRfbW9kZV9pbmRpY2F0b3JbXSBBTElHTjEgPSAiLUlSLSI7CisKKyNkZWZpbmUgdG90IGZvcm1hdF9lZGl0X3N0YXR1c19fdG90CisKKwlpbnQgY3VyLCBwZXJjZW50LCByZXQsIHRydW5jX2F0OworCisJLy8gZmlsZV9tb2RpZmllZCBpcyBub3cgYSBjb3VudGVyIHJhdGhlciB0aGFuIGEgZmxhZy4gIHRoaXMKKwkvLyBoZWxwcyByZWR1Y2UgdGhlIGFtb3VudCBvZiBsaW5lIGNvdW50aW5nIHdlIG5lZWQgdG8gZG8uCisJLy8gKHRoaXMgd2lsbCBjYXVzZSBhIG1pcy1yZXBvcnRpbmcgb2YgbW9kaWZpZWQgc3RhdHVzCisJLy8gb25jZSBldmVyeSBNQVhJTlQgZWRpdGluZyBvcGVyYXRpb25zLikKKworCS8vIGl0IHdvdWxkIGJlIG5pY2UgdG8gZG8gYSBzaW1pbGFyIG9wdGltaXphdGlvbiBoZXJlIC0tIGlmCisJLy8gd2UgaGF2ZW4ndCBkb25lIGEgbW90aW9uIHRoYXQgY291bGQgaGF2ZSBjaGFuZ2VkIHdoaWNoIGxpbmUKKwkvLyB3ZSdyZSBvbiwgdGhlbiB3ZSBzaG91bGRuJ3QgaGF2ZSB0byBkbyB0aGlzIGNvdW50X2xpbmVzKCkKKwljdXIgPSBjb3VudF9saW5lcyh0ZXh0LCBkb3QpOworCisJLy8gcmVkdWNlIGNvdW50aW5nIC0tIHRoZSB0b3RhbCBsaW5lcyBjYW4ndCBoYXZlCisJLy8gY2hhbmdlZCBpZiB3ZSBoYXZlbid0IGRvbmUgYW55IGVkaXRzLgorCWlmIChmaWxlX21vZGlmaWVkICE9IGxhc3RfZmlsZV9tb2RpZmllZCkgeworCQl0b3QgPSBjdXIgKyBjb3VudF9saW5lcyhkb3QsIGVuZCAtIDEpIC0gMTsKKwkJbGFzdF9maWxlX21vZGlmaWVkID0gZmlsZV9tb2RpZmllZDsKKwl9CisKKwkvLyAgICBjdXJyZW50IGxpbmUgICAgICAgICBwZXJjZW50CisJLy8gICAtLS0tLS0tLS0tLS0tICAgIH5+IC0tLS0tLS0tLS0KKwkvLyAgICB0b3RhbCBsaW5lcyAgICAgICAgICAgIDEwMAorCWlmICh0b3QgPiAwKSB7CisJCXBlcmNlbnQgPSAoMTAwICogY3VyKSAvIHRvdDsKKwl9IGVsc2UgeworCQljdXIgPSB0b3QgPSAwOworCQlwZXJjZW50ID0gMTAwOworCX0KKworCXRydW5jX2F0ID0gY29sdW1ucyA8IFNUQVRVU19CVUZGRVJfTEVOLTEgPworCQljb2x1bW5zIDogU1RBVFVTX0JVRkZFUl9MRU4tMTsKKworCXJldCA9IHNucHJpbnRmKHN0YXR1c19idWZmZXIsIHRydW5jX2F0KzEsCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfUkVBRE9OTFkKKwkJIiVjICVzJXMlcyAlZC8lZCAlZCUlIiwKKyNlbHNlCisJCSIlYyAlcyVzICVkLyVkICVkJSUiLAorI2VuZGlmCisJCWNtZF9tb2RlX2luZGljYXRvcltjbWRfbW9kZSAmIDNdLAorCQkoY3VycmVudF9maWxlbmFtZSAhPSBOVUxMID8gY3VycmVudF9maWxlbmFtZSA6ICJObyBmaWxlIiksCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfUkVBRE9OTFkKKwkJKHJlYWRvbmx5X21vZGUgPyAiIFtSZWFkb25seV0iIDogIiIpLAorI2VuZGlmCisJCShmaWxlX21vZGlmaWVkID8gIiBbTW9kaWZpZWRdIiA6ICIiKSwKKwkJY3VyLCB0b3QsIHBlcmNlbnQpOworCisJaWYgKHJldCA+PSAwICYmIHJldCA8IHRydW5jX2F0KQorCQlyZXR1cm4gcmV0OyAgLyogaXQgYWxsIGZpdCAqLworCisJcmV0dXJuIHRydW5jX2F0OyAgLyogaGFkIHRvIHRydW5jYXRlICovCisjdW5kZWYgdG90Cit9CisKKy8vLS0tLS0gRm9yY2UgcmVmcmVzaCBvZiBhbGwgTGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHJlZHJhdyhpbnQgZnVsbF9zY3JlZW4pCit7CisJcGxhY2VfY3Vyc29yKDAsIDAsIEZBTFNFKTsJLy8gcHV0IGN1cnNvciBpbiBjb3JyZWN0IHBsYWNlCisJY2xlYXJfdG9fZW9zKCk7CQkvLyB0ZWxsIHRlcm1pbmFsIHRvIGVyYXNlIGRpc3BsYXkKKwlzY3JlZW5fZXJhc2UoKTsJCS8vIGVyYXNlIHRoZSBpbnRlcm5hbCBzY3JlZW4gYnVmZmVyCisJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOwkvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJcmVmcmVzaChmdWxsX3NjcmVlbik7CS8vIHRoaXMgd2lsbCByZWRyYXcgdGhlIGVudGlyZSBkaXNwbGF5CisJc2hvd19zdGF0dXNfbGluZSgpOworfQorCisvLy0tLS0tIEZvcm1hdCBhIHRleHRbXSBsaW5lIGludG8gYSBidWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgY2hhciogZm9ybWF0X2xpbmUoY2hhciAqc3JjIC8qLCBpbnQgbGkqLykKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJaW50IGNvOworCWludCBvZnMgPSBvZmZzZXQ7CisJY2hhciAqZGVzdCA9IHNjcl9vdXRfYnVmOyAvLyBbTUFYX1NDUl9DT0xTICsgTUFYX1RBQlNUT1AgKiAyXQorCisJYyA9ICd+JzsgLy8gY2hhciBpbiBjb2wgMCBpbiBub24tZXhpc3RlbnQgbGluZXMgaXMgJ34nCisJY28gPSAwOworCXdoaWxlIChjbyA8IGNvbHVtbnMgKyB0YWJzdG9wKSB7CisJCS8vIGhhdmUgd2UgZ29uZSBwYXN0IHRoZSBlbmQ/CisJCWlmIChzcmMgPCBlbmQpIHsKKwkJCWMgPSAqc3JjKys7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCWJyZWFrOworCQkJaWYgKChjICYgMHg4MCkgJiYgIUlzcHJpbnQoYykpIHsKKwkJCQljID0gJy4nOworCQkJfQorCQkJaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKSB7CisJCQkJaWYgKGMgPT0gJ1x0JykgeworCQkJCQljID0gJyAnOworCQkJCQkvLyAgICAgIGNvICUgICAgOCAgICAgIT0gICAgIDcKKwkJCQkJd2hpbGUgKChjbyAlIHRhYnN0b3ApICE9ICh0YWJzdG9wIC0gMSkpIHsKKwkJCQkJCWRlc3RbY28rK10gPSBjOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZGVzdFtjbysrXSA9ICdeJzsKKwkJCQkJaWYgKGMgPT0gMHg3ZikKKwkJCQkJCWMgPSAnPyc7CisJCQkJCWVsc2UKKwkJCQkJCWMgKz0gJ0AnOyAvLyBDdHJsLVggLT4gJ1gnCisJCQkJfQorCQkJfQorCQl9CisJCWRlc3RbY28rK10gPSBjOworCQkvLyBkaXNjYXJkIHNjcm9sbGVkLW9mZi10by10aGUtbGVmdCBwb3J0aW9uLAorCQkvLyBpbiB0YWJzdG9wLXNpemVkIHBpZWNlcworCQlpZiAob2ZzID49IHRhYnN0b3AgJiYgY28gPj0gdGFic3RvcCkgeworCQkJbWVtbW92ZShkZXN0LCBkZXN0ICsgdGFic3RvcCwgY28pOworCQkJY28gLT0gdGFic3RvcDsKKwkJCW9mcyAtPSB0YWJzdG9wOworCQl9CisJCWlmIChzcmMgPj0gZW5kKQorCQkJYnJlYWs7CisJfQorCS8vIGNoZWNrICJzaG9ydCBsaW5lLCBnaWdhbnRpYyBvZmZzZXQiIGNhc2UKKwlpZiAoY28gPCBvZnMpCisJCW9mcyA9IGNvOworCS8vIGRpc2NhcmQgbGFzdCBzY3JvbGxlZCBvZmYgcGFydAorCWNvIC09IG9mczsKKwlkZXN0ICs9IG9mczsKKwkvLyBmaWxsIHRoZSByZXN0IHdpdGggc3BhY2VzCisJaWYgKGNvIDwgY29sdW1ucykKKwkJbWVtc2V0KCZkZXN0W2NvXSwgJyAnLCBjb2x1bW5zIC0gY28pOworCXJldHVybiBkZXN0OworfQorCisvLy0tLS0tIFJlZnJlc2ggdGhlIGNoYW5nZWQgc2NyZWVuIGxpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb3B5IHRoZSBzb3VyY2UgbGluZSBmcm9tIHRleHRbXSBpbnRvIHRoZSBidWZmZXIgYW5kIG5vdGUKKy8vIGlmIHRoZSBjdXJyZW50IHNjcmVlbmxpbmUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG5ldyBidWZmZXIuCisvLyBJZiB0aGV5IGRpZmZlciB0aGVuIHRoYXQgbGluZSBuZWVkcyByZWRyYXdpbmcgb24gdGhlIHRlcm1pbmFsLgorLy8KK3N0YXRpYyB2b2lkIHJlZnJlc2goaW50IGZ1bGxfc2NyZWVuKQoreworI2RlZmluZSBvbGRfb2Zmc2V0IHJlZnJlc2hfX29sZF9vZmZzZXQKKworCWludCBsaSwgY2hhbmdlZDsKKwljaGFyICp0cCwgKnNwOwkJLy8gcG9pbnRlciBpbnRvIHRleHRbXSBhbmQgc2NyZWVuW10KKworCWlmIChFTkFCTEVfRkVBVFVSRV9WSV9XSU5fUkVTSVpFIElGX0ZFQVRVUkVfVklfQVNLX1RFUk1JTkFMKCYmICFHLmdldF9yb3djb2xfZXJyb3IpICkgeworCQl1bnNpZ25lZCBjID0gY29sdW1ucywgciA9IHJvd3M7CisJCXF1ZXJ5X3NjcmVlbl9kaW1lbnNpb25zKCk7CisJCWZ1bGxfc2NyZWVuIHw9IChjIC0gY29sdW1ucykgfCAociAtIHJvd3MpOworCX0KKwlzeW5jX2N1cnNvcihkb3QsICZjcm93LCAmY2NvbCk7CS8vIHdoZXJlIGN1cnNvciB3aWxsIGJlIChvbiAiZG90IikKKwl0cCA9IHNjcmVlbmJlZ2luOwkvLyBpbmRleCBpbnRvIHRleHRbXSBvZiB0b3AgbGluZQorCisJLy8gY29tcGFyZSB0ZXh0W10gdG8gc2NyZWVuW10gYW5kIG1hcmsgc2NyZWVuW10gbGluZXMgdGhhdCBuZWVkIHVwZGF0aW5nCisJZm9yIChsaSA9IDA7IGxpIDwgcm93cyAtIDE7IGxpKyspIHsKKwkJaW50IGNzLCBjZTsJCQkJLy8gY29sdW1uIHN0YXJ0ICYgZW5kCisJCWNoYXIgKm91dF9idWY7CisJCS8vIGZvcm1hdCBjdXJyZW50IHRleHQgbGluZQorCQlvdXRfYnVmID0gZm9ybWF0X2xpbmUodHAgLyosIGxpKi8pOworCisJCS8vIHNraXAgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0ZXh0W10gbGluZQorCQlpZiAodHAgPCBlbmQpIHsKKwkJCWNoYXIgKnQgPSBtZW1jaHIodHAsICdcbicsIGVuZCAtIHRwKTsKKwkJCWlmICghdCkgdCA9IGVuZCAtIDE7CisJCQl0cCA9IHQgKyAxOworCQl9CisKKwkJLy8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyBiZXR3ZWVuIHZpdHVhbCBzY3JlZW4gYW5kIG91dF9idWYKKwkJY2hhbmdlZCA9IEZBTFNFOwkvLyBhc3N1bWUgbm8gY2hhbmdlCisJCWNzID0gMDsKKwkJY2UgPSBjb2x1bW5zIC0gMTsKKwkJc3AgPSAmc2NyZWVuW2xpICogY29sdW1uc107CS8vIHN0YXJ0IG9mIHNjcmVlbiBsaW5lCisJCWlmIChmdWxsX3NjcmVlbikgeworCQkJLy8gZm9yY2UgcmUtZHJhdyBvZiBldmVyeSBzaW5nbGUgY29sdW1uIGZyb20gMCAtIGNvbHVtbnMtMQorCQkJZ290byByZTA7CisJCX0KKwkJLy8gY29tcGFyZSBuZXdseSBmb3JtYXR0ZWQgYnVmZmVyIHdpdGggdmlydHVhbCBzY3JlZW4KKwkJLy8gbG9vayBmb3J3YXJkIGZvciBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gYnVmIGFuZCBzY3JlZW4KKwkJZm9yICg7IGNzIDw9IGNlOyBjcysrKSB7CisJCQlpZiAob3V0X2J1Zltjc10gIT0gc3BbY3NdKSB7CisJCQkJY2hhbmdlZCA9IFRSVUU7CS8vIG1hcmsgZm9yIHJlZHJhdworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gbG9vayBiYWNrd2FyZCBmb3IgbGFzdCBkaWZmZXJlbmNlIGJldHdlZW4gb3V0X2J1ZiBhbmQgc2NyZWVuCisJCWZvciAoOyBjZSA+PSBjczsgY2UtLSkgeworCQkJaWYgKG91dF9idWZbY2VdICE9IHNwW2NlXSkgeworCQkJCWNoYW5nZWQgPSBUUlVFOwkvLyBtYXJrIGZvciByZWRyYXcKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvLyBub3csIGNzIGlzIGluZGV4IG9mIGZpcnN0IGRpZmYsIGFuZCBjZSBpcyBpbmRleCBvZiBsYXN0IGRpZmYKKworCQkvLyBpZiBob3J6IG9mZnNldCBoYXMgY2hhbmdlZCwgZm9yY2UgYSByZWRyYXcKKwkJaWYgKG9mZnNldCAhPSBvbGRfb2Zmc2V0KSB7CisgcmUwOgorCQkJY2hhbmdlZCA9IFRSVUU7CisJCX0KKworCQkvLyBtYWtlIGEgc2FuaXR5IGNoZWNrIG9mIGNvbHVtbnMgaW5kZXhlcworCQlpZiAoY3MgPCAwKSBjcyA9IDA7CisJCWlmIChjZSA+IGNvbHVtbnMgLSAxKSBjZSA9IGNvbHVtbnMgLSAxOworCQlpZiAoY3MgPiBjZSkgeyBjcyA9IDA7IGNlID0gY29sdW1ucyAtIDE7IH0KKwkJLy8gaXMgdGhlcmUgYSBjaGFuZ2UgYmV0d2VlbiB2aXR1YWwgc2NyZWVuIGFuZCBvdXRfYnVmCisJCWlmIChjaGFuZ2VkKSB7CisJCQkvLyBjb3B5IGNoYW5nZWQgcGFydCBvZiBidWZmZXIgdG8gdmlydHVhbCBzY3JlZW4KKwkJCW1lbWNweShzcCtjcywgb3V0X2J1ZitjcywgY2UtY3MrMSk7CisKKwkJCS8vIG1vdmUgY3Vyc29yIHRvIGNvbHVtbiBvZiBmaXJzdCBjaGFuZ2UKKwkJCS8vaWYgKG9mZnNldCAhPSBvbGRfb2Zmc2V0KSB7CisJCQkvLwkvLyBwbGFjZV9jdXJzb3IgaXMgc3RpbGwgdG9vIHN0dXBpZAorCQkJLy8JLy8gdG8gaGFuZGxlIG9mZnNldHMgY29ycmVjdGx5CisJCQkvLwlwbGFjZV9jdXJzb3IobGksIGNzLCBGQUxTRSk7CisJCQkvL30gZWxzZSB7CisJCQkJcGxhY2VfY3Vyc29yKGxpLCBjcywgVFJVRSk7CisJCQkvL30KKworCQkJLy8gd3JpdGUgbGluZSBvdXQgdG8gdGVybWluYWwKKwkJCWZ3cml0ZSgmc3BbY3NdLCBjZSAtIGNzICsgMSwgMSwgc3Rkb3V0KTsKKwkJfQorCX0KKworCXBsYWNlX2N1cnNvcihjcm93LCBjY29sLCBUUlVFKTsKKworCW9sZF9vZmZzZXQgPSBvZmZzZXQ7CisjdW5kZWYgb2xkX29mZnNldAorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8tLS0tLSB0aGUgQXNjaWkgQ2hhcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgMDAgbnVsICAgMDEgc29oICAgMDIgc3R4ICAgMDMgZXR4ICAgMDQgZW90ICAgMDUgZW5xICAgMDYgYWNrICAgMDcgYmVsCisvLyAgMDggYnMgICAgMDkgaHQgICAgMGEgbmwgICAgMGIgdnQgICAgMGMgbnAgICAgMGQgY3IgICAgMGUgc28gICAgMGYgc2kKKy8vICAxMCBkbGUgICAxMSBkYzEgICAxMiBkYzIgICAxMyBkYzMgICAxNCBkYzQgICAxNSBuYWsgICAxNiBzeW4gICAxNyBldGIKKy8vICAxOCBjYW4gICAxOSBlbSAgICAxYSBzdWIgICAxYiBlc2MgICAxYyBmcyAgICAxZCBncyAgICAxZSBycyAgICAxZiB1cworLy8gIDIwIHNwICAgIDIxICEgICAgIDIyICIgICAgIDIzICMgICAgIDI0ICQgICAgIDI1ICUgICAgIDI2ICYgICAgIDI3ICcKKy8vICAyOCAoICAgICAyOSApICAgICAyYSAqICAgICAyYiArICAgICAyYyAsICAgICAyZCAtICAgICAyZSAuICAgICAyZiAvCisvLyAgMzAgMCAgICAgMzEgMSAgICAgMzIgMiAgICAgMzMgMyAgICAgMzQgNCAgICAgMzUgNSAgICAgMzYgNiAgICAgMzcgNworLy8gIDM4IDggICAgIDM5IDkgICAgIDNhIDogICAgIDNiIDsgICAgIDNjIDwgICAgIDNkID0gICAgIDNlID4gICAgIDNmID8KKy8vICA0MCBAICAgICA0MSBBICAgICA0MiBCICAgICA0MyBDICAgICA0NCBEICAgICA0NSBFICAgICA0NiBGICAgICA0NyBHCisvLyAgNDggSCAgICAgNDkgSSAgICAgNGEgSiAgICAgNGIgSyAgICAgNGMgTCAgICAgNGQgTSAgICAgNGUgTiAgICAgNGYgTworLy8gIDUwIFAgICAgIDUxIFEgICAgIDUyIFIgICAgIDUzIFMgICAgIDU0IFQgICAgIDU1IFUgICAgIDU2IFYgICAgIDU3IFcKKy8vICA1OCBYICAgICA1OSBZICAgICA1YSBaICAgICA1YiBbICAgICA1YyBcICAgICA1ZCBdICAgICA1ZSBeICAgICA1ZiBfCisvLyAgNjAgYCAgICAgNjEgYSAgICAgNjIgYiAgICAgNjMgYyAgICAgNjQgZCAgICAgNjUgZSAgICAgNjYgZiAgICAgNjcgZworLy8gIDY4IGggICAgIDY5IGkgICAgIDZhIGogICAgIDZiIGsgICAgIDZjIGwgICAgIDZkIG0gICAgIDZlIG4gICAgIDZmIG8KKy8vICA3MCBwICAgICA3MSBxICAgICA3MiByICAgICA3MyBzICAgICA3NCB0ICAgICA3NSB1ICAgICA3NiB2ICAgICA3NyB3CisvLyAgNzggeCAgICAgNzkgeSAgICAgN2EgeiAgICAgN2IgeyAgICAgN2MgfCAgICAgN2QgfSAgICAgN2UgfiAgICAgN2YgZGVsCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tIEV4ZWN1dGUgYSBWaSBDb21tYW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBkb19jbWQoaW50IGMpCit7CisJY29uc3QgY2hhciAqbXNnID0gbXNnOyAvLyBmb3IgY29tcGlsZXIKKwljaGFyICpwLCAqcSwgKnNhdmVfZG90OworCWNoYXIgYnVmWzEyXTsKKwlpbnQgZGlyOworCWludCBjbnQsIGksIGo7CisJaW50IGMxOworCisvLwljMSA9IGM7IC8vIHF1aWV0IHRoZSBjb21waWxlcgorLy8JY250ID0geWYgPSAwOyAvLyBxdWlldCB0aGUgY29tcGlsZXIKKy8vCW1zZyA9IHAgPSBxID0gc2F2ZV9kb3QgPSBidWY7IC8vIHF1aWV0IHRoZSBjb21waWxlcgorCW1lbXNldChidWYsICdcMCcsIDEyKTsKKworCXNob3dfc3RhdHVzX2xpbmUoKTsKKworCS8qIGlmIHRoaXMgaXMgYSBjdXJzb3Iga2V5LCBza2lwIHRoZXNlIGNoZWNrcyAqLworCXN3aXRjaCAoYykgeworCQljYXNlIEtFWUNPREVfVVA6CisJCWNhc2UgS0VZQ09ERV9ET1dOOgorCQljYXNlIEtFWUNPREVfTEVGVDoKKwkJY2FzZSBLRVlDT0RFX1JJR0hUOgorCQljYXNlIEtFWUNPREVfSE9NRToKKwkJY2FzZSBLRVlDT0RFX0VORDoKKwkJY2FzZSBLRVlDT0RFX1BBR0VVUDoKKwkJY2FzZSBLRVlDT0RFX1BBR0VET1dOOgorCQljYXNlIEtFWUNPREVfREVMRVRFOgorCQkJZ290byBrZXlfY21kX21vZGU7CisJfQorCisJaWYgKGNtZF9tb2RlID09IDIpIHsKKwkJLy8gIGZsaXAtZmxvcCBJbnNlcnQvUmVwbGFjZSBtb2RlCisJCWlmIChjID09IEtFWUNPREVfSU5TRVJUKQorCQkJZ290byBkY19pOworCQkvLyB3ZSBhcmUgJ1InZXBsYWNpbmcgdGhlIGN1cnJlbnQgKmRvdCB3aXRoIG5ldyBjaGFyCisJCWlmICgqZG90ID09ICdcbicpIHsKKwkJCS8vIGRvbid0IFJlcGxhY2UgcGFzdCBFLW8tbAorCQkJY21kX21vZGUgPSAxOwkvLyBjb252ZXJ0IHRvIGluc2VydAorCQl9IGVsc2UgeworCQkJaWYgKDEgPD0gYyB8fCBJc3ByaW50KGMpKSB7CisJCQkJaWYgKGMgIT0gMjcpCisJCQkJCWRvdCA9IHlhbmtfZGVsZXRlKGRvdCwgZG90LCAwLCBZQU5LREVMKTsJLy8gZGVsZXRlIGNoYXIKKwkJCQlkb3QgPSBjaGFyX2luc2VydChkb3QsIGMpOwkvLyBpbnNlcnQgbmV3IGNoYXIKKwkJCX0KKwkJCWdvdG8gZGMxOworCQl9CisJfQorCWlmIChjbWRfbW9kZSA9PSAxKSB7CisJCS8vICBoaXR0aW5nICJJbnNlcnQiIHR3aWNlIG1lYW5zICJSIiByZXBsYWNlIG1vZGUKKwkJaWYgKGMgPT0gS0VZQ09ERV9JTlNFUlQpIGdvdG8gZGM1OworCQkvLyBpbnNlcnQgdGhlIGNoYXIgYyBhdCAiZG90IgorCQlpZiAoMSA8PSBjIHx8IElzcHJpbnQoYykpIHsKKwkJCWRvdCA9IGNoYXJfaW5zZXJ0KGRvdCwgYyk7CisJCX0KKwkJZ290byBkYzE7CisJfQorCisga2V5X2NtZF9tb2RlOgorCXN3aXRjaCAoYykgeworCQkvL2Nhc2UgMHgwMToJLy8gc29oCisJCS8vY2FzZSAweDA5OgkvLyBodAorCQkvL2Nhc2UgMHgwYjoJLy8gdnQKKwkJLy9jYXNlIDB4MGU6CS8vIHNvCisJCS8vY2FzZSAweDBmOgkvLyBzaQorCQkvL2Nhc2UgMHgxMDoJLy8gZGxlCisJCS8vY2FzZSAweDExOgkvLyBkYzEKKwkJLy9jYXNlIDB4MTM6CS8vIGRjMworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwljYXNlIDB4MTQ6CQkJLy8gZGM0ICBjdHJsLVQKKwkJY3Jhc2htZSA9IChjcmFzaG1lID09IDApID8gMSA6IDA7CisJCWJyZWFrOworI2VuZGlmCisJCS8vY2FzZSAweDE2OgkvLyBzeW4KKwkJLy9jYXNlIDB4MTc6CS8vIGV0YgorCQkvL2Nhc2UgMHgxODoJLy8gY2FuCisJCS8vY2FzZSAweDFjOgkvLyBmcworCQkvL2Nhc2UgMHgxZDoJLy8gZ3MKKwkJLy9jYXNlIDB4MWU6CS8vIHJzCisJCS8vY2FzZSAweDFmOgkvLyB1cworCQkvL2Nhc2UgJyEnOgkvLyAhLQorCQkvL2Nhc2UgJyMnOgkvLyAjLQorCQkvL2Nhc2UgJyYnOgkvLyAmLQorCQkvL2Nhc2UgJygnOgkvLyAoLQorCQkvL2Nhc2UgJyknOgkvLyApLQorCQkvL2Nhc2UgJyonOgkvLyAqLQorCQkvL2Nhc2UgJz0nOgkvLyA9LQorCQkvL2Nhc2UgJ0AnOgkvLyBALQorCQkvL2Nhc2UgJ0YnOgkvLyBGLQorCQkvL2Nhc2UgJ0snOgkvLyBLLQorCQkvL2Nhc2UgJ1EnOgkvLyBRLQorCQkvL2Nhc2UgJ1MnOgkvLyBTLQorCQkvL2Nhc2UgJ1QnOgkvLyBULQorCQkvL2Nhc2UgJ1YnOgkvLyBWLQorCQkvL2Nhc2UgJ1snOgkvLyBbLQorCQkvL2Nhc2UgJ1xcJzoJLy8gXC0KKwkJLy9jYXNlICddJzoJLy8gXS0KKwkJLy9jYXNlICdfJzoJLy8gXy0KKwkJLy9jYXNlICdgJzoJLy8gYC0KKwkJLy9jYXNlICd1JzoJLy8gdS0gRklYTUUtIHRoZXJlIGlzIG5vIHVuZG8KKwkJLy9jYXNlICd2JzoJLy8gdi0KKwlkZWZhdWx0OgkJCS8vIHVucmVjb2duaXplZCBjb21tYW5kCisJCWJ1ZlswXSA9IGM7CisJCWJ1ZlsxXSA9ICdcMCc7CisJCW5vdF9pbXBsZW1lbnRlZChidWYpOworCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCWNhc2UgMHgwMDoJCQkvLyBudWwtIGlnbm9yZQorCQlicmVhazsKKwljYXNlIDI6CQkJLy8gY3RybC1CICBzY3JvbGwgdXAgICBmdWxsIHNjcmVlbgorCWNhc2UgS0VZQ09ERV9QQUdFVVA6CS8vIEN1cnNvciBLZXkgUGFnZSBVcAorCQlkb3Rfc2Nyb2xsKHJvd3MgLSAyLCAtMSk7CisJCWJyZWFrOworCWNhc2UgNDoJCQkvLyBjdHJsLUQgIHNjcm9sbCBkb3duIGhhbGYgc2NyZWVuCisJCWRvdF9zY3JvbGwoKHJvd3MgLSAyKSAvIDIsIDEpOworCQlicmVhazsKKwljYXNlIDU6CQkJLy8gY3RybC1FICBzY3JvbGwgZG93biBvbmUgbGluZQorCQlkb3Rfc2Nyb2xsKDEsIDEpOworCQlicmVhazsKKwljYXNlIDY6CQkJLy8gY3RybC1GICBzY3JvbGwgZG93biBmdWxsIHNjcmVlbgorCWNhc2UgS0VZQ09ERV9QQUdFRE9XTjoJLy8gQ3Vyc29yIEtleSBQYWdlIERvd24KKwkJZG90X3Njcm9sbChyb3dzIC0gMiwgMSk7CisJCWJyZWFrOworCWNhc2UgNzoJCQkvLyBjdHJsLUcgIHNob3cgY3VycmVudCBzdGF0dXMKKwkJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOwkvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJCWJyZWFrOworCWNhc2UgJ2gnOgkJCS8vIGgtIG1vdmUgbGVmdAorCWNhc2UgS0VZQ09ERV9MRUZUOgkvLyBjdXJzb3Iga2V5IExlZnQKKwljYXNlIDg6CQkvLyBjdHJsLUgtIG1vdmUgbGVmdCAgICAoVGhpcyBtYXkgYmUgRVJBU0UgY2hhcikKKwljYXNlIDB4N2Y6CS8vIERFTC0gbW92ZSBsZWZ0ICAgKFRoaXMgbWF5IGJlIEVSQVNFIGNoYXIpCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkb3RfbGVmdCgpOworCQlicmVhazsKKwljYXNlIDEwOgkJCS8vIE5ld2xpbmUgXkoKKwljYXNlICdqJzoJCQkvLyBqLSBnb3RvIG5leHQgbGluZSwgc2FtZSBjb2wKKwljYXNlIEtFWUNPREVfRE9XTjoJLy8gY3Vyc29yIGtleSBEb3duCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkb3RfbmV4dCgpOwkJLy8gZ28gdG8gbmV4dCBCLW8tbAorCQlkb3QgPSBtb3ZlX3RvX2NvbChkb3QsIGNjb2wgKyBvZmZzZXQpOwkvLyB0cnkgc3RheSBpbiBzYW1lIGNvbAorCQlicmVhazsKKwljYXNlIDEyOgkJCS8vIGN0cmwtTCAgZm9yY2UgcmVkcmF3IHdob2xlIHNjcmVlbgorCWNhc2UgMTg6CQkJLy8gY3RybC1SICBmb3JjZSByZWRyYXcKKwkJcGxhY2VfY3Vyc29yKDAsIDAsIEZBTFNFKTsJLy8gcHV0IGN1cnNvciBpbiBjb3JyZWN0IHBsYWNlCisJCWNsZWFyX3RvX2VvcygpOwkvLyB0ZWwgdGVybWluYWwgdG8gZXJhc2UgZGlzcGxheQorCQlteXNsZWVwKDEwKTsKKwkJc2NyZWVuX2VyYXNlKCk7CS8vIGVyYXNlIHRoZSBpbnRlcm5hbCBzY3JlZW4gYnVmZmVyCisJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCQlyZWZyZXNoKFRSVUUpOwkvLyB0aGlzIHdpbGwgcmVkcmF3IHRoZSBlbnRpcmUgZGlzcGxheQorCQlicmVhazsKKwljYXNlIDEzOgkJCS8vIENhcnJpYWdlIFJldHVybiBeTQorCWNhc2UgJysnOgkJCS8vICstIGdvdG8gbmV4dCBsaW5lCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkb3RfbmV4dCgpOworCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCWJyZWFrOworCWNhc2UgMjE6CQkJLy8gY3RybC1VICBzY3JvbGwgdXAgICBoYWxmIHNjcmVlbgorCQlkb3Rfc2Nyb2xsKChyb3dzIC0gMikgLyAyLCAtMSk7CisJCWJyZWFrOworCWNhc2UgMjU6CQkJLy8gY3RybC1ZICBzY3JvbGwgdXAgb25lIGxpbmUKKwkJZG90X3Njcm9sbCgxLCAtMSk7CisJCWJyZWFrOworCWNhc2UgMjc6CQkJLy8gZXNjCisJCWlmIChjbWRfbW9kZSA9PSAwKQorCQkJaW5kaWNhdGVfZXJyb3IoYyk7CisJCWNtZF9tb2RlID0gMDsJLy8gc3RvcCBpbnNydGluZworCQllbmRfY21kX3EoKTsKKwkJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOwkvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJCWJyZWFrOworCWNhc2UgJyAnOgkJCS8vIG1vdmUgcmlnaHQKKwljYXNlICdsJzoJCQkvLyBtb3ZlIHJpZ2h0CisJY2FzZSBLRVlDT0RFX1JJR0hUOgkvLyBDdXJzb3IgS2V5IFJpZ2h0CisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkb3RfcmlnaHQoKTsKKwkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwljYXNlICciJzoJCQkvLyAiLSBuYW1lIGEgcmVnaXN0ZXIgdG8gdXNlIGZvciBEZWxldGUvWWFuaworCQljMSA9IChnZXRfb25lX2NoYXIoKSB8IDB4MjApIC0gJ2EnOyAvLyB8IDB4MjAgaXMgdG9sb3dlcigpCisJCWlmICgodW5zaWduZWQpYzEgPD0gMjUpIHsgLy8gYS16PworCQkJWURyZWcgPSBjMTsKKwkJfSBlbHNlIHsKKwkJCWluZGljYXRlX2Vycm9yKGMpOworCQl9CisJCWJyZWFrOworCWNhc2UgJ1wnJzoJCQkvLyAnLSBnb3RvIGEgc3BlY2lmaWMgbWFyaworCQljMSA9IChnZXRfb25lX2NoYXIoKSB8IDB4MjApIC0gJ2EnOworCQlpZiAoKHVuc2lnbmVkKWMxIDw9IDI1KSB7IC8vIGEtej8KKwkJCS8vIGdldCB0aGUgYi1vLWwKKwkJCXEgPSBtYXJrW2MxXTsKKwkJCWlmICh0ZXh0IDw9IHEgJiYgcSA8IGVuZCkgeworCQkJCWRvdCA9IHE7CisJCQkJZG90X2JlZ2luKCk7CS8vIGdvIHRvIEItby1sCisJCQkJZG90X3NraXBfb3Zlcl93cygpOworCQkJfQorCQl9IGVsc2UgaWYgKGMxID09ICdcJycpIHsJLy8gZ290byBwcmV2aW91cyBjb250ZXh0CisJCQlkb3QgPSBzd2FwX2NvbnRleHQoZG90KTsJLy8gc3dhcCBjdXJyZW50IGFuZCBwcmV2aW91cyBjb250ZXh0CisJCQlkb3RfYmVnaW4oKTsJLy8gZ28gdG8gQi1vLWwKKwkJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJfSBlbHNlIHsKKwkJCWluZGljYXRlX2Vycm9yKGMpOworCQl9CisJCWJyZWFrOworCWNhc2UgJ20nOgkJCS8vIG0tIE1hcmsgYSBsaW5lCisJCS8vIHRoaXMgaXMgcmVhbGx5IHN0dXBpZC4gIElmIHRoZXJlIGFyZSBhbnkgaW5zZXJ0cyBvciBkZWxldGVzCisJCS8vIGJldHdlZW4gdGV4dFswXSBhbmQgZG90IHRoZW4gdGhpcyBtYXJrIHdpbGwgbm90IHBvaW50IHRvIHRoZQorCQkvLyBjb3JyZWN0IGxvY2F0aW9uISBJdCBjb3VsZCBiZSBvZmYgYnkgbWFueSBsaW5lcyEKKwkJLy8gV2VsbC4uLiwgYXQgbGVhc3QgaXRzIHF1aWNrIGFuZCBkaXJ0eS4KKwkJYzEgPSAoZ2V0X29uZV9jaGFyKCkgfCAweDIwKSAtICdhJzsKKwkJaWYgKCh1bnNpZ25lZCljMSA8PSAyNSkgeyAvLyBhLXo/CisJCQkvLyByZW1lbWJlciB0aGUgbGluZQorCQkJbWFya1tjMV0gPSBkb3Q7CisJCX0gZWxzZSB7CisJCQlpbmRpY2F0ZV9lcnJvcihjKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdQJzoJCQkvLyBQLSBQdXQgcmVnaXN0ZXIgYmVmb3JlCisJY2FzZSAncCc6CQkJLy8gcC0gcHV0IHJlZ2lzdGVyIGFmdGVyCisJCXAgPSByZWdbWURyZWddOworCQlpZiAocCA9PSBOVUxMKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJOb3RoaW5nIGluIHJlZ2lzdGVyICVjIiwgd2hhdF9yZWcoKSk7CisJCQlicmVhazsKKwkJfQorCQkvLyBhcmUgd2UgcHV0dGluZyB3aG9sZSBsaW5lcyBvciBzdHJpbmdzCisJCWlmIChzdHJjaHIocCwgJ1xuJykgIT0gTlVMTCkgeworCQkJaWYgKGMgPT0gJ1AnKSB7CisJCQkJZG90X2JlZ2luKCk7CS8vIHB1dHRpbmcgbGluZXMtIFB1dCBhYm92ZQorCQkJfQorCQkJaWYgKGMgPT0gJ3AnKSB7CisJCQkJLy8gYXJlIHdlIHB1dHRpbmcgYWZ0ZXIgdmVyeSBsYXN0IGxpbmU/CisJCQkJaWYgKGVuZF9saW5lKGRvdCkgPT0gKGVuZCAtIDEpKSB7CisJCQkJCWRvdCA9IGVuZDsJLy8gZm9yY2UgZG90IHRvIGVuZCBvZiB0ZXh0W10KKwkJCQl9IGVsc2UgeworCQkJCQlkb3RfbmV4dCgpOwkvLyBuZXh0IGxpbmUsIHRoZW4gcHV0IGJlZm9yZQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjID09ICdwJykKKwkJCQlkb3RfcmlnaHQoKTsJLy8gbW92ZSB0byByaWdodCwgY2FuIG1vdmUgdG8gTkwKKwkJfQorCQlzdHJpbmdfaW5zZXJ0KGRvdCwgcCk7CS8vIGluc2VydCB0aGUgc3RyaW5nCisJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisJCWJyZWFrOworCWNhc2UgJ1UnOgkJCS8vIFUtIFVuZG87IHJlcGxhY2UgY3VycmVudCBsaW5lIHdpdGggb3JpZ2luYWwgdmVyc2lvbgorCQlpZiAocmVnW1VyZWddICE9IDApIHsKKwkJCXAgPSBiZWdpbl9saW5lKGRvdCk7CisJCQlxID0gZW5kX2xpbmUoZG90KTsKKwkJCXAgPSB0ZXh0X2hvbGVfZGVsZXRlKHAsIHEpOwkvLyBkZWxldGUgY3VyIGxpbmUKKwkJCXAgKz0gc3RyaW5nX2luc2VydChwLCByZWdbVXJlZ10pOwkvLyBpbnNlcnQgb3JpZyBsaW5lCisJCQlkb3QgPSBwOworCQkJZG90X3NraXBfb3Zlcl93cygpOworCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfVklfWUFOS01BUksgKi8KKwljYXNlICckJzoJCQkvLyAkLSBnb3RvIGVuZCBvZiBsaW5lCisJY2FzZSBLRVlDT0RFX0VORDoJCS8vIEN1cnNvciBLZXkgRW5kCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvdF9uZXh0KCk7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZG90ID0gZW5kX2xpbmUoZG90KTsKKwkJYnJlYWs7CisJY2FzZSAnJSc6CQkJLy8gJS0gZmluZCBtYXRjaGluZyBjaGFyIG9mIHBhaXIgKCkgW10ge30KKwkJZm9yIChxID0gZG90OyBxIDwgZW5kICYmICpxICE9ICdcbic7IHErKykgeworCQkJaWYgKHN0cmNocigiKClbXXt9IiwgKnEpICE9IE5VTEwpIHsKKwkJCQkvLyB3ZSBmb3VuZCBoYWxmIG9mIGEgcGFpcgorCQkJCXAgPSBmaW5kX3BhaXIocSwgKnEpOworCQkJCWlmIChwID09IE5VTEwpIHsKKwkJCQkJaW5kaWNhdGVfZXJyb3IoYyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZG90ID0gcDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCpxID09ICdcbicpCisJCQlpbmRpY2F0ZV9lcnJvcihjKTsKKwkJYnJlYWs7CisJY2FzZSAnZic6CQkJLy8gZi0gZm9yd2FyZCB0byBhIHVzZXIgc3BlY2lmaWVkIGNoYXIKKwkJbGFzdF9mb3J3YXJkX2NoYXIgPSBnZXRfb25lX2NoYXIoKTsJLy8gZ2V0IHRoZSBzZWFyY2ggY2hhcgorCQkvLworCQkvLyBkb250IHNlcGFyYXRlIHRoZXNlIHR3byBjb21tYW5kcy4gJ2YnIGRlcGVuZHMgb24gJzsnCisJCS8vCisJCS8vKioqKiBmYWxsIHRocm91Z2ggdG8gLi4uICc7JworCWNhc2UgJzsnOgkJCS8vIDstIGxvb2sgYXQgcmVzdCBvZiBsaW5lIGZvciBsYXN0IGZvcndhcmQgY2hhcgorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoJzsnKTsKKwkJfQorCQlpZiAobGFzdF9mb3J3YXJkX2NoYXIgPT0gMCkKKwkJCWJyZWFrOworCQlxID0gZG90ICsgMTsKKwkJd2hpbGUgKHEgPCBlbmQgLSAxICYmICpxICE9ICdcbicgJiYgKnEgIT0gbGFzdF9mb3J3YXJkX2NoYXIpIHsKKwkJCXErKzsKKwkJfQorCQlpZiAoKnEgPT0gbGFzdF9mb3J3YXJkX2NoYXIpCisJCQlkb3QgPSBxOworCQlicmVhazsKKwljYXNlICcsJzogICAgICAgICAgIC8vIHJlcGVhdCBsYXRlc3QgJ2YnIGluIG9wcG9zaXRlIGRpcmVjdGlvbgorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoJywnKTsKKwkJfQorCQlpZiAobGFzdF9mb3J3YXJkX2NoYXIgPT0gMCkKKwkJCWJyZWFrOworCQlxID0gZG90IC0gMTsKKwkJd2hpbGUgKHEgPj0gdGV4dCAmJiAqcSAhPSAnXG4nICYmICpxICE9IGxhc3RfZm9yd2FyZF9jaGFyKSB7CisJCQlxLS07CisJCX0KKwkJaWYgKHEgPj0gdGV4dCAmJiAqcSA9PSBsYXN0X2ZvcndhcmRfY2hhcikKKwkJCWRvdCA9IHE7CisJCWJyZWFrOworCisJY2FzZSAnLSc6CQkJLy8gLS0gZ290byBwcmV2IGxpbmUKKwkJaWYgKC0tY21kY250ID4gMCkgeworCQkJZG9fY21kKGMpOworCQl9CisJCWRvdF9wcmV2KCk7CisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCWNhc2UgJy4nOgkJCS8vIC4tIHJlcGVhdCB0aGUgbGFzdCBtb2RpZnlpbmcgY29tbWFuZAorCQkvLyBTdHVmZiB0aGUgbGFzdF9tb2RpZnlpbmdfY21kIGJhY2sgaW50byBzdGRpbgorCQkvLyBhbmQgbGV0IGl0IGJlIHJlLWV4ZWN1dGVkLgorCQlpZiAobG1jX2xlbiA+IDApIHsKKwkJCWxhc3RfbW9kaWZ5aW5nX2NtZFtsbWNfbGVuXSA9IDA7CisJCQlpb3EgPSBpb3Ffc3RhcnQgPSB4c3RyZHVwKGxhc3RfbW9kaWZ5aW5nX2NtZCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gKKwljYXNlICc/JzoJCQkvLyAvLSBzZWFyY2ggZm9yIGEgcGF0dGVybgorCWNhc2UgJy8nOgkJCS8vIC8tIHNlYXJjaCBmb3IgYSBwYXR0ZXJuCisJCWJ1ZlswXSA9IGM7CisJCWJ1ZlsxXSA9ICdcMCc7CisJCXEgPSBnZXRfaW5wdXRfbGluZShidWYpOwkvLyBnZXQgaW5wdXQgbGluZS0gdXNlICJzdGF0dXMgbGluZSIKKwkJaWYgKHFbMF0gJiYgIXFbMV0pIHsKKwkJCWlmIChsYXN0X3NlYXJjaF9wYXR0ZXJuWzBdKQorCQkJCWxhc3Rfc2VhcmNoX3BhdHRlcm5bMF0gPSBjOworCQkJZ290byBkYzM7IC8vIGlmIG5vIHBhdCByZS11c2Ugb2xkIHBhdAorCQl9CisJCWlmIChxWzBdKSB7ICAgICAgIC8vIHN0cmxlbihxKSA+IDE6IG5ldyBwYXQtIHNhdmUgaXQgYW5kIGZpbmQKKwkJCS8vIHRoZXJlIGlzIGEgbmV3IHBhdAorCQkJZnJlZShsYXN0X3NlYXJjaF9wYXR0ZXJuKTsKKwkJCWxhc3Rfc2VhcmNoX3BhdHRlcm4gPSB4c3RyZHVwKHEpOworCQkJZ290byBkYzM7CS8vIG5vdyBmaW5kIHRoZSBwYXR0ZXJuCisJCX0KKwkJLy8gdXNlciBjaGFuZ2VkIG1pbmQgYW5kIGVyYXNlZCB0aGUgIi8iLSAgZG8gbm90aGluZworCQlicmVhazsKKwljYXNlICdOJzoJCQkvLyBOLSBiYWNrd2FyZCBzZWFyY2ggZm9yIGxhc3QgcGF0dGVybgorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZGlyID0gQkFDSzsJCS8vIGFzc3VtZSBCQUNLV0FSRCBzZWFyY2gKKwkJcCA9IGRvdCAtIDE7CisJCWlmIChsYXN0X3NlYXJjaF9wYXR0ZXJuWzBdID09ICc/JykgeworCQkJZGlyID0gRk9SV0FSRDsKKwkJCXAgPSBkb3QgKyAxOworCQl9CisJCWdvdG8gZGM0OwkJLy8gbm93IHNlYXJjaCBmb3IgcGF0dGVybgorCQlicmVhazsKKwljYXNlICduJzoJCQkvLyBuLSByZXBlYXQgc2VhcmNoIGZvciBsYXN0IHBhdHRlcm4KKwkJLy8gc2VhcmNoIHJlc3Qgb2YgdGV4dFtdIHN0YXJ0aW5nIGF0IG5leHQgY2hhcgorCQkvLyBpZiBzZWFyY2ggZmFpbHMgcmV0dXJuIG9yaWduYWwgInAiIG5vdCB0aGUgInArMSIgYWRkcmVzcworCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKyBkYzM6CisJCWRpciA9IEZPUldBUkQ7CS8vIGFzc3VtZSBGT1JXQVJEIHNlYXJjaAorCQlwID0gZG90ICsgMTsKKwkJaWYgKGxhc3Rfc2VhcmNoX3BhdHRlcm5bMF0gPT0gJz8nKSB7CisJCQlkaXIgPSBCQUNLOworCQkJcCA9IGRvdCAtIDE7CisJCX0KKyBkYzQ6CisJCXEgPSBjaGFyX3NlYXJjaChwLCBsYXN0X3NlYXJjaF9wYXR0ZXJuICsgMSwgZGlyLCBGVUxMKTsKKwkJaWYgKHEgIT0gTlVMTCkgeworCQkJZG90ID0gcTsJLy8gZ29vZCBzZWFyY2gsIHVwZGF0ZSAiZG90IgorCQkJbXNnID0gIiI7CisJCQlnb3RvIGRjMjsKKwkJfQorCQkvLyBubyBwYXR0ZXJuIGZvdW5kIGJldHdlZW4gImRvdCIgYW5kICJlbmQiLSBjb250aW51ZSBhdCB0b3AKKwkJcCA9IHRleHQ7CisJCWlmIChkaXIgPT0gQkFDSykgeworCQkJcCA9IGVuZCAtIDE7CisJCX0KKwkJcSA9IGNoYXJfc2VhcmNoKHAsIGxhc3Rfc2VhcmNoX3BhdHRlcm4gKyAxLCBkaXIsIEZVTEwpOworCQlpZiAocSAhPSBOVUxMKSB7CS8vIGZvdW5kIHNvbWV0aGluZworCQkJZG90ID0gcTsJLy8gZm91bmQgbmV3IHBhdHRlcm4tIGdvdG8gaXQKKwkJCW1zZyA9ICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiOworCQkJaWYgKGRpciA9PSBCQUNLKSB7CisJCQkJbXNnID0gInNlYXJjaCBoaXQgVE9QLCBjb250aW51aW5nIGF0IEJPVFRPTSI7CisJCQl9CisJCX0gZWxzZSB7CisJCQltc2cgPSAiUGF0dGVybiBub3QgZm91bmQiOworCQl9CisgZGMyOgorCQlpZiAoKm1zZykKKwkJCXN0YXR1c19saW5lX2JvbGQoIiVzIiwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSAneyc6CQkJLy8gey0gbW92ZSBiYWNrd2FyZCBwYXJhZ3JhcGgKKwkJcSA9IGNoYXJfc2VhcmNoKGRvdCwgIlxuXG4iLCBCQUNLLCBGVUxMKTsKKwkJaWYgKHEgIT0gTlVMTCkgewkvLyBmb3VuZCBibGFuayBsaW5lCisJCQlkb3QgPSBuZXh0X2xpbmUocSk7CS8vIG1vdmUgdG8gbmV4dCBibGFuayBsaW5lCisJCX0KKwkJYnJlYWs7CisJY2FzZSAnfSc6CQkJLy8gfS0gbW92ZSBmb3J3YXJkIHBhcmFncmFwaAorCQlxID0gY2hhcl9zZWFyY2goZG90LCAiXG5cbiIsIEZPUldBUkQsIEZVTEwpOworCQlpZiAocSAhPSBOVUxMKSB7CS8vIGZvdW5kIGJsYW5rIGxpbmUKKwkJCWRvdCA9IG5leHRfbGluZShxKTsJLy8gbW92ZSB0byBuZXh0IGJsYW5rIGxpbmUKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1NFQVJDSCAqLworCWNhc2UgJzAnOgkJCS8vIDAtIGdvdG8gYmVnaW5pbmcgb2YgbGluZQorCWNhc2UgJzEnOgkJCS8vIDEtCisJY2FzZSAnMic6CQkJLy8gMi0KKwljYXNlICczJzoJCQkvLyAzLQorCWNhc2UgJzQnOgkJCS8vIDQtCisJY2FzZSAnNSc6CQkJLy8gNS0KKwljYXNlICc2JzoJCQkvLyA2LQorCWNhc2UgJzcnOgkJCS8vIDctCisJY2FzZSAnOCc6CQkJLy8gOC0KKwljYXNlICc5JzoJCQkvLyA5LQorCQlpZiAoYyA9PSAnMCcgJiYgY21kY250IDwgMSkgeworCQkJZG90X2JlZ2luKCk7CS8vIHRoaXMgd2FzIGEgc3RhbmRhbG9uZSB6ZXJvCisJCX0gZWxzZSB7CisJCQljbWRjbnQgPSBjbWRjbnQgKiAxMCArIChjIC0gJzAnKTsJLy8gdGhpcyAwIGlzIHBhcnQgb2YgYSBudW1iZXIKKwkJfQorCQlicmVhazsKKwljYXNlICc6JzoJCQkvLyA6LSB0aGUgY29sb24gbW9kZSBjb21tYW5kcworCQlwID0gZ2V0X2lucHV0X2xpbmUoIjoiKTsJLy8gZ2V0IGlucHV0IGxpbmUtIHVzZSAic3RhdHVzIGxpbmUiCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04KKwkJY29sb24ocCk7CQkvLyBleGVjdXRlIHRoZSBjb21tYW5kCisjZWxzZQorCQlpZiAoKnAgPT0gJzonKQorCQkJcCsrOwkJCQkvLyBtb3ZlIHBhc3QgdGhlICc6JworCQljbnQgPSBzdHJsZW4ocCk7CisJCWlmIChjbnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc3RybmNtcChwLCAicXVpdCIsIGNudCkgPT0gMAorCQkgfHwgc3RybmNtcChwLCAicSEiLCBjbnQpID09IDAgICAvLyBkZWxldGUgbGluZXMKKwkJKSB7CisJCQlpZiAoZmlsZV9tb2RpZmllZCAmJiBwWzFdICE9ICchJykgeworCQkJCXN0YXR1c19saW5lX2JvbGQoIk5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlICg6cXVpdCEgb3ZlcnJpZGVzKSIpOworCQkJfSBlbHNlIHsKKwkJCQllZGl0aW5nID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ3cml0ZSIsIGNudCkgPT0gMAorCQkgICAgICAgIHx8IHN0cm5jbXAocCwgIndxIiwgY250KSA9PSAwCisJCSAgICAgICAgfHwgc3RybmNtcChwLCAid24iLCBjbnQpID09IDAKKwkJICAgICAgICB8fCAocFswXSA9PSAneCcgJiYgIXBbMV0pCisJCSkgeworCQkJY250ID0gZmlsZV93cml0ZShjdXJyZW50X2ZpbGVuYW1lLCB0ZXh0LCBlbmQgLSAxKTsKKwkJCWlmIChjbnQgPCAwKSB7CisJCQkJaWYgKGNudCA9PSAtMSkKKwkJCQkJc3RhdHVzX2xpbmVfYm9sZCgiV3JpdGUgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJZmlsZV9tb2RpZmllZCA9IDA7CisJCQkJbGFzdF9maWxlX21vZGlmaWVkID0gLTE7CisJCQkJc3RhdHVzX2xpbmUoIlwiJXNcIiAlZEwsICVkQyIsIGN1cnJlbnRfZmlsZW5hbWUsIGNvdW50X2xpbmVzKHRleHQsIGVuZCAtIDEpLCBjbnQpOworCQkJCWlmIChwWzBdID09ICd4JyB8fCBwWzFdID09ICdxJyB8fCBwWzFdID09ICduJworCQkJCSB8fCBwWzBdID09ICdYJyB8fCBwWzFdID09ICdRJyB8fCBwWzFdID09ICdOJworCQkJCSkgeworCQkJCQllZGl0aW5nID0gMDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmNtcChwLCAiZmlsZSIsIGNudCkgPT0gMCkgeworCQkJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOwkvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJCX0gZWxzZSBpZiAoc3NjYW5mKHAsICIlZCIsICZqKSA+IDApIHsKKwkJCWRvdCA9IGZpbmRfbGluZShqKTsJCS8vIGdvIHRvIGxpbmUgIyBqCisJCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCX0gZWxzZSB7CQkvLyB1bnJlY29nbml6ZWQgY21kCisJCQlub3RfaW1wbGVtZW50ZWQocCk7CisJCX0KKyNlbmRpZiAvKiAhRkVBVFVSRV9WSV9DT0xPTiAqLworCQlicmVhazsKKwljYXNlICc8JzoJCQkvLyA8LSBMZWZ0ICBzaGlmdCBzb21ldGhpbmcKKwljYXNlICc+JzoJCQkvLyA+LSBSaWdodCBzaGlmdCBzb21ldGhpbmcKKwkJY250ID0gY291bnRfbGluZXModGV4dCwgZG90KTsJLy8gcmVtZW1iZXIgd2hhdCBsaW5lIHdlIGFyZSBvbgorCQljMSA9IGdldF9vbmVfY2hhcigpOwkvLyBnZXQgdGhlIHR5cGUgb2YgdGhpbmcgdG8gZGVsZXRlCisJCWZpbmRfcmFuZ2UoJnAsICZxLCBjMSk7CisJCXlhbmtfZGVsZXRlKHAsIHEsIDEsIFlBTktPTkxZKTsJLy8gc2F2ZSBjb3B5IGJlZm9yZSBjaGFuZ2UKKwkJcCA9IGJlZ2luX2xpbmUocCk7CisJCXEgPSBlbmRfbGluZShxKTsKKwkJaSA9IGNvdW50X2xpbmVzKHAsIHEpOwkvLyAjIG9mIGxpbmVzIHdlIGFyZSBzaGlmdGluZworCQlmb3IgKCA7IGkgPiAwOyBpLS0sIHAgPSBuZXh0X2xpbmUocCkpIHsKKwkJCWlmIChjID09ICc8JykgeworCQkJCS8vIHNoaWZ0IGxlZnQtIHJlbW92ZSB0YWIgb3IgOCBzcGFjZXMKKwkJCQlpZiAoKnAgPT0gJ1x0JykgeworCQkJCQkvLyBzaHJpbmsgYnVmZmVyIDEgY2hhcgorCQkJCQl0ZXh0X2hvbGVfZGVsZXRlKHAsIHApOworCQkJCX0gZWxzZSBpZiAoKnAgPT0gJyAnKSB7CisJCQkJCS8vIHdlIHNob3VsZCBiZSBjYWxjdWxhdGluZyBjb2x1bW5zLCBub3QganVzdCBTUEFDRQorCQkJCQlmb3IgKGogPSAwOyAqcCA9PSAnICcgJiYgaiA8IHRhYnN0b3A7IGorKykgeworCQkJCQkJdGV4dF9ob2xlX2RlbGV0ZShwLCBwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoYyA9PSAnPicpIHsKKwkJCQkvLyBzaGlmdCByaWdodCAtLSBhZGQgdGFiIG9yIDggc3BhY2VzCisJCQkJY2hhcl9pbnNlcnQocCwgJ1x0Jyk7CisJCQl9CisJCX0KKwkJZG90ID0gZmluZF9saW5lKGNudCk7CS8vIHdoYXQgbGluZSB3ZXJlIHdlIG9uCisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwkJYnJlYWs7CisJY2FzZSAnQSc6CQkJLy8gQS0gYXBwZW5kIGF0IGUtby1sCisJCWRvdF9lbmQoKTsJCS8vIGdvIHRvIGUtby1sCisJCS8vKioqKiBmYWxsIHRocm91Z2ggdG8gLi4uICdhJworCWNhc2UgJ2EnOgkJCS8vIGEtIGFwcGVuZCBhZnRlciBjdXJyZW50IGNoYXIKKwkJaWYgKCpkb3QgIT0gJ1xuJykKKwkJCWRvdCsrOworCQlnb3RvIGRjX2k7CisJCWJyZWFrOworCWNhc2UgJ0InOgkJCS8vIEItIGJhY2sgYSBibGFuay1kZWxpbWl0ZWQgV29yZAorCWNhc2UgJ0UnOgkJCS8vIEUtIGVuZCBvZiBhIGJsYW5rLWRlbGltaXRlZCB3b3JkCisJY2FzZSAnVyc6CQkJLy8gVy0gZm9yd2FyZCBhIGJsYW5rLWRlbGltaXRlZCB3b3JkCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkaXIgPSBGT1JXQVJEOworCQlpZiAoYyA9PSAnQicpCisJCQlkaXIgPSBCQUNLOworCQlpZiAoYyA9PSAnVycgfHwgaXNzcGFjZShkb3RbZGlyXSkpIHsKKwkJCWRvdCA9IHNraXBfdGhpbmcoZG90LCAxLCBkaXIsIFNfVE9fV1MpOworCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIDIsIGRpciwgU19PVkVSX1dTKTsKKwkJfQorCQlpZiAoYyAhPSAnVycpCisJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMSwgZGlyLCBTX0JFRk9SRV9XUyk7CisJCWJyZWFrOworCWNhc2UgJ0MnOgkJCS8vIEMtIENoYW5nZSB0byBlLW8tbAorCWNhc2UgJ0QnOgkJCS8vIEQtIGRlbGV0ZSB0byBlLW8tbAorCQlzYXZlX2RvdCA9IGRvdDsKKwkJZG90ID0gZG9sbGFyX2xpbmUoZG90KTsJLy8gbW92ZSB0byBiZWZvcmUgTkwKKwkJLy8gY29weSB0ZXh0IGludG8gYSByZWdpc3RlciBhbmQgZGVsZXRlCisJCWRvdCA9IHlhbmtfZGVsZXRlKHNhdmVfZG90LCBkb3QsIDAsIFlBTktERUwpOwkvLyBkZWxldGUgdG8gZS1vLWwKKwkJaWYgKGMgPT0gJ0MnKQorCQkJZ290byBkY19pOwkvLyBzdGFydCBpbnNlcnRpbmcKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ET1RfQ01ECisJCWlmIChjID09ICdEJykKKwkJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSAnZyc6IC8vICdnZycgZ290byBhIGxpbmUgbnVtYmVyICh2aW0pIChkZWZhdWx0OiB2ZXJ5IGZpcnN0IGxpbmUpCisJCWMxID0gZ2V0X29uZV9jaGFyKCk7CisJCWlmIChjMSAhPSAnZycpIHsKKwkJCWJ1ZlswXSA9ICdnJzsKKwkJCWJ1ZlsxXSA9IGMxOyAvLyBUT0RPOiBpZiBVbmljb2RlPworCQkJYnVmWzJdID0gJ1wwJzsKKwkJCW5vdF9pbXBsZW1lbnRlZChidWYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNtZGNudCA9PSAwKQorCQkJY21kY250ID0gMTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAnRyc6CQkvLyBHLSBnb3RvIHRvIGEgbGluZSBudW1iZXIgKGRlZmF1bHQ9IEUtTy1GKQorCQlkb3QgPSBlbmQgLSAxOwkJCQkvLyBhc3N1bWUgRS1PLUYKKwkJaWYgKGNtZGNudCA+IDApIHsKKwkJCWRvdCA9IGZpbmRfbGluZShjbWRjbnQpOwkvLyB3aGF0IGxpbmUgaXMgI2NtZGNudAorCQl9CisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnSCc6CQkJLy8gSC0gZ290byB0b3AgbGluZSBvbiBzY3JlZW4KKwkJZG90ID0gc2NyZWVuYmVnaW47CisJCWlmIChjbWRjbnQgPiAocm93cyAtIDEpKSB7CisJCQljbWRjbnQgPSAocm93cyAtIDEpOworCQl9CisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZCgnKycpOworCQl9CisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnSSc6CQkJLy8gSS0gaW5zZXJ0IGJlZm9yZSBmaXJzdCBub24tYmxhbmsKKwkJZG90X2JlZ2luKCk7CS8vIDAKKwkJZG90X3NraXBfb3Zlcl93cygpOworCQkvLyoqKiogZmFsbCB0aHJvdWdoIHRvIC4uLiAnaScKKwljYXNlICdpJzoJCQkvLyBpLSBpbnNlcnQgYmVmb3JlIGN1cnJlbnQgY2hhcgorCWNhc2UgS0VZQ09ERV9JTlNFUlQ6CS8vIEN1cnNvciBLZXkgSW5zZXJ0CisgZGNfaToKKwkJY21kX21vZGUgPSAxOwkvLyBzdGFydCBpbnNydGluZworCQlicmVhazsKKwljYXNlICdKJzoJCQkvLyBKLSBqb2luIGN1cnJlbnQgYW5kIG5leHQgbGluZXMgdG9nZXRoZXIKKwkJaWYgKC0tY21kY250ID4gMSkgeworCQkJZG9fY21kKGMpOworCQl9CisJCWRvdF9lbmQoKTsJCS8vIG1vdmUgdG8gTkwKKwkJaWYgKGRvdCA8IGVuZCAtIDEpIHsJLy8gbWFrZSBzdXJlIG5vdCBsYXN0IGNoYXIgaW4gdGV4dFtdCisJCQkqZG90KysgPSAnICc7CS8vIHJlcGxhY2UgTkwgd2l0aCBzcGFjZQorCQkJZmlsZV9tb2RpZmllZCsrOworCQkJd2hpbGUgKGlzYmxhbmsoKmRvdCkpIHsJLy8gZGVsZXRlIGxlYWRpbmcgV1MKKwkJCQlkb3RfZGVsZXRlKCk7CisJCQl9CisJCX0KKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwkJYnJlYWs7CisJY2FzZSAnTCc6CQkJLy8gTC0gZ290byBib3R0b20gbGluZSBvbiBzY3JlZW4KKwkJZG90ID0gZW5kX3NjcmVlbigpOworCQlpZiAoY21kY250ID4gKHJvd3MgLSAxKSkgeworCQkJY21kY250ID0gKHJvd3MgLSAxKTsKKwkJfQorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoJy0nKTsKKwkJfQorCQlkb3RfYmVnaW4oKTsKKwkJZG90X3NraXBfb3Zlcl93cygpOworCQlicmVhazsKKwljYXNlICdNJzoJCQkvLyBNLSBnb3RvIG1pZGRsZSBsaW5lIG9uIHNjcmVlbgorCQlkb3QgPSBzY3JlZW5iZWdpbjsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCAocm93cy0xKSAvIDI7IGNudCsrKQorCQkJZG90ID0gbmV4dF9saW5lKGRvdCk7CisJCWJyZWFrOworCWNhc2UgJ08nOgkJCS8vIE8tIG9wZW4gYSBlbXB0eSBsaW5lIGFib3ZlCisJCS8vICAgIDBpXG4gRVNDIC1pCisJCXAgPSBiZWdpbl9saW5lKGRvdCk7CisJCWlmIChwWy0xXSA9PSAnXG4nKSB7CisJCQlkb3RfcHJldigpOworCWNhc2UgJ28nOgkJCS8vIG8tIG9wZW4gYSBlbXB0eSBsaW5lIGJlbG93OyBZZXMsIEkga25vdyBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSAiaWYgKC4uLiIKKwkJCWRvdF9lbmQoKTsKKwkJCWRvdCA9IGNoYXJfaW5zZXJ0KGRvdCwgJ1xuJyk7CisJCX0gZWxzZSB7CisJCQlkb3RfYmVnaW4oKTsJLy8gMAorCQkJZG90ID0gY2hhcl9pbnNlcnQoZG90LCAnXG4nKTsJLy8gaVxuIEVTQworCQkJZG90X3ByZXYoKTsJLy8gLQorCQl9CisJCWdvdG8gZGNfaTsKKwkJYnJlYWs7CisJY2FzZSAnUic6CQkJLy8gUi0gY29udGludW91cyBSZXBsYWNlIGNoYXIKKyBkYzU6CisJCWNtZF9tb2RlID0gMjsKKwkJYnJlYWs7CisJY2FzZSBLRVlDT0RFX0RFTEVURToKKwkJYyA9ICd4JzsKKwkJLy8gZmFsbCB0aHJvdWdoCisJY2FzZSAnWCc6CQkJLy8gWC0gZGVsZXRlIGNoYXIgYmVmb3JlIGRvdAorCWNhc2UgJ3gnOgkJCS8vIHgtIGRlbGV0ZSB0aGUgY3VycmVudCBjaGFyCisJY2FzZSAncyc6CQkJLy8gcy0gc3Vic3RpdHV0ZSB0aGUgY3VycmVudCBjaGFyCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkaXIgPSAwOworCQlpZiAoYyA9PSAnWCcpCisJCQlkaXIgPSAtMTsKKwkJaWYgKGRvdFtkaXJdICE9ICdcbicpIHsKKwkJCWlmIChjID09ICdYJykKKwkJCQlkb3QtLTsJLy8gZGVsZXRlIHByZXYgY2hhcgorCQkJZG90ID0geWFua19kZWxldGUoZG90LCBkb3QsIDAsIFlBTktERUwpOwkvLyBkZWxldGUgY2hhcgorCQl9CisJCWlmIChjID09ICdzJykKKwkJCWdvdG8gZGNfaTsJLy8gc3RhcnQgaW5zcnRpbmcKKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwkJYnJlYWs7CisJY2FzZSAnWic6CQkJLy8gWi0gaWYgbW9kaWZpZWQsIHt3cml0ZX07IGV4aXQKKwkJLy8gWlogbWVhbnMgdG8gc2F2ZSBmaWxlIChpZiBuZWNlc3NhcnkpLCB0aGVuIGV4aXQKKwkJYzEgPSBnZXRfb25lX2NoYXIoKTsKKwkJaWYgKGMxICE9ICdaJykgeworCQkJaW5kaWNhdGVfZXJyb3IoYyk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZmlsZV9tb2RpZmllZCkgeworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZICYmIHJlYWRvbmx5X21vZGUpIHsKKwkJCQlzdGF0dXNfbGluZV9ib2xkKCJcIiVzXCIgRmlsZSBpcyByZWFkIG9ubHkiLCBjdXJyZW50X2ZpbGVuYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNudCA9IGZpbGVfd3JpdGUoY3VycmVudF9maWxlbmFtZSwgdGV4dCwgZW5kIC0gMSk7CisJCQlpZiAoY250IDwgMCkgeworCQkJCWlmIChjbnQgPT0gLTEpCisJCQkJCXN0YXR1c19saW5lX2JvbGQoIldyaXRlIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQl9IGVsc2UgaWYgKGNudCA9PSAoZW5kIC0gMSAtIHRleHQgKyAxKSkgeworCQkJCWVkaXRpbmcgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJZWRpdGluZyA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnXic6CQkJLy8gXi0gbW92ZSB0byBmaXJzdCBub24tYmxhbmsgb24gbGluZQorCQlkb3RfYmVnaW4oKTsKKwkJZG90X3NraXBfb3Zlcl93cygpOworCQlicmVhazsKKwljYXNlICdiJzoJCQkvLyBiLSBiYWNrIGEgd29yZAorCWNhc2UgJ2UnOgkJCS8vIGUtIGVuZCBvZiB3b3JkCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkaXIgPSBGT1JXQVJEOworCQlpZiAoYyA9PSAnYicpCisJCQlkaXIgPSBCQUNLOworCQlpZiAoKGRvdCArIGRpcikgPCB0ZXh0IHx8IChkb3QgKyBkaXIpID4gZW5kIC0gMSkKKwkJCWJyZWFrOworCQlkb3QgKz0gZGlyOworCQlpZiAoaXNzcGFjZSgqZG90KSkgeworCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIChjID09ICdlJykgPyAyIDogMSwgZGlyLCBTX09WRVJfV1MpOworCQl9CisJCWlmIChpc2FsbnVtKCpkb3QpIHx8ICpkb3QgPT0gJ18nKSB7CisJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMSwgZGlyLCBTX0VORF9BTE5VTSk7CisJCX0gZWxzZSBpZiAoaXNwdW5jdCgqZG90KSkgeworCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIDEsIGRpciwgU19FTkRfUFVOQ1QpOworCQl9CisJCWJyZWFrOworCWNhc2UgJ2MnOgkJCS8vIGMtIGNoYW5nZSBzb21ldGhpbmcKKwljYXNlICdkJzoJCQkvLyBkLSBkZWxldGUgc29tZXRoaW5nCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwljYXNlICd5JzoJCQkvLyB5LSB5YW5rICAgc29tZXRoaW5nCisJY2FzZSAnWSc6CQkJLy8gWS0gWWFuayBhIGxpbmUKKyNlbmRpZgorCXsKKwkJaW50IHlmLCBtbCwgd2hvbGUgPSAwOworCQl5ZiA9IFlBTktERUw7CS8vIGFzc3VtZSBlaXRoZXIgImMiIG9yICJkIgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJCWlmIChjID09ICd5JyB8fCBjID09ICdZJykKKwkJCXlmID0gWUFOS09OTFk7CisjZW5kaWYKKwkJYzEgPSAneSc7CisJCWlmIChjICE9ICdZJykKKwkJCWMxID0gZ2V0X29uZV9jaGFyKCk7CS8vIGdldCB0aGUgdHlwZSBvZiB0aGluZyB0byBkZWxldGUKKwkJLy8gZGV0ZXJtaW5lIHJhbmdlLCBhbmQgd2hldGhlciBpdCBzcGFucyBsaW5lcworCQltbCA9IGZpbmRfcmFuZ2UoJnAsICZxLCBjMSk7CisJCWlmIChjMSA9PSAyNykgewkvLyBFU0MtIHVzZXIgY2hhbmdlZCBtaW5kIGFuZCB3YW50cyBvdXQKKwkJCWMgPSBjMSA9IDI3OwkvLyBFc2NhcGUtIGRvIG5vdGhpbmcKKwkJfSBlbHNlIGlmIChzdHJjaHIoIndXIiwgYzEpKSB7CisJCQlpZiAoYyA9PSAnYycpIHsKKwkJCQkvLyBkb24ndCBpbmNsdWRlIHRyYWlsaW5nIFdTIGFzIHBhcnQgb2Ygd29yZAorCQkJCXdoaWxlIChpc2JsYW5rKCpxKSkgeworCQkJCQlpZiAocSA8PSB0ZXh0IHx8IHFbLTFdID09ICdcbicpCisJCQkJCQlicmVhazsKKwkJCQkJcS0tOworCQkJCX0KKwkJCX0KKwkJCWRvdCA9IHlhbmtfZGVsZXRlKHAsIHEsIG1sLCB5Zik7CS8vIGRlbGV0ZSB3b3JkCisJCX0gZWxzZSBpZiAoc3RyY2hyKCJeMGJCZUVmdCUkIGxoXGJcMTc3IiwgYzEpKSB7CisJCQkvLyBwYXJ0aWFsIGxpbmUgY29weSB0ZXh0IGludG8gYSByZWdpc3RlciBhbmQgZGVsZXRlCisJCQlkb3QgPSB5YW5rX2RlbGV0ZShwLCBxLCBtbCwgeWYpOwkvLyBkZWxldGUgd29yZAorCQl9IGVsc2UgaWYgKHN0cmNocigiY2R5a2pITCste31cclxuIiwgYzEpKSB7CisJCQkvLyB3aG9sZSBsaW5lIGNvcHkgdGV4dCBpbnRvIGEgcmVnaXN0ZXIgYW5kIGRlbGV0ZQorCQkJZG90ID0geWFua19kZWxldGUocCwgcSwgbWwsIHlmKTsJLy8gZGVsZXRlIGxpbmVzCisJCQl3aG9sZSA9IDE7CisJCX0gZWxzZSB7CisJCQkvLyBjb3VsZCBub3QgcmVjb2duaXplIG9iamVjdAorCQkJYyA9IGMxID0gMjc7CS8vIGVycm9yLQorCQkJbWwgPSAwOworCQkJaW5kaWNhdGVfZXJyb3IoYyk7CisJCX0KKwkJaWYgKG1sICYmIHdob2xlKSB7CisJCQlpZiAoYyA9PSAnYycpIHsKKwkJCQlkb3QgPSBjaGFyX2luc2VydChkb3QsICdcbicpOworCQkJCS8vIG9uIHRoZSBsYXN0IGxpbmUgb2YgZmlsZSBkb24ndCBtb3ZlIHRvIHByZXYgbGluZQorCQkJCWlmICh3aG9sZSAmJiBkb3QgIT0gKGVuZC0xKSkgeworCQkJCQlkb3RfcHJldigpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYyA9PSAnZCcpIHsKKwkJCQlkb3RfYmVnaW4oKTsKKwkJCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCQl9CisJCX0KKwkJaWYgKGMxICE9IDI3KSB7CisJCQkvLyBpZiBDSEFOR0lORywgbm90IGRlbGV0aW5nLCBzdGFydCBpbnNlcnRpbmcgYWZ0ZXIgdGhlIGRlbGV0ZQorCQkJaWYgKGMgPT0gJ2MnKSB7CisJCQkJc3RyY3B5KGJ1ZiwgIkNoYW5nZSIpOworCQkJCWdvdG8gZGNfaTsJLy8gc3RhcnQgaW5zZXJ0aW5nCisJCQl9CisJCQlpZiAoYyA9PSAnZCcpIHsKKwkJCQlzdHJjcHkoYnVmLCAiRGVsZXRlIik7CisJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwkJCWlmIChjID09ICd5JyB8fCBjID09ICdZJykgeworCQkJCXN0cmNweShidWYsICJZYW5rIik7CisJCQl9CisJCQlwID0gcmVnW1lEcmVnXTsKKwkJCXEgPSBwICsgc3RybGVuKHApOworCQkJZm9yIChjbnQgPSAwOyBwIDw9IHE7IHArKykgeworCQkJCWlmICgqcCA9PSAnXG4nKQorCQkJCQljbnQrKzsKKwkJCX0KKwkJCXN0YXR1c19saW5lKCIlcyAlZCBsaW5lcyAoJWQgY2hhcnMpIHVzaW5nIFslY10iLAorCQkJCWJ1ZiwgY250LCBzdHJsZW4ocmVnW1lEcmVnXSksIHdoYXRfcmVnKCkpOworI2VuZGlmCisJCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCQl9CisJCWJyZWFrOworCX0KKwljYXNlICdrJzoJCQkvLyBrLSBnb3RvIHByZXYgbGluZSwgc2FtZSBjb2wKKwljYXNlIEtFWUNPREVfVVA6CQkvLyBjdXJzb3Iga2V5IFVwCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkb3RfcHJldigpOworCQlkb3QgPSBtb3ZlX3RvX2NvbChkb3QsIGNjb2wgKyBvZmZzZXQpOwkvLyB0cnkgc3RheSBpbiBzYW1lIGNvbAorCQlicmVhazsKKwljYXNlICdyJzoJCQkvLyByLSByZXBsYWNlIHRoZSBjdXJyZW50IGNoYXIgd2l0aCB1c2VyIGlucHV0CisJCWMxID0gZ2V0X29uZV9jaGFyKCk7CS8vIGdldCB0aGUgcmVwbGFjZW1lbnQgY2hhcgorCQlpZiAoKmRvdCAhPSAnXG4nKSB7CisJCQkqZG90ID0gYzE7CisJCQlmaWxlX21vZGlmaWVkKys7CisJCX0KKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwkJYnJlYWs7CisJY2FzZSAndCc6CQkJLy8gdC0gbW92ZSB0byBjaGFyIHByaW9yIHRvIG5leHQgeAorCQlsYXN0X2ZvcndhcmRfY2hhciA9IGdldF9vbmVfY2hhcigpOworCQlkb19jbWQoJzsnKTsKKwkJaWYgKCpkb3QgPT0gbGFzdF9mb3J3YXJkX2NoYXIpCisJCQlkb3RfbGVmdCgpOworCQlsYXN0X2ZvcndhcmRfY2hhciA9IDA7CisJCWJyZWFrOworCWNhc2UgJ3cnOgkJCS8vIHctIGZvcndhcmQgYSB3b3JkCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlpZiAoaXNhbG51bSgqZG90KSB8fCAqZG90ID09ICdfJykgewkvLyB3ZSBhcmUgb24gQUxOVU0KKwkJCWRvdCA9IHNraXBfdGhpbmcoZG90LCAxLCBGT1JXQVJELCBTX0VORF9BTE5VTSk7CisJCX0gZWxzZSBpZiAoaXNwdW5jdCgqZG90KSkgewkvLyB3ZSBhcmUgb24gUFVOQ1QKKwkJCWRvdCA9IHNraXBfdGhpbmcoZG90LCAxLCBGT1JXQVJELCBTX0VORF9QVU5DVCk7CisJCX0KKwkJaWYgKGRvdCA8IGVuZCAtIDEpCisJCQlkb3QrKzsJCS8vIG1vdmUgb3ZlciB3b3JkCisJCWlmIChpc3NwYWNlKCpkb3QpKSB7CisJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMiwgRk9SV0FSRCwgU19PVkVSX1dTKTsKKwkJfQorCQlicmVhazsKKwljYXNlICd6JzoJCQkvLyB6LQorCQljMSA9IGdldF9vbmVfY2hhcigpOwkvLyBnZXQgdGhlIHJlcGxhY2VtZW50IGNoYXIKKwkJY250ID0gMDsKKwkJaWYgKGMxID09ICcuJykKKwkJCWNudCA9IChyb3dzIC0gMikgLyAyOwkvLyBwdXQgZG90IGF0IGNlbnRlcgorCQlpZiAoYzEgPT0gJy0nKQorCQkJY250ID0gcm93cyAtIDI7CS8vIHB1dCBkb3QgYXQgYm90dG9tCisJCXNjcmVlbmJlZ2luID0gYmVnaW5fbGluZShkb3QpOwkvLyBzdGFydCBkb3QgYXQgdG9wCisJCWRvdF9zY3JvbGwoY250LCAtMSk7CisJCWJyZWFrOworCWNhc2UgJ3wnOgkJCS8vIHwtIG1vdmUgdG8gY29sdW1uICJjbWRjbnQiCisJCWRvdCA9IG1vdmVfdG9fY29sKGRvdCwgY21kY250IC0gMSk7CS8vIHRyeSB0byBtb3ZlIHRvIGNvbHVtbgorCQlicmVhazsKKwljYXNlICd+JzoJCQkvLyB+LSBmbGlwIHRoZSBjYXNlIG9mIGxldHRlcnMgICBhLXogLT4gQS1aCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlpZiAoaXNsb3dlcigqZG90KSkgeworCQkJKmRvdCA9IHRvdXBwZXIoKmRvdCk7CisJCQlmaWxlX21vZGlmaWVkKys7CisJCX0gZWxzZSBpZiAoaXN1cHBlcigqZG90KSkgeworCQkJKmRvdCA9IHRvbG93ZXIoKmRvdCk7CisJCQlmaWxlX21vZGlmaWVkKys7CisJCX0KKwkJZG90X3JpZ2h0KCk7CisJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisJCWJyZWFrOworCQkvLy0tLS0tIFRoZSBDdXJzb3IgYW5kIEZ1bmN0aW9uIEtleXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEtFWUNPREVfSE9NRToJLy8gQ3Vyc29yIEtleSBIb21lCisJCWRvdF9iZWdpbigpOworCQlicmVhazsKKwkJLy8gVGhlIEZuIGtleXMgY291bGQgcG9pbnQgdG8gZG9fbWFjcm8gd2hpY2ggY291bGQgdHJhbnNsYXRlIHRoZW0KKyNpZiAwCisJY2FzZSBLRVlDT0RFX0ZVTjE6CS8vIEZ1bmN0aW9uIEtleSBGMQorCWNhc2UgS0VZQ09ERV9GVU4yOgkvLyBGdW5jdGlvbiBLZXkgRjIKKwljYXNlIEtFWUNPREVfRlVOMzoJLy8gRnVuY3Rpb24gS2V5IEYzCisJY2FzZSBLRVlDT0RFX0ZVTjQ6CS8vIEZ1bmN0aW9uIEtleSBGNAorCWNhc2UgS0VZQ09ERV9GVU41OgkvLyBGdW5jdGlvbiBLZXkgRjUKKwljYXNlIEtFWUNPREVfRlVONjoJLy8gRnVuY3Rpb24gS2V5IEY2CisJY2FzZSBLRVlDT0RFX0ZVTjc6CS8vIEZ1bmN0aW9uIEtleSBGNworCWNhc2UgS0VZQ09ERV9GVU44OgkvLyBGdW5jdGlvbiBLZXkgRjgKKwljYXNlIEtFWUNPREVfRlVOOToJLy8gRnVuY3Rpb24gS2V5IEY5CisJY2FzZSBLRVlDT0RFX0ZVTjEwOgkvLyBGdW5jdGlvbiBLZXkgRjEwCisJY2FzZSBLRVlDT0RFX0ZVTjExOgkvLyBGdW5jdGlvbiBLZXkgRjExCisJY2FzZSBLRVlDT0RFX0ZVTjEyOgkvLyBGdW5jdGlvbiBLZXkgRjEyCisJCWJyZWFrOworI2VuZGlmCisJfQorCisgZGMxOgorCS8vIGlmIHRleHRbXSBqdXN0IGJlY2FtZSBlbXB0eSwgYWRkIGJhY2sgYW4gZW1wdHkgbGluZQorCWlmIChlbmQgPT0gdGV4dCkgeworCQljaGFyX2luc2VydCh0ZXh0LCAnXG4nKTsJLy8gc3RhcnQgZW1wdHkgYnVmIHdpdGggZHVtbXkgbGluZQorCQlkb3QgPSB0ZXh0OworCX0KKwkvLyBpdCBpcyBPSyBmb3IgZG90IHRvIGV4YWN0bHkgZXF1YWwgdG8gZW5kLCBvdGhlcndpc2UgY2hlY2sgZG90IHZhbGlkaXR5CisJaWYgKGRvdCAhPSBlbmQpIHsKKwkJZG90ID0gYm91bmRfZG90KGRvdCk7CS8vIG1ha2Ugc3VyZSAiZG90IiBpcyB2YWxpZAorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCWNoZWNrX2NvbnRleHQoYyk7CS8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb250ZXh0CisjZW5kaWYKKworCWlmICghaXNkaWdpdChjKSkKKwkJY21kY250ID0gMDsJCS8vIGNtZCB3YXMgbm90IGEgbnVtYmVyLCByZXNldCBjbWRjbnQKKwljbnQgPSBkb3QgLSBiZWdpbl9saW5lKGRvdCk7CisJLy8gVHJ5IHRvIHN0YXkgb2ZmIG9mIHRoZSBOZXdsaW5lCisJaWYgKCpkb3QgPT0gJ1xuJyAmJiBjbnQgPiAwICYmIGNtZF9tb2RlID09IDApCisJCWRvdC0tOworfQorCisvKiBOQiEgIHRoZSBDUkFTSE1FIGNvZGUgaXMgdW5tYWludGFpbmVkLCBhbmQgZG9lc24ndCBjdXJyZW50bHkgYnVpbGQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCitzdGF0aWMgaW50IHRvdGFsY21kcyA9IDA7CitzdGF0aWMgaW50IE1wID0gODU7ICAgICAgICAgICAgIC8vIE1vdmVtZW50IGNvbW1hbmQgUHJvYmFiaWxpdHkKK3N0YXRpYyBpbnQgTnAgPSA5MDsgICAgICAgICAgICAgLy8gTm9uLW1vdmVtZW50IGNvbW1hbmQgUHJvYmFiaWxpdHkKK3N0YXRpYyBpbnQgRHAgPSA5NjsgICAgICAgICAgICAgLy8gRGVsZXRlIGNvbW1hbmQgUHJvYmFiaWxpdHkKK3N0YXRpYyBpbnQgSXAgPSA5NzsgICAgICAgICAgICAgLy8gSW5zZXJ0IGNvbW1hbmQgUHJvYmFiaWxpdHkKK3N0YXRpYyBpbnQgWXAgPSA5ODsgICAgICAgICAgICAgLy8gWWFuayBjb21tYW5kIFByb2JhYmlsaXR5CitzdGF0aWMgaW50IFBwID0gOTk7ICAgICAgICAgICAgIC8vIFB1dCBjb21tYW5kIFByb2JhYmlsaXR5CitzdGF0aWMgaW50IE0gPSAwLCBOID0gMCwgSSA9IDAsIEQgPSAwLCBZID0gMCwgUCA9IDAsIFUgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgY2hhcnNbMjBdID0gIlx0MDEyMzQ1IGFiY2RBQkNELT0uJCI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd29yZHNbMjBdID0geworCSJ0aGlzIiwgImlzIiwgImEiLCAidGVzdCIsCisJImJyb2FkY2FzdCIsICJ0aGUiLCAiZW1lcmdlbmN5IiwgIm9mIiwKKwkic3lzdGVtIiwgInF1aWNrIiwgImJyb3duIiwgImZveCIsCisJImp1bXBlZCIsICJvdmVyIiwgImxhenkiLCAiZG9ncyIsCisJImJhY2siLCAiSmFudWFyeSIsICJGZWJ1YXJ5IiwgIk1hcmNoIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsaW5lc1syMF0gPSB7CisJIllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4iLAorCSJjaGFyIGMsIGNtLCAqY21kLCAqY21kMTtcbiIsCisJImdlbmVyYXRlIGEgY29tbWFuZCBieSBwZXJjZW50YWdlc1xuIiwKKwkiTnVtYmVycyBtYXkgYmUgdHlwZWQgYXMgYSBwcmVmaXggdG8gc29tZSBjb21tYW5kcy5cbiIsCisJIlF1aXQsIGRpc2NhcmRpbmcgY2hhbmdlcyFcbiIsCisJIkZvcmNlZCB3cml0ZSwgaWYgcGVybWlzc2lvbiBvcmlnaW5hbGx5IG5vdCB2YWxpZC5cbiIsCisJIkluIGdlbmVyYWwsIGFueSBleCBvciBlZCBjb21tYW5kIChzdWNoIGFzIHN1YnN0aXR1dGUgb3IgZGVsZXRlKS5cbiIsCisJIkkgaGF2ZSB0aWNrZXRzIGF2YWlsYWJsZSBmb3IgdGhlIEJsYXplcnMgdnMgTEEgQ2xpcHBlcnMgZm9yIE1vbmRheSwgSmFudXJhcnkgMSBhdCAxOjAwcG0uXG4iLAorCSJQbGVhc2UgZ2V0IHcvIG1lIGFuZCBJIHdpbGwgZ28gb3ZlciBpdCB3aXRoIHlvdS5cbiIsCisJIlRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHNjaGVkdWxlZCwgY29tbWl0dGVkIGNoYW5nZXMuXG4iLAorCSIxLiAgIExhdW5jaCBOb3J0b24gQW50aXZpcnVzIChTdGFydCwgUHJvZ3JhbXMsIE5vcnRvbiBBbnRpdmlydXMpXG4iLAorCSJSZW1pbmRlci4uLi5Ub3duIE1lZXRpbmcgaW4gQ2VudHJhbCBQZXJrIGNhZmUgdG9kYXkgYXQgMzowMHBtLlxuIiwKKwkiQW55IHF1ZXN0aW9uIGFib3V0IHRyYW5zYWN0aW9ucyBwbGVhc2UgY29udGFjdCBTdGVybGluZyBIdXhsZXkuXG4iLAorCSJJIHdpbGwgdHJ5IHRvIGdldCBiYWNrIHRvIHlvdSBieSBGcmlkYXksIERlY2VtYmVyIDMxLlxuIiwKKwkiVGhpcyBDaGFuZ2Ugd2lsbCBiZSBpbXBsZW1lbnRlZCBvbiBGcmlkYXkuXG4iLAorCSJMZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBwcm9ibGVtcyBhY2Nlc3NpbmcgdGhpcztcbiIsCisJIlN0ZXJsaW5nIEh1eGxleSByZWNlbnRseSBhZGRlZCB5b3UgdG8gdGhlIGFjY2VzcyBsaXN0LlxuIiwKKwkiV291bGQgeW91IGxpa2UgdG8gZ28gdG8gbHVuY2g/XG4iLAorCSJUaGUgbGFzdCBjb21tYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBydW4uXG4iLAorCSJUaGlzIGlzIHRvbyBtdWNoIGVuZ2xpc2ggZm9yIGEgY29tcHV0ZXIgZ2Vlay5cbiIsCit9Oworc3RhdGljIGNoYXIgKm11bHRpbGluZXNbMjBdID0geworCSJZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIiwKKwkiY2hhciBjLCBjbSwgKmNtZCwgKmNtZDE7XG4iLAorCSJnZW5lcmF0ZSBhIGNvbW1hbmQgYnkgcGVyY2VudGFnZXNcbiIsCisJIk51bWJlcnMgbWF5IGJlIHR5cGVkIGFzIGEgcHJlZml4IHRvIHNvbWUgY29tbWFuZHMuXG4iLAorCSJRdWl0LCBkaXNjYXJkaW5nIGNoYW5nZXMhXG4iLAorCSJGb3JjZWQgd3JpdGUsIGlmIHBlcm1pc3Npb24gb3JpZ2luYWxseSBub3QgdmFsaWQuXG4iLAorCSJJbiBnZW5lcmFsLCBhbnkgZXggb3IgZWQgY29tbWFuZCAoc3VjaCBhcyBzdWJzdGl0dXRlIG9yIGRlbGV0ZSkuXG4iLAorCSJJIGhhdmUgdGlja2V0cyBhdmFpbGFibGUgZm9yIHRoZSBCbGF6ZXJzIHZzIExBIENsaXBwZXJzIGZvciBNb25kYXksIEphbnVyYXJ5IDEgYXQgMTowMHBtLlxuIiwKKwkiUGxlYXNlIGdldCB3LyBtZSBhbmQgSSB3aWxsIGdvIG92ZXIgaXQgd2l0aCB5b3UuXG4iLAorCSJUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBzY2hlZHVsZWQsIGNvbW1pdHRlZCBjaGFuZ2VzLlxuIiwKKwkiMS4gICBMYXVuY2ggTm9ydG9uIEFudGl2aXJ1cyAoU3RhcnQsIFByb2dyYW1zLCBOb3J0b24gQW50aXZpcnVzKVxuIiwKKwkiUmVtaW5kZXIuLi4uVG93biBNZWV0aW5nIGluIENlbnRyYWwgUGVyayBjYWZlIHRvZGF5IGF0IDM6MDBwbS5cbiIsCisJIkFueSBxdWVzdGlvbiBhYm91dCB0cmFuc2FjdGlvbnMgcGxlYXNlIGNvbnRhY3QgU3RlcmxpbmcgSHV4bGV5LlxuIiwKKwkiSSB3aWxsIHRyeSB0byBnZXQgYmFjayB0byB5b3UgYnkgRnJpZGF5LCBEZWNlbWJlciAzMS5cbiIsCisJIlRoaXMgQ2hhbmdlIHdpbGwgYmUgaW1wbGVtZW50ZWQgb24gRnJpZGF5LlxuIiwKKwkiTGV0IG1lIGtub3cgaWYgeW91IGhhdmUgcHJvYmxlbXMgYWNjZXNzaW5nIHRoaXM7XG4iLAorCSJTdGVybGluZyBIdXhsZXkgcmVjZW50bHkgYWRkZWQgeW91IHRvIHRoZSBhY2Nlc3MgbGlzdC5cbiIsCisJIldvdWxkIHlvdSBsaWtlIHRvIGdvIHRvIGx1bmNoP1xuIiwKKwkiVGhlIGxhc3QgY29tbWFuZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcnVuLlxuIiwKKwkiVGhpcyBpcyB0b28gbXVjaCBlbmdsaXNoIGZvciBhIGNvbXB1dGVyIGdlZWsuXG4iLAorfTsKKworLy8gY3JlYXRlIGEgcmFuZG9tIGNvbW1hbmQgdG8gZXhlY3V0ZQorc3RhdGljIHZvaWQgY3Jhc2hfZHVtbXkoKQoreworCXN0YXRpYyBpbnQgc2xlZXB0aW1lOyAgIC8vIGhvdyBsb25nIHRvIHBhdXNlIGJldHdlZW4gY29tbWFuZHMKKwljaGFyIGMsIGNtLCAqY21kLCAqY21kMTsKKwlpbnQgaSwgY250LCB0aGluZywgcmJpLCBzdGFydHJiaSwgcGVyY2VudDsKKworCS8vICJkb3QiIG1vdmVtZW50IGNvbW1hbmRzCisJY21kMSA9ICIgXG5cclwwMDJcMDA0XDAwNVwwMDZcMDI1XDAzMTBeJC0rd1dlRWJCaGprbEhMIjsKKworCS8vIGlzIHRoZXJlIGFscmVhZHkgYSBjb21tYW5kIHJ1bm5pbmc/CisJaWYgKHJlYWRidWZmZXJbMF0gPiAwKQorCQlnb3RvIGNkMTsKKyBjZDA6CisJcmVhZGJ1ZmZlclswXSA9ICdYJzsKKwlzdGFydHJiaSA9IHJiaSA9IDE7CisJc2xlZXB0aW1lID0gMDsgICAgICAgICAgLy8gaG93IGxvbmcgdG8gcGF1c2UgYmV0d2VlbiBjb21tYW5kcworCW1lbXNldChyZWFkYnVmZmVyLCAnXDAnLCBzaXplb2YocmVhZGJ1ZmZlcikpOworCS8vIGdlbmVyYXRlIGEgY29tbWFuZCBieSBwZXJjZW50YWdlcworCXBlcmNlbnQgPSAoaW50KSBscmFuZDQ4KCkgJSAxMDA7ICAgICAgICAvLyBnZXQgYSBudW1iZXIgZnJvbSAwLTk5CisJaWYgKHBlcmNlbnQgPCBNcCkgeyAgICAgLy8gIE1vdmVtZW50IGNvbW1hbmRzCisJCS8vIGF2YWlsYWJsZSBjb21tYW5kcworCQljbWQgPSBjbWQxOworCQlNKys7CisJfSBlbHNlIGlmIChwZXJjZW50IDwgTnApIHsgICAgICAvLyAgbm9uLW1vdmVtZW50IGNvbW1hbmRzCisJCWNtZCA9ICJtejw+XCdcIiI7ICAgICAgIC8vIGF2YWlsYWJsZSBjb21tYW5kcworCQlOKys7CisJfSBlbHNlIGlmIChwZXJjZW50IDwgRHApIHsgICAgICAvLyAgRGVsZXRlIGNvbW1hbmRzCisJCWNtZCA9ICJkeCI7ICAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBjb21tYW5kcworCQlEKys7CisJfSBlbHNlIGlmIChwZXJjZW50IDwgSXApIHsgICAgICAvLyAgSW5zZXQgY29tbWFuZHMKKwkJY21kID0gImlJYUFzckoiOyAgICAgICAgLy8gYXZhaWxhYmxlIGNvbW1hbmRzCisJCUkrKzsKKwl9IGVsc2UgaWYgKHBlcmNlbnQgPCBZcCkgeyAgICAgIC8vICBZYW5rIGNvbW1hbmRzCisJCWNtZCA9ICJ5WSI7ICAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBjb21tYW5kcworCQlZKys7CisJfSBlbHNlIGlmIChwZXJjZW50IDwgUHApIHsgICAgICAvLyAgUHV0IGNvbW1hbmRzCisJCWNtZCA9ICJwUCI7ICAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBjb21tYW5kcworCQlQKys7CisJfSBlbHNlIHsKKwkJLy8gV2UgZG8gbm90IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzIGNvbW1hbmQsIHRyeSBhZ2FpbgorCQlVKys7CisJCWdvdG8gY2QwOworCX0KKwkvLyByYW5kb21seSBwaWNrIG9uZSBvZiB0aGUgYXZhaWxhYmxlIGNtZHMgZnJvbSAiY21kW10iCisJaSA9IChpbnQpIGxyYW5kNDgoKSAlIHN0cmxlbihjbWQpOworCWNtID0gY21kW2ldOworCWlmIChzdHJjaHIoIjpcMDI0IiwgY20pKQorCQlnb3RvIGNkMDsgICAgICAgICAgICAgICAvLyBkb250IGFsbG93IGNvbG9uIG9yIGN0cmwtVCBjb21tYW5kcworCXJlYWRidWZmZXJbcmJpKytdID0gY207IC8vIHB1dCBjbWQgaW50byBpbnB1dCBidWZmZXIKKworCS8vIG5vdyB3ZSBoYXZlIHRoZSBjb21tYW5kLQorCS8vIHRoZXJlIGFyZSAxLCAyLCBhbmQgbXVsdGkgY2hhciBjb21tYW5kcworCS8vIGZpbmQgb3V0IHdoaWNoIGFuZCBnZW5lcmF0ZSB0aGUgcmVzdCBvZiBjb21tYW5kIGFzIG5lY2Vzc2FyeQorCWlmIChzdHJjaHIoImRtcnl6PD5cJ1wiIiwgY20pKSB7ICAgICAgICAvLyAyLWNoYXIgY29tbWFuZHMKKwkJY21kMSA9ICIgXG5ccjAkXi0rd1dlRWJCaGprbEhMIjsKKwkJaWYgKGNtID09ICdtJyB8fCBjbSA9PSAnXCcnIHx8IGNtID09ICdcIicpIHsgICAgLy8gcGljayBhIHJlZ1tdCisJCQljbWQxID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKwkJfQorCQl0aGluZyA9IChpbnQpIGxyYW5kNDgoKSAlIHN0cmxlbihjbWQxKTsgLy8gcGljayBhIG1vdmVtZW50IGNvbW1hbmQKKwkJYyA9IGNtZDFbdGhpbmddOworCQlyZWFkYnVmZmVyW3JiaSsrXSA9IGM7ICAvLyBhZGQgbW92ZW1lbnQgdG8gaW5wdXQgYnVmZmVyCisJfQorCWlmIChzdHJjaHIoImlJYUFzYyIsIGNtKSkgeyAgICAgLy8gbXVsdGktY2hhciBjb21tYW5kcworCQlpZiAoY20gPT0gJ2MnKSB7CisJCQkvLyBjaGFuZ2Ugc29tZSB0aGluZworCQkJdGhpbmcgPSAoaW50KSBscmFuZDQ4KCkgJSBzdHJsZW4oY21kMSk7IC8vIHBpY2sgYSBtb3ZlbWVudCBjb21tYW5kCisJCQljID0gY21kMVt0aGluZ107CisJCQlyZWFkYnVmZmVyW3JiaSsrXSA9IGM7ICAvLyBhZGQgbW92ZW1lbnQgdG8gaW5wdXQgYnVmZmVyCisJCX0KKwkJdGhpbmcgPSAoaW50KSBscmFuZDQ4KCkgJSA0OyAgICAvLyB3aGF0IHRoaW5nIHRvIGluc2VydAorCQljbnQgPSAoaW50KSBscmFuZDQ4KCkgJSAxMDsgICAgIC8vIGhvdyBtYW55IHRvIGluc2VydAorCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJCWlmICh0aGluZyA9PSAwKSB7ICAgICAgIC8vIGluc2VydCBjaGFycworCQkJCXJlYWRidWZmZXJbcmJpKytdID0gY2hhcnNbKChpbnQpIGxyYW5kNDgoKSAlIHN0cmxlbihjaGFycykpXTsKKwkJCX0gZWxzZSBpZiAodGhpbmcgPT0gMSkgeyAgICAgICAgLy8gaW5zZXJ0IHdvcmRzCisJCQkJc3RyY2F0KHJlYWRidWZmZXIsIHdvcmRzWyhpbnQpIGxyYW5kNDgoKSAlIDIwXSk7CisJCQkJc3RyY2F0KHJlYWRidWZmZXIsICIgIik7CisJCQkJc2xlZXB0aW1lID0gMDsgIC8vIGhvdyBmYXN0IHRvIHR5cGUKKwkJCX0gZWxzZSBpZiAodGhpbmcgPT0gMikgeyAgICAgICAgLy8gaW5zZXJ0IGxpbmVzCisJCQkJc3RyY2F0KHJlYWRidWZmZXIsIGxpbmVzWyhpbnQpIGxyYW5kNDgoKSAlIDIwXSk7CisJCQkJc2xlZXB0aW1lID0gMDsgIC8vIGhvdyBmYXN0IHRvIHR5cGUKKwkJCX0gZWxzZSB7ICAgICAgICAvLyBpbnNlcnQgbXVsdGktbGluZXMKKwkJCQlzdHJjYXQocmVhZGJ1ZmZlciwgbXVsdGlsaW5lc1soaW50KSBscmFuZDQ4KCkgJSAyMF0pOworCQkJCXNsZWVwdGltZSA9IDA7ICAvLyBob3cgZmFzdCB0byB0eXBlCisJCQl9CisJCX0KKwkJc3RyY2F0KHJlYWRidWZmZXIsICJcMDMzIik7CisJfQorCXJlYWRidWZmZXJbMF0gPSBzdHJsZW4ocmVhZGJ1ZmZlciArIDEpOworIGNkMToKKwl0b3RhbGNtZHMrKzsKKwlpZiAoc2xlZXB0aW1lID4gMCkKKwkJbXlzbGVlcChzbGVlcHRpbWUpOyAgICAgIC8vIHNsZWVwIDEvMTAwIHNlYworfQorCisvLyB0ZXN0IHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGVycm9ycworc3RhdGljIHZvaWQgY3Jhc2hfdGVzdCgpCit7CisJc3RhdGljIHRpbWVfdCBvbGR0aW07CisKKwl0aW1lX3QgdGltOworCWNoYXIgZFsyXSwgbXNnWzgwXTsKKworCW1zZ1swXSA9ICdcMCc7CisJaWYgKGVuZCA8IHRleHQpIHsKKwkJc3RyY2F0KG1zZywgImVuZDx0ZXh0ICIpOworCX0KKwlpZiAoZW5kID4gdGV4dGVuZCkgeworCQlzdHJjYXQobXNnLCAiZW5kPnRleHRlbmQgIik7CisJfQorCWlmIChkb3QgPCB0ZXh0KSB7CisJCXN0cmNhdChtc2csICJkb3Q8dGV4dCAiKTsKKwl9CisJaWYgKGRvdCA+IGVuZCkgeworCQlzdHJjYXQobXNnLCAiZG90PmVuZCAiKTsKKwl9CisJaWYgKHNjcmVlbmJlZ2luIDwgdGV4dCkgeworCQlzdHJjYXQobXNnLCAic2NyZWVuYmVnaW48dGV4dCAiKTsKKwl9CisJaWYgKHNjcmVlbmJlZ2luID4gZW5kIC0gMSkgeworCQlzdHJjYXQobXNnLCAic2NyZWVuYmVnaW4+ZW5kLTEgIik7CisJfQorCisJaWYgKG1zZ1swXSkgeworCQlwcmludGYoIlxuXG4lZDogXCclY1wnICVzXG5cblxuJXNbSGl0IHJldHVybiB0byBjb250aW51ZV0lcyIsCisJCQl0b3RhbGNtZHMsIGxhc3RfaW5wdXRfY2hhciwgbXNnLCBTT3MsIFNPbik7CisJCWZmbHVzaF9hbGwoKTsKKwkJd2hpbGUgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIGQsIDEpID4gMCkgeworCQkJaWYgKGRbMF0gPT0gJ1xuJyB8fCBkWzBdID09ICdccicpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJdGltID0gdGltZShOVUxMKTsKKwlpZiAodGltID49IChvbGR0aW0gKyAzKSkgeworCQlzcHJpbnRmKHN0YXR1c19idWZmZXIsCisJCQkJIlRvdD0lZDogTT0lZCBOPSVkIEk9JWQgRD0lZCBZPSVkIFA9JWQgVT0lZCBzaXplPSVkIiwKKwkJCQl0b3RhbGNtZHMsIE0sIE4sIEksIEQsIFksIFAsIFUsIGVuZCAtIHRleHQgKyAxKTsKKwkJb2xkdGltID0gdGltOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYW5kcm9pZC1idWlsZCBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2FuZHJvaWQtYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjVmZTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2FuZHJvaWQtYnVpbGQKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL3NoCisjIEJ1aWxkIEJ1c3lib3ggYWdhaW5zdCBBbmRyb2lkJ3MgYmlvbmljCisjIE9yaWdpbmFsbHkgYnkgRGFuIEZhbmRyaWNoCisjCisjIENvbmZpZ3VyZSB3aXRoIGFuZHJvaWRfZGVmY29uZmlnCisjIFRoaXMgZmlsZSBoYXMgYmVlbiB0ZXN0ZWQgb24gQW5kcm9pZCBGcm95byAodGhlIGxhY2sgb2YgdHR5bmFtZV9yIGluCisjIHRoZSBtdXN0IGJlIHBhdGNoZWQgYXJvdW5kKSBhbmQgR2luZ2VyYnJlYWQuCisKKyMgUG9pbnQgdGhpcyB0byB0aGUgQW5kcm9pZCByb290IGRpcmVjdG9yeTsgaXQncyB1c2VkIGluIHRoZSBkZWZjb25maWcgQ0ZMQUdTCitleHBvcnQgQT0iJEhPTUUvYW5kcm9pZCIKKworIyBBbmRyb2lkIHByb2R1Y3QgYmVpbmcgYnVpbHQKK1A9em9vbTIKKworIyBUb29sY2hhaW4gdmVyc2lvbiBpbiB1c2UgYnkgdGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQKK0dDQ1ZFUj00LjQuMworCitleHBvcnQgUEFUSD0iJEEvcHJlYnVpbHQvbGludXgteDg2L3Rvb2xjaGFpbi9hcm0tZWFiaS0kR0NDVkVSL2JpbjokUEFUSCIKKworIyBTZXQgdGhlIGxpbmtlciBmbGFnczsgY29tcGlsZXIgZmxhZ3MgYXJlIGluIHRoZSBkZWZjb25maWcgZmlsZQoraWYgZ3JlcCAiXkNPTkZJR19TVEFUSUM9eSIgLmNvbmZpZyA+L2Rldi9udWxsIDsgdGhlbgorCSMgU3RhdGljIGxpbmtpbmcKKwlMREZMQUdTPSItc3RhdGljIC1YbGlua2VyIC16IC1YbGlua2VyIG11bGRlZnMgLW5vc3RkbGliICRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovbGliL2NydGJlZ2luX3N0YXRpYy5vICRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovbGliL2NydGVuZF9hbmRyb2lkLm8gLUwkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL2xpYiAtTCRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovU1RBVElDX0xJQlJBUklFUy9saWJtX2ludGVybWVkaWF0ZXMgLUwkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliY19pbnRlcm1lZGlhdGVzIgorCUxETElCUz0ibSBjIGdjYyIKK2Vsc2UKKwkjIER5bmFtaWMgbGlua2luZworCUxERkxBR1M9Ii1YbGlua2VyIC16IC1YbGlua2VyIG11bGRlZnMgLW5vc3RkbGliIC1CZHluYW1pYyAtWGxpbmtlciAtVCRBL2J1aWxkL2NvcmUvYXJtZWxmLnggLVhsaW5rZXIgLWR5bmFtaWMtbGlua2VyIC1YbGlua2VyIC9zeXN0ZW0vYmluL2xpbmtlciAtWGxpbmtlciAteiAtWGxpbmtlciBub2NvcHlyZWxvYyAtWGxpbmtlciAtLW5vLXVuZGVmaW5lZCAkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL2xpYi9jcnRiZWdpbl9keW5hbWljLm8gJEEvb3V0L3RhcmdldC9wcm9kdWN0LyRQL29iai9saWIvY3J0ZW5kX2FuZHJvaWQubyAtTCRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovbGliIgorCUxETElCUz0iZGwgbSBjIGdjYyIKK2ZpCisKK21ha2UgRVhUUkFfTERGTEFHUz0iJExERkxBR1MiIExETElCUz0iJExETElCUyIgIiRAIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9ib290ZmxvcHB5LnR4dCBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvYm9vdGZsb3BweS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyY2JlMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvYm9vdGZsb3BweS50eHQKQEAgLTAsMCArMSwxODAgQEAKK0J1aWxkaW5nIGEgQnVzeWJveCBCb290IEZsb3BweQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byBidWlkIGEgYm9vdCBmbG9wcHkgdXNpbmcgdGhlIGZvbGxvd2luZworY29tcG9uZW50czoKKworIC0gTGludXggS2VybmVsIChodHRwOi8vd3d3Lmtlcm5lbC5vcmcpCisgLSB1Q2xpYmM6IEMgbGlicmFyeSAoaHR0cDovL3d3dy51Y2xpYmMub3JnLykKKyAtIEJ1c3lib3g6IFVuaXggdXRpbGl0aWVzIChodHRwOi8vYnVzeWJveC5uZXQvKQorIC0gU3lzbGludXg6IGJvb3Rsb2FkZXIgKGh0dHA6Ly9zeXNsaW51eC56eXRvci5jb20pCisKK0l0IGlzIGJhc2VkIGhlYXZpbHkgb24gYSBwYXBlciBwcmVzZW50ZWQgYnkgRXJpayBBbmRlcnNlbiBhdCB0aGUgMjAwMSBFbWJlZGRlZAorU3lzdGVtcyBDb25mZXJlbmNlLgorCisKKworQnVpbGRpbmcgVGhlIFNvZnR3YXJlIENvbXBvbmVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RldGFpbGVkIGluc3RydWN0aW9ucyBvbiBob3cgdG8gYnVpbGQgQnVzeWJveCwgdUNsaWJjLCBvciBhIHdvcmtpbmcgTGludXgKK2tlcm5lbCBhcmUgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LiBUaGUgZm9sbG93aW5nIGd1aWRlbGluZXMgd2lsbAoraGVscCB0aG91Z2g6CisKKwktIFN0b2NrIEJ1c3lib3ggZnJvbSBDVlMgb3IgYSB0YXJiYWxsIHdpbGwgd29yayB3aXRoIG5vIG1vZGlmaWNhdGlvbnMgdG8KKwkgIGFueSBmaWxlcy4gSnVzdCBleHRyYWN0IGFuZCBnby4KKwktIERpdHRvIHVDbGliYy4KKwktIFlvdXIgTGludXgga2VybmVsIG11c3QgaW5jbHVkZSBzdXBwb3J0IGZvciBpbml0cmQgb3IgZWxzZSB0aGUgZmxvcHB5CisJICB3b24ndCBiZSBhYmxlIHRvIG1vdW50IGl0J3Mgcm9vdCBmaWxlIHN5c3RlbS4KKworSWYgeW91IHJlcXVpcmUgZnVydGhlciBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBCdXN5Ym94IHVDbGliYyBvciBMaW51eCwgcGxlYXNlCityZWZlciB0byB0aGUgd2ViIHBhZ2VzIGFuZCBkb2N1bWVudGF0aW9uIGZvciB0aG9zZSBpbmRpdmlkdWFsIHByb2dyYW1zLgorCisKKworTWFraW5nIGEgUm9vdCBGaWxlIFN5c3RlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIHN0ZXBzIHdpbGwgY3JlYXRlIGEgcm9vdCBmaWxlIHN5c3RlbS4KKworIC0gQ3JlYXRlIGFuIGVtcHR5IGZpbGUgdGhhdCB5b3UgY2FuIGZvcm1hdCBhcyBhIGZpbGVzeXN0ZW06CisKKwlkZCBpZj0vZGV2L3plcm8gb2Y9cm9vdGZzIGJzPTFrIGNvdW50PTQwMDAKKworIC0gU2V0IHVwIHRoZSByb290ZnMgZmlsZSB3ZSBqdXN0IGNyZWF0ZWQgdG8gYmUgdXNlZCBhcyBhIGxvb3AgZGV2aWNlIChtYXkgbm90CisgICBiZSBuZWNlc3NhcnkpCisKKwlsb3NldHVwIC9kZXYvbG9vcDAgcm9vdGZzCisKKyAtIEZvcm1hdCB0aGUgcm9vdGZzIGZpbGUgd2l0aCBhIGZpbGVzeXN0ZW06CisKKwlta2ZzLmV4dDIgLUYgLWkgMjAwMCByb290ZnMKKworIC0gTW91bnQgdGhlIGZpbGUgb24gYSBtb3VudHBvaW50IHNvIHdlIGNhbiBwbGFjZSBmaWxlcyBpbiBpdDoKKworCW1rZGlyIGxvb3AKKwltb3VudCAtbyBsb29wIHJvb3RmcyBsb29wLworCisJKHlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gYmUgcm9vdCB0byBkbyB0aGlzKQorCisgLSBDb3B5IG9uIHRoZSBDIGxpYnJhcnksIHRoZSBkeW5hbWljIGxpbmtpbmcgbGlicmFyeSwgYW5kIG90aGVyIG5lY2Vzc2FyeQorICAgbGlicmFyaWVzLiBGb3IgdGhpcyBleGFtcGxlLCB3ZSBjb3B5IHRoZSBmb2xsb3dpbmcgZmlsZXMgZnJvbSB0aGUgdUNsaWJjCisgICB0cmVlOgorCisJbWtkaXIgbG9vcC9saWIKKwkoY2hkaXIgdG8gdUNsaWJjIGRpcmVjdG9yeSkKKwljcCAtYSBsaWJjLnNvKiB1Q2xpYmMqLnNvIFwKKwkJbGQuc28tMS9kLWxpbmsvbGQtbGludXgtdWNsaWJjLnNvKiBcCisJCWxkLnNvLTEvbGliZGwvbGliZGwuc28qIFwKKwkJY3J5cHQvbGliY3J5cHQuc28qIFwKKwkJKHBhdGggdG8pbG9vcC9saWIKKworIC0gSW5zdGFsbCB0aGUgQnVzeWJveCBiaW5hcnkgYW5kIGFjY29tcGFueWluZyBzeW1saW5rczoKKworCShjaGRpciB0byBidXN5Ym94IGRpcmVjdG9yeSkKKwltYWtlIENPTkZJR19QUkVGSVg9KHBhdGggdG8pbG9vcC8gaW5zdGFsbAorCisgLSBNYWtlIGRldmljZSBmaWxlcyBpbiAvZGV2OgorCisJVGhpcyBjYW4gYmUgZG9uZSBieSBydW5uaW5nIHRoZSAnbWtkZXZzLnNoJyBzY3JpcHQuIElmIHlvdSB3YW50IHRoZSBnb3J5CisJZGV0YWlscywgeW91IGNhbiByZWFkIHRoZSBzY3JpcHQuCisKKyAtIE1ha2UgbmVjZXNzYXJ5IGZpbGVzIGluIC9ldGM6CisKKwlGb3IgdGhpcywganVzdCBjcCAtYSB0aGUgZXRjLyBkaXJlY3Rvcnkgb250byByb290ZnMuIEFnYWluLCBpZiB5b3Ugd2FudAorCWFsbCB0aGUgZGV0YWlscywgeW91IGNhbiBqdXN0IGxvb2sgYXQgdGhlIGZpbGVzIGluIHRoZSBkaXIuCisKKyAtIFVubW91bnQgdGhlIHJvb3RmcyBmcm9tIHRoZSBtb3VudHBvaW50OgorCisJdW1vdW50IGxvb3AKKworIC0gQ29tcHJlc3MgaXQ6CisKKwlnemlwIC05IHJvb3RmcworCisKK01ha2luZyBhIFNZU0xJTlVYIGJvb3QgZmxvcHB5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIHN0ZXBzIHdpbGwgY3JlYXRlIHRoZSBib290IGZsb3BweS4KKworTm90ZTogWW91IHdpbGwgbmVlZCB0byBoYXZlIHRoZSBtdG9vbHMgcGFja2FnZSBpbnN0YWxsZWQgYmVmb3JlaGFuZC4KKworIC0gSW5zZXJ0IGEgZmxvcHB5IGluIHRoZSBkcml2ZSBhbmQgZm9ybWF0IGl0IHdpdGggYW4gTVNET1MgZmlsZXN5c3RlbToKKworCW1mb3JtYXQgYToKKworCShpZiB0aGUgc3lzdGVtIGRvZXNuJ3Qga25vdyB3aGF0IGRldmljZSAnYTonIGlzLCBsb29rIGF0IC9ldGMvbXRvb2xzLmNvbmYpCisKKyAtIFJ1biBzeXNsaW51eCBvbiB0aGUgZmxvcHB5OgorCisJc3lzbGludXggLXMgL2Rldi9mZDAKKworCSh0aGUgLXMgc3RhbmRzIGZvciAic2FmZSwgc2xvdywgYW5kIHN0dXBpZCIgYW5kIHNob3VsZCB3b3JrIGJldHRlciB3aXRoCisJYnVnZ3kgQklPU2VzOyBpdCBjYW4gYmUgb21pdHRlZCkKKworIC0gUHV0IG9uIGEgc3lzbGludXguY2ZnIGZpbGU6CisKKwltY29weSBzeXNsaW51eC5jZmcgYToKKworCShtb3JlIG9uIHN5c2xpbnV4LmNmZyBiZWxvdykKKworIC0gQ29weSB0aGUgcm9vdCBmaWxlIHN5c3RlbSB5b3UgbWFkZSBvbnRvIHRoZSBNU0RPUyBmb3JtYXR0ZWQgZmxvcHB5CisKKwltY29weSByb290ZnMuZ3ogYToKKworIC0gQnVpbGQgYSBsaW51eCBrZXJuZWwgYW5kIGNvcHkgaXQgb250byB0aGUgZGlzayB3aXRoIHRoZSBmaWxlbmFtZSAnbGludXgnCisKKwltY29weSBiekltYWdlIGE6bGludXgKKworCitTYW1wbGUgc3lzbGludXguY2ZnCit+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBmb2xsb3dpbmcgc2ltcGxlIHN5c2xpbnV4LmNmZyBmaWxlIHNob3VsZCB3b3JrLiBZb3UgY2FuIHR3ZWFrIGl0IGlmIHlvdQorbGlrZS4KKworLS0tLWJlZ2luLXN5c2xpbnV4LmNmZy0tLS0tLS0tLS0tLS0tLQorREVGQVVMVCBsaW51eAorQVBQRU5EIGluaXRyZD1yb290ZnMuZ3ogcm9vdD0vZGV2L3JhbTAKK1RJTUVPVVQgMTAKK1BST01QVCAxCistLS0tZW5kLXN5c2xpbnV4LmNmZy0tLS0tLS0tLS0tLS0tLQorCitTb21lIGNoYW5nZXMgeW91IGNvdWxkIG1ha2UgdG8gc3lzbGludXguY2ZnOgorCisgLSBUaGlzIHZhbHVlIGlzIHRoZSBudW1iZXIgc2Vjb25kcyBpdCB3aWxsIHdhaXQgYmVmb3JlIGJvb3RpbmcuIFlvdSBjYW4gc2V0CisgICB0aGUgdGltZW91dCB0byAwIChvciBvbWl0KSB0byBib290IGluc3RhbnRseSwgb3IgeW91IGNhbiBzZXQgaXQgYXMgaGlnaCBhcworICAgMTAgdG8gd2FpdCBhd2hpbGUuCisKKyAtIFBST01QVCBjYW4gYmUgc2V0IHRvIDAgdG8gZGlzYWJsZSB0aGUgJ2Jvb3Q6JyBwcm9tcHQuCisKKyAtIHlvdSBjYW4gYWRkIHRoaXMgbGluZSB0byBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYXMgYSB3ZWxjb21lCisgICBtZXNzYWdlOgorCisJRElTUExBWSBkaXNwbGF5LnR4dAorCisKKworQWRkaXRpb25hbCBSZXNvdXJjZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK090aGVyIHVzZWZ1bCBpbmZvcm1hdGlvbiBvbiBtYWtpbmcgYSBMaW51eCBib290ZmxvcHB5IGlzIGF2YWlsYWJsZSBhdCB0aGUKK2ZvbGxvd2luZyBVUkxzOgorCitodHRwOi8vd3d3LmxpbnV4ZG9jLm9yZy9IT1dUTy9Cb290ZGlzay1IT1dUTy9pbmRleC5odG1sCitodHRwOi8vd3d3LmxpbnV4LWVtYmVkZGVkLmNvbS9ob3d0by9FbWJlZGRlZC1MaW51eC1Ib3d0by5odG1sCitodHRwOi8vbGludXgtZW1iZWRkZWQub3JnL2hvd3RvL0xGUy1IT1dUTy5odG1sCitodHRwOi8vbGludXgtZW1iZWRkZWQub3JnL3BtaG93dG8uaHRtbAoraHR0cDovL3JlY3ljbGUubGJsLmdvdi9+bGRvb2xpdHQvZW1iZWRkZWQvIChMYXJyeSBEb29saXR0bGUncyBzdHVmZikKKworCisKK1Bvc3NpYmxlIFRPRE9zCistLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGZlYXR1cmVzIHRoYXQgd2UgbWlnaHQgd2FudCB0byBhZGQgbGF0ZXI6CisKKyAtIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgZmlsZXN5c3RlbXMgYmVzaWRlcyBleHQyLCBpLmUuIG1pbml4CisgLSBkaWZmZXJlbnQgbGliYywgc3RhdGljIHZzIGR5bmFtaWMgbG9hZGluZworIC0gbWF5YmUgdXNpbmcgYW4gYWx0ZXJuYXRlIGJvb3Rsb2FkZXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZGlzcGxheS50eHQgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L2Rpc3BsYXkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWU0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L2Rpc3BsYXkudHh0CkBAIC0wLDAgKzEsMyBAQAorCitUaGlzIGJvb3QgZmxvcHB5IGlzIG1hZGUgd2l0aCBCdXN5Ym94LCB1Q2xpYmMsIGFuZCB0aGUgTGludXgga2VybmVsLgorSGl0IFJFVFVSTiB0byBib290IG9yIGVudGVyIGJvb3QgcGFyYW1ldGVycyBhdCB0aGUgcHJvbXB0IGJlbG93LgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvZnN0YWIgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9mc3RhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFmNjAyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvZnN0YWIKQEAgLTAsMCArMSBAQAorcHJvYwkJL3Byb2MJcHJvYwlkZWZhdWx0cyAgICAwCTAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL2luaXQuZC9yY1MgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9pbml0LmQvcmNTCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMjliOTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9pbml0LmQvcmNTCkBAIC0wLDAgKzEsMyBAQAorIyEgL2Jpbi9zaAorCisvYmluL21vdW50IC1hCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9pbml0dGFiIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvaW5pdHRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM5ZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvaW5pdHRhYgpAQCAtMCwwICsxLDQgQEAKKzo6c3lzaW5pdDovZXRjL2luaXQuZC9yY1MKKzo6cmVzcGF3bjotL2Jpbi9zaAordHR5Mjo6YXNrZmlyc3Q6LS9iaW4vc2gKKzo6Y3RybGFsdGRlbDovYmluL3Vtb3VudCAtYSAtcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvcHJvZmlsZSBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL3Byb2ZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2OGQzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL3Byb2ZpbGUKQEAgLTAsMCArMSw3IEBACisjIC9ldGMvcHJvZmlsZTogc3lzdGVtLXdpZGUgLnByb2ZpbGUgZmlsZSBmb3IgdGhlIEJvdXJuZSBzaGVsbHMKKworZWNobworZWNobyAtbiAiUHJvY2Vzc2luZyAvZXRjL3Byb2ZpbGUuLi4gIgorIyBuby1vcAorZWNobyAiRG9uZSIKK2VjaG8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtkZXZzLnNoIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9ta2RldnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGU5NTEyZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtkZXZzLnNoCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9zaAorIworIyBtYWtlZGV2LnNoIC0gY3JlYXRlcyBkZXZpY2UgZmlsZXMgZm9yIGEgYnVzeWJveCBib290IGZsb3BweSBpbWFnZQorCisKKyMgd2UgZG8gb3VyIHdvcmsgaW4gdGhlIGRldi8gZGlyZWN0b3J5CitpZiBbIC16ICIkMSIgXTsgdGhlbgorCWVjaG8gInVzYWdlOiBgYmFzZW5hbWUgJDBgIHBhdGgvdG8vZGV2L2RpciIKKwlleGl0IDEKK2ZpCisKK2NkICQxCisKKworIyBtaXNjZWxsYW5lb3VzIG9uZS1vZi1hLWtpbmQgc3R1ZmYKK21rbm9kIGNvbnNvbGUgYyA1IDEKK21rbm9kIGZ1bGwgYyAxIDcKK21rbm9kIGttZW0gYyAxIDIKK21rbm9kIG1lbSBjIDEgMQorbWtub2QgbnVsbCBjIDEgMworbWtub2QgcG9ydCBjIDEgNAorbWtub2QgcmFuZG9tIGMgMSA4Citta25vZCB1cmFuZG9tIGMgMSA5Citta25vZCB6ZXJvIGMgMSA1CitsbiAtcyAvcHJvYy9rY29yZSBjb3JlCisKKyMgSURFIEhEIGRldnMKKyMgbm90ZTogbm90IGdvaW5nIHRvIGJvdGhlciBjcmVhdGluZyBhbGwgY29uY2lldmFibGUgcGFydGl0aW9uczsgeW91IGNhbiBkbworIyB0aGF0IHlvdXJzZWxmIGFzIHlvdSBuZWVkICdlbS4KK21rbm9kIGhkYSBiIDMgMAorbWtub2QgaGRiIGIgMyA2NAorbWtub2QgaGRjIGIgMjIgMAorbWtub2QgaGRkIGIgMjIgNjQKKworIyBsb29wIGRldnMKK2ZvciBpIGluIGBzZXEgMCA3YDsgZG8KKwlta25vZCBsb29wJGkgYiA3ICRpCitkb25lCisKKyMgcmFtIGRldnMKK2ZvciBpIGluIGBzZXEgMCA5YDsgZG8KKwlta25vZCByYW0kaSBiIDEgJGkKK2RvbmUKK2xuIC1zIHJhbTEgcmFtCisKKyMgdHR5cworbWtub2QgdHR5IGMgNSAwCitmb3IgaSBpbiBgc2VxIDAgOWA7IGRvCisJbWtub2QgdHR5JGkgYyA0ICRpCitkb25lCisKKyMgdmlydHVhbCBjb25zb2xlIHNjcmVlbiBkZXZzCitmb3IgaSBpbiBgc2VxIDAgOWA7IGRvCisJbWtub2QgdmNzJGkgYiA3ICRpCitkb25lCitsbiAtcyB2Y3MwIHZjcworCisjIHZpcnR1YWwgY29uc29sZSBzY3JlZW4gdy8gYXR0cmlidXRlcyBkZXZzCitmb3IgaSBpbiBgc2VxIDAgOWA7IGRvCisJbWtub2QgdmNzYSRpIGIgNyAkKCgxMjggKyBpKSkKK2RvbmUKK2xuIC1zIHZjc2EwIHZjc2EKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtyb290ZnMuc2ggYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L21rcm9vdGZzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3ZmM0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L21rcm9vdGZzLnNoCkBAIC0wLDAgKzEsMTA0IEBACisjIS9iaW4vYmFzaAorIworIyBta3Jvb3Rmcy5zaCAtIGNyZWF0ZXMgYSByb290IGZpbGUgc3lzdGVtCisjCisKKyMgVE9ETzogbmVlZCB0byBhZGQgY2hlY2tzIGhlcmUgdG8gdmVyaWZ5IHRoYXQgYnVzeWJveCwgdUNsaWJjIGFuZCBiekltYWdlCisjIGV4aXN0CisKKworIyBjb21tYW5kLWxpbmUgc2V0dGFibGUgdmFyaWFibGVzCitCVVNZQk9YX0RJUj0uLgorVUNMSUJDX0RJUj0uLi8uLi91Q2xpYmMKK1RBUkdFVF9ESVI9Li9sb29wCitGU1NJWkU9NDAwMAorQ0xFQU5VUD0xCitNS0ZTPSdta2ZzLmV4dDIgLUYnCisKKyMgZG9uJ3QtdG91Y2ggdmFyaWFibGVzCitCQVNFX0RJUj1gcHdkYAorCisKK3doaWxlIGdldG9wdHMgJ2I6dTpzOnQ6Q20nIG9wdAorZG8KKwljYXNlICRvcHQgaW4KKwkJYikgQlVTWUJPWF9ESVI9JE9QVEFSRyA7OworCQl1KSBVQ0xJQkNfRElSPSRPUFRBUkcgOzsKKwkJdCkgVEFSR0VUX0RJUj0kT1BUQVJHIDs7CisJCXMpIEZTU0laRT0kT1BUQVJHIDs7CisJCUMpIENMRUFOVVA9MCA7OworCQltKSBNS0ZTPSdta2ZzLm1pbml4JyA7OworCQkqKQorCQkJZWNobyAidXNhZ2U6IGBiYXNlbmFtZSAkMGAgWy1idV0iCisJCQllY2hvICIgIC1iIERJUiAgcGF0aCB0byBidXN5Ym94IGRpcmVjb3J5IChkZWZhdWx0IC4uKSIKKwkJCWVjaG8gIiAgLXUgRElSICBwYXRoIHRvIHVDbGliYyBkaXJlY29yeSAoZGVmYXVsdCAuLi8uLi91Q2xpYmMpIgorCQkJZWNobyAiICAtdCBESVIgIHBhdGggdG8gdGFyZ2V0IGRpcmVjb3J5IChkZWZhdWx0IC4vbG9vcCkiCisJCQllY2hvICIgIC1zIFNJWkUgc2l6ZSBvZiByb290IGZpbGVzeXN0ZW0gaW4gS2J5dGVzIChkZWZhdWx0IDQwMDApIgorCQkJZWNobyAiICAtQyAgICAgIGRvbid0IHBlcmZvcm0gY2xlYW51cCAodW1vdW50IHRhcmdldCBkaXIsIGd6aXAgcm9vdGZzLCBldGMuKSIKKwkJCWVjaG8gIiAgICAgICAgICAodGhpcyBhbGxvd3MgeW91IHRvICdjaHJvb3QgbG9vcC8gL2Jpbi9zaCcgdG8gdGVzdCBpdCkiCisJCQllY2hvICIgIC1tICAgICAgdXNlIG1pbml4IGZpbGVzeXN0ZW0gKGRlZmF1bHQgaXMgZXh0MikiCisJCQlleGl0IDEKKwkJCTs7CisJZXNhYworZG9uZQorCisKKworCisjIGNsZWFuIHVwIGZyb20gYW55IHByZXZpb3VzIHdvcmsKK21vdW50IHwgZ3JlcCAtcSBsb29wCitbICQ/IC1lcSAwIF0gJiYgdW1vdW50ICRUQVJHRVRfRElSCitbIC1kICRUQVJHRVRfRElSIF0gJiYgcm0gLXJmICRUQVJHRVRfRElSLworWyAtZiByb290ZnMgXSAmJiBybSAtZiByb290ZnMKK1sgLWYgcm9vdGZzLmd6IF0gJiYgcm0gLWYgcm9vdGZzLmd6CisKKworIyBwcmVwYXJlIHJvb3QgZmlsZSBzeXN0ZW0gYW5kIG1vdW50IGFzIGxvb3BiYWNrCitkZCBpZj0vZGV2L3plcm8gb2Y9cm9vdGZzIGJzPTFrIGNvdW50PSRGU1NJWkUKKyRNS0ZTIC1pIDIwMDAgcm9vdGZzCitta2RpciAkVEFSR0VUX0RJUgorbW91bnQgLW8gbG9vcCxleGVjIHJvb3RmcyAkVEFSR0VUX0RJUiAjIG11c3QgYmUgcm9vdAorCisKKyMgaW5zdGFsbCB1Q2xpYmMKK21rZGlyIC1wICRUQVJHRVRfRElSL2xpYgorY2QgJFVDTElCQ19ESVIKK21ha2UgSU5TVEFMTF9ESVI9CitjcCAtYSBsaWJjLnNvKiAkQkFTRV9ESVIvJFRBUkdFVF9ESVIvbGliCitjcCAtYSB1Q2xpYmMqLnNvICRCQVNFX0RJUi8kVEFSR0VUX0RJUi9saWIKK2NwIC1hIGxkLnNvLTEvZC1saW5rL2xkLWxpbnV4LXVjbGliYy5zbyogJEJBU0VfRElSLyRUQVJHRVRfRElSL2xpYgorY3AgLWEgbGQuc28tMS9saWJkbC9saWJkbC5zbyogJEJBU0VfRElSLyRUQVJHRVRfRElSL2xpYgorY3AgLWEgY3J5cHQvbGliY3J5cHQuc28qICRCQVNFX0RJUi8kVEFSR0VUX0RJUi9saWIKK2NkICRCQVNFX0RJUgorCisKKyMgaW5zdGFsbCBidXN5Ym94IGFuZCBjb21wb25lbnRzCitjZCAkQlVTWUJPWF9ESVIKK21ha2UgZGlzdGNsZWFuCittYWtlIENDPSRCQVNFX0RJUi8kVUNMSUJDX0RJUi9leHRyYS9nY2MtdUNsaWJjL2kzODYtdWNsaWJjLWdjYworbWFrZSBDT05GSUdfUFJFRklYPSRCQVNFX0RJUi8kVEFSR0VUX0RJUiBpbnN0YWxsCitjZCAkQkFTRV9ESVIKKworCisjIG1ha2UgZmlsZXMgaW4gL2RldgorbWtkaXIgJFRBUkdFVF9ESVIvZGV2CisuL21rZGV2cy5zaCAkVEFSR0VUX0RJUi9kZXYKKworCisjIG1ha2UgZmlsZXMgaW4gL2V0YworY3AgLWEgZXRjICRUQVJHRVRfRElSCitsbiAtcyAvcHJvYy9tb3VudHMgJFRBUkdFVF9ESVIvZXRjL210YWIKKworCisjIG90aGVyIG1pc2NlbGxhbmVvdXMgc2V0dXAKK21rZGlyICRUQVJHRVRfRElSL2luaXRyZAorbWtkaXIgJFRBUkdFVF9ESVIvcHJvYworCisKKyMgRG9uZS4gTWF5YmUgZG8gY2xlYW51cC4KK2lmIFsgJENMRUFOVVAgLWVxIDEgXQordGhlbgorCXVtb3VudCAkVEFSR0VUX0RJUgorCXJtZGlyICRUQVJHRVRfRElSCisJZ3ppcCAtOSByb290ZnMKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L21rc3lzbGludXguc2ggYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9ib290ZmxvcHB5L21rc3lzbGludXguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTI1NDE3MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtzeXNsaW51eC5zaApAQCAtMCwwICsxLDQ4IEBACisjIS9iaW4vYmFzaAorIworIyBGb3JtYXRzIGEgZmxvcHB5IHRvIHVzZSBTeXNsaW51eAorCitkdW1teT0iIgorCisKKyMgbmVlZCB0byBoYXZlIG10b29scyBpbnN0YWxsZWQKK2lmIFsgLXogYHdoaWNoIG1mb3JtYXRgIC1vIC16IGB3aGljaCBtY29weWAgXTsgdGhlbgorCWVjaG8gIllvdSBtdXN0IGhhdmUgdGhlIG10b29scyBwYWNrYWdlIGluc3RhbGxlZCB0byBydW4gdGhpcyBzY3JpcHQiCisJZXhpdCAxCitmaQorCisKKyMgbmVlZCBhbiBhcmcgZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUga2VybmVsCitpZiBbIC16ICIkMSIgXTsgdGhlbgorCWVjaG8gInVzYWdlOiBgYmFzZW5hbWUgJDBgIHBhdGgvdG8vbGludXgva2VybmVsIgorCWV4aXQgMQorZmkKKworCisjIG5lZWQgdG8gaGF2ZSBhIHJvb3QgZmlsZSBzeXN0ZW0gYnVpbHQKK2lmIFsgISAtZiByb290ZnMuZ3ogXTsgdGhlbgorCWVjaG8gIllvdSBuZWVkIHRvIGhhdmUgYSByb290ZnMgYnVpbHQgZmlyc3QuIgorCWVjaG8gIkhpdCBSRVRVUk4gdG8gbWFrZSBvbmUgbm93IG9yIENvbnRyb2wtQyB0byBxdWl0LiIKKwlyZWFkIGR1bW15CisJLi9ta3Jvb3Rmcy5zaAorZmkKKworCisjIHByZXBhcmUgdGhlIGZsb3BweQorZWNobyAiUGxlYXNlIGluc2VydCBhIGJsYW5rIGZsb3BweSBpbiB0aGUgZHJpdmUgYW5kIHByZXNzIFJFVFVSTiB0byBmb3JtYXQiCitlY2hvICIoV0FSTklORzogQWxsIGRhdGEgd2lsbCBiZSBlcmFzZWQhIEhpdCBDb250cm9sLUMgdG8gYWJvcnQpIgorcmVhZCBkdW1teQorCitlY2hvICJGb3JtYXR0aW5nIHRoZSBmbG9wcHkuLi4iCittZm9ybWF0IGE6CitlY2hvICJNYWtpbmcgaXQgYm9vdGFibGUgd2l0aCBTeXNsaW51eC4uLiIKK3N5c2xpbnV4IC1zIC9kZXYvZmQwCitlY2hvICJDb3B5aW5nIFN5c2xpbnV4IGNvbmZpZ3VyYXRpb24gZmlsZXMuLi4iCittY29weSBzeXNsaW51eC5jZmcgZGlzcGxheS50eHQgYToKK2VjaG8gIkNvcHlpbmcgcm9vdCBmaWxlc3lzdGVtIGZpbGUuLi4iCittY29weSByb290ZnMuZ3ogYToKKyMgWFhYOiBtYXliZSBjaGVjayBmb3IgIm5vIHNwYWNlIG9uIGRldmljZSIgZXJyb3JzIGhlcmUKK2VjaG8gIkNvcHlpbmcgbGludXgga2VybmVsLi4uIgorbWNvcHkgJDEgYTpsaW51eAorIyBYWFg6IG1heWJlIGNoZWNrIGZvciAibm8gc3BhY2Ugb24gZGV2aWNlIiBlcnJvcnMgaGVyZSB0b28KK2VjaG8gIkZpbmlzaGVkOiBib290IGZsb3BweSBjcmVhdGVkIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9xdWlja3N0YXJ0LnR4dCBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvcXVpY2tzdGFydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MDkwOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvcXVpY2tzdGFydC50eHQKQEAgLTAsMCArMSwxNSBAQAorUXVpY2tzdGFydCBvbiBtYWtpbmcgdGhlIEJ1c3lib3ggYm9vdC1mbG9wcHk6CisKKyAgMSkgRG93bmxvYWQgQnVzeWJveCBhbmQgdUNsaWJjIGZyb20gQ1ZTIG9yIHRhcmJhbGxzLiBNYWtlIHN1cmUgdGhleSBzaGFyZSBhCisgICAgIGNvbW1vbiBwYXJlbnQgZGlyZWN0b3J5LiAoaS5lLiBidXN5Ym94LyBhbmQgdWNsaWJjLyBhcmUgYm90aCByaWdodCBvZmYgb2YKKwkgL3RtcCwgb3Igd2hlcmV2ZXIuKQorCisgIDIpIEJ1aWxkIGEgTGludXgga2VybmVsLiBNYWtlIHN1cmUgeW91IGluY2x1ZGUgc3VwcG9ydCBmb3IgaW5pdHJkLgorCisgIDMpIFB1dCBhIGZsb3BweSBpbiB0aGUgZHJpdmUuIE1ha2Ugc3VyZSBpdCBpcyBhIGZsb3BweSB5b3UgZG9uJ3QgY2FyZSBhYm91dAorICAgICBiZWNhdXNlIHRoZSBjb250ZW50cyB3aWxsIGJlIG92ZXJ3cml0dGVuLgorCisgIDQpIEFzIHJvb3QsIHR5cGUgLi9ta3N5c2xpbnV4LnNoIHBhdGgvdG8vbGludXgva2VybmVsIGZyb20gdGhpcyBkaXJlY3RvcnkuCisgICAgIFdhaXQgcGF0aWVudGx5IHdoaWxlIHRoZSBtYWdpYyBoYXBwZW5zLgorCisgIDUpIEJvb3QgdXAgb24gdGhlIGZsb3BweS4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvc3lzbGludXguY2ZnIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYm9vdGZsb3BweS9zeXNsaW51eC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyNjc3YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Jvb3RmbG9wcHkvc3lzbGludXguY2ZnCkBAIC0wLDAgKzEsNyBAQAorZGlzcGxheSBkaXNwbGF5LnR4dAorZGVmYXVsdCBsaW51eAordGltZW91dCAxMAorcHJvbXB0IDEKK2xhYmVsIGxpbnV4CisJa2VybmVsIGxpbnV4CisJYXBwZW5kIGluaXRyZD1yb290ZnMuZ3ogcm9vdD0vZGV2L3JhbTAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2J1c3lib3guc3BlYyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2J1c3lib3guc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QwMDUxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvYnVzeWJveC5zcGVjCkBAIC0wLDAgKzEsMTIwIEBACitTdW1tYXJ5OiBTdGF0aWNhbGx5IGxpbmtlZCBiaW5hcnkgcHJvdmlkaW5nIHNpbXBsaWZpZWQgdmVyc2lvbnMgb2Ygc3lzdGVtIGNvbW1hbmRzCitOYW1lOiBidXN5Ym94CitWZXJzaW9uOiAxLjE1LjEKK1JlbGVhc2U6IDElez9kaXN0fQorRXBvY2g6IDEKK0xpY2Vuc2U6IEdQTHYyCitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L1NoZWxscworU291cmNlOiBodHRwOi8vd3d3LmJ1c3lib3gubmV0L2Rvd25sb2Fkcy8le25hbWV9LSV7dmVyc2lvbn0udGFyLmJ6MgorU291cmNlMTogYnVzeWJveC1zdGF0aWMuY29uZmlnCitTb3VyY2UyOiBidXN5Ym94LXBldGl0Ym9vdC5jb25maWcKK1NvdXJjZTM6IGh0dHA6Ly93d3cudWNsaWJjLm9yZy9kb3dubG9hZHMvdUNsaWJjLTAuOS4zMC4xLnRhci5iejIKK1NvdXJjZTQ6IHVDbGliYy5jb25maWcKK1BhdGNoMTY6IGJ1c3lib3gtMS4xMC4xLWh3Y2xvY2sucGF0Y2gKKyMgcGF0Y2ggdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZ2V0bGluZSgpIGZyb20gc3RkaW8uaCwgYWxyZWFkeSBwcmVzZW50IGluIHVwc3RyZWFtIFZDUworUGF0Y2gyMjogdUNsaWJjLTAuOS4zMC4xLWdldGxpbmUucGF0Y2gKK09ic29sZXRlczogYnVzeWJveC1hbmFjb25kYQorVVJMOiBodHRwOi8vd3d3LmJ1c3lib3gubmV0CitCdWlsZFJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVhc2V9LXJvb3QtJSgle19faWRfdX0gLW4pCitCdWlsZFJlcXVpcmVzOiBsaWJzZWxpbnV4LWRldmVsID49IDEuMjcuNy0yCitCdWlsZFJlcXVpcmVzOiBsaWJzZXBvbC1kZXZlbAorQnVpbGRSZXF1aXJlczogbGlic2VsaW51eC1zdGF0aWMKK0J1aWxkUmVxdWlyZXM6IGxpYnNlcG9sLXN0YXRpYworQnVpbGRSZXF1aXJlczogZ2xpYmMtc3RhdGljCisKKyVkZWZpbmUgZGVidWdfcGFja2FnZSAle25pbH0KKworJXBhY2thZ2UgcGV0aXRib290CitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L1NoZWxscworU3VtbWFyeTogVmVyc2lvbiBvZiBidXN5Ym94IGNvbmZpZ3VyZWQgZm9yIHVzZSB3aXRoIHBldGl0Ym9vdAorCislZGVzY3JpcHRpb24KK0J1c3lib3ggaXMgYSBzaW5nbGUgYmluYXJ5IHdoaWNoIGluY2x1ZGVzIHZlcnNpb25zIG9mIGEgbGFyZ2UgbnVtYmVyCitvZiBzeXN0ZW0gY29tbWFuZHMsIGluY2x1ZGluZyBhIHNoZWxsLiAgVGhpcyBwYWNrYWdlIGNhbiBiZSB2ZXJ5Cit1c2VmdWwgZm9yIHJlY292ZXJpbmcgZnJvbSBjZXJ0YWluIHR5cGVzIG9mIHN5c3RlbSBmYWlsdXJlcywKK3BhcnRpY3VsYXJseSB0aG9zZSBpbnZvbHZpbmcgYnJva2VuIHNoYXJlZCBsaWJyYXJpZXMuCisKKyVkZXNjcmlwdGlvbiBwZXRpdGJvb3QKK0J1c3lib3ggaXMgYSBzaW5nbGUgYmluYXJ5IHdoaWNoIGluY2x1ZGVzIHZlcnNpb25zIG9mIGEgbGFyZ2UgbnVtYmVyCitvZiBzeXN0ZW0gY29tbWFuZHMsIGluY2x1ZGluZyBhIHNoZWxsLiAgVGhlIHZlcnNpb24gY29udGFpbmVkIGluIHRoaXMKK3BhY2thZ2UgaXMgYSBtaW5pbWFsIGNvbmZpZ3VyYXRpb24gaW50ZW5kZWQgZm9yIHVzZSB3aXRoIHRoZSBQZXRpdGJvb3QKK2Jvb3Rsb2FkZXIgdXNlZCBvbiBQbGF5U3RhdGlvbiAzLiBUaGUgYnVzeWJveCBwYWNrYWdlIHByb3ZpZGVzIGEgYmluYXJ5CitiZXR0ZXIgc3VpdGVkIHRvIG5vcm1hbCB1c2UuCisKKyVwcmVwCislc2V0dXAgLXEgLWEzCislcGF0Y2gxNiAtYiAuaWE2NCAtcDEKK2NhdCAle1NPVVJDRTR9ID51Q2xpYmMtMC45LjMwLjEvLmNvbmZpZzEKKyVwYXRjaDIyIC1iIC5nZXRsaW5lIC1wMQorCislYnVpbGQKKyMgY3JlYXRlIHN0YXRpYyBidXN5Ym94IC0gdGhlIGV4ZWN1dGFibGUgaXMga2VwdCBhcyBidXN5Ym94LXN0YXRpYworIyBXZSB1c2UgdWNsaWJjIGluc3RlYWQgb2Ygc3lzdGVtIGdsaWJjLCB1Y2xpYmMgaXMgc2V2ZXJhbCB0aW1lcworIyBzbWFsbGVyLCB0aGlzIGlzIGltcG9ydGFudCBmb3Igc3RhdGljIGJ1aWxkLgorIyBCdWlsZCB1Y2xpYmMgZmlyc3QuCitjZCB1Q2xpYmMtMC45LjMwLjEKKyMgZml4bWU6Citta2RpciBrZXJuZWwtaW5jbHVkZQorY3AgLWEgL3Vzci9pbmNsdWRlL2FzbSBrZXJuZWwtaW5jbHVkZQorY3AgLWEgL3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljIGtlcm5lbC1pbmNsdWRlCitjcCAtYSAvdXNyL2luY2x1ZGUvbGludXgga2VybmVsLWluY2x1ZGUKKyMgdWNsaWJjIGNhbid0IGJlIGJ1aWx0IG9uIHBwYzY0LHMzOTAsaWE2NCwgd2Ugc2V0ICRhcmNoIHRvICIiIGluIHRoaXMgY2FzZQorYXJjaD1gdW5hbWUgLW0gfCBzZWQgLWUgJ3MvaS44Ni9pMzg2LycgLWUgJ3MvcHBjL3Bvd2VycGMvJyAtZSAncy9wcGM2NC8vJyAtZSAncy9wb3dlcnBjNjQvLycgLWUgJ3MvaWE2NC8vJyAtZSAncy9zMzkwLiovLydgCitlY2hvICJUQVJHRVRfJGFyY2g9eSIgPi5jb25maWcKK2VjaG8gIlRBUkdFVF9BUkNIPVwiJGFyY2hcIiIgPj4uY29uZmlnCitjYXQgLmNvbmZpZzEgPj4uY29uZmlnCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4geWVzICIiIHwgbWFrZSBvbGRjb25maWc7IGZpCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4gY2F0IC5jb25maWc7IGZpCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4gbWFrZSBWPTE7IGZpCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4gbWFrZSBpbnN0YWxsOyBmaQoraWYgdGVzdCAiJGFyY2giOyB0aGVuIG1ha2UgaW5zdGFsbF9rZXJuZWxfaGVhZGVyczsgZmkKK2NkIC4uCisjIHdlIGFyZSBiYWNrIGluIGJ1c3lib3gtTk4uTU0gZGlyIG5vdworY3AgJXtTT1VSQ0UxfSAuY29uZmlnCisjIHNldCBhbGwgbmV3IG9wdGlvbnMgdG8gZGVmYXVsdHMKK3llcyAiIiB8IG1ha2Ugb2xkY29uZmlnCisjIGdjYyBuZWVkcyB0byBiZSBjb252aW5jZWQgdG8gdXNlIG5laXRoZXIgc3lzdGVtIGhlYWRlcnMsIG5vciBsaWJzLAorIyBub3Igc3RhcnRmaWxlcyAoaS5lLiBjcnRYWFgubyBmaWxlcykKK2lmIHRlc3QgIiRhcmNoIjsgdGhlbiBcCisgICAgbXYgLmNvbmZpZyAuY29uZmlnMSAmJiBcCisgICAgZ3JlcCAtdiBeQ09ORklHX1NFTElOVVggLmNvbmZpZzEgPi5jb25maWcgJiYgXAorICAgIHllcyAiIiB8IG1ha2Ugb2xkY29uZmlnICYmIFwKKyAgICBjYXQgLmNvbmZpZyAmJiBcCisgICAgbWFrZSBWPTEgXAorICAgICAgICBFWFRSQV9DRkxBR1M9Ii1pc3lzdGVtIHVDbGliYy0wLjkuMzAuMS9pbnN0YWxsZWQvaW5jbHVkZSIgXAorICAgICAgICBDRkxBR1NfYnVzeWJveD0iLXN0YXRpYyAtbm9zdGFydGZpbGVzIC1MdUNsaWJjLTAuOS4zMC4xL2luc3RhbGxlZC9saWIgdUNsaWJjLTAuOS4zMC4xL2luc3RhbGxlZC9saWIvY3J0MS5vIHVDbGliYy0wLjkuMzAuMS9pbnN0YWxsZWQvbGliL2NydGkubyB1Q2xpYmMtMC45LjMwLjEvaW5zdGFsbGVkL2xpYi9jcnRuLm8iOyBcCitlbHNlIFwKKyAgICBjYXQgLmNvbmZpZyAmJiBcCisgICAgbWFrZSBWPTEgQ0M9ImdjYyAkUlBNX09QVF9GTEFHUyI7IFwKK2ZpCitjcCBidXN5Ym94IGJ1c3lib3guc3RhdGljCisKKyMgY3JlYXRlIGJ1c3lib3ggb3B0aW1pemVkIGZvciBwZXRpdGJvb3QKK21ha2UgY2xlYW4KKyMgY29weSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCitjcCAle1NPVVJDRTJ9IC5jb25maWcKKyMgc2V0IGFsbCBuZXcgb3B0aW9ucyB0byBkZWZhdWx0cworeWVzICIiIHwgbWFrZSBvbGRjb25maWcKK21ha2UgVj0xIENDPSIlX19jYyAkUlBNX09QVF9GTEFHUyIKK2NwIGJ1c3lib3ggYnVzeWJveC5wZXRpdGJvb3QKKworJWluc3RhbGwKK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKK21rZGlyIC1wICRSUE1fQlVJTERfUk9PVC9zYmluCitpbnN0YWxsIC1tIDc1NSBidXN5Ym94LnN0YXRpYyAkUlBNX0JVSUxEX1JPT1Qvc2Jpbi9idXN5Ym94CitpbnN0YWxsIC1tIDc1NSBidXN5Ym94LnBldGl0Ym9vdCAkUlBNX0JVSUxEX1JPT1Qvc2Jpbi9idXN5Ym94LnBldGl0Ym9vdAorCislY2xlYW4KK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKKworJWZpbGVzCislZGVmYXR0cigtLHJvb3Qscm9vdCwtKQorJWRvYyBMSUNFTlNFIGRvY3MvYnVzeWJveC5uZXQvKi5odG1sCisvc2Jpbi9idXN5Ym94CisKKyVmaWxlcyBwZXRpdGJvb3QKKyVkZWZhdHRyKC0scm9vdCxyb290LC0pCislZG9jIExJQ0VOU0UKKy9zYmluL2J1c3lib3gucGV0aXRib290CisKKyVjaGFuZ2Vsb2cKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2RlcG1vZCBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2RlcG1vZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzY5NTkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvZGVwbW9kCkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9zaAorIworIyBTaW1wbGUgZGVwbW9kLCB1c2UgdG8gZ2VuZXJhdGUgbW9kcHJvYmUuY29uZgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorIworCitsb2NhbCBCQVNFPSIkezE6LS91c3IvbGliL21vZHVsZXN9IgorCitmaW5kICIkQkFTRSIgLW5hbWUgJyoua28uZ3onIHwgd2hpbGUgcmVhZCBJIDsgZG8KKwlOPWBiYXNlbmFtZSAiJEkiICcua28uZ3onYAorCWVjaG8gLW4gIkAkTiIKKwl6Y2F0ICIkSSIgfCBzdHJpbmdzIHwgZ3JlcCAnXmRlcGVuZHM9JyB8IHNlZCAtZSAncy9eZGVwZW5kcz0kLy8nIC1lICdzL15kZXBlbmRzPS8sLycgLWUgJ3MvLC8gQC9nJworZG9uZSB8IGF3ayAnCit7CisJIyBtb2R1bGVzIHdoaWNoIGhhcyBubyBkZXBlbmRlbmNpZXMgYXJlIHJlc29sdmVkCisJaWYgKCBORiA9PSAxICkgeyByZXNbJDFdID0gIiI7IG5leHQgfQorCSMgb3RoZXJzIGhhdmUgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhvc2Ugd2hpY2ggYWxyZWFkeSByZXNvbHZlZAorCWkgPSAkMTsgJDEgPSAiIjsgZGVwc1tpXSA9ICQwOyArK25kZXBzCit9CitFTkQgeworCSMgcmVzb2x2ZSBpbXBsaWNpdCBkZXBlbmRlbmNpZXMKKwl3aGlsZSAoIG5kZXBzICkgZm9yIChtb2QgaW4gZGVwcykgeworCQlpZiAoIGluZGV4KGRlcHNbbW9kXSwgIkAiKSA+IDAgKSB7CisJCQkkMCA9IGRlcHNbbW9kXQorCQkJZm9yICggaT0xOyBpPD1ORjsgKytpICkgeworCQkJCWlmICggc3Vic3RyKCRpLDEsMSkgPT0gIkAiICkgeworCQkJCQlpZiAoICRpIGluIHJlcyApIHsKKwkJCQkJCSRpID0gcmVzWyRpXSAiICIgc3Vic3RyKCRpLDIpCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlkZXBzW21vZF0gPSAkMAorCQl9IGVsc2UgeworCQkJcmVzW21vZF0gPSBkZXBzW21vZF0KKwkJCWRlbGV0ZSBkZXBzW21vZF0KKwkJCS0tbmRlcHMKKwkJfQorCX0KKworCSMgb3V0cHV0IGRlcGVuZGVuY2llcyBpbiBtb2R1bGVzLmRlcCBmb3JtYXQKKwlmb3IgKCBtb2QgaW4gcmVzICkgeworCQkkMCA9IHJlc1ttb2RdCisJCXMgPSAiIgorCQlkZWxldGUgYQorCQlmb3IgKCBpPTE7IGk8PU5GOyArK2kgKSB7CisJCQlpZiAoICEgKCRpIGluIGEpICkgeworCQkJCWFbJGldID0gJGkKKwkJCQlzID0gIiAsIiAkaSBzCisJCQl9CisJCX0KKwkJcHJpbnQgIiwiIHN1YnN0cihtb2QsMikgIjoiIHMKKwl9Cit9CisnIHwgc29ydCB8IHNlZCAtciAtZSAicyEsKFteLDogXSopIS91c3IvbGliL21vZHVsZXMvXFwxLmtvLmd6IWciCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9kZXBtb2QucGwgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9kZXBtb2QucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjMyNGIxMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2RlcG1vZC5wbApAQCAtMCwwICsxLDM1MyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjIHZpOiBzZXQgc3c9NCB0cz00OgorIyBDb3B5cmlnaHQgKGMpIDIwMDEgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAwMSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjIENvcHlyaWdodCAoYykgMjAwMSBTdHVhcnQgSHVnaGVzIDxzZWhAemVlMi5jb20+CisjIENvcHlyaWdodCAoYykgMjAwMiBTdGV2ZW4gSi4gSGlsbCA8c2hpbGxAYnJvYWRjb20uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYyA8c3R1YXJ0aEBmcmVlc2NhbGUuY29tPgorIworIyBIaXN0b3J5OgorIyBNYXJjaCAyMDA2OiBTdHVhcnQgSHVnaGVzIDxzdHVhcnRoQGZyZWVzY2FsZS5jb20+LgorIyAgICAgICAgICAgICBTaWduaWZpY2FudCB1cGRhdGVzLCBpbmNsdWRpbmcgaW1wbGVtZW50aW5nIHRoZSAnLUYnIG9wdGlvbgorIyAgICAgICAgICAgICBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIDIuNiBrZXJuZWxzLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgordXNlIEdldG9wdDo6TG9uZyBxdyg6Y29uZmlnIG5vX2F1dG9fYWJicmV2IG5vX2lnbm9yZV9jYXNlKTsKK3VzZSBGaWxlOjpGaW5kOwordXNlIHN0cmljdDsKKworIyBTZXQgdXAgc29tZSBkZWZhdWx0IHZhbHVlcworbXkgJGtkaXI9IiI7CitteSAkYmFzZWRpcj0iIjsKK215ICRrZXJuZWw9IiI7CitteSAka2VybmVsc3ltcz0iIjsKK215ICRzeW1wcmVmaXg9IiI7CitteSAkYWxsPTA7CitteSAkcXVpY2s9MDsKK215ICRlcnJzeW1zPTA7CitteSAkc3Rkb3V0PTA7CitteSAkdmVyYm9zZT0wOworbXkgJGhlbHA9MDsKK215ICRubSA9ICRFTlZ7J05NJ30gfHwgIm5tIjsKKworIyBtb3JlIGdsb2JhbHMKK215IChAbGlibGlzdCkgPSAoKTsKK215ICRleHAgPSB7fTsKK215ICRkZXAgPSB7fTsKK215ICRtb2QgPSB7fTsKKworbXkgJHVzYWdlID0gPDxUWFQ7CiskMCAtYiBiYXNlZGlyIHsgLWsgPHZtbGludXg+IHwgLUYgPFN5c3RlbS5tYXA+IH0gW29wdGlvbnNdLi4uCisgIFdoZXJlOgorICAgLWggLS1oZWxwICAgICAgICAgIDogU2hvdyB0aGlzIGhlbHAgc2NyZWVuCisgICAtYiAtLWJhc2VkaXIgICAgICAgOiBNb2R1bGVzIGJhc2UgZGlyZWN0b3J5IChlLmcgL2xpYi9tb2R1bGVzLzwyLngueT4pCisgICAtayAtLWtlcm5lbCAgICAgICAgOiBLZXJuZWwgYmluYXJ5IGZvciB0aGUgdGFyZ2V0IChlLmcuIHZtbGludXgpCisgICAtRiAtLWtlcm5lbHN5bXMgICAgOiBLZXJuZWwgc3ltYm9sIGZpbGUgKGUuZy4gU3lzdGVtLm1hcCkKKyAgIC1uIC0tc3Rkb3V0ICAgICAgICA6IFdyaXRlIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIDxiYXNlZGlyPi9tb2R1bGVzLmRlcAorICAgLXYgLS12ZXJib3NlICAgICAgIDogUHJpbnQgb3V0IGxvdHMgb2YgZGVidWdnaW5nIHN0dWZmCisgICAtUCAtLXN5bWJvbC1wcmVmaXggOiBTeW1ib2wgcHJlZml4CisgICAtYSAtLWFsbCAgICAgICAgICAgOiBQcm9iZSBhbGwgbW9kdWxlcyAoZGVmYXVsdC9vbmx5IHRoaW5nIHN1cHBvcnRlZCkKKyAgIC1lIC0tZXJyc3ltcyAgICAgICA6IFJlcG9ydCBhbnkgc3ltYm9scyBub3Qgc3VwcGxpZWQgYnkgbW9kdWxlcy9rZXJuZWwKK1RYVAorCisjIGdldCBjb21tYW5kLWxpbmUgb3B0aW9ucworR2V0T3B0aW9ucygKKwkiaGVscHxoIiAgICAgICAgICAgID0+IFwkaGVscCwKKwkiYmFzZWRpcnxiPXMiICAgICAgID0+IFwkYmFzZWRpciwKKwkia2VybmVsfGs9cyIgICAgICAgID0+IFwka2VybmVsLAorCSJrZXJuZWxzeW1zfEY9cyIgICAgPT4gXCRrZXJuZWxzeW1zLAorCSJzdGRvdXR8biIgICAgICAgICAgPT4gXCRzdGRvdXQsCisJInZlcmJvc2V8diIgICAgICAgICA9PiBcJHZlcmJvc2UsCisJInN5bWJvbC1wcmVmaXh8UD1zIiA9PiBcJHN5bXByZWZpeCwKKwkiYWxsfGEiICAgICAgICAgICAgID0+IFwkYWxsLAorCSMgdW5zdXBwb3J0ZWQgb3B0aW9ucworCSJxdWlja3xBIiAgICAgICAgICAgPT4gXCRxdWljaywKKwkjIGlnbm9yZWQgb3B0aW9ucyAoZm9yIGhpc3RvcmljYWwgdXNhZ2UpCisJInF1aWV0fHEiLAorCSJyb290fHIiLAorCSJ1bnJlc29sdmVkLWVycm9yfHUiCispOworCitkaWUgJHVzYWdlIGlmICRoZWxwOworZGllICR1c2FnZSB1bmxlc3MgJGJhc2VkaXIgJiYgKCAka2VybmVsIHx8ICRrZXJuZWxzeW1zICk7CitkaWUgImNhbid0IHVzZSBib3RoIC1rIGFuZCAtRlxuXG4kdXNhZ2UiIGlmICRrZXJuZWwgJiYgJGtlcm5lbHN5bXM7CitkaWUgInNvcnJ5LCAtQS8tLXF1aWNrIGlzIG5vdCBzdXBwb3J0ZWQiIGlmICRxdWljazsKK2RpZSAiLS1lcnJzeW1zIHJlcXVpcmVzIC0ta2VybmVsc3ltcyIgaWYgJGVycnN5bXMgJiYgISRrZXJuZWxzeW1zOworCisjIFN0cmlwIGFueSB0cmFpbGluZyBvciBtdWx0aXBsZSBzbGFzaGVzIGZyb20gYmFzZWRpcgorJGJhc2VkaXIgPX4gcy0vKyQtLWc7CisKKyMgVGhlIGJhc2UgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIC9saWIvbW9kdWxlcyBzb21ld2hlcmUKK2lmKCRiYXNlZGlyICF+IG0tL2xpYi9tb2R1bGVzLSkgeworICAgIHdhcm4gIldBUk5JTkc6IGJhc2UgZGlyZWN0b3J5IGRvZXMgbm90IG1hdGNoIC4uLi4vbGliL21vZHVsZXNcbiI7Cit9CisKKyMgaWYgbm8ga2VybmVsIHZlcnNpb24gaXMgY29udGFpbmVkIGluIHRoZSBiYXNlZGlyLCB0cnkgdG8gZmluZCBvbmUKK2lmKCRiYXNlZGlyICF+IG0tL2xpYi9tb2R1bGVzL1xkXC5cZC0pIHsKKyAgICBvcGVuZGlyKEJELCAkYmFzZWRpcikgb3IgZGllICJjYW4ndCBvcGVuIGJhc2VkaXIgJGJhc2VkaXIgOiAkIVxuIjsKKyAgICBmb3JlYWNoICggcmVhZGRpcihCRCkgKSB7CisgICAgICAgIG5leHQgaWYgL15cLlwuPyQvOworICAgICAgICBuZXh0IHVubGVzcyAtZCAiJGJhc2VkaXIvJF8iOworICAgICAgICB3YXJuICJkaXIgPSAkX1xuIiBpZiAkdmVyYm9zZTsKKyAgICAgICAgaWYoIC9eXGRcLlxkLyApIHsKKyAgICAgICAgICAgICRrZGlyID0gJF87CisgICAgICAgICAgICB3YXJuKCJHdWVzc2VkIG1vZHVsZSBkaXJlY3RvcnkgYXMgJGJhc2VkaXIvJGtkaXJcbiIpOworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbG9zZWRpcihCRCk7CisgICAgZGllICJDYW5ub3QgZmluZCBhIGtlcm5lbCB2ZXJzaW9uIHVuZGVyICRiYXNlZGlyXG4iIHVubGVzcyAka2RpcjsKKyAgICAkYmFzZWRpciA9ICIkYmFzZWRpci8ka2RpciI7Cit9CisKKyMgRmluZCB0aGUgbGlzdCBvZiAubyBvciAua28gZmlsZXMgbGl2aW5nIHVuZGVyICRiYXNlZGlyCit3YXJuICIqKioqIExvY2F0aW5nIGFsbCBtb2R1bGVzXG4iIGlmICR2ZXJib3NlOworZmluZCBzdWIgeworICAgIG15ICRmaWxlOworCWlmICggLWYgJF8gICYmICEgLWQgJF8gKSB7CisJCSRmaWxlID0gJEZpbGU6OkZpbmQ6Om5hbWU7CisJCWlmICggJGZpbGUgPX4gL1wuaz9vJC8gKSB7CisJCQlwdXNoKEBsaWJsaXN0LCAkZmlsZSk7CisJCQl3YXJuICIkZmlsZVxuIiBpZiAkdmVyYm9zZTsKKwkJfQorCX0KK30sICRiYXNlZGlyOword2FybiAiKioqKiBGaW5pc2hlZCBsb2NhdGluZyBtb2R1bGVzXG4iIGlmICR2ZXJib3NlOworCitmb3JlYWNoIG15ICRvYmogKCBAbGlibGlzdCApeworICAgICMgdHVybiB0aGUgaW5wdXQgZmlsZSBuYW1lIGludG8gYSB0YXJnZXQgdGFnIG5hbWUKKyAgICBteSAoJHRndG5hbWUpID0gJG9iaiA9fiBtLSgvbGliL21vZHVsZXMvLiopJC07CisKKyAgICB3YXJuICJcbk1PRFVMRSA9ICR0Z3RuYW1lXG4iIGlmICR2ZXJib3NlOworCisgICAgIyBnZXQgYSBsaXN0IG9mIHN5bWJvbHMKKwlteSBAb3V0cHV0PWAkbm0gJG9iamA7CisKKyAgICBidWlsZF9yZWZfdGFibGVzKCR0Z3RuYW1lLCBcQG91dHB1dCwgJGV4cCwgJGRlcCk7Cit9CisKKworIyB2bWxpbnV4IGlzIGEgc3BlY2lhbCBuYW1lIHRoYXQgaXMgb25seSB1c2VkIHRvIHJlc29sdmUgc3ltYm9scworbXkgJHRndG5hbWUgPSAndm1saW51eCc7CitteSBAb3V0cHV0ID0gJGtlcm5lbHN5bXMgPyBgY2F0ICRrZXJuZWxzeW1zYCA6IGAkbm0gJGtlcm5lbGA7Cit3YXJuICJcbk1PRFVMRSA9ICR0Z3RuYW1lXG4iIGlmICR2ZXJib3NlOworYnVpbGRfcmVmX3RhYmxlcygkdGd0bmFtZSwgXEBvdXRwdXQsICRleHAsICRkZXApOworCisjIHJlc29sdmUgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBtb2R1bGUKKyMgcmVkdWNlIGRlcGVuZGVuY2llczogcmVtb3ZlIHVucmVzb2x2YWJsZSBhbmQgcmVzb2x2ZWQgZnJvbSB2bWxpbnV4L1N5c3RlbS5tYXAKKyMgcmVtb3ZlIGR1cGxpY2F0ZXMKK2ZvcmVhY2ggbXkgJG1vZHVsZSAoa2V5cyAlJGRlcCkgeworICAgIHdhcm4gInJlZHVjaW5nIG1vZHVsZTogJG1vZHVsZVxuIiBpZiAkdmVyYm9zZTsKKyAgICAkbW9kLT57JG1vZHVsZX0gPSB7fTsKKyAgICBmb3JlYWNoIChAeyRkZXAtPnskbW9kdWxlfX0pIHsKKyAgICAgICAgaWYoICRleHAtPnskX30gKSB7CisgICAgICAgICAgICB3YXJuICJyZXNvbHZlZCBzeW1ib2wgJF8gaW4gZmlsZSAkZXhwLT57JF99XG4iIGlmICR2ZXJib3NlOworICAgICAgICAgICAgbmV4dCBpZiAkZXhwLT57JF99ID1+IC92bWxpbnV4LzsKKyAgICAgICAgICAgICRtb2QtPnskbW9kdWxlfXskZXhwLT57JF99fSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YXJuICJ1bnJlc29sdmVkIHN5bWJvbCAkXyBpbiBmaWxlICRtb2R1bGVcbiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyMgYnVpbGQgYSBjb21wbGV0ZSBkZXBlbmRlbmN5IGxpc3QgZm9yIGVhY2ggbW9kdWxlIGFuZCBtYWtlIHN1cmUgaXQKKyMgaXMga2VwdCBpbiBvcmRlciBwcm9wZXIgb3JkZXIKK215ICRtb2QyID0ge307CitzdWIgbWF5YmVfdW5zaGlmdAoreworCW15ICgkYXJyYXksICRlbGUpID0gQF87CisJIyBjaG9wIG9mZiB0aGUgbGVhZGluZyBwYXRoIC9saWIvbW9kdWxlcy88a3Zlcj4vIGFzIG1vZHByb2JlCisJIyB3aWxsIGhhbmRsZSByZWxhdGl2ZSBwYXRocyBqdXN0IGZpbmUKKwkkZWxlID1+IHM6Xi9saWIvbW9kdWxlcy9bXi9dKi86OjsKKwlmb3JlYWNoIChAeyRhcnJheX0pIHsKKwkJaWYgKCRfIGVxICRlbGUpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKwl1bnNoaWZ0IChAeyRhcnJheX0sICRlbGUpOworfQorc3ViIGFkZF9tb2RfZGVwcworeworCW15ICgkZGVwdGgsICRtb2QsICRtb2QyLCAkbW9kdWxlLCAkdGhpc19tb2R1bGUpID0gQF87CisKKwkkZGVwdGggLj0gIiAiOworCXdhcm4gIiR7ZGVwdGh9bG9hZGluZyBkZXBzIG9mIG1vZHVsZTogJHRoaXNfbW9kdWxlXG4iIGlmICR2ZXJib3NlOworCWlmIChsZW5ndGgoJGRlcHRoKSA+IDUwKSB7CisJCWRpZSAidG9vIG11Y2ggcmVjdXJzaW9uIChjaXJjdWxhciBkZXBlbmRlbmNpZXMgaW4gbW9kdWxlcz8pIjsKKwl9CisKKwlmb3JlYWNoIG15ICRtZCAoa2V5cyAleyRtb2QtPnskdGhpc19tb2R1bGV9fSkgeworCQlhZGRfbW9kX2RlcHMgKCRkZXB0aCwgJG1vZCwgJG1vZDIsICRtb2R1bGUsICRtZCk7CisJCXdhcm4gIiR7ZGVwdGh9IG91dHB1dHRpbmcgJG1kXG4iIGlmICR2ZXJib3NlOworCQltYXliZV91bnNoaWZ0IChcQHskJG1vZDItPnskbW9kdWxlfX0sICRtZCk7CisJfQorCisJaWYgKCEleyRtb2QtPnskdGhpc19tb2R1bGV9fSkgeworCQl3YXJuICIke2RlcHRofSBubyBkZXBzXG4iIGlmICR2ZXJib3NlOworCX0KK30KK2ZvcmVhY2ggbXkgJG1vZHVsZSAoa2V5cyAlJG1vZCkgeworCXdhcm4gImZpbGxpbmcgb3V0IG1vZHVsZTogJG1vZHVsZVxuIiBpZiAkdmVyYm9zZTsKKwlAeyRtb2QyLT57JG1vZHVsZX19ID0gKCk7CisJYWRkX21vZF9kZXBzICgiIiwgJG1vZCwgXCRtb2QyLCAkbW9kdWxlLCAkbW9kdWxlKTsKK30KKworIyBmaWd1cmUgb3V0IHdoZXJlIHRoZSBvdXRwdXQgc2hvdWxkIGdvCitpZiAoJHN0ZG91dCA9PSAwKSB7CisJd2FybiAid3JpdGluZyAkYmFzZWRpci9tb2R1bGVzLmRlcFxuIiBpZiAkdmVyYm9zZTsKKyAgICBvcGVuKFNURE9VVCwgIj4kYmFzZWRpci9tb2R1bGVzLmRlcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRpZSAiY2Fubm90IG9wZW4gJGJhc2VkaXIvbW9kdWxlcy5kZXA6ICQhIjsKK30KK215ICRrc2VyaWVzID0gJGJhc2VkaXIgPX4gbSwvMlwuNlwuW14vXSosID8gJzIuNicgOiAnMi40JzsKKworZm9yZWFjaCBteSAkbW9kdWxlICgga2V5cyAlJG1vZCApIHsKKyAgICBpZigka3NlcmllcyBlcSAnMi40JykgeworCSAgICBwcmludCAiJG1vZHVsZTpcdCI7CisJICAgIG15IEBzb3J0ZWQgPSBzb3J0IGJ5ZGVwIGtleXMgJXskbW9kLT57JG1vZHVsZX19OworCSAgICBwcmludCBqb2luKCIgXFxcblx0IixAc29ydGVkKTsKKwkgICAgcHJpbnQgIlxuXG4iOworICAgIH0gZWxzZSB7CisJICAgIG15ICRzaG9ydG1vZCA9ICRtb2R1bGU7CisJICAgICRzaG9ydG1vZCA9fiBzOl4vbGliL21vZHVsZXMvW14vXSovOjo7CisJICAgIHByaW50ICIkc2hvcnRtb2Q6IjsKKwkgICAgbXkgQHNvcnRlZCA9IEB7JG1vZDItPnskbW9kdWxlfX07CisJICAgIHByaW50ZiAiICIgaWYgQHNvcnRlZDsKKwkgICAgcHJpbnQgam9pbigiICIsQHNvcnRlZCk7CisJICAgIHByaW50ICJcbiI7CisgICAgfQorfQorCisKK3N1YiBidWlsZF9yZWZfdGFibGVzCit7CisgICAgbXkgKCRuYW1lLCAkc3ltX2FyLCAkZXhwLCAkZGVwKSA9IEBfOworCisJbXkgJGtzeW10YWIgPSBncmVwIG0vICR7c3ltcHJlZml4fV9fa3N5bXRhYi8sIEAkc3ltX2FyOworCisgICAgIyBnYXRoZXIgdGhlIGV4cG9ydGVkIHN5bWJvbHMKKwlpZigka3N5bXRhYil7CisgICAgICAgICMgZXhwbGljaXRseSBleHBvcnRlZAorICAgICAgICBmb3JlYWNoICggQCRzeW1fYXIgKSB7CisgICAgICAgICAgICAvICR7c3ltcHJlZml4fV9fa3N5bXRhYl8oLiopJC8gYW5kIGRvIHsKKyAgICAgICAgICAgICAgICBteSAkc3ltID0gJHtzeW1wcmVmaXh9IC4gJDE7CisgICAgICAgICAgICAgICAgd2FybiAic3ltID0gJHN5bVxuIiBpZiAkdmVyYm9zZTsKKyAgICAgICAgICAgICAgICAkZXhwLT57JHN5bX0gPSAkbmFtZTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKwl9IGVsc2UgeworICAgICAgICAjIGV4cG9ydGluZyBhbGwgc3ltYm9scworICAgICAgICBmb3JlYWNoICggQCRzeW1fYXIgKSB7CisgICAgICAgICAgICAvIFtBQkNER1JTVFddICguKikkLyBhbmQgZG8geworICAgICAgICAgICAgICAgIHdhcm4gInN5bWEgPSAkMVxuIiBpZiAkdmVyYm9zZTsKKyAgICAgICAgICAgICAgICAkZXhwLT57JDF9ID0gJG5hbWU7CisgICAgICAgICAgICB9OworICAgICAgICB9CisJfQorCisgICAgIyB0aGlzIHRha2VzIG1ha2VzIHN1cmUgbW9kdWxlcyB3aXRoIG5vIGRlcGVuZGVuY2llcyBnZXQgbGlzdGVkCisgICAgcHVzaCBAeyRkZXAtPnskbmFtZX19LCAkc3ltcHJlZml4IC4gJ3ByaW50aycgdW5sZXNzICRuYW1lIGVxICd2bWxpbnV4JzsKKworICAgICMgZ2F0aGVyIHRoZSB1bnJlc29sdmVkIHN5bWJvbHMKKyAgICBmb3JlYWNoICggQCRzeW1fYXIgKSB7CisgICAgICAgICEvICR7c3ltcHJlZml4fV9fdGhpc19tb2R1bGUvICYmIC8gVSAoLiopJC8gYW5kIGRvIHsKKyAgICAgICAgICAgIHdhcm4gInVuZCA9ICQxXG4iIGlmICR2ZXJib3NlOworICAgICAgICAgICAgcHVzaCBAeyRkZXAtPnskbmFtZX19LCAkMTsKKyAgICAgICAgfTsKKyAgICB9Cit9CisKK3N1YiBieWRlcAoreworICAgIGZvcmVhY2ggbXkgJGYgKCBrZXlzICV7JG1vZC0+eyRifX0gKSB7CisgICAgICAgIGlmKCRmIGVxICRhKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworCitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK2RlcG1vZC5wbCAtIGEgY3Jvc3MgcGxhdGZvcm0gc2NyaXB0IHRvIGdlbmVyYXRlIGtlcm5lbCBtb2R1bGUKK2RlcGVuZGVuY3kgbGlzdHMgKG1vZHVsZXMuY29uZikgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBieSBtb2Rwcm9iZQorb24gdGhlIHRhcmdldCBwbGF0Zm9ybS4KKworSXQgc3VwcG9ydHMgTGludXggMi40IGFuZCAyLjYgc3R5bGVzIG9mIG1vZHVsZXMuY29uZiAoYXV0by1kZXRlY3RlZCkKKworPWhlYWQxIFNZTk9QU0lTCisKK2RlcG1vZC5wbCBbT1BUSU9OXS4uLiBbYmFzZWRpcl0uLi4KKworRXhhbXBsZToKKworCWRlcG1vZC5wbCAtRiBsaW51eC9TeXN0ZW0ubWFwIC1iIHRhcmdldC9saWIvbW9kdWxlcy8yLjYuMTEKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBwdXJwb3NlIG9mIHRoaXMgc2NyaXB0IGlzIHRvIGF1dG9tYWdpY2FsbHkgZ2VuZXJhdGUgYSBsaXN0IG9mIG9mIGtlcm5lbAorbW9kdWxlIGRlcGVuZGVuY2llcy4gIFRoaXMgc2NyaXB0IHByb2R1Y2VzIGRlcGVuZGVuY3kgbGlzdHMgdGhhdCBzaG91bGQgYmUKK2lkZW50aWNhbCB0byB0aGUgZGVwbW9kIHByb2dyYW0gZnJvbSB0aGUgbW9kdXRpbHMgcGFja2FnZS4gIFVubGlrZSB0aGUgZGVwbW9kCitiaW5hcnksIGhvd2V2ZXIsIGRlcG1vZC5wbCBpcyBkZXNpZ25lZCB0byBiZSBydW4gb24geW91ciBob3N0IHN5c3RlbSwgbm90CitvbiB5b3VyIHRhcmdldCBzeXN0ZW0uCisKK1RoaXMgc2NyaXB0IHdhcyB3cml0dGVuIGJ5IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiB0byBiZSB1c2VkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBCdXN5Qm94IG1vZHByb2JlIGFwcGxldC4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIgNAorCis9aXRlbSBCPC1oIC0taGVscD4KKworVGhpcyBkaXNwbGF5cyB0aGUgaGVscCBtZXNzYWdlLgorCis9aXRlbSBCPC1iIC0tYmFzZWRpcj4KKworVGhlIGJhc2UgZGlyZWN0b3J5IHVuZXIgd2hpY2ggdGhlIHRhcmdldCdzIG1vZHVsZXMgd2lsbCBiZSBmb3VuZC4gIFRoaXMKK2RlZmF1bHRzIHRvIHRoZSAvbGliL21vZHVsZXMgZGlyZWN0b3J5LgorCitJZiB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGUga2VybmVsIHZlcnNpb24sIHRoaXMgc2NyaXB0IHdpbGwgc2VhcmNoIGZvcgorb25lIHVuZGVyIHRoZSBzcGVjaWZpZWQgYmFzZWQgZGlyZWN0b3J5IGFuZCB1c2UgdGhlIGZpcnN0IHRoaW5nIHRoYXQKK2xvb2tzIGxpa2UgYSBrZXJuZWwgdmVyc2lvbi4KKworPWl0ZW0gQjwtayAtLWtlcm5lbD4KKworS2VybmVsIGJpbmFyeSBmb3IgdGhlIHRhcmdldCAodm1saW51eCkuICBZb3UgbXVzdCBlaXRoZXIgc3VwcGx5IGEga2VybmVsIGJpbmFyeQorb3IgYSBrZXJuZWwgc3ltYm9sIGZpbGUgKHVzaW5nIHRoZSAtRiBvcHRpb24pLgorCis9aXRlbSBCPC1GIC0ta2VybmVsc3ltcz4KKworS2VybmVsIHN5bWJvbCBmaWxlIGZvciB0aGUgdGFyZ2V0IChTeXN0ZW0ubWFwKS4KKworPWl0ZW0gQjwtbiAtLXN0ZG91dD4KKworV3JpdGUgdG8gc3Rkb3V0IGluc3RlYWQgb2YgbW9kdWxlcy5kZXAKK2tlcm5lbCBiaW5hcnkgZm9yIHRoZSB0YXJnZXQgKHVzaW5nIHRoZSAtayBvcHRpb24pLgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworVmVyYm9zZSAoZGVidWcpIG91dHB1dAorCis9YmFjaworCis9aGVhZDEgQ09QWVJJR0hUIEFORCBMSUNFTlNFCisKKyBDb3B5cmlnaHQgKGMpIDIwMDEgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgQ29weXJpZ2h0IChjKSAyMDAxIEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyBDb3B5cmlnaHQgKGMpIDIwMDEgU3R1YXJ0IEh1Z2hlcyA8c2VoQHplZTIuY29tPgorIENvcHlyaWdodCAoYykgMjAwMiBTdGV2ZW4gSi4gSGlsbCA8c2hpbGxAYnJvYWRjb20uY29tPgorIENvcHlyaWdodCAoYykgMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jIDxzdHVhcnRoQGZyZWVzY2FsZS5jb20+CisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cit1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKworPWhlYWQxIEFVVEhPUgorCitEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworPWN1dApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvZGV2ZnNkLmNvbmYgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9kZXZmc2QuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGYxYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvZGV2ZnNkLmNvbmYKQEAgLTAsMCArMSwxMzMgQEAKKyMgU2FtcGxlIC9ldGMvZGV2ZnNkLmNvbmYgY29uZmlndXJhdGlvbiBmaWxlLgorIyBSaWNoYXJkIEdvb2NoICA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CQkxNy1GRUItMjAwMgorIworIyBhZGFwdGVkIGZvciBidXN5Ym94IGRldmZzZCBpbXBsZW1lbnRhdGlvbiBieSBUaXRvIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyMKKyMgRW5hYmxlIGZ1bGwgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBvbGQgZGV2aWNlIG5hbWVzLiBZb3UgbWF5IGNvbW1lbnQgdGhlc2UKKyMgb3V0IGlmIHlvdSBkb24ndCB1c2UgdGhlIG9sZCBkZXZpY2UgbmFtZXMuIE1ha2Ugc3VyZSB5b3Uga25vdyB3aGF0IHlvdSdyZQorIyBkb2luZyEKK1JFR0lTVEVSCS4qCQlNS09MRENPTVBBVAorVU5SRUdJU1RFUgkuKgkJUk1PTERDT01QQVQKKworIyBZb3UgbWF5IGNvbW1lbnQgb3V0IHRoZSBhYm92ZSBhbmQgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgaWYgeW91J3ZlCisjIGNvbmZpZ3VyZWQgeW91ciBzeXN0ZW0gdG8gdXNlIHRoZSBvcmlnaW5hbCAibmV3IiBkZXZmcyBuYW1lcyBvciB0aGUgcmVhbGx5CisjIG5ldyBuYW1lcworI1JFR0lTVEVSCV52Yy8JCU1LT0xEQ09NUEFUCisjVU5SRUdJU1RFUgledmMvCQlSTU9MRENPTVBBVAorI1JFR0lTVEVSCV5wdHkvCQlNS09MRENPTVBBVAorI1VOUkVHSVNURVIJXnB0eS8JCVJNT0xEQ09NUEFUCisjUkVHSVNURVIJXm1pc2MvCQlNS09MRENPTVBBVAorI1VOUkVHSVNURVIJXm1pc2MvCQlSTU9MRENPTVBBVAorCisjIFlvdSBtYXkgY29tbWVudCB0aGVzZSBvdXQgaWYgeW91IGRvbid0IHVzZSB0aGUgb3JpZ2luYWwgIm5ldyIgbmFtZXMKK1JFR0lTVEVSCS4qCQlNS05FV0NPTVBBVAorVU5SRUdJU1RFUgkuKgkJUk1ORVdDT01QQVQKKworIyBFbmFibGUgbW9kdWxlIGF1dG9sb2FkaW5nLiBZb3UgbWF5IGNvbW1lbnQgdGhpcyBvdXQgaWYgeW91IGRvbid0IHVzZQorIyBhdXRvbG9hZGluZworIyBTdXBwb3J0ZWQgYnkgYnVzeWJveCB3aGVuIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBzZXQuCisjIFRoaXMgYWN0dWFsbHkgZG9lc24ndCB3b3JrIHdpdGggYnVzeWJveCAgbW9kdXRpbHMgYnV0IG5lZWRzCisjIHRoZSByZWFsIG1vZHV0aWxzJyBtb2Rwcm9iZQorTE9PS1VQCQkuKgkJTU9ETE9BRAorCisjIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHlvdSB3YW50IHRvIHNldCB0aGUgZ3JvdXAgdG8gInR0eSIgZm9yIHRoZQorIyBwc2V1ZG8tdHR5IGRldmljZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgbWVzZygxKSBjYW4gbGF0ZXIgYmUgdXNlZCB0bworIyBlbmFibGUvZGlzYWJsZSB0YWxrIHJlcXVlc3RzIGFuZCB3YWxsKDEpIG1lc3NhZ2VzLgorUkVHSVNURVIJXnB0eS9zLioJUEVSTUlTU0lPTlMJLTEudHR5CTA2MDAKKyNSRUdJU1RFUglecHRzLy4qCQlQRVJNSVNTSU9OUwktMS50dHkJMDYwMAorCisjIFJlc3RvcmluZyAvZGV2L2xvZyBvbiBzdGFydHVwIHdvdWxkIHRyaWdnZXIgdGhlIG1pbmlsb2dkL2luaXRsb2cgZGVhZGxvY2sKKyMgKG1pbmlsb2dkIGZhbHNlbHkgYXNzdW1pbmcgc3lzbG9nZCBoYXMgYmVlbiBzdGFydGVkKS4KK1JFR0lTVEVSCV5sb2ckCQlJR05PUkUKK0NSRUFURQkJXmxvZyQJCUlHTk9SRQorQ0hBTkdFCQlebG9nJAkJSUdOT1JFCitERUxFVEUJCV5sb2ckCQlJR05PUkUKKworIworIyBVbmNvbW1lbnQgdGhpcyBpZiB5b3Ugd2FudCBwZXJtaXNzaW9ucyB0byBiZSBzYXZlZCBhbmQgcmVzdG9yZWQKKyMgRG8gbm90IGRvIHRoaXMgZm9yIHBzZXVkby10ZXJtaW5hbCBkZXZpY2VzCitSRUdJU1RFUglecHRbc3ldCQlJR05PUkUKK0NSRUFURQkJXnB0W3N5XQkJSUdOT1JFCitDSEFOR0UJCV5wdFtzeV0JCUlHTk9SRQorREVMRVRFCQlecHRbc3ldCQlJR05PUkUKK1JFR0lTVEVSCS4qCQlDT1BZCS9saWIvZGV2LXN0YXRlLyRkZXZuYW1lICRkZXZwYXRoCitDUkVBVEUJCS4qCQlDT1BZCSRkZXZwYXRoIC9saWIvZGV2LXN0YXRlLyRkZXZuYW1lCitDSEFOR0UJCS4qCQlDT1BZCSRkZXZwYXRoIC9saWIvZGV2LXN0YXRlLyRkZXZuYW1lCisjREVMRVRFCQkuKgkJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgL2xpYi9kZXYtc3RhdGUvJGRldm5hbWUKKyMgQnVzeWJveAorREVMRVRFCQkuKgkJRVhFQ1VURSAvYmluL3JtIC1mCQkvbGliL2Rldi1zdGF0ZS8kZGV2bmFtZQorCitSRVNUT1JFCQkvbGliL2Rldi1zdGF0ZQorCisjCisjIFVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHRoZSBvbGQgL2Rldi9jZHJvbSBzeW1saW5rCisjUkVHSVNURVIJXmNkcm9tcy9jZHJvbTAkCUNGVU5DVElPTiBHTE9CQUwgbWtzeW1saW5rICRkZXZuYW1lIGNkcm9tCisjVU5SRUdJU1RFUgleY2Ryb21zL2Nkcm9tMCQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgY2Ryb20KKyMgYnVzeWJveAorUkVHSVNURVIJXmNkcm9tcy9jZHJvbTAkCUVYRUNVVEUgL2Jpbi9sbiAtc2YgJGRldm5hbWUgY2Ryb20KK1VOUkVHSVNURVIJXmNkcm9tcy9jZHJvbTAkCUVYRUNVVEUgL2Jpbi9ybSAtZiBjZHJvbQorCisjUkVHSVNURVIJXnY0bC92aWRlbzAkCUNGVU5DVElPTiBHTE9CQUwgbWtzeW1saW5rIHY0bC92aWRlbzAgdmlkZW8KKyNVTlJFR0lTVEVSCV52NGwvdmlkZW8wJAlDRlVOQ1RJT04gR0xPQkFMIHVubGluayB2aWRlbworI1JFR0lTVEVSCV5yYWRpbzAkCUNGVU5DVElPTiBHTE9CQUwgbWtzeW1saW5rIHJhZGlvMCByYWRpbworI1VOUkVHSVNURVIJXnJhZGlvMCQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgcmFkaW8KKyMgQnVzeWJveAorUkVHSVNURVIJXnY0bC92aWRlbzAkCUVYRUNVVEUgL2Jpbi9sbiAtc2YgdjRsL3ZpZGVvMCB2aWRlbworVU5SRUdJU1RFUgledjRsL3ZpZGVvMCQJRVhFQ1VURSAvYmluL3JtIC1mIHZpZGVvCitSRUdJU1RFUglecmFkaW8wJAkJRVhFQ1VURSAvYmluL2xuIC1zZiAgcmFkaW8wIHJhZGlvCitVTlJFR0lTVEVSCV5yYWRpbzAkCQlFWEVDVVRFIC9iaW4vcm0gLWYgcmFkaW8KKworIyBBTFNBIHN0dWZmCisjTE9PS1VQCQlzbmQJCU1PRExPQUQgQUNUSU9OIHNuZAorCisjIFVuY29tbWVudCB0aGlzIHRvIGxldCBQQU0gbWFuYWdlIGRldmZzCisjIE5vdCBzdXBwb3J0ZWQgYnkgYnVzeWJveAorI1JFR0lTVEVSCS4qCQlDRlVOQ1RJT04gL2xpYi9zZWN1cml0eS9wYW1fY29uc29sZV9hcHBseV9kZXZmc2Quc28gcGFtX2NvbnNvbGVfYXBwbHlfc2luZ2xlICRkZXZwYXRoCisKKyMgVW5jb21tZW50IHRoaXMgdG8gbWFuYWdlIFVTQiBtb3VzZQorIyBOb3Qgc3VwcG9ydGVkIGJ5IGJ1c3lib3gKKyNSRUdJU1RFUgleaW5wdXQvbW91c2UwJAlDRlVOQ1RJT04gR0xPQkFMIG1rc3ltbGluayAkZGV2bmFtZSB1c2Jtb3VzZQorI1VOUkVHSVNURVIJXmlucHV0L21vdXNlMCQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgdXNibW91c2UKKyMgQnVzeWJveAorI1JFR0lTVEVSCV5pbnB1dC9tb3VzZTAkCUVYRUNVVEUgL2Jpbi9sbiAtc2YgJGRldm5hbWUgdXNibW91c2UKKyNVTlJFR0lTVEVSCV5pbnB1dC9tb3VzZTAkCUVYRUNVVEUgL2Jpbi9ybSAtZiB1c2Jtb3VzZQorIyBOb3Qgc3VwcG9ydGVkIGJ5IGJ1c3lib3gKKyNSRUdJU1RFUgleaW5wdXQvbWljZSQJQ0ZVTkNUSU9OIEdMT0JBTCBta3N5bWxpbmsgJGRldm5hbWUgdXNibW91c2UKKyNVTlJFR0lTVEVSCV5pbnB1dC9taWNlJAlDRlVOQ1RJT04gR0xPQkFMIHVubGluayB1c2Jtb3VzZQorIyBCdXN5Ym94CitSRUdJU1RFUgleaW5wdXQvbWljZSQJRVhFQ1VURSAvYmluL2xuIC1zZiAkZGV2bmFtZSB1c2Jtb3VzZQorVU5SRUdJU1RFUgleaW5wdXQvbWljZSQJRVhFQ1VURSAvYmluL3JtIC1mIHVzYm1vdXNlCisKKyMgSWYgeW91IGhhdmUgcmVtb3ZhYmxlIG1lZGlhIGFuZCB3YW50IHRvIGZvcmNlIG1lZGlhIHJldmFsaWRhdGlvbiB3aGVuIGxvb2tpbmcKKyMgdXAgbmV3IG9yIG9sZCBjb21wYXRpYmlsaXR5IG5hbWVzLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcworIyBTQ1NJIE5FV0NPTVBBVCAgL2Rldi9zZC8qIG5hbWVzCitMT09LVVAJCV4oc2QvY1swLTldK2JbMC05XSt0WzAtOV0rdVswLTldKylwWzAtOV0rJAlFWEVDVVRFIC9iaW4vZGQgaWY9JG1udHBudC9cMSBvZj0vZGV2L251bGwgY291bnQ9MQorIyBTQ1NJIE9MRENPTVBBVCAgL2Rldi9zZD8/IG5hbWVzCitMT09LVVAJCV4oc2RbYS16XSspWzAtOV0rJAlFWEVDVVRFIC9iaW4vZGQgaWY9JG1udHBudC9cMSBvZj0vZGV2L251bGwgY291bnQ9MQorIyBJREUgTkVXQ09NUEFUICAgL2Rldi9pZGUvaGQvKiBuYW1lcworTE9PS1VQCQleKGlkZS9oZC9jWzAtOV0rYlswLTldK3RbMC05XSt1WzAtOV0rKXBbMC05XSskCUVYRUNVVEUgL2Jpbi9kZCBpZj0kbW50cG50L1wxIG9mPS9kZXYvbnVsbCBjb3VudD0xCisjIElERSBPTERDT01QQVQgICAvZGV2L2hkPz8gbmFtZXMKK0xPT0tVUAkJXihoZFthLXpdKVswLTldKyQJRVhFQ1VURSAvYmluL2RkIGlmPSRtbnRwbnQvXDEgb2Y9L2Rldi9udWxsIGNvdW50PTEKKyMgSURFLVNDU0kgTkVXQ09NUEFUICAvZGV2L3NkLyogbmFtZXMKKyNMT09LVVAJCV4oc2QvY1swLTldK2JbMC05XSt0WzAtOV0rdVswLTldKylwWzAtOV0rJAlFWEVDVVRFIC9iaW4vZGQgaWY9JG1udHBudC9cMSBvZj0vZGV2L251bGwgY291bnQ9MQorI1NDU0kgT0xEQ09NUEFUICAvZGV2L3NjZD8gbmFtZXMKK0xPT0tVUAkJXihzY2QrKVswLTldKyQJRVhFQ1VURSAvYmluL2RkIGlmPSRtbnRwbnQvXDEgb2Y9L2Rldi9udWxsIGNvdW50PTEKKworCitSRUdJU1RFUiBeZHZiL2NhcmRbMC05XSsvW14vXSskIFBFUk1JU1NJT05TIHJvb3QudmlkZW8gMDY2MAorIyBOb3Qgc3VwcG9ydGVkIGJ5IGJ1c3lib3gKKyNSRUdJU1RFUgleZHZiL2NhcmQoWzAtOV0rKS8oW14vMC05XSopWzAtOV0rJAlDRlVOQ1RJT04gR0xPQkFMIG1rc3ltbGluayAvZGV2LyRkZXZuYW1lIG9zdC9cMlwxCisjVU5SRUdJU1RFUgleZHZiL2NhcmQoWzAtOV0rKS8oW14vMC05XSopWzAtOV0rJAlDRlVOQ1RJT04gR0xPQkFMIHVubGluayBvc3QvXDJcMQorIyBCdXN5Ym94CitSRUdJU1RFUgleZHZiL2NhcmQoWzAtOV0rKS8oW14vMC05XSopWzAtOV0rJAlFWEVDVVRFIC9iaW4vbG4gLXNmIC9kZXYvJGRldm5hbWUgb3N0L1wyXDEKK1VOUkVHSVNURVIJXmR2Yi9jYXJkKFswLTldKykvKFteLzAtOV0qKVswLTldKyQJRVhFQ1VURSAvYmluL3JtIC1mIG9zdC9cMlwxCisKKyMgSW5jbHVkZSBwYWNrYWdlLWdlbmVyYXRlZCBmaWxlcyBmcm9tIC9ldGMvZGV2ZnMvY29uZi5kCisjIFN1cHBvcnRlZCBieSBidXN5Ym94CisjIElOQ0xVREUgICAvZXRjL2RldmZzL2NvbmYuZC8KK0lOQ0xVREUgICAvZXRjL2RldmZzL2J1c3lib3gvCisjIEJ1c3lib3g6IGp1c3QgZm9yIHRlc3RpbmcKKyNJTkNMVURFCQkJL2V0Yy9kZXZmcy9ub3RoaW5nLworI0lOQ0xVREUJCQkvZXRjL2RldmZzL25vdGhpbmcvbm90aGluZworI09QVElPTkFMX0lOQ0xVREUJL2V0Yy9kZXZmcy9ub3RoaW5nLworI09QVElPTkFMX0lOQ0xVREUJL2V0Yy9kZXZmcy9ub3RoaW5nL25vdGhpbmcKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Ruc2QuY29uZiBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2Ruc2QuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY2MjJiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvZG5zZC5jb25mCkBAIC0wLDAgKzEgQEAKK3RoZWJveCAxOTIuMTY4LjEuNQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvaW5ldGQuY29uZiBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2luZXRkLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ZTNkOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2luZXRkLmNvbmYKQEAgLTAsMCArMSw3MyBAQAorIyAvZXRjL2luZXRkLmNvbmY6ICBzZWUgaW5ldGQoOCkgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb25zLgorIworIyBJbnRlcm5ldCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBkYXRhYmFzZQorIworIworIyBJZiB5b3Ugd2FudCB0byBkaXNhYmxlIGFuIGVudHJ5IHNvIGl0IGlzbid0IHRvdWNoZWQgZHVyaW5nCisjIHBhY2thZ2UgdXBkYXRlcyBqdXN0IGNvbW1lbnQgaXQgb3V0IHdpdGggYSBzaW5nbGUgJyMnIGNoYXJhY3Rlci4KKyMKKyMgSWYgeW91IG1ha2UgY2hhbmdlcyB0byB0aGlzIGZpbGUsIGVpdGhlciByZWJvb3QgeW91ciBtYWNoaW5lIG9yCisjIHNlbmQgdGhlIGluZXRkIHByb2Nlc3MgYSBIVVAgc2lnbmFsOgorIyBEbyBhICJwcyB4IiBhcyByb290IGFuZCBsb29rIHVwIHRoZSBwaWQgb2YgaW5ldGQuIFRoZW4gZG8gYQorIyAgICAga2lsbCAtSFVQIDxwaWQgb2YgaW5ldGQ+CisjIGluZXRkIHdpbGwgcmUtcmVhZCB0aGlzIGZpbGUgd2hlbmV2ZXIgaXQgZ2V0cyB0aGF0IHNpZ25hbC4KKyMgPHNlcnZpY2VfbmFtZT4gPHNvY2tfdHlwZT4gPHByb3RvPiA8ZmxhZ3M+IDx1c2VyPiA8c2VydmVyX3BhdGg+IDxhcmdzPgorIworIzpJTlRFUk5BTDogSW50ZXJuYWwgc2VydmljZXMKKyMgSXQgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgc2FmZXIgdG8ga2VlcCB0aGVzZSBvZmYuCitlY2hvICAgICBzdHJlYW0gIHRjcAlub3dhaXQJcm9vdAlpbnRlcm5hbAorZWNobyAgICAgZGdyYW0gICB1ZHAJd2FpdAlyb290CWludGVybmFsCisjZGlzY2FyZCAgc3RyZWFtICB0Y3AJbm93YWl0CXJvb3QJaW50ZXJuYWwKKyNkaXNjYXJkICBkZ3JhbSAgIHVkcAl3YWl0CXJvb3QJaW50ZXJuYWwKK2RheXRpbWUgIHN0cmVhbSAgdGNwCW5vd2FpdAlyb290CWludGVybmFsCitkYXl0aW1lICBkZ3JhbSAgIHVkcAl3YWl0CXJvb3QJaW50ZXJuYWwKKyNjaGFyZ2VuICBzdHJlYW0gIHRjcAlub3dhaXQJcm9vdAlpbnRlcm5hbAorI2NoYXJnZW4gIGRncmFtICAgdWRwCXdhaXQJcm9vdAlpbnRlcm5hbAordGltZSAgICAgc3RyZWFtICB0Y3AJbm93YWl0CXJvb3QJaW50ZXJuYWwKK3RpbWUgICAgIGRncmFtICAgdWRwCXdhaXQJcm9vdAlpbnRlcm5hbAorCisjIFRoZXNlIGFyZSBzdGFuZGFyZCBzZXJ2aWNlcy4KKyMKKyNmdHAJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5mdHBkCisjdGVsbmV0CXN0cmVhbQl0Y3AJbm93YWl0CXJvb3QJL3NiaW4vdGVsbmV0ZAkvc2Jpbi90ZWxuZXRkCisjbm50cAlzdHJlYW0JdGNwCW5vd2FpdAlyb290CXRjcGQJaW4ubm50cGQKKyNzbXRwICBzdHJlYW0gIHRjcCAgICAgbm93YWl0ICByb290ICAgIHRjcGQgICAgc2VuZG1haWwgLXYKKyMKKyMgU2hlbGwsIGxvZ2luLCBleGVjIGFuZCB0YWxrIGFyZSBCU0QgcHJvdG9jb2xzLgorIworIyBJZiB5b3UgcnVuIGFuIG50YWxrIGRhZW1vbiAoc3VjaCBhcyBuZXRraXQtbnRhbGspIG9uIHRoZSBvbGQgdGFsaworIyBwb3J0LCB0aGF0IGlzLCAidGFsayIgYXMgb3Bwb3NlZCB0byAibnRhbGsiLCBpdCB3b24ndCB3b3JrIGFuZCBtYXkKKyMgY2F1c2UgY2VydGFpbiBicm9rZW4gdGFsayBjbGllbnRzIHRvIG1hbGZ1bmN0aW9uLgorIworIyBUaGUgdGFsa2QgZnJvbSBuZXRraXQtbnRhbGsgMC4xMiBhbmQgaGlnaGVyLCBob3dldmVyLCBjYW4gc3BlYWsgdGhlCisjIG9sZCB0YWxrIHByb3RvY29sIGFuZCBjYW4gYmUgdXNlZCBzYWZlbHkuCisjCisjc2hlbGwJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5yc2hkIC1MCisjbG9naW4Jc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5ybG9naW5kIC1MCisjZXhlYwlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS91c3Ivc2Jpbi90Y3BkCWluLnJleGVjZAorI3RhbGsJZGdyYW0JdWRwCXdhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi50YWxrZAorI250YWxrCWRncmFtCXVkcAl3YWl0CXJvb3QJL3Vzci9zYmluL3RjcGQJaW4udGFsa2QKKyMKKyMgUG9wIGV0IGFsCisjIExlYXZlIHRoZXNlIG9mZiB1bmxlc3MgeW91J3JlIHVzaW5nIHRoZW0uCisjcG9wMglzdHJlYW0JdGNwCW5vd2FpdAlyb290CS91c3Ivc2Jpbi90Y3BkCWluLnBvcDJkCisjcG9wMwlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS91c3Ivc2Jpbi90Y3BkCWluLnBvcDNkCisjCisjIFRoZSBJbnRlcm5ldCBVVUNQIHNlcnZpY2UuCisjIHV1Y3AJc3RyZWFtCXRjcAlub3dhaXQJdXVjcAkvdXNyL3NiaW4vdGNwZAkvdXNyL2xpYi91dWNwL3V1Y2ljbwktbAorIworIyBUZnRwIHNlcnZpY2UgaXMgcHJvdmlkZWQgcHJpbWFyaWx5IGZvciBib290aW5nLiAgTW9zdCBzaXRlcworIyBydW4gdGhpcyBvbmx5IG9uIG1hY2hpbmVzIGFjdGluZyBhcyAiYm9vdCBzZXJ2ZXJzLiIgSWYgeW91IGRvbid0CisjIG5lZWQgaXQsIGRvbid0IHVzZSBpdC4KKyMKKyN0ZnRwCWRncmFtCXVkcAl3YWl0CW5vYm9keQkvdXNyL3NiaW4vdGNwZAlpbi50ZnRwZAorI2Jvb3RwcwlkZ3JhbQl1ZHAJd2FpdAlyb290CS91c3Ivc2Jpbi9pbi5ib290cGQJaW4uYm9vdHBkCisjCisjIEZpbmdlciwgc3lzdGF0IGFuZCBuZXRzdGF0IGdpdmUgb3V0IHVzZXIgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlCisjIHZhbHVhYmxlIHRvIHBvdGVudGlhbCAic3lzdGVtIGNyYWNrZXJzLiIgIE1hbnkgc2l0ZXMgY2hvb3NlIHRvIGRpc2FibGUKKyMgc29tZSBvciBhbGwgb2YgdGhlc2Ugc2VydmljZXMgdG8gaW1wcm92ZSBzZWN1cml0eS4KKyMKKyNmaW5nZXIJc3RyZWFtCXRjcAlub3dhaXQJbm9ib2R5CS91c3Ivc2Jpbi90Y3BkCWluLmZpbmdlcmQgLXcKKyNzeXN0YXQJc3RyZWFtCXRjcAlub3dhaXQJbm9ib2R5CS91c3Ivc2Jpbi90Y3BkCS9iaW4vcHMJLWF1d3d4CisjbmV0c3RhdAlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS9iaW4vbmV0c3RhdAkvYmluL25ldHN0YXQJLWEKKyNpZGVudAlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS91c3Ivc2Jpbi9pbi5pZGVudGQJaW4uaWRlbnRkCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9pbml0dGFiIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvaW5pdHRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUwYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvaW5pdHRhYgpAQCAtMCwwICsxLDg5IEBACisjIC9ldGMvaW5pdHRhYiBpbml0KDgpIGNvbmZpZ3VyYXRpb24gZm9yIEJ1c3lCb3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIworIyBOb3RlLCBCdXN5Qm94IGluaXQgZG9lc24ndCBzdXBwb3J0IHJ1bmxldmVscy4gIFRoZSBydW5sZXZlbHMgZmllbGQgaXMKKyMgY29tcGxldGVseSBpZ25vcmVkIGJ5IEJ1c3lCb3ggaW5pdC4gSWYgeW91IHdhbnQgcnVubGV2ZWxzLCB1c2Ugc3lzdmluaXQuCisjCisjCisjIEZvcm1hdCBmb3IgZWFjaCBlbnRyeTogPGlkPjo8cnVubGV2ZWxzPjo8YWN0aW9uPjo8cHJvY2Vzcz4KKyMKKyMgPGlkPjogV0FSTklORzogVGhpcyBmaWVsZCBoYXMgYSBub24tdHJhZGl0aW9uYWwgbWVhbmluZyBmb3IgQnVzeUJveCBpbml0IQorIworIwlUaGUgaWQgZmllbGQgaXMgdXNlZCBieSBCdXN5Qm94IGluaXQgdG8gc3BlY2lmeSB0aGUgY29udHJvbGxpbmcgdHR5IGZvcgorIwl0aGUgc3BlY2lmaWVkIHByb2Nlc3MgdG8gcnVuIG9uLiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmllbGQgYXJlCisjCWFwcGVuZGVkIHRvICIvZGV2LyIgYW5kIHVzZWQgYXMtaXMuICBUaGVyZSBpcyBubyBuZWVkIGZvciB0aGlzIGZpZWxkIHRvCisjCWJlIHVuaXF1ZSwgYWx0aG91Z2ggaWYgaXQgaXNuJ3QgeW91IG1heSBoYXZlIHN0cmFuZ2UgcmVzdWx0cy4gIElmIHRoaXMKKyMJZmllbGQgaXMgbGVmdCBibGFuaywgaXQgaXMgY29tcGxldGVseSBpZ25vcmVkLiAgQWxzbyBub3RlIHRoYXQgaWYKKyMJQnVzeUJveCBkZXRlY3RzIHRoYXQgYSBzZXJpYWwgY29uc29sZSBpcyBpbiB1c2UsIHRoZW4gYWxsIGVudHJpZXMKKyMJY29udGFpbmluZyBub24tZW1wdHkgaWQgZmllbGRzIHdpbGwgYmUgaWdub3JlZC4gIEJ1c3lCb3ggaW5pdCBkb2VzCisjCW5vdGhpbmcgd2l0aCB1dG1wLiAgV2UgZG9uJ3QgbmVlZCBubyBzdGlua2luJyB1dG1wLgorIworIyA8cnVubGV2ZWxzPjogVGhlIHJ1bmxldmVscyBmaWVsZCBpcyBjb21wbGV0ZWx5IGlnbm9yZWQuCisjCisjIDxhY3Rpb24+OiBWYWxpZCBhY3Rpb25zIGluY2x1ZGU6IHN5c2luaXQsIHJlc3Bhd24sIGFza2ZpcnN0LCB3YWl0LCBvbmNlLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0LCBjdHJsYWx0ZGVsLCBhbmQgc2h1dGRvd24uCisjCisjICAgICAgIE5vdGU6IGFza2ZpcnN0IGFjdHMganVzdCBsaWtlIHJlc3Bhd24sIGJ1dCBiZWZvcmUgcnVubmluZyB0aGUgc3BlY2lmaWVkCisjICAgICAgIHByb2Nlc3MgaXQgZGlzcGxheXMgdGhlIGxpbmUgIlBsZWFzZSBwcmVzcyBFbnRlciB0byBhY3RpdmF0ZSB0aGlzCisjICAgICAgIGNvbnNvbGUuIiBhbmQgdGhlbiB3YWl0cyBmb3IgdGhlIHVzZXIgdG8gcHJlc3MgZW50ZXIgYmVmb3JlIHN0YXJ0aW5nCisjICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvY2Vzcy4KKyMKKyMgICAgICAgTm90ZTogdW5yZWNvZ25pemVkIGFjdGlvbnMgKGxpa2UgaW5pdGRlZmF1bHQpIHdpbGwgY2F1c2UgaW5pdCB0byBlbWl0CisjICAgICAgIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGVuIGdvIGFsb25nIHdpdGggaXRzIGJ1c2luZXNzLgorIworIyA8cHJvY2Vzcz46IFNwZWNpZmllcyB0aGUgcHJvY2VzcyB0byBiZSBleGVjdXRlZCBhbmQgaXQncyBjb21tYW5kIGxpbmUuCisjCisjIE5vdGU6IEJ1c3lCb3ggaW5pdCB3b3JrcyBqdXN0IGZpbmUgd2l0aG91dCBhbiBpbml0dGFiLiBJZiBubyBpbml0dGFiIGlzCisjIGZvdW5kLCBpdCBoYXMgdGhlIGZvbGxvd2luZyBkZWZhdWx0IGJlaGF2aW9yOgorIyAgICAgICAgIDo6c3lzaW5pdDovZXRjL2luaXQuZC9yY1MKKyMgICAgICAgICA6OmFza2ZpcnN0Oi9iaW4vc2gKKyMgICAgICAgICA6OmN0cmxhbHRkZWw6L3NiaW4vcmVib290CisjICAgICAgICAgOjpzaHV0ZG93bjovc2Jpbi9zd2Fwb2ZmIC1hCisjICAgICAgICAgOjpzaHV0ZG93bjovYmluL3Vtb3VudCAtYSAtcgorIyAgICAgICAgIDo6cmVzdGFydDovc2Jpbi9pbml0CisjCisjIGlmIGl0IGRldGVjdHMgdGhhdCAvZGV2L2NvbnNvbGUgaXMgX25vdF8gYSBzZXJpYWwgY29uc29sZSwgaXQgd2lsbAorIyBhbHNvIHJ1bjoKKyMgICAgICAgICB0dHkyOjphc2tmaXJzdDovYmluL3NoCisjICAgICAgICAgdHR5Mzo6YXNrZmlyc3Q6L2Jpbi9zaAorIyAgICAgICAgIHR0eTQ6OmFza2ZpcnN0Oi9iaW4vc2gKKyMKKyMgQm9vdC10aW1lIHN5c3RlbSBjb25maWd1cmF0aW9uL2luaXRpYWxpemF0aW9uIHNjcmlwdC4KKyMgVGhpcyBpcyBydW4gZmlyc3QgZXhjZXB0IHdoZW4gYm9vdGluZyBpbiBzaW5nbGUtdXNlciBtb2RlLgorIworOjpzeXNpbml0Oi9ldGMvaW5pdC5kL3JjUworCisjIC9iaW4vc2ggaW52b2NhdGlvbnMgb24gc2VsZWN0ZWQgdHR5cworIworIyBOb3RlIGJlbG93IHRoYXQgd2UgcHJlZml4IHRoZSBzaGVsbCBjb21tYW5kcyB3aXRoIGEgIi0iIHRvIGluZGljYXRlIHRvIHRoZQorIyBzaGVsbCB0aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGJlIGEgbG9naW4gc2hlbGwuICBOb3JtYWxseSB0aGlzIGlzIGhhbmRsZWQgYnkKKyMgbG9naW4sIGJ1dCBzaW5jZSB3ZSBhcmUgYnlwYXNzaW5nIGxvZ2luIGluIHRoaXMgY2FzZSwgQnVzeUJveCBsZXRzIHlvdSBkbworIyB0aGlzIHlvdXJzZWxmLi4uCisjCisjIFN0YXJ0IGFuICJhc2tmaXJzdCIgc2hlbGwgb24gdGhlIGNvbnNvbGUgKHdoYXRldmVyIHRoYXQgbWF5IGJlKQorOjphc2tmaXJzdDotL2Jpbi9zaAorIyBTdGFydCBhbiAiYXNrZmlyc3QiIHNoZWxsIG9uIC9kZXYvdHR5Mi00Cit0dHkyOjphc2tmaXJzdDotL2Jpbi9zaAordHR5Mzo6YXNrZmlyc3Q6LS9iaW4vc2gKK3R0eTQ6OmFza2ZpcnN0Oi0vYmluL3NoCisKKyMgL3NiaW4vZ2V0dHkgaW52b2NhdGlvbnMgZm9yIHNlbGVjdGVkIHR0eXMKK3R0eTQ6OnJlc3Bhd246L3NiaW4vZ2V0dHkgMzg0MDAgdHR5NQordHR5NTo6cmVzcGF3bjovc2Jpbi9nZXR0eSAzODQwMCB0dHk2CisKKyMgRXhhbXBsZSBvZiBob3cgdG8gcHV0IGEgZ2V0dHkgb24gYSBzZXJpYWwgbGluZSAoZm9yIGEgdGVybWluYWwpCisjOjpyZXNwYXduOi9zYmluL2dldHR5IC1MIHR0eVMwIDk2MDAgdnQxMDAKKyM6OnJlc3Bhd246L3NiaW4vZ2V0dHkgLUwgdHR5UzEgOTYwMCB2dDEwMAorIworIyBFeGFtcGxlIGhvdyB0byBwdXQgYSBnZXR0eSBvbiBhIG1vZGVtIGxpbmUuCisjOjpyZXNwYXduOi9zYmluL2dldHR5IDU3NjAwIHR0eVMyCisKKyMgU3R1ZmYgdG8gZG8gd2hlbiByZXN0YXJ0aW5nIHRoZSBpbml0IHByb2Nlc3MKKzo6cmVzdGFydDovc2Jpbi9pbml0CisKKyMgU3R1ZmYgdG8gZG8gYmVmb3JlIHJlYm9vdGluZworOjpjdHJsYWx0ZGVsOi9zYmluL3JlYm9vdAorOjpzaHV0ZG93bjovYmluL3Vtb3VudCAtYSAtcgorOjpzaHV0ZG93bjovc2Jpbi9zd2Fwb2ZmIC1hCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9saW51eC0yLjYuMzBfcHJvY19zZWxmX2V4ZS5wYXRjaCBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL2xpbnV4LTIuNi4zMF9wcm9jX3NlbGZfZXhlLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjU4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9saW51eC0yLjYuMzBfcHJvY19zZWxmX2V4ZS5wYXRjaApAQCAtMCwwICsxLDM0IEBACitUaGlzIHBhdGNoIG1ha2VzIC9wcm9jL3NlbGYvZXhlIGV4ZWN1dGFibGUgZXZlbiBpZiBwcm9jCitpcyBub3QgbW91bnRlZC4gSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgb24gTk9NTVUgYXJjaGVzLgorCitkaWZmIC11cnAgLi4vbGludXgtMi42LjMwLm9yZy9mcy9leGVjLmMgbGludXgtMi42LjMwL2ZzL2V4ZWMuYworLS0tIC4uL2xpbnV4LTIuNi4zMC5vcmcvZnMvZXhlYy5jCTIwMDktMDYtMTAgMDU6MDU6MjcuMDAwMDAwMDAwICswMjAwCisrKysgbGludXgtMi42LjMwL2ZzL2V4ZWMuYwkyMDA5LTA2LTI1IDAwOjIwOjEzLjAwMDAwMDAwMCArMDIwMAorQEAgLTY1Miw5ICs2NTIsMjUgQEAgc3RydWN0IGZpbGUgKm9wZW5fZXhlYyhjb25zdCBjaGFyICpuYW1lKQorIAlmaWxlID0gZG9fZmlscF9vcGVuKEFUX0ZEQ1dELCBuYW1lLAorIAkJCQlPX0xBUkdFRklMRSB8IE9fUkRPTkxZIHwgRk1PREVfRVhFQywgMCwKKyAJCQkJTUFZX0VYRUMgfCBNQVlfT1BFTik7CistCWlmIChJU19FUlIoZmlsZSkpCistCQlnb3RvIG91dDsKKysJaWYgKElTX0VSUihmaWxlKSkgeworKwkJaWYgKChQVFJfRVJSKGZpbGUpID09IC1FTk9FTlQgfHwgUFRSX0VSUihmaWxlKSA9PSAtRUFDQ0VTKQorKwkJICYmIHN0cmNtcChuYW1lLCAiL3Byb2Mvc2VsZi9leGUiKSA9PSAwCisrCQkpIHsKKysJCQlzdHJ1Y3QgZmlsZSAqc3YgPSBmaWxlOworKwkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworIAorKwkJCW1tID0gZ2V0X3Rhc2tfbW0oY3VycmVudCk7CisrCQkJaWYgKCFtbSkKKysJCQkJZ290byBvdXQ7CisrCQkJZmlsZSA9IGdldF9tbV9leGVfZmlsZShtbSk7CisrCQkJbW1wdXQobW0pOworKwkJCWlmIChmaWxlKQorKwkJCQlnb3RvIG9rOworKwkJCWZpbGUgPSBzdjsKKysJCX0KKysJCWdvdG8gb3V0OworKwl9Cisrb2s6CisgCWVyciA9IC1FQUNDRVM7CisgCWlmICghU19JU1JFRyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvbWRldi5jb25mIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvbWRldi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYmI0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9tZGV2LmNvbmYKQEAgLTAsMCArMSwzMCBAQAorIworIyBUaGlzIGlzIGEgc2FtcGxlIG1kZXYuY29uZgorIworCisjIFByb3ZpZGUgdXNlciwgZ3JvdXAsIGFuZCBtb2RlIGluZm9ybWF0aW9uIGZvciBkZXZpY2VzLiAgSWYgYSByZWdleCBtYXRjaGVzCisjIHRoZSBkZXZpY2UgbmFtZSBwcm92aWRlZCBieSBzeXNmcywgdXNlIHRoZSBhcHByb3ByaWF0ZSB1c2VyOmdyb3VwIGFuZCBtb2RlCisjIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMDowIDY2MC4KKyMKKyMgU3ludGF4OgorIyAlcyAlZDolZCAlcworIyBkZXZpY2VuYW1lX3JlZ2V4IHVzZXI6Z3JvdXAgbW9kZQorCitudWxsCQkwOjAgNjY2Cit6ZXJvCQkwOjAgNjY2Cit1cmFuZG9tCQkwOjAgNDQ0CisKK2ttZW0JCTA6OSAwMDAKK21lbQkJMDo5IDY0MAorcG9ydAkJMDo5IDY0MAorCitjb25zb2xlCQkwOjUgNjAwCitwdG14CQkwOjUgNjYwCit0dHlbMC05XSoJMDo1IDY2MAorCit0dHlTWzAtOV0qCTA6MjAgNjQwCisKK2ZkWzAtOV0qCTA6MTEgNjYwCisKK3NkW2Etel0qCTA6NiA2NjAKK2hkW2Etel0qCTA6NiA2NjAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL21kZXZfZmF0LmNvbmYgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9tZGV2X2ZhdC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzI5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9tZGV2X2ZhdC5jb25mCkBAIC0wLDAgKzEsMTEwIEBACisjCisjIFRoaXMgaXMgYSBzYW1wbGUgbWRldi5jb25mCisjCisKKyMgUHJvdmlkZSB1c2VyLCBncm91cCwgYW5kIG1vZGUgaW5mb3JtYXRpb24gZm9yIGRldmljZXMuICBJZiBhIHJlZ2V4IG1hdGNoZXMKKyMgdGhlIGRldmljZSBuYW1lIHByb3ZpZGVkIGJ5IHN5c2ZzLCB1c2UgdGhlIGFwcHJvcHJpYXRlIHVzZXI6Z3JvdXAgYW5kIG1vZGUKKyMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAwOjAgNjYwLgorIworIyBTeW50YXg6CisjIFstXWRldmljZW5hbWVfcmVnZXggdXNlcjpncm91cCBtb2RlIFs+fD1wYXRoXSBbQHwkfCpjbWQgYXJncy4uLl0KKyMKKyMgPTogbW92ZSwgPjogbW92ZSBhbmQgY3JlYXRlIGEgc3ltbGluaworIyBAfCR8KjogcnVuICRjbWQgb24gZGVsZXRlLCBAY21kIG9uIGNyZWF0ZSwgKmNtZCBvbiBib3RoCisKKyMgc3VwcG9ydCBtb2R1bGUgbG9hZGluZyBvbiBob3RwbHVnCiskTU9EQUxJQVM9LioJcm9vdDpyb290IDY2MCBAbW9kcHJvYmUgIiRNT0RBTElBUyIKKworIyBudWxsIG1heSBhbHJlYWR5IGV4aXN0OyB0aGVyZWZvcmUgb3duZXJzaGlwIGhhcyB0byBiZSBjaGFuZ2VkIHdpdGggY29tbWFuZAorbnVsbAkJcm9vdDpyb290IDY2NiBAY2htb2QgNjY2ICRNREVWCit6ZXJvCQlyb290OnJvb3QgNjY2CitmdWxsCQlyb290OnJvb3QgNjY2CityYW5kb20JCXJvb3Q6cm9vdCA0NDQKK3VyYW5kb20JCXJvb3Q6cm9vdCA0NDQKK2h3cmFuZG9tCXJvb3Q6cm9vdCA0NDQKK2dyc2VjCQlyb290OnJvb3QgNjYwCisKK2ttZW0JCXJvb3Q6cm9vdCA2NDAKK21lbQkJcm9vdDpyb290IDY0MAorcG9ydAkJcm9vdDpyb290IDY0MAorIyBjb25zb2xlIG1heSBhbHJlYWR5IGV4aXN0OyB0aGVyZWZvcmUgb3duZXJzaGlwIGhhcyB0byBiZSBjaGFuZ2VkIHdpdGggY29tbWFuZAorY29uc29sZQkJcm9vdDp0dHkgNjAwIEBjaG1vZCA2MDAgJE1ERVYKK3B0bXgJCXJvb3Q6dHR5IDY2NgorcHR5LioJCXJvb3Q6dHR5IDY2MAorCisjIFR5cGljYWwgZGV2aWNlcworCit0dHkJCXJvb3Q6dHR5IDY2NgordHR5WzAtOV0qCXJvb3Q6dHR5IDY2MAordmNzYSpbMC05XSoJcm9vdDp0dHkgNjYwCit0dHlTWzAtOV0qCXJvb3Q6dXVjcCA2NjAKKworIyBibG9jayBkZXZpY2VzCityYW0oWzAtOV0qKQlyb290OmRpc2sgNjYwID5yZC8lMQorbG9vcChbMC05XSspCXJvb3Q6ZGlzayA2NjAgPmxvb3AvJTEKK3NkW2Etel0uKglyb290OmRpc2sgNjYwICovbGliL21kZXYvdXNiZGlza19saW5rCitoZFthLXpdWzAtOV0qCXJvb3Q6ZGlzayA2NjAgKi9saWIvbWRldi9pZGVfbGlua3MKK21kWzAtOV0qCXJvb3Q6ZGlzayA2NjAKK3NyWzAtOV0qCXJvb3Q6Y2Ryb20gNjYwIEBsbiAtc2YgJE1ERVYgY2Ryb20KK2ZkWzAtOV0qCXJvb3Q6ZmxvcHB5IDY2MAorCisjIG5ldCBkZXZpY2VzCistbmV0Ly4qCQlyb290OnJvb3QgNjAwIEBuYW1laWYKK3R1blswLTldKglyb290OnJvb3QgNjAwID1uZXQvCit0YXBbMC05XSoJcm9vdDpyb290IDYwMCA9bmV0LworCisjIGFsc2Egc291bmQgZGV2aWNlcyBhbmQgYXVkaW8gc3R1ZmYKK3BjbS4qCQlyb290OmF1ZGlvIDY2MCA9c25kLworY29udHJvbC4qCXJvb3Q6YXVkaW8gNjYwID1zbmQvCittaWRpLioJCXJvb3Q6YXVkaW8gNjYwID1zbmQvCitzZXEJCXJvb3Q6YXVkaW8gNjYwID1zbmQvCit0aW1lcgkJcm9vdDphdWRpbyA2NjAgPXNuZC8KKworYWRzcAkJcm9vdDphdWRpbyA2NjAgPnNvdW5kLworYXVkaW8JCXJvb3Q6YXVkaW8gNjYwID5zb3VuZC8KK2RzcAkJcm9vdDphdWRpbyA2NjAgPnNvdW5kLworbWl4ZXIJCXJvb3Q6YXVkaW8gNjYwID5zb3VuZC8KK3NlcXVlbmNlci4qCXJvb3Q6YXVkaW8gNjYwID5zb3VuZC8KKworIyBMZXNzIHR5cGljYWwgZGV2aWNlcworCisjIHJhaWQgY29udHJvbGxlcnMKK2NjaXNzISguKikJcm9vdDpkaXNrIDY2MCA9Y2Npc3MvJTEKK2lkYSEoLiopCXJvb3Q6ZGlzayA2NjAgPWlkYS8lMQorcmQhKC4qKQkJcm9vdDpkaXNrIDY2MCA9cmQvJTEKKwordHR5TFRNWzAtOV0Jcm9vdDpkaWFsb3V0IDY2MCBAbG4gLXNmICRNREVWIG1vZGVtCit0dHlTSFNGWzAtOV0Jcm9vdDpkaWFsb3V0IDY2MCBAbG4gLXNmICRNREVWIG1vZGVtCitzbGFtcgkJcm9vdDpkaWFsb3V0IDY2MCBAbG4gLXNmICRNREVWIHNsYW1yMAorc2x1c2IJCXJvb3Q6ZGlhbG91dCA2NjAgQGxuIC1zZiAkTURFViBzbHVzYjAKKworZnVzZQkJcm9vdDpyb290IDY2NgorCisjIGRyaSBkZXZpY2UKK2NhcmRbMC05XQlyb290OnZpZGVvIDY2MCA9ZHJpLworCisjIG1pc2Mgc3R1ZmYKK2FncGdhcnQJCXJvb3Q6cm9vdCA2NjAgPm1pc2MvCitwc2F1eAkJcm9vdDpyb290IDY2MCA+bWlzYy8KK3J0YwkJcm9vdDpyb290IDY2NCA+bWlzYy8KKworIyBpbnB1dCBzdHVmZgorZXZlbnRbMC05XSsJcm9vdDpyb290IDY0MCA9aW5wdXQvCittaWNlCQlyb290OnJvb3QgNjQwID1pbnB1dC8KK21vdXNlWzAtOV0Jcm9vdDpyb290IDY0MCA9aW5wdXQvCit0c1swLTldCQlyb290OnJvb3QgNjAwID1pbnB1dC8KKworIyB2NGwgc3R1ZmYKK3ZiaVswLTldCXJvb3Q6dmlkZW8gNjYwID52NGwvCit2aWRlb1swLTldCXJvb3Q6dmlkZW8gNjYwID52NGwvCisKKyMgZHZiIHN0dWZmCitkdmIuKgkJcm9vdDp2aWRlbyA2NjAgKi9saWIvbWRldi9kdmJkZXYKKworIyBsb2FkIGRyaXZlcnMgZm9yIHVzYiBkZXZpY2VzCit1c2JkZXZbMC05XS5bMC05XQlyb290OnJvb3QgNjYwICovbGliL21kZXYvdXNiZGV2Cit1c2JkZXZbMC05XS5bMC05XV8uKglyb290OnJvb3QgNjYwCisKKyMgemFwdGVsIGRldmljZXMKK3phcCguKikJCXJvb3Q6ZGlhbG91dCA2NjAgPXphcC8lMQorZGFoZGkhKC4qKQlyb290OmRpYWxvdXQgNjYwID1kYWhkaS8lMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvbWsya25yLnBsIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvbWsya25yLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyNTliODQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy9tazJrbnIucGwKQEAgLTAsMCArMSw4NCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIEAoIykgbWsya25yLnBsIC0gZ2VuZXJhdGVzIGEgcGVybCBzY3JpcHQgdGhhdCBjb252ZXJ0cyBsZXhlbWVzIHRvIEsmUi1zdHlsZQorIworIyBIb3cgdG8gdXNlIHRoaXMgc2NyaXB0OgorIyAgLSBJbiB0aGUgYnVzeWJveCBkaXJlY3RvcnkgdHlwZSAnZXhhbXBsZXMvbWsya25yLnBsIGZpbGVzLXRvLWNvbnZlcnQnCisjICAtIFJldmlldyB0aGUgJ2NvbnZlcnRtZS5wbCcgc2NyaXB0IGdlbmVyYXRlZCBhbmQgcmVtb3ZlIC8gZWRpdCBhbnkgb2YgdGhlCisjICAgIHN1YnN0aXR1dGlvbnMgaW4gdGhlcmUgKHBsZWFzZSBlc3BlY2lhbGx5IGNoZWNrIGZvciBmYWxzZSBwb3NpdGl2ZXMpCisjICAtIFR5cGUgJy4vY29udmVydG1lLnBsIHNhbWUtZmlsZXMtYXMtYmVmb3JlJworIyAgLSBDb21waWxlIGFuZCBzZWUgaWYgaXQgd29ya3MKKyMKKyMgQlVHUzogVGhpcyBzY3JpcHQgZG9lcyBub3QgaWdub3JlIHN0cmluZ3MgaW5zaWRlIGNvbW1lbnRzIG9yIHN0cmluZ3MgaW5zaWRlCisjIHF1b3RlcyAoaXQgcHJvYmFibHkgc2hvdWxkKS4KKworIyBzZXQgdGhpcyB0byBzb21ldGhpbmcgZWxzZSBpZiB5b3Ugd2FudAorJGNvbnZlcnRtZSA9ICdjb252ZXJ0bWUucGwnOworCisjIGludGVybmFsLXVzZSB2YXJpYWJsZXMgKGRvbid0IHRvdWNoKQorJGNvbnZlcnQgPSAwOworJWNvbnZlcnRlZCA9ICgpOworCisjIGlmIG5vIGZpbGVzIHdlcmUgc3BlY2lmaWVkLCBwcmludCB1c2FnZQorZGllICJ1c2FnZTogJDAgZmlsZS5jIHwgZmlsZS5oXG4iIGlmIHNjYWxhcihAQVJHVikgPT0gMDsKKworIyBwcmVwYXJlIHRoZSAiY29udmVydCBtZSIgZmlsZQorb3BlbihDTSwgIj4kY29udmVydG1lIikgb3IgZGllICJjb252ZXJ0bWUucGwgJCEiOworcHJpbnQgQ00gIiMhL3Vzci9iaW4vcGVybCAtcCAtaVxuXG4iOworCisjIHByb2Nlc3MgZWFjaCBmaWxlIHBhc3NlZCBvbiB0aGUgY21kIGxpbmUKK3doaWxlICg8PikgeworCisJIyBpZiB0aGUgbGluZSBzYXlzICJnZXRvcHQiIGluIGl0IGFueXdoZXJlLCB3ZSBkb24ndCB3YW50IHRvIG11Y2sgd2l0aCBpdAorCSMgYmVjYXVzZSBvcHRpb24gbGlzdHMgdGVuZCB0byBpbmNsdWRlIHN0cmluZ3MgbGlrZSAiY3h0enZPZjoiIHdoaWNoIGdldAorCSMgbWF0Y2hlZCBieSB0aGUgImNoZWNrIGZvciBtaXhlZCBjYXNlIiByZWdleHBzIGJlbG93CisJbmV4dCBpZiAvZ2V0b3B0LzsKKworCSMgdG9rZW5pemUgdGhlIHN0cmluZyBpbnRvIGp1c3QgdGhlIHZhcmlhYmxlcworCXdoaWxlICgvKFthLXpBLVpfXVthLXpBLVowLTlfXSopL2cpIHsKKwkJJHZhciA9ICQxOworCisJCSMgaWdub3JlIHRoZSB3b3JkICJCdXN5Qm94IgorCQluZXh0IGlmICgkdmFyID1+IC9CdXN5Qm94Lyk7CisKKwkJIyB0aGlzIGNoZWNrcyBmb3IgamF2YVN0eWxlIG9yIHN6SHVuZ2FyaWFuTm90YXRpb24KKwkJJGNvbnZlcnQrKyBpZiAoJHZhciA9fiAvXlthLXpdK1tBLVpdW2Etel0rLyk7CisKKwkJIyB0aGlzIGNoZWNrcyBmb3IgUGFzY2FsU3R5bGUKKwkJJGNvbnZlcnQrKyBpZiAoJHZhciA9fiAvXltBLVpdW2Etel0rW0EtWl1bYS16XSsvKTsKKworCQkjIGlmIHdlIHdhbnQgdG8gYWRkIG1vcmUgY2hlY2tzLCB3ZSBjYW4gYWRkICdlbSBoZXJlLCBidXQgdGhlIGFib3ZlCisJCSMgY2hlY2tzIGNhdGNoICJqdXN0IGVub3VnaCIgYW5kIG5vdCB0b28gbXVjaCwgc28gcHJvbGx5IG5vdC4KKworCQlpZiAoJGNvbnZlcnQpIHsKKwkJCSRjb252ZXJ0ID0gMDsKKworCQkJIyBza2lwIGFoZWFkIGlmIHdlJ3ZlIGFscmVhZHkgZGVhbHQgd2l0aCB0aGlzIG9uZQorCQkJbmV4dCBpZiAoJGNvbnZlcnRlZHskdmFyfSk7CisKKwkJCSMgcmVjb3JkIHRoYXQgd2UndmUgZGVhbHQgd2l0aCB0aGlzIHZhcgorCQkJJGNvbnZlcnRlZHskdmFyfSA9IDE7CisKKwkJCXByaW50IENNICJzL1xcYiR2YXJcXGIvIjsgIyBtb3JlIHRvIGNvbWUgaW4ganVzdCBhIG1pbnV0ZQorCisJCQkjIGNoYW5nZSB0aGUgZmlyc3QgbGV0dGVyIHRvIGxvd2VyLWNhc2UKKwkJCSR2YXIgPSBsY2ZpcnN0KCR2YXIpOworCisJCQkjIHB1dCB1bmRlcnNjb3JlcyBiZWZvcmUgYWxsIHJlbWFpbmluZyB1cHBlci1jYXNlIGxldHRlcnMKKwkJCSR2YXIgPX4gcy8oW0EtWl0pL18kMS9nOworCisJCQkjIG5vdyBjaGFuZ2UgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvd2VyLWNhc2UKKwkJCSR2YXIgPSBsYygkdmFyKTsKKworCQkJcHJpbnQgQ00gIiR2YXIvZztcbiI7CisJCX0KKwl9Cit9CisKKyMgdGlkeSB1cCBhbmQgbWFrZSB0aGUgJGNvbnZlcnRtZSBzY3JpcHQgZXhlY3V0YWJsZQorY2xvc2UoQ00pOworY2htb2QgMDc1NSwgJGNvbnZlcnRtZTsKKworIyBwcmludCBhIGhlbHBmdWwgaGVscCBtZXNzYWdlCitwcmludCAiRG9uZS4gU2NoZWR1bGVkIG5hbWUgY2hhbmdlcyBhcmUgaW4gJGNvbnZlcnRtZS5cbiI7CitwcmludCAiUGxlYXNlIHJldmlldy9tb2RpZnkgaXQgYW5kIHRoZW4gdHlwZSAuLyRjb252ZXJ0bWUgdG8gZG8gdGhlIHNlYXJjaCAmIHJlcGxhY2UuXG4iOwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmJvdW5kIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmJvdW5kCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkMzU2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91ZGhjcC9zYW1wbGUuYm91bmQKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL3NoCisjIFNhbXBsZSB1ZGhjcGMgcmVuZXcgc2NyaXB0CisKK1JFU09MVl9DT05GPSIvZXRjL3VkaGNwYy9yZXNvbHYuY29uZiIKKworWyAtbiAiJGJyb2FkY2FzdCIgXSAmJiBCUk9BRENBU1Q9ImJyb2FkY2FzdCAkYnJvYWRjYXN0IgorWyAtbiAiJHN1Ym5ldCIgXSAmJiBORVRNQVNLPSJuZXRtYXNrICRzdWJuZXQiCisKKy9zYmluL2lmY29uZmlnICRpbnRlcmZhY2UgJGlwICRCUk9BRENBU1QgJE5FVE1BU0sKKworaWYgWyAtbiAiJHJvdXRlciIgXQordGhlbgorCWVjaG8gImRlbGV0aW5nIHJvdXRlcnMiCisJd2hpbGUgL3NiaW4vcm91dGUgZGVsIGRlZmF1bHQgZ3cgMC4wLjAuMCBkZXYgJGludGVyZmFjZQorCWRvIDoKKwlkb25lCisKKwltZXRyaWM9MAorCWZvciBpIGluICRyb3V0ZXIKKwlkbworCQkvc2Jpbi9yb3V0ZSBhZGQgZGVmYXVsdCBndyAkaSBkZXYgJGludGVyZmFjZSBtZXRyaWMgJCgobWV0cmljKyspKQorCWRvbmUKK2ZpCisKK2VjaG8gLW4gPiAkUkVTT0xWX0NPTkYKK1sgLW4gIiRkb21haW4iIF0gJiYgZWNobyBkb21haW4gJGRvbWFpbiA+PiAkUkVTT0xWX0NPTkYKK2ZvciBpIGluICRkbnMKK2RvCisJZWNobyBhZGRpbmcgZG5zICRpCisJZWNobyBuYW1lc2VydmVyICRpID4+ICRSRVNPTFZfQ09ORgorZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmRlY29uZmlnIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmRlY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyMjFiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91ZGhjcC9zYW1wbGUuZGVjb25maWcKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKyMgU2FtcGxlIHVkaGNwYyBkZWNvbmZpZyBzY3JpcHQKKworL3NiaW4vaWZjb25maWcgJGludGVyZmFjZSAwLjAuMC4wCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91ZGhjcC9zYW1wbGUubmFrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLm5hawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNGQwOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLm5hawpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorIyBTYW1wbGUgdWRoY3BjIG5hayBzY3JpcHQKKworZWNobyBSZWNlaXZlZCBhIE5BSzogJG1lc3NhZ2UKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5yZW5ldyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5yZW5ldwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYTM2OGZjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLnJlbmV3CkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyBTYW1wbGUgdWRoY3BjIGJvdW5kIHNjcmlwdAorCitSRVNPTFZfQ09ORj0iL2V0Yy91ZGhjcGMvcmVzb2x2LmNvbmYiCisKK1sgLW4gIiRicm9hZGNhc3QiIF0gJiYgQlJPQURDQVNUPSJicm9hZGNhc3QgJGJyb2FkY2FzdCIKK1sgLW4gIiRzdWJuZXQiIF0gJiYgTkVUTUFTSz0ibmV0bWFzayAkc3VibmV0IgorCisvc2Jpbi9pZmNvbmZpZyAkaW50ZXJmYWNlICRpcCAkQlJPQURDQVNUICRORVRNQVNLCisKK2lmIFsgLW4gIiRyb3V0ZXIiIF0KK3RoZW4KKwllY2hvICJkZWxldGluZyByb3V0ZXJzIgorCXdoaWxlIC9zYmluL3JvdXRlIGRlbCBkZWZhdWx0IGd3IDAuMC4wLjAgZGV2ICRpbnRlcmZhY2UKKwlkbyA6CisJZG9uZQorCisJbWV0cmljPTAKKwlmb3IgaSBpbiAkcm91dGVyCisJZG8KKwkJL3NiaW4vcm91dGUgYWRkIGRlZmF1bHQgZ3cgJGkgZGV2ICRpbnRlcmZhY2UgbWV0cmljICQoKG1ldHJpYysrKSkKKwlkb25lCitmaQorCitlY2hvIC1uID4gJFJFU09MVl9DT05GCitbIC1uICIkZG9tYWluIiBdICYmIGVjaG8gZG9tYWluICRkb21haW4gPj4gJFJFU09MVl9DT05GCitmb3IgaSBpbiAkZG5zCitkbworCWVjaG8gYWRkaW5nIGRucyAkaQorCWVjaG8gbmFtZXNlcnZlciAkaSA+PiAkUkVTT0xWX0NPTkYKK2RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5zY3JpcHQgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91ZGhjcC9zYW1wbGUuc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliNzE3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91ZGhjcC9zYW1wbGUuc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorIyEvYmluL3NoCisjIEN1cnJlbnRseSwgd2Ugb25seSBkaXNwYXRjaCBhY2NvcmRpbmcgdG8gY29tbWFuZC4gIEhvd2V2ZXIsIGEgbW9yZQorIyBlbGFib3JhdGUgc3lzdGVtIG1pZ2h0IGRpc3BhdGNoIGJ5IGNvbW1hbmQgYW5kIGludGVyZmFjZSBvciBkbyBzb21lCisjIGNvbW1vbiBpbml0aWFsaXphdGlvbiBmaXJzdCwgZXNwZWNpYWxseSBpZiBtb3JlIGRoY3AgZXZlbnQgbm90aWZpY2F0aW9ucworIyBhcmUgYWRkZWQuCisKK2V4ZWMgL3Vzci9zaGFyZS91ZGhjcGMvc2FtcGxlLiQxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91ZGhjcC9zaW1wbGUuc2NyaXB0IGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2ltcGxlLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGVlNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3Avc2ltcGxlLnNjcmlwdApAQCAtMCwwICsxLDQ3IEBACisjIS9iaW4vc2gKKyMgdWRoY3BjIHNjcmlwdCBlZGl0ZWQgYnkgVGltIFJpa2VyIDxUaW1AUmlrZXJzLm9yZz4KKworUkVTT0xWX0NPTkY9Ii9ldGMvcmVzb2x2LmNvbmYiCisKK1sgLW4gIiQxIiBdIHx8IHsgZWNobyAiRXJyb3I6IHNob3VsZCBiZSBjYWxsZWQgZnJvbSB1ZGhjcGMiOyBleGl0IDE7IH0KKworTkVUTUFTSz0iIgorWyAtbiAiJHN1Ym5ldCIgXSAmJiBORVRNQVNLPSJuZXRtYXNrICRzdWJuZXQiCitCUk9BRENBU1Q9ImJyb2FkY2FzdCArIgorWyAtbiAiJGJyb2FkY2FzdCIgXSAmJiBCUk9BRENBU1Q9ImJyb2FkY2FzdCAkYnJvYWRjYXN0IgorCitjYXNlICIkMSIgaW4KKwlkZWNvbmZpZykKKwkJZWNobyAiU2V0dGluZyBJUCBhZGRyZXNzIDAuMC4wLjAgb24gJGludGVyZmFjZSIKKwkJaWZjb25maWcgJGludGVyZmFjZSAwLjAuMC4wCisJCTs7CisKKwlyZW5ld3xib3VuZCkKKwkJZWNobyAiU2V0dGluZyBJUCBhZGRyZXNzICRpcCBvbiAkaW50ZXJmYWNlIgorCQlpZmNvbmZpZyAkaW50ZXJmYWNlICRpcCAkTkVUTUFTSyAkQlJPQURDQVNUCisKKwkJaWYgWyAtbiAiJHJvdXRlciIgXSA7IHRoZW4KKwkJCWVjaG8gIkRlbGV0aW5nIHJvdXRlcnMiCisJCQl3aGlsZSByb3V0ZSBkZWwgZGVmYXVsdCBndyAwLjAuMC4wIGRldiAkaW50ZXJmYWNlIDsgZG8KKwkJCQk6CisJCQlkb25lCisKKwkJCW1ldHJpYz0wCisJCQlmb3IgaSBpbiAkcm91dGVyIDsgZG8KKwkJCQllY2hvICJBZGRpbmcgcm91dGVyICRpIgorCQkJCXJvdXRlIGFkZCBkZWZhdWx0IGd3ICRpIGRldiAkaW50ZXJmYWNlIG1ldHJpYyAkKChtZXRyaWMrKykpCisJCQlkb25lCisJCWZpCisKKwkJZWNobyAiUmVjcmVhdGluZyAkUkVTT0xWX0NPTkYiCisJCWVjaG8gLW4gPiAkUkVTT0xWX0NPTkYtJCQKKwkJWyAtbiAiJGRvbWFpbiIgXSAmJiBlY2hvICJzZWFyY2ggJGRvbWFpbiIgPj4gJFJFU09MVl9DT05GLSQkCisJCWZvciBpIGluICRkbnMgOyBkbworCQkJZWNobyAiIEFkZGluZyBETlMgc2VydmVyICRpIgorCQkJZWNobyAibmFtZXNlcnZlciAkaSIgPj4gJFJFU09MVl9DT05GLSQkCisJCWRvbmUKKwkJbXYgJFJFU09MVl9DT05GLSQkICRSRVNPTFZfQ09ORgorCQk7OworZXNhYworCitleGl0IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3VkaGNwL3VkaGNwZC5jb25mIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdWRoY3AvdWRoY3BkLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyOTU3YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3VkaGNwL3VkaGNwZC5jb25mCkBAIC0wLDAgKzEsMTEzIEBACisjIFNhbXBsZSB1ZGhjcGQgY29uZmlndXJhdGlvbiBmaWxlICgvZXRjL3VkaGNwZC5jb25mKQorIyBWYWx1ZXMgc2hvd24gYXJlIGRlZmF1bHRzCisKKyMgVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIElQIGxlYXNlIGJsb2NrCitzdGFydAkJMTkyLjE2OC4wLjIwCitlbmQJCTE5Mi4xNjguMC4yNTQKKworIyBUaGUgaW50ZXJmYWNlIHRoYXQgdWRoY3BkIHdpbGwgdXNlCitpbnRlcmZhY2UJZXRoMAorCisjIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsZWFzZXMgKGluY2x1ZGVzIGFkZHJlc3NlcyByZXNlcnZlZAorIyBieSBPRkZFUidzLCBERUNMSU5FJ3MsIGFuZCBBUlAgY29uZmxpY3RzKS4gV2lsbCBiZSBjb3JyZWN0ZWQKKyMgaWYgaXQncyBiaWdnZXIgdGhhbiBJUCBsZWFzZSBibG9jaywgYnV0IGl0IG9rIHRvIG1ha2UgaXQKKyMgc21hbGxlciB0aGFuIGxlYXNlIGJsb2NrLgorI21heF9sZWFzZXMJMjU0CisKKyMgVGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgYW4gSVAgd2lsbCBiZSByZXNlcnZlZCAobGVhc2VkIHRvIG5vYm9keSkKKyMgaWYgYSBESENQIGRlY2xpbmUgbWVzc2FnZSBpcyByZWNlaXZlZCAoc2Vjb25kcykKKyNkZWNsaW5lX3RpbWUJMzYwMAorCisjIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IGFuIElQIHdpbGwgYmUgcmVzZXJ2ZWQKKyMgaWYgYW4gQVJQIGNvbmZsaWN0IG9jY3VycyAoc2Vjb25kcykKKyNjb25mbGljdF90aW1lCTM2MDAKKworIyBIb3cgbG9uZyBhbiBvZmZlcmVkIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgKHNlY29uZHMpCisjb2ZmZXJfdGltZQk2MAorCisjIElmIGNsaWVudCBhc2tzIGZvciBsZWFzZSBiZWxvdyB0aGlzIHZhbHVlLCBpdCB3aWxsIGJlIHJvdW5kZWQgdXAKKyMgdG8gdGhpcyB2YWx1ZSAoc2Vjb25kcykKKyNtaW5fbGVhc2UJNjAKKworIyBUaGUgbG9jYXRpb24gb2YgdGhlIHBpZCBmaWxlCisjcGlkZmlsZQkvdmFyL3J1bi91ZGhjcGQucGlkCisKKyMgVGhlIGxvY2F0aW9uIG9mIHRoZSBsZWFzZXMgZmlsZQorI2xlYXNlX2ZpbGUJL3Zhci9saWIvbWlzYy91ZGhjcGQubGVhc2VzCisKKyMgVGhlIHRpbWUgcGVyaW9kIGF0IHdoaWNoIHVkaGNwZCB3aWxsIHdyaXRlIG91dCBsZWFzZXMgZmlsZS4KKyMgSWYgdGhpcyBpcyAwLCB1ZGhjcGQgd2lsbCBuZXZlciBhdXRvbWF0aWNhbGx5IHdyaXRlIGxlYXNlcyBmaWxlLgorIyBTcGVjaWZpZWQgaW4gc2Vjb25kcy4KKyNhdXRvX3RpbWUJNzIwMAorCisjIEV2ZXJ5IHRpbWUgdWRoY3BkIHdyaXRlcyBhIGxlYXNlcyBmaWxlLCB0aGUgYmVsb3cgc2NyaXB0IHdpbGwgYmUgY2FsbGVkCisjbm90aWZ5X2ZpbGUJCQkjIGRlZmF1bHQ6IG5vIHNjcmlwdAorI25vdGlmeV9maWxlCWR1bXBsZWFzZXMJIyB1c2VmdWwgZm9yIGRlYnVnZ2luZworCisjIFRoZSBmb2xsb3dpbmcgYXJlIGJvb3RwIHNwZWNpZmljIG9wdGlvbnMKKyMgbmV4dCBzZXJ2ZXIgdG8gdXNlIGluIGJvb3RzdHJhcAorI3NpYWRkcgkJMTkyLjE2OC4wLjIyCSMgZGVmYXVsdDogMC4wLjAuMCAobm9uZSkKKyMgdGZ0cCBzZXJ2ZXIgbmFtZQorI3NuYW1lCQl6b3JhawkJIyBkZWZhdWx0OiBub25lCisjIHRmdHAgZmlsZSB0byBkb3dubG9hZCAoZS5nLiBrZXJuZWwgaW1hZ2UpCisjYm9vdF9maWxlCS92YXIvbmZzX3Jvb3QJIyBkZWZhdWx0OiBub25lCisKKyMgU3RhdGljIGxlYXNlcyBtYXAKKyNzdGF0aWNfbGVhc2UgMDA6NjA6MDg6MTE6Q0U6NEUgMTkyLjE2OC4wLjU0Cisjc3RhdGljX2xlYXNlIDAwOjYwOjA4OjExOkNFOjNFIDE5Mi4xNjguMC40NAorCisjIFRoZSByZW1haW5kZXIgb2Ygb3B0aW9ucyBhcmUgREhDUCBvcHRpb25zIGFuZCBjYW4gYmUgc3BlY2lmaWVkIHdpdGggdGhlCisjIGtleXdvcmQgJ29wdCcgb3IgJ29wdGlvbicuIElmIGFuIG9wdGlvbiBjYW4gdGFrZSBtdWx0aXBsZSBpdGVtcywgc3VjaAorIyBhcyB0aGUgZG5zIG9wdGlvbiwgdGhleSBjYW4gYmUgbGlzdGVkIG9uIHRoZSBzYW1lIGxpbmUsIG9yIG11bHRpcGxlCisjIGxpbmVzLgorIyBFeGFtcGxlczoKK29wdAlkbnMJMTkyLjE2OC4xMC4yIDE5Mi4xNjguMTAuMTAKK29wdGlvbglzdWJuZXQJMjU1LjI1NS4yNTUuMAorb3B0CXJvdXRlcgkxOTIuMTY4LjEwLjIKK29wdAl3aW5zCTE5Mi4xNjguMTAuMTAKK29wdGlvbglkbnMJMTI5LjIxOS4xMy44MQkjIGFwcGVuZGVkIHRvIGFib3ZlIEROUyBzZXJ2ZXJzIGZvciBhIHRvdGFsIG9mIDMKK29wdGlvbglkb21haW4JbG9jYWwKK29wdGlvbglsZWFzZQk4NjQwMDAJCSMgZGVmYXVsdDogMTAgZGF5cworIyBBcmJpdHJhcnkgb3B0aW9uIGluIGhleCBmb3JtOgorb3B0aW9uCTB4MDgJMDEwMjAzMDQJIyBvcHRpb24gODogImNvb2tpZSBzZXJ2ZXIgSVAgYWRkcjogMS4yLjMuNCIKKworIyBDdXJyZW50bHkgc3VwcG9ydGVkIG9wdGlvbnMgKGZvciBtb3JlIGluZm8sIHNlZSBvcHRpb25zLmMpOgorI29wdCBsZWFzZSAgICAgIE5VTQorI29wdCBzdWJuZXQgICAgIElQCisjb3B0IGJyb2FkY2FzdCAgSVAKKyNvcHQgcm91dGVyICAgICBJUF9MSVNUCisjb3B0IGlwdHRsICAgICAgTlVNCisjb3B0IG10dSAgICAgICAgTlVNCisjb3B0IGhvc3RuYW1lICAgU1RSSU5HCQkjIGNsaWVudCdzIGhvc3RuYW1lCisjb3B0IGRvbWFpbiAgICAgU1RSSU5HCQkjIGNsaWVudCdzIGRvbWFpbiBzdWZmaXgKKyNvcHQgc2VhcmNoICAgICBTVFJJTkdfTElTVAkjIHNlYXJjaCBkb21haW5zCisjb3B0IG5pc2RvbWFpbiAgU1RSSU5HCisjb3B0IHRpbWV6b25lICAgTlVNCQkjIChsb2NhbHRpbWUgLSBVVENfdGltZSkgaW4gc2Vjb25kcy4gc2lnbmVkCisjb3B0IHRmdHAgICAgICAgU1RSSU5HCQkjIHRmdHAgc2VydmVyIG5hbWUKKyNvcHQgYm9vdGZpbGUgICBTVFJJTkcJCSMgdGZ0cCBmaWxlIHRvIGRvd25sb2FkIChlLmcuIGtlcm5lbCBpbWFnZSkKKyNvcHQgYm9vdHNpemUgICBOVU0JCSMgc2l6ZSBvZiB0aGF0IGZpbGUKKyNvcHQgcm9vdHBhdGggICBTVFJJTkcJCSMgKE5GUykgcGF0aCB0byBtb3VudCBhcyByb290IGZzCisjb3B0IHdwYWQgICAgICAgU1RSSU5HCisjb3B0IHNlcnZlcmlkICAgSVAJCSMgZGVmYXVsdDogc2VydmVyJ3MgSVAKKyNvcHQgbWVzc2FnZSAgICBTVFJJTkcJCSMgZXJyb3IgbWVzc2FnZSAodWRoY3BkIHNlbmRzIGl0IG9uIHN1Y2Nlc3MgdG9vKQorI29wdCB2bGFuaWQgICAgIE5VTQkJIyA4MDIuMVAgVkxBTiBJRAorI29wdCB2bGFucHJpb3JpdHkgTlVNCQkjIDgwMi4xUSBWTEFOIHByaW9yaXR5CisjIE9wdGlvbnMgc3BlY2lmeWluZyBzZXJ2ZXIocykKKyNvcHQgZG5zICAgICAgICBJUF9MSVNUCisjb3B0IHdpbnMgICAgICAgSVBfTElTVAorI29wdCBuaXNzcnYgICAgIElQX0xJU1QKKyNvcHQgbnRwc3J2ICAgICBJUF9MSVNUCisjb3B0IGxwcnNydiAgICAgSVBfTElTVAorI29wdCBzd2Fwc3J2ICAgIElQCisjIE9wdGlvbnMgc3BlY2lmeWluZyByb3V0ZXMKKyNvcHQgcm91dGVzICAgICBJUF9QQUlSX0xJU1QKKyMgT2Jzb2xldGUgb3B0aW9ucywgbm8gbG9uZ2VyIHN1cHBvcnRlZAorI29wdCBsb2dzcnYgICAgIElQX0xJU1QJIyA3MDQvVURQIGxvZyBzZXJ2ZXIgKG5vdCBzeXNsb2chKQorI29wdCBuYW1lc3J2ICAgIElQX0xJU1QJIyBJRU4gMTE2IG5hbWUgc2VydmVyLCBvYnNvbGV0ZSAoQXVndXN0IDE5NzkhISEpCisjb3B0IGNvb2tpZXNydiAgSVBfTElTVAkjIFJGQyA4NjUgInF1b3RlIG9mIHRoZSBkYXkiIHNlcnZlciwgcmFyZWx5IChuZXZlcj8pIHVzZWQKKyNvcHQgdGltZXNydiAgICBJUF9MSVNUCSMgUkZDIDg2OCB0aW1lIHNlcnZlciwgcmFyZWx5IChuZXZlcj8pIHVzZWQKKyMgVE9ETzogaW4gZGV2ZWxvcG1lbnQKKyNvcHQgdXNlcmNsYXNzICBTVFJJTkcJCSMgUkZDIDMwMDQuIHNldCBvZiBMQVNDSUkgc3RyaW5ncy4gIkkgYW0gYSBwcmludGVyIiBldGMKKyNvcHQgc2lwc2VydiAgICBTVFJJTkcgTElTVAkjIFJGQyAzMzYxLiBmbGFnIGJ5dGUsIHRoZW46IDA6IGRvbWFpbiBuYW1lcywgMTogSVAgYWRkcnMKKyNvcHQgc3RhdGljcm91dGVzICAgU1RBVElDX1JPVVRFUworI29wdCBtc3N0YXRpY3JvdXRlcyBTVEFUSUNfUk9VVEVTCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91bmRlYiBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3VuZGViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3MTA0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91bmRlYgpAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vc2gKKyMKKyMgVGhpcyBzaG91bGQgd29yayB3aXRoIHRoZSBHTlUgdmVyc2lvbiBvZiB0YXIgYW5kIGd6aXAhCisjIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCB0aGUgYmFzaCBvciBhc2ggc2hlbGwhCisjIFJlcXVpcmVzIHRoZSBwcm9ncmFtcyAoYXIsIHRhciwgZ3ppcCwgYW5kIHRoZSBwYWdlciBtb3JlIG9yIGxlc3MpLgorIwordXNhZ2UoKSB7CitlY2hvICJVc2FnZTogdW5kZWIgLWMgcGFja2FnZS5kZWIgICAgICAgICAgICA8UHJpbnQgY29udHJvbCBmaWxlIGluZm8+IgorZWNobyAiICAgICAgIHVuZGViIC1sIHBhY2thZ2UuZGViICAgICAgICAgICAgPExpc3QgY29udGVudHMgb2YgZGViIHBhY2thZ2U+IgorZWNobyAiICAgICAgIHVuZGViIC14IHBhY2thZ2UuZGViIC9mb28vYm9vICAgPEV4dHJhY3QgZGViIHBhY2thZ2UgdG8gdGhpcyBkaXJlY3RvcnksIgorZWNobyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dCAuIGZvciBjdXJyZW50IGRpcmVjdG9yeT4iCitleGl0Cit9CisKK2RlYj0kMgorCitleGlzdCgpIHsKK2lmIFsgIiRkZWIiID0gIiIgXTsgdGhlbgordXNhZ2UKK2VsaWYgWyAhIC1zICIkZGViIiBdOyB0aGVuCitlY2hvICJDYW4ndCBmaW5kICRkZWIhIgorZXhpdAorZmkKK30KKworaWYgWyAiJDEiID0gIiIgXTsgdGhlbgordXNhZ2UKK2VsaWYgWyAiJDEiID0gIi1sIiBdOyB0aGVuCitleGlzdAordHlwZSBtb3JlID4vZGV2L251bGwgMj4mMSAmJiBwYWdlcj1tb3JlCit0eXBlIGxlc3MgPi9kZXYvbnVsbCAyPiYxICYmIHBhZ2VyPWxlc3MKK1sgIiRwYWdlciIgPSAiIiBdICYmIGVjaG8gIk5vIHBhZ2VyIGZvdW5kISIgJiYgZXhpdAorKGFyIC1wICRkZWIgY29udHJvbC50YXIuZ3ogfCB0YXIgLXh6TyAqY29udHJvbCA7IGVjaG8gLWUgIlxuUHJlc3MgZW50ZXIgdG8gc2Nyb2xsLCBxIHRvIFF1aXQhXG4iIDsgYXIgLXAgJGRlYiBkYXRhLnRhci5neiB8IHRhciAtdHp2KSB8ICRwYWdlcgorZXhpdAorZWxpZiBbICIkMSIgPSAiLWMiIF07IHRoZW4KK2V4aXN0CithciAtcCAkZGViIGNvbnRyb2wudGFyLmd6IHwgdGFyIC14ek8gKmNvbnRyb2wKK2V4aXQKK2VsaWYgWyAiJDEiID0gIi14IiBdOyB0aGVuCitleGlzdAoraWYgWyAiJDMiID0gIiIgXTsgdGhlbgordXNhZ2UKK2VsaWYgWyAhIC1kICIkMyIgXTsgdGhlbgorZWNobyAiTm8gc3VjaCBkaXJlY3RvcnkgJDMhIgorZXhpdAorZmkKK2FyIC1wICRkZWIgZGF0YS50YXIuZ3ogfCB0YXIgLXh6dnBmIC0gLUMgJDMgfHwgZXhpdAorZWNobworZWNobyAiRXh0cmFjdGVkICRkZWIgdG8gJDMhIgorZXhpdAorZWxzZQordXNhZ2UKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91bnJwbSBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3VucnBtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdmZDM2NzYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy91bnJwbQpAQCAtMCwwICsxLDQ4IEBACisjIS9iaW4vc2gKKyMKKyMgVGhpcyBzaG91bGQgd29yayB3aXRoIHRoZSBHTlUgdmVyc2lvbiBvZiBjcGlvIGFuZCBnemlwIQorIyBUaGlzIHNob3VsZCB3b3JrIHdpdGggdGhlIGJhc2ggb3IgYXNoIHNoZWxsIQorIyBSZXF1aXJlcyB0aGUgcHJvZ3JhbXMgKGNwaW8sIGd6aXAsIGFuZCB0aGUgcGFnZXIgbW9yZSBvciBsZXNzKS4KKyMKK3VzYWdlKCkgeworZWNobyAiVXNhZ2U6IHVucnBtIC1sIHBhY2thZ2UucnBtICAgICAgICAgICAgPExpc3QgY29udGVudHMgb2YgcnBtIHBhY2thZ2U+IgorZWNobyAiICAgICAgIHVucnBtIC14IHBhY2thZ2UucnBtIC9mb28vYm9vICAgPEV4dHJhY3QgcnBtIHBhY2thZ2UgdG8gdGhpcyBkaXJlY3RvcnksIgorZWNobyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dCAuIGZvciBjdXJyZW50IGRpcmVjdG9yeT4iCitleGl0Cit9CisKK3JwbT0kMgorCitleGlzdCgpIHsKK2lmIFsgIiRycG0iID0gIiIgXTsgdGhlbgordXNhZ2UKK2VsaWYgWyAhIC1zICIkcnBtIiBdOyB0aGVuCitlY2hvICJDYW4ndCBmaW5kICRycG0hIgorZXhpdAorZmkKK30KKworaWYgWyAiJDEiID0gIiIgXTsgdGhlbgordXNhZ2UKK2VsaWYgWyAiJDEiID0gIi1sIiBdOyB0aGVuCitleGlzdAordHlwZSBtb3JlID4vZGV2L251bGwgMj4mMSAmJiBwYWdlcj1tb3JlCit0eXBlIGxlc3MgPi9kZXYvbnVsbCAyPiYxICYmIHBhZ2VyPWxlc3MKK1sgIiRwYWdlciIgPSAiIiBdICYmIGVjaG8gIk5vIHBhZ2VyIGZvdW5kISIgJiYgZXhpdAorKGVjaG8gLWUgIlxuUHJlc3MgZW50ZXIgdG8gc2Nyb2xsLCBxIHRvIFF1aXQhXG4iIDsgcnBtMmNwaW8gJHJwbSB8IGNwaW8gLXR2IC0tcXVpZXQpIHwgJHBhZ2VyCitleGl0CitlbGlmIFsgIiQxIiA9ICIteCIgXTsgdGhlbgorZXhpc3QKK2lmIFsgIiQzIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgISAtZCAiJDMiIF07IHRoZW4KK2VjaG8gIk5vIHN1Y2ggZGlyZWN0b3J5ICQzISIKK2V4aXQKK2ZpCitycG0yY3BpbyAkcnBtIHwgKHVtYXNrIDAgOyBjZCAkMyA7IGNwaW8gLWlkbXV2KSB8fCBleGl0CitlY2hvCitlY2hvICJFeHRyYWN0ZWQgJHJwbSB0byAkMyEiCitleGl0CitlbHNlCit1c2FnZQorZmkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL1JFQURNRSBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjgxN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvUkVBRE1FCkBAIC0wLDAgKzEsNTkgQEAKK0luIG1hbnkgY2FzZXMsIG5ldHdvcmsgY29uZmlndXJhdGlvbiBtYWtlcyBpdCBuZWNlc3NhcnkgdG8gcnVuIHNldmVyYWwgZGFlbW9uczoKK2RoY3AsIHplcm9jb25mLCBwcHAsIG9wZW52cG4gYW5kIHN1Y2guIFRoZXkgbmVlZCB0byBiZSBjb250cm9sbGVkLAorYW5kIGluIG1hbnkgY2FzZXMgeW91IGFsc28gd2FudCB0byBiYWJ5c2l0IHRoZW0uIHJ1bnN2ZGlyIGlzIGEgZ29vZCB0b29sIGZvciB0aGlzLgorZXhhbXBsZXMvdmFyX3NlcnZpY2UgZGlyZWN0b3J5IHByb3ZpZGVzIGEgZmV3IGV4YW1wbGVzLiBJdCBpcyBtZWFudCB0byBiZSB1c2VkCit0aGlzIHdheTogY29weSBpdCBzb21ld2hlcmUgKHNheSwgL3Zhci9zZXJ2aWNlKSBhbmQgcnVuIHNvbWV0aGluZyBsaWtlCisKK2VudiAtIFBBVEg9Li4uIDxvdGhlciB2YXJzPS4uLj4gcnVuc3ZkaXIgL3Zhci9zZXJ2aWNlICYKKworZnJvbSBvbmUgb2Ygc3lzdGVtIHN0YXJ0dXAgc2NyaXB0cy4gKEdvb2dsZSAibWFuIHJ1bnN2ZGlyIiBhbmQgIm1hbiBydW5zdiIKK2ZvciBtb3JlIGluZm8gYWJvdXQgdGhlc2UgdG9vbHMpLgorCitTb21lIGV4aXN0aW5nIGV4YW1wbGVzOgorCit2YXJfc2VydmljZS9kaGNwX2lmIC0KK2NvbnRyb2xzIGEgdWRoY3BjIGluc3RhbmNlIHdoaWNoIHByb3ZpZGVzIGRocGMtYXNzaWduZWQgSVAKK2FkZHJlc3Mgb24gaW50ZXJmYWNlIG5hbWVkICJpZiIuIENvcHkvcmVuYW1lIHRoaXMgZGlyZWN0b3J5IGFzIG5lZWRlZCB0byBydW4KK3VkaGNwYyBvbiBvdGhlciBpbnRlcmZhY2VzICh2YXJfc2VydmljZS9kaGNwX2lmL3J1biBzY3JpcHQgdXNlcyBfZm9vIHN1ZmZpeAorb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgYXMgaW50ZXJmYWNlIG5hbWUpLiBXaGVuIElQIGFkZHJlc3MgaXMgb2J0YWluZWQgb3IgbG9zdCwKK3Zhcl9zZXJ2aWNlL2RoY3BfaWYvZGhjcF9oYW5kbGVyIGlzIHJ1bi4gSXQgc2F2ZXMgbmV3IGNvbmZpZyBkYXRhIHRvCisvdmFyL3J1bi9zZXJ2aWNlL2Z3L2RoY3BfaWYuaXBjb25mIGFuZCAocmUpc3RhcnRzIC92YXIvc2VydmljZS9mdyBzZXJ2aWNlLgorVGhpcyBleGFtcGxlIGNhbiBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIG90aGVyIGR5bmFtaWMgbmV0d29yayBsaW5rIHNlcnZpY2VzCisocHBwL3Zwbi96Y2lwKS4KKwordmFyX3NlcnZpY2UvaWZwbHVnZF9pZiAtCit3YXRjaGVzIGxpbmsgc3RhdHVzIG9mIGludGVyZmFjZSBpZi4gRG93bnMgYW5kIHVwcyAvdmFyL3NlcnZpY2UvZGhjcF9pZgorc2VydmljZSBhY2NvcmRpbmdseS4gSW4gZWZmZWN0LCBpdCBhbGxvd3MgeW91IHRvIHVucGx1Zy9wbHVnLXRvLWRpZmZlcmVudC1uZXR3b3JrCithbmQgaGF2ZSB5b3VyIElQIHByb3Blcmx5IHJlLW5lZ290aWF0ZWQgYXQgb25jZS4KKwordmFyX3NlcnZpY2UvZGhjcF9pZl9waW5nZXIgLQorVXNlcyB2YXJfc2VydmljZS9kaGNwX2lmJ3MgZGF0YSAoL3Zhci9zZXJ2aWNlL2RoY3BfaWYvZGhjcF9pZi5vdXQgZmlsZSkKK3RvIGRldGVybWluZSByb3V0ZXIgSVAuIFBpbmdzIGl0LiBJZiBwaW5nIGZhaWxzLCByZXN0YXJ0cyAvdmFyL3NlcnZpY2UvZGhjcF9pZgorc2VydmljZS4gQmFzaWNhbGx5LCBhbiBleGFtcGxlIG9mIHdhdGNoZG9nIHNlcnZpY2UgZm9yIG5ldHdvcmtzCit3aGljaCBhcmUgbm90IHJlbGlhYmxlIGFuZCBuZWVkIGJhYnlzaXR0aW5nLgorCit2YXJfc2VydmljZS9mdyAtCitBICpvbmUtc2hvdCogc2VydmljZSB3aGljaCByZWNvbmZpZ3VyZXMgbmV0d29yayBiYXNlZCBvbiBjdXJyZW50IGtub3duIHN0YXRlCitvZiBBTEwgaW50ZXJmYWNlcy4gVXNlcyBjb25mLyouaXBjb25mIChzdGF0aWMgY29uZmlnKSBhbmQgL3Zhci9ydW4vc2VydmljZS9mdy8qLmlwY29uZgorKGR5bmFtaWMgY29uZmlnIGZyb20gZGhjcC9wcHAvdnBuL2V0YykgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gZG8uCitPbmUtc2hvdC1uZXNzIG9mIHRoaXMgc2VydmljZSBtZWFucyB0aGF0IGl0IHNodXRzIGl0c2VsZiBvZmYgYWZ0ZXIgc2luZ2xlIHJ1bi4KK0lPVzogaXQgaXMgbm90IGEgY29uc3RhbnRseSBydW5uaW5nIGRhZW1vbiBzb3J0IG9mIHRoaW5nLgorSXQgc3RhcnRzLCBpdCBjb25maWd1cmVzIHRoZSBuZXR3b3JrLCBpdCBzaHV0cyBkb3duLCBhbGwgZG9uZQorKHVubGlrZSBpbmZhbW91cyBOZXR3b3JrTWFuYWdlcnMgd2hpY2ggc2l0IGluIFJBTSBmb3JldmVyLCBkb2luZyBoZWxsIGtub3dzIHdoYXQpLgorCitIb3dldmVyLCBhbnkgZGhjcC9wcHAvdnBuIG9yIHNpbWlsYXIgc2VydmljZSBjYW4gcmVzdGFydCBpdCBhbnl0aW1lCit3aGVuIGl0IHNlbnNlcyB0aGUgY2hhbmdlIGluIG5ldHdvcmsgY29uZmlndXJhdGlvbi4KK1RoaXMgZXZlbiB3b3JrcyB3aGlsZSBmdyBzZXJ2aWNlIHJ1bnM6IGlmIGRoY3Agc2lnbmFscyBmdyB0byAocmUpc3RhcnQKK3doaWxlIGZ3IHJ1bnMsIGZ3IHdpbGwgbm90IHN0b3AgYWZ0ZXIgaXRzIGV4ZWN1dGlvbiwgYnV0IHdpbGwgcmUtZXhlY3V0ZSBvbmNlLAorcGlja2luZyB1cCBkaGNwJ3MgbmV3IGNvbmZpZ3VyYXRpb24uCitUaGlzIGlzIGFjaGlldmVkIHZlcnkgc2ltcGx5IGJ5IGhhdmluZworIyBNYWtlIG91cnNlbGYgb25lLXNob3QKK3N2IG8gLgorYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIGZ3L3J1biBzY3JpcHQsIG5vdCBhdCB0aGUgZW5kLgorVGhlcmVmb3JlLCBhbnkgInN2IHUgL3Zhci9ydW4vc2VydmljZS9mdyIgY29tbWFuZCBieSBhbnkgb3RoZXIKK3NjcmlwdCAidW5kb2VzIiBvKG5lLXNob3QpIGNvbW1hbmQgaWYgZncgc3RpbGwgcnVucywgdGh1cworcnVuc3Ygd2lsbCByZXJ1biBpdDsgb3Igc3RhcnQgaXQgaW4gYSBub3JtYWwgd2F5IGlmIGZ3IGlzIG5vdCBydW5uaW5nLgorCitTeXN0ZW0gYWRtaW5pc3RyYXRvcnMgYXJlIGV4cGVjdGVkIHRvIGVkaXQgZncvcnVuIHNjcmlwdCwgc2luY2UKK25ldHdvcmsgY29uZmlndXJhdGlvbiBuZWVkcyBhcmUgbGlrZWx5IHRvIGJlIHZlcnkgY29tcGxleCBhbmQgZGlmZmVyZW50Citmb3Igbm9uLXRyaXZpYWwgaW5zdGFsbGF0aW9ucy4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvY29udmVydDJpcGNvbmYgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2NvbnZlcnQyaXBjb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYyYTI4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2NvbnZlcnQyaXBjb25mCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9zaAorIyBjb252ZXJ0OgorCisjIGRoY3B0eXBlPTUKKyMgc2VydmVyaWQ9MTcyLjE2LjQyLjEwMgorIyBsZWFzZT05NzIwMAorIyBpbnRlcmZhY2U9ZXRoMAorIyBpcD0xNzIuMTYuNDIuMTc3CisjIHN1Ym5ldD0yNTUuMjU1LjI1NS4wCisjIG1hc2s9MjQKKyMgYnJvYWRjYXN0PTE3Mi4xNi4yMi4yNTUKKyMgcm91dGVyPTE3Mi4xNi40Mi45OAorIyBkbnM9MTAuMzQuMzIuMTI1IDEwLjMyLjYzLjUgMTAuMzQuMjU1LjcgMTAuMTEuMjU1LjI3CisjIGRvbWFpbj1sYWIuZXhhbXBsZS5jb20gZXhhbXBsZS5jb20KKyMgbnRwc3J2PTEwLjM0LjMyLjEyNSAxMC4zNC4yNTUuNworCisjIGludG86CisKKyNsZXQgY2ZnPWNmZysxCisjaWZbJGNmZ109Li4uOyBpcFskY2ZnXT0uLi47IGlwbWFza1skY2ZnXT0uLi4vLi4uOyBnd1skY2ZnXT0uLi47IG5ldFskY2ZnXT0uLi4gZG5zWyRjZmddPS4uLgorCitleGVjID4vZGV2L251bGwKKyNleGVjID4iJDAub3V0IiAgIyBkZWJ1ZworZXhlYyAyPiYxCisKK3Rlc3QgIiRpbnRlcmZhY2UiIHx8IGV4aXQgMQordGVzdCAiJGlwIiB8fCBleGl0IDEKKworeworZWNobyAibGV0IGNmZz1jZmcrMSIKK3Rlc3QgIiRpbnRlcmZhY2UiCSYmIGVjaG8gImlmW1wkY2ZnXT0nJGludGVyZmFjZSciCit0ZXN0ICIkaXAiCQkmJiBlY2hvICJpcFtcJGNmZ109JyRpcCciCit0ZXN0ICIkaXAiICYmIHRlc3QgIiRtYXNrIiBcCisJCQkmJiBlY2hvICJpcG1hc2tbXCRjZmddPSckaXAvJG1hc2snIgordGVzdCAiJHJvdXRlciIJCSYmIGVjaG8gImd3W1wkY2ZnXT0nJHJvdXRlciciCit0ZXN0ICIkZG5zIgkJJiYgZWNobyAiZG5zW1wkY2ZnXT0nJGRucyciCisjIFRPRE86IEkgbmV2ZXIgc2F3IGEgZGhjcCBzZXJ2ZXIgd2hpY2ggY29ycmVjdGx5IGFubm91bmNlcworIyB3aGljaCBzdWJuZXQocykgaXMvYXJlIGF2YWlsYWJsZSB0aHJ1IGFkdmVydGlzZWQgcm91dGVyCisjIEFzc3VtZSAwLzAKK2VjaG8gIm5ldFtcJGNmZ109JzAvMCciCit9ID4iJDEiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2NvbnZlcnQybnRwY29uZiBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvY29udmVydDJudHBjb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlYmYxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2NvbnZlcnQybnRwY29uZgpAQCAtMCwwICsxLDM0IEBACisjIS9iaW4vc2gKKyMgY29udmVydDoKKworIyBkaGNwdHlwZT01CisjIHNlcnZlcmlkPTE3Mi4xNi40Mi4xMDIKKyMgbGVhc2U9OTcyMDAKKyMgaW50ZXJmYWNlPWV0aDAKKyMgaXA9MTcyLjE2LjQyLjE3NworIyBzdWJuZXQ9MjU1LjI1NS4yNTUuMAorIyBtYXNrPTI0CisjIGJyb2FkY2FzdD0xNzIuMTYuMjIuMjU1CisjIHJvdXRlcj0xNzIuMTYuNDIuOTgKKyMgZG5zPTEwLjM0LjMyLjEyNSAxMC4zMi42My41IDEwLjM0LjI1NS43IDEwLjExLjI1NS4yNworIyBkb21haW49bGFiLmV4YW1wbGUuY29tIGV4YW1wbGUuY29tCisjIG50cHNydj0xMC4zNC4zMi4xMjUgMTAuMzQuMjU1LjcKKworIyBpbnRvOgorCisjbGV0IGNmZz1jZmcrMQorI250cGlwWyRjZmddPS4uLgorCitleGVjID4vZGV2L251bGwKKyNleGVjID4iJDAub3V0IiAgIyBkZWJ1ZworZXhlYyAyPiYxCisKK3Rlc3QgIiRpbnRlcmZhY2UiIHx8IGV4aXQgMQordGVzdCAiJGlwIiB8fCBleGl0IDEKKworeworZm9yIG4gaW4gJG50cHNydjsgZG8KKwllY2hvICJsZXQgY2ZnPWNmZysxIgorCWVjaG8gIm50cGlwW1wkY2ZnXT0nJG4nIjsKK2RvbmUKK30gPiIkMSIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvZGhjcF9oYW5kbGVyIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9kaGNwX2hhbmRsZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTI3ZTAyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvZGhjcF9oYW5kbGVyCkBAIC0wLDAgKzEsODMgQEAKKyMhL2Jpbi9zaAorIyBleGVjdXRlZCBieSB1ZGhjcGMKKyMgcGFyYW1ldGVyczogJDEgYW5kIGVudmlyb25tZW50CisjICQxIGlzOgorIworIyBkZWNvbmZpZzogdWRoY3BjIHN0YXJ0cywgb3IgbGVhc2UgaXMgbG9zdC4KKyMgRW52aXJvbm1lbnQgZXhhbXBsZTogaW50ZXJmYWNlPWV0aDAKKyMKKyMgYm91bmQ6IGxlYXNlIGlzIG9idGFpbmVkLiBFbnZpcm9ubWVudCBleGFtcGxlOgorIyBkaGNwdHlwZT01CisjIHNlcnZlcmlkPTE3Mi4xNi40Mi4xMDIKKyMgbGVhc2U9OTcyMDAKKyMgaW50ZXJmYWNlPWV0aDAKKyMgaXA9MTcyLjE2LjQyLjE3NworIyBzdWJuZXQ9MjU1LjI1NS4yNTUuMAorIyBtYXNrPTI0CisjIGJyb2FkY2FzdD0xNzIuMTYuMjIuMjU1CisjIHJvdXRlcj0xNzIuMTYuNDIuOTgKKyMgZG5zPTEwLjM0LjMyLjEyNSAxMC4zMi42My41IDEwLjM0LjI1NS43IDEwLjExLjI1NS4yNworIyBkb21haW49bGFiLmV4YW1wbGUuY29tIGV4YW1wbGUuY29tCisjIG50cHNydj0xMC4zNC4zMi4xMjUgMTAuMzQuMjU1LjcKKyMKKyMgcmVuZXc6IGxlYXNlIGlzIHJlbmV3ZWQuIEVudmlyb25tZW50IGlzIHNpbWlsYXIgdG8gImJvdW5kIi4KKyMgVGhlIElQIGFkZHJlc3MgZG9lcyBub3QgY2hhbmdlLCBob3dldmVyLCB0aGUgb3RoZXIgREhDUCBwYXJhbWF0ZXJzLAorIyBzdWNoIGFzIHRoZSBkZWZhdWx0IGdhdGV3YXksIHN1Ym5ldCBtYXNrLCBhbmQgZG5zIHNlcnZlciBtYXkgY2hhbmdlLgorIworIyBuYWs6IHVkaGNwYyByZWNlaXZlZCBhIE5BSyBtZXNzYWdlLgorIyBFbnZpcm9ubWVudCBleGFtcGxlOiBpbnRlcmZhY2U9ZXRoMAorIworIyBsZWFzZWZhaWw6IHVkaGNwYyBjYW5ub3Qgb2J0YWluIGEgbGVhc2UgKERIQ1Agc2VydmVyIG5vdCByZXNwb25kaW5nLCBldGMpLgorIyBFbnZpcm9ubWVudCBleGFtcGxlOiBpbnRlcmZhY2U9ZXRoMAorCisjIFRPRE86IHB1dCAkZG9tYWluIGludG8gL2V0Yy9yZXNvbHYuY29uZiAodGhydSAvdmFyL3NlcnZpY2UvZncpCisKK3NlcnZpY2U9JHtQV0QjIyovfQorZmlsZV9pcGNvbmY9IiRzZXJ2aWNlLmlwY29uZiIKK2ZpbGVfbnRwY29uZj0iJHNlcnZpY2UubnRwY29uZiIKK2Rpcl9pcGNvbmY9Ii92YXIvcnVuL3NlcnZpY2UvZnciCitkaXJfbnRwY29uZj0iL3Zhci9ydW4vc2VydmljZS9udHAiCisKK2V4ZWMgPi9kZXYvbnVsbAorI2V4ZWMgPj4iJDAub3V0IiAgI2RlYnVnCitleGVjIDI+JjEKKworZWNobyAiYGRhdGVgOiBQYXJhbXM6ICQqIgorCitpZiB0ZXN0IHgiJDEiICE9IHgiYm91bmQiICYmIHRlc3QgeCIkMSIgIT0geCJyZW5ldyIgOyB0aGVuCisJIyBSZWNvbmZpZ3VyZSBuZXR3b3JrIHdpdGggdGhpcyBpbnRlcmZhY2UgZGlzYWJsZWQKKwllY2hvICJEZWNvbmZpZ3VyaW5nIgorCXJtICIkc2VydmljZS5vdXQiCisJcm0gIiRmaWxlX2lwY29uZiIKKwlybSAiJGZpbGVfbnRwY29uZiIKKwlybSAiJGRpcl9pcGNvbmYvJGZpbGVfaXBjb25mIgorCXJtICIkZGlyX250cGNvbmYvJGZpbGVfbnRwY29uZiIKKwlzdiB1IC92YXIvc2VydmljZS9mdworCWV4aXQKK2ZpCisKKyMgQm91bmQ6IHdlJ3ZlIGdvdCB0aGUgbGVhc2UKKyNlbnYgPiIkc2VydmljZS5vdXQiICAjIGRlYnVnCisKKy4vY29udmVydDJpcGNvbmYgIiRmaWxlX2lwY29uZiIKKyMgUmVjb25maWd1cmUgcm91dGluZyBhbmQgZmlyZXdhbGwgaWYgbmVlZGVkCitkaWZmIC0tYnJpZWYgIiRmaWxlX2lwY29uZiIgIiRkaXJfaXBjb25mLyRmaWxlX2lwY29uZiIgPi9kZXYvbnVsbCAyPiYxCitpZiB0ZXN0ICQ/ICE9IDA7IHRoZW4KKwllY2hvICJSZWNvbmZpZ3VyaW5nIGZ3IgorCW1rZGlyIC1wICIkZGlyX2lwY29uZiIgMj4vZGV2L251bGwKKwljcCAiJGZpbGVfaXBjb25mIiAiJGRpcl9pcGNvbmYvJGZpbGVfaXBjb25mIgorCXN2IHUgL3Zhci9zZXJ2aWNlL2Z3CitmaQorCitpZiB0ZXN0IC1kIC92YXIvc2VydmljZS9udHA7IHRoZW4KKwkuL2NvbnZlcnQybnRwY29uZiAiJGZpbGVfbnRwY29uZiIKKwkjIFJlY29uZmlndXJlIG50cCBzZXJ2ZXIgYWRkcmVzc2VzIGlmIG5lZWRlZAorCWRpZmYgLS1icmllZiAiJGZpbGVfbnRwY29uZiIgIiRkaXJfbnRwY29uZi8kZmlsZV9udHBjb25mIiA+L2Rldi9udWxsIDI+JjEKKwlpZiB0ZXN0ICQ/ICE9IDA7IHRoZW4KKwkJZWNobyAiUmVjb25maWd1cmluZyBudHAiCisJCW1rZGlyIC1wICIkZGlyX250cGNvbmYiIDI+L2Rldi9udWxsCisJCWNwICIkZmlsZV9udHBjb25mIiAiJGRpcl9udHBjb25mLyRmaWxlX250cGNvbmYiCisJCXN2IHQgL3Zhci9zZXJ2aWNlL250cAorCQlzdiB1IC92YXIvc2VydmljZS9udHAKKwlmaQorZmkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvbG9nL3J1biBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjBkMWIxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9sb2cvcnVuCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCit1c2VyPWxvZ2dlcgorCitsb2dkaXI9Ii92YXIvbG9nL3NlcnZpY2UvYChjZCAuLjtiYXNlbmFtZSAkUFdEKWAiCitta2RpciAtcCAiJGxvZ2RpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlciI6ICIkbG9nZGlyIgorY2htb2QgLVIgZ28tcnd4c3QsdStyd1ggIiRsb2dkaXIiCitybSBsb2dkaXIKK2xuIC1zICIkbG9nZGlyIiBsb2dkaXIKKworIyBtYWtlIHRoaXMgZGlyIGFjY2Vzc2libGUgdG8gbG9nZ2VyCitjaG1vZCBhK3JYIC4KKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitzdmxvZ2QgLXR0ICIkbG9nZGlyIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9wX2xvZyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3J1biBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlYzc5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3J1bgpAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKKworZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKworcHdkPSIkUFdEIgorCitpZj0iJHtQV0QjIyovZGhjcF99IgorCitlY2hvICIqIFVwcGluZyBpZmFjZSAkaWYiCitpcCBsaW5rIHNldCBkZXYgIiRpZiIgdXAKKworZWNobyAiKiBTdGFydGluZyB1ZGhjcGMiCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkIHJvb3QgXAordWRoY3BjIC12diBcCistLWhvc3RuYW1lPW51bGwgXAorLS1mb3JlZ3JvdW5kIFwKKy0taW50ZXJmYWNlPSIkaWYiIFwKKy0tcGlkZmlsZT0iJHB3ZC91ZGhjcGMucGlkIiBcCistLXNjcmlwdD0iJHB3ZC9kaGNwX2hhbmRsZXIiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3dfbG9nIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi93X2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTM2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi93X2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQord2F0Y2ggLW4yICd3PWB0dHlzaXplIHdgOyBoPWB0dHlzaXplIGhgOyB0YWlsIC0kKChoLTMpKSBjdXJyZW50IDI+JjEgfCBjdXQgLWIxLSQoKHctMikpJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZl9waW5nZXIvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZl9waW5nZXIvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwYjJmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmX3Bpbmdlci9ydW4KQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCisKK2RlbGF5PTY3CisKK2lmPSR7UFdEIyMqL2RoY3BffQoraWY9JHtpZiUlX3Bpbmdlcn0KKworaWYgdGVzdCAtZiAiJDAubG9nIjsgdGhlbgorCXRhaWwgLTk5OSAiJDAubG9nIiA+IiQwLmxvZy5uZXciCisJbXYgIiQwLmxvZy5uZXciICIkMC5sb2ciCitmaQorCit0ZXN0IC1mICIvdmFyL3NlcnZpY2UvZGhjcF8kaWYvZGhjcF8kaWYub3V0IiB8fCBleGVjIGVudiAtIHNsZWVwICIkZGVsYXkiCisuICIvdmFyL3NlcnZpY2UvZGhjcF8kaWYvZGhjcF8kaWYub3V0IgordGVzdCB4IiRyb3V0ZXIiICE9IHgiIiB8fCBleGVjIGVudiAtIHNsZWVwICIkZGVsYXkiCisKKyNlY2hvICJgZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJ2AgVGVzdGluZyBwaW5nIC1jMyAkcm91dGVyIiA+PiIkMC5sb2ciCitwaW5nIC1jMyAiJHJvdXRlciIgJiYgZXhlYyBlbnYgLSBzbGVlcCAiJGRlbGF5IgorCitlY2hvICJgZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJ2AgUmVzdGFydGluZyAvdmFyL3NlcnZpY2UvZGhjcF8kaWYiID4+IiQwLmxvZyIKK3N2IHQgIi92YXIvc2VydmljZS9kaGNwXyRpZiIKKworZXhlYyBlbnYgLSBzbGVlcCAiJGRlbGF5IgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9sb2cvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9sb2cvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MGQxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL2xvZy9ydW4KQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisKK3VzZXI9bG9nZ2VyCisKK2xvZ2Rpcj0iL3Zhci9sb2cvc2VydmljZS9gKGNkIC4uO2Jhc2VuYW1lICRQV0QpYCIKK21rZGlyIC1wICIkbG9nZGlyIiAyPi9kZXYvbnVsbAorY2hvd24gLVIgIiR1c2VyIjogIiRsb2dkaXIiCitjaG1vZCAtUiBnby1yd3hzdCx1K3J3WCAiJGxvZ2RpciIKK3JtIGxvZ2RpcgorbG4gLXMgIiRsb2dkaXIiIGxvZ2RpcgorCisjIG1ha2UgdGhpcyBkaXIgYWNjZXNzaWJsZSB0byBsb2dnZXIKK2NobW9kIGErclggLgorCitleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3N2bG9nZCAtdHQgIiRsb2dkaXIiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3BfbG9nIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9wX2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjUyMWJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9wX2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQorY2F0IEAqIGN1cnJlbnQgfCAkUEFHRVIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdiN2QyYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvcnVuCkBAIC0wLDAgKzEsMTcgQEAKKyMhL2Jpbi9zaAorCisjZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgPC9kZXYvbnVsbAorCit1c2VyPXd3dwordXNlcj1yb290CisKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCit0Y3BzdmQgXAorICAtdkUgLWwgMCAtYyA0MCBcCisgIDAuMC4wLjAgMjEgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorZnRwZCAtdnYgLXQxMCAvcHViL2Z0cGRfcm9vdApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC93X2xvZyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvd19sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvd19sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK3dhdGNoIC1uMiAndz1gdHR5c2l6ZSB3YDsgaD1gdHR5c2l6ZSBoYDsgdGFpbCAtJCgoaC0zKSkgY3VycmVudCAyPiYxIHwgY3V0IC1iMS0kKCh3LTIpKScKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvMTEuMjIuMzMuNDQuaXBjb25mLS0gYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9jb25mLzExLjIyLjMzLjQ0LmlwY29uZi0tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDRlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9jb25mLzExLjIyLjMzLjQ0LmlwY29uZi0tCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9zaAorIyBJZiB3ZSBoYXZlIHNpbXBsZSBzdGF0aWMgYWRkcmVzcy4uLgorIworbGV0IGNmZz1jZmcrMQoraWZbJGNmZ109aWYKK2lwWyRjZmddPTExLjIyLjMzLjQ0CitpcG1hc2tbJGNmZ109MTEuMjIuMzMuNDQvMjQKK2d3WyRjZmddPTExLjIyLjMzLjEKK25ldFskY2ZnXT0wLzAKK2Ruc1skY2ZnXT0nMTEuMjIuMzMuMiAxMS4yMi4zMy4zJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi8xOTIuMTY4LjAuMS5pcGNvbmYgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9jb25mLzE5Mi4xNjguMC4xLmlwY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Y1NWRiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi8xOTIuMTY4LjAuMS5pcGNvbmYKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL3NoCisjIEEgc21hbGwgbmV0d29yayB3aXRoIG5vIHJvdXRlcnMKKyMgKG1heWJlICp3ZSogYXJlIHRoZWlyIHJvdXRlcikKKyMKK2xldCBjZmc9Y2ZnKzEKK2lmWyRjZmddPWlmCitpcFskY2ZnXT0xOTIuMTY4LjAuMQoraXBtYXNrWyRjZmddPTE5Mi4xNjguMC4xLzI0CisjIyMgZ3dbJGNmZ109CisjIyMgbmV0WyRjZmddPTAvMAorIyMjIGRuc1skY2ZnXT0nJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi9sby5pcGNvbmYgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9jb25mL2xvLmlwY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJlNWYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi9sby5pcGNvbmYKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKKyMgTW9zdGx5IHJlZHVuZGFudCBleGNlcHQgd2hlbiB5b3UgbmVlZCBkbnNbXT15b3VyX3N0YXRpY19kbnNfc3J2CisjCitsZXQgY2ZnPWNmZysxCitpZlskY2ZnXT1sbworaXBbJGNmZ109MTI3LjAuMC4xCitpcG1hc2tbJGNmZ109MTI3LjAuMC4xLzgKK2d3WyRjZmddPScnCituZXRbJGNmZ109JycKKyNkbnNbJGNmZ109MTI3LjAuMC4xCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ldGMvaG9zdHMgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ldGMvaG9zdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlZTUzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2V0Yy9ob3N0cwpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKK2VjaG8gIlwKKyMgVGhpcyBmaWxlIGlzIGF1dG9tYWdpY2FsbHkgcmVnZW5lcmF0ZWQKKyMgTm90ZSEgL2V0Yy9uc3N3aXRjaC5jb25mIG1heSBvdmVycmlkZSB0aGlzIQorCisjIEZvciBsb29wYmFja2luZworMTI3LjAuMC4xIGxvY2FsaG9zdAorCisjIE91ciBsb2NhbCBJUHMiCisKK2hvc3RuYW1lPWBob3N0bmFtZWAKK3Rlc3QgIiRob3N0bmFtZSIgfHwgaG9zdG5hbWU9bG9jYWxob3N0Citkb21haW49YCguIC9ib290LmNvbmY7IGVjaG8gIiRETlNET01BSU5OQU1FIilgCit0ZXN0ICIkZG9tYWluIiAmJiBob3N0bmFtZT0iJGhvc3RuYW1lICRob3N0bmFtZS4kZG9tYWluIgorCitpcCAtbyBhIGwgXAorfCBncmVwIC1GICdpbmV0ICcgXAorfCBzZWQgLWUgJ3MvXi4qaW5ldCAvLycgLWUgJ3M6WyAvXS4qJDogJyIkaG9zdG5hbWUiJzonCisKK2VjaG8KK2VjaG8gIiMgRW5kIG9mIC9ldGMvaG9zdHMiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ldGMvcmVzb2x2LmNvbmYgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ldGMvcmVzb2x2LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2MTk4NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2V0Yy9yZXNvbHYuY29uZgpAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vYmFzaAorCitkb21haW49YCguIC9ib290LmNvbmY7IGVjaG8gIiRETlNET01BSU5OQU1FIikgMj4vZGV2L251bGxgCisKK2VjaG8gIiMgVGhpcyBmaWxlIGlzIGF1dG9tYWdpY2FsbHkgcmVnZW5lcmF0ZWQgd2l0aCBlYWNoIGJvb3QiCitlY2hvCit0ZXN0ICIkZG9tYWluIiAmJiBlY2hvICJkb21haW4gJGRvbWFpbiIKK3Rlc3QgIiRkb21haW4iICYmIGVjaG8gInNlYXJjaCAkZG9tYWluIgorZWNobworZWNobyAiIyBOb3RlIHRoYXQgbnNsb29rdXAgY2FuIGNob2tlIG9uIEROUyBzZXJ2ZXIgd2hpY2ggaXRzZWxmIgorZWNobyAiIyBkb2VzIE5PVCBoYXZlIGRvbWFpbiBuYW1lLiBPdGhlciB0aGluZ3MgY2FuIHdvcmsgZmluZS4iCitlY2hvCisjICMgSWYgd2UgcnVuIEROUyBjYWNoZToKKyMgZWNobyAibmFtZXNlcnZlciAxMjcuMC4wLjEiCisjIGV4aXQKKworcHJpbz0wCitpPTA7IHdoaWxlIHRlc3QgIiR7aWZbJGldfSI7IGRvCisJdGVzdCB4IiR7ZG5zX3ByaW9bJGldfSIgIT0geCIiIFwKKwkmJiB0ZXN0ICIke2Ruc19wcmlvWyRpXX0iIC1ndCAiJHByaW8iIFwKKwkmJiBwcmlvPSIke2Ruc19wcmlvWyRpXX0iCitsZXQgaSsrOyBkb25lCisKK2k9MDsgd2hpbGUgdGVzdCAiJHtpZlskaV19IjsgZG8KKwlmb3IgZCBpbiAke2Ruc1skaV19OyBkbworCQlwPSIke2Ruc19wcmlvWyRpXX0iCisJCXRlc3QgeCIkcCIgPT0geCIiICYmIHA9MAorCQl0ZXN0IHgiJHAiID09IHgiJHByaW8iIHx8IGNvbnRpbnVlCisJCWVjaG8gIm5hbWVzZXJ2ZXIgJGQiCisJZG9uZQorbGV0IGkrKzsgZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5NmI2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ydW4KQEAgLTAsMCArMSwyMTEgQEAKKyMhL2Jpbi9iYXNoCisjICh1c2luZyBiYXNoaXNtOiBhcnJheXMpCisKK3NlcnZpY2U9IiR7UFdEIyMqL30iCitydW5kaXI9Ii92YXIvcnVuL3NlcnZpY2UvJHNlcnZpY2UiCisKK3VzZXI9cm9vdAorZXh0aWY9aWYKK2V4dF9vcGVuX3RjcD0iMjEgMjIgODAiICMgc3BhY2Utc2VwYXJhdGVkCisKKyMgTWFrZSBvdXJzZWxmIG9uZS1zaG90CitzdiBvIC4KKyMgRGVidWcKKyNkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnID4+IiQwLmxvZyIKKworIyMjIGZpbHRlciBUaGlzIGlzIHRoZSBkZWZhdWx0IHRhYmxlIChpZiBubyAtdCBvcHRpb24gaXMgcGFzc2VkKS4gIEl0IGNvbnRhaW5zCisjIyMgICAgICAgIHRoZSAgYnVpbHQtaW4gY2hhaW5zIElOUFVUIChmb3IgcGFja2V0cyBjb21pbmcgaW50byB0aGUgYm94IGl0c2VsZiksCisjIyMgICAgICAgIEZPUldBUkQgKGZvciBwYWNrZXRzIGJlaW5nIHJvdXRlZCB0aHJvdWdoIHRoZSBib3gpLCBhbmQgT1VUUFVUIChmb3IKKyMjIyAgICAgICAgbG9jYWxseS1nZW5lcmF0ZWQgcGFja2V0cykuCisjIyMKKyMjIyBuYXQgICAgVGhpcyB0YWJsZSBpcyBjb25zdWx0ZWQgd2hlbiBhIHBhY2tldCB0aGF0IGNyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbgorIyMjICAgICAgICBpcyBlbmNvdW50ZXJlZC4gIEl0IGNvbnNpc3RzIG9mIHRocmVlIGJ1aWx0LWluczogUFJFUk9VVElORyAoZm9yCisjIyMgICAgICAgIGFsdGVyaW5nIHBhY2tldHMgYXMgc29vbiBhcyB0aGV5IGNvbWUgaW4pLCBPVVRQVVQgKGZvciBhbHRlcmluZworIyMjICAgICAgICBsb2NhbGx5LWdlbmVyYXRlZCBwYWNrZXRzIGJlZm9yZSByb3V0aW5nKSwgYW5kIFBPU1RST1VUSU5HIChmb3IKKyMjIyAgICAgICAgYWx0ZXJpbmcgcGFja2V0cyBhcyB0aGV5IGFyZSBhYm91dCB0byBnbyBvdXQpLgorIyMjCisjIyMgbWFuZ2xlIEl0IGhhZCB0d28gYnVpbHQtaW4gY2hhaW5zOiBQUkVST1VUSU5HIChmb3IgYWx0ZXJpbmcgaW5jb21pbmcKKyMjIyAgICAgICAgcGFja2V0cyBiZWZvcmUgcm91dGluZykgYW5kIE9VVFBVVCAoZm9yIGFsdGVyaW5nIGxvY2FsbHktZ2VuZXJhdGVkCisjIyMgICAgICAgIHBhY2tldHMgYmVmb3JlIHJvdXRpbmcpLiAgUmVjZW50bHkgdGhyZWUgb3RoZXIgYnVpbHQtaW4KKyMjIyAgICAgICAgY2hhaW5zIGFyZSBhZGRlZDogSU5QVVQgKGZvciBwYWNrZXRzIGNvbWluZyBpbnRvIHRoZSBib3gKKyMjIyAgICAgICAgaXRzZWxmKSwgRk9SV0FSRCAoZm9yIGFsdGVyaW5nIHBhY2tldHMgYmVpbmcgcm91dGVkIHRocm91Z2ggdGhlCisjIyMgICAgICAgIGJveCksIGFuZCBQT1NUUk9VVElORyAoZm9yIGFsdGVyaW5nIHBhY2tldHMgYXMgdGhleSBhcmUgYWJvdXQgdG8gZ28KKyMjIyAgICAgICAgb3V0KS4KKyMjIworIyMjICAgICAgIC4uLmlmYWNlLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaWZhY2UuLi4KKyMjIyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyMjIyAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyMjIyAtbWFuZ2xlLE5BVC0gICAgICAgICAgICAgICAtbWFuZ2xlLGZpbHRlci0gICAtbWFuZ2xlLE5BVC0tCisjIyMgfFBSRVJPVVRJTkd8LS0+W1JvdXRpbmddLS0+fEZPUldBUkQgICAgICB8LS0+fFBPU1RST1VUSU5HfAorIyMjIC0tLS0tLS0tLS0tLSAgICB8ICAgIF4gICAgIC0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0KKyMjIyAgICAgICAgICAgICAgICAgfCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorIyMjICAgICAgICAgICAgICAgICB8ICAgICstLWlmIE5BVGVkLS0tLS0tLS0tLS0tKyAgICB8CisjIyMgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyMjIyAgICAgIC1tYW5nbGUsZmlsdGVyLSAgICAgICAgICAgICAgICAtbWFuZ2xlLE5BVCxmaWx0ZXItCisjIyMgICAgICB8SU5QVVQgICAgICAgIHwgICstPltSb3V0aW5nXS0+fE9VVFBVVCAgICAgICAgICAgfAorIyMjICAgICAgLS0tLS0tLS0tLS0tLS0tICB8ICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIyAgICAgICAgICAgICAgICAgfCAgICAgfAorIyMjICAgICAgICAgICAgICAgICB2ICAgICB8CisjIyMgICAgICAgICAuLi4gTG9jYWwgUHJvY2Vzcy4uLgorCitkb2l0KCkgeworCWVjaG8gIiMgJCoiCisJIiRAIgorfQorCisjZXhlYyA+L2Rldi9udWxsCitleGVjID4iJDAub3V0IgorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordW1hc2sgMDc3CisKKyMgTWFrZSBzdXJlIHJ1bmRpci8gZXhpc3RzCitta2RpciAtcCAiJHJ1bmRpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlcjoiICIkcnVuZGlyIgorY2htb2QgLVIgYT1yWCAiJHJ1bmRpciIKK3JtIC1yZiBydW5kaXIgMj4vZGV2L251bGwKK2xuIC1zICIkcnVuZGlyIiBydW5kaXIKKworIyBUaW1lc3RhbXBpbmcKK2RhdGUgJyslWS0lbS0lZCAlSDolTTolUycKKworCitlY2hvOyBlY2hvICIqIFJlYWRpbmcgSVAgY29uZmlnIgorY2ZnPS0xCisjICAgICAgICAgICAgIHN0YXRpYyBjZmcgICAgZGhjcCx6ZXJvY29uZiBldGMKK2ZvciBpcGNvbmYgaW4gY29uZi8qLmlwY29uZiAiJHJ1bmRpciIvKi5pcGNvbmY7IGRvCisJaWYgdGVzdCAtZiAiJGlwY29uZiI7IHRoZW4KKwkJZWNobyAiKyAkaXBjb25mIgorCQkuICIkaXBjb25mIgorCWZpCitkb25lCisKK2VjaG87IGVjaG8gIiogQ29uZmlndXJpbmcgaGFyZHdhcmUiCisjZG9pdCBldGh0b29sIC1zIGlmIGF1dG9uZWcgb2ZmIHNwZWVkIDEwMCBkdXBsZXggZnVsbAorI2RvaXQgZXRodG9vbCAtSyBpZiByeCBvZmYgdHggb2ZmIHNnIG9mZiB0c28gb2ZmCisKK2VjaG87IGVjaG8gIiogUmVzZXR0aW5nIGFkZHJlc3MgYW5kIHJvdXRpbmcgaW5mbyIKK2RvaXQgaXAgYSBmIGRldiBsbworaT0wOyB3aGlsZSB0ZXN0ICIke2lmWyRpXX0iOyBkbworCWRvaXQgaXAgYSBmIGRldiAiJHtpZlskaV19IgorCWRvaXQgaXAgciBmIGRldiAiJHtpZlskaV19IiByb290IDAvMAorbGV0IGkrKzsgZG9uZQorCitlY2hvOyBlY2hvICIqIENvbmZpZ3VyaW5nIGFkZHJlc3NlcyIKK2RvaXQgaXAgYSBhIGRldiBsbyAxMjcuMC4wLjEvOCBzY29wZSBob3N0Citkb2l0IGlwIGEgYSBkZXYgbG8gOjoxLzEyOCBzY29wZSBob3N0CitpPTA7IHdoaWxlIHRlc3QgIiR7aWZbJGldfSI7IGRvCisJaWYgdGVzdCAiJHtpcG1hc2tbJGldfSI7IHRoZW4KKwkJZG9pdCBpcCBhIGEgZGV2ICIke2lmWyRpXX0iICIke2lwbWFza1skaV19IiBicmQgKworCQlkb2l0IGlwIGwgc2V0IGRldiAiJHtpZlskaV19IiB1cAorCWZpCitsZXQgaSsrOyBkb25lCisKK2VjaG87IGVjaG8gIiogQ29uZmlndXJpbmcgcm91dGVzIgoraT0wOyB3aGlsZSB0ZXN0ICIke2lmWyRpXX0iOyBkbworCWlmIHRlc3QgIiR7bmV0WyRpXX0iICYmIHRlc3QgIiR7Z3dbJGldfSI7IHRoZW4KKwkJZG9pdCBpcCByIGEgIiR7bmV0WyRpXX0iIHZpYSAiJHtnd1skaV19IgorCWZpCitsZXQgaSsrOyBkb25lCisKK2VjaG87IGVjaG8gIiogUmVjcmVhdGluZyAvZXRjLyogZmlsZXMgcmVmbGVjdGluZyBuZXcgbmV0d29yayBjb25maWd1cmF0aW9uOiIKK2ZvciBpIGluIGV0Yy8qOyBkbworCW49YGJhc2VuYW1lICIkaSJgCisJZWNobyAiKyAkbiIKKwkoLiAiJGkiKSA+Ii9ldGMvJG4iCisJY2htb2QgNjQ0ICIvZXRjLyRuIgorZG9uZQorCisKKyMgVXNhZ2U6IG5ld19jaGFpbiA8Y2hhaW4+IFs8dGFibGU+XQorbmV3X2NoYWluKCkgeworCWxvY2FsIHQ9IiIKKwl0ZXN0IHgiJDIiICE9IHgiIiAmJiB0PSItdCAkMiIKKwlkb2l0IGlwdGFibGVzICR0IC1OICQxCisJaXB0PSJpcHRhYmxlcyAkdCAtQSAkMSIKK30KKworZWNobzsgZWNobyAiKiBSZXNldCBpcHRhYmxlcyIKK2RvaXQgaXB0YWJsZXMgICAgICAgICAgIC0tZmx1c2gKK2RvaXQgaXB0YWJsZXMgICAgICAgICAgIC0tZGVsZXRlLWNoYWluCitkb2l0IGlwdGFibGVzICAgICAgICAgICAtLXplcm8KK2RvaXQgaXB0YWJsZXMgLXQgbmF0ICAgIC0tZmx1c2gKK2RvaXQgaXB0YWJsZXMgLXQgbmF0ICAgIC0tZGVsZXRlLWNoYWluCitkb2l0IGlwdGFibGVzIC10IG5hdCAgICAtLXplcm8KK2RvaXQgaXB0YWJsZXMgLXQgbWFuZ2xlIC0tZmx1c2gKK2RvaXQgaXB0YWJsZXMgLXQgbWFuZ2xlIC0tZGVsZXRlLWNoYWluCitkb2l0IGlwdGFibGVzIC10IG1hbmdsZSAtLXplcm8KKworZWNobzsgZWNobyAiKiBDb25maWd1cmUgaXB0YWJsZXMiCitkb2l0IG1vZHByb2JlIG5mX25hdF9mdHAKK2RvaXQgbW9kcHJvYmUgbmZfbmF0X3RmdHAKK2RvaXQgbW9kcHJvYmUgbmZfY29ubnRyYWNrX2Z0cAorZG9pdCBtb2Rwcm9iZSBuZl9jb25udHJhY2tfdGZ0cAorCisjICAgICAgICoqKiBuYXQgKioqCisjICAgICAgIElOQ09NSU5HIFRSQUZGSUMKK2lwdD0iaXB0YWJsZXMgLXQgbmF0IC1BIFBSRVJPVVRJTkciCisjIG5vdGhpbmcgaGVyZQorCisjICAgICAgIExPQ0FMTFkgT1JJR0lOQVRFRCBUUkFGRklDCitpcHQ9ImlwdGFibGVzIC10IG5hdCAtQSBPVVRQVVQiCisjIG5vdGhpbmcgaGVyZQorCisjICAgICAgIE9VVEdPSU5HIFRSQUZGSUMKK2lwdD0iaXB0YWJsZXMgLXQgbmF0IC1BIFBPU1RST1VUSU5HIgorIyBNYXNxdWVyYWRlIGJveGVzIG9uIG15IHByaXZhdGUgbmV0Citkb2l0ICRpcHQgLXMgMTkyLjE2OC4wLjAvMjQgLW8gJGV4dGlmIC1qIE1BU1FVRVJBREUKKworIyAgICAgICAqKiogbWFuZ2xlICoqKgorIyMjIERFQlVHCisjIyMgaXB0PSJpcHRhYmxlcyAtdCBtYW5nbGUgLUEgUFJFUk9VVElORyIKKyMjIyBkb2l0ICRpcHQgLXMgMTkyLjE2OC4wLjAvMjQgLWogUkVUVVJOCisjIyMgaXB0PSJpcHRhYmxlcyAtdCBtYW5nbGUgLUEgRk9SV0FSRCIKKyMjIyBkb2l0ICRpcHQgLXMgMTkyLjE2OC4wLjAvMjQgLWogUkVUVVJOCisjIyMgaXB0PSJpcHRhYmxlcyAtdCBtYW5nbGUgLUEgUE9TVFJPVVRJTkciCisjIyMgZG9pdCAkaXB0IC1zIDE5Mi4xNjguMC4wLzI0IC1qIFJFVFVSTgorIyBub3RoaW5nIGhlcmUKKworIyAgICAgICAqKiogZmlsdGVyICoqKgorIworbmV3X2NoYWluIGlleHQgZmlsdGVyCisjZG9pdCAkaXB0IC1zIDIwMy4xNzcuMTA0LjcyIC1qIERST1AJIyBTb21lIGlkaW90IHByb2JlcyBteSBzc2gKKyNkb2l0ICRpcHQgLWQgMjAzLjE3Ny4xMDQuNzIgLWogRFJPUAkjIFNvbWUgaWRpb3QgcHJvYmVzIG15IHNzaAorZG9pdCAkaXB0IC1tIHN0YXRlIC0tc3RhdGUgRVNUQUJMSVNIRUQsUkVMQVRFRCAtaiBSRVRVUk4gICMgRlRQIGRhdGEgZXRjIGlzIG9rCitpZiB0ZXN0ICIkZXh0X29wZW5fdGNwIjsgdGhlbgorCXBvcnRsaXN0PSIke2V4dF9vcGVuX3RjcC8vIC8sfSIKKwlkb2l0ICRpcHQgLXAgdGNwIC1tIG11bHRpcG9ydCAtLWRwb3J0cyAkcG9ydGxpc3QgLWogUkVUVVJOCitmaQorZG9pdCAkaXB0IC1wIHRjcCAtaiBSRUpFQ1QJIyBBbnl0aGluZyBlbHNlIGlzbid0IG9rLiBSRUpFQ1QgPSBpcmMgb3BlbnMgZmFzdGVyCisJCQkJIyAoaXQgcHJvYmVzIHByb3h5IHBvcnRzLCBEUk9QIHdpbGwgaW5jdXIgdGltZW91dCBkZWxheXMpCitpcHQ9ImlwdGFibGVzIC10IGZpbHRlciAtQSBJTlBVVCIKK2RvaXQgJGlwdCAtaSAkZXh0aWYgLWogaWV4dAorCisKK2VjaG87IGVjaG8gIiogRW5hYmxpbmcgZm9yd2FyZGluZyIKK2VjaG8gMSA+L3Byb2Mvc3lzL25ldC9pcHY0L2lwX2ZvcndhcmQKK2VjaG8gIi9wcm9jL3N5cy9uZXQvaXB2NC9pcF9mb3J3YXJkOiBgY2F0IC9wcm9jL3N5cy9uZXQvaXB2NC9pcF9mb3J3YXJkYCIKKworCisjIFNpZ25hbCBldmVyeWJvZHkgdGhhdCBmaXJld2FsbCBpcyB1cAorZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJyA+IiRydW5kaXIvdXAiCisKKyMgT2ssIHNwZXcgb3V0IGdvYnMgb2YgaW5mbyBhbmQgZGlzYWJsZSBvdXJzZWxmCitlY2hvOyBlY2hvICIqIElQOiIKK2lwIGEgbAorZWNobzsgZWNobyAiKiBSb3V0aW5nOiIKK2lwIHIgbAorZWNobzsgZWNobyAiKiBGaXJld2FsbDoiCit7CitlY2hvICctLS1GSUxURVItLSc7CitpcHRhYmxlcyAtdiAtTCAteCAtbjsKK2VjaG8gJy0tLU5BVC0tLS0tJzsKK2lwdGFibGVzIC10IG5hdCAtdiAtTCAteCAtbjsKK2VjaG8gJy0tLU1BTkdMRS0tJzsKK2lwdGFibGVzIC10IG1hbmdsZSAtdiAtTCAteCAtbjsKK30gXAorfCBncmVwIC12ICdeJCcgfCBncmVwIC1GdiAnYnl0ZXMgdGFyZ2V0JworZWNobworCitlY2hvICIqIEVuZCBvZiBmaXJld2FsbCBjb25maWd1cmF0aW9uIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvc3RhdCBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L3N0YXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDg3MzZhZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L3N0YXQKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL3NoCisKK2VjaG87IGVjaG8gIiogRmlyZXdhbGw6IgoreworZWNobyAnLS0tRklMVEVSLS0nOworaXB0YWJsZXMgLXYgLUwgLXggLW47CitlY2hvICctLS1OQVQtLS0tLSc7CitpcHRhYmxlcyAtdCBuYXQgLXYgLUwgLXggLW47CitlY2hvICctLS1NQU5HTEUtLSc7CitpcHRhYmxlcyAtdCBtYW5nbGUgLXYgLUwgLXggLW47Cit9IFwKK3wgZ3JlcCAtdiAnXiQnIHwgZ3JlcCAtRnYgJ2J5dGVzIHRhcmdldCcgfCAkUEFHRVIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvYWx0MDh4MTYrdW5pbWFwLmZudCBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvYWx0MDh4MTYrdW5pbWFwLmZudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmNjNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9hbHQwOHgxNit1bmltYXAuZm50CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvY2ZnIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9jZmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGY2M2U1MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvY2ZnCkBAIC0wLDAgKzEsMjYgQEAKKyMhL2Jpbi9zaAorCitpZiB0ZXN0IHgiJFRFUk0iID0geCIiIC1vIHgiJFRFUk0iID0geCJ1bmtub3duIjsgdGhlbgorCVRFUk09ImxpbnV4IgorCWVjaG8gIiogU2V0dGluZyBURVJNPSckVEVSTSciCitmaQorZXhwb3J0IFRFUk0KKwordHR5bmFtZT1gdHR5YAordHR5YmFzZT0iJHt0dHluYW1lJSVbMDEyMzQ1Njc4OV0qfSIgICAgICMgc3RyaXAgbnVtZXJpYyB0YWlsCisKK2lmIHRlc3QgeCIkdHR5YmFzZSIgPSB4Ii9kZXYvdmMvIiAtbyB4IiR0dHliYXNlIiA9IHgiL2Rldi90dHkiOyB0aGVuCisJZWNobyAiKiBBY3RpdmF0aW5nIEN5cmlsbGljIEtPSTgtUiAtPiBDUDg2NiBmb250IG1hcCIKKwllY2hvIC1uZSAiXDAzMyhLIiA+IiR0dHluYW1lIgorCisJZWNobyAiKiBMb2FkaW5nIHNjcmVlbiBmb250IgorCXNldGZvbnQgXAorCQktQyAiJHR0eW5hbWUiIFwKKwkJLW0gIiRQV0Qva29pOHJfdG9fdW5pLnRyYW5zIiBcCisJCSIkUFdEL2FsdDA4eDE2K3VuaW1hcC5mbnQiIFwKKwl8fCBlY2hvICIhIHNldGZvbnQgZmFpbHVyZSIKKworCWVjaG8gIiogTG9hZGluZyBrZXltYXAiCisJbG9hZGtleXMgIiRQV0QvcnVfa29pOHIua2V5bWFwIiBcCisJfHwgZWNobyAiISBsb2Fka2V5cyBmYWlsdXJlIgorZmkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEva29pOHJfdG9fdW5pLnRyYW5zIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9rb2k4cl90b191bmkudHJhbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2YmQwMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEva29pOHJfdG9fdW5pLnRyYW5zCkBAIC0wLDAgKzEsMjU2IEBACisweDAwIFUrMDAwMCAgIyAgTlVMTCAoTlVMKQorMHgwMSBVKzAwMDEgICMgIFNUQVJUIE9GIEhFQURJTkcgKFNPSCkKKzB4MDIgVSswMDAyICAjICBTVEFSVCBPRiBURVhUIChTVFgpCisweDAzIFUrMDAwMyAgIyAgRU5EIE9GIFRFWFQgKEVUWCkKKzB4MDQgVSswMDA0ICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIChFT1QpCisweDA1IFUrMDAwNSAgIyAgRU5RVUlSWSAoRU5RKQorMHgwNiBVKzAwMDYgICMgIEFDS05PV0xFREdFIChBQ0spCisweDA3IFUrMDAwNyAgIyAgQkVMTCAoQkVMKQorMHgwOCBVKzAwMDggICMgIEJBQ0tTUEFDRSAoQlMpCisweDA5IFUrMDAwOSAgIyAgQ0hBUkFDVEVSIFRBQlVMQVRJT04gKEhUKQorMHgwYSBVKzAwMEEgICMgIExJTkUgRkVFRCAoTEYpCisweDBiIFUrMDAwQiAgIyAgTElORSBUQUJVTEFUSU9OIChWVCkKKzB4MGMgVSswMDBDICAjICBGT1JNIEZFRUQgKEZGKQorMHgwZCBVKzAwMEQgICMgIENBUlJJQUdFIFJFVFVSTiAoQ1IpCisweDBlIFUrMDAwRSAgIyAgU0hJRlQgT1VUIChTTykKKzB4MGYgVSswMDBGICAjICBTSElGVCBJTiAoU0kpCisweDEwIFUrMDAxMCAgIyAgREFUQUxJTksgRVNDQVBFIChETEUpCisweDExIFUrMDAxMSAgIyAgREVWSUNFIENPTlRST0wgT05FIChEQzEpCisweDEyIFUrMDAxMiAgIyAgREVWSUNFIENPTlRST0wgVFdPIChEQzIpCisweDEzIFUrMDAxMyAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUgKERDMykKKzB4MTQgVSswMDE0ICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSIChEQzQpCisweDE1IFUrMDAxNSAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UgKE5BSykKKzB4MTYgVSswMDE2ICAjICBTWU5DSFJPTk9VUyBJRExFIChTWU4pCisweDE3IFUrMDAxNyAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSyAoRVRCKQorMHgxOCBVKzAwMTggICMgIENBTkNFTCAoQ0FOKQorMHgxOSBVKzAwMTkgICMgIEVORCBPRiBNRURJVU0gKEVNKQorMHgxYSBVKzAwMUEgICMgIFNVQlNUSVRVVEUgKFNVQikKKzB4MWIgVSswMDFCICAjICBFU0NBUEUgKEVTQykKKzB4MWMgVSswMDFDICAjICBGSUxFIFNFUEFSQVRPUiAoSVM0KQorMHgxZCBVKzAwMUQgICMgIEdST1VQIFNFUEFSQVRPUiAoSVMzKQorMHgxZSBVKzAwMUUgICMgIFJFQ09SRCBTRVBBUkFUT1IgKElTMikKKzB4MWYgVSswMDFGICAjICBVTklUIFNFUEFSQVRPUiAoSVMxKQorMHgyMCBVKzAwMjAgICMgIFNQQUNFCisweDIxIFUrMDAyMSAgIyAgRVhDTEFNQVRJT04gTUFSSworMHgyMiBVKzAwMjIgICMgIFFVT1RBVElPTiBNQVJLCisweDIzIFUrMDAyMyAgIyAgTlVNQkVSIFNJR04KKzB4MjQgVSswMDI0ICAjICBET0xMQVIgU0lHTgorMHgyNSBVKzAwMjUgICMgIFBFUkNFTlQgU0lHTgorMHgyNiBVKzAwMjYgICMgIEFNUEVSU0FORAorMHgyNyBVKzAwMjcgICMgIEFQT1NUUk9QSEUKKzB4MjggVSswMDI4ICAjICBMRUZUIFBBUkVOVEhFU0lTCisweDI5IFUrMDAyOSAgIyAgUklHSFQgUEFSRU5USEVTSVMKKzB4MmEgVSswMDJBICAjICBBU1RFUklTSworMHgyYiBVKzAwMkIgICMgIFBMVVMgU0lHTgorMHgyYyBVKzAwMkMgICMgIENPTU1BCisweDJkIFUrMDAyRCAgIyAgSFlQSEVOLU1JTlVTCisweDJlIFUrMDAyRSAgIyAgRlVMTCBTVE9QCisweDJmIFUrMDAyRiAgIyAgU09MSURVUworMHgzMCBVKzAwMzAgICMgIERJR0lUIFpFUk8KKzB4MzEgVSswMDMxICAjICBESUdJVCBPTkUKKzB4MzIgVSswMDMyICAjICBESUdJVCBUV08KKzB4MzMgVSswMDMzICAjICBESUdJVCBUSFJFRQorMHgzNCBVKzAwMzQgICMgIERJR0lUIEZPVVIKKzB4MzUgVSswMDM1ICAjICBESUdJVCBGSVZFCisweDM2IFUrMDAzNiAgIyAgRElHSVQgU0lYCisweDM3IFUrMDAzNyAgIyAgRElHSVQgU0VWRU4KKzB4MzggVSswMDM4ICAjICBESUdJVCBFSUdIVAorMHgzOSBVKzAwMzkgICMgIERJR0lUIE5JTkUKKzB4M2EgVSswMDNBICAjICBDT0xPTgorMHgzYiBVKzAwM0IgICMgIFNFTUlDT0xPTgorMHgzYyBVKzAwM0MgICMgIExFU1MtVEhBTiBTSUdOCisweDNkIFUrMDAzRCAgIyAgRVFVQUxTIFNJR04KKzB4M2UgVSswMDNFICAjICBHUkVBVEVSLVRIQU4gU0lHTgorMHgzZiBVKzAwM0YgICMgIFFVRVNUSU9OIE1BUksKKzB4NDAgVSswMDQwICAjICBDT01NRVJDSUFMIEFUCisweDQxIFUrMDA0MSAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MiBVKzAwNDIgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMgVSswMDQzICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0IFUrMDA0NCAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NSBVKzAwNDUgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYgVSswMDQ2ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3IFUrMDA0NyAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OCBVKzAwNDggICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkgVSswMDQ5ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRhIFUrMDA0QSAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0YiBVKzAwNEIgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NGMgVSswMDRDICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRkIFUrMDA0RCAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0ZSBVKzAwNEUgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NGYgVSswMDRGICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwIFUrMDA1MCAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MSBVKzAwNTEgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIgVSswMDUyICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzIFUrMDA1MyAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NCBVKzAwNTQgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUgVSswMDU1ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2IFUrMDA1NiAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NyBVKzAwNTcgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTggVSswMDU4ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5IFUrMDA1OSAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1YSBVKzAwNUEgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NWIgVSswMDVCICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVjIFUrMDA1QyAgIyAgUkVWRVJTRSBTT0xJRFVTCisweDVkIFUrMDA1RCAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NWUgVSswMDVFICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorMHg1ZiBVKzAwNUYgICMgIExPVyBMSU5FCisweDYwIFUrMDA2MCAgIyAgR1JBVkUgQUNDRU5UCisweDYxIFUrMDA2MSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIgVSswMDYyICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MyBVKzAwNjMgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisweDY0IFUrMDA2NCAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUgVSswMDY1ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NiBVKzAwNjYgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisweDY3IFUrMDA2NyAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjggVSswMDY4ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OSBVKzAwNjkgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisweDZhIFUrMDA2QSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NmIgVSswMDZCICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2YyBVKzAwNkMgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisweDZkIFUrMDA2RCAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NmUgVSswMDZFICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2ZiBVKzAwNkYgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisweDcwIFUrMDA3MCAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEgVSswMDcxICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MiBVKzAwNzIgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisweDczIFUrMDA3MyAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQgVSswMDc0ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NSBVKzAwNzUgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisweDc2IFUrMDA3NiAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcgVSswMDc3ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OCBVKzAwNzggICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisweDc5IFUrMDA3OSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N2EgVSswMDdBICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3YiBVKzAwN0IgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3YyBVKzAwN0MgICMgIFZFUlRJQ0FMIExJTkUKKzB4N2QgVSswMDdEICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdlIFUrMDA3RSAgIyAgVElMREUKKzB4N2YgVSswMDdGICAjICBERUxFVEUgKERFTCkKKzB4ODAgVSsyNTAwICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHg4MSBVKzI1MDIgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHg4MiBVKzI1MEMgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorMHg4MyBVKzI1MTAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisweDg0IFUrMjUxNCAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorMHg4NSBVKzI1MTggICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorMHg4NiBVKzI1MUMgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4ODcgVSsyNTI0ICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKzB4ODggVSsyNTJDICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHg4OSBVKzI1MzQgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorMHg4YSBVKzI1M0MgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHg4YiBVKzI1ODAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKzB4OGMgVSsyNTg0ICAjICBMT1dFUiBIQUxGIEJMT0NLCisweDhkIFUrMjU4OCAgIyAgRlVMTCBCTE9DSworMHg4ZSBVKzI1OEMgICMgIExFRlQgSEFMRiBCTE9DSworMHg4ZiBVKzI1OTAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKzB4OTAgVSsyNTkxICAjICBMSUdIVCBTSEFERQorMHg5MSBVKzI1OTIgICMgIE1FRElVTSBTSEFERQorMHg5MiBVKzI1OTMgICMgIERBUksgU0hBREUKKzB4OTMgVSsyMzIwICAjICBUT1AgSEFMRiBJTlRFR1JBTAorMHg5NCBVKzI1QTAgICMgIEJMQUNLIFNRVUFSRQorMHg5NSBVKzIyMTkgICMgIEJVTExFVCBPUEVSQVRPUgorMHg5NiBVKzIyMUEgICMgIFNRVUFSRSBST09UCisweDk3IFUrMjI0OCAgIyAgQUxNT1NUIEVRVUFMIFRPCisweDk4IFUrMjI2NCAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisweDk5IFUrMjI2NSAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisweDlhIFUrMDBBMCAgIyAgTk8tQlJFQUsgU1BBQ0UKKzB4OWIgVSsyMzIxICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorMHg5YyBVKzAwQjAgICMgIERFR1JFRSBTSUdOCisweDlkIFUrMDBCMiAgIyAgU1VQRVJTQ1JJUFQgVFdPCisweDllIFUrMDBCNyAgIyAgTUlERExFIERPVAorMHg5ZiBVKzAwRjcgICMgIERJVklTSU9OIFNJR04KKzB4YTAgVSsyNTUwICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKzB4YTEgVSsyNTUxICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisweGEyIFUrMjU1MiAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4YTMgVSswNDUxICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSU8KKzB4YTQgVSsyNTUzICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhhNSBVKzI1NTQgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKzB4YTYgVSsyNTU1ICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGE3IFUrMjU1NiAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorMHhhOCBVKzI1NTcgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorMHhhOSBVKzI1NTggICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhhYSBVKzI1NTkgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhhYiBVKzI1NUEgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGFjIFUrMjU1QiAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YWQgVSsyNTVDICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorMHhhZSBVKzI1NUQgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKzB4YWYgVSsyNTVFICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4YjAgVSsyNTVGICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4YjEgVSsyNTYwICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhiMiBVKzI1NjEgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGIzIFUrMDQwMSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKzB4YjQgVSsyNTYyICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorMHhiNSBVKzI1NjMgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKzB4YjYgVSsyNTY0ICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisweGI3IFUrMjU2NSAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorMHhiOCBVKzI1NjYgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhiOSBVKzI1NjcgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisweGJhIFUrMjU2OCAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4YmIgVSsyNTY5ICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisweGJjIFUrMjU2QSAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKzB4YmQgVSsyNTZCICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorMHhiZSBVKzI1NkMgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4YmYgVSswMEE5ICAjICBDT1BZUklHSFQgU0lHTgorMHhjMCBVKzA0NEUgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorMHhjMSBVKzA0MzAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBBCisweGMyIFUrMDQzMSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisweGMzIFUrMDQ0NiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorMHhjNCBVKzA0MzQgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBERQorMHhjNSBVKzA0MzUgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorMHhjNiBVKzA0NDQgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorMHhjNyBVKzA0MzMgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKzB4YzggVSswNDQ1ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKzB4YzkgVSswNDM4ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorMHhjYSBVKzA0MzkgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisweGNiIFUrMDQzQSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisweGNjIFUrMDQzQiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisweGNkIFUrMDQzQyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisweGNlIFUrMDQzRCAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisweGNmIFUrMDQzRSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKzB4ZDAgVSswNDNGICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgUEUKKzB4ZDEgVSswNDRGICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKzB4ZDIgVSswNDQwICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKzB4ZDMgVSswNDQxICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKzB4ZDQgVSswNDQyICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUKKzB4ZDUgVSswNDQzICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorMHhkNiBVKzA0MzYgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUKKzB4ZDcgVSswNDMyICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKzB4ZDggVSswNDRDICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisweGQ5IFUrMDQ0QiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKzB4ZGEgVSswNDM3ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKzB4ZGIgVSswNDQ4ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisweGRjIFUrMDQ0RCAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEUKKzB4ZGQgVSswNDQ5ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKzB4ZGUgVSswNDQ3ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisweGRmIFUrMDQ0QSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorMHhlMCBVKzA0MkUgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisweGUxIFUrMDQxMCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorMHhlMiBVKzA0MTEgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisweGUzIFUrMDQyNiAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFCisweGU0IFUrMDQxNCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKzB4ZTUgVSswNDE1ICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorMHhlNiBVKzA0MjQgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisweGU3IFUrMDQxMyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisweGU4IFUrMDQyNSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKzB4ZTkgVSswNDE4ICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisweGVhIFUrMDQxOSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorMHhlYiBVKzA0MUEgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisweGVjIFUrMDQxQiAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKzB4ZWQgVSswNDFDICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorMHhlZSBVKzA0MUQgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisweGVmIFUrMDQxRSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworMHhmMCBVKzA0MUYgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisweGYxIFUrMDQyRiAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUEKKzB4ZjIgVSswNDIwICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorMHhmMyBVKzA0MjEgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisweGY0IFUrMDQyMiAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKzB4ZjUgVSswNDIzICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisweGY2IFUrMDQxNiAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisweGY3IFUrMDQxMiAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKzB4ZjggVSswNDJDICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKzB4ZjkgVSswNDJCICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisweGZhIFUrMDQxNyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKzB4ZmIgVSswNDI4ICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKzB4ZmMgVSswNDJEICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisweGZkIFUrMDQyOSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEEKKzB4ZmUgVSswNDI3ICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKzB4ZmYgVSswNDJBICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvbG9naW4uc2ggYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2xvZ2luLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2OWI2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2xvZ2luLnNoCkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9zaAorCit0dHluYW1lPWB0dHlgCit0dHliYXNlPSIke3R0eW5hbWUlJVswMTIzNDU2Nzg5XSp9IiAgICAgIyBzdHJpcCBudW1lcmljIHRhaWwKKworaWYgdGVzdCAiJHR0eWJhc2UiID0gIi9kZXYvdHR5IjsgdGhlbgorCXRhaWw9IiR7dHR5bmFtZTo4fSIKKwllY2hvICIqIFNldHRpbmcgdGVybWluYWwgZGV2aWNlJ3Mgb3duZXIgdG8gJExPR0lOX1VJRDokTE9HSU5fR0lEIgorCWNob3duICIkTE9HSU5fVUlEOiRMT0dJTl9HSUQiICIvZGV2L3ZjcyR0YWlsIiAiL2Rldi92Y3NhJHRhaWwiCitmaQorIyBXZSBjYW4gZG8gdGhpcyBhbHNvLCBidXQgbG9naW4gZG9lcyBpdCBpdHNlbGYKKyMgY2hvd24gIiRMT0dJTl9VSUQ6JExPR0lOX0dJRCIgIiR0dHluYW1lIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9ydV9rb2k4ci5rZXltYXAgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL3J1X2tvaThyLmtleW1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgxMTUzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9ydV9rb2k4ci5rZXltYXAKQEAgLTAsMCArMSwxODMgQEAKK2tleW1hcHMgMCwxLCAyLDMsIDQsNiwgOCwxMCwgMTIsMTQKKyMKKyMgVGhpcyBvbmUgaXMgZm9yIGdlbmVyYXRpbmcga29pOHIgUnVzc2lhbiBjaGFycworIyBDeXIvTGF0IHN3aXRjaGVzOiAgUmlnaHRBbHQsIFNoaWZ0K0N0cmwsIEN0cmwrU2hpZnQKKyMgKGxhc3Qgb25lIGRvZXMgbm90IHdvcmsgZm9yIGRhcmsgYW5kIG9ic2N1cmUgcmVhc29ucyA4KCApCisjCisjIHBsYWluLHNoaWZ0LCBwbGFpbixzaGlmdCwgY3RybCxjdHJsIGFsdCxhbHQgY3RybGFsdCxjdHJsYWx0CisjIGxhdC0tLS0tLS0tICBjeXItLS0tLS0tLSAgbGF0ICBjeXIgIGxhdCBjeXIgbGF0ICAgICBjeXIKKyMKKyNTaGlmdCAgICAgICAgICAgICAgICAgICAgIDEKKyNBbHRHciAoY3lyKSAgICAgICAgICAgICAgIDIKKyNDb250cm9sICAgICAgICAgICAgICAgICAgIDQKKyNBbHQgICAgICAgICAgICAgICAgICAgICAgIDgKKyNTaGlmdEwgICAgICAgICAgICAgICAgICAgMTYKKyNTaGlmdFIgICAgICAgICAgICAgICAgICAgMzIKKyNDdHJsTCAgICAgICAgICAgICAgICAgICAgNjQKKyNDdHJsUiAgICAgICAgICAgICAgICAgICAxMjgKKyM9PT09PT09PT09PT09PSBwbGFpbiA9PT09PT09PT0gc2hpZnQ9PT09PT09PT09IHBsYWluIGN5ciA9PT09PSBzaGlmdCBjeXIgPT09PT0gY3RybCA9PT09PT09PT09PT09PT09PT0gY3RybCBjeXIgPT09PT09PT09PT09PT0gYWx0ID09PT09PT09PT09PT09PT09PT0gYWx0IGN5ciA9PT09PT09PT09PT09PT0gY3RybGFsdCA9PT09PT09PT09PT09PT0gY3RybGFsdCBjeXIgPT09PT09PT09PT0KK2tleWNvZGUgICAxID0gICBFc2NhcGUgICAgICAgICAgRXNjYXBlICAgICAgICAgIEVzY2FwZSAgICAgICAgICBFc2NhcGUgICAgICAgICAgRXNjYXBlICAgICAgICAgICAgICAgICAgRXNjYXBlICAgICAgICAgICAgICAgICAgTWV0YV9Fc2NhcGUgICAgICAgICAgICAgTWV0YV9Fc2NhcGUgICAgICAgICAgICAgU0FLICAgICAgICAgICAgICAgICAgICAgU0FLCitrZXljb2RlICAgMiA9ICAgb25lICAgICAgICAgICAgIGV4Y2xhbSAgICAgICAgICBvbmUgICAgICAgICAgICAgZXhjbGFtICAgICAgICAgIGV4Y2xhbSAgICAgICAgICAgICAgICAgIGV4Y2xhbSAgICAgICAgICAgICAgICAgIE1ldGFfb25lICAgICAgICAgICAgICAgIE1ldGFfb25lCitrZXljb2RlICAgMyA9ICAgdHdvICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICB0d28gICAgICAgICAgICAgYXQgICAgICAgICAgICAgIG51bCAgICAgICAgICAgICAgICAgICAgIG51bCAgICAgICAgICAgICAgICAgICAgIE1ldGFfdHdvICAgICAgICAgICAgICAgIE1ldGFfdHdvCitrZXljb2RlICAgNCA9ICAgdGhyZWUgICAgICAgICAgIG51bWJlcnNpZ24gICAgICB0aHJlZSAgICAgICAgICAgbnVtYmVyc2lnbiAgICAgIHRocmVlICAgICAgICAgICAgICAgICAgIHRocmVlICAgICAgICAgICAgICAgICAgIE1ldGFfdGhyZWUgICAgICAgICAgICAgIE1ldGFfdGhyZWUKK2tleWNvZGUgICA1ID0gICBmb3VyICAgICAgICAgICAgZG9sbGFyICAgICAgICAgIGZvdXIgICAgICAgICAgICBkb2xsYXIgICAgICAgICAgQ29udHJvbF9iYWNrc2xhc2ggICAgICAgQ29udHJvbF9iYWNrc2xhc2ggICAgICAgTWV0YV9mb3VyICAgICAgICAgICAgICAgTWV0YV9mb3VyCitrZXljb2RlICAgNiA9ICAgZml2ZSAgICAgICAgICAgIHBlcmNlbnQgICAgICAgICBmaXZlICAgICAgICAgICAgcGVyY2VudCAgICAgICAgIENvbnRyb2xfYnJhY2tldHJpZ2h0ICAgIENvbnRyb2xfYnJhY2tldHJpZ2h0ICAgIE1ldGFfZml2ZSAgICAgICAgICAgICAgIE1ldGFfZml2ZQora2V5Y29kZSAgIDcgPSAgIHNpeCAgICAgICAgICAgICBhc2NpaWNpcmN1bSAgICAgc2l4ICAgICAgICAgICAgIGFzY2lpY2lyY3VtICAgICBDb250cm9sX2FzY2lpY2lyY3VtICAgICBDb250cm9sX2FzY2lpY2lyY3VtICAgICBNZXRhX3NpeCAgICAgICAgICAgICAgICBNZXRhX3NpeAora2V5Y29kZSAgIDggPSAgIHNldmVuICAgICAgICAgICBhbXBlcnNhbmQgICAgICAgc2V2ZW4gICAgICAgICAgIGFtcGVyc2FuZCAgICAgICBDb250cm9sX3VuZGVyc2NvcmUgICAgICBDb250cm9sX3VuZGVyc2NvcmUgICAgICBNZXRhX3NldmVuICAgICAgICAgICAgICBNZXRhX3NldmVuCitrZXljb2RlICAgOSA9ICAgZWlnaHQgICAgICAgICAgIGFzdGVyaXNrICAgICAgICBlaWdodCAgICAgICAgICAgYXN0ZXJpc2sgICAgICAgIGVpZ2h0ICAgICAgICAgICAgICAgICAgIGVpZ2h0ICAgICAgICAgICAgICAgICAgIE1ldGFfZWlnaHQgICAgICAgICAgICAgIE1ldGFfZWlnaHQKK2tleWNvZGUgIDEwID0gICBuaW5lICAgICAgICAgICAgcGFyZW5sZWZ0ICAgICAgIG5pbmUgICAgICAgICAgICBwYXJlbmxlZnQgICAgICAgbmluZSAgICAgICAgICAgICAgICAgICAgbmluZSAgICAgICAgICAgICAgICAgICAgTWV0YV9uaW5lICAgICAgICAgICAgICAgTWV0YV9uaW5lCitrZXljb2RlICAxMSA9ICAgemVybyAgICAgICAgICAgIHBhcmVucmlnaHQgICAgICB6ZXJvICAgICAgICAgICAgcGFyZW5yaWdodCAgICAgIHplcm8gICAgICAgICAgICAgICAgICAgIHplcm8gICAgICAgICAgICAgICAgICAgIE1ldGFfemVybyAgICAgICAgICAgICAgIE1ldGFfemVybwora2V5Y29kZSAgMTIgPSAgIG1pbnVzICAgICAgICAgICB1bmRlcnNjb3JlICAgICAgbWludXMgICAgICAgICAgIHVuZGVyc2NvcmUgICAgICBDb250cm9sX3VuZGVyc2NvcmUgICAgICBDb250cm9sX3VuZGVyc2NvcmUgICAgICBNZXRhX21pbnVzICAgICAgICAgICAgICBNZXRhX21pbnVzCitrZXljb2RlICAxMyA9ICAgZXF1YWwgICAgICAgICAgIHBsdXMgICAgICAgICAgICBlcXVhbCAgICAgICAgICAgcGx1cyAgICAgICAgICAgIGVxdWFsICAgICAgICAgICAgICAgICAgIGVxdWFsICAgICAgICAgICAgICAgICAgIE1ldGFfZXF1YWwgICAgICAgICAgICAgIE1ldGFfZXF1YWwKK2tleWNvZGUgIDE0ID0gICBEZWxldGUgICAgICAgICAgRGVsZXRlICAgICAgICAgIERlbGV0ZSAgICAgICAgICBEZWxldGUgICAgICAgICAgQmFja1NwYWNlICAgICAgICAgICAgICAgQmFja1NwYWNlICAgICAgICAgICAgICAgTWV0YV9EZWxldGUgICAgICAgICAgICAgTWV0YV9EZWxldGUKK2tleWNvZGUgIDE1ID0gICBUYWIgICAgICAgICAgICAgVGFiICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICBUYWIgICAgICAgICAgICAgVGFiICAgICAgICAgICAgICAgICAgICAgVGFiICAgICAgICAgICAgICAgICAgICAgTWV0YV9UYWIgICAgICAgICAgICAgICAgTWV0YV9UYWIKK2tleWNvZGUgIDE2ID0gICBxICAgICAgICAgICAgICAgUSAgICAgICAgICAgICAgIDIwMiAgICAgICAgICAgICAyMzQgICAgICAgICAgICAgQ29udHJvbF9xICAgICAgICAgICAgICAgQ29udHJvbF9xICAgICAgICAgICAgICAgTWV0YV9xICAgICAgICAgICAgICAgICAgTWV0YV9xICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3EgICAgICAgICAgTWV0YV9Db250cm9sX3EKK2tleWNvZGUgIDE3ID0gICB3ICAgICAgICAgICAgICAgVyAgICAgICAgICAgICAgIDE5NSAgICAgICAgICAgICAyMjcgICAgICAgICAgICAgQ29udHJvbF93ICAgICAgICAgICAgICAgQ29udHJvbF93ICAgICAgICAgICAgICAgTWV0YV93ICAgICAgICAgICAgICAgICAgTWV0YV93ICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3cgICAgICAgICAgTWV0YV9Db250cm9sX3cKK2tleWNvZGUgIDE4ID0gICBlICAgICAgICAgICAgICAgRSAgICAgICAgICAgICAgIDIxMyAgICAgICAgICAgICAyNDUgICAgICAgICAgICAgQ29udHJvbF9lICAgICAgICAgICAgICAgQ29udHJvbF9lICAgICAgICAgICAgICAgTWV0YV9lICAgICAgICAgICAgICAgICAgTWV0YV9lICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2UgICAgICAgICAgTWV0YV9Db250cm9sX2UKK2tleWNvZGUgIDE5ID0gICByICAgICAgICAgICAgICAgUiAgICAgICAgICAgICAgIDIwMyAgICAgICAgICAgICAyMzUgICAgICAgICAgICAgQ29udHJvbF9yICAgICAgICAgICAgICAgQ29udHJvbF9yICAgICAgICAgICAgICAgTWV0YV9yICAgICAgICAgICAgICAgICAgTWV0YV9yICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3IgICAgICAgICAgTWV0YV9Db250cm9sX3IKK2tleWNvZGUgIDIwID0gICB0ICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgIDE5NyAgICAgICAgICAgICAyMjkgICAgICAgICAgICAgQ29udHJvbF90ICAgICAgICAgICAgICAgQ29udHJvbF90ICAgICAgICAgICAgICAgTWV0YV90ICAgICAgICAgICAgICAgICAgTWV0YV90ICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3QgICAgICAgICAgTWV0YV9Db250cm9sX3QKKyM9PT09PT09PT09PT09PSBwbGFpbiA9PT09PT09PT0gc2hpZnQ9PT09PT09PT09IHBsYWluIGN5ciA9PT09PSBzaGlmdCBjeXIgPT09PT0gY3RybCA9PT09PT09PT09PT09PT09PT0gY3RybCBjeXIgPT09PT09PT09PT09PT0gYWx0ID09PT09PT09PT09PT09PT09PT0gYWx0IGN5ciA9PT09PT09PT09PT09PT0gY3RybGFsdCA9PT09PT09PT09PT09PT0gY3RybGFsdCBjeXIgPT09PT09PT09PT0KK2tleWNvZGUgIDIxID0gICB5ICAgICAgICAgICAgICAgWSAgICAgICAgICAgICAgIDIwNiAgICAgICAgICAgICAyMzggICAgICAgICAgICAgQ29udHJvbF95ICAgICAgICAgICAgICAgQ29udHJvbF95ICAgICAgICAgICAgICAgTWV0YV95ICAgICAgICAgICAgICAgICAgTWV0YV95ICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3kgICAgICAgICAgTWV0YV9Db250cm9sX3kKK2tleWNvZGUgIDIyID0gICB1ICAgICAgICAgICAgICAgVSAgICAgICAgICAgICAgIDE5OSAgICAgICAgICAgICAyMzEgICAgICAgICAgICAgQ29udHJvbF91ICAgICAgICAgICAgICAgQ29udHJvbF91ICAgICAgICAgICAgICAgTWV0YV91ICAgICAgICAgICAgICAgICAgTWV0YV91ICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3UgICAgICAgICAgTWV0YV9Db250cm9sX3UKK2tleWNvZGUgIDIzID0gICBpICAgICAgICAgICAgICAgSSAgICAgICAgICAgICAgIDIxOSAgICAgICAgICAgICAyNTEgICAgICAgICAgICAgQ29udHJvbF9pICAgICAgICAgICAgICAgQ29udHJvbF9pICAgICAgICAgICAgICAgTWV0YV9pICAgICAgICAgICAgICAgICAgTWV0YV9pICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2kgICAgICAgICAgTWV0YV9Db250cm9sX2kKK2tleWNvZGUgIDI0ID0gICBvICAgICAgICAgICAgICAgTyAgICAgICAgICAgICAgIDIyMSAgICAgICAgICAgICAyNTMgICAgICAgICAgICAgQ29udHJvbF9vICAgICAgICAgICAgICAgQ29udHJvbF9vICAgICAgICAgICAgICAgTWV0YV9vICAgICAgICAgICAgICAgICAgTWV0YV9vICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX28gICAgICAgICAgTWV0YV9Db250cm9sX28KK2tleWNvZGUgIDI1ID0gICBwICAgICAgICAgICAgICAgUCAgICAgICAgICAgICAgIDIxOCAgICAgICAgICAgICAyNTAgICAgICAgICAgICAgQ29udHJvbF9wICAgICAgICAgICAgICAgQ29udHJvbF9wICAgICAgICAgICAgICAgTWV0YV9wICAgICAgICAgICAgICAgICAgTWV0YV9wICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3AgICAgICAgICAgTWV0YV9Db250cm9sX3AKK2tleWNvZGUgIDI2ID0gICBicmFja2V0bGVmdCAgICAgYnJhY2VsZWZ0ICAgICAgIDIwMCAgICAgICAgICAgICAyMzIgICAgICAgICAgICAgRXNjYXBlICAgICAgICAgICAgICAgICAgRXNjYXBlICAgICAgICAgICAgICAgICAgTWV0YV9icmFja2V0bGVmdCAgICAgICAgTWV0YV9icmFja2V0bGVmdAora2V5Y29kZSAgMjcgPSAgIGJyYWNrZXRyaWdodCAgICBicmFjZXJpZ2h0ICAgICAgMjIzICAgICAgICAgICAgIDI1NSAgICAgICAgICAgICBDb250cm9sX2JyYWNrZXRyaWdodCAgICBDb250cm9sX2JyYWNrZXRyaWdodAora2V5Y29kZSAgMjggPSAgIFJldHVybgorIyBTaGlmdCtDdHJsIC0gQ3lyaWxsaWMKK2tleWNvZGUgIDI5ID0gICBDb250cm9sCQlBbHRHcl9Mb2NrICAgICAgQ29udHJvbCAgICAgICAgIEFsdEdyX0xvY2sgICAgICBDb250cm9sCQkgICAgICAgIENvbnRyb2wJCSAgICAgICAgQ29udHJvbAkJICAgICAgICBDb250cm9sCQkgICAgICAgIENvbnRyb2wJCSAgICAgICAgQ29udHJvbAora2V5Y29kZSAgMzAgPSAgIGEgICAgICAgICAgICAgICBBICAgICAgICAgICAgICAgMTk4ICAgICAgICAgICAgIDIzMCAgICAgICAgICAgICBDb250cm9sX2EgICAgICAgICAgICAgICBDb250cm9sX2EgICAgICAgICAgICAgICBNZXRhX2EgICAgICAgICAgICAgICAgICBNZXRhX2EgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfYSAgICAgICAgICBNZXRhX0NvbnRyb2xfYQora2V5Y29kZSAgMzEgPSAgIHMgICAgICAgICAgICAgICBTICAgICAgICAgICAgICAgMjE3ICAgICAgICAgICAgIDI0OSAgICAgICAgICAgICBDb250cm9sX3MgICAgICAgICAgICAgICBDb250cm9sX3MgICAgICAgICAgICAgICBNZXRhX3MgICAgICAgICAgICAgICAgICBNZXRhX3MgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfcyAgICAgICAgICBNZXRhX0NvbnRyb2xfcwora2V5Y29kZSAgMzIgPSAgIGQgICAgICAgICAgICAgICBEICAgICAgICAgICAgICAgMjE1ICAgICAgICAgICAgIDI0NyAgICAgICAgICAgICBDb250cm9sX2QgICAgICAgICAgICAgICBDb250cm9sX2QgICAgICAgICAgICAgICBNZXRhX2QgICAgICAgICAgICAgICAgICBNZXRhX2QgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfZCAgICAgICAgICBNZXRhX0NvbnRyb2xfZAora2V5Y29kZSAgMzMgPSAgIGYgICAgICAgICAgICAgICBGICAgICAgICAgICAgICAgMTkzICAgICAgICAgICAgIDIyNSAgICAgICAgICAgICBDb250cm9sX2YgICAgICAgICAgICAgICBDb250cm9sX2YgICAgICAgICAgICAgICBNZXRhX2YgICAgICAgICAgICAgICAgICBNZXRhX2YgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfZiAgICAgICAgICBNZXRhX0NvbnRyb2xfZgora2V5Y29kZSAgMzQgPSAgIGcgICAgICAgICAgICAgICBHICAgICAgICAgICAgICAgMjA4ICAgICAgICAgICAgIDI0MCAgICAgICAgICAgICBDb250cm9sX2cgICAgICAgICAgICAgICBDb250cm9sX2cgICAgICAgICAgICAgICBNZXRhX2cgICAgICAgICAgICAgICAgICBNZXRhX2cgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfZyAgICAgICAgICBNZXRhX0NvbnRyb2xfZwora2V5Y29kZSAgMzUgPSAgIGggICAgICAgICAgICAgICBIICAgICAgICAgICAgICAgMjEwICAgICAgICAgICAgIDI0MiAgICAgICAgICAgICBDb250cm9sX2ggICAgICAgICAgICAgICBDb250cm9sX2ggICAgICAgICAgICAgICBNZXRhX2ggICAgICAgICAgICAgICAgICBNZXRhX2ggICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfaCAgICAgICAgICBNZXRhX0NvbnRyb2xfaAora2V5Y29kZSAgMzYgPSAgIGogICAgICAgICAgICAgICBKICAgICAgICAgICAgICAgMjA3ICAgICAgICAgICAgIDIzOSAgICAgICAgICAgICBDb250cm9sX2ogICAgICAgICAgICAgICBDb250cm9sX2ogICAgICAgICAgICAgICBNZXRhX2ogICAgICAgICAgICAgICAgICBNZXRhX2ogICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfaiAgICAgICAgICBNZXRhX0NvbnRyb2xfagora2V5Y29kZSAgMzcgPSAgIGsgICAgICAgICAgICAgICBLICAgICAgICAgICAgICAgMjA0ICAgICAgICAgICAgIDIzNiAgICAgICAgICAgICBDb250cm9sX2sgICAgICAgICAgICAgICBDb250cm9sX2sgICAgICAgICAgICAgICBNZXRhX2sgICAgICAgICAgICAgICAgICBNZXRhX2sgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfayAgICAgICAgICBNZXRhX0NvbnRyb2xfawora2V5Y29kZSAgMzggPSAgIGwgICAgICAgICAgICAgICBMICAgICAgICAgICAgICAgMTk2ICAgICAgICAgICAgIDIyOCAgICAgICAgICAgICBDb250cm9sX2wgICAgICAgICAgICAgICBDb250cm9sX2wgICAgICAgICAgICAgICBNZXRhX2wgICAgICAgICAgICAgICAgICBNZXRhX2wgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfbCAgICAgICAgICBNZXRhX0NvbnRyb2xfbAora2V5Y29kZSAgMzkgPSAgIHNlbWljb2xvbiAgICAgICBjb2xvbiAgICAgICAgICAgMjE0ICAgICAgICAgICAgIDI0NiAgICAgICAgICAgICBzZW1pY29sb24gICAgICAgICAgICAgICBzZW1pY29sb24gICAgICAgICAgICAgICBNZXRhX3NlbWljb2xvbiAgICAgICAgICBNZXRhX3NlbWljb2xvbgora2V5Y29kZSAgNDAgPSAgIGFwb3N0cm9waGUgICAgICBxdW90ZWRibCAgICAgICAgMjIwICAgICAgICAgICAgIDI1MiAgICAgICAgICAgICBDb250cm9sX2cgICAgICAgICAgICAgICBDb250cm9sX2cgICAgICAgICAgICAgICBNZXRhX2Fwb3N0cm9waGUgICAgICAgICBNZXRhX2Fwb3N0cm9waGUKKyM9PT09PT09PT09PT09PSBwbGFpbiA9PT09PT09PT0gc2hpZnQ9PT09PT09PT09IHBsYWluIGN5ciA9PT09PSBzaGlmdCBjeXIgPT09PT0gY3RybCA9PT09PT09PT09PT09PT09PT0gY3RybCBjeXIgPT09PT09PT09PT09PT0gYWx0ID09PT09PT09PT09PT09PT09PT0gYWx0IGN5ciA9PT09PT09PT09PT09PT0gY3RybGFsdCA9PT09PT09PT09PT09PT0gY3RybGFsdCBjeXIgPT09PT09PT09PT0KK2tleWNvZGUgIDQxID0gICBncmF2ZSAgICAgICAgICAgYXNjaWl0aWxkZSAgICAgIGdyYXZlICAgICAgICAgICBhc2NpaXRpbGRlICAgICAgbnVsICAgICAgICAgICAgICAgICAgICAgbnVsICAgICAgICAgICAgICAgICAgICAgTWV0YV9ncmF2ZSAgICAgICAgICAgICAgTWV0YV9ncmF2ZQora2V5Y29kZSAgNDIgPSAgIFNoaWZ0CitrZXljb2RlICA0MyA9ICAgYmFja3NsYXNoICAgICAgIGJhciAgICAgICAgICAgICBiYWNrc2xhc2ggICAgICAgYmFyICAgICAgICAgICAgIENvbnRyb2xfYmFja3NsYXNoICAgICAgIENvbnRyb2xfYmFja3NsYXNoICAgICAgIE1ldGFfYmFja3NsYXNoICAgICAgICAgIE1ldGFfYmFja3NsYXNoCitrZXljb2RlICA0NCA9ICAgeiAgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAyMDkgICAgICAgICAgICAgMjQxICAgICAgICAgICAgIENvbnRyb2xfeiAgICAgICAgICAgICAgIENvbnRyb2xfeiAgICAgICAgICAgICAgIE1ldGFfeiAgICAgICAgICAgICAgICAgIE1ldGFfeiAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF96ICAgICAgICAgIE1ldGFfQ29udHJvbF96CitrZXljb2RlICA0NSA9ICAgeCAgICAgICAgICAgICAgIFggICAgICAgICAgICAgICAyMjIgICAgICAgICAgICAgMjU0ICAgICAgICAgICAgIENvbnRyb2xfeCAgICAgICAgICAgICAgIENvbnRyb2xfeCAgICAgICAgICAgICAgIE1ldGFfeCAgICAgICAgICAgICAgICAgIE1ldGFfeCAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF94ICAgICAgICAgIE1ldGFfQ29udHJvbF94CitrZXljb2RlICA0NiA9ICAgYyAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAyMTEgICAgICAgICAgICAgMjQzICAgICAgICAgICAgIENvbnRyb2xfYyAgICAgICAgICAgICAgIENvbnRyb2xfYyAgICAgICAgICAgICAgIE1ldGFfYyAgICAgICAgICAgICAgICAgIE1ldGFfYyAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9jICAgICAgICAgIE1ldGFfQ29udHJvbF9jCitrZXljb2RlICA0NyA9ICAgdiAgICAgICAgICAgICAgIFYgICAgICAgICAgICAgICAyMDUgICAgICAgICAgICAgMjM3ICAgICAgICAgICAgIENvbnRyb2xfdiAgICAgICAgICAgICAgIENvbnRyb2xfdiAgICAgICAgICAgICAgIE1ldGFfdiAgICAgICAgICAgICAgICAgIE1ldGFfdiAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF92ICAgICAgICAgIE1ldGFfQ29udHJvbF92CitrZXljb2RlICA0OCA9ICAgYiAgICAgICAgICAgICAgIEIgICAgICAgICAgICAgICAyMDEgICAgICAgICAgICAgMjMzICAgICAgICAgICAgIENvbnRyb2xfYiAgICAgICAgICAgICAgIENvbnRyb2xfYiAgICAgICAgICAgICAgIE1ldGFfYiAgICAgICAgICAgICAgICAgIE1ldGFfYiAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9iICAgICAgICAgIE1ldGFfQ29udHJvbF9iCitrZXljb2RlICA0OSA9ICAgbiAgICAgICAgICAgICAgIE4gICAgICAgICAgICAgICAyMTIgICAgICAgICAgICAgMjQ0ICAgICAgICAgICAgIENvbnRyb2xfbiAgICAgICAgICAgICAgIENvbnRyb2xfbiAgICAgICAgICAgICAgIE1ldGFfbiAgICAgICAgICAgICAgICAgIE1ldGFfbiAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9uICAgICAgICAgIE1ldGFfQ29udHJvbF9uCitrZXljb2RlICA1MCA9ICAgbSAgICAgICAgICAgICAgIE0gICAgICAgICAgICAgICAyMTYgICAgICAgICAgICAgMjQ4ICAgICAgICAgICAgIENvbnRyb2xfbSAgICAgICAgICAgICAgIENvbnRyb2xfbSAgICAgICAgICAgICAgIE1ldGFfbSAgICAgICAgICAgICAgICAgIE1ldGFfbSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9tICAgICAgICAgIE1ldGFfQ29udHJvbF9tCitrZXljb2RlICA1MSA9ICAgY29tbWEgICAgICAgICAgIGxlc3MgICAgICAgICAgICAxOTQgICAgICAgICAgICAgMjI2ICAgICAgICAgICAgIGNvbW1hICAgICAgICAgICAgICAgICAgIGNvbW1hICAgICAgICAgICAgICAgICAgIE1ldGFfY29tbWEgICAgICAgICAgICAgIE1ldGFfY29tbWEKK2tleWNvZGUgIDUyID0gICBwZXJpb2QgICAgICAgICAgZ3JlYXRlciAgICAgICAgIDE5MiAgICAgICAgICAgICAyMjQgICAgICAgICAgICAgQ29tcG9zZSAgICAgICAgICAgICAgICAgQ29tcG9zZSAgICAgICAgICAgICAgICAgTWV0YV9wZXJpb2QgICAgICAgICAgICAgTWV0YV9wZXJpb2QKK2tleWNvZGUgIDUzID0gICBzbGFzaCAgICAgICAgICAgcXVlc3Rpb24gICAgICAgIHNsYXNoICAgICAgICAgICBxdWVzdGlvbiAgICAgICAgRGVsZXRlICAgICAgICAgICAgICAgICAgRGVsZXRlICAgICAgICAgICAgICAgICAgTWV0YV9zbGFzaCAgICAgICAgICAgICAgTWV0YV9zbGFzaCAgICAgICAgICAgICAgTWV0YV9xdWVzdGlvbiAgICAgICAgICAgTWV0YV9xdWVzdGlvbgorIyBDdHJsK1NoaWZ0IC0gQ3lyaWxsaWMgKG5vdCB3b3JraW5nPz8/KQora2V5Y29kZSAgNTQgPSAgIFNoaWZ0ICAgICAgICAgICBTaGlmdCAgICAgICAgICAgU2hpZnQgICAgICAgICAgIFNoaWZ0ICAgICAgICAgICBBbHRHcl9Mb2NrICAgICAgICAgICAgICBBbHRHcl9Mb2NrICAgICAgICAgICAgICBTaGlmdCAgICAgICAgICAgICAgICAgICBTaGlmdCAgICAgICAgICAgICAgICAgICBTaGlmdCAgICAgICAgICAgICAgICAgICBTaGlmdAora2V5Y29kZSAgNTUgPSAgIEtQX011bHRpcGx5CitrZXljb2RlICA1NiA9ICAgQWx0CitrZXljb2RlICA1NyA9ICAgc3BhY2UgICAgICAgICAgIHNwYWNlICAgICAgICAgICBzcGFjZSAgICAgICAgICAgc3BhY2UgICAgICAgICAgIG51bCAgICAgICAgICAgICAgICAgICAgIG51bCAgICAgICAgICAgICAgICAgICAgIE1ldGFfc3BhY2UgICAgICAgICAgICAgIE1ldGFfc3BhY2UKK2tleWNvZGUgIDU4ID0gICBDYXBzX0xvY2sKK2tleWNvZGUgIDU5ID0gICBGMSAgICAgICAgICAgICAgRjExICAgICAgICAgICAgIEYxICAgICAgICAgICAgICBGMTEgICAgICAgICAgICAgRjEgICAgICAgICAgICAgICAgICAgICAgRjEgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV8xICAgICAgICAgICAgICAgQ29uc29sZV8xICAgICAgICAgICAgICAgQ29uc29sZV8xICAgICAgICAgICAgICAgQ29uc29sZV8xCitrZXljb2RlICA2MCA9ICAgRjIgICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICBGMiAgICAgICAgICAgICAgRjEyICAgICAgICAgICAgIEYyICAgICAgICAgICAgICAgICAgICAgIEYyICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfMiAgICAgICAgICAgICAgIENvbnNvbGVfMiAgICAgICAgICAgICAgIENvbnNvbGVfMiAgICAgICAgICAgICAgIENvbnNvbGVfMgorIz09PT09PT09PT09PT09IHBsYWluID09PT09PT09PSBzaGlmdD09PT09PT09PT0gcGxhaW4gY3lyID09PT09IHNoaWZ0IGN5ciA9PT09PSBjdHJsID09PT09PT09PT09PT09PT09PSBjdHJsIGN5ciA9PT09PT09PT09PT09PSBhbHQgPT09PT09PT09PT09PT09PT09PSBhbHQgY3lyID09PT09PT09PT09PT09PSBjdHJsYWx0ID09PT09PT09PT09PT09PSBjdHJsYWx0IGN5ciA9PT09PT09PT09PQora2V5Y29kZSAgNjEgPSAgIEYzICAgICAgICAgICAgICBGMTMgICAgICAgICAgICAgRjMgICAgICAgICAgICAgIEYxMyAgICAgICAgICAgICBGMyAgICAgICAgICAgICAgICAgICAgICBGMyAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzMgICAgICAgICAgICAgICBDb25zb2xlXzMgICAgICAgICAgICAgICBDb25zb2xlXzMgICAgICAgICAgICAgICBDb25zb2xlXzMKK2tleWNvZGUgIDYyID0gICBGNCAgICAgICAgICAgICAgRjE0ICAgICAgICAgICAgIEY0ICAgICAgICAgICAgICBGMTQgICAgICAgICAgICAgRjQgICAgICAgICAgICAgICAgICAgICAgRjQgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV80ICAgICAgICAgICAgICAgQ29uc29sZV80ICAgICAgICAgICAgICAgQ29uc29sZV80ICAgICAgICAgICAgICAgQ29uc29sZV80CitrZXljb2RlICA2MyA9ICAgRjUgICAgICAgICAgICAgIEYxNSAgICAgICAgICAgICBGNSAgICAgICAgICAgICAgRjE1ICAgICAgICAgICAgIEY1ICAgICAgICAgICAgICAgICAgICAgIEY1ICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfNSAgICAgICAgICAgICAgIENvbnNvbGVfNSAgICAgICAgICAgICAgIENvbnNvbGVfNSAgICAgICAgICAgICAgIENvbnNvbGVfNQora2V5Y29kZSAgNjQgPSAgIEY2ICAgICAgICAgICAgICBGMTYgICAgICAgICAgICAgRjYgICAgICAgICAgICAgIEYxNiAgICAgICAgICAgICBGNiAgICAgICAgICAgICAgICAgICAgICBGNiAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzYgICAgICAgICAgICAgICBDb25zb2xlXzYgICAgICAgICAgICAgICBDb25zb2xlXzYgICAgICAgICAgICAgICBDb25zb2xlXzYKK2tleWNvZGUgIDY1ID0gICBGNyAgICAgICAgICAgICAgRjE3ICAgICAgICAgICAgIEY3ICAgICAgICAgICAgICBGMTcgICAgICAgICAgICAgRjcgICAgICAgICAgICAgICAgICAgICAgRjcgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV83ICAgICAgICAgICAgICAgQ29uc29sZV83ICAgICAgICAgICAgICAgQ29uc29sZV83ICAgICAgICAgICAgICAgQ29uc29sZV83CitrZXljb2RlICA2NiA9ICAgRjggICAgICAgICAgICAgIEYxOCAgICAgICAgICAgICBGOCAgICAgICAgICAgICAgRjE4ICAgICAgICAgICAgIEY4ICAgICAgICAgICAgICAgICAgICAgIEY4ICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfOCAgICAgICAgICAgICAgIENvbnNvbGVfOCAgICAgICAgICAgICAgIENvbnNvbGVfOCAgICAgICAgICAgICAgIENvbnNvbGVfOAora2V5Y29kZSAgNjcgPSAgIEY5ICAgICAgICAgICAgICBGMTkgICAgICAgICAgICAgRjkgICAgICAgICAgICAgIEYxOSAgICAgICAgICAgICBGOSAgICAgICAgICAgICAgICAgICAgICBGOSAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzkgICAgICAgICAgICAgICBDb25zb2xlXzkgICAgICAgICAgICAgICBDb25zb2xlXzkgICAgICAgICAgICAgICBDb25zb2xlXzkKK2tleWNvZGUgIDY4ID0gICBGMTAgICAgICAgICAgICAgRjIwICAgICAgICAgICAgIEYxMCAgICAgICAgICAgICBGMjAgICAgICAgICAgICAgRjEwICAgICAgICAgICAgICAgICAgICAgRjEwICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV8xMCAgICAgICAgICAgICAgQ29uc29sZV8xMCAgICAgICAgICAgICAgQ29uc29sZV8xMCAgICAgICAgICAgICAgQ29uc29sZV8xMAora2V5Y29kZSAgNjkgPSAgIE51bV9Mb2NrICAgICAgICBCYXJlX051bV9Mb2NrICAgTnVtX0xvY2sgICAgICAgIEJhcmVfTnVtX0xvY2sKK2tleWNvZGUgIDcwID0gICBTY3JvbGxfTG9jayAgICAgU2hvd19NZW1vcnkgICAgIFNjcm9sbF9Mb2NrICAgICBTaG93X01lbW9yeSAgICAgU2hvd19TdGF0ZSAgICAgICAgICAgICAgU2hvd19TdGF0ZQora2V5Y29kZSAgNzEgPSAgIEtQXzcgICAgICAgICAgICBLUF83ICAgICAgICAgICAgS1BfNyAgICAgICAgICAgIEtQXzcgICAgICAgICAgICBLUF83ICAgICAgICAgICAgICAgICAgICBLUF83ICAgICAgICAgICAgICAgICAgICBBc2NpaV83ICAgICAgICAgICAgICAgICBBc2NpaV83CitrZXljb2RlICA3MiA9ICAgS1BfOCAgICAgICAgICAgIEtQXzggICAgICAgICAgICBLUF84ICAgICAgICAgICAgS1BfOCAgICAgICAgICAgIEtQXzggICAgICAgICAgICAgICAgICAgIEtQXzggICAgICAgICAgICAgICAgICAgIEFzY2lpXzggICAgICAgICAgICAgICAgIEFzY2lpXzgKK2tleWNvZGUgIDczID0gICBLUF85ICAgICAgICAgICAgS1BfOSAgICAgICAgICAgIEtQXzkgICAgICAgICAgICBLUF85ICAgICAgICAgICAgS1BfOSAgICAgICAgICAgICAgICAgICAgS1BfOSAgICAgICAgICAgICAgICAgICAgQXNjaWlfOSAgICAgICAgICAgICAgICAgQXNjaWlfOQora2V5Y29kZSAgNzQgPSAgIEtQX1N1YnRyYWN0ICAgICBLUF9TdWJ0cmFjdCAgICAgS1BfU3VidHJhY3QgICAgIEtQX1N1YnRyYWN0ICAgICBLUF9TdWJ0cmFjdCAgICAgICAgICAgICBLUF9TdWJ0cmFjdCAgICAgICAgICAgICBLUF9TdWJ0cmFjdCAgICAgICAgICAgICBLUF9TdWJ0cmFjdAora2V5Y29kZSAgNzUgPSAgIEtQXzQgICAgICAgICAgICBLUF80ICAgICAgICAgICAgS1BfNCAgICAgICAgICAgIEtQXzQgICAgICAgICAgICBLUF80ICAgICAgICAgICAgICAgICAgICBLUF80ICAgICAgICAgICAgICAgICAgICBBc2NpaV80ICAgICAgICAgICAgICAgICBBc2NpaV80CitrZXljb2RlICA3NiA9ICAgS1BfNSAgICAgICAgICAgIEtQXzUgICAgICAgICAgICBLUF81ICAgICAgICAgICAgS1BfNSAgICAgICAgICAgIEtQXzUgICAgICAgICAgICAgICAgICAgIEtQXzUgICAgICAgICAgICAgICAgICAgIEFzY2lpXzUgICAgICAgICAgICAgICAgIEFzY2lpXzUKK2tleWNvZGUgIDc3ID0gICBLUF82ICAgICAgICAgICAgS1BfNiAgICAgICAgICAgIEtQXzYgICAgICAgICAgICBLUF82ICAgICAgICAgICAgS1BfNiAgICAgICAgICAgICAgICAgICAgS1BfNiAgICAgICAgICAgICAgICAgICAgQXNjaWlfNiAgICAgICAgICAgICAgICAgQXNjaWlfNgora2V5Y29kZSAgNzggPSAgIEtQX0FkZCAgICAgICAgICBLUF9BZGQgICAgICAgICAgS1BfQWRkICAgICAgICAgIEtQX0FkZCAgICAgICAgICBLUF9BZGQgICAgICAgICAgICAgICAgICBLUF9BZGQgICAgICAgICAgICAgICAgICBLUF9BZGQgICAgICAgICAgICAgICAgICBLUF9BZGQKK2tleWNvZGUgIDc5ID0gICBLUF8xICAgICAgICAgICAgS1BfMSAgICAgICAgICAgIEtQXzEgICAgICAgICAgICBLUF8xICAgICAgICAgICAgS1BfMSAgICAgICAgICAgICAgICAgICAgS1BfMSAgICAgICAgICAgICAgICAgICAgQXNjaWlfMSAgICAgICAgICAgICAgICAgQXNjaWlfMQora2V5Y29kZSAgODAgPSAgIEtQXzIgICAgICAgICAgICBLUF8yICAgICAgICAgICAgS1BfMiAgICAgICAgICAgIEtQXzIgICAgICAgICAgICBLUF8yICAgICAgICAgICAgICAgICAgICBLUF8yICAgICAgICAgICAgICAgICAgICBBc2NpaV8yICAgICAgICAgICAgICAgICBBc2NpaV8yCisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlICA4MSA9ICAgS1BfMyAgICAgICAgICAgIEtQXzMgICAgICAgICAgICBLUF8zICAgICAgICAgICAgS1BfMyAgICAgICAgICAgIEtQXzMgICAgICAgICAgICAgICAgICAgIEtQXzMgICAgICAgICAgICAgICAgICAgIEFzY2lpXzMgICAgICAgICAgICAgICAgIEFzY2lpXzMKK2tleWNvZGUgIDgyID0gICBLUF8wICAgICAgICAgICAgS1BfMCAgICAgICAgICAgIEtQXzAgICAgICAgICAgICBLUF8wICAgICAgICAgICAgS1BfMCAgICAgICAgICAgICAgICAgICAgS1BfMCAgICAgICAgICAgICAgICAgICAgQXNjaWlfMCAgICAgICAgICAgICAgICAgQXNjaWlfMAora2V5Y29kZSAgODMgPSAgIEtQX1BlcmlvZCAgICAgICBLUF9QZXJpb2QgICAgICAgS1BfUGVyaW9kICAgICAgIEtQX1BlcmlvZCAgICAgICBLUF9QZXJpb2QgICAgICAgICAgICAgICBLUF9QZXJpb2QgICAgICAgICAgICAgICBLUF9QZXJpb2QgICAgICAgICAgICAgICBLUF9QZXJpb2QgICAgICAgICAgICAgICBCb290ICAgICAgICAgICAgICAgICAgICBCb290CitrZXljb2RlICA4NCA9ICAgTGFzdF9Db25zb2xlCitrZXljb2RlICA4NSA9CitrZXljb2RlICA4NiA9ICAgbGVzcyAgICAgICAgICAgIGdyZWF0ZXIgICAgICAgICBsZXNzICAgICAgICAgICAgZ3JlYXRlciAgICAgICAgIGxlc3MgICAgICAgICAgICAgICAgICAgIGxlc3MgICAgICAgICAgICAgICAgICAgIE1ldGFfbGVzcyAgICAgICAgICAgICAgIE1ldGFfbGVzcwora2V5Y29kZSAgODcgPSAgIEYxMSAgICAgICAgICAgICBGMTEgICAgICAgICAgICAgRjExICAgICAgICAgICAgIEYxMSAgICAgICAgICAgICBGMTEgICAgICAgICAgICAgICAgICAgICBGMTEgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzExICAgICAgICAgICAgICBDb25zb2xlXzExICAgICAgICAgICAgICBDb25zb2xlXzExICAgICAgICAgICAgICBDb25zb2xlXzExCitrZXljb2RlICA4OCA9ICAgRjEyICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgRjEyICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfMTIgICAgICAgICAgICAgIENvbnNvbGVfMTIgICAgICAgICAgICAgIENvbnNvbGVfMTIgICAgICAgICAgICAgIENvbnNvbGVfMTIKK2tleWNvZGUgIDg5ID0KK2tleWNvZGUgIDkwID0KK2tleWNvZGUgIDkxID0KK2tleWNvZGUgIDkyID0KK2tleWNvZGUgIDkzID0KK2tleWNvZGUgIDk0ID0KK2tleWNvZGUgIDk1ID0KK2tleWNvZGUgIDk2ID0gICBLUF9FbnRlcgora2V5Y29kZSAgOTcgPSAgIENvbnRyb2wKK2tleWNvZGUgIDk4ID0gICBLUF9EaXZpZGUKK2tleWNvZGUgIDk5ID0gICBDb250cm9sX2JhY2tzbGFzaAorIyBSaWdodCBBbHQgLSBDeXJpbGxpYwora2V5Y29kZSAxMDAgPSAgIEFsdEdyX0xvY2sKKyM9PT09PT09PT09PT09PSBwbGFpbiA9PT09PT09PT0gc2hpZnQ9PT09PT09PT09IHBsYWluIGN5ciA9PT09PSBzaGlmdCBjeXIgPT09PT0gY3RybCA9PT09PT09PT09PT09PT09PT0gY3RybCBjeXIgPT09PT09PT09PT09PT0gYWx0ID09PT09PT09PT09PT09PT09PT0gYWx0IGN5ciA9PT09PT09PT09PT09PT0gY3RybGFsdCA9PT09PT09PT09PT09PT0gY3RybGFsdCBjeXIgPT09PT09PT09PT0KK2tleWNvZGUgMTAxID0gICBCcmVhawora2V5Y29kZSAxMDIgPSAgIEZpbmQKK2tleWNvZGUgMTAzID0gICBVcAora2V5Y29kZSAxMDQgPSAgIFByaW9yICAgICAgICAgICBTY3JvbGxfQmFja3dhcmQgUHJpb3IgICAgICAgICAgIFNjcm9sbF9CYWNrd2FyZCBQcmlvciAgICAgICAgICAgICAgICAgICBQcmlvciAgICAgICAgICAgICAgICAgICBQcmlvciAgICAgICAgICAgICAgICAgICBQcmlvciAgICAgICAgICAgICAgICAgICBQcmlvciAgICAgICAgICAgICAgICAgICBQcmlvcgora2V5Y29kZSAxMDUgPSAgIExlZnQgICAgICAgICAgICBMZWZ0ICAgICAgICAgICAgTGVmdCAgICAgICAgICAgIExlZnQgICAgICAgICAgICBMZWZ0ICAgICAgICAgICAgICAgICAgICBMZWZ0ICAgICAgICAgICAgICAgICAgICBMZWZ0ICAgICAgICAgICAgICAgICAgICBMZWZ0ICAgICAgICAgICAgICAgICAgICBEZWNyX0NvbnNvbGUgICAgICAgICAgICBEZWNyX0NvbnNvbGUKK2tleWNvZGUgMTA2ID0gICBSaWdodCAgICAgICAgICAgUmlnaHQgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICBSaWdodCAgICAgICAgICAgUmlnaHQgICAgICAgICAgICAgICAgICAgUmlnaHQgICAgICAgICAgICAgICAgICAgUmlnaHQgICAgICAgICAgICAgICAgICAgUmlnaHQgICAgICAgICAgICAgICAgICAgSW5jcl9Db25zb2xlICAgICAgICAgICAgSW5jcl9Db25zb2xlCitrZXljb2RlIDEwNyA9ICAgU2VsZWN0CitrZXljb2RlIDEwOCA9ICAgRG93bgora2V5Y29kZSAxMDkgPSAgIE5leHQgICAgICAgICAgICBTY3JvbGxfRm9yd2FyZCAgTmV4dCAgICAgICAgICAgIFNjcm9sbF9Gb3J3YXJkICBOZXh0ICAgICAgICAgICAgICAgICAgICBOZXh0ICAgICAgICAgICAgICAgICAgICBOZXh0ICAgICAgICAgICAgICAgICAgICBOZXh0ICAgICAgICAgICAgICAgICAgICBOZXh0ICAgICAgICAgICAgICAgICAgICBOZXh0CitrZXljb2RlIDExMCA9ICAgSW5zZXJ0CitrZXljb2RlIDExMSA9ICAgUmVtb3ZlICAgICAgICAgIFJlbW92ZSAgICAgICAgICBSZW1vdmUgICAgICAgICAgUmVtb3ZlICAgICAgICAgIFJlbW92ZSAgICAgICAgICAgICAgICAgIFJlbW92ZSAgICAgICAgICAgICAgICAgIFJlbW92ZSAgICAgICAgICAgICAgICAgIFJlbW92ZSAgICAgICAgICAgICAgICAgIEJvb3QgICAgICAgICAgICAgICAgICAgIEJvb3QKK2tleWNvZGUgMTEyID0gICBNYWNybwora2V5Y29kZSAxMTMgPSAgIEYxMwora2V5Y29kZSAxMTQgPSAgIEYxNAora2V5Y29kZSAxMTUgPSAgIEhlbHAKK2tleWNvZGUgMTE2ID0gICBEbwora2V5Y29kZSAxMTcgPSAgIEYxNwora2V5Y29kZSAxMTggPSAgIEtQX01pblBsdXMKK2tleWNvZGUgMTE5ID0gICBQYXVzZQora2V5Y29kZSAxMjAgPQorIz09PT09PT09PT09PT09IHBsYWluID09PT09PT09PSBzaGlmdD09PT09PT09PT0gcGxhaW4gY3lyID09PT09IHNoaWZ0IGN5ciA9PT09PSBjdHJsID09PT09PT09PT09PT09PT09PSBjdHJsIGN5ciA9PT09PT09PT09PT09PSBhbHQgPT09PT09PT09PT09PT09PT09PSBhbHQgY3lyID09PT09PT09PT09PT09PSBjdHJsYWx0ID09PT09PT09PT09PT09PSBjdHJsYWx0IGN5ciA9PT09PT09PT09PQora2V5Y29kZSAxMjEgPQora2V5Y29kZSAxMjIgPQora2V5Y29kZSAxMjMgPQora2V5Y29kZSAxMjQgPQora2V5Y29kZSAxMjUgPQora2V5Y29kZSAxMjYgPQora2V5Y29kZSAxMjcgPQorCitzdHJpbmcgRjEgPSAiXDAzM1tbQSIKK3N0cmluZyBGMiA9ICJcMDMzW1tCIgorc3RyaW5nIEYzID0gIlwwMzNbW0MiCitzdHJpbmcgRjQgPSAiXDAzM1tbRCIKK3N0cmluZyBGNSA9ICJcMDMzW1tFIgorc3RyaW5nIEY2ID0gIlwwMzNbMTd+Igorc3RyaW5nIEY3ID0gIlwwMzNbMTh+Igorc3RyaW5nIEY4ID0gIlwwMzNbMTl+Igorc3RyaW5nIEY5ID0gIlwwMzNbMjB+Igorc3RyaW5nIEYxMCA9ICJcMDMzWzIxfiIKK3N0cmluZyBGMTEgPSAiXDAzM1syM34iCitzdHJpbmcgRjEyID0gIlwwMzNbMjR+Igorc3RyaW5nIEYxMyA9ICJcMDMzWzI1fiIKK3N0cmluZyBGMTQgPSAiXDAzM1syNn4iCitzdHJpbmcgRjE1ID0gIlwwMzNbMjh+Igorc3RyaW5nIEYxNiA9ICJcMDMzWzI5fiIKK3N0cmluZyBGMTcgPSAiXDAzM1szMX4iCitzdHJpbmcgRjE4ID0gIlwwMzNbMzJ+Igorc3RyaW5nIEYxOSA9ICJcMDMzWzMzfiIKK3N0cmluZyBGMjAgPSAiXDAzM1szNH4iCitzdHJpbmcgRmluZCA9ICJcMDMzWzF+Igorc3RyaW5nIEluc2VydCA9ICJcMDMzWzJ+Igorc3RyaW5nIFJlbW92ZSA9ICJcMDMzWzN+Igorc3RyaW5nIFNlbGVjdCA9ICJcMDMzWzR+Igorc3RyaW5nIFByaW9yID0gIlwwMzNbNX4iCitzdHJpbmcgTmV4dCA9ICJcMDMzWzZ+Igorc3RyaW5nIE1hY3JvID0gIlwwMzNbTSIKK3N0cmluZyBQYXVzZSA9ICJcMDMzW1AiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL3J1biBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3YzQxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL3J1bgpAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgPC9kZXYvbnVsbAorCit1c2VyPXJvb3QKK2JhdWQ9Mzg0MDAKK2RlbGF5PTMKK2V4cG9ydCBURVJNPWxpbnV4CisKK3R0eT0iL2Rldi8ke1BXRCMjKi9nZXR0eV99IgorCitpZiAhIHRlc3QgLWUgIiR0dHkiOyB0aGVuCisJZXhlYyBlbnYgLSBzbGVlcCAzMjAwMAorZmkKKworc2xlZXAgIiRkZWxheSIKKworY2hvd24gIiR1c2VyIiAiJHR0eSIgIyAtIGRldmZzIG1hZGUgaGFwcHkKKworZXhlYyA8IiR0dHkiID4iJHR0eSIgMj4mMQorIyB1c2luZyAuIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gc2V0IGVudiAoVEVSTSBldGMpIGluIGNmZwordGVzdCAteCAuL2NmZyAmJiAuIC4vY2ZnCisKK2V4ZWMgXAorZW52IC0gIlRFUk09JFRFUk0iIFBBVEg9IiRQQVRIIiBMT0dJTl9QUkVfU1VJRF9TQ1JJUFQ9IiRQV0QvbG9naW4uc2giIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitnZXR0eSAiJGJhdWQiICIkdHR5IiAiJFRFUk0iCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9ncG0vcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ3BtL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMTNmZGNkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ3BtL3J1bgpAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgPC9kZXYvbnVsbAorCit1c2VyPXJvb3QKK29wdGlvbnM9Ii1EIC0yIC1tIC9kZXYvcHNhdXggLXQgcHMyIgorI29wdGlvbnM9Ii1EIC0yIC1tIC9kZXYvdHR5UzAgLXQgYmFyZSIKKworZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK2dwbSAkb3B0aW9ucwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvbG9nL3J1biBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL2xvZy9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYwZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL2xvZy9ydW4KQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisKK3VzZXI9bG9nZ2VyCisKK2xvZ2Rpcj0iL3Zhci9sb2cvc2VydmljZS9gKGNkIC4uO2Jhc2VuYW1lICRQV0QpYCIKK21rZGlyIC1wICIkbG9nZGlyIiAyPi9kZXYvbnVsbAorY2hvd24gLVIgIiR1c2VyIjogIiRsb2dkaXIiCitjaG1vZCAtUiBnby1yd3hzdCx1K3J3WCAiJGxvZ2RpciIKK3JtIGxvZ2RpcgorbG4gLXMgIiRsb2dkaXIiIGxvZ2RpcgorCisjIG1ha2UgdGhpcyBkaXIgYWNjZXNzaWJsZSB0byBsb2dnZXIKK2NobW9kIGErclggLgorCitleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3N2bG9nZCAtdHQgIiRsb2dkaXIiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9wX2xvZyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3BfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNTIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9wX2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQorY2F0IEAqIGN1cnJlbnQgfCAkUEFHRVIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3J1biBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZjg4NjliCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvcnVuCkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaAorCisjZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgPC9kZXYvbnVsbAorCit1c2VyPXd3dwordXNlcj1yb290CisKK2VjaG8gIiogU3RhcnRpbmcgdGNwc3ZkIGZvciBodHRwZCBbJCRdIgorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3RjcHN2ZCBcCisgIC12IC1FIC1sIGxvY2FsaG9zdCAtYyA1IFwKKyAgMCA4OCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitodHRwZCAtdnZ2IC1pIC1oIC9wdWIvaHR0cGRfcm9vdApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvd19sb2cgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC93X2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTM2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvd19sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK3dhdGNoIC1uMiAndz1gdHR5c2l6ZSB3YDsgaD1gdHR5c2l6ZSBoYDsgdGFpbCAtJCgoaC0zKSkgY3VycmVudCAyPiYxIHwgY3V0IC1iMS0kKCh3LTIpKScKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvaWZwbHVnZF9oYW5kbGVyIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9pZnBsdWdkX2hhbmRsZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDk2MmZjZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvaWZwbHVnZF9oYW5kbGVyCkBAIC0wLDAgKzEsMTUgQEAKKyMhL2Jpbi9zaAorIyBwYXJhbWV0ZXJzOgorIyAkMTogaW50ZXJmYWNlCisjICQyOiBzdGF0ZQorCitpZiB0ZXN0IC1kICIvdmFyL3NlcnZpY2UvZGhjcF8kMSI7IHRoZW4KKwlpZiB0ZXN0IHgiJDIiID0geCJkb3duIjsgdGhlbgorCQllY2hvICJEb3duaW5nIC92YXIvc2VydmljZS9kaGNwXyQxIgorCQlzdiBkICIvdmFyL3NlcnZpY2UvZGhjcF8kMSIKKwlmaQorCWlmIHRlc3QgeCIkMiIgPSB4InVwIjsgdGhlbgorCQllY2hvICJVcHBpbmcgL3Zhci9zZXJ2aWNlL2RoY3BfJDEiCisJCXN2IHUgIi92YXIvc2VydmljZS9kaGNwXyQxIgorCWZpCitmaQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9sb2cvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9sb2cvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MGQxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL2xvZy9ydW4KQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisKK3VzZXI9bG9nZ2VyCisKK2xvZ2Rpcj0iL3Zhci9sb2cvc2VydmljZS9gKGNkIC4uO2Jhc2VuYW1lICRQV0QpYCIKK21rZGlyIC1wICIkbG9nZGlyIiAyPi9kZXYvbnVsbAorY2hvd24gLVIgIiR1c2VyIjogIiRsb2dkaXIiCitjaG1vZCAtUiBnby1yd3hzdCx1K3J3WCAiJGxvZ2RpciIKK3JtIGxvZ2RpcgorbG4gLXMgIiRsb2dkaXIiIGxvZ2RpcgorCisjIG1ha2UgdGhpcyBkaXIgYWNjZXNzaWJsZSB0byBsb2dnZXIKK2NobW9kIGErclggLgorCitleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3N2bG9nZCAtdHQgIiRsb2dkaXIiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL3BfbG9nIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9wX2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjUyMWJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9wX2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQorY2F0IEAqIGN1cnJlbnQgfCAkUEFHRVIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc4MWNmOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvcnVuCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorCisjZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgPC9kZXYvbnVsbAorCitwd2Q9IiRQV0QiCisKK2lmPSIke1BXRCMjKi9pZnBsdWdkX30iCisKK2VjaG8gIiogU3RhcnRpbmcgaWZwbHVnZCBvbiAkaWYgWyQkXSIKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgcm9vdCBcCitpZnBsdWdkIC1hcHFucyAtdDMgLXU4IC1kOCAtaSAiJGlmIiAtciAiJHB3ZC9pZnBsdWdkX2hhbmRsZXIiCisKKyMgV2UgdXNlIC10MyB0byB3YWtlIGlmcGx1Z2QgdXAgbGVzcyBvZnRlbi4KKyMgSWYgYWZ0ZXIgdGhyZWUgdGVzdHMgKDMqMz05ID4gOCkgbGluayBzdGF0ZSBzZWVuIHRvIGJlIGRpZmZlcmVudCwKKyMgdGhlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQuCisjIElPVzogc2hvcnQgbGluayBsb3NzZXMgd2lsbCBiZSBpZ25vcmVkLCBsb25nZXIgb25lcworIyB3aWxsIHRyaWdnZXIgREhDUCByZWNvbmZpZ3VyYXRpb24gYW5kIHN1Y2ggKHNlZSBoYW5kbGVyIGNvZGUpLgorCisjLWEgICAgICAgRG8gbm90IHVwIGludGVyZmFjZSBhdXRvbWF0aWNhbGx5CisjLXAgICAgICAgRG9udCBydW4gc2NyaXB0IG9uIGRhZW1vbiBzdGFydHVwCisjLXEgICAgICAgRG9udCBydW4gc2NyaXB0IG9uIGRhZW1vbiBxdWl0CisjLW4gICAgICAgRG8gbm90IGRhZW1vbml6ZQorIy1zICAgICAgIERvIG5vdCBsb2cgdG8gc3lzbG9nCisjLXQgU0VDUyAgUG9sbCB0aW1lIGluIHNlY29uZHMKKyMtdSBTRUNTICBEZWxheSBiZWZvcmUgcnVubmluZyBzY3JpcHQgYWZ0ZXIgbGluayB1cAorIy1kIFNFQ1MgIERlbGF5IGFmdGVyIGxpbmsgZG93bgorIy1pIElGQUNFIEludGVyZmFjZQorIy1yIFBST0cgIFNjcmlwdCB0byBydW4KKyMtZi8tRiAgICBUcmVhdCBsaW5rIGRldGVjdGlvbiBlcnJvciBhcyBsaW5rIGRvd24vbGluayB1cCAob3RoZXJ3aXNlIGV4aXQgb24gZXJyb3IpCisjLU0gICAgICAgTW9uaXRvciBjcmVhdGlvbi9kZXN0cnVjdGlvbiBvZiBpbnRlcmZhY2UgKG90aGVyd2lzZSBpdCBtdXN0IGV4aXN0KQorIy14IEFSRyAgIEV4dHJhIGFyZ3VtZW50IGZvciBzY3JpcHQKKyMtSSAgICAgICBEb250IGV4aXQgb24gbm9uemVybyBleGl0IGNvZGUgZnJvbSBzY3JpcHQKKyMtbCAgICAgICBSdW4gc2NyaXB0IG9uIHN0YXJ0dXAgZXZlbiBpZiBubyBjYWJsZSBpcyBkZXRlY3RlZAorIy1tIE1PREUgIEFQSSBtb2RlIChtaWksIHByaXYsIGV0aHRvb2wsIHdsYW4sIGF1dG8pCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL3dfbG9nIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi93X2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTM2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi93X2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQord2F0Y2ggLW4yICd3PWB0dHlzaXplIHdgOyBoPWB0dHlzaXplIGhgOyB0YWlsIC0kKChoLTMpKSBjdXJyZW50IDI+JjEgfCBjdXQgLWIxLSQoKHctMikpJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvaW5ldGQuY29uZiBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL2luZXRkLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmMTUxYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL2luZXRkLmNvbmYKQEAgLTAsMCArMSwxOCBAQAorIyBbQUREUjpdc2VydmljZV9uYW1lICAgICAgICAgICBtdXN0IGJlIGluIC9ldGMvc2VydmljZXMsIG9yIHBvcnQgbnVtYmVyCisjIHNvY2tldF90eXBlICAgICAgICAgICAgICAgICAgIHN0cmVhbS9kZ3JhbS9yYXcvcmRtL3NlcXBhY2tldAorIyBwcm90b2NvbCAgICAgICAgICAgICAgICAgICAgICB0Y3AvdWRwCisjIHdhaXQvbm93YWl0Wy5tYXhdICAgICAgICAgICAgIHdhaXQgaXMgdXN1YWxseSBmb3IgdWRwLCBub3dhaXQgZm9yIHRjcAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IG1heCBjb3BpZXMgdG8gcnVuCisjIHVzZXJbLmdyb3VwXSBvciB1c2VyWzpncm91cF0gIHVzZXIgYW5kIGdyb3VwIHRvIHJ1biB1bmRlcgorIyBiaW5hcnkgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIHRvIHJ1bgorIyBhcmcwIGFyZzEgYXJnMi4uLiAgICAgICAgICAgICBhcmd1bWVudHMsIElOQ0xVRElORyBwcm9ncmFtIG5hbWUgKGFyZzApCisKKyMgc2Vydglzb2NrZXQgcHJvICB3L253ICAgdXNlciBiaW5hcnkgYXJncworCisjIElQdjYKKzU1NQlkZ3JhbSAgdWRwNiB3YWl0ICAgcm9vdCBlY2hvIGVjaG8gSGVsbG8gSVB2NiB1ZHAgd29ybGQKKyMgLi4ud2l0aCBBRERSIHByZWZpeDoKKzo6MTo0NDQJc3RyZWFtIHRjcDYgbm93YWl0IHJvb3QgZWNobyBlY2hvIEhlbGxvIElQdjYgbG9jYWxob3N0CisKKyMgUmFyZWx5IHNlZW4gY2FzZTogdGNwICp3YWl0KiBzZXJ2aWNlCit0ZWxuZXQJc3RyZWFtIHRjcCAgd2FpdCAgIHJvb3QgdGVsbmV0ZCB0ZWxuZXRkIC13MTAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL2xvZy9ydW4gYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9sb2cvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MGQxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9sb2cvcnVuCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCit1c2VyPWxvZ2dlcgorCitsb2dkaXI9Ii92YXIvbG9nL3NlcnZpY2UvYChjZCAuLjtiYXNlbmFtZSAkUFdEKWAiCitta2RpciAtcCAiJGxvZ2RpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlciI6ICIkbG9nZGlyIgorY2htb2QgLVIgZ28tcnd4c3QsdStyd1ggIiRsb2dkaXIiCitybSBsb2dkaXIKK2xuIC1zICIkbG9nZGlyIiBsb2dkaXIKKworIyBtYWtlIHRoaXMgZGlyIGFjY2Vzc2libGUgdG8gbG9nZ2VyCitjaG1vZCBhK3JYIC4KKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitzdmxvZ2QgLXR0ICIkbG9nZGlyIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvcF9sb2cgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9wX2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjUyMWJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9ydW4gYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTEwYzFiMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3J1bgpAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKworZWNobyAiKiBTdGFydGluZyBpbmV0ZCBbJCRdIgorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK2luZXRkIC1mIC1lICIkUFdEL2luZXRkLmNvbmYiCisKKyMgaW5ldGQgWy1mXSBbLXEgbGVuXSBbY29uZl0KKyMgLWYgICAgICBSdW4gaW4gZm9yZWdyb3VuZAorIyAtZSAgICAgIExvZyB0byBzdGRlcnIgKGRlZmF1bHQgaXMgc3lzbG9nKQorIyAtcSBOICAgIFNldCB0aGUgc2l6ZSBvZiB0aGUgc29ja2V0IGxpc3RlbiBxdWV1ZSB0byBOCisjICAgICAgICAgKGRlZmF1bHQ6IDEyOCkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3dfbG9nIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvd19sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3dfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCit3YXRjaCAtbjIgJ3c9YHR0eXNpemUgd2A7IGg9YHR0eXNpemUgaGA7IHRhaWwgLSQoKGgtMykpIGN1cnJlbnQgMj4mMSB8IGN1dCAtYjEtJCgody0yKSknCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9ubWV0ZXIvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2Uvbm1ldGVyL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZTUxMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2Uvbm1ldGVyL3J1bgpAQCAtMCwwICsxLDIwIEBACisjIS9iaW4vc2gKKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgPC9kZXYvbnVsbAorCisjIFNpbmNlIHBlci1wcm9jZXNzIC9wcm9jL25ldC8gKC0+IC9wcm9jL3NlbGYvbmV0LykgYXBwZWFyZWQsCisjIHdlIG5lZWQgdG8gYmUgcm9vdAordXNlcj0icm9vdCIKK3R0eT0iL2Rldi90dHk5IgorY21kPSJubWV0ZXIgJyV0ICVjIHggJXggcCVwIGYgJWYgYiAlYiBtICVtIGlmJVtuaWZdJyIKKworY2htb2QgLVIgYStYIC4gIyBvciBlbHNlIGVudiB3aWxsIG1vYW4KK2Nob3duICIkdXNlciI6ICIkdHR5IiAjIGRldmZzIG1hZGUgaGFwcHkKKworZXZhbCBleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCis8IiR0dHkiID4iJHR0eSIgMj4mMSBcCiskY21kCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL2xvZy9ydW4gYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL2xvZy9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYwZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvbG9nL3J1bgpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKKwordXNlcj1sb2dnZXIKKworbG9nZGlyPSIvdmFyL2xvZy9zZXJ2aWNlL2AoY2QgLi47YmFzZW5hbWUgJFBXRClgIgorbWtkaXIgLXAgIiRsb2dkaXIiIDI+L2Rldi9udWxsCitjaG93biAtUiAiJHVzZXIiOiAiJGxvZ2RpciIKK2NobW9kIC1SIGdvLXJ3eHN0LHUrcndYICIkbG9nZGlyIgorcm0gbG9nZGlyCitsbiAtcyAiJGxvZ2RpciIgbG9nZGlyCisKKyMgbWFrZSB0aGlzIGRpciBhY2Nlc3NpYmxlIHRvIGxvZ2dlcgorY2htb2QgYStyWCAuCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorc3Zsb2dkIC10dCAiJGxvZ2RpciIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvbnRwLnNjcmlwdCBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvbnRwLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NmMzNGJmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9udHAuc2NyaXB0CkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBwcm92aXNpb24gdG8gcHJldmVudCBzZXZlcmFsIGNvcGllcyBvZiB0aGUgc2NyaXB0CisjIHRvIGJlIHJ1biBpbiBxdWljayBzdWNjZXNzaW9uLiBJbiBmYWN0LCBpdCBoYXBwZW5zIHJhdGhlciBvZnRlbgorIyBpZiBpbml0aWFsIHN5bmNyb25pemF0aW9uIHJlc3VsdHMgaW4gYSBzdGVwLgorIyBZb3Ugd2lsbCBzZWUgInN0ZXAiIGFuZCB0aGVuICJzdHJhdHVtIiBzY3JpcHQgcnVucywgc29tZXRpbWVzCisjIGFzIGNsb3NlIGFzIG9ubHkgMC4wMDIgc2Vjb25kcyBhcGFydC4KKyMKKyMgU2NyaXB0IHNob3VsZCBiZSByZWFkeSB0byBkZWFsIHdpdGggdGhpcy4KKworZHQ9YGRhdGUgJyslWS0lbS0lZCAlSDolTTolUydgCisKK2lmIHRlc3QgeCIkc3RyYXR1bSIgIT0geCIiIFwKKyYmIHRlc3QgeCIkcG9sbF9pbnRlcnZhbCIgIT0geCIiIFwKKyYmIHRlc3QgNCAtZ2UgIiRzdHJhdHVtIiBcCismJiB0ZXN0IDEyOCAtbGUgIiRwb2xsX2ludGVydmFsIiBcCis7IHRoZW4KKwllY2hvICJgdGFpbCAtbiAxOTkgLS0gIiQwLmxvZyIgMj4vZGV2L251bGxgIiA+IiQwLmxvZy4kJCIKKwllY2hvICIkZHQ6ICQxIlwKKwkJImZyZXFfZHJpZnRfcHBtPSRmcmVxX2RyaWZ0X3BwbSJcCisJCSJvZmZzZXQ9JG9mZnNldCJcCisJCSJzdHJhdHVtPSRzdHJhdHVtIlwKKwkJInBvbGxfaW50ZXJ2YWw9JHBvbGxfaW50ZXJ2YWwsIlwKKwkJInNldHRpbmcgaGFyZHdhcmUgY2xvY2siXAorCQk+PiIkMC5sb2cuJCQiCisJbXYgLS0gIiQwLmxvZy4kJCIgIiQwLmxvZyIKKwlleGVjIGh3Y2xvY2sgLS1zeXN0b2hjCitmaQorCitlY2hvICJgdGFpbCAtbiAxOTkgLS0gIiQwLmxvZyIgMj4vZGV2L251bGxgIiA+IiQwLmxvZy4kJCIKK2VjaG8gIiRkdDogJDEiXAorCSJmcmVxX2RyaWZ0X3BwbT0kZnJlcV9kcmlmdF9wcG0iXAorCSJvZmZzZXQ9JG9mZnNldCJcCisJInN0cmF0dW09JHN0cmF0dW0iXAorCSJwb2xsX2ludGVydmFsPSRwb2xsX2ludGVydmFsIlwKKwk+PiIkMC5sb2cuJCQiCittdiAtLSAiJDAubG9nLiQkIiAiJDAubG9nIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9wX2xvZyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3J1biBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4MWQyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3J1bgpAQCAtMCwwICsxLDYwIEBACisjIS9iaW4vYmFzaAorIyAodXNpbmcgYmFzaGlzbSAoYXJyYXlzKSBpbiBkaGNwIGNvbmZpZykKKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj1yb290Citwb29sPSJ1cy5wb29sLm50cC5vcmciICMgcmVwbGFjZSAidXMiIHdpdGggeW91ciBjb3VudHJ5IGNvZGUKKworc2VydmljZT0iJHtQV0QjIyovfSIKK3J1bmRpcj0iL3Zhci9ydW4vc2VydmljZS8kc2VydmljZSIKK2RlZmF1bHRfcF9vcHQ9Ii1wIDAuJHBvb2wgLXAgMS4kcG9vbCAtcCAyLiRwb29sIC1wIDMuJHBvb2wiCisKKworIyBNYWtlIHN1cmUgcnVuZGlyLyBleGlzdHMKK21rZGlyIC1wICIkcnVuZGlyIiAyPi9kZXYvbnVsbAorY2hvd24gLVIgIiR1c2VyOiIgIiRydW5kaXIiCitjaG1vZCAtUiBhPXJYICIkcnVuZGlyIgorcm0gLXJmIHJ1bmRpciAyPi9kZXYvbnVsbAorbG4gLXMgIiRydW5kaXIiIHJ1bmRpcgorCisKK2VjaG8gIiogQ2hlY2tpbmcgbmV0d29yayIKK3Rlc3QgLWYgL3Zhci9ydW4vc2VydmljZS9mdy91cCB8fCBleGVjIHNsZWVwIDcKK3NsZWVwIDUgICMgdG8gbGV0IGl0IHNldHRsZQorCisjIEdyYWIgY29uZmlnIGZyb20gZGhjcAorY2ZnPS0xCitmb3IgZiBpbiBydW5kaXIvKi5udHBjb25mOyBkbworICAgICAgICB0ZXN0IC1mICIkZiIgfHwgY29udGludWUKKyAgICAgICAgLiAiJGYiCitkb25lCisKKyMgU2VsZWN0IHBlZXJzCitwX29wdD0iIgorY2ZnPTAKK3doaWxlIHRlc3QgeCIke250cGlwWyRjZmddfSIgIT0geCIiOyBkbworICAgICAgICBwX29wdD0iJHBfb3B0IC1wICR7bnRwaXBbJGNmZ119IgorICAgICAgICBsZXQgY2ZnPWNmZysxCitkb25lCit0ZXN0IHgiJHBfb3B0IiA9PSB4IiIgJiYgcF9vcHQ9IiRkZWZhdWx0X3Bfb3B0IgorCitpZiB0ZXN0IHgiJHBfb3B0IiA9PSB4IiI7IHRoZW4KKwllY2hvICIqIE5vIE5UUCBwZWVycyBjb25maWd1cmVkLCBzdG9wcGluZyIKKwlzdiBvIC4KKwlleGVjIHNsZWVwIDEKK2ZpCisKKworIyBMZXQgb3RoZXJzIGtub3cgdGhhdCB3ZSBhcmUgdXAKK2RhdGUgJyslWS0lbS0lZCAlSDolTTolUyAlWicgPnJ1bmRpci91cAorCisjIEdvIGdvIGdvCitlY2hvICIqIFN0YXJ0aW5nIG50cGRbJCRdIgorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK250cGQgLWRkbk5sIC1TIC4vbnRwLnNjcmlwdCAkcF9vcHQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvd19sb2cgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3dfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhMzZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3dfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCit3YXRjaCAtbjIgJ3c9YHR0eXNpemUgd2A7IGg9YHR0eXNpemUgaGA7IHRhaWwgLSQoKGgtMykpIGN1cnJlbnQgMj4mMSB8IGN1dCAtYjEtJCgody0yKSknCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC9sb2cvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjBkMWIxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvbG9nL3J1bgpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKKwordXNlcj1sb2dnZXIKKworbG9nZGlyPSIvdmFyL2xvZy9zZXJ2aWNlL2AoY2QgLi47YmFzZW5hbWUgJFBXRClgIgorbWtkaXIgLXAgIiRsb2dkaXIiIDI+L2Rldi9udWxsCitjaG93biAtUiAiJHVzZXIiOiAiJGxvZ2RpciIKK2NobW9kIC1SIGdvLXJ3eHN0LHUrcndYICIkbG9nZGlyIgorcm0gbG9nZGlyCitsbiAtcyAiJGxvZ2RpciIgbG9nZGlyCisKKyMgbWFrZSB0aGlzIGRpciBhY2Nlc3NpYmxlIHRvIGxvZ2dlcgorY2htb2QgYStyWCAuCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorc3Zsb2dkIC10dCAiJGxvZ2RpciIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3BfbG9nIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3BfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCitjYXQgQCogY3VycmVudCB8ICRQQUdFUgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvcnVuIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0OTJkODQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC9ydW4KQEAgLTAsMCArMSwxNSBAQAorIyEvYmluL3NoCisKKyNleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK3VzZXI9cm9vdCAjIGZvciBiaW5kIHRvIHBvcnQgNjkKKworZXhlYyBcCitlbnYgLSBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAordWRwc3ZkIC12IC1jIDEwIC1sIGxvY2FsaG9zdCBcCisgIDAgNjkgXAordGZ0cGQgL3B1Yi90ZnRwZF9yb290CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC93X2xvZyBiL2J1c3lib3gtMS4xOS4zL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3dfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhMzZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC93X2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQord2F0Y2ggLW4yICd3PWB0dHlzaXplIHdgOyBoPWB0dHlzaXplIGhgOyB0YWlsIC0kKChoLTMpKSBjdXJyZW50IDI+JjEgfCBjdXQgLWIxLSQoKHctMikpJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvemNpcC5zY3JpcHQgYi9idXN5Ym94LTEuMTkuMy9leGFtcGxlcy96Y2lwLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNTQzYzMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZXhhbXBsZXMvemNpcC5zY3JpcHQKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL3NoCisKKyMgb25seSBmb3IgdXNlIGFzIGEgInpjaXAiIGNhbGxiYWNrIHNjcmlwdAoraWYgWyAieCRpbnRlcmZhY2UiID0geCBdCit0aGVuCisJZXhpdCAxCitmaQorCisjIHpjaXAgc2hvdWxkIHN0YXJ0IG9uIGJvb3QvcmVzdW1lIGFuZCB2YXJpb3VzIG1lZGlhIGNoYW5nZXMKK2Nhc2UgIiQxIiBpbgoraW5pdCkKKwkjIGZvciBub3csIHpjaXAgcmVxdWlyZXMgdGhlIGxpbmsgdG8gYmUgYWxyZWFkeSB1cCwKKwkjIGFuZCBpdCBkcm9wcyBsaW5rcyB3aGVuIHRoZXkgZ28gZG93bi4gIHRoYXQgaXNuJ3QKKwkjIHRoZSBtb3N0IHJvYnVzdCBtb2RlbC4uLgorCWV4aXQgMAorCTs7Citjb25maWcpCisJaWYgWyAieCRpcCIgPSB4IF0KKwl0aGVuCisJCWV4aXQgMQorCWZpCisJIyByZW1lbWJlciAkaXAgZm9yICRpbnRlcmZhY2UsIHRvIHVzZSBvbiByZXN0YXJ0CisJaWYgWyAieCRpcCIgIT0geCAtYSAtdyAiJGlwLiRpbnRlcmZhY2UiIF0KKwl0aGVuCisJCWVjaG8gJGlwID4gIiRpcC4kaW50ZXJmYWNlIgorCWZpCisJZXhlYyBpcCBhZGRyZXNzIGFkZCBkZXYgJGludGVyZmFjZSBcCisJCXNjb3BlIGxpbmsgbG9jYWwgIiRpcC8xNiIgYnJvYWRjYXN0ICsKKwk7OworZGVjb25maWcpCisJaWYgWyB4JGlwID0geCBdCisJdGhlbgorCQlleGl0IDEKKwlmaQorCWV4ZWMgaXAgYWRkcmVzcyBkZWwgZGV2ICRpbnRlcmZhY2UgbG9jYWwgJGlwCisJOzsKK2VzYWMKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZmluZHV0aWxzL0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9maW5kdXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3MWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvZmluZHV0aWxzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSwxMCBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiRmluZGluZyBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9maW5kdXRpbHMvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL2ZpbmR1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGZiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9maW5kdXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDkgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZmluZHV0aWxzL2ZpbmQuYyBiL2J1c3lib3gtMS4xOS4zL2ZpbmR1dGlscy9maW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwZmM1YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2ZpbmR1dGlscy9maW5kLmMKQEAgLTAsMCArMSwxMjkwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGZpbmQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogUmV3b3JrZWQgYnkgRGF2aWQgRG91dGhpdHQgPG45dWJoQGNhbGxzaWduLm5ldD4gYW5kCisgKiAgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBmaW5kdXRpbHMtNC4xLjIwOgorICoKKyAqICMgZmluZCBmaWxlLnR4dCAtZXhlYyAnZWNobyB7fScgJ3t9ICB7fScgJzsnCisgKiBmaW5kOiBlY2hvIGZpbGUudHh0OiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgKiAjIGZpbmQgZmlsZS50eHQgLWV4ZWMgJ2VjaG8nICd7fSAge30nICc7ICcKKyAqIGZpbmQ6IG1pc3NpbmcgYXJndW1lbnQgdG8gYC1leGVjJworICogIyBmaW5kIGZpbGUudHh0IC1leGVjICdlY2hvIHt9JyAne30gIHt9JyAnOycganVuaworICogZmluZDogcGF0aHMgbXVzdCBwcmVjZWRlIGV4cHJlc3Npb24KKyAqICMgZmluZCBmaWxlLnR4dCAtZXhlYyAnZWNobyB7fScgJ3t9ICB7fScgJzsnIGp1bmsgJzsnCisgKiBmaW5kOiBwYXRocyBtdXN0IHByZWNlZGUgZXhwcmVzc2lvbgorICogIyBmaW5kIGZpbGUudHh0IC1leGVjICdlY2hvJyAne30gIHt9JyAnOycKKyAqIGZpbGUudHh0ICBmaWxlLnR4dAorICogKHN0cmFjZTogZXhlY3ZlKCIvYmluL2VjaG8iLCBbImVjaG8iLCAiZmlsZS50eHQgIGZpbGUudHh0Il0sIFsgMzAgdmFycyBdKSkKKyAqICMgZmluZCBmaWxlLnR4dCAtZXhlYyAnZWNobycgJ3t9ICB7fScgJzsnIC1wcmludCAtZXhlYyBwd2QgJzsnCisgKiBmaWxlLnR4dCAgZmlsZS50eHQKKyAqIGZpbGUudHh0CisgKiAvdG1wCisgKiAjIGZpbmQgLW5hbWUgJyouYycgLW8gLW5hbWUgJyouaCcKKyAqIFtzaG93cyBmaWxlcywgKi5jIGFuZCAqLmggaW50ZXJtaXhlZF0KKyAqICMgZmluZCBmaWxlLnR4dCAtbmFtZSAnKmYqJyAtbyAtbmFtZSAnKnQqJworICogZmlsZS50eHQKKyAqICMgZmluZCBmaWxlLnR4dCAtbmFtZSAnKnoqJyAtbyAtbmFtZSAnKnQqJworICogZmlsZS50eHQKKyAqICMgZmluZCBmaWxlLnR4dCAtbmFtZSAnKmYqJyAtbyAtbmFtZSAnKnoqJworICogZmlsZS50eHQKKyAqCisgKiAjIGZpbmQgdCB6IC1uYW1lICcqdConIC1wcmludCAtbyAtbmFtZSAnKnoqJworICogdAorICogIyBmaW5kIHQgeiB0IHogLW5hbWUgJyp0KicgLW8gLW5hbWUgJyp6KicgLXByaW50CisgKiB6CisgKiB6CisgKiAjIGZpbmQgdCB6IHQgeiAnKCcgLW5hbWUgJyp0KicgLW8gLW5hbWUgJyp6KicgJyknIC1vIC1wcmludAorICogKG5vIG91dHB1dCkKKyAqLworCisvKiBUZXN0aW5nIHNjcmlwdAorICogLi9idXN5Ym94IGZpbmQgIiRAIiB8IHRlZSAvdG1wL2JiX2ZpbmQKKyAqIGVjaG8gPT09PT09PT09PT09PT09PT09CisgKiAvcGF0aC90by9nbnUvZmluZCAiJEAiIHwgdGVlIC90bXAvc3RkX2ZpbmQKKyAqIGVjaG8gPT09PT09PT09PT09PT09PT09CisgKiBkaWZmIC11IC90bXAvc3RkX2ZpbmQgL3RtcC9iYl9maW5kICYmIGVjaG8gSWRlbnRpY2FsCisgKi8KKworLy9jb25maWc6Y29uZmlnIEZJTkQKKy8vY29uZmlnOglib29sICJmaW5kIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGZpbmQgaXMgdXNlZCB0byBzZWFyY2ggeW91ciBzeXN0ZW0gdG8gZmluZCBzcGVjaWZpZWQgZmlsZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUFJJTlQwCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1wcmludDA6IE5VTC10ZXJtaW5hdGVkIG91dHB1dCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDYXVzZXMgb3V0cHV0IG5hbWVzIHRvIGJlIHNlcGFyYXRlZCBieSBhIE5VTCBjaGFyYWN0ZXIKKy8vY29uZmlnOgkgIHJhdGhlciB0aGFuIGEgbmV3bGluZS4gVGhpcyBhbGxvd3MgbmFtZXMgdGhhdCBjb250YWluCisvL2NvbmZpZzoJICBuZXdsaW5lcyBhbmQgb3RoZXIgd2hpdGVzcGFjZSB0byBiZSBtb3JlIGVhc2lseQorLy9jb25maWc6CSAgaW50ZXJwcmV0ZWQgYnkgb3RoZXIgcHJvZ3JhbXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfTVRJTUUKKy8vY29uZmlnOglib29sICJFbmFibGUgLW10aW1lOiBtb2RpZmllZCB0aW1lIG1hdGNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEFsbG93IHNlYXJjaGluZyBiYXNlZCBvbiB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YKKy8vY29uZmlnOgkgIGZpbGVzLCBpbiBkYXlzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX01NSU4KKy8vY29uZmlnOglib29sICJFbmFibGUgLW1taW46IG1vZGlmaWVkIHRpbWUgbWF0Y2hpbmcgYnkgbWludXRlcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBbGxvdyBzZWFyY2hpbmcgYmFzZWQgb24gdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mCisvL2NvbmZpZzoJICBmaWxlcywgaW4gbWludXRlcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9QRVJNCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1wZXJtOiBwZXJtaXNzaW9ucyBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc2VhcmNoaW5nIGJhc2VkIG9uIGZpbGUgcGVybWlzc2lvbnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfVFlQRQorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtdHlwZTogZmlsZSB0eXBlIG1hdGNoaW5nIChmaWxlL2Rpci9saW5rLy4uLikiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHNlYXJjaGluZyBiYXNlZCBvbiBmaWxlIHR5cGUgKGZpbGUsCisvL2NvbmZpZzoJICBkaXJlY3RvcnksIHNvY2tldCwgZGV2aWNlLCBldGMuKS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9YREVWCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC14ZGV2OiAnc3RheSBpbiBmaWxlc3lzdGVtJyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIG9wdGlvbiBhbGxvd3MgZmluZCB0byByZXN0cmljdCBzZWFyY2hlcyB0byBhIHNpbmdsZSBmaWxlc3lzdGVtLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX01BWERFUFRICisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1taW5kZXB0aCBOIGFuZCAtbWF4ZGVwdGggTiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIG9wdGlvbiBlbmFibGVzIC1taW5kZXB0aCBOIGFuZCAtbWF4ZGVwdGggTiBvcHRpb24uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfTkVXRVIKKy8vY29uZmlnOglib29sICJFbmFibGUgLW5ld2VyOiBjb21wYXJlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1uZXdlcicgb3B0aW9uIGZvciBmaW5kaW5nIGFueSBmaWxlcyB3aGljaCBoYXZlCisvL2NvbmZpZzoJICBtb2RpZmljYXRpb24gdGltZSB0aGF0IGlzIG1vcmUgcmVjZW50IHRoYW4gdGhlIHNwZWNpZmllZCBGSUxFLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX0lOVU0KKy8vY29uZmlnOglib29sICJFbmFibGUgLWludW06IGlub2RlIG51bWJlciBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtaW51bScgb3B0aW9uIGZvciBzZWFyY2hpbmcgYnkgaW5vZGUgbnVtYmVyLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX0VYRUMKKy8vY29uZmlnOglib29sICJFbmFibGUgLWV4ZWM6IGV4ZWN1dGUgY29tbWFuZHMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCB0aGUgJ2ZpbmQgLWV4ZWMnIG9wdGlvbiBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzIGJhc2VkIHVwb24KKy8vY29uZmlnOgkgIHRoZSBmaWxlcyBtYXRjaGVkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1VTRVIKKy8vY29uZmlnOglib29sICJFbmFibGUgLXVzZXI6IHVzZXJuYW1lL3VpZCBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtdXNlcicgb3B0aW9uIGZvciBzZWFyY2hpbmcgYnkgdXNlcm5hbWUgb3IgdWlkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX0dST1VQCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1ncm91cDogZ3JvdXAvZ2lkIG1hdGNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1ncm91cCcgb3B0aW9uIGZvciBzZWFyY2hpbmcgYnkgZ3JvdXAgbmFtZSBvciBnaWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfTk9UCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHRoZSAnbm90JyAoISkgb3BlcmF0b3IiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCB0aGUgJyEnIG9wZXJhdG9yIHRvIGludmVydCB0aGUgdGVzdCByZXN1bHRzLgorLy9jb25maWc6CSAgSWYgJ0VuYWJsZSBmdWxsLWJsb3duIGRlc2t0b3AnIGlzIGVuYWJsZWQsIHRoZW4gd2lsbCBhbHNvIHN1cHBvcnQKKy8vY29uZmlnOgkgIHRoZSBub24tUE9TSVggbm90YXRpb24gJy1ub3QnLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX0RFUFRICisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1kZXB0aCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBQcm9jZXNzIGVhY2ggZGlyZWN0b3J5J3MgY29udGVudHMgYmVmb3JlIHRoZSBkaXJlY3RvcnkgaXRzZWxmLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1BBUkVOCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHBhcmVucyBpbiBvcHRpb25zIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSB1c2FnZSBvZiBwYXJlbnMgJygnIHRvIHNwZWNpZnkgbG9naWNhbCBvcmRlciBvZiBhcmd1bWVudHMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfU0laRQorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtc2l6ZTogZmlsZSBzaXplIG1hdGNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1zaXplJyBvcHRpb24gZm9yIHNlYXJjaGluZyBieSBmaWxlIHNpemUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUFJVTkUKKy8vY29uZmlnOglib29sICJFbmFibGUgLXBydW5lOiBleGNsdWRlIHN1YmRpcmVjdG9yaWVzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5LCBkb250IGRlc2NlbmQgaW50byBpdC4gVXNlZnVsIGZvcgorLy9jb25maWc6CSAgZXhjbHVzaW9uIC5zdm4gYW5kIENWUyBkaXJlY3Rvcmllcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9ERUxFVEUKKy8vY29uZmlnOglib29sICJFbmFibGUgLWRlbGV0ZTogZGVsZXRlIGZpbGVzL2RpcnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5EICYmIEZFQVRVUkVfRklORF9ERVBUSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1kZWxldGUnIG9wdGlvbiBmb3IgZGVsZXRpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorLy9jb25maWc6CSAgV0FSTklORzogVGhpcyBvcHRpb24gY2FuIGRvIG11Y2ggaGFybSBpZiB1c2VkIHdyb25nLiBCdXN5Ym94IHdpbGwgbm90CisvL2NvbmZpZzoJICB0cnkgdG8gcHJvdGVjdCB0aGUgdXNlciBmcm9tIGRvaW5nIHN0dXBpZCB0aGluZ3MuIFVzZSB3aXRoIGNhcmUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUEFUSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtcGF0aDogbWF0Y2ggcGF0aG5hbWUgd2l0aCBzaGVsbCBwYXR0ZXJuIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoZSAtcGF0aCBvcHRpb24gbWF0Y2hlcyB3aG9sZSBwYXRobmFtZSBpbnN0ZWFkIG9mIGp1c3QgZmlsZW5hbWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUkVHRVgKKy8vY29uZmlnOglib29sICJFbmFibGUgLXJlZ2V4OiBtYXRjaCBwYXRobmFtZSB3aXRoIHJlZ2V4IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoZSAtcmVnZXggb3B0aW9uIG1hdGNoZXMgd2hvbGUgcGF0aG5hbWUgYWdhaW5zdCByZWd1bGFyIGV4cHJlc3Npb24uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfQ09OVEVYVAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtY29udGV4dDogc2VjdXJpdHkgY29udGV4dCBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQgJiYgU0VMSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1jb250ZXh0JyBvcHRpb24gZm9yIG1hdGNoaW5nIHNlY3VyaXR5IGNvbnRleHQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfTElOS1MKKy8vY29uZmlnOglib29sICJFbmFibGUgLWxpbmtzOiBsaW5rIGNvdW50IG1hdGNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1saW5rcycgb3B0aW9uIGZvciBtYXRjaGluZyBudW1iZXIgb2YgbGlua3MuCisKKy8vYXBwbGV0OklGX0ZJTkQoQVBQTEVUX05PRVhFQyhmaW5kLCBmaW5kLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBmaW5kKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZJTkQpICs9IGZpbmQubworCisvL3VzYWdlOiNkZWZpbmUgZmluZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW1BBVEhdLi4uIFtPUFRJT05TXSBbQUNUSU9OU10iCisvL3VzYWdlOiNkZWZpbmUgZmluZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlYXJjaCBmb3IgZmlsZXMgYW5kIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGVtLlxuIgorLy91c2FnZTogICAgICAgIkZpcnN0IGZhaWxlZCBhY3Rpb24gc3RvcHMgcHJvY2Vzc2luZyBvZiBjdXJyZW50IGZpbGUuXG4iCisvL3VzYWdlOiAgICAgICAiRGVmYXVsdHM6IFBBVEggaXMgY3VycmVudCBkaXJlY3RvcnksIGFjdGlvbiBpcyAnLXByaW50J1xuIgorLy91c2FnZTogICAgICJcbgktZm9sbG93CQlGb2xsb3cgc3ltbGlua3MiCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfWERFVigKKy8vdXNhZ2U6ICAgICAiXG4JLXhkZXYJCURvbid0IGRlc2NlbmQgZGlyZWN0b3JpZXMgb24gb3RoZXIgZmlsZXN5c3RlbXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTUFYREVQVEgoCisvL3VzYWdlOiAgICAgIlxuCS1tYXhkZXB0aCBOCURlc2NlbmQgYXQgbW9zdCBOIGxldmVscy4gLW1heGRlcHRoIDAgYXBwbGllcyIKKy8vdXNhZ2U6ICAgICAiXG4JCQlhY3Rpb25zIHRvIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgb25seSIKKy8vdXNhZ2U6ICAgICAiXG4JLW1pbmRlcHRoIE4JRG9uJ3QgYWN0IG9uIGZpcnN0IE4gbGV2ZWxzIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX0RFUFRIKAorLy91c2FnZTogICAgICJcbgktZGVwdGgJCUFjdCBvbiBkaXJlY3RvcnkgKmFmdGVyKiB0cmF2ZXJzaW5nIGl0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5BY3Rpb25zOiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9QQVJFTigKKy8vdXNhZ2U6ICAgICAiXG4JKCBBQ1RJT05TICkJR3JvdXAgYWN0aW9ucyBmb3IgLW8gLyAtYSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9OT1QoCisvL3VzYWdlOiAgICAgIlxuCSEgQUNUCQlJbnZlcnQgQUNUJ3Mgc3VjY2Vzcy9mYWlsdXJlIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbglBQ1QxIFstYV0gQUNUMglJZiBBQ1QxIGZhaWxzLCBzdG9wLCBlbHNlIGRvIEFDVDIiCisvL3VzYWdlOiAgICAgIlxuCUFDVDEgLW8gQUNUMglJZiBBQ1QxIHN1Y2NlZWRzLCBzdG9wLCBlbHNlIGRvIEFDVDIiCisvL3VzYWdlOiAgICAgIlxuCQkJTm90ZTogLWEgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIC1vIgorLy91c2FnZTogICAgICJcbgktbmFtZSBQQVRURVJOCU1hdGNoIGZpbGUgbmFtZSAody9vIGRpcmVjdG9yeSBuYW1lKSB0byBQQVRURVJOIgorLy91c2FnZTogICAgICJcbgktaW5hbWUgUEFUVEVSTglDYXNlIGluc2Vuc2l0aXZlIC1uYW1lIgorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1BBVEgoCisvL3VzYWdlOiAgICAgIlxuCS1wYXRoIFBBVFRFUk4JTWF0Y2ggcGF0aCB0byBQQVRURVJOIgorLy91c2FnZTogICAgICJcbgktaXBhdGggUEFUVEVSTglDYXNlIGluc2Vuc2l0aXZlIC1wYXRoIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1JFR0VYKAorLy91c2FnZTogICAgICJcbgktcmVnZXggUEFUVEVSTglNYXRjaCBwYXRoIHRvIHJlZ2V4IFBBVFRFUk4iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfVFlQRSgKKy8vdXNhZ2U6ICAgICAiXG4JLXR5cGUgWAkJRmlsZSB0eXBlIGlzIFggKG9uZSBvZjogZixkLGwsYixjLC4uLikiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfUEVSTSgKKy8vdXNhZ2U6ICAgICAiXG4JLXBlcm0gTUFTSwlBdCBsZWFzdCBvbmUgbWFzayBiaXQgKCtNQVNLKSwgYWxsIGJpdHMgKC1NQVNLKSwiCisvL3VzYWdlOiAgICAgIlxuCQkJb3IgZXhhY3RseSBNQVNLIGJpdHMgYXJlIHNldCBpbiBmaWxlJ3MgbW9kZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9NVElNRSgKKy8vdXNhZ2U6ICAgICAiXG4JLW10aW1lIERBWVMJbXRpbWUgaXMgZ3JlYXRlciB0aGFuICgrTiksIGxlc3MgdGhhbiAoLU4pLCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlvciBleGFjdGx5IE4gZGF5cyBpbiB0aGUgcGFzdCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9NTUlOKAorLy91c2FnZTogICAgICJcbgktbW1pbiBNSU5TCW10aW1lIGlzIGdyZWF0ZXIgdGhhbiAoK04pLCBsZXNzIHRoYW4gKC1OKSwiCisvL3VzYWdlOiAgICAgIlxuCQkJb3IgZXhhY3RseSBOIG1pbnV0ZXMgaW4gdGhlIHBhc3QiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTkVXRVIoCisvL3VzYWdlOiAgICAgIlxuCS1uZXdlciBGSUxFCW10aW1lIGlzIG1vcmUgcmVjZW50IHRoYW4gRklMRSdzIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX0lOVU0oCisvL3VzYWdlOiAgICAgIlxuCS1pbnVtIE4JCUZpbGUgaGFzIGlub2RlIG51bWJlciBOIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1VTRVIoCisvL3VzYWdlOiAgICAgIlxuCS11c2VyIE5BTUUvSUQJRmlsZSBpcyBvd25lZCBieSBnaXZlbiB1c2VyIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX0dST1VQKAorLy91c2FnZTogICAgICJcbgktZ3JvdXAgTkFNRS9JRAlGaWxlIGlzIG93bmVkIGJ5IGdpdmVuIGdyb3VwIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1NJWkUoCisvL3VzYWdlOiAgICAgIlxuCS1zaXplIE5bYmNrXQlGaWxlIHNpemUgaXMgTiAoYzpieXRlcyxrOmtieXRlcyxiOjUxMiBieXRlcyhkZWYuKSkiCisvL3VzYWdlOiAgICAgIlxuCQkJKy8tTjogZmlsZSBzaXplIGlzIGJpZ2dlci9zbWFsbGVyIHRoYW4gTiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9MSU5LUygKKy8vdXNhZ2U6ICAgICAiXG4JLWxpbmtzIE4JTnVtYmVyIG9mIGxpbmtzIGlzIGdyZWF0ZXIgdGhhbiAoK04pLCBsZXNzIHRoYW4gKC1OKSwiCisvL3VzYWdlOiAgICAgIlxuCQkJb3IgZXhhY3RseSBOIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX0NPTlRFWFQoCisvL3VzYWdlOiAgICAgIlxuCS1jb250ZXh0IENUWAlGaWxlIGhhcyBzcGVjaWZpZWQgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9QUlVORSgKKy8vdXNhZ2U6ICAgICAiXG4JLXBydW5lCQlJZiBjdXJyZW50IGZpbGUgaXMgZGlyZWN0b3J5LCBkb24ndCBkZXNjZW5kIGludG8gaXQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuSWYgbm9uZSBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnMgaXMgc3BlY2lmaWVkLCAtcHJpbnQgaXMgYXNzdW1lZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXByaW50CQlQcmludCBmaWxlIG5hbWUiCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfUFJJTlQwKAorLy91c2FnZTogICAgICJcbgktcHJpbnQwCQlQcmludCBmaWxlIG5hbWUsIE5VTCB0ZXJtaW5hdGVkIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX0VYRUMoCisvL3VzYWdlOiAgICAgIlxuCS1leGVjIENNRCBBUkcgOwlSdW4gQ01EIHdpdGggYWxsIGluc3RhbmNlcyBvZiB7fSByZXBsYWNlZCBieSIKKy8vdXNhZ2U6ICAgICAiXG4JCQlmaWxlIG5hbWUuIEZhaWxzIGlmIENNRCBleGl0cyB3aXRoIG5vbnplcm8iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfREVMRVRFKAorLy91c2FnZTogICAgICJcbgktZGVsZXRlCQlEZWxldGUgY3VycmVudCBmaWxlL2RpcmVjdG9yeS4gVHVybnMgb24gLWRlcHRoIG9wdGlvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmluZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBmaW5kIC8gLW5hbWUgcGFzc3dkXG4iCisvL3VzYWdlOiAgICAgICAiL2V0Yy9wYXNzd2RcbiIKKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUkVHRVgKKyMgaW5jbHVkZSAieHJlZ2V4LmgiCisjZW5kaWYKKy8qIEdOVWlzbTogKi8KKyNpZm5kZWYgRk5NX0NBU0VGT0xECisjIGRlZmluZSBGTk1fQ0FTRUZPTEQgMAorI2VuZGlmCisKKyNkZWZpbmUgZGJnKC4uLikgKCh2b2lkKTApCisvKiAjZGVmaW5lIGRiZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykgKi8KKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCit0eXBlZGVmIGludCAoKmFjdGlvbl9mcCkoY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IHN0cnVjdCBzdGF0ICpzdGF0YnVmLCB2b2lkICopIEZBU1RfRlVOQzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWFjdGlvbl9mcCBmOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTk9UCisJYm9vbCBpbnZlcnQ7CisjZW5kaWYKK30gYWN0aW9uOworCisjZGVmaW5lIEFDVFMobmFtZSwgLi4uKSB0eXBlZGVmIHN0cnVjdCB7IGFjdGlvbiBhOyBfX1ZBX0FSR1NfXyB9IGFjdGlvbl8jI25hbWU7CisjZGVmaW5lIEFDVEYobmFtZSkgXAorCXN0YXRpYyBpbnQgRkFTVF9GVU5DIGZ1bmNfIyNuYW1lKGNvbnN0IGNoYXIgKmZpbGVOYW1lIFVOVVNFRF9QQVJBTSwgXAorCQljb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sIFwKKwkJYWN0aW9uXyMjbmFtZSogYXAgVU5VU0VEX1BBUkFNKQorCisgICAgICAgICAgICAgICAgICAgICAgICBBQ1RTKHByaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgQUNUUyhuYW1lLCAgY29uc3QgY2hhciAqcGF0dGVybjsgYm9vbCBpbmFtZTspCitJRl9GRUFUVVJFX0ZJTkRfUEFUSCggICBBQ1RTKHBhdGgsICBjb25zdCBjaGFyICpwYXR0ZXJuOyBib29sIGlwYXRoOykpCitJRl9GRUFUVVJFX0ZJTkRfUkVHRVgoICBBQ1RTKHJlZ2V4LCByZWdleF90IGNvbXBpbGVkX3BhdHRlcm47KSkKK0lGX0ZFQVRVUkVfRklORF9QUklOVDAoIEFDVFMocHJpbnQwKSkKK0lGX0ZFQVRVUkVfRklORF9UWVBFKCAgIEFDVFModHlwZSwgIGludCB0eXBlX21hc2s7KSkKK0lGX0ZFQVRVUkVfRklORF9QRVJNKCAgIEFDVFMocGVybSwgIGNoYXIgcGVybV9jaGFyOyBtb2RlX3QgcGVybV9tYXNrOykpCitJRl9GRUFUVVJFX0ZJTkRfTVRJTUUoICBBQ1RTKG10aW1lLCBjaGFyIG10aW1lX2NoYXI7IHVuc2lnbmVkIG10aW1lX2RheXM7KSkKK0lGX0ZFQVRVUkVfRklORF9NTUlOKCAgIEFDVFMobW1pbiwgIGNoYXIgbW1pbl9jaGFyOyB1bnNpZ25lZCBtbWluX21pbnM7KSkKK0lGX0ZFQVRVUkVfRklORF9ORVdFUiggIEFDVFMobmV3ZXIsIHRpbWVfdCBuZXdlcl9tdGltZTspKQorSUZfRkVBVFVSRV9GSU5EX0lOVU0oICAgQUNUUyhpbnVtLCAgaW5vX3QgaW5vZGVfbnVtOykpCitJRl9GRUFUVVJFX0ZJTkRfVVNFUiggICBBQ1RTKHVzZXIsICB1aWRfdCB1aWQ7KSkKK0lGX0ZFQVRVUkVfRklORF9TSVpFKCAgIEFDVFMoc2l6ZSwgIGNoYXIgc2l6ZV9jaGFyOyBvZmZfdCBzaXplOykpCitJRl9GRUFUVVJFX0ZJTkRfQ09OVEVYVChBQ1RTKGNvbnRleHQsIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0OykpCitJRl9GRUFUVVJFX0ZJTkRfUEFSRU4oICBBQ1RTKHBhcmVuLCBhY3Rpb24gKioqc3ViZXhwcjspKQorSUZfRkVBVFVSRV9GSU5EX1BSVU5FKCAgQUNUUyhwcnVuZSkpCitJRl9GRUFUVVJFX0ZJTkRfREVMRVRFKCBBQ1RTKGRlbGV0ZSkpCitJRl9GRUFUVVJFX0ZJTkRfRVhFQyggICBBQ1RTKGV4ZWMsICBjaGFyICoqZXhlY19hcmd2OyB1bnNpZ25lZCAqc3Vic3RfY291bnQ7IGludCBleGVjX2FyZ2M7KSkKK0lGX0ZFQVRVUkVfRklORF9HUk9VUCggIEFDVFMoZ3JvdXAsIGdpZF90IGdpZDspKQorSUZfRkVBVFVSRV9GSU5EX0xJTktTKCAgQUNUUyhsaW5rcywgY2hhciBsaW5rc19jaGFyOyBpbnQgbGlua3NfY291bnQ7KSkKKworc3RydWN0IGdsb2JhbHMgeworCUlGX0ZFQVRVUkVfRklORF9YREVWKGRldl90ICp4ZGV2X2RldjspCisJSUZfRkVBVFVSRV9GSU5EX1hERVYoaW50IHhkZXZfY291bnQ7KQorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTUFYREVQVEgKKwlpbnQgbWlubWF4ZGVwdGhbMl07CisjZW5kaWYKKwlhY3Rpb24gKioqYWN0aW9uczsKKwlzbWFsbGludCBuZWVkX3ByaW50OworCXNtYWxsaW50IHhkZXZfb247CisJcmVjdXJzZV9mbGFnc190IHJlY3Vyc2VfZmxhZ3M7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlzdHJ1Y3QgR19zaXplY2hlY2sgeyBcCisJCWNoYXIgR19zaXplY2hlY2tbc2l6ZW9mKEcpID4gQ09NTU9OX0JVRlNJWkUgPyAtMSA6IDFdOyBcCisJfTsgXAorCS8qIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVjYXVzZSBvZiBOT0VYRUMgKi8gXAorCW1lbXNldCgmRywgMCwgc2l6ZW9mKEcpKTsgXAorCUlGX0ZFQVRVUkVfRklORF9NQVhERVBUSChHLm1pbm1heGRlcHRoWzFdID0gSU5UX01BWDspIFwKKwlHLm5lZWRfcHJpbnQgPSAxOyBcCisJRy5yZWN1cnNlX2ZsYWdzID0gQUNUSU9OX1JFQ1VSU0U7IFwKK30gd2hpbGUgKDApCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0VYRUMKK3N0YXRpYyB1bnNpZ25lZCBjb3VudF9zdWJzdChjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgY291bnQgPSAwOworCXdoaWxlICgoc3RyID0gc3Ryc3RyKHN0ciwgInt9IikpICE9IE5VTEwpIHsKKwkJY291bnQrKzsKKwkJc3RyKys7CisJfQorCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgY2hhciogc3Vic3QoY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBjb3VudCwgY29uc3QgY2hhciogZmlsZW5hbWUpCit7CisJY2hhciAqYnVmLCAqZHN0LCAqZW5kOworCXNpemVfdCBmbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwkvKiB3ZSByZXBsYWNlIGVhY2ggJ3t9JyB3aXRoIGZpbGVuYW1lOiBncm93dGggYnkgc3RybGVuLTIgKi8KKwlidWYgPSBkc3QgPSB4bWFsbG9jKHN0cmxlbihzcmMpICsgY291bnQqKGZsZW4tMikgKyAxKTsKKwl3aGlsZSAoKGVuZCA9IHN0cnN0cihzcmMsICJ7fSIpKSkgeworCQltZW1jcHkoZHN0LCBzcmMsIGVuZCAtIHNyYyk7CisJCWRzdCArPSBlbmQgLSBzcmM7CisJCXNyYyA9IGVuZCArIDI7CisJCW1lbWNweShkc3QsIGZpbGVuYW1lLCBmbGVuKTsKKwkJZHN0ICs9IGZsZW47CisJfQorCXN0cmNweShkc3QsIHNyYyk7CisJcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZgorCisvKiBSZXR1cm4gdmFsdWVzIG9mIEFDVEZzICgnYWN0aW9uIGZ1bmN0aW9ucycpIGFyZSBhIGJpdCBtYXNrOgorICogYml0IDE9MTogcHJ1bmUgKHVzZSBTS0lQIGNvbnN0YW50IGZvciBzZXR0aW5nIGl0KQorICogYml0IDA9MTogbWF0Y2hlZCBzdWNjZXNzZnVsbHkgKFRSVUUpCisgKi8KKworc3RhdGljIGludCBleGVjX2FjdGlvbnMoYWN0aW9uICoqKmFwcHAsIGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZikKK3sKKwlpbnQgY3VyX2dyb3VwOworCWludCBjdXJfYWN0aW9uOworCWludCByYyA9IDA7CisJYWN0aW9uICoqYXBwLCAqYXA7CisKKwkvKiAiYWN0aW9uIGdyb3VwIiBpcyBhIHNldCBvZiBhY3Rpb25zIEFORGVkIHRvZ2V0aGVyLgorCSAqIGdyb3VwcyBhcmUgT1JlZCB0b2dldGhlci4KKwkgKiBXZSBzaW1wbHkgZXZhbHVhdGUgZWFjaCBncm91cCB1bnRpbCB3ZSBmaW5kIG9uZSBpbiB3aGljaCBhbGwgYWN0aW9ucworCSAqIHN1Y2NlZWQuICovCisKKwkvKiAtcHJ1bmUgaXMgc3BlY2lhbDogaWYgaXQgaXMgZW5jb3VudGVyZWQsIHRoZW4gd2Ugd29uJ3QKKwkgKiBkZXNjZW5kIGludG8gY3VycmVudCBkaXJlY3RvcnkuIEl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIKKwkgKiBhY3Rpb24gZ3JvdXAgKGluIHdoaWNoIC1wcnVuZSBzaXRzKSB3aWxsIHN1Y2NlZWQgb3Igbm90OgorCSAqIGZpbmQgKiAtcHJ1bmUgLW5hbWUgJ2YqJyAtbyAtbmFtZSAnbSonIC0tIHBydW5lcyBldmVyeSBkaXIKKwkgKiBmaW5kICogLW5hbWUgJ2YqJyAtbyAtcHJ1bmUgLW5hbWUgJ20qJyAtLSBwcnVuZXMgYWxsIGRpcnMKKwkgKiAgICAgbm90IHN0YXJ0aW5nIHdpdGggJ2YnICovCisKKwkvKiBXZSBpbnZlcnQgVFJVRSBiaXQgKGJpdCAwKS4gTm93IDEgdGhlcmUgbWVhbnMgJ2ZhaWx1cmUnLgorCSAqIGFuZCBiaXR3aXNlIE9SIGluICJyYyB8PSBUUlVFIF4gYXAtPmYoKSIgd2lsbDoKKwkgKiAoMSkgbWFrZSBTS0lQICgtcHJ1bmUpIGJpdCBzdGljazsgYW5kICgyKSBkZXRlY3QgJ2ZhaWx1cmUnLgorCSAqIE9uIHJldHVybiwgYml0IGlzIHJlc3RvcmVkLiAgKi8KKworCWN1cl9ncm91cCA9IC0xOworCXdoaWxlICgoYXBwID0gYXBwcFsrK2N1cl9ncm91cF0pICE9IE5VTEwpIHsKKwkJcmMgJj0gflRSVUU7IC8qICdzdWNjZXNzJyBzbyBmYXIsIGNsZWFyIFRSVUUgYml0ICovCisJCWN1cl9hY3Rpb24gPSAtMTsKKwkJd2hpbGUgKDEpIHsKKwkJCWFwID0gYXBwWysrY3VyX2FjdGlvbl07CisJCQlpZiAoIWFwKSAvKiBhbGwgYWN0aW9ucyBpbiBncm91cCB3ZXJlIHN1Y2Nlc3NmdWwgKi8KKwkJCQlyZXR1cm4gcmMgXiBUUlVFOyAvKiByZXN0b3JlIFRSVUUgYml0ICovCisJCQlyYyB8PSBUUlVFIF4gYXAtPmYoZmlsZU5hbWUsIHN0YXRidWYsIGFwKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX05PVAorCQkJaWYgKGFwLT5pbnZlcnQpIHJjIF49IFRSVUU7CisjZW5kaWYKKwkJCWRiZygiZ3JwICVkIGFjdGlvbiAlZCByYzoweCV4IiwgY3VyX2dyb3VwLCBjdXJfYWN0aW9uLCByYyk7CisJCQlpZiAocmMgJiBUUlVFKSAvKiBjdXJyZW50IGdyb3VwIGZhaWxlZCwgdHJ5IG5leHQgKi8KKwkJCQlicmVhazsKKwkJfQorCX0KKwlkYmcoInJldHVybmluZzoweCV4IiwgcmMgXiBUUlVFKTsKKwlyZXR1cm4gcmMgXiBUUlVFOyAvKiByZXN0b3JlIFRSVUUgYml0ICovCit9CisKKworI2lmICFGTk1fQ0FTRUZPTEQKK3N0YXRpYyBjaGFyICpzdHJjcHlfdXBjYXNlKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgKmQgPSBkc3Q7CisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgY2hhciBjaCA9ICpzcmMrKzsKKwkJaWYgKGNoID49ICdhJyAmJiBjaCA8PSAneicpCisJCQljaCAtPSAoJ2EnIC0gJ0EnKTsKKwkJKmQrKyA9IGNoOworCQlpZiAoY2ggPT0gJ1wwJykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZHN0OworfQorI2VuZGlmCisKK0FDVEYobmFtZSkKK3sKKwljb25zdCBjaGFyICp0bXAgPSBiYl9iYXNlbmFtZShmaWxlTmFtZSk7CisJaWYgKHRtcCAhPSBmaWxlTmFtZSAmJiAqdG1wID09ICdcMCcpIHsKKwkJLyogImZvby9iYXIvIi4gT2ggbm8uLi4gZ28gYmFjayB0byAnYicgKi8KKwkJdG1wLS07CisJCXdoaWxlICh0bXAgIT0gZmlsZU5hbWUgJiYgKi0tdG1wICE9ICcvJykKKwkJCWNvbnRpbnVlOworCQlpZiAoKnRtcCA9PSAnLycpCisJCQl0bXArKzsKKwl9CisJLyogV2FzIHVzaW5nIEZOTV9QRVJJT0QgZmxhZyB0b28sCisJICogYnV0IHNvbWV3aGVyZSBiZXR3ZWVuIDQuMS4yMCBhbmQgNC40LjAgR05VIGZpbmQgc3RvcHBlZCB1c2luZyBpdC4KKwkgKiBmaW5kIC1uYW1lICcqZm9vJyBzaG91bGQgbWF0Y2ggLmZvbyB0b286CisJICovCisjaWYgRk5NX0NBU0VGT0xECisJcmV0dXJuIGZubWF0Y2goYXAtPnBhdHRlcm4sIHRtcCwgKGFwLT5pbmFtZSA/IEZOTV9DQVNFRk9MRCA6IDApKSA9PSAwOworI2Vsc2UKKwlpZiAoYXAtPmluYW1lKQorCQl0bXAgPSBzdHJjcHlfdXBjYXNlKGFsbG9jYShzdHJsZW4odG1wKSArIDEpLCB0bXApOworCXJldHVybiBmbm1hdGNoKGFwLT5wYXR0ZXJuLCB0bXAsIDApID09IDA7CisjZW5kaWYKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEFUSAorQUNURihwYXRoKQoreworIyBpZiBGTk1fQ0FTRUZPTEQKKwlyZXR1cm4gZm5tYXRjaChhcC0+cGF0dGVybiwgZmlsZU5hbWUsIChhcC0+aXBhdGggPyBGTk1fQ0FTRUZPTEQgOiAwKSkgPT0gMDsKKyMgZWxzZQorCWlmIChhcC0+aXBhdGgpCisJCWZpbGVOYW1lID0gc3RyY3B5X3VwY2FzZShhbGxvY2Eoc3RybGVuKGZpbGVOYW1lKSArIDEpLCBmaWxlTmFtZSk7CisJcmV0dXJuIGZubWF0Y2goYXAtPnBhdHRlcm4sIGZpbGVOYW1lLCAwKSA9PSAwOworIyBlbmRpZgorfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9SRUdFWAorQUNURihyZWdleCkKK3sKKwlyZWdtYXRjaF90IG1hdGNoOworCWlmIChyZWdleGVjKCZhcC0+Y29tcGlsZWRfcGF0dGVybiwgZmlsZU5hbWUsIDEsICZtYXRjaCwgMCAvKmVmbGFncyovKSkKKwkJcmV0dXJuIDA7IC8qIG5vIG1hdGNoICovCisJaWYgKG1hdGNoLnJtX3NvKQorCQlyZXR1cm4gMDsgLyogbWF0Y2ggZG9lc24ndCBzdGFydCBhdCBwb3MgMCAqLworCWlmIChmaWxlTmFtZVttYXRjaC5ybV9lb10pCisJCXJldHVybiAwOyAvKiBtYXRjaCBkb2Vzbid0IGVuZCBleGFjdGx5IGF0IGVuZCBvZiBwYXRobmFtZSAqLworCXJldHVybiAxOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9UWVBFCitBQ1RGKHR5cGUpCit7CisJcmV0dXJuICgoc3RhdGJ1Zi0+c3RfbW9kZSAmIFNfSUZNVCkgPT0gYXAtPnR5cGVfbWFzayk7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1BFUk0KK0FDVEYocGVybSkKK3sKKwkvKiAtcGVybSArbW9kZTogYXQgbGVhc3Qgb25lIG9mIHBlcm1fbWFzayBiaXRzIGFyZSBzZXQgKi8KKwlpZiAoYXAtPnBlcm1fY2hhciA9PSAnKycpCisJCXJldHVybiAoc3RhdGJ1Zi0+c3RfbW9kZSAmIGFwLT5wZXJtX21hc2spICE9IDA7CisJLyogLXBlcm0gLW1vZGU6IGFsbCBvZiBwZXJtX21hc2sgYXJlIHNldCAqLworCWlmIChhcC0+cGVybV9jaGFyID09ICctJykKKwkJcmV0dXJuIChzdGF0YnVmLT5zdF9tb2RlICYgYXAtPnBlcm1fbWFzaykgPT0gYXAtPnBlcm1fbWFzazsKKwkvKiAtcGVybSBtb2RlOiBmaWxlIG1vZGUgbXVzdCBtYXRjaCBwZXJtX21hc2sgKi8KKwlyZXR1cm4gKHN0YXRidWYtPnN0X21vZGUgJiAwNzc3NykgPT0gYXAtPnBlcm1fbWFzazsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTVRJTUUKK0FDVEYobXRpbWUpCit7CisJdGltZV90IGZpbGVfYWdlID0gdGltZShOVUxMKSAtIHN0YXRidWYtPnN0X210aW1lOworCXRpbWVfdCBtdGltZV9zZWNzID0gYXAtPm10aW1lX2RheXMgKiAyNCo2MCo2MDsKKwlpZiAoYXAtPm10aW1lX2NoYXIgPT0gJysnKQorCQlyZXR1cm4gZmlsZV9hZ2UgPj0gbXRpbWVfc2VjcyArIDI0KjYwKjYwOworCWlmIChhcC0+bXRpbWVfY2hhciA9PSAnLScpCisJCXJldHVybiBmaWxlX2FnZSA8IG10aW1lX3NlY3M7CisJLyoganVzdCBudW1lcmljIG10aW1lICovCisJcmV0dXJuIGZpbGVfYWdlID49IG10aW1lX3NlY3MgJiYgZmlsZV9hZ2UgPCAobXRpbWVfc2VjcyArIDI0KjYwKjYwKTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTU1JTgorQUNURihtbWluKQoreworCXRpbWVfdCBmaWxlX2FnZSA9IHRpbWUoTlVMTCkgLSBzdGF0YnVmLT5zdF9tdGltZTsKKwl0aW1lX3QgbW1pbl9zZWNzID0gYXAtPm1taW5fbWlucyAqIDYwOworCWlmIChhcC0+bW1pbl9jaGFyID09ICcrJykKKwkJcmV0dXJuIGZpbGVfYWdlID49IG1taW5fc2VjcyArIDYwOworCWlmIChhcC0+bW1pbl9jaGFyID09ICctJykKKwkJcmV0dXJuIGZpbGVfYWdlIDwgbW1pbl9zZWNzOworCS8qIGp1c3QgbnVtZXJpYyBtbWluICovCisJcmV0dXJuIGZpbGVfYWdlID49IG1taW5fc2VjcyAmJiBmaWxlX2FnZSA8IChtbWluX3NlY3MgKyA2MCk7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX05FV0VSCitBQ1RGKG5ld2VyKQoreworCXJldHVybiAoYXAtPm5ld2VyX210aW1lIDwgc3RhdGJ1Zi0+c3RfbXRpbWUpOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9JTlVNCitBQ1RGKGludW0pCit7CisJcmV0dXJuIChzdGF0YnVmLT5zdF9pbm8gPT0gYXAtPmlub2RlX251bSk7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0VYRUMKK0FDVEYoZXhlYykKK3sKKwlpbnQgaSwgcmM7CisjaWYgRU5BQkxFX1VTRV9QT1JUQUJMRV9DT0RFCisJY2hhciAqKmFyZ3YgPSBhbGxvY2Eoc2l6ZW9mKGNoYXIqKSAqIChhcC0+ZXhlY19hcmdjICsgMSkpOworI2Vsc2UgLyogZ2NjIDQuMy4xIGdlbmVyYXRlcyBzbWFsbGVyIGNvZGU6ICovCisJY2hhciAqYXJndlthcC0+ZXhlY19hcmdjICsgMV07CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgYXAtPmV4ZWNfYXJnYzsgaSsrKQorCQlhcmd2W2ldID0gc3Vic3QoYXAtPmV4ZWNfYXJndltpXSwgYXAtPnN1YnN0X2NvdW50W2ldLCBmaWxlTmFtZSk7CisJYXJndltpXSA9IE5VTEw7IC8qIHRlcm1pbmF0ZSB0aGUgbGlzdCAqLworCisJcmMgPSBzcGF3bl9hbmRfd2FpdChhcmd2KTsKKwlpZiAocmMgPCAwKQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhhcmd2WzBdKTsKKworCWkgPSAwOworCXdoaWxlIChhcmd2W2ldKQorCQlmcmVlKGFyZ3ZbaSsrXSk7CisJcmV0dXJuIHJjID09IDA7IC8qIHJldHVybiAxIGlmIGV4aXRjb2RlIDAgKi8KK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfVVNFUgorQUNURih1c2VyKQoreworCXJldHVybiAoc3RhdGJ1Zi0+c3RfdWlkID09IGFwLT51aWQpOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9HUk9VUAorQUNURihncm91cCkKK3sKKwlyZXR1cm4gKHN0YXRidWYtPnN0X2dpZCA9PSBhcC0+Z2lkKTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUFJJTlQwCitBQ1RGKHByaW50MCkKK3sKKwlwcmludGYoIiVzJWMiLCBmaWxlTmFtZSwgJ1wwJyk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKK0FDVEYocHJpbnQpCit7CisJcHV0cyhmaWxlTmFtZSk7CisJcmV0dXJuIFRSVUU7Cit9CisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QQVJFTgorQUNURihwYXJlbikKK3sKKwlyZXR1cm4gZXhlY19hY3Rpb25zKGFwLT5zdWJleHByLCBmaWxlTmFtZSwgc3RhdGJ1Zik7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1NJWkUKK0FDVEYoc2l6ZSkKK3sKKwlpZiAoYXAtPnNpemVfY2hhciA9PSAnKycpCisJCXJldHVybiBzdGF0YnVmLT5zdF9zaXplID4gYXAtPnNpemU7CisJaWYgKGFwLT5zaXplX2NoYXIgPT0gJy0nKQorCQlyZXR1cm4gc3RhdGJ1Zi0+c3Rfc2l6ZSA8IGFwLT5zaXplOworCXJldHVybiBzdGF0YnVmLT5zdF9zaXplID09IGFwLT5zaXplOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QUlVORQorLyoKKyAqIC1wcnVuZTogaWYgLWRlcHRoIGlzIG5vdCBnaXZlbiwgcmV0dXJuIHRydWUgYW5kIGRvIG5vdCBkZXNjZW5kCisgKiBjdXJyZW50IGRpcjsgaWYgLWRlcHRoIGlzIGdpdmVuLCByZXR1cm4gZmFsc2Ugd2l0aCBubyBlZmZlY3QuCisgKiBFeGFtcGxlOgorICogZmluZCBkaXIgLW5hbWUgJ2FzbS0qJyAtcHJ1bmUgLW8gLW5hbWUgJyouW2NoU10nIC1wcmludAorICovCitBQ1RGKHBydW5lKQoreworCXJldHVybiBTS0lQICsgVFJVRTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfREVMRVRFCitBQ1RGKGRlbGV0ZSkKK3sKKwlpbnQgcmM7CisJaWYgKFNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJcmMgPSBybWRpcihmaWxlTmFtZSk7CisJfSBlbHNlIHsKKwkJcmMgPSB1bmxpbmsoZmlsZU5hbWUpOworCX0KKwlpZiAocmMgPCAwKQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlTmFtZSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0NPTlRFWFQKK0FDVEYoY29udGV4dCkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3QgY29uOworCWludCByYzsKKworCWlmIChHLnJlY3Vyc2VfZmxhZ3MgJiBBQ1RJT05fRk9MTE9XTElOS1MpIHsKKwkJcmMgPSBnZXRmaWxlY29uKGZpbGVOYW1lLCAmY29uKTsKKwl9IGVsc2UgeworCQlyYyA9IGxnZXRmaWxlY29uKGZpbGVOYW1lLCAmY29uKTsKKwl9CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIEZBTFNFOworCXJjID0gc3RyY21wKGFwLT5jb250ZXh0LCBjb24pOworCWZyZWVjb24oY29uKTsKKwlyZXR1cm4gcmMgPT0gMDsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTElOS1MKK0FDVEYobGlua3MpCit7CisJc3dpdGNoKGFwLT5saW5rc19jaGFyKSB7CisJY2FzZSAnLScgOiByZXR1cm4gKHN0YXRidWYtPnN0X25saW5rIDwgIGFwLT5saW5rc19jb3VudCk7CisJY2FzZSAnKycgOiByZXR1cm4gKHN0YXRidWYtPnN0X25saW5rID4gIGFwLT5saW5rc19jb3VudCk7CisJZGVmYXVsdDogICByZXR1cm4gKHN0YXRidWYtPnN0X25saW5rID09IGFwLT5saW5rc19jb3VudCk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVBY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCBJRl9OT1RfRkVBVFVSRV9GSU5EX01BWERFUFRIKFVOVVNFRF9QQVJBTSkpCit7CisJaW50IHI7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX01BWERFUFRICisJaWYgKGRlcHRoIDwgRy5taW5tYXhkZXB0aFswXSkKKwkJcmV0dXJuIFRSVUU7IC8qIHNraXAgdGhpcywgY29udGludWUgcmVjdXJzaW5nICovCisJaWYgKGRlcHRoID4gRy5taW5tYXhkZXB0aFsxXSkKKwkJcmV0dXJuIFNLSVA7IC8qIHN0b3AgcmVjdXJzaW5nICovCisjZW5kaWYKKworCXIgPSBleGVjX2FjdGlvbnMoRy5hY3Rpb25zLCBmaWxlTmFtZSwgc3RhdGJ1Zik7CisJLyogSGFkIG5vIGV4cGxpY2l0IC1wcmludFswXSBvciAtZXhlYz8gdGhlbiBwcmludCAqLworCWlmICgociAmIFRSVUUpICYmIEcubmVlZF9wcmludCkKKwkJcHV0cyhmaWxlTmFtZSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX01BWERFUFRICisJaWYgKFNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJaWYgKGRlcHRoID09IEcubWlubWF4ZGVwdGhbMV0pCisJCQlyZXR1cm4gU0tJUDsKKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1hERVYKKwkvKiAteGRldiBzdG9wcyBvbiBtb3VudHBvaW50cywgYnV0IEFGVEVSIG1vdW50cG9pdCBpdHNlbGYKKwkgKiBpcyBwcm9jZXNzZWQgYXMgdXN1YWwgKi8KKwlpZiAoU19JU0RJUihzdGF0YnVmLT5zdF9tb2RlKSkgeworCQlpZiAoRy54ZGV2X2NvdW50KSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBHLnhkZXZfY291bnQ7IGkrKykgeworCQkJCWlmIChHLnhkZXZfZGV2W2ldID09IHN0YXRidWYtPnN0X2RldikKKwkJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJCXJldHVybiBTS0lQOworIGZvdW5kOiA7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIENhbm5vdCByZXR1cm4gMDogb3VyIGNhbGxlciwgcmVjdXJzaXZlX2FjdGlvbigpLAorCSAqIHdpbGwgcGVycm9yKCkgYW5kIHNraXAgZGlycyAoaWYgY2FsbGVkIG9uIGRpcikgKi8KKwlyZXR1cm4gKHIgJiBTS0lQKSA/IFNLSVAgOiBUUlVFOworfQorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1RZUEUKK3N0YXRpYyBpbnQgZmluZF90eXBlKGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IG1hc2sgPSAwOworCisJaWYgKCp0eXBlID09ICdiJykKKwkJbWFzayA9IFNfSUZCTEs7CisJZWxzZSBpZiAoKnR5cGUgPT0gJ2MnKQorCQltYXNrID0gU19JRkNIUjsKKwllbHNlIGlmICgqdHlwZSA9PSAnZCcpCisJCW1hc2sgPSBTX0lGRElSOworCWVsc2UgaWYgKCp0eXBlID09ICdwJykKKwkJbWFzayA9IFNfSUZJRk87CisJZWxzZSBpZiAoKnR5cGUgPT0gJ2YnKQorCQltYXNrID0gU19JRlJFRzsKKwllbHNlIGlmICgqdHlwZSA9PSAnbCcpCisJCW1hc2sgPSBTX0lGTE5LOworCWVsc2UgaWYgKCp0eXBlID09ICdzJykKKwkJbWFzayA9IFNfSUZTT0NLOworCisJaWYgKG1hc2sgPT0gMCB8fCB0eXBlWzFdICE9ICdcMCcpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgdHlwZSwgIi10eXBlIik7CisKKwlyZXR1cm4gbWFzazsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QRVJNIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9GSU5EX01USU1FIHx8IEVOQUJMRV9GRUFUVVJFX0ZJTkRfTU1JTiBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfRklORF9TSVpFICB8fCBFTkFCTEVfRkVBVFVSRV9GSU5EX0xJTktTCitzdGF0aWMgY29uc3QgY2hhciogcGx1c19taW51c19udW0oY29uc3QgY2hhciogc3RyKQoreworCWlmICgqc3RyID09ICctJyB8fCAqc3RyID09ICcrJykKKwkJc3RyKys7CisJcmV0dXJuIHN0cjsKK30KKyNlbmRpZgorCitzdGF0aWMgYWN0aW9uKioqIHBhcnNlX3BhcmFtcyhjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICBPUFRfRk9MTE9XICAgICAsCisJSUZfRkVBVFVSRV9GSU5EX1hERVYoICAgT1BUX1hERVYgICAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfREVQVEgoICBPUFRfREVQVEggICAgICAsKQorCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUk1fYSAgICAgICAgICwKKwkgICAgICAgICAgICAgICAgICAgICAgICBQQVJNX28gICAgICAgICAsCisJSUZfRkVBVFVSRV9GSU5EX05PVCgJUEFSTV9jaGFyX25vdCAgLCkKKyNpZiBFTkFCTEVfREVTS1RPUAorCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUk1fYW5kICAgICAgICwKKwkgICAgICAgICAgICAgICAgICAgICAgICBQQVJNX29yICAgICAgICAsCisJSUZfRkVBVFVSRV9GSU5EX05PVCggICAgUEFSTV9ub3QgICAgICAgLCkKKyNlbmRpZgorCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUk1fcHJpbnQgICAgICwKKwlJRl9GRUFUVVJFX0ZJTkRfUFJJTlQwKCBQQVJNX3ByaW50MCAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9QUlVORSggIFBBUk1fcHJ1bmUgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX0RFTEVURSggUEFSTV9kZWxldGUgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfRVhFQyggICBQQVJNX2V4ZWMgICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9QQVJFTiggIFBBUk1fY2hhcl9icmFjZSwpCisJLyogQWxsIG9wdGlvbnMvYWN0aW9ucyBzdGFydGluZyBmcm9tIGhlcmUgcmVxdWlyZSBhcmd1bWVudCAqLworCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUk1fbmFtZSAgICAgICwKKwkgICAgICAgICAgICAgICAgICAgICAgICBQQVJNX2luYW1lICAgICAsCisJSUZfRkVBVFVSRV9GSU5EX1BBVEgoICAgUEFSTV9wYXRoICAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfUEFUSCggICBQQVJNX2lwYXRoICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9SRUdFWCggIFBBUk1fcmVnZXggICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX1RZUEUoICAgUEFSTV90eXBlICAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfUEVSTSggICBQQVJNX3Blcm0gICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9NVElNRSggIFBBUk1fbXRpbWUgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX01NSU4oICAgUEFSTV9tbWluICAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfTkVXRVIoICBQQVJNX25ld2VyICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9JTlVNKCAgIFBBUk1faW51bSAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX1VTRVIoICAgUEFSTV91c2VyICAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfR1JPVVAoICBQQVJNX2dyb3VwICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9TSVpFKCAgIFBBUk1fc2l6ZSAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX0NPTlRFWFQoUEFSTV9jb250ZXh0ICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfTElOS1MoICBQQVJNX2xpbmtzICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9NQVhERVBUSChPUFRfTUlOREVQVEgsT1BUX01BWERFUFRILCkKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgcGFyYW1zW10gQUxJR04xID0KKwkgICAgICAgICAgICAgICAgICAgICAgICAiLWZvbGxvd1wwIgorCUlGX0ZFQVRVUkVfRklORF9YREVWKCAgICIteGRldlwwIiAgICAgICAgICAgICAgICAgKQorCUlGX0ZFQVRVUkVfRklORF9ERVBUSCggICItZGVwdGhcMCIgICAgICAgICAgICAgICAgKQorCSAgICAgICAgICAgICAgICAgICAgICAgICItYVwwIgorCSAgICAgICAgICAgICAgICAgICAgICAgICItb1wwIgorCUlGX0ZFQVRVUkVfRklORF9OT1QoICAgICIhXDAiICAgICAgICkKKyNpZiBFTkFCTEVfREVTS1RPUAorCSAgICAgICAgICAgICAgICAgICAgICAgICItYW5kXDAiCisJICAgICAgICAgICAgICAgICAgICAgICAgIi1vclwwIgorCUlGX0ZFQVRVUkVfRklORF9OT1QoCSItbm90XDAiICAgICkKKyNlbmRpZgorCSAgICAgICAgICAgICAgICAgICAgICAgICItcHJpbnRcMCIKKwlJRl9GRUFUVVJFX0ZJTkRfUFJJTlQwKCAiLXByaW50MFwwIiApCisJSUZfRkVBVFVSRV9GSU5EX1BSVU5FKCAgIi1wcnVuZVwwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9ERUxFVEUoICItZGVsZXRlXDAiICkKKwlJRl9GRUFUVVJFX0ZJTkRfRVhFQyggICAiLWV4ZWNcMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX1BBUkVOKCAgIihcMCIgICAgICAgKQorCS8qIEFsbCBvcHRpb25zL2FjdGlvbnMgc3RhcnRpbmcgZnJvbSBoZXJlIHJlcXVpcmUgYXJndW1lbnQgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgIi1uYW1lXDAiCisJICAgICAgICAgICAgICAgICAgICAgICAgICItaW5hbWVcMCIKKwlJRl9GRUFUVVJFX0ZJTkRfUEFUSCggICAiLXBhdGhcMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX1BBVEgoICAgIi1pcGF0aFwwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9SRUdFWCggICItcmVnZXhcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfVFlQRSggICAiLXR5cGVcMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX1BFUk0oICAgIi1wZXJtXDAiICAgKQorCUlGX0ZFQVRVUkVfRklORF9NVElNRSggICItbXRpbWVcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfTU1JTiggICAiLW1taW5cMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX05FV0VSKCAgIi1uZXdlclwwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9JTlVNKCAgICItaW51bVwwIiAgICkKKwlJRl9GRUFUVVJFX0ZJTkRfVVNFUiggICAiLXVzZXJcMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX0dST1VQKCAgIi1ncm91cFwwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9TSVpFKCAgICItc2l6ZVwwIiAgICkKKwlJRl9GRUFUVVJFX0ZJTkRfQ09OVEVYVCgiLWNvbnRleHRcMCIpCisJSUZfRkVBVFVSRV9GSU5EX0xJTktTKCAgIi1saW5rc1wwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9NQVhERVBUSCgiLW1pbmRlcHRoXDAiIi1tYXhkZXB0aFwwIikKKwk7CisKKwlhY3Rpb24qKiogYXBwcDsKKwl1bnNpZ25lZCBjdXJfZ3JvdXAgPSAwOworCXVuc2lnbmVkIGN1cl9hY3Rpb24gPSAwOworCUlGX0ZFQVRVUkVfRklORF9OT1QoIGJvb2wgaW52ZXJ0X2ZsYWcgPSAwOyApCisKKwkvKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIGJ1c3lib3ggd2hlcmUgd2UgdXNlIG5lc3RlZCBmdW5jdGlvbi4KKwkgKiBTbyBmYXIgbW9yZSBzdGFuZGFyZCBhbHRlcm5hdGl2ZXMgd2VyZSBiaWdnZXIuICovCisJLyogQXV0byBkZWNsIHN1cHByZXNzZXMgImZ1bmMgd2l0aG91dCBhIHByb3RvdHlwZSIgd2FybmluZzogKi8KKwlhdXRvIGFjdGlvbiogYWxsb2NfYWN0aW9uKGludCBzaXplb2Zfc3RydWN0LCBhY3Rpb25fZnAgZik7CisJYWN0aW9uKiBhbGxvY19hY3Rpb24oaW50IHNpemVvZl9zdHJ1Y3QsIGFjdGlvbl9mcCBmKQorCXsKKwkJYWN0aW9uICphcDsKKwkJYXBwcFtjdXJfZ3JvdXBdID0geHJlYWxsb2MoYXBwcFtjdXJfZ3JvdXBdLCAoY3VyX2FjdGlvbisyKSAqIHNpemVvZigqYXBwcCkpOworCQlhcHBwW2N1cl9ncm91cF1bY3VyX2FjdGlvbisrXSA9IGFwID0geHphbGxvYyhzaXplb2Zfc3RydWN0KTsKKwkJYXBwcFtjdXJfZ3JvdXBdW2N1cl9hY3Rpb25dID0gTlVMTDsKKwkJYXAtPmYgPSBmOworCQlJRl9GRUFUVVJFX0ZJTkRfTk9UKCBhcC0+aW52ZXJ0ID0gaW52ZXJ0X2ZsYWc7ICkKKwkJSUZfRkVBVFVSRV9GSU5EX05PVCggaW52ZXJ0X2ZsYWcgPSAwOyApCisJCXJldHVybiBhcDsKKwl9CisKKyNkZWZpbmUgQUxMT0NfQUNUSU9OKG5hbWUpIChhY3Rpb25fIyNuYW1lKilhbGxvY19hY3Rpb24oc2l6ZW9mKGFjdGlvbl8jI25hbWUpLCAoYWN0aW9uX2ZwKSBmdW5jXyMjbmFtZSkKKworCWFwcHAgPSB4emFsbG9jKDIgKiBzaXplb2YoYXBwcFswXSkpOyAvKiBhcHBwWzBdLFsxXSA9PSBOVUxMICovCisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlswXTsKKwkJaW50IHBhcm0gPSBpbmRleF9pbl9zdHJpbmdzKHBhcmFtcywgYXJnKTsKKwkJY29uc3QgY2hhciAqYXJnMSA9IGFyZ3ZbMV07CisKKwkJZGJnKCJhcmc6JyVzJyBhcmcxOiclcycgcGFybTolZCBQQVJNX3R5cGU6JWQiLCBhcmcsIGFyZzEsIHBhcm0sIFBBUk1fdHlwZSk7CisKKwkJaWYgKHBhcm0gPj0gUEFSTV9uYW1lKSB7CisJCQkvKiBBbGwgb3B0aW9ucy9hY3Rpb25zIHN0YXJ0aW5nIGZyb20gLW5hbWUgcmVxdWlyZSBhcmd1bWVudCAqLworCQkJaWYgKCFhcmcxKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsIGFyZyk7CisJCQlhcmd2Kys7CisJCX0KKworCQkvKiBXZSBjYW4gdXNlIGJpZyBzd2l0Y2goKSBoZXJlLCBidXQgb24gaTM4NgorCQkgKiBpdCBkb2Vzbid0IGdpdmUgc21hbGxlciBjb2RlLiBPdGhlciBhcmNoZXM/ICovCisKKy8qIE9wdGlvbnMgYWx3YXlzIHJldHVybiB0cnVlLiBUaGV5IGFsd2F5cyB0YWtlIGVmZmVjdAorICogcmF0aGVyIHRoYW4gYmVpbmcgcHJvY2Vzc2VkIG9ubHkgd2hlbiB0aGVpciBwbGFjZSBpbiB0aGUKKyAqIGV4cHJlc3Npb24gaXMgcmVhY2hlZC4KKyAqLworCQkvKiBPcHRpb25zICovCisJCWlmIChwYXJtID09IE9QVF9GT0xMT1cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiZygiZm9sbG93IGVuYWJsZWQ6ICVkIiwgX19MSU5FX18pOworICAgICAgICAgICAgICAgICAgICAgICAgRy5yZWN1cnNlX2ZsYWdzIHw9IEFDVElPTl9GT0xMT1dMSU5LUyB8IEFDVElPTl9EQU5HTElOR19PSzsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfWERFVgorCQllbHNlIGlmIChwYXJtID09IE9QVF9YREVWKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy54ZGV2X29uID0gMTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9NQVhERVBUSAorCQllbHNlIGlmIChwYXJtID09IE9QVF9NSU5ERVBUSCB8fCBwYXJtID09IE9QVF9NSU5ERVBUSCArIDEpIHsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlHLm1pbm1heGRlcHRoW3Bhcm0gLSBPUFRfTUlOREVQVEhdID0geGF0b2lfcG9zaXRpdmUoYXJnMSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfREVQVEgKKwkJZWxzZSBpZiAocGFybSA9PSBPUFRfREVQVEgpIHsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlHLnJlY3Vyc2VfZmxhZ3MgfD0gQUNUSU9OX0RFUFRIRklSU1Q7CisJCX0KKyNlbmRpZgorLyogQWN0aW9ucyBhcmUgZ3JvdXBlZCBieSBvcGVyYXRvcnMKKyAqICggZXhwciApICAgICAgICAgICAgICBGb3JjZSBwcmVjZWRlbmNlCisgKiAhIGV4cHIgICAgICAgICAgICAgICAgVHJ1ZSBpZiBleHByIGlzIGZhbHNlCisgKiAtbm90IGV4cHIgICAgICAgICAgICAgU2FtZSBhcyAhIGV4cHIKKyAqIGV4cHIxIFstYVtuZF1dIGV4cHIyICBBbmQ7IGV4cHIyIGlzIG5vdCBldmFsdWF0ZWQgaWYgZXhwcjEgaXMgZmFsc2UKKyAqIGV4cHIxIC1vW3JdIGV4cHIyICAgICBPcjsgZXhwcjIgaXMgbm90IGV2YWx1YXRlZCBpZiBleHByMSBpcyB0cnVlCisgKiBleHByMSAsIGV4cHIyICAgICAgICAgTGlzdDsgYm90aCBleHByMSBhbmQgZXhwcjIgYXJlIGFsd2F5cyBldmFsdWF0ZWQKKyAqIFdlIGltcGxlbWVudDogKCksIC1hLCAtbworICovCisJCS8qIE9wZXJhdG9ycyAqLworCQllbHNlIGlmIChwYXJtID09IFBBUk1fYSBJRl9ERVNLVE9QKHx8IHBhcm0gPT0gUEFSTV9hbmQpKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJLyogbm8gZnVydGhlciBzcGVjaWFsIGhhbmRsaW5nIHJlcXVpcmVkICovCisJCX0KKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX28gSUZfREVTS1RPUCh8fCBwYXJtID09IFBBUk1fb3IpKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJLyogc3RhcnQgbmV3IE9SIGdyb3VwICovCisJCQljdXJfZ3JvdXArKzsKKwkJCWFwcHAgPSB4cmVhbGxvYyhhcHBwLCAoY3VyX2dyb3VwKzIpICogc2l6ZW9mKCphcHBwKSk7CisJCQkvKmFwcHBbY3VyX2dyb3VwXSA9IE5VTEw7IC0gYWxyZWFkeSBOVUxMICovCisJCQlhcHBwW2N1cl9ncm91cCsxXSA9IE5VTEw7CisJCQljdXJfYWN0aW9uID0gMDsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTk9UCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9jaGFyX25vdCBJRl9ERVNLVE9QKHx8IHBhcm0gPT0gUEFSTV9ub3QpKSB7CisJCQkvKiBhbHNvIGhhbmRsZXMgImZpbmQgISAhIC1uYW1lICdmb28qJyIgKi8KKwkJCWludmVydF9mbGFnIF49IDE7CisJCQlkYmcoImludmVydF9mbGFnOiVkIiwgaW52ZXJ0X2ZsYWcpOworCQl9CisjZW5kaWYKKwkJLyogQWN0aW9ucyAqLworCQllbHNlIGlmIChwYXJtID09IFBBUk1fcHJpbnQpIHsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlHLm5lZWRfcHJpbnQgPSAwOworCQkJKHZvaWQpIEFMTE9DX0FDVElPTihwcmludCk7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1BSSU5UMAorCQllbHNlIGlmIChwYXJtID09IFBBUk1fcHJpbnQwKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy5uZWVkX3ByaW50ID0gMDsKKwkJCSh2b2lkKSBBTExPQ19BQ1RJT04ocHJpbnQwKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QUlVORQorCQllbHNlIGlmIChwYXJtID09IFBBUk1fcHJ1bmUpIHsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQkodm9pZCkgQUxMT0NfQUNUSU9OKHBydW5lKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9ERUxFVEUKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2RlbGV0ZSkgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCUcubmVlZF9wcmludCA9IDA7CisJCQlHLnJlY3Vyc2VfZmxhZ3MgfD0gQUNUSU9OX0RFUFRIRklSU1Q7CisJCQkodm9pZCkgQUxMT0NfQUNUSU9OKGRlbGV0ZSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfRVhFQworCQllbHNlIGlmIChwYXJtID09IFBBUk1fZXhlYykgeworCQkJaW50IGk7CisJCQlhY3Rpb25fZXhlYyAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy5uZWVkX3ByaW50ID0gMDsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKGV4ZWMpOworCQkJYXAtPmV4ZWNfYXJndiA9ICsrYXJndjsgLyogZmlyc3QgYXJnIGFmdGVyIC1leGVjICovCisJCQkvKmFwLT5leGVjX2FyZ2MgPSAwOyAtIEFMTE9DX0FDVElPTiBkaWQgaXQgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCEqYXJndikgLyogZGlkIG5vdCBzZWUgJzsnIG9yICcrJyB1bnRpbCBlbmQgKi8KKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlcXVpcmVzX2FyZywgIi1leGVjIik7CisJCQkJLy8gZmluZCAtZXhlYyBlY2hvIEZvbyAiPnt9PCIgIjsiCisJCQkJLy8gZXhlY3V0ZXMgImVjaG8gRm9vID5GSUxFTkFNRTwiLAorCQkJCS8vIGZpbmQgLWV4ZWMgZWNobyBGb28gIj57fTwiICIrIgorCQkJCS8vIGV4ZWN1dGVzICJlY2hvIEZvbyBGSUxFTkFNRTEgRklMRU5BTUUyIEZJTEVOQU1FMy4uLiIuCisJCQkJLy8gVE9ETyAoc28gZmFyIHdlIHRyZWF0ICIrIiBqdXN0IGxpa2UgIjsiKQorCQkJCWlmICgoYXJndlswXVswXSA9PSAnOycgfHwgYXJndlswXVswXSA9PSAnKycpCisJCQkJICYmIGFyZ3ZbMF1bMV0gPT0gJ1wwJworCQkJCSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYXJndisrOworCQkJCWFwLT5leGVjX2FyZ2MrKzsKKwkJCX0KKwkJCWlmIChhcC0+ZXhlY19hcmdjID09IDApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlcXVpcmVzX2FyZywgYXJnKTsKKwkJCWFwLT5zdWJzdF9jb3VudCA9IHhtYWxsb2MoYXAtPmV4ZWNfYXJnYyAqIHNpemVvZihpbnQpKTsKKwkJCWkgPSBhcC0+ZXhlY19hcmdjOworCQkJd2hpbGUgKGktLSkKKwkJCQlhcC0+c3Vic3RfY291bnRbaV0gPSBjb3VudF9zdWJzdChhcC0+ZXhlY19hcmd2W2ldKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QQVJFTgorCQllbHNlIGlmIChwYXJtID09IFBBUk1fY2hhcl9icmFjZSkgeworCQkJYWN0aW9uX3BhcmVuICphcDsKKwkJCWNoYXIgKiplbmRhcmc7CisJCQl1bnNpZ25lZCBuZXN0ZWQgPSAxOworCisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJZW5kYXJnID0gYXJndjsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCEqKytlbmRhcmcpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnBhaXJlZCAnKCciKTsKKwkJCQlpZiAoTE9ORV9DSEFSKCplbmRhcmcsICcoJykpCisJCQkJCW5lc3RlZCsrOworCQkJCWVsc2UgaWYgKExPTkVfQ0hBUigqZW5kYXJnLCAnKScpICYmICEtLW5lc3RlZCkgeworCQkJCQkqZW5kYXJnID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYXAgPSBBTExPQ19BQ1RJT04ocGFyZW4pOworCQkJYXAtPnN1YmV4cHIgPSBwYXJzZV9wYXJhbXMoYXJndiArIDEpOworCQkJKmVuZGFyZyA9IChjaGFyKikgIikiOyAvKiByZXN0b3JlIE5VTExlZCBwYXJhbWV0ZXIgKi8KKwkJCWFyZ3YgPSBlbmRhcmc7CisJCX0KKyNlbmRpZgorCQllbHNlIGlmIChwYXJtID09IFBBUk1fbmFtZSB8fCBwYXJtID09IFBBUk1faW5hbWUpIHsKKwkJCWFjdGlvbl9uYW1lICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihuYW1lKTsKKwkJCWFwLT5wYXR0ZXJuID0gYXJnMTsKKwkJCWFwLT5pbmFtZSA9IChwYXJtID09IFBBUk1faW5hbWUpOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QQVRICisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9wYXRoIHx8IHBhcm0gPT0gUEFSTV9pcGF0aCkgeworCQkJYWN0aW9uX3BhdGggKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKHBhdGgpOworCQkJYXAtPnBhdHRlcm4gPSBhcmcxOworCQkJYXAtPmlwYXRoID0gKHBhcm0gPT0gUEFSTV9pcGF0aCk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUkVHRVgKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX3JlZ2V4KSB7CisJCQlhY3Rpb25fcmVnZXggKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKHJlZ2V4KTsKKwkJCXhyZWdjb21wKCZhcC0+Y29tcGlsZWRfcGF0dGVybiwgYXJnMSwgMCAvKmNmbGFncyovKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9UWVBFCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV90eXBlKSB7CisJCQlhY3Rpb25fdHlwZSAqYXA7CisJCQlhcCA9IEFMTE9DX0FDVElPTih0eXBlKTsKKwkJCWFwLT50eXBlX21hc2sgPSBmaW5kX3R5cGUoYXJnMSk7CisJCQlkYmcoImNyZWF0ZWQ6dHlwZSBtYXNrOiV4IiwgYXAtPnR5cGVfbWFzayk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEVSTQorLyogLXBlcm0gQklUUyAgIEZpbGUncyBtb2RlIGJpdHMgYXJlIGV4YWN0bHkgQklUUyAob2N0YWwgb3Igc3ltYm9saWMpLgorICogICAgICAgICAgICAgIFN5bWJvbGljIG1vZGVzIHVzZSBtb2RlIDAgYXMgYSBwb2ludCBvZiBkZXBhcnR1cmUuCisgKiAtcGVybSAtQklUUyAgQWxsIG9mIHRoZSBCSVRTIGFyZSBzZXQgaW4gZmlsZSdzIG1vZGUuCisgKiAtcGVybSArQklUUyAgQXQgbGVhc3Qgb25lIG9mIHRoZSBCSVRTIGlzIHNldCBpbiBmaWxlJ3MgbW9kZS4KKyAqLworCQllbHNlIGlmIChwYXJtID09IFBBUk1fcGVybSkgeworCQkJYWN0aW9uX3Blcm0gKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKHBlcm0pOworCQkJYXAtPnBlcm1fY2hhciA9IGFyZzFbMF07CisJCQlhcmcxID0gcGx1c19taW51c19udW0oYXJnMSk7CisJCQkvKmFwLT5wZXJtX21hc2sgPSAwOyAtIEFMTE9DX0FDVElPTiBkaWQgaXQgKi8KKwkJCWlmICghYmJfcGFyc2VfbW9kZShhcmcxLCAmYXAtPnBlcm1fbWFzaykpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgbW9kZSAnJXMnIiwgYXJnMSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTVRJTUUKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX210aW1lKSB7CisJCQlhY3Rpb25fbXRpbWUgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKG10aW1lKTsKKwkJCWFwLT5tdGltZV9jaGFyID0gYXJnMVswXTsKKwkJCWFwLT5tdGltZV9kYXlzID0geGF0b3VsKHBsdXNfbWludXNfbnVtKGFyZzEpKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9NTUlOCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9tbWluKSB7CisJCQlhY3Rpb25fbW1pbiAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04obW1pbik7CisJCQlhcC0+bW1pbl9jaGFyID0gYXJnMVswXTsKKwkJCWFwLT5tbWluX21pbnMgPSB4YXRvdWwocGx1c19taW51c19udW0oYXJnMSkpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX05FV0VSCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9uZXdlcikgeworCQkJc3RydWN0IHN0YXQgc3RhdF9uZXdlcjsKKwkJCWFjdGlvbl9uZXdlciAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04obmV3ZXIpOworCQkJeHN0YXQoYXJnMSwgJnN0YXRfbmV3ZXIpOworCQkJYXAtPm5ld2VyX210aW1lID0gc3RhdF9uZXdlci5zdF9tdGltZTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9JTlVNCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9pbnVtKSB7CisJCQlhY3Rpb25faW51bSAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04oaW51bSk7CisJCQlhcC0+aW5vZGVfbnVtID0geGF0b3VsKGFyZzEpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1VTRVIKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX3VzZXIpIHsKKwkJCWFjdGlvbl91c2VyICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTih1c2VyKTsKKwkJCWFwLT51aWQgPSBiYl9zdHJ0b3UoYXJnMSwgTlVMTCwgMTApOworCQkJaWYgKGVycm5vKQorCQkJCWFwLT51aWQgPSB4dW5hbWUydWlkKGFyZzEpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0dST1VQCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9ncm91cCkgeworCQkJYWN0aW9uX2dyb3VwICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihncm91cCk7CisJCQlhcC0+Z2lkID0gYmJfc3RydG91KGFyZzEsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubykKKwkJCQlhcC0+Z2lkID0geGdyb3VwMmdpZChhcmcxKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9TSVpFCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9zaXplKSB7CisvKiAtc2l6ZSBuW2Jja3ddOiBmaWxlIHVzZXMgbiB1bml0cyBvZiBzcGFjZQorICogYiAoZGVmYXVsdCk6IHVuaXRzIGFyZSA1MTItYnl0ZSBibG9ja3MKKyAqIGM6IDEgYnl0ZQorICogazoga2lsb2J5dGVzCisgKiB3OiAyLWJ5dGUgd29yZHMKKyAqLworI2lmIEVOQUJMRV9MRlMKKyNkZWZpbmUgWEFUT1VfU0ZYIHhhdG91bGxfc2Z4CisjZWxzZQorI2RlZmluZSBYQVRPVV9TRlggeGF0b3VsX3NmeAorI2VuZGlmCisJCQlzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IGZpbmRfc3VmZml4ZXNbXSA9IHsKKwkJCQl7ICJjIiwgMSB9LAorCQkJCXsgInciLCAyIH0sCisJCQkJeyAiIiwgNTEyIH0sCisJCQkJeyAiYiIsIDUxMiB9LAorCQkJCXsgImsiLCAxMDI0IH0sCisJCQkJeyAiIiwgMCB9CisJCQl9OworCQkJYWN0aW9uX3NpemUgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKHNpemUpOworCQkJYXAtPnNpemVfY2hhciA9IGFyZzFbMF07CisJCQlhcC0+c2l6ZSA9IFhBVE9VX1NGWChwbHVzX21pbnVzX251bShhcmcxKSwgZmluZF9zdWZmaXhlcyk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfQ09OVEVYVAorCQllbHNlIGlmIChwYXJtID09IFBBUk1fY29udGV4dCkgeworCQkJYWN0aW9uX2NvbnRleHQgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKGNvbnRleHQpOworCQkJLyphcC0+Y29udGV4dCA9IE5VTEw7IC0gQUxMT0NfQUNUSU9OIGRpZCBpdCAqLworCQkJLyogU0VMaW51eCBoZWFkZXJzIGVycm9uZW91c2x5IGRlY2xhcmUgbm9uLWNvbnN0IHBhcmFtZXRlciAqLworCQkJaWYgKHNlbGludXhfcmF3X3RvX3RyYW5zX2NvbnRleHQoKGNoYXIqKWFyZzEsICZhcC0+Y29udGV4dCkpCisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coYXJnMSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTElOS1MKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2xpbmtzKSB7CisJCQlhY3Rpb25fbGlua3MgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKGxpbmtzKTsKKwkJCWFwLT5saW5rc19jaGFyID0gYXJnMVswXTsKKwkJCWFwLT5saW5rc19jb3VudCA9IHhhdG91bChwbHVzX21pbnVzX251bShhcmcxKSk7CisJCX0KKyNlbmRpZgorCQllbHNlIHsKKwkJCWJiX2Vycm9yX21zZygidW5yZWNvZ25pemVkOiAlcyIsIGFyZyk7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwkJYXJndisrOworCX0KKwlkYmcoImV4aXRpbmcgJXMiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIGFwcHA7CisjdW5kZWYgQUxMT0NfQUNUSU9OCit9CisKK2ludCBmaW5kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmaW5kX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgZmlyc3RvcHQsIHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKworCUlOSVRfRygpOworCisJYXJndisrOworCWZvciAoZmlyc3RvcHQgPSAwOyBhcmd2W2ZpcnN0b3B0XTsgZmlyc3RvcHQrKykgeworCQlpZiAoYXJndltmaXJzdG9wdF1bMF0gPT0gJy0nKQorCQkJYnJlYWs7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9GSU5EX05PVCAmJiBMT05FX0NIQVIoYXJndltmaXJzdG9wdF0sICchJykpCisJCQlicmVhazsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEFSRU4gJiYgTE9ORV9DSEFSKGFyZ3ZbZmlyc3RvcHRdLCAnKCcpKQorCQkJYnJlYWs7CisJfQorCWlmIChmaXJzdG9wdCA9PSAwKSB7CisJCSotLWFyZ3YgPSAoY2hhciopIi4iOworCQlmaXJzdG9wdCsrOworCX0KKworCUcuYWN0aW9ucyA9IHBhcnNlX3BhcmFtcygmYXJndltmaXJzdG9wdF0pOworCWFyZ3ZbZmlyc3RvcHRdID0gTlVMTDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfWERFVgorCWlmIChHLnhkZXZfb24pIHsKKwkJc3RydWN0IHN0YXQgc3RidWY7CisKKwkJRy54ZGV2X2NvdW50ID0gZmlyc3RvcHQ7CisJCUcueGRldl9kZXYgPSB4emFsbG9jKEcueGRldl9jb3VudCAqIHNpemVvZihHLnhkZXZfZGV2WzBdKSk7CisJCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQkJLyogbm90IHhzdGF0KCk6IHNob3VsZG4ndCBib21iIG91dCBvbgorCQkJICogImZpbmQgbm90X2V4aXN0IGV4aXN0IC14ZGV2IiAqLworCQkJaWYgKHN0YXQoYXJndltpXSwgJnN0YnVmKSA9PSAwKQorCQkJCUcueGRldl9kZXZbaV0gPSBzdGJ1Zi5zdF9kZXY7CisJCQkvKiBlbHNlIEcueGRldl9kZXZbaV0gc3RheXMgMCBhbmQKKwkJCSAqIHdvbid0IG1hdGNoIGFueSByZWFsIGRldmljZSBkZXZfdAorCQkJICovCisJCX0KKwl9CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQlpZiAoIXJlY3Vyc2l2ZV9hY3Rpb24oYXJndltpXSwKKwkJCQlHLnJlY3Vyc2VfZmxhZ3MsLyogZmxhZ3MgKi8KKwkJCQlmaWxlQWN0aW9uLCAgICAgLyogZmlsZSBhY3Rpb24gKi8KKwkJCQlmaWxlQWN0aW9uLCAgICAgLyogZGlyIGFjdGlvbiAqLworCQkJCU5VTEwsICAgICAgICAgICAvKiB1c2VyIGRhdGEgKi8KKwkJCQkwKSAgICAgICAgICAgICAgLyogZGVwdGggKi8KKwkJKSB7CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvZmluZHV0aWxzL2dyZXAuYyBiL2J1c3lib3gtMS4xOS4zL2ZpbmR1dGlscy9ncmVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0MjI0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2ZpbmR1dGlscy9ncmVwLmMKQEAgLTAsMCArMSw3ODEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZ3JlcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveCB1c2luZyBsaWJjIHJlZ2V4LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgTGluZW8sIGluYy4gYW5kIE1hcmsgV2hpdGxleQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBNYXJrIFdoaXRsZXkgPG1hcmt3QGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBCQl9BVURJVCBTVVN2MyBkZWZlY3RzIC0gdW5zdXBwb3J0ZWQgb3B0aW9uIC14ICJtYXRjaCB3aG9sZSBsaW5lIG9ubHkiLiAqLworLyogQkJfQVVESVQgR05VIGRlZmVjdHMgLSBhbHdheXMgYWN0cyBhcyAtYS4gICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2dyZXAuaHRtbCAqLworLyoKKyAqIDIwMDQsMjAwNiAoQykgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PiAtCisgKiBjb3JyZWN0aW9uICItZSBwYXR0ZXJuMSAtZSBwYXR0ZXJuMiIgbG9naWMgYW5kIG1vcmUgb3B0aW1pemF0aW9ucy4KKyAqIHByZWNvbXBpbGVkIHJlZ2V4CisgKgorICogKEMpIDIwMDYgSmFjIEdvdWRzbWl0IGFkZGVkIC1vIG9wdGlvbgorICovCisKKy8vYXBwbGV0OklGX0dSRVAoQVBQTEVUKGdyZXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMoQVBQTEVUX09ERE5BTUUoZWdyZXAsIGdyZXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgZWdyZXApKQorLy9hcHBsZXQ6SUZfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTKEFQUExFVF9PREROQU1FKGZncmVwLCBncmVwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGZncmVwKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0dSRVApICs9IGdyZXAubworCisvL2NvbmZpZzpjb25maWcgR1JFUAorLy9jb25maWc6CWJvb2wgImdyZXAiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZ3JlcCBpcyB1c2VkIHRvIHNlYXJjaCBmaWxlcyBmb3IgYSBzcGVjaWZpZWQgcGF0dGVybi4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb25zIChlZ3JlcCAmIGdyZXAgLUUpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gR1JFUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZWQgc3VwcG9ydCBmb3IgZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucy4gRXh0ZW5kZWQKKy8vY29uZmlnOgkgIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYWxsb3cgZm9yIGFsdGVybmF0aW9uIChmb298YmFyKSwgZ3JvdXBpbmcsCisvL2NvbmZpZzoJICBhbmQgdmFyaW91cyByZXBldGl0aW9uIG9wZXJhdG9ycy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUworLy9jb25maWc6CWJvb2wgIkFsaWFzIGZncmVwIHRvIGdyZXAgLUYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBHUkVQCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZmdyZXAgc2VlcyB0aGUgc2VhcmNoIHBhdHRlcm4gYXMgYSBub3JtYWwgc3RyaW5nIHJhdGhlciB0aGFuCisvL2NvbmZpZzoJICByZWd1bGFyIGV4cHJlc3Npb25zLgorLy9jb25maWc6CSAgZ3JlcCAtRiBhbHdheXMgd29ya3MsIHRoaXMganVzdCBjcmVhdGVzIHRoZSBmZ3JlcCBhbGlhcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfR1JFUF9DT05URVhUCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGJlZm9yZSBhbmQgYWZ0ZXIgY29udGV4dCBmbGFncyAoLUEsIC1CIGFuZCAtQykiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBHUkVQCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUHJpbnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbGVhZGluZyAoLUIpIGFuZC9vciB0cmFpbGluZyAoLUEpCisvL2NvbmZpZzoJICBjb250ZXh0IHN1cnJvdW5kaW5nIG91ciBtYXRjaGluZyBsaW5lcy4KKy8vY29uZmlnOgkgIFByaW50IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgKC1DKS4KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAieHJlZ2V4LmgiCisKKworLyogb3B0aW9ucyAqLworLy91c2FnZTojZGVmaW5lIGdyZXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstSGhubExvcXZzcml3IgorLy91c2FnZTogICAgICAgIkYiCisvL3VzYWdlOglJRl9GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMoIkUiKQorLy91c2FnZToJSUZfRVhUUkFfQ09NUEFUKCJ6IikKKy8vdXNhZ2U6ICAgICAgICJdIFstbSBOXSAiCisvL3VzYWdlOglJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCgiWy1BL0IvQyBOXSAiKQorLy91c2FnZTogICAgICAgIlBBVFRFUk4vLWUgUEFUVEVSTi4uLi8tZiBGSUxFIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBncmVwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VhcmNoIGZvciBQQVRURVJOIGluIEZJTEVzIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJQWRkICdmaWxlbmFtZTonIHByZWZpeCIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJRG8gbm90IGFkZCAnZmlsZW5hbWU6JyBwcmVmaXgiCisvL3VzYWdlOiAgICAgIlxuCS1uCUFkZCAnbGluZV9ubzonIHByZWZpeCIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJU2hvdyBvbmx5IG5hbWVzIG9mIGZpbGVzIHRoYXQgbWF0Y2giCisvL3VzYWdlOiAgICAgIlxuCS1MCVNob3cgb25seSBuYW1lcyBvZiBmaWxlcyB0aGF0IGRvbid0IG1hdGNoIgorLy91c2FnZTogICAgICJcbgktYwlTaG93IG9ubHkgY291bnQgb2YgbWF0Y2hpbmcgbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1vCVNob3cgb25seSB0aGUgbWF0Y2hpbmcgcGFydCBvZiBsaW5lIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldC4gUmV0dXJuIDAgaWYgUEFUVEVSTiBpcyBmb3VuZCwgMSBvdGhlcndpc2UiCisvL3VzYWdlOiAgICAgIlxuCS12CVNlbGVjdCBub24tbWF0Y2hpbmcgbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCVN1cHByZXNzIG9wZW4gYW5kIHJlYWQgZXJyb3JzIgorLy91c2FnZTogICAgICJcbgktcglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktaQlJZ25vcmUgY2FzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJTWF0Y2ggd2hvbGUgd29yZHMgb25seSIKKy8vdXNhZ2U6ICAgICAiXG4JLUYJUEFUVEVSTiBpcyBhIGxpdGVyYWwgKG5vdCByZWdleHApIgorLy91c2FnZToJSUZfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTKAorLy91c2FnZTogICAgICJcbgktRQlQQVRURVJOIGlzIGFuIGV4dGVuZGVkIHJlZ2V4cCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0VYVFJBX0NPTVBBVCgKKy8vdXNhZ2U6ICAgICAiXG4JLXoJSW5wdXQgaXMgTlVMIHRlcm1pbmF0ZWQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1tIE4JTWF0Y2ggdXAgdG8gTiB0aW1lcyBwZXIgZmlsZSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfR1JFUF9DT05URVhUKAorLy91c2FnZTogICAgICJcbgktQSBOCVByaW50IE4gbGluZXMgb2YgdHJhaWxpbmcgY29udGV4dCIKKy8vdXNhZ2U6ICAgICAiXG4JLUIgTglQcmludCBOIGxpbmVzIG9mIGxlYWRpbmcgY29udGV4dCIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgTglTYW1lIGFzICctQSBOIC1CIE4nIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktZSBQVFJOCVBhdHRlcm4gdG8gbWF0Y2giCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJUmVhZCBwYXR0ZXJuIGZyb20gZmlsZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZ3JlcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBncmVwIHJvb3QgL2V0Yy9wYXNzd2RcbiIKKy8vdXNhZ2U6ICAgICAgICJyb290Ong6MDowOnJvb3Q6L3Jvb3Q6L2Jpbi9iYXNoXG4iCisvL3VzYWdlOiAgICAgICAiJCBncmVwIF5bclJdb28uIC9ldGMvcGFzc3dkXG4iCisvL3VzYWdlOiAgICAgICAicm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaFxuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBlZ3JlcF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZWdyZXBfZnVsbF91c2FnZSAiIgorLy91c2FnZTojZGVmaW5lIGZncmVwX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBmZ3JlcF9mdWxsX3VzYWdlICIiCisKKyNkZWZpbmUgT1BUU1RSX0dSRVAgXAorCSJsbnF2c2NGaUhoZTpmOkxvcm06dyIgXAorCUlGX0ZFQVRVUkVfR1JFUF9DT05URVhUKCJBOkI6QzoiKSBcCisJSUZfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTKCJFIikgXAorCUlGX0VYVFJBX0NPTVBBVCgieiIpIFwKKwkiYUkiCisvKiBpZ25vcmVkOiAtYSAiYXNzdW1lIGFsbCBmaWxlcyB0byBiZSB0ZXh0IiAqLworLyogaWdub3JlZDogLUkgImFzc3VtZSBiaW5hcnkgZmlsZXMgaGF2ZSBubyBtYXRjaGVzIiAqLworZW51bSB7CisJT1BUQklUX2wsIC8qIGxpc3QgbWF0Y2hlZCBmaWxlIG5hbWVzIG9ubHkgKi8KKwlPUFRCSVRfbiwgLyogcHJpbnQgbGluZSMgKi8KKwlPUFRCSVRfcSwgLyogcXVpZXQgLSBleGl0KEVYSVRfU1VDQ0VTUykgb2YgZmlyc3QgbWF0Y2ggKi8KKwlPUFRCSVRfdiwgLyogaW52ZXJ0IHRoZSBtYXRjaCwgdG8gc2VsZWN0IG5vbi1tYXRjaGluZyBsaW5lcyAqLworCU9QVEJJVF9zLCAvKiBzdXBwcmVzcyBlcnJvcnMgYWJvdXQgZmlsZSBvcGVuIGVycm9ycyAqLworCU9QVEJJVF9jLCAvKiBjb3VudCBtYXRjaGVzIHBlciBmaWxlIChzdXBwcmVzc2VzIG5vcm1hbCBvdXRwdXQpICovCisJT1BUQklUX0YsIC8qIGxpdGVyYWwgbWF0Y2ggKi8KKwlPUFRCSVRfaSwgLyogY2FzZS1pbnNlbnNpdGl2ZSAqLworCU9QVEJJVF9ILCAvKiBmb3JjZSBmaWxlbmFtZSBkaXNwbGF5ICovCisJT1BUQklUX2gsIC8qIGluaGliaXQgZmlsZW5hbWUgZGlzcGxheSAqLworCU9QVEJJVF9lLCAvKiAtZSBQQVRURVJOICovCisJT1BUQklUX2YsIC8qIC1mIEZJTEVfV0lUSF9QQVRURVJOUyAqLworCU9QVEJJVF9MLCAvKiBsaXN0IHVubWF0Y2hlZCBmaWxlIG5hbWVzIG9ubHkgKi8KKwlPUFRCSVRfbywgLyogc2hvdyBvbmx5IG1hdGNoaW5nIHBhcnRzIG9mIGxpbmVzICovCisJT1BUQklUX3IsIC8qIHJlY3Vyc2UgZGlycyAqLworCU9QVEJJVF9tLCAvKiAtbSBNQVhfTUFUQ0hFUyAqLworCU9QVEJJVF93LCAvKiAtdyB3aG9sZSB3b3JkIG1hdGNoICovCisJSUZfRkVBVFVSRV9HUkVQX0NPTlRFWFQoICAgIE9QVEJJVF9BICwpIC8qIC1BIE5VTTogYWZ0ZXItbWF0Y2ggY29udGV4dCAqLworCUlGX0ZFQVRVUkVfR1JFUF9DT05URVhUKCAgICBPUFRCSVRfQiAsKSAvKiAtQiBOVU06IGJlZm9yZS1tYXRjaCBjb250ZXh0ICovCisJSUZfRkVBVFVSRV9HUkVQX0NPTlRFWFQoICAgIE9QVEJJVF9DICwpIC8qIC1DIE5VTTogLUEgYW5kIC1CIGNvbWJpbmVkICovCisJSUZfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTKE9QVEJJVF9FICwpIC8qIGV4dGVuZGVkIHJlZ2V4cCAqLworCUlGX0VYVFJBX0NPTVBBVCggICAgICAgICAgICBPUFRCSVRfeiAsKSAvKiBpbnB1dCBpcyBOVUwgdGVybWluYXRlZCAqLworCU9QVF9sID0gMSA8PCBPUFRCSVRfbCwKKwlPUFRfbiA9IDEgPDwgT1BUQklUX24sCisJT1BUX3EgPSAxIDw8IE9QVEJJVF9xLAorCU9QVF92ID0gMSA8PCBPUFRCSVRfdiwKKwlPUFRfcyA9IDEgPDwgT1BUQklUX3MsCisJT1BUX2MgPSAxIDw8IE9QVEJJVF9jLAorCU9QVF9GID0gMSA8PCBPUFRCSVRfRiwKKwlPUFRfaSA9IDEgPDwgT1BUQklUX2ksCisJT1BUX0ggPSAxIDw8IE9QVEJJVF9ILAorCU9QVF9oID0gMSA8PCBPUFRCSVRfaCwKKwlPUFRfZSA9IDEgPDwgT1BUQklUX2UsCisJT1BUX2YgPSAxIDw8IE9QVEJJVF9mLAorCU9QVF9MID0gMSA8PCBPUFRCSVRfTCwKKwlPUFRfbyA9IDEgPDwgT1BUQklUX28sCisJT1BUX3IgPSAxIDw8IE9QVEJJVF9yLAorCU9QVF9tID0gMSA8PCBPUFRCSVRfbSwKKwlPUFRfdyA9IDEgPDwgT1BUQklUX3csCisJT1BUX0EgPSBJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgKDEgPDwgT1BUQklUX0EpKSArIDAsCisJT1BUX0IgPSBJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgKDEgPDwgT1BUQklUX0IpKSArIDAsCisJT1BUX0MgPSBJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgKDEgPDwgT1BUQklUX0MpKSArIDAsCisJT1BUX0UgPSBJRl9GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMoKDEgPDwgT1BUQklUX0UpKSArIDAsCisJT1BUX3ogPSBJRl9FWFRSQV9DT01QQVQoICAgICAgICAgICAgKDEgPDwgT1BUQklUX3opKSArIDAsCit9OworCisjZGVmaW5lIFBSSU5UX0ZJTEVTX1dJVEhfTUFUQ0hFUyAgICAob3B0aW9uX21hc2szMiAmIE9QVF9sKQorI2RlZmluZSBQUklOVF9MSU5FX05VTSAgICAgICAgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikKKyNkZWZpbmUgQkVfUVVJRVQgICAgICAgICAgICAgICAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX3EpCisjZGVmaW5lIFNVUFBSRVNTX0VSUl9NU0dTICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9zKQorI2RlZmluZSBQUklOVF9NQVRDSF9DT1VOVFMgICAgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfYykKKyNkZWZpbmUgRkdSRVBfRkxBRyAgICAgICAgICAgICAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX0YpCisjZGVmaW5lIFBSSU5UX0ZJTEVTX1dJVEhPVVRfTUFUQ0hFUyAob3B0aW9uX21hc2szMiAmIE9QVF9MKQorI2RlZmluZSBOVUxfREVMSU1JVEVEICAgICAgICAgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfeikKKworc3RydWN0IGdsb2JhbHMgeworCWludCBtYXhfbWF0Y2hlczsKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCWludCByZWZsYWdzOworI2Vsc2UKKwlSRV9UUkFOU0xBVEVfVFlQRSBjYXNlX2ZvbGQ7IC8qIFJFX1RSQU5TTEFURV9UWVBFIGlzIFtbdW5dc2lnbmVkXSBjaGFyKiAqLworI2VuZGlmCisJc21hbGx1aW50IGludmVydF9zZWFyY2g7CisJc21hbGx1aW50IHByaW50X2ZpbGVuYW1lOworCXNtYWxsdWludCBvcGVuX2Vycm9yczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQKKwlzbWFsbHVpbnQgZGlkX3ByaW50X2xpbmU7CisJaW50IGxpbmVzX2JlZm9yZTsKKwlpbnQgbGluZXNfYWZ0ZXI7CisJY2hhciAqKmJlZm9yZV9idWY7CisJSUZfRVhUUkFfQ09NUEFUKHNpemVfdCAqYmVmb3JlX2J1Zl9zaXplOykKKwlpbnQgbGFzdF9saW5lX3ByaW50ZWQ7CisjZW5kaWYKKwkvKiBnbG9iYWxzIHVzZWQgaW50ZXJuYWxseSAqLworCWxsaXN0X3QgKnBhdHRlcm5faGVhZDsgICAvKiBncm93YWJsZSBsaXN0IG9mIHBhdHRlcm5zIHRvIG1hdGNoICovCisJY29uc3QgY2hhciAqY3VyX2ZpbGU7ICAgIC8qIHRoZSBjdXJyZW50IGZpbGUgd2UgYXJlIHJlYWRpbmcgKi8KK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCXN0cnVjdCBHX3NpemVjaGVjayB7IFwKKwkJY2hhciBHX3NpemVjaGVja1tzaXplb2YoRykgPiBDT01NT05fQlVGU0laRSA/IC0xIDogMV07IFwKKwl9OyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBtYXhfbWF0Y2hlcyAgICAgICAoRy5tYXhfbWF0Y2hlcyAgICAgICAgICkKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorIyBkZWZpbmUgcmVmbGFncyAgICAgICAgICAoRy5yZWZsYWdzICAgICAgICAgICAgICkKKyNlbHNlCisjIGRlZmluZSBjYXNlX2ZvbGQgICAgICAgIChHLmNhc2VfZm9sZCAgICAgICAgICAgKQorLyogaHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9yZWdleC9yZWdleF80Ni5odG1sICovCisjIGRlZmluZSByZWZsYWdzICAgICAgICAgICByZV9zeW50YXhfb3B0aW9ucworIyB1bmRlZiBSRUdfTk9TVUIKKyMgdW5kZWYgUkVHX0VYVEVOREVECisjIHVuZGVmIFJFR19JQ0FTRQorIyBkZWZpbmUgUkVHX05PU1VCICAgIGJ1ZzppczpoZXJlIC8qIHNob3VsZCBub3QgYmUgdXNlZCAqLworLyogSnVzdCBSRV9TWU5UQVhfRUdSRVAgaXMgbm90IGVub3VnaCwgbmVlZCB0byBlbmFibGUge25bLFttXV19IHRvbyAqLworIyBkZWZpbmUgUkVHX0VYVEVOREVEIChSRV9TWU5UQVhfRUdSRVAgfCBSRV9JTlRFUlZBTFMgfCBSRV9OT19CS19CUkFDRVMpCisjIGRlZmluZSBSRUdfSUNBU0UgICAgYnVnOmlzOmhlcmUgLyogc2hvdWxkIG5vdCBiZSB1c2VkICovCisjZW5kaWYKKyNkZWZpbmUgaW52ZXJ0X3NlYXJjaCAgICAgKEcuaW52ZXJ0X3NlYXJjaCAgICAgICApCisjZGVmaW5lIHByaW50X2ZpbGVuYW1lICAgIChHLnByaW50X2ZpbGVuYW1lICAgICAgKQorI2RlZmluZSBvcGVuX2Vycm9ycyAgICAgICAoRy5vcGVuX2Vycm9ycyAgICAgICAgICkKKyNkZWZpbmUgZGlkX3ByaW50X2xpbmUgICAgKEcuZGlkX3ByaW50X2xpbmUgICAgICApCisjZGVmaW5lIGxpbmVzX2JlZm9yZSAgICAgIChHLmxpbmVzX2JlZm9yZSAgICAgICAgKQorI2RlZmluZSBsaW5lc19hZnRlciAgICAgICAoRy5saW5lc19hZnRlciAgICAgICAgICkKKyNkZWZpbmUgYmVmb3JlX2J1ZiAgICAgICAgKEcuYmVmb3JlX2J1ZiAgICAgICAgICApCisjZGVmaW5lIGJlZm9yZV9idWZfc2l6ZSAgIChHLmJlZm9yZV9idWZfc2l6ZSAgICAgKQorI2RlZmluZSBsYXN0X2xpbmVfcHJpbnRlZCAoRy5sYXN0X2xpbmVfcHJpbnRlZCAgICkKKyNkZWZpbmUgcGF0dGVybl9oZWFkICAgICAgKEcucGF0dGVybl9oZWFkICAgICAgICApCisjZGVmaW5lIGN1cl9maWxlICAgICAgICAgIChHLmN1cl9maWxlICAgICAgICAgICAgKQorCisKK3R5cGVkZWYgc3RydWN0IGdyZXBfbGlzdF9kYXRhX3QgeworCWNoYXIgKnBhdHRlcm47CisvKiBmb3IgR05VIHJlZ2V4LCBtYXRjaGVkX3JhbmdlIG11c3QgYmUgcGVyc2lzdGVudCBhY3Jvc3MgZ3JlcF9maWxlKCkgY2FsbHMgKi8KKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCXJlZ2V4X3QgY29tcGlsZWRfcmVnZXg7CisJcmVnbWF0Y2hfdCBtYXRjaGVkX3JhbmdlOworI2Vsc2UKKwlzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgY29tcGlsZWRfcmVnZXg7CisJc3RydWN0IHJlX3JlZ2lzdGVycyBtYXRjaGVkX3JhbmdlOworI2VuZGlmCisjZGVmaW5lIEFMTE9DQVRFRCAxCisjZGVmaW5lIENPTVBJTEVEIDIKKwlpbnQgZmxnX21lbV9hbG9jYXRlZF9jb21waWxlZDsKK30gZ3JlcF9saXN0X2RhdGFfdDsKKworI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisjZGVmaW5lIHByaW50X2xpbmUobGluZSwgbGluZV9sZW4sIGxpbmVudW0sIGRlY29yYXRpb24pIFwKKwlwcmludF9saW5lKGxpbmUsIGxpbmVudW0sIGRlY29yYXRpb24pCisjZW5kaWYKK3N0YXRpYyB2b2lkIHByaW50X2xpbmUoY29uc3QgY2hhciAqbGluZSwgc2l6ZV90IGxpbmVfbGVuLCBpbnQgbGluZW51bSwgY2hhciBkZWNvcmF0aW9uKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0dSRVBfQ09OVEVYVAorCS8qIEhhcHBlbnMgd2hlbiB3ZSBnbyB0byBuZXh0IGZpbGUsIGltbWVkaWF0ZWx5IGhpdCBtYXRjaAorCSAqIGFuZCB0cnkgdG8gcHJpbnQgcHJldiBjb250ZXh0Li4uIGZyb20gcHJldiBmaWxlISBEb24ndCBkbyBpdCAqLworCWlmIChsaW5lbnVtIDwgMSkKKwkJcmV0dXJuOworCS8qIHBvc3NpYmx5IHByaW50IHRoZSBsaXR0bGUgJy0tJyBzZXBhcmF0b3IgKi8KKwlpZiAoKGxpbmVzX2JlZm9yZSB8fCBsaW5lc19hZnRlcikgJiYgZGlkX3ByaW50X2xpbmUKKwkgJiYgbGFzdF9saW5lX3ByaW50ZWQgIT0gbGluZW51bSAtIDEKKwkpIHsKKwkJcHV0cygiLS0iKTsKKwl9CisJLyogZ3VhcmQgYWdhaW5zdCBwcmludGluZyAiLS0iIGJlZm9yZSBmaXJzdCBsaW5lIG9mIGZpcnN0IGZpbGUgKi8KKwlkaWRfcHJpbnRfbGluZSA9IDE7CisJbGFzdF9saW5lX3ByaW50ZWQgPSBsaW5lbnVtOworI2VuZGlmCisJaWYgKHByaW50X2ZpbGVuYW1lKQorCQlwcmludGYoIiVzJWMiLCBjdXJfZmlsZSwgZGVjb3JhdGlvbik7CisJaWYgKFBSSU5UX0xJTkVfTlVNKQorCQlwcmludGYoIiVpJWMiLCBsaW5lbnVtLCBkZWNvcmF0aW9uKTsKKwkvKiBFbXVsYXRlIHdlaXJkIEdOVSBncmVwIGJlaGF2aW9yIHdpdGggLW92ICovCisJaWYgKChvcHRpb25fbWFzazMyICYgKE9QVF92fE9QVF9vKSkgIT0gKE9QVF92fE9QVF9vKSkgeworI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisJCXB1dHMobGluZSk7CisjZWxzZQorCQlmd3JpdGUobGluZSwgMSwgbGluZV9sZW4sIHN0ZG91dCk7CisJCXB1dGNoYXIoTlVMX0RFTElNSVRFRCA/ICdcMCcgOiAnXG4nKTsKKyNlbmRpZgorCX0KK30KKworI2lmIEVOQUJMRV9FWFRSQV9DT01QQVQKKy8qIFVubGlrZSBnZXRsaW5lLCB0aGlzIG9uZSByZW1vdmVzIHRyYWlsaW5nICdcbicgKi8KK3N0YXRpYyBzc2l6ZV90IEZBU1RfRlVOQyBiYl9nZXRsaW5lKGNoYXIgKipsaW5lX3B0ciwgc2l6ZV90ICpsaW5lX2FsbG9jX2xlbiwgRklMRSAqZmlsZSkKK3sKKwlzc2l6ZV90IHJlc19zejsKKwljaGFyICpsaW5lOworCWludCBkZWxpbSA9IChOVUxfREVMSU1JVEVEID8gJ1wwJyA6ICdcbicpOworCisJcmVzX3N6ID0gZ2V0ZGVsaW0obGluZV9wdHIsIGxpbmVfYWxsb2NfbGVuLCBkZWxpbSwgZmlsZSk7CisJbGluZSA9ICpsaW5lX3B0cjsKKworCWlmIChyZXNfc3ogPiAwKSB7CisJCWlmIChsaW5lW3Jlc19zeiAtIDFdID09IGRlbGltKQorCQkJbGluZVstLXJlc19zel0gPSAnXDAnOworCX0gZWxzZSB7CisJCWZyZWUobGluZSk7IC8qIHVjbGliYyBhbGxvY2F0ZXMgYSBidWZmZXIgZXZlbiBvbiBFT0YuIFdURj8gKi8KKwl9CisJcmV0dXJuIHJlc19zejsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdyZXBfZmlsZShGSUxFICpmaWxlKQoreworCXNtYWxsdWludCBmb3VuZDsKKwlpbnQgbGluZW51bSA9IDA7CisJaW50IG5tYXRjaGVzID0gMDsKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCWNoYXIgKmxpbmU7CisjZWxzZQorCWNoYXIgKmxpbmUgPSBOVUxMOworCXNzaXplX3QgbGluZV9sZW47CisJc2l6ZV90IGxpbmVfYWxsb2NfbGVuOworIyBkZWZpbmUgcm1fc28gc3RhcnRbMF0KKyMgZGVmaW5lIHJtX2VvIGVuZFswXQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfR1JFUF9DT05URVhUCisJaW50IHByaW50X25fbGluZXNfYWZ0ZXIgPSAwOworCWludCBjdXJwb3MgPSAwOyAvKiB0cmFjayB3aGVyZSB3ZSBhcmUgaW4gdGhlIGNpcmN1bGFyICdiZWZvcmUnIGJ1ZmZlciAqLworCWludCBpZHggPSAwOyAvKiB1c2VkIGZvciBpdGVyYXRpb24gdGhyb3VnaCB0aGUgY2lyY3VsYXIgYnVmZmVyICovCisjZWxzZQorCWVudW0geyBwcmludF9uX2xpbmVzX2FmdGVyID0gMCB9OworI2VuZGlmCisKKwl3aGlsZSAoCisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGZpbGUpKSAhPSBOVUxMCisjZWxzZQorCQkobGluZV9sZW4gPSBiYl9nZXRsaW5lKCZsaW5lLCAmbGluZV9hbGxvY19sZW4sIGZpbGUpKSA+PSAwCisjZW5kaWYKKwkpIHsKKwkJbGxpc3RfdCAqcGF0dGVybl9wdHIgPSBwYXR0ZXJuX2hlYWQ7CisJCWdyZXBfbGlzdF9kYXRhX3QgKmdsID0gZ2w7IC8qIGZvciBnY2MgKi8KKworCQlsaW5lbnVtKys7CisJCWZvdW5kID0gMDsKKwkJd2hpbGUgKHBhdHRlcm5fcHRyKSB7CisJCQlnbCA9IChncmVwX2xpc3RfZGF0YV90ICopcGF0dGVybl9wdHItPmRhdGE7CisJCQlpZiAoRkdSRVBfRkxBRykgeworCQkJCWZvdW5kIHw9ICgoKG9wdGlvbl9tYXNrMzIgJiBPUFRfaSkKKwkJCQkJPyBzdHJjYXNlc3RyKGxpbmUsIGdsLT5wYXR0ZXJuKQorCQkJCQk6IHN0cnN0cihsaW5lLCBnbC0+cGF0dGVybikKKwkJCQkJKSAhPSBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCEoZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgJiBDT01QSUxFRCkpIHsKKwkJCQkJZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgfD0gQ09NUElMRUQ7CisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJCQkJeHJlZ2NvbXAoJmdsLT5jb21waWxlZF9yZWdleCwgZ2wtPnBhdHRlcm4sIHJlZmxhZ3MpOworI2Vsc2UKKwkJCQkJbWVtc2V0KCZnbC0+Y29tcGlsZWRfcmVnZXgsIDAsIHNpemVvZihnbC0+Y29tcGlsZWRfcmVnZXgpKTsKKwkJCQkJZ2wtPmNvbXBpbGVkX3JlZ2V4LnRyYW5zbGF0ZSA9IGNhc2VfZm9sZDsgLyogZm9yIC1pICovCisJCQkJCWlmIChyZV9jb21waWxlX3BhdHRlcm4oZ2wtPnBhdHRlcm4sIHN0cmxlbihnbC0+cGF0dGVybiksICZnbC0+Y29tcGlsZWRfcmVnZXgpKQorCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByZWdleCAnJXMnIiwgZ2wtPnBhdHRlcm4pOworI2VuZGlmCisJCQkJfQorI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisJCQkJZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fc28gPSAwOworCQkJCWdsLT5tYXRjaGVkX3JhbmdlLnJtX2VvID0gMDsKKyNlbmRpZgorCQkJCWlmICgKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQkJCQlyZWdleGVjKCZnbC0+Y29tcGlsZWRfcmVnZXgsIGxpbmUsIDEsICZnbC0+bWF0Y2hlZF9yYW5nZSwgMCkgPT0gMAorI2Vsc2UKKwkJCQkJcmVfc2VhcmNoKCZnbC0+Y29tcGlsZWRfcmVnZXgsIGxpbmUsIGxpbmVfbGVuLAorCQkJCQkJCS8qc3RhcnQ6Ki8gMCwgLypyYW5nZToqLyBsaW5lX2xlbiwKKwkJCQkJCQkmZ2wtPm1hdGNoZWRfcmFuZ2UpID49IDAKKyNlbmRpZgorCQkJCSkgeworCQkJCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX3cpKQorCQkJCQkJZm91bmQgPSAxOworCQkJCQllbHNlIHsKKwkJCQkJCWNoYXIgYyA9ICcgJzsKKwkJCQkJCWlmIChnbC0+bWF0Y2hlZF9yYW5nZS5ybV9zbykKKwkJCQkJCQljID0gbGluZVtnbC0+bWF0Y2hlZF9yYW5nZS5ybV9zbyAtIDFdOworCQkJCQkJaWYgKCFpc2FsbnVtKGMpICYmIGMgIT0gJ18nKSB7CisJCQkJCQkJYyA9IGxpbmVbZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW9dOworCQkJCQkJCWlmICghYyB8fCAoIWlzYWxudW0oYykgJiYgYyAhPSAnXycpKQorCQkJCQkJCQlmb3VuZCA9IDE7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKiBJZiBpdCdzIG5vbi1pbnZlcnRlZCBzZWFyY2gsIHdlIGNhbiBzdG9wCisJCQkgKiBhdCBmaXJzdCBtYXRjaCAqLworCQkJaWYgKGZvdW5kICYmICFpbnZlcnRfc2VhcmNoKQorCQkJCWdvdG8gZG9fZm91bmQ7CisJCQlwYXR0ZXJuX3B0ciA9IHBhdHRlcm5fcHRyLT5saW5rOworCQl9IC8qIHdoaWxlIChwYXR0ZXJuX3B0cikgKi8KKworCQlpZiAoZm91bmQgXiBpbnZlcnRfc2VhcmNoKSB7CisgZG9fZm91bmQ6CisJCQkvKiBrZWVwIHRyYWNrIG9mIG1hdGNoZXMgKi8KKwkJCW5tYXRjaGVzKys7CisKKwkJCS8qIHF1aWV0L3ByaW50IChub24pbWF0Y2hpbmcgZmlsZSBuYW1lcyBvbmx5PyAqLworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiAoT1BUX3F8T1BUX2x8T1BUX0wpKSB7CisJCQkJZnJlZShsaW5lKTsgLyogd2UgZG9uJ3QgbmVlZCBsaW5lIGFueW1vcmUgKi8KKwkJCQlpZiAoQkVfUVVJRVQpIHsKKwkJCQkJLyogbWFucGFnZSBzYXlzIGFib3V0IC1xOgorCQkJCQkgKiAiZXhpdCBpbW1lZGlhdGVseSB3aXRoIHplcm8gc3RhdHVzCisJCQkJCSAqIGlmIGFueSBtYXRjaCBpcyBmb3VuZCwKKwkJCQkJICogZXZlbiBpZiBlcnJvcnMgd2VyZSBkZXRlY3RlZCIgKi8KKwkJCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQkJCX0KKwkJCQkvKiBpZiB3ZSdyZSBqdXN0IHByaW50aW5nIGZpbGVuYW1lcywgd2Ugc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2ggKi8KKwkJCQlpZiAoUFJJTlRfRklMRVNfV0lUSF9NQVRDSEVTKSB7CisJCQkJCXB1dHMoY3VyX2ZpbGUpOworCQkJCQkvKiBmYWxsIHRocm91Z2ggdG8gInJldHVybiAxIiAqLworCQkJCX0KKwkJCQkvKiBPUFRfTCBha2EgUFJJTlRfRklMRVNfV0lUSE9VVF9NQVRDSEVTOiByZXR1cm4gZWFybHkgKi8KKwkJCQlyZXR1cm4gMTsgLyogb25lIG1hdGNoICovCisJCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQKKwkJCS8qIFdlcmUgd2UgcHJpbnRpbmcgY29udGV4dCBhbmQgc2F3IG5leHQgKHVud2FudGVkKSBtYXRjaD8gKi8KKwkJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9tKSAmJiBubWF0Y2hlcyA+IG1heF9tYXRjaGVzKQorCQkJCWJyZWFrOworI2VuZGlmCisKKwkJCS8qIHByaW50IHRoZSBtYXRjaGVkIGxpbmUgKi8KKwkJCWlmIChQUklOVF9NQVRDSF9DT1VOVFMgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0dSRVBfQ09OVEVYVAorCQkJCWludCBwcmV2cG9zID0gKGN1cnBvcyA9PSAwKSA/IGxpbmVzX2JlZm9yZSAtIDEgOiBjdXJwb3MgLSAxOworCisJCQkJLyogaWYgd2Ugd2VyZSB0b2xkIHRvIHByaW50ICdiZWZvcmUnIGxpbmVzIGFuZCB0aGVyZSBpcyBhdCBsZWFzdAorCQkJCSAqIG9uZSBsaW5lIGluIHRoZSBjaXJjdWxhciBidWZmZXIsIHByaW50IHRoZW0gKi8KKwkJCQlpZiAobGluZXNfYmVmb3JlICYmIGJlZm9yZV9idWZbcHJldnBvc10gIT0gTlVMTCkgeworCQkJCQlpbnQgZmlyc3RfYnVmX2VudHJ5X2xpbmVfbnVtID0gbGluZW51bSAtIGxpbmVzX2JlZm9yZTsKKworCQkJCQkvKiBhZHZhbmNlIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyLCBhbmQKKwkJCQkJICogZmlndXJlIG91dCB0aGUgbGluZSBudW1iZXIgaXMgb2YgdGhlIGZpcnN0IGxpbmUgaW4gdGhlCisJCQkJCSAqIGJ1ZmZlciAqLworCQkJCQlpZHggPSBjdXJwb3M7CisJCQkJCXdoaWxlIChiZWZvcmVfYnVmW2lkeF0gPT0gTlVMTCkgeworCQkJCQkJaWR4ID0gKGlkeCArIDEpICUgbGluZXNfYmVmb3JlOworCQkJCQkJZmlyc3RfYnVmX2VudHJ5X2xpbmVfbnVtKys7CisJCQkJCX0KKworCQkJCQkvKiBub3cgcHJpbnQgZWFjaCBsaW5lIGluIHRoZSBidWZmZXIsIGNsZWFyaW5nIHRoZW0gYXMgd2UgZ28gKi8KKwkJCQkJd2hpbGUgKGJlZm9yZV9idWZbaWR4XSAhPSBOVUxMKSB7CisJCQkJCQlwcmludF9saW5lKGJlZm9yZV9idWZbaWR4XSwgYmVmb3JlX2J1Zl9zaXplW2lkeF0sIGZpcnN0X2J1Zl9lbnRyeV9saW5lX251bSwgJy0nKTsKKwkJCQkJCWZyZWUoYmVmb3JlX2J1ZltpZHhdKTsKKwkJCQkJCWJlZm9yZV9idWZbaWR4XSA9IE5VTEw7CisJCQkJCQlpZHggPSAoaWR4ICsgMSkgJSBsaW5lc19iZWZvcmU7CisJCQkJCQlmaXJzdF9idWZfZW50cnlfbGluZV9udW0rKzsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIG1ha2UgYSBub3RlIHRoYXQgd2UgbmVlZCB0byBwcmludCAnYWZ0ZXInIGxpbmVzICovCisJCQkJcHJpbnRfbl9saW5lc19hZnRlciA9IGxpbmVzX2FmdGVyOworI2VuZGlmCisJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbykgeworCQkJCQlpZiAoRkdSRVBfRkxBRykgeworCQkJCQkJLyogLUZvIGp1c3QgcHJpbnRzIHRoZSBwYXR0ZXJuCisJCQkJCQkgKiAodW5sZXNzIC12OiAtRm92IGRvZXNudCBwcmludCBhbnl0aGluZyBhdCBhbGwpICovCisJCQkJCQlpZiAoZm91bmQpCisJCQkJCQkJcHJpbnRfbGluZShnbC0+cGF0dGVybiwgc3RybGVuKGdsLT5wYXR0ZXJuKSwgbGluZW51bSwgJzonKTsKKwkJCQkJfSBlbHNlIHdoaWxlICgxKSB7CisJCQkJCQl1bnNpZ25lZCBzdGFydCA9IGdsLT5tYXRjaGVkX3JhbmdlLnJtX3NvOworCQkJCQkJdW5zaWduZWQgZW5kID0gZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW87CisJCQkJCQl1bnNpZ25lZCBsZW4gPSBlbmQgLSBzdGFydDsKKwkJCQkJCWNoYXIgb2xkID0gbGluZVtlbmRdOworCQkJCQkJbGluZVtlbmRdID0gJ1wwJzsKKwkJCQkJCS8qIEVtcHR5IG1hdGNoIGlzIG5vdCBwcmludGVkOiB0cnkgImVjaG8gdGVzdCB8IGdyZXAgLW8gJyciICovCisJCQkJCQlpZiAobGVuICE9IDApCisJCQkJCQkJcHJpbnRfbGluZShsaW5lICsgc3RhcnQsIGxlbiwgbGluZW51bSwgJzonKTsKKwkJCQkJCWlmIChvbGQgPT0gJ1wwJykKKwkJCQkJCQlicmVhazsKKwkJCQkJCWxpbmVbZW5kXSA9IG9sZDsKKwkJCQkJCWlmIChsZW4gPT0gMCkKKwkJCQkJCQllbmQrKzsKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQkJCQkJaWYgKHJlZ2V4ZWMoJmdsLT5jb21waWxlZF9yZWdleCwgbGluZSArIGVuZCwKKwkJCQkJCQkJMSwgJmdsLT5tYXRjaGVkX3JhbmdlLCBSRUdfTk9UQk9MKSAhPSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQkJZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fc28gKz0gZW5kOworCQkJCQkJZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW8gKz0gZW5kOworI2Vsc2UKKwkJCQkJCWlmIChyZV9zZWFyY2goJmdsLT5jb21waWxlZF9yZWdleCwgbGluZSwgbGluZV9sZW4sCisJCQkJCQkJCWVuZCwgbGluZV9sZW4gLSBlbmQsCisJCQkJCQkJCSZnbC0+bWF0Y2hlZF9yYW5nZSkgPCAwKQorCQkJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwcmludF9saW5lKGxpbmUsIGxpbmVfbGVuLCBsaW5lbnVtLCAnOicpOworCQkJCX0KKwkJCX0KKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0dSRVBfQ09OVEVYVAorCQllbHNlIHsgLyogbm8gbWF0Y2ggKi8KKwkJCS8qIGlmIHdlIG5lZWQgdG8gcHJpbnQgc29tZSBjb250ZXh0IGxpbmVzIGFmdGVyIHRoZSBsYXN0IG1hdGNoLCBkbyBzbyAqLworCQkJaWYgKHByaW50X25fbGluZXNfYWZ0ZXIpIHsKKwkJCQlwcmludF9saW5lKGxpbmUsIHN0cmxlbihsaW5lKSwgbGluZW51bSwgJy0nKTsKKwkJCQlwcmludF9uX2xpbmVzX2FmdGVyLS07CisJCQl9IGVsc2UgaWYgKGxpbmVzX2JlZm9yZSkgeworCQkJCS8qIEFkZCB0aGUgbGluZSB0byB0aGUgY2lyY3VsYXIgJ2JlZm9yZScgYnVmZmVyICovCisJCQkJZnJlZShiZWZvcmVfYnVmW2N1cnBvc10pOworCQkJCWJlZm9yZV9idWZbY3VycG9zXSA9IGxpbmU7CisJCQkJSUZfRVhUUkFfQ09NUEFUKGJlZm9yZV9idWZfc2l6ZVtjdXJwb3NdID0gbGluZV9sZW47KQorCQkJCWN1cnBvcyA9IChjdXJwb3MgKyAxKSAlIGxpbmVzX2JlZm9yZTsKKwkJCQkvKiBhdm9pZCBmcmVlKGxpbmUpIC0gd2UgdG9vayB0aGUgbGluZSAqLworCQkJCWxpbmUgPSBOVUxMOworCQkJfQorCQl9CisKKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQgKi8KKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQlmcmVlKGxpbmUpOworI2VuZGlmCisJCS8qIERpZCB3ZSBwcmludCBhbGwgY29udGV4dCBhZnRlciBsYXN0IHJlcXVlc3RlZCBtYXRjaD8gKi8KKwkJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX20pCisJCSAmJiAhcHJpbnRfbl9saW5lc19hZnRlcgorCQkgJiYgbm1hdGNoZXMgPT0gbWF4X21hdGNoZXMKKwkJKSB7CisJCQlicmVhazsKKwkJfQorCX0gLyogd2hpbGUgKHJlYWQgbGluZSkgKi8KKworCS8qIHNwZWNpYWwtY2FzZSBmaWxlIHBvc3QtcHJvY2Vzc2luZyBmb3Igb3B0aW9ucyB3aGVyZSB3ZSBkb24ndCBwcmludCBsaW5lCisJICogbWF0Y2hlcywganVzdCBmaWxlbmFtZXMgYW5kIHBvc3NpYmx5IG1hdGNoIGNvdW50cyAqLworCisJLyogZ3JlcCAtYzogcHJpbnQgW2ZpbGVuYW1lOl1jb3VudCwgZXZlbiBpZiBjb3VudCBpcyB6ZXJvICovCisJaWYgKFBSSU5UX01BVENIX0NPVU5UUykgeworCQlpZiAocHJpbnRfZmlsZW5hbWUpCisJCQlwcmludGYoIiVzOiIsIGN1cl9maWxlKTsKKwkJcHJpbnRmKCIlZFxuIiwgbm1hdGNoZXMpOworCX0KKworCS8qIGdyZXAgLUw6IHByaW50IGp1c3QgdGhlIGZpbGVuYW1lICovCisJaWYgKFBSSU5UX0ZJTEVTX1dJVEhPVVRfTUFUQ0hFUykgeworCQkvKiBubWF0Y2hlcyBpcyB6ZXJvLCBubyBuZWVkIHRvIGNoZWNrIGl0OgorCQkgKiB3ZSByZXR1cm4gMSBlYXJseSBpZiB3ZSBkZXRlY3RlZCBhIG1hdGNoCisJCSAqIGFuZCBQUklOVF9GSUxFU19XSVRIT1VUX01BVENIRVMgaXMgc2V0ICovCisJCXB1dHMoY3VyX2ZpbGUpOworCX0KKworCXJldHVybiBubWF0Y2hlczsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCisjZGVmaW5lIG5ld19ncmVwX2xpc3RfZGF0YShwLCBtKSBhZGRfZ3JlcF9saXN0X2RhdGEocCwgbSkKK3N0YXRpYyBjaGFyICphZGRfZ3JlcF9saXN0X2RhdGEoY2hhciAqcGF0dGVybiwgaW50IGZsZ191c2VkX21lbSkKKyNlbHNlCisjZGVmaW5lIG5ld19ncmVwX2xpc3RfZGF0YShwLCBtKSBhZGRfZ3JlcF9saXN0X2RhdGEocCkKK3N0YXRpYyBjaGFyICphZGRfZ3JlcF9saXN0X2RhdGEoY2hhciAqcGF0dGVybikKKyNlbmRpZgoreworCWdyZXBfbGlzdF9kYXRhX3QgKmdsID0geHphbGxvYyhzaXplb2YoKmdsKSk7CisJZ2wtPnBhdHRlcm4gPSBwYXR0ZXJuOworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCisJZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgPSBmbGdfdXNlZF9tZW07CisjZWxzZQorCS8qZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgPSAwOyovCisjZW5kaWYKKwlyZXR1cm4gKGNoYXIgKilnbDsKK30KKworc3RhdGljIHZvaWQgbG9hZF9yZWdleGVzX2Zyb21fZmlsZShsbGlzdF90ICpmb3B0KQoreworCXdoaWxlIChmb3B0KSB7CisJCWNoYXIgKmxpbmU7CisJCUZJTEUgKmZwOworCQlsbGlzdF90ICpjdXIgPSBmb3B0OworCQljaGFyICpmZmlsZSA9IGN1ci0+ZGF0YTsKKworCQlmb3B0ID0gY3VyLT5saW5rOworCQlmcmVlKGN1cik7CisJCWZwID0geGZvcGVuX3N0ZGluKGZmaWxlKTsKKwkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpIHsKKwkJCWxsaXN0X2FkZF90bygmcGF0dGVybl9oZWFkLAorCQkJCW5ld19ncmVwX2xpc3RfZGF0YShsaW5lLCBBTExPQ0FURUQpKTsKKwkJfQorCQlmY2xvc2VfaWZfbm90X3N0ZGluKGZwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVfYWN0aW9uX2dyZXAoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sCisJCQl2b2lkKiBtYXRjaGVkLAorCQkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlGSUxFICpmaWxlID0gZm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCWlmIChmaWxlID09IE5VTEwpIHsKKwkJaWYgKCFTVVBQUkVTU19FUlJfTVNHUykKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVuYW1lKTsKKwkJb3Blbl9lcnJvcnMgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJY3VyX2ZpbGUgPSBmaWxlbmFtZTsKKwkqKGludCopbWF0Y2hlZCArPSBncmVwX2ZpbGUoZmlsZSk7CisJZmNsb3NlKGZpbGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdyZXBfZGlyKGNvbnN0IGNoYXIgKmRpcikKK3sKKwlpbnQgbWF0Y2hlZCA9IDA7CisJcmVjdXJzaXZlX2FjdGlvbihkaXIsCisJCS8qIHJlY3Vyc2U9eWVzICovIEFDVElPTl9SRUNVUlNFIHwKKwkJLyogZm9sbG93TGlua3M9bm8gKi8KKwkJLyogZGVwdGhGaXJzdD15ZXMgKi8gQUNUSU9OX0RFUFRIRklSU1QsCisJCS8qIGZpbGVBY3Rpb249ICovIGZpbGVfYWN0aW9uX2dyZXAsCisJCS8qIGRpckFjdGlvbj0gKi8gTlVMTCwKKwkJLyogdXNlckRhdGE9ICovICZtYXRjaGVkLAorCQkvKiBkZXB0aD0gKi8gMCk7CisJcmV0dXJuIG1hdGNoZWQ7Cit9CisKK2ludCBncmVwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBncmVwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICpmaWxlOworCWludCBtYXRjaGVkOworCWxsaXN0X3QgKmZvcHQgPSBOVUxMOworCisJLyogZG8gbm9ybWFsIG9wdGlvbiBwYXJzaW5nICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfR1JFUF9DT05URVhUCisJaW50IENvcHQsIG9wdHM7CisKKwkvKiAtSCB1bnNldHMgLWg7IC1DIHVuc2V0cyAtQSwtQjsgLWUsLWYgYXJlIGxpc3RzOworCSAqIC1tLC1BLC1CLC1DIGhhdmUgbnVtZXJpYyBwYXJhbSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIkgtaDpDLUFCOmU6OmY6Om0rOkErOkIrOkMrIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwKKwkJT1BUU1RSX0dSRVAsCisJCSZwYXR0ZXJuX2hlYWQsICZmb3B0LCAmbWF4X21hdGNoZXMsCisJCSZsaW5lc19hZnRlciwgJmxpbmVzX2JlZm9yZSwgJkNvcHQpOworCisJaWYgKG9wdHMgJiBPUFRfQykgeworCQkvKiAtQyB1bnNldHMgcHJldiAtQSBhbmQgLUIsIGJ1dCBmb2xsb3dpbmcgLUEgb3IgLUIKKwkJICAgbWF5IG92ZXJyaWRlIGl0ICovCisJCWlmICghKG9wdHMgJiBPUFRfQSkpIC8qIG5vdCBvdmVycmlkZGVuICovCisJCQlsaW5lc19hZnRlciA9IENvcHQ7CisJCWlmICghKG9wdHMgJiBPUFRfQikpIC8qIG5vdCBvdmVycmlkZGVuICovCisJCQlsaW5lc19iZWZvcmUgPSBDb3B0OworCX0KKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKG9wdHMgJiAoT1BUX2N8T1BUX3F8T1BUX2x8T1BUX0wpKSB7CisJCW9wdGlvbl9tYXNrMzIgJj0gfk9QVF9uOworCQlsaW5lc19iZWZvcmUgPSAwOworCQlsaW5lc19hZnRlciA9IDA7CisJfSBlbHNlIGlmIChsaW5lc19iZWZvcmUgPiAwKSB7CisJCWlmIChsaW5lc19iZWZvcmUgPiBJTlRfTUFYIC8gc2l6ZW9mKGxvbmcgbG9uZykpCisJCQlsaW5lc19iZWZvcmUgPSBJTlRfTUFYIC8gc2l6ZW9mKGxvbmcgbG9uZyk7CisJCS8qIG92ZXJmbG93IGluIChsaW5lc19iZWZvcmUgKiBzaXplb2YoeCkpIGlzIHByZXZlbnRlZCAoYWJvdmUpICovCisJCWJlZm9yZV9idWYgPSB4emFsbG9jKGxpbmVzX2JlZm9yZSAqIHNpemVvZihiZWZvcmVfYnVmWzBdKSk7CisJCUlGX0VYVFJBX0NPTVBBVChiZWZvcmVfYnVmX3NpemUgPSB4emFsbG9jKGxpbmVzX2JlZm9yZSAqIHNpemVvZihiZWZvcmVfYnVmX3NpemVbMF0pKTspCisJfQorI2Vsc2UKKwkvKiB3aXRoIGF1dG8gc2FuaXR5IGNoZWNrcyAqLworCS8qIC1IIHVuc2V0cyAtaDsgLWMsLXEgb3IgLWwgdW5zZXQgLW47IC1lLC1mIGFyZSBsaXN0czsgLW0gTiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIkgtaDpjLW46cS1uOmwtbjplOjpmOjptKyI7CisJZ2V0b3B0MzIoYXJndiwgT1BUU1RSX0dSRVAsCisJCSZwYXR0ZXJuX2hlYWQsICZmb3B0LCAmbWF4X21hdGNoZXMpOworI2VuZGlmCisJaW52ZXJ0X3NlYXJjaCA9ICgob3B0aW9uX21hc2szMiAmIE9QVF92KSAhPSAwKTsgLyogMCB8IDEgKi8KKworCXsJLyogY29udmVydCBjaGFyICoqYXJndiB0byBncmVwX2xpc3RfZGF0YV90ICovCisJCWxsaXN0X3QgKmN1cjsKKwkJZm9yIChjdXIgPSBwYXR0ZXJuX2hlYWQ7IGN1cjsgY3VyID0gY3VyLT5saW5rKQorCQkJY3VyLT5kYXRhID0gbmV3X2dyZXBfbGlzdF9kYXRhKGN1ci0+ZGF0YSwgMCk7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2YpIHsKKwkJbG9hZF9yZWdleGVzX2Zyb21fZmlsZShmb3B0KTsKKwkJaWYgKCFwYXR0ZXJuX2hlYWQpIHsgLyogLWYgRU1QVFlfRklMRT8gKi8KKwkJCS8qIEdOVSBncmVwIHRyZWF0cyBpdCBhcyAibm90aGluZyBtYXRjaGVzIiAqLworCQkJbGxpc3RfYWRkX3RvKCZwYXR0ZXJuX2hlYWQsIG5ld19ncmVwX2xpc3RfZGF0YSgoY2hhciopICIiLCAwKSk7CisJCQlpbnZlcnRfc2VhcmNoIF49IDE7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUyAmJiBhcHBsZXRfbmFtZVswXSA9PSAnZicpCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX0Y7CisKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCWlmICghKG9wdGlvbl9tYXNrMzIgJiAoT1BUX28gfCBPUFRfdykpKQorCQlyZWZsYWdzID0gUkVHX05PU1VCOworI2VuZGlmCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUworCSAmJiAoYXBwbGV0X25hbWVbMF0gPT0gJ2UnIHx8IChvcHRpb25fbWFzazMyICYgT1BUX0UpKQorCSkgeworCQlyZWZsYWdzIHw9IFJFR19FWFRFTkRFRDsKKwl9CisjaWYgRU5BQkxFX0VYVFJBX0NPTVBBVAorCWVsc2UgeworCQlyZWZsYWdzID0gUkVfU1lOVEFYX0dSRVA7CisJfQorI2VuZGlmCisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9pKSB7CisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJcmVmbGFncyB8PSBSRUdfSUNBU0U7CisjZWxzZQorCQlpbnQgaTsKKwkJY2FzZV9mb2xkID0geG1hbGxvYygyNTYpOworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQljYXNlX2ZvbGRbaV0gPSAodW5zaWduZWQgY2hhcilpOworCQlmb3IgKGkgPSAnYSc7IGkgPD0gJ3onOyBpKyspCisJCQljYXNlX2ZvbGRbaV0gPSAodW5zaWduZWQgY2hhcikoaSAtICgnYScgLSAnQScpKTsKKyNlbmRpZgorCX0KKworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogaWYgd2UgZGlkbid0IGdldCBhIHBhdHRlcm4gZnJvbSAtZSBhbmQgbm8gY29tbWFuZCBmaWxlIHdhcyBzcGVjaWZpZWQsCisJICogZmlyc3QgcGFyYW1ldGVyIHNob3VsZCBiZSB0aGUgcGF0dGVybi4gbm8gcGF0dGVybiwgbm8gd29ya3kgKi8KKwlpZiAocGF0dGVybl9oZWFkID09IE5VTEwpIHsKKwkJY2hhciAqcGF0dGVybjsKKwkJaWYgKCphcmd2ID09IE5VTEwpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCXBhdHRlcm4gPSBuZXdfZ3JlcF9saXN0X2RhdGEoKmFyZ3YrKywgMCk7CisJCWxsaXN0X2FkZF90bygmcGF0dGVybl9oZWFkLCBwYXR0ZXJuKTsKKwl9CisKKwkvKiBhcmd2WzAuLihhcmdjLTEpXSBzaG91bGQgYmUgbmFtZXMgb2YgZmlsZSB0byBncmVwIHRocm91Z2guIElmCisJICogdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlIHRvIGdyZXAsIHdlIHdpbGwgcHJpbnQgdGhlIGZpbGVuYW1lcy4gKi8KKwlpZiAoYXJndlswXSAmJiBhcmd2WzFdKQorCQlwcmludF9maWxlbmFtZSA9IDE7CisJLyogLUggLyAtaCBvZiBjb3Vyc2Ugb3ZlcnJpZGUgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9IKQorCQlwcmludF9maWxlbmFtZSA9IDE7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfaCkKKwkJcHJpbnRfZmlsZW5hbWUgPSAwOworCisJLyogSWYgbm8gZmlsZXMgd2VyZSBzcGVjaWZpZWQsIG9yICctJyB3YXMgc3BlY2lmaWVkLCB0YWtlIGlucHV0IGZyb20KKwkgKiBzdGRpbi4gT3RoZXJ3aXNlLCB3ZSBncmVwIHRocm91Z2ggYWxsIHRoZSBmaWxlcyBzcGVjaWZpZWQuICovCisJbWF0Y2hlZCA9IDA7CisJZG8geworCQljdXJfZmlsZSA9ICphcmd2OworCQlmaWxlID0gc3RkaW47CisJCWlmICghY3VyX2ZpbGUgfHwgTE9ORV9EQVNIKGN1cl9maWxlKSkgeworCQkJY3VyX2ZpbGUgPSAiKHN0YW5kYXJkIGlucHV0KSI7CisJCX0gZWxzZSB7CisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9yKSB7CisJCQkJc3RydWN0IHN0YXQgc3Q7CisJCQkJaWYgKHN0YXQoY3VyX2ZpbGUsICZzdCkgPT0gMCAmJiBTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCQkJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfaCkpCisJCQkJCQlwcmludF9maWxlbmFtZSA9IDE7CisJCQkJCW1hdGNoZWQgKz0gZ3JlcF9kaXIoY3VyX2ZpbGUpOworCQkJCQlnb3RvIGdyZXBfZG9uZTsKKwkJCQl9CisJCQl9CisJCQkvKiBlbHNlOiBmb3BlbihkaXIpIHdpbGwgc3VjY2VlZCwgYnV0IHJlYWRpbmcgd29uJ3QgKi8KKwkJCWZpbGUgPSBmb3Blbl9mb3JfcmVhZChjdXJfZmlsZSk7CisJCQlpZiAoZmlsZSA9PSBOVUxMKSB7CisJCQkJaWYgKCFTVVBQUkVTU19FUlJfTVNHUykKKwkJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coY3VyX2ZpbGUpOworCQkJCW9wZW5fZXJyb3JzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQltYXRjaGVkICs9IGdyZXBfZmlsZShmaWxlKTsKKwkJZmNsb3NlX2lmX25vdF9zdGRpbihmaWxlKTsKKyBncmVwX2RvbmU6IDsKKwl9IHdoaWxlICgqYXJndiAmJiAqKythcmd2KTsKKworCS8qIGRlc3Ryb3kgYWxsIHRoZSBlbG1lbnRzIGluIHRoZSBwYXR0ZXJuIGxpc3QgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJd2hpbGUgKHBhdHRlcm5faGVhZCkgeworCQkJbGxpc3RfdCAqcGF0dGVybl9oZWFkX3B0ciA9IHBhdHRlcm5faGVhZDsKKwkJCWdyZXBfbGlzdF9kYXRhX3QgKmdsID0gKGdyZXBfbGlzdF9kYXRhX3QgKilwYXR0ZXJuX2hlYWRfcHRyLT5kYXRhOworCisJCQlwYXR0ZXJuX2hlYWQgPSBwYXR0ZXJuX2hlYWQtPmxpbms7CisJCQlpZiAoZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgJiBBTExPQ0FURUQpCisJCQkJZnJlZShnbC0+cGF0dGVybik7CisJCQlpZiAoZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgJiBDT01QSUxFRCkKKwkJCQlyZWdmcmVlKCZnbC0+Y29tcGlsZWRfcmVnZXgpOworCQkJZnJlZShnbCk7CisJCQlmcmVlKHBhdHRlcm5faGVhZF9wdHIpOworCQl9CisJfQorCS8qIDAgPSBzdWNjZXNzLCAxID0gZmFpbGVkLCAyID0gZXJyb3IgKi8KKwlpZiAob3Blbl9lcnJvcnMpCisJCXJldHVybiAyOworCXJldHVybiAhbWF0Y2hlZDsgLyogaW52ZXJ0IHJldHVybiB2YWx1ZTogMCA9IHN1Y2Nlc3MsIDEgPSBmYWlsZWQgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2ZpbmR1dGlscy94YXJncy5jIGIvYnVzeWJveC0xLjE5LjMvZmluZHV0aWxzL3hhcmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxYmI0MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2ZpbmR1dGlscy94YXJncy5jCkBAIC0wLDAgKzEsNTY1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHhhcmdzIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogKEMpIDIwMDIsMjAwMyBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogU3BlY2lhbCB0aGFua3MKKyAqIC0gTWFyayBXaGl0bGV5IGFuZCBHbGVubiBNY0dyYXRoIGZvciBzdGltdWx1cyB0byByZXdyaXRlIDopCisgKiAtIE1pa2UgUmVuZGVsbCA8bWljaGFlbEBjcy5tdW4uY2E+CisgKiBhbmQgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogeGFyZ3MgaXMgZGVzY3JpYmVkIGluIHRoZSBTaW5nbGUgVW5peCBTcGVjaWZpY2F0aW9uIHYzIGF0CisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3hhcmdzLmh0bWwKKyAqLworCisvL2NvbmZpZzpjb25maWcgWEFSR1MKKy8vY29uZmlnOglib29sICJ4YXJncyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICB4YXJncyBpcyB1c2VkIHRvIGV4ZWN1dGUgYSBzcGVjaWZpZWQgY29tbWFuZCBmb3IKKy8vY29uZmlnOgkgIGV2ZXJ5IGl0ZW0gZnJvbSBzdGFuZGFyZCBpbnB1dC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04KKy8vY29uZmlnOglib29sICJFbmFibGUgLXA6IHByb21wdCBhbmQgY29uZmlybWF0aW9uIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gWEFSR1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IC1wOiBwcm9tcHQgdGhlIHVzZXIgd2hldGhlciB0byBydW4gZWFjaCBjb21tYW5kCisvL2NvbmZpZzoJICBsaW5lIGFuZCByZWFkIGEgbGluZSBmcm9tIHRoZSB0ZXJtaW5hbC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVMKKy8vY29uZmlnOglib29sICJFbmFibGUgc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzIGFuZCBiYWNrc2xhc2giCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBYQVJHUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgcXVvdGluZyBpbiB0aGUgaW5wdXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAteDogZXhpdCBpZiAtcyBvciAtbiBpcyBleGNlZWRlZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFhBUkdTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCAteDogZXhpdCBpZiB0aGUgY29tbWFuZCBzaXplIChzZWUgdGhlIC1zIG9yIC1uIG9wdGlvbikKKy8vY29uZmlnOgkgIGlzIGV4Y2VlZGVkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTQorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtMDogTlVMLXRlcm1pbmF0ZWQgaW5wdXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBYQVJHUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgLTA6IGlucHV0IGl0ZW1zIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgTlVMIGNoYXJhY3RlcgorLy9jb25maWc6CSAgaW5zdGVhZCBvZiB3aGl0ZXNwYWNlLCBhbmQgdGhlIHF1b3RlcyBhbmQgYmFja3NsYXNoCisvL2NvbmZpZzoJICBhcmUgbm90IHNwZWNpYWwuCisKKy8vYXBwbGV0OklGX1hBUkdTKEFQUExFVF9OT0VYRUMoeGFyZ3MsIHhhcmdzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB4YXJncykpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19YQVJHUykgKz0geGFyZ3MubworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisvLyNkZWZpbmUgZGJnX21zZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZGJnX21zZyguLi4pICgodm9pZCkwKQorCisKKyNpZmRlZiBURVNUCisjIGlmbmRlZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTgorIyAgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OIDEKKyMgZW5kaWYKKyMgaWZuZGVmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTCisjICBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVMgMQorIyBlbmRpZgorIyBpZm5kZWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUCisjICBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUIDEKKyMgZW5kaWYKKyMgaWZuZGVmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNCisjICBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0gMQorIyBlbmRpZgorI2VuZGlmCisKKworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgKiphcmdzOworCWNvbnN0IGNoYXIgKmVvZl9zdHI7CisJaW50IGlkeDsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUcuZW9mX3N0ciA9IE5VTEw7IC8qIG5lZWQgdG8gY2xlYXIgYnkgaGFuZCBiZWNhdXNlIHdlIGFyZSBOT0VYRUMgYXBwbGV0ICovIFwKK30gd2hpbGUgKDApCisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaGFzIHNwZWNpYWwgYWxnb3JpdGhtLgorICogRG9uJ3QgdXNlIGZvcmsgYW5kIGluY2x1ZGUgdG8gbWFpbiEKKyAqLworc3RhdGljIGludCB4YXJnc19leGVjKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHNwYXduX2FuZF93YWl0KEcuYXJncyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coRy5hcmdzWzBdKTsKKwkJcmV0dXJuIGVycm5vID09IEVOT0VOVCA/IDEyNyA6IDEyNjsKKwl9CisJaWYgKHN0YXR1cyA9PSAyNTUpIHsKKwkJYmJfZXJyb3JfbXNnKCIlczogZXhpdGVkIHdpdGggc3RhdHVzIDI1NTsgYWJvcnRpbmciLCBHLmFyZ3NbMF0pOworCQlyZXR1cm4gMTI0OworCX0KKwlpZiAoc3RhdHVzID49IDB4MTgwKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkIiwKKwkJCUcuYXJnc1swXSwgc3RhdHVzIC0gMHgxODApOworCQlyZXR1cm4gMTI1OworCX0KKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gMTIzOworCXJldHVybiAwOworfQorCisvKiBJbiBQT1NJWC9DIGxvY2FsZSBpc3NwYWNlIGlzIG9ubHkgdGhlc2UgY2hhcnM6ICJcdFxuXHZcZlxyIiBhbmQgc3BhY2UuCisgKiAiXHRcblx2XGZcciIgaGFwcGVuIHRvIGhhdmUgQVNDSUkgY29kZXMgOSwxMCwxMSwxMiwxMy4KKyAqLworI2RlZmluZSBJU1NQQUNFKGEpICh7IHVuc2lnbmVkIGNoYXIgeGFyZ3NfX2lzc3BhY2UgPSAoYSkgLSA5OyB4YXJnc19faXNzcGFjZSA9PSAoJyAnIC0gOSkgfHwgeGFyZ3NfX2lzc3BhY2UgPD0gKDEzIC0gOSk7IH0pCisKK3N0YXRpYyB2b2lkIHN0b3JlX3BhcmFtKGNoYXIgKnMpCit7CisJLyogR3JvdyBieSAyNTYgZWxlbWVudHMgYXQgb25jZSAqLworCWlmICghKEcuaWR4ICYgMHhmZikpIHsgLyogRy5pZHggPT0gTioyNTYgKi8KKwkJLyogRW5sYXJnZSwgbWFrZSBHLmFyZ3NbKE4rMSkqMjU2IC0gMV0gbGFzdCB2YWxpZCBpZHggKi8KKwkJRy5hcmdzID0geHJlYWxsb2MoRy5hcmdzLCBzaXplb2YoRy5hcmdzWzBdKSAqIChHLmlkeCArIDB4MTAwKSk7CisJfQorCUcuYXJnc1tHLmlkeCsrXSA9IHM7Cit9CisKKy8qIHByb2Nlc3NbMF1fc3RkaW46CisgKiBSZWFkIGNoYXJhY3RlcnMgaW50byBidWZbbl9tYXhfY2hhcnMrMV0sIGFuZCB3aGVuIHBhcmFtZXRlciBkZWxpbWl0ZXIKKyAqIGlzIHNlZW4sIHN0b3JlIHRoZSBhZGRyZXNzIG9mIGEgbmV3IHBhcmFtZXRlciB0byBhcmdzW10uCisgKiBJZiByZWFkaW5nIGRpc2NvdmVycyB0aGF0IGxhc3QgY2hhcnMgZG8gbm90IGZvcm0gdGhlIGNvbXBsZXRlCisgKiBwYXJhbWV0ZXIsIHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzdWNoICJ0YWlsIGNoYXJhY3RlciIgaXMgcmV0dXJuZWQuCisgKiAoYnVmIGhhcyBleHRyYSBieXRlIGF0IHRoZSBlbmQgdG8gYWNjb21vZGF0ZSB0ZXJtaW5hdGluZyBOVUwKKyAqIG9mICJ0YWlsIGNoYXJhY3RlcnMiIHN0cmluZykuCisgKiBPdGhlcndpc2UsIHRoZSByZXR1cm5lZCBwb2ludGVyIHBvaW50cyB0byBOVUwgYnl0ZS4KKyAqIE9uIGVudHJ5LCBidWZbXSBtYXkgY29udGFpbiBzb21lICJzZWVkIGNoYXJzIiB3aGljaCBhcmUgdG8gYmVjb21lCisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCisgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIHByb2Nlc3Nfc3RkaW4oaW50IG5fbWF4X2NoYXJzLCBpbnQgbl9tYXhfYXJnLCBjaGFyICpidWYpCit7CisjZGVmaW5lIE5PUk0gICAgICAwCisjZGVmaW5lIFFVT1RFICAgICAxCisjZGVmaW5lIEJBQ0tTTEFTSCAyCisjZGVmaW5lIFNQQUNFICAgICA0CisJY2hhciBxID0gJ1wwJzsgICAgICAgICAgICAgLyogcXVvdGUgY2hhciAqLworCWNoYXIgc3RhdGUgPSBOT1JNOworCWNoYXIgKnMgPSBidWY7ICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIHRoZSB3b3JkICovCisJY2hhciAqcCA9IHMgKyBzdHJsZW4oYnVmKTsgLyogZW5kIG9mIHRoZSB3b3JkICovCisKKwlidWYgKz0gbl9tYXhfY2hhcnM7ICAgICAgICAvKiBwYXN0IGJ1ZmZlcidzIGVuZCAqLworCisJLyogImdvdG8gcmV0IiBpcyB1c2VkIGluc3RlYWQgb2YgImJyZWFrIiB0byBtYWtlIGNvbnRyb2wgZmxvdworCSAqIG1vcmUgb2J2aW91czogKi8KKworCXdoaWxlICgxKSB7CisJCWludCBjID0gZ2V0Y2hhcigpOworCQlpZiAoYyA9PSBFT0YpIHsKKwkJCWlmIChwICE9IHMpCisJCQkJZ290byBjbG9zZV93b3JkOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKHN0YXRlID09IEJBQ0tTTEFTSCkgeworCQkJc3RhdGUgPSBOT1JNOworCQkJZ290byBzZXQ7CisJCX0KKwkJaWYgKHN0YXRlID09IFFVT1RFKSB7CisJCQlpZiAoYyAhPSBxKQorCQkJCWdvdG8gc2V0OworCQkJcSA9ICdcMCc7CisJCQlzdGF0ZSA9IE5PUk07CisJCX0gZWxzZSB7IC8qIGlmIChzdGF0ZSA9PSBOT1JNKSAqLworCQkJaWYgKElTU1BBQ0UoYykpIHsKKwkJCQlpZiAocCAhPSBzKSB7CisgY2xvc2Vfd29yZDoKKwkJCQkJc3RhdGUgPSBTUEFDRTsKKwkJCQkJYyA9ICdcMCc7CisJCQkJCWdvdG8gc2V0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGMgPT0gJ1xcJykgeworCQkJCQlzdGF0ZSA9IEJBQ0tTTEFTSDsKKwkJCQl9IGVsc2UgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykgeworCQkJCQlxID0gYzsKKwkJCQkJc3RhdGUgPSBRVU9URTsKKwkJCQl9IGVsc2UgeworIHNldDoKKwkJCQkJKnArKyA9IGM7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzdGF0ZSA9PSBTUEFDRSkgeyAgIC8qIHdvcmQncyBkZWxpbWl0ZXIgb3IgRU9GIGRldGVjdGVkICovCisJCQlpZiAocSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bm1hdGNoZWQgJXMgcXVvdGUiLAorCQkJCQlxID09ICdcJycgPyAic2luZ2xlIiA6ICJkb3VibGUiKTsKKwkJCX0KKwkJCS8qIEEgZnVsbCB3b3JkIGlzIGxvYWRlZCAqLworCQkJaWYgKEcuZW9mX3N0cikgeworCQkJCWlmIChzdHJjbXAocywgRy5lb2Zfc3RyKSA9PSAwKSB7CisJCQkJCXdoaWxlIChnZXRjaGFyKCkgIT0gRU9GKQorCQkJCQkJY29udGludWU7CisJCQkJCXAgPSBzOworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQl9CisJCQlzdG9yZV9wYXJhbShzKTsKKwkJCWRiZ19tc2coImFyZ3NbXTonJXMnIiwgcyk7CisJCQlzID0gcDsKKwkJCW5fbWF4X2FyZy0tOworCQkJaWYgKG5fbWF4X2FyZyA9PSAwKSB7CisJCQkJZ290byByZXQ7CisJCQl9CisJCQlzdGF0ZSA9IE5PUk07CisJCX0KKwkJaWYgKHAgPT0gYnVmKSB7CisJCQlnb3RvIHJldDsKKwkJfQorCX0KKyByZXQ6CisJKnAgPSAnXDAnOworCS8qIHN0b3JlX3BhcmFtKE5VTEwpIC0gY2FsbGVyIHdpbGwgZG8gaXQgKi8KKwlkYmdfbXNnKCJyZXR1cm46JyVzJyIsIHMpOworCXJldHVybiBzOworfQorI2Vsc2UKKy8qIFRoZSB2YXJpYW50IGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlIHF1b3RlcywgZG91YmxlIHF1b3RlcyBvciBiYWNrc2xhc2ggKi8KK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgcHJvY2Vzc19zdGRpbihpbnQgbl9tYXhfY2hhcnMsIGludCBuX21heF9hcmcsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpzID0gYnVmOyAgICAgICAgICAgICAvKiBzdGFydCBvZiB0aGUgd29yZCAqLworCWNoYXIgKnAgPSBzICsgc3RybGVuKGJ1Zik7IC8qIGVuZCBvZiB0aGUgd29yZCAqLworCisJYnVmICs9IG5fbWF4X2NoYXJzOyAgICAgICAgLyogcGFzdCBidWZmZXIncyBlbmQgKi8KKworCXdoaWxlICgxKSB7CisJCWludCBjID0gZ2V0Y2hhcigpOworCQlpZiAoYyA9PSBFT0YpIHsKKwkJCWlmIChwID09IHMpCisJCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKGMgPT0gRU9GIHx8IElTU1BBQ0UoYykpIHsKKwkJCWlmIChwID09IHMpCisJCQkJY29udGludWU7CisJCQljID0gRU9GOworCQl9CisJCSpwKysgPSAoYyA9PSBFT0YgPyAnXDAnIDogYyk7CisJCWlmIChjID09IEVPRikgeyAvKiB3b3JkJ3MgZGVsaW1pdGVyIG9yIEVPRiBkZXRlY3RlZCAqLworCQkJLyogQSBmdWxsIHdvcmQgaXMgbG9hZGVkICovCisJCQlpZiAoRy5lb2Zfc3RyKSB7CisJCQkJaWYgKHN0cmNtcChzLCBHLmVvZl9zdHIpID09IDApIHsKKwkJCQkJd2hpbGUgKGdldGNoYXIoKSAhPSBFT0YpCisJCQkJCQljb250aW51ZTsKKwkJCQkJcCA9IHM7CisJCQkJCWdvdG8gcmV0OworCQkJCX0KKwkJCX0KKwkJCXN0b3JlX3BhcmFtKHMpOworCQkJZGJnX21zZygiYXJnc1tdOiclcyciLCBzKTsKKwkJCXMgPSBwOworCQkJbl9tYXhfYXJnLS07CisJCQlpZiAobl9tYXhfYXJnID09IDApIHsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCQlpZiAocCA9PSBidWYpIHsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorIHJldDoKKwkqcCA9ICdcMCc7CisJLyogc3RvcmVfcGFyYW0oTlVMTCkgLSBjYWxsZXIgd2lsbCBkbyBpdCAqLworCWRiZ19tc2coInJldHVybjonJXMnIiwgcyk7CisJcmV0dXJuIHM7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0KK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgcHJvY2VzczBfc3RkaW4oaW50IG5fbWF4X2NoYXJzLCBpbnQgbl9tYXhfYXJnLCBjaGFyICpidWYpCit7CisJY2hhciAqcyA9IGJ1ZjsgICAgICAgICAgICAgLyogc3RhcnQgb2YgdGhlIHdvcmQgKi8KKwljaGFyICpwID0gcyArIHN0cmxlbihidWYpOyAvKiBlbmQgb2YgdGhlIHdvcmQgKi8KKworCWJ1ZiArPSBuX21heF9jaGFyczsgICAgICAgIC8qIHBhc3QgYnVmZmVyJ3MgZW5kICovCisKKwl3aGlsZSAoMSkgeworCQlpbnQgYyA9IGdldGNoYXIoKTsKKwkJaWYgKGMgPT0gRU9GKSB7CisJCQlpZiAocCA9PSBzKQorCQkJCWdvdG8gcmV0OworCQkJYyA9ICdcMCc7CisJCX0KKwkJKnArKyA9IGM7CisJCWlmIChjID09ICdcMCcpIHsgICAvKiB3b3JkJ3MgZGVsaW1pdGVyIG9yIEVPRiBkZXRlY3RlZCAqLworCQkJLyogQSBmdWxsIHdvcmQgaXMgbG9hZGVkICovCisJCQlzdG9yZV9wYXJhbShzKTsKKwkJCWRiZ19tc2coImFyZ3NbXTonJXMnIiwgcyk7CisJCQlzID0gcDsKKwkJCW5fbWF4X2FyZy0tOworCQkJaWYgKG5fbWF4X2FyZyA9PSAwKSB7CisJCQkJZ290byByZXQ7CisJCQl9CisJCX0KKwkJaWYgKHAgPT0gYnVmKSB7CisJCQlnb3RvIHJldDsKKwkJfQorCX0KKyByZXQ6CisJKnAgPSAnXDAnOworCS8qIHN0b3JlX3BhcmFtKE5VTEwpIC0gY2FsbGVyIHdpbGwgZG8gaXQgKi8KKwlkYmdfbXNnKCJyZXR1cm46JyVzJyIsIHMpOworCXJldHVybiBzOworfQorI2VuZGlmIC8qIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0gKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OCisvKiBQcm9tcHQgdGhlIHVzZXIgZm9yIGEgcmVzcG9uc2UsIGFuZAorICAgaWYgdGhlIHVzZXIgcmVzcG9uZHMgYWZmaXJtYXRpdmVseSwgcmV0dXJuIHRydWU7CisgICBvdGhlcndpc2UsIHJldHVybiBmYWxzZS4gVXNlcyAiL2Rldi90dHkiLCBub3Qgc3RkaW4uICovCitzdGF0aWMgaW50IHhhcmdzX2Fza19jb25maXJtYXRpb24odm9pZCkKK3sKKwlGSUxFICp0dHlfc3RyZWFtOworCWludCBjLCBzYXZlYzsKKworCXR0eV9zdHJlYW0gPSB4Zm9wZW5fZm9yX3JlYWQoQ1VSUkVOVF9UVFkpOworCWZwdXRzKCIgPy4uLiIsIHN0ZGVycik7CisJZmZsdXNoX2FsbCgpOworCWMgPSBzYXZlYyA9IGdldGModHR5X3N0cmVhbSk7CisJd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKwkJYyA9IGdldGModHR5X3N0cmVhbSk7CisJZmNsb3NlKHR0eV9zdHJlYW0pOworCXJldHVybiAoc2F2ZWMgPT0gJ3knIHx8IHNhdmVjID09ICdZJyk7Cit9CisjZWxzZQorIyBkZWZpbmUgeGFyZ3NfYXNrX2NvbmZpcm1hdGlvbigpIDEKKyNlbmRpZgorCisvL3VzYWdlOiNkZWZpbmUgeGFyZ3NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbUFJPRyBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSB4YXJnc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBQUk9HIG9uIGV2ZXJ5IGl0ZW0gZ2l2ZW4gYnkgc3RkaW5cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04oCisvL3VzYWdlOiAgICAgIlxuCS1wCUFzayB1c2VyIHdoZXRoZXIgdG8gcnVuIGVhY2ggY29tbWFuZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXIJRG9uJ3QgcnVuIGNvbW1hbmQgaWYgaW5wdXQgaXMgZW1wdHkiCisvL3VzYWdlOglJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNKAorLy91c2FnZTogICAgICJcbgktMAlJbnB1dCBpcyBzZXBhcmF0ZWQgYnkgTlVMIGNoYXJhY3RlcnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS10CVByaW50IHRoZSBjb21tYW5kIG9uIHN0ZGVyciBiZWZvcmUgZXhlY3V0aW9uIgorLy91c2FnZTogICAgICJcbgktZVtTVFJdCVNUUiBzdG9wcyBpbnB1dCBwcm9jZXNzaW5nIgorLy91c2FnZTogICAgICJcbgktbiBOCVBhc3Mgbm8gbW9yZSB0aGFuIE4gYXJncyB0byBQUk9HIgorLy91c2FnZTogICAgICJcbgktcyBOCVBhc3MgY29tbWFuZCBsaW5lIG9mIG5vIG1vcmUgdGhhbiBOIGJ5dGVzIgorLy91c2FnZToJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQoCisvL3VzYWdlOiAgICAgIlxuCS14CUV4aXQgaWYgc2l6ZSBpcyBleGNlZWRlZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2RlZmluZSB4YXJnc19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBscyB8IHhhcmdzIGd6aXBcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGZpbmQgLiAtbmFtZSAnKi5jJyAtcHJpbnQgfCB4YXJncyBybVxuIgorCisvKiBDb3JyZWN0IHJlZ2FyZGxlc3Mgb2YgY29tYmluYXRpb24gb2YgQ09ORklHX3h4eCAqLworZW51bSB7CisJT1BUQklUX1ZFUkJPU0UgPSAwLAorCU9QVEJJVF9OT19FTVBUWSwKKwlPUFRCSVRfVVBUT19OVU1CRVIsCisJT1BUQklUX1VQVE9fU0laRSwKKwlPUFRCSVRfRU9GX1NUUklORywKKwlPUFRCSVRfRU9GX1NUUklORzEsCisJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTihPUFRCSVRfSU5URVJBQ1RJVkUsKQorCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUKCAgICAgT1BUQklUX1RFUk1JTkFURSAgLCkKKwlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNKCAgIE9QVEJJVF9aRVJPVEVSTSAgICwpCisKKwlPUFRfVkVSQk9TRSAgICAgPSAxIDw8IE9QVEJJVF9WRVJCT1NFICAgICwKKwlPUFRfTk9fRU1QVFkgICAgPSAxIDw8IE9QVEJJVF9OT19FTVBUWSAgICwKKwlPUFRfVVBUT19OVU1CRVIgPSAxIDw8IE9QVEJJVF9VUFRPX05VTUJFUiwKKwlPUFRfVVBUT19TSVpFICAgPSAxIDw8IE9QVEJJVF9VUFRPX1NJWkUgICwKKwlPUFRfRU9GX1NUUklORyAgPSAxIDw8IE9QVEJJVF9FT0ZfU1RSSU5HICwgLyogR05VOiAtZVs8cGFyYW0+XSAqLworCU9QVF9FT0ZfU1RSSU5HMSA9IDEgPDwgT1BUQklUX0VPRl9TVFJJTkcxLCAvKiBTVVM6IC1FPHBhcmFtPiAqLworCU9QVF9JTlRFUkFDVElWRSA9IElGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04oKDEgPDwgT1BUQklUX0lOVEVSQUNUSVZFKSkgKyAwLAorCU9QVF9URVJNSU5BVEUgICA9IElGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUKCAgICAgKDEgPDwgT1BUQklUX1RFUk1JTkFURSAgKSkgKyAwLAorCU9QVF9aRVJPVEVSTSAgICA9IElGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0oICAgKDEgPDwgT1BUQklUX1pFUk9URVJNICAgKSkgKyAwLAorfTsKKyNkZWZpbmUgT1BUSU9OX1NUUiAiK3RybjpzOmU6OkU6IiBcCisJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTigicCIpIFwKKwlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCggICAgICJ4IikgXAorCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0oICAgIjAiKQorCitpbnQgeGFyZ3NfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHhhcmdzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWludCBjaGlsZF9lcnJvciA9IDA7CisJY2hhciAqbWF4X2FyZ3M7CisJY2hhciAqbWF4X2NoYXJzOworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IG5fbWF4X2NoYXJzOworCWludCBuX21heF9hcmc7CisjaWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0KKwljaGFyKiBGQVNUX0ZVTkMgKCpyZWFkX2FyZ3MpKGludCwgaW50LCBjaGFyKikgPSBwcm9jZXNzX3N0ZGluOworI2Vsc2UKKyNkZWZpbmUgcmVhZF9hcmdzIHByb2Nlc3Nfc3RkaW4KKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfREVTS1RPUCAmJiBFTkFCTEVfTE9OR19PUFRTCisJLyogRm9yIGV4YW1wbGUsIEZlZG9yYSdzIGJ1aWxkIHN5c3RlbSB1c2VzIC0tbm8tcnVuLWlmLWVtcHR5ICovCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9CisJCSJuby1ydW4taWYtZW1wdHlcMCIgTm9fYXJndW1lbnQgInIiCisJCTsKKyNlbmRpZgorCW9wdCA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsICZtYXhfYXJncywgJm1heF9jaGFycywgJkcuZW9mX3N0ciwgJkcuZW9mX3N0cik7CisKKwkvKiAtRSAiIj8gWW91IG1heSB3b25kZXIgd2h5IG5vdCBqdXN0IG9taXQgLUU/CisJICogVGhpcyBpcyB1c2VkIGZvciBwb3J0YWJpbGl0eToKKwkgKiBvbGQgeGFyZ3Mgd2FzIHVzaW5nICJfIiBhcyBkZWZhdWx0IGZvciAtRSAvIC1lICovCisJaWYgKChvcHQgJiBPUFRfRU9GX1NUUklORzEpICYmIEcuZW9mX3N0clswXSA9PSAnXDAnKQorCQlHLmVvZl9zdHIgPSBOVUxMOworCisJaWYgKG9wdCAmIE9QVF9aRVJPVEVSTSkKKwkJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTShyZWFkX2FyZ3MgPSBwcm9jZXNzMF9zdGRpbik7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlhcmdjIC09IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBlY2hvIGFsbCB0aGUgZmlsZW5hbWVzICovCisJCSotLWFyZ3YgPSAoY2hhciopImVjaG8iOworCQlhcmdjKys7CisJfQorCisJLyogLXMgTlVNIGRlZmF1bHQuIGZpbGV1dGlscy00LjQuMiB1c2VzIDEyOGssIGJ1dCBJIGhlYXNpdGF0ZQorCSAqIHRvIHVzZSBzdWNoIGEgYmlnIHZhbHVlIC0gZmlyc3QgbmVlZCB0byBjaGFuZ2UgY29kZSB0byB1c2UKKwkgKiBncm93YWJsZSBidWZmZXIgaW5zdGVhZCBvZiBmaXhlZCBvbmUuCisJICovCisJbl9tYXhfY2hhcnMgPSAzMiAqIDEwMjQ7CisJLyogTWFrZSBzbWFsbGVyIGlmIHN5c3RlbSBkb2VzIG5vdCBhbGxvdyBvdXIgZGVmYXVsdCB2YWx1ZS4KKwkgKiBUaGUgT3BlbiBHcm91cCBCYXNlIFNwZWNpZmljYXRpb25zIElzc3VlIDY6CisJICogIlRoZSB4YXJncyB1dGlsaXR5IHNoYWxsIGxpbWl0IHRoZSBjb21tYW5kIGxpbmUgbGVuZ3RoIHN1Y2ggdGhhdAorCSAqIHdoZW4gdGhlIGNvbW1hbmQgbGluZSBpcyBpbnZva2VkLCB0aGUgY29tYmluZWQgYXJndW1lbnQKKwkgKiBhbmQgZW52aXJvbm1lbnQgbGlzdHMgKHNlZSB0aGUgZXhlYyBmYW1pbHkgb2YgZnVuY3Rpb25zCisJICogaW4gdGhlIFN5c3RlbSBJbnRlcmZhY2VzIHZvbHVtZSBvZiBJRUVFIFN0ZCAxMDAzLjEtMjAwMSkKKwkgKiBzaGFsbCBub3QgZXhjZWVkIHtBUkdfTUFYfS0yMDQ4IGJ5dGVzIi4KKwkgKi8KKwl7CisJCWxvbmcgYXJnX21heCA9IDA7CisjaWYgZGVmaW5lZCBfU0NfQVJHX01BWAorCQlhcmdfbWF4ID0gc3lzY29uZihfU0NfQVJHX01BWCkgLSAyMDQ4OworI2VsaWYgZGVmaW5lZCBBUkdfTUFYCisJCWFyZ19tYXggPSBBUkdfTUFYIC0gMjA0ODsKKyNlbmRpZgorCQlpZiAoYXJnX21heCA+IDAgJiYgbl9tYXhfY2hhcnMgPiBhcmdfbWF4KQorCQkJbl9tYXhfY2hhcnMgPSBhcmdfbWF4OworCX0KKwlpZiAob3B0ICYgT1BUX1VQVE9fU0laRSkgeworCQluX21heF9jaGFycyA9IHhhdG91X3JhbmdlKG1heF9jaGFycywgMSwgSU5UX01BWCk7CisJfQorCS8qIEFjY291bnQgZm9yIHByZXBlbmRlZCBmaXhlZCBhcmd1bWVudHMgKi8KKwl7CisJCXNpemVfdCBuX2NoYXJzID0gMDsKKwkJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKSB7CisJCQluX2NoYXJzICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CisJCX0KKwkJbl9tYXhfY2hhcnMgLT0gbl9jaGFyczsKKwl9CisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKG5fbWF4X2NoYXJzIDw9IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpdCBzaW5nbGUgYXJndW1lbnQgd2l0aGluIGFyZ3VtZW50IGxpc3Qgc2l6ZSBsaW1pdCIpOworCX0KKworCWJ1ZiA9IHh6YWxsb2Mobl9tYXhfY2hhcnMgKyAxKTsKKworCW5fbWF4X2FyZyA9IG5fbWF4X2NoYXJzOworCWlmIChvcHQgJiBPUFRfVVBUT19OVU1CRVIpIHsKKwkJbl9tYXhfYXJnID0geGF0b3VfcmFuZ2UobWF4X2FyZ3MsIDEsIElOVF9NQVgpOworCQkvKiBOb3QgbmVjZXNzYXJ5LCB3ZSB1c2UgZ3Jvd2FibGUgYXJnc1tdOiAqLworCQkvKiBpZiAobl9tYXhfYXJnID4gbl9tYXhfY2hhcnMpIG5fbWF4X2FyZyA9IG5fbWF4X2NoYXJzICovCisJfQorCisJLyogQWxsb2NhdGUgcG9pbnRlcnMgZm9yIGV4ZWN2cCAqLworCS8qIFdlIGNhbiBzdGF0aWNhbGx5IGFsbG9jYXRlIChhcmdjICsgbl9tYXhfYXJnICsgMSkgZWxlbWVudHMKKwkgKiBhbmQgZG8gbm90IGJvdGhlciB3aXRoIHJlc2l6aW5nIGFyZ3NbXSwgYnV0IG9uIDY0LWJpdCBtYWNoaW5lcworCSAqIHRoaXMgcmVzdWx0cyBpbiBhcmdzW10gdmVjdG9yIHdoaWNoIGlzIH44IHRpbWVzIGJpZ2dlcgorCSAqIHRoYW4gbl9tYXhfY2hhcnMhIFRoYXQgaXMsIHdpdGggbl9tYXhfY2hhcnMgPT0gMjBrLAorCSAqIGFyZ3NbXSB3aWxsIHRha2UgMTYwayAoISksIHdoaWNoIHdpbGwgbW9zdCBsaWtlbHkgYmUKKwkgKiBhbG1vc3QgZW50aXJlbHkgdW51c2VkLgorCSAqLworCS8qIFNlZSBzdG9yZV9wYXJhbSgpIGZvciBtYXRjaGluZyAyNTYtc3RlcCBncm93dGggbG9naWMgKi8KKwlHLmFyZ3MgPSB4bWFsbG9jKHNpemVvZihHLmFyZ3NbMF0pICogKChhcmdjICsgMHhmZikgJiB+MHhmZikpOworCisJLyogU3RvcmUgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQsIHBhcnQgMSAqLworCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykKKwkJRy5hcmdzW2ldID0gYXJndltpXTsKKworCXdoaWxlICgxKSB7CisJCWNoYXIgKnJlbTsKKworCQlHLmlkeCA9IGFyZ2M7CisJCXJlbSA9IHJlYWRfYXJncyhuX21heF9jaGFycywgbl9tYXhfYXJnLCBidWYpOworCQlzdG9yZV9wYXJhbShOVUxMKTsKKworCQlpZiAoIUcuYXJnc1thcmdjXSkgeworCQkJaWYgKCpyZW0gIT0gJ1wwJykKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYXJndW1lbnQgbGluZSB0b28gbG9uZyIpOworCQkJaWYgKG9wdCAmIE9QVF9OT19FTVBUWSkKKwkJCQlicmVhazsKKwkJfQorCQlvcHQgfD0gT1BUX05PX0VNUFRZOworCisJCWlmIChvcHQgJiAoT1BUX0lOVEVSQUNUSVZFIHwgT1BUX1ZFUkJPU0UpKSB7CisJCQljb25zdCBjaGFyICpmbXQgPSAiICVzIiArIDE7CisJCQljaGFyICoqYXJncyA9IEcuYXJnczsKKwkJCWZvciAoaSA9IDA7IGFyZ3NbaV07IGkrKykgeworCQkJCWZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3NbaV0pOworCQkJCWZtdCA9ICIgJXMiOworCQkJfQorCQkJaWYgKCEob3B0ICYgT1BUX0lOVEVSQUNUSVZFKSkKKwkJCQliYl9wdXRjaGFyX3N0ZGVycignXG4nKTsKKwkJfQorCisJCWlmICghKG9wdCAmIE9QVF9JTlRFUkFDVElWRSkgfHwgeGFyZ3NfYXNrX2NvbmZpcm1hdGlvbigpKSB7CisJCQljaGlsZF9lcnJvciA9IHhhcmdzX2V4ZWMoKTsKKwkJfQorCisJCWlmIChjaGlsZF9lcnJvciA+IDAgJiYgY2hpbGRfZXJyb3IgIT0gMTIzKSB7CisJCQlicmVhazsKKwkJfQorCisJCW92ZXJsYXBwaW5nX3N0cmNweShidWYsIHJlbSk7CisJfSAvKiB3aGlsZSAqLworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoRy5hcmdzKTsKKwkJZnJlZShidWYpOworCX0KKworCXJldHVybiBjaGlsZF9lcnJvcjsKK30KKworCisjaWZkZWYgVEVTVAorCitjb25zdCBjaGFyICphcHBsZXRfbmFtZSA9ICJkZWJ1ZyBzdHVmZiB1c2FnZSI7CisKK3ZvaWQgYmJfc2hvd191c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstcF0gWy1yXSBbLXRdIC1beF0gWy1uIG1heF9hcmddIFstcyBtYXhfY2hhcnNdXG4iLAorCQlhcHBsZXRfbmFtZSk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIHhhcmdzX21haW4oYXJnYywgYXJndik7Cit9CisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9hcHBsZXRfbWV0YWRhdGEuaCBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvYXBwbGV0X21ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2ZWYzNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvYXBwbGV0X21ldGFkYXRhLmgKQEAgLTAsMCArMSwzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBBUFBMRVRfTUVUQURBVEFfSAorI2RlZmluZSBBUFBMRVRfTUVUQURBVEFfSCAxCisKKy8qIE5vdGU6IGNhbiBiZSBpbmNsdWRlZCBieSBib3RoIGhvc3QgYW5kIHRhcmdldCBidWlsZHMhICovCisKKy8qIG9yZGVyIG1hdHRlcnM6IHVzZWQgYXMgaW5kZXggaW50byAiaW5zdGFsbF9kaXJbXSIgaW4gYXBwbGV0bGliLmMgKi8KK3R5cGVkZWYgZW51bSBiYl9pbnN0YWxsX2xvY190IHsKKwlCQl9ESVJfUk9PVCA9IDAsCisJQkJfRElSX0JJTiwKKwlCQl9ESVJfU0JJTiwKKyNpZiBFTkFCTEVfSU5TVEFMTF9OT19VU1IKKwlCQl9ESVJfVVNSX0JJTiAgPSBCQl9ESVJfQklOLAorCUJCX0RJUl9VU1JfU0JJTiA9IEJCX0RJUl9TQklOLAorI2Vsc2UKKwlCQl9ESVJfVVNSX0JJTiwKKwlCQl9ESVJfVVNSX1NCSU4sCisjZW5kaWYKK30gYmJfaW5zdGFsbF9sb2NfdDsKKwordHlwZWRlZiBlbnVtIGJiX3N1aWRfdCB7CisJQkJfU1VJRF9EUk9QID0gMCwKKwlCQl9TVUlEX01BWUJFLAorCUJCX1NVSURfUkVRVUlSRQorfSBiYl9zdWlkX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9hcHBsZXRzLnNyYy5oIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9hcHBsZXRzLnNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDljYmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2FwcGxldHMuc3JjLmgKQEAgLTAsMCArMSw0MjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFwcGxldHMuaCAtIGEgbGlzdGluZyBvZiBhbGwgYnVzeWJveCBhcHBsZXRzLgorICoKKyAqIElmIHlvdSB3cml0ZSBhIG5ldyBhcHBsZXQsIHlvdSBuZWVkIHRvIGFkZCBhbiBlbnRyeSB0byB0aGlzIGxpc3QgdG8gbWFrZQorICogYnVzeWJveCBhd2FyZSBvZiBpdC4KKyAqLworCisvKgorbmFtZSAgLSBhcHBsZXQgbmFtZSBhcyBpdCBpcyB0eXBlZCBvbiBjb21tYW5kIGxpbmUKK25hbWUyIC0gYXBwbGV0IG5hbWUsIGNvbnZlcnRlZCB0byBDIChldGhlci13YWtlOiBuYW1lMiA9IGV0aGVyX3dha2UpCittYWluICAtIGNvcnJlc3BvbmRpbmcgPGFwcGxldD5fbWFpbiB0byBjYWxsIChiemNhdDogbWFpbiA9IGJ1bnppcDIpCitsICAgICAtIGxvY2F0aW9uIHRvIGluc3RhbGwgbGluayB0bzogWy91c3JdL1tzXWJpbgorcyAgICAgLSBzdWlkIHR5cGU6CisgICAgICAgIEJCX1NVSURfUkVRVUlSRTogd2lsbCBjb21wbGFpbiBpZiBidXN5Ym94IGlzbid0IHN1aWQKKyAgICAgICAgYW5kIGlzIHJ1biBieSBub24tcm9vdCAoYXBwbGV0X21haW4oKSB3aWxsIG5vdCBiZSBjYWxsZWQgYXQgYWxsKQorICAgICAgICBCQl9TVUlEX0RST1A6IHdpbGwgZHJvcCBzdWlkIHByaW9yIHRvIGFwcGxldF9tYWluKCkKKyAgICAgICAgQkJfU1VJRF9NQVlCRTogbmVpdGhlciBvZiB0aGUgYWJvdmUKKyAgICAgICAgKGV2ZXJ5IGluc3RhbmNlIG9mIEJCX1NVSURfUkVRVUlSRSBhbmQgQkJfU1VJRF9NQVlCRQorICAgICAgICBuZWVkcyB0byBiZSBqdXN0aWZpZWQgaW4gY29tbWVudCkKKyAgICAgICAgTkI6IHBsZWFzZSB1cGRhdGUgRkVBVFVSRV9TVUlEIGhlbHAgdGV4dCB3aGVuZXZlciB5b3UgYWRkL3JlbW92ZQorICAgICAgICBCQl9TVUlEX1JFUVVJUkUgb3IgQkJfU1VJRF9NQVlCRSBhcHBsZXQuCisqLworCisjaWYgZGVmaW5lZChQUk9UT1RZUEVTKQorIyBkZWZpbmUgQVBQTEVUKG5hbWUsbCxzKSAgICAgICAgICAgICAgICAgICAgaW50IG5hbWUjI19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CisjIGRlZmluZSBBUFBMRVRfT0RETkFNRShuYW1lLG1haW4sbCxzLG5hbWUyKSBpbnQgbWFpbiMjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxuYW1lMikgIGludCBtYWluIyNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworIyBkZWZpbmUgQVBQTEVUX05PRk9SSyhuYW1lLG1haW4sbCxzLG5hbWUyKSAgaW50IG1haW4jI19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CisKKyNlbGlmIGRlZmluZWQoTkFNRV9NQUlOX0NOQU1FKQorIyBkZWZpbmUgQVBQTEVUKG5hbWUsbCxzKSAgICAgICAgICAgICAgICAgICAgbmFtZSBuYW1lIyNfbWFpbiBuYW1lCisjIGRlZmluZSBBUFBMRVRfT0RETkFNRShuYW1lLG1haW4sbCxzLG5hbWUyKSBuYW1lIG1haW4jI19tYWluIG5hbWUyCisjIGRlZmluZSBBUFBMRVRfTk9FWEVDKG5hbWUsbWFpbixsLHMsbmFtZTIpICBuYW1lIG1haW4jI19tYWluIG5hbWUyCisjIGRlZmluZSBBUFBMRVRfTk9GT1JLKG5hbWUsbWFpbixsLHMsbmFtZTIpICBuYW1lIG1haW4jI19tYWluIG5hbWUyCisKKyNlbGlmIGRlZmluZWQoTUFLRV9VU0FHRSkgJiYgRU5BQkxFX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRQorIyBkZWZpbmUgQVBQTEVUKG5hbWUsbCxzKSAgICAgICAgICAgICAgICAgICAgTUFLRV9VU0FHRSgjbmFtZSwgbmFtZSMjX3RyaXZpYWxfdXNhZ2UgbmFtZSMjX2Z1bGxfdXNhZ2UpCisjIGRlZmluZSBBUFBMRVRfT0RETkFNRShuYW1lLG1haW4sbCxzLG5hbWUyKSBNQUtFX1VTQUdFKCNuYW1lLCBuYW1lMiMjX3RyaXZpYWxfdXNhZ2UgbmFtZTIjI19mdWxsX3VzYWdlKQorIyBkZWZpbmUgQVBQTEVUX05PRVhFQyhuYW1lLG1haW4sbCxzLG5hbWUyKSAgTUFLRV9VU0FHRSgjbmFtZSwgbmFtZTIjI190cml2aWFsX3VzYWdlIG5hbWUyIyNfZnVsbF91c2FnZSkKKyMgZGVmaW5lIEFQUExFVF9OT0ZPUksobmFtZSxtYWluLGwscyxuYW1lMikgIE1BS0VfVVNBR0UoI25hbWUsIG5hbWUyIyNfdHJpdmlhbF91c2FnZSBuYW1lMiMjX2Z1bGxfdXNhZ2UpCisKKyNlbGlmIGRlZmluZWQoTUFLRV9VU0FHRSkgJiYgIUVOQUJMRV9GRUFUVVJFX1ZFUkJPU0VfVVNBR0UKKyMgZGVmaW5lIEFQUExFVChuYW1lLGwscykgICAgICAgICAgICAgICAgICAgIE1BS0VfVVNBR0UoI25hbWUsIG5hbWUjI190cml2aWFsX3VzYWdlKQorIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxuYW1lMikgTUFLRV9VU0FHRSgjbmFtZSwgbmFtZTIjI190cml2aWFsX3VzYWdlKQorIyBkZWZpbmUgQVBQTEVUX05PRVhFQyhuYW1lLG1haW4sbCxzLG5hbWUyKSAgTUFLRV9VU0FHRSgjbmFtZSwgbmFtZTIjI190cml2aWFsX3VzYWdlKQorIyBkZWZpbmUgQVBQTEVUX05PRk9SSyhuYW1lLG1haW4sbCxzLG5hbWUyKSAgTUFLRV9VU0FHRSgjbmFtZSwgbmFtZTIjI190cml2aWFsX3VzYWdlKQorCisjZWxpZiBkZWZpbmVkKE1BS0VfTElOS1MpCisjIGRlZmluZSBBUFBMRVQobmFtZSxsLGMpICAgICAgICAgICAgICAgICAgICBMSU5LIGwgbmFtZQorIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxuYW1lMikgTElOSyBsIG5hbWUKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxuYW1lMikgIExJTksgbCBuYW1lCisjIGRlZmluZSBBUFBMRVRfTk9GT1JLKG5hbWUsbWFpbixsLHMsbmFtZTIpICBMSU5LIGwgbmFtZQorCisjZWxzZQorICBzdGF0aWMgc3RydWN0IGJiX2FwcGxldCBhcHBsZXRzW10gPSB7IC8qICAgIG5hbWUsIG1haW4sIGxvY2F0aW9uLCBuZWVkX3N1aWQgKi8KKyMgZGVmaW5lIEFQUExFVChuYW1lLGwscykgICAgICAgICAgICAgICAgICAgIHsgI25hbWUsICNuYW1lLCBsLCBzIH0sCisjIGRlZmluZSBBUFBMRVRfT0RETkFNRShuYW1lLG1haW4sbCxzLG5hbWUyKSB7ICNuYW1lLCAjbWFpbiwgbCwgcyB9LAorIyBkZWZpbmUgQVBQTEVUX05PRVhFQyhuYW1lLG1haW4sbCxzLG5hbWUyKSAgeyAjbmFtZSwgI21haW4sIGwsIHMsIDEgfSwKKyMgZGVmaW5lIEFQUExFVF9OT0ZPUksobmFtZSxtYWluLGwscyxuYW1lMikgIHsgI25hbWUsICNtYWluLCBsLCBzLCAxLCAxIH0sCisjZW5kaWYKKworI2lmIEVOQUJMRV9JTlNUQUxMX05PX1VTUgorIyBkZWZpbmUgQkJfRElSX1VTUl9CSU4gQkJfRElSX0JJTgorIyBkZWZpbmUgQkJfRElSX1VTUl9TQklOIEJCX0RJUl9TQklOCisjZW5kaWYKKworCitJTlNFUlQKK0lGX1RFU1QoQVBQTEVUX05PRk9SSyhbLCAgdGVzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgdGVzdCkpCitJRl9URVNUKEFQUExFVF9OT0ZPUksoW1ssIHRlc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHRlc3QpKQorSUZfQUNQSUQoQVBQTEVUKGFjcGlkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0FEREdST1VQKEFQUExFVChhZGRncm91cCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0FERFVTRVIoQVBQTEVUKGFkZHVzZXIsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BREpUSU1FWChBUFBMRVQoYWRqdGltZXgsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQVIoQVBQTEVUKGFyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0FSUChBUFBMRVQoYXJwLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0FSUElORyhBUFBMRVQoYXJwaW5nLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0FXSyhBUFBMRVRfTk9FWEVDKGF3aywgYXdrLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBhd2spKQorSUZfQkFTRU5BTUUoQVBQTEVUX05PRk9SSyhiYXNlbmFtZSwgYmFzZW5hbWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGJhc2VuYW1lKSkKK0lGX0JCQ09ORklHKEFQUExFVChiYmNvbmZpZywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0JFRVAoQVBQTEVUKGJlZXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQkxLSUQoQVBQTEVUKGJsa2lkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0JSQ1RMKEFQUExFVChicmN0bCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQlpJUDIoQVBQTEVUKGJ6aXAyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NBTChBUFBMRVQoY2FsLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NBVChBUFBMRVRfTk9GT1JLKGNhdCwgY2F0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGNhdCkpCitJRl9DQVRWKEFQUExFVChjYXR2LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0hBVChBUFBMRVQoY2hhdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSEFUVFIoQVBQTEVUKGNoYXR0ciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NIQ09OKEFQUExFVChjaGNvbiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSEdSUChBUFBMRVRfTk9FWEVDKGNoZ3JwLCBjaGdycCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjaGdycCkpCitJRl9DSE1PRChBUFBMRVRfTk9FWEVDKGNobW9kLCBjaG1vZCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjaG1vZCkpCitJRl9DSE9XTihBUFBMRVRfTk9FWEVDKGNob3duLCBjaG93biwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjaG93bikpCitJRl9DSFBBU1NXRChBUFBMRVQoY2hwYXNzd2QsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NIUFNUKEFQUExFVChjaHBzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSFJPT1QoQVBQTEVUKGNocm9vdCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0hSVChBUFBMRVQoY2hydCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSFZUKEFQUExFVChjaHZ0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NLU1VNKEFQUExFVF9OT0VYRUMoY2tzdW0sIGNrc3VtLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBja3N1bSkpCitJRl9DTEVBUihBUFBMRVQoY2xlYXIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ01QKEFQUExFVChjbXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ09NTShBUFBMRVQoY29tbSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DUChBUFBMRVRfTk9FWEVDKGNwLCBjcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjcCkpCitJRl9DUElPKEFQUExFVChjcGlvLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ1JPTkQoQVBQTEVUKGNyb25kLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvKiBOZWVkcyB0byBiZSBydW4gYnkgcm9vdCBvciBiZSBzdWlkIHJvb3QgLSBuZWVkcyB0byBjaGFuZ2UgL3Zhci9zcG9vbC9jcm9uKiBmaWxlczogKi8KK0lGX0NST05UQUIoQVBQTEVUKGNyb250YWIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX1JFUVVJUkUpKQorSUZfQ1JZUFRQVyhBUFBMRVQoY3J5cHRwdywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DVVQoQVBQTEVUX05PRVhFQyhjdXQsIGN1dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgY3V0KSkKK0lGX0RDKEFQUExFVChkYywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ERChBUFBMRVRfTk9FWEVDKGRkLCBkZCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBkZCkpCitJRl9ERUFMTE9DVlQoQVBQTEVUKGRlYWxsb2N2dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ERUxHUk9VUChBUFBMRVRfT0RETkFNRShkZWxncm91cCwgZGVsdXNlciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBkZWxncm91cCkpCitJRl9ERUxVU0VSKEFQUExFVChkZWx1c2VyLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfREVWRlNEKEFQUExFVChkZXZmc2QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfREVWTUVNKEFQUExFVChkZXZtZW0sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfREYoQVBQTEVUKGRmLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfREhDUFJFTEFZKEFQUExFVChkaGNwcmVsYXksIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RJRkYoQVBQTEVUKGRpZmYsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRElSTkFNRShBUFBMRVRfTk9GT1JLKGRpcm5hbWUsIGRpcm5hbWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGRpcm5hbWUpKQorSUZfRE1FU0coQVBQTEVUKGRtZXNnLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRE5TRChBUFBMRVQoZG5zZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSE9TVE5BTUUoQVBQTEVUX09ERE5BTUUoZG5zZG9tYWlubmFtZSwgaG9zdG5hbWUsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgZG5zZG9tYWlubmFtZSkpCitJRl9ET1MyVU5JWChBUFBMRVRfTk9FWEVDKGRvczJ1bml4LCBkb3MydW5peCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZG9zMnVuaXgpKQorSUZfRFBLRyhBUFBMRVQoZHBrZywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9EUEtHX0RFQihBUFBMRVRfT0RETkFNRShkcGtnLWRlYiwgZHBrZ19kZWIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGRwa2dfZGViKSkKK0lGX0RVKEFQUExFVChkdSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9EVU1QS01BUChBUFBMRVQoZHVtcGttYXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9EVU1QTEVBU0VTKEFQUExFVChkdW1wbGVhc2VzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vSUZfRTJGU0NLKEFQUExFVChlMmZzY2ssIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorLy9JRl9FMkxBQkVMKEFQUExFVF9PREROQU1FKGUybGFiZWwsIHR1bmUyZnMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIGUybGFiZWwpKQorSUZfRUNITyhBUFBMRVRfTk9GT1JLKGVjaG8sIGVjaG8sIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgZWNobykpCitJRl9FRChBUFBMRVQoZWQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9FSkVDVChBUFBMRVQoZWplY3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRU5WKEFQUExFVF9OT0VYRUMoZW52LCBlbnYsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGVudikpCitJRl9FTlZESVIoQVBQTEVUX09ERE5BTUUoZW52ZGlyLCBjaHBzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZW52ZGlyKSkKK0lGX0VOVlVJREdJRChBUFBMRVRfT0RETkFNRShlbnZ1aWRnaWQsIGNocHN0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBlbnZ1aWRnaWQpKQorSUZfRVRIRVJfV0FLRShBUFBMRVRfT0RETkFNRShldGhlci13YWtlLCBldGhlcl93YWtlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBldGhlcl93YWtlKSkKK0lGX0VYUEFORChBUFBMRVQoZXhwYW5kLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0VYUFIoQVBQTEVUKGV4cHIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkFLRUlERU5URChBUFBMRVQoZmFrZWlkZW50ZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkFMU0UoQVBQTEVUX05PRk9SSyhmYWxzZSwgZmFsc2UsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgZmFsc2UpKQorSUZfRkJTRVQoQVBQTEVUKGZic2V0LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GQlNQTEFTSChBUFBMRVQoZmJzcGxhc2gsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkRGTFVTSChBUFBMRVRfT0RETkFNRShmZGZsdXNoLCBmcmVlcmFtZGlzaywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBmZGZsdXNoKSkKK0lGX0ZERk9STUFUKEFQUExFVChmZGZvcm1hdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GRElTSyhBUFBMRVQoZmRpc2ssIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkdDT05TT0xFKEFQUExFVChmZ2NvbnNvbGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLyogQmVuZWZpdHMgZnJvbSBzdWlkIHJvb3Q6IGJldHRlciBhY2Nlc3MgdG8gL2Rldi9CTE9DS0RFVnM6ICovCitJRl9GSU5ERlMoQVBQTEVUKGZpbmRmcywgQkJfRElSX1NCSU4sIEJCX1NVSURfTUFZQkUpKQorSUZfRkxBU0hfRVJBU0VBTEwoQVBQTEVUKGZsYXNoX2VyYXNlYWxsLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GTEFTSF9MT0NLKEFQUExFVF9PREROQU1FKGZsYXNoX2xvY2ssIGZsYXNoX2xvY2tfdW5sb2NrLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgZmxhc2hfbG9jaykpCitJRl9GTEFTSF9VTkxPQ0soQVBQTEVUX09ERE5BTUUoZmxhc2hfdW5sb2NrLCBmbGFzaF9sb2NrX3VubG9jaywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIGZsYXNoX3VubG9jaykpCitJRl9GTEFTSENQKEFQUExFVChmbGFzaGNwLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GTE9DSyhBUFBMRVQoZmxvY2ssIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRk9MRChBUFBMRVRfTk9FWEVDKGZvbGQsIGZvbGQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGZvbGQpKQorSUZfRlJFRShBUFBMRVQoZnJlZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GUkVFUkFNRElTSyhBUFBMRVQoZnJlZXJhbWRpc2ssIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRlNDSyhBUFBMRVQoZnNjaywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL0lGX0UyRlNDSyhBUFBMRVRfT0RETkFNRShmc2NrLmV4dDIsIGUyZnNjaywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgZnNja19leHQyKSkKKy8vSUZfRTJGU0NLKEFQUExFVF9PREROQU1FKGZzY2suZXh0MywgZTJmc2NrLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBmc2NrX2V4dDMpKQorSUZfRlNDS19NSU5JWChBUFBMRVRfT0RETkFNRShmc2NrLm1pbml4LCBmc2NrX21pbml4LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBmc2NrX21pbml4KSkKK0lGX0ZTWU5DKEFQUExFVF9OT0ZPUksoZnN5bmMsIGZzeW5jLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGZzeW5jKSkKK0lGX0ZUUEQoQVBQTEVUKGZ0cGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZUUEdFVChBUFBMRVRfT0RETkFNRShmdHBnZXQsIGZ0cGdldHB1dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZnRwZ2V0KSkKK0lGX0ZUUFBVVChBUFBMRVRfT0RETkFNRShmdHBwdXQsIGZ0cGdldHB1dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZnRwcHV0KSkKK0lGX0ZVU0VSKEFQUExFVChmdXNlciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9HRVRFTkZPUkNFKEFQUExFVChnZXRlbmZvcmNlLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9HRVRPUFQoQVBQTEVUKGdldG9wdCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0dFVFNFQk9PTChBUFBMRVQoZ2V0c2Vib29sLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9HRVRUWShBUFBMRVQoZ2V0dHksIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfR1VOWklQKEFQUExFVChndW56aXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9HWklQKEFQUExFVChnemlwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSEQoQVBQTEVUX05PRVhFQyhoZCwgaGV4ZHVtcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgaGQpKQorSUZfSERQQVJNKEFQUExFVChoZHBhcm0sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSEVBRChBUFBMRVRfTk9FWEVDKGhlYWQsIGhlYWQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGhlYWQpKQorSUZfSEVYRFVNUChBUFBMRVRfTk9FWEVDKGhleGR1bXAsIGhleGR1bXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGhleGR1bXApKQorSUZfSE9TVElEKEFQUExFVF9OT0ZPUksoaG9zdGlkLCBob3N0aWQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGhvc3RpZCkpCitJRl9IT1NUTkFNRShBUFBMRVQoaG9zdG5hbWUsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9IVFRQRChBUFBMRVQoaHR0cGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0hXQ0xPQ0soQVBQTEVUKGh3Y2xvY2ssIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSUZDT05GSUcoQVBQTEVUKGlmY29uZmlnLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lGVVBET1dOKEFQUExFVF9PREROQU1FKGlmZG93biwgaWZ1cGRvd24sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIGlmZG93bikpCitJRl9JRkVOU0xBVkUoQVBQTEVUKGlmZW5zbGF2ZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JRlBMVUdEKEFQUExFVChpZnBsdWdkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lGVVBET1dOKEFQUExFVF9PREROQU1FKGlmdXAsIGlmdXBkb3duLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBpZnVwKSkKK0lGX0lORVREKEFQUExFVChpbmV0ZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSU5PVElGWUQoQVBQTEVUKGlub3RpZnlkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lOU1RBTEwoQVBQTEVUKGluc3RhbGwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSU9OSUNFKEFQUExFVChpb25pY2UsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfQUREUkVTUyBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfUk9VVEUgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lQX0xJTksgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lQX1RVTk5FTCBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorSUZfSVAoQVBQTEVUKGlwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorI2VuZGlmCitJRl9JUEFERFIoQVBQTEVUKGlwYWRkciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lQQ0FMQyhBUFBMRVQoaXBjYWxjLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSVBDUk0oQVBQTEVUKGlwY3JtLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lQQ1MoQVBQTEVUKGlwY3MsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSVBMSU5LKEFQUExFVChpcGxpbmssIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JUFJPVVRFKEFQUExFVChpcHJvdXRlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSVBSVUxFKEFQUExFVChpcHJ1bGUsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JUFRVTk5FTChBUFBMRVQoaXB0dW5uZWwsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9LQkRfTU9ERShBUFBMRVQoa2JkX21vZGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfS0lMTChBUFBMRVQoa2lsbCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0tJTExBTEwoQVBQTEVUX09ERE5BTUUoa2lsbGFsbCwga2lsbCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwga2lsbGFsbCkpCitJRl9LSUxMQUxMNShBUFBMRVRfT0RETkFNRShraWxsYWxsNSwga2lsbCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwga2lsbGFsbDUpKQorSUZfS0xPR0QoQVBQTEVUKGtsb2dkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xBU1QoQVBQTEVUKGxhc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLy9JRl9MRU5HVEgoQVBQTEVUX05PRk9SSyhsZW5ndGgsIGxlbmd0aCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbGVuZ3RoKSkKK0lGX0xFU1MoQVBQTEVUKGxlc3MsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VUQVJDSChBUFBMRVRfT0RETkFNRShsaW51eDMyLCBzZXRhcmNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGxpbnV4MzIpKQorSUZfU0VUQVJDSChBUFBMRVRfT0RETkFNRShsaW51eDY0LCBzZXRhcmNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGxpbnV4NjQpKQorSUZfTE4oQVBQTEVUX05PRVhFQyhsbiwgbG4sIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgbG4pKQorSUZfTE9BRF9QT0xJQ1koQVBQTEVUKGxvYWRfcG9saWN5LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MT0FERk9OVChBUFBMRVQobG9hZGZvbnQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xPQURLTUFQKEFQUExFVChsb2Fka21hcCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MT0dHRVIoQVBQTEVUKGxvZ2dlciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvKiBOZWVkcyB0byBiZSBydW4gYnkgcm9vdCBvciBiZSBzdWlkIHJvb3QgLSBuZWVkcyB0byBjaGFuZ2UgdWlkIGFuZCBnaWQ6ICovCitJRl9MT0dJTihBUFBMRVQobG9naW4sIEJCX0RJUl9CSU4sIEJCX1NVSURfUkVRVUlSRSkpCitJRl9MT0dOQU1FKEFQUExFVF9OT0ZPUksobG9nbmFtZSwgbG9nbmFtZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbG9nbmFtZSkpCitJRl9MT0dSRUFEKEFQUExFVChsb2dyZWFkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xPU0VUVVAoQVBQTEVUKGxvc2V0dXAsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTFBEKEFQUExFVChscGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xQUShBUFBMRVRfT0RETkFNRShscHEsIGxwcXIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGxwcSkpCitJRl9MUFIoQVBQTEVUX09ERE5BTUUobHByLCBscHFyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBscHIpKQorSUZfTFMoQVBQTEVUX05PRVhFQyhscywgbHMsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgbHMpKQorSUZfTFNBVFRSKEFQUExFVChsc2F0dHIsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MU1BDSShBUFBMRVQobHNwY2ksIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTFNVU0IoQVBQTEVUKGxzdXNiLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VOTFpNQShBUFBMRVRfT0RETkFNRShsemNhdCwgdW5sem1hLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBsemNhdCkpCitJRl9MWk1BKEFQUExFVF9PREROQU1FKGx6bWEsIHVubHptYSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbHptYSkpCitJRl9MWk9QKEFQUExFVChsem9wLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTFpPUChBUFBMRVRfT0RETkFNRShsem9wY2F0LCBsem9wLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBsem9wY2F0KSkKK0lGX01BS0VERVZTKEFQUExFVChtYWtlZGV2cywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9NQUtFTUlNRShBUFBMRVQobWFrZW1pbWUsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9NQU4oQVBQTEVUKG1hbiwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9NQVRDSFBBVEhDT04oQVBQTEVUKG1hdGNocGF0aGNvbiwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTUQ1U1VNKEFQUExFVF9OT0VYRUMobWQ1c3VtLCBtZDVfc2hhMV9zdW0sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIG1kNXN1bSkpCitJRl9NREVWKEFQUExFVChtZGV2LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01JQ1JPQ09NKEFQUExFVChtaWNyb2NvbSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9NS0RJUihBUFBMRVRfTk9GT1JLKG1rZGlyLCBta2RpciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBta2RpcikpCitJRl9NS0ZTX1ZGQVQoQVBQTEVUX09ERE5BTUUobWtkb3NmcywgbWtmc192ZmF0LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBta2ZzX3ZmYXQpKQorSUZfTUtGU19FWFQyKEFQUExFVF9PREROQU1FKG1rZTJmcywgbWtmc19leHQyLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBta2ZzX2V4dDIpKQorSUZfTUtGSUZPKEFQUExFVF9OT0VYRUMobWtmaWZvLCBta2ZpZm8sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIG1rZmlmbykpCitJRl9NS0ZTX0VYVDIoQVBQTEVUX09ERE5BTUUobWtmcy5leHQyLCBta2ZzX2V4dDIsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIG1rZnNfZXh0MikpCisvL0lGX01LRTJGUyhBUFBMRVRfT0RETkFNRShta2ZzLmV4dDMsIG1rZTJmcywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbWtmc19leHQzKSkKK0lGX01LRlNfTUlOSVgoQVBQTEVUX09ERE5BTUUobWtmcy5taW5peCwgbWtmc19taW5peCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbWtmc19taW5peCkpCitJRl9NS0ZTX1JFSVNFUihBUFBMRVRfT0RETkFNRShta2ZzLnJlaXNlciwgbWtmc19yZWlzZXIsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIG1rZnNfcmVpc2VyKSkKK0lGX01LRlNfVkZBVChBUFBMRVRfT0RETkFNRShta2ZzLnZmYXQsIG1rZnNfdmZhdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbWtmc192ZmF0KSkKK0lGX01LTk9EKEFQUExFVF9OT0VYRUMobWtub2QsIG1rbm9kLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIG1rbm9kKSkKK0lGX0NSWVBUUFcoQVBQTEVUX09ERE5BTUUobWtwYXNzd2QsIGNyeXB0cHcsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIG1rcGFzc3dkKSkKK0lGX01LU1dBUChBUFBMRVQobWtzd2FwLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01LVEVNUChBUFBMRVQobWt0ZW1wLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTU9SRShBUFBMRVQobW9yZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIE9uIGZ1bGwtYmxvd24gc3lzdGVtcywgcmVxdWlyZXMgc3VpZCBmb3IgdXNlciBtb3VudHMuCisgKiBCdXQgaXQncyBub3QgdW50aGlua2FibGUgdG8gaGF2ZSBpdCBhdmFpbGFibGUgaW4gbm9uLXN1aWQgZmxhdm9yIG9uIHNvbWUgc3lzdGVtcywKKyAqIGZvciB2aWV3aW5nIG1vdW50IHRhYmxlLgorICogVGhlcmVmb3JlIHdlIHVzZSBCQl9TVUlEX01BWUJFIGluc3RlYWQgb2YgQkJfU1VJRF9SRVFVSVJFOiAqLworSUZfTU9VTlQoQVBQTEVUKG1vdW50LCBCQl9ESVJfQklOLCBJRl9ERVNLVE9QKEJCX1NVSURfTUFZQkUpIElGX05PVF9ERVNLVE9QKEJCX1NVSURfRFJPUCkpKQorSUZfTU9VTlRQT0lOVChBUFBMRVQobW91bnRwb2ludCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01UKEFQUExFVChtdCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01WKEFQUExFVChtdiwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX05BTUVJRihBUFBMRVQobmFtZWlmLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX05DKEFQUExFVChuYywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ORVRTVEFUKEFQUExFVChuZXRzdGF0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTklDRShBUFBMRVQobmljZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX05PSFVQKEFQUExFVChub2h1cCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9OU0xPT0tVUChBUFBMRVQobnNsb29rdXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTlRQRChBUFBMRVQobnRwZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfT0QoQVBQTEVUKG9kLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX09QRU5WVChBUFBMRVQob3BlbnZ0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vSUZfUEFSU0UoQVBQTEVUKHBhcnNlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIE5lZWRzIHRvIGJlIHJ1biBieSByb290IG9yIGJlIHN1aWQgcm9vdCAtIG5lZWRzIHRvIGNoYW5nZSAvZXRjL3twYXNzd2Qsc2hhZG93fTogKi8KK0lGX1BBU1NXRChBUFBMRVQocGFzc3dkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9SRVFVSVJFKSkKK0lGX1BHUkVQKEFQUExFVChwZ3JlcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9QSURPRihBUFBMRVQocGlkb2YsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9QSVBFX1BST0dSRVNTKEFQUExFVChwaXBlX3Byb2dyZXNzLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUElWT1RfUk9PVChBUFBMRVQocGl2b3Rfcm9vdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9QS0lMTChBUFBMRVRfT0RETkFNRShwa2lsbCwgcGdyZXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHBraWxsKSkKK0lGX1BPUE1BSUxESVIoQVBQTEVUKHBvcG1haWxkaXIsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1BSSU5URU5WKEFQUExFVF9OT0ZPUksocHJpbnRlbnYsIHByaW50ZW52LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHByaW50ZW52KSkKK0lGX1BSSU5URihBUFBMRVRfTk9GT1JLKHByaW50ZiwgcHJpbnRmLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBwcmludGYpKQorSUZfUFMoQVBQTEVUKHBzLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUFNDQU4oQVBQTEVUKHBzY2FuLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1BXRChBUFBMRVRfTk9GT1JLKHB3ZCwgcHdkLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHB3ZCkpCitJRl9SQUlEQVVUT1JVTihBUFBMRVQocmFpZGF1dG9ydW4sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkRBVEUoQVBQTEVUKHJkYXRlLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SREVWKEFQUExFVChyZGV2LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRUFEQUhFQUQoQVBQTEVUKHJlYWRhaGVhZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRUFETElOSyhBUFBMRVQocmVhZGxpbmssIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkVBRFBST0ZJTEUoQVBQTEVUKHJlYWRwcm9maWxlLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRUFMUEFUSChBUFBMRVQocmVhbHBhdGgsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkVGT1JNSU1FKEFQUExFVChyZWZvcm1pbWUsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRU5JQ0UoQVBQTEVUKHJlbmljZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRVNFVChBUFBMRVQocmVzZXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkVTSVpFKEFQUExFVChyZXNpemUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkVTVE9SRUNPTihBUFBMRVRfT0RETkFNRShyZXN0b3JlY29uLCBzZXRmaWxlcywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgcmVzdG9yZWNvbikpCitJRl9SRktJTEwoQVBQTEVUKHJma2lsbCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUk0oQVBQTEVUX05PRk9SSyhybSwgcm0sIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgcm0pKQorSUZfUk1ESVIoQVBQTEVUX05PRk9SSyhybWRpciwgcm1kaXIsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgcm1kaXIpKQorSUZfUk9VVEUoQVBQTEVUKHJvdXRlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JQTShBUFBMRVQocnBtLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUlBNMkNQSU8oQVBQTEVUKHJwbTJjcGlvLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JUQ1dBS0UoQVBQTEVUKHJ0Y3dha2UsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUlVOX1BBUlRTKEFQUExFVF9PREROQU1FKHJ1bi1wYXJ0cywgcnVuX3BhcnRzLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHJ1bl9wYXJ0cykpCitJRl9SVU5DT04oQVBQTEVUKHJ1bmNvbiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SVU5MRVZFTChBUFBMRVQocnVubGV2ZWwsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUlVOU1YoQVBQTEVUKHJ1bnN2LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JVTlNWRElSKEFQUExFVChydW5zdmRpciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SWChBUFBMRVQocngsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0NSSVBUKEFQUExFVChzY3JpcHQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0NSSVBUUkVQTEFZKEFQUExFVChzY3JpcHRyZXBsYXksIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRUQoQVBQTEVUKHNlZCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFTElOVVhFTkFCTEVEKEFQUExFVChzZWxpbnV4ZW5hYmxlZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VORE1BSUwoQVBQTEVUKHNlbmRtYWlsLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVEoQVBQTEVUX05PRk9SSyhzZXEsIHNlcSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgc2VxKSkKK0lGX1NFU1RBVFVTKEFQUExFVChzZXN0YXR1cywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VUQVJDSChBUFBMRVQoc2V0YXJjaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFVENPTlNPTEUoQVBQTEVUKHNldGNvbnNvbGUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VURU5GT1JDRShBUFBMRVQoc2V0ZW5mb3JjZSwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VURklMRVMoQVBQTEVUKHNldGZpbGVzLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFVEZPTlQoQVBQTEVUKHNldGZvbnQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFVEtFWUNPREVTKEFQUExFVChzZXRrZXljb2RlcywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRMT0dDT05TKEFQUExFVChzZXRsb2djb25zLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRTRUJPT0woQVBQTEVUKHNldHNlYm9vbCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VUU0lEKEFQUExFVChzZXRzaWQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VUVUlER0lEKEFQUExFVF9PREROQU1FKHNldHVpZGdpZCwgY2hwc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHNldHVpZGdpZCkpCitJRl9TSEExU1VNKEFQUExFVF9OT0VYRUMoc2hhMXN1bSwgbWQ1X3NoYTFfc3VtLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBzaGExc3VtKSkKK0lGX1NIQTI1NlNVTShBUFBMRVRfTk9FWEVDKHNoYTI1NnN1bSwgbWQ1X3NoYTFfc3VtLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBzaGEyNTZzdW0pKQorSUZfU0hBNTEyU1VNKEFQUExFVF9OT0VYRUMoc2hhNTEyc3VtLCBtZDVfc2hhMV9zdW0sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHNoYTUxMnN1bSkpCitJRl9TSE9XS0VZKEFQUExFVChzaG93a2V5LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NMQVRUQUNIKEFQUExFVChzbGF0dGFjaCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvKiBEbyBub3QgbWFrZSB0aGlzIGFwcGxldCBOT0ZPUksuIEl0IGJyZWFrcyBeQy1pbmcgb2YgcGF1c2VzIGluIHNoZWxsczogKi8KK0lGX1NMRUVQKEFQUExFVChzbGVlcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NPRlRMSU1JVChBUFBMRVRfT0RETkFNRShzb2Z0bGltaXQsIGNocHN0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBzb2Z0bGltaXQpKQorSUZfU09SVChBUFBMRVRfTk9FWEVDKHNvcnQsIHNvcnQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHNvcnQpKQorSUZfU1BMSVQoQVBQTEVUKHNwbGl0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NUQVJUX1NUT1BfREFFTU9OKEFQUExFVF9PREROQU1FKHN0YXJ0LXN0b3AtZGFlbW9uLCBzdGFydF9zdG9wX2RhZW1vbiwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgc3RhcnRfc3RvcF9kYWVtb24pKQorSUZfU1RBVChBUFBMRVQoc3RhdCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NUUklOR1MoQVBQTEVUKHN0cmluZ3MsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU1RUWShBUFBMRVQoc3R0eSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIE5lZWRzIHRvIGJlIHJ1biBieSByb290IG9yIGJlIHN1aWQgcm9vdCAtIG5lZWRzIHRvIGNoYW5nZSB1aWQgYW5kIGdpZDogKi8KK0lGX1NVKEFQUExFVChzdSwgQkJfRElSX0JJTiwgQkJfU1VJRF9SRVFVSVJFKSkKK0lGX1NVTE9HSU4oQVBQTEVUKHN1bG9naW4sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU1VNKEFQUExFVChzdW0sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU1YoQVBQTEVUKHN2LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NWTE9HRChBUFBMRVQoc3Zsb2dkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TV0FQT05PRkYoQVBQTEVUX09ERE5BTUUoc3dhcG9mZiwgc3dhcF9vbl9vZmYsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIHN3YXBvZmYpKQorSUZfU1dBUE9OT0ZGKEFQUExFVF9PREROQU1FKHN3YXBvbiwgc3dhcF9vbl9vZmYsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIHN3YXBvbikpCitJRl9TV0lUQ0hfUk9PVChBUFBMRVQoc3dpdGNoX3Jvb3QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU1lOQyhBUFBMRVRfTk9GT1JLKHN5bmMsIHN5bmMsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgc3luYykpCitJRl9CQl9TWVNDVEwoQVBQTEVUKHN5c2N0bCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TWVNMT0dEKEFQUExFVChzeXNsb2dkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RBQyhBUFBMRVRfTk9FWEVDKHRhYywgdGFjLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB0YWMpKQorSUZfVEFJTChBUFBMRVQodGFpbCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UQVIoQVBQTEVUKHRhciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RBU0tTRVQoQVBQTEVUKHRhc2tzZXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLyogSUZfVEMoQVBQTEVUKHRjLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkgKi8KK0lGX1RDUFNWRChBUFBMRVRfT0RETkFNRSh0Y3BzdmQsIHRjcHVkcHN2ZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgdGNwc3ZkKSkKK0lGX1RFRShBUFBMRVQodGVlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RFTE5FVChBUFBMRVQodGVsbmV0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RFTE5FVEQoQVBQTEVUKHRlbG5ldGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RFU1QoQVBQTEVUX05PRk9SSyh0ZXN0LCB0ZXN0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB0ZXN0KSkKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0dFVCB8fCBFTkFCTEVfRkVBVFVSRV9URlRQX1BVVAorSUZfVEZUUChBUFBMRVQodGZ0cCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9URlRQRChBUFBMRVQodGZ0cGQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorI2VuZGlmCitJRl9USU1FKEFQUExFVCh0aW1lLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RJTUVPVVQoQVBQTEVUKHRpbWVvdXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVE9QKEFQUExFVCh0b3AsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVFIoQVBQTEVUKHRyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIE5lZWRzIHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19JQ01QKSwgdGhlcmVmb3JlIEJCX1NVSURfTUFZQkU6ICovCitJRl9UUkFDRVJPVVRFKEFQUExFVCh0cmFjZXJvdXRlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9NQVlCRSkpCitJRl9UUkFDRVJPVVRFNihBUFBMRVQodHJhY2Vyb3V0ZTYsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX01BWUJFKSkKK0lGX1RSVUUoQVBQTEVUX05PRk9SSyh0cnVlLCB0cnVlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHRydWUpKQorSUZfVFRZKEFQUExFVCh0dHksIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVFRZU0laRShBUFBMRVQodHR5c2l6ZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UVU5DVEwoQVBQTEVUKHR1bmN0bCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UVU5FMkZTKEFQUExFVCh0dW5lMmZzLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VESENQQyhBUFBMRVQodWRoY3BjLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VESENQRChBUFBMRVQodWRoY3BkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9VRFBTVkQoQVBQTEVUX09ERE5BTUUodWRwc3ZkLCB0Y3B1ZHBzdmQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHVkcHN2ZCkpCitJRl9VTU9VTlQoQVBQTEVUKHVtb3VudCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VOQU1FKEFQUExFVCh1bmFtZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VOQ09NUFJFU1MoQVBQTEVUKHVuY29tcHJlc3MsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9VTkVYUEFORChBUFBMRVRfT0RETkFNRSh1bmV4cGFuZCwgZXhwYW5kLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB1bmV4cGFuZCkpCitJRl9VTklRKEFQUExFVCh1bmlxLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VOSVgyRE9TKEFQUExFVF9OT0VYRUModW5peDJkb3MsIGRvczJ1bml4LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB1bml4MmRvcykpCitJRl9VTlhaKEFQUExFVCh1bnh6LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VOTFpNQShBUFBMRVQodW5sem1hLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xaT1AoQVBQTEVUX09ERE5BTUUodW5sem9wLCBsem9wLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB1bmx6b3ApKQorSUZfVU5aSVAoQVBQTEVUKHVuemlwLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VQVElNRShBUFBMRVQodXB0aW1lLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VTTEVFUChBUFBMRVRfTk9GT1JLKHVzbGVlcCwgdXNsZWVwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHVzbGVlcCkpCitJRl9VVURFQ09ERShBUFBMRVQodXVkZWNvZGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVVVFTkNPREUoQVBQTEVUKHV1ZW5jb2RlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1ZDT05GSUcoQVBQTEVUKHZjb25maWcsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorLyogTmVlZHMgdG8gYmUgcnVuIGJ5IHJvb3Qgb3IgYmUgc3VpZCByb290IC0gbmVlZHMgdG8gY2hhbmdlIHVpZCBhbmQgZ2lkOiAqLworSUZfVkxPQ0soQVBQTEVUKHZsb2NrLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9SRVFVSVJFKSkKK0lGX1ZPTE5BTUUoQVBQTEVUKHZvbG5hbWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLyogTmVlZHMgdG8gYmUgcnVuIGJ5IHJvb3Qgb3IgYmUgc3VpZCByb290IC0gbmVlZHMgdG8gd3JpdGUgdG8gL2Rldi9UVFk6ICovCitJRl9XQUxMKEFQUExFVCh3YWxsLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9SRVFVSVJFKSkKK0lGX1dBVENIKEFQUExFVCh3YXRjaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1dBVENIRE9HKEFQUExFVCh3YXRjaGRvZywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9XQyhBUFBMRVQod2MsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfV0dFVChBUFBMRVQod2dldCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9XSElDSChBUFBMRVQod2hpY2gsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfV0hPQU1JKEFQUExFVF9OT0ZPUksod2hvYW1pLCB3aG9hbWksIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHdob2FtaSkpCitJRl9VTlhaKEFQUExFVF9PREROQU1FKHh6Y2F0LCB1bnh6LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB4emNhdCkpCitJRl9YWihBUFBMRVRfT0RETkFNRSh4eiwgdW54eiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgeHopKQorSUZfWUVTKEFQUExFVF9OT0ZPUksoeWVzLCB5ZXMsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHllcykpCitJRl9HVU5aSVAoQVBQTEVUX09ERE5BTUUoemNhdCwgZ3VuemlwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHpjYXQpKQorSUZfWkNJUChBUFBMRVQoemNpcCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKyNpZiAhZGVmaW5lZChQUk9UT1RZUEVTKSAmJiAhZGVmaW5lZChOQU1FX01BSU5fQ05BTUUpICYmICFkZWZpbmVkKE1BS0VfVVNBR0UpCit9OworI2VuZGlmCisKKyN1bmRlZiBBUFBMRVQKKyN1bmRlZiBBUFBMRVRfT0RETkFNRQorI3VuZGVmIEFQUExFVF9OT0VYRUMKKyN1bmRlZiBBUFBMRVRfTk9GT1JLCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2FyLmggYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2FyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2ZmUwNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvYXIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogYnVzeWJveCBhciBhcmNoaXZlIGRhdGEgc3RydWN0dXJlcworICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBBUl9ICisjZGVmaW5lIEFSX0gKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK3N0cnVjdCBhcl9oZWFkZXIgeworCWNoYXIgbmFtZVsxNl07CisJY2hhciBkYXRlWzEyXTsKKwljaGFyIHVpZFs2XTsKKwljaGFyIGdpZFs2XTsKKwljaGFyIG1vZGVbOF07CisJY2hhciBzaXplWzEwXTsKKwljaGFyIG1hZ2ljWzJdOworfTsKKworI2RlZmluZSBBUl9IRUFERVJfTEVOIHNpemVvZihzdHJ1Y3QgYXJfaGVhZGVyKQorI2RlZmluZSBBUl9NQUdJQyAgICAgICIhPGFyY2g+IgorI2RlZmluZSBBUl9NQUdJQ19MRU4gIDcKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2FyY2hpdmUuaCBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvYXJjaGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTc2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2FyY2hpdmUuaApAQCAtMCwwICsxLDI0MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaWZuZGVmIFVOQVJDSElWRV9ICisjZGVmaW5lIFVOQVJDSElWRV9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2VudW0geworI2lmIEJCX0JJR19FTkRJQU4KKwlDT01QUkVTU19NQUdJQyA9IDB4MWY5ZCwKKwlHWklQX01BR0lDICA9IDB4MWY4YiwKKwlCWklQMl9NQUdJQyA9IDI1NiAqICdCJyArICdaJywKKwkvKiAueHogc2lnbmF0dXJlOiAweGZkLCAnNycsICd6JywgJ1gnLCAnWicsIDB4MDAgKi8KKwkvKiBNb3JlIGluZm8gYXQ6IGh0dHA6Ly90dWthYW5pLm9yZy94ei94ei1maWxlLWZvcm1hdC50eHQgKi8KKwlYWl9NQUdJQzEgICA9IDI1NiAqIDB4ZmQgKyAnNycsCisJWFpfTUFHSUMyICAgPSAyNTYgKiAoMjU2ICogKDI1NiAqICd6JyArICdYJykgKyAnWicpICsgMCwKKwkvKiBEaWZmZXJlbnQgZm9ybTogMzIgYml0cywgdGhlbiAxNiBiaXRzOiAqLworCVhaX01BR0lDMWEgID0gMjU2ICogKDI1NiAqICgyNTYgKiAweGZkICsgJzcnKSArICd6JykgKyAnWCcsCisJWFpfTUFHSUMyYSAgPSAyNTYgKiAnWicgKyAwLAorI2Vsc2UKKwlDT01QUkVTU19NQUdJQyA9IDB4OWQxZiwKKwlHWklQX01BR0lDICA9IDB4OGIxZiwKKwlCWklQMl9NQUdJQyA9ICdCJyArICdaJyAqIDI1NiwKKwlYWl9NQUdJQzEgICA9IDB4ZmQgKyAnNycgKiAyNTYsCisJWFpfTUFHSUMyICAgPSAneicgKyAoJ1gnICsgKCdaJyArIDAgKiAyNTYpICogMjU2KSAqIDI1NiwKKwlYWl9NQUdJQzFhICA9IDB4ZmQgKyAoJzcnICsgKCd6JyArICdYJyAqIDI1NikgKiAyNTYpICogMjU2LAorCVhaX01BR0lDMmEgID0gJ1onICsgMCAqIDI1NiwKKyNlbmRpZgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgZmlsZV9oZWFkZXJfdCB7CisJY2hhciAqbmFtZTsKKwljaGFyICpsaW5rX3RhcmdldDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwljaGFyICp0YXJfX3VuYW1lOworCWNoYXIgKnRhcl9fZ25hbWU7CisjZW5kaWYKKwlvZmZfdCBzaXplOworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJbW9kZV90IG1vZGU7CisJdGltZV90IG10aW1lOworCWRldl90IGRldmljZTsKK30gZmlsZV9oZWFkZXJfdDsKKworc3RydWN0IGhhcmRsaW5rc190OworCit0eXBlZGVmIHN0cnVjdCBhcmNoaXZlX2hhbmRsZV90IHsKKwkvKiBGbGFncy4gMXN0IHNpbmNlIGl0IGlzIG1vc3QgdXNlZCBtZW1iZXIgKi8KKwl1bnNpZ25lZCBhaF9mbGFnczsKKworCS8qIFRoZSByYXcgc3RyZWFtIGFzIHJlYWQgZnJvbSBkaXNrIG9yIHN0ZGluICovCisJaW50IHNyY19mZDsKKworCS8qIERlZmluZSBpZiB0aGUgaGVhZGVyIGFuZCBkYXRhIGNvbXBvbmVudCBzaG91bGQgYmUgcHJvY2Vzc2VkICovCisJY2hhciBGQVNUX0ZVTkMgKCpmaWx0ZXIpKHN0cnVjdCBhcmNoaXZlX2hhbmRsZV90ICopOworCS8qIExpc3Qgb2YgZmlsZXMgdGhhdCBoYXZlIGJlZW4gYWNjZXB0ZWQgKi8KKwlsbGlzdF90ICphY2NlcHQ7CisJLyogTGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiByZWplY3RlZCAqLworCWxsaXN0X3QgKnJlamVjdDsKKwkvKiBMaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBzdWNjZXNzZnVsbHkgYmVlbiB3b3JrZWQgb24gKi8KKwlsbGlzdF90ICpwYXNzZWQ7CisKKwkvKiBDdXJyZW50bHkgcHJvY2Vzc2VkIGZpbGUncyBoZWFkZXIgKi8KKwlmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcjsKKworCS8qIFByb2Nlc3MgdGhlIGhlYWRlciBjb21wb25lbnQsIGUuZy4gdGFyIC10ICovCisJdm9pZCBGQVNUX0ZVTkMgKCphY3Rpb25faGVhZGVyKShjb25zdCBmaWxlX2hlYWRlcl90ICopOworCisJLyogUHJvY2VzcyB0aGUgZGF0YSBjb21wb25lbnQsIGUuZy4gZXh0cmFjdCB0byBmaWxlc3lzdGVtICovCisJdm9pZCBGQVNUX0ZVTkMgKCphY3Rpb25fZGF0YSkoc3RydWN0IGFyY2hpdmVfaGFuZGxlX3QgKik7CisKKwkvKiBGdW5jdGlvbiB0aGF0IHNraXBzIGRhdGEgKi8KKwl2b2lkIEZBU1RfRlVOQyAoKnNlZWspKGludCBmZCwgb2ZmX3QgYW1vdW50KTsKKworCS8qIENvdW50IHByb2Nlc3NlZCBieXRlcyAqLworCW9mZl90IG9mZnNldDsKKworCS8qIEFyY2hpdmVyIHNwZWNpZmljLiBDYW4gbWFrZSBpdCBhIHVuaW9uIGlmIGl0IGV2ZXIgZ2V0cyBiaWcgKi8KKyNpZiBFTkFCTEVfVEFSIHx8IEVOQUJMRV9EUEtHIHx8IEVOQUJMRV9EUEtHX0RFQgorCXNtYWxsaW50IHRhcl9fZW5kOworIyBpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwljaGFyKiB0YXJfX2xvbmduYW1lOworCWNoYXIqIHRhcl9fbGlua25hbWU7CisjIGVuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQKKwljaGFyKiB0YXJfX3RvX2NvbW1hbmQ7CisJY29uc3QgY2hhciogdGFyX190b19jb21tYW5kX3NoZWxsOworI2VuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYCisJY2hhciogdGFyX19nbG9iYWxfc2N0eDsKKwljaGFyKiB0YXJfX25leHRfZmlsZV9zY3R4OworIyBlbmRpZgorI2VuZGlmCisjaWYgRU5BQkxFX0NQSU8gfHwgRU5BQkxFX1JQTTJDUElPIHx8IEVOQUJMRV9SUE0KKwl1b2ZmX3QgY3Bpb19fYmxvY2tzOworCXN0cnVjdCBoYXJkbGlua3NfdCAqY3Bpb19faGFyZGxpbmtzX3RvX2NyZWF0ZTsKKwlzdHJ1Y3QgaGFyZGxpbmtzX3QgKmNwaW9fX2NyZWF0ZWRfaGFyZGxpbmtzOworI2VuZGlmCisjaWYgRU5BQkxFX0RQS0cgfHwgRU5BQkxFX0RQS0dfREVCCisJLyogVGVtcG9yYXJ5IHN0b3JhZ2UgKi8KKwljaGFyICpkcGtnX19idWZmZXI7CisJLyogSG93IHRvIHByb2Nlc3MgYW55IHN1YiBhcmNoaXZlLCBlLmcuIGdldF9oZWFkZXJfdGFyX2d6ICovCisJY2hhciBGQVNUX0ZVTkMgKCpkcGtnX19hY3Rpb25fZGF0YV9zdWJhcmNoaXZlKShzdHJ1Y3QgYXJjaGl2ZV9oYW5kbGVfdCAqKTsKKwkvKiBDb250YWlucyB0aGUgaGFuZGxlIHRvIGEgc3ViIGFyY2hpdmUgKi8KKwlzdHJ1Y3QgYXJjaGl2ZV9oYW5kbGVfdCAqZHBrZ19fc3ViX2FyY2hpdmU7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9BUl9DUkVBVEUKKwljb25zdCBjaGFyICphcl9fbmFtZTsKKwlzdHJ1Y3QgYXJjaGl2ZV9oYW5kbGVfdCAqYXJfX291dDsKKyNlbmRpZgorfSBhcmNoaXZlX2hhbmRsZV90OworLyogYml0cyBpbiBhaF9mbGFncyAqLworI2RlZmluZSBBUkNISVZFX1JFU1RPUkVfREFURSAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQVJDSElWRV9DUkVBVEVfTEVBRElOR19ESVJTICgxIDw8IDEpCisjZGVmaW5lIEFSQ0hJVkVfVU5MSU5LX09MRCAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBBUkNISVZFX0VYVFJBQ1RfUVVJRVQgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgQVJDSElWRV9FWFRSQUNUX05FV0VSICAgICAgICgxIDw8IDQpCisjZGVmaW5lIEFSQ0hJVkVfRE9OVF9SRVNUT1JFX09XTkVSICAoMSA8PCA1KQorI2RlZmluZSBBUkNISVZFX0RPTlRfUkVTVE9SRV9QRVJNICAgKDEgPDwgNikKKyNkZWZpbmUgQVJDSElWRV9OVU1FUklDX09XTkVSICAgICAgICgxIDw8IDcpCisjZGVmaW5lIEFSQ0hJVkVfT19UUlVOQyAgICAgICAgICAgICAoMSA8PCA4KQorCisKKy8qIFBPU0lYIHRhciBIZWFkZXIgQmxvY2ssIGZyb20gUE9TSVggMTAwMy4xLTE5OTAgICovCisjZGVmaW5lIFRBUl9CTE9DS19TSVpFIDUxMgorI2RlZmluZSBOQU1FX1NJWkUgICAgICAxMDAKKyNkZWZpbmUgTkFNRV9TSVpFX1NUUiAiMTAwIgordHlwZWRlZiBzdHJ1Y3QgdGFyX2hlYWRlcl90IHsgICAgIC8qIGJ5dGUgb2Zmc2V0ICovCisJY2hhciBuYW1lW05BTUVfU0laRV07ICAgICAvKiAgIDAtOTkgKi8KKwljaGFyIG1vZGVbOF07ICAgICAgICAgICAgIC8qIDEwMC0xMDcgKi8KKwljaGFyIHVpZFs4XTsgICAgICAgICAgICAgIC8qIDEwOC0xMTUgKi8KKwljaGFyIGdpZFs4XTsgICAgICAgICAgICAgIC8qIDExNi0xMjMgKi8KKwljaGFyIHNpemVbMTJdOyAgICAgICAgICAgIC8qIDEyNC0xMzUgKi8KKwljaGFyIG10aW1lWzEyXTsgICAgICAgICAgIC8qIDEzNi0xNDcgKi8KKwljaGFyIGNoa3N1bVs4XTsgICAgICAgICAgIC8qIDE0OC0xNTUgKi8KKwljaGFyIHR5cGVmbGFnOyAgICAgICAgICAgIC8qIDE1Ni0xNTYgKi8KKwljaGFyIGxpbmtuYW1lW05BTUVfU0laRV07IC8qIDE1Ny0yNTYgKi8KKwkvKiBQT1NJWDogICAidXN0YXIiIE5VTCAiMDAiICovCisJLyogR05VIHRhcjogInVzdGFyICAiIE5VTCAqLworCS8qIE5vcm1hbGx5IGl0J3MgZGVmaW5lZCBhcyBtYWdpY1s2XSBmb2xsb3dlZCBieQorCSAqIHZlcnNpb25bMl0sIGJ1dCB3ZSBwdXQgdGhlbSB0b2dldGhlciB0byBzYXZlIGNvZGUuCisJICovCisJY2hhciBtYWdpY1s4XTsgICAgICAgICAgICAvKiAyNTctMjY0ICovCisJY2hhciB1bmFtZVszMl07ICAgICAgICAgICAvKiAyNjUtMjk2ICovCisJY2hhciBnbmFtZVszMl07ICAgICAgICAgICAvKiAyOTctMzI4ICovCisJY2hhciBkZXZtYWpvcls4XTsgICAgICAgICAvKiAzMjktMzM2ICovCisJY2hhciBkZXZtaW5vcls4XTsgICAgICAgICAvKiAzMzctMzQ0ICovCisJY2hhciBwcmVmaXhbMTU1XTsgICAgICAgICAvKiAzNDUtNDk5ICovCisJY2hhciBwYWRkaW5nWzEyXTsgICAgICAgICAvKiA1MDAtNTEyIChwYWQgdG8gZXhhY3RseSBUQVJfQkxPQ0tfU0laRSkgKi8KK30gdGFyX2hlYWRlcl90Oworc3RydWN0IEJVR190YXJfaGVhZGVyIHsKKwljaGFyIGNbc2l6ZW9mKHRhcl9oZWFkZXJfdCkgPT0gVEFSX0JMT0NLX1NJWkUgPyAxIDogLTFdOworfTsKKworCisKKy8qIEluZm8gc3RydWN0IHVucGFja2VycyBjYW4gZmlsbCBvdXQgdG8gaW5mb3JtIHVzZXJzIG9mIHRoaW5nIGxpa2UKKyAqIHRpbWVzdGFtcHMgb2YgdW5wYWNrZWQgZmlsZXMgKi8KK3R5cGVkZWYgc3RydWN0IHVucGFja19pbmZvX3QgeworCXRpbWVfdCBtdGltZTsKK30gdW5wYWNrX2luZm9fdDsKKworYXJjaGl2ZV9oYW5kbGVfdCAqaW5pdF9oYW5kbGUodm9pZCkgRkFTVF9GVU5DOworCitjaGFyIGZpbHRlcl9hY2NlcHRfYWxsKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CitjaGFyIGZpbHRlcl9hY2NlcHRfbGlzdChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOworY2hhciBmaWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ24oYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZmlsdGVyX2FjY2VwdF9yZWplY3RfbGlzdChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOworCit2b2lkIHVucGFja19hcl9hcmNoaXZlKGFyY2hpdmVfaGFuZGxlX3QgKmFyX2FyY2hpdmUpIEZBU1RfRlVOQzsKKwordm9pZCBkYXRhX3NraXAoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK3ZvaWQgZGF0YV9leHRyYWN0X2FsbChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOwordm9pZCBkYXRhX2V4dHJhY3RfdG9fc3Rkb3V0KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7Cit2b2lkIGRhdGFfZXh0cmFjdF90b19jb21tYW5kKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CisKK3ZvaWQgaGVhZGVyX3NraXAoY29uc3QgZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIpIEZBU1RfRlVOQzsKK3ZvaWQgaGVhZGVyX2xpc3QoY29uc3QgZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIpIEZBU1RfRlVOQzsKK3ZvaWQgaGVhZGVyX3ZlcmJvc2VfbGlzdChjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcikgRkFTVF9GVU5DOworCitjaGFyIGdldF9oZWFkZXJfYXIoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZ2V0X2hlYWRlcl9jcGlvKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CitjaGFyIGdldF9oZWFkZXJfdGFyKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CitjaGFyIGdldF9oZWFkZXJfdGFyX2d6KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CitjaGFyIGdldF9oZWFkZXJfdGFyX2J6MihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOworY2hhciBnZXRfaGVhZGVyX3Rhcl9sem1hKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CisKK3ZvaWQgc2Vla19ieV9qdW1wKGludCBmZCwgb2ZmX3QgYW1vdW50KSBGQVNUX0ZVTkM7Cit2b2lkIHNlZWtfYnlfcmVhZChpbnQgZmQsIG9mZl90IGFtb3VudCkgRkFTVF9GVU5DOworCitjb25zdCBjaGFyICpzdHJpcF91bnNhZmVfcHJlZml4KGNvbnN0IGNoYXIgKnN0cikgRkFTVF9GVU5DOworCit2b2lkIGRhdGFfYWxpZ24oYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUsIHVuc2lnbmVkIGJvdW5kYXJ5KSBGQVNUX0ZVTkM7Citjb25zdCBsbGlzdF90ICpmaW5kX2xpc3RfZW50cnkoY29uc3QgbGxpc3RfdCAqbGlzdCwgY29uc3QgY2hhciAqZmlsZW5hbWUpIEZBU1RfRlVOQzsKK2NvbnN0IGxsaXN0X3QgKmZpbmRfbGlzdF9lbnRyeTIoY29uc3QgbGxpc3RfdCAqbGlzdCwgY29uc3QgY2hhciAqZmlsZW5hbWUpIEZBU1RfRlVOQzsKKworLyogQSBiaXQgb2YgYnVuemlwMiBpbnRlcm5hbHMgYXJlIGV4cG9zZWQgZm9yIGNvbXByZXNzZWQgaGVscCBzdXBwb3J0OiAqLwordHlwZWRlZiBzdHJ1Y3QgYnVuemlwX2RhdGEgYnVuemlwX2RhdGE7CitpbnQgc3RhcnRfYnVuemlwKGJ1bnppcF9kYXRhICoqYmRwLCBpbnQgaW5fZmQsIGNvbnN0IHZvaWQgKmluYnVmLCBpbnQgbGVuKSBGQVNUX0ZVTkM7CisvKiBOQjogcmVhZF9idW56aXAgcmV0dXJucyA8IDAgb24gZXJyb3IsIG9yIHRoZSBudW1iZXIgb2YgKnVuZmlsbGVkKiBieXRlcworICogaW4gb3V0YnVmLiBJT1c6IG9uIEVPRiByZXR1cm5zIGxlbiAoImFsbCBieXRlcyBhcmUgbm90IGZpbGxlZCIpLCBub3QgMDogKi8KK2ludCByZWFkX2J1bnppcChidW56aXBfZGF0YSAqYmQsIGNoYXIgKm91dGJ1ZiwgaW50IGxlbikgRkFTVF9GVU5DOwordm9pZCBkZWFsbG9jX2J1bnppcChidW56aXBfZGF0YSAqYmQpIEZBU1RfRlVOQzsKKwordHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV91bnppcF9yZXN1bHQgeworCW9mZl90IGJ5dGVzX291dDsKKwl1aW50MzJfdCBjcmM7Cit9IGluZmxhdGVfdW56aXBfcmVzdWx0OworCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IGluZmxhdGVfdW56aXAoaW5mbGF0ZV91bnppcF9yZXN1bHQgKnJlcywgb2ZmX3QgY29tcHJfc2l6ZSwgaW50IHNyY19mZCwgaW50IGRzdF9mZCkgRkFTVF9GVU5DOworLyogeHogdW5wYWNrZXIgdGFrZXMgLnh6IHN0cmVhbSBmcm9tIG9mZnNldCA2ICovCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHVucGFja194el9zdHJlYW0oaW50IHNyY19mZCwgaW50IGRzdF9mZCkgRkFTVF9GVU5DOworLyogbHptYSB1bnBhY2tlciB0YWtlcyAubHptYSBzdHJlYW0gZnJvbSBvZmZzZXQgMCAqLworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB1bnBhY2tfbHptYV9zdHJlYW0oaW50IHNyY19mZCwgaW50IGRzdF9mZCkgRkFTVF9GVU5DOworLyogdGhlIHJlc3Qgd2FudHMgMiBmaXJzdCBieXRlcyBhbHJlYWR5IHNraXBwZWQgYnkgdGhlIGNhbGxlciAqLworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB1bnBhY2tfYnoyX3N0cmVhbShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSBGQVNUX0ZVTkM7CitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHVucGFja19nel9zdHJlYW0oaW50IHNyY19mZCwgaW50IGRzdF9mZCkgRkFTVF9GVU5DOworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB1bnBhY2tfZ3pfc3RyZWFtX3dpdGhfaW5mbyhpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkLCB1bnBhY2tfaW5mb190ICppbmZvKSBGQVNUX0ZVTkM7CitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHVucGFja19aX3N0cmVhbShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSBGQVNUX0ZVTkM7CisvKiB3cmFwcGVyIHdoaWNoIGNoZWNrcyBmaXJzdCB0d28gYnl0ZXMgdG8gYmUgIkJaIiAqLworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB1bnBhY2tfYnoyX3N0cmVhbV9wcmltZShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSBGQVNUX0ZVTkM7CisKK2NoYXIqIGFwcGVuZF9leHQoY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dCkgRkFTVF9GVU5DOworaW50IGJidW5wYWNrKGNoYXIgKiphcmd2LAorCSAgICBJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyAoKnVucGFja2VyKSh1bnBhY2tfaW5mb190ICppbmZvKSwKKwkgICAgY2hhciogRkFTVF9GVU5DICgqbWFrZV9uZXdfbmFtZSkoY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dCksCisJICAgIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dAorKSBGQVNUX0ZVTkM7CisKKyNpZiBCQl9NTVUKK3ZvaWQgb3Blbl90cmFuc2Zvcm1lcihpbnQgZmQsCisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp0cmFuc2Zvcm1lcikoaW50IHNyY19mZCwgaW50IGRzdF9mZCkpIEZBU1RfRlVOQzsKKyNkZWZpbmUgb3Blbl90cmFuc2Zvcm1lcihmZCwgdHJhbnNmb3JtZXIsIHRyYW5zZm9ybV9wcm9nKSBvcGVuX3RyYW5zZm9ybWVyKGZkLCB0cmFuc2Zvcm1lcikKKyNlbHNlCit2b2lkIG9wZW5fdHJhbnNmb3JtZXIoaW50IHNyY19mZCwgY29uc3QgY2hhciAqdHJhbnNmb3JtX3Byb2cpIEZBU1RfRlVOQzsKKyNkZWZpbmUgb3Blbl90cmFuc2Zvcm1lcihmZCwgdHJhbnNmb3JtZXIsIHRyYW5zZm9ybV9wcm9nKSBvcGVuX3RyYW5zZm9ybWVyKGZkLCB0cmFuc2Zvcm1fcHJvZykKKyNlbmRpZgorCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvYnVzeWJveC5oIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9idXN5Ym94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1ZWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvYnVzeWJveC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgQlVTWUJPWF9ICisjZGVmaW5lIEJVU1lCT1hfSCAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQkJfRElSX2ZvbyBhbmQgQkJfU1VJRF9iYXIgY29uc3RhbnRzOiAqLworI2luY2x1ZGUgImFwcGxldF9tZXRhZGF0YS5oIgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogRGVmaW5lZCBpbiBhcHBsZXRsaWIuYyAoYnkgaW5jbHVkaW5nIGdlbmVyYXRlZCBhcHBsZXRfdGFibGVzLmgpICovCisvKiBLZWVwIGluIHN5bmMgd2l0aCBhcHBsZXRzL2FwcGxldF90YWJsZXMuYyEgKi8KK2V4dGVybiBjb25zdCBjaGFyIGFwcGxldF9uYW1lc1tdOworZXh0ZXJuIGludCAoKmNvbnN0IGFwcGxldF9tYWluW10pKGludCBhcmdjLCBjaGFyICoqYXJndik7CitleHRlcm4gY29uc3QgdWludDE2X3QgYXBwbGV0X25hbWVvZnNbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGFwcGxldF9pbnN0YWxsX2xvY1tdOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRCB8fCBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworIyBkZWZpbmUgQVBQTEVUX05BTUUoaSkgKGFwcGxldF9uYW1lcyArIChhcHBsZXRfbmFtZW9mc1tpXSAmIDB4MGZmZikpCisjZWxzZQorIyBkZWZpbmUgQVBQTEVUX05BTUUoaSkgKGFwcGxldF9uYW1lcyArIGFwcGxldF9uYW1lb2ZzW2ldKQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworIyBkZWZpbmUgQVBQTEVUX0lTX05PRk9SSyhpKSAoYXBwbGV0X25hbWVvZnNbaV0gJiAoMSA8PCAxMikpCisjIGRlZmluZSBBUFBMRVRfSVNfTk9FWEVDKGkpIChhcHBsZXRfbmFtZW9mc1tpXSAmICgxIDw8IDEzKSkKKyNlbHNlCisjIGRlZmluZSBBUFBMRVRfSVNfTk9GT1JLKGkpIDAKKyMgZGVmaW5lIEFQUExFVF9JU19OT0VYRUMoaSkgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVUlECisjIGRlZmluZSBBUFBMRVRfU1VJRChpKSAoKGFwcGxldF9uYW1lb2ZzW2ldID4+IDE0KSAmIDB4MykKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TVEFMTEVSCisjZGVmaW5lIEFQUExFVF9JTlNUQUxMX0xPQyhpKSAoeyBcCisJdW5zaWduZWQgdiA9IChpKTsgXAorCWlmICh2ICYgMSkgdiA9IGFwcGxldF9pbnN0YWxsX2xvY1t2LzJdID4+IDQ7IFwKKwllbHNlIHYgPSBhcHBsZXRfaW5zdGFsbF9sb2Nbdi8yXSAmIDB4ZjsgXAorCXY7IH0pCisjZW5kaWYKKworCisvKiBMZW5ndGggb2YgdGhlc2UgbmFtZXMgaGFzIGVmZmVjdCBvbiBzaXplIG9mIGxpYmJ1c3lib3gKKyAqIGFuZCAiaW5kaXZpZHVhbCIgYmluYXJpZXMuIEtlZXAgdGhlbSBzaG9ydC4KKyAqLworI2lmIEVOQUJMRV9CVUlMRF9MSUJCVVNZQk9YCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1gKK2ludCBsYmJfbWFpbihjaGFyICoqYXJndikgRVhURVJOQUxMWV9WSVNJQkxFOworI2Vsc2UKK2ludCBsYmJfbWFpbihjaGFyICoqYXJndik7CisjZW5kaWYKKyNlbmRpZgorCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvZHVtcC5oIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9kdW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyMzdlZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvZHVtcC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworI2RlZmluZQlGX0lHTk9SRQkweDAxCQkvKiAlX0EgKi8KKyNkZWZpbmUJRl9TRVRSRVAJMHgwMgkJLyogcmVwIGNvdW50IHNldCwgbm90IGRlZmF1bHQgKi8KKyNkZWZpbmUJRl9BRERSRVNTCTB4MDAxCQkvKiBwcmludCBvZmZzZXQgKi8KKyNkZWZpbmUJRl9CUEFECQkweDAwMgkJLyogYmxhbmsgcGFkICovCisjZGVmaW5lCUZfQwkJMHgwMDQJCS8qICVfYyAqLworI2RlZmluZQlGX0NIQVIJCTB4MDA4CQkvKiAlYyAqLworI2RlZmluZQlGX0RCTAkJMHgwMTAJCS8qICVbRWVmR2ZdICovCisjZGVmaW5lCUZfSU5UCQkweDAyMAkJLyogJVtkaV0gKi8KKyNkZWZpbmUJRl9QCQkweDA0MAkJLyogJV9wICovCisjZGVmaW5lCUZfU1RSCQkweDA4MAkJLyogJXMgKi8KKyNkZWZpbmUJRl9VCQkweDEwMAkJLyogJV91ICovCisjZGVmaW5lCUZfVUlOVAkJMHgyMDAJCS8qICVbb3VYeF0gKi8KKyNkZWZpbmUJRl9URVhUCQkweDQwMAkJLyogbm8gY29udmVyc2lvbnMgKi8KKworZW51bSBkdW1wX3ZmbGFnX3QgeyBBTEwsIERVUCwgRklSU1QsIFdBSVQgfTsJLyogLXYgdmFsdWVzICovCisKK3R5cGVkZWYgc3RydWN0IFBSIHsKKwlzdHJ1Y3QgUFIgKm5leHRwcjsJCS8qIG5leHQgcHJpbnQgdW5pdCAqLworCXVuc2lnbmVkIGZsYWdzOwkJCS8qIGZsYWcgdmFsdWVzICovCisJaW50IGJjbnQ7CQkJLyogYnl0ZSBjb3VudCAqLworCWNoYXIgKmNjaGFyOwkJCS8qIGNvbnZlcnNpb24gY2hhcmFjdGVyICovCisJY2hhciAqZm10OwkJCS8qIHByaW50ZiBmb3JtYXQgKi8KKwljaGFyICpub3NwYWNlOwkJCS8qIG5vIHdoaXRlc3BhY2UgdmVyc2lvbiAqLworfSBQUjsKKwordHlwZWRlZiBzdHJ1Y3QgRlUgeworCXN0cnVjdCBGVSAqbmV4dGZ1OwkJLyogbmV4dCBmb3JtYXQgdW5pdCAqLworCXN0cnVjdCBQUiAqbmV4dHByOwkJLyogbmV4dCBwcmludCB1bml0ICovCisJdW5zaWduZWQgZmxhZ3M7CQkJLyogZmxhZyB2YWx1ZXMgKi8KKwlpbnQgcmVwczsJCQkvKiByZXBldGl0aW9uIGNvdW50ICovCisJaW50IGJjbnQ7CQkJLyogYnl0ZSBjb3VudCAqLworCWNoYXIgKmZtdDsJCQkvKiBmb3JtYXQgc3RyaW5nICovCit9IEZVOworCit0eXBlZGVmIHN0cnVjdCBGUyB7CQkJLyogZm9ybWF0IHN0cmluZ3MgKi8KKwlzdHJ1Y3QgRlMgKm5leHRmczsJCS8qIGxpbmtlZCBsaXN0IG9mIGZvcm1hdCBzdHJpbmdzICovCisJc3RydWN0IEZVICpuZXh0ZnU7CQkvKiBsaW5rZWQgbGlzdCBvZiBmb3JtYXQgdW5pdHMgKi8KKwlpbnQgYmNudDsKK30gRlM7CisKK3R5cGVkZWYgc3RydWN0IGR1bXBlcl90IHsKKwlvZmZfdCBkdW1wX3NraXA7ICAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIHNraXAgKi8KKwlpbnQgZHVtcF9sZW5ndGg7ICAgICAgICAgICAgICAgIC8qIG1heCBieXRlcyB0byByZWFkICovCisJc21hbGxpbnQgZHVtcF92ZmxhZzsgICAgICAgICAgICAvKmVudW0gZHVtcF92ZmxhZ190Ki8KKwlGUyAqZnNoZWFkOworfSBkdW1wZXJfdDsKKworZHVtcGVyX3QqIGFsbG9jX2R1bXBlcih2b2lkKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9kdW1wX2FkZChkdW1wZXJfdCAqZHVtcGVyLCBjb25zdCBjaGFyICpmbXQpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgYmJfZHVtcF9kdW1wKGR1bXBlcl90ICpkdW1wZXIsIGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2ZpeF91MzIuaCBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvZml4X3UzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmE2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2ZpeF91MzIuaApAQCAtMCwwICsxLDU1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGlzIGhlYWRlciBtYWtlcyBpdCBlYXNpZXIgdG8gaW5jbHVkZSBrZXJuZWwgaGVhZGVycworICogd2hpY2ggdXNlIHUzMiBhbmQgc3VjaC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIEZJWF9VMzJfSAorI2RlZmluZSBGSVhfVTMyX0ggMQorCisvKiBUcnkgaGFyZCB0byBwdWxsIGluIHUzMiB0eXBlcyBhbmQgc3VjaC4KKyAqIE90aGVyd2lzZSwgI2luY2x1ZGUgImZpeF91MzIuaCIgKyAjaW5jbHVkZSA8bGludXgvZm9vLmg+CisgKiBtYXkgZW5kIHVwIHR5cGVkZWYnaW5nIGJiX2hhY2tfdTMyIGluc2lkZSBmb28uaCwKKyAqIGFuZCByZXBlYXRlZCB0eXBlZGVmcyBhcmVuJ3QgYWxsb3dlZCBpbiBDL0MrKy4KKyAqLworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEluIGNhc2UgYWJvdmUgaW5jbHVkZXMgc3RpbGwgZmFpbGVkIHRvIHByb3ZpZGUgdGhlIHR5cGVzLAorICogcHJvdmlkZSB0aGVtIG91cnNlbGYKKyAqLworI3VuZGVmIF9fdTY0CisjdW5kZWYgdTY0CisjdW5kZWYgdTMyCisjdW5kZWYgdTE2CisjdW5kZWYgdTgKKyN1bmRlZiBfX3M2NAorI3VuZGVmIHM2NAorI3VuZGVmIHMzMgorI3VuZGVmIHMxNgorI3VuZGVmIHM4CisKKyNkZWZpbmUgX191NjQgYmJfaGFja19fX3U2NAorI2RlZmluZSB1NjQgICBiYl9oYWNrX3U2NAorI2RlZmluZSB1MzIgICBiYl9oYWNrX3UzMgorI2RlZmluZSB1MTYgICBiYl9oYWNrX3UxNgorI2RlZmluZSB1OCAgICBiYl9oYWNrX3U4CisjZGVmaW5lIF9fczY0IGJiX2hhY2tfX19zNjQKKyNkZWZpbmUgczY0ICAgYmJfaGFja19zNjQKKyNkZWZpbmUgczMyICAgYmJfaGFja19zMzIKKyNkZWZpbmUgczE2ICAgYmJfaGFja19zMTYKKyNkZWZpbmUgczggICAgYmJfaGFja19zOAorCit0eXBlZGVmIHVpbnQ2NF90IF9fdTY0OwordHlwZWRlZiB1aW50NjRfdCB1NjQ7Cit0eXBlZGVmIHVpbnQzMl90IHUzMjsKK3R5cGVkZWYgdWludDE2X3QgdTE2OwordHlwZWRlZiB1aW50OF90IHU4OwordHlwZWRlZiBpbnQ2NF90IF9fczY0OwordHlwZWRlZiBpbnQ2NF90IHM2NDsKK3R5cGVkZWYgaW50MzJfdCBzMzI7Cit0eXBlZGVmIGludDE2X3QgczE2OwordHlwZWRlZiBpbnQ4X3Qgczg7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9ncnBfLmggYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2dycF8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzI0ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9ncnBfLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogQ29weXJpZ2h0IChDKSAxOTkxLDkyLDk1LDk2LDk3LDk4LDk5LDIwMDAsMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4KKyAqLworLyoKKyAqIFBPU0lYIFN0YW5kYXJkOiA5LjIuMSBHcm91cCBEYXRhYmFzZSBBY2Nlc3MJPGdycC5oPgorICovCisjaWZuZGVmIEJCX0dSUF9ICisjZGVmaW5lIEJCX0dSUF9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgYWZ0ZXIgI2luY2x1ZGUgPGdycC5oPgorICogV2Ugd2lsbCB1c2UgbGliYy1kZWZpbmVkIHN0cnVjdHVyZXMsIGJ1dCB3aWxsICNkZWZpbmUgZnVuY3Rpb24gbmFtZXMKKyAqIHNvIHRoYXQgZnVuY3Rpb24gY2FsbHMgYXJlIGRpcmVjdGVkIHRvIGJiX2ludGVybmFsX1hYWCByZXBsYWNlbWVudHMKKyAqLworCisjZGVmaW5lIHNldGdyZW50ICAgICBiYl9pbnRlcm5hbF9zZXRncmVudAorI2RlZmluZSBlbmRncmVudCAgICAgYmJfaW50ZXJuYWxfZW5kZ3JlbnQKKyNkZWZpbmUgZ2V0Z3JlbnQgICAgIGJiX2ludGVybmFsX2dldGdyZW50CisjZGVmaW5lIGZnZXRncmVudCAgICBiYl9pbnRlcm5hbF9mZ2V0Z3JlbnQKKyNkZWZpbmUgcHV0Z3JlbnQgICAgIGJiX2ludGVybmFsX3B1dGdyZW50CisjZGVmaW5lIGdldGdyZ2lkICAgICBiYl9pbnRlcm5hbF9nZXRncmdpZAorI2RlZmluZSBnZXRncm5hbSAgICAgYmJfaW50ZXJuYWxfZ2V0Z3JuYW0KKyNkZWZpbmUgZ2V0Z3JlbnRfciAgIGJiX2ludGVybmFsX2dldGdyZW50X3IKKyNkZWZpbmUgZ2V0Z3JnaWRfciAgIGJiX2ludGVybmFsX2dldGdyZ2lkX3IKKyNkZWZpbmUgZ2V0Z3JuYW1fciAgIGJiX2ludGVybmFsX2dldGdybmFtX3IKKyNkZWZpbmUgZmdldGdyZW50X3IgIGJiX2ludGVybmFsX2ZnZXRncmVudF9yCisjZGVmaW5lIGdldGdyb3VwbGlzdCBiYl9pbnRlcm5hbF9nZXRncm91cGxpc3QKKyNkZWZpbmUgaW5pdGdyb3VwcyAgIGJiX2ludGVybmFsX2luaXRncm91cHMKKworCisvKiBBbGwgZnVuY3Rpb24gbmFtZXMgYmVsb3cgc2hvdWxkIGJlIHJlbWFwcGVkIGJ5ICNkZWZpbmVzIGFib3ZlCisgKiBpbiBvcmRlciB0byBub3QgY29sbGlkZSB3aXRoIGxpYmMgbmFtZXMuICovCisKKworLyogUmV3aW5kIHRoZSBncm91cC1maWxlIHN0cmVhbS4gICovCitleHRlcm4gdm9pZCBzZXRncmVudCh2b2lkKTsKKworLyogQ2xvc2UgdGhlIGdyb3VwLWZpbGUgc3RyZWFtLiAgKi8KK2V4dGVybiB2b2lkIGVuZGdyZW50KHZvaWQpOworCisjaWZkZWYgVU5VU0VEX1NJTkNFX1dFX0FWT0lEX1NUQVRJQ19CVUZTCisvKiBSZWFkIGFuIGVudHJ5IGZyb20gdGhlIGdyb3VwLWZpbGUgc3RyZWFtLCBvcGVuaW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCitleHRlcm4gc3RydWN0IGdyb3VwICpnZXRncmVudCh2b2lkKTsKKworLyogUmVhZCBhIGdyb3VwIGVudHJ5IGZyb20gU1RSRUFNLiAgKi8KK2V4dGVybiBzdHJ1Y3QgZ3JvdXAgKmZnZXRncmVudChGSUxFICpfX3N0cmVhbSk7CisKKy8qIFdyaXRlIHRoZSBnaXZlbiBlbnRyeSBvbnRvIHRoZSBnaXZlbiBzdHJlYW0uICAqLworZXh0ZXJuIGludCBwdXRncmVudChjb25zdCBzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgX19wLAorCQkgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19mKTsKKyNlbmRpZgorCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyBncm91cCBJRC4gICovCitleHRlcm4gc3RydWN0IGdyb3VwICpnZXRncmdpZChnaWRfdCBfX2dpZCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIG5hbWUuICAqLworZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JuYW0oY29uc3QgY2hhciAqX19uYW1lKTsKKworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4KKworICAgUExFQVNFIE5PVEU6IHRoZSBgZ2V0Z3JlbnRfcicgZnVuY3Rpb24gaXMgbm90ICh5ZXQpIHN0YW5kYXJkaXplZC4KKyAgIFRoZSBpbnRlcmZhY2UgbWF5IGNoYW5nZSBpbiBsYXRlciB2ZXJzaW9ucyBvZiB0aGlzIGxpYnJhcnkuICBCdXQKKyAgIHRoZSBpbnRlcmZhY2UgaXMgZGVzaWduZWQgZm9sbG93aW5nIHRoZSBwcmluY2lwYWxzIHVzZWQgZm9yIHRoZQorICAgb3RoZXIgcmVlbnRyYW50IGZ1bmN0aW9ucyBzbyB0aGUgY2hhbmNlcyBhcmUgZ29vZCB0aGlzIGlzIHdoYXQgdGhlCisgICBQT1NJWCBwZW9wbGUgd291bGQgY2hvb3NlLiAgKi8KKworZXh0ZXJuIGludCBnZXRncmVudF9yKHN0cnVjdCBncm91cCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBncm91cCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyBncm91cCBJRC4gICovCitleHRlcm4gaW50IGdldGdyZ2lkX3IoZ2lkX3QgX19naWQsIHN0cnVjdCBncm91cCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBncm91cCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyBncm91cCBuYW1lLiAgKi8KK2V4dGVybiBpbnQgZ2V0Z3JuYW1fcihjb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJICAgICAgIHN0cnVjdCBncm91cCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBncm91cCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCisvKiBSZWFkIGEgZ3JvdXAgZW50cnkgZnJvbSBTVFJFQU0uICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdGFuZGFyZGl6ZWQKKyAgIGFuIHByb2JhYmx5IG5ldmVyIHdpbGwuICAqLworZXh0ZXJuIGludCBmZ2V0Z3JlbnRfcihGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkJY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKy8qIFN0b3JlIGF0IG1vc3QgKk5HUk9VUFMgbWVtYmVycyBvZiB0aGUgZ3JvdXAgc2V0IGZvciBVU0VSIGludG8KKyAgICpHUk9VUFMuICBBbHNvIGluY2x1ZGUgR1JPVVAuICBUaGUgYWN0dWFsIG51bWJlciBvZiBncm91cHMgZm91bmQgaXMKKyAgIHJldHVybmVkIGluICpOR1JPVVBTLiAgUmV0dXJuIC0xIGlmIHRoZSBpZiAqTkdST1VQUyBpcyB0b28gc21hbGwuICAqLworZXh0ZXJuIGludCBnZXRncm91cGxpc3QoY29uc3QgY2hhciAqX191c2VyLCBnaWRfdCBfX2dyb3VwLAorCQkJIGdpZF90ICpfX2dyb3VwcywgaW50ICpfX25ncm91cHMpOworCisvKiBJbml0aWFsaXplIHRoZSBncm91cCBzZXQgZm9yIHRoZSBjdXJyZW50IHVzZXIKKyAgIGJ5IHJlYWRpbmcgdGhlIGdyb3VwIGRhdGFiYXNlIGFuZCB1c2luZyBhbGwgZ3JvdXBzCisgICBvZiB3aGljaCBVU0VSIGlzIGEgbWVtYmVyLiAgQWxzbyBpbmNsdWRlIEdST1VQLiAgKi8KK2V4dGVybiBpbnQgaW5pdGdyb3Vwcyhjb25zdCBjaGFyICpfX3VzZXIsIGdpZF90IF9fZ3JvdXApOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvaW5ldF9jb21tb24uaCBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvaW5ldF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjM4YWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9pbmV0X2NvbW1vbi5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHN0b2xlbiBmcm9tIG5ldC10b29scy0xLjU5IGFuZCBzdHJpcHBlZCBkb3duIGZvciBidXN5Ym94IGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogSGVhdmlseSBtb2RpZmllZCBieSBNYW51ZWwgTm92b2EgSUlJICAgICAgIE1hciAxMiwgMjAwMQorICoKKyAqLworI2lmbmRlZiBJTkVUX0NPTU1PTl9ICisjZGVmaW5lIElORVRfQ09NTU9OX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogaG9zdGZpcnN0IT0wIElmIHdlIGV4cGVjdCB0aGlzIHRvIGJlIGEgaG9zdG5hbWUsCisgICB0cnkgaG9zdG5hbWUgZGF0YWJhc2UgZmlyc3QKKyAqLworaW50IElORVRfcmVzb2x2ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNfaW4sIGludCBob3N0Zmlyc3QpIEZBU1RfRlVOQzsKKworLyogbnVtZXJpYzogJiAweDgwMDA6ICJkZWZhdWx0IiBpbnN0ZWFkIG9mICIqIiwKKyAqICAgICAgICAgICYgMHg0MDAwOiBob3N0IGluc3RlYWQgb2YgbmV0LAorICogICAgICAgICAgJiAweDBmZmY6IGRvbid0IHJlc29sdmUKKyAqLworCitpbnQgSU5FVDZfcmVzb2x2ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42KSBGQVNUX0ZVTkM7CisKKy8qIFRoZXNlIHJldHVybiBtYWxsb2NlZCBzdHJpbmcgKi8KK2NoYXIgKklORVRfcnJlc29sdmUoc3RydWN0IHNvY2thZGRyX2luICpzX2luLCBpbnQgbnVtZXJpYywgdWludDMyX3QgbmV0bWFzaykgRkFTVF9GVU5DOworY2hhciAqSU5FVDZfcnJlc29sdmUoc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiwgaW50IG51bWVyaWMpIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2xpYmJiLmggYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2xpYmJiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkMDQxOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvbGliYmIuaApAQCAtMCwwICsxLDE4NjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEJ1c3lib3ggbWFpbiBpbnRlcm5hbCBoZWFkZXIgZmlsZQorICoKKyAqIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIHNhc2gsIENvcHlyaWdodCAoYykgMTk5OSBieSBEYXZpZCBJLiBCZWxsCisgKiBQZXJtaXNzaW9uIGhhcyBiZWVuIGdyYW50ZWQgdG8gcmVkaXN0cmlidXRlIHRoaXMgY29kZSB1bmRlciBHUEwuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBMSUJCQl9ICisjZGVmaW5lIExJQkJCX0ggMQorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZiBkZWZpbmVkIF9fVUNMSUJDX18gLyogVE9ETzogYW5kIGdsaWJjPyAqLworLyogdXNlIGlubGluZWQgdmVyc2lvbnMgb2YgdGhlc2U6ICovCisjIGRlZmluZSBzaWdmaWxsc2V0KHMpICAgIF9fc2lnZmlsbHNldChzKQorIyBkZWZpbmUgc2lnZW1wdHlzZXQocykgICBfX3NpZ2VtcHR5c2V0KHMpCisjIGRlZmluZSBzaWdpc2VtcHR5c2V0KHMpIF9fc2lnaXNlbXB0eXNldChzKQorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZm5kZWYgbWFqb3IKKyMgaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIEhBVkVfTU5URU5UX0gKKyMgaW5jbHVkZSA8bW50ZW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAorIyBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisjZW5kaWYKKy8qIERvbid0IGRvIHRoaXMgaGVyZToKKyAqICNpbmNsdWRlIDxzeXMvc3lzaW5mby5oPgorICogU29tZSBsaW51eC8gaW5jbHVkZXMgcHVsbCBpbiBjb25mbGljdGluZyBkZWZpbml0aW9uCisgKiBvZiBzdHJ1Y3Qgc3lzaW5mbyAob25seSBpbiBzb21lIHRvb2xjaGFuaW5zKSwgd2hpY2ggYnJlYWtzIGJ1aWxkLgorICogSW5jbHVkZSBzeXMvc3lzaW5mby5oIG9ubHkgaW4gdGhvc2UgZmlsZXMgd2hpY2ggbmVlZCBpdC4KKyAqLworI2lmIEVOQUJMRV9TRUxJTlVYCisjIGluY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorIyBpbmNsdWRlIDxzZWxpbnV4L2NvbnRleHQuaD4KKyMgaW5jbHVkZSA8c2VsaW51eC9mbGFzay5oPgorIyBpbmNsdWRlIDxzZWxpbnV4L2F2X3Blcm1pc3Npb25zLmg+CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9VVE1QCisjIGluY2x1ZGUgPHV0bXAuaD4KKyNlbmRpZgorI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorIyBpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbHNlCisjIGRlZmluZSBzZXRsb2NhbGUoeCx5KSAoKHZvaWQpMCkKKyNlbmRpZgorI2lmZGVmIERNQUxMT0MKKyMgaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworIyBpZiAhRU5BQkxFX1VTRV9CQl9TSEFET1cKKy8qIElmIHVzaW5nIGJ1c3lib3gncyBzaGFkb3cgaW1wbGVtZW50YXRpb24sIGRvIG5vdCBpbmNsdWRlIHRoZSBzaGFkb3cuaAorICogaGVhZGVyIGFzIHRoZSB0b29sY2hhaW4gbWF5IG5vdCBwcm92aWRlIGl0IGF0IGFsbC4KKyAqLworIyAgaW5jbHVkZSA8c2hhZG93Lmg+CisjIGVuZGlmCisjZW5kaWYKKy8qIEp1c3QgaW4gY2FzZSBsaWJjIGRvZXNuJ3QgZGVmaW5lIHNvbWUgb2YgdGhlc2UuLi4gKi8KKyNpZm5kZWYgX1BBVEhfUEFTU1dECisjZGVmaW5lIF9QQVRIX1BBU1NXRCAgIi9ldGMvcGFzc3dkIgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX0dST1VQCisjZGVmaW5lIF9QQVRIX0dST1VQICAgIi9ldGMvZ3JvdXAiCisjZW5kaWYKKyNpZm5kZWYgX1BBVEhfU0hBRE9XCisjZGVmaW5lIF9QQVRIX1NIQURPVyAgIi9ldGMvc2hhZG93IgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX0dTSEFET1cKKyNkZWZpbmUgX1BBVEhfR1NIQURPVyAiL2V0Yy9nc2hhZG93IgorI2VuZGlmCisjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fT3BlbkJTRF9fCisjIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZWxpZiBkZWZpbmVkIF9fQVBQTEVfXworIyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyMgaWYgIWRlZmluZWQoX19zb2NrbGVuX3RfZGVmaW5lZCkgJiYgIWRlZmluZWQoX1NPQ0tMRU5fVF9ERUNMQVJFRCkKKy8qIFdlICNkZWZpbmUgc29ja2xlbl90ICphZnRlciogaW5jbHVkZXMsIG90aGVyd2lzZSB3ZSBnZXQKKyAqIHR5cGVkZWYgcmVkZWZpbml0aW9uIGVycm9ycyBmcm9tIHN5c3RlbSBoZWFkZXJzCisgKiAoaW4gY2FzZSAiaXMgaXQgZGVmaW5lZCBhbHJlYWR5IiBkZXRlY3Rpb24gYWJvdmUgZmFpbGVkKQorICovCisjICBkZWZpbmUgc29ja2xlbl90IGJiX3NvY2tsZW5fdAorICAgdHlwZWRlZiB1bnNpZ25lZCBzb2NrbGVuX3Q7CisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9DTEVBUkVOVgorIyBkZWZpbmUgY2xlYXJlbnYoKSBkbyB7IGlmIChlbnZpcm9uKSBlbnZpcm9uWzBdID0gTlVMTDsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiBIQVZFX0ZEQVRBU1lOQworIyBkZWZpbmUgZmRhdGFzeW5jIGZzeW5jCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9YVEFCUworIyBkZWZpbmUgWFRBQlMgVEFCMworI2VuZGlmCisKKworLyogU29tZSBsaWJjJ3MgZm9yZ2V0IHRvIGRlY2xhcmUgdGhlc2UsIGRvIGl0IG91cnNlbGYgKi8KKworZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPCAyCitpbnQgdmRwcmludGYoaW50IGQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisjZW5kaWYKKy8qIGtsb2djdGwgaXMgaW4gbGliYydzIGtsb2cuaCwgYnV0IHdlIGNoZWF0IGFuZCBub3QgI2luY2x1ZGUgdGhhdCAqLworaW50IGtsb2djdGwoaW50IHR5cGUsIGNoYXIgKmIsIGludCBsZW4pOworLyogVGhpcyBpcyBkZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuICNpbmNsdWRpbmcgPGxpYmdlbi5oPiBpbiBvcmRlciB0byBhdm9pZAorICogY29uZnVzaW5nIHRoZSB0d28gdmVyc2lvbnMgb2YgYmFzZW5hbWUuICBTZWUgdGhlIGRpcm5hbWUvYmFzZW5hbWUgbWFuIHBhZ2UKKyAqIGZvciBkZXRhaWxzLiAqLworI2lmICFkZWZpbmVkIF9fRnJlZUJTRF9fCitjaGFyICpkaXJuYW1lKGNoYXIgKnBhdGgpOworI2VuZGlmCisjaWZuZGVmIFBBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCAyNTYKKyNlbmRpZgorI2lmbmRlZiBCVUZTSVoKKyMgZGVmaW5lIEJVRlNJWiA0MDk2CisjZW5kaWYKKworCisvKiBCdXN5Ym94IGRvZXMgbm90IHVzZSB0aHJlYWRzLCB3ZSBjYW4gc3BlZWQgdXAgc3RkaW8uICovCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9TVERJTworIyB1bmRlZiAgZ2V0YworIyBkZWZpbmUgZ2V0YyhzdHJlYW0pIGdldGNfdW5sb2NrZWQoc3RyZWFtKQorIyB1bmRlZiAgZ2V0Y2hhcgorIyBkZWZpbmUgZ2V0Y2hhcigpIGdldGNoYXJfdW5sb2NrZWQoKQorIyB1bmRlZiAgcHV0YworIyBkZWZpbmUgcHV0YyhjLCBzdHJlYW0pIHB1dGNfdW5sb2NrZWQoYywgc3RyZWFtKQorIyB1bmRlZiAgcHV0Y2hhcgorIyBkZWZpbmUgcHV0Y2hhcihjKSBwdXRjaGFyX3VubG9ja2VkKGMpCisjIHVuZGVmICBmZ2V0YworIyBkZWZpbmUgZmdldGMoc3RyZWFtKSBnZXRjX3VubG9ja2VkKHN0cmVhbSkKKyMgdW5kZWYgIGZwdXRjCisjIGRlZmluZSBmcHV0YyhjLCBzdHJlYW0pIHB1dGNfdW5sb2NrZWQoYywgc3RyZWFtKQorI2VuZGlmCisvKiBBYm92ZSBmdW5jdGlvbnMgYXJlIHJlcXVpcmVkIGJ5IFBPU0lYLjEtMjAwOCwgYmVsb3cgb25lcyBhcmUgZXh0ZW5zaW9ucyAqLworI2lmZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyMgdW5kZWYgIGZnZXRzCisjIGRlZmluZSBmZ2V0cyhzLCBuLCBzdHJlYW0pIGZnZXRzX3VubG9ja2VkKHMsIG4sIHN0cmVhbSkKKyMgdW5kZWYgIGZwdXRzCisjIGRlZmluZSBmcHV0cyhzLCBzdHJlYW0pIGZwdXRzX3VubG9ja2VkKHMsIHN0cmVhbSkKKyNlbmRpZgorCisKKy8qIE1ha2UgYWxsIGRlY2xhcmF0aW9ucyBoaWRkZW4gKC1mdmlzaWJpbGl0eSBmbGFnIG9ubHkgYWZmZWN0cyBkZWZpbml0aW9ucykgKi8KKy8qIChkb24ndCBpbmNsdWRlIHN5c3RlbSBoZWFkZXJzIGFmdGVyIHRoaXMgdW50aWwgY29ycmVzcG9uZGluZyBwb3AhKSAqLworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKworI2lmIEVOQUJMRV9VU0VfQkJfUFdEX0dSUAorIyBpbmNsdWRlICJwd2RfLmgiCisjIGluY2x1ZGUgImdycF8uaCIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKyMgaWYgRU5BQkxFX1VTRV9CQl9TSEFET1cKKyMgIGluY2x1ZGUgInNoYWRvd18uaCIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBUZXN0ZWQgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBhbGwgaW50IHR5cGVzIChJSVJDIDpdKSAqLworI2RlZmluZSBNQVhJTlQoVCkgKFQpKCBcCisJKChUKS0xKSA+IDAgXAorCT8gKFQpLTEgXAorCTogKFQpfigoVCkxIDw8IChzaXplb2YoVCkqOC0xKSkgXAorCSkKKworI2RlZmluZSBNSU5JTlQoVCkgKFQpKCBcCisJKChUKS0xKSA+IDAgXAorCT8gKFQpMCBcCisJOiAoKFQpMSA8PCAoc2l6ZW9mKFQpKjgtMSkpIFwKKwkpCisKKy8qIExhcmdlIGZpbGUgc3VwcG9ydCAqLworLyogTm90ZSB0aGF0IENPTkZJR19MRlM9eSBmb3JjZXMgYmJveCB0byBiZSBidWlsdCB3aXRoIGFsbCBjb21tb24gb3BzCisgKiAoc3RhdCwgbHNlZWsgZXRjKSBtYXBwZWQgdG8gImxhcmdlZmlsZSIgdmFyaWFudHMgYnkgbGliYy4KKyAqIFByYWN0aWNhbGx5IGl0IG1lYW5zIHRoYXQgb3BlbigpIGF1dG9tYXRpY2FsbHkgaGFzIE9fTEFSR0VGSUxFIGFkZGVkCisgKiBhbmQgYWxsIGZpbGVzaXplL2ZpbGVfb2Zmc2V0IHBhcmFtZXRlcnMgYW5kIHN0cnVjdCBtZW1iZXJzIGFyZSAibGFyZ2UiCisgKiAoaW4gdG9kYXkncyB3b3JsZCAtIHNpZ25lZCA2NGJpdCkuIEZvciBmdWxsIHN1cHBvcnQgb2YgbGFyZ2UgZmlsZXMsCisgKiB3ZSBuZWVkIGEgZmV3IGhlbHBlciAjZGVmaW5lcyAoYmVsb3cpIGFuZCBjYXJlZnVsIHVzZSBvZiBvZmZfdAorICogaW5zdGVhZCBvZiBpbnQvc3NpemVfdC4gTm8gbHNlZWs2NCgpLCBPX0xBUkdFRklMRSBldGMgbmVjZXNzYXJ5ICovCisjaWYgRU5BQkxFX0xGUworLyogQ09ORklHX0xGUyBpcyBvbiAqLworIyBpZiBVTE9OR19NQVggPiAweGZmZmZmZmZmCisvKiAibG9uZyIgaXMgbG9uZyBlbm91Z2ggb24gdGhpcyBzeXN0ZW0gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1b2ZmX3Q7CisjICBkZWZpbmUgWEFUT09GRihhKSB4YXRvdWxfcmFuZ2UoYSwgMCwgTE9OR19NQVgpCisvKiB1c2FnZTogc3ogPSBCQl9TVFJUT09GRihzLCBOVUxMLCAxMCk7IGlmIChlcnJubyB8fCBzeiA8IDApIGRpZSgpOyAqLworIyAgZGVmaW5lIEJCX1NUUlRPT0ZGIGJiX3N0cnRvdWwKKyMgIGRlZmluZSBTVFJUT09GRiBzdHJ0b3VsCisvKiB1c2FnZTogcHJpbnRmKCJzaXplOiAlIk9GRl9GTVQiZCAoJSJPRkZfRk1UIngpXG4iLCBzeiwgc3opOyAqLworIyAgZGVmaW5lIE9GRl9GTVQgImwiCisjIGVsc2UKKy8qICJsb25nIiBpcyB0b28gc2hvcnQsIG5lZWQgImxvbmcgbG9uZyIgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVvZmZfdDsKKyMgIGRlZmluZSBYQVRPT0ZGKGEpIHhhdG91bGxfcmFuZ2UoYSwgMCwgTExPTkdfTUFYKQorIyAgZGVmaW5lIEJCX1NUUlRPT0ZGIGJiX3N0cnRvdWxsCisjICBkZWZpbmUgU1RSVE9PRkYgc3RydG91bGwKKyMgIGRlZmluZSBPRkZfRk1UICJsbCIKKyMgZW5kaWYKKyNlbHNlCisvKiBDT05GSUdfTEZTIGlzIG9mZiAqLworIyBpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCisvKiBXaGlsZSBzaXplb2Yob2ZmX3QpID09IHNpemVvZihpbnQpLCBvZmZfdCBpcyB0eXBlZGVmJ2VkIHRvIGxvbmcgYW55d2F5LgorICogZ2NjIHdpbGwgdGhyb3cgd2FybmluZ3Mgb24gcHJpbnRmKCIlZCIsIG9mZl90KS4gQ3JhcC4uLiAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVvZmZfdDsKKyMgIGRlZmluZSBYQVRPT0ZGKGEpIHhhdG9pX3Bvc2l0aXZlKGEpCisjICBkZWZpbmUgQkJfU1RSVE9PRkYgYmJfc3RydG91CisjICBkZWZpbmUgU1RSVE9PRkYgc3RydG9sCisjICBkZWZpbmUgT0ZGX0ZNVCAibCIKKyMgZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVvZmZfdDsKKyMgIGRlZmluZSBYQVRPT0ZGKGEpIHhhdG91bF9yYW5nZShhLCAwLCBMT05HX01BWCkKKyMgIGRlZmluZSBCQl9TVFJUT09GRiBiYl9zdHJ0b3VsCisjICBkZWZpbmUgU1RSVE9PRkYgc3RydG9sCisjICBkZWZpbmUgT0ZGX0ZNVCAibCIKKyMgZW5kaWYKKyNlbmRpZgorLyogc2NhcnkuIGJldHRlciBpZGVhcz8gKGJ1dCBkbyAqdGVzdCogdGhlbSBmaXJzdCEpICovCisjZGVmaW5lIE9GRl9UX01BWCAgKChvZmZfdCl+KChvZmZfdCkxIDw8IChzaXplb2Yob2ZmX3QpKjgtMSkpKQorCisvKiBTb21lIHVzZWZ1bCBkZWZpbml0aW9ucyAqLworI3VuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgKChpbnQpIDApCisjdW5kZWYgVFJVRQorI2RlZmluZSBUUlVFICAgICgoaW50KSAxKQorI3VuZGVmIFNLSVAKKyNkZWZpbmUgU0tJUAkoKGludCkgMikKKworLyogZm9yIG10YWIuYyAqLworI2RlZmluZSBNVEFCX0dFVE1PVU5UUFQgJzEnCisjZGVmaW5lIE1UQUJfR0VUREVWSUNFICAnMicKKworI2RlZmluZSBCVUZfU0laRSAgICAgICAgODE5MgorI2RlZmluZSBFWFBBTkRfQUxMT0MgICAgMTAyNAorCisvKiBNYWNyb3MgZm9yIG1pbi9tYXguICAqLworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsYikgKCgoYSk8KGIpKT8oYSk6KGIpKQorI2VuZGlmCisKKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWChhLGIpICgoKGEpPihiKSk/KGEpOihiKSkKKyNlbmRpZgorCisvKiBidWZmZXIgYWxsb2NhdGlvbiBzY2hlbWVzICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfQlVGRkVSU19HT19PTl9TVEFDSworI2RlZmluZSBSRVNFUlZFX0NPTkZJR19CVUZGRVIoYnVmZmVyLGxlbikgIGNoYXIgYnVmZmVyW2xlbl0KKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfVUJVRkZFUihidWZmZXIsbGVuKSB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltsZW5dCisjZGVmaW5lIFJFTEVBU0VfQ09ORklHX0JVRkZFUihidWZmZXIpICAgICAgKCh2b2lkKTApCisjZWxzZQorI2lmIEVOQUJMRV9GRUFUVVJFX0JVRkZFUlNfR09fSU5fQlNTCisjZGVmaW5lIFJFU0VSVkVfQ09ORklHX0JVRkZFUihidWZmZXIsbGVuKSAgc3RhdGljICAgICAgICAgIGNoYXIgYnVmZmVyW2xlbl0KKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfVUJVRkZFUihidWZmZXIsbGVuKSBzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJbbGVuXQorI2RlZmluZSBSRUxFQVNFX0NPTkZJR19CVUZGRVIoYnVmZmVyKSAgICAgICgodm9pZCkwKQorI2Vsc2UKKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfQlVGRkVSKGJ1ZmZlcixsZW4pICBjaGFyICpidWZmZXIgPSB4bWFsbG9jKGxlbikKKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfVUJVRkZFUihidWZmZXIsbGVuKSB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSB4bWFsbG9jKGxlbikKKyNkZWZpbmUgUkVMRUFTRV9DT05GSUdfQlVGRkVSKGJ1ZmZlcikgICAgICBmcmVlKGJ1ZmZlcikKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykKKy8qIGdsaWJjIHVzZXMgX19lcnJub19sb2NhdGlvbigpIHRvIGdldCBhIHB0ciB0byBlcnJubyAqLworLyogV2UgY2FuIGp1c3QgbWVtb3JpemUgaXQgb25jZSAtIG5vIG11bHRpdGhyZWFkaW5nIGluIGJ1c3lib3ggOikgKi8KK2V4dGVybiBpbnQgKmNvbnN0IGJiX2Vycm5vOworI3VuZGVmIGVycm5vCisjZGVmaW5lIGVycm5vICgqYmJfZXJybm8pCisjZW5kaWYKKworI2lmICEoVUxPTkdfTUFYID4gMHhmZmZmZmZmZikKKy8qIE9ubHkgMzItYml0IENQVXMgbmVlZCB0aGlzLCA2NC1iaXQgb25lcyB1c2UgaW5saW5lZCB2ZXJzaW9uICovCit1aW50NjRfdCBiYl9ic3dhcF82NCh1aW50NjRfdCB4KSBGQVNUX0ZVTkM7CisjZW5kaWYKKwordW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19ucyh2b2lkKSBGQVNUX0ZVTkM7Cit1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX3VzKHZvaWQpIEZBU1RfRlVOQzsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfbXModm9pZCkgRkFTVF9GVU5DOwordW5zaWduZWQgbW9ub3RvbmljX3NlYyh2b2lkKSBGQVNUX0ZVTkM7CisKK2V4dGVybiB2b2lkIGNob21wKGNoYXIgKnMpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHRyaW0oY2hhciAqcykgRkFTVF9GVU5DOworZXh0ZXJuIGNoYXIgKnNraXBfd2hpdGVzcGFjZShjb25zdCBjaGFyICopIEZBU1RfRlVOQzsKK2V4dGVybiBjaGFyICpza2lwX25vbl93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DOworZXh0ZXJuIGNoYXIgKnNraXBfZGV2X3BmeChjb25zdCBjaGFyICp0dHlfbmFtZSkgRkFTVF9GVU5DOworCitleHRlcm4gY2hhciAqc3RycnN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKSBGQVNUX0ZVTkM7CisKKy8vVE9ETzogc3VwcGx5IGEgcG9pbnRlciB0byBjaGFyWzExXSBidWZmZXIgKGF2b2lkIHN0YXRpY3MpPworZXh0ZXJuIGNvbnN0IGNoYXIgKmJiX21vZGVfc3RyaW5nKG1vZGVfdCBtb2RlKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGlzX2RpcmVjdG9yeShjb25zdCBjaGFyICpuYW1lLCBpbnQgZm9sbG93TGlua3MsIHN0cnVjdCBzdGF0ICpzdGF0QnVmKSBGQVNUX0ZVTkM7CitlbnVtIHsJLyogRE8gTk9UIENIQU5HRSBUSEVTRSBWQUxVRVMhICBjcC5jLCBtdi5jLCBpbnN0YWxsLmMgZGVwZW5kIG9uIHRoZW0uICovCisJRklMRVVUSUxTX1BSRVNFUlZFX1NUQVRVUyA9IDEgPDwgMCwgLyogLXAgKi8KKwlGSUxFVVRJTFNfREVSRUZFUkVOQ0UgICAgID0gMSA8PCAxLCAvKiAhLWQgKi8KKwlGSUxFVVRJTFNfUkVDVVIgICAgICAgICAgID0gMSA8PCAyLCAvKiAtUiAqLworCUZJTEVVVElMU19GT1JDRSAgICAgICAgICAgPSAxIDw8IDMsIC8qIC1mICovCisJRklMRVVUSUxTX0lOVEVSQUNUSVZFICAgICA9IDEgPDwgNCwgLyogLWkgKi8KKwlGSUxFVVRJTFNfTUFLRV9IQVJETElOSyAgID0gMSA8PCA1LCAvKiAtbCAqLworCUZJTEVVVElMU19NQUtFX1NPRlRMSU5LICAgPSAxIDw8IDYsIC8qIC1zICovCisJRklMRVVUSUxTX0RFUkVGX1NPRlRMSU5LICA9IDEgPDwgNywgLyogLUwgKi8KKwlGSUxFVVRJTFNfREVSRUZFUkVOQ0VfTDAgID0gMSA8PCA4LCAvKiAtSCAqLworI2lmIEVOQUJMRV9TRUxJTlVYCisJRklMRVVUSUxTX1BSRVNFUlZFX1NFQ1VSSVRZX0NPTlRFWFQgPSAxIDw8IDksIC8qIC1jICovCisJRklMRVVUSUxTX1NFVF9TRUNVUklUWV9DT05URVhUID0gMSA8PCAxMCwKKyNlbmRpZgorfTsKKyNkZWZpbmUgRklMRVVUSUxTX0NQX09QVFNUUiAicGRSZmlsc0xIIiBJRl9TRUxJTlVYKCJjIikKK2V4dGVybiBpbnQgcmVtb3ZlX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgaW50IGZsYWdzKSBGQVNUX0ZVTkM7CisvKiBOQjogd2l0aG91dCBGSUxFVVRJTFNfUkVDVVIgaW4gZmxhZ3MsIGl0IHdpbGwgYmFzaWNhbGx5ICJjYXQiCisgKiB0aGUgc291cmNlLCBub3QgY29weSAodW5sZXNzICJzb3VyY2UiIGlzIGEgZGlyZWN0b3J5KS4KKyAqIFRoaXMgbWFrZXMgImNwIC9kZXYvbnVsbCBmaWxlIiBhbmQgImluc3RhbGwgL2Rldi9udWxsIGZpbGUiICghISEpCisgKiB3b3JrIGNvcmV1dGlscy1jb21wYXRpYmx5LiAqLworZXh0ZXJuIGludCBjb3B5X2ZpbGUoY29uc3QgY2hhciAqc291cmNlLCBjb25zdCBjaGFyICpkZXN0LCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKKworZW51bSB7CisJQUNUSU9OX1JFQ1VSU0UgICAgICAgID0gKDEgPDwgMCksCisJQUNUSU9OX0ZPTExPV0xJTktTICAgID0gKDEgPDwgMSksCisJQUNUSU9OX0ZPTExPV0xJTktTX0wwID0gKDEgPDwgMiksCisJQUNUSU9OX0RFUFRIRklSU1QgICAgID0gKDEgPDwgMyksCisJLypBQ1RJT05fUkVWRVJTRSAgICAgID0gKDEgPDwgNCksIC0gdW51c2VkICovCisJQUNUSU9OX1FVSUVUICAgICAgICAgID0gKDEgPDwgNSksCisJQUNUSU9OX0RBTkdMSU5HX09LICAgID0gKDEgPDwgNiksCit9OwordHlwZWRlZiB1aW50OF90IHJlY3Vyc2VfZmxhZ3NfdDsKK2V4dGVybiBpbnQgcmVjdXJzaXZlX2FjdGlvbihjb25zdCBjaGFyICpmaWxlTmFtZSwgdW5zaWduZWQgZmxhZ3MsCisJaW50IEZBU1RfRlVOQyAoKmZpbGVBY3Rpb24pKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBzdHJ1Y3Qgc3RhdCogc3RhdGJ1Ziwgdm9pZCogdXNlckRhdGEsIGludCBkZXB0aCksCisJaW50IEZBU1RfRlVOQyAoKmRpckFjdGlvbikoY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0KiBzdGF0YnVmLCB2b2lkKiB1c2VyRGF0YSwgaW50IGRlcHRoKSwKKwl2b2lkKiB1c2VyRGF0YSwgdW5zaWduZWQgZGVwdGgpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgZGV2aWNlX29wZW4oY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgbW9kZSkgRkFTVF9GVU5DOworZW51bSB7IEdFVFBUWV9CVUZTSVpFID0gMTYgfTsgLyogbW9yZSB0aGFuIGVub3VnaCBmb3IgIi9kZXYvdHR5WFhYIiAqLworZXh0ZXJuIGludCB4Z2V0cHR5KGNoYXIgKmxpbmUpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgZ2V0X2NvbnNvbGVfZmRfb3JfZGllKHZvaWQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGNvbnNvbGVfbWFrZV9hY3RpdmUoaW50IGZkLCBjb25zdCBpbnQgdnRfbnVtKSBGQVNUX0ZVTkM7CitleHRlcm4gY2hhciAqZmluZF9ibG9ja19kZXZpY2UoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworLyogYmJfY29weWZkX1hYIHByaW50IHJlYWQvd3JpdGUgZXJyb3JzIGFuZCByZXR1cm4gLTEgaWYgdGhleSBvY2N1ciAqLworZXh0ZXJuIG9mZl90IGJiX2NvcHlmZF9lb2YoaW50IGZkMSwgaW50IGZkMikgRkFTVF9GVU5DOworZXh0ZXJuIG9mZl90IGJiX2NvcHlmZF9zaXplKGludCBmZDEsIGludCBmZDIsIG9mZl90IHNpemUpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2NvcHlmZF9leGFjdF9zaXplKGludCBmZDEsIGludCBmZDIsIG9mZl90IHNpemUpIEZBU1RfRlVOQzsKKy8qICJzaG9ydCIgY29weSBjYW4gYmUgZGV0ZWN0ZWQgYnkgcmV0dXJuIHZhbHVlIDwgc2l6ZSAqLworLyogdGhpcyBoZWxwZXIgeWVsbHMgInNob3J0IHJlYWQhIiBpZiBwYXJhbSBpcyBub3QgLTEgKi8KK2V4dGVybiB2b2lkIGNvbXBsYWluX2NvcHlmZF9hbmRfZGllKG9mZl90IHN6KSBOT1JFVFVSTiBGQVNUX0ZVTkM7CisKK2V4dGVybiBjaGFyIGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKGNvbnN0IGNoYXIgKipwdHIpIEZBU1RfRlVOQzsKK2NoYXIqIHN0cmNweV9hbmRfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2VzKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKSBGQVNUX0ZVTkM7CisvKiB4eHh4X3N0cmlwIHZlcnNpb24gY2FuIG1vZGlmeSBpdHMgcGFyYW1ldGVyOgorICogIi8iICAgICAgICAtPiAiLyIKKyAqICJhYmMiICAgICAgLT4gImFiYyIKKyAqICJhYmMvZGVmIiAgLT4gImRlZiIKKyAqICJhYmMvZGVmLyIgLT4gImRlZiIgISEKKyAqLworY2hhciAqYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoY2hhciAqcGF0aCkgRkFTVF9GVU5DOworLyogImFiYy9kZWYvIiAtPiAiIiBhbmQgaXQgbmV2ZXIgbW9kaWZpZXMgJ3BhdGgnICovCitjaGFyICpiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKKy8qIFNpbXBsZXIgdmVyc2lvbjogZG9lcyBub3Qgc3BlY2lhbCBjYXNlICIvIiBzdHJpbmcgKi8KK2NvbnN0IGNoYXIgKmJiX2Jhc2VuYW1lKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKKy8qIE5COiBjYW4gdmlvbGF0ZSBjb25zdC1uZXNzIChzaW1pbGFybHkgdG8gc3RyY2hyKSAqLworY2hhciAqbGFzdF9jaGFyX2lzKGNvbnN0IGNoYXIgKnMsIGludCBjKSBGQVNUX0ZVTkM7CisKK3ZvaWQgbmRlbGF5X29uKGludCBmZCkgRkFTVF9GVU5DOwordm9pZCBuZGVsYXlfb2ZmKGludCBmZCkgRkFTVF9GVU5DOwordm9pZCBjbG9zZV9vbl9leGVjX29uKGludCBmZCkgRkFTVF9GVU5DOwordm9pZCB4ZHVwMihpbnQsIGludCkgRkFTVF9GVU5DOwordm9pZCB4bW92ZV9mZChpbnQsIGludCkgRkFTVF9GVU5DOworCisKK0RJUiAqeG9wZW5kaXIoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworRElSICp3YXJuX29wZW5kaXIoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworCitjaGFyICp4bWFsbG9jX3JlYWxwYXRoKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK2NoYXIgKnhtYWxsb2NfcmVhZGxpbmsoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworY2hhciAqeG1hbGxvY19yZWFkbGlua19vcl93YXJuKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qICFSRVRVUk5TX01BTExPQzogaXQncyBhIHJlYWxsb2MtbGlrZSBmdW5jdGlvbiAqLworY2hhciAqeHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oY2hhciAqY3dkKSBGQVNUX0ZVTkM7CisKK2NoYXIgKnhtYWxsb2NfZm9sbG93X3N5bWxpbmtzKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKworCitlbnVtIHsKKwkvKiBiYl9zaWduYWxzKEJCX0ZBVEFMX1NJR1MsIGhhbmRsZXIpIGNhdGNoZXMgYWxsIHNpZ25hbHMgd2hpY2gKKwkgKiBvdGhlcndpc2Ugd291bGQga2lsbCB1cywgZXhjZXB0IGZvciB0aG9zZSByZXN1bHRpbmcgZnJvbSBidWdzOgorCSAqIFNJR1NFR1YsIFNJR0lMTCwgU0lHRlBFLgorCSAqIE90aGVyIGZhdGFsIHNpZ25hbHMgbm90IGluY2x1ZGVkIChUT0RPPyk6CisJICogU0lHQlVTICAgQnVzIGVycm9yIChiYWQgbWVtb3J5IGFjY2VzcykKKwkgKiBTSUdQT0xMICBQb2xsYWJsZSBldmVudC4gU3lub255bSBvZiBTSUdJTworCSAqIFNJR1BST0YgIFByb2ZpbGluZyB0aW1lciBleHBpcmVkCisJICogU0lHU1lTICAgQmFkIGFyZ3VtZW50IHRvIHJvdXRpbmUKKwkgKiBTSUdUUkFQICBUcmFjZS9icmVha3BvaW50IHRyYXAKKwkgKgorCSAqIFRoZSBvbmx5IGtub3duIGFyY2ggd2l0aCBzb21lIG9mIHRoZXNlIHNpZ3Mgbm90IGZpdHRpbmcKKwkgKiBpbnRvIDMyIGJpdHMgaXMgcGFyaXNjIChTSUdYQ1BVPTMzLCBTSUdYRlNaPTM0LCBTSUdTVEtGTFQ9MzYpLgorCSAqIERhbmNlIGFyb3VuZCB3aXRoIGxvbmcgbG9uZyB0byBndWFyZCBhZ2FpbnN0IHRoYXQuLi4KKwkgKi8KKwlCQl9GQVRBTF9TSUdTID0gKGludCkoMAorCQkrICgxTEwgPDwgU0lHSFVQKQorCQkrICgxTEwgPDwgU0lHSU5UKQorCQkrICgxTEwgPDwgU0lHVEVSTSkKKwkJKyAoMUxMIDw8IFNJR1BJUEUpICAgLy8gV3JpdGUgdG8gcGlwZSB3aXRoIG5vIHJlYWRlcnMKKwkJKyAoMUxMIDw8IFNJR1FVSVQpICAgLy8gUXVpdCBmcm9tIGtleWJvYXJkCisJCSsgKDFMTCA8PCBTSUdBQlJUKSAgIC8vIEFib3J0IHNpZ25hbCBmcm9tIGFib3J0KDMpCisJCSsgKDFMTCA8PCBTSUdBTFJNKSAgIC8vIFRpbWVyIHNpZ25hbCBmcm9tIGFsYXJtKDIpCisJCSsgKDFMTCA8PCBTSUdWVEFMUk0pIC8vIFZpcnR1YWwgYWxhcm0gY2xvY2sKKwkJKyAoMUxMIDw8IFNJR1hDUFUpICAgLy8gQ1BVIHRpbWUgbGltaXQgZXhjZWVkZWQKKwkJKyAoMUxMIDw8IFNJR1hGU1opICAgLy8gRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkCisJCSsgKDFMTCA8PCBTSUdVU1IxKSAgIC8vIFllcyBraWRzLCB0aGVzZSBhcmUgYWxzbyBmYXRhbCEKKwkJKyAoMUxMIDw8IFNJR1VTUjIpCisJCSsgMCksCit9Owordm9pZCBiYl9zaWduYWxzKGludCBzaWdzLCB2b2lkICgqZikoaW50KSkgRkFTVF9GVU5DOworLyogVW5saWtlIHNpZ25hbCgpIGFuZCBiYl9zaWduYWxzLCBzZXRzIGhhbmRsZXIgd2l0aCBzaWdhY3Rpb24oKQorICogYW5kIGluIGEgd2F5IHRoYXQgd2hpbGUgc2lnbmFsIGhhbmRsZXIgaXMgcnVuLCBubyBvdGhlciBzaWduYWxzCisgKiB3aWxsIGJlIGJsb2NrZWQ7IHN5c2NhbGxzIHdpbGwgbm90IGJlIHJlc3RhcnRlZDogKi8KK3ZvaWQgYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KGludCBzaWdzLCB2b2lkICgqZikoaW50KSkgRkFTVF9GVU5DOworLyogc3lzY2FsbHMgbGlrZSByZWFkKCkgd2lsbCBiZSBpbnRlcnJ1cHRlZCB3aXRoIEVJTlRSOiAqLwordm9pZCBzaWduYWxfbm9fU0FfUkVTVEFSVF9lbXB0eV9tYXNrKGludCBzaWcsIHZvaWQgKCpoYW5kbGVyKShpbnQpKSBGQVNUX0ZVTkM7CisvKiBzeXNjYWxscyBsaWtlIHJlYWQoKSB3b24ndCBiZSBpbnRlcnJ1cHRlZCAodGhvdWdoIHNlbGVjdC9wb2xsIHdpbGwgYmUpOiAqLwordm9pZCBzaWduYWxfU0FfUkVTVEFSVF9lbXB0eV9tYXNrKGludCBzaWcsIHZvaWQgKCpoYW5kbGVyKShpbnQpKSBGQVNUX0ZVTkM7Cit2b2lkIHdhaXRfZm9yX2FueV9zaWcodm9pZCkgRkFTVF9GVU5DOwordm9pZCBraWxsX215c2VsZl93aXRoX3NpZyhpbnQgc2lnKSBOT1JFVFVSTiBGQVNUX0ZVTkM7Cit2b2lkIHNpZ19ibG9jayhpbnQgc2lnKSBGQVNUX0ZVTkM7Cit2b2lkIHNpZ191bmJsb2NrKGludCBzaWcpIEZBU1RfRlVOQzsKKy8qIFdpbGwgZG8gc2lnYWN0aW9uKHNpZ251bSwgYWN0LCBOVUxMKTogKi8KK2ludCBzaWdhY3Rpb25fc2V0KGludCBzaWcsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCkgRkFTVF9GVU5DOworLyogU0lHX0JMT0NLL1NJR19VTkJMT0NLIGFsbCBzaWduYWxzOiAqLworaW50IHNpZ3Byb2NtYXNrX2FsbHNpZ3MoaW50IGhvdykgRkFTVF9GVU5DOworLyogU3RhbmRhcmQgaGFuZGxlciB3aGljaCBqdXN0IHJlY29yZHMgc2lnbm8gKi8KK2V4dGVybiBzbWFsbGludCBiYl9nb3Rfc2lnbmFsOwordm9pZCByZWNvcmRfc2lnbm8oaW50IHNpZ25vKTsgLyogbm90IEZBU1RfRlVOQyEgKi8KKworCit2b2lkIHhzZXRnaWQoZ2lkX3QgZ2lkKSBGQVNUX0ZVTkM7Cit2b2lkIHhzZXR1aWQodWlkX3QgdWlkKSBGQVNUX0ZVTkM7Cit2b2lkIHhjaGRpcihjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7Cit2b2lkIHhjaHJvb3QoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOwordm9pZCB4c2V0ZW52KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpIEZBU1RfRlVOQzsKK3ZvaWQgYmJfdW5zZXRlbnYoY29uc3QgY2hhciAqa2V5KSBGQVNUX0ZVTkM7Cit2b2lkIGJiX3Vuc2V0ZW52X2FuZF9mcmVlKGNoYXIgKmtleSkgRkFTVF9GVU5DOwordm9pZCB4dW5saW5rKGNvbnN0IGNoYXIgKnBhdGhuYW1lKSBGQVNUX0ZVTkM7Cit2b2lkIHhzdGF0KGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBzdHJ1Y3Qgc3RhdCAqYnVmKSBGQVNUX0ZVTkM7Cit2b2lkIHhmc3RhdChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYsIGNvbnN0IGNoYXIgKmVycm1zZykgRkFTVF9GVU5DOworaW50IHhvcGVuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKK2ludCB4b3Blbl9ub25ibG9ja2luZyhjb25zdCBjaGFyICpwYXRobmFtZSkgRkFTVF9GVU5DOworaW50IHhvcGVuMyhjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkgRkFTVF9GVU5DOworaW50IG9wZW5fb3Jfd2Fybihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzKSBGQVNUX0ZVTkM7CitpbnQgb3BlbjNfb3Jfd2Fybihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkgRkFTVF9GVU5DOworaW50IG9wZW5fb3Jfd2Fybl9zdGRpbihjb25zdCBjaGFyICpwYXRobmFtZSkgRkFTVF9GVU5DOworaW50IHhvcGVuX3N0ZGluKGNvbnN0IGNoYXIgKnBhdGhuYW1lKSBGQVNUX0ZVTkM7Cit2b2lkIHhyZW5hbWUoY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCkgRkFTVF9GVU5DOworaW50IHJlbmFtZV9vcl93YXJuKGNvbnN0IGNoYXIgKm9sZHBhdGgsIGNvbnN0IGNoYXIgKm5ld3BhdGgpIEZBU1RfRlVOQzsKK29mZl90IHhsc2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgRkFTVF9GVU5DOworaW50IHhta3N0ZW1wKGNoYXIgKnRlbXBsYXRlKSBGQVNUX0ZVTkM7CitvZmZfdCBmZGxlbmd0aChpbnQgZmQpIEZBU1RfRlVOQzsKKwordW9mZl90IEZBU1RfRlVOQyBnZXRfdm9sdW1lX3NpemVfaW5fYnl0ZXMoaW50IGZkLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm92ZXJyaWRlLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIG92ZXJyaWRlX3VuaXRzLAorICAgICAgICAgICAgICAgIGludCBleHRlbmQpOworCit2b2lkIHhwaXBlKGludCBmaWxlZGVzWzJdKSBGQVNUX0ZVTkM7CisvKiBJbiB0aGlzIGZvcm0gY29kZSB3aXRoIHBpcGVzIGlzIG11Y2ggbW9yZSByZWFkYWJsZSAqLworc3RydWN0IGZkX3BhaXIgeyBpbnQgcmQ7IGludCB3cjsgfTsKKyNkZWZpbmUgcGlwZWRfcGFpcihwYWlyKSAgcGlwZSgmKChwYWlyKS5yZCkpCisjZGVmaW5lIHhwaXBlZF9wYWlyKHBhaXIpIHhwaXBlKCYoKHBhaXIpLnJkKSkKKworLyogVXNlZnVsIGZvciBoYXZpbmcgc21hbGwgc3RydWN0dXJlIG1lbWJlcnMvZ2xvYmFsIHZhcmlhYmxlcyAqLwordHlwZWRlZiBpbnQ4X3Qgc29ja3R5cGVfdDsKK3R5cGVkZWYgaW50OF90IGZhbWlseV90Oworc3RydWN0IEJVR190b29fc21hbGwgeworCWNoYXIgQlVHX3NvY2t0eXBlX3RfdG9vX3NtYWxsWygwCisJCQl8IFNPQ0tfU1RSRUFNCisJCQl8IFNPQ0tfREdSQU0KKwkJCXwgU09DS19SRE0KKwkJCXwgU09DS19TRVFQQUNLRVQKKwkJCXwgU09DS19SQVcKKwkJCSkgPD0gMTI3ID8gMSA6IC0xXTsKKwljaGFyIEJVR19mYW1pbHlfdF90b29fc21hbGxbKDAKKwkJCXwgQUZfVU5TUEVDCisJCQl8IEFGX0lORVQKKwkJCXwgQUZfSU5FVDYKKwkJCXwgQUZfVU5JWAorI2lmZGVmIEFGX1BBQ0tFVAorCQkJfCBBRl9QQUNLRVQKKyNlbmRpZgorI2lmZGVmIEFGX05FVExJTksKKwkJCXwgQUZfTkVUTElOSworI2VuZGlmCisJCQkvKiB8IEFGX0RFQ25ldCAqLworCQkJLyogfCBBRl9JUFggKi8KKwkJCSkgPD0gMTI3ID8gMSA6IC0xXTsKK307CisKKwordm9pZCBwYXJzZV9kYXRlc3RyKGNvbnN0IGNoYXIgKmRhdGVfc3RyLCBzdHJ1Y3QgdG0gKnB0bSkgRkFTVF9GVU5DOwordGltZV90IHZhbGlkYXRlX3RtX3RpbWUoY29uc3QgY2hhciAqZGF0ZV9zdHIsIHN0cnVjdCB0bSAqcHRtKSBGQVNUX0ZVTkM7CisKKworaW50IHhzb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkgRkFTVF9GVU5DOwordm9pZCB4YmluZChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKm15X2FkZHIsIHNvY2tsZW5fdCBhZGRybGVuKSBGQVNUX0ZVTkM7Cit2b2lkIHhsaXN0ZW4oaW50IHMsIGludCBiYWNrbG9nKSBGQVNUX0ZVTkM7Cit2b2lkIHhjb25uZWN0KGludCBzLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNfYWRkciwgc29ja2xlbl90IGFkZHJsZW4pIEZBU1RfRlVOQzsKK3NzaXplX3QgeHNlbmR0byhpbnQgcywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLAorCQkJCXNvY2tsZW5fdCB0b2xlbikgRkFTVF9GVU5DOworLyogU09fUkVVU0VBRERSIGFsbG93cyBhIHNlcnZlciB0byByZWJpbmQgdG8gYW4gYWRkcmVzcyB0aGF0IGlzIGFscmVhZHkKKyAqICJpbiB1c2UiIGJ5IG9sZCBjb25uZWN0aW9ucyB0byBlLmcuIHByZXZpb3VzIHNlcnZlciBpbnN0YW5jZSB3aGljaCBpcworICoga2lsbGVkIG9yIGNyYXNoZWQuIFdpdGhvdXQgaXQgYmluZCB3aWxsIGZhaWwgdW50aWwgYWxsIHN1Y2ggY29ubmVjdGlvbnMKKyAqIHRpbWUgb3V0LiBMaW51eCBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSBsaXZlIGJpbmRzIG9uIHNhbWUgaXA6cG9ydAorICogcmVnYXJkbGVzcyBvZiBTT19SRVVTRUFERFIgKHVubGlrZSBzb21lIG90aGVyIGZsYXZvcnMgb2YgVW5peCkuCisgKiBUdXJuIGl0IG9uIGJlZm9yZSB5b3UgY2FsbCBiaW5kKCkuICovCit2b2lkIHNldHNvY2tvcHRfcmV1c2VhZGRyKGludCBmZCkgRkFTVF9GVU5DOyAvKiBPbiBMaW51eCB0aGlzIG5ldmVyIGZhaWxzLiAqLworaW50IHNldHNvY2tvcHRfYnJvYWRjYXN0KGludCBmZCkgRkFTVF9GVU5DOworaW50IHNldHNvY2tvcHRfYmluZHRvZGV2aWNlKGludCBmZCwgY29uc3QgY2hhciAqaWZhY2UpIEZBU1RfRlVOQzsKKy8qIE5COiByZXR1cm5zIHBvcnQgaW4gaG9zdCBieXRlIG9yZGVyICovCit1bnNpZ25lZCBiYl9sb29rdXBfcG9ydChjb25zdCBjaGFyICpwb3J0LCBjb25zdCBjaGFyICpwcm90b2NvbCwgdW5zaWduZWQgZGVmYXVsdF9wb3J0KSBGQVNUX0ZVTkM7Cit0eXBlZGVmIHN0cnVjdCBsZW5fYW5kX3NvY2thZGRyIHsKKwlzb2NrbGVuX3QgbGVuOworCXVuaW9uIHsKKwkJc3RydWN0IHNvY2thZGRyIHNhOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OworI2VuZGlmCisJfSB1OworfSBsZW5fYW5kX3NvY2thZGRyOworZW51bSB7CisJTFNBX0xFTl9TSVpFID0gb2Zmc2V0b2YobGVuX2FuZF9zb2NrYWRkciwgdSksCisJTFNBX1NJWkVPRl9TQSA9IHNpemVvZigKKwkJdW5pb24geworCQkJc3RydWN0IHNvY2thZGRyIHNhOworCQkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjY7CisjZW5kaWYKKwkJfQorCSkKK307CisvKiBDcmVhdGUgc3RyZWFtIHNvY2tldCwgYW5kIGFsbG9jYXRlIHN1aXRhYmxlIGxzYS4KKyAqIChsc2Egb2YgY29ycmVjdCBzaXplIGFuZCBsc2EtPnNhLnNhX2ZhbWlseSAoQUZfSU5FVC9BRl9JTkVUNikpCisgKiBhZiA9PSBBRl9VTlNQRUMgd2lsbCByZXN1bHQgaW4gdHJ5aW5nIHRvIGNyZWF0ZSBJUHY2IHNvY2tldCwKKyAqIGFuZCBpZiBrZXJuZWwgZG9lc24ndCBzdXBwb3J0IGl0LCBmYWxsIGJhY2sgdG8gSVB2NC4KKyAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBwbGFuIHRvIGJpbmQgdG8gcmVzdWx0aW5nIGxvY2FsIGxzYS4KKyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK2ludCB4c29ja2V0X3R5cGUobGVuX2FuZF9zb2NrYWRkciAqKmxzYXAsIGludCBhZiwgaW50IHNvY2tfdHlwZSkgRkFTVF9GVU5DOworI2Vsc2UKK2ludCB4c29ja2V0X3R5cGUobGVuX2FuZF9zb2NrYWRkciAqKmxzYXAsIGludCBzb2NrX3R5cGUpIEZBU1RfRlVOQzsKKyNkZWZpbmUgeHNvY2tldF90eXBlKGxzYXAsIGFmLCBzb2NrX3R5cGUpIHhzb2NrZXRfdHlwZSgobHNhcCksIChzb2NrX3R5cGUpKQorI2VuZGlmCitpbnQgeHNvY2tldF9zdHJlYW0obGVuX2FuZF9zb2NrYWRkciAqKmxzYXApIEZBU1RfRlVOQzsKKy8qIENyZWF0ZSBzZXJ2ZXIgc29ja2V0IGJvdW5kIHRvIGJpbmRhZGRyOnBvcnQuIGJpbmRhZGRyIGNhbiBiZSBOVUxMLAorICogbnVtZXJpYyBJUCAoIk4uTi5OLk4iKSBvciBudW1lcmljIElQdjYgYWRkcmVzcywKKyAqIGFuZCBjYW4gaGF2ZSAiOlBPUlQiIHN1ZmZpeCAoZm9yIElQdjYgdXNlICJbWDpYOi4uLjpYXTpQT1JUIikuCisgKiBPbmx5IGlmIHRoZXJlIGlzIG5vIHN1ZmZpeCwgcG9ydCBhcmd1bWVudCBpcyB1c2VkICovCisvKiBOQjogdGhlc2Ugc2V0IFNPX1JFVVNFQUREUiBiZWZvcmUgYmluZCAqLworaW50IGNyZWF0ZV9hbmRfYmluZF9zdHJlYW1fb3JfZGllKGNvbnN0IGNoYXIgKmJpbmRhZGRyLCBpbnQgcG9ydCkgRkFTVF9GVU5DOworaW50IGNyZWF0ZV9hbmRfYmluZF9kZ3JhbV9vcl9kaWUoY29uc3QgY2hhciAqYmluZGFkZHIsIGludCBwb3J0KSBGQVNUX0ZVTkM7CisvKiBDcmVhdGUgY2xpZW50IFRDUCBzb2NrZXQgY29ubmVjdGVkIHRvIHBlZXI6cG9ydC4gUGVlciBjYW5ub3QgYmUgTlVMTC4KKyAqIFBlZXIgY2FuIGJlIG51bWVyaWMgSVAgKCJOLk4uTi5OIiksIG51bWVyaWMgSVB2NiBhZGRyZXNzIG9yIGhvc3RuYW1lLAorICogYW5kIGNhbiBoYXZlICI6UE9SVCIgc3VmZml4IChmb3IgSVB2NiB1c2UgIltYOlg6Li4uOlhdOlBPUlQiKS4KKyAqIElmIHRoZXJlIGlzIG5vIHN1ZmZpeCwgcG9ydCBhcmd1bWVudCBpcyB1c2VkICovCitpbnQgY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoY29uc3QgY2hhciAqcGVlciwgaW50IHBvcnQpIEZBU1RfRlVOQzsKKy8qIENvbm5lY3QgdG8gcGVlciBpZGVudGlmaWVkIGJ5IGxzYSAqLworaW50IHhjb25uZWN0X3N0cmVhbShjb25zdCBsZW5fYW5kX3NvY2thZGRyICpsc2EpIEZBU1RfRlVOQzsKKy8qIEdldCBsb2NhbCBhZGRyZXNzIG9mIGJvdW5kIG9yIGFjY2VwdGVkIHNvY2tldCAqLworbGVuX2FuZF9zb2NrYWRkciAqZ2V0X3NvY2tfbHNhKGludCBmZCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogR2V0IHJlbW90ZSBhZGRyZXNzIG9mIGNvbm5lY3RlZCBvciBhY2NlcHRlZCBzb2NrZXQgKi8KK2xlbl9hbmRfc29ja2FkZHIgKmdldF9wZWVyX2xzYShpbnQgZmQpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIFJldHVybiBtYWxsb2MnZWQgbGVuX2FuZF9zb2NrYWRkciB3aXRoIHNvY2tldCBhZGRyZXNzIG9mIGhvc3Q6cG9ydAorICogQ3VycmVudGx5IHdpbGwgcmV0dXJuIElQdjQgb3IgSVB2NiBzb2NrYWRkcnMgb25seQorICogKGRlcGVuZGluZyBvbiBob3N0KSwgYnV0IGluIHRoZW9yeSBub3RoaW5nIHByZXZlbnRzIGUuZy4KKyAqIFVOSVggc29ja2V0IGFkZHJlc3MgYmVpbmcgcmV0dXJuZWQsIElQWCBzb2NrYWRkciBldGMuLi4KKyAqIE9uIGVycm9yIGRvZXMgYmJfZXJyb3JfbXNnIGFuZCByZXR1cm5zIE5VTEwgKi8KK2xlbl9hbmRfc29ja2FkZHIqIGhvc3Qyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIFZlcnNpb24gd2hpY2ggZGllcyBvbiBlcnJvciAqLworbGVuX2FuZF9zb2NrYWRkciogeGhvc3Qyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK2xlbl9hbmRfc29ja2FkZHIqIHhkb3R0ZWQyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIFNhbWUsIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBmb3JjZSBmYW1pbHkgKGUuZy4gSVB2NikgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfSVBWNgorI2RlZmluZSBob3N0X2FuZF9hZjJzb2NrYWRkcihob3N0LCBwb3J0LCBhZikgaG9zdDJzb2NrYWRkcigoaG9zdCksIChwb3J0KSkKKyNkZWZpbmUgeGhvc3RfYW5kX2FmMnNvY2thZGRyKGhvc3QsIHBvcnQsIGFmKSB4aG9zdDJzb2NrYWRkcigoaG9zdCksIChwb3J0KSkKKyNlbHNlCitsZW5fYW5kX3NvY2thZGRyKiBob3N0X2FuZF9hZjJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgc2FfZmFtaWx5X3QgYWYpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK2xlbl9hbmRfc29ja2FkZHIqIHhob3N0X2FuZF9hZjJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgc2FfZmFtaWx5X3QgYWYpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKyNlbmRpZgorLyogQXNzaWduIHNpbls2XV9wb3J0IG1lbWJlciBpZiB0aGUgc29ja2V0IGlzIGFuIEFGX0lORVRbNl0gb25lLAorICogb3RoZXJ3aXNlIG5vLW9wLiBVc2VmdWwgZm9yIGZ0cC4KKyAqIE5COiBkb2VzIE5PVCBkbyBodG9ucygpIGludGVybmFsbHksIGp1c3QgZGlyZWN0IGFzc2lnbm1lbnQuICovCit2b2lkIHNldF9ucG9ydChzdHJ1Y3Qgc29ja2FkZHIgKnNhLCB1bnNpZ25lZCBwb3J0KSBGQVNUX0ZVTkM7CisvKiBSZXRyaWV2ZSBzaW5bNl1fcG9ydCBvciByZXR1cm4gLTEgZm9yIG5vbi1JTkVUWzZdIGxzYSdzICovCitpbnQgZ2V0X25wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpIEZBU1RfRlVOQzsKKy8qIFJldmVyc2UgRE5TLiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4gKi8KK2NoYXIqIHhtYWxsb2Nfc29ja2FkZHIyaG9zdChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBUaGlzIG9uZSBkb2Vzbid0IGFwcGVuZCA6UE9SVE5VTSAqLworY2hhciogeG1hbGxvY19zb2NrYWRkcjJob3N0X25vcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBUaGlzIG9uZSBhbHNvIGRvZXNuJ3QgZmFsbCBiYWNrIHRvIGRvdHRlZCBJUCAocmV0dXJucyBOVUxMKSAqLworY2hhciogeG1hbGxvY19zb2NrYWRkcjJob3N0b25seV9ub3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogaW5ldF9bYXBddG9uIG9uIHN0ZXJvaWRzICovCitjaGFyKiB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CitjaGFyKiB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLy8gIm9sZCIgKGlwdjQgb25seSkgQVBJCisvLyB1c2VyczogdHJhY2Vyb3V0ZS5jIGhvc3RuYW1lLmMgLSB1c2UgX2xpc3RfIG9mIGFsbCBJUHMKK3N0cnVjdCBob3N0ZW50ICp4Z2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7CisvLyBBbHNvIG1vdW50LmMgYW5kIGluZXRkLmMgYXJlIHVzaW5nIGdldGhvc3RieW5hbWUoKSwKKy8vICsgaW5ldF9jb21tb24uYyBoYXMgYWRkaXRpb25hbCBJUHY0LW9ubHkgc3R1ZmYKKworCit2b2lkIHNvY2tldF93YW50X3BrdGluZm8oaW50IGZkKSBGQVNUX0ZVTkM7Citzc2l6ZV90IHNlbmRfdG9fZnJvbShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgaW50IGZsYWdzLAorCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLAorCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sCisJCXNvY2tsZW5fdCB0b2xlbikgRkFTVF9GVU5DOworc3NpemVfdCByZWN2X2Zyb21fdG8oaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCBmbGFncywKKwkJc3RydWN0IHNvY2thZGRyICpmcm9tLAorCQlzdHJ1Y3Qgc29ja2FkZHIgKnRvLAorCQlzb2NrbGVuX3Qgc2Ffc2l6ZSkgRkFTVF9GVU5DOworCisKK2NoYXIgKnhzdHJkdXAoY29uc3QgY2hhciAqcykgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworY2hhciAqeHN0cm5kdXAoY29uc3QgY2hhciAqcywgaW50IG4pIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK3ZvaWQgb3ZlcmxhcHBpbmdfc3RyY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKSBGQVNUX0ZVTkM7CitjaGFyICpzYWZlX3N0cm5jcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKSBGQVNUX0ZVTkM7CitjaGFyICpzdHJuY3B5X0lGTkFNU0laKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKSBGQVNUX0ZVTkM7CisvKiBHdWFyYW50ZWVkIHRvIE5PVCBiZSBhIG1hY3JvIChzbWFsbGVzdCBjb2RlKS4gU2F2ZXMgbmVhcmx5IDJrIG9uIHVjbGliYy4KKyAqIEJ1dCBwb3RlbnRpYWxseSBzbG93LCBkb24ndCB1c2UgaW4gb25lLWJpbGxpb24tdGltZXMgbG9vcHMgKi8KK2ludCBiYl9wdXRjaGFyKGludCBjaCkgRkFTVF9GVU5DOworLyogTm90ZTogZG9lcyBub3QgdXNlIHN0ZGlvLCB3cml0ZXMgdG8gZmQgMiBkaXJlY3RseSAqLworaW50IGJiX3B1dGNoYXJfc3RkZXJyKGNoYXIgY2gpIEZBU1RfRlVOQzsKK2NoYXIgKnhhc3ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLy8gZ2NjLTQuMS4xIHN0aWxsIGlzbid0IGdvb2QgZW5vdWdoIGF0IG9wdGltaXppbmcgaXQKKy8vICgrMjAwIGJ5dGVzIGNvbXBhcmVkIHRvIG1hY3JvKQorLy9zdGF0aWMgQUxXQVlTX0lOTElORQorLy9pbnQgTE9ORV9EQVNIKGNvbnN0IGNoYXIgKnMpIHsgcmV0dXJuIHNbMF0gPT0gJy0nICYmICFzWzFdOyB9CisvL3N0YXRpYyBBTFdBWVNfSU5MSU5FCisvL2ludCBOT1RfTE9ORV9EQVNIKGNvbnN0IGNoYXIgKnMpIHsgcmV0dXJuIHNbMF0gIT0gJy0nIHx8IHNbMV07IH0KKyNkZWZpbmUgTE9ORV9EQVNIKHMpICAgICAoKHMpWzBdID09ICctJyAmJiAhKHMpWzFdKQorI2RlZmluZSBOT1RfTE9ORV9EQVNIKHMpICgocylbMF0gIT0gJy0nIHx8IChzKVsxXSkKKyNkZWZpbmUgTE9ORV9DSEFSKHMsYykgICAgICgocylbMF0gPT0gKGMpICYmICEocylbMV0pCisjZGVmaW5lIE5PVF9MT05FX0NIQVIocyxjKSAoKHMpWzBdICE9IChjKSB8fCAocylbMV0pCisjZGVmaW5lIERPVF9PUl9ET1RET1QocykgKChzKVswXSA9PSAnLicgJiYgKCEocylbMV0gfHwgKChzKVsxXSA9PSAnLicgJiYgIShzKVsyXSkpKQorCit0eXBlZGVmIHN0cnVjdCB1bmlfc3RhdF90IHsKKwl1bnNpZ25lZCBieXRlX2NvdW50OworCXVuc2lnbmVkIHVuaWNvZGVfY291bnQ7CisJdW5zaWduZWQgdW5pY29kZV93aWR0aDsKK30gdW5pX3N0YXRfdDsKKy8qIFJldHVybnMgYSBzdHJpbmcgd2l0aCB1bnByaW50YWJsZSBjaGFycyByZXBsYWNlZCBieSAnPycgb3IKKyAqIFNVQlNUX1dDSEFSLiBUaGlzIGZ1bmN0aW9uIGlzIHVuaWNvZGUtYXdhcmUuICovCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgcHJpbnRhYmxlX3N0cmluZyh1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3RyKTsKKy8qIFByaW50cyB1bnByaW50YWJsZSBjaGFyIGNoIGFzIF5DIG9yIE0tYyB0byBmaWxlCisgKiAoTS1jIGlzIHVzZWQgb25seSBpZiBjaCBpcyBPUmVkIHdpdGggUFJJTlRBQkxFX01FVEEpLAorICogZWxzZSBpdCBpcyBwcmludGVkIGFzLWlzIChleGNlcHQgZm9yIGNoID0gMHg5YikgKi8KK2VudW0geyBQUklOVEFCTEVfTUVUQSA9IDB4MTAwIH07Cit2b2lkIGZwdXRjX3ByaW50YWJsZShpbnQgY2gsIEZJTEUgKmZpbGUpIEZBU1RfRlVOQzsKKworLyogZG1hbGxvYyB3aWxsIHJlZGVmaW5lIHRoZXNlIHRvIGl0J3Mgb3duIGltcGxlbWVudGF0aW9uLiBJdCBpcyBzYWZlCisgKiB0byBoYXZlIHRoZSBwcm90b3R5cGVzIGhlcmUgdW5jb25kaXRpb25hbGx5LiAgKi8KK3ZvaWQgKm1hbGxvY19vcl93YXJuKHNpemVfdCBzaXplKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7Cit2b2lkICp4bWFsbG9jKHNpemVfdCBzaXplKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7Cit2b2lkICp4emFsbG9jKHNpemVfdCBzaXplKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7Cit2b2lkICp4cmVhbGxvYyh2b2lkICpvbGQsIHNpemVfdCBzaXplKSBGQVNUX0ZVTkM7CisvKiBBZnRlciB4cmVhbGxvY192ZWN0b3IodiwgNCwgaWR4KSBpdCdzIG9rIHRvIHVzZQorICogYXQgbGVhc3QgdltpZHhdIGFuZCB2W2lkeCsxXSwgZm9yIGFsbCBpZHggdmFsdWVzLgorICogc2hpZnQgc3BlY2lmaWVzIGhvdyBtYW55IG5ldyBlbGVtZW50cyBhcmUgYWRkZWQgKDE6IDIsIDI6IDQuLi4gODogMjU2Li4uKQorICogd2hlbiBhbGwgZWxlbWVudHMgYXJlIHVzZWQgdXAuIE5ldyBlbGVtZW50cyBhcmUgemVyb2VkIG91dC4gKi8KKyNkZWZpbmUgeHJlYWxsb2NfdmVjdG9yKHZlY3Rvciwgc2hpZnQsIGlkeCkgXAorCXhyZWFsbG9jX3ZlY3Rvcl9oZWxwZXIoKHZlY3RvciksIChzaXplb2YoKHZlY3RvcilbMF0pIDw8IDgpICsgKHNoaWZ0KSwgKGlkeCkpCit2b2lkKiB4cmVhbGxvY192ZWN0b3JfaGVscGVyKHZvaWQgKnZlY3RvciwgdW5zaWduZWQgc2l6ZW9mX2FuZF9zaGlmdCwgaW50IGlkeCkgRkFTVF9GVU5DOworCisKK2V4dGVybiBzc2l6ZV90IHNhZmVfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSBGQVNUX0ZVTkM7CitleHRlcm4gc3NpemVfdCBub25ibG9ja19pbW11bmVfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbG9vcF9vbl9FSU5UUikgRkFTVF9GVU5DOworLy8gTkI6IHdpbGwgcmV0dXJuIHNob3J0IHJlYWQgb24gZXJyb3IsIG5vdCAtMSwKKy8vIGlmIHNvbWUgZGF0YSB3YXMgcmVhZCBiZWZvcmUgZXJyb3Igb2NjdXJyZWQKK2V4dGVybiBzc2l6ZV90IGZ1bGxfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSBGQVNUX0ZVTkM7CitleHRlcm4gdW5zaWduZWQgY2hhciB4cmVhZF9jaGFyKGludCBmZCkgRkFTVF9GVU5DOworZXh0ZXJuIHNzaXplX3QgcmVhZF9jbG9zZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IG1heHN6KSBGQVNUX0ZVTkM7CitleHRlcm4gc3NpemVfdCBvcGVuX3JlYWRfY2xvc2UoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1Ziwgc2l6ZV90IG1heHN6KSBGQVNUX0ZVTkM7CisvLyBSZWFkcyBvbmUgbGluZSBhLWxhIGZnZXRzIChidXQgZG9lc24ndCBzYXZlIHRlcm1pbmF0aW5nICdcbicpLgorLy8gUmVhZHMgYnl0ZS1ieS1ieXRlLiBVc2VmdWwgd2hlbiBpdCBpcyBpbXBvcnRhbnQgdG8gbm90IHJlYWQgYWhlYWQuCisvLyBCeXRlcyBhcmUgYXBwZW5kZWQgdG8gcGZ4ICh3aGljaCBtdXN0IGJlIG1hbGxvY2VkLCBvciBOVUxMKS4KK2V4dGVybiBjaGFyICp4bWFsbG9jX3JlYWRzKGludCBmZCwgc2l6ZV90ICptYXhzel9wKSBGQVNUX0ZVTkM7CisvKiBSZWFkcyBibG9jayB1cCB0byAqbWF4c3pfcCAoZGVmYXVsdDogSU5UX01BWCAtIDQwOTUpICovCitleHRlcm4gdm9pZCAqeG1hbGxvY19yZWFkKGludCBmZCwgc2l6ZV90ICptYXhzel9wKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBSZXR1cm5zIE5VTEwgaWYgZmlsZSBjYW4ndCBiZSBvcGVuZWQgKGRlZmF1bHQgbWF4IHNpemU6IElOVF9NQVggLSA0MDk1KSAqLworZXh0ZXJuIHZvaWQgKnhtYWxsb2Nfb3Blbl9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKm1heHN6X3ApIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIE5ldmVyIHJldHVybnMgTlVMTCAqLworZXh0ZXJuIHZvaWQgKnhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICptYXhzel9wKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBBdXRvZGV0ZWN0cyBnemlwL2J6aXAyIGZvcm1hdHMuIGZkIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBmaWxlISAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEgXAorIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMiBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1ogXAorIC8qIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1ogKi8KK2V4dGVybiB2b2lkIHNldHVwX3VuemlwX29uX2ZkKGludCBmZCAvKiwgaW50IGZhaWxfaWZfbm90X2RldGVjdGVkKi8pIEZBU1RfRlVOQzsKKyNlbHNlCisjIGRlZmluZSBzZXR1cF91bnppcF9vbl9mZCguLi4pICgodm9pZCkwKQorI2VuZGlmCisvKiBBdXRvZGV0ZWN0cyAuZ3ogZXRjICovCitleHRlcm4gaW50IG9wZW5femlwcGVkKGNvbnN0IGNoYXIgKmZuYW1lKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCAqeG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZuYW1lLCBzaXplX3QgKm1heHN6X3ApIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKworZXh0ZXJuIHNzaXplX3Qgc2FmZV93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSBGQVNUX0ZVTkM7CisvLyBOQjogd2lsbCByZXR1cm4gc2hvcnQgd3JpdGUgb24gZXJyb3IsIG5vdCAtMSwKKy8vIGlmIHNvbWUgZGF0YSB3YXMgd3JpdHRlbiBiZWZvcmUgZXJyb3Igb2NjdXJyZWQKK2V4dGVybiBzc2l6ZV90IGZ1bGxfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgeHdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHh3cml0ZV9zdHIoaW50IGZkLCBjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKK2V4dGVybiBzc2l6ZV90IGZ1bGxfd3JpdGUxX3N0cihjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKK2V4dGVybiBzc2l6ZV90IGZ1bGxfd3JpdGUyX3N0cihjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHhvcGVuX3h3cml0ZV9jbG9zZShjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKKworLyogQ2xvc2UgZmQsIGJ1dCBjaGVjayBmb3IgZmFpbHVyZXMgKHNvbWUgdHlwZXMgb2Ygd3JpdGUgZXJyb3JzKSAqLworZXh0ZXJuIHZvaWQgeGNsb3NlKGludCBmZCkgRkFTVF9GVU5DOworCisvKiBSZWFkcyBhbmQgcHJpbnRzIHRvIHN0ZG91dCB0aWxsIGVvZiwgdGhlbiBjbG9zZXMgRklMRS4gRXhpdHMgb24gZXJyb3I6ICovCitleHRlcm4gdm9pZCB4cHJpbnRfYW5kX2Nsb3NlX2ZpbGUoRklMRSAqZmlsZSkgRkFTVF9GVU5DOworCisvKiBSZWFkcyBhIGxpbmUgZnJvbSBhIHRleHQgZmlsZSwgdXAgdG8gYSBuZXdsaW5lIG9yIE5VTCBieXRlLCBpbmNsdXNpdmUuCisgKiBSZXR1cm5zIG1hbGxvYydlZCBjaGFyKi4gSWYgZW5kIGlzIE5VTEwgJ1xuJyBpc24ndCBjb25zaWRlcmVkCisgKiBlbmQgb2YgbGluZS4gSWYgZW5kIGlzbid0IE5VTEwsIGxlbmd0aCBvZiB0aGUgY2h1bmsgaXMgc3RvcmVkIGluIGl0LgorICogUmV0dXJucyBOVUxMIGlmIEVPRi9lcnJvci4KKyAqLworZXh0ZXJuIGNoYXIgKmJiX2dldF9jaHVua19mcm9tX2ZpbGUoRklMRSAqZmlsZSwgaW50ICplbmQpIEZBU1RfRlVOQzsKKy8qIFJlYWRzIHVwIHRvIChhbmQgaW5jbHVkaW5nKSBURVJNSU5BVElOR19TVFJJTkc6ICovCitleHRlcm4gY2hhciAqeG1hbGxvY19mZ2V0c19zdHIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqdGVybWluYXRpbmdfc3RyaW5nKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBTYW1lLCB3aXRoIGxpbWl0ZWQgbWF4IHNpemUsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggKGV4Y2x1ZGluZyBOVUwpOiAqLworZXh0ZXJuIGNoYXIgKnhtYWxsb2NfZmdldHNfc3RyX2xlbihGSUxFICpmaWxlLCBjb25zdCBjaGFyICp0ZXJtaW5hdGluZ19zdHJpbmcsIHNpemVfdCAqbWF4c3pfcCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogQ2hvcHMgb2ZmIFRFUk1JTkFUSU5HX1NUUklORyBmcm9tIHRoZSBlbmQ6ICovCitleHRlcm4gY2hhciAqeG1hbGxvY19mZ2V0bGluZV9zdHIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqdGVybWluYXRpbmdfc3RyaW5nKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBSZWFkcyB1cCB0byAoYW5kIGluY2x1ZGluZykgIlxuIiBvciBOVUwgYnl0ZTogKi8KK2V4dGVybiBjaGFyICp4bWFsbG9jX2ZnZXRzKEZJTEUgKmZpbGUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIENob3BzIG9mZiAnXG4nIGZyb20gdGhlIGVuZCwgdW5saWtlIGZnZXRzOiAqLworZXh0ZXJuIGNoYXIgKnhtYWxsb2NfZmdldGxpbmUoRklMRSAqZmlsZSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogU2FtZSwgYnV0IGRvZXNuJ3QgdHJ5IHRvIGNvbnNlcnZlIHNwYWNlIChtYXkgaGF2ZSBzb21lIHNsYWNrIGFmdGVyIHRoZSBlbmQpICovCisvKiBleHRlcm4gY2hhciAqeG1hbGxvY19mZ2V0bGluZV9mYXN0KEZJTEUgKmZpbGUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsgKi8KKwordm9pZCBkaWVfaWZfZmVycm9yKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKm1zZykgRkFTVF9GVU5DOwordm9pZCBkaWVfaWZfZmVycm9yX3N0ZG91dCh2b2lkKSBGQVNUX0ZVTkM7CitpbnQgZmZsdXNoX2FsbCh2b2lkKSBGQVNUX0ZVTkM7Cit2b2lkIGZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoaW50IHJldHZhbCkgTk9SRVRVUk4gRkFTVF9GVU5DOworaW50IGZjbG9zZV9pZl9ub3Rfc3RkaW4oRklMRSAqZmlsZSkgRkFTVF9GVU5DOworRklMRSogeGZvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKSBGQVNUX0ZVTkM7CisvKiBQcmludHMgd2FybmluZyB0byBzdGRlcnIgYW5kIHJldHVybnMgTlVMTCBvbiBmYWlsdXJlOiAqLworRklMRSogZm9wZW5fb3Jfd2Fybihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgRkFTVF9GVU5DOworLyogIk9wZW5zIiBzdGRpbiBpZiBmaWxlbmFtZSBpcyBzcGVjaWFsLCBlbHNlIGp1c3Qgb3BlbnMgZmlsZTogKi8KK0ZJTEUqIHhmb3Blbl9zdGRpbihjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworRklMRSogZm9wZW5fb3Jfd2Fybl9zdGRpbihjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworRklMRSogZm9wZW5fZm9yX3JlYWQoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworRklMRSogeGZvcGVuX2Zvcl9yZWFkKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKK0ZJTEUqIGZvcGVuX2Zvcl93cml0ZShjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CitGSUxFKiB4Zm9wZW5fZm9yX3dyaXRlKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKK0ZJTEUqIHhmZG9wZW5fZm9yX3JlYWQoaW50IGZkKSBGQVNUX0ZVTkM7CitGSUxFKiB4ZmRvcGVuX2Zvcl93cml0ZShpbnQgZmQpIEZBU1RfRlVOQzsKKworaW50IGJiX3BzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgLyogbm90IEZBU1RfRlVOQyEgKi87Cit2b2lkIHFzb3J0X3N0cmluZ192ZWN0b3IoY2hhciAqKnN2LCB1bnNpZ25lZCBjb3VudCkgRkFTVF9GVU5DOworCisvKiBXcmFwcGVyIHdoaWNoIHJlc3RhcnRzIHBvbGwgb24gRUlOVFIgb3IgRU5PTUVNLgorICogT24gb3RoZXIgZXJyb3JzIGNvbXBsYWlucyBbcGVycm9yKCJwb2xsIildIGFuZCByZXR1cm5zLgorICogV2FybmluZyEgTWF5IHRha2UgKG11Y2gpIGxvbmdlciB0aGFuIHRpbWVvdXRfbXMgdG8gcmV0dXJuIQorICogSWYgdGhpcyBpcyBhIHByb2JsZW0sIHVzZSBiYXJlIHBvbGwgYW5kIG9wZW4tY29kZSBFSU5UUi9FTk9NRU0gaGFuZGxpbmcgKi8KK2ludCBzYWZlX3BvbGwoc3RydWN0IHBvbGxmZCAqdWZkcywgbmZkc190IG5mZHMsIGludCB0aW1lb3V0X21zKSBGQVNUX0ZVTkM7CisKK2NoYXIgKnNhZmVfZ2V0aG9zdG5hbWUodm9pZCkgRkFTVF9GVU5DOworY2hhciAqc2FmZV9nZXRkb21haW5uYW1lKHZvaWQpIEZBU1RfRlVOQzsKKworLyogQ29udmVydCBlYWNoIGFscGhhIGNoYXIgaW4gc3RyIHRvIGxvd2VyLWNhc2UgKi8KK2NoYXIqIHN0cl90b2xvd2VyKGNoYXIgKnN0cikgRkFTVF9GVU5DOworCitjaGFyICp1dG9hKHVuc2lnbmVkIG4pIEZBU1RfRlVOQzsKK2NoYXIgKml0b2EoaW50IG4pIEZBU1RfRlVOQzsKKy8qIFJldHVybnMgYSBwb2ludGVyIHBhc3QgdGhlIGZvcm1hdHRlZCBudW1iZXIsIGRvZXMgTk9UIG51bGwtdGVybWluYXRlICovCitjaGFyICp1dG9hX3RvX2J1Zih1bnNpZ25lZCBuLCBjaGFyICpidWYsIHVuc2lnbmVkIGJ1ZmxlbikgRkFTVF9GVU5DOworY2hhciAqaXRvYV90b19idWYoaW50IG4sIGNoYXIgKmJ1ZiwgdW5zaWduZWQgYnVmbGVuKSBGQVNUX0ZVTkM7CisvKiBJbnRlbGxpZ2VudCBmb3JtYXR0ZXJzIG9mIGJpZ251bXMgKi8KK3ZvaWQgc21hcnRfdWxsdG9hNCh1bnNpZ25lZCBsb25nIGxvbmcgdWwsIGNoYXIgYnVmWzRdLCBjb25zdCBjaGFyICpzY2FsZSkgRkFTVF9GVU5DOwordm9pZCBzbWFydF91bGx0b2E1KHVuc2lnbmVkIGxvbmcgbG9uZyB1bCwgY2hhciBidWZbNV0sIGNvbnN0IGNoYXIgKnNjYWxlKSBGQVNUX0ZVTkM7CisvKiBJZiBibG9ja19zaXplID09IDAsIGRpc3BsYXkgc2l6ZSB3aXRob3V0IGZyYWN0aW9uYWwgcGFydCwKKyAqIGVsc2UgZGlzcGxheSAoc2l6ZSAqIGJsb2NrX3NpemUpIHdpdGggb25lIGRlY2ltYWwgZGlnaXQuCisgKiBJZiBkaXNwbGF5X3VuaXQgPT0gMCwgc2hvdyB2YWx1ZSBubyBiaWdnZXIgdGhhbiAxMDI0IHdpdGggc3VmZml4IChLLE0sRy4uLiksCisgKiBlbHNlIGRpdmlkZSBieSBkaXNwbGF5X3VuaXQgYW5kIGRvIG5vdCB1c2Ugc3VmZml4LiAqLworI2RlZmluZSBIVU1BTl9SRUFEQUJMRV9NQVhfV0lEVEggICAgICA3ICAvKiAiMTAyNC4wRyIgKi8KKyNkZWZpbmUgSFVNQU5fUkVBREFCTEVfTUFYX1dJRFRIX1NUUiAiNyIKKy8vVE9ETzogcHJvdmlkZSBwb2ludGVyIHRvIGJ1ZiAoYXZvaWQgc3RhdGljcyk/Citjb25zdCBjaGFyICptYWtlX2h1bWFuX3JlYWRhYmxlX3N0cih1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwKKwkJdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB1bnNpZ25lZCBsb25nIGRpc3BsYXlfdW5pdCkgRkFTVF9GVU5DOworLyogUHV0IGEgc3RyaW5nIG9mIGhleCBieXRlcyAoIjFiMmU2NmZlIi4uLiksIHJldHVybiBhZHZhbmNlZCBwb2ludGVyICovCitjaGFyICpiaW4yaGV4KGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqY3AsIGludCBjb3VudCkgRkFTVF9GVU5DOworLyogUmV2ZXJzZSAqLworY2hhciogaGV4MmJpbihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGNvdW50KSBGQVNUX0ZVTkM7CisKKy8qIEdlbmVyYXRlIGEgVVVJRCAqLwordm9pZCBnZW5lcmF0ZV91dWlkKHVpbnQ4X3QgKmJ1ZikgRkFTVF9GVU5DOworCisvKiBMYXN0IGVsZW1lbnQgaXMgbWFya2VkIGJ5IG11bHQgPT0gMCAqLworc3RydWN0IHN1ZmZpeF9tdWx0IHsKKwljaGFyIHN1ZmZpeFs0XTsKKwl1bnNpZ25lZCBtdWx0OworfTsKKyNpbmNsdWRlICJ4YXRvbnVtLmgiCisvKiBTcGVjaWFsaXplZDogKi8KKworLyogVXNpbmcgeGF0b2koKSBpbnN0ZWFkIG9mIG5haXZlIGF0b2koKSBpcyBub3QgYWx3YXlzIGNvbnZlbmllbnQgLQorICogaW4gbWFueSBwbGFjZXMgcGVvcGxlIHdhbnQgKm5vbi1uZWdhdGl2ZSogdmFsdWVzLCBidXQgc3RvcmUgdGhlbQorICogaW4gc2lnbmVkIGludC4gVGhlcmVmb3JlIHdlIG5lZWQgdGhpcyBvbmU6CisgKiBkaWVzIGlmIGlucHV0IGlzIG5vdCBpbiBbMCwgSU5UX01BWF0gcmFuZ2UuIEFsc28gd2lsbCByZWplY3QgJy0wJyBldGMuCisgKiBJdCBzaG91bGQgcmVhbGx5IGJlIG5hbWVkIHhhdG9pX25vbm5lZ2F0aXZlIChzaW5jZSBpdCBhbGxvd3MgMCksCisgKiBidXQgdGhhdCB3b3VsZCBiZSB0b28gbG9uZy4KKyAqLworaW50IHhhdG9pX3Bvc2l0aXZlKGNvbnN0IGNoYXIgKm51bXN0cikgRkFTVF9GVU5DOworCisvKiBVc2VmdWwgZm9yIHJlYWRpbmcgcG9ydCBudW1iZXJzICovCit1aW50MTZfdCB4YXRvdTE2KGNvbnN0IGNoYXIgKm51bXN0cikgRkFTVF9GVU5DOworCisKKy8qIFRoZXNlIHBhcnNlIGVudHJpZXMgaW4gL2V0Yy9wYXNzd2QgYW5kIC9ldGMvZ3JvdXAuICBUaGlzIGlzIGRlc2lyYWJsZQorICogZm9yIEJ1c3lCb3ggc2luY2Ugd2Ugd2FudCB0byBhdm9pZCB1c2luZyB0aGUgZ2xpYmMgTlNTIHN0dWZmLCB3aGljaAorICogaW5jcmVhc2VzIHRhcmdldCBzaXplIGFuZCBpcyBvZnRlbiBub3QgbmVlZGVkIG9uIGVtYmVkZGVkIHN5c3RlbXMuICAqLworbG9uZyB4dW5hbWUydWlkKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK2xvbmcgeGdyb3VwMmdpZChjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7CisvKiB3cmFwcGVyOiBhbGxvd3Mgc3RyaW5nIHRvIGNvbnRhaW4gbnVtZXJpYyB1aWQgb3IgZ2lkICovCit1bnNpZ25lZCBsb25nIGdldF91Z19pZChjb25zdCBjaGFyICpzLCBsb25nIEZBU1RfRlVOQyAoKnhuYW1lMmlkKShjb25zdCBjaGFyICopKSBGQVNUX0ZVTkM7CisvKiBmcm9tIGNocHN0LiBEb2VzIG5vdCBkaWUsIHJldHVybnMgMCBvbiBmYWlsdXJlICovCitzdHJ1Y3QgYmJfdWlkZ2lkX3QgeworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7Cit9OworLyogYWx3YXlzIHNldHMgdWlkIGFuZCBnaWQgKi8KK2ludCBnZXRfdWlkZ2lkKHN0cnVjdCBiYl91aWRnaWRfdCosIGNvbnN0IGNoYXIqLCBpbnQgbnVtZXJpY19vaykgRkFTVF9GVU5DOworLyogYWx3YXlzIHNldHMgdWlkIGFuZCBnaWQsIGFsbG93cyBudW1lcmljOyBleGl0cyBvbiBmYWlsdXJlICovCit2b2lkIHhnZXRfdWlkZ2lkKHN0cnVjdCBiYl91aWRnaWRfdCosIGNvbnN0IGNoYXIqKSBGQVNUX0ZVTkM7CisvKiBjaG93bi1saWtlIGhhbmRsaW5nIG9mICJ1c2VyWzpbZ3JvdXBdIiAqLwordm9pZCBwYXJzZV9jaG93bl91c2VyZ3JvdXBfb3JfZGllKHN0cnVjdCBiYl91aWRnaWRfdCAqdSwgY2hhciAqdXNlcl9ncm91cCkgRkFTVF9GVU5DOworc3RydWN0IHBhc3N3ZCogeGdldHB3bmFtKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK3N0cnVjdCBncm91cCogeGdldGdybmFtKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK3N0cnVjdCBwYXNzd2QqIHhnZXRwd3VpZCh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK3N0cnVjdCBncm91cCogeGdldGdyZ2lkKGdpZF90IGdpZCkgRkFTVF9GVU5DOworY2hhciogeHVpZDJ1bmFtZSh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK2NoYXIqIHhnaWQyZ3JvdXAoZ2lkX3QgZ2lkKSBGQVNUX0ZVTkM7CitjaGFyKiB1aWQydW5hbWUodWlkX3QgdWlkKSBGQVNUX0ZVTkM7CitjaGFyKiBnaWQyZ3JvdXAoZ2lkX3QgZ2lkKSBGQVNUX0ZVTkM7CitjaGFyKiB1aWQydW5hbWVfdXRvYSh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK2NoYXIqIGdpZDJncm91cF91dG9hKGdpZF90IGdpZCkgRkFTVF9GVU5DOworLyogdmVyc2lvbnMgd2hpY2ggY2FjaGUgcmVzdWx0cyAodXNlZnVsIGZvciBwcywgbHMgZXRjKSAqLworY29uc3QgY2hhciogZ2V0X2NhY2hlZF91c2VybmFtZSh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK2NvbnN0IGNoYXIqIGdldF9jYWNoZWRfZ3JvdXBuYW1lKGdpZF90IGdpZCkgRkFTVF9GVU5DOwordm9pZCBjbGVhcl91c2VybmFtZV9jYWNoZSh2b2lkKSBGQVNUX0ZVTkM7CisvKiBpbnRlcm5hbGx5IHVzZXJuYW1lcyBhcmUgc2F2ZWQgaW4gZml4ZWQtc2l6ZWQgY2hhcltdIGJ1ZmZlcnMgKi8KK2VudW0geyBVU0VSTkFNRV9NQVhfU0laRSA9IDMyIC0gc2l6ZW9mKHVpZF90KSB9OworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX05BTUVTCit2b2lkIGRpZV9pZl9iYWRfdXNlcm5hbWUoY29uc3QgY2hhciogbmFtZSkgRkFTVF9GVU5DOworI2Vsc2UKKyNkZWZpbmUgZGllX2lmX2JhZF91c2VybmFtZShuYW1lKSAoKHZvaWQpKG5hbWUpKQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VVE1QCit2b2lkIEZBU1RfRlVOQyB3cml0ZV9uZXdfdXRtcChwaWRfdCBwaWQsIGludCBuZXdfdHlwZSwgY29uc3QgY2hhciAqdHR5X25hbWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpob3N0bmFtZSk7Cit2b2lkIEZBU1RfRlVOQyB1cGRhdGVfdXRtcChwaWRfdCBwaWQsIGludCBuZXdfdHlwZSwgY29uc3QgY2hhciAqdHR5X25hbWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpob3N0bmFtZSk7CisjZWxzZQorIyBkZWZpbmUgd3JpdGVfbmV3X3V0bXAocGlkLCBuZXdfdHlwZSwgdHR5X25hbWUsIHVzZXJuYW1lLCBob3N0bmFtZSkgKCh2b2lkKTApCisjIGRlZmluZSB1cGRhdGVfdXRtcChwaWQsIG5ld190eXBlLCB0dHlfbmFtZSwgdXNlcm5hbWUsIGhvc3RuYW1lKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKK2ludCBleGVjYWJsZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK2NoYXIgKmZpbmRfZXhlY2FibGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKipQQVRIcCkgRkFTVF9GVU5DOworaW50IGV4aXN0c19leGVjYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworCisvKiBCQl9FWEVDeHggYWx3YXlzIGV4ZWNzIChpdCdzIG5vdCBkb2luZyBOT0ZPUksvTk9FWEVDIHN0dWZmKSwKKyAqIGJ1dCBpdCBtYXkgZXhlYyBidXN5Ym94IGFuZCBjYWxsIGFwcGxldCBpbnN0ZWFkIG9mIHNlYXJjaGluZyBQQVRILgorICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMKK2ludCBCQl9FWEVDVlAoY29uc3QgY2hhciAqZmlsZSwgY2hhciAqY29uc3QgYXJndltdKSBGQVNUX0ZVTkM7CisjZGVmaW5lIEJCX0VYRUNMUChwcm9nLGNtZCwuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGZpbmRfYXBwbGV0X2J5X25hbWUocHJvZykgPj0gMCkgXAorCQkJZXhlY2xwKGJiX2J1c3lib3hfZXhlY19wYXRoLCBjbWQsIF9fVkFfQVJHU19fKTsgXAorCQlleGVjbHAocHJvZywgY21kLCBfX1ZBX0FSR1NfXyk7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgQkJfRVhFQ1ZQKHByb2csY21kKSAgICAgZXhlY3ZwKHByb2csY21kKQorI2RlZmluZSBCQl9FWEVDTFAocHJvZyxjbWQsLi4uKSBleGVjbHAocHJvZyxjbWQsX19WQV9BUkdTX18pCisjZW5kaWYKK2ludCBCQl9FWEVDVlBfb3JfZGllKGNoYXIgKiphcmd2KSBOT1JFVFVSTiBGQVNUX0ZVTkM7CisKKy8qIHh2Zm9yaygpIGNhbid0IGJlIGEgX2Z1bmN0aW9uXywgcmV0dXJuIGFmdGVyIHZmb3JrIG1hbmdsZXMgc3RhY2sKKyAqIGluIHRoZSBwYXJlbnQuIEl0IG11c3QgYmUgYSBtYWNyby4gKi8KKyNkZWZpbmUgeHZmb3JrKCkgXAorKHsgXAorCXBpZF90IGJiX194dmZvcmtfcGlkID0gdmZvcmsoKTsgXAorCWlmIChiYl9feHZmb3JrX3BpZCA8IDApIFwKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJ2Zm9yayIpOyBcCisJYmJfX3h2Zm9ya19waWQ7IFwKK30pCisjaWYgQkJfTU1VCitwaWRfdCB4Zm9yayh2b2lkKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworLyogTk9NTVUgZnJpZW5keSBmb3JrK2V4ZWM6ICovCitwaWRfdCBzcGF3bihjaGFyICoqYXJndikgRkFTVF9GVU5DOworcGlkX3QgeHNwYXduKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisKK3BpZF90IHNhZmVfd2FpdHBpZChwaWRfdCBwaWQsIGludCAqd3N0YXQsIGludCBvcHRpb25zKSBGQVNUX0ZVTkM7CitwaWRfdCB3YWl0X2FueV9ub2hhbmcoaW50ICp3c3RhdCkgRkFTVF9GVU5DOworLyogd2FpdDRwaWQ6IHVubGlrZSB3YWl0cGlkLCB3YWl0cyBPTkxZIGZvciBvbmUgcHJvY2Vzcy4KKyAqIFJldHVybnMgc2lnICsgMHgxODAgaWYgY2hpbGQgaXMga2lsbGVkIGJ5IHNpZ25hbC4KKyAqIEl0J3Mgc2FmZSB0byBwYXNzIG5lZ2F0aXZlICdwaWRzJyBmcm9tIGZhaWxlZCBbdl1mb3JrIC0KKyAqIHdhaXQ0cGlkIHdpbGwgcmV0dXJuIC0xIChhbmQgd2lsbCBub3QgY2xvYmJlciBbdl1mb3JrJ3MgZXJybm8pLgorICogSU9XOiByYyA9IHdhaXQ0cGlkKHNwYXduKGFyZ3YpKTsKKyAqICAgICAgaWYgKHJjIDwgMCkgYmJfcGVycm9yX21zZygiJXMiLCBhcmd2WzBdKTsKKyAqICAgICAgaWYgKHJjID4gMCkgYmJfZXJyb3JfbXNnKCJleGl0IGNvZGU6ICVkIiwgcmMgJiAweGZmKTsKKyAqLworaW50IHdhaXQ0cGlkKHBpZF90IHBpZCkgRkFTVF9GVU5DOworLyogU2FtZSBhcyB3YWl0NHBpZChzcGF3bihhcmd2KSksIGJ1dCB3aXRoIE5PRk9SSy9OT0VYRUMgaWYgY29uZmlndXJlZDogKi8KK2ludCBzcGF3bl9hbmRfd2FpdChjaGFyICoqYXJndikgRkFTVF9GVU5DOworLyogRG9lcyBOT1QgY2hlY2sgdGhhdCBhcHBsZXQgaXMgTk9GT1JLLCBqdXN0IGJsaW5kbHkgcnVucyBpdCAqLworaW50IHJ1bl9ub2ZvcmtfYXBwbGV0KGludCBhcHBsZXRfbm8sIGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisKKy8qIEhlbHBlcnMgZm9yIGRhZW1vbml6YXRpb24uCisgKgorICogYmJfZGFlbW9uaXplKGZsYWdzKSA9IGRhZW1vbml6ZSwgZG9lcyBub3QgY29tcGlsZSBvbiBOT01NVQorICoKKyAqIGJiX2RhZW1vbml6ZV9vcl9yZXhlYyhmbGFncywgYXJndikgPSBkYWVtb25pemVzIG9uIE1NVSAoYW5kIGlnbm9yZXMgYXJndiksCisgKiAgICAgIHJleGVjJ3MgaXRzZWxmIG9uIE5PTU1VIHdpdGggYXJndiBwYXNzZWQgYXMgY29tbWFuZCBsaW5lLgorICogVGh1cyBiYl9kYWVtb25pemVfb3JfcmV4ZWMgbWF5IGNhdXNlIHlvdXIgPGFwcGxldD5fbWFpbigpIHRvIGJlIHJlLWV4ZWN1dGVkCisgKiBmcm9tIHRoZSBzdGFydC4gKEl0IHdpbGwgZGV0ZWN0IGl0IGFuZCBub3QgcmVleGVjIGFnYWluIHNlY29uZCB0aW1lKS4KKyAqIFlvdSBoYXZlIHRvIGF1ZGl0IGNhcmVmdWxseSB0aGF0IHlvdSBkb24ndCBkbyBzb21ldGhpbmcgdHdpY2UgYXMgYSByZXN1bHQKKyAqIChvcGVuaW5nIGZpbGVzL3NvY2tldHMsIHBhcnNpbmcgY29uZmlnIGZpbGVzIGV0Yy4uLikhCisgKgorICogQm90aCBvZiB0aGUgYWJvdmUgd2lsbCByZWRpcmVjdCBmZCAwLDEsMiB0byAvZGV2L251bGwgYW5kIGRyb3AgY3R0eQorICogKHdpbGwgZG8gc2V0c2lkKCkpLgorICoKKyAqIGZvcmtfb3JfcmV4ZWMoYXJndikgPSBiYXJlLWJvbmVzIGZvcmsgb24gTU1VLAorICogICAgICAidmZvcmsgKyByZS1leGVjIG91cnNlbGYiIG9uIE5PTU1VLiBObyBmZCByZWRpcmVjdGlvbiwgbm8gc2V0c2lkKCkuCisgKiAgICAgIE9uIE1NVSBpZ25vcmVzIGFyZ3YuCisgKgorICogSGVscGVyIGZvciBuZXR3b3JrIGRhZW1vbnMgaW4gZm9yZWdyb3VuZCBtb2RlOgorICoKKyAqIGJiX3Nhbml0aXplX3N0ZGlvKCkgPSBtYWtlIHN1cmUgdGhhdCBmZCAwLDEsMiBhcmUgb3BlbmVkIGJ5IG9wZW5pbmcgdGhlbQorICogdG8gL2Rldi9udWxsIGlmIHRoZXkgYXJlIG5vdC4KKyAqLworZW51bSB7CisJREFFTU9OX0NIRElSX1JPT1QgPSAxLAorCURBRU1PTl9ERVZOVUxMX1NURElPID0gMiwKKwlEQUVNT05fQ0xPU0VfRVhUUkFfRkRTID0gNCwKKwlEQUVNT05fT05MWV9TQU5JVElaRSA9IDgsIC8qIGludGVybmFsIHVzZSAqLworfTsKKyNpZiBCQl9NTVUKKyAgZW51bSB7IHJlX2V4ZWNlZCA9IDAgfTsKKyMgZGVmaW5lIGZvcmtfb3JfcmV4ZWMoYXJndikgICAgICAgICAgICAgICAgeGZvcmsoKQorIyBkZWZpbmUgYmJfZGFlbW9uaXplX29yX3JleGVjKGZsYWdzLCBhcmd2KSBiYl9kYWVtb25pemVfb3JfcmV4ZWMoZmxhZ3MpCisjIGRlZmluZSBiYl9kYWVtb25pemUoZmxhZ3MpICAgICAgICAgICAgICAgIGJiX2RhZW1vbml6ZV9vcl9yZXhlYyhmbGFncywgYm9ndXMpCisjZWxzZQorICBleHRlcm4gYm9vbCByZV9leGVjZWQ7CisgIHZvaWQgcmVfZXhlYyhjaGFyICoqYXJndikgTk9SRVRVUk4gRkFTVF9GVU5DOworICBwaWRfdCBmb3JrX29yX3JleGVjKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisgIGludCAgQlVHX2ZvcmtfaXNfdW5hdmFpbGFibGVfb25fbm9tbXUodm9pZCkgRkFTVF9GVU5DOworICBpbnQgIEJVR19kYWVtb25faXNfdW5hdmFpbGFibGVfb25fbm9tbXUodm9pZCkgRkFTVF9GVU5DOworICB2b2lkIEJVR19iYl9kYWVtb25pemVfaXNfdW5hdmFpbGFibGVfb25fbm9tbXUodm9pZCkgRkFTVF9GVU5DOworIyBkZWZpbmUgZm9yaygpICAgICAgICAgIEJVR19mb3JrX2lzX3VuYXZhaWxhYmxlX29uX25vbW11KCkKKyMgZGVmaW5lIHhmb3JrKCkgICAgICAgICBCVUdfZm9ya19pc191bmF2YWlsYWJsZV9vbl9ub21tdSgpCisjIGRlZmluZSBkYWVtb24oYSxiKSAgICAgQlVHX2RhZW1vbl9pc191bmF2YWlsYWJsZV9vbl9ub21tdSgpCisjIGRlZmluZSBiYl9kYWVtb25pemUoYSkgQlVHX2JiX2RhZW1vbml6ZV9pc191bmF2YWlsYWJsZV9vbl9ub21tdSgpCisjZW5kaWYKK3ZvaWQgYmJfZGFlbW9uaXplX29yX3JleGVjKGludCBmbGFncywgY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3ZvaWQgYmJfc2FuaXRpemVfc3RkaW8odm9pZCkgRkFTVF9GVU5DOworLyogQ2xlYXIgZGFuZ2Vyb3VzIHN0dWZmLCBzZXQgUEFUSC4gUmV0dXJuIDEgaWYgd2FzIHJ1biBieSBkaWZmZXJlbnQgdXNlci4gKi8KK2ludCBzYW5pdGl6ZV9lbnZfaWZfc3VpZCh2b2lkKSBGQVNUX0ZVTkM7CisKKworY2hhciogc2luZ2xlX2FyZ3YoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBiYl9hcmd2X2Rhc2hbXTsgLyogIi0iLCBOVUxMICovCitleHRlcm4gY29uc3QgY2hhciAqb3B0X2NvbXBsZW1lbnRhcnk7CisjaWYgRU5BQkxFX0xPTkdfT1BUUyB8fCBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworI2RlZmluZSBOb19hcmd1bWVudCAiXDAiCisjZGVmaW5lIFJlcXVpcmVkX2FyZ3VtZW50ICJcMDAxIgorI2RlZmluZSBPcHRpb25hbF9hcmd1bWVudCAiXDAwMiIKK2V4dGVybiBjb25zdCBjaGFyICphcHBsZXRfbG9uZ19vcHRpb25zOworI2VuZGlmCitleHRlcm4gdWludDMyX3Qgb3B0aW9uX21hc2szMjsKK2V4dGVybiB1aW50MzJfdCBnZXRvcHQzMihjaGFyICoqYXJndiwgY29uc3QgY2hhciAqYXBwbGV0X29wdHMsIC4uLikgRkFTVF9GVU5DOworCisKKy8qIEhhdmluZyBuZXh0IHBvaW50ZXIgYXMgYSBmaXJzdCBtZW1iZXIgYWxsb3dzIGVhc3kgY3JlYXRpb24KKyAqIG9mICJsbGlzdC1jb21wYXRpYmxlIiBzdHJ1Y3RzLCBhbmQgdXNpbmcgbGxpc3RfRk9PIGZ1bmN0aW9ucworICogb24gdGhlbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbGxpc3RfdCB7CisJc3RydWN0IGxsaXN0X3QgKmxpbms7CisJY2hhciAqZGF0YTsKK30gbGxpc3RfdDsKK3ZvaWQgbGxpc3RfYWRkX3RvKGxsaXN0X3QgKipvbGRfaGVhZCwgdm9pZCAqZGF0YSkgRkFTVF9GVU5DOwordm9pZCBsbGlzdF9hZGRfdG9fZW5kKGxsaXN0X3QgKipsaXN0X2hlYWQsIHZvaWQgKmRhdGEpIEZBU1RfRlVOQzsKK3ZvaWQgKmxsaXN0X3BvcChsbGlzdF90ICoqZWxtKSBGQVNUX0ZVTkM7Cit2b2lkIGxsaXN0X3VubGluayhsbGlzdF90ICoqaGVhZCwgbGxpc3RfdCAqZWxtKSBGQVNUX0ZVTkM7Cit2b2lkIGxsaXN0X2ZyZWUobGxpc3RfdCAqZWxtLCB2b2lkICgqZnJlZWl0KSh2b2lkICpkYXRhKSkgRkFTVF9GVU5DOworbGxpc3RfdCAqbGxpc3RfcmV2KGxsaXN0X3QgKmxpc3QpIEZBU1RfRlVOQzsKK2xsaXN0X3QgKmxsaXN0X2ZpbmRfc3RyKGxsaXN0X3QgKmZpcnN0LCBjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKKy8qIEJUVywgc3VycHJpc2luZ2x5LCBjaGFuZ2luZyBBUEkgdG8KKyAqICAgbGxpc3RfdCAqbGxpc3RfYWRkX3RvKGxsaXN0X3QgKm9sZF9oZWFkLCB2b2lkICpkYXRhKQorICogZXRjIGRvZXMgbm90IHJlc3VsdCBpbiBzbWFsbGVyIGNvZGUuLi4gKi8KKworLyogc3RhcnRfc3RvcF9kYWVtb24gYW5kIHVkaGNwYyBhcmUgc3BlY2lhbCAtIHRoZXkgd2FudAorICogdG8gY3JlYXRlIHBpZGZpbGVzIHJlZ2FyZGxlc3Mgb2YgRkVBVFVSRV9QSURGSUxFICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfUElERklMRSB8fCBkZWZpbmVkKFdBTlRfUElERklMRSkKKy8qIFRydWUgb25seSBpZiB3ZSBjcmVhdGVkIHBpZGZpbGUgd2hpY2ggaXMgKmZpbGUqLCBub3QgL2Rldi9udWxsIGV0YyAqLworZXh0ZXJuIHNtYWxsaW50IHdyb3RlX3BpZGZpbGU7Cit2b2lkIHdyaXRlX3BpZGZpbGUoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworI2RlZmluZSByZW1vdmVfcGlkZmlsZShwYXRoKSBkbyB7IGlmICh3cm90ZV9waWRmaWxlKSB1bmxpbmsocGF0aCk7IH0gd2hpbGUgKDApCisjZWxzZQorZW51bSB7IHdyb3RlX3BpZGZpbGUgPSAwIH07CisjZGVmaW5lIHdyaXRlX3BpZGZpbGUocGF0aCkgICgodm9pZCkwKQorI2RlZmluZSByZW1vdmVfcGlkZmlsZShwYXRoKSAoKHZvaWQpMCkKKyNlbmRpZgorCitlbnVtIHsKKwlMT0dNT0RFX05PTkUgPSAwLAorCUxPR01PREVfU1RESU8gPSAoMSA8PCAwKSwKKwlMT0dNT0RFX1NZU0xPRyA9ICgxIDw8IDEpICogRU5BQkxFX0ZFQVRVUkVfU1lTTE9HLAorCUxPR01PREVfQk9USCA9IExPR01PREVfU1lTTE9HICsgTE9HTU9ERV9TVERJTywKK307CitleHRlcm4gY29uc3QgY2hhciAqbXNnX2VvbDsKK2V4dGVybiBzbWFsbGludCBsb2dtb2RlOworZXh0ZXJuIGludCBkaWVfc2xlZXA7CitleHRlcm4gdWludDhfdCB4ZnVuY19lcnJvcl9yZXR2YWw7CitleHRlcm4gam1wX2J1ZiBkaWVfam1wOworZXh0ZXJuIHZvaWQgeGZ1bmNfZGllKHZvaWQpIE5PUkVUVVJOIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3Nob3dfdXNhZ2Uodm9pZCkgTk9SRVRVUk4gRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2Vycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9wZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3NpbXBsZV9wZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3BlcnJvcl9tc2dfYW5kX2RpZShjb25zdCBjaGFyICpzLCAuLi4pIF9fYXR0cmlidXRlX18gKChub3JldHVybiwgZm9ybWF0IChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShjb25zdCBjaGFyICpzKSBOT1JFVFVSTiBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9oZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2hlcnJvcl9tc2dfYW5kX2RpZShjb25zdCBjaGFyICpzLCAuLi4pIF9fYXR0cmlidXRlX18gKChub3JldHVybiwgZm9ybWF0IChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfcGVycm9yX25vbXNnX2FuZF9kaWUodm9pZCkgTk9SRVRVUk4gRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfcGVycm9yX25vbXNnKHZvaWQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2luZm9fbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3ZlcnJvcl9tc2coY29uc3QgY2hhciAqcywgdmFfbGlzdCBwLCBjb25zdCBjaGFyICpzdHJlcnIpIEZBU1RfRlVOQzsKKworLyogV2UgbmVlZCB0byBleHBvcnQgWFhYX21haW4gZnJvbSBsaWJidXN5Ym94CisgKiBvbmx5IGlmIHdlIGJ1aWxkICJpbmRpdmlkdWFsIiBiaW5hcmllcworICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5ESVZJRFVBTAorI2RlZmluZSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRSBFWFRFUk5BTExZX1ZJU0lCTEUKKyNlbHNlCisjZGVmaW5lIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFCisjZW5kaWYKKworCisvKiBBcHBsZXRzIHdoaWNoIGFyZSB1c2VmdWwgZnJvbSBhbm90aGVyIGFwcGxldHMgKi8KK2ludCBiYl9jYXQoY2hhcioqIGFyZ3YpOworLyogSWYgc2hlbGwgbmVlZHMgdGhlbSwgdGhleSBleGlzdCBldmVuIGlmIG5vdCBlbmFibGVkIGFzIGFwcGxldHMgKi8KK2ludCBlY2hvX21haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSBJRl9FQ0hPKE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFKTsKK2ludCBwcmludGZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIElGX1BSSU5URihNQUlOX0VYVEVSTkFMTFlfVklTSUJMRSk7CitpbnQgdGVzdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgSUZfVEVTVChNQUlOX0VYVEVSTkFMTFlfVklTSUJMRSk7CitpbnQga2lsbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgSUZfS0lMTChNQUlOX0VYVEVSTkFMTFlfVklTSUJMRSk7CisvKiBTaW1pbGFyLCBidXQgdXNlZCBieSBjaGdycCwgbm90IHNoZWxsICovCitpbnQgY2hvd25fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIElGX0NIT1dOKE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFKTsKKy8qIFVzZWQgYnkgZnRwZCAqLworaW50IGxzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBJRl9MUyhNQUlOX0VYVEVSTkFMTFlfVklTSUJMRSk7CisvKiBEb24ndCBuZWVkIElGX3h4eCgpIGd1YXJkIGZvciB0aGVzZSAqLworaW50IGd1bnppcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYnVuemlwMl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CisKKyNpZiBFTkFCTEVfUk9VVEUKK3ZvaWQgYmJfZGlzcGxheXJvdXRlcyhpbnQgbm9yZXNvbHZlLCBpbnQgbmV0c3RhdGZtdCkgRkFTVF9GVU5DOworI2VuZGlmCisKKworLyogTmV0d29ya2luZyAqLworaW50IGNyZWF0ZV9pY21wX3NvY2tldCh2b2lkKSBGQVNUX0ZVTkM7CitpbnQgY3JlYXRlX2ljbXA2X3NvY2tldCh2b2lkKSBGQVNUX0ZVTkM7CisvKiBpbnRlcmZhY2UuYyAqLworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBwcm90b2NvbCBmYW1pbGllcyBhbmQgdGhlaXIgaGFuZGxlcnMuICovCitzdHJ1Y3QgYWZ0eXBlIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnRpdGxlOworCWludCBhZjsKKwlpbnQgYWxlbjsKKwljaGFyKiAgICAgICBGQVNUX0ZVTkMgKCpwcmludCkodW5zaWduZWQgY2hhciAqKTsKKwljb25zdCBjaGFyKiBGQVNUX0ZVTkMgKCpzcHJpbnQpKHN0cnVjdCBzb2NrYWRkciAqLCBpbnQgbnVtZXJpYyk7CisJaW50ICAgICAgICAgRkFTVF9GVU5DICgqaW5wdXQpKC8qaW50IHR5cGUsKi8gY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICopOworCXZvaWQgICAgICAgIEZBU1RfRlVOQyAoKmhlcnJvcikoY2hhciAqdGV4dCk7CisJaW50ICAgICAgICAgRkFTVF9GVU5DICgqcnByaW50KShpbnQgb3B0aW9ucyk7CisJaW50ICAgICAgICAgRkFTVF9GVU5DICgqcmlucHV0KShpbnQgdHlwLCBpbnQgZXh0LCBjaGFyICoqYXJndik7CisJLyogbWF5IG1vZGlmeSBzcmMgKi8KKwlpbnQgICAgICAgICBGQVNUX0ZVTkMgKCpnZXRtYXNrKShjaGFyICpzcmMsIHN0cnVjdCBzb2NrYWRkciAqbWFzaywgY2hhciAqbmFtZSk7Cit9OworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBoYXJkd2FyZSBwcm90b2NvbHMgYW5kIHRoZWlyIGhhbmRsZXJzLiAqLworc3RydWN0IGh3dHlwZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICp0aXRsZTsKKwlpbnQgdHlwZTsKKwlpbnQgYWxlbjsKKwljaGFyKiBGQVNUX0ZVTkMgKCpwcmludCkodW5zaWduZWQgY2hhciAqKTsKKwlpbnQgICBGQVNUX0ZVTkMgKCppbnB1dCkoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHIgKik7CisJaW50ICAgRkFTVF9GVU5DICgqYWN0aXZhdGUpKGludCBmZCk7CisJaW50IHN1cHByZXNzX251bGxfYWRkcjsKK307CitleHRlcm4gc21hbGxpbnQgaW50ZXJmYWNlX29wdF9hOworaW50IGRpc3BsYXlfaW50ZXJmYWNlcyhjaGFyICppZm5hbWUpIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0lCCitpbnQgaW5faWIoY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApIEZBU1RfRlVOQzsKKyNlbHNlCisjZGVmaW5lIGluX2liKGEsIGIpIDEgLyogZmFpbCAqLworI2VuZGlmCitjb25zdCBzdHJ1Y3QgYWZ0eXBlICpnZXRfYWZ0eXBlKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK2NvbnN0IHN0cnVjdCBod3R5cGUgKmdldF9od3R5cGUoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworY29uc3Qgc3RydWN0IGh3dHlwZSAqZ2V0X2h3bnR5cGUoaW50IHR5cGUpIEZBU1RfRlVOQzsKKworCisjaWZuZGVmIEJVSUxEX0lORElWSURVQUwKK2V4dGVybiBpbnQgZmluZF9hcHBsZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7CisvKiBSZXR1cm5zIG9ubHkgaWYgYXBwbGV0IGlzIG5vdCBmb3VuZC4gKi8KK2V4dGVybiB2b2lkIHJ1bl9hcHBsZXRfYW5kX2V4aXQoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoaW50IGEsIGNoYXIgKiphcmd2KSBOT1JFVFVSTiBGQVNUX0ZVTkM7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTU5URU5UX0gKK2V4dGVybiBpbnQgbWF0Y2hfZnN0eXBlKGNvbnN0IHN0cnVjdCBtbnRlbnQgKm10LCBjb25zdCBjaGFyICpmc3R5cGVzKSBGQVNUX0ZVTkM7CitleHRlcm4gc3RydWN0IG1udGVudCAqZmluZF9tb3VudF9wb2ludChjb25zdCBjaGFyICpuYW1lLCBpbnQgc3ViZGlyX3RvbykgRkFTVF9GVU5DOworI2VuZGlmCitleHRlcm4gdm9pZCBlcmFzZV9tdGFiKGNvbnN0IGNoYXIgKiBuYW1lKSBGQVNUX0ZVTkM7CitleHRlcm4gdW5zaWduZWQgaW50IHR0eV9iYXVkX3RvX3ZhbHVlKHNwZWVkX3Qgc3BlZWQpIEZBU1RfRlVOQzsKK2V4dGVybiBzcGVlZF90IHR0eV92YWx1ZV90b19iYXVkKHVuc2lnbmVkIGludCB2YWx1ZSkgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9ERVNLVE9QCitleHRlcm4gdm9pZCBiYl93YXJuX2lnbm9yaW5nX2FyZ3MoY2hhciAqYXJnKSBGQVNUX0ZVTkM7CisjZWxzZQorIyBkZWZpbmUgYmJfd2Fybl9pZ25vcmluZ19hcmdzKGFyZykgKCh2b2lkKTApCisjZW5kaWYKKworZXh0ZXJuIGludCBnZXRfbGludXhfdmVyc2lvbl9jb2RlKHZvaWQpIEZBU1RfRlVOQzsKKworZXh0ZXJuIGNoYXIgKnF1ZXJ5X2xvb3AoY29uc3QgY2hhciAqZGV2aWNlKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGRlbF9sb29wKGNvbnN0IGNoYXIgKmRldmljZSkgRkFTVF9GVU5DOworLyogSWYgKmRldm5hbWUgaXMgbm90IE5VTEwsIHVzZSB0aGF0IG5hbWUsIG90aGVyd2lzZSB0cnkgdG8gZmluZCBmcmVlIG9uZSwKKyAqIG1hbGxvYyBhbmQgcmV0dXJuIGl0IGluICpkZXZuYW1lLgorICogcmV0dXJuIHZhbHVlOiAxOiByZWFkLW9ubHkgbG9vcGRldiB3YXMgc2V0dXAsIDA6IHJ3LCA8IDA6IGVycm9yICovCitleHRlcm4gaW50IHNldF9sb29wKGNoYXIgKipkZXZuYW1lLCBjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0KSBGQVNUX0ZVTkM7CisKKy8qIExpa2UgYmJfYXNrIGJlbG93LCBidXQgYXNrcyBvbiBzdGRpbiB3aXRoIG5vIHRpbWVvdXQuICAqLworY2hhciAqYmJfYXNrX3N0ZGluKGNvbnN0IGNoYXIgKiBwcm9tcHQpIEZBU1RfRlVOQzsKKy8vVE9ETzogcGFzcyBidWYgcG9pbnRlciBvciByZXR1cm4gYWxsb2NhdGVkIGJ1ZiAoYXZvaWQgc3RhdGljcyk/CitjaGFyICpiYl9hc2soY29uc3QgaW50IGZkLCBpbnQgdGltZW91dCwgY29uc3QgY2hhciAqIHByb21wdCkgRkFTVF9GVU5DOworaW50IGJiX2Fza19jb25maXJtYXRpb24odm9pZCkgRkFTVF9GVU5DOworCitpbnQgYmJfcGFyc2VfbW9kZShjb25zdCBjaGFyKiBzLCBtb2RlX3QqIHRoZU1vZGUpIEZBU1RfRlVOQzsKKworLyoKKyAqIENvbmZpZyBmaWxlIHBhcnNlcgorICovCitlbnVtIHsKKwlQQVJTRV9DT0xMQVBTRSAgPSAweDAwMDEwMDAwLCAvLyB0cmVhdCBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFzIG9uZQorCVBBUlNFX1RSSU0gICAgICA9IDB4MDAwMjAwMDAsIC8vIHRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgZGVsaW1pdGVycworLy8gVE9ETzogQ09MTEFQU0UgYW5kIFRSSU0gc2VlbSB0byBhbHdheXMgZ28gaW4gcGFpcgorCVBBUlNFX0dSRUVEWSAgICA9IDB4MDAwNDAwMDAsIC8vIGxhc3QgdG9rZW4gdGFrZXMgZW50aXJlIHJlbWFpbmRlciBvZiB0aGUgbGluZQorCVBBUlNFX01JTl9ESUUgICA9IDB4MDAxMDAwMDAsIC8vIGRpZSBpZiA8IG1pbiB0b2tlbnMgZm91bmQKKwkvLyBrZWVwIGEgY29weSBvZiBjdXJyZW50IGxpbmUKKwlQQVJTRV9LRUVQX0NPUFkgPSAweDAwMjAwMDAwICogRU5BQkxFX0ZFQVRVUkVfQ1JPTkRfRCwKKy8vCVBBUlNFX0VTQ0FQRSAgICA9IDB4MDA0MDAwMDAsIC8vIHByb2Nlc3MgZXNjYXBlIHNlcXVlbmNlcyBpbiB0b2tlbnMKKwkvLyBOT1JNQUwgaXM6CisJLy8gKiByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgZGVsaW1pdGVycyBhbmQgY29sbGFwc2UKKwkvLyAgIG11bHRpcGxlIGRlbGltaXRlcnMgaW50byBvbmUKKwkvLyAqIHdhcm4gYW5kIGNvbnRpbnVlIGlmIGxlc3MgdGhhbiBtaW50b2tlbnMgZGVsaW1pdGVycyBmb3VuZAorCS8vICogZ3JhYiBldmVyeXRoaW5nIGludG8gbGFzdCB0b2tlbgorCVBBUlNFX05PUk1BTCAgICA9IFBBUlNFX0NPTExBUFNFIHwgUEFSU0VfVFJJTSB8IFBBUlNFX0dSRUVEWSwKK307Cit0eXBlZGVmIHN0cnVjdCBwYXJzZXJfdCB7CisJRklMRSAqZnA7CisJY2hhciAqZGF0YTsKKwljaGFyICpsaW5lLCAqbmxpbmU7CisJc2l6ZV90IGxpbmVfYWxsb2MsIG5saW5lX2FsbG9jOworCWludCBsaW5lbm87Cit9IHBhcnNlcl90OworcGFyc2VyX3QqIGNvbmZpZ19vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBGQVNUX0ZVTkM7CitwYXJzZXJfdCogY29uZmlnX29wZW4yKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBGSUxFKiBGQVNUX0ZVTkMgKCpmb3Blbl9mdW5jKShjb25zdCBjaGFyICpwYXRoKSkgRkFTVF9GVU5DOworLyogZGVsaW1zWzBdIGlzIGEgY29tbWVudCBjaGFyICh1c2UgJ1wwJyB0byBkaXNhYmxlKSwgdGhlIHJlc3QgYXJlIHRva2VuIGRlbGltaXRlcnMgKi8KK2ludCBjb25maWdfcmVhZChwYXJzZXJfdCAqcGFyc2VyLCBjaGFyICoqdG9rZW5zLCB1bnNpZ25lZCBmbGFncywgY29uc3QgY2hhciAqZGVsaW1zKSBGQVNUX0ZVTkM7CisjZGVmaW5lIGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCBtYXgsIG1pbiwgc3RyLCBmbGFncykgXAorCWNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCAoKGZsYWdzKSB8ICgoKG1pbikgJiAweEZGKSA8PCA4KSB8ICgobWF4KSAmIDB4RkYpKSwgc3RyKQordm9pZCBjb25maWdfY2xvc2UocGFyc2VyX3QgKnBhcnNlcikgRkFTVF9GVU5DOworCisvKiBDb25jYXRlbmF0ZSBwYXRoIGFuZCBmaWxlbmFtZSB0byBuZXcgYWxsb2NhdGVkIGJ1ZmZlci4KKyAqIEFkZCAiLyIgb25seSBhcyBuZWVkZWQgKG5vIGR1cGxpY2F0ZSAiLy8iIGFyZSBwcm9kdWNlZCkuCisgKiBJZiBwYXRoIGlzIE5VTEwsIGl0IGlzIGFzc3VtZWQgdG8gYmUgIi8iLgorICogZmlsZW5hbWUgc2hvdWxkIG5vdCBiZSBOVUxMLiAqLworY2hhciAqY29uY2F0X3BhdGhfZmlsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworLyogUmV0dXJucyBOVUxMIG9uIC4gYW5kIC4uICovCitjaGFyICpjb25jYXRfc3VicGF0aF9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBGQVNUX0ZVTkM7CisKKworaW50IGJiX21ha2VfZGlyZWN0b3J5KGNoYXIgKnBhdGgsIGxvbmcgbW9kZSwgaW50IGZsYWdzKSBGQVNUX0ZVTkM7CisKK2ludCBnZXRfc2lnbnVtKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK2NvbnN0IGNoYXIgKmdldF9zaWduYW1lKGludCBudW1iZXIpIEZBU1RfRlVOQzsKK3ZvaWQgcHJpbnRfc2lnbmFtZXModm9pZCkgRkFTVF9GVU5DOworCitjaGFyICpiYl9zaW1wbGlmeV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKKy8qIFJldHVybnMgcHRyIHRvIE5VTCAqLworY2hhciAqYmJfc2ltcGxpZnlfYWJzX3BhdGhfaW5wbGFjZShjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CisKKyNkZWZpbmUgTE9HSU5fRkFJTF9ERUxBWSAzCitleHRlcm4gdm9pZCBiYl9kb19kZWxheShpbnQgc2Vjb25kcykgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgY2hhbmdlX2lkZW50aXR5KGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBydW5fc2hlbGwoY29uc3QgY2hhciAqc2hlbGwsIGludCBsb2dpbnNoZWxsLCBjb25zdCBjaGFyICpjb21tYW5kLCBjb25zdCBjaGFyICoqYWRkaXRpb25hbF9hcmdzKSBOT1JFVFVSTiBGQVNUX0ZVTkM7CisKKy8qIFJldHVybnMgJFNIRUxMLCBnZXRwd3VpZChnZXR1aWQoKSktPnB3X3NoZWxsLCBvciBERUZBVUxUX1NIRUxMLgorICogTm90ZSB0aGF0IGdldHB3dWlkIHJlc3VsdCBtaWdodCBuZWVkIHhzdHJkdXAnaW5nCisgKiBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mIGludGVydmVuaW5nIGdldHB3eHh4KCkgY2FsbHMuCisgKi8KK2NvbnN0IGNoYXIgKmdldF9zaGVsbF9uYW1lKHZvaWQpOworCisjaWYgRU5BQkxFX1NFTElOVVgKK2V4dGVybiB2b2lkIHJlbmV3X2N1cnJlbnRfc2VjdXJpdHlfY29udGV4dCh2b2lkKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBzZXRfY3VycmVudF9zZWN1cml0eV9jb250ZXh0KHNlY3VyaXR5X2NvbnRleHRfdCBzaWQpIEZBU1RfRlVOQzsKK2V4dGVybiBjb250ZXh0X3Qgc2V0X3NlY3VyaXR5X2NvbnRleHRfY29tcG9uZW50KHNlY3VyaXR5X2NvbnRleHRfdCBjdXJfY29udGV4dCwKKwkJCQkJCWNoYXIgKnVzZXIsIGNoYXIgKnJvbGUsIGNoYXIgKnR5cGUsIGNoYXIgKnJhbmdlKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBzZXRmc2NyZWF0ZWNvbl9vcl9kaWUoc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0KSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBzZWxpbnV4X3ByZXNlcnZlX2Zjb250ZXh0KGludCBmZGVzYykgRkFTVF9GVU5DOworI2Vsc2UKKyNkZWZpbmUgc2VsaW51eF9wcmVzZXJ2ZV9mY29udGV4dChmZGVzYykgKCh2b2lkKTApCisjZW5kaWYKK2V4dGVybiB2b2lkIHNlbGludXhfb3JfZGllKHZvaWQpIEZBU1RfRlVOQzsKKworCisvKiBzeXN0ZW1kIHN1cHBvcnQgKi8KKyNkZWZpbmUgU0RfTElTVEVOX0ZEU19TVEFSVCAzCitpbnQgc2RfbGlzdGVuX2Zkcyh2b2lkKTsKKworCisvKiBzZXR1cF9lbnZpcm9ubWVudDoKKyAqIGlmIGNoZGlyIHB3LT5wd19kaXI6IG9rOiBlbHNlIGlmIHRvX3RtcCA9PSAxOiBnb3RvIC90bXAgZWxzZTogZ290byAvIG9yIGRpZQorICogaWYgY2xlYXJfZW52ID0gMTogY2QocHctPnB3X2RpciksIGNsZWFyIGVudmlyb25tZW50LCB0aGVuIHNldAorICogICBURVJNPShvbGQgdmFsdWUpCisgKiAgIFVTRVI9cHctPnB3X25hbWUsIExPR05BTUU9cHctPnB3X25hbWUKKyAqICAgUEFUSD1iYl9kZWZhdWx0X1tyb290X11wYXRoCisgKiAgIEhPTUU9cHctPnB3X2RpcgorICogICBTSEVMTD1zaGVsbAorICogZWxzZSBpZiBjaGFuZ2VfZW52ID0gMToKKyAqICAgaWYgbm90IHJvb3QgKGlmIHB3LT5wd191aWQgIT0gMCk6CisgKiAgICAgVVNFUj1wdy0+cHdfbmFtZSwgTE9HTkFNRT1wdy0+cHdfbmFtZQorICogICBIT01FPXB3LT5wd19kaXIKKyAqICAgU0hFTEw9c2hlbGwKKyAqIGVsc2UgZG9lcyBub3RoaW5nCisgKi8KKyNkZWZpbmUgU0VUVVBfRU5WX0NIQU5HRUVOViAoMSA8PCAwKQorI2RlZmluZSBTRVRVUF9FTlZfQ0xFQVJFTlYgICgxIDw8IDEpCisjZGVmaW5lIFNFVFVQX0VOVl9UT19UTVAgICAgKDEgPDwgMikKK2V4dGVybiB2b2lkIHNldHVwX2Vudmlyb25tZW50KGNvbnN0IGNoYXIgKnNoZWxsLCBpbnQgZmxhZ3MsIGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGNvcnJlY3RfcGFzc3dvcmQoY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpIEZBU1RfRlVOQzsKKy8qIFJldHVybnMgYSBtYWxsb2NlZCBzdHJpbmcgKi8KKyNpZiAhRU5BQkxFX1VTRV9CQl9DUllQVAorI2RlZmluZSBwd19lbmNyeXB0KGNsZWFyLCBzYWx0LCBjbGVhbnVwKSBwd19lbmNyeXB0KGNsZWFyLCBzYWx0KQorI2VuZGlmCitleHRlcm4gY2hhciAqcHdfZW5jcnlwdChjb25zdCBjaGFyICpjbGVhciwgY29uc3QgY2hhciAqc2FsdCwgaW50IGNsZWFudXApIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgb2JzY3VyZShjb25zdCBjaGFyICpvbGQsIGNvbnN0IGNoYXIgKm5ld3ZhbCwgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHdkcCkgRkFTVF9GVU5DOworLyoKKyAqIHJuZCBpcyBhZGRpdGlvbmFsIHJhbmRvbSBpbnB1dC4gTmV3IG9uZSBpcyByZXR1cm5lZC4KKyAqIFVzZWZ1bCBpZiB5b3UgY2FsbCBjcnlwdF9tYWtlX3NhbHQgbWFueSB0aW1lcyBpbiBhIHJvdzoKKyAqIHJuZCA9IGNyeXB0X21ha2Vfc2FsdChidWYxLCA0LCAwKTsKKyAqIHJuZCA9IGNyeXB0X21ha2Vfc2FsdChidWYyLCA0LCBybmQpOworICogcm5kID0gY3J5cHRfbWFrZV9zYWx0KGJ1ZjMsIDQsIHJuZCk7CisgKiAob3RoZXJ3aXNlIHdlIHJpc2sgaGF2aW5nIHNhbWUgc2FsdCBnZW5lcmF0ZWQpCisgKi8KK2V4dGVybiBpbnQgY3J5cHRfbWFrZV9zYWx0KGNoYXIgKnAsIGludCBjbnQgLyosIGludCBybmQqLykgRkFTVF9GVU5DOworLyogIiROJCIgKyBzaGFfc2FsdF8xNl9ieXRlcyArIE5VTCAqLworI2RlZmluZSBNQVhfUFdfU0FMVF9MRU4gKDMgKyAxNiArIDEpCitleHRlcm4gY2hhciogY3J5cHRfbWFrZV9wd19zYWx0KGNoYXIgcFtNQVhfUFdfU0FMVF9MRU5dLCBjb25zdCBjaGFyICphbGdvKSBGQVNUX0ZVTkM7CisKKworLyogUmV0dXJucyBudW1iZXIgb2YgbGluZXMgY2hhbmdlZCwgb3IgLTEgb24gZXJyb3IgKi8KKyNpZiAhKEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgfHwgRU5BQkxFX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUCkKKyNkZWZpbmUgdXBkYXRlX3Bhc3N3ZChmaWxlbmFtZSwgdXNlcm5hbWUsIGRhdGEsIG1lbWJlcikgXAorCXVwZGF0ZV9wYXNzd2QoZmlsZW5hbWUsIHVzZXJuYW1lLCBkYXRhKQorI2VuZGlmCitleHRlcm4gaW50IHVwZGF0ZV9wYXNzd2QoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCWNvbnN0IGNoYXIgKnVzZXJuYW1lLAorCQljb25zdCBjaGFyICpkYXRhLAorCQljb25zdCBjaGFyICptZW1iZXIpIEZBU1RfRlVOQzsKKworaW50IGluZGV4X2luX3N0cl9hcnJheShjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5KSBGQVNUX0ZVTkM7CitpbnQgaW5kZXhfaW5fc3RyaW5ncyhjb25zdCBjaGFyICpzdHJpbmdzLCBjb25zdCBjaGFyICprZXkpIEZBU1RfRlVOQzsKK2ludCBpbmRleF9pbl9zdWJzdHJfYXJyYXkoY29uc3QgY2hhciAqY29uc3Qgc3RyaW5nX2FycmF5W10sIGNvbnN0IGNoYXIgKmtleSkgRkFTVF9GVU5DOworaW50IGluZGV4X2luX3N1YnN0cmluZ3MoY29uc3QgY2hhciAqc3RyaW5ncywgY29uc3QgY2hhciAqa2V5KSBGQVNUX0ZVTkM7Citjb25zdCBjaGFyICpudGhfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZ3MsIGludCBuKSBGQVNUX0ZVTkM7CisKK2V4dGVybiB2b2lkIHByaW50X2xvZ2luX2lzc3VlKGNvbnN0IGNoYXIgKmlzc3VlX2ZpbGUsIGNvbnN0IGNoYXIgKnR0eSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgcHJpbnRfbG9naW5fcHJvbXB0KHZvaWQpIEZBU1RfRlVOQzsKKworY2hhciAqeG1hbGxvY190dHluYW1lKGludCBmZCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogTkI6IHR5cGljYWxseSB5b3Ugd2FudCB0byBwYXNzIGZkIDAsIG5vdCAxLiBUaGluayAnYXBwbGV0IHwgZ3JlcCBzb21ldGhpbmcnICovCitpbnQgZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChpbnQgZmQsIHVuc2lnbmVkICp3aWR0aCwgdW5zaWduZWQgKmhlaWdodCkgRkFTVF9GVU5DOworCitpbnQgdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coY29uc3Qgc3RydWN0IHRlcm1pb3MgKnRwKSBGQVNUX0ZVTkM7CisKKy8qIE5COiAidW5zaWduZWQgcmVxdWVzdCIgaXMgY3J1Y2lhbCEgImludCByZXF1ZXN0IiB3aWxsIGJyZWFrIHNvbWUgYXJjaGVzISAqLworaW50IGlvY3RsX29yX3BlcnJvcihpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3AsIGNvbnN0IGNoYXIgKmZtdCwuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKSBGQVNUX0ZVTkM7CitpbnQgaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICpmbXQsLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSkgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9JT0NUTF9IRVgyU1RSX0VSUk9SCitpbnQgYmJfaW9jdGxfb3Jfd2FybihpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3AsIGNvbnN0IGNoYXIgKmlvY3RsX25hbWUpIEZBU1RfRlVOQzsKK2ludCBiYl94aW9jdGwoaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICppb2N0bF9uYW1lKSBGQVNUX0ZVTkM7CisjZGVmaW5lIGlvY3RsX29yX3dhcm4oZmQscmVxdWVzdCxhcmdwKSBiYl9pb2N0bF9vcl93YXJuKGZkLHJlcXVlc3QsYXJncCwjcmVxdWVzdCkKKyNkZWZpbmUgeGlvY3RsKGZkLHJlcXVlc3QsYXJncCkgICAgICAgIGJiX3hpb2N0bChmZCxyZXF1ZXN0LGFyZ3AsI3JlcXVlc3QpCisjZWxzZQoraW50IGJiX2lvY3RsX29yX3dhcm4oaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwKSBGQVNUX0ZVTkM7CitpbnQgYmJfeGlvY3RsKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCkgRkFTVF9GVU5DOworI2RlZmluZSBpb2N0bF9vcl93YXJuKGZkLHJlcXVlc3QsYXJncCkgYmJfaW9jdGxfb3Jfd2FybihmZCxyZXF1ZXN0LGFyZ3ApCisjZGVmaW5lIHhpb2N0bChmZCxyZXF1ZXN0LGFyZ3ApICAgICAgICBiYl94aW9jdGwoZmQscmVxdWVzdCxhcmdwKQorI2VuZGlmCisKK2NoYXIgKmlzX2luX2lub19kZXZfaGFzaHRhYmxlKGNvbnN0IHN0cnVjdCBzdGF0ICpzdGF0YnVmKSBGQVNUX0ZVTkM7Cit2b2lkIGFkZF90b19pbm9fZGV2X2hhc2h0YWJsZShjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiwgY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOwordm9pZCByZXNldF9pbm9fZGV2X2hhc2h0YWJsZSh2b2lkKSBGQVNUX0ZVTkM7CisjaWZkZWYgX19HTElCQ19fCisvKiBBdCBsZWFzdCBnbGliYyBoYXMgaG9ycmVuZG91c2x5IGxhcmdlIGlubGluZSBmb3IgdGhpcywgc28gd3JhcCBpdCAqLwordW5zaWduZWQgbG9uZyBsb25nIGJiX21ha2VkZXYodW5zaWduZWQgbWFqb3IsIHVuc2lnbmVkIG1pbm9yKSBGQVNUX0ZVTkM7CisjdW5kZWYgbWFrZWRldgorI2RlZmluZSBtYWtlZGV2KGEsYikgYmJfbWFrZWRldihhLGIpCisjZW5kaWYKKworCisvKiAiS2V5Y29kZXMiIHRoYXQgcmVwb3J0IGFuIGVzY2FwZSBzZXF1ZW5jZS4KKyAqIFdlIHVzZSBzb21ldGhpbmcgd2hpY2ggZml0cyBpbnRvIHNpZ25lZCBjaGFyLAorICogeWV0IGRvZXNuJ3QgcmVwcmVzZW50IGFueSB2YWxpZCBVbmljb2RlIGNoYXJhY3Rlci4KKyAqIEFsc28sIC0xIGlzIHJlc2VydmVkIGZvciBlcnJvciBpbmRpY2F0aW9uIGFuZCB3ZSBkb24ndCB1c2UgaXQuICovCitlbnVtIHsKKwlLRVlDT0RFX1VQICAgICAgID0gIC0yLAorCUtFWUNPREVfRE9XTiAgICAgPSAgLTMsCisJS0VZQ09ERV9SSUdIVCAgICA9ICAtNCwKKwlLRVlDT0RFX0xFRlQgICAgID0gIC01LAorCUtFWUNPREVfSE9NRSAgICAgPSAgLTYsCisJS0VZQ09ERV9FTkQgICAgICA9ICAtNywKKwlLRVlDT0RFX0lOU0VSVCAgID0gIC04LAorCUtFWUNPREVfREVMRVRFICAgPSAgLTksCisJS0VZQ09ERV9QQUdFVVAgICA9IC0xMCwKKwlLRVlDT0RFX1BBR0VET1dOID0gLTExLAorCisJS0VZQ09ERV9DVFJMX1VQICAgID0gS0VZQ09ERV9VUCAgICAmIH4weDQwLAorCUtFWUNPREVfQ1RSTF9ET1dOICA9IEtFWUNPREVfRE9XTiAgJiB+MHg0MCwKKwlLRVlDT0RFX0NUUkxfUklHSFQgPSBLRVlDT0RFX1JJR0hUICYgfjB4NDAsCisJS0VZQ09ERV9DVFJMX0xFRlQgID0gS0VZQ09ERV9MRUZUICAmIH4weDQwLAorI2lmIDAKKwlLRVlDT0RFX0ZVTjEgICAgID0gLTEyLAorCUtFWUNPREVfRlVOMiAgICAgPSAtMTMsCisJS0VZQ09ERV9GVU4zICAgICA9IC0xNCwKKwlLRVlDT0RFX0ZVTjQgICAgID0gLTE1LAorCUtFWUNPREVfRlVONSAgICAgPSAtMTYsCisJS0VZQ09ERV9GVU42ICAgICA9IC0xNywKKwlLRVlDT0RFX0ZVTjcgICAgID0gLTE4LAorCUtFWUNPREVfRlVOOCAgICAgPSAtMTksCisJS0VZQ09ERV9GVU45ICAgICA9IC0yMCwKKwlLRVlDT0RFX0ZVTjEwICAgID0gLTIxLAorCUtFWUNPREVfRlVOMTEgICAgPSAtMjIsCisJS0VZQ09ERV9GVU4xMiAgICA9IC0yMywKKyNlbmRpZgorCUtFWUNPREVfQ1VSU09SX1BPUyA9IC0weDEwMCwgLyogMHhmZmYuLmZmZjAwICovCisJLyogSG93IGxvbmcgaXMgdGhlIGxvbmdlc3QgRVNDIHNlcXVlbmNlIHdlIGtub3c/CisJICogV2Ugd2FudCBpdCBiaWcgZW5vdWdoIHRvIGJlIGFibGUgdG8gY29udGFpbgorCSAqIGN1cnNvciBwb3NpdGlvbiBzZXF1ZW5jZSAiRVNDIFsgOTk5OSA7IDk5OTkgUiIKKwkgKi8KKwlLRVlDT0RFX0JVRkZFUl9TSVpFID0gMTYKK307CisvKiBOb3RlOiBmZCBtYXkgYmUgaW4gYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nIG1vZGUsIGJvdGggbWFrZSBzZW5zZS4KKyAqIEZvciBvbmUsIGxlc3MgdXNlcyBub24tYmxvY2tpbmcgbW9kZS4KKyAqIE9ubHkgdGhlIGZpcnN0IHJlYWQgc3lzY2FsbCBpbnNpZGUgcmVhZF9rZXkgbWF5IGJsb2NrIGluZGVmaW5pdGVseQorICogKHVubGVzcyBmZCBpcyBpbiBub24tYmxvY2tpbmcgbW9kZSksCisgKiBzdWJzZXF1ZW50IHJlYWRzIHdpbGwgdGltZSBvdXQgYWZ0ZXIgYSBmZXcgbWlsbGlzZWNvbmRzLgorICogUmV0dXJuIG9mIC0xIG1lYW5zIEVPRiBvciBlcnJvciAoZXJybm8gPT0gMCBvbiBFT0YpLgorICogYnVmZmVyWzBdIGlzIHVzZWQgYXMgYSBjb3VudGVyIG9mIGJ1ZmZlcmVkIGNoYXJzIGFuZCBtdXN0IGJlIDAKKyAqIG9uIGZpcnN0IGNhbGwuCisgKiB0aW1lb3V0OgorICogLTI6IGRvIG5vdCBwb2xsIGZvciBpbnB1dDsKKyAqIC0xOiBwb2xsKC0xKSAoaS5lLiBibG9jayk7CisgKiA+PTA6IHBvbGwgZm9yIFRJTUVPVVQgbWlsbGlzZWNvbmRzLCByZXR1cm4gLTEvRUFHQUlOIG9uIHRpbWVvdXQKKyAqLworaW50NjRfdCByZWFkX2tleShpbnQgZmQsIGNoYXIgKmJ1ZmZlciwgaW50IHRpbWVvdXQpIEZBU1RfRlVOQzsKK3ZvaWQgcmVhZF9rZXlfdW5nZXRzKGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBsZW4pIEZBU1RfRlVOQzsKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworLyogSXQncyBOT1QganVzdCBFTkFCTEVkIG9yIGRpc2FibGVkLiBJdCdzIGEgbnVtYmVyOiAqLworIyBpZiBkZWZpbmVkIENPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWSAmJiBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlkgPiAwCisjICBkZWZpbmUgTUFYX0hJU1RPUlkgKENPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWSArIDApCit1bnNpZ25lZCBzaXplX2Zyb21fSElTVEZJTEVTSVpFKGNvbnN0IGNoYXIgKmhwKTsKKyMgZWxzZQorIyAgZGVmaW5lIE1BWF9ISVNUT1JZIDAKKyMgZW5kaWYKK3R5cGVkZWYgc3RydWN0IGxpbmVfaW5wdXRfdCB7CisJaW50IGZsYWdzOworCWNvbnN0IGNoYXIgKnBhdGhfbG9va3VwOworIyBpZiBNQVhfSElTVE9SWQorCWludCBjbnRfaGlzdG9yeTsKKwlpbnQgY3VyX2hpc3Rvcnk7CisJaW50IG1heF9oaXN0b3J5OyAvKiBtdXN0IG5ldmVyIGJlIDw9IDAgKi8KKyMgIGlmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwl1bnNpZ25lZCBjbnRfaGlzdG9yeV9pbl9maWxlOworCWNvbnN0IGNoYXIgKmhpc3RfZmlsZTsKKyMgIGVuZGlmCisJY2hhciAqaGlzdG9yeVtNQVhfSElTVE9SWSArIDFdOworIyBlbmRpZgorfSBsaW5lX2lucHV0X3Q7CitlbnVtIHsKKwlET19ISVNUT1JZID0gMSAqIChNQVhfSElTVE9SWSA+IDApLAorCVNBVkVfSElTVE9SWSA9IDIgKiAoTUFYX0hJU1RPUlkgPiAwKSAqIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlksCisJVEFCX0NPTVBMRVRJT04gPSA0ICogRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04sCisJVVNFUk5BTUVfQ09NUExFVElPTiA9IDggKiBFTkFCTEVfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OLAorCVZJX01PREUgPSAweDEwICogRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSSwKKwlXSVRIX1BBVEhfTE9PS1VQID0gMHgyMCwKKwlGT1JfU0hFTEwgPSBET19ISVNUT1JZIHwgU0FWRV9ISVNUT1JZIHwgVEFCX0NPTVBMRVRJT04gfCBVU0VSTkFNRV9DT01QTEVUSU9OLAorfTsKK2xpbmVfaW5wdXRfdCAqbmV3X2xpbmVfaW5wdXRfdChpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKKy8qIFNvIGZhciBzdGF0aWM6IHZvaWQgZnJlZV9saW5lX2lucHV0X3QobGluZV9pbnB1dF90ICpuKSBGQVNUX0ZVTkM7ICovCisvKgorICogbWF4c2l6ZSBtdXN0IGJlID49IDIuCisgKiBSZXR1cm5zOgorICogLTEgb24gcmVhZCBlcnJvcnMgb3IgRU9GLCBvciBvbiBiYXJlIEN0cmwtRCwKKyAqIDAgIG9uIGN0cmwtQyAodGhlIGxpbmUgZW50ZXJlZCBpcyBzdGlsbCByZXR1cm5lZCBpbiAnY29tbWFuZCcpLAorICogPjAgbGVuZ3RoIG9mIGlucHV0IHN0cmluZywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nICdcbicKKyAqLworaW50IHJlYWRfbGluZV9pbnB1dChsaW5lX2lucHV0X3QgKnN0LCBjb25zdCBjaGFyICpwcm9tcHQsIGNoYXIgKmNvbW1hbmQsIGludCBtYXhzaXplLCBpbnQgdGltZW91dCkgRkFTVF9GVU5DOworI2Vsc2UKKyNkZWZpbmUgTUFYX0hJU1RPUlkgMAoraW50IHJlYWRfbGluZV9pbnB1dChjb25zdCBjaGFyKiBwcm9tcHQsIGNoYXIqIGNvbW1hbmQsIGludCBtYXhzaXplKSBGQVNUX0ZVTkM7CisjZGVmaW5lIHJlYWRfbGluZV9pbnB1dChzdGF0ZSwgcHJvbXB0LCBjb21tYW5kLCBtYXhzaXplLCB0aW1lb3V0KSBcCisJcmVhZF9saW5lX2lucHV0KHByb21wdCwgY29tbWFuZCwgbWF4c2l6ZSkKKyNlbmRpZgorCisKKyNpZm5kZWYgQ09NTV9MRU4KKyMgaWZkZWYgVEFTS19DT01NX0xFTgorZW51bSB7IENPTU1fTEVOID0gVEFTS19DT01NX0xFTiB9OworIyBlbHNlCisvKiBzeW5jaHJvbml6ZSB3aXRoIHNpemVvZih0YXNrX3N0cnVjdC5jb21tKSBpbiAvdXNyL2luY2x1ZGUvbGludXgvc2NoZWQuaCAqLworZW51bSB7IENPTU1fTEVOID0gMTYgfTsKKyMgZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3Qgc21hcHJlYyB7CisJdW5zaWduZWQgbG9uZyBtYXBwZWRfcnc7CisJdW5zaWduZWQgbG9uZyBtYXBwZWRfcm87CisJdW5zaWduZWQgbG9uZyBzaGFyZWRfY2xlYW47CisJdW5zaWduZWQgbG9uZyBzaGFyZWRfZGlydHk7CisJdW5zaWduZWQgbG9uZyBwcml2YXRlX2NsZWFuOworCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZV9kaXJ0eTsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCXVuc2lnbmVkIGxvbmcgc21hcF9wc3MsIHNtYXBfc3dhcDsKKwl1bnNpZ25lZCBsb25nIHNtYXBfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNtYXBfc3RhcnQ7CisJY2hhciBzbWFwX21vZGVbNV07CisJY2hhciAqc21hcF9uYW1lOworfTsKKworI2lmICFFTkFCTEVfUE1BUAorI2RlZmluZSBwcm9jcHNfcmVhZF9zbWFwcyhwaWQsIHRvdGFsLCBjYiwgZGF0YSkgXAorCXByb2Nwc19yZWFkX3NtYXBzKHBpZCwgdG90YWwpCisjZW5kaWYKK2ludCBGQVNUX0ZVTkMgcHJvY3BzX3JlYWRfc21hcHMocGlkX3QgcGlkLCBzdHJ1Y3Qgc21hcHJlYyAqdG90YWwsCisJCSAgICAgIHZvaWQgKCpjYikoc3RydWN0IHNtYXByZWMgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IHByb2Nwc19zdGF0dXNfdCB7CisJRElSICpkaXI7CisJSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFMoRElSICp0YXNrX2RpcjspCisJdWludDhfdCBzaGlmdF9wYWdlc190b19ieXRlczsKKwl1aW50OF90IHNoaWZ0X3BhZ2VzX3RvX2tiOworLyogRmllbGRzIGFyZSBzZXQgdG8gMC9OVUxMIGlmIGZhaWxlZCB0byBkZXRlcm1pbmUgKG9yIG5vdCByZXF1ZXN0ZWQpICovCisJdWludDE2X3QgYXJndl9sZW47CisJY2hhciAqYXJndjA7CisJY2hhciAqZXhlOworCUlGX1NFTElOVVgoY2hhciAqY29udGV4dDspCisJSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFModW5zaWduZWQgbWFpbl90aHJlYWRfcGlkOykKKwkvKiBFdmVyeXRoaW5nIGJlbG93IG11c3QgY29udGFpbiBubyBwdHJzIHRvIG1hbGxvYydlZCBkYXRhOgorCSAqIGl0IGlzIG1lbXNldCgwKSBmb3IgZWFjaCBwcm9jZXNzIGluIHByb2Nwc19zY2FuKCkgKi8KKwl1bnNpZ25lZCBsb25nIHZzeiwgcnNzOyAvKiB3ZSByb3VuZCBpdCB0byBrYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHN0aW1lLCB1dGltZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CisJdW5zaWduZWQgcGlkOworCXVuc2lnbmVkIHBwaWQ7CisJdW5zaWduZWQgcGdpZDsKKwl1bnNpZ25lZCBzaWQ7CisJdW5zaWduZWQgdWlkOworCXVuc2lnbmVkIGdpZDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMKKwl1bnNpZ25lZCBydWlkOworCXVuc2lnbmVkIHJnaWQ7CisJaW50IG5pY2VuZXNzOworI2VuZGlmCisJdW5zaWduZWQgdHR5X21ham9yLHR0eV9taW5vcjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKwlzdHJ1Y3Qgc21hcHJlYyBzbWFwczsKKyNlbmRpZgorCWNoYXIgc3RhdGVbNF07CisJLyogYmFzZW5hbWUgb2YgZXhlY3V0YWJsZSBpbiBleGVjKDIpLCByZWFkIGZyb20gL3Byb2MvTi9zdGF0CisJICogKGlmIGV4ZWN1dGFibGUgaXMgc3ltbGluayBvciBzY3JpcHQsIGl0IGlzIE5PVCByZXBsYWNlZAorCSAqIGJ5IGxpbmsgdGFyZ2V0IG9yIGludGVycHJldGVyIG5hbWUpICovCisJY2hhciBjb21tW0NPTU1fTEVOXTsKKwkvKiB1c2VyL2dyb3VwPyAtIHVzZSBwYXNzd2QvZ3JvdXAgcGFyc2luZyBmdW5jdGlvbnMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MKKwlpbnQgbGFzdF9zZWVuX29uX2NwdTsKKyNlbmRpZgorfSBwcm9jcHNfc3RhdHVzX3Q7CisvKiBmbGFnIGJpdHMgZm9yIHByb2Nwc19zY2FuKHh4LCBmbGFncykgY2FsbHMgKi8KK2VudW0geworCVBTU0NBTl9QSUQgICAgICA9IDEgPDwgMCwKKwlQU1NDQU5fUFBJRCAgICAgPSAxIDw8IDEsCisJUFNTQ0FOX1BHSUQgICAgID0gMSA8PCAyLAorCVBTU0NBTl9TSUQgICAgICA9IDEgPDwgMywKKwlQU1NDQU5fVUlER0lEICAgPSAxIDw8IDQsCisJUFNTQ0FOX0NPTU0gICAgID0gMSA8PCA1LAorCS8qIFBTU0NBTl9DTUQgICAgICA9IDEgPDwgNiwgLSB1c2UgcmVhZF9jbWRsaW5lIGluc3RlYWQgKi8KKwlQU1NDQU5fQVJHVjAgICAgPSAxIDw8IDcsCisJUFNTQ0FOX0VYRSAgICAgID0gMSA8PCA4LAorCVBTU0NBTl9TVEFURSAgICA9IDEgPDwgOSwKKwlQU1NDQU5fVlNaICAgICAgPSAxIDw8IDEwLAorCVBTU0NBTl9SU1MgICAgICA9IDEgPDwgMTEsCisJUFNTQ0FOX1NUSU1FICAgID0gMSA8PCAxMiwKKwlQU1NDQU5fVVRJTUUgICAgPSAxIDw8IDEzLAorCVBTU0NBTl9UVFkgICAgICA9IDEgPDwgMTQsCisJUFNTQ0FOX1NNQVBTCT0gKDEgPDwgMTUpICogRU5BQkxFX0ZFQVRVUkVfVE9QTUVNLAorCS8qIE5COiB1c2VkIGJ5IGZpbmRfcGlkX2J5X25hbWUoKS4gQW55IGFwcGxldCB1c2luZyBpdAorCSAqIG5lZWRzIHRvIGJlIG1lbnRpb25lZCBoZXJlLiAqLworCVBTU0NBTl9BUkdWTiAgICA9ICgxIDw8IDE2KSAqIChFTkFCTEVfS0lMTEFMTAorCQkJCXx8IEVOQUJMRV9QR1JFUCB8fCBFTkFCTEVfUEtJTEwKKwkJCQl8fCBFTkFCTEVfUElET0YKKwkJCQl8fCBFTkFCTEVfU0VTVEFUVVMKKwkJCQkpLAorCVBTU0NBTl9DT05URVhUICA9ICgxIDw8IDE3KSAqIEVOQUJMRV9TRUxJTlVYLAorCVBTU0NBTl9TVEFSVF9USU1FID0gMSA8PCAxOCwKKwlQU1NDQU5fQ1BVICAgICAgPSAoMSA8PCAxOSkgKiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MsCisJUFNTQ0FOX05JQ0UgICAgID0gKDEgPDwgMjApICogRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TLAorCVBTU0NBTl9SVUlER0lEICA9ICgxIDw8IDIxKSAqIEVOQUJMRV9GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUywKKwlQU1NDQU5fVEFTS1MJPSAoMSA8PCAyMikgKiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMsCit9OworLy9wcm9jcHNfc3RhdHVzX3QqIGFsbG9jX3Byb2Nwc19zY2FuKHZvaWQpIEZBU1RfRlVOQzsKK3ZvaWQgZnJlZV9wcm9jcHNfc2Nhbihwcm9jcHNfc3RhdHVzX3QqIHNwKSBGQVNUX0ZVTkM7Citwcm9jcHNfc3RhdHVzX3QqIHByb2Nwc19zY2FuKHByb2Nwc19zdGF0dXNfdCogc3AsIGludCBmbGFncykgRkFTVF9GVU5DOworLyogRm9ybWF0IGNtZGxpbmUgKHVwIHRvIGNvbCBjaGFycykgaW50byBjaGFyIGJ1ZltzaXplXSAqLworLyogUHV0cyBbY29tbV0gaWYgY21kbGluZSBpcyBlbXB0eSAoLT4gcHJvY2VzcyBpcyBhIGtlcm5lbCB0aHJlYWQpICovCit2b2lkIHJlYWRfY21kbGluZShjaGFyICpidWYsIGludCBzaXplLCB1bnNpZ25lZCBwaWQsIGNvbnN0IGNoYXIgKmNvbW0pIEZBU1RfRlVOQzsKK3BpZF90ICpmaW5kX3BpZF9ieV9uYW1lKGNvbnN0IGNoYXIqIHByb2NOYW1lKSBGQVNUX0ZVTkM7CitwaWRfdCAqcGlkbGlzdF9yZXZlcnNlKHBpZF90ICpwaWRMaXN0KSBGQVNUX0ZVTkM7CitpbnQgc3RhcnRzX3dpdGhfY3B1KGNvbnN0IGNoYXIgKnN0cikgRkFTVF9GVU5DOwordW5zaWduZWQgZ2V0X2NwdV9jb3VudCh2b2lkKSBGQVNUX0ZVTkM7CisKKworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfdXVlbmNfdGJsX2Jhc2U2NFtdOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfdXVlbmNfdGJsX3N0ZFtdOwordm9pZCBiYl91dWVuY29kZShjaGFyICpzdG9yZSwgY29uc3Qgdm9pZCAqcywgaW50IGxlbmd0aCwgY29uc3QgY2hhciAqdGJsKSBGQVNUX0ZVTkM7CitlbnVtIHsKKwlCQVNFNjRfRkxBR19VVV9TVE9QID0gMHgxMDAsCisJLyogU2lnbi1leHRlbmRzIHRvIGEgdmFsdWUgd2hpY2ggbmV2ZXIgbWF0Y2hlcyBmZ2V0YyByZXN1bHQ6ICovCisJQkFTRTY0X0ZMQUdfTk9fU1RPUF9DSEFSID0gMHg4MCwKK307Cit2b2lkIEZBU1RfRlVOQyByZWFkX2Jhc2U2NChGSUxFICpzcmNfc3RyZWFtLCBGSUxFICpkc3Rfc3RyZWFtLCBpbnQgZmxhZ3MpOworCit0eXBlZGVmIHN0cnVjdCBtZDVfY3R4X3QgeworCXVpbnQ4X3Qgd2J1ZmZlcls2NF07IC8qIGFsd2F5cyBjb3JyZWN0bHkgYWxpZ25lZCBmb3IgdWludDY0X3QgKi8KKwl2b2lkICgqcHJvY2Vzc19ibG9jaykoc3RydWN0IG1kNV9jdHhfdCopIEZBU1RfRlVOQzsKKwl1aW50NjRfdCB0b3RhbDY0OyAgICAvKiBtdXN0IGJlIGRpcmVjdGx5IGJlZm9yZSBoYXNoW10gKi8KKwl1aW50MzJfdCBoYXNoWzhdOyAgICAvKiA0IGVsZW1lbnRzIGZvciBtZDUsIDUgZm9yIHNoYTEsIDggZm9yIHNoYTI1NiAqLworfSBtZDVfY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBtZDVfY3R4X3Qgc2hhMV9jdHhfdDsKK3R5cGVkZWYgc3RydWN0IG1kNV9jdHhfdCBzaGEyNTZfY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBzaGE1MTJfY3R4X3QgeworCXVpbnQ2NF90IHRvdGFsNjRbMl07ICAvKiBtdXN0IGJlIGRpcmVjdGx5IGJlZm9yZSBoYXNoW10gKi8KKwl1aW50NjRfdCBoYXNoWzhdOworCXVpbnQ4X3Qgd2J1ZmZlclsxMjhdOyAvKiBhbHdheXMgY29ycmVjdGx5IGFsaWduZWQgZm9yIHVpbnQ2NF90ICovCit9IHNoYTUxMl9jdHhfdDsKK3ZvaWQgbWQ1X2JlZ2luKG1kNV9jdHhfdCAqY3R4KSBGQVNUX0ZVTkM7Cit2b2lkIG1kNV9oYXNoKG1kNV9jdHhfdCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKSBGQVNUX0ZVTkM7Cit2b2lkIG1kNV9lbmQobWQ1X2N0eF90ICpjdHgsIHZvaWQgKnJlc2J1ZikgRkFTVF9GVU5DOwordm9pZCBzaGExX2JlZ2luKHNoYTFfY3R4X3QgKmN0eCkgRkFTVF9GVU5DOworI2RlZmluZSBzaGExX2hhc2ggbWQ1X2hhc2gKK3ZvaWQgc2hhMV9lbmQoc2hhMV9jdHhfdCAqY3R4LCB2b2lkICpyZXNidWYpIEZBU1RfRlVOQzsKK3ZvaWQgc2hhMjU2X2JlZ2luKHNoYTI1Nl9jdHhfdCAqY3R4KSBGQVNUX0ZVTkM7CisjZGVmaW5lIHNoYTI1Nl9oYXNoIG1kNV9oYXNoCisjZGVmaW5lIHNoYTI1Nl9lbmQgIHNoYTFfZW5kCit2b2lkIHNoYTUxMl9iZWdpbihzaGE1MTJfY3R4X3QgKmN0eCkgRkFTVF9GVU5DOwordm9pZCBzaGE1MTJfaGFzaChzaGE1MTJfY3R4X3QgKmN0eCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuKSBGQVNUX0ZVTkM7Cit2b2lkIHNoYTUxMl9lbmQoc2hhNTEyX2N0eF90ICpjdHgsIHZvaWQgKnJlc2J1ZikgRkFTVF9GVU5DOworCitleHRlcm4gdWludDMyX3QgKmdsb2JhbF9jcmMzMl90YWJsZTsKK3VpbnQzMl90ICpjcmMzMl9maWxsdGFibGUodWludDMyX3QgKnRibDI1NiwgaW50IGVuZGlhbikgRkFTVF9GVU5DOwordWludDMyX3QgY3JjMzJfYmxvY2tfZW5kaWFuMSh1aW50MzJfdCB2YWwsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuLCB1aW50MzJfdCAqY3JjX3RhYmxlKSBGQVNUX0ZVTkM7Cit1aW50MzJfdCBjcmMzMl9ibG9ja19lbmRpYW4wKHVpbnQzMl90IHZhbCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sIHVpbnQzMl90ICpjcmNfdGFibGUpIEZBU1RfRlVOQzsKKwordHlwZWRlZiBzdHJ1Y3QgbWFza3NfbGFiZWxzX3QgeworCWNvbnN0IGNoYXIgKmxhYmVsczsKKwljb25zdCBpbnQgbWFza3NbXTsKK30gbWFza3NfbGFiZWxzX3Q7CitpbnQgcHJpbnRfZmxhZ3Nfc2VwYXJhdGVkKGNvbnN0IGludCAqbWFza3MsIGNvbnN0IGNoYXIgKmxhYmVscywKKwkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpzZXBhcmF0b3IpIEZBU1RfRlVOQzsKK2ludCBwcmludF9mbGFncyhjb25zdCBtYXNrc19sYWJlbHNfdCAqbWwsIGludCBmbGFncykgRkFTVF9GVU5DOworCit0eXBlZGVmIHN0cnVjdCBiYl9wcm9ncmVzc190IHsKKwl1bnNpZ25lZCBsYXN0X3NpemU7CisJdW5zaWduZWQgbGFzdF91cGRhdGVfc2VjOworCXVuc2lnbmVkIGxhc3RfY2hhbmdlX3NlYzsKKwl1bnNpZ25lZCBzdGFydF9zZWM7CisJY29uc3QgY2hhciAqY3VyZmlsZTsKK30gYmJfcHJvZ3Jlc3NfdDsKKworI2RlZmluZSBpc19iYl9wcm9ncmVzc19pbml0ZWQocCkgKChwKS0+Y3VyZmlsZSAhPSBOVUxMKQorI2RlZmluZSBiYl9wcm9ncmVzc19mcmVlKHApIGRvIHsgXAorCWlmIChFTkFCTEVfVU5JQ09ERV9TVVBQT1JUKSBmcmVlKChjaGFyKikoKHApLT5jdXJmaWxlKSk7IFwKKwkocCktPmN1cmZpbGUgPSBOVUxMOyBcCit9IHdoaWxlICgwKQordm9pZCBiYl9wcm9ncmVzc19pbml0KGJiX3Byb2dyZXNzX3QgKnAsIGNvbnN0IGNoYXIgKmN1cmZpbGUpIEZBU1RfRlVOQzsKK3ZvaWQgYmJfcHJvZ3Jlc3NfdXBkYXRlKGJiX3Byb2dyZXNzX3QgKnAsCisJCQl1b2ZmX3QgYmVnX3JhbmdlLAorCQkJdW9mZl90IHRyYW5zZmVycmVkLAorCQkJdW9mZl90IHRvdGFsc2l6ZSkgRkFTVF9GVU5DOworCisKK2V4dGVybiBjb25zdCBjaGFyICphcHBsZXRfbmFtZTsKKworLyogU29tZSBvbGRlciBsaW5rZXJzIGRvbid0IHBlcmZvcm0gc3RyaW5nIG1lcmdpbmcsIHdlIHVzZWQgdG8gaGF2ZSBjb21tb24gc3RyaW5ncworICogYXMgZ2xvYmFsIGFycmF5cyB0byBkbyBpdCBieSBoYW5kLiBCdXQ6CisgKiAoMSkgbmV3ZXIgbGlua2VycyBkbyBpdCB0aGVtc2VsdmVzLAorICogKDIpIGhvd2V2ZXIsIHRoZXkgRE9OVCBtZXJnZSBzdHJpbmcgY29uc3RhbnRzIHdpdGggZ2xvYmFsIGFycmF5cywKKyAqIGV2ZW4gaWYgdGhlIHZhbHVlIGlzIHRoZSBzYW1lICghKS4gVGh1cyBnbG9iYWwgYXJyYXlzIGFjdHVhbGx5CisgKiBpbmNyZWFzZWQgc2l6ZSBhIGJpdDogZm9yIGV4YW1wbGUsICIvZXRjL3Bhc3N3ZCIgc3RyaW5nIGZyb20gbGliYworICogd2Fzbid0IG1lcmdlZCB3aXRoIGJiX3BhdGhfcGFzc3dkX2ZpbGVbXSBhcnJheSEKKyAqIFRoZXJlZm9yZSBub3cgd2UgdXNlICNkZWZpbmVzLgorICovCisvKiAiQnVzeUJveCB2Ti5OLk4gKHRpbWVzdGFtcCBvciBleHRyYV92ZXJzaW9uKSIgKi8KK2V4dGVybiBjb25zdCBjaGFyIGJiX2Jhbm5lcltdOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX21lbW9yeV9leGhhdXN0ZWRbXTsKK2V4dGVybiBjb25zdCBjaGFyIGJiX21zZ19pbnZhbGlkX2RhdGVbXTsKKyNkZWZpbmUgYmJfbXNnX3JlYWRfZXJyb3IgInJlYWQgZXJyb3IiCisjZGVmaW5lIGJiX21zZ193cml0ZV9lcnJvciAid3JpdGUgZXJyb3IiCitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfdW5rbm93bltdOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX2Nhbl9ub3RfY3JlYXRlX3Jhd19zb2NrZXRbXTsKK2V4dGVybiBjb25zdCBjaGFyIGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3RbXTsKK2V4dGVybiBjb25zdCBjaGFyIGJiX21zZ195b3VfbXVzdF9iZV9yb290W107CitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfcmVxdWlyZXNfYXJnW107CitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfaW52YWxpZF9hcmdbXTsKK2V4dGVybiBjb25zdCBjaGFyIGJiX21zZ19zdGFuZGFyZF9pbnB1dFtdOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX3N0YW5kYXJkX291dHB1dFtdOworCisvKiBOQjogKGJiX2hleGRpZ2l0c191cGNhc2VbaV0gfCAweDIwKSAtPiBsb3dlcmNhc2UgaGV4IGRpZ2l0ICovCitleHRlcm4gY29uc3QgY2hhciBiYl9oZXhkaWdpdHNfdXBjYXNlW107CisKK2V4dGVybiBjb25zdCBjaGFyIGJiX3BhdGhfd3RtcF9maWxlW107CisKKy8qIEJ1c3lib3ggbW91bnQgdXNlcyBlaXRoZXIgL3Byb2MvbW91bnRzIG9yIC9ldGMvbXRhYiB0bworICogZ2V0IHRoZSBsaXN0IG9mIGN1cnJlbnRseSBtb3VudGVkIGZpbGVzeXN0ZW1zICovCisjZGVmaW5lIGJiX3BhdGhfbXRhYl9maWxlIElGX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKCIvZXRjL210YWIiKUlGX05PVF9GRUFUVVJFX01UQUJfU1VQUE9SVCgiL3Byb2MvbW91bnRzIikKKworI2RlZmluZSBiYl9wYXRoX3Bhc3N3ZF9maWxlICBfUEFUSF9QQVNTV0QKKyNkZWZpbmUgYmJfcGF0aF9ncm91cF9maWxlICAgX1BBVEhfR1JPVVAKKyNkZWZpbmUgYmJfcGF0aF9zaGFkb3dfZmlsZSAgX1BBVEhfU0hBRE9XCisjZGVmaW5lIGJiX3BhdGhfZ3NoYWRvd19maWxlIF9QQVRIX0dTSEFET1cKKworI2RlZmluZSBiYl9wYXRoX21vdGRfZmlsZSAiL2V0Yy9tb3RkIgorCisjZGVmaW5lIGJiX2Rldl9udWxsICIvZGV2L251bGwiCitleHRlcm4gY29uc3QgY2hhciBiYl9idXN5Ym94X2V4ZWNfcGF0aFtdOworLyogdXRpbC1saW51eCBtYW5wYWdlIHNheXMgL3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4sCisgKiBidXQgSSB3YW50IHRvIHNhdmUgYSBmZXcgYnl0ZXMgaGVyZSAqLworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfUEFUSF9yb290X3BhdGhbXTsgLyogIlBBVEg9L3NiaW46L3Vzci9zYmluOi9iaW46L3Vzci9iaW4iICovCisjZGVmaW5lIGJiX2RlZmF1bHRfcm9vdF9wYXRoIChiYl9QQVRIX3Jvb3RfcGF0aCArIHNpemVvZigiUEFUSCIpKQorI2RlZmluZSBiYl9kZWZhdWx0X3BhdGggICAgICAoYmJfUEFUSF9yb290X3BhdGggKyBzaXplb2YoIlBBVEg9L3NiaW46L3Vzci9zYmluIikpCisKK2V4dGVybiBjb25zdCBpbnQgY29uc3RfaW50XzA7CitleHRlcm4gY29uc3QgaW50IGNvbnN0X2ludF8xOworCisKKy8qIFByb3ZpZGluZyBoYXJkIGd1YXJhbnRlZSBvbiBtaW5pbXVtIHNpemUgKHRoaW5rIG9mIEJVRlNJWiA9PSAxMjgpICovCitlbnVtIHsgQ09NTU9OX0JVRlNJWkUgPSAoQlVGU0laID49IDI1NipzaXplb2Yodm9pZCopID8gQlVGU0laKzEgOiAyNTYqc2l6ZW9mKHZvaWQqKSkgfTsKK2V4dGVybiBjaGFyIGJiX2NvbW1vbl9idWZzaXoxW0NPTU1PTl9CVUZTSVpFXTsKKy8qIFRoaXMgc3RydWN0IGlzIGRlbGliZXJhdGVseSBub3QgZGVmaW5lZC4gKi8KKy8qIFNlZSBkb2NzL2tlZXBfZGF0YV9zbWFsbC50eHQgKi8KK3N0cnVjdCBnbG9iYWxzOworLyogJypjb25zdCcgcHRyIG1ha2VzIGdjYyBvcHRpbWl6ZSBjb2RlIG11Y2ggYmV0dGVyLgorICogTWFnaWMgcHJldmVudHMgcHRyX3RvX2dsb2JhbHMgZnJvbSBnb2luZyBpbnRvIHJvZGF0YS4KKyAqIElmIHlvdSB3YW50IHRvIGFzc2lnbiBhIHZhbHVlLCB1c2UgU0VUX1BUUl9UT19HTE9CQUxTKHgpICovCitleHRlcm4gc3RydWN0IGdsb2JhbHMgKmNvbnN0IHB0cl90b19nbG9iYWxzOworLyogQXQgbGVhc3QgZ2NjIDMuNC42IG9uIG1pcHNlbCBzeXN0ZW0gbmVlZHMgb3B0aW1pemF0aW9uIGJhcnJpZXIgKi8KKyNkZWZpbmUgYmFycmllcigpIF9fYXNtX18gX192b2xhdGlsZV9fKCIiOjo6Im1lbW9yeSIpCisjZGVmaW5lIFNFVF9QVFJfVE9fR0xPQkFMUyh4KSBkbyB7IFwKKwkoKihzdHJ1Y3QgZ2xvYmFscyoqKSZwdHJfdG9fZ2xvYmFscykgPSAodm9pZCopKHgpOyBcCisJYmFycmllcigpOyBcCit9IHdoaWxlICgwKQorCisvKiBZb3UgY2FuIGNoYW5nZSBMSUJCQl9ERUZBVUxUX0xPR0lOX1NIRUxMLCBidXQgZG9uJ3QgdXNlIGl0LAorICogdXNlIGJiX2RlZmF1bHRfbG9naW5fc2hlbGwgYW5kIGZvbGxvd2luZyBkZWZpbmVzLgorICogSWYgeW91IGNoYW5nZSBMSUJCQl9ERUZBVUxUX0xPR0lOX1NIRUxMLAorICogZG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSBpbmNyZW1lbnQgY29uc3RhbnQuICovCisjZGVmaW5lIExJQkJCX0RFRkFVTFRfTE9HSU5fU0hFTEwgICItL2Jpbi9zaCIKK2V4dGVybiBjb25zdCBjaGFyIGJiX2RlZmF1bHRfbG9naW5fc2hlbGxbXTsKKy8qICIvYmluL3NoIiAqLworI2RlZmluZSBERUZBVUxUX1NIRUxMICAgICAgICAgICAgICAoYmJfZGVmYXVsdF9sb2dpbl9zaGVsbCsxKQorLyogInNoIiAqLworI2RlZmluZSBERUZBVUxUX1NIRUxMX1NIT1JUX05BTUUgICAoYmJfZGVmYXVsdF9sb2dpbl9zaGVsbCs2KQorCisvKiBUaGUgZm9sbG93aW5nIGRldmljZXMgYXJlIHRoZSBzYW1lIG9uIGFsbCBzeXN0ZW1zLiAgKi8KKyNkZWZpbmUgQ1VSUkVOVF9UVFkgIi9kZXYvdHR5IgorI2RlZmluZSBERVZfQ09OU09MRSAiL2Rldi9jb25zb2xlIgorCisjaWYgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjIGRlZmluZSBDVVJSRU5UX1ZDIENVUlJFTlRfVFRZCisjIGRlZmluZSBWQ18xICIvZGV2L3R0eXYwIgorIyBkZWZpbmUgVkNfMiAiL2Rldi90dHl2MSIKKyMgZGVmaW5lIFZDXzMgIi9kZXYvdHR5djIiCisjIGRlZmluZSBWQ180ICIvZGV2L3R0eXYzIgorIyBkZWZpbmUgVkNfNSAiL2Rldi90dHl2NCIKKyMgZGVmaW5lIFZDX0ZPUk1BVCAiL2Rldi90dHl2JWQiCisjZWxpZiBkZWZpbmVkKF9fR05VX18pCisjIGRlZmluZSBDVVJSRU5UX1ZDIENVUlJFTlRfVFRZCisjIGRlZmluZSBWQ18xICIvZGV2L3R0eTEiCisjIGRlZmluZSBWQ18yICIvZGV2L3R0eTIiCisjIGRlZmluZSBWQ18zICIvZGV2L3R0eTMiCisjIGRlZmluZSBWQ180ICIvZGV2L3R0eTQiCisjIGRlZmluZSBWQ181ICIvZGV2L3R0eTUiCisjIGRlZmluZSBWQ19GT1JNQVQgIi9kZXYvdHR5JWQiCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9ERVZGUworLypMaW51eCwgb2Jzb2xldGUgZGV2ZnMgbmFtZXMgKi8KKyMgZGVmaW5lIENVUlJFTlRfVkMgIi9kZXYvdmMvMCIKKyMgZGVmaW5lIFZDXzEgIi9kZXYvdmMvMSIKKyMgZGVmaW5lIFZDXzIgIi9kZXYvdmMvMiIKKyMgZGVmaW5lIFZDXzMgIi9kZXYvdmMvMyIKKyMgZGVmaW5lIFZDXzQgIi9kZXYvdmMvNCIKKyMgZGVmaW5lIFZDXzUgIi9kZXYvdmMvNSIKKyMgZGVmaW5lIFZDX0ZPUk1BVCAiL2Rldi92Yy8lZCIKKyMgZGVmaW5lIExPT1BfRk9STUFUICIvZGV2L2xvb3AvJWQiCisjIGRlZmluZSBMT09QX05BTUVTSVpFIChzaXplb2YoIi9kZXYvbG9vcC8iKSArIHNpemVvZihpbnQpKjMgKyAxKQorIyBkZWZpbmUgTE9PUF9OQU1FICIvZGV2L2xvb3AvIgorIyBkZWZpbmUgRkJfMCAiL2Rldi9mYi8wIgorI2Vsc2UKKy8qTGludXgsIG5vcm1hbCBuYW1lcyAqLworIyBkZWZpbmUgQ1VSUkVOVF9WQyAiL2Rldi90dHkwIgorIyBkZWZpbmUgVkNfMSAiL2Rldi90dHkxIgorIyBkZWZpbmUgVkNfMiAiL2Rldi90dHkyIgorIyBkZWZpbmUgVkNfMyAiL2Rldi90dHkzIgorIyBkZWZpbmUgVkNfNCAiL2Rldi90dHk0IgorIyBkZWZpbmUgVkNfNSAiL2Rldi90dHk1IgorIyBkZWZpbmUgVkNfRk9STUFUICIvZGV2L3R0eSVkIgorIyBkZWZpbmUgTE9PUF9GT1JNQVQgIi9kZXYvbG9vcCVkIgorIyBkZWZpbmUgTE9PUF9OQU1FU0laRSAoc2l6ZW9mKCIvZGV2L2xvb3AiKSArIHNpemVvZihpbnQpKjMgKyAxKQorIyBkZWZpbmUgTE9PUF9OQU1FICIvZGV2L2xvb3AiCisjIGRlZmluZSBGQl8wICIvZGV2L2ZiMCIKKyNlbmRpZgorCisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoKHVuc2lnbmVkKShzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkpCisKKworLyogV2UgcmVkZWZpbmUgY3R5cGUgbWFjcm9zLiBVbmljb2RlLWNvcnJlY3QgaGFuZGxpbmcgb2YgY2hhciB0eXBlcworICogY2FuJ3QgYmUgZG9uZSB3aXRoIHN1Y2ggYnl0ZS1vcmllbnRlZCBvcGVyYXRpb25zIGFueXdheSwKKyAqIHdlIGRvbid0IGxvc2UgYW55dGhpbmcuCisgKi8KKyN1bmRlZiBpc2FsbnVtCisjdW5kZWYgaXNhbHBoYQorI3VuZGVmIGlzYXNjaWkKKyN1bmRlZiBpc2JsYW5rCisjdW5kZWYgaXNjbnRybAorI3VuZGVmIGlzZGlnaXQKKyN1bmRlZiBpc2dyYXBoCisjdW5kZWYgaXNsb3dlcgorI3VuZGVmIGlzcHJpbnQKKyN1bmRlZiBpc3B1bmN0CisjdW5kZWYgaXNzcGFjZQorI3VuZGVmIGlzdXBwZXIKKyN1bmRlZiBpc3hkaWdpdAorI3VuZGVmIHRvdXBwZXIKKyN1bmRlZiB0b2xvd2VyCisKKy8qIFdlIHNhdmUgfjUwMCBieXRlcyBvbiBpc2RpZ2l0IGFsb25lLgorICogQlRXLCB4ODYgbGlrZXMgKHVuc2lnbmVkIGNoYXIpIGNhc3QgbW9yZSB0aGFuICh1bnNpZ25lZCkuICovCisKKy8qIFRoZXNlIHdvcmsgdGhlIHNhbWUgZm9yIEFTQ0lJIGFuZCBVbmljb2RlLAorICogYXNzdW1pbmcgbm8gb25lIGFza3MgImlzIHRoaXMgYSAqVW5pY29kZSogbGV0dGVyPyIgdXNpbmcgaXNhbHBoYShsZXR0ZXIpICovCisjZGVmaW5lIGlzYXNjaWkoYSkgKCh1bnNpZ25lZCBjaGFyKShhKSA8PSAweDdmKQorI2RlZmluZSBpc2RpZ2l0KGEpICgodW5zaWduZWQgY2hhcikoKGEpIC0gJzAnKSA8PSA5KQorI2RlZmluZSBpc3VwcGVyKGEpICgodW5zaWduZWQgY2hhcikoKGEpIC0gJ0EnKSA8PSAoJ1onIC0gJ0EnKSkKKyNkZWZpbmUgaXNsb3dlcihhKSAoKHVuc2lnbmVkIGNoYXIpKChhKSAtICdhJykgPD0gKCd6JyAtICdhJykpCisjZGVmaW5lIGlzYWxwaGEoYSkgKCh1bnNpZ25lZCBjaGFyKSgoKGEpfDB4MjApIC0gJ2EnKSA8PSAoJ3onIC0gJ2EnKSkKKyNkZWZpbmUgaXNibGFuayhhKSAoeyB1bnNpZ25lZCBjaGFyIGJiX19pc2JsYW5rID0gKGEpOyBiYl9faXNibGFuayA9PSAnICcgfHwgYmJfX2lzYmxhbmsgPT0gJ1x0JzsgfSkKKyNkZWZpbmUgaXNjbnRybChhKSAoeyB1bnNpZ25lZCBjaGFyIGJiX19pc2NudHJsID0gKGEpOyBiYl9faXNjbnRybCA8ICcgJyB8fCBiYl9faXNjbnRybCA9PSAweDdmOyB9KQorLyogSW4gUE9TSVgvQyBsb2NhbGUgaXNzcGFjZSBpcyBvbmx5IHRoZXNlIGNoYXJzOiAiXHRcblx2XGZcciIgYW5kIHNwYWNlLgorICogIlx0XG5cdlxmXHIiIGhhcHBlbiB0byBoYXZlIEFTQ0lJIGNvZGVzIDksMTAsMTEsMTIsMTMuCisgKi8KKyNkZWZpbmUgaXNzcGFjZShhKSAoeyB1bnNpZ25lZCBjaGFyIGJiX19pc3NwYWNlID0gKGEpIC0gOTsgYmJfX2lzc3BhY2UgPT0gKCcgJyAtIDkpIHx8IGJiX19pc3NwYWNlIDw9ICgxMyAtIDkpOyB9KQorLy8gVW5zYWZlIHdydCBOVUw6ICNkZWZpbmUgaXNwdW5jdChhKSAoc3RyY2hyKCIhXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXF1eX2B7fH1+IiwgKGEpKSAhPSBOVUxMKQorI2RlZmluZSBpc3B1bmN0KGEpIChzdHJjaHJudWwoIiFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5fYHt8fX4iLCAoYSkpWzBdKQorLy8gQmlnZ2VyIGNvZGU6ICNkZWZpbmUgaXNhbG51bShhKSAoeyB1bnNpZ25lZCBjaGFyIGJiX19pc2FsbnVtID0gKGEpIC0gJzAnOyBiYl9faXNhbG51bSA8PSA5IHx8ICgoYmJfX2lzYWxudW0gLSAoJ0EnIC0gJzAnKSkgJiAweGRmKSA8PSAyNTsgfSkKKyNkZWZpbmUgaXNhbG51bShhKSBiYl9hc2NpaV9pc2FsbnVtKGEpCitzdGF0aWMgQUxXQVlTX0lOTElORSBpbnQgYmJfYXNjaWlfaXNhbG51bSh1bnNpZ25lZCBjaGFyIGEpCit7CisJdW5zaWduZWQgY2hhciBiID0gYSAtICcwJzsKKwlpZiAoYiA8PSA5KQorCQlyZXR1cm4gKGIgPD0gOSk7CisJYiA9IChhfDB4MjApIC0gJ2EnOworCXJldHVybiBiIDw9ICd6JyAtICdhJzsKK30KKyNkZWZpbmUgaXN4ZGlnaXQoYSkgYmJfYXNjaWlfaXN4ZGlnaXQoYSkKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludCBiYl9hc2NpaV9pc3hkaWdpdCh1bnNpZ25lZCBjaGFyIGEpCit7CisJdW5zaWduZWQgY2hhciBiID0gYSAtICcwJzsKKwlpZiAoYiA8PSA5KQorCQlyZXR1cm4gKGIgPD0gOSk7CisJYiA9IChhfDB4MjApIC0gJ2EnOworCXJldHVybiBiIDw9ICdmJyAtICdhJzsKK30KKyNkZWZpbmUgdG91cHBlcihhKSBiYl9hc2NpaV90b3VwcGVyKGEpCitzdGF0aWMgQUxXQVlTX0lOTElORSB1bnNpZ25lZCBjaGFyIGJiX2FzY2lpX3RvdXBwZXIodW5zaWduZWQgY2hhciBhKQoreworCXVuc2lnbmVkIGNoYXIgYiA9IGEgLSAnYSc7CisJaWYgKGIgPD0gKCd6JyAtICdhJykpCisJCWEgLT0gJ2EnIC0gJ0EnOworCXJldHVybiBhOworfQorI2RlZmluZSB0b2xvd2VyKGEpIGJiX2FzY2lpX3RvbG93ZXIoYSkKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVuc2lnbmVkIGNoYXIgYmJfYXNjaWlfdG9sb3dlcih1bnNpZ25lZCBjaGFyIGEpCit7CisJdW5zaWduZWQgY2hhciBiID0gYSAtICdBJzsKKwlpZiAoYiA8PSAoJ1onIC0gJ0EnKSkKKwkJYSArPSAnYScgLSAnQSc7CisJcmV0dXJuIGE7Cit9CisKKy8qIEluIEFTQ0lJIGFuZCBVbmljb2RlLCB0aGVzZSBhcmUgbGlrZWx5IHRvIGJlIHZlcnkgZGlmZmVyZW50LgorICogTGV0J3MgcHJldmVudCBhbWJpZ3VvdXMgdXNhZ2UgZnJvbSB0aGUgc3RhcnQgKi8KKyNkZWZpbmUgaXNncmFwaChhKSBpc2dyYXBoX2lzX2FtYmlndW91c19kb250X3VzZShhKQorI2RlZmluZSBpc3ByaW50KGEpIGlzcHJpbnRfaXNfYW1iaWd1b3VzX2RvbnRfdXNlKGEpCisvKiBOQjogbXVzdCBub3QgdHJlYXQgRU9GIGFzIGlzZ3JhcGggb3IgaXNwcmludCAqLworI2RlZmluZSBpc2dyYXBoX2FzY2lpb25seShhKSAoKHVuc2lnbmVkKSgoYSkgLSAweDIxKSA8PSAweDdlIC0gMHgyMSkKKyNkZWZpbmUgaXNwcmludF9hc2NpaW9ubHkoYSkgKCh1bnNpZ25lZCkoKGEpIC0gMHgyMCkgPD0gMHg3ZSAtIDB4MjApCisKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2xpYmx6b19pbnRlcmZhY2UuaCBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvbGlibHpvX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODRjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL2xpYmx6b19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDcxIEBACisvKgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYuLjIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2RlZmluZSBMWk8xWAorI3VuZGVmIExaTzFZCisKKyN1bmRlZiBhc3NlcnQKKy8qCitzdGF0aWMgdm9pZCBkaWVfYXQoaW50IGxpbmUpCit7CisgICAgICAgIGJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcm5hbCBlcnJvciBhdCAlZCIsIGxpbmUpOworfQorI2RlZmluZSBhc3NlcnQodikgaWYgKCEodikpIGRpZV9hdChfX0xJTkVfXykKKyovCisjZGVmaW5lIGFzc2VydCh2KSAoKHZvaWQpMCkKKworaW50IGx6bzF4XzFfY29tcHJlc3MoY29uc3QgdWludDhfdCogc3JjLCB1bnNpZ25lZCBzcmNfbGVuLAorCQl1aW50OF90KiBkc3QsIHVuc2lnbmVkKiBkc3RfbGVuLAorCQl2b2lkKiB3cmttZW0pOworaW50IGx6bzF4XzFfMTVfY29tcHJlc3MoY29uc3QgdWludDhfdCogc3JjLCB1bnNpZ25lZCBzcmNfbGVuLAorCQl1aW50OF90KiBkc3QsIHVuc2lnbmVkKiBkc3RfbGVuLAorCQl2b2lkKiB3cmttZW0pOworaW50IGx6bzF4Xzk5OV9jb21wcmVzc19sZXZlbChjb25zdCB1aW50OF90KiBpbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90KiBvdXQsIHVuc2lnbmVkKiBvdXRfbGVuLAorCQl2b2lkKiB3cmttZW0sCisJCWludCBjb21wcmVzc2lvbl9sZXZlbCk7CisKKy8qIGRlY29tcHJlc3Npb24gKi8KKy8vaW50IGx6bzF4X2RlY29tcHJlc3MoY29uc3QgdWludDhfdCogc3JjLCB1bnNpZ25lZCBzcmNfbGVuLAorLy8JCXVpbnQ4X3QqIGRzdCwgdW5zaWduZWQqIGRzdF9sZW4sCisvLwkJdm9pZCogd3JrbWVtIC8qIE5PVCBVU0VEICovKTsKKy8qIHNhZmUgZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZyAqLworaW50IGx6bzF4X2RlY29tcHJlc3Nfc2FmZShjb25zdCB1aW50OF90KiBzcmMsIHVuc2lnbmVkIHNyY19sZW4sCisJCXVpbnQ4X3QqIGRzdCwgdW5zaWduZWQqIGRzdF9sZW4sCisJCXZvaWQqIHdya21lbSAvKiBOT1QgVVNFRCAqLyk7CisKKyNkZWZpbmUgTFpPX0VfT0sgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTFpPX0VfRVJST1IgICAgICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgTFpPX0VfT1VUX09GX01FTU9SWSAgICAgICAgICgtMikgICAgLyogW25vdCB1c2VkIHJpZ2h0IG5vd10gKi8KKyNkZWZpbmUgTFpPX0VfTk9UX0NPTVBSRVNTSUJMRSAgICAgICgtMykgICAgLyogW25vdCB1c2VkIHJpZ2h0IG5vd10gKi8KKyNkZWZpbmUgTFpPX0VfSU5QVVRfT1ZFUlJVTiAgICAgICAgICgtNCkKKyNkZWZpbmUgTFpPX0VfT1VUUFVUX09WRVJSVU4gICAgICAgICgtNSkKKyNkZWZpbmUgTFpPX0VfTE9PS0JFSElORF9PVkVSUlVOICAgICgtNikKKyNkZWZpbmUgTFpPX0VfRU9GX05PVF9GT1VORCAgICAgICAgICgtNykKKyNkZWZpbmUgTFpPX0VfSU5QVVRfTk9UX0NPTlNVTUVEICAgICgtOCkKKyNkZWZpbmUgTFpPX0VfTk9UX1lFVF9JTVBMRU1FTlRFRCAgICgtOSkgICAgLyogW25vdCB1c2VkIHJpZ2h0IG5vd10gKi8KKworLyogbHpvLTIuMDMvaW5jbHVkZS9sem8vbHpvY29uZi5oICovCisjZGVmaW5lIExaT19WRVJTSU9OICAgMHgyMDMwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL3BsYXRmb3JtLmggYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExYmMzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvcGxhdGZvcm0uaApAQCAtMCwwICsxLDUwMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDIwMDYsIEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgQkJfUExBVEZPUk1fSAorI2RlZmluZSBCQl9QTEFURk9STV9IIDEKKworCisvKiBDb252ZW5pZW5jZSBtYWNyb3MgdG8gdGVzdCB0aGUgdmVyc2lvbiBvZiBnY2MuICovCisjdW5kZWYgX19HTlVDX1BSRVJFUQorI2lmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX0dOVUNfTUlOT1JfXworIyBkZWZpbmUgX19HTlVDX1BSRVJFUShtYWosIG1pbikgXAorCQkoKF9fR05VQ19fIDw8IDE2KSArIF9fR05VQ19NSU5PUl9fID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKKyNlbHNlCisjIGRlZmluZSBfX0dOVUNfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworLyogX19yZXN0cmljdCBpcyBrbm93biBpbiBFR0NTIDEuMiBhbmQgYWJvdmUuICovCisjaWYgIV9fR05VQ19QUkVSRVEoMiw5MikKKyMgaWZuZGVmIF9fcmVzdHJpY3QKKyMgIGRlZmluZSBfX3Jlc3RyaWN0CisjIGVuZGlmCisjZW5kaWYKKworI2lmICFfX0dOVUNfUFJFUkVRKDIsNykKKyMgaWZuZGVmIF9fYXR0cmlidXRlX18KKyMgIGRlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjIGVuZGlmCisjZW5kaWYKKworI3VuZGVmIGlubGluZQorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+IDE5OTkwMUwKKy8qIGl0J3MgYSBrZXl3b3JkICovCisjZWxpZiBfX0dOVUNfUFJFUkVRKDIsNykKKyMgZGVmaW5lIGlubGluZSBfX2lubGluZV9fCisjZWxzZQorIyBkZWZpbmUgaW5saW5lCisjZW5kaWYKKworI2lmbmRlZiBfX2NvbnN0CisjIGRlZmluZSBfX2NvbnN0IGNvbnN0CisjZW5kaWYKKworI2RlZmluZSBVTlVTRURfUEFSQU0gX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorI2RlZmluZSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSkKKy8qICJUaGUgbWFsbG9jIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHRoYXQgYSBmdW5jdGlvbgorICogbWF5IGJlIHRyZWF0ZWQgYXMgaWYgYW55IG5vbi1OVUxMIHBvaW50ZXIgaXQgcmV0dXJucyBjYW5ub3QgYWxpYXMKKyAqIGFueSBvdGhlciBwb2ludGVyIHZhbGlkIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMuIFRoaXMgd2lsbCBvZnRlbgorICogaW1wcm92ZSBvcHRpbWl6YXRpb24uIFN0YW5kYXJkIGZ1bmN0aW9ucyB3aXRoIHRoaXMgcHJvcGVydHkgaW5jbHVkZQorICogbWFsbG9jIGFuZCBjYWxsb2MuIHJlYWxsb2MtbGlrZSBmdW5jdGlvbnMgaGF2ZSB0aGlzIHByb3BlcnR5IGFzIGxvbmcKKyAqIGFzIHRoZSBvbGQgcG9pbnRlciBpcyBuZXZlciByZWZlcnJlZCB0byAoaW5jbHVkaW5nIGNvbXBhcmluZyBpdAorICogdG8gdGhlIG5ldyBwb2ludGVyKSBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi1OVUxMIHZhbHVlLiIKKyAqLworI2RlZmluZSBSRVRVUk5TX01BTExPQyBfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSkKKyNkZWZpbmUgUEFDS0VEIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKKyNkZWZpbmUgQUxJR05FRChtKSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18obSkpKQorCisvKiBfX05PX0lOTElORV9fOiBzb21lIGdjYydzIGRvIG5vdCBob25vciBpbmxpbmluZyEgOiggKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDMsMCkgJiYgIWRlZmluZWQoX19OT19JTkxJTkVfXykKKyMgZGVmaW5lIEFMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKSBpbmxpbmUKKy8qIEkndmUgc2VlbiBhIHRvb2xjaGFpbiB3aGVyZSBJIG5lZWRlZCBfX25vaW5saW5lX18gaW5zdGVhZCBvZiBub2lubGluZSAqLworIyBkZWZpbmUgTk9JTkxJTkUgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18pKQorIyBpZiAhRU5BQkxFX1dFUlJPUgorIyAgZGVmaW5lIERFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKSkKKyMgIGRlZmluZSBVTlVTRURfUEFSQU1fUkVTVUxUIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQorIyBlbHNlCisjICBkZWZpbmUgREVQUkVDQVRFRAorIyAgZGVmaW5lIFVOVVNFRF9QQVJBTV9SRVNVTFQKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBBTFdBWVNfSU5MSU5FIGlubGluZQorIyBkZWZpbmUgTk9JTkxJTkUKKyMgZGVmaW5lIERFUFJFQ0FURUQKKyMgZGVmaW5lIFVOVVNFRF9QQVJBTV9SRVNVTFQKKyNlbmRpZgorCisvKiAtZndob2xlLXByb2dyYW0gbWFrZXMgYWxsIHN5bWJvbHMgbG9jYWwuIFRoZSBhdHRyaWJ1dGUgZXh0ZXJuYWxseV92aXNpYmxlCisgKiBmb3JjZXMgYSBzeW1ib2wgZ2xvYmFsLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDQsMSkKKyMgZGVmaW5lIEVYVEVSTkFMTFlfVklTSUJMRSBfX2F0dHJpYnV0ZV9fKCggdmlzaWJpbGl0eSgiZGVmYXVsdCIpICkpCisvL19fYXR0cmlidXRlX18gKChfX2V4dGVybmFsbHlfdmlzaWJsZV9fKSkKKyNlbHNlCisjIGRlZmluZSBFWFRFUk5BTExZX1ZJU0lCTEUKKyNlbmRpZgorCisvKiBBdCA0LjQgZ2NjIGJlY29tZSBtdWNoIG1vcmUgYW5hbCBhYm91dCB0aGlzLCBuZWVkIHRvIHVzZSAiYWxpYXNlZCIgdHlwZXMgKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDQsNCkKKyMgZGVmaW5lIEZJWF9BTElBU0lORyBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSkKKyNlbHNlCisjIGRlZmluZSBGSVhfQUxJQVNJTkcKKyNlbmRpZgorCisvKiBXZSB1c2UgX19leHRlbnNpb25fXyBpbiBzb21lIHBsYWNlcyB0byBzdXBwcmVzcyAtcGVkYW50aWMgd2FybmluZ3MKKyAqIGFib3V0IEdDQyBleHRlbnNpb25zLiAgVGhpcyBmZWF0dXJlIGRpZG4ndCB3b3JrIHByb3Blcmx5IGJlZm9yZQorICogZ2NjIDIuOC4gICovCisjaWYgIV9fR05VQ19QUkVSRVEoMiw4KQorIyBpZm5kZWYgX19leHRlbnNpb25fXworIyAgZGVmaW5lIF9fZXh0ZW5zaW9uX18KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBGQVNUX0ZVTkMgaXMgYSBxdWFsaWZpZXIgd2hpY2ggKHBvc3NpYmx5KSBtYWtlcyBmdW5jdGlvbiBjYWxsIGZhc3RlcgorICogYW5kL29yIHNtYWxsZXIgYnkgdXNpbmcgbW9kaWZpZWQgQUJJLiBJdCBpcyB1c3VhbGx5IG9ubHkgbmVlZGVkCisgKiBvbiBub24tc3RhdGljLCBidXN5Ym94IGludGVybmFsIGZ1bmN0aW9ucy4gUmVjZW50IHZlcnNpb25zIG9mIGdjYworICogb3B0aW1pemUgc3RhdGljcyBhdXRvbWF0aWNhbGx5LiBGQVNUX0ZVTkMgb24gc3RhdGljIGlzIHJlcXVpcmVkCisgKiBvbmx5IGlmIHlvdSBuZWVkIHRvIG1hdGNoIGEgZnVuY3Rpb24gcG9pbnRlcidzIHR5cGUgKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDMsMCkgJiYgZGVmaW5lZChpMzg2KSAvKiB8fCBkZWZpbmVkKF9feDg2XzY0X18pPyAqLworLyogc3RkY2FsbCBtYWtlcyBjYWxsZWUgdG8gcG9wIGFyZ3VtZW50cyBmcm9tIHN0YWNrLCBub3QgY2FsbGVyICovCisjIGRlZmluZSBGQVNUX0ZVTkMgX19hdHRyaWJ1dGVfXygocmVncGFybSgzKSxzdGRjYWxsKSkKKy8qICNlbGlmIC4uLiAtIGFkZCB5b3VyIGZhdm9yaXRlIGFyY2ggdG9kYXkhICovCisjZWxzZQorIyBkZWZpbmUgRkFTVF9GVU5DCisjZW5kaWYKKworLyogTWFrZSBhbGwgZGVjbGFyYXRpb25zIGhpZGRlbiAoLWZ2aXNpYmlsaXR5IGZsYWcgb25seSBhZmZlY3RzIGRlZmluaXRpb25zKSAqLworLyogKGRvbid0IGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgYWZ0ZXIgdGhpcyB1bnRpbCBjb3JyZXNwb25kaW5nIHBvcCEpICovCisjaWYgX19HTlVDX1BSRVJFUSg0LDEpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4gX1ByYWdtYSgiR0NDIHZpc2liaWxpdHkgcHVzaChoaWRkZW4pIikKKyMgZGVmaW5lIFBPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZICAgICAgICAgICAgICBfUHJhZ21hKCJHQ0MgdmlzaWJpbGl0eSBwb3AiKQorI2Vsc2UKKyMgZGVmaW5lIFBVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorIyBkZWZpbmUgUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKyNlbmRpZgorCisvKiBnY2MtMi45NSBoYWQgbm8gdmFfY29weSBidXQgb25seSBfX3ZhX2NvcHkuICovCisjaWYgIV9fR05VQ19QUkVSRVEoMywwKQorIyBpbmNsdWRlIDxzdGRhcmcuaD4KKyMgaWYgIWRlZmluZWQgdmFfY29weSAmJiBkZWZpbmVkIF9fdmFfY29weQorIyAgZGVmaW5lIHZhX2NvcHkoZCxzKSBfX3ZhX2NvcHkoKGQpLChzKSkKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIC0tLS0gRW5kaWFuIERldGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmIGRlZmluZWQoX19kaWdpdGFsX18pICYmIGRlZmluZWQoX191bml4X18pCisjIGluY2x1ZGUgPHNleC5oPgorI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSBcCisgICB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKyMgaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+ICAvKiBybGltaXQgKi8KKyMgaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KKyMgZGVmaW5lIGJzd2FwXzY0IF9fYnN3YXA2NAorIyBkZWZpbmUgYnN3YXBfMzIgX19ic3dhcDMyCisjIGRlZmluZSBic3dhcF8xNiBfX2Jzd2FwMTYKKyNlbHNlCisjIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisjIGluY2x1ZGUgPGVuZGlhbi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyBkZWZpbmUgQkJfQklHX0VORElBTiAxCisjIGRlZmluZSBCQl9MSVRUTEVfRU5ESUFOIDAKKyNlbGlmIGRlZmluZWQoX19CWVRFX09SREVSKSAmJiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBCQl9CSUdfRU5ESUFOIDAKKyMgZGVmaW5lIEJCX0xJVFRMRV9FTkRJQU4gMQorI2VsaWYgZGVmaW5lZChfQllURV9PUkRFUikgJiYgX0JZVEVfT1JERVIgPT0gX0JJR19FTkRJQU4KKyMgZGVmaW5lIEJCX0JJR19FTkRJQU4gMQorIyBkZWZpbmUgQkJfTElUVExFX0VORElBTiAwCisjZWxpZiBkZWZpbmVkKF9CWVRFX09SREVSKSAmJiBfQllURV9PUkRFUiA9PSBfTElUVExFX0VORElBTgorIyBkZWZpbmUgQkJfQklHX0VORElBTiAwCisjIGRlZmluZSBCQl9MSVRUTEVfRU5ESUFOIDEKKyNlbGlmIGRlZmluZWQoQllURV9PUkRFUikgJiYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBCQl9CSUdfRU5ESUFOIDEKKyMgZGVmaW5lIEJCX0xJVFRMRV9FTkRJQU4gMAorI2VsaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIEJCX0JJR19FTkRJQU4gMAorIyBkZWZpbmUgQkJfTElUVExFX0VORElBTiAxCisjZWxpZiBkZWZpbmVkKF9fMzg2X18pCisjIGRlZmluZSBCQl9CSUdfRU5ESUFOIDAKKyMgZGVmaW5lIEJCX0xJVFRMRV9FTkRJQU4gMQorI2Vsc2UKKyMgZXJyb3IgIkNhbid0IGRldGVybWluZSBlbmRpYW5uZXNzIgorI2VuZGlmCisKKyNpZiBVTE9OR19NQVggPiAweGZmZmZmZmZmCisjIGRlZmluZSBiYl9ic3dhcF82NCh4KSBic3dhcF82NCh4KQorI2VuZGlmCisKKy8qIFNXQVBfTEVubiBtZWFucyAiY29udmVydCBDUFU8LT5saXR0bGVfZW5kaWFuIGJ5IHN3YXBwaW5nIGJ5dGVzIiAqLworI2lmIEJCX0JJR19FTkRJQU4KKyMgZGVmaW5lIFNXQVBfQkUxNih4KSAoeCkKKyMgZGVmaW5lIFNXQVBfQkUzMih4KSAoeCkKKyMgZGVmaW5lIFNXQVBfQkU2NCh4KSAoeCkKKyMgZGVmaW5lIFNXQVBfTEUxNih4KSBic3dhcF8xNih4KQorIyBkZWZpbmUgU1dBUF9MRTMyKHgpIGJzd2FwXzMyKHgpCisjIGRlZmluZSBTV0FQX0xFNjQoeCkgYmJfYnN3YXBfNjQoeCkKKyMgZGVmaW5lIElGX0JJR19FTkRJQU4oLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgSUZfTElUVExFX0VORElBTiguLi4pCisjZWxzZQorIyBkZWZpbmUgU1dBUF9CRTE2KHgpIGJzd2FwXzE2KHgpCisjIGRlZmluZSBTV0FQX0JFMzIoeCkgYnN3YXBfMzIoeCkKKyMgZGVmaW5lIFNXQVBfQkU2NCh4KSBiYl9ic3dhcF82NCh4KQorIyBkZWZpbmUgU1dBUF9MRTE2KHgpICh4KQorIyBkZWZpbmUgU1dBUF9MRTMyKHgpICh4KQorIyBkZWZpbmUgU1dBUF9MRTY0KHgpICh4KQorIyBkZWZpbmUgSUZfQklHX0VORElBTiguLi4pCisjIGRlZmluZSBJRl9MSVRUTEVfRU5ESUFOKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisKKy8qIC0tLS0gVW5hbGlnbmVkIGFjY2VzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQgICAgICBiYl9fYWxpYXNlZF9pbnQgICAgICBGSVhfQUxJQVNJTkc7Cit0eXBlZGVmIHVpbnQxNl90IGJiX19hbGlhc2VkX3VpbnQxNl90IEZJWF9BTElBU0lORzsKK3R5cGVkZWYgdWludDMyX3QgYmJfX2FsaWFzZWRfdWludDMyX3QgRklYX0FMSUFTSU5HOworCisvKiBOQjogdW5hbGlnbmVkIHBhcmFtZXRlciBzaG91bGQgYmUgYSBwb2ludGVyLCBhbGlnbmVkIG9uZSAtCisgKiBhIGx2YWx1ZS4gVGhpcyBtYWtlcyBpdCBtb3JlIGxpa2VseSB0byBub3Qgc3dhcCB0aGVtIGJ5IG1pc3Rha2UKKyAqLworI2lmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKQorIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZF9pbnQodiwgaW50cCkgKCh2KSA9ICooYmJfX2FsaWFzZWRfaW50KikoaW50cCkpCisjIGRlZmluZSBtb3ZlX2Zyb21fdW5hbGlnbmVkMTYodiwgdTE2cCkgKCh2KSA9ICooYmJfX2FsaWFzZWRfdWludDE2X3QqKSh1MTZwKSkKKyMgZGVmaW5lIG1vdmVfZnJvbV91bmFsaWduZWQzMih2LCB1MzJwKSAoKHYpID0gKihiYl9fYWxpYXNlZF91aW50MzJfdCopKHUzMnApKQorIyBkZWZpbmUgbW92ZV90b191bmFsaWduZWQxNih1MTZwLCB2KSAgICgqKGJiX19hbGlhc2VkX3VpbnQxNl90KikodTE2cCkgPSAodikpCisjIGRlZmluZSBtb3ZlX3RvX3VuYWxpZ25lZDMyKHUzMnAsIHYpICAgKCooYmJfX2FsaWFzZWRfdWludDMyX3QqKSh1MzJwKSA9ICh2KSkKKy8qICNlbGlmIC4uLiAtIGFkZCB5b3VyIGZhdm9yaXRlIGFyY2ggdG9kYXkhICovCisjZWxzZQorLyogcGVyZm9ybXMgcmVhc29uYWJseSB3ZWxsIChnY2MgdXN1YWxseSBpbmxpbmVzIG1lbWNweSBoZXJlKSAqLworIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZF9pbnQodiwgaW50cCkgKG1lbWNweSgmKHYpLCAoaW50cCksIHNpemVvZihpbnQpKSkKKyMgZGVmaW5lIG1vdmVfZnJvbV91bmFsaWduZWQxNih2LCB1MTZwKSAobWVtY3B5KCYodiksICh1MTZwKSwgMikpCisjIGRlZmluZSBtb3ZlX2Zyb21fdW5hbGlnbmVkMzIodiwgdTMycCkgKG1lbWNweSgmKHYpLCAodTMycCksIDQpKQorIyBkZWZpbmUgbW92ZV90b191bmFsaWduZWQxNih1MTZwLCB2KSBkbyB7IFwKKwl1aW50MTZfdCBfX3QgPSAodik7IFwKKwltZW1jcHkoKHUxNnApLCAmX190LCA0KTsgXAorfSB3aGlsZSAoMCkKKyMgZGVmaW5lIG1vdmVfdG9fdW5hbGlnbmVkMzIodTMycCwgdikgZG8geyBcCisJdWludDMyX3QgX190ID0gKHYpOyBcCisJbWVtY3B5KCh1MzJwKSwgJl9fdCwgNCk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiAtLS0tIFNpemUtc2F2aW5nICJzbWFsbCIgaW50cyAoYXJjaC1kZXBlbmRlbnQpIC0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX21pcHNfXykgfHwgZGVmaW5lZChfX2NyaXNfXykKKy8qIGFkZCBvdGhlciBhcmNoZXMgd2hpY2ggYmVuZWZpdCBmcm9tIHRoaXMuLi4gKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIgc21hbGxpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgc21hbGx1aW50OworI2Vsc2UKKy8qIGZvciBhcmNoZXMgd2hlcmUgYnl0ZSBhY2Nlc3NlcyBnZW5lcmF0ZSBsYXJnZXIgY29kZTogKi8KK3R5cGVkZWYgaW50IHNtYWxsaW50OwordHlwZWRlZiB1bnNpZ25lZCBzbWFsbHVpbnQ7CisjZW5kaWYKKworLyogSVNPIEMgU3RhbmRhcmQ6ICA3LjE2ICBCb29sZWFuIHR5cGUgYW5kIHZhbHVlcyAgPHN0ZGJvb2wuaD4gKi8KKyNpZiAoZGVmaW5lZCBfX2RpZ2l0YWxfXyAmJiBkZWZpbmVkIF9fdW5peF9fKQorLyogb2xkIHN5c3RlbSB3aXRob3V0IChwcm9wZXIpIEM5OSBzdXBwb3J0ICovCisjIGRlZmluZSBib29sIHNtYWxsdWludAorI2Vsc2UKKy8qIG1vZGVybiBzeXN0ZW0sIHNvIHVzZSBpdCAqLworIyBpbmNsdWRlIDxzdGRib29sLmg+CisjZW5kaWYKKworCisvKi0tLS0tIEtlcm5lbCB2ZXJzaW9uaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCisKKworLyogLS0tLSBNaXNjZWxsYW5lb3VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZCBfX0dMSUJDX18gXAorIHx8IGRlZmluZWQgX19VQ0xJQkNfXyBcCisgfHwgZGVmaW5lZCBfX2RpZXRsaWJjX18gXAorIHx8IGRlZmluZWQgX19CSU9OSUNfXyBcCisgfHwgZGVmaW5lZCBfTkVXTElCX1ZFUlNJT04KKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgYmJfc2V0cGdycCAqLworI2lmIGRlZmluZWQoX19kaWdpdGFsX18pICYmIGRlZmluZWQoX191bml4X18pCisvKiB1c2UgbGVnYWN5IHNldHBncnAocGlkX3QsIHBpZF90KSBmb3Igbm93LiAgbW92ZSB0byBwbGF0Zm9ybS5jICovCisjIGRlZmluZSBiYl9zZXRwZ3JwKCkgZG8geyBwaWRfdCBfX21lID0gZ2V0cGlkKCk7IHNldHBncnAoX19tZSwgX19tZSk7IH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgYmJfc2V0cGdycCgpIHNldHBncnAoKQorI2VuZGlmCisKKy8qIGZkcHJpbnRmIGlzIG1vcmUgcmVhZGFibGUsIHdlIHVzZWQgaXQgYmVmb3JlIGRwcmludGYgd2FzIHN0YW5kYXJkaXplZCAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2RlZmluZSBmZHByaW50ZiBkcHJpbnRmCisKKy8qIFVzZWZ1bCBmb3IgZGVmZWF0aW5nIGdjYydzIGFsaWdubWVudCBvZiAiY2hhciBtZXNzYWdlW10iLWxpa2UgZGF0YSAqLworI2lmIDEgLyogaWYgbmVlZGVkOiAhZGVmaW5lZChhcmNoMSkgJiYgIWRlZmluZWQoYXJjaDIpICovCisjIGRlZmluZSBBTElHTjEgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxKSkpCisjIGRlZmluZSBBTElHTjIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyKSkpCisjIGRlZmluZSBBTElHTjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpCisjZWxzZQorLyogQXJjaGVzIHdoaWNoIE1VU1QgaGF2ZSAyIG9yIDQgYnl0ZSBhbGlnbm1lbnQgZm9yIGV2ZXJ5dGhpbmcgYXJlIGhlcmUgKi8KKyMgZGVmaW5lIEFMSUdOMQorIyBkZWZpbmUgQUxJR04yCisjIGRlZmluZSBBTElHTjQKKyNlbmRpZgorCisvKgorICogRm9yIDAuOS4yOSBhbmQgc3ZuLCBfX0FSQ0hfVVNFX01NVV9fIGluZGljYXRlcyBuby1tbXUgcmVsaWFibHkuCisgKiBGb3IgZWFybGllciB2ZXJzaW9ucyB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gY2hlY2sgaWYgd2UgYXJlIGJ1aWxkaW5nCisgKiBmb3IgYSBtbXUtbGVzcyBzeXN0ZW0uCisgKi8KKyNpZiBFTkFCTEVfTk9NTVUgfHwgXAorICAgIChkZWZpbmVkIF9fVUNMSUJDX18gJiYgX19VQ0xJQkNfTUFKT1JfXyA+PSAwICYmIF9fVUNMSUJDX01JTk9SX18gPj0gOSAmJiBcCisgICAgX19VQ0xJQkNfU1VCTEVWRUxfXyA+IDI4ICYmICFkZWZpbmVkIF9fQVJDSF9VU0VfTU1VX18pCisjIGRlZmluZSBCQl9NTVUgMAorIyBkZWZpbmUgVVNFX0ZPUl9OT01NVSguLi4pIF9fVkFfQVJHU19fCisjIGRlZmluZSBVU0VfRk9SX01NVSguLi4pCisjZWxzZQorIyBkZWZpbmUgQkJfTU1VIDEKKyMgZGVmaW5lIFVTRV9GT1JfTk9NTVUoLi4uKQorIyBkZWZpbmUgVVNFX0ZPUl9NTVUoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fZGlnaXRhbF9fKSAmJiBkZWZpbmVkKF9fdW5peF9fKQorIyBpbmNsdWRlIDxzdGFuZGFyZHMuaD4KKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyMgZGVmaW5lIFBSSXUzMiAidSIKKyMgaWYgIWRlZmluZWQgQURKX09GRlNFVF9TSU5HTEVTSE9UICYmIGRlZmluZWQgTU9EX0NMS0EgJiYgZGVmaW5lZCBNT0RfT0ZGU0VUCisjICBkZWZpbmUgQURKX09GRlNFVF9TSU5HTEVTSE9UIChNT0RfQ0xLQSB8IE1PRF9PRkZTRVQpCisjIGVuZGlmCisjIGlmICFkZWZpbmVkIEFESl9GUkVRVUVOQ1kgJiYgZGVmaW5lZCBNT0RfRlJFUVVFTkNZCisjICBkZWZpbmUgQURKX0ZSRVFVRU5DWSBNT0RfRlJFUVVFTkNZCisjIGVuZGlmCisjIGlmICFkZWZpbmVkIEFESl9USU1FQ09OU1QgJiYgZGVmaW5lZCBNT0RfVElNRUNPTlNUCisjICBkZWZpbmUgQURKX1RJTUVDT05TVCBNT0RfVElNRUNPTlNUCisjIGVuZGlmCisjIGlmICFkZWZpbmVkIEFESl9USUNLICYmIGRlZmluZWQgTU9EX0NMS0IKKyMgIGRlZmluZSBBREpfVElDSyBNT0RfQ0xLQgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBNQVhTWU1MSU5LUyBTWU1MT09QX01BWAorI2VuZGlmCisKKworLyogLS0tLSBXaG8gbWlzc2VzIHdoYXQ/IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBBc3N1bWUgYWxsIHRoZXNlIGZ1bmN0aW9ucyBhbmQgaGVhZGVyIGZpbGVzIGV4aXN0IGJ5IGRlZmF1bHQuCisgKiBQbGF0Zm9ybXMgd2hlcmUgaXQgaXMgbm90IHRydWUgd2lsbCAjdW5kZWYgdGhlbSBiZWxvdy4KKyAqLworI2RlZmluZSBIQVZFX0NMRUFSRU5WIDEKKyNkZWZpbmUgSEFWRV9GREFUQVNZTkMgMQorI2RlZmluZSBIQVZFX0RQUklOVEYgMQorI2RlZmluZSBIQVZFX01FTVJDSFIgMQorI2RlZmluZSBIQVZFX01LRFRFTVAgMQorI2RlZmluZSBIQVZFX1BUU05BTUVfUiAxCisjZGVmaW5lIEhBVkVfU0VUQklUIDEKKyNkZWZpbmUgSEFWRV9TSUdIQU5ETEVSX1QgMQorI2RlZmluZSBIQVZFX1NUUENQWSAxCisjZGVmaW5lIEhBVkVfU1RSQ0FTRVNUUiAxCisjZGVmaW5lIEhBVkVfU1RSQ0hSTlVMIDEKKyNkZWZpbmUgSEFWRV9TVFJTRVAgMQorI2RlZmluZSBIQVZFX1NUUlNJR05BTCAxCisjZGVmaW5lIEhBVkVfU1RSVkVSU0NNUCAxCisjZGVmaW5lIEhBVkVfVkFTUFJJTlRGIDEKKyNkZWZpbmUgSEFWRV9VTkxPQ0tFRF9TVERJTyAxCisjZGVmaW5lIEhBVkVfVU5MT0NLRURfTElORV9PUFMgMQorI2RlZmluZSBIQVZFX0dFVExJTkUgMQorI2RlZmluZSBIQVZFX1hUQUJTIDEKKyNkZWZpbmUgSEFWRV9NTlRFTlRfSCAxCisjZGVmaW5lIEhBVkVfTkVUX0VUSEVSTkVUX0ggMQorI2RlZmluZSBIQVZFX1NZU19TVEFURlNfSCAxCisKKyNpZiBkZWZpbmVkKF9fVUNMSUJDX01BSk9SX18pCisjIGlmIF9fVUNMSUJDX01BSk9SX18gPT0gMCBcCisgICYmICggICBfX1VDTElCQ19NSU5PUl9fIDwgOSBcCisgICAgIHx8IChfX1VDTElCQ19NSU5PUl9fID09IDkgJiYgX19VQ0xJQkNfU1VCTEVWRUxfXyA8IDMxKSBcCisgICAgICkKKyMgIHVuZGVmIEhBVkVfU1RSVkVSU0NNUAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fZGlldGxpYmNfXykKKyMgdW5kZWYgSEFWRV9TVFJDSFJOVUwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyMgdW5kZWYgSEFWRV9EUFJJTlRGCisjIHVuZGVmIEhBVkVfR0VUTElORQorIyB1bmRlZiBIQVZFX01FTVJDSFIKKyMgdW5kZWYgSEFWRV9NS0RURU1QCisjIHVuZGVmIEhBVkVfU0VUQklUCisjIHVuZGVmIEhBVkVfU1RQQ1BZCisjIHVuZGVmIEhBVkVfU1RSQ0FTRVNUUgorIyB1bmRlZiBIQVZFX1NUUkNIUk5VTAorIyB1bmRlZiBIQVZFX1NUUlNFUAorIyB1bmRlZiBIQVZFX1NUUlNJR05BTAorIyB1bmRlZiBIQVZFX1NUUlZFUlNDTVAKKyMgdW5kZWYgSEFWRV9WQVNQUklOVEYKKyMgdW5kZWYgSEFWRV9VTkxPQ0tFRF9TVERJTworIyB1bmRlZiBIQVZFX1VOTE9DS0VEX0xJTkVfT1BTCisjIHVuZGVmIEhBVkVfTkVUX0VUSEVSTkVUX0gKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyB1bmRlZiBIQVZFX0NMRUFSRU5WCisjIHVuZGVmIEhBVkVfRkRQUklOVEYKKyMgdW5kZWYgSEFWRV9NRU1SQ0hSCisjIHVuZGVmIEhBVkVfUFRTTkFNRV9SCisjIHVuZGVmIEhBVkVfU1RSVkVSU0NNUAorIyB1bmRlZiBIQVZFX1VOTE9DS0VEX0xJTkVfT1BTCisjZW5kaWYKKworLyogVGhlc2UgQlNELWRlcml2ZWQgT1NlcyBzaGFyZSBtYW55IHNpbWlsYXJpdGllcyAqLworI2lmIChkZWZpbmVkIF9fZGlnaXRhbF9fICYmIGRlZmluZWQgX191bml4X18pIFwKKyB8fCBkZWZpbmVkIF9fQVBQTEVfXyBcCisgfHwgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fT3BlbkJTRF9fIHx8IGRlZmluZWQgX19OZXRCU0RfXworIyB1bmRlZiBIQVZFX0NMRUFSRU5WCisjIHVuZGVmIEhBVkVfRkRBVEFTWU5DCisjIHVuZGVmIEhBVkVfR0VUTElORQorIyB1bmRlZiBIQVZFX01OVEVOVF9ICisjIHVuZGVmIEhBVkVfUFRTTkFNRV9SCisjIHVuZGVmIEhBVkVfU1lTX1NUQVRGU19ICisjIHVuZGVmIEhBVkVfU0lHSEFORExFUl9UCisjIHVuZGVmIEhBVkVfU1RSVkVSU0NNUAorIyB1bmRlZiBIQVZFX1hUQUJTCisjIHVuZGVmIEhBVkVfRFBSSU5URgorIyB1bmRlZiBIQVZFX1VOTE9DS0VEX1NURElPCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyMgdW5kZWYgSEFWRV9TVFJDSFJOVUwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX05ldEJTRF9fKQorIyBkZWZpbmUgSEFWRV9HRVRMSU5FIDEgIC8qIFJlY2VudCBOZXRCU0QgdmVyc2lvbnMgaGF2ZSBnZXRsaW5lKCkgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2RpZ2l0YWxfXykgJiYgZGVmaW5lZChfX3VuaXhfXykKKyMgdW5kZWYgSEFWRV9TVFBDUFkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBTkRST0lEKSB8fCBkZWZpbmVkKF9fQU5EUk9JRF9fKQorIyB1bmRlZiBIQVZFX0RQUklOVEYKKyMgdW5kZWYgSEFWRV9HRVRMSU5FCisjIHVuZGVmIEhBVkVfU1RQQ1BZCisjIHVuZGVmIEhBVkVfU1RSQ0hSTlVMCisjIHVuZGVmIEhBVkVfU1RSVkVSU0NNUAorIyB1bmRlZiBIQVZFX1VOTE9DS0VEX0xJTkVfT1BTCisjIHVuZGVmIEhBVkVfTkVUX0VUSEVSTkVUX0gKKyNlbmRpZgorCisvKgorICogTm93LCBkZWZpbmUgcHJvdG90eXBlcyBmb3IgYWxsIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiBwbGF0Zm9ybS5jCisgKiBUaGVzZSBtdXN0IGNvbWUgYWZ0ZXIgYWxsIHRoZSBIQVZFXyogbWFjcm9zIGFyZSBkZWZpbmVkIChvciBub3QpCisgKi8KKworI2lmbmRlZiBIQVZFX0RQUklOVEYKK2V4dGVybiBpbnQgZHByaW50ZihpbnQgZmQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUVNUkNIUgorZXh0ZXJuIHZvaWQgKm1lbXJjaHIoY29uc3Qgdm9pZCAqcywgaW50IGMsIHNpemVfdCBuKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX01LRFRFTVAKK2V4dGVybiBjaGFyICpta2R0ZW1wKGNoYXIgKnRlbXBsYXRlKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NFVEJJVAorIyBkZWZpbmUgc2V0Yml0KGEsIGIpICAoKGEpWyhiKSA+PiAzXSB8PSAxIDw8ICgoYikgJiA3KSkKKyMgZGVmaW5lIGNscmJpdChhLCBiKSAgKChhKVsoYikgPj4gM10gJj0gfigxIDw8ICgoYikgJiA3KSkpCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NJR0hBTkRMRVJfVAordHlwZWRlZiB2b2lkICgqc2lnaGFuZGxlcl90KShpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFBDUFkKK2V4dGVybiBjaGFyICpzdHBjcHkoY2hhciAqcCwgY29uc3QgY2hhciAqdG9fYWRkKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkNBU0VTVFIKK2V4dGVybiBjaGFyICpzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnBhdHRlcm4pIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0hSTlVMCitleHRlcm4gY2hhciAqc3RyY2hybnVsKGNvbnN0IGNoYXIgKnMsIGludCBjKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlNFUAorZXh0ZXJuIGNoYXIgKnN0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSU0lHTkFMCisvKiBOb3QgZXhhY3RseSB0aGUgc2FtZTogaW5zdGVhZCBvZiAiU3RvcHBlZCIgaXQgc2hvd3MgIlNUT1AiIGV0YyAqLworIyBkZWZpbmUgc3Ryc2lnbmFsKHNpZykgZ2V0X3NpZ25hbWUoc2lnKQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9WQVNQUklOVEYKK2V4dGVybiBpbnQgdmFzcHJpbnRmKGNoYXIgKipzdHJpbmdfcHRyLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgcCkgRkFTVF9GVU5DOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRMSU5FCisjIGluY2x1ZGUgPHN0ZGlvLmg+IC8qIGZvciBGSUxFICovCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBzaXplX3QgKi8KK2V4dGVybiBzc2l6ZV90IGdldGxpbmUoY2hhciAqKmxpbmVwdHIsIHNpemVfdCAqbiwgRklMRSAqc3RyZWFtKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL3B3ZF8uaCBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvcHdkXy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MGI3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL3B3ZF8uaApAQCAtMCwwICsxLDEwNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTUsOTYsOTcsOTgsOTksMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIFBPU0lYIFN0YW5kYXJkOiA5LjIuMiBVc2VyIERhdGFiYXNlIEFjY2Vzcwk8cHdkLmg+CisgKi8KKworI2lmbmRlZiBCQl9QV0RfSAorI2RlZmluZSBCQl9QV0RfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGFmdGVyICNpbmNsdWRlIDxwd2QuaD4KKyAqIFdlIHdpbGwgdXNlIGxpYmMtZGVmaW5lZCBzdHJ1Y3R1cmVzLCBidXQgd2lsbCAjZGVmaW5lIGZ1bmN0aW9uIG5hbWVzCisgKiBzbyB0aGF0IGZ1bmN0aW9uIGNhbGxzIGFyZSBkaXJlY3RlZCB0byBiYl9pbnRlcm5hbF9YWFggcmVwbGFjZW1lbnRzCisgKi8KKworI2RlZmluZSBzZXRwd2VudCAgICBiYl9pbnRlcm5hbF9zZXRwd2VudAorI2RlZmluZSBlbmRwd2VudCAgICBiYl9pbnRlcm5hbF9lbmRwd2VudAorI2RlZmluZSBnZXRwd2VudCAgICBiYl9pbnRlcm5hbF9nZXRwd2VudAorI2RlZmluZSBmZ2V0cHdlbnQgICBiYl9pbnRlcm5hbF9mZ2V0cHdlbnQKKyNkZWZpbmUgcHV0cHdlbnQgICAgYmJfaW50ZXJuYWxfcHV0cHdlbnQKKyNkZWZpbmUgZ2V0cHd1aWQgICAgYmJfaW50ZXJuYWxfZ2V0cHd1aWQKKyNkZWZpbmUgZ2V0cHduYW0gICAgYmJfaW50ZXJuYWxfZ2V0cHduYW0KKyNkZWZpbmUgZ2V0cHdlbnRfciAgYmJfaW50ZXJuYWxfZ2V0cHdlbnRfcgorI2RlZmluZSBnZXRwd3VpZF9yICBiYl9pbnRlcm5hbF9nZXRwd3VpZF9yCisjZGVmaW5lIGdldHB3bmFtX3IgIGJiX2ludGVybmFsX2dldHB3bmFtX3IKKyNkZWZpbmUgZmdldHB3ZW50X3IgYmJfaW50ZXJuYWxfZmdldHB3ZW50X3IKKworCisvKiBBbGwgZnVuY3Rpb24gbmFtZXMgYmVsb3cgc2hvdWxkIGJlIHJlbWFwcGVkIGJ5ICNkZWZpbmVzIGFib3ZlCisgKiBpbiBvcmRlciB0byBub3QgY29sbGlkZSB3aXRoIGxpYmMgbmFtZXMuICovCisKKworLyogUmV3aW5kIHRoZSBwYXNzd29yZC1maWxlIHN0cmVhbS4gICovCitleHRlcm4gdm9pZCBzZXRwd2VudCh2b2lkKTsKKworLyogQ2xvc2UgdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLiAgKi8KK2V4dGVybiB2b2lkIGVuZHB3ZW50KHZvaWQpOworCisjaWZkZWYgVU5VU0VEX1NJTkNFX1dFX0FWT0lEX1NUQVRJQ19CVUZTCisvKiBSZWFkIGFuIGVudHJ5IGZyb20gdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLCBvcGVuaW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCitleHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHdlbnQodm9pZCk7CisKKy8qIFJlYWQgYW4gZW50cnkgZnJvbSBTVFJFQU0uICAqLworZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmZnZXRwd2VudChGSUxFICpfX3N0cmVhbSk7CisKKy8qIFdyaXRlIHRoZSBnaXZlbiBlbnRyeSBvbnRvIHRoZSBnaXZlbiBzdHJlYW0uICAqLworZXh0ZXJuIGludCBwdXRwd2VudChjb25zdCBzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcCwKKwkJICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fZik7CisjZW5kaWYKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgdXNlciBJRC4gICovCitleHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHd1aWQodWlkX3QgX191aWQpOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyB1c2VybmFtZS4gICovCitleHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHduYW0oY29uc3QgY2hhciAqX19uYW1lKTsKKworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4KKworICAgUExFQVNFIE5PVEU6IHRoZSBgZ2V0cHdlbnRfcicgZnVuY3Rpb24gaXMgbm90ICh5ZXQpIHN0YW5kYXJkaXplZC4KKyAgIFRoZSBpbnRlcmZhY2UgbWF5IGNoYW5nZSBpbiBsYXRlciB2ZXJzaW9ucyBvZiB0aGlzIGxpYnJhcnkuICBCdXQKKyAgIHRoZSBpbnRlcmZhY2UgaXMgZGVzaWduZWQgZm9sbG93aW5nIHRoZSBwcmluY2lwYWxzIHVzZWQgZm9yIHRoZQorICAgb3RoZXIgcmVlbnRyYW50IGZ1bmN0aW9ucyBzbyB0aGUgY2hhbmNlcyBhcmUgZ29vZCB0aGlzIGlzIHdoYXQgdGhlCisgICBQT1NJWCBwZW9wbGUgd291bGQgY2hvb3NlLiAgKi8KKworZXh0ZXJuIGludCBnZXRwd2VudF9yKHN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3QgcGFzc3dkICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZ2V0cHd1aWRfcih1aWRfdCBfX3VpZCwKKwkJICAgICAgIHN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3QgcGFzc3dkICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZ2V0cHduYW1fcihjb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJICAgICAgIHN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3QgcGFzc3dkICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKy8qIFJlYWQgYW4gZW50cnkgZnJvbSBTVFJFQU0uICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdGFuZGFyZGl6ZWQgYW5kCisgICBwcm9iYWJseSBuZXZlciB3aWxsLiAgKi8KK2V4dGVybiBpbnQgZmdldHB3ZW50X3IoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCXN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQlzdHJ1Y3QgcGFzc3dkICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9ydGNfLmggYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL3J0Y18uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBmYzIwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9ydGNfLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvbW1vbiBkZWZpbmVzL3N0cnVjdHVyZXMvZXRjLi4uIGZvciBhcHBsZXRzIHRoYXQgbmVlZCB0byB3b3JrIHdpdGggdGhlIFJUQy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZm5kZWYgQkJfUlRDX0gKKyNkZWZpbmUgQkJfUlRDX0ggMQorCisjaW5jbHVkZSAibGliYmIuaCIKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2ludCBydGNfYWRqdGltZV9pc191dGModm9pZCkgRkFTVF9GVU5DOworaW50IHJ0Y194b3Blbihjb25zdCBjaGFyICoqZGVmYXVsdF9ydGMsIGludCBmbGFncykgRkFTVF9GVU5DOwordm9pZCBydGNfcmVhZF90bShzdHJ1Y3QgdG0gKnB0bSwgaW50IGZkKSBGQVNUX0ZVTkM7Cit0aW1lX3QgcnRjX3RtMnRpbWUoc3RydWN0IHRtICpwdG0sIGludCB1dGMpIEZBU1RfRlVOQzsKKworCisvKgorICogRXZlcnl0aGluZyBiZWxvdyB0aGlzIHBvaW50IGhhcyBiZWVuIGNvcGllZCBmcm9tIGxpbnV4L3J0Yy5oCisgKiB0byBlbGltaW5hdGUgdGhlIGtlcm5lbCBoZWFkZXIgZGVwZW5kZW5jeQorICovCisKK3N0cnVjdCBsaW51eF9ydGNfdGltZSB7CisJaW50IHRtX3NlYzsKKwlpbnQgdG1fbWluOworCWludCB0bV9ob3VyOworCWludCB0bV9tZGF5OworCWludCB0bV9tb247CisJaW50IHRtX3llYXI7CisJaW50IHRtX3dkYXk7CisJaW50IHRtX3lkYXk7CisJaW50IHRtX2lzZHN0OworfTsKKworc3RydWN0IGxpbnV4X3J0Y193a2Fscm0geworCXVuc2lnbmVkIGNoYXIgZW5hYmxlZDsgIC8qIDAgPSBhbGFybSBkaXNhYmxlZCwgMSA9IGFsYXJtIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHBlbmRpbmc7ICAvKiAwID0gYWxhcm0gbm90IHBlbmRpbmcsIDEgPSBhbGFybSBwZW5kaW5nICovCisJc3RydWN0IGxpbnV4X3J0Y190aW1lIHRpbWU7ICAvKiB0aW1lIHRoZSBhbGFybSBpcyBzZXQgdG8gKi8KK307CisKKy8qCisgKiBpb2N0bCBjYWxscyB0aGF0IGFyZSBwZXJtaXR0ZWQgdG8gdGhlIC9kZXYvcnRjIGludGVyZmFjZSwgaWYKKyAqIGFueSBvZiB0aGUgUlRDIGRyaXZlcnMgYXJlIGVuYWJsZWQuCisgKi8KKyNkZWZpbmUgUlRDX0FJRV9PTiAgICAgIF9JTygncCcsIDB4MDEpICAvKiBBbGFybSBpbnQuIGVuYWJsZSBvbiAgICAgICAgICovCisjZGVmaW5lIFJUQ19BSUVfT0ZGICAgICBfSU8oJ3AnLCAweDAyKSAgLyogLi4uIG9mZiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSVENfVUlFX09OICAgICAgX0lPKCdwJywgMHgwMykgIC8qIFVwZGF0ZSBpbnQuIGVuYWJsZSBvbiAgICAgICAgKi8KKyNkZWZpbmUgUlRDX1VJRV9PRkYgICAgIF9JTygncCcsIDB4MDQpICAvKiAuLi4gb2ZmICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJUQ19QSUVfT04gICAgICBfSU8oJ3AnLCAweDA1KSAgLyogUGVyaW9kaWMgaW50LiBlbmFibGUgb24gICAgICAqLworI2RlZmluZSBSVENfUElFX09GRiAgICAgX0lPKCdwJywgMHgwNikgIC8qIC4uLiBvZmYgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlRDX1dJRV9PTiAgICAgIF9JTygncCcsIDB4MGYpICAvKiBXYXRjaGRvZyBpbnQuIGVuYWJsZSBvbiAgICAgICovCisjZGVmaW5lIFJUQ19XSUVfT0ZGICAgICBfSU8oJ3AnLCAweDEwKSAgLyogLi4uIG9mZiAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJUQ19BTE1fU0VUICAgICBfSU9XKCdwJywgMHgwNywgc3RydWN0IGxpbnV4X3J0Y190aW1lKSAvKiBTZXQgYWxhcm0gdGltZSAgKi8KKyNkZWZpbmUgUlRDX0FMTV9SRUFEICAgIF9JT1IoJ3AnLCAweDA4LCBzdHJ1Y3QgbGludXhfcnRjX3RpbWUpIC8qIFJlYWQgYWxhcm0gdGltZSAqLworI2RlZmluZSBSVENfUkRfVElNRSAgICAgX0lPUigncCcsIDB4MDksIHN0cnVjdCBsaW51eF9ydGNfdGltZSkgLyogUmVhZCBSVEMgdGltZSAgICovCisjZGVmaW5lIFJUQ19TRVRfVElNRSAgICBfSU9XKCdwJywgMHgwYSwgc3RydWN0IGxpbnV4X3J0Y190aW1lKSAvKiBTZXQgUlRDIHRpbWUgICAgKi8KKyNkZWZpbmUgUlRDX0lSUVBfUkVBRCAgIF9JT1IoJ3AnLCAweDBiLCB1bnNpZ25lZCBsb25nKSAgIC8qIFJlYWQgSVJRIHJhdGUgICAqLworI2RlZmluZSBSVENfSVJRUF9TRVQgICAgX0lPVygncCcsIDB4MGMsIHVuc2lnbmVkIGxvbmcpICAgLyogU2V0IElSUSByYXRlICAgICovCisjZGVmaW5lIFJUQ19FUE9DSF9SRUFEICBfSU9SKCdwJywgMHgwZCwgdW5zaWduZWQgbG9uZykgICAvKiBSZWFkIGVwb2NoICAgICAgKi8KKyNkZWZpbmUgUlRDX0VQT0NIX1NFVCAgIF9JT1coJ3AnLCAweDBlLCB1bnNpZ25lZCBsb25nKSAgIC8qIFNldCBlcG9jaCAgICAgICAqLworCisjZGVmaW5lIFJUQ19XS0FMTV9TRVQgICBfSU9XKCdwJywgMHgwZiwgc3RydWN0IGxpbnV4X3J0Y193a2Fscm0pLyogU2V0IHdha2V1cCBhbGFybSovCisjZGVmaW5lIFJUQ19XS0FMTV9SRCAgICBfSU9SKCdwJywgMHgxMCwgc3RydWN0IGxpbnV4X3J0Y193a2Fscm0pLyogR2V0IHdha2V1cCBhbGFybSovCisKKy8qIGludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBSVENfSVJRRiAweDgwIC8qIGFueSBvZiB0aGUgZm9sbG93aW5nIGlzIGFjdGl2ZSAqLworI2RlZmluZSBSVENfUEYgMHg0MAorI2RlZmluZSBSVENfQUYgMHgyMAorI2RlZmluZSBSVENfVUYgMHgxMAorCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvc2hhZG93Xy5oIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS9zaGFkb3dfLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4YTYyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvc2hhZG93Xy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogRGVjbGFyYXRpb24gb2YgdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3Igc2hhZG93IHBhc3N3b3JkIHN1aXRlICovCisKKyNpZm5kZWYgQkJfU0hBRE9XX0gKKyNkZWZpbmUgQkJfU0hBRE9XX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogU3RydWN0dXJlIG9mIHRoZSBwYXNzd29yZCBmaWxlICovCitzdHJ1Y3Qgc3B3ZCB7CisJY2hhciAqc3BfbmFtcDsgICAgICAgICAgLyogTG9naW4gbmFtZSAqLworCWNoYXIgKnNwX3B3ZHA7ICAgICAgICAgIC8qIEVuY3J5cHRlZCBwYXNzd29yZCAqLworCWxvbmcgc3BfbHN0Y2hnOyAgICAgICAgIC8qIERhdGUgb2YgbGFzdCBjaGFuZ2UgKi8KKwlsb25nIHNwX21pbjsgICAgICAgICAgICAvKiBNaW5pbXVtIG51bWJlciBvZiBkYXlzIGJldHdlZW4gY2hhbmdlcyAqLworCWxvbmcgc3BfbWF4OyAgICAgICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBjaGFuZ2VzICovCisJbG9uZyBzcF93YXJuOyAgICAgICAgICAgLyogTnVtYmVyIG9mIGRheXMgdG8gd2FybiB1c2VyIHRvIGNoYW5nZSB0aGUgcGFzc3dvcmQgKi8KKwlsb25nIHNwX2luYWN0OyAgICAgICAgICAvKiBOdW1iZXIgb2YgZGF5cyB0aGUgYWNjb3VudCBtYXkgYmUgaW5hY3RpdmUgKi8KKwlsb25nIHNwX2V4cGlyZTsgICAgICAgICAvKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSAxOTcwLTAxLTAxIHVudGlsIGFjY291bnQgZXhwaXJlcyAqLworCXVuc2lnbmVkIGxvbmcgc3BfZmxhZzsgIC8qIFJlc2VydmVkICovCit9OworCisjZGVmaW5lIHNldHNwZW50ICAgIGJiX2ludGVybmFsX3NldHNwZW50CisjZGVmaW5lIGVuZHNwZW50ICAgIGJiX2ludGVybmFsX2VuZHNwZW50CisjZGVmaW5lIGdldHNwZW50ICAgIGJiX2ludGVybmFsX2dldHNwZW50CisjZGVmaW5lIGdldHNwbmFtICAgIGJiX2ludGVybmFsX2dldHNwbmFtCisjZGVmaW5lIHNnZXRzcGVudCAgIGJiX2ludGVybmFsX3NnZXRzcGVudAorI2RlZmluZSBmZ2V0c3BlbnQgICBiYl9pbnRlcm5hbF9mZ2V0c3BlbnQKKyNkZWZpbmUgcHV0c3BlbnQgICAgYmJfaW50ZXJuYWxfcHV0c3BlbnQKKyNkZWZpbmUgZ2V0c3BlbnRfciAgYmJfaW50ZXJuYWxfZ2V0c3BlbnRfcgorI2RlZmluZSBnZXRzcG5hbV9yICBiYl9pbnRlcm5hbF9nZXRzcG5hbV9yCisjZGVmaW5lIHNnZXRzcGVudF9yIGJiX2ludGVybmFsX3NnZXRzcGVudF9yCisjZGVmaW5lIGZnZXRzcGVudF9yIGJiX2ludGVybmFsX2ZnZXRzcGVudF9yCisjZGVmaW5lIGxja3B3ZGYgICAgIGJiX2ludGVybmFsX2xja3B3ZGYKKyNkZWZpbmUgdWxja3B3ZGYgICAgYmJfaW50ZXJuYWxfdWxja3B3ZGYKKworCisvKiBBbGwgZnVuY3Rpb24gbmFtZXMgYmVsb3cgc2hvdWxkIGJlIHJlbWFwcGVkIGJ5ICNkZWZpbmVzIGFib3ZlCisgKiBpbiBvcmRlciB0byBub3QgY29sbGlkZSB3aXRoIGxpYmMgbmFtZXMuICovCisKKyNpZmRlZiBVTlVTRURfRk9SX05PVworLyogT3BlbiBkYXRhYmFzZSBmb3IgcmVhZGluZyAqLworZXh0ZXJuIHZvaWQgc2V0c3BlbnQodm9pZCk7CisKKy8qIENsb3NlIGRhdGFiYXNlICovCitleHRlcm4gdm9pZCBlbmRzcGVudCh2b2lkKTsKKworLyogR2V0IG5leHQgZW50cnkgZnJvbSBkYXRhYmFzZSwgcGVyaGFwcyBhZnRlciBvcGVuaW5nIHRoZSBmaWxlICovCitleHRlcm4gc3RydWN0IHNwd2QgKmdldHNwZW50KHZvaWQpOworCisvKiBHZXQgc2hhZG93IGVudHJ5IG1hdGNoaW5nIE5BTUUgKi8KK2V4dGVybiBzdHJ1Y3Qgc3B3ZCAqZ2V0c3BuYW0oY29uc3QgY2hhciAqX19uYW1lKTsKKworLyogUmVhZCBzaGFkb3cgZW50cnkgZnJvbSBTVFJJTkcgKi8KK2V4dGVybiBzdHJ1Y3Qgc3B3ZCAqc2dldHNwZW50KGNvbnN0IGNoYXIgKl9fc3RyaW5nKTsKKworLyogUmVhZCBuZXh0IHNoYWRvdyBlbnRyeSBmcm9tIFNUUkVBTSAqLworZXh0ZXJuIHN0cnVjdCBzcHdkICpmZ2V0c3BlbnQoRklMRSAqX19zdHJlYW0pOworCisvKiBXcml0ZSBsaW5lIGNvbnRhaW5pbmcgc2hhZG93IHBhc3N3b3JkIGVudHJ5IHRvIHN0cmVhbSAqLworZXh0ZXJuIGludCBwdXRzcGVudChjb25zdCBzdHJ1Y3Qgc3B3ZCAqX19wLCBGSUxFICpfX3N0cmVhbSk7CisKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiBzb21lIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgKi8KK2V4dGVybiBpbnQgZ2V0c3BlbnRfcihzdHJ1Y3Qgc3B3ZCAqX19yZXN1bHRfYnVmLCBjaGFyICpfX2J1ZmZlciwKKwkJICAgICAgIHNpemVfdCBfX2J1Zmxlbiwgc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisjZW5kaWYKKworZXh0ZXJuIGludCBnZXRzcG5hbV9yKGNvbnN0IGNoYXIgKl9fbmFtZSwgc3RydWN0IHNwd2QgKl9fcmVzdWx0X2J1ZiwKKwkJICAgICAgIGNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3Qgc3B3ZCAqKl9fcmVzdWx0KTsKKworI2lmZGVmIFVOVVNFRF9GT1JfTk9XCitleHRlcm4gaW50IHNnZXRzcGVudF9yKGNvbnN0IGNoYXIgKl9fc3RyaW5nLCBzdHJ1Y3Qgc3B3ZCAqX19yZXN1bHRfYnVmLAorCQkJY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCXN0cnVjdCBzcHdkICoqX19yZXN1bHQpOworCitleHRlcm4gaW50IGZnZXRzcGVudF9yKEZJTEUgKl9fc3RyZWFtLCBzdHJ1Y3Qgc3B3ZCAqX19yZXN1bHRfYnVmLAorCQkJY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCXN0cnVjdCBzcHdkICoqX19yZXN1bHQpOworLyogUHJvdGVjdCBwYXNzd29yZCBmaWxlIGFnYWluc3QgbXVsdGkgd3JpdGVycyAqLworZXh0ZXJuIGludCBsY2twd2RmKHZvaWQpOworCisvKiBVbmxvY2sgcGFzc3dvcmQgZmlsZSAqLworZXh0ZXJuIGludCB1bGNrcHdkZih2b2lkKTsKKyNlbmRpZgorCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYgLyogc2hhZG93LmggKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvdW5pY29kZS5oIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS91bmljb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxN2EyMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUvdW5pY29kZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIFVOSUNPREVfSAorI2RlZmluZSBVTklDT0RFX0ggMQorCisjaWYgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisjIGluY2x1ZGUgPHdjaGFyLmg+CisjIGluY2x1ZGUgPHdjdHlwZS5oPgorI2VuZGlmCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitlbnVtIHsKKwlVTklDT0RFX1VOS05PV04gPSAwLAorCVVOSUNPREVfT0ZGID0gMSwKKwlVTklDT0RFX09OID0gMiwKK307CisKKyNkZWZpbmUgdW5pY29kZV9iaWRpX2lzcnRsKHdjKSAwCisjZGVmaW5lIHVuaWNvZGVfYmlkaV9pc19uZXV0cmFsX3djaGFyKHdjKSAod2MgPD0gMTI2ICYmICFpc2FscGhhKHdjKSkKKworI2lmICFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisKKyMgZGVmaW5lIHVuaWNvZGVfc3RybGVuKHN0cmluZykgICBzdHJsZW4oc3RyaW5nKQorIyBkZWZpbmUgdW5pY29kZV9zdHJ3aWR0aChzdHJpbmcpIHN0cmxlbihzdHJpbmcpCisjIGRlZmluZSB1bmljb2RlX3N0YXR1cyBVTklDT0RFX09GRgorIyBkZWZpbmUgaW5pdF91bmljb2RlKCkgKCh2b2lkKTApCisjIGRlZmluZSByZWluaXRfdW5pY29kZShMQU5HKSAoKHZvaWQpMCkKKworI2Vsc2UKKworIyBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPCAxMjYgfHwgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4MzAwMDAKKyMgIHVuZGVmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUgorIyAgZGVmaW5lIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiAweDJmZmZmCisjIGVuZGlmCisKKyMgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIDwgMHgzMDAKKyMgIHVuZGVmIEVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMKKyMgIGRlZmluZSBFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIDAKKyMgZW5kaWYKKworIyBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPCAweDExMDAKKyMgIHVuZGVmIEVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTCisjICBkZWZpbmUgRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMgMAorIyBlbmRpZgorCisjIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA8IDB4NTkwCisjICB1bmRlZiAgRU5BQkxFX1VOSUNPREVfQklESV9TVVBQT1JUCisjICBkZWZpbmUgRU5BQkxFX1VOSUNPREVfQklESV9TVVBQT1JUIDAKKyMgZW5kaWYKKworLyogTnVtYmVyIG9mIHVuaWNvZGUgY2hhcnMuIEZhbGxzIGJhY2sgdG8gc3RybGVuKCkgb24gaW52YWxpZCB1bmljb2RlICovCitzaXplX3QgRkFTVF9GVU5DIHVuaWNvZGVfc3RybGVuKGNvbnN0IGNoYXIgKnN0cmluZyk7CisvKiBXaWR0aCBvbiB0ZXJtaW5hbCAqLworc2l6ZV90IEZBU1RfRlVOQyB1bmljb2RlX3N0cndpZHRoKGNvbnN0IGNoYXIgKnN0cmluZyk7CitlbnVtIHsKKwlVTklfRkxBR19QQUQgPSAoMSA8PCAwKSwKK307CisvL1VOVVNFRDogdW5zaWduZWQgRkFTVF9GVU5DIHVuaWNvZGVfcGFkZGluZ190b193aWR0aCh1bnNpZ25lZCB3aWR0aCwgY29uc3QgY2hhciAqc3JjKTsKKy8vVU5VU0VEOiBjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZTIodW5pX3N0YXRfdCAqc3RhdHMsIGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgd2lkdGgsIGludCBmbGFncyk7CitjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZSh1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3JjKTsKKy8vVU5VU0VEOiBjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9tYXh3aWR0aCh1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBtYXh3aWR0aCk7CitjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9maXhlZHdpZHRoKC8qdW5pX3N0YXRfdCAqc3RhdHMsKi8gY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCB3aWR0aCk7CisKKyMgaWYgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisKK2V4dGVybiB1aW50OF90IHVuaWNvZGVfc3RhdHVzOwordm9pZCBpbml0X3VuaWNvZGUodm9pZCkgRkFTVF9GVU5DOwordm9pZCByZWluaXRfdW5pY29kZShjb25zdCBjaGFyICpMQU5HKSBGQVNUX0ZVTkM7CisKKyMgZWxzZQorCisvKiBIb21lZ3Jvd24gVW5pY29kZSBzdXBwb3J0LiBJdCBrbm93cyBvbmx5IEMgYW5kIFVuaWNvZGUgbG9jYWxlcy4gKi8KKworIyAgaWYgIUVOQUJMRV9GRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WCisjICAgZGVmaW5lIHVuaWNvZGVfc3RhdHVzIFVOSUNPREVfT04KKyMgICBkZWZpbmUgaW5pdF91bmljb2RlKCkgKCh2b2lkKTApCisjICAgZGVmaW5lIHJlaW5pdF91bmljb2RlKExBTkcpICgodm9pZCkwKQorIyAgZWxzZQorZXh0ZXJuIHVpbnQ4X3QgdW5pY29kZV9zdGF0dXM7Cit2b2lkIGluaXRfdW5pY29kZSh2b2lkKSBGQVNUX0ZVTkM7Cit2b2lkIHJlaW5pdF91bmljb2RlKGNvbnN0IGNoYXIgKkxBTkcpIEZBU1RfRlVOQzsKKyMgIGVuZGlmCisKKyMgIHVuZGVmIE1CX0NVUl9NQVgKKyMgIGRlZmluZSBNQl9DVVJfTUFYIDYKKworLyogUHJldmVudCBuYW1lIGNvbGxpc2lvbnMgKi8KKyMgIGRlZmluZSB3aW50X3QgICAgYmJfd2ludF90CisjICBkZWZpbmUgbWJzdGF0ZV90IGJiX21ic3RhdGVfdAorIyAgZGVmaW5lIG1ic3Rvd2NzICBiYl9tYnN0b3djcworIyAgZGVmaW5lIHdjc3RvbWJzICBiYl93Y3N0b21icworIyAgZGVmaW5lIHdjcnRvbWIgICBiYl93Y3J0b21iCisjICBkZWZpbmUgaXN3c3BhY2UgIGJiX2lzd3NwYWNlCisjICBkZWZpbmUgaXN3YWxudW0gIGJiX2lzd2FsbnVtCisjICBkZWZpbmUgaXN3cHVuY3QgIGJiX2lzd3B1bmN0CisjICBkZWZpbmUgd2N3aWR0aCAgIGJiX3djd2lkdGgKKwordHlwZWRlZiBpbnQzMl90IHdpbnRfdDsKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGJvZ3VzOworfSBtYnN0YXRlX3Q7CisKK3NpemVfdCBtYnN0b3djcyh3Y2hhcl90ICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKSBGQVNUX0ZVTkM7CitzaXplX3Qgd2NzdG9tYnMoY2hhciAqZGVzdCwgY29uc3Qgd2NoYXJfdCAqc3JjLCBzaXplX3QgbikgRkFTVF9GVU5DOworc2l6ZV90IHdjcnRvbWIoY2hhciAqcywgd2NoYXJfdCB3YywgbWJzdGF0ZV90ICpwcykgRkFTVF9GVU5DOworaW50IGlzd3NwYWNlKHdpbnRfdCB3YykgRkFTVF9GVU5DOworaW50IGlzd2FsbnVtKHdpbnRfdCB3YykgRkFTVF9GVU5DOworaW50IGlzd3B1bmN0KHdpbnRfdCB3YykgRkFTVF9GVU5DOworaW50IHdjd2lkdGgodW5zaWduZWQgdWNzKSBGQVNUX0ZVTkM7CisjICBpZiBFTkFCTEVfVU5JQ09ERV9CSURJX1NVUFBPUlQKKyMgICB1bmRlZiB1bmljb2RlX2JpZGlfaXNydGwKK2ludCB1bmljb2RlX2JpZGlfaXNydGwod2ludF90IHdjKSBGQVNUX0ZVTkM7CisjICAgaWYgRU5BQkxFX1VOSUNPREVfTkVVVFJBTF9UQUJMRQorIyAgICB1bmRlZiB1bmljb2RlX2JpZGlfaXNfbmV1dHJhbF93Y2hhcgoraW50IHVuaWNvZGVfYmlkaV9pc19uZXV0cmFsX3djaGFyKHdpbnRfdCB3YykgRkFTVF9GVU5DOworIyAgIGVuZGlmCisjICBlbmRpZgorCisKKyMgZW5kaWYgLyogIVVOSUNPREVfVVNJTkdfTE9DQUxFICovCisKKyNlbmRpZiAvKiBVTklDT0RFX1NVUFBPUlQgKi8KKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL3VzYWdlLnNyYy5oIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS91c2FnZS5zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGJlY2NmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS91c2FnZS5zcmMuaApAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTggdHM9ODogKi8KKy8qCisgKiBUaGlzIGZpbGUgc3VmZmVycyBmcm9tIGNocm9uaWNhbGx5IGluY29ycmVjdCB0YWJpZmljYXRpb24KKyAqIG9mIG1lc3NhZ2VzLiBCZWZvcmUgZWRpdGluZyB0aGlzIGZpbGU6CisgKiAxLiBTd2l0Y2ggeW91IGVkaXRvciB0byA4LXNwYWNlIHRhYiBtb2RlLgorICogMi4gRG8gbm90IHVzZSBcdCBpbiBtZXNzYWdlcywgdXNlIHJlYWwgdGFiIGNoYXJhY3Rlci4KKyAqIDMuIFN0YXJ0IGVhY2ggc291cmNlIGxpbmUgd2l0aCBtZXNzYWdlIGFzIGZvbGxvd3M6CisgKiAgICB8PDcgc3BhY2VzPiJ0ZXh0IHdpdGggdGFicyIuLi4uCisgKiBvcgorICogICAgfDw1IHNwYWNlcz4iXG50ZXh0IHdpdGggdGFicyIuLi4uCisgKi8KKyNpZm5kZWYgQkJfVVNBR0VfSAorI2RlZmluZSBCQl9VU0FHRV9IIDEKKworI2RlZmluZSBOT1VTQUdFX1NUUiAiXGIiCisKK0lOU0VSVAorCisjZGVmaW5lIGJ1c3lib3hfbm90ZXNfdXNhZ2UgXAorICAgICAgICJIZWxsbyB3b3JsZCFcbiIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL3ZvbHVtZV9pZC5oIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS92b2x1bWVfaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc4Y2QxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS92b2x1bWVfaWQuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworY2hhciAqZ2V0X2Rldm5hbWVfZnJvbV9sYWJlbChjb25zdCBjaGFyICpzcGVjKTsKK2NoYXIgKmdldF9kZXZuYW1lX2Zyb21fdXVpZChjb25zdCBjaGFyICpzcGVjKTsKK3ZvaWQgZGlzcGxheV91dWlkX2NhY2hlKHZvaWQpOworCisvKiBSZXR1cm5zOgorICogMDogbm8gVVVJRD0gb3IgTEFCRUw9IHByZWZpeCBmb3VuZAorICogMTogVVVJRD0gb3IgTEFCRUw9IHByZWZpeCBmb3VuZC4gSW4gdGhpcyBjYXNlLAorICogICAgKmZzbmFtZSBpcyByZXBsYWNlZCBpZiBkZXZpY2Ugd2l0aCBzdWNoIFVVSUQgb3IgTEFCRUwgaXMgZm91bmQKKyAqLworaW50IHJlc29sdmVfbW91bnRfc3BlYyhjaGFyICoqZnNuYW1lKTsKK2ludCBhZGRfdG9fdXVpZF9jYWNoZShjb25zdCBjaGFyICpkZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS94YXRvbnVtLmggYi9idXN5Ym94LTEuMTkuMy9pbmNsdWRlL3hhdG9udW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjc2YTNjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS94YXRvbnVtLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFzY2lpLXRvLW51bWJlcnMgaW1wbGVtZW50YXRpb25zIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogUHJvdmlkZXMgZXh0ZXJuIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgREVDTEFSRV9TVFJfQ09OVih0eXBlLCBULCBVVCkgXAorXAordW5zaWduZWQgdHlwZSB4c3RydG8jI1VUIyNfcmFuZ2Vfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgaW50IGIsIHVuc2lnbmVkIHR5cGUgbCwgdW5zaWduZWQgdHlwZSB1LCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgRkFTVF9GVU5DOyBcCit1bnNpZ25lZCB0eXBlIHhzdHJ0byMjVVQjI19yYW5nZShjb25zdCBjaGFyICpzdHIsIGludCBiLCB1bnNpZ25lZCB0eXBlIGwsIHVuc2lnbmVkIHR5cGUgdSkgRkFTVF9GVU5DOyBcCit1bnNpZ25lZCB0eXBlIHhzdHJ0byMjVVQjI19zZngoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4c3RydG8jI1VUKGNvbnN0IGNoYXIgKnN0ciwgaW50IGIpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4YXRvIyNVVCMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIHR5cGUgbCwgdW5zaWduZWQgdHlwZSB1LCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgRkFTVF9GVU5DOyBcCit1bnNpZ25lZCB0eXBlIHhhdG8jI1VUIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCB0eXBlIGwsIHVuc2lnbmVkIHR5cGUgdSkgRkFTVF9GVU5DOyBcCit1bnNpZ25lZCB0eXBlIHhhdG8jI1VUIyNfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4YXRvIyNVVChjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsgXAordHlwZSB4c3RydG8jI1QjI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgdHlwZSBsLCB0eXBlIHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBGQVNUX0ZVTkM7IFwKK3R5cGUgeHN0cnRvIyNUIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgdHlwZSBsLCB0eXBlIHUpIEZBU1RfRlVOQzsgXAordHlwZSB4c3RydG8jI1QoY29uc3QgY2hhciAqc3RyLCBpbnQgYikgRkFTVF9GVU5DOyBcCit0eXBlIHhhdG8jI1QjI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCB0eXBlIGwsIHR5cGUgdSwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordHlwZSB4YXRvIyNUIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCB0eXBlIGwsIHR5cGUgdSkgRkFTVF9GVU5DOyBcCit0eXBlIHhhdG8jI1QjI19zZngoY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgRkFTVF9GVU5DOyBcCit0eXBlIHhhdG8jI1QoY29uc3QgY2hhciAqc3RyKSBGQVNUX0ZVTkM7IFwKKworLyogVW5zaWduZWQgbG9uZyBsb25nIGZ1bmN0aW9ucyBhbHdheXMgZXhpc3QgKi8KK0RFQ0xBUkVfU1RSX0NPTlYobG9uZyBsb25nLCBsbCwgdWxsKQorCisKKy8qIFByb3ZpZGVzIGlubGluZSBkZWZpbml0aW9ucyBvZiBmdW5jdGlvbnMgKi8KKy8qICh1c2VmdWwgZm9yIG1hcHBpbmcgdGhlbSB0byB0aGUgdHlwZSBvZiB0aGUgc2FtZSB3aWR0aCkgKi8KKyNkZWZpbmUgREVGSU5FX0VRVUlWX1NUUl9DT05WKG5hcnJvdywgTiwgVywgVU4sIFVXKSBcCitcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeHN0cnRvIyNVTiMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIGludCBiLCB1bnNpZ25lZCBuYXJyb3cgbCwgdW5zaWduZWQgbmFycm93IHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4c3RydG8jI1VXIyNfcmFuZ2Vfc2Z4KHN0ciwgYiwgbCwgdSwgc2Z4KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeHN0cnRvIyNVTiMjX3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgaW50IGIsIHVuc2lnbmVkIG5hcnJvdyBsLCB1bnNpZ25lZCBuYXJyb3cgdSkgXAoreyByZXR1cm4geHN0cnRvIyNVVyMjX3JhbmdlKHN0ciwgYiwgbCwgdSk7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAordW5zaWduZWQgbmFycm93IHhzdHJ0byMjVU4jI19zZngoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIFwKK3sgcmV0dXJuIHhzdHJ0byMjVVcjI19zZngoc3RyLCBiLCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK3Vuc2lnbmVkIG5hcnJvdyB4c3RydG8jI1VOKGNvbnN0IGNoYXIgKnN0ciwgaW50IGIpIFwKK3sgcmV0dXJuIHhzdHJ0byMjVVcoc3RyLCBiKTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeGF0byMjVU4jI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBuYXJyb3cgbCwgdW5zaWduZWQgbmFycm93IHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4YXRvIyNVVyMjX3JhbmdlX3NmeChzdHIsIGwsIHUsIHNmeCk7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAordW5zaWduZWQgbmFycm93IHhhdG8jI1VOIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBuYXJyb3cgbCwgdW5zaWduZWQgbmFycm93IHUpIFwKK3sgcmV0dXJuIHhhdG8jI1VXIyNfcmFuZ2Uoc3RyLCBsLCB1KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeGF0byMjVU4jI19zZngoY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgXAoreyByZXR1cm4geGF0byMjVVcjI19zZngoc3RyLCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK3Vuc2lnbmVkIG5hcnJvdyB4YXRvIyNVTihjb25zdCBjaGFyICpzdHIpIFwKK3sgcmV0dXJuIHhhdG8jI1VXKHN0cik7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAorbmFycm93IHhzdHJ0byMjTiMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIGludCBiLCBuYXJyb3cgbCwgbmFycm93IHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4c3RydG8jI1cjI19yYW5nZV9zZngoc3RyLCBiLCBsLCB1LCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4c3RydG8jI04jI19yYW5nZShjb25zdCBjaGFyICpzdHIsIGludCBiLCBuYXJyb3cgbCwgbmFycm93IHUpIFwKK3sgcmV0dXJuIHhzdHJ0byMjVyMjX3JhbmdlKHN0ciwgYiwgbCwgdSk7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAorbmFycm93IHhzdHJ0byMjTihjb25zdCBjaGFyICpzdHIsIGludCBiKSBcCit7IHJldHVybiB4c3RydG8jI1coc3RyLCBiKTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCituYXJyb3cgeGF0byMjTiMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIG5hcnJvdyBsLCBuYXJyb3cgdSwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIFwKK3sgcmV0dXJuIHhhdG8jI1cjI19yYW5nZV9zZngoc3RyLCBsLCB1LCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4YXRvIyNOIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCBuYXJyb3cgbCwgbmFycm93IHUpIFwKK3sgcmV0dXJuIHhhdG8jI1cjI19yYW5nZShzdHIsIGwsIHUpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4YXRvIyNOIyNfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIFwKK3sgcmV0dXJuIHhhdG8jI1cjI19zZngoc3RyLCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4YXRvIyNOKGNvbnN0IGNoYXIgKnN0cikgXAoreyByZXR1cm4geGF0byMjVyhzdHIpOyB9IFwKKworLyogSWYgbG9uZyA9PSBsb25nIGxvbmcsIHRoZW4ganVzdCBtYXAgdGhlbSBvbmUtdG8tb25lICovCisjaWYgVUxPTkdfTUFYID09IFVMTE9OR19NQVgKK0RFRklORV9FUVVJVl9TVFJfQ09OVihsb25nLCBsLCBsbCwgdWwsIHVsbCkKKyNlbHNlCisvKiBFbHNlIHByb3ZpZGUgZXh0ZXJuIGRlZnMgKi8KK0RFQ0xBUkVfU1RSX0NPTlYobG9uZywgbCwgdWwpCisjZW5kaWYKKworLyogU2FtZSBmb3IgaW50IC0+IFtsb25nXSBsb25nICovCisjaWYgVUlOVF9NQVggPT0gVUxMT05HX01BWAorREVGSU5FX0VRVUlWX1NUUl9DT05WKGludCwgaSwgbGwsIHUsIHVsbCkKKyNlbGlmIFVJTlRfTUFYID09IFVMT05HX01BWAorREVGSU5FX0VRVUlWX1NUUl9DT05WKGludCwgaSwgbCwgdSwgdWwpCisjZWxzZQorREVDTEFSRV9TVFJfQ09OVihpbnQsIGksIHUpCisjZW5kaWYKKworLyogU3BlY2lhbGl6ZWQgKi8KKwordWludDMyX3QgQlVHX3hhdG91MzJfdW5pbXBsZW1lbnRlZCh2b2lkKTsKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVpbnQzMl90IHhhdG91MzIoY29uc3QgY2hhciAqbnVtc3RyKQoreworCWlmIChVSU5UX01BWCA9PSAweGZmZmZmZmZmKQorCQlyZXR1cm4geGF0b3UobnVtc3RyKTsKKwlpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmYpCisJCXJldHVybiB4YXRvdWwobnVtc3RyKTsKKwlyZXR1cm4gQlVHX3hhdG91MzJfdW5pbXBsZW1lbnRlZCgpOworfQorCisvKiBOb24tYWJvcnRpbmcga2luZCBvZiBjb252ZXJ0b3JzOiBiYl9zdHJ0b1t1XVtsXWwgKi8KKworLyogT24gZXhpdDogZXJybm8gPSAwIG9ubHkgaWYgdGhlcmUgd2FzIG5vbi1lbXB0eSwgJ1wwJyB0ZXJtaW5hdGVkIHZhbHVlCisgKiBlcnJubyA9IEVJTlZBTCBpZiB2YWx1ZSB3YXMgbm90ICdcMCcgdGVybWluYXRlZCwgYnV0IG90aGVyd2lzZSBvaworICogICAgUmV0dXJuIHZhbHVlIGlzIHN0aWxsIHZhbGlkLCBjYWxsZXIgc2hvdWxkIGp1c3QgY2hlY2sgd2hldGhlciBlbmRbMF0KKyAqICAgIGlzIGEgdmFsaWQgdGVybWluYXRpbmcgY2hhciBmb3IgcGFydGljdWxhciBjYXNlLiBPVE9ILCBpZiBjYWxsZXIKKyAqICAgIHJlcXVpcmVzICdcMCcgdGVybWluYXRlZCBpbnB1dCwgW3NdaGUgY2FuIGp1c3QgY2hlY2sgZXJybm8gPT0gMC4KKyAqIGVycm5vID0gRVJBTkdFIGlmIHZhbHVlIGhhZCBhbHBoYW51bWVyaWMgdGVybWluYXRpbmcgY2hhciAoIjEyMzRhYmNnIikuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UsIG1pc3NpbmcsIGV0Yy4KKyAqIGVycm5vID0gRVJBTkdFIGlmIHZhbHVlIGhhZCBtaW51cyBzaWduIGZvciBzdHJ0b3VYWCAoZXZlbiAiLTAiIGlzIG5vdCBvayApCisgKiAgICByZXR1cm4gdmFsdWUgaXMgYWxsLW9uZXMgaW4gdGhpcyBjYXNlLgorICovCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBiYl9zdHJ0b3VsbChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworbG9uZyBsb25nIGJiX3N0cnRvbGwoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpIEZBU1RfRlVOQzsKKworI2lmIFVMT05HX01BWCA9PSBVTExPTkdfTUFYCitzdGF0aWMgQUxXQVlTX0lOTElORQordW5zaWduZWQgbG9uZyBiYl9zdHJ0b3VsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreyByZXR1cm4gYmJfc3RydG91bGwoYXJnLCBlbmRwLCBiYXNlKTsgfQorc3RhdGljIEFMV0FZU19JTkxJTkUKK2xvbmcgYmJfc3RydG9sKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreyByZXR1cm4gYmJfc3RydG9sbChhcmcsIGVuZHAsIGJhc2UpOyB9CisjZWxzZQordW5zaWduZWQgbG9uZyBiYl9zdHJ0b3VsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKSBGQVNUX0ZVTkM7Citsb25nIGJiX3N0cnRvbChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworI2VuZGlmCisKKyNpZiBVSU5UX01BWCA9PSBVTExPTkdfTUFYCitzdGF0aWMgQUxXQVlTX0lOTElORQordW5zaWduZWQgYmJfc3RydG91KGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreyByZXR1cm4gYmJfc3RydG91bGwoYXJnLCBlbmRwLCBiYXNlKTsgfQorc3RhdGljIEFMV0FZU19JTkxJTkUKK2ludCBiYl9zdHJ0b2koY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7IHJldHVybiBiYl9zdHJ0b2xsKGFyZywgZW5kcCwgYmFzZSk7IH0KKyNlbGlmIFVJTlRfTUFYID09IFVMT05HX01BWAorc3RhdGljIEFMV0FZU19JTkxJTkUKK3Vuc2lnbmVkIGJiX3N0cnRvdShjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sgcmV0dXJuIGJiX3N0cnRvdWwoYXJnLCBlbmRwLCBiYXNlKTsgfQorc3RhdGljIEFMV0FZU19JTkxJTkUKK2ludCBiYl9zdHJ0b2koY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7IHJldHVybiBiYl9zdHJ0b2woYXJnLCBlbmRwLCBiYXNlKTsgfQorI2Vsc2UKK3Vuc2lnbmVkIGJiX3N0cnRvdShjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworaW50IGJiX3N0cnRvaShjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworI2VuZGlmCisKK3VpbnQzMl90IEJVR19iYl9zdHJ0b3UzMl91bmltcGxlbWVudGVkKHZvaWQpOworc3RhdGljIEFMV0FZU19JTkxJTkUKK3VpbnQzMl90IGJiX3N0cnRvdTMyKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCWlmIChzaXplb2YodWludDMyX3QpID09IHNpemVvZih1bnNpZ25lZCkpCisJCXJldHVybiBiYl9zdHJ0b3UoYXJnLCBlbmRwLCBiYXNlKTsKKwlpZiAoc2l6ZW9mKHVpbnQzMl90KSA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCXJldHVybiBiYl9zdHJ0b3VsKGFyZywgZW5kcCwgYmFzZSk7CisJcmV0dXJuIEJVR19iYl9zdHJ0b3UzMl91bmltcGxlbWVudGVkKCk7Cit9CisKKy8qIEZsb2F0aW5nIHBvaW50ICovCisKK2RvdWJsZSBiYl9zdHJ0b2QoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCkgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvaW5jbHVkZS94cmVnZXguaCBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUveHJlZ2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1ZTZhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luY2x1ZGUveHJlZ2V4LmgKQEAgLTAsMCArMSwyMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQnVzeWJveCB4cmVnY29tcCB1dGlsaXR5IHJvdXRpbmUuICBUaGlzIGlzbid0IGluIGxpYmJiLmggYmVjYXVzZSB0aGUKKyAqIEMgbGlicmFyeSB3ZSdyZSBsaW5raW5nIGFnYWluc3QgbWF5IG5vdCBzdXBwb3J0IHJlZ2V4LmguCisgKgorICogQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gc2FzaCwgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IERhdmlkIEkuIEJlbGwKKyAqIFBlcm1pc3Npb24gaGFzIGJlZW4gZ3JhbnRlZCB0byByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlIHVuZGVyIEdQTC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIEJCX1JFR0VYX0gKKyNkZWZpbmUgQkJfUkVHRVhfSCAxCisKKyNpbmNsdWRlIDxyZWdleC5oPgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworY2hhciogcmVnY29tcF9vcl9lcnJtc2cocmVnZXhfdCAqcHJlZywgY29uc3QgY2hhciAqcmVnZXgsIGludCBjZmxhZ3MpIEZBU1RfRlVOQzsKK3ZvaWQgeHJlZ2NvbXAocmVnZXhfdCAqcHJlZywgY29uc3QgY2hhciAqcmVnZXgsIGludCBjZmxhZ3MpIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbml0L0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9pbml0L0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2N2M5MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luaXQvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDEwIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJJbml0IFV0aWxpdGllcyIKKworSU5TRVJUCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2luaXQvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL2luaXQvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRmYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5pdC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsOSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbml0L2Jvb3RjaGFydGQuYyBiL2J1c3lib3gtMS4xOS4zL2luaXQvYm9vdGNoYXJ0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjEyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9pbml0L2Jvb3RjaGFydGQuYwpAQCAtMCwwICsxLDQ1MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2FwcGxldDpJRl9CT09UQ0hBUlREKEFQUExFVChib290Y2hhcnRkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0JPT1RDSEFSVEQpICs9IGJvb3RjaGFydGQubworCisvL2NvbmZpZzpjb25maWcgQk9PVENIQVJURAorLy9jb25maWc6CWJvb2wgImJvb3RjaGFydGQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgYm9vdGNoYXJ0ZCBpcyBjb21tb25seSB1c2VkIHRvIHByb2ZpbGUgdGhlIGJvb3QgcHJvY2VzcworLy9jb25maWc6CSAgZm9yIHRoZSBwdXJwb3NlIG9mIHNwZWVkaW5nIGl0IHVwLiBJbiB0aGlzIGNhc2UsIGl0IGlzIHN0YXJ0ZWQKKy8vY29uZmlnOgkgIGJ5IHRoZSBrZXJuZWwgYXMgdGhlIGluaXQgcHJvY2Vzcy4gVGhpcyBpcyBjb25maWd1cmVkIGJ5IGFkZGluZworLy9jb25maWc6CSAgdGhlIGluaXQ9L3NiaW4vYm9vdGNoYXJ0ZCBvcHRpb24gdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgcmVzb3VyY2UgdXNhZ2Ugb2YgYSBzcGVjaWZpYworLy9jb25maWc6CSAgYXBwbGljYXRpb24gb3IgdGhlIHJ1bm5pbmcgc3lzdGVtIGluIGdlbmVyYWwuIEluIHRoaXMgY2FzZSwKKy8vY29uZmlnOgkgIGJvb3RjaGFydGQgaXMgc3RhcnRlZCBpbnRlcmFjdGl2ZWx5IGJ5IHJ1bm5pbmcgYm9vdGNoYXJ0ZCBzdGFydAorLy9jb25maWc6CSAgYW5kIHN0b3BwZWQgdXNpbmcgYm9vdGNoYXJ0ZCBzdG9wLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSCisvL2NvbmZpZzoJYm9vbCAiQ29tcGF0aWJsZSwgYmxvYXRlZCBoZWFkZXIiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBCT09UQ0hBUlRECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ3JlYXRlIGV4dGVuZGVkIGhlYWRlciBmaWxlIGNvbXBhdGlibGUgd2l0aCAiYmlnIiBib290Y2hhcnRkLgorLy9jb25maWc6CSAgIkJpZyIgYm9vdGNoYXJ0ZCBpcyBhIHNoZWxsIHNjcmlwdCBhbmQgaXQgZHVtcHMgc29tZQorLy9jb25maWc6CSAgImNvbnZlbmllbnQiIGluZm8gaW50IHRoZSBoZWFkZXIsIHN1Y2ggYXM6CisvL2NvbmZpZzoJICAgIHRpdGxlID0gQm9vdCBjaGFydCBmb3IgYGhvc3RuYW1lYCAoYGRhdGVgKQorLy9jb25maWc6CSAgICBzeXN0ZW0udW5hbWUgPSBgdW5hbWUgLXNydm1gCisvL2NvbmZpZzoJICAgIHN5c3RlbS5yZWxlYXNlID0gYGNhdCAvZXRjL0RJU1RSTy1yZWxlYXNlYAorLy9jb25maWc6CSAgICBzeXN0ZW0uY3B1ID0gYGdyZXAgJ15tb2RlbCBuYW1lJyAvcHJvYy9jcHVpbmZvIHwgaGVhZCAtMWAgKCRjcHVjb3VudCkKKy8vY29uZmlnOgkgICAgc3lzdGVtLmtlcm5lbC5vcHRpb25zID0gYGNhdCAvcHJvYy9jbWRsaW5lYAorLy9jb25maWc6CSAgVGhpcyBkYXRhIGlzIG5vdCBtYW5kYXRvcnkgZm9yIGJvb3RjaGFydCBncmFwaCBnZW5lcmF0aW9uLAorLy9jb25maWc6CSAgYW5kIGlzIGNvbnNpZGVyZWQgYmxvYXQuIE5ldmVydGhlbGVzcywgdGhpcyBvcHRpb24KKy8vY29uZmlnOgkgIG1ha2VzIGJvb3RjaGFydGQgYXBwbGV0IHRvIGR1bXAgYSBzdWJzZXQgb2YgaXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0JPT1RDSEFSVERfQ09ORklHX0ZJTEUKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGJvb3RjaGFydGQuY29uZiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEJPT1RDSEFSVEQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgcmVhZGluZyBhbmQgcGFyc2luZyBvZiAkUFdEL2Jvb3RjaGFydGQuY29uZgorLy9jb25maWc6CSAgYW5kIC9ldGMvYm9vdGNoYXJ0ZC5jb25mIGZpbGVzLgorCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIEFmdGVyIGxpYmJiLmgsIHNpbmNlIGl0IG5lZWRzIHN5cy90eXBlcy5oIG9uIHNvbWUgc3lzdGVtcyAqLworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKKyNpZmRlZiBfX2xpbnV4X18KKyMgaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjIGlmbmRlZiBNU19TSUxFTlQKKyMgIGRlZmluZSBNU19TSUxFTlQgICAgICAoMSA8PCAxNSkKKyMgZW5kaWYKKyMgaWZuZGVmIE1OVF9ERVRBQ0gKKyMgIGRlZmluZSBNTlRfREVUQUNIIDB4MDAwMDAwMDIKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEJDX1ZFUlNJT05fU1RSICIwLjgiCisKKy8qIEZvciBkZWJ1Z2dpbmcsIHNldCB0byAwOgorICogc3RyYWNlIHdvbid0IHdvcmsgd2l0aCBET19TSUdOQUxfU1lOQyBzZXQgdG8gMS4KKyAqLworI2RlZmluZSBET19TSUdOQUxfU1lOQyAxCisKKworLy8kUFdEL2Jvb3RjaGFydGQuY29uZiBhbmQgL2V0Yy9ib290Y2hhcnRkLmNvbmY6CisvL3N1cHBvcnRlZCBvcHRpb25zOgorLy8jIFNhbXBsaW5nIHBlcmlvZCAoaW4gc2Vjb25kcykKKy8vU0FNUExFX1BFUklPRD0wLjIKKy8vCisvL25vdCB5ZXQgc3VwcG9ydGVkOgorLy8jIHRtcGZzIHNpemUKKy8vIyAoMzIgTUIgc2hvdWxkIHN1ZmZpY2UgZm9yIH4yMCBtaW51dGVzIHdvcnRoIG9mIGxvZyBkYXRhLCBidXQgWU1NVikKKy8vVE1QRlNfU0laRT0zMm0KKy8vCisvLyMgV2hldGhlciB0byBlbmFibGUgYW5kIHN0b3JlIEJTRCBwcm9jZXNzIGFjY291bnRpbmcgaW5mb3JtYXRpb24uICBUaGUKKy8vIyBrZXJuZWwgbmVlZHMgdG8gYmUgY29uZmlndXJlZCB0byBlbmFibGUgdjMgYWNjb3VudGluZworLy8jIChDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMykuIGFjY3RvbiBmcm9tIHRoZSBHTlUgYWNjb3VudGluZyB1dGlsaXRpZXMKKy8vIyBpcyBhbHNvIHJlcXVpcmVkLgorLy9QUk9DRVNTX0FDQ09VTlRJTkc9Im5vIgorLy8KKy8vIyBUYXJiYWxsIGZvciB0aGUgdmFyaW91cyBib290IGxvZyBmaWxlcworLy9CT09UTE9HX0RFU1Q9L3Zhci9sb2cvYm9vdGNoYXJ0LnRnegorLy8KKy8vIyBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RvcCBsb2dnaW5nIGFzIHRoZSBib290IHByb2Nlc3MgY29tcGxldGVzLgorLy8jIFRoZSBsb2dnZXIgd2lsbCBsb29rIGZvciBrbm93biBwcm9jZXNzZXMgdGhhdCBpbmRpY2F0ZSBib290dXAgY29tcGxldGlvbgorLy8jIGF0IGEgc3BlY2lmaWMgcnVubGV2ZWwgKGUuZy4gZ2RtLWJpbmFyeSwgbWluZ2V0dHksIGV0Yy4pLgorLy9BVVRPX1NUT1BfTE9HR0VSPSJ5ZXMiCisvLworLy8jIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgYm9vdCBjaGFydCBvbmNlIHRoZSBib290IGxvZ2dlcgorLy8jIGNvbXBsZXRlcy4gIFRoZSBib290IGNoYXJ0IHdpbGwgYmUgZ2VuZXJhdGVkIGluICRBVVRPX1JFTkRFUl9ESVIuCisvLyMgTm90ZSB0aGF0IHRoZSBib290Y2hhcnQgcGFja2FnZSBtdXN0IGJlIGluc3RhbGxlZC4KKy8vQVVUT19SRU5ERVI9Im5vIgorLy8KKy8vIyBJbWFnZSBmb3JtYXQgdG8gdXNlIGZvciB0aGUgYXV0by1nZW5lcmF0ZWQgYm9vdCBjaGFydAorLy8jIChjaG9vc2UgYmV0d2VlbiBwbmcsIHN2ZyBhbmQgZXBzKS4KKy8vQVVUT19SRU5ERVJfRk9STUFUPSJwbmciCisvLworLy8jIE91dHB1dCBkaXJlY3RvcnkgZm9yIGF1dG8tZ2VuZXJhdGVkIGJvb3QgY2hhcnRzCisvL0FVVE9fUkVOREVSX0RJUj0iL3Zhci9sb2ciCisKKworLyogR2xvYmFscyAqLworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgamlmZnlfbGluZVtDT01NT05fQlVGU0laRV07Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGR1bXBfZmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCWZwdXRzKEcuamlmZnlfbGluZSwgZnApOworCQlmZmx1c2goZnApOworCQliYl9jb3B5ZmRfZW9mKGZkLCBmaWxlbm8oZnApKTsKKwkJY2xvc2UoZmQpOworCQlmcHV0YygnXG4nLCBmcCk7CisJfQorfQorCitzdGF0aWMgaW50IGR1bXBfcHJvY3MoRklMRSAqZnAsIGludCBsb29rX2Zvcl9sb2dpbl9wcm9jZXNzKQoreworCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCURJUiAqZGlyID0gb3BlbmRpcigiL3Byb2MiKTsKKwlpbnQgZm91bmRfbG9naW5fcHJvY2VzcyA9IDA7CisKKwlmcHV0cyhHLmppZmZ5X2xpbmUsIGZwKTsKKwl3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWNoYXIgbmFtZVtzaXplb2YoIi9wcm9jLyV1L2NtZGxpbmUiKSArIHNpemVvZihpbnQpKjNdOworCQlpbnQgc3RhdF9mZDsKKwkJdW5zaWduZWQgcGlkID0gYmJfc3RydG91KGVudHJ5LT5kX25hbWUsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKQorCQkJY29udGludWU7CisKKwkJLyogQW5kcm9pZCdzIHZlcnNpb24gcmVhZHMgL3Byb2MvUElEL2NtZGxpbmUgYW5kIGV4dHJhY3RzCisJCSAqIG5vbi10cnVuY2F0ZWQgcHJvY2VzcyBuYW1lLiBEbyB3ZSB3YW50IHRvIGRvIHRoYXQ/ICovCisKKwkJc3ByaW50ZihuYW1lLCAiL3Byb2MvJXUvc3RhdCIsIHBpZCk7CisJCXN0YXRfZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZKTsKKwkJaWYgKHN0YXRfZmQgPj0gMCkgeworCQkJY2hhciAqcDsKKwkJCWNoYXIgc3RhdF9saW5lWzQqMTAyNF07CisJCQlpbnQgcmQgPSBzYWZlX3JlYWQoc3RhdF9mZCwgc3RhdF9saW5lLCBzaXplb2Yoc3RhdF9saW5lKS0yKTsKKworCQkJY2xvc2Uoc3RhdF9mZCk7CisJCQlpZiAocmQgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJc3RhdF9saW5lW3JkXSA9ICdcMCc7CisJCQlwID0gc3RyY2hybnVsKHN0YXRfbGluZSwgJ1xuJyk7CisJCQkqcCsrID0gJ1xuJzsKKwkJCSpwID0gJ1wwJzsKKwkJCWZwdXRzKHN0YXRfbGluZSwgZnApOworCQkJaWYgKCFsb29rX2Zvcl9sb2dpbl9wcm9jZXNzKQorCQkJCWNvbnRpbnVlOworCQkJcCA9IHN0cmNocihzdGF0X2xpbmUsICcoJyk7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQlwKys7CisJCQlzdHJjaHJudWwocCwgJyknKVswXSA9ICdcMCc7CisJCQkvKiBJcyBpdCBnZG0sIGtkbSBvciBhIGdldHR5PyAqLworCQkJaWYgKCgocFswXSA9PSAnZycgfHwgcFswXSA9PSAnaycgfHwgcFswXSA9PSAneCcpICYmIHBbMV0gPT0gJ2QnICYmIHBbMl0gPT0gJ20nKQorCQkJIHx8IHN0cnN0cihwLCAiZ2V0dHkiKQorCQkJKSB7CisJCQkJZm91bmRfbG9naW5fcHJvY2VzcyA9IDE7CisJCQl9CisJCX0KKwl9CisJY2xvc2VkaXIoZGlyKTsKKwlmcHV0YygnXG4nLCBmcCk7CisJcmV0dXJuIGZvdW5kX2xvZ2luX3Byb2Nlc3M7Cit9CisKK3N0YXRpYyBjaGFyICptYWtlX3RlbXBkaXIodm9pZCkKK3sKKwljaGFyIHRlbXBsYXRlW10gPSAiL3RtcC9ib290Y2hhcnQuWFhYWFhYIjsKKwljaGFyICp0ZW1wZGlyID0geHN0cmR1cChta2R0ZW1wKHRlbXBsYXRlKSk7CisJaWYgKCF0ZW1wZGlyKSB7CisjaWZkZWYgX19saW51eF9fCisJCS8qIC90bXAgaXMgbm90IHdyaXRhYmxlIChoYXBwZW5zIHdoZW4gd2UgYXJlIHVzZWQgYXMgaW5pdCkuCisJCSAqIFRyeSB0byBtb3VudCBhIHRtcGZzLCB0aGVtIGNkIGFuZCBsYXppbHkgdW5tb3VudCBpdC4KKwkJICogU2luY2Ugd2UgdW5tb3VudCBpdCBhdCBvbmNlLCB3ZSBjYW4gbW91bnQgaXQgYW55d2hlcmUuCisJCSAqIFRyeSBhIGZldyBsb2NhdGlvbnMgd2hpY2ggYXJlIGxpa2VseSB0aSBleGlzdC4KKwkJICovCisJCXN0YXRpYyBjb25zdCBjaGFyIGRpcnNbXSA9ICIvbW50XDAiIi90bXBcMCIiL2Jvb3RcMCIiL3Byb2NcMCI7CisJCWNvbnN0IGNoYXIgKnRyeV9kaXIgPSBkaXJzOworCQl3aGlsZSAobW91bnQoIm5vbmUiLCB0cnlfZGlyLCAidG1wZnMiLCBNU19TSUxFTlQsICJzaXplPTE2bSIpICE9IDApIHsKKwkJCXRyeV9kaXIgKz0gc3RybGVuKHRyeV9kaXIpICsgMTsKKwkJCWlmICghdHJ5X2RpclswXSkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0ICVzbW91bnQgdG1wZnMiLCAiIik7CisJCX0KKwkJLy9iYl9lcnJvcl9tc2coIm1vdW50ZWQgdG1wZnMgb24gJXMiLCB0cnlfZGlyKTsKKwkJeGNoZGlyKHRyeV9kaXIpOworCQlpZiAodW1vdW50Mih0cnlfZGlyLCBNTlRfREVUQUNIKSAhPSAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0ICVzbW91bnQgdG1wZnMiLCAidW4iKTsKKwkJfQorI2Vsc2UKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJeGNoZGlyKHRlbXBkaXIpOworCX0KKwlyZXR1cm4gdGVtcGRpcjsKK30KKworc3RhdGljIHZvaWQgZG9fbG9nZ2luZyh1bnNpZ25lZCBzYW1wbGVfcGVyaW9kX3VzKQoreworCS8vIyBFbmFibGUgcHJvY2VzcyBhY2NvdW50aW5nIGlmIGNvbmZpZ3VyZWQKKwkvL2lmIFsgIiRQUk9DRVNTX0FDQ09VTlRJTkciID0gInllcyIgXTsgdGhlbgorCS8vCVsgLWUga2VybmVsX3BhY2N0IF0gfHwgOiA+IGtlcm5lbF9wYWNjdAorCS8vCWFjY3RvbiBrZXJuZWxfcGFjY3QKKwkvL2ZpCisKKwlGSUxFICpwcm9jX3N0YXQgPSB4Zm9wZW4oInByb2Nfc3RhdC5sb2ciLCAidyIpOworCUZJTEUgKnByb2NfZGlza3N0YXRzID0geGZvcGVuKCJwcm9jX2Rpc2tzdGF0cy5sb2ciLCAidyIpOworCS8vRklMRSAqcHJvY19uZXRkZXYgPSB4Zm9wZW4oInByb2NfbmV0ZGV2LmxvZyIsICJ3Iik7CisJRklMRSAqcHJvY19wcyA9IHhmb3BlbigicHJvY19wcy5sb2ciLCAidyIpOworCWludCBsb29rX2Zvcl9sb2dpbl9wcm9jZXNzID0gKGdldHBwaWQoKSA9PSAxKTsKKwl1bnNpZ25lZCBjb3VudCA9IDYwKjEwMDAqMTAwMCAvIHNhbXBsZV9wZXJpb2RfdXM7IC8qIH4xIG1pbnV0ZSAqLworCisJd2hpbGUgKC0tY291bnQgJiYgIWJiX2dvdF9zaWduYWwpIHsKKwkJY2hhciAqcDsKKwkJaW50IGxlbiA9IG9wZW5fcmVhZF9jbG9zZSgiL3Byb2MvdXB0aW1lIiwgRy5qaWZmeV9saW5lLCBzaXplb2YoRy5qaWZmeV9saW5lKS0yKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIHdhaXRfbW9yZTsKKwkJLyogL3Byb2MvdXB0aW1lIGhhcyBmb3JtYXQgIk5OTk5OTi5NTSBOTk5OTk5OLk1NIiAqLworCQkvKiB3ZSBjb252ZXJ0IGl0IHRvICJOTk5OTk5NTVxuIiAodXNpbmcgZmlyc3QgdmFsdWUpICovCisJCUcuamlmZnlfbGluZVtsZW5dID0gJ1wwJzsKKwkJcCA9IHN0cmNocihHLmppZmZ5X2xpbmUsICcuJyk7CisJCWlmICghcCkKKwkJCWdvdG8gd2FpdF9tb3JlOworCQl3aGlsZSAoaXNkaWdpdCgqKytwKSkKKwkJCXBbLTFdID0gKnA7CisJCXBbLTFdID0gJ1xuJzsKKwkJcFswXSA9ICdcMCc7CisKKwkJZHVtcF9maWxlKHByb2Nfc3RhdCwgIi9wcm9jL3N0YXQiKTsKKwkJZHVtcF9maWxlKHByb2NfZGlza3N0YXRzLCAiL3Byb2MvZGlza3N0YXRzIik7CisJCS8vZHVtcF9maWxlKHByb2NfbmV0ZGV2LCAiL3Byb2MvbmV0L2RldiIpOworCQlpZiAoZHVtcF9wcm9jcyhwcm9jX3BzLCBsb29rX2Zvcl9sb2dpbl9wcm9jZXNzKSkgeworCQkJLyogZHVtcF9wcm9jcyBzYXcgYSBnZXR0eSBvciB7ZyxrLHh9ZG0KKwkJCSAqIHN0b3AgbG9nZ2luZyBpbiAyIHNlY29uZHM6CisJCQkgKi8KKwkJCWlmIChjb3VudCA+IDIqMTAwMCoxMDAwIC8gc2FtcGxlX3BlcmlvZF91cykKKwkJCQljb3VudCA9IDIqMTAwMCoxMDAwIC8gc2FtcGxlX3BlcmlvZF91czsKKwkJfQorCQlmZmx1c2hfYWxsKCk7Cisgd2FpdF9tb3JlOgorCQl1c2xlZXAoc2FtcGxlX3BlcmlvZF91cyk7CisJfQorCisJLy8gWyAtZSBrZXJuZWxfcGFjY3QgXSAmJiBhY2N0b24gb2ZmCit9CisKK3N0YXRpYyB2b2lkIGZpbmFsaXplKGNoYXIgKnRlbXBkaXIsIGNvbnN0IGNoYXIgKnByb2cpCit7CisJLy8jIFN0b3AgcHJvY2VzcyBhY2NvdW50aW5nIGlmIGNvbmZpZ3VyZWQKKwkvL2xvY2FsIHBhY2N0PQorCS8vWyAtZSBrZXJuZWxfcGFjY3QgXSAmJiBwYWNjdD1rZXJuZWxfcGFjY3QKKworCUZJTEUgKmhlYWRlcl9mcCA9IHhmb3BlbigiaGVhZGVyIiwgInciKTsKKworCWlmIChwcm9nKQorCQlmcHJpbnRmKGhlYWRlcl9mcCwgInByb2ZpbGUucHJvY2VzcyA9ICVzXG4iLCBwcm9nKTsKKworCWZwdXRzKCJ2ZXJzaW9uID0gIkJDX1ZFUlNJT05fU1RSIlxuIiwgaGVhZGVyX2ZwKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQk9PVENIQVJURF9CTE9BVEVEX0hFQURFUikgeworCQljaGFyICpob3N0bmFtZTsKKwkJY2hhciAqa2NtZGxpbmU7CisJCXRpbWVfdCB0OworCQlzdHJ1Y3QgdG0gdG1fdGltZTsKKwkJLyogeDIgZm9yIHBvc3NpYmxlIGxvY2FsaXplZCB3ZWVrZGF5L21vbnRoIG5hbWVzICovCisJCWNoYXIgZGF0ZV9idWZbc2l6ZW9mKCJNb24gSnVuIDIxIDA1OjI5OjAzIENFU1QgMjAxMCIpICogMl07CisJCXN0cnVjdCB1dHNuYW1lIHVuYW1lYnVmOworCisJCWhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCQl0aW1lKCZ0KTsKKwkJbG9jYWx0aW1lX3IoJnQsICZ0bV90aW1lKTsKKwkJc3RyZnRpbWUoZGF0ZV9idWYsIHNpemVvZihkYXRlX2J1ZiksICIlYSAlYiAlZSAlSDolTTolUyAlWiAlWSIsICZ0bV90aW1lKTsKKwkJZnByaW50ZihoZWFkZXJfZnAsICJ0aXRsZSA9IEJvb3QgY2hhcnQgZm9yICVzICglcylcbiIsIGhvc3RuYW1lLCBkYXRlX2J1Zik7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoaG9zdG5hbWUpOworCisJCXVuYW1lKCZ1bmFtZWJ1Zik7IC8qIG5ldmVyIGZhaWxzICovCisJCS8qIHNhbWUgYXMgdW5hbWUgLXNydm0gKi8KKwkJZnByaW50ZihoZWFkZXJfZnAsICJzeXN0ZW0udW5hbWUgPSAlcyAlcyAlcyAlc1xuIiwKKwkJCQl1bmFtZWJ1Zi5zeXNuYW1lLAorCQkJCXVuYW1lYnVmLnJlbGVhc2UsCisJCQkJdW5hbWVidWYudmVyc2lvbiwKKwkJCQl1bmFtZWJ1Zi5tYWNoaW5lCisJCSk7CisKKwkJLy9zeXN0ZW0ucmVsZWFzZSA9IGBjYXQgL2V0Yy9ESVNUUk8tcmVsZWFzZWAKKwkJLy9zeXN0ZW0uY3B1ID0gYGdyZXAgJ15tb2RlbCBuYW1lJyAvcHJvYy9jcHVpbmZvIHwgaGVhZCAtMWAgKCRjcHVjb3VudCkKKworCQlrY21kbGluZSA9IHhtYWxsb2Nfb3Blbl9yZWFkX2Nsb3NlKCIvcHJvYy9jbWRsaW5lIiwgTlVMTCk7CisJCS8qIGtjbWRsaW5lIGluY2x1ZGVzIHRyYWlsaW5nICJcbiIgKi8KKwkJZnByaW50ZihoZWFkZXJfZnAsICJzeXN0ZW0ua2VybmVsLm9wdGlvbnMgPSAlcyIsIGtjbWRsaW5lKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShrY21kbGluZSk7CisJfQorCWZjbG9zZShoZWFkZXJfZnApOworCisJLyogUGFja2FnZSBsb2cgZmlsZXMgKi8KKwlzeXN0ZW0oInRhciAtemNmIC92YXIvbG9nL2Jvb3RjaGFydC50Z3ogaGVhZGVyICoubG9nIik7IC8vICsgJHBhY2N0CisJLyogQ2xlYW4gdXAgKGlmIHdlIGFyZSBub3QgaW4gZGV0YWNoZWQgdG1wZnMpICovCisJaWYgKHRlbXBkaXIpIHsKKwkJdW5saW5rKCJoZWFkZXIiKTsKKwkJdW5saW5rKCJwcm9jX3N0YXQubG9nIik7CisJCXVubGluaygicHJvY19kaXNrc3RhdHMubG9nIik7CisJCS8vdW5saW5rKCJwcm9jX25ldGRldi5sb2ciKTsKKwkJdW5saW5rKCJwcm9jX3BzLmxvZyIpOworCQlybWRpcih0ZW1wZGlyKTsKKwl9CisKKwkvKiBzaGVsbC1iYXNlZCBib290Y2hhcnRkIHRyaWVzIHRvIHJ1biAvdXNyL2Jpbi9ib290Y2hhcnQgaWYgJEFVVE9fUkVOREVSPXllczoKKwkgKiAvdXNyL2Jpbi9ib290Y2hhcnQgLW8gIiRBVVRPX1JFTkRFUl9ESVIiIC1mICRBVVRPX1JFTkRFUl9GT1JNQVQgIiRCT09UTE9HX0RFU1QiCisJICovCit9CisKKy8vdXNhZ2U6I2RlZmluZSBib290Y2hhcnRkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJzdGFydCBbUFJPRyBBUkdTXXxzdG9wfGluaXQiCisvL3VzYWdlOiNkZWZpbmUgYm9vdGNoYXJ0ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSAvdmFyL2xvZy9ib290Y2hhcnQudGd6IHdpdGggYm9vdCBjaGFydCBkYXRhXG4iCisvL3VzYWdlOiAgICAgIlxuc3RhcnQ6IHN0YXJ0IGJhY2tncm91bmQgbG9nZ2luZzsgd2l0aCBQUk9HLCBydW4gUFJPRywgdGhlbiBraWxsIGxvZ2dpbmcgd2l0aCBVU1IxIgorLy91c2FnZTogICAgICJcbnN0b3A6IHNlbmQgVVNSMSB0byBhbGwgYm9vdGNoYXJ0ZCBwcm9jZXNzZXMiCisvL3VzYWdlOiAgICAgIlxuaW5pdDogc3RhcnQgYmFja2dyb3VuZCBsb2dnaW5nOyBzdG9wIHdoZW4gZ2V0dHkveGRtIGlzIHNlZW4gKGZvciBpbml0IHNjcmlwdHMpIgorLy91c2FnZTogICAgICJcblVuZGVyIFBJRCAxOiBhcyBpbml0LCB0aGVuIGV4ZWMgJGJvb3RjaGFydF9pbml0LCAvaW5pdCwgL3NiaW4vaW5pdCIKKworaW50IGJvb3RjaGFydGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJvb3RjaGFydGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIHNhbXBsZV9wZXJpb2RfdXM7CisJcGlkX3QgcGFyZW50X3BpZCwgbG9nZ2VyX3BpZDsKKwlzbWFsbGludCBjbWQ7CisJZW51bSB7CisJCUNNRF9TVE9QID0gMCwKKwkJQ01EX1NUQVJULAorCQlDTURfSU5JVCwKKwkJQ01EX1BJRDEsIC8qIHVzZWQgdG8gbWFyayBwaWQgMSBjYXNlICovCisJfTsKKworCUlOSVRfRygpOworCisJcGFyZW50X3BpZCA9IGdldHBpZCgpOworCWlmIChhcmd2WzFdKSB7CisJCWNtZCA9IGluZGV4X2luX3N0cmluZ3MoInN0b3BcMCIic3RhcnRcMCIiaW5pdFwwIiwgYXJndlsxXSk7CisJCWlmIChjbWQgPCAwKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAoY21kID09IENNRF9TVE9QKSB7CisJCQlwaWRfdCAqcGlkTGlzdCA9IGZpbmRfcGlkX2J5X25hbWUoImJvb3RjaGFydGQiKTsKKwkJCXdoaWxlICgqcGlkTGlzdCAhPSAwKSB7CisJCQkJaWYgKCpwaWRMaXN0ICE9IHBhcmVudF9waWQpCisJCQkJCWtpbGwoKnBpZExpc3QsIFNJR1VTUjEpOworCQkJCXBpZExpc3QrKzsKKwkJCX0KKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocGFyZW50X3BpZCAhPSAxKQorCQkJYmJfc2hvd191c2FnZSgpOworCQljbWQgPSBDTURfUElEMTsKKwl9CisKKwkvKiBIZXJlIHdlIGFyZSBpbiBTVEFSVCwgSU5JVCBvciBDTURfUElEMSBzdGF0ZSAqLworCisJLyogUmVhZCBjb25maWcgZmlsZTogKi8KKwlzYW1wbGVfcGVyaW9kX3VzID0gMjAwICogMTAwMDsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQk9PVENIQVJURF9DT05GSUdfRklMRSkgeworCQljaGFyKiB0b2tlblsyXTsKKwkJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuMigiL2V0Yy9ib290Y2hhcnRkLmNvbmYiICsgNSwgZm9wZW5fZm9yX3JlYWQpOworCQlpZiAoIXBhcnNlcikKKwkJCXBhcnNlciA9IGNvbmZpZ19vcGVuMigiL2V0Yy9ib290Y2hhcnRkLmNvbmYiLCBmb3Blbl9mb3JfcmVhZCk7CisJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAwLCAiIz0iLCBQQVJTRV9OT1JNQUwgJiB+UEFSU0VfQ09MTEFQU0UpKSB7CisJCQlpZiAoc3RyY21wKHRva2VuWzBdLCAiU0FNUExFX1BFUklPRCIpID09IDAgJiYgdG9rZW5bMV0pCisJCQkJc2FtcGxlX3BlcmlvZF91cyA9IGF0b2YodG9rZW5bMV0pICogMTAwMDAwMDsKKwkJfQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9CisJaWYgKChpbnQpc2FtcGxlX3BlcmlvZF91cyA8PSAwKQorCQlzYW1wbGVfcGVyaW9kX3VzID0gMTsgLyogcHJldmVudCBkaXZpc2lvbiBieSAwICovCisKKwkvKiBDcmVhdGUgbG9nZ2VyIGNoaWxkOiAqLworCWxvZ2dlcl9waWQgPSBmb3JrX29yX3JleGVjKGFyZ3YpOworCisJaWYgKGxvZ2dlcl9waWQgPT0gMCkgeyAvKiBjaGlsZCAqLworCQljaGFyICp0ZW1wZGlyOworCisJCWJiX3NpZ25hbHMoMAorCQkJKyAoMSA8PCBTSUdVU1IxKQorCQkJKyAoMSA8PCBTSUdVU1IyKQorCQkJKyAoMSA8PCBTSUdURVJNKQorCQkJKyAoMSA8PCBTSUdRVUlUKQorCQkJKyAoMSA8PCBTSUdJTlQpCisJCQkrICgxIDw8IFNJR0hVUCkKKwkJCSwgcmVjb3JkX3NpZ25vKTsKKworCQlpZiAoRE9fU0lHTkFMX1NZTkMpCisJCQkvKiBJbmZvcm0gcGFyZW50IHRoYXQgd2UgYXJlIHJlYWR5ICovCisJCQlyYWlzZShTSUdTVE9QKTsKKworCQkvKiBJZiB3ZSBhcmUgc3RhcnRlZCBieSBrZXJuZWwsIFBBVEggbWlnaHQgYmUgdW5zZXQuCisJCSAqIEluIG9yZGVyIHRvIGZpbmQgInRhciIsIGxldCdzIHNldCBzb21lIHNhbmUgUEFUSDoKKwkJICovCisJCWlmIChjbWQgPT0gQ01EX1BJRDEgJiYgIWdldGVudigiUEFUSCIpKQorCQkJcHV0ZW52KChjaGFyKiliYl9QQVRIX3Jvb3RfcGF0aCk7CisKKwkJdGVtcGRpciA9IG1ha2VfdGVtcGRpcigpOworCQlkb19sb2dnaW5nKHNhbXBsZV9wZXJpb2RfdXMpOworCQlmaW5hbGl6ZSh0ZW1wZGlyLCBjbWQgPT0gQ01EX1NUQVJUID8gYXJndlsyXSA6IE5VTEwpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIHBhcmVudCAqLworCisJaWYgKERPX1NJR05BTF9TWU5DKSB7CisJCS8qIFdhaXQgZm9yIGxvZ2dlciBjaGlsZCB0byBzZXQgaGFuZGxlcnMsIHRoZW4gdW5wYXVzZSBpdC4KKwkJICogT3RoZXJ3aXNlIHdpdGggc2hvcnQtbGl2ZWQgUFJPRyAoZS5nLiAiYm9vdGNoYXJ0ZCBzdGFydCB0cnVlIikKKwkJICogd2UgbWlnaHQgc2VuZCBTSUdVU1IxIGJlZm9yZSBsb2dnZXIgc2V0cyBpdHMgaGFuZGxlci4KKwkJICovCisJCXdhaXRwaWQobG9nZ2VyX3BpZCwgTlVMTCwgV1VOVFJBQ0VEKTsKKwkJa2lsbChsb2dnZXJfcGlkLCBTSUdDT05UKTsKKwl9CisKKwlpZiAoY21kID09IENNRF9QSUQxKSB7CisJCWNoYXIgKmJvb3RjaGFydF9pbml0ID0gZ2V0ZW52KCJib290Y2hhcnRfaW5pdCIpOworCQlpZiAoYm9vdGNoYXJ0X2luaXQpCisJCQlleGVjbChib290Y2hhcnRfaW5pdCwgYm9vdGNoYXJ0X2luaXQsIE5VTEwpOworCQlleGVjbCgiL2luaXQiLCAiaW5pdCIsIE5VTEwpOworCQlleGVjbCgiL3NiaW4vaW5pdCIsICJpbml0IiwgTlVMTCk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgIi9zYmluL2luaXQiKTsKKwl9CisKKwlpZiAoY21kID09IENNRF9TVEFSVCAmJiBhcmd2WzJdKSB7IC8qICJzdGFydCBQUk9HIEFSR1MiICovCisJCXBpZF90IHBpZCA9IHh2Zm9yaygpOworCQlpZiAocGlkID09IDApIHsgLyogY2hpbGQgKi8KKwkJCWFyZ3YgKz0gMjsKKwkJCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisJCX0KKwkJLyogcGFyZW50ICovCisJCXdhaXRwaWQocGlkLCBOVUxMLCAwKTsKKwkJa2lsbChsb2dnZXJfcGlkLCBTSUdVU1IxKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvaW5pdC9oYWx0LmMgYi9idXN5Ym94LTEuMTkuMy9pbml0L2hhbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc0YWRiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5pdC9oYWx0LmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFBvd2Vyb2ZmIHJlYm9vdCBhbmQgaGFsdCwgb2ggbXkuCisgKgorICogQ29weXJpZ2h0IDIwMDYgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX0hBTFQoQVBQTEVUKGhhbHQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfSEFMVChBUFBMRVRfT0RETkFNRShwb3dlcm9mZiwgaGFsdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgcG93ZXJvZmYpKQorLy9hcHBsZXQ6SUZfSEFMVChBUFBMRVRfT0RETkFNRShyZWJvb3QsIGhhbHQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIHJlYm9vdCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19IQUxUKSArPSBoYWx0Lm8KKworLy9jb25maWc6Y29uZmlnIEhBTFQKKy8vY29uZmlnOglib29sICJwb3dlcm9mZiwgaGFsdCwgYW5kIHJlYm9vdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdG9wIGFsbCBwcm9jZXNzZXMgYW5kIGVpdGhlciBoYWx0LCByZWJvb3QsIG9yIHBvd2VyIG9mZiB0aGUgc3lzdGVtLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9DQUxMX1RFTElOSVQKKy8vY29uZmlnOglib29sICJDYWxsIHRlbGluaXQgb24gc2h1dGRvd24gYW5kIHJlYm9vdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhBTFQgJiYgIUlOSVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDYWxsIGFuIGV4dGVybmFsIHByb2dyYW0gKG5vcm1hbGx5IHRlbGluaXQpIHRvIGZhY2lsaXRhdGUKKy8vY29uZmlnOgkgIGEgc3dpdGNoIHRvIGEgcHJvcGVyIHJ1bmxldmVsLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0ZWQgaGFsdCBhbmQgZnJpZW5kcywKKy8vY29uZmlnOgkgIGJ1dCBkaWQgbm90IHNlbGVjdCBpbml0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgVEVMSU5JVF9QQVRICisvL2NvbmZpZzoJc3RyaW5nICJQYXRoIHRvIHRlbGluaXQgZXhlY3V0YWJsZSIKKy8vY29uZmlnOglkZWZhdWx0ICIvc2Jpbi90ZWxpbml0IgorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9DQUxMX1RFTElOSVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBXaGVuIGJ1c3lib3ggaGFsdCBhbmQgZnJpZW5kcyBoYXZlIHRvIGNhbGwgZXh0ZXJuYWwgdGVsaW5pdAorLy9jb25maWc6CSAgdG8gZmFjaWxpdGF0ZSBwcm9wZXIgc2h1dGRvd24sIHRoaXMgcGF0aCBpcyB0byBiZSB1c2VkIHdoZW4KKy8vY29uZmlnOgkgIGxvY2F0aW5nIHRlbGluaXQgZXhlY3V0YWJsZS4KKworLy91c2FnZTojZGVmaW5lIGhhbHRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZCBERUxBWV0gWy1uXSBbLWZdIiBJRl9GRUFUVVJFX1dUTVAoIiBbLXddIikKKy8vdXNhZ2U6I2RlZmluZSBoYWx0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiSGFsdCB0aGUgc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kIFNFQwlEZWxheSBpbnRlcnZhbCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG8gbm90IHN5bmMiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIChkb24ndCBnbyB0aHJvdWdoIGluaXQpIgorLy91c2FnZToJSUZfRkVBVFVSRV9XVE1QKAorLy91c2FnZTogICAgICJcbgktdwlPbmx5IHdyaXRlIGEgd3RtcCByZWNvcmQiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHBvd2Vyb2ZmX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWQgREVMQVldIFstbl0gWy1mXSIKKy8vdXNhZ2U6I2RlZmluZSBwb3dlcm9mZl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkhhbHQgYW5kIHNodXQgb2ZmIHBvd2VyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kIFNFQwlEZWxheSBpbnRlcnZhbCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG8gbm90IHN5bmMiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIChkb24ndCBnbyB0aHJvdWdoIGluaXQpIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSByZWJvb3RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZCBERUxBWV0gWy1uXSBbLWZdIgorLy91c2FnZTojZGVmaW5lIHJlYm9vdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlYm9vdCB0aGUgc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kIFNFQwlEZWxheSBpbnRlcnZhbCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG8gbm90IHN5bmMiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIChkb24ndCBnbyB0aHJvdWdoIGluaXQpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJyZWJvb3QuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dUTVAKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCitzdGF0aWMgdm9pZCB3cml0ZV93dG1wKHZvaWQpCit7CisJc3RydWN0IHV0bXAgdXRtcDsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJLyogIm1hbiB1dG1wIiBzYXlzIHd0bXAgZmlsZSBzaG91bGQgKm5vdCogYmUgY3JlYXRlZCBhdXRvbWFnaWNhbGx5ICovCisJLyppZiAoYWNjZXNzKGJiX3BhdGhfd3RtcF9maWxlLCBSX09LfFdfT0spID09IC0xKSB7CisJCWNsb3NlKGNyZWF0KGJiX3BhdGhfd3RtcF9maWxlLCAwNjY0KSk7CisJfSovCisJbWVtc2V0KCZ1dG1wLCAwLCBzaXplb2YodXRtcCkpOworCXV0bXAudXRfdHYudHZfc2VjID0gdGltZShOVUxMKTsKKwlzdHJjcHkodXRtcC51dF91c2VyLCAic2h1dGRvd24iKTsgLyogaXQgaXMgd2lkZSBlbm91Z2ggKi8KKwl1dG1wLnV0X3R5cGUgPSBSVU5fTFZMOworCXV0bXAudXRfaWRbMF0gPSAnfic7IHV0bXAudXRfaWRbMV0gPSAnfic7IC8qID0gc3RyY3B5KHV0bXAudXRfaWQsICJ+fiIpOyAqLworCXV0bXAudXRfbGluZVswXSA9ICd+JzsgdXRtcC51dF9saW5lWzFdID0gJ34nOyAvKiA9IHN0cmNweSh1dG1wLnV0X2xpbmUsICJ+fiIpOyAqLworCXVuYW1lKCZ1dHMpOworCXNhZmVfc3RybmNweSh1dG1wLnV0X2hvc3QsIHV0cy5yZWxlYXNlLCBzaXplb2YodXRtcC51dF9ob3N0KSk7CisJdXBkd3RtcChiYl9wYXRoX3d0bXBfZmlsZSwgJnV0bXApOworfQorI2Vsc2UKKyNkZWZpbmUgd3JpdGVfd3RtcCgpICgodm9pZCkwKQorI2VuZGlmCisKKworaW50IGhhbHRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGhhbHRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBpbnQgbWFnaWNbXSA9IHsKKwkJUkJfSEFMVF9TWVNURU0sCisJCVJCX1BPV0VSX09GRiwKKwkJUkJfQVVUT0JPT1QKKwl9OworCXN0YXRpYyBjb25zdCBzbWFsbGludCBzaWduYWxzW10gPSB7IFNJR1VTUjEsIFNJR1VTUjIsIFNJR1RFUk0gfTsKKworCWludCBkZWxheSA9IDA7CisJaW50IHdoaWNoLCBmbGFncywgcmM7CisKKwkvKiBGaWd1cmUgb3V0IHdoaWNoIGFwcGxldCB3ZSdyZSBydW5uaW5nICovCisJZm9yICh3aGljaCA9IDA7ICJocHIiW3doaWNoXSAhPSBhcHBsZXRfbmFtZVswXTsgd2hpY2grKykKKwkJY29udGludWU7CisKKwkvKiBQYXJzZSBhbmQgaGFuZGxlIGFyZ3VtZW50cyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gImQrIjsgLyogLWQgTiAqLworCS8qIFdlIHN1cHBvcnQgLXcgZXZlbiBpZiAhRU5BQkxFX0ZFQVRVUkVfV1RNUCwKKwkgKiBpbiBvcmRlciB0byBub3QgYnJlYWsgc2NyaXB0cy4KKwkgKiAtaSAoc2h1dCBkb3duIG5ldHdvcmsgaW50ZXJmYWNlcykgaXMgaWdub3JlZC4KKwkgKi8KKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJkOm5md2kiLCAmZGVsYXkpOworCisJc2xlZXAoZGVsYXkpOworCisJd3JpdGVfd3RtcCgpOworCisJaWYgKGZsYWdzICYgOCkgLyogLXcgKi8KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKworCWlmICghKGZsYWdzICYgMikpIC8qIG5vIC1uICovCisJCXN5bmMoKTsKKworCS8qIFBlcmZvcm0gYWN0aW9uLiAqLworCXJjID0gMTsKKwlpZiAoIShmbGFncyAmIDQpKSB7IC8qIG5vIC1mICovCisvL1RPRE86IEkgdGVuZCB0byB0aGluayB0aGF0IHNpZ25hbGxpbmcgbGludXhyYyBpcyB3cm9uZworLy8gcGl0eSBvcmlnaW5hbCBhdXRob3IgZGlkbid0IGNvbW1lbnQgb24gaXQuLi4KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0lOSVRSRCkgeworCQkJLyogdGFsayB0byBsaW51eHJjICovCisJCQkvKiBiYm94IGluaXQvbGludXhyYyBhc3N1bWVkICovCisJCQlwaWRfdCAqcGlkbGlzdCA9IGZpbmRfcGlkX2J5X25hbWUoImxpbnV4cmMiKTsKKwkJCWlmIChwaWRsaXN0WzBdID4gMCkKKwkJCQlyYyA9IGtpbGwocGlkbGlzdFswXSwgc2lnbmFsc1t3aGljaF0pOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWZyZWUocGlkbGlzdCk7CisJCX0KKwkJaWYgKHJjKSB7CisJCQkvKiB0YWxrIHRvIGluaXQgKi8KKwkJCWlmICghRU5BQkxFX0ZFQVRVUkVfQ0FMTF9URUxJTklUKSB7CisJCQkJLyogYmJveCBpbml0IGFzc3VtZWQgKi8KKwkJCQlyYyA9IGtpbGwoMSwgc2lnbmFsc1t3aGljaF0pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTeXNWIHN0eWxlIGluaXQgYXNzdW1lZCAqLworCQkJCS8qIHJ1bmxldmVsczoKKwkJCQkgKiAwID09IHNodXRkb3duCisJCQkJICogNiA9PSByZWJvb3QgKi8KKwkJCQlleGVjbHAoQ09ORklHX1RFTElOSVRfUEFUSCwKKwkJCQkJCUNPTkZJR19URUxJTklUX1BBVEgsCisJCQkJCQl3aGljaCA9PSAyID8gIjYiIDogIjAiLAorCQkJCQkJKGNoYXIgKilOVUxMCisJCQkJKTsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsCisJCQkJCQlDT05GSUdfVEVMSU5JVF9QQVRIKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJjID0gcmVib290KG1hZ2ljW3doaWNoXSk7CisJfQorCisJaWYgKHJjKQorCQliYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSgpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2luaXQvaW5pdC5jIGIvYnVzeWJveC0xLjE5LjMvaW5pdC9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1ZjY5NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2luaXQvaW5pdC5jCkBAIC0wLDAgKzEsMTI5MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBpbml0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IEJydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPi4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIEFkanVzdGVkIGJ5IHNvIG1hbnkgZm9sa3MsIGl0J3MgaW1wb3NzaWJsZSB0byBrZWVwIHRyYWNrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfSU5JVChBUFBMRVQoaW5pdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9GRUFUVVJFX0lOSVRSRChBUFBMRVRfT0RETkFNRShsaW51eHJjLCBpbml0LCBCQl9ESVJfUk9PVCwgQkJfU1VJRF9EUk9QLCBsaW51eHJjKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0lOSVQpICs9IGluaXQubworCisvL2NvbmZpZzpjb25maWcgSU5JVAorLy9jb25maWc6CWJvb2wgImluaXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgaW5pdCBpcyB0aGUgZmlyc3QgcHJvZ3JhbSBydW4gd2hlbiB0aGUgc3lzdGVtIGJvb3RzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9VU0VfSU5JVFRBQgorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgcmVhZGluZyBhbiBpbml0dGFiIGZpbGUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQWxsb3cgaW5pdCB0byByZWFkIGFuIGluaXR0YWIgZmlsZSB3aGVuIHRoZSBzeXN0ZW0gYm9vdC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfS0lMTF9SRU1PVkVECisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBraWxsaW5nIHByb2Nlc3NlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gaW5pdHRhYiIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglkZXBlbmRzIG9uIEZFQVRVUkVfVVNFX0lOSVRUQUIKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBXaGVuIHJlc3Bhd24gZW50cmllcyBhcmUgcmVtb3ZlZCBmcm9tIGluaXR0YWIgYW5kIGEgU0lHSFVQIGlzCisvL2NvbmZpZzoJICBzZW50IHRvIGluaXQsIHRoaXMgb3B0aW9uIHdpbGwgbWFrZSBpbml0IGtpbGwgdGhlIHByb2Nlc3NlcworLy9jb25maWc6CSAgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfS0lMTF9ERUxBWQorLy9jb25maWc6CWludCAiSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIFRFUk0gYW5kIEtJTEwgKDAgLSBzZW5kIFRFUk0gb25seSkiIGlmIEZFQVRVUkVfS0lMTF9SRU1PVkVECisvL2NvbmZpZzoJcmFuZ2UgMCAxMDI0CisvL2NvbmZpZzoJZGVmYXVsdCAwCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0tJTExfUkVNT1ZFRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdpdGggbm9uemVybyBzZXR0aW5nLCBpbml0IHNlbmRzIFRFUk0sIGZvcmtzLCBjaGlsZCB3YWl0cyBOCisvL2NvbmZpZzoJICBzZWNvbmRzLCBzZW5kcyBLSUxMIGFuZCBleGl0cy4gU2V0dGluZyBpdCB0b28gaGlnaCBpcyB1bndpc2UKKy8vY29uZmlnOgkgIChjaGlsZCB3aWxsIGhhbmcgYXJvdW5kIGZvciB0b28gbG9uZyBhbmQgY291bGQgYWN0dWFsbHkga2lsbAorLy9jb25maWc6CSAgdGhlIHdyb25nIHByb2Nlc3MhKQorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9JTklUX1NDVFRZCisvL2NvbmZpZzoJYm9vbCAiUnVuIGNvbW1hbmRzIHdpdGggbGVhZGluZyBkYXNoIHdpdGggY29udHJvbGxpbmcgdHR5IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIGluaXQgd2lsbCB0cnkgdG8gZ2l2ZSBhIGNvbnRyb2xsaW5nCisvL2NvbmZpZzoJICB0dHkgdG8gYW55IGNvbW1hbmQgd2hpY2ggaGFzIGxlYWRpbmcgaHlwaGVuIChvZnRlbiBpdCdzICItL2Jpbi9zaCIpLgorLy9jb25maWc6CSAgTW9yZSBwcmVjaXNlbHksIGluaXQgd2lsbCBkbyAiaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DU0NUVFksIDApIi4KKy8vY29uZmlnOgkgIElmIGRldmljZSBhdHRhY2hlZCB0byBTVERJTl9GSUxFTk8gY2FuIGJlIGEgY3R0eSBidXQgaXMgbm90IHlldAorLy9jb25maWc6CSAgYSBjdHR5IGZvciBvdGhlciBzZXNzaW9uLCBpdCB3aWxsIGJlY29tZSB0aGlzIHByb2Nlc3MnIGN0dHkuCisvL2NvbmZpZzoJICBUaGlzIGlzIG5vdCB0aGUgdHJhZGl0aW9uYWwgaW5pdCBiZWhhdm91ciwgYnV0IGlzIG9mdGVuIHdoYXQgeW91IHdhbnQKKy8vY29uZmlnOgkgIGluIGFuIGVtYmVkZGVkIHN5c3RlbSB3aGVyZSB0aGUgY29uc29sZSBpcyBvbmx5IGFjY2Vzc2VkIGR1cmluZworLy9jb25maWc6CSAgZGV2ZWxvcG1lbnQgb3IgZm9yIG1haW50ZW5hbmNlLgorLy9jb25maWc6CSAgTkI6IHVzaW5nIGN0dHloYWNrIGFwcGxldCBtYXkgd29yayBiZXR0ZXIuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0lOSVRfU1lTTE9HCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGluaXQgdG8gd3JpdGUgdG8gc3lzbG9nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSU5JVAorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9FWFRSQV9RVUlFVAorLy9jb25maWc6CWJvb2wgIkJlIF9leHRyYV8gcXVpZXQgb24gYm9vdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIElOSVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBQcmV2ZW50IGluaXQgZnJvbSBsb2dnaW5nIHNvbWUgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUgZHVyaW5nIGJvb3QuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0lOSVRfQ09SRURVTVBTCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBkdW1waW5nIGNvcmUgZm9yIGNoaWxkIHByb2Nlc3NlcyAoZGVidWdnaW5nIG9ubHkpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIHRoZSBmaWxlIC8uaW5pdF9lbmFibGVfY29yZQorLy9jb25maWc6CSAgZXhpc3RzLCB0aGVuIGluaXQgd2lsbCBjYWxsIHNldHJsaW1pdCgpIHRvIGFsbG93IHVubGltaXRlZAorLy9jb25maWc6CSAgY29yZSBmaWxlIHNpemVzLiBJZiB0aGlzIG9wdGlvbiBpcyBkaXNhYmxlZCwgcHJvY2Vzc2VzCisvL2NvbmZpZzoJICB3aWxsIG5vdCBnZW5lcmF0ZSBhbnkgY29yZSBmaWxlcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfSU5JVFJECisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBydW5uaW5nIGluaXQgZnJvbSB3aXRoaW4gYW4gaW5pdHJkIChub3QgaW5pdHJhbWZzKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIElOSVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBMZWdhY3kgc3VwcG9ydCBmb3IgcnVubmluZyBpbml0IHVuZGVyIHRoZSBvbGQtc3R5bGUgaW5pdHJkLiBBbGxvd3MKKy8vY29uZmlnOgkgIHRoZSBuYW1lIGxpbnV4cmMgdG8gYWN0IGFzIGluaXQsIGFuZCBpdCBkb2Vzbid0IGFzc3VtZSBpbml0IGlzIFBJRCAxLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGluaXRyYW1mcywgd2hpY2ggcnVucyAvaW5pdCBhcyBQSUQgMSBhbmQKKy8vY29uZmlnOgkgIHJlcXVpcmVzIG5vIHNwZWNpYWwgc3VwcG9ydC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIElOSVRfVEVSTUlOQUxfVFlQRQorLy9jb25maWc6CXN0cmluZyAiSW5pdGlhbCB0ZXJtaW5hbCB0eXBlIgorLy9jb25maWc6CWRlZmF1bHQgImxpbnV4IgorLy9jb25maWc6CWRlcGVuZHMgb24gSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgaXMgdGhlIGluaXRpYWwgdmFsdWUgc2V0IGJ5IGluaXQgZm9yIHRoZSBURVJNIGVudmlyb25tZW50CisvL2NvbmZpZzoJICB2YXJpYWJsZS4gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHByb2dyYW1zIHdoaWNoIG1ha2UgdXNlIG9mCisvL2NvbmZpZzoJICBleHRlbmRlZCB0ZXJtaW5hbCBjYXBhYmlsaXRpZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIE5vdGUgdGhhdCBvbiBMaW51eCwgaW5pdCBhdHRlbXB0cyB0byBkZXRlY3Qgc2VyaWFsIHRlcm1pbmFsIGFuZAorLy9jb25maWc6CSAgc2V0cyBURVJNIHRvICJ2dDEwMiIgaWYgb25lIGlzIGZvdW5kLgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2lmZGVmIF9fbGludXhfXworIyBpbmNsdWRlIDxsaW51eC92dC5oPgorIyBpbmNsdWRlIDxzeXMvc3lzaW5mby5oPgorI2VuZGlmCisjaW5jbHVkZSAicmVib290LmgiIC8qIHJlYm9vdCgpIGNvbnN0YW50cyAqLworCisvKiBVc2VkIG9ubHkgZm9yIHNhbml0aXppbmcgcHVycG9zZXMgaW4gc2V0X3NhbmVfdGVybSgpIGJlbG93LiBPbiBzeXN0ZW1zIHdoZXJlCisgKiB0aGUgYmF1ZCByYXRlIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIGZpZWxkLCB3ZSBjYW4gc2FmZWx5IGRpc2FibGUgdGhlbS4gKi8KKyNpZm5kZWYgQ0JBVUQKKyMgZGVmaW5lIENCQVVEIDAKKyMgZGVmaW5lIENCQVVERVggMAorI2VuZGlmCisKKy8qIFdhcyBhIENPTkZJR194eHggb3B0aW9uLiBBIGxvdCBvZiBwZW9wbGUgd2VyZSBidWlsZGluZworICogbm90IGZ1bGx5IGZ1bmN0aW9uYWwgaW5pdCBieSBzd2l0Y2hpbmcgaXQgb24hICovCisjZGVmaW5lIERFQlVHX0lOSVQgMAorCisjZGVmaW5lIENPTU1BTkRfU0laRSAgICAgIDI1NgorI2RlZmluZSBDT05TT0xFX05BTUVfU0laRSAzMgorCisvKiBEZWZhdWx0IHN5c2luaXQgc2NyaXB0LiAqLworI2lmbmRlZiBJTklUX1NDUklQVAorI2RlZmluZSBJTklUX1NDUklQVCAgIi9ldGMvaW5pdC5kL3JjUyIKKyNlbmRpZgorCisvKiBFYWNoIHR5cGUgb2YgYWN0aW9ucyBjYW4gYXBwZWFyIG1hbnkgdGltZXMuIFRoZXkgd2lsbCBiZQorICogaGFuZGxlZCBpbiBvcmRlci4gUkVTVEFSVCBpcyBhbiBleGNlcHRpb24sIG9ubHkgMXN0IGlzIHVzZWQuCisgKi8KKy8qIFN0YXJ0IHRoZXNlIGFjdGlvbnMgZmlyc3QgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgU1lTSU5JVCAgICAgMHgwMQorLyogU3RhcnQgdGhlc2UgYWZ0ZXIgU1lTSU5JVCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbiAqLworI2RlZmluZSBXQUlUICAgICAgICAweDAyCisvKiBTdGFydCB0aGVzZSBhZnRlciBXQUlUIGFuZCAqZG9udCogd2FpdCBmb3IgY29tcGxldGlvbiAqLworI2RlZmluZSBPTkNFICAgICAgICAweDA0CisvKgorICogTkI6IHdoaWxlIFNZU0lOSVQvV0FJVC9PTkNFIGFyZSBiZWluZyBwcm9jZXNzZWQsCisgKiBTSUdIVVAgKCJyZXJlYWQgL2V0Yy9pbml0dGFiIikgd2lsbCBiZSBwcm9jZXNzZWQgb25seSBhZnRlcgorICogZWFjaCBncm91cCBvZiBhY3Rpb25zLiBJZiBuZXcgaW5pdHRhYiBhZGRzLCBzYXksIGEgU1lTSU5JVCBhY3Rpb24sCisgKiBpdCB3aWxsIG5vdCBiZSBydW4sIHNpbmNlIGluaXQgaXMgYWxyZWFkeSAicGFzdCBTWVNJTklUIHN0YWdlIi4KKyAqLworLyogU3RhcnQgdGhlc2UgYWZ0ZXIgT05DRSBhcmUgc3RhcnRlZCwgcmVzdGFydCBvbiBleGl0ICovCisjZGVmaW5lIFJFU1BBV04gICAgIDB4MDgKKy8qIExpa2UgUkVTUEFXTiwgYnV0IHdhaXQgZm9yIDxFbnRlcj4gdG8gYmUgcHJlc3NlZCBvbiB0dHkgKi8KKyNkZWZpbmUgQVNLRklSU1QgICAgMHgxMAorLyoKKyAqIFN0YXJ0IHRoZXNlIG9uIFNJR0lOVCwgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uCisgKiBUaGVuIGdvIGJhY2sgdG8gcmVzcGF3bmluZyBSRVNQQVdOIGFuZCBBU0tGSVJTVCBhY3Rpb25zLgorICogTkI6IGtlcm5lbCBzZW5kcyBTSUdJTlQgdG8gdXMgaWYgQ3RybC1BbHQtRGVsIHdhcyBwcmVzc2VkLgorICovCisjZGVmaW5lIENUUkxBTFRERUwgIDB4MjAKKy8qCisgKiBTdGFydCB0aGVzZSBiZWZvcmUga2lsbGluZyBhbGwgcHJvY2Vzc2VzIGluIHByZXBhcmF0aW9uIGZvcgorICogcnVubmluZyBSRVNUQVJUIGFjdGlvbnMgb3IgZG9pbmcgbG93LWxldmVsIGhhbHQvcmVib290L3Bvd2Vyb2ZmCisgKiAoaW5pdGlhdGVkIGJ5IFNJR1VTUjEvU0lHVEVSTS9TSUdVU1IyKS4KKyAqIFdhaXQgZm9yIGNvbXBsZXRpb24gYmVmb3JlIHByb2NlZWRpbmcuCisgKi8KKyNkZWZpbmUgU0hVVERPV04gICAgMHg0MAorLyoKKyAqIGV4ZWMoKSBvbiBTSUdRVUlULiBTSFVURE9XTiBhY3Rpb25zIGFyZSBzdGFydGVkIGFuZCB3YWl0ZWQgZm9yLAorICogdGhlbiBhbGwgcHJvY2Vzc2VzIGFyZSBraWxsZWQsIHRoZW4gaW5pdCBleGVjJ3MgMXN0IFJFU1RBUlQgYWN0aW9uLAorICogcmVwbGFjaW5nIGl0c2VsZiBieSBpdC4gSWYgbm8gUkVTVEFSVCBhY3Rpb24gc3BlY2lmaWVkLAorICogU0lHUVVJVCBoYXMgbm8gZWZmZWN0LgorICovCisjZGVmaW5lIFJFU1RBUlQgICAgIDB4ODAKKworCisvKiBBIGxpbmtlZCBsaXN0IG9mIGluaXRfYWN0aW9ucywgdG8gYmUgcmVhZCBmcm9tIGluaXR0YWIgKi8KK3N0cnVjdCBpbml0X2FjdGlvbiB7CisJc3RydWN0IGluaXRfYWN0aW9uICpuZXh0OworCXBpZF90IHBpZDsKKwl1aW50OF90IGFjdGlvbl90eXBlOworCWNoYXIgdGVybWluYWxbQ09OU09MRV9OQU1FX1NJWkVdOworCWNoYXIgY29tbWFuZFtDT01NQU5EX1NJWkVdOworfTsKKworc3RhdGljIHN0cnVjdCBpbml0X2FjdGlvbiAqaW5pdF9hY3Rpb25fbGlzdCA9IE5VTEw7CisKK3N0YXRpYyBjb25zdCBjaGFyICpsb2dfY29uc29sZSA9IFZDXzU7CisKK2VudW0geworCUxfTE9HID0gMHgxLAorCUxfQ09OU09MRSA9IDB4MiwKK307CisKKy8qIFByaW50IGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGRldmljZS4KKyAqICJ3aGVyZSIgbWF5IGJlIGJpdHdpc2Utb3InZCBmcm9tIExfTE9HIHwgTF9DT05TT0xFCisgKiBOQjogY2FyZWZ1bCwgd2UgY2FuIGJlIGNhbGxlZCBhZnRlciB2Zm9yayEKKyAqLworI2RlZmluZSBkYmdfbWVzc2FnZSguLi4pIGRvIHsgaWYgKERFQlVHX0lOSVQpIG1lc3NhZ2UoX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorc3RhdGljIHZvaWQgbWVzc2FnZShpbnQgd2hlcmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworc3RhdGljIHZvaWQgbWVzc2FnZShpbnQgd2hlcmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJndW1lbnRzOworCXVuc2lnbmVkIGw7CisJY2hhciBtc2dbMTI4XTsKKworCW1zZ1swXSA9ICdccic7CisJdmFfc3RhcnQoYXJndW1lbnRzLCBmbXQpOworCWwgPSAxICsgdnNucHJpbnRmKG1zZyArIDEsIHNpemVvZihtc2cpIC0gMiwgZm10LCBhcmd1bWVudHMpOworCWlmIChsID4gc2l6ZW9mKG1zZykgLSAxKQorCQlsID0gc2l6ZW9mKG1zZykgLSAxOworCXZhX2VuZChhcmd1bWVudHMpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5JVF9TWVNMT0cKKwltc2dbbF0gPSAnXDAnOworCWlmICh3aGVyZSAmIExfTE9HKSB7CisJCS8qIExvZyB0aGUgbWVzc2FnZSB0byBzeXNsb2dkICovCisJCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19EQUVNT04pOworCQkvKiBkb24ndCBwcmludCAiXHIiICovCisJCXN5c2xvZyhMT0dfSU5GTywgIiVzIiwgbXNnICsgMSk7CisJCWNsb3NlbG9nKCk7CisJfQorCW1zZ1tsKytdID0gJ1xuJzsKKwltc2dbbF0gPSAnXDAnOworI2Vsc2UKKwl7CisJCXN0YXRpYyBpbnQgbG9nX2ZkID0gLTE7CisKKwkJbXNnW2wrK10gPSAnXG4nOworCQltc2dbbF0gPSAnXDAnOworCQkvKiBUYWtlIGZ1bGwgY29udHJvbCBvZiB0aGUgbG9nIHR0eSwgYW5kIG5ldmVyIGNsb3NlIGl0LgorCQkgKiBJdCdzIG1pbmUsIGFsbCBtaW5lISAgTXVoYWhhaGFoYSEgKi8KKwkJaWYgKGxvZ19mZCA8IDApIHsKKwkJCWlmICghbG9nX2NvbnNvbGUpIHsKKwkJCQlsb2dfZmQgPSBTVERFUlJfRklMRU5POworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZmQgPSBkZXZpY2Vfb3Blbihsb2dfY29uc29sZSwgT19XUk9OTFkgfCBPX05PTkJMT0NLIHwgT19OT0NUVFkpOworCQkJCWlmIChsb2dfZmQgPCAwKSB7CisJCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgbG9nIHRvICVzIiwgbG9nX2NvbnNvbGUpOworCQkJCQl3aGVyZSA9IExfQ09OU09MRTsKKwkJCQl9IGVsc2UgeworCQkJCQljbG9zZV9vbl9leGVjX29uKGxvZ19mZCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICh3aGVyZSAmIExfTE9HKSB7CisJCQlmdWxsX3dyaXRlKGxvZ19mZCwgbXNnLCBsKTsKKwkJCWlmIChsb2dfZmQgPT0gU1RERVJSX0ZJTEVOTykKKwkJCQlyZXR1cm47IC8qIGRvbid0IHByaW50IGR1cCBtZXNzYWdlcyAqLworCQl9CisJfQorI2VuZGlmCisKKwlpZiAod2hlcmUgJiBMX0NPTlNPTEUpIHsKKwkJLyogU2VuZCBjb25zb2xlIG1lc3NhZ2VzIHRvIGNvbnNvbGUgc28gcGVvcGxlIHdpbGwgc2VlIHRoZW0uICovCisJCWZ1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgbXNnLCBsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnNvbGVfaW5pdCh2b2lkKQoreworI2lmZGVmIFZUX09QRU5RUlkKKwlpbnQgdnRubzsKKyNlbmRpZgorCWNoYXIgKnM7CisKKwlzID0gZ2V0ZW52KCJDT05TT0xFIik7CisJaWYgKCFzKQorCQlzID0gZ2V0ZW52KCJjb25zb2xlIik7CisJaWYgKHMpIHsKKwkJaW50IGZkID0gb3BlbihzLCBPX1JEV1IgfCBPX05PTkJMT0NLIHwgT19OT0NUVFkpOworCQlpZiAoZmQgPj0gMCkgeworCQkJZHVwMihmZCwgU1RESU5fRklMRU5PKTsKKwkJCWR1cDIoZmQsIFNURE9VVF9GSUxFTk8pOworCQkJeG1vdmVfZmQoZmQsIFNUREVSUl9GSUxFTk8pOworCQl9CisJCWRiZ19tZXNzYWdlKExfTE9HLCAiY29uc29sZT0nJXMnIiwgcyk7CisJfSBlbHNlIHsKKwkJLyogTWFrZSBzdXJlIGZkIDAsMSwyIGFyZSBub3QgY2xvc2VkCisJCSAqIChzbyB0aGF0IHRoZXkgd29uJ3QgYmUgdXNlZCBieSBmdXR1cmUgb3BlbnMpICovCisJCWJiX3Nhbml0aXplX3N0ZGlvKCk7CisvLyBVc2VycyByZXBvcnQgcHJvYmxlbXMKKy8vCQkvKiBNYWtlIHN1cmUgaW5pdCBjYW4ndCBiZSBibG9ja2VkIGJ5IHdyaXRpbmcgdG8gc3RkZXJyICovCisvLwkJZmNudGwoU1RERVJSX0ZJTEVOTywgRl9TRVRGTCwgZmNudGwoU1RERVJSX0ZJTEVOTywgRl9HRVRGTCkgfCBPX05PTkJMT0NLKTsKKwl9CisKKwlzID0gZ2V0ZW52KCJURVJNIik7CisjaWZkZWYgVlRfT1BFTlFSWQorCWlmIChpb2N0bChTVERJTl9GSUxFTk8sIFZUX09QRU5RUlksICZ2dG5vKSAhPSAwKSB7CisJCS8qIE5vdCBhIGxpbnV4IHRlcm1pbmFsLCBwcm9iYWJseSBzZXJpYWwgY29uc29sZS4KKwkJICogRm9yY2UgdGhlIFRFUk0gc2V0dGluZyB0byB2dDEwMgorCQkgKiBpZiBURVJNIGlzIHNldCB0byBsaW51eCAodGhlIGRlZmF1bHQpICovCisJCWlmICghcyB8fCBzdHJjbXAocywgImxpbnV4IikgPT0gMCkKKwkJCXB1dGVudigoY2hhciopIlRFUk09dnQxMDIiKTsKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9JTklUX1NZU0xPRykKKwkJCWxvZ19jb25zb2xlID0gTlVMTDsKKwl9IGVsc2UKKyNlbmRpZgorCWlmICghcykKKwkJcHV0ZW52KChjaGFyKikiVEVSTT0iIENPTkZJR19JTklUX1RFUk1JTkFMX1RZUEUpOworfQorCisvKiBTZXQgdGVybWluYWwgc2V0dGluZ3MgdG8gcmVhc29uYWJsZSBkZWZhdWx0cy4KKyAqIE5COiBjYXJlZnVsLCB3ZSBjYW4gYmUgY2FsbGVkIGFmdGVyIHZmb3JrISAqLworc3RhdGljIHZvaWQgc2V0X3NhbmVfdGVybSh2b2lkKQoreworCXN0cnVjdCB0ZXJtaW9zIHR0eTsKKworCXRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZ0dHkpOworCisJLyogc2V0IGNvbnRyb2wgY2hhcnMgKi8KKwl0dHkuY19jY1tWSU5UUl0gPSAzOwkvKiBDLWMgKi8KKwl0dHkuY19jY1tWUVVJVF0gPSAyODsJLyogQy1cICovCisJdHR5LmNfY2NbVkVSQVNFXSA9IDEyNzsJLyogQy0/ICovCisJdHR5LmNfY2NbVktJTExdID0gMjE7CS8qIEMtdSAqLworCXR0eS5jX2NjW1ZFT0ZdID0gNDsJLyogQy1kICovCisJdHR5LmNfY2NbVlNUQVJUXSA9IDE3OwkvKiBDLXEgKi8KKwl0dHkuY19jY1tWU1RPUF0gPSAxOTsJLyogQy1zICovCisJdHR5LmNfY2NbVlNVU1BdID0gMjY7CS8qIEMteiAqLworCisjaWZkZWYgX19saW51eF9fCisJLyogdXNlIGxpbmUgZGlzY2lwbGluZSAwICovCisJdHR5LmNfbGluZSA9IDA7CisjZW5kaWYKKworCS8qIE1ha2UgaXQgYmUgc2FuZSAqLworI2lmbmRlZiBDUlRTQ1RTCisjIGRlZmluZSBDUlRTQ1RTIDAKKyNlbmRpZgorCS8qIGFkZGVkIENSVFNDVFMgdG8gZml4IERlYmlhbiBidWcgNTI4NTYwICovCisJdHR5LmNfY2ZsYWcgJj0gQ0JBVUQgfCBDQkFVREVYIHwgQ1NJWkUgfCBDU1RPUEIgfCBQQVJFTkIgfCBQQVJPREQgfCBDUlRTQ1RTOworCXR0eS5jX2NmbGFnIHw9IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisKKwkvKiBpbnB1dCBtb2RlcyAqLworCXR0eS5jX2lmbGFnID0gSUNSTkwgfCBJWE9OIHwgSVhPRkY7CisKKwkvKiBvdXRwdXQgbW9kZXMgKi8KKwl0dHkuY19vZmxhZyA9IE9QT1NUIHwgT05MQ1I7CisKKwkvKiBsb2NhbCBtb2RlcyAqLworCXR0eS5jX2xmbGFnID0gSVNJRyB8IElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwgRUNIT0NUTCB8IEVDSE9LRSB8IElFWFRFTjsKKworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0dHkpOworfQorCisvKiBPcGVuIHRoZSBuZXcgdGVybWluYWwgZGV2aWNlLgorICogTkI6IGNhcmVmdWwsIHdlIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdmZvcmshICovCitzdGF0aWMgaW50IG9wZW5fc3RkaW9fdG9fdHR5KGNvbnN0IGNoYXIqIHR0eV9uYW1lKQoreworCS8qIGVtcHR5IHR0eV9uYW1lIG1lYW5zICJ1c2UgaW5pdCdzIHR0eSIsIGVsc2UuLi4gKi8KKwlpZiAodHR5X25hbWVbMF0pIHsKKwkJaW50IGZkOworCisJCWNsb3NlKFNURElOX0ZJTEVOTyk7CisJCS8qIGZkIGNhbiBiZSBvbmx5IDwgMCBvciAwOiAqLworCQlmZCA9IGRldmljZV9vcGVuKHR0eV9uYW1lLCBPX1JEV1IpOworCQlpZiAoZmQpIHsKKwkJCW1lc3NhZ2UoTF9MT0cgfCBMX0NPTlNPTEUsICJjYW4ndCBvcGVuICVzOiAlcyIsCisJCQkJdHR5X25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gMDsgLyogZmFpbHVyZSAqLworCQl9CisJCWR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwkJZHVwMihTVERJTl9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCX0KKwlzZXRfc2FuZV90ZXJtKCk7CisJcmV0dXJuIDE7IC8qIHN1Y2Nlc3MgKi8KK30KKworc3RhdGljIHZvaWQgcmVzZXRfc2lnaGFuZGxlcnNfYW5kX3VuYmxvY2tfc2lncyh2b2lkKQoreworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR1VTUjEpCisJCSsgKDEgPDwgU0lHVVNSMikKKwkJKyAoMSA8PCBTSUdURVJNKQorCQkrICgxIDw8IFNJR1FVSVQpCisJCSsgKDEgPDwgU0lHSU5UKQorCQkrICgxIDw8IFNJR0hVUCkKKwkJKyAoMSA8PCBTSUdUU1RQKQorCQkrICgxIDw8IFNJR1NUT1ApCisJCSwgU0lHX0RGTCk7CisJc2lncHJvY21hc2tfYWxsc2lncyhTSUdfVU5CTE9DSyk7Cit9CisKKy8qIFdyYXBwZXIgYXJvdW5kIGV4ZWM6CisgKiBUYWtlcyBzdHJpbmcgKG1heCBDT01NQU5EX1NJWkUgY2hhcnMpLgorICogSWYgY2hhcnMgbGlrZSAnPicgZGV0ZWN0ZWQsIGV4ZWNzICdbLV0vYmluL3NoIC1jICJleGVjIC4uLi4uLi4iJy4KKyAqIE90aGVyd2lzZSBzcGxpdHMgd29yZHMgb24gd2hpdGVzcGFjZSwgZGVhbHMgd2l0aCBsZWFkaW5nIGRhc2gsCisgKiBhbmQgdXNlcyBwbGFpbiBleGVjKCkuCisgKiBOQjogY2FyZWZ1bCwgd2UgY2FuIGJlIGNhbGxlZCBhZnRlciB2Zm9yayEKKyAqLworc3RhdGljIHZvaWQgaW5pdF9leGVjKGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJY2hhciAqY21kW0NPTU1BTkRfU0laRSAvIDJdOworCWNoYXIgYnVmW0NPTU1BTkRfU0laRSArIDZdOyAgLyogQ09NTUFORF9TSVpFK3N0cmxlbigiZXhlYyAiKSsxICovCisJaW50IGRhc2ggPSAoY29tbWFuZFswXSA9PSAnLScgLyogbWF5YmU/ICYmIGNvbW1hbmRbMV0gPT0gJy8nICovKTsKKworCWNvbW1hbmQgKz0gZGFzaDsKKworCS8qIFNlZSBpZiBhbnkgc3BlY2lhbCAvYmluL3NoIHJlcXVpcmluZyBjaGFyYWN0ZXJzIGFyZSBwcmVzZW50ICovCisJaWYgKHN0cnBicmsoY29tbWFuZCwgIn5gISReJiooKT18XFx7fVtdO1wiJzw+PyIpICE9IE5VTEwpIHsKKwkJc3ByaW50ZihidWYsICJleGVjICVzIiwgY29tbWFuZCk7IC8qIGV4Y2x1ZGluZyAiLSIgKi8KKwkJLyogTkI6IExJQkJCX0RFRkFVTFRfTE9HSU5fU0hFTEwgZGVmaW5lIGhhcyBsZWFkaW5nIGRhc2ggKi8KKwkJY21kWzBdID0gKGNoYXIqKShMSUJCQl9ERUZBVUxUX0xPR0lOX1NIRUxMICsgIWRhc2gpOworCQljbWRbMV0gPSAoY2hhciopIi1jIjsKKwkJY21kWzJdID0gYnVmOworCQljbWRbM10gPSBOVUxMOworCQljb21tYW5kID0gTElCQkJfREVGQVVMVF9MT0dJTl9TSEVMTCArIDE7CisJfSBlbHNlIHsKKwkJLyogQ29udmVydCBjb21tYW5kIChjaGFyKikgaW50byBjbWQgKGNoYXIqKiwgb25lIHdvcmQgcGVyIHN0cmluZykgKi8KKwkJY2hhciAqd29yZCwgKm5leHQ7CisJCWludCBpID0gMDsKKwkJbmV4dCA9IHN0cmNweShidWYsIGNvbW1hbmQgLSBkYXNoKTsgLyogY29tbWFuZCBpbmNsdWRpbmcgIi0iICovCisJCWNvbW1hbmQgPSBuZXh0ICsgZGFzaDsKKwkJd2hpbGUgKCh3b3JkID0gc3Ryc2VwKCZuZXh0LCAiIFx0IikpICE9IE5VTEwpIHsKKwkJCWlmICgqd29yZCAhPSAnXDAnKSB7IC8qIG5vdCB0d28gc3BhY2VzL3RhYnMgdG9nZXRoZXI/ICovCisJCQkJY21kW2ldID0gd29yZDsKKwkJCQlpKys7CisJCQl9CisJCX0KKwkJY21kW2ldID0gTlVMTDsKKwl9CisJLyogSWYgd2Ugc2F3IGxlYWRpbmcgIi0iLCBpdCBpcyBpbnRlcmFjdGl2ZSBzaGVsbC4KKwkgKiBUcnkgaGFyZGVyIHRvIGdpdmUgaXQgYSBjb250cm9sbGluZyB0dHkuCisJICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0lOSVRfU0NUVFkgJiYgZGFzaCkgeworCQkvKiBfQXR0ZW1wdF8gdG8gbWFrZSBzdGRpbiBhIGNvbnRyb2xsaW5nIHR0eS4gKi8KKwkJaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DU0NUVFksIDAgLypvbmx5IHRyeSwgZG9uJ3Qgc3RlYWwqLyk7CisJfQorCS8qIEhlcmUgY29tbWFuZCBuZXZlciBjb250YWlucyB0aGUgZGFzaCwgY21kWzBdIG1pZ2h0ICovCisJQkJfRVhFQ1ZQKGNvbW1hbmQsIGNtZCk7CisJbWVzc2FnZShMX0xPRyB8IExfQ09OU09MRSwgImNhbid0IHJ1biAnJXMnOiAlcyIsIGNvbW1hbmQsIHN0cmVycm9yKGVycm5vKSk7CisJLyogcmV0dXJucyBpZiBleGVjdnAgZmFpbHMgKi8KK30KKworLyogVXNlZCBvbmx5IGJ5IHJ1bl9hY3Rpb25zICovCitzdGF0aWMgcGlkX3QgcnVuKGNvbnN0IHN0cnVjdCBpbml0X2FjdGlvbiAqYSkKK3sKKwlwaWRfdCBwaWQ7CisKKwkvKiBDYXJlZnVsOiBkb24ndCBiZSBhZmZlY3RlZCBieSBhIHNpZ25hbCBpbiB2Zm9ya2VkIGNoaWxkICovCisJc2lncHJvY21hc2tfYWxsc2lncyhTSUdfQkxPQ0spOworCWlmIChCQl9NTVUgJiYgKGEtPmFjdGlvbl90eXBlICYgQVNLRklSU1QpKQorCQlwaWQgPSBmb3JrKCk7CisJZWxzZQorCQlwaWQgPSB2Zm9yaygpOworCWlmIChwaWQgPCAwKQorCQltZXNzYWdlKExfTE9HIHwgTF9DT05TT0xFLCAiY2FuJ3QgZm9yayIpOworCWlmIChwaWQpIHsKKwkJc2lncHJvY21hc2tfYWxsc2lncyhTSUdfVU5CTE9DSyk7CisJCXJldHVybiBwaWQ7IC8qIFBhcmVudCBvciBlcnJvciAqLworCX0KKworCS8qIENoaWxkICovCisKKwkvKiBSZXNldCBzaWduYWwgaGFuZGxlcnMgdGhhdCB3ZXJlIHNldCBieSB0aGUgcGFyZW50IHByb2Nlc3MgKi8KKwlyZXNldF9zaWdoYW5kbGVyc19hbmRfdW5ibG9ja19zaWdzKCk7CisKKwkvKiBDcmVhdGUgYSBuZXcgc2Vzc2lvbiBhbmQgbWFrZSBvdXJzZWxmIHRoZSBwcm9jZXNzIGdyb3VwIGxlYWRlciAqLworCXNldHNpZCgpOworCisJLyogT3BlbiB0aGUgbmV3IHRlcm1pbmFsIGRldmljZSAqLworCWlmICghb3Blbl9zdGRpb190b190dHkoYS0+dGVybWluYWwpKQorCQlfZXhpdChFWElUX0ZBSUxVUkUpOworCisJLyogTkI6IG9uIE5PTU1VIHdlIGNhbid0IHdhaXQgZm9yIGlucHV0IGluIGNoaWxkLCBzbworCSAqICJhc2tmaXJzdCIgd2lsbCB3b3JrIHRoZSBzYW1lIGFzICJyZXNwYXduIi4gKi8KKwlpZiAoQkJfTU1VICYmIChhLT5hY3Rpb25fdHlwZSAmIEFTS0ZJUlNUKSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBwcmVzc19lbnRlcltdIEFMSUdOMSA9CisjaWZkZWYgQ1VTVE9NSVpFRF9CQU5ORVIKKyNpbmNsdWRlIENVU1RPTUlaRURfQkFOTkVSCisjZW5kaWYKKwkJCSJcblBsZWFzZSBwcmVzcyBFbnRlciB0byBhY3RpdmF0ZSB0aGlzIGNvbnNvbGUuICI7CisJCWNoYXIgYzsKKwkJLyoKKwkJICogU2F2ZSBtZW1vcnkgYnkgbm90IGV4ZWMtaW5nIGFueXRoaW5nIGxhcmdlIChsaWtlIGEgc2hlbGwpCisJCSAqIGJlZm9yZSB0aGUgdXNlciB3YW50cyBpdC4gVGhpcyBpcyBjcml0aWNhbCBpZiBzd2FwIGlzIG5vdAorCQkgKiBlbmFibGVkIGFuZCB0aGUgc3lzdGVtIGhhcyBsb3cgbWVtb3J5LiBHZW5lcmFsbHkgdGhpcyB3aWxsCisJCSAqIGJlIHJ1biBvbiB0aGUgc2Vjb25kIHZpcnR1YWwgY29uc29sZSwgYW5kIHRoZSBmaXJzdCB3aWxsCisJCSAqIGJlIGFsbG93ZWQgdG8gc3RhcnQgYSBzaGVsbCBvciB3aGF0ZXZlciBhbiBpbml0IHNjcmlwdAorCQkgKiBzcGVjaWZpZXMuCisJCSAqLworCQlkYmdfbWVzc2FnZShMX0xPRywgIndhaXRpbmcgZm9yIGVudGVyIHRvIHN0YXJ0ICclcyciCisJCQkJCSIocGlkICVkLCB0dHkgJyVzJylcbiIsCisJCQkJYS0+Y29tbWFuZCwgZ2V0cGlkKCksIGEtPnRlcm1pbmFsKTsKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBwcmVzc19lbnRlciwgc2l6ZW9mKHByZXNzX2VudGVyKSAtIDEpOworCQl3aGlsZSAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpID09IDEgJiYgYyAhPSAnXG4nKQorCQkJY29udGludWU7CisJfQorCisJLyoKKwkgKiBXaGVuIGEgZmlsZSBuYW1lZCAvLmluaXRfZW5hYmxlX2NvcmUgZXhpc3RzLCBzZXRybGltaXQgaXMgY2FsbGVkCisJICogYmVmb3JlIHByb2Nlc3NlcyBhcmUgc3Bhd25lZCB0byBzZXQgY29yZSBmaWxlIHNpemUgYXMgdW5saW1pdGVkLgorCSAqIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBvbmx5LiAgRG9uJ3QgdXNlIHRoaXMgaXMgcHJvZHVjdGlvbiwgdW5sZXNzCisJICogeW91IHdhbnQgY29yZSBkdW1wcyBseWluZyBhYm91dC4uLi4KKwkgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFMpIHsKKwkJaWYgKGFjY2VzcygiLy5pbml0X2VuYWJsZV9jb3JlIiwgRl9PSykgPT0gMCkgeworCQkJc3RydWN0IHJsaW1pdCBsaW1pdDsKKwkJCWxpbWl0LnJsaW1fY3VyID0gUkxJTV9JTkZJTklUWTsKKwkJCWxpbWl0LnJsaW1fbWF4ID0gUkxJTV9JTkZJTklUWTsKKwkJCXNldHJsaW1pdChSTElNSVRfQ09SRSwgJmxpbWl0KTsKKwkJfQorCX0KKworCS8qIExvZyB0aGUgcHJvY2VzcyBuYW1lIGFuZCBhcmdzICovCisJbWVzc2FnZShMX0xPRywgInN0YXJ0aW5nIHBpZCAlZCwgdHR5ICclcyc6ICclcyciLAorCQkJICBnZXRwaWQoKSwgYS0+dGVybWluYWwsIGEtPmNvbW1hbmQpOworCisJLyogTm93IHJ1biBpdC4gIFRoZSBuZXcgcHJvZ3JhbSB3aWxsIHRha2Ugb3ZlciB0aGlzIFBJRCwKKwkgKiBzbyBub3RoaW5nIGZ1cnRoZXIgaW4gaW5pdC5jIHNob3VsZCBiZSBydW4uICovCisJaW5pdF9leGVjKGEtPmNvbW1hbmQpOworCS8qIFdlJ3JlIHN0aWxsIGhlcmU/ICBTb21lIGVycm9yIGhhcHBlbmVkLiAqLworCV9leGl0KC0xKTsKK30KKworc3RhdGljIHN0cnVjdCBpbml0X2FjdGlvbiAqbWFya190ZXJtaW5hdGVkKHBpZF90IHBpZCkKK3sKKwlzdHJ1Y3QgaW5pdF9hY3Rpb24gKmE7CisKKwlpZiAocGlkID4gMCkgeworCQlmb3IgKGEgPSBpbml0X2FjdGlvbl9saXN0OyBhOyBhID0gYS0+bmV4dCkgeworCQkJaWYgKGEtPnBpZCA9PSBwaWQpIHsKKwkJCQlhLT5waWQgPSAwOworCQkJCXJldHVybiBhOworCQkJfQorCQl9CisJCXVwZGF0ZV91dG1wKHBpZCwgREVBRF9QUk9DRVNTLCAvKnR0eV9uYW1lOiovIE5VTEwsCisJCQkJLyp1c2VybmFtZToqLyBOVUxMLAorCQkJCS8qaG9zdG5hbWU6Ki8gTlVMTCk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB3YWl0Zm9yKHBpZF90IHBpZCkKK3sKKwkvKiB3YWl0Zm9yKHJ1bih4KSk6IHByb3RlY3QgYWdhaW5zdCBmYWlsZWQgZm9yayBpbnNpZGUgcnVuKCkgKi8KKwlpZiAocGlkIDw9IDApCisJCXJldHVybjsKKworCS8qIFdhaXQgZm9yIGFueSBjaGlsZCAocHJldmVudCB6b21iaWVzIGZyb20gZXhpdGluZyBvcnBoYW5lZCBwcm9jZXNzZXMpCisJICogYnV0IGV4aXQgdGhlIGxvb3Agb25seSB3aGVuIHNwZWNpZmllZCBvbmUgaGFzIGV4aXRlZC4gKi8KKwl3aGlsZSAoMSkgeworCQlwaWRfdCB3cGlkID0gd2FpdChOVUxMKTsKKwkJbWFya190ZXJtaW5hdGVkKHdwaWQpOworCQkvKiBVbnNhZmUuIFNJR1RTVFAgaGFuZGxlciBtaWdodCBoYXZlIHdhaXQnZWQgaXQgYWxyZWFkeSAqLworCQkvKmlmICh3cGlkID09IHBpZCkgYnJlYWs7Ki8KKwkJLyogTW9yZSByZWxpYWJsZTogKi8KKwkJaWYgKGtpbGwocGlkLCAwKSkKKwkJCWJyZWFrOworCX0KK30KKworLyogUnVuIGFsbCBjb21tYW5kcyBvZiBhIHBhcnRpY3VsYXIgdHlwZSAqLworc3RhdGljIHZvaWQgcnVuX2FjdGlvbnMoaW50IGFjdGlvbl90eXBlKQoreworCXN0cnVjdCBpbml0X2FjdGlvbiAqYTsKKworCWZvciAoYSA9IGluaXRfYWN0aW9uX2xpc3Q7IGE7IGEgPSBhLT5uZXh0KSB7CisJCWlmICghKGEtPmFjdGlvbl90eXBlICYgYWN0aW9uX3R5cGUpKQorCQkJY29udGludWU7CisKKwkJaWYgKGEtPmFjdGlvbl90eXBlICYgKFNZU0lOSVQgfCBXQUlUIHwgT05DRSB8IENUUkxBTFRERUwgfCBTSFVURE9XTikpIHsKKwkJCXBpZF90IHBpZCA9IHJ1bihhKTsKKwkJCWlmIChhLT5hY3Rpb25fdHlwZSAmIChTWVNJTklUIHwgV0FJVCB8IENUUkxBTFRERUwgfCBTSFVURE9XTikpCisJCQkJd2FpdGZvcihwaWQpOworCQl9CisJCWlmIChhLT5hY3Rpb25fdHlwZSAmIChSRVNQQVdOIHwgQVNLRklSU1QpKSB7CisJCQkvKiBPbmx5IHJ1biBzdHVmZiB3aXRoIHBpZCA9PSAwLiBJZiBwaWQgIT0gMCwKKwkJCSAqIGl0IGlzIGFscmVhZHkgcnVubmluZworCQkJICovCisJCQlpZiAoYS0+cGlkID09IDApCisJCQkJYS0+cGlkID0gcnVuKGEpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBuZXdfaW5pdF9hY3Rpb24odWludDhfdCBhY3Rpb25fdHlwZSwgY29uc3QgY2hhciAqY29tbWFuZCwgY29uc3QgY2hhciAqY29ucykKK3sKKwlzdHJ1Y3QgaW5pdF9hY3Rpb24gKmEsICoqbmV4dHA7CisKKwkvKiBTY2VuYXJpbzoKKwkgKiBvbGQgaW5pdHRhYjoKKwkgKiA6OnNodXRkb3duOnVtb3VudCAtYSAtcgorCSAqIDo6c2h1dGRvd246c3dhcG9mZiAtYQorCSAqIG5ldyBpbml0dGFiOgorCSAqIDo6c2h1dGRvd246c3dhcG9mZiAtYQorCSAqIDo6c2h1dGRvd246dW1vdW50IC1hIC1yCisJICogT24gcmVsb2FkLCB3ZSBtdXN0IGVuc3VyZSBlbnRyaWVzIGVuZCB1cCBpbiBjb3JyZWN0IG9yZGVyLgorCSAqIFRvIGFjaGlldmUgdGhhdCwgaWYgd2UgZmluZCBhIG1hdGNoaW5nIGVudHJ5LCB3ZSBtb3ZlIGl0CisJICogdG8gdGhlIGVuZC4KKwkgKi8KKwluZXh0cCA9ICZpbml0X2FjdGlvbl9saXN0OworCXdoaWxlICgoYSA9ICpuZXh0cCkgIT0gTlVMTCkgeworCQkvKiBEb24ndCBlbnRlciBhY3Rpb24gaWYgaXQncyBhbHJlYWR5IGluIHRoZSBsaXN0LAorCQkgKiBUaGlzIHByZXZlbnRzIGxvc2luZyBydW5uaW5nIFJFU1BBV05zLgorCQkgKi8KKwkJaWYgKHN0cmNtcChhLT5jb21tYW5kLCBjb21tYW5kKSA9PSAwCisJCSAmJiBzdHJjbXAoYS0+dGVybWluYWwsIGNvbnMpID09IDAKKwkJKSB7CisJCQkvKiBSZW1vdmUgZnJvbSBsaXN0ICovCisJCQkqbmV4dHAgPSBhLT5uZXh0OworCQkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisJCQl3aGlsZSAoKm5leHRwICE9IE5VTEwpCisJCQkJbmV4dHAgPSAmKCpuZXh0cCktPm5leHQ7CisJCQlhLT5uZXh0ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCW5leHRwID0gJmEtPm5leHQ7CisJfQorCisJaWYgKCFhKQorCQlhID0geHphbGxvYyhzaXplb2YoKmEpKTsKKwkvKiBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAqLworCSpuZXh0cCA9IGE7CisJYS0+YWN0aW9uX3R5cGUgPSBhY3Rpb25fdHlwZTsKKwlzYWZlX3N0cm5jcHkoYS0+Y29tbWFuZCwgY29tbWFuZCwgc2l6ZW9mKGEtPmNvbW1hbmQpKTsKKwlzYWZlX3N0cm5jcHkoYS0+dGVybWluYWwsIGNvbnMsIHNpemVvZihhLT50ZXJtaW5hbCkpOworCWRiZ19tZXNzYWdlKExfTE9HIHwgTF9DT05TT0xFLCAiY29tbWFuZD0nJXMnIGFjdGlvbj0lZCB0dHk9JyVzJ1xuIiwKKwkJYS0+Y29tbWFuZCwgYS0+YWN0aW9uX3R5cGUsIGEtPnRlcm1pbmFsKTsKK30KKworLyogTk9URSB0aGF0IGlmIENPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCIGlzIE5PVCBkZWZpbmVkLAorICogdGhlbiBwYXJzZV9pbml0dGFiKCkgc2ltcGx5IGFkZHMgaW4gc29tZSBkZWZhdWx0CisgKiBhY3Rpb25zKGkuZS4sIHJ1bnMgSU5JVF9TQ1JJUFQgYW5kIHRoZW4gc3RhcnRzIGEgcGFpcgorICogb2YgImFza2ZpcnN0IiBzaGVsbHMpLiAgSWYgQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUIKKyAqIF9pc18gZGVmaW5lZCwgYnV0IC9ldGMvaW5pdHRhYiBpcyBtaXNzaW5nLCB0aGlzCisgKiByZXN1bHRzIGluIHRoZSBzYW1lIHNldCBvZiBkZWZhdWx0IGJlaGF2aW9ycy4KKyAqLworc3RhdGljIHZvaWQgcGFyc2VfaW5pdHRhYih2b2lkKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9JTklUVEFCCisJY2hhciAqdG9rZW5bNF07CisJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuMigiL2V0Yy9pbml0dGFiIiwgZm9wZW5fZm9yX3JlYWQpOworCisJaWYgKHBhcnNlciA9PSBOVUxMKQorI2VuZGlmCisJeworCQkvKiBObyBpbml0dGFiIGZpbGUgLSBzZXQgdXAgc29tZSBkZWZhdWx0IGJlaGF2aW9yICovCisJCS8qIFJlYm9vdCBvbiBDdHJsLUFsdC1EZWwgKi8KKwkJbmV3X2luaXRfYWN0aW9uKENUUkxBTFRERUwsICJyZWJvb3QiLCAiIik7CisJCS8qIFVtb3VudCBhbGwgZmlsZXN5c3RlbXMgb24gaGFsdC9yZWJvb3QgKi8KKwkJbmV3X2luaXRfYWN0aW9uKFNIVVRET1dOLCAidW1vdW50IC1hIC1yIiwgIiIpOworCQkvKiBTd2Fwb2ZmIG9uIGhhbHQvcmVib290ICovCisJCWlmIChFTkFCTEVfU1dBUE9OT0ZGKQorCQkJbmV3X2luaXRfYWN0aW9uKFNIVVRET1dOLCAic3dhcG9mZiAtYSIsICIiKTsKKwkJLyogUHJlcGFyZSB0byByZXN0YXJ0IGluaXQgd2hlbiBhIFFVSVQgaXMgcmVjZWl2ZWQgKi8KKwkJbmV3X2luaXRfYWN0aW9uKFJFU1RBUlQsICJpbml0IiwgIiIpOworCQkvKiBBc2tmaXJzdCBzaGVsbCBvbiB0dHkxLTQgKi8KKwkJbmV3X2luaXRfYWN0aW9uKEFTS0ZJUlNULCBiYl9kZWZhdWx0X2xvZ2luX3NoZWxsLCAiIik7CisvL1RPRE86IFZDXzEgaW5zdGVhZCBvZiAiIj8gIiIgaXMgY29uc29sZSAtPiBjdHR5IHByb2JsZW1zIC0+IGFuZ3J5IHVzZXJzCisJCW5ld19pbml0X2FjdGlvbihBU0tGSVJTVCwgYmJfZGVmYXVsdF9sb2dpbl9zaGVsbCwgVkNfMik7CisJCW5ld19pbml0X2FjdGlvbihBU0tGSVJTVCwgYmJfZGVmYXVsdF9sb2dpbl9zaGVsbCwgVkNfMyk7CisJCW5ld19pbml0X2FjdGlvbihBU0tGSVJTVCwgYmJfZGVmYXVsdF9sb2dpbl9zaGVsbCwgVkNfNCk7CisJCS8qIHN5c2luaXQgKi8KKwkJbmV3X2luaXRfYWN0aW9uKFNZU0lOSVQsIElOSVRfU0NSSVBULCAiIik7CisJCXJldHVybjsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfSU5JVFRBQgorCS8qIG9wdGlvbmFsX3R0eTppZ25vcmVkX3J1bmxldmVsOmFjdGlvbjpjb21tYW5kCisJICogRGVsaW1zIGFyZSBub3QgdG8gYmUgY29sbGFwc2VkIGFuZCBuZWVkIGV4YWN0bHkgNCB0b2tlbnMKKwkgKi8KKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgNCwgMCwgIiM6IiwKKwkJCQlQQVJTRV9OT1JNQUwgJiB+KFBBUlNFX1RSSU0gfCBQQVJTRV9DT0xMQVBTRSkpKSB7CisJCS8qIG9yZGVyIG11c3QgY29ycmVzcG9uZCB0byBTWVNJTklULi5SRVNUQVJUIGNvbnN0YW50cyAqLworCQlzdGF0aWMgY29uc3QgY2hhciBhY3Rpb25zW10gQUxJR04xID0KKwkJCSJzeXNpbml0XDAiIndhaXRcMCIib25jZVwwIiJyZXNwYXduXDAiImFza2ZpcnN0XDAiCisJCQkiY3RybGFsdGRlbFwwIiJzaHV0ZG93blwwIiJyZXN0YXJ0XDAiOworCQlpbnQgYWN0aW9uOworCQljaGFyICp0dHkgPSB0b2tlblswXTsKKworCQlpZiAoIXRva2VuWzNdKSAvKiBsZXNzIHRoYW4gNCB0b2tlbnMgKi8KKwkJCWdvdG8gYmFkX2VudHJ5OworCQlhY3Rpb24gPSBpbmRleF9pbl9zdHJpbmdzKGFjdGlvbnMsIHRva2VuWzJdKTsKKwkJaWYgKGFjdGlvbiA8IDAgfHwgIXRva2VuWzNdWzBdKSAvKiB0b2tlblszXTogY29tbWFuZCAqLworCQkJZ290byBiYWRfZW50cnk7CisJCS8qIHR1cm4gLipUVFkgLT4gL2Rldi9UVFkgKi8KKwkJaWYgKHR0eVswXSkgeworCQkJdHR5ID0gY29uY2F0X3BhdGhfZmlsZSgiL2Rldi8iLCBza2lwX2Rldl9wZngodHR5KSk7CisJCX0KKwkJbmV3X2luaXRfYWN0aW9uKDEgPDwgYWN0aW9uLCB0b2tlblszXSwgdHR5KTsKKwkJaWYgKHR0eVswXSkKKwkJCWZyZWUodHR5KTsKKwkJY29udGludWU7CisgYmFkX2VudHJ5OgorCQltZXNzYWdlKExfTE9HIHwgTF9DT05TT0xFLCAiQmFkIGluaXR0YWIgZW50cnkgYXQgbGluZSAlZCIsCisJCQkJcGFyc2VyLT5saW5lbm8pOworCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwYXVzZV9hbmRfbG93X2xldmVsX3JlYm9vdCh1bnNpZ25lZCBtYWdpYykgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBwYXVzZV9hbmRfbG93X2xldmVsX3JlYm9vdCh1bnNpZ25lZCBtYWdpYykKK3sKKwlwaWRfdCBwaWQ7CisKKwkvKiBBbGxvdyB0aW1lIGZvciBsYXN0IG1lc3NhZ2UgdG8gcmVhY2ggc2VyaWFsIGNvbnNvbGUsIGV0YyAqLworCXNsZWVwKDEpOworCisJLyogV2UgaGF2ZSB0byBmb3JrIGhlcmUsIHNpbmNlIHRoZSBrZXJuZWwgY2FsbHMgZG9fZXhpdChFWElUX1NVQ0NFU1MpCisJICogaW4gbGludXgva2VybmVsL3N5cy5jLCB3aGljaCBjYW4gY2F1c2UgdGhlIG1hY2hpbmUgdG8gcGFuaWMgd2hlbgorCSAqIHRoZSBpbml0IHByb2Nlc3MgZXhpdHMuLi4gKi8KKwlwaWQgPSB2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeyAvKiBjaGlsZCAqLworCQlyZWJvb3QobWFnaWMpOworCQlfZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKwl3aGlsZSAoMSkKKwkJc2xlZXAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9zaHV0ZG93bl9hbmRfa2lsbF9wcm9jZXNzZXModm9pZCkKK3sKKwkvKiBSdW4gZXZlcnl0aGluZyB0byBiZSBydW4gYXQgInNodXRkb3duIi4gIFRoaXMgaXMgZG9uZSBfcHJpb3JfCisJICogdG8ga2lsbGluZyBldmVyeXRoaW5nLCBpbiBjYXNlIHBlb3BsZSB3aXNoIHRvIHVzZSBzY3JpcHRzIHRvCisJICogc2h1dCB0aGluZ3MgZG93biBncmFjZWZ1bGx5Li4uICovCisJcnVuX2FjdGlvbnMoU0hVVERPV04pOworCisJbWVzc2FnZShMX0NPTlNPTEUgfCBMX0xPRywgIlRoZSBzeXN0ZW0gaXMgZ29pbmcgZG93biBOT1chIik7CisKKwkvKiBTZW5kIHNpZ25hbHMgdG8gZXZlcnkgcHJvY2VzcyBfZXhjZXB0XyBwaWQgMSAqLworCWtpbGwoLTEsIFNJR1RFUk0pOworCW1lc3NhZ2UoTF9DT05TT0xFIHwgTF9MT0csICJTZW50IFNJRyVzIHRvIGFsbCBwcm9jZXNzZXMiLCAiVEVSTSIpOworCXN5bmMoKTsKKwlzbGVlcCgxKTsKKworCWtpbGwoLTEsIFNJR0tJTEwpOworCW1lc3NhZ2UoTF9DT05TT0xFLCAiU2VudCBTSUclcyB0byBhbGwgcHJvY2Vzc2VzIiwgIktJTEwiKTsKKwlzeW5jKCk7CisJLypzbGVlcCgxKTsgLSBjYWxsZXJzIHRha2UgY2FyZSBhYm91dCBtYWtpbmcgYSBwYXVzZSAqLworfQorCisvKiBTaWduYWwgaGFuZGxpbmcgYnkgaW5pdDoKKyAqCisgKiBGb3IgcHJvY2VzcyB3aXRoIFBJRD09MSwgb24gZW50cnkga2VybmVsIHNldHMgYWxsIHNpZ25hbHMgdG8gU0lHX0RGTAorICogYW5kIHVubWFza3MgYWxsIHNpZ25hbHMuIEhvd2V2ZXIsIGZvciBwcm9jZXNzIHdpdGggUElEPT0xLAorICogZGVmYXVsdCBhY3Rpb24gKFNJR19ERkwpIG9uIGFueSBzaWduYWwgaXMgdG8gaWdub3JlIGl0LAorICogZXZlbiBmb3Igc3BlY2lhbCBzaWduYWxzIFNJR0tJTEwgYW5kIFNJR0NPTlQuCisgKiBBbHNvLCBhbnkgc2lnbmFsIGNhbiBiZSBjYXVnaHQgb3IgYmxvY2tlZC4KKyAqIChidXQgU0lHU1RPUCBpcyBzdGlsbCBoYW5kbGVkIHNwZWNpYWxseSwgYXQgbGVhc3QgaW4gMi42LjIwKQorICoKKyAqIFdlIGluc3RhbGwgdHdvIGtpbmRzIG9mIGhhbmRsZXJzLCAiaW1tZWRpYXRlIiBhbmQgImRlbGF5ZWQiLgorICoKKyAqIEltbWVkaWF0ZSBoYW5kbGVycyBleGVjdXRlIGF0IGFueSB0aW1lLCBldmVuIHdoaWxlLCBzYXksIHN5c2luaXQKKyAqIGlzIHJ1bm5pbmcuCisgKgorICogRGVsYXllZCBoYW5kbGVycyBqdXN0IHNldCBhIGZsYWcgdmFyaWFibGUuIFRoZSB2YXJpYWJsZSBpcyBjaGVja2VkCisgKiBpbiB0aGUgbWFpbiBsb29wIGFuZCBhY3RlZCB1cG9uLgorICoKKyAqIGhhbHQvcG93ZXJvZmYvcmVib290IGFuZCByZXN0YXJ0IGhhdmUgaW1tZWRpYXRlIGhhbmRsZXJzLgorICogVGhleSBvbmx5IHRyYXZlcnNlIGxpbmtlZCBsaXN0IG9mIHN0cnVjdCBhY3Rpb24ncywgbmV2ZXIgbW9kaWZ5IGl0LAorICogdGhpcyBzaG91bGQgYmUgc2FmZSB0byBkbyBldmVuIGluIHNpZ25hbCBoYW5kbGVyLiBBbHNvIHRoZXkKKyAqIG5ldmVyIHJldHVybi4KKyAqCisgKiBTSUdTVE9QIGFuZCBTSUdUU1RQIGhhdmUgaW1tZWRpYXRlIGhhbmRsZXJzLiBUaGV5IGp1c3Qgd2FpdAorICogZm9yIFNJR0NPTlQgdG8gaGFwcGVuLgorICoKKyAqIFNJR0hVUCBoYXMgYSBkZWxheWVkIGhhbmRsZXIsIGJlY2F1c2UgbW9kaWZ5aW5nIGxpbmtlZCBsaXN0CisgKiBvZiBzdHJ1Y3QgYWN0aW9uJ3MgZnJvbSBhIHNpZ25hbCBoYW5kbGVyIHdoaWxlIGl0IGlzIG1hbmlwdWxhdGVkCisgKiBieSB0aGUgcHJvZ3JhbSBtYXkgYmUgZGlzYXN0cm91cy4KKyAqCisgKiBDdHJsLUFsdC1EZWwgaGFzIGEgZGVsYXllZCBoYW5kbGVyLiBOb3QgYSBtdXN0LCBidXQgYWxsb3dpbmcKKyAqIGl0IHRvIGhhcHBlbiBldmVuIHNvbWV3aGVyZSBpbnNpZGUgInN5c2luaXQiIHdvdWxkIGJlIGEgYml0IGF3a3dhcmQuCisgKgorICogVGhlcmUgaXMgYSB0aW55IHByb2JhYmlsaXR5IHRoYXQgU0lHSFVQIGFuZCBDdHJsLUFsdC1EZWwgd2lsbCBjb2xsaWRlCisgKiBhbmQgb25seSBvbmUgd2lsbCBiZSByZW1lbWJlcmVkIGFuZCBhY3RlZCB1cG9uLgorICovCisKKy8qIFRoZSBTSUdVU1JbMTJdL1NJR1RFUk0gaGFuZGxlciAqLworc3RhdGljIHZvaWQgaGFsdF9yZWJvb3RfcHdvZmYoaW50IHNpZykgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBoYWx0X3JlYm9vdF9wd29mZihpbnQgc2lnKQoreworCWNvbnN0IGNoYXIgKm07CisJdW5zaWduZWQgcmI7CisKKwkvKiBXZSBtYXkgY2FsbCBydW4oKSBhbmQgaXQgdW5tYXNrcyBzaWduYWxzLAorCSAqIGluY2x1ZGluZyB0aGUgb25lIG1hc2tlZCBpbnNpZGUgdGhpcyBzaWduYWwgaGFuZGxlci4KKwkgKiBUZXN0Y2FzZSB3aGljaCB3b3VsZCBzdGFydCBtdWx0aXBsZSByZWJvb3Qgc2NyaXB0czoKKwkgKiAgd2hpbGUgdHJ1ZTsgZG8gcmVib290OyBkb25lCisJICogUHJldmVudGluZyBpdDoKKwkgKi8KKwlyZXNldF9zaWdoYW5kbGVyc19hbmRfdW5ibG9ja19zaWdzKCk7CisKKwlydW5fc2h1dGRvd25fYW5kX2tpbGxfcHJvY2Vzc2VzKCk7CisKKwltID0gImhhbHQiOworCXJiID0gUkJfSEFMVF9TWVNURU07CisJaWYgKHNpZyA9PSBTSUdURVJNKSB7CisJCW0gPSAicmVib290IjsKKwkJcmIgPSBSQl9BVVRPQk9PVDsKKwl9IGVsc2UgaWYgKHNpZyA9PSBTSUdVU1IyKSB7CisJCW0gPSAicG93ZXJvZmYiOworCQlyYiA9IFJCX1BPV0VSX09GRjsKKwl9CisJbWVzc2FnZShMX0NPTlNPTEUsICJSZXF1ZXN0aW5nIHN5c3RlbSAlcyIsIG0pOworCXBhdXNlX2FuZF9sb3dfbGV2ZWxfcmVib290KHJiKTsKKwkvKiBub3QgcmVhY2hlZCAqLworfQorCisvKiBIYW5kbGVyIGZvciBRVUlUIC0gZXhlYyAicmVzdGFydCIgYWN0aW9uLAorICogZWxzZSAobm8gc3VjaCBhY3Rpb24gZGVmaW5lZCkgZG8gbm90aGluZyAqLworc3RhdGljIHZvaWQgcmVzdGFydF9oYW5kbGVyKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBpbml0X2FjdGlvbiAqYTsKKworCWZvciAoYSA9IGluaXRfYWN0aW9uX2xpc3Q7IGE7IGEgPSBhLT5uZXh0KSB7CisJCWlmICghKGEtPmFjdGlvbl90eXBlICYgUkVTVEFSVCkpCisJCQljb250aW51ZTsKKworCQkvKiBTdGFydGluZyBmcm9tIGhlcmUsIHdlIHdvbid0IHJldHVybi4KKwkJICogVGh1cyBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHByZXNlcnZpbmcgZXJybm8KKwkJICogYW5kIHN1Y2guCisJCSAqLworCisJCXJlc2V0X3NpZ2hhbmRsZXJzX2FuZF91bmJsb2NrX3NpZ3MoKTsKKworCQlydW5fc2h1dGRvd25fYW5kX2tpbGxfcHJvY2Vzc2VzKCk7CisKKyNpZmRlZiBSQl9FTkFCTEVfQ0FECisJCS8qIEFsbG93IEN0cmwtQWx0LURlbCB0byByZWJvb3QgdGhlIHN5c3RlbS4KKwkJICogVGhpcyBpcyBob3cga2VybmVsIHNldHMgaXQgdXAgZm9yIGluaXQsIHdlIGZvbGxvdyBzdWl0LgorCQkgKi8KKwkJcmVib290KFJCX0VOQUJMRV9DQUQpOyAvKiBtaXNub21lciAqLworI2VuZGlmCisKKwkJaWYgKG9wZW5fc3RkaW9fdG9fdHR5KGEtPnRlcm1pbmFsKSkgeworCQkJZGJnX21lc3NhZ2UoTF9DT05TT0xFLCAiVHJ5aW5nIHRvIHJlLWV4ZWMgJXMiLCBhLT5jb21tYW5kKTsKKwkJCS8qIFRoZW9yZXRpY2FsbHkgc2hvdWxkIGJlIHNhZmUuCisJCQkgKiBCdXQgaW4gcHJhY3RpY2UsIGtlcm5lbCBidWdzIG1heSBsZWF2ZQorCQkJICogdW5raWxsYWJsZSBwcm9jZXNzZXMsIGFuZCB3YWl0KCkgbWF5IGJsb2NrIGZvcmV2ZXIuCisJCQkgKiBPaCB3ZWxsLiBIb3BpbmcgIm5ldyIgaW5pdCB3b24ndCBiZSB0b28gc3VycHJpc2VkCisJCQkgKiBieSBoYXZpbmcgY2hpbGRyZW4gaXQgZGlkbid0IGNyZWF0ZS4KKwkJCSAqLworCQkJLy93aGlsZSAod2FpdChOVUxMKSA+IDApCisJCQkvLwljb250aW51ZTsKKwkJCWluaXRfZXhlYyhhLT5jb21tYW5kKTsKKwkJfQorCQkvKiBPcGVuIG9yIGV4ZWMgZmFpbGVkICovCisJCXBhdXNlX2FuZF9sb3dfbGV2ZWxfcmVib290KFJCX0hBTFRfU1lTVEVNKTsKKwkJLyogbm90IHJlYWNoZWQgKi8KKwl9Cit9CisKKy8qIFRoZSBTSUdTVE9QL1NJR1RTVFAgaGFuZGxlcgorICogTkI6IGluc2lkZSBpdCwgYWxsIHNpZ25hbHMgZXhjZXB0IFNJR0NPTlQgYXJlIG1hc2tlZAorICogdmlhIGFwcHJvcHJpYXRlIHNldHVwIGluIHNpZ2FjdGlvbigpLgorICovCitzdGF0aWMgdm9pZCBzdG9wX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc21hbGxpbnQgc2F2ZWRfYmJfZ290X3NpZ25hbDsKKwlpbnQgc2F2ZWRfZXJybm87CisKKwlzYXZlZF9iYl9nb3Rfc2lnbmFsID0gYmJfZ290X3NpZ25hbDsKKwlzYXZlZF9lcnJubyA9IGVycm5vOworCXNpZ25hbChTSUdDT05ULCByZWNvcmRfc2lnbm8pOworCisJd2hpbGUgKDEpIHsKKwkJcGlkX3Qgd3BpZDsKKworCQlpZiAoYmJfZ290X3NpZ25hbCA9PSBTSUdDT05UKQorCQkJYnJlYWs7CisJCS8qIE5COiB0aGlzIGNhbiBhY2NpZGVudGFsbHkgd2FpdCgpIGZvciBhIHByb2Nlc3MKKwkJICogd2hpY2ggd2Ugd2FpdGZvcigpIGVsc2V3aGVyZSEgd2FpdGZvcigpIG11c3QgaGF2ZQorCQkgKiBjb2RlIHdoaWNoIGlzIHJlc2lsaWVudCBhZ2FpbnN0IHRoaXMuCisJCSAqLworCQl3cGlkID0gd2FpdF9hbnlfbm9oYW5nKE5VTEwpOworCQltYXJrX3Rlcm1pbmF0ZWQod3BpZCk7CisJCXNsZWVwKDEpOworCX0KKworCXNpZ25hbChTSUdDT05ULCBTSUdfREZMKTsKKwllcnJubyA9IHNhdmVkX2Vycm5vOworCWJiX2dvdF9zaWduYWwgPSBzYXZlZF9iYl9nb3Rfc2lnbmFsOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX0lOSVRUQUIKK3N0YXRpYyB2b2lkIHJlbG9hZF9pbml0dGFiKHZvaWQpCit7CisJc3RydWN0IGluaXRfYWN0aW9uICphLCAqKm5leHRwOworCisJbWVzc2FnZShMX0xPRywgInJlbG9hZGluZyAvZXRjL2luaXR0YWIiKTsKKworCS8qIERpc2FibGUgb2xkIGVudHJpZXMgKi8KKwlmb3IgKGEgPSBpbml0X2FjdGlvbl9saXN0OyBhOyBhID0gYS0+bmV4dCkKKwkJYS0+YWN0aW9uX3R5cGUgPSAwOworCisJLyogQXBwZW5kIG5ldyBlbnRyaWVzLCBvciBtb2RpZnkgZXhpc3RpbmcgZW50cmllcworCSAqIChpbmNsLiBzZXR0aW5nIGEtPmFjdGlvbl90eXBlKSBpZiBjbWQgYW5kIGRldmljZSBuYW1lCisJICogbWF0Y2ggbmV3IG9uZXMuIEVuZCByZXN1bHQ6IG9ubHkgZW50cmllcyB3aXRoCisJICogYS0+YWN0aW9uX3R5cGUgPT0gMCBhcmUgc3RhbGUuCisJICovCisJcGFyc2VfaW5pdHRhYigpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfS0lMTF9SRU1PVkVECisJLyogS2lsbCBzdGFsZSBlbnRyaWVzICovCisJLyogQmUgbmljZSBhbmQgc2VuZCBTSUdURVJNIGZpcnN0ICovCisJZm9yIChhID0gaW5pdF9hY3Rpb25fbGlzdDsgYTsgYSA9IGEtPm5leHQpCisJCWlmIChhLT5hY3Rpb25fdHlwZSA9PSAwICYmIGEtPnBpZCAhPSAwKQorCQkJa2lsbChhLT5waWQsIFNJR1RFUk0pOworCWlmIChDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZKSB7CisJCS8qIE5COiBwYXJlbnQgd2lsbCB3YWl0IGluIE5PTU1VIGNhc2UgKi8KKwkJaWYgKChCQl9NTVUgPyBmb3JrKCkgOiB2Zm9yaygpKSA9PSAwKSB7IC8qIGNoaWxkICovCisJCQlzbGVlcChDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZKTsKKwkJCWZvciAoYSA9IGluaXRfYWN0aW9uX2xpc3Q7IGE7IGEgPSBhLT5uZXh0KQorCQkJCWlmIChhLT5hY3Rpb25fdHlwZSA9PSAwICYmIGEtPnBpZCAhPSAwKQorCQkJCQlraWxsKGEtPnBpZCwgU0lHS0lMTCk7CisJCQlfZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBSZW1vdmUgc3RhbGUgZW50cmllcyBhbmQgU1lTSU5JVCBlbnRyaWVzLgorCSAqIFdlIG5ldmVyIHJlcnVuIFNZU0lOSVQgZW50cmllcyBhbnl3YXksCisJICogcmVtb3ZpbmcgdGhlbSB0b28gc2F2ZXMgYSBmZXcgYnl0ZXMgKi8KKwluZXh0cCA9ICZpbml0X2FjdGlvbl9saXN0OworCXdoaWxlICgoYSA9ICpuZXh0cCkgIT0gTlVMTCkgeworCQlpZiAoKGEtPmFjdGlvbl90eXBlICYgflNZU0lOSVQpID09IDApIHsKKwkJCSpuZXh0cCA9IGEtPm5leHQ7CisJCQlmcmVlKGEpOworCQl9IGVsc2UgeworCQkJbmV4dHAgPSAmYS0+bmV4dDsKKwkJfQorCX0KKworCS8qIE5vdCBuZWVkZWQ6ICovCisJLyogcnVuX2FjdGlvbnMoUkVTUEFXTiB8IEFTS0ZJUlNUKTsgKi8KKwkvKiAtIHdlIHJldHVybiB0byBtYWluIGxvb3AsIHdoaWNoIGRvZXMgdGhpcyBhdXRvbWFnaWNhbGx5ICovCit9CisjZW5kaWYKKworc3RhdGljIGludCBjaGVja19kZWxheWVkX3NpZ3Modm9pZCkKK3sKKwlpbnQgc2lnc19zZWVuID0gMDsKKworCXdoaWxlICgxKSB7CisJCXNtYWxsaW50IHNpZyA9IGJiX2dvdF9zaWduYWw7CisKKwkJaWYgKCFzaWcpCisJCQlyZXR1cm4gc2lnc19zZWVuOworCQliYl9nb3Rfc2lnbmFsID0gMDsKKwkJc2lnc19zZWVuID0gMTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfSU5JVFRBQgorCQlpZiAoc2lnID09IFNJR0hVUCkKKwkJCXJlbG9hZF9pbml0dGFiKCk7CisjZW5kaWYKKwkJaWYgKHNpZyA9PSBTSUdJTlQpCisJCQlydW5fYWN0aW9ucyhDVFJMQUxUREVMKTsKKwl9Cit9CisKK2ludCBpbml0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpbml0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJndlsxXSAmJiBzdHJjbXAoYXJndlsxXSwgIi1xIikgPT0gMCkgeworCQlyZXR1cm4ga2lsbCgxLCBTSUdIVVApOworCX0KKworCWlmICghREVCVUdfSU5JVCkgeworCQkvKiBFeHBlY3QgdG8gYmUgaW52b2tlZCBhcyBpbml0IHdpdGggUElEPTEgb3IgYmUgaW52b2tlZCBhcyBsaW51eHJjICovCisJCWlmIChnZXRwaWQoKSAhPSAxCisJCSAmJiAoIUVOQUJMRV9GRUFUVVJFX0lOSVRSRCB8fCBhcHBsZXRfbmFtZVswXSAhPSAnbCcpIC8qIG5vdCBsaW51eHJjPyAqLworCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtdXN0IGJlIHJ1biBhcyBQSUQgMSIpOworCQl9CisjaWZkZWYgUkJfRElTQUJMRV9DQUQKKwkJLyogVHVybiBvZmYgcmVib290aW5nIHZpYSBDVEwtQUxULURFTCAtIHdlIGdldCBhCisJCSAqIFNJR0lOVCBvbiBDQUQgc28gd2UgY2FuIHNodXQgdGhpbmdzIGRvd24gZ3JhY2VmdWxseS4uLiAqLworCQlyZWJvb3QoUkJfRElTQUJMRV9DQUQpOyAvKiBtaXNub21lciAqLworI2VuZGlmCisJfQorCisJLyogSWYsIHNheSwgeG1hbGxvYyB3b3VsZCBldmVyIGRpZSwgd2UgZG9uJ3Qgd2FudCB0byBvb3BzIGtlcm5lbAorCSAqIGJ5IGV4aXRpbmcuCisJICogTkI6IHdlIHNldCBkaWVfc2xlZXAgKmFmdGVyKiBQSUQgMSBjaGVjayBhbmQgYmJfc2hvd191c2FnZS4KKwkgKiBPdGhlcndpc2UsIGZvciBleGFtcGxlLCAiaW5pdCB1IiAoInBsZWFzZSByZXhlYyB5b3Vyc2VsZiIKKwkgKiBjb21tYW5kIGZvciBzeXN2aW5pdCkgd2lsbCBzaG93IGhlbHAgdGV4dCAod2hpY2ggaXNuJ3QgdG9vIGJhZCksCisJICogKmFuZCBzbGVlcCBmb3JldmVyKiAod2hpY2ggaXMgYmFkISkKKwkgKi8KKwlkaWVfc2xlZXAgPSAzMCAqIDI0KjYwKjYwOworCisJLyogRmlndXJlIG91dCB3aGVyZSB0aGUgZGVmYXVsdCBjb25zb2xlIHNob3VsZCBiZSAqLworCWNvbnNvbGVfaW5pdCgpOworCXNldF9zYW5lX3Rlcm0oKTsKKwl4Y2hkaXIoIi8iKTsKKwlzZXRzaWQoKTsKKworCS8qIE1ha2Ugc3VyZSBlbnZpcm9ucyBpcyBzZXQgdG8gc29tZXRoaW5nIHNhbmUgKi8KKwlwdXRlbnYoKGNoYXIgKikgIkhPTUU9LyIpOworCXB1dGVudigoY2hhciAqKSBiYl9QQVRIX3Jvb3RfcGF0aCk7CisJcHV0ZW52KChjaGFyICopICJTSEVMTD0vYmluL3NoIik7CisJcHV0ZW52KChjaGFyICopICJVU0VSPXJvb3QiKTsgLyogbmVlZGVkPyB3aHk/ICovCisKKwlpZiAoYXJndlsxXSkKKwkJeHNldGVudigiUlVOTEVWRUwiLCBhcmd2WzFdKTsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9FWFRSQV9RVUlFVAorCS8qIEhlbGxvIHdvcmxkICovCisJbWVzc2FnZShMX0NPTlNPTEUgfCBMX0xPRywgImluaXQgc3RhcnRlZDogJXMiLCBiYl9iYW5uZXIpOworI2VuZGlmCisKKy8qIHN0cnVjdCBzeXNpbmZvIGlzIGxpbnV4LXNwZWNpZmljICovCisjaWZkZWYgX19saW51eF9fCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBtZW1vcnkgdG8gZG8gc29tZXRoaW5nIHVzZWZ1bC4gKi8KKwlpZiAoRU5BQkxFX1NXQVBPTk9GRikgeworCQlzdHJ1Y3Qgc3lzaW5mbyBpbmZvOworCisJCWlmIChzeXNpbmZvKCZpbmZvKSA9PSAwCisJCSAmJiAoaW5mby5tZW1fdW5pdCA/IGluZm8ubWVtX3VuaXQgOiAxKSAqIChsb25nIGxvbmcpaW5mby50b3RhbHJhbSA8IDEwMjQqMTAyNAorCQkpIHsKKwkJCW1lc3NhZ2UoTF9DT05TT0xFLCAiTG93IG1lbW9yeSwgZm9yY2luZyBzd2Fwb24iKTsKKwkJCS8qIHN3YXBvbiAtYSByZXF1aXJlcyAvcHJvYyB0eXBpY2FsbHkgKi8KKwkJCW5ld19pbml0X2FjdGlvbihTWVNJTklULCAibW91bnQgLXQgcHJvYyBwcm9jIC9wcm9jIiwgIiIpOworCQkJLyogVHJ5IHRvIHR1cm4gb24gc3dhcCAqLworCQkJbmV3X2luaXRfYWN0aW9uKFNZU0lOSVQsICJzd2Fwb24gLWEiLCAiIik7CisJCQlydW5fYWN0aW9ucyhTWVNJTklUKTsgICAvKiB3YWl0IGFuZCByZW1vdmluZyAqLworCQl9CisJfQorI2VuZGlmCisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgc3VwcG9zZWQgdG8gYmUgaW4gc2luZ2xlIHVzZXIgbW9kZSAqLworCWlmIChhcmd2WzFdCisJICYmIChzdHJjbXAoYXJndlsxXSwgInNpbmdsZSIpID09IDAgfHwgc3RyY21wKGFyZ3ZbMV0sICItcyIpID09IDAgfHwgTE9ORV9DSEFSKGFyZ3ZbMV0sICcxJykpCisJKSB7CisJCS8qID8/PyBzaG91bGRuJ3Qgd2Ugc2V0IFJVTkxFVkVMPSJiIiBoZXJlPyAqLworCQkvKiBTdGFydCBhIHNoZWxsIG9uIGNvbnNvbGUgKi8KKwkJbmV3X2luaXRfYWN0aW9uKFJFU1BBV04sIGJiX2RlZmF1bHRfbG9naW5fc2hlbGwsICIiKTsKKwl9IGVsc2UgeworCQkvKiBOb3QgaW4gc2luZ2xlIHVzZXIgbW9kZSAtIHNlZSB3aGF0IGluaXR0YWIgc2F5cyAqLworCisJCS8qIE5PVEUgdGhhdCBpZiBDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQiBpcyBOT1QgZGVmaW5lZCwKKwkJICogdGhlbiBwYXJzZV9pbml0dGFiKCkgc2ltcGx5IGFkZHMgaW4gc29tZSBkZWZhdWx0CisJCSAqIGFjdGlvbnMoaS5lLiwgSU5JVF9TQ1JJUFQgYW5kIGEgcGFpcgorCQkgKiBvZiAiYXNrZmlyc3QiIHNoZWxscyAqLworCQlwYXJzZV9pbml0dGFiKCk7CisJfQorCisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAoZ2V0ZW52KCJTRUxJTlVYX0lOSVQiKSA9PSBOVUxMKSB7CisJCWludCBlbmZvcmNlID0gMDsKKworCQlwdXRlbnYoKGNoYXIqKSJTRUxJTlVYX0lOSVQ9WUVTIik7CisJCWlmIChzZWxpbnV4X2luaXRfbG9hZF9wb2xpY3koJmVuZm9yY2UpID09IDApIHsKKwkJCUJCX0VYRUNWUChhcmd2WzBdLCBhcmd2KTsKKwkJfSBlbHNlIGlmIChlbmZvcmNlID4gMCkgeworCQkJLyogU0VMaW51eCBpbiBlbmZvcmNpbmcgbW9kZSBidXQgbG9hZF9wb2xpY3kgZmFpbGVkICovCisJCQltZXNzYWdlKExfQ09OU09MRSwgImNhbid0IGxvYWQgU0VMaW51eCBQb2xpY3kuICIKKwkJCQkiTWFjaGluZSBpcyBpbiBlbmZvcmNpbmcgbW9kZS4gSGFsdGluZyBub3cuIik7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBNYWtlIHRoZSBjb21tYW5kIGxpbmUganVzdCBzYXkgImluaXQiICAtIHRoYXRzIGFsbCwgbm90aGluZyBlbHNlICovCisJc3RybmNweShhcmd2WzBdLCAiaW5pdCIsIHN0cmxlbihhcmd2WzBdKSk7CisJLyogV2lwZSBhcmd2WzFdLWFyZ3ZbTl0gc28gdGhleSBkb24ndCBjbHV0dGVyIHRoZSBwcyBsaXN0aW5nICovCisJd2hpbGUgKCorK2FyZ3YpCisJCW1lbXNldCgqYXJndiwgMCwgc3RybGVuKCphcmd2KSk7CisKKwkvKiBTZXQgdXAgc2lnbmFsIGhhbmRsZXJzICovCisJaWYgKCFERUJVR19JTklUKSB7CisJCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwkJYmJfc2lnbmFscygwCisJCQkrICgxIDw8IFNJR1VTUjEpIC8qIGhhbHQgKi8KKwkJCSsgKDEgPDwgU0lHVEVSTSkgLyogcmVib290ICovCisJCQkrICgxIDw8IFNJR1VTUjIpIC8qIHBvd2Vyb2ZmICovCisJCQksIGhhbHRfcmVib290X3B3b2ZmKTsKKwkJc2lnbmFsKFNJR1FVSVQsIHJlc3RhcnRfaGFuZGxlcik7IC8qIHJlLWV4ZWMgYW5vdGhlciBpbml0ICovCisKKwkJLyogU3RvcCBoYW5kbGVyIG11c3QgYWxsb3cgb25seSBTSUdDT05UIGluc2lkZSBpdHNlbGYgKi8KKwkJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJCXNpZ2ZpbGxzZXQoJnNhLnNhX21hc2spOworCQlzaWdkZWxzZXQoJnNhLnNhX21hc2ssIFNJR0NPTlQpOworCQlzYS5zYV9oYW5kbGVyID0gc3RvcF9oYW5kbGVyOworCQkvKiBOQjogc2FfZmxhZ3MgZG9lc24ndCBoYXZlIFNBX1JFU1RBUlQuCisJCSAqIEl0IG11c3QgYmUgYWJsZSB0byBpbnRlcnJ1cHQgd2FpdCgpLgorCQkgKi8KKwkJc2lnYWN0aW9uX3NldChTSUdUU1RQLCAmc2EpOyAvKiBwYXVzZSAqLworCQkvKiBEb2VzIG5vdCB3b3JrIGFzIGludGVuZGVkLCBhdCBsZWFzdCBpbiAyLjYuMjAuCisJCSAqIFNJR1NUT1AgaXMgc2ltcGx5IGlnbm9yZWQgYnkgaW5pdDoKKwkJICovCisJCXNpZ2FjdGlvbl9zZXQoU0lHU1RPUCwgJnNhKTsgLyogcGF1c2UgKi8KKworCQkvKiBTSUdJTlQgKEN0cmwtQWx0LURlbCkgbXVzdCBpbnRlcnJ1cHQgd2FpdCgpLAorCQkgKiBzZXR0aW5nIGhhbmRsZXIgd2l0aG91dCBTQV9SRVNUQVJUIGZsYWcuCisJCSAqLworCQliYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoKDEgPDwgU0lHSU5UKSwgcmVjb3JkX3NpZ25vKTsKKwl9CisKKwkvKiBTZXQgdXAgInJlcmVhZCAvZXRjL2luaXR0YWIiIGhhbmRsZXIuCisJICogSGFuZGxlciBpcyBzZXQgdXAgd2l0aG91dCBTQV9SRVNUQVJULCBpdCB3aWxsIGludGVycnVwdCBzeXNjYWxscy4KKwkgKi8KKwlpZiAoIURFQlVHX0lOSVQgJiYgRU5BQkxFX0ZFQVRVUkVfVVNFX0lOSVRUQUIpCisJCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgoMSA8PCBTSUdIVVApLCByZWNvcmRfc2lnbm8pOworCisJLyogTm93IHJ1biBldmVyeXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgcnVuICovCisJLyogRmlyc3QgcnVuIHRoZSBzeXNpbml0IGNvbW1hbmQgKi8KKwlydW5fYWN0aW9ucyhTWVNJTklUKTsKKwljaGVja19kZWxheWVkX3NpZ3MoKTsKKwkvKiBOZXh0IHJ1biBhbnl0aGluZyB0aGF0IHdhbnRzIHRvIGJsb2NrICovCisJcnVuX2FjdGlvbnMoV0FJVCk7CisJY2hlY2tfZGVsYXllZF9zaWdzKCk7CisJLyogTmV4dCBydW4gYW55dGhpbmcgdG8gYmUgcnVuIG9ubHkgb25jZSAqLworCXJ1bl9hY3Rpb25zKE9OQ0UpOworCisJLyogTm93IHJ1biB0aGUgbG9vcGluZyBzdHVmZiBmb3IgdGhlIHJlc3Qgb2YgZm9yZXZlci4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlpbnQgbWF5YmVfV05PSEFORzsKKworCQltYXliZV9XTk9IQU5HID0gY2hlY2tfZGVsYXllZF9zaWdzKCk7CisKKwkJLyogKFJlKXJ1biB0aGUgcmVzcGF3bi9hc2tmaXJzdCBzdHVmZiAqLworCQlydW5fYWN0aW9ucyhSRVNQQVdOIHwgQVNLRklSU1QpOworCQltYXliZV9XTk9IQU5HIHw9IGNoZWNrX2RlbGF5ZWRfc2lncygpOworCisJCS8qIERvbid0IGNvbnN1bWUgYWxsIENQVSB0aW1lIC0gc2xlZXAgYSBiaXQgKi8KKwkJc2xlZXAoMSk7CisJCW1heWJlX1dOT0hBTkcgfD0gY2hlY2tfZGVsYXllZF9zaWdzKCk7CisKKwkJLyogV2FpdCBmb3IgYW55IGNoaWxkIHByb2Nlc3MoZXMpIHRvIGV4aXQuCisJCSAqCisJCSAqIElmIGNoZWNrX2RlbGF5ZWRfc2lncyBhYm92ZSByZXBvcnRlZCB0aGF0IGEgc2lnbmFsCisJCSAqIHdhcyBjYXVnaHQsIHdhaXQgd2lsbCBiZSBub25ibG9ja2luZy4gVGhpcyBlbnN1cmVzCisJCSAqIHRoYXQgaWYgU0lHSFVQIGhhcyByZWxvYWRlZCBpbml0dGFiLCByZXNwYXduIGFuZCBhc2tmaXJzdAorCQkgKiBhY3Rpb25zIHdpbGwgbm90IGJlIGRlbGF5ZWQgdW50aWwgbmV4dCBjaGlsZCBkZWF0aC4KKwkJICovCisJCWlmIChtYXliZV9XTk9IQU5HKQorCQkJbWF5YmVfV05PSEFORyA9IFdOT0hBTkc7CisJCXdoaWxlICgxKSB7CisJCQlwaWRfdCB3cGlkOworCQkJc3RydWN0IGluaXRfYWN0aW9uICphOworCisJCQkvKiBJZiBzaWduYWxzIGhhcHBlbiBfaW5fIHRoZSB3YWl0LCB0aGV5IGludGVycnVwdCBpdCwKKwkJCSAqIGJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCBzZXQgdGhlbSB1cCB0aGF0IHdheQorCQkJICovCisJCQl3cGlkID0gd2FpdHBpZCgtMSwgTlVMTCwgbWF5YmVfV05PSEFORyk7CisJCQlpZiAod3BpZCA8PSAwKQorCQkJCWJyZWFrOworCisJCQlhID0gbWFya190ZXJtaW5hdGVkKHdwaWQpOworCQkJaWYgKGEpIHsKKwkJCQltZXNzYWdlKExfTE9HLCAicHJvY2VzcyAnJXMnIChwaWQgJWQpIGV4aXRlZC4gIgorCQkJCQkJIlNjaGVkdWxpbmcgZm9yIHJlc3RhcnQuIiwKKwkJCQkJCWEtPmNvbW1hbmQsIHdwaWQpOworCQkJfQorCQkJLyogU2VlIGlmIGFueW9uZSBlbHNlIGlzIHdhaXRpbmcgdG8gYmUgcmVhcGVkICovCisJCQltYXliZV9XTk9IQU5HID0gV05PSEFORzsKKwkJfQorCX0gLyogd2hpbGUgKDEpICovCit9CisKKy8vdXNhZ2U6I2RlZmluZSBsaW51eHJjX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBsaW51eHJjX2Z1bGxfdXNhZ2UgIiIKKworLy91c2FnZTojZGVmaW5lIGluaXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBpbml0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiSW5pdCBpcyB0aGUgcGFyZW50IG9mIGFsbCBwcm9jZXNzZXMiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGluaXRfbm90ZXNfdXNhZ2UKKy8vdXNhZ2U6CSJUaGlzIHZlcnNpb24gb2YgaW5pdCBpcyBkZXNpZ25lZCB0byBiZSBydW4gb25seSBieSB0aGUga2VybmVsLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIkJ1c3lCb3ggaW5pdCBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgcnVubGV2ZWxzLiBUaGUgcnVubGV2ZWxzIGZpZWxkIG9mXG4iCisvL3VzYWdlOgkidGhlIC9ldGMvaW5pdHRhYiBmaWxlIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSBCdXN5Qm94IGluaXQuIElmIHlvdSB3YW50XG4iCisvL3VzYWdlOgkicnVubGV2ZWxzLCB1c2Ugc3lzdmluaXQuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiQnVzeUJveCBpbml0IHdvcmtzIGp1c3QgZmluZSB3aXRob3V0IGFuIGluaXR0YWIuIElmIG5vIGluaXR0YWIgaXMgZm91bmQsXG4iCisvL3VzYWdlOgkiaXQgaGFzIHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBiZWhhdmlvcjpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJOjpzeXNpbml0Oi9ldGMvaW5pdC5kL3JjU1xuIgorLy91c2FnZToJIgk6OmFza2ZpcnN0Oi9iaW4vc2hcbiIKKy8vdXNhZ2U6CSIJOjpjdHJsYWx0ZGVsOi9zYmluL3JlYm9vdFxuIgorLy91c2FnZToJIgk6OnNodXRkb3duOi9zYmluL3N3YXBvZmYgLWFcbiIKKy8vdXNhZ2U6CSIJOjpzaHV0ZG93bjovYmluL3Vtb3VudCAtYSAtclxuIgorLy91c2FnZToJIgk6OnJlc3RhcnQ6L3NiaW4vaW5pdFxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJImlmIGl0IGRldGVjdHMgdGhhdCAvZGV2L2NvbnNvbGUgaXMgX25vdF8gYSBzZXJpYWwgY29uc29sZSwgaXQgd2lsbCBhbHNvIHJ1bjpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJdHR5Mjo6YXNrZmlyc3Q6L2Jpbi9zaFxuIgorLy91c2FnZToJIgl0dHkzOjphc2tmaXJzdDovYmluL3NoXG4iCisvL3VzYWdlOgkiCXR0eTQ6OmFza2ZpcnN0Oi9iaW4vc2hcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJJZiB5b3UgY2hvb3NlIHRvIHVzZSBhbiAvZXRjL2luaXR0YWIgZmlsZSwgdGhlIGluaXR0YWIgZW50cnkgZm9ybWF0IGlzIGFzIGZvbGxvd3M6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCTxpZD46PHJ1bmxldmVscz46PGFjdGlvbj46PHByb2Nlc3M+XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCTxpZD46XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQlXQVJOSU5HOiBUaGlzIGZpZWxkIGhhcyBhIG5vbi10cmFkaXRpb25hbCBtZWFuaW5nIGZvciBCdXN5Qm94IGluaXQhXG4iCisvL3VzYWdlOgkiCQlUaGUgaWQgZmllbGQgaXMgdXNlZCBieSBCdXN5Qm94IGluaXQgdG8gc3BlY2lmeSB0aGUgY29udHJvbGxpbmcgdHR5IGZvclxuIgorLy91c2FnZToJIgkJdGhlIHNwZWNpZmllZCBwcm9jZXNzIHRvIHJ1biBvbi4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmllbGQgYXJlXG4iCisvL3VzYWdlOgkiCQlhcHBlbmRlZCB0byBcIi9kZXYvXCIgYW5kIHVzZWQgYXMtaXMuIFRoZXJlIGlzIG5vIG5lZWQgZm9yIHRoaXMgZmllbGQgdG9cbiIKKy8vdXNhZ2U6CSIJCWJlIHVuaXF1ZSwgYWx0aG91Z2ggaWYgaXQgaXNuJ3QgeW91IG1heSBoYXZlIHN0cmFuZ2UgcmVzdWx0cy4gSWYgdGhpc1xuIgorLy91c2FnZToJIgkJZmllbGQgaXMgbGVmdCBibGFuaywgdGhlIGNvbnRyb2xsaW5nIHR0eSBpcyBzZXQgdG8gdGhlIGNvbnNvbGUuIEFsc29cbiIKKy8vdXNhZ2U6CSIJCW5vdGUgdGhhdCBpZiBCdXN5Qm94IGRldGVjdHMgdGhhdCBhIHNlcmlhbCBjb25zb2xlIGlzIGluIHVzZSwgdGhlbiBvbmx5XG4iCisvL3VzYWdlOgkiCQllbnRyaWVzIHdob3NlIGNvbnRyb2xsaW5nIHR0eSBpcyBlaXRoZXIgdGhlIHNlcmlhbCBjb25zb2xlIG9yIC9kZXYvbnVsbFxuIgorLy91c2FnZToJIgkJd2lsbCBiZSBydW4uIEJ1c3lCb3ggaW5pdCBkb2VzIG5vdGhpbmcgd2l0aCB1dG1wLiBXZSBkb24ndCBuZWVkIG5vXG4iCisvL3VzYWdlOgkiCQlzdGlua2luJyB1dG1wLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgk8cnVubGV2ZWxzPjpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVRoZSBydW5sZXZlbHMgZmllbGQgaXMgY29tcGxldGVseSBpZ25vcmVkLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgk8YWN0aW9uPjpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVZhbGlkIGFjdGlvbnMgaW5jbHVkZTogc3lzaW5pdCwgcmVzcGF3biwgYXNrZmlyc3QsIHdhaXQsXG4iCisvL3VzYWdlOgkiCQlvbmNlLCByZXN0YXJ0LCBjdHJsYWx0ZGVsLCBhbmQgc2h1dGRvd24uXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQlUaGUgYXZhaWxhYmxlIGFjdGlvbnMgY2FuIGJlIGNsYXNzaWZpZWQgaW50byB0d28gZ3JvdXBzOiBhY3Rpb25zXG4iCisvL3VzYWdlOgkiCQl0aGF0IGFyZSBydW4gb25seSBvbmNlLCBhbmQgYWN0aW9ucyB0aGF0IGFyZSByZS1ydW4gd2hlbiB0aGUgc3BlY2lmaWVkXG4iCisvL3VzYWdlOgkiCQlwcm9jZXNzIGV4aXRzLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJUnVuIG9ubHktb25jZSBhY3Rpb25zOlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJCSdzeXNpbml0JyBpcyB0aGUgZmlyc3QgaXRlbSBydW4gb24gYm9vdC4gaW5pdCB3YWl0cyB1bnRpbCBhbGxcbiIKKy8vdXNhZ2U6CSIJCQlzeXNpbml0IGFjdGlvbnMgYXJlIGNvbXBsZXRlZCBiZWZvcmUgY29udGludWluZy4gRm9sbG93aW5nIHRoZVxuIgorLy91c2FnZToJIgkJCWNvbXBsZXRpb24gb2YgYWxsIHN5c2luaXQgYWN0aW9ucywgYWxsICd3YWl0JyBhY3Rpb25zIGFyZSBydW4uXG4iCisvL3VzYWdlOgkiCQkJJ3dhaXQnIGFjdGlvbnMsIGxpa2UgJ3N5c2luaXQnIGFjdGlvbnMsIGNhdXNlIGluaXQgdG8gd2FpdCB1bnRpbFxuIgorLy91c2FnZToJIgkJCXRoZSBzcGVjaWZpZWQgdGFzayBjb21wbGV0ZXMuICdvbmNlJyBhY3Rpb25zIGFyZSBhc3luY2hyb25vdXMsXG4iCisvL3VzYWdlOgkiCQkJdGhlcmVmb3JlLCBpbml0IGRvZXMgbm90IHdhaXQgZm9yIHRoZW0gdG8gY29tcGxldGUuICdyZXN0YXJ0JyBpc1xuIgorLy91c2FnZToJIgkJCXRoZSBhY3Rpb24gdGFrZW4gdG8gcmVzdGFydCB0aGUgaW5pdCBwcm9jZXNzLiBCeSBkZWZhdWx0IHRoaXMgc2hvdWxkXG4iCisvL3VzYWdlOgkiCQkJc2ltcGx5IHJ1biAvc2Jpbi9pbml0LCBidXQgY2FuIGJlIGEgc2NyaXB0IHdoaWNoIHJ1bnMgcGl2b3Rfcm9vdCBvciBpdFxuIgorLy91c2FnZToJIgkJCWNhbiBkbyBhbGwgc29ydHMgb2Ygb3RoZXIgaW50ZXJlc3RpbmcgdGhpbmdzLiBUaGUgJ2N0cmxhbHRkZWwnIGluaXRcbiIKKy8vdXNhZ2U6CSIJCQlhY3Rpb25zIGFyZSBydW4gd2hlbiB0aGUgc3lzdGVtIGRldGVjdHMgdGhhdCBzb21lb25lIG9uIHRoZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6CSIJCQljb25zb2xlIGhhcyBwcmVzc2VkIHRoZSBDVFJMLUFMVC1ERUwga2V5IGNvbWJpbmF0aW9uLiBUeXBpY2FsbHkgb25lXG4iCisvL3VzYWdlOgkiCQkJd2FudHMgdG8gcnVuICdyZWJvb3QnIGF0IHRoaXMgcG9pbnQgdG8gY2F1c2UgdGhlIHN5c3RlbSB0byByZWJvb3QuXG4iCisvL3VzYWdlOgkiCQkJRmluYWxseSB0aGUgJ3NodXRkb3duJyBhY3Rpb24gc3BlY2lmaWVzIHRoZSBhY3Rpb25zIHRvIHRha2VuIHdoZW5cbiIKKy8vdXNhZ2U6CSIJCQlpbml0IGlzIHRvbGQgdG8gcmVib290LiBVbm1vdW50aW5nIGZpbGVzeXN0ZW1zIGFuZCBkaXNhYmxpbmcgc3dhcFxuIgorLy91c2FnZToJIgkJCWlzIGEgdmVyeSBnb29kIGhlcmUuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQlSdW4gcmVwZWF0ZWRseSBhY3Rpb25zOlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJCSdyZXNwYXduJyBhY3Rpb25zIGFyZSBydW4gYWZ0ZXIgdGhlICdvbmNlJyBhY3Rpb25zLiBXaGVuIGEgcHJvY2Vzc1xuIgorLy91c2FnZToJIgkJCXN0YXJ0ZWQgd2l0aCBhICdyZXNwYXduJyBhY3Rpb24gZXhpdHMsIGluaXQgYXV0b21hdGljYWxseSByZXN0YXJ0c1xuIgorLy91c2FnZToJIgkJCWl0LiBVbmxpa2Ugc3lzdmluaXQsIEJ1c3lCb3ggaW5pdCBkb2VzIG5vdCBzdG9wIHByb2Nlc3NlcyBmcm9tXG4iCisvL3VzYWdlOgkiCQkJcmVzcGF3bmluZyBvdXQgb2YgY29udHJvbC4gVGhlICdhc2tmaXJzdCcgYWN0aW9ucyBhY3RzIGp1c3QgbGlrZVxuIgorLy91c2FnZToJIgkJCXJlc3Bhd24sIGV4Y2VwdCB0aGF0IGJlZm9yZSBydW5uaW5nIHRoZSBzcGVjaWZpZWQgcHJvY2VzcyBpdFxuIgorLy91c2FnZToJIgkJCWRpc3BsYXlzIHRoZSBsaW5lIFwiUGxlYXNlIHByZXNzIEVudGVyIHRvIGFjdGl2YXRlIHRoaXMgY29uc29sZS5cIlxuIgorLy91c2FnZToJIgkJCWFuZCB0aGVuIHdhaXRzIGZvciB0aGUgdXNlciB0byBwcmVzcyBlbnRlciBiZWZvcmUgc3RhcnRpbmcgdGhlXG4iCisvL3VzYWdlOgkiCQkJc3BlY2lmaWVkIHByb2Nlc3MuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQlVbnJlY29nbml6ZWQgYWN0aW9ucyAobGlrZSBpbml0ZGVmYXVsdCkgd2lsbCBjYXVzZSBpbml0IHRvIGVtaXQgYW5cbiIKKy8vdXNhZ2U6CSIJCWVycm9yIG1lc3NhZ2UsIGFuZCB0aGVuIGdvIGFsb25nIHdpdGggaXRzIGJ1c2luZXNzLiBBbGwgYWN0aW9ucyBhcmVcbiIKKy8vdXNhZ2U6CSIJCXJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gL2V0Yy9pbml0dGFiLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgk8cHJvY2Vzcz46XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQlTcGVjaWZpZXMgdGhlIHByb2Nlc3MgdG8gYmUgZXhlY3V0ZWQgYW5kIGl0cyBjb21tYW5kIGxpbmUuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiRXhhbXBsZSAvZXRjL2luaXR0YWIgZmlsZTpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJIyBUaGlzIGlzIHJ1biBmaXJzdCBleGNlcHQgd2hlbiBib290aW5nIGluIHNpbmdsZS11c2VyIG1vZGVcbiIKKy8vdXNhZ2U6CSIJI1xuIgorLy91c2FnZToJIgk6OnN5c2luaXQ6L2V0Yy9pbml0LmQvcmNTXG4iCisvL3VzYWdlOgkiCVxuIgorLy91c2FnZToJIgkjIC9iaW4vc2ggaW52b2NhdGlvbnMgb24gc2VsZWN0ZWQgdHR5c1xuIgorLy91c2FnZToJIgkjXG4iCisvL3VzYWdlOgkiCSMgU3RhcnQgYW4gXCJhc2tmaXJzdFwiIHNoZWxsIG9uIHRoZSBjb25zb2xlICh3aGF0ZXZlciB0aGF0IG1heSBiZSlcbiIKKy8vdXNhZ2U6CSIJOjphc2tmaXJzdDotL2Jpbi9zaFxuIgorLy91c2FnZToJIgkjIFN0YXJ0IGFuIFwiYXNrZmlyc3RcIiBzaGVsbCBvbiAvZGV2L3R0eTItNFxuIgorLy91c2FnZToJIgl0dHkyOjphc2tmaXJzdDotL2Jpbi9zaFxuIgorLy91c2FnZToJIgl0dHkzOjphc2tmaXJzdDotL2Jpbi9zaFxuIgorLy91c2FnZToJIgl0dHk0Ojphc2tmaXJzdDotL2Jpbi9zaFxuIgorLy91c2FnZToJIglcbiIKKy8vdXNhZ2U6CSIJIyAvc2Jpbi9nZXR0eSBpbnZvY2F0aW9ucyBmb3Igc2VsZWN0ZWQgdHR5c1xuIgorLy91c2FnZToJIgkjXG4iCisvL3VzYWdlOgkiCXR0eTQ6OnJlc3Bhd246L3NiaW4vZ2V0dHkgMzg0MDAgdHR5NFxuIgorLy91c2FnZToJIgl0dHk1OjpyZXNwYXduOi9zYmluL2dldHR5IDM4NDAwIHR0eTVcbiIKKy8vdXNhZ2U6CSIJXG4iCisvL3VzYWdlOgkiCVxuIgorLy91c2FnZToJIgkjIEV4YW1wbGUgb2YgaG93IHRvIHB1dCBhIGdldHR5IG9uIGEgc2VyaWFsIGxpbmUgKGZvciBhIHRlcm1pbmFsKVxuIgorLy91c2FnZToJIgkjXG4iCisvL3VzYWdlOgkiCSM6OnJlc3Bhd246L3NiaW4vZ2V0dHkgLUwgdHR5UzAgOTYwMCB2dDEwMFxuIgorLy91c2FnZToJIgkjOjpyZXNwYXduOi9zYmluL2dldHR5IC1MIHR0eVMxIDk2MDAgdnQxMDBcbiIKKy8vdXNhZ2U6CSIJI1xuIgorLy91c2FnZToJIgkjIEV4YW1wbGUgaG93IHRvIHB1dCBhIGdldHR5IG9uIGEgbW9kZW0gbGluZVxuIgorLy91c2FnZToJIgkjOjpyZXNwYXduOi9zYmluL2dldHR5IDU3NjAwIHR0eVMyXG4iCisvL3VzYWdlOgkiCVxuIgorLy91c2FnZToJIgkjIFN0dWZmIHRvIGRvIHdoZW4gcmVzdGFydGluZyB0aGUgaW5pdCBwcm9jZXNzXG4iCisvL3VzYWdlOgkiCTo6cmVzdGFydDovc2Jpbi9pbml0XG4iCisvL3VzYWdlOgkiCVxuIgorLy91c2FnZToJIgkjIFN0dWZmIHRvIGRvIGJlZm9yZSByZWJvb3RpbmdcbiIKKy8vdXNhZ2U6CSIJOjpjdHJsYWx0ZGVsOi9zYmluL3JlYm9vdFxuIgorLy91c2FnZToJIgk6OnNodXRkb3duOi9iaW4vdW1vdW50IC1hIC1yXG4iCisvL3VzYWdlOgkiCTo6c2h1dGRvd246L3NiaW4vc3dhcG9mZiAtYVxuIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvaW5pdC9tZXNnLmMgYi9idXN5Ym94LTEuMTkuMy9pbml0L21lc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWMxM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5pdC9tZXNnLmMKQEAgLTAsMCArMSw3NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWVzZyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgTUVTRworLy9jb25maWc6CWJvb2wgIm1lc2ciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWVzZyBjb250cm9scyBhY2Nlc3MgdG8geW91ciB0ZXJtaW5hbCBieSBvdGhlcnMuIEl0IGlzIHR5cGljYWxseQorLy9jb25maWc6CSAgdXNlZCB0byBhbGxvdyBvciBkaXNhbGxvdyBvdGhlciB1c2VycyB0byB3cml0ZSB0byB5b3VyIHRlcm1pbmFsCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX01FU0dfRU5BQkxFX09OTFlfR1JPVVAKKy8vY29uZmlnOglib29sICJFbmFibGUgd3JpdGluZyB0byB0dHkgb25seSBieSBncm91cCwgbm90IGJ5IGV2ZXJ5Ym9keSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIE1FU0cKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBVc3VhbGx5LCB0dHlzIGFyZSBvd25lZCBieSBncm91cCAidHR5IiwgYW5kICJ3cml0ZSIgdG9vbCBpcworLy9jb25maWc6CSAgc2V0Z2lkIHRvIHRoaXMgZ3JvdXAuIFRoaXMgd2F5LCAibWVzZyB5IiBvbmx5IG5lZWRzIHRvIGVuYWJsZQorLy9jb25maWc6CSAgIndyaXRlIGJ5IG93bmluZyBncm91cCIgYml0IGluIHR0eSBtb2RlLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBJZiB5b3Ugc2V0IHRoaXMgb3B0aW9uIHRvIE4sICJtZXNnIHkiIHdpbGwgZW5hYmxlIHdyaXRpbmcKKy8vY29uZmlnOgkgIGJ5IGFueWJvZHkgYXQgYWxsLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4KKworLy9hcHBsZXQ6SUZfTUVTRyhBUFBMRVQobWVzZywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19NRVNHKSArPSBtZXNnLm8KKworLy91c2FnZTojZGVmaW5lIG1lc2dfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlt5fG5dIgorLy91c2FnZTojZGVmaW5lIG1lc2dfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb250cm9sIHdyaXRlIGFjY2VzcyB0byB5b3VyIHRlcm1pbmFsXG4iCisvL3VzYWdlOiAgICAgICAiCXkJQWxsb3cgd3JpdGUgYWNjZXNzIHRvIHlvdXIgdGVybWluYWxcbiIKKy8vdXNhZ2U6ICAgICAgICIJbglEaXNhbGxvdyB3cml0ZSBhY2Nlc3MgdG8geW91ciB0ZXJtaW5hbCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NRVNHX0VOQUJMRV9PTkxZX0dST1VQCisjZGVmaW5lIFNfSVdHUlBfT1JfU19JV09USCAgU19JV0dSUAorI2Vsc2UKKyNkZWZpbmUgU19JV0dSUF9PUl9TX0lXT1RIICAoU19JV0dSUCB8IFNfSVdPVEgpCisjZW5kaWYKKworaW50IG1lc2dfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1lc2dfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IHNiOworCW1vZGVfdCBtOworCWNoYXIgYyA9IDA7CisKKwlhcmd2Kys7CisKKwlpZiAoYXJndlswXQorCSAmJiAoYXJndlsxXSB8fCAoKGMgPSBhcmd2WzBdWzBdKSAhPSAneScgJiYgYyAhPSAnbicpKQorCSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKCFpc2F0dHkoU1RESU5fRklMRU5PKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhIHR0eSIpOworCisJeGZzdGF0KFNURElOX0ZJTEVOTywgJnNiLCAic3RkZXJyIik7CisJaWYgKGMgPT0gMCkgeworCQlwdXRzKChzYi5zdF9tb2RlICYgKFNfSVdHUlB8U19JV09USCkpID8gImlzIHkiIDogImlzIG4iKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisJbSA9IChjID09ICd5JykgPyBzYi5zdF9tb2RlIHwgU19JV0dSUF9PUl9TX0lXT1RICisJICAgICAgICAgICAgICAgOiBzYi5zdF9tb2RlICYgfihTX0lXR1JQfFNfSVdPVEgpOworCWlmIChmY2htb2QoU1RESU5fRklMRU5PLCBtKSAhPSAwKQorCQliYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSgpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9pbml0L3JlYm9vdC5oIGIvYnVzeWJveC0xLjE5LjMvaW5pdC9yZWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk3NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvaW5pdC9yZWJvb3QuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogRGVmaW5pdGlvbnMgcmVsYXRlZCB0byB0aGUgcmVib290KCkgc3lzdGVtIGNhbGwsCisgKiBzaGFyZWQgYmV0d2VlbiBpbml0LmMgYW5kIGhhbHQuYy4KKyAqLworCisjaW5jbHVkZSA8c3lzL3JlYm9vdC5oPgorCisjaWZuZGVmIFJCX0hBTFRfU1lTVEVNCisjIGlmIGRlZmluZWQoX19saW51eF9fKQorIyAgZGVmaW5lIFJCX0hBTFRfU1lTVEVNICAweGNkZWYwMTIzCisjICBkZWZpbmUgUkJfRU5BQkxFX0NBRCAgIDB4ODlhYmNkZWYKKyMgIGRlZmluZSBSQl9ESVNBQkxFX0NBRCAgMAorIyAgZGVmaW5lIFJCX1BPV0VSX09GRiAgICAweDQzMjFmZWRjCisjICBkZWZpbmUgUkJfQVVUT0JPT1QgICAgIDB4MDEyMzQ1NjcKKyMgZWxpZiBkZWZpbmVkKFJCX0hBTFQpCisjICBkZWZpbmUgUkJfSEFMVF9TWVNURU0gIFJCX0hBTFQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTdG9wIHN5c3RlbSBhbmQgc3dpdGNoIHBvd2VyIG9mZiBpZiBwb3NzaWJsZS4gICovCisjaWZuZGVmIFJCX1BPV0VSX09GRgorIyBpZiBkZWZpbmVkKFJCX1BPV0VSRE9XTikKKyMgIGRlZmluZSBSQl9QT1dFUl9PRkYgIFJCX1BPV0VSRE9XTgorIyBlbGlmIGRlZmluZWQoX19saW51eF9fKQorIyAgZGVmaW5lIFJCX1BPV0VSX09GRiAgMHg0MzIxZmVkYworIyBlbHNlCisjICB3YXJuaW5nICJwb3dlcm9mZiB1bnN1cHBvcnRlZCwgdXNpbmcgaGFsdCBhcyBmYWxsYmFjayIKKyMgIGRlZmluZSBSQl9QT1dFUl9PRkYgIFJCX0hBTFRfU1lTVEVNCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDQyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9Db25maWcuc3JjCkBAIC0wLDAgKzEsMjE4IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJCdXN5Ym94IExpYnJhcnkgVHVuaW5nIgorCitJTlNFUlQKKworY29uZmlnIFBBU1NXT1JEX01JTkxFTgorCWludCAiTWluaW11bSBwYXNzd29yZCBsZW5ndGgiCisJZGVmYXVsdCA2CisJcmFuZ2UgNSAzMgorCWhlbHAKKwkgIE1pbmltdW0gYWxsb3dhYmxlIHBhc3N3b3JkIGxlbmd0aC4KKworY29uZmlnIE1ENV9TSVpFX1ZTX1NQRUVECisJaW50ICJNRDU6IFRyYWRlIGJ5dGVzIGZvciBzcGVlZCAoMDpmYXN0LCAzOnNsb3cpIgorCWRlZmF1bHQgMgorCXJhbmdlIDAgMworCWhlbHAKKwkgIFRyYWRlIGJpbmFyeSBzaXplIHZlcnN1cyBzcGVlZCBmb3IgdGhlIG1kNXN1bSBhbGdvcml0aG0uCisJICBBcHByb3hpbWF0ZSB2YWx1ZXMgcnVubmluZyB1Q2xpYmMgYW5kIGhhc2hpbmcKKwkgIGxpbnV4LTIuNC40LnRhci5iejIgd2VyZToKKwkgICAgICAgICAgICAgICAgICAgIHVzZXIgdGltZXMgKHNlYykgIHRleHQgc2l6ZSAoMzg2KQorCSAgMCAoZmFzdGVzdCkgICAgICAgICAxLjEgICAgICAgICAgICAgICAgNjE0NAorCSAgMSAgICAgICAgICAgICAgICAgICAxLjQgICAgICAgICAgICAgICAgNTM5MgorCSAgMiAgICAgICAgICAgICAgICAgICAzLjAgICAgICAgICAgICAgICAgNTA4OAorCSAgMyAoc21hbGxlc3QpICAgICAgICA1LjEgICAgICAgICAgICAgICAgNDkxMgorCitjb25maWcgRkVBVFVSRV9GQVNUX1RPUAorCWJvb2wgIkZhc3RlciAvcHJvYyBzY2FubmluZyBjb2RlICgrMTAwIGJ5dGVzKSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBtYWtlcyB0b3AgKGFuZCBwcykgfjIwJSBmYXN0ZXIgKG9yIDIwJSBsZXNzIENQVSBodW5ncnkpLAorCSAgYnV0IGNvZGUgc2l6ZSBpcyBzbGlnaHRseSBiaWdnZXIuCisKK2NvbmZpZyBGRUFUVVJFX0VUQ19ORVRXT1JLUworCWJvb2wgIlN1cHBvcnQgZm9yIC9ldGMvbmV0d29ya3MiCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIG5ldHdvcmsgbmFtZXMgaW4gL2V0Yy9uZXR3b3Jrcy4gVGhpcyBpcworCSAgYSByYXJlbHkgdXNlZCBmZWF0dXJlIHdoaWNoIGFsbG93cyB5b3UgdG8gdXNlIG5hbWVzCisJICBpbnN0ZWFkIG9mIElQL21hc2sgcGFpcnMgaW4gcm91dGUgY29tbWFuZC4KKworY29uZmlnIEZFQVRVUkVfVVNFX1RFUk1JT1MKKwlib29sICJVc2UgdGVybWlvcyB0byBtYW5pcHVsYXRlIHRoZSBzY3JlZW4iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1JFIHx8IFRPUCB8fCBQT1dFUlRPUAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB1dGlsaXRpZXMgc3VjaCBhcyAnbW9yZScgYW5kICd0b3AnIHRvIGRldGVybWluZQorCSAgdGhlIHNpemUgb2YgdGhlIHNjcmVlbi4gSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIHlvdXIgdXRpbGl0aWVzCisJICB0aGF0IGRpc3BsYXkgdGhpbmdzIG9uIHRoZSBzY3JlZW4gd2lsbCBiZSBlc3BlY2lhbGx5IHByaW1pdGl2ZSBhbmQKKwkgIHdpbGwgYmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSwgYW5kIHdpbGwgYmUKKwkgIHVuYWJsZSB0byBtb3ZlIHRoZSBjdXJzb3IuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkcKKwlib29sICJDb21tYW5kIGxpbmUgZWRpdGluZyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgbGluZSBlZGl0aW5nIChtYWlubHkgZm9yIHNoZWxsIGNvbW1hbmQgbGluZSkuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfTUFYX0xFTgorCWludCAiTWF4aW11bSBsZW5ndGggb2YgaW5wdXQiCisJcmFuZ2UgMTI4IDgxOTIKKwlkZWZhdWx0IDEwMjQKKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIExpbmUgZWRpdGluZyBjb2RlIHVzZXMgb24tc3RhY2sgYnVmZmVycyBmb3Igc3RvcmFnZS4KKwkgIFlvdSBtYXkgd2FudCB0byBkZWNyZWFzZSB0aGlzIHBhcmFtZXRlciBpZiB5b3VyIHRhcmdldCBtYWNoaW5lCisJICBiZW5lZml0cyBmcm9tIHNtYWxsZXIgc3RhY2sgdXNhZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfVkkKKwlib29sICJ2aS1zdHlsZSBsaW5lIGVkaXRpbmcgY29tbWFuZHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkcKKwloZWxwCisJICBFbmFibGUgdmktc3R5bGUgbGluZSBlZGl0aW5nLiBJbiBzaGVsbHMsIHRoaXMgbW9kZSBjYW4gYmUKKwkgIHR1cm5lZCBvbiBhbmQgb2ZmIHdpdGggInNldCAtbyB2aSIgYW5kICJzZXQgK28gdmkiLgorCitjb25maWcgRkVBVFVSRV9FRElUSU5HX0hJU1RPUlkKKwlpbnQgIkhpc3Rvcnkgc2l6ZSIKKwkjIERvbid0IGFsbG93IHdheSB0b28gYmlnIHZhbHVlcyBoZXJlLCBjb2RlIHVzZXMgZml4ZWQgImNoYXIgKmhpc3RvcnlbTl0iIHN0cnVjdCBtZW1iZXIKKwlyYW5nZSAwIDk5OTkKKwlkZWZhdWx0IDI1NQorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgU3BlY2lmeSBjb21tYW5kIGhpc3Rvcnkgc2l6ZSAoMCAtIGRpc2FibGUpLgorCitjb25maWcgRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJYm9vbCAiSGlzdG9yeSBzYXZpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkcKKwloZWxwCisJICBFbmFibGUgaGlzdG9yeSBzYXZpbmcgaW4gc2hlbGxzLgorCitjb25maWcgRkVBVFVSRV9SRVZFUlNFX1NFQVJDSAorCWJvb2wgIlJldmVyc2UgaGlzdG9yeSBzZWFyY2giCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwloZWxwCisJICBFbmFibGUgcmVhZGxpbmUtbGlrZSBDdHJsLVIgY29tYmluYXRpb24gZm9yIHJldmVyc2UgaGlzdG9yeSBzZWFyY2guCisJICBJbmNyZWFzZXMgY29kZSBieSBhYm91dCAwLjVrLgorCitjb25maWcgRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCWJvb2wgIlRhYiBjb21wbGV0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgRW5hYmxlIHRhYiBjb21wbGV0aW9uLgorCitjb25maWcgRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OCisJYm9vbCAiVXNlcm5hbWUgY29tcGxldGlvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwloZWxwCisJICBFbmFibGUgdXNlcm5hbWUgY29tcGxldGlvbi4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKKwlib29sICJGYW5jeSBzaGVsbCBwcm9tcHRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgU2V0dGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgZm9yIHByb21wdHMgdG8gdXNlIHRoaW5ncyBsaWtlIFx3IGFuZAorCSAgXCQgYW5kIGVzY2FwZSBjb2Rlcy4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwKKwlib29sICJRdWVyeSBjdXJzb3IgcG9zaXRpb24gZnJvbSB0ZXJtaW5hbCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIEFsbG93IHVzYWdlIG9mICJFU0MgWyA2IG4iIHNlcXVlbmNlLiBUZXJtaW5hbCBhbnN3ZXJzIGJhY2sgd2l0aAorCSAgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBtYWtlIGxpbmUKKwkgIGVkaXRpbmcgbW9yZSByb2J1c3QgaW4gc29tZSBjYXNlcy4KKwkgIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3VyIHRlcm1pbmFscyByZXNwb25kIHRvIHRoaXMgY29kZQorCSAgY29ycmVjdGx5LCBvciB3YW50IHRvIHNhdmUgb24gY29kZSBzaXplIChhYm91dCA0MDAgYnl0ZXMpLAorCSAgdGhlbiBkbyBub3QgdHVybiB0aGlzIG9wdGlvbiBvbi4KKworY29uZmlnIEZFQVRVUkVfTk9OX1BPU0lYX0NQCisJYm9vbCAiTm9uLVBPU0lYLCBidXQgc2FmZXIsIGNvcHlpbmcgdG8gc3BlY2lhbCBub2RlcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uLCAiY3AgZmlsZSBzeW1saW5rIiB3aWxsIGRlbGV0ZSBzeW1saW5rCisJICBhbmQgY3JlYXRlIGEgcmVndWxhciBmaWxlLiBUaGlzIGRvZXMgbm90IGNvbmZvcm0gdG8gUE9TSVgsCisJICBidXQgcHJldmVudHMgYSBzeW1saW5rIGF0dGFjay4KKwkgIFNpbWlsYXJseSwgImNwIGZpbGUgZGV2aWNlIiB3aWxsIG5vdCBzZW5kIGZpbGUncyBkYXRhCisJICB0byB0aGUgZGV2aWNlLiAoVG8gZG8gdGhhdCwgdXNlICJjYXQgZmlsZSA+ZGV2aWNlIikKKworY29uZmlnIEZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFCisJYm9vbCAiR2l2ZSBtb3JlIHByZWNpc2UgbWVzc2FnZXMgd2hlbiBjb3B5IGZhaWxzIChjcCwgbXYgZXRjKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFcnJvciBtZXNzYWdlcyB3aXRoIHRoaXMgZmVhdHVyZSBlbmFibGVkOgorCSAgICAkIGNwIGZpbGUgL2RvZXNfbm90X2V4aXN0L2ZpbGUKKwkgICAgY3A6IGNhbm5vdCBjcmVhdGUgJy9kb2VzX25vdF9leGlzdC9maWxlJzogUGF0aCBkb2VzIG5vdCBleGlzdAorCSAgICAkIGNwIGZpbGUgL3ZtbGludXovZmlsZQorCSAgICBjcDogY2Fubm90IHN0YXQgJy92bWxpbnV6L2ZpbGUnOiBQYXRoIGhhcyBub24tZGlyZWN0b3J5IGNvbXBvbmVudAorCSAgSWYgdGhpcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB0aGV5IHdpbGwgYmUsIHJlc3BlY3RpdmVseToKKwkgICAgY3A6IGNhbm5vdCBjcmVhdGUgJy9kb2VzX25vdF9leGlzdC9maWxlJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorCSAgICBjcDogY2Fubm90IHN0YXQgJy92bWxpbnV6L2ZpbGUnOiBOb3QgYSBkaXJlY3RvcnkKKwkgIFRoaXMgd2lsbCBjb3N0IHlvdSB+NjAgYnl0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX0NPUFlCVUZfS0IKKwlpbnQgIkNvcHkgYnVmZmVyIHNpemUsIGluIGtpbG9ieXRlcyIKKwlyYW5nZSAxIDEwMjQKKwlkZWZhdWx0IDQKKwloZWxwCisJICBTaXplIG9mIGJ1ZmZlciB1c2VkIGJ5IGNwLCBtdiwgaW5zdGFsbCwgd2dldCBldGMuCisJICBCdWZmZXJzIHdoaWNoIGFyZSA0IGtiIG9yIGxlc3Mgd2lsbCBiZSBhbGxvY2F0ZWQgb24gc3RhY2suCisJICBCaWdnZXIgYnVmZmVycyB3aWxsIGJlIGFsbG9jYXRlZCB3aXRoIG1tYXAsIHdpdGggZmFsbGJhY2sgdG8gNCBrYgorCSAgc3RhY2sgYnVmZmVyIGlmIG1tYXAgZmFpbHMuCisKK2NvbmZpZyBGRUFUVVJFX1NLSVBfUk9PVEZTCisJYm9vbCAiU2tpcCByb290ZnMgaW4gbW91bnQgdGFibGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWdub3JlIHJvb3RmcyBlbnRyeSBpbiBtb3VudCB0YWJsZS4KKworCSAgSW4gTGludXgsIGtlcm5lbCBoYXMgYSBzcGVjaWFsIGZpbGVzeXN0ZW0sIHJvb3Rmcywgd2hpY2ggaXMgaW5pdGlhbGx5CisJICBtb3VudGVkIG9uIC8uIEl0IGNvbnRhaW5zIGluaXRyYW1mcyBkYXRhLCBpZiBrZXJuZWwgaXMgY29uZmlndXJlZAorCSAgdG8gaGF2ZSBvbmUuIFVzdWFsbHksIGFub3RoZXIgZmlsZSBzeXN0ZW0gaXMgbW91bnRlZCBvdmVyIC8gZWFybHkKKwkgIGluIGJvb3QgcHJvY2VzcywgYW5kIHRoZXJlZm9yZSBtb3N0IHRvb2xzIHdoaWNoIG1hbmlwdWxhdGUKKwkgIG1vdW50IHRhYmxlLCBzdWNoIGFzIGRmLCB3aWxsIHNraXAgcm9vdGZzIGVudHJ5LgorCisJICBIb3dldmVyLCBzb21lIHN5c3RlbXMgZG8gbm90IG1vdW50IGFueXRoaW5nIG9uIC8uCisJICBJZiB5b3UgbmVlZCB0byBjb25maWd1cmUgYnVzeWJveCBmb3Igb25lIG9mIHRoZXNlIHN5c3RlbXMsCisJICB5b3UgbWF5IGZpbmQgdXNlZnVsIHRvIHR1cm4gdGhpcyBvcHRpb24gb2ZmIHRvIG1ha2UgZGYgc2hvdworCSAgaW5pdHJhbWZzIHN0YXRpc3RpYy4KKworCSAgT3RoZXJ3aXNlLCBjaG9vc2UgWS4KKworY29uZmlnIE1PTk9UT05JQ19TWVNDQUxMCisJYm9vbCAiVXNlIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBzeXNjYWxsIgorCWRlZmF1bHQgbgorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFVzZSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykgc3lzY2FsbCBmb3IgbWVhc3VyaW5nCisJICB0aW1lIGludGVydmFscyAodGltZSwgcGluZywgdHJhY2Vyb3V0ZSBldGMgbmVlZCB0aGlzKS4KKwkgIFByb2JhYmx5IHJlcXVpcmVzIExpbnV4IDIuNisuIElmIG5vdCBzZWxlY3RlZCwgZ2V0dGltZW9mZGF5CisJICB3aWxsIGJlIHVzZWQgaW5zdGVhZCAod2hpY2ggZ2l2ZXMgd3JvbmcgcmVzdWx0cyBpZiBkYXRlL3RpbWUKKwkgIGlzIHJlc2V0KS4KKworY29uZmlnIElPQ1RMX0hFWDJTVFJfRVJST1IKKwlib29sICJVc2UgaW9jdGwgbmFtZXMgcmF0aGVyIHRoYW4gaGV4IHZhbHVlcyBpbiBlcnJvciBtZXNzYWdlcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVc2UgaW9jdGwgbmFtZXMgcmF0aGVyIHRoYW4gaGV4IHZhbHVlcyBpbiBlcnJvciBtZXNzYWdlcworCSAgKGUuZy4gVlRfRElTQUxMT0NBVEUgcmF0aGVyIHRoYW4gMHg1NjA4KS4gSWYgZGlzYWJsZWQgdGhpcworCSAgc2F2ZXMgYWJvdXQgMTQwMCBieXRlcy4KKworY29uZmlnIEZFQVRVUkVfSFdJQgorCWJvb2wgIlN1cHBvcnQgaW5maW5pYmFuZCBIVyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTdXBwb3J0IGZvciBwcmludGluZyBpbmZpbmliYW5kIGFkZHJlc3NlcyBpbgorCSAgbmV0d29yayBhcHBsZXRzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzVkMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE4MiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYmJiL2FwcGxldGxpYi5vOiBpbmNsdWRlL3VzYWdlX2NvbXByZXNzZWQuaAorCitsaWIteTo9CisKK0lOU0VSVAorCitsaWIteSArPSBhcHBsZXRsaWIubworbGliLXkgKz0gYXNrX2NvbmZpcm1hdGlvbi5vCitsaWIteSArPSBiYl9hc2twYXNzLm8KK2xpYi15ICs9IGJiX2Jzd2FwXzY0Lm8KK2xpYi15ICs9IGJiX2RvX2RlbGF5Lm8KK2xpYi15ICs9IGJiX3B3ZC5vCitsaWIteSArPSBiYl9xc29ydC5vCisjbGliLXkgKz0gYmJfc3RydG9kLm8KK2xpYi15ICs9IGJiX3N0cnRvbnVtLm8KK2xpYi15ICs9IGNoYW5nZV9pZGVudGl0eS5vCitsaWIteSArPSBjaG9tcC5vCitsaWIteSArPSBjb21wYXJlX3N0cmluZ19hcnJheS5vCitsaWIteSArPSBjb25jYXRfcGF0aF9maWxlLm8KK2xpYi15ICs9IGNvbmNhdF9zdWJwYXRoX2ZpbGUubworbGliLXkgKz0gY29weV9maWxlLm8KK2xpYi15ICs9IGNvcHlmZC5vCitsaWIteSArPSBjcmMzMi5vCitsaWIteSArPSBjcmVhdGVfaWNtcDZfc29ja2V0Lm8KK2xpYi15ICs9IGNyZWF0ZV9pY21wX3NvY2tldC5vCitsaWIteSArPSBkZWZhdWx0X2Vycm9yX3JldHZhbC5vCitsaWIteSArPSBkZXZpY2Vfb3Blbi5vCitsaWIteSArPSBkdW1wLm8KK2xpYi15ICs9IGV4ZWNhYmxlLm8KK2xpYi15ICs9IGZjbG9zZV9ub25zdGRpbi5vCitsaWIteSArPSBmZmx1c2hfc3Rkb3V0X2FuZF9leGl0Lm8KK2xpYi15ICs9IGZnZXRzX3N0ci5vCitsaWIteSArPSBmaW5kX3BpZF9ieV9uYW1lLm8KK2xpYi15ICs9IGZpbmRfcm9vdF9kZXZpY2UubworbGliLXkgKz0gZnVsbF93cml0ZS5vCitsaWIteSArPSBnZXRfY29uc29sZS5vCitsaWIteSArPSBnZXRfbGFzdF9wYXRoX2NvbXBvbmVudC5vCitsaWIteSArPSBnZXRfbGluZV9mcm9tX2ZpbGUubworbGliLXkgKz0gZ2V0b3B0MzIubworbGliLXkgKz0gZ2V0cHR5Lm8KK2xpYi15ICs9IGdldF92b2xzaXplLm8KK2xpYi15ICs9IGhlcnJvcl9tc2cubworbGliLXkgKz0gaHVtYW5fcmVhZGFibGUubworbGliLXkgKz0gaW5ldF9jb21tb24ubworbGliLXkgKz0gaW5mb19tc2cubworbGliLXkgKz0gaW5vZGVfaGFzaC5vCitsaWIteSArPSBpc2RpcmVjdG9yeS5vCitsaWIteSArPSBrZXJuZWxfdmVyc2lvbi5vCitsaWIteSArPSBsYXN0X2NoYXJfaXMubworbGliLXkgKz0gbGluZWVkaXQubyBsaW5lZWRpdF9wdHJfaGFjay5vCitsaWIteSArPSBsbGlzdC5vCitsaWIteSArPSBsb2dpbi5vCitsaWIteSArPSBtYWtlX2RpcmVjdG9yeS5vCitsaWIteSArPSBtYWtlZGV2Lm8KK2xpYi15ICs9IGhhc2hfbWQ1X3NoYS5vCisjIEFsdGVybmF0aXZlIChkaXNhYmxlZCkgTUQ1IGltcGxlbWVudGF0aW9uCisjbGliLXkgKz0gaGFzaF9tZDVwcmltZS5vCitsaWIteSArPSBtZXNzYWdlcy5vCitsaWIteSArPSBtb2RlX3N0cmluZy5vCitsaWIteSArPSBwYXJzZV9tb2RlLm8KK2xpYi15ICs9IHBlcnJvcl9tc2cubworbGliLXkgKz0gcGVycm9yX25vbXNnLm8KK2xpYi15ICs9IHBlcnJvcl9ub21zZ19hbmRfZGllLm8KK2xpYi15ICs9IHBpZGZpbGUubworbGliLXkgKz0gcGxhdGZvcm0ubworbGliLXkgKz0gcHJpbnRhYmxlLm8KK2xpYi15ICs9IHByaW50YWJsZV9zdHJpbmcubworbGliLXkgKz0gcHJpbnRfZmxhZ3MubworbGliLXkgKz0gcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UubworbGliLXkgKz0gcHJvY3BzLm8KK2xpYi15ICs9IHByb2dyZXNzLm8KK2xpYi15ICs9IHB0cl90b19nbG9iYWxzLm8KK2xpYi15ICs9IHJlYWQubworbGliLXkgKz0gcmVhZF9wcmludGYubworbGliLXkgKz0gcmVhZF9rZXkubworbGliLXkgKz0gcmVjdXJzaXZlX2FjdGlvbi5vCitsaWIteSArPSByZW1vdmVfZmlsZS5vCitsaWIteSArPSBydW5fc2hlbGwubworbGliLXkgKz0gc2FmZV9nZXRob3N0bmFtZS5vCitsaWIteSArPSBzYWZlX3BvbGwubworbGliLXkgKz0gc2FmZV9zdHJuY3B5Lm8KK2xpYi15ICs9IHNhZmVfd3JpdGUubworbGliLXkgKz0gc2V0dXBfZW52aXJvbm1lbnQubworbGliLXkgKz0gc2lnbmFscy5vCitsaWIteSArPSBzaW1wbGlmeV9wYXRoLm8KK2xpYi15ICs9IHNpbmdsZV9hcmd2Lm8KK2xpYi15ICs9IHNraXBfd2hpdGVzcGFjZS5vCitsaWIteSArPSBzcGVlZF90YWJsZS5vCitsaWIteSArPSBzdHJfdG9sb3dlci5vCitsaWIteSArPSBzdHJyc3RyLm8KK2xpYi15ICs9IHRpbWUubworbGliLXkgKz0gdHJpbS5vCitsaWIteSArPSB1X3NpZ25hbF9uYW1lcy5vCitsaWIteSArPSB1dWVuY29kZS5vCitsaWIteSArPSB2ZHByaW50Zi5vCitsaWIteSArPSB2ZXJyb3JfbXNnLm8KK2xpYi15ICs9IHZmb3JrX2RhZW1vbl9yZXhlYy5vCitsaWIteSArPSB3YXJuX2lnbm9yaW5nX2FyZ3MubworbGliLXkgKz0gd2ZvcGVuLm8KK2xpYi15ICs9IHdmb3Blbl9pbnB1dC5vCitsaWIteSArPSB3cml0ZS5vCitsaWIteSArPSB4YXRvbnVtLm8KK2xpYi15ICs9IHhjb25uZWN0Lm8KK2xpYi15ICs9IHhmdW5jcy5vCitsaWIteSArPSB4ZnVuY3NfcHJpbnRmLm8KK2xpYi15ICs9IHhmdW5jX2RpZS5vCitsaWIteSArPSB4Z2V0Y3dkLm8KK2xpYi15ICs9IHhnZXRob3N0YnluYW1lLm8KK2xpYi15ICs9IHhyZWFkbGluay5vCitsaWIteSArPSB4cmVhbGxvY192ZWN0b3IubworCitsaWItJChDT05GSUdfUExBVEZPUk1fTElOVVgpICs9IG1hdGNoX2ZzdHlwZS5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX1VUTVApICs9IHV0bXAubworCisjIEEgbWl4IG9mIG9wdGltaXphdGlvbnMgKHdoeSBidWlsZCBzdHVmZiB3ZSBrbm93IHdvbid0IGJlIHVzZWQpCisjIGFuZCBvYmplY3RzIHdoaWNoIG1heSBmYWlsIHRvIGJ1aWxkIChTRUxpbnV4IG9uIHNlbGludXgtbGVzcyBzeXN0ZW0pCitsaWItJChDT05GSUdfU0VMSU5VWCkgKz0gc2VsaW51eF9jb21tb24ubworbGliLSQoQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKSArPSBtdGFiLm8KK2xpYi0kKENPTkZJR19VTklDT0RFX1NVUFBPUlQpICs9IHVuaWNvZGUubworbGliLSQoQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMpICs9IGRpZV9pZl9iYWRfdXNlcm5hbWUubworCitsaWItJChDT05GSUdfTkMpICs9IHVkcF9pby5vCitsaWItJChDT05GSUdfRE5TRCkgKz0gdWRwX2lvLm8KK2xpYi0kKENPTkZJR19OVFBEKSArPSB1ZHBfaW8ubworbGliLSQoQ09ORklHX1RGVFApICs9IHVkcF9pby5vCitsaWItJChDT05GSUdfVEZUUEQpICs9IHVkcF9pby5vCitsaWItJChDT05GSUdfVENQU1ZEKSArPSB1ZHBfaW8ubworbGliLSQoQ09ORklHX1VEUFNWRCkgKz0gdWRwX2lvLm8KK2xpYi0kKENPTkZJR19UUkFDRVJPVVRFKSArPSB1ZHBfaW8ubworCitsaWItJChDT05GSUdfTE9TRVRVUCkgKz0gbG9vcC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QKSArPSBsb29wLm8KKworbGliLSQoQ09ORklHX0FEREdST1VQKSArPSB1cGRhdGVfcGFzc3dkLm8KK2xpYi0kKENPTkZJR19BRERVU0VSKSArPSB1cGRhdGVfcGFzc3dkLm8KK2xpYi0kKENPTkZJR19ERUxHUk9VUCkgKz0gdXBkYXRlX3Bhc3N3ZC5vCitsaWItJChDT05GSUdfREVMVVNFUikgKz0gdXBkYXRlX3Bhc3N3ZC5vCisKK2xpYi0kKENPTkZJR19QQVNTV0QpICs9IHB3X2VuY3J5cHQubyB1cGRhdGVfcGFzc3dkLm8gb2JzY3VyZS5vCitsaWItJChDT05GSUdfQ0hQQVNTV0QpICs9IHB3X2VuY3J5cHQubyB1cGRhdGVfcGFzc3dkLm8KK2xpYi0kKENPTkZJR19DUllQVFBXKSArPSBwd19lbmNyeXB0Lm8KK2xpYi0kKENPTkZJR19TVUxPR0lOKSArPSBwd19lbmNyeXB0Lm8KK2xpYi0kKENPTkZJR19WTE9DSykgKz0gcHdfZW5jcnlwdC5vIGNvcnJlY3RfcGFzc3dvcmQubworbGliLSQoQ09ORklHX1NVKSArPSBwd19lbmNyeXB0Lm8gY29ycmVjdF9wYXNzd29yZC5vCitsaWItJChDT05GSUdfTE9HSU4pICs9IHB3X2VuY3J5cHQubyBjb3JyZWN0X3Bhc3N3b3JkLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KSArPSBwd19lbmNyeXB0Lm8KKworbGliLSQoQ09ORklHX0RGKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19NS0ZTX01JTklYKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19NS0ZTX0VYVDIpICs9IGZpbmRfbW91bnRfcG9pbnQubworbGliLSQoQ09ORklHX01LRlNfUkVJU0VSKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19GU0NLX01JTklYKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19NT1VOVCkgKz0gZmluZF9tb3VudF9wb2ludC5vCisKK2xpYi0kKENPTkZJR19IV0NMT0NLKSArPSBydGMubworbGliLSQoQ09ORklHX1JUQ1dBS0UpICs9IHJ0Yy5vCisKK2xpYi0kKENPTkZJR19JT1NUQVQpICs9IGdldF9jcHVfY291bnQubworbGliLSQoQ09ORklHX01QU1RBVCkgKz0gZ2V0X2NwdV9jb3VudC5vCitsaWItJChDT05GSUdfUE9XRVJUT1ApICs9IGdldF9jcHVfY291bnQubworCisjIFdlIHNob3VsZG4ndCBidWlsZCB4cmVnY29tcC5jIGlmIHdlIGRvbid0IG5lZWQgaXQgLSB0aGlzIGVuc3VyZXMgd2UgZG9uJ3QKKyMgcmVxdWlyZSByZWdleC5oIHRvIGJlIGluIHRoZSBpbmNsdWRlIGRpciBldmVuIGlmIHdlIGRvbid0IG5lZWQgaXQgdGhlcmVieQorIyBhbGxvd2luZyB1cyB0byBidWlsZCBidXN5Ym94IGV2ZW4gaWYgdWNsaWJjIHJlZ2V4IHN1cHBvcnQgaXMgZGlzYWJsZWQuCisKK2xpYi0kKENPTkZJR19BV0spICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19TRUQpICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19HUkVQKSArPSB4cmVnY29tcC5vCitsaWItJChDT05GSUdfRVhQUikgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX01ERVYpICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19MRVNTKSArPSB4cmVnY29tcC5vCitsaWItJChDT05GSUdfUEdSRVApICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19QS0lMTCkgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX0RFVkZTRCkgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWCkgKz0geHJlZ2NvbXAubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvUkVBRE1FIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjNkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9SRUFETUUKQEAgLTAsMCArMSwxMCBAQAorUGxlYXNlIHNlZSB0aGUgTElDRU5TRSBmaWxlIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gKEdQTHYyKQorCitsaWJiYiBpcyBCdXN5Qm94J3MgdXRpbGl0eSBsaWJyYXJ5LiAgQWxsIG9mIHRoaXMgc3R1ZmYgdXNlZCB0byBiZSBzdHVmZmVkIGludG8KK2Egc2luZ2xlIGZpbGUgbmFtZWQgdXRpbGl0eS5jLiAgV2hlbiBJIHNwbGl0IHV0aWxpdHkuYyB0byBjcmVhdGUgbGliYmIsIHNvbWUgb2YKK3RoZSB2ZXJ5IG9sZGVzdCBzdHVmZiBlbmRlZCB1cCB3aXRob3V0IHRoZWlyIG9yaWdpbmFsIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nCitpbmZvcm1hdGlvbiAod2hpY2ggaXMgbm93IGxvc3QgaW4gdGhlIG1pc3RzIG9mIHRpbWUpLiAgSWYgeW91IHNlZSBzb21ldGhpbmcKK3RoYXQgeW91IHdyb3RlIHRoYXQgaXMgbWlzLWF0dHJpYnV0ZWQsIGRvIGxldCBtZSBrbm93IHNvIHdlIGNhbiBmaXggdGhhdCB1cC4KKworCUVyaWsgQW5kZXJzZW4KKwk8YW5kZXJzZW5AY29kZXBvZXQub3JnPgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvYXBwbGV0bGliLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9hcHBsZXRsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU3YjRmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvYXBwbGV0bGliLmMKQEAgLTAsMCArMSw4MjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSB0b25zIG9mIGZvbGtzLiAgVHJhY2tpbmcgZG93biB3aG8gd3JvdGUgd2hhdAorICogaXNuJ3Qgc29tZXRoaW5nIEknbSBnb2luZyB0byB3b3JyeSBhYm91dC4uLiAgSWYgeW91IHdyb3RlIHNvbWV0aGluZworICogaGVyZSwgcGxlYXNlIGZlZWwgZnJlZSB0byBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gc2FzaCwgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IERhdmlkIEkuIEJlbGwKKyAqIFBlcm1pc3Npb24gaGFzIGJlZW4gZ3JhbnRlZCB0byByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlIHVuZGVyIEdQTC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFdlIGFyZSB0cnlpbmcgdG8gbm90IHVzZSBwcmludGYsIHRoaXMgYmVuZWZpdHMgdGhlIGNhc2Ugd2hlbiBzZWxlY3RlZAorICogYXBwbGV0cyBhcmUgcmVhbGx5IHNpbXBsZS4gRXhhbXBsZToKKyAqCisgKiAkIC4vYnVzeWJveAorICogLi4uCisgKiBDdXJyZW50bHkgZGVmaW5lZCBmdW5jdGlvbnM6CisgKiAgICAgICAgIGJhc2VuYW1lLCBmYWxzZSwgdHJ1ZQorICoKKyAqICQgc2l6ZSBidXN5Ym94CisgKiAgICB0ZXh0ICAgIGRhdGEgICAgIGJzcyAgICAgZGVjICAgICBoZXggZmlsZW5hbWUKKyAqICAgIDQ0NzMgICAgICA1MiAgICAgIDcyICAgIDQ1OTcgICAgMTFmNSBidXN5Ym94CisgKgorICogRkVBVFVSRV9JTlNUQUxMRVIgb3IgRkVBVFVSRV9TVUlEIHdpbGwgc3RpbGwgbGluayBwcmludGYgcm91dGluZXMgaW4uIDooCisgKi8KKyNpbmNsdWRlICJidXN5Ym94LmgiCisKKyNpZiAhKGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgXAorICAgICAgICB8fCBkZWZpbmVkKF9fQVBQTEVfXykgXAorICAgICkKKyMgaW5jbHVkZSA8bWFsbG9jLmg+IC8qIGZvciBtYWxsb3B0ICovCisjZW5kaWYKKworCisvKiBEZWNsYXJlIDxhcHBsZXQ+X21haW4oKSAqLworI2RlZmluZSBQUk9UT1RZUEVTCisjaW5jbHVkZSAiYXBwbGV0cy5oIgorI3VuZGVmIFBST1RPVFlQRVMKKworLyogSW5jbHVkZSBnZW5lcmF0ZWQgYXBwbGV0IG5hbWVzLCBwb2ludGVycyB0byA8YXBwbGV0Pl9tYWluLCBldGMgKi8KKyNpbmNsdWRlICJhcHBsZXRfdGFibGVzLmgiCisvKiAuLi5hbmQgaWYgYXBwbGV0X3RhYmxlcyBnZW5lcmF0b3Igc2F5cyB3ZSBoYXZlIG9ubHkgb25lIGFwcGxldC4uLiAqLworI2lmZGVmIFNJTkdMRV9BUFBMRVRfTUFJTgorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9JTkRJVklEVUFMCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9JTkRJVklEVUFMIDEKKyMgdW5kZWYgSUZfRkVBVFVSRV9JTkRJVklEVUFMCisjIGRlZmluZSBJRl9GRUFUVVJFX0lORElWSURVQUwoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKyNpbmNsdWRlICJ1c2FnZV9jb21wcmVzc2VkLmgiCisKKworI2lmIEVOQUJMRV9TSE9XX1VTQUdFICYmICFFTkFCTEVfRkVBVFVSRV9DT01QUkVTU19VU0FHRQorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfbWVzc2FnZXNbXSBBTElHTjEgPSBVTlBBQ0tFRF9VU0FHRTsKKyNlbHNlCisjIGRlZmluZSB1c2FnZV9tZXNzYWdlcyAwCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NPTVBSRVNTX1VTQUdFCisKK3N0YXRpYyBjb25zdCBjaGFyIHBhY2tlZF91c2FnZVtdIEFMSUdOMSA9IHsgUEFDS0VEX1VTQUdFIH07CisjIGluY2x1ZGUgImFyY2hpdmUuaCIKK3N0YXRpYyBjb25zdCBjaGFyICp1bnBhY2tfdXNhZ2VfbWVzc2FnZXModm9pZCkKK3sKKwljaGFyICpvdXRidWYgPSBOVUxMOworCWJ1bnppcF9kYXRhICpiZDsKKwlpbnQgaTsKKworCWkgPSBzdGFydF9idW56aXAoJmJkLAorCQkJLyogc3JjX2ZkOiAqLyAtMSwKKwkJCS8qIGluYnVmOiAgKi8gcGFja2VkX3VzYWdlLAorCQkJLyogbGVuOiAgICAqLyBzaXplb2YocGFja2VkX3VzYWdlKSk7CisJLyogcmVhZF9idW56aXAgY2FuIGxvbmdqbXAgdG8gc3RhcnRfYnVuemlwLCBhbmQgdWx0aW1hdGVseQorCSAqIGVuZCB1cCBoZXJlIHdpdGggaSAhPSAwIG9uIHJlYWQgZGF0YSBlcnJvcnMhIE5vdCB0cml2aWFsICovCisJaWYgKCFpKSB7CisJCS8qIENhbm5vdCB1c2UgeG1hbGxvYzogd2lsbCBsZWFrIGJkIGluIE5PRk9SSyBjYXNlISAqLworCQlvdXRidWYgPSBtYWxsb2Nfb3Jfd2FybihzaXplb2YoVU5QQUNLRURfVVNBR0UpKTsKKwkJaWYgKG91dGJ1ZikKKwkJCXJlYWRfYnVuemlwKGJkLCBvdXRidWYsIHNpemVvZihVTlBBQ0tFRF9VU0FHRSkpOworCX0KKwlkZWFsbG9jX2J1bnppcChiZCk7CisJcmV0dXJuIG91dGJ1ZjsKK30KKyMgZGVmaW5lIGRlYWxsb2NfdXNhZ2VfbWVzc2FnZXMocykgZnJlZShzKQorCisjZWxzZQorCisjIGRlZmluZSB1bnBhY2tfdXNhZ2VfbWVzc2FnZXMoKSB1c2FnZV9tZXNzYWdlcworIyBkZWZpbmUgZGVhbGxvY191c2FnZV9tZXNzYWdlcyhzKSAoKHZvaWQpKHMpKQorCisjZW5kaWYgLyogRkVBVFVSRV9DT01QUkVTU19VU0FHRSAqLworCisKK3ZvaWQgRkFTVF9GVU5DIGJiX3Nob3dfdXNhZ2Uodm9pZCkKK3sKKwlpZiAoRU5BQkxFX1NIT1dfVVNBR0UpIHsKKyNpZmRlZiBTSU5HTEVfQVBQTEVUX1NUUgorCQkvKiBJbWFnaW5lIHRoYXQgdGhpcyBhcHBsZXQgaXMgInRydWUiLiBEb250IHN1Y2sgaW4gcHJpbnRmISAqLworCQljb25zdCBjaGFyICp1c2FnZV9zdHJpbmcgPSB1bnBhY2tfdXNhZ2VfbWVzc2FnZXMoKTsKKworCQlpZiAoKnVzYWdlX3N0cmluZyA9PSAnXGInKSB7CisJCQlmdWxsX3dyaXRlMl9zdHIoIk5vIGhlbHAgYXZhaWxhYmxlLlxuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWZ1bGxfd3JpdGUyX3N0cigiVXNhZ2U6ICJTSU5HTEVfQVBQTEVUX1NUUiIgIik7CisJCQlmdWxsX3dyaXRlMl9zdHIodXNhZ2Vfc3RyaW5nKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cigiXG5cbiIpOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWRlYWxsb2NfdXNhZ2VfbWVzc2FnZXMoKGNoYXIqKXVzYWdlX3N0cmluZyk7CisjZWxzZQorCQljb25zdCBjaGFyICpwOworCQljb25zdCBjaGFyICp1c2FnZV9zdHJpbmcgPSBwID0gdW5wYWNrX3VzYWdlX21lc3NhZ2VzKCk7CisJCWludCBhcCA9IGZpbmRfYXBwbGV0X2J5X25hbWUoYXBwbGV0X25hbWUpOworCisJCWlmIChhcCA8IDApIC8qIG5ldmVyIGhhcHBlbnMsIHBhcmFub2lhICovCisJCQl4ZnVuY19kaWUoKTsKKwkJd2hpbGUgKGFwKSB7CisJCQl3aGlsZSAoKnArKykgY29udGludWU7CisJCQlhcC0tOworCQl9CisJCWZ1bGxfd3JpdGUyX3N0cihiYl9iYW5uZXIpOworCQlmdWxsX3dyaXRlMl9zdHIoIiBtdWx0aS1jYWxsIGJpbmFyeS5cbiIpOworCQlpZiAoKnAgPT0gJ1xiJykKKwkJCWZ1bGxfd3JpdGUyX3N0cigiXG5ObyBoZWxwIGF2YWlsYWJsZS5cblxuIik7CisJCWVsc2UgeworCQkJZnVsbF93cml0ZTJfc3RyKCJcblVzYWdlOiAiKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cihhcHBsZXRfbmFtZSk7CisJCQlmdWxsX3dyaXRlMl9zdHIoIiAiKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cihwKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cigiXG5cbiIpOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWRlYWxsb2NfdXNhZ2VfbWVzc2FnZXMoKGNoYXIqKXVzYWdlX3N0cmluZyk7CisjZW5kaWYKKwl9CisJeGZ1bmNfZGllKCk7Cit9CisKKyNpZiBOVU1fQVBQTEVUUyA+IDgKKy8qIE5COiBhbnkgY2hhciBwb2ludGVyIHdpbGwgd29yayBhcyB3ZWxsLCBub3QgbmVjZXNzYXJpbHkgYXBwbGV0X25hbWVzICovCitzdGF0aWMgaW50IGFwcGxldF9uYW1lX2NvbXBhcmUoY29uc3Qgdm9pZCAqbmFtZSwgY29uc3Qgdm9pZCAqdikKK3sKKwlpbnQgaSA9IChjb25zdCBjaGFyICopdiAtIGFwcGxldF9uYW1lczsKKwlyZXR1cm4gc3RyY21wKG5hbWUsIEFQUExFVF9OQU1FKGkpKTsKK30KKyNlbmRpZgoraW50IEZBU1RfRlVOQyBmaW5kX2FwcGxldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisjaWYgTlVNX0FQUExFVFMgPiA4CisJLyogRG8gYSBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIGFwcGxldCBlbnRyeSBnaXZlbiB0aGUgbmFtZS4gKi8KKwljb25zdCBjaGFyICpwOworCXAgPSBic2VhcmNoKG5hbWUsIGFwcGxldF9uYW1lcywgQVJSQVlfU0laRShhcHBsZXRfbWFpbiksIDEsIGFwcGxldF9uYW1lX2NvbXBhcmUpOworCWlmICghcCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBwIC0gYXBwbGV0X25hbWVzOworI2Vsc2UKKwkvKiBBIHZlcnNpb24gd2hpY2ggZG9lcyBub3QgcHVsbCBpbiBic2VhcmNoICovCisJaW50IGkgPSAwOworCWNvbnN0IGNoYXIgKnAgPSBhcHBsZXRfbmFtZXM7CisJd2hpbGUgKGkgPCBOVU1fQVBQTEVUUykgeworCQlpZiAoc3RyY21wKG5hbWUsIHApID09IDApCisJCQlyZXR1cm4gaTsKKwkJcCArPSBzdHJsZW4ocCkgKyAxOworCQlpKys7CisJfQorCXJldHVybiAtMTsKKyNlbmRpZgorfQorCisKK3ZvaWQgbGJiX3ByZXBhcmUoY29uc3QgY2hhciAqYXBwbGV0CisJCUlGX0ZFQVRVUkVfSU5ESVZJRFVBTCgsIGNoYXIgKiphcmd2KSkKKwkJCQlNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK3ZvaWQgbGJiX3ByZXBhcmUoY29uc3QgY2hhciAqYXBwbGV0CisJCUlGX0ZFQVRVUkVfSU5ESVZJRFVBTCgsIGNoYXIgKiphcmd2KSkKK3sKKyNpZmRlZiBfX0dMSUJDX18KKwkoKihpbnQgKiopJmJiX2Vycm5vKSA9IF9fZXJybm9fbG9jYXRpb24oKTsKKwliYXJyaWVyKCk7CisjZW5kaWYKKwlhcHBsZXRfbmFtZSA9IGFwcGxldDsKKworCS8qIFNldCBsb2NhbGUgZm9yIGV2ZXJ5Ym9keSBleGNlcHQgJ2luaXQnICovCisJaWYgKEVOQUJMRV9MT0NBTEVfU1VQUE9SVCAmJiBnZXRwaWQoKSAhPSAxKQorCQlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkRJVklEVUFMCisJLyogUmVkdW5kYW50IGZvciBidXN5Ym94IChydW5fYXBwbGV0X2FuZF9leGl0IGNvdmVycyB0aGF0IGNhc2UpCisJICogYnV0IG5lZWRlZCBmb3IgImluZGl2aWR1YWwgYXBwbGV0IiBtb2RlICovCisJaWYgKGFyZ3ZbMV0KKwkgJiYgIWFyZ3ZbMl0KKwkgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwCisJICYmIHN0cm5jbXAoYXBwbGV0LCAiYnVzeWJveCIsIDcpICE9IDAKKwkpIHsKKwkJLyogU3BlY2lhbCBjYXNlLiBQT1NJWCBzYXlzICJ0ZXN0IC0taGVscCIKKwkJICogc2hvdWxkIGJlIG5vIGRpZmZlcmVudCBmcm9tIGUuZy4gInRlc3QgLS1mb28iLiAgKi8KKwkJaWYgKCFFTkFCTEVfVEVTVCB8fCBzdHJjbXAoYXBwbGV0X25hbWUsICJ0ZXN0IikgIT0gMCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisjZW5kaWYKK30KKworLyogVGhlIGNvZGUgYmVsb3cgY2FuIHdlbGwgYmUgaW4gYXBwbGV0cy9hcHBsZXRzLmMsIGFzIGl0IGlzIHVzZWQgb25seQorICogZm9yIGJ1c3lib3ggYmluYXJ5LCBub3QgImluZGl2aWR1YWwiIGJpbmFyaWVzLgorICogSG93ZXZlciwga2VlcGluZyBpdCBoZXJlIGFuZCBsaW5raW5nIGl0IGludG8gbGliYnVzeWJveC5zbworICogKHRvZ2V0aGVyIHdpdGggcmVtYWluaW5nIHRpbnkgYXBwbGV0cy9hcHBsZXRzLm8pCisgKiBtYWtlcyBpdCBwb3NzaWJsZSB0byBhdm9pZCAtLXdob2xlLWFyY2hpdmUgYXQgbGluayB0aW1lLgorICogVGhpcyBtYWtlcyAoc2hhcmVkIGJ1c3lib3gpICsgbGliYnVzeWJveCBzbWFsbGVyLgorICogKC0tZ2Mtc2VjdGlvbnMgd291bGQgYmUgZXZlbiBiZXR0ZXIuLi4uKQorICovCisKK2NvbnN0IGNoYXIgKmFwcGxldF9uYW1lOworI2lmICFCQl9NTVUKK2Jvb2wgcmVfZXhlY2VkOworI2VuZGlmCisKKworLyogSWYgbm90IGJ1aWx0IGFzIGEgc2luZ2xlLWFwcGxldCBleGVjdXRhYmxlLi4uICovCisjaWYgIWRlZmluZWQoU0lOR0xFX0FQUExFVF9NQUlOKQorCitJRl9GRUFUVVJFX1NVSUQoc3RhdGljIHVpZF90IHJ1aWQ7KSAgLyogcmVhbCB1aWQgKi8KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9TVUlEX0NPTkZJRworCitzdGF0aWMgc3RydWN0IHN1aWRfY29uZmlnX3QgeworCS8qIG5leHQgcHRyIG11c3QgYmUgZmlyc3Q6IHRoaXMgc3RydWN0IG5lZWRzIHRvIGJlIGxsaXN0LWNvbXBhdGlibGUgKi8KKwlzdHJ1Y3Qgc3VpZF9jb25maWdfdCAqbV9uZXh0OworCXN0cnVjdCBiYl91aWRnaWRfdCBtX3VnaWQ7CisJaW50IG1fYXBwbGV0OworCW1vZGVfdCBtX21vZGU7Cit9ICpzdWlkX2NvbmZpZzsKKworc3RhdGljIGJvb2wgc3VpZF9jZmdfcmVhZGFibGU7CisKKy8qIGNoZWNrIGlmIHUgaXMgbWVtYmVyIG9mIGdyb3VwIGcgKi8KK3N0YXRpYyBpbnQgaW5ncm91cCh1aWRfdCB1LCBnaWRfdCBnKQoreworCXN0cnVjdCBncm91cCAqZ3JwID0gZ2V0Z3JnaWQoZyk7CisJaWYgKGdycCkgeworCQljaGFyICoqbWVtOworCQlmb3IgKG1lbSA9IGdycC0+Z3JfbWVtOyAqbWVtOyBtZW0rKykgeworCQkJc3RydWN0IHBhc3N3ZCAqcHdkID0gZ2V0cHduYW0oKm1lbSk7CisJCQlpZiAocHdkICYmIChwd2QtPnB3X3VpZCA9PSB1KSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogbGliYmIgY2FuZGlkYXRlICovCitzdGF0aWMgY2hhciAqZ2V0X3RyaW1tZWRfc2xpY2UoY2hhciAqcywgY2hhciAqZSkKK3sKKwkvKiBGaXJzdCwgY29uc2lkZXIgdGhlIHZhbHVlIGF0IGUgdG8gYmUgbnVsIGFuZCBiYWNrIHVwIHVudGlsIHdlCisJICogcmVhY2ggYSBub24tc3BhY2UgY2hhci4gIFNldCB0aGUgY2hhciBhZnRlciB0aGF0IChwb3NzaWJseSBhdAorCSAqIHRoZSBvcmlnaW5hbCBlKSB0byBudWwuICovCisJd2hpbGUgKGUtLSA+IHMpIHsKKwkJaWYgKCFpc3NwYWNlKCplKSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJZVsxXSA9ICdcMCc7CisKKwkvKiBOZXh0LCBhZHZhbmNlIHBhc3QgYWxsIGxlYWRpbmcgc3BhY2UgYW5kIHJldHVybiBhIHB0ciB0byB0aGUKKwkgKiBmaXJzdCBub24tc3BhY2UgY2hhcjsgcG9zc2libHkgdGhlIHRlcm1pbmF0aW5nIG51bC4gKi8KKwlyZXR1cm4gc2tpcF93aGl0ZXNwYWNlKHMpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9jb25maWdfZmlsZSh2b2lkKQoreworCS8qIERvbid0IGRlcGVuZCBvbiB0aGUgdG9vbHMgdG8gY29tYmluZSBzdHJpbmdzLiAqLworCXN0YXRpYyBjb25zdCBjaGFyIGNvbmZpZ19maWxlW10gQUxJR04xID0gIi9ldGMvYnVzeWJveC5jb25mIjsKKworCXN0cnVjdCBzdWlkX2NvbmZpZ190ICpzY3RfaGVhZDsKKwlpbnQgYXBwbGV0X25vOworCUZJTEUgKmY7CisJY29uc3QgY2hhciAqZXJybXNnOworCXVuc2lnbmVkIGxjOworCXNtYWxsaW50IHNlY3Rpb247CisJc3RydWN0IHN0YXQgc3Q7CisKKwlydWlkID0gZ2V0dWlkKCk7CisJaWYgKHJ1aWQgPT0gMCkgLyogcnVuIGJ5IHJvb3QgLSBkb24ndCBuZWVkIHRvIGV2ZW4gcmVhZCBjb25maWcgZmlsZSAqLworCQlyZXR1cm47CisKKwlpZiAoKHN0YXQoY29uZmlnX2ZpbGUsICZzdCkgIT0gMCkgICAgICAgLyogTm8gY29uZmlnIGZpbGU/ICovCisJIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpICAgICAgICAgICAgICAgIC8qIE5vdCBhIHJlZ3VsYXIgZmlsZT8gKi8KKwkgfHwgKHN0LnN0X3VpZCAhPSAwKSAgICAgICAgICAgICAgICAgICAgLyogTm90IG93bmVkIGJ5IHJvb3Q/ICovCisJIHx8IChzdC5zdF9tb2RlICYgKFNfSVdHUlAgfCBTX0lXT1RIKSkgIC8qIFdyaXRhYmxlIGJ5IG5vbi1yb290PyAqLworCSB8fCAhKGYgPSBmb3Blbl9mb3JfcmVhZChjb25maWdfZmlsZSkpICAvKiBDYW5ub3Qgb3Blbj8gKi8KKwkpIHsKKwkJcmV0dXJuOworCX0KKworCXN1aWRfY2ZnX3JlYWRhYmxlID0gMTsKKwlzY3RfaGVhZCA9IE5VTEw7CisJc2VjdGlvbiA9IGxjID0gMDsKKworCXdoaWxlICgxKSB7CisJCWNoYXIgYnVmZmVyWzI1Nl07CisJCWNoYXIgKnM7CisKKwkJaWYgKCFmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmKSkgeyAvKiBBcmUgd2UgZG9uZT8gKi8KKwkJCS8vIExvb2tzIGxpa2UgYmxvYXQKKwkJCS8vaWYgKGZlcnJvcihmKSkgeyAgIC8qIE1ha2Ugc3VyZSBpdCB3YXNuJ3QgYSByZWFkIGVycm9yLiAqLworCQkJLy8JZXJybXNnID0gInJlYWRpbmciOworCQkJLy8JZ290byBwZV9sYWJlbDsKKwkJCS8vfQorCQkJZmNsb3NlKGYpOworCQkJc3VpZF9jb25maWcgPSBzY3RfaGVhZDsJLyogU3VjY2Vzcywgc28gc2V0IHRoZSBwb2ludGVyLiAqLworCQkJcmV0dXJuOworCQl9CisKKwkJcyA9IGJ1ZmZlcjsKKwkJbGMrKzsJCQkJCS8qIEdvdCBhIChwYXJ0aWFsKSBsaW5lLiAqLworCisJCS8qIElmIGEgbGluZSBpcyB0b28gbG9uZyBmb3Igb3VyIGJ1ZmZlciwgd2UgY29uc2lkZXIgaXQgYW4gZXJyb3IuCisJCSAqIFRoZSBmb2xsb3dpbmcgdGVzdCBkb2VzIG1pc3RyZWF0IG9uZSBjb3JuZXIgY2FzZSB0aG91Z2guCisJCSAqIElmIHRoZSBmaW5hbCBsaW5lIG9mIHRoZSBmaWxlIGRvZXMgbm90IGVuZCB3aXRoIGEgbmV3bGluZSBhbmQKKwkJICogeWV0IGV4YWN0bHkgZmlsbHMgdGhlIGJ1ZmZlciwgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIHRvbyBsb25nCisJCSAqIGV2ZW4gdGhvdWdoIHRoZXJlIGlzbid0IHJlYWxseSBhIHByb2JsZW0uICBCdXQgaXQgaXNuJ3QgcmVhbGx5CisJCSAqIHdvcnRoIGFkZGluZyBjb2RlIHRvIGRlYWwgd2l0aCBzdWNoIGFuIHVubGlrZWx5IHNpdHVhdGlvbiwgYW5kCisJCSAqIHdlIGRvIGVyciBvbiB0aGUgc2lkZSBvZiBjYXV0aW9uLiAgQmVzaWRlcywgdGhlIGxpbmUgd291bGQgYmUKKwkJICogdG9vIGxvbmcgaWYgaXQgZGlkIGVuZCB3aXRoIGEgbmV3bGluZS4gKi8KKwkJaWYgKCFzdHJjaHIocywgJ1xuJykgJiYgIWZlb2YoZikpIHsKKwkJCWVycm1zZyA9ICJsaW5lIHRvbyBsb25nIjsKKwkJCWdvdG8gcGVfbGFiZWw7CisJCX0KKworCQkvKiBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGlnbm9yaW5nIGNvbW1lbnRzLCBhbmQKKwkJICogY2hlY2sgaWYgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgZW1wdHkuICovCisJCXMgPSBnZXRfdHJpbW1lZF9zbGljZShzLCBzdHJjaHJudWwocywgJyMnKSk7CisJCWlmICghKnMpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIGEgc2VjdGlvbiBoZWFkZXIuICovCisKKwkJaWYgKCpzID09ICdbJykgeworCQkJLyogVW5saWtlIHRoZSBvbGQgY29kZSwgd2UgaWdub3JlIGxlYWRpbmcgYW5kIHRyYWlsaW5nCisJCQkgKiB3aGl0ZXNwYWNlIGZvciB0aGUgc2VjdGlvbiBuYW1lLiAgV2UgYWxzbyByZXF1aXJlIHRoYXQKKwkJCSAqIHRoZXJlIGFyZSBubyBzdHJheSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBjbG9zaW5nIGJyYWNrZXQuICovCisJCQljaGFyICplID0gc3RyY2hyKHMsICddJyk7CisJCQlpZiAoIWUgICAvKiBNaXNzaW5nIHJpZ2h0IGJyYWNrZXQ/ICovCisJCQkgfHwgZVsxXSAvKiBUcmFpbGluZyBjaGFyYWN0ZXJzPyAqLworCQkJIHx8ICEqKHMgPSBnZXRfdHJpbW1lZF9zbGljZShzKzEsIGUpKSAvKiBNaXNzaW5nIG5hbWU/ICovCisJCQkpIHsKKwkJCQllcnJtc2cgPSAic2VjdGlvbiBoZWFkZXIiOworCQkJCWdvdG8gcGVfbGFiZWw7CisJCQl9CisJCQkvKiBSaWdodCBub3cgd2Ugb25seSBoYXZlIG9uZSBzZWN0aW9uIHNvIGp1c3QgY2hlY2sgaXQuCisJCQkgKiBJZiBtb3JlIHNlY3Rpb25zIGFyZSBhZGRlZCBpbiB0aGUgZnV0dXJlLCBwbGVhc2UgZG9uJ3QKKwkJCSAqIHJlc29ydCB0byBjYXNjYWRpbmcgaWZzIHdpdGggbXVsdGlwbGUgc3RyY2FzZWNtcCBjYWxscy4KKwkJCSAqIFRoYXQga2luZCBvZiBibG9hdGVkIGNvZGUgaXMgYWxsIHRvbyBjb21tb24uICBBIGxvb3AKKwkJCSAqIGFuZCBhIHN0cmluZyB0YWJsZSB3b3VsZCBiZSBhIGJldHRlciBjaG9pY2UgdW5sZXNzIHRoZQorCQkJICogbnVtYmVyIG9mIHNlY3Rpb25zIGlzIHZlcnkgc21hbGwuICovCisJCQlpZiAoc3RyY2FzZWNtcChzLCAiU1VJRCIpID09IDApIHsKKwkJCQlzZWN0aW9uID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNlY3Rpb24gPSAtMTsJLyogVW5rbm93biBzZWN0aW9uIHNvIHNldCB0byBza2lwLiAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKiBQcm9jZXNzIHNlY3Rpb25zLiAqLworCisJCWlmIChzZWN0aW9uID09IDEpIHsJCS8qIFNVSUQgKi8KKwkJCS8qIFNpbmNlIHdlIHRyaW1tZWQgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UgYWJvdmUsIHdlJ3JlCisJCQkgKiBub3cgbG9va2luZyBmb3Igc3RyaW5ncyBvZiB0aGUgZm9ybQorCQkJICogICAgPGtleT5bOjpzcGFjZTo6XSo9Wzo6c3BhY2U6Ol0qPHZhbHVlPgorCQkJICogd2hlcmUgYm90aCBrZXkgYW5kIHZhbHVlIGNvdWxkIGNvbnRhaW4gaW5uZXIgd2hpdGVzcGFjZS4gKi8KKworCQkJLyogRmlyc3QgZ2V0IHRoZSBrZXkgKGFuIGFwcGxldCBuYW1lIGluIG91ciBjYXNlKS4gKi8KKwkJCWNoYXIgKmUgPSBzdHJjaHIocywgJz0nKTsKKwkJCWlmIChlKSB7CisJCQkJcyA9IGdldF90cmltbWVkX3NsaWNlKHMsIGUpOworCQkJfQorCQkJaWYgKCFlIHx8ICEqcykgewkvKiBNaXNzaW5nICc9JyBvciBlbXB0eSBrZXkuICovCisJCQkJZXJybXNnID0gImtleXdvcmQiOworCQkJCWdvdG8gcGVfbGFiZWw7CisJCQl9CisKKwkJCS8qIE9rLCB3ZSBoYXZlIGFuIGFwcGxldCBuYW1lLiAgUHJvY2VzcyB0aGUgcmhzIGlmIHRoaXMKKwkJCSAqIGFwcGxldCBpcyBjdXJyZW50bHkgYnVpbHQgaW4gYW5kIGlnbm9yZSBpdCBvdGhlcndpc2UuCisJCQkgKiBOb3RlOiB0aGlzIGNhbiBoaWRlIGNvbmZpZyBmaWxlIGJ1Z3Mgd2hpY2ggb25seSBwb3AKKwkJCSAqIHVwIHdoZW4gdGhlIGJ1c3lib3ggY29uZmlndXJhdGlvbiBpcyBjaGFuZ2VkLiAqLworCQkJYXBwbGV0X25vID0gZmluZF9hcHBsZXRfYnlfbmFtZShzKTsKKwkJCWlmIChhcHBsZXRfbm8gPj0gMCkgeworCQkJCXVuc2lnbmVkIGk7CisJCQkJc3RydWN0IHN1aWRfY29uZmlnX3QgKnNjdDsKKworCQkJCS8qIE5vdGU6IFdlIGN1cnJlbnRseSBkb24ndCBjaGVjayBmb3IgZHVwbGljYXRlcyEKKwkJCQkgKiBUaGUgbGFzdCBjb25maWcgbGluZSBmb3IgZWFjaCBhcHBsZXQgd2lsbCBiZSB0aGUKKwkJCQkgKiBvbmUgdXNlZCBzaW5jZSB3ZSBpbnNlcnQgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJCQkJICogSSBzdXBwb3NlIHRoaXMgY291bGQgYmUgY29uc2lkZXJlZCBhIGZlYXR1cmUuICovCisJCQkJc2N0ID0geHphbGxvYyhzaXplb2YoKnNjdCkpOworCQkJCXNjdC0+bV9hcHBsZXQgPSBhcHBsZXRfbm87CisJCQkJLypzY3QtPm1fbW9kZSA9IDA7Ki8KKwkJCQlzY3QtPm1fbmV4dCA9IHNjdF9oZWFkOworCQkJCXNjdF9oZWFkID0gc2N0OworCisJCQkJLyogR2V0IHRoZSBzcGVjaWZpZWQgbW9kZS4gKi8KKworCQkJCWUgPSBza2lwX3doaXRlc3BhY2UoZSsxKTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQkJLyogVGhlcmUgYXJlIDQgY2hhcnMgZm9yIGVhY2ggb2YgdXNlci9ncm91cC9vdGhlci4KKwkJCQkJICogIngteHgiIGluc3RlYWQgb2YgIngtIiBhcmUgdG8gbWFrZQorCQkJCQkgKiAiaWR4ID4gMyIgY2hlY2sgY2F0Y2ggaW52YWxpZCBjaGFycy4KKwkJCQkJICovCisJCQkJCXN0YXRpYyBjb25zdCBjaGFyIG1vZGVfY2hhcnNbXSBBTElHTjEgPSAiU3N4LSIgIlNzeC0iICJ4LXh4IjsKKwkJCQkJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG1vZGVfbWFza1tdIEFMSUdOMiA9IHsKKwkJCQkJCVNfSVNVSUQsIFNfSVNVSUR8U19JWFVTUiwgU19JWFVTUiwgMCwgLyogU3N4LSAqLworCQkJCQkJU19JU0dJRCwgU19JU0dJRHxTX0lYR1JQLCBTX0lYR1JQLCAwLCAvKiBTc3gtICovCisJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIFNfSVhPVEgsIDAgIC8qICAgeC0gKi8KKwkJCQkJfTsKKwkJCQkJY29uc3QgY2hhciAqcSA9IHN0cmNocm51bChtb2RlX2NoYXJzICsgNCppLCAqZSk7CisJCQkJCXVuc2lnbmVkIGlkeCA9IHEgLSAobW9kZV9jaGFycyArIDQqaSk7CisJCQkJCWlmIChpZHggPiAzKSB7CisJCQkJCQllcnJtc2cgPSAibW9kZSI7CisJCQkJCQlnb3RvIHBlX2xhYmVsOworCQkJCQl9CisJCQkJCXNjdC0+bV9tb2RlIHw9IG1vZGVfbWFza1txIC0gbW9kZV9jaGFyc107CisJCQkJCWUrKzsKKwkJCQl9CisKKwkJCQkvKiBOb3cgZ2V0IHRoZSB1c2VyL2dyb3VwIGluZm8uICovCisKKwkJCQlzID0gc2tpcF93aGl0ZXNwYWNlKGUpOworCQkJCS8qIERlZmF1bHQgaXMgMC4wLCBlbHNlIHBhcnNlIFVTRVIuR1JPVVA6ICovCisJCQkJaWYgKCpzKSB7CisJCQkJCS8qIFdlIHJlcXVpcmUgd2hpdGVzcGFjZSBiZXR3ZWVuIG1vZGUgYW5kIFVTRVIuR1JPVVAgKi8KKwkJCQkJaWYgKChzID09IGUpIHx8ICEoZSA9IHN0cmNocihzLCAnLicpKSkgeworCQkJCQkJZXJybXNnID0gInVpZC5naWQiOworCQkJCQkJZ290byBwZV9sYWJlbDsKKwkJCQkJfQorCQkJCQkqZSA9ICc6JzsgLyogZ2V0X3VpZGdpZCBuZWVkcyBVU0VSOkdST1VQIHN5bnRheCAqLworCQkJCQlpZiAoZ2V0X3VpZGdpZCgmc2N0LT5tX3VnaWQsIHMsIC8qYWxsb3dfbnVtZXJpYzoqLyAxKSA9PSAwKSB7CisJCQkJCQllcnJtc2cgPSAidW5rbm93biB1c2VyL2dyb3VwIjsKKwkJCQkJCWdvdG8gcGVfbGFiZWw7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFVua25vd24gc2VjdGlvbnMgYXJlIGlnbm9yZWQuICovCisKKwkJLyogRW5jb3VudGVyaW5nIGNvbmZpZ3VyYXRpb24gbGluZXMgcHJpb3IgdG8gc2VlaW5nIGEKKwkJICogc2VjdGlvbiBoZWFkZXIgaXMgdHJlYXRlZCBhcyBhbiBlcnJvci4gIFRoaXMgaXMgaG93CisJCSAqIHRoZSBvbGQgY29kZSB3b3JrZWQsIGJ1dCBpdCBtYXkgbm90IGJlIGRlc2lyYWJsZS4KKwkJICogV2UgbWF5IHdhbnQgdG8gc2ltcGx5IGlnbm9yZSBzdWNoIGxpbmVzIGluIGNhc2UgdGhleQorCQkgKiBhcmUgdXNlZCBpbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIG9mIGJ1c3lib3guICovCisJCWlmICghc2VjdGlvbikgeworCQkJZXJybXNnID0gImtleXdvcmQgb3V0c2lkZSBzZWN0aW9uIjsKKwkJCWdvdG8gcGVfbGFiZWw7CisJCX0KKworCX0gLyogd2hpbGUgKDEpICovCisKKyBwZV9sYWJlbDoKKwlmY2xvc2UoZik7CisJYmJfZXJyb3JfbXNnKCJwYXJzZSBlcnJvciBpbiAlcywgbGluZSAldTogJXMiLCBjb25maWdfZmlsZSwgbGMsIGVycm1zZyk7CisKKwkvKiBSZWxlYXNlIGFueSBhbGxvY2F0ZWQgbWVtb3J5IGJlZm9yZSByZXR1cm5pbmcuICovCisJbGxpc3RfZnJlZSgobGxpc3RfdCopc2N0X2hlYWQsIE5VTEwpOworfQorIyBlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUodm9pZCkKK3sKKwlJRl9GRUFUVVJFX1NVSUQocnVpZCA9IGdldHVpZCgpOykKK30KKyMgZW5kaWYgLyogRkVBVFVSRV9TVUlEX0NPTkZJRyAqLworCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRAorc3RhdGljIHZvaWQgY2hlY2tfc3VpZChpbnQgYXBwbGV0X25vKQoreworCWdpZF90IHJnaWQ7ICAvKiByZWFsIGdpZCAqLworCisJaWYgKHJ1aWQgPT0gMCkgLyogc2V0IGJ5IHBhcnNlX2NvbmZpZ19maWxlKCkgKi8KKwkJcmV0dXJuOyAvKiBydW4gYnkgcm9vdCAtIG5vIG5lZWQgdG8gY2hlY2sgbW9yZSAqLworCXJnaWQgPSBnZXRnaWQoKTsKKworIyAgaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRF9DT05GSUcKKwlpZiAoc3VpZF9jZmdfcmVhZGFibGUpIHsKKwkJdWlkX3QgdWlkOworCQlzdHJ1Y3Qgc3VpZF9jb25maWdfdCAqc2N0OworCQltb2RlX3QgbTsKKworCQlmb3IgKHNjdCA9IHN1aWRfY29uZmlnOyBzY3Q7IHNjdCA9IHNjdC0+bV9uZXh0KSB7CisJCQlpZiAoc2N0LT5tX2FwcGxldCA9PSBhcHBsZXRfbm8pCisJCQkJZ290byBmb3VuZDsKKwkJfQorCQlnb3RvIGNoZWNrX25lZWRfc3VpZDsKKyBmb3VuZDoKKwkJLyogSXMgdGhpcyB1c2VyIGFsbG93ZWQgdG8gcnVuIHRoaXMgYXBwbGV0PyAqLworCQltID0gc2N0LT5tX21vZGU7CisJCWlmIChzY3QtPm1fdWdpZC51aWQgPT0gcnVpZCkKKwkJCS8qIHNhbWUgdWlkICovCisJCQltID4+PSA2OworCQllbHNlIGlmICgoc2N0LT5tX3VnaWQuZ2lkID09IHJnaWQpIHx8IGluZ3JvdXAocnVpZCwgc2N0LT5tX3VnaWQuZ2lkKSkKKwkJCS8qIHNhbWUgZ3JvdXAgLyBpbiBncm91cCAqLworCQkJbSA+Pj0gMzsKKwkJaWYgKCEobSAmIFNfSVhPVEgpKSAvKiBpcyB4IGJpdCBub3Qgc2V0PyAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInlvdSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gcnVuIHRoaXMgYXBwbGV0Iik7CisKKwkJLyogV2Ugc2V0IGVmZmVjdGl2ZSBBTkQgc2F2ZWQgaWRzLiBJZiBzYXZlZC1pZCBpcyBub3Qgc2V0CisJCSAqIGxpa2Ugd2UgZG8gYmVsb3csIHNldGV1aWQoMCkgY2FuIHN0aWxsIGxhdGVyIHN1Y2NlZWQhICovCisKKwkJLyogQXJlIHdlIGRpcmVjdGVkIHRvIGNoYW5nZSBnaWQKKwkJICogKEFQUExFVCA9ICpzKiBVU0VSLkdST1VQIG9yIEFQUExFVCA9ICpTKiBVU0VSLkdST1VQKT8KKwkJICovCisJCWlmIChzY3QtPm1fbW9kZSAmIFNfSVNHSUQpCisJCQlyZ2lkID0gc2N0LT5tX3VnaWQuZ2lkOworCQkvKiBlbHNlOiB3ZSB3aWxsIHNldCBlZ2lkID0gcmdpZCwgdGh1cyBkcm9wcGluZyBzZ2lkIGVmZmVjdCAqLworCQlpZiAoc2V0cmVzZ2lkKC0xLCByZ2lkLCByZ2lkKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0cmVzZ2lkIik7CisKKwkJLyogQXJlIHdlIGRpcmVjdGVkIHRvIGNoYW5nZSB1aWQKKwkJICogKEFQUExFVCA9IHMqKiBVU0VSLkdST1VQIG9yIEFQUExFVCA9IFMqKiBVU0VSLkdST1VQKT8KKwkJICovCisJCXVpZCA9IHJ1aWQ7CisJCWlmIChzY3QtPm1fbW9kZSAmIFNfSVNVSUQpCisJCQl1aWQgPSBzY3QtPm1fdWdpZC51aWQ7CisJCS8qIGVsc2U6IHdlIHdpbGwgc2V0IGV1aWQgPSBydWlkLCB0aHVzIGRyb3BwaW5nIHN1aWQgZWZmZWN0ICovCisJCWlmIChzZXRyZXN1aWQoLTEsIHVpZCwgdWlkKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0cmVzdWlkIik7CisKKwkJZ290byByZXQ7CisJfQorIyAgIGlmICFFTkFCTEVfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVAorCXsKKwkJc3RhdGljIGJvb2wgb25ldGltZSA9IDA7CisKKwkJaWYgKCFvbmV0aW1lKSB7CisJCQlvbmV0aW1lID0gMTsKKwkJCWJiX2Vycm9yX21zZygidXNpbmcgZmFsbGJhY2sgc3VpZCBtZXRob2QiKTsKKwkJfQorCX0KKyMgICBlbmRpZgorIGNoZWNrX25lZWRfc3VpZDoKKyMgIGVuZGlmCisJaWYgKEFQUExFVF9TVUlEKGFwcGxldF9ubykgPT0gQkJfU1VJRF9SRVFVSVJFKSB7CisJCS8qIFJlYWwgdWlkIGlzIG5vdCAwLiBJZiBldWlkIGlzbid0IDAgdG9vLCBzdWlkIGJpdAorCQkgKiBpcyBtb3N0IHByb2JhYmx5IG5vdCBzZXQgb24gb3VyIGV4ZWN1dGFibGUgKi8KKwkJaWYgKGdldGV1aWQoKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtdXN0IGJlIHN1aWQgdG8gd29yayBwcm9wZXJseSIpOworCX0gZWxzZSBpZiAoQVBQTEVUX1NVSUQoYXBwbGV0X25vKSA9PSBCQl9TVUlEX0RST1ApIHsKKwkJeHNldGdpZChyZ2lkKTsgIC8qIGRyb3AgYWxsIHByaXZpbGVnZXMgKi8KKwkJeHNldHVpZChydWlkKTsKKwl9CisjICBpZiBFTkFCTEVfRkVBVFVSRV9TVUlEX0NPTkZJRworIHJldDogOworCWxsaXN0X2ZyZWUoKGxsaXN0X3QqKXN1aWRfY29uZmlnLCBOVUxMKTsKKyMgIGVuZGlmCit9CisjIGVsc2UKKyMgIGRlZmluZSBjaGVja19zdWlkKHgpICgodm9pZCkwKQorIyBlbmRpZiAvKiBGRUFUVVJFX1NVSUQgKi8KKworCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lOU1RBTExFUgorc3RhdGljIGNvbnN0IGNoYXIgdXNyX2JpbiBbXSBBTElHTjEgPSAiL3Vzci9iaW4vIjsKK3N0YXRpYyBjb25zdCBjaGFyIHVzcl9zYmluW10gQUxJR04xID0gIi91c3Ivc2Jpbi8iOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGluc3RhbGxfZGlyW10gPSB7CisJJnVzcl9iaW4gWzhdLCAvKiAiLyIgKi8KKwkmdXNyX2JpbiBbNF0sIC8qICIvYmluLyIgKi8KKwkmdXNyX3NiaW5bNF0gIC8qICIvc2Jpbi8iICovCisjICBpZiAhRU5BQkxFX0lOU1RBTExfTk9fVVNSCisJLHVzcl9iaW4KKwksdXNyX3NiaW4KKyMgIGVuZGlmCit9OworCisvKiBjcmVhdGUgKHN5bSlsaW5rcyBmb3IgZWFjaCBhcHBsZXQgKi8KK3N0YXRpYyB2b2lkIGluc3RhbGxfbGlua3MoY29uc3QgY2hhciAqYnVzeWJveCwgaW50IHVzZV9zeW1ib2xpY19saW5rcywKKwkJY2hhciAqY3VzdG9tX2luc3RhbGxfZGlyKQoreworCS8qIGRpcmVjdG9yeSB0YWJsZQorCSAqIHRoaXMgc2hvdWxkIGJlIGNvbnNpc3RlbnQgdy8gdGhlIGVudW0sCisJICogYnVzeWJveC5oOjpiYl9pbnN0YWxsX2xvY190LCBvciBlbHNlLi4uICovCisJaW50ICgqbGYpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKwljaGFyICpmcGM7CisJdW5zaWduZWQgaTsKKwlpbnQgcmM7CisKKwlsZiA9IGxpbms7CisJaWYgKHVzZV9zeW1ib2xpY19saW5rcykKKwkJbGYgPSBzeW1saW5rOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXBwbGV0X21haW4pOyBpKyspIHsKKwkJZnBjID0gY29uY2F0X3BhdGhfZmlsZSgKKwkJCQljdXN0b21faW5zdGFsbF9kaXIgPyBjdXN0b21faW5zdGFsbF9kaXIgOiBpbnN0YWxsX2RpcltBUFBMRVRfSU5TVEFMTF9MT0MoaSldLAorCQkJCUFQUExFVF9OQU1FKGkpKTsKKwkJLy8gZGVidWc6IGJiX2Vycm9yX21zZygiJXNsaW5raW5nICVzIHRvIGJ1c3lib3giLAorCQkvLwkJdXNlX3N5bWJvbGljX2xpbmtzID8gInN5bSIgOiAiIiwgZnBjKTsKKwkJcmMgPSBsZihidXN5Ym94LCBmcGMpOworCQlpZiAocmMgIT0gMCAmJiBlcnJubyAhPSBFRVhJU1QpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZwYyk7CisJCX0KKwkJZnJlZShmcGMpOworCX0KK30KKyMgZWxzZQorIyAgZGVmaW5lIGluc3RhbGxfbGlua3MoeCx5LHopICgodm9pZCkwKQorIyBlbmRpZgorCisvKiBJZiB3ZSB3ZXJlIGNhbGxlZCBhcyAiYnVzeWJveC4uLiIgKi8KK3N0YXRpYyBpbnQgYnVzeWJveF9tYWluKGNoYXIgKiphcmd2KQoreworCWlmICghYXJndlsxXSkgeworCQkvKiBDYWxsZWQgd2l0aG91dCBhcmd1bWVudHMgKi8KKwkJY29uc3QgY2hhciAqYTsKKwkJaW50IGNvbDsKKwkJdW5zaWduZWQgb3V0cHV0X3dpZHRoOworIGhlbHA6CisJCW91dHB1dF93aWR0aCA9IDgwOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRIKSB7CisJCQkvKiBPYnRhaW4gdGhlIHRlcm1pbmFsIHdpZHRoICovCisJCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KDAsICZvdXRwdXRfd2lkdGgsIE5VTEwpOworCQl9CisKKwkJZHVwMigxLCAyKTsKKwkJZnVsbF93cml0ZTJfc3RyKGJiX2Jhbm5lcik7IC8qIHJldXNlIGNvbnN0IHN0cmluZyAqLworCQlmdWxsX3dyaXRlMl9zdHIoIiBtdWx0aS1jYWxsIGJpbmFyeS5cbiIpOyAvKiByZXVzZSAqLworCQlmdWxsX3dyaXRlMl9zdHIoCisJCQkiQ29weXJpZ2h0IChDKSAxOTk4LTIwMTEgRXJpayBBbmRlcnNlbiwgUm9iIExhbmRsZXksIERlbnlzIFZsYXNlbmtvXG4iCisJCQkiYW5kIG90aGVycy4gTGljZW5zZWQgdW5kZXIgR1BMdjIuXG4iCisJCQkiU2VlIHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIGZ1bGwgbm90aWNlLlxuIgorCQkJIlxuIgorCQkJIlVzYWdlOiBidXN5Ym94IFtmdW5jdGlvbl0gW2FyZ3VtZW50c10uLi5cbiIKKwkJCSIgICBvcjogYnVzeWJveCAtLWxpc3RbLWZ1bGxdXG4iCisJCQkiICAgb3I6IGZ1bmN0aW9uIFthcmd1bWVudHNdLi4uXG4iCisJCQkiXG4iCisJCQkiXHRCdXN5Qm94IGlzIGEgbXVsdGktY2FsbCBiaW5hcnkgdGhhdCBjb21iaW5lcyBtYW55IGNvbW1vbiBVbml4XG4iCisJCQkiXHR1dGlsaXRpZXMgaW50byBhIHNpbmdsZSBleGVjdXRhYmxlLiAgTW9zdCBwZW9wbGUgd2lsbCBjcmVhdGUgYVxuIgorCQkJIlx0bGluayB0byBidXN5Ym94IGZvciBlYWNoIGZ1bmN0aW9uIHRoZXkgd2lzaCB0byB1c2UgYW5kIEJ1c3lCb3hcbiIKKwkJCSJcdHdpbGwgYWN0IGxpa2Ugd2hhdGV2ZXIgaXQgd2FzIGludm9rZWQgYXMuXG4iCisJCQkiXG4iCisJCQkiQ3VycmVudGx5IGRlZmluZWQgZnVuY3Rpb25zOlxuIgorCQkpOworCQljb2wgPSAwOworCQlhID0gYXBwbGV0X25hbWVzOworCQkvKiBwcmV2ZW50IGxhc3QgY29tbWEgdG8gYmUgaW4gdGhlIHZlcnkgbGFzdCBwb3MgKi8KKwkJb3V0cHV0X3dpZHRoLS07CisJCXdoaWxlICgqYSkgeworCQkJaW50IGxlbjIgPSBzdHJsZW4oYSkgKyAyOworCQkJaWYgKGNvbCA+PSAoaW50KW91dHB1dF93aWR0aCAtIGxlbjIpIHsKKwkJCQlmdWxsX3dyaXRlMl9zdHIoIixcbiIpOworCQkJCWNvbCA9IDA7CisJCQl9CisJCQlpZiAoY29sID09IDApIHsKKwkJCQljb2wgPSA2OworCQkJCWZ1bGxfd3JpdGUyX3N0cigiXHQiKTsKKwkJCX0gZWxzZSB7CisJCQkJZnVsbF93cml0ZTJfc3RyKCIsICIpOworCQkJfQorCQkJZnVsbF93cml0ZTJfc3RyKGEpOworCQkJY29sICs9IGxlbjI7CisJCQlhICs9IGxlbjIgLSAxOworCQl9CisJCWZ1bGxfd3JpdGUyX3N0cigiXG5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybmNtcChhcmd2WzFdLCAiLS1saXN0IiwgNikgPT0gMCkgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJY29uc3QgY2hhciAqYSA9IGFwcGxldF9uYW1lczsKKwkJZHVwMigxLCAyKTsKKwkJd2hpbGUgKCphKSB7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lOU1RBTExFUgorCQkJaWYgKGFyZ3ZbMV1bNl0pIC8qIC0tbGlzdC1wYXRoPyAqLworCQkJCWZ1bGxfd3JpdGUyX3N0cihpbnN0YWxsX2RpcltBUFBMRVRfSU5TVEFMTF9MT0MoaSldICsgMSk7CisjIGVuZGlmCisJCQlmdWxsX3dyaXRlMl9zdHIoYSk7CisJCQlmdWxsX3dyaXRlMl9zdHIoIlxuIik7CisJCQlpKys7CisJCQlhICs9IHN0cmxlbihhKSArIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0lOU1RBTExFUiAmJiBzdHJjbXAoYXJndlsxXSwgIi0taW5zdGFsbCIpID09IDApIHsKKwkJaW50IHVzZV9zeW1ib2xpY19saW5rczsKKwkJY29uc3QgY2hhciAqYnVzeWJveDsKKworCQlidXN5Ym94ID0geG1hbGxvY19yZWFkbGluayhiYl9idXN5Ym94X2V4ZWNfcGF0aCk7CisJCWlmICghYnVzeWJveCkgeworCQkJLyogYmJfYnVzeWJveF9leGVjX3BhdGggaXMgdXN1YWxseSAiL3Byb2Mvc2VsZi9leGUiLgorCQkJICogSW4gY2hyb290LCByZWFkbGluaygiL3Byb2Mvc2VsZi9leGUiKSB1c3VhbGx5IGZhaWxzLgorCQkJICogSW4gc3VjaCBjYXNlLCBiZXR0ZXIgdXNlIGFyZ3ZbMF0gYXMgc3ltbGluayB0YXJnZXQKKwkJCSAqIGlmIGl0IGlzIGEgZnVsbCBwYXRoIG5hbWUuCisJCQkgKi8KKwkJCWlmIChhcmd2WzBdWzBdICE9ICcvJykKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCIsIGFyZ3ZbMF0pOworCQkJYnVzeWJveCA9IGFyZ3ZbMF07CisJCX0KKwkJLyogYnVzeWJveCAtLWluc3RhbGwgWy1zXSBbRElSXToKKwkJICogLXM6IG1ha2Ugc3ltbGlua3MKKwkJICogRElSOiBkaXJlY3RvcnkgdG8gaW5zdGFsbCBsaW5rcyB0bworCQkgKi8KKwkJdXNlX3N5bWJvbGljX2xpbmtzID0gKGFyZ3ZbMl0gJiYgc3RyY21wKGFyZ3ZbMl0sICItcyIpID09IDAgJiYgYXJndisrKTsKKwkJaW5zdGFsbF9saW5rcyhidXN5Ym94LCB1c2Vfc3ltYm9saWNfbGlua3MsIGFyZ3ZbMl0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwKSB7CisJCS8qICJidXN5Ym94IC0taGVscCBbPGFwcGxldD5dIiAqLworCQlpZiAoIWFyZ3ZbMl0pCisJCQlnb3RvIGhlbHA7CisJCS8qIGNvbnZlcnQgdG8gIjxhcHBsZXQ+IC0taGVscCIgKi8KKwkJYXJndlswXSA9IGFyZ3ZbMl07CisJCWFyZ3ZbMl0gPSBOVUxMOworCX0gZWxzZSB7CisJCS8qICJidXN5Ym94IDxhcHBsZXQ+IGFyZzEgYXJnMiAuLi4iICovCisJCWFyZ3YrKzsKKwl9CisJLyogV2Ugc3VwcG9ydCAiYnVzeWJveCAvYS9wYXRoL3RvL2FwcGxldCBhcmdzLi4uIiB0b28uIEFsbG93cyBmb3IKKwkgKiAiIyEvYmluL2J1c3lib3giLXN0eWxlIHdyYXBwZXJzICovCisJYXBwbGV0X25hbWUgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKGFyZ3ZbMF0pOworCXJ1bl9hcHBsZXRfYW5kX2V4aXQoYXBwbGV0X25hbWUsIGFyZ3YpOworCisJLypiYl9lcnJvcl9tc2dfYW5kX2RpZSgiYXBwbGV0IG5vdCBmb3VuZCIpOyAtIHN1Y2tzIGluIHByaW50ZiAqLworCWZ1bGxfd3JpdGUyX3N0cihhcHBsZXRfbmFtZSk7CisJZnVsbF93cml0ZTJfc3RyKCI6IGFwcGxldCBub3QgZm91bmRcbiIpOworCXhmdW5jX2RpZSgpOworfQorCit2b2lkIEZBU1RfRlVOQyBydW5fYXBwbGV0X25vX2FuZF9leGl0KGludCBhcHBsZXRfbm8sIGNoYXIgKiphcmd2KQoreworCWludCBhcmdjID0gMTsKKworCXdoaWxlIChhcmd2W2FyZ2NdKQorCQlhcmdjKys7CisKKwkvKiBSZWluaXQgc29tZSBzaGFyZWQgZ2xvYmFsIGRhdGEgKi8KKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisKKwlhcHBsZXRfbmFtZSA9IEFQUExFVF9OQU1FKGFwcGxldF9ubyk7CisJaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDApIHsKKwkJLyogU3BlY2lhbCBjYXNlLiBQT1NJWCBzYXlzICJ0ZXN0IC0taGVscCIKKwkJICogc2hvdWxkIGJlIG5vIGRpZmZlcmVudCBmcm9tIGUuZy4gInRlc3QgLS1mb28iLiAgKi8KKy8vVE9ETzoganVzdCBjb21wYXJlIGFwcGxldF9ubyB3aXRoIEFQUExFVF9OT190ZXN0CisJCWlmICghRU5BQkxFX1RFU1QgfHwgc3RyY21wKGFwcGxldF9uYW1lLCAidGVzdCIpICE9IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9TVUlEKQorCQljaGVja19zdWlkKGFwcGxldF9ubyk7CisJZXhpdChhcHBsZXRfbWFpblthcHBsZXRfbm9dKGFyZ2MsIGFyZ3YpKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgcnVuX2FwcGxldF9hbmRfZXhpdChjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYXBwbGV0ID0gZmluZF9hcHBsZXRfYnlfbmFtZShuYW1lKTsKKwlpZiAoYXBwbGV0ID49IDApCisJCXJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoYXBwbGV0LCBhcmd2KTsKKwlpZiAoc3RybmNtcChuYW1lLCAiYnVzeWJveCIsIDcpID09IDApCisJCWV4aXQoYnVzeWJveF9tYWluKGFyZ3YpKTsKK30KKworI2VuZGlmIC8qICFkZWZpbmVkKFNJTkdMRV9BUFBMRVRfTUFJTikgKi8KKworCisKKyNpZiBFTkFCTEVfQlVJTERfTElCQlVTWUJPWAoraW50IGxiYl9tYWluKGNoYXIgKiphcmd2KQorI2Vsc2UKK2ludCBtYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCisjZW5kaWYKK3sKKwkvKiBUd2VhayBtYWxsb2MgZm9yIHJlZHVjZWQgbWVtb3J5IGNvbnN1bXB0aW9uICovCisjaWZkZWYgTV9UUklNX1RIUkVTSE9MRAorCS8qIE1fVFJJTV9USFJFU0hPTEQgaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGZyZWVkIHRvcC1tb3N0IG1lbW9yeQorCSAqIHRvIGtlZXAgYmVmb3JlIHJlbGVhc2luZyB0byB0aGUgT1MKKwkgKiBEZWZhdWx0IGlzIHdheSB0b28gYmlnOiAyNTZrCisJICovCisJbWFsbG9wdChNX1RSSU1fVEhSRVNIT0xELCA4ICogMTAyNCk7CisjZW5kaWYKKyNpZmRlZiBNX01NQVBfVEhSRVNIT0xECisJLyogTV9NTUFQX1RIUkVTSE9MRCBpcyB0aGUgcmVxdWVzdCBzaXplIHRocmVzaG9sZCBmb3IgdXNpbmcgbW1hcCgpCisJICogRGVmYXVsdCBpcyB0b28gYmlnOiAyNTZrCisJICovCisJbWFsbG9wdChNX01NQVBfVEhSRVNIT0xELCAzMiAqIDEwMjQgLSAyNTYpOworI2VuZGlmCisKKyNpZiAhQkJfTU1VCisJLyogTk9NTVUgcmUtZXhlYyB0cmljayBzZXRzIGhpZ2gtb3JkZXIgYml0IGluIGZpcnN0IGJ5dGUgb2YgbmFtZSAqLworCWlmIChhcmd2WzBdWzBdICYgMHg4MCkgeworCQlyZV9leGVjZWQgPSAxOworCQlhcmd2WzBdWzBdICY9IDB4N2Y7CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNJTkdMRV9BUFBMRVRfTUFJTikKKwkvKiBPbmx5IG9uZSBhcHBsZXQgaXMgc2VsZWN0ZWQgaW4gLmNvbmZpZyAqLworCWlmIChhcmd2WzFdICYmIHN0cm5jbXAoYXJndlswXSwgImJ1c3lib3giLCA3KSA9PSAwKSB7CisJCS8qICJidXN5Ym94IDxhcHBsZXQ+IDxwYXJhbXM+IiBzaG91bGQgc3RpbGwgd29yayBhcyBleHBlY3RlZCAqLworCQlhcmd2Kys7CisJfQorCS8qIGFwcGxldF9uYW1lcyBpbiB0aGlzIGNhc2UgaXMganVzdCAiYXBwbGV0XDBcMCIgKi8KKwlsYmJfcHJlcGFyZShhcHBsZXRfbmFtZXMgSUZfRkVBVFVSRV9JTkRJVklEVUFMKCwgYXJndikpOworCXJldHVybiBTSU5HTEVfQVBQTEVUX01BSU4oYXJnYywgYXJndik7CisjZWxzZQorCWxiYl9wcmVwYXJlKCJidXN5Ym94IiBJRl9GRUFUVVJFX0lORElWSURVQUwoLCBhcmd2KSk7CisKKwlhcHBsZXRfbmFtZSA9IGFyZ3ZbMF07CisJaWYgKGFwcGxldF9uYW1lWzBdID09ICctJykKKwkJYXBwbGV0X25hbWUrKzsKKwlhcHBsZXRfbmFtZSA9IGJiX2Jhc2VuYW1lKGFwcGxldF9uYW1lKTsKKworCXBhcnNlX2NvbmZpZ19maWxlKCk7IC8qIC4uLm1heWJlLCBpZiBGRUFUVVJFX1NVSURfQ09ORklHICovCisKKwlydW5fYXBwbGV0X2FuZF9leGl0KGFwcGxldF9uYW1lLCBhcmd2KTsKKworCS8qYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFwcGxldCBub3QgZm91bmQiKTsgLSBzdWNrcyBpbiBwcmludGYgKi8KKwlmdWxsX3dyaXRlMl9zdHIoYXBwbGV0X25hbWUpOworCWZ1bGxfd3JpdGUyX3N0cigiOiBhcHBsZXQgbm90IGZvdW5kXG4iKTsKKwl4ZnVuY19kaWUoKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvYXNrX2NvbmZpcm1hdGlvbi5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvYXNrX2NvbmZpcm1hdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTcyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9hc2tfY29uZmlybWF0aW9uLmMKQEAgLTAsMCArMSwyNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmJfYXNrX2NvbmZpcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogUmVhZCBhIGxpbmUgZnJvbSBzdGRpbi4gIElmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyIGlzICd5JyBvciAnWScsCisgKiByZXR1cm4gMS4gIE90aGVyd2lzZSByZXR1cm4gMC4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBGQVNUX0ZVTkMgYmJfYXNrX2NvbmZpcm1hdGlvbih2b2lkKQoreworCWNoYXIgZmlyc3QgPSAwOworCWludCBjOworCisJd2hpbGUgKCgoYyA9IGdldGNoYXIoKSkgIT0gRU9GKSAmJiAoYyAhPSAnXG4nKSkgeworCQlpZiAoZmlyc3QgPT0gMCAmJiAhaXNibGFuayhjKSkgeworCQkJZmlyc3QgPSBjfDB4MjA7CisJCX0KKwl9CisKKwlyZXR1cm4gZmlyc3QgPT0gJ3knOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfYXNrcGFzcy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfYXNrcGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDE4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9iYl9hc2twYXNzLmMKQEAgLTAsMCArMSw4NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQXNrIGZvciBhIHBhc3N3b3JkCisgKiBJIHVzZSBhIHN0YXRpYyBidWZmZXIgaW4gdGhpcyBmdW5jdGlvbi4gIFBsYW4gYWNjb3JkaW5nbHkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIGRvIG5vdGhpbmcgc2lnbmFsIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIGFza3Bhc3NfdGltZW91dChpbnQgVU5VU0VEX1BBUkFNIGlnbm9yZSkKK3sKK30KKworY2hhciogRkFTVF9GVU5DIGJiX2Fza19zdGRpbihjb25zdCBjaGFyICpwcm9tcHQpCit7CisJcmV0dXJuIGJiX2FzayhTVERJTl9GSUxFTk8sIDAsIHByb21wdCk7Cit9CitjaGFyKiBGQVNUX0ZVTkMgYmJfYXNrKGNvbnN0IGludCBmZCwgaW50IHRpbWVvdXQsIGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKwkvKiBXYXMgc3RhdGljIGNoYXJbQklHTlVNXSAqLworCWVudW0geyBzaXplb2ZfcGFzc3dkID0gMTI4IH07CisJc3RhdGljIGNoYXIgKnBhc3N3ZDsKKworCWNoYXIgKnJldDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhLCBvbGRzYTsKKwlzdHJ1Y3QgdGVybWlvcyB0aW8sIG9sZHRpbzsKKworCXRjZ2V0YXR0cihmZCwgJm9sZHRpbyk7CisJdGNmbHVzaChmZCwgVENJRkxVU0gpOworCXRpbyA9IG9sZHRpbzsKKyNpZm5kZWYgSVVDTEMKKyMgZGVmaW5lIElVQ0xDIDAKKyNlbmRpZgorCXRpby5jX2lmbGFnICY9IH4oSVVDTEN8SVhPTnxJWE9GRnxJWEFOWSk7CisJdGlvLmNfbGZsYWcgJj0gfihFQ0hPfEVDSE9FfEVDSE9LfEVDSE9OTHxUT1NUT1ApOworCXRjc2V0YXR0cihmZCwgVENTQU5PVywgJnRpbyk7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkvKiBzYS5zYV9mbGFncyA9IDA7IC0gbm8gU0FfUkVTVEFSVCEgKi8KKwkvKiBTSUdJTlQgYW5kIFNJR0FMUk0gd2lsbCBpbnRlcnJ1cHQgcmVhZHMgYmVsb3cgKi8KKwlzYS5zYV9oYW5kbGVyID0gYXNrcGFzc190aW1lb3V0OworCXNpZ2FjdGlvbihTSUdJTlQsICZzYSwgJm9sZHNhKTsKKwlpZiAodGltZW91dCkgeworCQlzaWdhY3Rpb25fc2V0KFNJR0FMUk0sICZzYSk7CisJCWFsYXJtKHRpbWVvdXQpOworCX0KKworCWZwdXRzKHByb21wdCwgc3Rkb3V0KTsKKwlmZmx1c2hfYWxsKCk7CisKKwlpZiAoIXBhc3N3ZCkKKwkJcGFzc3dkID0geG1hbGxvYyhzaXplb2ZfcGFzc3dkKTsKKwlyZXQgPSBwYXNzd2Q7CisJaSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IHIgPSByZWFkKGZkLCAmcmV0W2ldLCAxKTsKKwkJaWYgKHIgPCAwKSB7CisJCQkvKiByZWFkIGlzIGludGVycnVwdGVkIGJ5IHRpbWVvdXQgb3IgXkMgKi8KKwkJCXJldCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAociA9PSAwIC8qIEVPRiAqLworCQkgfHwgcmV0W2ldID09ICdccicgfHwgcmV0W2ldID09ICdcbicgLyogRU9MICovCisJCSB8fCArK2kgPT0gc2l6ZW9mX3Bhc3N3ZC0xIC8qIGxpbmUgbGltaXQgKi8KKwkJKSB7CisJCQlyZXRbaV0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAodGltZW91dCkgeworCQlhbGFybSgwKTsKKwl9CisJc2lnYWN0aW9uX3NldChTSUdJTlQsICZvbGRzYSk7CisJdGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmb2xkdGlvKTsKKwliYl9wdXRjaGFyKCdcbicpOworCWZmbHVzaF9hbGwoKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfYnN3YXBfNjQuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2JiX2Jzd2FwXzY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZDUzYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2JiX2Jzd2FwXzY0LmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmICEoVUxPTkdfTUFYID4gMHhmZmZmZmZmZikKK3VpbnQ2NF90IEZBU1RfRlVOQyBiYl9ic3dhcF82NCh1aW50NjRfdCB4KQoreworCXJldHVybiBic3dhcF82NCh4KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfZG9fZGVsYXkuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2JiX2RvX2RlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjODc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2JiX2RvX2RlbGF5LmMKQEAgLTAsMCArMSwyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQnVzeWJveCB1dGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBUaXRvIFJhZ3VzYSA8dGl0by13b2xpdEB0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGJiX2RvX2RlbGF5KGludCBzZWNvbmRzKQoreworCXRpbWVfdCBzdGFydCwgbm93OworCisJc3RhcnQgPSB0aW1lKE5VTEwpOworCWRvIHsKKwkJc2xlZXAoc2Vjb25kcyk7CisJCW5vdyA9IHRpbWUoTlVMTCk7CisJfSB3aGlsZSAoKG5vdyAtIHN0YXJ0KSA8IHNlY29uZHMpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfcHdkLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9iYl9wd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI5YjcyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfcHdkLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBhc3N3b3JkIHV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUT0RPOiBtYXliZSBjaGFuZ2UgQVBJIHRvIHJldHVybiBtYWxsb2NlZCBkYXRhPworICogVGhpcyB3aWxsIGFsbG93IHRvIHN0b3AgdXNpbmcgbGliYyBmdW5jdGlvbnMgcmV0dXJuaW5nCisgKiBwb2ludGVycyB0byBzdGF0aWMgZGF0YSAoZ2V0cHd1aWQpCisgKi8KKworc3RydWN0IHBhc3N3ZCogRkFTVF9GVU5DIHhnZXRwd25hbShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHduYW0obmFtZSk7CisJaWYgKCFwdykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gdXNlciAlcyIsIG5hbWUpOworCXJldHVybiBwdzsKK30KKworc3RydWN0IGdyb3VwKiBGQVNUX0ZVTkMgeGdldGdybmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdyb3VwICpnciA9IGdldGdybmFtKG5hbWUpOworCWlmICghZ3IpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIGdyb3VwICVzIiwgbmFtZSk7CisJcmV0dXJuIGdyOworfQorCisKK3N0cnVjdCBwYXNzd2QqIEZBU1RfRlVOQyB4Z2V0cHd1aWQodWlkX3QgdWlkKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKKwlpZiAoIXB3KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biB1aWQgJXUiLCAodW5zaWduZWQpdWlkKTsKKwlyZXR1cm4gcHc7Cit9CisKK3N0cnVjdCBncm91cCogRkFTVF9GVU5DIHhnZXRncmdpZChnaWRfdCBnaWQpCit7CisJc3RydWN0IGdyb3VwICpnciA9IGdldGdyZ2lkKGdpZCk7CisJaWYgKCFncikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gZ2lkICV1IiwgKHVuc2lnbmVkKWdpZCk7CisJcmV0dXJuIGdyOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeHVpZDJ1bmFtZSh1aWRfdCB1aWQpCit7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSB4Z2V0cHd1aWQodWlkKTsKKwlyZXR1cm4gcHctPnB3X25hbWU7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB4Z2lkMmdyb3VwKGdpZF90IGdpZCkKK3sKKwlzdHJ1Y3QgZ3JvdXAgKmdyID0geGdldGdyZ2lkKGdpZCk7CisJcmV0dXJuIGdyLT5ncl9uYW1lOworfQorCitjaGFyKiBGQVNUX0ZVTkMgdWlkMnVuYW1lKHVpZF90IHVpZCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisJcmV0dXJuIChwdykgPyBwdy0+cHdfbmFtZSA6IE5VTEw7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBnaWQyZ3JvdXAoZ2lkX3QgZ2lkKQoreworCXN0cnVjdCBncm91cCAqZ3IgPSBnZXRncmdpZChnaWQpOworCXJldHVybiAoZ3IpID8gZ3ItPmdyX25hbWUgOiBOVUxMOworfQorCitjaGFyKiBGQVNUX0ZVTkMgdWlkMnVuYW1lX3V0b2EodWlkX3QgdWlkKQoreworCWNoYXIgKm5hbWUgPSB1aWQydW5hbWUodWlkKTsKKwlyZXR1cm4gKG5hbWUpID8gbmFtZSA6IHV0b2EodWlkKTsKK30KKworY2hhciogRkFTVF9GVU5DIGdpZDJncm91cF91dG9hKGdpZF90IGdpZCkKK3sKKwljaGFyICpuYW1lID0gZ2lkMmdyb3VwKGdpZCk7CisJcmV0dXJuIChuYW1lKSA/IG5hbWUgOiB1dG9hKGdpZCk7Cit9CisKK2xvbmcgRkFTVF9GVU5DIHh1bmFtZTJ1aWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpteXVzZXI7CisKKwlteXVzZXIgPSB4Z2V0cHduYW0obmFtZSk7CisJcmV0dXJuIG15dXNlci0+cHdfdWlkOworfQorCitsb25nIEZBU1RfRlVOQyB4Z3JvdXAyZ2lkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdyb3VwICpteWdyb3VwOworCisJbXlncm91cCA9IHhnZXRncm5hbShuYW1lKTsKKwlyZXR1cm4gbXlncm91cC0+Z3JfZ2lkOworfQorCit1bnNpZ25lZCBsb25nIEZBU1RfRlVOQyBnZXRfdWdfaWQoY29uc3QgY2hhciAqcywKKwkJbG9uZyBGQVNUX0ZVTkMgKCp4bmFtZTJpZCkoY29uc3QgY2hhciAqKSkKK3sKKwl1bnNpZ25lZCBsb25nIHI7CisKKwlyID0gYmJfc3RydG91bChzLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vKQorCQlyZXR1cm4geG5hbWUyaWQocyk7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9iYl9xc29ydC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfcXNvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTRlNzIzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfcXNvcnQuYwpAQCAtMCwwICsxLDIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBXcmFwcGVyIGZvciBjb21tb24gc3RyaW5nIHZlY3RvciBzb3J0aW5nIG9wZXJhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCAvKiBub3QgRkFTVF9GVU5DISAqLyBiYl9wc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIHN0cmNtcCgqKGNoYXIqKilhLCAqKGNoYXIqKiliKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgcXNvcnRfc3RyaW5nX3ZlY3RvcihjaGFyICoqc3YsIHVuc2lnbmVkIGNvdW50KQoreworCXFzb3J0KHN2LCBjb3VudCwgc2l6ZW9mKGNoYXIqKSwgYmJfcHN0cmNtcCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9iYl9zdHJ0b2QuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2JiX3N0cnRvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZGU3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9iYl9zdHJ0b2QuYwpAQCAtMCwwICsxLDg4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG1hdGguaD4gIC8qIGp1c3QgZm9yIEhVR0VfVkFMICovCisKKyNkZWZpbmUgTk9UX0RJR0lUKGEpICgoKHVuc2lnbmVkIGNoYXIpKGEtJzAnKSkgPiA5KQorCisjaWYgMCAvLyBVTlVTRUQKK2RvdWJsZSBGQVNUX0ZVTkMgYmJfc3RydG9kKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHApCit7CisJZG91YmxlIHY7CisJY2hhciAqZW5kcHRyOworCisJLyogQWxsb3cgLk5OIGZvcm0uIFBlb3BsZSB3YW50IHRvIHVzZSAic2xlZXAgLjE1IiBldGMgKi8KKwlpZiAoYXJnWzBdICE9ICctJyAmJiBhcmdbMF0gIT0gJy4nICYmIE5PVF9ESUdJVChhcmdbMF0pKQorCQlnb3RvIGVycjsKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvZChhcmcsICZlbmRwdHIpOworCWlmIChlbmRwKQorCQkqZW5kcCA9IGVuZHB0cjsKKwlpZiAoZW5kcHRyWzBdKSB7CisJCS8qICIxMjM0YWJjZyIgb3Igb3V0LW9mLXJhbmdlPyAqLworCQlpZiAoaXNhbG51bShlbmRwdHJbMF0pIHx8IGVycm5vKSB7CisgZXJyOgorCQkJZXJybm8gPSBFUkFOR0U7CisJCQlyZXR1cm4gSFVHRV9WQUw7CisJCX0KKwkJLyogZ29vZCBudW1iZXIsIGp1c3Qgc3VzcGljaW91cyB0ZXJtaW5hdG9yICovCisJCWVycm5vID0gRUlOVkFMOworCX0KKwlyZXR1cm4gdjsKK30KKyNlbmRpZgorCisjaWYgMAorLyogU3RyaW5nIHRvIHRpbWVzcGVjOiAiTk5OTlsuTk5OTk5dIiAtPiBzdHJ1Y3QgdGltZXNwZWMuCisgKiBDYW4gYmUgdXNlZCBmb3Igb3RoZXIgZml4ZWQtcG9pbnQgbmVlZHMuCisgKiBSZXR1cm5zIHBvaW50ZXIgcGFzdCBsYXN0IGNvbnZlcnRlZCBjaGFyLAorICogYW5kIHJldHVybnMgZXJybm8gc2ltaWxhciB0byBiYl9zdHJ0b1hYIGZ1bmN0aW9ucy4KKyAqLworY2hhciogRkFTVF9GVU5DIGJiX3N0cl90b190cyhzdHJ1Y3QgdGltZXNwZWMgKnRzLCBjb25zdCBjaGFyICphcmcpCit7CisJaWYgKHNpemVvZih0cy0+dHZfc2VjKSA8PSBzaXplb2YoaW50KSkKKwkJdHMtPnR2X3NlYyA9IGJiX3N0cnRvdShhcmcsICZhcmcsIDEwKTsKKwllbHNlIGlmIChzaXplb2YodHMtPnR2X3NlYykgPD0gc2l6ZW9mKGxvbmcpKQorCQl0cy0+dHZfc2VjID0gYmJfc3RydG91bChhcmcsICZhcmcsIDEwKTsKKwllbHNlCisJCXRzLT50dl9zZWMgPSBiYl9zdHJ0b3VsbChhcmcsICZhcmcsIDEwKTsKKwl0cy0+dHZfbnNlYyA9IDA7CisKKwlpZiAoKmFyZyAhPSAnLicpCisJCXJldHVybiBhcmc7CisKKwkvKiAhRUlOVkFMOiBudW1iZXIgaXMgbm90IG9rIChhbHBoYW51bWVyaWMgZW5kaW5nLCBvdmVyZmxvdyBldGMpICovCisJaWYgKGVycm5vICE9IEVJTlZBTCkKKwkJcmV0dXJuIGFyZzsKKworCWlmICghKisrYXJnKSAvKiAiTk5OLiIgKi8KKwkJcmV0dXJuIGFyZzsKKworCXsgLyogIk5OTi54eHgiIC0gcGFyc2UgeHh4ICovCisJCWludCBuZGlnaXRzOworCQljaGFyICpwOworCQljaGFyIGJ1ZlsxMF07IC8qIHdlIG5ldmVyIHVzZSBtb3JlIHRoYW4gOSBkaWdpdHMgKi8KKworCQkvKiBOZWVkIHRvIG1ha2UgYSBjb3B5IHRvIGF2b2lkIGZhbHNlIG92ZXJmbG93ICovCisJCXNhZmVfc3RybmNweShidWYsIGFyZywgMTApOworCQl0cy0+dHZfbnNlYyA9IGJiX3N0cnRvdShidWYsICZwLCAxMCk7CisJCW5kaWdpdHMgPSBwIC0gYnVmOworCQlhcmcgKz0gbmRpZ2l0czsKKwkJLyogbm9ybWFsaXplIHRvIG5zZWMgKi8KKwkJd2hpbGUgKG5kaWdpdHMgPCA5KSB7CisJCQluZGlnaXRzKys7CisJCQl0cy0+dHZfbnNlYyAqPSAxMDsKKwkJfQorCQl3aGlsZSAoaXNkaWdpdCgqYXJnKSkgLyogc2tpcCBwb3NzaWJsZSAxMHRoIHBsdXMgZGlnaXRzICovCisJCQlhcmcrKzsKKwl9CisJcmV0dXJuIGFyZzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvYmJfc3RydG9udW0uYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2JiX3N0cnRvbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2Yzc3NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2JiX3N0cnRvbnVtLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE9uIGV4aXQ6IGVycm5vID0gMCBvbmx5IGlmIHRoZXJlIHdhcyBub24tZW1wdHksICdcMCcgdGVybWluYXRlZCB2YWx1ZQorICogZXJybm8gPSBFSU5WQUwgaWYgdmFsdWUgd2FzIG5vdCAnXDAnIHRlcm1pbmF0ZWQsIGJ1dCBvdGhlcndpc2Ugb2sKKyAqICAgIFJldHVybiB2YWx1ZSBpcyBzdGlsbCB2YWxpZCwgY2FsbGVyIHNob3VsZCBqdXN0IGNoZWNrIHdoZXRoZXIgZW5kWzBdCisgKiAgICBpcyBhIHZhbGlkIHRlcm1pbmF0aW5nIGNoYXIgZm9yIHBhcnRpY3VsYXIgY2FzZS4gT1RPSCwgaWYgY2FsbGVyCisgKiAgICByZXF1aXJlcyAnXDAnIHRlcm1pbmF0ZWQgaW5wdXQsIFtzXWhlIGNhbiBqdXN0IGNoZWNrIGVycm5vID09IDAuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBoYWQgYWxwaGFudW1lcmljIHRlcm1pbmF0aW5nIGNoYXIgKCIxMjM0YWJjZyIpLgorICogZXJybm8gPSBFUkFOR0UgaWYgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLCBtaXNzaW5nLCBldGMuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBoYWQgbWludXMgc2lnbiBmb3Igc3RydG91WFggKGV2ZW4gIi0wIiBpcyBub3Qgb2sgKQorICogICAgcmV0dXJuIHZhbHVlIGlzIGFsbC1vbmVzIGluIHRoaXMgY2FzZS4KKyAqCisgKiBUZXN0IGNvZGU6CisgKiBjaGFyICplbmRwdHI7CisgKiBjb25zdCBjaGFyICptaW51cyA9ICItIjsKKyAqIGVycm5vID0gMDsKKyAqIGJiX3N0cnRvaShtaW51cywgJmVuZHB0ciwgMCk7IC8vIG11c3Qgc2V0IEVSQU5HRQorICogcHJpbnRmKCJtaW51czolcCBlbmRwdHI6JXAgZXJybm86JWQgRUlOVkFMOiVkXG4iLCBtaW51cywgZW5kcHRyLCBlcnJubywgRUlOVkFMKTsKKyAqIGVycm5vID0gMDsKKyAqIGJiX3N0cnRvaSgiLTAtIiwgJmVuZHB0ciwgMCk7IC8vIG11c3Qgc2V0IEVJTlZBTCBhbmQgcG9pbnQgdG8gc2Vjb25kICctJworICogcHJpbnRmKCJlbmRwdHJbMF06JWMgZXJybm86JWQgRUlOVkFMOiVkXG4iLCBlbmRwdHJbMF0sIGVycm5vLCBFSU5WQUwpOworICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgcmV0X0VSQU5HRSh2b2lkKQoreworCWVycm5vID0gRVJBTkdFOyAvKiB0aGlzIGFpbid0IGFzIHNtYWxsIGFzIGl0IGxvb2tzIChvbiBnbGliYykgKi8KKwlyZXR1cm4gVUxMT05HX01BWDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBoYW5kbGVfZXJyb3JzKHVuc2lnbmVkIGxvbmcgbG9uZyB2LCBjaGFyICoqZW5kcCwgY2hhciAqZW5kcHRyKQoreworCWlmIChlbmRwKSAqZW5kcCA9IGVuZHB0cjsKKworCS8qIGVycm5vIGlzIGFscmVhZHkgc2V0IHRvIEVSQU5HRSBieSBzdHJ0b1hYWCBpZiB2YWx1ZSBvdmVyZmxvd2VkICovCisJaWYgKGVuZHB0clswXSkgeworCQkvKiAiMTIzNGFiY2ciIG9yIG91dC1vZi1yYW5nZT8gKi8KKwkJaWYgKGlzYWxudW0oZW5kcHRyWzBdKSB8fCBlcnJubykKKwkJCXJldHVybiByZXRfRVJBTkdFKCk7CisJCS8qIGdvb2QgbnVtYmVyLCBqdXN0IHN1c3BpY2lvdXMgdGVybWluYXRvciAqLworCQllcnJubyA9IEVJTlZBTDsKKwl9CisJcmV0dXJuIHY7Cit9CisKKwordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b3VsbChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwkvKiBzdHJ0b3VsKCIgIC00MjAwMDAwMDAwIikgcmV0dXJucyA5NDk2NzI5NiwgZXJybm8gMCAoISkgKi8KKwkvKiBJIGRvbid0IHRoaW5rIHRoYXQgdGhpcyBpcyByaWdodC4gUHJldmVudGluZyB0aGlzLi4uICovCisJaWYgKCFpc2FsbnVtKGFyZ1swXSkpIHJldHVybiByZXRfRVJBTkdFKCk7CisKKwkvKiBub3QgMTAwJSBjb3JyZWN0IGZvciBsaWIgZnVuYywgYnV0IGNvbnZlbmllbnQgZm9yIHRoZSBjYWxsZXIgKi8KKwllcnJubyA9IDA7CisJdiA9IHN0cnRvdWxsKGFyZywgJmVuZHB0ciwgYmFzZSk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCwgZW5kcHRyKTsKK30KKworbG9uZyBsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b2xsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB2OworCWNoYXIgKmVuZHB0cjsKKworCS8qIENoZWNrIGZvciB0aGUgd2VpcmQgImZlYXR1cmUiOgorCSAqIGEgIi0iIHN0cmluZyBpcyBhcHBhcmVudGx5IGEgdmFsaWQgIm51bWJlciIgZm9yIHN0cnRvW3VdbFtsXSEKKwkgKiBJdCByZXR1cm5zIHplcm8gYW5kIGVycm5vIGlzIDAhIDooICovCisJY2hhciBmaXJzdCA9IChhcmdbMF0gIT0gJy0nID8gYXJnWzBdIDogYXJnWzFdKTsKKwlpZiAoIWlzYWxudW0oZmlyc3QpKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCisJZXJybm8gPSAwOworCXYgPSBzdHJ0b2xsKGFyZywgJmVuZHB0ciwgYmFzZSk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCwgZW5kcHRyKTsKK30KKworI2lmIFVMT05HX01BWCAhPSBVTExPTkdfTUFYCit1bnNpZ25lZCBsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b3VsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwlpZiAoIWlzYWxudW0oYXJnWzBdKSkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvdWwoYXJnLCAmZW5kcHRyLCBiYXNlKTsKKwlyZXR1cm4gaGFuZGxlX2Vycm9ycyh2LCBlbmRwLCBlbmRwdHIpOworfQorCitsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b2woY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7CisJbG9uZyB2OworCWNoYXIgKmVuZHB0cjsKKworCWNoYXIgZmlyc3QgPSAoYXJnWzBdICE9ICctJyA/IGFyZ1swXSA6IGFyZ1sxXSk7CisJaWYgKCFpc2FsbnVtKGZpcnN0KSkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKworCWVycm5vID0gMDsKKwl2ID0gc3RydG9sKGFyZywgJmVuZHB0ciwgYmFzZSk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCwgZW5kcHRyKTsKK30KKyNlbmRpZgorCisjaWYgVUlOVF9NQVggIT0gVUxPTkdfTUFYCit1bnNpZ25lZCBGQVNUX0ZVTkMgYmJfc3RydG91KGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwlpZiAoIWlzYWxudW0oYXJnWzBdKSkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvdWwoYXJnLCAmZW5kcHRyLCBiYXNlKTsKKwlpZiAodiA+IFVJTlRfTUFYKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCXJldHVybiBoYW5kbGVfZXJyb3JzKHYsIGVuZHAsIGVuZHB0cik7Cit9CisKK2ludCBGQVNUX0ZVTkMgYmJfc3RydG9pKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCWxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwljaGFyIGZpcnN0ID0gKGFyZ1swXSAhPSAnLScgPyBhcmdbMF0gOiBhcmdbMV0pOworCWlmICghaXNhbG51bShmaXJzdCkpIHJldHVybiByZXRfRVJBTkdFKCk7CisKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvbChhcmcsICZlbmRwdHIsIGJhc2UpOworCWlmICh2ID4gSU5UX01BWCkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKwlpZiAodiA8IElOVF9NSU4pIHJldHVybiByZXRfRVJBTkdFKCk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCwgZW5kcHRyKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvY2hhbmdlX2lkZW50aXR5LmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9jaGFuZ2VfaWRlbnRpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTlkYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY2hhbmdlX2lkZW50aXR5LmMKQEAgLTAsMCArMSw0MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDE5ODkgLSAxOTkxLCBKdWxpYW5uZSBGcmFuY2VzIEhhdWdoIDxqb2NrZ3JybEBhdXN0aW4ucnIuY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSnVsaWFubmUgRi4gSGF1Z2ggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSlVMSUUgSEFVR0ggQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEpVTElFIEhBVUdIIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEJlY29tZSB0aGUgdXNlciBhbmQgZ3JvdXAocykgc3BlY2lmaWVkIGJ5IFBXLiAgKi8KK3ZvaWQgRkFTVF9GVU5DIGNoYW5nZV9pZGVudGl0eShjb25zdCBzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwlpZiAoaW5pdGdyb3Vwcyhwdy0+cHdfbmFtZSwgcHctPnB3X2dpZCkgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IGdyb3VwcyIpOworCWVuZGdyZW50KCk7IC8qIGhlbHBzIHRvIGNsb3NlIGEgZmQgdXNlZCBpbnRlcm5hbGx5IGJ5IGxpYmMgKi8KKwl4c2V0Z2lkKHB3LT5wd19naWQpOworCXhzZXR1aWQocHctPnB3X3VpZCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9jaG9tcC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY2hvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkyYmVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY2hvbXAuYwpAQCAtMCwwICsxLDE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLgorICogSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZSBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgY2hvbXAoY2hhciAqcykKK3sKKwljaGFyICpsYyA9IGxhc3RfY2hhcl9pcyhzLCAnXG4nKTsKKworCWlmIChsYykKKwkJKmxjID0gJ1wwJzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvbXBhcmVfc3RyaW5nX2FycmF5LmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9jb21wYXJlX3N0cmluZ19hcnJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTBjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9jb21wYXJlX3N0cmluZ19hcnJheS5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIHJldHVybnMgdGhlIGFycmF5IGluZGV4IG9mIHRoZSBzdHJpbmcgKi8KKy8qIChpbmRleCBvZiBmaXJzdCBtYXRjaCBpcyByZXR1cm5lZCwgb3IgLTEpICovCitpbnQgRkFTVF9GVU5DIGluZGV4X2luX3N0cl9hcnJheShjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgc3RyaW5nX2FycmF5W2ldICE9IDA7IGkrKykgeworCQlpZiAoc3RyY21wKHN0cmluZ19hcnJheVtpXSwga2V5KSA9PSAwKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBGQVNUX0ZVTkMgaW5kZXhfaW5fc3RyaW5ncyhjb25zdCBjaGFyICpzdHJpbmdzLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGlkeCA9IDA7CisKKwl3aGlsZSAoKnN0cmluZ3MpIHsKKwkJaWYgKHN0cmNtcChzdHJpbmdzLCBrZXkpID09IDApIHsKKwkJCXJldHVybiBpZHg7CisJCX0KKwkJc3RyaW5ncyArPSBzdHJsZW4oc3RyaW5ncykgKyAxOyAvKiBza2lwIE5VTCAqLworCQlpZHgrKzsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKiByZXR1cm5zIHRoZSBhcnJheSBpbmRleCBvZiB0aGUgc3RyaW5nLCBldmVuIGlmIGl0IG1hdGNoZXMgb25seSBhIGJlZ2lubmluZyAqLworLyogKGluZGV4IG9mIGZpcnN0IG1hdGNoIGlzIHJldHVybmVkLCBvciAtMSkgKi8KKyNpZmRlZiBVTlVTRUQKK2ludCBGQVNUX0ZVTkMgaW5kZXhfaW5fc3Vic3RyX2FycmF5KGNvbnN0IGNoYXIgKmNvbnN0IHN0cmluZ19hcnJheVtdLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGk7CisJaW50IGxlbiA9IHN0cmxlbihrZXkpOworCWlmIChsZW4pIHsKKwkJZm9yIChpID0gMDsgc3RyaW5nX2FycmF5W2ldICE9IDA7IGkrKykgeworCQkJaWYgKHN0cm5jbXAoc3RyaW5nX2FycmF5W2ldLCBrZXksIGxlbikgPT0gMCkgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJfQorCXJldHVybiAtMTsKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIGluZGV4X2luX3N1YnN0cmluZ3MoY29uc3QgY2hhciAqc3RyaW5ncywgY29uc3QgY2hhciAqa2V5KQoreworCWludCBtYXRjaGVkX2lkeCA9IC0xOworCWNvbnN0IGludCBsZW4gPSBzdHJsZW4oa2V5KTsKKworCWlmIChsZW4pIHsKKwkJaW50IGlkeCA9IDA7CisJCXdoaWxlICgqc3RyaW5ncykgeworCQkJaWYgKHN0cm5jbXAoc3RyaW5ncywga2V5LCBsZW4pID09IDApIHsKKwkJCQlpZiAoc3RyaW5nc1tsZW5dID09ICdcMCcpCisJCQkJCXJldHVybiBpZHg7IC8qIGV4YWN0IG1hdGNoICovCisJCQkJaWYgKG1hdGNoZWRfaWR4ID49IDApCisJCQkJCXJldHVybiAtMTsgLyogYW1iaWd1b3VzIG1hdGNoICovCisJCQkJbWF0Y2hlZF9pZHggPSBpZHg7CisJCQl9CisJCQlzdHJpbmdzICs9IHN0cmxlbihzdHJpbmdzKSArIDE7IC8qIHNraXAgTlVMICovCisJCQlpZHgrKzsKKwkJfQorCX0KKwlyZXR1cm4gbWF0Y2hlZF9pZHg7Cit9CisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBudGhfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZ3MsIGludCBuKQoreworCXdoaWxlIChuKSB7CisJCW4tLTsKKwkJc3RyaW5ncyArPSBzdHJsZW4oc3RyaW5ncykgKyAxOworCX0KKwlyZXR1cm4gc3RyaW5nczsKK30KKworI2lmZGVmIFVOVVNFRF9TT19GQVIgLyogb25seSBicmN0bC5jIG5lZWRzIGl0IHlldCAqLworLyogUmV0dXJucyAwIGZvciBubywgMSBmb3IgeWVzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuICAqLworc21hbGxpbnQgRkFTVF9GVU5DIHllc25vKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBub195ZXNbXSBBTElHTjEgPQorCQkiMFwwIiAib2ZmXDAiICJub1wwIgorCQkiMVwwIiAib25cMCIgInllc1wwIjsKKwlpbnQgcmV0ID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhub195ZXMsIHN0cik7CisJcmV0dXJuIHJldCAvIDM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvbmNhdF9wYXRoX2ZpbGUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvbmNhdF9wYXRoX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQyOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY29uY2F0X3BhdGhfZmlsZS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSBtYW55IGRpZmZlcmVudCBwZW9wbGUuCisgKiBJZiB5b3Ugd3JvdGUgdGhpcywgcGxlYXNlIGFja25vd2xlZGdlIHlvdXIgd29yay4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIENvbmNhdGVuYXRlIHBhdGggYW5kIGZpbGVuYW1lIHRvIG5ldyBhbGxvY2F0ZWQgYnVmZmVyLgorICogQWRkICcvJyBvbmx5IGFzIG5lZWRlZCAobm8gZHVwbGljYXRlIC8vIGFyZSBwcm9kdWNlZCkuCisgKiBJZiBwYXRoIGlzIE5VTEwsIGl0IGlzIGFzc3VtZWQgdG8gYmUgIi8iLgorICogZmlsZW5hbWUgc2hvdWxkIG5vdCBiZSBOVUxMLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitjaGFyKiBGQVNUX0ZVTkMgY29uY2F0X3BhdGhfZmlsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICpsYzsKKworCWlmICghcGF0aCkKKwkJcGF0aCA9ICIiOworCWxjID0gbGFzdF9jaGFyX2lzKHBhdGgsICcvJyk7CisJd2hpbGUgKCpmaWxlbmFtZSA9PSAnLycpCisJCWZpbGVuYW1lKys7CisJcmV0dXJuIHhhc3ByaW50ZigiJXMlcyVzIiwgcGF0aCwgKGxjPT1OVUxMID8gIi8iIDogIiIpLCBmaWxlbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9jb25jYXRfc3VicGF0aF9maWxlLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9jb25jYXRfc3VicGF0aF9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxNjdkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvbmNhdF9zdWJwYXRoX2ZpbGUuYwpAQCAtMCwwICsxLDIzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgKEMpIDIwMDMgIFZsYWRpbWlyIE9sZXluaWsgIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICAgVGhpcyBmdW5jdGlvbiBtYWtlIHNwZWNpYWwgZm9yIHJlY3Vyc2l2ZSBhY3Rpb25zIHdpdGggdXNhZ2UKKyAgIGNvbmNhdF9wYXRoX2ZpbGUocGF0aCwgZmlsZW5hbWUpCisgICBhbmQgc2tpcHBpbmcgIi4iIGFuZCAiLi4iIGRpcmVjdG9yeSBlbnRyaWVzCisqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIGNvbmNhdF9zdWJwYXRoX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZikKK3sKKwlpZiAoZiAmJiBET1RfT1JfRE9URE9UKGYpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY29uY2F0X3BhdGhfZmlsZShwYXRoLCBmKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvcHlfZmlsZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY29weV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzM2E4ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvcHlfZmlsZS5jCkBAIC0wLDAgKzEsMzkzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNvcHlfZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICogU0VMaW51eCBzdXBwb3J0IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvLyBGRUFUVVJFX05PTl9QT1NJWF9DUDoKKy8vCisvLyBQT1NJWDogaWYgZXhpc3RzIGFuZCAtaSwgYXNrICh3L28gLWkgYXNzdW1lIHllcykuCisvLyBUaGVuIG9wZW4gdy9vIEVYQ0wgKHllcywgbm90IHVubGluayEpLgorLy8gSWYgb3BlbiBzdGlsbCBmYWlscyBhbmQgLWYsIHRyeSB1bmxpbmssIHRoZW4gdHJ5IG9wZW4gYWdhaW4uCisvLyBSZXN1bHQ6IGEgbWVzczoKKy8vIElmIGRlc3QgaXMgYSAoc3ltKWxpbmssIHdlIG92ZXJ3cml0ZSBsaW5rIGRlc3RpbmF0aW9uIQorLy8gKG9yIGZhaWwsIGlmIGl0IHBvaW50cyB0byBkaXIvbm9uZXhpc3RlbnQgbG9jYXRpb24vZXRjKS4KKy8vIFRoaXMgaXMgc3RyYW5nZSwgYnV0IFBPU0lYLWNvcnJlY3QuCisvLyBjb3JldXRpbHMgY3AgaGFzIC0tcmVtb3ZlLWRlc3RpbmF0aW9uIHRvIG92ZXJyaWRlIHRoaXMuLi4KKworLyogQ2FsbGVkIGlmIG9wZW4gb2YgZGVzdGluYXRpb24sIGxpbmsgY3JlYXRpb24gZXRjIGZhaWxzLgorICogZXJybm8gbXVzdCBiZSBzZXQgdG8gcmVsZXZhbnQgdmFsdWUgKCJ3aHkgd2UgY2Fubm90IGNyZWF0ZSBkZXN0PyIpCisgKiB0byBnaXZlIHJlYXNvbmFibGUgZXJyb3IgbWVzc2FnZSAqLworc3RhdGljIGludCBhc2tfYW5kX3VubGluayhjb25zdCBjaGFyICpkZXN0LCBpbnQgZmxhZ3MpCit7CisJaW50IGUgPSBlcnJubzsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9OT05fUE9TSVhfQ1AKKwlpZiAoIShmbGFncyAmIChGSUxFVVRJTFNfRk9SQ0V8RklMRVVUSUxTX0lOVEVSQUNUSVZFKSkpIHsKKwkJLyogRWl0aGVyIGl0IGV4aXN0cywgb3IgdGhlICpwYXRoKiBkb2VzbnQgZXhpc3QgKi8KKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyciLCBkZXN0KTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCS8vIGVsc2U6IGFjdCBhcyBpZiAtZiBpcyBhbHdheXMgaW4gZWZmZWN0LgorCS8vIFdlIGRvbid0IHdhbnQgImNhbid0IGNyZWF0ZSIgbXNnLCB3ZSB3YW50IHVubGluayB0byBiZSBkb25lCisJLy8gKHNpbGVudGx5IHVubGVzcyAtaSkuIFdoeT8gUE9TSVggY3AgdXN1YWxseSBzdWNjZWVkcyB3aXRoCisJLy8gT19UUlVOQyBvcGVuIG9mIGV4aXN0aW5nIGZpbGUsIGFuZCB1c2VyIGlzIGxlZnQgaWdub3JhbnRseSBoYXBweS4KKwkvLyBXaXRoIGFib3ZlIGJsb2NrIHVuY29uZGl0aW9uYWxseSBlbmFibGVkLCBub24tUE9TSVggY3AKKwkvLyB3aWxsIGNvbXBsYWluIGEgbG90IG1vcmUgdGhhbiBQT1NJWCBvbmUuCisKKwkvKiBUT0RPOiBtYXliZSB3ZSBzaG91bGQgZG8gaXQgb25seSBpZiBjdHR5IGlzIHByZXNlbnQ/ICovCisJaWYgKGZsYWdzICYgRklMRVVUSUxTX0lOVEVSQUNUSVZFKSB7CisJCS8vIFdlIHdvdWxkIG5vdCBkbyBQT1NJWCBpbnNhbml0eS4gLWkgYXNrcywKKwkJLy8gdGhlbiBfdW5saW5rc18gdGhlIG9mZmVuZGVyLiBQcmVzdG8uCisJCS8vIChObyAib3BlbmluZyB3aXRob3V0IE9fRVhDTCIsIG5vICJ1bmxpbmsgb25seSBpZiAtZiIpCisJCS8vIE9yIGVsc2Ugd2Ugd2lsbCBlbmQgdXAgaGF2aW5nIDMgb3BlbigpcyEKKwkJZnByaW50ZihzdGRlcnIsICIlczogb3ZlcndyaXRlICclcyc/ICIsIGFwcGxldF9uYW1lLCBkZXN0KTsKKwkJaWYgKCFiYl9hc2tfY29uZmlybWF0aW9uKCkpCisJCQlyZXR1cm4gMDsgLyogbm90IGFsbG93ZWQgdG8gb3ZlcndyaXRlICovCisJfQorCWlmICh1bmxpbmsoZGVzdCkgPCAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFCisJCWlmIChlID09IGVycm5vICYmIGUgPT0gRU5PRU5UKSB7CisJCQkvKiBlID09IEVOT1RESVIgaXMgc2ltaWxhcjogcGF0aCBoYXMgbm9uLWRpciBjb21wb25lbnQsCisJCQkgKiBidXQgaW4gdGhpcyBjYXNlIHdlIGRvbid0IGV2ZW4gcmVhY2ggY29weV9maWxlKCkgKi8KKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyc6IFBhdGggZG9lcyBub3QgZXhpc3QiLCBkZXN0KTsKKwkJCXJldHVybiAtMTsgLyogZXJyb3IgKi8KKwkJfQorI2VuZGlmCisJCWVycm5vID0gZTsgLyogZG8gbm90IHVzZSBlcnJubyBmcm9tIHVubGluayAqLworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIGRlc3QpOworCQlyZXR1cm4gLTE7IC8qIGVycm9yICovCisJfQorCXJldHVybiAxOyAvKiBvayAodG8gdHJ5IGFnYWluKSAqLworfQorCisvKiBSZXR1cm46CisgKiAtMSBlcnJvciwgY29weSBub3QgbWFkZQorICogIDAgY29weSBpcyBtYWRlIG9yIHVzZXIgYW5zd2VyZWQgIm5vIiBpbiBpbnRlcmFjdGl2ZSBtb2RlCisgKiAgICAoZmFpbHVyZXMgdG8gcHJlc2VydmUgbW9kZS9vd25lci90aW1lcyBhcmUgbm90IHJlcG9ydGVkIGluIGV4aXQgY29kZSkKKyAqLworaW50IEZBU1RfRlVOQyBjb3B5X2ZpbGUoY29uc3QgY2hhciAqc291cmNlLCBjb25zdCBjaGFyICpkZXN0LCBpbnQgZmxhZ3MpCit7CisJLyogVGhpcyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiwgdHJ5IHRvIG1pbmltaXplIHN0YWNrIHVzYWdlICovCisJLyogTkI6IGVhY2ggc3RydWN0IHN0YXQgaXMgfjEwMCBieXRlcyAqLworCXN0cnVjdCBzdGF0IHNvdXJjZV9zdGF0OworCXN0cnVjdCBzdGF0IGRlc3Rfc3RhdDsKKwlzbWFsbGludCByZXR2YWwgPSAwOworCXNtYWxsaW50IGRlc3RfZXhpc3RzID0gMDsKKwlzbWFsbGludCBvdnI7CisKKy8qIEludmVyc2Ugb2YgY3AgLWQgKCJjcCB3aXRob3V0IC1kIikgKi8KKyNkZWZpbmUgRkxBR1NfREVSRUYgKGZsYWdzICYgKEZJTEVVVElMU19ERVJFRkVSRU5DRSArIEZJTEVVVElMU19ERVJFRkVSRU5DRV9MMCkpCisKKwlpZiAoKEZMQUdTX0RFUkVGID8gc3RhdCA6IGxzdGF0KShzb3VyY2UsICZzb3VyY2Vfc3RhdCkgPCAwKSB7CisJCS8qIFRoaXMgbWF5IGJlIGEgZGFuZ2xpbmcgc3ltbGluay4KKwkJICogTWFraW5nIFtzeW1dbGlua3MgdG8gZGFuZ2xpbmcgc3ltbGlua3Mgd29ya3MsIHNvLi4uICovCisJCWlmIChmbGFncyAmIChGSUxFVVRJTFNfTUFLRV9TT0ZUTElOS3xGSUxFVVRJTFNfTUFLRV9IQVJETElOSykpCisJCQlnb3RvIG1ha2VfbGlua3M7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIHNvdXJjZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobHN0YXQoZGVzdCwgJmRlc3Rfc3RhdCkgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIGRlc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNvdXJjZV9zdGF0LnN0X2RldiA9PSBkZXN0X3N0YXQuc3RfZGV2CisJCSAmJiBzb3VyY2Vfc3RhdC5zdF9pbm8gPT0gZGVzdF9zdGF0LnN0X2lubworCQkpIHsKKwkJCWJiX2Vycm9yX21zZygiJyVzJyBhbmQgJyVzJyBhcmUgdGhlIHNhbWUgZmlsZSIsIHNvdXJjZSwgZGVzdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZGVzdF9leGlzdHMgPSAxOworCX0KKworI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKChmbGFncyAmIEZJTEVVVElMU19QUkVTRVJWRV9TRUNVUklUWV9DT05URVhUKSAmJiBpc19zZWxpbnV4X2VuYWJsZWQoKSA+IDApIHsKKwkJc2VjdXJpdHlfY29udGV4dF90IGNvbjsKKwkJaWYgKGxnZXRmaWxlY29uKHNvdXJjZSwgJmNvbikgPj0gMCkgeworCQkJaWYgKHNldGZzY3JlYXRlY29uKGNvbikgPCAwKSB7CisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc2V0IHNldGZzY3JlYXRlY29uICVzIiwgY29uKTsKKwkJCQlmcmVlY29uKGNvbik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKGVycm5vID09IEVOT1RTVVAgfHwgZXJybm8gPT0gRU5PREFUQSkgeworCQkJc2V0ZnNjcmVhdGVjb25fb3JfZGllKE5VTEwpOworCQl9IGVsc2UgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgbGdldGZpbGVjb24gJXMiLCBzb3VyY2UpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoU19JU0RJUihzb3VyY2Vfc3RhdC5zdF9tb2RlKSkgeworCQlESVIgKmRwOworCQljb25zdCBjaGFyICp0cDsKKwkJc3RydWN0IGRpcmVudCAqZDsKKwkJbW9kZV90IHNhdmVkX3VtYXNrID0gMDsKKworCQlpZiAoIShmbGFncyAmIEZJTEVVVElMU19SRUNVUikpIHsKKwkJCWJiX2Vycm9yX21zZygib21pdHRpbmcgZGlyZWN0b3J5ICclcyciLCBzb3VyY2UpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogRGlkIHdlIGV2ZXIgY3JlYXRlIHNvdXJjZSBvdXJzZWxmIGJlZm9yZT8gKi8KKwkJdHAgPSBpc19pbl9pbm9fZGV2X2hhc2h0YWJsZSgmc291cmNlX3N0YXQpOworCQlpZiAodHApIHsKKwkJCS8qIFdlIGRpZCEgaXQncyBhIHJlY3Vyc2lvbiEgbWFuIHRoZSBsaWZlYm9hdHMuLi4gKi8KKwkJCWJiX2Vycm9yX21zZygicmVjdXJzaW9uIGRldGVjdGVkLCBvbWl0dGluZyBkaXJlY3RvcnkgJyVzJyIsCisJCQkJCXNvdXJjZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoZGVzdF9leGlzdHMpIHsKKwkJCWlmICghU19JU0RJUihkZXN0X3N0YXQuc3RfbW9kZSkpIHsKKwkJCQliYl9lcnJvcl9tc2coInRhcmdldCAnJXMnIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGRlc3QpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCS8qIHJhY2UgaGVyZTogdXNlciBjYW4gc3Vic3RpdHV0ZSBhIHN5bWxpbmsgYmV0d2VlbgorCQkJICogdGhpcyBjaGVjayBhbmQgYWN0dWFsIGNyZWF0aW9uIG9mIGZpbGVzIGluc2lkZSBkZXN0ICovCisJCX0gZWxzZSB7CisJCQkvKiBDcmVhdGUgREVTVCAqLworCQkJbW9kZV90IG1vZGU7CisJCQlzYXZlZF91bWFzayA9IHVtYXNrKDApOworCisJCQltb2RlID0gc291cmNlX3N0YXQuc3RfbW9kZTsKKwkJCWlmICghKGZsYWdzICYgRklMRVVUSUxTX1BSRVNFUlZFX1NUQVRVUykpCisJCQkJbW9kZSA9IHNvdXJjZV9zdGF0LnN0X21vZGUgJiB+c2F2ZWRfdW1hc2s7CisJCQkvKiBBbGxvdyBvd25lciB0byBhY2Nlc3MgbmV3IGRpciAoYXQgbGVhc3QgZm9yIG5vdykgKi8KKwkJCW1vZGUgfD0gU19JUldYVTsKKwkJCWlmIChta2RpcihkZXN0LCBtb2RlKSA8IDApIHsKKwkJCQl1bWFzayhzYXZlZF91bWFzayk7CisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnIiwgZGVzdCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJdW1hc2soc2F2ZWRfdW1hc2spOworCQkJLyogbmVlZCBzdGF0IGluZm8gZm9yIGFkZF90b19pbm9fZGV2X2hhc2h0YWJsZSAqLworCQkJaWYgKGxzdGF0KGRlc3QsICZkZXN0X3N0YXQpIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIGRlc3QpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQkvKiByZW1lbWJlciAoZGV2LGlub2RlKSBvZiBlYWNoIGNyZWF0ZWQgZGlyLgorCQkgKiBOVUxMOiBuYW1lIGlzIG5vdCByZW1lbWJlcmVkICovCisJCWFkZF90b19pbm9fZGV2X2hhc2h0YWJsZSgmZGVzdF9zdGF0LCBOVUxMKTsKKworCQkvKiBSZWN1cnNpdmVseSBjb3B5IGZpbGVzIGluIFNPVVJDRSAqLworCQlkcCA9IG9wZW5kaXIoc291cmNlKTsKKwkJaWYgKGRwID09IE5VTEwpIHsKKwkJCXJldHZhbCA9IC0xOworCQkJZ290byBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZTsKKwkJfQorCisJCXdoaWxlICgoZCA9IHJlYWRkaXIoZHApKSAhPSBOVUxMKSB7CisJCQljaGFyICpuZXdfc291cmNlLCAqbmV3X2Rlc3Q7CisKKwkJCW5ld19zb3VyY2UgPSBjb25jYXRfc3VicGF0aF9maWxlKHNvdXJjZSwgZC0+ZF9uYW1lKTsKKwkJCWlmIChuZXdfc291cmNlID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQluZXdfZGVzdCA9IGNvbmNhdF9wYXRoX2ZpbGUoZGVzdCwgZC0+ZF9uYW1lKTsKKwkJCWlmIChjb3B5X2ZpbGUobmV3X3NvdXJjZSwgbmV3X2Rlc3QsIGZsYWdzICYgfkZJTEVVVElMU19ERVJFRkVSRU5DRV9MMCkgPCAwKQorCQkJCXJldHZhbCA9IC0xOworCQkJZnJlZShuZXdfc291cmNlKTsKKwkJCWZyZWUobmV3X2Rlc3QpOworCQl9CisJCWNsb3NlZGlyKGRwKTsKKworCQlpZiAoIWRlc3RfZXhpc3RzCisJCSAmJiBjaG1vZChkZXN0LCBzb3VyY2Vfc3RhdC5zdF9tb2RlICYgfnNhdmVkX3VtYXNrKSA8IDAKKwkJKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBwcmVzZXJ2ZSAlcyBvZiAnJXMnIiwgInBlcm1pc3Npb25zIiwgZGVzdCk7CisJCQkvKiByZXR2YWwgPSAtMTsgLSBXUk9ORyEgY29weSAqV0FTKiBtYWRlICovCisJCX0KKwkJZ290byBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZTsKKwl9CisKKwlpZiAoZmxhZ3MgJiAoRklMRVVUSUxTX01BS0VfU09GVExJTkt8RklMRVVUSUxTX01BS0VfSEFSRExJTkspKSB7CisJCWludCAoKmxmKShjb25zdCBjaGFyICpvbGRwYXRoLCBjb25zdCBjaGFyICpuZXdwYXRoKTsKKyBtYWtlX2xpbmtzOgorCQkvKiBIbW0uLi4gbWF5YmUKKwkJICogaWYgKERFUkVGICYmIE1BS0VfU09GVExJTkspIHNvdXJjZSA9IHJlYWxwYXRoKHNvdXJjZSkgPworCQkgKiAoYnV0IHJlYWxwYXRoIHJldHVybnMgTlVMTCBvbiBkYW5nbGluZyBzeW1saW5rcy4uLikgKi8KKwkJbGYgPSAoZmxhZ3MgJiBGSUxFVVRJTFNfTUFLRV9TT0ZUTElOSykgPyBzeW1saW5rIDogbGluazsKKwkJaWYgKGxmKHNvdXJjZSwgZGVzdCkgPCAwKSB7CisJCQlvdnIgPSBhc2tfYW5kX3VubGluayhkZXN0LCBmbGFncyk7CisJCQlpZiAob3ZyIDw9IDApCisJCQkJcmV0dXJuIG92cjsKKwkJCWlmIChsZihzb3VyY2UsIGRlc3QpIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBsaW5rICclcyciLCBkZXN0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJLyogX05vdF8ganVtcGluZyB0byBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZToKKwkJICogKHN5bSlsaW5rcyBkb24ndCBoYXZlIHRob3NlICovCisJCXJldHVybiAwOworCX0KKworCWlmICgvKiAiY3AgdGhpbmcxIHRoaW5nMiIgd2l0aG91dCAtUjoganVzdCBvcGVuIGFuZCByZWFkKCkgZnJvbSB0aGluZzEgKi8KKwkgICAgIShmbGFncyAmIEZJTEVVVElMU19SRUNVUikKKwkgICAgLyogImNwIFstb3B0c10gcmVndWxhcl9maWxlIHRoaW5nMiIgKi8KKwkgfHwgU19JU1JFRyhzb3VyY2Vfc3RhdC5zdF9tb2RlKQorCSAvKiBERVJFRiB1c2VzIHN0YXQsIHdoaWNoIG5ldmVyIHJldHVybnMgU19JU0xOSygpID09IHRydWUuCisJICAqIFNvIHRoZSBiZWxvdyBpcyBuZXZlciB0cnVlOiAqLworCSAvKiB8fCAoRkxBR1NfREVSRUYgJiYgU19JU0xOSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSkgKi8KKwkpIHsKKwkJaW50IHNyY19mZDsKKwkJaW50IGRzdF9mZDsKKwkJbW9kZV90IG5ld19tb2RlOworCisJCWlmICghRkxBR1NfREVSRUYgJiYgU19JU0xOSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSkgeworCQkJLyogImNwIC1kIHN5bWxpbmsgZHN0IjogY3JlYXRlIGEgbGluayAqLworCQkJZ290byBkb250X2NhdDsKKwkJfQorCisJCWlmIChFTkFCTEVfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1MgJiYgIUZMQUdTX0RFUkVGKSB7CisJCQljb25zdCBjaGFyICpsaW5rX3RhcmdldDsKKwkJCWxpbmtfdGFyZ2V0ID0gaXNfaW5faW5vX2Rldl9oYXNodGFibGUoJnNvdXJjZV9zdGF0KTsKKwkJCWlmIChsaW5rX3RhcmdldCkgeworCQkJCWlmIChsaW5rKGxpbmtfdGFyZ2V0LCBkZXN0KSA8IDApIHsKKwkJCQkJb3ZyID0gYXNrX2FuZF91bmxpbmsoZGVzdCwgZmxhZ3MpOworCQkJCQlpZiAob3ZyIDw9IDApCisJCQkJCQlyZXR1cm4gb3ZyOworCQkJCQlpZiAobGluayhsaW5rX3RhcmdldCwgZGVzdCkgPCAwKSB7CisJCQkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgbGluayAnJXMnIiwgZGVzdCk7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlhZGRfdG9faW5vX2Rldl9oYXNodGFibGUoJnNvdXJjZV9zdGF0LCBkZXN0KTsKKwkJfQorCisJCXNyY19mZCA9IG9wZW5fb3Jfd2Fybihzb3VyY2UsIE9fUkRPTkxZKTsKKwkJaWYgKHNyY19mZCA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJLyogRG8gbm90IHRyeSB0byBvcGVuIHdpdGggd2VpcmQgbW9kZSBmaWVsZHMgKi8KKwkJbmV3X21vZGUgPSBzb3VyY2Vfc3RhdC5zdF9tb2RlOworCQlpZiAoIVNfSVNSRUcoc291cmNlX3N0YXQuc3RfbW9kZSkpCisJCQluZXdfbW9kZSA9IDA2NjY7CisKKwkJLy8gUE9TSVggd2F5IGlzIGEgc2VjdXJpdHkgcHJvYmxlbSB2ZXJzdXMgKHN5bSlsaW5rIGF0dGFja3MKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9OT05fUE9TSVhfQ1ApIHsKKwkJCWRzdF9mZCA9IG9wZW4oZGVzdCwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCBuZXdfbW9kZSk7CisJCX0gZWxzZSB7IC8qIHNhZmUgd2F5OiAqLworCQkJZHN0X2ZkID0gb3BlbihkZXN0LCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTCwgbmV3X21vZGUpOworCQl9CisJCWlmIChkc3RfZmQgPT0gLTEpIHsKKwkJCW92ciA9IGFza19hbmRfdW5saW5rKGRlc3QsIGZsYWdzKTsKKwkJCWlmIChvdnIgPD0gMCkgeworCQkJCWNsb3NlKHNyY19mZCk7CisJCQkJcmV0dXJuIG92cjsKKwkJCX0KKwkJCS8qIEl0IHNob3VsZG4ndCBleGlzdC4gSWYgaXQgZXhpc3RzLCBkbyBub3Qgb3BlbiAoc3ltbGluayBhdHRhY2s/KSAqLworCQkJZHN0X2ZkID0gb3BlbjNfb3Jfd2FybihkZXN0LCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTCwgbmV3X21vZGUpOworCQkJaWYgKGRzdF9mZCA8IDApIHsKKwkJCQljbG9zZShzcmNfZmQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKChmbGFncyAmIChGSUxFVVRJTFNfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVHxGSUxFVVRJTFNfU0VUX1NFQ1VSSVRZX0NPTlRFWFQpKQorCQkgJiYgaXNfc2VsaW51eF9lbmFibGVkKCkgPiAwCisJCSkgeworCQkJc2VjdXJpdHlfY29udGV4dF90IGNvbjsKKwkJCWlmIChnZXRmc2NyZWF0ZWNvbigmY29uKSA9PSAtMSkgeworCQkJCWJiX3BlcnJvcl9tc2coImdldGZzY3JlYXRlY29uIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGNvbikgeworCQkJCWlmIChzZXRmaWxlY29uKGRlc3QsIGNvbikgPT0gLTEpIHsKKwkJCQkJYmJfcGVycm9yX21zZygic2V0ZmlsZWNvbjolcywlcyIsIGRlc3QsIGNvbik7CisJCQkJCWZyZWVjb24oY29uKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlmcmVlY29uKGNvbik7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZiAoYmJfY29weWZkX2VvZihzcmNfZmQsIGRzdF9mZCkgPT0gLTEpCisJCQlyZXR2YWwgPSAtMTsKKwkJLyogQ2FyZWZ1bCB3aXRoIHdyaXRpbmcuLi4gKi8KKwkJaWYgKGNsb3NlKGRzdF9mZCkgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJlcnJvciB3cml0aW5nIHRvICclcyciLCBkZXN0KTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisJCS8qIC4uLmJ1dCByZWFkIHNpemUgaXMgYWxyZWFkeSBjaGVja2VkIGJ5IGJiX2NvcHlmZF9lb2YgKi8KKwkJY2xvc2Uoc3JjX2ZkKTsKKwkJLyogImNwIC9kZXYvc29tZXRoaW5nIG5ld19maWxlIiBzaG91bGQgbm90CisJCSAqIGNvcHkgbW9kZSBvZiAvZGV2L3NvbWV0aGluZyAqLworCQlpZiAoIVNfSVNSRUcoc291cmNlX3N0YXQuc3RfbW9kZSkpCisJCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIHByZXNlcnZlX21vZGVfdWdpZF90aW1lOworCX0KKyBkb250X2NhdDoKKworCS8qIFNvdXJjZSBpcyBhIHN5bWxpbmsgb3IgYSBzcGVjaWFsIGZpbGUgKi8KKwkvKiBXZSBhcmUgbGF6eSBoZXJlLCBhIGJpdCBsYXggd2l0aCByYWNlcy4uLiAqLworCWlmIChkZXN0X2V4aXN0cykgeworCQllcnJubyA9IEVFWElTVDsKKwkJb3ZyID0gYXNrX2FuZF91bmxpbmsoZGVzdCwgZmxhZ3MpOworCQlpZiAob3ZyIDw9IDApCisJCQlyZXR1cm4gb3ZyOworCX0KKwlpZiAoU19JU0xOSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSkgeworCQljaGFyICpscGF0aCA9IHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2Fybihzb3VyY2UpOworCQlpZiAobHBhdGgpIHsKKwkJCWludCByID0gc3ltbGluayhscGF0aCwgZGVzdCk7CisJCQlmcmVlKGxwYXRoKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBzeW1saW5rICclcyciLCBkZXN0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZmxhZ3MgJiBGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTKQorCQkJCWlmIChsY2hvd24oZGVzdCwgc291cmNlX3N0YXQuc3RfdWlkLCBzb3VyY2Vfc3RhdC5zdF9naWQpIDwgMCkKKwkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcHJlc2VydmUgJXMgb2YgJyVzJyIsICJvd25lcnNoaXAiLCBkZXN0KTsKKwkJfQorCQkvKiBfTm90XyBqdW1waW5nIHRvIHByZXNlcnZlX21vZGVfdWdpZF90aW1lOgorCQkgKiBzeW1saW5rcyBkb24ndCBoYXZlIHRob3NlICovCisJCXJldHVybiAwOworCX0KKwlpZiAoU19JU0JMSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSB8fCBTX0lTQ0hSKHNvdXJjZV9zdGF0LnN0X21vZGUpCisJIHx8IFNfSVNTT0NLKHNvdXJjZV9zdGF0LnN0X21vZGUpIHx8IFNfSVNGSUZPKHNvdXJjZV9zdGF0LnN0X21vZGUpCisJKSB7CisJCWlmIChta25vZChkZXN0LCBzb3VyY2Vfc3RhdC5zdF9tb2RlLCBzb3VyY2Vfc3RhdC5zdF9yZGV2KSA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSAnJXMnIiwgZGVzdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQliYl9lcnJvcl9tc2coInVucmVjb2duaXplZCBmaWxlICclcycgd2l0aCBtb2RlICV4Iiwgc291cmNlLCBzb3VyY2Vfc3RhdC5zdF9tb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKworIHByZXNlcnZlX21vZGVfdWdpZF90aW1lOgorCisJaWYgKGZsYWdzICYgRklMRVVUSUxTX1BSRVNFUlZFX1NUQVRVUworCS8qIENhbm5vdCBoYXBwZW46ICovCisJLyogJiYgIShmbGFncyAmIChGSUxFVVRJTFNfTUFLRV9TT0ZUTElOS3xGSUxFVVRJTFNfTUFLRV9IQVJETElOSykpICovCisJKSB7CisJCXN0cnVjdCB0aW1ldmFsIHRpbWVzWzJdOworCisJCXRpbWVzWzFdLnR2X3NlYyA9IHRpbWVzWzBdLnR2X3NlYyA9IHNvdXJjZV9zdGF0LnN0X210aW1lOworCQl0aW1lc1sxXS50dl91c2VjID0gdGltZXNbMF0udHZfdXNlYyA9IDA7CisJCS8qIEJUVywgdXRpbWVzIHNldHMgdXNlYy1wcmVjaXNpb24gdGltZSAtIGp1c3QgRllJICovCisJCWlmICh1dGltZXMoZGVzdCwgdGltZXMpIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHByZXNlcnZlICVzIG9mICclcyciLCAidGltZXMiLCBkZXN0KTsKKwkJaWYgKGNob3duKGRlc3QsIHNvdXJjZV9zdGF0LnN0X3VpZCwgc291cmNlX3N0YXQuc3RfZ2lkKSA8IDApIHsKKwkJCXNvdXJjZV9zdGF0LnN0X21vZGUgJj0gfihTX0lTVUlEIHwgU19JU0dJRCk7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBwcmVzZXJ2ZSAlcyBvZiAnJXMnIiwgIm93bmVyc2hpcCIsIGRlc3QpOworCQl9CisJCWlmIChjaG1vZChkZXN0LCBzb3VyY2Vfc3RhdC5zdF9tb2RlKSA8IDApCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBwcmVzZXJ2ZSAlcyBvZiAnJXMnIiwgInBlcm1pc3Npb25zIiwgZGVzdCk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvcHlmZC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY29weWZkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhMjc0NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvcHlmZC5jCkBAIC0wLDAgKzEsMTM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBVc2VkIGJ5IE5PRk9SSyBhcHBsZXRzIChlLmcuIGNhdCkgLSBtdXN0IG5vdCB1c2UgeG1hbGxvYy4KKyAqIHNpemUgPCAwIG1lYW5zICJpZ25vcmUgd3JpdGUgZXJyb3JzIiwgdXNlZCBieSB0YXIgLS10by1jb21tYW5kCisgKiBzaXplID0gMCBtZWFucyAiY29weSB0aWxsIEVPRiIKKyAqLworc3RhdGljIG9mZl90IGJiX2Z1bGxfZmRfYWN0aW9uKGludCBzcmNfZmQsIGludCBkc3RfZmQsIG9mZl90IHNpemUpCit7CisJaW50IHN0YXR1cyA9IC0xOworCW9mZl90IHRvdGFsID0gMDsKKwlib29sIGNvbnRpbnVlX29uX3dyaXRlX2Vycm9yID0gMDsKKyNpZiBDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCIDw9IDQKKwljaGFyIGJ1ZmZlcltDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCICogMTAyNF07CisJZW51bSB7IGJ1ZmZlcl9zaXplID0gc2l6ZW9mKGJ1ZmZlcikgfTsKKyNlbHNlCisJY2hhciAqYnVmZmVyOworCWludCBidWZmZXJfc2l6ZTsKKyNlbmRpZgorCisJaWYgKHNpemUgPCAwKSB7CisJCXNpemUgPSAtc2l6ZTsKKwkJY29udGludWVfb25fd3JpdGVfZXJyb3IgPSAxOworCX0KKworI2lmIENPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0IgPiA0CisJaWYgKHNpemUgPiAwICYmIHNpemUgPD0gNCAqIDEwMjQpCisJCWdvdG8gdXNlX3NtYWxsX2J1ZjsKKwkvKiBXZSB3YW50IHBhZ2UtYWxpZ25lZCBidWZmZXIsIGp1c3QgaW4gY2FzZSBrZXJuZWwgaXMgY2xldmVyCisJICogYW5kIGNhbiBkbyBwYWdlLWFsaWduZWQgaW8gbW9yZSBlZmZpY2llbnRseSAqLworCWJ1ZmZlciA9IG1tYXAoTlVMTCwgQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQiAqIDEwMjQsCisJCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwKKwkJCS8qIGlnbm9yZWQ6ICovIC0xLCAwKTsKKwlidWZmZXJfc2l6ZSA9IENPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0IgKiAxMDI0OworCWlmIChidWZmZXIgPT0gTUFQX0ZBSUxFRCkgeworIHVzZV9zbWFsbF9idWY6CisJCWJ1ZmZlciA9IGFsbG9jYSg0ICogMTAyNCk7CisJCWJ1ZmZlcl9zaXplID0gNCAqIDEwMjQ7CisJfQorI2VuZGlmCisKKwlpZiAoc3JjX2ZkIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIXNpemUpIHsKKwkJc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQlzdGF0dXMgPSAxOyAvKiBjb3B5IHVudGlsIGVvZiAqLworCX0KKworCXdoaWxlICgxKSB7CisJCXNzaXplX3QgcmQ7CisKKwkJcmQgPSBzYWZlX3JlYWQoc3JjX2ZkLCBidWZmZXIsIHNpemUgPiBidWZmZXJfc2l6ZSA/IGJ1ZmZlcl9zaXplIDogc2l6ZSk7CisKKwkJaWYgKCFyZCkgeyAvKiBlb2YgLSBhbGwgZG9uZSAqLworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZCA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJYnJlYWs7CisJCX0KKwkJLyogZHN0X2ZkID09IC0xIGlzIGEgZmFrZSwgZWxzZS4uLiAqLworCQlpZiAoZHN0X2ZkID49IDApIHsKKwkJCXNzaXplX3Qgd3IgPSBmdWxsX3dyaXRlKGRzdF9mZCwgYnVmZmVyLCByZCk7CisJCQlpZiAod3IgPCByZCkgeworCQkJCWlmICghY29udGludWVfb25fd3JpdGVfZXJyb3IpIHsKKwkJCQkJYmJfcGVycm9yX21zZyhiYl9tc2dfd3JpdGVfZXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZHN0X2ZkID0gLTE7CisJCQl9CisJCX0KKwkJdG90YWwgKz0gcmQ7CisJCWlmIChzdGF0dXMgPCAwKSB7IC8qIGlmIHdlIGFyZW4ndCBjb3B5aW5nIHRpbGwgRU9GLi4uICovCisJCQlzaXplIC09IHJkOworCQkJaWYgKCFzaXplKSB7CisJCQkJLyogJ3NpemUnIGJ5dGVzIGNvcGllZCAtIGFsbCBkb25lICovCisJCQkJc3RhdHVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKyBvdXQ6CisKKyNpZiBDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCID4gNAorCWlmIChidWZmZXJfc2l6ZSAhPSA0ICogMTAyNCkKKwkJbXVubWFwKGJ1ZmZlciwgYnVmZmVyX3NpemUpOworI2VuZGlmCisJcmV0dXJuIHN0YXR1cyA/IC0xIDogdG90YWw7Cit9CisKKworI2lmIDAKK3ZvaWQgRkFTVF9GVU5DIGNvbXBsYWluX2NvcHlmZF9hbmRfZGllKG9mZl90IHN6KQoreworCWlmIChzeiAhPSAtMSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkvKiBpZiBzeiA9PSAtMSwgYmJfY29weWZkX1hYIGFscmVhZHkgY29tcGxhaW5lZCAqLworCXhmdW5jX2RpZSgpOworfQorI2VuZGlmCisKK29mZl90IEZBU1RfRlVOQyBiYl9jb3B5ZmRfc2l6ZShpbnQgZmQxLCBpbnQgZmQyLCBvZmZfdCBzaXplKQoreworCWlmIChzaXplKSB7CisJCXJldHVybiBiYl9mdWxsX2ZkX2FjdGlvbihmZDEsIGZkMiwgc2l6ZSk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9jb3B5ZmRfZXhhY3Rfc2l6ZShpbnQgZmQxLCBpbnQgZmQyLCBvZmZfdCBzaXplKQoreworCW9mZl90IHN6ID0gYmJfY29weWZkX3NpemUoZmQxLCBmZDIsIHNpemUpOworCWlmIChzeiA9PSAoc2l6ZSA+PSAwID8gc2l6ZSA6IC1zaXplKSkKKwkJcmV0dXJuOworCWlmIChzeiAhPSAtMSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkvKiBpZiBzeiA9PSAtMSwgYmJfY29weWZkX1hYIGFscmVhZHkgY29tcGxhaW5lZCAqLworCXhmdW5jX2RpZSgpOworfQorCitvZmZfdCBGQVNUX0ZVTkMgYmJfY29weWZkX2VvZihpbnQgZmQxLCBpbnQgZmQyKQoreworCXJldHVybiBiYl9mdWxsX2ZkX2FjdGlvbihmZDEsIGZkMiwgMCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9jb3JyZWN0X3Bhc3N3b3JkLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9jb3JyZWN0X3Bhc3N3b3JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwMTU4OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2NvcnJlY3RfcGFzc3dvcmQuYwpAQCAtMCwwICsxLDgwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgMTk4OSAtIDE5OTEsIEp1bGlhbm5lIEZyYW5jZXMgSGF1Z2ggPGpvY2tncnJsQGF1c3Rpbi5yci5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBKdWxpYW5uZSBGLiBIYXVnaCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBKVUxJRSBIQVVHSCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSlVMSUUgSEFVR0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogQXNrIHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkLgorICogUmV0dXJuIDEgaWYgdGhlIHVzZXIgZ2l2ZXMgdGhlIGNvcnJlY3QgcGFzc3dvcmQgZm9yIGVudHJ5IFBXLAorICogMCBpZiBub3QuICBSZXR1cm4gMSB3aXRob3V0IGFza2luZyBpZiBQVyBoYXMgYW4gZW1wdHkgcGFzc3dvcmQuCisgKgorICogTlVMTCBwdyBtZWFucyAianVzdCBmYWtlIGl0IGZvciBsb2dpbiB3aXRoIGJhZCB1c2VybmFtZSIgKi8KKworaW50IEZBU1RfRlVOQyBjb3JyZWN0X3Bhc3N3b3JkKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KQoreworCWNoYXIgKnVuZW5jcnlwdGVkLCAqZW5jcnlwdGVkOworCWNvbnN0IGNoYXIgKmNvcnJlY3Q7CisJaW50IHI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCS8qIFVzaW5nIF9yIGZ1bmN0aW9uIHRvIGF2b2lkIHB1bGxpbmcgaW4gc3RhdGljIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3Qgc3B3ZCBzcHc7CisJY2hhciBidWZmZXJbMjU2XTsKKyNlbmRpZgorCisJLyogZmFrZSBzYWx0LiBjcnlwdCgpIGNhbiBjaG9rZSBvdGhlcndpc2UuICovCisJY29ycmVjdCA9ICJhYSI7CisJaWYgKCFwdykgeworCQkvKiAiYWEiIHdpbGwgbmV2ZXIgbWF0Y2ggKi8KKwkJZ290byBmYWtlX2l0OworCX0KKwljb3JyZWN0ID0gcHctPnB3X3Bhc3N3ZDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJaWYgKChjb3JyZWN0WzBdID09ICd4JyB8fCBjb3JyZWN0WzBdID09ICcqJykgJiYgIWNvcnJlY3RbMV0pIHsKKwkJLyogZ2V0c3BuYW1fciBtYXkgcmV0dXJuIDAgeWV0IHNldCByZXN1bHQgdG8gTlVMTC4KKwkJICogQXQgbGVhc3QgZ2xpYmMgMi40IGRvZXMgdGhpcy4gQmUgZXh0cmEgcGFyYW5vaWQgaGVyZS4gKi8KKwkJc3RydWN0IHNwd2QgKnJlc3VsdCA9IE5VTEw7CisJCXIgPSBnZXRzcG5hbV9yKHB3LT5wd19uYW1lLCAmc3B3LCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAmcmVzdWx0KTsKKwkJY29ycmVjdCA9IChyIHx8ICFyZXN1bHQpID8gImFhIiA6IHJlc3VsdC0+c3BfcHdkcDsKKwl9CisjZW5kaWYKKworCWlmICghY29ycmVjdFswXSkgLyogZW1wdHkgcGFzc3dvcmQgZmllbGQ/ICovCisJCXJldHVybiAxOworCisgZmFrZV9pdDoKKwl1bmVuY3J5cHRlZCA9IGJiX2Fza19zdGRpbigiUGFzc3dvcmQ6ICIpOworCWlmICghdW5lbmNyeXB0ZWQpIHsKKwkJcmV0dXJuIDA7CisJfQorCWVuY3J5cHRlZCA9IHB3X2VuY3J5cHQodW5lbmNyeXB0ZWQsIGNvcnJlY3QsIDEpOworCXIgPSAoc3RyY21wKGVuY3J5cHRlZCwgY29ycmVjdCkgPT0gMCk7CisJZnJlZShlbmNyeXB0ZWQpOworCW1lbXNldCh1bmVuY3J5cHRlZCwgMCwgc3RybGVuKHVuZW5jcnlwdGVkKSk7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9jcmMzMi5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzk4MzZjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY3JjMzIuYwpAQCAtMCwwICsxLDY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDUkMzMiB0YWJsZSBmaWxsIGZ1bmN0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgUm9iIFN1bGxpdmFuIDxjb2dpdG8uZXJnby5jb2dpdG9AZ21haWwuY29tPgorICogKEkgY2FuJ3QgcmVhbGx5IGNsYWltIG11Y2ggY3JlZGl0IGhvd2V2ZXIsIGFzIHRoZSBhbGdvcml0aG0gaXMKKyAqIHZlcnkgd2VsbC1rbm93bikKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGNyZWF0ZXMgYSBDUkMzMiB0YWJsZSBkZXBlbmRpbmcgb24gd2hldGhlcgorICogYSBiaWctZW5kaWFuICgweDA0YzExZGI3KSBvciBsaXR0bGUtZW5kaWFuICgweGVkYjg4MzIwKSBDUkMzMiBpcworICogcmVxdWlyZWQuIEFkbWl0dGVkbHksIHRoZXJlIGFyZSBvdGhlciBDUkMzMiBwb2x5bm9taWFscyBmbG9hdGluZworICogYXJvdW5kLCBidXQgQnVzeWJveCBkb2Vzbid0IHVzZSB0aGVtLgorICoKKyAqIGVuZGlhbiA9IDE6IGJpZy1lbmRpYW4KKyAqIGVuZGlhbiA9IDA6IGxpdHRsZS1lbmRpYW4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCit1aW50MzJfdCAqZ2xvYmFsX2NyYzMyX3RhYmxlOworCit1aW50MzJfdCogRkFTVF9GVU5DIGNyYzMyX2ZpbGx0YWJsZSh1aW50MzJfdCAqY3JjX3RhYmxlLCBpbnQgZW5kaWFuKQoreworCXVpbnQzMl90IHBvbHlub21pYWwgPSBlbmRpYW4gPyAweDA0YzExZGI3IDogMHhlZGI4ODMyMDsKKwl1aW50MzJfdCBjOworCWludCBpLCBqOworCisJaWYgKCFjcmNfdGFibGUpCisJCWNyY190YWJsZSA9IHhtYWxsb2MoMjU2ICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJYyA9IGVuZGlhbiA/IChpIDw8IDI0KSA6IGk7CisJCWZvciAoaiA9IDg7IGo7IGotLSkgeworCQkJaWYgKGVuZGlhbikKKwkJCQljID0gKGMmMHg4MDAwMDAwMCkgPyAoKGMgPDwgMSkgXiBwb2x5bm9taWFsKSA6IChjIDw8IDEpOworCQkJZWxzZQorCQkJCWMgPSAoYyYxKSA/ICgoYyA+PiAxKSBeIHBvbHlub21pYWwpIDogKGMgPj4gMSk7CisJCX0KKwkJKmNyY190YWJsZSsrID0gYzsKKwl9CisKKwlyZXR1cm4gY3JjX3RhYmxlIC0gMjU2OworfQorCit1aW50MzJfdCBGQVNUX0ZVTkMgY3JjMzJfYmxvY2tfZW5kaWFuMSh1aW50MzJfdCB2YWwsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuLCB1aW50MzJfdCAqY3JjX3RhYmxlKQoreworCWNvbnN0IHZvaWQgKmVuZCA9ICh1aW50OF90KilidWYgKyBsZW47CisKKwl3aGlsZSAoYnVmICE9IGVuZCkgeworCQl2YWwgPSAodmFsIDw8IDgpIF4gY3JjX3RhYmxlWyh2YWwgPj4gMjQpIF4gKih1aW50OF90KilidWZdOworCQlidWYgPSAodWludDhfdCopYnVmICsgMTsKKwl9CisJcmV0dXJuIHZhbDsKK30KKwordWludDMyX3QgRkFTVF9GVU5DIGNyYzMyX2Jsb2NrX2VuZGlhbjAodWludDMyX3QgdmFsLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwgdWludDMyX3QgKmNyY190YWJsZSkKK3sKKwljb25zdCB2b2lkICplbmQgPSAodWludDhfdCopYnVmICsgbGVuOworCisJd2hpbGUgKGJ1ZiAhPSBlbmQpIHsKKwkJdmFsID0gY3JjX3RhYmxlWyh1aW50OF90KXZhbCBeICoodWludDhfdCopYnVmXSBeICh2YWwgPj4gOCk7CisJCWJ1ZiA9ICh1aW50OF90KilidWYgKyAxOworCX0KKwlyZXR1cm4gdmFsOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvY3JlYXRlX2ljbXA2X3NvY2tldC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY3JlYXRlX2ljbXA2X3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OGM2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9jcmVhdGVfaWNtcDZfc29ja2V0LmMKQEAgLTAsMCArMSwzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBjcmVhdGUgcmF3IHNvY2tldCBmb3IgaWNtcCAoSVB2NiB2ZXJzaW9uKSBwcm90b2NvbAorICogYW5kIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGlmIHJ1bm5pbmcgc2V0dWlkCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK2ludCBGQVNUX0ZVTkMgY3JlYXRlX2ljbXA2X3NvY2tldCh2b2lkKQoreworCWludCBzb2NrOworI2lmIDAKKwlzdHJ1Y3QgcHJvdG9lbnQgKnByb3RvOworCXByb3RvID0gZ2V0cHJvdG9ieW5hbWUoImlwdjYtaWNtcCIpOworCS8qIGlmIGdldHByb3RvYnluYW1lIGZhaWxlZCwganVzdCBzaWxlbnRseSBmb3JjZQorCSAqIHByb3RvLT5wX3Byb3RvIHRvIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yICJpcHY2LWljbXAiICovCisJc29jayA9IHNvY2tldChBRl9JTkVUNiwgU09DS19SQVcsCisJCQkocHJvdG8gPyBwcm90by0+cF9wcm90byA6IElQUFJPVE9fSUNNUFY2KSk7CisjZWxzZQorCXNvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVBWNik7CisjZW5kaWYKKwlpZiAoc29jayA8IDApIHsKKwkJaWYgKGVycm5vID09IEVQRVJNKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfY2FuX25vdF9jcmVhdGVfcmF3X3NvY2tldCk7CisJfQorCisJLyogZHJvcCByb290IHByaXZzIGlmIHJ1bm5pbmcgc2V0dWlkICovCisJeHNldHVpZChnZXR1aWQoKSk7CisKKwlyZXR1cm4gc29jazsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvY3JlYXRlX2ljbXBfc29ja2V0LmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9jcmVhdGVfaWNtcF9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU2MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvY3JlYXRlX2ljbXBfc29ja2V0LmMKQEAgLTAsMCArMSwzNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBjcmVhdGUgcmF3IHNvY2tldCBmb3IgaWNtcCBwcm90b2NvbAorICogYW5kIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGlmIHJ1bm5pbmcgc2V0dWlkCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IEZBU1RfRlVOQyBjcmVhdGVfaWNtcF9zb2NrZXQodm9pZCkKK3sKKwlpbnQgc29jazsKKyNpZiAwCisJc3RydWN0IHByb3RvZW50ICpwcm90bzsKKwlwcm90byA9IGdldHByb3RvYnluYW1lKCJpY21wIik7CisJLyogaWYgZ2V0cHJvdG9ieW5hbWUgZmFpbGVkLCBqdXN0IHNpbGVudGx5IGZvcmNlCisJICogcHJvdG8tPnBfcHJvdG8gdG8gaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgImljbXAiICovCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywKKwkJCShwcm90byA/IHByb3RvLT5wX3Byb3RvIDogMSkpOyAvKiAxID09IElDTVAgKi8KKyNlbHNlCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgMSk7IC8qIDEgPT0gSUNNUCAqLworI2VuZGlmCisJaWYgKHNvY2sgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFUEVSTSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2Nhbl9ub3RfY3JlYXRlX3Jhd19zb2NrZXQpOworCX0KKworCS8qIGRyb3Agcm9vdCBwcml2cyBpZiBydW5uaW5nIHNldHVpZCAqLworCXhzZXR1aWQoZ2V0dWlkKCkpOworCisJcmV0dXJuIHNvY2s7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9kZWZhdWx0X2Vycm9yX3JldHZhbC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZGVmYXVsdF9lcnJvcl9yZXR2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjYzOTVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZGVmYXVsdF9lcnJvcl9yZXR2YWwuYwpAQCAtMCwwICsxLDE4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFNlZW1zIHNpbGx5IHRvIGNvcHlyaWdodCBhIGdsb2JhbCB2YXJpYWJsZS4gIDstKSAgT2ggd2VsbC4KKyAqCisgKiBBdCBsZWFzdCBvbmUgYXBwbGV0IChjbXApIHJldHVybnMgYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSB0aGUgdHlwaWNhbAorICogRVhJVF9GQUlMVVJFIHZhbHVlcyAoMSkgd2hlbiBhbiBlcnJvciBvY2N1cnMuICBTbywgbWFrZSBpdCBjb25maWd1cmFibGUKKyAqIGJ5IHRoZSBhcHBsZXQuICBJIHN1cHBvc2Ugd2UgY291bGQgdXNlIGEgd3JhcHBlciBmdW5jdGlvbiB0byBzZXQgaXQsIGJ1dAorICogdGhhdCB0b28gc2VlbXMgc2lsbHkuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3VpbnQ4X3QgeGZ1bmNfZXJyb3JfcmV0dmFsID0gRVhJVF9GQUlMVVJFOwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZGV2aWNlX29wZW4uYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2RldmljZV9vcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmZTJmYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2RldmljZV9vcGVuLmMKQEAgLTAsMCArMSwzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogdHJ5IHRvIG9wZW4gdXAgdGhlIHNwZWNpZmllZCBkZXZpY2UgKi8KK2ludCBGQVNUX0ZVTkMgZGV2aWNlX29wZW4oY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgbW9kZSkKK3sKKwlpbnQgbSwgZiwgZmQ7CisKKwltID0gbW9kZSB8IE9fTk9OQkxPQ0s7CisKKwkvKiBSZXRyeSB1cCB0byA1IHRpbWVzICovCisJLyogVE9ETzogZXhwbGFpbiB3aHkgaXQgY2FuJ3QgYmUgY29uc2lkZXJlZCBpbnNhbmUgKi8KKwlmb3IgKGYgPSAwOyBmIDwgNTsgZisrKSB7CisJCWZkID0gb3BlbihkZXZpY2UsIG0sIDA2MDApOworCQlpZiAoZmQgPj0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisJLyogUmVzZXQgb3JpZ2luYWwgZmxhZ3MuICovCisJaWYgKG0gIT0gbW9kZSkKKwkJZmNudGwoZmQsIEZfU0VURkwsIG1vZGUpOworCXJldHVybiBmZDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2RpZV9pZl9iYWRfdXNlcm5hbWUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2RpZV9pZl9iYWRfdXNlcm5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjEyOTdiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZGllX2lmX2JhZF91c2VybmFtZS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENoZWNrIHVzZXIgYW5kIGdyb3VwIG5hbWVzIGZvciBpbGxlZ2FsIGNoYXJhY3RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRvIGF2b2lkIHByb2JsZW1zLCB0aGUgdXNlcm5hbWUgc2hvdWxkIGNvbnNpc3Qgb25seSBvZgorICogbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgcGVyaW9kcywgYXQgc2lnbnMgYW5kIGRhc2hlcywKKyAqIGFuZCBub3Qgc3RhcnQgd2l0aCBhIGRhc2ggKGFzIGRlZmluZWQgYnkgSUVFRSBTdGQgMTAwMy4xLTIwMDEpLgorICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTYW1iYSBtYWNoaW5lIGFjY291bnRzICQgaXMgYWxzbyBzdXBwb3J0ZWQKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIHVzZXJuYW1lLgorICovCisKK3ZvaWQgRkFTVF9GVU5DIGRpZV9pZl9iYWRfdXNlcm5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBjaGFyICpzdGFydCA9IG5hbWU7CisKKwkvKiAxc3QgY2hhciBiZWluZyBkYXNoIG9yIGRvdCBpc24ndCB2YWxpZDoKKwkgKiBmb3IgZXhhbXBsZSwgbmFtZSBsaWtlICIuLiIgY2FuIG1ha2UgYWRkdXNlcgorCSAqIGNob3duICIvaG9tZS8uLiIgcmVjdXJzaXZlbHkgLSBOT1QgR09PRC4KKwkgKiBOYW1lIG9mIGp1c3QgYSBzaW5nbGUgIiQiIGlzIGFsc28gcmVqZWN0ZWQuCisJICovCisJZ290byBza2lwOworCisJZG8geworCQl1bnNpZ25lZCBjaGFyIGNoOworCisJCS8qIFRoZXNlIGNoYXJzIGFyZSB2YWxpZCB1bmxlc3MgdGhleSBhcmUgYXQgdGhlIDFzdCBwb3M6ICovCisJCWlmICgqbmFtZSA9PSAnLScKKwkJIHx8ICpuYW1lID09ICcuJworCQkvKiAkIGlzIGFsbG93ZWQgaWYgaXQncyB0aGUgbGFzdCBjaGFyOiAqLworCQkgfHwgKCpuYW1lID09ICckJyAmJiAhbmFtZVsxXSkKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorIHNraXA6CisJCWNoID0gKm5hbWU7CisJCWlmIChjaCA9PSAnXycKKwkJLyogfHwgY2ggPT0gJ0AnIC0tIHdlIGRpc2FsbG93IHRoaXMgdG9vLiBUaGluayBhYm91dCAidXNlckBob3N0IiAqLworCQkvKiBvcGVuLWNvZGVkIGlzYWxudW06ICovCisJCSB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwkJIHx8ICgoY2h8MHgyMCkgPj0gJ2EnICYmIChjaHwweDIwKSA8PSAneicpCisJCSkgeworCQkJY29udGludWU7CisJCX0KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlsbGVnYWwgY2hhcmFjdGVyIHdpdGggY29kZSAldSBhdCBwb3NpdGlvbiAldSIsCisJCQkJKHVuc2lnbmVkKWNoLCAodW5zaWduZWQpKG5hbWUgLSBzdGFydCkpOworCX0gd2hpbGUgKCorK25hbWUpOworCisJLyogVGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbG9naW4gbmFtZSBpcyBvbmUgY2hhciBvciB0d28gaWYKKwkgKiBsYXN0IGNoYXIgaXMgdGhlICckJy4gVmlvbGF0aW9ucyBvZiB0aGlzIGFyZSBjYXVnaHQgYWJvdmUuCisJICogVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbG9naW4gbmFtZSBpcyBMT0dJTl9OQU1FX01BWAorCSAqIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlLgorCSAqLworCWlmIChuYW1lIC0gc3RhcnQgPj0gTE9HSU5fTkFNRV9NQVgpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuYW1lIGlzIHRvbyBsb25nIik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9kdW1wLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5ZmUxMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2R1bXAuYwpAQCAtMCwwICsxLDgzNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3VwcG9ydCBjb2RlIGZvciB0aGUgaGV4ZHVtcCBhbmQgb2QgYXBwbGV0cywKKyAqIGJhc2VkIG9uIGNvZGUgZnJvbSB1dGlsLWxpbnV4IHYgMi4xMWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJkdW1wLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGluZGV4X3N0cltdIEFMSUdOMSA9ICIuIy0rIDAxMjM0NTY3ODkiOworCitzdGF0aWMgY29uc3QgY2hhciBzaXplX2NvbnZfc3RyW10gQUxJR04xID0KKyJceDFceDRceDRceDRceDRceDRceDRceDhceDhceDhceDhcMDEwY2Rpb3V4WGVFZmdHIjsKKworc3RhdGljIGNvbnN0IGNoYXIgbGNjW10gQUxJR04xID0gImRpb3V4WCI7CisKKwordHlwZWRlZiBzdHJ1Y3QgcHJpdl9kdW1wZXJfdCB7CisJZHVtcGVyX3QgcHViOworCisJY2hhciAqKmFyZ3Y7CisJRlUgKmVuZGZ1OworCW9mZl90IHNhdmFkZHJlc3M7ICAgICAgICAvKiBzYXZlZCBhZGRyZXNzL29mZnNldCBpbiBzdHJlYW0gKi8KKwlvZmZfdCBlYWRkcmVzczsgICAgICAgICAgLyogZW5kIGFkZHJlc3MgKi8KKwlvZmZfdCBhZGRyZXNzOyAgICAgICAgICAgLyogYWRkcmVzcy9vZmZzZXQgaW4gc3RyZWFtICovCisJaW50IGJsb2Nrc2l6ZTsKKwlzbWFsbGludCBleGl0dmFsOyAgICAgICAgLyogZmluYWwgZXhpdCB2YWx1ZSAqLworCisJLyogZm9ybWVyIHN0YXRpY3MgKi8KKwlzbWFsbGludCBuZXh0X19kb25lOworCXNtYWxsaW50IGdldF9fYXRlb2Y7IC8vID0gMTsKKwl1bnNpZ25lZCBjaGFyICpnZXRfX2N1cnA7CisJdW5zaWduZWQgY2hhciAqZ2V0X19zYXZwOworfSBwcml2X2R1bXBlcl90OworCitkdW1wZXJfdCogRkFTVF9GVU5DIGFsbG9jX2R1bXBlcih2b2lkKQoreworCXByaXZfZHVtcGVyX3QgKmR1bXBlciA9IHh6YWxsb2Moc2l6ZW9mKCpkdW1wZXIpKTsKKwlkdW1wZXItPnB1Yi5kdW1wX2xlbmd0aCA9IC0xOworCWR1bXBlci0+cHViLmR1bXBfdmZsYWcgPSBGSVJTVDsKKwlkdW1wZXItPmdldF9fYXRlb2YgPSAxOworCXJldHVybiAmZHVtcGVyLT5wdWI7Cit9CisKKworc3RhdGljIE5PSU5MSU5FIGludCBiYl9kdW1wX3NpemUoRlMgKmZzKQoreworCUZVICpmdTsKKwlpbnQgYmNudCwgY3VyX3NpemU7CisJY2hhciAqZm10OworCWNvbnN0IGNoYXIgKnA7CisJaW50IHByZWM7CisKKwkvKiBmaWd1cmUgb3V0IHRoZSBkYXRhIGJsb2NrIGJiX2R1bXBfc2l6ZSBuZWVkZWQgZm9yIGVhY2ggZm9ybWF0IHVuaXQgKi8KKwlmb3IgKGN1cl9zaXplID0gMCwgZnUgPSBmcy0+bmV4dGZ1OyBmdTsgZnUgPSBmdS0+bmV4dGZ1KSB7CisJCWlmIChmdS0+YmNudCkgeworCQkJY3VyX3NpemUgKz0gZnUtPmJjbnQgKiBmdS0+cmVwczsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAoYmNudCA9IHByZWMgPSAwLCBmbXQgPSBmdS0+Zm10OyAqZm10OyArK2ZtdCkgeworCQkJaWYgKCpmbXQgIT0gJyUnKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIHNraXAgYW55IHNwZWNpYWwgY2hhcnMgLS0gc2F2ZSBwcmVjaXNpb24gaW4KKwkJCSAqIGNhc2UgaXQncyBhICVzIGZvcm1hdC4KKwkJCSAqLworCQkJd2hpbGUgKHN0cmNocihpbmRleF9zdHIgKyAxLCAqKytmbXQpKTsKKwkJCWlmICgqZm10ID09ICcuJyAmJiBpc2RpZ2l0KCorK2ZtdCkpIHsKKwkJCQlwcmVjID0gYXRvaShmbXQpOworCQkJCXdoaWxlIChpc2RpZ2l0KCorK2ZtdCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcCA9IHN0cmNocihzaXplX2NvbnZfc3RyICsgMTIsICpmbXQpOworCQkJaWYgKCFwKSB7CisJCQkJaWYgKCpmbXQgPT0gJ3MnKSB7CisJCQkJCWJjbnQgKz0gcHJlYzsKKwkJCQl9IGVsc2UgaWYgKCpmbXQgPT0gJ18nKSB7CisJCQkJCSsrZm10OworCQkJCQlpZiAoKCpmbXQgPT0gJ2MnKSB8fCAoKmZtdCA9PSAncCcpIHx8ICgqZm10ID09ICd1JykpIHsKKwkJCQkJCWJjbnQgKz0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYmNudCArPSBzaXplX2NvbnZfc3RyW3AgLSAoc2l6ZV9jb252X3N0ciArIDEyKV07CisJCQl9CisJCX0KKwkJY3VyX3NpemUgKz0gYmNudCAqIGZ1LT5yZXBzOworCX0KKwlyZXR1cm4gY3VyX3NpemU7Cit9CisKK3N0YXRpYyBOT0lOTElORSB2b2lkIHJld3JpdGUocHJpdl9kdW1wZXJfdCAqZHVtcGVyLCBGUyAqZnMpCit7CisJZW51bSB7IE5PVE9LQVksIFVTRUJDTlQsIFVTRVBSRUMgfSBzb2theTsKKwlQUiAqcHI7CisJRlUgKmZ1OworCWNoYXIgKnAxLCAqcDIsICpwMzsKKwljaGFyIHNhdmVjaCwgKmZtdHA7CisJY29uc3QgY2hhciAqYnl0ZV9jb3VudF9zdHI7CisJaW50IG5jb252LCBwcmVjID0gMDsKKworCWZvciAoZnUgPSBmcy0+bmV4dGZ1OyBmdTsgZnUgPSBmdS0+bmV4dGZ1KSB7CisJCS8qCisJCSAqIGJyZWFrIGVhY2ggZm9ybWF0IHVuaXQgaW50byBwcmludCB1bml0czsgZWFjaAorCQkgKiBjb252ZXJzaW9uIGNoYXJhY3RlciBnZXRzIGl0cyBvd24uCisJCSAqLworCQlmb3IgKG5jb252ID0gMCwgZm10cCA9IGZ1LT5mbXQ7ICpmbXRwOyApIHsKKwkJCS8qIE5PU1RSSUNUICovCisJCQkvKiBEQlU6W2R2YWVAY3JheS5jb21dIHphbGxvYyBzbyB0aGF0IGZvcndhcmQgcHRycyBzdGFydCBvdXQgTlVMTCovCisJCQlwciA9IHh6YWxsb2Moc2l6ZW9mKFBSKSk7CisJCQlpZiAoIWZ1LT5uZXh0cHIpCisJCQkJZnUtPm5leHRwciA9IHByOworCisJCQkvKiBza2lwIHByZWNlZGluZyB0ZXh0IGFuZCB1cCB0byB0aGUgbmV4dCAlIHNpZ24gKi8KKwkJCWZvciAocDEgPSBmbXRwOyAqcDEgJiYgKnAxICE9ICclJzsgKytwMSkKKwkJCQljb250aW51ZTsKKworCQkJLyogb25seSB0ZXh0IGluIHRoZSBzdHJpbmcgKi8KKwkJCWlmICghKnAxKSB7CisJCQkJcHItPmZtdCA9IGZtdHA7CisJCQkJcHItPmZsYWdzID0gRl9URVhUOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogZ2V0IHByZWNpc2lvbiBmb3IgJXMgLS0gaWYgaGF2ZSBhIGJ5dGUgY291bnQsIGRvbid0CisJCQkgKiBuZWVkIGl0LgorCQkJICovCisJCQlpZiAoZnUtPmJjbnQpIHsKKwkJCQlzb2theSA9IFVTRUJDTlQ7CisJCQkJLyogc2tpcCB0byBjb252ZXJzaW9uIGNoYXJhY3RlciAqLworCQkJCWZvciAoKytwMTsgc3RyY2hyKGluZGV4X3N0ciwgKnAxKTsgKytwMSkKKwkJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCS8qIHNraXAgYW55IHNwZWNpYWwgY2hhcnMsIGZpZWxkIHdpZHRoICovCisJCQkJd2hpbGUgKHN0cmNocihpbmRleF9zdHIgKyAxLCAqKytwMSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgqcDEgPT0gJy4nICYmIGlzZGlnaXQoKisrcDEpKSB7CisJCQkJCXNva2F5ID0gVVNFUFJFQzsKKwkJCQkJcHJlYyA9IGF0b2kocDEpOworCQkJCQl3aGlsZSAoaXNkaWdpdCgqKytwMSkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UKKwkJCQkJc29rYXkgPSBOT1RPS0FZOworCQkJfQorCisJCQlwMiA9IHAxICsgMTsgLyogc2V0IGVuZCBwb2ludGVyICovCisKKwkJCS8qCisJCQkgKiBmaWd1cmUgb3V0IHRoZSBieXRlIGNvdW50IGZvciBlYWNoIGNvbnZlcnNpb247CisJCQkgKiByZXdyaXRlIHRoZSBmb3JtYXQgYXMgbmVjZXNzYXJ5LCBzZXQgdXAgYmxhbmstCisJCQkgKiBwYmJfZHVtcF9hZGRpbmcgZm9yIGVuZCBvZiBkYXRhLgorCQkJICovCisJCQlpZiAoKnAxID09ICdjJykgeworCQkJCXByLT5mbGFncyA9IEZfQ0hBUjsKKyBET19CWVRFX0NPVU5UXzE6CisJCQkJYnl0ZV9jb3VudF9zdHIgPSAiXDAwMSI7CisgRE9fQllURV9DT1VOVDoKKwkJCQlpZiAoZnUtPmJjbnQpIHsKKwkJCQkJZG8geworCQkJCQkJaWYgKGZ1LT5iY250ID09ICpieXRlX2NvdW50X3N0cikgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9IHdoaWxlICgqKytieXRlX2NvdW50X3N0cik7CisJCQkJfQorCQkJCS8qIFVubGlrZSB0aGUgb3JpZ2luYWwsIG91dHB1dCB0aGUgcmVtYWluZGVyIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAqLworCQkJCWlmICghKmJ5dGVfY291bnRfc3RyKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgYnl0ZSBjb3VudCBmb3IgY29udmVyc2lvbiBjaGFyYWN0ZXIgJXMiLCBwMSk7CisJCQkJfQorCQkJCXByLT5iY250ID0gKmJ5dGVfY291bnRfc3RyOworCQkJfSBlbHNlIGlmICgqcDEgPT0gJ2wnKSB7CisJCQkJKytwMjsKKwkJCQkrK3AxOworIERPX0lOVF9DT05WOgorCQkJCXsKKwkJCQkJY29uc3QgY2hhciAqZTsKKwkJCQkJZSA9IHN0cmNocihsY2MsICpwMSk7CisJCQkJCWlmICghZSkgeworCQkJCQkJZ290byBET19CQURfQ09OVl9DSEFSOworCQkJCQl9CisJCQkJCXByLT5mbGFncyA9IEZfSU5UOworCQkJCQlpZiAoZSA+IGxjYyArIDEpIHsKKwkJCQkJCXByLT5mbGFncyA9IEZfVUlOVDsKKwkJCQkJfQorCQkJCQlieXRlX2NvdW50X3N0ciA9ICJcMDA0XDAwMlwwMDEiOworCQkJCQlnb3RvIERPX0JZVEVfQ09VTlQ7CisJCQkJfQorCQkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJCX0gZWxzZSBpZiAoc3RyY2hyKGxjYywgKnAxKSkgeworCQkJCWdvdG8gRE9fSU5UX0NPTlY7CisJCQl9IGVsc2UgaWYgKHN0cmNocigiZUVmZ0ciLCAqcDEpKSB7CisJCQkJcHItPmZsYWdzID0gRl9EQkw7CisJCQkJYnl0ZV9jb3VudF9zdHIgPSAiXDAxMFwwMDQiOworCQkJCWdvdG8gRE9fQllURV9DT1VOVDsKKwkJCX0gZWxzZSBpZiAoKnAxID09ICdzJykgeworCQkJCXByLT5mbGFncyA9IEZfU1RSOworCQkJCWlmIChzb2theSA9PSBVU0VCQ05UKSB7CisJCQkJCXByLT5iY250ID0gZnUtPmJjbnQ7CisJCQkJfSBlbHNlIGlmIChzb2theSA9PSBVU0VQUkVDKSB7CisJCQkJCXByLT5iY250ID0gcHJlYzsKKwkJCQl9IGVsc2UgeyAgIC8qIE5PVE9LQVkgKi8KKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiUlcyByZXF1aXJlcyBhIHByZWNpc2lvbiBvciBhIGJ5dGUgY291bnQiKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCpwMSA9PSAnXycpIHsKKwkJCQkrK3AyOworCQkJCXN3aXRjaCAocDFbMV0pIHsKKwkJCQljYXNlICdBJzoKKwkJCQkJZHVtcGVyLT5lbmRmdSA9IGZ1OworCQkJCQlmdS0+ZmxhZ3MgfD0gRl9JR05PUkU7CisJCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQkJY2FzZSAnYSc6CisJCQkJCXByLT5mbGFncyA9IEZfQUREUkVTUzsKKwkJCQkJKytwMjsKKwkJCQkJaWYgKChwMVsyXSAhPSAnZCcpICYmIChwMVsyXSAhPSAnbycpICYmIChwMVsyXSAhPSAneCcpKSB7CisJCQkJCQlnb3RvIERPX0JBRF9DT05WX0NIQVI7CisJCQkJCX0KKwkJCQkJKnAxID0gcDFbMl07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2MnOgorCQkJCQlwci0+ZmxhZ3MgPSBGX0M7CisJCQkJCS8qICpwMSA9ICdjJzsgICBzZXQgaW4gY29udl9jICovCisJCQkJCWdvdG8gRE9fQllURV9DT1VOVF8xOworCQkJCWNhc2UgJ3AnOgorCQkJCQlwci0+ZmxhZ3MgPSBGX1A7CisJCQkJCSpwMSA9ICdjJzsKKwkJCQkJZ290byBET19CWVRFX0NPVU5UXzE7CisJCQkJY2FzZSAndSc6CisJCQkJCXByLT5mbGFncyA9IEZfVTsKKwkJCQkJLyogKnAxID0gJ2MnOyAgIHNldCBpbiBjb252X3UgKi8KKwkJCQkJZ290byBET19CWVRFX0NPVU5UXzE7CisJCQkJZGVmYXVsdDoKKwkJCQkJZ290byBET19CQURfQ09OVl9DSEFSOworCQkJCX0KKwkJCX0gZWxzZSB7CisgRE9fQkFEX0NPTlZfQ0hBUjoKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGNvbnZlcnNpb24gY2hhcmFjdGVyICUlJXMiLCBwMSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBjb3B5IHRvIFBSIGZvcm1hdCBzdHJpbmcsIHNldCBjb252ZXJzaW9uIGNoYXJhY3RlcgorCQkJICogcG9pbnRlciwgdXBkYXRlIG9yaWdpbmFsLgorCQkJICovCisJCQlzYXZlY2ggPSAqcDI7CisJCQlwMVsxXSA9ICdcMCc7CisJCQlwci0+Zm10ID0geHN0cmR1cChmbXRwKTsKKwkJCSpwMiA9IHNhdmVjaDsKKwkJCS8vVG9vIGVhcmx5ISB4cmVhbGxvYyBjYW4gbW92ZSBwci0+Zm10IQorCQkJLy9wci0+Y2NoYXIgPSBwci0+Zm10ICsgKHAxIC0gZm10cCk7CisKKwkJCS8qIERCVTpbZGF2ZUBjcmF5LmNvbV0gdy9vIHRoaXMsIHRyYWlsaW5nIGZtdCB0ZXh0LCBzcGFjZSBpcyBsb3N0LgorCQkJICogU2tpcCBzdWJzZXF1ZW50IHRleHQgYW5kIHVwIHRvIHRoZSBuZXh0ICUgc2lnbiBhbmQgdGFjayB0aGUKKwkJCSAqIGFkZGl0aW9uYWwgdGV4dCBvbnRvIGZtdDogZWcuIGlmIGZtdCBpcyAiJXggaXMgYSBIRVggbnVtYmVyIiwKKwkJCSAqIHdlIGxvc2UgdGhlICIgaXMgYSBIRVggbnVtYmVyIiBwYXJ0IG9mIGZtdC4KKwkJCSAqLworCQkJZm9yIChwMyA9IHAyOyAqcDMgJiYgKnAzICE9ICclJzsgcDMrKykKKwkJCQljb250aW51ZTsKKwkJCWlmIChwMyA+IHAyKSB7CisJCQkJc2F2ZWNoID0gKnAzOworCQkJCSpwMyA9ICdcMCc7CisJCQkJcHItPmZtdCA9IHhyZWFsbG9jKHByLT5mbXQsIHN0cmxlbihwci0+Zm10KSArIChwMy1wMikgKyAxKTsKKwkJCQlzdHJjYXQocHItPmZtdCwgcDIpOworCQkJCSpwMyA9IHNhdmVjaDsKKwkJCQlwMiA9IHAzOworCQkJfQorCisJCQlwci0+Y2NoYXIgPSBwci0+Zm10ICsgKHAxIC0gZm10cCk7CisJCQlmbXRwID0gcDI7CisKKwkJCS8qIG9ubHkgb25lIGNvbnZlcnNpb24gY2hhcmFjdGVyIGlmIGJ5dGUgY291bnQgKi8KKwkJCWlmICghKHByLT5mbGFncyAmIEZfQUREUkVTUykgJiYgZnUtPmJjbnQgJiYgbmNvbnYrKykgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJieXRlIGNvdW50IHdpdGggbXVsdGlwbGUgY29udmVyc2lvbiBjaGFyYWN0ZXJzIik7CisJCQl9CisJCX0KKwkJLyoKKwkJICogaWYgZm9ybWF0IHVuaXQgYnl0ZSBjb3VudCBub3Qgc3BlY2lmaWVkLCBmaWd1cmUgaXQgb3V0CisJCSAqIHNvIGNhbiBhZGp1c3QgcmVwIGNvdW50IGxhdGVyLgorCQkgKi8KKwkJaWYgKCFmdS0+YmNudCkKKwkJCWZvciAocHIgPSBmdS0+bmV4dHByOyBwcjsgcHIgPSBwci0+bmV4dHByKQorCQkJCWZ1LT5iY250ICs9IHByLT5iY250OworCX0KKwkvKgorCSAqIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGludGVycHJldHMgYW55IGRhdGEgYXQgYWxsLCBhbmQgaXQncworCSAqIG5vdCB0aGUgc2FtZSBhcyB0aGUgYmxvY2tzaXplLCBhbmQgaXRzIGxhc3QgZm9ybWF0IHVuaXQKKwkgKiBpbnRlcnByZXRzIGFueSBkYXRhIGF0IGFsbCwgYW5kIGhhcyBubyBpdGVyYXRpb24gY291bnQsCisJICogcmVwZWF0IGl0IGFzIG5lY2Vzc2FyeS4KKwkgKgorCSAqIGlmLCByZXAgY291bnQgaXMgZ3JlYXRlciB0aGFuIDEsIG5vIHRyYWlsaW5nIHdoaXRlc3BhY2UKKwkgKiBnZXRzIG91dHB1dCBmcm9tIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgZm9ybWF0IHVuaXQuCisJICovCisJZm9yIChmdSA9IGZzLT5uZXh0ZnU7IGZ1OyBmdSA9IGZ1LT5uZXh0ZnUpIHsKKwkJaWYgKCFmdS0+bmV4dGZ1ICYmIGZzLT5iY250IDwgZHVtcGVyLT5ibG9ja3NpemUKKwkJICYmICEoZnUtPmZsYWdzICYgRl9TRVRSRVApICYmIGZ1LT5iY250CisJCSkgeworCQkJZnUtPnJlcHMgKz0gKGR1bXBlci0+YmxvY2tzaXplIC0gZnMtPmJjbnQpIC8gZnUtPmJjbnQ7CisJCX0KKwkJaWYgKGZ1LT5yZXBzID4gMSkgeworCQkJZm9yIChwciA9IGZ1LT5uZXh0cHI7OyBwciA9IHByLT5uZXh0cHIpCisJCQkJaWYgKCFwci0+bmV4dHByKQorCQkJCQlicmVhazsKKwkJCWZvciAocDEgPSBwci0+Zm10LCBwMiA9IE5VTEw7ICpwMTsgKytwMSkKKwkJCQlwMiA9IGlzc3BhY2UoKnAxKSA/IHAxIDogTlVMTDsKKwkJCWlmIChwMikKKwkJCQlwci0+bm9zcGFjZSA9IHAyOworCQl9CisJCWlmICghZnUtPm5leHRmdSkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZG9fc2tpcChwcml2X2R1bXBlcl90ICpkdW1wZXIsIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgc3RhdG9rKQoreworCXN0cnVjdCBzdGF0IHNidWY7CisKKwlpZiAoc3RhdG9rKSB7CisJCXhmc3RhdChTVERJTl9GSUxFTk8sICZzYnVmLCBmbmFtZSk7CisJCWlmICghKFNfSVNDSFIoc2J1Zi5zdF9tb2RlKSB8fCBTX0lTQkxLKHNidWYuc3RfbW9kZSkgfHwgU19JU0ZJRk8oc2J1Zi5zdF9tb2RlKSkKKwkJICYmIGR1bXBlci0+cHViLmR1bXBfc2tpcCA+PSBzYnVmLnN0X3NpemUKKwkJKSB7CisJCQkvKiBJZiBiYl9kdW1wX3NpemUgdmFsaWQgYW5kIHB1Yi5kdW1wX3NraXAgPj0gc2l6ZSAqLworCQkJZHVtcGVyLT5wdWIuZHVtcF9za2lwIC09IHNidWYuc3Rfc2l6ZTsKKwkJCWR1bXBlci0+YWRkcmVzcyArPSBzYnVmLnN0X3NpemU7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKGZzZWVrKHN0ZGluLCBkdW1wZXItPnB1Yi5kdW1wX3NraXAsIFNFRUtfU0VUKSkgeworCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGZuYW1lKTsKKwl9CisJZHVtcGVyLT5hZGRyZXNzICs9IGR1bXBlci0+cHViLmR1bXBfc2tpcDsKKwlkdW1wZXItPnNhdmFkZHJlc3MgPSBkdW1wZXItPmFkZHJlc3M7CisJZHVtcGVyLT5wdWIuZHVtcF9za2lwID0gMDsKK30KKworc3RhdGljIE5PSU5MSU5FIGludCBuZXh0KHByaXZfZHVtcGVyX3QgKmR1bXBlcikKK3sKKwlpbnQgc3RhdG9rOworCisJZm9yICg7OykgeworCQlpZiAoKmR1bXBlci0+YXJndikgeworCQkJZHVtcGVyLT5uZXh0X19kb25lID0gc3RhdG9rID0gMTsKKwkJCWlmICghKGZyZW9wZW4oKmR1bXBlci0+YXJndiwgInIiLCBzdGRpbikpKSB7CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmR1bXBlci0+YXJndik7CisJCQkJZHVtcGVyLT5leGl0dmFsID0gMTsKKwkJCQkrK2R1bXBlci0+YXJndjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChkdW1wZXItPm5leHRfX2RvbmUpCisJCQkJcmV0dXJuIDA7IC8qIG5vIG5leHQgZmlsZSAqLworCQkJZHVtcGVyLT5uZXh0X19kb25lID0gMTsKKwkJCXN0YXRvayA9IDA7CisJCX0KKwkJaWYgKGR1bXBlci0+cHViLmR1bXBfc2tpcCkKKwkJCWRvX3NraXAoZHVtcGVyLCBzdGF0b2sgPyAqZHVtcGVyLT5hcmd2IDogInN0ZGluIiwgc3RhdG9rKTsKKwkJaWYgKCpkdW1wZXItPmFyZ3YpCisJCQkrK2R1bXBlci0+YXJndjsKKwkJaWYgKCFkdW1wZXItPnB1Yi5kdW1wX3NraXApCisJCQlyZXR1cm4gMTsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZ2V0KHByaXZfZHVtcGVyX3QgKmR1bXBlcikKK3sKKwlpbnQgbjsKKwlpbnQgbmVlZCwgbnJlYWQ7CisJaW50IGJsb2Nrc2l6ZSA9IGR1bXBlci0+YmxvY2tzaXplOworCisJaWYgKCFkdW1wZXItPmdldF9fY3VycCkgeworCQlkdW1wZXItPmFkZHJlc3MgPSAob2ZmX3QpMDsgLypEQlU6W2RhdmVAY3JheS5jb21dIGluaXRpYWxpemUsaW5pdGlhbGl6ZS4uKi8KKwkJZHVtcGVyLT5nZXRfX2N1cnAgPSB4bWFsbG9jKGJsb2Nrc2l6ZSk7CisJCWR1bXBlci0+Z2V0X19zYXZwID0geHphbGxvYyhibG9ja3NpemUpOyAvKiBuZWVkIHRvIGJlIGluaXRpYWxpemVkICovCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgY2hhciAqdG1wID0gZHVtcGVyLT5nZXRfX2N1cnA7CisJCWR1bXBlci0+Z2V0X19jdXJwID0gZHVtcGVyLT5nZXRfX3NhdnA7CisJCWR1bXBlci0+Z2V0X19zYXZwID0gdG1wOworCQlkdW1wZXItPnNhdmFkZHJlc3MgKz0gYmxvY2tzaXplOworCQlkdW1wZXItPmFkZHJlc3MgPSBkdW1wZXItPnNhdmFkZHJlc3M7CisJfQorCW5lZWQgPSBibG9ja3NpemU7CisJbnJlYWQgPSAwOworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIGlmIHJlYWQgdGhlIHJpZ2h0IG51bWJlciBvZiBieXRlcywgb3IgYXQgRU9GIGZvciBvbmUgZmlsZSwKKwkJICogYW5kIG5vIG90aGVyIGZpbGVzIGFyZSBhdmFpbGFibGUsIHplcm8tcGFkIHRoZSByZXN0IG9mIHRoZQorCQkgKiBibG9jayBhbmQgc2V0IHRoZSBlbmQgZmxhZy4KKwkJICovCisJCWlmICghZHVtcGVyLT5wdWIuZHVtcF9sZW5ndGggfHwgKGR1bXBlci0+Z2V0X19hdGVvZiAmJiAhbmV4dChkdW1wZXIpKSkgeworCQkJaWYgKG5lZWQgPT0gYmxvY2tzaXplKSB7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAoZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyAhPSBBTEwgJiYgIW1lbWNtcChkdW1wZXItPmdldF9fY3VycCwgZHVtcGVyLT5nZXRfX3NhdnAsIG5yZWFkKSkgeworCQkJCWlmIChkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnICE9IERVUCkgeworCQkJCQlwdXRzKCIqIik7CisJCQkJfQorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJbWVtc2V0KGR1bXBlci0+Z2V0X19jdXJwICsgbnJlYWQsIDAsIG5lZWQpOworCQkJZHVtcGVyLT5lYWRkcmVzcyA9IGR1bXBlci0+YWRkcmVzcyArIG5yZWFkOworCQkJcmV0dXJuIGR1bXBlci0+Z2V0X19jdXJwOworCQl9CisJCW4gPSBmcmVhZChkdW1wZXItPmdldF9fY3VycCArIG5yZWFkLCBzaXplb2YodW5zaWduZWQgY2hhciksCisJCQkJZHVtcGVyLT5wdWIuZHVtcF9sZW5ndGggPT0gLTEgPyBuZWVkIDogTUlOKGR1bXBlci0+cHViLmR1bXBfbGVuZ3RoLCBuZWVkKSwgc3RkaW4pOworCQlpZiAoIW4pIHsKKwkJCWlmIChmZXJyb3Ioc3RkaW4pKSB7CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZHVtcGVyLT5hcmd2Wy0xXSk7CisJCQl9CisJCQlkdW1wZXItPmdldF9fYXRlb2YgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJZHVtcGVyLT5nZXRfX2F0ZW9mID0gMDsKKwkJaWYgKGR1bXBlci0+cHViLmR1bXBfbGVuZ3RoICE9IC0xKSB7CisJCQlkdW1wZXItPnB1Yi5kdW1wX2xlbmd0aCAtPSBuOworCQl9CisJCW5lZWQgLT0gbjsKKwkJaWYgKCFuZWVkKSB7CisJCQlpZiAoZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9PSBBTEwgfHwgZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9PSBGSVJTVAorCQkJIHx8IG1lbWNtcChkdW1wZXItPmdldF9fY3VycCwgZHVtcGVyLT5nZXRfX3NhdnAsIGJsb2Nrc2l6ZSkKKwkJCSkgeworCQkJCWlmIChkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnID09IERVUCB8fCBkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnID09IEZJUlNUKSB7CisJCQkJCWR1bXBlci0+cHViLmR1bXBfdmZsYWcgPSBXQUlUOworCQkJCX0KKwkJCQlyZXR1cm4gZHVtcGVyLT5nZXRfX2N1cnA7CisJCQl9CisJCQlpZiAoZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9PSBXQUlUKSB7CisJCQkJcHV0cygiKiIpOworCQkJfQorCQkJZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9IERVUDsKKwkJCWR1bXBlci0+c2F2YWRkcmVzcyArPSBibG9ja3NpemU7CisJCQlkdW1wZXItPmFkZHJlc3MgPSBkdW1wZXItPnNhdmFkZHJlc3M7CisJCQluZWVkID0gYmxvY2tzaXplOworCQkJbnJlYWQgPSAwOworCQl9IGVsc2UgeworCQkJbnJlYWQgKz0gbjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYnBhZChQUiAqcHIpCit7CisJY2hhciAqcDEsICpwMjsKKworCS8qCisJICogcmVtb3ZlIGFsbCBjb252ZXJzaW9uIGZsYWdzOyAnLScgaXMgdGhlIG9ubHkgb25lIHZhbGlkCisJICogd2l0aCAlcywgYW5kIGl0J3Mgbm90IHVzZWZ1bCBoZXJlLgorCSAqLworCXByLT5mbGFncyA9IEZfQlBBRDsKKwkqcHItPmNjaGFyID0gJ3MnOworCWZvciAocDEgPSBwci0+Zm10OyAqcDEgIT0gJyUnOyArK3AxKQorCQljb250aW51ZTsKKwlmb3IgKHAyID0gKytwMTsgKnAxICYmIHN0cmNocigiIC0wKyMiLCAqcDEpOyArK3AxKQorCQlpZiAocHItPm5vc3BhY2UpCisJCQlwci0+bm9zcGFjZS0tOworCXdoaWxlICgoKnAyKysgPSAqcDErKykgIT0gMCkKKwkJY29udGludWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNvbnZfc3RyW10gQUxJR04xID0KKwkiXDBcXDBcMCIKKwkiXDAwN1xcYVwwIiAgLyogXGEgKi8KKwkiXGJcXGJcMCIKKwkiXGZcXGJcMCIKKwkiXG5cXG5cMCIKKwkiXHJcXHJcMCIKKwkiXHRcXHRcMCIKKwkiXHZcXHZcMCIKKwk7CisKKworc3RhdGljIHZvaWQgY29udl9jKFBSICpwciwgdW5zaWduZWQgY2hhciAqcCkKK3sKKwljb25zdCBjaGFyICpzdHIgPSBjb252X3N0cjsKKwljaGFyIGJ1ZlsxMF07CisKKwlkbyB7CisJCWlmICgqcCA9PSAqc3RyKSB7CisJCQkrK3N0cjsKKwkJCWdvdG8gc3RycHI7CisJCX0KKwkJc3RyICs9IDQ7CisJfSB3aGlsZSAoKnN0cik7CisKKwlpZiAoaXNwcmludF9hc2NpaW9ubHkoKnApKSB7CisJCSpwci0+Y2NoYXIgPSAnYyc7CisJCXByaW50Zihwci0+Zm10LCAqcCk7CisJfSBlbHNlIHsKKwkJc3ByaW50ZihidWYsICIlMDNvIiwgKGludCkgKnApOworCQlzdHIgPSBidWY7Cisgc3RycHI6CisJCSpwci0+Y2NoYXIgPSAncyc7CisJCXByaW50Zihwci0+Zm10LCBzdHIpOworCX0KK30KKworc3RhdGljIHZvaWQgY29udl91KFBSICpwciwgdW5zaWduZWQgY2hhciAqcCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBsaXN0W10gQUxJR04xID0KKwkJIm51bFwwc29oXDBzdHhcMGV0eFwwZW90XDBlbnFcMGFja1wwYmVsXDAiCisJCSJic1wwX2h0XDBfbGZcMF92dFwwX2ZmXDBfY3JcMF9zb1wwX3NpXDBfIgorCQkiZGxlXDBkY2xcMGRjMlwwZGMzXDBkYzRcMG5ha1wwc3luXDBldGJcMCIKKwkJImNhblwwZW1cMF9zdWJcMGVzY1wwZnNcMF9nc1wwX3JzXDBfdXMiOworCisJLyogb2QgdXNlZCBubCwgbm90IGxmICovCisJaWYgKCpwIDw9IDB4MWYpIHsKKwkJKnByLT5jY2hhciA9ICdzJzsKKwkJcHJpbnRmKHByLT5mbXQsIGxpc3QgKyAoNCAqIChpbnQpKnApKTsKKwl9IGVsc2UgaWYgKCpwID09IDB4N2YpIHsKKwkJKnByLT5jY2hhciA9ICdzJzsKKwkJcHJpbnRmKHByLT5mbXQsICJkZWwiKTsKKwl9IGVsc2UgaWYgKCpwIDwgMHg3ZikgeyAvKiBpc3ByaW50KCkgKi8KKwkJKnByLT5jY2hhciA9ICdjJzsKKwkJcHJpbnRmKHByLT5mbXQsICpwKTsKKwl9IGVsc2UgeworCQkqcHItPmNjaGFyID0gJ3gnOworCQlwcmludGYocHItPmZtdCwgKGludCkgKnApOworCX0KK30KKworc3RhdGljIHZvaWQgZGlzcGxheShwcml2X2R1bXBlcl90KiBkdW1wZXIpCit7CisJRlMgKmZzOworCUZVICpmdTsKKwlQUiAqcHI7CisJaW50IGNudDsKKwl1bnNpZ25lZCBjaGFyICpicCwgKnNhdmVicDsKKwlvZmZfdCBzYXZlYWRkcmVzczsKKwl1bnNpZ25lZCBjaGFyIHNhdmVjaCA9ICdcMCc7CisKKwl3aGlsZSAoKGJwID0gZ2V0KGR1bXBlcikpICE9IE5VTEwpIHsKKwkJZnMgPSBkdW1wZXItPnB1Yi5mc2hlYWQ7CisJCXNhdmVicCA9IGJwOworCQlzYXZlYWRkcmVzcyA9IGR1bXBlci0+YWRkcmVzczsKKwkJZm9yICg7IGZzOyBmcyA9IGZzLT5uZXh0ZnMsIGJwID0gc2F2ZWJwLCBkdW1wZXItPmFkZHJlc3MgPSBzYXZlYWRkcmVzcykgeworCQkJZm9yIChmdSA9IGZzLT5uZXh0ZnU7IGZ1OyBmdSA9IGZ1LT5uZXh0ZnUpIHsKKwkJCQlpZiAoZnUtPmZsYWdzICYgRl9JR05PUkUpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWZvciAoY250ID0gZnUtPnJlcHM7IGNudDsgLS1jbnQpIHsKKwkJCQkJZm9yIChwciA9IGZ1LT5uZXh0cHI7IHByOyBkdW1wZXItPmFkZHJlc3MgKz0gcHItPmJjbnQsCisJCQkJCQkJCWJwICs9IHByLT5iY250LCBwciA9IHByLT5uZXh0cHIpIHsKKwkJCQkJCWlmIChkdW1wZXItPmVhZGRyZXNzICYmIGR1bXBlci0+YWRkcmVzcyA+PSBkdW1wZXItPmVhZGRyZXNzCisJCQkJCQkgJiYgIShwci0+ZmxhZ3MgJiAoRl9URVhUIHwgRl9CUEFEKSkKKwkJCQkJCSkgeworCQkJCQkJCWJwYWQocHIpOworCQkJCQkJfQorCQkJCQkJaWYgKGNudCA9PSAxICYmIHByLT5ub3NwYWNlKSB7CisJCQkJCQkJc2F2ZWNoID0gKnByLT5ub3NwYWNlOworCQkJCQkJCSpwci0+bm9zcGFjZSA9ICdcMCc7CisJCQkJCQl9CisvKiAgICAgICAgICAgICAgICAgICAgICBQUklOVDsgKi8KKwkJCQkJCXN3aXRjaCAocHItPmZsYWdzKSB7CisJCQkJCQljYXNlIEZfQUREUkVTUzoKKwkJCQkJCQlwcmludGYocHItPmZtdCwgKHVuc2lnbmVkKSBkdW1wZXItPmFkZHJlc3MpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX0JQQUQ6CisJCQkJCQkJcHJpbnRmKHByLT5mbXQsICIiKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgRl9DOgorCQkJCQkJCWNvbnZfYyhwciwgYnApOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX0NIQVI6CisJCQkJCQkJcHJpbnRmKHByLT5mbXQsICpicCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfREJMOiB7CisJCQkJCQkJZG91YmxlIGR2YWw7CisJCQkJCQkJZmxvYXQgZnZhbDsKKworCQkJCQkJCXN3aXRjaCAocHItPmJjbnQpIHsKKwkJCQkJCQljYXNlIDQ6CisJCQkJCQkJCW1lbWNweSgmZnZhbCwgYnAsIHNpemVvZihmdmFsKSk7CisJCQkJCQkJCXByaW50Zihwci0+Zm10LCBmdmFsKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA4OgorCQkJCQkJCQltZW1jcHkoJmR2YWwsIGJwLCBzaXplb2YoZHZhbCkpOworCQkJCQkJCQlwcmludGYocHItPmZtdCwgZHZhbCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWNhc2UgRl9JTlQ6IHsKKwkJCQkJCQlpbnQgaXZhbDsKKwkJCQkJCQlzaG9ydCBzdmFsOworCisJCQkJCQkJc3dpdGNoIChwci0+YmNudCkgeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsIChpbnQpICpicCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJbWVtY3B5KCZzdmFsLCBicCwgc2l6ZW9mKHN2YWwpKTsKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsIChpbnQpIHN2YWwpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDQ6CisJCQkJCQkJCW1lbWNweSgmaXZhbCwgYnAsIHNpemVvZihpdmFsKSk7CisJCQkJCQkJCXByaW50Zihwci0+Zm10LCBpdmFsKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJY2FzZSBGX1A6CisJCQkJCQkJcHJpbnRmKHByLT5mbXQsIGlzcHJpbnRfYXNjaWlvbmx5KCpicCkgPyAqYnAgOiAnLicpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX1NUUjoKKwkJCQkJCQlwcmludGYocHItPmZtdCwgKGNoYXIgKikgYnApOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX1RFWFQ6CisJCQkJCQkJcHJpbnRmKHByLT5mbXQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX1U6CisJCQkJCQkJY29udl91KHByLCBicCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfVUlOVDogeworCQkJCQkJCXVuc2lnbmVkIGl2YWw7CisJCQkJCQkJdW5zaWduZWQgc2hvcnQgc3ZhbDsKKworCQkJCQkJCXN3aXRjaCAocHItPmJjbnQpIHsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCXByaW50Zihwci0+Zm10LCAodW5zaWduZWQpICpicCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJbWVtY3B5KCZzdmFsLCBicCwgc2l6ZW9mKHN2YWwpKTsKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsICh1bnNpZ25lZCkgc3ZhbCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJbWVtY3B5KCZpdmFsLCBicCwgc2l6ZW9mKGl2YWwpKTsKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsIGl2YWwpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoY250ID09IDEgJiYgcHItPm5vc3BhY2UpIHsKKwkJCQkJCQkqcHItPm5vc3BhY2UgPSBzYXZlY2g7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGR1bXBlci0+ZW5kZnUpIHsKKwkJLyoKKwkJICogaWYgZWFkZHJlc3Mgbm90IHNldCwgZXJyb3Igb3IgZmlsZSBzaXplIHdhcyBtdWx0aXBsZQorCQkgKiBvZiBibG9ja3NpemUsIGFuZCBubyBwYXJ0aWFsIGJsb2NrIGV2ZXIgZm91bmQuCisJCSAqLworCQlpZiAoIWR1bXBlci0+ZWFkZHJlc3MpIHsKKwkJCWlmICghZHVtcGVyLT5hZGRyZXNzKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZHVtcGVyLT5lYWRkcmVzcyA9IGR1bXBlci0+YWRkcmVzczsKKwkJfQorCQlmb3IgKHByID0gZHVtcGVyLT5lbmRmdS0+bmV4dHByOyBwcjsgcHIgPSBwci0+bmV4dHByKSB7CisJCQlzd2l0Y2ggKHByLT5mbGFncykgeworCQkJY2FzZSBGX0FERFJFU1M6CisJCQkJcHJpbnRmKHByLT5mbXQsICh1bnNpZ25lZCkgZHVtcGVyLT5lYWRkcmVzcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZfVEVYVDoKKwkJCQlwcmludGYocHItPmZtdCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgZHVtcGVyICgocHJpdl9kdW1wZXJfdCopcHViX2R1bXBlcikKK2ludCBGQVNUX0ZVTkMgYmJfZHVtcF9kdW1wKGR1bXBlcl90ICpwdWJfZHVtcGVyLCBjaGFyICoqYXJndikKK3sKKwlGUyAqdGZzOworCWludCBibG9ja3NpemU7CisKKwkvKiBmaWd1cmUgb3V0IHRoZSBkYXRhIGJsb2NrIGJiX2R1bXBfc2l6ZSAqLworCWJsb2Nrc2l6ZSA9IDA7CisJdGZzID0gZHVtcGVyLT5wdWIuZnNoZWFkOworCXdoaWxlICh0ZnMpIHsKKwkJdGZzLT5iY250ID0gYmJfZHVtcF9zaXplKHRmcyk7CisJCWlmIChibG9ja3NpemUgPCB0ZnMtPmJjbnQpIHsKKwkJCWJsb2Nrc2l6ZSA9IHRmcy0+YmNudDsKKwkJfQorCQl0ZnMgPSB0ZnMtPm5leHRmczsKKwl9CisJZHVtcGVyLT5ibG9ja3NpemUgPSBibG9ja3NpemU7CisKKwkvKiByZXdyaXRlIHRoZSBydWxlcywgZG8gc3ludGF4IGNoZWNraW5nICovCisJZm9yICh0ZnMgPSBkdW1wZXItPnB1Yi5mc2hlYWQ7IHRmczsgdGZzID0gdGZzLT5uZXh0ZnMpIHsKKwkJcmV3cml0ZShkdW1wZXIsIHRmcyk7CisJfQorCisJZHVtcGVyLT5hcmd2ID0gYXJndjsKKwlkaXNwbGF5KGR1bXBlcik7CisKKwlyZXR1cm4gZHVtcGVyLT5leGl0dmFsOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9kdW1wX2FkZChkdW1wZXJfdCogcHViX2R1bXBlciwgY29uc3QgY2hhciAqZm10KQoreworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqcDE7CisJY2hhciAqcDI7CisJRlMgKnRmczsKKwlGVSAqdGZ1LCAqKm5leHRmdXBwOworCWNvbnN0IGNoYXIgKnNhdmVwOworCisJLyogc3RhcnQgbmV3IGxpbmtlZCBsaXN0IG9mIGZvcm1hdCB1bml0cyAqLworCXRmcyA9IHh6YWxsb2Moc2l6ZW9mKEZTKSk7IC8qREJVOltkYXZlQGNyYXkuY29tXSBzdGFydCBvdXQgTlVMTCAqLworCWlmICghZHVtcGVyLT5wdWIuZnNoZWFkKSB7CisJCWR1bXBlci0+cHViLmZzaGVhZCA9IHRmczsKKwl9IGVsc2UgeworCQlGUyAqZnNsYXN0ID0gZHVtcGVyLT5wdWIuZnNoZWFkOworCQl3aGlsZSAoZnNsYXN0LT5uZXh0ZnMpCisJCQlmc2xhc3QgPSBmc2xhc3QtPm5leHRmczsKKwkJZnNsYXN0LT5uZXh0ZnMgPSB0ZnM7CisJfQorCW5leHRmdXBwID0gJnRmcy0+bmV4dGZ1OworCisJLyogdGFrZSB0aGUgZm9ybWF0IHN0cmluZyBhbmQgYnJlYWsgaXQgdXAgaW50byBmb3JtYXQgdW5pdHMgKi8KKwlwID0gZm10OworCWZvciAoOzspIHsKKwkJcCA9IHNraXBfd2hpdGVzcGFjZShwKTsKKwkJaWYgKCEqcCkgeworCQkJYnJlYWs7CisJCX0KKworCQkvKiBhbGxvY2F0ZSBhIG5ldyBmb3JtYXQgdW5pdCBhbmQgbGluayBpdCBpbiAqLworCQkvKiBOT1NUUklDVCAqLworCQkvKiBEQlU6W2RhdmVAY3JheS5jb21dIHphbGxvYyBzbyB0aGF0IGZvcndhcmQgcG9pbnRlcnMgc3RhcnQgb3V0IE5VTEwgKi8KKwkJdGZ1ID0geHphbGxvYyhzaXplb2YoRlUpKTsKKwkJKm5leHRmdXBwID0gdGZ1OworCQluZXh0ZnVwcCA9ICZ0ZnUtPm5leHRmdTsKKwkJdGZ1LT5yZXBzID0gMTsKKworCQkvKiBpZiBsZWFkaW5nIGRpZ2l0LCByZXBldGl0aW9uIGNvdW50ICovCisJCWlmIChpc2RpZ2l0KCpwKSkgeworCQkJZm9yIChzYXZlcCA9IHA7IGlzZGlnaXQoKnApOyArK3ApCisJCQkJY29udGludWU7CisJCQlpZiAoIWlzc3BhY2UoKnApICYmICpwICE9ICcvJykgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IHslc30iLCBmbXQpOworCQkJfQorCQkJLyogbWF5IG92ZXJ3cml0ZSBlaXRoZXIgd2hpdGUgc3BhY2Ugb3Igc2xhc2ggKi8KKwkJCXRmdS0+cmVwcyA9IGF0b2koc2F2ZXApOworCQkJdGZ1LT5mbGFncyA9IEZfU0VUUkVQOworCQkJLyogc2tpcCB0cmFpbGluZyB3aGl0ZSBzcGFjZSAqLworCQkJcCA9IHNraXBfd2hpdGVzcGFjZSgrK3ApOworCQl9CisKKwkJLyogc2tpcCBzbGFzaCBhbmQgdHJhaWxpbmcgd2hpdGUgc3BhY2UgKi8KKwkJaWYgKCpwID09ICcvJykgeworCQkJcCA9IHNraXBfd2hpdGVzcGFjZSgrK3ApOworCQl9CisKKwkJLyogYnl0ZSBjb3VudCAqLworCQlpZiAoaXNkaWdpdCgqcCkpIHsKKy8vIFRPRE86IHVzZSBiYl9zdHJ0b3UKKwkJCXNhdmVwID0gcDsKKwkJCXdoaWxlIChpc2RpZ2l0KCorK3ApKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFpc3NwYWNlKCpwKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IHslc30iLCBmbXQpOworCQkJfQorCQkJdGZ1LT5iY250ID0gYXRvaShzYXZlcCk7CisJCQkvKiBza2lwIHRyYWlsaW5nIHdoaXRlIHNwYWNlICovCisJCQlwID0gc2tpcF93aGl0ZXNwYWNlKCsrcCk7CisJCX0KKworCQkvKiBmb3JtYXQgKi8KKwkJaWYgKCpwICE9ICciJykgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBmb3JtYXQgeyVzfSIsIGZtdCk7CisJCX0KKwkJZm9yIChzYXZlcCA9ICsrcDsgKnAgIT0gJyInOykgeworCQkJaWYgKCpwKysgPT0gMCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IHslc30iLCBmbXQpOworCQkJfQorCQl9CisJCXRmdS0+Zm10ID0geHN0cm5kdXAoc2F2ZXAsIHAgLSBzYXZlcCk7CisvKiAgICAgIGVzY2FwZSh0ZnUtPmZtdCk7ICovCisKKwkJcDEgPSB0ZnUtPmZtdDsKKworCQkvKiBhbHBoYWJldGljIGVzY2FwZSBzZXF1ZW5jZXMgaGF2ZSB0byBiZSBkb25lIGluIHBsYWNlICovCisJCWZvciAocDIgPSBwMTs7ICsrcDEsICsrcDIpIHsKKwkJCWlmICghKnAxKSB7CisJCQkJKnAyID0gKnAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCpwMSA9PSAnXFwnKSB7CisJCQkJY29uc3QgY2hhciAqY3MgPSBjb252X3N0ciArIDQ7CisJCQkJKytwMTsKKwkJCQkqcDIgPSAqcDE7CisJCQkJZG8geworCQkJCQlpZiAoKnAxID09IGNzWzJdKSB7CisJCQkJCQkqcDIgPSBjc1swXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNzICs9IDQ7CisJCQkJfSB3aGlsZSAoKmNzKTsKKwkJCX0KKwkJfQorCisJCXArKzsKKwl9Cit9CisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9leGVjYWJsZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZXhlY2FibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhhMDBhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZXhlY2FibGUuYwpAQCAtMCwwICsxLDg2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBHYWJyaWVsIFNvbWxvIDxzb21sbyBhdCBjbXUuZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIGNoZWNrIGlmIHBhdGggcG9pbnRzIHRvIGFuIGV4ZWN1dGFibGUgZmlsZTsKKyAqIHJldHVybiAxIGlmIGZvdW5kOworICogcmV0dXJuIDAgb3RoZXJ3aXNlOworICovCitpbnQgRkFTVF9GVU5DIGV4ZWNhYmxlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCXJldHVybiAoIWFjY2VzcyhuYW1lLCBYX09LKSAmJiAhc3RhdChuYW1lLCAmcykgJiYgU19JU1JFRyhzLnN0X21vZGUpKTsKK30KKworLyogc2VhcmNoICgqUEFUSHApIGZvciBhbiBleGVjdXRhYmxlIGZpbGU7CisgKiByZXR1cm4gYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIGZ1bGwgcGF0aCBpZiBmb3VuZDsKKyAqICBQQVRIcCBwb2ludHMgdG8gdGhlIGNvbXBvbmVudCBhZnRlciB0aGUgb25lIHdoZXJlIGl0IHdhcyBmb3VuZAorICogIChvciBOVUxMKSwKKyAqICB5b3UgbWF5IGNhbGwgZmluZF9leGVjYWJsZSBhZ2FpbiB3aXRoIHRoaXMgUEFUSHAgdG8gY29udGludWUKKyAqICAoaWYgaXQncyBub3QgTlVMTCkuCisgKiByZXR1cm4gTlVMTCBvdGhlcndpc2U7IChQQVRIcCBpcyB1bmRlZmluZWQpCisgKiBpbiBhbGwgY2FzZXMgKCpQQVRIcCkgY29udGVudHMgd2lsbCBiZSB0cmFzaGVkIChzLzovTlVMLykuCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBmaW5kX2V4ZWNhYmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqUEFUSHApCit7CisJY2hhciAqcCwgKm47CisKKwlwID0gKlBBVEhwOworCXdoaWxlIChwKSB7CisJCW4gPSBzdHJjaHIocCwgJzonKTsKKwkJaWYgKG4pCisJCQkqbisrID0gJ1wwJzsKKwkJaWYgKCpwICE9ICdcMCcpIHsgLyogaXQncyBub3QgYSBQQVRIPSJmb286OmJhciIgc2l0dWF0aW9uICovCisJCQlwID0gY29uY2F0X3BhdGhfZmlsZShwLCBmaWxlbmFtZSk7CisJCQlpZiAoZXhlY2FibGVfZmlsZShwKSkgeworCQkJCSpQQVRIcCA9IG47CisJCQkJcmV0dXJuIHA7CisJCQl9CisJCQlmcmVlKHApOworCQl9CisJCXAgPSBuOworCX0gLyogb24gbG9vcCBleGl0IHAgPT0gTlVMTCAqLworCXJldHVybiBwOworfQorCisvKiBzZWFyY2ggJFBBVEggZm9yIGFuIGV4ZWN1dGFibGUgZmlsZTsKKyAqIHJldHVybiAxIGlmIGZvdW5kOworICogcmV0dXJuIDAgb3RoZXJ3aXNlOworICovCitpbnQgRkFTVF9GVU5DIGV4aXN0c19leGVjYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICpwYXRoID0geHN0cmR1cChnZXRlbnYoIlBBVEgiKSk7CisJY2hhciAqdG1wID0gcGF0aDsKKwljaGFyICpyZXQgPSBmaW5kX2V4ZWNhYmxlKGZpbGVuYW1lLCAmdG1wKTsKKwlmcmVlKHBhdGgpOworCWlmIChyZXQpIHsKKwkJZnJlZShyZXQpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworLyoganVzdCBsaWtlIHRoZSByZWFsIGV4ZWN2cCwgYnV0IHRyeSB0byBsYXVuY2ggYW4gYXBwbGV0IG5hbWVkICdmaWxlJyBmaXJzdCAqLworaW50IEZBU1RfRlVOQyBCQl9FWEVDVlAoY29uc3QgY2hhciAqZmlsZSwgY2hhciAqY29uc3QgYXJndltdKQoreworCWlmIChmaW5kX2FwcGxldF9ieV9uYW1lKGZpbGUpID49IDApCisJCWV4ZWN2cChiYl9idXN5Ym94X2V4ZWNfcGF0aCwgYXJndik7CisJcmV0dXJuIGV4ZWN2cChmaWxlLCBhcmd2KTsKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIEJCX0VYRUNWUF9vcl9kaWUoY2hhciAqKmFyZ3YpCit7CisJQkJfRVhFQ1ZQKGFyZ3ZbMF0sIGFyZ3YpOworCS8qIFNVU3YzLW1hbmRhdGVkIGV4aXQgY29kZXMgKi8KKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAoZXJybm8gPT0gRU5PRU5UKSA/IDEyNyA6IDEyNjsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIGFyZ3ZbMF0pOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZmNsb3NlX25vbnN0ZGluLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9mY2xvc2Vfbm9uc3RkaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U5ZDViCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZmNsb3NlX25vbnN0ZGluLmMKQEAgLTAsMCArMSwyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmNsb3NlX25vbnN0ZGluIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBBIG51bWJlciBvZiBzdGFuZGFyZCB1dGlsaXRpZXMgY2FuIGFjY2VwdCBtdWx0aXBsZSBjb21tYW5kIGxpbmUgYXJncworICogb2YgJy0nIGZvciBzdGRpbiwgYWNjb3JkaW5nIHRvIFNVU3YzLiAgU28gd2UgZW5jYXBzdWxhdGUgdGhlIGNoZWNrCisgKiBoZXJlIHRvIHNhdmUgYSBsaXR0bGUgc3BhY2UuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBGQVNUX0ZVTkMgZmNsb3NlX2lmX25vdF9zdGRpbihGSUxFICpmKQoreworCS8qIFNvbWUgbW9yZSBwYXJhbm9pZCBhcHBsZXRzIHdhbnQgZmVycm9yKCkgY2hlY2sgdG9vICovCisJaW50IHIgPSBmZXJyb3IoZik7IC8qIE5COiBkb2VzIE5PVCBzZXQgZXJybm8hICovCisJaWYgKHIpIGVycm5vID0gRUlPOyAvKiBzbyB3ZSdsbCBoZWxwIGl0ICovCisJaWYgKGYgIT0gc3RkaW4pCisJCXJldHVybiAociB8IGZjbG9zZShmKSk7IC8qIGZjbG9zZSBkb2VzIHNldCBlcnJubyBvbiBlcnJvciAqLworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZmZsdXNoX3N0ZG91dF9hbmRfZXhpdC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZmZsdXNoX3N0ZG91dF9hbmRfZXhpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDVkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9mZmx1c2hfc3Rkb3V0X2FuZF9leGl0LmMKQEAgLTAsMCArMSwyOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQXR0ZW1wdCB0byBmZmx1c2goc3Rkb3V0KSwgYW5kIGV4aXQgd2l0aCBhbiBlcnJvciBjb2RlIGlmIHN0ZG91dCBpcworICogaW4gYW4gZXJyb3Igc3RhdGUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoaW50IHJldHZhbCkKK3sKKwlpZiAoZmZsdXNoKHN0ZG91dCkpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfc3RhbmRhcmRfb3V0cHV0KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyAmJiBkaWVfc2xlZXAgPCAwKSB7CisJCS8qIFdlIGFyZSBpbiBOT0ZPUksgYXBwbGV0LiBEbyBub3QgZXhpdCgpIGRpcmVjdGx5LAorCQkgKiBidXQgdXNlIHhmdW5jX2RpZSgpICovCisJCXhmdW5jX2Vycm9yX3JldHZhbCA9IHJldHZhbDsKKwkJeGZ1bmNfZGllKCk7CisJfQorCisJZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZmdldHNfc3RyLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9mZ2V0c19zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTIxMGEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZmdldHNfc3RyLmMKQEAgLTAsMCArMSw4NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIG1hbnkgZGlmZmVyZW50IHBlb3BsZS4KKyAqIElmIHlvdSB3cm90ZSB0aGlzLCBwbGVhc2UgYWNrbm93bGVkZ2UgeW91ciB3b3JrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyBjaGFyICp4bWFsbG9jX2ZnZXRzX2ludGVybmFsKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKnRlcm1pbmF0aW5nX3N0cmluZywgaW50IGNob3Bfb2ZmLCBzaXplX3QgKm1heHN6X3ApCit7CisJY2hhciAqbGluZWJ1ZiA9IE5VTEw7CisJY29uc3QgaW50IHRlcm1fbGVuZ3RoID0gc3RybGVuKHRlcm1pbmF0aW5nX3N0cmluZyk7CisJaW50IGVuZF9zdHJpbmdfb2Zmc2V0OworCWludCBsaW5lYnVmc3ogPSAwOworCWludCBpZHggPSAwOworCWludCBjaDsKKwlzaXplX3QgbWF4c3ogPSAqbWF4c3pfcDsKKworCXdoaWxlICgxKSB7CisJCWNoID0gZmdldGMoZmlsZSk7CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCWlmIChpZHggPT0gMCkKKwkJCQlyZXR1cm4gbGluZWJ1ZjsgLyogTlVMTCAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaWR4ID49IGxpbmVidWZzeikgeworCQkJbGluZWJ1ZnN6ICs9IDIwMDsKKwkJCWxpbmVidWYgPSB4cmVhbGxvYyhsaW5lYnVmLCBsaW5lYnVmc3opOworCQkJaWYgKGlkeCA+PSBtYXhzeikgeworCQkJCWxpbmVidWZbaWR4XSA9IGNoOworCQkJCWlkeCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJbGluZWJ1ZltpZHhdID0gY2g7CisJCWlkeCsrOworCisJCS8qIENoZWNrIGZvciB0ZXJtaW5hdGluZyBzdHJpbmcgKi8KKwkJZW5kX3N0cmluZ19vZmZzZXQgPSBpZHggLSB0ZXJtX2xlbmd0aDsKKwkJaWYgKGVuZF9zdHJpbmdfb2Zmc2V0ID49IDAKKwkJICYmIG1lbWNtcCgmbGluZWJ1ZltlbmRfc3RyaW5nX29mZnNldF0sIHRlcm1pbmF0aW5nX3N0cmluZywgdGVybV9sZW5ndGgpID09IDAKKwkJKSB7CisJCQlpZiAoY2hvcF9vZmYpCisJCQkJaWR4IC09IHRlcm1fbGVuZ3RoOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogR3Jvdy9zaHJpbmsgKmZpcnN0KiwgdGhlbiBzdG9yZSBOVUwgKi8KKwlsaW5lYnVmID0geHJlYWxsb2MobGluZWJ1ZiwgaWR4ICsgMSk7CisJbGluZWJ1ZltpZHhdID0gJ1wwJzsKKwkqbWF4c3pfcCA9IGlkeDsKKwlyZXR1cm4gbGluZWJ1ZjsKK30KKworLyogUmVhZCB1cCB0byBURVJNSU5BVElOR19TVFJJTkcgZnJvbSBGSUxFIGFuZCByZXR1cm4gaXQsCisgKiBpbmNsdWRpbmcgdGVybWluYXRpbmcgc3RyaW5nLgorICogTm9uLXRlcm1pbmF0ZWQgc3RyaW5nIGNhbiBiZSByZXR1cm5lZCBpZiBFT0YgaXMgcmVhY2hlZC4KKyAqIFJldHVybiBOVUxMIGlmIEVPRiBpcyByZWFjaGVkIGltbWVkaWF0ZWx5LiAgKi8KK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX2ZnZXRzX3N0cihGSUxFICpmaWxlLCBjb25zdCBjaGFyICp0ZXJtaW5hdGluZ19zdHJpbmcpCit7CisJc2l6ZV90IG1heHN6ID0gSU5UX01BWCAtIDQwOTU7CisJcmV0dXJuIHhtYWxsb2NfZmdldHNfaW50ZXJuYWwoZmlsZSwgdGVybWluYXRpbmdfc3RyaW5nLCAwLCAmbWF4c3opOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0c19zdHJfbGVuKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKnRlcm1pbmF0aW5nX3N0cmluZywgc2l6ZV90ICptYXhzel9wKQoreworCXNpemVfdCBtYXhzejsKKworCWlmICghbWF4c3pfcCkgeworCQltYXhzeiA9IElOVF9NQVggLSA0MDk1OworCQltYXhzel9wID0gJm1heHN6OworCX0KKwlyZXR1cm4geG1hbGxvY19mZ2V0c19pbnRlcm5hbChmaWxlLCB0ZXJtaW5hdGluZ19zdHJpbmcsIDAsIG1heHN6X3ApOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0bGluZV9zdHIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqdGVybWluYXRpbmdfc3RyaW5nKQoreworCXNpemVfdCBtYXhzeiA9IElOVF9NQVggLSA0MDk1OworCXJldHVybiB4bWFsbG9jX2ZnZXRzX2ludGVybmFsKGZpbGUsIHRlcm1pbmF0aW5nX3N0cmluZywgMSwgJm1heHN6KTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2ZpbmRfbW91bnRfcG9pbnQuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2ZpbmRfbW91bnRfcG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYzN2FkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZmluZF9tb3VudF9wb2ludC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bW50ZW50Lmg+CisKKy8qCisgKiBHaXZlbiBhIGJsb2NrIGRldmljZSwgZmluZCB0aGUgbW91bnQgdGFibGUgZW50cnkgaWYgdGhhdCBibG9jayBkZXZpY2UKKyAqIGlzIG1vdW50ZWQuCisgKgorICogR2l2ZW4gYW55IG90aGVyIGZpbGUgKG9yIGRpcmVjdG9yeSksIGZpbmQgdGhlIG1vdW50IHRhYmxlIGVudHJ5IGZvciBpdHMKKyAqIGZpbGVzeXN0ZW0uCisgKi8KK3N0cnVjdCBtbnRlbnQqIEZBU1RfRlVOQyBmaW5kX21vdW50X3BvaW50KGNvbnN0IGNoYXIgKm5hbWUsIGludCBzdWJkaXJfdG9vKQoreworCXN0cnVjdCBzdGF0IHM7CisJRklMRSAqbXRhYl9mcDsKKwlzdHJ1Y3QgbW50ZW50ICptb3VudEVudHJ5OworCWRldl90IGRldm5vX29mX25hbWU7CisJYm9vbCBibG9ja19kZXY7CisKKwlpZiAoc3RhdChuYW1lLCAmcykgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZub19vZl9uYW1lID0gcy5zdF9kZXY7CisJYmxvY2tfZGV2ID0gMDsKKwlpZiAoU19JU0JMSyhzLnN0X21vZGUpKSB7CisJCWRldm5vX29mX25hbWUgPSBzLnN0X3JkZXY7CisJCWJsb2NrX2RldiA9IDE7CisJfQorCisJbXRhYl9mcCA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInIiKTsKKwlpZiAoIW10YWJfZnApCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKChtb3VudEVudHJ5ID0gZ2V0bW50ZW50KG10YWJfZnApKSAhPSBOVUxMKSB7CisJCS8qIHJvb3RmcyBtb3VudCBpbiBMaW51eCAyLjYgZXhpc3RzIGFsd2F5cywKKwkJICogYW5kIGl0IG1ha2VzIHNlbnNlIHRvIGFsd2F5cyBpZ25vcmUgaXQuCisJCSAqIE90aGVyd2lzZSBwZW9wbGUgY2FuJ3QgcmVmZXJlbmNlIHRoZWlyICJyZWFsIiByb290ISAqLworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0tJUF9ST09URlMgJiYgc3RyY21wKG1vdW50RW50cnktPm1udF9mc25hbWUsICJyb290ZnMiKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChuYW1lLCBtb3VudEVudHJ5LT5tbnRfZGlyKSA9PSAwCisJCSB8fCBzdHJjbXAobmFtZSwgbW91bnRFbnRyeS0+bW50X2ZzbmFtZSkgPT0gMAorCQkpIHsgLyogU3RyaW5nIG1hdGNoLiAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdWJkaXJfdG9vIHx8IGJsb2NrX2RldikpCisJCQljb250aW51ZTsKKworCQkvKiBJcyBkZXZpY2UncyBkZXZfdCA9PSBuYW1lJ3MgZGV2X3Q/ICovCisJCWlmIChzdGF0KG1vdW50RW50cnktPm1udF9mc25hbWUsICZzKSA9PSAwICYmIHMuc3RfcmRldiA9PSBkZXZub19vZl9uYW1lKQorCQkJYnJlYWs7CisJCS8qIE1hdGNoIHRoZSBkaXJlY3RvcnkncyBtb3VudCBwb2ludC4gKi8KKwkJaWYgKHN0YXQobW91bnRFbnRyeS0+bW50X2RpciwgJnMpID09IDAgJiYgcy5zdF9kZXYgPT0gZGV2bm9fb2ZfbmFtZSkKKwkJCWJyZWFrOworCX0KKwllbmRtbnRlbnQobXRhYl9mcCk7CisKKwlyZXR1cm4gbW91bnRFbnRyeTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2ZpbmRfcGlkX2J5X25hbWUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2ZpbmRfcGlkX2J5X25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjgyM2QwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZmluZF9waWRfYnlfbmFtZS5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorSW4gTGludXggd2UgaGF2ZSB0aHJlZSB3YXlzIHRvIGRldGVybWluZSAicHJvY2VzcyBuYW1lIjoKKzEuIC9wcm9jL1BJRC9zdGF0IGhhcyAiLi4uKG5hbWUpLi4uIiwgYW1vbmcgb3RoZXIgdGhpbmdzLiBJdCdzIHNvLWNhbGxlZCAiY29tbSIgZmllbGQuCisyLiAvcHJvYy9QSUQvY21kbGluZSdzIGZpcnN0IE5VTC10ZXJtaW5hdGVkIHN0cmluZy4gSXQncyBhcmd2WzBdIGZyb20gZXhlYyBzeXNjYWxsLgorMy4gL3Byb2MvUElEL2V4ZSBzeW1saW5rLiBQb2ludHMgdG8gdGhlIHJ1bm5pbmcgZXhlY3V0YWJsZSBmaWxlLgorCitrZXJuZWwgdGhyZWFkczoKKyBjb21tOiB0aHJlYWQgbmFtZQorIGNtZGxpbmU6IGVtcHR5CisgZXhlOiA8cmVhZGxpbmsgZmFpbHM+CisKK2V4ZWN1dGFibGUKKyBjb21tOiBmaXJzdCAxNSBjaGFycyBvZiBiYXNlIG5hbWUKKyAoaWYgZXhlY3V0YWJsZSBpcyBhIHN5bWxpbmssIHRoZW4gZmlyc3QgMTUgY2hhcnMgb2Ygc3ltbGluayBuYW1lIGFyZSB1c2VkKQorIGNtZGxpbmU6IGFyZ3ZbMF0gZnJvbSBleGVjIHN5c2NhbGwKKyBleGU6IHBvaW50cyB0byBleGVjdXRhYmxlIChyZXNvbHZlcyBzeW1saW5rLCB1bmxpa2UgY29tbSkKKworc2NyaXB0IChhbiBleGVjdXRhYmxlIHdpdGggIyEvcGF0aC90by9pbnRlcnByZXRlcik6CisgY29tbTogZmlyc3QgMTUgY2hhcnMgb2Ygc2NyaXB0J3MgYmFzZSBuYW1lIChzeW1saW5rcyBhcmUgbm90IHJlc29sdmVkKQorIGNtZGxpbmU6IC9wYXRoL3RvL2ludGVycHJldGVyIChzeW1saW5rcyBhcmUgbm90IHJlc29sdmVkKQorIChzY3JpcHQgbmFtZSBpcyBpbiBhcmd2WzFdLCBhcmdzIGFyZSBwdXNoZWQgaW50byBhcmd2WzJdIGV0YykKKyBleGU6IHBvaW50cyB0byBpbnRlcnByZXRlcidzIGV4ZWN1dGFibGUgKHN5bWxpbmtzIGFyZSByZXNvbHZlZCkKKworSWYgRkVBVFVSRV9QUkVGRVJfQVBQTEVUUz15IChhbmQgbW9yZSBzbyBpZiBGRUFUVVJFX1NIX1NUQU5EQUxPTkU9eSksCitzb21lIGNvbW1hbmRzIHN0YXJ0ZWQgZnJvbSBidXN5Ym94IHNoZWxsLCB4YXJncyBvciBmaW5kIGFyZSBzdGFydGVkIGJ5CitleGVjWFhYKCIvcHJvYy9zZWxmL2V4ZSIsIGFwcGxldF9uYW1lLCBwYXJhbXMuLi4uKQorYW5kIHRoZXJlZm9yZSBjb21tIGZpZWxkIGNvbnRhaW5zICJleGUiLgorKi8KKworc3RhdGljIGludCBjb21tX21hdGNoKHByb2Nwc19zdGF0dXNfdCAqcCwgY29uc3QgY2hhciAqcHJvY05hbWUpCit7CisJaW50IGFyZ3YxaWR4OworCWNvbnN0IGNoYXIgKmFyZ3YxOworCisJaWYgKHN0cm5jbXAocC0+Y29tbSwgcHJvY05hbWUsIDE1KSAhPSAwKQorCQlyZXR1cm4gMDsgLyogY29tbSBkb2VzIG5vdCBtYXRjaCAqLworCisJLyogSW4gTGludXgsIGlmIGNvbW0gaXMgMTUgY2hhcnMsIGl0IGlzIHRydW5jYXRlZC4KKwkgKiAob3IgbWF5YmUgdGhlIG5hbWUgd2FzIGV4YWN0bHkgMTUgY2hhcnMsIGJ1dCB0aGVyZSBpcworCSAqIG5vIHdheSB0byBrbm93IHRoYXQpICovCisJaWYgKHAtPmNvbW1bMTRdID09ICdcMCcpCisJCXJldHVybiAxOyAvKiBjb21tIGlzIG5vdCB0cnVuY2F0ZWQgLSBtYXRjaGVzICovCisKKwkvKiBjb21tIGlzIHRydW5jYXRlZCwgYnV0IGZpcnN0IDE1IGNoYXJzIG1hdGNoLgorCSAqIFRoaXMgY2FuIGJlIGNyYXppbHlfbG9uZ19zY3JpcHRfbmFtZS5zaCEKKwkgKiBUaGUgdGVsbHRhbGUgc2lnbiBpcyBiYXNlbmFtZShhcmd2WzFdKSA9PSBwcm9jTmFtZSAqLworCisJaWYgKCFwLT5hcmd2MCkKKwkJcmV0dXJuIDA7CisKKwlhcmd2MWlkeCA9IHN0cmxlbihwLT5hcmd2MCkgKyAxOworCWlmIChhcmd2MWlkeCA+PSBwLT5hcmd2X2xlbikKKwkJcmV0dXJuIDA7CisJYXJndjEgPSBwLT5hcmd2MCArIGFyZ3YxaWR4OworCisJaWYgKHN0cmNtcChiYl9iYXNlbmFtZShhcmd2MSksIHByb2NOYW1lKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBUaGlzIGZpbmRzIHRoZSBwaWQgb2YgdGhlIHNwZWNpZmllZCBwcm9jZXNzLgorICogQ3VycmVudGx5LCBpdCdzIGltcGxlbWVudGVkIGJ5IHJ1bW1hZ2luZyB0aHJvdWdoCisgKiB0aGUgcHJvYyBmaWxlc3lzdGVtLgorICoKKyAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBtYXRjaGluZyBQSURzCisgKiBJdCBpcyB0aGUgY2FsbGVyJ3MgZHV0eSB0byBmcmVlIHRoZSByZXR1cm5lZCBwaWRsaXN0LgorICoKKyAqIE1vZGlmaWVkIGJ5IFZsYWRpbWlyIE9sZXluaWsgZm9yIHVzZSB3aXRoIGxpYmJiL3Byb2Nwcy5jCisgKi8KK3BpZF90KiBGQVNUX0ZVTkMgZmluZF9waWRfYnlfbmFtZShjb25zdCBjaGFyICpwcm9jTmFtZSkKK3sKKwlwaWRfdCogcGlkTGlzdDsKKwlpbnQgaSA9IDA7CisJcHJvY3BzX3N0YXR1c190KiBwID0gTlVMTDsKKworCXBpZExpc3QgPSB4emFsbG9jKHNpemVvZigqcGlkTGlzdCkpOworCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIFBTU0NBTl9QSUR8UFNTQ0FOX0NPTU18UFNTQ0FOX0FSR1ZOfFBTU0NBTl9FWEUpKSkgeworCQlpZiAoY29tbV9tYXRjaChwLCBwcm9jTmFtZSkKKwkJLyogb3Igd2UgcmVxdWlyZSBhcmd2MCB0byBtYXRjaCAoZXNzZW50aWFsIGZvciBtYXRjaGluZyByZWV4ZWNlZCAvcHJvYy9zZWxmL2V4ZSkqLworCQkgfHwgKHAtPmFyZ3YwICYmIHN0cmNtcChiYl9iYXNlbmFtZShwLT5hcmd2MCksIHByb2NOYW1lKSA9PSAwKQorCQkvKiBvciB3ZSByZXF1aXJlIC9wcm9jL1BJRC9leGUgbGluayB0byBtYXRjaCAqLworCQkgfHwgKHAtPmV4ZSAmJiBzdHJjbXAoYmJfYmFzZW5hbWUocC0+ZXhlKSwgcHJvY05hbWUpID09IDApCisJCSkgeworCQkJcGlkTGlzdCA9IHhyZWFsbG9jX3ZlY3RvcihwaWRMaXN0LCAyLCBpKTsKKwkJCXBpZExpc3RbaSsrXSA9IHAtPnBpZDsKKwkJfQorCX0KKworCXBpZExpc3RbaV0gPSAwOworCXJldHVybiBwaWRMaXN0OworfQorCitwaWRfdCogRkFTVF9GVU5DIHBpZGxpc3RfcmV2ZXJzZShwaWRfdCAqcGlkTGlzdCkKK3sKKwlpbnQgaSA9IDA7CisJd2hpbGUgKHBpZExpc3RbaV0pCisJCWkrKzsKKwlpZiAoLS1pID49IDApIHsKKwkJcGlkX3QgazsKKwkJaW50IGo7CisJCWZvciAoaiA9IDA7IGkgPiBqOyBpLS0sIGorKykgeworCQkJayA9IHBpZExpc3RbaV07CisJCQlwaWRMaXN0W2ldID0gcGlkTGlzdFtqXTsKKwkJCXBpZExpc3Rbal0gPSBrOworCQl9CisJfQorCXJldHVybiBwaWRMaXN0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZmluZF9yb290X2RldmljZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZmluZF9yb290X2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2UxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9maW5kX3Jvb3RfZGV2aWNlLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qICNkZWZpbmUgREVCVUdHSU5HIDEgKi8KKworI2lmZGVmIERFQlVHR0lORworI2RlZmluZSBkZWJ1ZyguLi4pIGRvIHsgcHJpbnRmKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGRlYnVnKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworCisvKiBGaW5kIGJsb2NrIGRldmljZSAvZGV2L1hYWCB3aGljaCBjb250YWlucyBzcGVjaWZpZWQgZmlsZQorICogV2UgaGFuZGxlIC9kZXYvZGlyL2Rpci9kaXIgdG9vLCBhdCBhIGNvc3Qgb2YgfjgwIG1vcmUgYnl0ZXMgY29kZSAqLworCisvKiBEbyBub3QgcmVhbGxvY2F0ZSBhbGwgdGhpcyBzdHVmZiBvbiBlYWNoIHJlY3Vyc2lvbiAqLworZW51bSB7IERFVk5BTUVfTUFYID0gMjU2IH07CitzdHJ1Y3QgYXJlbmEgeworCXN0cnVjdCBzdGF0IHN0OworCWRldl90IGRldjsKKwkvKiBXYXMgUEFUSF9NQVgsIGJ1dCB3ZSByZWN1cnNlIF8vZGV2Xy4gV2UgY2FuIGFzc3VtZQorCSAqIHBlb3BsZSBhcmUgbm90IGNyYXp5IGVub3VnaCB0byBoYXZlIG1lZ2EtZGVlcCB0cmVlIHRoZXJlICovCisJY2hhciBkZXZwYXRoW0RFVk5BTUVfTUFYXTsKK307CisKK3N0YXRpYyBjaGFyICpmaW5kX2Jsb2NrX2RldmljZV9pbl9kaXIoc3RydWN0IGFyZW5hICphcCkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwljaGFyICpyZXRwYXRoID0gTlVMTDsKKwlpbnQgbGVuLCByZW07CisKKwlsZW4gPSBzdHJsZW4oYXAtPmRldnBhdGgpOworCXJlbSA9IERFVk5BTUVfTUFYLTIgLSBsZW47CisJaWYgKHJlbSA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWRpciA9IG9wZW5kaXIoYXAtPmRldnBhdGgpOworCWlmICghZGlyKQorCQlyZXR1cm4gTlVMTDsKKworCWFwLT5kZXZwYXRoW2xlbisrXSA9ICcvJzsKKworCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJc2FmZV9zdHJuY3B5KGFwLT5kZXZwYXRoICsgbGVuLCBlbnRyeS0+ZF9uYW1lLCByZW0pOworCQkvKiBsc3RhdDogZG8gbm90IGZvbGxvdyBsaW5rcyAqLworCQlpZiAobHN0YXQoYXAtPmRldnBhdGgsICZhcC0+c3QpICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKFNfSVNCTEsoYXAtPnN0LnN0X21vZGUpICYmIGFwLT5zdC5zdF9yZGV2ID09IGFwLT5kZXYpIHsKKwkJCXJldHBhdGggPSB4c3RyZHVwKGFwLT5kZXZwYXRoKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChTX0lTRElSKGFwLT5zdC5zdF9tb2RlKSkgeworCQkJLyogRG8gbm90IHJlY3Vyc2UgZm9yICcuJyBhbmQgJy4uJyAqLworCQkJaWYgKERPVF9PUl9ET1RET1QoZW50cnktPmRfbmFtZSkpCisJCQkJY29udGludWU7CisJCQlyZXRwYXRoID0gZmluZF9ibG9ja19kZXZpY2VfaW5fZGlyKGFwKTsKKwkJCWlmIChyZXRwYXRoKQorCQkJCWJyZWFrOworCQl9CisJfQorCWNsb3NlZGlyKGRpcik7CisKKwlyZXR1cm4gcmV0cGF0aDsKK30KKworI2RlZmluZSBQUk9DX01PVU5USU5GTyAgIi9wcm9jL3NlbGYvbW91bnRpbmZvIgorLyogQSBtYWpvciBvZiB6ZXJvIGluZGljYXRlcyBhIG5vbi1kZXZpY2UgbW91bnQuIFVzZSB0aGUga2VybmVsJ3Mgc2hvd19tb3VudGluZm8oKSwKKyAqIGV4cG9zZWQgdGhyb3VnaCAvcHJvYy9zZWxmL21vdW50aW5mbyB0byBsb29rdXAgdGhlIGRldmljZSByZWZlcmVuY2UuICovCitzdGF0aWMgY2hhciAqZmluZF9kZXZpY2VfaW5fbW91bnRpbmZvKHN0cnVjdCBhcmVuYSAqYXApCit7CisJY2hhciBsaW5lWzEwMjRdOworCWNoYXIgKmxpbmVQdHI7CisJY2hhciAqcmV0cGF0aCA9IE5VTEw7CisKKwlGSUxFICpmcCA9IGZvcGVuX2Zvcl9yZWFkKFBST0NfTU9VTlRJTkZPKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gTlVMTDsKKworCWRlYnVnKCJMb29raW5nIGZvciBkZXZpY2UgJXU6JXVcbiIsIG1ham9yKGFwLT5kZXYpLCBtaW5vcihhcC0+ZGV2KSk7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7CisJCQlpbnQgbW50X2lkLCBwYXJlbnRfbW50X2lkOworCQkJdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKKwkJCWNoYXIgbW50X3R5cGVuYW1lWzEwMjRdLCBtbnRfZGV2bmFtZVsxMDI0XTsKKworCQkJbGluZVB0ciA9IGxpbmU7CisJCQlpZiAoc3NjYW5mKGxpbmVQdHIsICIlaSAlaSAldToldSIsICZtbnRfaWQsICZwYXJlbnRfbW50X2lkLCAmbWFqb3IsICZtaW5vcikgIT0gNCkgeworCQkJCWRlYnVnKCJDb3VsZG4ndCBwYXJzZSBsaW5lOiAnJXMnXG4iLCBsaW5lKTsKKwkJCX0gZWxzZSBpZiAoKGxpbmVQdHIgPSBzdHJzdHIobGluZVB0ciwgIiAtICIpKSA9PSBOVUxMKSB7CisJCQkJZGVidWcoIkNvdWxkbid0IGZpbmQgJyAtICc6ICclcydcbiIsIGxpbmUpOworCQkJfSBlbHNlIGlmIChzc2NhbmYobGluZVB0ciwgIiAtICVzICVzICIsIG1udF90eXBlbmFtZSwgbW50X2Rldm5hbWUpICE9IDIpIHsKKwkJCQlkZWJ1ZygiQ291bGRuJ3QgcGFyc2UgbGluZTogJyVzJ1xuIiwgbGluZSk7CisJCQl9IGVsc2UgaWYgKChtYWpvcihhcC0+ZGV2KSAhPSBtYWpvcikgfHwgKG1pbm9yKGFwLT5kZXYpICE9IG1pbm9yKSkgeworCQkJCWRlYnVnKCJOb24tbWF0Y2hpbmcgZGV2aWNlICV1OiV1IC0tPiAlc1xuIiwgbWFqb3IsIG1pbm9yLCBtbnRfZGV2bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCWRlYnVnKCJGb3VuZCBhIG1hdGNoICV1OiV1IC0tPiAlc1xuIiwgbWFqb3IsIG1pbm9yLCBtbnRfZGV2bmFtZSk7CisJCQkJcmV0cGF0aCA9IHhzdHJkdXAobW50X2Rldm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCX0KKworCWZjbG9zZShmcCk7CisKKwlyZXR1cm4gcmV0cGF0aDsKK30KKworY2hhciogRkFTVF9GVU5DIGZpbmRfYmxvY2tfZGV2aWNlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IGFyZW5hIGE7CisKKwlpZiAoc3RhdChwYXRoLCAmYS5zdCkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJYS5kZXYgPSBTX0lTQkxLKGEuc3Quc3RfbW9kZSkgPyBhLnN0LnN0X3JkZXYgOiBhLnN0LnN0X2RldjsKKwlpZiAobWFqb3IoYS5kZXYpICE9IDApIHsKKwkJc3RyY3B5KGEuZGV2cGF0aCwgIi9kZXYiKTsKKwkJcmV0dXJuIGZpbmRfYmxvY2tfZGV2aWNlX2luX2RpcigmYSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZpbmRfZGV2aWNlX2luX21vdW50aW5mbygmYSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZnVsbF93cml0ZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZnVsbF93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2ZiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9mdWxsX3dyaXRlLmMKQEAgLTAsMCArMSw0MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIFdyaXRlIGFsbCBvZiB0aGUgc3VwcGxpZWQgYnVmZmVyIG91dCB0byBhIGZpbGUuCisgKiBUaGlzIGRvZXMgbXVsdGlwbGUgd3JpdGVzIGFzIG5lY2Vzc2FyeS4KKyAqIFJldHVybnMgdGhlIGFtb3VudCB3cml0dGVuLCBvciAtMSBvbiBhbiBlcnJvci4KKyAqLworc3NpemVfdCBGQVNUX0ZVTkMgZnVsbF93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IGNjOworCXNzaXplX3QgdG90YWw7CisKKwl0b3RhbCA9IDA7CisKKwl3aGlsZSAobGVuKSB7CisJCWNjID0gc2FmZV93cml0ZShmZCwgYnVmLCBsZW4pOworCisJCWlmIChjYyA8IDApIHsKKwkJCWlmICh0b3RhbCkgeworCQkJCS8qIHdlIGFscmVhZHkgd3JvdGUgc29tZSEgKi8KKwkJCQkvKiB1c2VyIGNhbiBkbyBhbm90aGVyIHdyaXRlIHRvIGtub3cgdGhlIGVycm9yIGNvZGUgKi8KKwkJCQlyZXR1cm4gdG90YWw7CisJCQl9CisJCQlyZXR1cm4gY2M7ICAvKiB3cml0ZSgpIHJldHVybnMgLTEgb24gZmFpbHVyZS4gKi8KKwkJfQorCisJCXRvdGFsICs9IGNjOworCQlidWYgPSAoKGNvbnN0IGNoYXIgKilidWYpICsgY2M7CisJCWxlbiAtPSBjYzsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9nZXRfY29uc29sZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0X2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjY0MDdiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0X2NvbnNvbGUuYwpAQCAtMCwwICsxLDgwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLiAgSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZQorICogYWNrbm93bGVkZ2UgeW91ciB3b3JrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEZyb20gPGxpbnV4L2tkLmg+ICovCitlbnVtIHsgS0RHS0JUWVBFID0gMHg0QjMzIH07ICAvKiBnZXQga2V5Ym9hcmQgdHlwZSAqLworCitzdGF0aWMgaW50IG9wZW5fYV9jb25zb2xlKGNvbnN0IGNoYXIgKmZuYW0pCit7CisJaW50IGZkOworCisJLyogdHJ5IHJlYWQtd3JpdGUgKi8KKwlmZCA9IG9wZW4oZm5hbSwgT19SRFdSKTsKKworCS8qIGlmIGZhaWxlZCwgdHJ5IHJlYWQtb25seSAqLworCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRUFDQ0VTKQorCQlmZCA9IG9wZW4oZm5hbSwgT19SRE9OTFkpOworCisJLyogaWYgZmFpbGVkLCB0cnkgd3JpdGUtb25seSAqLworCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRUFDQ0VTKQorCQlmZCA9IG9wZW4oZm5hbSwgT19XUk9OTFkpOworCisJcmV0dXJuIGZkOworfQorCisvKgorICogR2V0IGFuIGZkIGZvciB1c2Ugd2l0aCBrYmQvY29uc29sZSBpb2N0bHMuCisgKiBXZSB0cnkgc2V2ZXJhbCB0aGluZ3MgYmVjYXVzZSBvcGVuaW5nIC9kZXYvY29uc29sZSB3aWxsIGZhaWwKKyAqIGlmIHNvbWVvbmUgZWxzZSB1c2VkIFggKHdoaWNoIGRvZXMgYSBjaG93biBvbiAvZGV2L2NvbnNvbGUpLgorICovCitpbnQgRkFTVF9GVU5DIGdldF9jb25zb2xlX2ZkX29yX2RpZSh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb25zb2xlX25hbWVzW10gPSB7CisJCURFVl9DT05TT0xFLCBDVVJSRU5UX1ZDLCBDVVJSRU5UX1RUWQorCX07CisKKwlpbnQgZmQ7CisKKwlmb3IgKGZkID0gMjsgZmQgPj0gMDsgZmQtLSkgeworCQlpbnQgZmQ0bmFtZTsKKwkJaW50IGNob2ljZV9mZDsKKwkJY2hhciBhcmc7CisKKwkJZmQ0bmFtZSA9IG9wZW5fYV9jb25zb2xlKGNvbnNvbGVfbmFtZXNbZmRdKTsKKyBjaGtfc3RkOgorCQljaG9pY2VfZmQgPSAoZmQ0bmFtZSA+PSAwID8gZmQ0bmFtZSA6IGZkKTsKKworCQlhcmcgPSAwOworCQlpZiAoaW9jdGwoY2hvaWNlX2ZkLCBLREdLQlRZUEUsICZhcmcpID09IDApCisJCQlyZXR1cm4gY2hvaWNlX2ZkOworCQlpZiAoZmQ0bmFtZSA+PSAwKSB7CisJCQljbG9zZShmZDRuYW1lKTsKKwkJCWZkNG5hbWUgPSAtMTsKKwkJCWdvdG8gY2hrX3N0ZDsKKwkJfQorCX0KKworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuIGNvbnNvbGUiKTsKKwkvKnJldHVybiBmZDsgLSB0b3RhbCBmYWlsdXJlICovCit9CisKKy8qIEZyb20gPGxpbnV4L3Z0Lmg+ICovCitlbnVtIHsKKwlWVF9BQ1RJVkFURSA9IDB4NTYwNiwgICAvKiBtYWtlIHZ0IGFjdGl2ZSAqLworCVZUX1dBSVRBQ1RJVkUgPSAweDU2MDcgIC8qIHdhaXQgZm9yIHZ0IGFjdGl2ZSAqLworfTsKKwordm9pZCBGQVNUX0ZVTkMgY29uc29sZV9tYWtlX2FjdGl2ZShpbnQgZmQsIGNvbnN0IGludCB2dF9udW0pCit7CisJeGlvY3RsKGZkLCBWVF9BQ1RJVkFURSwgKHZvaWQgKikocHRyZGlmZl90KXZ0X251bSk7CisJeGlvY3RsKGZkLCBWVF9XQUlUQUNUSVZFLCAodm9pZCAqKShwdHJkaWZmX3QpdnRfbnVtKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldF9jcHVfY291bnQuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldF9jcHVfY291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ2OGFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0X2NwdV9jb3VudC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEZhY3RvcmVkIG91dCBvZiBtcHN0YXQvaW9zdGF0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYXJlayBQb2xhY2VrIDxtbXBvbGFjZWtAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBEb2VzIHN0ciBzdGFydCB3aXRoICJjcHUiPyAqLworaW50IEZBU1RfRlVOQyBzdGFydHNfd2l0aF9jcHUoY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiAoKHN0clswXSAtICdjJykgfCAoc3RyWzFdIC0gJ3AnKSB8IChzdHJbMl0gLSAndScpKSA9PSAwOworfQorCisvKgorICogR2V0IG51bWJlciBvZiBwcm9jZXNzb3JzLiBVc2VzIC9wcm9jL3N0YXQuCisgKiBSZXR1cm4gdmFsdWUgMCBtZWFucyBvbmUgQ1BVIGFuZCBub24gU01QIGtlcm5lbC4KKyAqIE90aGVyd2lzZSBOIG1lYW5zIE4gcHJvY2Vzc29yKHMpIGFuZCBTTVAga2VybmVsLgorICovCit1bnNpZ25lZCBGQVNUX0ZVTkMgZ2V0X2NwdV9jb3VudCh2b2lkKQoreworCUZJTEUgKmZwOworCWNoYXIgbGluZVsyNTZdOworCWludCBwcm9jX25yID0gLTE7CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2Mvc3RhdCIpOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgeworCQlpZiAoIXN0YXJ0c193aXRoX2NwdShsaW5lKSkgeworCQkJaWYgKHByb2NfbnIgPj0gMCkKKwkJCQlicmVhazsgLyogd2UgYXJlIHBhc3QgImNwdU4uLi4iIGxpbmVzICovCisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGluZVszXSAhPSAnICcpIHsgLyogImNwdU4iICovCisJCQlpbnQgbnVtX3Byb2M7CisJCQlpZiAoc3NjYW5mKGxpbmUgKyAzLCAiJXUiLCAmbnVtX3Byb2MpID09IDEKKwkJCSAmJiBudW1fcHJvYyA+IHByb2NfbnIKKwkJCSkgeworCQkJCXByb2NfbnIgPSBudW1fcHJvYzsKKwkJCX0KKwkJfQorCX0KKworCWZjbG9zZShmcCk7CisJcmV0dXJuIHByb2NfbnIgKyAxOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0X2xhc3RfcGF0aF9jb21wb25lbnQuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldF9sYXN0X3BhdGhfY29tcG9uZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmZGYyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldF9sYXN0X3BhdGhfY29tcG9uZW50LmMKQEAgLTAsMCArMSw1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGJiX2Jhc2VuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqY3AgPSBzdHJyY2hyKG5hbWUsICcvJyk7CisJaWYgKGNwKQorCQlyZXR1cm4gY3AgKyAxOworCXJldHVybiBuYW1lOworfQorCisvKgorICogIi8iICAgICAgICAtPiAiLyIKKyAqICJhYmMiICAgICAgLT4gImFiYyIKKyAqICJhYmMvZGVmIiAgLT4gImRlZiIKKyAqICJhYmMvZGVmLyIgLT4gIiIKKyAqLworY2hhciogRkFTVF9GVU5DIGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICpzbGFzaCA9IHN0cnJjaHIocGF0aCwgJy8nKTsKKworCWlmICghc2xhc2ggfHwgKHNsYXNoID09IHBhdGggJiYgIXNsYXNoWzFdKSkKKwkJcmV0dXJuIChjaGFyKilwYXRoOworCisJcmV0dXJuIHNsYXNoICsgMTsKK30KKworLyoKKyAqICIvIiAgICAgICAgLT4gIi8iCisgKiAiYWJjIiAgICAgIC0+ICJhYmMiCisgKiAiYWJjL2RlZiIgIC0+ICJkZWYiCisgKiAiYWJjL2RlZi8iIC0+ICJkZWYiICEhCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcChjaGFyICpwYXRoKQoreworCWNoYXIgKnNsYXNoID0gbGFzdF9jaGFyX2lzKHBhdGgsICcvJyk7CisKKwlpZiAoc2xhc2gpCisJCXdoaWxlICgqc2xhc2ggPT0gJy8nICYmIHNsYXNoICE9IHBhdGgpCisJCQkqc2xhc2gtLSA9ICdcMCc7CisKKwlyZXR1cm4gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcChwYXRoKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldF9saW5lX2Zyb21fZmlsZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0X2xpbmVfZnJvbV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4ZGQzNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldF9saW5lX2Zyb21fZmlsZS5jCkBAIC0wLDAgKzEsMTgwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBNYXR0IEtyYWkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitjaGFyKiBGQVNUX0ZVTkMgYmJfZ2V0X2NodW5rX2Zyb21fZmlsZShGSUxFICpmaWxlLCBpbnQgKmVuZCkKK3sKKwlpbnQgY2g7CisJdW5zaWduZWQgaWR4ID0gMDsKKwljaGFyICpsaW5lYnVmID0gTlVMTDsKKworCXdoaWxlICgoY2ggPSBnZXRjKGZpbGUpKSAhPSBFT0YpIHsKKwkJLyogZ3JvdyB0aGUgbGluZSBidWZmZXIgYXMgbmVjZXNzYXJ5ICovCisJCWlmICghKGlkeCAmIDB4ZmYpKQorCQkJbGluZWJ1ZiA9IHhyZWFsbG9jKGxpbmVidWYsIGlkeCArIDB4MTAwKTsKKwkJbGluZWJ1ZltpZHgrK10gPSAoY2hhcikgY2g7CisJCWlmIChjaCA9PSAnXDAnKQorCQkJYnJlYWs7CisJCWlmIChlbmQgJiYgY2ggPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwlpZiAoZW5kKQorCQkqZW5kID0gaWR4OworCWlmIChsaW5lYnVmKSB7CisJCS8vIGh1aCwgZG9lcyBmZ2V0cyBkaXNjYXJkIHByaW9yIGRhdGEgb24gZXJyb3IgbGlrZSB0aGlzPworCQkvLyBJIGRvbid0IHRoaW5rIHNvLi4uLgorCQkvL2lmIChmZXJyb3IoZmlsZSkpIHsKKwkJLy8JZnJlZShsaW5lYnVmKTsKKwkJLy8JcmV0dXJuIE5VTEw7CisJCS8vfQorCQlsaW5lYnVmID0geHJlYWxsb2MobGluZWJ1ZiwgaWR4ICsgMSk7CisJCWxpbmVidWZbaWR4XSA9ICdcMCc7CisJfQorCXJldHVybiBsaW5lYnVmOworfQorCisvKiBHZXQgbGluZSwgaW5jbHVkaW5nIHRyYWlsaW5nIFxuIGlmIGFueSAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldHMoRklMRSAqZmlsZSkKK3sKKwlpbnQgaTsKKworCXJldHVybiBiYl9nZXRfY2h1bmtfZnJvbV9maWxlKGZpbGUsICZpKTsKK30KKy8qIEdldCBsaW5lLiAgUmVtb3ZlIHRyYWlsaW5nIFxuICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0bGluZShGSUxFICpmaWxlKQoreworCWludCBpOworCWNoYXIgKmMgPSBiYl9nZXRfY2h1bmtfZnJvbV9maWxlKGZpbGUsICZpKTsKKworCWlmIChpICYmIGNbLS1pXSA9PSAnXG4nKQorCQljW2ldID0gJ1wwJzsKKworCXJldHVybiBjOworfQorCisjaWYgMAorLyogR05VaXNtIGdldGxpbmUoKSBzaG91bGQgYmUgZmFzdGVyIChub3QgdGVzdGVkKSB0aGFuIGEgbG9vcCB3aXRoIGZnZXRjICovCisKKy8qIEdldCBsaW5lLCBpbmNsdWRpbmcgdHJhaWxpbmcgXG4gaWYgYW55ICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0cyhGSUxFICpmaWxlKQoreworCWNoYXIgKnJlc19idWYgPSBOVUxMOworCXNpemVfdCByZXNfc3o7CisKKwlpZiAoZ2V0bGluZSgmcmVzX2J1ZiwgJnJlc19zeiwgZmlsZSkgPT0gLTEpIHsKKwkJZnJlZShyZXNfYnVmKTsgLyogdWNsaWJjIGFsbG9jYXRlcyBhIGJ1ZmZlciBldmVuIG9uIEVPRi4gV1RGPyAqLworCQlyZXNfYnVmID0gTlVMTDsKKwl9CisvL1RPRE86IHRyaW1taW5nIHRvIHJlc19zej8KKwlyZXR1cm4gcmVzX2J1ZjsKK30KKy8qIEdldCBsaW5lLiAgUmVtb3ZlIHRyYWlsaW5nIFxuICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0bGluZShGSUxFICpmaWxlKQoreworCWNoYXIgKnJlc19idWYgPSBOVUxMOworCXNpemVfdCByZXNfc3o7CisKKwlyZXNfc3ogPSBnZXRsaW5lKCZyZXNfYnVmLCAmcmVzX3N6LCBmaWxlKTsKKworCWlmICgoc3NpemVfdClyZXNfc3ogIT0gLTEpIHsKKwkJaWYgKHJlc19idWZbcmVzX3N6IC0gMV0gPT0gJ1xuJykKKwkJCXJlc19idWZbLS1yZXNfc3pdID0gJ1wwJzsKKy8vVE9ETzogdHJpbW1pbmcgdG8gcmVzX3N6PworCX0gZWxzZSB7CisJCWZyZWUocmVzX2J1Zik7IC8qIHVjbGliYyBhbGxvY2F0ZXMgYSBidWZmZXIgZXZlbiBvbiBFT0YuIFdURj8gKi8KKwkJcmVzX2J1ZiA9IE5VTEw7CisJfQorCXJldHVybiByZXNfYnVmOworfQorCisjZW5kaWYKKworI2lmIDAKKy8qIEZhc3RlciByb3V0aW5lcyAofnR3aWNlIGFzIGZhc3QpLiArMTcwIGJ5dGVzLiBVbnVzZWQgYXMgb2YgMjAwOC0wNy4KKyAqCisgKiBOQjogdGhleSBzdG9wIGF0IE5VTCBieXRlIHRvby4KKyAqIFBlcmZvcm1hbmNlIGlzIGltcG9ydGFudCBoZXJlLiBUaGluayAiZ3JlcCA1MGdpZ2FieXRlX2ZpbGUiLi4uCisgKiBJcm9uaWNhbGx5LCBncmVwIGNhbid0IHVzZSBpdCBiZWNhdXNlIG9mIE5VTCBpc3N1ZS4KKyAqIFdlIHNvcmVseSBuZWVkIEMgbGliIHRvIHByb3ZpZGUgZmdldHMgd2hpY2ggcmVwb3J0cyBzaXplIQorICoKKyAqIFVwZGF0ZToKKyAqIEFjdHVhbGx5LCB1Y2xpYmMgYW5kIGdsaWJjIGhhdmUgaXQuIG1hbiBnZXRsaW5lLiBJdCdzIEdOVWlzbSwKKyAqICAgYnV0IHZlcnkgdXNlZnVsIG9uZSAoaWYgaXQncyBhcyBmYXN0IGFzIHRoaXMgY29kZSkuCisgKiBUT0RPOgorICogLSBjdXJyZW50bHksIHNlZCBhbmQgc29ydCB1c2UgYmJfZ2V0X2NodW5rX2Zyb21fZmlsZSBhbmQgaGVhdmlseQorICogICBkZXBlbmQgb24gaXRzICJzdG9wIG9uIFxuIG9yIFwwIiBiZWhhdmlvciwgYW5kIFNUSUxMIHRoZXkgZmFpbAorICogICB0byBoYW5kbGUgYWxsIGNhc2VzIHdpdGggZW1iZWRkZWQgTlVMcyBjb3JyZWN0bHkuIFNvOgorICogLSBhdWRpdCBzZWQgYW5kIHNvcnQ7IGNvbnZlcnQgdGhlbSB0byBnZXRsaW5lIEZJUlNULgorICogLSBUSEVOIGRpdGNoIGJiX2dldF9jaHVua19mcm9tX2ZpbGUsIHJlcGxhY2UgaXQgd2l0aCBnZXRsaW5lLgorICogLSBwcm92aWRlIGdldGxpbmUgaW1wbGVtZW50YXRpb24gZm9yIG5vbi1HTlUgc3lzdGVtcy4KKyAqLworCitzdGF0aWMgY2hhciogeG1hbGxvY19mZ2V0c19pbnRlcm5hbChGSUxFICpmaWxlLCBpbnQgKnNpemVwKQoreworCWludCBsZW47CisJaW50IGlkeCA9IDA7CisJY2hhciAqbGluZWJ1ZiA9IE5VTEw7CisKKwl3aGlsZSAoMSkgeworCQljaGFyICpyOworCisJCWxpbmVidWYgPSB4cmVhbGxvYyhsaW5lYnVmLCBpZHggKyAweDEwMCk7CisJCXIgPSBmZ2V0cygmbGluZWJ1ZltpZHhdLCAweDEwMCwgZmlsZSk7CisJCWlmICghcikgeworCQkJLyogbmVlZCB0byB0ZXJtaW5hdGUgaW4gY2FzZSB0aGlzIGlzIGVycm9yCisJCQkgKiAoRU9GIHB1dHMgTlVMIGl0c2VsZikgKi8KKwkJCWxpbmVidWZbaWR4XSA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCQkvKiBzdHVwaWQuIGZnZXRzIGtub3dzIHRoZSBsZW4sIGl0IHNob3VsZCByZXBvcnQgaXQgc29tZWhvdyAqLworCQlsZW4gPSBzdHJsZW4oJmxpbmVidWZbaWR4XSk7CisJCWlkeCArPSBsZW47CisJCWlmIChsZW4gIT0gMHhmZiB8fCBsaW5lYnVmW2lkeCAtIDFdID09ICdcbicpCisJCQlicmVhazsKKwl9CisJKnNpemVwID0gaWR4OworCWlmIChpZHgpIHsKKwkJLyogeHJlYWxsb2MobGluZWJ1ZiwgaWR4ICsgMSkgaXMgdXAgdG8gY2FsbGVyICovCisJCXJldHVybiBsaW5lYnVmOworCX0KKwlmcmVlKGxpbmVidWYpOworCXJldHVybiBOVUxMOworfQorCisvKiBHZXQgbGluZSwgcmVtb3ZlIHRyYWlsaW5nIFxuICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0bGluZV9mYXN0KEZJTEUgKmZpbGUpCit7CisJaW50IHN6OworCWNoYXIgKnIgPSB4bWFsbG9jX2ZnZXRzX2ludGVybmFsKGZpbGUsICZzeik7CisJaWYgKHIgJiYgcltzeiAtIDFdID09ICdcbicpCisJCXJbLS1zel0gPSAnXDAnOworCXJldHVybiByOyAvKiBub3QgeHJlYWxsb2Mociwgc3ogKyAxKSEgKi8KK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldHMoRklMRSAqZmlsZSkKK3sKKwlpbnQgc3o7CisJcmV0dXJuIHhtYWxsb2NfZmdldHNfaW50ZXJuYWwoZmlsZSwgJnN6KTsKK30KKworLyogR2V0IGxpbmUsIHJlbW92ZSB0cmFpbGluZyBcbiAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldGxpbmUoRklMRSAqZmlsZSkKK3sKKwlpbnQgc3o7CisJY2hhciAqciA9IHhtYWxsb2NfZmdldHNfaW50ZXJuYWwoZmlsZSwgJnN6KTsKKwlpZiAoIXIpCisJCXJldHVybiByOworCWlmIChyW3N6IC0gMV0gPT0gJ1xuJykKKwkJclstLXN6XSA9ICdcMCc7CisJcmV0dXJuIHhyZWFsbG9jKHIsIHN6ICsgMSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldF9zaGVsbF9uYW1lLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9nZXRfc2hlbGxfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzBhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9nZXRfc2hlbGxfbmFtZS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSwgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi15ICs9IGdldF9zaGVsbF9uYW1lLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NvbnN0IGNoYXIgKmdldF9zaGVsbF9uYW1lKHZvaWQpCit7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJY2hhciAqc2hlbGw7CisKKwlzaGVsbCA9IGdldGVudigiU0hFTEwiKTsKKwlpZiAoc2hlbGwgJiYgc2hlbGxbMF0pCisJCXJldHVybiBzaGVsbDsKKworCXB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCWlmIChwdyAmJiBwdy0+cHdfc2hlbGwgJiYgcHctPnB3X3NoZWxsWzBdKQorCQlyZXR1cm4gcHctPnB3X3NoZWxsOworCisJcmV0dXJuIERFRkFVTFRfU0hFTEw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9nZXRfdm9sc2l6ZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0X3ZvbHNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDFjZWRhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0X3ZvbHNpemUuYwpAQCAtMCwwICsxLDQ4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCit1b2ZmX3QgRkFTVF9GVU5DIGdldF92b2x1bWVfc2l6ZV9pbl9ieXRlcyhpbnQgZmQsCisJCWNvbnN0IGNoYXIgKm92ZXJyaWRlLAorCQl1bnNpZ25lZCBvdmVycmlkZV91bml0cywKKwkJaW50IGV4dGVuZCkKK3sKKwl1b2ZmX3QgcmVzdWx0OworCisJaWYgKG92ZXJyaWRlKSB7CisJCXJlc3VsdCA9IFhBVE9PRkYob3ZlcnJpZGUpOworCQlpZiAocmVzdWx0ID49ICh1b2ZmX3QpKE1BWElOVChvZmZfdCkpIC8gb3ZlcnJpZGVfdW5pdHMpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW1hZ2Ugc2l6ZSBpcyB0b28gYmlnIik7CisJCXJlc3VsdCAqPSBvdmVycmlkZV91bml0czsKKwkJLyogc2VlayBwYXN0IGVuZCBmYWlscyBvbiBibG9jayBkZXZpY2VzIGJ1dCB3b3JrcyBvbiBmaWxlcyAqLworCQlpZiAobHNlZWsoZmQsIHJlc3VsdCAtIDEsIFNFRUtfU0VUKSAhPSAob2ZmX3QpLTEpIHsKKwkJCWlmIChleHRlbmQpCisJCQkJeHdyaXRlKGZkLCAiIiwgMSk7IC8qIGZpbGUgZ3Jvd3MgaWYgbmVlZGVkICovCisJCX0KKwkJLy9lbHNlIHsKKwkJLy8JYmJfZXJyb3JfbXNnKCJ3YXJuaW5nLCBibG9jayBkZXZpY2UgaXMgc21hbGxlciIpOworCQkvL30KKwl9IGVsc2UgeworCQkvKiBtb3JlIHBvcnRhYmxlIHRoYW4gQkxLR0VUU0laRVs2NF0gKi8KKwkJcmVzdWx0ID0geGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7CisJfQorCisJeGxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisKKwkvKiBQcmV2ZW50IHRoaW5ncyBsaWtlIHRoaXM6CisJICogJCBkZCBpZj0vZGV2L3plcm8gb2Y9Zm9vIGNvdW50PTEgYnM9MTAyNAorCSAqICQgbWtzd2FwIGZvbworCSAqIFNldHRpbmcgdXAgc3dhcHNwYWNlIHZlcnNpb24gMSwgc2l6ZSA9IDE4NDQ2NzQ0MDczNzA5NTQ4NTQ0IGJ5dGVzCisJICoKKwkgKiBQaWNrZWQgMTZrIGFyYml0cmFyaWx5OiAqLworCWlmIChyZXN1bHQgPCAxNioxMDI0KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW1hZ2UgaXMgdG9vIHNtYWxsIik7CisKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0b3B0MzIuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldG9wdDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlODNkOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2dldG9wdDMyLmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHVuaXZlcnNhbCBnZXRvcHQzMiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1ICBWbGFkaW1pciBPbGV5bmlrICA8ZHpvQHNpbXRyZWFzLnJ1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKyMgaW5jbHVkZSA8Z2V0b3B0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiAgICAgIERvY3VtZW50YXRpb24KKwordWludDMyX3QKK2dldG9wdDMyKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICphcHBsZXRfb3B0cywgLi4uKQorCisgICAgICAgIFRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIGluIGNvbnN0IGNoYXIKKyAgICAgICAgKmFwcGxldF9vcHRzIGFzIGEgc3RyaW5nIG9mIGNoYXJzLCBmb3IgZXhhbXBsZToKKworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJybnVnIik7CisKKyAgICAgICAgSWYgb25lIG9mIHRoZSBnaXZlbiBvcHRpb25zIGlzIGZvdW5kLCBhIGZsYWcgdmFsdWUgaXMgYWRkZWQgdG8KKyAgICAgICAgdGhlIHJldHVybiB2YWx1ZSAoYW4gdW5zaWduZWQgbG9uZykuCisKKyAgICAgICAgVGhlIGZsYWcgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXIgaW4KKyAgICAgICAgYXBwbGV0X29wdHMgc3RyaW5nLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBhYm92ZSBjYXNlOgorCisgICAgICAgIGZsYWdzID0gZ2V0b3B0MzIoYXJndiwgInJudWciKTsKKworICAgICAgICAiciIgd2lsbCBhZGQgMSAgICAoYml0IDApCisgICAgICAgICJuIiB3aWxsIGFkZCAyICAgIChiaXQgMSkKKyAgICAgICAgInUiIHdpbGwgYWRkIDQgICAgKGJpdCAyKQorICAgICAgICAiZyIgd2lsbCBhZGQgOCAgICAoYml0IDMpCisKKyAgICAgICAgYW5kIHNvIG9uLiAgWW91IGNhbiBhbHNvIGxvb2sgYXQgdGhlIHJldHVybiB2YWx1ZSBhcyBhIGJpdAorICAgICAgICBmaWVsZCBhbmQgZWFjaCBvcHRpb24gc2V0cyBvbmUgYml0LgorCisgICAgICAgIE9uIGV4aXQsIGdsb2JhbCB2YXJpYWJsZSBvcHRpbmQgaXMgc2V0IHNvIHRoYXQgaWYgeW91CisgICAgICAgIHdpbGwgZG8gYXJnYyAtPSBvcHRpbmQ7IGFyZ3YgKz0gb3B0aW5kOyB0aGVuCisgICAgICAgIGFyZ2Mgd2lsbCBiZSBlcXVhbCB0byBudW1iZXIgb2YgcmVtYWluaW5nIG5vbi1vcHRpb24KKyAgICAgICAgYXJndW1lbnRzLCBmaXJzdCBvbmUgd291bGQgYmUgaW4gYXJndlswXSwgbmV4dCBpbiBhcmd2WzFdIGFuZCBzbyBvbgorICAgICAgICAob3B0aW9ucyBhbmQgdGhlaXIgcGFyYW1ldGVycyB3aWxsIGJlIG1vdmVkIGludG8gYXJndltdCisgICAgICAgIHBvc2l0aW9ucyBwcmlvciB0byBhcmd2W29wdGluZF0pLgorCisgIjoiICAgIElmIG9uZSBvZiB0aGUgb3B0aW9ucyByZXF1aXJlcyBhbiBhcmd1bWVudCwgdGhlbiBhZGQgYSAiOiIKKyAgICAgICAgYWZ0ZXIgdGhlIGNoYXIgaW4gYXBwbGV0X29wdHMgYW5kIHByb3ZpZGUgYSBwb2ludGVyIHRvIHN0b3JlCisgICAgICAgIHRoZSBhcmd1bWVudC4gIEZvciBleGFtcGxlOgorCisgICAgICAgIGNoYXIgKnBvaW50ZXJfdG9fYXJnX2Zvcl9hOworICAgICAgICBjaGFyICpwb2ludGVyX3RvX2FyZ19mb3JfYjsKKyAgICAgICAgY2hhciAqcG9pbnRlcl90b19hcmdfZm9yX2M7CisgICAgICAgIGNoYXIgKnBvaW50ZXJfdG9fYXJnX2Zvcl9kOworCisgICAgICAgIGZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImE6YjpjOmQ6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyX3RvX2FyZ19mb3JfYSwgJnBvaW50ZXJfdG9fYXJnX2Zvcl9iLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50ZXJfdG9fYXJnX2Zvcl9jLCAmcG9pbnRlcl90b19hcmdfZm9yX2QpOworCisgICAgICAgIFRoZSB0eXBlIG9mIHRoZSBwb2ludGVyIChjaGFyKiBvciBsbGlzdF90KikgbWF5IGJlIGNvbnRyb2xsZWQKKyAgICAgICAgYnkgdGhlICI6OiIgc3BlY2lhbCBzZXBhcmF0b3IgdGhhdCBpcyBzZXQgaW4gdGhlIGV4dGVybmFsIHN0cmluZworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSAoc2VlIGJlbG93IGZvciBtb3JlIGluZm8pLgorCisgIjo6IiAgIElmIG9wdGlvbiBjYW4gaGF2ZSBhbiAqb3B0aW9uYWwqIGFyZ3VtZW50LCB0aGVuIGFkZCBhICI6OiIKKyAgICAgICAgYWZ0ZXIgaXRzIGNoYXIgaW4gYXBwbGV0X29wdHMgYW5kIHByb3ZpZGUgYSBwb2ludGVyIHRvIHN0b3JlCisgICAgICAgIHRoZSBhcmd1bWVudC4gIE5vdGUgdGhhdCBvcHRpb25hbCBhcmd1bWVudHMgX211c3RfCisgICAgICAgIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgb3B0aW9uOiAtb3BhcmFtLCBub3QgLW8gcGFyYW0uCisKKyAiKyIgICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgYXBwbGV0X29wdHMgc3RyaW5nIGlzIGEgcGx1cywKKyAgICAgICAgdGhlbiBvcHRpb24gcHJvY2Vzc2luZyB3aWxsIHN0b3AgYXMgc29vbiBhcyBhIG5vbi1vcHRpb24gaXMKKyAgICAgICAgZW5jb3VudGVyZWQgaW4gdGhlIGFyZ3YgYXJyYXkuICBVc2VmdWwgZm9yIGFwcGxldHMgbGlrZSBlbnYKKyAgICAgICAgd2hpY2ggc2hvdWxkIG5vdCBwcm9jZXNzIGFyZ3VtZW50cyB0byBzdWJwcm9ncmFtczoKKyAgICAgICAgZW52IC1pIGxzIC1kIC8KKyAgICAgICAgSGVyZSB3ZSB3YW50IGVudiB0byBwcm9jZXNzIGp1c3QgdGhlICctaScsIG5vdCB0aGUgJy1kJy4KKworICIhIiAgICBSZXBvcnQgYmFkIG9wdGlvbiwgbWlzc2luZyByZXF1aXJlZCBvcHRpb25zLAorICAgICAgICBpbmNvbnNpc3RlbnQgb3B0aW9ucyB3aXRoIGFsbC1vbmVzIHJldHVybiB2YWx1ZSAoaW5zdGVhZCBvZiBhYm9ydCkuCisKK2NvbnN0IGNoYXIgKmFwcGxldF9sb25nX29wdGlvbnMKKworICAgICAgICBUaGlzIHN0cnVjdCBhbGxvd3MgeW91IHRvIGRlZmluZSBsb25nIG9wdGlvbnM6CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgYXBwbGV0X2xvbmdvcHRzW10gQUxJR04xID0KKyAgICAgICAgICAgICAgICAvLyJuYW1lXDAiIGhhc19hcmcgdmFsCisgICAgICAgICAgICAgICAgInZlcmJvc2VcMCIgTm9fYXJndW1lbnQgInYiCisgICAgICAgICAgICAgICAgOworICAgICAgICBhcHBsZXRfbG9uZ19vcHRpb25zID0gYXBwbGV0X2xvbmdvcHRzOworCisgICAgICAgIFRoZSBsYXN0IG1lbWJlciBvZiBzdHJ1Y3Qgb3B0aW9uICh2YWwpIHR5cGljYWxseSBpcyBzZXQgdG8KKyAgICAgICAgbWF0Y2hpbmcgc2hvcnQgb3B0aW9uIGZyb20gYXBwbGV0X29wdHMuIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nCisgICAgICAgIGNoYXIgaW4gYXBwbGV0X29wdHMsIHRoZW46CisgICAgICAgIC0gcmV0dXJuIGJpdCBoYXZlIG5leHQgcG9zaXRpb24gYWZ0ZXIgc2hvcnQgb3B0aW9ucworICAgICAgICAtIGlmIGhhc19hcmcgaXMgbm90ICJOb19hcmd1bWVudCIsIHVzZSBwdHIgZm9yIGFyZyBhbHNvCisgICAgICAgIC0gb3B0X2NvbXBsZW1lbnRhcnkgYWZmZWN0cyBpdCB0b28KKworICAgICAgICBOb3RlOiBhIGdvb2QgYXBwbGV0IHdpbGwgbWFrZSBsb25nIG9wdGlvbnMgY29uZmlndXJhYmxlIHZpYSB0aGUKKyAgICAgICAgY29uZmlnIHByb2Nlc3MgYW5kIG5vdCBhIHJlcXVpcmVkIGZlYXR1cmUuICBUaGUgY3VycmVudCBzdGFuZGFyZAorICAgICAgICBpcyB0byBuYW1lIHRoZSBjb25maWcgb3B0aW9uIENPTkZJR19GRUFUVVJFXzxhcHBsZXQ+X0xPTkdfT1BUSU9OUy4KKworY29uc3QgY2hhciAqb3B0X2NvbXBsZW1lbnRhcnkKKworICI6IiAgICBUaGUgY29sb24gKCI6IikgaXMgdXNlZCB0byBzZXBhcmF0ZSBncm91cHMgb2YgdHdvIG9yIG1vcmUgY2hhcnMKKyAgICAgICAgYW5kL29yIGdyb3VwcyBvZiBjaGFycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzIChzdGF0aW5nIHNvbWUKKyAgICAgICAgY29uZGl0aW9ucyB0byBiZSBjaGVja2VkKS4KKworICJhYmMiICBJZiBncm91cHMgb2YgdHdvIG9yIG1vcmUgY2hhcnMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IGNoYXIKKyAgICAgICAgaXMgdGhlIG1haW4gb3B0aW9uIGFuZCB0aGUgb3RoZXIgY2hhcnMgYXJlIHNlY29uZGFyeSBvcHRpb25zLgorICAgICAgICBUaGVpciBmbGFncyB3aWxsIGJlIHR1cm5lZCBvbiBpZiB0aGUgbWFpbiBvcHRpb24gaXMgZm91bmQgZXZlbgorICAgICAgICBpZiB0aGV5IGFyZSBub3Qgc3BlY2lmZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgorCisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gImFiYyI7CisgICAgICAgIGZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImFiY2QiKQorCisgICAgICAgIElmIGdldG9wdCgpIGZpbmRzICItYSIgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlbgorICAgICAgICBnZXRvcHQzMidzIHJldHVybiB2YWx1ZSB3aWxsIGJlIGFzIGlmICItYSAtYiAtYyIgd2VyZQorICAgICAgICBmb3VuZC4KKworICJ3dyIgICBBZGphY2VudCBkb3VibGUgb3B0aW9ucyBoYXZlIGEgY291bnRlciBhc3NvY2lhdGVkIHdoaWNoIGluZGljYXRlcworICAgICAgICB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBvcHRpb24uCisgICAgICAgIEZvciBleGFtcGxlIHRoZSBwcyBhcHBsZXQgbmVlZHM6CisgICAgICAgIGlmIHcgaXMgZ2l2ZW4gb25jZSwgR05VIHBzIHNldHMgdGhlIHdpZHRoIHRvIDEzMiwKKyAgICAgICAgaWYgdyBpcyBnaXZlbiBtb3JlIHRoYW4gb25jZSwgaXQgaXMgInVubGltaXRlZCIKKworICAgICAgICBpbnQgd19jb3VudGVyID0gMDsgLy8gbXVzdCBiZSBpbml0aWFsaXplZCEKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAid3ciOworICAgICAgICBnZXRvcHQzMihhcmd2LCAidyIsICZ3X2NvdW50ZXIpOworICAgICAgICBpZiAod19jb3VudGVyKQorICAgICAgICAgICAgICAgIHdpZHRoID0gKHdfY291bnRlciA9PSAxKSA/IDEzMiA6IElOVF9NQVg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZXRfdGVybWluYWxfd2lkdGgoLi4uJndpZHRoLi4uKTsKKworICAgICAgICB3X2NvdW50ZXIgaXMgYSBwb2ludGVyIHRvIGFuIGludGVnZXIuIEl0IGhhcyB0byBiZSBwYXNzZWQgdG8KKyAgICAgICAgZ2V0b3B0MzIoKSBhZnRlciBhbGwgb3RoZXIgb3B0aW9uIGFyZ3VtZW50IHNpbmtzLgorCisgICAgICAgIEZvciBleGFtcGxlOiBhY2NlcHQgbXVsdGlwbGUgLXYgdG8gaW5kaWNhdGUgdGhlIGxldmVsIG9mIHZlcmJvc2l0eQorICAgICAgICBhbmQgZm9yIGVhY2ggLWIgb3B0YXJnLCBhZGQgb3B0YXJnIHRvIG15X2IuIEZpbmFsbHksIGlmIGIgaXMgZ2l2ZW4sCisgICAgICAgIHR1cm4gb2ZmIGMgYW5kIHZpY2UgdmVyc2E6CisKKyAgICAgICAgbGxpc3RfdCAqbXlfYiA9IE5VTEw7CisgICAgICAgIGludCB2ZXJib3NlX2xldmVsID0gMDsKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAidnY6Yjo6Yi1jOmMtYiI7CisgICAgICAgIGYgPSBnZXRvcHQzMihhcmd2LCAidmI6YyIsICZteV9iLCAmdmVyYm9zZV9sZXZlbCk7CisgICAgICAgIGlmIChmICYgMikgICAgICAgLy8gLWMgYWZ0ZXIgLWIgdW5zZXRzIC1iIGZsYWcKKyAgICAgICAgICAgICAgICB3aGlsZSAobXlfYikgZG9zb21ldGhpbmdfd2l0aChsbGlzdF9wb3AoJm15X2IpKTsKKyAgICAgICAgaWYgKG15X2IpICAgICAgICAvLyBidXQgbGxpc3QgaXMgc3RvcmVkIGlmIC1iIGlzIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIGZyZWVfbGxpc3QobXlfYik7CisgICAgICAgIGlmICh2ZXJib3NlX2xldmVsKSBwcmludGYoInZlcmJvc2UgbGV2ZWwgaXMgJWRcbiIsIHZlcmJvc2VfbGV2ZWwpOworCitTcGVjaWFsIGNoYXJhY3RlcnM6CisKKyAiLSIgICAgQSBncm91cCBjb25zaXN0aW5nIG9mIGp1c3QgYSBkYXNoIGZvcmNlcyBhbGwgYXJndW1lbnRzCisgICAgICAgIHRvIGJlIHRyZWF0ZWQgYXMgb3B0aW9ucywgZXZlbiBpZiB0aGV5IGhhdmUgbm8gbGVhZGluZyBkYXNoZXMuCisgICAgICAgIE5leHQgY2hhciBpbiB0aGlzIGNhc2UgY2FuJ3QgYmUgYSBkaWdpdCAoMC05KSwgdXNlICc6JyBvciBlbmQgb2YgbGluZS4KKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICItOncteDp4LXciOyAvLyAiLXcteDp4LXciIHdvdWxkIGFsc28gd29yaywKKyAgICAgICAgZ2V0b3B0MzIoYXJndiwgInd4Iik7ICAgICAgICAgICAgLy8gYnV0IGlzIGxlc3MgcmVhZGFibGUKKworICAgICAgICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBvcHRpb25zIHdpdGhvdXQgYSBkYXNoICguL3Byb2dyYW0gdyB4KQorICAgICAgICBhcyB3ZWxsIGFzIHdpdGggYSBkYXNoICguL3Byb2dyYW0gLXgpLgorCisgICAgICAgIE5COiBnZXRvcHQzMigpIHdpbGwgbGVhayBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgaWYgeW91IHVzZQorICAgICAgICB0aGlzIG9wdGlvbiEgRG8gbm90IHVzZSBpdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mIHJlY3Vyc2l2ZQorICAgICAgICBnZXRvcHQzMigpIGNhbGxzLgorCisgIi0tIiAgIEEgZG91YmxlIGRhc2ggYXQgdGhlIGJlZ2lubmluZyBvZiBvcHRfY29tcGxlbWVudGFyeSBtZWFucyB0aGUKKyAgICAgICAgYXJndlsxXSBzdHJpbmcgc2hvdWxkIGFsd2F5cyBiZSB0cmVhdGVkIGFzIG9wdGlvbnMsIGV2ZW4gaWYgaXQgaXNuJ3QKKyAgICAgICAgcHJlZml4ZWQgd2l0aCBhICItIi4gIFRoaXMgaXMgdXNlZnVsIGZvciBzcGVjaWFsIHN5bnRheCBpbiBhcHBsZXRzCisgICAgICAgIHN1Y2ggYXMgImFyIiBhbmQgInRhciI6CisgICAgICAgIHRhciB4dmYgZm9vLnRhcgorCisgICAgICAgIE5COiBnZXRvcHQzMigpIHdpbGwgbGVhayBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgaWYgeW91IHVzZQorICAgICAgICB0aGlzIG9wdGlvbiEgRG8gbm90IHVzZSBpdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mIHJlY3Vyc2l2ZQorICAgICAgICBnZXRvcHQzMigpIGNhbGxzLgorCisgIi1OIiAgIEEgZGFzaCBhcyB0aGUgZmlyc3QgY2hhciBpbiBhIG9wdF9jb21wbGVtZW50YXJ5IGdyb3VwIGZvbGxvd2VkCisgICAgICAgIGJ5IGEgc2luZ2xlIGRpZ2l0ICgwLTkpIG1lYW5zIHRoYXQgYXQgbGVhc3QgTiBub24tb3B0aW9uCisgICAgICAgIGFyZ3VtZW50cyBtdXN0IGJlIHByZXNlbnQgb24gdGhlIGNvbW1hbmQgbGluZQorCisgIj1OIiAgIEFuIGVxdWFsIHNpZ24gYXMgdGhlIGZpcnN0IGNoYXIgaW4gYSBvcHRfY29tcGxlbWVudGFyeSBncm91cCBmb2xsb3dlZAorICAgICAgICBieSBhIHNpbmdsZSBkaWdpdCAoMC05KSBtZWFucyB0aGF0IGV4YWN0bHkgTiBub24tb3B0aW9uCisgICAgICAgIGFyZ3VtZW50cyBtdXN0IGJlIHByZXNlbnQgb24gdGhlIGNvbW1hbmQgbGluZQorCisgIj9OIiAgIEEgIj8iIGFzIHRoZSBmaXJzdCBjaGFyIGluIGEgb3B0X2NvbXBsZW1lbnRhcnkgZ3JvdXAgZm9sbG93ZWQKKyAgICAgICAgYnkgYSBzaW5nbGUgZGlnaXQgKDAtOSkgbWVhbnMgdGhhdCBhdCBtb3N0IE4gYXJndW1lbnRzIG11c3QgYmUgcHJlc2VudAorICAgICAgICBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisgIlYtIiAgIEFuIG9wdGlvbiB3aXRoIGRhc2ggYmVmb3JlIGNvbG9uIG9yIGVuZC1vZi1saW5lIHJlc3VsdHMgaW4KKyAgICAgICAgYmJfc2hvd191c2FnZSgpIGJlaW5nIGNhbGxlZCBpZiB0aGlzIG9wdGlvbiBpcyBlbmNvdW50ZXJlZC4KKyAgICAgICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byBpbXBsZW1lbnQgInByaW50IHZlcmJvc2UgdXNhZ2UgbWVzc2FnZQorICAgICAgICBhbmQgZXhpdCIgb3B0aW9uLgorCisgImEtYiIgIEEgZGFzaCBiZXR3ZWVuIHR3byBvcHRpb25zIGNhdXNlcyB0aGUgc2Vjb25kIG9mIHRoZSB0d28KKyAgICAgICAgdG8gYmUgdW5zZXQgKGFuZCBpZ25vcmVkKSBpZiBpdCBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisgICAgICAgIFtGSVhNRTogd2hhdCBpZiB0aGV5IGFyZSB0aGUgc2FtZT8gbGlrZSAieC14Ij8gSXMgaXQgZXZlciB1c2VmdWw/XQorCisgICAgICAgIEZvciBleGFtcGxlOgorICAgICAgICBUaGUgZHUgYXBwbGV0IGhhcyB0aGUgb3B0aW9ucyAiLXMiIGFuZCAiLWQgZGVwdGgiLiAgSWYKKyAgICAgICAgZ2V0b3B0MzIgZmluZHMgLXMsIHRoZW4gLWQgaXMgdW5zZXQgb3IgaWYgaXQgZmluZHMgLWQKKyAgICAgICAgdGhlbiAtcyBpcyB1bnNldC4gIChOb3RlOiAgYnVzeWJveCBpbXBsZW1lbnRzIHRoZSBHTlUKKyAgICAgICAgIi0tbWF4LWRlcHRoIiBvcHRpb24gYXMgIi1kIi4pICBUbyBvYnRhaW4gdGhpcyBiZWhhdmlvciwgeW91CisgICAgICAgIHNldCBvcHRfY29tcGxlbWVudGFyeSA9ICJzLWQ6ZC1zIi4gIE9ubHkgb25lIGZsYWcgdmFsdWUgaXMKKyAgICAgICAgYWRkZWQgdG8gZ2V0b3B0MzIncyByZXR1cm4gdmFsdWUgZGVwZW5kaW5nIG9uIHRoZQorICAgICAgICBwb3NpdGlvbiBvZiB0aGUgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYgb25lIG9mIHRoZQorICAgICAgICB0d28gb3B0aW9ucyByZXF1aXJlcyBhbiBhcmd1bWVudCBwb2ludGVyICgiOiIgaW4gYXBwbGV0X29wdHMKKyAgICAgICAgYXMgaW4gImQ6Iikgb3B0YXJnIGlzIHNldCBhY2NvcmRpbmdseS4KKworICAgICAgICBjaGFyICpzbWF4X3ByaW50X2RlcHRoOworCisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gInMtZDpkLXM6eC14IjsKKyAgICAgICAgb3B0ID0gZ2V0b3B0MzIoYXJndiwgInNkOngiLCAmc21heF9wcmludF9kZXB0aCk7CisKKyAgICAgICAgaWYgKG9wdCAmIDIpCisgICAgICAgICAgICAgICAgbWF4X3ByaW50X2RlcHRoID0gYXRvaShzbWF4X3ByaW50X2RlcHRoKTsKKyAgICAgICAgaWYgKG9wdCAmIDQpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJEZXRlY3RlZCBvZGQgLXggdXNhZ2VcbiIpOworCisgImEtLWIiIEEgZG91YmxlIGRhc2ggYmV0d2VlbiB0d28gb3B0aW9ucywgb3IgYmV0d2VlbiBhbiBvcHRpb24gYW5kIGEgZ3JvdXAKKyAgICAgICAgb2Ygb3B0aW9ucywgbWVhbnMgdGhhdCB0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBVbmxpa2UKKyAgICAgICAgdGhlICItIiBjYXNlIGFib3ZlLCBhbiBlcnJvciB3aWxsIGJlIGZvcmNlZCBpZiB0aGUgb3B0aW9ucworICAgICAgICBhcmUgdXNlZCB0b2dldGhlci4KKworICAgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICAgVGhlIGN1dCBhcHBsZXQgbXVzdCBoYXZlIG9ubHkgb25lIHR5cGUgb2YgbGlzdCBzcGVjaWZpZWQsIHNvCisgICAgICAgIC1iLCAtYyBhbmQgLWYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBhbmQgc2hvdWxkIHJhaXNlIGFuIGVycm9yCisgICAgICAgIGlmIHNwZWNpZmllZCB0b2dldGhlci4gIEluIHRoaXMgY2FzZSB5b3UgbXVzdCBzZXQKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAiYi0tY2Y6Yy0tYmY6Zi0tYmMiLiAgSWYgdHdvIG9mIHRoZQorICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUgb3B0aW9ucyBhcmUgZm91bmQsIGdldG9wdDMyIHdpbGwgY2FsbAorICAgICAgICBiYl9zaG93X3VzYWdlKCkgYW5kIGRpZS4KKworICJ4LS14IiBWYXJpYXRpb24gb2YgdGhlIGFib3ZlLCBpdCBtZWFucyB0aGF0IC14IG9wdGlvbiBzaG91bGQgb2NjdXIKKyAgICAgICAgYXQgbW9zdCBvbmNlLgorCisgImErIiAgIEEgcGx1cyBhZnRlciBhIGNoYXIgaW4gb3B0X2NvbXBsZW1lbnRhcnkgbWVhbnMgdGhhdCB0aGUgcGFyYW1ldGVyCisgICAgICAgIGZvciB0aGlzIG9wdGlvbiBpcyBhIG5vbm5lZ2F0aXZlIGludGVnZXIuIEl0IHdpbGwgYmUgcHJvY2Vzc2VkCisgICAgICAgIHdpdGggeGF0b2lfcG9zaXRpdmUoKSAtIGFsbG93ZWQgcmFuZ2UgaXMgMC4uSU5UX01BWC4KKworICAgICAgICBpbnQgcGFyYW07ICAvLyAidW5zaWduZWQgcGFyYW07IiB3aWxsIGFsc28gd29yaworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJwKyI7CisgICAgICAgIGdldG9wdDMyKGFyZ3YsICJwOiIsICZwYXJhbSk7CisKKyAiYTo6IiAgQSBkb3VibGUgY29sb24gYWZ0ZXIgYSBjaGFyIGluIG9wdF9jb21wbGVtZW50YXJ5IG1lYW5zIHRoYXQgdGhlCisgICAgICAgIG9wdGlvbiBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMuIEVhY2ggb2NjdXJyZW5jZSB3aWxsIGJlIHNhdmVkIGFzCisgICAgICAgIGEgbGxpc3RfdCBlbGVtZW50IGluc3RlYWQgb2YgY2hhciouCisKKyAgICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgIFRoZSBncmVwIGFwcGxldCBjYW4gaGF2ZSBvbmUgb3IgbW9yZSAiLWUgcGF0dGVybiIgYXJndW1lbnRzLgorICAgICAgICBJbiB0aGlzIGNhc2UgeW91IHNob3VsZCB1c2UgZ2V0b3B0MzIoKSBhcyBmb2xsb3dzOgorCisgICAgICAgIGxsaXN0X3QgKnBhdHRlcm5zID0gTlVMTDsKKworICAgICAgICAodGhpcyBwb2ludGVyIG11c3QgYmUgaW5pdGlhbGl6YXRlZCB0byBOVUxMIGlmIHRoZSBsaXN0IGlzIGVtcHR5CisgICAgICAgIGFzIHJlcXVpcmVkIGJ5IGxsaXN0X2FkZF90b19lbmQobGxpc3RfdCAqKm9sZF9oZWFkLCBjaGFyICpuZXdfaXRlbSkuKQorCisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gImU6OiI7CisKKyAgICAgICAgZ2V0b3B0MzIoYXJndiwgImU6IiwgJnBhdHRlcm5zKTsKKyAgICAgICAgJCBncmVwIC1lIHVzZXIgLWUgcm9vdCAvZXRjL3Bhc3N3ZAorICAgICAgICByb290Ong6MDowOnJvb3Q6L3Jvb3Q6L2Jpbi9iYXNoCisgICAgICAgIHVzZXI6eDo1MDA6NTAwOjovaG9tZS91c2VyOi9iaW4vYmFzaAorCisgImE/YiIgIEEgIj8iIGJldHdlZW4gYW4gb3B0aW9uIGFuZCBhIGdyb3VwIG9mIG9wdGlvbnMgbWVhbnMgdGhhdAorICAgICAgICBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyByZXF1aXJlZCB0byBvY2N1ciBpZiB0aGUgZmlyc3Qgb3B0aW9uCisgICAgICAgIG9jY3VycyBpbiBwcmVjZWRpbmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKworICAgICAgICBGb3IgZXhhbXBsZSBmcm9tICJpZCIgYXBwbGV0OgorCisgICAgICAgIC8vIERvbid0IGFsbG93IC1uIC1yIC1ybiAtdWcgLXJ1ZyAtbnVnIC1ybnVnCisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gInI/dWc6bj91Zzp1LS1nOmctLXUiOworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJybnVnIik7CisKKyAgICAgICAgVGhpcyBleGFtcGxlIGFsbG93ZWQgb25seToKKyAgICAgICAgJCBpZDsgaWQgLXU7IGlkIC1nOyBpZCAtcnU7IGlkIC1udTsgaWQgLXJnOyBpZCAtbmc7IGlkIC1ybnU7IGlkIC1ybmcKKworICJYIiAgICBBIG9wdF9jb21wbGVtZW50YXJ5IGdyb3VwIHdpdGgganVzdCBhIHNpbmdsZSBsZXR0ZXIgbWVhbnMKKyAgICAgICAgdGhhdCB0aGlzIG9wdGlvbiBpcyByZXF1aXJlZC4gSWYgbW9yZSB0aGFuIG9uZSBzdWNoIGdyb3VwIGV4aXN0cywKKyAgICAgICAgYXQgbGVhc3Qgb25lIG9wdGlvbiBpcyByZXF1aXJlZCB0byBvY2N1ciAobm90IGFsbCBvZiB0aGVtKS4KKyAgICAgICAgRm9yIGV4YW1wbGUgZnJvbSAic3RhcnQtc3RvcC1kYWVtb24iIGFwcGxldDoKKworICAgICAgICAvLyBEb24ndCBhbGxvdyAtS1MgLVNLLCBidXQgLVMgb3IgLUsgaXMgcmVxdWlyZWQKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAiSzpTOkstLVM6Uy0tSyI7CisgICAgICAgIGZsYWdzID0gZ2V0b3B0MzIoYXJndiwgIktTLi4uKTsKKworCisgICAgICAgIERvbid0IGZvcmdldCB0byB1c2UgJzonLiBGb3IgZXhhbXBsZSwgIj8zMjItMjItMjNYLXgtYSIKKyAgICAgICAgaXMgaW50ZXJwcmV0ZWQgYXMgIj8zOjIyOi0yOjItMjoyLTNYYToyLS14IiAtCisgICAgICAgIG1heCAzIGFyZ3M7IGNvdW50IHVzZXMgb2YgJy0yJzsgbWluIDIgYXJnczsgaWYgdGhlcmUgaXMKKyAgICAgICAgYSAnLTInIG9wdGlvbiB0aGVuIHVuc2V0ICctMycsICctWCcgYW5kICctYSc7IGlmIHRoZXJlIGlzCisgICAgICAgIGEgJy0yJyBhbmQgYWZ0ZXIgaXQgYSAnLXgnIHRoZW4gZXJyb3Igb3V0LgorICAgICAgICBCdXQgaXQncyBmYXIgdG9vIG9iZnVzY2F0ZWQuIFVzZSAnOicgdG8gc2VwYXJhdGUgZ3JvdXBzLgorKi8KKworLyogQ29kZSBoZXJlIGFzc3VtZXMgdGhhdCAndW5zaWduZWQnIGlzIGF0IGxlYXN0IDMyIGJpdHMgd2lkZSAqLworCitjb25zdCBjaGFyICpjb25zdCBiYl9hcmd2X2Rhc2hbXSA9IHsgIi0iLCBOVUxMIH07CisKK2NvbnN0IGNoYXIgKm9wdF9jb21wbGVtZW50YXJ5OworCitlbnVtIHsKKwlQQVJBTV9TVFJJTkcsCisJUEFSQU1fTElTVCwKKwlQQVJBTV9JTlQsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBvcHRfY2hhcjsKKwlzbWFsbGludCBwYXJhbV90eXBlOworCXVuc2lnbmVkIHN3aXRjaF9vbjsKKwl1bnNpZ25lZCBzd2l0Y2hfb2ZmOworCXVuc2lnbmVkIGluY29uZ3J1b3VzbHk7CisJdW5zaWduZWQgcmVxdWlyZXM7CisJdm9pZCAqKm9wdGFyZzsgIC8qIGNoYXIqKiwgbGxpc3RfdCoqIG9yIGludCAqLiAqLworCWludCAqY291bnRlcjsKK30gdF9jb21wbGVtZW50YXJ5OworCisvKiBZb3UgY2FuIHNldCBhcHBsZXRfbG9uZ19vcHRpb25zIGZvciBwYXJzZSBjYWxsZWQgbG9uZyBvcHRpb25zICovCisjaWYgRU5BQkxFX0xPTkdfT1BUUyB8fCBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gYmJfbnVsbF9sb25nX29wdGlvbnNbMV0gPSB7CisJeyAwLCAwLCAwLCAwIH0KK307Citjb25zdCBjaGFyICphcHBsZXRfbG9uZ19vcHRpb25zOworI2VuZGlmCisKK3VpbnQzMl90IG9wdGlvbl9tYXNrMzI7CisKK3VpbnQzMl90IEZBU1RfRlVOQworZ2V0b3B0MzIoY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKmFwcGxldF9vcHRzLCAuLi4pCit7CisJaW50IGFyZ2M7CisJdW5zaWduZWQgZmxhZ3MgPSAwOworCXVuc2lnbmVkIHJlcXVpcmVzID0gMDsKKwl0X2NvbXBsZW1lbnRhcnkgY29tcGxlbWVudGFyeVszM107IC8qIGxhc3Qgc3RheXMgemVyby1maWxsZWQgKi8KKwljaGFyIGZpcnN0X2NoYXI7CisJaW50IGM7CisJY29uc3QgdW5zaWduZWQgY2hhciAqczsKKwl0X2NvbXBsZW1lbnRhcnkgKm9uX29mZjsKKwl2YV9saXN0IHA7CisjaWYgRU5BQkxFX0xPTkdfT1BUUyB8fCBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworCWNvbnN0IHN0cnVjdCBvcHRpb24gKmxfbzsKKwlzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnMgPSAoc3RydWN0IG9wdGlvbiAqKSAmYmJfbnVsbF9sb25nX29wdGlvbnM7CisjZW5kaWYKKwl1bnNpZ25lZCB0cmlnZ2VyOworCWNoYXIgKipwYXJndjsKKwlpbnQgbWluX2FyZyA9IDA7CisJaW50IG1heF9hcmcgPSAtMTsKKworI2RlZmluZSBTSE9XX1VTQUdFX0lGX0VSUk9SICAgICAxCisjZGVmaW5lIEFMTF9BUkdWX0lTX09QVFMgICAgICAgIDIKKyNkZWZpbmUgRklSU1RfQVJHVl9JU19PUFQgICAgICAgNAorCisJaW50IHNwZWNfZmxncyA9IDA7CisKKwkvKiBza2lwIDA6IHNvbWUgYXBwbGV0cyBjaGVhdDogdGhleSBkbyBub3QgYWN0dWFsbHkgSEFWRSBhcmd2WzBdICovCisJYXJnYyA9IDE7CisJd2hpbGUgKGFyZ3ZbYXJnY10pCisJCWFyZ2MrKzsKKworCXZhX3N0YXJ0KHAsIGFwcGxldF9vcHRzKTsKKworCWMgPSAwOworCW9uX29mZiA9IGNvbXBsZW1lbnRhcnk7CisJbWVtc2V0KG9uX29mZiwgMCwgc2l6ZW9mKGNvbXBsZW1lbnRhcnkpKTsKKworCS8qIHNraXAgYmJveCBleHRlbnNpb24gKi8KKwlmaXJzdF9jaGFyID0gYXBwbGV0X29wdHNbMF07CisJaWYgKGZpcnN0X2NoYXIgPT0gJyEnKQorCQlhcHBsZXRfb3B0cysrOworCisJLyogc2tpcCBHTlUgZXh0ZW5zaW9uICovCisJcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopYXBwbGV0X29wdHM7CisJaWYgKCpzID09ICcrJyB8fCAqcyA9PSAnLScpCisJCXMrKzsKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKGMgPj0gMzIpCisJCQlicmVhazsKKwkJb25fb2ZmLT5vcHRfY2hhciA9ICpzOworCQlvbl9vZmYtPnN3aXRjaF9vbiA9ICgxIDw8IGMpOworCQlpZiAoKisrcyA9PSAnOicpIHsKKwkJCW9uX29mZi0+b3B0YXJnID0gdmFfYXJnKHAsIHZvaWQgKiopOworCQkJd2hpbGUgKCorK3MgPT0gJzonKQorCQkJCWNvbnRpbnVlOworCQl9CisJCW9uX29mZisrOworCQljKys7CisJfQorCisjaWYgRU5BQkxFX0xPTkdfT1BUUyB8fCBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworCWlmIChhcHBsZXRfbG9uZ19vcHRpb25zKSB7CisJCWNvbnN0IGNoYXIgKm9wdHN0cjsKKwkJdW5zaWduZWQgaSwgY291bnQ7CisKKwkJY291bnQgPSAxOworCQlvcHRzdHIgPSBhcHBsZXRfbG9uZ19vcHRpb25zOworCQl3aGlsZSAob3B0c3RyWzBdKSB7CisJCQlvcHRzdHIgKz0gc3RybGVuKG9wdHN0cikgKyAzOyAvKiBza2lwIE5VTCwgaGFzX2FyZywgdmFsICovCisJCQljb3VudCsrOworCQl9CisJCS8qIGNvdW50ID09IG5vLiBvZiBsb25nb3B0cyArIDEgKi8KKwkJbG9uZ19vcHRpb25zID0gYWxsb2NhKGNvdW50ICogc2l6ZW9mKCpsb25nX29wdGlvbnMpKTsKKwkJbWVtc2V0KGxvbmdfb3B0aW9ucywgMCwgY291bnQgKiBzaXplb2YoKmxvbmdfb3B0aW9ucykpOworCQlpID0gMDsKKwkJb3B0c3RyID0gYXBwbGV0X2xvbmdfb3B0aW9uczsKKwkJd2hpbGUgKC0tY291bnQpIHsKKwkJCWxvbmdfb3B0aW9uc1tpXS5uYW1lID0gb3B0c3RyOworCQkJb3B0c3RyICs9IHN0cmxlbihvcHRzdHIpICsgMTsKKwkJCWxvbmdfb3B0aW9uc1tpXS5oYXNfYXJnID0gKHVuc2lnbmVkIGNoYXIpKCpvcHRzdHIrKyk7CisJCQkvKiBsb25nX29wdGlvbnNbaV0uZmxhZyA9IE5VTEw7ICovCisJCQlsb25nX29wdGlvbnNbaV0udmFsID0gKHVuc2lnbmVkIGNoYXIpKCpvcHRzdHIrKyk7CisJCQlpKys7CisJCX0KKwkJZm9yIChsX28gPSBsb25nX29wdGlvbnM7IGxfby0+bmFtZTsgbF9vKyspIHsKKwkJCWlmIChsX28tPmZsYWcpCisJCQkJY29udGludWU7CisJCQlmb3IgKG9uX29mZiA9IGNvbXBsZW1lbnRhcnk7IG9uX29mZi0+b3B0X2NoYXI7IG9uX29mZisrKQorCQkJCWlmIChvbl9vZmYtPm9wdF9jaGFyID09IGxfby0+dmFsKQorCQkJCQlnb3RvIG5leHRfbG9uZzsKKwkJCWlmIChjID49IDMyKQorCQkJCWJyZWFrOworCQkJb25fb2ZmLT5vcHRfY2hhciA9IGxfby0+dmFsOworCQkJb25fb2ZmLT5zd2l0Y2hfb24gPSAoMSA8PCBjKTsKKwkJCWlmIChsX28tPmhhc19hcmcgIT0gbm9fYXJndW1lbnQpCisJCQkJb25fb2ZmLT5vcHRhcmcgPSB2YV9hcmcocCwgdm9pZCAqKik7CisJCQljKys7CisgbmV4dF9sb25nOiA7CisJCX0KKwkJLyogTWFrZSBpdCB1bm5lY2Vzc2FyeSB0byBjbGVhciBhcHBsZXRfbG9uZ19vcHRpb25zCisJCSAqIGJ5IGhhbmQgYWZ0ZXIgZWFjaCBjYWxsIHRvIGdldG9wdDMyCisJCSAqLworCQlhcHBsZXRfbG9uZ19vcHRpb25zID0gTlVMTDsKKwl9CisjZW5kaWYgLyogRU5BQkxFX0xPTkdfT1BUUyB8fCBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORyAqLworCWZvciAocyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopb3B0X2NvbXBsZW1lbnRhcnk7IHMgJiYgKnM7IHMrKykgeworCQl0X2NvbXBsZW1lbnRhcnkgKnBhaXI7CisJCXVuc2lnbmVkICpwYWlyX3N3aXRjaDsKKworCQlpZiAoKnMgPT0gJzonKQorCQkJY29udGludWU7CisJCWMgPSBzWzFdOworCQlpZiAoKnMgPT0gJz8nKSB7CisJCQlpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7CisJCQkJc3BlY19mbGdzIHw9IFNIT1dfVVNBR0VfSUZfRVJST1I7CisJCQl9IGVsc2UgeworCQkJCW1heF9hcmcgPSBjIC0gJzAnOworCQkJCXMrKzsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqcyA9PSAnLScpIHsKKwkJCWlmIChjIDwgJzAnIHx8IGMgPiAnOScpIHsKKwkJCQlpZiAoYyA9PSAnLScpIHsKKwkJCQkJc3BlY19mbGdzIHw9IEZJUlNUX0FSR1ZfSVNfT1BUOworCQkJCQlzKys7CisJCQkJfSBlbHNlCisJCQkJCXNwZWNfZmxncyB8PSBBTExfQVJHVl9JU19PUFRTOworCQkJfSBlbHNlIHsKKwkJCQltaW5fYXJnID0gYyAtICcwJzsKKwkJCQlzKys7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnMgPT0gJz0nKSB7CisJCQltaW5fYXJnID0gbWF4X2FyZyA9IGMgLSAnMCc7CisJCQlzKys7CisJCQljb250aW51ZTsKKwkJfQorCQlmb3IgKG9uX29mZiA9IGNvbXBsZW1lbnRhcnk7IG9uX29mZi0+b3B0X2NoYXI7IG9uX29mZisrKQorCQkJaWYgKG9uX29mZi0+b3B0X2NoYXIgPT0gKnMpCisJCQkJZ290byBmb3VuZF9vcHQ7CisJCS8qIFdpdGhvdXQgdGhpcywgZGlhZ25vc3RpYyBvZiBzdWNoIGJ1Z3MgaXMgbm90IGVhc3kgKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIk5PIE9QVCAlYyEiLCAqcyk7CisgZm91bmRfb3B0OgorCQlpZiAoYyA9PSAnOicgJiYgc1syXSA9PSAnOicpIHsKKwkJCW9uX29mZi0+cGFyYW1fdHlwZSA9IFBBUkFNX0xJU1Q7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnKycgJiYgKHNbMl0gPT0gJzonIHx8IHNbMl0gPT0gJ1wwJykpIHsKKwkJCW9uX29mZi0+cGFyYW1fdHlwZSA9IFBBUkFNX0lOVDsKKwkJCXMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICc6JyB8fCBjID09ICdcMCcpIHsKKwkJCXJlcXVpcmVzIHw9IG9uX29mZi0+c3dpdGNoX29uOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gJy0nICYmIChzWzJdID09ICc6JyB8fCBzWzJdID09ICdcMCcpKSB7CisJCQlmbGFncyB8PSBvbl9vZmYtPnN3aXRjaF9vbjsKKwkJCW9uX29mZi0+aW5jb25ncnVvdXNseSB8PSBvbl9vZmYtPnN3aXRjaF9vbjsKKwkJCXMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICpzKSB7CisJCQlvbl9vZmYtPmNvdW50ZXIgPSB2YV9hcmcocCwgaW50ICopOworCQkJcysrOworCQl9CisJCXBhaXIgPSBvbl9vZmY7CisJCXBhaXJfc3dpdGNoID0gJnBhaXItPnN3aXRjaF9vbjsKKwkJZm9yIChzKys7ICpzICYmICpzICE9ICc6JzsgcysrKSB7CisJCQlpZiAoKnMgPT0gJz8nKSB7CisJCQkJcGFpcl9zd2l0Y2ggPSAmcGFpci0+cmVxdWlyZXM7CisJCQl9IGVsc2UgaWYgKCpzID09ICctJykgeworCQkJCWlmIChwYWlyX3N3aXRjaCA9PSAmcGFpci0+c3dpdGNoX29mZikKKwkJCQkJcGFpcl9zd2l0Y2ggPSAmcGFpci0+aW5jb25ncnVvdXNseTsKKwkJCQllbHNlCisJCQkJCXBhaXJfc3dpdGNoID0gJnBhaXItPnN3aXRjaF9vZmY7CisJCQl9IGVsc2UgeworCQkJCWZvciAob25fb2ZmID0gY29tcGxlbWVudGFyeTsgb25fb2ZmLT5vcHRfY2hhcjsgb25fb2ZmKyspCisJCQkJCWlmIChvbl9vZmYtPm9wdF9jaGFyID09ICpzKSB7CisJCQkJCQkqcGFpcl9zd2l0Y2ggfD0gb25fb2ZmLT5zd2l0Y2hfb247CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJfQorCQl9CisJCXMtLTsKKwl9CisJb3B0X2NvbXBsZW1lbnRhcnkgPSBOVUxMOworCXZhX2VuZChwKTsKKworCWlmIChzcGVjX2ZsZ3MgJiAoRklSU1RfQVJHVl9JU19PUFQgfCBBTExfQVJHVl9JU19PUFRTKSkgeworCQlwYXJndiA9IGFyZ3YgKyAxOworCQl3aGlsZSAoKnBhcmd2KSB7CisJCQlpZiAocGFyZ3ZbMF1bMF0gIT0gJy0nICYmIHBhcmd2WzBdWzBdICE9ICdcMCcpIHsKKwkJCQkvKiBDYW4ndCB1c2UgYWxsb2NhOiBvcHRzIHdpdGggcGFyYW1zIHdpbGwKKwkJCQkgKiByZXR1cm4gcG9pbnRlcnMgdG8gc3RhY2shCisJCQkJICogTkI6IHdlIGxlYWsgdGhlc2UgYWxsb2NhdGlvbnMuLi4gKi8KKwkJCQljaGFyICpwcCA9IHhtYWxsb2Moc3RybGVuKCpwYXJndikgKyAyKTsKKwkJCQkqcHAgPSAnLSc7CisJCQkJc3RyY3B5KHBwICsgMSwgKnBhcmd2KTsKKwkJCQkqcGFyZ3YgPSBwcDsKKwkJCX0KKwkJCWlmICghKHNwZWNfZmxncyAmIEFMTF9BUkdWX0lTX09QVFMpKQorCQkJCWJyZWFrOworCQkJcGFyZ3YrKzsKKwkJfQorCX0KKworCS8qIEluIGNhc2UgZ2V0b3B0MzIgd2FzIGFscmVhZHkgY2FsbGVkOgorCSAqIHJlc2V0IHRoZSBsaWJjIGdldG9wdCgpIGZ1bmN0aW9uLCB3aGljaCBrZWVwcyBpbnRlcm5hbCBzdGF0ZS4KKwkgKiBydW5fbm9mb3JrX2FwcGxldCgpIGRvZXMgdGhpcywgYnV0IHdlIG1pZ2h0IGVuZCB1cCBoZXJlCisJICogYWxzbyB2aWEgZ3VuemlwX21haW4oKSAtPiBnemlwX21haW4oKS4gUGxheSBzYWZlLgorCSAqLworI2lmZGVmIF9fR0xJQkNfXworCW9wdGluZCA9IDA7CisjZWxzZSAvKiBCU0Qgc3R5bGUgKi8KKwlvcHRpbmQgPSAxOworCS8qIG9wdHJlc2V0ID0gMTsgKi8KKyNlbmRpZgorCS8qIG9wdGFyZyA9IE5VTEw7IG9wdGVyciA9IDA7IG9wdG9wdCA9IDA7IC0gZG8gd2UgbmVlZCB0aGlzPz8gKi8KKworCS8qIE5vdGU6IGp1c3QgImdldG9wdCgpIDw9IDAiIHdpbGwgbm90IHdvcmsgd2VsbCBmb3IKKwkgKiAiZmFrZSIgc2hvcnQgb3B0aW9ucywgbGlrZSB0aGlzIG9uZToKKwkgKiB3Z2V0ICQnLVwyMDMnICJUZXN0OiB0ZXN0IiBodHRwOi8va2VybmVsLm9yZy8KKwkgKiAoc3VwcG9zZWQgdG8gYWN0IGFzIC0taGVhZGVyLCBidXQgZG9lc24ndCkgKi8KKyNpZiBFTkFCTEVfTE9OR19PUFRTIHx8IEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgYXBwbGV0X29wdHMsCisJCQlsb25nX29wdGlvbnMsIE5VTEwpKSAhPSAtMSkgeworI2Vsc2UKKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgYXBwbGV0X29wdHMpKSAhPSAtMSkgeworI2VuZGlmCisJCS8qIGdldG9wdCBwcmludHMgIm9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSBYIgorCQkgKiBhbmQgcmV0dXJucyAnPycgaWYgYW4gb3B0aW9uIGhhcyBubyBhcmcsIGJ1dCBvbmUgaXMgcmVxZCAqLworCQljICY9IDB4ZmY7IC8qIGZpZ2h0IGxpYmMncyBzaWduIGV4dGVuc2lvbiAqLworCQlmb3IgKG9uX29mZiA9IGNvbXBsZW1lbnRhcnk7IG9uX29mZi0+b3B0X2NoYXIgIT0gYzsgb25fb2ZmKyspIHsKKwkJCS8qIGMgY2FuIGJlIE5VTCBpZiBsb25nIG9wdCBoYXMgbm9uLU5VTEwgLT5mbGFnLAorCQkJICogYnV0IHdlIGNvbnN0cnVjdCBsb25nIG9wdHMgc28gdGhhdCBmbGFnCisJCQkgKiBpcyBhbHdheXMgTlVMTCAoc2VlIGFib3ZlKSAqLworCQkJaWYgKG9uX29mZi0+b3B0X2NoYXIgPT0gJ1wwJyAvKiAmJiBjICE9ICdcMCcgKi8pIHsKKwkJCQkvKiBjIGlzIHByb2JhYmx5ICc/JyAtICJiYWQgb3B0aW9uIiAqLworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwkJaWYgKGZsYWdzICYgb25fb2ZmLT5pbmNvbmdydW91c2x5KQorCQkJZ290byBlcnJvcjsKKwkJdHJpZ2dlciA9IG9uX29mZi0+c3dpdGNoX29uICYgb25fb2ZmLT5zd2l0Y2hfb2ZmOworCQlmbGFncyAmPSB+KG9uX29mZi0+c3dpdGNoX29mZiBeIHRyaWdnZXIpOworCQlmbGFncyB8PSBvbl9vZmYtPnN3aXRjaF9vbiBeIHRyaWdnZXI7CisJCWZsYWdzIF49IHRyaWdnZXI7CisJCWlmIChvbl9vZmYtPmNvdW50ZXIpCisJCQkoKihvbl9vZmYtPmNvdW50ZXIpKSsrOworCQlpZiAob3B0YXJnKSB7CisJCQlpZiAob25fb2ZmLT5wYXJhbV90eXBlID09IFBBUkFNX0xJU1QpIHsKKwkJCQlsbGlzdF9hZGRfdG9fZW5kKChsbGlzdF90ICoqKShvbl9vZmYtPm9wdGFyZyksIG9wdGFyZyk7CisJCQl9IGVsc2UgaWYgKG9uX29mZi0+cGFyYW1fdHlwZSA9PSBQQVJBTV9JTlQpIHsKKy8vVE9ETzogeGF0b2lfcG9zaXRpdmUgaW5kaXJlY3RseSBwdWxscyBpbiBwcmludGYgbWFjaGluZXJ5CisJCQkJKih1bnNpZ25lZCopKG9uX29mZi0+b3B0YXJnKSA9IHhhdG9pX3Bvc2l0aXZlKG9wdGFyZyk7CisJCQl9IGVsc2UgaWYgKG9uX29mZi0+b3B0YXJnKSB7CisJCQkJKihjaGFyICoqKShvbl9vZmYtPm9wdGFyZykgPSBvcHRhcmc7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjaGVjayBkZXBlbmRpbmcgcmVxdWlyZXMgZm9yIGdpdmVuIG9wdGlvbnMgKi8KKwlmb3IgKG9uX29mZiA9IGNvbXBsZW1lbnRhcnk7IG9uX29mZi0+b3B0X2NoYXI7IG9uX29mZisrKSB7CisJCWlmIChvbl9vZmYtPnJlcXVpcmVzCisJCSAmJiAoZmxhZ3MgJiBvbl9vZmYtPnN3aXRjaF9vbikKKwkJICYmIChmbGFncyAmIG9uX29mZi0+cmVxdWlyZXMpID09IDAKKwkJKSB7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCWlmIChyZXF1aXJlcyAmJiAoZmxhZ3MgJiByZXF1aXJlcykgPT0gMCkKKwkJZ290byBlcnJvcjsKKwlhcmdjIC09IG9wdGluZDsKKwlpZiAoYXJnYyA8IG1pbl9hcmcgfHwgKG1heF9hcmcgPj0gMCAmJiBhcmdjID4gbWF4X2FyZykpCisJCWdvdG8gZXJyb3I7CisKKwlvcHRpb25fbWFzazMyID0gZmxhZ3M7CisJcmV0dXJuIGZsYWdzOworCisgZXJyb3I6CisJaWYgKGZpcnN0X2NoYXIgIT0gJyEnKQorCQliYl9zaG93X3VzYWdlKCk7CisJcmV0dXJuIChpbnQzMl90KS0xOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0cHR5LmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9nZXRwdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzVlNGQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvZ2V0cHR5LmMKQEAgLTAsMCArMSw2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBnZXRwdHkgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqIEJqb3JuIFdlc2VuLCBBeGlzIENvbW11bmljYXRpb25zIEFCIChiam9ybndAYXhpcy5jb20pCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBERUJVRyAwCisKK2ludCBGQVNUX0ZVTkMgeGdldHB0eShjaGFyICpsaW5lKQoreworCWludCBwOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfREVWUFRTCisJcCA9IG9wZW4oIi9kZXYvcHRteCIsIE9fUkRXUik7CisJaWYgKHAgPiAwKSB7CisJCWdyYW50cHQocCk7IC8qIGNobW9kK2Nob3duIGNvcnJlc3BvbmRpbmcgc2xhdmUgcHR5ICovCisJCXVubG9ja3B0KHApOyAvKiAod2hhdCBkb2VzIHRoaXMgZG8/KSAqLworIyBpZm5kZWYgSEFWRV9QVFNOQU1FX1IKKwkJeworCQkJY29uc3QgY2hhciAqbmFtZTsKKwkJCW5hbWUgPSBwdHNuYW1lKHApOyAvKiBmaW5kIG91dCB0aGUgbmFtZSBvZiBzbGF2ZSBwdHkgKi8KKwkJCWlmICghbmFtZSkgeworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicHRzbmFtZSBlcnJvciAoaXMgL2Rldi9wdHMgbW91bnRlZD8pIik7CisJCQl9CisJCQlzYWZlX3N0cm5jcHkobGluZSwgbmFtZSwgR0VUUFRZX0JVRlNJWkUpOworCQl9CisjIGVsc2UKKwkJLyogZmluZCBvdXQgdGhlIG5hbWUgb2Ygc2xhdmUgcHR5ICovCisJCWlmIChwdHNuYW1lX3IocCwgbGluZSwgR0VUUFRZX0JVRlNJWkUtMSkgIT0gMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJwdHNuYW1lIGVycm9yIChpcyAvZGV2L3B0cyBtb3VudGVkPykiKTsKKwkJfQorCQlsaW5lW0dFVFBUWV9CVUZTSVpFLTFdID0gJ1wwJzsKKyMgZW5kaWYKKwkJcmV0dXJuIHA7CisJfQorI2Vsc2UKKwlzdHJ1Y3Qgc3RhdCBzdGI7CisJaW50IGk7CisJaW50IGo7CisKKwlzdHJjcHkobGluZSwgIi9kZXYvcHR5WFgiKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWxpbmVbOF0gPSAicHFyc3R1dnd4eXphYmNkZSJbaV07CisJCWxpbmVbOV0gPSAnMCc7CisJCWlmIChzdGF0KGxpbmUsICZzdGIpIDwgMCkgeworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWxpbmVbOV0gPSBqIDwgMTAgPyBqICsgJzAnIDogaiAtIDEwICsgJ2EnOworCQkJaWYgKERFQlVHKQorCQkJCWZwcmludGYoc3RkZXJyLCAiVHJ5aW5nIHRvIG9wZW4gZGV2aWNlOiAlc1xuIiwgbGluZSk7CisJCQlwID0gb3BlbihsaW5lLCBPX1JEV1IgfCBPX05PQ1RUWSk7CisJCQlpZiAocCA+PSAwKSB7CisJCQkJbGluZVs1XSA9ICd0JzsKKwkJCQlyZXR1cm4gcDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBGRUFUVVJFX0RFVlBUUyAqLworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIGZyZWUgcHR5Iik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9oYXNoX21kNV9zaGEuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2hhc2hfbWQ1X3NoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4N2QxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9oYXNoX21kNV9zaGEuYwpAQCAtMCwwICsxLDg5OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBnY2MgNC4yLjEgb3B0aW1pemVzIHJvdHI2NCBiZXR0ZXIgd2l0aCBpbmxpbmUgdGhhbiB3aXRoIG1hY3JvCisgKiAoZm9yIHJvdFgzMiwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSkuIFdoeT8gTXkgZ3Vlc3MgaXMgdGhhdAorICogbWFjcm8gcmVxdWlyZXMgY2xldmVyIGNvbW1vbiBzdWJleHByZXNzaW9uIGVsaW1pbmF0aW9uIGhldXJpc3RpY3MKKyAqIGluIGdjYywgd2hpbGUgaW5saW5lIGJhc2ljYWxseSBmb3JjZXMgaXQgdG8gaGFwcGVuLgorICovCisvLyNkZWZpbmUgcm90bDMyKHgsbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpCitzdGF0aWMgQUxXQVlTX0lOTElORSB1aW50MzJfdCByb3RsMzIodWludDMyX3QgeCwgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gKHggPDwgbikgfCAoeCA+PiAoMzIgLSBuKSk7Cit9CisvLyNkZWZpbmUgcm90cjMyKHgsbikgKCgoeCkgPj4gKG4pKSB8ICgoeCkgPDwgKDMyIC0gKG4pKSkpCitzdGF0aWMgQUxXQVlTX0lOTElORSB1aW50MzJfdCByb3RyMzIodWludDMyX3QgeCwgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gKHggPj4gbikgfCAoeCA8PCAoMzIgLSBuKSk7Cit9CisvKiByb3RyNjQgaW4gbmVlZGVkIGZvciBzaGE1MTIgb25seTogKi8KKy8vI2RlZmluZSByb3RyNjQoeCxuKSAoKCh4KSA+PiAobikpIHwgKCh4KSA8PCAoNjQgLSAobikpKSkKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVpbnQ2NF90IHJvdHI2NCh1aW50NjRfdCB4LCB1bnNpZ25lZCBuKQoreworCXJldHVybiAoeCA+PiBuKSB8ICh4IDw8ICg2NCAtIG4pKTsKK30KKworCisvKiBGZWVkIGRhdGEgdGhyb3VnaCBhIHRlbXBvcmFyeSBidWZmZXIuCisgKiBUaGUgaW50ZXJuYWwgYnVmZmVyIHJlbWVtYmVycyBwcmV2aW91cyBkYXRhIHVudGlsIGl0IGhhcyA2NAorICogYnl0ZXMgd29ydGggdG8gcGFzcyBvbi4KKyAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbW1vbjY0X2hhc2gobWQ1X2N0eF90ICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBidWZwb3MgPSBjdHgtPnRvdGFsNjQgJiA2MzsKKworCWN0eC0+dG90YWw2NCArPSBsZW47CisKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCByZW1haW5pbmcgPSA2NCAtIGJ1ZnBvczsKKwkJaWYgKHJlbWFpbmluZyA+IGxlbikKKwkJCXJlbWFpbmluZyA9IGxlbjsKKwkJLyogQ29weSBkYXRhIGludG8gYWxpZ25lZCBidWZmZXIgKi8KKwkJbWVtY3B5KGN0eC0+d2J1ZmZlciArIGJ1ZnBvcywgYnVmZmVyLCByZW1haW5pbmcpOworCQlsZW4gLT0gcmVtYWluaW5nOworCQlidWZmZXIgPSAoY29uc3QgY2hhciAqKWJ1ZmZlciArIHJlbWFpbmluZzsKKwkJYnVmcG9zICs9IHJlbWFpbmluZzsKKwkJLyogY2xldmVyIHdheSB0byBkbyAiaWYgKGJ1ZnBvcyAhPSA2NCkgYnJlYWs7IC4uLiA7IGJ1ZnBvcyA9IDA7IiAqLworCQlidWZwb3MgLT0gNjQ7CisJCWlmIChidWZwb3MgIT0gMCkKKwkJCWJyZWFrOworCQkvKiBCdWZmZXIgaXMgZmlsbGVkIHVwLCBwcm9jZXNzIGl0ICovCisJCWN0eC0+cHJvY2Vzc19ibG9jayhjdHgpOworCQkvKmJ1ZnBvcyA9IDA7IC0gYWxyZWFkeSBpcyAqLworCX0KK30KKworLyogUHJvY2VzcyB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb21tb242NF9lbmQobWQ1X2N0eF90ICpjdHgsIGludCBzd2FwX25lZWRlZCkKK3sKKwl1bnNpZ25lZCBidWZwb3MgPSBjdHgtPnRvdGFsNjQgJiA2MzsKKwkvKiBQYWQgdGhlIGJ1ZmZlciB0byB0aGUgbmV4dCA2NC1ieXRlIGJvdW5kYXJ5IHdpdGggMHg4MCwwLDAsMC4uLiAqLworCWN0eC0+d2J1ZmZlcltidWZwb3MrK10gPSAweDgwOworCisJLyogVGhpcyBsb29wIGl0ZXJhdGVzIGVpdGhlciBvbmNlIG9yIHR3aWNlLCBubyBtb3JlLCBubyBsZXNzICovCisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcmVtYWluaW5nID0gNjQgLSBidWZwb3M7CisJCW1lbXNldChjdHgtPndidWZmZXIgKyBidWZwb3MsIDAsIHJlbWFpbmluZyk7CisJCS8qIERvIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgbGVuZ3RoIGNvdW50PyAqLworCQlpZiAocmVtYWluaW5nID49IDgpIHsKKwkJCS8qIFN0b3JlIHRoZSA2NC1iaXQgY291bnRlciBvZiBiaXRzIGluIHRoZSBidWZmZXIgKi8KKwkJCXVpbnQ2NF90IHQgPSBjdHgtPnRvdGFsNjQgPDwgMzsKKwkJCWlmIChzd2FwX25lZWRlZCkKKwkJCQl0ID0gYmJfYnN3YXBfNjQodCk7CisJCQkvKiB3YnVmZmVyIGlzIHN1aXRhYmx5IGFsaWduZWQgZm9yIHRoaXMgKi8KKwkJCSoodWludDY0X3QgKikgKCZjdHgtPndidWZmZXJbNjQgLSA4XSkgPSB0OworCQl9CisJCWN0eC0+cHJvY2Vzc19ibG9jayhjdHgpOworCQlpZiAocmVtYWluaW5nID49IDgpCisJCQlicmVhazsKKwkJYnVmcG9zID0gMDsKKwl9Cit9CisKKworLyoKKyAqIENvbXB1dGUgTUQ1IGNoZWNrc3VtIG9mIHN0cmluZ3MgYWNjb3JkaW5nIHRvIHRoZQorICogZGVmaW5pdGlvbiBvZiBNRDUgaW4gUkZDIDEzMjEgZnJvbSBBcHJpbCAxOTkyLgorICoKKyAqIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1hbnVlbCBOb3ZvYSBJSUkKKyAqIENvcHlyaWdodCAoQykgMjAwMyBHbGVubiBMLiBNY0dyYXRoCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRXJpayBBbmRlcnNlbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogMDogZmFzdGVzdCwgMzogc21hbGxlc3QgKi8KKyNpZiBDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQgPCAwCisjIGRlZmluZSBNRDVfU0laRV9WU19TUEVFRCAwCisjZWxpZiBDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQgPiAzCisjIGRlZmluZSBNRDVfU0laRV9WU19TUEVFRCAzCisjZWxzZQorIyBkZWZpbmUgTUQ1X1NJWkVfVlNfU1BFRUQgQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVECisjZW5kaWYKKworLyogVGhlc2UgYXJlIHRoZSBmb3VyIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBmb3VyIHN0ZXBzIG9mIHRoZSBNRDUgYWxnb3JpdGhtCisgKiBhbmQgZGVmaW5lZCBpbiB0aGUgUkZDIDEzMjEuICBUaGUgZmlyc3QgZnVuY3Rpb24gaXMgYSBsaXR0bGUgYml0IG9wdGltaXplZAorICogKGFzIGZvdW5kIGluIENvbGluIFBsdW1icyBwdWJsaWMgZG9tYWluIGltcGxlbWVudGF0aW9uKS4KKyAqICNkZWZpbmUgRkYoYiwgYywgZCkgKChiICYgYykgfCAofmIgJiBkKSkKKyAqLworI3VuZGVmIEZGCisjdW5kZWYgRkcKKyN1bmRlZiBGSAorI3VuZGVmIEZJCisjZGVmaW5lIEZGKGIsIGMsIGQpIChkIF4gKGIgJiAoYyBeIGQpKSkKKyNkZWZpbmUgRkcoYiwgYywgZCkgRkYoZCwgYiwgYykKKyNkZWZpbmUgRkgoYiwgYywgZCkgKGIgXiBjIF4gZCkKKyNkZWZpbmUgRkkoYiwgYywgZCkgKGMgXiAoYiB8IH5kKSkKKworLyogSGFzaCBhIHNpbmdsZSBibG9jaywgNjQgYnl0ZXMgbG9uZyBhbmQgNC1ieXRlIGFsaWduZWQgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBtZDVfcHJvY2Vzc19ibG9jazY0KG1kNV9jdHhfdCAqY3R4KQoreworI2lmIE1ENV9TSVpFX1ZTX1NQRUVEID4gMAorCS8qIEJlZm9yZSB3ZSBzdGFydCwgb25lIHdvcmQgdG8gdGhlIHN0cmFuZ2UgY29uc3RhbnRzLgorCSAgIFRoZXkgYXJlIGRlZmluZWQgaW4gUkZDIDEzMjEgYXMKKwkgICBUW2ldID0gKGludCkoNDI5NDk2NzI5Ni4wICogZmFicyhzaW4oaSkpKSwgaT0xLi42NAorCSAqLworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBDX2FycmF5W10gPSB7CisJCS8qIHJvdW5kIDEgKi8KKwkJMHhkNzZhYTQ3OCwgMHhlOGM3Yjc1NiwgMHgyNDIwNzBkYiwgMHhjMWJkY2VlZSwKKwkJMHhmNTdjMGZhZiwgMHg0Nzg3YzYyYSwgMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwKKwkJMHg2OTgwOThkOCwgMHg4YjQ0ZjdhZiwgMHhmZmZmNWJiMSwgMHg4OTVjZDdiZSwKKwkJMHg2YjkwMTEyMiwgMHhmZDk4NzE5MywgMHhhNjc5NDM4ZSwgMHg0OWI0MDgyMSwKKwkJLyogcm91bmQgMiAqLworCQkweGY2MWUyNTYyLCAweGMwNDBiMzQwLCAweDI2NWU1YTUxLCAweGU5YjZjN2FhLAorCQkweGQ2MmYxMDVkLCAweDAyNDQxNDUzLCAweGQ4YTFlNjgxLCAweGU3ZDNmYmM4LAorCQkweDIxZTFjZGU2LCAweGMzMzcwN2Q2LCAweGY0ZDUwZDg3LCAweDQ1NWExNGVkLAorCQkweGE5ZTNlOTA1LCAweGZjZWZhM2Y4LCAweDY3NmYwMmQ5LCAweDhkMmE0YzhhLAorCQkvKiByb3VuZCAzICovCisJCTB4ZmZmYTM5NDIsIDB4ODc3MWY2ODEsIDB4NmQ5ZDYxMjIsIDB4ZmRlNTM4MGMsCisJCTB4YTRiZWVhNDQsIDB4NGJkZWNmYTksIDB4ZjZiYjRiNjAsIDB4YmViZmJjNzAsCisJCTB4Mjg5YjdlYzYsIDB4ZWFhMTI3ZmEsIDB4ZDRlZjMwODUsIDB4NDg4MWQwNSwKKwkJMHhkOWQ0ZDAzOSwgMHhlNmRiOTllNSwgMHgxZmEyN2NmOCwgMHhjNGFjNTY2NSwKKwkJLyogcm91bmQgNCAqLworCQkweGY0MjkyMjQ0LCAweDQzMmFmZjk3LCAweGFiOTQyM2E3LCAweGZjOTNhMDM5LAorCQkweDY1NWI1OWMzLCAweDhmMGNjYzkyLCAweGZmZWZmNDdkLCAweDg1ODQ1ZGQxLAorCQkweDZmYTg3ZTRmLCAweGZlMmNlNmUwLCAweGEzMDE0MzE0LCAweDRlMDgxMWExLAorCQkweGY3NTM3ZTgyLCAweGJkM2FmMjM1LCAweDJhZDdkMmJiLCAweGViODZkMzkxCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciBQX2FycmF5W10gQUxJR04xID0geworIyBpZiBNRDVfU0laRV9WU19TUEVFRCA+IDEKKwkJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLyogMSAqLworIyBlbmRpZgorCQkxLCA2LCAxMSwgMCwgNSwgMTAsIDE1LCA0LCA5LCAxNCwgMywgOCwgMTMsIDIsIDcsIDEyLCAvKiAyICovCisJCTUsIDgsIDExLCAxNCwgMSwgNCwgNywgMTAsIDEzLCAwLCAzLCA2LCA5LCAxMiwgMTUsIDIsIC8qIDMgKi8KKwkJMCwgNywgMTQsIDUsIDEyLCAzLCAxMCwgMSwgOCwgMTUsIDYsIDEzLCA0LCAxMSwgMiwgOSAgLyogNCAqLworCX07CisjZW5kaWYKKwl1aW50MzJfdCAqd29yZHMgPSAodm9pZCopIGN0eC0+d2J1ZmZlcjsKKwl1aW50MzJfdCBBID0gY3R4LT5oYXNoWzBdOworCXVpbnQzMl90IEIgPSBjdHgtPmhhc2hbMV07CisJdWludDMyX3QgQyA9IGN0eC0+aGFzaFsyXTsKKwl1aW50MzJfdCBEID0gY3R4LT5oYXNoWzNdOworCisjaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPj0gMiAgLyogMiBvciAzICovCisKKwlzdGF0aWMgY29uc3QgY2hhciBTX2FycmF5W10gQUxJR04xID0geworCQk3LCAxMiwgMTcsIDIyLAorCQk1LCA5LCAxNCwgMjAsCisJCTQsIDExLCAxNiwgMjMsCisJCTYsIDEwLCAxNSwgMjEKKwl9OworCWNvbnN0IHVpbnQzMl90ICpwYzsKKwljb25zdCBjaGFyICpwcDsKKwljb25zdCBjaGFyICpwczsKKwlpbnQgaTsKKwl1aW50MzJfdCB0ZW1wOworCisjIGlmIEJCX0JJR19FTkRJQU4KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJd29yZHNbaV0gPSBTV0FQX0xFMzIod29yZHNbaV0pOworIyBlbmRpZgorCisjIGlmIE1ENV9TSVpFX1ZTX1NQRUVEID09IDMKKwlwYyA9IENfYXJyYXk7CisJcHAgPSBQX2FycmF5OworCXBzID0gU19hcnJheSAtIDQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlpZiAoKGkgJiAweDBmKSA9PSAwKQorCQkJcHMgKz0gNDsKKwkJdGVtcCA9IEE7CisJCXN3aXRjaCAoaSA+PiA0KSB7CisJCWNhc2UgMDoKKwkJCXRlbXAgKz0gRkYoQiwgQywgRCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdGVtcCArPSBGRyhCLCBDLCBEKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl0ZW1wICs9IEZIKEIsIEMsIEQpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXRlbXAgKz0gRkkoQiwgQywgRCk7CisJCX0KKwkJdGVtcCArPSB3b3Jkc1soaW50KSAoKnBwKyspXSArICpwYysrOworCQl0ZW1wID0gcm90bDMyKHRlbXAsIHBzW2kgJiAzXSk7CisJCXRlbXAgKz0gQjsKKwkJQSA9IEQ7CisJCUQgPSBDOworCQlDID0gQjsKKwkJQiA9IHRlbXA7CisJfQorIyBlbHNlICAvKiBNRDVfU0laRV9WU19TUEVFRCA9PSAyICovCisJcGMgPSBDX2FycmF5OworCXBwID0gUF9hcnJheTsKKwlwcyA9IFNfYXJyYXk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl0ZW1wID0gQSArIEZGKEIsIEMsIEQpICsgd29yZHNbKGludCkgKCpwcCsrKV0gKyAqcGMrKzsKKwkJdGVtcCA9IHJvdGwzMih0ZW1wLCBwc1tpICYgM10pOworCQl0ZW1wICs9IEI7CisJCUEgPSBEOworCQlEID0gQzsKKwkJQyA9IEI7CisJCUIgPSB0ZW1wOworCX0KKwlwcyArPSA0OworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXRlbXAgPSBBICsgRkcoQiwgQywgRCkgKyB3b3Jkc1soaW50KSAoKnBwKyspXSArICpwYysrOworCQl0ZW1wID0gcm90bDMyKHRlbXAsIHBzW2kgJiAzXSk7CisJCXRlbXAgKz0gQjsKKwkJQSA9IEQ7CisJCUQgPSBDOworCQlDID0gQjsKKwkJQiA9IHRlbXA7CisJfQorCXBzICs9IDQ7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdGVtcCA9IEEgKyBGSChCLCBDLCBEKSArIHdvcmRzWyhpbnQpICgqcHArKyldICsgKnBjKys7CisJCXRlbXAgPSByb3RsMzIodGVtcCwgcHNbaSAmIDNdKTsKKwkJdGVtcCArPSBCOworCQlBID0gRDsKKwkJRCA9IEM7CisJCUMgPSBCOworCQlCID0gdGVtcDsKKwl9CisJcHMgKz0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl0ZW1wID0gQSArIEZJKEIsIEMsIEQpICsgd29yZHNbKGludCkgKCpwcCsrKV0gKyAqcGMrKzsKKwkJdGVtcCA9IHJvdGwzMih0ZW1wLCBwc1tpICYgM10pOworCQl0ZW1wICs9IEI7CisJCUEgPSBEOworCQlEID0gQzsKKwkJQyA9IEI7CisJCUIgPSB0ZW1wOworCX0KKyMgZW5kaWYKKwkvKiBBZGQgY2hlY2tzdW0gdG8gdGhlIHN0YXJ0aW5nIHZhbHVlcyAqLworCWN0eC0+aGFzaFswXSArPSBBOworCWN0eC0+aGFzaFsxXSArPSBCOworCWN0eC0+aGFzaFsyXSArPSBDOworCWN0eC0+aGFzaFszXSArPSBEOworCisjZWxzZSAgLyogTUQ1X1NJWkVfVlNfU1BFRUQgPT0gMCBvciAxICovCisKKwl1aW50MzJfdCBBX3NhdmUgPSBBOworCXVpbnQzMl90IEJfc2F2ZSA9IEI7CisJdWludDMyX3QgQ19zYXZlID0gQzsKKwl1aW50MzJfdCBEX3NhdmUgPSBEOworIyBpZiBNRDVfU0laRV9WU19TUEVFRCA9PSAxCisJY29uc3QgdWludDMyX3QgKnBjOworCWNvbnN0IGNoYXIgKnBwOworCWludCBpOworIyBlbmRpZgorCisJLyogRmlyc3Qgcm91bmQ6IHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbiwgdGhlIGNvbnRleHQgYW5kIGEgY29uc3RhbnQKKwkgICB0aGUgbmV4dCBjb250ZXh0IGlzIGNvbXB1dGVkLiAgQmVjYXVzZSB0aGUgYWxnb3JpdGhtJ3MgcHJvY2Vzc2luZworCSAgIHVuaXQgaXMgYSAzMi1iaXQgd29yZCBhbmQgaXQgaXMgZGV0ZXJtaW5lZCB0byB3b3JrIG9uIHdvcmRzIGluCisJICAgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyIHdlIHBlcmhhcHMgaGF2ZSB0byBjaGFuZ2UgdGhlIGJ5dGUgb3JkZXIKKwkgICBiZWZvcmUgdGhlIGNvbXB1dGF0aW9uLiAgVG8gcmVkdWNlIHRoZSB3b3JrIGZvciB0aGUgbmV4dCBzdGVwcworCSAgIHdlIHNhdmUgc3dhcHBlZCB3b3JkcyBpbiBXT1JEUyBhcnJheS4gICovCisjIHVuZGVmIE9QCisjIGRlZmluZSBPUChhLCBiLCBjLCBkLCBzLCBUKSBcCisJZG8geyBcCisJCWEgKz0gRkYoYiwgYywgZCkgKyAoKndvcmRzIElGX0JJR19FTkRJQU4oPSBTV0FQX0xFMzIoKndvcmRzKSkpICsgVDsgXAorCQl3b3JkcysrOyBcCisJCWEgPSByb3RsMzIoYSwgcyk7IFwKKwkJYSArPSBiOyBcCisJfSB3aGlsZSAoMCkKKworCS8qIFJvdW5kIDEgKi8KKyMgaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPT0gMQorCXBjID0gQ19hcnJheTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCU9QKEEsIEIsIEMsIEQsIDcsICpwYysrKTsKKwkJT1AoRCwgQSwgQiwgQywgMTIsICpwYysrKTsKKwkJT1AoQywgRCwgQSwgQiwgMTcsICpwYysrKTsKKwkJT1AoQiwgQywgRCwgQSwgMjIsICpwYysrKTsKKwl9CisjIGVsc2UKKwlPUChBLCBCLCBDLCBELCA3LCAweGQ3NmFhNDc4KTsKKwlPUChELCBBLCBCLCBDLCAxMiwgMHhlOGM3Yjc1Nik7CisJT1AoQywgRCwgQSwgQiwgMTcsIDB4MjQyMDcwZGIpOworCU9QKEIsIEMsIEQsIEEsIDIyLCAweGMxYmRjZWVlKTsKKwlPUChBLCBCLCBDLCBELCA3LCAweGY1N2MwZmFmKTsKKwlPUChELCBBLCBCLCBDLCAxMiwgMHg0Nzg3YzYyYSk7CisJT1AoQywgRCwgQSwgQiwgMTcsIDB4YTgzMDQ2MTMpOworCU9QKEIsIEMsIEQsIEEsIDIyLCAweGZkNDY5NTAxKTsKKwlPUChBLCBCLCBDLCBELCA3LCAweDY5ODA5OGQ4KTsKKwlPUChELCBBLCBCLCBDLCAxMiwgMHg4YjQ0ZjdhZik7CisJT1AoQywgRCwgQSwgQiwgMTcsIDB4ZmZmZjViYjEpOworCU9QKEIsIEMsIEQsIEEsIDIyLCAweDg5NWNkN2JlKTsKKwlPUChBLCBCLCBDLCBELCA3LCAweDZiOTAxMTIyKTsKKwlPUChELCBBLCBCLCBDLCAxMiwgMHhmZDk4NzE5Myk7CisJT1AoQywgRCwgQSwgQiwgMTcsIDB4YTY3OTQzOGUpOworCU9QKEIsIEMsIEQsIEEsIDIyLCAweDQ5YjQwODIxKTsKKyMgZW5kaWYKKwl3b3JkcyAtPSAxNjsKKworCS8qIEZvciB0aGUgc2Vjb25kIHRvIGZvdXJ0aCByb3VuZCB3ZSBoYXZlIHRoZSBwb3NzaWJseSBzd2FwcGVkIHdvcmRzCisJICAgaW4gV09SRFMuICBSZWRlZmluZSB0aGUgbWFjcm8gdG8gdGFrZSBhbiBhZGRpdGlvbmFsIGZpcnN0CisJICAgYXJndW1lbnQgc3BlY2lmeWluZyB0aGUgZnVuY3Rpb24gdG8gdXNlLiAgKi8KKyMgdW5kZWYgT1AKKyMgZGVmaW5lIE9QKGYsIGEsIGIsIGMsIGQsIGssIHMsIFQpIFwKKwlkbyB7IFwKKwkJYSArPSBmKGIsIGMsIGQpICsgd29yZHNba10gKyBUOyBcCisJCWEgPSByb3RsMzIoYSwgcyk7IFwKKwkJYSArPSBiOyBcCisJfSB3aGlsZSAoMCkKKworCS8qIFJvdW5kIDIgKi8KKyMgaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPT0gMQorCXBwID0gUF9hcnJheTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCU9QKEZHLCBBLCBCLCBDLCBELCAoaW50KSAoKnBwKyspLCA1LCAqcGMrKyk7CisJCU9QKEZHLCBELCBBLCBCLCBDLCAoaW50KSAoKnBwKyspLCA5LCAqcGMrKyk7CisJCU9QKEZHLCBDLCBELCBBLCBCLCAoaW50KSAoKnBwKyspLCAxNCwgKnBjKyspOworCQlPUChGRywgQiwgQywgRCwgQSwgKGludCkgKCpwcCsrKSwgMjAsICpwYysrKTsKKwl9CisjIGVsc2UKKwlPUChGRywgQSwgQiwgQywgRCwgMSwgNSwgMHhmNjFlMjU2Mik7CisJT1AoRkcsIEQsIEEsIEIsIEMsIDYsIDksIDB4YzA0MGIzNDApOworCU9QKEZHLCBDLCBELCBBLCBCLCAxMSwgMTQsIDB4MjY1ZTVhNTEpOworCU9QKEZHLCBCLCBDLCBELCBBLCAwLCAyMCwgMHhlOWI2YzdhYSk7CisJT1AoRkcsIEEsIEIsIEMsIEQsIDUsIDUsIDB4ZDYyZjEwNWQpOworCU9QKEZHLCBELCBBLCBCLCBDLCAxMCwgOSwgMHgwMjQ0MTQ1Myk7CisJT1AoRkcsIEMsIEQsIEEsIEIsIDE1LCAxNCwgMHhkOGExZTY4MSk7CisJT1AoRkcsIEIsIEMsIEQsIEEsIDQsIDIwLCAweGU3ZDNmYmM4KTsKKwlPUChGRywgQSwgQiwgQywgRCwgOSwgNSwgMHgyMWUxY2RlNik7CisJT1AoRkcsIEQsIEEsIEIsIEMsIDE0LCA5LCAweGMzMzcwN2Q2KTsKKwlPUChGRywgQywgRCwgQSwgQiwgMywgMTQsIDB4ZjRkNTBkODcpOworCU9QKEZHLCBCLCBDLCBELCBBLCA4LCAyMCwgMHg0NTVhMTRlZCk7CisJT1AoRkcsIEEsIEIsIEMsIEQsIDEzLCA1LCAweGE5ZTNlOTA1KTsKKwlPUChGRywgRCwgQSwgQiwgQywgMiwgOSwgMHhmY2VmYTNmOCk7CisJT1AoRkcsIEMsIEQsIEEsIEIsIDcsIDE0LCAweDY3NmYwMmQ5KTsKKwlPUChGRywgQiwgQywgRCwgQSwgMTIsIDIwLCAweDhkMmE0YzhhKTsKKyMgZW5kaWYKKworCS8qIFJvdW5kIDMgKi8KKyMgaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPT0gMQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJT1AoRkgsIEEsIEIsIEMsIEQsIChpbnQpICgqcHArKyksIDQsICpwYysrKTsKKwkJT1AoRkgsIEQsIEEsIEIsIEMsIChpbnQpICgqcHArKyksIDExLCAqcGMrKyk7CisJCU9QKEZILCBDLCBELCBBLCBCLCAoaW50KSAoKnBwKyspLCAxNiwgKnBjKyspOworCQlPUChGSCwgQiwgQywgRCwgQSwgKGludCkgKCpwcCsrKSwgMjMsICpwYysrKTsKKwl9CisjIGVsc2UKKwlPUChGSCwgQSwgQiwgQywgRCwgNSwgNCwgMHhmZmZhMzk0Mik7CisJT1AoRkgsIEQsIEEsIEIsIEMsIDgsIDExLCAweDg3NzFmNjgxKTsKKwlPUChGSCwgQywgRCwgQSwgQiwgMTEsIDE2LCAweDZkOWQ2MTIyKTsKKwlPUChGSCwgQiwgQywgRCwgQSwgMTQsIDIzLCAweGZkZTUzODBjKTsKKwlPUChGSCwgQSwgQiwgQywgRCwgMSwgNCwgMHhhNGJlZWE0NCk7CisJT1AoRkgsIEQsIEEsIEIsIEMsIDQsIDExLCAweDRiZGVjZmE5KTsKKwlPUChGSCwgQywgRCwgQSwgQiwgNywgMTYsIDB4ZjZiYjRiNjApOworCU9QKEZILCBCLCBDLCBELCBBLCAxMCwgMjMsIDB4YmViZmJjNzApOworCU9QKEZILCBBLCBCLCBDLCBELCAxMywgNCwgMHgyODliN2VjNik7CisJT1AoRkgsIEQsIEEsIEIsIEMsIDAsIDExLCAweGVhYTEyN2ZhKTsKKwlPUChGSCwgQywgRCwgQSwgQiwgMywgMTYsIDB4ZDRlZjMwODUpOworCU9QKEZILCBCLCBDLCBELCBBLCA2LCAyMywgMHgwNDg4MWQwNSk7CisJT1AoRkgsIEEsIEIsIEMsIEQsIDksIDQsIDB4ZDlkNGQwMzkpOworCU9QKEZILCBELCBBLCBCLCBDLCAxMiwgMTEsIDB4ZTZkYjk5ZTUpOworCU9QKEZILCBDLCBELCBBLCBCLCAxNSwgMTYsIDB4MWZhMjdjZjgpOworCU9QKEZILCBCLCBDLCBELCBBLCAyLCAyMywgMHhjNGFjNTY2NSk7CisjIGVuZGlmCisKKwkvKiBSb3VuZCA0ICovCisjIGlmIE1ENV9TSVpFX1ZTX1NQRUVEID09IDEKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCU9QKEZJLCBBLCBCLCBDLCBELCAoaW50KSAoKnBwKyspLCA2LCAqcGMrKyk7CisJCU9QKEZJLCBELCBBLCBCLCBDLCAoaW50KSAoKnBwKyspLCAxMCwgKnBjKyspOworCQlPUChGSSwgQywgRCwgQSwgQiwgKGludCkgKCpwcCsrKSwgMTUsICpwYysrKTsKKwkJT1AoRkksIEIsIEMsIEQsIEEsIChpbnQpICgqcHArKyksIDIxLCAqcGMrKyk7CisJfQorIyBlbHNlCisJT1AoRkksIEEsIEIsIEMsIEQsIDAsIDYsIDB4ZjQyOTIyNDQpOworCU9QKEZJLCBELCBBLCBCLCBDLCA3LCAxMCwgMHg0MzJhZmY5Nyk7CisJT1AoRkksIEMsIEQsIEEsIEIsIDE0LCAxNSwgMHhhYjk0MjNhNyk7CisJT1AoRkksIEIsIEMsIEQsIEEsIDUsIDIxLCAweGZjOTNhMDM5KTsKKwlPUChGSSwgQSwgQiwgQywgRCwgMTIsIDYsIDB4NjU1YjU5YzMpOworCU9QKEZJLCBELCBBLCBCLCBDLCAzLCAxMCwgMHg4ZjBjY2M5Mik7CisJT1AoRkksIEMsIEQsIEEsIEIsIDEwLCAxNSwgMHhmZmVmZjQ3ZCk7CisJT1AoRkksIEIsIEMsIEQsIEEsIDEsIDIxLCAweDg1ODQ1ZGQxKTsKKwlPUChGSSwgQSwgQiwgQywgRCwgOCwgNiwgMHg2ZmE4N2U0Zik7CisJT1AoRkksIEQsIEEsIEIsIEMsIDE1LCAxMCwgMHhmZTJjZTZlMCk7CisJT1AoRkksIEMsIEQsIEEsIEIsIDYsIDE1LCAweGEzMDE0MzE0KTsKKwlPUChGSSwgQiwgQywgRCwgQSwgMTMsIDIxLCAweDRlMDgxMWExKTsKKwlPUChGSSwgQSwgQiwgQywgRCwgNCwgNiwgMHhmNzUzN2U4Mik7CisJT1AoRkksIEQsIEEsIEIsIEMsIDExLCAxMCwgMHhiZDNhZjIzNSk7CisJT1AoRkksIEMsIEQsIEEsIEIsIDIsIDE1LCAweDJhZDdkMmJiKTsKKwlPUChGSSwgQiwgQywgRCwgQSwgOSwgMjEsIDB4ZWI4NmQzOTEpOworIyB1bmRlZiBPUAorIyBlbmRpZgorCS8qIEFkZCBjaGVja3N1bSB0byB0aGUgc3RhcnRpbmcgdmFsdWVzICovCisJY3R4LT5oYXNoWzBdID0gQV9zYXZlICsgQTsKKwljdHgtPmhhc2hbMV0gPSBCX3NhdmUgKyBCOworCWN0eC0+aGFzaFsyXSA9IENfc2F2ZSArIEM7CisJY3R4LT5oYXNoWzNdID0gRF9zYXZlICsgRDsKKyNlbmRpZgorfQorI3VuZGVmIEZGCisjdW5kZWYgRkcKKyN1bmRlZiBGSAorI3VuZGVmIEZJCisKKy8qIEluaXRpYWxpemUgc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhdGUgb2YgY29tcHV0YXRpb24uCisgKiAoUkZDIDEzMjEsIDMuMzogU3RlcCAzKQorICovCit2b2lkIEZBU1RfRlVOQyBtZDVfYmVnaW4obWQ1X2N0eF90ICpjdHgpCit7CisJY3R4LT5oYXNoWzBdID0gMHg2NzQ1MjMwMTsKKwljdHgtPmhhc2hbMV0gPSAweGVmY2RhYjg5OworCWN0eC0+aGFzaFsyXSA9IDB4OThiYWRjZmU7CisJY3R4LT5oYXNoWzNdID0gMHgxMDMyNTQ3NjsKKwljdHgtPnRvdGFsNjQgPSAwOworCWN0eC0+cHJvY2Vzc19ibG9jayA9IG1kNV9wcm9jZXNzX2Jsb2NrNjQ7Cit9CisKKy8qIFVzZWQgYWxzbyBmb3Igc2hhMSBhbmQgc2hhMjU2ICovCit2b2lkIEZBU1RfRlVOQyBtZDVfaGFzaChtZDVfY3R4X3QgKmN0eCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuKQoreworCWNvbW1vbjY0X2hhc2goY3R4LCBidWZmZXIsIGxlbik7Cit9CisKKy8qIFByb2Nlc3MgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgYnVmZmVyIGFuZCBwdXQgcmVzdWx0IGZyb20gQ1RYCisgKiBpbiBmaXJzdCAxNiBieXRlcyBmb2xsb3dpbmcgUkVTQlVGLiAgVGhlIHJlc3VsdCBpcyBhbHdheXMgaW4gbGl0dGxlCisgKiBlbmRpYW4gYnl0ZSBvcmRlciwgc28gdGhhdCBhIGJ5dGUtd2lzZSBvdXRwdXQgeWllbGRzIHRvIHRoZSB3YW50ZWQKKyAqIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIGRpZ2VzdC4KKyAqLwordm9pZCBGQVNUX0ZVTkMgbWQ1X2VuZChtZDVfY3R4X3QgKmN0eCwgdm9pZCAqcmVzYnVmKQoreworCS8qIE1ENSBzdG9yZXMgdG90YWwgaW4gTEUsIG5lZWQgdG8gc3dhcCBvbiBCRSBhcmNoZXM6ICovCisJY29tbW9uNjRfZW5kKGN0eCwgLypzd2FwX25lZWRlZDoqLyBCQl9CSUdfRU5ESUFOKTsKKworCS8qIFRoZSBNRDUgcmVzdWx0IGlzIGluIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciAqLworI2lmIEJCX0JJR19FTkRJQU4KKwljdHgtPmhhc2hbMF0gPSBTV0FQX0xFMzIoY3R4LT5oYXNoWzBdKTsKKwljdHgtPmhhc2hbMV0gPSBTV0FQX0xFMzIoY3R4LT5oYXNoWzFdKTsKKwljdHgtPmhhc2hbMl0gPSBTV0FQX0xFMzIoY3R4LT5oYXNoWzJdKTsKKwljdHgtPmhhc2hbM10gPSBTV0FQX0xFMzIoY3R4LT5oYXNoWzNdKTsKKyNlbmRpZgorCW1lbWNweShyZXNidWYsIGN0eC0+aGFzaCwgc2l6ZW9mKGN0eC0+aGFzaFswXSkgKiA0KTsKK30KKworCisvKgorICogU0hBMSBwYXJ0IGlzOgorICogQ29weXJpZ2h0IDIwMDcgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBCYXNlZCBvbiB0aGUgcHVibGljIGRvbWFpbiBTSEEtMSBpbiBDIGJ5IFN0ZXZlIFJlaWQgPHN0ZXZlQGVkbXdlYi5jb20+CisgKiBmcm9tIGh0dHA6Ly93d3cubWlycm9ycy53aXJldGFwcGVkLm5ldC9zZWN1cml0eS9jcnlwdG9ncmFwaHkvaGFzaGVzL3NoYTEvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTSEEyNTYgYW5kIFNIQTUxMiBwYXJ0cyBhcmU6CisgKiBSZWxlYXNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LgorICogU2hyYW5rIGJ5IERlbnlzIFZsYXNlbmtvLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoZSBiZXN0IHdheSB0byB0ZXN0IHJhbmRvbSBibG9ja3NpemVzIGlzIHRvIGdvIHRvIGNvcmV1dGlscy9tZDVfc2hhMV9zdW0uYworICogYW5kIHJlcGxhY2UgIjQwOTYiIHdpdGggc29tZXRoaW5nIGxpa2UgIjIwMDAgKyB0aW1lKE5VTEwpICUgMjA5NyIsCisgKiB0aGVuIHJlYnVpbGQgYW5kIGNvbXBhcmUgInNoYU5OTnN1bSBiaWdmaWxlIiByZXN1bHRzLgorICovCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBzaGExX3Byb2Nlc3NfYmxvY2s2NChzaGExX2N0eF90ICpjdHgpCit7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IHJjb25zdHNbXSA9IHsKKwkJMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSwgMHg4RjFCQkNEQywgMHhDQTYyQzFENgorCX07CisJaW50IGksIGo7CisJaW50IGNudDsKKwl1aW50MzJfdCBXWzE2KzE2XTsKKwl1aW50MzJfdCBhLCBiLCBjLCBkLCBlOworCisJLyogT24tc3RhY2sgd29yayBidWZmZXIgZnJlZXMgdXAgb25lIHJlZ2lzdGVyIGluIHRoZSBtYWluIGxvb3AKKwkgKiB3aGljaCBvdGhlcndpc2Ugd2lsbCBiZSBuZWVkZWQgdG8gaG9sZCBjdHggcG9pbnRlciAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlXW2ldID0gV1tpKzE2XSA9IFNXQVBfQkUzMigoKHVpbnQzMl90KiljdHgtPndidWZmZXIpW2ldKTsKKworCWEgPSBjdHgtPmhhc2hbMF07CisJYiA9IGN0eC0+aGFzaFsxXTsKKwljID0gY3R4LT5oYXNoWzJdOworCWQgPSBjdHgtPmhhc2hbM107CisJZSA9IGN0eC0+aGFzaFs0XTsKKworCS8qIDQgcm91bmRzIG9mIDIwIG9wZXJhdGlvbnMgZWFjaCAqLworCWNudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlqID0gMTk7CisJCWRvIHsKKwkJCXVpbnQzMl90IHdvcms7CisKKwkJCXdvcmsgPSBjIF4gZDsKKwkJCWlmIChpID09IDApIHsKKwkJCQl3b3JrID0gKHdvcmsgJiBiKSBeIGQ7CisJCQkJaWYgKGogPD0gMykKKwkJCQkJZ290byBnZTE2OworCQkJCS8qIFVzZWQgdG8gZG8gU1dBUF9CRTMyIGhlcmUsIGJ1dCB0aGlzCisJCQkJICogcmVxdWlyZXMgY3R4IChzZWUgY29tbWVudCBhYm92ZSkgKi8KKwkJCQl3b3JrICs9IFdbY250XTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGkgPT0gMikKKwkJCQkJd29yayA9ICgoYiB8IGMpICYgZCkgfCAoYiAmIGMpOworCQkJCWVsc2UgLyogaSA9IDEgb3IgMyAqLworCQkJCQl3b3JrIF49IGI7CisgZ2UxNjoKKwkJCQlXW2NudF0gPSBXW2NudCsxNl0gPSByb3RsMzIoV1tjbnQrMTNdIF4gV1tjbnQrOF0gXiBXW2NudCsyXSBeIFdbY250XSwgMSk7CisJCQkJd29yayArPSBXW2NudF07CisJCQl9CisJCQl3b3JrICs9IGUgKyByb3RsMzIoYSwgNSkgKyByY29uc3RzW2ldOworCisJCQkvKiBSb3RhdGUgYnkgb25lIGZvciBuZXh0IHRpbWUgKi8KKwkJCWUgPSBkOworCQkJZCA9IGM7CisJCQljID0gLyogYiA9ICovIHJvdGwzMihiLCAzMCk7CisJCQliID0gYTsKKwkJCWEgPSB3b3JrOworCQkJY250ID0gKGNudCArIDEpICYgMTU7CisJCX0gd2hpbGUgKC0taiA+PSAwKTsKKwl9CisKKwljdHgtPmhhc2hbMF0gKz0gYTsKKwljdHgtPmhhc2hbMV0gKz0gYjsKKwljdHgtPmhhc2hbMl0gKz0gYzsKKwljdHgtPmhhc2hbM10gKz0gZDsKKwljdHgtPmhhc2hbNF0gKz0gZTsKK30KKworLyogQ29uc3RhbnRzIGZvciBTSEE1MTIgZnJvbSBGSVBTIDE4MC0yOjQuMi4zLgorICogU0hBMjU2IGNvbnN0YW50cyBmcm9tIEZJUFMgMTgwLTI6NC4yLjIKKyAqIGFyZSB0aGUgbW9zdCBzaWduaWZpY2FudCBoYWxmIG9mIGZpcnN0IDY0IGVsZW1lbnRzCisgKiBvZiB0aGUgc2FtZSBhcnJheS4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ2NF90IHNoYV9LWzgwXSA9IHsKKwkweDQyOGEyZjk4ZDcyOGFlMjJVTEwsIDB4NzEzNzQ0OTEyM2VmNjVjZFVMTCwKKwkweGI1YzBmYmNmZWM0ZDNiMmZVTEwsIDB4ZTliNWRiYTU4MTg5ZGJiY1VMTCwKKwkweDM5NTZjMjViZjM0OGI1MzhVTEwsIDB4NTlmMTExZjFiNjA1ZDAxOVVMTCwKKwkweDkyM2Y4MmE0YWYxOTRmOWJVTEwsIDB4YWIxYzVlZDVkYTZkODExOFVMTCwKKwkweGQ4MDdhYTk4YTMwMzAyNDJVTEwsIDB4MTI4MzViMDE0NTcwNmZiZVVMTCwKKwkweDI0MzE4NWJlNGVlNGIyOGNVTEwsIDB4NTUwYzdkYzNkNWZmYjRlMlVMTCwKKwkweDcyYmU1ZDc0ZjI3Yjg5NmZVTEwsIDB4ODBkZWIxZmUzYjE2OTZiMVVMTCwKKwkweDliZGMwNmE3MjVjNzEyMzVVTEwsIDB4YzE5YmYxNzRjZjY5MjY5NFVMTCwKKwkweGU0OWI2OWMxOWVmMTRhZDJVTEwsIDB4ZWZiZTQ3ODYzODRmMjVlM1VMTCwKKwkweDBmYzE5ZGM2OGI4Y2Q1YjVVTEwsIDB4MjQwY2ExY2M3N2FjOWM2NVVMTCwKKwkweDJkZTkyYzZmNTkyYjAyNzVVTEwsIDB4NGE3NDg0YWE2ZWE2ZTQ4M1VMTCwKKwkweDVjYjBhOWRjYmQ0MWZiZDRVTEwsIDB4NzZmOTg4ZGE4MzExNTNiNVVMTCwKKwkweDk4M2U1MTUyZWU2NmRmYWJVTEwsIDB4YTgzMWM2NmQyZGI0MzIxMFVMTCwKKwkweGIwMDMyN2M4OThmYjIxM2ZVTEwsIDB4YmY1OTdmYzdiZWVmMGVlNFVMTCwKKwkweGM2ZTAwYmYzM2RhODhmYzJVTEwsIDB4ZDVhNzkxNDc5MzBhYTcyNVVMTCwKKwkweDA2Y2E2MzUxZTAwMzgyNmZVTEwsIDB4MTQyOTI5NjcwYTBlNmU3MFVMTCwKKwkweDI3YjcwYTg1NDZkMjJmZmNVTEwsIDB4MmUxYjIxMzg1YzI2YzkyNlVMTCwKKwkweDRkMmM2ZGZjNWFjNDJhZWRVTEwsIDB4NTMzODBkMTM5ZDk1YjNkZlVMTCwKKwkweDY1MGE3MzU0OGJhZjYzZGVVTEwsIDB4NzY2YTBhYmIzYzc3YjJhOFVMTCwKKwkweDgxYzJjOTJlNDdlZGFlZTZVTEwsIDB4OTI3MjJjODUxNDgyMzUzYlVMTCwKKwkweGEyYmZlOGExNGNmMTAzNjRVTEwsIDB4YTgxYTY2NGJiYzQyMzAwMVVMTCwKKwkweGMyNGI4YjcwZDBmODk3OTFVTEwsIDB4Yzc2YzUxYTMwNjU0YmUzMFVMTCwKKwkweGQxOTJlODE5ZDZlZjUyMThVTEwsIDB4ZDY5OTA2MjQ1NTY1YTkxMFVMTCwKKwkweGY0MGUzNTg1NTc3MTIwMmFVTEwsIDB4MTA2YWEwNzAzMmJiZDFiOFVMTCwKKwkweDE5YTRjMTE2YjhkMmQwYzhVTEwsIDB4MWUzNzZjMDg1MTQxYWI1M1VMTCwKKwkweDI3NDg3NzRjZGY4ZWViOTlVTEwsIDB4MzRiMGJjYjVlMTliNDhhOFVMTCwKKwkweDM5MWMwY2IzYzVjOTVhNjNVTEwsIDB4NGVkOGFhNGFlMzQxOGFjYlVMTCwKKwkweDViOWNjYTRmNzc2M2UzNzNVTEwsIDB4NjgyZTZmZjNkNmIyYjhhM1VMTCwKKwkweDc0OGY4MmVlNWRlZmIyZmNVTEwsIDB4NzhhNTYzNmY0MzE3MmY2MFVMTCwKKwkweDg0Yzg3ODE0YTFmMGFiNzJVTEwsIDB4OGNjNzAyMDgxYTY0MzllY1VMTCwKKwkweDkwYmVmZmZhMjM2MzFlMjhVTEwsIDB4YTQ1MDZjZWJkZTgyYmRlOVVMTCwKKwkweGJlZjlhM2Y3YjJjNjc5MTVVTEwsIDB4YzY3MTc4ZjJlMzcyNTMyYlVMTCwKKwkweGNhMjczZWNlZWEyNjYxOWNVTEwsIDB4ZDE4NmI4YzcyMWMwYzIwN1VMTCwgLyogWzY0XSsgYXJlIHVzZWQgZm9yIHNoYTUxMiBvbmx5ICovCisJMHhlYWRhN2RkNmNkZTBlYjFlVUxMLCAweGY1N2Q0ZjdmZWU2ZWQxNzhVTEwsCisJMHgwNmYwNjdhYTcyMTc2ZmJhVUxMLCAweDBhNjM3ZGM1YTJjODk4YTZVTEwsCisJMHgxMTNmOTgwNGJlZjkwZGFlVUxMLCAweDFiNzEwYjM1MTMxYzQ3MWJVTEwsCisJMHgyOGRiNzdmNTIzMDQ3ZDg0VUxMLCAweDMyY2FhYjdiNDBjNzI0OTNVTEwsCisJMHgzYzllYmUwYTE1YzliZWJjVUxMLCAweDQzMWQ2N2M0OWMxMDBkNGNVTEwsCisJMHg0Y2M1ZDRiZWNiM2U0MmI2VUxMLCAweDU5N2YyOTljZmM2NTdlMmFVTEwsCisJMHg1ZmNiNmZhYjNhZDZmYWVjVUxMLCAweDZjNDQxOThjNGE0NzU4MTdVTEwKK307CisKKyN1bmRlZiBDaAorI3VuZGVmIE1hagorI3VuZGVmIFMwCisjdW5kZWYgUzEKKyN1bmRlZiBSMAorI3VuZGVmIFIxCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBzaGEyNTZfcHJvY2Vzc19ibG9jazY0KHNoYTI1Nl9jdHhfdCAqY3R4KQoreworCXVuc2lnbmVkIHQ7CisJdWludDMyX3QgV1s2NF0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGg7CisJY29uc3QgdWludDMyX3QgKndvcmRzID0gKHVpbnQzMl90KikgY3R4LT53YnVmZmVyOworCisJLyogT3BlcmF0b3JzIGRlZmluZWQgaW4gRklQUyAxODAtMjo0LjEuMi4gICovCisjZGVmaW5lIENoKHgsIHksIHopICgoeCAmIHkpIF4gKH54ICYgeikpCisjZGVmaW5lIE1haih4LCB5LCB6KSAoKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopKQorI2RlZmluZSBTMCh4KSAocm90cjMyKHgsIDIpIF4gcm90cjMyKHgsIDEzKSBeIHJvdHIzMih4LCAyMikpCisjZGVmaW5lIFMxKHgpIChyb3RyMzIoeCwgNikgXiByb3RyMzIoeCwgMTEpIF4gcm90cjMyKHgsIDI1KSkKKyNkZWZpbmUgUjAoeCkgKHJvdHIzMih4LCA3KSBeIHJvdHIzMih4LCAxOCkgXiAoeCA+PiAzKSkKKyNkZWZpbmUgUjEoeCkgKHJvdHIzMih4LCAxNykgXiByb3RyMzIoeCwgMTkpIF4gKHggPj4gMTApKQorCisJLyogQ29tcHV0ZSB0aGUgbWVzc2FnZSBzY2hlZHVsZSBhY2NvcmRpbmcgdG8gRklQUyAxODAtMjo2LjIuMiBzdGVwIDIuICAqLworCWZvciAodCA9IDA7IHQgPCAxNjsgKyt0KQorCQlXW3RdID0gU1dBUF9CRTMyKHdvcmRzW3RdKTsKKwlmb3IgKC8qdCA9IDE2Ki87IHQgPCA2NDsgKyt0KQorCQlXW3RdID0gUjEoV1t0IC0gMl0pICsgV1t0IC0gN10gKyBSMChXW3QgLSAxNV0pICsgV1t0IC0gMTZdOworCisJYSA9IGN0eC0+aGFzaFswXTsKKwliID0gY3R4LT5oYXNoWzFdOworCWMgPSBjdHgtPmhhc2hbMl07CisJZCA9IGN0eC0+aGFzaFszXTsKKwllID0gY3R4LT5oYXNoWzRdOworCWYgPSBjdHgtPmhhc2hbNV07CisJZyA9IGN0eC0+aGFzaFs2XTsKKwloID0gY3R4LT5oYXNoWzddOworCisJLyogVGhlIGFjdHVhbCBjb21wdXRhdGlvbiBhY2NvcmRpbmcgdG8gRklQUyAxODAtMjo2LjIuMiBzdGVwIDMuICAqLworCWZvciAodCA9IDA7IHQgPCA2NDsgKyt0KSB7CisJCS8qIE5lZWQgdG8gZmV0Y2ggdXBwZXIgaGFsZiBvZiBzaGFfS1t0XQorCQkgKiAoSSBob3BlIGNvbXBpbGVyIGlzIGNsZXZlciBlbm91Z2ggdG8ganVzdCBmZXRjaAorCQkgKiB1cHBlciBoYWxmKQorCQkgKi8KKwkJdWludDMyX3QgS190ID0gc2hhX0tbdF0gPj4gMzI7CisJCXVpbnQzMl90IFQxID0gaCArIFMxKGUpICsgQ2goZSwgZiwgZykgKyBLX3QgKyBXW3RdOworCQl1aW50MzJfdCBUMiA9IFMwKGEpICsgTWFqKGEsIGIsIGMpOworCQloID0gZzsKKwkJZyA9IGY7CisJCWYgPSBlOworCQllID0gZCArIFQxOworCQlkID0gYzsKKwkJYyA9IGI7CisJCWIgPSBhOworCQlhID0gVDEgKyBUMjsKKwl9CisjdW5kZWYgQ2gKKyN1bmRlZiBNYWoKKyN1bmRlZiBTMAorI3VuZGVmIFMxCisjdW5kZWYgUjAKKyN1bmRlZiBSMQorCS8qIEFkZCB0aGUgc3RhcnRpbmcgdmFsdWVzIG9mIHRoZSBjb250ZXh0IGFjY29yZGluZyB0byBGSVBTIDE4MC0yOjYuMi4yCisJICAgc3RlcCA0LiAgKi8KKwljdHgtPmhhc2hbMF0gKz0gYTsKKwljdHgtPmhhc2hbMV0gKz0gYjsKKwljdHgtPmhhc2hbMl0gKz0gYzsKKwljdHgtPmhhc2hbM10gKz0gZDsKKwljdHgtPmhhc2hbNF0gKz0gZTsKKwljdHgtPmhhc2hbNV0gKz0gZjsKKwljdHgtPmhhc2hbNl0gKz0gZzsKKwljdHgtPmhhc2hbN10gKz0gaDsKK30KKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIHNoYTUxMl9wcm9jZXNzX2Jsb2NrMTI4KHNoYTUxMl9jdHhfdCAqY3R4KQoreworCXVuc2lnbmVkIHQ7CisJdWludDY0X3QgV1s4MF07CisJLyogT24gaTM4NiwgaGF2aW5nIGFzc2lnbm1lbnRzIGhlcmUgKG5vdCBsYXRlciBhcyBzaGEyNTYgZG9lcykKKwkgKiBwcm9kdWNlcyA5OSBieXRlcyBzbWFsbGVyIGNvZGUgd2l0aCBnY2MgNC4zLjEKKwkgKi8KKwl1aW50NjRfdCBhID0gY3R4LT5oYXNoWzBdOworCXVpbnQ2NF90IGIgPSBjdHgtPmhhc2hbMV07CisJdWludDY0X3QgYyA9IGN0eC0+aGFzaFsyXTsKKwl1aW50NjRfdCBkID0gY3R4LT5oYXNoWzNdOworCXVpbnQ2NF90IGUgPSBjdHgtPmhhc2hbNF07CisJdWludDY0X3QgZiA9IGN0eC0+aGFzaFs1XTsKKwl1aW50NjRfdCBnID0gY3R4LT5oYXNoWzZdOworCXVpbnQ2NF90IGggPSBjdHgtPmhhc2hbN107CisJY29uc3QgdWludDY0X3QgKndvcmRzID0gKHVpbnQ2NF90KikgY3R4LT53YnVmZmVyOworCisJLyogT3BlcmF0b3JzIGRlZmluZWQgaW4gRklQUyAxODAtMjo0LjEuMi4gICovCisjZGVmaW5lIENoKHgsIHksIHopICgoeCAmIHkpIF4gKH54ICYgeikpCisjZGVmaW5lIE1haih4LCB5LCB6KSAoKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopKQorI2RlZmluZSBTMCh4KSAocm90cjY0KHgsIDI4KSBeIHJvdHI2NCh4LCAzNCkgXiByb3RyNjQoeCwgMzkpKQorI2RlZmluZSBTMSh4KSAocm90cjY0KHgsIDE0KSBeIHJvdHI2NCh4LCAxOCkgXiByb3RyNjQoeCwgNDEpKQorI2RlZmluZSBSMCh4KSAocm90cjY0KHgsIDEpIF4gcm90cjY0KHgsIDgpIF4gKHggPj4gNykpCisjZGVmaW5lIFIxKHgpIChyb3RyNjQoeCwgMTkpIF4gcm90cjY0KHgsIDYxKSBeICh4ID4+IDYpKQorCisJLyogQ29tcHV0ZSB0aGUgbWVzc2FnZSBzY2hlZHVsZSBhY2NvcmRpbmcgdG8gRklQUyAxODAtMjo2LjMuMiBzdGVwIDIuICAqLworCWZvciAodCA9IDA7IHQgPCAxNjsgKyt0KQorCQlXW3RdID0gU1dBUF9CRTY0KHdvcmRzW3RdKTsKKwlmb3IgKC8qdCA9IDE2Ki87IHQgPCA4MDsgKyt0KQorCQlXW3RdID0gUjEoV1t0IC0gMl0pICsgV1t0IC0gN10gKyBSMChXW3QgLSAxNV0pICsgV1t0IC0gMTZdOworCisJLyogVGhlIGFjdHVhbCBjb21wdXRhdGlvbiBhY2NvcmRpbmcgdG8gRklQUyAxODAtMjo2LjMuMiBzdGVwIDMuICAqLworCWZvciAodCA9IDA7IHQgPCA4MDsgKyt0KSB7CisJCXVpbnQ2NF90IFQxID0gaCArIFMxKGUpICsgQ2goZSwgZiwgZykgKyBzaGFfS1t0XSArIFdbdF07CisJCXVpbnQ2NF90IFQyID0gUzAoYSkgKyBNYWooYSwgYiwgYyk7CisJCWggPSBnOworCQlnID0gZjsKKwkJZiA9IGU7CisJCWUgPSBkICsgVDE7CisJCWQgPSBjOworCQljID0gYjsKKwkJYiA9IGE7CisJCWEgPSBUMSArIFQyOworCX0KKyN1bmRlZiBDaAorI3VuZGVmIE1hagorI3VuZGVmIFMwCisjdW5kZWYgUzEKKyN1bmRlZiBSMAorI3VuZGVmIFIxCisJLyogQWRkIHRoZSBzdGFydGluZyB2YWx1ZXMgb2YgdGhlIGNvbnRleHQgYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4zLjIKKwkgICBzdGVwIDQuICAqLworCWN0eC0+aGFzaFswXSArPSBhOworCWN0eC0+aGFzaFsxXSArPSBiOworCWN0eC0+aGFzaFsyXSArPSBjOworCWN0eC0+aGFzaFszXSArPSBkOworCWN0eC0+aGFzaFs0XSArPSBlOworCWN0eC0+aGFzaFs1XSArPSBmOworCWN0eC0+aGFzaFs2XSArPSBnOworCWN0eC0+aGFzaFs3XSArPSBoOworfQorCisKK3ZvaWQgRkFTVF9GVU5DIHNoYTFfYmVnaW4oc2hhMV9jdHhfdCAqY3R4KQoreworCWN0eC0+aGFzaFswXSA9IDB4Njc0NTIzMDE7CisJY3R4LT5oYXNoWzFdID0gMHhlZmNkYWI4OTsKKwljdHgtPmhhc2hbMl0gPSAweDk4YmFkY2ZlOworCWN0eC0+aGFzaFszXSA9IDB4MTAzMjU0NzY7CisJY3R4LT5oYXNoWzRdID0gMHhjM2QyZTFmMDsKKwljdHgtPnRvdGFsNjQgPSAwOworCWN0eC0+cHJvY2Vzc19ibG9jayA9IHNoYTFfcHJvY2Vzc19ibG9jazY0OworfQorCitzdGF0aWMgY29uc3QgdWludDMyX3QgaW5pdDI1NltdID0geworCTAsCisJMCwKKwkweDZhMDllNjY3LAorCTB4YmI2N2FlODUsCisJMHgzYzZlZjM3MiwKKwkweGE1NGZmNTNhLAorCTB4NTEwZTUyN2YsCisJMHg5YjA1Njg4YywKKwkweDFmODNkOWFiLAorCTB4NWJlMGNkMTksCit9Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IGluaXQ1MTJfbG9bXSA9IHsKKwkwLAorCTAsCisJMHhmM2JjYzkwOCwKKwkweDg0Y2FhNzNiLAorCTB4ZmU5NGY4MmIsCisJMHg1ZjFkMzZmMSwKKwkweGFkZTY4MmQxLAorCTB4MmIzZTZjMWYsCisJMHhmYjQxYmQ2YiwKKwkweDEzN2UyMTc5LAorfTsKKworLyogSW5pdGlhbGl6ZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBzdGF0ZSBvZiBjb21wdXRhdGlvbi4KKyAgIChGSVBTIDE4MC0yOjUuMy4yKSAgKi8KK3ZvaWQgRkFTVF9GVU5DIHNoYTI1Nl9iZWdpbihzaGEyNTZfY3R4X3QgKmN0eCkKK3sKKwltZW1jcHkoJmN0eC0+dG90YWw2NCwgaW5pdDI1Niwgc2l6ZW9mKGluaXQyNTYpKTsKKwkvKmN0eC0+dG90YWw2NCA9IDA7IC0gZG9uZSBieSBwcmVwZW5kaW5nIHR3byAzMi1iaXQgemVyb3MgdG8gaW5pdDI1NiAqLworCWN0eC0+cHJvY2Vzc19ibG9jayA9IHNoYTI1Nl9wcm9jZXNzX2Jsb2NrNjQ7Cit9CisKKy8qIEluaXRpYWxpemUgc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhdGUgb2YgY29tcHV0YXRpb24uCisgICAoRklQUyAxODAtMjo1LjMuMykgICovCit2b2lkIEZBU1RfRlVOQyBzaGE1MTJfYmVnaW4oc2hhNTEyX2N0eF90ICpjdHgpCit7CisJaW50IGk7CisJLyogVHdvIGV4dHJhIGl0ZXJhdGlvbnMgemVybyBvdXQgY3R4LT50b3RhbDY0WzJdICovCisJdWludDY0X3QgKnRwID0gY3R4LT50b3RhbDY0OworCWZvciAoaSA9IDA7IGkgPCAyKzg7IGkrKykKKwkJdHBbaV0gPSAoKHVpbnQ2NF90KShpbml0MjU2W2ldKSA8PCAzMikgKyBpbml0NTEyX2xvW2ldOworCS8qY3R4LT50b3RhbDY0WzBdID0gY3R4LT50b3RhbDY0WzFdID0gMDsgLSBhbHJlYWR5IGRvbmUgKi8KK30KKwordm9pZCBGQVNUX0ZVTkMgc2hhNTEyX2hhc2goc2hhNTEyX2N0eF90ICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBidWZwb3MgPSBjdHgtPnRvdGFsNjRbMF0gJiAxMjc7CisJdW5zaWduZWQgcmVtYWluaW5nOworCisJLyogRmlyc3QgaW5jcmVtZW50IHRoZSBieXRlIGNvdW50LiAgRklQUyAxODAtMiBzcGVjaWZpZXMgdGhlIHBvc3NpYmxlCisJICAgbGVuZ3RoIG9mIHRoZSBmaWxlIHVwIHRvIDJeMTI4IF9iaXRzXy4KKwkgICBXZSBjb21wdXRlIHRoZSBudW1iZXIgb2YgX2J5dGVzXyBhbmQgY29udmVydCB0byBiaXRzIGxhdGVyLiAgKi8KKwljdHgtPnRvdGFsNjRbMF0gKz0gbGVuOworCWlmIChjdHgtPnRvdGFsNjRbMF0gPCBsZW4pCisJCWN0eC0+dG90YWw2NFsxXSsrOworI2lmIDAKKwlyZW1haW5pbmcgPSAxMjggLSBidWZwb3M7CisKKwkvKiBIYXNoIHdob2xlIGJsb2NrcyAqLworCXdoaWxlIChsZW4gPj0gcmVtYWluaW5nKSB7CisJCW1lbWNweShjdHgtPndidWZmZXIgKyBidWZwb3MsIGJ1ZmZlciwgcmVtYWluaW5nKTsKKwkJYnVmZmVyID0gKGNvbnN0IGNoYXIgKilidWZmZXIgKyByZW1haW5pbmc7CisJCWxlbiAtPSByZW1haW5pbmc7CisJCXJlbWFpbmluZyA9IDEyODsKKwkJYnVmcG9zID0gMDsKKwkJc2hhNTEyX3Byb2Nlc3NfYmxvY2sxMjgoY3R4KTsKKwl9CisKKwkvKiBTYXZlIGxhc3QsIHBhcnRpYWwgYmxvc2sgKi8KKwltZW1jcHkoY3R4LT53YnVmZmVyICsgYnVmcG9zLCBidWZmZXIsIGxlbik7CisjZWxzZQorCXdoaWxlICgxKSB7CisJCXJlbWFpbmluZyA9IDEyOCAtIGJ1ZnBvczsKKwkJaWYgKHJlbWFpbmluZyA+IGxlbikKKwkJCXJlbWFpbmluZyA9IGxlbjsKKwkJLyogQ29weSBkYXRhIGludG8gYWxpZ25lZCBidWZmZXIgKi8KKwkJbWVtY3B5KGN0eC0+d2J1ZmZlciArIGJ1ZnBvcywgYnVmZmVyLCByZW1haW5pbmcpOworCQlsZW4gLT0gcmVtYWluaW5nOworCQlidWZmZXIgPSAoY29uc3QgY2hhciAqKWJ1ZmZlciArIHJlbWFpbmluZzsKKwkJYnVmcG9zICs9IHJlbWFpbmluZzsKKwkJLyogY2xldmVyIHdheSB0byBkbyAiaWYgKGJ1ZnBvcyAhPSAxMjgpIGJyZWFrOyAuLi4gOyBidWZwb3MgPSAwOyIgKi8KKwkJYnVmcG9zIC09IDEyODsKKwkJaWYgKGJ1ZnBvcyAhPSAwKQorCQkJYnJlYWs7CisJCS8qIEJ1ZmZlciBpcyBmaWxsZWQgdXAsIHByb2Nlc3MgaXQgKi8KKwkJc2hhNTEyX3Byb2Nlc3NfYmxvY2sxMjgoY3R4KTsKKwkJLypidWZwb3MgPSAwOyAtIGFscmVhZHkgaXMgKi8KKwl9CisjZW5kaWYKK30KKworLyogVXNlZCBhbHNvIGZvciBzaGEyNTYgKi8KK3ZvaWQgRkFTVF9GVU5DIHNoYTFfZW5kKHNoYTFfY3R4X3QgKmN0eCwgdm9pZCAqcmVzYnVmKQoreworCXVuc2lnbmVkIGhhc2hfc2l6ZTsKKworCS8qIFNIQSBzdG9yZXMgdG90YWwgaW4gQkUsIG5lZWQgdG8gc3dhcCBvbiBMRSBhcmNoZXM6ICovCisJY29tbW9uNjRfZW5kKGN0eCwgLypzd2FwX25lZWRlZDoqLyBCQl9MSVRUTEVfRU5ESUFOKTsKKworCWhhc2hfc2l6ZSA9IChjdHgtPnByb2Nlc3NfYmxvY2sgPT0gc2hhMV9wcm9jZXNzX2Jsb2NrNjQpID8gNSA6IDg7CisJLyogVGhpcyB3YXkgd2UgZG8gbm90IGltcG9zZSBhbGlnbm1lbnQgY29uc3RyYWludHMgb24gcmVzYnVmOiAqLworCWlmIChCQl9MSVRUTEVfRU5ESUFOKSB7CisJCXVuc2lnbmVkIGk7CisJCWZvciAoaSA9IDA7IGkgPCBoYXNoX3NpemU7ICsraSkKKwkJCWN0eC0+aGFzaFtpXSA9IFNXQVBfQkUzMihjdHgtPmhhc2hbaV0pOworCX0KKwltZW1jcHkocmVzYnVmLCBjdHgtPmhhc2gsIHNpemVvZihjdHgtPmhhc2hbMF0pICogaGFzaF9zaXplKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgc2hhNTEyX2VuZChzaGE1MTJfY3R4X3QgKmN0eCwgdm9pZCAqcmVzYnVmKQoreworCXVuc2lnbmVkIGJ1ZnBvcyA9IGN0eC0+dG90YWw2NFswXSAmIDEyNzsKKworCS8qIFBhZCB0aGUgYnVmZmVyIHRvIHRoZSBuZXh0IDEyOC1ieXRlIGJvdW5kYXJ5IHdpdGggMHg4MCwwLDAsMC4uLiAqLworCWN0eC0+d2J1ZmZlcltidWZwb3MrK10gPSAweDgwOworCisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcmVtYWluaW5nID0gMTI4IC0gYnVmcG9zOworCQltZW1zZXQoY3R4LT53YnVmZmVyICsgYnVmcG9zLCAwLCByZW1haW5pbmcpOworCQlpZiAocmVtYWluaW5nID49IDE2KSB7CisJCQkvKiBTdG9yZSB0aGUgMTI4LWJpdCBjb3VudGVyIG9mIGJpdHMgaW4gdGhlIGJ1ZmZlciBpbiBCRSBmb3JtYXQgKi8KKwkJCXVpbnQ2NF90IHQ7CisJCQl0ID0gY3R4LT50b3RhbDY0WzBdIDw8IDM7CisJCQl0ID0gU1dBUF9CRTY0KHQpOworCQkJKih1aW50NjRfdCAqKSAoJmN0eC0+d2J1ZmZlclsxMjggLSA4XSkgPSB0OworCQkJdCA9IChjdHgtPnRvdGFsNjRbMV0gPDwgMykgfCAoY3R4LT50b3RhbDY0WzBdID4+IDYxKTsKKwkJCXQgPSBTV0FQX0JFNjQodCk7CisJCQkqKHVpbnQ2NF90ICopICgmY3R4LT53YnVmZmVyWzEyOCAtIDE2XSkgPSB0OworCQl9CisJCXNoYTUxMl9wcm9jZXNzX2Jsb2NrMTI4KGN0eCk7CisJCWlmIChyZW1haW5pbmcgPj0gMTYpCisJCQlicmVhazsKKwkJYnVmcG9zID0gMDsKKwl9CisKKwlpZiAoQkJfTElUVExFX0VORElBTikgeworCQl1bnNpZ25lZCBpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHgtPmhhc2gpOyArK2kpCisJCQljdHgtPmhhc2hbaV0gPSBTV0FQX0JFNjQoY3R4LT5oYXNoW2ldKTsKKwl9CisJbWVtY3B5KHJlc2J1ZiwgY3R4LT5oYXNoLCBzaXplb2YoY3R4LT5oYXNoKSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9oYXNoX21kNXByaW1lLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9oYXNoX21kNXByaW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4NmY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2hhc2hfbWQ1cHJpbWUuYwpAQCAtMCwwICsxLDQ2MCBAQAorLyogVGhpcyBmaWxlIGlzIG5vdCB1c2VkIGJ5IGJ1c3lib3ggcmlnaHQgbm93LgorICogSG93ZXZlciwgdGhlIGNvZGUgaGVyZSBzZWVtcyB0byBiZSBhIHRpbnkgYml0IHNtYWxsZXIKKyAqIHRoYW4gb25lIGluIG1kNS5jLiBOZWVkIHRvIGludmVzdGlnYXRlIHdoaWNoIG9uZQorICogaXMgYmV0dGVyIG92ZXJhbGwuLi4KKyAqIEhpbnQ6IGdyZXAgZm9yIG1kNXByaW1lIHRvIGZpbmQgcGxhY2VzIHdoZXJlIHlvdSBjYW4gc3dpdGNoCisgKiBtZDUuYy9tZDVwcmltZS5jCisgKi8KKworLyoKKyAqIE1ENUMuQyAtIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuLCBNRDUgbWVzc2FnZS1kaWdlc3QgYWxnb3JpdGhtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTIsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIENyZWF0ZWQgMTk5MS4gQWxsCisgKiByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgaXQKKyAqIGlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKKyAqIEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyBzb2Z0d2FyZQorICogb3IgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBMaWNlbnNlIGlzIGFsc28gZ3JhbnRlZCB0byBtYWtlIGFuZCB1c2UgZGVyaXZhdGl2ZSB3b3JrcyBwcm92aWRlZAorICogdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSBEYXRhCisgKiBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwKKyAqIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4KKyAqCisgKiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyBlaXRoZXIKKyAqIHRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcworICogc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLgorICoKKyAqIFRoZXNlIG5vdGljZXMgbXVzdCBiZSByZXRhaW5lZCBpbiBhbnkgY29waWVzIG9mIGFueSBwYXJ0IG9mIHRoaXMKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIHNvZnR3YXJlLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYm1kL21kNWMuYyx2IDEuOS4yLjEgMTk5OS8wOC8yOSAxNDo1NzoxMiBwZXRlciBFeHAgJAorICoKKyAqIFRoaXMgY29kZSBpcyB0aGUgc2FtZSBhcyB0aGUgY29kZSBwdWJsaXNoZWQgYnkgUlNBIEluYy4gIEl0IGhhcyBiZWVuCisgKiBlZGl0ZWQgZm9yIGNsYXJpdHkgYW5kIHN0eWxlIG9ubHkuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhlIG1kNV9jcnlwdCgpIGZ1bmN0aW9uIHdhcyB0YWtlbiBmcm9tIGZyZWVCU0QncyBsaWJjcnlwdCBhbmQgY29udGFpbnMKKyAqIHRoaXMgbGljZW5zZToKKyAqICAgICJUSEUgQkVFUi1XQVJFIExJQ0VOU0UiIChSZXZpc2lvbiA0Mik6CisgKiAgICAgPHBoa0Bsb2dpbi5ka25ldC5kaz4gd3JvdGUgdGhpcyBmaWxlLiAgQXMgbG9uZyBhcyB5b3UgcmV0YWluIHRoaXMgbm90aWNlIHlvdQorICogICAgIGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgc3R1ZmYuIElmIHdlIG1lZXQgc29tZSBkYXksIGFuZCB5b3UgdGhpbmsKKyAqICAgICB0aGlzIHN0dWZmIGlzIHdvcnRoIGl0LCB5b3UgY2FuIGJ1eSBtZSBhIGJlZXIgaW4gcmV0dXJuLiAgIFBvdWwtSGVubmluZyBLYW1wCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGliY3J5cHQvY3J5cHQuYyx2IDEuNy4yLjEgMTk5OS8wOC8yOSAxNDo1NjozMyBwZXRlciBFeHAgJAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9uIEFwcmlsIDE5dGgsIDIwMDEgbWQ1X2NyeXB0KCkgd2FzIG1vZGlmaWVkIHRvIG1ha2UgaXQgcmVlbnRyYW50CisgKiBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkB1Y2xpYmMub3JnPgorICoKKyAqIEp1bmUgMjgsIDIwMDEgICAgICAgICAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqICJVbi1pbmxpbmVkIiBjb2RlIHVzaW5nIGxvb3BzIGFuZCBzdGF0aWMgY29uc3QgdGFibGVzIGluIG9yZGVyIHRvCisgKiByZWR1Y2UgZ2VuZXJhdGVkIGNvZGUgc2l6ZSAob24gaTM4NiBmcm9tIGFwcHJveCA0ayB0byBhcHByb3ggMi41aykuCisgKgorICogSnVuZSAyOSwgMjAwMSAgICAgICAgICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogQ29tcGxldGVseSByZW1vdmVkIHN0YXRpYyBQQURESU5HIGFycmF5LgorICoKKyAqIFJlaW50cm9kdWNlZCB0aGUgbG9vcCB1bnJvbGxpbmcgaW4gbWQ1X3RyYW5zZm9ybSBhbmQgYWRkZWQgdGhlCisgKiBNRDVfU0laRV9WU19TUEVFRCBvcHRpb24gZm9yIGNvbmZpZ3VyYWJpbGl0eS4gIERlZmluZSBiZWxvdyBhczoKKyAqICAgICAgIDAgICAgZnVsbHkgdW5yb2xsZWQgbG9vcHMKKyAqICAgICAgIDEgICAgcGFydGlhbGx5IHVucm9sbGVkICg0IG9wcyBwZXIgbG9vcCkKKyAqICAgICAgIDIgICAgbm8gdW5yb2xsaW5nIC0tIGludHJvZHVjZXMgdGhlIG5lZWQgdG8gc3dhcCA0IHZhcmlhYmxlcyAoc2xvdykKKyAqICAgICAgIDMgICAgbm8gdW5yb2xsaW5nIGFuZCBhbGwgNCBsb29wcyBtZXJnZWQgaW50byBvbmUgd2l0aCBzd2l0Y2gKKyAqICAgICAgICAgICAgICAgaW4gZWFjaCBsb29wIChnbGFjaWFsKQorICogT24gaTM4Niwgc2l6ZXMgYXJlIHJvdWdobHkgKC1PcyAtZm5vLWJ1aWx0aW4pOgorICogICAgIDA6IDNrICAgICAxOiAyLjVrICAgICAyOiAyLjJrICAgICAzOiAyaworICoKKyAqIFNpbmNlIFN1U3YzIGRvZXMgbm90IHJlcXVpcmUgY3J5cHRfciwgbW9kaWZpZWQgYWdhaW4gQXVndXN0IDcsIDIwMDIKKyAqIGJ5IEVyaWsgQW5kZXJzZW4gdG8gcmVtb3ZlIHJlZW50cmFuY2Ugc3R1ZmYuLi4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogMTogZmFzdGVzdCwgMzogc21hbGxlc3QgKi8KKyNpZiBDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQgPCAxCisjIGRlZmluZSBNRDVfU0laRV9WU19TUEVFRCAxCisjZWxpZiBDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQgPiAzCisjIGRlZmluZSBNRDVfU0laRV9WU19TUEVFRCAzCisjZWxzZQorIyBkZWZpbmUgTUQ1X1NJWkVfVlNfU1BFRUQgQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVECisjZW5kaWYKKworI2lmIEJCX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgbWVtY3B5MzJfY3B1MmxlIG1lbWNweQorI2RlZmluZSBtZW1jcHkzMl9sZTJjcHUgbWVtY3B5CisjZWxzZQorLyogRW5jb2RlcyBpbnB1dCAodWludDMyX3QpIGludG8gb3V0cHV0ICh1bnNpZ25lZCBjaGFyKS4KKyAqIEFzc3VtZXMgbGVuIGlzIGEgbXVsdGlwbGUgb2YgNC4gKi8KK3N0YXRpYyB2b2lkCittZW1jcHkzMl9jcHUybGUodW5zaWduZWQgY2hhciAqb3V0cHV0LCB1aW50MzJfdCAqaW5wdXQsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBpLCBqOworCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgbGVuOyBpKyssIGogKz0gNCkgeworCQlvdXRwdXRbal0gPSBpbnB1dFtpXTsKKwkJb3V0cHV0W2orMV0gPSAoaW5wdXRbaV0gPj4gOCk7CisJCW91dHB1dFtqKzJdID0gKGlucHV0W2ldID4+IDE2KTsKKwkJb3V0cHV0W2orM10gPSAoaW5wdXRbaV0gPj4gMjQpOworCX0KK30KKy8qIERlY29kZXMgaW5wdXQgKHVuc2lnbmVkIGNoYXIpIGludG8gb3V0cHV0ICh1aW50MzJfdCkuCisgKiBBc3N1bWVzIGxlbiBpcyBhIG11bHRpcGxlIG9mIDQuICovCitzdGF0aWMgdm9pZAorbWVtY3B5MzJfbGUyY3B1KHVpbnQzMl90ICpvdXRwdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCB1bnNpZ25lZCBsZW4pCit7CisJdW5zaWduZWQgaSwgajsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaiA8IGxlbjsgaSsrLCBqICs9IDQpCisJCW91dHB1dFtpXSA9ICgodWludDMyX3QpaW5wdXRbal0pCisJCQl8ICgoKHVpbnQzMl90KWlucHV0W2orMV0pIDw8IDgpCisJCQl8ICgoKHVpbnQzMl90KWlucHV0W2orMl0pIDw8IDE2KQorCQkJfCAoKCh1aW50MzJfdClpbnB1dFtqKzNdKSA8PCAyNCk7Cit9CisjZW5kaWYgLyogaTM4NiAqLworCisvKiBGLCBHLCBIIGFuZCBJIGFyZSBiYXNpYyBNRDUgZnVuY3Rpb25zLiAqLworI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICh+KHgpICYgKHopKSkKKyNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgfih6KSkpCisjZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8IH4oeikpKQorCisvKiByb3RsMzIgcm90YXRlcyB4IGxlZnQgbiBiaXRzLiAqLworI2RlZmluZSByb3RsMzIoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpCisKKy8qCisgKiBGRiwgR0csIEhILCBhbmQgSUkgdHJhbnNmb3JtYXRpb25zIGZvciByb3VuZHMgMSwgMiwgMywgYW5kIDQuCisgKiBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbi4KKyAqLworI2RlZmluZSBGRihhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCisJKGEpICs9IEYoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAodWludDMyX3QpKGFjKTsgXAorCShhKSA9IHJvdGwzMigoYSksIChzKSk7IFwKKwkoYSkgKz0gKGIpOyBcCisJfQorI2RlZmluZSBHRyhhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCisJKGEpICs9IEcoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAodWludDMyX3QpKGFjKTsgXAorCShhKSA9IHJvdGwzMigoYSksIChzKSk7IFwKKwkoYSkgKz0gKGIpOyBcCisJfQorI2RlZmluZSBISChhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCisJKGEpICs9IEgoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAodWludDMyX3QpKGFjKTsgXAorCShhKSA9IHJvdGwzMigoYSksIChzKSk7IFwKKwkoYSkgKz0gKGIpOyBcCisJfQorI2RlZmluZSBJSShhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCisJKGEpICs9IEkoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAodWludDMyX3QpKGFjKTsgXAorCShhKSA9IHJvdGwzMigoYSksIChzKSk7IFwKKwkoYSkgKz0gKGIpOyBcCisJfQorCisvKiBNRDUgYmFzaWMgdHJhbnNmb3JtYXRpb24uIFRyYW5zZm9ybXMgc3RhdGUgYmFzZWQgb24gYmxvY2suICovCitzdGF0aWMgdm9pZCBtZDVfdHJhbnNmb3JtKHVpbnQzMl90IHN0YXRlWzRdLCBjb25zdCB1bnNpZ25lZCBjaGFyIGJsb2NrWzY0XSkKK3sKKwl1aW50MzJfdCBhLCBiLCBjLCBkLCB4WzE2XTsKKyNpZiBNRDVfU0laRV9WU19TUEVFRCA+IDEKKwl1aW50MzJfdCB0ZW1wOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBzOworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU1tdID0geworCQk3LCAxMiwgMTcsIDIyLAorCQk1LCA5LCAxNCwgMjAsCisJCTQsIDExLCAxNiwgMjMsCisJCTYsIDEwLCAxNSwgMjEKKwl9OworI2VuZGlmIC8qIE1ENV9TSVpFX1ZTX1NQRUVEID4gMSAqLworCisjaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPiAwCisJY29uc3QgdWludDMyX3QgKnBjOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBwOworCWludCBpOworCisJc3RhdGljIGNvbnN0IHVpbnQzMl90IENbXSA9IHsKKwkJLyogcm91bmQgMSAqLworCQkweGQ3NmFhNDc4LCAweGU4YzdiNzU2LCAweDI0MjA3MGRiLCAweGMxYmRjZWVlLAorCQkweGY1N2MwZmFmLCAweDQ3ODdjNjJhLCAweGE4MzA0NjEzLCAweGZkNDY5NTAxLAorCQkweDY5ODA5OGQ4LCAweDhiNDRmN2FmLCAweGZmZmY1YmIxLCAweDg5NWNkN2JlLAorCQkweDZiOTAxMTIyLCAweGZkOTg3MTkzLCAweGE2Nzk0MzhlLCAweDQ5YjQwODIxLAorCQkvKiByb3VuZCAyICovCisJCTB4ZjYxZTI1NjIsIDB4YzA0MGIzNDAsIDB4MjY1ZTVhNTEsIDB4ZTliNmM3YWEsCisJCTB4ZDYyZjEwNWQsIDB4MjQ0MTQ1MywgIDB4ZDhhMWU2ODEsIDB4ZTdkM2ZiYzgsCisJCTB4MjFlMWNkZTYsIDB4YzMzNzA3ZDYsIDB4ZjRkNTBkODcsIDB4NDU1YTE0ZWQsCisJCTB4YTllM2U5MDUsIDB4ZmNlZmEzZjgsIDB4Njc2ZjAyZDksIDB4OGQyYTRjOGEsCisJCS8qIHJvdW5kIDMgKi8KKwkJMHhmZmZhMzk0MiwgMHg4NzcxZjY4MSwgMHg2ZDlkNjEyMiwgMHhmZGU1MzgwYywKKwkJMHhhNGJlZWE0NCwgMHg0YmRlY2ZhOSwgMHhmNmJiNGI2MCwgMHhiZWJmYmM3MCwKKwkJMHgyODliN2VjNiwgMHhlYWExMjdmYSwgMHhkNGVmMzA4NSwgMHg0ODgxZDA1LAorCQkweGQ5ZDRkMDM5LCAweGU2ZGI5OWU1LCAweDFmYTI3Y2Y4LCAweGM0YWM1NjY1LAorCQkvKiByb3VuZCA0ICovCisJCTB4ZjQyOTIyNDQsIDB4NDMyYWZmOTcsIDB4YWI5NDIzYTcsIDB4ZmM5M2EwMzksCisJCTB4NjU1YjU5YzMsIDB4OGYwY2NjOTIsIDB4ZmZlZmY0N2QsIDB4ODU4NDVkZDEsCisJCTB4NmZhODdlNGYsIDB4ZmUyY2U2ZTAsIDB4YTMwMTQzMTQsIDB4NGUwODExYTEsCisJCTB4Zjc1MzdlODIsIDB4YmQzYWYyMzUsIDB4MmFkN2QyYmIsIDB4ZWI4NmQzOTEKKwl9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFBbXSA9IHsKKwkJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLyogMSAqLworCQkxLCA2LCAxMSwgMCwgNSwgMTAsIDE1LCA0LCA5LCAxNCwgMywgOCwgMTMsIDIsIDcsIDEyLCAvKiAyICovCisJCTUsIDgsIDExLCAxNCwgMSwgNCwgNywgMTAsIDEzLCAwLCAzLCA2LCA5LCAxMiwgMTUsIDIsIC8qIDMgKi8KKwkJMCwgNywgMTQsIDUsIDEyLCAzLCAxMCwgMSwgOCwgMTUsIDYsIDEzLCA0LCAxMSwgMiwgOSAgLyogNCAqLworCX07CisKKyNlbmRpZiAvKiBNRDVfU0laRV9WU19TUEVFRCA+IDAgKi8KKworCW1lbWNweTMyX2xlMmNwdSh4LCBibG9jaywgNjQpOworCisJYSA9IHN0YXRlWzBdOworCWIgPSBzdGF0ZVsxXTsKKwljID0gc3RhdGVbMl07CisJZCA9IHN0YXRlWzNdOworCisjaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPiAyCisJcGMgPSBDOworCXBwID0gUDsKKwlwcyA9IFMgLSA0OworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWlmICgoaSAmIDB4MGYpID09IDApIHBzICs9IDQ7CisJCXRlbXAgPSBhOworCQlzd2l0Y2ggKGk+PjQpIHsKKwkJCWNhc2UgMDoKKwkJCQl0ZW1wICs9IEYoYiwgYywgZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdGVtcCArPSBHKGIsIGMsIGQpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXRlbXAgKz0gSChiLCBjLCBkKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQl0ZW1wICs9IEkoYiwgYywgZCk7CisJCQkJYnJlYWs7CisJCX0KKwkJdGVtcCArPSB4WypwcCsrXSArICpwYysrOworCQl0ZW1wID0gcm90bDMyKHRlbXAsIHBzW2kgJiAzXSk7CisJCXRlbXAgKz0gYjsKKwkJYSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IHRlbXA7CisJfQorI2VsaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPiAxCisJcGMgPSBDOworCXBwID0gUDsKKwlwcyA9IFM7CisJLyogUm91bmQgMSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCUZGKGEsIGIsIGMsIGQsIHhbKnBwXSwgcHNbaSAmIDB4M10sICpwYyk7IHBwKys7IHBjKys7CisJCXRlbXAgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdGVtcDsKKwl9CisJLyogUm91bmQgMiAqLworCXBzICs9IDQ7CisJZm9yICg7IGkgPCAzMjsgaSsrKSB7CisJCUdHKGEsIGIsIGMsIGQsIHhbKnBwXSwgcHNbaSAmIDB4M10sICpwYyk7IHBwKys7IHBjKys7CisJCXRlbXAgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdGVtcDsKKwl9CisJLyogUm91bmQgMyAqLworCXBzICs9IDQ7CisJZm9yICg7IGkgPCA0ODsgaSsrKSB7CisJCUhIKGEsIGIsIGMsIGQsIHhbKnBwXSwgcHNbaSAmIDB4M10sICpwYyk7IHBwKys7IHBjKys7CisJCXRlbXAgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdGVtcDsKKwl9CisJLyogUm91bmQgNCAqLworCXBzICs9IDQ7CisJZm9yICg7IGkgPCA2NDsgaSsrKSB7CisJCUlJKGEsIGIsIGMsIGQsIHhbKnBwXSwgcHNbaSAmIDB4M10sICpwYyk7IHBwKys7IHBjKys7CisJCXRlbXAgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdGVtcDsKKwl9CisjZWxpZiBNRDVfU0laRV9WU19TUEVFRCA+IDAKKwlwYyA9IEM7CisJcHAgPSBQOworCS8qIFJvdW5kIDEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCUZGKGEsIGIsIGMsIGQsIHhbKnBwXSwgIDcsICpwYyk7IHBwKys7IHBjKys7CisJCUZGKGQsIGEsIGIsIGMsIHhbKnBwXSwgMTIsICpwYyk7IHBwKys7IHBjKys7CisJCUZGKGMsIGQsIGEsIGIsIHhbKnBwXSwgMTcsICpwYyk7IHBwKys7IHBjKys7CisJCUZGKGIsIGMsIGQsIGEsIHhbKnBwXSwgMjIsICpwYyk7IHBwKys7IHBjKys7CisJfQorCS8qIFJvdW5kIDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCUdHKGEsIGIsIGMsIGQsIHhbKnBwXSwgIDUsICpwYyk7IHBwKys7IHBjKys7CisJCUdHKGQsIGEsIGIsIGMsIHhbKnBwXSwgIDksICpwYyk7IHBwKys7IHBjKys7CisJCUdHKGMsIGQsIGEsIGIsIHhbKnBwXSwgMTQsICpwYyk7IHBwKys7IHBjKys7CisJCUdHKGIsIGMsIGQsIGEsIHhbKnBwXSwgMjAsICpwYyk7IHBwKys7IHBjKys7CisJfQorCS8qIFJvdW5kIDMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCUhIKGEsIGIsIGMsIGQsIHhbKnBwXSwgIDQsICpwYyk7IHBwKys7IHBjKys7CisJCUhIKGQsIGEsIGIsIGMsIHhbKnBwXSwgMTEsICpwYyk7IHBwKys7IHBjKys7CisJCUhIKGMsIGQsIGEsIGIsIHhbKnBwXSwgMTYsICpwYyk7IHBwKys7IHBjKys7CisJCUhIKGIsIGMsIGQsIGEsIHhbKnBwXSwgMjMsICpwYyk7IHBwKys7IHBjKys7CisJfQorCS8qIFJvdW5kIDQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCUlJKGEsIGIsIGMsIGQsIHhbKnBwXSwgIDYsICpwYyk7IHBwKys7IHBjKys7CisJCUlJKGQsIGEsIGIsIGMsIHhbKnBwXSwgMTAsICpwYyk7IHBwKys7IHBjKys7CisJCUlJKGMsIGQsIGEsIGIsIHhbKnBwXSwgMTUsICpwYyk7IHBwKys7IHBjKys7CisJCUlJKGIsIGMsIGQsIGEsIHhbKnBwXSwgMjEsICpwYyk7IHBwKys7IHBjKys7CisJfQorI2Vsc2UKKwkvKiBSb3VuZCAxICovCisjZGVmaW5lIFMxMSA3CisjZGVmaW5lIFMxMiAxMgorI2RlZmluZSBTMTMgMTcKKyNkZWZpbmUgUzE0IDIyCisJRkYoYSwgYiwgYywgZCwgeFsgMF0sIFMxMSwgMHhkNzZhYTQ3OCk7IC8qIDEgKi8KKwlGRihkLCBhLCBiLCBjLCB4WyAxXSwgUzEyLCAweGU4YzdiNzU2KTsgLyogMiAqLworCUZGKGMsIGQsIGEsIGIsIHhbIDJdLCBTMTMsIDB4MjQyMDcwZGIpOyAvKiAzICovCisJRkYoYiwgYywgZCwgYSwgeFsgM10sIFMxNCwgMHhjMWJkY2VlZSk7IC8qIDQgKi8KKwlGRihhLCBiLCBjLCBkLCB4WyA0XSwgUzExLCAweGY1N2MwZmFmKTsgLyogNSAqLworCUZGKGQsIGEsIGIsIGMsIHhbIDVdLCBTMTIsIDB4NDc4N2M2MmEpOyAvKiA2ICovCisJRkYoYywgZCwgYSwgYiwgeFsgNl0sIFMxMywgMHhhODMwNDYxMyk7IC8qIDcgKi8KKwlGRihiLCBjLCBkLCBhLCB4WyA3XSwgUzE0LCAweGZkNDY5NTAxKTsgLyogOCAqLworCUZGKGEsIGIsIGMsIGQsIHhbIDhdLCBTMTEsIDB4Njk4MDk4ZDgpOyAvKiA5ICovCisJRkYoZCwgYSwgYiwgYywgeFsgOV0sIFMxMiwgMHg4YjQ0ZjdhZik7IC8qIDEwICovCisJRkYoYywgZCwgYSwgYiwgeFsxMF0sIFMxMywgMHhmZmZmNWJiMSk7IC8qIDExICovCisJRkYoYiwgYywgZCwgYSwgeFsxMV0sIFMxNCwgMHg4OTVjZDdiZSk7IC8qIDEyICovCisJRkYoYSwgYiwgYywgZCwgeFsxMl0sIFMxMSwgMHg2YjkwMTEyMik7IC8qIDEzICovCisJRkYoZCwgYSwgYiwgYywgeFsxM10sIFMxMiwgMHhmZDk4NzE5Myk7IC8qIDE0ICovCisJRkYoYywgZCwgYSwgYiwgeFsxNF0sIFMxMywgMHhhNjc5NDM4ZSk7IC8qIDE1ICovCisJRkYoYiwgYywgZCwgYSwgeFsxNV0sIFMxNCwgMHg0OWI0MDgyMSk7IC8qIDE2ICovCisJLyogUm91bmQgMiAqLworI2RlZmluZSBTMjEgNQorI2RlZmluZSBTMjIgOQorI2RlZmluZSBTMjMgMTQKKyNkZWZpbmUgUzI0IDIwCisJR0coYSwgYiwgYywgZCwgeFsgMV0sIFMyMSwgMHhmNjFlMjU2Mik7IC8qIDE3ICovCisJR0coZCwgYSwgYiwgYywgeFsgNl0sIFMyMiwgMHhjMDQwYjM0MCk7IC8qIDE4ICovCisJR0coYywgZCwgYSwgYiwgeFsxMV0sIFMyMywgMHgyNjVlNWE1MSk7IC8qIDE5ICovCisJR0coYiwgYywgZCwgYSwgeFsgMF0sIFMyNCwgMHhlOWI2YzdhYSk7IC8qIDIwICovCisJR0coYSwgYiwgYywgZCwgeFsgNV0sIFMyMSwgMHhkNjJmMTA1ZCk7IC8qIDIxICovCisJR0coZCwgYSwgYiwgYywgeFsxMF0sIFMyMiwgIDB4MjQ0MTQ1Myk7IC8qIDIyICovCisJR0coYywgZCwgYSwgYiwgeFsxNV0sIFMyMywgMHhkOGExZTY4MSk7IC8qIDIzICovCisJR0coYiwgYywgZCwgYSwgeFsgNF0sIFMyNCwgMHhlN2QzZmJjOCk7IC8qIDI0ICovCisJR0coYSwgYiwgYywgZCwgeFsgOV0sIFMyMSwgMHgyMWUxY2RlNik7IC8qIDI1ICovCisJR0coZCwgYSwgYiwgYywgeFsxNF0sIFMyMiwgMHhjMzM3MDdkNik7IC8qIDI2ICovCisJR0coYywgZCwgYSwgYiwgeFsgM10sIFMyMywgMHhmNGQ1MGQ4Nyk7IC8qIDI3ICovCisJR0coYiwgYywgZCwgYSwgeFsgOF0sIFMyNCwgMHg0NTVhMTRlZCk7IC8qIDI4ICovCisJR0coYSwgYiwgYywgZCwgeFsxM10sIFMyMSwgMHhhOWUzZTkwNSk7IC8qIDI5ICovCisJR0coZCwgYSwgYiwgYywgeFsgMl0sIFMyMiwgMHhmY2VmYTNmOCk7IC8qIDMwICovCisJR0coYywgZCwgYSwgYiwgeFsgN10sIFMyMywgMHg2NzZmMDJkOSk7IC8qIDMxICovCisJR0coYiwgYywgZCwgYSwgeFsxMl0sIFMyNCwgMHg4ZDJhNGM4YSk7IC8qIDMyICovCisJLyogUm91bmQgMyAqLworI2RlZmluZSBTMzEgNAorI2RlZmluZSBTMzIgMTEKKyNkZWZpbmUgUzMzIDE2CisjZGVmaW5lIFMzNCAyMworCUhIKGEsIGIsIGMsIGQsIHhbIDVdLCBTMzEsIDB4ZmZmYTM5NDIpOyAvKiAzMyAqLworCUhIKGQsIGEsIGIsIGMsIHhbIDhdLCBTMzIsIDB4ODc3MWY2ODEpOyAvKiAzNCAqLworCUhIKGMsIGQsIGEsIGIsIHhbMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpOyAvKiAzNSAqLworCUhIKGIsIGMsIGQsIGEsIHhbMTRdLCBTMzQsIDB4ZmRlNTM4MGMpOyAvKiAzNiAqLworCUhIKGEsIGIsIGMsIGQsIHhbIDFdLCBTMzEsIDB4YTRiZWVhNDQpOyAvKiAzNyAqLworCUhIKGQsIGEsIGIsIGMsIHhbIDRdLCBTMzIsIDB4NGJkZWNmYTkpOyAvKiAzOCAqLworCUhIKGMsIGQsIGEsIGIsIHhbIDddLCBTMzMsIDB4ZjZiYjRiNjApOyAvKiAzOSAqLworCUhIKGIsIGMsIGQsIGEsIHhbMTBdLCBTMzQsIDB4YmViZmJjNzApOyAvKiA0MCAqLworCUhIKGEsIGIsIGMsIGQsIHhbMTNdLCBTMzEsIDB4Mjg5YjdlYzYpOyAvKiA0MSAqLworCUhIKGQsIGEsIGIsIGMsIHhbIDBdLCBTMzIsIDB4ZWFhMTI3ZmEpOyAvKiA0MiAqLworCUhIKGMsIGQsIGEsIGIsIHhbIDNdLCBTMzMsIDB4ZDRlZjMwODUpOyAvKiA0MyAqLworCUhIKGIsIGMsIGQsIGEsIHhbIDZdLCBTMzQsICAweDQ4ODFkMDUpOyAvKiA0NCAqLworCUhIKGEsIGIsIGMsIGQsIHhbIDldLCBTMzEsIDB4ZDlkNGQwMzkpOyAvKiA0NSAqLworCUhIKGQsIGEsIGIsIGMsIHhbMTJdLCBTMzIsIDB4ZTZkYjk5ZTUpOyAvKiA0NiAqLworCUhIKGMsIGQsIGEsIGIsIHhbMTVdLCBTMzMsIDB4MWZhMjdjZjgpOyAvKiA0NyAqLworCUhIKGIsIGMsIGQsIGEsIHhbIDJdLCBTMzQsIDB4YzRhYzU2NjUpOyAvKiA0OCAqLworCS8qIFJvdW5kIDQgKi8KKyNkZWZpbmUgUzQxIDYKKyNkZWZpbmUgUzQyIDEwCisjZGVmaW5lIFM0MyAxNQorI2RlZmluZSBTNDQgMjEKKwlJSShhLCBiLCBjLCBkLCB4WyAwXSwgUzQxLCAweGY0MjkyMjQ0KTsgLyogNDkgKi8KKwlJSShkLCBhLCBiLCBjLCB4WyA3XSwgUzQyLCAweDQzMmFmZjk3KTsgLyogNTAgKi8KKwlJSShjLCBkLCBhLCBiLCB4WzE0XSwgUzQzLCAweGFiOTQyM2E3KTsgLyogNTEgKi8KKwlJSShiLCBjLCBkLCBhLCB4WyA1XSwgUzQ0LCAweGZjOTNhMDM5KTsgLyogNTIgKi8KKwlJSShhLCBiLCBjLCBkLCB4WzEyXSwgUzQxLCAweDY1NWI1OWMzKTsgLyogNTMgKi8KKwlJSShkLCBhLCBiLCBjLCB4WyAzXSwgUzQyLCAweDhmMGNjYzkyKTsgLyogNTQgKi8KKwlJSShjLCBkLCBhLCBiLCB4WzEwXSwgUzQzLCAweGZmZWZmNDdkKTsgLyogNTUgKi8KKwlJSShiLCBjLCBkLCBhLCB4WyAxXSwgUzQ0LCAweDg1ODQ1ZGQxKTsgLyogNTYgKi8KKwlJSShhLCBiLCBjLCBkLCB4WyA4XSwgUzQxLCAweDZmYTg3ZTRmKTsgLyogNTcgKi8KKwlJSShkLCBhLCBiLCBjLCB4WzE1XSwgUzQyLCAweGZlMmNlNmUwKTsgLyogNTggKi8KKwlJSShjLCBkLCBhLCBiLCB4WyA2XSwgUzQzLCAweGEzMDE0MzE0KTsgLyogNTkgKi8KKwlJSShiLCBjLCBkLCBhLCB4WzEzXSwgUzQ0LCAweDRlMDgxMWExKTsgLyogNjAgKi8KKwlJSShhLCBiLCBjLCBkLCB4WyA0XSwgUzQxLCAweGY3NTM3ZTgyKTsgLyogNjEgKi8KKwlJSShkLCBhLCBiLCBjLCB4WzExXSwgUzQyLCAweGJkM2FmMjM1KTsgLyogNjIgKi8KKwlJSShjLCBkLCBhLCBiLCB4WyAyXSwgUzQzLCAweDJhZDdkMmJiKTsgLyogNjMgKi8KKwlJSShiLCBjLCBkLCBhLCB4WyA5XSwgUzQ0LCAweGViODZkMzkxKTsgLyogNjQgKi8KKyNlbmRpZgorCisJc3RhdGVbMF0gKz0gYTsKKwlzdGF0ZVsxXSArPSBiOworCXN0YXRlWzJdICs9IGM7CisJc3RhdGVbM10gKz0gZDsKKworCS8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLworCW1lbXNldCh4LCAwLCBzaXplb2YoeCkpOworfQorCisKKy8qIE1ENSBpbml0aWFsaXphdGlvbi4gKi8KK3ZvaWQgRkFTVF9GVU5DIG1kNV9iZWdpbihtZDVfY3R4X3QgKmNvbnRleHQpCit7CisJY29udGV4dC0+Y291bnRbMF0gPSBjb250ZXh0LT5jb3VudFsxXSA9IDA7CisJLyogTG9hZCBtYWdpYyBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuICAqLworCWNvbnRleHQtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKwljb250ZXh0LT5zdGF0ZVsxXSA9IDB4ZWZjZGFiODk7CisJY29udGV4dC0+c3RhdGVbMl0gPSAweDk4YmFkY2ZlOworCWNvbnRleHQtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKK30KKworLyoKKyAqIE1ENSBibG9jayB1cGRhdGUgb3BlcmF0aW9uLiBDb250aW51ZXMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0CisgKiBvcGVyYXRpb24sIHByb2Nlc3NpbmcgYW5vdGhlciBtZXNzYWdlIGJsb2NrLCBhbmQgdXBkYXRpbmcKKyAqIHRoZSBjb250ZXh0LgorICovCit2b2lkIEZBU1RfRlVOQyBtZDVfaGFzaChjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBpbnB1dExlbiwgbWQ1X2N0eF90ICpjb250ZXh0KQoreworCXVuc2lnbmVkIGksIGlkeCwgcGFydExlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCA9IGJ1ZmZlcjsKKworCS8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLworCWlkeCA9IChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDB4M0Y7CisKKwkvKiBVcGRhdGUgbnVtYmVyIG9mIGJpdHMgKi8KKwljb250ZXh0LT5jb3VudFswXSArPSAoaW5wdXRMZW4gPDwgMyk7CisJaWYgKGNvbnRleHQtPmNvdW50WzBdIDwgKGlucHV0TGVuIDw8IDMpKQorCQljb250ZXh0LT5jb3VudFsxXSsrOworCWNvbnRleHQtPmNvdW50WzFdICs9IChpbnB1dExlbiA+PiAyOSk7CisKKwkvKiBUcmFuc2Zvcm0gYXMgbWFueSB0aW1lcyBhcyBwb3NzaWJsZS4gKi8KKwlpID0gMDsKKwlwYXJ0TGVuID0gNjQgLSBpZHg7CisJaWYgKGlucHV0TGVuID49IHBhcnRMZW4pIHsKKwkJbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbaWR4XSwgaW5wdXQsIHBhcnRMZW4pOworCQltZDVfdHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOworCQlmb3IgKGkgPSBwYXJ0TGVuOyBpICsgNjMgPCBpbnB1dExlbjsgaSArPSA2NCkKKwkJCW1kNV90cmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsICZpbnB1dFtpXSk7CisJCWlkeCA9IDA7CisJfQorCisJLyogQnVmZmVyIHJlbWFpbmluZyBpbnB1dCAqLworCW1lbWNweSgmY29udGV4dC0+YnVmZmVyW2lkeF0sICZpbnB1dFtpXSwgaW5wdXRMZW4gLSBpKTsKK30KKworLyoKKyAqIE1ENSBmaW5hbGl6YXRpb24uIEVuZHMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0IG9wZXJhdGlvbiwKKyAqIHdyaXRpbmcgdGhlIG1lc3NhZ2UgZGlnZXN0LgorICovCit2b2lkIEZBU1RfRlVOQyBtZDVfZW5kKHZvaWQgKmRpZ2VzdCwgbWQ1X2N0eF90ICpjb250ZXh0KQoreworCXVuc2lnbmVkIGlkeCwgcGFkTGVuOworCXVuc2lnbmVkIGNoYXIgYml0c1s4XTsKKwl1bnNpZ25lZCBjaGFyIHBhZGRpbmdbNjRdOworCisJLyogQWRkIHBhZGRpbmcgZm9sbG93ZWQgYnkgb3JpZ2luYWwgbGVuZ3RoLiAqLworCW1lbXNldChwYWRkaW5nLCAwLCBzaXplb2YocGFkZGluZykpOworCXBhZGRpbmdbMF0gPSAweDgwOworCS8qIHNhdmUgbnVtYmVyIG9mIGJpdHMgKi8KKwltZW1jcHkzMl9jcHUybGUoYml0cywgY29udGV4dC0+Y291bnQsIDgpOworCS8qIHBhZCBvdXQgdG8gNTYgbW9kIDY0ICovCisJaWR4ID0gKGNvbnRleHQtPmNvdW50WzBdID4+IDMpICYgMHgzZjsKKwlwYWRMZW4gPSAoaWR4IDwgNTYpID8gKDU2IC0gaWR4KSA6ICgxMjAgLSBpZHgpOworCW1kNV9oYXNoKHBhZGRpbmcsIHBhZExlbiwgY29udGV4dCk7CisJLyogYXBwZW5kIGxlbmd0aCAoYmVmb3JlIHBhZGRpbmcpICovCisJbWQ1X2hhc2goYml0cywgOCwgY29udGV4dCk7CisKKwkvKiBTdG9yZSBzdGF0ZSBpbiBkaWdlc3QgKi8KKwltZW1jcHkzMl9jcHUybGUoZGlnZXN0LCBjb250ZXh0LT5zdGF0ZSwgMTYpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvaGVycm9yX21zZy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvaGVycm9yX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDEwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9oZXJyb3JfbXNnLmMKQEAgLTAsMCArMSwyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGJiX2hlcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCWJiX3ZlcnJvcl9tc2cocywgcCwgaHN0cmVycm9yKGhfZXJybm8pKTsKKwl2YV9lbmQocCk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX2hlcnJvcl9tc2dfYW5kX2RpZShjb25zdCBjaGFyICpzLCAuLi4pCit7CisJdmFfbGlzdCBwOworCisJdmFfc3RhcnQocCwgcyk7CisJYmJfdmVycm9yX21zZyhzLCBwLCBoc3RyZXJyb3IoaF9lcnJubykpOworCXZhX2VuZChwKTsKKwl4ZnVuY19kaWUoKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2h1bWFuX3JlYWRhYmxlLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9odW1hbl9yZWFkYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjJiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9odW1hbl9yZWFkYWJsZS5jCkBAIC0wLDAgKzEsMTk3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBKdW5lIDMwLCAyMDAxICAgICAgICAgICAgICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogQWxsLWludGVnZXIgdmVyc2lvbiAoaGV5LCBub3QgZXZlcnlvbmUgaGFzIGZsb2F0aW5nIHBvaW50KSBvZgorICogbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIsIG1vZGlmaWVkIGZyb20gc2ltaWxhciBjb2RlIEkgaGFkIHdyaXR0ZW4KKyAqIGZvciBidXN5Ym94IHNldmVyYWwgbW9udGhzIGFnby4KKyAqCisgKiBOb3RlczoKKyAqICAgMSkgSSdtIHVzaW5nIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyB0byBob2xkIHRoZSBwcm9kdWN0IHNpemUgKiBibG9ja19zaXplLAorICogICAgICBhcyBkZiAod2hpY2ggY2FsbHMgdGhpcyByb3V0aW5lKSBjb3VsZCByZXF1ZXN0IGEgcmVwcmVzZW50YXRpb24gb2YgYQorICogICAgICBwYXJ0aXRpb24gc2l6ZSBpbiBieXRlcyA+IG1heCBvZiB1bnNpZ25lZCBsb25nLiAgSWYgbG9uZyBsb25ncyBhcmVuJ3QKKyAqICAgICAgYXZhaWxhYmxlLCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBkbyB3aGF0J3MgbmVlZGVkIHVzaW5nIHBvbHlub21pYWwKKyAqICAgICAgcmVwcmVzZW50YXRpb25zIChzYXksIHBvd2VycyBvZiAxMDI0KSBhbmQgbWFuaXB1bGF0aW5nIGNvZWZmaWNpZW50cy4KKyAqICAgICAgVGhlIGJhc2UgdGVuICJieXRlcyIgb3V0cHV0IGNvdWxkIGJlIGhhbmRsZWQgc2ltaWxhcmx5LgorICoKKyAqICAgMikgVGhpcyByb3V0aW5lIGFsd2F5cyBvdXRwdXRzIGEgZGVjaW1hbCBwb2ludCBhbmQgYSB0ZW50aHMgZGlnaXQgd2hlbgorICogICAgICBkaXNwbGF5X3VuaXQgIT0gMC4gIEhlbmNlLCBpdCBpc24ndCB1bmNvbW1vbiBmb3IgdGhlIHJldHVybmVkIHN0cmluZworICogICAgICB0byBoYXZlIGEgbGVuZ3RoIG9mIDUgb3IgNi4KKyAqCisgKiAgICAgIEl0IG1pZ2h0IGJlIG5pY2UgdG8gYWRkIGEgZmxhZyB0byBpbmRpY2F0ZSBubyBkZWNpbWFsIGRpZ2l0cyBpbgorICogICAgICB0aGF0IGNhc2UuICBUaGlzIGNvdWxkIGJlIGVpdGhlciBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciwgb3IgYQorICogICAgICBzcGVjaWFsIHZhbHVlIG9mIGRpc3BsYXlfdW5pdC4gIFN1Y2ggYSBmbGFnIHdvdWxkIGFsc28gYmUgbmljZSBmb3IgZHUuCisgKgorICogICAgICBTb21lIGNvZGUgdG8gb21pdCB0aGUgZGVjaW1hbCBwb2ludCBhbmQgdGVudGhzIGRpZ2l0IGlzIHNrZXRjaGVkIG91dAorICogICAgICBhbmQgIiNpZiAwIidkIGJlbG93LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBtYWtlX2h1bWFuX3JlYWRhYmxlX3N0cih1bnNpZ25lZCBsb25nIGxvbmcgdmFsLAorCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgdW5zaWduZWQgbG9uZyBkaXNwbGF5X3VuaXQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdW5pdF9jaGFyc1tdIEFMSUdOMSA9IHsKKwkJJ1wwJywgJ0snLCAnTScsICdHJywgJ1QnLCAnUCcsICdFJywgJ1onLCAnWScKKwl9OworCisJc3RhdGljIGNoYXIgKnN0cjsKKworCXVuc2lnbmVkIGZyYWM7IC8qIDAuLjkgLSB0aGUgZnJhY3Rpb25hbCBkaWdpdCAqLworCWNvbnN0IGNoYXIgKnU7CisJY29uc3QgY2hhciAqZm10OworCisJaWYgKHZhbCA9PSAwKQorCQlyZXR1cm4gIjAiOworCisJZm10ID0gIiVsbHUiOworCWlmIChibG9ja19zaXplID4gMSkKKwkJdmFsICo9IGJsb2NrX3NpemU7CisJZnJhYyA9IDA7CisJdSA9IHVuaXRfY2hhcnM7CisKKwlpZiAoZGlzcGxheV91bml0KSB7CisJCXZhbCArPSBkaXNwbGF5X3VuaXQvMjsgIC8qIERlYWwgd2l0aCByb3VuZGluZyAqLworCQl2YWwgLz0gZGlzcGxheV91bml0OyAgICAvKiBEb24ndCBjb21iaW5lIHdpdGggdGhlIGxpbmUgYWJvdmUhICovCisJCS8qIHdpbGwganVzdCBwcmludCBpdCBhcyB1bG9uZ2xvbmcgKGJlbG93KSAqLworCX0gZWxzZSB7CisJCXdoaWxlICgodmFsID49IDEwMjQpCisJCSAvKiAmJiAodSA8IHVuaXRfY2hhcnMgKyBzaXplb2YodW5pdF9jaGFycykgLSAxKSAtIGFsd2F5cyB0cnVlICovCisJCSkgeworCQkJZm10ID0gIiVsbHUuJXUlYyI7CisJCQl1Kys7CisJCQlmcmFjID0gKCgodW5zaWduZWQpdmFsICUgMTAyNCkgKiAxMCArIDEwMjQvMikgLyAxMDI0OworCQkJdmFsIC89IDEwMjQ7CisJCX0KKwkJaWYgKGZyYWMgPj0gMTApIHsgLyogd2UgbmVlZCB0byByb3VuZCB1cCBoZXJlICovCisJCQkrK3ZhbDsKKwkJCWZyYWMgPSAwOworCQl9CisjaWYgMQorCQkvKiBJZiBibG9ja19zaXplIGlzIDAsIGRvbnQgcHJpbnQgZnJhY3Rpb25hbCBwYXJ0ICovCisJCWlmIChibG9ja19zaXplID09IDApIHsKKwkJCWlmIChmcmFjID49IDUpIHsKKwkJCQkrK3ZhbDsKKwkJCX0KKwkJCWZtdCA9ICIlbGx1JSpjIjsKKwkJCWZyYWMgPSAxOworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoIXN0cikgeworCQkvKiBzdWZmaWNpZW50IGZvciBhbnkgd2lkdGggb2YgdmFsICovCisJCXN0ciA9IHhtYWxsb2Moc2l6ZW9mKHZhbCkqMyArIDIgKyAzKTsKKwl9CisJc3ByaW50ZihzdHIsIGZtdCwgdmFsLCBmcmFjLCAqdSk7CisJcmV0dXJuIHN0cjsKK30KKworCisvKiB2ZGEncyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNpbWlsYXIgaWRlYSAqLworCisvKiBDb252ZXJ0IHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSBpbnRvIGNvbXBhY3QgNS1jaGFyIHJlcHJlc2VudGF0aW9uLgorICogU3RyaW5nIGlzIG5vdCB0ZXJtaW5hdGVkIChidWZbNV0gaXMgdW50b3VjaGVkKSAqLwordm9pZCBGQVNUX0ZVTkMgc21hcnRfdWxsdG9hNSh1bnNpZ25lZCBsb25nIGxvbmcgdWwsIGNoYXIgYnVmWzVdLCBjb25zdCBjaGFyICpzY2FsZSkKK3sKKwljb25zdCBjaGFyICpmbXQ7CisJY2hhciBjOworCXVuc2lnbmVkIHYsIHUsIGlkeCA9IDA7CisKKwlpZiAodWwgPiA5OTk5OSkgeyAvLyBkbyBub3Qgc2NhbGUgaWYgOTk5OTkgb3IgbGVzcworCQl1bCAqPSAxMDsKKwkJZG8geworCQkJdWwgLz0gMTAyNDsKKwkJCWlkeCsrOworCQl9IHdoaWxlICh1bCA+PSAxMDAwMDApOworCX0KKwl2ID0gdWw7IC8vIHVsbG9uZyBkaXZpc2lvbnMgYXJlIGV4cGVuc2l2ZSwgYXZvaWQgdGhlbQorCisJZm10ID0gIiAxMjM0NTY3ODkiOworCXUgPSB2IC8gMTA7CisJdiA9IHYgJSAxMDsKKwlpZiAoIWlkeCkgeworCQkvLyA5OTk5OSBvciBsZXNzOiB1c2UgIjEyMzQ1IiBmb3JtYXQKKwkJLy8gdSBpcyB2YWx1ZS8xMCwgdiBpcyBsYXN0IGRpZ2l0CisJCWMgPSBidWZbMF0gPSAiIDEyMzQ1Njc4OSJbdS8xMDAwXTsKKwkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCWMgPSBidWZbMV0gPSBmbXRbdS8xMDAlMTBdOworCQlpZiAoYyAhPSAnICcpIGZtdCA9ICIwMTIzNDU2Nzg5IjsKKwkJYyA9IGJ1ZlsyXSA9IGZtdFt1LzEwJTEwXTsKKwkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCWJ1ZlszXSA9IGZtdFt1JTEwXTsKKwkJYnVmWzRdID0gIjAxMjM0NTY3ODkiW3ZdOworCX0gZWxzZSB7CisJCS8vIHZhbHVlIGhhcyBiZWVuIHNjYWxlZCBpbnRvIDAuLjk5OTkuOSByYW5nZQorCQkvLyB1IGlzIHZhbHVlLCB2IGlzIDEvMTB0aHMgKGFsbG93cyBmb3IgOTIuMU0gZm9ybWF0KQorCQlpZiAodSA+PSAxMDApIHsKKwkJCS8vIHZhbHVlIGlzID49IDEwMDogdXNlICIxMjM0TScsICIgMTIzTSIgZm9ybWF0cworCQkJYyA9IGJ1ZlswXSA9ICIgMTIzNDU2Nzg5Ilt1LzEwMDBdOworCQkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCQljID0gYnVmWzFdID0gZm10W3UvMTAwJTEwXTsKKwkJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQkJdiA9IHUgJSAxMDsKKwkJCXUgPSB1IC8gMTA7CisJCQlidWZbMl0gPSBmbXRbdSUxMF07CisJCX0gZWxzZSB7CisJCQkvLyB2YWx1ZSBpcyA8IDEwMDogdXNlICI5Mi4xTSIgZm9ybWF0CisJCQljID0gYnVmWzBdID0gIiAxMjM0NTY3ODkiW3UvMTBdOworCQkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCQlidWZbMV0gPSBmbXRbdSUxMF07CisJCQlidWZbMl0gPSAnLic7CisJCX0KKwkJYnVmWzNdID0gIjAxMjM0NTY3ODkiW3ZdOworCQlidWZbNF0gPSBzY2FsZVtpZHhdOyAvKiB0eXBpY2FsbHkgc2NhbGUgPSAiIGttZ3QuLi4iICovCisJfQorfQorCisvKiBDb252ZXJ0IHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSBpbnRvIGNvbXBhY3QgNC1jaGFyCisgKiByZXByZXNlbnRhdGlvbi4gRXhhbXBsZXM6ICIxMjM0IiwgIjEuMmsiLCAiIDI3TSIsICIxMjNUIgorICogU3RyaW5nIGlzIG5vdCB0ZXJtaW5hdGVkIChidWZbNF0gaXMgdW50b3VjaGVkKSAqLwordm9pZCBGQVNUX0ZVTkMgc21hcnRfdWxsdG9hNCh1bnNpZ25lZCBsb25nIGxvbmcgdWwsIGNoYXIgYnVmWzRdLCBjb25zdCBjaGFyICpzY2FsZSkKK3sKKwljb25zdCBjaGFyICpmbXQ7CisJY2hhciBjOworCXVuc2lnbmVkIHYsIHUsIGlkeCA9IDA7CisKKwlpZiAodWwgPiA5OTk5KSB7IC8vIGRvIG5vdCBzY2FsZSBpZiA5OTk5IG9yIGxlc3MKKwkJdWwgKj0gMTA7CisJCWRvIHsKKwkJCXVsIC89IDEwMjQ7CisJCQlpZHgrKzsKKwkJfSB3aGlsZSAodWwgPj0gMTAwMDApOworCX0KKwl2ID0gdWw7IC8vIHVsbG9uZyBkaXZpc2lvbnMgYXJlIGV4cGVuc2l2ZSwgYXZvaWQgdGhlbQorCisJZm10ID0gIiAxMjM0NTY3ODkiOworCXUgPSB2IC8gMTA7CisJdiA9IHYgJSAxMDsKKwlpZiAoIWlkeCkgeworCQkvLyA5OTk5IG9yIGxlc3M6IHVzZSAiMTIzNCIgZm9ybWF0CisJCS8vIHUgaXMgdmFsdWUvMTAsIHYgaXMgbGFzdCBkaWdpdAorCQljID0gYnVmWzBdID0gIiAxMjM0NTY3ODkiW3UvMTAwXTsKKwkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCWMgPSBidWZbMV0gPSBmbXRbdS8xMCUxMF07CisJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQlidWZbMl0gPSBmbXRbdSUxMF07CisJCWJ1ZlszXSA9ICIwMTIzNDU2Nzg5Ilt2XTsKKwl9IGVsc2UgeworCQkvLyB1IGlzIHZhbHVlLCB2IGlzIDEvMTB0aHMgKGFsbG93cyBmb3IgOS4yTSBmb3JtYXQpCisJCWlmICh1ID49IDEwKSB7CisJCQkvLyB2YWx1ZSBpcyA+PSAxMDogdXNlICIxMjNNJywgIiAxMk0iIGZvcm1hdHMKKwkJCWMgPSBidWZbMF0gPSAiIDEyMzQ1Njc4OSJbdS8xMDBdOworCQkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCQl2ID0gdSAlIDEwOworCQkJdSA9IHUgLyAxMDsKKwkJCWJ1ZlsxXSA9IGZtdFt1JTEwXTsKKwkJfSBlbHNlIHsKKwkJCS8vIHZhbHVlIGlzIDwgMTA6IHVzZSAiOS4yTSIgZm9ybWF0CisJCQlidWZbMF0gPSAiMDEyMzQ1Njc4OSJbdV07CisJCQlidWZbMV0gPSAnLic7CisJCX0KKwkJYnVmWzJdID0gIjAxMjM0NTY3ODkiW3ZdOworCQlidWZbM10gPSBzY2FsZVtpZHhdOyAvKiB0eXBpY2FsbHkgc2NhbGUgPSAiIGttZ3QuLi4iICovCisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvaW5ldF9jb21tb24uYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2luZXRfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwOGRiOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2luZXRfY29tbW9uLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHN0b2xlbiBmcm9tIG5ldC10b29scy0xLjU5IGFuZCBzdHJpcHBlZCBkb3duIGZvciBidXN5Ym94IGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogSGVhdmlseSBtb2RpZmllZCBieSBNYW51ZWwgTm92b2EgSUlJICAgICAgIE1hciAxMiwgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiaW5ldF9jb21tb24uaCIKKworaW50IEZBU1RfRlVOQyBJTkVUX3Jlc29sdmUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyX2luICpzX2luLCBpbnQgaG9zdGZpcnN0KQoreworCXN0cnVjdCBob3N0ZW50ICpocDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9FVENfTkVUV09SS1MKKwlzdHJ1Y3QgbmV0ZW50ICpucDsKKyNlbmRpZgorCisJLyogR3JtcGYuIC1GdksgKi8KKwlzX2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzX2luLT5zaW5fcG9ydCA9IDA7CisKKwkvKiBEZWZhdWx0IGlzIHNwZWNpYWwsIG1lYW5pbmcgMC4wLjAuMC4gKi8KKwlpZiAoc3RyY21wKG5hbWUsICJkZWZhdWx0IikgPT0gMCkgeworCQlzX2luLT5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCQlyZXR1cm4gMTsKKwl9CisJLyogTG9vayB0byBzZWUgaWYgaXQncyBhIGRvdHRlZCBxdWFkLiAqLworCWlmIChpbmV0X2F0b24obmFtZSwgJnNfaW4tPnNpbl9hZGRyKSkgeworCQlyZXR1cm4gMDsKKwl9CisJLyogSWYgd2UgZXhwZWN0IHRoaXMgdG8gYmUgYSBob3N0bmFtZSwgdHJ5IGhvc3RuYW1lIGRhdGFiYXNlIGZpcnN0ICovCisjaWZkZWYgREVCVUcKKwlpZiAoaG9zdGZpcnN0KSB7CisJCWJiX2Vycm9yX21zZygiZ2V0aG9zdGJ5bmFtZSglcykiLCBuYW1lKTsKKwl9CisjZW5kaWYKKwlpZiAoaG9zdGZpcnN0KSB7CisJCWhwID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKKwkJaWYgKGhwICE9IE5VTEwpIHsKKwkJCW1lbWNweSgmc19pbi0+c2luX2FkZHIsIGhwLT5oX2FkZHJfbGlzdFswXSwKKwkJCQlzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0VUQ19ORVRXT1JLUworCS8qIFRyeSB0aGUgTkVUV09SS1MgZGF0YWJhc2UgdG8gc2VlIGlmIHRoaXMgaXMgYSBrbm93biBuZXR3b3JrLiAqLworI2lmZGVmIERFQlVHCisJYmJfZXJyb3JfbXNnKCJnZXRuZXRieW5hbWUoJXMpIiwgbmFtZSk7CisjZW5kaWYKKwlucCA9IGdldG5ldGJ5bmFtZShuYW1lKTsKKwlpZiAobnAgIT0gTlVMTCkgeworCQlzX2luLT5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChucC0+bl9uZXQpOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlpZiAoaG9zdGZpcnN0KSB7CisJCS8qIERvbid0IHRyeSBhZ2FpbiAqLworCQlyZXR1cm4gLTE7CisJfQorI2lmZGVmIERFQlVHCisJcmVzX2luaXQoKTsKKwlfcmVzLm9wdGlvbnMgfD0gUkVTX0RFQlVHOworCWJiX2Vycm9yX21zZygiZ2V0aG9zdGJ5bmFtZSglcykiLCBuYW1lKTsKKyNlbmRpZgorCWhwID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweSgmc19pbi0+c2luX2FkZHIsIGhwLT5oX2FkZHJfbGlzdFswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogbnVtZXJpYzogJiAweDgwMDA6IGRlZmF1bHQgaW5zdGVhZCBvZiAqLAorICogICAgICAgICAgJiAweDQwMDA6IGhvc3QgaW5zdGVhZCBvZiBuZXQsCisgKiAgICAgICAgICAmIDB4MGZmZjogZG9uJ3QgcmVzb2x2ZQorICovCitjaGFyKiBGQVNUX0ZVTkMgSU5FVF9ycmVzb2x2ZShzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNfaW4sIGludCBudW1lcmljLCB1aW50MzJfdCBuZXRtYXNrKQoreworCS8qIGFkZHItdG8tbmFtZSBjYWNoZSAqLworCXN0cnVjdCBhZGRyIHsKKwkJc3RydWN0IGFkZHIgKm5leHQ7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCQlpbnQgaG9zdDsKKwkJY2hhciBuYW1lWzFdOworCX07CisJc3RhdGljIHN0cnVjdCBhZGRyICpjYWNoZSA9IE5VTEw7CisKKwlzdHJ1Y3QgYWRkciAqcG47CisJY2hhciAqbmFtZTsKKwl1aW50MzJfdCBhZCwgaG9zdF9hZDsKKwlpbnQgaG9zdCA9IDA7CisKKwlpZiAoc19pbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisjaWZkZWYgREVCVUcKKwkJYmJfZXJyb3JfbXNnKCJycmVzb2x2ZTogdW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkgJWQhIiwKKwkJCQkgIHNfaW4tPnNpbl9mYW1pbHkpOworI2VuZGlmCisJCWVycm5vID0gRUFGTk9TVVBQT1JUOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYWQgPSBzX2luLT5zaW5fYWRkci5zX2FkZHI7CisjaWZkZWYgREVCVUcKKwliYl9lcnJvcl9tc2coInJyZXNvbHZlOiAlMDh4LCBtYXNrICUwOHgsIG51bSAlMDh4IiwgKHVuc2lnbmVkKWFkLCBuZXRtYXNrLCBudW1lcmljKTsKKyNlbmRpZgorCWlmIChhZCA9PSBJTkFERFJfQU5ZKSB7CisJCWlmICgobnVtZXJpYyAmIDB4MEZGRikgPT0gMCkgeworCQkJaWYgKG51bWVyaWMgJiAweDgwMDApCisJCQkJcmV0dXJuIHhzdHJkdXAoImRlZmF1bHQiKTsKKwkJCXJldHVybiB4c3RyZHVwKCIqIik7CisJCX0KKwl9CisJaWYgKG51bWVyaWMgJiAweDBGRkYpCisJCXJldHVybiB4c3RyZHVwKGluZXRfbnRvYShzX2luLT5zaW5fYWRkcikpOworCisJaWYgKChhZCAmICh+bmV0bWFzaykpICE9IDAgfHwgKG51bWVyaWMgJiAweDQwMDApKQorCQlob3N0ID0gMTsKKwlwbiA9IGNhY2hlOworCXdoaWxlIChwbikgeworCQlpZiAocG4tPmFkZHIuc2luX2FkZHIuc19hZGRyID09IGFkICYmIHBuLT5ob3N0ID09IGhvc3QpIHsKKyNpZmRlZiBERUJVRworCQkJYmJfZXJyb3JfbXNnKCJycmVzb2x2ZTogZm91bmQgJXMgJTA4eCBpbiBjYWNoZSIsCisJCQkJCSAgKGhvc3QgPyAiaG9zdCIgOiAibmV0IiksICh1bnNpZ25lZClhZCk7CisjZW5kaWYKKwkJCXJldHVybiB4c3RyZHVwKHBuLT5uYW1lKTsKKwkJfQorCQlwbiA9IHBuLT5uZXh0OworCX0KKworCWhvc3RfYWQgPSBudG9obChhZCk7CisJbmFtZSA9IE5VTEw7CisJaWYgKGhvc3QpIHsKKwkJc3RydWN0IGhvc3RlbnQgKmVudDsKKyNpZmRlZiBERUJVRworCQliYl9lcnJvcl9tc2coImdldGhvc3RieWFkZHIgKCUwOHgpIiwgKHVuc2lnbmVkKWFkKTsKKyNlbmRpZgorCQllbnQgPSBnZXRob3N0YnlhZGRyKChjaGFyICopICZhZCwgNCwgQUZfSU5FVCk7CisJCWlmIChlbnQpCisJCQluYW1lID0geHN0cmR1cChlbnQtPmhfbmFtZSk7CisJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9FVENfTkVUV09SS1MpIHsKKwkJc3RydWN0IG5ldGVudCAqbnA7CisjaWZkZWYgREVCVUcKKwkJYmJfZXJyb3JfbXNnKCJnZXRuZXRieWFkZHIgKCUwOHgpIiwgKHVuc2lnbmVkKWhvc3RfYWQpOworI2VuZGlmCisJCW5wID0gZ2V0bmV0YnlhZGRyKGhvc3RfYWQsIEFGX0lORVQpOworCQlpZiAobnApCisJCQluYW1lID0geHN0cmR1cChucC0+bl9uYW1lKTsKKwl9CisJaWYgKCFuYW1lKQorCQluYW1lID0geHN0cmR1cChpbmV0X250b2Eoc19pbi0+c2luX2FkZHIpKTsKKwlwbiA9IHhtYWxsb2Moc2l6ZW9mKCpwbikgKyBzdHJsZW4obmFtZSkpOyAvKiBubyAnKyAxJywgaXQncyBhbHJlYWR5IGFjY291bnRlZCBmb3IgKi8KKwlwbi0+bmV4dCA9IGNhY2hlOworCXBuLT5hZGRyID0gKnNfaW47CisJcG4tPmhvc3QgPSBob3N0OworCXN0cmNweShwbi0+bmFtZSwgbmFtZSk7CisJY2FjaGUgPSBwbjsKKwlyZXR1cm4gbmFtZTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKworaW50IEZBU1RfRlVOQyBJTkVUNl9yZXNvbHZlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYpCit7CisJc3RydWN0IGFkZHJpbmZvIHJlcSwgKmFpID0gTlVMTDsKKwlpbnQgczsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJcmVxLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworCXMgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmcmVxLCAmYWkpOworCWlmIChzICE9IDApIHsKKwkJYmJfZXJyb3JfbXNnKCJnZXRhZGRyaW5mbzogJXM6ICVkIiwgbmFtZSwgcyk7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5KHNpbjYsIGFpLT5haV9hZGRyLCBzaXplb2YoKnNpbjYpKTsKKwlpZiAoYWkpCisJCWZyZWVhZGRyaW5mbyhhaSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgSU42X0lTX0FERFJfVU5TUEVDSUZJRUQKKyMgZGVmaW5lIElONl9JU19BRERSX1VOU1BFQ0lGSUVEKGEpIFwKKwkoKCh1aW50MzJfdCAqKSAoYSkpWzBdID09IDAgJiYgKCh1aW50MzJfdCAqKSAoYSkpWzFdID09IDAgJiYgXAorCSAoKHVpbnQzMl90ICopIChhKSlbMl0gPT0gMCAmJiAoKHVpbnQzMl90ICopIChhKSlbM10gPT0gMCkKKyNlbmRpZgorCisKK2NoYXIqIEZBU1RfRlVOQyBJTkVUNl9ycmVzb2x2ZShzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42LCBpbnQgbnVtZXJpYykKK3sKKwljaGFyIG5hbWVbMTI4XTsKKwlpbnQgczsKKworCWlmIChzaW42LT5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikgeworI2lmZGVmIERFQlVHCisJCWJiX2Vycm9yX21zZygicnJlc29sdmU6IHVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5ICVkISIsCisJCQkJICBzaW42LT5zaW42X2ZhbWlseSk7CisjZW5kaWYKKwkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAobnVtZXJpYyAmIDB4N0ZGRikgeworCQlpbmV0X250b3AoQUZfSU5FVDYsICZzaW42LT5zaW42X2FkZHIsIG5hbWUsIHNpemVvZihuYW1lKSk7CisJCXJldHVybiB4c3RyZHVwKG5hbWUpOworCX0KKwlpZiAoSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoJnNpbjYtPnNpbjZfYWRkcikpIHsKKwkJaWYgKG51bWVyaWMgJiAweDgwMDApCisJCQlyZXR1cm4geHN0cmR1cCgiZGVmYXVsdCIpOworCQlyZXR1cm4geHN0cmR1cCgiKiIpOworCX0KKworCXMgPSBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopIHNpbjYsIHNpemVvZigqc2luNiksCisJCQkJbmFtZSwgc2l6ZW9mKG5hbWUpLAorCQkJCS8qc2VydixzZXJ2bGVuOiovIE5VTEwsIDAsCisJCQkJMCk7CisJaWYgKHMgIT0gMCkgeworCQliYl9lcnJvcl9tc2coImdldG5hbWVpbmZvIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHhzdHJkdXAobmFtZSk7Cit9CisKKyNlbmRpZiAgLyogQ09ORklHX0ZFQVRVUkVfSVBWNiAqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvaW5mb19tc2cuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2luZm9fbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjYTJlZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2luZm9fbXNnLmMKQEAgLTAsMCArMSw2MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0cKKyMgaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKwordm9pZCBGQVNUX0ZVTkMgYmJfaW5mb19tc2coY29uc3QgY2hhciAqcywgLi4uKQoreworI2lmZGVmIFRISVNfT05FX0RPRVNOVF9ET19TSU5HTEVfV1JJVEUKKwl2YV9saXN0IHA7CisJLyogdmFfY29weSBpcyB1c2VkIGJlY2F1c2UgaXQgaXMgbm90IHBvcnRhYmxlCisJICogdG8gdXNlIHZhX2xpc3QgcCB0d2ljZSAqLworCXZhX2xpc3QgcDI7CisKKwl2YV9zdGFydChwLCBzKTsKKwl2YV9jb3B5KHAyLCBwKTsKKwlpZiAobG9nbW9kZSAmIExPR01PREVfU1RESU8pIHsKKwkJdnByaW50ZihzLCBwKTsKKwkJZnB1dHMobXNnX2VvbCwgc3Rkb3V0KTsKKwl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TWVNMT0cpCisJCXZzeXNsb2coTE9HX0lORk8sIHMsIHAyKTsKKyMgZW5kaWYKKwl2YV9lbmQocDIpOworCXZhX2VuZChwKTsKKyNlbHNlCisJaW50IHVzZWQ7CisJY2hhciAqbXNnOworCXZhX2xpc3QgcDsKKworCWlmIChsb2dtb2RlID09IDApCisJCXJldHVybjsKKworCXZhX3N0YXJ0KHAsIHMpOworCXVzZWQgPSB2YXNwcmludGYoJm1zZywgcywgcCk7CisJdmFfZW5kKHApOworCWlmICh1c2VkIDwgMCkKKwkJcmV0dXJuOworCisjIGlmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TWVNMT0cpCisJCXN5c2xvZyhMT0dfSU5GTywgIiVzIiwgbXNnKTsKKyMgZW5kaWYKKwlpZiAobG9nbW9kZSAmIExPR01PREVfU1RESU8pIHsKKwkJZmZsdXNoX2FsbCgpOworCQkvKiB1c2VkID0gc3RybGVuKG1zZyk7IC0gbXVzdCBiZSB0cnVlIGFscmVhZHkgKi8KKwkJbXNnW3VzZWQrK10gPSAnXG4nOworCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIG1zZywgdXNlZCk7CisJfQorCisJZnJlZShtc2cpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9pbm9kZV9oYXNoLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9pbm9kZV9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1NTM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2lub2RlX2hhc2guYwpAQCAtMCwwICsxLDg3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLgorICogSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZSBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgaW5vX2Rldl9oYXNoX2J1Y2tldF9zdHJ1Y3QgeworCXN0cnVjdCBpbm9fZGV2X2hhc2hfYnVja2V0X3N0cnVjdCAqbmV4dDsKKwlpbm9fdCBpbm87CisJZGV2X3QgZGV2OworCWNoYXIgbmFtZVsxXTsKK30gaW5vX2Rldl9oYXNodGFibGVfYnVja2V0X3Q7CisKKyNkZWZpbmUgSEFTSF9TSVpFICAgICAgMzExICAgLyogU2hvdWxkIGJlIHByaW1lICovCisjZGVmaW5lIGhhc2hfaW5vZGUoaSkgICgoaSkgJSBIQVNIX1NJWkUpCisKKy8qIGFycmF5IG9mIFtIQVNIX1NJWkVdIGVsZW1lbnRzICovCitzdGF0aWMgaW5vX2Rldl9oYXNodGFibGVfYnVja2V0X3QgKippbm9fZGV2X2hhc2h0YWJsZTsKKworLyoKKyAqIFJldHVybiBuYW1lIGlmIHN0YXRidWYtPnN0X2lubyAmJiBzdGF0YnVmLT5zdF9kZXYgYXJlIHJlY29yZGVkIGluCisgKiBpbm9fZGV2X2hhc2h0YWJsZSwgZWxzZSByZXR1cm4gTlVMTAorICovCitjaGFyKiBGQVNUX0ZVTkMgaXNfaW5faW5vX2Rldl9oYXNodGFibGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0YXRidWYpCit7CisJaW5vX2Rldl9oYXNodGFibGVfYnVja2V0X3QgKmJ1Y2tldDsKKworCWlmICghaW5vX2Rldl9oYXNodGFibGUpCisJCXJldHVybiBOVUxMOworCisJYnVja2V0ID0gaW5vX2Rldl9oYXNodGFibGVbaGFzaF9pbm9kZShzdGF0YnVmLT5zdF9pbm8pXTsKKwl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKKwkJaWYgKChidWNrZXQtPmlubyA9PSBzdGF0YnVmLT5zdF9pbm8pCisJCSAmJiAoYnVja2V0LT5kZXYgPT0gc3RhdGJ1Zi0+c3RfZGV2KQorCQkpIHsKKwkJCXJldHVybiBidWNrZXQtPm5hbWU7CisJCX0KKwkJYnVja2V0ID0gYnVja2V0LT5uZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogQWRkIHN0YXRidWYgdG8gc3RhdGJ1ZiBoYXNoIHRhYmxlICovCit2b2lkIEZBU1RfRlVOQyBhZGRfdG9faW5vX2Rldl9oYXNodGFibGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0YXRidWYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJaW5vX2Rldl9oYXNodGFibGVfYnVja2V0X3QgKmJ1Y2tldDsKKworCWkgPSBoYXNoX2lub2RlKHN0YXRidWYtPnN0X2lubyk7CisJaWYgKCFuYW1lKQorCQluYW1lID0gIiI7CisJYnVja2V0ID0geG1hbGxvYyhzaXplb2YoaW5vX2Rldl9oYXNodGFibGVfYnVja2V0X3QpICsgc3RybGVuKG5hbWUpKTsKKwlidWNrZXQtPmlubyA9IHN0YXRidWYtPnN0X2lubzsKKwlidWNrZXQtPmRldiA9IHN0YXRidWYtPnN0X2RldjsKKwlzdHJjcHkoYnVja2V0LT5uYW1lLCBuYW1lKTsKKworCWlmICghaW5vX2Rldl9oYXNodGFibGUpCisJCWlub19kZXZfaGFzaHRhYmxlID0geHphbGxvYyhIQVNIX1NJWkUgKiBzaXplb2YoKmlub19kZXZfaGFzaHRhYmxlKSk7CisKKwlidWNrZXQtPm5leHQgPSBpbm9fZGV2X2hhc2h0YWJsZVtpXTsKKwlpbm9fZGV2X2hhc2h0YWJsZVtpXSA9IGJ1Y2tldDsKK30KKworI2lmIEVOQUJMRV9EVSB8fCBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorLyogQ2xlYXIgc3RhdGJ1ZiBoYXNoIHRhYmxlICovCit2b2lkIEZBU1RfRlVOQyByZXNldF9pbm9fZGV2X2hhc2h0YWJsZSh2b2lkKQoreworCWludCBpOworCWlub19kZXZfaGFzaHRhYmxlX2J1Y2tldF90ICpidWNrZXQ7CisKKwlmb3IgKGkgPSAwOyBpbm9fZGV2X2hhc2h0YWJsZSAmJiBpIDwgSEFTSF9TSVpFOyBpKyspIHsKKwkJd2hpbGUgKGlub19kZXZfaGFzaHRhYmxlW2ldICE9IE5VTEwpIHsKKwkJCWJ1Y2tldCA9IGlub19kZXZfaGFzaHRhYmxlW2ldLT5uZXh0OworCQkJZnJlZShpbm9fZGV2X2hhc2h0YWJsZVtpXSk7CisJCQlpbm9fZGV2X2hhc2h0YWJsZVtpXSA9IGJ1Y2tldDsKKwkJfQorCX0KKwlmcmVlKGlub19kZXZfaGFzaHRhYmxlKTsKKwlpbm9fZGV2X2hhc2h0YWJsZSA9IE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2lzZGlyZWN0b3J5LmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9pc2RpcmVjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjFiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9pc2RpcmVjdG9yeS5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gc2FzaCwgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IERhdmlkIEkuIEJlbGwKKyAqIFBlcm1pc3Npb24gaGFzIGJlZW4gZ3JhbnRlZCB0byByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlIHVuZGVyIEdQTC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBmaWxlTmFtZSBpcyBhIGRpcmVjdG9yeS4KKyAqIE5vbmV4aXN0ZW50IGZpbGVzIHJldHVybiBGQUxTRS4KKyAqLworaW50IEZBU1RfRlVOQyBpc19kaXJlY3RvcnkoY29uc3QgY2hhciAqZmlsZU5hbWUsIGludCBmb2xsb3dMaW5rcywgc3RydWN0IHN0YXQgKnN0YXRCdWYpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgc3RhdCBhc3RhdEJ1ZjsKKworCWlmIChzdGF0QnVmID09IE5VTEwpIHsKKwkJLyogdXNlIGF1dG8gc3RhY2sgYnVmZmVyICovCisJCXN0YXRCdWYgPSAmYXN0YXRCdWY7CisJfQorCisJaWYgKGZvbGxvd0xpbmtzKQorCQlzdGF0dXMgPSBzdGF0KGZpbGVOYW1lLCBzdGF0QnVmKTsKKwllbHNlCisJCXN0YXR1cyA9IGxzdGF0KGZpbGVOYW1lLCBzdGF0QnVmKTsKKworCXN0YXR1cyA9IChzdGF0dXMgPT0gMCAmJiBTX0lTRElSKHN0YXRCdWYtPnN0X21vZGUpKTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9rZXJuZWxfdmVyc2lvbi5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIva2VybmVsX3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY4YTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIva2VybmVsX3ZlcnNpb24uYwpAQCAtMCwwICsxLDM4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4gIC8qIGZvciB1bmFtZSgyKSAqLworCisKKy8qIFJldHVybnMgY3VycmVudCBrZXJuZWwgdmVyc2lvbiBlbmNvZGVkIGFzIG1ham9yKjY1NTM2ICsgbWlub3IqMjU2ICsgcGF0Y2gsCisgKiBzbywgZm9yIGV4YW1wbGUsICB0byBjaGVjayBpZiB0aGUga2VybmVsIGlzIGdyZWF0ZXIgdGhhbiAyLjIuMTE6CisgKgorICogICAgIGlmIChnZXRfbGludXhfdmVyc2lvbl9jb2RlKCkgPiBLRVJORUxfVkVSU0lPTigyLDIsMTEpKSB7IDxzdHVmZj4gfQorICovCitpbnQgRkFTVF9GVU5DIGdldF9saW51eF92ZXJzaW9uX2NvZGUodm9pZCkKK3sKKwlzdHJ1Y3QgdXRzbmFtZSBuYW1lOworCWNoYXIgKnM7CisJaW50IGksIHI7CisKKwlpZiAodW5hbWUoJm5hbWUpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IGdldCBzeXN0ZW0gaW5mb3JtYXRpb24iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcyA9IG5hbWUucmVsZWFzZTsKKwlyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXIgPSByICogMjU2ICsgYXRvaShzdHJ0b2socywgIi4iKSk7CisJCXMgPSBOVUxMOworCX0KKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2xhc3RfY2hhcl9pcy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbGFzdF9jaGFyX2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlNmNkZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2xhc3RfY2hhcl9pcy5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJ1c3lib3ggbGlicmFyeSBlWHRlbmRlZCBmdW5jdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBMYXJyeSBEb29saXR0bGUsIDxsZG9vbGl0dEByZWN5Y2xlLmxibC5nb3Y+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRmluZCBvdXQgaWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIGEgc3RyaW5nIG1hdGNoZXMgdGhlIG9uZSBnaXZlbi4KKyAqIERvbid0IHVuZGVycnVuIHRoZSBidWZmZXIgaWYgdGhlIHN0cmluZyBsZW5ndGggaXMgMC4KKyAqLworY2hhciogRkFTVF9GVU5DIGxhc3RfY2hhcl9pcyhjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKwlpZiAocyAmJiAqcykgeworCQlzaXplX3Qgc3ogPSBzdHJsZW4ocykgLSAxOworCQlzICs9IHN6OworCQlpZiAoICh1bnNpZ25lZCBjaGFyKSpzID09IGMpCisJCQlyZXR1cm4gKGNoYXIqKXM7CisJfQorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvbGluZWVkaXQuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2xpbmVlZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhMzczYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL2xpbmVlZGl0LmMKQEAgLTAsMCArMSwyNjc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb21tYW5kIGxpbmUgZWRpdGluZy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODYtMjAwMyBtYXkgc2FmZWx5IGJlIGNvbnN1bWVkIGJ5IGEgQlNEIG9yIEdQTCBsaWNlbnNlLgorICogV3JpdHRlbiBieTogICBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogVXNlZCBpZGVhczoKKyAqICAgICAgQWRhbSBSb2dveXNraSAgICA8cm9nb3lza2lAY3MudXRleGFzLmVkdT4KKyAqICAgICAgRGF2ZSBDaW5lZ2UgICAgICA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgorICogICAgICBKYWt1YiBKZWxpbmVrIChjKSAxOTk1CisgKiAgICAgIEVyaWsgQW5kZXJzZW4gICAgPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gKE1ham9ybHkgYWRqdXN0ZWQgZm9yIGJ1c3lib3gpCisgKgorICogVGhpcyBjb2RlIGlzICdhcyBpcycgd2l0aCBubyB3YXJyYW50eS4KKyAqLworCisvKgorICogVXNhZ2UgYW5kIGtub3duIGJ1Z3M6CisgKiBUZXJtaW5hbCBrZXkgY29kZXMgYXJlIG5vdCBleHRlbnNpdmUsIG1vcmUgbmVlZHMgdG8gYmUgYWRkZWQuCisgKiBUaGlzIHZlcnNpb24gd2FzIGNyZWF0ZWQgb24gRGViaWFuIEdOVS9MaW51eCAyLnguCisgKiBEZWxldGUsIEJhY2tzcGFjZSwgSG9tZSwgRW5kLCBhbmQgdGhlIGFycm93IGtleXMgd2VyZSB0ZXN0ZWQKKyAqIHRvIHdvcmsgaW4gYW4gWHRlcm0gYW5kIGNvbnNvbGUuIEN0cmwtQSBhbHNvIHdvcmtzIGFzIEhvbWUuCisgKiBDdHJsLUUgYWxzbyB3b3JrcyBhcyBFbmQuCisgKgorICogVGhlIGZvbGxvd2luZyByZWFkbGluZS1saWtlIGNvbW1hbmRzIGFyZSBub3QgaW1wbGVtZW50ZWQ6CisgKiBFU0MtYiAtLSBNb3ZlIGJhY2sgb25lIHdvcmQKKyAqIEVTQy1mIC0tIE1vdmUgZm9yd2FyZCBvbmUgd29yZAorICogRVNDLWQgLS0gRGVsZXRlIGZvcndhcmQgb25lIHdvcmQKKyAqIENUTC10IC0tIFRyYW5zcG9zZSB0d28gY2hhcmFjdGVycworICoKKyAqIGxpbmVlZGl0IGRvZXMgbm90IGtub3cgdGhhdCB0aGUgdGVybWluYWwgZXNjYXBlIHNlcXVlbmNlcyBkbyBub3QKKyAqIHRha2UgdXAgc3BhY2Ugb24gdGhlIHNjcmVlbi4gVGhlIHJlZGlzcGxheSBjb2RlIGFzc3VtZXMsIHVubGVzcworICogdG9sZCBvdGhlcndpc2UsIHRoYXQgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIHByb21wdCBpcyBhIHByaW50YWJsZQorICogY2hhcmFjdGVyIHRoYXQgdGFrZXMgdXAgb25lIGNoYXJhY3RlciBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuLgorICogWW91IG5lZWQgdG8gdGVsbCBsaW5lZWRpdCB0aGF0IHNvbWUgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMKKyAqIGluIHRoZSBwcm9tcHQgdGFrZSB1cCBubyBzY3JlZW4gc3BhY2UuIENvbXBhdGlibHkgd2l0aCByZWFkbGluZSwKKyAqIHVzZSB0aGUgXFsgZXNjYXBlIHRvIGJlZ2luIGEgc2VxdWVuY2Ugb2Ygbm9uLXByaW50aW5nIGNoYXJhY3RlcnMsCisgKiBhbmQgdGhlIFxdIGVzY2FwZSB0byBzaWduYWwgdGhlIGVuZCBvZiBzdWNoIGEgc2VxdWVuY2UuIEV4YW1wbGU6CisgKgorICogUFMxPSdcW1wwMzNbMDE7MzJtXF1cdUBcaFxbXDAzM1swMTszNG1cXSBcdyBcJFxbXDAzM1swMG1cXSAnCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKyNpZm5kZWYgX1BPU0lYX1ZESVNBQkxFCisjIGRlZmluZSBfUE9TSVhfVkRJU0FCTEUgJ1wwJworI2VuZGlmCisKKworI2lmZGVmIFRFU1QKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcgMAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04gMAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiAwCisjZW5kaWYKKworCisvKiBFbnRpcmUgZmlsZSAoZXhjZXB0IFRFU1RpbmcgcGFydCkgc2l0cyBpbnNpZGUgdGhpcyAjaWYgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HCisKKworI2RlZmluZSBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUiBcCisJKEVOQUJMRV9GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04gfHwgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQpCisjZGVmaW5lIElGX1VTRVJOQU1FX09SX0hPTUVESVIoLi4uKQorI2lmIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSCisjIHVuZGVmIElGX1VTRVJOQU1FX09SX0hPTUVESVIKKyMgZGVmaW5lIElGX1VTRVJOQU1FX09SX0hPTUVESVIoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKworI3VuZGVmIENIQVJfVAorI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKyMgZGVmaW5lIEJCX05VTCAoKHdjaGFyX3QpMCkKKyMgZGVmaW5lIENIQVJfVCB3Y2hhcl90CitzdGF0aWMgYm9vbCBCQl9pc3NwYWNlKENIQVJfVCBjKSB7IHJldHVybiAoKHVuc2lnbmVkKWMgPCAyNTYgJiYgaXNzcGFjZShjKSk7IH0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSQorc3RhdGljIGJvb2wgQkJfaXNhbG51bShDSEFSX1QgYykgeyByZXR1cm4gKCh1bnNpZ25lZCljIDwgMjU2ICYmIGlzYWxudW0oYykpOyB9CisjIGVuZGlmCitzdGF0aWMgYm9vbCBCQl9pc3B1bmN0KENIQVJfVCBjKSB7IHJldHVybiAoKHVuc2lnbmVkKWMgPCAyNTYgJiYgaXNwdW5jdChjKSk7IH0KKyMgdW5kZWYgaXNzcGFjZQorIyB1bmRlZiBpc2FsbnVtCisjIHVuZGVmIGlzcHVuY3QKKyMgdW5kZWYgaXNwcmludAorIyBkZWZpbmUgaXNzcGFjZSBpc3NwYWNlX211c3Rfbm90X2JlX3VzZWQKKyMgZGVmaW5lIGlzYWxudW0gaXNhbG51bV9tdXN0X25vdF9iZV91c2VkCisjIGRlZmluZSBpc3B1bmN0IGlzcHVuY3RfbXVzdF9ub3RfYmVfdXNlZAorIyBkZWZpbmUgaXNwcmludCBpc3ByaW50X211c3Rfbm90X2JlX3VzZWQKKyNlbHNlCisjIGRlZmluZSBCQl9OVUwgJ1wwJworIyBkZWZpbmUgQ0hBUl9UIGNoYXIKKyMgZGVmaW5lIEJCX2lzc3BhY2UoYykgaXNzcGFjZShjKQorIyBkZWZpbmUgQkJfaXNhbG51bShjKSBpc2FsbnVtKGMpCisjIGRlZmluZSBCQl9pc3B1bmN0KGMpIGlzcHVuY3QoYykKKyNlbmRpZgorI2lmIEVOQUJMRV9VTklDT0RFX1BSRVNFUlZFX0JST0tFTgorIyBkZWZpbmUgdW5pY29kZV9tYXJrX3Jhd19ieXRlKHdjKSAgICgod2MpIHwgMHgyMDAwMDAwMCkKKyMgZGVmaW5lIHVuaWNvZGVfaXNfcmF3X2J5dGUod2MpICAgICAoKHdjKSAmIDB4MjAwMDAwMDApCisjZWxzZQorIyBkZWZpbmUgdW5pY29kZV9pc19yYXdfYnl0ZSh3YykgICAgIDAKKyNlbmRpZgorCisKKyNkZWZpbmUgRVNDICJcMDMzIgorCisjZGVmaW5lIFNFUV9DTEVBUl9USUxMX0VORF9PRl9TQ1JFRU4gIEVTQyJbSiIKKy8vI2RlZmluZSBTRVFfQ0xFQVJfVElMTF9FTkRfT0ZfTElORSAgRVNDIltLIgorCisKK2VudW0geworCU1BWF9MSU5FTEVOID0gQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOIDwgMHg3ZmYwCisJICAgICAgICAgICAgICA/IENPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTgorCSAgICAgICAgICAgICAgOiAweDdmZjAKK307CisKKyNpZiBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUgorc3RhdGljIGNvbnN0IGNoYXIgbnVsbF9zdHJbXSBBTElHTjEgPSAiIjsKKyNlbmRpZgorCisvKiBXZSB0cnkgdG8gbWluaW1pemUgYm90aCBzdGF0aWMgYW5kIHN0YWNrIHVzYWdlLiAqLworc3RydWN0IGxpbmVlZGl0X3N0YXRpY3MgeworCWxpbmVfaW5wdXRfdCAqc3RhdGU7CisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjbWRlZGl0X3Rlcm13OyAvKiA9IDgwOyAqLyAvKiBhY3R1YWwgdGVybWluYWwgd2lkdGggKi8KKwlzaWdoYW5kbGVyX3QgcHJldmlvdXNfU0lHV0lOQ0hfaGFuZGxlcjsKKworCXVuc2lnbmVkIGNtZGVkaXRfeDsgICAgICAgIC8qIHJlYWwgeCAoY29sKSB0ZXJtaW5hbCBwb3NpdGlvbiAqLworCXVuc2lnbmVkIGNtZGVkaXRfeTsgICAgICAgIC8qIHBzZXVkb3JlYWwgeSAocm93KSB0ZXJtaW5hbCBwb3NpdGlvbiAqLworCXVuc2lnbmVkIGNtZGVkaXRfcHJtdF9sZW47IC8qIGxlbmd0aCBvZiBwcm9tcHQgKHdpdGhvdXQgY29sb3JzIGV0YykgKi8KKworCXVuc2lnbmVkIGN1cnNvcjsKKwlpbnQgY29tbWFuZF9sZW47IC8qIG11c3QgYmUgc2lnbmVkICovCisJLyogc2lnbmVkIG1heHNpemU6IHdlIHdhbnQgeCBpbiAiaWYgKHggPiBTLm1heHNpemUpIgorCSAqIHRvIF9ub3RfIGJlIHByb21vdGVkIHRvIHVuc2lnbmVkICovCisJaW50IG1heHNpemU7CisJQ0hBUl9UICpjb21tYW5kX3BzOworCisJY29uc3QgY2hhciAqY21kZWRpdF9wcm9tcHQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKKwlpbnQgbnVtX29rX2xpbmVzOyAvKiA9IDE7ICovCisjZW5kaWYKKworI2lmIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSCisJY2hhciAqdXNlcl9idWY7CisJY2hhciAqaG9tZV9wd2RfYnVmOyAvKiA9IChjaGFyKiludWxsX3N0cjsgKi8KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwljaGFyICoqbWF0Y2hlczsKKwl1bnNpZ25lZCBudW1fbWF0Y2hlczsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSQorIyBkZWZpbmUgREVMQlVGU0laIDEyOAorCUNIQVJfVCAqZGVscHRyOworCXNtYWxsaW50IG5ld2RlbGZsYWc7ICAgICAvKiB3aGV0aGVyIGRlbGJ1ZiBzaG91bGQgYmUgcmV1c2VkIHlldCAqLworCUNIQVJfVCBkZWxidWZbREVMQlVGU0laXTsgIC8qIGEgcGxhY2UgdG8gc3RvcmUgZGVsZXRlZCBjaGFyYWN0ZXJzICovCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTAorCXNtYWxsaW50IHNlbnRfRVNDX2JyNm47CisjZW5kaWYKK307CisKKy8qIFNlZSBsaW5lZWRpdF9wdHJfaGFjay5jICovCitleHRlcm4gc3RydWN0IGxpbmVlZGl0X3N0YXRpY3MgKmNvbnN0IGxpbmVlZGl0X3B0cl90b19zdGF0aWNzOworCisjZGVmaW5lIFMgKCpsaW5lZWRpdF9wdHJfdG9fc3RhdGljcykKKyNkZWZpbmUgc3RhdGUgICAgICAgICAgICAoUy5zdGF0ZSAgICAgICAgICAgKQorI2RlZmluZSBjbWRlZGl0X3Rlcm13ICAgIChTLmNtZGVkaXRfdGVybXcgICApCisjZGVmaW5lIHByZXZpb3VzX1NJR1dJTkNIX2hhbmRsZXIgKFMucHJldmlvdXNfU0lHV0lOQ0hfaGFuZGxlcikKKyNkZWZpbmUgY21kZWRpdF94ICAgICAgICAoUy5jbWRlZGl0X3ggICAgICAgKQorI2RlZmluZSBjbWRlZGl0X3kgICAgICAgIChTLmNtZGVkaXRfeSAgICAgICApCisjZGVmaW5lIGNtZGVkaXRfcHJtdF9sZW4gKFMuY21kZWRpdF9wcm10X2xlbikKKyNkZWZpbmUgY3Vyc29yICAgICAgICAgICAoUy5jdXJzb3IgICAgICAgICAgKQorI2RlZmluZSBjb21tYW5kX2xlbiAgICAgIChTLmNvbW1hbmRfbGVuICAgICApCisjZGVmaW5lIGNvbW1hbmRfcHMgICAgICAgKFMuY29tbWFuZF9wcyAgICAgICkKKyNkZWZpbmUgY21kZWRpdF9wcm9tcHQgICAoUy5jbWRlZGl0X3Byb21wdCAgKQorI2RlZmluZSBudW1fb2tfbGluZXMgICAgIChTLm51bV9va19saW5lcyAgICApCisjZGVmaW5lIHVzZXJfYnVmICAgICAgICAgKFMudXNlcl9idWYgICAgICAgICkKKyNkZWZpbmUgaG9tZV9wd2RfYnVmICAgICAoUy5ob21lX3B3ZF9idWYgICAgKQorI2RlZmluZSBtYXRjaGVzICAgICAgICAgIChTLm1hdGNoZXMgICAgICAgICApCisjZGVmaW5lIG51bV9tYXRjaGVzICAgICAgKFMubnVtX21hdGNoZXMgICAgICkKKyNkZWZpbmUgZGVscHRyICAgICAgICAgICAoUy5kZWxwdHIgICAgICAgICAgKQorI2RlZmluZSBuZXdkZWxmbGFnICAgICAgIChTLm5ld2RlbGZsYWcgICAgICApCisjZGVmaW5lIGRlbGJ1ZiAgICAgICAgICAgKFMuZGVsYnVmICAgICAgICAgICkKKworI2RlZmluZSBJTklUX1MoKSBkbyB7IFwKKwkoKihzdHJ1Y3QgbGluZWVkaXRfc3RhdGljcyoqKSZsaW5lZWRpdF9wdHJfdG9fc3RhdGljcykgPSB4emFsbG9jKHNpemVvZihTKSk7IFwKKwliYXJyaWVyKCk7IFwKKwljbWRlZGl0X3Rlcm13ID0gODA7IFwKKwlJRl9GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUKG51bV9va19saW5lcyA9IDE7KSBcCisJSUZfVVNFUk5BTUVfT1JfSE9NRURJUihob21lX3B3ZF9idWYgPSAoY2hhciopbnVsbF9zdHI7KSBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBkZWluaXRfUyh2b2lkKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUCisJLyogVGhpcyBvbmUgaXMgYWxsb2NhdGVkIG9ubHkgaWYgRkFOQ1lfUFJPTVBUIGlzIG9uCisJICogKG90aGVyd2lzZSBpdCBwb2ludHMgdG8gdmVyYmF0aW0gcHJvbXB0IChOT1QgbWFsbG9jZWQpKSAqLworCWZyZWUoKGNoYXIqKWNtZGVkaXRfcHJvbXB0KTsKKyNlbmRpZgorI2lmIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSCisJZnJlZSh1c2VyX2J1Zik7CisJaWYgKGhvbWVfcHdkX2J1ZiAhPSBudWxsX3N0cikKKwkJZnJlZShob21lX3B3ZF9idWYpOworI2VuZGlmCisJZnJlZShsaW5lZWRpdF9wdHJfdG9fc3RhdGljcyk7Cit9CisjZGVmaW5lIERFSU5JVF9TKCkgZGVpbml0X1MoKQorCisKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCitzdGF0aWMgc2l6ZV90IGxvYWRfc3RyaW5nKGNvbnN0IGNoYXIgKnNyYykKK3sKKwlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9PTikgeworCQlzc2l6ZV90IGxlbiA9IG1ic3Rvd2NzKGNvbW1hbmRfcHMsIHNyYywgUy5tYXhzaXplIC0gMSk7CisJCWlmIChsZW4gPCAwKQorCQkJbGVuID0gMDsKKwkJY29tbWFuZF9wc1tsZW5dID0gQkJfTlVMOworCQlyZXR1cm4gbGVuOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQl3aGlsZSAoc3JjW2ldICYmIGkgPCBTLm1heHNpemUgLSAxKSB7CisJCQljb21tYW5kX3BzW2ldID0gc3JjW2ldOworCQkJaSsrOworCQl9CisJCWNvbW1hbmRfcHNbaV0gPSBCQl9OVUw7CisJCXJldHVybiBpOworCX0KK30KK3N0YXRpYyB1bnNpZ25lZCBzYXZlX3N0cmluZyhjaGFyICpkc3QsIHVuc2lnbmVkIG1heHNpemUpCit7CisJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKyMgaWYgIUVOQUJMRV9VTklDT0RFX1BSRVNFUlZFX0JST0tFTgorCQlzc2l6ZV90IGxlbiA9IHdjc3RvbWJzKGRzdCwgY29tbWFuZF9wcywgbWF4c2l6ZSAtIDEpOworCQlpZiAobGVuIDwgMCkKKwkJCWxlbiA9IDA7CisJCWRzdFtsZW5dID0gJ1wwJzsKKwkJcmV0dXJuIGxlbjsKKyMgZWxzZQorCQl1bnNpZ25lZCBkc3Rwb3MgPSAwOworCQl1bnNpZ25lZCBzcmNwb3MgPSAwOworCisJCW1heHNpemUtLTsKKwkJd2hpbGUgKGRzdHBvcyA8IG1heHNpemUpIHsKKwkJCXdjaGFyX3Qgd2M7CisJCQlpbnQgbiA9IHNyY3BvczsKKworCQkJLyogQ29udmVydCB1cCB0byAxc3QgaW52YWxpZCBieXRlIChvciB1cCB0byBlbmQpICovCisJCQl3aGlsZSAoKHdjID0gY29tbWFuZF9wc1tzcmNwb3NdKSAhPSBCQl9OVUwKKwkJCSAgICAmJiAhdW5pY29kZV9pc19yYXdfYnl0ZSh3YykKKwkJCSkgeworCQkJCXNyY3BvcysrOworCQkJfQorCQkJY29tbWFuZF9wc1tzcmNwb3NdID0gQkJfTlVMOworCQkJbiA9IHdjc3RvbWJzKGRzdCArIGRzdHBvcywgY29tbWFuZF9wcyArIG4sIG1heHNpemUgLSBkc3Rwb3MpOworCQkJaWYgKG4gPCAwKSAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJCWJyZWFrOworCQkJZHN0cG9zICs9IG47CisJCQlpZiAod2MgPT0gQkJfTlVMKSAvKiB1c3VhbGx5IGlzICovCisJCQkJYnJlYWs7CisKKwkJCS8qIFdlIGRvIGhhdmUgaW52YWxpZCBieXRlIGhlcmUhICovCisJCQljb21tYW5kX3BzW3NyY3Bvc10gPSB3YzsgLyogcmVzdG9yZSBpdCAqLworCQkJc3JjcG9zKys7CisJCQlpZiAoZHN0cG9zID09IG1heHNpemUpCisJCQkJYnJlYWs7CisJCQlkc3RbZHN0cG9zKytdID0gKGNoYXIpIHdjOworCQl9CisJCWRzdFtkc3Rwb3NdID0gJ1wwJzsKKwkJcmV0dXJuIGRzdHBvczsKKyMgZW5kaWYKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJd2hpbGUgKChkc3RbaV0gPSBjb21tYW5kX3BzW2ldKSAhPSAwKQorCQkJaSsrOworCQlyZXR1cm4gaTsKKwl9Cit9CisvKiBJIHRob3VnaHQganVzdCBmcHV0d2MoYywgc3Rkb3V0KSB3b3VsZCB3b3JrLiBCdXQgbm8uLi4gKi8KK3N0YXRpYyB2b2lkIEJCX1BVVENIQVIod2NoYXJfdCBjKQoreworCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisJCWNoYXIgYnVmW01CX0NVUl9NQVggKyAxXTsKKwkJbWJzdGF0ZV90IG1ic3QgPSB7IDAgfTsKKwkJc3NpemVfdCBsZW4gPSB3Y3J0b21iKGJ1ZiwgYywgJm1ic3QpOworCQlpZiAobGVuID4gMCkgeworCQkJYnVmW2xlbl0gPSAnXDAnOworCQkJZnB1dHMoYnVmLCBzdGRvdXQpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSW4gdGhpcyBjYXNlLCBjIGlzIGFsd2F5cyBvbmUgYnl0ZSAqLworCQlwdXRjaGFyKGMpOworCX0KK30KKyMgaWYgRU5BQkxFX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyB8fCBFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUworc3RhdGljIHdjaGFyX3QgYWRqdXN0X3dpZHRoX2FuZF92YWxpZGF0ZV93Yyh1bnNpZ25lZCAqd2lkdGhfYWRqLCB3Y2hhcl90IHdjKQorIyBlbHNlCitzdGF0aWMgd2NoYXJfdCBhZGp1c3Rfd2lkdGhfYW5kX3ZhbGlkYXRlX3djKHdjaGFyX3Qgd2MpCisjICBkZWZpbmUgYWRqdXN0X3dpZHRoX2FuZF92YWxpZGF0ZV93Yyh3aWR0aF9hZGosIHdjKSBcCisJKCgqKHdpZHRoX2FkaikpKyssIGFkanVzdF93aWR0aF9hbmRfdmFsaWRhdGVfd2Mod2MpKQorIyBlbmRpZgoreworCWludCB3ID0gMTsKKworCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisJCWlmICh3YyA+IENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUikgeworCQkJLyogbm90ZTogYWxzbyB0cnVlIGZvciB1bmljb2RlX2lzX3Jhd19ieXRlKHdjKSAqLworCQkJZ290byBzdWJzdDsKKwkJfQorCQl3ID0gd2N3aWR0aCh3Yyk7CisJCWlmICgoRU5BQkxFX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyAmJiB3IDwgMCkKKwkJIHx8ICghRU5BQkxFX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyAmJiB3IDw9IDApCisJCSB8fCAoIUVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTICYmIHcgPiAxKQorCQkpIHsKKyBzdWJzdDoKKwkJCXcgPSAxOworCQkJd2MgPSBDT05GSUdfU1VCU1RfV0NIQVI7CisJCX0KKwl9CisKKyMgaWYgRU5BQkxFX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyB8fCBFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUworCSp3aWR0aF9hZGogKz0gdzsKKyNlbmRpZgorCXJldHVybiB3YzsKK30KKyNlbHNlIC8qICFVTklDT0RFICovCitzdGF0aWMgc2l6ZV90IGxvYWRfc3RyaW5nKGNvbnN0IGNoYXIgKnNyYykKK3sKKwlzYWZlX3N0cm5jcHkoY29tbWFuZF9wcywgc3JjLCBTLm1heHNpemUpOworCXJldHVybiBzdHJsZW4oY29tbWFuZF9wcyk7Cit9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBQl9DT01QTEVUSU9OCitzdGF0aWMgdm9pZCBzYXZlX3N0cmluZyhjaGFyICpkc3QsIHVuc2lnbmVkIG1heHNpemUpCit7CisJc2FmZV9zdHJuY3B5KGRzdCwgY29tbWFuZF9wcywgbWF4c2l6ZSk7Cit9CisjIGVuZGlmCisjIGRlZmluZSBCQl9QVVRDSEFSKGMpIGJiX3B1dGNoYXIoYykKKy8qIFNob3VsZCBuZXZlciBiZSBjYWxsZWQ6ICovCitpbnQgYWRqdXN0X3dpZHRoX2FuZF92YWxpZGF0ZV93Yyh1bnNpZ25lZCAqd2lkdGhfYWRqLCBpbnQgd2MpOworI2VuZGlmCisKKworLyogUHV0ICdjb21tYW5kX3BzW2N1cnNvcl0nLCBjdXJzb3IrKy4KKyAqIEFkdmFuY2UgY3Vyc29yIG9uIHNjcmVlbi4gSWYgd2UgcmVhY2hlZCByaWdodCBtYXJnaW4sIHNjcm9sbCB0ZXh0IHVwCisgKiBhbmQgcmVtb3ZlIHRlcm1pbmFsIG1hcmdpbiBlZmZlY3QgYnkgcHJpbnRpbmcgJ25leHRfY2hhcicgKi8KKyNkZWZpbmUgSEFDS19GT1JfV1JPTkdfV0lEVEggMQorc3RhdGljIHZvaWQgcHV0X2N1cl9nbHlwaF9hbmRfaW5jX2N1cnNvcih2b2lkKQoreworCUNIQVJfVCBjID0gY29tbWFuZF9wc1tjdXJzb3JdOworCXVuc2lnbmVkIHdpZHRoID0gMDsKKwlpbnQgb2ZzX3RvX3JpZ2h0OworCisJaWYgKGMgPT0gQkJfTlVMKSB7CisJCS8qIGVyYXNlIGNoYXJhY3RlciBhZnRlciBlbmQgb2YgaW5wdXQgc3RyaW5nICovCisJCWMgPSAnICc7CisJfSBlbHNlIHsKKwkJLyogYWR2YW5jZSBjdXJzb3Igb25seSBpZiB3ZSBhcmVuJ3QgYXQgdGhlIGVuZCB5ZXQgKi8KKwkJY3Vyc29yKys7CisJCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisJCQlJRl9VTklDT0RFX1dJREVfV0NIQVJTKHdpZHRoID0gY21kZWRpdF94OykKKwkJCWMgPSBhZGp1c3Rfd2lkdGhfYW5kX3ZhbGlkYXRlX3djKCZjbWRlZGl0X3gsIGMpOworCQkJSUZfVU5JQ09ERV9XSURFX1dDSEFSUyh3aWR0aCA9IGNtZGVkaXRfeCAtIHdpZHRoOykKKwkJfSBlbHNlIHsKKwkJCWNtZGVkaXRfeCsrOworCQl9CisJfQorCisJb2ZzX3RvX3JpZ2h0ID0gY21kZWRpdF94IC0gY21kZWRpdF90ZXJtdzsKKwlpZiAoIUVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTIHx8IG9mc190b19yaWdodCA8PSAwKSB7CisJCS8qIGMgZml0cyBvbiB0aGlzIGxpbmUgKi8KKwkJQkJfUFVUQ0hBUihjKTsKKwl9CisKKwlpZiAob2ZzX3RvX3JpZ2h0ID49IDApIHsKKwkJLyogd2UgZ28gdG8gdGhlIG5leHQgbGluZSAqLworI2lmIEhBQ0tfRk9SX1dST05HX1dJRFRICisJCS8qIFRoaXMgd29ya3MgYmV0dGVyIGlmIG91ciBpZGVhIG9mIHRlcm0gd2lkdGggaXMgd3JvbmcKKwkJICogYW5kIGl0IGlzIGFjdHVhbGx5IHdpZGVyIChvZnRlbiBoYXBwZW5zIG9uIHNlcmlhbCBsaW5lcykuCisJCSAqIFByaW50aW5nIENSLExGICpmb3JjZXMqIGN1cnNvciB0byBuZXh0IGxpbmUuCisJCSAqIE9UT0ggaWYgdGVybWluYWwgd2lkdGggaXMgY29ycmVjdCBBTkQgdGVybWluYWwgZG9lcyBOT1QKKwkJICogaGF2ZSBhdXRvbWFyZ2luIChJT1c6IGl0IGlzIG1vdmluZyBjdXJzb3IgdG8gbmV4dCBsaW5lCisJCSAqIGJ5IGl0c2VsZiAod2hpY2ggaXMgd3JvbmcgZm9yIFZULTEweCB0ZXJtaW5hbHMpKSwKKwkJICogdGhpcyB3aWxsIGJyZWFrIHRoaW5nczogdGhlcmUgd2lsbCBiZSBvbmUgZXh0cmEgZW1wdHkgbGluZSAqLworCQlwdXRzKCJcciIpOyAvKiArIGltcGxpY2l0ICdcbicgKi8KKyNlbHNlCisJCS8qIFZULTEweCB0ZXJtaW5hbHMgZG9uJ3Qgd3JhcCBjdXJzb3IgdG8gbmV4dCBsaW5lIHdoZW4gbGFzdCBjaGFyCisJCSAqIG9uIHRoZSBsaW5lIGlzIHByaW50ZWQgLSBjdXJzb3Igc3RheXMgIm92ZXIiIHRoaXMgY2hhci4KKwkJICogTmVlZCB0byBwcmludCBfbmV4dF8gY2hhciB0b28gKGZpcnN0IG9uZSB0byBhcHBlYXIgb24gbmV4dCBsaW5lKQorCQkgKiB0byBtYWtlIGN1cnNvciBtb3ZlIGRvd24gdG8gbmV4dCBsaW5lLgorCQkgKi8KKwkJLyogV29ya3Mgb2sgb25seSBpZiBjbWRlZGl0X3Rlcm13IGlzIGNvcnJlY3QuICovCisJCWMgPSBjb21tYW5kX3BzW2N1cnNvcl07CisJCWlmIChjID09IEJCX05VTCkKKwkJCWMgPSAnICc7CisJCUJCX1BVVENIQVIoYyk7CisJCWJiX3B1dGNoYXIoJ1xiJyk7CisjZW5kaWYKKwkJY21kZWRpdF95Kys7CisJCWlmICghRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMgfHwgb2ZzX3RvX3JpZ2h0ID09IDApIHsKKwkJCXdpZHRoID0gMDsKKwkJfSBlbHNlIHsgLyogb2ZzX3RvX3JpZ2h0ID4gMCAqLworCQkJLyogd2lkZSBjaGFyIGMgZGlkbid0IGZpdCBvbiBwcmV2IGxpbmUgKi8KKwkJCUJCX1BVVENIQVIoYyk7CisJCX0KKwkJY21kZWRpdF94ID0gd2lkdGg7CisJfQorfQorCisvKiBNb3ZlIHRvIGVuZCBvZiBsaW5lIChieSBwcmludGluZyBhbGwgY2hhcnMgdGlsbCB0aGUgZW5kKSAqLworc3RhdGljIHZvaWQgcHV0X3RpbGxfZW5kX2FuZF9hZHZfY3Vyc29yKHZvaWQpCit7CisJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuKQorCQlwdXRfY3VyX2dseXBoX2FuZF9pbmNfY3Vyc29yKCk7Cit9CisKKy8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KK3N0YXRpYyB2b2lkIGdvdG9fbmV3X2xpbmUodm9pZCkKK3sKKwlwdXRfdGlsbF9lbmRfYW5kX2Fkdl9jdXJzb3IoKTsKKwlpZiAoY21kZWRpdF94ICE9IDApCisJCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIGJlZXAodm9pZCkKK3sKKwliYl9wdXRjaGFyKCdcMDA3Jyk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9wcm9tcHQodm9pZCkKK3sKKwl1bnNpZ25lZCB3OworCisJZnB1dHMoY21kZWRpdF9wcm9tcHQsIHN0ZG91dCk7CisJZmZsdXNoX2FsbCgpOworCWN1cnNvciA9IDA7CisJdyA9IGNtZGVkaXRfdGVybXc7IC8qIHJlYWQgdm9sYXRpbGUgdmFyIG9uY2UgKi8KKwljbWRlZGl0X3kgPSBjbWRlZGl0X3BybXRfbGVuIC8gdzsgLyogbmV3IHF1YXNpcmVhbCB5ICovCisJY21kZWRpdF94ID0gY21kZWRpdF9wcm10X2xlbiAlIHc7Cit9CisKKy8qIE1vdmUgYmFjayBvbmUgY2hhcmFjdGVyICovCisvKiAob3B0aW1pemVkIGZvciBzbG93IHRlcm1pbmFscykgKi8KK3N0YXRpYyB2b2lkIGlucHV0X2JhY2t3YXJkKHVuc2lnbmVkIG51bSkKK3sKKwlpZiAobnVtID4gY3Vyc29yKQorCQludW0gPSBjdXJzb3I7CisJaWYgKG51bSA9PSAwKQorCQlyZXR1cm47CisJY3Vyc29yIC09IG51bTsKKworCWlmICgoRU5BQkxFX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyB8fCBFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUykKKwkgJiYgdW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9PTgorCSkgeworCQkvKiBjb3JyZWN0IE5VTSB0byBiZSBlcXVhbCB0byBfc2NyZWVuXyB3aWR0aCAqLworCQlpbnQgbiA9IG51bTsKKwkJbnVtID0gMDsKKwkJd2hpbGUgKC0tbiA+PSAwKQorCQkJYWRqdXN0X3dpZHRoX2FuZF92YWxpZGF0ZV93YygmbnVtLCBjb21tYW5kX3BzW2N1cnNvciArIG5dKTsKKwkJaWYgKG51bSA9PSAwKQorCQkJcmV0dXJuOworCX0KKworCWlmIChjbWRlZGl0X3ggPj0gbnVtKSB7CisJCWNtZGVkaXRfeCAtPSBudW07CisJCWlmIChudW0gPD0gNCkgeworCQkJLyogVGhpcyBpcyBsb25nZXIgYnkgNSBieXRlcyBvbiB4ODYuCisJCQkgKiBBbHNvIGdldHMgbWlzY29tcGlsZWQgZm9yIEFSTSB1c2VycworCQkJICogKGJ1c3lib3gubmV0L2J1Z3Mvdmlldy5waHA/aWQ9MjI3NCkuCisJCQkgKiBwcmludGYoKCJcYlxiXGJcYiIgKyA0KSAtIG51bSk7CisJCQkgKiByZXR1cm47CisJCQkgKi8KKwkJCWRvIHsKKwkJCQliYl9wdXRjaGFyKCdcYicpOworCQkJfSB3aGlsZSAoLS1udW0pOworCQkJcmV0dXJuOworCQl9CisJCXByaW50ZihFU0MiWyV1RCIsIG51bSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBOZWVkIHRvIGdvIG9uZSBvciBtb3JlIGxpbmVzIHVwICovCisJaWYgKEVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTKSB7CisJCS8qIFdpdGggd2lkZSBjaGFycywgaXQgaXMgaGFyZCB0byAiYmFja3RyYWNrIgorCQkgKiBhbmQgcmVsaWFibHkgZmlndXJlIG91dCB3aGVyZSB0byBwdXQgY3Vyc29yLgorCQkgKiBFeGFtcGxlICg8PiBpcyBhIHdpZGUgY2hhcjsgIyBpcyBhbiBvcmRpbmFyeSBjaGFyLCBfIGN1cnNvcik6CisJCSAqIHxwcm9tcHQ6IDw+PD4gfAorCQkgKiB8PD48Pjw+PD48Pjw+IHwKKwkJICogfF8gICAgICAgICAgICB8CisJCSAqIGFuZCB1c2VyIHByZXNzZXMgbGVmdCBhcnJvdy4gbnVtID0gMSwgY21kZWRpdF94ID0gMCwKKwkJICogV2UgbmVlZCB0byBnbyB1cCBvbmUgbGluZSwgYW5kIHRoZW4gLSBob3cgZG8gd2Uga25vdyB0aGF0CisJCSAqIHdlIG5lZWQgdG8gZ28gKjEwKiBwb3NpdGlvbnMgdG8gdGhlIHJpZ2h0PyBCZWNhdXNlCisJCSAqIHxwcm9tcHQ6IDw+Izw+fAorCQkgKiB8PD48Pjw+Izw+PD48PnwKKwkJICogfF8gICAgICAgICAgICB8CisJCSAqIGluIHRoaXMgc2l0dWF0aW9uIHdlIG5lZWQgdG8gZ28gKjExKiBwb3NpdGlvbnMgdG8gdGhlIHJpZ2h0LgorCQkgKgorCQkgKiBBIHNpbXBsZXIgdGhpbmcgdG8gZG8gaXMgdG8gcmVkcmF3IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RhcnQKKwkJICogdXAgdG8gbmV3IGN1cnNvciBwb3NpdGlvbiAod2hpY2ggaXMgYWxyZWFkeSBrbm93bik6CisJCSAqLworCQl1bnNpZ25lZCBzdl9jdXJzb3I7CisJCS8qIGdvIHRvIDFzdCBjb2x1bW47IGdvIHVwIHRvIGZpcnN0IGxpbmUgKi8KKwkJcHJpbnRmKCJcciIgRVNDIlsldUEiLCBjbWRlZGl0X3kpOworCQljbWRlZGl0X3kgPSAwOworCQlzdl9jdXJzb3IgPSBjdXJzb3I7CisJCXB1dF9wcm9tcHQoKTsgLyogc2V0cyBjdXJzb3IgdG8gMCAqLworCQl3aGlsZSAoY3Vyc29yIDwgc3ZfY3Vyc29yKQorCQkJcHV0X2N1cl9nbHlwaF9hbmRfaW5jX2N1cnNvcigpOworCX0gZWxzZSB7CisJCWludCBsaW5lc191cDsKKwkJdW5zaWduZWQgd2lkdGg7CisJCS8qIG51bSA9IGNoYXJzIHRvIGdvIGJhY2sgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGN1cnJlbnQgbGluZTogKi8KKwkJbnVtIC09IGNtZGVkaXRfeDsKKwkJd2lkdGggPSBjbWRlZGl0X3Rlcm13OyAvKiByZWFkIHZvbGF0aWxlIHZhciBvbmNlICovCisJCS8qIG51bT0xLi4udzogb25lIGxpbmUgdXAsIHcrMS4uLjJ3OiB0d28sIGV0YzogKi8KKwkJbGluZXNfdXAgPSAxICsgKG51bSAtIDEpIC8gd2lkdGg7CisJCWNtZGVkaXRfeCA9ICh3aWR0aCAqIGNtZGVkaXRfeSAtIG51bSkgJSB3aWR0aDsKKwkJY21kZWRpdF95IC09IGxpbmVzX3VwOworCQkvKiBnbyB0byAxc3QgY29sdW1uOyBnbyB1cCAqLworCQlwcmludGYoIlxyIiBFU0MiWyV1QSIsIGxpbmVzX3VwKTsKKwkJLyogZ28gdG8gY29ycmVjdCBjb2x1bW4uCisJCSAqIHh0ZXJtLCBrb25zb2xlLCBMaW51eCBWVCBpbnRlcnByZXQgMCBhcyAxIGJlbG93ISB3b3cuCisJCSAqIG5lZWQgdG8gKm1ha2Ugc3VyZSogd2Ugc2tpcCBpdCBpZiBjbWRlZGl0X3ggPT0gMCAqLworCQlpZiAoY21kZWRpdF94KQorCQkJcHJpbnRmKEVTQyJbJXVDIiwgY21kZWRpdF94KTsKKwl9Cit9CisKKy8qIGRyYXcgcHJvbXB0LCBlZGl0b3IgbGluZSwgYW5kIGNsZWFyIHRhaWwgKi8KK3N0YXRpYyB2b2lkIHJlZHJhdyhpbnQgeSwgaW50IGJhY2tfY3Vyc29yKQoreworCWlmICh5ID4gMCkgLyogdXAgeSBsaW5lcyAqLworCQlwcmludGYoRVNDIlsldUEiLCB5KTsKKwliYl9wdXRjaGFyKCdccicpOworCXB1dF9wcm9tcHQoKTsKKwlwdXRfdGlsbF9lbmRfYW5kX2Fkdl9jdXJzb3IoKTsKKwlwcmludGYoU0VRX0NMRUFSX1RJTExfRU5EX09GX1NDUkVFTik7CisJaW5wdXRfYmFja3dhcmQoYmFja19jdXJzb3IpOworfQorCisvKiBEZWxldGUgdGhlIGNoYXIgaW4gZnJvbnQgb2YgdGhlIGN1cnNvciwgb3B0aW9uYWxseSBzYXZpbmcgaXQKKyAqIGZvciBsYXRlciBwdXRiYWNrICovCisjaWYgIUVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKK3N0YXRpYyB2b2lkIGlucHV0X2RlbGV0ZSh2b2lkKQorI2RlZmluZSBpbnB1dF9kZWxldGUoc2F2ZSkgaW5wdXRfZGVsZXRlKCkKKyNlbHNlCitzdGF0aWMgdm9pZCBpbnB1dF9kZWxldGUoaW50IHNhdmUpCisjZW5kaWYKK3sKKwlpbnQgaiA9IGN1cnNvcjsKKworCWlmIChqID09IChpbnQpY29tbWFuZF9sZW4pCisJCXJldHVybjsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKKwlpZiAoc2F2ZSkgeworCQlpZiAobmV3ZGVsZmxhZykgeworCQkJZGVscHRyID0gZGVsYnVmOworCQkJbmV3ZGVsZmxhZyA9IDA7CisJCX0KKwkJaWYgKChkZWxwdHIgLSBkZWxidWYpIDwgREVMQlVGU0laKQorCQkJKmRlbHB0cisrID0gY29tbWFuZF9wc1tqXTsKKwl9CisjZW5kaWYKKworCW1lbW1vdmUoY29tbWFuZF9wcyArIGosIGNvbW1hbmRfcHMgKyBqICsgMSwKKwkJCS8qIChjb21tYW5kX2xlbiArIDEgW2JlY2F1c2Ugb2YgTlVMXSkgLSAoaiArIDEpCisJCQkgKiBzaW1wbGlmaWVkIGludG8gKGNvbW1hbmRfbGVuIC0gaikgKi8KKwkJCShjb21tYW5kX2xlbiAtIGopICogc2l6ZW9mKGNvbW1hbmRfcHNbMF0pKTsKKwljb21tYW5kX2xlbi0tOworCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCS8qIExhc3QgY2hhciBpcyBzdGlsbCB2aXNpYmxlLCBlcmFzZSBpdCAoYW5kIG1vcmUpICovCisJcHJpbnRmKFNFUV9DTEVBUl9USUxMX0VORF9PRl9TQ1JFRU4pOworCWlucHV0X2JhY2t3YXJkKGN1cnNvciAtIGopOyAgICAgLyogYmFjayB0byBvbGQgcG9zIGN1cnNvciAqLworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSQorc3RhdGljIHZvaWQgcHV0KHZvaWQpCit7CisJaW50IG9jdXJzb3I7CisJaW50IGogPSBkZWxwdHIgLSBkZWxidWY7CisKKwlpZiAoaiA9PSAwKQorCQlyZXR1cm47CisJb2N1cnNvciA9IGN1cnNvcjsKKwkvKiBvcGVuIGhvbGUgYW5kIHRoZW4gZmlsbCBpdCAqLworCW1lbW1vdmUoY29tbWFuZF9wcyArIGN1cnNvciArIGosIGNvbW1hbmRfcHMgKyBjdXJzb3IsCisJCQkoY29tbWFuZF9sZW4gLSBjdXJzb3IgKyAxKSAqIHNpemVvZihjb21tYW5kX3BzWzBdKSk7CisJbWVtY3B5KGNvbW1hbmRfcHMgKyBjdXJzb3IsIGRlbGJ1ZiwgaiAqIHNpemVvZihjb21tYW5kX3BzWzBdKSk7CisJY29tbWFuZF9sZW4gKz0gajsKKwlwdXRfdGlsbF9lbmRfYW5kX2Fkdl9jdXJzb3IoKTsKKwlpbnB1dF9iYWNrd2FyZChjdXJzb3IgLSBvY3Vyc29yIC0gaiArIDEpOyAvKiBhdCBlbmQgb2YgbmV3IHRleHQgKi8KK30KKyNlbmRpZgorCisvKiBEZWxldGUgdGhlIGNoYXIgaW4gYmFjayBvZiB0aGUgY3Vyc29yICovCitzdGF0aWMgdm9pZCBpbnB1dF9iYWNrc3BhY2Uodm9pZCkKK3sKKwlpZiAoY3Vyc29yID4gMCkgeworCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwkJaW5wdXRfZGVsZXRlKDApOworCX0KK30KKworLyogTW92ZSBmb3J3YXJkIG9uZSBjaGFyYWN0ZXIgKi8KK3N0YXRpYyB2b2lkIGlucHV0X2ZvcndhcmQodm9pZCkKK3sKKwlpZiAoY3Vyc29yIDwgY29tbWFuZF9sZW4pCisJCXB1dF9jdXJfZ2x5cGhfYW5kX2luY19jdXJzb3IoKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBQl9DT01QTEVUSU9OCisKKy8vRklYTUU6CisvL25lZWRzIHRvIGJlIG1vcmUgY2xldmVyOiBjdXJyZW50bHkgaXQgdGhpbmtzIHRoYXQgImZvb1wgYjxUQUI+CisvL21hdGNoZXMgdGhlIGZpbGUgbmFtZWQgImZvbyBiYXIiLCB3aGljaCBpcyB1bnRydWUuCisvL0Fsc28sIHBlcmhhcHMgImZvbyBiPFRBQj4gbmVlZHMgdG8gY29tcGxldGUgdG8gImZvbyBiYXIiIDxjdXJzb3I+LAorLy9ub3QgImZvbyBiYXIgPGN1cnNvcj4uLi4KKworc3RhdGljIHZvaWQgZnJlZV90YWJfY29tcGxldGlvbl9kYXRhKHZvaWQpCit7CisJaWYgKG1hdGNoZXMpIHsKKwkJd2hpbGUgKG51bV9tYXRjaGVzKQorCQkJZnJlZShtYXRjaGVzWy0tbnVtX21hdGNoZXNdKTsKKwkJZnJlZShtYXRjaGVzKTsKKwkJbWF0Y2hlcyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfbWF0Y2goY2hhciAqbWF0Y2hlZCkKK3sKKwltYXRjaGVzID0geHJlYWxsb2NfdmVjdG9yKG1hdGNoZXMsIDQsIG51bV9tYXRjaGVzKTsKKwltYXRjaGVzW251bV9tYXRjaGVzXSA9IG1hdGNoZWQ7CisJbnVtX21hdGNoZXMrKzsKK30KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OCisvKiBSZXBsYWNlICJ+dXNlci8uLi4iIHdpdGggIi9ob21lZGlyLy4uLiIuCisgKiBUaGUgcGFyYW1ldGVyIGlzIG1hbGxvY2VkLCBmcmVlIGl0IG9yIHJldHVybiBpdAorICogdW5jaGFuZ2VkIGlmIG5vIHVzZXIgaXMgbWF0Y2hlZC4KKyAqLworc3RhdGljIGNoYXIgKnVzZXJuYW1lX3BhdGhfY29tcGxldGlvbihjaGFyICp1ZCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICplbnRyeTsKKwljaGFyICp0aWxkZV9uYW1lID0gdWQ7CisJY2hhciAqaG9tZSA9IE5VTEw7CisKKwl1ZCsrOyAvKiBza2lwIH4gKi8KKwlpZiAoKnVkID09ICcvJykgeyAgICAgICAvKiAifi8uLi4iICovCisJCWhvbWUgPSBob21lX3B3ZF9idWY7CisJfSBlbHNlIHsKKwkJLyogIn51c2VyLy4uLiIgKi8KKwkJdWQgPSBzdHJjaHIodWQsICcvJyk7CisJCSp1ZCA9ICdcMCc7ICAgICAgICAgICAvKiAifnVzZXIiICovCisJCWVudHJ5ID0gZ2V0cHduYW0odGlsZGVfbmFtZSArIDEpOworCQkqdWQgPSAnLyc7ICAgICAgICAgICAgLyogcmVzdG9yZSAifnVzZXIvLi4uIiAqLworCQlpZiAoZW50cnkpCisJCQlob21lID0gZW50cnktPnB3X2RpcjsKKwl9CisJaWYgKGhvbWUpIHsKKwkJdWQgPSBjb25jYXRfcGF0aF9maWxlKGhvbWUsIHVkKTsKKwkJZnJlZSh0aWxkZV9uYW1lKTsKKwkJdGlsZGVfbmFtZSA9IHVkOworCX0KKwlyZXR1cm4gdGlsZGVfbmFtZTsKK30KKworLyogfnVzZTx0YWI+IC0gZmluZCBhbGwgdXNlcnMgd2l0aCB0aGlzIHByZWZpeC4KKyAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggdXNlZCBmb3IgbWF0Y2hpbmcuCisgKi8KK3N0YXRpYyBOT0lOTElORSB1bnNpZ25lZCBjb21wbGV0ZV91c2VybmFtZShjb25zdCBjaGFyICp1ZCkKK3sKKwkvKiBVc2luZyBfciBmdW5jdGlvbiB0byBhdm9pZCBwdWxsaW5nIGluIHN0YXRpYyBidWZmZXJzICovCisJY2hhciBsaW5lX2J1ZmZbMjU2XTsKKwlzdHJ1Y3QgcGFzc3dkIHB3ZDsKKwlzdHJ1Y3QgcGFzc3dkICpyZXN1bHQ7CisJdW5zaWduZWQgdXNlcmxlbjsKKworCXVkKys7IC8qIHNraXAgfiAqLworCXVzZXJsZW4gPSBzdHJsZW4odWQpOworCisJc2V0cHdlbnQoKTsKKwl3aGlsZSAoIWdldHB3ZW50X3IoJnB3ZCwgbGluZV9idWZmLCBzaXplb2YobGluZV9idWZmKSwgJnJlc3VsdCkpIHsKKwkJLyogTnVsbCB1c2VybmFtZXMgc2hvdWxkIHJlc3VsdCBpbiBhbGwgdXNlcnMgYXMgcG9zc2libGUgY29tcGxldGlvbnMuICovCisJCWlmICgvKiF1c2VybGVuIHx8ICovIHN0cm5jbXAodWQsIHB3ZC5wd19uYW1lLCB1c2VybGVuKSA9PSAwKSB7CisJCQlhZGRfbWF0Y2goeGFzcHJpbnRmKCJ+JXMvIiwgcHdkLnB3X25hbWUpKTsKKwkJfQorCX0KKwllbmRwd2VudCgpOworCisJcmV0dXJuIDEgKyB1c2VybGVuOworfQorIyBlbmRpZiAgLyogRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OICovCisKK2VudW0geworCUZJTkRfRVhFX09OTFkgPSAwLAorCUZJTkRfRElSX09OTFkgPSAxLAorCUZJTkRfRklMRV9PTkxZID0gMiwKK307CisKK3N0YXRpYyBpbnQgcGF0aF9wYXJzZShjaGFyICoqKnApCit7CisJaW50IG5wdGg7CisJY29uc3QgY2hhciAqcHRoOworCWNoYXIgKnRtcDsKKwljaGFyICoqcmVzOworCisJaWYgKHN0YXRlLT5mbGFncyAmIFdJVEhfUEFUSF9MT09LVVApCisJCXB0aCA9IHN0YXRlLT5wYXRoX2xvb2t1cDsKKwllbHNlCisJCXB0aCA9IGdldGVudigiUEFUSCIpOworCisJLyogUEFUSD0iIiBvciBQQVRIPSI6Ij8gKi8KKwlpZiAoIXB0aCB8fCAhcHRoWzBdIHx8IExPTkVfQ0hBUihwdGgsICc6JykpCisJCXJldHVybiAxOworCisJdG1wID0gKGNoYXIqKXB0aDsKKwlucHRoID0gMTsgLyogcGF0aCBjb21wb25lbnQgY291bnQgKi8KKwl3aGlsZSAoMSkgeworCQl0bXAgPSBzdHJjaHIodG1wLCAnOicpOworCQlpZiAoIXRtcCkKKwkJCWJyZWFrOworCQl0bXArKzsKKwkJaWYgKCp0bXAgPT0gJ1wwJykKKwkJCWJyZWFrOyAgLyogOjxlbXB0eT4gKi8KKwkJbnB0aCsrOworCX0KKworCSpwID0gcmVzID0geG1hbGxvYyhucHRoICogc2l6ZW9mKHJlc1swXSkpOworCXJlc1swXSA9IHRtcCA9IHhzdHJkdXAocHRoKTsKKwlucHRoID0gMTsKKwl3aGlsZSAoMSkgeworCQl0bXAgPSBzdHJjaHIodG1wLCAnOicpOworCQlpZiAoIXRtcCkKKwkJCWJyZWFrOworCQkqdG1wKysgPSAnXDAnOyAvKiAnOicgLT4gJ1wwJyAqLworCQlpZiAoKnRtcCA9PSAnXDAnKQorCQkJYnJlYWs7IC8qIDo8ZW1wdHk+ICovCisJCXJlc1tucHRoKytdID0gdG1wOworCX0KKwlyZXR1cm4gbnB0aDsKK30KKworLyogQ29tcGxldGUgY29tbWFuZCwgZGlyZWN0b3J5IG9yIGZpbGUgbmFtZS4KKyAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggdXNlZCBmb3IgbWF0Y2hpbmcuCisgKi8KK3N0YXRpYyBOT0lOTElORSB1bnNpZ25lZCBjb21wbGV0ZV9jbWRfZGlyX2ZpbGUoY29uc3QgY2hhciAqY29tbWFuZCwgaW50IHR5cGUpCit7CisJY2hhciAqcGF0aDFbMV07CisJY2hhciAqKnBhdGhzID0gcGF0aDE7CisJaW50IG5wYXRoczsKKwlpbnQgaTsKKwl1bnNpZ25lZCBwZl9sZW47CisJY29uc3QgY2hhciAqcGZpbmQ7CisJY2hhciAqZGlyYnVmID0gTlVMTDsKKworCW5wYXRocyA9IDE7CisJcGF0aDFbMF0gPSAoY2hhciopIi4iOworCisJcGZpbmQgPSBzdHJyY2hyKGNvbW1hbmQsICcvJyk7CisJaWYgKCFwZmluZCkgeworCQlpZiAodHlwZSA9PSBGSU5EX0VYRV9PTkxZKQorCQkJbnBhdGhzID0gcGF0aF9wYXJzZSgmcGF0aHMpOworCQlwZmluZCA9IGNvbW1hbmQ7CisJfSBlbHNlIHsKKwkJLyogcG9pbnQgdG8gJ2wnIGluICIuLi4uL2xhc3RfY29tcG9uZW50IiAqLworCQlwZmluZCsrOworCQkvKiBkaXJidWYgPSAiLi4uLy4uLi8uLi4vIiAqLworCQlkaXJidWYgPSB4c3RybmR1cChjb21tYW5kLCBwZmluZCAtIGNvbW1hbmQpOworIyBpZiBFTkFCTEVfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OCisJCWlmIChkaXJidWZbMF0gPT0gJ34nKSAgIC8qIH4vLi4uIG9yIH51c2VyLy4uLiAqLworCQkJZGlyYnVmID0gdXNlcm5hbWVfcGF0aF9jb21wbGV0aW9uKGRpcmJ1Zik7CisjIGVuZGlmCisJCXBhdGgxWzBdID0gZGlyYnVmOworCX0KKwlwZl9sZW4gPSBzdHJsZW4ocGZpbmQpOworCisJZm9yIChpID0gMDsgaSA8IG5wYXRoczsgaSsrKSB7CisJCURJUiAqZGlyOworCQlzdHJ1Y3QgZGlyZW50ICpuZXh0OworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqZm91bmQ7CisKKwkJZGlyID0gb3BlbmRpcihwYXRoc1tpXSk7CisJCWlmICghZGlyKQorCQkJY29udGludWU7IC8qIGRvbid0IHByaW50IGFuIGVycm9yICovCisKKwkJd2hpbGUgKChuZXh0ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQl1bnNpZ25lZCBsZW47CisJCQljb25zdCBjaGFyICpuYW1lX2ZvdW5kID0gbmV4dC0+ZF9uYW1lOworCisJCQkvKiAuLi4vPHRhYj46IGJhc2ggMy4yLjAgc2hvd3MgZG90ZmlsZXMsIGJ1dCBub3QgLiBhbmQgLi4gKi8KKwkJCWlmICghcGZpbmRbMF0gJiYgRE9UX09SX0RPVERPVChuYW1lX2ZvdW5kKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIG1hdGNoPyAqLworCQkJaWYgKHN0cm5jbXAobmFtZV9mb3VuZCwgcGZpbmQsIHBmX2xlbikgIT0gMCkKKwkJCQljb250aW51ZTsgLyogbm8gKi8KKworCQkJZm91bmQgPSBjb25jYXRfcGF0aF9maWxlKHBhdGhzW2ldLCBuYW1lX2ZvdW5kKTsKKwkJCS8qIE5COiBzdGF0KCkgZmlyc3Qgc28gdGhhdCB3ZSBzZWUgaXMgaXQgYSBkaXJlY3Rvcnk7CisJCQkgKiBidXQgaWYgdGhhdCBmYWlscywgdXNlIGxzdGF0KCkgc28gdGhhdAorCQkJICogd2Ugc3RpbGwgbWF0Y2ggZGFuZ2xpbmcgbGlua3MgKi8KKwkJCWlmIChzdGF0KGZvdW5kLCAmc3QpICYmIGxzdGF0KGZvdW5kLCAmc3QpKQorCQkJCWdvdG8gY29udDsgLyogaG1tLCByZW1vdmUgaW4gcHJvZ3Jlc3M/ICovCisKKwkJCS8qIFNhdmUgb25seSBuYW1lICovCisJCQlsZW4gPSBzdHJsZW4obmFtZV9mb3VuZCk7CisJCQlmb3VuZCA9IHhyZWFsbG9jKGZvdW5kLCBsZW4gKyAyKTsgLyogKzI6IGZvciBzbGFzaCBhbmQgTlVMICovCisJCQlzdHJjcHkoZm91bmQsIG5hbWVfZm91bmQpOworCisJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCS8qIG5hbWUgaXMgYSBkaXJlY3RvcnksIGFkZCBzbGFzaCAqLworCQkJCWZvdW5kW2xlbl0gPSAnLyc7CisJCQkJZm91bmRbbGVuICsgMV0gPSAnXDAnOworCQkJfSBlbHNlIHsKKwkJCQkvKiBza2lwIGZpbGVzIGlmIGxvb2tpbmcgZm9yIGRpcnMgb25seSAoZXhhbXBsZTogY2QpICovCisJCQkJaWYgKHR5cGUgPT0gRklORF9ESVJfT05MWSkKKwkJCQkJZ290byBjb250OworCQkJfQorCQkJLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisJCQlhZGRfbWF0Y2goZm91bmQpOworCQkJY29udGludWU7CisgY29udDoKKwkJCWZyZWUoZm91bmQpOworCQl9CisJCWNsb3NlZGlyKGRpcik7CisJfSAvKiBmb3IgZXZlcnkgcGF0aCAqLworCisJaWYgKHBhdGhzICE9IHBhdGgxKSB7CisJCWZyZWUocGF0aHNbMF0pOyAvKiBhbGxvY2F0ZWQgbWVtb3J5IGlzIG9ubHkgaW4gZmlyc3QgbWVtYmVyICovCisJCWZyZWUocGF0aHMpOworCX0KKwlmcmVlKGRpcmJ1Zik7CisKKwlyZXR1cm4gcGZfbGVuOworfQorCisvKiBidWlsZF9tYXRjaF9wcmVmaXg6CisgKiBPbiBlbnRyeSwgbWF0Y2hfYnVmIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdXAgdG8gY3Vyc29yIGF0IHRoZSBtb21lbnQgPHRhYj4KKyAqIHdhcyBwcmVzc2VkLiBUaGlzIGZ1bmN0aW9uIGxvb2tzIGF0IGl0LCBmaWd1cmVzIG91dCB3aGF0IHBhcnQgb2YgaXQKKyAqIGNvbnN0aXR1dGVzIHRoZSBjb21tYW5kL2ZpbGUvZGlyZWN0b3J5IHByZWZpeCB0byB1c2UgZm9yIGNvbXBsZXRpb24sCisgKiBhbmQgcmV3cml0ZXMgbWF0Y2hfYnVmIHRvIGNvbnRhaW4gb25seSB0aGF0IHBhcnQuCisgKi8KKyNkZWZpbmUgZGJnX2JtcCAwCisvKiBIZWxwZXJzOiAqLworLyogUVVPVCBpcyB1c2VkIG9uIGVsZW1lbnRzIG9mIGludF9idWZbXSwgd2hpY2ggYXJlIGJ5dGVzLAorICogbm90IFVuaWNvZGUgY2hhcnMuIFRoZXJlZm9yZSBpdCB3b3JrcyBjb3JyZWN0bHkgZXZlbiBpbiBVbmljb2RlIG1vZGUuCisgKi8KKyNkZWZpbmUgUVVPVCAoVUNIQVJfTUFYKzEpCitzdGF0aWMgdm9pZCByZW1vdmVfY2h1bmsoaW50MTZfdCAqaW50X2J1ZiwgaW50IGJlZywgaW50IGVuZCkKK3sKKwkvKiBiZWcgbXVzdCBiZSA8PSBlbmQgKi8KKwlpZiAoYmVnID09IGVuZCkKKwkJcmV0dXJuOworCisJd2hpbGUgKChpbnRfYnVmW2JlZ10gPSBpbnRfYnVmW2VuZF0pICE9IDApCisJCWJlZysrLCBlbmQrKzsKKworCWlmIChkYmdfYm1wKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspCisJCQliYl9wdXRjaGFyKCh1bnNpZ25lZCBjaGFyKWludF9idWZbaV0pOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KK30KKy8qIENhbGxlciBlbnN1cmVzIHRoYXQgbWF0Y2hfYnVmIHBvaW50cyB0byBhIG1hbGxvY2VkIGJ1ZmZlcgorICogYmlnIGVub3VnaCB0byBob2xkIHN0cmxlbihtYXRjaF9idWYpKjIgKyAyCisgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgYnVpbGRfbWF0Y2hfcHJlZml4KGNoYXIgKm1hdGNoX2J1ZikKK3sKKwlpbnQgaSwgajsKKwlpbnQgY29tbWFuZF9tb2RlOworCWludDE2X3QgKmludF9idWYgPSAoaW50MTZfdCopbWF0Y2hfYnVmOworCisJaWYgKGRiZ19ibXApIHByaW50ZigiXG4lc1xuIiwgbWF0Y2hfYnVmKTsKKworCS8qIENvcHkgaW4gcmV2ZXJzZSBvcmRlciwgc2luY2UgdGhleSBvdmVybGFwICovCisJaSA9IHN0cmxlbihtYXRjaF9idWYpOworCWRvIHsKKwkJaW50X2J1ZltpXSA9ICh1bnNpZ25lZCBjaGFyKW1hdGNoX2J1ZltpXTsKKwkJaS0tOworCX0gd2hpbGUgKGkgPj0gMCk7CisKKwkvKiBNYXJrIGV2ZXJ5IFxjIGFzICJxdW90ZWQgYyIgKi8KKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaWYgKGludF9idWZbaV0gPT0gJ1xcJykgeworCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIGksIGkgKyAxKTsKKwkJCWludF9idWZbaV0gfD0gUVVPVDsKKwkJfQorCX0KKwkvKiBRdW90ZS1tYXJrICJjaGFycyIgYW5kICdjaGFycycsIGRyb3AgZGVsaW1pdGVycyAqLworCXsKKwkJaW50IGluX3F1b3RlID0gMDsKKwkJaSA9IDA7CisJCXdoaWxlIChpbnRfYnVmW2ldKSB7CisJCQlpbnQgY3VyID0gaW50X2J1ZltpXTsKKwkJCWlmICghY3VyKQorCQkJCWJyZWFrOworCQkJaWYgKGN1ciA9PSAnXCcnIHx8IGN1ciA9PSAnIicpIHsKKwkJCQlpZiAoIWluX3F1b3RlIHx8IChjdXIgPT0gaW5fcXVvdGUpKSB7CisJCQkJCWluX3F1b3RlIF49IGN1cjsKKwkJCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIGksIGkgKyAxKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJaWYgKGluX3F1b3RlKQorCQkJCWludF9idWZbaV0gPSBjdXIgfCBRVU9UOworCQkJaSsrOworCQl9CisJfQorCisJLyogUmVtb3ZlIGV2ZXJ5dGhpbmcgdXAgdG8gY29tbWFuZCBkZWxpbWl0ZXJzOgorCSAqICc7JyAnOzsnICcmJyAnfCcgJyYmJyAnfHwnLAorCSAqIGJ1dCBjYXJlZnVsIHdpdGggJz4mJyAnPCYnICc+fCcKKwkgKi8KKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaW50IGN1ciA9IGludF9idWZbaV07CisJCWlmIChjdXIgPT0gJzsnIHx8IGN1ciA9PSAnJicgfHwgY3VyID09ICd8JykgeworCQkJaW50IHByZXYgPSBpID8gaW50X2J1ZltpIC0gMV0gOiAwOworCQkJaWYgKGN1ciA9PSAnJicgJiYgKHByZXYgPT0gJz4nIHx8IHByZXYgPT0gJzwnKSkgeworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChjdXIgPT0gJ3wnICYmIHByZXYgPT0gJz4nKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZW1vdmVfY2h1bmsoaW50X2J1ZiwgMCwgaSArIDEgKyAoY3VyID09IGludF9idWZbaSArIDFdKSk7CisJCQlpID0gLTE7ICAvKiBiYWNrIHRvIHNxdWFyZSAxICovCisJCX0KKwl9CisJLyogUmVtb3ZlIGFsbCBgY21kYCAqLworCWZvciAoaSA9IDA7IGludF9idWZbaV07IGkrKykgeworCQlpZiAoaW50X2J1ZltpXSA9PSAnYCcpIHsKKwkJCWZvciAoaiA9IGkgKyAxOyBpbnRfYnVmW2pdOyBqKyspIHsKKwkJCQlpZiAoaW50X2J1ZltqXSA9PSAnYCcpIHsKKwkJCQkJLyogYGNtZGAgc2hvdWxkIGNvdW50IGFzIGEgd29yZDoKKwkJCQkJICogYGNtZGAgYzx0YWI+IHNob3VsZCBzZWFyY2ggZm9yIGZpbGVzIGMqLAorCQkJCQkgKiBub3QgY29tbWFuZHMgYyouIFRoZXJlZm9yZSB3ZSBkb24ndCBkcm9wCisJCQkJCSAqIGBjbWRgIGVudGlyZWx5LCB3ZSByZXBsYWNlIGl0IHdpdGggc2luZ2xlIGAuCisJCQkJCSAqLworCQkJCQlyZW1vdmVfY2h1bmsoaW50X2J1ZiwgaSwgaik7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQkvKiBObyBjbG9zaW5nIGAgLSBjb21tYW5kIG1vZGUsIHJlbW92ZSBhbGwgdXAgdG8gYCAqLworCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIDAsIGkgKyAxKTsKKwkJCWJyZWFrOworIG5leHQ6IDsKKwkJfQorCX0KKworCS8qIFJlbW92ZSAiY21kICgiIGFuZCAiY21kIHsiCisJICogRXhhbXBsZTogImlmIHsgYzx0YWI+IgorCSAqIEluIHRoaXMgZXhhbXBsZSwgYyBzaG91bGQgYmUgbWF0Y2hlZCBhcyBjb21tYW5kIHBmeC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaWYgKGludF9idWZbaV0gPT0gJygnIHx8IGludF9idWZbaV0gPT0gJ3snKSB7CisJCQlyZW1vdmVfY2h1bmsoaW50X2J1ZiwgMCwgaSArIDEpOworCQkJaSA9IC0xOyAgLyogYmFjayB0byBzcXVhcmUgMSAqLworCQl9CisJfQorCisJLyogUmVtb3ZlIGxlYWRpbmcgdW5xdW90ZWQgc3BhY2VzICovCisJZm9yIChpID0gMDsgaW50X2J1ZltpXTsgaSsrKQorCQlpZiAoaW50X2J1ZltpXSAhPSAnICcpCisJCQlicmVhazsKKwlyZW1vdmVfY2h1bmsoaW50X2J1ZiwgMCwgaSk7CisKKwkvKiBEZXRlcm1pbmUgY29tcGxldGlvbiBtb2RlICovCisJY29tbWFuZF9tb2RlID0gRklORF9FWEVfT05MWTsKKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaWYgKGludF9idWZbaV0gPT0gJyAnIHx8IGludF9idWZbaV0gPT0gJzwnIHx8IGludF9idWZbaV0gPT0gJz4nKSB7CisJCQlpZiAoaW50X2J1ZltpXSA9PSAnICcKKwkJCSAmJiBjb21tYW5kX21vZGUgPT0gRklORF9FWEVfT05MWQorCQkJICYmIChjaGFyKWludF9idWZbMF0gPT0gJ2MnCisJCQkgJiYgKGNoYXIpaW50X2J1ZlsxXSA9PSAnZCcKKwkJCSAmJiBpID09IDIgLyogLT4gaW50X2J1ZlsyXSA9PSAnICcgKi8KKwkJCSkgeworCQkJCWNvbW1hbmRfbW9kZSA9IEZJTkRfRElSX09OTFk7CisJCQl9IGVsc2UgeworCQkJCWNvbW1hbmRfbW9kZSA9IEZJTkRfRklMRV9PTkxZOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChkYmdfYm1wKSBwcmludGYoImNvbW1hbmRfbW9kZSgwOmV4ZS8xOmRpci8yOmZpbGUpOiVkXG4iLCBjb21tYW5kX21vZGUpOworCisJLyogUmVtb3ZlIGV2ZXJ5dGhpbmcgZXhjZXB0IGxhc3Qgd29yZCAqLworCWZvciAoaSA9IDA7IGludF9idWZbaV07IGkrKykgLyogcXVhc2ktc3RybGVuKGludF9idWYpICovCisJCWNvbnRpbnVlOworCWZvciAoLS1pOyBpID49IDA7IGktLSkgeworCQlpbnQgY3VyID0gaW50X2J1ZltpXTsKKwkJaWYgKGN1ciA9PSAnICcgfHwgY3VyID09ICc8JyB8fCBjdXIgPT0gJz4nIHx8IGN1ciA9PSAnfCcgfHwgY3VyID09ICcmJykgeworCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIDAsIGkgKyAxKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogQ29udmVydCBiYWNrIHRvIHN0cmluZyBvZiBfY2hhcnNfICovCisJaSA9IDA7CisJd2hpbGUgKChtYXRjaF9idWZbaV0gPSBpbnRfYnVmW2ldKSAhPSAnXDAnKQorCQlpKys7CisKKwlpZiAoZGJnX2JtcCkgcHJpbnRmKCJmaW5hbCBtYXRjaF9idWY6JyVzJ1xuIiwgbWF0Y2hfYnVmKTsKKworCXJldHVybiBjb21tYW5kX21vZGU7Cit9CisKKy8qCisgKiBEaXNwbGF5IGJ5IGNvbHVtbiAob3JpZ2luYWwgaWRlYSBmcm9tIGxzIGFwcGxldCwKKyAqIHZlcnkgb3B0aW1pemVkIGJ5IG1lIFtWbGFkaW1pcl0gOikKKyAqLworc3RhdGljIHZvaWQgc2hvd2ZpbGVzKHZvaWQpCit7CisJaW50IG5jb2xzLCByb3c7CisJaW50IGNvbHVtbl93aWR0aCA9IDA7CisJaW50IG5maWxlcyA9IG51bV9tYXRjaGVzOworCWludCBucm93cyA9IG5maWxlczsKKwlpbnQgbDsKKworCS8qIGZpbmQgdGhlIGxvbmdlc3QgZmlsZSBuYW1lIC0gdXNlIHRoYXQgYXMgdGhlIGNvbHVtbiB3aWR0aCAqLworCWZvciAocm93ID0gMDsgcm93IDwgbnJvd3M7IHJvdysrKSB7CisJCWwgPSB1bmljb2RlX3N0cndpZHRoKG1hdGNoZXNbcm93XSk7CisJCWlmIChjb2x1bW5fd2lkdGggPCBsKQorCQkJY29sdW1uX3dpZHRoID0gbDsKKwl9CisJY29sdW1uX3dpZHRoICs9IDI7ICAgICAgICAgICAgICAvKiBtaW4gc3BhY2UgZm9yIGNvbHVtbnMgKi8KKwluY29scyA9IGNtZGVkaXRfdGVybXcgLyBjb2x1bW5fd2lkdGg7CisKKwlpZiAobmNvbHMgPiAxKSB7CisJCW5yb3dzIC89IG5jb2xzOworCQlpZiAobmZpbGVzICUgbmNvbHMpCisJCQlucm93cysrOyAgICAgICAgLyogcm91bmQgdXAgZnJhY3Rpb25hbHMgKi8KKwl9IGVsc2UgeworCQluY29scyA9IDE7CisJfQorCWZvciAocm93ID0gMDsgcm93IDwgbnJvd3M7IHJvdysrKSB7CisJCWludCBuID0gcm93OworCQlpbnQgbmM7CisKKwkJZm9yIChuYyA9IDE7IG5jIDwgbmNvbHMgJiYgbitucm93cyA8IG5maWxlczsgbiArPSBucm93cywgbmMrKykgeworCQkJcHJpbnRmKCIlcyUtKnMiLCBtYXRjaGVzW25dLAorCQkJCShpbnQpKGNvbHVtbl93aWR0aCAtIHVuaWNvZGVfc3Ryd2lkdGgobWF0Y2hlc1tuXSkpLCAiIgorCQkJKTsKKwkJfQorCQlpZiAoRU5BQkxFX1VOSUNPREVfU1VQUE9SVCkKKwkJCXB1dHMocHJpbnRhYmxlX3N0cmluZyhOVUxMLCBtYXRjaGVzW25dKSk7CisJCWVsc2UKKwkJCXB1dHMobWF0Y2hlc1tuXSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqaXNfc3BlY2lhbF9jaGFyKGNoYXIgYykKK3sKKwlyZXR1cm4gc3RyY2hyKCIgYFwiIyQlXiYqKCk9K3t9W106Oyd8XFw8PiIsIGMpOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfc3BlY2lhbF9jaGFycyhjaGFyICpmb3VuZCkKK3sKKwlpbnQgbCA9IDA7CisJY2hhciAqcyA9IHh6YWxsb2MoKHN0cmxlbihmb3VuZCkgKyAxKSAqIDIpOworCisJd2hpbGUgKCpmb3VuZCkgeworCQlpZiAoaXNfc3BlY2lhbF9jaGFyKCpmb3VuZCkpCisJCQlzW2wrK10gPSAnXFwnOworCQlzW2wrK10gPSAqZm91bmQrKzsKKwl9CisJLyogc1tsXSA9ICdcMCc7IC0gYWxyZWFkeSBpcyAqLworCXJldHVybiBzOworfQorCisvKiBEbyBUQUIgY29tcGxldGlvbiAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgaW5wdXRfdGFiKHNtYWxsaW50ICpsYXN0V2FzVGFiKQoreworCWNoYXIgKmNob3Nlbl9tYXRjaDsKKwljaGFyICptYXRjaF9idWY7CisJc2l6ZV90IGxlbl9mb3VuZDsKKwkvKiBMZW5ndGggb2Ygc3RyaW5nIHVzZWQgZm9yIG1hdGNoaW5nICovCisJdW5zaWduZWQgbWF0Y2hfcGZ4X2xlbiA9IG1hdGNoX3BmeF9sZW47CisJaW50IGZpbmRfdHlwZTsKKyMgaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCS8qIGN1cnNvciBwb3MgaW4gY29tbWFuZCBjb252ZXJ0ZWQgdG8gbXVsdGlieXRlIGZvcm0gKi8KKwlpbnQgY3Vyc29yX21iOworIyBlbmRpZgorCWlmICghKHN0YXRlLT5mbGFncyAmIFRBQl9DT01QTEVUSU9OKSkKKwkJcmV0dXJuOworCisJaWYgKCpsYXN0V2FzVGFiKSB7CisJCS8qIFRoZSBsYXN0IGNoYXIgd2FzIGEgVEFCIHRvby4KKwkJICogUHJpbnQgYSBsaXN0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIGNob2ljZXMuCisJCSAqLworCQlpZiAobnVtX21hdGNoZXMgPiAwKSB7CisJCQkvKiBjdXJzb3Igd2lsbCBiZSBjaGFuZ2VkIGJ5IGdvdG9fbmV3X2xpbmUoKSAqLworCQkJaW50IHNhdl9jdXJzb3IgPSBjdXJzb3I7CisJCQlnb3RvX25ld19saW5lKCk7CisJCQlzaG93ZmlsZXMoKTsKKwkJCXJlZHJhdygwLCBjb21tYW5kX2xlbiAtIHNhdl9jdXJzb3IpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkqbGFzdFdhc1RhYiA9IDE7CisJY2hvc2VuX21hdGNoID0gTlVMTDsKKworCS8qIE1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBzdHJpbmcgdXAgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuCisJICogYnVpbGRfbWF0Y2hfcHJlZml4IHdpbGwgZXhwYW5kIGl0IGludG8gaW50MTZfdCdzLCBuZWVkIHRvIGFsbG9jYXRlCisJICogdHdpY2UgYXMgbXVjaCBhcyB0aGUgc3RyaW5nX2xlbisxLgorCSAqICh3ZSB0aGVuIGFsc28gKGFiKXVzZSB0aGlzIGV4dHJhIHNwYWNlIGxhdGVyIC0gc2VlICgqKikpCisJICovCisJbWF0Y2hfYnVmID0geG1hbGxvYyhNQVhfTElORUxFTiAqIHNpemVvZihpbnQxNl90KSk7CisjIGlmICFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJc2F2ZV9zdHJpbmcobWF0Y2hfYnVmLCBjdXJzb3IgKyAxKTsgLyogKzEgZm9yIE5VTCAqLworIyBlbHNlCisJeworCQlDSEFSX1Qgd2MgPSBjb21tYW5kX3BzW2N1cnNvcl07CisJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IEJCX05VTDsKKwkJc2F2ZV9zdHJpbmcobWF0Y2hfYnVmLCBNQVhfTElORUxFTik7CisJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IHdjOworCQljdXJzb3JfbWIgPSBzdHJsZW4obWF0Y2hfYnVmKTsKKwl9CisjIGVuZGlmCisJZmluZF90eXBlID0gYnVpbGRfbWF0Y2hfcHJlZml4KG1hdGNoX2J1Zik7CisKKwkvKiBGcmVlIHVwIGFueSBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlmcmVlX3RhYl9jb21wbGV0aW9uX2RhdGEoKTsKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OCisJLyogSWYgdGhlIHdvcmQgc3RhcnRzIHdpdGggfiBhbmQgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIHdvcmQsCisJICogdGhlbiB0cnkgY29tcGxldGluZyB0aGlzIHdvcmQgYXMgYSB1c2VybmFtZS4gKi8KKwlpZiAoc3RhdGUtPmZsYWdzICYgVVNFUk5BTUVfQ09NUExFVElPTikKKwkJaWYgKG1hdGNoX2J1ZlswXSA9PSAnficgJiYgc3RyY2hyKG1hdGNoX2J1ZiwgJy8nKSA9PSBOVUxMKQorCQkJbWF0Y2hfcGZ4X2xlbiA9IGNvbXBsZXRlX3VzZXJuYW1lKG1hdGNoX2J1Zik7CisjIGVuZGlmCisJLyogSWYgY29tcGxldGVfdXNlcm5hbWUoKSBkaWQgbm90IG1hdGNoLAorCSAqIHRyeSB0byBtYXRjaCBhIGNvbW1hbmQgaW4gJFBBVEgsIG9yIGEgZGlyZWN0b3J5LCBvciBhIGZpbGUgKi8KKwlpZiAoIW1hdGNoZXMpCisJCW1hdGNoX3BmeF9sZW4gPSBjb21wbGV0ZV9jbWRfZGlyX2ZpbGUobWF0Y2hfYnVmLCBmaW5kX3R5cGUpOworCisJLyogQWNjb3VudCBmb3IgYmFja3NsYXNoZXMgd2hpY2ggd2lsbCBiZSBpbnNlcnRlZAorCSAqIGJ5IHF1b3RlX3NwZWNpYWxfY2hhcnMoKSBsYXRlciAqLworCXsKKwkJY29uc3QgY2hhciAqZSA9IG1hdGNoX2J1ZiArIHN0cmxlbihtYXRjaF9idWYpOworCQljb25zdCBjaGFyICpzID0gZSAtIG1hdGNoX3BmeF9sZW47CisJCXdoaWxlIChzIDwgZSkKKwkJCWlmIChpc19zcGVjaWFsX2NoYXIoKnMrKykpCisJCQkJbWF0Y2hfcGZ4X2xlbisrOworCX0KKworCS8qIFJlbW92ZSBkdXBsaWNhdGVzICovCisJaWYgKG1hdGNoZXMpIHsKKwkJdW5zaWduZWQgaSwgbiA9IDA7CisJCXFzb3J0X3N0cmluZ192ZWN0b3IobWF0Y2hlcywgbnVtX21hdGNoZXMpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXMgLSAxOyArK2kpIHsKKwkJCS8vaWYgKG1hdGNoZXNbaV0gJiYgbWF0Y2hlc1tpKzFdKSB7IC8qIHBhcmFub2lhICovCisJCQkJaWYgKHN0cmNtcChtYXRjaGVzW2ldLCBtYXRjaGVzW2krMV0pID09IDApIHsKKwkJCQkJZnJlZShtYXRjaGVzW2ldKTsKKwkJCQkJLy9tYXRjaGVzW2ldID0gTlVMTDsgLyogcGFyYW5vaWEgKi8KKwkJCQl9IGVsc2UgeworCQkJCQltYXRjaGVzW24rK10gPSBtYXRjaGVzW2ldOworCQkJCX0KKwkJCS8vfQorCQl9CisJCW1hdGNoZXNbbisrXSA9IG1hdGNoZXNbaV07CisJCW51bV9tYXRjaGVzID0gbjsKKwl9CisKKwkvKiBEaWQgd2UgZmluZCBleGFjdGx5IG9uZSBtYXRjaD8gKi8KKwlpZiAobnVtX21hdGNoZXMgIT0gMSkgeyAvKiBubyAqLworCQljaGFyICpjcDsKKwkJYmVlcCgpOworCQlpZiAoIW1hdGNoZXMpCisJCQlnb3RvIHJldDsgLyogbm8gbWF0Y2hlcyBhdCBhbGwgKi8KKwkJLyogRmluZCBjb21tb24gcHJlZml4ICovCisJCWNob3Nlbl9tYXRjaCA9IHhzdHJkdXAobWF0Y2hlc1swXSk7CisJCWZvciAoY3AgPSBjaG9zZW5fbWF0Y2g7ICpjcDsgY3ArKykgeworCQkJdW5zaWduZWQgbjsKKwkJCWZvciAobiA9IDE7IG4gPCBudW1fbWF0Y2hlczsgbisrKSB7CisJCQkJaWYgKG1hdGNoZXNbbl1bY3AgLSBjaG9zZW5fbWF0Y2hdICE9ICpjcCkgeworCQkJCQlnb3RvIHN0b3A7CisJCQkJfQorCQkJfQorCQl9Cisgc3RvcDoKKwkJaWYgKGNwID09IGNob3Nlbl9tYXRjaCkgeyAvKiBoYXZlIHVuaXF1ZSBwcmVmaXg/ICovCisJCQlnb3RvIHJldDsgLyogbm8gKi8KKwkJfQorCQkqY3AgPSAnXDAnOworCQljcCA9IHF1b3RlX3NwZWNpYWxfY2hhcnMoY2hvc2VuX21hdGNoKTsKKwkJZnJlZShjaG9zZW5fbWF0Y2gpOworCQljaG9zZW5fbWF0Y2ggPSBjcDsKKwkJbGVuX2ZvdW5kID0gc3RybGVuKGNob3Nlbl9tYXRjaCk7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGFjdGx5IG9uZSBtYXRjaCAqLworCQkvKiBOZXh0IDx0YWI+IGlzIG5vdCBhIGRvdWJsZS10YWIgKi8KKwkJKmxhc3RXYXNUYWIgPSAwOworCisJCWNob3Nlbl9tYXRjaCA9IHF1b3RlX3NwZWNpYWxfY2hhcnMobWF0Y2hlc1swXSk7CisJCWxlbl9mb3VuZCA9IHN0cmxlbihjaG9zZW5fbWF0Y2gpOworCQlpZiAoY2hvc2VuX21hdGNoW2xlbl9mb3VuZC0xXSAhPSAnLycpIHsKKwkJCWNob3Nlbl9tYXRjaFtsZW5fZm91bmRdID0gJyAnOworCQkJY2hvc2VuX21hdGNoWysrbGVuX2ZvdW5kXSA9ICdcMCc7CisJCX0KKwl9CisKKyMgaWYgIUVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkvKiBIYXZlIHNwYWNlIHRvIHBsYWNlIHRoZSBtYXRjaD8gKi8KKwkvKiBUaGUgcmVzdWx0IGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIHdpdGggdGhlc2UgbGVuZ3RoczogKi8KKwkvKiBjdXJzb3IgKyAobGVuX2ZvdW5kIC0gbWF0Y2hfcGZ4X2xlbikgKyAoY29tbWFuZF9sZW4gLSBjdXJzb3IpICovCisJLyogaXQgc2ltcGxpZmllcyBpbnRvOiAqLworCWlmICgoaW50KShsZW5fZm91bmQgLSBtYXRjaF9wZnhfbGVuICsgY29tbWFuZF9sZW4pIDwgUy5tYXhzaXplKSB7CisJCWludCBwb3M7CisJCS8qIHNhdmUgdGFpbCAqLworCQlzdHJjcHkobWF0Y2hfYnVmLCAmY29tbWFuZF9wc1tjdXJzb3JdKTsKKwkJLyogYWRkIG1hdGNoIGFuZCB0YWlsICovCisJCXNwcmludGYoJmNvbW1hbmRfcHNbY3Vyc29yXSwgIiVzJXMiLCBjaG9zZW5fbWF0Y2ggKyBtYXRjaF9wZnhfbGVuLCBtYXRjaF9idWYpOworCQljb21tYW5kX2xlbiA9IHN0cmxlbihjb21tYW5kX3BzKTsKKwkJLyogbmV3IHBvcyAqLworCQlwb3MgPSBjdXJzb3IgKyBsZW5fZm91bmQgLSBtYXRjaF9wZnhfbGVuOworCQkvKiB3cml0ZSBvdXQgdGhlIG1hdGNoZWQgY29tbWFuZCAqLworCQlyZWRyYXcoY21kZWRpdF95LCBjb21tYW5kX2xlbiAtIHBvcyk7CisJfQorIyBlbHNlCisJeworCQkvKiBVc2UgMm5kIGhhbGYgb2YgbWF0Y2hfYnVmIGFzIHNjcmF0Y2ggc3BhY2UgLSBzZWUgKCoqKSAqLworCQljaGFyICpjb21tYW5kID0gbWF0Y2hfYnVmICsgTUFYX0xJTkVMRU47CisJCWludCBsZW4gPSBzYXZlX3N0cmluZyhjb21tYW5kLCBNQVhfTElORUxFTik7CisJCS8qIEhhdmUgc3BhY2UgdG8gcGxhY2UgdGhlIG1hdGNoPyAqLworCQkvKiBjdXJzb3JfbWIgKyAobGVuX2ZvdW5kIC0gbWF0Y2hfcGZ4X2xlbikgKyAobGVuIC0gY3Vyc29yX21iKSAqLworCQlpZiAoKGludCkobGVuX2ZvdW5kIC0gbWF0Y2hfcGZ4X2xlbiArIGxlbikgPCBNQVhfTElORUxFTikgeworCQkJaW50IHBvczsKKwkJCS8qIHNhdmUgdGFpbCAqLworCQkJc3RyY3B5KG1hdGNoX2J1ZiwgJmNvbW1hbmRbY3Vyc29yX21iXSk7CisJCQkvKiB3aGVyZSBkbyB3ZSB3YW50IHRvIGhhdmUgY3Vyc29yIGFmdGVyIGFsbD8gKi8KKwkJCXN0cmNweSgmY29tbWFuZFtjdXJzb3JfbWJdLCBjaG9zZW5fbWF0Y2ggKyBtYXRjaF9wZnhfbGVuKTsKKwkJCWxlbiA9IGxvYWRfc3RyaW5nKGNvbW1hbmQpOworCQkJLyogYWRkIG1hdGNoIGFuZCB0YWlsICovCisJCQlzcHJpbnRmKCZjb21tYW5kW2N1cnNvcl9tYl0sICIlcyVzIiwgY2hvc2VuX21hdGNoICsgbWF0Y2hfcGZ4X2xlbiwgbWF0Y2hfYnVmKTsKKwkJCWNvbW1hbmRfbGVuID0gbG9hZF9zdHJpbmcoY29tbWFuZCk7CisJCQkvKiB3cml0ZSBvdXQgdGhlIG1hdGNoZWQgY29tbWFuZCAqLworCQkJLyogcGFyYW5vaWE6IGxvYWRfc3RyaW5nIGNhbiByZXR1cm4gMCBvbiBjb252IGVycm9yLAorCQkJICogcHJldmVudCBwYXNzaW5nIHBvcyA9ICgwIC0gMTIpIHRvIHJlZHJhdyAqLworCQkJcG9zID0gY29tbWFuZF9sZW4gLSBsZW47CisJCQlyZWRyYXcoY21kZWRpdF95LCBwb3MgPj0gMCA/IHBvcyA6IDApOworCQl9CisJfQorIyBlbmRpZgorIHJldDoKKwlmcmVlKGNob3Nlbl9tYXRjaCk7CisJZnJlZShtYXRjaF9idWYpOworfQorCisjZW5kaWYgIC8qIEZFQVRVUkVfVEFCX0NPTVBMRVRJT04gKi8KKworCitsaW5lX2lucHV0X3QqIEZBU1RfRlVOQyBuZXdfbGluZV9pbnB1dF90KGludCBmbGFncykKK3sKKwlsaW5lX2lucHV0X3QgKm4gPSB4emFsbG9jKHNpemVvZigqbikpOworCW4tPmZsYWdzID0gZmxhZ3M7CisJbi0+bWF4X2hpc3RvcnkgPSBNQVhfSElTVE9SWTsKKwlyZXR1cm4gbjsKK30KKworCisjaWYgTUFYX0hJU1RPUlkgPiAwCisKK3Vuc2lnbmVkIHNpemVfZnJvbV9ISVNURklMRVNJWkUoY29uc3QgY2hhciAqaHApCit7CisJaW50IHNpemUgPSBNQVhfSElTVE9SWTsKKwlpZiAoaHApIHsKKwkJc2l6ZSA9IGF0b2koaHApOworCQlpZiAoc2l6ZSA8PSAwKQorCQkJcmV0dXJuIDE7CisJCWlmIChzaXplID4gTUFYX0hJU1RPUlkpCisJCQlyZXR1cm4gTUFYX0hJU1RPUlk7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCBzYXZlX2NvbW1hbmRfcHNfYXRfY3VyX2hpc3Rvcnkodm9pZCkKK3sKKwlpZiAoY29tbWFuZF9wc1swXSAhPSBCQl9OVUwpIHsKKwkJaW50IGN1ciA9IHN0YXRlLT5jdXJfaGlzdG9yeTsKKwkJZnJlZShzdGF0ZS0+aGlzdG9yeVtjdXJdKTsKKworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCXsKKwkJCWNoYXIgdGJ1ZltNQVhfTElORUxFTl07CisJCQlzYXZlX3N0cmluZyh0YnVmLCBzaXplb2YodGJ1ZikpOworCQkJc3RhdGUtPmhpc3RvcnlbY3VyXSA9IHhzdHJkdXAodGJ1Zik7CisJCX0KKyMgZWxzZQorCQlzdGF0ZS0+aGlzdG9yeVtjdXJdID0geHN0cmR1cChjb21tYW5kX3BzKTsKKyMgZW5kaWYKKwl9Cit9CisKKy8qIHN0YXRlLT5mbGFncyBpcyBhbHJlYWR5IGNoZWNrZWQgdG8gYmUgbm9uemVybyAqLworc3RhdGljIGludCBnZXRfcHJldmlvdXNfaGlzdG9yeSh2b2lkKQoreworCWlmICgoc3RhdGUtPmZsYWdzICYgRE9fSElTVE9SWSkgJiYgc3RhdGUtPmN1cl9oaXN0b3J5KSB7CisJCXNhdmVfY29tbWFuZF9wc19hdF9jdXJfaGlzdG9yeSgpOworCQlzdGF0ZS0+Y3VyX2hpc3RvcnktLTsKKwkJcmV0dXJuIDE7CisJfQorCWJlZXAoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbmV4dF9oaXN0b3J5KHZvaWQpCit7CisJaWYgKHN0YXRlLT5mbGFncyAmIERPX0hJU1RPUlkpIHsKKwkJaWYgKHN0YXRlLT5jdXJfaGlzdG9yeSA8IHN0YXRlLT5jbnRfaGlzdG9yeSkgeworCQkJc2F2ZV9jb21tYW5kX3BzX2F0X2N1cl9oaXN0b3J5KCk7IC8qIHNhdmUgdGhlIGN1cnJlbnQgaGlzdG9yeSBsaW5lICovCisJCQlyZXR1cm4gKytzdGF0ZS0+Y3VyX2hpc3Rvcnk7CisJCX0KKwl9CisJYmVlcCgpOworCXJldHVybiAwOworfQorCisjIGlmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKy8qIFdlIHRyeSB0byBlbnN1cmUgdGhhdCBjb25jdXJyZW50IGFkZGl0aW9ucyB0byB0aGUgaGlzdG9yeQorICogZG8gbm90IG92ZXJ3cml0ZSBlYWNoIG90aGVyLgorICogT3RoZXJ3aXNlIHNoZWxsIHVzZXJzIGdldCB1bmhhcHB5LgorICoKKyAqIEhpc3RvcnkgZmlsZSBpcyB0cmltbWVkIGxhemlseSwgd2hlbiBpdCBncm93cyBzZXZlcmFsIHRpbWVzIGxvbmdlcgorICogdGhhbiBjb25maWd1cmVkIE1BWF9ISVNUT1JZIGxpbmVzLgorICovCisKK3N0YXRpYyB2b2lkIGZyZWVfbGluZV9pbnB1dF90KGxpbmVfaW5wdXRfdCAqbikKK3sKKwlpbnQgaSA9IG4tPmNudF9oaXN0b3J5OworCXdoaWxlIChpID4gMCkKKwkJZnJlZShuLT5oaXN0b3J5Wy0taV0pOworCWZyZWUobik7Cit9CisKKy8qIHN0YXRlLT5mbGFncyBpcyBhbHJlYWR5IGNoZWNrZWQgdG8gYmUgbm9uemVybyAqLworc3RhdGljIHZvaWQgbG9hZF9oaXN0b3J5KGxpbmVfaW5wdXRfdCAqc3RfcGFybSkKK3sKKwljaGFyICp0ZW1wX2hbTUFYX0hJU1RPUlldOworCWNoYXIgKmxpbmU7CisJRklMRSAqZnA7CisJdW5zaWduZWQgaWR4LCBpLCBsaW5lX2xlbjsKKworCS8qIE5COiBkbyBub3QgdHJhc2ggb2xkIGhpc3RvcnkgaWYgZmlsZSBjYW4ndCBiZSBvcGVuZWQgKi8KKworCWZwID0gZm9wZW5fZm9yX3JlYWQoc3RfcGFybS0+aGlzdF9maWxlKTsKKwlpZiAoZnApIHsKKwkJLyogY2xlYW4gdXAgb2xkIGhpc3RvcnkgKi8KKwkJZm9yIChpZHggPSBzdF9wYXJtLT5jbnRfaGlzdG9yeTsgaWR4ID4gMDspIHsKKwkJCWlkeC0tOworCQkJZnJlZShzdF9wYXJtLT5oaXN0b3J5W2lkeF0pOworCQkJc3RfcGFybS0+aGlzdG9yeVtpZHhdID0gTlVMTDsKKwkJfQorCisJCS8qIGZpbGwgdGVtcF9oW10sIHJldGFpbmluZyBvbmx5IGxhc3QgTUFYX0hJU1RPUlkgbGluZXMgKi8KKwkJbWVtc2V0KHRlbXBfaCwgMCwgc2l6ZW9mKHRlbXBfaCkpOworCQlzdF9wYXJtLT5jbnRfaGlzdG9yeV9pbl9maWxlID0gaWR4ID0gMDsKKwkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpIHsKKwkJCWlmIChsaW5lWzBdID09ICdcMCcpIHsKKwkJCQlmcmVlKGxpbmUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZnJlZSh0ZW1wX2hbaWR4XSk7CisJCQl0ZW1wX2hbaWR4XSA9IGxpbmU7CisJCQlzdF9wYXJtLT5jbnRfaGlzdG9yeV9pbl9maWxlKys7CisJCQlpZHgrKzsKKwkJCWlmIChpZHggPT0gc3RfcGFybS0+bWF4X2hpc3RvcnkpCisJCQkJaWR4ID0gMDsKKwkJfQorCQlmY2xvc2UoZnApOworCisJCS8qIGZpbmQgZmlyc3Qgbm9uLU5VTEwgdGVtcF9oW10sIGlmIGFueSAqLworCQlpZiAoc3RfcGFybS0+Y250X2hpc3RvcnlfaW5fZmlsZSkgeworCQkJd2hpbGUgKHRlbXBfaFtpZHhdID09IE5VTEwpIHsKKwkJCQlpZHgrKzsKKwkJCQlpZiAoaWR4ID09IHN0X3Bhcm0tPm1heF9oaXN0b3J5KQorCQkJCQlpZHggPSAwOworCQkJfQorCQl9CisKKwkJLyogY29weSB0ZW1wX2hbXSB0byBzdF9wYXJtLT5oaXN0b3J5W10gKi8KKwkJZm9yIChpID0gMDsgaSA8IHN0X3Bhcm0tPm1heF9oaXN0b3J5OykgeworCQkJbGluZSA9IHRlbXBfaFtpZHhdOworCQkJaWYgKCFsaW5lKQorCQkJCWJyZWFrOworCQkJaWR4Kys7CisJCQlpZiAoaWR4ID09IHN0X3Bhcm0tPm1heF9oaXN0b3J5KQorCQkJCWlkeCA9IDA7CisJCQlsaW5lX2xlbiA9IHN0cmxlbihsaW5lKTsKKwkJCWlmIChsaW5lX2xlbiA+PSBNQVhfTElORUxFTikKKwkJCQlsaW5lW01BWF9MSU5FTEVOLTFdID0gJ1wwJzsKKwkJCXN0X3Bhcm0tPmhpc3RvcnlbaSsrXSA9IGxpbmU7CisJCX0KKwkJc3RfcGFybS0+Y250X2hpc3RvcnkgPSBpOworCX0KK30KKworLyogc3RhdGUtPmZsYWdzIGlzIGFscmVhZHkgY2hlY2tlZCB0byBiZSBub256ZXJvICovCitzdGF0aWMgdm9pZCBzYXZlX2hpc3RvcnkoY2hhciAqc3RyKQoreworCWludCBmZDsKKwlpbnQgbGVuLCBsZW4yOworCisJZmQgPSBvcGVuKHN0YXRlLT5oaXN0X2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5ELCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisJeGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7IC8qIHBhcmFub2lhICovCisJbGVuID0gc3RybGVuKHN0cik7CisJc3RyW2xlbl0gPSAnXG4nOyAvKiB3ZSAodHJ5IHRvKSBkbyBhdG9taWMgd3JpdGUgKi8KKwlsZW4yID0gZnVsbF93cml0ZShmZCwgc3RyLCBsZW4gKyAxKTsKKwlzdHJbbGVuXSA9ICdcMCc7CisJY2xvc2UoZmQpOworCWlmIChsZW4yICE9IGxlbiArIDEpCisJCXJldHVybjsgLyogInd0Zj8iICovCisKKwkvKiBkaWQgd2Ugd3JpdGUgc28gbXVjaCB0aGF0IGhpc3RvcnkgZmlsZSBuZWVkcyB0cmltbWluZz8gKi8KKwlzdGF0ZS0+Y250X2hpc3RvcnlfaW5fZmlsZSsrOworCWlmIChzdGF0ZS0+Y250X2hpc3RvcnlfaW5fZmlsZSA+IHN0YXRlLT5tYXhfaGlzdG9yeSAqIDQpIHsKKwkJY2hhciAqbmV3X25hbWU7CisJCWxpbmVfaW5wdXRfdCAqc3RfdGVtcDsKKworCQkvKiB3ZSBtYXkgaGF2ZSBjb25jdXJyZW50bHkgd3JpdHRlbiBlbnRyaWVzIGZyb20gb3RoZXJzLgorCQkgKiBsb2FkIHRoZW0gKi8KKwkJc3RfdGVtcCA9IG5ld19saW5lX2lucHV0X3Qoc3RhdGUtPmZsYWdzKTsKKwkJc3RfdGVtcC0+aGlzdF9maWxlID0gc3RhdGUtPmhpc3RfZmlsZTsKKwkJc3RfdGVtcC0+bWF4X2hpc3RvcnkgPSBzdGF0ZS0+bWF4X2hpc3Rvcnk7CisJCWxvYWRfaGlzdG9yeShzdF90ZW1wKTsKKworCQkvKiB3cml0ZSBvdXQgdGVtcCBmaWxlIGFuZCByZXBsYWNlIGhpc3RfZmlsZSBhdG9taWNhbGx5ICovCisJCW5ld19uYW1lID0geGFzcHJpbnRmKCIlcy4ldS5uZXciLCBzdGF0ZS0+aGlzdF9maWxlLCAoaW50KSBnZXRwaWQoKSk7CisJCWZkID0gb3BlbihuZXdfbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDYwMCk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlGSUxFICpmcDsKKwkJCWludCBpOworCisJCQlmcCA9IHhmZG9wZW5fZm9yX3dyaXRlKGZkKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzdF90ZW1wLT5jbnRfaGlzdG9yeTsgaSsrKQorCQkJCWZwcmludGYoZnAsICIlc1xuIiwgc3RfdGVtcC0+aGlzdG9yeVtpXSk7CisJCQlmY2xvc2UoZnApOworCQkJaWYgKHJlbmFtZShuZXdfbmFtZSwgc3RhdGUtPmhpc3RfZmlsZSkgPT0gMCkKKwkJCQlzdGF0ZS0+Y250X2hpc3RvcnlfaW5fZmlsZSA9IHN0X3RlbXAtPmNudF9oaXN0b3J5OworCQl9CisJCWZyZWUobmV3X25hbWUpOworCQlmcmVlX2xpbmVfaW5wdXRfdChzdF90ZW1wKTsKKwl9Cit9CisjIGVsc2UKKyMgIGRlZmluZSBsb2FkX2hpc3RvcnkoYSkgKCh2b2lkKTApCisjICBkZWZpbmUgc2F2ZV9oaXN0b3J5KGEpICgodm9pZCkwKQorIyBlbmRpZiAvKiBGRUFUVVJFX0NPTU1BTkRfU0FWRUhJU1RPUlkgKi8KKworc3RhdGljIHZvaWQgcmVtZW1iZXJfaW5faGlzdG9yeShjaGFyICpzdHIpCit7CisJaW50IGk7CisKKwlpZiAoIShzdGF0ZS0+ZmxhZ3MgJiBET19ISVNUT1JZKSkKKwkJcmV0dXJuOworCWlmIChzdHJbMF0gPT0gJ1wwJykKKwkJcmV0dXJuOworCWkgPSBzdGF0ZS0+Y250X2hpc3Rvcnk7CisJLyogRG9uJ3Qgc2F2ZSBkdXBlcyAqLworCWlmIChpICYmIHN0cmNtcChzdGF0ZS0+aGlzdG9yeVtpLTFdLCBzdHIpID09IDApCisJCXJldHVybjsKKworCWZyZWUoc3RhdGUtPmhpc3Rvcnlbc3RhdGUtPm1heF9oaXN0b3J5XSk7IC8qIHJlZHVuZGFudCwgcGFyYW5vaWEgKi8KKwlzdGF0ZS0+aGlzdG9yeVtzdGF0ZS0+bWF4X2hpc3RvcnldID0gTlVMTDsgLyogcmVkdW5kYW50LCBwYXJhbm9pYSAqLworCisJLyogSWYgaGlzdG9yeVtdIGlzIGZ1bGwsIHJlbW92ZSB0aGUgb2xkZXN0IGNvbW1hbmQgKi8KKwkvKiB3ZSBuZWVkIHRvIGtlZXAgaGlzdG9yeVtzdGF0ZS0+bWF4X2hpc3RvcnldIGVtcHR5LCBoZW5jZSA+PSwgbm90ID4gKi8KKwlpZiAoaSA+PSBzdGF0ZS0+bWF4X2hpc3RvcnkpIHsKKwkJZnJlZShzdGF0ZS0+aGlzdG9yeVswXSk7CisJCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+bWF4X2hpc3RvcnktMTsgaSsrKQorCQkJc3RhdGUtPmhpc3RvcnlbaV0gPSBzdGF0ZS0+aGlzdG9yeVtpKzFdOworCQkvKiBpID09IHN0YXRlLT5tYXhfaGlzdG9yeS0xICovCisJfQorCS8qIGkgPD0gc3RhdGUtPm1heF9oaXN0b3J5LTEgKi8KKwlzdGF0ZS0+aGlzdG9yeVtpKytdID0geHN0cmR1cChzdHIpOworCS8qIGkgPD0gc3RhdGUtPm1heF9oaXN0b3J5ICovCisJc3RhdGUtPmN1cl9oaXN0b3J5ID0gaTsKKwlzdGF0ZS0+Y250X2hpc3RvcnkgPSBpOworIyBpZiBNQVhfSElTVE9SWSA+IDAgJiYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWQorCWlmICgoc3RhdGUtPmZsYWdzICYgU0FWRV9ISVNUT1JZKSAmJiBzdGF0ZS0+aGlzdF9maWxlKQorCQlzYXZlX2hpc3Rvcnkoc3RyKTsKKyMgZW5kaWYKKwlJRl9GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUKG51bV9va19saW5lcysrOykKK30KKworI2Vsc2UgLyogTUFYX0hJU1RPUlkgPT0gMCAqLworIyBkZWZpbmUgcmVtZW1iZXJfaW5faGlzdG9yeShhKSAoKHZvaWQpMCkKKyNlbmRpZiAvKiBNQVhfSElTVE9SWSAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisvKgorICogdmkgbW9kZSBpbXBsZW1lbnRlZCAyMDA1IGJ5IFBhdWwgRm94IDxwZ2ZAZm94aGFycC5ib3N0b24ubWEudXM+CisgKi8KK3N0YXRpYyB2b2lkCit2aV9Xb3JkX21vdGlvbihpbnQgZWF0KQoreworCUNIQVJfVCAqY29tbWFuZCA9IGNvbW1hbmRfcHM7CisKKwl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4gJiYgIUJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3JdKSkKKwkJaW5wdXRfZm9yd2FyZCgpOworCWlmIChlYXQpIHdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbiAmJiBCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yXSkpCisJCWlucHV0X2ZvcndhcmQoKTsKK30KKworc3RhdGljIHZvaWQKK3ZpX3dvcmRfbW90aW9uKGludCBlYXQpCit7CisJQ0hBUl9UICpjb21tYW5kID0gY29tbWFuZF9wczsKKworCWlmIChCQl9pc2FsbnVtKGNvbW1hbmRbY3Vyc29yXSkgfHwgY29tbWFuZFtjdXJzb3JdID09ICdfJykgeworCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4KKwkJICYmIChCQl9pc2FsbnVtKGNvbW1hbmRbY3Vyc29yKzFdKSB8fCBjb21tYW5kW2N1cnNvcisxXSA9PSAnXycpCisJCSkgeworCQkJaW5wdXRfZm9yd2FyZCgpOworCQl9CisJfSBlbHNlIGlmIChCQl9pc3B1bmN0KGNvbW1hbmRbY3Vyc29yXSkpIHsKKwkJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuICYmIEJCX2lzcHVuY3QoY29tbWFuZFtjdXJzb3IrMV0pKQorCQkJaW5wdXRfZm9yd2FyZCgpOworCX0KKworCWlmIChjdXJzb3IgPCBjb21tYW5kX2xlbikKKwkJaW5wdXRfZm9yd2FyZCgpOworCisJaWYgKGVhdCkgeworCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4gJiYgQkJfaXNzcGFjZShjb21tYW5kW2N1cnNvcl0pKQorCQkJaW5wdXRfZm9yd2FyZCgpOworCX0KK30KKworc3RhdGljIHZvaWQKK3ZpX0VuZF9tb3Rpb24odm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJaW5wdXRfZm9yd2FyZCgpOworCXdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbiAmJiBCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yXSkpCisJCWlucHV0X2ZvcndhcmQoKTsKKwl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4tMSAmJiAhQkJfaXNzcGFjZShjb21tYW5kW2N1cnNvcisxXSkpCisJCWlucHV0X2ZvcndhcmQoKTsKK30KKworc3RhdGljIHZvaWQKK3ZpX2VuZF9tb3Rpb24odm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJaWYgKGN1cnNvciA+PSBjb21tYW5kX2xlbi0xKQorCQlyZXR1cm47CisJaW5wdXRfZm9yd2FyZCgpOworCXdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbi0xICYmIEJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3JdKSkKKwkJaW5wdXRfZm9yd2FyZCgpOworCWlmIChjdXJzb3IgPj0gY29tbWFuZF9sZW4tMSkKKwkJcmV0dXJuOworCWlmIChCQl9pc2FsbnVtKGNvbW1hbmRbY3Vyc29yXSkgfHwgY29tbWFuZFtjdXJzb3JdID09ICdfJykgeworCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4tMQorCQkgJiYgKEJCX2lzYWxudW0oY29tbWFuZFtjdXJzb3IrMV0pIHx8IGNvbW1hbmRbY3Vyc29yKzFdID09ICdfJykKKwkJKSB7CisJCQlpbnB1dF9mb3J3YXJkKCk7CisJCX0KKwl9IGVsc2UgaWYgKEJCX2lzcHVuY3QoY29tbWFuZFtjdXJzb3JdKSkgeworCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4tMSAmJiBCQl9pc3B1bmN0KGNvbW1hbmRbY3Vyc29yKzFdKSkKKwkJCWlucHV0X2ZvcndhcmQoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit2aV9CYWNrX21vdGlvbih2b2lkKQoreworCUNIQVJfVCAqY29tbWFuZCA9IGNvbW1hbmRfcHM7CisKKwl3aGlsZSAoY3Vyc29yID4gMCAmJiBCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yLTFdKSkKKwkJaW5wdXRfYmFja3dhcmQoMSk7CisJd2hpbGUgKGN1cnNvciA+IDAgJiYgIUJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3ItMV0pKQorCQlpbnB1dF9iYWNrd2FyZCgxKTsKK30KKworc3RhdGljIHZvaWQKK3ZpX2JhY2tfbW90aW9uKHZvaWQpCit7CisJQ0hBUl9UICpjb21tYW5kID0gY29tbWFuZF9wczsKKworCWlmIChjdXJzb3IgPD0gMCkKKwkJcmV0dXJuOworCWlucHV0X2JhY2t3YXJkKDEpOworCXdoaWxlIChjdXJzb3IgPiAwICYmIEJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3JdKSkKKwkJaW5wdXRfYmFja3dhcmQoMSk7CisJaWYgKGN1cnNvciA8PSAwKQorCQlyZXR1cm47CisJaWYgKEJCX2lzYWxudW0oY29tbWFuZFtjdXJzb3JdKSB8fCBjb21tYW5kW2N1cnNvcl0gPT0gJ18nKSB7CisJCXdoaWxlIChjdXJzb3IgPiAwCisJCSAmJiAoQkJfaXNhbG51bShjb21tYW5kW2N1cnNvci0xXSkgfHwgY29tbWFuZFtjdXJzb3ItMV0gPT0gJ18nKQorCQkpIHsKKwkJCWlucHV0X2JhY2t3YXJkKDEpOworCQl9CisJfSBlbHNlIGlmIChCQl9pc3B1bmN0KGNvbW1hbmRbY3Vyc29yXSkpIHsKKwkJd2hpbGUgKGN1cnNvciA+IDAgJiYgQkJfaXNwdW5jdChjb21tYW5kW2N1cnNvci0xXSkpCisJCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwl9Cit9CisjZW5kaWYKKworLyogTW9kZWxsZWQgYWZ0ZXIgYmFzaCA0LjAgYmVoYXZpb3Igb2YgQ3RybC08YXJyb3c+ICovCitzdGF0aWMgdm9pZCBjdHJsX2xlZnQodm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJd2hpbGUgKDEpIHsKKwkJQ0hBUl9UIGM7CisKKwkJaW5wdXRfYmFja3dhcmQoMSk7CisJCWlmIChjdXJzb3IgPT0gMCkKKwkJCWJyZWFrOworCQljID0gY29tbWFuZFtjdXJzb3JdOworCQlpZiAoYyAhPSAnICcgJiYgIUJCX2lzcHVuY3QoYykpIHsKKwkJCS8qIHdlIHJlYWNoZWQgYSAid29yZCIgZGVsaW1pdGVkIGJ5IHNwYWNlcy9wdW5jdC4KKwkJCSAqIGdvIHRvIGl0cyBiZWdpbm5pbmcgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJYyA9IGNvbW1hbmRbY3Vyc29yIC0gMV07CisJCQkJaWYgKGMgPT0gJyAnIHx8IEJCX2lzcHVuY3QoYykpCisJCQkJCWJyZWFrOworCQkJCWlucHV0X2JhY2t3YXJkKDEpOworCQkJCWlmIChjdXJzb3IgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KK3N0YXRpYyB2b2lkIGN0cmxfcmlnaHQodm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJd2hpbGUgKDEpIHsKKwkJQ0hBUl9UIGM7CisKKwkJYyA9IGNvbW1hbmRbY3Vyc29yXTsKKwkJaWYgKGMgPT0gQkJfTlVMKQorCQkJYnJlYWs7CisJCWlmIChjICE9ICcgJyAmJiAhQkJfaXNwdW5jdChjKSkgeworCQkJLyogd2UgcmVhY2hlZCBhICJ3b3JkIiBkZWxpbWl0ZWQgYnkgc3BhY2VzL3B1bmN0LgorCQkJICogZ28gdG8gaXRzIGVuZCArIDEgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJaW5wdXRfZm9yd2FyZCgpOworCQkJCWMgPSBjb21tYW5kW2N1cnNvcl07CisJCQkJaWYgKGMgPT0gQkJfTlVMIHx8IGMgPT0gJyAnIHx8IEJCX2lzcHVuY3QoYykpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaW5wdXRfZm9yd2FyZCgpOworCX0KK30KKworCisvKgorICogcmVhZF9saW5lX2lucHV0IGFuZCBpdHMgaGVscGVycworICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTAorc3RhdGljIHZvaWQgYXNrX3Rlcm1pbmFsKHZvaWQpCit7CisJLyogQXNrIHRlcm1pbmFsIHdoZXJlIGlzIHRoZSBjdXJzb3Igbm93LgorCSAqIGxpbmVlZGl0X3JlYWRfa2V5IGhhbmRsZXMgcmVzcG9uc2UgYW5kIGNvcnJlY3RzCisJICogb3VyIGlkZWEgb2YgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uCisJICogVGVzdGNhc2U6IHJ1biAiZWNobyAtbiBsb25nX2xpbmVfbG9uZ19saW5lX2xvbmdfbGluZSIsCisJICogdGhlbiB0eXBlIGluIGEgbG9uZywgd3JhcHBpbmcgY29tbWFuZCBhbmQgdHJ5IHRvCisJICogZGVsZXRlIGl0IHVzaW5nIGJhY2tzcGFjZSBrZXkuCisJICogTm90ZTogd2UgcHJpbnQgaXQgX2FmdGVyXyBwcm9tcHQsIGJlY2F1c2UKKwkgKiBwcm9tcHQgbWF5IGNvbnRhaW4gQ1IuIEV4YW1wbGU6IFBTMT0nXFtcclxuXF1cdyAnCisJICovCisJLyogUHJvYmxlbTogaWYgdGhlcmUgaXMgYnVmZmVyZWQgaW5wdXQgb24gc3RkaW4sCisJICogdGhlIHJlc3BvbnNlIHdpbGwgYmUgZGVsaXZlcmVkIGxhdGVyLAorCSAqIHBvc3NpYmx5IHRvIGFuIHVuc3VzcGVjdGluZyBhcHBsaWNhdGlvbi4KKwkgKiBUZXN0Y2FzZTogInNsZWVwIDE7IGJ1c3lib3ggYXNoIiArIHByZXNzIGFuZCBob2xkIFtFbnRlcl0uCisJICogUmVzdWx0OgorCSAqIH4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjCisJICogfi9zcmNkZXZlbC9iYm94L2ZpeC9idXN5Ym94LnQ0ICMKKwkgKiBeW1s1OTszNH4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjICA8LS0gZ2FyYmFnZQorCSAqIH4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjCisJICoKKwkgKiBDaGVja2luZyBmb3IgaW5wdXQgd2l0aCBwb2xsIG9ubHkgbWFrZXMgdGhlIHJhY2UgbmFycm93ZXIsCisJICogSSBzdGlsbCBjYW4gdHJpZ2dlciBpdC4gU3RyYWNlOgorCSAqCisJICogd3JpdGUoMSwgIn4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjICIsIDMzKSA9IDMzCisJICogcG9sbChbe2ZkPTAsIGV2ZW50cz1QT0xMSU59XSwgMSwgMCkgPSAwIChUaW1lb3V0KSAgPC0tIG5vIGlucHV0IGV4aXN0cworCSAqIHdyaXRlKDEsICJcMzNbNm4iLCA0KSA9IDQgIDwtLSBzZW5kIHRoZSBFU0Mgc2VxdWVuY2UsIHF1aWNrIQorCSAqIHBvbGwoW3tmZD0wLCBldmVudHM9UE9MTElOfV0sIDEsIC0xKSA9IDEgKFt7ZmQ9MCwgcmV2ZW50cz1QT0xMSU59XSkKKwkgKiByZWFkKDAsICJcbiIsIDEpICAgICAgPSAxICA8LS0gb2ggY3JhcCwgdXNlcidzIGlucHV0IGdvdCBpbiBmaXJzdAorCSAqLworCXN0cnVjdCBwb2xsZmQgcGZkOworCisJcGZkLmZkID0gU1RESU5fRklMRU5POworCXBmZC5ldmVudHMgPSBQT0xMSU47CisJaWYgKHNhZmVfcG9sbCgmcGZkLCAxLCAwKSA9PSAwKSB7CisJCVMuc2VudF9FU0NfYnI2biA9IDE7CisJCWZwdXRzKEVTQyJbNm4iLCBzdGRvdXQpOworCQlmZmx1c2hfYWxsKCk7IC8qIG1ha2UgdGVybWluYWwgc2VlIGl0IEFTQVAhICovCisJfQorfQorI2Vsc2UKKyNkZWZpbmUgYXNrX3Rlcm1pbmFsKCkgKCh2b2lkKTApCisjZW5kaWYKKworI2lmICFFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVAorc3RhdGljIHZvaWQgcGFyc2VfYW5kX3B1dF9wcm9tcHQoY29uc3QgY2hhciAqcHJtdF9wdHIpCit7CisJY21kZWRpdF9wcm9tcHQgPSBwcm10X3B0cjsKKwljbWRlZGl0X3BybXRfbGVuID0gc3RybGVuKHBybXRfcHRyKTsKKwlwdXRfcHJvbXB0KCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgcGFyc2VfYW5kX3B1dF9wcm9tcHQoY29uc3QgY2hhciAqcHJtdF9wdHIpCit7CisJaW50IHBybXRfbGVuID0gMDsKKwlzaXplX3QgY3VyX3BybXRfbGVuID0gMDsKKwljaGFyIGZsZ19ub3RfbGVuZ3RoID0gJ1snOworCWNoYXIgKnBybXRfbWVtX3B0ciA9IHh6YWxsb2MoMSk7CisJY2hhciAqY3dkX2J1ZiA9IHhyZWFsbG9jX2dldGN3ZF9vcl93YXJuKE5VTEwpOworCWNoYXIgY2J1ZlsyXTsKKwljaGFyIGM7CisJY2hhciAqcGJ1ZjsKKworCWNtZGVkaXRfcHJtdF9sZW4gPSAwOworCisJaWYgKCFjd2RfYnVmKSB7CisJCWN3ZF9idWYgPSAoY2hhciAqKWJiX21zZ191bmtub3duOworCX0KKworCWNidWZbMV0gPSAnXDAnOyAvKiBuZXZlciBjaGFuZ2VzICovCisKKwl3aGlsZSAoKnBybXRfcHRyKSB7CisJCWNoYXIgKmZyZWVfbWUgPSBOVUxMOworCisJCXBidWYgPSBjYnVmOworCQljID0gKnBybXRfcHRyKys7CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWNvbnN0IGNoYXIgKmNwID0gcHJtdF9wdHI7CisJCQlpbnQgbDsKKworCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZwcm10X3B0cik7CisJCQlpZiAocHJtdF9wdHIgPT0gY3ApIHsKKwkJCQlpZiAoKmNwID09ICdcMCcpCisJCQkJCWJyZWFrOworCQkJCWMgPSAqcHJtdF9wdHIrKzsKKworCQkJCXN3aXRjaCAoYykgeworIyBpZiBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUgorCQkJCWNhc2UgJ3UnOgorCQkJCQlwYnVmID0gdXNlcl9idWYgPyB1c2VyX2J1ZiA6IChjaGFyKikiIjsKKwkJCQkJYnJlYWs7CisjIGVuZGlmCisJCQkJY2FzZSAnaCc6CisJCQkJCXBidWYgPSBmcmVlX21lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCQkJCQkqc3RyY2hybnVsKHBidWYsICcuJykgPSAnXDAnOworCQkJCQlicmVhazsKKwkJCQljYXNlICckJzoKKwkJCQkJYyA9IChnZXRldWlkKCkgPT0gMCA/ICcjJyA6ICckJyk7CisJCQkJCWJyZWFrOworIyBpZiBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUgorCQkJCWNhc2UgJ3cnOgorCQkJCQkvKiAvaG9tZS91c2VyWy9zb21ldGhpbmddIC0+IH5bL3NvbWV0aGluZ10gKi8KKwkJCQkJcGJ1ZiA9IGN3ZF9idWY7CisJCQkJCWwgPSBzdHJsZW4oaG9tZV9wd2RfYnVmKTsKKwkJCQkJaWYgKGwgIT0gMAorCQkJCQkgJiYgc3RybmNtcChob21lX3B3ZF9idWYsIGN3ZF9idWYsIGwpID09IDAKKwkJCQkJICYmIChjd2RfYnVmW2xdPT0nLycgfHwgY3dkX2J1ZltsXT09J1wwJykKKwkJCQkJICYmIHN0cmxlbihjd2RfYnVmICsgbCkgPCBQQVRIX01BWAorCQkJCQkpIHsKKwkJCQkJCXBidWYgPSBmcmVlX21lID0geGFzcHJpbnRmKCJ+JXMiLCBjd2RfYnVmICsgbCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisjIGVuZGlmCisJCQkJY2FzZSAnVyc6CisJCQkJCXBidWYgPSBjd2RfYnVmOworCQkJCQljcCA9IHN0cnJjaHIocGJ1ZiwgJy8nKTsKKwkJCQkJaWYgKGNwICE9IE5VTEwgJiYgY3AgIT0gcGJ1ZikKKwkJCQkJCXBidWYgKz0gKGNwLXBidWYpICsgMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnISc6CisJCQkJCXBidWYgPSBmcmVlX21lID0geGFzcHJpbnRmKCIlZCIsIG51bV9va19saW5lcyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2UnOiBjYXNlICdFJzogICAgIC8qIFxlIFxFID0gXDAzMyAqLworCQkJCQljID0gJ1wwMzMnOworCQkJCQlicmVhazsKKwkJCQljYXNlICd4JzogY2FzZSAnWCc6IHsKKwkJCQkJY2hhciBidWYyWzRdOworCQkJCQlmb3IgKGwgPSAwOyBsIDwgMzspIHsKKwkJCQkJCXVuc2lnbmVkIGg7CisJCQkJCQlidWYyW2wrK10gPSAqcHJtdF9wdHI7CisJCQkJCQlidWYyW2xdID0gJ1wwJzsKKwkJCQkJCWggPSBzdHJ0b3VsKGJ1ZjIsICZwYnVmLCAxNik7CisJCQkJCQlpZiAoaCA+IFVDSEFSX01BWCB8fCAocGJ1ZiAtIGJ1ZjIpIDwgbCkgeworCQkJCQkJCWJ1ZjJbLS1sXSA9ICdcMCc7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlwcm10X3B0cisrOworCQkJCQl9CisJCQkJCWMgPSAoY2hhcilzdHJ0b3VsKGJ1ZjIsIE5VTEwsIDE2KTsKKwkJCQkJaWYgKGMgPT0gMCkKKwkJCQkJCWMgPSAnPyc7CisJCQkJCXBidWYgPSBjYnVmOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnWyc6IGNhc2UgJ10nOgorCQkJCQlpZiAoYyA9PSBmbGdfbm90X2xlbmd0aCkgeworCQkJCQkJZmxnX25vdF9sZW5ndGggPSAoZmxnX25vdF9sZW5ndGggPT0gJ1snID8gJ10nIDogJ1snKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0gLyogc3dpdGNoICovCisJCQl9IC8qIGlmICovCisJCX0gLyogaWYgKi8KKwkJY2J1ZlswXSA9IGM7CisJCWN1cl9wcm10X2xlbiA9IHN0cmxlbihwYnVmKTsKKwkJcHJtdF9sZW4gKz0gY3VyX3BybXRfbGVuOworCQlpZiAoZmxnX25vdF9sZW5ndGggIT0gJ10nKQorCQkJY21kZWRpdF9wcm10X2xlbiArPSBjdXJfcHJtdF9sZW47CisJCXBybXRfbWVtX3B0ciA9IHN0cmNhdCh4cmVhbGxvYyhwcm10X21lbV9wdHIsIHBybXRfbGVuKzEpLCBwYnVmKTsKKwkJZnJlZShmcmVlX21lKTsKKwl9IC8qIHdoaWxlICovCisKKwlpZiAoY3dkX2J1ZiAhPSAoY2hhciAqKWJiX21zZ191bmtub3duKQorCQlmcmVlKGN3ZF9idWYpOworCWNtZGVkaXRfcHJvbXB0ID0gcHJtdF9tZW1fcHRyOworCXB1dF9wcm9tcHQoKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjbWRlZGl0X3NldHdpZHRoKHVuc2lnbmVkIHcsIGludCByZWRyYXdfZmxnKQoreworCWNtZGVkaXRfdGVybXcgPSB3OworCWlmIChyZWRyYXdfZmxnKSB7CisJCS8qIG5ldyB5IGZvciBjdXJyZW50IGN1cnNvciAqLworCQlpbnQgbmV3X3kgPSAoY3Vyc29yICsgY21kZWRpdF9wcm10X2xlbikgLyB3OworCQkvKiByZWRyYXcgKi8KKwkJcmVkcmF3KChuZXdfeSA+PSBjbWRlZGl0X3kgPyBuZXdfeSA6IGNtZGVkaXRfeSksIGNvbW1hbmRfbGVuIC0gY3Vyc29yKTsKKwkJZmZsdXNoX2FsbCgpOworCX0KK30KKworc3RhdGljIHZvaWQgd2luX2NoYW5nZWQoaW50IG5zaWcpCit7CisJaW50IHN2X2Vycm5vID0gZXJybm87CisJdW5zaWduZWQgd2lkdGg7CisKKwlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KDAsICZ3aWR0aCwgTlVMTCk7CisvL0ZJWE1FOiBjbWRlZGl0X3NldHdpZHRoKCkgLT4gcmVkcmF3KCkgLT4gcHJpbnRmKCkgLT4gS0FCT09NISAod2UgYXJlIGluIHNpZ25hbCBoYW5kbGVyISkKKwljbWRlZGl0X3NldHdpZHRoKHdpZHRoLCAvKnJlZHJhd19mbGc6Ki8gbnNpZyk7CisKKwllcnJubyA9IHN2X2Vycm5vOworfQorCitzdGF0aWMgaW50IGxpbmVlZGl0X3JlYWRfa2V5KGNoYXIgKnJlYWRfa2V5X2J1ZmZlciwgaW50IHRpbWVvdXQpCit7CisJaW50NjRfdCBpYzsKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJY2hhciB1bmljb2RlX2J1ZltNQl9DVVJfTUFYICsgMV07CisJaW50IHVuaWNvZGVfaWR4ID0gMDsKKyNlbmRpZgorCisJd2hpbGUgKDEpIHsKKwkJLyogV2FpdCBmb3IgaW5wdXQuIFRJTUVPVVQgPSAtMSBtYWtlcyByZWFkX2tleSB3YWl0IGV2ZW4KKwkJICogb24gbm9uYmxvY2tpbmcgc3RkaW4sIFRJTUVPVVQgPSA1MCBtYWtlcyBzdXJlIHdlIHdvbid0CisJCSAqIGluc2lzdCBvbiBmdWxsIE1CX0NVUl9NQVggYnVmZmVyIHRvIGRlY2xhcmUgaW5wdXQgbGlrZQorCQkgKiAiXHhmZlxuIixwYXVzZSwibHNcbiIgaW52YWxpZCBhbmQgdGh1cyB3b24ndCBsb3NlICJscyIuCisJCSAqCisJCSAqIE5vdGU6IHJlYWRfa2V5IHNldHMgZXJybm8gdG8gMCBvbiBzdWNjZXNzLgorCQkgKi8KKwkJaWMgPSByZWFkX2tleShTVERJTl9GSUxFTk8sIHJlYWRfa2V5X2J1ZmZlciwgdGltZW91dCk7CisJCWlmIChlcnJubykgeworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCWlmIChlcnJubyA9PSBFQUdBSU4gJiYgdW5pY29kZV9pZHggIT0gMCkKKwkJCQlnb3RvIHB1c2hiYWNrOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwKKwkJaWYgKChpbnQzMl90KWljID09IEtFWUNPREVfQ1VSU09SX1BPUworCQkgJiYgUy5zZW50X0VTQ19icjZuCisJCSkgeworCQkJUy5zZW50X0VTQ19icjZuID0gMDsKKwkJCWlmIChjdXJzb3IgPT0gMCkgeyAvKiBvdGhlcndpc2UgaXQgbWF5IGJlIGJvZ3VzICovCisJCQkJaW50IGNvbCA9ICgoaWMgPj4gMzIpICYgMHg3ZmZmKSAtIDE7CisJCQkJaWYgKGNvbCA+IGNtZGVkaXRfcHJtdF9sZW4pIHsKKwkJCQkJY21kZWRpdF94ICs9IChjb2wgLSBjbWRlZGl0X3BybXRfbGVuKTsKKwkJCQkJd2hpbGUgKGNtZGVkaXRfeCA+PSBjbWRlZGl0X3Rlcm13KSB7CisJCQkJCQljbWRlZGl0X3ggLT0gY21kZWRpdF90ZXJtdzsKKwkJCQkJCWNtZGVkaXRfeSsrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9PTikgeworCQkJd2NoYXJfdCB3YzsKKworCQkJaWYgKChpbnQzMl90KWljIDwgMCkgLyogS0VZQ09ERV94eHggKi8KKwkJCQlicmVhazsKKwkJCS8vIFRPRE86IGltYWdpbmUgc2VxdWVuY2UgbGlrZTogMHhmZiw8bGVmdC1hcnJvdz46IHdlIGFyZSBjdXJyZW50bHkgbG9zaW5nIDB4ZmYuLi4KKworCQkJdW5pY29kZV9idWZbdW5pY29kZV9pZHgrK10gPSBpYzsKKwkJCXVuaWNvZGVfYnVmW3VuaWNvZGVfaWR4XSA9ICdcMCc7CisJCQlpZiAobWJzdG93Y3MoJndjLCB1bmljb2RlX2J1ZiwgMSkgIT0gMSkgeworCQkJCS8qIE5vdCAoeWV0PykgYSB2YWxpZCB1bmljb2RlIGNoYXIgKi8KKwkJCQlpZiAodW5pY29kZV9pZHggPCBNQl9DVVJfTUFYKSB7CisJCQkJCXRpbWVvdXQgPSA1MDsKKwkJCQkJY29udGludWU7CisJCQkJfQorIHB1c2hiYWNrOgorCQkJCS8qIEludmFsaWQgc2VxdWVuY2UuIFNhdmUgYWxsICJiYWQgYnl0ZXMiIGV4Y2VwdCBmaXJzdCAqLworCQkJCXJlYWRfa2V5X3VuZ2V0cyhyZWFkX2tleV9idWZmZXIsIHVuaWNvZGVfYnVmICsgMSwgdW5pY29kZV9pZHggLSAxKTsKKyMgaWYgIUVOQUJMRV9VTklDT0RFX1BSRVNFUlZFX0JST0tFTgorCQkJCWljID0gQ09ORklHX1NVQlNUX1dDSEFSOworIyBlbHNlCisJCQkJaWMgPSB1bmljb2RlX21hcmtfcmF3X2J5dGUodW5pY29kZV9idWZbMF0pOworIyBlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQkvKiBWYWxpZCB1bmljb2RlIGNoYXIsIHJldHVybiBpdHMgY29kZSAqLworCQkJCWljID0gd2M7CisJCQl9CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaWM7Cit9CisKKyNpZiBFTkFCTEVfVU5JQ09ERV9CSURJX1NVUFBPUlQKK3N0YXRpYyBpbnQgaXNydGxfc3RyKHZvaWQpCit7CisJaW50IGlkeCA9IGN1cnNvcjsKKworCXdoaWxlIChpZHggPCBjb21tYW5kX2xlbiAmJiB1bmljb2RlX2JpZGlfaXNfbmV1dHJhbF93Y2hhcihjb21tYW5kX3BzW2lkeF0pKQorCQlpZHgrKzsKKwlyZXR1cm4gdW5pY29kZV9iaWRpX2lzcnRsKGNvbW1hbmRfcHNbaWR4XSk7Cit9CisjZWxzZQorIyBkZWZpbmUgaXNydGxfc3RyKCkgMAorI2VuZGlmCisKKy8qIGxlYXZlIG91dCB0aGUgInZpLW1vZGUiLW9ubHkgY2FzZSBsYWJlbHMgaWYgdmkgZWRpdGluZyBpc24ndAorICogY29uZmlndXJlZC4gKi8KKyNkZWZpbmUgdmlfY2FzZShjYXNlbGFiZWwpIElGX0ZFQVRVUkVfRURJVElOR19WSShjYXNlIGNhc2VsYWJlbCkKKworLyogY29udmVydCB1cHBlcmNhc2UgYXNjaWkgdG8gZXF1aXZhbGVudCBjb250cm9sIGNoYXIsIGZvciByZWFkYWJpbGl0eSAqLworI3VuZGVmIENUUkwKKyNkZWZpbmUgQ1RSTChhKSAoKGEpICYgfjB4NDApCisKK2VudW0geworCVZJX0NNRE1PREVfQklUID0gMHg0MDAwMDAwMCwKKwkvKiAweDgwMDAwMDAwIGJpdCBmbGFncyBLRVlDT0RFX3h4eCAqLworfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JFVkVSU0VfU0VBUkNICisvKiBNaW1pYyByZWFkbGluZSBDdHJsLVIgcmV2ZXJzZSBoaXN0b3J5IHNlYXJjaC4KKyAqIFdoZW4gaW52b2tlZCwgaXQgc2hvd3MgdGhlIGZvbGxvd2luZyBwcm9tcHQ6CisgKiAocmV2ZXJzZS1pLXNlYXJjaCknJzogdXNlcl9pbnB1dCBbY3Vyc29yIHBvcyB1bmNoYW5nZWQgYnkgQ3RybC1SXQorICogYW5kIHR5cGluZyByZXN1bHRzIGluIHNlYXJjaCBiZWluZyBwZXJmb3JtZWQ6CisgKiAocmV2ZXJzZS1pLXNlYXJjaCkndG1wJzogY2QgL3RtcCBbY3Vyc29yIHVuZGVyIHQgaW4gL3RtcF0KKyAqIFNlYXJjaCBpcyBwZXJmb3JtZWQgYnkgbG9va2luZyBhdCBwcm9ncmVzc2l2ZWx5IG9sZGVyIGxpbmVzIGluIGhpc3RvcnkuCisgKiBDdHJsLVIgYWdhaW4gc2VhcmNoZXMgZm9yIHRoZSBuZXh0IG1hdGNoIGluIGhpc3RvcnkuCisgKiBCYWNrc3BhY2UgZGVsZXRlcyBsYXN0IG1hdGNoZWQgY2hhci4KKyAqIENvbnRyb2wga2V5cyBleGl0IHNlYXJjaCBhbmQgcmV0dXJuIHRvIG5vcm1hbCBlZGl0aW5nIChhdCBjdXJyZW50IGhpc3RvcnkgbGluZSkuCisgKi8KK3N0YXRpYyBpbnQzMl90IHJldmVyc2VfaV9zZWFyY2godm9pZCkKK3sKKwljaGFyIG1hdGNoX2J1ZlsxMjhdOyAvKiBmb3IgdXNlciBpbnB1dCAqLworCWNoYXIgcmVhZF9rZXlfYnVmZmVyW0tFWUNPREVfQlVGRkVSX1NJWkVdOworCWNvbnN0IGNoYXIgKm1hdGNoZWRfaGlzdG9yeV9saW5lOworCWNvbnN0IGNoYXIgKnNhdmVkX3Byb21wdDsKKwlpbnQzMl90IGljOworCisJbWF0Y2hlZF9oaXN0b3J5X2xpbmUgPSBOVUxMOworCXJlYWRfa2V5X2J1ZmZlclswXSA9IDA7CisJbWF0Y2hfYnVmWzBdID0gJ1wwJzsKKworCS8qIFNhdmUgYW5kIHJlcGxhY2UgdGhlIHByb21wdCAqLworCXNhdmVkX3Byb21wdCA9IGNtZGVkaXRfcHJvbXB0OworCWdvdG8gc2V0X3Byb21wdDsKKworCXdoaWxlICgxKSB7CisJCWludCBoOworCQl1bnNpZ25lZCBtYXRjaF9idWZfbGVuID0gc3RybGVuKG1hdGNoX2J1Zik7CisKKwkJZmZsdXNoX2FsbCgpOworLy9GSVhNRTogY29ycmVjdCB0aW1lb3V0PworCQlpYyA9IGxpbmVlZGl0X3JlYWRfa2V5KHJlYWRfa2V5X2J1ZmZlciwgLTEpOworCisJCXN3aXRjaCAoaWMpIHsKKwkJY2FzZSBDVFJMKCdSJyk6IC8qIHNlYXJjaGluZyBmb3IgdGhlIG5leHQgbWF0Y2ggKi8KKwkJCWJyZWFrOworCisJCWNhc2UgJ1xiJzoKKwkJY2FzZSAnXHg3Zic6CisJCQkvKiBCYWNrc3BhY2UgKi8KKwkJCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisJCQkJd2hpbGUgKG1hdGNoX2J1Zl9sZW4gIT0gMCkgeworCQkJCQl1aW50OF90IGMgPSBtYXRjaF9idWZbLS1tYXRjaF9idWZfbGVuXTsKKwkJCQkJaWYgKChjICYgMHhjMCkgIT0gMHg4MCkgLyogc3RhcnQgb2YgVVRGLTggY2hhcj8gKi8KKwkJCQkJCWJyZWFrOyAvKiB5ZXMgKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChtYXRjaF9idWZfbGVuICE9IDApCisJCQkJCW1hdGNoX2J1Zl9sZW4tLTsKKwkJCX0KKwkJCW1hdGNoX2J1ZlttYXRjaF9idWZfbGVuXSA9ICdcMCc7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaWYgKGljIDwgJyAnCisJCQkgfHwgKCFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUICYmIGljID49IDI1NikKKwkJCSB8fCAoRU5BQkxFX1VOSUNPREVfU1VQUE9SVCAmJiBpYyA+PSBWSV9DTURNT0RFX0JJVCkKKwkJCSkgeworCQkJCWdvdG8gcmV0OworCQkJfQorCisJCQkvKiBBcHBlbmQgdGhpcyBjaGFyICovCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQkJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKwkJCQltYnN0YXRlX3QgbWJzdGF0ZSA9IHsgMCB9OworCQkJCWNoYXIgYnVmW01CX0NVUl9NQVggKyAxXTsKKwkJCQlpbnQgbGVuID0gd2NydG9tYihidWYsIGljLCAmbWJzdGF0ZSk7CisJCQkJaWYgKGxlbiA+IDApIHsKKwkJCQkJYnVmW2xlbl0gPSAnXDAnOworCQkJCQlpZiAobWF0Y2hfYnVmX2xlbiArIGxlbiA8IHNpemVvZihtYXRjaF9idWYpKQorCQkJCQkJc3RyY3B5KG1hdGNoX2J1ZiArIG1hdGNoX2J1Zl9sZW4sIGJ1Zik7CisJCQkJfQorCQkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChtYXRjaF9idWZfbGVuIDwgc2l6ZW9mKG1hdGNoX2J1ZikgLSAxKSB7CisJCQkJbWF0Y2hfYnVmW21hdGNoX2J1Zl9sZW5dID0gaWM7CisJCQkJbWF0Y2hfYnVmW21hdGNoX2J1Zl9sZW4gKyAxXSA9ICdcMCc7CisJCQl9CisJCQlicmVhazsKKwkJfSAvKiBzd2l0Y2ggKGljKSAqLworCisJCS8qIFNlYXJjaCBpbiBoaXN0b3J5IGZvciBtYXRjaF9idWYgKi8KKwkJaCA9IHN0YXRlLT5jdXJfaGlzdG9yeTsKKwkJaWYgKGljID09IENUUkwoJ1InKSkKKwkJCWgtLTsKKwkJd2hpbGUgKGggPj0gMCkgeworCQkJaWYgKHN0YXRlLT5oaXN0b3J5W2hdKSB7CisJCQkJY2hhciAqbWF0Y2ggPSBzdHJzdHIoc3RhdGUtPmhpc3RvcnlbaF0sIG1hdGNoX2J1Zik7CisJCQkJaWYgKG1hdGNoKSB7CisJCQkJCXN0YXRlLT5jdXJfaGlzdG9yeSA9IGg7CisJCQkJCW1hdGNoZWRfaGlzdG9yeV9saW5lID0gc3RhdGUtPmhpc3RvcnlbaF07CisJCQkJCWNvbW1hbmRfbGVuID0gbG9hZF9zdHJpbmcobWF0Y2hlZF9oaXN0b3J5X2xpbmUpOworCQkJCQljdXJzb3IgPSBtYXRjaCAtIG1hdGNoZWRfaGlzdG9yeV9saW5lOworLy9GSVhNRTogY3Vyc29yIHBvc2l0aW9uIGZvciBVbmljb2RlIGNhc2UKKworCQkJCQlmcmVlKChjaGFyKiljbWRlZGl0X3Byb21wdCk7Cisgc2V0X3Byb21wdDoKKwkJCQkJY21kZWRpdF9wcm9tcHQgPSB4YXNwcmludGYoIihyZXZlcnNlLWktc2VhcmNoKSclcyc6ICIsIG1hdGNoX2J1Zik7CisJCQkJCWNtZGVkaXRfcHJtdF9sZW4gPSBzdHJsZW4oY21kZWRpdF9wcm9tcHQpOworCQkJCQlnb3RvIGRvX3JlZHJhdzsKKwkJCQl9CisJCQl9CisJCQloLS07CisJCX0KKworCQkvKiBOb3QgZm91bmQgKi8KKwkJbWF0Y2hfYnVmW21hdGNoX2J1Zl9sZW5dID0gJ1wwJzsKKwkJYmVlcCgpOworCQljb250aW51ZTsKKworIGRvX3JlZHJhdzoKKwkJcmVkcmF3KGNtZGVkaXRfeSwgY29tbWFuZF9sZW4gLSBjdXJzb3IpOworCX0gLyogd2hpbGUgKDEpICovCisKKyByZXQ6CisJaWYgKG1hdGNoZWRfaGlzdG9yeV9saW5lKQorCQljb21tYW5kX2xlbiA9IGxvYWRfc3RyaW5nKG1hdGNoZWRfaGlzdG9yeV9saW5lKTsKKworCWZyZWUoKGNoYXIqKWNtZGVkaXRfcHJvbXB0KTsKKwljbWRlZGl0X3Byb21wdCA9IHNhdmVkX3Byb21wdDsKKwljbWRlZGl0X3BybXRfbGVuID0gc3RybGVuKGNtZGVkaXRfcHJvbXB0KTsKKwlyZWRyYXcoY21kZWRpdF95LCBjb21tYW5kX2xlbiAtIGN1cnNvcik7CisKKwlyZXR1cm4gaWM7Cit9CisjZW5kaWYKKworLyogbWF4c2l6ZSBtdXN0IGJlID49IDIuCisgKiBSZXR1cm5zOgorICogLTEgb24gcmVhZCBlcnJvcnMgb3IgRU9GLCBvciBvbiBiYXJlIEN0cmwtRCwKKyAqIDAgIG9uIGN0cmwtQyAodGhlIGxpbmUgZW50ZXJlZCBpcyBzdGlsbCByZXR1cm5lZCBpbiAnY29tbWFuZCcpLAorICogPjAgbGVuZ3RoIG9mIGlucHV0IHN0cmluZywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nICdcbicKKyAqLworaW50IEZBU1RfRlVOQyByZWFkX2xpbmVfaW5wdXQobGluZV9pbnB1dF90ICpzdCwgY29uc3QgY2hhciAqcHJvbXB0LCBjaGFyICpjb21tYW5kLCBpbnQgbWF4c2l6ZSwgaW50IHRpbWVvdXQpCit7CisJaW50IGxlbjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCXNtYWxsaW50IGxhc3RXYXNUYWIgPSAwOworI2VuZGlmCisJc21hbGxpbnQgYnJlYWtfb3V0ID0gMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisJc21hbGxpbnQgdmlfY21kbW9kZSA9IDA7CisjZW5kaWYKKwlzdHJ1Y3QgdGVybWlvcyBpbml0aWFsX3NldHRpbmdzOworCXN0cnVjdCB0ZXJtaW9zIG5ld19zZXR0aW5nczsKKwljaGFyIHJlYWRfa2V5X2J1ZmZlcltLRVlDT0RFX0JVRkZFUl9TSVpFXTsKKworCUlOSVRfUygpOworCisJaWYgKHRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZpbml0aWFsX3NldHRpbmdzKSA8IDAKKwkgfHwgIShpbml0aWFsX3NldHRpbmdzLmNfbGZsYWcgJiBFQ0hPKQorCSkgeworCQkvKiBIYXBwZW5zIHdoZW4gZS5nLiBzdHR5IC1lY2hvIHdhcyBydW4gYmVmb3JlICovCisJCXBhcnNlX2FuZF9wdXRfcHJvbXB0KHByb21wdCk7CisJCS8qIGZmbHVzaF9hbGwoKTsgLSBkb25lIGJ5IHBhcnNlX2FuZF9wdXRfcHJvbXB0ICovCisJCWlmIChmZ2V0cyhjb21tYW5kLCBtYXhzaXplLCBzdGRpbikgPT0gTlVMTCkKKwkJCWxlbiA9IC0xOyAvKiBFT0Ygb3IgZXJyb3IgKi8KKwkJZWxzZQorCQkJbGVuID0gc3RybGVuKGNvbW1hbmQpOworCQlERUlOSVRfUygpOworCQlyZXR1cm4gbGVuOworCX0KKworCWluaXRfdW5pY29kZSgpOworCisvLyBGSVhNRTogYXVkaXQgJiBpbXByb3ZlIHRoaXMKKwlpZiAobWF4c2l6ZSA+IE1BWF9MSU5FTEVOKQorCQltYXhzaXplID0gTUFYX0xJTkVMRU47CisJUy5tYXhzaXplID0gbWF4c2l6ZTsKKworCS8qIFdpdGggemVybyBmbGFncywgbm8gb3RoZXIgZmllbGRzIGFyZSBldmVyIHVzZWQgKi8KKwlzdGF0ZSA9IHN0ID8gc3QgOiAobGluZV9pbnB1dF90KikgJmNvbnN0X2ludF8wOworI2lmIE1BWF9ISVNUT1JZID4gMAorIyBpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJaWYgKChzdGF0ZS0+ZmxhZ3MgJiBTQVZFX0hJU1RPUlkpICYmIHN0YXRlLT5oaXN0X2ZpbGUpCisJCWlmIChzdGF0ZS0+Y250X2hpc3RvcnkgPT0gMCkKKwkJCWxvYWRfaGlzdG9yeShzdGF0ZSk7CisjIGVuZGlmCisJaWYgKHN0YXRlLT5mbGFncyAmIERPX0hJU1RPUlkpCisJCXN0YXRlLT5jdXJfaGlzdG9yeSA9IHN0YXRlLT5jbnRfaGlzdG9yeTsKKyNlbmRpZgorCisJLyogcHJlcGFyZSBiZWZvcmUgaW5pdCBoYW5kbGVycyAqLworCWNtZGVkaXRfeSA9IDA7ICAvKiBxdWFzaXJlYWwgeSwgbm90IHRydWUgaWYgbGluZSA+IHh0Knl0ICovCisJY29tbWFuZF9sZW4gPSAwOworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwljb21tYW5kX3BzID0geHphbGxvYyhtYXhzaXplICogc2l6ZW9mKGNvbW1hbmRfcHNbMF0pKTsKKyNlbHNlCisJY29tbWFuZF9wcyA9IGNvbW1hbmQ7CisJY29tbWFuZFswXSA9ICdcMCc7CisjZW5kaWYKKyNkZWZpbmUgY29tbWFuZCBjb21tYW5kX211c3Rfbm90X2JlX3VzZWQKKworCW5ld19zZXR0aW5ncyA9IGluaXRpYWxfc2V0dGluZ3M7CisJbmV3X3NldHRpbmdzLmNfbGZsYWcgJj0gfklDQU5PTjsgICAgICAgIC8qIHVuYnVmZmVyZWQgaW5wdXQgKi8KKwkvKiBUdXJuIG9mZiBlY2hvaW5nIGFuZCBDVFJMLUMsIHNvIHdlIGNhbiB0cmFwIGl0ICovCisJbmV3X3NldHRpbmdzLmNfbGZsYWcgJj0gfihFQ0hPIHwgRUNIT05MIHwgSVNJRyk7CisJLyogSG1tLCBpbiBsaW51eCBjX2NjW10gaXMgbm90IHBhcnNlZCBpZiBJQ0FOT04gaXMgb2ZmICovCisJbmV3X3NldHRpbmdzLmNfY2NbVk1JTl0gPSAxOworCW5ld19zZXR0aW5ncy5jX2NjW1ZUSU1FXSA9IDA7CisJLyogVHVybiBvZmYgQ1RSTC1DLCBzbyB3ZSBjYW4gdHJhcCBpdCAqLworCW5ld19zZXR0aW5ncy5jX2NjW1ZJTlRSXSA9IF9QT1NJWF9WRElTQUJMRTsKKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmbmV3X3NldHRpbmdzKTsKKworI2lmIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSCisJeworCQlzdHJ1Y3QgcGFzc3dkICplbnRyeTsKKworCQllbnRyeSA9IGdldHB3dWlkKGdldGV1aWQoKSk7CisJCWlmIChlbnRyeSkgeworCQkJdXNlcl9idWYgPSB4c3RyZHVwKGVudHJ5LT5wd19uYW1lKTsKKwkJCWhvbWVfcHdkX2J1ZiA9IHhzdHJkdXAoZW50cnktPnB3X2Rpcik7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIDAKKwlmb3IgKGkgPSAwOyBpIDw9IHN0YXRlLT5tYXhfaGlzdG9yeTsgaSsrKQorCQliYl9lcnJvcl9tc2coImhpc3RvcnlbJWRdOiclcyciLCBpLCBzdGF0ZS0+aGlzdG9yeVtpXSk7CisJYmJfZXJyb3JfbXNnKCJjdXJfaGlzdG9yeTolZCBjbnRfaGlzdG9yeTolZCIsIHN0YXRlLT5jdXJfaGlzdG9yeSwgc3RhdGUtPmNudF9oaXN0b3J5KTsKKyNlbmRpZgorCisJLyogUHJpbnQgb3V0IHRoZSBjb21tYW5kIHByb21wdCwgb3B0aW9uYWxseSBhc2sgd2hlcmUgY3Vyc29yIGlzICovCisJcGFyc2VfYW5kX3B1dF9wcm9tcHQocHJvbXB0KTsKKwlhc2tfdGVybWluYWwoKTsKKworCS8qIEluc3RhbGwgd2luZG93IHJlc2l6ZSBoYW5kbGVyIChOQjogYWZ0ZXIgKmFsbCogaW5pdCBpcyBjb21wbGV0ZSkgKi8KKy8vRklYTUU6IHNhdmUgZW50aXJlIHNpZ2FjdGlvbiEKKwlwcmV2aW91c19TSUdXSU5DSF9oYW5kbGVyID0gc2lnbmFsKFNJR1dJTkNILCB3aW5fY2hhbmdlZCk7CisJd2luX2NoYW5nZWQoMCk7IC8qIGdldCBpbml0aWFsIHdpbmRvdyBzaXplICovCisKKwlyZWFkX2tleV9idWZmZXJbMF0gPSAwOworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIFRoZSBlbWFjcyBhbmQgdmkgbW9kZXMgc2hhcmUgbXVjaCBvZiB0aGUgY29kZSBpbiB0aGUgYmlnCisJCSAqIGNvbW1hbmQgbG9vcC4gIENvbW1hbmRzIGVudGVyZWQgd2hlbiBpbiB2aSdzIGNvbW1hbmQgbW9kZQorCQkgKiAoYWthICJlc2NhcGUgbW9kZSIpIGdldCBhbiBleHRyYSBiaXQgYWRkZWQgdG8gZGlzdGluZ3Vpc2gKKwkJICogdGhlbSAtIHRoaXMga2VlcHMgdGhlbSBmcm9tIGJlaW5nIHNlbGYtaW5zZXJ0ZWQuIFRoaXMKKwkJICogY2x1dHRlcnMgdGhlIGJpZyBzd2l0Y2ggYSBiaXQsIGJ1dCBrZWVwcyBhbGwgdGhlIGNvZGUKKwkJICogaW4gb25lIHBsYWNlLgorCQkgKi8KKwkJaW50MzJfdCBpYywgaWNfcmF3OworCisJCWZmbHVzaF9hbGwoKTsKKwkJaWMgPSBpY19yYXcgPSBsaW5lZWRpdF9yZWFkX2tleShyZWFkX2tleV9idWZmZXIsIHRpbWVvdXQpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVWRVJTRV9TRUFSQ0gKKyBhZ2FpbjoKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKKwkJbmV3ZGVsZmxhZyA9IDE7CisJCWlmICh2aV9jbWRtb2RlKSB7CisJCQkvKiBidHcsIHNpbmNlIEtFWUNPREVfeHh4IGFyZSBhbGwgPCAwLCB0aGlzIGRvZXNuJ3QKKwkJCSAqIGNoYW5nZSBpYyBpZiBpdCBjb250YWlucyBvbmUgb2YgdGhlbTogKi8KKwkJCWljIHw9IFZJX0NNRE1PREVfQklUOworCQl9CisjZW5kaWYKKworCQlzd2l0Y2ggKGljKSB7CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXHInOgorCQl2aV9jYXNlKCdcbid8VklfQ01ETU9ERV9CSVQ6KQorCQl2aV9jYXNlKCdccid8VklfQ01ETU9ERV9CSVQ6KQorCQkJLyogRW50ZXIgKi8KKwkJCWdvdG9fbmV3X2xpbmUoKTsKKwkJCWJyZWFrX291dCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBDVFJMKCdBJyk6CisJCXZpX2Nhc2UoJzAnfFZJX0NNRE1PREVfQklUOikKKwkJCS8qIENvbnRyb2wtYSAtLSBCZWdpbm5pbmcgb2YgbGluZSAqLworCQkJaW5wdXRfYmFja3dhcmQoY3Vyc29yKTsKKwkJCWJyZWFrOworCQljYXNlIENUUkwoJ0InKToKKwkJdmlfY2FzZSgnaCd8VklfQ01ETU9ERV9CSVQ6KQorCQl2aV9jYXNlKCdcYid8VklfQ01ETU9ERV9CSVQ6KSAvKiBeSCAqLworCQl2aV9jYXNlKCdceDdmJ3xWSV9DTURNT0RFX0JJVDopIC8qIERFTCAqLworCQkJaW5wdXRfYmFja3dhcmQoMSk7IC8qIE1vdmUgYmFjayBvbmUgY2hhcmFjdGVyICovCisJCQlicmVhazsKKwkJY2FzZSBDVFJMKCdFJyk6CisJCXZpX2Nhc2UoJyQnfFZJX0NNRE1PREVfQklUOikKKwkJCS8qIENvbnRyb2wtZSAtLSBFbmQgb2YgbGluZSAqLworCQkJcHV0X3RpbGxfZW5kX2FuZF9hZHZfY3Vyc29yKCk7CisJCQlicmVhazsKKwkJY2FzZSBDVFJMKCdGJyk6CisJCXZpX2Nhc2UoJ2wnfFZJX0NNRE1PREVfQklUOikKKwkJdmlfY2FzZSgnICd8VklfQ01ETU9ERV9CSVQ6KQorCQkJaW5wdXRfZm9yd2FyZCgpOyAvKiBNb3ZlIGZvcndhcmQgb25lIGNoYXJhY3RlciAqLworCQkJYnJlYWs7CisJCWNhc2UgJ1xiJzogICAvKiBeSCAqLworCQljYXNlICdceDdmJzogLyogREVMICovCisJCQlpZiAoIWlzcnRsX3N0cigpKQorCQkJCWlucHV0X2JhY2tzcGFjZSgpOworCQkJZWxzZQorCQkJCWlucHV0X2RlbGV0ZSgwKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWUNPREVfREVMRVRFOgorCQkJaWYgKCFpc3J0bF9zdHIoKSkKKwkJCQlpbnB1dF9kZWxldGUoMCk7CisJCQllbHNlCisJCQkJaW5wdXRfYmFja3NwYWNlKCk7CisJCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCQljYXNlICdcdCc6CisJCQlpbnB1dF90YWIoJmxhc3RXYXNUYWIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBDVFJMKCdLJyk6CisJCQkvKiBDb250cm9sLWsgLS0gY2xlYXIgdG8gZW5kIG9mIGxpbmUgKi8KKwkJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IEJCX05VTDsKKwkJCWNvbW1hbmRfbGVuID0gY3Vyc29yOworCQkJcHJpbnRmKFNFUV9DTEVBUl9USUxMX0VORF9PRl9TQ1JFRU4pOworCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnTCcpOgorCQl2aV9jYXNlKENUUkwoJ0wnKXxWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLWwgLS0gY2xlYXIgc2NyZWVuICovCisJCQlwcmludGYoRVNDIltIIik7IC8qIGN1cnNvciB0byB0b3AsbGVmdCAqLworCQkJcmVkcmF3KDAsIGNvbW1hbmRfbGVuIC0gY3Vyc29yKTsKKwkJCWJyZWFrOworI2lmIE1BWF9ISVNUT1JZID4gMAorCQljYXNlIENUUkwoJ04nKToKKwkJdmlfY2FzZShDVFJMKCdOJyl8VklfQ01ETU9ERV9CSVQ6KQorCQl2aV9jYXNlKCdqJ3xWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLW4gLS0gR2V0IG5leHQgY29tbWFuZCBpbiBoaXN0b3J5ICovCisJCQlpZiAoZ2V0X25leHRfaGlzdG9yeSgpKQorCQkJCWdvdG8gcmV3cml0ZV9saW5lOworCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnUCcpOgorCQl2aV9jYXNlKENUUkwoJ1AnKXxWSV9DTURNT0RFX0JJVDopCisJCXZpX2Nhc2UoJ2snfFZJX0NNRE1PREVfQklUOikKKwkJCS8qIENvbnRyb2wtcCAtLSBHZXQgcHJldmlvdXMgY29tbWFuZCBmcm9tIGhpc3RvcnkgKi8KKwkJCWlmIChnZXRfcHJldmlvdXNfaGlzdG9yeSgpKQorCQkJCWdvdG8gcmV3cml0ZV9saW5lOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBDVFJMKCdVJyk6CisJCXZpX2Nhc2UoQ1RSTCgnVScpfFZJX0NNRE1PREVfQklUOikKKwkJCS8qIENvbnRyb2wtVSAtLSBDbGVhciBsaW5lIGJlZm9yZSBjdXJzb3IgKi8KKwkJCWlmIChjdXJzb3IpIHsKKwkJCQljb21tYW5kX2xlbiAtPSBjdXJzb3I7CisJCQkJbWVtbW92ZShjb21tYW5kX3BzLCBjb21tYW5kX3BzICsgY3Vyc29yLAorCQkJCQkoY29tbWFuZF9sZW4gKyAxKSAqIHNpemVvZihjb21tYW5kX3BzWzBdKSk7CisJCQkJcmVkcmF3KGNtZGVkaXRfeSwgY29tbWFuZF9sZW4pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnVycpOgorCQl2aV9jYXNlKENUUkwoJ1cnKXxWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLVcgLS0gUmVtb3ZlIHRoZSBsYXN0IHdvcmQgKi8KKwkJCXdoaWxlIChjdXJzb3IgPiAwICYmIEJCX2lzc3BhY2UoY29tbWFuZF9wc1tjdXJzb3ItMV0pKQorCQkJCWlucHV0X2JhY2tzcGFjZSgpOworCQkJd2hpbGUgKGN1cnNvciA+IDAgJiYgIUJCX2lzc3BhY2UoY29tbWFuZF9wc1tjdXJzb3ItMV0pKQorCQkJCWlucHV0X2JhY2tzcGFjZSgpOworCQkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVWRVJTRV9TRUFSQ0gKKwkJY2FzZSBDVFJMKCdSJyk6CisJCQlpYyA9IGljX3JhdyA9IHJldmVyc2VfaV9zZWFyY2goKTsKKwkJCWdvdG8gYWdhaW47CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKKwkJY2FzZSAnaSd8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9jbWRtb2RlID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdJJ3xWSV9DTURNT0RFX0JJVDoKKwkJCWlucHV0X2JhY2t3YXJkKGN1cnNvcik7CisJCQl2aV9jbWRtb2RlID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdhJ3xWSV9DTURNT0RFX0JJVDoKKwkJCWlucHV0X2ZvcndhcmQoKTsKKwkJCXZpX2NtZG1vZGUgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ0EnfFZJX0NNRE1PREVfQklUOgorCQkJcHV0X3RpbGxfZW5kX2FuZF9hZHZfY3Vyc29yKCk7CisJCQl2aV9jbWRtb2RlID0gMDsKKwkJCWJyZWFrOworCQljYXNlICd4J3xWSV9DTURNT0RFX0JJVDoKKwkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCWJyZWFrOworCQljYXNlICdYJ3xWSV9DTURNT0RFX0JJVDoKKwkJCWlmIChjdXJzb3IgPiAwKSB7CisJCQkJaW5wdXRfYmFja3dhcmQoMSk7CisJCQkJaW5wdXRfZGVsZXRlKDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1cnfFZJX0NNRE1PREVfQklUOgorCQkJdmlfV29yZF9tb3Rpb24oMSk7CisJCQlicmVhazsKKwkJY2FzZSAndyd8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV93b3JkX21vdGlvbigxKTsKKwkJCWJyZWFrOworCQljYXNlICdFJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXZpX0VuZF9tb3Rpb24oKTsKKwkJCWJyZWFrOworCQljYXNlICdlJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXZpX2VuZF9tb3Rpb24oKTsKKwkJCWJyZWFrOworCQljYXNlICdCJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXZpX0JhY2tfbW90aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSAnYid8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9iYWNrX21vdGlvbigpOworCQkJYnJlYWs7CisJCWNhc2UgJ0MnfFZJX0NNRE1PREVfQklUOgorCQkJdmlfY21kbW9kZSA9IDA7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAnRCd8VklfQ01ETU9ERV9CSVQ6CisJCQlnb3RvIGNsZWFyX3RvX2VvbDsKKworCQljYXNlICdjJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXZpX2NtZG1vZGUgPSAwOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJ2QnfFZJX0NNRE1PREVfQklUOiB7CisJCQlpbnQgbmMsIHNjOworCisJCQlpYyA9IGxpbmVlZGl0X3JlYWRfa2V5KHJlYWRfa2V5X2J1ZmZlciwgdGltZW91dCk7CisJCQlpZiAoZXJybm8pIC8qIGVycm9yICovCisJCQkJZ290byByZXR1cm5fZXJyb3JfaW5kaWNhdG9yOworCQkJaWYgKGljID09IGljX3JhdykgeyAvKiAiY2MiLCAiZGQiICovCisJCQkJaW5wdXRfYmFja3dhcmQoY3Vyc29yKTsKKwkJCQlnb3RvIGNsZWFyX3RvX2VvbDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc2MgPSBjdXJzb3I7CisJCQlzd2l0Y2ggKGljKSB7CisJCQljYXNlICd3JzoKKwkJCWNhc2UgJ1cnOgorCQkJY2FzZSAnZSc6CisJCQljYXNlICdFJzoKKwkJCQlzd2l0Y2ggKGljKSB7CisJCQkJY2FzZSAndyc6ICAgLyogImR3IiwgImN3IiAqLworCQkJCQl2aV93b3JkX21vdGlvbih2aV9jbWRtb2RlKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnVyc6ICAgLyogJ2RXJywgJ2NXJyAqLworCQkJCQl2aV9Xb3JkX21vdGlvbih2aV9jbWRtb2RlKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnZSc6ICAgLyogJ2RlJywgJ2NlJyAqLworCQkJCQl2aV9lbmRfbW90aW9uKCk7CisJCQkJCWlucHV0X2ZvcndhcmQoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRSc6ICAgLyogJ2RFJywgJ2NFJyAqLworCQkJCQl2aV9FbmRfbW90aW9uKCk7CisJCQkJCWlucHV0X2ZvcndhcmQoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW5jID0gY3Vyc29yOworCQkJCWlucHV0X2JhY2t3YXJkKGN1cnNvciAtIHNjKTsKKwkJCQl3aGlsZSAobmMtLSA+IGN1cnNvcikKKwkJCQkJaW5wdXRfZGVsZXRlKDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAnYic6ICAvKiAiZGIiLCAiY2IiICovCisJCQljYXNlICdCJzogIC8qIGltcGxlbWVudGVkIGFzIEIgKi8KKwkJCQlpZiAoaWMgPT0gJ2InKQorCQkJCQl2aV9iYWNrX21vdGlvbigpOworCQkJCWVsc2UKKwkJCQkJdmlfQmFja19tb3Rpb24oKTsKKwkJCQl3aGlsZSAoc2MtLSA+IGN1cnNvcikKKwkJCQkJaW5wdXRfZGVsZXRlKDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAnICc6ICAvKiAiZCAiLCAiYyAiICovCisJCQkJaW5wdXRfZGVsZXRlKDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAnJCc6ICAvKiAiZCQiLCAiYyQiICovCisgY2xlYXJfdG9fZW9sOgorCQkJCXdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbikKKwkJCQkJaW5wdXRfZGVsZXRlKDEpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAncCd8VklfQ01ETU9ERV9CSVQ6CisJCQlpbnB1dF9mb3J3YXJkKCk7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlICdQJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXB1dCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3InfFZJX0NNRE1PREVfQklUOgorLy9GSVhNRTogdW5pY29kZSBjYXNlPworCQkJaWMgPSBsaW5lZWRpdF9yZWFkX2tleShyZWFkX2tleV9idWZmZXIsIHRpbWVvdXQpOworCQkJaWYgKGVycm5vKSAvKiBlcnJvciAqLworCQkJCWdvdG8gcmV0dXJuX2Vycm9yX2luZGljYXRvcjsKKwkJCWlmIChpYyA8ICcgJyB8fCBpYyA+IDI1NSkgeworCQkJCWJlZXAoKTsKKwkJCX0gZWxzZSB7CisJCQkJY29tbWFuZF9wc1tjdXJzb3JdID0gaWM7CisJCQkJYmJfcHV0Y2hhcihpYyk7CisJCQkJYmJfcHV0Y2hhcignXGInKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdceDFiJzogLyogRVNDICovCisJCQlpZiAoc3RhdGUtPmZsYWdzICYgVklfTU9ERSkgeworCQkJCS8qIGluc2VydCBtb2RlIC0tPiBjb21tYW5kIG1vZGUgKi8KKwkJCQl2aV9jbWRtb2RlID0gMTsKKwkJCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfQ09NTUFORF9FRElUSU5HX1ZJICovCisKKyNpZiBNQVhfSElTVE9SWSA+IDAKKwkJY2FzZSBLRVlDT0RFX1VQOgorCQkJaWYgKGdldF9wcmV2aW91c19oaXN0b3J5KCkpCisJCQkJZ290byByZXdyaXRlX2xpbmU7CisJCQliZWVwKCk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0RPV046CisJCQlpZiAoIWdldF9uZXh0X2hpc3RvcnkoKSkKKwkJCQlicmVhazsKKyByZXdyaXRlX2xpbmU6CisJCQkvKiBSZXdyaXRlIHRoZSBsaW5lIHdpdGggdGhlIHNlbGVjdGVkIGhpc3RvcnkgaXRlbSAqLworCQkJLyogY2hhbmdlIGNvbW1hbmQgKi8KKwkJCWNvbW1hbmRfbGVuID0gbG9hZF9zdHJpbmcoc3RhdGUtPmhpc3Rvcnlbc3RhdGUtPmN1cl9oaXN0b3J5XSA/CisJCQkJCXN0YXRlLT5oaXN0b3J5W3N0YXRlLT5jdXJfaGlzdG9yeV0gOiAiIik7CisJCQkvKiByZWRyYXcgYW5kIGdvIHRvIGVvbCAoYm9sLCBpbiB2aSkgKi8KKwkJCXJlZHJhdyhjbWRlZGl0X3ksIChzdGF0ZS0+ZmxhZ3MgJiBWSV9NT0RFKSA/IDk5OTkgOiAwKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgS0VZQ09ERV9SSUdIVDoKKwkJCWlucHV0X2ZvcndhcmQoKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWUNPREVfTEVGVDoKKwkJCWlucHV0X2JhY2t3YXJkKDEpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZQ09ERV9DVFJMX0xFRlQ6CisJCQljdHJsX2xlZnQoKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWUNPREVfQ1RSTF9SSUdIVDoKKwkJCWN0cmxfcmlnaHQoKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWUNPREVfSE9NRToKKwkJCWlucHV0X2JhY2t3YXJkKGN1cnNvcik7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0VORDoKKwkJCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbml0aWFsX3NldHRpbmdzLmNfY2NbVklOVFJdICE9IDAKKwkJCSAmJiBpY19yYXcgPT0gaW5pdGlhbF9zZXR0aW5ncy5jX2NjW1ZJTlRSXQorCQkJKSB7CisJCQkJLyogQ3RybC1DICh1c3VhbGx5KSAtIHN0b3AgZ2F0aGVyaW5nIGlucHV0ICovCisJCQkJZ290b19uZXdfbGluZSgpOworCQkJCWNvbW1hbmRfbGVuID0gMDsKKwkJCQlicmVha19vdXQgPSAtMTsgLyogImRvIG5vdCBhcHBlbmQgJ1xuJyIgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpbml0aWFsX3NldHRpbmdzLmNfY2NbVkVPRl0gIT0gMAorCQkJICYmIGljX3JhdyA9PSBpbml0aWFsX3NldHRpbmdzLmNfY2NbVkVPRl0KKwkJCSkgeworCQkJCS8qIEN0cmwtRCAodXN1YWxseSkgLSBkZWxldGUgb25lIGNoYXJhY3RlciwKKwkJCQkgKiBvciBleGl0IGlmIGxlbj0wIGFuZCBubyBjaGFycyB0byBkZWxldGUgKi8KKwkJCQlpZiAoY29tbWFuZF9sZW4gPT0gMCkgeworCQkJCQllcnJubyA9IDA7CisKKwkJY2FzZSAtMTogLyogZXJyb3IgKGUuZy4gRUlPIHdoZW4gdHR5IGlzIGRlc3Ryb3llZCkgKi8KKyBJRl9GRUFUVVJFX0VESVRJTkdfVkkocmV0dXJuX2Vycm9yX2luZGljYXRvcjopCisJCQkJCWJyZWFrX291dCA9IGNvbW1hbmRfbGVuID0gLTE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpbnB1dF9kZWxldGUoMCk7CisJCQkJYnJlYWs7CisJCQl9CisvLwkJCS8qIENvbnRyb2wtViAtLSBmb3JjZSBpbnNlcnQgb2YgbmV4dCBjaGFyICovCisvLwkJCWlmIChjID09IENUUkwoJ1YnKSkgeworLy8JCQkJaWYgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSA8IDEpCisvLwkJCQkJZ290byByZXR1cm5fZXJyb3JfaW5kaWNhdG9yOworLy8JCQkJaWYgKGMgPT0gMCkgeworLy8JCQkJCWJlZXAoKTsKKy8vCQkJCQlicmVhazsKKy8vCQkJCX0KKy8vCQkJfQorCQkJaWYgKGljIDwgJyAnCisJCQkgfHwgKCFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUICYmIGljID49IDI1NikKKwkJCSB8fCAoRU5BQkxFX1VOSUNPREVfU1VQUE9SVCAmJiBpYyA+PSBWSV9DTURNT0RFX0JJVCkKKwkJCSkgeworCQkJCS8qIElmIFZJX0NNRE1PREVfQklUIGlzIHNldCwgaWMgaXMgPj0gMjU2CisJCQkJICogYW5kIHZpIG1vZGUgaWdub3JlcyB1bmV4cGVjdGVkIGNoYXJzLgorCQkJCSAqIE90aGVyd2lzZSwgd2UgYXJlIGhlcmUgaWYgaWMgaXMgYQorCQkJCSAqIGNvbnRyb2wgY2hhciBvciBhbiB1bmhhbmRsZWQgRVNDIHNlcXVlbmNlLAorCQkJCSAqIHdoaWNoIGlzIGFsc28gaWdub3JlZC4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgoaW50KWNvbW1hbmRfbGVuID49IChtYXhzaXplIC0gMikpIHsKKwkJCQkvKiBOb3QgZW5vdWdoIHNwYWNlIGZvciB0aGUgY2hhciBhbmQgRU9MICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNvbW1hbmRfbGVuKys7CisJCQlpZiAoY3Vyc29yID09IChjb21tYW5kX2xlbiAtIDEpKSB7CisJCQkJLyogV2UgYXJlIGF0IHRoZSBlbmQsIGFwcGVuZCAqLworCQkJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IGljOworCQkJCWNvbW1hbmRfcHNbY3Vyc29yICsgMV0gPSBCQl9OVUw7CisJCQkJcHV0X2N1cl9nbHlwaF9hbmRfaW5jX2N1cnNvcigpOworCQkJCWlmICh1bmljb2RlX2JpZGlfaXNydGwoaWMpKQorCQkJCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSW4gdGhlIG1pZGRsZSwgaW5zZXJ0ICovCisJCQkJaW50IHNjID0gY3Vyc29yOworCisJCQkJbWVtbW92ZShjb21tYW5kX3BzICsgc2MgKyAxLCBjb21tYW5kX3BzICsgc2MsCisJCQkJCShjb21tYW5kX2xlbiAtIHNjKSAqIHNpemVvZihjb21tYW5kX3BzWzBdKSk7CisJCQkJY29tbWFuZF9wc1tzY10gPSBpYzsKKwkJCQkvKiBpcyByaWdodC10by1sZWZ0IGNoYXIsIG9yIG5ldXRyYWwgb25lIChlLmcuIGNvbW1hKSB3YXMganVzdCBhZGRlZCB0byBydGwgdGV4dD8gKi8KKwkJCQlpZiAoIWlzcnRsX3N0cigpKQorCQkJCQlzYysrOyAvKiBubyAqLworCQkJCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCQkJCS8qIHRvIHByZXYgeCBwb3MgKyAxICovCisJCQkJaW5wdXRfYmFja3dhcmQoY3Vyc29yIC0gc2MpOworCQkJfQorCQkJYnJlYWs7CisJCX0gLyogc3dpdGNoIChpYykgKi8KKworCQlpZiAoYnJlYWtfb3V0KQorCQkJYnJlYWs7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCQlpZiAoaWNfcmF3ICE9ICdcdCcpCisJCQlsYXN0V2FzVGFiID0gMDsKKyNlbmRpZgorCX0gLyogd2hpbGUgKDEpICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTAorCWlmIChTLnNlbnRfRVNDX2JyNm4pIHsKKwkJLyogInNsZWVwIDE7IGJ1c3lib3ggYXNoIiArIGhvbGQgW0VudGVyXSB0byB0cmlnZ2VyLgorCQkgKiBXZSBzZW50ICJFU0MgWyA2IG4iLCBidXQgZ290ICdcbicgZmlyc3QsIGFuZAorCQkgKiBLRVlDT0RFX0NVUlNPUl9QT1MgcmVzcG9uc2UgaXMgbm93IGJ1ZmZlcmVkIGZyb20gdGVybWluYWwuCisJCSAqIEl0J3MgYmFkIGFscmVhZHkgYW5kIG5vdCBtdWNoIGNhbiBiZSBkb25lIHdpdGggaXQKKwkJICogKGl0IF93aWxsXyBiZSB2aXNpYmxlIGZvciB0aGUgbmV4dCBwcm9jZXNzIHRvIHJlYWQgc3RkaW4pLAorCQkgKiBidXQgd2l0aG91dCB0aGlzIGRlbGF5IGl0IGV2ZW4gc2hvd3MgdXAgb24gdGhlIHNjcmVlbgorCQkgKiBhcyBnYXJiYWdlIGJlY2F1c2Ugd2UgcmVzdG9yZSBlY2hvIHNldHRpbmdzIHdpdGggdGNzZXRhdHRyCisJCSAqIGJlZm9yZSBpdCBjb21lcyBpbi4gVUdMWSEKKwkJICovCisJCXVzbGVlcCgyMCoxMDAwKTsKKwl9CisjZW5kaWYKKworLyogRW5kIG9mIGJ1Zy1jYXRjaGluZyAiY29tbWFuZF9tdXN0X25vdF9iZV91c2VkIiB0cmljayAqLworI3VuZGVmIGNvbW1hbmQKKworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwljb21tYW5kWzBdID0gJ1wwJzsKKwlpZiAoY29tbWFuZF9sZW4gPiAwKQorCQljb21tYW5kX2xlbiA9IHNhdmVfc3RyaW5nKGNvbW1hbmQsIG1heHNpemUgLSAxKTsKKwlmcmVlKGNvbW1hbmRfcHMpOworI2VuZGlmCisKKwlpZiAoY29tbWFuZF9sZW4gPiAwKQorCQlyZW1lbWJlcl9pbl9oaXN0b3J5KGNvbW1hbmQpOworCisJaWYgKGJyZWFrX291dCA+IDApIHsKKwkJY29tbWFuZFtjb21tYW5kX2xlbisrXSA9ICdcbic7CisJCWNvbW1hbmRbY29tbWFuZF9sZW5dID0gJ1wwJzsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCWZyZWVfdGFiX2NvbXBsZXRpb25fZGF0YSgpOworI2VuZGlmCisKKwkvKiByZXN0b3JlIGluaXRpYWxfc2V0dGluZ3MgKi8KKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmaW5pdGlhbF9zZXR0aW5ncyk7CisJLyogcmVzdG9yZSBTSUdXSU5DSCBoYW5kbGVyICovCisJc2lnbmFsKFNJR1dJTkNILCBwcmV2aW91c19TSUdXSU5DSF9oYW5kbGVyKTsKKwlmZmx1c2hfYWxsKCk7CisKKwlsZW4gPSBjb21tYW5kX2xlbjsKKwlERUlOSVRfUygpOworCisJcmV0dXJuIGxlbjsgLyogY2FuJ3QgcmV0dXJuIGNvbW1hbmRfbGVuLCBERUlOSVRfUygpIGRlc3Ryb3lzIGl0ICovCit9CisKKyNlbHNlICAvKiAhRkVBVFVSRV9FRElUSU5HICovCisKKyN1bmRlZiByZWFkX2xpbmVfaW5wdXQKK2ludCBGQVNUX0ZVTkMgcmVhZF9saW5lX2lucHV0KGNvbnN0IGNoYXIqIHByb21wdCwgY2hhciogY29tbWFuZCwgaW50IG1heHNpemUpCit7CisJZnB1dHMocHJvbXB0LCBzdGRvdXQpOworCWZmbHVzaF9hbGwoKTsKKwlmZ2V0cyhjb21tYW5kLCBtYXhzaXplLCBzdGRpbik7CisJcmV0dXJuIHN0cmxlbihjb21tYW5kKTsKK30KKworI2VuZGlmICAvKiAhRkVBVFVSRV9FRElUSU5HICovCisKKworLyoKKyAqIFRlc3RpbmcKKyAqLworCisjaWZkZWYgVEVTVAorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKK2NvbnN0IGNoYXIgKmFwcGxldF9uYW1lID0gImRlYnVnIHN0dWZmIHVzYWdlIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgYnVmZltNQVhfTElORUxFTl07CisJY2hhciAqcHJvbXB0ID0KKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVAorCQkiXFxbXFwwMzNbMzI7MW1cXF1cXHVAXFxbXFx4MWJbMzM7MW1cXF1cXGg6IgorCQkiXFxbXFwwMzNbMzQ7MW1cXF1cXHdcXFtcXDAzM1szNTsxbVxcXSAiCisJCSJcXCFcXFtcXGVbMzY7MW1cXF1cXCQgXFxbXFxFWzBtXFxdIjsKKyNlbHNlCisJCSIlICI7CisjZW5kaWYKKworCXdoaWxlICgxKSB7CisJCWludCBsOworCQlsID0gcmVhZF9saW5lX2lucHV0KHByb21wdCwgYnVmZik7CisJCWlmIChsIDw9IDAgfHwgYnVmZltsLTFdICE9ICdcbicpCisJCQlicmVhazsKKwkJYnVmZltsLTFdID0gJ1wwJzsKKwkJcHJpbnRmKCIqKiogcmVhZF9saW5lX2lucHV0KCkgcmV0dXJuZWQgbGluZSA9JXM9XG4iLCBidWZmKTsKKwl9CisJcHJpbnRmKCIqKiogcmVhZF9saW5lX2lucHV0KCkgZGV0ZWN0IF5EXG4iKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmICAvKiBURVNUICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9saW5lZWRpdF9wdHJfaGFjay5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbGluZWVkaXRfcHRyX2hhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ1ODU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbGluZWVkaXRfcHRyX2hhY2suYwpAQCAtMCwwICsxLDIzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKK3N0cnVjdCBsaW5lZWRpdF9zdGF0aWNzOworCisjaWZuZGVmIEdDQ19DT01CSU5FCisKKy8qIFdlIGNoZWF0IGhlcmUuIEl0IGlzIGRlY2xhcmVkIGFzIGNvbnN0IHB0ciBpbiBsaWJiYi5oLAorICogYnV0IGhlcmUgd2UgbWFrZSBpdCBsaXZlIGluIFIvVyBtZW1vcnkgKi8KK3N0cnVjdCBsaW5lZWRpdF9zdGF0aWNzICpsaW5lZWRpdF9wdHJfdG9fc3RhdGljczsKKworI2Vsc2UKKworLyogZ2NjIC1jb21iaW5lIHdpbGwgc2VlIHRocm91Z2ggYW5kIGNvbXBsYWluICovCisvKiBVc2luZyBhbHRlcm5hdGl2ZSBtZXRob2Qgd2hpY2ggaXMgbW9yZSBsaWtlbHkgdG8gYnJlYWsKKyAqIG9uIHdlaXJkIGFyY2hpdGVjdHVyZXMsIGNvbXBpbGVycywgbGlua2VycyBhbmQgc28gb24gKi8KK3N0cnVjdCBsaW5lZWRpdF9zdGF0aWNzICpjb25zdCBsaW5lZWRpdF9wdHJfdG9fc3RhdGljcyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9sbGlzdC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbGxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzJlOWZhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbGxpc3QuYwpAQCAtMCwwICsxLDk4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsaW5rZWQgbGlzdCBoZWxwZXIgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBHbGVubiBNY0dyYXRoCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVmxhZGltaXIgT2xleW5paworICogQ29weXJpZ2h0IChDKSAyMDA1IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogQWRkIGRhdGEgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5rZWQgbGlzdC4gICovCit2b2lkIEZBU1RfRlVOQyBsbGlzdF9hZGRfdG8obGxpc3RfdCAqKm9sZF9oZWFkLCB2b2lkICpkYXRhKQoreworCWxsaXN0X3QgKm5ld19oZWFkID0geG1hbGxvYyhzaXplb2YobGxpc3RfdCkpOworCisJbmV3X2hlYWQtPmRhdGEgPSBkYXRhOworCW5ld19oZWFkLT5saW5rID0gKm9sZF9oZWFkOworCSpvbGRfaGVhZCA9IG5ld19oZWFkOworfQorCisvKiBBZGQgZGF0YSB0byB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdC4gICovCit2b2lkIEZBU1RfRlVOQyBsbGlzdF9hZGRfdG9fZW5kKGxsaXN0X3QgKipsaXN0X2hlYWQsIHZvaWQgKmRhdGEpCit7CisJd2hpbGUgKCpsaXN0X2hlYWQpCisJCWxpc3RfaGVhZCA9ICYoKmxpc3RfaGVhZCktPmxpbms7CisJKmxpc3RfaGVhZCA9IHh6YWxsb2Moc2l6ZW9mKGxsaXN0X3QpKTsKKwkoKmxpc3RfaGVhZCktPmRhdGEgPSBkYXRhOworCS8qKCpsaXN0X2hlYWQpLT5saW5rID0gTlVMTDsqLworfQorCisvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm4gaXQgKi8KK3ZvaWQqIEZBU1RfRlVOQyBsbGlzdF9wb3AobGxpc3RfdCAqKmhlYWQpCit7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisJbGxpc3RfdCAqdGVtcCA9ICpoZWFkOworCisJaWYgKHRlbXApIHsKKwkJZGF0YSA9IHRlbXAtPmRhdGE7CisJCSpoZWFkID0gdGVtcC0+bGluazsKKwkJZnJlZSh0ZW1wKTsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisKKy8qIFVubGluayBhcmJpdHJhcnkgZ2l2ZW4gZWxlbWVudCBmcm9tIHRoZSBsaXN0ICovCit2b2lkIEZBU1RfRlVOQyBsbGlzdF91bmxpbmsobGxpc3RfdCAqKmhlYWQsIGxsaXN0X3QgKmVsbSkKK3sKKwlpZiAoIWVsbSkKKwkJcmV0dXJuOworCXdoaWxlICgqaGVhZCkgeworCQlpZiAoKmhlYWQgPT0gZWxtKSB7CisJCQkqaGVhZCA9ICgqaGVhZCktPmxpbms7CisJCQlicmVhazsKKwkJfQorCQloZWFkID0gJigqaGVhZCktPmxpbms7CisJfQorfQorCisvKiBSZWN1cnNpdmVseSBmcmVlIGFsbCBlbGVtZW50cyBpbiB0aGUgbGlua2VkIGxpc3QuICBJZiBmcmVlaXQgIT0gTlVMTAorICogY2FsbCBpdCBvbiBlYWNoIGRhdHVtIGluIHRoZSBsaXN0ICovCit2b2lkIEZBU1RfRlVOQyBsbGlzdF9mcmVlKGxsaXN0X3QgKmVsbSwgdm9pZCAoKmZyZWVpdCkodm9pZCAqZGF0YSkpCit7CisJd2hpbGUgKGVsbSkgeworCQl2b2lkICpkYXRhID0gbGxpc3RfcG9wKCZlbG0pOworCisJCWlmIChmcmVlaXQpCisJCQlmcmVlaXQoZGF0YSk7CisJfQorfQorCisvKiBSZXZlcnNlIGxpc3Qgb3JkZXIuICovCitsbGlzdF90KiBGQVNUX0ZVTkMgbGxpc3RfcmV2KGxsaXN0X3QgKmxpc3QpCit7CisJbGxpc3RfdCAqcmV2ID0gTlVMTDsKKworCXdoaWxlIChsaXN0KSB7CisJCWxsaXN0X3QgKm5leHQgPSBsaXN0LT5saW5rOworCisJCWxpc3QtPmxpbmsgPSByZXY7CisJCXJldiA9IGxpc3Q7CisJCWxpc3QgPSBuZXh0OworCX0KKwlyZXR1cm4gcmV2OworfQorCitsbGlzdF90KiBGQVNUX0ZVTkMgbGxpc3RfZmluZF9zdHIobGxpc3RfdCAqbGlzdCwgY29uc3QgY2hhciAqc3RyKQoreworCXdoaWxlIChsaXN0KSB7CisJCWlmIChzdHJjbXAobGlzdC0+ZGF0YSwgc3RyKSA9PSAwKQorCQkJYnJlYWs7CisJCWxpc3QgPSBsaXN0LT5saW5rOworCX0KKwlyZXR1cm4gbGlzdDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL2xvZ2luLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9sb2dpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODJjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9sb2dpbi5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpc3N1ZS5jOiBpc3N1ZSBwcmludGluZyBjb2RlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJhc3RpYW4gQmxhbmsgPHdhbGRpQHR1eGJveC5vcmc+CisgKgorICogT3B0aW1pemUgYW5kIGNvcnJlY3RpbmcgT0NSTkwgYnkgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBBZnRlciBsaWJiYi5oLCBzaW5jZSBpdCBuZWVkcyBzeXMvdHlwZXMuaCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCisjZGVmaW5lIExPR0lOICIgbG9naW46ICIKKworc3RhdGljIGNvbnN0IGNoYXIgZm10c3RyX2RbXSBBTElHTjEgPSAiJUEsICVkICVCICVZIjsKK3N0YXRpYyBjb25zdCBjaGFyIGZtdHN0cl90W10gQUxJR04xID0gIiVIOiVNOiVTIjsKKwordm9pZCBGQVNUX0ZVTkMgcHJpbnRfbG9naW5faXNzdWUoY29uc3QgY2hhciAqaXNzdWVfZmlsZSwgY29uc3QgY2hhciAqdHR5KQoreworCUZJTEUgKmZwOworCWludCBjOworCWNoYXIgYnVmWzI1NisxXTsKKwljb25zdCBjaGFyICpvdXRidWY7CisJdGltZV90IHQ7CisJc3RydWN0IHV0c25hbWUgdXRzOworCisJdGltZSgmdCk7CisJdW5hbWUoJnV0cyk7CisKKwlwdXRzKCJcciIpOyAgLyogc3RhcnQgYSBuZXcgbGluZSAqLworCisJZnAgPSBmb3Blbl9mb3JfcmVhZChpc3N1ZV9maWxlKTsKKwlpZiAoIWZwKQorCQlyZXR1cm47CisJd2hpbGUgKChjID0gZmdldGMoZnApKSAhPSBFT0YpIHsKKwkJb3V0YnVmID0gYnVmOworCQlidWZbMF0gPSBjOworCQlidWZbMV0gPSAnXDAnOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlidWZbMV0gPSAnXHInOworCQkJYnVmWzJdID0gJ1wwJzsKKwkJfQorCQlpZiAoYyA9PSAnXFwnIHx8IGMgPT0gJyUnKSB7CisJCQljID0gZmdldGMoZnApOworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICdzJzoKKwkJCQlvdXRidWYgPSB1dHMuc3lzbmFtZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJY2FzZSAnaCc6CisJCQkJb3V0YnVmID0gdXRzLm5vZGVuYW1lOworCQkJCWJyZWFrOworCQkJY2FzZSAncic6CisJCQkJb3V0YnVmID0gdXRzLnJlbGVhc2U7CisJCQkJYnJlYWs7CisJCQljYXNlICd2JzoKKwkJCQlvdXRidWYgPSB1dHMudmVyc2lvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJCW91dGJ1ZiA9IHV0cy5tYWNoaW5lOworCQkJCWJyZWFrOworLyogVGhlIGZpZWxkIGRvbWFpbm5hbWUgb2Ygc3RydWN0IHV0c25hbWUgaXMgTGludXggc3BlY2lmaWMuICovCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisJCQljYXNlICdEJzoKKwkJCWNhc2UgJ28nOgorCQkJCW91dGJ1ZiA9IHV0cy5kb21haW5uYW1lOworCQkJCWJyZWFrOworI2VuZGlmCisJCQljYXNlICdkJzoKKwkJCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCBmbXRzdHJfZCwgbG9jYWx0aW1lKCZ0KSk7CisJCQkJYnJlYWs7CisJCQljYXNlICd0JzoKKwkJCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCBmbXRzdHJfdCwgbG9jYWx0aW1lKCZ0KSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdsJzoKKwkJCQlvdXRidWYgPSB0dHk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJ1ZlswXSA9IGM7CisJCQl9CisJCX0KKwkJZnB1dHMob3V0YnVmLCBzdGRvdXQpOworCX0KKwlmY2xvc2UoZnApOworCWZmbHVzaF9hbGwoKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgcHJpbnRfbG9naW5fcHJvbXB0KHZvaWQpCit7CisJY2hhciAqaG9zdG5hbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisKKwlmcHV0cyhob3N0bmFtZSwgc3Rkb3V0KTsKKwlmcHV0cyhMT0dJTiwgc3Rkb3V0KTsKKwlmZmx1c2hfYWxsKCk7CisJZnJlZShob3N0bmFtZSk7Cit9CisKKy8qIENsZWFyIGRhbmdlcm91cyBzdHVmZiwgc2V0IFBBVEggKi8KK3N0YXRpYyBjb25zdCBjaGFyIGZvcmJpZFtdIEFMSUdOMSA9CisJIkVOViIgIlwwIgorCSJCQVNIX0VOViIgIlwwIgorCSJIT01FIiAiXDAiCisJIklGUyIgIlwwIgorCSJTSEVMTCIgIlwwIgorCSJMRF9MSUJSQVJZX1BBVEgiICJcMCIKKwkiTERfUFJFTE9BRCIgIlwwIgorCSJMRF9UUkFDRV9MT0FERURfT0JKRUNUUyIgIlwwIgorCSJMRF9CSU5EX05PVyIgIlwwIgorCSJMRF9BT1VUX0xJQlJBUllfUEFUSCIgIlwwIgorCSJMRF9BT1VUX1BSRUxPQUQiICJcMCIKKwkiTERfTk9XQVJOIiAiXDAiCisJIkxEX0tFRVBESVIiICJcMCI7CisKK2ludCBGQVNUX0ZVTkMgc2FuaXRpemVfZW52X2lmX3N1aWQodm9pZCkKK3sKKwljb25zdCBjaGFyICpwOworCisJaWYgKGdldHVpZCgpID09IGdldGV1aWQoKSkKKwkJcmV0dXJuIDA7CisKKwlwID0gZm9yYmlkOworCWRvIHsKKwkJdW5zZXRlbnYocCk7CisJCXAgKz0gc3RybGVuKHApICsgMTsKKwl9IHdoaWxlICgqcCk7CisJcHV0ZW52KChjaGFyKiliYl9QQVRIX3Jvb3RfcGF0aCk7CisKKwlyZXR1cm4gMTsgLyogd2UgaW5kZWVkIHdlcmUgcnVuIGJ5IGRpZmZlcmVudCB1c2VyISAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvbG9vcC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbG9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTg5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9sb29wLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorCisvKiBGb3IgMi42LCB1c2UgdGhlIGNsZWFuZWQgdXAgaGVhZGVyIHRvIGdldCB0aGUgNjQgYml0IEFQSS4gKi8KKy8vIENvbW1lbnRlZCBvdXQgcGVyIFJvYidzIHJlcXVlc3QKKy8vIyBpbmNsdWRlICJmaXhfdTMyLmgiIC8qIHNvbWUgb2xkIHRvb2xjaGFpbnMgbmVlZCBfX3U2NCBmb3IgbGludXgvbG9vcC5oICovCisjIGluY2x1ZGUgPGxpbnV4L2xvb3AuaD4KK3R5cGVkZWYgc3RydWN0IGxvb3BfaW5mbzY0IGJiX2xvb3BfaW5mbzsKKyMgZGVmaW5lIEJCX0xPT1BfU0VUX1NUQVRVUyBMT09QX1NFVF9TVEFUVVM2NAorIyBkZWZpbmUgQkJfTE9PUF9HRVRfU1RBVFVTIExPT1BfR0VUX1NUQVRVUzY0CisKKyNlbHNlCisKKy8qIEZvciAyLjQgYW5kIGVhcmxpZXIsIHVzZSB0aGUgMzIgYml0IEFQSSAoYW5kIGRvbid0IHRydXN0IHRoZSBoZWFkZXJzKSAqLworLyogU3R1ZmYgc3RvbGVuIGZyb20gbGludXgvbG9vcC5oIGZvciAyLjQgYW5kIGVhcmxpZXIga2VybmVscyAqLworIyBpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorIyBkZWZpbmUgTE9fTkFNRV9TSVpFICAgICAgICA2NAorIyBkZWZpbmUgTE9fS0VZX1NJWkUgICAgICAgICAzMgorIyBkZWZpbmUgTE9PUF9TRVRfRkQgICAgICAgICAweDRDMDAKKyMgZGVmaW5lIExPT1BfQ0xSX0ZEICAgICAgICAgMHg0QzAxCisjIGRlZmluZSBCQl9MT09QX1NFVF9TVEFUVVMgIDB4NEMwMgorIyBkZWZpbmUgQkJfTE9PUF9HRVRfU1RBVFVTICAweDRDMDMKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgICAgICAgICAgICAgICAgbG9fbnVtYmVyOworCV9fa2VybmVsX2Rldl90ICAgICBsb19kZXZpY2U7CisJdW5zaWduZWQgbG9uZyAgICAgIGxvX2lub2RlOworCV9fa2VybmVsX2Rldl90ICAgICBsb19yZGV2aWNlOworCWludCAgICAgICAgICAgICAgICBsb19vZmZzZXQ7CisJaW50ICAgICAgICAgICAgICAgIGxvX2VuY3J5cHRfdHlwZTsKKwlpbnQgICAgICAgICAgICAgICAgbG9fZW5jcnlwdF9rZXlfc2l6ZTsKKwlpbnQgICAgICAgICAgICAgICAgbG9fZmxhZ3M7CisJY2hhciAgICAgICAgICAgICAgIGxvX2ZpbGVfbmFtZVtMT19OQU1FX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgICAgICBsb19lbmNyeXB0X2tleVtMT19LRVlfU0laRV07CisJdW5zaWduZWQgbG9uZyAgICAgIGxvX2luaXRbMl07CisJY2hhciAgICAgICAgICAgICAgIHJlc2VydmVkWzRdOworfSBiYl9sb29wX2luZm87CisjZW5kaWYKKworY2hhciogRkFTVF9GVU5DIHF1ZXJ5X2xvb3AoY29uc3QgY2hhciAqZGV2aWNlKQoreworCWludCBmZDsKKwliYl9sb29wX2luZm8gbG9vcGluZm87CisJY2hhciAqZGV2ID0gTlVMTDsKKworCWZkID0gb3BlbihkZXZpY2UsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPj0gMCkgeworCQlpZiAoaW9jdGwoZmQsIEJCX0xPT1BfR0VUX1NUQVRVUywgJmxvb3BpbmZvKSA9PSAwKSB7CisJCQlkZXYgPSB4YXNwcmludGYoIiUiT0ZGX0ZNVCJ1ICVzIiwgKG9mZl90KSBsb29waW5mby5sb19vZmZzZXQsCisJCQkJCShjaGFyICopbG9vcGluZm8ubG9fZmlsZV9uYW1lKTsKKwkJfQorCQljbG9zZShmZCk7CisJfQorCisJcmV0dXJuIGRldjsKK30KKworaW50IEZBU1RfRlVOQyBkZWxfbG9vcChjb25zdCBjaGFyICpkZXZpY2UpCit7CisJaW50IGZkLCByYzsKKworCWZkID0gb3BlbihkZXZpY2UsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gMTsKKwlyYyA9IGlvY3RsKGZkLCBMT09QX0NMUl9GRCwgMCk7CisJY2xvc2UoZmQpOworCisJcmV0dXJuIHJjOworfQorCisvKiBSZXR1cm5zIDAgaWYgbW91bnRlZCBSVywgMSBpZiBtb3VudGVkIHJlYWQtb25seSwgPDAgZm9yIGVycm9yLgorICAgKmRldmljZSBpcyBsb29wIGRldmljZSB0byB1c2UsIG9yIGlmICpkZXZpY2U9PU5VTEwgZmluZHMgYSBsb29wIGRldmljZSB0bworICAgbW91bnQgaXQgb24gYW5kIHNldHMgKmRldmljZSB0byBhIHN0cmR1cCBvZiB0aGF0IGxvb3AgZGV2aWNlIG5hbWUuICBUaGlzCisgICBzZWFyY2ggd2lsbCByZS11c2UgYW4gZXhpc3RpbmcgbG9vcCBkZXZpY2UgYWxyZWFkeSBib3VuZCB0byB0aGF0CisgICBmaWxlL29mZnNldCBpZiBpdCBmaW5kcyBvbmUuCisgKi8KK2ludCBGQVNUX0ZVTkMgc2V0X2xvb3AoY2hhciAqKmRldmljZSwgY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCkKK3sKKwljaGFyIGRldltMT09QX05BTUVTSVpFXTsKKwljaGFyICp0cnk7CisJYmJfbG9vcF9pbmZvIGxvb3BpbmZvOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJaW50IGksIGRmZCwgZmZkLCBtb2RlLCByYyA9IC0xOworCisJLyogT3BlbiB0aGUgZmlsZS4gIEJhcmYgaWYgdGhpcyBkb2Vzbid0IHdvcmsuICAqLworCW1vZGUgPSBPX1JEV1I7CisJZmZkID0gb3BlbihmaWxlLCBtb2RlKTsKKwlpZiAoZmZkIDwgMCkgeworCQltb2RlID0gT19SRE9OTFk7CisJCWZmZCA9IG9wZW4oZmlsZSwgbW9kZSk7CisJCWlmIChmZmQgPCAwKQorCQkJcmV0dXJuIC1lcnJubzsKKwl9CisKKwkvKiBGaW5kIGEgbG9vcCBkZXZpY2UuICAqLworCXRyeSA9ICpkZXZpY2UgPyAqZGV2aWNlIDogZGV2OworCS8qIDEwNDg1NzUgaXMgYSBtYXggcG9zc2libGUgbWlub3IgbnVtYmVyIGluIExpbnV4IGNpcmNhIDIwMTAgKi8KKwlmb3IgKGkgPSAwOyByYyAmJiBpIDwgMTA0ODU3NjsgaSsrKSB7CisJCXNwcmludGYoZGV2LCBMT09QX0ZPUk1BVCwgaSk7CisKKwkJSUZfRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURShlcnJubyA9IDA7KQorCQlpZiAoc3RhdCh0cnksICZzdGF0YnVmKSAhPSAwIHx8ICFTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURQorCQkJICYmIGVycm5vID09IEVOT0VOVAorCQkJICYmIHRyeSA9PSBkZXYKKwkJCSkgeworCQkJCS8qIE5vZGUgZG9lc24ndCBleGlzdCwgdHJ5IHRvIGNyZWF0ZSBpdC4gICovCisJCQkJaWYgKG1rbm9kKGRldiwgU19JRkJMS3wwNjQ0LCBtYWtlZGV2KDcsIGkpKSA9PSAwKQorCQkJCQlnb3RvIHRyeV90b19vcGVuOworCQkJfQorCQkJLyogUmFuIG91dCBvZiBibG9jayBkZXZpY2VzLCByZXR1cm4gZmFpbHVyZS4gICovCisJCQlyYyA9IC1FTk9FTlQ7CisJCQlicmVhazsKKwkJfQorIHRyeV90b19vcGVuOgorCQkvKiBPcGVuIHRoZSBzdWNrZXIgYW5kIGNoZWNrIGl0cyBsb29waW5lc3MuICAqLworCQlkZmQgPSBvcGVuKHRyeSwgbW9kZSk7CisJCWlmIChkZmQgPCAwICYmIGVycm5vID09IEVST0ZTKSB7CisJCQltb2RlID0gT19SRE9OTFk7CisJCQlkZmQgPSBvcGVuKHRyeSwgbW9kZSk7CisJCX0KKwkJaWYgKGRmZCA8IDApCisJCQlnb3RvIHRyeV9hZ2FpbjsKKworCQlyYyA9IGlvY3RsKGRmZCwgQkJfTE9PUF9HRVRfU1RBVFVTLCAmbG9vcGluZm8pOworCisJCS8qIElmIGRldmljZSBpcyBmcmVlLCBjbGFpbSBpdC4gICovCisJCWlmIChyYyAmJiBlcnJubyA9PSBFTlhJTykgeworCQkJbWVtc2V0KCZsb29waW5mbywgMCwgc2l6ZW9mKGxvb3BpbmZvKSk7CisJCQlzYWZlX3N0cm5jcHkoKGNoYXIgKilsb29waW5mby5sb19maWxlX25hbWUsIGZpbGUsIExPX05BTUVfU0laRSk7CisJCQlsb29waW5mby5sb19vZmZzZXQgPSBvZmZzZXQ7CisJCQkvKiBBc3NvY2lhdGUgZnJlZSBsb29wIGRldmljZSB3aXRoIGZpbGUuICAqLworCQkJaWYgKGlvY3RsKGRmZCwgTE9PUF9TRVRfRkQsIGZmZCkgPT0gMCkgeworCQkJCWlmIChpb2N0bChkZmQsIEJCX0xPT1BfU0VUX1NUQVRVUywgJmxvb3BpbmZvKSA9PSAwKQorCQkJCQlyYyA9IDA7CisJCQkJZWxzZQorCQkJCQlpb2N0bChkZmQsIExPT1BfQ0xSX0ZELCAwKTsKKwkJCX0KKworCQkvKiBJZiB0aGlzIGJsb2NrIGRldmljZSBhbHJlYWR5IHNldCB1cCByaWdodCwgcmUtdXNlIGl0LgorCQkgICAoWWVzIHRoaXMgaXMgcmFjeSwgYnV0IGFzc29jaWF0aW5nIHR3byBsb29wIGRldmljZXMgd2l0aCB0aGUgc2FtZQorCQkgICBmaWxlIGlzbid0IHByZXR0eSBlaXRoZXIuICBJbiBnZW5lcmFsLCBtb3VudGluZyB0aGUgc2FtZSBmaWxlIHR3aWNlCisJCSAgIHdpdGhvdXQgdXNpbmcgbG9zZXR1cCBtYW51YWxseSBpcyBwcm9ibGVtYXRpYy4pCisJCSAqLworCQl9IGVsc2UKKwkJaWYgKHN0cmNtcChmaWxlLCAoY2hhciAqKWxvb3BpbmZvLmxvX2ZpbGVfbmFtZSkgIT0gMAorCQkgfHwgb2Zmc2V0ICE9IGxvb3BpbmZvLmxvX29mZnNldAorCQkpIHsKKwkJCXJjID0gLTE7CisJCX0KKwkJY2xvc2UoZGZkKTsKKyB0cnlfYWdhaW46CisJCWlmICgqZGV2aWNlKSBicmVhazsKKwl9CisJY2xvc2UoZmZkKTsKKwlpZiAocmMgPT0gMCkgeworCQlpZiAoISpkZXZpY2UpCisJCQkqZGV2aWNlID0geHN0cmR1cChkZXYpOworCQlyZXR1cm4gKG1vZGUgPT0gT19SRE9OTFkpOyAvKiAxOnJvLCAwOnJ3ICovCisJfQorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL21ha2VfZGlyZWN0b3J5LmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9tYWtlX2RpcmVjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzAzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9tYWtlX2RpcmVjdG9yeS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwYXJzZV9tb2RlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBNYXIgNSwgMjAwMyAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogVGhpcyBpcyB0aGUgbWFpbiB3b3JrIGZ1bmN0aW9uIGZvciB0aGUgJ21rZGlyJyBhcHBsZXQuICBBcyBzdWNoLCBpdAorICogc3RyaXZlcyB0byBiZSBTVVN2MyBjb21wbGlhbnQgaW4gaXQncyBiZWhhdmlvdXIgd2hlbiByZWN1cnNpdmVseQorICogbWFraW5nIG1pc3NpbmcgcGFyZW50IGRpcnMsIGFuZCBpbiBpdCdzIG1vZGUgc2V0dGluZyBvZiB0aGUgZmluYWwKKyAqIGRpcmVjdG9yeSAncGF0aCcuCisgKgorICogVG8gcmVjdXJzaXZlbHkgYnVpbGQgYWxsIG1pc3NpbmcgaW50ZXJtZWRpYXRlIGRpcmVjdG9yaWVzLCBtYWtlCisgKiBzdXJlIHRoYXQgKGZsYWdzICYgRklMRVVUSUxTX1JFQ1VSKSBpcyBub24temVyby4gIE5ld2x5IGNyZWF0ZWQKKyAqIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyB3aWxsIGhhdmUgYXQgbGVhc3QgdSt3eCBwZXJtcy4KKyAqCisgKiBUbyBzZXQgc3BlY2lmaWMgcGVybWlzc2lvbnMgb24gJ3BhdGgnLCBwYXNzIHRoZSBhcHByb3ByaWF0ZSAnbW9kZScKKyAqIHZhbC4gIE90aGVyd2lzZSwgcGFzcyAtMSB0byBnZXQgZGVmYXVsdCBwZXJtaXNzaW9ucy4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZyb20gTk9GT1JLIGFwcGxldHMuIEl0IG11c3Qgbm90IGFsbG9jYXRlIGFueXRoaW5nICovCisKK2ludCBGQVNUX0ZVTkMgYmJfbWFrZV9kaXJlY3RvcnkoY2hhciAqcGF0aCwgbG9uZyBtb2RlLCBpbnQgZmxhZ3MpCit7CisJbW9kZV90IGN1cl9tYXNrOworCW1vZGVfdCBvcmdfbWFzazsKKwljb25zdCBjaGFyICpmYWlsX21zZzsKKwljaGFyICpzOworCWNoYXIgYzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCS8qIEhhcHBlbnMgb24gYmJfbWFrZV9kaXJlY3RvcnkoZGlybmFtZSgibm9fc2xhc2hlcyIpLC4uLikgKi8KKwlpZiAoTE9ORV9DSEFSKHBhdGgsICcuJykpCisJCXJldHVybiAwOworCisJb3JnX21hc2sgPSBjdXJfbWFzayA9IChtb2RlX3QpLTFMOworCXMgPSBwYXRoOworCXdoaWxlICgxKSB7CisJCWMgPSAnXDAnOworCisJCWlmIChmbGFncyAmIEZJTEVVVElMU19SRUNVUikgeyAgLyogR2V0IHRoZSBwYXJlbnQgKi8KKwkJCS8qIEJ5cGFzcyBsZWFkaW5nIG5vbi0nLydzIGFuZCB0aGVuIHN1YnNlcXVlbnQgJy8ncyAqLworCQkJd2hpbGUgKCpzKSB7CisJCQkJaWYgKCpzID09ICcvJykgeworCQkJCQlkbyB7CisJCQkJCQkrK3M7CisJCQkJCX0gd2hpbGUgKCpzID09ICcvJyk7CisJCQkJCWMgPSAqczsgLyogU2F2ZSB0aGUgY3VycmVudCBjaGFyICovCisJCQkJCSpzID0gJ1wwJzsgLyogYW5kIHJlcGxhY2UgaXQgd2l0aCBudWwgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCSsrczsKKwkJCX0KKwkJfQorCisJCWlmIChjICE9ICdcMCcpIHsKKwkJCS8qIEludGVybWVkaWF0ZSBkaXJzOiBtdXN0IGhhdmUgd3ggZm9yIHVzZXIgKi8KKwkJCWlmIChjdXJfbWFzayA9PSAobW9kZV90KS0xTCkgeyAvKiB3YXNuJ3QgZG9uZSB5ZXQ/ICovCisJCQkJbW9kZV90IG5ld19tYXNrOworCQkJCW9yZ19tYXNrID0gdW1hc2soMCk7CisJCQkJY3VyX21hc2sgPSAwOworCQkJCS8qIENsZWFyIHU9d3ggaW4gdW1hc2sgLSB0aGlzIGVuc3VyZXMKKwkJCQkgKiB0aGV5IHdvbid0IGJlIGNsZWFyZWQgb24gbWtkaXIgKi8KKwkJCQluZXdfbWFzayA9IChvcmdfbWFzayAmIH4obW9kZV90KTAzMDApOworCQkJCS8vYmJfZXJyb3JfbXNnKCJvcmdfbWFzazolbyBjdXJfbWFzazolbyIsIG9yZ19tYXNrLCBuZXdfbWFzayk7CisJCQkJaWYgKG5ld19tYXNrICE9IGN1cl9tYXNrKSB7CisJCQkJCWN1cl9tYXNrID0gbmV3X21hc2s7CisJCQkJCXVtYXNrKG5ld19tYXNrKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBMYXN0IGNvbXBvbmVudDogdXNlcyBvcmlnaW5hbCB1bWFzayAqLworCQkJLy9iYl9lcnJvcl9tc2coIjEgb3JnX21hc2s6JW8iLCBvcmdfbWFzayk7CisJCQlpZiAob3JnX21hc2sgIT0gY3VyX21hc2spIHsKKwkJCQljdXJfbWFzayA9IG9yZ19tYXNrOworCQkJCXVtYXNrKG9yZ19tYXNrKTsKKwkJCX0KKwkJfQorCisJCWlmIChta2RpcihwYXRoLCAwNzc3KSA8IDApIHsKKwkJCS8qIElmIHdlIGZhaWxlZCBmb3IgYW55IG90aGVyIHJlYXNvbiB0aGFuIHRoZSBkaXJlY3RvcnkKKwkJCSAqIGFscmVhZHkgZXhpc3RzLCBvdXRwdXQgYSBkaWFnbm9zdGljIGFuZCByZXR1cm4gLTEgKi8KKwkJCWlmICgoZXJybm8gIT0gRUVYSVNUICYmIGVycm5vICE9IEVJU0RJUikKKwkJCSB8fCAhKGZsYWdzICYgRklMRVVUSUxTX1JFQ1VSKQorCQkJIHx8ICgoc3RhdChwYXRoLCAmc3QpIDwgMCkgfHwgIVNfSVNESVIoc3Quc3RfbW9kZSkpCisJCQkpIHsKKwkJCQlmYWlsX21zZyA9ICJjcmVhdGUiOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogU2luY2UgdGhlIGRpcmVjdG9yeSBleGlzdHMsIGRvbid0IGF0dGVtcHQgdG8gY2hhbmdlCisJCQkgKiBwZXJtaXNzaW9ucyBpZiBpdCB3YXMgdGhlIGZ1bGwgdGFyZ2V0LiAgTm90ZSB0aGF0CisJCQkgKiB0aGlzIGlzIG5vdCBhbiBlcnJvciBjb25kaXRpb24uICovCisJCQlpZiAoIWMpIHsKKwkJCQlnb3RvIHJldDA7CisJCQl9CisJCX0KKworCQlpZiAoIWMpIHsKKwkJCS8qIERvbmUuICBJZiBuZWNlc3NhcnksIHVwZGF0ZSBwZXJtcyBvbiB0aGUgbmV3bHkKKwkJCSAqIGNyZWF0ZWQgZGlyZWN0b3J5LiAgRmFpbHVyZSB0byB1cGRhdGUgaGVyZSBfaXNfCisJCQkgKiBhbiBlcnJvci4gKi8KKwkJCWlmICgobW9kZSAhPSAtMSkgJiYgKGNobW9kKHBhdGgsIG1vZGUpIDwgMCkpIHsKKwkJCQlmYWlsX21zZyA9ICJzZXQgcGVybWlzc2lvbnMgb2YiOworCQkJCWJyZWFrOworCQkJfQorCQkJZ290byByZXQwOworCQl9CisKKwkJLyogUmVtb3ZlIGFueSBpbnNlcnRlZCBudWwgZnJvbSB0aGUgcGF0aCAocmVjdXJzaXZlIG1vZGUpICovCisJCSpzID0gYzsKKwl9IC8qIHdoaWxlICgxKSAqLworCisJYmJfcGVycm9yX21zZygiY2FuJ3QgJXMgZGlyZWN0b3J5ICclcyciLCBmYWlsX21zZywgcGF0aCk7CisJZmxhZ3MgPSAtMTsKKwlnb3RvIHJldDsKKyByZXQwOgorCWZsYWdzID0gMDsKKyByZXQ6CisJLy9iYl9lcnJvcl9tc2coIjIgb3JnX21hc2s6JW8iLCBvcmdfbWFzayk7CisJaWYgKG9yZ19tYXNrICE9IGN1cl9tYXNrKQorCQl1bWFzayhvcmdfbWFzayk7CisJcmV0dXJuIGZsYWdzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvbWFrZWRldi5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbWFrZWRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzQwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9tYWtlZGV2LmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBXZSBkbyBub3QgaW5jbHVkZSBsaWJiYi5oIC0gI2RlZmluZSBtYWtlZGV2KCkgaXMgdGhlcmUhICovCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyogRGlmZmVyZW50IFVuaXhlcyB3YW50IGRpZmZlcmVudCBoZWFkZXJzIGZvciBtYWtlZGV2ICovCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSBcCisgfHwgZGVmaW5lZChfX0FQUExFX18pCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0dMSUJDX18KKy8qIEF0IGxlYXN0IGdsaWJjIGhhcyBob3JyZW5kb3VzbHkgbGFyZ2UgaW5saW5lIGZvciB0aGlzLCBzbyB3cmFwIGl0LiAqLworLyogdWNsaWJjIHBlb3BsZSBwbGVhc2UgY2hlY2sgLSBkbyB3ZSBuZWVkICImJiAhX19VQ0xJQkNfXyIgYWJvdmU/ICovCisKKy8qIFN1cHByZXNzIGdjYyAibm8gcHJldmlvdXMgcHJvdG90eXBlIiB3YXJuaW5nICovCit1bnNpZ25lZCBsb25nIGxvbmcgRkFTVF9GVU5DIGJiX21ha2VkZXYodW5zaWduZWQgbWFqb3IsIHVuc2lnbmVkIG1pbm9yKTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgYmJfbWFrZWRldih1bnNpZ25lZCBtYWpvciwgdW5zaWduZWQgbWlub3IpCit7CisJcmV0dXJuIG1ha2VkZXYobWFqb3IsIG1pbm9yKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvbWF0Y2hfZnN0eXBlLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9tYXRjaF9mc3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmMzZDdmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbWF0Y2hfZnN0eXBlLmMKQEAgLTAsMCArMSw0NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWF0Y2ggZnN0eXBlcyBmb3IgdXNlIGluIG1vdW50IHVubW91bnQKKyAqIFdlIGFjY2VwdCBub3RtcGZzLG5mcyBidXQgbm90IG5vdG1wZnMsbm9uZnMKKyAqIFRoaXMgYWxsb3dzIHVzIHRvIG1hdGNoIGZzdHlwZXMgdGhhdCBzdGFydCB3aXRoIG5vIGxpa2Ugc28KKyAqICAgbW91bnQgLWF0ICxub2RkeQorICoKKyAqIFJldHVybnMgMSBmb3IgYSBtYXRjaCwgb3RoZXJ3aXNlIDAKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWZkZWYgSEFWRV9NTlRFTlRfSAorCitpbnQgRkFTVF9GVU5DIG1hdGNoX2ZzdHlwZShjb25zdCBzdHJ1Y3QgbW50ZW50ICptdCwgY29uc3QgY2hhciAqdF9mc3R5cGUpCit7CisJaW50IG1hdGNoID0gMTsKKwlpbnQgbGVuOworCisJaWYgKCF0X2ZzdHlwZSkKKwkJcmV0dXJuIG1hdGNoOworCisJaWYgKHRfZnN0eXBlWzBdID09ICduJyAmJiB0X2ZzdHlwZVsxXSA9PSAnbycpIHsKKwkJbWF0Y2gtLTsKKwkJdF9mc3R5cGUgKz0gMjsKKwl9CisKKwlsZW4gPSBzdHJsZW4obXQtPm1udF90eXBlKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoc3RybmNtcChtdC0+bW50X3R5cGUsIHRfZnN0eXBlLCBsZW4pID09IDAKKwkJICYmICh0X2ZzdHlwZVtsZW5dID09ICdcMCcgfHwgdF9mc3R5cGVbbGVuXSA9PSAnLCcpCisJCSkgeworCQkJcmV0dXJuIG1hdGNoOworCQl9CisJCXRfZnN0eXBlID0gc3RyY2hyKHRfZnN0eXBlLCAnLCcpOworCQlpZiAoIXRfZnN0eXBlKQorCQkJYnJlYWs7CisJCXRfZnN0eXBlKys7CisJfQorCisJcmV0dXJuICFtYXRjaDsKK30KKworI2VuZGlmIC8qIEhBVkVfTU5URU5UX0ggKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL21lc3NhZ2VzLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9tZXNzYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDgyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9tZXNzYWdlcy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBhbGxvdyBkZWZhdWx0IHN5c3RlbSBQQVRIIHRvIGJlIGV4dGVuZGVkIHZpYSBDRkxBR1MgKi8KKyNpZm5kZWYgQkJfQURESVRJT05BTF9QQVRICisjZGVmaW5lIEJCX0FERElUSU9OQUxfUEFUSCAiIgorI2VuZGlmCisKKy8qIGFsbG93IHZlcnNpb24gdG8gYmUgZXh0ZW5kZWQsIHZpYSBDRkxBR1MgKi8KKyNpZm5kZWYgQkJfRVhUUkFfVkVSU0lPTgorI2RlZmluZSBCQl9FWFRSQV9WRVJTSU9OIEJCX0JUCisjZW5kaWYKKworI2RlZmluZSBCQU5ORVIgIkJ1c3lCb3ggdiIgQkJfVkVSICIgKCIgQkJfRVhUUkFfVkVSU0lPTiAiKSIKKworY29uc3QgY2hhciBiYl9iYW5uZXJbXSBBTElHTjEgPSBCQU5ORVI7CisKKworY29uc3QgY2hhciBiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZFtdIEFMSUdOMSA9ICJvdXQgb2YgbWVtb3J5IjsKK2NvbnN0IGNoYXIgYmJfbXNnX2ludmFsaWRfZGF0ZVtdIEFMSUdOMSA9ICJpbnZhbGlkIGRhdGUgJyVzJyI7Citjb25zdCBjaGFyIGJiX21zZ191bmtub3duW10gQUxJR04xID0gIih1bmtub3duKSI7Citjb25zdCBjaGFyIGJiX21zZ19jYW5fbm90X2NyZWF0ZV9yYXdfc29ja2V0W10gQUxJR04xID0gImNhbid0IGNyZWF0ZSByYXcgc29ja2V0IjsKK2NvbnN0IGNoYXIgYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdFtdIEFMSUdOMSA9ICJwZXJtaXNzaW9uIGRlbmllZCAoYXJlIHlvdSByb290PykiOworY29uc3QgY2hhciBiYl9tc2dfeW91X211c3RfYmVfcm9vdFtdIEFMSUdOMSA9ICJ5b3UgbXVzdCBiZSByb290IjsKK2NvbnN0IGNoYXIgYmJfbXNnX3JlcXVpcmVzX2FyZ1tdIEFMSUdOMSA9ICIlcyByZXF1aXJlcyBhbiBhcmd1bWVudCI7Citjb25zdCBjaGFyIGJiX21zZ19pbnZhbGlkX2FyZ1tdIEFMSUdOMSA9ICJpbnZhbGlkIGFyZ3VtZW50ICclcycgdG8gJyVzJyI7Citjb25zdCBjaGFyIGJiX21zZ19zdGFuZGFyZF9pbnB1dFtdIEFMSUdOMSA9ICJzdGFuZGFyZCBpbnB1dCI7Citjb25zdCBjaGFyIGJiX21zZ19zdGFuZGFyZF9vdXRwdXRbXSBBTElHTjEgPSAic3RhbmRhcmQgb3V0cHV0IjsKKworY29uc3QgY2hhciBiYl9oZXhkaWdpdHNfdXBjYXNlW10gQUxJR04xID0gIjAxMjM0NTY3ODlBQkNERUYiOworCitjb25zdCBjaGFyIGJiX2J1c3lib3hfZXhlY19wYXRoW10gQUxJR04xID0gQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIOworY29uc3QgY2hhciBiYl9kZWZhdWx0X2xvZ2luX3NoZWxsW10gQUxJR04xID0gTElCQkJfREVGQVVMVF9MT0dJTl9TSEVMTDsKKy8qIHV0aWwtbGludXggbWFucGFnZSBzYXlzIC9zYmluOi9iaW46L3Vzci9zYmluOi91c3IvYmluLAorICogYnV0IEkgd2FudCB0byBzYXZlIGEgZmV3IGJ5dGVzIGhlcmUuIENoZWNrIGxpYmJiLmggYmVmb3JlIGNoYW5naW5nISAqLworY29uc3QgY2hhciBiYl9QQVRIX3Jvb3RfcGF0aFtdIEFMSUdOMSA9CisJIlBBVEg9L3NiaW46L3Vzci9zYmluOi9iaW46L3Vzci9iaW4iIEJCX0FERElUSU9OQUxfUEFUSDsKKworCitjb25zdCBpbnQgY29uc3RfaW50XzEgPSAxOworLyogZXhwbGljaXRseSA9IDAsIG90aGVyd2lzZSBnY2MgbWF5IG1ha2UgaXQgYSBjb21tb24gdmFyaWFibGUKKyAqIGFuZCBpdCB3aWxsIGVuZCB1cCBpbiBic3MgKi8KK2NvbnN0IGludCBjb25zdF9pbnRfMCA9IDA7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XVE1QCisvKiBUaGlzIGlzIHVzdWFsbHkgc29tZXRoaW5nIGxpa2UgIi92YXIvYWRtL3d0bXAiIG9yICIvdmFyL2xvZy93dG1wIiAqLworY29uc3QgY2hhciBiYl9wYXRoX3d0bXBfZmlsZVtdIEFMSUdOMSA9CisjIGlmIGRlZmluZWQgX1BBVEhfV1RNUAorCV9QQVRIX1dUTVA7CisjIGVsaWYgZGVmaW5lZCBXVE1QX0ZJTEUKKwlXVE1QX0ZJTEU7CisjIGVsc2UKKyMgIGVycm9yIHVua25vd24gcGF0aCB0byB3dG1wIGZpbGUKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBXZSB1c2UgaXQgZm9yICJnbG9iYWwiIGRhdGEgdmlhICooc3RydWN0IGdsb2JhbCopJmJiX2NvbW1vbl9idWZzaXoxLgorICogU2luY2UgZ2NjIGluc2lzdHMgb24gYWxpZ25pbmcgc3RydWN0IGdsb2JhbCdzIG1lbWJlcnMsIGl0IHdvdWxkIGJlIGEgcGl0eQorICogKGFuZCBhbiBhbGlnbm1lbnQgZmF1bHQgb24gc29tZSBDUFVzKSB0byBtZXNzIGl0IHVwLiAqLworY2hhciBiYl9jb21tb25fYnVmc2l6MVtDT01NT05fQlVGU0laRV0gQUxJR05FRChzaXplb2YobG9uZyBsb25nKSk7CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9tb2RlX3N0cmluZy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbW9kZV9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWFmZTdkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbW9kZV9zdHJpbmcuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbW9kZV9zdHJpbmcgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEF1ZyAxMywgMjAwMworICogRml4IGEgYnVnIHJlcG9ydGVkIGJ5IGp1bmtpb0Bjb3gubmV0IGludm9sdmluZyB0aGUgbW9kZV9jaGFycyBpbmRleC4KKyAqLworCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmICggU19JU1VJRCAhPSAwNDAwMCApIHx8ICggU19JU0dJRCAhPSAwMjAwMCApIHx8ICggU19JU1ZUWCAhPSAwMTAwMCApIFwKKyB8fCAoIFNfSVJVU1IgIT0gMDA0MDAgKSB8fCAoIFNfSVdVU1IgIT0gMDAyMDAgKSB8fCAoIFNfSVhVU1IgIT0gMDAxMDAgKSBcCisgfHwgKCBTX0lSR1JQICE9IDAwMDQwICkgfHwgKCBTX0lXR1JQICE9IDAwMDIwICkgfHwgKCBTX0lYR1JQICE9IDAwMDEwICkgXAorIHx8ICggU19JUk9USCAhPSAwMDAwNCApIHx8ICggU19JV09USCAhPSAwMDAwMiApIHx8ICggU19JWE9USCAhPSAwMDAwMSApCisjZXJyb3IgcGVybWlzc2lvbiBiaXRmbGFnIHZhbHVlIGFzc3VtcHRpb24ocykgdmlvbGF0ZWQhCisjZW5kaWYKKworI2lmICggU19JRlNPQ0shPSAwMTQwMDAwICkgfHwgKCBTX0lGTE5LICE9IDAxMjAwMDAgKSBcCisgfHwgKCBTX0lGUkVHICE9IDAxMDAwMDAgKSB8fCAoIFNfSUZCTEsgIT0gMDA2MDAwMCApIFwKKyB8fCAoIFNfSUZESVIgIT0gMDA0MDAwMCApIHx8ICggU19JRkNIUiAhPSAwMDIwMDAwICkgXAorIHx8ICggU19JRklGTyAhPSAwMDEwMDAwICkKKyN3YXJuaW5nIG1vZGUgdHlwZSBiaXRmbGFnIHZhbHVlIGFzc3VtcHRpb24ocykgdmlvbGF0ZWQhIGZhbGxpbmcgYmFjayB0byBsYXJnZXIgdmVyc2lvbgorCisjaWYgKFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTyB8IFNfSVNVSUQgfCBTX0lTR0lEIHwgU19JU1ZUWCkgPT0gMDc3NzcKKyN1bmRlZiBtb2RlX3QKKyNkZWZpbmUgbW9kZV90IHVuc2lnbmVkIHNob3J0CisjZW5kaWYKKworc3RhdGljIGNvbnN0IG1vZGVfdCBtb2RlX2ZsYWdzW10gPSB7CisJU19JUlVTUiwgU19JV1VTUiwgU19JWFVTUiwgU19JU1VJRCwKKwlTX0lSR1JQLCBTX0lXR1JQLCBTX0lYR1JQLCBTX0lTR0lELAorCVNfSVJPVEgsIFNfSVdPVEgsIFNfSVhPVEgsIFNfSVNWVFgKK307CisKKy8qIFRoZSBzdGF0aWMgY29uc3QgY2hhciBhcnJheXMgYmVsb3cgYXJlIGR1cGxpY2F0ZWQgZm9yIHRoZSB0d28gY2FzZXMKKyAqIGJlY2F1c2UgbW92aW5nIHRoZW0gYWhlYWQgb2YgdGhlIG1vZGVfZmxhZ3MgZGVjbGFyYXRpb24gY2F1c2UgYSB0ZXh0CisgKiBzaXplIGluY3JlYXNlIHdpdGggdGhlIGdjYyB2ZXJzaW9uIEknbSB1c2luZy4gKi8KKworLyogVGhlIHByZXZpb3VzIHZlcnNpb24gdXNlZCAiMHBjQ2Q/YkItP2w/cz8/PyIuICBIb3dldmVyLCB0aGUgJzAnLCAnQycsCisgKiBhbmQgJ0InIHR5cGVzIGRvbid0IGFwcGVhciB0byBiZSBhdmFpbGFibGUgb24gbGludXguICBTbyBJIHJlbW92ZWQgdGhlbS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHR5cGVfY2hhcnNbMTZdIEFMSUdOMSA9ICI/cGM/ZD9iPy0/bD9zPz8/IjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAwMTIzNDU2Nzg5YWJjZGVmICovCitzdGF0aWMgY29uc3QgY2hhciBtb2RlX2NoYXJzWzddIEFMSUdOMSA9ICJyd3hTVHN0IjsKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGJiX21vZGVfc3RyaW5nKG1vZGVfdCBtb2RlKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMl07CisJY2hhciAqcCA9IGJ1ZjsKKworCWludCBpLCBqLCBrOworCisJKnAgPSB0eXBlX2NoYXJzWyAobW9kZSA+PiAxMikgJiAweGYgXTsKKwlpID0gMDsKKwlkbyB7CisJCWogPSBrID0gMDsKKwkJZG8geworCQkJKisrcCA9ICctJzsKKwkJCWlmIChtb2RlICYgbW9kZV9mbGFnc1tpK2pdKSB7CisJCQkJKnAgPSBtb2RlX2NoYXJzW2pdOworCQkJCWsgPSBqOworCQkJfQorCQl9IHdoaWxlICgrK2ogPCAzKTsKKwkJaWYgKG1vZGUgJiBtb2RlX2ZsYWdzW2kral0pIHsKKwkJCSpwID0gbW9kZV9jaGFyc1szICsgKGsgJiAyKSArICgoaSY4KSA+PiAzKV07CisJCX0KKwkJaSArPSA0OworCX0gd2hpbGUgKGkgPCAxMik7CisKKwkvKiBOb3RlOiBXZSBkb24ndCBib3RoZXIgd2l0aCBudWwgdGVybWluYXRpb24gYmVjYXVzZSBic3MgaW5pdGlhbGl6YXRpb24KKwkgKiBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRoYXQgZm9yIHVzLiAgSWYgdGhlIHVzZXIgc2NyaWJibGVkIGluIGJ1ZgorCSAqIG1lbW9yeSwgdGhleSBkZXNlcnZlIHdoYXRldmVyIGhhcHBlbnMuICBCdXQgd2UnbGwgYXQgbGVhc3QgYXNzZXJ0LiAqLworCWFzc2VydChidWZbMTBdID09IDApOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2Vsc2UKKworLyogVGhlIHByZXZpb3VzIHZlcnNpb24gdXNlZCAiMHBjQ2Q/YkItP2w/cz8/PyIuICBIb3dldmVyLCB0aGUgJzAnLCAnQycsCisgKiBhbmQgJ0InIHR5cGVzIGRvbid0IGFwcGVhciB0byBiZSBhdmFpbGFibGUgb24gbGludXguICBTbyBJIHJlbW92ZWQgdGhlbS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHR5cGVfY2hhcnNbMTZdID0gIj9wYz9kP2I/LT9sP3M/Pz8iOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogMDEyMzQ1Njc4OWFiY2RlZiAqLworc3RhdGljIGNvbnN0IGNoYXIgbW9kZV9jaGFyc1s3XSA9ICJyd3hTVHN0IjsKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGJiX21vZGVfc3RyaW5nKG1vZGVfdCBtb2RlKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMl07CisJY2hhciAqcCA9IGJ1ZjsKKworCWludCBpLCBqLCBrLCBtOworCisJKnAgPSB0eXBlX2NoYXJzWyAobW9kZSA+PiAxMikgJiAweGYgXTsKKwlpID0gMDsKKwltID0gMDQwMDsKKwlkbyB7CisJCWogPSBrID0gMDsKKwkJZG8geworCQkJKisrcCA9ICctJzsKKwkJCWlmIChtb2RlICYgbSkgeworCQkJCSpwID0gbW9kZV9jaGFyc1tqXTsKKwkJCQlrID0gajsKKwkJCX0KKwkJCW0gPj49IDE7CisJCX0gd2hpbGUgKCsraiA8IDMpOworCQkrK2k7CisJCWlmIChtb2RlICYgKDAxMDAwMCA+PiBpKSkgeworCQkJKnAgPSBtb2RlX2NoYXJzWzMgKyAoayAmIDIpICsgKGkgPT0gMyldOworCQl9CisJfSB3aGlsZSAoaSA8IDMpOworCisJLyogTm90ZTogV2UgZG9uJ3QgYm90aGVyIHdpdGggbnVsIHRlcm1pbmF0aW9uIGJlY2F1c2UgYnNzIGluaXRpYWxpemF0aW9uCisJICogc2hvdWxkIGhhdmUgdGFrZW4gY2FyZSBvZiB0aGF0IGZvciB1cy4gIElmIHRoZSB1c2VyIHNjcmliYmxlZCBpbiBidWYKKwkgKiBtZW1vcnksIHRoZXkgZGVzZXJ2ZSB3aGF0ZXZlciBoYXBwZW5zLiAgQnV0IHdlJ2xsIGF0IGxlYXN0IGFzc2VydC4gKi8KKwlhc3NlcnQoYnVmWzEwXSA9PSAwKTsKKworCXJldHVybiBidWY7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvbXRhYi5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvbXRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYmZmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9tdGFiLmMKQEAgLTAsMCArMSw1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX01UQUJfU1VQUE9SVAordm9pZCBGQVNUX0ZVTkMgZXJhc2VfbXRhYihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtbnRlbnQgKmVudHJpZXM7CisJaW50IGksIGNvdW50OworCUZJTEUgKm1vdW50VGFibGU7CisJc3RydWN0IG1udGVudCAqbTsKKworCW1vdW50VGFibGUgPSBzZXRtbnRlbnQoYmJfcGF0aF9tdGFiX2ZpbGUsICJyIik7CisJLyogQnVtbWVyLiBGYWxsIGJhY2sgb24gdHJ5aW5nIHRoZSAvcHJvYyBmaWxlc3lzdGVtICovCisJaWYgKCFtb3VudFRhYmxlKSBtb3VudFRhYmxlID0gc2V0bW50ZW50KCIvcHJvYy9tb3VudHMiLCAiciIpOworCWlmICghbW91bnRUYWJsZSkgeworCQliYl9wZXJyb3JfbXNnKGJiX3BhdGhfbXRhYl9maWxlKTsKKwkJcmV0dXJuOworCX0KKworCWVudHJpZXMgPSBOVUxMOworCWNvdW50ID0gMDsKKwl3aGlsZSAoKG0gPSBnZXRtbnRlbnQobW91bnRUYWJsZSkpICE9IDApIHsKKwkJZW50cmllcyA9IHhyZWFsbG9jX3ZlY3RvcihlbnRyaWVzLCAzLCBjb3VudCk7CisJCWVudHJpZXNbY291bnRdLm1udF9mc25hbWUgPSB4c3RyZHVwKG0tPm1udF9mc25hbWUpOworCQllbnRyaWVzW2NvdW50XS5tbnRfZGlyID0geHN0cmR1cChtLT5tbnRfZGlyKTsKKwkJZW50cmllc1tjb3VudF0ubW50X3R5cGUgPSB4c3RyZHVwKG0tPm1udF90eXBlKTsKKwkJZW50cmllc1tjb3VudF0ubW50X29wdHMgPSB4c3RyZHVwKG0tPm1udF9vcHRzKTsKKwkJZW50cmllc1tjb3VudF0ubW50X2ZyZXEgPSBtLT5tbnRfZnJlcTsKKwkJZW50cmllc1tjb3VudF0ubW50X3Bhc3NubyA9IG0tPm1udF9wYXNzbm87CisJCWNvdW50Kys7CisJfQorCWVuZG1udGVudChtb3VudFRhYmxlKTsKKworLy9UT0RPOiBtYWtlIHVwZGF0ZSBhdG9taWMKKwltb3VudFRhYmxlID0gc2V0bW50ZW50KGJiX3BhdGhfbXRhYl9maWxlLCAidyIpOworCWlmIChtb3VudFRhYmxlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoc3RyY21wKGVudHJpZXNbaV0ubW50X2ZzbmFtZSwgbmFtZSkgIT0gMAorCQkJICYmIHN0cmNtcChlbnRyaWVzW2ldLm1udF9kaXIsIG5hbWUpICE9IDApCisJCQkJYWRkbW50ZW50KG1vdW50VGFibGUsICZlbnRyaWVzW2ldKTsKKwkJfQorCQllbmRtbnRlbnQobW91bnRUYWJsZSk7CisJfSBlbHNlIGlmIChlcnJubyAhPSBFUk9GUykKKwkJYmJfcGVycm9yX21zZyhiYl9wYXRoX210YWJfZmlsZSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL29ic2N1cmUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL29ic2N1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWNjMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvb2JzY3VyZS5jCkBAIC0wLDAgKzEsMTg0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHdlYWsgcGFzc3dvcmQgY2hlY2tlciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKglBIGdvb2QgcGFzc3dvcmQ6CisJMSkJc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3Qgc2l4IGNoYXJhY3RlcnMgKG1hbiBwYXNzd2QpOworCTIpCWVtcHR5IHBhc3N3b3JkcyBhcmUgbm90IHBlcm1pdHRlZDsKKwkzKQlzaG91bGQgY29udGFpbiBhIG1peCBvZiBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBjaGFyYWN0ZXJzCisJCXVwcGVyIGNhc2UgbGV0dGVycywKKwkJbG93ZXIgY2FzZSBsZXR0ZXJzLAorCQludW1iZXJzLAorCQlzcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyAhQCMkJV4mKiw7Ii4KKwlUaGlzIHBhc3N3b3JkIHR5cGVzIHNob3VsZCBub3QgIGJlIHBlcm1pdHRlZDoKKwlhKQlwdXJlIG51bWJlcnM6IGJpcnRoZGF0ZXMsIHNvY2lhbCBzZWN1cml0eSBudW1iZXIsIGxpY2Vuc2UgcGxhdGUsIHBob25lIG51bWJlcnM7CisJYikJd29yZHMgYW5kIGFsbCBsZXR0ZXJzIG9ubHkgcGFzc3dvcmRzICh1cHBlcmNhc2UsIGxvd2VyY2FzZSBvciBtaXhlZCkKKwkJYXMgcGFsaW5kcm9tZXMsIGNvbnNlY3V0aXZlIG9yIHJlcGV0aXRpdmUgbGV0dGVycworCQlvciBhZGphY2VudCBsZXR0ZXJzIG9uIHlvdXIga2V5Ym9hcmQ7CisJYykJdXNlcm5hbWUsIHJlYWwgbmFtZSwgY29tcGFueSBuYW1lIG9yIChlLW1haWw/KSBhZGRyZXNzCisJCWluIGFueSBmb3JtIChhcy1pcywgcmV2ZXJzZWQsIGNhcGl0YWxpemVkLCBkb3VibGVkLCBldGMuKS4KKwkJKHdlIGNhbiBjaGVjayBvbmx5IGFnYWluc3QgdXNlcm5hbWUsIGdlY29zIGFuZCBob3N0bmFtZSkKKwlkKQljb21tb24gYW5kIG9idmlvdXMgbGV0dGVyLW51bWJlciByZXBsYWNlbWVudHMKKwkJKGUuZy4gcmVwbGFjZSB0aGUgbGV0dGVyIE8gd2l0aCBudW1iZXIgMCkKKwkJc3VjaCBhcyAiTTFjcjAkMGZ0IiBvciAiUEBzc3cwcmQiIChDQVZFQVQ6IHdlIGNhbm5vdCBjaGVjayBmb3IgdGhlbQorCQl3aXRob3V0IHRoZSB1c2Ugb2YgYSBkaWN0aW9uYXJ5KS4KKworCUZvciBlYWNoIG1pc3NpbmcgdHlwZSBvZiBjaGFyYWN0ZXJzIGFuIGluY3JlYXNlIG9mIHBhc3N3b3JkIGxlbmd0aCBpcworCXJlcXVlc3RlZC4KKworCUlmIHVzZXIgaXMgcm9vdCB3ZSB3YXJuIG9ubHkuCisKKwlDQVZFQVQ6IHNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgY3J5cHQoKSB0cnVuY2F0ZXMgcGFzc3dvcmRzIHRvIDggY2hhcnMsCisJc28gdGhhdCBhYWFhYWFhYTFRJCBpcyBlcXVhbCB0byBhYWFhYWFhYSBtYWtpbmcgaXQgcG9zc2libGUgdG8gZm9vbAorCXNvbWUgb2Ygb3VyIGNoZWNrcy4gV2UgZG9uJ3QgdGVzdCBmb3IgdGhpcyBzcGVjaWFsIGNhc2UgYXMgbmV3ZXIgdmVyc2lvbnMKKwlvZiBjcnlwdCBkbyBub3QgdHJ1bmNhdGUgcGFzc3dvcmRzLgorKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyBpbnQgc3RyaW5nX2NoZWNrZXJfaGVscGVyKGNvbnN0IGNoYXIgKnAxLCBjb25zdCBjaGFyICpwMikgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKK3N0YXRpYyBpbnQgc3RyaW5nX2NoZWNrZXJfaGVscGVyKGNvbnN0IGNoYXIgKnAxLCBjb25zdCBjaGFyICpwMikKK3sKKwkvKiBhcyBzdWItc3RyaW5nICovCisJaWYgKHN0cmNhc2VzdHIocDIsIHAxKSAhPSBOVUxMCisJLyogaW52ZXJ0IGluIGNhc2UgaGF5c3RhY2sgaXMgc2hvcnRlciB0aGFuIG5lZWRsZSAqLworCSB8fCBzdHJjYXNlc3RyKHAxLCBwMikgIT0gTlVMTAorCS8qIGFzLWlzIG9yIGNhcGl0YWxpemVkICovCisJLyogfHwgc3RyY2FzZWNtcChwMSwgcDIpID09IDAgLSAxc3Qgc3RyY2FzZXN0ciBzaG91bGQgY2F0Y2ggdGhpcyB0b28gKi8KKwkpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0cmluZ19jaGVja2VyKGNvbnN0IGNoYXIgKnAxLCBjb25zdCBjaGFyICpwMikKK3sKKwlpbnQgc2l6ZSwgaTsKKwkvKiBjaGVjayBzdHJpbmcgKi8KKwlpbnQgcmV0ID0gc3RyaW5nX2NoZWNrZXJfaGVscGVyKHAxLCBwMik7CisJLyogbWFrZSBvdXIgb3duIGNvcHkgKi8KKwljaGFyICpwID0geHN0cmR1cChwMSk7CisKKwkvKiByZXZlcnNlIHN0cmluZyAqLworCWkgPSBzaXplID0gc3RybGVuKHAxKTsKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJKnArKyA9IHAxW2ldOworCX0KKwlwIC09IHNpemU7IC8qIHJlc3RvcmUgcG9pbnRlciAqLworCisJLyogY2hlY2sgcmV2ZXJzZWQgc3RyaW5nICovCisJcmV0IHw9IHN0cmluZ19jaGVja2VyX2hlbHBlcihwLCBwMik7CisKKwkvKiBjbGVhbiB1cCAqLworCW1lbXNldChwLCAwLCBzaXplKTsKKwlmcmVlKHApOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBDQVRFR09SSUVTICA0CisKKyNkZWZpbmUgTE9XRVJDQVNFICAgMQorI2RlZmluZSBVUFBFUkNBU0UgICAyCisjZGVmaW5lIE5VTUJFUlMgICAgIDQKKyNkZWZpbmUgU1BFQ0lBTCAgICAgOAorCisjZGVmaW5lIExBU1RfQ0FUICAgIDgKKworc3RhdGljIGNvbnN0IGNoYXIgKm9ic2N1cmVfbXNnKGNvbnN0IGNoYXIgKm9sZF9wLCBjb25zdCBjaGFyICpuZXdfcCwgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJdW5zaWduZWQgbGVuZ3RoOworCXVuc2lnbmVkIHNpemU7CisJdW5zaWduZWQgbWl4ZWQ7CisJdW5zaWduZWQgYzsKKwl1bnNpZ25lZCBpOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqaG9zdG5hbWU7CisKKwkvKiBzaXplICovCisJaWYgKCFuZXdfcCB8fCAobGVuZ3RoID0gc3RybGVuKG5ld19wKSkgPCBDT05GSUdfUEFTU1dPUkRfTUlOTEVOKQorCQlyZXR1cm4gInRvbyBzaG9ydCI7CisKKwkvKiBubyB1c2VybmFtZSBhcy1pcywgYXMgc3ViLXN0cmluZywgcmV2ZXJzZWQsIGNhcGl0YWxpemVkLCBkb3VibGVkICovCisJaWYgKHN0cmluZ19jaGVja2VyKG5ld19wLCBwdy0+cHdfbmFtZSkpIHsKKwkJcmV0dXJuICJzaW1pbGFyIHRvIHVzZXJuYW1lIjsKKwl9CisjaWZuZGVmIF9fQklPTklDX18KKwkvKiBubyBnZWNvcyBhcy1pcywgYXMgc3ViLXN0cmluZywgcmV2ZXJzZWQsIGNhcGl0YWxpemVkLCBkb3VibGVkICovCisJaWYgKHB3LT5wd19nZWNvc1swXSAmJiBzdHJpbmdfY2hlY2tlcihuZXdfcCwgcHctPnB3X2dlY29zKSkgeworCQlyZXR1cm4gInNpbWlsYXIgdG8gZ2Vjb3MiOworCX0KKyNlbmRpZgorCS8qIGhvc3RuYW1lIGFzLWlzLCBhcyBzdWItc3RyaW5nLCByZXZlcnNlZCwgY2FwaXRhbGl6ZWQsIGRvdWJsZWQgKi8KKwlob3N0bmFtZSA9IHNhZmVfZ2V0aG9zdG5hbWUoKTsKKwlpID0gc3RyaW5nX2NoZWNrZXIobmV3X3AsIGhvc3RuYW1lKTsKKwlmcmVlKGhvc3RuYW1lKTsKKwlpZiAoaSkKKwkJcmV0dXJuICJzaW1pbGFyIHRvIGhvc3RuYW1lIjsKKworCS8qIFNob3VsZCAvIE11c3QgY29udGFpbiBhIG1peCBvZjogKi8KKwltaXhlZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmIChpc2xvd2VyKG5ld19wW2ldKSkgeyAgICAgICAgLyogYS16ICovCisJCQltaXhlZCB8PSBMT1dFUkNBU0U7CisJCX0gZWxzZSBpZiAoaXN1cHBlcihuZXdfcFtpXSkpIHsgLyogQS1aICovCisJCQltaXhlZCB8PSBVUFBFUkNBU0U7CisJCX0gZWxzZSBpZiAoaXNkaWdpdChuZXdfcFtpXSkpIHsgLyogMC05ICovCisJCQltaXhlZCB8PSBOVU1CRVJTOworCQl9IGVsc2UgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWwgY2hhcmFjdGVycyAqLworCQkJbWl4ZWQgfD0gU1BFQ0lBTDsKKwkJfQorCQkvKiBDb3VudCBpJ3RoIGNoYXIgKi8KKwkJYyA9IDA7CisJCXAgPSBuZXdfcDsKKwkJd2hpbGUgKDEpIHsKKwkJCXAgPSBzdHJjaHIocCwgbmV3X3BbaV0pOworCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJYysrOworCQkJcCsrOworCQkJaWYgKCEqcCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIE1vcmUgdGhhbiA1MCUgc2ltaWxhciBjaGFyYWN0ZXJzID8gKi8KKwkJaWYgKGMqMiA+PSBsZW5ndGgpIHsKKwkJCXJldHVybiAidG9vIG1hbnkgc2ltaWxhciBjaGFyYWN0ZXJzIjsKKwkJfQorCX0KKworCXNpemUgPSBDT05GSUdfUEFTU1dPUkRfTUlOTEVOICsgMipDQVRFR09SSUVTOworCWZvciAoaSA9IDE7IGkgPD0gTEFTVF9DQVQ7IGkgPDw9IDEpCisJCWlmIChtaXhlZCAmIGkpCisJCQlzaXplIC09IDI7CisJaWYgKGxlbmd0aCA8IHNpemUpCisJCXJldHVybiAidG9vIHdlYWsiOworCisJaWYgKG9sZF9wICYmIG9sZF9wWzBdKSB7CisJCS8qIGNoZWNrIHZzLiBvbGQgcGFzc3dvcmQgKi8KKwkJaWYgKHN0cmluZ19jaGVja2VyKG5ld19wLCBvbGRfcCkpIHsKKwkJCXJldHVybiAic2ltaWxhciB0byBvbGQgcGFzc3dvcmQiOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBGQVNUX0ZVTkMgb2JzY3VyZShjb25zdCBjaGFyICpvbGQsIGNvbnN0IGNoYXIgKm5ld3ZhbCwgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJY29uc3QgY2hhciAqbXNnOworCisJbXNnID0gb2JzY3VyZV9tc2cob2xkLCBuZXd2YWwsIHB3KTsKKwlpZiAobXNnKSB7CisJCXByaW50ZigiQmFkIHBhc3N3b3JkOiAlc1xuIiwgbXNnKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcGFyc2VfY29uZmlnLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9wYXJzZV9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjViYTRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcGFyc2VfY29uZmlnLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNvbmZpZyBmaWxlIHBhcnNlciBoZWxwZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKiBBbHNvIGZvciB1c2UgaW4gdUNsaWJjIChodHRwOi8vdWNsaWJjLm9yZy8pIGxpY2Vuc2VkIHVuZGVyIExHUEx2Mi4xIG9yIGxhdGVyLgorICovCisKKy8qIFVuY29tbWVudCB0byBlbmFibGUgdGVzdCBhcHBsZXQgKi8KKy8vLy9jb25maWc6Y29uZmlnIFBBUlNFCisvLy8vY29uZmlnOglib29sICJVbmlmb3JtIGNvbmZpZyBmaWxlIHBhcnNlciBkZWJ1Z2dpbmcgYXBwbGV0OiBwYXJzZSIKKy8vLy9jb25maWc6CWRlZmF1bHQgbgorLy8vL2NvbmZpZzoJaGVscAorLy8vL2NvbmZpZzoJICBUeXBpY2FsIHVzYWdlIG9mIHBhcnNlIEFQSToKKy8vLy9jb25maWc6CQljaGFyICp0WzNdOworLy8vL2NvbmZpZzoJCXBhcnNlcl90ICpwID0gY29uZmlnX29wZW4oZmlsZW5hbWUpOworLy8vL2NvbmZpZzoJCXdoaWxlIChjb25maWdfcmVhZChwLCB0LCAzLCAwLCBkZWxpbWl0ZXJzLCBmbGFncykpIHsgLy8gMS4uMyB0b2tlbnMKKy8vLy9jb25maWc6CQkJYmJfZXJyb3JfbXNnKCJUT0tFTlM6ICclcycnJXMnJyVzJyIsIHRbMF0sIHRbMV0sIHRbMl0pOworLy8vL2NvbmZpZzoJCX0KKy8vLy9jb25maWc6CQljb25maWdfY2xvc2UocCk7CisKKy8vLy9hcHBsZXQ6SUZfUEFSU0UoQVBQTEVUKHBhcnNlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLXkgKz0gcGFyc2VfY29uZmlnLm8KKworLy91c2FnZTojZGVmaW5lIHBhcnNlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXhdIFstbiBNQVhUT0tFTlNdIFstbSBNSU5UT0tFTlNdIFstZCBERUxJTVNdIFstZiBGTEFHU10gRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBwYXJzZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgkteAlTdXBwcmVzcyBvdXRwdXQgKGZvciBiZW5jaG1hcmtpbmcpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIGRlZmluZWQgRU5BQkxFX1BBUlNFICYmIEVOQUJMRV9QQVJTRQoraW50IHBhcnNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwYXJzZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqZGVsaW1zID0gIiMgXHQiOworCWNoYXIgKip0OworCXVuc2lnbmVkIGZsYWdzID0gUEFSU0VfTk9STUFMOworCWludCBtaW50b2tlbnMgPSAwLCBudG9rZW5zID0gMTI4OworCXVuc2lnbmVkIG5vb3V0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6bis6bSs6ZisiOworCW5vb3V0ID0gMSAmIGdldG9wdDMyKGFyZ3YsICJ4bjptOmQ6ZjoiLCAmbnRva2VucywgJm1pbnRva2VucywgJmRlbGltcywgJmZsYWdzKTsKKwkvL2FyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJdCA9IHhtYWxsb2Moc2l6ZW9mKHRbMF0pICogbnRva2Vucyk7CisJd2hpbGUgKCphcmd2KSB7CisJCWludCBuOworCQlwYXJzZXJfdCAqcCA9IGNvbmZpZ19vcGVuKCphcmd2KTsKKwkJd2hpbGUgKChuID0gY29uZmlnX3JlYWQocCwgdCwgbnRva2VucywgbWludG9rZW5zLCBkZWxpbXMsIGZsYWdzKSkgIT0gMCkgeworCQkJaWYgKCFub291dCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQorCQkJCQlwcmludGYoIlslc10iLCB0W2ldKTsKKwkJCQlwdXRzKCIiKTsKKwkJCX0KKwkJfQorCQljb25maWdfY2xvc2UocCk7CisJCWFyZ3YrKzsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitwYXJzZXJfdCogRkFTVF9GVU5DIGNvbmZpZ19vcGVuMihjb25zdCBjaGFyICpmaWxlbmFtZSwgRklMRSogRkFTVF9GVU5DICgqZm9wZW5fZnVuYykoY29uc3QgY2hhciAqcGF0aCkpCit7CisJRklMRSogZnA7CisJcGFyc2VyX3QgKnBhcnNlcjsKKworCWZwID0gZm9wZW5fZnVuYyhmaWxlbmFtZSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuIE5VTEw7CisJcGFyc2VyID0geHphbGxvYyhzaXplb2YoKnBhcnNlcikpOworCXBhcnNlci0+ZnAgPSBmcDsKKwlyZXR1cm4gcGFyc2VyOworfQorCitwYXJzZXJfdCogRkFTVF9GVU5DIGNvbmZpZ19vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXJldHVybiBjb25maWdfb3BlbjIoZmlsZW5hbWUsIGZvcGVuX29yX3dhcm5fc3RkaW4pOworfQorCit2b2lkIEZBU1RfRlVOQyBjb25maWdfY2xvc2UocGFyc2VyX3QgKnBhcnNlcikKK3sKKwlpZiAocGFyc2VyKSB7CisJCWlmIChQQVJTRV9LRUVQX0NPUFkpIC8qIGNvbXBpbGUtdGltZSBjb25zdGFudCAqLworCQkJZnJlZShwYXJzZXItPmRhdGEpOworCQlmY2xvc2UocGFyc2VyLT5mcCk7CisJCWZyZWUocGFyc2VyLT5saW5lKTsKKwkJZnJlZShwYXJzZXItPm5saW5lKTsKKwkJZnJlZShwYXJzZXIpOworCX0KK30KKworLyogVGhpcyBmdW5jdGlvbiByZWFkcyBhbiBlbnRpcmUgbGluZSBmcm9tIGEgdGV4dCBmaWxlLAorICogdXAgdG8gYSBuZXdsaW5lLCBleGNsdXNpdmUuCisgKiBUcmFpbGluZyAnXCcgaXMgcmVjb2duaXplZCBhcyBsaW5lIGNvbnRpbnVhdGlvbi4KKyAqIFJldHVybnMgLTEgaWYgRU9GL2Vycm9yLgorICovCitzdGF0aWMgaW50IGdldF9saW5lX3dpdGhfY29udGludWF0aW9uKHBhcnNlcl90ICpwYXJzZXIpCit7CisJc3NpemVfdCBsZW4sIG5sZW47CisJY2hhciAqbGluZTsKKworCWxlbiA9IGdldGxpbmUoJnBhcnNlci0+bGluZSwgJnBhcnNlci0+bGluZV9hbGxvYywgcGFyc2VyLT5mcCk7CisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gbGVuOworCisJbGluZSA9IHBhcnNlci0+bGluZTsKKwlmb3IgKDs7KSB7CisJCXBhcnNlci0+bGluZW5vKys7CisJCWlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpCisJCQlsZW4tLTsKKwkJaWYgKGxlbiA9PSAwIHx8IGxpbmVbbGVuIC0gMV0gIT0gJ1xcJykKKwkJCWJyZWFrOworCQlsZW4tLTsKKworCQlubGVuID0gZ2V0bGluZSgmcGFyc2VyLT5ubGluZSwgJnBhcnNlci0+bmxpbmVfYWxsb2MsIHBhcnNlci0+ZnApOworCQlpZiAobmxlbiA8PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHBhcnNlci0+bGluZV9hbGxvYyA8IGxlbiArIG5sZW4gKyAxKSB7CisJCQlwYXJzZXItPmxpbmVfYWxsb2MgPSBsZW4gKyBubGVuICsgMTsKKwkJCWxpbmUgPSBwYXJzZXItPmxpbmUgPSB4cmVhbGxvYyhsaW5lLCBwYXJzZXItPmxpbmVfYWxsb2MpOworCQl9CisJCW1lbWNweSgmbGluZVtsZW5dLCBwYXJzZXItPm5saW5lLCBubGVuKTsKKwkJbGVuICs9IG5sZW47CisJfQorCisJbGluZVtsZW5dID0gJ1wwJzsKKwlyZXR1cm4gbGVuOworfQorCisKKy8qCiswLiBJZiBwYXJzZXIgaXMgTlVMTCByZXR1cm4gMC4KKzEuIFJlYWQgYSBsaW5lIGZyb20gY29uZmlnIGZpbGUuIElmIG5vdGhpbmcgdG8gcmVhZCB0aGVuIHJldHVybiAwLgorICAgSGFuZGxlIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIuIEFkdmFuY2UgbGluZW5vIGZvciBlYWNoIHBoeXNpY2FsIGxpbmUuCisgICBEaXNjYXJkIGV2ZXJ5dGhpbmcgcGFzdCBjb21tZW50IGNoYXJhY3Rlci4KKzIuIGlmIFBBUlNFX1RSSU0gaXMgc2V0IChkZWZhdWx0KSwgcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGRlbGltaXRlcnMuCiszLiBJZiByZXN1bHRpbmcgbGluZSBpcyBlbXB0eSBnb3RvIDEuCis0LiBMb29rIGZvciBmaXJzdCBkZWxpbWl0ZXIuIElmICFQQVJTRV9DT0xMQVBTRSBvciAhUEFSU0VfVFJJTSBpcyBzZXQgdGhlbgorICAgcmVtZW1iZXIgdGhlIHRva2VuIGFzIGVtcHR5LgorNS4gRWxzZSAoZGVmYXVsdCkgaWYgbnVtYmVyIG9mIHNlZW4gdG9rZW5zIGlzIGVxdWFsIHRvIG1heCBudW1iZXIgb2YgdG9rZW5zCisgICAodG9rZW4gaXMgdGhlIGxhc3Qgb25lKSBhbmQgUEFSU0VfR1JFRURZIGlzIHNldCB0aGVuIHRoZSByZW1haW5kZXIKKyAgIG9mIHRoZSBsaW5lIGlzIHRoZSBsYXN0IHRva2VuLgorICAgRWxzZSAodG9rZW4gaXMgbm90IGxhc3Qgb3IgUEFSU0VfR1JFRURZIGlzIG5vdCBzZXQpIGp1c3QgcmVwbGFjZQorICAgZmlyc3QgZGVsaW1pdGVyIHdpdGggJ1wwJyB0aHVzIGRlbGltaXRpbmcgdGhlIHRva2VuLgorNi4gQWR2YW5jZSBsaW5lIHBvaW50ZXIgcGFzdCB0aGUgZW5kIG9mIHRva2VuLiBJZiBudW1iZXIgb2Ygc2VlbiB0b2tlbnMKKyAgIGlzIGxlc3MgdGhhbiByZXF1aXJlZCBudW1iZXIgb2YgdG9rZW5zIHRoZW4gZ290byA0LgorNy4gQ2hlY2sgdGhlIG51bWJlciBvZiBzZWVuIHRva2VucyBpcyBub3QgbGVzcyB0aGUgbWluIG51bWJlciBvZiB0b2tlbnMuCisgICBDb21wbGFpbiBvciBkaWUgb3RoZXJ3aXNlIGRlcGVuZGluZyBvbiBQQVJTRV9NSU5fRElFLgorOC4gUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VlbiB0b2tlbnMuCisKK21pbnRva2VucyA+IDAgbWFrZSBjb25maWdfcmVhZCgpIHByaW50IGVycm9yIG1lc3NhZ2UgaWYgbGVzcyB0aGFuIG1pbnRva2VucworKGJ1dCBtb3JlIHRoYW4gMCkgYXJlIGZvdW5kLiBFbXB0eSBsaW5lcyBhcmUgYWx3YXlzIHNraXBwZWQgKG5vdCB3YXJuZWQgYWJvdXQpLgorKi8KKyN1bmRlZiBjb25maWdfcmVhZAoraW50IEZBU1RfRlVOQyBjb25maWdfcmVhZChwYXJzZXJfdCAqcGFyc2VyLCBjaGFyICoqdG9rZW5zLCB1bnNpZ25lZCBmbGFncywgY29uc3QgY2hhciAqZGVsaW1zKQoreworCWNoYXIgKmxpbmU7CisJaW50IG50b2tlbnMsIG1pbnRva2VuczsKKwlpbnQgdDsKKworCWlmICghcGFyc2VyKQorCQlyZXR1cm4gMDsKKworCW50b2tlbnMgPSAodWludDhfdClmbGFnczsKKwltaW50b2tlbnMgPSAodWludDhfdCkoZmxhZ3MgPj4gOCk7CisKKyBhZ2FpbjoKKwltZW1zZXQodG9rZW5zLCAwLCBzaXplb2YodG9rZW5zWzBdKSAqIG50b2tlbnMpOworCisJLyogUmVhZCBvbmUgbGluZSAoaGFuZGxpbmcgY29udGludWF0aW9ucyB3aXRoIGJhY2tzbGFzaCkgKi8KKwlpZiAoZ2V0X2xpbmVfd2l0aF9jb250aW51YXRpb24ocGFyc2VyKSA8IDApCisJCXJldHVybiAwOworCisJbGluZSA9IHBhcnNlci0+bGluZTsKKworCS8qIFNraXAgdG9rZW4gaW4gdGhlIHN0YXJ0IG9mIGxpbmU/ICovCisJaWYgKGZsYWdzICYgUEFSU0VfVFJJTSkKKwkJbGluZSArPSBzdHJzcG4obGluZSwgZGVsaW1zICsgMSk7CisKKwlpZiAobGluZVswXSA9PSAnXDAnIHx8IGxpbmVbMF0gPT0gZGVsaW1zWzBdKQorCQlnb3RvIGFnYWluOworCisJaWYgKGZsYWdzICYgUEFSU0VfS0VFUF9DT1BZKSB7CisJCWZyZWUocGFyc2VyLT5kYXRhKTsKKwkJcGFyc2VyLT5kYXRhID0geHN0cmR1cChsaW5lKTsKKwl9CisKKwkvKiBUb2tlbml6ZSB0aGUgbGluZSAqLworCXQgPSAwOworCWRvIHsKKwkJLyogUGluIHRva2VuICovCisJCXRva2Vuc1t0XSA9IGxpbmU7CisKKwkJLyogQ29tYmluZSByZW1haW5pbmcgYXJndW1lbnRzPyAqLworCQlpZiAoKHQgIT0gKG50b2tlbnMtMSkpIHx8ICEoZmxhZ3MgJiBQQVJTRV9HUkVFRFkpKSB7CisJCQkvKiBWYW5pbGxhIHRva2VuLCBmaW5kIG5leHQgZGVsaW1pdGVyICovCisJCQlsaW5lICs9IHN0cmNzcG4obGluZSwgZGVsaW1zWzBdID8gZGVsaW1zIDogZGVsaW1zICsgMSk7CisJCX0gZWxzZSB7CisJCQkvKiBDb21iaW5pbmcsIGZpbmQgY29tbWVudCBjaGFyIGlmIGFueSAqLworCQkJbGluZSA9IHN0cmNocm51bChsaW5lLCBkZWxpbXNbMF0pOworCisJCQkvKiBUcmltIGFueSBleHRyYSBkZWxpbWl0ZXJzIGZyb20gdGhlIGVuZCAqLworCQkJaWYgKGZsYWdzICYgUEFSU0VfVFJJTSkgeworCQkJCXdoaWxlIChzdHJjaHIoZGVsaW1zICsgMSwgbGluZVstMV0pICE9IE5VTEwpCisJCQkJCWxpbmUtLTsKKwkJCX0KKwkJfQorCisJCS8qIFRva2VuIG5vdCB0ZXJtaW5hdGVkPyAqLworCQlpZiAoKmxpbmUgPT0gZGVsaW1zWzBdKQorCQkJKmxpbmUgPSAnXDAnOworCQllbHNlIGlmICgqbGluZSAhPSAnXDAnKQorCQkJKmxpbmUrKyA9ICdcMCc7CisKKyNpZiAwIC8qIHVudXNlZCBzbyBmYXIgKi8KKwkJaWYgKGZsYWdzICYgUEFSU0VfRVNDQVBFKSB7CisJCQlzdHJjcHlfYW5kX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlcyh0b2tlbnNbdF0sIHRva2Vuc1t0XSk7CisJCX0KKyNlbmRpZgorCQkvKiBTa2lwIHBvc3NpYmxlIGRlbGltaXRlcnMgKi8KKwkJaWYgKGZsYWdzICYgUEFSU0VfQ09MTEFQU0UpCisJCQlsaW5lICs9IHN0cnNwbihsaW5lLCBkZWxpbXMgKyAxKTsKKworCQl0Kys7CisJfSB3aGlsZSAoKmxpbmUgJiYgKmxpbmUgIT0gZGVsaW1zWzBdICYmIHQgPCBudG9rZW5zKTsKKworCWlmICh0IDwgbWludG9rZW5zKSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGxpbmUgJXU6ICVkIHRva2VucyBmb3VuZCwgJWQgbmVlZGVkIiwKKwkJCQlwYXJzZXItPmxpbmVubywgdCwgbWludG9rZW5zKTsKKwkJaWYgKGZsYWdzICYgUEFSU0VfTUlOX0RJRSkKKwkJCXhmdW5jX2RpZSgpOworCQlnb3RvIGFnYWluOworCX0KKworCXJldHVybiB0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcGFyc2VfbW9kZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcGFyc2VfbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNGUxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9wYXJzZV9tb2RlLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBhcnNlX21vZGUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvY2htb2QuaHRtbCAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZyb20gTk9GT1JLIGFwcGxldHMuIEl0IG11c3Qgbm90IGFsbG9jYXRlIGFueXRoaW5nICovCisKKyNkZWZpbmUgRklMRU1PREVCSVRTIChTX0lTVUlEIHwgU19JU0dJRCB8IFNfSVNWVFggfCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pCisKK2ludCBGQVNUX0ZVTkMgYmJfcGFyc2VfbW9kZShjb25zdCBjaGFyICpzLCBtb2RlX3QgKmN1cnJlbnRfbW9kZSkKK3sKKwlzdGF0aWMgY29uc3QgbW9kZV90IHdob19tYXNrW10gPSB7CisJCVNfSVNVSUQgfCBTX0lTR0lEIHwgU19JU1ZUWCB8IFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTywgLyogYSAqLworCQlTX0lTVUlEIHwgU19JUldYVSwgICAgICAgICAgIC8qIHUgKi8KKwkJU19JU0dJRCB8IFNfSVJXWEcsICAgICAgICAgICAvKiBnICovCisJCVNfSVJXWE8gICAgICAgICAgICAgICAgICAgICAgLyogbyAqLworCX07CisJc3RhdGljIGNvbnN0IG1vZGVfdCBwZXJtX21hc2tbXSA9IHsKKwkJU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCAvKiByICovCisJCVNfSVdVU1IgfCBTX0lXR1JQIHwgU19JV09USCwgLyogdyAqLworCQlTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgsIC8qIHggKi8KKwkJU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RILCAvKiBYIC0tIHNwZWNpYWwgLS0gc2VlIGJlbG93ICovCisJCVNfSVNVSUQgfCBTX0lTR0lELCAgICAgICAgICAgLyogcyAqLworCQlTX0lTVlRYICAgICAgICAgICAgICAgICAgICAgIC8qIHQgKi8KKwl9OworCXN0YXRpYyBjb25zdCBjaGFyIHdob19jaGFyc1tdIEFMSUdOMSA9ICJhdWdvIjsKKwlzdGF0aWMgY29uc3QgY2hhciBwZXJtX2NoYXJzW10gQUxJR04xID0gInJ3eFhzdCI7CisKKwljb25zdCBjaGFyICpwOworCW1vZGVfdCB3aG9saXN0OworCW1vZGVfdCBwZXJtbGlzdDsKKwltb2RlX3QgbmV3X21vZGU7CisJY2hhciBvcDsKKworCWlmICgodW5zaWduZWQgY2hhcikoKnMgLSAnMCcpIDwgOCkgeworCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJY2hhciAqZTsKKworCQl0bXAgPSBzdHJ0b3VsKHMsICZlLCA4KTsKKwkJaWYgKCplIHx8ICh0bXAgPiAwNzc3N1UpKSB7IC8qIENoZWNrIHJhbmdlIGFuZCB0cmFpbGluZyBjaGFycy4gKi8KKwkJCXJldHVybiAwOworCQl9CisJCSpjdXJyZW50X21vZGUgPSB0bXA7CisJCXJldHVybiAxOworCX0KKworCW5ld19tb2RlID0gKmN1cnJlbnRfbW9kZTsKKworCS8qIE5vdGU6IHdlIGFsbG93IGVtcHR5IGNsYXVzZXMsIGFuZCBoZW5jZSBlbXB0eSBtb2Rlcy4KKwkgKiBXZSB0cmVhdCBhbiBlbXB0eSBtb2RlIGFzIG5vIGNoYW5nZSB0byBwZXJtcy4gKi8KKworCXdoaWxlICgqcykgeyAgLyogUHJvY2VzcyBjbGF1c2VzLiAqLworCQlpZiAoKnMgPT0gJywnKSB7ICAvKiBXZSBhbGxvdyBlbXB0eSBjbGF1c2VzLiAqLworCQkJKytzOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBHZXQgYSB3aG9saXN0LiAqLworCQl3aG9saXN0ID0gMDsKKyBXSE9fTElTVDoKKwkJcCA9IHdob19jaGFyczsKKwkJZG8geworCQkJaWYgKCpwID09ICpzKSB7CisJCQkJd2hvbGlzdCB8PSB3aG9fbWFza1soaW50KShwLXdob19jaGFycyldOworCQkJCWlmICghKisrcykgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZ290byBXSE9fTElTVDsKKwkJCX0KKwkJfSB3aGlsZSAoKisrcCk7CisKKwkJZG8geyAgICAvKiBQcm9jZXNzIGFjdGlvbiBsaXN0LiAqLworCQkJaWYgKCgqcyAhPSAnKycpICYmICgqcyAhPSAnLScpKSB7CisJCQkJaWYgKCpzICE9ICc9JykgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJLyogU2luY2Ugb3AgaXMgJz0nLCBjbGVhciBhbGwgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZQorCQkJCSAqIHdob2xpc3QsIG9yIGFsbCBmaWxlIGJpdHMgaWYgd2hvbGlzdCBpcyBlbXB0eS4gKi8KKwkJCQlwZXJtbGlzdCA9IH5GSUxFTU9ERUJJVFM7CisJCQkJaWYgKHdob2xpc3QpIHsKKwkJCQkJcGVybWxpc3QgPSB+d2hvbGlzdDsKKwkJCQl9CisJCQkJbmV3X21vZGUgJj0gcGVybWxpc3Q7CisJCQl9CisJCQlvcCA9ICpzKys7CisKKwkJCS8qIENoZWNrIGZvciBwZXJtY29weS4gKi8KKwkJCXAgPSB3aG9fY2hhcnMgKyAxOyAgLyogU2tpcCAnYScgZW50cnkuICovCisJCQlkbyB7CisJCQkJaWYgKCpwID09ICpzKSB7CisJCQkJCWludCBpID0gMDsKKwkJCQkJcGVybWxpc3QgPSB3aG9fbWFza1soaW50KShwLXdob19jaGFycyldCisJCQkJCQkJICYgKFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykKKwkJCQkJCQkgJiBuZXdfbW9kZTsKKwkJCQkJZG8geworCQkJCQkJaWYgKHBlcm1saXN0ICYgcGVybV9tYXNrW2ldKSB7CisJCQkJCQkJcGVybWxpc3QgfD0gcGVybV9tYXNrW2ldOworCQkJCQkJfQorCQkJCQl9IHdoaWxlICgrK2kgPCAzKTsKKwkJCQkJKytzOworCQkJCQlnb3RvIEdPVF9BQ1RJT047CisJCQkJfQorCQkJfSB3aGlsZSAoKisrcCk7CisKKwkJCS8qIEl0IHdhcyBub3QgYSBwZXJtY29weSwgc28gZ2V0IGEgcGVybWxpc3QuICovCisJCQlwZXJtbGlzdCA9IDA7CisgUEVSTV9MSVNUOgorCQkJcCA9IHBlcm1fY2hhcnM7CisJCQlkbyB7CisJCQkJaWYgKCpwID09ICpzKSB7CisJCQkJCWlmICgoKnAgIT0gJ1gnKQorCQkJCQkgfHwgKG5ld19tb2RlICYgKFNfSUZESVIgfCBTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKQorCQkJCQkpIHsKKwkJCQkJCXBlcm1saXN0IHw9IHBlcm1fbWFza1soaW50KShwLXBlcm1fY2hhcnMpXTsKKwkJCQkJfQorCQkJCQlpZiAoISorK3MpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWdvdG8gUEVSTV9MSVNUOworCQkJCX0KKwkJCX0gd2hpbGUgKCorK3ApOworIEdPVF9BQ1RJT046CisJCQlpZiAocGVybWxpc3QpIHsgLyogVGhlIHBlcm1saXN0IHdhcyBub25lbXB0eS4gKi8KKwkJCQltb2RlX3QgdG1wID0gd2hvbGlzdDsKKwkJCQlpZiAoIXdob2xpc3QpIHsKKwkJCQkJbW9kZV90IHVfbWFzayA9IHVtYXNrKDApOworCQkJCQl1bWFzayh1X21hc2spOworCQkJCQl0bXAgPSB+dV9tYXNrOworCQkJCX0KKwkJCQlwZXJtbGlzdCAmPSB0bXA7CisJCQkJaWYgKG9wID09ICctJykgeworCQkJCQluZXdfbW9kZSAmPSB+cGVybWxpc3Q7CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV3X21vZGUgfD0gcGVybWxpc3Q7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlICgqcyAmJiAoKnMgIT0gJywnKSk7CisJfQorCisJKmN1cnJlbnRfbW9kZSA9IG5ld19tb2RlOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcGVycm9yX21zZy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcGVycm9yX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMWYwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9wZXJyb3JfbXNnLmMKQEAgLTAsMCArMSw0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGJiX3BlcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCS8qIEd1YXJkIGFnYWluc3QgIjxlcnJvciBtZXNzYWdlPjogU3VjY2VzcyIgKi8KKwliYl92ZXJyb3JfbXNnKHMsIHAsIGVycm5vID8gc3RyZXJyb3IoZXJybm8pIDogTlVMTCk7CisJdmFfZW5kKHApOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCS8qIEd1YXJkIGFnYWluc3QgIjxlcnJvciBtZXNzYWdlPjogU3VjY2VzcyIgKi8KKwliYl92ZXJyb3JfbXNnKHMsIHAsIGVycm5vID8gc3RyZXJyb3IoZXJybm8pIDogTlVMTCk7CisJdmFfZW5kKHApOworCXhmdW5jX2RpZSgpOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9zaW1wbGVfcGVycm9yX21zZyhjb25zdCBjaGFyICpzKQoreworCWJiX3BlcnJvcl9tc2coIiVzIiwgcyk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcykKK3sKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgcyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9wZXJyb3Jfbm9tc2cuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3BlcnJvcl9ub21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTExY2MKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9wZXJyb3Jfbm9tc2cuYwpAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYl9wZXJyb3Jfbm9tc2cgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIGdjYyB3YXJucyBhYm91dCBhIG51bGwgZm9ybWF0IHN0cmluZywgdGhlcmVmb3JlIHdlIHByb3ZpZGUKKyAqIG1vZGlmaWVkIGRlZmluaXRpb24gd2l0aG91dCAiYXR0cmlidXRlIChmb3JtYXQpIgorICogaW5zdGVhZCBvZiBpbmNsdWRpbmcgbGliYmIuaCAqLworLy8jaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorZXh0ZXJuIHZvaWQgYmJfcGVycm9yX21zZyhjb25zdCBjaGFyICpzLCAuLi4pIEZBU1RfRlVOQzsKKworLyogc3VwcHJlc3MgZ2NjICJubyBwcmV2aW91cyBwcm90b3R5cGUiIHdhcm5pbmcgKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX3BlcnJvcl9ub21zZyh2b2lkKTsKK3ZvaWQgRkFTVF9GVU5DIGJiX3BlcnJvcl9ub21zZyh2b2lkKQoreworCWJiX3BlcnJvcl9tc2coMCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9wZXJyb3Jfbm9tc2dfYW5kX2RpZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcGVycm9yX25vbXNnX2FuZF9kaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNmZjUxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcGVycm9yX25vbXNnX2FuZF9kaWUuYwpAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogZ2NjIHdhcm5zIGFib3V0IGEgbnVsbCBmb3JtYXQgc3RyaW5nLCB0aGVyZWZvcmUgd2UgcHJvdmlkZQorICogbW9kaWZpZWQgZGVmaW5pdGlvbiB3aXRob3V0ICJhdHRyaWJ1dGUgKGZvcm1hdCkiCisgKiBpbnN0ZWFkIG9mIGluY2x1ZGluZyBsaWJiYi5oICovCisvLyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInBsYXRmb3JtLmgiCitleHRlcm4gdm9pZCBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcywgLi4uKSBGQVNUX0ZVTkM7CisKKy8qIHN1cHByZXNzIGdjYyAibm8gcHJldmlvdXMgcHJvdG90eXBlIiB3YXJuaW5nICovCit2b2lkIEZBU1RfRlVOQyBiYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSh2b2lkKTsKK3ZvaWQgRkFTVF9GVU5DIGJiX3BlcnJvcl9ub21zZ19hbmRfZGllKHZvaWQpCit7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKDApOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcGlkZmlsZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcGlkZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OGRmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9waWRmaWxlLmMKQEAgLTAsMCArMSw0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcGlkIGZpbGUgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgU3RlcGhhbmUgQmlsbGlhcnQgPHN0ZXBoYW5lLmJpbGxpYXJ0QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIE92ZXJyaWRlIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUgKi8KKyNkZWZpbmUgV0FOVF9QSURGSUxFIDEKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzbWFsbGludCB3cm90ZV9waWRmaWxlOworCit2b2lkIEZBU1RfRlVOQyB3cml0ZV9waWRmaWxlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHBpZF9mZDsKKwljaGFyICplbmQ7CisJY2hhciBidWZbc2l6ZW9mKGludCkqMyArIDJdOworCXN0cnVjdCBzdGF0IHNiOworCisJaWYgKCFwYXRoKQorCQlyZXR1cm47CisJLyogd2Ugd2lsbCBvdmVyd3JpdGUgc3RhbGUgcGlkZmlsZSAqLworCXBpZF9mZCA9IG9wZW4ocGF0aCwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2KTsKKwlpZiAocGlkX2ZkIDwgMCkKKwkJcmV0dXJuOworCisJLyogcGF0aCBjYW4gYmUgIi9kZXYvbnVsbCIhIFRlc3QgZm9yIHN1Y2ggY2FzZXMgKi8KKwl3cm90ZV9waWRmaWxlID0gKGZzdGF0KHBpZF9mZCwgJnNiKSA9PSAwKSAmJiBTX0lTUkVHKHNiLnN0X21vZGUpOworCisJaWYgKHdyb3RlX3BpZGZpbGUpIHsKKwkJLyogZmV3IGJ5dGVzIGxhcmdlciwgYnV0IGRvZXNuJ3QgdXNlIHN0ZGlvICovCisJCWVuZCA9IHV0b2FfdG9fYnVmKGdldHBpZCgpLCBidWYsIHNpemVvZihidWYpKTsKKwkJKmVuZCA9ICdcbic7CisJCWZ1bGxfd3JpdGUocGlkX2ZkLCBidWYsIGVuZCAtIGJ1ZiArIDEpOworCX0KKwljbG9zZShwaWRfZmQpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcGxhdGZvcm0uYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmMzRmNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3BsYXRmb3JtLmMKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBSZXBsYWNlbWVudHMgZm9yIGNvbW1vbiBidXQgdXN1YWxseSBub25zdGFuZGFyZCBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QKKyAqIHN1cHBsaWVkIGJ5IGFsbCBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IGJ5IERhbiBGYW5kcmljaCA8ZGFuQGNvbmVoYXJ2ZXN0ZXJzLmNvbT4sIGV0LiBhbC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmbmRlZiBIQVZFX1NUUkNIUk5VTAorY2hhciogRkFTVF9GVU5DIHN0cmNocm51bChjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKwl3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSBjKQorCQlzKys7CisJcmV0dXJuIChjaGFyKilzOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9WQVNQUklOVEYKK2ludCBGQVNUX0ZVTkMgdmFzcHJpbnRmKGNoYXIgKipzdHJpbmdfcHRyLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgcCkKK3sKKwlpbnQgcjsKKwl2YV9saXN0IHAyOworCWNoYXIgYnVmWzEyOF07CisKKwl2YV9jb3B5KHAyLCBwKTsKKwlyID0gdnNucHJpbnRmKGJ1ZiwgMTI4LCBmb3JtYXQsIHApOworCXZhX2VuZChwKTsKKworCWlmIChyIDwgMTI4KSB7CisJCXZhX2VuZChwMik7CisJCSpzdHJpbmdfcHRyID0geHN0cmR1cChidWYpOworCQlyZXR1cm4gcjsKKwl9CisKKwkqc3RyaW5nX3B0ciA9IHhtYWxsb2MocisxKTsKKwlyID0gdnNucHJpbnRmKCpzdHJpbmdfcHRyLCByKzEsIGZvcm1hdCwgcDIpOworCXZhX2VuZChwMik7CisKKwlyZXR1cm4gcjsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfRFBSSU5URgorLyogZHByaW50ZiBpcyBub3cgcGFydCBvZiBQT1NJWC4xLCBidXQgd2FzIG9ubHkgYWRkZWQgaW4gMjAwOCAqLworaW50IGRwcmludGYoaW50IGZkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IHA7CisJaW50IHI7CisJY2hhciAqc3RyaW5nX3B0cjsKKworCXZhX3N0YXJ0KHAsIGZvcm1hdCk7CisJciA9IHZhc3ByaW50Zigmc3RyaW5nX3B0ciwgZm9ybWF0LCBwKTsKKwl2YV9lbmQocCk7CisJaWYgKHIgPj0gMCkgeworCQlyID0gZnVsbF93cml0ZShmZCwgc3RyaW5nX3B0ciwgcik7CisJCWZyZWUoc3RyaW5nX3B0cik7CisJfQorCXJldHVybiByOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9NRU1SQ0hSCisvKiBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiBtZW1yY2hyKCkgaXMgYSBHTlUgZnVuY3Rpb24gdGhhdCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUuCisgKiBJdCdzIGJhc2ljYWxseSB0aGUgaW52ZXJzZSBvZiBtZW1jaHIoKSAtIHNlYXJjaCBiYWNrd2FyZHMgaW4gYQorICogbWVtb3J5IGJsb2NrIGZvciBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyLgorICovCit2b2lkKiBGQVNUX0ZVTkMgbWVtcmNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCit7CisJY29uc3QgY2hhciAqc3RhcnQgPSBzLCAqZW5kID0gczsKKworCWVuZCArPSBuIC0gMTsKKworCXdoaWxlIChlbmQgPj0gc3RhcnQpIHsKKwkJaWYgKCplbmQgPT0gKGNoYXIpYykKKwkJCXJldHVybiAodm9pZCAqKSBlbmQ7CisJCWVuZC0tOworCX0KKworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9NS0RURU1QCisvKiBUaGlzIGlzIG5vdyBhY3R1YWxseSBwYXJ0IG9mIFBPU0lYLjEsIGJ1dCB3YXMgb25seSBhZGRlZCBpbiAyMDA4ICovCitjaGFyKiBGQVNUX0ZVTkMgbWtkdGVtcChjaGFyICp0ZW1wbGF0ZSkKK3sKKwlpZiAobWt0ZW1wKHRlbXBsYXRlKSA9PSBOVUxMIHx8IG1rZGlyKHRlbXBsYXRlLCAwNzAwKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdGVtcGxhdGU7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkNBU0VTVFIKKy8qIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgaHQ6Ly9EaWcgR3JvdXAgKi8KK2NoYXIqIEZBU1RfRlVOQyBzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnBhdHRlcm4pCit7CisJaW50IGxlbmd0aCA9IHN0cmxlbihwYXR0ZXJuKTsKKworCXdoaWxlICgqcykgeworCQlpZiAoc3RybmNhc2VjbXAocywgcGF0dGVybiwgbGVuZ3RoKSA9PSAwKQorCQkJcmV0dXJuIChjaGFyICopczsKKwkJcysrOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSU0VQCisvKiBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICovCitjaGFyKiBGQVNUX0ZVTkMgc3Ryc2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBjaGFyICpkZWxpbSkKK3sKKwljaGFyICpzdGFydCA9ICpzdHJpbmdwOworCWNoYXIgKnB0cjsKKworCWlmICghc3RhcnQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCEqZGVsaW0pCisJCXB0ciA9IHN0YXJ0ICsgc3RybGVuKHN0YXJ0KTsKKwllbHNlIHsKKwkJcHRyID0gc3RycGJyayhzdGFydCwgZGVsaW0pOworCQlpZiAoIXB0cikgeworCQkJKnN0cmluZ3AgPSBOVUxMOworCQkJcmV0dXJuIHN0YXJ0OworCQl9CisJfQorCisJKnB0ciA9ICdcMCc7CisJKnN0cmluZ3AgPSBwdHIgKyAxOworCisJcmV0dXJuIHN0YXJ0OworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFBDUFkKK2NoYXIqIEZBU1RfRlVOQyBzdHBjcHkoY2hhciAqcCwgY29uc3QgY2hhciAqdG9fYWRkKQoreworCXdoaWxlICgoKnAgPSAqdG9fYWRkKSAhPSAnXDAnKSB7CisJCXArKzsKKwkJdG9fYWRkKys7CisJfQorCXJldHVybiBwOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRMSU5FCitzc2l6ZV90IEZBU1RfRlVOQyBnZXRsaW5lKGNoYXIgKipsaW5lcHRyLCBzaXplX3QgKm4sIEZJTEUgKnN0cmVhbSkKK3sKKwlpbnQgY2g7CisJY2hhciAqbGluZSA9ICpsaW5lcHRyOworCXNpemVfdCBhbGxvY2VkID0gKm47CisJc2l6ZV90IGxlbiA9IDA7CisKKwlkbyB7CisJCWNoID0gZmdldGMoc3RyZWFtKTsKKwkJaWYgKGNoID09IEVPRikKKwkJCWJyZWFrOworCQlpZiAobGVuICsgMSA+PSBhbGxvY2VkKSB7CisJCQlhbGxvY2VkICs9IGFsbG9jZWQvNCArIDY0OworCQkJbGluZSA9IHhyZWFsbG9jKGxpbmUsIGFsbG9jZWQpOworCQl9CisJCWxpbmVbbGVuKytdID0gY2g7CisJfSB3aGlsZSAoY2ggIT0gJ1xuJyk7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiAtMTsKKworCWxpbmVbbGVuXSA9ICdcMCc7CisJKmxpbmVwdHIgPSBsaW5lOworCSpuID0gYWxsb2NlZDsKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9wcmludF9mbGFncy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHJpbnRfZmxhZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVjNzMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHJpbnRfZmxhZ3MuYwpAQCAtMCwwICsxLDMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIFByaW50IHN0cmluZyB0aGF0IG1hdGNoZXMgYml0IG1hc2tlZCBmbGFncworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOYXRhbmFlbCBDb3BhIDxuYXRhbmFlbC5jb3BhQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogcmV0dXJucyBhIHNldCB3aXRoIHRoZSBmbGFncyBub3QgcHJpbnRlZCAqLworaW50IEZBU1RfRlVOQyBwcmludF9mbGFnc19zZXBhcmF0ZWQoY29uc3QgaW50ICptYXNrcywgY29uc3QgY2hhciAqbGFiZWxzLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKnNlcGFyYXRvcikKK3sKKwljb25zdCBjaGFyICpuZWVkX3NlcGFyYXRvciA9IE5VTEw7CisJd2hpbGUgKCpsYWJlbHMpIHsKKwkJaWYgKGZsYWdzICYgKm1hc2tzKSB7CisJCQlwcmludGYoIiVzJXMiLAorCQkJCW5lZWRfc2VwYXJhdG9yID8gbmVlZF9zZXBhcmF0b3IgOiAiIiwKKwkJCQlsYWJlbHMpOworCQkJbmVlZF9zZXBhcmF0b3IgPSBzZXBhcmF0b3I7CisJCQlmbGFncyAmPSB+ICptYXNrczsKKwkJfQorCQltYXNrcysrOworCQlsYWJlbHMgKz0gc3RybGVuKGxhYmVscykgKyAxOworCX0KKwlyZXR1cm4gZmxhZ3M7Cit9CisKK2ludCBGQVNUX0ZVTkMgcHJpbnRfZmxhZ3MoY29uc3QgbWFza3NfbGFiZWxzX3QgKm1sLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIHByaW50X2ZsYWdzX3NlcGFyYXRlZChtbC0+bWFza3MsIG1sLT5sYWJlbHMsIGZsYWdzLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3ByaW50YWJsZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHJpbnRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhZGE0OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3ByaW50YWJsZS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgZnB1dGNfcHJpbnRhYmxlKGludCBjaCwgRklMRSAqZmlsZSkKK3sKKwlpZiAoKGNoICYgKDB4ODAgKyBQUklOVEFCTEVfTUVUQSkpID09ICgweDgwICsgUFJJTlRBQkxFX01FVEEpKSB7CisJCWZwdXRzKCJNLSIsIGZpbGUpOworCQljaCAmPSAweDdmOworCX0KKwljaCA9ICh1bnNpZ25lZCBjaGFyKSBjaDsKKwlpZiAoY2ggPT0gMHg5YikgeworCQkvKiBWVDEwMCdzIENTSSwgYWthIE1ldGEtRVNDLCBpcyBub3QgcHJpbnRhYmxlIG9uIHZ0LTEwMCAqLworCQljaCA9ICd7JzsKKwkJZ290byBwcmludF9jYXJldDsKKwl9CisJaWYgKGNoIDwgJyAnKSB7CisJCWNoICs9ICdAJzsKKwkJZ290byBwcmludF9jYXJldDsKKwl9CisJaWYgKGNoID09IDB4N2YpIHsKKwkJY2ggPSAnPyc7CisgcHJpbnRfY2FyZXQ6CisJCWZwdXRjKCdeJywgZmlsZSk7CisJfQorCWZwdXRjKGNoLCBmaWxlKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3ByaW50YWJsZV9zdHJpbmcuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3ByaW50YWJsZV9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzE2ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHJpbnRhYmxlX3N0cmluZy5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFVuaWNvZGUgc3VwcG9ydCByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBwcmludGFibGVfc3RyaW5nKHVuaV9zdGF0X3QgKnN0YXRzLCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RhdGljIGNoYXIgKnNhdmVkWzRdOworCXN0YXRpYyB1bnNpZ25lZCBjdXJfc2F2ZWQ7IC8qID0gMCAqLworCisJY2hhciAqZHN0OworCWNvbnN0IGNoYXIgKnM7CisKKwlzID0gc3RyOworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICpzOworCQlpZiAoYyA9PSAnXDAnKSB7CisJCQkvKiA5OSslIG9mIGlucHV0cyBkbyBub3QgbmVlZCBjb252ZXJzaW9uICovCisJCQlpZiAoc3RhdHMpIHsKKwkJCQlzdGF0cy0+Ynl0ZV9jb3VudCA9IChzIC0gc3RyKTsKKwkJCQlzdGF0cy0+dW5pY29kZV9jb3VudCA9IChzIC0gc3RyKTsKKwkJCQlzdGF0cy0+dW5pY29kZV93aWR0aCA9IChzIC0gc3RyKTsKKwkJCX0KKwkJCXJldHVybiBzdHI7CisJCX0KKwkJaWYgKGMgPCAnICcpCisJCQlicmVhazsKKwkJaWYgKGMgPj0gMHg3ZikKKwkJCWJyZWFrOworCQlzKys7CisJfQorCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCWRzdCA9IHVuaWNvZGVfY29udl90b19wcmludGFibGUoc3RhdHMsIHN0cik7CisjZWxzZQorCXsKKwkJY2hhciAqZCA9IGRzdCA9IHhzdHJkdXAoc3RyKTsKKwkJd2hpbGUgKDEpIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICpkOworCQkJaWYgKGMgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCWlmIChjIDwgJyAnIHx8IGMgPj0gMHg3ZikKKwkJCQkqZCA9ICc/JzsKKwkJCWQrKzsKKwkJfQorCQlpZiAoc3RhdHMpIHsKKwkJCXN0YXRzLT5ieXRlX2NvdW50ID0gKGQgLSBkc3QpOworCQkJc3RhdHMtPnVuaWNvZGVfY291bnQgPSAoZCAtIGRzdCk7CisJCQlzdGF0cy0+dW5pY29kZV93aWR0aCA9IChkIC0gZHN0KTsKKwkJfQorCX0KKyNlbmRpZgorCisJZnJlZShzYXZlZFtjdXJfc2F2ZWRdKTsKKwlzYXZlZFtjdXJfc2F2ZWRdID0gZHN0OworCWN1cl9zYXZlZCA9IChjdXJfc2F2ZWQgKyAxKSAmIChBUlJBWV9TSVpFKHNhdmVkKS0xKTsKKworCXJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDZlY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UuYwpAQCAtMCwwICsxLDExMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIE1hbnVlbCBOb3ZvYSBJSUkgPG1qbjNAY29kZXBvZXQub3JnPgorICogYW5kIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIFdBTlRfSEVYX0VTQ0FQRVMgMQorCisvKiBVc3VhbCAidGhpcyBvbmx5IHdvcmtzIGZvciBhc2NpaSBjb21wYXRpYmxlIGVuY29kaW5ncyIgZGlzY2xhaW1lci4gKi8KKyN1bmRlZiBfdG9sb3dlcgorI2RlZmluZSBfdG9sb3dlcihYKSAoKFgpfCgoY2hhcikgMHgyMCkpCisKK2NoYXIgRkFTVF9GVU5DIGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKGNvbnN0IGNoYXIgKipwdHIpCit7CisJY29uc3QgY2hhciAqcTsKKwl1bnNpZ25lZCBudW1fZGlnaXRzOworCXVuc2lnbmVkIG47CisJdW5zaWduZWQgYmFzZTsKKworCW51bV9kaWdpdHMgPSBuID0gMDsKKwliYXNlID0gODsKKwlxID0gKnB0cjsKKworCWlmIChXQU5UX0hFWF9FU0NBUEVTICYmICpxID09ICd4JykgeworCQkrK3E7CisJCWJhc2UgPSAxNjsKKwkJKytudW1fZGlnaXRzOworCX0KKworCS8qIGJhc2ggcmVxdWlyZXMgbGVhZGluZyAwIGluIG9jdGFsIGVzY2FwZXM6CisJICogXDAyIHdvcmtzLCBcMiBkb2VzIG5vdCAocHJpbnRzIFwgYW5kIDIpLgorCSAqIFdlIHRyZWF0IFwyIGFzIGEgdmFsaWQgb2N0YWwgZXNjYXBlIHNlcXVlbmNlLiAqLworCWRvIHsKKwkJdW5zaWduZWQgcjsKKyNpZiAhV0FOVF9IRVhfRVNDQVBFUworCQl1bnNpZ25lZCBkID0gKHVuc2lnbmVkIGNoYXIpKCpxKSAtICcwJzsKKyNlbHNlCisJCXVuc2lnbmVkIGQgPSAodW5zaWduZWQgY2hhcilfdG9sb3dlcigqcSkgLSAnMCc7CisJCWlmIChkID49IDEwKQorCQkJZCArPSAoJzAnIC0gJ2EnICsgMTApOworI2VuZGlmCisJCWlmIChkID49IGJhc2UpIHsKKwkJCWlmIChXQU5UX0hFWF9FU0NBUEVTICYmIGJhc2UgPT0gMTYpIHsKKwkJCQktLW51bV9kaWdpdHM7CisJCQkJaWYgKG51bV9kaWdpdHMgPT0gMCkgeworCQkJCQkvKiBceDxiYWRfY2hhcj46IHJldHVybiAnXCcsCisJCQkJCSAqIGxlYXZlIHB0ciBwb2ludGluZyB0byB4ICovCisJCQkJCXJldHVybiAnXFwnOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJciA9IG4gKiBiYXNlICsgZDsKKwkJaWYgKHIgPiBVQ0hBUl9NQVgpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJbiA9IHI7CisJCSsrcTsKKwl9IHdoaWxlICgrK251bV9kaWdpdHMgPCAzKTsKKworCWlmIChudW1fZGlnaXRzID09IDApIHsKKwkJLyogTm90IG9jdGFsIG9yIGhleCBlc2NhcGUgc2VxdWVuY2UuCisJCSAqIElzIGl0IG9uZS1sZXR0ZXIgb25lPyAqLworCisJCS8qIGJhc2ggYnVpbHRpbiAiZWNobyAtZSAnXGVjJyIgaW50ZXJwcmV0cyBcZSBhcyBFU0MsCisJCSAqIGJ1dCBjb3JldXRpbHMgIi9iaW4vZWNobyAtZSAnXGVjJyIgZG9lcyBub3QuCisJCSAqIE1hbnBhZ2VzIHRlbmQgdG8gc3VwcG9ydCBjb3JldXRpbHMgd2F5LgorCQkgKiBVcGRhdGU6IGNvcmV1dGlscyBhZGRlZCBzdXBwb3J0IGZvciBcZSBvbiAyOCBPY3QgMjAwOS4gKi8KKwkJc3RhdGljIGNvbnN0IGNoYXIgY2hhcm1hcFtdIEFMSUdOMSA9IHsKKwkJCSdhJywgICdiJywgJ2UnLCAnZicsICAnbicsICAncicsICAndCcsICAndicsICAnXFwnLCAnXDAnLAorCQkJJ1xhJywgJ1xiJywgMjcsICdcZicsICdcbicsICdccicsICdcdCcsICdcdicsICdcXCcsICdcXCcsCisJCX07CisJCWNvbnN0IGNoYXIgKnAgPSBjaGFybWFwOworCQlkbyB7CisJCQlpZiAoKnAgPT0gKnEpIHsKKwkJCQlxKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKCorK3AgIT0gJ1wwJyk7CisJCS8qIHAgcG9pbnRzIHRvIGZvdW5kIGVzY2FwZSBjaGFyIG9yIE5VTCwKKwkJICogYWR2YW5jZSBpdCBhbmQgZmluZCB3aGF0IGl0IHRyYW5zbGF0ZXMgdG8uCisJCSAqIE5vdGUgdGhhdCBcTlVMIGFuZCB1bnJlY29nbml6ZWQgc2VxdWVuY2UgXHogcmV0dXJuICdcJworCQkgKiBhbmQgbGVhdmUgcHRyIHBvaW50aW5nIHRvIE5VTCBvciB6LiAqLworCQluID0gcFtzaXplb2YoY2hhcm1hcCkgLyAyXTsKKwl9CisKKwkqcHRyID0gcTsKKworCXJldHVybiAoY2hhcikgbjsKK30KKworY2hhciogRkFTVF9GVU5DIHN0cmNweV9hbmRfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2VzKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworCXdoaWxlICgxKSB7CisJCWNoYXIgYywgYzE7CisJCWMgPSBjMSA9ICpzcmMrKzsKKwkJaWYgKGMxID09ICdcXCcpCisJCQljMSA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZzcmMpOworCQkqZHN0ID0gYzE7CisJCWlmIChjID09ICdcMCcpCisJCQlyZXR1cm4gZHN0OworCQlkc3QrKzsKKwl9Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9wcm9jcHMuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3Byb2Nwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNWRkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9wcm9jcHMuYwpAQCAtMCwwICsxLDY1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBieSBBbGJlcnQgQ2FoYWxhbjsgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKiBTRUxpbnV4IHN1cHBvcnQ6IChjKSAyMDA3IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgaWRfdG9fbmFtZV9tYXBfdCB7CisJdWlkX3QgaWQ7CisJY2hhciBuYW1lW1VTRVJOQU1FX01BWF9TSVpFXTsKK30gaWRfdG9fbmFtZV9tYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FjaGVfdCB7CisJaWRfdG9fbmFtZV9tYXBfdCAqY2FjaGU7CisJaW50IHNpemU7Cit9IGNhY2hlX3Q7CisKK3N0YXRpYyBjYWNoZV90IHVzZXJuYW1lLCBncm91cG5hbWU7CisKK3N0YXRpYyB2b2lkIGNsZWFyX2NhY2hlKGNhY2hlX3QgKmNwKQoreworCWZyZWUoY3AtPmNhY2hlKTsKKwljcC0+Y2FjaGUgPSBOVUxMOworCWNwLT5zaXplID0gMDsKK30KK3ZvaWQgRkFTVF9GVU5DIGNsZWFyX3VzZXJuYW1lX2NhY2hlKHZvaWQpCit7CisJY2xlYXJfY2FjaGUoJnVzZXJuYW1lKTsKKwljbGVhcl9jYWNoZSgmZ3JvdXBuYW1lKTsKK30KKworI2lmIDAgLyogbW9yZSBnZW5lcmljLCBidXQgd2UgZG9uJ3QgbmVlZCB0aGF0IHlldCAqLworLyogUmV0dXJucyAtTi0xIGlmIG5vdCBmb3VuZC4gKi8KKy8qIGNwLT5jYWNoZVtOXSBpcyBhbGxvY2F0ZWQgYW5kIG11c3QgYmUgZmlsbGVkIGluIHRoaXMgY2FzZSAqLworc3RhdGljIGludCBnZXRfY2FjaGVkKGNhY2hlX3QgKmNwLCB1aWRfdCBpZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgY3AtPnNpemU7IGkrKykKKwkJaWYgKGNwLT5jYWNoZVtpXS5pZCA9PSBpZCkKKwkJCXJldHVybiBpOworCWkgPSBjcC0+c2l6ZSsrOworCWNwLT5jYWNoZSA9IHhyZWFsbG9jX3ZlY3RvcihjcC0+Y2FjaGUsIDIsIGkpOworCWNwLT5jYWNoZVtpKytdLmlkID0gaWQ7CisJcmV0dXJuIC1pOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyKiBnZXRfY2FjaGVkKGNhY2hlX3QgKmNwLCB1aWRfdCBpZCwKKwkJCWNoYXIqIEZBU1RfRlVOQyB4MnhfdXRvYSh1aWRfdCBpZCkpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNwLT5zaXplOyBpKyspCisJCWlmIChjcC0+Y2FjaGVbaV0uaWQgPT0gaWQpCisJCQlyZXR1cm4gY3AtPmNhY2hlW2ldLm5hbWU7CisJaSA9IGNwLT5zaXplKys7CisJY3AtPmNhY2hlID0geHJlYWxsb2NfdmVjdG9yKGNwLT5jYWNoZSwgMiwgaSk7CisJY3AtPmNhY2hlW2ldLmlkID0gaWQ7CisJLyogTmV2ZXIgZmFpbHMuIEdlbmVyYXRlcyBudW1lcmljIHN0cmluZyBpZiBuYW1lIGlzbid0IGZvdW5kICovCisJc2FmZV9zdHJuY3B5KGNwLT5jYWNoZVtpXS5uYW1lLCB4MnhfdXRvYShpZCksIHNpemVvZihjcC0+Y2FjaGVbaV0ubmFtZSkpOworCXJldHVybiBjcC0+Y2FjaGVbaV0ubmFtZTsKK30KK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBnZXRfY2FjaGVkX3VzZXJuYW1lKHVpZF90IHVpZCkKK3sKKwlyZXR1cm4gZ2V0X2NhY2hlZCgmdXNlcm5hbWUsIHVpZCwgdWlkMnVuYW1lX3V0b2EpOworfQorY29uc3QgY2hhciogRkFTVF9GVU5DIGdldF9jYWNoZWRfZ3JvdXBuYW1lKGdpZF90IGdpZCkKK3sKKwlyZXR1cm4gZ2V0X2NhY2hlZCgmZ3JvdXBuYW1lLCBnaWQsIGdpZDJncm91cF91dG9hKTsKK30KKworCisjZGVmaW5lIFBST0NQU19CVUZTSVpFIDEwMjQKKworc3RhdGljIGludCByZWFkX3RvX2J1Zihjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmKQoreworCWludCBmZDsKKwkvKiBvcGVuX3JlYWRfY2xvc2UoKSB3b3VsZCBkbyB0d28gcmVhZHMsIGNoZWNraW5nIGZvciBFT0YuCisJICogV2hlbiB5b3UgaGF2ZSAxMDAwMCAvcHJvYy8kTlVNL3N0YXQgdG8gcmVhZCwgaXQgaXNuJ3QgZGVzaXJhYmxlICovCisJc3NpemVfdCByZXQgPSAtMTsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPj0gMCkgeworCQlyZXQgPSByZWFkKGZkLCBidWYsIFBST0NQU19CVUZTSVpFLTEpOworCQljbG9zZShmZCk7CisJfQorCSgoY2hhciAqKWJ1ZilbcmV0ID4gMCA/IHJldCA6IDBdID0gJ1wwJzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgcHJvY3BzX3N0YXR1c190KiBGQVNUX0ZVTkMgYWxsb2NfcHJvY3BzX3NjYW4odm9pZCkKK3sKKwl1bnNpZ25lZCBuID0gZ2V0cGFnZXNpemUoKTsKKwlwcm9jcHNfc3RhdHVzX3QqIHNwID0geHphbGxvYyhzaXplb2YocHJvY3BzX3N0YXR1c190KSk7CisJc3AtPmRpciA9IHhvcGVuZGlyKCIvcHJvYyIpOworCXdoaWxlICgxKSB7CisJCW4gPj49IDE7CisJCWlmICghbikgYnJlYWs7CisJCXNwLT5zaGlmdF9wYWdlc190b19ieXRlcysrOworCX0KKwlzcC0+c2hpZnRfcGFnZXNfdG9fa2IgPSBzcC0+c2hpZnRfcGFnZXNfdG9fYnl0ZXMgLSAxMDsKKwlyZXR1cm4gc3A7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGZyZWVfcHJvY3BzX3NjYW4ocHJvY3BzX3N0YXR1c190KiBzcCkKK3sKKwljbG9zZWRpcihzcC0+ZGlyKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMKKwlpZiAoc3AtPnRhc2tfZGlyKQorCQljbG9zZWRpcihzcC0+dGFza19kaXIpOworI2VuZGlmCisJZnJlZShzcC0+YXJndjApOworCWZyZWUoc3AtPmV4ZSk7CisJSUZfU0VMSU5VWChmcmVlKHNwLT5jb250ZXh0KTspCisJZnJlZShzcCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0gfHwgRU5BQkxFX1BNQVAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZhc3Rfc3RydG91bF8xNihjaGFyICoqZW5kcHRyKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwljaGFyICpzdHIgPSAqZW5kcHRyOworCXVuc2lnbmVkIGxvbmcgbiA9IDA7CisKKwl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICcgJykgeworCQljID0gKChjfDB4MjApIC0gJzAnKTsKKwkJaWYgKGMgPiA5KQorCQkJLy8gYyA9IGMgKyAnMCcgLSAnYScgKyAxMDoKKwkJCWMgPSBjIC0gKCdhJyAtICcwJyAtIDEwKTsKKwkJbiA9IG4qMTYgKyBjOworCX0KKwkqZW5kcHRyID0gc3RyOyAvKiBXZSBza2lwIHRyYWlsaW5nIHNwYWNlISAqLworCXJldHVybiBuOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQVNUX1RPUCB8fCBFTkFCTEVfRkVBVFVSRV9UT1BNRU0gfHwgRU5BQkxFX1BNQVAKKy8qIFdlIGN1dCBhIGxvdCBvZiBjb3JuZXJzIGhlcmUgZm9yIHNwZWVkICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmYXN0X3N0cnRvdWxfMTAoY2hhciAqKmVuZHB0cikKK3sKKwljaGFyIGM7CisJY2hhciAqc3RyID0gKmVuZHB0cjsKKwl1bnNpZ25lZCBsb25nIG4gPSAqc3RyIC0gJzAnOworCisJd2hpbGUgKChjID0gKisrc3RyKSAhPSAnICcpCisJCW4gPSBuKjEwICsgKGMgLSAnMCcpOworCisJKmVuZHB0ciA9IHN0ciArIDE7IC8qIFdlIHNraXAgdHJhaWxpbmcgc3BhY2UhICovCisJcmV0dXJuIG47Cit9CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRkFTVF9UT1AKK3N0YXRpYyBsb25nIGZhc3Rfc3RydG9sXzEwKGNoYXIgKiplbmRwdHIpCit7CisJaWYgKCoqZW5kcHRyICE9ICctJykKKwkJcmV0dXJuIGZhc3Rfc3RydG91bF8xMChlbmRwdHIpOworCisJKCplbmRwdHIpKys7CisJcmV0dXJuIC0gKGxvbmcpZmFzdF9zdHJ0b3VsXzEwKGVuZHB0cik7Cit9CisjIGVuZGlmCisKK3N0YXRpYyBjaGFyICpza2lwX2ZpZWxkcyhjaGFyICpzdHIsIGludCBjb3VudCkKK3sKKwlkbyB7CisJCXdoaWxlICgqc3RyKysgIT0gJyAnKQorCQkJY29udGludWU7CisJCS8qIHdlIGZvdW5kIGEgc3BhY2UgY2hhciwgc3RyIHBvaW50cyBhZnRlciBpdCAqLworCX0gd2hpbGUgKC0tY291bnQpOworCXJldHVybiBzdHI7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTSB8fCBFTkFCTEVfUE1BUAoraW50IEZBU1RfRlVOQyBwcm9jcHNfcmVhZF9zbWFwcyhwaWRfdCBwaWQsIHN0cnVjdCBzbWFwcmVjICp0b3RhbCwKKwkJICAgICAgdm9pZCAoKmNiKShzdHJ1Y3Qgc21hcHJlYyAqLCB2b2lkICopLCB2b2lkICpkYXRhKQoreworCUZJTEUgKmZpbGU7CisJc3RydWN0IHNtYXByZWMgY3VycmVjOworCWNoYXIgZmlsZW5hbWVbc2l6ZW9mKCIvcHJvYy8ldS9zbWFwcyIpICsgc2l6ZW9mKGludCkqM107CisJY2hhciBidWZbUFJPQ1BTX0JVRlNJWkVdOworI2lmICFFTkFCTEVfUE1BUAorCXZvaWQgKCpjYikoc3RydWN0IHNtYXByZWMgKiwgdm9pZCAqKSA9IE5VTEw7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisjZW5kaWYKKworCXNwcmludGYoZmlsZW5hbWUsICIvcHJvYy8ldS9zbWFwcyIsIChpbnQpcGlkKTsKKworCWZpbGUgPSBmb3Blbl9mb3JfcmVhZChmaWxlbmFtZSk7CisJaWYgKCFmaWxlKQorCQlyZXR1cm4gMTsKKworCW1lbXNldCgmY3VycmVjLCAwLCBzaXplb2YoY3VycmVjKSk7CisJd2hpbGUgKGZnZXRzKGJ1ZiwgUFJPQ1BTX0JVRlNJWkUsIGZpbGUpKSB7CisJCS8vIEVhY2ggbWFwcGluZyBkYXR1bSBoYXMgdGhpcyBmb3JtOgorCQkvLyBmN2QyOTAwMC1mN2QzOTAwMCBydy1zIEFEUiBNOm0gT0ZTIEZJTEUKKwkJLy8gU2l6ZTogICAgICAgICAgICAgICAgbm5uIGtCCisJCS8vIFJzczogICAgICAgICAgICAgICAgIG5ubiBrQgorCQkvLyAuLi4uLgorCisJCWNoYXIgKnRwID0gYnVmLCAqcDsKKworI2RlZmluZSBTQ0FOKFMsIFgpIFwKKwkJaWYgKHN0cm5jbXAodHAsIFMsIHNpemVvZihTKS0xKSA9PSAwKSB7ICAgICAgICAgICAgICBcCisJCQl0cCA9IHNraXBfd2hpdGVzcGFjZSh0cCArIHNpemVvZihTKS0xKTsgICAgICBcCisJCQl0b3RhbC0+WCArPSBjdXJyZWMuWCA9IGZhc3Rfc3RydG91bF8xMCgmdHApOyBcCisJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0KKwkJaWYgKGNiKSB7CisJCQlTQ0FOKCJQc3M6IiAgLCBzbWFwX3BzcyAgICAgKTsKKwkJCVNDQU4oIlN3YXA6IiAsIHNtYXBfc3dhcCAgICApOworCQl9CisJCVNDQU4oIlByaXZhdGVfRGlydHk6IiwgcHJpdmF0ZV9kaXJ0eSk7CisJCVNDQU4oIlByaXZhdGVfQ2xlYW46IiwgcHJpdmF0ZV9jbGVhbik7CisJCVNDQU4oIlNoYXJlZF9EaXJ0eToiICwgc2hhcmVkX2RpcnR5ICk7CisJCVNDQU4oIlNoYXJlZF9DbGVhbjoiICwgc2hhcmVkX2NsZWFuICk7CisjdW5kZWYgU0NBTgorCQl0cCA9IHN0cmNocihidWYsICctJyk7CisJCWlmICh0cCkgeworCQkJLy8gV2UgcmVhY2hlZCBuZXh0IG1hcHBpbmcgLSB0aGUgbGluZSBvZiB0aGlzIGZvcm06CisJCQkvLyBmN2QyOTAwMC1mN2QzOTAwMCBydy1zIEFEUiBNOm0gT0ZTIEZJTEUKKworCQkJaWYgKGNiKSB7CisJCQkJLyogSWYgd2UgaGF2ZSBhIHByZXZpb3VzIHJlY29yZCwgdGhlcmUncyBub3RoaW5nIG1vcmUKKwkJCQkgKiBmb3IgaXQsIGNhbGwgdGhlIGNhbGxiYWNrIGFuZCBjbGVhciBjdXJyZWMKKwkJCQkgKi8KKwkJCQlpZiAoY3VycmVjLnNtYXBfc2l6ZSkKKwkJCQkJY2IoJmN1cnJlYywgZGF0YSk7CisJCQkJZnJlZShjdXJyZWMuc21hcF9uYW1lKTsKKwkJCX0KKwkJCW1lbXNldCgmY3VycmVjLCAwLCBzaXplb2YoY3VycmVjKSk7CisKKwkJCSp0cCA9ICcgJzsKKwkJCXRwID0gYnVmOworCQkJY3VycmVjLnNtYXBfc3RhcnQgPSBmYXN0X3N0cnRvdWxfMTYoJnRwKTsKKwkJCWN1cnJlYy5zbWFwX3NpemUgPSAoZmFzdF9zdHJ0b3VsXzE2KCZ0cCkgLSBjdXJyZWMuc21hcF9zdGFydCkgPj4gMTA7CisKKwkJCXN0cm5jcHkoY3VycmVjLnNtYXBfbW9kZSwgdHAsIHNpemVvZihjdXJyZWMuc21hcF9tb2RlKS0xKTsKKworCQkJLy8gc2tpcHBpbmcgInJ3LXMgQURSIE06bSBPRlMgIgorCQkJdHAgPSBza2lwX3doaXRlc3BhY2Uoc2tpcF9maWVsZHModHAsIDQpKTsKKwkJCS8vIGZpbHRlciBvdXQgL2Rldi9zb21ldGhpbmcgKHNvbWV0aGluZyAhPSB6ZXJvKQorCQkJaWYgKHN0cm5jbXAodHAsICIvZGV2LyIsIDUpICE9IDAgfHwgc3RyY21wKHRwLCAiL2Rldi96ZXJvXG4iKSA9PSAwKSB7CisJCQkJaWYgKGN1cnJlYy5zbWFwX21vZGVbMV0gPT0gJ3cnKSB7CisJCQkJCWN1cnJlYy5tYXBwZWRfcncgPSBjdXJyZWMuc21hcF9zaXplOworCQkJCQl0b3RhbC0+bWFwcGVkX3J3ICs9IGN1cnJlYy5zbWFwX3NpemU7CisJCQkJfSBlbHNlIGlmIChjdXJyZWMuc21hcF9tb2RlWzFdID09ICctJykgeworCQkJCQljdXJyZWMubWFwcGVkX3JvID0gY3VycmVjLnNtYXBfc2l6ZTsKKwkJCQkJdG90YWwtPm1hcHBlZF9ybyArPSBjdXJyZWMuc21hcF9zaXplOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHN0cmNtcCh0cCwgIltzdGFja11cbiIpID09IDApCisJCQkJdG90YWwtPnN0YWNrICs9IGN1cnJlYy5zbWFwX3NpemU7CisJCQlpZiAoY2IpIHsKKwkJCQlwID0gc2tpcF9ub25fd2hpdGVzcGFjZSh0cCk7CisJCQkJaWYgKHAgPT0gdHApIHsKKwkJCQkJY3VycmVjLnNtYXBfbmFtZSA9IHhzdHJkdXAoIiAgWyBhbm9uIF0iKTsKKwkJCQl9IGVsc2UgeworCQkJCQkqcCA9ICdcMCc7CisJCQkJCWN1cnJlYy5zbWFwX25hbWUgPSB4c3RyZHVwKHRwKTsKKwkJCQl9CisJCQl9CisJCQl0b3RhbC0+c21hcF9zaXplICs9IGN1cnJlYy5zbWFwX3NpemU7CisJCX0KKwl9CisJZmNsb3NlKGZpbGUpOworCisJaWYgKGNiKSB7CisJCWlmIChjdXJyZWMuc21hcF9zaXplKQorCQkJY2IoJmN1cnJlYywgZGF0YSk7CisJCWZyZWUoY3VycmVjLnNtYXBfbmFtZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwordm9pZCBCVUdfY29tbV9zaXplKHZvaWQpOworcHJvY3BzX3N0YXR1c190KiBGQVNUX0ZVTkMgcHJvY3BzX3NjYW4ocHJvY3BzX3N0YXR1c190KiBzcCwgaW50IGZsYWdzKQoreworCWlmICghc3ApCisJCXNwID0gYWxsb2NfcHJvY3BzX3NjYW4oKTsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IGRpcmVudCAqZW50cnk7CisJCWNoYXIgYnVmW1BST0NQU19CVUZTSVpFXTsKKwkJbG9uZyB0YXNrbmljZTsKKwkJdW5zaWduZWQgcGlkOworCQlpbnQgbjsKKwkJY2hhciBmaWxlbmFtZVtzaXplb2YoIi9wcm9jLyV1L3Rhc2svJXUvY21kbGluZSIpICsgc2l6ZW9mKGludCkqMyAqIDJdOworCQljaGFyICpmaWxlbmFtZV90YWlsOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTCisJCWlmIChzcC0+dGFza19kaXIpIHsKKwkJCWVudHJ5ID0gcmVhZGRpcihzcC0+dGFza19kaXIpOworCQkJaWYgKGVudHJ5KQorCQkJCWdvdG8gZ290X2VudHJ5OworCQkJY2xvc2VkaXIoc3AtPnRhc2tfZGlyKTsKKwkJCXNwLT50YXNrX2RpciA9IE5VTEw7CisJCX0KKyNlbmRpZgorCQllbnRyeSA9IHJlYWRkaXIoc3AtPmRpcik7CisJCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCQlmcmVlX3Byb2Nwc19zY2FuKHNwKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisgSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFMoZ290X2VudHJ5OikKKwkJcGlkID0gYmJfc3RydG91KGVudHJ5LT5kX25hbWUsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKQorCQkJY29udGludWU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTCisJCWlmICgoZmxhZ3MgJiBQU1NDQU5fVEFTS1MpICYmICFzcC0+dGFza19kaXIpIHsKKwkJCS8qIFdlIGZvdW5kIGFub3RoZXIgL3Byb2MvUElELiBEbyBub3QgdXNlIGl0LAorCQkJICogdGhlcmUgd2lsbCBiZSAvcHJvYy9QSUQvdGFzay9QSUQgKHNhbWUgUElEISksCisJCQkgKiBzbyBqdXN0IGdvIGFoZWFkIGFuZCBkaXZlIGludG8gL3Byb2MvUElEL3Rhc2suICovCisJCQlzcHJpbnRmKGZpbGVuYW1lLCAiL3Byb2MvJXUvdGFzayIsIHBpZCk7CisJCQkvKiBOb3RlOiBpZiBvcGVuZGlyIGZhaWxzLCB3ZSBqdXN0IGdvIHRvIG5leHQgL3Byb2MvWFhYICovCisJCQlzcC0+dGFza19kaXIgPSBvcGVuZGlyKGZpbGVuYW1lKTsKKwkJCXNwLT5tYWluX3RocmVhZF9waWQgPSBwaWQ7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisKKwkJLyogQWZ0ZXIgdGhpcyBwb2ludCB3ZSBjYW46CisJCSAqICJicmVhayI6IHN0b3AgcGFyc2luZywgcmV0dXJuIHRoZSBkYXRhCisJCSAqICJjb250aW51ZSI6IHRyeSBuZXh0IC9wcm9jL1hYWAorCQkgKi8KKworCQltZW1zZXQoJnNwLT52c3osIDAsIHNpemVvZigqc3ApIC0gb2Zmc2V0b2YocHJvY3BzX3N0YXR1c190LCB2c3opKTsKKworCQlzcC0+cGlkID0gcGlkOworCQlpZiAoIShmbGFncyAmIH5QU1NDQU5fUElEKSkKKwkJCWJyZWFrOyAvKiB3ZSBuZWVkZWQgb25seSBwaWQsIHdlIGdvdCBpdCAqLworCisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKGZsYWdzICYgUFNTQ0FOX0NPTlRFWFQpIHsKKwkJCWlmIChnZXRwaWRjb24oc3AtPnBpZCwgJnNwLT5jb250ZXh0KSA8IDApCisJCQkJc3AtPmNvbnRleHQgPSBOVUxMOworCQl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworCQlpZiAoc3AtPnRhc2tfZGlyKQorCQkJZmlsZW5hbWVfdGFpbCA9IGZpbGVuYW1lICsgc3ByaW50ZihmaWxlbmFtZSwgIi9wcm9jLyV1L3Rhc2svJXUvIiwgc3AtPm1haW5fdGhyZWFkX3BpZCwgcGlkKTsKKwkJZWxzZQorI2VuZGlmCisJCQlmaWxlbmFtZV90YWlsID0gZmlsZW5hbWUgKyBzcHJpbnRmKGZpbGVuYW1lLCAiL3Byb2MvJXUvIiwgcGlkKTsKKworCQlpZiAoZmxhZ3MgJiBQU1NDQU5fVUlER0lEKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzYjsKKwkJCWlmIChzdGF0KGZpbGVuYW1lLCAmc2IpKQorCQkJCWNvbnRpbnVlOyAvKiBwcm9jZXNzIHByb2JhYmx5IGV4aXRlZCAqLworCQkJLyogRWZmZWN0aXZlIFVJRC9HSUQsIG5vdCByZWFsICovCisJCQlzcC0+dWlkID0gc2Iuc3RfdWlkOworCQkJc3AtPmdpZCA9IHNiLnN0X2dpZDsKKwkJfQorCisJCS8qIFRoZXNlIGFyZSBhbGwgcmV0cmlldmVkIGZyb20gcHJvYy9OTi9zdGF0IGluIG9uZSBnbzogKi8KKwkJaWYgKGZsYWdzICYgKFBTU0NBTl9QUElEIHwgUFNTQ0FOX1BHSUQgfCBQU1NDQU5fU0lECisJCQl8IFBTU0NBTl9DT01NIHwgUFNTQ0FOX1NUQVRFCisJCQl8IFBTU0NBTl9WU1ogfCBQU1NDQU5fUlNTCisJCQl8IFBTU0NBTl9TVElNRSB8IFBTU0NBTl9VVElNRSB8IFBTU0NBTl9TVEFSVF9USU1FCisJCQl8IFBTU0NBTl9UVFkgfCBQU1NDQU5fTklDRQorCQkJfCBQU1NDQU5fQ1BVKQorCQkpIHsKKwkJCWNoYXIgKmNwLCAqY29tbTE7CisJCQlpbnQgdHR5OworI2lmICFFTkFCTEVfRkVBVFVSRV9GQVNUX1RPUAorCQkJdW5zaWduZWQgbG9uZyB2c3osIHJzczsKKyNlbmRpZgorCQkJLyogc2VlIHByb2MoNSkgZm9yIHNvbWUgZGV0YWlscyBvbiB0aGlzICovCisJCQlzdHJjcHkoZmlsZW5hbWVfdGFpbCwgInN0YXQiKTsKKwkJCW4gPSByZWFkX3RvX2J1ZihmaWxlbmFtZSwgYnVmKTsKKwkJCWlmIChuIDwgMCkKKwkJCQljb250aW51ZTsgLyogcHJvY2VzcyBwcm9iYWJseSBleGl0ZWQgKi8KKwkJCWNwID0gc3RycmNocihidWYsICcpJyk7IC8qIHNwbGl0IGludG8gIlBJRCAoY21kIiBhbmQgIjxyZXN0PiIgKi8KKwkJCS8qaWYgKCFjcCB8fCBjcFsxXSAhPSAnICcpCisJCQkJY29udGludWU7Ki8KKwkJCWNwWzBdID0gJ1wwJzsKKwkJCWlmIChzaXplb2Yoc3AtPmNvbW0pIDwgMTYpCisJCQkJQlVHX2NvbW1fc2l6ZSgpOworCQkJY29tbTEgPSBzdHJjaHIoYnVmLCAnKCcpOworCQkJLyppZiAoY29tbTEpKi8KKwkJCQlzYWZlX3N0cm5jcHkoc3AtPmNvbW0sIGNvbW0xICsgMSwgc2l6ZW9mKHNwLT5jb21tKSk7CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRkFTVF9UT1AKKwkJCW4gPSBzc2NhbmYoY3ArMiwKKwkJCQkiJWMgJXUgIiAgICAgICAgICAgICAgIC8qIHN0YXRlLCBwcGlkICovCisJCQkJIiV1ICV1ICVkICUqcyAiICAgICAgICAvKiBwZ2lkLCBzaWQsIHR0eSwgdHBnaWQgKi8KKwkJCQkiJSpzICUqcyAlKnMgJSpzICUqcyAiIC8qIGZsYWdzLCBtaW5fZmx0LCBjbWluX2ZsdCwgbWFqX2ZsdCwgY21hal9mbHQgKi8KKwkJCQkiJWx1ICVsdSAiICAgICAgICAgICAgIC8qIHV0aW1lLCBzdGltZSAqLworCQkJCSIlKnMgJSpzICUqcyAiICAgICAgICAgLyogY3V0aW1lLCBjc3RpbWUsIHByaW9yaXR5ICovCisJCQkJIiVsZCAiICAgICAgICAgICAgICAgICAvKiBuaWNlICovCisJCQkJIiUqcyAlKnMgIiAgICAgICAgICAgICAvKiB0aW1lb3V0LCBpdF9yZWFsX3ZhbHVlICovCisJCQkJIiVsdSAiICAgICAgICAgICAgICAgICAvKiBzdGFydF90aW1lICovCisJCQkJIiVsdSAiICAgICAgICAgICAgICAgICAvKiB2c2l6ZSAqLworCQkJCSIlbHUgIiAgICAgICAgICAgICAgICAgLyogcnNzICovCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworCQkJCSIlKnMgJSpzICUqcyAlKnMgJSpzICUqcyAiIC8qcnNzX3JsaW0sIHN0YXJ0X2NvZGUsIGVuZF9jb2RlLCBzdGFydF9zdGFjaywga3N0a19lc3AsIGtzdGtfZWlwICovCisJCQkJIiUqcyAlKnMgJSpzICUqcyAiICAgICAgICAgLypzaWduYWwsIGJsb2NrZWQsIHNpZ2lnbm9yZSwgc2lnY2F0Y2ggKi8KKwkJCQkiJSpzICUqcyAlKnMgJSpzICIgICAgICAgICAvKndjaGFuLCBuc3dhcCwgY25zd2FwLCBleGl0X3NpZ25hbCAqLworCQkJCSIlZCIgICAgICAgICAgICAgICAgICAgICAgIC8qY3B1IGxhc3Qgc2VlbiBvbiovCisjIGVuZGlmCisJCQkJLAorCQkJCXNwLT5zdGF0ZSwgJnNwLT5wcGlkLAorCQkJCSZzcC0+cGdpZCwgJnNwLT5zaWQsICZ0dHksCisJCQkJJnNwLT51dGltZSwgJnNwLT5zdGltZSwKKwkJCQkmdGFza25pY2UsCisJCQkJJnNwLT5zdGFydF90aW1lLAorCQkJCSZ2c3osCisJCQkJJnJzcworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MKKwkJCQksICZzcC0+bGFzdF9zZWVuX29uX2NwdQorIyBlbmRpZgorCQkJCSk7CisKKwkJCWlmIChuIDwgMTEpCisJCQkJY29udGludWU7IC8qIGJvZ3VzIGRhdGEsIGdldCBuZXh0IC9wcm9jL1hYWCAqLworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MKKwkJCWlmIChuIDwgMTErMTUpCisJCQkJc3AtPmxhc3Rfc2Vlbl9vbl9jcHUgPSAwOworIyBlbmRpZgorCisJCQkvKiB2c3ogaXMgaW4gYnl0ZXMgYW5kIHdlIHdhbnQga2IgKi8KKwkJCXNwLT52c3ogPSB2c3ogPj4gMTA7CisJCQkvKiB2c3ogaXMgaW4gYnl0ZXMgYnV0IHJzcyBpcyBpbiAqUEFHRVMqISBDYW4geW91IGJlbGlldmUgdGhhdD8gKi8KKwkJCXNwLT5yc3MgPSByc3MgPDwgc3AtPnNoaWZ0X3BhZ2VzX3RvX2tiOworCQkJc3AtPnR0eV9tYWpvciA9ICh0dHkgPj4gOCkgJiAweGZmZjsKKwkJCXNwLT50dHlfbWlub3IgPSAodHR5ICYgMHhmZikgfCAoKHR0eSA+PiAxMikgJiAweGZmZjAwKTsKKyNlbHNlCisvKiBUaGlzIGNvc3RzIH4xMDAgYnl0ZXMgbW9yZSBidXQgbWFrZXMgdG9wIGZhc3RlciBieSAyMCUKKyAqIElmIHlvdSBydW4gMTAwMDAgcHJvY2Vzc2VzLCB0aGlzIG1heSBiZSBpbXBvcnRhbnQgZm9yIHlvdSAqLworCQkJc3AtPnN0YXRlWzBdID0gY3BbMl07CisJCQljcCArPSA0OworCQkJc3AtPnBwaWQgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKwkJCXNwLT5wZ2lkID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQlzcC0+c2lkID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQl0dHkgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKwkJCXNwLT50dHlfbWFqb3IgPSAodHR5ID4+IDgpICYgMHhmZmY7CisJCQlzcC0+dHR5X21pbm9yID0gKHR0eSAmIDB4ZmYpIHwgKCh0dHkgPj4gMTIpICYgMHhmZmYwMCk7CisJCQljcCA9IHNraXBfZmllbGRzKGNwLCA2KTsgLyogdHBnaWQsIGZsYWdzLCBtaW5fZmx0LCBjbWluX2ZsdCwgbWFqX2ZsdCwgY21hal9mbHQgKi8KKwkJCXNwLT51dGltZSA9IGZhc3Rfc3RydG91bF8xMCgmY3ApOworCQkJc3AtPnN0aW1lID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQljcCA9IHNraXBfZmllbGRzKGNwLCAzKTsgLyogY3V0aW1lLCBjc3RpbWUsIHByaW9yaXR5ICovCisJCQl0YXNrbmljZSA9IGZhc3Rfc3RydG9sXzEwKCZjcCk7CisJCQljcCA9IHNraXBfZmllbGRzKGNwLCAyKTsgLyogdGltZW91dCwgaXRfcmVhbF92YWx1ZSAqLworCQkJc3AtPnN0YXJ0X3RpbWUgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKwkJCS8qIHZzeiBpcyBpbiBieXRlcyBhbmQgd2Ugd2FudCBrYiAqLworCQkJc3AtPnZzeiA9IGZhc3Rfc3RydG91bF8xMCgmY3ApID4+IDEwOworCQkJLyogdnN6IGlzIGluIGJ5dGVzIGJ1dCByc3MgaXMgaW4gKlBBR0VTKiEgQ2FuIHlvdSBiZWxpZXZlIHRoYXQ/ICovCisJCQlzcC0+cnNzID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCkgPDwgc3AtPnNoaWZ0X3BhZ2VzX3RvX2tiOworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MKKwkJCS8qICg2KTogcnNzX3JsaW0sIHN0YXJ0X2NvZGUsIGVuZF9jb2RlLCBzdGFydF9zdGFjaywga3N0a19lc3AsIGtzdGtfZWlwICovCisJCQkvKiAoNCk6IHNpZ25hbCwgYmxvY2tlZCwgc2lnaWdub3JlLCBzaWdjYXRjaCAqLworCQkJLyogKDQpOiB3Y2hhbiwgbnN3YXAsIGNuc3dhcCwgZXhpdF9zaWduYWwgKi8KKwkJCWNwID0gc2tpcF9maWVsZHMoY3AsIDE0KTsKKy8vRklYTUU6IGlzIGl0IHNhZmUgdG8gYXNzdW1lIHRoaXMgZmllbGQgZXhpc3RzPworCQkJc3AtPmxhc3Rfc2Vlbl9vbl9jcHUgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBGRUFUVVJFX0ZBU1RfVE9QICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMKKwkJCXNwLT5uaWNlbmVzcyA9IHRhc2tuaWNlOworI2VuZGlmCisKKwkJCWlmIChzcC0+dnN6ID09IDAgJiYgc3AtPnN0YXRlWzBdICE9ICdaJykKKwkJCQlzcC0+c3RhdGVbMV0gPSAnVyc7CisJCQllbHNlCisJCQkJc3AtPnN0YXRlWzFdID0gJyAnOworCQkJaWYgKHRhc2tuaWNlIDwgMCkKKwkJCQlzcC0+c3RhdGVbMl0gPSAnPCc7CisJCQllbHNlIGlmICh0YXNrbmljZSkgLyogPiAwICovCisJCQkJc3AtPnN0YXRlWzJdID0gJ04nOworCQkJZWxzZQorCQkJCXNwLT5zdGF0ZVsyXSA9ICcgJzsKKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNCisJCWlmIChmbGFncyAmIFBTU0NBTl9TTUFQUykKKwkJCXByb2Nwc19yZWFkX3NtYXBzKHBpZCwgJnNwLT5zbWFwcywgTlVMTCwgTlVMTCk7CisjZW5kaWYgLyogVE9QTUVNICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TCisJCWlmIChmbGFncyAmIFBTU0NBTl9SVUlER0lEKSB7CisJCQlGSUxFICpmaWxlOworCisJCQlzdHJjcHkoZmlsZW5hbWVfdGFpbCwgInN0YXR1cyIpOworCQkJZmlsZSA9IGZvcGVuX2Zvcl9yZWFkKGZpbGVuYW1lKTsKKwkJCWlmIChmaWxlKSB7CisJCQkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZpbGUpKSB7CisJCQkJCWNoYXIgKnRwOworI2RlZmluZSBTQ0FOX1RXTyhzdHIsIG5hbWUsIHN0YXRlbWVudCkgXAorCWlmIChzdHJuY21wKGJ1Ziwgc3RyLCBzaXplb2Yoc3RyKS0xKSA9PSAwKSB7IFwKKwkJdHAgPSBza2lwX3doaXRlc3BhY2UoYnVmICsgc2l6ZW9mKHN0ciktMSk7IFwKKwkJc3NjYW5mKHRwLCAiJXUiLCAmc3AtPm5hbWUpOyBcCisJCXN0YXRlbWVudDsgXAorCX0KKwkJCQkJU0NBTl9UV08oIlVpZDoiLCBydWlkLCBjb250aW51ZSk7CisJCQkJCVNDQU5fVFdPKCJHaWQ6IiwgcmdpZCwgYnJlYWspOworI3VuZGVmIFNDQU5fVFdPCisJCQkJfQorCQkJCWZjbG9zZShmaWxlKTsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIFBTX0FERElUSU9OQUxfQ09MVU1OUyAqLworCQlpZiAoZmxhZ3MgJiBQU1NDQU5fRVhFKSB7CisJCQlzdHJjcHkoZmlsZW5hbWVfdGFpbCwgImV4ZSIpOworCQkJZnJlZShzcC0+ZXhlKTsKKwkJCXNwLT5leGUgPSB4bWFsbG9jX3JlYWRsaW5rKGZpbGVuYW1lKTsKKwkJfQorCQkvKiBOb3RlOiBpZiAvcHJvYy9QSUQvY21kbGluZSBpcyBlbXB0eSwKKwkJICogY29kZSBiZWxvdyAiYnJlYWtzIi4gVGhlcmVmb3JlIGl0IG11c3QgYmUKKwkJICogdGhlIGxhc3QgY29kZSB0byBwYXJzZSAvcHJvYy9QSUQveHh4IGRhdGEKKwkJICogKHdlIHVzZWQgdG8gaGF2ZSAvcHJvYy9QSUQvZXhlIHBhcnNpbmcgYWZ0ZXIgaXQKKwkJICogYW5kIHdlcmUgZ2V0dGluZyBzdGFsZSBzcC0+ZXhlKS4KKwkJICovCisjaWYgMCAvKiBQU1NDQU5fQ01EIGlzIG5vdCB1c2VkICovCisJCWlmIChmbGFncyAmIChQU1NDQU5fQ01EfFBTU0NBTl9BUkdWMCkpIHsKKwkJCWZyZWUoc3AtPmFyZ3YwKTsKKwkJCXNwLT5hcmd2MCA9IE5VTEw7CisJCQlmcmVlKHNwLT5jbWQpOworCQkJc3AtPmNtZCA9IE5VTEw7CisJCQlzdHJjcHkoZmlsZW5hbWVfdGFpbCwgImNtZGxpbmUiKTsKKwkJCS8qIFRPRE86IHRvIGdldCByaWQgb2Ygc2l6ZSBsaW1pdHMsIHJlYWQgaW50byBtYWxsb2MgYnVmLAorCQkJICogdGhlbiByZWFsbG9jIGl0IGRvd24gdG8gcmVhbCBzaXplLiAqLworCQkJbiA9IHJlYWRfdG9fYnVmKGZpbGVuYW1lLCBidWYpOworCQkJaWYgKG4gPD0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChmbGFncyAmIFBTU0NBTl9BUkdWMCkKKwkJCQlzcC0+YXJndjAgPSB4c3RyZHVwKGJ1Zik7CisJCQlpZiAoZmxhZ3MgJiBQU1NDQU5fQ01EKSB7CisJCQkJZG8geworCQkJCQluLS07CisJCQkJCWlmICgodW5zaWduZWQgY2hhcikoYnVmW25dKSA8ICcgJykKKwkJCQkJCWJ1ZltuXSA9ICcgJzsKKwkJCQl9IHdoaWxlIChuKTsKKwkJCQlzcC0+Y21kID0geHN0cmR1cChidWYpOworCQkJfQorCQl9CisjZWxzZQorCQlpZiAoZmxhZ3MgJiAoUFNTQ0FOX0FSR1YwfFBTU0NBTl9BUkdWTikpIHsKKwkJCWZyZWUoc3AtPmFyZ3YwKTsKKwkJCXNwLT5hcmd2MCA9IE5VTEw7CisJCQlzdHJjcHkoZmlsZW5hbWVfdGFpbCwgImNtZGxpbmUiKTsKKwkJCW4gPSByZWFkX3RvX2J1ZihmaWxlbmFtZSwgYnVmKTsKKwkJCWlmIChuIDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZmxhZ3MgJiBQU1NDQU5fQVJHVk4pIHsKKwkJCQlzcC0+YXJndl9sZW4gPSBuOworCQkJCXNwLT5hcmd2MCA9IHhtYWxsb2MobiArIDEpOworCQkJCW1lbWNweShzcC0+YXJndjAsIGJ1ZiwgbiArIDEpOworCQkJCS8qIHNwLT5hcmd2MFtuXSA9ICdcMCc7IC0gYnVmIGhhcyBpdCAqLworCQkJfSBlbHNlIHsKKwkJCQlzcC0+YXJndl9sZW4gPSAwOworCQkJCXNwLT5hcmd2MCA9IHhzdHJkdXAoYnVmKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWJyZWFrOworCX0gLyogZm9yICg7OykgKi8KKworCXJldHVybiBzcDsKK30KKwordm9pZCBGQVNUX0ZVTkMgcmVhZF9jbWRsaW5lKGNoYXIgKmJ1ZiwgaW50IGNvbCwgdW5zaWduZWQgcGlkLCBjb25zdCBjaGFyICpjb21tKQoreworCWludCBzejsKKwljaGFyIGZpbGVuYW1lW3NpemVvZigiL3Byb2MvJXUvY21kbGluZSIpICsgc2l6ZW9mKGludCkqM107CisKKwlzcHJpbnRmKGZpbGVuYW1lLCAiL3Byb2MvJXUvY21kbGluZSIsIHBpZCk7CisJc3ogPSBvcGVuX3JlYWRfY2xvc2UoZmlsZW5hbWUsIGJ1ZiwgY29sIC0gMSk7CisJaWYgKHN6ID4gMCkgeworCQljb25zdCBjaGFyICpiYXNlOworCQlpbnQgY29tbV9sZW47CisKKwkJYnVmW3N6XSA9ICdcMCc7CisJCXdoaWxlICgtLXN6ID49IDAgJiYgYnVmW3N6XSA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWJhc2UgPSBiYl9iYXNlbmFtZShidWYpOyAvKiBiZWZvcmUgd2UgcmVwbGFjZSBhcmd2MCdzIE5VTCB3aXRoIHNwYWNlICovCisJCXdoaWxlIChzeiA+PSAwKSB7CisJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKGJ1Zltzel0pIDwgJyAnKQorCQkJCWJ1Zltzel0gPSAnICc7CisJCQlzei0tOworCQl9CisKKwkJLyogSWYgY29tbSBkaWZmZXJzIGZyb20gYXJndjAsIHByZXBlbmQgIntjb21tfSAiLgorCQkgKiBJdCBhbGxvd3MgdG8gc2VlIHRocmVhZCBuYW1lcyBzZXQgYnkgcHJjdGwoUFJfU0VUX05BTUUpLgorCQkgKi8KKwkJaWYgKGJhc2VbMF0gPT0gJy0nKSAvKiAiLXNoIiAobG9naW4gc2hlbGwpPyAqLworCQkJYmFzZSsrOworCQljb21tX2xlbiA9IHN0cmxlbihjb21tKTsKKwkJLyogV2h5IGNvbXBhcmUgdXAgdG8gY29tbV9sZW4sIG5vdCBDT01NX0xFTi0xPworCQkgKiBXZWxsLCBzb21lIHByb2Nlc3NlcyByZXdyaXRlIGFyZ3YsIGFuZCB1c2UgX3NwYWNlc18gdGhlcmUKKwkJICogd2hpbGUgcmV3cml0aW5nLiAoS0RFIGlzIG9ic2VydmVkIHRvIGRvIGl0KS4KKwkJICogSSBwcmVmZXIgdG8gc3RpbGwgdHJlYXQgYXJndjAgInByb2Nlc3MgZm9vIGJhciIKKwkJICogYXMgJ2VxdWFsJyB0byBjb21tICJwcm9jZXNzIi4KKwkJICovCisJCWlmIChzdHJuY21wKGJhc2UsIGNvbW0sIGNvbW1fbGVuKSAhPSAwKSB7CisJCQljb21tX2xlbiArPSAzOworCQkJaWYgKGNvbCA+IGNvbW1fbGVuKQorCQkJCW1lbW1vdmUoYnVmICsgY29tbV9sZW4sIGJ1ZiwgY29sIC0gY29tbV9sZW4pOworCQkJc25wcmludGYoYnVmLCBjb2wsICJ7JXN9IiwgY29tbSk7CisJCQlpZiAoY29sIDw9IGNvbW1fbGVuKQorCQkJCXJldHVybjsKKwkJCWJ1Zltjb21tX2xlbiAtIDFdID0gJyAnOworCQkJYnVmW2NvbCAtIDFdID0gJ1wwJzsKKwkJfQorCisJfSBlbHNlIHsKKwkJc25wcmludGYoYnVmLCBjb2wsICJbJXNdIiwgY29tbSk7CisJfQorfQorCisvKiBmcm9tIGtlcm5lbDoKKwkvLyAgICAgICAgICAgICBwaWQgY29tbSBTIHBwaWQgcGdpZCBzaWQgdHR5X25yIHR0eV9wZ3JwIGZsZworCXNwcmludGYoYnVmZmVyLCIlZCAoJXMpICVjICVkICAlZCAgICVkICAlZCAgICAgJWQgICAgICAgJWx1ICVsdSBcCislbHUgJWx1ICVsdSAlbHUgJWx1ICVsZCAlbGQgJWxkICVsZCAlZCAwICVsbHUgJWx1ICVsZCAlbHUgJWx1ICVsdSAlbHUgJWx1IFwKKyVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWQgJWQgJWx1ICVsdSAlbGx1XG4iLAorCQl0YXNrLT5waWQsCisJCXRjb21tLAorCQlzdGF0ZSwKKwkJcHBpZCwKKwkJcGdpZCwKKwkJc2lkLAorCQl0dHlfbnIsCisJCXR0eV9wZ3JwLAorCQl0YXNrLT5mbGFncywKKwkJbWluX2ZsdCwKKwkJY21pbl9mbHQsCisJCW1hal9mbHQsCisJCWNtYWpfZmx0LAorCQljcHV0aW1lX3RvX2Nsb2NrX3QodXRpbWUpLAorCQljcHV0aW1lX3RvX2Nsb2NrX3Qoc3RpbWUpLAorCQljcHV0aW1lX3RvX2Nsb2NrX3QoY3V0aW1lKSwKKwkJY3B1dGltZV90b19jbG9ja190KGNzdGltZSksCisJCXByaW9yaXR5LAorCQluaWNlLAorCQludW1fdGhyZWFkcywKKwkJLy8gMCwKKwkJc3RhcnRfdGltZSwKKwkJdnNpemUsCisJCW1tID8gZ2V0X21tX3JzcyhtbSkgOiAwLAorCQlyc3NsaW0sCisJCW1tID8gbW0tPnN0YXJ0X2NvZGUgOiAwLAorCQltbSA/IG1tLT5lbmRfY29kZSA6IDAsCisJCW1tID8gbW0tPnN0YXJ0X3N0YWNrIDogMCwKKwkJZXNwLAorCQllaXAsCit0aGUgcmVzdCBpcyBzb21lIG9ic29sZXRlIGNydWZ0CisqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcHJvZ3Jlc3MuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3Byb2dyZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyZmViMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3Byb2dyZXNzLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFByb2dyZXNzIGJhciBjb2RlLgorICovCisvKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIHdoaWNoIGFwcGxpZXMgdG8gdGhlIENPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIHN0dWZmLAorICogbXVjaCBvZiB3aGljaCB3YXMgYmxhdGFudGx5IHN0b2xlbiBmcm9tIG9wZW5zc2guCisgKi8KKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBCU0QgQWR2ZXJ0aXNpbmcgQ2xhdXNlIG9taXR0ZWQgcGVyIHRoZSBKdWx5IDIyLCAxOTk5IGxpY2Vuc2luZyBjaGFuZ2UKKyAqICAgIGZ0cDovL2Z0cC5jcy5iZXJrZWxleS5lZHUvcHViLzRic2QvUkVBRE1FLkltcHQuTGljZW5zZS5DaGFuZ2UKKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKK2VudW0geworCS8qIFNlY29uZHMgd2hlbiB4ZmVyIGNvbnNpZGVyZWQgInN0YWxsZWQiICovCisJU1RBTExUSU1FID0gNQorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfdHR5Ml93aWR0aCh2b2lkKQoreworCXVuc2lnbmVkIHdpZHRoOworCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoMiwgJndpZHRoLCBOVUxMKTsKKwlyZXR1cm4gd2lkdGg7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX3Byb2dyZXNzX2luaXQoYmJfcHJvZ3Jlc3NfdCAqcCwgY29uc3QgY2hhciAqY3VyZmlsZSkKK3sKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJaW5pdF91bmljb2RlKCk7CisJcC0+Y3VyZmlsZSA9IHVuaWNvZGVfY29udl90b19wcmludGFibGVfZml4ZWR3aWR0aCgvKk5VTEwsKi8gY3VyZmlsZSwgMjApOworI2Vsc2UKKwlwLT5jdXJmaWxlID0gY3VyZmlsZTsKKyNlbmRpZgorCXAtPnN0YXJ0X3NlYyA9IG1vbm90b25pY19zZWMoKTsKKwlwLT5sYXN0X3VwZGF0ZV9zZWMgPSBwLT5zdGFydF9zZWM7CisJcC0+bGFzdF9jaGFuZ2Vfc2VjID0gcC0+c3RhcnRfc2VjOworCXAtPmxhc3Rfc2l6ZSA9IDA7Cit9CisKKy8qIEZpbGUgYWxyZWFkeSBoYWQgYmVnX3NpemUgYnl0ZXMuCisgKiBUaGVuIHdlIHN0YXJ0ZWQgZG93bmxvYWRpbmcuCisgKiBXZSBkb3dubG9hZGVkICJ0cmFuc2ZlcnJlZCIgYnl0ZXMgc28gZmFyLgorICogRG93bmxvYWQgaXMgZXhwZWN0ZWQgdG8gc3RvcCB3aGVuIHRvdGFsIHNpemUgKGJlZ19zaXplICsgdHJhbnNmZXJyZWQpCisgKiB3aWxsIGJlICJ0b3RhbHNpemUiIGJ5dGVzLgorICogSWYgdG90YWxzaXplID09IDAsIHRoZW4gaXQgaXMgdW5rbm93bi4KKyAqLwordm9pZCBGQVNUX0ZVTkMgYmJfcHJvZ3Jlc3NfdXBkYXRlKGJiX3Byb2dyZXNzX3QgKnAsCisJCXVvZmZfdCBiZWdfc2l6ZSwKKwkJdW9mZl90IHRyYW5zZmVycmVkLAorCQl1b2ZmX3QgdG90YWxzaXplKQoreworCXVvZmZfdCBiZWdfYW5kX3RyYW5zZmVycmVkOworCXVuc2lnbmVkIHNpbmNlX2xhc3RfdXBkYXRlLCBlbGFwc2VkOworCWludCBiYXJsZW5ndGg7CisJaW50IGtpbG9zY2FsZTsKKworCS8vdHJhbnNmZXJyZWQgPSAxMjM0OyAvKiB1c2UgZm9yIHN0YWxsIGRldGVjdGlvbiB0ZXN0aW5nICovCisJLy90b3RhbHNpemUgPSAwOyAvKiB1c2UgZm9yIHVua25vd24gc2l6ZSBkb3dubG9hZCB0ZXN0aW5nICovCisKKwllbGFwc2VkID0gbW9ub3RvbmljX3NlYygpOworCXNpbmNlX2xhc3RfdXBkYXRlID0gZWxhcHNlZCAtIHAtPmxhc3RfdXBkYXRlX3NlYzsKKwlwLT5sYXN0X3VwZGF0ZV9zZWMgPSBlbGFwc2VkOworCisJaWYgKHRvdGFsc2l6ZSAhPSAwICYmIHRyYW5zZmVycmVkID49IHRvdGFsc2l6ZSAtIGJlZ19zaXplKSB7CisJCS8qIExhc3QgY2FsbC4gRG8gbm90IHNraXAgdGhpcyB1cGRhdGUgKi8KKwkJdHJhbnNmZXJyZWQgPSB0b3RhbHNpemUgLSBiZWdfc2l6ZTsgLyogc2FuaXRpemUganVzdCBpbiBjYXNlICovCisJfQorCWVsc2UgaWYgKHNpbmNlX2xhc3RfdXBkYXRlID09IDApIHsKKwkJLyoKKwkJICogRG8gbm90IHVwZGF0ZSBvbiBldmVyeSBjYWxsCisJCSAqICh3ZSBjYW4gYmUgY2FsbGVkIG9uIGV2ZXJ5IG5ldHdvcmsgcmVhZCEpCisJCSAqLworCQlyZXR1cm47CisJfQorCisJa2lsb3NjYWxlID0gMDsKKwkvKgorCSAqIFNjYWxlIHNpemVzIGRvd24gaWYgdGhleSBhcmUgY2xvc2UgdG8gb3ZlcmZsb3dpbmcuCisJICogVGhpcyBhbGxvd3MgY2FsY3VsYXRpb25zIGxpa2UgKDEwMCAqIHRyYW5zZmVycmVkIC8gdG90YWxzaXplKQorCSAqIHdpdGhvdXQgcmlza2luZyBvdmVyZmxvdzogd2UgZ3VhcmFudGVlIDEwIGhpZ2hlc3QgYml0cyB0byBiZSAwLgorCSAqIEludHJvZHVjZWQgZXJyb3IgaXMgbGVzcyB0aGFuIDEgLyAyXjEyIH49IDAuMDI1JQorCSAqLworCWlmIChVTE9OR19NQVggPiAweGZmZmZmZmZmIHx8IHNpemVvZihvZmZfdCkgPT0gNCB8fCBzaXplb2Yob2ZmX3QpICE9IDgpIHsKKwkJLyoKKwkJICogNjQtYml0IENQVSB8fCBzbWFsbCBvZmZfdDogaW4gZWl0aGVyIGNhc2UsCisJCSAqID4+IGlzIGNoZWFwLCBzaW5nbGUtd29yZCBvcGVyYXRpb24uCisJCSAqIC4uLiB8fCBzdHJhbmdlIG9mZl90OiBhbHNvIHVzZSB0aGlzIGNvZGUKKwkJICogKGl0IGlzIHNhZmUsIGp1c3Qgc3Vib3B0aW1hbCB3cnQgY29kZSBzaXplKSwKKwkJICogYmVjYXVzZSAzMi82NCBvcHRpbWl6ZWQgb25lIHdvcmtzIG9ubHkgZm9yIDY0LWJpdCBvZmZfdC4KKwkJICovCisJCWlmICh0b3RhbHNpemUgPj0gKDEgPDwgMjIpKSB7CisJCQl0b3RhbHNpemUgPj49IDEwOworCQkJYmVnX3NpemUgPj49IDEwOworCQkJdHJhbnNmZXJyZWQgPj49IDEwOworCQkJa2lsb3NjYWxlID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIDMyLWJpdCBDUFUgYW5kIDY0LWJpdCBvZmZfdC4KKwkJICogVXNlIGEgNDAtYml0IHNoaWZ0LCBpdCBpcyBlYXNpZXIgdG8gZG8gb24gMzItYml0IENQVS4KKwkJICovCisvKiBPTkUgc3VwcHJlc3NlcyAid2FybmluZzogc2hpZnQgY291bnQgPj0gd2lkdGggb2YgdHlwZSIgKi8KKyNkZWZpbmUgT05FIChzaXplb2Yob2ZmX3QpID4gNCkKKwkJaWYgKHRvdGFsc2l6ZSA+PSAodW9mZl90KSgxVUxMIDw8IDU0Kk9ORSkpIHsKKwkJCXRvdGFsc2l6ZSA9ICh1aW50MzJfdCkodG90YWxzaXplID4+IDMyKk9ORSkgPj4gODsKKwkJCWJlZ19zaXplID0gKHVpbnQzMl90KShiZWdfc2l6ZSA+PiAzMipPTkUpID4+IDg7CisJCQl0cmFuc2ZlcnJlZCA9ICh1aW50MzJfdCkodHJhbnNmZXJyZWQgPj4gMzIqT05FKSA+PiA4OworCQkJa2lsb3NjYWxlID0gNDsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfVU5JQ09ERV9TVVBQT1JUKQorCQlmcHJpbnRmKHN0ZGVyciwgIlxyJXMiLCBwLT5jdXJmaWxlKTsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiXHIlLTIwLjIwcyIsIHAtPmN1cmZpbGUpOworCisJYmVnX2FuZF90cmFuc2ZlcnJlZCA9IGJlZ19zaXplICsgdHJhbnNmZXJyZWQ7CisKKwlpZiAodG90YWxzaXplICE9IDApIHsKKwkJdW5zaWduZWQgcmF0aW8gPSAxMDAgKiBiZWdfYW5kX3RyYW5zZmVycmVkIC8gdG90YWxzaXplOworCQlmcHJpbnRmKHN0ZGVyciwgIiU0dSUlIiwgcmF0aW8pOworCisJCWJhcmxlbmd0aCA9IGdldF90dHkyX3dpZHRoKCkgLSA0OTsKKwkJaWYgKGJhcmxlbmd0aCA+IDApIHsKKwkJCS8qIGdvZCBibGVzcyBnY2MgZm9yIHZhcmlhYmxlIGFycmF5cyA6KSAqLworCQkJY2hhciBidWZbYmFybGVuZ3RoICsgMV07CisJCQl1bnNpZ25lZCBzdGFycyA9ICh1bnNpZ25lZCliYXJsZW5ndGggKiBiZWdfYW5kX3RyYW5zZmVycmVkIC8gdG90YWxzaXplOworCQkJbWVtc2V0KGJ1ZiwgJyAnLCBiYXJsZW5ndGgpOworCQkJYnVmW2Jhcmxlbmd0aF0gPSAnXDAnOworCQkJbWVtc2V0KGJ1ZiwgJyonLCBzdGFycyk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiB8JXN8IiwgYnVmKTsKKwkJfQorCX0KKworCXdoaWxlIChiZWdfYW5kX3RyYW5zZmVycmVkID49IDEwMDAwMCkgeworCQliZWdfYW5kX3RyYW5zZmVycmVkID4+PSAxMDsKKwkJa2lsb3NjYWxlKys7CisJfQorCS8qIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RlcmEgKi8KKwlmcHJpbnRmKHN0ZGVyciwgIiU2dSVjIiwgKHVuc2lnbmVkKWJlZ19hbmRfdHJhbnNmZXJyZWQsICIga01HVFBFWlkiW2tpbG9zY2FsZV0pOworI2RlZmluZSBiZWdfYW5kX3RyYW5zZmVycmVkIGRvbnRfdXNlX2JlZ19hbmRfdHJhbnNmZXJyZWRfYmVsb3coKQorCisJc2luY2VfbGFzdF91cGRhdGUgPSBlbGFwc2VkIC0gcC0+bGFzdF9jaGFuZ2Vfc2VjOworCWlmICgodW5zaWduZWQpdHJhbnNmZXJyZWQgIT0gcC0+bGFzdF9zaXplKSB7CisJCXAtPmxhc3RfY2hhbmdlX3NlYyA9IGVsYXBzZWQ7CisJCXAtPmxhc3Rfc2l6ZSA9ICh1bnNpZ25lZCl0cmFuc2ZlcnJlZDsKKwkJaWYgKHNpbmNlX2xhc3RfdXBkYXRlID49IFNUQUxMVElNRSkgeworCQkJLyogV2UgImN1dCBvdXQiIHRoZXNlIHNlY29uZHMgZnJvbSBlbGFwc2VkIHRpbWUKKwkJCSAqIGJ5IGFkanVzdGluZyBzdGFydCB0aW1lICovCisJCQlwLT5zdGFydF9zZWMgKz0gc2luY2VfbGFzdF91cGRhdGU7CisJCX0KKwkJc2luY2VfbGFzdF91cGRhdGUgPSAwOyAvKiB3ZSBhcmUgdW4tc3RhbGxlZCBub3cgKi8KKwl9CisKKwllbGFwc2VkIC09IHAtPnN0YXJ0X3NlYzsgLyogbm93IGl0J3MgImVsYXBzZWQgc2luY2Ugc3RhcnQiICovCisKKwlpZiAoc2luY2VfbGFzdF91cGRhdGUgPj0gU1RBTExUSU1FKSB7CisJCWZwcmludGYoc3RkZXJyLCAiICAtIHN0YWxsZWQgLSIpOworCX0gZWxzZSBpZiAoIXRvdGFsc2l6ZSB8fCAhdHJhbnNmZXJyZWQgfHwgKGludCllbGFwc2VkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiAtLTotLTotLSBFVEEiKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBldGEsIHNlY3MsIGhvdXJzOworCisJCXRvdGFsc2l6ZSAtPSBiZWdfc2l6ZTsgLyogbm93IGl0J3MgInRvdGFsIHRvIHVwbG9hZCIgKi8KKworCQkvKiBFc3RpbWF0ZWQgcmVtYWluaW5nIHRpbWUgPQorCQkgKiBlc3RpbWF0ZWRfc2VjX3RvX2RsX3RvdGFsc2l6ZV9ieXRlcyAtIGVsYXBzZWRfc2VjID0KKwkJICogdG90YWxzaXplIC8gYXZlcmFnZV9ieXRlc19zZWNfc29fZmFyIC0gZWxhcHNlZCA9CisJCSAqIHRvdGFsc2l6ZSAvICh0cmFuc2ZlcnJlZC9lbGFwc2VkKSAtIGVsYXBzZWQgPQorCQkgKiB0b3RhbHNpemUgKiBlbGFwc2VkIC8gdHJhbnNmZXJyZWQgLSBlbGFwc2VkCisJCSAqLworCQlldGEgPSB0b3RhbHNpemUgKiBlbGFwc2VkIC8gdHJhbnNmZXJyZWQgLSBlbGFwc2VkOworCQlpZiAoZXRhID49IDEwMDAqNjAqNjApCisJCQlldGEgPSAxMDAwKjYwKjYwIC0gMTsKKwkJc2VjcyA9IGV0YSAlIDM2MDA7CisJCWhvdXJzID0gZXRhIC8gMzYwMDsKKwkJZnByaW50ZihzdGRlcnIsICIlM3U6JTAydTolMDJ1IEVUQSIsIGhvdXJzLCBzZWNzIC8gNjAsIHNlY3MgJSA2MCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcHRyX3RvX2dsb2JhbHMuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3B0cl90b19nbG9iYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3NDUzOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3B0cl90b19nbG9iYWxzLmMKQEAgLTAsMCArMSwzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKworc3RydWN0IGdsb2JhbHM7CisKKyNpZm5kZWYgR0NDX0NPTUJJTkUKKworLyogV2UgY2hlYXQgaGVyZS4gSXQgaXMgZGVjbGFyZWQgYXMgY29uc3QgcHRyIGluIGxpYmJiLmgsCisgKiBidXQgaGVyZSB3ZSBtYWtlIGl0IGxpdmUgaW4gUi9XIG1lbW9yeSAqLworc3RydWN0IGdsb2JhbHMgKnB0cl90b19nbG9iYWxzOworCisjaWZkZWYgX19HTElCQ19fCitpbnQgKmJiX2Vycm5vOworI2VuZGlmCisKKworI2Vsc2UKKworCisvKiBnY2MgLWNvbWJpbmUgd2lsbCBzZWUgdGhyb3VnaCBhbmQgY29tcGxhaW4gKi8KKy8qIFVzaW5nIGFsdGVybmF0aXZlIG1ldGhvZCB3aGljaCBpcyBtb3JlIGxpa2VseSB0byBicmVhaworICogb24gd2VpcmQgYXJjaGl0ZWN0dXJlcywgY29tcGlsZXJzLCBsaW5rZXJzIGFuZCBzbyBvbiAqLworc3RydWN0IGdsb2JhbHMgKmNvbnN0IHB0cl90b19nbG9iYWxzIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEiKSkpOworCisjaWZkZWYgX19HTElCQ19fCitpbnQgKmNvbnN0IGJiX2Vycm5vIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEiKSkpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcHdfZW5jcnlwdC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHdfZW5jcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmZhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9wd19lbmNyeXB0LmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIHN0YXRpYyBjb25zdCB1aW50OF90IGFzY2lpNjRbXSA9CisgKiAiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisgKi8KKworc3RhdGljIGludCBpNjRjKGludCBpKQoreworCWkgJj0gMHgzZjsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gJy4nOworCWlmIChpID09IDEpCisJCXJldHVybiAnLyc7CisJaWYgKGkgPCAxMikKKwkJcmV0dXJuICgnMCcgLSAyICsgaSk7CisJaWYgKGkgPCAzOCkKKwkJcmV0dXJuICgnQScgLSAxMiArIGkpOworCXJldHVybiAoJ2EnIC0gMzggKyBpKTsKK30KKworaW50IEZBU1RfRlVOQyBjcnlwdF9tYWtlX3NhbHQoY2hhciAqcCwgaW50IGNudCAvKiwgaW50IHggKi8pCit7CisJLyogd2FzOiB4ICs9IC4uLiAqLworCWludCB4ID0gZ2V0cGlkKCkgKyBtb25vdG9uaWNfdXMoKTsKKwlkbyB7CisJCS8qIHggPSAoeCoxNjY0NTI1ICsgMTAxMzkwNDIyMykgJSAyXjMyIGdlbmVyYXRvciBpcyBsYW1lCisJCSAqIChsb3ctb3JkZXIgYml0IGlzIG5vdCAicmFuZG9tIiwgZXRjLi4uKSwKKwkJICogYnV0IGZvciBvdXIgcHVycG9zZXMgaXQgaXMgZ29vZCBlbm91Z2ggKi8KKwkJeCA9IHgqMTY2NDUyNSArIDEwMTM5MDQyMjM7CisJCS8qIEJUVywgUGFyayBhbmQgTWlsbGVyJ3MgIm1pbmltYWwgc3RhbmRhcmQgZ2VuZXJhdG9yIiBpcworCQkgKiB4ID0geCoxNjgwNyAlICgoMl4zMSktMSkKKwkJICogSXQgaGFzIG5vIHByb2JsZW0gd2l0aCB2aXNpYmx5IGFsdGVybmF0aW5nIGxvd2VzdCBiaXQKKwkJICogYnV0IGlzIGFsc28gd2VhayBpbiBjcnlwdG9ncmFwaGljIHNlbnNlICsgbmVlZHMgZGl2LAorCQkgKiB3aGljaCBuZWVkcyBtb3JlIGNvZGUgKGFuZCBzbG93ZXIpIG9uIG1hbnkgQ1BVcyAqLworCQkqcCsrID0gaTY0Yyh4ID4+IDE2KTsKKwkJKnArKyA9IGk2NGMoeCA+PiAyMik7CisJfSB3aGlsZSAoLS1jbnQpOworCSpwID0gJ1wwJzsKKwlyZXR1cm4geDsKK30KKworY2hhciogRkFTVF9GVU5DIGNyeXB0X21ha2VfcHdfc2FsdChjaGFyIHNhbHRbTUFYX1BXX1NBTFRfTEVOXSwgY29uc3QgY2hhciAqYWxnbykKK3sKKwlpbnQgbGVuID0gMi8yOworCWNoYXIgKnNhbHRfcHRyID0gc2FsdDsKKwlpZiAoYWxnb1swXSAhPSAnZCcpIHsgLyogbm90IGRlcyAqLworCQlsZW4gPSA4LzI7IC8qIHNvIGZhciBhc3N1bWluZyBtZDUgKi8KKwkJKnNhbHRfcHRyKysgPSAnJCc7CisJCSpzYWx0X3B0cisrID0gJzEnOworCQkqc2FsdF9wdHIrKyA9ICckJzsKKyNpZiAhRU5BQkxFX1VTRV9CQl9DUllQVCB8fCBFTkFCTEVfVVNFX0JCX0NSWVBUX1NIQQorCQlpZiAoYWxnb1swXSA9PSAncycpIHsgLyogc2hhICovCisJCQlzYWx0WzFdID0gJzUnICsgKHN0cmNtcChhbGdvLCAic2hhNTEyIikgPT0gMCk7CisJCQlsZW4gPSAxNi8yOworCQl9CisjZW5kaWYKKwl9CisJY3J5cHRfbWFrZV9zYWx0KHNhbHRfcHRyLCBsZW4pOworCXJldHVybiBzYWx0X3B0cjsKK30KKworI2lmIEVOQUJMRV9VU0VfQkJfQ1JZUFQKKworc3RhdGljIGNoYXIqCit0bzY0KGNoYXIgKnMsIHVuc2lnbmVkIHYsIGludCBuKQoreworCXdoaWxlICgtLW4gPj0gMCkgeworCQkvKiAqcysrID0gYXNjaWk2NFt2ICYgMHgzZl07ICovCisJCSpzKysgPSBpNjRjKHYpOworCQl2ID4+PSA2OworCX0KKwlyZXR1cm4gczsKK30KKworLyoKKyAqIERFUyBhbmQgTUQ1IGNyeXB0IGltcGxlbWVudGF0aW9ucyBhcmUgdGFrZW4gZnJvbSB1Y2xpYmMuCisgKiBUaGV5IHdlcmUgbW9kaWZpZWQgdG8gbm90IHVzZSBzdGF0aWMgYnVmZmVycy4KKyAqLworCisjaW5jbHVkZSAicHdfZW5jcnlwdF9kZXMuYyIKKyNpbmNsdWRlICJwd19lbmNyeXB0X21kNS5jIgorI2lmIEVOQUJMRV9VU0VfQkJfQ1JZUFRfU0hBCisjaW5jbHVkZSAicHdfZW5jcnlwdF9zaGEuYyIKKyNlbmRpZgorCisvKiBPdGhlciBhZHZhbmNlZCBjcnlwdCBpZHMgKFRPRE8/KTogKi8KKy8qICQyJCBvciAkMmEkOiBCbG93ZmlzaCAqLworCitzdGF0aWMgc3RydWN0IGNvbnN0X2Rlc19jdHggKmRlc19jY3R4Oworc3RhdGljIHN0cnVjdCBkZXNfY3R4ICpkZXNfY3R4OworCisvKiBteV9jcnlwdCByZXR1cm5zIG1hbGxvYydlZCBkYXRhICovCitzdGF0aWMgY2hhciAqbXlfY3J5cHQoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpzYWx0KQoreworCS8qIE1ENSBvciBTSEE/ICovCisJaWYgKHNhbHRbMF0gPT0gJyQnICYmIHNhbHRbMV0gJiYgc2FsdFsyXSA9PSAnJCcpIHsKKwkJaWYgKHNhbHRbMV0gPT0gJzEnKQorCQkJcmV0dXJuIG1kNV9jcnlwdCh4emFsbG9jKE1ENV9PVVRfQlVGU0laRSksICh1bnNpZ25lZCBjaGFyKilrZXksICh1bnNpZ25lZCBjaGFyKilzYWx0KTsKKyNpZiBFTkFCTEVfVVNFX0JCX0NSWVBUX1NIQQorCQlpZiAoc2FsdFsxXSA9PSAnNScgfHwgc2FsdFsxXSA9PSAnNicpCisJCQlyZXR1cm4gc2hhX2NyeXB0KChjaGFyKilrZXksIChjaGFyKilzYWx0KTsKKyNlbmRpZgorCX0KKworCWlmICghZGVzX2NjdHgpCisJCWRlc19jY3R4ID0gY29uc3RfZGVzX2luaXQoKTsKKwlkZXNfY3R4ID0gZGVzX2luaXQoZGVzX2N0eCwgZGVzX2NjdHgpOworCXJldHVybiBkZXNfY3J5cHQoZGVzX2N0eCwgeHphbGxvYyhERVNfT1VUX0JVRlNJWkUpLCAodW5zaWduZWQgY2hhciopa2V5LCAodW5zaWduZWQgY2hhciopc2FsdCk7Cit9CisKKy8qIFNvIGZhciBub2JvZHkgd2FudHMgdG8gaGF2ZSBpdCBwdWJsaWMgKi8KK3N0YXRpYyB2b2lkIG15X2NyeXB0X2NsZWFudXAodm9pZCkKK3sKKwlmcmVlKGRlc19jY3R4KTsKKwlmcmVlKGRlc19jdHgpOworCWRlc19jY3R4ID0gTlVMTDsKKwlkZXNfY3R4ID0gTlVMTDsKK30KKworY2hhciogRkFTVF9GVU5DIHB3X2VuY3J5cHQoY29uc3QgY2hhciAqY2xlYXIsIGNvbnN0IGNoYXIgKnNhbHQsIGludCBjbGVhbnVwKQoreworCWNoYXIgKmVuY3J5cHRlZDsKKworCWVuY3J5cHRlZCA9IG15X2NyeXB0KGNsZWFyLCBzYWx0KTsKKworCWlmIChjbGVhbnVwKQorCQlteV9jcnlwdF9jbGVhbnVwKCk7CisKKwlyZXR1cm4gZW5jcnlwdGVkOworfQorCisjZWxzZSAvKiBpZiAhRU5BQkxFX1VTRV9CQl9DUllQVCAqLworCitjaGFyKiBGQVNUX0ZVTkMgcHdfZW5jcnlwdChjb25zdCBjaGFyICpjbGVhciwgY29uc3QgY2hhciAqc2FsdCwgaW50IGNsZWFudXApCit7CisJcmV0dXJuIHhzdHJkdXAoY3J5cHQoY2xlYXIsIHNhbHQpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9wd19lbmNyeXB0X2Rlcy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHdfZW5jcnlwdF9kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUwMmRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcHdfZW5jcnlwdF9kZXMuYwpAQCAtMCwwICsxLDgyMCBAQAorLyoKKyAqIEZyZWVTZWM6IGxpYmNyeXB0IGZvciBOZXRCU0QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgRGF2aWQgQnVycmVuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEFkYXB0ZWQgZm9yIEZyZWVCU0QtMi4wIGJ5IEdlb2ZmcmV5IE0uIFJlaG1ldAorICoJdGhpcyBmaWxlIHNob3VsZCBub3cgKm9ubHkqIGV4cG9ydCBjcnlwdCgpLCBpbiBvcmRlciB0byBtYWtlCisgKgliaW5hcmllcyBvZiBsaWJjcnlwdCBleHBvcnRhYmxlIGZyb20gdGhlIFVTQQorICoKKyAqIEFkYXB0ZWQgZm9yIEZyZWVCU0QtNC4wIGJ5IE1hcmsgUiBWIE11cnJheQorICoJdGhpcyBmaWxlIHNob3VsZCBub3cgKm9ubHkqIGV4cG9ydCBjcnlwdF9kZXMoKSwgaW4gb3JkZXIgdG8gbWFrZQorICoJYSBtb2R1bGUgdGhhdCBjYW4gYmUgb3B0aW9uYWxseSBpbmNsdWRlZCBpbiBsaWJjcnlwdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIG90aGVyIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGlzIGFuIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBERVMgYW5kIHRoZSBjcnlwdCgzKSBpbnRlcmZhY2VzCisgKiBieSBEYXZpZCBCdXJyZW4gPGRhdmlkYkB3ZXJqLmNvbS5hdT4uCisgKgorICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBvbiB0aGUgdW5kZXJseWluZyBhbGdvcml0aG0gKGFuZCByZWxhdGVkCisgKiBhbGdvcml0aG1zKSBpczoKKyAqCisgKglCLiBTY2huZWllciwgQXBwbGllZCBDcnlwdG9ncmFwaHk6IHByb3RvY29scywgYWxnb3JpdGhtcywKKyAqCWFuZCBzb3VyY2UgY29kZSBpbiBDLCBKb2huIFdpbGV5ICYgU29ucywgMTk5NC4KKyAqCisgKiBOb3RlIHRoYXQgaW4gdGhhdCBib29rJ3MgZGVzY3JpcHRpb24gb2YgREVTIHRoZSBsb29rdXBzIGZvciB0aGUgaW5pdGlhbCwKKyAqIHBib3gsIGFuZCBmaW5hbCBwZXJtdXRhdGlvbnMgYXJlIGludmVydGVkICh0aGlzIGhhcyBiZWVuIGJyb3VnaHQgdG8gdGhlCisgKiBhdHRlbnRpb24gb2YgdGhlIGF1dGhvcikuICBBIGxpc3Qgb2YgZXJyYXRhIGZvciB0aGlzIGJvb2sgaGFzIGJlZW4KKyAqIHBvc3RlZCB0byB0aGUgc2NpLmNyeXB0IG5ld3Nncm91cCBieSB0aGUgYXV0aG9yIGFuZCBpcyBhdmFpbGFibGUgZm9yIEZUUC4KKyAqCisgKiBBUkNISVRFQ1RVUkUgQVNTVU1QVElPTlM6CisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIDgtYnl0ZSBhcnJheXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBjYW4gYmUKKyAqCWFkZHJlc3NlZCBhcyBhcnJheXMgb2YgdWludDMyX3QncyAoaWUuIHRoZSBDUFUgaXMgbm90IHBpY2t5IGFib3V0CisgKglhbGlnbm1lbnQpLgorICovCisKKworLyogUGFydHMgYnVzeWJveCBkb2Vzbid0IG5lZWQgb3IgaGFkIG9wdGltaXplZCAqLworI2RlZmluZSBVU0VfUFJFQ09NUFVURURfdV9zYm94IDEKKyNkZWZpbmUgVVNFX1JFUEVUSVRJVkVfU1BFRURVUCAwCisjZGVmaW5lIFVTRV9pcF9tYXNrIDAKKyNkZWZpbmUgVVNFX2RlX2tleXMgMAorCisKKy8qIEEgcGlsZSBvZiBkYXRhICovCitzdGF0aWMgY29uc3QgdWludDhfdCBJUFs2NF0gPSB7CisJNTgsIDUwLCA0MiwgMzQsIDI2LCAxOCwgMTAsICAyLCA2MCwgNTIsIDQ0LCAzNiwgMjgsIDIwLCAxMiwgIDQsCisJNjIsIDU0LCA0NiwgMzgsIDMwLCAyMiwgMTQsICA2LCA2NCwgNTYsIDQ4LCA0MCwgMzIsIDI0LCAxNiwgIDgsCisJNTcsIDQ5LCA0MSwgMzMsIDI1LCAxNywgIDksICAxLCA1OSwgNTEsIDQzLCAzNSwgMjcsIDE5LCAxMSwgIDMsCisJNjEsIDUzLCA0NSwgMzcsIDI5LCAyMSwgMTMsICA1LCA2MywgNTUsIDQ3LCAzOSwgMzEsIDIzLCAxNSwgIDcKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtleV9wZXJtWzU2XSA9IHsKKwk1NywgNDksIDQxLCAzMywgMjUsIDE3LCAgOSwgIDEsIDU4LCA1MCwgNDIsIDM0LCAyNiwgMTgsCisJMTAsICAyLCA1OSwgNTEsIDQzLCAzNSwgMjcsIDE5LCAxMSwgIDMsIDYwLCA1MiwgNDQsIDM2LAorCTYzLCA1NSwgNDcsIDM5LCAzMSwgMjMsIDE1LCAgNywgNjIsIDU0LCA0NiwgMzgsIDMwLCAyMiwKKwkxNCwgIDYsIDYxLCA1MywgNDUsIDM3LCAyOSwgMjEsIDEzLCAgNSwgMjgsIDIwLCAxMiwgIDQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtleV9zaGlmdHNbMTZdID0geworCTEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvbXBfcGVybVs0OF0gPSB7CisJMTQsIDE3LCAxMSwgMjQsICAxLCAgNSwgIDMsIDI4LCAxNSwgIDYsIDIxLCAxMCwKKwkyMywgMTksIDEyLCAgNCwgMjYsICA4LCAxNiwgIDcsIDI3LCAyMCwgMTMsICAyLAorCTQxLCA1MiwgMzEsIDM3LCA0NywgNTUsIDMwLCA0MCwgNTEsIDQ1LCAzMywgNDgsCisJNDQsIDQ5LCAzOSwgNTYsIDM0LCA1MywgNDYsIDQyLCA1MCwgMzYsIDI5LCAzMgorfTsKKworLyoKKyAqIE5vIEUgYm94IGlzIHVzZWQsIGFzIGl0J3MgcmVwbGFjZWQgYnkgc29tZSBBTkRzLCBzaGlmdHMsIGFuZCBPUnMuCisgKi8KKyNpZiAhVVNFX1BSRUNPTVBVVEVEX3Vfc2JveAorc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2JveFs4XVs2NF0gPSB7CisJewkxNCwgIDQsIDEzLCAgMSwgIDIsIDE1LCAxMSwgIDgsICAzLCAxMCwgIDYsIDEyLCAgNSwgIDksICAwLCAgNywKKwkJIDAsIDE1LCAgNywgIDQsIDE0LCAgMiwgMTMsICAxLCAxMCwgIDYsIDEyLCAxMSwgIDksICA1LCAgMywgIDgsCisJCSA0LCAgMSwgMTQsICA4LCAxMywgIDYsICAyLCAxMSwgMTUsIDEyLCAgOSwgIDcsICAzLCAxMCwgIDUsICAwLAorCQkxNSwgMTIsICA4LCAgMiwgIDQsICA5LCAgMSwgIDcsICA1LCAxMSwgIDMsIDE0LCAxMCwgIDAsICA2LCAxMworCX0sCisJewkxNSwgIDEsICA4LCAxNCwgIDYsIDExLCAgMywgIDQsICA5LCAgNywgIDIsIDEzLCAxMiwgIDAsICA1LCAxMCwKKwkJIDMsIDEzLCAgNCwgIDcsIDE1LCAgMiwgIDgsIDE0LCAxMiwgIDAsICAxLCAxMCwgIDYsICA5LCAxMSwgIDUsCisJCSAwLCAxNCwgIDcsIDExLCAxMCwgIDQsIDEzLCAgMSwgIDUsICA4LCAxMiwgIDYsICA5LCAgMywgIDIsIDE1LAorCQkxMywgIDgsIDEwLCAgMSwgIDMsIDE1LCAgNCwgIDIsIDExLCAgNiwgIDcsIDEyLCAgMCwgIDUsIDE0LCAgOQorCX0sCisJewkxMCwgIDAsICA5LCAxNCwgIDYsICAzLCAxNSwgIDUsICAxLCAxMywgMTIsICA3LCAxMSwgIDQsICAyLCAgOCwKKwkJMTMsICA3LCAgMCwgIDksICAzLCAgNCwgIDYsIDEwLCAgMiwgIDgsICA1LCAxNCwgMTIsIDExLCAxNSwgIDEsCisJCTEzLCAgNiwgIDQsICA5LCAgOCwgMTUsICAzLCAgMCwgMTEsICAxLCAgMiwgMTIsICA1LCAxMCwgMTQsICA3LAorCQkgMSwgMTAsIDEzLCAgMCwgIDYsICA5LCAgOCwgIDcsICA0LCAxNSwgMTQsICAzLCAxMSwgIDUsICAyLCAxMgorCX0sCisJewkgNywgMTMsIDE0LCAgMywgIDAsICA2LCAgOSwgMTAsICAxLCAgMiwgIDgsICA1LCAxMSwgMTIsICA0LCAxNSwKKwkJMTMsICA4LCAxMSwgIDUsICA2LCAxNSwgIDAsICAzLCAgNCwgIDcsICAyLCAxMiwgIDEsIDEwLCAxNCwgIDksCisJCTEwLCAgNiwgIDksICAwLCAxMiwgMTEsICA3LCAxMywgMTUsICAxLCAgMywgMTQsICA1LCAgMiwgIDgsICA0LAorCQkgMywgMTUsICAwLCAgNiwgMTAsICAxLCAxMywgIDgsICA5LCAgNCwgIDUsIDExLCAxMiwgIDcsICAyLCAxNAorCX0sCisJewkgMiwgMTIsICA0LCAgMSwgIDcsIDEwLCAxMSwgIDYsICA4LCAgNSwgIDMsIDE1LCAxMywgIDAsIDE0LCAgOSwKKwkJMTQsIDExLCAgMiwgMTIsICA0LCAgNywgMTMsICAxLCAgNSwgIDAsIDE1LCAxMCwgIDMsICA5LCAgOCwgIDYsCisJCSA0LCAgMiwgIDEsIDExLCAxMCwgMTMsICA3LCAgOCwgMTUsICA5LCAxMiwgIDUsICA2LCAgMywgIDAsIDE0LAorCQkxMSwgIDgsIDEyLCAgNywgIDEsIDE0LCAgMiwgMTMsICA2LCAxNSwgIDAsICA5LCAxMCwgIDQsICA1LCAgMworCX0sCisJewkxMiwgIDEsIDEwLCAxNSwgIDksICAyLCAgNiwgIDgsICAwLCAxMywgIDMsICA0LCAxNCwgIDcsICA1LCAxMSwKKwkJMTAsIDE1LCAgNCwgIDIsICA3LCAxMiwgIDksICA1LCAgNiwgIDEsIDEzLCAxNCwgIDAsIDExLCAgMywgIDgsCisJCSA5LCAxNCwgMTUsICA1LCAgMiwgIDgsIDEyLCAgMywgIDcsICAwLCAgNCwgMTAsICAxLCAxMywgMTEsICA2LAorCQkgNCwgIDMsICAyLCAxMiwgIDksICA1LCAxNSwgMTAsIDExLCAxNCwgIDEsICA3LCAgNiwgIDAsICA4LCAxMworCX0sCisJewkgNCwgMTEsICAyLCAxNCwgMTUsICAwLCAgOCwgMTMsICAzLCAxMiwgIDksICA3LCAgNSwgMTAsICA2LCAgMSwKKwkJMTMsICAwLCAxMSwgIDcsICA0LCAgOSwgIDEsIDEwLCAxNCwgIDMsICA1LCAxMiwgIDIsIDE1LCAgOCwgIDYsCisJCSAxLCAgNCwgMTEsIDEzLCAxMiwgIDMsICA3LCAxNCwgMTAsIDE1LCAgNiwgIDgsICAwLCAgNSwgIDksICAyLAorCQkgNiwgMTEsIDEzLCAgOCwgIDEsICA0LCAxMCwgIDcsICA5LCAgNSwgIDAsIDE1LCAxNCwgIDIsICAzLCAxMgorCX0sCisJewkxMywgIDIsICA4LCAgNCwgIDYsIDE1LCAxMSwgIDEsIDEwLCAgOSwgIDMsIDE0LCAgNSwgIDAsIDEyLCAgNywKKwkJIDEsIDE1LCAxMywgIDgsIDEwLCAgMywgIDcsICA0LCAxMiwgIDUsICA2LCAxMSwgIDAsIDE0LCAgOSwgIDIsCisJCSA3LCAxMSwgIDQsICAxLCAgOSwgMTIsIDE0LCAgMiwgIDAsICA2LCAxMCwgMTMsIDE1LCAgMywgIDUsICA4LAorCQkgMiwgIDEsIDE0LCAgNywgIDQsIDEwLCAgOCwgMTMsIDE1LCAxMiwgIDksICAwLCAgMywgIDUsICA2LCAxMQorCX0KK307CisjZWxzZSAvKiBwcmVjb21wdXRlZCwgd2l0aCBoYWxmLWJ5dGVzIHBhY2tlZCBpbnRvIG9uZSBieXRlICovCitzdGF0aWMgY29uc3QgdWludDhfdCB1X3Nib3hbOF1bMzJdID0geworCXsJMHgwZSwgMHhmNCwgMHg3ZCwgMHg0MSwgMHhlMiwgMHgyZiwgMHhkYiwgMHgxOCwKKwkJMHhhMywgMHg2YSwgMHhjNiwgMHhiYywgMHg5NSwgMHg1OSwgMHgzMCwgMHg4NywKKwkJMHhmNCwgMHhjMSwgMHg4ZSwgMHgyOCwgMHg0ZCwgMHg5NiwgMHgxMiwgMHg3YiwKKwkJMHg1ZiwgMHhiYywgMHgzOSwgMHhlNywgMHhhMywgMHgwYSwgMHg2NSwgMHhkMCwKKwl9LAorCXsJMHgzZiwgMHhkMSwgMHg0OCwgMHg3ZSwgMHhmNiwgMHgyYiwgMHg4MywgMHhlNCwKKwkJMHhjOSwgMHgwNywgMHgxMiwgMHhhZCwgMHg2YywgMHg5MCwgMHhiNSwgMHg1YSwKKwkJMHhkMCwgMHg4ZSwgMHhhNywgMHgxYiwgMHgzYSwgMHhmNCwgMHg0ZCwgMHgyMSwKKwkJMHhiNSwgMHg2OCwgMHg3YywgMHhjNiwgMHgwOSwgMHg1MywgMHhlMiwgMHg5ZiwKKwl9LAorCXsJMHhkYSwgMHg3MCwgMHgwOSwgMHg5ZSwgMHgzNiwgMHg0MywgMHg2ZiwgMHhhNSwKKwkJMHgyMSwgMHg4ZCwgMHg1YywgMHhlNywgMHhjYiwgMHhiNCwgMHhmMiwgMHgxOCwKKwkJMHgxZCwgMHhhNiwgMHhkNCwgMHgwOSwgMHg2OCwgMHg5ZiwgMHg4MywgMHg3MCwKKwkJMHg0YiwgMHhmMSwgMHhlMiwgMHgzYywgMHhiNSwgMHg1YSwgMHgyZSwgMHhjNywKKwl9LAorCXsJMHhkNywgMHg4ZCwgMHhiZSwgMHg1MywgMHg2MCwgMHhmNiwgMHgwOSwgMHgzYSwKKwkJMHg0MSwgMHg3MiwgMHgyOCwgMHhjNSwgMHgxYiwgMHhhYywgMHhlNCwgMHg5ZiwKKwkJMHgzYSwgMHhmNiwgMHgwOSwgMHg2MCwgMHhhYywgMHgxYiwgMHhkNywgMHg4ZCwKKwkJMHg5ZiwgMHg0MSwgMHg1MywgMHhiZSwgMHhjNSwgMHg3MiwgMHgyOCwgMHhlNCwKKwl9LAorCXsJMHhlMiwgMHhiYywgMHgyNCwgMHhjMSwgMHg0NywgMHg3YSwgMHhkYiwgMHgxNiwKKwkJMHg1OCwgMHgwNSwgMHhmMywgMHhhZiwgMHgzZCwgMHg5MCwgMHg4ZSwgMHg2OSwKKwkJMHhiNCwgMHg4MiwgMHhjMSwgMHg3YiwgMHgxYSwgMHhlZCwgMHgyNywgMHhkOCwKKwkJMHg2ZiwgMHhmOSwgMHgwYywgMHg5NSwgMHhhNiwgMHg0MywgMHg1MCwgMHgzZSwKKwl9LAorCXsJMHhhYywgMHhmMSwgMHg0YSwgMHgyZiwgMHg3OSwgMHhjMiwgMHg5NiwgMHg1OCwKKwkJMHg2MCwgMHgxZCwgMHhkMywgMHhlNCwgMHgwZSwgMHhiNywgMHgzNSwgMHg4YiwKKwkJMHg0OSwgMHgzZSwgMHgyZiwgMHhjNSwgMHg5MiwgMHg1OCwgMHhmYywgMHhhMywKKwkJMHhiNywgMHhlMCwgMHgxNCwgMHg3YSwgMHg2MSwgMHgwZCwgMHg4YiwgMHhkNiwKKwl9LAorCXsJMHhkNCwgMHgwYiwgMHhiMiwgMHg3ZSwgMHg0ZiwgMHg5MCwgMHgxOCwgMHhhZCwKKwkJMHhlMywgMHgzYywgMHg1OSwgMHhjNywgMHgyNSwgMHhmYSwgMHg4NiwgMHg2MSwKKwkJMHg2MSwgMHhiNCwgMHhkYiwgMHg4ZCwgMHgxYywgMHg0MywgMHhhNywgMHg3ZSwKKwkJMHg5YSwgMHg1ZiwgMHgwNiwgMHhmOCwgMHhlMCwgMHgyNSwgMHgzOSwgMHhjMiwKKwl9LAorCXsJMHgxZCwgMHhmMiwgMHhkOCwgMHg4NCwgMHhhNiwgMHgzZiwgMHg3YiwgMHg0MSwKKwkJMHhjYSwgMHg1OSwgMHg2MywgMHhiZSwgMHgwNSwgMHhlMCwgMHg5YywgMHgyNywKKwkJMHgyNywgMHgxYiwgMHhlNCwgMHg3MSwgMHg0OSwgMHhhYywgMHg4ZSwgMHhkMiwKKwkJMHhmMCwgMHhjNiwgMHg5YSwgMHgwZCwgMHgzZiwgMHg1MywgMHg2NSwgMHhiOCwKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDhfdCBwYm94WzMyXSA9IHsKKwkxNiwgIDcsIDIwLCAyMSwgMjksIDEyLCAyOCwgMTcsICAxLCAxNSwgMjMsIDI2LCAgNSwgMTgsIDMxLCAxMCwKKwkgMiwgIDgsIDI0LCAxNCwgMzIsIDI3LCAgMywgIDksIDE5LCAxMywgMzAsICA2LCAyMiwgMTEsICA0LCAyNQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGJpdHMzMlszMl0gPQoreworCTB4ODAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4MTAwMDAwMDAsCisJMHgwODAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMTAwMDAwMCwKKwkweDAwODAwMDAwLCAweDAwNDAwMDAwLCAweDAwMjAwMDAwLCAweDAwMTAwMDAwLAorCTB4MDAwODAwMDAsIDB4MDAwNDAwMDAsIDB4MDAwMjAwMDAsIDB4MDAwMTAwMDAsCisJMHgwMDAwODAwMCwgMHgwMDAwNDAwMCwgMHgwMDAwMjAwMCwgMHgwMDAwMTAwMCwKKwkweDAwMDAwODAwLCAweDAwMDAwNDAwLCAweDAwMDAwMjAwLCAweDAwMDAwMTAwLAorCTB4MDAwMDAwODAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMTAsCisJMHgwMDAwMDAwOCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0czhbOF0gPSB7IDB4ODAsIDB4NDAsIDB4MjAsIDB4MTAsIDB4MDgsIDB4MDQsIDB4MDIsIDB4MDEgfTsKKworCitzdGF0aWMgaW50Cithc2NpaV90b19iaW4oY2hhciBjaCkKK3sKKwlpZiAoY2ggPiAneicpCisJCXJldHVybiAwOworCWlmIChjaCA+PSAnYScpCisJCXJldHVybiAoY2ggLSAnYScgKyAzOCk7CisJaWYgKGNoID4gJ1onKQorCQlyZXR1cm4gMDsKKwlpZiAoY2ggPj0gJ0EnKQorCQlyZXR1cm4gKGNoIC0gJ0EnICsgMTIpOworCWlmIChjaCA+ICc5JykKKwkJcmV0dXJuIDA7CisJaWYgKGNoID49ICcuJykKKwkJcmV0dXJuIChjaCAtICcuJyk7CisJcmV0dXJuIDA7Cit9CisKKworLyogU3RhdGljIHN0dWZmIHRoYXQgc3RheXMgcmVzaWRlbnQgYW5kIGRvZXNuJ3QgY2hhbmdlIGFmdGVyCisgKiBiZWluZyBpbml0aWFsaXplZCwgYW5kIHRoZXJlZm9yZSBkb2Vzbid0IG5lZWQgdG8gYmUgbWFkZQorICogcmVlbnRyYW50LiAqLworc3RydWN0IGNvbnN0X2Rlc19jdHggeworI2lmIFVTRV9pcF9tYXNrCisJdWludDhfdAlpbml0X3Blcm1bNjRdOyAvKiByZWZlcmVuY2VkIDIgdGltZXMgKi8KKyNlbmRpZgorCXVpbnQ4X3QJZmluYWxfcGVybVs2NF07IC8qIDIgdGltZXMgKi8KKwl1aW50OF90CW1fc2JveFs0XVs0MDk2XTsgLyogNSB0aW1lcyAqLworfTsKKyNkZWZpbmUgQyAoKmNjdHgpCisjZGVmaW5lIGluaXRfcGVybSAgKEMuaW5pdF9wZXJtICkKKyNkZWZpbmUgZmluYWxfcGVybSAoQy5maW5hbF9wZXJtKQorI2RlZmluZSBtX3Nib3ggICAgIChDLm1fc2JveCAgICApCisKK3N0YXRpYyBzdHJ1Y3QgY29uc3RfZGVzX2N0eCoKK2NvbnN0X2Rlc19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaSwgaiwgYjsKKwlzdHJ1Y3QgY29uc3RfZGVzX2N0eCAqY2N0eDsKKworI2lmICFVU0VfUFJFQ09NUFVURURfdV9zYm94CisJdWludDhfdAl1X3Nib3hbOF1bNjRdOworCisJY2N0eCA9IHhtYWxsb2Moc2l6ZW9mKCpjY3R4KSk7CisKKwkvKiBJbnZlcnQgdGhlIFMtYm94ZXMsIHJlb3JkZXJpbmcgdGhlIGlucHV0IGJpdHMuICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgeworCQkJYiA9IChqICYgMHgyMCkgfCAoKGogJiAxKSA8PCA0KSB8ICgoaiA+PiAxKSAmIDB4Zik7CisJCQl1X3Nib3hbaV1bal0gPSBzYm94W2ldW2JdOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJZnByaW50ZihzdGRlcnIsICJcdHtcdCIpOworCQlmb3IgKGogPSAwOyBqIDwgNjQ7IGorPTIpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAweCUwMngsIiwgdV9zYm94W2ldW2pdICsgdV9zYm94W2ldW2orMV0qMTYpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuXHR9LFxuIik7CisJfQorCS8qCisJICogQ29udmVydCB0aGUgaW52ZXJ0ZWQgUy1ib3hlcyBpbnRvIDQgYXJyYXlzIG9mIDggYml0cy4KKwkgKiBFYWNoIHdpbGwgaGFuZGxlIDEyIGJpdHMgb2YgdGhlIFMtYm94IGlucHV0LgorCSAqLworCWZvciAoYiA9IDA7IGIgPCA0OyBiKyspCisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorCQkJZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisJCQkJbV9zYm94W2JdWyhpIDw8IDYpIHwgal0gPQorCQkJCQkodWludDhfdCkoKHVfc2JveFsoYiA8PCAxKV1baV0gPDwgNCkgfAorCQkJCQkJdV9zYm94WyhiIDw8IDEpICsgMV1bal0pOworI2Vsc2UKKwljY3R4ID0geG1hbGxvYyhzaXplb2YoKmNjdHgpKTsKKworCS8qCisJICogQ29udmVydCB0aGUgaW52ZXJ0ZWQgUy1ib3hlcyBpbnRvIDQgYXJyYXlzIG9mIDggYml0cy4KKwkgKiBFYWNoIHdpbGwgaGFuZGxlIDEyIGJpdHMgb2YgdGhlIFMtYm94IGlucHV0LgorCSAqLworCWZvciAoYiA9IDA7IGIgPCA0OyBiKyspCisJIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorCSAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKKwkJdWludDhfdCBsbywgaGk7CisJCWhpID0gdV9zYm94WyhiIDw8IDEpXVtpIC8gMl07CisJCWlmICghKGkgJiAxKSkKKwkJCWhpIDw8PSA0OworCQlsbyA9IHVfc2JveFsoYiA8PCAxKSArIDFdW2ogLyAyXTsKKwkJaWYgKGogJiAxKQorCQkJbG8gPj49IDQ7CisJCW1fc2JveFtiXVsoaSA8PCA2KSB8IGpdID0gKGhpICYgMHhmMCkgfCAobG8gJiAweDBmKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogU2V0IHVwIHRoZSBpbml0aWFsICYgZmluYWwgcGVybXV0YXRpb25zIGludG8gYSB1c2VmdWwgZm9ybS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlmaW5hbF9wZXJtW2ldID0gSVBbaV0gLSAxOworI2lmIFVTRV9pcF9tYXNrCisJCWluaXRfcGVybVtmaW5hbF9wZXJtW2ldXSA9ICh1aW50OF90KWk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gY2N0eDsKK30KKworCitzdHJ1Y3QgZGVzX2N0eCB7CisJY29uc3Qgc3RydWN0IGNvbnN0X2Rlc19jdHggKmNvbnN0X2N0eDsKKwl1aW50MzJfdCBzYWx0Yml0czsgLyogcmVmZXJlbmNlZCA1IHRpbWVzICovCisjaWYgVVNFX1JFUEVUSVRJVkVfU1BFRURVUAorCXVpbnQzMl90IG9sZF9zYWx0OyAvKiAzIHRpbWVzICovCisJdWludDMyX3Qgb2xkX3Jhd2tleTAsIG9sZF9yYXdrZXkxOyAvKiAzIHRpbWVzIGVhY2ggKi8KKyNlbmRpZgorCXVpbnQ4X3QJdW5fcGJveFszMl07IC8qIDIgdGltZXMgKi8KKwl1aW50OF90CWludl9jb21wX3Blcm1bNTZdOyAvKiAzIHRpbWVzICovCisJdWludDhfdAlpbnZfa2V5X3Blcm1bNjRdOyAvKiAzIHRpbWVzICovCisJdWludDMyX3QgZW5fa2V5c2xbMTZdLCBlbl9rZXlzclsxNl07IC8qIDIgdGltZXMgZWFjaCAqLworI2lmIFVTRV9kZV9rZXlzCisJdWludDMyX3QgZGVfa2V5c2xbMTZdLCBkZV9rZXlzclsxNl07IC8qIDIgdGltZXMgZWFjaCAqLworI2VuZGlmCisjaWYgVVNFX2lwX21hc2sKKwl1aW50MzJfdCBpcF9tYXNrbFs4XVsyNTZdLCBpcF9tYXNrcls4XVsyNTZdOyAvKiA5IHRpbWVzIGVhY2ggKi8KKyNlbmRpZgorCXVpbnQzMl90IGZwX21hc2tsWzhdWzI1Nl0sIGZwX21hc2tyWzhdWzI1Nl07IC8qIDkgdGltZXMgZWFjaCAqLworCXVpbnQzMl90IGtleV9wZXJtX21hc2tsWzhdWzEyOF0sIGtleV9wZXJtX21hc2tyWzhdWzEyOF07IC8qIDkgdGltZXMgKi8KKwl1aW50MzJfdCBjb21wX21hc2tsWzhdWzEyOF0sIGNvbXBfbWFza3JbOF1bMTI4XTsgLyogOSB0aW1lcyBlYWNoICovCisJdWludDMyX3QgcHNib3hbNF1bMjU2XTsgLyogNSB0aW1lcyAqLworfTsKKyNkZWZpbmUgRCAoKmN0eCkKKyNkZWZpbmUgY29uc3RfY3R4ICAgICAgIChELmNvbnN0X2N0eCAgICAgICkKKyNkZWZpbmUgc2FsdGJpdHMgICAgICAgIChELnNhbHRiaXRzICAgICAgICkKKyNkZWZpbmUgb2xkX3NhbHQgICAgICAgIChELm9sZF9zYWx0ICAgICAgICkKKyNkZWZpbmUgb2xkX3Jhd2tleTAgICAgIChELm9sZF9yYXdrZXkwICAgICkKKyNkZWZpbmUgb2xkX3Jhd2tleTEgICAgIChELm9sZF9yYXdrZXkxICAgICkKKyNkZWZpbmUgdW5fcGJveCAgICAgICAgIChELnVuX3Bib3ggICAgICAgICkKKyNkZWZpbmUgaW52X2NvbXBfcGVybSAgIChELmludl9jb21wX3Blcm0gICkKKyNkZWZpbmUgaW52X2tleV9wZXJtICAgIChELmludl9rZXlfcGVybSAgICkKKyNkZWZpbmUgZW5fa2V5c2wgICAgICAgIChELmVuX2tleXNsICAgICAgICkKKyNkZWZpbmUgZW5fa2V5c3IgICAgICAgIChELmVuX2tleXNyICAgICAgICkKKyNkZWZpbmUgZGVfa2V5c2wgICAgICAgIChELmRlX2tleXNsICAgICAgICkKKyNkZWZpbmUgZGVfa2V5c3IgICAgICAgIChELmRlX2tleXNyICAgICAgICkKKyNkZWZpbmUgaXBfbWFza2wgICAgICAgIChELmlwX21hc2tsICAgICAgICkKKyNkZWZpbmUgaXBfbWFza3IgICAgICAgIChELmlwX21hc2tyICAgICAgICkKKyNkZWZpbmUgZnBfbWFza2wgICAgICAgIChELmZwX21hc2tsICAgICAgICkKKyNkZWZpbmUgZnBfbWFza3IgICAgICAgIChELmZwX21hc2tyICAgICAgICkKKyNkZWZpbmUga2V5X3Blcm1fbWFza2wgIChELmtleV9wZXJtX21hc2tsICkKKyNkZWZpbmUga2V5X3Blcm1fbWFza3IgIChELmtleV9wZXJtX21hc2tyICkKKyNkZWZpbmUgY29tcF9tYXNrbCAgICAgIChELmNvbXBfbWFza2wgICAgICkKKyNkZWZpbmUgY29tcF9tYXNrciAgICAgIChELmNvbXBfbWFza3IgICAgICkKKyNkZWZpbmUgcHNib3ggICAgICAgICAgIChELnBzYm94ICAgICAgICAgICkKKworc3RhdGljIHN0cnVjdCBkZXNfY3R4KgorZGVzX2luaXQoc3RydWN0IGRlc19jdHggKmN0eCwgY29uc3Qgc3RydWN0IGNvbnN0X2Rlc19jdHggKmNjdHgpCit7CisJaW50IGksIGosIGIsIGssIGluYml0LCBvYml0OworCXVpbnQzMl90IHA7CisJY29uc3QgdWludDMyX3QgKmJpdHMyOCwgKmJpdHMyNDsKKworCWlmICghY3R4KQorCQljdHggPSB4bWFsbG9jKHNpemVvZigqY3R4KSk7CisJY29uc3RfY3R4ID0gY2N0eDsKKworI2lmIFVTRV9SRVBFVElUSVZFX1NQRUVEVVAKKwlvbGRfcmF3a2V5MCA9IG9sZF9yYXdrZXkxID0gMDsKKwlvbGRfc2FsdCA9IDA7CisjZW5kaWYKKwlzYWx0Yml0cyA9IDA7CisJYml0czI4ID0gYml0czMyICsgNDsKKwliaXRzMjQgPSBiaXRzMjggKyA0OworCisJLyogSW5pdGlhbGlzZSB0aGUgaW52ZXJ0ZWQga2V5IHBlcm11dGF0aW9uLiAqLworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWludl9rZXlfcGVybVtpXSA9IDI1NTsKKwl9CisKKwkvKgorCSAqIEludmVydCB0aGUga2V5IHBlcm11dGF0aW9uIGFuZCBpbml0aWFsaXNlIHRoZSBpbnZlcnRlZCBrZXkKKwkgKiBjb21wcmVzc2lvbiBwZXJtdXRhdGlvbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTY7IGkrKykgeworCQlpbnZfa2V5X3Blcm1ba2V5X3Blcm1baV0gLSAxXSA9ICh1aW50OF90KWk7CisJCWludl9jb21wX3Blcm1baV0gPSAyNTU7CisJfQorCisJLyogSW52ZXJ0IHRoZSBrZXkgY29tcHJlc3Npb24gcGVybXV0YXRpb24uICovCisJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKKwkJaW52X2NvbXBfcGVybVtjb21wX3Blcm1baV0gLSAxXSA9ICh1aW50OF90KWk7CisJfQorCisJLyoKKwkgKiBTZXQgdXAgdGhlIE9SLW1hc2sgYXJyYXlzIGZvciB0aGUgaW5pdGlhbCBhbmQgZmluYWwgcGVybXV0YXRpb25zLAorCSAqIGFuZCBmb3IgdGhlIGtleSBpbml0aWFsIGFuZCBjb21wcmVzc2lvbiBwZXJtdXRhdGlvbnMuCisJICovCisJZm9yIChrID0gMDsgayA8IDg7IGsrKykgeworCQl1aW50MzJfdCBpbCwgaXI7CisJCXVpbnQzMl90IGZsLCBmcjsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisjaWYgVVNFX2lwX21hc2sKKwkJCWlsID0gMDsKKwkJCWlyID0gMDsKKyNlbmRpZgorCQkJZmwgPSAwOworCQkJZnIgPSAwOworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJCWluYml0ID0gOCAqIGsgKyBqOworCQkJCWlmIChpICYgYml0czhbal0pIHsKKyNpZiBVU0VfaXBfbWFzaworCQkJCQlvYml0ID0gaW5pdF9wZXJtW2luYml0XTsKKwkJCQkJaWYgKG9iaXQgPCAzMikKKwkJCQkJCWlsIHw9IGJpdHMzMltvYml0XTsKKwkJCQkJZWxzZQorCQkJCQkJaXIgfD0gYml0czMyW29iaXQgLSAzMl07CisjZW5kaWYKKwkJCQkJb2JpdCA9IGZpbmFsX3Blcm1baW5iaXRdOworCQkJCQlpZiAob2JpdCA8IDMyKQorCQkJCQkJZmwgfD0gYml0czMyW29iaXRdOworCQkJCQllbHNlCisJCQkJCQlmciB8PSBiaXRzMzJbb2JpdCAtIDMyXTsKKwkJCQl9CisJCQl9CisjaWYgVVNFX2lwX21hc2sKKwkJCWlwX21hc2tsW2tdW2ldID0gaWw7CisJCQlpcF9tYXNrcltrXVtpXSA9IGlyOworI2VuZGlmCisJCQlmcF9tYXNrbFtrXVtpXSA9IGZsOworCQkJZnBfbWFza3Jba11baV0gPSBmcjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJCWlsID0gMDsKKwkJCWlyID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCA3OyBqKyspIHsKKwkJCQlpbmJpdCA9IDggKiBrICsgajsKKwkJCQlpZiAoaSAmIGJpdHM4W2ogKyAxXSkgeworCQkJCQlvYml0ID0gaW52X2tleV9wZXJtW2luYml0XTsKKwkJCQkJaWYgKG9iaXQgPT0gMjU1KQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChvYml0IDwgMjgpCisJCQkJCQlpbCB8PSBiaXRzMjhbb2JpdF07CisJCQkJCWVsc2UKKwkJCQkJCWlyIHw9IGJpdHMyOFtvYml0IC0gMjhdOworCQkJCX0KKwkJCX0KKwkJCWtleV9wZXJtX21hc2tsW2tdW2ldID0gaWw7CisJCQlrZXlfcGVybV9tYXNrcltrXVtpXSA9IGlyOworCQkJaWwgPSAwOworCQkJaXIgPSAwOworCQkJZm9yIChqID0gMDsgaiA8IDc7IGorKykgeworCQkJCWluYml0ID0gNyAqIGsgKyBqOworCQkJCWlmIChpICYgYml0czhbaiArIDFdKSB7CisJCQkJCW9iaXQgPSBpbnZfY29tcF9wZXJtW2luYml0XTsKKwkJCQkJaWYgKG9iaXQgPT0gMjU1KQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChvYml0IDwgMjQpCisJCQkJCQlpbCB8PSBiaXRzMjRbb2JpdF07CisJCQkJCWVsc2UKKwkJCQkJCWlyIHw9IGJpdHMyNFtvYml0IC0gMjRdOworCQkJCX0KKwkJCX0KKwkJCWNvbXBfbWFza2xba11baV0gPSBpbDsKKwkJCWNvbXBfbWFza3Jba11baV0gPSBpcjsKKwkJfQorCX0KKworCS8qCisJICogSW52ZXJ0IHRoZSBQLWJveCBwZXJtdXRhdGlvbiwgYW5kIGNvbnZlcnQgaW50byBPUi1tYXNrcyBmb3IKKwkgKiBoYW5kbGluZyB0aGUgb3V0cHV0IG9mIHRoZSBTLWJveCBhcnJheXMgc2V0dXAgYWJvdmUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCXVuX3Bib3hbcGJveFtpXSAtIDFdID0gKHVpbnQ4X3QpaTsKKworCWZvciAoYiA9IDA7IGIgPCA0OyBiKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQlwID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQlpZiAoaSAmIGJpdHM4W2pdKQorCQkJCQlwIHw9IGJpdHMzMlt1bl9wYm94WzggKiBiICsgal1dOworCQkJfQorCQkJcHNib3hbYl1baV0gPSBwOworCQl9CisJfQorCisJcmV0dXJuIGN0eDsKK30KKworCitzdGF0aWMgdm9pZAorc2V0dXBfc2FsdChzdHJ1Y3QgZGVzX2N0eCAqY3R4LCB1aW50MzJfdCBzYWx0KQoreworCXVpbnQzMl90IG9iaXQsIHNhbHRiaXQ7CisJaW50IGk7CisKKyNpZiBVU0VfUkVQRVRJVElWRV9TUEVFRFVQCisJaWYgKHNhbHQgPT0gb2xkX3NhbHQpCisJCXJldHVybjsKKwlvbGRfc2FsdCA9IHNhbHQ7CisjZW5kaWYKKworCXNhbHRiaXRzID0gMDsKKwlzYWx0Yml0ID0gMTsKKwlvYml0ID0gMHg4MDAwMDA7CisJZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHsKKwkJaWYgKHNhbHQgJiBzYWx0Yml0KQorCQkJc2FsdGJpdHMgfD0gb2JpdDsKKwkJc2FsdGJpdCA8PD0gMTsKKwkJb2JpdCA+Pj0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkZXNfc2V0a2V5KHN0cnVjdCBkZXNfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwl1aW50MzJfdCBrMCwgazEsIHJhd2tleTAsIHJhd2tleTE7CisJaW50IHNoaWZ0cywgcm91bmQ7CisKKwlyYXdrZXkwID0gbnRvaGwoKihjb25zdCB1aW50MzJfdCAqKSBrZXkpOworCXJhd2tleTEgPSBudG9obCgqKGNvbnN0IHVpbnQzMl90ICopIChrZXkgKyA0KSk7CisKKyNpZiBVU0VfUkVQRVRJVElWRV9TUEVFRFVQCisJaWYgKChyYXdrZXkwIHwgcmF3a2V5MSkKKwkgJiYgcmF3a2V5MCA9PSBvbGRfcmF3a2V5MAorCSAmJiByYXdrZXkxID09IG9sZF9yYXdrZXkxCisJKSB7CisJCS8qCisJCSAqIEFscmVhZHkgc2V0dXAgZm9yIHRoaXMga2V5LgorCQkgKiBUaGlzIG9wdGltaXNhdGlvbiBmYWlscyBvbiBhIHplcm8ga2V5ICh3aGljaCBpcyB3ZWFrIGFuZAorCQkgKiBoYXMgYmFkIHBhcml0eSBhbnl3YXkpIGluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBzdGFydGluZworCQkgKiBjb25kaXRpb25zLgorCQkgKi8KKwkJcmV0dXJuOworCX0KKwlvbGRfcmF3a2V5MCA9IHJhd2tleTA7CisJb2xkX3Jhd2tleTEgPSByYXdrZXkxOworI2VuZGlmCisKKwkvKgorCSAqIERvIGtleSBwZXJtdXRhdGlvbiBhbmQgc3BsaXQgaW50byB0d28gMjgtYml0IHN1YmtleXMuCisJICovCisJazAgPSBrZXlfcGVybV9tYXNrbFswXVtyYXdrZXkwID4+IDI1XQorCSAgIHwga2V5X3Blcm1fbWFza2xbMV1bKHJhd2tleTAgPj4gMTcpICYgMHg3Zl0KKwkgICB8IGtleV9wZXJtX21hc2tsWzJdWyhyYXdrZXkwID4+IDkpICYgMHg3Zl0KKwkgICB8IGtleV9wZXJtX21hc2tsWzNdWyhyYXdrZXkwID4+IDEpICYgMHg3Zl0KKwkgICB8IGtleV9wZXJtX21hc2tsWzRdW3Jhd2tleTEgPj4gMjVdCisJICAgfCBrZXlfcGVybV9tYXNrbFs1XVsocmF3a2V5MSA+PiAxNykgJiAweDdmXQorCSAgIHwga2V5X3Blcm1fbWFza2xbNl1bKHJhd2tleTEgPj4gOSkgJiAweDdmXQorCSAgIHwga2V5X3Blcm1fbWFza2xbN11bKHJhd2tleTEgPj4gMSkgJiAweDdmXTsKKwlrMSA9IGtleV9wZXJtX21hc2tyWzBdW3Jhd2tleTAgPj4gMjVdCisJICAgfCBrZXlfcGVybV9tYXNrclsxXVsocmF3a2V5MCA+PiAxNykgJiAweDdmXQorCSAgIHwga2V5X3Blcm1fbWFza3JbMl1bKHJhd2tleTAgPj4gOSkgJiAweDdmXQorCSAgIHwga2V5X3Blcm1fbWFza3JbM11bKHJhd2tleTAgPj4gMSkgJiAweDdmXQorCSAgIHwga2V5X3Blcm1fbWFza3JbNF1bcmF3a2V5MSA+PiAyNV0KKwkgICB8IGtleV9wZXJtX21hc2tyWzVdWyhyYXdrZXkxID4+IDE3KSAmIDB4N2ZdCisJICAgfCBrZXlfcGVybV9tYXNrcls2XVsocmF3a2V5MSA+PiA5KSAmIDB4N2ZdCisJICAgfCBrZXlfcGVybV9tYXNrcls3XVsocmF3a2V5MSA+PiAxKSAmIDB4N2ZdOworCS8qCisJICogUm90YXRlIHN1YmtleXMgYW5kIGRvIGNvbXByZXNzaW9uIHBlcm11dGF0aW9uLgorCSAqLworCXNoaWZ0cyA9IDA7CisJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTY7IHJvdW5kKyspIHsKKwkJdWludDMyX3QgdDAsIHQxOworCisJCXNoaWZ0cyArPSBrZXlfc2hpZnRzW3JvdW5kXTsKKworCQl0MCA9IChrMCA8PCBzaGlmdHMpIHwgKGswID4+ICgyOCAtIHNoaWZ0cykpOworCQl0MSA9IChrMSA8PCBzaGlmdHMpIHwgKGsxID4+ICgyOCAtIHNoaWZ0cykpOworCisjaWYgVVNFX2RlX2tleXMKKwkJZGVfa2V5c2xbMTUgLSByb3VuZF0gPQorI2VuZGlmCisJCWVuX2tleXNsW3JvdW5kXSA9IGNvbXBfbWFza2xbMF1bKHQwID4+IDIxKSAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tsWzFdWyh0MCA+PiAxNCkgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrbFsyXVsodDAgPj4gNykgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrbFszXVt0MCAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tsWzRdWyh0MSA+PiAyMSkgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrbFs1XVsodDEgPj4gMTQpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza2xbNl1bKHQxID4+IDcpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza2xbN11bdDEgJiAweDdmXTsKKworI2lmIFVTRV9kZV9rZXlzCisJCWRlX2tleXNyWzE1IC0gcm91bmRdID0KKyNlbmRpZgorCQllbl9rZXlzcltyb3VuZF0gPSBjb21wX21hc2tyWzBdWyh0MCA+PiAyMSkgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrclsxXVsodDAgPj4gMTQpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza3JbMl1bKHQwID4+IDcpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza3JbM11bdDAgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrcls0XVsodDEgPj4gMjEpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza3JbNV1bKHQxID4+IDE0KSAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tyWzZdWyh0MSA+PiA3KSAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tyWzddW3QxICYgMHg3Zl07CisJfQorfQorCisKK3N0YXRpYyB2b2lkCitkb19kZXMoc3RydWN0IGRlc19jdHggKmN0eCwgLyp1aW50MzJfdCBsX2luLCB1aW50MzJfdCByX2luLCovIHVpbnQzMl90ICpsX291dCwgdWludDMyX3QgKnJfb3V0LCBpbnQgY291bnQpCit7CisJY29uc3Qgc3RydWN0IGNvbnN0X2Rlc19jdHggKmNjdHggPSBjb25zdF9jdHg7CisJLyoKKwkgKiBsX2luLCByX2luLCBsX291dCwgYW5kIHJfb3V0IGFyZSBpbiBwc2V1ZG8tImJpZy1lbmRpYW4iIGZvcm1hdC4KKwkgKi8KKwl1aW50MzJfdCBsLCByLCAqa2wsICprcjsKKwl1aW50MzJfdCBmID0gZjsgLyogc2lsZW5jZSBnY2MgKi8KKwl1aW50MzJfdCByNDhsLCByNDhyOworCWludCByb3VuZDsKKworCS8qIERvIGluaXRpYWwgcGVybXV0YXRpb24gKElQKS4gKi8KKyNpZiBVU0VfaXBfbWFzaworCXVpbnQzMl90IGxfaW4gPSAwOworCXVpbnQzMl90IHJfaW4gPSAwOworCWwgPSBpcF9tYXNrbFswXVtsX2luID4+IDI0XQorCSAgfCBpcF9tYXNrbFsxXVsobF9pbiA+PiAxNikgJiAweGZmXQorCSAgfCBpcF9tYXNrbFsyXVsobF9pbiA+PiA4KSAmIDB4ZmZdCisJICB8IGlwX21hc2tsWzNdW2xfaW4gJiAweGZmXQorCSAgfCBpcF9tYXNrbFs0XVtyX2luID4+IDI0XQorCSAgfCBpcF9tYXNrbFs1XVsocl9pbiA+PiAxNikgJiAweGZmXQorCSAgfCBpcF9tYXNrbFs2XVsocl9pbiA+PiA4KSAmIDB4ZmZdCisJICB8IGlwX21hc2tsWzddW3JfaW4gJiAweGZmXTsKKwlyID0gaXBfbWFza3JbMF1bbF9pbiA+PiAyNF0KKwkgIHwgaXBfbWFza3JbMV1bKGxfaW4gPj4gMTYpICYgMHhmZl0KKwkgIHwgaXBfbWFza3JbMl1bKGxfaW4gPj4gOCkgJiAweGZmXQorCSAgfCBpcF9tYXNrclszXVtsX2luICYgMHhmZl0KKwkgIHwgaXBfbWFza3JbNF1bcl9pbiA+PiAyNF0KKwkgIHwgaXBfbWFza3JbNV1bKHJfaW4gPj4gMTYpICYgMHhmZl0KKwkgIHwgaXBfbWFza3JbNl1bKHJfaW4gPj4gOCkgJiAweGZmXQorCSAgfCBpcF9tYXNrcls3XVtyX2luICYgMHhmZl07CisjZWxpZiAwIC8qIC02NSBieXRlcyAodXNpbmcgdGhlIGZhY3QgdGhhdCBsX2luID09IHJfaW4gPT0gMCkgKi8KKwlsID0gciA9IDA7CisJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgODsgcm91bmQrKykgeworCQlsIHw9IGlwX21hc2tsW3JvdW5kXVswXTsKKwkJciB8PSBpcF9tYXNrcltyb3VuZF1bMF07CisJfQorCWJiX2Vycm9yX21zZygibDoleCByOiV4IiwgbCwgcik7IC8qIHJlcG9ydHMgMCwgMCBhbHdheXMhICovCisjZWxzZSAvKiB1c2luZyB0aGUgZmFjdCB0aGF0IGlwX21hc2tYW10gaXMgY29uc3RhbnQgKHdyaXR0ZW4gdG8gYnkgZGVzX2luaXQpICovCisJbCA9IHIgPSAwOworI2VuZGlmCisKKwlkbyB7CisJCS8qIERvIGVhY2ggcm91bmQuICovCisJCWtsID0gZW5fa2V5c2w7CisJCWtyID0gZW5fa2V5c3I7CisJCXJvdW5kID0gMTY7CisJCWRvIHsKKwkJCS8qIEV4cGFuZCBSIHRvIDQ4IGJpdHMgKHNpbXVsYXRlIHRoZSBFLWJveCkuICovCisJCQlyNDhsCT0gKChyICYgMHgwMDAwMDAwMSkgPDwgMjMpCisJCQkJfCAoKHIgJiAweGY4MDAwMDAwKSA+PiA5KQorCQkJCXwgKChyICYgMHgxZjgwMDAwMCkgPj4gMTEpCisJCQkJfCAoKHIgJiAweDAxZjgwMDAwKSA+PiAxMykKKwkJCQl8ICgociAmIDB4MDAxZjgwMDApID4+IDE1KTsKKworCQkJcjQ4cgk9ICgociAmIDB4MDAwMWY4MDApIDw8IDcpCisJCQkJfCAoKHIgJiAweDAwMDAxZjgwKSA8PCA1KQorCQkJCXwgKChyICYgMHgwMDAwMDFmOCkgPDwgMykKKwkJCQl8ICgociAmIDB4MDAwMDAwMWYpIDw8IDEpCisJCQkJfCAoKHIgJiAweDgwMDAwMDAwKSA+PiAzMSk7CisJCQkvKgorCQkJICogRG8gc2FsdGluZyBmb3IgY3J5cHQoKSBhbmQgZnJpZW5kcywgYW5kCisJCQkgKiBYT1Igd2l0aCB0aGUgcGVybXV0ZWQga2V5LgorCQkJICovCisJCQlmID0gKHI0OGwgXiByNDhyKSAmIHNhbHRiaXRzOworCQkJcjQ4bCBePSBmIF4gKmtsKys7CisJCQlyNDhyIF49IGYgXiAqa3IrKzsKKwkJCS8qCisJCQkgKiBEbyBzYm94IGxvb2t1cHMgKHdoaWNoIHNocmluayBpdCBiYWNrIHRvIDMyIGJpdHMpCisJCQkgKiBhbmQgZG8gdGhlIHBib3ggcGVybXV0YXRpb24gYXQgdGhlIHNhbWUgdGltZS4KKwkJCSAqLworCQkJZiA9IHBzYm94WzBdW21fc2JveFswXVtyNDhsID4+IDEyXV0KKwkJCSAgfCBwc2JveFsxXVttX3Nib3hbMV1bcjQ4bCAmIDB4ZmZmXV0KKwkJCSAgfCBwc2JveFsyXVttX3Nib3hbMl1bcjQ4ciA+PiAxMl1dCisJCQkgIHwgcHNib3hbM11bbV9zYm94WzNdW3I0OHIgJiAweGZmZl1dOworCQkJLyogTm93IHRoYXQgd2UndmUgcGVybXV0ZWQgdGhpbmdzLCBjb21wbGV0ZSBmKCkuICovCisJCQlmIF49IGw7CisJCQlsID0gcjsKKwkJCXIgPSBmOworCQl9IHdoaWxlICgtLXJvdW5kKTsKKwkJciA9IGw7CisJCWwgPSBmOworCX0gd2hpbGUgKC0tY291bnQpOworCisJLyogRG8gZmluYWwgcGVybXV0YXRpb24gKGludmVyc2Ugb2YgSVApLiAqLworCSpsX291dAk9IGZwX21hc2tsWzBdW2wgPj4gMjRdCisJCXwgZnBfbWFza2xbMV1bKGwgPj4gMTYpICYgMHhmZl0KKwkJfCBmcF9tYXNrbFsyXVsobCA+PiA4KSAmIDB4ZmZdCisJCXwgZnBfbWFza2xbM11bbCAmIDB4ZmZdCisJCXwgZnBfbWFza2xbNF1bciA+PiAyNF0KKwkJfCBmcF9tYXNrbFs1XVsociA+PiAxNikgJiAweGZmXQorCQl8IGZwX21hc2tsWzZdWyhyID4+IDgpICYgMHhmZl0KKwkJfCBmcF9tYXNrbFs3XVtyICYgMHhmZl07CisJKnJfb3V0CT0gZnBfbWFza3JbMF1bbCA+PiAyNF0KKwkJfCBmcF9tYXNrclsxXVsobCA+PiAxNikgJiAweGZmXQorCQl8IGZwX21hc2tyWzJdWyhsID4+IDgpICYgMHhmZl0KKwkJfCBmcF9tYXNrclszXVtsICYgMHhmZl0KKwkJfCBmcF9tYXNrcls0XVtyID4+IDI0XQorCQl8IGZwX21hc2tyWzVdWyhyID4+IDE2KSAmIDB4ZmZdCisJCXwgZnBfbWFza3JbNl1bKHIgPj4gOCkgJiAweGZmXQorCQl8IGZwX21hc2tyWzddW3IgJiAweGZmXTsKK30KKworI2RlZmluZSBERVNfT1VUX0JVRlNJWkUgMjEKKworc3RhdGljIHZvaWQKK3RvNjRfbXNiX2ZpcnN0KGNoYXIgKnMsIHVuc2lnbmVkIHYpCit7CisjaWYgMAorCSpzKysgPSBhc2NpaTY0Wyh2ID4+IDE4KSAmIDB4M2ZdOyAvKiBiaXRzIDIzLi4xOCAqLworCSpzKysgPSBhc2NpaTY0Wyh2ID4+IDEyKSAmIDB4M2ZdOyAvKiBiaXRzIDE3Li4xMiAqLworCSpzKysgPSBhc2NpaTY0Wyh2ID4+IDYpICYgMHgzZl07IC8qIGJpdHMgMTEuLjYgKi8KKwkqcyAgID0gYXNjaWk2NFt2ICYgMHgzZl07IC8qIGJpdHMgNS4uMCAqLworI2VuZGlmCisJKnMrKyA9IGk2NGModiA+PiAxOCk7IC8qIGJpdHMgMjMuLjE4ICovCisJKnMrKyA9IGk2NGModiA+PiAxMik7IC8qIGJpdHMgMTcuLjEyICovCisJKnMrKyA9IGk2NGModiA+PiA2KTsgLyogYml0cyAxMS4uNiAqLworCSpzICAgPSBpNjRjKHYpOyAvKiBiaXRzIDUuLjAgKi8KK30KKworc3RhdGljIGNoYXIgKgorTk9JTkxJTkUKK2Rlc19jcnlwdChzdHJ1Y3QgZGVzX2N0eCAqY3R4LCBjaGFyIG91dHB1dFtERVNfT1VUX0JVRlNJWkVdLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNldHRpbmcpCit7CisJdWludDMyX3Qgc2FsdCwgcjAsIHIxLCBrZXlidWZbMl07CisJdWludDhfdCAqcTsKKworCS8qCisJICogQ29weSB0aGUga2V5LCBzaGlmdGluZyBlYWNoIGNoYXJhY3RlciB1cCBieSBvbmUgYml0CisJICogYW5kIHBhZGRpbmcgd2l0aCB6ZXJvcy4KKwkgKi8KKwlxID0gKHVpbnQ4X3QgKilrZXlidWY7CisJd2hpbGUgKHEgLSAodWludDhfdCAqKWtleWJ1ZiAhPSA4KSB7CisJCSpxID0gKmtleSA8PCAxOworCQlpZiAoKnEpCisJCQlrZXkrKzsKKwkJcSsrOworCX0KKwlkZXNfc2V0a2V5KGN0eCwgKGNoYXIgKilrZXlidWYpOworCisJLyoKKwkgKiBzZXR0aW5nIC0gMiBieXRlcyBvZiBzYWx0CisJICoga2V5IC0gdXAgdG8gOCBjaGFyYWN0ZXJzCisJICovCisJc2FsdCA9IChhc2NpaV90b19iaW4oc2V0dGluZ1sxXSkgPDwgNikKKwkgICAgIHwgIGFzY2lpX3RvX2JpbihzZXR0aW5nWzBdKTsKKworCW91dHB1dFswXSA9IHNldHRpbmdbMF07CisJLyoKKwkgKiBJZiB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkIHRoYXQgdGhlIHNhbHQgd2FzIGV4dHJhY3RlZCBmcm9tCisJICogaXMgb25seSAxIGNoYXJhY3RlciBsb25nLCB0aGUgc2FsdCB3aWxsIGJlIGNvcnJ1cHRlZC4gIFdlCisJICogbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0IHN0cmluZyBkb2Vzbid0IGhhdmUgYW4gZXh0cmEKKwkgKiBOVUwgaW4gaXQhCisJICovCisJb3V0cHV0WzFdID0gc2V0dGluZ1sxXSA/IHNldHRpbmdbMV0gOiBvdXRwdXRbMF07CisKKwlzZXR1cF9zYWx0KGN0eCwgc2FsdCk7CisJLyogRG8gaXQuICovCisJZG9fZGVzKGN0eCwgLyowLCAwLCovICZyMCwgJnIxLCAyNSAvKiBjb3VudCAqLyk7CisKKwkvKiBOb3cgZW5jb2RlIHRoZSByZXN1bHQuICovCisjaWYgMAoreworCXVpbnQzMl90IGwgPSAocjAgPj4gOCk7CisJcSA9ICh1aW50OF90ICopb3V0cHV0ICsgMjsKKwkqcSsrID0gYXNjaWk2NFsobCA+PiAxOCkgJiAweDNmXTsgLyogYml0cyAzMS4uMjYgb2YgcjAgKi8KKwkqcSsrID0gYXNjaWk2NFsobCA+PiAxMikgJiAweDNmXTsgLyogYml0cyAyNS4uMjAgb2YgcjAgKi8KKwkqcSsrID0gYXNjaWk2NFsobCA+PiA2KSAmIDB4M2ZdOyAvKiBiaXRzIDE5Li4xNCBvZiByMCAqLworCSpxKysgPSBhc2NpaTY0W2wgJiAweDNmXTsgLyogYml0cyAxMy4uOCBvZiByMCAqLworCWwgPSAoKHIwIDw8IDE2KSB8IChyMSA+PiAxNikpOworCSpxKysgPSBhc2NpaTY0WyhsID4+IDE4KSAmIDB4M2ZdOyAvKiBiaXRzIDcuLjIgb2YgcjAgKi8KKwkqcSsrID0gYXNjaWk2NFsobCA+PiAxMikgJiAweDNmXTsgLyogYml0cyAxLi4yIG9mIHIwIGFuZCAzMS4uMjggb2YgcjEgKi8KKwkqcSsrID0gYXNjaWk2NFsobCA+PiA2KSAmIDB4M2ZdOyAvKiBiaXRzIDI3Li4yMiBvZiByMSAqLworCSpxKysgPSBhc2NpaTY0W2wgJiAweDNmXTsgLyogYml0cyAyMS4uMTYgb2YgcjEgKi8KKwlsID0gcjEgPDwgMjsKKwkqcSsrID0gYXNjaWk2NFsobCA+PiAxMikgJiAweDNmXTsgLyogYml0cyAxNS4uMTAgb2YgcjEgKi8KKwkqcSsrID0gYXNjaWk2NFsobCA+PiA2KSAmIDB4M2ZdOyAvKiBiaXRzIDkuLjQgb2YgcjEgKi8KKwkqcSsrID0gYXNjaWk2NFtsICYgMHgzZl07IC8qIGJpdHMgMy4uMCBvZiByMSArIDAwICovCisJKnEgPSAwOworfQorI2Vsc2UKKwkvKiBFYWNoIGNhbGwgdGFrZXMgbG93LW9yZGVyIDI0IGJpdHMgYW5kIHN0b3JlcyA0IGNoYXJzICovCisJLyogYml0cyAzMS4uOCBvZiByMCAqLworCXRvNjRfbXNiX2ZpcnN0KG91dHB1dCArIDIsIChyMCA+PiA4KSk7CisJLyogYml0cyA3Li4wIG9mIHIwIGFuZCAzMS4uMTYgb2YgcjEgKi8KKwl0bzY0X21zYl9maXJzdChvdXRwdXQgKyA2LCAocjAgPDwgMTYpIHwgKHIxID4+IDE2KSk7CisJLyogYml0cyAxNS4uMCBvZiByMSBhbmQgdHdvIHplcm8gYml0cyAocGx1cyBleHRyYSB6ZXJvIGJ5dGUpICovCisJdG82NF9tc2JfZmlyc3Qob3V0cHV0ICsgMTAsIChyMSA8PCA4KSk7CisJLyogZXh0cmEgemVybyBieXRlIGlzIGVuY29kZWQgYXMgJy4nLCBmaXhpbmcgaXQgKi8KKwlvdXRwdXRbMTNdID0gJ1wwJzsKKyNlbmRpZgorCisJcmV0dXJuIG91dHB1dDsKK30KKworI3VuZGVmIFVTRV9QUkVDT01QVVRFRF91X3Nib3gKKyN1bmRlZiBVU0VfUkVQRVRJVElWRV9TUEVFRFVQCisjdW5kZWYgVVNFX2lwX21hc2sKKyN1bmRlZiBVU0VfZGVfa2V5cworCisjdW5kZWYgQworI3VuZGVmIGluaXRfcGVybQorI3VuZGVmIGZpbmFsX3Blcm0KKyN1bmRlZiBtX3Nib3gKKyN1bmRlZiBECisjdW5kZWYgY29uc3RfY3R4CisjdW5kZWYgc2FsdGJpdHMKKyN1bmRlZiBvbGRfc2FsdAorI3VuZGVmIG9sZF9yYXdrZXkwCisjdW5kZWYgb2xkX3Jhd2tleTEKKyN1bmRlZiB1bl9wYm94CisjdW5kZWYgaW52X2NvbXBfcGVybQorI3VuZGVmIGludl9rZXlfcGVybQorI3VuZGVmIGVuX2tleXNsCisjdW5kZWYgZW5fa2V5c3IKKyN1bmRlZiBkZV9rZXlzbAorI3VuZGVmIGRlX2tleXNyCisjdW5kZWYgaXBfbWFza2wKKyN1bmRlZiBpcF9tYXNrcgorI3VuZGVmIGZwX21hc2tsCisjdW5kZWYgZnBfbWFza3IKKyN1bmRlZiBrZXlfcGVybV9tYXNrbAorI3VuZGVmIGtleV9wZXJtX21hc2tyCisjdW5kZWYgY29tcF9tYXNrbAorI3VuZGVmIGNvbXBfbWFza3IKKyN1bmRlZiBwc2JveApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcHdfZW5jcnlwdF9tZDUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3B3X2VuY3J5cHRfbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5ZTA5YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3B3X2VuY3J5cHRfbWQ1LmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBNRDVDLkMgLSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgTUQ1IG1lc3NhZ2UtZGlnZXN0IGFsZ29yaXRobQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0yLCBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBDcmVhdGVkIDE5OTEuIEFsbAorICogcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2UgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGF0IGl0CisgKiBpcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0CisgKiBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgc29mdHdhcmUKKyAqIG9yIHRoaXMgZnVuY3Rpb24uCisgKgorICogTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgcHJvdmlkZWQKKyAqIHRoYXQgc3VjaCB3b3JrcyBhcmUgaWRlbnRpZmllZCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YQorICogU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsCisgKiBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoZSBkZXJpdmVkIHdvcmsuCisgKgorICogUlNBIERhdGEgU2VjdXJpdHksIEluYy4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGNvbmNlcm5pbmcgZWl0aGVyCisgKiB0aGUgbWVyY2hhbnRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgb3IgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSBvZiBhbnkga2luZC4KKyAqCisgKiBUaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJtZC9tZDVjLmMsdiAxLjkuMi4xIDE5OTkvMDgvMjkgMTQ6NTc6MTIgcGV0ZXIgRXhwICQKKyAqCisgKiBUaGlzIGNvZGUgaXMgdGhlIHNhbWUgYXMgdGhlIGNvZGUgcHVibGlzaGVkIGJ5IFJTQSBJbmMuICBJdCBoYXMgYmVlbgorICogZWRpdGVkIGZvciBjbGFyaXR5IGFuZCBzdHlsZSBvbmx5LgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSBtZDVfY3J5cHQoKSBmdW5jdGlvbiB3YXMgdGFrZW4gZnJvbSBmcmVlQlNEJ3MgbGliY3J5cHQgYW5kIGNvbnRhaW5zCisgKiB0aGlzIGxpY2Vuc2U6CisgKiAgICAiVEhFIEJFRVItV0FSRSBMSUNFTlNFIiAoUmV2aXNpb24gNDIpOgorICogICAgIDxwaGtAbG9naW4uZGtuZXQuZGs+IHdyb3RlIHRoaXMgZmlsZS4gIEFzIGxvbmcgYXMgeW91IHJldGFpbiB0aGlzIG5vdGljZSB5b3UKKyAqICAgICBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIHN0dWZmLiBJZiB3ZSBtZWV0IHNvbWUgZGF5LCBhbmQgeW91IHRoaW5rCisgKiAgICAgdGhpcyBzdHVmZiBpcyB3b3J0aCBpdCwgeW91IGNhbiBidXkgbWUgYSBiZWVyIGluIHJldHVybi4gICBQb3VsLUhlbm5pbmcgS2FtcAorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmNyeXB0L2NyeXB0LmMsdiAxLjcuMi4xIDE5OTkvMDgvMjkgMTQ6NTY6MzMgcGV0ZXIgRXhwICQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPbiBBcHJpbCAxOXRoLCAyMDAxIG1kNV9jcnlwdCgpIHdhcyBtb2RpZmllZCB0byBtYWtlIGl0IHJlZW50cmFudAorICogYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AdWNsaWJjLm9yZz4KKyAqCisgKgorICogSnVuZSAyOCwgMjAwMSAgICAgICAgICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogIlVuLWlubGluZWQiIGNvZGUgdXNpbmcgbG9vcHMgYW5kIHN0YXRpYyBjb25zdCB0YWJsZXMgaW4gb3JkZXIgdG8KKyAqIHJlZHVjZSBnZW5lcmF0ZWQgY29kZSBzaXplIChvbiBpMzg2IGZyb20gYXBwcm94IDRrIHRvIGFwcHJveCAyLjVrKS4KKyAqCisgKiBKdW5lIDI5LCAyMDAxICAgICAgICAgICAgIE1hbnVlbCBOb3ZvYSBJSUkKKyAqCisgKiBDb21wbGV0ZWx5IHJlbW92ZWQgc3RhdGljIFBBRERJTkcgYXJyYXkuCisgKgorICogUmVpbnRyb2R1Y2VkIHRoZSBsb29wIHVucm9sbGluZyBpbiBNRDVfVHJhbnNmb3JtIGFuZCBhZGRlZCB0aGUKKyAqIE1ENV9TSVpFX09WRVJfU1BFRUQgb3B0aW9uIGZvciBjb25maWd1cmFiaWxpdHkuICBEZWZpbmUgYmVsb3cgYXM6CisgKiAgICAgICAwICAgIGZ1bGx5IHVucm9sbGVkIGxvb3BzCisgKiAgICAgICAxICAgIHBhcnRpYWxseSB1bnJvbGxlZCAoNCBvcHMgcGVyIGxvb3ApCisgKiAgICAgICAyICAgIG5vIHVucm9sbGluZyAtLSBpbnRyb2R1Y2VzIHRoZSBuZWVkIHRvIHN3YXAgNCB2YXJpYWJsZXMgKHNsb3cpCisgKiAgICAgICAzICAgIG5vIHVucm9sbGluZyBhbmQgYWxsIDQgbG9vcHMgbWVyZ2VkIGludG8gb25lIHdpdGggc3dpdGNoCisgKiAgICAgICAgICAgICAgIGluIGVhY2ggbG9vcCAoZ2xhY2lhbCkKKyAqIE9uIGkzODYsIHNpemVzIGFyZSByb3VnaGx5ICgtT3MgLWZuby1idWlsdGluKToKKyAqICAgICAwOiAzayAgICAgMTogMi41ayAgICAgMjogMi4yayAgICAgMzogMmsKKyAqCisgKiBTaW5jZSBTdVN2MyBkb2VzIG5vdCByZXF1aXJlIGNyeXB0X3IsIG1vZGlmaWVkIGFnYWluIEF1Z3VzdCA3LCAyMDAyCisgKiBieSBFcmlrIEFuZGVyc2VuIHRvIHJlbW92ZSByZWVudHJhbmNlIHN0dWZmLi4uCisgKi8KKworLyoKKyAqIFVOSVggcGFzc3dvcmQKKyAqCisgKiBVc2UgTUQ1IGZvciB3aGF0IGl0IGlzIGJlc3QgYXQuLi4KKyAqLworI2RlZmluZSBNRDVfT1VUX0JVRlNJWkUgMzYKK3N0YXRpYyBjaGFyICoKK05PSU5MSU5FCittZDVfY3J5cHQoY2hhciByZXN1bHRbTUQ1X09VVF9CVUZTSVpFXSwgY29uc3QgdW5zaWduZWQgY2hhciAqcHcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQpCit7CisJY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyIGZpbmFsWzE3XTsgLyogZmluYWxbMTZdIGV4aXN0cyBvbmx5IHRvIGFpZCBpbiBsb29waW5nICovCisJaW50IHNsLCBwbCwgaSwgcHdfbGVuOworCW1kNV9jdHhfdCBjdHgsIGN0eDE7CisKKwkvKiBOQjogaW4gYnVzeWJveCwgIiQxJCIgaW4gc2FsdCBpcyBhbHdheXMgcHJlc2VudCAqLworCisJLyogUmVmaW5lIHRoZSBTYWx0IGZpcnN0ICovCisKKwkvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgc2FsdCBpbmNsdWRpbmcgIiQxJCIgKi8KKwlzbCA9IDM7CisJd2hpbGUgKHNhbHRbc2xdICYmIHNhbHRbc2xdICE9ICckJyAmJiBzbCA8ICgzICsgOCkpCisJCXNsKys7CisKKwkvKiBIYXNoLiB0aGUgcGFzc3dvcmQgZmlyc3QsIHNpbmNlIHRoYXQgaXMgd2hhdCBpcyBtb3N0IHVua25vd24gKi8KKwltZDVfYmVnaW4oJmN0eCk7CisJcHdfbGVuID0gc3RybGVuKChjaGFyKilwdyk7CisJbWQ1X2hhc2goJmN0eCwgcHcsIHB3X2xlbik7CisKKwkvKiBUaGVuIHRoZSBzYWx0IGluY2x1ZGluZyAiJDEkIiAqLworCW1kNV9oYXNoKCZjdHgsIHNhbHQsIHNsKTsKKworCS8qIENvcHkgc2FsdCB0byByZXN1bHQ7IHNraXAgIiQxJCIgKi8KKwltZW1jcHkocmVzdWx0LCBzYWx0LCBzbCk7CisJcmVzdWx0W3NsXSA9ICckJzsKKwlzYWx0ICs9IDM7CisJc2wgLT0gMzsKKworCS8qIFRoZW4ganVzdCBhcyBtYW55IGNoYXJhY3RlcnMgb2YgdGhlIE1ENShwdywgc2FsdCwgcHcpICovCisJbWQ1X2JlZ2luKCZjdHgxKTsKKwltZDVfaGFzaCgmY3R4MSwgcHcsIHB3X2xlbik7CisJbWQ1X2hhc2goJmN0eDEsIHNhbHQsIHNsKTsKKwltZDVfaGFzaCgmY3R4MSwgcHcsIHB3X2xlbik7CisJbWQ1X2VuZCgmY3R4MSwgZmluYWwpOworCWZvciAocGwgPSBwd19sZW47IHBsID4gMDsgcGwgLT0gMTYpCisJCW1kNV9oYXNoKCZjdHgsIGZpbmFsLCBwbCA+IDE2ID8gMTYgOiBwbCk7CisKKwkvKiBUaGVuIHNvbWV0aGluZyByZWFsbHkgd2VpcmQuLi4gKi8KKwltZW1zZXQoZmluYWwsIDAsIHNpemVvZihmaW5hbCkpOworCWZvciAoaSA9IHB3X2xlbjsgaTsgaSA+Pj0gMSkgeworCQltZDVfaGFzaCgmY3R4LCAoKGkgJiAxKSA/IGZpbmFsIDogKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcHcpLCAxKTsKKwl9CisJbWQ1X2VuZCgmY3R4LCBmaW5hbCk7CisKKwkvKiBBbmQgbm93LCBqdXN0IHRvIG1ha2Ugc3VyZSB0aGluZ3MgZG9uJ3QgcnVuIHRvbyBmYXN0LgorCSAqIE9uIGEgNjAgTWh6IFBlbnRpdW0gdGhpcyB0YWtlcyAzNCBtc2VjLCBzbyB5b3Ugd291bGQKKwkgKiBuZWVkIDMwIHNlY29uZHMgdG8gYnVpbGQgYSAxMDAwIGVudHJ5IGRpY3Rpb25hcnkuLi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisJCW1kNV9iZWdpbigmY3R4MSk7CisJCWlmIChpICYgMSkKKwkJCW1kNV9oYXNoKCZjdHgxLCBwdywgcHdfbGVuKTsKKwkJZWxzZQorCQkJbWQ1X2hhc2goJmN0eDEsIGZpbmFsLCAxNik7CisKKwkJaWYgKGkgJSAzKQorCQkJbWQ1X2hhc2goJmN0eDEsIHNhbHQsIHNsKTsKKworCQlpZiAoaSAlIDcpCisJCQltZDVfaGFzaCgmY3R4MSwgcHcsIHB3X2xlbik7CisKKwkJaWYgKGkgJiAxKQorCQkJbWQ1X2hhc2goJmN0eDEsIGZpbmFsLCAxNik7CisJCWVsc2UKKwkJCW1kNV9oYXNoKCZjdHgxLCBwdywgcHdfbGVuKTsKKwkJbWQ1X2VuZCgmY3R4MSwgZmluYWwpOworCX0KKworCXAgPSByZXN1bHQgKyBzbCArIDQ7IC8qIDEyIGJ5dGVzIG1heCAoc2wgaXMgdXAgdG8gOCBieXRlcykgKi8KKworCS8qIEFkZCA1KjQrMiA9IDIyIGJ5dGVzIG9mIGhhc2gsICsgTlVMIGJ5dGUuICovCisJZmluYWxbMTZdID0gZmluYWxbNV07CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQl1bnNpZ25lZCBsID0gKGZpbmFsW2ldIDw8IDE2KSB8IChmaW5hbFtpKzZdIDw8IDgpIHwgZmluYWxbaSsxMl07CisJCXAgPSB0bzY0KHAsIGwsIDQpOworCX0KKwlwID0gdG82NChwLCBmaW5hbFsxMV0sIDIpOworCSpwID0gJ1wwJzsKKworCS8qIERvbid0IGxlYXZlIGFueXRoaW5nIGFyb3VuZCBpbiB2bSB0aGV5IGNvdWxkIHVzZS4gKi8KKwltZW1zZXQoZmluYWwsIDAsIHNpemVvZihmaW5hbCkpOworCisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3B3X2VuY3J5cHRfc2hhLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9wd19lbmNyeXB0X3NoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZWFhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9wd19lbmNyeXB0X3NoYS5jCkBAIC0wLDAgKzEsMjg2IEBACisvKiBTSEEyNTYgYW5kIFNIQTUxMi1iYXNlZCBVbml4IGNyeXB0IGltcGxlbWVudGF0aW9uLgorICogUmVsZWFzZWQgaW50byB0aGUgUHVibGljIERvbWFpbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPi4KKyAqLworCisvKiBQcmVmaXggZm9yIG9wdGlvbmFsIHJvdW5kcyBzcGVjaWZpY2F0aW9uLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHN0cl9yb3VuZHNbXSBBTElHTjEgPSAicm91bmRzPSV1JCI7CisKKy8qIE1heGltdW0gc2FsdCBzdHJpbmcgbGVuZ3RoLiAgKi8KKyNkZWZpbmUgU0FMVF9MRU5fTUFYIDE2CisvKiBEZWZhdWx0IG51bWJlciBvZiByb3VuZHMgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgUk9VTkRTX0RFRkFVTFQgNTAwMAorLyogTWluaW11bSBudW1iZXIgb2Ygcm91bmRzLiAgKi8KKyNkZWZpbmUgUk9VTkRTX01JTiAxMDAwCisvKiBNYXhpbXVtIG51bWJlciBvZiByb3VuZHMuICAqLworI2RlZmluZSBST1VORFNfTUFYIDk5OTk5OTk5OQorCitzdGF0aWMgY2hhciAqCitOT0lOTElORQorc2hhX2NyeXB0KC8qY29uc3QqLyBjaGFyICprZXlfZGF0YSwgLypjb25zdCovIGNoYXIgKnNhbHRfZGF0YSkKK3sKKwl2b2lkICgqc2hhX2JlZ2luKSh2b2lkICpjdHgpIEZBU1RfRlVOQzsKKwl2b2lkICgqc2hhX2hhc2gpKHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuKSBGQVNUX0ZVTkM7CisJdm9pZCAoKnNoYV9lbmQpKHZvaWQgKmN0eCwgdm9pZCAqcmVzYnVmKSBGQVNUX0ZVTkM7CisJaW50IF8zMm9yNjQ7CisKKwljaGFyICpyZXN1bHQsICpyZXNwdHI7CisKKwkvKiBidHcsIHNoYTI1NiBuZWVkcyBbMzJdIGFuZCB1aW50MzJfdCBvbmx5ICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBhbHRfcmVzdWx0WzY0XTsKKwkJdW5zaWduZWQgY2hhciB0ZW1wX3Jlc3VsdFs2NF07CisJCXVuaW9uIHsKKwkJCXNoYTI1Nl9jdHhfdCB4OworCQkJc2hhNTEyX2N0eF90IHk7CisJCX0gY3R4OworCQl1bmlvbiB7CisJCQlzaGEyNTZfY3R4X3QgeDsKKwkJCXNoYTUxMl9jdHhfdCB5OworCQl9IGFsdF9jdHg7CisJfSBMIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKF9fYWxpZ25vZl9fKHVpbnQ2NF90KSkpKTsKKyNkZWZpbmUgYWx0X3Jlc3VsdCAgKEwuYWx0X3Jlc3VsdCApCisjZGVmaW5lIHRlbXBfcmVzdWx0IChMLnRlbXBfcmVzdWx0KQorI2RlZmluZSBjdHggICAgICAgICAoTC5jdHggICAgICAgICkKKyNkZWZpbmUgYWx0X2N0eCAgICAgKEwuYWx0X2N0eCAgICApCisJdW5zaWduZWQgc2FsdF9sZW47CisJdW5zaWduZWQga2V5X2xlbjsKKwl1bnNpZ25lZCBjbnQ7CisJdW5zaWduZWQgcm91bmRzOworCWNoYXIgKmNwOworCWNoYXIgaXNfc2hhNTEyOworCisJLyogQW5hbHl6ZSBzYWx0LCBjb25zdHJ1Y3QgYWxyZWFkeSBrbm93biBwYXJ0IG9mIHJlc3VsdCAqLworCWNudCA9IHN0cmxlbihzYWx0X2RhdGEpICsgMSArIDQzICsgMTsKKwlpc19zaGE1MTIgPSBzYWx0X2RhdGFbMV07CisJaWYgKGlzX3NoYTUxMiA9PSAnNicpCisJCWNudCArPSA0MzsKKwlyZXN1bHQgPSByZXNwdHIgPSB4emFsbG9jKGNudCk7IC8qIHdpbGwgcHJvdmlkZSBOVUwgdGVybWluYXRvciAqLworCSpyZXNwdHIrKyA9ICckJzsKKwkqcmVzcHRyKysgPSBpc19zaGE1MTI7CisJKnJlc3B0cisrID0gJyQnOworCXJvdW5kcyA9IFJPVU5EU19ERUZBVUxUOworCXNhbHRfZGF0YSArPSAzOworCWlmIChzdHJuY21wKHNhbHRfZGF0YSwgc3RyX3JvdW5kcywgNykgPT0gMCkgeworCQkvKiA3ID09IHN0cmxlbigicm91bmRzPSIpICovCisJCWNoYXIgKmVuZHA7CisJCWNudCA9IGJiX3N0cnRvdShzYWx0X2RhdGEgKyA3LCAmZW5kcCwgMTApOworCQlpZiAoKmVuZHAgPT0gJyQnKSB7CisJCQlzYWx0X2RhdGEgPSBlbmRwICsgMTsKKwkJCXJvdW5kcyA9IGNudDsKKwkJCWlmIChyb3VuZHMgPCBST1VORFNfTUlOKQorCQkJCXJvdW5kcyA9IFJPVU5EU19NSU47CisJCQlpZiAocm91bmRzID4gUk9VTkRTX01BWCkKKwkJCQlyb3VuZHMgPSBST1VORFNfTUFYOworCQkJLyogYWRkICJyb3VuZHM9Tk5OTk4kIiB0byByZXN1bHQgKi8KKwkJCXJlc3B0ciArPSBzcHJpbnRmKHJlc3B0ciwgc3RyX3JvdW5kcywgcm91bmRzKTsKKwkJfQorCX0KKwlzYWx0X2xlbiA9IHN0cmNocm51bChzYWx0X2RhdGEsICckJykgLSBzYWx0X2RhdGE7CisJaWYgKHNhbHRfbGVuID4gU0FMVF9MRU5fTUFYKQorCQlzYWx0X2xlbiA9IFNBTFRfTEVOX01BWDsKKwkvKiB4c3RyZHVwIGFzc3VyZXMgc3VpdGFibGUgYWxpZ25tZW50OyBhbHNvIHdlIHdpbGwgdXNlIGl0CisJICAgYXMgYSBzY3JhdGNoIHNwYWNlIGxhdGVyLiAqLworCXNhbHRfZGF0YSA9IHhzdHJuZHVwKHNhbHRfZGF0YSwgc2FsdF9sZW4pOworCS8qIGFkZCAic2FsdCQiIHRvIHJlc3VsdCAqLworCXN0cmNweShyZXNwdHIsIHNhbHRfZGF0YSk7CisJcmVzcHRyICs9IHNhbHRfbGVuOworCSpyZXNwdHIrKyA9ICckJzsKKwkvKiBrZXkgZGF0YSBkb2Vzbid0IG5lZWQgbXVjaCBwcm9jZXNzaW5nICovCisJa2V5X2xlbiA9IHN0cmxlbihrZXlfZGF0YSk7CisJa2V5X2RhdGEgPSB4c3RyZHVwKGtleV9kYXRhKTsKKworCS8qIFdoaWNoIGZsYXZvciBvZiBTSEFubm4gb3BzIHRvIHVzZT8gKi8KKwlzaGFfYmVnaW4gPSAodm9pZCopc2hhMjU2X2JlZ2luOworCXNoYV9oYXNoID0gKHZvaWQqKXNoYTI1Nl9oYXNoOworCXNoYV9lbmQgPSAodm9pZCopc2hhMjU2X2VuZDsKKwlfMzJvcjY0ID0gMzI7CisJaWYgKGlzX3NoYTUxMiA9PSAnNicpIHsKKwkJc2hhX2JlZ2luID0gKHZvaWQqKXNoYTUxMl9iZWdpbjsKKwkJc2hhX2hhc2ggPSAodm9pZCopc2hhNTEyX2hhc2g7CisJCXNoYV9lbmQgPSAodm9pZCopc2hhNTEyX2VuZDsKKwkJXzMyb3I2NCA9IDY0OworCX0KKworCS8qIEFkZCBLRVksIFNBTFQuICAqLworCXNoYV9iZWdpbigmY3R4KTsKKwlzaGFfaGFzaCgmY3R4LCBrZXlfZGF0YSwga2V5X2xlbik7CisJc2hhX2hhc2goJmN0eCwgc2FsdF9kYXRhLCBzYWx0X2xlbik7CisKKwkvKiBDb21wdXRlIGFsdGVybmF0ZSBTSEEgc3VtIHdpdGggaW5wdXQgS0VZLCBTQUxULCBhbmQgS0VZLgorCSAgIFRoZSBmaW5hbCByZXN1bHQgd2lsbCBiZSBhZGRlZCB0byB0aGUgZmlyc3QgY29udGV4dC4gICovCisJc2hhX2JlZ2luKCZhbHRfY3R4KTsKKwlzaGFfaGFzaCgmYWx0X2N0eCwga2V5X2RhdGEsIGtleV9sZW4pOworCXNoYV9oYXNoKCZhbHRfY3R4LCBzYWx0X2RhdGEsIHNhbHRfbGVuKTsKKwlzaGFfaGFzaCgmYWx0X2N0eCwga2V5X2RhdGEsIGtleV9sZW4pOworCXNoYV9lbmQoJmFsdF9jdHgsIGFsdF9yZXN1bHQpOworCisJLyogQWRkIHJlc3VsdCBvZiB0aGlzIHRvIHRoZSBvdGhlciBjb250ZXh0LiAgKi8KKwkvKiBBZGQgZm9yIGFueSBjaGFyYWN0ZXIgaW4gdGhlIGtleSBvbmUgYnl0ZSBvZiB0aGUgYWx0ZXJuYXRlIHN1bS4gICovCisJZm9yIChjbnQgPSBrZXlfbGVuOyBjbnQgPiBfMzJvcjY0OyBjbnQgLT0gXzMyb3I2NCkKKwkJc2hhX2hhc2goJmN0eCwgYWx0X3Jlc3VsdCwgXzMyb3I2NCk7CisJc2hhX2hhc2goJmN0eCwgYWx0X3Jlc3VsdCwgY250KTsKKworCS8qIFRha2UgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYW5kIGZvciBldmVyeQorCSAgIDEgYWRkIHRoZSBhbHRlcm5hdGUgc3VtLCBmb3IgZXZlcnkgMCB0aGUga2V5LiAgKi8KKwlmb3IgKGNudCA9IGtleV9sZW47IGNudCAhPSAwOyBjbnQgPj49IDEpCisJCWlmICgoY250ICYgMSkgIT0gMCkKKwkJCXNoYV9oYXNoKCZjdHgsIGFsdF9yZXN1bHQsIF8zMm9yNjQpOworCQllbHNlCisJCQlzaGFfaGFzaCgmY3R4LCBrZXlfZGF0YSwga2V5X2xlbik7CisKKwkvKiBDcmVhdGUgaW50ZXJtZWRpYXRlIHJlc3VsdC4gICovCisJc2hhX2VuZCgmY3R4LCBhbHRfcmVzdWx0KTsKKworCS8qIFN0YXJ0IGNvbXB1dGF0aW9uIG9mIFAgYnl0ZSBzZXF1ZW5jZS4gICovCisJLyogRm9yIGV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUgcGFzc3dvcmQgYWRkIHRoZSBlbnRpcmUgcGFzc3dvcmQuICAqLworCXNoYV9iZWdpbigmYWx0X2N0eCk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBrZXlfbGVuOyArK2NudCkKKwkJc2hhX2hhc2goJmFsdF9jdHgsIGtleV9kYXRhLCBrZXlfbGVuKTsKKwlzaGFfZW5kKCZhbHRfY3R4LCB0ZW1wX3Jlc3VsdCk7CisKKwkvKiBOQjogcGFzdCB0aGlzIHBvaW50LCByYXcga2V5X2RhdGEgaXMgbm90IHVzZWQgYW55bW9yZSAqLworCisJLyogQ3JlYXRlIGJ5dGUgc2VxdWVuY2UgUC4gICovCisjZGVmaW5lIHBfYnl0ZXMga2V5X2RhdGEgLyogcmV1c2UgdGhlIGJ1ZmZlciBhcyBpdCBpcyBvZiB0aGUga2V5X2xlbiBzaXplICovCisJY3AgPSBwX2J5dGVzOyAvKiB3YXM6IC4uLiA9IGFsbG9jYShrZXlfbGVuKTsgKi8KKwlmb3IgKGNudCA9IGtleV9sZW47IGNudCA+PSBfMzJvcjY0OyBjbnQgLT0gXzMyb3I2NCkgeworCQljcCA9IG1lbWNweShjcCwgdGVtcF9yZXN1bHQsIF8zMm9yNjQpOworCQljcCArPSBfMzJvcjY0OworCX0KKwltZW1jcHkoY3AsIHRlbXBfcmVzdWx0LCBjbnQpOworCisJLyogU3RhcnQgY29tcHV0YXRpb24gb2YgUyBieXRlIHNlcXVlbmNlLiAgKi8KKwkvKiBGb3IgZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBwYXNzd29yZCBhZGQgdGhlIGVudGlyZSBwYXNzd29yZC4gICovCisJc2hhX2JlZ2luKCZhbHRfY3R4KTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDE2ICsgYWx0X3Jlc3VsdFswXTsgKytjbnQpCisJCXNoYV9oYXNoKCZhbHRfY3R4LCBzYWx0X2RhdGEsIHNhbHRfbGVuKTsKKwlzaGFfZW5kKCZhbHRfY3R4LCB0ZW1wX3Jlc3VsdCk7CisKKwkvKiBOQjogcGFzdCB0aGlzIHBvaW50LCByYXcgc2FsdF9kYXRhIGlzIG5vdCB1c2VkIGFueW1vcmUgKi8KKworCS8qIENyZWF0ZSBieXRlIHNlcXVlbmNlIFMuICAqLworI2RlZmluZSBzX2J5dGVzIHNhbHRfZGF0YSAvKiByZXVzZSB0aGUgYnVmZmVyIGFzIGl0IGlzIG9mIHRoZSBzYWx0X2xlbiBzaXplICovCisJY3AgPSBzX2J5dGVzOyAvKiB3YXM6IC4uLiA9IGFsbG9jYShzYWx0X2xlbik7ICovCisJZm9yIChjbnQgPSBzYWx0X2xlbjsgY250ID49IF8zMm9yNjQ7IGNudCAtPSBfMzJvcjY0KSB7CisJCWNwID0gbWVtY3B5KGNwLCB0ZW1wX3Jlc3VsdCwgXzMyb3I2NCk7CisJCWNwICs9IF8zMm9yNjQ7CisJfQorCW1lbWNweShjcCwgdGVtcF9yZXN1bHQsIGNudCk7CisKKwkvKiBSZXBlYXRlZGx5IHJ1biB0aGUgY29sbGVjdGVkIGhhc2ggdmFsdWUgdGhyb3VnaCBTSEEgdG8gYnVybgorCSAgIENQVSBjeWNsZXMuICAqLworCWZvciAoY250ID0gMDsgY250IDwgcm91bmRzOyArK2NudCkgeworCQlzaGFfYmVnaW4oJmN0eCk7CisKKwkJLyogQWRkIGtleSBvciBsYXN0IHJlc3VsdC4gICovCisJCWlmICgoY250ICYgMSkgIT0gMCkKKwkJCXNoYV9oYXNoKCZjdHgsIHBfYnl0ZXMsIGtleV9sZW4pOworCQllbHNlCisJCQlzaGFfaGFzaCgmY3R4LCBhbHRfcmVzdWx0LCBfMzJvcjY0KTsKKwkJLyogQWRkIHNhbHQgZm9yIG51bWJlcnMgbm90IGRpdmlzaWJsZSBieSAzLiAgKi8KKwkJaWYgKGNudCAlIDMgIT0gMCkKKwkJCXNoYV9oYXNoKCZjdHgsIHNfYnl0ZXMsIHNhbHRfbGVuKTsKKwkJLyogQWRkIGtleSBmb3IgbnVtYmVycyBub3QgZGl2aXNpYmxlIGJ5IDcuICAqLworCQlpZiAoY250ICUgNyAhPSAwKQorCQkJc2hhX2hhc2goJmN0eCwgcF9ieXRlcywga2V5X2xlbik7CisJCS8qIEFkZCBrZXkgb3IgbGFzdCByZXN1bHQuICAqLworCQlpZiAoKGNudCAmIDEpICE9IDApCisJCQlzaGFfaGFzaCgmY3R4LCBhbHRfcmVzdWx0LCBfMzJvcjY0KTsKKwkJZWxzZQorCQkJc2hhX2hhc2goJmN0eCwgcF9ieXRlcywga2V5X2xlbik7CisKKwkJc2hhX2VuZCgmY3R4LCBhbHRfcmVzdWx0KTsKKwl9CisKKwkvKiBBcHBlbmQgZW5jcnlwdGVkIHBhc3N3b3JkIHRvIHJlc3VsdCBidWZmZXIgKi8KKy8vVE9ETzogcmVwbGFjZSB3aXRoIHNvbWV0aGluZyBsaWtlCisvLwliYl91dWVuY29kZShjcCwgc3JjLCBsZW5ndGgsIGJiX3V1ZW5jX3RibF9YWFhiYXNlNjQpOworI2RlZmluZSBiNjRfZnJvbV8yNGJpdChCMiwgQjEsIEIwLCBOKSBcCitkbyB7IFwKKwl1bnNpZ25lZCB3ID0gKChCMikgPDwgMTYpIHwgKChCMSkgPDwgOCkgfCAoQjApOyBcCisJcmVzcHRyID0gdG82NChyZXNwdHIsIHcsIE4pOyBcCit9IHdoaWxlICgwKQorCWlmIChpc19zaGE1MTIgPT0gJzUnKSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgaiA9IGkgKyAxMDsKKwkJCXVuc2lnbmVkIGsgPSBpICsgMjA7CisJCQlpZiAoaiA+PSAzMCkgaiAtPSAzMDsKKwkJCWlmIChrID49IDMwKSBrIC09IDMwOworCQkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFtpXSwgYWx0X3Jlc3VsdFtqXSwgYWx0X3Jlc3VsdFtrXSwgNCk7CisJCQlpZiAoayA9PSAyOSkKKwkJCQlicmVhazsKKwkJCWkgPSBrICsgMTsKKwkJfQorCQliNjRfZnJvbV8yNGJpdCgwLCBhbHRfcmVzdWx0WzMxXSwgYWx0X3Jlc3VsdFszMF0sIDMpOworCQkvKiB3YXM6CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMF0sIGFsdF9yZXN1bHRbMTBdLCBhbHRfcmVzdWx0WzIwXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMjFdLCBhbHRfcmVzdWx0WzFdLCBhbHRfcmVzdWx0WzExXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMTJdLCBhbHRfcmVzdWx0WzIyXSwgYWx0X3Jlc3VsdFsyXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbM10sIGFsdF9yZXN1bHRbMTNdLCBhbHRfcmVzdWx0WzIzXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMjRdLCBhbHRfcmVzdWx0WzRdLCBhbHRfcmVzdWx0WzE0XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMTVdLCBhbHRfcmVzdWx0WzI1XSwgYWx0X3Jlc3VsdFs1XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNl0sIGFsdF9yZXN1bHRbMTZdLCBhbHRfcmVzdWx0WzI2XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMjddLCBhbHRfcmVzdWx0WzddLCBhbHRfcmVzdWx0WzE3XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMThdLCBhbHRfcmVzdWx0WzI4XSwgYWx0X3Jlc3VsdFs4XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbOV0sIGFsdF9yZXN1bHRbMTldLCBhbHRfcmVzdWx0WzI5XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KDAsIGFsdF9yZXN1bHRbMzFdLCBhbHRfcmVzdWx0WzMwXSwgMyk7CisJCSovCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaSA9IDA7CisJCXdoaWxlICgxKSB7CisJCQl1bnNpZ25lZCBqID0gaSArIDIxOworCQkJdW5zaWduZWQgayA9IGkgKyA0MjsKKwkJCWlmIChqID49IDYzKSBqIC09IDYzOworCQkJaWYgKGsgPj0gNjMpIGsgLT0gNjM7CisJCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0W2ldLCBhbHRfcmVzdWx0W2pdLCBhbHRfcmVzdWx0W2tdLCA0KTsKKwkJCWlmIChqID09IDIwKQorCQkJCWJyZWFrOworCQkJaSA9IGogKyAxOworCQl9CisJCWI2NF9mcm9tXzI0Yml0KDAsIDAsIGFsdF9yZXN1bHRbNjNdLCAyKTsKKwkJLyogd2FzOgorCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzBdLCBhbHRfcmVzdWx0WzIxXSwgYWx0X3Jlc3VsdFs0Ml0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzIyXSwgYWx0X3Jlc3VsdFs0M10sIGFsdF9yZXN1bHRbMV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzQ0XSwgYWx0X3Jlc3VsdFsyXSwgYWx0X3Jlc3VsdFsyM10sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzNdLCBhbHRfcmVzdWx0WzI0XSwgYWx0X3Jlc3VsdFs0NV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzI1XSwgYWx0X3Jlc3VsdFs0Nl0sIGFsdF9yZXN1bHRbNF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzQ3XSwgYWx0X3Jlc3VsdFs1XSwgYWx0X3Jlc3VsdFsyNl0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzZdLCBhbHRfcmVzdWx0WzI3XSwgYWx0X3Jlc3VsdFs0OF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzI4XSwgYWx0X3Jlc3VsdFs0OV0sIGFsdF9yZXN1bHRbN10sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzUwXSwgYWx0X3Jlc3VsdFs4XSwgYWx0X3Jlc3VsdFsyOV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzldLCBhbHRfcmVzdWx0WzMwXSwgYWx0X3Jlc3VsdFs1MV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzMxXSwgYWx0X3Jlc3VsdFs1Ml0sIGFsdF9yZXN1bHRbMTBdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs1M10sIGFsdF9yZXN1bHRbMTFdLCBhbHRfcmVzdWx0WzMyXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMTJdLCBhbHRfcmVzdWx0WzMzXSwgYWx0X3Jlc3VsdFs1NF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzM0XSwgYWx0X3Jlc3VsdFs1NV0sIGFsdF9yZXN1bHRbMTNdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs1Nl0sIGFsdF9yZXN1bHRbMTRdLCBhbHRfcmVzdWx0WzM1XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMTVdLCBhbHRfcmVzdWx0WzM2XSwgYWx0X3Jlc3VsdFs1N10sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzM3XSwgYWx0X3Jlc3VsdFs1OF0sIGFsdF9yZXN1bHRbMTZdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs1OV0sIGFsdF9yZXN1bHRbMTddLCBhbHRfcmVzdWx0WzM4XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMThdLCBhbHRfcmVzdWx0WzM5XSwgYWx0X3Jlc3VsdFs2MF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzQwXSwgYWx0X3Jlc3VsdFs2MV0sIGFsdF9yZXN1bHRbMTldLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs2Ml0sIGFsdF9yZXN1bHRbMjBdLCBhbHRfcmVzdWx0WzQxXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KDAsIDAsIGFsdF9yZXN1bHRbNjNdLCAyKTsKKwkJKi8KKwl9CisJLyogKnJlc3B0ciA9ICdcMCc7IC0geHphbGxvYyBkaWQgaXQgKi8KKyN1bmRlZiBiNjRfZnJvbV8yNGJpdAorCisJLyogQ2xlYXIgdGhlIGJ1ZmZlciBmb3IgdGhlIGludGVybWVkaWF0ZSByZXN1bHQgc28gdGhhdCBwZW9wbGUKKwkgICBhdHRhY2hpbmcgdG8gcHJvY2Vzc2VzIG9yIHJlYWRpbmcgY29yZSBkdW1wcyBjYW5ub3QgZ2V0IGFueQorCSAgIGluZm9ybWF0aW9uLiAgKi8KKwltZW1zZXQoJkwsIDAsIHNpemVvZihMKSk7IC8qIFthbHRdX2N0eCBhbmQgWFhYX3Jlc3VsdCBidWZmZXJzICovCisJbWVtc2V0KGtleV9kYXRhLCAwLCBrZXlfbGVuKTsgLyogYWxzbyBwX2J5dGVzICovCisJbWVtc2V0KHNhbHRfZGF0YSwgMCwgc2FsdF9sZW4pOyAvKiBhbHNvIHNfYnl0ZXMgKi8KKwlmcmVlKGtleV9kYXRhKTsKKwlmcmVlKHNhbHRfZGF0YSk7CisjdW5kZWYgcF9ieXRlcworI3VuZGVmIHNfYnl0ZXMKKworCXJldHVybiByZXN1bHQ7CisjdW5kZWYgYWx0X3Jlc3VsdAorI3VuZGVmIHRlbXBfcmVzdWx0CisjdW5kZWYgY3R4CisjdW5kZWYgYWx0X2N0eAorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcmVhZC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDZiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9yZWFkLmMKQEAgLTAsMCArMSw3MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK3NzaXplX3QgRkFTVF9GVU5DIHNhZmVfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgbjsKKworCWRvIHsKKwkJbiA9IHJlYWQoZmQsIGJ1ZiwgY291bnQpOworCX0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworCXJldHVybiBuOworfQorCisvKgorICogUmVhZCBhbGwgb2YgdGhlIHN1cHBsaWVkIGJ1ZmZlciBmcm9tIGEgZmlsZS4KKyAqIFRoaXMgZG9lcyBtdWx0aXBsZSByZWFkcyBhcyBuZWNlc3NhcnkuCisgKiBSZXR1cm5zIHRoZSBhbW91bnQgcmVhZCwgb3IgLTEgb24gYW4gZXJyb3IuCisgKiBBIHNob3J0IHJlYWQgaXMgcmV0dXJuZWQgb24gYW4gZW5kIG9mIGZpbGUuCisgKi8KK3NzaXplX3QgRkFTVF9GVU5DIGZ1bGxfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IGNjOworCXNzaXplX3QgdG90YWw7CisKKwl0b3RhbCA9IDA7CisKKwl3aGlsZSAobGVuKSB7CisJCWNjID0gc2FmZV9yZWFkKGZkLCBidWYsIGxlbik7CisKKwkJaWYgKGNjIDwgMCkgeworCQkJaWYgKHRvdGFsKSB7CisJCQkJLyogd2UgYWxyZWFkeSBoYXZlIHNvbWUhICovCisJCQkJLyogdXNlciBjYW4gZG8gYW5vdGhlciByZWFkIHRvIGtub3cgdGhlIGVycm9yIGNvZGUgKi8KKwkJCQlyZXR1cm4gdG90YWw7CisJCQl9CisJCQlyZXR1cm4gY2M7IC8qIHJlYWQoKSByZXR1cm5zIC0xIG9uIGZhaWx1cmUuICovCisJCX0KKwkJaWYgKGNjID09IDApCisJCQlicmVhazsKKwkJYnVmID0gKChjaGFyICopYnVmKSArIGNjOworCQl0b3RhbCArPSBjYzsKKwkJbGVuIC09IGNjOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKworc3NpemVfdCBGQVNUX0ZVTkMgcmVhZF9jbG9zZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJLyppbnQgZTsqLworCXNpemUgPSBmdWxsX3JlYWQoZmQsIGJ1Ziwgc2l6ZSk7CisJLyplID0gZXJybm87Ki8KKwljbG9zZShmZCk7CisJLyplcnJubyA9IGU7Ki8KKwlyZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBGQVNUX0ZVTkMgb3Blbl9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworCWludCBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisJcmV0dXJuIHJlYWRfY2xvc2UoZmQsIGJ1Ziwgc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9yZWFkX2tleS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcmVhZF9rZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNkMTljCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcmVhZF9rZXkuYwpAQCAtMCwwICsxLDI3MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQ2NF90IEZBU1RfRlVOQyByZWFkX2tleShpbnQgZmQsIGNoYXIgKmJ1ZmZlciwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IHBvbGxmZCBwZmQ7CisJY29uc3QgY2hhciAqc2VxOworCWludCBuOworCisJLyogS25vd24gZXNjYXBlIHNlcXVlbmNlcyBmb3IgY3Vyc29yIGFuZCBmdW5jdGlvbiBrZXlzICovCisJc3RhdGljIGNvbnN0IGNoYXIgZXNjY21kc1tdIEFMSUdOMSA9IHsKKwkJJ08nLCdBJyAgICAgICAgfDB4ODAsS0VZQ09ERV9VUCAgICAgICwKKwkJJ08nLCdCJyAgICAgICAgfDB4ODAsS0VZQ09ERV9ET1dOICAgICwKKwkJJ08nLCdDJyAgICAgICAgfDB4ODAsS0VZQ09ERV9SSUdIVCAgICwKKwkJJ08nLCdEJyAgICAgICAgfDB4ODAsS0VZQ09ERV9MRUZUICAgICwKKwkJJ08nLCdIJyAgICAgICAgfDB4ODAsS0VZQ09ERV9IT01FICAgICwKKwkJJ08nLCdGJyAgICAgICAgfDB4ODAsS0VZQ09ERV9FTkQgICAgICwKKyNpZiAwCisJCSdPJywnUCcgICAgICAgIHwweDgwLEtFWUNPREVfRlVOMSAgICAsCisJCS8qIFtFU0NdIEVTQyBPIFsyXSBQIC0gW0FsdC1dW1NoaWZ0LV1GMSAqLworCQkvKiBFU0MgWyBPIDEgOyAyIFAgLSBTaGlmdC1GMSAqLworCQkvKiBFU0MgWyBPIDEgOyAzIFAgLSBBbHQtRjEgKi8KKwkJLyogRVNDIFsgTyAxIDsgNCBQIC0gQWx0LVNoaWZ0LUYxICovCisJCS8qIEVTQyBbIE8gMSA7IDUgUCAtIEN0cmwtRjEgKi8KKwkJLyogRVNDIFsgTyAxIDsgNiBQIC0gQ3RybC1TaGlmdC1GMSAqLworCQknTycsJ1EnICAgICAgICB8MHg4MCxLRVlDT0RFX0ZVTjIgICAgLAorCQknTycsJ1InICAgICAgICB8MHg4MCxLRVlDT0RFX0ZVTjMgICAgLAorCQknTycsJ1MnICAgICAgICB8MHg4MCxLRVlDT0RFX0ZVTjQgICAgLAorI2VuZGlmCisJCSdbJywnQScgICAgICAgIHwweDgwLEtFWUNPREVfVVAgICAgICAsCisJCSdbJywnQicgICAgICAgIHwweDgwLEtFWUNPREVfRE9XTiAgICAsCisJCSdbJywnQycgICAgICAgIHwweDgwLEtFWUNPREVfUklHSFQgICAsCisJCSdbJywnRCcgICAgICAgIHwweDgwLEtFWUNPREVfTEVGVCAgICAsCisJCS8qIEVTQyBbIDEgOyAyIHgsIHdoZXJlIHggPSBBL0IvQy9EOiBTaGlmdC08YXJyb3c+ICovCisJCS8qIEVTQyBbIDEgOyAzIHgsIHdoZXJlIHggPSBBL0IvQy9EOiBBbHQtPGFycm93PiAqLworCQkvKiBFU0MgWyAxIDsgNCB4LCB3aGVyZSB4ID0gQS9CL0MvRDogQWx0LVNoaWZ0LTxhcnJvdz4gKi8KKwkJLyogRVNDIFsgMSA7IDUgeCwgd2hlcmUgeCA9IEEvQi9DL0Q6IEN0cmwtPGFycm93PiAtIGltcGxlbWVudGVkIGJlbG93ICovCisJCS8qIEVTQyBbIDEgOyA2IHgsIHdoZXJlIHggPSBBL0IvQy9EOiBDdHJsLVNoaWZ0LTxhcnJvdz4gKi8KKwkJJ1snLCdIJyAgICAgICAgfDB4ODAsS0VZQ09ERV9IT01FICAgICwgLyogeHRlcm0gKi8KKwkJLyogW0VTQ10gRVNDIFsgWzJdIEggLSBbQWx0LV1bU2hpZnQtXUhvbWUgKi8KKwkJJ1snLCdGJyAgICAgICAgfDB4ODAsS0VZQ09ERV9FTkQgICAgICwgLyogeHRlcm0gKi8KKwkJJ1snLCcxJywnficgICAgfDB4ODAsS0VZQ09ERV9IT01FICAgICwgLyogdnQxMDA/IGxpbnV4IHZ0PyBvciB3aGF0PyAqLworCQknWycsJzInLCd+JyAgICB8MHg4MCxLRVlDT0RFX0lOU0VSVCAgLAorCQkvKiBFU0MgWyAyIDsgMyB+IC0gQWx0LUluc2VydCAqLworCQknWycsJzMnLCd+JyAgICB8MHg4MCxLRVlDT0RFX0RFTEVURSAgLAorCQkvKiBbRVNDXSBFU0MgWyAzIFs7Ml0gfiAtIFtBbHQtXVtTaGlmdC1dRGVsZXRlICovCisJCS8qIEVTQyBbIDMgOyAzIH4gLSBBbHQtRGVsZXRlICovCisJCS8qIEVTQyBbIDMgOyA1IH4gLSBDdHJsLURlbGV0ZSAqLworCQknWycsJzQnLCd+JyAgICB8MHg4MCxLRVlDT0RFX0VORCAgICAgLCAvKiB2dDEwMD8gbGludXggdnQ/IG9yIHdoYXQ/ICovCisJCSdbJywnNScsJ34nICAgIHwweDgwLEtFWUNPREVfUEFHRVVQICAsCisJCS8qIEVTQyBbIDUgOyAzIH4gLSBBbHQtUGdVcCAqLworCQkvKiBFU0MgWyA1IDsgNSB+IC0gQ3RybC1QZ1VwICovCisJCS8qIEVTQyBbIDUgOyA3IH4gLSBDdHJsLUFsdC1QZ1VwICovCisJCSdbJywnNicsJ34nICAgIHwweDgwLEtFWUNPREVfUEFHRURPV04sCisJCSdbJywnNycsJ34nICAgIHwweDgwLEtFWUNPREVfSE9NRSAgICAsIC8qIHZ0MTAwPyBsaW51eCB2dD8gb3Igd2hhdD8gKi8KKwkJJ1snLCc4JywnficgICAgfDB4ODAsS0VZQ09ERV9FTkQgICAgICwgLyogdnQxMDA/IGxpbnV4IHZ0PyBvciB3aGF0PyAqLworI2lmIDAKKwkJJ1snLCcxJywnMScsJ34nfDB4ODAsS0VZQ09ERV9GVU4xICAgICwKKwkJJ1snLCcxJywnMicsJ34nfDB4ODAsS0VZQ09ERV9GVU4yICAgICwKKwkJJ1snLCcxJywnMycsJ34nfDB4ODAsS0VZQ09ERV9GVU4zICAgICwKKwkJJ1snLCcxJywnNCcsJ34nfDB4ODAsS0VZQ09ERV9GVU40ICAgICwKKwkJJ1snLCcxJywnNScsJ34nfDB4ODAsS0VZQ09ERV9GVU41ICAgICwKKwkJLyogW0VTQ10gRVNDIFsgMSA1IFs7Ml0gfiAtIFtBbHQtXVtTaGlmdC1dRjUgKi8KKwkJJ1snLCcxJywnNycsJ34nfDB4ODAsS0VZQ09ERV9GVU42ICAgICwKKwkJJ1snLCcxJywnOCcsJ34nfDB4ODAsS0VZQ09ERV9GVU43ICAgICwKKwkJJ1snLCcxJywnOScsJ34nfDB4ODAsS0VZQ09ERV9GVU44ICAgICwKKwkJJ1snLCcyJywnMCcsJ34nfDB4ODAsS0VZQ09ERV9GVU45ICAgICwKKwkJJ1snLCcyJywnMScsJ34nfDB4ODAsS0VZQ09ERV9GVU4xMCAgICwKKwkJJ1snLCcyJywnMycsJ34nfDB4ODAsS0VZQ09ERV9GVU4xMSAgICwKKwkJJ1snLCcyJywnNCcsJ34nfDB4ODAsS0VZQ09ERV9GVU4xMiAgICwKKwkJLyogRVNDIFsgMiA0IDsgMiB+IC0gU2hpZnQtRjEyICovCisJCS8qIEVTQyBbIDIgNCA7IDMgfiAtIEFsdC1GMTIgKi8KKwkJLyogRVNDIFsgMiA0IDsgNCB+IC0gQWx0LVNoaWZ0LUYxMiAqLworCQkvKiBFU0MgWyAyIDQgOyA1IH4gLSBDdHJsLUYxMiAqLworCQkvKiBFU0MgWyAyIDQgOyA2IH4gLSBDdHJsLVNoaWZ0LUYxMiAqLworI2VuZGlmCisJCS8qICdbJywnMScsJzsnLCc1JywnQScgfDB4ODAsS0VZQ09ERV9DVFJMX1VQICAgLCAtIHVudXNlZCAqLworCQkvKiAnWycsJzEnLCc7JywnNScsJ0InIHwweDgwLEtFWUNPREVfQ1RSTF9ET1dOICwgLSB1bnVzZWQgKi8KKwkJJ1snLCcxJywnOycsJzUnLCdDJyB8MHg4MCxLRVlDT0RFX0NUUkxfUklHSFQsCisJCSdbJywnMScsJzsnLCc1JywnRCcgfDB4ODAsS0VZQ09ERV9DVFJMX0xFRlQgLAorCQkwCisJCS8qIEVTQyBbIFogLSBTaGlmdC1UYWIgKi8KKwl9OworCisJcGZkLmZkID0gZmQ7CisJcGZkLmV2ZW50cyA9IFBPTExJTjsKKworCWJ1ZmZlcisrOyAvKiBzYXZlZCBjaGFycyBjb3VudGVyIGlzIGluIGJ1ZmZlclstMV0gbm93ICovCisKKyBzdGFydF9vdmVyOgorCWVycm5vID0gMDsKKwluID0gKHVuc2lnbmVkIGNoYXIpYnVmZmVyWy0xXTsKKwlpZiAobiA9PSAwKSB7CisJCS8qIElmIG5vIGRhdGEsIHdhaXQgZm9yIGlucHV0LgorCQkgKiBJZiByZXF1ZXN0ZWQsIHdhaXQgVElNRU9VVCBtcy4gVElNRU9VVCA9IC0xIGlzIHVzZWZ1bAorCQkgKiBpZiBmZCBjYW4gYmUgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisJCSAqLworCQlpZiAodGltZW91dCA+PSAtMSkgeworCQkJaWYgKHNhZmVfcG9sbCgmcGZkLCAxLCB0aW1lb3V0KSA9PSAwKSB7CisJCQkJLyogVGltZWQgb3V0ICovCisJCQkJZXJybm8gPSBFQUdBSU47CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCS8qIEl0IGlzIHRlbXB0aW5nIHRvIHJlYWQgbW9yZSB0aGFuIG9uZSBieXRlIGhlcmUsCisJCSAqIGJ1dCBpdCBicmVha3MgcGFzdGluZy4gRXhhbXBsZTogYXQgc2hlbGwgcHJvbXB0LAorCQkgKiB1c2VyIHByZXNzZXMgImMiLCJhIiwidCIgYW5kIHRoZW4gcGFzdGVzICJcbmxpbmVcbiIuCisJCSAqIFdoZW4gd2Ugd2VyZSByZWFkaW5nIDMgYnl0ZXMgaGVyZSwgd2Ugd2VyZSBlYXRpbmcKKwkJICogImxpIiB0b28sIGFuZCBjYXQgd2FzIGdldHRpbmcgd3JvbmcgaW5wdXQuCisJCSAqLworCQluID0gc2FmZV9yZWFkKGZkLCBidWZmZXIsIDEpOworCQlpZiAobiA8PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXsKKwkJdW5zaWduZWQgY2hhciBjID0gYnVmZmVyWzBdOworCQluLS07CisJCWlmIChuKQorCQkJbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArIDEsIG4pOworCQkvKiBPbmx5IEVTQyBzdGFydHMgRVNDIHNlcXVlbmNlcyAqLworCQlpZiAoYyAhPSAyNykgeworCQkJYnVmZmVyWy0xXSA9IG47CisJCQlyZXR1cm4gYzsKKwkJfQorCX0KKworCS8qIExvb3AgdGhyb3VnaCBrbm93biBFU0Mgc2VxdWVuY2VzICovCisJc2VxID0gZXNjY21kczsKKwl3aGlsZSAoKnNlcSAhPSAnXDAnKSB7CisJCS8qIG4gLSBwb3NpdGlvbiBpbiBzZXF1ZW5jZSB3ZSBkaWQgbm90IHJlYWQgeWV0ICovCisJCWludCBpID0gMDsgLyogcG9zaXRpb24gaW4gc2VxdWVuY2UgdG8gY29tcGFyZSAqLworCisJCS8qIExvb3AgdGhyb3VnaCBjaGFycyBpbiB0aGlzIHNlcXVlbmNlICovCisJCXdoaWxlICgxKSB7CisJCQkvKiBTbyBmYXIgZXNjYXBlIHNlcXVlbmNlIG1hdGNoZWQgdXAgdG8gW2ktMV0gKi8KKwkJCWlmIChuIDw9IGkpIHsKKwkJCQkvKiBOZWVkIG1vcmUgY2hhcnMsIHJlYWQgYW5vdGhlciBvbmUgaWYgaXQgd291bGRuJ3QgYmxvY2suCisJCQkJICogTm90ZSB0aGF0IGVzY2FwZSBzZXF1ZW5jZXMgY29tZSBpbiBhcyBhIHVuaXQsCisJCQkJICogc28gaWYgd2UgYmxvY2sgZm9yIGxvbmcgaXQncyBub3QgcmVhbGx5IGFuIGVzY2FwZSBzZXF1ZW5jZS4KKwkJCQkgKiBUaW1lb3V0IGlzIG5lZWRlZCB0byByZWNvbm5lY3QgZXNjYXBlIHNlcXVlbmNlcworCQkJCSAqIHNwbGl0IHVwIGJ5IHRyYW5zbWlzc2lvbiBvdmVyIGEgc2VyaWFsIGNvbnNvbGUuICovCisJCQkJaWYgKHNhZmVfcG9sbCgmcGZkLCAxLCA1MCkgPT0gMCkgeworCQkJCQkvKiBObyBtb3JlIGRhdGEhCisJCQkJCSAqIEFycmF5IGlzIHNvcnRlZCBmcm9tIHNob3J0ZXN0IHRvIGxvbmdlc3QsCisJCQkJCSAqIHdlIGNhbid0IG1hdGNoIGFueXRoaW5nIGxhdGVyIGluIGFycmF5IC0KKwkJCQkJICogYW55dGhpbmcgbGF0ZXIgaXMgbG9uZ2VyIHRoYW4gdGhpcyBzZXEuCisJCQkJCSAqIEJyZWFrIG91dCBvZiBib3RoIGxvb3BzLiAqLworCQkJCQlnb3RvIGdvdF9hbGw7CisJCQkJfQorCQkJCWVycm5vID0gMDsKKwkJCQlpZiAoc2FmZV9yZWFkKGZkLCBidWZmZXIgKyBuLCAxKSA8PSAwKSB7CisJCQkJCS8qIElmIEVBR0FJTiwgdGhlbiBmZCBpcyBPX05PTkJMT0NLIGFuZCBwb2xsIGxpZWQ6CisJCQkJCSAqIGluIGZhY3QsIHRoZXJlIGlzIG5vIGRhdGEuICovCisJCQkJCWlmIChlcnJubyAhPSBFQUdBSU4pIHsKKwkJCQkJCS8qIG90aGVyd2lzZTogaXQncyBFT0YvZXJyb3IgKi8KKwkJCQkJCWJ1ZmZlclstMV0gPSAwOworCQkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisJCQkJCWdvdG8gZ290X2FsbDsKKwkJCQl9CisJCQkJbisrOworCQkJfQorCQkJaWYgKGJ1ZmZlcltpXSAhPSAoc2VxW2ldICYgMHg3ZikpIHsKKwkJCQkvKiBUaGlzIHNlcSBkb2Vzbid0IG1hdGNoLCBnbyB0byBuZXh0ICovCisJCQkJc2VxICs9IGk7CisJCQkJLyogRm9yd2FyZCB0byBsYXN0IGNoYXIgKi8KKwkJCQl3aGlsZSAoISgqc2VxICYgMHg4MCkpCisJCQkJCXNlcSsrOworCQkJCS8qIFNraXAgaXQgYW5kIHRoZSBrZXljb2RlIHdoaWNoIGZvbGxvd3MgKi8KKwkJCQlzZXEgKz0gMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzZXFbaV0gJiAweDgwKSB7CisJCQkJLyogRW50aXJlIHNlcSBtYXRjaGVkICovCisJCQkJbiA9IDA7CisJCQkJLyogbiAtPSBpOyBtZW1tb3ZlKC4uLik7CisJCQkJICogd291bGQgYmUgbW9yZSBjb3JyZWN0LAorCQkJCSAqIGJ1dCB3ZSBuZXZlciByZWFkIGFoZWFkIHRoYXQgbXVjaCwKKwkJCQkgKiBhbmQgbiA9PSBpIGhlcmUuICovCisJCQkJYnVmZmVyWy0xXSA9IDA7CisJCQkJcmV0dXJuIChzaWduZWQgY2hhcilzZXFbaSsxXTsKKwkJCX0KKwkJCWkrKzsKKwkJfQorCX0KKwkvKiBXZSBkaWQgbm90IGZpbmQgbWF0Y2hpbmcgc2VxdWVuY2UuCisJICogV2UgcG9zc2libHkgcmVhZCBhbmQgc3RvcmVkIG1vcmUgaW5wdXQgaW4gYnVmZmVyW10gYnkgbm93LgorCSAqIG4gPSBieXRlcyByZWFkLiBUcnkgdG8gcmVhZCBtb3JlIHVudGlsIHdlIHRpbWUgb3V0LgorCSAqLworCXdoaWxlIChuIDwgS0VZQ09ERV9CVUZGRVJfU0laRS0xKSB7IC8qIDEgZm9yIGNvdW50IGJ5dGUgYXQgYnVmZmVyWy0xXSAqLworCQlpZiAoc2FmZV9wb2xsKCZwZmQsIDEsIDUwKSA9PSAwKSB7CisJCQkvKiBObyBtb3JlIGRhdGEhICovCisJCQlicmVhazsKKwkJfQorCQllcnJubyA9IDA7CisJCWlmIChzYWZlX3JlYWQoZmQsIGJ1ZmZlciArIG4sIDEpIDw9IDApIHsKKwkJCS8qIElmIEVBR0FJTiwgdGhlbiBmZCBpcyBPX05PTkJMT0NLIGFuZCBwb2xsIGxpZWQ6CisJCQkgKiBpbiBmYWN0LCB0aGVyZSBpcyBubyBkYXRhLiAqLworCQkJaWYgKGVycm5vICE9IEVBR0FJTikgeworCQkJCS8qIG90aGVyd2lzZTogaXQncyBFT0YvZXJyb3IgKi8KKwkJCQlidWZmZXJbLTFdID0gMDsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQluKys7CisJCS8qIFRyeSB0byBkZWNpcGhlciAiRVNDIFsgTk5OIDsgTk5OIFIiIHNlcXVlbmNlICovCisJCWlmICgoRU5BQkxFX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwKKwkJICAgIHx8IEVOQUJMRV9GRUFUVVJFX1ZJX0FTS19URVJNSU5BTAorCQkgICAgfHwgRU5BQkxFX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUwKKwkJICAgICkKKwkJICYmIG4gPj0gNQorCQkgJiYgYnVmZmVyWzBdID09ICdbJworCQkgJiYgYnVmZmVyW24tMV0gPT0gJ1InCisJCSAmJiBpc2RpZ2l0KGJ1ZmZlclsxXSkKKwkJKSB7CisJCQljaGFyICplbmQ7CisJCQl1bnNpZ25lZCBsb25nIHJvdywgY29sOworCisJCQlyb3cgPSBzdHJ0b3VsKGJ1ZmZlciArIDEsICZlbmQsIDEwKTsKKwkJCWlmICgqZW5kICE9ICc7JyB8fCAhaXNkaWdpdChlbmRbMV0pKQorCQkJCWNvbnRpbnVlOworCQkJY29sID0gc3RydG91bChlbmQgKyAxLCAmZW5kLCAxMCk7CisJCQlpZiAoKmVuZCAhPSAnUicpCisJCQkJY29udGludWU7CisJCQlpZiAocm93IDwgMSB8fCBjb2wgPCAxIHx8IChyb3cgfCBjb2wpID4gMHg3ZmZmKQorCQkJCWNvbnRpbnVlOworCisJCQlidWZmZXJbLTFdID0gMDsKKwkJCS8qIFBhY2sgaW50byAiMSA8cm93MTViaXRzPiA8Y29sMTZiaXRzPiIgMzItYml0IHNlcXVlbmNlICovCisJCQljb2wgfD0gKCgoLTEgPDwgMTUpIHwgcm93KSA8PCAxNik7CisJCQkvKiBSZXR1cm4gaXQgaW4gaGlnaC1vcmRlciB3b3JkICovCisJCQlyZXR1cm4gKChpbnQ2NF90KSBjb2wgPDwgMzIpIHwgKHVpbnQzMl90KUtFWUNPREVfQ1VSU09SX1BPUzsKKwkJfQorCX0KKyBnb3RfYWxsOgorCisJaWYgKG4gPD0gMSkgeworCQkvKiBBbHQteCBpcyB1c3VhbGx5IHJldHVybmVkIGFzIEVTQyB4LgorCQkgKiBSZXBvcnQgRVNDLCB4IGlzIHJlbWVtYmVyZWQgZm9yIHRoZSBuZXh0IGNhbGwuCisJCSAqLworCQlidWZmZXJbLTFdID0gbjsKKwkJcmV0dXJuIDI3OworCX0KKworCS8qIFdlIHdlcmUgZG9pbmcgImJ1ZmZlclstMV0gPSBuOyByZXR1cm4gYzsiIGhlcmUsIGJ1dCB0aGlzIHJlc3VsdHMKKwkgKiBpbiB1bmtub3duIGtleSBzZXF1ZW5jZXMgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgRVNDICsgZ2FyYmFnZS4KKwkgKiBUaGlzIHdhcyBub3QgdXNlZnVsLiBQcmV0ZW5kIHRoZXJlIHdhcyBubyBrZXkgcHJlc3NlZCwKKwkgKiBnbyBhbmQgd2FpdCBmb3IgYSBuZXcga2V5cHJlc3M6CisJICovCisJYnVmZmVyWy0xXSA9IDA7CisJZ290byBzdGFydF9vdmVyOworfQorCit2b2lkIEZBU1RfRlVOQyByZWFkX2tleV91bmdldHMoY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBjdXJfbGVuID0gKHVuc2lnbmVkIGNoYXIpYnVmZmVyWzBdOworCWlmIChsZW4gPiBLRVlDT0RFX0JVRkZFUl9TSVpFLTEgLSBjdXJfbGVuKQorCQlsZW4gPSBLRVlDT0RFX0JVRkZFUl9TSVpFLTEgLSBjdXJfbGVuOworCW1lbWNweShidWZmZXIgKyAxICsgY3VyX2xlbiwgc3RyLCBsZW4pOworCWJ1ZmZlclswXSArPSBsZW47Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9yZWFkX3ByaW50Zi5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcmVhZF9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJmODNkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcmVhZF9wcmludGYuYwpAQCAtMCwwICsxLDM3NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgWklQUEVEIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19MWk1BIFwKKwl8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIgXAorCXx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daIFwKKwkvKiB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19aICovIFwKKykKKworI2lmIFpJUFBFRAorIyBpbmNsdWRlICJhcmNoaXZlLmgiCisjZW5kaWYKKworCisvKiBTdXBwb3NlIHRoYXQgeW91IGFyZSBhIHNoZWxsLiBZb3Ugc3RhcnQgY2hpbGQgcHJvY2Vzc2VzLgorICogVGhleSB3b3JrIGFuZCBldmVudHVhbGx5IGV4aXQuIFlvdSB3YW50IHRvIGdldCB1c2VyIGlucHV0LgorICogWW91IHJlYWQgc3RkaW4uIEJ1dCB3aGF0IGhhcHBlbnMgaWYgbGFzdCBjaGlsZCBzd2l0Y2hlZAorICogaXRzIHN0ZGluIGludG8gT19OT05CTE9DSyBtb2RlPworICoKKyAqICoqKiBTVVJQUklTRSEgSXQgd2lsbCBhZmZlY3QgdGhlIHBhcmVudCB0b28hICoqKgorICogKioqIEJJRyBTVVJQUklTRSEgSXQgc3RheXMgZXZlbiBhZnRlciBjaGlsZCBleGl0cyEgKioqCisgKgorICogVGhpcyBpcyBhIGRlc2lnbiBidWcgaW4gVU5JWCBBUEkuCisgKiAgICAgIGZjbnRsKDAsIEZfU0VURkwsIGZjbnRsKDAsIEZfR0VURkwpIHwgT19OT05CTE9DSyk7CisgKiB3aWxsIHNldCBub25ibG9ja2luZyBtb2RlIG5vdCBvbmx5IG9uIF95b3VyXyBzdGRpbiwgYnV0CisgKiBhbHNvIG9uIHN0ZGluIG9mIHlvdXIgcGFyZW50LCBldGMuCisgKgorICogSW4gZ2VuZXJhbCwKKyAqICAgICAgZmQyID0gZHVwKGZkMSk7CisgKiAgICAgIGZjbnRsKGZkMiwgRl9TRVRGTCwgZmNudGwoZmQyLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0spOworICogc2V0cyBib3RoIGZkMSBhbmQgZmQyIHRvIE9fTk9OQkxPQ0suIFRoaXMgaW5jbHVkZXMgY2FzZXMKKyAqIHdoZXJlIGR1cGluZyBpcyBkb25lIGltcGxpY2l0bHkgYnkgZm9yaygpIGV0Yy4KKyAqCisgKiBXZSBuZWVkCisgKiAgICAgIGZjbnRsKGZkMiwgRl9TRVRGRCwgZmNudGwoZmQyLCBGX0dFVEZEKSB8IE9fTk9OQkxPQ0spOworICogKG5vdGUgU0VURkQsIG5vdCBTRVRGTCEpIGJ1dCBzdWNoIHRoaW5nIGRvZXNuJ3QgZXhpc3QuCisgKgorICogQWx0ZXJuYXRpdmVseSwgd2UgbmVlZCBub25ibG9ja2luZ19yZWFkKGZkLCAuLi4pIHdoaWNoIGRvZXNuJ3QKKyAqIHJlcXVpcmUgT19OT05CTE9DSyBkYW5jZSBhdCBhbGwuIEFjdHVhbGx5LCBpdCBleGlzdHM6CisgKiAgICAgIG4gPSByZWN2KGZkLCBidWYsIGxlbiwgTVNHX0RPTlRXQUlUKTsKKyAqICAgICAgIk1TR19ET05UV0FJVDoKKyAqICAgICAgRW5hYmxlcyBub24tYmxvY2tpbmcgb3BlcmF0aW9uOyBpZiB0aGUgb3BlcmF0aW9uCisgKiAgICAgIHdvdWxkIGJsb2NrLCBFQUdBSU4gaXMgcmV0dXJuZWQuIgorICogYnV0IHJlY3YoKSB3b3JrcyBvbmx5IGZvciBzb2NrZXRzIQorICoKKyAqIFNvIGZhciBJIGRvbid0IHNlZSBhbnkgZ29vZCBzb2x1dGlvbiwgSSBjYW4gb25seSBwcm9wb3NlCisgKiB0aGF0IGFmZmVjdGVkIHJlYWRlcnMgc2hvdWxkIGJlIGNhcmVmdWwgYW5kIHVzZSB0aGlzIHJvdXRpbmUsCisgKiB3aGljaCBkZXRlY3RzIEVBR0FJTiBhbmQgdXNlcyBwb2xsKCkgdG8gd2FpdCBvbiB0aGUgZmQuCisgKiBUaGFua2Z1bGx5LCBwb2xsKCkgZG9lc24ndCBjYXJlIGFib3V0IE9fTk9OQkxPQ0sgZmxhZy4KKyAqLworc3NpemVfdCBGQVNUX0ZVTkMgbm9uYmxvY2tfaW1tdW5lX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgaW50IGxvb3Bfb25fRUlOVFIpCit7CisJc3RydWN0IHBvbGxmZCBwZmRbMV07CisJc3NpemVfdCBuOworCisJd2hpbGUgKDEpIHsKKwkJbiA9IGxvb3Bfb25fRUlOVFIgPyBzYWZlX3JlYWQoZmQsIGJ1ZiwgY291bnQpIDogcmVhZChmZCwgYnVmLCBjb3VudCk7CisJCWlmIChuID49IDAgfHwgZXJybm8gIT0gRUFHQUlOKQorCQkJcmV0dXJuIG47CisJCS8qIGZkIGlzIGluIE9fTk9OQkxPQ0sgbW9kZS4gV2FpdCB1c2luZyBwb2xsIGFuZCByZXBlYXQgKi8KKwkJcGZkWzBdLmZkID0gZmQ7CisJCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJCS8qIG5vdGU6IHNhZmVfcG9sbCBwdWxscyBpbiBwcmludGYgKi8KKwkJbG9vcF9vbl9FSU5UUiA/IHNhZmVfcG9sbChwZmQsIDEsIC0xKSA6IHBvbGwocGZkLCAxLCAtMSk7CisJfQorfQorCisvLyBSZWFkcyBvbmUgbGluZSBhLWxhIGZnZXRzIChidXQgZG9lc24ndCBzYXZlIHRlcm1pbmF0aW5nICdcbicpLgorLy8gUmVhZHMgYnl0ZS1ieS1ieXRlLiBVc2VmdWwgd2hlbiBpdCBpcyBpbXBvcnRhbnQgdG8gbm90IHJlYWQgYWhlYWQuCisvLyBCeXRlcyBhcmUgYXBwZW5kZWQgdG8gcGZ4ICh3aGljaCBtdXN0IGJlIG1hbGxvY2VkLCBvciBOVUxMKS4KK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3JlYWRzKGludCBmZCwgc2l6ZV90ICptYXhzel9wKQoreworCWNoYXIgKnA7CisJY2hhciAqYnVmID0gTlVMTDsKKwlzaXplX3Qgc3ogPSAwOworCXNpemVfdCBtYXhzeiA9IG1heHN6X3AgPyAqbWF4c3pfcCA6IChJTlRfTUFYIC0gNDA5NSk7CisKKwlnb3RvIGp1bXBfaW47CisKKwl3aGlsZSAoc3ogPCBtYXhzeikgeworCQlpZiAoKHNpemVfdCkocCAtIGJ1ZikgPT0gc3opIHsKKyBqdW1wX2luOgorCQkJYnVmID0geHJlYWxsb2MoYnVmLCBzeiArIDEyOCk7CisJCQlwID0gYnVmICsgc3o7CisJCQlzeiArPSAxMjg7CisJCX0KKwkJaWYgKG5vbmJsb2NrX2ltbXVuZV9yZWFkKGZkLCBwLCAxLCAvKmxvb3Bfb25fRUlOVFI6Ki8gMSkgIT0gMSkgeworCQkJLyogRU9GL2Vycm9yICovCisJCQlpZiAocCA9PSBidWYpIHsgLyogd2UgcmVhZCBub3RoaW5nICovCisJCQkJZnJlZShidWYpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKCpwID09ICdcbicpCisJCQlicmVhazsKKwkJcCsrOworCX0KKwkqcCA9ICdcMCc7CisJaWYgKG1heHN6X3ApCisJCSptYXhzel9wICA9IHAgLSBidWY7CisJcCsrOworCXJldHVybiB4cmVhbGxvYyhidWYsIHAgLSBidWYpOworfQorCisvLyBSZWFkIChwb3RlbnRpYWxseSBiaWcpIGZpbGVzIGluIG9uZSBnby4gRmlsZSBzaXplIGlzIGVzdGltYXRlZAorLy8gYnkgc3RhdC4gRXh0cmEgJ1wwJyBieXRlIGlzIGFwcGVuZGVkLgordm9pZCogRkFTVF9GVU5DIHhtYWxsb2NfcmVhZChpbnQgZmQsIHNpemVfdCAqbWF4c3pfcCkKK3sKKwljaGFyICpidWY7CisJc2l6ZV90IHNpemUsIHJkX3NpemUsIHRvdGFsOworCXNpemVfdCB0b19yZWFkOworCXN0cnVjdCBzdGF0IHN0OworCisJdG9fcmVhZCA9IG1heHN6X3AgPyAqbWF4c3pfcCA6IChJTlRfTUFYIC0gNDA5NSk7IC8qIG1heCB0byByZWFkICovCisKKwkvKiBFc3RpbWF0ZSBmaWxlIHNpemUgKi8KKwlzdC5zdF9zaXplID0gMDsgLyogaW4gY2FzZSBmc3RhdCBmYWlscywgYXNzdW1lIDAgKi8KKwlmc3RhdChmZCwgJnN0KTsKKwkvKiAvcHJvYy9OL3N0YXQgZmlsZXMgcmVwb3J0IHN0X3NpemUgMCAqLworCS8qIEluIG9yZGVyIHRvIG1ha2Ugc3VjaCBmaWxlcyByZWFkYWJsZSwgd2UgYWRkIHNtYWxsIGNvbnN0ICovCisJc2l6ZSA9IChzdC5zdF9zaXplIHwgMHgzZmYpICsgMTsKKworCXRvdGFsID0gMDsKKwlidWYgPSBOVUxMOworCXdoaWxlICgxKSB7CisJCWlmICh0b19yZWFkIDwgc2l6ZSkKKwkJCXNpemUgPSB0b19yZWFkOworCQlidWYgPSB4cmVhbGxvYyhidWYsIHRvdGFsICsgc2l6ZSArIDEpOworCQlyZF9zaXplID0gZnVsbF9yZWFkKGZkLCBidWYgKyB0b3RhbCwgc2l6ZSk7CisJCWlmICgoc3NpemVfdClyZF9zaXplID09IChzc2l6ZV90KSgtMSkpIHsgLyogZXJyb3IgKi8KKwkJCWZyZWUoYnVmKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRvdGFsICs9IHJkX3NpemU7CisJCWlmIChyZF9zaXplIDwgc2l6ZSkgLyogRU9GICovCisJCQlicmVhazsKKwkJaWYgKHRvX3JlYWQgPD0gcmRfc2l6ZSkKKwkJCWJyZWFrOworCQl0b19yZWFkIC09IHJkX3NpemU7CisJCS8qIGdyb3cgYnkgMS84LCBidXQgaW4gWzFrLi42NGtdIGJvdW5kcyAqLworCQlzaXplID0gKCh0b3RhbCAvIDgpIHwgMHgzZmYpICsgMTsKKwkJaWYgKHNpemUgPiA2NCoxMDI0KQorCQkJc2l6ZSA9IDY0KjEwMjQ7CisJfQorCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgdG90YWwgKyAxKTsKKwlidWZbdG90YWxdID0gJ1wwJzsKKworCWlmIChtYXhzel9wKQorCQkqbWF4c3pfcCA9IHRvdGFsOworCXJldHVybiBidWY7Cit9CisKKyNpZmRlZiBVU0lOR19MU0VFS19UT19HRVRfU0laRQorLyogQWx0ZXJuYXRpdmVseSwgZmlsZSBzaXplIGNhbiBiZSBvYnRhaW5lZCBieSBsc2VlayB0byB0aGUgZW5kLgorICogVGhlIGNvZGUgaXMgc2xpZ2h0bHkgYmlnZ2VyLiBSZXRhaW5lZCBpbiBjYXNlIGZzdGF0IGFwcHJvYWNoCisgKiB3aWxsIG5vdCB3b3JrIGZvciBzb21lIHdlaXJkIGNhc2VzICgvcHJvYywgYmxvY2sgZGV2aWNlcywgZXRjKS4KKyAqIChOQjogbHNlZWsgYWxzbyBjYW4gZmFpbCB0byB3b3JrIGZvciBzb21lIHdlaXJkIGZpbGVzKSAqLworCisvLyBSZWFkIChwb3RlbnRpYWxseSBiaWcpIGZpbGVzIGluIG9uZSBnby4gRmlsZSBzaXplIGlzIGVzdGltYXRlZCBieQorLy8gbHNlZWsgdG8gZW5kLgordm9pZCogRkFTVF9GVU5DIHhtYWxsb2Nfb3Blbl9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKm1heHN6X3ApCit7CisJY2hhciAqYnVmOworCXNpemVfdCBzaXplOworCWludCBmZDsKKwlvZmZfdCBsZW47CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIC9wcm9jL04vc3RhdCBmaWxlcyByZXBvcnQgbGVuIDAgaGVyZSAqLworCS8qIEluIG9yZGVyIHRvIG1ha2Ugc3VjaCBmaWxlcyByZWFkYWJsZSwgd2UgYWRkIHNtYWxsIGNvbnN0ICovCisJc2l6ZSA9IDB4M2ZmOyAvKiByZWFkIG9ubHkgMWsgb24gdW5zZWVrYWJsZSBmaWxlcyAqLworCWxlbiA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCkgfCAweDNmZjsgLyogKyB1cCB0byAxayAqLworCWlmIChsZW4gIT0gKG9mZl90KS0xKSB7CisJCXhsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCQlzaXplID0gbWF4c3pfcCA/ICptYXhzel9wIDogKElOVF9NQVggLSA0MDk1KTsKKwkJaWYgKGxlbiA8IHNpemUpCisJCQlzaXplID0gbGVuOworCX0KKworCWJ1ZiA9IHhtYWxsb2Moc2l6ZSArIDEpOworCXNpemUgPSByZWFkX2Nsb3NlKGZkLCBidWYsIHNpemUpOworCWlmICgoc3NpemVfdClzaXplIDwgMCkgeworCQlmcmVlKGJ1Zik7CisJCXJldHVybiBOVUxMOworCX0KKwlidWYgPSB4cmVhbGxvYyhidWYsIHNpemUgKyAxKTsKKwlidWZbc2l6ZV0gPSAnXDAnOworCisJaWYgKG1heHN6X3ApCisJCSptYXhzel9wID0gc2l6ZTsKKwlyZXR1cm4gYnVmOworfQorI2VuZGlmCisKKy8vIFJlYWQgKHBvdGVudGlhbGx5IGJpZykgZmlsZXMgaW4gb25lIGdvLiBGaWxlIHNpemUgaXMgZXN0aW1hdGVkCisvLyBieSBzdGF0Lgordm9pZCogRkFTVF9GVU5DIHhtYWxsb2Nfb3Blbl9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKm1heHN6X3ApCit7CisJY2hhciAqYnVmOworCWludCBmZDsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiBOVUxMOworCisJYnVmID0geG1hbGxvY19yZWFkKGZkLCBtYXhzel9wKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCByZWFkIHRoZSBlbnRpcmUgYnVmZmVyLiAqLwordm9pZCBGQVNUX0ZVTkMgeHJlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJc3NpemVfdCBzaXplID0gZnVsbF9yZWFkKGZkLCBidWYsIGNvdW50KTsKKwkJaWYgKChzaXplX3Qpc2l6ZSAhPSBjb3VudCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzaG9ydCByZWFkIik7CisJfQorfQorCisvKiBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IHJlYWQgb25lIGNoYXJhY3Rlci4gKi8KK3Vuc2lnbmVkIGNoYXIgRkFTVF9GVU5DIHhyZWFkX2NoYXIoaW50IGZkKQoreworCWNoYXIgdG1wOworCXhyZWFkKGZkLCAmdG1wLCAxKTsKKwlyZXR1cm4gdG1wOworfQorCit2b2lkKiBGQVNUX0ZVTkMgeG1hbGxvY194b3Blbl9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKm1heHN6X3ApCit7CisJdm9pZCAqYnVmID0geG1hbGxvY19vcGVuX3JlYWRfY2xvc2UoZmlsZW5hbWUsIG1heHN6X3ApOworCWlmICghYnVmKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJyVzJyIsIGZpbGVuYW1lKTsKKwlyZXR1cm4gYnVmOworfQorCisvKiBVc2VkIGJ5IGUuZy4gcnBtIHdoaWNoIGdpdmVzIHVzIGEgZmQgd2l0aG91dCBmaWxlbmFtZSwKKyAqIHRodXMgd2UgY2FuJ3QgZ3Vlc3MgdGhlIGZvcm1hdCBmcm9tIGZpbGVuYW1lJ3MgZXh0ZW5zaW9uLgorICovCisjaWYgWklQUEVECit2b2lkIEZBU1RfRlVOQyBzZXR1cF91bnppcF9vbl9mZChpbnQgZmQgLyosIGludCBmYWlsX2lmX25vdF9kZXRlY3RlZCovKQoreworCWNvbnN0IGludCBmYWlsX2lmX25vdF9kZXRlY3RlZCA9IDE7CisJdW5pb24geworCQl1aW50OF90IGJbNF07CisJCXVpbnQxNl90IGIxNlsyXTsKKwkJdWludDMyX3QgYjMyWzFdOworCX0gbWFnaWM7CisJaW50IG9mZnNldCA9IC0yOworIyBpZiBCQl9NTVUKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyAoKnhmb3JtZXIpKGludCBzcmNfZmQsIGludCBkc3RfZmQpOworCWVudW0geyB4Zm9ybWVyX3Byb2cgPSAwIH07CisjIGVsc2UKKwllbnVtIHsgeGZvcm1lciA9IDAgfTsKKwljb25zdCBjaGFyICp4Zm9ybWVyX3Byb2c7CisjIGVuZGlmCisKKwkvKiAuZ3ogYW5kIC5iejIgYm90aCBoYXZlIDItYnl0ZSBzaWduYXR1cmUsIGFuZCB0aGVpcgorCSAqIHVucGFja19YWFhfc3RyZWFtIHdhbnRzIHRoaXMgaGVhZGVyIHNraXBwZWQuICovCisJeHJlYWQoZmQsIG1hZ2ljLmIxNiwgc2l6ZW9mKG1hZ2ljLmIxNlswXSkpOworCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorCSAmJiBtYWdpYy5iMTZbMF0gPT0gR1pJUF9NQUdJQworCSkgeworIyBpZiBCQl9NTVUKKwkJeGZvcm1lciA9IHVucGFja19nel9zdHJlYW07CisjIGVsc2UKKwkJeGZvcm1lcl9wcm9nID0gImd1bnppcCI7CisjIGVuZGlmCisJCWdvdG8gZm91bmRfbWFnaWM7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwkgJiYgbWFnaWMuYjE2WzBdID09IEJaSVAyX01BR0lDCisJKSB7CisjIGlmIEJCX01NVQorCQl4Zm9ybWVyID0gdW5wYWNrX2J6Ml9zdHJlYW07CisjIGVsc2UKKwkJeGZvcm1lcl9wcm9nID0gImJ1bnppcDIiOworIyBlbmRpZgorCQlnb3RvIGZvdW5kX21hZ2ljOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWFoKKwkgJiYgbWFnaWMuYjE2WzBdID09IFhaX01BR0lDMQorCSkgeworCQlvZmZzZXQgPSAtNjsKKwkJeHJlYWQoZmQsIG1hZ2ljLmIzMiwgc2l6ZW9mKG1hZ2ljLmIzMlswXSkpOworCQlpZiAobWFnaWMuYjMyWzBdID09IFhaX01BR0lDMikgeworIyBpZiBCQl9NTVUKKwkJCXhmb3JtZXIgPSB1bnBhY2tfeHpfc3RyZWFtOworCQkJLyogdW5wYWNrX3h6X3N0cmVhbSB3YW50cyBmZCBhdCBwb3NpdGlvbiA2LCBubyBuZWVkIHRvIHNlZWsgKi8KKwkJCS8veGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfQ1VSKTsKKyMgZWxzZQorCQkJeGZvcm1lcl9wcm9nID0gInVueHoiOworIyBlbmRpZgorCQkJZ290byBmb3VuZF9tYWdpYzsKKwkJfQorCX0KKworCS8qIE5vIGtub3duIG1hZ2ljIHNlZW4gKi8KKwlpZiAoZmFpbF9pZl9ub3RfZGV0ZWN0ZWQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBnemlwIgorCQkJSUZfRkVBVFVSRV9TRUFNTEVTU19CWjIoIi9iemlwMiIpCisJCQlJRl9GRUFUVVJFX1NFQU1MRVNTX1haKCIveHoiKQorCQkJIiBtYWdpYyIpOworCXhsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX0NVUik7CisJcmV0dXJuOworCisgZm91bmRfbWFnaWM6CisjIGlmICFCQl9NTVUKKwkvKiBOT01NVSB2ZXJzaW9uIG9mIG9wZW5fdHJhbnNmb3JtZXIgZXhlY3MKKwkgKiBhbiBleHRlcm5hbCB1bnppcHBlciB0aGF0IHdhbnRzCisJICogZmlsZSBwb3NpdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KKwl4bHNlZWsoZmQsIG9mZnNldCwgU0VFS19DVVIpOworIyBlbmRpZgorCW9wZW5fdHJhbnNmb3JtZXIoZmQsIHhmb3JtZXIsIHhmb3JtZXJfcHJvZyk7Cit9CisjZW5kaWYgLyogWklQUEVEICovCisKK2ludCBGQVNUX0ZVTkMgb3Blbl96aXBwZWQoY29uc3QgY2hhciAqZm5hbWUpCit7CisjaWYgIVpJUFBFRAorCXJldHVybiBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisjZWxzZQorCWNoYXIgKnNmeDsKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwlzZnggPSBzdHJyY2hyKGZuYW1lLCAnLicpOworCWlmIChzZngpIHsKKwkJc2Z4Kys7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19MWk1BICYmIHN0cmNtcChzZngsICJsem1hIikgPT0gMCkKKwkJCS8qIC5sem1hIGhhcyBubyBoZWFkZXIvc2lnbmF0dXJlLCBqdXN0IHRydXN0IGl0ICovCisJCQlvcGVuX3RyYW5zZm9ybWVyKGZkLCB1bnBhY2tfbHptYV9zdHJlYW0sICJ1bmx6bWEiKTsKKwkJZWxzZQorCQlpZiAoKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daICYmIHN0cmNtcChzZngsICJneiIpID09IDApCisJCSB8fCAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyICYmIHN0cmNtcChzZngsICJiejIiKSA9PSAwKQorCQkgfHwgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1haICYmIHN0cmNtcChzZngsICJ4eiIpID09IDApCisJCSkgeworCQkJc2V0dXBfdW56aXBfb25fZmQoZmQgLyosIGZhaWxfaWZfbm90X2RldGVjdGVkOiAxKi8pOworCQl9CisJfQorCisJcmV0dXJuIGZkOworI2VuZGlmCit9CisKK3ZvaWQqIEZBU1RfRlVOQyB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoY29uc3QgY2hhciAqZm5hbWUsIHNpemVfdCAqbWF4c3pfcCkKK3sKKwlpbnQgZmQ7CisJY2hhciAqaW1hZ2U7CisKKwlmZCA9IG9wZW5femlwcGVkKGZuYW1lKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWltYWdlID0geG1hbGxvY19yZWFkKGZkLCBtYXhzel9wKTsKKwlpZiAoIWltYWdlKQorCQliYl9wZXJyb3JfbXNnKCJyZWFkIGVycm9yIGZyb20gJyVzJyIsIGZuYW1lKTsKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gaW1hZ2U7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9yZWN1cnNpdmVfYWN0aW9uLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9yZWN1cnNpdmVfYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjZjdjMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3JlY3Vyc2l2ZV9hY3Rpb24uYwpAQCAtMCwwICsxLDE1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI3VuZGVmIERFQlVHX1JFQ1VSU19BQ1RJT04KKworLyoKKyAqIFdhbGsgZG93biBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKKyAqIGxvY2F0aW9uLCBhbmQgZG8gc29tZXRoaW5nIChzb21ldGhpbmcgc3BlY2lmaWVkCisgKiBieSB0aGUgZmlsZUFjdGlvbiBhbmQgZGlyQWN0aW9uIGZ1bmN0aW9uIHBvaW50ZXJzKS4KKyAqCisgKiBVbmZvcnR1bmF0ZWx5LCB3aGlsZSBuZnR3KDMpIGNvdWxkIHJlcGxhY2UgdGhpcyBhbmQgcmVkdWNlCisgKiBjb2RlIHNpemUgYSBiaXQsIG5mdHcoKSB3YXNuJ3Qgc3VwcG9ydGVkIGJlZm9yZSBHTlUgbGliYyAyLjEsCisgKiBhbmQgc28gaXNuJ3Qgc3VmZmljaWVudGx5IHBvcnRhYmxlIHRvIHRha2Ugb3ZlciBzaW5jZSBnbGliYzIuMQorICogaXMgc28gc3RpbmtpbmcgaHVnZS4KKyAqLworCitzdGF0aWMgaW50IEZBU1RfRlVOQyB0cnVlX2FjdGlvbihjb25zdCBjaGFyICpmaWxlTmFtZSBVTlVTRURfUEFSQU0sCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCogdXNlckRhdGEgVU5VU0VEX1BBUkFNLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXJldHVybiBUUlVFOworfQorCisvKiBmaWxlQWN0aW9uIHJldHVybiB2YWx1ZSBvZiAwIG9uIGFueSBmaWxlIGluIGRpcmVjdG9yeSB3aWxsIG1ha2UKKyAqIHJlY3Vyc2l2ZV9hY3Rpb24oKSByZXR1cm4gMCwgYnV0IGl0IGRvZXNuJ3Qgc3RvcCBkaXJlY3RvcnkgdHJhdmVyc2FsCisgKiAoZmlsZUFjdGlvbi9kaXJBY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBmaWxlKS4KKyAqCisgKiBJZiAhQUNUSU9OX1JFQ1VSU0UsIGRpckFjdGlvbiBpcyBjYWxsZWQgb24gdGhlIGRpcmVjdG9yeSBhbmQgaXRzCisgKiByZXR1cm4gdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSByZWN1cnNpdmVfYWN0aW9uKCkuIE5vIHJlY3Vyc2lvbi4KKyAqCisgKiBJZiBBQ1RJT05fUkVDVVJTRSwgcmVjdXJzaXZlX2FjdGlvbigpIGlzIGNhbGxlZCBvbiBlYWNoIGRpcmVjdG9yeS4KKyAqIElmIGFueSBvbmUgb2YgdGhlc2UgY2FsbHMgcmV0dXJucyAwLCBjdXJyZW50IHJlY3Vyc2l2ZV9hY3Rpb24oKSByZXR1cm5zIDAuCisgKgorICogSWYgQUNUSU9OX0RFUFRIRklSU1QsIGRpckFjdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgcmVjdXJzZS4KKyAqIElmIGl0IHJldHVybnMgMCwgdGhlIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgcmVjdXJzaXZlX2FjdGlvbigpIHJldHVybnMgMC4KKyAqCisgKiBJZiAhQUNUSU9OX0RFUFRIRklSU1QsIGRpckFjdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHdlIHJlY3Vyc2UuCisgKiBSZXR1cm4gdmFsdWUgb2YgMCAoRkFMU0UpIG9yIDIgKFNLSVApIHByZXZlbnRzIHJlY3Vyc2lvbgorICogaW50byB0aGF0IGRpcmVjdG9yeSwgaW5zdGVhZCByZWN1cnNpdmVfYWN0aW9uKCkgcmV0dXJucyAwIChpZiBGQUxTRSkKKyAqIG9yIDEgKGlmIFNLSVApCisgKgorICogQUNUSU9OX0ZPTExPV0xJTktTIG1haW5seSBjb250cm9scyBoYW5kbGluZyBvZiBsaW5rcyB0byBkaXJzLgorICogMDogbHN0YXQoc3RhdGJ1ZikuIENhbGxzIGZpbGVBY3Rpb24gb24gbGluayBuYW1lIGV2ZW4gaWYgcG9pbnRzIHRvIGRpci4KKyAqIDE6IHN0YXQoc3RhdGJ1ZikuIENhbGxzIGRpckFjdGlvbiBhbmQgb3B0aW9uYWxseSByZWN1cnNlIG9uIGxpbmsgdG8gZGlyLgorICovCisKK2ludCBGQVNUX0ZVTkMgcmVjdXJzaXZlX2FjdGlvbihjb25zdCBjaGFyICpmaWxlTmFtZSwKKwkJdW5zaWduZWQgZmxhZ3MsCisJCWludCBGQVNUX0ZVTkMgKCpmaWxlQWN0aW9uKShjb25zdCBjaGFyICpmaWxlTmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsIHZvaWQqIHVzZXJEYXRhLCBpbnQgZGVwdGgpLAorCQlpbnQgRkFTVF9GVU5DICgqZGlyQWN0aW9uKShjb25zdCBjaGFyICpmaWxlTmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsIHZvaWQqIHVzZXJEYXRhLCBpbnQgZGVwdGgpLAorCQl2b2lkKiB1c2VyRGF0YSwKKwkJdW5zaWduZWQgZGVwdGgpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwl1bnNpZ25lZCBmb2xsb3c7CisJaW50IHN0YXR1czsKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpuZXh0OworCisJaWYgKCFmaWxlQWN0aW9uKSBmaWxlQWN0aW9uID0gdHJ1ZV9hY3Rpb247CisJaWYgKCFkaXJBY3Rpb24pIGRpckFjdGlvbiA9IHRydWVfYWN0aW9uOworCisJZm9sbG93ID0gQUNUSU9OX0ZPTExPV0xJTktTOworCWlmIChkZXB0aCA9PSAwKQorCQlmb2xsb3cgPSBBQ1RJT05fRk9MTE9XTElOS1MgfCBBQ1RJT05fRk9MTE9XTElOS1NfTDA7CisJZm9sbG93ICY9IGZsYWdzOworCXN0YXR1cyA9IChmb2xsb3cgPyBzdGF0IDogbHN0YXQpKGZpbGVOYW1lLCAmc3RhdGJ1Zik7CisJaWYgKHN0YXR1cyA8IDApIHsKKyNpZmRlZiBERUJVR19SRUNVUlNfQUNUSU9OCisJCWJiX2Vycm9yX21zZygic3RhdHVzPSVkIGZsYWdzPSV4Iiwgc3RhdHVzLCBmbGFncyk7CisjZW5kaWYKKwkJaWYgKChmbGFncyAmIEFDVElPTl9EQU5HTElOR19PSykKKwkJICYmIGVycm5vID09IEVOT0VOVAorCQkgJiYgbHN0YXQoZmlsZU5hbWUsICZzdGF0YnVmKSA9PSAwCisJCSkgeworCQkJLyogRGFuZ2xpbmcgbGluayAqLworCQkJcmV0dXJuIGZpbGVBY3Rpb24oZmlsZU5hbWUsICZzdGF0YnVmLCB1c2VyRGF0YSwgZGVwdGgpOworCQl9CisJCWdvdG8gZG9uZV9uYWtfd2FybjsKKwl9CisKKwkvKiBJZiBTX0lTTE5LKG0pLCB0aGVuIHdlIGtub3cgdGhhdCAhU19JU0RJUihtKS4KKwkgKiBUaGVuIHdlIGNhbiBza2lwIGNoZWNraW5nIGZpcnN0IHBhcnQ6IGlmIGl0IGlzIHRydWUsIHRoZW4KKwkgKiAoIWRpcikgaXMgYWxzbyB0cnVlISAqLworCWlmICggLyogKCEoZmxhZ3MgJiBBQ1RJT05fRk9MTE9XTElOS1MpICYmIFNfSVNMTksoc3RhdGJ1Zi5zdF9tb2RlKSkgfHwgKi8KKwkgIVNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKQorCSkgeworCQlyZXR1cm4gZmlsZUFjdGlvbihmaWxlTmFtZSwgJnN0YXRidWYsIHVzZXJEYXRhLCBkZXB0aCk7CisJfQorCisJLyogSXQncyBhIGRpcmVjdG9yeSAob3IgYSBsaW5rIHRvIG9uZSwgYW5kIGZvbGxvd0xpbmtzIGlzIHNldCkgKi8KKworCWlmICghKGZsYWdzICYgQUNUSU9OX1JFQ1VSU0UpKSB7CisJCXJldHVybiBkaXJBY3Rpb24oZmlsZU5hbWUsICZzdGF0YnVmLCB1c2VyRGF0YSwgZGVwdGgpOworCX0KKworCWlmICghKGZsYWdzICYgQUNUSU9OX0RFUFRIRklSU1QpKSB7CisJCXN0YXR1cyA9IGRpckFjdGlvbihmaWxlTmFtZSwgJnN0YXRidWYsIHVzZXJEYXRhLCBkZXB0aCk7CisJCWlmICghc3RhdHVzKQorCQkJZ290byBkb25lX25ha193YXJuOworCQlpZiAoc3RhdHVzID09IFNLSVApCisJCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlkaXIgPSBvcGVuZGlyKGZpbGVOYW1lKTsKKwlpZiAoIWRpcikgeworCQkvKiBmaW5kdXRpbHMtNC4xLjIwIHJlcG9ydHMgdGhpcyAqLworCQkvKiAoaS5lLiBpdCBkb2Vzbid0IHNpbGVudGx5IHJldHVybiB3aXRoIGV4aXQgY29kZSAxKSAqLworCQkvKiBUbyB0cmlnZ2VyOiAiZmluZCAtZXhlYyBybSAtcmYge30gXDsiICovCisJCWdvdG8gZG9uZV9uYWtfd2FybjsKKwl9CisJc3RhdHVzID0gVFJVRTsKKwl3aGlsZSAoKG5leHQgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJY2hhciAqbmV4dEZpbGU7CisKKwkJbmV4dEZpbGUgPSBjb25jYXRfc3VicGF0aF9maWxlKGZpbGVOYW1lLCBuZXh0LT5kX25hbWUpOworCQlpZiAobmV4dEZpbGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkvKiBwcm9jZXNzIGV2ZXJ5IGZpbGUgKE5COiBBQ1RJT05fUkVDVVJTRSBpcyBzZXQgaW4gZmxhZ3MpICovCisJCWlmICghcmVjdXJzaXZlX2FjdGlvbihuZXh0RmlsZSwgZmxhZ3MsIGZpbGVBY3Rpb24sIGRpckFjdGlvbiwKKwkJCQkJCXVzZXJEYXRhLCBkZXB0aCArIDEpKQorCQkJc3RhdHVzID0gRkFMU0U7CisvLwkJcyA9IHJlY3Vyc2l2ZV9hY3Rpb24obmV4dEZpbGUsIGZsYWdzLCBmaWxlQWN0aW9uLCBkaXJBY3Rpb24sCisvLwkJCQkJCXVzZXJEYXRhLCBkZXB0aCArIDEpOworCQlmcmVlKG5leHRGaWxlKTsKKy8vI2RlZmluZSBSRUNVUlNFX1JFU1VMVF9BQk9SVCAzCisvLwkJaWYgKHMgPT0gUkVDVVJTRV9SRVNVTFRfQUJPUlQpIHsKKy8vCQkJY2xvc2VkaXIoZGlyKTsKKy8vCQkJcmV0dXJuIHM7CisvLwkJfQorLy8JCWlmIChzID09IEZBTFNFKQorLy8JCQlzdGF0dXMgPSBGQUxTRTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKworCWlmIChmbGFncyAmIEFDVElPTl9ERVBUSEZJUlNUKSB7CisJCWlmICghZGlyQWN0aW9uKGZpbGVOYW1lLCAmc3RhdGJ1ZiwgdXNlckRhdGEsIGRlcHRoKSkKKwkJCWdvdG8gZG9uZV9uYWtfd2FybjsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworCisgZG9uZV9uYWtfd2FybjoKKwlpZiAoIShmbGFncyAmIEFDVElPTl9RVUlFVCkpCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVOYW1lKTsKKwlyZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9yZW1vdmVfZmlsZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcmVtb3ZlX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjUzMWEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcmVtb3ZlX2ZpbGUuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSByZW1vdmVfZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFVzZWQgZnJvbSBOT0ZPUksgYXBwbGV0cy4gTXVzdCBub3QgYWxsb2NhdGUgYW55dGhpbmcgKi8KKworaW50IEZBU1RfRlVOQyByZW1vdmVfZmlsZShjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHN0YXQgcGF0aF9zdGF0OworCisJaWYgKGxzdGF0KHBhdGgsICZwYXRoX3N0YXQpIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzdGF0ICclcyciLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoIShmbGFncyAmIEZJTEVVVElMU19GT1JDRSkpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlbW92ZSAnJXMnIiwgcGF0aCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKFNfSVNESVIocGF0aF9zdGF0LnN0X21vZGUpKSB7CisJCURJUiAqZHA7CisJCXN0cnVjdCBkaXJlbnQgKmQ7CisJCWludCBzdGF0dXMgPSAwOworCisJCWlmICghKGZsYWdzICYgRklMRVVUSUxTX1JFQ1VSKSkgeworCQkJYmJfZXJyb3JfbXNnKCIlczogaXMgYSBkaXJlY3RvcnkiLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmICgoIShmbGFncyAmIEZJTEVVVElMU19GT1JDRSkgJiYgYWNjZXNzKHBhdGgsIFdfT0spIDwgMCAmJiBpc2F0dHkoMCkpCisJCSB8fCAoZmxhZ3MgJiBGSUxFVVRJTFNfSU5URVJBQ1RJVkUpCisJCSkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogZGVzY2VuZCBpbnRvIGRpcmVjdG9yeSAnJXMnPyAiLCBhcHBsZXRfbmFtZSwKKwkJCQkJcGF0aCk7CisJCQlpZiAoIWJiX2Fza19jb25maXJtYXRpb24oKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJCWRwID0gb3BlbmRpcihwYXRoKTsKKwkJaWYgKGRwID09IE5VTEwpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXdoaWxlICgoZCA9IHJlYWRkaXIoZHApKSAhPSBOVUxMKSB7CisJCQljaGFyICpuZXdfcGF0aDsKKworCQkJbmV3X3BhdGggPSBjb25jYXRfc3VicGF0aF9maWxlKHBhdGgsIGQtPmRfbmFtZSk7CisJCQlpZiAobmV3X3BhdGggPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChyZW1vdmVfZmlsZShuZXdfcGF0aCwgZmxhZ3MpIDwgMCkKKwkJCQlzdGF0dXMgPSAtMTsKKwkJCWZyZWUobmV3X3BhdGgpOworCQl9CisKKwkJaWYgKGNsb3NlZGlyKGRwKSA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNsb3NlICclcyciLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChmbGFncyAmIEZJTEVVVElMU19JTlRFUkFDVElWRSkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogcmVtb3ZlIGRpcmVjdG9yeSAnJXMnPyAiLCBhcHBsZXRfbmFtZSwgcGF0aCk7CisJCQlpZiAoIWJiX2Fza19jb25maXJtYXRpb24oKSkKKwkJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJaWYgKHJtZGlyKHBhdGgpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVtb3ZlICclcyciLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogIUlTRElSICovCisJaWYgKCghKGZsYWdzICYgRklMRVVUSUxTX0ZPUkNFKQorCSAgICAgJiYgYWNjZXNzKHBhdGgsIFdfT0spIDwgMAorCSAgICAgJiYgIVNfSVNMTksocGF0aF9zdGF0LnN0X21vZGUpCisJICAgICAmJiBpc2F0dHkoMCkpCisJIHx8IChmbGFncyAmIEZJTEVVVElMU19JTlRFUkFDVElWRSkKKwkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogcmVtb3ZlICclcyc/ICIsIGFwcGxldF9uYW1lLCBwYXRoKTsKKwkJaWYgKCFiYl9hc2tfY29uZmlybWF0aW9uKCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodW5saW5rKHBhdGgpIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZW1vdmUgJyVzJyIsIHBhdGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9ydGMuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDU1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9ydGMuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29tbW9uIFJUQyBmdW5jdGlvbnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ0Y18uaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFMKKyMgZGVmaW5lIEFESlRJTUVfUEFUSCAiL3Zhci9saWIvaHdjbG9jay9hZGp0aW1lIgorI2Vsc2UKKyMgZGVmaW5lIEFESlRJTUVfUEFUSCAiL2V0Yy9hZGp0aW1lIgorI2VuZGlmCisKK2ludCBGQVNUX0ZVTkMgcnRjX2FkanRpbWVfaXNfdXRjKHZvaWQpCit7CisJaW50IHV0YyA9IDA7CisJRklMRSAqZiA9IGZvcGVuX2Zvcl9yZWFkKEFESlRJTUVfUEFUSCk7CisKKwlpZiAoZikgeworCQljaGFyIGJ1ZmZlclsxMjhdOworCisJCXdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmKSkgeworCQkJaWYgKHN0cm5jbXAoYnVmZmVyLCAiVVRDIiwgMykgPT0gMCkgeworCQkJCXV0YyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZmNsb3NlKGYpOworCX0KKworCXJldHVybiB1dGM7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRjX3hvcGVuKGNvbnN0IGNoYXIgKipkZWZhdWx0X3J0YywgaW50IGZsYWdzKQoreworCWludCBydGM7CisKKwlpZiAoISpkZWZhdWx0X3J0YykgeworCQkqZGVmYXVsdF9ydGMgPSAiL2Rldi9ydGMiOworCQlydGMgPSBvcGVuKCpkZWZhdWx0X3J0YywgZmxhZ3MpOworCQlpZiAocnRjID49IDApCisJCQlyZXR1cm4gcnRjOworCQkqZGVmYXVsdF9ydGMgPSAiL2Rldi9ydGMwIjsKKwkJcnRjID0gb3BlbigqZGVmYXVsdF9ydGMsIGZsYWdzKTsKKwkJaWYgKHJ0YyA+PSAwKQorCQkJcmV0dXJuIHJ0YzsKKwkJKmRlZmF1bHRfcnRjID0gIi9kZXYvbWlzYy9ydGMiOworCX0KKworCXJldHVybiB4b3BlbigqZGVmYXVsdF9ydGMsIGZsYWdzKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgcnRjX3JlYWRfdG0oc3RydWN0IHRtICpwdG0sIGludCBmZCkKK3sKKwltZW1zZXQocHRtLCAwLCBzaXplb2YoKnB0bSkpOworCXhpb2N0bChmZCwgUlRDX1JEX1RJTUUsIHB0bSk7CisJcHRtLT50bV9pc2RzdCA9IC0xOyAvKiAibm90IGtub3duIiAqLworfQorCit0aW1lX3QgRkFTVF9GVU5DIHJ0Y190bTJ0aW1lKHN0cnVjdCB0bSAqcHRtLCBpbnQgdXRjKQoreworCWNoYXIgKm9sZHR6ID0gb2xkdHo7IC8qIGZvciBjb21waWxlciAqLworCXRpbWVfdCB0OworCisJaWYgKHV0YykgeworCQlvbGR0eiA9IGdldGVudigiVFoiKTsKKwkJcHV0ZW52KChjaGFyKikiVFo9VVRDMCIpOworCQl0enNldCgpOworCX0KKworCXQgPSBta3RpbWUocHRtKTsKKworCWlmICh1dGMpIHsKKwkJdW5zZXRlbnYoIlRaIik7CisJCWlmIChvbGR0eikKKwkJCXB1dGVudihvbGR0eiAtIDMpOworCQl0enNldCgpOworCX0KKworCXJldHVybiB0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvcnVuX3NoZWxsLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9ydW5fc2hlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDkyYzNjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvcnVuX3NoZWxsLmMKQEAgLTAsMCArMSw5MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDE5ODkgLSAxOTkxLCBKdWxpYW5uZSBGcmFuY2VzIEhhdWdoIDxqb2NrZ3JybEBhdXN0aW4ucnIuY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSnVsaWFubmUgRi4gSGF1Z2ggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSlVMSUUgSEFVR0ggQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEpVTElFIEhBVUdIIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWYgRU5BQkxFX1NFTElOVVgKKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4gIC8qIGZvciBzZXRleGVjY29uICAqLworI2VuZGlmCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorc3RhdGljIHNlY3VyaXR5X2NvbnRleHRfdCBjdXJyZW50X3NpZDsKKwordm9pZCBGQVNUX0ZVTkMgcmVuZXdfY3VycmVudF9zZWN1cml0eV9jb250ZXh0KHZvaWQpCit7CisJZnJlZWNvbihjdXJyZW50X3NpZCk7ICAvKiBSZWxlYXNlIG9sZCBjb250ZXh0ICAqLworCWdldGNvbigmY3VycmVudF9zaWQpOyAgLyogdXBkYXRlICovCit9Cit2b2lkIEZBU1RfRlVOQyBzZXRfY3VycmVudF9zZWN1cml0eV9jb250ZXh0KHNlY3VyaXR5X2NvbnRleHRfdCBzaWQpCit7CisJZnJlZWNvbihjdXJyZW50X3NpZCk7ICAvKiBSZWxlYXNlIG9sZCBjb250ZXh0ICAqLworCWN1cnJlbnRfc2lkID0gc2lkOworfQorCisjZW5kaWYKKworLyogUnVuIFNIRUxMLCBvciBERUZBVUxUX1NIRUxMIGlmIFNIRUxMIGlzICIiIG9yIE5VTEwuCisgKiBJZiBDT01NQU5EIGlzIG5vbnplcm8sIHBhc3MgaXQgdG8gdGhlIHNoZWxsIHdpdGggdGhlIC1jIG9wdGlvbi4KKyAqIElmIEFERElUSU9OQUxfQVJHUyBpcyBub256ZXJvLCBwYXNzIGl0IHRvIHRoZSBzaGVsbCBhcyBtb3JlCisgKiBhcmd1bWVudHMuICAqLwordm9pZCBGQVNUX0ZVTkMgcnVuX3NoZWxsKGNvbnN0IGNoYXIgKnNoZWxsLCBpbnQgbG9naW5zaGVsbCwgY29uc3QgY2hhciAqY29tbWFuZCwgY29uc3QgY2hhciAqKmFkZGl0aW9uYWxfYXJncykKK3sKKwljb25zdCBjaGFyICoqYXJnczsKKwlpbnQgYXJnbm87CisJaW50IGFkZGl0aW9uYWxfYXJnc19jbnQgPSAwOworCisJZm9yIChhcmdzID0gYWRkaXRpb25hbF9hcmdzOyBhcmdzICYmICphcmdzOyBhcmdzKyspCisJCWFkZGl0aW9uYWxfYXJnc19jbnQrKzsKKworCWFyZ3MgPSB4bWFsbG9jKHNpemVvZihjaGFyKikgKiAoNCArIGFkZGl0aW9uYWxfYXJnc19jbnQpKTsKKworCWlmICghc2hlbGwgfHwgIXNoZWxsWzBdKQorCQlzaGVsbCA9IERFRkFVTFRfU0hFTEw7CisKKwlhcmdzWzBdID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcChzaGVsbCk7CisJaWYgKGxvZ2luc2hlbGwpCisJCWFyZ3NbMF0gPSB4YXNwcmludGYoIi0lcyIsIGFyZ3NbMF0pOworCWFyZ25vID0gMTsKKwlpZiAoY29tbWFuZCkgeworCQlhcmdzW2FyZ25vKytdID0gIi1jIjsKKwkJYXJnc1thcmdubysrXSA9IGNvbW1hbmQ7CisJfQorCWlmIChhZGRpdGlvbmFsX2FyZ3MpIHsKKwkJZm9yICg7ICphZGRpdGlvbmFsX2FyZ3M7ICsrYWRkaXRpb25hbF9hcmdzKQorCQkJYXJnc1thcmdubysrXSA9ICphZGRpdGlvbmFsX2FyZ3M7CisJfQorCWFyZ3NbYXJnbm9dID0gTlVMTDsKKworI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKGN1cnJlbnRfc2lkKQorCQlzZXRleGVjY29uKGN1cnJlbnRfc2lkKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWVjb24oY3VycmVudF9zaWQpOworI2VuZGlmCisJZXhlY3Yoc2hlbGwsIChjaGFyICoqKSBhcmdzKTsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIHNoZWxsKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NhZmVfZ2V0aG9zdG5hbWUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NhZmVfZ2V0aG9zdG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGI5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2FmZV9nZXRob3N0bmFtZS5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNhZmUgZ2V0aG9zdG5hbWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFNVU3YyIGd1YXJhbnRlZXMgdGhhdCAiSG9zdCBuYW1lcyBhcmUgbGltaXRlZCB0byAyNTUgYnl0ZXMiCisgKiBQT1NJWC4xLTIwMDEgZ3VhcmFudGVlcyB0aGF0ICJIb3N0IG5hbWVzIChub3QgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZworICogbnVsbCBieXRlKSBhcmUgbGltaXRlZCB0byBIT1NUX05BTUVfTUFYIGJ5dGVzIiAoNjQgYnl0ZXMgb24gbXkgYm94KS4KKyAqCisgKiBSRkMxMTIzIHNheXM6CisgKgorICogVGhlIHN5bnRheCBvZiBhIGxlZ2FsIEludGVybmV0IGhvc3QgbmFtZSB3YXMgc3BlY2lmaWVkIGluIFJGQy05NTIKKyAqIFtETlM6NF0uICBPbmUgYXNwZWN0IG9mIGhvc3QgbmFtZSBzeW50YXggaXMgaGVyZWJ5IGNoYW5nZWQ6IHRoZQorICogcmVzdHJpY3Rpb24gb24gdGhlIGZpcnN0IGNoYXJhY3RlciBpcyByZWxheGVkIHRvIGFsbG93IGVpdGhlciBhCisgKiBsZXR0ZXIgb3IgYSBkaWdpdC4gIEhvc3Qgc29mdHdhcmUgTVVTVCBzdXBwb3J0IHRoaXMgbW9yZSBsaWJlcmFsCisgKiBzeW50YXguCisgKgorICogSG9zdCBzb2Z0d2FyZSBNVVNUIGhhbmRsZSBob3N0IG5hbWVzIG9mIHVwIHRvIDYzIGNoYXJhY3RlcnMgYW5kCisgKiBTSE9VTEQgaGFuZGxlIGhvc3QgbmFtZXMgb2YgdXAgdG8gMjU1IGNoYXJhY3RlcnMuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworLyoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJuIHRoZSBjdXJyZW50IG1hbGxvY2VkIGFuZCBOVUwgdGVybWluYXRlZCBob3N0bmFtZS4KKyAqIE9uIGVycm9yIHJldHVybiBtYWxsb2NlZCBhbmQgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nICI/Ii4KKyAqIFRoaXMgaXMgYW4gaWxsZWdhbCBmaXJzdCBjaGFyYWN0ZXIgZm9yIGEgaG9zdG5hbWUuCisgKiBUaGUgcmV0dXJuZWQgbWFsbG9jZWQgc3RyaW5nIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqLworY2hhciogRkFTVF9GVU5DIHNhZmVfZ2V0aG9zdG5hbWUodm9pZCkKK3sKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisKKwkvKiBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheXMgaW4gYSBzdHJ1Y3QgdXRzbmFtZSBpcyB1bnNwZWNpZmllZDsKKwkgKiB0aGUgZmllbGRzIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBieXRlLgorCSAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBzdGFuZGFyZCB0aGF0IHNheXMgdGhhdCB0aGUgaG9zdG5hbWUKKwkgKiBzZXQgYnkgc2V0aG9zdG5hbWUoMikgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHRoZSBub2RlbmFtZSBmaWVsZCBvZiB0aGUKKwkgKiBzdHJ1Y3QgcmV0dXJuZWQgYnkgdW5hbWUgKGluZGVlZCwgc29tZSBzeXN0ZW1zIGFsbG93IGEgMjU2LWJ5dGUgaG9zdC0KKwkgKiBuYW1lIGFuZCBhbiA4LWJ5dGUgbm9kZW5hbWUpLCBidXQgdGhpcyBpcyB0cnVlIG9uIExpbnV4LiBUaGUgc2FtZSBob2xkcworCSAqIGZvciBzZXRkb21haW5uYW1lKDIpIGFuZCB0aGUgZG9tYWlubmFtZSBmaWVsZC4KKwkgKi8KKworCS8qIFVuYW1lIGNhbiBmYWlsIG9ubHkgaWYgeW91IHBhc3MgYSBiYWQgcG9pbnRlciB0byBpdC4gKi8KKwl1bmFtZSgmdXRzKTsKKwlyZXR1cm4geHN0cm5kdXAoIXV0cy5ub2RlbmFtZVswXSA/ICI/IiA6IHV0cy5ub2RlbmFtZSwgc2l6ZW9mKHV0cy5ub2RlbmFtZSkpOworfQorCisvKgorICogT24gc3VjY2VzcyByZXR1cm4gdGhlIGN1cnJlbnQgbWFsbG9jZWQgYW5kIE5VTCB0ZXJtaW5hdGVkIGRvbWFpbm5hbWUuCisgKiBPbiBlcnJvciByZXR1cm4gbWFsbG9jZWQgYW5kIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyAiPyIuCisgKiBUaGlzIGlzIGFuIGlsbGVnYWwgZmlyc3QgY2hhcmFjdGVyIGZvciBhIGRvbWFpbm5hbWUuCisgKiBUaGUgcmV0dXJuZWQgbWFsbG9jZWQgc3RyaW5nIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqLworY2hhciogRkFTVF9GVU5DIHNhZmVfZ2V0ZG9tYWlubmFtZSh2b2lkKQoreworI2lmIGRlZmluZWQoX19saW51eF9fKQorLyogVGhlIGZpZWxkIGRvbWFpbm5hbWUgb2Ygc3RydWN0IHV0c25hbWUgaXMgTGludXggc3BlY2lmaWMuICovCisJc3RydWN0IHV0c25hbWUgdXRzOworCXVuYW1lKCZ1dHMpOworCXJldHVybiB4c3RybmR1cCghdXRzLmRvbWFpbm5hbWVbMF0gPyAiPyIgOiB1dHMuZG9tYWlubmFtZSwgc2l6ZW9mKHV0cy5kb21haW5uYW1lKSk7CisjZWxzZQorCS8qIFdlIHJlYWxseSBkb24ndCBjYXJlIGFib3V0IHBlb3BsZSB3aXRoIGRvbWFpbiBuYW1lcyB3aWRlciB0aGFuIG1vc3Qgc2NyZWVucyAqLworCWNoYXIgYnVmWzI1Nl07CisJaW50IHIgPSBnZXRkb21haW5uYW1lKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisJcmV0dXJuIHhzdHJkdXAociA8IDAgPyAiPyIgOiBidWYpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9zYWZlX3BvbGwuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NhZmVfcG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OTJhODEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9zYWZlX3BvbGwuYwpAQCAtMCwwICsxLDM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFdyYXBwZXIgd2hpY2ggcmVzdGFydHMgcG9sbCBvbiBFSU5UUiBvciBFTk9NRU0uCisgKiBPbiBvdGhlciBlcnJvcnMgZG9lcyBwZXJyb3IoInBvbGwiKSBhbmQgcmV0dXJucy4KKyAqIFdhcm5pbmchIE1heSB0YWtlIGxvbmdlciB0aGFuIHRpbWVvdXRfbXMgdG8gcmV0dXJuISAqLworaW50IEZBU1RfRlVOQyBzYWZlX3BvbGwoc3RydWN0IHBvbGxmZCAqdWZkcywgbmZkc190IG5mZHMsIGludCB0aW1lb3V0KQoreworCXdoaWxlICgxKSB7CisJCWludCBuID0gcG9sbCh1ZmRzLCBuZmRzLCB0aW1lb3V0KTsKKwkJaWYgKG4gPj0gMCkKKwkJCXJldHVybiBuOworCQkvKiBNYWtlIHN1cmUgd2UgaW5jaCB0b3dhcmRzIGNvbXBsZXRpb24gKi8KKwkJaWYgKHRpbWVvdXQgPiAwKQorCQkJdGltZW91dC0tOworCQkvKiBFLmcuIHN0cmFjZSBjYXVzZXMgcG9sbCB0byByZXR1cm4gdGhpcyAqLworCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQljb250aW51ZTsKKwkJLyogS2VybmVsIGlzIHZlcnkgbG93IG9uIG1lbW9yeS4gUmV0cnkuICovCisJCS8qIEkgZG91YnQgbWFueSBjYWxsZXJzIHdvdWxkIGhhbmRsZSB0aGlzIGNvcnJlY3RseSEgKi8KKwkJaWYgKGVycm5vID09IEVOT01FTSkKKwkJCWNvbnRpbnVlOworCQliYl9wZXJyb3JfbXNnKCJwb2xsIik7CisJCXJldHVybiBuOworCX0KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NhZmVfc3RybmNweS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2FmZV9zdHJuY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViMGRiMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NhZmVfc3RybmNweS5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIExpa2Ugc3RybmNweSBidXQgbWFrZSBzdXJlIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGFsd2F5cyAwIHRlcm1pbmF0ZWQuICovCitjaGFyKiBGQVNUX0ZVTkMgc2FmZV9zdHJuY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoIXNpemUpIHJldHVybiBkc3Q7CisJZHN0Wy0tc2l6ZV0gPSAnXDAnOworCXJldHVybiBzdHJuY3B5KGRzdCwgc3JjLCBzaXplKTsKK30KKworLyogTGlrZSBzdHJjcHkgYnV0IGNhbiBjb3B5IG92ZXJsYXBwaW5nIHN0cmluZ3MuICovCit2b2lkIEZBU1RfRlVOQyBvdmVybGFwcGluZ19zdHJjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJLyogQ2hlYXAgb3B0aW1pemF0aW9uIGZvciBkc3QgPT0gc3JjIGNhc2UgLQorCSAqIGJldHRlciB0byBoYXZlIGl0IGhlcmUgdGhhbiBpbiBtYW55IGNhbGxlcnMuCisJICovCisJaWYgKGRzdCAhPSBzcmMpIHsKKwkJd2hpbGUgKCgqZHN0ID0gKnNyYykgIT0gJ1wwJykgeworCQkJZHN0Kys7CisJCQlzcmMrKzsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NhZmVfd3JpdGUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NhZmVfd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc2MjgwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2FmZV93cml0ZS5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3NzaXplX3QgRkFTVF9GVU5DIHNhZmVfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90IG47CisKKwlkbyB7CisJCW4gPSB3cml0ZShmZCwgYnVmLCBjb3VudCk7CisJfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9zZWxpbnV4X2NvbW1vbi5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2VsaW51eF9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjkxMGUyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2VsaW51eF9jb21tb24uYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogbGliYmIvc2VsaW51eF9jb21tb24uYworICogICAtLSBjb21tb24gU0VMaW51eCB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA3IEthaUdhaSBLb2hlaSA8a2FpZ2FpQGthaWdhaS5nci5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzZWxpbnV4L2NvbnRleHQuaD4KKworY29udGV4dF90IEZBU1RfRlVOQyBzZXRfc2VjdXJpdHlfY29udGV4dF9jb21wb25lbnQoc2VjdXJpdHlfY29udGV4dF90IGN1cl9jb250ZXh0LAorCQkJCQkgY2hhciAqdXNlciwgY2hhciAqcm9sZSwgY2hhciAqdHlwZSwgY2hhciAqcmFuZ2UpCit7CisJY29udGV4dF90IGNvbiA9IGNvbnRleHRfbmV3KGN1cl9jb250ZXh0KTsKKwlpZiAoIWNvbikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodXNlciAmJiBjb250ZXh0X3VzZXJfc2V0KGNvbiwgdXNlcikpCisJCWdvdG8gZXJyb3I7CisJaWYgKHR5cGUgJiYgY29udGV4dF90eXBlX3NldChjb24sIHR5cGUpKQorCQlnb3RvIGVycm9yOworCWlmIChyYW5nZSAmJiBjb250ZXh0X3JhbmdlX3NldChjb24sIHJhbmdlKSkKKwkJZ290byBlcnJvcjsKKwlpZiAocm9sZSAmJiBjb250ZXh0X3JvbGVfc2V0KGNvbiwgcm9sZSkpCisJCWdvdG8gZXJyb3I7CisJcmV0dXJuIGNvbjsKKworZXJyb3I6CisJY29udGV4dF9mcmVlKGNvbik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNldGZzY3JlYXRlY29uX29yX2RpZShzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpCit7CisJaWYgKHNldGZzY3JlYXRlY29uKHNjb250ZXh0KSA8IDApIHsKKwkJLyogQ2FuIGJlIE5VTEwuIEFsbCBrbm93biBwcmludGYgaW1wbGVtZW50YXRpb25zCisJCSAqIGRpc3BsYXkgIihudWxsKSIsICI8bnVsbD4iIGV0YyAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNldCBkZWZhdWx0ICIKKwkJCQkiZmlsZSBjcmVhdGlvbiBjb250ZXh0IHRvICVzIiwgc2NvbnRleHQpOworCX0KK30KKwordm9pZCBGQVNUX0ZVTkMgc2VsaW51eF9wcmVzZXJ2ZV9mY29udGV4dChpbnQgZmRlc2MpCit7CisJc2VjdXJpdHlfY29udGV4dF90IGNvbnRleHQ7CisKKwlpZiAoZmdldGZpbGVjb24oZmRlc2MsICZjb250ZXh0KSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVOT0RBVEEgfHwgZXJybm8gPT0gRU5PVFNVUCkKKwkJCXJldHVybjsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJmZ2V0ZmlsZWNvbiBmYWlsZWQiKTsKKwl9CisJc2V0ZnNjcmVhdGVjb25fb3JfZGllKGNvbnRleHQpOworCWZyZWVjb24oY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9zZXR1cF9lbnZpcm9ubWVudC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2V0dXBfZW52aXJvbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIyOWNhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2V0dXBfZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDcyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgMTk4OSAtIDE5OTEsIEp1bGlhbm5lIEZyYW5jZXMgSGF1Z2ggPGpvY2tncnJsQGF1c3Rpbi5yci5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBKdWxpYW5uZSBGLiBIYXVnaCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBKVUxJRSBIQVVHSCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSlVMSUUgSEFVR0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgc2V0dXBfZW52aXJvbm1lbnQoY29uc3QgY2hhciAqc2hlbGwsIGludCBmbGFncywgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJaWYgKCFzaGVsbCB8fCAhc2hlbGxbMF0pCisJCXNoZWxsID0gREVGQVVMVF9TSEVMTDsKKworCS8qIENoYW5nZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSB0aGUgaG9tZSBkaXJlY3RvcnkKKwkgKiBvZiB0aGUgdXNlciAqLworCWlmIChjaGRpcihwdy0+cHdfZGlyKSkgeworCQl4Y2hkaXIoKGZsYWdzICYgU0VUVVBfRU5WX1RPX1RNUCkgPyAiL3RtcCIgOiAiLyIpOworCQliYl9lcnJvcl9tc2coImNhbid0IGNoZGlyIHRvIGhvbWUgZGlyZWN0b3J5ICclcyciLCBwdy0+cHdfZGlyKTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBTRVRVUF9FTlZfQ0xFQVJFTlYpIHsKKwkJY29uc3QgY2hhciAqdGVybTsKKworCQkvKiBMZWF2ZSBURVJNIHVuY2hhbmdlZC4gU2V0IEhPTUUsIFNIRUxMLCBVU0VSLCBMT0dOQU1FLCBQQVRILgorCQkgKiBVbnNldCBhbGwgb3RoZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KKwkJdGVybSA9IGdldGVudigiVEVSTSIpOworCQljbGVhcmVudigpOworCQlpZiAodGVybSkKKwkJCXhzZXRlbnYoIlRFUk0iLCB0ZXJtKTsKKwkJeHNldGVudigiUEFUSCIsIChwdy0+cHdfdWlkID8gYmJfZGVmYXVsdF9wYXRoIDogYmJfZGVmYXVsdF9yb290X3BhdGgpKTsKKwkJZ290byBzaG9ydGN1dDsKKwkJLy8gTm8sIGdjYyAoNC4yLjEpIGlzIG5vdCBjbGV2ZXIgZW5vdWduIHRvIGRvIGl0IGl0c2VsZi4KKwkJLy94c2V0ZW52KCJVU0VSIiwgICAgcHctPnB3X25hbWUpOworCQkvL3hzZXRlbnYoIkxPR05BTUUiLCBwdy0+cHdfbmFtZSk7CisJCS8veHNldGVudigiSE9NRSIsICAgIHB3LT5wd19kaXIpOworCQkvL3hzZXRlbnYoIlNIRUxMIiwgICBzaGVsbCk7CisJfSBlbHNlIGlmIChmbGFncyAmIFNFVFVQX0VOVl9DSEFOR0VFTlYpIHsKKwkJLyogU2V0IEhPTUUsIFNIRUxMLCBhbmQgaWYgbm90IGJlY29taW5nIGEgc3VwZXItdXNlciwKKwkJICogVVNFUiBhbmQgTE9HTkFNRS4gICovCisJCWlmIChwdy0+cHdfdWlkKSB7Cisgc2hvcnRjdXQ6CisJCQl4c2V0ZW52KCJVU0VSIiwgICAgcHctPnB3X25hbWUpOworCQkJeHNldGVudigiTE9HTkFNRSIsIHB3LT5wd19uYW1lKTsKKwkJfQorCQl4c2V0ZW52KCJIT01FIiwgICAgcHctPnB3X2Rpcik7CisJCXhzZXRlbnYoIlNIRUxMIiwgICBzaGVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvc2lnbmFscy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2lnbmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzM3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9zaWduYWxzLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJvYiBMYW5kbGV5CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBBbGwga25vd24gYXJjaGVzIHVzZSBzbWFsbCBpbnRzIGZvciBzaWduYWxzICovCitzbWFsbGludCBiYl9nb3Rfc2lnbmFsOworCit2b2lkIHJlY29yZF9zaWdubyhpbnQgc2lnbm8pCit7CisJYmJfZ290X3NpZ25hbCA9IHNpZ25vOworfQorCisvKiBTYXZlcyAyIGJ5dGVzIG9uIHg4NiEgT2ggbXkuLi4gKi8KK2ludCBGQVNUX0ZVTkMgc2lnYWN0aW9uX3NldChpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QpCit7CisJcmV0dXJuIHNpZ2FjdGlvbihzaWdudW0sIGFjdCwgTlVMTCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgc2lncHJvY21hc2tfYWxsc2lncyhpbnQgaG93KQoreworCXNpZ3NldF90IHNldDsKKwlzaWdmaWxsc2V0KCZzZXQpOworCXJldHVybiBzaWdwcm9jbWFzayhob3csICZzZXQsIE5VTEwpOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9zaWduYWxzKGludCBzaWdzLCB2b2lkICgqZikoaW50KSkKK3sKKwlpbnQgc2lnX25vID0gMDsKKwlpbnQgYml0ID0gMTsKKworCXdoaWxlIChzaWdzKSB7CisJCWlmIChzaWdzICYgYml0KSB7CisJCQlzaWdzICY9IH5iaXQ7CisJCQlzaWduYWwoc2lnX25vLCBmKTsKKwkJfQorCQlzaWdfbm8rKzsKKwkJYml0IDw8PSAxOworCX0KK30KKwordm9pZCBGQVNUX0ZVTkMgYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KGludCBzaWdzLCB2b2lkICgqZikoaW50KSkKK3sKKwlpbnQgc2lnX25vID0gMDsKKwlpbnQgYml0ID0gMTsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJc2Euc2FfaGFuZGxlciA9IGY7CisJLypzYS5zYV9mbGFncyA9IDA7Ki8KKwkvKnNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsgLSBob3BlIG1lbXNldCBkaWQgaXQqLworCisJd2hpbGUgKHNpZ3MpIHsKKwkJaWYgKHNpZ3MgJiBiaXQpIHsKKwkJCXNpZ3MgJj0gfmJpdDsKKwkJCXNpZ2FjdGlvbl9zZXQoc2lnX25vLCAmc2EpOworCQl9CisJCXNpZ19ubysrOworCQliaXQgPDw9IDE7CisJfQorfQorCit2b2lkIEZBU1RfRlVOQyBzaWdfYmxvY2soaW50IHNpZykKK3sKKwlzaWdzZXRfdCBzczsKKwlzaWdlbXB0eXNldCgmc3MpOworCXNpZ2FkZHNldCgmc3MsIHNpZyk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc3MsIE5VTEwpOworfQorCit2b2lkIEZBU1RfRlVOQyBzaWdfdW5ibG9jayhpbnQgc2lnKQoreworCXNpZ3NldF90IHNzOworCXNpZ2VtcHR5c2V0KCZzcyk7CisJc2lnYWRkc2V0KCZzcywgc2lnKTsKKwlzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywgJnNzLCBOVUxMKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgd2FpdF9mb3JfYW55X3NpZyh2b2lkKQoreworCXNpZ3NldF90IHNzOworCXNpZ2VtcHR5c2V0KCZzcyk7CisJc2lnc3VzcGVuZCgmc3MpOworfQorCisvKiBBc3N1bWluZyB0aGUgc2lnIGlzIGZhdGFsICovCit2b2lkIEZBU1RfRlVOQyBraWxsX215c2VsZl93aXRoX3NpZyhpbnQgc2lnKQoreworCXNpZ25hbChzaWcsIFNJR19ERkwpOworCXNpZ191bmJsb2NrKHNpZyk7CisJcmFpc2Uoc2lnKTsKKwlfZXhpdChFWElUX0ZBSUxVUkUpOyAvKiBTaG91bGQgbm90IHJlYWNoIGl0ICovCit9CisKK3ZvaWQgRkFTVF9GVU5DIHNpZ25hbF9TQV9SRVNUQVJUX2VtcHR5X21hc2soaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCkpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkvKnNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsqLworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwlzYS5zYV9oYW5kbGVyID0gaGFuZGxlcjsKKwlzaWdhY3Rpb25fc2V0KHNpZywgJnNhKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgc2lnbmFsX25vX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhpbnQgc2lnLCB2b2lkICgqaGFuZGxlcikoaW50KSkKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCS8qc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOyovCisJLypzYS5zYV9mbGFncyA9IDA7Ki8KKwlzYS5zYV9oYW5kbGVyID0gaGFuZGxlcjsKKwlzaWdhY3Rpb25fc2V0KHNpZywgJnNhKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NpbXBsaWZ5X3BhdGguYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NpbXBsaWZ5X3BhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWRjNWJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2ltcGxpZnlfcGF0aC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJiX3NpbXBsaWZ5X3BhdGggaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIGJiX3NpbXBsaWZ5X2Fic19wYXRoX2lucGxhY2UoY2hhciAqc3RhcnQpCit7CisJY2hhciAqcywgKnA7CisKKwlwID0gcyA9IHN0YXJ0OworCWRvIHsKKwkJaWYgKCpwID09ICcvJykgeworCQkJaWYgKCpzID09ICcvJykgeyAgLyogc2tpcCBkdXBsaWNhdGUgKG9yIGluaXRpYWwpIHNsYXNoICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoKnMgPT0gJy4nKSB7CisJCQkJaWYgKHNbMV0gPT0gJy8nIHx8ICFzWzFdKSB7ICAvKiByZW1vdmUgZXh0cmEgJy4nICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoKHNbMV0gPT0gJy4nKSAmJiAoc1syXSA9PSAnLycgfHwgIXNbMl0pKSB7CisJCQkJCSsrczsKKwkJCQkJaWYgKHAgPiBzdGFydCkgeworCQkJCQkJd2hpbGUgKCotLXAgIT0gJy8nKSAgLyogb21pdCBwcmV2aW91cyBkaXIgKi8KKwkJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJKisrcCA9ICpzOworCX0gd2hpbGUgKCorK3MpOworCisJaWYgKChwID09IHN0YXJ0KSB8fCAoKnAgIT0gJy8nKSkgeyAgLyogbm90IGEgdHJhaWxpbmcgc2xhc2ggKi8KKwkJKytwOyAgLyogc28ga2VlcCBsYXN0IGNoYXJhY3RlciAqLworCX0KKwkqcCA9ICdcMCc7CisJcmV0dXJuIHA7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBiYl9zaW1wbGlmeV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciAqcywgKnA7CisKKwlpZiAocGF0aFswXSA9PSAnLycpCisJCXMgPSB4c3RyZHVwKHBhdGgpOworCWVsc2UgeworCQlwID0geHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oTlVMTCk7CisJCXMgPSBjb25jYXRfcGF0aF9maWxlKHAsIHBhdGgpOworCQlmcmVlKHApOworCX0KKworCWJiX3NpbXBsaWZ5X2Fic19wYXRoX2lucGxhY2Uocyk7CisJcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9zaW5nbGVfYXJndi5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2luZ2xlX2FyZ3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDg0NGRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2luZ2xlX2FyZ3YuYwpAQCAtMCwwICsxLDE4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitjaGFyKiBGQVNUX0ZVTkMgc2luZ2xlX2FyZ3YoY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ3ZbMV0gJiYgc3RyY21wKGFyZ3ZbMV0sICItLSIpID09IDApCisJCWFyZ3YrKzsKKwlpZiAoIWFyZ3ZbMV0gfHwgYXJndlsyXSkKKwkJYmJfc2hvd191c2FnZSgpOworCXJldHVybiBhcmd2WzFdOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvc2tpcF93aGl0ZXNwYWNlLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9za2lwX3doaXRlc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzdiNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc2tpcF93aGl0ZXNwYWNlLmMKQEAgLTAsMCArMSwzOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2tpcF93aGl0ZXNwYWNlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIHNraXBfd2hpdGVzcGFjZShjb25zdCBjaGFyICpzKQoreworCS8qIEluIFBPU0lYL0MgbG9jYWxlICh0aGUgb25seSBsb2NhbGUgd2UgY2FyZSBhYm91dDogZG8gd2UgUkVBTExZIHdhbnQKKwkgKiB0byBhbGxvdyBVbmljb2RlIHdoaXRlc3BhY2UgaW4sIHNheSwgLmNvbmYgZmlsZXM/IG51dHMhKQorCSAqIGlzc3BhY2UgaXMgb25seSB0aGVzZSBjaGFyczogIlx0XG5cdlxmXHIiIGFuZCBzcGFjZS4KKwkgKiAiXHRcblx2XGZcciIgaGFwcGVuIHRvIGhhdmUgQVNDSUkgY29kZXMgOSwxMCwxMSwxMiwxMy4KKwkgKiBVc2UgdGhhdC4KKwkgKi8KKwl3aGlsZSAoKnMgPT0gJyAnIHx8ICh1bnNpZ25lZCBjaGFyKSgqcyAtIDkpIDw9ICgxMyAtIDkpKQorCQlzKys7CisKKwlyZXR1cm4gKGNoYXIgKikgczsKK30KKworY2hhciogRkFTVF9GVU5DIHNraXBfbm9uX3doaXRlc3BhY2UoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnICcgJiYgKHVuc2lnbmVkIGNoYXIpKCpzIC0gOSkgPiAoMTMgLSA5KSkKKwkJcysrOworCisJcmV0dXJuIChjaGFyICopIHM7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBza2lwX2Rldl9wZngoY29uc3QgY2hhciAqdHR5X25hbWUpCit7CisJaWYgKHN0cm5jbXAodHR5X25hbWUsICIvZGV2LyIsIDUpID09IDApCisJCXR0eV9uYW1lICs9IDU7CisJcmV0dXJuIChjaGFyKil0dHlfbmFtZTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3NwZWVkX3RhYmxlLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9zcGVlZF90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTU5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9zcGVlZF90YWJsZS5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjb21wYWN0IHNwZWVkX3QgPC0+IHNwZWVkIGZ1bmN0aW9ucyBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0cnVjdCBzcGVlZF9tYXAgeworCXVuc2lnbmVkIHNob3J0IHNwZWVkOworCXVuc2lnbmVkIHNob3J0IHZhbHVlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGVlZF9tYXAgc3BlZWRzW10gPSB7CisJe0IwLCAwfSwKKwl7QjUwLCA1MH0sCisJe0I3NSwgNzV9LAorCXtCMTEwLCAxMTB9LAorCXtCMTM0LCAxMzR9LAorCXtCMTUwLCAxNTB9LAorCXtCMjAwLCAyMDB9LAorCXtCMzAwLCAzMDB9LAorCXtCNjAwLCA2MDB9LAorCXtCMTIwMCwgMTIwMH0sCisJe0IxODAwLCAxODAwfSwKKwl7QjI0MDAsIDI0MDB9LAorCXtCNDgwMCwgNDgwMH0sCisJe0I5NjAwLCA5NjAwfSwKKyNpZmRlZiBCMTkyMDAKKwl7QjE5MjAwLCAxOTIwMH0sCisjZWxpZiBkZWZpbmVkKEVYVEEpCisJe0VYVEEsIDE5MjAwfSwKKyNlbmRpZgorI2lmZGVmIEIzODQwMAorCXtCMzg0MDAsIDM4NDAwLzI1NiArIDB4ODAwMFV9LAorI2VsaWYgZGVmaW5lZChFWFRCKQorCXtFWFRCLCAzODQwMC8yNTYgKyAweDgwMDBVfSwKKyNlbmRpZgorI2lmZGVmIEI1NzYwMAorCXtCNTc2MDAsIDU3NjAwLzI1NiArIDB4ODAwMFV9LAorI2VuZGlmCisjaWZkZWYgQjExNTIwMAorCXtCMTE1MjAwLCAxMTUyMDAvMjU2ICsgMHg4MDAwVX0sCisjZW5kaWYKKyNpZmRlZiBCMjMwNDAwCisJe0IyMzA0MDAsIDIzMDQwMC8yNTYgKyAweDgwMDBVfSwKKyNlbmRpZgorI2lmZGVmIEI0NjA4MDAKKwl7QjQ2MDgwMCwgNDYwODAwLzI1NiArIDB4ODAwMFV9LAorI2VuZGlmCisjaWZkZWYgQjkyMTYwMAorCXtCOTIxNjAwLCA5MjE2MDAvMjU2ICsgMHg4MDAwVX0sCisjZW5kaWYKK307CisKK2VudW0geyBOVU1fU1BFRURTID0gQVJSQVlfU0laRShzcGVlZHMpIH07CisKK3Vuc2lnbmVkIEZBU1RfRlVOQyB0dHlfYmF1ZF90b192YWx1ZShzcGVlZF90IHNwZWVkKQoreworCWludCBpID0gMDsKKworCWRvIHsKKwkJaWYgKHNwZWVkID09IHNwZWVkc1tpXS5zcGVlZCkgeworCQkJaWYgKHNwZWVkc1tpXS52YWx1ZSAmIDB4ODAwMFUpIHsKKwkJCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKSAoc3BlZWRzW2ldLnZhbHVlKSAmIDB4N2ZmZlUpICogMjU2OworCQkJfQorCQkJcmV0dXJuIHNwZWVkc1tpXS52YWx1ZTsKKwkJfQorCX0gd2hpbGUgKCsraSA8IE5VTV9TUEVFRFMpOworCisJcmV0dXJuIDA7Cit9CisKK3NwZWVkX3QgRkFTVF9GVU5DIHR0eV92YWx1ZV90b19iYXVkKHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlpbnQgaSA9IDA7CisKKwlkbyB7CisJCWlmICh2YWx1ZSA9PSB0dHlfYmF1ZF90b192YWx1ZShzcGVlZHNbaV0uc3BlZWQpKSB7CisJCQlyZXR1cm4gc3BlZWRzW2ldLnNwZWVkOworCQl9CisJfSB3aGlsZSAoKytpIDwgTlVNX1NQRUVEUyk7CisKKwlyZXR1cm4gKHNwZWVkX3QpIC0gMTsKK30KKworI2lmIDAKKy8qIHRlc3RpbmcgY29kZSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2OworCXNwZWVkX3QgczsKKworCWZvciAodiA9IDAgOyB2IDwgMTAwMDAwMDsgdisrKSB7CisJCXMgPSB0dHlfdmFsdWVfdG9fYmF1ZCh2KTsKKwkJaWYgKHMgPT0gKHNwZWVkX3QpIC0xKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoInYgPSAlbHUgLS0gcyA9ICUwbG9cbiIsIHYsICh1bnNpZ25lZCBsb25nKSBzKTsKKwl9CisKKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJZm9yIChzID0gMCA7IHMgPCAwMTAwMTcrMTsgcysrKSB7CisJCXYgPSB0dHlfYmF1ZF90b192YWx1ZShzKTsKKwkJaWYgKCF2KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoInYgPSAlbHUgLS0gcyA9ICUwbG9cbiIsIHYsICh1bnNpZ25lZCBsb25nKSBzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvc3RyX3RvbG93ZXIuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3N0cl90b2xvd2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkNTYzNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3N0cl90b2xvd2VyLmMKQEAgLTAsMCArMSwxNCBAQAorLyogdmkgc2V0OiBzdz00IHRzPTQ6ICovCisvKiBDb252ZXJ0IHN0cmluZyBzdHIgdG8gbG93ZXJjYXNlLCByZXR1cm4gc3RyLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitjaGFyKiBGQVNUX0ZVTkMgc3RyX3RvbG93ZXIoY2hhciAqc3RyKQoreworCWNoYXIgKmM7CisJZm9yIChjID0gc3RyOyAqYzsgKytjKQorCQkqYyA9IHRvbG93ZXIoKmMpOworCXJldHVybiBzdHI7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi9zdHJyc3RyLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9zdHJyc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4MjNmYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3N0cnJzdHIuYwpAQCAtMCwwICsxLDcxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZmRlZiBfX0RPX1NUUlJTVFJfVEVTVAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZWxzZQorI2luY2x1ZGUgImxpYmJiLmgiCisjZW5kaWYKKworLyoKKyAqIFRoZSBzdHJyc3RyKCkgZnVuY3Rpb24gZmluZHMgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3Vic3RyaW5nIG5lZWRsZQorICogaW4gdGhlIHN0cmluZyBoYXlzdGFjay4gVGhlIHRlcm1pbmF0aW5nIG51bCBjaGFyYWN0ZXJzIGFyZSBub3QgY29tcGFyZWQuCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBzdHJyc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpCit7CisJY2hhciAqciA9IE5VTEw7CisKKwlpZiAoIW5lZWRsZVswXSkKKwkJcmV0dXJuIChjaGFyKiloYXlzdGFjayArIHN0cmxlbihoYXlzdGFjayk7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqcCA9IHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIHI7CisJCXIgPSBwOworCQloYXlzdGFjayA9IHAgKyAxOworCX0KK30KKworI2lmZGVmIF9fRE9fU1RSUlNUUl9URVNUCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCWNvbnN0IGNoYXIgKmgsICpuOworCQlpbnQgcG9zOworCX0gdGVzdF9hcnJheVtdID0geworCQkvKiAwMTIzNDU2Nzg5ICovCisJCXsgImJhYWFiYWFhYiIsICAiYWFhIiwgNSAgfSwKKwkJeyAiYmFhYWJhYWFhYiIsICJhYWEiLCA2ICB9LAorCQl7ICJiYWFhYmFhYiIsICAgImFhYSIsIDEgIH0sCisJCXsgImFhYSIsICAgICAgICAiYWFhIiwgMCAgfSwKKwkJeyAiYWFhIiwgICAgICAgICJhIiwgICAyICB9LAorCQl7ICJhYWEiLCAgICAgICAgImJiYiIsIC0xIH0sCisJCXsgImEiLCAgICAgICAgICAiYWFhIiwgLTEgfSwKKwkJeyAiYWFhIiwgICAgICAgICIiLCAgICAzICB9LAorCQl7ICIiLCAgICAgICAgICAgImFhYSIsIC0xIH0sCisJCXsgIiIsICAgICAgICAgICAiIiwgICAgMCAgfSwKKwl9OworCisJaW50IGk7CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8IHNpemVvZih0ZXN0X2FycmF5KSAvIHNpemVvZih0ZXN0X2FycmF5WzBdKSkgeworCQljb25zdCBjaGFyICpyID0gc3RycnN0cih0ZXN0X2FycmF5W2ldLmgsIHRlc3RfYXJyYXlbaV0ubik7CisJCXByaW50ZigiJyVzJyB2cy4gJyVzJzogJyVzJyAtICIsIHRlc3RfYXJyYXlbaV0uaCwgdGVzdF9hcnJheVtpXS5uLCByKTsKKwkJaWYgKHIgPT0gTlVMTCkKKwkJCXIgPSB0ZXN0X2FycmF5W2ldLmggLSAxOworCQlwcmludGYoIiVzXG4iLCByID09IHRlc3RfYXJyYXlbaV0uaCArIHRlc3RfYXJyYXlbaV0ucG9zID8gIlBBU1NFRCIgOiAiRkFJTEVEIik7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvc3lzdGVtZF9zdXBwb3J0LmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi9zeXN0ZW1kX3N1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJhM2VmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvc3lzdGVtZF9zdXBwb3J0LmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBEYXZpZGUgQ2F2YWxjYSA8ZGF2aWRlQGdlZXhib3gub3JnPgorICoKKyAqIEJhc2VkIG9uIGh0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9zeXN0ZW1kL3RyZWUvc3JjL3NkLWRhZW1vbi5jCisgKiBDb3B5cmlnaHQgMjAxMCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1NZU1RFTUQKKy8vY29uZmlnOglib29sICJFbmFibGUgc3lzdGVtZCBzdXBwb3J0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHlvdSBwbGFuIHRvIHVzZSBidXN5Ym94IGRhZW1vbnMgb24gYSBzeXN0ZW0gd2hlcmUgZGFlbW9ucworLy9jb25maWc6CSAgYXJlIGNvbnRyb2xsZWQgYnkgc3lzdGVtZCwgZW5hYmxlIHRoaXMgb3B0aW9uLgorLy9jb25maWc6CSAgSWYgeW91IGRvbid0IHVzZSBzeXN0ZW1kLCBpdCBpcyBzdGlsbCBzYWZlIHRvIGVuYWJsZSBpdCwKKy8vY29uZmlnOgkgIGJ1dCB0aGUgZG93bnNpZGUgaXMgaW5jcmVhc2VkIGNvZGUgc2l6ZS4KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZFQVRVUkVfU1lTVEVNRCkgKz0gc3lzdGVtZF9zdXBwb3J0Lm8KKworaW50IHNkX2xpc3Rlbl9mZHModm9pZCkKK3sKKwljb25zdCBjaGFyICplOworCWludCBuOworCWludCBmZDsKKworCWUgPSBnZXRlbnYoIkxJU1RFTl9QSUQiKTsKKwlpZiAoIWUpCisJCXJldHVybiAwOworCW4gPSB4YXRvaV9wb3NpdGl2ZShlKTsKKwkvKiBJcyB0aGlzIGZvciB1cz8gKi8KKwlpZiAoZ2V0cGlkKCkgIT0gKHBpZF90KSBuKQorCQlyZXR1cm4gMDsKKworCWUgPSBnZXRlbnYoIkxJU1RFTl9GRFMiKTsKKwlpZiAoIWUpCisJCXJldHVybiAwOworCW4gPSB4YXRvaV9wb3NpdGl2ZShlKTsKKwlmb3IgKGZkID0gU0RfTElTVEVOX0ZEU19TVEFSVDsgZmQgPCBTRF9MSVNURU5fRkRTX1NUQVJUICsgbjsgZmQrKykKKwkJY2xvc2Vfb25fZXhlY19vbihmZCk7CisKKwlyZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3RpbWUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmI5Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvdGltZS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCit2b2lkIEZBU1RfRlVOQyBwYXJzZV9kYXRlc3RyKGNvbnN0IGNoYXIgKmRhdGVfc3RyLCBzdHJ1Y3QgdG0gKnB0bSkKK3sKKwljaGFyIGVuZCA9ICdcMCc7CisJY29uc3QgY2hhciAqbGFzdF9jb2xvbiA9IHN0cnJjaHIoZGF0ZV9zdHIsICc6Jyk7CisKKwlpZiAobGFzdF9jb2xvbiAhPSBOVUxMKSB7CisJCS8qIFBhcnNlIGlucHV0IGFuZCBhc3NpZ24gYXBwcm9wcmlhdGVseSB0byBwdG0gKi8KKyNpZiBFTkFCTEVfREVTS1RPUAorCQljb25zdCBjaGFyICplbmRwOworI2VuZGlmCisKKwkJLyogSEg6TU0gKi8KKwkJaWYgKHNzY2FuZihkYXRlX3N0ciwgIiV1OiV1JWMiLAorCQkJCQkmcHRtLT50bV9ob3VyLAorCQkJCQkmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDIpIHsKKwkJCS8qIG5vIGFkanVzdG1lbnRzIG5lZWRlZCAqLworCQl9IGVsc2UKKwkJLyogbW0uZGQtSEg6TU0gKi8KKwkJaWYgKHNzY2FuZihkYXRlX3N0ciwgIiV1LiV1LSV1OiV1JWMiLAorCQkJCQkmcHRtLT50bV9tb24sICZwdG0tPnRtX21kYXksCisJCQkJCSZwdG0tPnRtX2hvdXIsICZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gNCkgeworCQkJLyogQWRqdXN0IG1vbnRoIGZyb20gMS0xMiB0byAwLTExICovCisJCQlwdG0tPnRtX21vbiAtPSAxOworCQl9IGVsc2UKKwkJLyogeXl5eS5tbS5kZC1ISDpNTSAqLworCQlpZiAoc3NjYW5mKGRhdGVfc3RyLCAiJXUuJXUuJXUtJXU6JXUlYyIsICZwdG0tPnRtX3llYXIsCisJCQkJCSZwdG0tPnRtX21vbiwgJnB0bS0+dG1fbWRheSwKKwkJCQkJJnB0bS0+dG1faG91ciwgJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSA1KSB7CisJCQlwdG0tPnRtX3llYXIgLT0gMTkwMDsgLyogQWRqdXN0IHllYXJzICovCisJCQlwdG0tPnRtX21vbiAtPSAxOyAvKiBBZGp1c3QgbW9udGggZnJvbSAxLTEyIHRvIDAtMTEgKi8KKwkJfSBlbHNlCisJCS8qIHl5eXktbW0tZGQgSEg6TU0gKi8KKwkJaWYgKHNzY2FuZihkYXRlX3N0ciwgIiV1LSV1LSV1ICV1OiV1JWMiLCAmcHRtLT50bV95ZWFyLAorCQkJCQkmcHRtLT50bV9tb24sICZwdG0tPnRtX21kYXksCisJCQkJCSZwdG0tPnRtX2hvdXIsICZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gNSkgeworCQkJcHRtLT50bV95ZWFyIC09IDE5MDA7IC8qIEFkanVzdCB5ZWFycyAqLworCQkJcHRtLT50bV9tb24gLT0gMTsgLyogQWRqdXN0IG1vbnRoIGZyb20gMS0xMiB0byAwLTExICovCisJCX0gZWxzZQorI2lmIEVOQUJMRV9ERVNLVE9QICAvKiBzdHJwdGltZSBpcyBCSUc6IH4xayBpbiB1Y2xpYmMsIH4xMGsgaW4gZ2xpYmMgKi8KKwkJLyogbW9udGhfbmFtZSBkIEhIOk1NOlNTIFlZWVkuIFN1cHBvcnRlZCBieSBHTlUgZGF0ZSAqLworCQlpZiAoKGVuZHAgPSBzdHJwdGltZShkYXRlX3N0ciwgIiViICVkICVUICVZIiwgcHRtKSkgIT0gTlVMTAorCQkgJiYgKmVuZHAgPT0gJ1wwJworCQkpIHsKKwkJCXJldHVybjsgLyogZG9uJ3QgZmFsbCB0aHJvdWdoIHRvIGVuZCA9PSAiOiIgY2hlY2sgKi8KKwkJfSBlbHNlCisjZW5kaWYKKy8vVE9ETzogY29yZXV0aWxzIDYuOSBhbHNvIGFjY2VwdHMgInl5eXktbW0tZGQgSEgiIChubyBtaW51dGVzKQorCQl7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9kYXRlLCBkYXRlX3N0cik7CisJCX0KKwkJaWYgKGVuZCA9PSAnOicpIHsKKwkJCS8qIHh4eDpTUyAqLworCQkJaWYgKHNzY2FuZihsYXN0X2NvbG9uICsgMSwgIiV1JWMiLCAmcHRtLT50bV9zZWMsICZlbmQpID09IDEpCisJCQkJZW5kID0gJ1wwJzsKKwkJCS8qIGVsc2UgZW5kICE9IE5VTCBhbmQgd2UgZXJyb3Igb3V0ICovCisJCX0KKwl9IGVsc2UgaWYgKGRhdGVfc3RyWzBdID09ICdAJykgeworCQl0aW1lX3QgdCA9IGJiX3N0cnRvbChkYXRlX3N0ciArIDEsIE5VTEwsIDEwKTsKKwkJaWYgKCFlcnJubykgeworCQkJc3RydWN0IHRtICpsdCA9IGxvY2FsdGltZSgmdCk7CisJCQlpZiAobHQpIHsKKwkJCQkqcHRtID0gKmx0OworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbmQgPSAnMSc7CisJfSBlbHNlIHsKKwkJLyogR29vZ2xlZCB0aGUgZm9sbG93aW5nIG9uIGFuIG9sZCBkYXRlIG1hbnBhZ2U6CisJCSAqCisJCSAqIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gZm9yIHNldHRpbmcgdGhlIGRhdGUvdGltZSBpczoKKwkJICogY2MgICBDZW50dXJ5IChlaXRoZXIgMTkgb3IgMjApCisJCSAqIHl5ICAgWWVhciBpbiBhYmJyZXZpYXRlZCBmb3JtIChlLmcuIDg5LCAwNikKKwkJICogbW0gICBOdW1lcmljIG1vbnRoLCBhIG51bWJlciBmcm9tIDEgdG8gMTIKKwkJICogZGQgICBEYXksIGEgbnVtYmVyIGZyb20gMSB0byAzMQorCQkgKiBISCAgIEhvdXIsIGEgbnVtYmVyIGZyb20gMCB0byAyMworCQkgKiBNTSAgIE1pbnV0ZXMsIGEgbnVtYmVyIGZyb20gMCB0byA1OQorCQkgKiAuU1MgIFNlY29uZHMsIGEgbnVtYmVyIGZyb20gMCB0byA2MSAod2l0aCBsZWFwIHNlY29uZHMpCisJCSAqIEV2ZXJ5dGhpbmcgYnV0IHRoZSBtaW51dGVzIGlzIG9wdGlvbmFsCisJCSAqCisJCSAqICJ0b3VjaCAtdCBEQVRFVElNRSIgZm9ybWF0OiBbW1tbW1lZXVlZXU1NXUREXWhoXW1tWy5zc10KKwkJICogU29tZSwgYnV0IG5vdCBhbGwsIFVuaXggImRhdGUgREFURVRJTUUiIGNvbW1hbmRzCisJCSAqIG1vdmUgW1tZWV1ZWV0gcGFzdCBtaW51dGVzIG1tIGZpZWxkICghKS4KKwkJICogQ29yZXV0aWxzIGRhdGUgZG9lcyBpdCwgYW5kIFNVUyBtYW5kYXRlcyBpdC4KKwkJICogKGRhdGUgLXMgREFURVRJTUUgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZvcm1hdC4gbG92ZWx5ISkKKwkJICogSW4gYmJveCwgdGhpcyBmb3JtYXQgaXMgc3BlY2lhbC1jYXNlZCBpbiBkYXRlIGFwcGxldAorCQkgKiAoSU9XOiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgInRvdWNoIC10IiBmb3JtYXQpLgorCQkgKi8KKwkJdW5zaWduZWQgY3VyX3llYXIgPSBwdG0tPnRtX3llYXI7CisJCWludCBsZW4gPSBzdHJjaHJudWwoZGF0ZV9zdHIsICcuJykgLSBkYXRlX3N0cjsKKworCQkvKiBNTVsuU1NdICovCisJCWlmIChsZW4gPT0gMiAmJiBzc2NhbmYoZGF0ZV9zdHIsICIlMnUlMnUlMnUlMnUiIiUydSVjIiArIDEyLAorCQkJCQkmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDEpIHsKKwkJfSBlbHNlCisJCS8qIEhITU1bLlNTXSAqLworCQlpZiAobGVuID09IDQgJiYgc3NjYW5mKGRhdGVfc3RyLCAiJTJ1JTJ1JTJ1IiIlMnUlMnUlYyIgKyA5LAorCQkJCQkmcHRtLT50bV9ob3VyLAorCQkJCQkmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDIpIHsKKwkJfSBlbHNlCisJCS8qIGRkSEhNTVsuU1NdICovCisJCWlmIChsZW4gPT0gNiAmJiBzc2NhbmYoZGF0ZV9zdHIsICIlMnUlMnUiIiUydSUydSUydSVjIiArIDYsCisJCQkJCSZwdG0tPnRtX21kYXksCisJCQkJCSZwdG0tPnRtX2hvdXIsCisJCQkJCSZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gMykgeworCQl9IGVsc2UKKwkJLyogbW1kZEhITU1bLlNTXSAqLworCQlpZiAobGVuID09IDggJiYgc3NjYW5mKGRhdGVfc3RyLCAiJTJ1IiIlMnUlMnUlMnUlMnUlYyIgKyAzLAorCQkJCQkmcHRtLT50bV9tb24sCisJCQkJCSZwdG0tPnRtX21kYXksCisJCQkJCSZwdG0tPnRtX2hvdXIsCisJCQkJCSZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gNCkgeworCQkJLyogQWRqdXN0IG1vbnRoIGZyb20gMS0xMiB0byAwLTExICovCisJCQlwdG0tPnRtX21vbiAtPSAxOworCQl9IGVsc2UKKwkJLyogeXltbWRkSEhNTVsuU1NdICovCisJCWlmIChsZW4gPT0gMTAgJiYgc3NjYW5mKGRhdGVfc3RyLCAiJTJ1JTJ1JTJ1JTJ1JTJ1JWMiLAorCQkJCQkmcHRtLT50bV95ZWFyLAorCQkJCQkmcHRtLT50bV9tb24sCisJCQkJCSZwdG0tPnRtX21kYXksCisJCQkJCSZwdG0tPnRtX2hvdXIsCisJCQkJCSZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gNSkgeworCQkJLyogQWRqdXN0IG1vbnRoIGZyb20gMS0xMiB0byAwLTExICovCisJCQlwdG0tPnRtX21vbiAtPSAxOworCQkJaWYgKChpbnQpY3VyX3llYXIgPj0gNTApIHsgLyogPj0gMTk1MCAqLworCQkJCS8qIEFkanVzdCB5ZWFyOiAqLworCQkJCS8qIDEuIFB1dCBpdCBpbiB0aGUgY3VycmVudCBjZW50dXJ5ICovCisJCQkJcHRtLT50bV95ZWFyICs9IChjdXJfeWVhciAvIDEwMCkgKiAxMDA7CisJCQkJLyogMi4gSWYgdG9vIGZhciBpbiB0aGUgcGFzdCwgKzEwMCB5ZWFycyAqLworCQkJCWlmIChwdG0tPnRtX3llYXIgPCBjdXJfeWVhciAtIDUwKQorCQkJCQlwdG0tPnRtX3llYXIgKz0gMTAwOworCQkJCS8qIDMuIElmIHRvbyBmYXIgaW4gdGhlIGZ1dHVyZSwgLTEwMCB5ZWFycyAqLworCQkJCWlmIChwdG0tPnRtX3llYXIgPiBjdXJfeWVhciArIDUwKQorCQkJCQlwdG0tPnRtX3llYXIgLT0gMTAwOworCQkJfQorCQl9IGVsc2UKKwkJLyogY2N5eW1tZGRISE1NWy5TU10gKi8KKwkJaWYgKGxlbiA9PSAxMiAmJiBzc2NhbmYoZGF0ZV9zdHIsICIlNHUlMnUlMnUlMnUlMnUlYyIsCisJCQkJCSZwdG0tPnRtX3llYXIsCisJCQkJCSZwdG0tPnRtX21vbiwKKwkJCQkJJnB0bS0+dG1fbWRheSwKKwkJCQkJJnB0bS0+dG1faG91ciwKKwkJCQkJJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSA1KSB7CisJCQlwdG0tPnRtX3llYXIgLT0gMTkwMDsgLyogQWRqdXN0IHllYXJzICovCisJCQlwdG0tPnRtX21vbiAtPSAxOyAvKiBBZGp1c3QgbW9udGggZnJvbSAxLTEyIHRvIDAtMTEgKi8KKwkJfSBlbHNlIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2RhdGUsIGRhdGVfc3RyKTsKKwkJfQorCQlpZiAoZW5kID09ICcuJykgeworCQkJLyogeHh4LlNTICovCisJCQlpZiAoc3NjYW5mKHN0cmNocihkYXRlX3N0ciwgJy4nKSArIDEsICIldSVjIiwKKwkJCQkJJnB0bS0+dG1fc2VjLCAmZW5kKSA9PSAxKQorCQkJCWVuZCA9ICdcMCc7CisJCQkvKiBlbHNlIGVuZCAhPSBOVUwgYW5kIHdlIGVycm9yIG91dCAqLworCQl9CisJfQorCWlmIChlbmQgIT0gJ1wwJykgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9kYXRlLCBkYXRlX3N0cik7CisJfQorfQorCit0aW1lX3QgRkFTVF9GVU5DIHZhbGlkYXRlX3RtX3RpbWUoY29uc3QgY2hhciAqZGF0ZV9zdHIsIHN0cnVjdCB0bSAqcHRtKQoreworCXRpbWVfdCB0ID0gbWt0aW1lKHB0bSk7CisJaWYgKHQgPT0gKHRpbWVfdCkgLTFMKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2RhdGUsIGRhdGVfc3RyKTsKKwl9CisJcmV0dXJuIHQ7Cit9CisKKyNpZiBFTkFCTEVfTU9OT1RPTklDX1NZU0NBTEwKKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisvKiBPbGQgZ2xpYmMgKDwgMi4zLjQpIGRvZXMgbm90IHByb3ZpZGUgdGhpcyBjb25zdGFudC4gV2UgdXNlIHN5c2NhbGwKKyAqIGRpcmVjdGx5IHNvIHRoaXMgZGVmaW5pdGlvbiBpcyBzYWZlLiAqLworI2lmbmRlZiBDTE9DS19NT05PVE9OSUMKKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDIDEKKyNlbmRpZgorCisvKiBsaWJjIGhhcyBpbmNyZWRpYmx5IG1lc3N5IHdheSBvZiBkb2luZyB0aGlzLAorICogdHlwaWNhbGx5IHJlcXVpcmluZyAtbHJ0LiBXZSBqdXN0IHNraXAgYWxsIHRoaXMgbWVzcyAqLworc3RhdGljIHZvaWQgZ2V0X21vbm8oc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlpZiAoc3lzY2FsbChfX05SX2Nsb2NrX2dldHRpbWUsIENMT0NLX01PTk9UT05JQywgdHMpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2xvY2tfZ2V0dGltZShNT05PVE9OSUMpIGZhaWxlZCIpOworfQordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBtb25vdG9uaWNfbnModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJZ2V0X21vbm8oJnRzKTsKKwlyZXR1cm4gdHMudHZfc2VjICogMTAwMDAwMDAwMFVMTCArIHRzLnR2X25zZWM7Cit9Cit1bnNpZ25lZCBsb25nIGxvbmcgRkFTVF9GVU5DIG1vbm90b25pY191cyh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlnZXRfbW9ubygmdHMpOworCXJldHVybiB0cy50dl9zZWMgKiAxMDAwMDAwVUxMICsgdHMudHZfbnNlYy8xMDAwOworfQordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBtb25vdG9uaWNfbXModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJZ2V0X21vbm8oJnRzKTsKKwlyZXR1cm4gdHMudHZfc2VjICogMTAwMFVMTCArIHRzLnR2X25zZWMvMTAwMDAwMDsKK30KK3Vuc2lnbmVkIEZBU1RfRlVOQyBtb25vdG9uaWNfc2VjKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWdldF9tb25vKCZ0cyk7CisJcmV0dXJuIHRzLnR2X3NlYzsKK30KKworI2Vsc2UKKwordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBtb25vdG9uaWNfbnModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlyZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMDAwMFVMTCArIHR2LnR2X3VzZWMgKiAxMDAwOworfQordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBtb25vdG9uaWNfdXModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlyZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMFVMTCArIHR2LnR2X3VzZWM7Cit9Cit1bnNpZ25lZCBsb25nIGxvbmcgRkFTVF9GVU5DIG1vbm90b25pY19tcyh2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCXJldHVybiB0di50dl9zZWMgKiAxMDAwVUxMICsgdHYudHZfdXNlYyAvIDEwMDA7Cit9Cit1bnNpZ25lZCBGQVNUX0ZVTkMgbW9ub3RvbmljX3NlYyh2b2lkKQoreworCXJldHVybiB0aW1lKE5VTEwpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3RyaW0uYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3RyaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmNiNGZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvdHJpbS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSBtYW55IGRpZmZlcmVudCBwZW9wbGUuCisgKiBJZiB5b3Ugd3JvdGUgdGhpcywgcGxlYXNlIGFja25vd2xlZGdlIHlvdXIgd29yay4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCit2b2lkIEZBU1RfRlVOQyB0cmltKGNoYXIgKnMpCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihzKTsKKworCS8qIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCXdoaWxlIChsZW4gJiYgaXNzcGFjZShzW2xlbi0xXSkpCisJCS0tbGVuOworCisJLyogdHJpbSBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKwlpZiAobGVuKSB7CisJCWNoYXIgKm53cyA9IHNraXBfd2hpdGVzcGFjZShzKTsKKwkJaWYgKChud3MgLSBzKSAhPSAwKSB7CisJCQlsZW4gLT0gKG53cyAtIHMpOworCQkJbWVtbW92ZShzLCBud3MsIGxlbik7CisJCX0KKwl9CisJc1tsZW5dID0gJ1wwJzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3Vfc2lnbmFsX25hbWVzLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi91X3NpZ25hbF9uYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzhmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi91X3NpZ25hbF9uYW1lcy5jCkBAIC0wLDAgKzEsMjM2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTaWduYWwgbmFtZS9udW1iZXIgY29udmVyc2lvbiByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfUlRNSU5NQVgKKy8vY29uZmlnOglib29sICJTdXBwb3J0IFJUTUlOWytuXSBhbmQgUlRNQVhbLW5dIHNpZ25hbCBuYW1lcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IFJUTUlOWytuXSBhbmQgUlRNQVhbLW5dIHNpZ25hbCBuYW1lcworLy9jb25maWc6CSAgaW4ga2lsbCwga2lsbGFsbCBldGMuIFRoaXMgY29zdHMgfjI1MCBieXRlcy4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEJlbGlldmUgaXQgb3Igbm90LCBidXQgc29tZSBhcmNoZXMgaGF2ZSBtb3JlIHRoYW4gMzIgU0lHcyEKKyAqIEhQUEE6IFNJR1NUS0ZMVCA9PSAzNi4gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgc2lnbmFsc1tdWzddID0geworCS8vIFNVU3YzIHNheXMga2lsbCBtdXN0IHN1cHBvcnQgdGhlc2UsIGFuZCBzcGVjaWZpZXMgdGhlIG51bWVyaWNhbCB2YWx1ZXMsCisJLy8gaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy9raWxsLmh0bWwKKwkvLyB7MCwgIkVYSVQifSwgezEsICJIVVAifSwgezIsICJJTlQifSwgezMsICJRVUlUIn0sCisJLy8gezYsICJBQlJUIn0sIHs5LCAiS0lMTCJ9LCB7MTQsICJBTFJNIn0sIHsxNSwgIlRFUk0ifQorCS8vIEFuZCBQb3NpeCBhZGRzIHRoZSBmb2xsb3dpbmc6CisJLy8ge1NJR0lMTCwgIklMTCJ9LCB7U0lHVFJBUCwgIlRSQVAifSwge1NJR0ZQRSwgIkZQRSJ9LCB7U0lHVVNSMSwgIlVTUjEifSwKKwkvLyB7U0lHU0VHViwgIlNFR1YifSwge1NJR1VTUjIsICJVU1IyIn0sIHtTSUdQSVBFLCAiUElQRSJ9LCB7U0lHQ0hMRCwgIkNITEQifSwKKwkvLyB7U0lHQ09OVCwgIkNPTlQifSwge1NJR1NUT1AsICJTVE9QIn0sIHtTSUdUU1RQLCAiVFNUUCJ9LCB7U0lHVFRJTiwgIlRUSU4ifSwKKwkvLyB7U0lHVFRPVSwgIlRUT1UifQorCisJWzBdID0gIkVYSVQiLAorI2lmZGVmIFNJR0hVUAorCVtTSUdIVVAgICBdID0gIkhVUCIsCisjZW5kaWYKKyNpZmRlZiBTSUdJTlQKKwlbU0lHSU5UICAgXSA9ICJJTlQiLAorI2VuZGlmCisjaWZkZWYgU0lHUVVJVAorCVtTSUdRVUlUICBdID0gIlFVSVQiLAorI2VuZGlmCisjaWZkZWYgU0lHSUxMCisJW1NJR0lMTCAgIF0gPSAiSUxMIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RSQVAKKwlbU0lHVFJBUCAgXSA9ICJUUkFQIiwKKyNlbmRpZgorI2lmZGVmIFNJR0FCUlQKKwlbU0lHQUJSVCAgXSA9ICJBQlJUIiwKKyNlbmRpZgorI2lmZGVmIFNJR0JVUworCVtTSUdCVVMgICBdID0gIkJVUyIsCisjZW5kaWYKKyNpZmRlZiBTSUdGUEUKKwlbU0lHRlBFICAgXSA9ICJGUEUiLAorI2VuZGlmCisjaWZkZWYgU0lHS0lMTAorCVtTSUdLSUxMICBdID0gIktJTEwiLAorI2VuZGlmCisjaWZkZWYgU0lHVVNSMQorCVtTSUdVU1IxICBdID0gIlVTUjEiLAorI2VuZGlmCisjaWZkZWYgU0lHU0VHVgorCVtTSUdTRUdWICBdID0gIlNFR1YiLAorI2VuZGlmCisjaWZkZWYgU0lHVVNSMgorCVtTSUdVU1IyICBdID0gIlVTUjIiLAorI2VuZGlmCisjaWZkZWYgU0lHUElQRQorCVtTSUdQSVBFICBdID0gIlBJUEUiLAorI2VuZGlmCisjaWZkZWYgU0lHQUxSTQorCVtTSUdBTFJNICBdID0gIkFMUk0iLAorI2VuZGlmCisjaWZkZWYgU0lHVEVSTQorCVtTSUdURVJNICBdID0gIlRFUk0iLAorI2VuZGlmCisjaWZkZWYgU0lHU1RLRkxUCisJW1NJR1NUS0ZMVF0gPSAiU1RLRkxUIiwKKyNlbmRpZgorI2lmZGVmIFNJR0NITEQKKwlbU0lHQ0hMRCAgXSA9ICJDSExEIiwKKyNlbmRpZgorI2lmZGVmIFNJR0NPTlQKKwlbU0lHQ09OVCAgXSA9ICJDT05UIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NUT1AKKwlbU0lHU1RPUCAgXSA9ICJTVE9QIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RTVFAKKwlbU0lHVFNUUCAgXSA9ICJUU1RQIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RUSU4KKwlbU0lHVFRJTiAgXSA9ICJUVElOIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RUT1UKKwlbU0lHVFRPVSAgXSA9ICJUVE9VIiwKKyNlbmRpZgorI2lmZGVmIFNJR1VSRworCVtTSUdVUkcgICBdID0gIlVSRyIsCisjZW5kaWYKKyNpZmRlZiBTSUdYQ1BVCisJW1NJR1hDUFUgIF0gPSAiWENQVSIsCisjZW5kaWYKKyNpZmRlZiBTSUdYRlNaCisJW1NJR1hGU1ogIF0gPSAiWEZTWiIsCisjZW5kaWYKKyNpZmRlZiBTSUdWVEFMUk0KKwlbU0lHVlRBTFJNXSA9ICJWVEFMUk0iLAorI2VuZGlmCisjaWZkZWYgU0lHUFJPRgorCVtTSUdQUk9GICBdID0gIlBST0YiLAorI2VuZGlmCisjaWZkZWYgU0lHV0lOQ0gKKwlbU0lHV0lOQ0ggXSA9ICJXSU5DSCIsCisjZW5kaWYKKyNpZmRlZiBTSUdQT0xMCisJW1NJR1BPTEwgIF0gPSAiUE9MTCIsCisjZW5kaWYKKyNpZmRlZiBTSUdQV1IKKwlbU0lHUFdSICAgXSA9ICJQV1IiLAorI2VuZGlmCisjaWZkZWYgU0lHU1lTCisJW1NJR1NZUyAgIF0gPSAiU1lTIiwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1JUTUlOTUFYCisjIGlmZGVmIF9fU0lHUlRNSU4KKwlbX19TSUdSVE1JTl0gPSAiUlRNSU4iLAorIyBlbmRpZgorLy8gVGhpcyBtYWtlcyBhcnJheSBhYm91dCB4MiBiaWdnZXIuCisvLyBNb3JlIGNvbXBhY3QgYXBwcm9hY2ggaXMgdG8gc3BlY2lhbC1jYXNlIFNJR1JUTUFYIGluIHByaW50X3NpZ25hbWVzKCkKKy8vIyBpZmRlZiBfX1NJR1JUTUFYCisvLwlbX19TSUdSVE1BWF0gPSAiUlRNQVgiLAorLy8jIGVuZGlmCisjZW5kaWYKK307CisKKy8vIENvbnZlcnQgc2lnbmFsIG5hbWUgdG8gbnVtYmVyLgorCitpbnQgRkFTVF9GVU5DIGdldF9zaWdudW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBpOworCisJaSA9IGJiX3N0cnRvdShuYW1lLCBOVUxMLCAxMCk7CisJaWYgKCFlcnJubykKKwkJcmV0dXJuIGk7CisJaWYgKHN0cm5jYXNlY21wKG5hbWUsICJTSUciLCAzKSA9PSAwKQorCQluYW1lICs9IDM7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2lnbmFscyk7IGkrKykKKwkJaWYgKHN0cmNhc2VjbXAobmFtZSwgc2lnbmFsc1tpXSkgPT0gMCkKKwkJCXJldHVybiBpOworCisjaWYgRU5BQkxFX0RFU0tUT1AKKyMgaWYgZGVmaW5lZChTSUdJT1QpIHx8IGRlZmluZWQoU0lHSU8pCisJLyogU0lHSU9bVF0gYXJlIGFsaWFzZWQgdG8gb3RoZXIgbmFtZXMsCisJICogdGh1cyBjYW5ub3QgYmUgc3RvcmVkIGluIHRoZSBzaWduYWxzW10gYXJyYXkuCisJICogTmVlZCBzcGVjaWFsIGNvZGUgdG8gcmVjb2duaXplIHRoZW0gKi8KKwlpZiAoKG5hbWVbMF0gfCAweDIwKSA9PSAnaScgJiYgKG5hbWVbMV0gfCAweDIwKSA9PSAnbycpIHsKKyMgIGlmZGVmIFNJR0lPCisJCWlmICghbmFtZVsyXSkKKwkJCXJldHVybiBTSUdJTzsKKyMgIGVuZGlmCisjICBpZmRlZiBTSUdJT1QKKwkJaWYgKChuYW1lWzJdIHwgMHgyMCkgPT0gJ3QnICYmICFuYW1lWzNdKQorCQkJcmV0dXJuIFNJR0lPVDsKKyMgIGVuZGlmCisJfQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVE1JTk1BWAorIyBpZiBkZWZpbmVkKFNJR1JUTUlOKSAmJiBkZWZpbmVkKFNJR1JUTUFYKQorLyogbGliYyBtYXkgdXNlIHNvbWUgcnQgc2lncyBmb3IgcHRocmVhZHMgYW5kIHRoZXJlZm9yZSAicmVtYXAiIFNJR1JUTUlOL01BWCwKKyAqIGJ1dCB3ZSB3YW50IHRvIHVzZSAicmF3IiBTSUdSVE1JTi9NQVguIFVuZGVyc2NvcmVkIG5hbWVzLCBpZiBleGlzdCwgcHJvdmlkZQorICogdGhlbS4gSWYgdGhleSBkb24ndCBleGlzdCwgZmFsbCBiYWNrIHRvIG5vbi11bmRlcnNjb3JlZCBvbmVzOiAqLworIyAgaWYgIWRlZmluZWQoX19TSUdSVE1JTikKKyMgICBkZWZpbmUgX19TSUdSVE1JTiBTSUdSVE1JTgorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKF9fU0lHUlRNQVgpCisjICAgZGVmaW5lIF9fU0lHUlRNQVggU0lHUlRNQVgKKyMgIGVuZGlmCisJaWYgKHN0cm5jYXNlY21wKG5hbWUsICJSVE1JTiIsIDUpID09IDApIHsKKwkJaWYgKCFuYW1lWzVdKQorCQkJcmV0dXJuIF9fU0lHUlRNSU47CisJCWlmIChuYW1lWzVdID09ICcrJykgeworCQkJaSA9IGJiX3N0cnRvdShuYW1lICsgNiwgTlVMTCwgMTApOworCQkJaWYgKCFlcnJubyAmJiBpIDw9IF9fU0lHUlRNQVggLSBfX1NJR1JUTUlOKQorCQkJCXJldHVybiBfX1NJR1JUTUlOICsgaTsKKwkJfQorCX0KKwllbHNlIGlmIChzdHJuY2FzZWNtcChuYW1lLCAiUlRNQVgiLCA1KSA9PSAwKSB7CisJCWlmICghbmFtZVs1XSkKKwkJCXJldHVybiBfX1NJR1JUTUFYOworCQlpZiAobmFtZVs1XSA9PSAnLScpIHsKKwkJCWkgPSBiYl9zdHJ0b3UobmFtZSArIDYsIE5VTEwsIDEwKTsKKwkJCWlmICghZXJybm8gJiYgaSA8PSBfX1NJR1JUTUFYIC0gX19TSUdSVE1JTikKKwkJCQlyZXR1cm4gX19TSUdSVE1BWCAtIGk7CisJCX0KKwl9CisjIGVuZGlmCisjZW5kaWYKKworCXJldHVybiAtMTsKK30KKworLy8gQ29udmVydCBzaWduYWwgbnVtYmVyIHRvIG5hbWUKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGdldF9zaWduYW1lKGludCBudW1iZXIpCit7CisJaWYgKCh1bnNpZ25lZCludW1iZXIgPCBBUlJBWV9TSVpFKHNpZ25hbHMpKSB7CisJCWlmIChzaWduYWxzW251bWJlcl1bMF0pIC8qIGlmIGl0J3Mgbm90IGFuIGVtcHR5IHN0ciAqLworCQkJcmV0dXJuIHNpZ25hbHNbbnVtYmVyXTsKKwl9CisKKwlyZXR1cm4gaXRvYShudW1iZXIpOworfQorCisKKy8vIFByaW50IHRoZSB3aG9sZSBzaWduYWwgbGlzdAorCit2b2lkIEZBU1RfRlVOQyBwcmludF9zaWduYW1lcyh2b2lkKQoreworCXVuc2lnbmVkIHNpZ25vOworCisJZm9yIChzaWdubyA9IDE7IHNpZ25vIDwgQVJSQVlfU0laRShzaWduYWxzKTsgc2lnbm8rKykgeworCQljb25zdCBjaGFyICpuYW1lID0gc2lnbmFsc1tzaWdub107CisJCWlmIChuYW1lWzBdKQorCQkJcHJpbnRmKCIlMnUpICVzXG4iLCBzaWdubywgbmFtZSk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1JUTUlOTUFYCisjIGlmZGVmIF9fU0lHUlRNQVgKKwlwcmludGYoIiUydSkgJXNcbiIsIF9fU0lHUlRNQVgsICJSVE1BWCIpOworIyBlbmRpZgorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi91ZHBfaW8uYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3VkcF9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODVhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi91ZHBfaW8uYwpAQCAtMCwwICsxLDE3OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIFRoaXMgYXNrcyBrZXJuZWwgdG8gbGV0IHVzIGtub3cgZHN0IGFkZHIvcG9ydCBvZiBpbmNvbWluZyBwYWNrZXRzCisgKiBXZSBkb24ndCBjaGVjayBmb3IgZXJyb3JzIGhlcmUuIE5vdCBzdXBwb3J0ZWQgPT0gd29uJ3QgYmUgdXNlZAorICovCit2b2lkIEZBU1RfRlVOQworc29ja2V0X3dhbnRfcGt0aW5mbyhpbnQgZmQgVU5VU0VEX1BBUkFNKQoreworI2lmZGVmIElQX1BLVElORk8KKwlzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX0lQLCBJUF9QS1RJTkZPLCAmY29uc3RfaW50XzEsIHNpemVvZihpbnQpKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgZGVmaW5lZChJUFY2X1BLVElORk8pCisJc2V0c29ja29wdChmZCwgSVBQUk9UT19JUFY2LCBJUFY2X1BLVElORk8sICZjb25zdF9pbnRfMSwgc2l6ZW9mKGludCkpOworI2VuZGlmCit9CisKKworc3NpemVfdCBGQVNUX0ZVTkMKK3NlbmRfdG9fZnJvbShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgaW50IGZsYWdzLAorCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLAorCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sCisJCXNvY2tsZW5fdCB0b2xlbikKK3sKKyNpZm5kZWYgSVBfUEtUSU5GTworCSh2b2lkKWZyb207IC8qIHN1cHByZXNzICJ1bnVzZWQgZnJvbSIgd2FybmluZyAqLworCXJldHVybiBzZW5kdG8oZmQsIGJ1ZiwgbGVuLCBmbGFncywgdG8sIHRvbGVuKTsKKyNlbHNlCisJc3RydWN0IGlvdmVjIGlvdlsxXTsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwl1bmlvbiB7CisJCWNoYXIgY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaW5fcGt0aW5mbykpXTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNiAmJiBkZWZpbmVkKElQVjZfUEtUSU5GTykKKwkJY2hhciBjbXNnNltDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaW42X3BrdGluZm8pKV07CisjIGVuZGlmCisJfSB1OworCXN0cnVjdCBjbXNnaGRyKiBjbXNncHRyOworCisJaWYgKGZyb20tPnNhX2ZhbWlseSAhPSBBRl9JTkVUCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkgJiYgZnJvbS0+c2FfZmFtaWx5ICE9IEFGX0lORVQ2CisjIGVuZGlmCisJKSB7CisJCS8qIEFOWSBsb2NhbCBhZGRyZXNzICovCisJCXJldHVybiBzZW5kdG8oZmQsIGJ1ZiwgbGVuLCBmbGFncywgdG8sIHRvbGVuKTsKKwl9CisKKwkvKiBtYW4gcmVjdm1zZyBhbmQgbWFuIGNtc2cgaXMgbmVlZGVkIHRvIG1ha2Ugc2Vuc2Ugb2YgY29kZSBiZWxvdyAqLworCisJaW92WzBdLmlvdl9iYXNlID0gYnVmOworCWlvdlswXS5pb3ZfbGVuID0gbGVuOworCisJbWVtc2V0KCZ1LCAwLCBzaXplb2YodSkpOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKKwltc2cubXNnX25hbWUgPSAodm9pZCAqKShzdHJ1Y3Qgc29ja2FkZHIgKil0bzsgLyogb3IgY29tcGlsZXIgd2lsbCBhbm5veSB1cyAqLworCW1zZy5tc2dfbmFtZWxlbiA9IHRvbGVuOworCW1zZy5tc2dfaW92ID0gaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSAmdTsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YodSk7CisJbXNnLm1zZ19mbGFncyA9IGZsYWdzOworCisJY21zZ3B0ciA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisJaWYgKHRvLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCAmJiBmcm9tLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlzdHJ1Y3QgaW5fcGt0aW5mbyAqcGt0cHRyOworCQljbXNncHRyLT5jbXNnX2xldmVsID0gSVBQUk9UT19JUDsKKwkJY21zZ3B0ci0+Y21zZ190eXBlID0gSVBfUEtUSU5GTzsKKwkJY21zZ3B0ci0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IGluX3BrdGluZm8pKTsKKwkJcGt0cHRyID0gKHN0cnVjdCBpbl9wa3RpbmZvICopKENNU0dfREFUQShjbXNncHRyKSk7CisJCS8qcGt0cHRyLT5pcGlfaWZpbmRleCA9IDA7IC0tIGFscmVhZHkgZG9uZSBieSBtZW1zZXQodS4uLikgKi8KKwkJLyogSW4gZ2VuZXJhbCwgQ01TR19EQVRBKCkgY2FuIGJlIHVuYWxpZ25lZCwgYnV0IGluIHRoaXMgY2FzZQorCQkgKiB3ZSBrbm93IGZvciBzdXJlIGl0IGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkOgorCQkgKiBDTVNHX0ZJUlNUSERSIHNpbXBseSByZXR1cm5zICZ1IGFib3ZlLAorCQkgKiBhbmQgQ01TR19EQVRBIHJldHVybnMgJnUgKyBzaXplX3QgKyBpbnQgKyBpbnQuCisJCSAqIFRodXMgZGlyZWN0IGFzc2lnbm1lbnQgaXMgb2s6CisJCSAqLworCQlwa3RwdHItPmlwaV9zcGVjX2RzdCA9ICgoc3RydWN0IHNvY2thZGRyX2luKilmcm9tKS0+c2luX2FkZHI7CisJfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9JUFY2ICYmIGRlZmluZWQoSVBWNl9QS1RJTkZPKQorCWVsc2UgaWYgKHRvLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgZnJvbS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXN0cnVjdCBpbjZfcGt0aW5mbyAqcGt0cHRyOworCQljbXNncHRyLT5jbXNnX2xldmVsID0gSVBQUk9UT19JUFY2OworCQljbXNncHRyLT5jbXNnX3R5cGUgPSBJUFY2X1BLVElORk87CisJCWNtc2dwdHItPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpbjZfcGt0aW5mbykpOworCQlwa3RwdHIgPSAoc3RydWN0IGluNl9wa3RpbmZvICopKENNU0dfREFUQShjbXNncHRyKSk7CisJCS8qIHBrdHB0ci0+aXBpNl9pZmluZGV4ID0gMDsgLS0gYWxyZWFkeSBkb25lIGJ5IG1lbXNldCh1Li4uKSAqLworCQlwa3RwdHItPmlwaTZfYWRkciA9ICgoc3RydWN0IHNvY2thZGRyX2luNiopZnJvbSktPnNpbjZfYWRkcjsKKwl9CisjIGVuZGlmCisJbXNnLm1zZ19jb250cm9sbGVuID0gY21zZ3B0ci0+Y21zZ19sZW47CisKKwlyZXR1cm4gc2VuZG1zZyhmZCwgJm1zZywgZmxhZ3MpOworI2VuZGlmCit9CisKKy8qIE5COiB0aGlzIHdpbGwgbmV2ZXIgc2V0IHBvcnQjIGluICd0bychCisgKiBfT25seV8gSVAvSVB2NiBhZGRyZXNzIHBhcnQgb2YgJ3RvJyBpcyBfbWF5YmVfIG1vZGlmaWVkLgorICogVHlwaWNhbCB1c2FnZSBpcyB0byBwcmVpbml0ICd0bycgd2l0aCAiZGVmYXVsdCIgdmFsdWUKKyAqIGJlZm9yZSBjYWxsaW5nIHJlY3ZfZnJvbV90bygpLiAqLworc3NpemVfdCBGQVNUX0ZVTkMKK3JlY3ZfZnJvbV90byhpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgaW50IGZsYWdzLAorCQlzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sIHN0cnVjdCBzb2NrYWRkciAqdG8sCisJCXNvY2tsZW5fdCBzYV9zaXplKQoreworI2lmbmRlZiBJUF9QS1RJTkZPCisJKHZvaWQpdG87IC8qIHN1cHByZXNzICJ1bnVzZWQgdG8iIHdhcm5pbmcgKi8KKwlyZXR1cm4gcmVjdmZyb20oZmQsIGJ1ZiwgbGVuLCBmbGFncywgZnJvbSwgJnNhX3NpemUpOworI2Vsc2UKKwkvKiBtYW4gcmVjdm1zZyBhbmQgbWFuIGNtc2cgaXMgbmVlZGVkIHRvIG1ha2Ugc2Vuc2Ugb2YgY29kZSBiZWxvdyAqLworCXN0cnVjdCBpb3ZlYyBpb3ZbMV07CisJdW5pb24geworCQljaGFyIGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IGluX3BrdGluZm8pKV07CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgZGVmaW5lZChJUFY2X1BLVElORk8pCisJCWNoYXIgY21zZzZbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IGluNl9wa3RpbmZvKSldOworIyBlbmRpZgorCX0gdTsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZ3B0cjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzc2l6ZV90IHJlY3ZfbGVuZ3RoOworCisJaW92WzBdLmlvdl9iYXNlID0gYnVmOworCWlvdlswXS5pb3ZfbGVuID0gbGVuOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKKwltc2cubXNnX25hbWUgPSAoc3RydWN0IHNvY2thZGRyICopZnJvbTsKKwltc2cubXNnX25hbWVsZW4gPSBzYV9zaXplOworCW1zZy5tc2dfaW92ID0gaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSAmdTsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YodSk7CisKKwlyZWN2X2xlbmd0aCA9IHJlY3Ztc2coZmQsICZtc2csIGZsYWdzKTsKKwlpZiAocmVjdl9sZW5ndGggPCAwKQorCQlyZXR1cm4gcmVjdl9sZW5ndGg7CisKKyMgZGVmaW5lIHRvNCAoKHN0cnVjdCBzb2NrYWRkcl9pbiopdG8pCisjIGRlZmluZSB0bzYgKChzdHJ1Y3Qgc29ja2FkZHJfaW42Kil0bykKKwkvKiBIZXJlIHdlIHRyeSB0byByZXRyaWV2ZSBkZXN0aW5hdGlvbiBJUCBhbmQgbWVtb3JpemUgaXQgKi8KKwlmb3IgKGNtc2dwdHIgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOworCQkJY21zZ3B0ciAhPSBOVUxMOworCQkJY21zZ3B0ciA9IENNU0dfTlhUSERSKCZtc2csIGNtc2dwdHIpCisJKSB7CisJCWlmIChjbXNncHRyLT5jbXNnX2xldmVsID09IElQUFJPVE9fSVAKKwkJICYmIGNtc2dwdHItPmNtc2dfdHlwZSA9PSBJUF9QS1RJTkZPCisJCSkgeworCQkJY29uc3QgaW50IElQSV9BRERSX09GRiA9IG9mZnNldG9mKHN0cnVjdCBpbl9wa3RpbmZvLCBpcGlfYWRkcik7CisJCQl0by0+c2FfZmFtaWx5ID0gQUZfSU5FVDsKKwkJCS8qIyBkZWZpbmUgcGt0aW5mbyhjbXNncHRyKSAoIChzdHJ1Y3QgaW5fcGt0aW5mbyopKENNU0dfREFUQShjbXNncHRyKSkgKSovCisJCQkvKnRvNC0+c2luX2FkZHIgPSBwa3RpbmZvKGNtc2dwdHIpLT5pcGlfYWRkcjsgLSBtYXkgYmUgdW5hbGlnbmVkICovCisJCQltZW1jcHkoJnRvNC0+c2luX2FkZHIsIChjaGFyKikoQ01TR19EQVRBKGNtc2dwdHIpKSArIElQSV9BRERSX09GRiwgc2l6ZW9mKHRvNC0+c2luX2FkZHIpKTsKKwkJCS8qdG80LT5zaW5fcG9ydCA9IDEyMzsgLSB0aGlzIGRhdGEgaXMgbm90IHN1cHBsaWVkIGJ5IGtlcm5lbCAqLworCQkJYnJlYWs7CisJCX0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNiAmJiBkZWZpbmVkKElQVjZfUEtUSU5GTykKKwkJaWYgKGNtc2dwdHItPmNtc2dfbGV2ZWwgPT0gSVBQUk9UT19JUFY2CisJCSAmJiBjbXNncHRyLT5jbXNnX3R5cGUgPT0gSVBWNl9QS1RJTkZPCisJCSkgeworCQkJY29uc3QgaW50IElQSTZfQUREUl9PRkYgPSBvZmZzZXRvZihzdHJ1Y3QgaW42X3BrdGluZm8sIGlwaTZfYWRkcik7CisJCQl0by0+c2FfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQkvKiMgIGRlZmluZSBwa3RpbmZvKGNtc2dwdHIpICggKHN0cnVjdCBpbjZfcGt0aW5mbyopKENNU0dfREFUQShjbXNncHRyKSkgKSovCisJCQkvKnRvNi0+c2luNl9hZGRyID0gcGt0aW5mbyhjbXNncHRyKS0+aXBpNl9hZGRyOyAtIG1heSBiZSB1bmFsaWduZWQgKi8KKwkJCW1lbWNweSgmdG82LT5zaW42X2FkZHIsIChjaGFyKikoQ01TR19EQVRBKGNtc2dwdHIpKSArIElQSTZfQUREUl9PRkYsIHNpemVvZih0bzYtPnNpbjZfYWRkcikpOworCQkJLyp0bzYtPnNpbjZfcG9ydCA9IDEyMzsgKi8KKwkJCWJyZWFrOworCQl9CisjIGVuZGlmCisJfQorCXJldHVybiByZWN2X2xlbmd0aDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvdW5pY29kZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvdW5pY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGMxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi91bmljb2RlLmMKQEAgLTAsMCArMSwxMTU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVbmljb2RlIHN1cHBvcnQgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisvKiBJZiBpdCdzIG5vdCAjZGVmaW5lZCBhcyBhIGNvbnN0YW50IGluIHVuaWNvZGUuaC4uLiAqLworI2lmbmRlZiB1bmljb2RlX3N0YXR1cwordWludDhfdCB1bmljb2RlX3N0YXR1czsKKyNlbmRpZgorCisvKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgb25seSBpZiBVTklDT0RFX1NVUFBPUlQgaXMgb24uCisgKiBXZSBjaGVjayBvdGhlciBvcHRpb25zIGFuZCBkZWNpZGUgd2hldGhlciB0byB1c2UgbGliYyBzdXBwb3J0CisgKiB2aWEgbG9jYWxlLCBvciB1c2Ugb3VyIG93biBsb2dpYzoKKyAqLworCisjaWYgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisKKy8qIFVuaWNvZGUgc3VwcG9ydCB1c2luZyBsaWJjIGxvY2FsZSBzdXBwb3J0LiAqLworCit2b2lkIEZBU1RfRlVOQyByZWluaXRfdW5pY29kZShjb25zdCBjaGFyICpMQU5HKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHVuaWNvZGVfMHgzOTRbXSA9IHsgMHhjZSwgMHg5NCwgMCB9OworCXNpemVfdCB3aWR0aDsKKworLy9UT0RPOiBhdm9pZCByZXBlYXRlZCBjYWxscyBieSBjYWNoaW5nIGxhc3Qgc3RyaW5nPworCXNldGxvY2FsZShMQ19BTEwsIChMQU5HICYmIExBTkdbMF0pID8gTEFORyA6ICJDIik7CisKKwkvKiBJbiB1bmljb2RlLCB0aGlzIGlzIGEgb25lIGNoYXJhY3RlciBzdHJpbmcgKi8KKy8vIGNhbiB1c2UgdW5pY29kZV9zdHJsZW4oc3RyaW5nKSB0b28sIGJ1dCBvdGhlcndpc2UgdW5pY29kZV9zdHJsZW4oKSBpcyB1bnVzZWQKKwl3aWR0aCA9IG1ic3Rvd2NzKE5VTEwsIHVuaWNvZGVfMHgzOTQsIElOVF9NQVgpOworCXVuaWNvZGVfc3RhdHVzID0gKHdpZHRoID09IDEgPyBVTklDT0RFX09OIDogVU5JQ09ERV9PRkYpOworfQorCit2b2lkIEZBU1RfRlVOQyBpbml0X3VuaWNvZGUodm9pZCkKK3sKKwlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9VTktOT1dOKQorCQlyZWluaXRfdW5pY29kZShnZXRlbnYoIkxBTkciKSk7Cit9CisKKyNlbHNlCisKKy8qIEhvbWVncm93biBVbmljb2RlIHN1cHBvcnQuIEl0IGtub3dzIG9ubHkgQyBhbmQgVW5pY29kZSBsb2NhbGVzLiAqLworCisjIGlmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WCit2b2lkIEZBU1RfRlVOQyByZWluaXRfdW5pY29kZShjb25zdCBjaGFyICpMQU5HKQoreworCXVuaWNvZGVfc3RhdHVzID0gVU5JQ09ERV9PRkY7CisJaWYgKCFMQU5HIHx8ICEoc3Ryc3RyKExBTkcsICIudXRmIikgfHwgc3Ryc3RyKExBTkcsICIuVVRGIikpKQorCQlyZXR1cm47CisJdW5pY29kZV9zdGF0dXMgPSBVTklDT0RFX09OOworfQorCit2b2lkIEZBU1RfRlVOQyBpbml0X3VuaWNvZGUodm9pZCkKK3sKKwlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9VTktOT1dOKQorCQlyZWluaXRfdW5pY29kZShnZXRlbnYoIkxBTkciKSk7Cit9CisjIGVuZGlmCisKK3N0YXRpYyBzaXplX3Qgd2NydG9tYl9pbnRlcm5hbChjaGFyICpzLCB3Y2hhcl90IHdjKQoreworCWludCBuLCBpOworCXVpbnQzMl90IHYgPSB3YzsKKworCWlmICh2IDw9IDB4N2YpIHsKKwkJKnMgPSB2OworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBSRkMgMzYyOSBzYXlzIHRoYXQgVW5pY29kZSBlbmRzIGF0IDEwRkZGRiwKKwkgKiBidXQgd2UgY292ZXIgZW50aXJlIDMyIGJpdHMgKi8KKworCS8qIDQwMDAwMDAtRkZGRkZGRkYgLT4gMTExMTExdHQgMTB0dHR0dHQgMTB6enp6enogMTB6enl5eXkgMTB5eXl5eHggMTB4eHh4eHggKi8KKwkvKiAyMDAwMDAtM0ZGRkZGRiAtPiAxMTExMTB0dCAxMHp6enp6eiAxMHp6eXl5eSAxMHl5eXl4eCAxMHh4eHh4eCAqLworCS8qIDEwMDAwLTFGRkZGRiAtPiAxMTExMHp6eiAxMHp6eXl5eSAxMHl5eXl4eCAxMHh4eHh4eCAqLworCS8qIDgwMC1GRkZGIC0+IDExMTB5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJLyogODAtN0ZGIC0+IDExMHl5eXh4IDEweHh4eHh4ICovCisKKwkvKiBIb3cgbWFueSBieXRlcyBkbyB3ZSBuZWVkPyAqLworCW4gPSAyOworCS8qICgweDgwMDAwMDAwKyB3b3VsZCByZXN1bHQgaW4gbiA9IDcsIGxpbWl0aW5nIG4gdG8gNikgKi8KKwl3aGlsZSAodiA+PSAweDgwMCAmJiBuIDwgNikgeworCQl2ID4+PSA1OworCQluKys7CisJfQorCS8qIEZpbGwgYnl0ZXMgbi0xLi4xICovCisJaSA9IG47CisJd2hpbGUgKC0taSkgeworCQlzW2ldID0gKHdjICYgMHgzZikgfCAweDgwOworCQl3YyA+Pj0gNjsKKwl9CisJLyogRmlsbCBieXRlIDAgKi8KKwlzWzBdID0gd2MgfCAodWludDhfdCkoMHgzZjAwID4+IG4pOworCXJldHVybiBuOworfQorc2l6ZV90IEZBU1RfRlVOQyB3Y3J0b21iKGNoYXIgKnMsIHdjaGFyX3Qgd2MsIG1ic3RhdGVfdCAqcHMgVU5VU0VEX1BBUkFNKQoreworCWlmICh1bmljb2RlX3N0YXR1cyAhPSBVTklDT0RFX09OKSB7CisJCSpzID0gd2M7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiB3Y3J0b21iX2ludGVybmFsKHMsIHdjKTsKK30KK3NpemVfdCBGQVNUX0ZVTkMgd2NzdG9tYnMoY2hhciAqZGVzdCwgY29uc3Qgd2NoYXJfdCAqc3JjLCBzaXplX3QgbikKK3sKKwlzaXplX3Qgb3JnX24gPSBuOworCisJaWYgKHVuaWNvZGVfc3RhdHVzICE9IFVOSUNPREVfT04pIHsKKwkJd2hpbGUgKG4pIHsKKwkJCXdjaGFyX3QgYyA9ICpzcmMrKzsKKwkJCSpkZXN0KysgPSBjOworCQkJaWYgKGMgPT0gMCkKKwkJCQlicmVhazsKKwkJCW4tLTsKKwkJfQorCQlyZXR1cm4gb3JnX24gLSBuOworCX0KKworCXdoaWxlIChuID49IE1CX0NVUl9NQVgpIHsKKwkJd2NoYXJfdCB3YyA9ICpzcmMrKzsKKwkJc2l6ZV90IGxlbiA9IHdjcnRvbWJfaW50ZXJuYWwoZGVzdCwgd2MpOworCisJCWlmICh3YyA9PSBMJ1wwJykKKwkJCXJldHVybiBvcmdfbiAtIG47CisJCWRlc3QgKz0gbGVuOworCQluIC09IGxlbjsKKwl9CisJd2hpbGUgKG4pIHsKKwkJY2hhciB0YnVmW01CX0NVUl9NQVhdOworCQl3Y2hhcl90IHdjID0gKnNyYysrOworCQlzaXplX3QgbGVuID0gd2NydG9tYl9pbnRlcm5hbCh0YnVmLCB3Yyk7CisKKwkJaWYgKGxlbiA+IG4pCisJCQlicmVhazsKKwkJbWVtY3B5KGRlc3QsIHRidWYsIGxlbik7CisJCWlmICh3YyA9PSBMJ1wwJykKKwkJCXJldHVybiBvcmdfbiAtIG47CisJCWRlc3QgKz0gbGVuOworCQluIC09IGxlbjsKKwl9CisJcmV0dXJuIG9yZ19uIC0gbjsKK30KKworIyBkZWZpbmUgRVJST1JfV0NIQVIgKH4od2NoYXJfdCkwKQorCitzdGF0aWMgY29uc3QgY2hhciAqbWJzdG93Y19pbnRlcm5hbCh3Y2hhcl90ICpyZXMsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwlpbnQgYnl0ZXM7CisJdW5zaWduZWQgYyA9ICh1bnNpZ25lZCBjaGFyKSAqc3JjKys7CisKKwlpZiAoYyA8PSAweDdmKSB7CisJCSpyZXMgPSBjOworCQlyZXR1cm4gc3JjOworCX0KKworCS8qIDgwLTdGRiAtPiAxMTB5eXl4eCAxMHh4eHh4eCAqLworCS8qIDgwMC1GRkZGIC0+IDExMTB5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJLyogMTAwMDAtMUZGRkZGIC0+IDExMTEwenp6IDEwenp5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJLyogMjAwMDAwLTNGRkZGRkYgLT4gMTExMTEwdHQgMTB6enp6enogMTB6enl5eXkgMTB5eXl5eHggMTB4eHh4eHggKi8KKwkvKiA0MDAwMDAwLUZGRkZGRkZGIC0+IDExMTExMXR0IDEwdHR0dHR0IDEwenp6enp6IDEwenp5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJYnl0ZXMgPSAwOworCWRvIHsKKwkJYyA8PD0gMTsKKwkJYnl0ZXMrKzsKKwl9IHdoaWxlICgoYyAmIDB4ODApICYmIGJ5dGVzIDwgNik7CisJaWYgKGJ5dGVzID09IDEpIHsKKwkJLyogQSBiYXJlICJjb250aW51YXRpb24iIGJ5dGUuIFNheSwgODAgKi8KKwkJKnJlcyA9IEVSUk9SX1dDSEFSOworCQlyZXR1cm4gc3JjOworCX0KKwljID0gKHVpbnQ4X3QpKGMpID4+IGJ5dGVzOworCisJd2hpbGUgKC0tYnl0ZXMpIHsKKwkJdW5zaWduZWQgY2ggPSAodW5zaWduZWQgY2hhcikgKnNyYzsKKwkJaWYgKChjaCAmIDB4YzApICE9IDB4ODApIHsKKwkJCS8qIE1pc3NpbmcgImNvbnRpbnVhdGlvbiIgYnl0ZS4gRXhhbXBsZTogZTAgODAgKi8KKwkJCSpyZXMgPSBFUlJPUl9XQ0hBUjsKKwkJCXJldHVybiBzcmM7CisJCX0KKwkJYyA9IChjIDw8IDYpICsgKGNoICYgMHgzZik7CisJCXNyYysrOworCX0KKworCS8qIFRPRE8gKi8KKwkvKiBOZWVkIHRvIGNoZWNrIHRoYXQgYyBpc24ndCBwcm9kdWNlZCBieSBvdmVybG9uZyBlbmNvZGluZyAqLworCS8qIEV4YW1wbGU6IDExMDAwMDAwIDEwMDAwMDAwIGNvbnZlcnRzIHRvIE5VTCAqLworCS8qIDExMTEwMDAwIDEwMDAwMDAwIDEwMDAwMTAwIDEwMDAwMDAwIGNvbnZlcnRzIHRvIDB4MTAwICovCisJLyogY29ycmVjdCBlbmNvZGluZzogMTEwMDAxMDAgMTAwMDAwMDAgKi8KKwlpZiAoYyA8PSAweDdmKSB7IC8qIGNydWRlIGNoZWNrICovCisJCSpyZXMgPSBFUlJPUl9XQ0hBUjsKKwkJcmV0dXJuIHNyYzsKKwl9CisKKwkqcmVzID0gYzsKKwlyZXR1cm4gc3JjOworfQorc2l6ZV90IEZBU1RfRlVOQyBtYnN0b3djcyh3Y2hhcl90ICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKQoreworCXNpemVfdCBvcmdfbiA9IG47CisKKwlpZiAodW5pY29kZV9zdGF0dXMgIT0gVU5JQ09ERV9PTikgeworCQl3aGlsZSAobikgeworCQkJdW5zaWduZWQgY2hhciBjID0gKnNyYysrOworCisJCQlpZiAoZGVzdCkKKwkJCQkqZGVzdCsrID0gYzsKKwkJCWlmIChjID09IDApCisJCQkJYnJlYWs7CisJCQluLS07CisJCX0KKwkJcmV0dXJuIG9yZ19uIC0gbjsKKwl9CisKKwl3aGlsZSAobikgeworCQl3Y2hhcl90IHdjOworCQlzcmMgPSBtYnN0b3djX2ludGVybmFsKCZ3Yywgc3JjKTsKKwkJaWYgKHdjID09IEVSUk9SX1dDSEFSKSAvKiBlcnJvciAqLworCQkJcmV0dXJuIChzaXplX3QpIC0xTDsKKwkJaWYgKGRlc3QpCisJCQkqZGVzdCsrID0gd2M7CisJCWlmICh3YyA9PSAwKSAvKiBlbmQtb2Ytc3RyaW5nICovCisJCQlicmVhazsKKwkJbi0tOworCX0KKworCXJldHVybiBvcmdfbiAtIG47Cit9CisKK2ludCBGQVNUX0ZVTkMgaXN3c3BhY2Uod2ludF90IHdjKQoreworCXJldHVybiAodW5zaWduZWQpd2MgPD0gMHg3ZiAmJiBpc3NwYWNlKHdjKTsKK30KKworaW50IEZBU1RfRlVOQyBpc3dhbG51bSh3aW50X3Qgd2MpCit7CisJcmV0dXJuICh1bnNpZ25lZCl3YyA8PSAweDdmICYmIGlzYWxudW0od2MpOworfQorCitpbnQgRkFTVF9GVU5DIGlzd3B1bmN0KHdpbnRfdCB3YykKK3sKKwlyZXR1cm4gKHVuc2lnbmVkKXdjIDw9IDB4N2YgJiYgaXNwdW5jdCh3Yyk7Cit9CisKKworIyBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHgzMDAKK3N0cnVjdCBpbnRlcnZhbCB7CisJdWludDE2X3QgZmlyc3Q7CisJdWludDE2X3QgbGFzdDsKK307CisKKy8qIGF1eGlsaWFyeSBmdW5jdGlvbiBmb3IgYmluYXJ5IHNlYXJjaCBpbiBpbnRlcnZhbCB0YWJsZSAqLworc3RhdGljIGludCBpbl9pbnRlcnZhbF90YWJsZSh1bnNpZ25lZCB1Y3MsIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCAqdGFibGUsIHVuc2lnbmVkIG1heCkKK3sKKwl1bnNpZ25lZCBtaW47CisJdW5zaWduZWQgbWlkOworCisJaWYgKHVjcyA8IHRhYmxlWzBdLmZpcnN0IHx8IHVjcyA+IHRhYmxlW21heF0ubGFzdCkKKwkJcmV0dXJuIDA7CisKKwltaW4gPSAwOworCXdoaWxlIChtYXggPj0gbWluKSB7CisJCW1pZCA9IChtaW4gKyBtYXgpIC8gMjsKKwkJaWYgKHVjcyA+IHRhYmxlW21pZF0ubGFzdCkKKwkJCW1pbiA9IG1pZCArIDE7CisJCWVsc2UgaWYgKHVjcyA8IHRhYmxlW21pZF0uZmlyc3QpCisJCQltYXggPSBtaWQgLSAxOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5fdWludDE2X3RhYmxlKHVuc2lnbmVkIHVjcywgY29uc3QgdWludDE2X3QgKnRhYmxlLCB1bnNpZ25lZCBtYXgpCit7CisJdW5zaWduZWQgbWluOworCXVuc2lnbmVkIG1pZDsKKwl1bnNpZ25lZCBmaXJzdCwgbGFzdDsKKworCWZpcnN0ID0gdGFibGVbMF0gPj4gMjsKKwlsYXN0ID0gZmlyc3QgKyAodGFibGVbMF0gJiAzKTsKKwlpZiAodWNzIDwgZmlyc3QgfHwgdWNzID4gbGFzdCkKKwkJcmV0dXJuIDA7CisKKwltaW4gPSAwOworCXdoaWxlIChtYXggPj0gbWluKSB7CisJCW1pZCA9IChtaW4gKyBtYXgpIC8gMjsKKwkJZmlyc3QgPSB0YWJsZVttaWRdID4+IDI7CisJCWxhc3QgPSBmaXJzdCArICh0YWJsZVttaWRdICYgMyk7CisJCWlmICh1Y3MgPiBsYXN0KQorCQkJbWluID0gbWlkICsgMTsKKwkJZWxzZSBpZiAodWNzIDwgZmlyc3QpCisJCQltYXggPSBtaWQgLSAxOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjIGVuZGlmCisKKworLyoKKyAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygd2N3aWR0aCgpIGFuZCB3Y3N3aWR0aCgpIChkZWZpbmVkIGluCisgKiBJRUVFIFN0ZCAxMDAyLjEtMjAwMSkgZm9yIFVuaWNvZGUuCisgKgorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L2Z1bmN0aW9ucy93Y3dpZHRoLmh0bWwKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS9mdW5jdGlvbnMvd2Nzd2lkdGguaHRtbAorICoKKyAqIEluIGZpeGVkLXdpZHRoIG91dHB1dCBkZXZpY2VzLCBMYXRpbiBjaGFyYWN0ZXJzIGFsbCBvY2N1cHkgYSBzaW5nbGUKKyAqICJjZWxsIiBwb3NpdGlvbiBvZiBlcXVhbCB3aWR0aCwgd2hlcmVhcyBpZGVvZ3JhcGhpYyBDSksgY2hhcmFjdGVycworICogb2NjdXB5IHR3byBzdWNoIGNlbGxzLiBJbnRlcm9wZXJhYmlsaXR5IGJldHdlZW4gdGVybWluYWwtbGluZQorICogYXBwbGljYXRpb25zIGFuZCAodGVsZXR5cGUtc3R5bGUpIGNoYXJhY3RlciB0ZXJtaW5hbHMgdXNpbmcgdGhlCisgKiBVVEYtOCBlbmNvZGluZyByZXF1aXJlcyBhZ3JlZW1lbnQgb24gd2hpY2ggY2hhcmFjdGVyIHNob3VsZCBhZHZhbmNlCisgKiB0aGUgY3Vyc29yIGJ5IGhvdyBtYW55IGNlbGwgcG9zaXRpb25zLiBObyBlc3RhYmxpc2hlZCBmb3JtYWwKKyAqIHN0YW5kYXJkcyBleGlzdCBhdCBwcmVzZW50IG9uIHdoaWNoIFVuaWNvZGUgY2hhcmFjdGVyIHNoYWxsIG9jY3VweQorICogaG93IG1hbnkgY2VsbCBwb3NpdGlvbnMgb24gY2hhcmFjdGVyIHRlcm1pbmFscy4gVGhlc2Ugcm91dGluZXMgYXJlCisgKiBhIGZpcnN0IGF0dGVtcHQgb2YgZGVmaW5pbmcgc3VjaCBiZWhhdmlvciBiYXNlZCBvbiBzaW1wbGUgcnVsZXMKKyAqIGFwcGxpZWQgdG8gZGF0YSBwcm92aWRlZCBieSB0aGUgVW5pY29kZSBDb25zb3J0aXVtLgorICoKKyAqIEZvciBzb21lIGdyYXBoaWNhbCBjaGFyYWN0ZXJzLCB0aGUgVW5pY29kZSBzdGFuZGFyZCBleHBsaWNpdGx5CisgKiBkZWZpbmVzIGEgY2hhcmFjdGVyLWNlbGwgd2lkdGggdmlhIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBFYXN0IEFzaWFuCisgKiBGdWxsV2lkdGggKEYpLCBXaWRlIChXKSwgSGFsZi13aWR0aCAoSCksIGFuZCBOYXJyb3cgKE5hKSBjbGFzc2VzLgorICogSW4gYWxsIHRoZXNlIGNhc2VzLCB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgYWJvdXQgd2hpY2ggd2lkdGggYQorICogdGVybWluYWwgc2hhbGwgdXNlLiBGb3IgY2hhcmFjdGVycyBpbiB0aGUgRWFzdCBBc2lhbiBBbWJpZ3VvdXMgKEEpCisgKiBjbGFzcywgdGhlIHdpZHRoIGNob2ljZSBkZXBlbmRzIHB1cmVseSBvbiBhIHByZWZlcmVuY2Ugb2YgYmFja3dhcmQKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBlaXRoZXIgaGlzdG9yaWMgQ0pLIG9yIFdlc3Rlcm4gcHJhY3RpY2UuCisgKiBDaG9vc2luZyBzaW5nbGUtd2lkdGggZm9yIHRoZXNlIGNoYXJhY3RlcnMgaXMgZWFzeSB0byBqdXN0aWZ5IGFzCisgKiB0aGUgYXBwcm9wcmlhdGUgbG9uZy10ZXJtIHNvbHV0aW9uLCBhcyB0aGUgQ0pLIHByYWN0aWNlIG9mCisgKiBkaXNwbGF5aW5nIHRoZXNlIGNoYXJhY3RlcnMgYXMgZG91YmxlLXdpZHRoIGNvbWVzIGZyb20gaGlzdG9yaWMKKyAqIGltcGxlbWVudGF0aW9uIHNpbXBsaWNpdHkgKDgtYml0IGVuY29kZWQgY2hhcmFjdGVycyB3ZXJlIGRpc3BsYXllZAorICogc2luZ2xlLXdpZHRoIGFuZCAxNi1iaXQgb25lcyBkb3VibGUtd2lkdGgsIGV2ZW4gZm9yIEdyZWVrLAorICogQ3lyaWxsaWMsIGV0Yy4pIGFuZCBub3QgYW55IHR5cG9ncmFwaGljIGNvbnNpZGVyYXRpb25zLgorICoKKyAqIE11Y2ggbGVzcyBjbGVhciBpcyB0aGUgY2hvaWNlIG9mIHdpZHRoIGZvciB0aGUgTm90IEVhc3QgQXNpYW4KKyAqIChOZXV0cmFsKSBjbGFzcy4gRXhpc3RpbmcgcHJhY3RpY2UgZG9lcyBub3QgZGljdGF0ZSBhIHdpZHRoIGZvciBhbnkKKyAqIG9mIHRoZXNlIGNoYXJhY3RlcnMuIEl0IHdvdWxkIG5ldmVydGhlbGVzcyBtYWtlIHNlbnNlCisgKiB0eXBvZ3JhcGhpY2FsbHkgdG8gYWxsb2NhdGUgdHdvIGNoYXJhY3RlciBjZWxscyB0byBjaGFyYWN0ZXJzIHN1Y2gKKyAqIGFzIGZvciBpbnN0YW5jZSBFTSBTUEFDRSBvciBWT0xVTUUgSU5URUdSQUwsIHdoaWNoIGNhbm5vdCBiZQorICogcmVwcmVzZW50ZWQgYWRlcXVhdGVseSB3aXRoIGEgc2luZ2xlLXdpZHRoIGdseXBoLiBUaGUgZm9sbG93aW5nCisgKiByb3V0aW5lcyBhdCBwcmVzZW50IG1lcmVseSBhc3NpZ24gYSBzaW5nbGUtY2VsbCB3aWR0aCB0byBhbGwKKyAqIG5ldXRyYWwgY2hhcmFjdGVycywgaW4gdGhlIGludGVyZXN0IG9mIHNpbXBsaWNpdHkuIFRoaXMgaXMgbm90CisgKiBlbnRpcmVseSBzYXRpc2ZhY3RvcnkgYW5kIHNob3VsZCBiZSByZWNvbnNpZGVyZWQgYmVmb3JlCisgKiBlc3RhYmxpc2hpbmcgYSBmb3JtYWwgc3RhbmRhcmQgaW4gdGhpcyBhcmVhLiBBdCB0aGUgbW9tZW50LCB0aGUKKyAqIGRlY2lzaW9uIHdoaWNoIE5vdCBFYXN0IEFzaWFuIChOZXV0cmFsKSBjaGFyYWN0ZXJzIHNob3VsZCBiZQorICogcmVwcmVzZW50ZWQgYnkgZG91YmxlLXdpZHRoIGdseXBocyBjYW5ub3QgeWV0IGJlIGFuc3dlcmVkIGJ5CisgKiBhcHBseWluZyBhIHNpbXBsZSBydWxlIGZyb20gdGhlIFVuaWNvZGUgZGF0YWJhc2UgY29udGVudC4gU2V0dGluZworICogdXAgYSBwcm9wZXIgc3RhbmRhcmQgZm9yIHRoZSBiZWhhdmlvciBvZiBVVEYtOCBjaGFyYWN0ZXIgdGVybWluYWxzCisgKiB3aWxsIHJlcXVpcmUgYSBjYXJlZnVsIGFuYWx5c2lzIG5vdCBvbmx5IG9mIGVhY2ggVW5pY29kZSBjaGFyYWN0ZXIsCisgKiBidXQgYWxzbyBvZiBlYWNoIHByZXNlbnRhdGlvbiBmb3JtLCBzb21ldGhpbmcgdGhlIGF1dGhvciBvZiB0aGVzZQorICogcm91dGluZXMgaGFzIGF2b2lkZWQgdG8gZG8gc28gZmFyLgorICoKKyAqIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTEvCisgKgorICogTWFya3VzIEt1aG4gLS0gMjAwNy0wNS0yNiAoVW5pY29kZSA1LjApCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorICogZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4gVGhlIGF1dGhvcgorICogZGlzY2xhaW1zIGFsbCB3YXJyYW50aWVzIHdpdGggcmVnYXJkIHRvIHRoaXMgc29mdHdhcmUuCisgKgorICogTGF0ZXN0IHZlcnNpb246IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3Mvd2N3aWR0aC5jCisgKi8KKworLyogQXNzaWduZWQgVW5pY29kZSBjaGFyYWN0ZXIgcmFuZ2VzOgorICogUGxhbmUgUmFuZ2UKKyAqIDAgICAgICAgMDAwMOKAk0ZGRkYgICBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAqIDEgICAgICAxMDAwMOKAkzFGRkZGICBTdXBwbGVtZW50YXJ5IE11bHRpbGluZ3VhbCBQbGFuZQorICogMiAgICAgIDIwMDAw4oCTMkZGRkYgIFN1cHBsZW1lbnRhcnkgSWRlb2dyYXBoaWMgUGxhbmUKKyAqIDMgICAgICAzMDAwMC0zRkZGRiAgVGVydGlhcnkgSWRlb2dyYXBoaWMgUGxhbmUgKG5vIGNoYXJzIGFzc2lnbmVkIHlldCkKKyAqIDQtMTMgICA0MDAwMOKAk0RGRkZGICBjdXJyZW50bHkgdW5hc3NpZ25lZAorICogMTQgICAgIEUwMDAw4oCTRUZGRkYgIFN1cHBsZW1lbnRhcnkgU3BlY2lhbC1wdXJwb3NlIFBsYW5lCisgKiAxNSAgICAgRjAwMDDigJNGRkZGRiAgU3VwcGxlbWVudGFyeSBQcml2YXRlIFVzZSBBcmVhLUEKKyAqIDE2ICAgIDEwMDAwMOKAkzEwRkZGRiBTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQgorICoKKyAqICJTdXBwbGVtZW50YXJ5IFNwZWNpYWwtcHVycG9zZSBQbGFuZSBjdXJyZW50bHkgY29udGFpbnMgbm9uLWdyYXBoaWNhbAorICogY2hhcmFjdGVycyBpbiB0d28gYmxvY2tzIG9mIDEyOCBhbmQgMjQwIGNoYXJhY3RlcnMuIFRoZSBmaXJzdCBibG9jaworICogaXMgZm9yIGxhbmd1YWdlIHRhZyBjaGFyYWN0ZXJzIGZvciB1c2Ugd2hlbiBsYW5ndWFnZSBjYW5ub3QgYmUgaW5kaWNhdGVkCisgKiB0aHJvdWdoIG90aGVyIHByb3RvY29scyAoc3VjaCBhcyB0aGUgeG1sOmxhbmcgIGF0dHJpYnV0ZSBpbiBYTUwpLgorICogVGhlIG90aGVyIGJsb2NrIGNvbnRhaW5zIGdseXBoIHZhcmlhdGlvbiBzZWxlY3RvcnMgdG8gaW5kaWNhdGUKKyAqIGFuIGFsdGVybmF0ZSBnbHlwaCBmb3IgYSBjaGFyYWN0ZXIgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBjb250ZXh0LiIKKyAqCisgKiBJbiBzaW1wbGVyIHRlcm1zOiBpdCBpcyBhIHRvb2wgdG8gZml4IHRoZSAiSGFuIHVuaWZpY2F0aW9uIiBtZXNzCisgKiBjcmVhdGVkIGJ5IFVuaWNvZGUgY29tbWl0dGVlLCB0byBzZWxlY3QgQ2hpbmVzZS9KYXBhbmVzZS9Lb3JlYW4vVGFpd2FuCisgKiB2ZXJzaW9uIG9mIGEgY2hhcmFjdGVyLiAoVGhleSBmb3Jnb3QgdGhhdCB0aGUgd2hvbGUgcHVycG9zZSBvZiB0aGUgVW5pY29kZQorICogd2FzIHRvIGJlIGFibGUgdG8gd3JpdGUgYWxsIGNoYXJzIGluIG9uZSBjaGFyc2V0IHdpdGhvdXQgc3VjaCB0cmlja3MpLgorICogVW50aWwgRWFzdCBBc2lhbiB1c2VycyBzYXkgaXQgaXMgYWN0dWFsbHkgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhlc2UKKyAqIGNvZGUgcG9pbnRzIGluIGNvbnNvbGUgYXBwbGljYXRpb25zIGxpa2UgYnVzeWJveAorICogKGkuZS4gZG8gdGhlc2UgY2hhcnMgZXZlciBhcHBlYXIgaW4gZmlsZW5hbWVzLCBob3N0bmFtZXMsIHRleHQgZmlsZXMKKyAqIGFuZCBzdWNoPyksIHdlIGFyZSB0cmVhdGluZyB0aGVzZSBjb2RlIHBvaW50cyBhcyBpbnZhbGlkLgorICoKKyAqIFRlcnRpYXJ5IElkZW9ncmFwaGljIFBsYW5lIGlzIGFsc28gaWdub3JlZCBmb3Igbm93LAorICogdW50aWwgVW5pY29kZSBjb21taXR0ZWUgYXNzaWducyBzb21ldGhpbmcgdGhlcmUuCisgKi8KKy8qIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBkZWZpbmUgdGhlIGNvbHVtbiB3aWR0aCBvZiBhbiBJU08gMTA2NDYKKyAqIGNoYXJhY3RlciBhcyBmb2xsb3dzOgorICoKKyAqICAgIC0gVGhlIG51bGwgY2hhcmFjdGVyIChVKzAwMDApIGhhcyBhIGNvbHVtbiB3aWR0aCBvZiAwLgorICoKKyAqICAgIC0gT3RoZXIgQzAvQzEgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBERUwgd2lsbCBsZWFkIHRvIGEgcmV0dXJuCisgKiAgICAgIHZhbHVlIG9mIC0xLgorICoKKyAqICAgIC0gTm9uLXNwYWNpbmcgYW5kIGVuY2xvc2luZyBjb21iaW5pbmcgY2hhcmFjdGVycyAoZ2VuZXJhbAorICogICAgICBjYXRlZ29yeSBjb2RlIE1uIG9yIE1lIGluIHRoZSBVbmljb2RlIGRhdGFiYXNlKSBoYXZlIGEKKyAqICAgICAgY29sdW1uIHdpZHRoIG9mIDAuCisgKgorICogICAgLSBTT0ZUIEhZUEhFTiAoVSswMEFEKSBoYXMgYSBjb2x1bW4gd2lkdGggb2YgMS4KKyAqCisgKiAgICAtIE90aGVyIGZvcm1hdCBjaGFyYWN0ZXJzIChnZW5lcmFsIGNhdGVnb3J5IGNvZGUgQ2YgaW4gdGhlIFVuaWNvZGUKKyAqICAgICAgZGF0YWJhc2UpIGFuZCBaRVJPIFdJRFRIIFNQQUNFIChVKzIwMEIpIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMC4KKyAqCisgKiAgICAtIEhhbmd1bCBKYW1vIG1lZGlhbCB2b3dlbHMgYW5kIGZpbmFsIGNvbnNvbmFudHMgKFUrMTE2MC1VKzExRkYpCisgKiAgICAgIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMC4KKyAqCisgKiAgICAtIFNwYWNpbmcgY2hhcmFjdGVycyBpbiB0aGUgRWFzdCBBc2lhbiBXaWRlIChXKSBvciBFYXN0IEFzaWFuCisgKiAgICAgIEZ1bGwtd2lkdGggKEYpIGNhdGVnb3J5IGFzIGRlZmluZWQgaW4gVW5pY29kZSBUZWNobmljYWwKKyAqICAgICAgUmVwb3J0ICMxMSBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDIuCisgKgorICogICAgLSBBbGwgcmVtYWluaW5nIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBhbGwgcHJpbnRhYmxlCisgKiAgICAgIElTTyA4ODU5LTEgYW5kIFdHTDQgY2hhcmFjdGVycywgVW5pY29kZSBjb250cm9sIGNoYXJhY3RlcnMsCisgKiAgICAgIGV0Yy4pIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCB3Y2hhcl90IGNoYXJhY3RlcnMgYXJlIGVuY29kZWQKKyAqIGluIElTTyAxMDY0Ni4KKyAqLworaW50IEZBU1RfRlVOQyB3Y3dpZHRoKHVuc2lnbmVkIHVjcykKK3sKKyMgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4MzAwCisJLyogc29ydGVkIGxpc3Qgb2Ygbm9uLW92ZXJsYXBwaW5nIGludGVydmFscyBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzICovCisJLyogZ2VuZXJhdGVkIGJ5ICJ1bmlzZXQgK2NhdD1NZSArY2F0PU1uICtjYXQ9Q2YgLTAwQUQgKzExNjAtMTFGRiArMjAwQiBjIiAqLworIyAgZGVmaW5lIEJJR18oYSxiKSB7IGEsIGIgfSwKKyMgIGRlZmluZSBQQUlSKGEsYikKKyMgIGRlZmluZSBBUlJBWSAvKiBQQUlSIGlmIDwgMHg0MDAwIGFuZCBubyBtb3JlIHRoYW4gNCBjaGFycyBiaWcgKi8gXAorCQlCSUdfKDB4MDMwMCwgMHgwMzZGKSBcCisJCVBBSVIoMHgwNDgzLCAweDA0ODYpIFwKKwkJUEFJUigweDA0ODgsIDB4MDQ4OSkgXAorCQlCSUdfKDB4MDU5MSwgMHgwNUJEKSBcCisJCVBBSVIoMHgwNUJGLCAweDA1QkYpIFwKKwkJUEFJUigweDA1QzEsIDB4MDVDMikgXAorCQlQQUlSKDB4MDVDNCwgMHgwNUM1KSBcCisJCVBBSVIoMHgwNUM3LCAweDA1QzcpIFwKKwkJUEFJUigweDA2MDAsIDB4MDYwMykgXAorCQlCSUdfKDB4MDYxMCwgMHgwNjE1KSBcCisJCUJJR18oMHgwNjRCLCAweDA2NUUpIFwKKwkJUEFJUigweDA2NzAsIDB4MDY3MCkgXAorCQlCSUdfKDB4MDZENiwgMHgwNkU0KSBcCisJCVBBSVIoMHgwNkU3LCAweDA2RTgpIFwKKwkJUEFJUigweDA2RUEsIDB4MDZFRCkgXAorCQlQQUlSKDB4MDcwRiwgMHgwNzBGKSBcCisJCVBBSVIoMHgwNzExLCAweDA3MTEpIFwKKwkJQklHXygweDA3MzAsIDB4MDc0QSkgXAorCQlCSUdfKDB4MDdBNiwgMHgwN0IwKSBcCisJCUJJR18oMHgwN0VCLCAweDA3RjMpIFwKKwkJUEFJUigweDA5MDEsIDB4MDkwMikgXAorCQlQQUlSKDB4MDkzQywgMHgwOTNDKSBcCisJCUJJR18oMHgwOTQxLCAweDA5NDgpIFwKKwkJUEFJUigweDA5NEQsIDB4MDk0RCkgXAorCQlQQUlSKDB4MDk1MSwgMHgwOTU0KSBcCisJCVBBSVIoMHgwOTYyLCAweDA5NjMpIFwKKwkJUEFJUigweDA5ODEsIDB4MDk4MSkgXAorCQlQQUlSKDB4MDlCQywgMHgwOUJDKSBcCisJCVBBSVIoMHgwOUMxLCAweDA5QzQpIFwKKwkJUEFJUigweDA5Q0QsIDB4MDlDRCkgXAorCQlQQUlSKDB4MDlFMiwgMHgwOUUzKSBcCisJCVBBSVIoMHgwQTAxLCAweDBBMDIpIFwKKwkJUEFJUigweDBBM0MsIDB4MEEzQykgXAorCQlQQUlSKDB4MEE0MSwgMHgwQTQyKSBcCisJCVBBSVIoMHgwQTQ3LCAweDBBNDgpIFwKKwkJUEFJUigweDBBNEIsIDB4MEE0RCkgXAorCQlQQUlSKDB4MEE3MCwgMHgwQTcxKSBcCisJCVBBSVIoMHgwQTgxLCAweDBBODIpIFwKKwkJUEFJUigweDBBQkMsIDB4MEFCQykgXAorCQlCSUdfKDB4MEFDMSwgMHgwQUM1KSBcCisJCVBBSVIoMHgwQUM3LCAweDBBQzgpIFwKKwkJUEFJUigweDBBQ0QsIDB4MEFDRCkgXAorCQlQQUlSKDB4MEFFMiwgMHgwQUUzKSBcCisJCVBBSVIoMHgwQjAxLCAweDBCMDEpIFwKKwkJUEFJUigweDBCM0MsIDB4MEIzQykgXAorCQlQQUlSKDB4MEIzRiwgMHgwQjNGKSBcCisJCVBBSVIoMHgwQjQxLCAweDBCNDMpIFwKKwkJUEFJUigweDBCNEQsIDB4MEI0RCkgXAorCQlQQUlSKDB4MEI1NiwgMHgwQjU2KSBcCisJCVBBSVIoMHgwQjgyLCAweDBCODIpIFwKKwkJUEFJUigweDBCQzAsIDB4MEJDMCkgXAorCQlQQUlSKDB4MEJDRCwgMHgwQkNEKSBcCisJCVBBSVIoMHgwQzNFLCAweDBDNDApIFwKKwkJUEFJUigweDBDNDYsIDB4MEM0OCkgXAorCQlQQUlSKDB4MEM0QSwgMHgwQzREKSBcCisJCVBBSVIoMHgwQzU1LCAweDBDNTYpIFwKKwkJUEFJUigweDBDQkMsIDB4MENCQykgXAorCQlQQUlSKDB4MENCRiwgMHgwQ0JGKSBcCisJCVBBSVIoMHgwQ0M2LCAweDBDQzYpIFwKKwkJUEFJUigweDBDQ0MsIDB4MENDRCkgXAorCQlQQUlSKDB4MENFMiwgMHgwQ0UzKSBcCisJCVBBSVIoMHgwRDQxLCAweDBENDMpIFwKKwkJUEFJUigweDBENEQsIDB4MEQ0RCkgXAorCQlQQUlSKDB4MERDQSwgMHgwRENBKSBcCisJCVBBSVIoMHgwREQyLCAweDBERDQpIFwKKwkJUEFJUigweDBERDYsIDB4MERENikgXAorCQlQQUlSKDB4MEUzMSwgMHgwRTMxKSBcCisJCUJJR18oMHgwRTM0LCAweDBFM0EpIFwKKwkJQklHXygweDBFNDcsIDB4MEU0RSkgXAorCQlQQUlSKDB4MEVCMSwgMHgwRUIxKSBcCisJCUJJR18oMHgwRUI0LCAweDBFQjkpIFwKKwkJUEFJUigweDBFQkIsIDB4MEVCQykgXAorCQlCSUdfKDB4MEVDOCwgMHgwRUNEKSBcCisJCVBBSVIoMHgwRjE4LCAweDBGMTkpIFwKKwkJUEFJUigweDBGMzUsIDB4MEYzNSkgXAorCQlQQUlSKDB4MEYzNywgMHgwRjM3KSBcCisJCVBBSVIoMHgwRjM5LCAweDBGMzkpIFwKKwkJQklHXygweDBGNzEsIDB4MEY3RSkgXAorCQlCSUdfKDB4MEY4MCwgMHgwRjg0KSBcCisJCVBBSVIoMHgwRjg2LCAweDBGODcpIFwKKwkJUEFJUigweDBGQzYsIDB4MEZDNikgXAorCQlCSUdfKDB4MEY5MCwgMHgwRjk3KSBcCisJCUJJR18oMHgwRjk5LCAweDBGQkMpIFwKKwkJUEFJUigweDEwMkQsIDB4MTAzMCkgXAorCQlQQUlSKDB4MTAzMiwgMHgxMDMyKSBcCisJCVBBSVIoMHgxMDM2LCAweDEwMzcpIFwKKwkJUEFJUigweDEwMzksIDB4MTAzOSkgXAorCQlQQUlSKDB4MTA1OCwgMHgxMDU5KSBcCisJCUJJR18oMHgxMTYwLCAweDExRkYpIFwKKwkJUEFJUigweDEzNUYsIDB4MTM1RikgXAorCQlQQUlSKDB4MTcxMiwgMHgxNzE0KSBcCisJCVBBSVIoMHgxNzMyLCAweDE3MzQpIFwKKwkJUEFJUigweDE3NTIsIDB4MTc1MykgXAorCQlQQUlSKDB4MTc3MiwgMHgxNzczKSBcCisJCVBBSVIoMHgxN0I0LCAweDE3QjUpIFwKKwkJQklHXygweDE3QjcsIDB4MTdCRCkgXAorCQlQQUlSKDB4MTdDNiwgMHgxN0M2KSBcCisJCUJJR18oMHgxN0M5LCAweDE3RDMpIFwKKwkJUEFJUigweDE3REQsIDB4MTdERCkgXAorCQlQQUlSKDB4MTgwQiwgMHgxODBEKSBcCisJCVBBSVIoMHgxOEE5LCAweDE4QTkpIFwKKwkJUEFJUigweDE5MjAsIDB4MTkyMikgXAorCQlQQUlSKDB4MTkyNywgMHgxOTI4KSBcCisJCVBBSVIoMHgxOTMyLCAweDE5MzIpIFwKKwkJUEFJUigweDE5MzksIDB4MTkzQikgXAorCQlQQUlSKDB4MUExNywgMHgxQTE4KSBcCisJCVBBSVIoMHgxQjAwLCAweDFCMDMpIFwKKwkJUEFJUigweDFCMzQsIDB4MUIzNCkgXAorCQlCSUdfKDB4MUIzNiwgMHgxQjNBKSBcCisJCVBBSVIoMHgxQjNDLCAweDFCM0MpIFwKKwkJUEFJUigweDFCNDIsIDB4MUI0MikgXAorCQlCSUdfKDB4MUI2QiwgMHgxQjczKSBcCisJCUJJR18oMHgxREMwLCAweDFEQ0EpIFwKKwkJUEFJUigweDFERkUsIDB4MURGRikgXAorCQlCSUdfKDB4MjAwQiwgMHgyMDBGKSBcCisJCUJJR18oMHgyMDJBLCAweDIwMkUpIFwKKwkJUEFJUigweDIwNjAsIDB4MjA2MykgXAorCQlCSUdfKDB4MjA2QSwgMHgyMDZGKSBcCisJCUJJR18oMHgyMEQwLCAweDIwRUYpIFwKKwkJQklHXygweDMwMkEsIDB4MzAyRikgXAorCQlQQUlSKDB4MzA5OSwgMHgzMDlBKSBcCisJCS8qIFRvbyBiaWcgdG8gYmUgcGFja2VkIGluIFBBSVJzOiAqLyBcCisJCUJJR18oMHhBODA2LCAweEE4MDYpIFwKKwkJQklHXygweEE4MEIsIDB4QTgwQikgXAorCQlCSUdfKDB4QTgyNSwgMHhBODI2KSBcCisJCUJJR18oMHhGQjFFLCAweEZCMUUpIFwKKwkJQklHXygweEZFMDAsIDB4RkUwRikgXAorCQlCSUdfKDB4RkUyMCwgMHhGRTIzKSBcCisJCUJJR18oMHhGRUZGLCAweEZFRkYpIFwKKwkJQklHXygweEZGRjksIDB4RkZGQikKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludGVydmFsIGNvbWJpbmluZ1tdID0geyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgZGVmaW5lIEJJR18oYSxiKQorIyAgZGVmaW5lIFBBSVIoYSxiKSAoYSA8PCAyKSB8IChiLWEpLAorCXN0YXRpYyBjb25zdCB1aW50MTZfdCBjb21iaW5pbmcxW10gPSB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICBkZWZpbmUgQklHXyhhLGIpIGNoYXIgYmlnXyMjYVtiIDwgMHg0MDAwICYmIGItYSA8PSAzID8gLTEgOiAxXTsKKyMgIGRlZmluZSBQQUlSKGEsYikgY2hhciBwYWlyIyNhW2IgPj0gMHg0MDAwIHx8IGItYSA+IDMgPyAtMSA6IDFdOworCXN0cnVjdCBDSEVDSyB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICB1bmRlZiBBUlJBWQorIyBlbmRpZgorCisJaWYgKHVjcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIFRlc3QgZm9yIDgtYml0IGNvbnRyb2wgY2hhcmFjdGVycyAoMDAtMWYsIDgwLTlmLCA3ZikgKi8KKwlpZiAoKHVjcyAmIH4weDgwKSA8IDB4MjAgfHwgdWNzID09IDB4N2YpCisJCXJldHVybiAtMTsKKwkvKiBRdWljayBhYm9ydCBpZiBpdCBpcyBhbiBvYnZpb3VzbHkgaW52YWxpZCBjaGFyICovCisJaWYgKHVjcyA+IENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUikKKwkJcmV0dXJuIC0xOworCisJLyogT3B0aW1pemF0aW9uOiBubyBjb21iaW5pbmcgY2hhcnMgYmVsb3cgMHgzMDAgKi8KKwlpZiAoQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIDwgMHgzMDAgfHwgdWNzIDwgMHgzMDApCisJCXJldHVybiAxOworCisjIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweDMwMAorCS8qIEJpbmFyeSBzZWFyY2ggaW4gdGFibGUgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycyAqLworCWlmIChpbl9pbnRlcnZhbF90YWJsZSh1Y3MsIGNvbWJpbmluZywgQVJSQVlfU0laRShjb21iaW5pbmcpIC0gMSkpCisJCXJldHVybiAwOworCWlmIChpbl91aW50MTZfdGFibGUodWNzLCBjb21iaW5pbmcxLCBBUlJBWV9TSVpFKGNvbWJpbmluZzEpIC0gMSkpCisJCXJldHVybiAwOworCisJLyogT3B0aW1pemF0aW9uOiBhbGwgY2hhcnMgYmVsb3cgMHgxMTAwIGFyZSBub3QgZG91YmxlLXdpZHRoICovCisJaWYgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA8IDB4MTEwMCB8fCB1Y3MgPCAweDExMDApCisJCXJldHVybiAxOworCisjICBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHgxMTAwCisJLyogSW52YWxpZCBjb2RlIHBvaW50czogKi8KKwkvKiBIaWdoIChkODAwLi5kYmZmKSBhbmQgbG93IChkYzAwLi5kZmZmKSBzdXJyb2dhdGVzICh2YWxpZCBvbmx5IGluIFVURjE2KSAqLworCS8qIFByaXZhdGUgVXNlIEFyZWEgKGUwMDAuLmY4ZmYpICovCisJLyogTm9uY2hhcmFjdGVycyBmZGQwLi5mZGVmICovCisJaWYgKChDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHhkODAwICYmIHVjcyA+PSAweGQ4MDAgJiYgdWNzIDw9IDB4ZjhmZikKKwkgfHwgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweGZkZDAgJiYgdWNzID49IDB4ZmRkMCAmJiB1Y3MgPD0gMHhmZGVmKQorCSkgeworCQlyZXR1cm4gLTE7CisJfQorCS8qIDB4ZmZmZSBhbmQgMHhmZmZmIGluIGV2ZXJ5IHBsYW5lIGFyZSBpbnZhbGlkICovCisJaWYgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweGZmZmUgJiYgKCh1Y3MgJiAweGZmZmUpID09IDB4ZmZmZSkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworIyAgIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweDEwMDAwCisJaWYgKHVjcyA+PSAweDEwMDAwKSB7CisJCS8qIENvbWJpbmluZyBjaGFycyBpbiBTdXBwbGVtZW50YXJ5IE11bHRpbGluZ3VhbCBQbGFuZSAweDF4eHh4ICovCisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZXJ2YWwgY29tYmluaW5nMHgxMDAwMFtdID0geworCQkJeyAweDBBMDEsIDB4MEEwMyB9LCB7IDB4MEEwNSwgMHgwQTA2IH0sIHsgMHgwQTBDLCAweDBBMEYgfSwKKwkJCXsgMHgwQTM4LCAweDBBM0EgfSwgeyAweDBBM0YsIDB4MEEzRiB9LCB7IDB4RDE2NywgMHhEMTY5IH0sCisJCQl7IDB4RDE3MywgMHhEMTgyIH0sIHsgMHhEMTg1LCAweEQxOEIgfSwgeyAweEQxQUEsIDB4RDFBRCB9LAorCQkJeyAweEQyNDIsIDB4RDI0NCB9CisJCX07CisJCS8qIEJpbmFyeSBzZWFyY2ggaW4gdGFibGUgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycyBpbiBTdXBwbGVtZW50YXJ5IE11bHRpbGluZ3VhbCBQbGFuZSAqLworCQlpZiAoaW5faW50ZXJ2YWxfdGFibGUodWNzIF4gMHgxMDAwMCwgY29tYmluaW5nMHgxMDAwMCwgQVJSQVlfU0laRShjb21iaW5pbmcweDEwMDAwKSAtIDEpKQorCQkJcmV0dXJuIDA7CisJCS8qIENoZWNrIGEgZmV3IG5vbi1zcGFjaW5nIGNoYXJzIGluIFN1cHBsZW1lbnRhcnkgU3BlY2lhbC1wdXJwb3NlIFBsYW5lIDB4RXh4eHggKi8KKwkJaWYgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweEUwMDAxCisJCSAmJiAoICB1Y3MgPT0gMHhFMDAwMQorCQkgICAgfHwgKHVjcyA+PSAweEUwMDIwICYmIHVjcyA8PSAweEUwMDdGKQorCQkgICAgfHwgKHVjcyA+PSAweEUwMTAwICYmIHVjcyA8PSAweEUwMUVGKQorCQkgICAgKQorCQkpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorIyAgIGVuZGlmCisKKwkvKiBJZiB3ZSBhcnJpdmUgaGVyZSwgdWNzIGlzIG5vdCBhIGNvbWJpbmluZyBvciBDMC9DMSBjb250cm9sIGNoYXJhY3Rlci4KKwkgKiBDaGVjayB3aGV0aGVyIGl0J3MgMSBjaGFyIG9yIDItc2hhciB3aWRlLgorCSAqLworCXJldHVybiAxICsKKwkJKCAgKC8qdWNzID49IDB4MTEwMCAmJiovIHVjcyA8PSAweDExNWYpIC8qIEhhbmd1bCBKYW1vIGluaXQuIGNvbnNvbmFudHMgKi8KKwkJfHwgdWNzID09IDB4MjMyOSAvKiBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQ7IGFsc28gQ0pLIHB1bmN0LiBjaGFyICovCisJCXx8IHVjcyA9PSAweDIzMmEgLyogcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldDsgYWxzbyBDSksgcHVuY3QuIGNoYXIgKi8KKwkJfHwgKHVjcyA+PSAweDJlODAgJiYgdWNzIDw9IDB4YTRjZiAmJiB1Y3MgIT0gMHgzMDNmKSAvKiBDSksgLi4uIFlpICovCisjICAgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4YWMwMAorCQl8fCAodWNzID49IDB4YWMwMCAmJiB1Y3MgPD0gMHhkN2EzKSAvKiBIYW5ndWwgU3lsbGFibGVzICovCisJCXx8ICh1Y3MgPj0gMHhmOTAwICYmIHVjcyA8PSAweGZhZmYpIC8qIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgKi8KKwkJfHwgKHVjcyA+PSAweGZlMTAgJiYgdWNzIDw9IDB4ZmUxOSkgLyogVmVydGljYWwgZm9ybXMgKi8KKwkJfHwgKHVjcyA+PSAweGZlMzAgJiYgdWNzIDw9IDB4ZmU2ZikgLyogQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgKi8KKwkJfHwgKHVjcyA+PSAweGZmMDAgJiYgdWNzIDw9IDB4ZmY2MCkgLyogRnVsbHdpZHRoIEZvcm1zICovCisJCXx8ICh1Y3MgPj0gMHhmZmUwICYmIHVjcyA8PSAweGZmZTYpCisJCXx8ICgodWNzID4+IDE3KSA9PSAoMiA+PiAxKSkgLyogMjAwMDAuLjNmZmZmOiBTdXBwbGVtZW50YXJ5IGFuZCBUZXJ0aWFyeSBJZGVvZ3JhcGhpYyBQbGFuZXMgKi8KKyMgICBlbmRpZgorCQkpOworIyAgZW5kaWYgLyogPj0gMHgxMTAwICovCisjIGVuZGlmIC8qID49IDB4MzAwICovCit9CisKKworIyBpZiBFTkFCTEVfVU5JQ09ERV9CSURJX1NVUFBPUlQKK2ludCBGQVNUX0ZVTkMgdW5pY29kZV9iaWRpX2lzcnRsKHdpbnRfdCB3YykKK3sKKwkvKiByYW5nZXMgdGFrZW4gZnJvbQorCSAqIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzUuMi4wL3VjZC9leHRyYWN0ZWQvRGVyaXZlZEJpZGlDbGFzcy50eHQKKwkgKiBCaWRpX0NsYXNzPUxlZnRfVG9fUmlnaHQgfCBCaWRpX0NsYXNzPUFyYWJpY19MZXR0ZXIKKwkgKi8KKyMgIGRlZmluZSBCSUdfKGEsYikgeyBhLCBiIH0sCisjICBkZWZpbmUgUEFJUihhLGIpCisjICBkZWZpbmUgQVJSQVkgXAorCQlQQUlSKDB4MDU5MCwgMHgwNTkwKSBcCisJCVBBSVIoMHgwNUJFLCAweDA1QkUpIFwKKwkJUEFJUigweDA1QzAsIDB4MDVDMCkgXAorCQlQQUlSKDB4MDVDMywgMHgwNUMzKSBcCisJCVBBSVIoMHgwNUM2LCAweDA1QzYpIFwKKwkJQklHXygweDA1QzgsIDB4MDVGRikgXAorCQlQQUlSKDB4MDYwNCwgMHgwNjA1KSBcCisJCVBBSVIoMHgwNjA4LCAweDA2MDgpIFwKKwkJUEFJUigweDA2MEIsIDB4MDYwQikgXAorCQlQQUlSKDB4MDYwRCwgMHgwNjBEKSBcCisJCUJJR18oMHgwNjFCLCAweDA2NEEpIFwKKwkJUEFJUigweDA2NUYsIDB4MDY1RikgXAorCQlQQUlSKDB4MDY2RCwgMHgwNjZGKSBcCisJCUJJR18oMHgwNjcxLCAweDA2RDUpIFwKKwkJUEFJUigweDA2RTUsIDB4MDZFNikgXAorCQlQQUlSKDB4MDZFRSwgMHgwNkVGKSBcCisJCUJJR18oMHgwNkZBLCAweDA3MEUpIFwKKwkJUEFJUigweDA3MTAsIDB4MDcxMCkgXAorCQlCSUdfKDB4MDcxMiwgMHgwNzJGKSBcCisJCUJJR18oMHgwNzRCLCAweDA3QTUpIFwKKwkJQklHXygweDA3QjEsIDB4MDdFQSkgXAorCQlQQUlSKDB4MDdGNCwgMHgwN0Y1KSBcCisJCUJJR18oMHgwN0ZBLCAweDA4MTUpIFwKKwkJUEFJUigweDA4MUEsIDB4MDgxQSkgXAorCQlQQUlSKDB4MDgyNCwgMHgwODI0KSBcCisJCVBBSVIoMHgwODI4LCAweDA4MjgpIFwKKwkJQklHXygweDA4MkUsIDB4MDhGRikgXAorCQlQQUlSKDB4MjAwRiwgMHgyMDBGKSBcCisJCVBBSVIoMHgyMDJCLCAweDIwMkIpIFwKKwkJUEFJUigweDIwMkUsIDB4MjAyRSkgXAorCQlCSUdfKDB4RkIxRCwgMHhGQjFEKSBcCisJCUJJR18oMHhGQjFGLCAweEZCMjgpIFwKKwkJQklHXygweEZCMkEsIDB4RkQzRCkgXAorCQlCSUdfKDB4RkQ0MCwgMHhGRENGKSBcCisJCUJJR18oMHhGREM4LCAweEZEQ0YpIFwKKwkJQklHXygweEZERjAsIDB4RkRGQykgXAorCQlCSUdfKDB4RkRGRSwgMHhGREZGKSBcCisJCUJJR18oMHhGRTcwLCAweEZFRkUpCisJCS8qIFByb2JhYmx5IG5vdCBuZWNlc3NhcnkKKwkJezB4MTA4MDAsIDB4MTA5MUV9LAorCQl7MHgxMDkyMCwgMHgxMEEwMH0sCisJCXsweDEwQTA0LCAweDEwQTA0fSwKKwkJezB4MTBBMDcsIDB4MTBBMEJ9LAorCQl7MHgxMEExMCwgMHgxMEEzN30sCisJCXsweDEwQTNCLCAweDEwQTNFfSwKKwkJezB4MTBBNDAsIDB4MTBBN0Z9LAorCQl7MHgxMEIzNiwgMHgxMEIzOH0sCisJCXsweDEwQjQwLCAweDEwRTVGfSwKKwkJezB4MTBFN0YsIDB4MTBGRkZ9LAorCQl7MHgxRTgwMCwgMHgxRUZGRn0KKwkJKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludGVydmFsIHJ0bF9iW10gPSB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICBkZWZpbmUgQklHXyhhLGIpCisjICBkZWZpbmUgUEFJUihhLGIpIChhIDw8IDIpIHwgKGItYSksCisJc3RhdGljIGNvbnN0IHVpbnQxNl90IHJ0bF9wW10gPSB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICBkZWZpbmUgQklHXyhhLGIpIGNoYXIgYmlnXyMjYVtiIDwgMHg0MDAwICYmIGItYSA8PSAzID8gLTEgOiAxXTsKKyMgIGRlZmluZSBQQUlSKGEsYikgY2hhciBwYWlyIyNhW2IgPj0gMHg0MDAwIHx8IGItYSA+IDMgPyAtMSA6IDFdOworCXN0cnVjdCBDSEVDSyB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICB1bmRlZiBBUlJBWQorCisJaWYgKGluX2ludGVydmFsX3RhYmxlKHdjLCBydGxfYiwgQVJSQVlfU0laRShydGxfYikgLSAxKSkKKwkJcmV0dXJuIDE7CisJaWYgKGluX3VpbnQxNl90YWJsZSh3YywgcnRsX3AsIEFSUkFZX1NJWkUocnRsX3ApIC0gMSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisjICBpZiBFTkFCTEVfVU5JQ09ERV9ORVVUUkFMX1RBQkxFCitpbnQgRkFTVF9GVU5DIHVuaWNvZGVfYmlkaV9pc19uZXV0cmFsX3djaGFyKHdpbnRfdCB3YykKK3sKKwkvKiByYW5nZXMgdGFrZW4gZnJvbQorCSAqIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzUuMi4wL3VjZC9leHRyYWN0ZWQvRGVyaXZlZEJpZGlDbGFzcy50eHQKKwkgKiBCaWRpX0NsYXNzZXM6IFBhcmFncmFwaF9TZXBhcmF0b3IsIFNlZ21lbnRfU2VwYXJhdG9yLAorCSAqIFdoaXRlX1NwYWNlLCBPdGhlcl9OZXV0cmFsLCBFdXJvcGVhbl9OdW1iZXIsIEV1cm9wZWFuX1NlcGFyYXRvciwKKwkgKiBFdXJvcGVhbl9UZXJtaW5hdG9yLCBBcmFiaWNfTnVtYmVyLCBDb21tb25fU2VwYXJhdG9yCisJICovCisjICBkZWZpbmUgQklHXyhhLGIpIHsgYSwgYiB9LAorIyAgZGVmaW5lIFBBSVIoYSxiKQorIyAgZGVmaW5lIEFSUkFZIFwKKwkJQklHXygweDAwMDksIDB4MDAwRCkgXAorCQlCSUdfKDB4MDAxQywgMHgwMDQwKSBcCisJCUJJR18oMHgwMDVCLCAweDAwNjApIFwKKwkJUEFJUigweDAwN0IsIDB4MDA3RSkgXAorCQlQQUlSKDB4MDA4NSwgMHgwMDg1KSBcCisJCUJJR18oMHgwMEEwLCAweDAwQTkpIFwKKwkJUEFJUigweDAwQUIsIDB4MDBBQykgXAorCQlCSUdfKDB4MDBBRSwgMHgwMEI0KSBcCisJCVBBSVIoMHgwMEI2LCAweDAwQjkpIFwKKwkJQklHXygweDAwQkIsIDB4MDBCRikgXAorCQlQQUlSKDB4MDBENywgMHgwMEQ3KSBcCisJCVBBSVIoMHgwMEY3LCAweDAwRjcpIFwKKwkJUEFJUigweDAyQjksIDB4MDJCQSkgXAorCQlCSUdfKDB4MDJDMiwgMHgwMkNGKSBcCisJCUJJR18oMHgwMkQyLCAweDAyREYpIFwKKwkJQklHXygweDAyRTUsIDB4MDJGRikgXAorCQlQQUlSKDB4MDM3NCwgMHgwMzc1KSBcCisJCVBBSVIoMHgwMzdFLCAweDAzN0UpIFwKKwkJUEFJUigweDAzODQsIDB4MDM4NSkgXAorCQlQQUlSKDB4MDM4NywgMHgwMzg3KSBcCisJCVBBSVIoMHgwM0Y2LCAweDAzRjYpIFwKKwkJUEFJUigweDA1OEEsIDB4MDU4QSkgXAorCQlQQUlSKDB4MDYwMCwgMHgwNjAzKSBcCisJCVBBSVIoMHgwNjA2LCAweDA2MDcpIFwKKwkJUEFJUigweDA2MDksIDB4MDYwQSkgXAorCQlQQUlSKDB4MDYwQywgMHgwNjBDKSBcCisJCVBBSVIoMHgwNjBFLCAweDA2MEYpIFwKKwkJQklHXygweDA2NjAsIDB4MDY2QykgXAorCQlQQUlSKDB4MDZERCwgMHgwNkREKSBcCisJCVBBSVIoMHgwNkU5LCAweDA2RTkpIFwKKwkJQklHXygweDA2RjAsIDB4MDZGOSkgXAorCQlQQUlSKDB4MDdGNiwgMHgwN0Y5KSBcCisJCVBBSVIoMHgwOUYyLCAweDA5RjMpIFwKKwkJUEFJUigweDA5RkIsIDB4MDlGQikgXAorCQlQQUlSKDB4MEFGMSwgMHgwQUYxKSBcCisJCUJJR18oMHgwQkYzLCAweDBCRkEpIFwKKwkJQklHXygweDBDNzgsIDB4MEM3RSkgXAorCQlQQUlSKDB4MENGMSwgMHgwQ0YyKSBcCisJCVBBSVIoMHgwRTNGLCAweDBFM0YpIFwKKwkJUEFJUigweDBGM0EsIDB4MEYzRCkgXAorCQlCSUdfKDB4MTM5MCwgMHgxNDAwKSBcCisJCVBBSVIoMHgxNjgwLCAweDE2ODApIFwKKwkJUEFJUigweDE2OUIsIDB4MTY5QykgXAorCQlQQUlSKDB4MTdEQiwgMHgxN0RCKSBcCisJCUJJR18oMHgxN0YwLCAweDE3RjkpIFwKKwkJQklHXygweDE4MDAsIDB4MTgwQSkgXAorCQlQQUlSKDB4MTgwRSwgMHgxODBFKSBcCisJCVBBSVIoMHgxOTQwLCAweDE5NDApIFwKKwkJUEFJUigweDE5NDQsIDB4MTk0NSkgXAorCQlCSUdfKDB4MTlERSwgMHgxOUZGKSBcCisJCVBBSVIoMHgxRkJELCAweDFGQkQpIFwKKwkJUEFJUigweDFGQkYsIDB4MUZDMSkgXAorCQlQQUlSKDB4MUZDRCwgMHgxRkNGKSBcCisJCVBBSVIoMHgxRkRELCAweDFGREYpIFwKKwkJUEFJUigweDFGRUQsIDB4MUZFRikgXAorCQlQQUlSKDB4MUZGRCwgMHgxRkZFKSBcCisJCUJJR18oMHgyMDAwLCAweDIwMEEpIFwKKwkJQklHXygweDIwMTAsIDB4MjAyOSkgXAorCQlCSUdfKDB4MjAyRiwgMHgyMDVGKSBcCisJCVBBSVIoMHgyMDcwLCAweDIwNzApIFwKKwkJQklHXygweDIwNzQsIDB4MjA3RSkgXAorCQlCSUdfKDB4MjA4MCwgMHgyMDhFKSBcCisJCUJJR18oMHgyMEEwLCAweDIwQjgpIFwKKwkJUEFJUigweDIxMDAsIDB4MjEwMSkgXAorCQlQQUlSKDB4MjEwMywgMHgyMTA2KSBcCisJCVBBSVIoMHgyMTA4LCAweDIxMDkpIFwKKwkJUEFJUigweDIxMTQsIDB4MjExNCkgXAorCQlQQUlSKDB4MjExNiwgMHgyMTE4KSBcCisJCUJJR18oMHgyMTFFLCAweDIxMjMpIFwKKwkJUEFJUigweDIxMjUsIDB4MjEyNSkgXAorCQlQQUlSKDB4MjEyNywgMHgyMTI3KSBcCisJCVBBSVIoMHgyMTI5LCAweDIxMjkpIFwKKwkJUEFJUigweDIxMkUsIDB4MjEyRSkgXAorCQlQQUlSKDB4MjEzQSwgMHgyMTNCKSBcCisJCUJJR18oMHgyMTQwLCAweDIxNDQpIFwKKwkJUEFJUigweDIxNEEsIDB4MjE0RCkgXAorCQlCSUdfKDB4MjE1MCwgMHgyMTVGKSBcCisJCVBBSVIoMHgyMTg5LCAweDIxODkpIFwKKwkJQklHXygweDIxOTAsIDB4MjMzNSkgXAorCQlCSUdfKDB4MjM3QiwgMHgyMzk0KSBcCisJCUJJR18oMHgyMzk2LCAweDIzRTgpIFwKKwkJQklHXygweDI0MDAsIDB4MjQyNikgXAorCQlCSUdfKDB4MjQ0MCwgMHgyNDRBKSBcCisJCUJJR18oMHgyNDYwLCAweDI0OUIpIFwKKwkJQklHXygweDI0RUEsIDB4MjZBQikgXAorCQlCSUdfKDB4MjZBRCwgMHgyNkNEKSBcCisJCUJJR18oMHgyNkNGLCAweDI2RTEpIFwKKwkJUEFJUigweDI2RTMsIDB4MjZFMykgXAorCQlCSUdfKDB4MjZFOCwgMHgyNkZGKSBcCisJCVBBSVIoMHgyNzAxLCAweDI3MDQpIFwKKwkJUEFJUigweDI3MDYsIDB4MjcwOSkgXAorCQlCSUdfKDB4MjcwQywgMHgyNzI3KSBcCisJCUJJR18oMHgyNzI5LCAweDI3NEIpIFwKKwkJUEFJUigweDI3NEQsIDB4Mjc0RCkgXAorCQlQQUlSKDB4Mjc0RiwgMHgyNzUyKSBcCisJCUJJR18oMHgyNzU2LCAweDI3NUUpIFwKKwkJQklHXygweDI3NjEsIDB4Mjc5NCkgXAorCQlCSUdfKDB4Mjc5OCwgMHgyN0FGKSBcCisJCUJJR18oMHgyN0IxLCAweDI3QkUpIFwKKwkJQklHXygweDI3QzAsIDB4MjdDQSkgXAorCQlQQUlSKDB4MjdDQywgMHgyN0NDKSBcCisJCUJJR18oMHgyN0QwLCAweDI3RkYpIFwKKwkJQklHXygweDI5MDAsIDB4MkI0QykgXAorCQlCSUdfKDB4MkI1MCwgMHgyQjU5KSBcCisJCUJJR18oMHgyQ0U1LCAweDJDRUEpIFwKKwkJQklHXygweDJDRjksIDB4MkNGRikgXAorCQlCSUdfKDB4MkUwMCwgMHgyRTk5KSBcCisJCUJJR18oMHgyRTlCLCAweDJFRjMpIFwKKwkJQklHXygweDJGMDAsIDB4MkZENSkgXAorCQlCSUdfKDB4MkZGMCwgMHgyRkZCKSBcCisJCUJJR18oMHgzMDAwLCAweDMwMDQpIFwKKwkJQklHXygweDMwMDgsIDB4MzAyMCkgXAorCQlQQUlSKDB4MzAzMCwgMHgzMDMwKSBcCisJCVBBSVIoMHgzMDM2LCAweDMwMzcpIFwKKwkJUEFJUigweDMwM0QsIDB4MzAzRCkgXAorCQlQQUlSKDB4MzAzRSwgMHgzMDNGKSBcCisJCVBBSVIoMHgzMDlCLCAweDMwOUMpIFwKKwkJUEFJUigweDMwQTAsIDB4MzBBMCkgXAorCQlQQUlSKDB4MzBGQiwgMHgzMEZCKSBcCisJCUJJR18oMHgzMUMwLCAweDMxRTMpIFwKKwkJUEFJUigweDMyMUQsIDB4MzIxRSkgXAorCQlCSUdfKDB4MzI1MCwgMHgzMjVGKSBcCisJCVBBSVIoMHgzMjdDLCAweDMyN0UpIFwKKwkJQklHXygweDMyQjEsIDB4MzJCRikgXAorCQlQQUlSKDB4MzJDQywgMHgzMkNGKSBcCisJCVBBSVIoMHgzMzc3LCAweDMzN0EpIFwKKwkJUEFJUigweDMzREUsIDB4MzNERikgXAorCQlQQUlSKDB4MzNGRiwgMHgzM0ZGKSBcCisJCUJJR18oMHg0REMwLCAweDRERkYpIFwKKwkJQklHXygweEE0OTAsIDB4QTRDNikgXAorCQlCSUdfKDB4QTYwRCwgMHhBNjBGKSBcCisJCUJJR18oMHhBNjczLCAweEE2NzMpIFwKKwkJQklHXygweEE2N0UsIDB4QTY3RikgXAorCQlCSUdfKDB4QTcwMCwgMHhBNzIxKSBcCisJCUJJR18oMHhBNzg4LCAweEE3ODgpIFwKKwkJQklHXygweEE4MjgsIDB4QTgyQikgXAorCQlCSUdfKDB4QTgzOCwgMHhBODM5KSBcCisJCUJJR18oMHhBODc0LCAweEE4NzcpIFwKKwkJQklHXygweEZCMjksIDB4RkIyOSkgXAorCQlCSUdfKDB4RkQzRSwgMHhGRDNGKSBcCisJCUJJR18oMHhGREZELCAweEZERkQpIFwKKwkJQklHXygweEZFMTAsIDB4RkUxOSkgXAorCQlCSUdfKDB4RkUzMCwgMHhGRTUyKSBcCisJCUJJR18oMHhGRTU0LCAweEZFNjYpIFwKKwkJQklHXygweEZFNjgsIDB4RkU2QikgXAorCQlCSUdfKDB4RkYwMSwgMHhGRjIwKSBcCisJCUJJR18oMHhGRjNCLCAweEZGNDApIFwKKwkJQklHXygweEZGNUIsIDB4RkY2NSkgXAorCQlCSUdfKDB4RkZFMCwgMHhGRkU2KSBcCisJCUJJR18oMHhGRkU4LCAweEZGRUUpIFwKKwkJQklHXygweEZGRjksIDB4RkZGRCkKKwkJLyoKKwkJezB4MTAxMDEsIDB4MTAxMDF9LAorCQl7MHgxMDE0MCwgMHgxMDE5Qn0sCisJCXsweDEwOTFGLCAweDEwOTFGfSwKKwkJezB4MTBCMzksIDB4MTBCM0Z9LAorCQl7MHgxMEU2MCwgMHgxMEU3RX0sCisJCXsweDFEMjAwLCAweDFEMjQxfSwKKwkJezB4MUQyNDUsIDB4MUQyNDV9LAorCQl7MHgxRDMwMCwgMHgxRDM1Nn0sCisJCXsweDFENkRCLCAweDFENkRCfSwKKwkJezB4MUQ3MTUsIDB4MUQ3MTV9LAorCQl7MHgxRDc0RiwgMHgxRDc0Rn0sCisJCXsweDFENzg5LCAweDFENzg5fSwKKwkJezB4MUQ3QzMsIDB4MUQ3QzN9LAorCQl7MHgxRDdDRSwgMHgxRDdGRn0sCisJCXsweDFGMDAwLCAweDFGMDJCfSwKKwkJezB4MUYwMzAsIDB4MUYwOTN9LAorCQl7MHgxRjEwMCwgMHgxRjEwQX0KKwkJKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludGVydmFsIG5ldXRyYWxfYltdID0geyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgZGVmaW5lIEJJR18oYSxiKQorIyAgZGVmaW5lIFBBSVIoYSxiKSAoYSA8PCAyKSB8IChiLWEpLAorCXN0YXRpYyBjb25zdCB1aW50MTZfdCBuZXV0cmFsX3BbXSA9IHsgQVJSQVkgfTsKKyMgIHVuZGVmIEJJR18KKyMgIHVuZGVmIFBBSVIKKyMgIGRlZmluZSBCSUdfKGEsYikgY2hhciBiaWdfIyNhW2IgPCAweDQwMDAgJiYgYi1hIDw9IDMgPyAtMSA6IDFdOworIyAgZGVmaW5lIFBBSVIoYSxiKSBjaGFyIHBhaXIjI2FbYiA+PSAweDQwMDAgfHwgYi1hID4gMyA/IC0xIDogMV07CisJc3RydWN0IENIRUNLIHsgQVJSQVkgfTsKKyMgIHVuZGVmIEJJR18KKyMgIHVuZGVmIFBBSVIKKyMgIHVuZGVmIEFSUkFZCisKKwlpZiAoaW5faW50ZXJ2YWxfdGFibGUod2MsIG5ldXRyYWxfYiwgQVJSQVlfU0laRShuZXV0cmFsX2IpIC0gMSkpCisJCXJldHVybiAxOworCWlmIChpbl91aW50MTZfdGFibGUod2MsIG5ldXRyYWxfcCwgQVJSQVlfU0laRShuZXV0cmFsX3ApIC0gMSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorIyAgZW5kaWYKKworIyBlbmRpZiAvKiBVTklDT0RFX0JJRElfU1VQUE9SVCAqLworCisjZW5kaWYgLyogSG9tZWdyb3duIFVuaWNvZGUgc3VwcG9ydCAqLworCisKKy8qIFRoZSByZXN0IGlzIG1vc3RseSBzYW1lIGZvciBsaWJjIGFuZCBmb3IgImhvbWVncm93biIgc3VwcG9ydCAqLworCisjaWYgMCAvLyBVTlVTRUQKK3NpemVfdCBGQVNUX0ZVTkMgdW5pY29kZV9zdHJsZW4oY29uc3QgY2hhciAqc3RyaW5nKQoreworCXNpemVfdCB3aWR0aCA9IG1ic3Rvd2NzKE5VTEwsIHN0cmluZywgSU5UX01BWCk7CisJaWYgKHdpZHRoID09IChzaXplX3QpLTFMKQorCQlyZXR1cm4gc3RybGVuKHN0cmluZyk7CisJcmV0dXJuIHdpZHRoOworfQorI2VuZGlmCisKK3NpemVfdCBGQVNUX0ZVTkMgdW5pY29kZV9zdHJ3aWR0aChjb25zdCBjaGFyICpzdHJpbmcpCit7CisJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKwlwcmludGFibGVfc3RyaW5nKCZ1bmlfc3RhdCwgc3RyaW5nKTsKKwlyZXR1cm4gdW5pX3N0YXQudW5pY29kZV93aWR0aDsKK30KKworc3RhdGljIGNoYXIqIEZBU1RfRlVOQyB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlMih1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCB3aWR0aCwgaW50IGZsYWdzKQoreworCWNoYXIgKmRzdDsKKwl1bnNpZ25lZCBkc3RfbGVuOworCXVuc2lnbmVkIHVuaV9jb3VudDsKKwl1bnNpZ25lZCB1bmlfd2lkdGg7CisKKwlpZiAodW5pY29kZV9zdGF0dXMgIT0gVU5JQ09ERV9PTikgeworCQljaGFyICpkOworCQlpZiAoZmxhZ3MgJiBVTklfRkxBR19QQUQpIHsKKwkJCWQgPSBkc3QgPSB4bWFsbG9jKHdpZHRoICsgMSk7CisJCQl3aGlsZSAoKGludCktLXdpZHRoID49IDApIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGMgPSAqc3JjOworCQkJCWlmIChjID09ICdcMCcpIHsKKwkJCQkJZG8KKwkJCQkJCSpkKysgPSAnICc7CisJCQkJCXdoaWxlICgoaW50KS0td2lkdGggPj0gMCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkqZCsrID0gKGMgPj0gJyAnICYmIGMgPCAweDdmKSA/IGMgOiAnPyc7CisJCQkJc3JjKys7CisJCQl9CisJCQkqZCA9ICdcMCc7CisJCX0gZWxzZSB7CisJCQlkID0gZHN0ID0geHN0cm5kdXAoc3JjLCB3aWR0aCk7CisJCQl3aGlsZSAoKmQpIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGMgPSAqZDsKKwkJCQlpZiAoYyA8ICcgJyB8fCBjID49IDB4N2YpCisJCQkJCSpkID0gJz8nOworCQkJCWQrKzsKKwkJCX0KKwkJfQorCQlpZiAoc3RhdHMpIHsKKwkJCXN0YXRzLT5ieXRlX2NvdW50ID0gKGQgLSBkc3QpOworCQkJc3RhdHMtPnVuaWNvZGVfY291bnQgPSAoZCAtIGRzdCk7CisJCQlzdGF0cy0+dW5pY29kZV93aWR0aCA9IChkIC0gZHN0KTsKKwkJfQorCQlyZXR1cm4gZHN0OworCX0KKworCWRzdCA9IE5VTEw7CisJdW5pX2NvdW50ID0gdW5pX3dpZHRoID0gMDsKKwlkc3RfbGVuID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbnQgdzsKKwkJd2NoYXJfdCB3YzsKKworI2lmIEVOQUJMRV9VTklDT0RFX1VTSU5HX0xPQ0FMRQorCQl7CisJCQltYnN0YXRlX3QgbWJzdCA9IHsgMCB9OworCQkJc3NpemVfdCByYyA9IG1ic3J0b3djcygmd2MsICZzcmMsIDEsICZtYnN0KTsKKwkJCS8qIElmIGludmFsaWQgc2VxdWVuY2UgaXMgc2VlbjogLTEgaXMgcmV0dXJuZWQsCisJCQkgKiBzcmMgcG9pbnRzIHRvIHRoZSBpbnZhbGlkIHNlcXVlbmNlLCBlcnJubyA9IEVJTFNFUS4KKwkJCSAqIEVsc2UgbnVtYmVyIG9mIHdjaGFycyAoZXhjbHVkaW5nIHRlcm1pbmF0aW5nIEwnXDAnKQorCQkJICogd3JpdHRlbiB0byBkZXN0IGlzIHJldHVybmVkLgorCQkJICogSWYgbGVuIChoZXJlOiAxKSBub24tTCdcMCcgd2NoYXJzIHN0b3JlZCBhdCBkZXN0LAorCQkJICogc3JjIHBvaW50cyB0byB0aGUgbmV4dCBjaGFyIHRvIGJlIGNvbnZlcnRlZC4KKwkJCSAqIElmIHN0cmluZyBpcyBjb21wbGV0ZWx5IGNvbnZlcnRlZDogc3JjID0gTlVMTC4KKwkJCSAqLworCQkJaWYgKHJjID09IDApIC8qIGVuZC1vZi1zdHJpbmcgKi8KKwkJCQlicmVhazsKKwkJCWlmIChyYyA8IDApIHsgLyogZXJyb3IgKi8KKwkJCQlzcmMrKzsKKwkJCQlnb3RvIHN1YnN0OworCQkJfQorCQkJaWYgKCFpc3dwcmludCh3YykpCisJCQkJZ290byBzdWJzdDsKKwkJfQorI2Vsc2UKKwkJc3JjID0gbWJzdG93Y19pbnRlcm5hbCgmd2MsIHNyYyk7CisJCS8qIHNyYyBpcyBhZHZhbmNlZCB0byBuZXh0IG1iIGNoYXIKKwkJICogd2MgPT0gRVJST1JfV0NIQVI6IGludmFsaWQgc2VxdWVuY2UgaXMgc2VlbgorCQkgKiBlbHNlOiB3YyBpcyBzZXQKKwkJICovCisJCWlmICh3YyA9PSBFUlJPUl9XQ0hBUikgLyogZXJyb3IgKi8KKwkJCWdvdG8gc3Vic3Q7CisJCWlmICh3YyA9PSAwKSAvKiBlbmQtb2Ytc3RyaW5nICovCisJCQlicmVhazsKKyNlbmRpZgorCQlpZiAoQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSICYmIHdjID4gQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSKQorCQkJZ290byBzdWJzdDsKKwkJdyA9IHdjd2lkdGgod2MpOworCQlpZiAoKEVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgJiYgdyA8IDApIC8qIG5vbi1wcmludGFibGUgd2NoYXIgKi8KKwkJIHx8ICghRU5BQkxFX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyAmJiB3IDw9IDApCisJCSB8fCAoIUVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTICYmIHcgPiAxKQorCQkpIHsKKyBzdWJzdDoKKwkJCXdjID0gQ09ORklHX1NVQlNUX1dDSEFSOworCQkJdyA9IDE7CisJCX0KKwkJd2lkdGggLT0gdzsKKwkJLyogTm90ZTogaWYgd2lkdGggPT0gMCwgd2Ugc3RpbGwgbWF5IGFkZCBtb3JlIGNoYXJzLAorCQkgKiB0aGV5IG1heSBiZSB6ZXJvLXdpZHRoIG9yIGNvbWJpbmluZyBvbmVzICovCisJCWlmICgoaW50KXdpZHRoIDwgMCkgeworCQkJLyogY2FuJ3QgYWRkIHRoaXMgd2MsIHN0cmluZyB3b3VsZCBiZWNvbWUgbG9uZ2VyIHRoYW4gd2lkdGggKi8KKwkJCXdpZHRoICs9IHc7CisJCQlicmVhazsKKwkJfQorCisJCXVuaV9jb3VudCsrOworCQl1bmlfd2lkdGggKz0gdzsKKwkJZHN0ID0geHJlYWxsb2MoZHN0LCBkc3RfbGVuICsgTUJfQ1VSX01BWCk7CisjaWYgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisJCXsKKwkJCW1ic3RhdGVfdCBtYnN0ID0geyAwIH07CisJCQlkc3RfbGVuICs9IHdjcnRvbWIoJmRzdFtkc3RfbGVuXSwgd2MsICZtYnN0KTsKKwkJfQorI2Vsc2UKKwkJZHN0X2xlbiArPSB3Y3J0b21iX2ludGVybmFsKCZkc3RbZHN0X2xlbl0sIHdjKTsKKyNlbmRpZgorCX0KKworCS8qIFBhZCB0byByZW1haW5pbmcgd2lkdGggKi8KKwlpZiAoZmxhZ3MgJiBVTklfRkxBR19QQUQpIHsKKwkJZHN0ID0geHJlYWxsb2MoZHN0LCBkc3RfbGVuICsgd2lkdGggKyAxKTsKKwkJdW5pX2NvdW50ICs9IHdpZHRoOworCQl1bmlfd2lkdGggKz0gd2lkdGg7CisJCXdoaWxlICgoaW50KS0td2lkdGggPj0gMCkgeworCQkJZHN0W2RzdF9sZW4rK10gPSAnICc7CisJCX0KKwl9CisJZHN0W2RzdF9sZW5dID0gJ1wwJzsKKwlpZiAoc3RhdHMpIHsKKwkJc3RhdHMtPmJ5dGVfY291bnQgPSBkc3RfbGVuOworCQlzdGF0cy0+dW5pY29kZV9jb3VudCA9IHVuaV9jb3VudDsKKwkJc3RhdHMtPnVuaWNvZGVfd2lkdGggPSB1bmlfd2lkdGg7CisJfQorCisJcmV0dXJuIGRzdDsKK30KK2NoYXIqIEZBU1RfRlVOQyB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlKHVuaV9zdGF0X3QgKnN0YXRzLCBjb25zdCBjaGFyICpzcmMpCit7CisJcmV0dXJuIHVuaWNvZGVfY29udl90b19wcmludGFibGUyKHN0YXRzLCBzcmMsIElOVF9NQVgsIDApOworfQorY2hhciogRkFTVF9GVU5DIHVuaWNvZGVfY29udl90b19wcmludGFibGVfZml4ZWR3aWR0aCgvKnVuaV9zdGF0X3QgKnN0YXRzLCovIGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgd2lkdGgpCit7CisJcmV0dXJuIHVuaWNvZGVfY29udl90b19wcmludGFibGUyKC8qc3RhdHM6Ki8gTlVMTCwgc3JjLCB3aWR0aCwgVU5JX0ZMQUdfUEFEKTsKK30KKworI2lmZGVmIFVOVVNFRAorY2hhciogRkFTVF9GVU5DIHVuaWNvZGVfY29udl90b19wcmludGFibGVfbWF4d2lkdGgodW5pX3N0YXRfdCAqc3RhdHMsIGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgbWF4d2lkdGgpCit7CisJcmV0dXJuIHVuaWNvZGVfY29udl90b19wcmludGFibGUyKHN0YXRzLCBzcmMsIG1heHdpZHRoLCAwKTsKK30KKwordW5zaWduZWQgRkFTVF9GVU5DIHVuaWNvZGVfcGFkZGluZ190b193aWR0aCh1bnNpZ25lZCB3aWR0aCwgY29uc3QgY2hhciAqc3JjKQoreworCWlmICh1bmljb2RlX3N0YXR1cyAhPSBVTklDT0RFX09OKSB7CisJCXJldHVybiB3aWR0aCAtIHN0cm5sZW4oc3JjLCB3aWR0aCk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50IHc7CisJCXdjaGFyX3Qgd2M7CisKKyNpZiBFTkFCTEVfVU5JQ09ERV9VU0lOR19MT0NBTEUKKwkJeworCQkJbWJzdGF0ZV90IG1ic3QgPSB7IDAgfTsKKwkJCXNzaXplX3QgcmMgPSBtYnNydG93Y3MoJndjLCAmc3JjLCAxLCAmbWJzdCk7CisJCQlpZiAocmMgPD0gMCkgLyogZXJyb3IsIG9yIGVuZC1vZi1zdHJpbmcgKi8KKwkJCQlyZXR1cm4gd2lkdGg7CisJCX0KKyNlbHNlCisJCXNyYyA9IG1ic3Rvd2NfaW50ZXJuYWwoJndjLCBzcmMpOworCQlpZiAod2MgPT0gRVJST1JfV0NIQVIgfHwgd2MgPT0gMCkgLyogZXJyb3IsIG9yIGVuZC1vZi1zdHJpbmcgKi8KKwkJCXJldHVybiB3aWR0aDsKKyNlbmRpZgorCQl3ID0gd2N3aWR0aCh3Yyk7CisJCWlmICh3IDwgMCkgLyogbm9uLXByaW50YWJsZSB3Y2hhciAqLworCQkJcmV0dXJuIHdpZHRoOworCQl3aWR0aCAtPSB3OworCQlpZiAoKGludCl3aWR0aCA8PSAwKSAvKiBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gd2lkdGggKi8KKwkJCXJldHVybiAwOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvdXBkYXRlX3Bhc3N3ZC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvdXBkYXRlX3Bhc3N3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMGFmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi91cGRhdGVfcGFzc3dkLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHVwZGF0ZV9wYXNzd2QKKyAqCisgKiB1cGRhdGVfcGFzc3dkIGlzIGEgY29tbW9uIGZ1bmN0aW9uIGZvciBwYXNzd2QgYW5kIGNocGFzc3dkIGFwcGxldHM7CisgKiBpdCBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgcGFzc3dvcmQgZmlsZSAoaS5lLiAvZXRjL3Bhc3N3ZCBvcgorICogL2V0Yy9zaGFkb3cpIGZvciBhIGdpdmVuIHVzZXIgYW5kIHBhc3N3b3JkLgorICoKKyAqIE1vdmVkIGZyb20gbG9naW51dGlscy9wYXNzd2QuYyBieSBBbGV4YW5kZXIgU2hpc2hraW4gPHZpcnR1b3NvQHNsaW5kLm9yZz4KKyAqCisgKiBNb2RpZmllZCB0byBiZSBhYmxlIHRvIGFkZCBvciBkZWxldGUgdXNlcnMsIGdyb3VwcyBhbmQgdXNlcnMgdG8vZnJvbSBncm91cHMKKyAqIGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEVOQUJMRV9TRUxJTlVYCitzdGF0aWMgdm9pZCBjaGVja19zZWxpbnV4X3VwZGF0ZV9wYXNzd2QoY29uc3QgY2hhciAqdXNlcm5hbWUpCit7CisJc2VjdXJpdHlfY29udGV4dF90IGNvbnRleHQ7CisJY2hhciAqc2V1c2VyOworCisJaWYgKGdldHVpZCgpICE9ICh1aWRfdCkwIHx8IGlzX3NlbGludXhfZW5hYmxlZCgpID09IDApCisJCXJldHVybjsgIC8qIE5vIG5lZWQgdG8gY2hlY2sgKi8KKworCWlmIChnZXRwcmV2Y29uX3JhdygmY29udGV4dCkgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldHByZXZjb24gZmFpbGVkIik7CisJc2V1c2VyID0gc3RydG9rKGNvbnRleHQsICI6Iik7CisJaWYgKCFzZXVzZXIpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGNvbnRleHQgJyVzJyIsIGNvbnRleHQpOworCWlmIChzdHJjbXAoc2V1c2VyLCB1c2VybmFtZSkgIT0gMCkgeworCQlpZiAoY2hlY2tQYXNzd2RBY2Nlc3MoUEFTU1dEX19QQVNTV0QpICE9IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiU0VMaW51eDogYWNjZXNzIGRlbmllZCIpOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWVjb24oY29udGV4dCk7Cit9CisjZWxzZQorIyBkZWZpbmUgY2hlY2tfc2VsaW51eF91cGRhdGVfcGFzc3dkKHVzZXJuYW1lKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKgorIDEpIGFkZCBhIHVzZXI6IHVwZGF0ZV9wYXNzd2QoRklMRSwgVVNFUiwgUkVNQUlOSU5HX1BXTElORSwgTlVMTCkKKyAgICBvbmx5IGlmIENPTkZJR19BRERVU0VSPXkgYW5kIGFwcGxldF9uYW1lWzBdID09ICdhJyBsaWtlIGluIGFkZHVzZXIKKworIDIpIGFkZCBhIGdyb3VwOiB1cGRhdGVfcGFzc3dkKEZJTEUsIEdST1VQLCBSRU1BSU5JTkdfR1JMSU5FLCBOVUxMKQorICAgIG9ubHkgaWYgQ09ORklHX0FEREdST1VQPXkgYW5kIGFwcGxldF9uYW1lWzBdID09ICdhJyBsaWtlIGluIGFkZGdyb3VwCisKKyAzKSBhZGQgYSB1c2VyIHRvIGEgZ3JvdXA6IHVwZGF0ZV9wYXNzd2QoRklMRSwgR1JPVVAsIE5VTEwsIE1FTUJFUikKKyAgICBvbmx5IGlmIENPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVA9eSwgYXBwbGV0X25hbWVbMF0gPT0gJ2EnCisgICAgbGlrZSBpbiBhZGRncm91cCBhbmQgbWVtYmVyICE9IE5VTEwKKworIDQpIGRlbGV0ZSBhIHVzZXI6IHVwZGF0ZV9wYXNzd2QoRklMRSwgVVNFUiwgTlVMTCwgTlVMTCkKKworIDUpIGRlbGV0ZSBhIGdyb3VwOiB1cGRhdGVfcGFzc3dkKEZJTEUsIEdST1VQLCBOVUxMLCBOVUxMKQorCisgNikgZGVsZXRlIGEgdXNlciBmcm9tIGEgZ3JvdXA6IHVwZGF0ZV9wYXNzd2QoRklMRSwgR1JPVVAsIE5VTEwsIE1FTUJFUikKKyAgICBvbmx5IGlmIENPTkZJR19GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVA9eSBhbmQgbWVtYmVyICE9IE5VTEwKKworIDcpIGNoYW5nZSB1c2VyJ3MgcGFzc3dvcmQ6IHVwZGF0ZV9wYXNzd2QoRklMRSwgVVNFUiwgTkVXX1BBU1NXRCwgTlVMTCkKKyAgICBvbmx5IGlmIENPTkZJR19QQVNTV0Q9eSBhbmQgYXBwbGV0X25hbWVbMF0gPT0gJ3AnIGxpa2UgaW4gcGFzc3dkCisgICAgb3IgaWYgQ09ORklHX0NIUEFTU1dEPXkgYW5kIGFwcGxldF9uYW1lWzBdID09ICdjJyBsaWtlIGluIGNocGFzc3dkCisKKyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHZhbGlkYXRlIHRoZSBhcmd1bWVudHMgZmVkIHRvIGl0Cisgc28gdGhlIGNhbGxpbmcgcHJvZ3JhbSBzaG91bGQgdGFrZSBjYXJlIG9mIHRoYXQuCisKKyBSZXR1cm5zIG51bWJlciBvZiBsaW5lcyBjaGFuZ2VkLCBvciAtMSBvbiBlcnJvci4KKyovCitpbnQgRkFTVF9GVU5DIHVwZGF0ZV9wYXNzd2QoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IGNoYXIgKm5ld19wYXNzd2QsCisJCWNvbnN0IGNoYXIgKm1lbWJlcikKK3sKKyNpZiAhKEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgfHwgRU5BQkxFX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUCkKKyNkZWZpbmUgbWVtYmVyIE5VTEwKKyNlbmRpZgorCXN0cnVjdCBzdGF0IHNiOworCXN0cnVjdCBmbG9jayBsb2NrOworCUZJTEUgKm9sZF9mcDsKKwlGSUxFICpuZXdfZnA7CisJY2hhciAqZm5hbWVzZng7CisJY2hhciAqc2Z4X2NoYXI7CisJY2hhciAqbmFtZV9jb2xvbjsKKwl1bnNpZ25lZCB1c2VyX2xlbjsKKwlpbnQgb2xkX2ZkOworCWludCBuZXdfZmQ7CisJaW50IGk7CisJaW50IGNoYW5nZWRfbGluZXM7CisJaW50IHJldCA9IC0xOyAvKiBmYWlsdXJlICovCisJLyogdXNlZCBhcyBhIGJvb2w6ICJhcmUgd2UgbW9kaWZ5aW5nIC9ldGMvc2hhZG93PyIgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJY29uc3QgY2hhciAqc2hhZG93ID0gc3Ryc3RyKGZpbGVuYW1lLCAic2hhZG93Iik7CisjZWxzZQorIyBkZWZpbmUgc2hhZG93IE5VTEwKKyNlbmRpZgorCisJZmlsZW5hbWUgPSB4bWFsbG9jX2ZvbGxvd19zeW1saW5rcyhmaWxlbmFtZSk7CisJaWYgKGZpbGVuYW1lID09IE5VTEwpCisJCXJldHVybiByZXQ7CisKKwljaGVja19zZWxpbnV4X3VwZGF0ZV9wYXNzd2QobmFtZSk7CisKKwkvKiBOZXcgcGFzc3dkIGZpbGUsICIvZXRjL3Bhc3N3ZCsiIGZvciBub3cgKi8KKwlmbmFtZXNmeCA9IHhhc3ByaW50ZigiJXMrIiwgZmlsZW5hbWUpOworCXNmeF9jaGFyID0gJmZuYW1lc2Z4W3N0cmxlbihmbmFtZXNmeCktMV07CisJbmFtZV9jb2xvbiA9IHhhc3ByaW50ZigiJXM6IiwgbmFtZSk7CisJdXNlcl9sZW4gPSBzdHJsZW4obmFtZV9jb2xvbik7CisKKwlpZiAoc2hhZG93KQorCQlvbGRfZnAgPSBmb3BlbihmaWxlbmFtZSwgInIrIik7CisJZWxzZQorCQlvbGRfZnAgPSBmb3Blbl9vcl93YXJuKGZpbGVuYW1lLCAicisiKTsKKwlpZiAoIW9sZF9mcCkgeworCQlpZiAoc2hhZG93KQorCQkJcmV0ID0gMDsgLyogbWlzc2luZyBzaGFkb3cgaXMgbm90IGFuIGVycm9yICovCisJCWdvdG8gZnJlZV9tZW07CisJfQorCW9sZF9mZCA9IGZpbGVubyhvbGRfZnApOworCisJc2VsaW51eF9wcmVzZXJ2ZV9mY29udGV4dChvbGRfZmQpOworCisJLyogVHJ5IHRvIGNyZWF0ZSAiL2V0Yy9wYXNzd2QrIi4gV2FpdCBpZiBpdCBleGlzdHMuICovCisJaSA9IDMwOworCWRvIHsKKwkJLy8gRklYTUU6IG9uIGxhc3QgaXRlcmF0aW9uIHRyeSB3L28gT19FWENMIGJ1dCB3aXRoIE9fVFJVTkM/CisJCW5ld19mZCA9IG9wZW4oZm5hbWVzZngsIE9fV1JPTkxZfE9fQ1JFQVR8T19FWENMLCAwNjAwKTsKKwkJaWYgKG5ld19mZCA+PSAwKSBnb3RvIGNyZWF0ZWQ7CisJCWlmIChlcnJubyAhPSBFRVhJU1QpIGJyZWFrOworCQl1c2xlZXAoMTAwMDAwKTsgLyogMC4xIHNlYyAqLworCX0gd2hpbGUgKC0taSk7CisJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyciLCBmbmFtZXNmeCk7CisJZ290byBjbG9zZV9vbGRfZnA7CisKKyBjcmVhdGVkOgorCWlmIChmc3RhdChvbGRfZmQsICZzYikgPT0gMCkgeworCQlmY2htb2QobmV3X2ZkLCBzYi5zdF9tb2RlICYgMDc3Nyk7IC8qIGlnbm9yZSBlcnJvcnMgKi8KKwkJZmNob3duKG5ld19mZCwgc2Iuc3RfdWlkLCBzYi5zdF9naWQpOworCX0KKwllcnJubyA9IDA7CisJbmV3X2ZwID0geGZkb3Blbl9mb3Jfd3JpdGUobmV3X2ZkKTsKKworCS8qIEJhY2t1cCBmaWxlIGlzICIvZXRjL3Bhc3N3ZC0iICovCisJKnNmeF9jaGFyID0gJy0nOworCS8qIERlbGV0ZSBvbGQgYmFja3VwICovCisJaSA9ICh1bmxpbmsoZm5hbWVzZngpICYmIGVycm5vICE9IEVOT0VOVCk7CisJLyogQ3JlYXRlIGJhY2t1cCBhcyBhIGhhcmRsaW5rIHRvIGN1cnJlbnQgKi8KKwlpZiAoaSB8fCBsaW5rKGZpbGVuYW1lLCBmbmFtZXNmeCkpCisJCWJiX3BlcnJvcl9tc2coIndhcm5pbmc6IGNhbid0IGNyZWF0ZSBiYWNrdXAgY29weSAnJXMnIiwKKwkJCQlmbmFtZXNmeCk7CisJKnNmeF9jaGFyID0gJysnOworCisJLyogTG9jayB0aGUgcGFzc3dvcmQgZmlsZSBiZWZvcmUgdXBkYXRpbmcgKi8KKwlsb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisJbG9jay5sX3doZW5jZSA9IFNFRUtfU0VUOworCWxvY2subF9zdGFydCA9IDA7CisJbG9jay5sX2xlbiA9IDA7CisJaWYgKGZjbnRsKG9sZF9mZCwgRl9TRVRMSywgJmxvY2spIDwgMCkKKwkJYmJfcGVycm9yX21zZygid2FybmluZzogY2FuJ3QgbG9jayAnJXMnIiwgZmlsZW5hbWUpOworCWxvY2subF90eXBlID0gRl9VTkxDSzsKKworCS8qIFJlYWQgY3VycmVudCBwYXNzd29yZCBmaWxlLCB3cml0ZSB1cGRhdGVkIC9ldGMvcGFzc3dkKyAqLworCWNoYW5nZWRfbGluZXMgPSAwOworCXdoaWxlICgxKSB7CisJCWNoYXIgKmNwLCAqbGluZTsKKworCQlsaW5lID0geG1hbGxvY19mZ2V0bGluZShvbGRfZnApOworCQlpZiAoIWxpbmUpIC8qIEVPRi9lcnJvciAqLworCQkJYnJlYWs7CisJCWlmIChzdHJuY21wKG5hbWVfY29sb24sIGxpbmUsIHVzZXJfbGVuKSAhPSAwKSB7CisJCQlmcHJpbnRmKG5ld19mcCwgIiVzXG4iLCBsaW5lKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCS8qIFdlIGhhdmUgYSBtYXRjaCB3aXRoICJuYW1lOiIuLi4gKi8KKwkJY3AgPSBsaW5lICsgdXNlcl9sZW47IC8qIG1vdmUgcGFzdCBuYW1lOiAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCB8fCBFTkFCTEVfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQCisJCWlmIChtZW1iZXIpIHsKKwkJCS8qIEl0J3MgYWN0dWFsbHkgL2V0Yy9ncm91cCssIG5vdCAvZXRjL3Bhc3N3ZCsgKi8KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQCisJCQkgJiYgYXBwbGV0X25hbWVbMF0gPT0gJ2EnCisJCQkpIHsKKwkJCQkvKiBBZGQgdXNlciB0byBncm91cCAqLworCQkJCWZwcmludGYobmV3X2ZwLCAiJXMlcyVzXG4iLCBsaW5lLAorCQkJCQlsYXN0X2NoYXJfaXMobGluZSwgJzonKSA/ICIiIDogIiwiLAorCQkJCQltZW1iZXIpOworCQkJCWNoYW5nZWRfbGluZXMrKzsKKwkJCX0gZWxzZSBpZiAoRU5BQkxFX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUAorCQkJLyogJiYgYXBwbGV0X25hbWVbMF0gPT0gJ2QnICovCisJCQkpIHsKKwkJCQkvKiBEZWxldGUgdXNlciBmcm9tIGdyb3VwICovCisJCQkJY2hhciAqdG1wOworCQkJCWNvbnN0IGNoYXIgKmZtdCA9ICIlcyI7CisKKwkJCQkvKiBmaW5kIHRoZSBzdGFydCBvZiB0aGUgbWVtYmVyIGxpc3Q6IGxhc3QgJzonICovCisJCQkJY3AgPSBzdHJyY2hyKGxpbmUsICc6Jyk7CisJCQkJLyogY3V0IGl0ICovCisJCQkJKmNwKysgPSAnXDAnOworCQkJCS8qIHdyaXRlIHRoZSBjdXQgbGluZSBuYW1lOnBhc3N3ZDpnaWQ6CisJCQkJICogb3IgbmFtZTohOjogKi8KKwkJCQlmcHJpbnRmKG5ld19mcCwgIiVzOiIsIGxpbmUpOworCQkJCS8qIHBhcnNlIHRoZSB0b2tlbnMgb2YgdGhlIG1lbWJlciBsaXN0ICovCisJCQkJdG1wID0gY3A7CisJCQkJd2hpbGUgKChjcCA9IHN0cnNlcCgmdG1wLCAiLCIpKSAhPSBOVUxMKSB7CisJCQkJCWlmIChzdHJjbXAobWVtYmVyLCBjcCkgIT0gMCkgeworCQkJCQkJZnByaW50ZihuZXdfZnAsIGZtdCwgY3ApOworCQkJCQkJZm10ID0gIiwlcyI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBmb3VuZCBtZW1iZXIsIHNraXAgaXQgKi8KKwkJCQkJCWNoYW5nZWRfbGluZXMrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQlmcHJpbnRmKG5ld19mcCwgIlxuIik7CisJCQl9CisJCX0gZWxzZQorI2VuZGlmCisJCWlmICgoRU5BQkxFX1BBU1NXRCAmJiBhcHBsZXRfbmFtZVswXSA9PSAncCcpCisJCSB8fCAoRU5BQkxFX0NIUEFTU1dEICYmIGFwcGxldF9uYW1lWzBdID09ICdjJykKKwkJKSB7CisJCQkvKiBDaGFuZ2UgcGFzc3dkICovCisJCQljcCA9IHN0cmNocm51bChjcCwgJzonKTsgLyogbW92ZSBwYXN0IG9sZCBwYXNzd2QgKi8KKworCQkJaWYgKHNoYWRvdyAmJiAqY3AgPT0gJzonKSB7CisJCQkJLyogL2V0Yy9zaGFkb3cncyBmaWVsZCAzIChwYXNzd2QgY2hhbmdlIGRhdGUpIG5lZWRzIHVwZGF0aW5nICovCisJCQkJLyogbW92ZSBwYXN0IG9sZCBjaGFuZ2UgZGF0ZSAqLworCQkJCWNwID0gc3RyY2hybnVsKGNwICsgMSwgJzonKTsKKwkJCQkvKiAibmFtZToiICsgIm5ld19wYXNzd2QiICsgIjoiICsgImNoYW5nZSBkYXRlIiArICI6cmVzdCBvZiBsaW5lIiAqLworCQkJCWZwcmludGYobmV3X2ZwLCAiJXMlczoldSVzXG4iLCBuYW1lX2NvbG9uLCBuZXdfcGFzc3dkLAorCQkJCQkodW5zaWduZWQpKHRpbWUoTlVMTCkpIC8gKDI0KjYwKjYwKSwgY3ApOworCQkJfSBlbHNlIHsKKwkJCQkvKiAibmFtZToiICsgIm5ld19wYXNzd2QiICsgIjpyZXN0IG9mIGxpbmUiICovCisJCQkJZnByaW50ZihuZXdfZnAsICIlcyVzJXNcbiIsIG5hbWVfY29sb24sIG5ld19wYXNzd2QsIGNwKTsKKwkJCX0KKwkJCWNoYW5nZWRfbGluZXMrKzsKKwkJfSAvKiBlbHNlIGRlbGV0ZSB1c2VyIG9yIGdyb3VwOiBza2lwIHRoZSBsaW5lICovCisgbmV4dDoKKwkJZnJlZShsaW5lKTsKKwl9CisKKwlpZiAoY2hhbmdlZF9saW5lcyA9PSAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCB8fCBFTkFCTEVfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQCisJCWlmIChtZW1iZXIpIHsKKwkJCWlmIChFTkFCTEVfQURER1JPVVAgJiYgYXBwbGV0X25hbWVbMF0gPT0gJ2EnKQorCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgZmluZCAlcyBpbiAlcyIsIG5hbWUsIGZpbGVuYW1lKTsKKwkJCWlmIChFTkFCTEVfREVMR1JPVVAgJiYgYXBwbGV0X25hbWVbMF0gPT0gJ2QnKQorCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgZmluZCAlcyBpbiAlcyIsIG1lbWJlciwgZmlsZW5hbWUpOworCQl9CisjZW5kaWYKKwkJaWYgKChFTkFCTEVfQUREVVNFUiB8fCBFTkFCTEVfQURER1JPVVApCisJCSAmJiBhcHBsZXRfbmFtZVswXSA9PSAnYScgJiYgIW1lbWJlcgorCQkpIHsKKwkJCS8qIGFkZCB1c2VyIG9yIGdyb3VwICovCisJCQlmcHJpbnRmKG5ld19mcCwgIiVzJXNcbiIsIG5hbWVfY29sb24sIG5ld19wYXNzd2QpOworCQkJY2hhbmdlZF9saW5lcysrOworCQl9CisJfQorCisJZmNudGwob2xkX2ZkLCBGX1NFVExLLCAmbG9jayk7CisKKwkvKiBXZSBkbyB3YW50IGFsbCBvZiB0aGVtIHRvIGV4ZWN1dGUsIHRodXMgfCBpbnN0ZWFkIG9mIHx8ICovCisJZXJybm8gPSAwOworCWlmICgoZmVycm9yKG9sZF9mcCkgfCBmZmx1c2gobmV3X2ZwKSB8IGZzeW5jKG5ld19mZCkgfCBmY2xvc2UobmV3X2ZwKSkKKwkgfHwgcmVuYW1lKGZuYW1lc2Z4LCBmaWxlbmFtZSkKKwkpIHsKKwkJLyogQXQgbGVhc3Qgb25lIG9mIHRob3NlIGZhaWxlZCAqLworCQliYl9wZXJyb3Jfbm9tc2coKTsKKwkJZ290byB1bmxpbmtfbmV3OworCX0KKwkvKiBTdWNjZXNzOiByZXQgPj0gMCAqLworCXJldCA9IGNoYW5nZWRfbGluZXM7CisKKyB1bmxpbmtfbmV3OgorCWlmIChyZXQgPCAwKQorCQl1bmxpbmsoZm5hbWVzZngpOworCisgY2xvc2Vfb2xkX2ZwOgorCWZjbG9zZShvbGRfZnApOworCisgZnJlZV9tZW06CisJZnJlZShmbmFtZXNmeCk7CisJZnJlZSgoY2hhciAqKWZpbGVuYW1lKTsKKwlmcmVlKG5hbWVfY29sb24pOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi91dG1wLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi91dG1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0NDNmYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3V0bXAuYwpAQCAtMCwwICsxLDEzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdXRtcC93dG1wIHN1cHBvcnQgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyB2b2lkIHRvdWNoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWlmIChhY2Nlc3MoZmlsZW5hbWUsIFJfT0sgfCBXX09LKSA9PSAtMSkKKwkJY2xvc2Uob3BlbihmaWxlbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFULCAwNjY0KSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHdyaXRlX25ld191dG1wKHBpZF90IHBpZCwgaW50IG5ld190eXBlLCBjb25zdCBjaGFyICp0dHlfbmFtZSwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQoreworCXN0cnVjdCB1dG1wIHV0ZW50OworCWNoYXIgKmlkOworCXVuc2lnbmVkIHdpZHRoOworCisJbWVtc2V0KCZ1dGVudCwgMCwgc2l6ZW9mKHV0ZW50KSk7CisJdXRlbnQudXRfcGlkID0gcGlkOworCXV0ZW50LnV0X3R5cGUgPSBuZXdfdHlwZTsKKwl0dHlfbmFtZSA9IHNraXBfZGV2X3BmeCh0dHlfbmFtZSk7CisJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X2xpbmUsIHR0eV9uYW1lLCBzaXplb2YodXRlbnQudXRfbGluZSkpOworCWlmICh1c2VybmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X3VzZXIsIHVzZXJuYW1lLCBzaXplb2YodXRlbnQudXRfdXNlcikpOworCWlmIChob3N0bmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X2hvc3QsIGhvc3RuYW1lLCBzaXplb2YodXRlbnQudXRfaG9zdCkpOworCXV0ZW50LnV0X3R2LnR2X3NlYyA9IHRpbWUoTlVMTCk7CisKKwkvKiBJbnZlbnQgb3VyIG93biB1dF9pZC4gdXRfaWQgaXMgb25seSA0IGNoYXJzIHdpZGUuCisJICogVHJ5IHRvIGZpdCBzb21ldGhpbmcgcmVtb3RlbHkgbWVhbmluZ2Z1bC4uLiAqLworCWlkID0gdXRlbnQudXRfaWQ7CisJd2lkdGggPSBzaXplb2YodXRlbnQudXRfaWQpOworCWlmICh0dHlfbmFtZVswXSA9PSAncCcpIHsKKwkJLyogaWYgInB0eVhYWCIsIG1hcCB0byAicFhYWCIgKi8KKwkJLyogaWYgInB0cy9YWCIsIG1hcCB0byAicC9YWCIgKi8KKwkJKmlkKysgPSAncCc7CisJCXdpZHRoLS07CisJfSAvKiBlbHNlOiB1c3VhbGx5IGl0J3MgInR0eVhYWFgiLCBtYXAgdG8gIlhYWFgiICovCisJaWYgKHN0cmxlbih0dHlfbmFtZSkgPiAzKQorCQl0dHlfbmFtZSArPSAzOworCXN0cm5jcHkoaWQsIHR0eV9uYW1lLCB3aWR0aCk7CisKKwl0b3VjaChfUEFUSF9VVE1QKTsKKwkvL3V0bXBuYW1lKF9QQVRIX1VUTVApOworCXNldHV0ZW50KCk7CisJLyogQXBwZW5kIG5ldyBvbmUgKGhvcGVmdWxseSwgdW5sZXNzIHdlIGNvbGxpZGUgb24gdXRfaWQpICovCisJcHV0dXRsaW5lKCZ1dGVudCk7CisJZW5kdXRlbnQoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dUTVAKKwkvKiAibWFuIHV0bXAiIHNheXMgd3RtcCBmaWxlIHNob3VsZCAqbm90KiBiZSBjcmVhdGVkIGF1dG9tYWdpY2FsbHkgKi8KKwkvKnRvdWNoKGJiX3BhdGhfd3RtcF9maWxlKTsqLworCXVwZHd0bXAoYmJfcGF0aF93dG1wX2ZpbGUsICZ1dGVudCk7CisjZW5kaWYKK30KKworLyoKKyAqIFJlYWQgIm1hbiB1dG1wIiB0byBtYWtlIHNlbnNlIG91dCBvZiBpdC4KKyAqLwordm9pZCBGQVNUX0ZVTkMgdXBkYXRlX3V0bXAocGlkX3QgcGlkLCBpbnQgbmV3X3R5cGUsIGNvbnN0IGNoYXIgKnR0eV9uYW1lLCBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqaG9zdG5hbWUpCit7CisJc3RydWN0IHV0bXAgdXRlbnQ7CisJc3RydWN0IHV0bXAgKnV0cDsKKworCXRvdWNoKF9QQVRIX1VUTVApOworCS8vdXRtcG5hbWUoX1BBVEhfVVRNUCk7CisJc2V0dXRlbnQoKTsKKworCS8qIERpZCBpbml0L2dldHR5L3RlbG5ldGQvc3NoZC8uLi4gY3JlYXRlIGFuIGVudHJ5IGZvciB1cz8KKwkgKiBJdCBzaG91bGQgYmUgKG5ld190eXBlLTEpLCBidXQgd2UnZCBhbHNvIHJldXNlCisJICogYW55IG90aGVyIHBvdGVudGlhbGx5IHN0YWxlIHh4eF9QUk9DRVNTIGVudHJ5ICovCisJd2hpbGUgKCh1dHAgPSBnZXR1dGVudCgpKSAhPSBOVUxMKSB7CisJCWlmICh1dHAtPnV0X3BpZCA9PSBwaWQKKwkJLy8gJiYgdXQtPnV0X2xpbmVbMF0KKwkJICYmIHV0cC0+dXRfaWRbMF0gLyogbXVzdCBoYXZlIG5vbnplcm8gaWQgKi8KKwkJICYmICggIHV0cC0+dXRfdHlwZSA9PSBJTklUX1BST0NFU1MKKwkJICAgIHx8IHV0cC0+dXRfdHlwZSA9PSBMT0dJTl9QUk9DRVNTCisJCSAgICB8fCB1dHAtPnV0X3R5cGUgPT0gVVNFUl9QUk9DRVNTCisJCSAgICB8fCB1dHAtPnV0X3R5cGUgPT0gREVBRF9QUk9DRVNTCisJCSAgICApCisJCSkgeworCQkJaWYgKHV0cC0+dXRfdHlwZSA+PSBuZXdfdHlwZSkgeworCQkJCS8qIFN0YWxlIHJlY29yZC4gTnVrZSBob3N0bmFtZSAqLworCQkJCW1lbXNldCh1dHAtPnV0X2hvc3QsIDAsIHNpemVvZih1dHAtPnV0X2hvc3QpKTsKKwkJCX0KKwkJCS8qIE5COiBwdXR1dGxpbmUgKHNlZSBsYXRlcikgc2VhcmNoZXMgZm9yIG1hdGNoaW5nIHV0ZW50CisJCQkgKiB1c2luZyBnZXR1dGlkKHV0ZW50KSAtIHdlIG11c3Qgbm90IGNoYW5nZSB1dF9pZAorCQkJICogaWYgd2Ugd2FudCAqZXhhY3RseSB0aGlzKiByZWNvcmQgdG8gYmUgb3ZlcndyaXR0ZW4hCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCS8vZW5kdXRlbnQoKTsgLSBubyBuZWVkLCBwdXR1dGxpbmUgY2FuIGRlYWwgd2l0aCAoYW5kIGFjdHVhbGx5IGxpa2VzKQorCS8vdGhlIHNpdHVhdGlvbiB3aGVuIHV0bXAgZmlsZSBpcyBwb3NpdGlvbmVkIG9uIGZvdW5kIHJlY29yZAorCisJaWYgKCF1dHApIHsKKwkJaWYgKG5ld190eXBlICE9IERFQURfUFJPQ0VTUykKKwkJCXdyaXRlX25ld191dG1wKHBpZCwgbmV3X3R5cGUsIHR0eV9uYW1lLCB1c2VybmFtZSwgaG9zdG5hbWUpOworCQllbHNlCisJCQllbmR1dGVudCgpOworCQlyZXR1cm47CisJfQorCisJLyogTWFrZSBhIGNvcHkuIFdlIGNhbid0IHVzZSAqdXRwLCBwdXR1dGxpbmUncyBpbnRlcm5hbCBnZXR1dGlkCisJICogd2lsbCBvdmVyd3JpdGUgaXQgYmVmb3JlIGl0IGlzIHVzZWQhICovCisJdXRlbnQgPSAqdXRwOworCisJdXRlbnQudXRfdHlwZSA9IG5ld190eXBlOworCWlmICh0dHlfbmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X2xpbmUsIHNraXBfZGV2X3BmeCh0dHlfbmFtZSksIHNpemVvZih1dGVudC51dF9saW5lKSk7CisJaWYgKHVzZXJuYW1lKQorCQlzYWZlX3N0cm5jcHkodXRlbnQudXRfdXNlciwgdXNlcm5hbWUsIHNpemVvZih1dGVudC51dF91c2VyKSk7CisJaWYgKGhvc3RuYW1lKQorCQlzYWZlX3N0cm5jcHkodXRlbnQudXRfaG9zdCwgaG9zdG5hbWUsIHNpemVvZih1dGVudC51dF9ob3N0KSk7CisJdXRlbnQudXRfdHYudHZfc2VjID0gdGltZShOVUxMKTsKKworCS8qIFVwZGF0ZSwgb3IgYXBwZW5kIG5ldyBvbmUgKi8KKwkvL3NldHV0ZW50KCk7CisJcHV0dXRsaW5lKCZ1dGVudCk7CisJZW5kdXRlbnQoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dUTVAKKwkvKiAibWFuIHV0bXAiIHNheXMgd3RtcCBmaWxlIHNob3VsZCAqbm90KiBiZSBjcmVhdGVkIGF1dG9tYWdpY2FsbHkgKi8KKwkvKnRvdWNoKGJiX3BhdGhfd3RtcF9maWxlKTsqLworCXVwZHd0bXAoYmJfcGF0aF93dG1wX2ZpbGUsICZ1dGVudCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3V1ZW5jb2RlLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi91dWVuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTcwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi91dWVuY29kZS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgMjAwMywgR2xlbm4gTWNHcmF0aAorICogQ29weXJpZ2h0IDIwMDYsIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKiBDb3B5cmlnaHQgMjAxMCwgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBDb252ZXJzaW9uIHRhYmxlLiAgZm9yIGJhc2UgNjQgKi8KK2NvbnN0IGNoYXIgYmJfdXVlbmNfdGJsX2Jhc2U2NFs2NSArIDJdIEFMSUdOMSA9IHsKKwknQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywKKwknSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywKKwknUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywKKwknWScsICdaJywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywKKwknZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywKKwknbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywKKwkndycsICd4JywgJ3knLCAneicsICcwJywgJzEnLCAnMicsICczJywKKwknNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnKycsICcvJywKKwknPScgLyogdGVybWluYXRpb24gY2hhcmFjdGVyICovLAorCSdcbicsICdcMCcgLyogbmVlZGVkIGZvciB1dWRlY29kZS5jICovCit9OworCitjb25zdCBjaGFyIGJiX3V1ZW5jX3RibF9zdGRbNjVdIEFMSUdOMSA9IHsKKwknYCcsICchJywgJyInLCAnIycsICckJywgJyUnLCAnJicsICdcJycsCisJJygnLCAnKScsICcqJywgJysnLCAnLCcsICctJywgJy4nLCAnLycsCisJJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCisJJzgnLCAnOScsICc6JywgJzsnLCAnPCcsICc9JywgJz4nLCAnPycsCisJJ0AnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsCisJJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsCisJJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsCisJJ1gnLCAnWScsICdaJywgJ1snLCAnXFwnLCAnXScsICdeJywgJ18nLAorCSdgJyAvKiB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIgKi8KK307CisKKy8qCisgKiBFbmNvZGUgYnl0ZXMgYXQgUyBvZiBsZW5ndGggTEVOR1RIIHRvIHV1ZW5jb2RlIG9yIGJhc2U2NCBmb3JtYXQgYW5kIHBsYWNlIGl0CisgKiB0byBTVE9SRS4gIFNUT1JFIHdpbGwgYmUgMC10ZXJtaW5hdGVkLCBhbmQgbXVzdCBwb2ludCB0byBhIHdyaXRhYmxlCisgKiBidWZmZXIgb2YgYXQgbGVhc3QgMStCQVNFNjRfTEVOR1RIKGxlbmd0aCkgYnl0ZXMuCisgKiB3aGVyZSBCQVNFNjRfTEVOR1RIKGxlbikgPSAoNCAqICgoTEVOR1RIICsgMikgLyAzKSkKKyAqLwordm9pZCBGQVNUX0ZVTkMgYmJfdXVlbmNvZGUoY2hhciAqcCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgbGVuZ3RoLCBjb25zdCBjaGFyICp0YmwpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcyA9IHNyYzsKKworCS8qIFRyYW5zZm9ybSB0aGUgM3g4IGJpdHMgdG8gNHg2IGJpdHMgKi8KKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQl1bnNpZ25lZCBzMSwgczI7CisKKwkJLyogQXJlIHNbMV0sIHNbMl0gdmFsaWQgb3Igc2hvdWxkIGJlIGFzc3VtZWQgMD8gKi8KKwkJczEgPSBzMiA9IDA7CisJCWxlbmd0aCAtPSAzOyAvKiBjYW4gYmUgPj0wLCAtMSwgLTIgKi8KKwkJaWYgKGxlbmd0aCA+PSAtMSkgeworCQkJczEgPSBzWzFdOworCQkJaWYgKGxlbmd0aCA+PSAwKQorCQkJCXMyID0gc1syXTsKKwkJfQorCQkqcCsrID0gdGJsW3NbMF0gPj4gMl07CisJCSpwKysgPSB0YmxbKChzWzBdICYgMykgPDwgNCkgKyAoczEgPj4gNCldOworCQkqcCsrID0gdGJsWygoczEgJiAweGYpIDw8IDIpICsgKHMyID4+IDYpXTsKKwkJKnArKyA9IHRibFtzMiAmIDB4M2ZdOworCQlzICs9IDM7CisJfQorCS8qIFplcm8tdGVybWluYXRlICovCisJKnAgPSAnXDAnOworCS8qIElmIGxlbmd0aCBpcyAtMiBvciAtMSwgcGFkIGxhc3QgY2hhciBvciB0d28gKi8KKwl3aGlsZSAobGVuZ3RoKSB7CisJCSotLXAgPSB0YmxbNjRdOworCQlsZW5ndGgrKzsKKwl9Cit9CisKKy8qCisgKiBEZWNvZGUgYmFzZTY0IGVuY29kZWQgc3RyZWFtLgorICogQ2FuIHN0b3Agb24gRU9GLCBzcGVjaWZpZWQgY2hhciwgb3Igb24gdXVlbmNvZGUtc3R5bGUgIj09PT0iIGxpbmU6CisgKiBmbGFncyBhcmd1bWVudCBjb250cm9scyBpdC4KKyAqLwordm9pZCBGQVNUX0ZVTkMgcmVhZF9iYXNlNjQoRklMRSAqc3JjX3N0cmVhbSwgRklMRSAqZHN0X3N0cmVhbSwgaW50IGZsYWdzKQoreworLyogTm90ZSB0aGF0IEVPRiBfY2FuXyBiZSBwYXNzZWQgYXMgZXhpdF9jaGFyIHRvbyAqLworI2RlZmluZSBleGl0X2NoYXIgICAgKChpbnQpKHNpZ25lZCBjaGFyKWZsYWdzKQorI2RlZmluZSB1dV9zdHlsZV9lbmQgKGZsYWdzICYgQkFTRTY0X0ZMQUdfVVVfU1RPUCkKKworCWludCB0ZXJtX2NvdW50ID0gMDsKKworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIGNoYXIgdHJhbnNsYXRlZFs0XTsKKwkJaW50IGNvdW50ID0gMDsKKworCQkvKiBQcm9jZXNzIG9uZSBncm91cCBvZiA0IGNoYXJzICovCisJCXdoaWxlIChjb3VudCA8IDQpIHsKKwkJCWNoYXIgKnRhYmxlX3B0cjsKKwkJCWludCBjaDsKKworCQkJLyogR2V0IG5leHQgX3ZhbGlkXyBjaGFyYWN0ZXIuCisJCQkgKiBiYl91dWVuY190YmxfYmFzZTY0W10gY29udGFpbnMgdGhpcyBzdHJpbmc6CisJCQkgKiAgMCAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICA1ICAgICAgICAgNgorCQkJICogIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NQorCQkJICogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XG4iCisJCQkgKi8KKwkJCWRvIHsKKwkJCQljaCA9IGZnZXRjKHNyY19zdHJlYW0pOworCQkJCWlmIChjaCA9PSBleGl0X2NoYXIgJiYgY291bnQgPT0gMCkKKwkJCQkJcmV0dXJuOworCQkJCWlmIChjaCA9PSBFT0YpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0cnVuY2F0ZWQgYmFzZTY0IGlucHV0Iik7CisJCQkJdGFibGVfcHRyID0gc3RyY2hyKGJiX3V1ZW5jX3RibF9iYXNlNjQsIGNoKTsKKy8vVE9ETzogYWRkIEJBU0U2NF9GTEFHX2ZvbyB0byBkaWUgb24gYmFkIGNoYXI/CisvL05vdGUgdGhhdCB0aGVuIHdlIG1heSBuZWVkIHRvIHN0aWxsIGFsbG93ICdccicgKGZvciBtYWlsIHByb2Nlc3NpbmcpCisJCQl9IHdoaWxlICghdGFibGVfcHRyKTsKKworCQkJLyogQ29udmVydCBlbmNvZGVkIGNoYXJhY3RlciB0byBkZWNpbWFsICovCisJCQljaCA9IHRhYmxlX3B0ciAtIGJiX3V1ZW5jX3RibF9iYXNlNjQ7CisKKwkJCWlmIChjaCA9PSA2NSAvKiAnXG4nICovKSB7CisJCQkJLyogVGVybWluYXRpbmcgIj09PT0iIGxpbmU/ICovCisJCQkJaWYgKHV1X3N0eWxlX2VuZCAmJiB0ZXJtX2NvdW50ID09IDQpCisJCQkJCXJldHVybjsgLyogeWVzICovCisJCQkJdGVybV9jb3VudCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBjaCBpcyA2NCBpZiBjaGFyIHdhcyAnPScsIG90aGVyd2lzZSAwLi42MyAqLworCQkJdHJhbnNsYXRlZFtjb3VudF0gPSBjaCAmIDYzOyAvKiA2NCAtPiAwICovCisJCQlpZiAoY2ggPT0gNjQpIHsKKwkJCQl0ZXJtX2NvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb3VudCsrOworCQkJdGVybV9jb3VudCA9IDA7CisJCX0KKworCQkvKiBNZXJnZSA2IGJpdCBjaGFycyB0byA4IGJpdC4KKwkJICogY291bnQgY2FuIGJlIDwgNCB3aGVuIHdlIGRlY29kZSB0aGUgdGFpbDoKKwkJICogImVRPT0iIC0+ICJ5Iiwgbm90ICJ5IE5VTCBOVUwiCisJCSAqLworCQlpZiAoY291bnQgPiAxKQorCQkJZnB1dGModHJhbnNsYXRlZFswXSA8PCAyIHwgdHJhbnNsYXRlZFsxXSA+PiA0LCBkc3Rfc3RyZWFtKTsKKwkJaWYgKGNvdW50ID4gMikKKwkJCWZwdXRjKHRyYW5zbGF0ZWRbMV0gPDwgNCB8IHRyYW5zbGF0ZWRbMl0gPj4gMiwgZHN0X3N0cmVhbSk7CisJCWlmIChjb3VudCA+IDMpCisJCQlmcHV0Yyh0cmFuc2xhdGVkWzJdIDw8IDYgfCB0cmFuc2xhdGVkWzNdLCBkc3Rfc3RyZWFtKTsKKwl9IC8qIHdoaWxlICgxKSAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvdmRwcmludGYuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3ZkcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlYjQwMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3ZkcHJpbnRmLmMKQEAgLTAsMCArMSwyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPCAyCitpbnQgRkFTVF9GVU5DIHZkcHJpbnRmKGludCBkLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisJY2hhciBidWZbQlVGX1NJWkVdOworCWludCBsZW47CisKKwlsZW4gPSB2c25wcmludGYoYnVmLCBCVUZfU0laRSwgZm9ybWF0LCBhcCk7CisJcmV0dXJuIHdyaXRlKGQsIGJ1ZiwgbGVuKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvdmVycm9yX21zZy5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvdmVycm9yX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTViZTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi92ZXJyb3JfbXNnLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworIyBpbmNsdWRlIDxzeXNsb2cuaD4KKyNlbmRpZgorCitzbWFsbGludCBsb2dtb2RlID0gTE9HTU9ERV9TVERJTzsKK2NvbnN0IGNoYXIgKm1zZ19lb2wgPSAiXG4iOworCit2b2lkIEZBU1RfRlVOQyBiYl92ZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIHZhX2xpc3QgcCwgY29uc3QgY2hhciogc3RyZXJyKQoreworCWNoYXIgKm1zZywgKm1zZzE7CisJaW50IGFwcGxldF9sZW4sIHN0cmVycl9sZW4sIG1zZ2VvbF9sZW4sIHVzZWQ7CisKKwlpZiAoIWxvZ21vZGUpCisJCXJldHVybjsKKworCWlmICghcykgLyogbm9tc2dbX2FuZF9kaWVdIHVzZXMgTlVMTCBmbXQgKi8KKwkJcyA9ICIiOyAvKiBzb21lIGxpYmMgZG9uJ3QgbGlrZSBwcmludGYoTlVMTCkgKi8KKworCXVzZWQgPSB2YXNwcmludGYoJm1zZywgcywgcCk7CisJaWYgKHVzZWQgPCAwKQorCQlyZXR1cm47CisKKwkvKiBUaGlzIGlzIHVnbHkgYW5kIGNvc3RzICs2MCBieXRlcyBjb21wYXJlZCB0byBtdWx0aXBsZQorCSAqIGZwcmludGYncywgYnV0IGlzIGd1YXJhbnRlZWQgdG8gZG8gYSBzaW5nbGUgd3JpdGUuCisJICogVGhpcyBpcyBuZWVkZWQgZm9yIGUuZy4gaHR0cGQgbG9nZ2luZywgd2hlbiBtdWx0aXBsZQorCSAqIGNoaWxkcmVuIGNhbiBwcm9kdWNlIGxvZyBtZXNzYWdlcyBzaW11bHRhbmVvdXNseS4gKi8KKworCWFwcGxldF9sZW4gPSBzdHJsZW4oYXBwbGV0X25hbWUpICsgMjsgLyogImFwcGxldDogIiAqLworCXN0cmVycl9sZW4gPSBzdHJlcnIgPyBzdHJsZW4oc3RyZXJyKSA6IDA7CisJbXNnZW9sX2xlbiA9IHN0cmxlbihtc2dfZW9sKTsKKwkvKiBjYW4ndCB1c2UgeHJlYWxsb2M6IGl0IGNhbGxzIGVycm9yX21zZyBvbiBmYWlsdXJlLAorCSAqIHRoYXQgbWF5IHJlc3VsdCBpbiBhIHJlY3Vyc2lvbiAqLworCS8qICszIGlzIGZvciAiOiAiIGJlZm9yZSBzdHJlcnIgYW5kIGZvciB0ZXJtaW5hdGluZyBOVUwgKi8KKwltc2cxID0gcmVhbGxvYyhtc2csIGFwcGxldF9sZW4gKyB1c2VkICsgc3RyZXJyX2xlbiArIG1zZ2VvbF9sZW4gKyAzKTsKKwlpZiAoIW1zZzEpIHsKKwkJbXNnW3VzZWQrK10gPSAnXG4nOyAvKiBvdmVyd3JpdGVzIE5VTCAqLworCQlhcHBsZXRfbGVuID0gMDsKKwl9IGVsc2UgeworCQltc2cgPSBtc2cxOworCQkvKiBUT0RPOiBtYXliZSB1c2Ugd3JpdGV2IGluc3RlYWQgb2YgbWVtbW92aW5nPyBOZWVkIGZ1bGxfd3JpdGV2PyAqLworCQltZW1tb3ZlKG1zZyArIGFwcGxldF9sZW4sIG1zZywgdXNlZCk7CisJCXVzZWQgKz0gYXBwbGV0X2xlbjsKKwkJc3RyY3B5KG1zZywgYXBwbGV0X25hbWUpOworCQltc2dbYXBwbGV0X2xlbiAtIDJdID0gJzonOworCQltc2dbYXBwbGV0X2xlbiAtIDFdID0gJyAnOworCQlpZiAoc3RyZXJyKSB7CisJCQlpZiAoc1swXSkgeyAvKiBub3QgcGVycm9yX25vbXNnPyAqLworCQkJCW1zZ1t1c2VkKytdID0gJzonOworCQkJCW1zZ1t1c2VkKytdID0gJyAnOworCQkJfQorCQkJc3RyY3B5KCZtc2dbdXNlZF0sIHN0cmVycik7CisJCQl1c2VkICs9IHN0cmVycl9sZW47CisJCX0KKwkJc3RyY3B5KCZtc2dbdXNlZF0sIG1zZ19lb2wpOworCQl1c2VkICs9IG1zZ2VvbF9sZW47CisJfQorCisJaWYgKGxvZ21vZGUgJiBMT0dNT0RFX1NURElPKSB7CisJCWZmbHVzaF9hbGwoKTsKKwkJZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBtc2csIHVzZWQpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0cKKwlpZiAobG9nbW9kZSAmIExPR01PREVfU1lTTE9HKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAiJXMiLCBtc2cgKyBhcHBsZXRfbGVuKTsKKwl9CisjZW5kaWYKKwlmcmVlKG1zZyk7Cit9CisKKyNpZmRlZiBWRVJTSU9OX1dJVEhfV1JJVEVWCisvKiBDb2RlIHNpemUgaXMgYXBwcm94aW1hdGVseSB0aGUgc2FtZSwgYnV0IGN1cnJlbnRseSBpdCdzIHRoZSBvbmx5IHVzZXIKKyAqIG9mIHdyaXRldiBpbiBlbnRpcmUgYmJveC4gX19saWJjX3dyaXRldiBpbiB1Y2xpYmMgaXMgfjUwIGJ5dGVzLiAqLwordm9pZCBGQVNUX0ZVTkMgYmJfdmVycm9yX21zZyhjb25zdCBjaGFyICpzLCB2YV9saXN0IHAsIGNvbnN0IGNoYXIqIHN0cmVycikKK3sKKwlpbnQgc3RyZXJyX2xlbiwgbXNnZW9sX2xlbjsKKwlzdHJ1Y3QgaW92ZWMgaW92WzNdOworCisjZGVmaW5lIHVzZWQgICAoaW92WzJdLmlvdl9sZW4pCisjZGVmaW5lIG1zZ3YgICAoaW92WzJdLmlvdl9iYXNlKQorI2RlZmluZSBtc2djICAgKChjaGFyKikoaW92WzJdLmlvdl9iYXNlKSkKKyNkZWZpbmUgbXNncHRyICgmKGlvdlsyXS5pb3ZfYmFzZSkpCisKKwlpZiAoIWxvZ21vZGUpCisJCXJldHVybjsKKworCWlmICghcykgLyogbm9tc2dbX2FuZF9kaWVdIHVzZXMgTlVMTCBmbXQgKi8KKwkJcyA9ICIiOyAvKiBzb21lIGxpYmMgZG9uJ3QgbGlrZSBwcmludGYoTlVMTCkgKi8KKworCS8qIFByZXZlbnQgImRlcmVmaW5nIHR5cGUtcHVubmVkIHB0ciB3aWxsIGJyZWFrIGFsaWFzaW5nIHJ1bGVzIiAqLworCXVzZWQgPSB2YXNwcmludGYoKGNoYXIqKikodm9pZCopbXNncHRyLCBzLCBwKTsKKwlpZiAodXNlZCA8IDApCisJCXJldHVybjsKKworCS8qIFRoaXMgaXMgdWdseSBhbmQgY29zdHMgKzYwIGJ5dGVzIGNvbXBhcmVkIHRvIG11bHRpcGxlCisJICogZnByaW50ZidzLCBidXQgaXMgZ3VhcmFudGVlZCB0byBkbyBhIHNpbmdsZSB3cml0ZS4KKwkgKiBUaGlzIGlzIG5lZWRlZCBmb3IgZS5nLiBodHRwZCBsb2dnaW5nLCB3aGVuIG11bHRpcGxlCisJICogY2hpbGRyZW4gY2FuIHByb2R1Y2UgbG9nIG1lc3NhZ2VzIHNpbXVsdGFuZW91c2x5LiAqLworCisJc3RyZXJyX2xlbiA9IHN0cmVyciA/IHN0cmxlbihzdHJlcnIpIDogMDsKKwltc2dlb2xfbGVuID0gc3RybGVuKG1zZ19lb2wpOworCS8qICszIGlzIGZvciAiOiAiIGJlZm9yZSBzdHJlcnIgYW5kIGZvciB0ZXJtaW5hdGluZyBOVUwgKi8KKwltc2d2ID0geHJlYWxsb2MobXNndiwgdXNlZCArIHN0cmVycl9sZW4gKyBtc2dlb2xfbGVuICsgMyk7CisJaWYgKHN0cmVycikgeworCQltc2djW3VzZWQrK10gPSAnOic7CisJCW1zZ2NbdXNlZCsrXSA9ICcgJzsKKwkJc3RyY3B5KG1zZ2MgKyB1c2VkLCBzdHJlcnIpOworCQl1c2VkICs9IHN0cmVycl9sZW47CisJfQorCXN0cmNweShtc2djICsgdXNlZCwgbXNnX2VvbCk7CisJdXNlZCArPSBtc2dlb2xfbGVuOworCisJaWYgKGxvZ21vZGUgJiBMT0dNT0RFX1NURElPKSB7CisJCWlvdlswXS5pb3ZfYmFzZSA9IChjaGFyKilhcHBsZXRfbmFtZTsKKwkJaW92WzBdLmlvdl9sZW4gPSBzdHJsZW4oYXBwbGV0X25hbWUpOworCQlpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciopIjogIjsKKwkJaW92WzFdLmlvdl9sZW4gPSAyOworCQkvKmlvdlsyXS5pb3ZfYmFzZSA9IG1zZ2M7Ki8KKwkJLyppb3ZbMl0uaW92X2xlbiA9IHVzZWQ7Ki8KKwkJZmZsdXNoX2FsbCgpOworCQl3cml0ZXYoU1RERVJSX0ZJTEVOTywgaW92LCAzKTsKKwl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TWVNMT0cpIHsKKwkJc3lzbG9nKExPR19FUlIsICIlcyIsIG1zZ2MpOworCX0KKyMgZW5kaWYKKwlmcmVlKG1zZ2MpOworfQorI2VuZGlmCisKKwordm9pZCBGQVNUX0ZVTkMgYmJfZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCWJiX3ZlcnJvcl9tc2cocywgcCwgTlVMTCk7CisJdmFfZW5kKHApOworCXhmdW5jX2RpZSgpOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9lcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCWJiX3ZlcnJvcl9tc2cocywgcCwgTlVMTCk7CisJdmFfZW5kKHApOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvdmZvcmtfZGFlbW9uX3JleGVjLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi92Zm9ya19kYWVtb25fcmV4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVlYWZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvdmZvcmtfZGFlbW9uX3JleGVjLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFJleGVjIHByb2dyYW0gZm9yIHN5c3RlbSBoYXZlIGZvcmsoKSBhcyB2Zm9yaygpIHdpdGggZm9yZWdyb3VuZCBvcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFZsYWRpbWlyIE4uIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PgorICoKKyAqIGRhZW1vbigpIHBvcnRpb24gdGFrZW4gZnJvbSB1Q2xpYmM6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIE1vZGlmaWVkIGZvciB1Q2xpYmMgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJidXN5Ym94LmgiIC8qIHVzZXMgYXBwbGV0IHRhYmxlcyAqLworCisvKiBUaGlzIGRvZXMgYSBmb3JrL2V4ZWMgaW4gb25lIGNhbGwsIHVzaW5nIHZmb3JrKCkuICBSZXR1cm5zIFBJRCBvZiBuZXcgY2hpbGQsCisgKiAtMSBmb3IgZmFpbHVyZS4gIFJ1bnMgYXJndlswXSwgc2VhcmNoaW5nIHBhdGggaWYgdGhhdCBoYXMgbm8gLyBpbiBpdC4gKi8KK3BpZF90IEZBU1RfRlVOQyBzcGF3bihjaGFyICoqYXJndikKK3sKKwkvKiBDb21waWxlciBzaG91bGQgbm90IG9wdGltaXplIHN0b3JlcyBoZXJlICovCisJdm9sYXRpbGUgaW50IGZhaWxlZDsKKwlwaWRfdCBwaWQ7CisKKwlmZmx1c2hfYWxsKCk7CisKKwkvKiBCZSBuaWNlIHRvIG5vbW11IG1hY2hpbmVzLiAqLworCWZhaWxlZCA9IDA7CisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkIDwgMCkgLyogZXJyb3IgKi8KKwkJcmV0dXJuIHBpZDsKKwlpZiAoIXBpZCkgeyAvKiBjaGlsZCAqLworCQkvKiBUaGlzIG1hY3JvIGlzIG9rIC0gaXQgZG9lc24ndCBkbyBOT0VYRUMvTk9GT1JLIHRyaWNrcyAqLworCQlCQl9FWEVDVlAoYXJndlswXSwgYXJndik7CisKKwkJLyogV2UgYXJlIChtYXliZSkgc2hhcmluZyBhIHN0YWNrIHdpdGggYmxvY2tlZCBwYXJlbnQsCisJCSAqIGxldCBwYXJlbnQga25vdyB3ZSBmYWlsZWQgYW5kIHRoZW4gZXhpdCB0byB1bmJsb2NrIHBhcmVudAorCQkgKiAoYnV0IGRvbid0IHJ1biBhdGV4aXQoKSBzdHVmZiwgd2hpY2ggd291bGQgc2NyZXcgdXAgcGFyZW50LikKKwkJICovCisJCWZhaWxlZCA9IGVycm5vOworCQkvKiBtb3VudCwgZm9yIGV4YW1wbGUsIGRvZXMgbm90IHdhbnQgdGhlIG1lc3NhZ2UgKi8KKwkJLypiYl9wZXJyb3JfbXNnKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmd2WzBdKTsqLworCQlfZXhpdCgxMTEpOworCX0KKwkvKiBwYXJlbnQgKi8KKwkvKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5vdCByZWxpYWJsZTogYWNjb3JkaW5nIHRvIHN0YW5kYXJkcworCSAqIHZmb3JrKCkgY2FuIGJlIGVxdWl2YWxlbnQgdG8gZm9yaygpIGFuZCB3ZSB3b24ndCBzZWUgdmFsdWUKKwkgKiBvZiAnZmFpbGVkJy4KKwkgKiBJbnRlcmVzdGVkIHBhcnR5IGNhbiB3YWl0IG9uIHBpZCBhbmQgbGVhcm4gZXhpdCBjb2RlLgorCSAqIElmIDExMSAtIHRoZW4gaXQgKG1vc3QgcHJvYmFibHkpIGZhaWxlZCB0byBleGVjICovCisJaWYgKGZhaWxlZCkgeworCQlzYWZlX3dhaXRwaWQocGlkLCBOVUxMLCAwKTsgLyogcHJldmVudCB6b21iaWUgKi8KKwkJZXJybm8gPSBmYWlsZWQ7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHBpZDsKK30KKworLyogRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBzcGF3biBhIGNoaWxkIHByb2Nlc3MuICovCitwaWRfdCBGQVNUX0ZVTkMgeHNwYXduKGNoYXIgKiphcmd2KQoreworCXBpZF90IHBpZCA9IHNwYXduKGFyZ3YpOworCWlmIChwaWQgPCAwKQorCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKCphcmd2KTsKKwlyZXR1cm4gcGlkOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMKK3N0cnVjdCBub2Zvcmtfc2F2ZV9hcmVhIHsKKwlqbXBfYnVmIGRpZV9qbXA7CisJY29uc3QgY2hhciAqYXBwbGV0X25hbWU7CisJdWludDMyX3Qgb3B0aW9uX21hc2szMjsKKwlpbnQgZGllX3NsZWVwOworCXVpbnQ4X3QgeGZ1bmNfZXJyb3JfcmV0dmFsOworfTsKK3N0YXRpYyB2b2lkIHNhdmVfbm9mb3JrX2RhdGEoc3RydWN0IG5vZm9ya19zYXZlX2FyZWEgKnNhdmUpCit7CisJbWVtY3B5KCZzYXZlLT5kaWVfam1wLCAmZGllX2ptcCwgc2l6ZW9mKGRpZV9qbXApKTsKKwlzYXZlLT5hcHBsZXRfbmFtZSA9IGFwcGxldF9uYW1lOworCXNhdmUtPnhmdW5jX2Vycm9yX3JldHZhbCA9IHhmdW5jX2Vycm9yX3JldHZhbDsKKwlzYXZlLT5vcHRpb25fbWFzazMyID0gb3B0aW9uX21hc2szMjsKKwlzYXZlLT5kaWVfc2xlZXAgPSBkaWVfc2xlZXA7Cit9CitzdGF0aWMgdm9pZCByZXN0b3JlX25vZm9ya19kYXRhKHN0cnVjdCBub2Zvcmtfc2F2ZV9hcmVhICpzYXZlKQoreworCW1lbWNweSgmZGllX2ptcCwgJnNhdmUtPmRpZV9qbXAsIHNpemVvZihkaWVfam1wKSk7CisJYXBwbGV0X25hbWUgPSBzYXZlLT5hcHBsZXRfbmFtZTsKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSBzYXZlLT54ZnVuY19lcnJvcl9yZXR2YWw7CisJb3B0aW9uX21hc2szMiA9IHNhdmUtPm9wdGlvbl9tYXNrMzI7CisJZGllX3NsZWVwID0gc2F2ZS0+ZGllX3NsZWVwOworfQorCitpbnQgRkFTVF9GVU5DIHJ1bl9ub2ZvcmtfYXBwbGV0KGludCBhcHBsZXRfbm8sIGNoYXIgKiphcmd2KQoreworCWludCByYywgYXJnYzsKKwlzdHJ1Y3Qgbm9mb3JrX3NhdmVfYXJlYSBvbGQ7CisKKwlzYXZlX25vZm9ya19kYXRhKCZvbGQpOworCisJYXBwbGV0X25hbWUgPSBBUFBMRVRfTkFNRShhcHBsZXRfbm8pOworCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCisJLyogSW4gY2FzZSBnZXRvcHQoKSBvciBnZXRvcHQzMigpIHdhcyBhbHJlYWR5IGNhbGxlZDoKKwkgKiByZXNldCB0aGUgbGliYyBnZXRvcHQoKSBmdW5jdGlvbiwgd2hpY2gga2VlcHMgaW50ZXJuYWwgc3RhdGUuCisJICoKKwkgKiBCU0QtZGVyaXZlZCBnZXRvcHQoKSBmdW5jdGlvbnMgcmVxdWlyZSB0aGF0IG9wdGluZCBiZSBzZXQgdG8gMSBpbgorCSAqIG9yZGVyIHRvIHJlc2V0IGdldG9wdCgpIHN0YXRlLiAgVGhpcyB1c2VkIHRvIGJlIGdlbmVyYWxseSBhY2NlcHRlZAorCSAqIHdheSBvZiByZXNldHRpbmcgZ2V0b3B0KCkuICBIb3dldmVyLCBnbGliYydzIGdldG9wdCgpCisJICogaGFzIGFkZGl0aW9uYWwgZ2V0b3B0KCkgc3RhdGUgYmV5b25kIG9wdGluZCwgYW5kIHJlcXVpcmVzIHRoYXQKKwkgKiBvcHRpbmQgYmUgc2V0IHRvIHplcm8gdG8gcmVzZXQgaXRzIHN0YXRlLiAgU28gdGhlIHVuZm9ydHVuYXRlIHN0YXRlIG9mCisJICogYWZmYWlycyBpcyB0aGF0IEJTRC1kZXJpdmVkIHZlcnNpb25zIG9mIGdldG9wdCgpIG1pc2JlaGF2ZSBpZgorCSAqIG9wdGluZCBpcyBzZXQgdG8gMCBpbiBvcmRlciB0byByZXNldCBnZXRvcHQoKSwgYW5kIGdsaWJjJ3MgZ2V0b3B0KCkKKwkgKiB3aWxsIGNvcmUgZHVtcCBpZiBvcHRpbmQgaXMgc2V0IDEgaW4gb3JkZXIgdG8gcmVzZXQgZ2V0b3B0KCkuCisJICoKKwkgKiBNb3JlIG1vZGVybiB2ZXJzaW9ucyBvZiBCU0QgcmVxdWlyZSB0aGF0IG9wdHJlc2V0IGJlIHNldCB0byAxIGluCisJICogb3JkZXIgdG8gcmVzZXQgZ2V0b3B0KCkuICBTaWdoLiAgU3RhbmRhcmRzLCBhbnlvbmU/CisJICovCisjaWZkZWYgX19HTElCQ19fCisJb3B0aW5kID0gMDsKKyNlbHNlIC8qIEJTRCBzdHlsZSAqLworCW9wdGluZCA9IDE7CisJLyogb3B0cmVzZXQgPSAxOyAqLworI2VuZGlmCisJLyogb3B0YXJnID0gTlVMTDsgb3B0ZXJyID0gMTsgb3B0b3B0ID0gNjM7IC0gZG8gd2UgbmVlZCB0aGlzIHRvbz8gKi8KKwkvKiAodmFsdWVzIGFib3ZlIGFyZSB3aGF0IHRoZXkgaW5pdGlhbGl6ZWQgdG8gaW4gZ2xpYmMgYW5kIHVjbGliYykgKi8KKwkvKiBvcHRpb25fbWFzazMyID0gMDsgLSBub3QgbmVlZGVkLCBubyBhcHBsZXQgZGVwZW5kcyBvbiBpdCBiZWluZyAwICovCisKKwlhcmdjID0gMTsKKwl3aGlsZSAoYXJndlthcmdjXSkKKwkJYXJnYysrOworCisJLyogU3BlY2lhbCBmbGFnIGZvciB4ZnVuY19kaWUoKS4gSWYgeGZ1bmMgd2lsbCAiZGllIgorCSAqIGluIE5PRk9SSyBhcHBsZXQsIHhmdW5jX2RpZSgpIHNlZXMgbmVnYXRpdmUKKwkgKiBkaWVfc2xlZXAgYW5kIGxvbmdqbXAgaGVyZSBpbnN0ZWFkLiAqLworCWRpZV9zbGVlcCA9IC0xOworCisJcmMgPSBzZXRqbXAoZGllX2ptcCk7CisJaWYgKCFyYykgeworCQkvKiBTb21lIGNhbGxlcnMgKHhhcmdzKQorCQkgKiBuZWVkIGFyZ3YgdW50b3VjaGVkIGJlY2F1c2UgdGhleSBmcmVlIGFyZ3ZbaV0hICovCisJCWNoYXIgKnRtcF9hcmd2W2FyZ2MrMV07CisJCW1lbWNweSh0bXBfYXJndiwgYXJndiwgKGFyZ2MrMSkgKiBzaXplb2YodG1wX2FyZ3ZbMF0pKTsKKwkJLyogRmluYWxseSB3ZSBjYW4gY2FsbCBOT0ZPUksgYXBwbGV0J3MgbWFpbigpICovCisJCXJjID0gYXBwbGV0X21haW5bYXBwbGV0X25vXShhcmdjLCB0bXBfYXJndik7CisJfSBlbHNlIHsgLyogeGZ1bmMgZGllZCBpbiBOT0ZPUksgYXBwbGV0ICovCisJCS8qIGluIGNhc2UgdGhleSBtZWFudCB0byByZXR1cm4gMC4uLiAqLworCQlpZiAocmMgPT0gLTIyMjIpCisJCQlyYyA9IDA7CisJfQorCisJLyogUmVzdG9yaW5nIHNvbWUgZ2xvYmFscyAqLworCXJlc3RvcmVfbm9mb3JrX2RhdGEoJm9sZCk7CisKKwkvKiBPdGhlciBnbG9iYWxzIGNhbiBiZSBzaW1wbHkgcmVzZXQgdG8gZGVmYXVsdHMgKi8KKyNpZmRlZiBfX0dMSUJDX18KKwlvcHRpbmQgPSAwOworI2Vsc2UgLyogQlNEIHN0eWxlICovCisJb3B0aW5kID0gMTsKKyNlbmRpZgorCisJcmV0dXJuIHJjICYgMHhmZjsgLyogZG9uJ3QgY29uZnVzZSBwZW9wbGUgd2l0aCAiZXhpdGNvZGVzIiA+MjU1ICovCit9CisjZW5kaWYgLyogRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyAqLworCitpbnQgRkFTVF9GVU5DIHNwYXduX2FuZF93YWl0KGNoYXIgKiphcmd2KQoreworCWludCByYzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworCWludCBhID0gZmluZF9hcHBsZXRfYnlfbmFtZShhcmd2WzBdKTsKKworCWlmIChhID49IDAgJiYgKEFQUExFVF9JU19OT0ZPUksoYSkKKyMgaWYgQkJfTU1VCisJCQl8fCBBUFBMRVRfSVNfTk9FWEVDKGEpIC8qIE5PRVhFQyB0cmljayBuZWVkcyBmb3JrKCkgKi8KKyMgZW5kaWYKKwkpKSB7CisjIGlmIEJCX01NVQorCQlpZiAoQVBQTEVUX0lTX05PRk9SSyhhKSkKKyMgZW5kaWYKKwkJeworCQkJcmV0dXJuIHJ1bl9ub2ZvcmtfYXBwbGV0KGEsIGFyZ3YpOworCQl9CisjIGlmIEJCX01NVQorCQkvKiBNTVUgb25seSAqLworCQkvKiBhLT5ub2V4ZWMgaXMgdHJ1ZSAqLworCQlyYyA9IGZvcmsoKTsKKwkJaWYgKHJjKSAvKiBwYXJlbnQgb3IgZXJyb3IgKi8KKwkJCXJldHVybiB3YWl0NHBpZChyYyk7CisJCS8qIGNoaWxkICovCisJCXhmdW5jX2Vycm9yX3JldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJcnVuX2FwcGxldF9ub19hbmRfZXhpdChhLCBhcmd2KTsKKyMgZW5kaWYKKwl9CisjZW5kaWYgLyogRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyAqLworCXJjID0gc3Bhd24oYXJndik7CisJcmV0dXJuIHdhaXQ0cGlkKHJjKTsKK30KKworI2lmICFCQl9NTVUKK3ZvaWQgRkFTVF9GVU5DIHJlX2V4ZWMoY2hhciAqKmFyZ3YpCit7CisJLyogaGlnaC1vcmRlciBiaXQgb2YgZmlyc3QgY2hhciBpbiBhcmd2WzBdIGlzIGEgaGlkZGVuCisJICogIndlIGhhdmUgKGFscmVhZHkpIHJlLWV4ZWNlZCwgZG9uJ3QgZG8gaXQgYWdhaW4iIGZsYWcgKi8KKwlhcmd2WzBdWzBdIHw9IDB4ODA7CisJZXhlY3YoYmJfYnVzeWJveF9leGVjX3BhdGgsIGFyZ3YpOworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgYmJfYnVzeWJveF9leGVjX3BhdGgpOworfQorCitwaWRfdCBGQVNUX0ZVTkMgZm9ya19vcl9yZXhlYyhjaGFyICoqYXJndikKK3sKKwlwaWRfdCBwaWQ7CisJLyogTWF5YmUgd2UgYXJlIGFscmVhZHkgcmUtZXhlY2VkIGFuZCBjb21lIGhlcmUgYWdhaW4/ICovCisJaWYgKHJlX2V4ZWNlZCkKKwkJcmV0dXJuIDA7CisJcGlkID0geHZmb3JrKCk7CisJaWYgKHBpZCkgLyogcGFyZW50ICovCisJCXJldHVybiBwaWQ7CisJLyogY2hpbGQgLSByZS1leGVjIG91cnNlbGYgKi8KKwlyZV9leGVjKGFyZ3YpOworfQorI2VuZGlmCisKKy8qIER1ZSB0byBhICNkZWZpbmUgaW4gbGliYmIuaCBvbiBNTVUgc3lzdGVtcyB3ZSBhY3R1YWxseSBoYXZlIDEgYXJndW1lbnQgLQorICogY2hhciAqKmFyZ3YgInZhbmlzaGVzIiAqLwordm9pZCBGQVNUX0ZVTkMgYmJfZGFlbW9uaXplX29yX3JleGVjKGludCBmbGFncywgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCisJaWYgKGZsYWdzICYgREFFTU9OX0NIRElSX1JPT1QpCisJCXhjaGRpcigiLyIpOworCisJaWYgKGZsYWdzICYgREFFTU9OX0RFVk5VTExfU1RESU8pIHsKKwkJY2xvc2UoMCk7CisJCWNsb3NlKDEpOworCQljbG9zZSgyKTsKKwl9CisKKwlmZCA9IG9wZW4oYmJfZGV2X251bGwsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkgeworCQkvKiBOQjogd2UgY2FuIGJlIGNhbGxlZCBhcyBiYl9zYW5pdGl6ZV9zdGRpbygpIGZyb20gaW5pdAorCQkgKiBvciBtZGV2LCBhbmQgdGhlcmUgL2Rldi9udWxsIG1heSBsZWdpdGltYXRlbHkgbm90ICh5ZXQpIGV4aXN0IQorCQkgKiBEbyBub3QgdXNlIHhvcGVuIGFib3ZlLCBidXQgb2J0YWluIF9BTllfIG9wZW4gZGVzY3JpcHRvciwKKwkJICogZXZlbiBib2d1cyBvbmUgYXMgYmVsb3cuICovCisJCWZkID0geG9wZW4oIi8iLCBPX1JET05MWSk7IC8qIGRvbid0IGJlbGlldmUgdGhpcyBjYW4gZmFpbCAqLworCX0KKworCXdoaWxlICgodW5zaWduZWQpZmQgPCAyKQorCQlmZCA9IGR1cChmZCk7IC8qIGhhdmUgMCwxLDIgb3BlbiBhdCBsZWFzdCB0byAvZGV2L251bGwgKi8KKworCWlmICghKGZsYWdzICYgREFFTU9OX09OTFlfU0FOSVRJWkUpKSB7CisJCWlmIChmb3JrX29yX3JleGVjKGFyZ3YpKQorCQkJZXhpdChFWElUX1NVQ0NFU1MpOyAvKiBwYXJlbnQgKi8KKwkJLyogaWYgZGFlbW9uaXppbmcsIG1ha2Ugc3VyZSB3ZSBkZXRhY2ggZnJvbSBzdGRpbyAmIGN0dHkgKi8KKwkJc2V0c2lkKCk7CisJCWR1cDIoZmQsIDApOworCQlkdXAyKGZkLCAxKTsKKwkJZHVwMihmZCwgMik7CisJfQorCXdoaWxlIChmZCA+IDIpIHsKKwkJY2xvc2UoZmQtLSk7CisJCWlmICghKGZsYWdzICYgREFFTU9OX0NMT1NFX0VYVFJBX0ZEUykpCisJCQlyZXR1cm47CisJCS8qIGVsc2UgY2xvc2UgZXZlcnl0aGluZyBhZnRlciBmZCMyICovCisJfQorfQorCit2b2lkIEZBU1RfRlVOQyBiYl9zYW5pdGl6ZV9zdGRpbyh2b2lkKQoreworCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fT05MWV9TQU5JVElaRSwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi93YXJuX2lnbm9yaW5nX2FyZ3MuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3dhcm5faWdub3JpbmdfYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzAyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi93YXJuX2lnbm9yaW5nX2FyZ3MuYwpAQCAtMCwwICsxLDE4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB3YXJuX2lnbm9yaW5nX2FyZ3MgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEVOQUJMRV9ERVNLVE9QCit2b2lkIEZBU1RfRlVOQyBiYl93YXJuX2lnbm9yaW5nX2FyZ3MoY2hhciAqYXJnKQoreworCWlmIChhcmcpIHsKKwkJYmJfZXJyb3JfbXNnKCJpZ25vcmluZyBhbGwgYXJndW1lbnRzIik7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi93Zm9wZW4uYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3dmb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZGM4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi93Zm9wZW4uYwpAQCAtMCwwICsxLDU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitGSUxFKiBGQVNUX0ZVTkMgZm9wZW5fb3Jfd2Fybihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKQoreworCUZJTEUgKmZwID0gZm9wZW4ocGF0aCwgbW9kZSk7CisJaWYgKCFmcCkgeworCQliYl9zaW1wbGVfcGVycm9yX21zZyhwYXRoKTsKKwkJLy9lcnJubyA9IDA7IC8qIHdoeT8gKi8KKwl9CisJcmV0dXJuIGZwOworfQorCitGSUxFKiBGQVNUX0ZVTkMgZm9wZW5fZm9yX3JlYWQoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlyZXR1cm4gZm9wZW4ocGF0aCwgInIiKTsKK30KKworRklMRSogRkFTVF9GVU5DIHhmb3Blbl9mb3JfcmVhZChjb25zdCBjaGFyICpwYXRoKQoreworCXJldHVybiB4Zm9wZW4ocGF0aCwgInIiKTsKK30KKworRklMRSogRkFTVF9GVU5DIGZvcGVuX2Zvcl93cml0ZShjb25zdCBjaGFyICpwYXRoKQoreworCXJldHVybiBmb3BlbihwYXRoLCAidyIpOworfQorCitGSUxFKiBGQVNUX0ZVTkMgeGZvcGVuX2Zvcl93cml0ZShjb25zdCBjaGFyICpwYXRoKQoreworCXJldHVybiB4Zm9wZW4ocGF0aCwgInciKTsKK30KKworc3RhdGljIEZJTEUqIHhmZG9wZW5faGVscGVyKHVuc2lnbmVkIGZkX2FuZF9yd19iaXQpCit7CisJRklMRSogZnAgPSBmZG9wZW4oZmRfYW5kX3J3X2JpdCA+PiAxLCBmZF9hbmRfcndfYml0ICYgMSA/ICJ3IiA6ICJyIik7CisJaWYgKCFmcCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCXJldHVybiBmcDsKK30KK0ZJTEUqIEZBU1RfRlVOQyB4ZmRvcGVuX2Zvcl9yZWFkKGludCBmZCkKK3sKKwlyZXR1cm4geGZkb3Blbl9oZWxwZXIoZmQgPDwgMSk7Cit9CitGSUxFKiBGQVNUX0ZVTkMgeGZkb3Blbl9mb3Jfd3JpdGUoaW50IGZkKQoreworCXJldHVybiB4ZmRvcGVuX2hlbHBlcigoZmQgPDwgMSkgKyAxKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3dmb3Blbl9pbnB1dC5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIvd2ZvcGVuX2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiMWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3dmb3Blbl9pbnB1dC5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHdmb3Blbl9pbnB1dCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQSBudW1iZXIgb2YgYXBwbGV0cyBuZWVkIHRvIG9wZW4gYSBmaWxlIGZvciByZWFkaW5nLCB3aGVyZSB0aGUgZmlsZW5hbWUKKyAqIGlzIGEgY29tbWFuZCBsaW5lIGFyZy4gIFNpbmNlIG9mdGVuIHRoYXQgYXJnIGlzICctJyAobWVhbmluZyBzdGRpbiksCisgKiB3ZSBhdm9pZCB0ZXN0aW5nIGV2ZXJ5d2hlcmUgYnkgY29uc29saWRhdGluZyB0aGluZ3MgaW4gdGhpcyByb3V0aW5lLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitGSUxFKiBGQVNUX0ZVTkMgZm9wZW5fb3Jfd2Fybl9zdGRpbihjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlGSUxFICpmcCA9IHN0ZGluOworCisJaWYgKGZpbGVuYW1lICE9IGJiX21zZ19zdGFuZGFyZF9pbnB1dAorCSAmJiBOT1RfTE9ORV9EQVNIKGZpbGVuYW1lKQorCSkgeworCQlmcCA9IGZvcGVuX29yX3dhcm4oZmlsZW5hbWUsICJyIik7CisJfQorCXJldHVybiBmcDsKK30KKworRklMRSogRkFTVF9GVU5DIHhmb3Blbl9zdGRpbihjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlGSUxFICpmcCA9IGZvcGVuX29yX3dhcm5fc3RkaW4oZmlsZW5hbWUpOworCWlmIChmcCkKKwkJcmV0dXJuIGZwOworCXhmdW5jX2RpZSgpOyAgLyogV2UgYWxyZWFkeSBvdXRwdXQgYW4gZXJyb3IgbWVzc2FnZS4gKi8KK30KKworaW50IEZBU1RfRlVOQyBvcGVuX29yX3dhcm5fc3RkaW4oY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IGZkID0gU1RESU5fRklMRU5POworCisJaWYgKGZpbGVuYW1lICE9IGJiX21zZ19zdGFuZGFyZF9pbnB1dAorCSAmJiBOT1RfTE9ORV9EQVNIKGZpbGVuYW1lKQorCSkgeworCQlmZCA9IG9wZW5fb3Jfd2FybihmaWxlbmFtZSwgT19SRE9OTFkpOworCX0KKworCXJldHVybiBmZDsKK30KKworaW50IEZBU1RfRlVOQyB4b3Blbl9zdGRpbihjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgZmQgPSBvcGVuX29yX3dhcm5fc3RkaW4oZmlsZW5hbWUpOworCWlmIChmZCA+PSAwKQorCQlyZXR1cm4gZmQ7CisJeGZ1bmNfZGllKCk7ICAvKiBXZSBhbHJlYWR5IG91dHB1dCBhbiBlcnJvciBtZXNzYWdlLiAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIvd3JpdGUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2N2E3MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3dyaXRlLmMKQEAgLTAsMCArMSwxOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogT3BlbiBmaWxlIGFuZCB3cml0ZSBzdHJpbmcgc3RyIHRvIGl0LCBjbG9zZSBmaWxlLgorICogRGllIG9uIGFueSBvcGVuIG9yIHdyaXRlIGVycm9yLiAgKi8KK3ZvaWQgRkFTVF9GVU5DIHhvcGVuX3h3cml0ZV9jbG9zZShjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBjaGFyKiBzdHIpCit7CisJaW50IGZkID0geG9wZW4oZmlsZSwgT19XUk9OTFkpOworCXh3cml0ZV9zdHIoZmQsIHN0cik7CisJY2xvc2UoZmQpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIveGF0b251bS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIveGF0b251bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmJlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94YXRvbnVtLmMKQEAgLTAsMCArMSw3MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYXNjaWktdG8tbnVtYmVycyBpbXBsZW1lbnRhdGlvbnMgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIHR5cGUgbG9uZyBsb25nCisjZGVmaW5lIHhzdHJ0b3UocmVzdCkgeHN0cnRvdWxsIyNyZXN0CisjZGVmaW5lIHhzdHJ0byhyZXN0KSB4c3RydG9sbCMjcmVzdAorI2RlZmluZSB4YXRvdShyZXN0KSB4YXRvdWxsIyNyZXN0CisjZGVmaW5lIHhhdG8ocmVzdCkgeGF0b2xsIyNyZXN0CisjZGVmaW5lIFhTVFJfVVRZUEVfTUFYIFVMTE9OR19NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01BWCBMTE9OR19NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01JTiBMTE9OR19NSU4KKyNkZWZpbmUgWFNUUl9TVFJUT1Ugc3RydG91bGwKKyNpbmNsdWRlICJ4YXRvbnVtX3RlbXBsYXRlLmMiCisKKyNpZiBVTE9OR19NQVggIT0gVUxMT05HX01BWAorI2RlZmluZSB0eXBlIGxvbmcKKyNkZWZpbmUgeHN0cnRvdShyZXN0KSB4c3RydG91bCMjcmVzdAorI2RlZmluZSB4c3RydG8ocmVzdCkgeHN0cnRvbCMjcmVzdAorI2RlZmluZSB4YXRvdShyZXN0KSB4YXRvdWwjI3Jlc3QKKyNkZWZpbmUgeGF0byhyZXN0KSB4YXRvbCMjcmVzdAorI2RlZmluZSBYU1RSX1VUWVBFX01BWCBVTE9OR19NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01BWCBMT05HX01BWAorI2RlZmluZSBYU1RSX1RZUEVfTUlOIExPTkdfTUlOCisjZGVmaW5lIFhTVFJfU1RSVE9VIHN0cnRvdWwKKyNpbmNsdWRlICJ4YXRvbnVtX3RlbXBsYXRlLmMiCisjZW5kaWYKKworI2lmIFVJTlRfTUFYICE9IFVMT05HX01BWAorc3RhdGljIEFMV0FZU19JTkxJTkUKK3Vuc2lnbmVkIGJiX3N0cnRvdWkoY29uc3QgY2hhciAqc3RyLCBjaGFyICoqZW5kLCBpbnQgYikKK3sKKwl1bnNpZ25lZCBsb25nIHYgPSBzdHJ0b3VsKHN0ciwgZW5kLCBiKTsKKwlpZiAodiA+IFVJTlRfTUFYKSB7CisJCWVycm5vID0gRVJBTkdFOworCQlyZXR1cm4gVUlOVF9NQVg7CisJfQorCXJldHVybiB2OworfQorI2RlZmluZSB0eXBlIGludAorI2RlZmluZSB4c3RydG91KHJlc3QpIHhzdHJ0b3UjI3Jlc3QKKyNkZWZpbmUgeHN0cnRvKHJlc3QpIHhzdHJ0b2kjI3Jlc3QKKyNkZWZpbmUgeGF0b3UocmVzdCkgeGF0b3UjI3Jlc3QKKyNkZWZpbmUgeGF0byhyZXN0KSB4YXRvaSMjcmVzdAorI2RlZmluZSBYU1RSX1VUWVBFX01BWCBVSU5UX01BWAorI2RlZmluZSBYU1RSX1RZUEVfTUFYIElOVF9NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01JTiBJTlRfTUlOCisvKiBsaWJjIGhhcyBubyBzdHJ0b3VpLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZS91c2Ugb3VyIG93biAqLworI2RlZmluZSBYU1RSX1NUUlRPVSBiYl9zdHJ0b3VpCisjaW5jbHVkZSAieGF0b251bV90ZW1wbGF0ZS5jIgorI2VuZGlmCisKKy8qIEEgZmV3IHNwZWNpYWwgY2FzZXMgKi8KKworaW50IEZBU1RfRlVOQyB4YXRvaV9wb3NpdGl2ZShjb25zdCBjaGFyICpudW1zdHIpCit7CisJcmV0dXJuIHhhdG91X3JhbmdlKG51bXN0ciwgMCwgSU5UX01BWCk7Cit9CisKK3VpbnQxNl90IEZBU1RfRlVOQyB4YXRvdTE2KGNvbnN0IGNoYXIgKm51bXN0cikKK3sKKwlyZXR1cm4geGF0b3VfcmFuZ2UobnVtc3RyLCAwLCAweGZmZmYpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIveGF0b251bV90ZW1wbGF0ZS5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIveGF0b251bV90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOWY2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94YXRvbnVtX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyoKK1lvdSBuZWVkIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIChleGFtcGxlKToKKworI2RlZmluZSB0eXBlIGxvbmcKKyNkZWZpbmUgeHN0cnRvdShyZXN0KSB4c3RydG91bCMjcmVzdAorI2RlZmluZSB4c3RydG8ocmVzdCkgeHN0cnRvbCMjcmVzdAorI2RlZmluZSB4YXRvdShyZXN0KSB4YXRvdWwjI3Jlc3QKKyNkZWZpbmUgeGF0byhyZXN0KSB4YXRvbCMjcmVzdAorI2RlZmluZSBYU1RSX1VUWVBFX01BWCBVTE9OR19NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01BWCBMT05HX01BWAorI2RlZmluZSBYU1RSX1RZUEVfTUlOIExPTkdfTUlOCisjZGVmaW5lIFhTVFJfU1RSVE9VIHN0cnRvdWwKKyovCisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhzdHJ0b3UoX3JhbmdlX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSwKKwkJdW5zaWduZWQgdHlwZSBsb3dlciwKKwkJdW5zaWduZWQgdHlwZSB1cHBlciwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwl1bnNpZ25lZCB0eXBlIHI7CisJaW50IG9sZF9lcnJubzsKKwljaGFyICplOworCisJLyogRGlzYWxsb3cgJy0nIGFuZCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLworCWlmICgqbnVtc3RyID09ICctJyB8fCAqbnVtc3RyID09ICcrJyB8fCBpc3NwYWNlKCpudW1zdHIpKQorCQlnb3RvIGludmFsOworCisJLyogU2luY2UgdGhpcyBpcyBhIGxpYiBmdW5jdGlvbiwgd2UncmUgbm90IGFsbG93ZWQgdG8gcmVzZXQgZXJybm8gdG8gMC4KKwkgKiBEb2luZyBzbyBjb3VsZCBicmVhayBhbiBhcHAgdGhhdCBpcyBkZWZlcnJpbmcgY2hlY2tpbmcgb2YgZXJybm8uCisJICogU28sIHNhdmUgdGhlIG9sZCB2YWx1ZSBzbyB0aGF0IHdlIGNhbiByZXN0b3JlIGl0IGlmIHN1Y2Nlc3NmdWwuICovCisJb2xkX2Vycm5vID0gZXJybm87CisJZXJybm8gPSAwOworCXIgPSBYU1RSX1NUUlRPVShudW1zdHIsICZlLCBiYXNlKTsKKwkvKiBEbyB0aGUgaW5pdGlhbCB2YWxpZGl0eSBjaGVjay4gIE5vdGU6IFRoZSBzdGFuZGFyZHMgZG8gbm90CisJICogZ3VhcmFudGVlIHRoYXQgZXJybm8gaXMgc2V0IGlmIG5vIGRpZ2l0cyB3ZXJlIGZvdW5kLiAgU28gd2UKKwkgKiBtdXN0IHRlc3QgZm9yIHRoaXMgZXhwbGljaXRseS4gKi8KKwlpZiAoZXJybm8gfHwgbnVtc3RyID09IGUpCisJCWdvdG8gaW52YWw7IC8qIGVycm9yIC8gbm8gZGlnaXRzIC8gaWxsZWdhbCB0cmFpbGluZyBjaGFycyAqLworCisJZXJybm8gPSBvbGRfZXJybm87ICAvKiBPay4gIFNvIHJlc3RvcmUgZXJybm8uICovCisKKwkvKiBEbyBvcHRpb25hbCBzdWZmaXggcGFyc2luZy4gIEFsbG93ICdlbXB0eScgc3VmZml4IHRhYmxlcy4KKwkgKiBOb3RlIHRoYXQgd2UgYWxzbyBhbGxvdyBudWwgc3VmZml4ZXMgd2l0aCBhc3NvY2lhdGVkIG11bHRpcGxpZXJzLAorCSAqIHRvIGFsbG93IGZvciBzY2FsaW5nIG9mIHRoZSBudW1zdHIgYnkgc29tZSBkZWZhdWx0IG11bHRpcGxpZXIuICovCisJaWYgKHN1ZmZpeGVzKSB7CisJCXdoaWxlIChzdWZmaXhlcy0+bXVsdCkgeworCQkJaWYgKHN0cmNtcChzdWZmaXhlcy0+c3VmZml4LCBlKSA9PSAwKSB7CisJCQkJaWYgKFhTVFJfVVRZUEVfTUFYIC8gc3VmZml4ZXMtPm11bHQgPCByKQorCQkJCQlnb3RvIHJhbmdlOyAvKiBvdmVyZmxvdyEgKi8KKwkJCQlyICo9IHN1ZmZpeGVzLT5tdWx0OworCQkJCWdvdG8gY2hrX3JhbmdlOworCQkJfQorCQkJKytzdWZmaXhlczsKKwkJfQorCX0KKworCS8qIE5vdGU6IHRyYWlsaW5nIHNwYWNlIGlzIGFuIGVycm9yLgorCSAgIEl0IHdvdWxkIGJlIGVhc3kgZW5vdWdoIHRvIGFsbG93IHRob3VnaCBpZiBkZXNpcmVkLiAqLworCWlmICgqZSkKKwkJZ290byBpbnZhbDsKKyBjaGtfcmFuZ2U6CisJLyogRmluYWxseSwgY2hlY2sgZm9yIHJhbmdlIGxpbWl0cy4gKi8KKwlpZiAociA+PSBsb3dlciAmJiByIDw9IHVwcGVyKQorCQlyZXR1cm4gcjsKKyByYW5nZToKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgibnVtYmVyICVzIGlzIG5vdCBpbiAlbGx1Li4lbGx1IHJhbmdlIiwKKwkJbnVtc3RyLCAodW5zaWduZWQgbG9uZyBsb25nKWxvd2VyLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXVwcGVyKTsKKyBpbnZhbDoKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBudW1iZXIgJyVzJyIsIG51bXN0cik7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhzdHJ0b3UoX3JhbmdlKShjb25zdCBjaGFyICpudW1zdHIsIGludCBiYXNlLAorCQl1bnNpZ25lZCB0eXBlIGxvd2VyLAorCQl1bnNpZ25lZCB0eXBlIHVwcGVyKQoreworCXJldHVybiB4c3RydG91KF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgbG93ZXIsIHVwcGVyLCBOVUxMKTsKK30KKwordW5zaWduZWQgdHlwZSBGQVNUX0ZVTkMgeHN0cnRvdShfc2Z4KShjb25zdCBjaGFyICpudW1zdHIsIGludCBiYXNlLAorCQljb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnN1ZmZpeGVzKQoreworCXJldHVybiB4c3RydG91KF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgMCwgWFNUUl9VVFlQRV9NQVgsIHN1ZmZpeGVzKTsKK30KKwordW5zaWduZWQgdHlwZSBGQVNUX0ZVTkMgeHN0cnRvdSgpKGNvbnN0IGNoYXIgKm51bXN0ciwgaW50IGJhc2UpCit7CisJcmV0dXJuIHhzdHJ0b3UoX3JhbmdlX3NmeCkobnVtc3RyLCBiYXNlLCAwLCBYU1RSX1VUWVBFX01BWCwgTlVMTCk7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhhdG91KF9yYW5nZV9zZngpKGNvbnN0IGNoYXIgKm51bXN0ciwKKwkJdW5zaWduZWQgdHlwZSBsb3dlciwKKwkJdW5zaWduZWQgdHlwZSB1cHBlciwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwlyZXR1cm4geHN0cnRvdShfcmFuZ2Vfc2Z4KShudW1zdHIsIDEwLCBsb3dlciwgdXBwZXIsIHN1ZmZpeGVzKTsKK30KKwordW5zaWduZWQgdHlwZSBGQVNUX0ZVTkMgeGF0b3UoX3JhbmdlKShjb25zdCBjaGFyICpudW1zdHIsCisJCXVuc2lnbmVkIHR5cGUgbG93ZXIsCisJCXVuc2lnbmVkIHR5cGUgdXBwZXIpCit7CisJcmV0dXJuIHhzdHJ0b3UoX3JhbmdlX3NmeCkobnVtc3RyLCAxMCwgbG93ZXIsIHVwcGVyLCBOVUxMKTsKK30KKwordW5zaWduZWQgdHlwZSBGQVNUX0ZVTkMgeGF0b3UoX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLAorCQljb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnN1ZmZpeGVzKQoreworCXJldHVybiB4c3RydG91KF9yYW5nZV9zZngpKG51bXN0ciwgMTAsIDAsIFhTVFJfVVRZUEVfTUFYLCBzdWZmaXhlcyk7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhhdG91KCkoY29uc3QgY2hhciAqbnVtc3RyKQoreworCXJldHVybiB4YXRvdShfc2Z4KShudW1zdHIsIE5VTEwpOworfQorCisvKiBTaWduZWQgb25lcyAqLworCit0eXBlIEZBU1RfRlVOQyB4c3RydG8oX3JhbmdlX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSwKKwkJdHlwZSBsb3dlciwKKwkJdHlwZSB1cHBlciwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwl1bnNpZ25lZCB0eXBlIHUgPSBYU1RSX1RZUEVfTUFYOworCXR5cGUgcjsKKwljb25zdCBjaGFyICpwID0gbnVtc3RyOworCisJLyogTkI6IGlmIHlvdSdsbCBkZWNpZGUgdG8gZGlzYWxsb3cgJysnOgorCSAqIGF0IGxlYXN0IHJlbmljZSBhcHBsZXQgbmVlZHMgdG8gYWxsb3cgaXQgKi8KKwlpZiAocFswXSA9PSAnKycgfHwgcFswXSA9PSAnLScpIHsKKwkJKytwOworCQlpZiAocFswXSA9PSAnLScpCisJCQkrK3U7IC8qID0gPHR5cGU+X01JTiAoMDExMTEuLi4gKyAxID09IDEwMDAwLi4uKSAqLworCX0KKworCXIgPSB4c3RydG91KF9yYW5nZV9zZngpKHAsIGJhc2UsIDAsIHUsIHN1ZmZpeGVzKTsKKworCWlmICgqbnVtc3RyID09ICctJykgeworCQlyID0gLXI7CisJfQorCisJaWYgKHIgPCBsb3dlciB8fCByID4gdXBwZXIpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm51bWJlciAlcyBpcyBub3QgaW4gJWxsZC4uJWxsZCByYW5nZSIsCisJCQkJbnVtc3RyLCAobG9uZyBsb25nKWxvd2VyLCAobG9uZyBsb25nKXVwcGVyKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKwordHlwZSBGQVNUX0ZVTkMgeHN0cnRvKF9yYW5nZSkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSwgdHlwZSBsb3dlciwgdHlwZSB1cHBlcikKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgbG93ZXIsIHVwcGVyLCBOVUxMKTsKK30KKwordHlwZSBGQVNUX0ZVTkMgeHN0cnRvKCkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSkKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgWFNUUl9UWVBFX01JTiwgWFNUUl9UWVBFX01BWCwgTlVMTCk7Cit9CisKK3R5cGUgRkFTVF9GVU5DIHhhdG8oX3JhbmdlX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLAorCQl0eXBlIGxvd2VyLAorCQl0eXBlIHVwcGVyLAorCQljb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnN1ZmZpeGVzKQoreworCXJldHVybiB4c3RydG8oX3JhbmdlX3NmeCkobnVtc3RyLCAxMCwgbG93ZXIsIHVwcGVyLCBzdWZmaXhlcyk7Cit9CisKK3R5cGUgRkFTVF9GVU5DIHhhdG8oX3JhbmdlKShjb25zdCBjaGFyICpudW1zdHIsIHR5cGUgbG93ZXIsIHR5cGUgdXBwZXIpCit7CisJcmV0dXJuIHhzdHJ0byhfcmFuZ2Vfc2Z4KShudW1zdHIsIDEwLCBsb3dlciwgdXBwZXIsIE5VTEwpOworfQorCit0eXBlIEZBU1RfRlVOQyB4YXRvKF9zZngpKGNvbnN0IGNoYXIgKm51bXN0ciwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgMTAsIFhTVFJfVFlQRV9NSU4sIFhTVFJfVFlQRV9NQVgsIHN1ZmZpeGVzKTsKK30KKwordHlwZSBGQVNUX0ZVTkMgeGF0bygpKGNvbnN0IGNoYXIgKm51bXN0cikKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgMTAsIFhTVFJfVFlQRV9NSU4sIFhTVFJfVFlQRV9NQVgsIE5VTEwpOworfQorCisjdW5kZWYgdHlwZQorI3VuZGVmIHhzdHJ0b3UKKyN1bmRlZiB4c3RydG8KKyN1bmRlZiB4YXRvdQorI3VuZGVmIHhhdG8KKyN1bmRlZiBYU1RSX1VUWVBFX01BWAorI3VuZGVmIFhTVFJfVFlQRV9NQVgKKyN1bmRlZiBYU1RSX1RZUEVfTUlOCisjdW5kZWYgWFNUUl9TVFJUT1UKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hjb25uZWN0LmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94Y29ubmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiN2MxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94Y29ubmVjdC5jCkBAIC0wLDAgKzEsNDg0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvbm5lY3QgdG8gaG9zdCBhdCBwb3J0IHVzaW5nIGFkZHJlc3MgcmVzb2x1dGlvbiBmcm9tIGdldGFkZHJpbmZvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAvKiBuZXRpbmV0L2luLmggbmVlZHMgaXQgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgc2V0c29ja29wdF9yZXVzZWFkZHIoaW50IGZkKQoreworCXNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKK30KK2ludCBGQVNUX0ZVTkMgc2V0c29ja29wdF9icm9hZGNhc3QoaW50IGZkKQoreworCXJldHVybiBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7Cit9CisKKyNpZmRlZiBTT19CSU5EVE9ERVZJQ0UKK2ludCBGQVNUX0ZVTkMgc2V0c29ja29wdF9iaW5kdG9kZXZpY2UoaW50IGZkLCBjb25zdCBjaGFyICppZmFjZSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZmFjZSk7CisJLyogTkI6IHBhc3NpbmcgKGlmYWNlLCBzdHJsZW4oaWZhY2UpICsgMSkgZG9lcyBub3Qgd29yayEKKwkgKiAobWF5YmUgaXQgd29ya3Mgb24gX3NvbWVfIGtlcm5lbHMsIGJ1dCBub3Qgb24gMi42LjI2KQorCSAqIEFjdHVhbGx5LCBpZnJfbmFtZSBpcyBhdCBvZmZzZXQgMCwgYW5kIGluIHByYWN0aWNlCisJICoganVzdCBnaXZpbmcgY2hhcltJRk5BTVNJWl0gaW5zdGVhZCBvZiBzdHJ1Y3QgaWZyZXEgd29ya3MgdG9vLgorCSAqIEJ1dCBqdXN0IGluIGNhc2UgaXQncyBub3QgdHJ1ZSBvbiBzb21lIG9ic2N1cmUgYXJjaC4uLiAqLworCXIgPSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsICZpZnIsIHNpemVvZihpZnIpKTsKKwlpZiAocikKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgYmluZCB0byBpbnRlcmZhY2UgJXMiLCBpZmFjZSk7CisJcmV0dXJuIHI7Cit9CisjZWxzZQoraW50IEZBU1RfRlVOQyBzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShpbnQgZmQgVU5VU0VEX1BBUkFNLAorCQljb25zdCBjaGFyICppZmFjZSBVTlVTRURfUEFSQU0pCit7CisJYmJfZXJyb3JfbXNnKCJTT19CSU5EVE9ERVZJQ0UgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSIpOworCXJldHVybiAtMTsKK30KKyNlbmRpZgorCitzdGF0aWMgbGVuX2FuZF9zb2NrYWRkciogZ2V0X2xzYShpbnQgZmQsIGludCAoKmdldF9uYW1lKShpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90ICphZGRybGVuKSkKK3sKKwlsZW5fYW5kX3NvY2thZGRyIGxzYTsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2FfcHRyOworCisJbHNhLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJaWYgKGdldF9uYW1lKGZkLCAmbHNhLnUuc2EsICZsc2EubGVuKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWxzYV9wdHIgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIGxzYS5sZW4pOworCWlmIChsc2EubGVuID4gTFNBX1NJWkVPRl9TQSkgeyAvKiByYXJlbHkgKGlmIGV2ZXIpIGhhcHBlbnMgKi8KKwkJbHNhX3B0ci0+bGVuID0gbHNhLmxlbjsKKwkJZ2V0X25hbWUoZmQsICZsc2FfcHRyLT51LnNhLCAmbHNhX3B0ci0+bGVuKTsKKwl9IGVsc2UgeworCQltZW1jcHkobHNhX3B0ciwgJmxzYSwgTFNBX0xFTl9TSVpFICsgbHNhLmxlbik7CisJfQorCXJldHVybiBsc2FfcHRyOworfQorCitsZW5fYW5kX3NvY2thZGRyKiBGQVNUX0ZVTkMgZ2V0X3NvY2tfbHNhKGludCBmZCkKK3sKKwlyZXR1cm4gZ2V0X2xzYShmZCwgZ2V0c29ja25hbWUpOworfQorCitsZW5fYW5kX3NvY2thZGRyKiBGQVNUX0ZVTkMgZ2V0X3BlZXJfbHNhKGludCBmZCkKK3sKKwlyZXR1cm4gZ2V0X2xzYShmZCwgZ2V0cGVlcm5hbWUpOworfQorCit2b2lkIEZBU1RfRlVOQyB4Y29ubmVjdChpbnQgcywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzX2FkZHIsIHNvY2tsZW5fdCBhZGRybGVuKQoreworCWlmIChjb25uZWN0KHMsIHNfYWRkciwgYWRkcmxlbikgPCAwKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNsb3NlKHMpOworCQlpZiAoc19hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXMgKCVzKSIsCisJCQkJImNhbid0IGNvbm5lY3QgdG8gcmVtb3RlIGhvc3QiLAorCQkJCWluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNfYWRkciktPnNpbl9hZGRyKSk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY29ubmVjdCB0byByZW1vdGUgaG9zdCIpOworCX0KK30KKworLyogUmV0dXJuIHBvcnQgbnVtYmVyIGZvciBhIHNlcnZpY2UuCisgKiBJZiAicG9ydCIgaXMgYSBudW1iZXIgdXNlIGl0IGFzIHRoZSBwb3J0LgorICogSWYgInBvcnQiIGlzIGEgbmFtZSBpdCBpcyBsb29rZWQgdXAgaW4gL2V0Yy9zZXJ2aWNlcywKKyAqIGlmIGl0IGlzbnQgZm91bmQgcmV0dXJuIGRlZmF1bHRfcG9ydAorICovCit1bnNpZ25lZCBGQVNUX0ZVTkMgYmJfbG9va3VwX3BvcnQoY29uc3QgY2hhciAqcG9ydCwgY29uc3QgY2hhciAqcHJvdG9jb2wsIHVuc2lnbmVkIGRlZmF1bHRfcG9ydCkKK3sKKwl1bnNpZ25lZCBwb3J0X25yID0gZGVmYXVsdF9wb3J0OworCWlmIChwb3J0KSB7CisJCWludCBvbGRfZXJybm87CisKKwkJLyogU2luY2UgdGhpcyBpcyBhIGxpYiBmdW5jdGlvbiwgd2UncmUgbm90IGFsbG93ZWQgdG8gcmVzZXQgZXJybm8gdG8gMC4KKwkJICogRG9pbmcgc28gY291bGQgYnJlYWsgYW4gYXBwIHRoYXQgaXMgZGVmZXJyaW5nIGNoZWNraW5nIG9mIGVycm5vLiAqLworCQlvbGRfZXJybm8gPSBlcnJubzsKKwkJcG9ydF9uciA9IGJiX3N0cnRvdShwb3J0LCBOVUxMLCAxMCk7CisJCWlmIChlcnJubyB8fCBwb3J0X25yID4gNjU1MzUpIHsKKwkJCXN0cnVjdCBzZXJ2ZW50ICp0c2VydiA9IGdldHNlcnZieW5hbWUocG9ydCwgcHJvdG9jb2wpOworCQkJcG9ydF9uciA9IGRlZmF1bHRfcG9ydDsKKwkJCWlmICh0c2VydikKKwkJCQlwb3J0X25yID0gbnRvaHModHNlcnYtPnNfcG9ydCk7CisJCX0KKwkJZXJybm8gPSBvbGRfZXJybm87CisJfQorCXJldHVybiAodWludDE2X3QpcG9ydF9ucjsKK30KKworCisvKiAiTmV3IiBuZXR3b3JraW5nIEFQSSAqLworCisKK2ludCBGQVNUX0ZVTkMgZ2V0X25wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXJldHVybiAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXNhKS0+c2luNl9wb3J0OworCX0KKyNlbmRpZgorCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJcmV0dXJuICgoc3RydWN0IHNvY2thZGRyX2luKilzYSktPnNpbl9wb3J0OworCX0KKwkvKiBXaGF0PyBVTklYIHNvY2tldD8gSVBYPz8gOikgKi8KKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNldF9ucG9ydChzdHJ1Y3Qgc29ja2FkZHIgKnNhLCB1bnNpZ25lZCBwb3J0KQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHZvaWQqKSBzYTsKKwkJc2luNi0+c2luNl9wb3J0ID0gcG9ydDsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAodm9pZCopIHNhOworCQlzaW4tPnNpbl9wb3J0ID0gcG9ydDsKKwkJcmV0dXJuOworCX0KKwkvKiBXaGF0PyBVTklYIHNvY2tldD8gSVBYPz8gOikgKi8KK30KKworLyogV2UgaGlqYWNrIHRoaXMgY29uc3RhbnQgdG8gbWVhbiBzb21ldGhpbmcgZWxzZSAqLworLyogSXQgZG9lc24ndCBodXJ0IGJlY2F1c2Ugd2Ugd2lsbCByZW1vdmUgdGhpcyBiaXQgYW55d2F5ICovCisjZGVmaW5lIERJRV9PTl9FUlJPUiBBSV9DQU5PTk5BTUUKKworLyogaG9zdDogIjEuMi4zLjRbOnBvcnRdIiwgInd3dy5nb29nbGUuY29tWzpwb3J0XSIKKyAqIHBvcnQ6IGlmIG5laXRoZXIgb2YgYWJvdmUgc3BlY2lmaWVzIHBvcnQgIyAqLworc3RhdGljIGxlbl9hbmRfc29ja2FkZHIqIHN0cjJzb2NrYWRkcigKKwkJY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsCitJRl9GRUFUVVJFX0lQVjYoc2FfZmFtaWx5X3QgYWYsKQorCQlpbnQgYWlfZmxhZ3MpCit7CitJRl9OT1RfRkVBVFVSRV9JUFY2KHNhX2ZhbWlseV90IGFmID0gQUZfSU5FVDspCisJaW50IHJjOworCWxlbl9hbmRfc29ja2FkZHIgKnI7CisJc3RydWN0IGFkZHJpbmZvICpyZXN1bHQgPSBOVUxMOworCXN0cnVjdCBhZGRyaW5mbyAqdXNlZF9yZXM7CisJY29uc3QgY2hhciAqb3JnX2hvc3QgPSBob3N0OyAvKiBvbmx5IGZvciBlcnJvciBtc2cgKi8KKwljb25zdCBjaGFyICpjcDsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludDsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9VTklYX0xPQ0FMICYmIHN0cm5jbXAoaG9zdCwgImxvY2FsOiIsIDYpID09IDApIHsKKwkJc3RydWN0IHNvY2thZGRyX3VuICpzdW47CisKKwkJciA9IHh6YWxsb2MoTFNBX0xFTl9TSVpFICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bikpOworCQlyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKTsKKwkJci0+dS5zYS5zYV9mYW1pbHkgPSBBRl9VTklYOworCQlzdW4gPSAoc3RydWN0IHNvY2thZGRyX3VuICopJnItPnUuc2E7CisJCXNhZmVfc3RybmNweShzdW4tPnN1bl9wYXRoLCBob3N0ICsgNiwgc2l6ZW9mKHN1bi0+c3VuX3BhdGgpKTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IE5VTEw7CisKKwkvKiBVZ2x5IHBhcnNpbmcgb2YgaG9zdDphZGRyICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgaG9zdFswXSA9PSAnWycpIHsKKwkJLyogRXZlbiB1Z2xpZXIgcGFyc2luZyBvZiBbeHhdOm5uICovCisJCWhvc3QrKzsKKwkJY3AgPSBzdHJjaHIoaG9zdCwgJ10nKTsKKwkJaWYgKCFjcCB8fCAoY3BbMV0gIT0gJzonICYmIGNwWzFdICE9ICdcMCcpKSB7CisJCQkvKiBNYWxmb3JtZWQ6IG11c3QgYmUgW3h4XTpubiBvciBbeHhdICovCisJCQliYl9lcnJvcl9tc2coImJhZCBhZGRyZXNzICclcyciLCBvcmdfaG9zdCk7CisJCQlpZiAoYWlfZmxhZ3MgJiBESUVfT05fRVJST1IpCisJCQkJeGZ1bmNfZGllKCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWNwID0gc3RycmNocihob3N0LCAnOicpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSVBWNiAmJiBjcCAmJiBzdHJjaHIoaG9zdCwgJzonKSAhPSBjcCkgeworCQkJLyogVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSAnOicgKGUuZy4gIjo6MSIpICovCisJCQljcCA9IE5VTEw7IC8qIGl0J3Mgbm90IGEgcG9ydCBzcGVjICovCisJCX0KKwl9CisJaWYgKGNwKSB7IC8qIHBvaW50cyB0byAiOiIgb3IgIl06IiAqLworCQlpbnQgc3ogPSBjcCAtIGhvc3QgKyAxOworCisJCWhvc3QgPSBzYWZlX3N0cm5jcHkoYWxsb2NhKHN6KSwgaG9zdCwgc3opOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSVBWNiAmJiAqY3AgIT0gJzonKSB7CisJCQljcCsrOyAvKiBza2lwICddJyAqLworCQkJaWYgKCpjcCA9PSAnXDAnKSAvKiBbeHhdIHdpdGhvdXQgcG9ydCAqLworCQkJCWdvdG8gc2tpcDsKKwkJfQorCQljcCsrOyAvKiBza2lwICc6JyAqLworCQlwb3J0ID0gYmJfc3RydG91KGNwLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubyB8fCAodW5zaWduZWQpcG9ydCA+IDB4ZmZmZikgeworCQkJYmJfZXJyb3JfbXNnKCJiYWQgcG9ydCBzcGVjICclcyciLCBvcmdfaG9zdCk7CisJCQlpZiAoYWlfZmxhZ3MgJiBESUVfT05fRVJST1IpCisJCQkJeGZ1bmNfZGllKCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorIHNraXA6IDsKKwl9CisKKwkvKiBOZXh0IHR3byBpZiBibG9ja3MgYWxsb3cgdG8gc2tpcCBnZXRhZGRyaW5mbygpCisJICogaW4gY2FzZSBob3N0IG5hbWUgaXMgYSBudW1lcmljIElQKHY2KSBhZGRyZXNzLgorCSAqIGdldGFkZHJpbmZvKCkgaW5pdGlhbGl6ZXMgRE5TIHJlc29sdXRpb24gbWFjaGluZXJ5LAorCSAqIHNjYW5zIG5ldHdvcmsgY29uZmlnIGFuZCBzdWNoIC0gdGVucyBvZiBzeXNjYWxscy4KKwkgKi8KKwkvKiBJZiB3ZSB3ZXJlIG5vdCBhc2tlZCBzcGVjaWZpY2FsbHkgZm9yIElQdjYsCisJICogY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgbnVtZXJpYyBJUHY0ICovCisJSUZfRkVBVFVSRV9JUFY2KGlmKGFmICE9IEFGX0lORVQ2KSkgeworCQlzdHJ1Y3QgaW5fYWRkciBpbjQ7CisJCWlmIChpbmV0X2F0b24oaG9zdCwgJmluNCkgIT0gMCkgeworCQkJciA9IHh6YWxsb2MoTFNBX0xFTl9TSVpFICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQkJci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCQlyLT51LnNhLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlyLT51LnNpbi5zaW5fYWRkciA9IGluNDsKKwkJCWdvdG8gc2V0X3BvcnQ7CisJCX0KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCS8qIElmIHdlIHdlcmUgbm90IGFza2VkIHNwZWNpZmljYWxseSBmb3IgSVB2NCwKKwkgKiBjaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBudW1lcmljIElQdjYgKi8KKwlpZiAoYWYgIT0gQUZfSU5FVCkgeworCQlzdHJ1Y3QgaW42X2FkZHIgaW42OworCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBob3N0LCAmaW42KSA+IDApIHsKKwkJCXIgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJCQlyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCQlyLT51LnNhLnNhX2ZhbWlseSA9IEFGX0lORVQ2OworCQkJci0+dS5zaW42LnNpbjZfYWRkciA9IGluNjsKKwkJCWdvdG8gc2V0X3BvcnQ7CisJCX0KKwl9CisjZW5kaWYKKworCW1lbXNldCgmaGludCwgMCAsIHNpemVvZihoaW50KSk7CisJaGludC5haV9mYW1pbHkgPSBhZjsKKwkvKiBOZWVkIFNPQ0tfU1RSRUFNLCBvciBlbHNlIHdlIGdldCBlYWNoIGFkZHJlc3MgdGhyaWNlIChvciBtb3JlKQorCSAqIGZvciBlYWNoIHBvc3NpYmxlIHNvY2tldCB0eXBlICh0Y3AsdWRwLHJhdy4uLik6ICovCisJaGludC5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCWhpbnQuYWlfZmxhZ3MgPSBhaV9mbGFncyAmIH5ESUVfT05fRVJST1I7CisJcmMgPSBnZXRhZGRyaW5mbyhob3N0LCBOVUxMLCAmaGludCwgJnJlc3VsdCk7CisJaWYgKHJjIHx8ICFyZXN1bHQpIHsKKwkJYmJfZXJyb3JfbXNnKCJiYWQgYWRkcmVzcyAnJXMnIiwgb3JnX2hvc3QpOworCQlpZiAoYWlfZmxhZ3MgJiBESUVfT05fRVJST1IpCisJCQl4ZnVuY19kaWUoKTsKKwkJZ290byByZXQ7CisJfQorCXVzZWRfcmVzID0gcmVzdWx0OworI2lmIEVOQUJMRV9GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1MKKwl3aGlsZSAoMSkgeworCQlpZiAodXNlZF9yZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUKQorCQkJYnJlYWs7CisJCXVzZWRfcmVzID0gdXNlZF9yZXMtPmFpX25leHQ7CisJCWlmICghdXNlZF9yZXMpIHsKKwkJCXVzZWRfcmVzID0gcmVzdWx0OworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKwlyID0geG1hbGxvYyhMU0FfTEVOX1NJWkUgKyB1c2VkX3Jlcy0+YWlfYWRkcmxlbik7CisJci0+bGVuID0gdXNlZF9yZXMtPmFpX2FkZHJsZW47CisJbWVtY3B5KCZyLT51LnNhLCB1c2VkX3Jlcy0+YWlfYWRkciwgdXNlZF9yZXMtPmFpX2FkZHJsZW4pOworCisgc2V0X3BvcnQ6CisJc2V0X25wb3J0KCZyLT51LnNhLCBodG9ucyhwb3J0KSk7CisgcmV0OgorCWlmIChyZXN1bHQpCisJCWZyZWVhZGRyaW5mbyhyZXN1bHQpOworCXJldHVybiByOworfQorI2lmICFFTkFCTEVfRkVBVFVSRV9JUFY2CisjZGVmaW5lIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBhZiwgYWlfZmxhZ3MpIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBhaV9mbGFncykKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorbGVuX2FuZF9zb2NrYWRkciogRkFTVF9GVU5DIGhvc3RfYW5kX2FmMnNvY2thZGRyKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBzYV9mYW1pbHlfdCBhZikKK3sKKwlyZXR1cm4gc3RyMnNvY2thZGRyKGhvc3QsIHBvcnQsIGFmLCAwKTsKK30KKworbGVuX2FuZF9zb2NrYWRkciogRkFTVF9GVU5DIHhob3N0X2FuZF9hZjJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgc2FfZmFtaWx5X3QgYWYpCit7CisJcmV0dXJuIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBhZiwgRElFX09OX0VSUk9SKTsKK30KKyNlbmRpZgorCitsZW5fYW5kX3NvY2thZGRyKiBGQVNUX0ZVTkMgaG9zdDJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gc3RyMnNvY2thZGRyKGhvc3QsIHBvcnQsIEFGX1VOU1BFQywgMCk7Cit9CisKK2xlbl9hbmRfc29ja2FkZHIqIEZBU1RfRlVOQyB4aG9zdDJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gc3RyMnNvY2thZGRyKGhvc3QsIHBvcnQsIEFGX1VOU1BFQywgRElFX09OX0VSUk9SKTsKK30KKworbGVuX2FuZF9zb2NrYWRkciogRkFTVF9GVU5DIHhkb3R0ZWQyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisJcmV0dXJuIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBBRl9VTlNQRUMsIEFJX05VTUVSSUNIT1NUIHwgRElFX09OX0VSUk9SKTsKK30KKworI3VuZGVmIHhzb2NrZXRfdHlwZQoraW50IEZBU1RfRlVOQyB4c29ja2V0X3R5cGUobGVuX2FuZF9zb2NrYWRkciAqKmxzYXAsIElGX0ZFQVRVUkVfSVBWNihpbnQgZmFtaWx5LCkgaW50IHNvY2tfdHlwZSkKK3sKKwlJRl9OT1RfRkVBVFVSRV9JUFY2KGVudW0geyBmYW1pbHkgPSBBRl9JTkVUIH07KQorCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlpbnQgZmQ7CisJaW50IGxlbjsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQlmZCA9IHNvY2tldChBRl9JTkVUNiwgc29ja190eXBlLCAwKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCWZhbWlseSA9IEFGX0lORVQ2OworCQkJZ290byBkb25lOworCQl9CisJCWZhbWlseSA9IEFGX0lORVQ7CisJfQorI2VuZGlmCisJZmQgPSB4c29ja2V0KGZhbWlseSwgc29ja190eXBlLCAwKTsKKwlsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJaWYgKGZhbWlseSA9PSBBRl9JTkVUNikgeworIGRvbmU6CisJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwl9CisjZW5kaWYKKwlsc2EgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIGxlbik7CisJbHNhLT5sZW4gPSBsZW47CisJbHNhLT51LnNhLnNhX2ZhbWlseSA9IGZhbWlseTsKKwkqbHNhcCA9IGxzYTsKKwlyZXR1cm4gZmQ7Cit9CisKK2ludCBGQVNUX0ZVTkMgeHNvY2tldF9zdHJlYW0obGVuX2FuZF9zb2NrYWRkciAqKmxzYXApCit7CisJcmV0dXJuIHhzb2NrZXRfdHlwZShsc2FwLCBJRl9GRUFUVVJFX0lQVjYoQUZfVU5TUEVDLCkgU09DS19TVFJFQU0pOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9hbmRfYmluZF9vcl9kaWUoY29uc3QgY2hhciAqYmluZGFkZHIsIGludCBwb3J0LCBpbnQgc29ja190eXBlKQoreworCWludCBmZDsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisKKwlpZiAoYmluZGFkZHIgJiYgYmluZGFkZHJbMF0pIHsKKwkJbHNhID0geGRvdHRlZDJzb2NrYWRkcihiaW5kYWRkciwgcG9ydCk7CisJCS8qIHVzZXIgc3BlY2lmaWVkIGJpbmQgYWRkciBkaWN0YXRlcyBmYW1pbHkgKi8KKwkJZmQgPSB4c29ja2V0KGxzYS0+dS5zYS5zYV9mYW1pbHksIHNvY2tfdHlwZSwgMCk7CisJfSBlbHNlIHsKKwkJZmQgPSB4c29ja2V0X3R5cGUoJmxzYSwgSUZfRkVBVFVSRV9JUFY2KEFGX1VOU1BFQywpIHNvY2tfdHlwZSk7CisJCXNldF9ucG9ydCgmbHNhLT51LnNhLCBodG9ucyhwb3J0KSk7CisJfQorCXNldHNvY2tvcHRfcmV1c2VhZGRyKGZkKTsKKwl4YmluZChmZCwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCWZyZWUobHNhKTsKKwlyZXR1cm4gZmQ7Cit9CisKK2ludCBGQVNUX0ZVTkMgY3JlYXRlX2FuZF9iaW5kX3N0cmVhbV9vcl9kaWUoY29uc3QgY2hhciAqYmluZGFkZHIsIGludCBwb3J0KQoreworCXJldHVybiBjcmVhdGVfYW5kX2JpbmRfb3JfZGllKGJpbmRhZGRyLCBwb3J0LCBTT0NLX1NUUkVBTSk7Cit9CisKK2ludCBGQVNUX0ZVTkMgY3JlYXRlX2FuZF9iaW5kX2RncmFtX29yX2RpZShjb25zdCBjaGFyICpiaW5kYWRkciwgaW50IHBvcnQpCit7CisJcmV0dXJuIGNyZWF0ZV9hbmRfYmluZF9vcl9kaWUoYmluZGFkZHIsIHBvcnQsIFNPQ0tfREdSQU0pOworfQorCisKK2ludCBGQVNUX0ZVTkMgY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoY29uc3QgY2hhciAqcGVlciwgaW50IHBvcnQpCit7CisJaW50IGZkOworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKworCWxzYSA9IHhob3N0MnNvY2thZGRyKHBlZXIsIHBvcnQpOworCWZkID0geHNvY2tldChsc2EtPnUuc2Euc2FfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCk7CisJc2V0c29ja29wdF9yZXVzZWFkZHIoZmQpOworCXhjb25uZWN0KGZkLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7CisJZnJlZShsc2EpOworCXJldHVybiBmZDsKK30KKworaW50IEZBU1RfRlVOQyB4Y29ubmVjdF9zdHJlYW0oY29uc3QgbGVuX2FuZF9zb2NrYWRkciAqbHNhKQoreworCWludCBmZCA9IHhzb2NrZXQobHNhLT51LnNhLnNhX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworCXhjb25uZWN0KGZkLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7CisJcmV0dXJuIGZkOworfQorCisvKiBXZSBoaWphY2sgdGhpcyBjb25zdGFudCB0byBtZWFuIHNvbWV0aGluZyBlbHNlICovCisvKiBJdCBkb2Vzbid0IGh1cnQgYmVjYXVzZSB3ZSB3aWxsIGFkZCB0aGlzIGJpdCBhbnl3YXkgKi8KKyNkZWZpbmUgSUdOT1JFX1BPUlQgTklfTlVNRVJJQ1NFUlYKK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgc29ja2FkZHIyc3RyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EsIGludCBmbGFncykKK3sKKwljaGFyIGhvc3RbMTI4XTsKKwljaGFyIHNlcnZbMTZdOworCWludCByYzsKKwlzb2NrbGVuX3Qgc2FsZW47CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfVU5JWF9MT0NBTCAmJiBzYS0+c2FfZmFtaWx5ID09IEFGX1VOSVgpIHsKKwkJc3RydWN0IHNvY2thZGRyX3VuICpzdW4gPSAoc3RydWN0IHNvY2thZGRyX3VuICopc2E7CisJCXJldHVybiB4YXNwcmludGYoImxvY2FsOiUuKnMiLAorCQkJCShpbnQpIHNpemVvZihzdW4tPnN1bl9wYXRoKSwKKwkJCQlzdW4tPnN1bl9wYXRoKTsKKwl9CisKKwlzYWxlbiA9IExTQV9TSVpFT0ZfU0E7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpCisJCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworI2VuZGlmCisJcmMgPSBnZXRuYW1laW5mbyhzYSwgc2FsZW4sCisJCQlob3N0LCBzaXplb2YoaG9zdCksCisJLyogY2FuIGRvICgoZmxhZ3MgJiBJR05PUkVfUE9SVCkgPyBOVUxMIDogc2VydikgYnV0IHdoeSBib3RoZXI/ICovCisJCQlzZXJ2LCBzaXplb2Yoc2VydiksCisJCQkvKiBkbyBub3QgcmVzb2x2ZSBwb3J0IyBpbnRvIHNlcnZpY2UgX25hbWVfICovCisJCQlmbGFncyB8IE5JX05VTUVSSUNTRVJWCisJKTsKKwlpZiAocmMpCisJCXJldHVybiBOVUxMOworCWlmIChmbGFncyAmIElHTk9SRV9QT1JUKQorCQlyZXR1cm4geHN0cmR1cChob3N0KTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJaWYgKHN0cmNocihob3N0LCAnOicpKSAvKiBoZWgsIGl0J3Mgbm90IGEgcmVzb2x2ZWQgaG9zdG5hbWUgKi8KKwkJCXJldHVybiB4YXNwcmludGYoIlslc106JXMiLCBob3N0LCBzZXJ2KTsKKwkJLypyZXR1cm4geGFzcHJpbnRmKCIlczolcyIsIGhvc3QsIHNlcnYpOyovCisJCS8qIC0gZmFsbCB0aHJvdWdoIGluc3RlYWQgKi8KKwl9CisjZW5kaWYKKwkvKiBGb3Igbm93IHdlIGRvbid0IHN1cHBvcnQgYW55dGhpbmcgZWxzZSwgc28gaXQgaGFzIHRvIGJlIElORVQgKi8KKwkvKmlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpKi8KKwkJcmV0dXJuIHhhc3ByaW50ZigiJXM6JXMiLCBob3N0LCBzZXJ2KTsKKwkvKnJldHVybiB4c3RyZHVwKGhvc3QpOyovCit9CisKK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3NvY2thZGRyMmhvc3QoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKwlyZXR1cm4gc29ja2FkZHIyc3RyKHNhLCAwKTsKK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2Nfc29ja2FkZHIyaG9zdF9ub3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKwlyZXR1cm4gc29ja2FkZHIyc3RyKHNhLCBJR05PUkVfUE9SVCk7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3NvY2thZGRyMmhvc3Rvbmx5X25vcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworCXJldHVybiBzb2NrYWRkcjJzdHIoc2EsIE5JX05BTUVSRVFEIHwgSUdOT1JFX1BPUlQpOworfQorY2hhciogRkFTVF9GVU5DIHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisJcmV0dXJuIHNvY2thZGRyMnN0cihzYSwgTklfTlVNRVJJQ0hPU1QpOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisJcmV0dXJuIHNvY2thZGRyMnN0cihzYSwgTklfTlVNRVJJQ0hPU1QgfCBJR05PUkVfUE9SVCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi94ZnVuY19kaWUuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hmdW5jX2RpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNGU1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94ZnVuY19kaWUuYwpAQCAtMCwwICsxLDQwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogS2VlcGluZyBpdCBzZXBhcmF0ZSBhbGxvd3MgdG8gTk9UIHN1Y2sgaW4gc3RkaW8gZm9yIFZFUlkgc21hbGwgYXBwbGV0cy4KKyAqIFRyeSBidWlsZGluZyBidXN5Ym94IHdpdGggb25seSAidHJ1ZSIgZW5hYmxlZC4uLiAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IGRpZV9zbGVlcDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyB8fCBFTkFCTEVfSFVTSAoram1wX2J1ZiBkaWVfam1wOworI2VuZGlmCisKK3ZvaWQgRkFTVF9GVU5DIHhmdW5jX2RpZSh2b2lkKQoreworCWlmIChkaWVfc2xlZXApIHsKKwkJaWYgKChFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyB8fCBFTkFCTEVfSFVTSCkKKwkJICYmIGRpZV9zbGVlcCA8IDAKKwkJKSB7CisJCQkvKiBTcGVjaWFsIGNhc2UuIFdlIGFycml2ZSBoZXJlIGlmIE5PRk9SSyBhcHBsZXQKKwkJCSAqIGNhbGxzIHhmdW5jLCB3aGljaCB0aGVuIGRlY2lkZXMgdG8gZGllLgorCQkJICogV2UgZG9uJ3QgZGllLCBidXQganVtcCBpbnN0ZWFkIGJhY2sgdG8gY2FsbGVyLgorCQkJICogTk9GT1JLIGFwcGxldHMgc3RpbGwgY2Fubm90IGNhcmVsZXNzbHkgY2FsbCB4ZnVuY3M6CisJCQkgKiBwID0geG1hbGxvYygxMCk7CisJCQkgKiBxID0geG1hbGxvYygxMCk7IC8vIEJVRyEgaWYgdGhpcyBkaWVzLCB3ZSBsZWFrIHAhCisJCQkgKi8KKwkJCS8qIC0yMjIyIG1lYW5zICJ6ZXJvIiAobG9uZ2ptcCBjYW4ndCBwYXNzIDApCisJCQkgKiBydW5fbm9mb3JrX2FwcGxldCgpIGNhdGNoZXMgLTIyMjIuICovCisJCQlsb25nam1wKGRpZV9qbXAsIHhmdW5jX2Vycm9yX3JldHZhbCA/IHhmdW5jX2Vycm9yX3JldHZhbCA6IC0yMjIyKTsKKwkJfQorCQlzbGVlcChkaWVfc2xlZXApOworCX0KKwlleGl0KHhmdW5jX2Vycm9yX3JldHZhbCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi94ZnVuY3MuYyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hmdW5jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjI3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94ZnVuY3MuYwpAQCAtMCwwICsxLDMxMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUm9iIExhbmRsZXkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogV2UgbmVlZCB0byBoYXZlIHNlcGFyYXRlIHhmdW5jcy5jIGFuZCB4ZnVuY3NfcHJpbnRmLmMgYmVjYXVzZQorICogd2l0aCBjdXJyZW50IGxpbmtlcnMsIGV2ZW4gd2l0aCBzZWN0aW9uIGdhcmJhZ2UgY29sbGVjdGlvbiwKKyAqIGlmICoubyBtb2R1bGUgcmVmZXJlbmNlcyBhbnkgb2YgWFhYcHJpbnRmIGZ1bmN0aW9ucywgeW91IHB1bGwgaW4KKyAqIGVudGlyZSBwcmludGYgbWFjaGluZXJ5LiBFdmVuIGlmIHlvdSBkbyBub3QgdXNlIHRoZSBmdW5jdGlvbgorICogd2hpY2ggdXNlcyBYWFhwcmludGYuCisgKgorICogeGZ1bmNzLmMgY29udGFpbnMgZnVuY3Rpb25zIChub3QgbmVjZXNzYXJpbHkgeGZ1bmNzKQorICogd2hpY2ggZG8gbm90IHB1bGwgaW4gcHJpbnRmLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgorICogeGZ1bmNfcHJpbnRmLmMgY29udGFpbnMgdGhvc2Ugd2hpY2ggZG8uCisgKgorICogVE9ETzogbW92ZSB4bWFsbG9jKCkgYW5kIHhhdG9udW0oKSBoZXJlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUdXJuIG9uIG5vbmJsb2NraW5nIEkvTyBvbiBhIGZkICovCit2b2lkIEZBU1RfRlVOQyBuZGVsYXlfb24oaW50IGZkKQoreworCWludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMKTsKKwlpZiAoZmxhZ3MgJiBPX05PTkJMT0NLKQorCQlyZXR1cm47CisJZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSyk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIG5kZWxheV9vZmYoaW50IGZkKQoreworCWludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMKTsKKwlpZiAoIShmbGFncyAmIE9fTk9OQkxPQ0spKQorCQlyZXR1cm47CisJZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzICYgfk9fTk9OQkxPQ0spOworfQorCit2b2lkIEZBU1RfRlVOQyBjbG9zZV9vbl9leGVjX29uKGludCBmZCkKK3sKKwlmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBzdHJuY3B5X0lGTkFNU0laKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworI2lmbmRlZiBJRk5BTVNJWgorCWVudW0geyBJRk5BTVNJWiA9IDE2IH07CisjZW5kaWYKKwlyZXR1cm4gc3RybmNweShkc3QsIHNyYywgSUZOQU1TSVopOworfQorCisKKy8qIENvbnZlcnQgdW5zaWduZWQgaW50ZWdlciB0byBhc2NpaSwgd3JpdGluZyBpbnRvIHN1cHBsaWVkIGJ1ZmZlci4KKyAqIEEgdHJ1bmNhdGVkIHJlc3VsdCBjb250YWlucyB0aGUgZmlyc3QgZmV3IGRpZ2l0cyBvZiB0aGUgcmVzdWx0IGFsYSBzdHJuY3B5LgorICogUmV0dXJucyBhIHBvaW50ZXIgcGFzdCBsYXN0IGdlbmVyYXRlZCBkaWdpdCwgZG9lcyBfbm90XyBzdG9yZSBOVUwuCisgKi8KK3ZvaWQgQlVHX3NpemVvZih2b2lkKTsKK2NoYXIqIEZBU1RfRlVOQyB1dG9hX3RvX2J1Zih1bnNpZ25lZCBuLCBjaGFyICpidWYsIHVuc2lnbmVkIGJ1ZmxlbikKK3sKKwl1bnNpZ25lZCBpLCBvdXQsIHJlczsKKworCWlmIChidWZsZW4pIHsKKwkJb3V0ID0gMDsKKwkJaWYgKHNpemVvZihuKSA9PSA0KQorCQkvLyAyXjMyLTEgPSA0Mjk0OTY3Mjk1CisJCQlpID0gMTAwMDAwMDAwMDsKKyNpZiBVSU5UX01BWCA+IDQyOTQ5NjcyOTUgLyogcHJldmVudHMgd2FybmluZyBhYm91dCAiY29uc3QgdG9vIGxhcmdlIiAqLworCQllbHNlCisJCWlmIChzaXplb2YobikgPT0gOCkKKwkJLy8gMl42NC0xID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUKKwkJCWkgPSAxMDAwMDAwMDAwMDAwMDAwMDAwMDsKKyNlbmRpZgorCQllbHNlCisJCQlCVUdfc2l6ZW9mKCk7CisJCWZvciAoOyBpOyBpIC89IDEwKSB7CisJCQlyZXMgPSBuIC8gaTsKKwkJCW4gPSBuICUgaTsKKwkJCWlmIChyZXMgfHwgb3V0IHx8IGkgPT0gMSkgeworCQkJCWlmICgtLWJ1ZmxlbiA9PSAwKQorCQkJCQlicmVhazsKKwkJCQlvdXQrKzsKKwkJCQkqYnVmKysgPSAnMCcgKyByZXM7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworLyogQ29udmVydCBzaWduZWQgaW50ZWdlciB0byBhc2NpaSwgbGlrZSB1dG9hX3RvX2J1ZigpICovCitjaGFyKiBGQVNUX0ZVTkMgaXRvYV90b19idWYoaW50IG4sIGNoYXIgKmJ1ZiwgdW5zaWduZWQgYnVmbGVuKQoreworCWlmICghYnVmbGVuKQorCQlyZXR1cm4gYnVmOworCWlmIChuIDwgMCkgeworCQluID0gLW47CisJCSpidWYrKyA9ICctJzsKKwkJYnVmbGVuLS07CisJfQorCXJldHVybiB1dG9hX3RvX2J1ZigodW5zaWduZWQpbiwgYnVmLCBidWZsZW4pOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgdXNlIGEgc3RhdGljIGJ1ZmZlciwgc28gY2FsbGluZyBlaXRoZXIgb25lIGEKKy8vIHNlY29uZCB0aW1lIHdpbGwgb3ZlcndyaXRlIHByZXZpb3VzIHJlc3VsdHMuCisvLworLy8gVGhlIGxhcmdlc3QgMzIgYml0IGludGVnZXIgaXMgLTIgYmlsbGlvbiBwbHVzIE5VTCwgb3IgMSsxMCsxPTEyIGJ5dGVzLgorLy8gSXQgc28gaGFwcGVucyB0aGF0IHNpemVvZihpbnQpICogMyBpcyBlbm91Z2ggZm9yIDMyKyBiaXQgaW50cy4KKy8vIChzaXplb2YoaW50KSAqIDMgKyAyIGlzIGNvcnJlY3QgZm9yIGFueSB3aWR0aCwgZXZlbiA4LWJpdCkKKworc3RhdGljIGNoYXIgbG9jYWxfYnVmW3NpemVvZihpbnQpICogM107CisKKy8qIENvbnZlcnQgdW5zaWduZWQgaW50ZWdlciB0byBhc2NpaSB1c2luZyBhIHN0YXRpYyBidWZmZXIgKHJldHVybmVkKS4gKi8KK2NoYXIqIEZBU1RfRlVOQyB1dG9hKHVuc2lnbmVkIG4pCit7CisJKih1dG9hX3RvX2J1ZihuLCBsb2NhbF9idWYsIHNpemVvZihsb2NhbF9idWYpIC0gMSkpID0gJ1wwJzsKKworCXJldHVybiBsb2NhbF9idWY7Cit9CisKKy8qIENvbnZlcnQgc2lnbmVkIGludGVnZXIgdG8gYXNjaWkgdXNpbmcgYSBzdGF0aWMgYnVmZmVyIChyZXR1cm5lZCkuICovCitjaGFyKiBGQVNUX0ZVTkMgaXRvYShpbnQgbikKK3sKKwkqKGl0b2FfdG9fYnVmKG4sIGxvY2FsX2J1Ziwgc2l6ZW9mKGxvY2FsX2J1ZikgLSAxKSkgPSAnXDAnOworCisJcmV0dXJuIGxvY2FsX2J1ZjsKK30KKworLyogRW1pdCBhIHN0cmluZyBvZiBoZXggcmVwcmVzZW50YXRpb24gb2YgYnl0ZXMgKi8KK2NoYXIqIEZBU1RfRlVOQyBiaW4yaGV4KGNoYXIgKnAsIGNvbnN0IGNoYXIgKmNwLCBpbnQgY291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICpjcCsrOworCQkvKiBwdXQgbG93ZXJjYXNlIGhleCBkaWdpdHMgKi8KKwkJKnArKyA9IDB4MjAgfCBiYl9oZXhkaWdpdHNfdXBjYXNlW2MgPj4gNF07CisJCSpwKysgPSAweDIwIHwgYmJfaGV4ZGlnaXRzX3VwY2FzZVtjICYgMHhmXTsKKwkJY291bnQtLTsKKwl9CisJcmV0dXJuIHA7Cit9CisKKy8qIENvbnZlcnQgIlt4XXhbOl1beF14WzpdW3hdeFs6XVt4XXgiIGhleCBzdHJpbmcgdG8gYmluYXJ5LCBubyBtb3JlIHRoYW4gQ09VTlQgYnl0ZXMgKi8KK2NoYXIqIEZBU1RfRlVOQyBoZXgyYmluKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3RyLCBpbnQgY291bnQpCit7CisJZXJybm8gPSBFSU5WQUw7CisJd2hpbGUgKCpzdHIgJiYgY291bnQpIHsKKwkJdWludDhfdCB2YWw7CisJCXVpbnQ4X3QgYyA9ICpzdHIrKzsKKwkJaWYgKGlzZGlnaXQoYykpCisJCQl2YWwgPSBjIC0gJzAnOworCQllbHNlIGlmICgoY3wweDIwKSA+PSAnYScgJiYgKGN8MHgyMCkgPD0gJ2YnKQorCQkJdmFsID0gKGN8MHgyMCkgLSAoJ2EnIC0gMTApOworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwkJdmFsIDw8PSA0OworCQljID0gKnN0cjsKKwkJaWYgKGlzZGlnaXQoYykpCisJCQl2YWwgfD0gYyAtICcwJzsKKwkJZWxzZSBpZiAoKGN8MHgyMCkgPj0gJ2EnICYmIChjfDB4MjApIDw9ICdmJykKKwkJCXZhbCB8PSAoY3wweDIwKSAtICgnYScgLSAxMCk7CisJCWVsc2UgaWYgKGMgPT0gJzonIHx8IGMgPT0gJ1wwJykKKwkJCXZhbCA+Pj0gNDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisKKwkJKmRzdCsrID0gdmFsOworCQlpZiAoYyAhPSAnXDAnKQorCQkJc3RyKys7CisJCWlmICgqc3RyID09ICc6JykKKwkJCXN0cisrOworCQljb3VudC0tOworCX0KKwllcnJubyA9ICgqc3RyID8gRVJBTkdFIDogMCk7CisJcmV0dXJuIGRzdDsKK30KKworLyogUmV0dXJuIGhvdyBsb25nIHRoZSBmaWxlIGF0IGZkIGlzLCBpZiB0aGVyZSdzIGFueSB3YXkgdG8gZGV0ZXJtaW5lIGl0LiAqLworI2lmZGVmIFVOVVNFRAorb2ZmX3QgRkFTVF9GVU5DIGZkbGVuZ3RoKGludCBmZCkKK3sKKwlvZmZfdCBib3R0b20gPSAwLCB0b3AgPSAwLCBwb3M7CisJbG9uZyBzaXplOworCisJLy8gSWYgdGhlIGlvY3RsIHdvcmtzIGZvciB0aGlzLCByZXR1cm4gaXQuCisKKwlpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkUsICZzaXplKSA+PSAwKSByZXR1cm4gc2l6ZSo1MTI7CisKKwkvLyBGSVhNRTogZXhwbGFpbiB3aHkgbHNlZWsoU0VFS19FTkQpIGlzIG5vdCB1c2VkIGhlcmUhCisKKwkvLyBJZiBub3QsIGRvIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGxhc3QgbG9jYXRpb24gd2UgY2FuIHJlYWQuICAoU29tZQorCS8vIGJsb2NrIGRldmljZXMgZG9uJ3QgZG8gQkxLR0VUU0laRSByaWdodC4pCisKKwlkbyB7CisJCWNoYXIgdGVtcDsKKworCQlwb3MgPSBib3R0b20gKyAodG9wIC0gYm90dG9tKSAvIDI7CisKKwkJLy8gSWYgd2UgY2FuIHJlYWQgZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbiwgaXQncyBiaWdnZXIuCisKKwkJaWYgKGxzZWVrKGZkLCBwb3MsIFNFRUtfU0VUKT49MCAmJiBzYWZlX3JlYWQoZmQsICZ0ZW1wLCAxKT09MSkgeworCQkJaWYgKGJvdHRvbSA9PSB0b3ApIGJvdHRvbSA9IHRvcCA9ICh0b3ArMSkgKiAyOworCQkJZWxzZSBib3R0b20gPSBwb3M7CisKKwkJLy8gSWYgd2UgY2FuJ3QsIGl0J3Mgc21hbGxlci4KKworCQl9IGVsc2UgeworCQkJaWYgKGJvdHRvbSA9PSB0b3ApIHsKKwkJCQlpZiAoIXRvcCkgcmV0dXJuIDA7CisJCQkJYm90dG9tID0gdG9wLzI7CisJCQl9CisJCQllbHNlIHRvcCA9IHBvczsKKwkJfQorCX0gd2hpbGUgKGJvdHRvbSArIDEgIT0gdG9wKTsKKworCXJldHVybiBwb3MgKyAxOworfQorI2VuZGlmCisKK2ludCBGQVNUX0ZVTkMgYmJfcHV0Y2hhcl9zdGRlcnIoY2hhciBjaCkKK3sKKwlyZXR1cm4gd3JpdGUoU1RERVJSX0ZJTEVOTywgJmNoLCAxKTsKK30KKworc3NpemVfdCBGQVNUX0ZVTkMgZnVsbF93cml0ZTFfc3RyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKworc3NpemVfdCBGQVNUX0ZVTkMgZnVsbF93cml0ZTJfc3RyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKworc3RhdGljIGludCB3aF9oZWxwZXIoaW50IHZhbHVlLCBpbnQgZGVmX3ZhbCwgY29uc3QgY2hhciAqZW52X25hbWUsIGludCAqZXJyKQoreworCWlmICh2YWx1ZSA9PSAwKSB7CisJCWNoYXIgKnMgPSBnZXRlbnYoZW52X25hbWUpOworCQlpZiAocykgeworCQkJdmFsdWUgPSBhdG9pKHMpOworCQkJLyogSWYgTElORVMvQ09MVU1OUyBhcmUgc2V0LCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMKKwkJCSAqIG5vIGVycm9yIGdldHRpbmcgdy9oLCB0aGlzIHByZXZlbnRzIHNvbWUgdWdseQorCQkJICogY3Vyc29yIHRyaWNrcyBieSBvdXIgY2FsbGVycyAqLworCQkJKmVyciA9IDA7CisJCX0KKwl9CisJaWYgKHZhbHVlIDw9IDEgfHwgdmFsdWUgPj0gMzAwMDApCisJCXZhbHVlID0gZGVmX3ZhbDsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qIEl0IGlzIHBlcmZlY3RseSBvayB0byBwYXNzIGluIGEgTlVMTCBmb3IgZWl0aGVyIHdpZHRoIG9yIGZvcgorICogaGVpZ2h0LCBpbiB3aGljaCBjYXNlIHRoYXQgdmFsdWUgd2lsbCBub3QgYmUgc2V0LiAgKi8KK2ludCBGQVNUX0ZVTkMgZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChpbnQgZmQsIHVuc2lnbmVkICp3aWR0aCwgdW5zaWduZWQgKmhlaWdodCkKK3sKKwlzdHJ1Y3Qgd2luc2l6ZSB3aW47CisJaW50IGVycjsKKworCXdpbi53c19yb3cgPSAwOworCXdpbi53c19jb2wgPSAwOworCS8qIEkndmUgc2VlbiBpb2N0bCByZXR1cm5pbmcgMCwgYnV0IHJvdy9jb2wgaXMgKHN0aWxsPykgMC4KKwkgKiBXZSB0cmVhdCB0aGF0IGFzIGFuIGVycm9yIHRvby4gICovCisJZXJyID0gaW9jdGwoZmQsIFRJT0NHV0lOU1osICZ3aW4pICE9IDAgfHwgd2luLndzX3JvdyA9PSAwOworCWlmIChoZWlnaHQpCisJCSpoZWlnaHQgPSB3aF9oZWxwZXIod2luLndzX3JvdywgMjQsICJMSU5FUyIsICZlcnIpOworCWlmICh3aWR0aCkKKwkJKndpZHRoID0gd2hfaGVscGVyKHdpbi53c19jb2wsIDgwLCAiQ09MVU1OUyIsICZlcnIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBGQVNUX0ZVTkMgdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coY29uc3Qgc3RydWN0IHRlcm1pb3MgKnRwKQoreworCXJldHVybiB0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBTk9XLCB0cCk7Cit9CisKK3BpZF90IEZBU1RfRlVOQyBzYWZlX3dhaXRwaWQocGlkX3QgcGlkLCBpbnQgKndzdGF0LCBpbnQgb3B0aW9ucykKK3sKKwlwaWRfdCByOworCisJZG8KKwkJciA9IHdhaXRwaWQocGlkLCB3c3RhdCwgb3B0aW9ucyk7CisJd2hpbGUgKChyID09IC0xKSAmJiAoZXJybm8gPT0gRUlOVFIpKTsKKwlyZXR1cm4gcjsKK30KKworcGlkX3QgRkFTVF9GVU5DIHdhaXRfYW55X25vaGFuZyhpbnQgKndzdGF0KQoreworCXJldHVybiBzYWZlX3dhaXRwaWQoLTEsIHdzdGF0LCBXTk9IQU5HKTsKK30KKworLy8gV2FpdCBmb3IgdGhlIHNwZWNpZmllZCBjaGlsZCBQSUQgdG8gZXhpdCwgcmV0dXJuaW5nIGNoaWxkJ3MgZXJyb3IgcmV0dXJuLgoraW50IEZBU1RfRlVOQyB3YWl0NHBpZChwaWRfdCBwaWQpCit7CisJaW50IHN0YXR1czsKKworCWlmIChwaWQgPD0gMCkgeworCQkvKmVycm5vID0gRUNISUxEOyAtLSB3cm9uZy4gKi8KKwkJLyogd2UgZXhwZWN0IGVycm5vIHRvIGJlIGFscmVhZHkgc2V0IGZyb20gZmFpbGVkIFt2XWZvcmsvZXhlYyAqLworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzYWZlX3dhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmIChXSUZFWElURUQoc3RhdHVzKSkKKwkJcmV0dXJuIFdFWElUU1RBVFVTKHN0YXR1cyk7CisJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCXJldHVybiBXVEVSTVNJRyhzdGF0dXMpICsgMHgxODA7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi94ZnVuY3NfcHJpbnRmLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94ZnVuY3NfcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlZTQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hmdW5jc19wcmludGYuYwpAQCAtMCwwICsxLDYyNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUm9iIExhbmRsZXkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogV2UgbmVlZCB0byBoYXZlIHNlcGFyYXRlIHhmdW5jcy5jIGFuZCB4ZnVuY3NfcHJpbnRmLmMgYmVjYXVzZQorICogd2l0aCBjdXJyZW50IGxpbmtlcnMsIGV2ZW4gd2l0aCBzZWN0aW9uIGdhcmJhZ2UgY29sbGVjdGlvbiwKKyAqIGlmICoubyBtb2R1bGUgcmVmZXJlbmNlcyBhbnkgb2YgWFhYcHJpbnRmIGZ1bmN0aW9ucywgeW91IHB1bGwgaW4KKyAqIGVudGlyZSBwcmludGYgbWFjaGluZXJ5LiBFdmVuIGlmIHlvdSBkbyBub3QgdXNlIHRoZSBmdW5jdGlvbgorICogd2hpY2ggdXNlcyBYWFhwcmludGYuCisgKgorICogeGZ1bmNzLmMgY29udGFpbnMgZnVuY3Rpb25zIChub3QgbmVjZXNzYXJpbHkgeGZ1bmNzKQorICogd2hpY2ggZG8gbm90IHB1bGwgaW4gcHJpbnRmLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgorICogeGZ1bmNfcHJpbnRmLmMgY29udGFpbnMgdGhvc2Ugd2hpY2ggZG8uCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKworLyogQWxsIHRoZSBmdW5jdGlvbnMgc3RhcnRpbmcgd2l0aCAieCIgY2FsbCBiYl9lcnJvcl9tc2dfYW5kX2RpZSgpIGlmIHRoZXkKKyAqIGZhaWwsIHNvIGNhbGxlcnMgbmV2ZXIgbmVlZCB0byBjaGVjayBmb3IgZXJyb3JzLiAgSWYgaXQgcmV0dXJuZWQsIGl0CisgKiBzdWNjZWVkZWQuICovCisKKyNpZm5kZWYgRE1BTExPQworLyogZG1hbGxvYyBwcm92aWRlcyB2YXJpYW50cyBvZiB0aGVzZSB0aGF0IGRvIGFib3J0KCkgb24gZmFpbHVyZS4KKyAqIFNpbmNlIGRtYWxsb2MncyBwcm90b3R5cGVzIG92ZXJ3cml0ZSB0aGUgaW1wbHMgaGVyZSBhcyB0aGV5IGFyZQorICogaW5jbHVkZWQgYWZ0ZXIgdGhlc2UgcHJvdG90eXBlcyBpbiBsaWJiYi5oLCBhbGwgaXMgd2VsbC4KKyAqLworLy8gV2FybiBpZiB3ZSBjYW4ndCBhbGxvY2F0ZSBzaXplIGJ5dGVzIG9mIG1lbW9yeS4KK3ZvaWQqIEZBU1RfRlVOQyBtYWxsb2Nfb3Jfd2FybihzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpwdHIgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKHB0ciA9PSBOVUxMICYmIHNpemUgIT0gMCkKKwkJYmJfZXJyb3JfbXNnKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwlyZXR1cm4gcHRyOworfQorCisvLyBEaWUgaWYgd2UgY2FuJ3QgYWxsb2NhdGUgc2l6ZSBieXRlcyBvZiBtZW1vcnkuCit2b2lkKiBGQVNUX0ZVTkMgeG1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpwdHIgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKHB0ciA9PSBOVUxMICYmIHNpemUgIT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCXJldHVybiBwdHI7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCByZXNpemUgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5LiAgKFRoaXMgcmV0dXJucyBhIHBvaW50ZXIKKy8vIHRvIHRoZSBuZXcgbWVtb3J5LCB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgb2xkIG1lbW9yeS4KKy8vIEl0J2xsIGNvcHkgdGhlIGNvbnRlbnRzIHRvIGEgbmV3IGNodW5rIGFuZCBmcmVlIHRoZSBvbGQgb25lIGlmIG5lY2Vzc2FyeS4pCit2b2lkKiBGQVNUX0ZVTkMgeHJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlwdHIgPSByZWFsbG9jKHB0ciwgc2l6ZSk7CisJaWYgKHB0ciA9PSBOVUxMICYmIHNpemUgIT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCXJldHVybiBwdHI7Cit9CisjZW5kaWYgLyogRE1BTExPQyAqLworCisvLyBEaWUgaWYgd2UgY2FuJ3QgYWxsb2NhdGUgYW5kIHplcm8gc2l6ZSBieXRlcyBvZiBtZW1vcnkuCit2b2lkKiBGQVNUX0ZVTkMgeHphbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpwdHIgPSB4bWFsbG9jKHNpemUpOworCW1lbXNldChwdHIsIDAsIHNpemUpOworCXJldHVybiBwdHI7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCBjb3B5IGEgc3RyaW5nIHRvIGZyZXNobHkgYWxsb2NhdGVkIG1lbW9yeS4KK2NoYXIqIEZBU1RfRlVOQyB4c3RyZHVwKGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAqdDsKKworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdCA9IHN0cmR1cChzKTsKKworCWlmICh0ID09IE5VTEwpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKworCXJldHVybiB0OworfQorCisvLyBEaWUgaWYgd2UgY2FuJ3QgYWxsb2NhdGUgbisxIGJ5dGVzIChzcGFjZSBmb3IgdGhlIG51bGwgdGVybWluYXRvcikgYW5kIGNvcHkKKy8vIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkIHRvIGxlbmd0aCBuKSBzdHJpbmcgaW50byBpdC4KK2NoYXIqIEZBU1RfRlVOQyB4c3RybmR1cChjb25zdCBjaGFyICpzLCBpbnQgbikKK3sKKwlpbnQgbTsKKwljaGFyICp0OworCisJaWYgKEVOQUJMRV9ERUJVRyAmJiBzID09IE5VTEwpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ4c3RybmR1cCBidWciKTsKKworCS8qIFdlIGNhbiBqdXN0IHhtYWxsb2MobisxKSBhbmQgc3RybmNweSBpbnRvIGl0LCAqLworCS8qIGJ1dCB0aGluayBhYm91dCB4c3RybmR1cCgiYWJjIiwgMTAwMDApIHdhc3RhZ2UhICovCisJbSA9IG47CisJdCA9IChjaGFyKikgczsKKwl3aGlsZSAobSkgeworCQlpZiAoISp0KSBicmVhazsKKwkJbS0tOworCQl0Kys7CisJfQorCW4gLT0gbTsKKwl0ID0geG1hbGxvYyhuICsgMSk7CisJdFtuXSA9ICdcMCc7CisKKwlyZXR1cm4gbWVtY3B5KHQsIHMsIG4pOworfQorCisvLyBEaWUgaWYgd2UgY2FuJ3Qgb3BlbiBhIGZpbGUgYW5kIHJldHVybiBhIEZJTEUqIHRvIGl0LgorLy8gTm90aWNlIHdlIGhhdmVuJ3QgZ290IHhmcmVhZCgpLCBUaGlzIGlzIGZvciB1c2Ugd2l0aCBmc2NhbmYoKSBhbmQgZnJpZW5kcy4KK0ZJTEUqIEZBU1RfRlVOQyB4Zm9wZW4oY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkKK3sKKwlGSUxFICpmcCA9IGZvcGVuKHBhdGgsIG1vZGUpOworCWlmIChmcCA9PSBOVUxMKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG9wZW4gJyVzJyIsIHBhdGgpOworCXJldHVybiBmcDsKK30KKworLy8gRGllIGlmIHdlIGNhbid0IG9wZW4gYSBmaWxlIGFuZCByZXR1cm4gYSBmZC4KK2ludCBGQVNUX0ZVTkMgeG9wZW4zKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBvcGVuKHBhdGhuYW1lLCBmbGFncywgbW9kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCBwYXRobmFtZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCBvcGVuIGEgZmlsZSBhbmQgcmV0dXJuIGEgZmQuCitpbnQgRkFTVF9GVU5DIHhvcGVuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIHhvcGVuMyhwYXRobmFtZSwgZmxhZ3MsIDA2NjYpOworfQorCisvKiBEaWUgaWYgd2UgY2FuJ3Qgb3BlbiBhbiBleGlzdGluZyBmaWxlIHJlYWRvbmx5IHdpdGggT19OT05CTE9DSworICogYW5kIHJldHVybiB0aGUgZmQuCisgKiBOb3RlIHRoYXQgZm9yIGlvY3RsIE9fUkRPTkxZIGlzIHN1ZmZpY2llbnQuCisgKi8KK2ludCBGQVNUX0ZVTkMgeG9wZW5fbm9uYmxvY2tpbmcoY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJcmV0dXJuIHhvcGVuKHBhdGhuYW1lLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOworfQorCisvLyBXYXJuIGlmIHdlIGNhbid0IG9wZW4gYSBmaWxlIGFuZCByZXR1cm4gYSBmZC4KK2ludCBGQVNUX0ZVTkMgb3BlbjNfb3Jfd2Fybihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gb3BlbihwYXRobmFtZSwgZmxhZ3MsIG1vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IG9wZW4gJyVzJyIsIHBhdGhuYW1lKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLy8gV2FybiBpZiB3ZSBjYW4ndCBvcGVuIGEgZmlsZSBhbmQgcmV0dXJuIGEgZmQuCitpbnQgRkFTVF9GVU5DIG9wZW5fb3Jfd2Fybihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzKQoreworCXJldHVybiBvcGVuM19vcl93YXJuKHBhdGhuYW1lLCBmbGFncywgMDY2Nik7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHh1bmxpbmsoY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJaWYgKHVubGluayhwYXRobmFtZSkpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVtb3ZlIGZpbGUgJyVzJyIsIHBhdGhuYW1lKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeHJlbmFtZShjb25zdCBjaGFyICpvbGRwYXRoLCBjb25zdCBjaGFyICpuZXdwYXRoKQoreworCWlmIChyZW5hbWUob2xkcGF0aCwgbmV3cGF0aCkpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgbW92ZSAnJXMnIHRvICclcyciLCBvbGRwYXRoLCBuZXdwYXRoKTsKK30KKworaW50IEZBU1RfRlVOQyByZW5hbWVfb3Jfd2Fybihjb25zdCBjaGFyICpvbGRwYXRoLCBjb25zdCBjaGFyICpuZXdwYXRoKQoreworCWludCBuID0gcmVuYW1lKG9sZHBhdGgsIG5ld3BhdGgpOworCWlmIChuKQorCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBtb3ZlICclcycgdG8gJyVzJyIsIG9sZHBhdGgsIG5ld3BhdGgpOworCXJldHVybiBuOworfQorCit2b2lkIEZBU1RfRlVOQyB4cGlwZShpbnQgZmlsZWRlc1syXSkKK3sKKwlpZiAocGlwZShmaWxlZGVzKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjcmVhdGUgcGlwZSIpOworfQorCit2b2lkIEZBU1RfRlVOQyB4ZHVwMihpbnQgZnJvbSwgaW50IHRvKQoreworCWlmIChkdXAyKGZyb20sIHRvKSAhPSB0bykKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9yIik7Cit9CisKKy8vICJSZW51bWJlciIgb3BlbmVkIGZkCit2b2lkIEZBU1RfRlVOQyB4bW92ZV9mZChpbnQgZnJvbSwgaW50IHRvKQoreworCWlmIChmcm9tID09IHRvKQorCQlyZXR1cm47CisJeGR1cDIoZnJvbSwgdG8pOworCWNsb3NlKGZyb20pOworfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IHdyaXRlIHRoZSBlbnRpcmUgYnVmZmVyLgordm9pZCBGQVNUX0ZVTkMgeHdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCXNzaXplX3Qgc2l6ZSA9IGZ1bGxfd3JpdGUoZmQsIGJ1ZiwgY291bnQpOworCQlpZiAoKHNpemVfdClzaXplICE9IGNvdW50KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHdyaXRlIik7CisJfQorfQordm9pZCBGQVNUX0ZVTkMgeHdyaXRlX3N0cihpbnQgZmQsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl4d3JpdGUoZmQsIHN0ciwgc3RybGVuKHN0cikpOworfQorCit2b2lkIEZBU1RfRlVOQyB4Y2xvc2UoaW50IGZkKQoreworCWlmIChjbG9zZShmZCkpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2xvc2UgZmFpbGVkIik7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgbHNlZWsgdG8gdGhlIHJpZ2h0IHNwb3QuCitvZmZfdCBGQVNUX0ZVTkMgeGxzZWVrKGludCBmZCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCW9mZl90IG9mZiA9IGxzZWVrKGZkLCBvZmZzZXQsIHdoZW5jZSk7CisJaWYgKG9mZiA9PSAob2ZmX3QpLTEpIHsKKwkJaWYgKHdoZW5jZSA9PSBTRUVLX1NFVCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibHNlZWsoJSJPRkZfRk1UInUpIiwgb2Zmc2V0KTsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJsc2VlayIpOworCX0KKwlyZXR1cm4gb2ZmOworfQorCitpbnQgRkFTVF9GVU5DIHhta3N0ZW1wKGNoYXIgKnRlbXBsYXRlKQoreworCWludCBmZCA9IG1rc3RlbXAodGVtcGxhdGUpOworCWlmIChmZCA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY3JlYXRlIHRlbXAgZmlsZSAnJXMnIiwgdGVtcGxhdGUpOworCXJldHVybiBmZDsKK30KKworLy8gRGllIHdpdGggc3VwcGxpZWQgZmlsZW5hbWUgaWYgdGhpcyBGSUxFKiBoYXMgZmVycm9yIHNldC4KK3ZvaWQgRkFTVF9GVU5DIGRpZV9pZl9mZXJyb3IoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZuKQoreworCWlmIChmZXJyb3IoZnApKSB7CisJCS8qIGZlcnJvciBkb2Vzbid0IHNldCB1c2VmdWwgZXJybm8gKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBJL08gZXJyb3IiLCBmbik7CisJfQorfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHN0ZG91dCBoYXMgZmVycm9yIHNldC4KK3ZvaWQgRkFTVF9GVU5DIGRpZV9pZl9mZXJyb3Jfc3Rkb3V0KHZvaWQpCit7CisJZGllX2lmX2ZlcnJvcihzdGRvdXQsIGJiX21zZ19zdGFuZGFyZF9vdXRwdXQpOworfQorCitpbnQgRkFTVF9GVU5DIGZmbHVzaF9hbGwodm9pZCkKK3sKKwlyZXR1cm4gZmZsdXNoKE5VTEwpOworfQorCisKK2ludCBGQVNUX0ZVTkMgYmJfcHV0Y2hhcihpbnQgY2gpCit7CisJcmV0dXJuIHB1dGNoYXIoY2gpOworfQorCisvKiBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IGNvcHkgYW4gZW50aXJlIEZJTEUqIHRvIHN0ZG91dCwKKyAqIHRoZW4gY2xvc2UgdGhhdCBmaWxlLiAqLwordm9pZCBGQVNUX0ZVTkMgeHByaW50X2FuZF9jbG9zZV9maWxlKEZJTEUgKmZpbGUpCit7CisJZmZsdXNoX2FsbCgpOworCS8vIGNvcHlmZCBvdXRwdXRzIGVycm9yIG1lc3NhZ2VzIGZvciB1cy4KKwlpZiAoYmJfY29weWZkX2VvZihmaWxlbm8oZmlsZSksIFNURE9VVF9GSUxFTk8pID09IC0xKQorCQl4ZnVuY19kaWUoKTsKKworCWZjbG9zZShmaWxlKTsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBtYWxsb2MoKSBlbm91Z2ggc3BhY2UgYW5kIGRvIGFuCisvLyBzcHJpbnRmKCkgaW50byB0aGF0IHNwYWNlLgorY2hhciogRkFTVF9GVU5DIHhhc3ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IHA7CisJaW50IHI7CisJY2hhciAqc3RyaW5nX3B0cjsKKworCXZhX3N0YXJ0KHAsIGZvcm1hdCk7CisJciA9IHZhc3ByaW50Zigmc3RyaW5nX3B0ciwgZm9ybWF0LCBwKTsKKwl2YV9lbmQocCk7CisKKwlpZiAociA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwlyZXR1cm4gc3RyaW5nX3B0cjsKK30KKwordm9pZCBGQVNUX0ZVTkMgeHNldGVudihjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmIChzZXRlbnYoa2V5LCB2YWx1ZSwgMSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKK30KKworLyogSGFuZGxlcyAiVkFSPVZBTCIgc3RyaW5ncywgZXZlbiB0aG9zZSB3aGljaCBhcmUgcGFydCBvZiBlbnZpcm9uCisgKiBfcmlnaHQgbm93XworICovCit2b2lkIEZBU1RfRlVOQyBiYl91bnNldGVudihjb25zdCBjaGFyICp2YXIpCit7CisJY2hhciAqdHAgPSBzdHJjaHIodmFyLCAnPScpOworCisJaWYgKCF0cCkgeworCQl1bnNldGVudih2YXIpOworCQlyZXR1cm47CisJfQorCisJLyogSW4gY2FzZSB2YXIgd2FzIHB1dGVudidlZCwgd2UgY2FuJ3QgcmVwbGFjZSAnPScKKwkgKiB3aXRoIE5VTCBhbmQgdW5zZXRlbnYodmFyKSAtIGl0IHdvbid0IHdvcmssCisJICogZW52IGlzIG1vZGlmaWVkIGJ5IHRoZSByZXBsYWNlbWVudCwgdW5zZXRlbnYKKwkgKiBzZWVzICJWQVIiIGluc3RlYWQgb2YgIlZBUj1WQUwiIGFuZCBkb2VzIG5vdCByZW1vdmUgaXQhCisJICogaG9ycm9yIDooICovCisJdHAgPSB4c3RybmR1cCh2YXIsIHRwIC0gdmFyKTsKKwl1bnNldGVudih0cCk7CisJZnJlZSh0cCk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX3Vuc2V0ZW52X2FuZF9mcmVlKGNoYXIgKnZhcikKK3sKKwliYl91bnNldGVudih2YXIpOworCWZyZWUodmFyKTsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBzZXQgZ2lkLiAgKEJlY2F1c2UgcmVzb3VyY2UgbGltaXRzIG1heQorLy8gbGltaXQgdGhpcyB1c2VyIHRvIGEgZ2l2ZW4gbnVtYmVyIG9mIHByb2Nlc3NlcywgYW5kIGlmIHRoYXQgZmlsbHMgdXAgdGhlCisvLyBzZXRnaWQoKSB3aWxsIGZhaWwgYW5kIHdlJ2xsIF9zdGlsbF9iZV9yb290Xywgd2hpY2ggaXMgYmFkLikKK3ZvaWQgRkFTVF9GVU5DIHhzZXRnaWQoZ2lkX3QgZ2lkKQoreworCWlmIChzZXRnaWQoZ2lkKSkgYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRnaWQiKTsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBzZXQgdWlkLiAgKFNlZSB4c2V0Z2lkKCkgZm9yIHdoeS4pCit2b2lkIEZBU1RfRlVOQyB4c2V0dWlkKHVpZF90IHVpZCkKK3sKKwlpZiAoc2V0dWlkKHVpZCkpIGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0dWlkIik7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCBjaGRpciB0byBhIG5ldyBwYXRoLgordm9pZCBGQVNUX0ZVTkMgeGNoZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKGNoZGlyKHBhdGgpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNoZGlyKCVzKSIsIHBhdGgpOworfQorCit2b2lkIEZBU1RfRlVOQyB4Y2hyb290KGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKGNocm9vdChwYXRoKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjaGFuZ2Ugcm9vdCBkaXJlY3RvcnkgdG8gJXMiLCBwYXRoKTsKK30KKworLy8gUHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgb3BlbmRpcigpIGZhaWxzLCBidXQgZG9uJ3QgZGllLgorRElSKiBGQVNUX0ZVTkMgd2Fybl9vcGVuZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkcDsKKworCWRwID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoIWRwKQorCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBvcGVuICclcyciLCBwYXRoKTsKKwlyZXR1cm4gZHA7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgb3BlbmRpcigpIGZhaWxzLgorRElSKiBGQVNUX0ZVTkMgeG9wZW5kaXIoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlESVIgKmRwOworCisJZHAgPSBvcGVuZGlyKHBhdGgpOworCWlmICghZHApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAnJXMnIiwgcGF0aCk7CisJcmV0dXJuIGRwOworfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IG9wZW4gYSBuZXcgc29ja2V0LgoraW50IEZBU1RfRlVOQyB4c29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCit7CisJaW50IHIgPSBzb2NrZXQoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisKKwlpZiAociA8IDApIHsKKwkJLyogSGlqYWNrIHZhZ3VlbHkgcmVsYXRlZCBjb25maWcgb3B0aW9uICovCisjaWYgRU5BQkxFX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlMKKwkJY29uc3QgY2hhciAqcyA9ICJJTkVUIjsKKyMgaWZkZWYgQUZfUEFDS0VUCisJCWlmIChkb21haW4gPT0gQUZfUEFDS0VUKSBzID0gIlBBQ0tFVCI7CisjIGVuZGlmCisjIGlmZGVmIEFGX05FVExJTksKKwkJaWYgKGRvbWFpbiA9PSBBRl9ORVRMSU5LKSBzID0gIk5FVExJTksiOworIyBlbmRpZgorSUZfRkVBVFVSRV9JUFY2KGlmIChkb21haW4gPT0gQUZfSU5FVDYpIHMgPSAiSU5FVDYiOykKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzb2NrZXQoQUZfJXMsJWQsJWQpIiwgcywgdHlwZSwgcHJvdG9jb2wpOworI2Vsc2UKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzb2NrZXQiKTsKKyNlbmRpZgorCX0KKworCXJldHVybiByOworfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IGJpbmQgYSBzb2NrZXQgdG8gYW4gYWRkcmVzcy4KK3ZvaWQgRkFTVF9GVU5DIHhiaW5kKGludCBzb2NrZmQsIHN0cnVjdCBzb2NrYWRkciAqbXlfYWRkciwgc29ja2xlbl90IGFkZHJsZW4pCit7CisJaWYgKGJpbmQoc29ja2ZkLCBteV9hZGRyLCBhZGRybGVuKSkgYmJfcGVycm9yX21zZ19hbmRfZGllKCJiaW5kIik7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbiBhIHNvY2tldC4KK3ZvaWQgRkFTVF9GVU5DIHhsaXN0ZW4oaW50IHMsIGludCBiYWNrbG9nKQoreworCWlmIChsaXN0ZW4ocywgYmFja2xvZykpIGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibGlzdGVuIik7Cit9CisKKy8qIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgc2VuZHRvIGZhaWxlZC4KKyAqIFJldHVybiBieXRlcyBzZW50IG90aGVyd2lzZSAgKi8KK3NzaXplX3QgRkFTVF9GVU5DIHhzZW5kdG8oaW50IHMsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3Qgc3RydWN0IHNvY2thZGRyICp0bywKKwkJCQlzb2NrbGVuX3QgdG9sZW4pCit7CisJc3NpemVfdCByZXQgPSBzZW5kdG8ocywgYnVmLCBsZW4sIDAsIHRvLCB0b2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJY2xvc2Uocyk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VuZHRvIik7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8vIHhzdGF0KCkgLSBhIHN0YXQoKSB3aGljaCBkaWVzIG9uIGZhaWx1cmUgd2l0aCBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2UKK3ZvaWQgRkFTVF9GVU5DIHhzdGF0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzdGF0ICpzdGF0X2J1ZikKK3sKKwlpZiAoc3RhdChuYW1lLCBzdGF0X2J1ZikpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc3RhdCAnJXMnIiwgbmFtZSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHhmc3RhdChpbnQgZmQsIHN0cnVjdCBzdGF0ICpzdGF0X2J1ZiwgY29uc3QgY2hhciAqZXJybXNnKQoreworCS8qIGVycm1zZyBpcyB1c3VhbGx5IGEgZmlsZSBuYW1lLCBidXQgbm90IGFsd2F5czoKKwkgKiB4ZnN0YXQgbWF5IGJlIGNhbGxlZCBpbiBhIHNwb3Qgd2hlcmUgZmlsZSBuYW1lIGlzIG5vIGxvbmdlcgorCSAqIGF2YWlsYWJsZSwgYW5kIGNhbGxlciBtYXkgZ2l2ZSBlLmcuICJjYW4ndCBzdGF0IGlucHV0IGZpbGUiIHN0cmluZy4KKwkgKi8KKwlpZiAoZnN0YXQoZmQsIHN0YXRfYnVmKSkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShlcnJtc2cpOworfQorCisvLyBzZWxpbnV4X29yX2RpZSgpIC0gZGllIGlmIFNFTGludXggaXMgZGlzYWJsZWQuCit2b2lkIEZBU1RfRlVOQyBzZWxpbnV4X29yX2RpZSh2b2lkKQoreworI2lmIEVOQUJMRV9TRUxJTlVYCisJaW50IHJjID0gaXNfc2VsaW51eF9lbmFibGVkKCk7CisJaWYgKHJjID09IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlNFTGludXggaXMgZGlzYWJsZWQiKTsKKwl9IGVsc2UgaWYgKHJjIDwgMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaXNfc2VsaW51eF9lbmFibGVkKCkgZmFpbGVkIik7CisJfQorI2Vsc2UKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiU0VMaW51eCBzdXBwb3J0IGlzIGRpc2FibGVkIik7CisjZW5kaWYKK30KKworaW50IEZBU1RfRlVOQyBpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3AsIGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJaW50IHJldDsKKwl2YV9saXN0IHA7CisKKwlyZXQgPSBpb2N0bChmZCwgcmVxdWVzdCwgYXJncCk7CisJaWYgKHJldCA8IDApIHsKKwkJdmFfc3RhcnQocCwgZm10KTsKKwkJYmJfdmVycm9yX21zZyhmbXQsIHAsIHN0cmVycm9yKGVycm5vKSk7CisJCS8qIHhmdW5jX2RpZSBjYW4gYWN0dWFsbHkgbG9uZ2ptcCwgc28gYmUgbmljZSAqLworCQl2YV9lbmQocCk7CisJCXhmdW5jX2RpZSgpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgRkFTVF9GVU5DIGlvY3RsX29yX3BlcnJvcihpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3AsIGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJdmFfbGlzdCBwOworCWludCByZXQgPSBpb2N0bChmZCwgcmVxdWVzdCwgYXJncCk7CisKKwlpZiAocmV0IDwgMCkgeworCQl2YV9zdGFydChwLCBmbXQpOworCQliYl92ZXJyb3JfbXNnKGZtdCwgcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJdmFfZW5kKHApOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjaWYgRU5BQkxFX0lPQ1RMX0hFWDJTVFJfRVJST1IKK2ludCBGQVNUX0ZVTkMgYmJfaW9jdGxfb3Jfd2FybihpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3AsIGNvbnN0IGNoYXIgKmlvY3RsX25hbWUpCit7CisJaW50IHJldDsKKworCXJldCA9IGlvY3RsKGZkLCByZXF1ZXN0LCBhcmdwKTsKKwlpZiAocmV0IDwgMCkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coaW9jdGxfbmFtZSk7CisJcmV0dXJuIHJldDsKK30KK2ludCBGQVNUX0ZVTkMgYmJfeGlvY3RsKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqaW9jdGxfbmFtZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW9jdGwoZmQsIHJlcXVlc3QsIGFyZ3ApOworCWlmIChyZXQgPCAwKQorCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGlvY3RsX25hbWUpOworCXJldHVybiByZXQ7Cit9CisjZWxzZQoraW50IEZBU1RfRlVOQyBiYl9pb2N0bF9vcl93YXJuKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW9jdGwoZmQsIHJlcXVlc3QsIGFyZ3ApOworCWlmIChyZXQgPCAwKQorCQliYl9wZXJyb3JfbXNnKCJpb2N0bCAlI3ggZmFpbGVkIiwgcmVxdWVzdCk7CisJcmV0dXJuIHJldDsKK30KK2ludCBGQVNUX0ZVTkMgYmJfeGlvY3RsKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW9jdGwoZmQsIHJlcXVlc3QsIGFyZ3ApOworCWlmIChyZXQgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImlvY3RsICUjeCBmYWlsZWQiLCByZXF1ZXN0KTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3R0eW5hbWUoaW50IGZkKQoreworCWNoYXIgKmJ1ZiA9IHh6YWxsb2MoMTI4KTsKKwlpbnQgciA9IHR0eW5hbWVfcihmZCwgYnVmLCAxMjcpOworCWlmIChyKSB7CisJCWZyZWUoYnVmKTsKKwkJYnVmID0gTlVMTDsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCBGQVNUX0ZVTkMgZ2VuZXJhdGVfdXVpZCh1aW50OF90ICpidWYpCit7CisJLyogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDEyMi50eHQKKwkgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisJICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKwkgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2xvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisJICogfCAgICAgICB0aW1lX21pZCAgICAgICAgICAgICAgICB8ICAgICAgICAgdGltZV9oaV9hbmRfdmVyc2lvbiAgIHwKKwkgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCSAqIHxjbGtfc2VxX2FuZF92YXJpYW50ICAgICAgICAgICAgfCAgICAgICAgIG5vZGUgKDAtMSkgICAgICAgICAgICB8CisJICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKwkgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgKDItNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisJICogSU9XLCB1dWlkIGhhcyB0aGlzIGxheW91dDoKKwkgKiB1aW50MzJfdCB0aW1lX2xvdyAoYmlnIGVuZGlhbikKKwkgKiB1aW50MTZfdCB0aW1lX21pZCAoYmlnIGVuZGlhbikKKwkgKiB1aW50MTZfdCB0aW1lX2hpX2FuZF92ZXJzaW9uIChiaWcgZW5kaWFuKQorCSAqICB2ZXJzaW9uIGlzIGEgNC1iaXQgZmllbGQ6CisJICogICAxIFRpbWUtYmFzZWQKKwkgKiAgIDIgRENFIFNlY3VyaXR5LCB3aXRoIGVtYmVkZGVkIFBPU0lYIFVJRHMKKwkgKiAgIDMgTmFtZS1iYXNlZCAoTUQ1KQorCSAqICAgNCBSYW5kb21seSBnZW5lcmF0ZWQKKwkgKiAgIDUgTmFtZS1iYXNlZCAoU0hBLTEpCisJICogdWludDE2X3QgY2xrX3NlcV9hbmRfdmFyaWFudCAoYmlnIGVuZGlhbikKKwkgKiAgdmFyaWFudCBpcyBhIDMtYml0IGZpZWxkOgorCSAqICAgMHh4IFJlc2VydmVkLCBOQ1MgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCSAqICAgMTB4IFRoZSB2YXJpYW50IHNwZWNpZmllZCBpbiByZmM0MTIyCisJICogICAxMTAgUmVzZXJ2ZWQsIE1pY3Jvc29mdCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisJICogICAxMTEgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBkZWZpbml0aW9uCisJICogdWludDhfdCBub2RlWzZdCisJICoKKwkgKiBGb3IgdmVyc2lvbiA0LCB0aGVzZSBiaXRzIGFyZSBzZXQvY2xlYXJlZDoKKwkgKiB0aW1lX2hpX2FuZF92ZXJzaW9uICYgMHgwZmZmIHwgMHg0MDAwCisJICogY2xrX3NlcV9hbmRfdmFyaWFudCAmIDB4M2ZmZiB8IDB4ODAwMAorCSAqLworCXBpZF90IHBpZDsKKwlpbnQgaTsKKworCWkgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisJaWYgKGkgPj0gMCkgeworCQlyZWFkKGksIGJ1ZiwgMTYpOworCQljbG9zZShpKTsKKwl9CisJLyogUGFyYW5vaWEuIC9kZXYvdXJhbmRvbSBtYXkgYmUgbWlzc2luZy4KKwkgKiByYW5kKCkgaXMgZ3VhcmFudGVlZCB0byBnZW5lcmF0ZSBhdCBsZWFzdCBbMCwgMl4xNSkgcmFuZ2UsCisJICogYnV0IGxvd2VzdCBiaXRzIGluIHNvbWUgbGliYyBhcmUgbm90IHNvICJyYW5kb20iLiAgKi8KKwlzcmFuZChtb25vdG9uaWNfdXMoKSk7IC8qIHB1bGxzIGluIHByaW50ZiAqLworCXBpZCA9IGdldHBpZCgpOworCXdoaWxlICgxKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJYnVmW2ldIF49IHJhbmQoKSA+PiA1OworCQlpZiAocGlkID09IDApCisJCQlicmVhazsKKwkJc3JhbmQocGlkKTsKKwkJcGlkID0gMDsKKwl9CisKKwkvKiB2ZXJzaW9uID0gNCAqLworCWJ1Zls0ICsgMiAgICBdID0gKGJ1Zls0ICsgMiAgICBdICYgMHgwZikgfCAweDQwOworCS8qIHZhcmlhbnQgPSAxMHggKi8KKwlidWZbNCArIDIgKyAyXSA9IChidWZbNCArIDIgKyAyXSAmIDB4M2YpIHwgMHg4MDsKK30KKworI2lmIEJCX01NVQorcGlkX3QgRkFTVF9GVU5DIHhmb3JrKHZvaWQpCit7CisJcGlkX3QgcGlkOworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkgLyogd3RmPyAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInZmb3JrIisxKTsKKwlyZXR1cm4gcGlkOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJiYi94Z2V0Y3dkLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94Z2V0Y3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3MjBkMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hnZXRjd2QuYwpAQCAtMCwwICsxLDQzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB4Z2V0Y3dkLmMgLS0gcmV0dXJuIGN1cnJlbnQgZGlyZWN0b3J5IHdpdGggdW5saW1pdGVkIGxlbmd0aAorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogV3JpdHRlbiBieSBEYXZpZCBNYWNLZW56aWUgPGRqbUBnbnUuYWkubWl0LmVkdT4uCisgKgorICogU3BlY2lhbCBmdW5jdGlvbiBmb3IgYnVzeWJveCB3cml0dGVuIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBuZXdseSBhbGxvY2F0ZWQsIGFyYml0cmFyaWx5IGxvbmcuCisgICBSZXR1cm4gTlVMTCBhbmQgc2V0IGVycm5vIG9uIGVycm9yLgorICAgSWYgYXJndW1lbnQgaXMgbm90IE5VTEwgKHByZXZpb3VzIHVzYWdlIGFsbG9jYXRlIG1lbW9yeSksIGNhbGwgZnJlZSgpCisqLworCitjaGFyKiBGQVNUX0ZVTkMKK3hyZWFsbG9jX2dldGN3ZF9vcl93YXJuKGNoYXIgKmN3ZCkKK3sKKyNkZWZpbmUgUEFUSF9JTkNSIDY0CisKKwljaGFyICpyZXQ7CisJdW5zaWduZWQgcGF0aF9tYXg7CisKKwlwYXRoX21heCA9IDEyODsgLyogMTI4ICsgNjQgc2hvdWxkIGJlIGVub3VnaCBmb3IgOTklIG9mIGNhc2VzICovCisKKwl3aGlsZSAoMSkgeworCQlwYXRoX21heCArPSBQQVRIX0lOQ1I7CisJCWN3ZCA9IHhyZWFsbG9jKGN3ZCwgcGF0aF9tYXgpOworCQlyZXQgPSBnZXRjd2QoY3dkLCBwYXRoX21heCk7CisJCWlmIChyZXQgPT0gTlVMTCkgeworCQkJaWYgKGVycm5vID09IEVSQU5HRSkKKwkJCQljb250aW51ZTsKKwkJCWZyZWUoY3dkKTsKKwkJCWJiX3BlcnJvcl9tc2coImdldGN3ZCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJY3dkID0geHJlYWxsb2MoY3dkLCBzdHJsZW4oY3dkKSArIDEpOworCQlyZXR1cm4gY3dkOworCX0KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hnZXRob3N0YnluYW1lLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94Z2V0aG9zdGJ5bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDAzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94Z2V0aG9zdGJ5bmFtZS5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgeGdldGhvc3RieW5hbWUgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1hdHQgS3JhYWkgPGtyYWFpQGFsdW1uaS5jYXJuZWdpZW1lbGxvbi5lZHU+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdHJ1Y3QgaG9zdGVudCogRkFTVF9GVU5DIHhnZXRob3N0YnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGhvc3RlbnQgKnJldHZhbCA9IGdldGhvc3RieW5hbWUobmFtZSk7CisJaWYgKCFyZXR2YWwpCisJCWJiX2hlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBuYW1lKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGliYmIveHJlYWRsaW5rLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94cmVhZGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk1YWYyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGliYmIveHJlYWRsaW5rLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHhyZWFkbGluay5jIC0gc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiByZWFkbGluay4KKyAqIFJldHVybnMgYSBOVUxMIG9uIGZhaWx1cmUuLi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorICogTk9URTogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbWFsbG9jZWQgY2hhciogdGhhdCB5b3Ugd2lsbCBoYXZlIHRvIGZyZWUKKyAqIHlvdXJzZWxmLgorICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19yZWFkbGluayhjb25zdCBjaGFyICpwYXRoKQoreworCWVudW0geyBHUk9XQlkgPSA4MCB9OyAvKiBob3cgbGFyZ2Ugd2Ugd2lsbCBncm93IHN0cmluZ3MgYnkgKi8KKworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJaW50IGJ1ZnNpemUgPSAwLCByZWFkc2l6ZSA9IDA7CisKKwlkbyB7CisJCWJ1ZnNpemUgKz0gR1JPV0JZOworCQlidWYgPSB4cmVhbGxvYyhidWYsIGJ1ZnNpemUpOworCQlyZWFkc2l6ZSA9IHJlYWRsaW5rKHBhdGgsIGJ1ZiwgYnVmc2l6ZSk7CisJCWlmIChyZWFkc2l6ZSA9PSAtMSkgeworCQkJZnJlZShidWYpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IHdoaWxlIChidWZzaXplIDwgcmVhZHNpemUgKyAxKTsKKworCWJ1ZltyZWFkc2l6ZV0gPSAnXDAnOworCisJcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBub3QgdGhlIHNhbWUgYXMgcmVhbHBhdGgoKSwgd2hpY2gKKyAqIGNhbm9uaWNhbGl6ZXMgdGhlIGdpdmVuIHBhdGggY29tcGxldGVseS4gVGhpcyByb3V0aW5lIG9ubHkKKyAqIGZvbGxvd3MgdHJhaWxpbmcgc3ltbGlua3MgdW50aWwgYSByZWFsIGZpbGUgaXMgcmVhY2hlZCBhbmQKKyAqIHJldHVybnMgaXRzIG5hbWUuIElmIHRoZSBwYXRoIGVuZHMgaW4gYSBkYW5nbGluZyBsaW5rIG9yIGlmCisgKiB0aGUgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QsIHRoZSBwYXRoIGlzIHJldHVybmVkIGluIGFueSBjYXNlLgorICogSW50ZXJtZWRpYXRlIHN5bWxpbmtzIGluIHRoZSBwYXRoIGFyZSBub3QgZXhwYW5kZWQgLS0gb25seQorICogdGhvc2UgYXQgdGhlIHRhaWwuCisgKiBBIG1hbGxvY2VkIGNoYXIqIGlzIHJldHVybmVkLCB3aGljaCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX2ZvbGxvd19zeW1saW5rcyhjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgKmJ1ZjsKKwljaGFyICpscGM7CisJY2hhciAqbGlua3BhdGg7CisJaW50IGJ1ZnNpemU7CisJaW50IGxvb3BpbmcgPSBNQVhTWU1MSU5LUyArIDE7CisKKwlidWYgPSB4c3RyZHVwKHBhdGgpOworCWdvdG8ganVtcF9pbjsKKworCXdoaWxlICgxKSB7CisJCWxpbmtwYXRoID0geG1hbGxvY19yZWFkbGluayhidWYpOworCQlpZiAoIWxpbmtwYXRoKSB7CisJCQkvKiBub3QgYSBzeW1saW5rLCBvciBkb2Vzbid0IGV4aXN0ICovCisJCQlpZiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVOT0VOVCkKKwkJCQlyZXR1cm4gYnVmOworCQkJZ290byBmcmVlX2J1Zl9yZXRfbnVsbDsKKwkJfQorCisJCWlmICghLS1sb29waW5nKSB7CisJCQlmcmVlKGxpbmtwYXRoKTsKKyBmcmVlX2J1Zl9yZXRfbnVsbDoKKwkJCWZyZWUoYnVmKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKCpsaW5rcGF0aCAhPSAnLycpIHsKKwkJCWJ1ZnNpemUgKz0gc3RybGVuKGxpbmtwYXRoKTsKKwkJCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgYnVmc2l6ZSk7CisJCQlscGMgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcChidWYpOworCQkJc3RyY3B5KGxwYywgbGlua3BhdGgpOworCQkJZnJlZShsaW5rcGF0aCk7CisJCX0gZWxzZSB7CisJCQlmcmVlKGJ1Zik7CisJCQlidWYgPSBsaW5rcGF0aDsKKyBqdW1wX2luOgorCQkJYnVmc2l6ZSA9IHN0cmxlbihidWYpICsgMTsKKwkJfQorCX0KK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2Fybihjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgKmJ1ZiA9IHhtYWxsb2NfcmVhZGxpbmsocGF0aCk7CisJaWYgKCFidWYpIHsKKwkJLyogRUlOVkFMID0+ICJmaWxlOiBJbnZhbGlkIGFyZ3VtZW50IiA9PiBwdXp6bGVkIHVzZXIgKi8KKwkJY29uc3QgY2hhciAqZXJybXNnID0gIm5vdCBhIHN5bWxpbmsiOworCQlpbnQgZXJyID0gZXJybm87CisJCWlmIChlcnIgIT0gRUlOVkFMKQorCQkJZXJybXNnID0gc3RyZXJyb3IoZXJyKTsKKwkJYmJfZXJyb3JfbXNnKCIlczogY2Fubm90IHJlYWQgbGluazogJXMiLCBwYXRoLCBlcnJtc2cpOworCX0KKwlyZXR1cm4gYnVmOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19yZWFscGF0aChjb25zdCBjaGFyICpwYXRoKQoreworI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChfX1VDTElCQ19fKQorCS8qIGdsaWJjIHByb3ZpZGVzIGEgbm9uLXN0YW5kYXJkIGV4dGVuc2lvbiAqLworCS8qIG5ldzogUE9TSVguMS0yMDA4IHNwZWNpZmllcyB0aGlzIGJlaGF2aW9yIGFzIHdlbGwgKi8KKwlyZXR1cm4gcmVhbHBhdGgocGF0aCwgTlVMTCk7CisjZWxzZQorCWNoYXIgYnVmW1BBVEhfTUFYKzFdOworCisJLyogb24gZXJyb3IgcmV0dXJucyBOVUxMICh4c3RyZHVwKE5VTEwpID09IE5VTEwpICovCisJcmV0dXJuIHhzdHJkdXAocmVhbHBhdGgocGF0aCwgYnVmKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hyZWFsbG9jX3ZlY3Rvci5jIGIvYnVzeWJveC0xLjE5LjMvbGliYmIveHJlYWxsb2NfdmVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkMzFiNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hyZWFsbG9jX3ZlY3Rvci5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogUmVzaXplIChncm93KSBtYWxsb2NlZCB2ZWN0b3IuCisgKgorICogICNkZWZpbmUgbWFnaWMgcGFja2VkIHR3byBwYXJhbWV0ZXJzIGludG8gb25lOgorICogIHNpemVvZiA9IHNpemVvZl9hbmRfc2hpZnQgPj4gOAorICogIHNoaWZ0ICA9IChzaXplb2ZfYW5kX3NoaWZ0KSAmIDB4ZmYKKyAqCisgKiBMZXRzIHNheSBzaGlmdCA9IDQuIDEgPDwgNCA9PSAweDEwLgorICogSWYgaWR4ID09IDAsIDB4MTAsIDB4MjAgZXRjLCB2ZWN0b3JbXSBpcyByZXNpemVkIHRvIG5leHQgaGlnaGVyCisgKiBpZHggc3RlcCwgcGx1cyBvbmU6IGlmIGlkeCA9PSAweDIwLCB2ZWN0b3JbXSBpcyByZXNpemVkIHRvIDB4MzEsCisgKiB0aHVzIGxhc3QgdXNhYmxlIGVsZW1lbnQgaXMgdmVjdG9yWzB4MzBdLgorICoKKyAqIEluIG90aGVyIHdvcmRzOiBhZnRlciB4cmVhbGxvY192ZWN0b3IodiwgNCwgaWR4KSwgd2l0aCBhbnkgaWR4LAorICogaXQncyBvayB0byB1c2UgYXQgbGVhc3QgdltpZHhdIGFuZCB2W2lkeCsxXS4KKyAqIHZbaWR4KzJdIGV0YyBnZW5lcmFsbHkgYXJlIG5vdCBvay4KKyAqCisgKiBOZXcgZWxlbWVudHMgYXJlIHplcm9lZCBvdXQsIGJ1dCBvbmx5IGlmIHJlYWxsb2Mgd2FzIGRvbmUKKyAqIChub3Qgb24gZXZlcnkgY2FsbCkuIFlvdSBjYW4gZGVwZW5kIG9uIHZbaWR4XSBhbmQgdltpZHgrMV0gYmVpbmcKKyAqIHplcm9lZCBvdXQgaWYgeW91IHVzZSBpdCBsaWtlIHRoaXM6CisgKiAgdiA9IHhyZWFsbG9jX3ZlY3Rvcih2LCA0LCBpZHgpOworICogIHZbaWR4XS5zb21lX2ZpZWxkcyA9IC4uLjsgLSB0aGUgcmVzdCBzdGF5cyAwL05VTEwKKyAqICBpZHgrKzsKKyAqIElmIHlvdSBkbyBub3QgYWR2YW5jZSBpZHggbGlrZSBhYm92ZSwgeW91IHNob3VsZCBiZSBtb3JlIGNhcmVmdWwuCisgKiBOZXh0IGNhbGwgdG8geHJlYWxsb2NfdmVjdG9yKHYsIDQsIGlkeCkgbWF5IG9yIG1heSBub3QgemVybyBvdXQgdltpZHhdLgorICovCit2b2lkKiBGQVNUX0ZVTkMgeHJlYWxsb2NfdmVjdG9yX2hlbHBlcih2b2lkICp2ZWN0b3IsIHVuc2lnbmVkIHNpemVvZl9hbmRfc2hpZnQsIGludCBpZHgpCit7CisJaW50IG1hc2sgPSAxIDw8ICh1aW50OF90KXNpemVvZl9hbmRfc2hpZnQ7CisKKwlpZiAoIShpZHggJiAobWFzayAtIDEpKSkgeworCQlzaXplb2ZfYW5kX3NoaWZ0ID4+PSA4OyAvKiBzaXplb2YodmVjdG9yWzBdKSAqLworCQl2ZWN0b3IgPSB4cmVhbGxvYyh2ZWN0b3IsIHNpemVvZl9hbmRfc2hpZnQgKiAoaWR4ICsgbWFzayArIDEpKTsKKwkJbWVtc2V0KChjaGFyKil2ZWN0b3IgKyAoc2l6ZW9mX2FuZF9zaGlmdCAqIGlkeCksIDAsIHNpemVvZl9hbmRfc2hpZnQgKiAobWFzayArIDEpKTsKKwl9CisJcmV0dXJuIHZlY3RvcjsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYmJiL3hyZWdjb21wLmMgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94cmVnY29tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDAyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9saWJiYi94cmVnY29tcC5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSBtYW55IGRpZmZlcmVudCBwZW9wbGUuCisgKiBJZiB5b3Ugd3JvdGUgdGhpcywgcGxlYXNlIGFja25vd2xlZGdlIHlvdXIgd29yay4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInhyZWdleC5oIgorCitjaGFyKiBGQVNUX0ZVTkMgcmVnY29tcF9vcl9lcnJtc2cocmVnZXhfdCAqcHJlZywgY29uc3QgY2hhciAqcmVnZXgsIGludCBjZmxhZ3MpCit7CisJaW50IHJldCA9IHJlZ2NvbXAocHJlZywgcmVnZXgsIGNmbGFncyk7CisJaWYgKHJldCkgeworCQlpbnQgZXJybXNnc3ogPSByZWdlcnJvcihyZXQsIHByZWcsIE5VTEwsIDApOworCQljaGFyICplcnJtc2cgPSB4bWFsbG9jKGVycm1zZ3N6KTsKKwkJcmVnZXJyb3IocmV0LCBwcmVnLCBlcnJtc2csIGVycm1zZ3N6KTsKKwkJcmV0dXJuIGVycm1zZzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHhyZWdjb21wKHJlZ2V4X3QgKnByZWcsIGNvbnN0IGNoYXIgKnJlZ2V4LCBpbnQgY2ZsYWdzKQoreworCWNoYXIgKmVycm1zZyA9IHJlZ2NvbXBfb3JfZXJybXNnKHByZWcsIHJlZ2V4LCBjZmxhZ3MpOworCWlmIChlcnJtc2cpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByZWdleCAnJXMnOiAlcyIsIHJlZ2V4LCBlcnJtc2cpOworCX0KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xpYnB3ZGdycC9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvbGlicHdkZ3JwL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1ZTNhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYnB3ZGdycC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsOSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15IDo9IHVpZGdpZF9nZXQubworCitsaWItJChDT05GSUdfVVNFX0JCX1BXRF9HUlApICs9IHB3ZF9ncnAubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGlicHdkZ3JwL3B3ZF9ncnAuYyBiL2J1c3lib3gtMS4xOS4zL2xpYnB3ZGdycC9wd2RfZ3JwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViOWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYnB3ZGdycC9wd2RfZ3JwLmMKQEAgLTAsMCArMSwxMDYwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIENvcHlyaWdodCAoQykgMjAwMyAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogTm92IDYsIDIwMDMgIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKiBOT1RFOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHF1aXRlIHN0cmljdCBhYm91dCByZXF1aXJpbmcgYWxsCisgKiAgICBmaWVsZCBzZXBlcmF0b3JzLiAgSXQgYWxzbyBkb2VzIG5vdCBhbGxvdyBsZWFkaW5nIHdoaXRlc3BhY2UKKyAqICAgIGV4Y2VwdCB3aGVuIHByb2Nlc3NpbmcgdGhlIG51bWVyaWMgZmllbGRzLiAgZ2xpYmMgaXMgbW9yZQorICogICAgbGVuaWVudC4gIFNlZSB0aGUgdmFyaW91cyBnbGliYyBkaWZmZXJlbmNlIGNvbW1lbnRzIGJlbG93LgorICoKKyAqIFRPRE86CisgKiAgICBNb3ZlIHRvIGR5bmFtaWMgYWxsb2NhdGlvbiBvZiAoY3VycmVudGx5IHN0YXRpY2FsbHkgYWxsb2NhdGVkKQorICogICAgICBidWZmZXJzOyBlc3BlY2lhbGx5IGZvciB0aGUgZ3JvdXAtcmVsYXRlZCBmdW5jdGlvbnMgc2luY2UKKyAqICAgICAgbGFyZ2UgZ3JvdXAgbWVtYmVyIGxpc3RzIHdpbGwgY2F1c2UgZXJyb3IgcmV0dXJucy4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTaXplcyBmb3Igc3RhdGljYWxseSBhbGxvY2F0ZWQgYnVmZmVycy4gKi8KKworLyogSWYgeW91IGNoYW5nZSB0aGVzZSB2YWx1ZXMsIGFsc28gY2hhbmdlIF9TQ19HRVRQV19SX1NJWkVfTUFYIGFuZAorICogX1NDX0dFVEdSX1JfU0laRV9NQVggaW4gbGliYy91bmlzdGQvc3lzY29uZi5jIHRvIG1hdGNoICovCisjZGVmaW5lIFBXRF9CVUZGRVJfU0laRSAyNTYKKyNkZWZpbmUgR1JQX0JVRkZFUl9TSVpFIDI1NgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIGludCBiYl9fcGdzcmVhZGVyKAorCQlpbnQgRkFTVF9GVU5DICgqcGFyc2VyZnVuYykodm9pZCAqZCwgY2hhciAqbGluZSksCisJCXZvaWQgKmRhdGEsCisJCWNoYXIgKl9fcmVzdHJpY3QgbGluZV9idWZmLAorCQlzaXplX3QgYnVmbGVuLAorCQlGSUxFICpmKTsKKworc3RhdGljIGludCBGQVNUX0ZVTkMgYmJfX3BhcnNlcHdlbnQodm9pZCAqcHcsIGNoYXIgKmxpbmUpOworc3RhdGljIGludCBGQVNUX0ZVTkMgYmJfX3BhcnNlZ3JlbnQodm9pZCAqZ3IsIGNoYXIgKmxpbmUpOworI2lmIEVOQUJMRV9VU0VfQkJfU0hBRE9XCitzdGF0aWMgaW50IEZBU1RfRlVOQyBiYl9fcGFyc2VzcGVudCh2b2lkICpzcCwgY2hhciAqbGluZSk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXZSBhdm9pZCBoYXZpbmcgYmlnIGdsb2JhbCBkYXRhLiAqLworCitzdHJ1Y3Qgc3RhdGljcyB7CisJLyogU21hbGxlciB0aGluZ3MgZmlyc3QgKi8KKwlzdHJ1Y3QgcGFzc3dkIGdldHB3dWlkX3Jlc3VsdGJ1ZjsKKwlzdHJ1Y3QgZ3JvdXAgZ2V0Z3JnaWRfcmVzdWx0YnVmOworCXN0cnVjdCBwYXNzd2QgZ2V0cHduYW1fcmVzdWx0YnVmOworCXN0cnVjdCBncm91cCBnZXRncm5hbV9yZXN1bHRidWY7CisKKwljaGFyIGdldHB3dWlkX2J1ZmZlcltQV0RfQlVGRkVSX1NJWkVdOworCWNoYXIgZ2V0Z3JnaWRfYnVmZmVyW0dSUF9CVUZGRVJfU0laRV07CisJY2hhciBnZXRwd25hbV9idWZmZXJbUFdEX0JVRkZFUl9TSVpFXTsKKwljaGFyIGdldGdybmFtX2J1ZmZlcltHUlBfQlVGRkVSX1NJWkVdOworI2lmIDAKKwlzdHJ1Y3QgcGFzc3dkIGZnZXRwd2VudF9yZXN1bHRidWY7CisJc3RydWN0IGdyb3VwIGZnZXRncmVudF9yZXN1bHRidWY7CisJc3RydWN0IHNwd2QgZmdldHNwZW50X3Jlc3VsdGJ1ZjsKKwljaGFyIGZnZXRwd2VudF9idWZmZXJbUFdEX0JVRkZFUl9TSVpFXTsKKwljaGFyIGZnZXRncmVudF9idWZmZXJbR1JQX0JVRkZFUl9TSVpFXTsKKwljaGFyIGZnZXRzcGVudF9idWZmZXJbUFdEX0JVRkZFUl9TSVpFXTsKKyNlbmRpZgorI2lmIDAgLy9FTkFCTEVfVVNFX0JCX1NIQURPVworCXN0cnVjdCBzcHdkIGdldHNwdWlkX3Jlc3VsdGJ1ZjsKKwlzdHJ1Y3Qgc3B3ZCBnZXRzcG5hbV9yZXN1bHRidWY7CisJY2hhciBnZXRzcHVpZF9idWZmZXJbUFdEX0JVRkZFUl9TSVpFXTsKKwljaGFyIGdldHNwbmFtX2J1ZmZlcltQV0RfQlVGRkVSX1NJWkVdOworI2VuZGlmCisvLyBOb3QgY29udmVydGVkIC0gdG9vIHNtYWxsIHRvIGJvdGhlcgorLy9wdGhyZWFkX211dGV4X3QgbXlsb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKy8vRklMRSAqcHdmIC8qPSBOVUxMKi87CisvL0ZJTEUgKmdyZiAvKj0gTlVMTCovOworLy9GSUxFICpzcGYgLyo9IE5VTEwqLzsKKyNpZiAwCisJc3RydWN0IHBhc3N3ZCBnZXRwd2VudF9wd2Q7CisJc3RydWN0IGdyb3VwIGdldGdyZW50X2dyOworCWNoYXIgZ2V0cHdlbnRfbGluZV9idWZmW1BXRF9CVUZGRVJfU0laRV07CisJY2hhciBnZXRncmVudF9saW5lX2J1ZmZbR1JQX0JVRkZFUl9TSVpFXTsKKyNlbmRpZgorI2lmIDAgLy9FTkFCTEVfVVNFX0JCX1NIQURPVworCXN0cnVjdCBzcHdkIGdldHNwZW50X3Nwd2Q7CisJc3RydWN0IHNwd2Qgc2dldHNwZW50X3Nwd2Q7CisJY2hhciBnZXRzcGVudF9saW5lX2J1ZmZbUFdEX0JVRkZFUl9TSVpFXTsKKwljaGFyIHNnZXRzcGVudF9saW5lX2J1ZmZbUFdEX0JVRkZFUl9TSVpFXTsKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzdGF0aWNzICpwdHJfdG9fc3RhdGljczsKKworc3RhdGljIHN0cnVjdCBzdGF0aWNzICpnZXRfUyh2b2lkKQoreworCWlmICghcHRyX3RvX3N0YXRpY3MpCisJCXB0cl90b19zdGF0aWNzID0geHphbGxvYyhzaXplb2YoKnB0cl90b19zdGF0aWNzKSk7CisJcmV0dXJuIHB0cl90b19zdGF0aWNzOworfQorCisvKiBBbHdheXMgdXNlIGluIHRoaXMgb3JkZXIsIGdldF9TKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QgKi8KKyNkZWZpbmUgUkVTVUxUQlVGKG5hbWUpICYoKFMgPSBnZXRfUygpKS0+bmFtZSMjX3Jlc3VsdGJ1ZikKKyNkZWZpbmUgQlVGRkVSKG5hbWUpICAgIChTLT5uYW1lIyNfYnVmZmVyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvciB0aGUgdmFyaW91cyBmZ2V0Pz9lbnRfciBmdW5jcywgcmV0dXJuCisgKgorICogIDA6IHN1Y2Nlc3MKKyAqICBFTk9FTlQ6IGVuZC1vZi1maWxlIGVuY291bnRlcmVkCisgKiAgRVJBTkdFOiBidWZsZW4gdG9vIHNtYWxsCisgKiAgb3RoZXIgZXJyb3IgdmFsdWVzIHBvc3NpYmxlLiBTZWUgYmJfX3Bnc3JlYWRlci4KKyAqCisgKiBBbHNvLCAqcmVzdWx0ID09IHJlc3VsdGJ1ZiBvbiBzdWNjZXNzIGFuZCBOVUxMIG9uIGZhaWx1cmUuCisgKgorICogTk9URTogZ2xpYmMgZGlmZmVyZW5jZSAtIEZvciB0aGUgRU5PRU5UIGNhc2UsIGdsaWJjIGFsc28gc2V0cyBlcnJuby4KKyAqICAgV2UgZG8gbm90LCBhcyBpdCByZWFsbHkgaXNuJ3QgYW4gZXJyb3IgaWYgd2UgcmVhY2ggdGhlIGVuZC1vZi1maWxlLgorICogICBEb2luZyBzbyBpcyBhbmFsb2dvdXMgdG8gaGF2aW5nIGZnZXRjKCkgc2V0IGVycm5vIG9uIEVPRi4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBmZ2V0cHdlbnRfcihGSUxFICpfX3Jlc3RyaWN0IHN0cmVhbSwgc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCByZXN1bHRidWYsCisJCQkJY2hhciAqX19yZXN0cmljdCBidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCQkJc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgcmVzdWx0KQoreworCWludCBydjsKKworCSpyZXN1bHQgPSBOVUxMOworCisJcnYgPSBiYl9fcGdzcmVhZGVyKGJiX19wYXJzZXB3ZW50LCByZXN1bHRidWYsIGJ1ZmZlciwgYnVmbGVuLCBzdHJlYW0pOworCWlmICghcnYpIHsKKwkJKnJlc3VsdCA9IHJlc3VsdGJ1ZjsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK2ludCBmZ2V0Z3JlbnRfcihGSUxFICpfX3Jlc3RyaWN0IHN0cmVhbSwgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IHJlc3VsdGJ1ZiwKKwkJCQljaGFyICpfX3Jlc3RyaWN0IGJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwKKwkJCQlzdHJ1Y3QgZ3JvdXAgKipfX3Jlc3RyaWN0IHJlc3VsdCkKK3sKKwlpbnQgcnY7CisKKwkqcmVzdWx0ID0gTlVMTDsKKworCXJ2ID0gYmJfX3Bnc3JlYWRlcihiYl9fcGFyc2VncmVudCwgcmVzdWx0YnVmLCBidWZmZXIsIGJ1Zmxlbiwgc3RyZWFtKTsKKwlpZiAoIXJ2KSB7CisJCSpyZXN1bHQgPSByZXN1bHRidWY7CisJfQorCisJcmV0dXJuIHJ2OworfQorCisjaWYgRU5BQkxFX1VTRV9CQl9TSEFET1cKKyNpZmRlZiBVTlVTRURfRk9SX05PVworaW50IGZnZXRzcGVudF9yKEZJTEUgKl9fcmVzdHJpY3Qgc3RyZWFtLCBzdHJ1Y3Qgc3B3ZCAqX19yZXN0cmljdCByZXN1bHRidWYsCisJCQkJY2hhciAqX19yZXN0cmljdCBidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCQkJc3RydWN0IHNwd2QgKipfX3Jlc3RyaWN0IHJlc3VsdCkKK3sKKwlpbnQgcnY7CisKKwkqcmVzdWx0ID0gTlVMTDsKKworCXJ2ID0gYmJfX3Bnc3JlYWRlcihiYl9fcGFyc2VzcGVudCwgcmVzdWx0YnVmLCBidWZmZXIsIGJ1Zmxlbiwgc3RyZWFtKTsKKwlpZiAoIXJ2KSB7CisJCSpyZXN1bHQgPSByZXN1bHRidWY7CisJfQorCisJcmV0dXJuIHJ2OworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3IgdGhlIHZhcmlvdXMgZmdldD8/ZW50IGZ1bmNzLCByZXR1cm4gTlVMTCBvbiBmYWlsdXJlIGFuZCBhCisgKiBwb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSBzdHJ1Y3QgKHN0YXRpY2FsbHkgYWxsb2NhdGVkKSBvbiBzdWNjZXNzLgorICogVE9ETzogYXVkaXQgJiBzdG9wIHVzaW5nIHRoZXNlIGluIGJib3gsIHRoZXkgcHVsbCBpbiBzdGF0aWMgYnVmZmVycyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBVTlVTRURfU0lOQ0VfV0VfQVZPSURfU1RBVElDX0JVRlMKK3N0cnVjdCBwYXNzd2QgKmZnZXRwd2VudChGSUxFICpzdHJlYW0pCit7CisJc3RydWN0IHN0YXRpY3MgKlM7CisJc3RydWN0IHBhc3N3ZCAqcmVzdWx0YnVmID0gUkVTVUxUQlVGKGZnZXRwd2VudCk7CisJY2hhciAqYnVmZmVyID0gQlVGRkVSKGZnZXRwd2VudCk7CisJc3RydWN0IHBhc3N3ZCAqcmVzdWx0OworCisJZmdldHB3ZW50X3Ioc3RyZWFtLCByZXN1bHRidWYsIGJ1ZmZlciwgc2l6ZW9mKEJVRkZFUihmZ2V0cHdlbnQpKSwgJnJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGdyb3VwICpmZ2V0Z3JlbnQoRklMRSAqc3RyZWFtKQoreworCXN0cnVjdCBzdGF0aWNzICpTOworCXN0cnVjdCBncm91cCAqcmVzdWx0YnVmID0gUkVTVUxUQlVGKGZnZXRncmVudCk7CisJY2hhciAqYnVmZmVyID0gQlVGRkVSKGZnZXRncmVudCk7CisJc3RydWN0IGdyb3VwICpyZXN1bHQ7CisKKwlmZ2V0Z3JlbnRfcihzdHJlYW0sIHJlc3VsdGJ1ZiwgYnVmZmVyLCBzaXplb2YoQlVGRkVSKGZnZXRncmVudCkpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworI2lmZGVmIFVOVVNFRF9TSU5DRV9XRV9BVk9JRF9TVEFUSUNfQlVGUworc3RydWN0IHNwd2QgKmZnZXRzcGVudChGSUxFICpzdHJlYW0pCit7CisJc3RydWN0IHN0YXRpY3MgKlM7CisJc3RydWN0IHNwd2QgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihmZ2V0c3BlbnQpOworCWNoYXIgKmJ1ZmZlciA9IEJVRkZFUihmZ2V0c3BlbnQpOworCXN0cnVjdCBzcHdkICpyZXN1bHQ7CisKKwlmZ2V0c3BlbnRfcihzdHJlYW0sIHJlc3VsdGJ1ZiwgYnVmZmVyLCBzaXplb2YoQlVGRkVSKGZnZXRzcGVudCkpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNpZmRlZiBVTlVTRURfRk9SX05PVworaW50IHNnZXRzcGVudF9yKGNvbnN0IGNoYXIgKnN0cmluZywgc3RydWN0IHNwd2QgKnJlc3VsdF9idWYsCisJCQkJY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBzdHJ1Y3Qgc3B3ZCAqKnJlc3VsdCkKK3sKKwlpbnQgcnYgPSBFUkFOR0U7CisKKwkqcmVzdWx0ID0gTlVMTDsKKworCWlmIChidWZsZW4gPCBQV0RfQlVGRkVSX1NJWkUpIHsKKyBET19FUkFOR0U6CisJCWVycm5vID0gcnY7CisJCWdvdG8gRE9ORTsKKwl9CisKKwlpZiAoc3RyaW5nICE9IGJ1ZmZlcikgeworCQlpZiAoc3RybGVuKHN0cmluZykgPj0gYnVmbGVuKSB7CisJCQlnb3RvIERPX0VSQU5HRTsKKwkJfQorCQlzdHJjcHkoYnVmZmVyLCBzdHJpbmcpOworCX0KKworCXJ2ID0gYmJfX3BhcnNlc3BlbnQocmVzdWx0X2J1ZiwgYnVmZmVyKTsKKwlpZiAoIXJ2KSB7CisJCSpyZXN1bHQgPSByZXN1bHRfYnVmOworCX0KKworIERPTkU6CisJcmV0dXJuIHJ2OworfQorI2VuZGlmCisjZW5kaWYgLyogRU5BQkxFX1VTRV9CQl9TSEFET1cgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgR0VUWFhLRVlfUl9GVU5DICAgICAgICAgZ2V0cHduYW1fcgorI2RlZmluZSBHRVRYWEtFWV9SX1BBUlNFUiAgICAgICBiYl9fcGFyc2Vwd2VudAorI2RlZmluZSBHRVRYWEtFWV9SX0VOVFRZUEUgICAgICBzdHJ1Y3QgcGFzc3dkCisjZGVmaW5lIEdFVFhYS0VZX1JfVEVTVChFTlQpICAgICghc3RyY21wKChFTlQpLT5wd19uYW1lLCBrZXkpKQorI2RlZmluZSBHRVRYWEtFWV9SX0tFWVRZUEUgICAgICBjb25zdCBjaGFyICpfX3Jlc3RyaWN0CisjZGVmaW5lIEdFVFhYS0VZX1JfUEFUSE5BTUUgICAgIF9QQVRIX1BBU1NXRAorI2luY2x1ZGUgInB3ZF9ncnBfaW50ZXJuYWwuYyIKKworI2RlZmluZSBHRVRYWEtFWV9SX0ZVTkMgICAgICAgICBnZXRncm5hbV9yCisjZGVmaW5lIEdFVFhYS0VZX1JfUEFSU0VSICAgICAgIGJiX19wYXJzZWdyZW50CisjZGVmaW5lIEdFVFhYS0VZX1JfRU5UVFlQRSAgICAgIHN0cnVjdCBncm91cAorI2RlZmluZSBHRVRYWEtFWV9SX1RFU1QoRU5UKSAgICAoIXN0cmNtcCgoRU5UKS0+Z3JfbmFtZSwga2V5KSkKKyNkZWZpbmUgR0VUWFhLRVlfUl9LRVlUWVBFICAgICAgY29uc3QgY2hhciAqX19yZXN0cmljdAorI2RlZmluZSBHRVRYWEtFWV9SX1BBVEhOQU1FICAgICBfUEFUSF9HUk9VUAorI2luY2x1ZGUgInB3ZF9ncnBfaW50ZXJuYWwuYyIKKworI2lmIEVOQUJMRV9VU0VfQkJfU0hBRE9XCisjZGVmaW5lIEdFVFhYS0VZX1JfRlVOQyAgICAgICAgIGdldHNwbmFtX3IKKyNkZWZpbmUgR0VUWFhLRVlfUl9QQVJTRVIgICAgICAgYmJfX3BhcnNlc3BlbnQKKyNkZWZpbmUgR0VUWFhLRVlfUl9FTlRUWVBFICAgICAgc3RydWN0IHNwd2QKKyNkZWZpbmUgR0VUWFhLRVlfUl9URVNUKEVOVCkgICAgKCFzdHJjbXAoKEVOVCktPnNwX25hbXAsIGtleSkpCisjZGVmaW5lIEdFVFhYS0VZX1JfS0VZVFlQRSAgICAgIGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QKKyNkZWZpbmUgR0VUWFhLRVlfUl9QQVRITkFNRSAgICAgX1BBVEhfU0hBRE9XCisjaW5jbHVkZSAicHdkX2dycF9pbnRlcm5hbC5jIgorI2VuZGlmCisKKyNkZWZpbmUgR0VUWFhLRVlfUl9GVU5DICAgICAgICAgZ2V0cHd1aWRfcgorI2RlZmluZSBHRVRYWEtFWV9SX1BBUlNFUiAgICAgICBiYl9fcGFyc2Vwd2VudAorI2RlZmluZSBHRVRYWEtFWV9SX0VOVFRZUEUgICAgICBzdHJ1Y3QgcGFzc3dkCisjZGVmaW5lIEdFVFhYS0VZX1JfVEVTVChFTlQpICAgICgoRU5UKS0+cHdfdWlkID09IGtleSkKKyNkZWZpbmUgR0VUWFhLRVlfUl9LRVlUWVBFICAgICAgdWlkX3QKKyNkZWZpbmUgR0VUWFhLRVlfUl9QQVRITkFNRSAgICAgX1BBVEhfUEFTU1dECisjaW5jbHVkZSAicHdkX2dycF9pbnRlcm5hbC5jIgorCisjZGVmaW5lIEdFVFhYS0VZX1JfRlVOQyAgICAgICAgIGdldGdyZ2lkX3IKKyNkZWZpbmUgR0VUWFhLRVlfUl9QQVJTRVIgICAgICAgYmJfX3BhcnNlZ3JlbnQKKyNkZWZpbmUgR0VUWFhLRVlfUl9FTlRUWVBFICAgICAgc3RydWN0IGdyb3VwCisjZGVmaW5lIEdFVFhYS0VZX1JfVEVTVChFTlQpICAgICgoRU5UKS0+Z3JfZ2lkID09IGtleSkKKyNkZWZpbmUgR0VUWFhLRVlfUl9LRVlUWVBFICAgICAgZ2lkX3QKKyNkZWZpbmUgR0VUWFhLRVlfUl9QQVRITkFNRSAgICAgX1BBVEhfR1JPVVAKKyNpbmNsdWRlICJwd2RfZ3JwX2ludGVybmFsLmMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVE9ETzogYXVkaXQgJiBzdG9wIHVzaW5nIHRoZXNlIGluIGJib3gsIHRoZXkgcHVsbCBpbiBzdGF0aWMgYnVmZmVycyAqLworCisvKiBUaGlzIG9uZSBoYXMgbWFueSB1c2VycyAqLworc3RydWN0IHBhc3N3ZCAqZ2V0cHd1aWQodWlkX3QgdWlkKQoreworCXN0cnVjdCBzdGF0aWNzICpTOworCXN0cnVjdCBwYXNzd2QgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihnZXRwd3VpZCk7CisJY2hhciAqYnVmZmVyID0gQlVGRkVSKGdldHB3dWlkKTsKKwlzdHJ1Y3QgcGFzc3dkICpyZXN1bHQ7CisKKwlnZXRwd3VpZF9yKHVpZCwgcmVzdWx0YnVmLCBidWZmZXIsIHNpemVvZihCVUZGRVIoZ2V0cHd1aWQpKSwgJnJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogVGhpcyBvbmUgaGFzIG1hbnkgdXNlcnMgKi8KK3N0cnVjdCBncm91cCAqZ2V0Z3JnaWQoZ2lkX3QgZ2lkKQoreworCXN0cnVjdCBzdGF0aWNzICpTOworCXN0cnVjdCBncm91cCAqcmVzdWx0YnVmID0gUkVTVUxUQlVGKGdldGdyZ2lkKTsKKwljaGFyICpidWZmZXIgPSBCVUZGRVIoZ2V0Z3JnaWQpOworCXN0cnVjdCBncm91cCAqcmVzdWx0OworCisJZ2V0Z3JnaWRfcihnaWQsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBzaXplb2YoQlVGRkVSKGdldGdyZ2lkKSksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZiAwIC8vRU5BQkxFX1VTRV9CQl9TSEFET1cKKy8qIFRoaXMgZnVuY3Rpb24gaXMgbm9uLXN0YW5kYXJkIGFuZCBpcyBjdXJyZW50bHkgbm90IGJ1aWx0LiAgSXQgc2VlbXMKKyAqIHRvIGhhdmUgYmVlbiBjcmVhdGVkIGFzIGEgcmVlbnRyYW50IHZlcnNpb24gb2YgdGhlIG5vbi1zdGFuZGFyZAorICogZnVuY3Rpb25zIGdldHNwdWlkLiAgV2h5IGdldHNwdWlkIHdhcyBhZGRlZCwgSSBkbyBub3Qga25vdy4gKi8KK2ludCBnZXRzcHVpZF9yKHVpZF90IHVpZCwgc3RydWN0IHNwd2QgKl9fcmVzdHJpY3QgcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCSAgICAgICBzdHJ1Y3Qgc3B3ZCAqKl9fcmVzdHJpY3QgcmVzdWx0KQoreworCWludCBydjsKKwlzdHJ1Y3QgcGFzc3dkICpwcDsKKwlzdHJ1Y3QgcGFzc3dkIHBhc3N3b3JkOworCWNoYXIgcHdkX2J1ZmZbUFdEX0JVRkZFUl9TSVpFXTsKKworCSpyZXN1bHQgPSBOVUxMOworCXJ2ID0gZ2V0cHd1aWRfcih1aWQsICZwYXNzd29yZCwgcHdkX2J1ZmYsIHNpemVvZihwd2RfYnVmZiksICZwcCk7CisJaWYgKCFydikgeworCQlydiA9IGdldHNwbmFtX3IocGFzc3dvcmQucHdfbmFtZSwgcmVzdWx0YnVmLCBidWZmZXIsIGJ1ZmxlbiwgcmVzdWx0KTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgbm9uLXN0YW5kYXJkIGFuZCBpcyBjdXJyZW50bHkgbm90IGJ1aWx0LgorICogV2h5IGl0IHdhcyBhZGRlZCwgSSBkbyBub3Qga25vdy4gKi8KK3N0cnVjdCBzcHdkICpnZXRzcHVpZCh1aWRfdCB1aWQpCit7CisJc3RydWN0IHN0YXRpY3MgKlM7CisJc3RydWN0IHNwd2QgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihnZXRzcHVpZCk7CisJY2hhciAqYnVmZmVyID0gQlVGRkVSKGdldHNwdWlkKTsKKwlzdHJ1Y3Qgc3B3ZCAqcmVzdWx0OworCisJZ2V0c3B1aWRfcih1aWQsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBzaXplb2YoQlVGRkVSKGdldHNwdWlkKSksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworLyogVGhpcyBvbmUgaGFzIG1hbnkgdXNlcnMgKi8KK3N0cnVjdCBwYXNzd2QgKmdldHB3bmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXRpY3MgKlM7CisJc3RydWN0IHBhc3N3ZCAqcmVzdWx0YnVmID0gUkVTVUxUQlVGKGdldHB3bmFtKTsKKwljaGFyICpidWZmZXIgPSBCVUZGRVIoZ2V0cHduYW0pOworCXN0cnVjdCBwYXNzd2QgKnJlc3VsdDsKKworCWdldHB3bmFtX3IobmFtZSwgcmVzdWx0YnVmLCBidWZmZXIsIHNpemVvZihCVUZGRVIoZ2V0cHduYW0pKSwgJnJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogVGhpcyBvbmUgaGFzIG1hbnkgdXNlcnMgKi8KK3N0cnVjdCBncm91cCAqZ2V0Z3JuYW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdGljcyAqUzsKKwlzdHJ1Y3QgZ3JvdXAgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihnZXRncm5hbSk7CisJY2hhciAqYnVmZmVyID0gQlVGRkVSKGdldGdybmFtKTsKKwlzdHJ1Y3QgZ3JvdXAgKnJlc3VsdDsKKworCWdldGdybmFtX3IobmFtZSwgcmVzdWx0YnVmLCBidWZmZXIsIHNpemVvZihCVUZGRVIoZ2V0Z3JuYW0pKSwgJnJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2lmIDAgLy9FTkFCTEVfVVNFX0JCX1NIQURPVworc3RydWN0IHNwd2QgKmdldHNwbmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXRpY3MgKlM7CisJc3RydWN0IHNwd2QgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihnZXRzcG5hbSk7CisJY2hhciAqYnVmZmVyID0gQlVGRkVSKGdldHNwbmFtKTsKKwlzdHJ1Y3Qgc3B3ZCAqcmVzdWx0OworCisJZ2V0c3BuYW1fcihuYW1lLCByZXN1bHRidWYsIGJ1ZmZlciwgc2l6ZW9mKEJVRkZFUihnZXRzcG5hbSkpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGSVhNRTogd2UgZG9uJ3QgaGF2ZSBzdWNoIENPTkZJR194eCAtID8hICovCisKKyNpZiBkZWZpbmVkIENPTkZJR19VU0VfQkJfVEhSRUFEU0FGRV9TSEFET1cgJiYgZGVmaW5lZCBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCitzdGF0aWMgcHRocmVhZF9tdXRleF90IG15bG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjIGRlZmluZSBMT0NLCQlwdGhyZWFkX211dGV4X2xvY2soJm15bG9jaykKKyMgZGVmaW5lIFVOTE9DSwkJcHRocmVhZF9tdXRleF91bmxvY2soJm15bG9jayk7CisjZWxzZQorIyBkZWZpbmUgTE9DSwkJKCh2b2lkKSAwKQorIyBkZWZpbmUgVU5MT0NLCQkoKHZvaWQpIDApCisjZW5kaWYKKworc3RhdGljIEZJTEUgKnB3ZiAvKj0gTlVMTCovOwordm9pZCBzZXRwd2VudCh2b2lkKQoreworCUxPQ0s7CisJaWYgKHB3ZikgeworCQlyZXdpbmQocHdmKTsKKwl9CisJVU5MT0NLOworfQorCit2b2lkIGVuZHB3ZW50KHZvaWQpCit7CisJTE9DSzsKKwlpZiAocHdmKSB7CisJCWZjbG9zZShwd2YpOworCQlwd2YgPSBOVUxMOworCX0KKwlVTkxPQ0s7Cit9CisKKworaW50IGdldHB3ZW50X3Ioc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCByZXN1bHRidWYsCisJCQkgICBjaGFyICpfX3Jlc3RyaWN0IGJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwKKwkJCSAgIHN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IHJlc3VsdCkKK3sKKwlpbnQgcnY7CisKKwlMT0NLOworCSpyZXN1bHQgPSBOVUxMOwkJCQkvKiBJbiBjYXNlIG9mIGVycm9yLi4uICovCisKKwlpZiAoIXB3ZikgeworCQlwd2YgPSBmb3Blbl9mb3JfcmVhZChfUEFUSF9QQVNTV0QpOworCQlpZiAoIXB3ZikgeworCQkJcnYgPSBlcnJubzsKKwkJCWdvdG8gRVJSOworCQl9CisJfQorCisJcnYgPSBiYl9fcGdzcmVhZGVyKGJiX19wYXJzZXB3ZW50LCByZXN1bHRidWYsIGJ1ZmZlciwgYnVmbGVuLCBwd2YpOworCWlmICghcnYpIHsKKwkJKnJlc3VsdCA9IHJlc3VsdGJ1ZjsKKwl9CisKKyBFUlI6CisJVU5MT0NLOworCXJldHVybiBydjsKK30KKworc3RhdGljIEZJTEUgKmdyZiAvKj0gTlVMTCovOwordm9pZCBzZXRncmVudCh2b2lkKQoreworCUxPQ0s7CisJaWYgKGdyZikgeworCQlyZXdpbmQoZ3JmKTsKKwl9CisJVU5MT0NLOworfQorCit2b2lkIGVuZGdyZW50KHZvaWQpCit7CisJTE9DSzsKKwlpZiAoZ3JmKSB7CisJCWZjbG9zZShncmYpOworCQlncmYgPSBOVUxMOworCX0KKwlVTkxPQ0s7Cit9CisKK2ludCBnZXRncmVudF9yKHN0cnVjdCBncm91cCAqX19yZXN0cmljdCByZXN1bHRidWYsCisJCQkgICBjaGFyICpfX3Jlc3RyaWN0IGJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwKKwkJCSAgIHN0cnVjdCBncm91cCAqKl9fcmVzdHJpY3QgcmVzdWx0KQoreworCWludCBydjsKKworCUxPQ0s7CisJKnJlc3VsdCA9IE5VTEw7CQkJCS8qIEluIGNhc2Ugb2YgZXJyb3IuLi4gKi8KKworCWlmICghZ3JmKSB7CisJCWdyZiA9IGZvcGVuX2Zvcl9yZWFkKF9QQVRIX0dST1VQKTsKKwkJaWYgKCFncmYpIHsKKwkJCXJ2ID0gZXJybm87CisJCQlnb3RvIEVSUjsKKwkJfQorCX0KKworCXJ2ID0gYmJfX3Bnc3JlYWRlcihiYl9fcGFyc2VncmVudCwgcmVzdWx0YnVmLCBidWZmZXIsIGJ1ZmxlbiwgZ3JmKTsKKwlpZiAoIXJ2KSB7CisJCSpyZXN1bHQgPSByZXN1bHRidWY7CisJfQorCisgRVJSOgorCVVOTE9DSzsKKwlyZXR1cm4gcnY7Cit9CisKKyNpZmRlZiBVTlVTRURfRk9SX05PVworI2lmIEVOQUJMRV9VU0VfQkJfU0hBRE9XCitzdGF0aWMgRklMRSAqc3BmIC8qPSBOVUxMKi87Cit2b2lkIHNldHNwZW50KHZvaWQpCit7CisJTE9DSzsKKwlpZiAoc3BmKSB7CisJCXJld2luZChzcGYpOworCX0KKwlVTkxPQ0s7Cit9CisKK3ZvaWQgZW5kc3BlbnQodm9pZCkKK3sKKwlMT0NLOworCWlmIChzcGYpIHsKKwkJZmNsb3NlKHNwZik7CisJCXNwZiA9IE5VTEw7CisJfQorCVVOTE9DSzsKK30KKworaW50IGdldHNwZW50X3Ioc3RydWN0IHNwd2QgKnJlc3VsdGJ1ZiwgY2hhciAqYnVmZmVyLAorCQkJICAgc2l6ZV90IGJ1Zmxlbiwgc3RydWN0IHNwd2QgKipyZXN1bHQpCit7CisJaW50IHJ2OworCisJTE9DSzsKKwkqcmVzdWx0ID0gTlVMTDsJCQkJLyogSW4gY2FzZSBvZiBlcnJvci4uLiAqLworCisJaWYgKCFzcGYpIHsKKwkJc3BmID0gZm9wZW5fZm9yX3JlYWQoX1BBVEhfU0hBRE9XKTsKKwkJaWYgKCFzcGYpIHsKKwkJCXJ2ID0gZXJybm87CisJCQlnb3RvIEVSUjsKKwkJfQorCX0KKworCXJ2ID0gYmJfX3Bnc3JlYWRlcihiYl9fcGFyc2VzcGVudCwgcmVzdWx0YnVmLCBidWZmZXIsIGJ1Zmxlbiwgc3BmKTsKKwlpZiAoIXJ2KSB7CisJCSpyZXN1bHQgPSByZXN1bHRidWY7CisJfQorCisgRVJSOgorCVVOTE9DSzsKKwlyZXR1cm4gcnY7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBVTlVTRURfRk9SX05PVyAqLworCisjaWZkZWYgVU5VU0VEX1NJTkNFX1dFX0FWT0lEX1NUQVRJQ19CVUZTCitzdHJ1Y3QgcGFzc3dkICpnZXRwd2VudCh2b2lkKQoreworCXN0YXRpYyBjaGFyIGxpbmVfYnVmZltQV0RfQlVGRkVSX1NJWkVdOworCXN0YXRpYyBzdHJ1Y3QgcGFzc3dkIHB3ZDsKKwlzdHJ1Y3QgcGFzc3dkICpyZXN1bHQ7CisKKwlnZXRwd2VudF9yKCZwd2QsIGxpbmVfYnVmZiwgc2l6ZW9mKGxpbmVfYnVmZiksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBncm91cCAqZ2V0Z3JlbnQodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBsaW5lX2J1ZmZbR1JQX0JVRkZFUl9TSVpFXTsKKwlzdGF0aWMgc3RydWN0IGdyb3VwIGdyOworCXN0cnVjdCBncm91cCAqcmVzdWx0OworCisJZ2V0Z3JlbnRfcigmZ3IsIGxpbmVfYnVmZiwgc2l6ZW9mKGxpbmVfYnVmZiksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworc3RydWN0IHNwd2QgKmdldHNwZW50KHZvaWQpCit7CisJc3RhdGljIGNoYXIgbGluZV9idWZmW1BXRF9CVUZGRVJfU0laRV07CisJc3RhdGljIHN0cnVjdCBzcHdkIHNwd2Q7CisJc3RydWN0IHNwd2QgKnJlc3VsdDsKKworCWdldHNwZW50X3IoJnNwd2QsIGxpbmVfYnVmZiwgc2l6ZW9mKGxpbmVfYnVmZiksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBzcHdkICpzZ2V0c3BlbnQoY29uc3QgY2hhciAqc3RyaW5nKQoreworCXN0YXRpYyBjaGFyIGxpbmVfYnVmZltQV0RfQlVGRkVSX1NJWkVdOworCXN0YXRpYyBzdHJ1Y3Qgc3B3ZCBzcHdkOworCXN0cnVjdCBzcHdkICpyZXN1bHQ7CisKKwlzZ2V0c3BlbnRfcihzdHJpbmcsICZzcHdkLCBsaW5lX2J1ZmYsIHNpemVvZihsaW5lX2J1ZmYpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisjZW5kaWYgLyogVU5VU0VEX1NJTkNFX1dFX0FWT0lEX1NUQVRJQ19CVUZTICovCisKK3N0YXRpYyBnaWRfdCAqZ2V0Z3JvdXBsaXN0X2ludGVybmFsKGludCAqbmdyb3Vwc19wdHIsIGNvbnN0IGNoYXIgKnVzZXIsIGdpZF90IGdpZCkKK3sKKwlGSUxFICpncmZpbGU7CisJZ2lkX3QgKmdyb3VwX2xpc3Q7CisJaW50IG5ncm91cHM7CisJc3RydWN0IGdyb3VwIGdyb3VwOworCWNoYXIgYnVmZltQV0RfQlVGRkVSX1NJWkVdOworCisJLyogV2UgYWxsb2Mgc3BhY2UgZm9yIDggZ2lkcyBhdCBhIHRpbWUuICovCisJZ3JvdXBfbGlzdCA9IHhtYWxsb2MoOCAqIHNpemVvZihncm91cF9saXN0WzBdKSk7CisJZ3JvdXBfbGlzdFswXSA9IGdpZDsKKwluZ3JvdXBzID0gMTsKKworCWdyZmlsZSA9IGZvcGVuX2Zvcl9yZWFkKF9QQVRIX0dST1VQKTsKKwlpZiAoZ3JmaWxlKSB7CisJCXdoaWxlICghYmJfX3Bnc3JlYWRlcihiYl9fcGFyc2VncmVudCwgJmdyb3VwLCBidWZmLCBzaXplb2YoYnVmZiksIGdyZmlsZSkpIHsKKwkJCWNoYXIgKiptOworCQkJYXNzZXJ0KGdyb3VwLmdyX21lbSk7IC8qIE11c3QgaGF2ZSBhdCBsZWFzdCBhIE5VTEwgdGVybWluYXRvci4gKi8KKwkJCWlmIChncm91cC5ncl9naWQgPT0gZ2lkKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChtID0gZ3JvdXAuZ3JfbWVtOyAqbTsgbSsrKSB7CisJCQkJaWYgKHN0cmNtcCgqbSwgdXNlcikgIT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJZ3JvdXBfbGlzdCA9IHhyZWFsbG9jX3ZlY3Rvcihncm91cF9saXN0LCAvKjg9Ml4zOiovIDMsIG5ncm91cHMpOworCQkJCWdyb3VwX2xpc3Rbbmdyb3VwcysrXSA9IGdyb3VwLmdyX2dpZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmY2xvc2UoZ3JmaWxlKTsKKwl9CisJKm5ncm91cHNfcHRyID0gbmdyb3VwczsKKwlyZXR1cm4gZ3JvdXBfbGlzdDsKK30KKworaW50IGluaXRncm91cHMoY29uc3QgY2hhciAqdXNlciwgZ2lkX3QgZ2lkKQoreworCWludCBuZ3JvdXBzOworCWdpZF90ICpncm91cF9saXN0ID0gZ2V0Z3JvdXBsaXN0X2ludGVybmFsKCZuZ3JvdXBzLCB1c2VyLCBnaWQpOworCisJbmdyb3VwcyA9IHNldGdyb3VwcyhuZ3JvdXBzLCBncm91cF9saXN0KTsKKwlmcmVlKGdyb3VwX2xpc3QpOworCXJldHVybiBuZ3JvdXBzOworfQorCitpbnQgZ2V0Z3JvdXBsaXN0KGNvbnN0IGNoYXIgKnVzZXIsIGdpZF90IGdpZCwgZ2lkX3QgKmdyb3VwcywgaW50ICpuZ3JvdXBzKQoreworCWludCBuZ3JvdXBzX29sZCA9ICpuZ3JvdXBzOworCWdpZF90ICpncm91cF9saXN0ID0gZ2V0Z3JvdXBsaXN0X2ludGVybmFsKG5ncm91cHMsIHVzZXIsIGdpZCk7CisKKwlpZiAoKm5ncm91cHMgPD0gbmdyb3Vwc19vbGQpIHsKKwkJbmdyb3Vwc19vbGQgPSAqbmdyb3VwczsKKwkJbWVtY3B5KGdyb3VwcywgZ3JvdXBfbGlzdCwgbmdyb3Vwc19vbGQgKiBzaXplb2YoZ3JvdXBzWzBdKSk7CisJfSBlbHNlIHsKKwkJbmdyb3Vwc19vbGQgPSAtMTsKKwl9CisJZnJlZShncm91cF9saXN0KTsKKwlyZXR1cm4gbmdyb3Vwc19vbGQ7Cit9CisKKyNpZmRlZiBVTlVTRURfU0lOQ0VfV0VfQVZPSURfU1RBVElDX0JVRlMKK2ludCBwdXRwd2VudChjb25zdCBzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IHAsIEZJTEUgKl9fcmVzdHJpY3QgZikKK3sKKwlpbnQgcnYgPSAtMTsKKworI2lmIDAKKwkvKiBnbGliYyBkb2VzIHRoaXMgY2hlY2sgKi8KKwlpZiAoIXAgfHwgIWYpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiBydjsKKwl9CisjZW5kaWYKKworCS8qIE5vIGV4dHJhIHRocmVhZCBsb2NraW5nIGlzIG5lZWRlZCBhYm92ZSB3aGF0IGZwcmludGYgZG9lcy4gKi8KKwlpZiAoZnByaW50ZihmLCAiJXM6JXM6JWx1OiVsdTolczolczolc1xuIiwKKwkJCQlwLT5wd19uYW1lLCBwLT5wd19wYXNzd2QsCisJCQkJKHVuc2lnbmVkIGxvbmcpKHAtPnB3X3VpZCksCisJCQkJKHVuc2lnbmVkIGxvbmcpKHAtPnB3X2dpZCksCisJCQkJcC0+cHdfZ2Vjb3MsIHAtPnB3X2RpciwgcC0+cHdfc2hlbGwpID49IDAKKwkJKSB7CisJCXJ2ID0gMDsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK2ludCBwdXRncmVudChjb25zdCBzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgcCwgRklMRSAqX19yZXN0cmljdCBmKQoreworCWludCBydiA9IC0xOworCisjaWYgMAorCS8qIGdsaWJjIGRvZXMgdGhpcyBjaGVjayAqLworCWlmICghcCB8fCAhZikgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIHJ2OworCX0KKyNlbmRpZgorCisJaWYgKGZwcmludGYoZiwgIiVzOiVzOiVsdToiLAorCQkJCXAtPmdyX25hbWUsIHAtPmdyX3Bhc3N3ZCwKKwkJCQkodW5zaWduZWQgbG9uZykocC0+Z3JfZ2lkKSkgPj0gMAorCSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBmb3JtYXRbXSBBTElHTjEgPSAiLCVzIjsKKworCQljaGFyICoqbTsKKwkJY29uc3QgY2hhciAqZm10OworCisJCWZtdCA9IGZvcm1hdCArIDE7CisKKwkJYXNzZXJ0KHAtPmdyX21lbSk7CisJCW0gPSBwLT5ncl9tZW07CisKKwkJd2hpbGUgKDEpIHsKKwkJCWlmICghKm0pIHsKKwkJCQlpZiAoZnB1dGMoJ1xuJywgZikgPj0gMCkgeworCQkJCQlydiA9IDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGZwcmludGYoZiwgZm10LCAqbSkgPCAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQltKys7CisJCQlmbXQgPSBmb3JtYXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcnY7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9VU0VfQkJfU0hBRE9XCisjaWZkZWYgVU5VU0VEX0ZPUl9OT1cKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHB1dF9zcF9vZmZbXSBBTElHTjEgPSB7CisJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX2xzdGNoZyksICAgICAgIC8qIDIgLSBub3QgYSBjaGFyIHB0ciAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9taW4pLCAgICAgICAgICAvKiAzIC0gbm90IGEgY2hhciBwdHIgKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfbWF4KSwgICAgICAgICAgLyogNCAtIG5vdCBhIGNoYXIgcHRyICovCisJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX3dhcm4pLCAgICAgICAgIC8qIDUgLSBub3QgYSBjaGFyIHB0ciAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9pbmFjdCksICAgICAgICAvKiA2IC0gbm90IGEgY2hhciBwdHIgKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfZXhwaXJlKSAgICAgICAgLyogNyAtIG5vdCBhIGNoYXIgcHRyICovCit9OworCitpbnQgcHV0c3BlbnQoY29uc3Qgc3RydWN0IHNwd2QgKnAsIEZJTEUgKnN0cmVhbSkKK3sKKwljb25zdCBjaGFyICpmbXQ7CisJbG9uZyB4OworCWludCBpOworCWludCBydiA9IC0xOworCisJLyogVW5saWtlIHB1dHB3ZW50IGFuZCBwdXRncmVudCwgZ2xpYmMgZG9lcyBub3QgY2hlY2sgdGhlIGFyZ3MuICovCisJaWYgKGZwcmludGYoc3RyZWFtLCAiJXM6JXM6IiwgcC0+c3BfbmFtcCwKKwkJCQkocC0+c3BfcHdkcCA/IHAtPnNwX3B3ZHAgOiAiIikpIDwgMAorCSkgeworCQlnb3RvIERPX1VOTE9DSzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHB1dF9zcF9vZmYpOyBpKyspIHsKKwkJZm10ID0gIiVsZDoiOworCQl4ID0gKihsb25nICopKChjaGFyICopcCArIHB1dF9zcF9vZmZbaV0pOworCQlpZiAoeCA9PSAtMSkgeworCQkJZm10ICs9IDM7CisJCX0KKwkJaWYgKGZwcmludGYoc3RyZWFtLCBmbXQsIHgpIDwgMCkgeworCQkJZ290byBET19VTkxPQ0s7CisJCX0KKwl9CisKKwlpZiAoKHAtPnNwX2ZsYWcgIT0gfjBVTCkgJiYgKGZwcmludGYoc3RyZWFtLCAiJWx1IiwgcC0+c3BfZmxhZykgPCAwKSkgeworCQlnb3RvIERPX1VOTE9DSzsKKwl9CisKKwlpZiAoZnB1dGMoJ1xuJywgc3RyZWFtKSA+IDApIHsKKwkJcnYgPSAwOworCX0KKworIERPX1VOTE9DSzoKKwlyZXR1cm4gcnY7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBVU0VfQkJfU0hBRE9XICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJuYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHdfb2ZmW10gQUxJR04xID0geworCW9mZnNldG9mKHN0cnVjdCBwYXNzd2QsIHB3X25hbWUpLCAgICAgICAvKiAwICovCisJb2Zmc2V0b2Yoc3RydWN0IHBhc3N3ZCwgcHdfcGFzc3dkKSwgICAgIC8qIDEgKi8KKwlvZmZzZXRvZihzdHJ1Y3QgcGFzc3dkLCBwd191aWQpLCAgICAgICAgLyogMiAtIG5vdCBhIGNoYXIgcHRyICovCisJb2Zmc2V0b2Yoc3RydWN0IHBhc3N3ZCwgcHdfZ2lkKSwgICAgICAgIC8qIDMgLSBub3QgYSBjaGFyIHB0ciAqLworCW9mZnNldG9mKHN0cnVjdCBwYXNzd2QsIHB3X2dlY29zKSwgICAgICAvKiA0ICovCisJb2Zmc2V0b2Yoc3RydWN0IHBhc3N3ZCwgcHdfZGlyKSwgICAgICAgIC8qIDUgKi8KKwlvZmZzZXRvZihzdHJ1Y3QgcGFzc3dkLCBwd19zaGVsbCkgICAgICAgLyogNiAqLworfTsKKworc3RhdGljIGludCBGQVNUX0ZVTkMgYmJfX3BhcnNlcHdlbnQodm9pZCAqZGF0YSwgY2hhciAqbGluZSkKK3sKKwljaGFyICplbmRwdHI7CisJY2hhciAqcDsKKwlpbnQgaTsKKworCWkgPSAwOworCXdoaWxlICgxKSB7CisJCXAgPSAoY2hhciAqKSBkYXRhICsgcHdfb2ZmW2ldOworCisJCWlmIChpIDwgMiB8fCBpID4gMykgeworCQkJKigoY2hhciAqKikgcCkgPSBsaW5lOworCQkJaWYgKGkgPT0gNikgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogTk9URTogZ2xpYmMgZGlmZmVyZW5jZSAtIGdsaWJjIGFsbG93cyBvbWlzc2lvbiBvZgorCQkJICogJzonIHNlcGVyYXRvcnMgYWZ0ZXIgdGhlIGdpZCBmaWVsZCBpZiBhbGwgcmVtYWluaW5nCisJCQkgKiBlbnRyaWVzIGFyZSBlbXB0eS4gIFdlIHJlcXVpcmUgYWxsIHNlcGFyYXRvcnMuICovCisJCQlsaW5lID0gc3RyY2hyKGxpbmUsICc6Jyk7CisJCQlpZiAoIWxpbmUpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgdCA9IHN0cnRvdWwobGluZSwgJmVuZHB0ciwgMTApOworCQkJLyogTWFrZSBzdXJlIHdlIGhhZCBhdCBsZWFzdCBvbmUgZGlnaXQsIGFuZCB0aGF0IHRoZQorCQkJICogZmFpbGluZyBjaGFyIGlzIHRoZSBuZXh0IGZpZWxkIHNlcGVyYXRvciAnOicuICBTZWUKKwkJCSAqIGdsaWJjIGRpZmZlcmVuY2Ugbm90ZSBhYm92ZS4gKi8KKwkJCS8qIFRPRE86IEFsc28gY2hlY2sgZm9yIGxlYWRpbmcgd2hpdGVzcGFjZT8gKi8KKwkJCWlmICgoZW5kcHRyID09IGxpbmUpIHx8ICgqZW5kcHRyICE9ICc6JykpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxpbmUgPSBlbmRwdHI7CisJCQlpZiAoaSAmIDEpIHsJCS8qIGkgPT0gMyAtLSBnaWQgKi8KKwkJCQkqKChnaWRfdCAqKSBwKSA9IHQ7CisJCQl9IGVsc2UgewkJCS8qIGkgPT0gMiAtLSB1aWQgKi8KKwkJCQkqKCh1aWRfdCAqKSBwKSA9IHQ7CisJCQl9CisJCX0KKworCQkqbGluZSsrID0gJ1wwJzsKKwkJaSsrOworCX0gLyogd2hpbGUgKDEpICovCisKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBncl9vZmZbXSBBTElHTjEgPSB7CisJb2Zmc2V0b2Yoc3RydWN0IGdyb3VwLCBncl9uYW1lKSwgICAgICAgIC8qIDAgKi8KKwlvZmZzZXRvZihzdHJ1Y3QgZ3JvdXAsIGdyX3Bhc3N3ZCksICAgICAgLyogMSAqLworCW9mZnNldG9mKHN0cnVjdCBncm91cCwgZ3JfZ2lkKSAgICAgICAgICAvKiAyIC0gbm90IGEgY2hhciBwdHIgKi8KK307CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJiX19wYXJzZWdyZW50KHZvaWQgKmRhdGEsIGNoYXIgKmxpbmUpCit7CisJY2hhciAqZW5kcHRyOworCWNoYXIgKnA7CisJaW50IGk7CisJY2hhciAqKm1lbWJlcnM7CisJY2hhciAqZW5kX29mX2J1ZjsKKworCWVuZF9vZl9idWYgPSAoKHN0cnVjdCBncm91cCAqKSBkYXRhKS0+Z3JfbmFtZTsgLyogRXZpbCBoYWNrISAqLworCWkgPSAwOworCXdoaWxlICgxKSB7CisJCXAgPSAoY2hhciAqKSBkYXRhICsgZ3Jfb2ZmW2ldOworCisJCWlmIChpIDwgMikgeworCQkJKigoY2hhciAqKikgcCkgPSBsaW5lOworCQkJbGluZSA9IHN0cmNocihsaW5lLCAnOicpOworCQkJaWYgKCFsaW5lKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqbGluZSsrID0gJ1wwJzsKKwkJCWkrKzsKKwkJfSBlbHNlIHsKKwkJCSooKGdpZF90ICopIHApID0gc3RydG91bChsaW5lLCAmZW5kcHRyLCAxMCk7CisKKwkJCS8qIE5PVEU6IGdsaWJjIGRpZmZlcmVuY2UgLSBnbGliYyBhbGxvd3Mgb21pc3Npb24gb2YgdGhlCisJCQkgKiB0cmFpbGluZyBjb2xvbiB3aGVuIHRoZXJlIGlzIG5vIG1lbWJlciBsaXN0LiAgV2UgdHJlYXQKKwkJCSAqIHRoaXMgYXMgYW4gZXJyb3IuICovCisKKwkJCS8qIE1ha2Ugc3VyZSB3ZSBoYWQgYXQgbGVhc3Qgb25lIGRpZ2l0LCBhbmQgdGhhdCB0aGUKKwkJCSAqIGZhaWxpbmcgY2hhciBpcyB0aGUgbmV4dCBmaWVsZCBzZXBlcmF0b3IgJzonLiAgU2VlCisJCQkgKiBnbGliYyBkaWZmZXJlbmNlIG5vdGUgYWJvdmUuICovCisJCQlpZiAoKGVuZHB0ciA9PSBsaW5lKSB8fCAoKmVuZHB0ciAhPSAnOicpKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWkgPSAxOwkJCQkvKiBDb3VudCB0ZXJtaW5hdGluZyBOVUxMIHB0ci4gKi8KKwkJCXAgPSBlbmRwdHI7CisKKwkJCWlmIChwWzFdKSB7IC8qIFdlIGhhdmUgYSBtZW1iZXIgbGlzdCB0byBwcm9jZXNzLiAqLworCQkJCS8qIE92ZXJ3cml0ZSB0aGUgbGFzdCAnOicgd2l0aCBhICcsJyBiZWZvcmUgY291bnRpbmcuCisJCQkJICogVGhpcyBhbGxvd3MgdXMgdG8gKDEpIHRlc3QgZm9yIGluaXRpYWwgJywnCisJCQkJICogYW5kICgyKSBhZGRzIG9uZSAnLCcgc28gdGhhdCB0aGUgbnVtYmVyIG9mIGNvbW1hcworCQkJCSAqIGVxdWFscyB0aGUgbWVtYmVyIGNvdW50LiAqLworCQkJCSpwID0gJywnOworCQkJCWRvIHsKKwkJCQkJLyogTk9URTogZ2xpYmMgZGlmZmVyZW5jZSAtIGdsaWJjIGFsbG93cyBhbmQgdHJpbXMgbGVhZGluZworCQkJCQkgKiAoYnV0IG5vdCB0cmFpbGluZykgc3BhY2UuICBXZSB0cmVhdCB0aGlzIGFzIGFuIGVycm9yLiAqLworCQkJCQkvKiBOT1RFOiBnbGliYyBkaWZmZXJlbmNlIC0gZ2xpYmMgYWxsb3dzIGNvbnNlY3V0aXZlIGFuZAorCQkJCQkgKiB0cmFpbGluZyBjb21tYXMsIGFuZCBpZ25vcmVzICJlbXB0eSBzdHJpbmciIHVzZXJzLiAgV2UKKwkJCQkJICogdHJlYXQgdGhpcyBhcyBhbiBlcnJvci4gKi8KKwkJCQkJaWYgKCpwID09ICcsJykgeworCQkJCQkJKytpOworCQkJCQkJKnAgPSAwOwkvKiBudWwtdGVybWluYXRlIGVhY2ggbWVtYmVyIHN0cmluZy4gKi8KKwkJCQkJCWlmICghKisrcCB8fCAoKnAgPT0gJywnKSB8fCBpc3NwYWNlKCpwKSkgeworCQkJCQkJCWdvdG8gRVJSOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSB3aGlsZSAoKisrcCk7CisJCQl9CisKKwkJCS8qIE5vdyBhbGlnbiAocCsxKSwgcm91bmRpbmcgdXAuICovCisJCQkvKiBBc3N1bWVzIHNpemVvZihjaGFyICoqKSBpcyBhIHBvd2VyIG9mIDIuICovCisJCQltZW1iZXJzID0gKGNoYXIgKiopKCAoKChpbnRwdHJfdCkgcCkgKyBzaXplb2YoY2hhciAqKikpCisJCQkJCQkJCSAmIH4oKGludHB0cl90KShzaXplb2YoY2hhciAqKikgLSAxKSkgKTsKKworCQkJaWYgKCgoY2hhciAqKShtZW1iZXJzICsgaSkpID4gZW5kX29mX2J1ZikgewkvKiBObyBzcGFjZS4gKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJKChzdHJ1Y3QgZ3JvdXAgKikgZGF0YSktPmdyX21lbSA9IG1lbWJlcnM7CisKKwkJCWlmICgtLWkpIHsKKwkJCQlwID0gZW5kcHRyOwkvKiBQb2ludGluZyB0byBjaGFyIHByaW9yIHRvIGZpcnN0IG1lbWJlci4gKi8KKwkJCQl3aGlsZSAoMSkgeworCQkJCQkqbWVtYmVycysrID0gKytwOworCQkJCQlpZiAoIS0taSkKKwkJCQkJCWJyZWFrOworCQkJCQl3aGlsZSAoKisrcCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCSptZW1iZXJzID0gTlVMTDsKKworCQkJcmV0dXJuIDA7CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworCisgRVJSOgorCXJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3Bfb2ZmW10gQUxJR04xID0geworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9uYW1wKSwgICAgICAgICAvKiAwOiBjaGFyKiAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9wd2RwKSwgICAgICAgICAvKiAxOiBjaGFyKiAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9sc3RjaGcpLCAgICAgICAvKiAyOiBsb25nICovCisJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX21pbiksICAgICAgICAgIC8qIDM6IGxvbmcgKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfbWF4KSwgICAgICAgICAgLyogNDogbG9uZyAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF93YXJuKSwgICAgICAgICAvKiA1OiBsb25nICovCisJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX2luYWN0KSwgICAgICAgIC8qIDY6IGxvbmcgKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfZXhwaXJlKSwgICAgICAgLyogNzogbG9uZyAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9mbGFnKSAgICAgICAgICAvKiA4OiB1bnNpZ25lZCBsb25nICovCit9OworCitzdGF0aWMgaW50IEZBU1RfRlVOQyBiYl9fcGFyc2VzcGVudCh2b2lkICpkYXRhLCBjaGFyICpsaW5lKQoreworCWNoYXIgKmVuZHB0cjsKKwljaGFyICpwOworCWludCBpOworCisJaSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJcCA9IChjaGFyICopIGRhdGEgKyBzcF9vZmZbaV07CisJCWlmIChpIDwgMikgeworCQkJKigoY2hhciAqKikgcCkgPSBsaW5lOworCQkJbGluZSA9IHN0cmNocihsaW5lLCAnOicpOworCQkJaWYgKCFsaW5lKSB7CisJCQkJYnJlYWs7IC8qIGVycm9yICovCisJCQl9CisJCX0gZWxzZSB7CisJCQkqKChsb25nICopIHApID0gc3RydG91bChsaW5lLCAmZW5kcHRyLCAxMCk7CisJCQlpZiAoZW5kcHRyID09IGxpbmUpIHsKKwkJCQkqKChsb25nICopIHApID0gLTFMOworCQkJfQorCQkJbGluZSA9IGVuZHB0cjsKKwkJCWlmIChpID09IDgpIHsKKwkJCQlpZiAoKmxpbmUgIT0gJ1wwJykgeworCQkJCQlicmVhazsgLyogZXJyb3IgKi8KKwkJCQl9CisJCQkJcmV0dXJuIDA7IC8qIGFsbCBvayAqLworCQkJfQorCQkJaWYgKCpsaW5lICE9ICc6JykgeworCQkJCWJyZWFrOyAvKiBlcnJvciAqLworCQkJfQorCQl9CisJCSpsaW5lKysgPSAnXDAnOworCQlpKys7CisJfQorCisJcmV0dXJuIEVJTlZBTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVhZHMgdW50aWwgRU9GLCBvciB1bnRpbCBpdCBmaW5kcyBhIGxpbmUgd2hpY2ggZml0cyBpbiB0aGUgYnVmZmVyCisgKiBhbmQgZm9yIHdoaWNoIHRoZSBwYXJzZXIgZnVuY3Rpb24gc3VjY2VlZHMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIEVOT0VOVCBmb3IgZW5kLW9mLWZpbGUgKGdsaWJjIGNvbnZlbnRpb24pLgorICovCitzdGF0aWMgaW50IGJiX19wZ3NyZWFkZXIoCisJCWludCBGQVNUX0ZVTkMgKCpwYXJzZXJmdW5jKSh2b2lkICpkLCBjaGFyICpsaW5lKSwKKwkJdm9pZCAqZGF0YSwKKwkJY2hhciAqX19yZXN0cmljdCBsaW5lX2J1ZmYsCisJCXNpemVfdCBidWZsZW4sCisJCUZJTEUgKmYpCit7CisJaW50IHNraXA7CisJaW50IHJ2ID0gRVJBTkdFOworCisJaWYgKGJ1ZmxlbiA8IFBXRF9CVUZGRVJfU0laRSkgeworCQllcnJubyA9IHJ2OworCQlyZXR1cm4gcnY7CisJfQorCisJc2tpcCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCFmZ2V0cyhsaW5lX2J1ZmYsIGJ1ZmxlbiwgZikpIHsKKwkJCWlmIChmZW9mKGYpKSB7CisJCQkJcnYgPSBFTk9FTlQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCXsKKwkJCWludCBsaW5lX2xlbiA9IHN0cmxlbihsaW5lX2J1ZmYpIC0gMTsKKwkJCWlmIChsaW5lX2xlbiA+PSAwICYmIGxpbmVfYnVmZltsaW5lX2xlbl0gPT0gJ1xuJykgeworCQkJCWxpbmVfYnVmZltsaW5lX2xlbl0gPSAnXDAnOworCQkJfSBlbHNlCisJCQlpZiAobGluZV9sZW4gKyAyID09IGJ1ZmxlbikgeworCQkJCS8qIEEgc3RhcnQgKG9yIGNvbnRpbnVhdGlvbikgb2Ygb3ZlcmxvbmcgbGluZSAqLworCQkJCXNraXAgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSAvKiBlbHNlOiBhIGxhc3QgbGluZSBpbiB0aGUgZmlsZSwgYW5kIGl0IGhhcyBubyAnXG4nICovCisJCX0KKworCQlpZiAoc2tpcCkgeworCQkJLyogVGhpcyAibGluZSIgaXMgYSByZW1haW5kZXIgb2Ygb3ZlcmxvbmcgbGluZSwgaWdub3JlICovCisJCQlza2lwID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTk9URTogZ2xpYmMgZGlmZmVyZW5jZSAtIGdsaWJjIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbQorCQkgKiByZWNvcmRzLiAgV2UgZG8gbm90IGFsbG93IGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KKworCQkvKiBTa2lwIGVtcHR5IGxpbmVzLCBjb21tZW50IGxpbmVzLCBhbmQgbGluZXMgd2l0aCBsZWFkaW5nCisJCSAqIHdoaXRlc3BhY2UuICovCisJCWlmIChsaW5lX2J1ZmZbMF0gIT0gJ1wwJyAmJiBsaW5lX2J1ZmZbMF0gIT0gJyMnICYmICFpc3NwYWNlKGxpbmVfYnVmZlswXSkpIHsKKwkJCWlmIChwYXJzZXJmdW5jID09IGJiX19wYXJzZWdyZW50KSB7CisJCQkJLyogRG8gZXZpbCBncm91cCBoYWNrOgorCQkJCSAqIFRoZSBncm91cCBlbnRyeSBwYXJzaW5nIGZ1bmN0aW9uIG5lZWRzIHRvIGtub3cgd2hlcmUKKwkJCQkgKiB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgc28gdGhhdCBpdCBjYW4gY29uc3RydWN0IHRoZQorCQkJCSAqIGdyb3VwIG1lbWJlciBwdHIgdGFibGUuICovCisJCQkJKChzdHJ1Y3QgZ3JvdXAgKikgZGF0YSktPmdyX25hbWUgPSBsaW5lX2J1ZmYgKyBidWZsZW47CisJCQl9CisJCQlpZiAocGFyc2VyZnVuYyhkYXRhLCBsaW5lX2J1ZmYpID09IDApIHsKKwkJCQlydiA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworCisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbGlicHdkZ3JwL3B3ZF9ncnBfaW50ZXJuYWwuYyBiL2J1c3lib3gtMS4xOS4zL2xpYnB3ZGdycC9wd2RfZ3JwX2ludGVybmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ODNiZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xpYnB3ZGdycC9wd2RfZ3JwX2ludGVybmFsLmMKQEAgLTAsMCArMSw2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMDMgICAgIE1hbnVlbCBOb3ZvYSBJSUkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIE5vdiA2LCAyMDAzICBJbml0aWFsIHZlcnNpb24uCisgKgorICogTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBxdWl0ZSBzdHJpY3QgYWJvdXQgcmVxdWlyaW5nIGFsbAorICogICAgZmllbGQgc2VwZXJhdG9ycy4gIEl0IGFsc28gZG9lcyBub3QgYWxsb3cgbGVhZGluZyB3aGl0ZXNwYWNlCisgKiAgICBleGNlcHQgd2hlbiBwcm9jZXNzaW5nIHRoZSBudW1lcmljIGZpZWxkcy4gIGdsaWJjIGlzIG1vcmUKKyAqICAgIGxlbmllbnQuICBTZWUgdGhlIHZhcmlvdXMgZ2xpYmMgZGlmZmVyZW5jZSBjb21tZW50cyBiZWxvdy4KKyAqCisgKiBUT0RPOgorICogICAgTW92ZSB0byBkeW5hbWljIGFsbG9jYXRpb24gb2YgKGN1cnJlbnRseSBzdGF0aWNhbGx5IGFsbG9jYXRlZCkKKyAqICAgICAgYnVmZmVyczsgZXNwZWNpYWxseSBmb3IgdGhlIGdyb3VwLXJlbGF0ZWQgZnVuY3Rpb25zIHNpbmNlCisgKiAgICAgIGxhcmdlIGdyb3VwIG1lbWJlciBsaXN0cyB3aWxsIGNhdXNlIGVycm9yIHJldHVybnMuCisgKi8KKworI2lmbmRlZiBHRVRYWEtFWV9SX0ZVTkMKKyNlcnJvciBHRVRYWEtFWV9SX0ZVTkMgaXMgbm90IGRlZmluZWQhCisjZW5kaWYKKworaW50IEdFVFhYS0VZX1JfRlVOQyhHRVRYWEtFWV9SX0tFWVRZUEUga2V5LAorCQkJCUdFVFhYS0VZX1JfRU5UVFlQRSAqX19yZXN0cmljdCByZXN1bHRidWYsCisJCQkJY2hhciAqX19yZXN0cmljdCBidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCQkJR0VUWFhLRVlfUl9FTlRUWVBFICoqX19yZXN0cmljdCByZXN1bHQpCit7CisJRklMRSAqc3RyZWFtOworCWludCBydjsKKworCSpyZXN1bHQgPSBOVUxMOworCisJc3RyZWFtID0gZm9wZW5fZm9yX3JlYWQoR0VUWFhLRVlfUl9QQVRITkFNRSk7CisJaWYgKCFzdHJlYW0pCisJCXJldHVybiBlcnJubzsKKwl3aGlsZSAoMSkgeworCQlydiA9IGJiX19wZ3NyZWFkZXIoR0VUWFhLRVlfUl9QQVJTRVIsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBidWZsZW4sIHN0cmVhbSk7CisJCWlmICghcnYpIHsKKwkJCWlmIChHRVRYWEtFWV9SX1RFU1QocmVzdWx0YnVmKSkgeyAvKiBmb3VuZCBrZXk/ICovCisJCQkJKnJlc3VsdCA9IHJlc3VsdGJ1ZjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChydiA9PSBFTk9FTlQpIHsgIC8qIEVPRiBlbmNvdW50ZXJlZCAqLworCQkJCXJ2ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCWZjbG9zZShzdHJlYW0pOworCisJcmV0dXJuIHJ2OworfQorCisjdW5kZWYgR0VUWFhLRVlfUl9GVU5DCisjdW5kZWYgR0VUWFhLRVlfUl9QQVJTRVIKKyN1bmRlZiBHRVRYWEtFWV9SX0VOVFRZUEUKKyN1bmRlZiBHRVRYWEtFWV9SX1RFU1QKKyN1bmRlZiBHRVRYWEtFWV9SX0tFWVRZUEUKKyN1bmRlZiBHRVRYWEtFWV9SX1BBVEhOQU1FCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9saWJwd2RncnAvdWlkZ2lkX2dldC5jIGIvYnVzeWJveC0xLjE5LjMvbGlicHdkZ3JwL3VpZGdpZF9nZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg4YmUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbGlicHdkZ3JwL3VpZGdpZF9nZXQuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBHZXJyaXQgUGFwZQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCitFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKK09SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKK0FEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEFsd2F5cyBzZXRzIHVpZCBhbmQgZ2lkICovCitpbnQgRkFTVF9GVU5DIGdldF91aWRnaWQoc3RydWN0IGJiX3VpZGdpZF90ICp1LCBjb25zdCBjaGFyICp1ZywgaW50IG51bWVyaWNfb2spCit7CisJc3RydWN0IHBhc3N3ZCAqcHdkOworCXN0cnVjdCBncm91cCAqZ3I7CisJY2hhciAqdXNlciwgKmdyb3VwOworCXVuc2lnbmVkIG47CisKKwl1c2VyID0gKGNoYXIqKXVnOworCWdyb3VwID0gc3RyY2hyKHVnLCAnOicpOworCWlmIChncm91cCkgeworCQlpbnQgc3ogPSAoKytncm91cCkgLSB1ZzsKKwkJdXNlciA9IGFsbG9jYShzeik7CisJCS8qIGNvcGllcyBzei0xIGJ5dGVzLCBzdG9yZXMgdGVybWluYXRpbmcgJ1wwJyAqLworCQlzYWZlX3N0cm5jcHkodXNlciwgdWcsIHN6KTsKKwl9CisJaWYgKG51bWVyaWNfb2spIHsKKwkJbiA9IGJiX3N0cnRvdSh1c2VyLCBOVUxMLCAxMCk7CisJCWlmICghZXJybm8pIHsKKwkJCXUtPnVpZCA9IG47CisJCQlwd2QgPSBnZXRwd3VpZChuKTsKKwkJCS8qIElmIHdlIGhhdmUgZS5nLiAiNTAwIiBzdHJpbmcgd2l0aG91dCB1c2VyICovCisJCQkvKiB3aXRoIHVpZCA1MDAgaW4gL2V0Yy9wYXNzd2QsIHdlIHNldCBnaWQgPT0gdWlkICovCisJCQl1LT5naWQgPSBwd2QgPyBwd2QtPnB3X2dpZCA6IG47CisJCQlnb3RvIHNraXA7CisJCX0KKwl9CisJLyogRWl0aGVyIGl0IGlzIG5vdCBudW1lcmljLCBvciBjYWxsZXIgZGlzYWxsb3dzIG51bWVyaWMgdXNlcm5hbWUgKi8KKwlwd2QgPSBnZXRwd25hbSh1c2VyKTsKKwlpZiAoIXB3ZCkKKwkJcmV0dXJuIDA7CisJdS0+dWlkID0gcHdkLT5wd191aWQ7CisJdS0+Z2lkID0gcHdkLT5wd19naWQ7CisKKyBza2lwOgorCWlmIChncm91cCkgeworCQlpZiAobnVtZXJpY19vaykgeworCQkJbiA9IGJiX3N0cnRvdShncm91cCwgTlVMTCwgMTApOworCQkJaWYgKCFlcnJubykgeworCQkJCXUtPmdpZCA9IG47CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwkJZ3IgPSBnZXRncm5hbShncm91cCk7CisJCWlmICghZ3IpCisJCQlyZXR1cm4gMDsKKwkJdS0+Z2lkID0gZ3ItPmdyX2dpZDsKKwl9CisJcmV0dXJuIDE7Cit9Cit2b2lkIEZBU1RfRlVOQyB4Z2V0X3VpZGdpZChzdHJ1Y3QgYmJfdWlkZ2lkX3QgKnUsIGNvbnN0IGNoYXIgKnVnKQoreworCWlmICghZ2V0X3VpZGdpZCh1LCB1ZywgMSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHVzZXIvZ3JvdXAgJXMiLCB1Zyk7Cit9CisKKy8qIGNob3duLWxpa2U6CisgKiAidXNlciIgc2V0cyB1aWQgb25seSwKKyAqICI6Z3JvdXAiIHNldHMgZ2lkIG9ubHkKKyAqICJ1c2VyOiIgc2V0cyB1aWQgYW5kIGdpZCAodG8gdXNlcidzIHByaW1hcnkgZ3JvdXAgaWQpCisgKiAidXNlcjpncm91cCIgc2V0cyB1aWQgYW5kIGdpZAorICogKCd1bnNldCcgdWlkIG9yIGdpZCByZXRhaW5zIHRoZSB2YWx1ZSBpdCBoYXMgb24gZW50cnkpCisgKi8KK3ZvaWQgRkFTVF9GVU5DIHBhcnNlX2Nob3duX3VzZXJncm91cF9vcl9kaWUoc3RydWN0IGJiX3VpZGdpZF90ICp1LCBjaGFyICp1c2VyX2dyb3VwKQoreworCWNoYXIgKmdyb3VwOworCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBncm91cCBuYW1lICovCisJZ3JvdXAgPSBzdHJjaHIodXNlcl9ncm91cCwgJy4nKTsgLyogZGVwcmVjYXRlZD8gKi8KKwlpZiAoIWdyb3VwKQorCQlncm91cCA9IHN0cmNocih1c2VyX2dyb3VwLCAnOicpOworCWVsc2UKKwkJKmdyb3VwID0gJzonOyAvKiByZXBsYWNlICcuJyB3aXRoICc6JyAqLworCisJLyogUGFyc2UgInVzZXJbOltncm91cF1dIiAqLworCWlmICghZ3JvdXApIHsgLyogInVzZXIiICovCisJCXUtPnVpZCA9IGdldF91Z19pZCh1c2VyX2dyb3VwLCB4dW5hbWUydWlkKTsKKwl9IGVsc2UgaWYgKGdyb3VwID09IHVzZXJfZ3JvdXApIHsgLyogIjpncm91cCIgKi8KKwkJdS0+Z2lkID0gZ2V0X3VnX2lkKGdyb3VwICsgMSwgeGdyb3VwMmdpZCk7CisJfSBlbHNlIHsKKwkJaWYgKCFncm91cFsxXSkgLyogInVzZXI6IiAqLworCQkJKmdyb3VwID0gJ1wwJzsKKwkJeGdldF91aWRnaWQodSwgdXNlcl9ncm91cCk7CisJfQorfQorCisjaWYgMAorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbigpCit7CisJdW5zaWduZWQgdTsKKwlzdHJ1Y3QgYmJfdWlkZ2lkX3QgdWc7CisJdSA9IGdldF91aWRnaWQoJnVnLCAiYXBhY2hlIiwgMCk7CisJcHJpbnRmKCIldSA9ICV1OiV1XG4iLCB1LCB1Zy51aWQsIHVnLmdpZCk7CisJdWcudWlkID0gdWcuZ2lkID0gMTExMTsKKwl1ID0gZ2V0X3VpZGdpZCgmdWcsICJhcGFjaGUiLCAwKTsKKwlwcmludGYoIiV1ID0gJXU6JXVcbiIsIHUsIHVnLnVpZCwgdWcuZ2lkKTsKKwl1Zy51aWQgPSB1Zy5naWQgPSAxMTExOworCXUgPSBnZXRfdWlkZ2lkKCZ1ZywgImFwYWNoZTp1c2VycyIsIDApOworCXByaW50ZigiJXUgPSAldToldVxuIiwgdSwgdWcudWlkLCB1Zy5naWQpOworCXVnLnVpZCA9IHVnLmdpZCA9IDExMTE7CisJdSA9IGdldF91aWRnaWQoJnVnLCAiYXBhY2hlOnVzZXJzIiwgMCk7CisJcHJpbnRmKCIldSA9ICV1OiV1XG4iLCB1LCB1Zy51aWQsIHVnLmdpZCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvQ29uZmlnLnNyYyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDdmNTBjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMzEzIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBGRUFUVVJFX1NIQURPV1BBU1NXRFMKKwlib29sICJTdXBwb3J0IGZvciBzaGFkb3cgcGFzc3dvcmRzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1aWxkIHN1cHBvcnQgZm9yIHNoYWRvdyBwYXNzd29yZCBpbiAvZXRjL3NoYWRvdy4gVGhpcyBmaWxlIGlzIG9ubHkKKwkgIHJlYWRhYmxlIGJ5IHJvb3QgYW5kIHRodXMgdGhlIGVuY3J5cHRlZCBwYXNzd29yZHMgYXJlIG5vIGxvbmdlcgorCSAgcHVibGljbHkgcmVhZGFibGUuCisKK2NvbmZpZyBVU0VfQkJfUFdEX0dSUAorCWJvb2wgIlVzZSBpbnRlcm5hbCBwYXNzd29yZCBhbmQgZ3JvdXAgZnVuY3Rpb25zIHJhdGhlciB0aGFuIHN5c3RlbSBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzIHBhc3N3b3JkCisJICBhbmQgZ3JvdXAgZnVuY3Rpb25zLiBBbmQgaWYgeW91IGFyZSB1c2luZyB0aGUgR05VIEMgbGlicmFyeQorCSAgKGdsaWJjKSwgeW91IHdpbGwgdGhlbiBuZWVkIHRvIGluc3RhbGwgdGhlIC9ldGMvbnNzd2l0Y2guY29uZgorCSAgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB0aGUgcmVxdWlyZWQgL2xpYi9saWJuc3NfKiBsaWJyYXJpZXMgaW4KKwkgIG9yZGVyIGZvciB0aGUgcGFzc3dvcmQgYW5kIGdyb3VwIGZ1bmN0aW9ucyB0byB3b3JrLiBUaGlzIGdlbmVyYWxseQorCSAgbWFrZXMgeW91ciBlbWJlZGRlZCBzeXN0ZW0gcXVpdGUgYSBiaXQgbGFyZ2VyLgorCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGNhdXNlIGJ1c3lib3ggdG8gZGlyZWN0bHkgYWNjZXNzIHRoZQorCSAgc3lzdGVtJ3MgL2V0Yy9wYXNzd29yZCwgL2V0Yy9ncm91cCBmaWxlcyAoYW5kIHlvdXIgc3lzdGVtIHdpbGwgYmUKKwkgIHNtYWxsZXIsIGFuZCBJIHdpbGwgZ2V0IGZld2VyIGVtYWlscyBhc2tpbmcgYWJvdXQgaG93IGdsaWJjIE5TUworCSAgd29ya3MpLiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZQorCSAgUEFNIHRvIGFjY2VzcyByZW1vdGUgTERBUCBwYXNzd29yZCBzZXJ2ZXJzIGFuZCB3aGF0bm90LiBBbmQgaWYgeW91CisJICB3YW50IGhvc3RuYW1lIHJlc29sdXRpb24gdG8gd29yayB3aXRoIGdsaWJjLCB5b3Ugc3RpbGwgbmVlZCB0aGUKKwkgIC9saWIvbGlibnNzXyogbGlicmFyaWVzLgorCisJICBJZiB5b3UgbmVlZCB0byB1c2UgZ2xpYmMncyBuc3N3aXRjaC5jb25mIG1lY2hhbmlzbQorCSAgKGUuZy4gaWYgdXNlci9ncm91cCBkYXRhYmFzZSBpcyBOT1Qgc3RvcmVkIGluIC9ldGMvcGFzc3dkIGV0YyksCisJICB5b3UgbXVzdCBOT1QgdXNlIHRoaXMgb3B0aW9uLgorCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgb3B0aW9uLCBpdCB3aWxsIGFkZCBhYm91dCAxLjVrLgorCitjb25maWcgVVNFX0JCX1NIQURPVworCWJvb2wgIlVzZSBpbnRlcm5hbCBzaGFkb3cgcGFzc3dvcmQgZnVuY3Rpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVVNFX0JCX1BXRF9HUlAgJiYgRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJaGVscAorCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzIHNoYWRvdworCSAgcGFzc3dvcmQgaGFuZGxpbmcgZnVuY3Rpb25zLiBBbmQgaWYgeW91IGFyZSB1c2luZyB0aGUgR05VIEMgbGlicmFyeQorCSAgKGdsaWJjKSwgeW91IHdpbGwgdGhlbiBuZWVkIHRvIGluc3RhbGwgdGhlIC9ldGMvbnNzd2l0Y2guY29uZgorCSAgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB0aGUgcmVxdWlyZWQgL2xpYi9saWJuc3NfKiBsaWJyYXJpZXMgaW4KKwkgIG9yZGVyIGZvciB0aGUgc2hhZG93IHBhc3N3b3JkIGZ1bmN0aW9ucyB0byB3b3JrLiBUaGlzIGdlbmVyYWxseQorCSAgbWFrZXMgeW91ciBlbWJlZGRlZCBzeXN0ZW0gcXVpdGUgYSBiaXQgbGFyZ2VyLgorCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGNhdXNlIGJ1c3lib3ggdG8gZGlyZWN0bHkgYWNjZXNzIHRoZQorCSAgc3lzdGVtJ3MgL2V0Yy9zaGFkb3cgZmlsZSB3aGVuIGhhbmRsaW5nIHNoYWRvdyBwYXNzd29yZHMuIFRoaXMKKwkgIG1ha2VzIHlvdXIgc3lzdGVtIHNtYWxsZXIgKGFuZCBJIHdpbGwgZ2V0IGZld2VyIGVtYWlscyBhc2tpbmcgYWJvdXQKKwkgIGhvdyBnbGliYyBOU1Mgd29ya3MpLiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHlvdSB3aWxsIG5vdCBiZQorCSAgYWJsZSB0byB1c2UgUEFNIHRvIGFjY2VzcyBzaGFkb3cgcGFzc3dvcmRzIGZyb20gcmVtb3RlIExEQVAKKwkgIHBhc3N3b3JkIHNlcnZlcnMgYW5kIHdoYXRub3QuCisKK2NvbmZpZyBVU0VfQkJfQ1JZUFQKKwlib29sICJVc2UgaW50ZXJuYWwgY3J5cHQgZnVuY3Rpb25zIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1c3lib3ggaGFzIGludGVybmFsIERFUyBhbmQgTUQ1IGNyeXB0IGZ1bmN0aW9ucy4KKwkgIFRoZXkgcHJvZHVjZSByZXN1bHRzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gY29ycmVzcG9uZGluZworCSAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucy4KKworCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzCisJICBjcnlwdCBmdW5jdGlvbnMuIE1vc3QgQyBsaWJyYXJpZXMgdXNlIGxhcmdlICh+NzBrKQorCSAgc3RhdGljIGJ1ZmZlcnMgdGhlcmUsIGFuZCBhbHNvIGNvbWJpbmUgdGhlbSB3aXRoIG1vcmUgZ2VuZXJhbAorCSAgREVTIGVuY3J5cHRpb24vZGVjcnlwdGlvbi4KKworCSAgRm9yIGJ1c3lib3gsIGhhdmluZyBsYXJnZSBzdGF0aWMgYnVmZmVycyBpcyB1bmRlc2lyYWJsZSwKKwkgIGVzcGVjaWFsbHkgb24gTk9NTVUgbWFjaGluZXMuIEJ1c3lib3ggYWxzbyBkb2Vzbid0IG5lZWQKKwkgIERFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gYW5kIGNhbiBkbyB3aXRoIHNtYWxsZXIgY29kZS4KKworCSAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiwgaXQgd2lsbCBhZGQgYWJvdXQgNC44ayBvZiBjb2RlCisJICBpZiB5b3UgYXJlIGJ1aWxkaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlLgorCSAgSW4gc3RhdGljIGJ1aWxkLCBpdCBtYWtlcyBjb2RlIF9zbWFsbGVyXyBieSBhYm91dCAxLjJrLAorCSAgYW5kIGxpa2VseSBtYW55IGtpbG9ieXRlcyBsZXNzIG9mIGJzcy4KKworY29uZmlnIFVTRV9CQl9DUllQVF9TSEEKKwlib29sICJFbmFibGUgU0hBMjU2LzUxMiBjcnlwdCBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVU0VfQkJfQ1JZUFQKKwloZWxwCisJICBFbmFibGUgdGhpcyBpZiB5b3UgaGF2ZSBwYXNzd29yZHMgc3RhcnRpbmcgd2l0aCAiJDUkIiBvciAiJDYkIgorCSAgaW4geW91ciAvZXRjL3Bhc3N3ZCBvciAvZXRjL3NoYWRvdyBmaWxlcy4gVGhlc2UgcGFzc3dvcmRzCisJICBhcmUgaGFzaGVkIHVzaW5nIFNIQTI1NiBhbmQgU0hBNTEyIGFsZ29yaXRobXMuIFN1cHBvcnQgZm9yIHRoZW0KKwkgIHdhcyBhZGRlZCB0byBnbGliYyBpbiAyMDA4LgorCSAgV2l0aCB0aGlzIG9wdGlvbiBvZmYsIGxvZ2luIHdpbGwgZmFpbCBwYXNzd29yZCBjaGVjayBmb3IgYW55CisJICB1c2VyIHdoaWNoIGhhcyBwYXNzd29yZCBlbmNyeXB0ZWQgd2l0aCB0aGVzZSBhbGdvcml0aG1zLgorCitjb25maWcgQUREVVNFUgorCWJvb2wgImFkZHVzZXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXRpbGl0eSBmb3IgY3JlYXRpbmcgYSBuZXcgdXNlciBhY2NvdW50LgorCitjb25maWcgRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBRERVU0VSICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgYWRkdXNlciBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX0NIRUNLX05BTUVTCisJYm9vbCAiRW5hYmxlIHNhbml0eSBjaGVjayBvbiB1c2VyL2dyb3VwIG5hbWVzIGluIGFkZHVzZXIgYW5kIGFkZGdyb3VwIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQUREVVNFUiB8fCBBRERHUk9VUAorCWhlbHAKKwkgIEVuYWJsZSBzYW5pdHkgY2hlY2sgb24gdXNlciBhbmQgZ3JvdXAgbmFtZXMgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAuCisJICBUbyBhdm9pZCBwcm9ibGVtcywgdGhlIHVzZXIgb3IgZ3JvdXAgbmFtZSBzaG91bGQgY29uc2lzdCBvbmx5IG9mCisJICBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLCBwZXJpb2RzLCBhdCBzaWducyBhbmQgZGFzaGVzLAorCSAgYW5kIG5vdCBzdGFydCB3aXRoIGEgZGFzaCAoYXMgZGVmaW5lZCBieSBJRUVFIFN0ZCAxMDAzLjEtMjAwMSkuCisJICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNhbWJhIG1hY2hpbmUgYWNjb3VudHMgIiQiIGlzIGFsc28gc3VwcG9ydGVkCisJICBhdCB0aGUgZW5kIG9mIHRoZSB1c2VyIG9yIGdyb3VwIG5hbWUuCisKK2NvbmZpZyBGSVJTVF9TWVNURU1fSUQKKwlpbnQgIkZpcnN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cCIKKwlkZXBlbmRzIG9uIEFERFVTRVIgfHwgQURER1JPVVAKKwlyYW5nZSAwIDY0OTAwCisJZGVmYXVsdCAxMDAKKwloZWxwCisJICBGaXJzdCB2YWxpZCBzeXN0ZW0gdWlkIG9yIGdpZCBmb3IgYWRkdXNlciBhbmQgYWRkZ3JvdXAKKworY29uZmlnIExBU1RfU1lTVEVNX0lECisJaW50ICJMYXN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cCIKKwlkZXBlbmRzIG9uIEFERFVTRVIgfHwgQURER1JPVVAKKwlyYW5nZSAwIDY0OTAwCisJZGVmYXVsdCA5OTkKKwloZWxwCisJICBMYXN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cAorCitjb25maWcgQURER1JPVVAKKwlib29sICJhZGRncm91cCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVdGlsaXR5IGZvciBjcmVhdGluZyBhIG5ldyBncm91cCBhY2NvdW50LgorCitjb25maWcgRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQURER1JPVVAgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBhZGRncm91cCBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAKKwlib29sICJTdXBwb3J0IGZvciBhZGRpbmcgdXNlcnMgdG8gZ3JvdXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQURER1JPVVAKKwloZWxwCisJICBJZiAgY2FsbGVkICB3aXRoIHR3byBub24tb3B0aW9uIGFyZ3VtZW50cywKKwkgIGFkZGdyb3VwIHdpbGwgYWRkIGFuIGV4aXN0aW5nIHVzZXIgdG8gYW4KKwkgIGV4aXN0aW5nIGdyb3VwLgorCitjb25maWcgREVMVVNFUgorCWJvb2wgImRlbHVzZXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXRpbGl0eSBmb3IgZGVsZXRpbmcgYSB1c2VyIGFjY291bnQuCisKK2NvbmZpZyBERUxHUk9VUAorCWJvb2wgImRlbGdyb3VwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFV0aWxpdHkgZm9yIGRlbGV0aW5nIGEgZ3JvdXAgYWNjb3VudC4KKworY29uZmlnIEZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUAorCWJvb2wgIlN1cHBvcnQgZm9yIHJlbW92aW5nIHVzZXJzIGZyb20gZ3JvdXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVMR1JPVVAKKwloZWxwCisJICBJZiBjYWxsZWQgd2l0aCB0d28gbm9uLW9wdGlvbiBhcmd1bWVudHMsIGRlbHVzZXIKKwkgIG9yIGRlbGdyb3VwIHdpbGwgcmVtb3ZlIGFuIHVzZXIgZnJvbSBhIHNwZWNpZmllZCBncm91cC4KKworY29uZmlnIEdFVFRZCisJYm9vbCAiZ2V0dHkiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgZ2V0dHkgbGV0cyB5b3UgbG9nIGluIG9uIGEgdHR5LiBJdCBpcyBub3JtYWxseSBpbnZva2VkIGJ5IGluaXQuCisKKwkgIE5vdGUgdGhhdCB5b3UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgYnkgZGlzYWJsaW5nIGl0IGFuZAorCSAgdXNpbmcgbG9naW4gYXBwbGV0IGRpcmVjdGx5LgorCSAgSWYgeW91IG5lZWQgdG8gcmVzZXQgdHR5IGF0dHJpYnV0ZXMgYmVmb3JlIGNhbGxpbmcgbG9naW4sCisJICB0aGlzIHNjcmlwdCBhcHByb3hpbWF0ZXMgZ2V0dHk6CisKKwkgIGV4ZWMgPC9kZXYvJDEgPi9kZXYvJDEgMj4mMSB8fCBleGl0IDEKKwkgIHJlc2V0CisJICBzdHR5IHNhbmU7IHN0dHkgaXNwZWVkIDM4NDAwOyBzdHR5IG9zcGVlZCAzODQwMAorCSAgcHJpbnRmICIlcyBsb2dpbjogIiAiYGhvc3RuYW1lYCIKKwkgIHJlYWQgLXIgbG9naW4KKwkgIGV4ZWMgL2Jpbi9sb2dpbiAiJGxvZ2luIgorCitjb25maWcgTE9HSU4KKwlib29sICJsb2dpbiIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBsb2dpbiBpcyB1c2VkIHdoZW4gc2lnbmluZyBvbnRvIGEgc3lzdGVtLgorCisJICBOb3RlIHRoYXQgQnVzeWJveCBiaW5hcnkgbXVzdCBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyBhcHBsZXQgdG8KKwkgIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBQQU0KKwlib29sICJTdXBwb3J0IGZvciBQQU0gKFBsdWdnYWJsZSBBdXRoZW50aWNhdGlvbiBNb2R1bGVzKSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIExPR0lOCisJaGVscAorCSAgVXNlIFBBTSBpbiBsb2dpbigxKSBpbnN0ZWFkIG9mIGRpcmVjdCBhY2Nlc3MgdG8gcGFzc3dvcmQgZGF0YWJhc2UuCisKK2NvbmZpZyBMT0dJTl9TQ1JJUFRTCisJYm9vbCAiU3VwcG9ydCBmb3IgbG9naW4gc2NyaXB0cyIKKwlkZXBlbmRzIG9uIExPR0lOCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHRoaXMgaWYgeW91IHdhbnQgbG9naW4gdG8gZXhlY3V0ZSAkTE9HSU5fUFJFX1NVSURfU0NSSVBUCisJICBqdXN0IHByaW9yIHRvIHN3aXRjaGluZyBmcm9tIHJvb3QgdG8gbG9nZ2VkLWluIHVzZXIuCisKK2NvbmZpZyBGRUFUVVJFX05PTE9HSU4KKwlib29sICJTdXBwb3J0IGZvciAvZXRjL25vbG9naW4iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMT0dJTgorCWhlbHAKKwkgIFRoZSBmaWxlIC9ldGMvbm9sb2dpbiBpcyB1c2VkIGJ5IChzb21lIHZlcnNpb25zIG9mKSBsb2dpbigxKS4KKwkgIElmIGl0IGV4aXN0cywgbm9uLXJvb3QgbG9naW5zIGFyZSBwcm9oaWJpdGVkLgorCitjb25maWcgRkVBVFVSRV9TRUNVUkVUVFkKKwlib29sICJTdXBwb3J0IGZvciAvZXRjL3NlY3VyZXR0eSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPR0lOCisJaGVscAorCSAgVGhlIGZpbGUgL2V0Yy9zZWN1cmV0dHkgaXMgdXNlZCBieSAoc29tZSB2ZXJzaW9ucyBvZikgbG9naW4oMSkuCisJICBUaGUgZmlsZSBjb250YWlucyB0aGUgZGV2aWNlIG5hbWVzIG9mIHR0eSBsaW5lcyAob25lIHBlciBsaW5lLAorCSAgd2l0aG91dCBsZWFkaW5nIC9kZXYvKSBvbiB3aGljaCByb290IGlzIGFsbG93ZWQgdG8gbG9naW4uCisKK2NvbmZpZyBQQVNTV0QKKwlib29sICJwYXNzd2QiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgcGFzc3dkIGNoYW5nZXMgcGFzc3dvcmRzIGZvciB1c2VyIGFuZCBncm91cCBhY2NvdW50cy4gQSBub3JtYWwgdXNlcgorCSAgbWF5IG9ubHkgY2hhbmdlIHRoZSBwYXNzd29yZCBmb3IgaGlzL2hlciBvd24gYWNjb3VudCwgdGhlIHN1cGVyIHVzZXIKKwkgIG1heSBjaGFuZ2UgdGhlIHBhc3N3b3JkIGZvciBhbnkgYWNjb3VudC4gVGhlIGFkbWluaXN0cmF0b3Igb2YgYSBncm91cAorCSAgbWF5IGNoYW5nZSB0aGUgcGFzc3dvcmQgZm9yIHRoZSBncm91cC4KKworCSAgTm90ZSB0aGF0IEJ1c3lib3ggYmluYXJ5IG11c3QgYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgYXBwbGV0IHRvCisJICB3b3JrIHByb3Blcmx5LgorCitjb25maWcgRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSworCWJvb2wgIkNoZWNrIG5ldyBwYXNzd29yZHMgZm9yIHdlYWtuZXNzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUEFTU1dECisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBwYXNzd2Qgd2lsbCByZWZ1c2UgbmV3IHBhc3N3b3JkcyB3aGljaCBhcmUgIndlYWsiLgorCitjb25maWcgQ1JZUFRQVworCWJvb2wgImNyeXB0cHciCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5jcnlwdHMgdGhlIGdpdmVuIHBhc3N3b3JkIHdpdGggdGhlIGNyeXB0KDMpIGxpYmMgZnVuY3Rpb24KKwkgIHVzaW5nIHRoZSBnaXZlbiBzYWx0LiBEZWJpYW4gaGFzIHRoaXMgdXRpbGl0eSB1bmRlciBta3Bhc3N3ZAorCSAgbmFtZS4gQnVzeWJveCBwcm92aWRlcyBta3Bhc3N3ZCBhcyBhbiBhbGlhcyBmb3IgY3J5cHRwdy4KKworY29uZmlnIENIUEFTU1dECisJYm9vbCAiY2hwYXNzd2QiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUmVhZHMgYSBmaWxlIG9mIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgcGFpcnMgZnJvbSBzdGFuZGFyZCBpbnB1dAorCSAgYW5kIHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byB1cGRhdGUgYSBncm91cCBvZiBleGlzdGluZyB1c2Vycy4KKworY29uZmlnIFNVCisJYm9vbCAic3UiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgc3UgaXMgdXNlZCB0byBiZWNvbWUgYW5vdGhlciB1c2VyIGR1cmluZyBhIGxvZ2luIHNlc3Npb24uCisJICBJbnZva2VkIHdpdGhvdXQgYSB1c2VybmFtZSwgc3UgZGVmYXVsdHMgdG8gYmVjb21pbmcgdGhlIHN1cGVyIHVzZXIuCisKKwkgIE5vdGUgdGhhdCBCdXN5Ym94IGJpbmFyeSBtdXN0IGJlIHNldHVpZCByb290IGZvciB0aGlzIGFwcGxldCB0bworCSAgd29yayBwcm9wZXJseS4KKworY29uZmlnIEZFQVRVUkVfU1VfU1lTTE9HCisJYm9vbCAiRW5hYmxlIHN1IHRvIHdyaXRlIHRvIHN5c2xvZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNVCisKK2NvbmZpZyBGRUFUVVJFX1NVX0NIRUNLU19TSEVMTFMKKwlib29sICJFbmFibGUgc3UgdG8gY2hlY2sgdXNlcidzIHNoZWxsIHRvIGJlIGxpc3RlZCBpbiAvZXRjL3NoZWxscyIKKwlkZXBlbmRzIG9uIFNVCisJZGVmYXVsdCB5CisKK2NvbmZpZyBTVUxPR0lOCisJYm9vbCAic3Vsb2dpbiIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBzdWxvZ2luIGlzIGludm9rZWQgd2hlbiB0aGUgc3lzdGVtIGdvZXMgaW50byBzaW5nbGUgdXNlcgorCSAgbW9kZSAodGhpcyBpcyBkb25lIHRocm91Z2ggYW4gZW50cnkgaW4gaW5pdHRhYikuCisKK2NvbmZpZyBWTE9DSworCWJvb2wgInZsb2NrIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1aWxkIHRoZSAidmxvY2siIGFwcGxldCB3aGljaCBhbGxvd3MgeW91IHRvIGxvY2sgKHZpcnR1YWwpIHRlcm1pbmFscy4KKworCSAgTm90ZSB0aGF0IEJ1c3lib3ggYmluYXJ5IG11c3QgYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgYXBwbGV0IHRvCisJICB3b3JrIHByb3Blcmx5LgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0MTZhNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDIxIEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19BRERHUk9VUCkJKz0gYWRkZ3JvdXAubworbGliLSQoQ09ORklHX0FERFVTRVIpCSs9IGFkZHVzZXIubworbGliLSQoQ09ORklHX0NSWVBUUFcpCSs9IGNyeXB0cHcubworbGliLSQoQ09ORklHX0NIUEFTU1dEKQkrPSBjaHBhc3N3ZC5vCitsaWItJChDT05GSUdfR0VUVFkpCSs9IGdldHR5Lm8KK2xpYi0kKENPTkZJR19MT0dJTikJKz0gbG9naW4ubworbGliLSQoQ09ORklHX1BBU1NXRCkJKz0gcGFzc3dkLm8KK2xpYi0kKENPTkZJR19TVSkJKz0gc3UubworbGliLSQoQ09ORklHX1NVTE9HSU4pCSs9IHN1bG9naW4ubworbGliLSQoQ09ORklHX1ZMT0NLKQkrPSB2bG9jay5vCitsaWItJChDT05GSUdfREVMVVNFUikJKz0gZGVsdXNlci5vCitsaWItJChDT05GSUdfREVMR1JPVVApCSs9IGRlbHVzZXIubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9hZGQtcmVtb3ZlLXNoZWxsLmMgYi9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL2FkZC1yZW1vdmUtc2hlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE0NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9hZGQtcmVtb3ZlLXNoZWxsLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBhZGQtc2hlbGwgYW5kIHJlbW92ZS1zaGVsbCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgQWxleGFuZGVyIFNoaXNoa2luIDx2aXJ0dW9zb0BzbGluZC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoaXMgc291cmNlIHRyZWUKKyAqIGZvciBkZXRhaWxzLgorICovCisKKy8vYXBwbGV0OklGX0FERF9TSEVMTCggICBBUFBMRVRfT0RETkFNRShhZGQtc2hlbGwgICAsIGFkZF9yZW1vdmVfc2hlbGwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGFkZF9zaGVsbCAgICkpCisvL2FwcGxldDpJRl9SRU1PVkVfU0hFTEwoQVBQTEVUX09ERE5BTUUocmVtb3ZlLXNoZWxsLCBhZGRfcmVtb3ZlX3NoZWxsLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCByZW1vdmVfc2hlbGwpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQUREX1NIRUxMKSAgICArPSBhZGQtcmVtb3ZlLXNoZWxsLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19SRU1PVkVfU0hFTEwpICs9IGFkZC1yZW1vdmUtc2hlbGwubworCisvL2NvbmZpZzpjb25maWcgQUREX1NIRUxMCisvL2NvbmZpZzogICAgICAgYm9vbCAiYWRkLXNoZWxsIgorLy9jb25maWc6ICAgICAgIGRlZmF1bHQgeSBpZiBERVNLVE9QCisvL2NvbmZpZzogICAgICAgaGVscAorLy9jb25maWc6ICAgICAgICAgQWRkIHNoZWxscyB0byAvZXRjL3NoZWxscy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFJFTU9WRV9TSEVMTAorLy9jb25maWc6ICAgICAgIGJvb2wgInJlbW92ZS1zaGVsbCIKKy8vY29uZmlnOiAgICAgICBkZWZhdWx0IHkgaWYgREVTS1RPUAorLy9jb25maWc6ICAgICAgIGhlbHAKKy8vY29uZmlnOiAgICAgICAgIFJlbW92ZSBzaGVsbHMgZnJvbSAvZXRjL3NoZWxscy4KKworLy91c2FnZTojZGVmaW5lIGFkZF9zaGVsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiU0hFTEwuLi4iCisvL3VzYWdlOiNkZWZpbmUgYWRkX3NoZWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQWRkIFNIRUxMcyB0byAvZXRjL3NoZWxscyIKKworLy91c2FnZTojZGVmaW5lIHJlbW92ZV9zaGVsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiU0hFTEwuLi4iCisvL3VzYWdlOiNkZWZpbmUgcmVtb3ZlX3NoZWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVtb3ZlIFNIRUxMcyBmcm9tIC9ldGMvc2hlbGxzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBTSEVMTFNfRklMRSAiL2V0Yy9zaGVsbHMiCisKKyNkZWZpbmUgUkVNT1ZFX1NIRUxMIChFTkFCTEVfUkVNT1ZFX1NIRUxMICYmICghRU5BQkxFX0FERF9TSEVMTCB8fCBhcHBsZXRfbmFtZVswXSA9PSAncicpKQorI2RlZmluZSBBRERfU0hFTEwgICAgKEVOQUJMRV9BRERfU0hFTEwgJiYgKCFFTkFCTEVfUkVNT1ZFX1NIRUxMIHx8IGFwcGxldF9uYW1lWzBdID09ICdhJykpCisKKy8qIE5COiB3ZSB1c2UgdGhlIF9hZGRyZXNzXywgbm90IHRoZSB2YWx1ZSwgb2YgdGhpcyBzdHJpbmcKKyAqIGFzIGEgInNwZWNpYWwgdmFsdWUgb2YgcG9pbnRlciIgaW4gdGhlIGNvZGUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRvbnRfYWRkW10gQUxJR04xID0gIlxuIjsKKworaW50IGFkZF9yZW1vdmVfc2hlbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFkZF9yZW1vdmVfc2hlbGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUZJTEUgKm9yaWdfZnA7CisJY2hhciAqb3JpZ19mbjsKKwljaGFyICpuZXdfZm47CisKKwlhcmd2Kys7CisKKwlvcmlnX2ZuID0geG1hbGxvY19mb2xsb3dfc3ltbGlua3MoU0hFTExTX0ZJTEUpOworCWlmICghb3JpZ19mbikKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwlvcmlnX2ZwID0gZm9wZW5fZm9yX3JlYWQob3JpZ19mbik7CisKKwluZXdfZm4gPSB4YXNwcmludGYoIiVzLnRtcCIsIG9yaWdfZm4pOworCS8qCisJICogT19UUlVOQyBvciBPX0VYQ0w/IEF0IHRoZSBmaXJzdCBnbGFuY2UsIE9fRVhDTCBsb29rcyBiZXR0ZXIsCisJICogc2luY2UgaXQgcHJldmVudHMgcmFjZXMuIEJ1dDogKDEpIGl0IHJlcXVpcmVzIGEgcmV0cnkgbG9vcCwKKwkgKiAoMikgaWYgL2V0Yy9zaGVsbHMudG1wIGlzICpzdGFsZSosIHRoZW4gcmV0cnkgbG9vcAorCSAqIHdpdGggT19FWENMIHdpbGwgbmV2ZXIgc3VjY2VlZCAtIGl0IHNob3VsZCBoYXZlIGEgdGltZW91dCwKKwkgKiBhZnRlciB3aGljaCBpdCBzaG91bGQgcmV2ZXJ0IHRvIE9fVFJVTkMuCisJICogRm9yIG5vdywgSSBzZXR0bGUgZm9yIE9fVFJVTkMgaW5zdGVhZC4KKwkgKi8KKwl4bW92ZV9mZCh4b3BlbihuZXdfZm4sIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCBTVERPVVRfRklMRU5PKTsKKworCS8qIFRPRE86CisJc3RydWN0IHN0YXQgc2I7CisJeGZzdGF0KGZpbGVubyhvcmlnX2ZwKSwgJnNiKTsKKwl4ZmNob3duKFNURE9VVF9GSUxFTk8sIHNiLnN0X3VpZCwgc2Iuc3RfZ2lkKTsKKwl4ZmNobW9kKFNURE9VVF9GSUxFTk8sIHNiLnN0X21vZGUpOworCSovCisKKwlpZiAob3JpZ19mcCkgeworCQkvKiBDb3B5IG9sZCBmaWxlLCBwb3NzaWJseSBza2lwcGluZyByZW1vdmVkIHNoZWxsIG5hbWVzICovCisJCWNoYXIgKmxpbmU7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUob3JpZ19mcCkpICE9IE5VTEwpIHsKKwkJCWNoYXIgKipjcHAgPSBhcmd2OworCQkJd2hpbGUgKCpjcHApIHsKKwkJCQlpZiAoc3RyY21wKCpjcHAsIGxpbmUpID09IDApIHsKKwkJCQkJLyogT2xkIGZpbGUgaGFzIHRoaXMgc2hlbGwgbmFtZSAqLworCQkJCQlpZiAoUkVNT1ZFX1NIRUxMKSB7CisJCQkJCQkvKiB3ZSBhcmUgcmVtb3ZlLXNoZWxsICovCisJCQkJCQkvKiBkZWxldGUgdGhpcyBuYW1lIGJ5IG5vdCBjb3B5aW5nIGl0ICovCisJCQkJCQlnb3RvIG5leHRfbGluZTsKKwkJCQkJfQorCQkJCQkvKiB3ZSBhcmUgYWRkLXNoZWxsICovCisJCQkJCS8qIG1hcmsgdGhpcyBuYW1lIGFzICJkbyBub3QgYWRkIiAqLworCQkJCQkqY3BwID0gKGNoYXIqKWRvbnRfYWRkOworCQkJCX0KKwkJCQljcHArKzsKKwkJCX0KKwkJCS8qIGNvcHkgc2hlbGwgbmFtZSBmcm9tIG9sZCB0byBuZXcgZmlsZSAqLworCQkJcHJpbnRmKCIlc1xuIiwgbGluZSk7CisgbmV4dF9saW5lOgorCQkJZnJlZShsaW5lKTsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmY2xvc2Uob3JpZ19mcCk7CisJfQorCisJaWYgKEFERF9TSEVMTCkgeworCQljaGFyICoqY3BwID0gYXJndjsKKwkJd2hpbGUgKCpjcHApIHsKKwkJCWlmICgqY3BwICE9IGRvbnRfYWRkKQorCQkJCXByaW50ZigiJXNcbiIsICpjcHApOworCQkJY3BwKys7CisJCX0KKwl9CisKKwkvKiBFbnN1cmUgd2Ugd3JvdGUgb3V0IGV2ZXJ5dGhpbmcgKi8KKwlpZiAoZmNsb3NlKHN0ZG91dCkgIT0gMCkgeworCQl4dW5saW5rKG5ld19mbik7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXM6IHdyaXRlIGVycm9yIiwgbmV3X2ZuKTsKKwl9CisKKwkvKiBTbWFsbCBob2xlOiBpZiByZW5hbWUgZmFpbHMsIC9ldGMvc2hlbGxzLnRtcCBpcyBub3QgcmVtb3ZlZCAqLworCXhyZW5hbWUobmV3X2ZuLCBvcmlnX2ZuKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKG9yaWdfZm4pOworCQlmcmVlKG5ld19mbik7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvYWRkZ3JvdXAuYyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvYWRkZ3JvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzcyNzBmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9hZGRncm91cC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhZGRncm91cCAtIGFkZCBncm91cHMgdG8gL2V0Yy9ncm91cCBhbmQgL2V0Yy9nc2hhZG93CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IExpbmVvLCBpbmMuIGFuZCBKb2huIEJlcHB1CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5IEpvaG4gQmVwcHUgPGJlcHB1QGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKi8KKworLy91c2FnZTojZGVmaW5lIGFkZGdyb3VwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWcgR0lEXSAiIElGX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCgiW1VTRVJdICIpICJHUk9VUCIKKy8vdXNhZ2U6I2RlZmluZSBhZGRncm91cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkFkZCBhIGdyb3VwICIgSUZfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQKCJvciBhZGQgYSB1c2VyIHRvIGEgZ3JvdXAiKSAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1nIEdJRAlHcm91cCBpZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJQ3JlYXRlIGEgc3lzdGVtIGdyb3VwIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIENPTkZJR19MQVNUX1NZU1RFTV9JRCA8IENPTkZJR19GSVJTVF9TWVNURU1fSUQKKyNlcnJvciBCYWQgTEFTVF9TWVNURU1fSUQgb3IgRklSU1RfU1lTVEVNX0lEIGluIC5jb25maWcKKyNlbmRpZgorCisjZGVmaW5lIE9QVF9HSUQgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIE9QVF9TWVNURU1fQUNDT1VOVCAgICAgICAgICAgICgxIDw8IDEpCisKKy8qIFdlIGFzc3VtZSBHSURfVF9NQVggPT0gSU5UX01BWCAqLworc3RhdGljIHZvaWQgeGdyb3VwX3N0dWR5KHN0cnVjdCBncm91cCAqZykKK3sKKwl1bnNpZ25lZCBtYXggPSBJTlRfTUFYOworCisJLyogTWFrZSBzdXJlIGdyX25hbWUgaXMgdW51c2VkICovCisJaWYgKGdldGdybmFtKGctPmdyX25hbWUpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyAnJXMnIGluIHVzZSIsICJncm91cCIsIGctPmdyX25hbWUpOworCQkvKiB0aGVzZSBmb3JtYXQgc3RyaW5ncyBhcmUgcmV1c2VkIGluIGFkZHVzZXIgYW5kIGFkZGdyb3VwICovCisJfQorCisJLyogaWYgYSBzcGVjaWZpYyBnaWQgaXMgcmVxdWVzdGVkLCB0aGUgLS1zeXN0ZW0gc3dpdGNoIGFuZCAqLworCS8qIG1pbiBhbmQgbWF4IHZhbHVlcyBhcmUgb3ZlcnJpZGRlbiwgYW5kIHRoZSByYW5nZSBvZiB2YWxpZCAqLworCS8qIGdpZCB2YWx1ZXMgaXMgc2V0IHRvIFswLCBJTlRfTUFYXSAqLworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfR0lEKSkgeworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9TWVNURU1fQUNDT1VOVCkgeworCQkJZy0+Z3JfZ2lkID0gQ09ORklHX0ZJUlNUX1NZU1RFTV9JRDsKKwkJCW1heCA9IENPTkZJR19MQVNUX1NZU1RFTV9JRDsKKwkJfSBlbHNlIHsKKwkJCWctPmdyX2dpZCA9IENPTkZJR19MQVNUX1NZU1RFTV9JRCArIDE7CisJCQltYXggPSA2NDk5OTsKKwkJfQorCX0KKwkvKiBDaGVjayBpZiB0aGUgZGVzaXJlZCBnaWQgaXMgZnJlZQorCSAqIG9yIGZpbmQgdGhlIGZpcnN0IGZyZWUgb25lICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKCFnZXRncmdpZChnLT5ncl9naWQpKSB7CisJCQlyZXR1cm47IC8qIGZvdW5kIGZyZWUgZ3JvdXA6IHJldHVybiAqLworCQl9CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0dJRCkgeworCQkJLyogLWcgTiwgY2Fubm90IHBpY2sgZ2lkIG90aGVyIHRoYW4gTjogZXJyb3IgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyAnJXMnIGluIHVzZSIsICJnaWQiLCBpdG9hKGctPmdyX2dpZCkpOworCQkJLyogdGhpcyBmb3JtYXQgc3RyaW5ncyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCQlpZiAoZy0+Z3JfZ2lkID09IG1heCkgeworCQkJLyogb3ZlcmZsb3dlZDogZXJyb3IgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyAlY2lkcyBsZWZ0IiwgJ2cnKTsKKwkJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCQlnLT5ncl9naWQrKzsKKwl9Cit9CisKKy8qIGFwcGVuZCBhIG5ldyB1c2VyIHRvIHRoZSBwYXNzd2QgZmlsZSAqLworc3RhdGljIHZvaWQgbmV3X2dyb3VwKGNoYXIgKmdyb3VwLCBnaWRfdCBnaWQpCit7CisJc3RydWN0IGdyb3VwIGdyOworCWNoYXIgKnA7CisKKwkvKiBtYWtlIHN1cmUgZ2lkIGFuZCBncm91cCBoYXZlbid0IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgKi8KKwlnci5ncl9naWQgPSBnaWQ7CisJZ3IuZ3JfbmFtZSA9IGdyb3VwOworCXhncm91cF9zdHVkeSgmZ3IpOworCisJLyogYWRkIGVudHJ5IHRvIGdyb3VwICovCisJcCA9IHhhc3ByaW50ZigieDoldToiLCAodW5zaWduZWQpIGdyLmdyX2dpZCk7CisJaWYgKHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9ncm91cF9maWxlLCBncm91cCwgcCwgTlVMTCkgPCAwKQorCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKHApOworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkvKiAvZXRjL2dzaGFkb3cgZmllbGRzOgorCSAqIDEuIEdyb3VwIG5hbWUuCisJICogMi4gRW5jcnlwdGVkIHBhc3N3b3JkLgorCSAqICAgIElmIHNldCwgbm9uLW1lbWJlcnMgb2YgdGhlIGdyb3VwIGNhbiBqb2luIHRoZSBncm91cAorCSAqICAgIGJ5IHR5cGluZyB0aGUgcGFzc3dvcmQgZm9yIHRoYXQgZ3JvdXAgdXNpbmcgdGhlIG5ld2dycCBjb21tYW5kLgorCSAqICAgIElmIHRoZSB2YWx1ZSBpcyBvZiB0aGlzIGZpZWxkICEgdGhlbiBubyB1c2VyIGlzIGFsbG93ZWQKKwkgKiAgICB0byBhY2Nlc3MgdGhlIGdyb3VwIHVzaW5nIHRoZSBuZXdncnAgY29tbWFuZC4gQSB2YWx1ZSBvZiAhIQorCSAqICAgIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSB2YWx1ZSBvZiAhIG9ubHkgaXQgaW5kaWNhdGVzCisJICogICAgdGhhdCBhIHBhc3N3b3JkIGhhcyBuZXZlciBiZWVuIHNldCBiZWZvcmUuIElmIHRoZSB2YWx1ZSBpcyBudWxsLAorCSAqICAgIG9ubHkgZ3JvdXAgbWVtYmVycyBjYW4gbG9nIGludG8gdGhlIGdyb3VwLgorCSAqIDMuIEdyb3VwIGFkbWluaXN0cmF0b3JzIChjb21tYSBkZWxpbWl0ZWQgbGlzdCkuCisJICogICAgR3JvdXAgbWVtYmVycyBsaXN0ZWQgaGVyZSBjYW4gYWRkIG9yIHJlbW92ZSBncm91cCBtZW1iZXJzCisJICogICAgdXNpbmcgdGhlIGdwYXNzd2QgY29tbWFuZC4KKwkgKiA0LiBHcm91cCBtZW1iZXJzIChjb21tYSBkZWxpbWl0ZWQgbGlzdCkuCisJICovCisJLyogSWdub3JlIGVycm9yczogaWYgZmlsZSBpcyBtaXNzaW5nIHdlIGFzc3VtZSBhZG1pbiBkb2Vzbid0IHdhbnQgaXQgKi8KKwl1cGRhdGVfcGFzc3dkKGJiX3BhdGhfZ3NoYWRvd19maWxlLCBncm91cCwgIiE6OiIsIE5VTEwpOworI2VuZGlmCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIGFkZGdyb3VwX2xvbmdvcHRzW10gQUxJR04xID0KKwkJImdpZFwwIiAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImciCisJCSJzeXN0ZW1cMCIgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJTIgorCQk7CisjZW5kaWYKKworLyoKKyAqIGFkZGdyb3VwIHdpbGwgdGFrZSBhIGxvZ2luX25hbWUgYXMgaXRzIGZpcnN0IHBhcmFtZXRlci4KKyAqCisgKiBnaWQgY2FuIGJlIGN1c3RvbWl6ZWQgdmlhIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzLgorICogSWYgY2FsbGVkIHdpdGggdHdvIG5vbi1vcHRpb24gYXJndW1lbnRzLCBhZGRncm91cAorICogd2lsbCBhZGQgYW4gZXhpc3RpbmcgdXNlciB0byBhbiBleGlzdGluZyBncm91cC4KKyAqLworaW50IGFkZGdyb3VwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhZGRncm91cF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCBnaWQgPSAwOworCisJLyogbmVlZCB0byBiZSByb290ICovCisJaWYgKGdldGV1aWQoKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcGVybV9kZW5pZWRfYXJlX3lvdV9yb290KTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfQURER1JPVVBfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGFkZGdyb3VwX2xvbmdvcHRzOworI2VuZGlmCisJLyogU3ludGF4OgorCSAqICBhZGRncm91cCBncm91cAorCSAqICBhZGRncm91cCAtZyBudW0gZ3JvdXAKKwkgKiAgYWRkZ3JvdXAgdXNlciBncm91cAorCSAqIENoZWNrIGZvciBtaW4sIG1heCBhbmQgbWlzc2luZyBhcmdzICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6PzI6ZysiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZzpTIiwgJmdpZCk7CisJLyogbW92ZSBwYXN0IHRoZSBjb21tYW5kbGluZSBvcHRpb25zICovCisJYXJndiArPSBvcHRpbmQ7CisJLy9hcmdjIC09IG9wdGluZDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAKKwlpZiAoYXJndlsxXSkgeworCQlzdHJ1Y3QgZ3JvdXAgKmdyOworCisJCWlmIChvcHRzICYgT1BUX0dJRCkgeworCQkJLyogLWcgd2FzIHRoZXJlLCBidXQgImFkZGdyb3VwIC1nIG51bSB1c2VyIGdyb3VwIgorCQkJICogaXMgYSBuby1ubyAqLworCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisKKwkJLyogY2hlY2sgaWYgZ3JvdXAgYW5kIHVzZXIgZXhpc3QgKi8KKwkJeHVuYW1lMnVpZChhcmd2WzBdKTsgLyogdW5rbm93biB1c2VyOiBleGl0ICovCisJCWdyID0geGdldGdybmFtKGFyZ3ZbMV0pOyAvKiB1bmtub3duIGdyb3VwOiBleGl0ICovCisJCS8qIGNoZWNrIGlmIHVzZXIgaXMgYWxyZWFkeSBpbiB0aGlzIGdyb3VwICovCisJCWZvciAoOyAqKGdyLT5ncl9tZW0pICE9IE5VTEw7IChnci0+Z3JfbWVtKSsrKSB7CisJCQlpZiAoIXN0cmNtcChhcmd2WzBdLCAqKGdyLT5ncl9tZW0pKSkgeworCQkJCS8qIHVzZXIgaXMgYWxyZWFkeSBpbiBncm91cDogZG8gbm90aGluZyAqLworCQkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJaWYgKHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9ncm91cF9maWxlLCBhcmd2WzFdLCBOVUxMLCBhcmd2WzBdKSA8IDApIHsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCQl1cGRhdGVfcGFzc3dkKGJiX3BhdGhfZ3NoYWRvd19maWxlLCBhcmd2WzFdLCBOVUxMLCBhcmd2WzBdKTsKKyMgZW5kaWYKKwl9IGVsc2UKKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQICovCisJeworCQlkaWVfaWZfYmFkX3VzZXJuYW1lKGFyZ3ZbMF0pOworCQluZXdfZ3JvdXAoYXJndlswXSwgZ2lkKTsKKwl9CisJLyogUmVhY2hlZCBvbmx5IG9uIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9hZGR1c2VyLmMgYi9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL2FkZHVzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDA4MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9hZGR1c2VyLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFkZHVzZXIgLSBhZGQgdXNlcnMgdG8gL2V0Yy9wYXNzd2QgYW5kIC9ldGMvc2hhZG93CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IExpbmVvLCBpbmMuIGFuZCBKb2huIEJlcHB1CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5IEpvaG4gQmVwcHUgPGJlcHB1QGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhZGR1c2VyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gVVNFUiIKKy8vdXNhZ2U6I2RlZmluZSBhZGR1c2VyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQWRkIGEgdXNlclxuIgorLy91c2FnZTogICAgICJcbgktaCBESVIJCUhvbWUgZGlyZWN0b3J5IgorLy91c2FnZTogICAgICJcbgktZyBHRUNPUwlHRUNPUyBmaWVsZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0hFTEwJTG9naW4gc2hlbGwiCisvL3VzYWdlOiAgICAgIlxuCS1HIEdSUAkJQWRkIHVzZXIgdG8gZXhpc3RpbmcgZ3JvdXAiCisvL3VzYWdlOiAgICAgIlxuCS1TCQlDcmVhdGUgYSBzeXN0ZW0gdXNlciIKKy8vdXNhZ2U6ICAgICAiXG4JLUQJCURvbid0IGFzc2lnbiBhIHBhc3N3b3JkIgorLy91c2FnZTogICAgICJcbgktSAkJRG9uJ3QgY3JlYXRlIGhvbWUgZGlyZWN0b3J5IgorLy91c2FnZTogICAgICJcbgktdSBVSUQJCVVzZXIgaWQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgQ09ORklHX0xBU1RfU1lTVEVNX0lEIDwgQ09ORklHX0ZJUlNUX1NZU1RFTV9JRAorI2Vycm9yIEJhZCBMQVNUX1NZU1RFTV9JRCBvciBGSVJTVF9TWVNURU1fSUQgaW4gLmNvbmZpZworI2VuZGlmCisKKy8qICNkZWZpbmUgT1BUX0hPTUUgICAgICAgICAgICgxIDw8IDApICovIC8qIHVudXNlZCAqLworLyogI2RlZmluZSBPUFRfR0VDT1MgICAgICAgICAgKDEgPDwgMSkgKi8gLyogdW51c2VkICovCisjZGVmaW5lIE9QVF9TSEVMTCAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBPUFRfR0lEICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgT1BUX0RPTlRfU0VUX1BBU1MgICgxIDw8IDQpCisjZGVmaW5lIE9QVF9TWVNURU1fQUNDT1VOVCAoMSA8PCA1KQorI2RlZmluZSBPUFRfRE9OVF9NQUtFX0hPTUUgKDEgPDwgNikKKyNkZWZpbmUgT1BUX1VJRCAgICAgICAgICAgICgxIDw8IDcpCisKKy8qIFdlIGFzc3VtZSBVSURfVF9NQVggPT0gSU5UX01BWCAqLworLyogcmVtaXggKi8KKy8qIHJlY29kZWQgc3VjaCB0aGF0IHRoZSB1aWQgbWF5IGJlIHBhc3NlZCBpbiAqcCAqLworc3RhdGljIHZvaWQgcGFzc3dkX3N0dWR5KHN0cnVjdCBwYXNzd2QgKnApCit7CisJaW50IG1heCA9IFVJTlRfTUFYOworCisJaWYgKGdldHB3bmFtKHAtPnB3X25hbWUpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyAnJXMnIGluIHVzZSIsICJ1c2VyIiwgcC0+cHdfbmFtZSk7CisJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwl9CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1VJRCkpIHsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU1lTVEVNX0FDQ09VTlQpIHsKKwkJCXAtPnB3X3VpZCA9IENPTkZJR19GSVJTVF9TWVNURU1fSUQ7CisJCQltYXggPSBDT05GSUdfTEFTVF9TWVNURU1fSUQ7CisJCX0gZWxzZSB7CisJCQlwLT5wd191aWQgPSBDT05GSUdfTEFTVF9TWVNURU1fSUQgKyAxOworCQkJbWF4ID0gNjQ5OTk7CisJCX0KKwl9CisJLyogY2hlY2sgZm9yIGEgZnJlZSB1aWQgKGFuZCBtYXliZSBnaWQpICovCisJd2hpbGUgKGdldHB3dWlkKHAtPnB3X3VpZCkgfHwgKHAtPnB3X2dpZCA9PSAoZ2lkX3QpLTEgJiYgZ2V0Z3JnaWQocC0+cHdfdWlkKSkpIHsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVUlEKSB7CisJCQkvKiAtdSBOLCBjYW5ub3QgcGljayB1aWQgb3RoZXIgdGhhbiBOOiBlcnJvciAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzICclcycgaW4gdXNlIiwgInVpZCIsIGl0b2EocC0+cHdfdWlkKSk7CisJCQkvKiB0aGlzIGZvcm1hdCBzdHJpbmcgaXMgcmV1c2VkIGluIGFkZHVzZXIgYW5kIGFkZGdyb3VwICovCisJCX0KKwkJaWYgKHAtPnB3X3VpZCA9PSBtYXgpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyAlY2lkcyBsZWZ0IiwgJ3UnKTsKKwkJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCQlwLT5wd191aWQrKzsKKwl9CisKKwlpZiAocC0+cHdfZ2lkID09IChnaWRfdCktMSkgeworCQlwLT5wd19naWQgPSBwLT5wd191aWQ7IC8qIG5ldyBnaWQgPSB1aWQgKi8KKwkJaWYgKGdldGdybmFtKHAtPnB3X25hbWUpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgJyVzJyBpbiB1c2UiLCAiZ3JvdXAiLCBwLT5wd19uYW1lKTsKKwkJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYWRkZ3JvdXBfd3JhcHBlcihzdHJ1Y3QgcGFzc3dkICpwLCBjb25zdCBjaGFyICpncm91cF9uYW1lKQoreworCWNoYXIgKmFyZ3ZbNl07CisKKwlhcmd2WzBdID0gKGNoYXIqKSJhZGRncm91cCI7CisJaWYgKGdyb3VwX25hbWUpIHsKKwkJLyogQWRkIHVzZXIgdG8gZXhpc3RpbmcgZ3JvdXAgKi8KKwkJYXJndlsxXSA9IChjaGFyKikiLS0iOworCQlhcmd2WzJdID0gcC0+cHdfbmFtZTsKKwkJYXJndlszXSA9IChjaGFyKilncm91cF9uYW1lOworCQlhcmd2WzRdID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBBZGQgdXNlciB0byBoaXMgb3duIGdyb3VwIHdpdGggdGhlIGZpcnN0IGZyZWUgZ2lkCisJCSAqIGZvdW5kIGluIHBhc3N3ZF9zdHVkeS4KKwkJICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfQURER1JPVVBfTE9OR19PUFRJT05TIHx8ICFFTkFCTEVfQURER1JPVVAKKwkJLyogV2UgdHJ5IHRvIHVzZSAtLWdpZCwgbm90IC1nLCBiZWNhdXNlICJzdGFuZGFyZCIgYWRkZ3JvdXAKKwkJICogaGFzIG5vIHNob3J0IG9wdGlvbiAtZywgaXQgaGFzIG9ubHkgbG9uZyAtLWdpZC4KKwkJICovCisJCWFyZ3ZbMV0gPSAoY2hhciopIi0tZ2lkIjsKKyNlbHNlCisJCS8qIEJyZWFrcyBpZiBzeXN0ZW0gaW4gZmFjdCBkb2VzIE5PVCB1c2UgYnVzeWJveCBhZGRncm91cCAqLworCQlhcmd2WzFdID0gKGNoYXIqKSItZyI7CisjZW5kaWYKKwkJYXJndlsyXSA9IHV0b2EocC0+cHdfZ2lkKTsKKwkJYXJndlszXSA9IChjaGFyKikiLS0iOworCQlhcmd2WzRdID0gcC0+cHdfbmFtZTsKKwkJYXJndls1XSA9IE5VTEw7CisJfQorCisJc3Bhd25fYW5kX3dhaXQoYXJndik7Cit9CisKK3N0YXRpYyB2b2lkIHBhc3N3ZF93cmFwcGVyKGNvbnN0IGNoYXIgKmxvZ2luX25hbWUpIE5PUkVUVVJOOworCitzdGF0aWMgdm9pZCBwYXNzd2Rfd3JhcHBlcihjb25zdCBjaGFyICpsb2dpbl9uYW1lKQoreworCUJCX0VYRUNMUCgicGFzc3dkIiwgInBhc3N3ZCIsICItLSIsIGxvZ2luX25hbWUsIE5VTEwpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlIHBhc3N3ZCwgeW91IG11c3Qgc2V0IHBhc3N3b3JkIG1hbnVhbGx5Iik7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgYWRkdXNlcl9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJob21lXDAiICAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJoIgorCQkiZ2Vjb3NcMCIgICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiZyIKKwkJInNoZWxsXDAiICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInMiCisJCSJpbmdyb3VwXDAiICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJHIgorCQkiZGlzYWJsZWQtcGFzc3dvcmRcMCIgICBOb19hcmd1bWVudCAgICAgICAiRCIKKwkJImVtcHR5LXBhc3N3b3JkXDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgIkQiCisJCSJzeXN0ZW1cMCIgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJTIgorCQkibm8tY3JlYXRlLWhvbWVcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiSCIKKwkJInVpZFwwIiAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInUiCisJCTsKKyNlbmRpZgorCisvKgorICogYWRkdXNlciB3aWxsIHRha2UgYSBsb2dpbl9uYW1lIGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBob21lLCBzaGVsbCwgZ2Vjb3M6CisgKiBjYW4gYmUgY3VzdG9taXplZCB2aWEgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuCisgKi8KK2ludCBhZGR1c2VyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhZGR1c2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcGFzc3dkIHB3OworCWNvbnN0IGNoYXIgKnVzZWdyb3VwID0gTlVMTDsKKwljaGFyICpwOworCXVuc2lnbmVkIG9wdHM7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBhZGR1c2VyX2xvbmdvcHRzOworI2VuZGlmCisKKwkvKiBnb3Qgcm9vdD8gKi8KKwlpZiAoZ2V0ZXVpZCgpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCX0KKworCXB3LnB3X2dlY29zID0gKGNoYXIgKikiTGludXggVXNlciwsLCI7CisJLyogV2UgYXNzdW1lIHRoYXQgbmV3bHkgY3JlYXRlZCB1c2VycyAiaW5oZXJpdCIgcm9vdCdzIHNoZWxsIHNldHRpbmcgKi8KKwlwdy5wd19zaGVsbCA9IChjaGFyICopZ2V0X3NoZWxsX25hbWUoKTsKKwlwdy5wd19kaXIgPSBOVUxMOworCisJLyogZXhhY3RseSBvbmUgbm9uLW9wdGlvbiBhcmcgKi8KKwkvKiBkaXNhYmxlIGludGVyYWN0aXZlIHBhc3N3ZCBmb3Igc3lzdGVtIGFjY291bnRzICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTE6U0Q6dSsiOworCWlmIChzaXplb2YocHcucHdfdWlkKSA9PSBzaXplb2YoaW50KSkgeworCQlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImg6ZzpzOkc6RFNIdToiLCAmcHcucHdfZGlyLCAmcHcucHdfZ2Vjb3MsICZwdy5wd19zaGVsbCwgJnVzZWdyb3VwLCAmcHcucHdfdWlkKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCB1aWQ7CisJCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiaDpnOnM6RzpEU0h1OiIsICZwdy5wd19kaXIsICZwdy5wd19nZWNvcywgJnB3LnB3X3NoZWxsLCAmdXNlZ3JvdXAsICZ1aWQpOworCQlpZiAob3B0cyAmIE9QVF9VSUQpIHsKKwkJCXB3LnB3X3VpZCA9IHVpZDsKKwkJfQorCX0KKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIGZpbGwgaW4gdGhlIHBhc3N3ZCBzdHJ1Y3QgKi8KKwlwdy5wd19uYW1lID0gYXJndlswXTsKKwlkaWVfaWZfYmFkX3VzZXJuYW1lKHB3LnB3X25hbWUpOworCWlmICghcHcucHdfZGlyKSB7CisJCS8qIGNyZWF0ZSBzdHJpbmcgZm9yICRIT01FIGlmIG5vdCBzcGVjaWZpZWQgYWxyZWFkeSAqLworCQlwdy5wd19kaXIgPSB4YXNwcmludGYoIi9ob21lLyVzIiwgYXJndlswXSk7CisJfQorCXB3LnB3X3Bhc3N3ZCA9IChjaGFyICopIngiOworCWlmIChvcHRzICYgT1BUX1NZU1RFTV9BQ0NPVU5UKSB7CisJCWlmICghdXNlZ3JvdXApIHsKKwkJCXVzZWdyb3VwID0gIm5vZ3JvdXAiOworCQl9CisJCWlmICghKG9wdHMgJiBPUFRfU0hFTEwpKSB7CisJCQlwdy5wd19zaGVsbCA9IChjaGFyICopICIvYmluL2ZhbHNlIjsKKwkJfQorCX0KKwlwdy5wd19naWQgPSB1c2Vncm91cCA/IHhncm91cDJnaWQodXNlZ3JvdXApIDogLTE7IC8qIGV4aXRzIG9uIGZhaWx1cmUgKi8KKworCS8qIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIGtvc2hlciBhbmQgc2V0dXAgdWlkICYmIG1heWJlIGdpZCAqLworCXBhc3N3ZF9zdHVkeSgmcHcpOworCisJcCA9IHhhc3ByaW50ZigieDoldToldTolczolczolcyIsCisJCQkodW5zaWduZWQpIHB3LnB3X3VpZCwgKHVuc2lnbmVkKSBwdy5wd19naWQsCisJCQlwdy5wd19nZWNvcywgcHcucHdfZGlyLCBwdy5wd19zaGVsbCk7CisJaWYgKHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9wYXNzd2RfZmlsZSwgcHcucHdfbmFtZSwgcCwgTlVMTCkgPCAwKSB7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShwKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkvKiAvZXRjL3NoYWRvdyBmaWVsZHM6CisJICogMS4gdXNlcm5hbWUKKwkgKiAyLiBlbmNyeXB0ZWQgcGFzc3dvcmQKKwkgKiAzLiBsYXN0IHBhc3N3b3JkIGNoYW5nZSAodW5peCBkYXRlICh1bml4IHRpbWUvMjQqNjAqNjApKQorCSAqIDQuIG1pbmltdW0gZGF5cyByZXF1aXJlZCBiZXR3ZWVuIHBhc3N3b3JkIGNoYW5nZXMKKwkgKiA1LiBtYXhpbXVtIGRheXMgcGFzc3dvcmQgaXMgdmFsaWQKKwkgKiA2LiBkYXlzIGJlZm9yZSBwYXNzd29yZCBpcyB0byBleHBpcmUgdGhhdCB1c2VyIGlzIHdhcm5lZAorCSAqIDcuIGRheXMgYWZ0ZXIgcGFzc3dvcmQgZXhwaXJlcyB0aGF0IGFjY291bnQgaXMgZGlzYWJsZWQKKwkgKiA4LiB1bml4IGRhdGUgd2hlbiBsb2dpbiBleHBpcmVzIChpLmUuIHdoZW4gaXQgbWF5IG5vIGxvbmdlciBiZSB1c2VkKQorCSAqLworCS8qIGZpZWxkczogICAgIDIgMyAgNCA1ICAgICA2IDc4ICovCisJcCA9IHhhc3ByaW50ZigiIToldTowOjk5OTk5Ojc6OjoiLCAodW5zaWduZWQpKHRpbWUoTlVMTCkpIC8gKDI0KjYwKjYwKSk7CisJLyogaWdub3JlIGVycm9yczogaWYgZmlsZSBpcyBtaXNzaW5nIHdlIHN1cHBvc2UgYWRtaW4gZG9lc24ndCB3YW50IGl0ICovCisJdXBkYXRlX3Bhc3N3ZChiYl9wYXRoX3NoYWRvd19maWxlLCBwdy5wd19uYW1lLCBwLCBOVUxMKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUocCk7CisjZW5kaWYKKworCS8qIGFkZCB0byBncm91cCAqLworCWFkZGdyb3VwX3dyYXBwZXIoJnB3LCB1c2Vncm91cCk7CisKKwkvKiBjbGVhciB0aGUgdW1hc2sgZm9yIHRoaXMgcHJvY2VzcyBzbyBpdCBkb2Vzbid0CisJICogc2NyZXcgdXAgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBta2RpciBhbmQgY2hvd24uICovCisJdW1hc2soMCk7CisJaWYgKCEob3B0cyAmIE9QVF9ET05UX01BS0VfSE9NRSkpIHsKKwkJLyogc2V0IHRoZSBvd25lciBhbmQgZ3JvdXAgc28gaXQgaXMgb3duZWQgYnkgdGhlIG5ldyB1c2VyLAorCQkgKiB0aGVuIGZpeCB1cCB0aGUgcGVybWlzc2lvbnMgdG8gMjc1NS4gQ2FuJ3QgZG8gaXQgYmVmb3JlCisJCSAqIHNpbmNlIGNob3duIHdpbGwgY2xlYXIgdGhlIHNldGdpZCBiaXQgKi8KKwkJaW50IG1rZGlyX2VyciA9IG1rZGlyKHB3LnB3X2RpciwgMDc1NSk7CisJCWlmIChta2Rpcl9lcnIgPT0gMCkgeworCQkJLyogTmV3IGhvbWUuIENvcHkgL2V0Yy9za2VsIHRvIGl0ICovCisJCQljb25zdCBjaGFyICphcmdzW10gPSB7CisJCQkJImNob3duIiwKKwkJCQkiLVIiLAorCQkJCXhhc3ByaW50ZigiJXU6JXUiLCAoaW50KXB3LnB3X3VpZCwgKGludClwdy5wd19naWQpLAorCQkJCXB3LnB3X2RpciwKKwkJCQlOVUxMCisJCQl9OworCQkJLyogQmUgc2lsZW50IG9uIGFueSBlcnJvcnMgKGxpa2U6IG5vIC9ldGMvc2tlbCkgKi8KKwkJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJCQljb3B5X2ZpbGUoIi9ldGMvc2tlbCIsIHB3LnB3X2RpciwgRklMRVVUSUxTX1JFQ1VSKTsKKwkJCWxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworCQkJY2hvd25fbWFpbig0LCAoY2hhcioqKWFyZ3MpOworCQl9CisJCWlmICgobWtkaXJfZXJyICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKQorCQkgfHwgY2hvd24ocHcucHdfZGlyLCBwdy5wd191aWQsIHB3LnB3X2dpZCkgIT0gMAorCQkgfHwgY2htb2QocHcucHdfZGlyLCAwMjc1NSkgIT0gMCAvKiBzZXQgc2V0Z2lkIGJpdCBvbiBob21lZGlyICovCisJCSkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2cocHcucHdfZGlyKTsKKwkJfQorCX0KKworCWlmICghKG9wdHMgJiBPUFRfRE9OVF9TRVRfUEFTUykpIHsKKwkJLyogaW50ZXJhY3RpdmVseSBzZXQgcGFzc3dkICovCisJCXBhc3N3ZF93cmFwcGVyKHB3LnB3X25hbWUpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL2NocGFzc3dkLmMgYi9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL2NocGFzc3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkZjU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvY2hwYXNzd2QuYwpAQCAtMCwwICsxLDkzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjaHBhc3N3ZC5jCisgKgorICogV3JpdHRlbiBmb3IgU0xJTkQgKGZyb20gcGFzc3dkLmMpIGJ5IEFsZXhhbmRlciBTaGlzaGtpbiA8dmlydHVvc29Ac2xpbmQub3JnPgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vdXNhZ2U6I2RlZmluZSBjaHBhc3N3ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9MT05HX09QVFMoIlstLW1kNXwtLWVuY3J5cHRlZF0iKSBJRl9OT1RfTE9OR19PUFRTKCJbLW18LWVdIikKKy8vdXNhZ2U6I2RlZmluZSBjaHBhc3N3ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlYWQgdXNlcjpwYXNzd29yZCBmcm9tIHN0ZGluIGFuZCB1cGRhdGUgL2V0Yy9wYXNzd2RcbiIKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWUsLS1lbmNyeXB0ZWQJU3VwcGxpZWQgcGFzc3dvcmRzIGFyZSBpbiBlbmNyeXB0ZWQgZm9ybSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0sLS1tZDUJVXNlIE1ENSBlbmNyeXB0aW9uIGluc3RlYWQgb2YgREVTIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWUJU3VwcGxpZWQgcGFzc3dvcmRzIGFyZSBpbiBlbmNyeXB0ZWQgZm9ybSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JVXNlIE1ENSBlbmNyeXB0aW9uIGluc3RlYWQgb2YgREVTIgorLy91c2FnZToJKQorCisjaWYgRU5BQkxFX0xPTkdfT1BUUworc3RhdGljIGNvbnN0IGNoYXIgY2hwYXNzd2RfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJlbmNyeXB0ZWRcMCIgTm9fYXJndW1lbnQgImUiCisJIm1kNVwwIiAgICAgICBOb19hcmd1bWVudCAibSIKKwk7CisjZW5kaWYKKworI2RlZmluZSBPUFRfRU5DICAxCisjZGVmaW5lIE9QVF9NRDUgIDIKKworaW50IGNocGFzc3dkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaHBhc3N3ZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbmFtZTsKKwlpbnQgb3B0OworCisJaWYgKGdldHVpZCgpICE9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibS0tZTplLS1tIjsKKwlJRl9MT05HX09QVFMoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGNocGFzc3dkX2xvbmdvcHRzOykKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZW0iKTsKKworCXdoaWxlICgobmFtZSA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pKSAhPSBOVUxMKSB7CisJCWNoYXIgKmZyZWVfbWU7CisJCWNoYXIgKnBhc3M7CisJCWludCByYzsKKworCQlwYXNzID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJCWlmICghcGFzcykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtaXNzaW5nIG5ldyBwYXNzd29yZCIpOworCQkqcGFzcysrID0gJ1wwJzsKKworCQl4dW5hbWUydWlkKG5hbWUpOyAvKiBkaWVzIGlmIHRoZXJlIGlzIG5vIHN1Y2ggdXNlciAqLworCisJCWZyZWVfbWUgPSBOVUxMOworCQlpZiAoIShvcHQgJiBPUFRfRU5DKSkgeworCQkJY2hhciBzYWx0W3NpemVvZigiJE4kWFhYWFhYWFgiKV07CisKKwkJCWNyeXB0X21ha2Vfc2FsdChzYWx0LCAxKTsKKwkJCWlmIChvcHQgJiBPUFRfTUQ1KSB7CisJCQkJc2FsdFswXSA9ICckJzsKKwkJCQlzYWx0WzFdID0gJzEnOworCQkJCXNhbHRbMl0gPSAnJCc7CisJCQkJY3J5cHRfbWFrZV9zYWx0KHNhbHQgKyAzLCA0KTsKKwkJCX0KKwkJCWZyZWVfbWUgPSBwYXNzID0gcHdfZW5jcnlwdChwYXNzLCBzYWx0LCAwKTsKKwkJfQorCisJCS8qIFRoaXMgaXMgcmF0aGVyIGNvbXBsZXg6IGlmIHVzZXIgaXMgbm90IGZvdW5kIGluIC9ldGMvc2hhZG93LAorCQkgKiB3ZSB0cnkgdG8gZmluZCAmIGNoYW5nZSBoaXMgcGFzc3dkIGluIC9ldGMvcGFzc3dkICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCQlyYyA9IHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9zaGFkb3dfZmlsZSwgbmFtZSwgcGFzcywgTlVMTCk7CisJCWlmIChyYyA+IDApIC8qIHBhc3N3b3JkIGluIC9ldGMvc2hhZG93IHdhcyB1cGRhdGVkICovCisJCQlwYXNzID0gKGNoYXIqKSJ4IjsKKwkJaWYgKHJjID49IDApCisJCQkvKiAwID0gL2V0Yy9zaGFkb3cgbWlzc2luZyAobm90IGFuIGVycm9yKSwgPjAgPSBwYXNzd2QgY2hhbmdlZCBpbiAvZXRjL3NoYWRvdyAqLworI2VuZGlmCisJCQlyYyA9IHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9wYXNzd2RfZmlsZSwgbmFtZSwgcGFzcywgTlVMTCk7CisJCS8qIExPR01PREVfQk9USCBsb2dzIHRvIHN5c2xvZyBhbHNvICovCisJCWxvZ21vZGUgPSBMT0dNT0RFX0JPVEg7CisJCWlmIChyYyA8IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYW4gZXJyb3Igb2NjdXJyZWQgdXBkYXRpbmcgcGFzc3dvcmQgZm9yICVzIiwgbmFtZSk7CisJCWlmIChyYykKKwkJCWJiX2luZm9fbXNnKCJQYXNzd29yZCBmb3IgJyVzJyBjaGFuZ2VkIiwgbmFtZSk7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworCQlmcmVlKG5hbWUpOworCQlmcmVlKGZyZWVfbWUpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9jcnlwdHB3LmMgYi9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL2NyeXB0cHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjQ0ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9jcnlwdHB3LmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNyeXB0cHcuYyAtIG91dHB1dCBhIGNyeXB0KDMpZWQgcGFzc3dvcmQgdG8gc3Rkb3V0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQ29va2VkIGZyb20gcGFzc3dkLmMgYnkgVGhvbWFzIEx1bmRxdWlzdCA8dGhvbWFzZXpAemVsb3cubm8+CisgKiBta3Bhc3N3ZCBjb21wYXRpYmxlIG9wdGlvbnMgYWRkZWQgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY3J5cHRwd190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtQQVNTV09SRF0gW1NBTFRdIgorLyogV2UgZG8gc3VwcG9ydCAtcywgd2UganVzdCBkb24ndCBtZW50aW9uIGl0ICovCisvL3VzYWdlOiNkZWZpbmUgY3J5cHRwd19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyeXB0IFBBU1NXT1JEIHVzaW5nIGNyeXB0KDMpXG4iCisvL3VzYWdlOglJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1QLC0tcGFzc3dvcmQtZmQ9TglSZWFkIHBhc3N3b3JkIGZyb20gZmQgTiIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMsLS1zdGRpbgkJVXNlIHN0ZGluOyBsaWtlIC1QMCIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLW0sLS1tZXRob2Q9VFlQRQlFbmNyeXB0aW9uIG1ldGhvZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMsLS1zYWx0PVNBTFQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktUCBOCVJlYWQgcGFzc3dvcmQgZnJvbSBmZCBOIgorLyogLy91c2FnZTogICJcbgktcwlVc2Ugc3RkaW47IGxpa2UgLVAwIiAqLworLy91c2FnZTogICAgICJcbgktbSBUWVBFCUVuY3J5cHRpb24gbWV0aG9kIFRZUEUiCisvL3VzYWdlOiAgICAgIlxuCS1TIFNBTFQiCisvL3VzYWdlOgkpCisKKy8qIG1rcGFzc3dkIGlzIGFuIGFsaWFzIHRvIGNyeXB0cHcgKi8KKy8vdXNhZ2U6I2RlZmluZSBta3Bhc3N3ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtQQVNTV09SRF0gW1NBTFRdIgorLyogV2UgZG8gc3VwcG9ydCAtcywgd2UganVzdCBkb24ndCBtZW50aW9uIGl0ICovCisvL3VzYWdlOiNkZWZpbmUgbWtwYXNzd2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcnlwdCBQQVNTV09SRCB1c2luZyBjcnlwdCgzKVxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktUCwtLXBhc3N3b3JkLWZkPU4JUmVhZCBwYXNzd29yZCBmcm9tIGZkIE4iCisvKiAvL3VzYWdlOiAgIlxuCS1zLC0tc3RkaW4JCVVzZSBzdGRpbjsgbGlrZSAtUDAiICovCisvL3VzYWdlOiAgICAgIlxuCS1tLC0tbWV0aG9kPVRZUEUJRW5jcnlwdGlvbiBtZXRob2QiCisvL3VzYWdlOiAgICAgIlxuCS1TLC0tc2FsdD1TQUxUIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLVAgTglSZWFkIHBhc3N3b3JkIGZyb20gZmQgTiIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMJVXNlIHN0ZGluOyBsaWtlIC1QMCIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLW0gVFlQRQlFbmNyeXB0aW9uIG1ldGhvZCBUWVBFIgorLy91c2FnZTogICAgICJcbgktUyBTQUxUIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRGViaWFuIGhhcyAnbWtwYXNzd2QnIHV0aWxpdHksIG1hbnBhZ2Ugc2F5czoKKworTkFNRQorICAgIG1rcGFzc3dkIC0gT3ZlcmZlYXR1cmVkIGZyb250IGVuZCB0byBjcnlwdCgzKQorU1lOT1BTSVMKKyAgICBta3Bhc3N3ZCBQQVNTV09SRCBTQUxUCisuLi4KK09QVElPTlMKKy1TLCAtLXNhbHQ9U1RSSU5HCisgICAgVXNlIHRoZSBTVFJJTkcgYXMgc2FsdC4gSXQgbXVzdCBub3QgIGNvbnRhaW4gIHByZWZpeGVzICBzdWNoICBhcworICAgICQxJC4KKy1SLCAtLXJvdW5kcz1OVU1CRVIKKyAgICBVc2UgTlVNQkVSIHJvdW5kcy4gVGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkIGlmIHRoZSBtZXRob2QKKyAgICBjaG9vc2VuIGRvZXMgbm90IHN1cHBvcnQgdmFyaWFibGUgcm91bmRzLiBGb3IgdGhlIE9wZW5CU0QgQmxvd2Zpc2gKKyAgICBtZXRob2QgdGhpcyBpcyB0aGUgbG9nYXJpdGhtIG9mIHRoZSBudW1iZXIgb2Ygcm91bmRzLgorLW0sIC0tbWV0aG9kPVRZUEUKKyAgICBDb21wdXRlIHRoZSBwYXNzd29yZCB1c2luZyB0aGUgVFlQRSBtZXRob2QuIElmIFRZUEUgaXMgJ2hlbHAnCisgICAgdGhlbiB0aGUgYXZhaWxhYmxlIG1ldGhvZHMgYXJlIHByaW50ZWQuCistUCwgLS1wYXNzd29yZC1mZD1OVU0KKyAgICBSZWFkIHRoZSBwYXNzd29yZCBmcm9tIGZpbGUgZGVzY3JpcHRvciBOVU0gaW5zdGVhZCBvZiB1c2luZyBnZXRwYXNzKDMpLgorICAgIElmIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGNvbm5lY3RlZCB0byBhIHR0eSB0aGVuCisgICAgbm8gb3RoZXIgbWVzc2FnZSB0aGFuIHRoZSBoYXNoZWQgcGFzc3dvcmQgaXMgcHJpbnRlZCBvbiBzdGRvdXQuCistcywgLS1zdGRpbgorICAgIExpa2UgLS1wYXNzd29yZC1mZD0wLgorRU5WSVJPTk1FTlQKKyAgICAkTUtQQVNTV0RfT1BUSU9OUworICAgIEEgbGlzdCBvZiBvcHRpb25zIHdoaWNoIHdpbGwgYmUgZXZhbHVhdGVkIGJlZm9yZSB0aGUgb25lcworICAgIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorQlVHUworICAgIFRoaXMgcHJvZ3JhbXMgc3VmZmVycyBvZiBhIGJhZCBjYXNlIG9mIGZlYXR1cml0aXMuCisgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVmVyeSB0cnVlLi4uCisKK2NyeXB0cHcgd2FzIGluIGJib3ggYmVmb3JlIHRoaXMgZ2VtLCBzbyB3ZSByZXRhaW4gaXQsIGFuZCBhbGlhcyBta3Bhc3N3ZAordG8gY3J5cHRwdy4gLWEgb3B0aW9uIChhbGlhcyBmb3IgLW0pIGNhbWUgZnJvbSBjcnlwdHB3LgorKi8KKworaW50IGNyeXB0cHdfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNyeXB0cHdfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgc2FsdFtNQVhfUFdfU0FMVF9MRU5dOworCWNoYXIgKnNhbHRfcHRyOworCWNvbnN0IGNoYXIgKm9wdF9tLCAqb3B0X1M7CisJaW50IGZkOworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIG1rcGFzc3dkX2xvbmdvcHRzW10gQUxJR04xID0KKwkJInN0ZGluXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCQkicGFzc3dvcmQtZmRcMCIgUmVxdWlyZWRfYXJndW1lbnQgIlAiCisJCSJzYWx0XDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiUyIKKwkJIm1ldGhvZFwwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJtIgorCTsKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gbWtwYXNzd2RfbG9uZ29wdHM7CisjZW5kaWYKKwlmZCA9IFNURElOX0ZJTEVOTzsKKwlvcHRfbSA9ICJkIjsKKwlvcHRfUyA9IE5VTEw7CisJLyogYXQgbW9zdCB0d28gbm9uLW9wdGlvbiBhcmd1bWVudHM7IC1QIE5VTSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8yOlArIjsKKwlnZXRvcHQzMihhcmd2LCAic1A6UzptOmE6IiwgJmZkLCAmb3B0X1MsICZvcHRfbSwgJm9wdF9tKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIGhhdmUgbm8gaWRlYSBob3cgdG8gaGFuZGxlIC1zLi4uICovCisKKwlpZiAoYXJndlswXSAmJiAhb3B0X1MpCisJCW9wdF9TID0gYXJndlsxXTsKKworCXNhbHRfcHRyID0gY3J5cHRfbWFrZV9wd19zYWx0KHNhbHQsIG9wdF9tKTsKKwlpZiAob3B0X1MpCisJCXNhZmVfc3RybmNweShzYWx0X3B0ciwgb3B0X1MsIHNpemVvZihzYWx0KSAtIChzaXplb2YoIiROJCIpLTEpKTsKKworCXhtb3ZlX2ZkKGZkLCBTVERJTl9GSUxFTk8pOworCisJcHV0cyhwd19lbmNyeXB0KAorCQlhcmd2WzBdID8gYXJndlswXSA6ICgKKwkJCS8qIE9ubHkgbWtwYXNzd2QsIGFuZCBvbmx5IGZyb20gdHR5LCBwcm9tcHRzLgorCQkJICogT3RoZXJ3aXNlIGl0IGlzIGEgcGxhaW4gcmVhZC4gKi8KKwkJCShpc2F0dHkoU1RESU5fRklMRU5PKSAmJiBhcHBsZXRfbmFtZVswXSA9PSAnbScpCisJCQk/IGJiX2Fza19zdGRpbigiUGFzc3dvcmQ6ICIpCisJCQk6IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pCisJCSksCisJCXNhbHQsIDEpKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL2RlbHVzZXIuYyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvZGVsdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWFjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL2RlbHVzZXIuYwpAQCAtMCwwICsxLDExNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZGVsdXNlci9kZWxncm91cCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBMaW5lbywgaW5jLiBhbmQgSm9obiBCZXBwdQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBKb2huIEJlcHB1IDxiZXBwdUBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkZWx1c2VyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJVU0VSIgorLy91c2FnZTojZGVmaW5lIGRlbHVzZXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWxldGUgVVNFUiBmcm9tIHRoZSBzeXN0ZW0iCisKKy8vdXNhZ2U6I2RlZmluZSBkZWxncm91cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAoIltVU0VSXSAiKSJHUk9VUCIKKy8vdXNhZ2U6I2RlZmluZSBkZWxncm91cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlbGV0ZSBncm91cCBHUk9VUCBmcm9tIHRoZSBzeXN0ZW0iCisvL3VzYWdlOglJRl9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAoIiBvciB1c2VyIFVTRVIgZnJvbSBncm91cCBHUk9VUCIpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZGVsdXNlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGVsdXNlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvKiBVc2VyIG9yIGdyb3VwIG5hbWUgKi8KKwljaGFyICpuYW1lOworCS8qIFVzZXJuYW1lIChub24tTlVMTCBvbmx5IGluICJkZWxncm91cCBVU0VSIEdST1VQIiBjYXNlKSAqLworCWNoYXIgKm1lbWJlcjsKKwkvKiBOYW1lIG9mIHBhc3N3ZCBvciBncm91cCBmaWxlICovCisJY29uc3QgY2hhciAqcGZpbGU7CisJLyogTmFtZSBvZiBzaGFkb3cgb3IgZ3NoYWRvdyBmaWxlICovCisJY29uc3QgY2hhciAqc2ZpbGU7CisJLyogQXJlIHdlIGRlbHVzZXIgb3IgZGVsZ3JvdXA/ICovCisJaW50IGRvX2RlbHVzZXIgPSAoRU5BQkxFX0RFTFVTRVIgJiYgKCFFTkFCTEVfREVMR1JPVVAgfHwgYXBwbGV0X25hbWVbM10gPT0gJ3UnKSk7CisKKwlpZiAoZ2V0ZXVpZCgpICE9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCisJbmFtZSA9IGFyZ3ZbMV07CisJbWVtYmVyID0gTlVMTDsKKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMzoKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQIHx8IGRvX2RlbHVzZXIpCisJCQlicmVhazsKKwkJLyogSXQncyAiZGVsZ3JvdXAgVVNFUiBHUk9VUCIgKi8KKwkJbWVtYmVyID0gbmFtZTsKKwkJbmFtZSA9IGFyZ3ZbMl07CisJCS8qIEZhbGx0aHJvdWdoICovCisKKwljYXNlIDI6CisJCWlmIChkb19kZWx1c2VyKSB7CisJCQkvKiAiZGVsdXNlciBVU0VSIiAqLworCQkJeGdldHB3bmFtKG5hbWUpOyAvKiBiYWlsIG91dCBpZiBVU0VSIGlzIHdyb25nICovCisJCQlwZmlsZSA9IGJiX3BhdGhfcGFzc3dkX2ZpbGU7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUykKKwkJCQlzZmlsZSA9IGJiX3BhdGhfc2hhZG93X2ZpbGU7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZ3JvdXAgKmdyOworIGRvX2RlbGdyb3VwOgorCQkJLyogImRlbGdyb3VwIEdST1VQIiBvciAiZGVsZ3JvdXAgVVNFUiBHUk9VUCIgKi8KKwkJCWlmIChkb19kZWx1c2VyIDwgMCkgeyAvKiBkZWxncm91cCBhZnRlciBkZWx1c2VyPyAqLworCQkJCWdyID0gZ2V0Z3JuYW0obmFtZSk7CisJCQkJaWYgKCFncikKKwkJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCX0gZWxzZSB7CisJCQkJZ3IgPSB4Z2V0Z3JuYW0obmFtZSk7IC8qIGJhaWwgb3V0IGlmIEdST1VQIGlzIHdyb25nICovCisJCQl9CisJCQlpZiAoIW1lbWJlcikgeworCQkJCS8qICJkZWxncm91cCBHUk9VUCIgKi8KKwkJCQlzdHJ1Y3QgcGFzc3dkICpwdzsKKwkJCQlzdHJ1Y3QgcGFzc3dkIHB3ZW50OworCQkJCS8qIENoZWNrIGlmIHRoZSBncm91cCBpcyBpbiB1c2UgKi8KKyNkZWZpbmUgcGFzc3dkX2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCQkJCXdoaWxlICghZ2V0cHdlbnRfcigmcHdlbnQsIHBhc3N3ZF9idWYsIHNpemVvZihwYXNzd2RfYnVmKSwgJnB3KSkgeworCQkJCQlpZiAocHdlbnQucHdfZ2lkID09IGdyLT5ncl9naWQpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBzdGlsbCBoYXMgJyVzJyBhcyB0aGVpciBwcmltYXJ5IGdyb3VwISIsIHB3ZW50LnB3X25hbWUsIG5hbWUpOworCQkJCX0KKwkJCQkvL2VuZHB3ZW50KCk7CisJCQl9CisJCQlwZmlsZSA9IGJiX3BhdGhfZ3JvdXBfZmlsZTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTKQorCQkJCXNmaWxlID0gYmJfcGF0aF9nc2hhZG93X2ZpbGU7CisJCX0KKworCQkvKiBNb2RpZnkgcGZpbGUsIHRoZW4gc2ZpbGUgKi8KKwkJZG8geworCQkJaWYgKHVwZGF0ZV9wYXNzd2QocGZpbGUsIG5hbWUsIE5VTEwsIG1lbWJlcikgPT0gLTEpCisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTKSB7CisJCQkJcGZpbGUgPSBzZmlsZTsKKwkJCQlzZmlsZSA9IE5VTEw7CisJCQl9CisJCX0gd2hpbGUgKEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMgJiYgcGZpbGUpOworCisJCWlmIChFTkFCTEVfREVMR1JPVVAgJiYgZG9fZGVsdXNlciA+IDApIHsKKwkJCS8qICJkZWx1c2VyIFVTRVIiIGFsc28gc2hvdWxkIHRyeSB0byBkZWxldGUKKwkJCSAqIHNhbWUtbmFtZWQgZ3JvdXAuIElPVzogZG8gImRlbGdyb3VwIFVTRVIiCisJCQkgKi8KKy8vIE9uIGRlYmlhbiBkZWx1c2VyIGlzIGEgcGVybCBzY3JpcHQgdGhhdCBjYWxscyB1c2VyZGVsLgorLy8gRnJvbSBtYW4gdXNlcmRlbDoKKy8vICBJZiBVU0VSR1JPVVBTX0VOQUIgaXMgZGVmaW5lZCB0byB5ZXMgaW4gL2V0Yy9sb2dpbi5kZWZzLCB1c2VyZGVsIHdpbGwKKy8vICBkZWxldGUgdGhlIGdyb3VwIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgdXNlci4KKwkJCWRvX2RlbHVzZXIgPSAtMTsKKwkJCWdvdG8gZG9fZGVsZ3JvdXA7CisJCX0KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisJLyogUmVhY2hlZCBvbmx5IGlmIG51bWJlciBvZiBjb21tYW5kIGxpbmUgYXJncyBpcyB3cm9uZyAqLworCWJiX3Nob3dfdXNhZ2UoKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvZ2V0dHkuYyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvZ2V0dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ1NjY1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9nZXR0eS5jCkBAIC0wLDAgKzEsNjU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBCYXNlZCBvbiBhZ2V0dHkgLSBhbm90aGVyIGdldHR5IHByb2dyYW0gZm9yIExpbnV4LiBCeSBXLiBaLiBWZW5lbWEgMTk4OQorICogUG9ydGVkIHRvIExpbnV4IGJ5IFBldGVyIE9yYmFlayA8cG9lQGRhaW1pLmFhdS5kaz4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZS4KKyAqCisgKiBvcHRpb24gYWRkZWQgYnkgRXJpYyBSYXNtdXNzZW4gPGVhckB1c2ZpcnN0Lm9yZz4gLSAxMi8yOC85NQorICoKKyAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1pY2tpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgorICogLSBBZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorICoKKyAqIDE5OTktMDUtMDUgVGhvcnN0ZW4gS3Jhbnprb3dza2kgPGRsOGJjdUBnbXgubmV0PgorICogLSBFbmFibGVkIGhhcmR3YXJlIGZsb3cgY29udHJvbCBiZWZvcmUgZGlzcGxheWluZyAvZXRjL2lzc3VlCisgKgorICogMjAxMS0wMSBWZW55cyBWbGFzZW5rbworICogLSBSZW1vdmVkIHBhcml0eSBkZXRlY3Rpb24gY29kZS4gSXQgY2FuJ3Qgd29yayByZWxpYWJseToKKyAqIGlmIGFsbCBjaGFycyByZWNlaXZlZCBoYXZlIGJpdCA3IGNsZWFyZWQgYW5kIG9kZCAob3IgZXZlbikgcGFyaXR5LAorICogaXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBvdGhlciBzaWRlIGlzIDgtYml0LG5vLXBhcml0eQorICogb3IgNy1iaXQsb2RkKGV2ZW4pLXBhcml0eS4gSXQgYWxzbyBpbnRlcmZlcmVzIHdpdGggbm9uLUFTQ0lJIHVzZXJuYW1lcy4KKyAqIC0gRnJvbSBub3cgb24sIHdlIGFzc3VtZSB0aGF0IHBhcml0eSBpcyBjb3JyZWN0bHkgc2V0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaWZuZGVmIElVQ0xDCisjIGRlZmluZSBJVUNMQyAwCisjZW5kaWYKKworI2lmbmRlZiBMT0dJTl9QUk9DRVNTCisjIHVuZGVmIEVOQUJMRV9GRUFUVVJFX1VUTVAKKyMgdW5kZWYgRU5BQkxFX0ZFQVRVUkVfV1RNUAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVVRNUCAwCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9XVE1QIDAKKyNlbmRpZgorCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgdW5kZXJzdGFuZGFibGUgZGlhZ25vc3RpY3MgKi8KKyNpZmRlZiBERUJVR0dJTkcKK3N0YXRpYyBGSUxFICpkYmY7CisjIGRlZmluZSBERUJVR1RFUk0gIi9kZXYvdHR5cDAiCisjIGRlZmluZSBkZWJ1ZyguLi4pIGRvIHsgZnByaW50ZihkYmYsIF9fVkFfQVJHU19fKTsgZmZsdXNoKGRiZik7IH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgZGVidWcoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKKy8qCisgKiBUaGluZ3MgeW91IG1heSB3YW50IHRvIG1vZGlmeS4KKyAqCisgKiBZb3UgbWF5IGRpc2FncmVlIHdpdGggdGhlIGRlZmF1bHQgbGluZS1lZGl0aW5nIGV0Yy4gY2hhcmFjdGVycyBkZWZpbmVkCisgKiBiZWxvdy4gTm90ZSwgaG93ZXZlciwgdGhhdCBERUwgY2Fubm90IGJlIHVzZWQgZm9yIGludGVycnVwdCBnZW5lcmF0aW9uCisgKiBhbmQgZm9yIGxpbmUgZWRpdGluZyBhdCB0aGUgc2FtZSB0aW1lLgorICovCisjdW5kZWYgIF9QQVRIX0xPR0lOCisjZGVmaW5lIF9QQVRIX0xPR0lOICIvYmluL2xvZ2luIgorCisvKiBEaXNwbGF5ZWQgYmVmb3JlIHRoZSBsb2dpbiBwcm9tcHQuCisgKiBJZiBJU1NVRSBpcyBub3QgZGVmaW5lZCwgZ2V0dHkgd2lsbCBuZXZlciBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUKKyAqIC9ldGMvaXNzdWUgZmlsZS4gWW91IHdpbGwgbm90IHdhbnQgdG8gc3BpdCBvdXQgbGFyZ2UgImlzc3VlIiBmaWxlcyBhdCB0aGUKKyAqIHdyb25nIGJhdWQgcmF0ZS4KKyAqLworI2RlZmluZSBJU1NVRSAiL2V0Yy9pc3N1ZSIKKworLyogU29tZSBzaG9ydGhhbmRzIGZvciBjb250cm9sIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgQ1RMKHgpICAgICAgICAgICgoeCkgXiAwMTAwKSAgICAvKiBBc3N1bWVzIEFTQ0lJIGRpYWxlY3QgKi8KKyNkZWZpbmUgQlMgICAgICAgICAgICAgIENUTCgnSCcpICAgICAgICAvKiBiYWNrIHNwYWNlICovCisjZGVmaW5lIERFTCAgICAgICAgICAgICBDVEwoJz8nKSAgICAgICAgLyogZGVsZXRlICovCisKKy8qIERlZmF1bHRzIGZvciBsaW5lLWVkaXRpbmcgZXRjLiBjaGFyYWN0ZXJzOyB5b3UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgKi8KKyNkZWZpbmUgREVGX0lOVFIgICAgICAgIENUTCgnQycpICAgICAgICAvKiBkZWZhdWx0IGludGVycnVwdCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgREVGX1FVSVQgICAgICAgIENUTCgnXFwnKSAgICAgICAvKiBkZWZhdWx0IHF1aXQgY2hhciAqLworI2RlZmluZSBERUZfS0lMTCAgICAgICAgQ1RMKCdVJykgICAgICAgIC8qIGRlZmF1bHQga2lsbCBjaGFyICovCisjZGVmaW5lIERFRl9FT0YgICAgICAgICBDVEwoJ0QnKSAgICAgICAgLyogZGVmYXVsdCBFT0YgY2hhciAqLworI2RlZmluZSBERUZfRU9MICAgICAgICAgJ1xuJworI2RlZmluZSBERUZfU1dJVENIICAgICAgMCAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgc3dpdGNoIGNoYXIgKG5vbmUpICovCisKKy8qCisgKiBXaGVuIG11bHRpcGxlIGJhdWQgcmF0ZXMgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLAorICogdGhlIGZpcnN0IG9uZSB3ZSB3aWxsIHRyeSBpcyB0aGUgZmlyc3Qgb25lIHNwZWNpZmllZC4KKyAqLworI2RlZmluZSBNQVhfU1BFRUQgICAgICAgMTAgICAgICAgICAgICAgIC8qIG1heC4gbnIuIG9mIGJhdWQgcmF0ZXMgKi8KKworc3RydWN0IGdsb2JhbHMgeworCXVuc2lnbmVkIHRpbWVvdXQ7ICAgICAgICAgICAgICAgLyogdGltZS1vdXQgcGVyaW9kICovCisJY29uc3QgY2hhciAqbG9naW47ICAgICAgICAgICAgICAvKiBsb2dpbiBwcm9ncmFtICovCisJY29uc3QgY2hhciAqZmFrZWhvc3Q7CisJY29uc3QgY2hhciAqdHR5OyAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIHR0eSAqLworCWNoYXIgKmluaXRzdHJpbmc7ICAgICAgICAgICAgICAgLyogbW9kZW0gaW5pdCBzdHJpbmcgKi8KKwljb25zdCBjaGFyICppc3N1ZTsgICAgICAgICAgICAgIC8qIGFsdGVybmF0aXZlIGlzc3VlIGZpbGUgKi8KKwlpbnQgbnVtc3BlZWQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiYXVkIHJhdGVzIHRvIHRyeSAqLworCWludCBzcGVlZHNbTUFYX1NQRUVEXTsgICAgICAgICAgLyogYmF1ZCByYXRlcyB0byBiZSB0cmllZCAqLworCXVuc2lnbmVkIGNoYXIgZW9sOyAgICAgICAgICAgICAgLyogZW5kLW9mLWxpbmUgY2hhciBzZWVuIChDUiBvciBOTCkgKi8KKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOyAgICAgICAgIC8qIHRlcm1pbmFsIG1vZGUgYml0cyAqLworCWNoYXIgbGluZV9idWZbMTI4XTsKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworLy91c2FnZTojZGVmaW5lIGdldHR5X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gQkFVRF9SQVRFWyxCQVVEX1JBVEVdLi4uIFRUWSBbVEVSTVRZUEVdIgorLy91c2FnZTojZGVmaW5lIGdldHR5X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiT3BlbiBhIHR0eSwgcHJvbXB0IGZvciBhIGxvZ2luIG5hbWUsIHRoZW4gaW52b2tlIC9iaW4vbG9naW5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJCUVuYWJsZSBoYXJkd2FyZSBSVFMvQ1RTIGZsb3cgY29udHJvbCIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJCVNldCBDTE9DQUwgKGlnbm9yZSBDYXJyaWVyIERldGVjdCBzdGF0ZSkiCisvL3VzYWdlOiAgICAgIlxuCS1tCQlHZXQgYmF1ZCByYXRlIGZyb20gbW9kZW0ncyBDT05ORUNUIHN0YXR1cyBtZXNzYWdlIgorLy91c2FnZTogICAgICJcbgktbgkJRG9uJ3QgcHJvbXB0IGZvciBsb2dpbiBuYW1lIgorLy91c2FnZTogICAgICJcbgktdwkJV2FpdCBmb3IgQ1Igb3IgTEYgYmVmb3JlIHNlbmRpbmcgL2V0Yy9pc3N1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCURvbid0IGRpc3BsYXkgL2V0Yy9pc3N1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgSVNTVUVfRklMRQlEaXNwbGF5IElTU1VFX0ZJTEUgaW5zdGVhZCBvZiAvZXRjL2lzc3VlIgorLy91c2FnZTogICAgICJcbgktbCBMT0dJTglJbnZva2UgTE9HSU4gaW5zdGVhZCBvZiAvYmluL2xvZ2luIgorLy91c2FnZTogICAgICJcbgktdCBTRUMJCVRlcm1pbmF0ZSBhZnRlciBTRUMgaWYgbm8gbG9naW4gbmFtZSBpcyByZWFkIgorLy91c2FnZTogICAgICJcbgktSSBJTklUU1RSCVNlbmQgSU5JVFNUUiBiZWZvcmUgYW55dGhpbmcgZWxzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLUggSE9TVAkJTG9nIEhPU1QgaW50byB0aGUgdXRtcCBmaWxlIGFzIHRoZSBob3N0bmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuQkFVRF9SQVRFIG9mIDAgbGVhdmVzIGl0IHVuY2hhbmdlZCIKKworc3RhdGljIGNvbnN0IGNoYXIgb3B0X3N0cmluZ1tdIEFMSUdOMSA9ICJJOkxIOmY6aGlsOm10OnduIjsKKyNkZWZpbmUgRl9JTklUU1RSSU5HICAgICgxIDw8IDApICAgLyogLUkgKi8KKyNkZWZpbmUgRl9MT0NBTCAgICAgICAgICgxIDw8IDEpICAgLyogLUwgKi8KKyNkZWZpbmUgRl9GQUtFSE9TVCAgICAgICgxIDw8IDIpICAgLyogLUggKi8KKyNkZWZpbmUgRl9DVVNUSVNTVUUgICAgICgxIDw8IDMpICAgLyogLWYgKi8KKyNkZWZpbmUgRl9SVFNDVFMgICAgICAgICgxIDw8IDQpICAgLyogLWggKi8KKyNkZWZpbmUgRl9OT0lTU1VFICAgICAgICgxIDw8IDUpICAgLyogLWkgKi8KKyNkZWZpbmUgRl9MT0dJTiAgICAgICAgICgxIDw8IDYpICAgLyogLWwgKi8KKyNkZWZpbmUgRl9QQVJTRSAgICAgICAgICgxIDw8IDcpICAgLyogLW0gKi8KKyNkZWZpbmUgRl9USU1FT1VUICAgICAgICgxIDw8IDgpICAgLyogLXQgKi8KKyNkZWZpbmUgRl9XQUlUQ1JMRiAgICAgICgxIDw8IDkpICAgLyogLXcgKi8KKyNkZWZpbmUgRl9OT1BST01QVCAgICAgICgxIDw8IDEwKSAgLyogLW4gKi8KKworCisvKiBjb252ZXJ0IHNwZWVkIHN0cmluZyB0byBzcGVlZCBjb2RlOyByZXR1cm4gPD0gMCBvbiBmYWlsdXJlICovCitzdGF0aWMgaW50IGJjb2RlKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IHZhbHVlID0gYmJfc3RydG91KHMsIE5VTEwsIDEwKTsgLyogeWVzLCBpbnQgaXMgaW50ZW5kZWQhICovCisJaWYgKHZhbHVlIDwgMCkgLyogYmFkIHRlcm1pbmF0aW5nIGNoYXIsIG92ZXJmbG93LCBldGMgKi8KKwkJcmV0dXJuIHZhbHVlOworCXJldHVybiB0dHlfdmFsdWVfdG9fYmF1ZCh2YWx1ZSk7Cit9CisKKy8qIHBhcnNlIGFsdGVybmF0ZSBiYXVkIHJhdGVzICovCitzdGF0aWMgdm9pZCBwYXJzZV9zcGVlZHMoY2hhciAqYXJnKQoreworCWNoYXIgKmNwOworCisJLyogTkI6IGF0IGxlYXN0IG9uZSBpdGVyYXRpb24gaXMgYWx3YXlzIGRvbmUgKi8KKwlkZWJ1ZygiZW50ZXJlZCBwYXJzZV9zcGVlZHNcbiIpOworCXdoaWxlICgoY3AgPSBzdHJzZXAoJmFyZywgIiwiKSkgIT0gTlVMTCkgeworCQlHLnNwZWVkc1tHLm51bXNwZWVkXSA9IGJjb2RlKGNwKTsKKwkJaWYgKEcuc3BlZWRzW0cubnVtc3BlZWRdIDwgMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgc3BlZWQ6ICVzIiwgY3ApOworCQkvKiBub3RlOiBhcmcgIjAiIHR1cm5zIGludG8gc3BlZWQgQjAgKi8KKwkJRy5udW1zcGVlZCsrOworCQlpZiAoRy5udW1zcGVlZCA+IE1BWF9TUEVFRCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBhbHRlcm5hdGUgc3BlZWRzIik7CisJfQorCWRlYnVnKCJleGl0aW5nIHBhcnNlX3NwZWVkc1xuIik7Cit9CisKKy8qIHBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2FyZ3MoY2hhciAqKmFyZ3YpCit7CisJY2hhciAqdHM7CisJaW50IGZsYWdzOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTI6dCsiOyAvKiBhdCBsZWFzdCAyIGFyZ3M7IC10IE4gKi8KKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsIG9wdF9zdHJpbmcsCisJCSZHLmluaXRzdHJpbmcsICZHLmZha2Vob3N0LCAmRy5pc3N1ZSwKKwkJJkcubG9naW4sICZHLnRpbWVvdXQKKwkpOworCWlmIChmbGFncyAmIEZfSU5JVFNUUklORykgeworCQlHLmluaXRzdHJpbmcgPSB4c3RyZHVwKEcuaW5pdHN0cmluZyk7CisJCS8qIGRlY29kZSBcZGRkIG9jdGFsIGNvZGVzIGludG8gY2hhcnMgKi8KKwkJc3RyY3B5X2FuZF9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZXMoRy5pbml0c3RyaW5nLCBHLmluaXRzdHJpbmcpOworCX0KKwlhcmd2ICs9IG9wdGluZDsKKwlkZWJ1ZygiYWZ0ZXIgZ2V0b3B0XG4iKTsKKworCS8qIFdlIGxvb3NlbiB1cCBhIGJpdCBhbmQgYWNjZXB0IGJvdGggImJhdWRyYXRlIHR0eSIgYW5kICJ0dHkgYmF1ZHJhdGUiICovCisJRy50dHkgPSBhcmd2WzBdOyAgICAgICAgLyogdHR5IG5hbWUgKi8KKwl0cyA9IGFyZ3ZbMV07ICAgICAgICAgICAvKiBiYXVkIHJhdGUocykgKi8KKwlpZiAoaXNkaWdpdChhcmd2WzBdWzBdKSkgeworCQkvKiBBIG51bWJlciBmaXJzdCwgYXNzdW1lIGl0J3MgYSBzcGVlZCAoQlNEIHN0eWxlKSAqLworCQlHLnR0eSA9IHRzOyAgICAgLyogdHR5IG5hbWUgaXMgaW4gYXJndlsxXSAqLworCQl0cyA9IGFyZ3ZbMF07ICAgLyogYmF1ZCByYXRlKHMpICovCisJfQorCXBhcnNlX3NwZWVkcyh0cyk7CisJYXBwbGV0X25hbWUgPSB4YXNwcmludGYoImdldHR5OiAlcyIsIEcudHR5KTsKKworCWlmIChhcmd2WzJdKQorCQl4c2V0ZW52KCJURVJNIiwgYXJndlsyXSk7CisKKwlkZWJ1ZygiZXhpdGluZyBwYXJzZV9hcmdzXG4iKTsKK30KKworLyogc2V0IHVwIHR0eSBhcyBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0LCBlcnJvciAqLworc3RhdGljIHZvaWQgb3Blbl90dHkodm9pZCkKK3sKKwkvKiBTZXQgdXAgbmV3IHN0YW5kYXJkIGlucHV0LCB1bmxlc3Mgd2UgYXJlIGdpdmVuIGFuIGFscmVhZHkgb3BlbmVkIHBvcnQgKi8KKwlpZiAoTk9UX0xPTkVfREFTSChHLnR0eSkpIHsKKwkJaWYgKEcudHR5WzBdICE9ICcvJykKKwkJCUcudHR5ID0geGFzcHJpbnRmKCIvZGV2LyVzIiwgRy50dHkpOyAvKiB3aWxsIGxlYWsgaXQgKi8KKworCQkvKiBPcGVuIHRoZSB0dHkgYXMgc3RhbmRhcmQgaW5wdXQgKi8KKwkJZGVidWcoIm9wZW4oMilcbiIpOworCQljbG9zZSgwKTsKKwkJeG9wZW4oRy50dHksIE9fUkRXUiB8IE9fTk9OQkxPQ0spOyAvKiB1c2VzIGZkIDAgKi8KKworCQkvKiBTZXQgcHJvcGVyIHByb3RlY3Rpb25zIGFuZCBvd25lcnNoaXAgKi8KKwkJZmNob3duKDAsIDAsIDApOyAgICAgICAgLyogMDowICovCisJCWZjaG1vZCgwLCAwNjIwKTsgICAgICAgIC8qIGNydy0tdy0tLS0gKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdGFuZGFyZCBpbnB1dCBzaG91bGQgYWxyZWFkeSBiZSBjb25uZWN0ZWQgdG8gYW4gb3BlbiBwb3J0LiBNYWtlCisJCSAqIHN1cmUgaXQgaXMgb3BlbiBmb3IgcmVhZC93cml0ZS4KKwkJICovCisJCWlmICgoZmNudGwoMCwgRl9HRVRGTCkgJiAoT19SRFdSfE9fUkRPTkxZfE9fV1JPTkxZKSkgIT0gT19SRFdSKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0ZGluIGlzIG5vdCBvcGVuIGZvciByZWFkL3dyaXRlIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfdGVybWlvcyh2b2lkKQoreworCWlmICh0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmRy50ZXJtaW9zKSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgidGNzZXRhdHRyIik7Cit9CisKKy8qIFdlIG1hbmlwdWxhdGUgdGVybWlvcyB0aGlzIHdheToKKyAqIC0gZmlyc3QsIHdlIHJlYWQgZXhpc3RpbmcgdGVybWlvcyBzZXR0aW5ncworICogLSB0ZXJtaW9zX2luaXQgbW9kaWZpZXMgc29tZSBwYXJ0cyBhbmQgc2V0cyBpdAorICogLSBhdXRvX2JhdWQgYW5kL29yIEJSRUFLIHByb2Nlc3NpbmcgY2FuIHNldCBkaWZmZXJlbnQgc3BlZWQgYW5kIHNldCB0ZXJtaW9zCisgKiAtIHRlcm1pb3NfZmluYWwgYWdhaW4gbW9kaWZpZXMgc29tZSBwYXJ0cyBhbmQgc2V0cyB0ZXJtaW9zIGJlZm9yZQorICogICBleGVjaW5nIGxvZ2luCisgKi8KK3N0YXRpYyB2b2lkIHRlcm1pb3NfaW5pdChpbnQgc3BlZWQpCit7CisJLyogVHJ5IHRvIGRyYWluIG91dHB1dCBidWZmZXIsIHdpdGggNSBzZWMgdGltZW91dC4KKwkgKiBBZGRlZCBvbiByZXF1ZXN0IGZyb20gdXNlcnMgb2YgfjYwMCBiYXVkIHNlcmlhbCBpbnRlcmZhY2UKKwkgKiB3aXRoIGJpZ2dpc2ggYnVmZmVyIG9uIGEgOTBNSHogQ1BVLgorCSAqIFRoZXkgd2VyZSBsb3NpbmcgaHVuZHJlZHMgb2YgYnl0ZXMgb2YgYnVmZmVyZWQgb3V0cHV0CisJICogb24gdGNmbHVzaC4KKwkgKi8KKwlzaWduYWxfbm9fU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR0FMUk0sIHJlY29yZF9zaWdubyk7CisJYWxhcm0oNSk7CisJdGNkcmFpbihTVERJTl9GSUxFTk8pOworCWFsYXJtKDApOworCXNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsgLyogZG8gbm90IGJyZWFrIC10IFRJTUVPVVQhICovCisKKwkvKiBGbHVzaCBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlcywgaW1wb3J0YW50IGZvciBtb2RlbXMhICovCisJdGNmbHVzaChTVERJTl9GSUxFTk8sIFRDSU9GTFVTSCk7CisKKwkvKiBTZXQgc3BlZWQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZCBhcyAiMCIgb24gY29tbWFuZCBsaW5lICovCisJaWYgKHNwZWVkICE9IEIwKQorCQljZnNldHNwZWVkKCZHLnRlcm1pb3MsIHNwZWVkKTsKKworCS8qIEluaXRpYWwgdGVybWlvcyBzZXR0aW5nczogOC1iaXQgY2hhcmFjdGVycywgcmF3IG1vZGUsIGJsb2NraW5nIGkvby4KKwkgKiBTcGVjaWFsIGNoYXJhY3RlcnMgYXJlIHNldCBhZnRlciB3ZSBoYXZlIHJlYWQgdGhlIGxvZ2luIG5hbWU7IGFsbAorCSAqIHJlYWRzIHdpbGwgYmUgZG9uZSBpbiByYXcgbW9kZSBhbnl3YXkuCisJICovCisJLyogQ2xlYXIgYWxsIGJpdHMgZXhjZXB0OiAqLworCUcudGVybWlvcy5jX2NmbGFnICY9ICgwCisJCS8qIDIgc3RvcCBiaXRzICgxIG90aGVyd2lzZSkKKwkJICogRW5hYmxlIHBhcml0eSBiaXQgKGJvdGggb24gaW5wdXQgYW5kIG91dHB1dCkKKwkJICogT2RkIHBhcml0eSAoZWxzZSBldmVuKQorCQkgKi8KKwkJfCBDU1RPUEIgfCBQQVJFTkIgfCBQQVJPREQKKyNpZmRlZiBDTVNQQVIKKwkJfCBDTVNQQVIgIC8qIG1hcmsgb3Igc3BhY2UgcGFyaXR5ICovCisjZW5kaWYKKwkJfCBDQkFVRCAgIC8qIChvdXRwdXQpIGJhdWQgcmF0ZSAqLworI2lmZGVmIENCQVVERVgKKwkJfCBDQkFVREVYIC8qIChvdXRwdXQpIGJhdWQgcmF0ZSAqLworI2VuZGlmCisjaWZkZWYgQ0lCQVVECisJCXwgQ0lCQVVEICAgLyogaW5wdXQgYmF1ZCByYXRlICovCisjZW5kaWYKKwkpOworCS8qIFNldDogOCBiaXRzOyBoYW5nIHVwIChkcm9wIERUUikgb24gbGFzdCBjbG9zZTsgZW5hYmxlIHJlY2VpdmUgKi8KKwlHLnRlcm1pb3MuY19jZmxhZyB8PSBDUzggfCBIVVBDTCB8IENSRUFEOworCWlmIChvcHRpb25fbWFzazMyICYgRl9MT0NBTCkgeworCQkvKiBpZ25vcmUgQ2FycmllciBEZXRlY3QgcGluOgorCQkgKiBvcGVucyBkb24ndCBibG9jayB3aGVuIENEIGlzIGxvdywKKwkJICogbG9zaW5nIENEIGRvZXNuJ3QgaGFuZyB1cCBwcm9jZXNzZXMgd2hvc2UgY3R0eSBpcyB0aGlzIHR0eQorCQkgKi8KKwkJRy50ZXJtaW9zLmNfY2ZsYWcgfD0gQ0xPQ0FMOworCX0KKyNpZmRlZiBDUlRTQ1RTCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGX1JUU0NUUykKKwkJRy50ZXJtaW9zLmNfY2ZsYWcgfD0gQ1JUU0NUUzsgLyogZmxvdyBjb250cm9sIHVzaW5nIFJUUy9DVFMgcGlucyAqLworI2VuZGlmCisJRy50ZXJtaW9zLmNfaWZsYWcgPSAwOworCUcudGVybWlvcy5jX2xmbGFnID0gMDsKKwkvKiBub24tcmF3IG91dHB1dDsgYWRkIENSIHRvIGVhY2ggTkwgKi8KKwlHLnRlcm1pb3MuY19vZmxhZyA9IE9QT1NUIHwgT05MQ1I7CisKKwlHLnRlcm1pb3MuY19jY1tWTUlOXSA9IDE7IC8qIGJsb2NrIHJlYWRzIGlmIDwgMSBjaGFyIGlzIGF2YWlsYWJsZSAqLworCUcudGVybWlvcy5jX2NjW1ZUSU1FXSA9IDA7IC8qIG5vIHRpbWVvdXQgKHJlYWRzIGJsb2NrIGZvcmV2ZXIpICovCisjaWZkZWYgX19saW51eF9fCisJRy50ZXJtaW9zLmNfbGluZSA9IDA7CisjZW5kaWYKKworCXNldF90ZXJtaW9zKCk7CisKKwlkZWJ1ZygidGVybV9pbyAyXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGVybWlvc19maW5hbCh2b2lkKQoreworCS8qIHNvZnR3YXJlIGZsb3cgY29udHJvbCBvbiBvdXRwdXQgKHN0b3Agc2VuZGluZyBpZiBYT0ZGIGlzIHJlY3ZkKTsKKwkgKiBhbmQgb24gaW5wdXQgKHNlbmQgWE9GRiB3aGVuIGJ1ZmZlciBpcyBmdWxsKQorCSAqLworCUcudGVybWlvcy5jX2lmbGFnIHw9IElYT04gfCBJWE9GRjsKKwlpZiAoRy5lb2wgPT0gJ1xyJykgeworCQlHLnRlcm1pb3MuY19pZmxhZyB8PSBJQ1JOTDsgLyogbWFwIENSIG9uIGlucHV0IHRvIE5MICovCisJfQorCS8qIE90aGVyIGJpdHMgaW4gY19pZmxhZzoKKwkgKiBJWEFOWSAgIEFueSByZWN2ZCBjaGFyIGVuYWJsZXMgb3V0cHV0IChhbnkgY2hhciBpcyBhbHNvIGEgWE9OKQorCSAqIElOUENLICAgRW5hYmxlIHBhcml0eSBjaGVjaworCSAqIElHTlBBUiAgSWdub3JlIHBhcml0eSBlcnJvcnMgKGRyb3AgYmFkIGJ5dGVzKQorCSAqIFBBUk1SSyAgTWFyayBwYXJpdHkgZXJyb3JzIHdpdGggMHhmZiwgMHgwMCBwcmVmaXgKKwkgKiAgICAgICAgIChlbHNlIGJhZCBieXRlIGlzIHJlY2VpdmVkIGFzIDB4MDApCisJICogSVNUUklQICBTdHJpcCBwYXJpdHkgYml0CisJICogSUdOQlJLICBJZ25vcmUgYnJlYWsgY29uZGl0aW9uCisJICogQlJLSU5UICBTZW5kIFNJR0lOVCBvbiBicmVhayAtIG1heWJlIHNldCB0aGlzPworCSAqIElOTENSICAgTWFwIE5MIHRvIENSCisJICogSUdOQ1IgICBJZ25vcmUgQ1IKKwkgKiBJQ1JOTCAgIE1hcCBDUiB0byBOTAorCSAqIElVQ0xDICAgTWFwIHVwcGVyY2FzZSB0byBsb3dlcmNhc2UKKwkgKiBJTUFYQkVMIEVjaG8gQkVMIG9uIGlucHV0IGxpbmUgdG9vIGxvbmcKKwkgKiBJVVRGOCAgIEFwcGVhcnMgdG8gYWZmZWN0IHR0eSdzIGlkZWEgb2YgY2hhciB3aWR0aHMsCisJICogICAgICAgICBvYnNlcnZlZCB0byBpbXByb3ZlIGJhY2tzcGFjaW5nIHRocm91Z2ggVW5pY29kZSBjaGFycworCSAqLworCisJLyogbGluZSBidWZmZXJlZCBpbnB1dCAoTkwgb3IgRU9MIG9yIEVPRiBjaGFycyBlbmQgYSBsaW5lKTsKKwkgKiByZWNvZ25pemUgSU5UL1FVSVQvU1VTUCBjaGFyczsKKwkgKiBlY2hvIGlucHV0IGNoYXJzOworCSAqIGVjaG8gQlMtU1AtQlMgb24gZXJhc2UgY2hhcmFjdGVyOworCSAqIGVjaG8ga2lsbCBjaGFyIHNwZWNpYWxseSwgbm90IGFzIF5jIChFQ0hPS0UgY29udHJvbHMgaG93IGV4YWN0bHkpOworCSAqIGVyYXNlIGFsbCBpbnB1dCB2aWEgQlMtU1AtQlMgb24ga2lsbCBjaGFyIChlbHNlIGdvIHRvIG5leHQgbGluZSkKKwkgKi8KKwlHLnRlcm1pb3MuY19sZmxhZyB8PSBJQ0FOT04gfCBJU0lHIHwgRUNITyB8IEVDSE9FIHwgRUNIT0sgfCBFQ0hPS0U7CisJLyogT3RoZXIgYml0cyBpbiBjX2xmbGFnOgorCSAqIFhDQVNFICAgTWFwIHVwcGVyY2FzZSB0byBcbG93ZXJjYXNlIFt0cmllZCwgZG9lc24ndCB3b3JrXQorCSAqIEVDSE9OTCAgRWNobyBOTCBldmVuIGlmIEVDSE8gaXMgbm90IHNldAorCSAqIEVDSE9DVEwgRWNobyBjdHJsIGNoYXJzIGFzIF5jIChlbHNlIGRvbid0IGVjaG8pIC0gbWF5YmUgc2V0IHRoaXM/CisJICogRUNIT1BSVCBPbiBlcmFzZSwgZWNobyBlcmFzZWQgY2hhcnMKKwkgKiAgICAgICAgIFtxd2U8QlM+PEJTPjxCUz4gaW5wdXQgbG9va3MgbGlrZSAicXdlXGV3cS8iIG9uIHNjcmVlbl0KKwkgKiBOT0ZMU0ggIERvbid0IGZsdXNoIGlucHV0IGJ1ZmZlciBhZnRlciBpbnRlcnJ1cHQgb3IgcXVpdCBjaGFycworCSAqIElFWFRFTiAgRW5hYmxlIGV4dGVuZGVkIGZ1bmN0aW9ucyAoPz8pCisJICogICAgICAgICBbZ2xpYmMgc2F5cyBpdCBlbmFibGVzIGNfY2NbTE5FWFRdICJlbnRlciBsaXRlcmFsIGNoYXIiCisJICogICAgICAgICBhbmQgY19jY1tWRElTQ0FSRF0gInRvZ2dsZSBkaXNjYXJkIGJ1ZmZlcmVkIG91dHB1dCIgY2hhcnNdCisJICogRkxVU0hPICBPdXRwdXQgYmVpbmcgZmx1c2hlZCAoY19jY1tWRElTQ0FSRF0gaXMgaW4gZWZmZWN0KQorCSAqIFBFTkRJTiAgUmV0eXBlIHBlbmRpbmcgaW5wdXQgYXQgbmV4dCByZWFkIG9yIGlucHV0IGNoYXIKKwkgKiAgICAgICAgIChjX2NjW1ZSRVBSSU5UXSBpcyBiZWluZyBwcm9jZXNzZWQpCisJICogVE9TVE9QICBTZW5kIFNJR1RUT1UgZm9yIGJhY2tncm91bmQgb3V0cHV0CisJICogICAgICAgICAod2h5ICJzdHR5IHNhbmUiIHVuc2V0cyB0aGlzIGJpdD8pCisJICovCisKKwlHLnRlcm1pb3MuY19jY1tWSU5UUl0gPSBERUZfSU5UUjsKKwlHLnRlcm1pb3MuY19jY1tWUVVJVF0gPSBERUZfUVVJVDsKKwlHLnRlcm1pb3MuY19jY1tWRU9GXSA9IERFRl9FT0Y7CisJRy50ZXJtaW9zLmNfY2NbVkVPTF0gPSBERUZfRU9MOworI2lmZGVmIFZTV1RDCisJRy50ZXJtaW9zLmNfY2NbVlNXVENdID0gREVGX1NXSVRDSDsKKyNlbmRpZgorI2lmZGVmIFZTV1RDSAorCUcudGVybWlvcy5jX2NjW1ZTV1RDSF0gPSBERUZfU1dJVENIOworI2VuZGlmCisJRy50ZXJtaW9zLmNfY2NbVktJTExdID0gREVGX0tJTEw7CisJLyogT3RoZXIgY29udHJvbCBjaGFyczoKKwkgKiBWRU9MMgorCSAqIFZFUkFTRSwgVldFUkFTRSAtICh3b3JkKSBlcmFzZS4gd2UgbWF5IHNldCBWRVJBU0UgaW4gZ2V0X2xvZ25hbWUKKwkgKiBWUkVQUklOVCAtIHJlcHJpbnQgY3VycmVudCBpbnB1dCBidWZmZXIKKwkgKiBWTE5FWFQsIFZESVNDQVJELCBWU1RBVFVTCisJICogVlNVU1AsIFZEU1VTUCAtIHNlbmQgKGRlbGF5ZWQpIFNJR1RTVFAKKwkgKiBWU1RBUlQsIFZTVE9QIC0gY2hhcnMgdXNlZCBmb3IgSVhPTi9JWE9GRgorCSAqLworCisJc2V0X3Rlcm1pb3MoKTsKK30KKworLyogZXh0cmFjdCBiYXVkIHJhdGUgZnJvbSBtb2RlbSBzdGF0dXMgbWVzc2FnZSAqLworc3RhdGljIHZvaWQgYXV0b19iYXVkKHZvaWQpCit7CisJaW50IG5yZWFkOworCisJLyoKKwkgKiBUaGlzIHdvcmtzIG9ubHkgaWYgdGhlIG1vZGVtIHByb2R1Y2VzIGl0cyBzdGF0dXMgY29kZSBBRlRFUiByYWlzaW5nCisJICogdGhlIERDRCBsaW5lLCBhbmQgaWYgdGhlIGNvbXB1dGVyIGlzIGZhc3QgZW5vdWdoIHRvIHNldCB0aGUgcHJvcGVyCisJICogYmF1ZCByYXRlIGJlZm9yZSB0aGUgbWVzc2FnZSBoYXMgZ29uZSBieS4gV2UgZXhwZWN0IGEgbWVzc2FnZSBvZiB0aGUKKwkgKiBmb2xsb3dpbmcgZm9ybWF0OgorCSAqCisJICogPGp1bms+PG51bWJlcj48anVuaz4KKwkgKgorCSAqIFRoZSBudW1iZXIgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIGJhdWQgcmF0ZSBvZiB0aGUgaW5jb21pbmcgY2FsbC4gSWYgdGhlCisJICogbW9kZW0gZG9lcyBub3QgdGVsbCB1cyB0aGUgYmF1ZCByYXRlIHdpdGhpbiBvbmUgc2Vjb25kLCB3ZSB3aWxsIGtlZXAKKwkgKiB1c2luZyB0aGUgY3VycmVudCBiYXVkIHJhdGUuIEl0IGlzIGFkdmlzYWJsZSB0byBlbmFibGUgQlJFQUsKKwkgKiBwcm9jZXNzaW5nIChjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBiYXVkIHJhdGVzKSBpZiB0aGUgcHJvY2Vzc2luZyBvZgorCSAqIG1vZGVtIHN0YXR1cyBtZXNzYWdlcyBpcyBlbmFibGVkLgorCSAqLworCisJRy50ZXJtaW9zLmNfY2NbVk1JTl0gPSAwOyAvKiBkb24ndCBibG9jayByZWFkcyAobWluIHJlYWQgaXMgMCBjaGFycykgKi8KKwlzZXRfdGVybWlvcygpOworCisJLyoKKwkgKiBXYWl0IGZvciBhIHdoaWxlLCB0aGVuIHJlYWQgZXZlcnl0aGluZyB0aGUgbW9kZW0gaGFzIHNhaWQgc28gZmFyIGFuZAorCSAqIHRyeSB0byBleHRyYWN0IHRoZSBzcGVlZCBvZiB0aGUgZGlhbC1pbiBjYWxsLgorCSAqLworCXNsZWVwKDEpOworCW5yZWFkID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgRy5saW5lX2J1Ziwgc2l6ZW9mKEcubGluZV9idWYpIC0gMSk7CisJaWYgKG5yZWFkID4gMCkgeworCQlpbnQgc3BlZWQ7CisJCWNoYXIgKmJwOworCQlHLmxpbmVfYnVmW25yZWFkXSA9ICdcMCc7CisJCWZvciAoYnAgPSBHLmxpbmVfYnVmOyBicCA8IEcubGluZV9idWYgKyBucmVhZDsgYnArKykgeworCQkJaWYgKGlzZGlnaXQoKmJwKSkgeworCQkJCXNwZWVkID0gYmNvZGUoYnApOworCQkJCWlmIChzcGVlZCA+IDApCisJCQkJCWNmc2V0c3BlZWQoJkcudGVybWlvcywgc3BlZWQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogUmVzdG9yZSB0ZXJtaW5hbCBzZXR0aW5ncyAqLworCUcudGVybWlvcy5jX2NjW1ZNSU5dID0gMTsgLyogcmVzdG9yZSB0byB2YWx1ZSBzZXQgYnkgdGVybWlvc19pbml0ICovCisJc2V0X3Rlcm1pb3MoKTsKK30KKworLyogZ2V0IHVzZXIgbmFtZSwgZXN0YWJsaXNoIHBhcml0eSwgc3BlZWQsIGVyYXNlLCBraWxsLCBlb2w7CisgKiByZXR1cm4gTlVMTCBvbiBCUkVBSywgbG9nbmFtZSBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBjaGFyICpnZXRfbG9nbmFtZSh2b2lkKQoreworCWNoYXIgKmJwOworCWNoYXIgYzsKKworCS8qIEZsdXNoIHBlbmRpbmcgaW5wdXQgKGVzcC4gYWZ0ZXIgcGFyc2luZyBvciBzd2l0Y2hpbmcgdGhlIGJhdWQgcmF0ZSkgKi8KKwl1c2xlZXAoMTAwKjEwMDApOyAvKiAwLjEgc2VjICovCisJdGNmbHVzaChTVERJTl9GSUxFTk8sIFRDSUZMVVNIKTsKKworCS8qIFByb21wdCBmb3IgYW5kIHJlYWQgYSBsb2dpbiBuYW1lICovCisJRy5saW5lX2J1ZlswXSA9ICdcMCc7CisJd2hpbGUgKCFHLmxpbmVfYnVmWzBdKSB7CisJCS8qIFdyaXRlIGlzc3VlIGZpbGUgYW5kIHByb21wdCAqLworI2lmZGVmIElTU1VFCisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBGX05PSVNTVUUpKQorCQkJcHJpbnRfbG9naW5faXNzdWUoRy5pc3N1ZSwgRy50dHkpOworI2VuZGlmCisJCXByaW50X2xvZ2luX3Byb21wdCgpOworCisJCS8qIFJlYWQgbmFtZSwgd2F0Y2ggZm9yIGJyZWFrLCBwYXJpdHksIGVyYXNlLCBraWxsLCBlbmQtb2YtbGluZSAqLworCQlicCA9IEcubGluZV9idWY7CisJCUcuZW9sID0gJ1wwJzsKKwkJd2hpbGUgKDEpIHsKKwkJCS8qIERvIG5vdCByZXBvcnQgdHJpdmlhbCBFSU5UUi9FSU8gZXJyb3JzICovCisJCQllcnJubyA9IEVJTlRSOyAvKiBtYWtlIHJlYWQgb2YgMCBieXRlcyBiZSBzaWxlbnQgdG9vICovCisJCQlpZiAocmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSA8IDEpIHsKKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUlPKQorCQkJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCX0KKworCQkJLyogQlJFQUsuIElmIHdlIGhhdmUgc3BlZWRzIHRvIHRyeSwKKwkJCSAqIHJldHVybiBOVUxMICh3aWxsIHN3aXRjaCBzcGVlZHMgYW5kIHJldHVybiBoZXJlKSAqLworCQkJaWYgKGMgPT0gJ1wwJyAmJiBHLm51bXNwZWVkID4gMSkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJLyogRG8gZXJhc2UsIGtpbGwgYW5kIGVuZC1vZi1saW5lIHByb2Nlc3NpbmcgKi8KKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXHInOgorCQkJY2FzZSAnXG4nOgorCQkJCSpicCA9ICdcMCc7CisJCQkJRy5lb2wgPSBjOworCQkJCWdvdG8gZ290X2xvZ25hbWU7CisJCQljYXNlIEJTOgorCQkJY2FzZSBERUw6CisJCQkJRy50ZXJtaW9zLmNfY2NbVkVSQVNFXSA9IGM7CisJCQkJaWYgKGJwID4gRy5saW5lX2J1ZikgeworCQkJCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sICJcMDEwIFwwMTAiLCAzKTsKKwkJCQkJYnAtLTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENUTCgnVScpOgorCQkJCXdoaWxlIChicCA+IEcubGluZV9idWYpIHsKKwkJCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAiXDAxMCBcMDEwIiwgMyk7CisJCQkJCWJwLS07CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDVEwoJ0QnKToKKwkJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCQlkZWZhdWx0OgorCQkJCWlmICgodW5zaWduZWQgY2hhciljIDwgJyAnKSB7CisJCQkJCS8qIGlnbm9yZSBnYXJiYWdlIGNoYXJhY3RlcnMgKi8KKwkJCQl9IGVsc2UgaWYgKChpbnQpKGJwIC0gRy5saW5lX2J1ZikgPCBzaXplb2YoRy5saW5lX2J1ZikgLSAxKSB7CisJCQkJCS8qIGVjaG8gYW5kIHN0b3JlIHRoZSBjaGFyYWN0ZXIgKi8KKwkJCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAmYywgMSk7CisJCQkJCSpicCsrID0gYzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0gLyogZW5kIG9mIGdldCBjaGFyIGxvb3AgKi8KKyBnb3RfbG9nbmFtZTogOworCX0gLyogd2hpbGUgbG9nbmFtZSBpcyBlbXB0eSAqLworCisJcmV0dXJuIEcubGluZV9idWY7Cit9CisKK2ludCBnZXR0eV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZ2V0dHlfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBuOworCXBpZF90IHBpZDsKKwljaGFyICpsb2duYW1lOworCisJSU5JVF9HKCk7CisJRy5sb2dpbiA9IF9QQVRIX0xPR0lOOyAgICAvKiBkZWZhdWx0IGxvZ2luIHByb2dyYW0gKi8KKyNpZmRlZiBJU1NVRQorCUcuaXNzdWUgPSBJU1NVRTsgICAgICAgICAgLyogZGVmYXVsdCBpc3N1ZSBmaWxlICovCisjZW5kaWYKKwlHLmVvbCA9ICdccic7CisKKwkvKiBQYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzICovCisJcGFyc2VfYXJncyhhcmd2KTsKKworCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisKKwkvKiBDcmVhdGUgbmV3IHNlc3Npb24sIGxvc2UgY29udHJvbGxpbmcgdHR5LCBpZiBhbnkgKi8KKwkvKiBkb2NzL2N0dHkuaHRtIHNheXM6CisJICogIlRoaXMgaXMgYWxsb3dlZCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgcHJvY2VzcworCSAqICBpcyBub3QgYSBwcm9jZXNzIGdyb3VwIGxlYWRlciIgLSBpcyB0aGlzIGEgcHJvYmxlbT8gKi8KKwlzZXRzaWQoKTsKKwkvKiBjbG9zZSBzdGRpbywgYW5kIHN0cmF5IGRlc2NyaXB0b3JzLCBqdXN0IGluIGNhc2UgKi8KKwluID0geG9wZW4oYmJfZGV2X251bGwsIE9fUkRXUik7CisJLyogZHVwMihuLCAwKTsgLSBubywgd2UgbmVlZCB0byBoYW5kbGUgImdldHR5IC0gOTYwMCIgdG9vICovCisJeGR1cDIobiwgMSk7CisJeGR1cDIobiwgMik7CisJd2hpbGUgKG4gPiAyKQorCQljbG9zZShuLS0pOworCisJLyogTG9nZ2luZy4gV2Ugd2FudCBzcGVjaWFsIGZsYXZvciBvZiBlcnJvcl9tc2dfYW5kX2RpZSAqLworCWRpZV9zbGVlcCA9IDEwOworCW1zZ19lb2wgPSAiXHJcbiI7CisJLyogbW9zdCBsaWtlbHkgd2lsbCBpbnRlcm5hbGx5IHVzZSBmZCAjMyBpbiBDTE9FWEVDIG1vZGU6ICovCisJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0FVVEgpOworCWxvZ21vZGUgPSBMT0dNT0RFX0JPVEg7CisKKyNpZmRlZiBERUJVR0dJTkcKKwlkYmYgPSB4Zm9wZW5fZm9yX3dyaXRlKERFQlVHVEVSTSk7CisJZm9yIChuID0gMTsgYXJndltuXTsgbisrKSB7CisJCWRlYnVnKGFyZ3Zbbl0pOworCQlkZWJ1ZygiXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIE9wZW4gdGhlIHR0eSBhcyBzdGFuZGFyZCBpbnB1dCwgaWYgaXQgaXMgbm90ICItIiAqLworCS8qIElmIGl0J3Mgbm90ICItIiBhbmQgbm90IHRha2VuIHlldCwgaXQgd2lsbCBiZWNvbWUgb3VyIGN0dHkgKi8KKwlkZWJ1ZygiY2FsbGluZyBvcGVuX3R0eVxuIik7CisJb3Blbl90dHkoKTsKKwluZGVsYXlfb2ZmKDApOworCWRlYnVnKCJkdXBpbmdcbiIpOworCXhkdXAyKDAsIDEpOworCXhkdXAyKDAsIDIpOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGlvY3RsIHdpbGwgZmFpbCBpZiBzdGRpbiBpcyBub3QgYSB0dHksIGJ1dCBhbHNvIHdoZW4KKwkgKiB0aGVyZSBpcyBub2lzZSBvbiB0aGUgbW9kZW0gY29udHJvbCBsaW5lcy4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKKwkgKiBjb21tb24gY291cnNlIG9mIGFjdGlvbiBpcyAoMSkgZml4IHlvdXIgY2FibGVzICgyKSBnaXZlIHRoZSBtb2RlbSBtb3JlCisJICogdGltZSB0byBwcm9wZXJseSByZXNldCBhZnRlciBoYW5naW5nIHVwLiBTdW5PUyB1c2VycyBjYW4gYWNoaWV2ZSAoMikKKwkgKiBieSBwYXRjaGluZyB0aGUgU3VuT1Mga2VybmVsIHZhcmlhYmxlICJ6c2FkdHJsb3ciIHRvIGEgbGFyZ2VyIHZhbHVlOworCSAqIDUgc2Vjb25kcyBzZWVtcyB0byBiZSBhIGdvb2QgdmFsdWUuCisJICovCisJaWYgKHRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZHLnRlcm1pb3MpIDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJ0Y2dldGF0dHIiKTsKKworCXBpZCA9IGdldHBpZCgpOworI2lmZGVmIF9fbGludXhfXworLy8gRklYTUU6IGRvIHdlIG5lZWQgdGhpcz8gT3RoZXJ3aXNlICItIiBjYXNlIHNlZW1zIHRvIGJlIGJyb2tlbi4uLgorCS8vIC8qIEZvcmNpYmx5IG1ha2UgZmQgMCBvdXIgY29udHJvbGxpbmcgdHR5LCBldmVuIGlmIGFub3RoZXIgc2Vzc2lvbgorCS8vICAqIGhhcyBpdCBhcyBhIGN0dHkuIChBbm90aGVyIHNlc3Npb24gbG9zZXMgY3R0eSkuICovCisJLy8gaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DU0NUVFksICh2b2lkKikxKTsKKwkvKiBNYWtlIG91cnNlbGYgYSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgd2l0aGluIG91ciBzZXNzaW9uICovCisJdGNzZXRwZ3JwKFNURElOX0ZJTEVOTywgcGlkKTsKKyNlbmRpZgorCisJLyogVXBkYXRlIHRoZSB1dG1wIGZpbGUuIFRoaXMgdHR5IGlzIG91cnMgbm93ISAqLworCXVwZGF0ZV91dG1wKHBpZCwgTE9HSU5fUFJPQ0VTUywgRy50dHksICJMT0dJTiIsIEcuZmFrZWhvc3QpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdGVybWlvcyBzZXR0aW5ncyAocmF3IG1vZGUsIGVpZ2h0LWJpdCwgYmxvY2tpbmcgaS9vKSAqLworCWRlYnVnKCJjYWxsaW5nIHRlcm1pb3NfaW5pdFxuIik7CisJdGVybWlvc19pbml0KEcuc3BlZWRzWzBdKTsKKworCS8qIFdyaXRlIHRoZSBtb2RlbSBpbml0IHN0cmluZyBhbmQgRE9OJ1QgZmx1c2ggdGhlIGJ1ZmZlcnMgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIEZfSU5JVFNUUklORykgeworCQlkZWJ1Zygid3JpdGluZyBpbml0IHN0cmluZ1xuIik7CisJCWZ1bGxfd3JpdGUxX3N0cihHLmluaXRzdHJpbmcpOworCX0KKworCS8qIE9wdGlvbmFsbHkgZGV0ZWN0IHRoZSBiYXVkIHJhdGUgZnJvbSB0aGUgbW9kZW0gc3RhdHVzIG1lc3NhZ2UgKi8KKwlkZWJ1ZygiYmVmb3JlIGF1dG9iYXVkXG4iKTsKKwlpZiAob3B0aW9uX21hc2szMiAmIEZfUEFSU0UpCisJCWF1dG9fYmF1ZCgpOworCisJLyogU2V0IHRoZSBvcHRpb25hbCB0aW1lciAqLworCWFsYXJtKEcudGltZW91dCk7IC8qIGlmIDAsIGFsYXJtIGlzIG5vdCBzZXQgKi8KKy8vQlVHOiBkZWF0aCBieSBzaWduYWwgd29uJ3QgcmVzdG9yZSB0ZXJtaW9zCisKKwkvKiBPcHRpb25hbGx5IHdhaXQgZm9yIENSIG9yIExGIGJlZm9yZSB3cml0aW5nIC9ldGMvaXNzdWUgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIEZfV0FJVENSTEYpIHsKKwkJY2hhciBjaDsKKwkJZGVidWcoIndhaXRpbmcgZm9yIGNyLWxmXG4iKTsKKwkJd2hpbGUgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sICZjaCwgMSkgPT0gMSkgeworCQkJZGVidWcoInJlYWQgJXhcbiIsICh1bnNpZ25lZCBjaGFyKWNoKTsKKwkJCWlmIChjaCA9PSAnXG4nIHx8IGNoID09ICdccicpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlsb2duYW1lID0gTlVMTDsKKwlpZiAoIShvcHRpb25fbWFzazMyICYgRl9OT1BST01QVCkpIHsKKwkJLyogTkI6IHRlcm1pb3NfaW5pdCBhbHJlYWR5IHNldCBsaW5lIHNwZWVkCisJCSAqIHRvIEcuc3BlZWRzWzBdICovCisJCWludCBiYXVkX2luZGV4ID0gMDsKKworCQl3aGlsZSAoMSkgeworCQkJLyogUmVhZCB0aGUgbG9naW4gbmFtZSAqLworCQkJZGVidWcoInJlYWRpbmcgbG9naW4gbmFtZVxuIik7CisJCQlsb2duYW1lID0gZ2V0X2xvZ25hbWUoKTsKKwkJCWlmIChsb2duYW1lKQorCQkJCWJyZWFrOworCQkJLyogV2UgYXJlIGhlcmUgb25seSBpZiBHLm51bXNwZWVkID4gMSAqLworCQkJYmF1ZF9pbmRleCA9IChiYXVkX2luZGV4ICsgMSkgJSBHLm51bXNwZWVkOworCQkJY2ZzZXRzcGVlZCgmRy50ZXJtaW9zLCBHLnNwZWVkc1tiYXVkX2luZGV4XSk7CisJCQlzZXRfdGVybWlvcygpOworCQl9CisJfQorCisJLyogRGlzYWJsZSB0aW1lciAqLworCWFsYXJtKDApOworCisJLyogRmluYWxpemUgdGhlIHRlcm1pb3Mgc2V0dGluZ3MgKi8KKwl0ZXJtaW9zX2ZpbmFsKCk7CisKKwkvKiBOb3cgdGhlIG5ld2xpbmUgY2hhcmFjdGVyIHNob3VsZCBiZSBwcm9wZXJseSB3cml0dGVuICovCisJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAiXG4iLCAxKTsKKworCS8qIExldCB0aGUgbG9naW4gcHJvZ3JhbSB0YWtlIGNhcmUgb2YgcGFzc3dvcmQgdmFsaWRhdGlvbiAqLworCS8qIFdlIHVzZSBQQVRIIGJlY2F1c2Ugd2UgdHJ1c3QgdGhhdCByb290IGRvZXNuJ3Qgc2V0ICJiYWQiIFBBVEgsCisJICogYW5kIGdldHR5IGlzIG5vdCBzdWlkLXJvb3QgYXBwbGV0ICovCisJLyogV2l0aCAtbiwgbG9nbmFtZSA9PSBOVUxMLCBhbmQgbG9naW4gd2lsbCBhc2sgZm9yIHVzZXJuYW1lIGluc3RlYWQgKi8KKwlCQl9FWEVDTFAoRy5sb2dpbiwgRy5sb2dpbiwgIi0tIiwgbG9nbmFtZSwgTlVMTCk7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIEcubG9naW4pOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9sb2dpbi5jIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9sb2dpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2I5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL2xvZ2luLmMKQEAgLTAsMCArMSw0NjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxvZ2luX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXBdIFstaCBIT1NUXSBbWy1mXSBVU0VSXSIKKy8vdXNhZ2U6I2RlZmluZSBsb2dpbl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkJlZ2luIGEgbmV3IHNlc3Npb24gb24gdGhlIHN5c3RlbVxuIgorLy91c2FnZTogICAgICJcbgktZglEb24ndCBhdXRoZW50aWNhdGUgKHVzZXIgYWxyZWFkeSBhdXRoZW50aWNhdGVkKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJTmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QiCisvL3VzYWdlOiAgICAgIlxuCS1wCVByZXNlcnZlIGVudmlyb25tZW50IgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2lmIEVOQUJMRV9TRUxJTlVYCisjIGluY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPiAgLyogZm9yIGlzX3NlbGludXhfZW5hYmxlZCgpICAqLworIyBpbmNsdWRlIDxzZWxpbnV4L2dldF9jb250ZXh0X2xpc3QuaD4gLyogZm9yIGdldF9kZWZhdWx0X2NvbnRleHQoKSAqLworIyBpbmNsdWRlIDxzZWxpbnV4L2ZsYXNrLmg+IC8qIGZvciBzZWN1cml0eSBjbGFzcyBkZWZpbml0aW9ucyAgKi8KKyNlbmRpZgorCisjaWYgRU5BQkxFX1BBTQorLyogUEFNIG1heSBpbmNsdWRlIDxsb2NhbGUuaD4uIFdlIG1heSBuZWVkIHRvIHVuZGVmaW5lIGJib3gncyBzdHViIGRlZmluZTogKi8KKyMgdW5kZWYgc2V0bG9jYWxlCisvKiBGb3Igc29tZSBvYnNjdXJlIHJlYXNvbiwgUEFNIGlzIG5vdCBpbiBwYW0veHh4LCBidXQgaW4gc2VjdXJpdHkveHh4LgorICogQXBwYXJlbnRseSB0aGV5IGxpa2UgdG8gY29uZnVzZSBwZW9wbGUuICovCisjIGluY2x1ZGUgPHNlY3VyaXR5L3BhbV9hcHBsLmg+CisjIGluY2x1ZGUgPHNlY3VyaXR5L3BhbV9taXNjLmg+CitzdGF0aWMgY29uc3Qgc3RydWN0IHBhbV9jb252IGNvbnYgPSB7CisJbWlzY19jb252LAorCU5VTEwKK307CisjZW5kaWYKKworZW51bSB7CisJVElNRU9VVCA9IDYwLAorCUVNUFRZX1VTRVJOQU1FX0NPVU5UID0gMTAsCisJVVNFUk5BTUVfU0laRSA9IDMyLAorCVRUWU5BTUVfU0laRSA9IDMyLAorfTsKKworc3RhdGljIGNoYXIqIHNob3J0X3R0eTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX05PTE9HSU4KK3N0YXRpYyB2b2lkIGRpZV9pZl9ub2xvZ2luKHZvaWQpCit7CisJRklMRSAqZnA7CisJaW50IGM7CisJaW50IGVtcHR5ID0gMTsKKworCWZwID0gZm9wZW5fZm9yX3JlYWQoIi9ldGMvbm9sb2dpbiIpOworCWlmICghZnApIC8qIGFzc3VtaW5nIGl0IGRvZXMgbm90IGV4aXN0ICovCisJCXJldHVybjsKKworCXdoaWxlICgoYyA9IGdldGMoZnApKSAhPSBFT0YpIHsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWJiX3B1dGNoYXIoJ1xyJyk7CisJCWJiX3B1dGNoYXIoYyk7CisJCWVtcHR5ID0gMDsKKwl9CisJaWYgKGVtcHR5KQorCQlwdXRzKCJcclxuU3lzdGVtIGNsb3NlZCBmb3Igcm91dGluZSBtYWludGVuYW5jZVxyIik7CisKKwlmY2xvc2UoZnApOworCWZmbHVzaF9hbGwoKTsKKwkvKiBVc2VycyBzYXkgdGhhdCB0aGV5IGRvIG5lZWQgdGhpcyBwcmlvciB0byBleGl0OiAqLworCXRjZHJhaW4oU1RET1VUX0ZJTEVOTyk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorI2Vsc2UKKyMgZGVmaW5lIGRpZV9pZl9ub2xvZ2luKCkgKCh2b2lkKTApCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQ1VSRVRUWSAmJiAhRU5BQkxFX1BBTQorc3RhdGljIGludCBjaGVja19zZWN1cmV0dHkodm9pZCkKK3sKKwljaGFyICpidWYgPSAoY2hhciopIi9ldGMvc2VjdXJldHR5IjsgLyogYW55IG5vbi1OVUxMIGlzIG9rICovCisJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuMigiL2V0Yy9zZWN1cmV0dHkiLCBmb3Blbl9mb3JfcmVhZCk7CisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgJmJ1ZiwgMSwgMSwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpKSB7CisJCWlmIChzdHJjbXAoYnVmLCBzaG9ydF90dHkpID09IDApCisJCQlicmVhazsKKwkJYnVmID0gTlVMTDsKKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJLyogYnVmICE9IE5VTEwgaGVyZSBpZiBjb25maWcgZmlsZSB3YXMgbm90IGZvdW5kLCBlbXB0eQorCSAqIG9yIGxpbmUgd2FzIGZvdW5kIHdoaWNoIGVxdWFscyBzaG9ydF90dHkgKi8KKwlyZXR1cm4gYnVmICE9IE5VTEw7Cit9CisjZWxzZQorc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IGNoZWNrX3NlY3VyZXR0eSh2b2lkKSB7IHJldHVybiAxOyB9CisjZW5kaWYKKworI2lmIEVOQUJMRV9TRUxJTlVYCitzdGF0aWMgdm9pZCBpbml0c2VsaW51eChjaGFyICp1c2VybmFtZSwgY2hhciAqZnVsbF90dHksCisJCQkJCQlzZWN1cml0eV9jb250ZXh0X3QgKnVzZXJfc2lkKQoreworCXNlY3VyaXR5X2NvbnRleHRfdCBvbGRfdHR5X3NpZCwgbmV3X3R0eV9zaWQ7CisKKwlpZiAoIWlzX3NlbGludXhfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwlpZiAoZ2V0X2RlZmF1bHRfY29udGV4dCh1c2VybmFtZSwgTlVMTCwgdXNlcl9zaWQpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgU0lEIGZvciAlcyIsIHVzZXJuYW1lKTsKKwl9CisJaWYgKGdldGZpbGVjb24oZnVsbF90dHksICZvbGRfdHR5X3NpZCkgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0ZmlsZWNvbiglcykgZmFpbGVkIiwgZnVsbF90dHkpOworCX0KKwlpZiAoc2VjdXJpdHlfY29tcHV0ZV9yZWxhYmVsKCp1c2VyX3NpZCwgb2xkX3R0eV9zaWQsCisJCQkJU0VDQ0xBU1NfQ0hSX0ZJTEUsICZuZXdfdHR5X3NpZCkgIT0gMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNlY3VyaXR5X2NoYW5nZV9zaWQoJXMpIGZhaWxlZCIsIGZ1bGxfdHR5KTsKKwl9CisJaWYgKHNldGZpbGVjb24oZnVsbF90dHksIG5ld190dHlfc2lkKSAhPSAwKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2hzaWQoJXMsICVzKSBmYWlsZWQiLCBmdWxsX3R0eSwgbmV3X3R0eV9zaWQpOworCX0KK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0xPR0lOX1NDUklQVFMKK3N0YXRpYyB2b2lkIHJ1bl9sb2dpbl9zY3JpcHQoc3RydWN0IHBhc3N3ZCAqcHcsIGNoYXIgKmZ1bGxfdHR5KQoreworCWNoYXIgKnRfYXJndlsyXTsKKworCXRfYXJndlswXSA9IGdldGVudigiTE9HSU5fUFJFX1NVSURfU0NSSVBUIik7CisJaWYgKHRfYXJndlswXSkgeworCQl0X2FyZ3ZbMV0gPSBOVUxMOworCQl4c2V0ZW52KCJMT0dJTl9UVFkiLCBmdWxsX3R0eSk7CisJCXhzZXRlbnYoIkxPR0lOX1VTRVIiLCBwdy0+cHdfbmFtZSk7CisJCXhzZXRlbnYoIkxPR0lOX1VJRCIsIHV0b2EocHctPnB3X3VpZCkpOworCQl4c2V0ZW52KCJMT0dJTl9HSUQiLCB1dG9hKHB3LT5wd19naWQpKTsKKwkJeHNldGVudigiTE9HSU5fU0hFTEwiLCBwdy0+cHdfc2hlbGwpOworCQlzcGF3bl9hbmRfd2FpdCh0X2FyZ3YpOyAvKiBOT01NVS1mcmllbmRseSAqLworCQl1bnNldGVudigiTE9HSU5fVFRZIik7CisJCXVuc2V0ZW52KCJMT0dJTl9VU0VSIik7CisJCXVuc2V0ZW52KCJMT0dJTl9VSUQiKTsKKwkJdW5zZXRlbnYoIkxPR0lOX0dJRCIpOworCQl1bnNldGVudigiTE9HSU5fU0hFTEwiKTsKKwl9Cit9CisjZWxzZQordm9pZCBydW5fbG9naW5fc2NyaXB0KHN0cnVjdCBwYXNzd2QgKnB3LCBjaGFyICpmdWxsX3R0eSk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X3VzZXJuYW1lX29yX2RpZShjaGFyICpidWYsIGludCBzaXplX2J1ZikKK3sKKwlpbnQgYywgY250ZG93bjsKKworCWNudGRvd24gPSBFTVBUWV9VU0VSTkFNRV9DT1VOVDsKKyBwcm9tcHQ6CisJcHJpbnRfbG9naW5fcHJvbXB0KCk7CisJLyogc2tpcCB3aGl0ZXNwYWNlICovCisJZG8geworCQljID0gZ2V0Y2hhcigpOworCQlpZiAoYyA9PSBFT0YpCisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCWlmIChjID09ICdcbicpIHsKKwkJCWlmICghLS1jbnRkb3duKQorCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCWdvdG8gcHJvbXB0OworCQl9CisJfSB3aGlsZSAoaXNzcGFjZShjKSk7IC8qIG1heWJlIGlzYmxhbms/ICovCisKKwkqYnVmKysgPSBjOworCWlmICghZmdldHMoYnVmLCBzaXplX2J1Zi0yLCBzdGRpbikpCisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwlpZiAoIXN0cmNocihidWYsICdcbicpKQorCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJd2hpbGUgKCh1bnNpZ25lZCBjaGFyKSpidWYgPiAnICcpCisJCWJ1ZisrOworCSpidWYgPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBtb3RkKHZvaWQpCit7CisJaW50IGZkOworCisJZmQgPSBvcGVuKGJiX3BhdGhfbW90ZF9maWxlLCBPX1JET05MWSk7CisJaWYgKGZkID49IDApIHsKKwkJZmZsdXNoX2FsbCgpOworCQliYl9jb3B5ZmRfZW9mKGZkLCBTVERPVVRfRklMRU5PKTsKKwkJY2xvc2UoZmQpOworCX0KK30KKworc3RhdGljIHZvaWQgYWxhcm1faGFuZGxlcihpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBUaGlzIGlzIHRoZSBlc2NhcGUgaGF0Y2ghICBQb29yIHNlcmlhbCBsaW5lIHVzZXJzIGFuZCB0aGUgbGlrZQorCSAqIGFycml2ZSBoZXJlIHdoZW4gdGhlaXIgY29ubmVjdGlvbiBpcyBicm9rZW4uCisJICogV2UgZG9uJ3Qgd2FudCB0byBibG9jayBoZXJlICovCisJbmRlbGF5X29uKDEpOworCXByaW50ZigiXHJcbkxvZ2luIHRpbWVkIG91dCBhZnRlciAlZCBzZWNvbmRzXHJcbiIsIFRJTUVPVVQpOworCWZmbHVzaF9hbGwoKTsKKwkvKiB1bml4IEFQSSBpcyBicmFpbiBkYW1hZ2VkIHJlZ2FyZGluZyBPX05PTkJMT0NLLAorCSAqIHdlIHNob3VsZCB1bmRvIGl0LCBvciBlbHNlIHdlIGNhbiBhZmZlY3Qgb3RoZXIgcHJvY2Vzc2VzICovCisJbmRlbGF5X29mZigxKTsKKwlfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCitpbnQgbG9naW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxvZ2luX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJTE9HSU5fT1BUX2YgPSAoMTw8MCksCisJCUxPR0lOX09QVF9oID0gKDE8PDEpLAorCQlMT0dJTl9PUFRfcCA9ICgxPDwyKSwKKwl9OworCWNoYXIgKmZyb21ob3N0OworCWNoYXIgdXNlcm5hbWVbVVNFUk5BTUVfU0laRV07CisJaW50IHJ1bl9ieV9yb290OworCXVuc2lnbmVkIG9wdDsKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCBwYXNzd2QgKnB3OworCWNoYXIgKm9wdF9ob3N0ID0gTlVMTDsKKwljaGFyICpvcHRfdXNlciA9IG9wdF91c2VyOyAvKiBmb3IgY29tcGlsZXIgKi8KKwljaGFyICpmdWxsX3R0eTsKKwlJRl9TRUxJTlVYKHNlY3VyaXR5X2NvbnRleHRfdCB1c2VyX3NpZCA9IE5VTEw7KQorI2lmIEVOQUJMRV9QQU0KKwlpbnQgcGFtcmV0OworCXBhbV9oYW5kbGVfdCAqcGFtaDsKKwljb25zdCBjaGFyICpwYW11c2VyOworCWNvbnN0IGNoYXIgKmZhaWxlZF9tc2c7CisJc3RydWN0IHBhc3N3ZCBwd2RzdHJ1Y3Q7CisJY2hhciBwd2RidWZbMjU2XTsKKwljaGFyICoqcGFtZW52OworI2VuZGlmCisKKwl1c2VybmFtZVswXSA9ICdcMCc7CisJc2lnbmFsKFNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpOworCWFsYXJtKFRJTUVPVVQpOworCisJLyogTW9yZSBvZiBzdWlkIHBhcmFub2lhIGlmIGNhbGxlZCBieSBub24tcm9vdDogKi8KKwkvKiBDbGVhciBkYW5nZXJvdXMgc3R1ZmYsIHNldCBQQVRIICovCisJcnVuX2J5X3Jvb3QgPSAhc2FuaXRpemVfZW52X2lmX3N1aWQoKTsKKworCS8qIE1hbmRhdG9yeSBwYXJhbm9pYSBmb3Igc3VpZCBhcHBsZXQ6CisJICogZW5zdXJlIHRoYXQgZmQjIDAsMSwyIGFyZSBvcGVuZWQgKGF0IGxlYXN0IHRvIC9kZXYvbnVsbCkKKwkgKiBhbmQgYW55IGV4dHJhIG9wZW4gZmQncyBhcmUgY2xvc2VkLgorCSAqIChUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaXMgbWlzbGVhZGluZy4gTm90IGRhZW1vbml6aW5nIGhlcmUuKSAqLworCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fT05MWV9TQU5JVElaRSB8IERBRU1PTl9DTE9TRV9FWFRSQV9GRFMsIE5VTEwpOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImY6aDpwIiwgJm9wdF91c2VyLCAmb3B0X2hvc3QpOworCWlmIChvcHQgJiBMT0dJTl9PUFRfZikgeworCQlpZiAoIXJ1bl9ieV9yb290KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi1mIGlzIGZvciByb290IG9ubHkiKTsKKwkJc2FmZV9zdHJuY3B5KHVzZXJuYW1lLCBvcHRfdXNlciwgc2l6ZW9mKHVzZXJuYW1lKSk7CisJfQorCWFyZ3YgKz0gb3B0aW5kOworCWlmIChhcmd2WzBdKSAvKiB1c2VyIGZyb20gY29tbWFuZCBsaW5lIChnZXR0eSkgKi8KKwkJc2FmZV9zdHJuY3B5KHVzZXJuYW1lLCBhcmd2WzBdLCBzaXplb2YodXNlcm5hbWUpKTsKKworCS8qIExldCdzIGZpbmQgb3V0IGFuZCBtZW1vcml6ZSBvdXIgdHR5ICovCisJaWYgKCFpc2F0dHkoU1RESU5fRklMRU5PKSB8fCAhaXNhdHR5KFNURE9VVF9GSUxFTk8pIHx8ICFpc2F0dHkoU1RERVJSX0ZJTEVOTykpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7ICAvKiBNdXN0IGJlIGEgdGVybWluYWwgKi8KKwlmdWxsX3R0eSA9IHhtYWxsb2NfdHR5bmFtZShTVERJTl9GSUxFTk8pOworCWlmICghZnVsbF90dHkpCisJCWZ1bGxfdHR5ID0geHN0cmR1cCgiVU5LTk9XTiIpOworCXNob3J0X3R0eSA9IHNraXBfZGV2X3BmeChmdWxsX3R0eSk7CisKKwlpZiAob3B0X2hvc3QpIHsKKwkJZnJvbWhvc3QgPSB4YXNwcmludGYoIiBvbiAnJXMnIGZyb20gJyVzJyIsIHNob3J0X3R0eSwgb3B0X2hvc3QpOworCX0gZWxzZSB7CisJCWZyb21ob3N0ID0geGFzcHJpbnRmKCIgb24gJyVzJyIsIHNob3J0X3R0eSk7CisJfQorCisJLyogV2FzIGJyZWFraW5nICJsb2dpbiA8dXNlcm5hbWU+IiBmcm9tIHNoZWxsIGNvbW1hbmQgbGluZTogKi8KKwkvKmJiX3NldHBncnAoKTsqLworCisJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCB8IExPR19DT05TLCBMT0dfQVVUSCk7CisKKwl3aGlsZSAoMSkgeworCQkvKiBmbHVzaCBhd2F5IGFueSB0eXBlLWFoZWFkIChhcyBnZXR0eSBkb2VzKSAqLworCQl0Y2ZsdXNoKDAsIFRDSUZMVVNIKTsKKworCQlpZiAoIXVzZXJuYW1lWzBdKQorCQkJZ2V0X3VzZXJuYW1lX29yX2RpZSh1c2VybmFtZSwgc2l6ZW9mKHVzZXJuYW1lKSk7CisKKyNpZiBFTkFCTEVfUEFNCisJCXBhbXJldCA9IHBhbV9zdGFydCgibG9naW4iLCB1c2VybmFtZSwgJmNvbnYsICZwYW1oKTsKKwkJaWYgKHBhbXJldCAhPSBQQU1fU1VDQ0VTUykgeworCQkJZmFpbGVkX21zZyA9ICJzdGFydCI7CisJCQlnb3RvIHBhbV9hdXRoX2ZhaWxlZDsKKwkJfQorCQkvKiBzZXQgVFRZIChzbyB0aGluZ3MgbGlrZSBzZWN1cmV0dHkgd29yaykgKi8KKwkJcGFtcmV0ID0gcGFtX3NldF9pdGVtKHBhbWgsIFBBTV9UVFksIHNob3J0X3R0eSk7CisJCWlmIChwYW1yZXQgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCWZhaWxlZF9tc2cgPSAic2V0X2l0ZW0oVFRZKSI7CisJCQlnb3RvIHBhbV9hdXRoX2ZhaWxlZDsKKwkJfQorCQkvKiBzZXQgUkhPU1QgKi8KKwkJaWYgKG9wdF9ob3N0KSB7CisJCQlwYW1yZXQgPSBwYW1fc2V0X2l0ZW0ocGFtaCwgUEFNX1JIT1NULCBvcHRfaG9zdCk7CisJCQlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCQkJZmFpbGVkX21zZyA9ICJzZXRfaXRlbShSSE9TVCkiOworCQkJCWdvdG8gcGFtX2F1dGhfZmFpbGVkOworCQkJfQorCQl9CisJCXBhbXJldCA9IHBhbV9hdXRoZW50aWNhdGUocGFtaCwgMCk7CisJCWlmIChwYW1yZXQgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCWZhaWxlZF9tc2cgPSAiYXV0aGVudGljYXRlIjsKKwkJCWdvdG8gcGFtX2F1dGhfZmFpbGVkOworCQkJLyogVE9ETzogb3IganVzdCAiZ290byBhdXRoX2ZhaWxlZCIKKwkJCSAqIHNpbmNlIHVzZXIgc2VlbXMgdG8gZW50ZXIgd3JvbmcgcGFzc3dvcmQKKwkJCSAqIChpbiB0aGlzIGNhc2UgcGFtcmV0ID09IDcpCisJCQkgKi8KKwkJfQorCQkvKiBjaGVjayB0aGF0IHRoZSBhY2NvdW50IGlzIGhlYWx0aHkgKi8KKwkJcGFtcmV0ID0gcGFtX2FjY3RfbWdtdChwYW1oLCAwKTsKKwkJaWYgKHBhbXJldCAhPSBQQU1fU1VDQ0VTUykgeworCQkJZmFpbGVkX21zZyA9ICJhY2N0X21nbXQiOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJLyogcmVhZCB1c2VyIGJhY2sgKi8KKwkJcGFtdXNlciA9IE5VTEw7CisJCS8qIGdjYzogImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciBicmVha3MgYWxpYXNpbmcgcnVsZXMuLi4iCisJCSAqIHRodXMgd2UgY2FzdCB0byAodm9pZCopICovCisJCWlmIChwYW1fZ2V0X2l0ZW0ocGFtaCwgUEFNX1VTRVIsICh2b2lkKikmcGFtdXNlcikgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCWZhaWxlZF9tc2cgPSAiZ2V0X2l0ZW0oVVNFUikiOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJaWYgKCFwYW11c2VyIHx8ICFwYW11c2VyWzBdKQorCQkJZ290byBhdXRoX2ZhaWxlZDsKKwkJc2FmZV9zdHJuY3B5KHVzZXJuYW1lLCBwYW11c2VyLCBzaXplb2YodXNlcm5hbWUpKTsKKwkJLyogRG9uJ3QgdXNlICJwdyA9IGdldHB3bmFtKHVzZXJuYW1lKTsiLAorCQkgKiBQQU0gaXMgc2FpZCB0byBiZSBjYXBhYmxlIG9mIGRlc3Ryb3lpbmcgc3RhdGljIHN0b3JhZ2UKKwkJICogdXNlZCBieSBnZXRwd25hbSgpLiBXZSBhcmUgdXNpbmcgc2FmZShyKSBmdW5jdGlvbiAqLworCQlwdyA9IE5VTEw7CisJCWdldHB3bmFtX3IodXNlcm5hbWUsICZwd2RzdHJ1Y3QsIHB3ZGJ1Ziwgc2l6ZW9mKHB3ZGJ1ZiksICZwdyk7CisJCWlmICghcHcpCisJCQlnb3RvIGF1dGhfZmFpbGVkOworCQlwYW1yZXQgPSBwYW1fb3Blbl9zZXNzaW9uKHBhbWgsIDApOworCQlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCQlmYWlsZWRfbXNnID0gIm9wZW5fc2Vzc2lvbiI7CisJCQlnb3RvIHBhbV9hdXRoX2ZhaWxlZDsKKwkJfQorCQlwYW1yZXQgPSBwYW1fc2V0Y3JlZChwYW1oLCBQQU1fRVNUQUJMSVNIX0NSRUQpOworCQlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCQlmYWlsZWRfbXNnID0gInNldGNyZWQiOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJYnJlYWs7IC8qIHN1Y2Nlc3MsIGNvbnRpbnVlIGxvZ2luIHByb2Nlc3MgKi8KKworIHBhbV9hdXRoX2ZhaWxlZDoKKwkJLyogc3lzbG9nLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgcG90ZW50aWFsIGF0dGFja2VyCisJCSAqIHRvIGtub3cgX3doeV8gbG9naW4gZmFpbGVkICovCisJCXN5c2xvZyhMT0dfV0FSTklORywgInBhbV8lcyBjYWxsIGZhaWxlZDogJXMgKCVkKSIsIGZhaWxlZF9tc2csCisJCQkJCXBhbV9zdHJlcnJvcihwYW1oLCBwYW1yZXQpLCBwYW1yZXQpOworCQlzYWZlX3N0cm5jcHkodXNlcm5hbWUsICJVTktOT1dOIiwgc2l6ZW9mKHVzZXJuYW1lKSk7CisjZWxzZSAvKiBub3QgUEFNICovCisJCXB3ID0gZ2V0cHduYW0odXNlcm5hbWUpOworCQlpZiAoIXB3KSB7CisJCQlzdHJjcHkodXNlcm5hbWUsICJVTktOT1dOIik7CisJCQlnb3RvIGZha2VfaXQ7CisJCX0KKworCQlpZiAocHctPnB3X3Bhc3N3ZFswXSA9PSAnIScgfHwgcHctPnB3X3Bhc3N3ZFswXSA9PSAnKicpCisJCQlnb3RvIGF1dGhfZmFpbGVkOworCisJCWlmIChvcHQgJiBMT0dJTl9PUFRfZikKKwkJCWJyZWFrOyAvKiAtZiBVU0VSOiBzdWNjZXNzIHdpdGhvdXQgYXNraW5nIHBhc3N3ZCAqLworCisJCWlmIChwdy0+cHdfdWlkID09IDAgJiYgIWNoZWNrX3NlY3VyZXR0eSgpKQorCQkJZ290byBhdXRoX2ZhaWxlZDsKKworCQkvKiBEb24ndCBjaGVjayB0aGUgcGFzc3dvcmQgaWYgcGFzc3dvcmQgZW50cnkgaXMgZW1wdHkgKCEpICovCisJCWlmICghcHctPnB3X3Bhc3N3ZFswXSkKKwkJCWJyZWFrOworIGZha2VfaXQ6CisJCS8qIGF1dGhvcml6YXRpb24gdGFrZXMgcGxhY2UgaGVyZSAqLworCQlpZiAoY29ycmVjdF9wYXNzd29yZChwdykpCisJCQlicmVhazsKKyNlbmRpZiAvKiBFTkFCTEVfUEFNICovCisgYXV0aF9mYWlsZWQ6CisJCW9wdCAmPSB+TE9HSU5fT1BUX2Y7CisJCWJiX2RvX2RlbGF5KExPR0lOX0ZBSUxfREVMQVkpOworCQkvKiBUT0RPOiBkb2Vzbid0IHNvdW5kIGxpa2UgY29ycmVjdCBFbmdsaXNoIHBocmFzZSB0byBtZSAqLworCQlwdXRzKCJMb2dpbiBpbmNvcnJlY3QiKTsKKwkJaWYgKCsrY291bnQgPT0gMykgeworCQkJc3lzbG9nKExPR19XQVJOSU5HLCAiaW52YWxpZCBwYXNzd29yZCBmb3IgJyVzJyVzIiwKKwkJCQkJCXVzZXJuYW1lLCBmcm9taG9zdCk7CisKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQlmcmVlKGZyb21ob3N0KTsKKworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCQl1c2VybmFtZVswXSA9ICdcMCc7CisJfSAvKiB3aGlsZSAoMSkgKi8KKworCWFsYXJtKDApOworCS8qIFdlIGNhbiBpZ25vcmUgL2V0Yy9ub2xvZ2luIGlmIHdlIGFyZSBsb2dnaW5nIGluIGFzIHJvb3QsCisJICogaXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB3ZSBhcmUgcnVuIGJ5IHJvb3Qgb3Igbm90ICovCisJaWYgKHB3LT5wd191aWQgIT0gMCkKKwkJZGllX2lmX25vbG9naW4oKTsKKworCUlGX1NFTElOVVgoaW5pdHNlbGludXgodXNlcm5hbWUsIGZ1bGxfdHR5LCAmdXNlcl9zaWQpKTsKKworCS8qIFRyeSB0aGVzZSwgYnV0IGRvbid0IGNvbXBsYWluIGlmIHRoZXkgZmFpbC4KKwkgKiBfZl9jaG93biBpcyBzYWZlIHdydCByYWNlIHQ9dHR5bmFtZSgwKTsuLi47Y2hvd24odCk7ICovCisJZmNob3duKDAsIHB3LT5wd191aWQsIHB3LT5wd19naWQpOworCWZjaG1vZCgwLCAwNjAwKTsKKworCXVwZGF0ZV91dG1wKGdldHBpZCgpLCBVU0VSX1BST0NFU1MsIHNob3J0X3R0eSwgdXNlcm5hbWUsIHJ1bl9ieV9yb290ID8gb3B0X2hvc3QgOiBOVUxMKTsKKworCS8qIFdlIHRydXN0IGVudmlyb25tZW50IG9ubHkgaWYgd2UgcnVuIGJ5IHJvb3QgKi8KKwlpZiAoRU5BQkxFX0xPR0lOX1NDUklQVFMgJiYgcnVuX2J5X3Jvb3QpCisJCXJ1bl9sb2dpbl9zY3JpcHQocHcsIGZ1bGxfdHR5KTsKKworCWNoYW5nZV9pZGVudGl0eShwdyk7CisJc2V0dXBfZW52aXJvbm1lbnQocHctPnB3X3NoZWxsLAorCQkJKCEob3B0ICYgTE9HSU5fT1BUX3ApICogU0VUVVBfRU5WX0NMRUFSRU5WKSArIFNFVFVQX0VOVl9DSEFOR0VFTlYsCisJCQlwdyk7CisKKyNpZiBFTkFCTEVfUEFNCisJLyogTW9kdWxlcyBzdWNoIGFzIHBhbV9lbnYgd2lsbCBzZXR1cCB0aGUgUEFNIGVudmlyb25tZW50LAorCSAqIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgaW50byB0aGUgbmV3IGVudmlyb25tZW50LiAqLworCXBhbWVudiA9IHBhbV9nZXRlbnZsaXN0KHBhbWgpOworCWlmIChwYW1lbnYpIHdoaWxlICgqcGFtZW52KSB7CisJCXB1dGVudigqcGFtZW52KTsKKwkJcGFtZW52Kys7CisJfQorI2VuZGlmCisKKwltb3RkKCk7CisKKwlpZiAocHctPnB3X3VpZCA9PSAwKQorCQlzeXNsb2coTE9HX0lORk8sICJyb290IGxvZ2luJXMiLCBmcm9taG9zdCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoZnJvbWhvc3QpOworCisJLyogd2VsbCwgYSBzaW1wbGUgc2V0ZXhlY2NvbigpIGhlcmUgd291bGQgZG8gdGhlIGpvYiBhcyB3ZWxsLAorCSAqIGJ1dCBsZXQncyBwbGF5IHRoZSBnYW1lIGZvciBub3cgKi8KKwlJRl9TRUxJTlVYKHNldF9jdXJyZW50X3NlY3VyaXR5X2NvbnRleHQodXNlcl9zaWQpOykKKworCS8vIHV0aWwtbGludXggbG9naW4gYWxzbyBkb2VzOgorCS8vIC8qIHN0YXJ0IG5ldyBzZXNzaW9uICovCisJLy8gc2V0c2lkKCk7CisJLy8gLyogVElPQ1NDVFRZOiBzdGVhbCB0dHkgZnJvbSBvdGhlciBwcm9jZXNzIGdyb3VwICovCisJLy8gaWYgKGlvY3RsKDAsIFRJT0NTQ1RUWSwgMSkpIGVycm9yX21zZy4uLgorCS8vIEJCb3ggbG9naW4gdXNlZCB0byBkbyB0aGlzIChzZWUgYWJvdmUpOgorCS8vIGJiX3NldHBncnAoKTsKKwkvLyBJZiB0aGlzIHN0dWZmIGlzIHJlYWxseSBuZWVkZWQsIGFkZCBpdCBhbmQgZXhwbGFpbiB3aHkhCisKKwkvKiBTZXQgc2lnbmFscyB0byBkZWZhdWx0cyAqLworCS8qIE5vbi1pZ25vcmVkIHNpZ25hbHMgcmV2ZXJ0IHRvIFNJR19ERkwgb24gZXhlYyBhbnl3YXkgKi8KKwkvKnNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsqLworCisJLyogSXMgdGhpcyBjb3JyZWN0PyBUaGlzIHdheSB1c2VyIGNhbiBjdHJsLWMgb3V0IG9mIC9ldGMvcHJvZmlsZSwKKwkgKiBwb3RlbnRpYWxseSBjcmVhdGluZyBzZWN1cml0eSBicmVhY2ggKHRlc3RlZCB3aXRoIGJhc2ggMy4wKS4KKwkgKiBCdXQgd2l0aG91dCB0aGlzLCBiYXNoIDMuMCB3aWxsIG5vdCBlbmFibGUgY3RybC1jIGVpdGhlci4KKwkgKiBNYXliZSBiYXNoIGlzIGJ1Z2d5PworCSAqIE5lZWQgdG8gZmluZCBvdXQgd2hhdCBzdGFuZGFyZHMgc2F5IGFib3V0IC9iaW4vbG9naW4gLQorCSAqIHNob3VsZCB3ZSBsZWF2ZSBTSUdJTlQgZXRjIGVuYWJsZWQgb3IgZGlzYWJsZWQ/ICovCisJc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisKKwkvKiBFeGVjIGxvZ2luIHNoZWxsIHdpdGggbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzICovCisJcnVuX3NoZWxsKHB3LT5wd19zaGVsbCwgMSwgTlVMTCwgTlVMTCk7CisKKwkvKiByZXR1cm4gRVhJVF9GQUlMVVJFOyAtIG5vdCByZWFjaGVkICovCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL3Bhc3N3ZC5jIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9wYXNzd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2ZhZmFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9wYXNzd2QuYwpAQCAtMCwwICsxLDIyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcGFzc3dkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW1VTRVJdIgorLy91c2FnZTojZGVmaW5lIHBhc3N3ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSBVU0VSJ3MgcGFzc3dvcmQgKGRlZmF1bHQ6IGN1cnJlbnQgdXNlcikiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbgktYSBBTEcJRW5jcnlwdGlvbiBtZXRob2QiCisvL3VzYWdlOiAgICAgIlxuCS1kCVNldCBwYXNzd29yZCB0byAnJyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTG9jayAoZGlzYWJsZSkgYWNjb3VudCIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJVW5sb2NrIChlbmFibGUpIGFjY291bnQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCitzdGF0aWMgdm9pZCBudWtlX3N0cihjaGFyICpzdHIpCit7CisJaWYgKHN0cikgbWVtc2V0KHN0ciwgMCwgc3RybGVuKHN0cikpOworfQorCitzdGF0aWMgY2hhciogbmV3X3Bhc3N3b3JkKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3LCB1aWRfdCBteXVpZCwgY29uc3QgY2hhciAqYWxnbykKK3sKKwljaGFyIHNhbHRbTUFYX1BXX1NBTFRfTEVOXTsKKwljaGFyICpvcmlnID0gKGNoYXIqKSIiOworCWNoYXIgKm5ld3AgPSBOVUxMOworCWNoYXIgKmNwID0gTlVMTDsKKwljaGFyICpyZXQgPSBOVUxMOyAvKiBmYWlsdXJlIHNvIGZhciAqLworCisJaWYgKG15dWlkICE9IDAgJiYgcHctPnB3X3Bhc3N3ZFswXSkgeworCQljaGFyICplbmNyeXB0ZWQ7CisKKwkJb3JpZyA9IGJiX2Fza19zdGRpbigiT2xkIHBhc3N3b3JkOiAiKTsgLyogcmV0dXJucyBwdHIgdG8gc3RhdGljICovCisJCWlmICghb3JpZykKKwkJCWdvdG8gZXJyX3JldDsKKwkJZW5jcnlwdGVkID0gcHdfZW5jcnlwdChvcmlnLCBwdy0+cHdfcGFzc3dkLCAxKTsgLyogcmV0dXJucyBtYWxsb2NlZCBzdHIgKi8KKwkJaWYgKHN0cmNtcChlbmNyeXB0ZWQsIHB3LT5wd19wYXNzd2QpICE9IDApIHsKKwkJCXN5c2xvZyhMT0dfV0FSTklORywgImluY29ycmVjdCBwYXNzd29yZCBmb3IgJXMiLCBwdy0+cHdfbmFtZSk7CisJCQliYl9kb19kZWxheShMT0dJTl9GQUlMX0RFTEFZKTsKKwkJCXB1dHMoIkluY29ycmVjdCBwYXNzd29yZCIpOworCQkJZ290byBlcnJfcmV0OworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoZW5jcnlwdGVkKTsKKwl9CisJb3JpZyA9IHhzdHJkdXAob3JpZyk7IC8qIG9yIGVsc2UgYmJfYXNrX3N0ZGluKCkgd2lsbCBkZXN0cm95IGl0ICovCisJbmV3cCA9IGJiX2Fza19zdGRpbigiTmV3IHBhc3N3b3JkOiAiKTsgLyogcmV0dXJucyBwdHIgdG8gc3RhdGljICovCisJaWYgKCFuZXdwKQorCQlnb3RvIGVycl9yZXQ7CisJbmV3cCA9IHhzdHJkdXAobmV3cCk7IC8qIHdlIGFyZSBnb2luZyB0byBiYl9hc2tfc3RkaW4oKSBhZ2Fpbiwgc28gc2F2ZSBpdCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSworCSAmJiBvYnNjdXJlKG9yaWcsIG5ld3AsIHB3KQorCSAmJiBteXVpZCAhPSAwCisJKSB7CisJCWdvdG8gZXJyX3JldDsgLyogbm9uLXJvb3QgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSB3ZWFrIHBhc3N3ZCAqLworCX0KKworCWNwID0gYmJfYXNrX3N0ZGluKCJSZXR5cGUgcGFzc3dvcmQ6ICIpOworCWlmICghY3ApCisJCWdvdG8gZXJyX3JldDsKKwlpZiAoc3RyY21wKGNwLCBuZXdwKSAhPSAwKSB7CisJCXB1dHMoIlBhc3N3b3JkcyBkb24ndCBtYXRjaCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJY3J5cHRfbWFrZV9wd19zYWx0KHNhbHQsIGFsZ28pOworCisJLyogcHdfZW5jcnlwdCByZXR1cm5zIG1hbGxvY2VkIHN0ciAqLworCXJldCA9IHB3X2VuY3J5cHQobmV3cCwgc2FsdCwgMSk7CisJLyogd2hlZSwgc3VjY2VzcyEgKi8KKworIGVycl9yZXQ6CisJbnVrZV9zdHIob3JpZyk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKG9yaWcpOworCisJbnVrZV9zdHIobmV3cCk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKG5ld3ApOworCisJbnVrZV9zdHIoY3ApOworCXJldHVybiByZXQ7Cit9CisKK2ludCBwYXNzd2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBhc3N3ZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF9hbGdvICAgPSAoMSA8PCAwKSwgLyogLWEgLSBwYXNzd29yZCBhbGdvcml0aG0gKi8KKwkJT1BUX2xvY2sgICA9ICgxIDw8IDEpLCAvKiAtbCAtIGxvY2sgYWNjb3VudCAqLworCQlPUFRfdW5sb2NrID0gKDEgPDwgMiksIC8qIC11IC0gdW5sb2NrIGFjY291bnQgKi8KKwkJT1BUX2RlbGV0ZSA9ICgxIDw8IDMpLCAvKiAtZCAtIGRlbGV0ZSBwYXNzd29yZCAqLworCQlPUFRfbHVkICAgID0gT1BUX2xvY2sgfCBPUFRfdW5sb2NrIHwgT1BUX2RlbGV0ZSwKKwl9OworCXVuc2lnbmVkIG9wdDsKKwlpbnQgcmM7CisJY29uc3QgY2hhciAqb3B0X2EgPSAiZCI7IC8qIGRlcyAqLworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWNoYXIgKm15bmFtZTsKKwljaGFyICpuYW1lOworCWNoYXIgKm5ld3A7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJdWlkX3QgbXl1aWQ7CisJc3RydWN0IHJsaW1pdCBybGltaXRfZnNpemU7CisJY2hhciBjOworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkvKiBVc2luZyBfciBmdW5jdGlvbiB0byBhdm9pZCBwdWxsaW5nIGluIHN0YXRpYyBidWZmZXJzICovCisJc3RydWN0IHNwd2Qgc3B3OworCWNoYXIgYnVmZmVyWzI1Nl07CisjZW5kaWYKKworCWxvZ21vZGUgPSBMT0dNT0RFX0JPVEg7CisJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0FVVEgpOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJhOmx1ZCIsICZvcHRfYSk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCW15dWlkID0gZ2V0dWlkKCk7CisJLyogLWwsIC11LCAtZCByZXF1aXJlIHJvb3QgcHJpdiBhbmQgdXNlcm5hbWUgYXJndW1lbnQgKi8KKwlpZiAoKG9wdCAmIE9QVF9sdWQpICYmIChteXVpZCAhPSAwIHx8ICFhcmd2WzBdKSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogV2lsbCBjb21wbGFpbiBhbmQgZGllIGlmIHVzZXJuYW1lIG5vdCBmb3VuZCAqLworCW15bmFtZSA9IHhzdHJkdXAoeHVpZDJ1bmFtZShteXVpZCkpOworCW5hbWUgPSBhcmd2WzBdID8gYXJndlswXSA6IG15bmFtZTsKKworCXB3ID0geGdldHB3bmFtKG5hbWUpOworCWlmIChteXVpZCAhPSAwICYmIHB3LT5wd191aWQgIT0gbXl1aWQpIHsKKwkJLyogTE9HTU9ERV9CT1RIICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBjYW4ndCBjaGFuZ2UgcGFzc3dvcmQgZm9yICVzIiwgbXluYW1lLCBuYW1lKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJeworCQkvKiBnZXRzcG5hbV9yIG1heSByZXR1cm4gMCB5ZXQgc2V0IHJlc3VsdCB0byBOVUxMLgorCQkgKiBBdCBsZWFzdCBnbGliYyAyLjQgZG9lcyB0aGlzLiBCZSBleHRyYSBwYXJhbm9pZCBoZXJlLiAqLworCQlzdHJ1Y3Qgc3B3ZCAqcmVzdWx0ID0gTlVMTDsKKwkJZXJybm8gPSAwOworCQlpZiAoZ2V0c3BuYW1fcihwdy0+cHdfbmFtZSwgJnNwdywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJnJlc3VsdCkgIT0gMAorCQkgfHwgIXJlc3VsdCAvKiBubyBlcnJvciwgYnV0IG5vIHJlY29yZCBmb3VuZCBlaXRoZXIgKi8KKwkJIHx8IHN0cmNtcChyZXN1bHQtPnNwX25hbXAsIHB3LT5wd19uYW1lKSAhPSAwIC8qIHBhcmFub2lhICovCisJCSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJCS8qIExPR01PREVfQk9USCAqLworCQkJCWJiX3BlcnJvcl9tc2coIm5vIHJlY29yZCBvZiAlcyBpbiAlcywgdXNpbmcgJXMiLAorCQkJCQluYW1lLCBiYl9wYXRoX3NoYWRvd19maWxlLAorCQkJCQliYl9wYXRoX3Bhc3N3ZF9maWxlKTsKKwkJCX0KKwkJCS8qIGVsc2U6IC9ldGMvc2hhZG93IGRvZXMgbm90IGV4aXN0LAorCQkJICogYXBwYXJlbnRseSB3ZSBhcmUgb24gYSBzaGFkb3ctbGVzcyBzeXN0ZW0sCisJCQkgKiBubyBzdXJwcmlzZSB0aGVyZSAqLworCQl9IGVsc2UgeworCQkJcHctPnB3X3Bhc3N3ZCA9IHJlc3VsdC0+c3BfcHdkcDsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogRGVjaWRlIHdoYXQgdGhlIG5ldyBwYXNzd29yZCB3aWxsIGJlICovCisJbmV3cCA9IE5VTEw7CisJYyA9IHB3LT5wd19wYXNzd2RbMF0gLSAnISc7CisJaWYgKCEob3B0ICYgT1BUX2x1ZCkpIHsKKwkJaWYgKG15dWlkICE9IDAgJiYgIWMpIHsgLyogcGFzc3dkIHN0YXJ0cyB3aXRoICchJyAqLworCQkJLyogTE9HTU9ERV9CT1RIICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY2hhbmdlICIKKwkJCQkJImxvY2tlZCBwYXNzd29yZCBmb3IgJXMiLCBuYW1lKTsKKwkJfQorCQlwcmludGYoIkNoYW5naW5nIHBhc3N3b3JkIGZvciAlc1xuIiwgbmFtZSk7CisJCW5ld3AgPSBuZXdfcGFzc3dvcmQocHcsIG15dWlkLCBvcHRfYSk7CisJCWlmICghbmV3cCkgeworCQkJbG9nbW9kZSA9IExPR01PREVfU1RESU87CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicGFzc3dvcmQgZm9yICVzIGlzIHVuY2hhbmdlZCIsIG5hbWUpOworCQl9CisJfSBlbHNlIGlmIChvcHQgJiBPUFRfbG9jaykgeworCQlpZiAoIWMpCisJCQlnb3RvIHNraXA7IC8qIHBhc3N3ZCBzdGFydHMgd2l0aCAnIScgKi8KKwkJbmV3cCA9IHhhc3ByaW50ZigiISVzIiwgcHctPnB3X3Bhc3N3ZCk7CisJfSBlbHNlIGlmIChvcHQgJiBPUFRfdW5sb2NrKSB7CisJCWlmIChjKQorCQkJZ290byBza2lwOyAvKiBub3QgJyEnICovCisJCS8qIHB3LT5wd19wYXNzd2QgcG9pbnRzIHRvIHN0YXRpYyBzdG9yYWdlLAorCQkgKiBzdHJkdXAnaW5nIHRvIGF2b2lkIG5hc3R5IHN1cnByaXplcyAqLworCQluZXdwID0geHN0cmR1cCgmcHctPnB3X3Bhc3N3ZFsxXSk7CisJfSBlbHNlIGlmIChvcHQgJiBPUFRfZGVsZXRlKSB7CisJCW5ld3AgPSAoY2hhciopIiI7CisJfQorCisJcmxpbWl0X2ZzaXplLnJsaW1fY3VyID0gcmxpbWl0X2ZzaXplLnJsaW1fbWF4ID0gNTEyTCAqIDMwMDAwOworCXNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybGltaXRfZnNpemUpOworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR0hVUCkKKwkJKyAoMSA8PCBTSUdJTlQpCisJCSsgKDEgPDwgU0lHUVVJVCkKKwkJLCBTSUdfSUdOKTsKKwl1bWFzaygwNzcpOworCXhzZXR1aWQoMCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJZmlsZW5hbWUgPSBiYl9wYXRoX3NoYWRvd19maWxlOworCXJjID0gdXBkYXRlX3Bhc3N3ZChiYl9wYXRoX3NoYWRvd19maWxlLCBuYW1lLCBuZXdwLCBOVUxMKTsKKwlpZiAocmMgPiAwKQorCQkvKiBwYXNzd29yZCBpbiAvZXRjL3NoYWRvdyB3YXMgdXBkYXRlZCAqLworCQluZXdwID0gKGNoYXIqKSAieCI7CisJaWYgKHJjID49IDApCisJCS8qIDAgPSAvZXRjL3NoYWRvdyBtaXNzaW5nIChub3QgYW4gZXJyb3IpLCA+MCA9IHBhc3N3ZCBjaGFuZ2VkIGluIC9ldGMvc2hhZG93ICovCisjZW5kaWYKKwl7CisJCWZpbGVuYW1lID0gYmJfcGF0aF9wYXNzd2RfZmlsZTsKKwkJcmMgPSB1cGRhdGVfcGFzc3dkKGJiX3BhdGhfcGFzc3dkX2ZpbGUsIG5hbWUsIG5ld3AsIE5VTEwpOworCX0KKwkvKiBMT0dNT0RFX0JPVEggKi8KKwlpZiAocmMgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgdXBkYXRlIHBhc3N3b3JkIGZpbGUgJXMiLCBmaWxlbmFtZSk7CisJYmJfaW5mb19tc2coIlBhc3N3b3JkIGZvciAlcyBjaGFuZ2VkIGJ5ICVzIiwgbmFtZSwgbXluYW1lKTsKKworCS8qaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKG5ld3ApOyAtIGNhbid0LCBpdCBtYXkgYmUgbm9uLW1hbGxvY2VkICovCisgc2tpcDoKKwlpZiAoIW5ld3ApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInBhc3N3b3JkIGZvciAlcyBpcyBhbHJlYWR5ICVzbG9ja2VkIiwKKwkJCW5hbWUsIChvcHQgJiBPUFRfdW5sb2NrKSA/ICJ1biIgOiAiIik7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKG15bmFtZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL3N1LmMgYi9idXN5Ym94LTEuMTkuMy9sb2dpbnV0aWxzL3N1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlYTczOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvc3UuYwpAQCAtMCwwICsxLDE0MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzdSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKy8vdXNhZ2U6I2RlZmluZSBzdV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFstXSBbVVNFUl0iCisvL3VzYWdlOiNkZWZpbmUgc3VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gc2hlbGwgdW5kZXIgVVNFUiAoYnkgZGVmYXVsdCwgcm9vdClcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLSwtbAlDbGVhciBlbnZpcm9ubWVudCwgcnVuIHNoZWxsIGFzIGxvZ2luIHNoZWxsIgorLy91c2FnZTogICAgICJcbgktcCwtbQlEbyBub3Qgc2V0IG5ldyAkSE9NRSwgJFNIRUxMLCAkVVNFUiwgJExPR05BTUUiCisvL3VzYWdlOiAgICAgIlxuCS1jIENNRAlDb21tYW5kIHRvIHBhc3MgdG8gJ3NoIC1jJyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0gJU2hlbGwgdG8gdXNlIGluc3RlYWQgb2YgdXNlcidzIGRlZmF1bHQiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVV9DSEVDS1NfU0hFTExTCisvKiBSZXR1cm4gMSBpZiBTSEVMTCBpcyBhIHJlc3RyaWN0ZWQgc2hlbGwgKG9uZSBub3QgcmV0dXJuZWQgYnkKKyAqIGdldHVzZXJzaGVsbCksIGVsc2UgMCwgbWVhbmluZyBpdCBpcyBhIHN0YW5kYXJkIHNoZWxsLiAgKi8KK3N0YXRpYyBpbnQgcmVzdHJpY3RlZF9zaGVsbChjb25zdCBjaGFyICpzaGVsbCkKK3sKKwljaGFyICpsaW5lOworCWludCByZXN1bHQgPSAxOworCisJLypzZXR1c2Vyc2hlbGwoKTsgLSBnZXR1c2Vyc2hlbGwgZG9lcyBpdCBpdHNlbGYqLworCXdoaWxlICgobGluZSA9IGdldHVzZXJzaGVsbCgpKSAhPSBOVUxMKSB7CisJCWlmICgvKiAqbGluZSAhPSAnIycgJiYgKi8gc3RyY21wKGxpbmUsIHNoZWxsKSA9PSAwKSB7CisJCQlyZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQllbmR1c2Vyc2hlbGwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNkZWZpbmUgU1VfT1BUX21wICgzKQorI2RlZmluZSBTVV9PUFRfbCAgKDQpCisKK2ludCBzdV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGZsYWdzOworCWNoYXIgKm9wdF9zaGVsbCA9IE5VTEw7CisJY2hhciAqb3B0X2NvbW1hbmQgPSBOVUxMOworCWNvbnN0IGNoYXIgKm9wdF91c2VybmFtZSA9ICJyb290IjsKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwl1aWRfdCBjdXJfdWlkID0gZ2V0dWlkKCk7CisJY29uc3QgY2hhciAqdHR5OworI2lmIEVOQUJMRV9GRUFUVVJFX1VUTVAKKwljaGFyIHVzZXJfYnVmWzY0XTsKKyNlbmRpZgorCWNvbnN0IGNoYXIgKm9sZF91c2VyOworCisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAibXBsYzpzOiIsICZvcHRfY29tbWFuZCwgJm9wdF9zaGVsbCk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzBdICYmIExPTkVfREFTSChhcmd2WzBdKSkgeworCQlmbGFncyB8PSBTVV9PUFRfbDsKKwkJYXJndisrOworCX0KKworCS8qIGdldCB1c2VyIGlmIHNwZWNpZmllZCAqLworCWlmIChhcmd2WzBdKSB7CisJCW9wdF91c2VybmFtZSA9IGFyZ3ZbMF07CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfU1VfU1lTTE9HKSB7CisJCS8qIFRoZSB1dG1wIGVudHJ5ICh2aWEgZ2V0bG9naW4pIGlzIHByb2JhYmx5IHRoZSBiZXN0IHdheSB0bworCQkgKiBpZGVudGlmeSB0aGUgdXNlciwgZXNwZWNpYWxseSBpZiBzb21lb25lIHN1J3MgZnJvbSBhIHN1LXNoZWxsLgorCQkgKiBCdXQgZ2V0bG9naW4gY2FuIGZhaWwgLS0gdXN1YWxseSBkdWUgdG8gbGFjayBvZiB1dG1wIGVudHJ5LgorCQkgKiBpbiB0aGlzIGNhc2UgcmVzb3J0IHRvIGdldHB3dWlkLiAgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VVE1QCisJCW9sZF91c2VyID0gdXNlcl9idWY7CisJCWlmIChnZXRsb2dpbl9yKHVzZXJfYnVmLCBzaXplb2YodXNlcl9idWYpKSAhPSAwKQorI2VuZGlmCisJCXsKKwkJCXB3ID0gZ2V0cHd1aWQoY3VyX3VpZCk7CisJCQlvbGRfdXNlciA9IHB3ID8geHN0cmR1cChwdy0+cHdfbmFtZSkgOiAiIjsKKwkJfQorCQl0dHkgPSB4bWFsbG9jX3R0eW5hbWUoMik7CisJCWlmICghdHR5KSB7CisJCQl0dHkgPSAibm9uZSI7CisJCX0KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0FVVEgpOworCX0KKworCXB3ID0geGdldHB3bmFtKG9wdF91c2VybmFtZSk7CisKKwlpZiAoY3VyX3VpZCA9PSAwIHx8IGNvcnJlY3RfcGFzc3dvcmQocHcpKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TVV9TWVNMT0cpCisJCQlzeXNsb2coTE9HX05PVElDRSwgIiVjICVzICVzOiVzIiwKKwkJCQknKycsIHR0eSwgb2xkX3VzZXIsIG9wdF91c2VybmFtZSk7CisJfSBlbHNlIHsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX1NVX1NZU0xPRykKKwkJCXN5c2xvZyhMT0dfTk9USUNFLCAiJWMgJXMgJXM6JXMiLAorCQkJCSctJywgdHR5LCBvbGRfdXNlciwgb3B0X3VzZXJuYW1lKTsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImluY29ycmVjdCBwYXNzd29yZCIpOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBFTkFCTEVfRkVBVFVSRV9TVV9TWVNMT0cpIHsKKwkJY2xvc2Vsb2coKTsKKwl9CisKKwlpZiAoIW9wdF9zaGVsbCAmJiAoZmxhZ3MgJiBTVV9PUFRfbXApKSB7CisJCS8qIC1zIFNIRUxMIGlzIG5vdCBnaXZlbiwgYnV0ICJwcmVzZXJ2ZSBlbnYiIG9wdCBpcyAqLworCQlvcHRfc2hlbGwgPSBnZXRlbnYoIlNIRUxMIik7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUworCWlmIChvcHRfc2hlbGwgJiYgY3VyX3VpZCAhPSAwICYmIHB3LT5wd19zaGVsbCAmJiByZXN0cmljdGVkX3NoZWxsKHB3LT5wd19zaGVsbCkpIHsKKwkJLyogVGhlIHVzZXIgYmVpbmcgc3UnZCB0byBoYXMgYSBub25zdGFuZGFyZCBzaGVsbCwgYW5kIHNvIGlzCisJCSAqIHByb2JhYmx5IGEgdXVjcCBhY2NvdW50IG9yIGhhcyByZXN0cmljdGVkIGFjY2Vzcy4gIERvbid0CisJCSAqIGNvbXByb21pc2UgdGhlIGFjY291bnQgYnkgYWxsb3dpbmcgYWNjZXNzIHdpdGggYSBzdGFuZGFyZAorCQkgKiBzaGVsbC4gICovCisJCWJiX2Vycm9yX21zZygidXNpbmcgcmVzdHJpY3RlZCBzaGVsbCIpOworCQlvcHRfc2hlbGwgPSBOVUxMOyAvKiBpZ25vcmUgLXMgUFJPRyAqLworCX0KKwkvKiBlbHNlOiB1c2VyIGNhbiBydW4gd2hhdGV2ZXIgaGUgd2FudHMgdmlhICJzdSAtcyBQUk9HIFVTRVIiLgorCSAqIFRoaXMgaXMgc2FmZSBzaW5jZSBQUk9HIGlzIHJ1biB1bmRlciB1c2VyJ3MgdWlkL2dpZC4gKi8KKyNlbmRpZgorCWlmICghb3B0X3NoZWxsKQorCQlvcHRfc2hlbGwgPSBwdy0+cHdfc2hlbGw7CisKKwljaGFuZ2VfaWRlbnRpdHkocHcpOworCXNldHVwX2Vudmlyb25tZW50KG9wdF9zaGVsbCwKKwkJCSgoZmxhZ3MgJiBTVV9PUFRfbCkgLyBTVV9PUFRfbCAqIFNFVFVQX0VOVl9DTEVBUkVOVikKKwkJCSsgKCEoZmxhZ3MgJiBTVV9PUFRfbXApICogU0VUVVBfRU5WX0NIQU5HRUVOViksCisJCQlwdyk7CisJSUZfU0VMSU5VWChzZXRfY3VycmVudF9zZWN1cml0eV9jb250ZXh0KE5VTEwpOykKKworCS8qIE5ldmVyIHJldHVybnMgKi8KKwlydW5fc2hlbGwob3B0X3NoZWxsLCBmbGFncyAmIFNVX09QVF9sLCBvcHRfY29tbWFuZCwgKGNvbnN0IGNoYXIqKilhcmd2KTsKKworCS8qIHJldHVybiBFWElUX0ZBSUxVUkU7IC0gbm90IHJlYWNoZWQgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvc3Vsb2dpbi5jIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy9zdWxvZ2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYjA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvc3Vsb2dpbi5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHN1bG9naW4gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzdWxvZ2luX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXQgTl0gW1RUWV0iCisvL3VzYWdlOiNkZWZpbmUgc3Vsb2dpbl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNpbmdsZSB1c2VyIGxvZ2luXG4iCisvL3VzYWdlOiAgICAgIlxuCS10IE4JVGltZW91dCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKy8vc3RhdGljIHZvaWQgY2F0Y2hhbGFybShpbnQgVU5VU0VEX1BBUkFNIGp1bmspCisvL3sKKy8vCWV4aXQoRVhJVF9GQUlMVVJFKTsKKy8vfQorCisKK2ludCBzdWxvZ2luX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdWxvZ2luX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpjcDsKKwlpbnQgdGltZW91dCA9IDA7CisJc3RydWN0IHBhc3N3ZCAqcHdkOworCWNvbnN0IGNoYXIgKnNoZWxsOworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkvKiBVc2luZyBfciBmdW5jdGlvbiB0byBhdm9pZCBwdWxsaW5nIGluIHN0YXRpYyBidWZmZXJzICovCisJY2hhciBidWZmZXJbMjU2XTsKKwlzdHJ1Y3Qgc3B3ZCBzcHc7CisjZW5kaWYKKworCWxvZ21vZGUgPSBMT0dNT0RFX0JPVEg7CisJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0FVVEgpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidCsiOyAvKiAtdCBOICovCisJZ2V0b3B0MzIoYXJndiwgInQ6IiwgJnRpbWVvdXQpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKGFyZ3ZbMF0pIHsKKwkJY2xvc2UoMCk7CisJCWNsb3NlKDEpOworCQlkdXAoeG9wZW4oYXJndlswXSwgT19SRFdSKSk7CisJCWNsb3NlKDIpOworCQlkdXAoMCk7CisJfQorCisJLyogTWFsaWNpb3VzIHVzZSBsaWtlICJzdWxvZ2luIC9kZXYvc2RhIj8gKi8KKwlpZiAoIWlzYXR0eSgwKSB8fCAhaXNhdHR5KDEpIHx8ICFpc2F0dHkoMikpIHsKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGEgdHR5Iik7CisJfQorCisJLyogQ2xlYXIgZGFuZ2Vyb3VzIHN0dWZmLCBzZXQgUEFUSCAqLworCXNhbml0aXplX2Vudl9pZl9zdWlkKCk7CisKKwlwd2QgPSBnZXRwd3VpZCgwKTsKKwlpZiAoIXB3ZCkgeworCQlnb3RvIGF1dGhfZXJyb3I7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCXsKKwkJLyogZ2V0c3BuYW1fciBtYXkgcmV0dXJuIDAgeWV0IHNldCByZXN1bHQgdG8gTlVMTC4KKwkJICogQXQgbGVhc3QgZ2xpYmMgMi40IGRvZXMgdGhpcy4gQmUgZXh0cmEgcGFyYW5vaWQgaGVyZS4gKi8KKwkJc3RydWN0IHNwd2QgKnJlc3VsdCA9IE5VTEw7CisJCWludCByID0gZ2V0c3BuYW1fcihwd2QtPnB3X25hbWUsICZzcHcsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZyZXN1bHQpOworCQlpZiAociB8fCAhcmVzdWx0KSB7CisJCQlnb3RvIGF1dGhfZXJyb3I7CisJCX0KKwkJcHdkLT5wd19wYXNzd2QgPSByZXN1bHQtPnNwX3B3ZHA7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoMSkgeworCQljaGFyICplbmNyeXB0ZWQ7CisJCWludCByOworCisJCS8qIGNwIHBvaW50cyB0byBhIHN0YXRpYyBidWZmZXIgdGhhdCBpcyB6ZXJvZWQgZXZlcnkgdGltZSAqLworCQljcCA9IGJiX2FzayhTVERJTl9GSUxFTk8sIHRpbWVvdXQsCisJCQkJIkdpdmUgcm9vdCBwYXNzd29yZCBmb3Igc3lzdGVtIG1haW50ZW5hbmNlXG4iCisJCQkJIihvciB0eXBlIENvbnRyb2wtRCBmb3Igbm9ybWFsIHN0YXJ0dXApOiIpOworCisJCWlmICghY3AgfHwgISpjcCkgeworCQkJYmJfaW5mb19tc2coIk5vcm1hbCBzdGFydHVwIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQllbmNyeXB0ZWQgPSBwd19lbmNyeXB0KGNwLCBwd2QtPnB3X3Bhc3N3ZCwgMSk7CisJCXIgPSBzdHJjbXAoZW5jcnlwdGVkLCBwd2QtPnB3X3Bhc3N3ZCk7CisJCWZyZWUoZW5jcnlwdGVkKTsKKwkJaWYgKHIgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJYmJfZG9fZGVsYXkoTE9HSU5fRkFJTF9ERUxBWSk7CisJCWJiX2luZm9fbXNnKCJMb2dpbiBpbmNvcnJlY3QiKTsKKwl9CisJbWVtc2V0KGNwLCAwLCBzdHJsZW4oY3ApKTsKKy8vCXNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsKKworCWJiX2luZm9fbXNnKCJTeXN0ZW0gTWFpbnRlbmFuY2UgTW9kZSIpOworCisJSUZfU0VMSU5VWChyZW5ld19jdXJyZW50X3NlY3VyaXR5X2NvbnRleHQoKSk7CisKKwlzaGVsbCA9IGdldGVudigiU1VTSEVMTCIpOworCWlmICghc2hlbGwpCisJCXNoZWxsID0gZ2V0ZW52KCJzdXNoZWxsIik7CisJaWYgKCFzaGVsbCkKKwkJc2hlbGwgPSBwd2QtPnB3X3NoZWxsOworCisJLyogRXhlYyBsb2dpbiBzaGVsbCB3aXRoIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gTmV2ZXIgcmV0dXJucy4gKi8KKwlydW5fc2hlbGwoc2hlbGwsIDEsIE5VTEwsIE5VTEwpOworCisgYXV0aF9lcnJvcjoKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gcGFzc3dvcmQgZW50cnkgZm9yIHJvb3QiKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvdmxvY2suYyBiL2J1c3lib3gtMS4xOS4zL2xvZ2ludXRpbHMvdmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWFmOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbG9naW51dGlscy92bG9jay5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB2bG9jayBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBzcG9vbiA8c3Bvb25AaXgubmV0Y29tLmNvbT4KKyAqIFdyaXR0ZW4gYnkgc3Bvb24gPHNwb25AaXgubmV0Y29tLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFNob3V0eiB0byBNaWNoYWVsIEsuIEpvaG5zb24gPGpvaG5zb25tQHJlZGhhdC5jb20+LCBhdXRob3Igb2YgdGhlCisgKiBvcmlnaW5hbCB2bG9jay4gIEkgc25hZ2dlZCBhIGJ1bmNoIG9mIGhpcyBjb2RlIHRvIHdyaXRlIHRoaXMKKyAqIG1pbmltYWxpc3RpYyB2bG9jay4KKyAqLworLyogRml4ZWQgYnkgRXJpayBBbmRlcnNlbiB0byBkbyBwYXNzd29yZHMgdGhlIHRpbnlsb2dpbiB3YXkuLi4KKyAqIEl0IG5vdyB3b3JrcyB3aXRoIG1kNSwgc2hhMSwgZXRjIHBhc3N3b3Jkcy4gKi8KKworLy91c2FnZTojZGVmaW5lIHZsb2NrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFdIgorLy91c2FnZTojZGVmaW5lIHZsb2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9jayBhIHZpcnR1YWwgdGVybWluYWwuIEEgcGFzc3dvcmQgaXMgcmVxdWlyZWQgdG8gdW5sb2NrLlxuIgorLy91c2FnZTogICAgICJcbgktYQlMb2NrIGFsbCBWVHMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c3lzL3Z0Lmg+CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfdnQoaW50IHNpZ25vIFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBJZiAtYSwgcGFyYW0gaXMgMCwgd2hpY2ggbWVhbnM6CisJICogIm5vLCBrZXJuZWwsIHdlIGRvbid0IGFsbG93IGNvbnNvbGUgc3dpdGNoIGF3YXkgZnJvbSB1cyEiICovCisJaW9jdGwoU1RESU5fRklMRU5PLCBWVF9SRUxESVNQLCAodW5zaWduZWQgbG9uZykgIW9wdGlvbl9tYXNrMzIpOworfQorCitzdGF0aWMgdm9pZCBhY3F1aXJlX3Z0KGludCBzaWdubyBVTlVTRURfUEFSQU0pCit7CisJLyogQUNLIHRvIGtlcm5lbCB0aGF0IHN3aXRjaCB0byBjb25zb2xlIGlzIHN1Y2Nlc3NmdWwgKi8KKwlpb2N0bChTVERJTl9GSUxFTk8sIFZUX1JFTERJU1AsIFZUX0FDS0FDUSk7Cit9CisjZW5kaWYKKworaW50IHZsb2NrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB2bG9ja19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWZkZWYgX19saW51eF9fCisJc3RydWN0IHZ0X21vZGUgdnRtOworCXN0cnVjdCB2dF9tb2RlIG92dG07CisjZW5kaWYKKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtOworCXN0cnVjdCB0ZXJtaW9zIG90ZXJtOworCXN0cnVjdCBwYXNzd2QgKnB3OworCisJcHcgPSB4Z2V0cHd1aWQoZ2V0dWlkKCkpOworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0wIjsgLyogbm8gcGFyYW1zISAqLworCWdldG9wdDMyKGFyZ3YsICJhIik7CisKKwkvKiBJZ25vcmUgc29tZSBzaWduYWxzIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGtpbGxlZCBieSB0aGVtICovCisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHVFNUUCkKKwkJKyAoMSA8PCBTSUdUVElOKQorCQkrICgxIDw8IFNJR1RUT1UpCisJCSsgKDEgPDwgU0lHSFVQICkKKwkJKyAoMSA8PCBTSUdDSExEKSAvKiBwYXJhbm9pYSA6KSAqLworCQkrICgxIDw8IFNJR1FVSVQpCisJCSsgKDEgPDwgU0lHSU5UICkKKwkJLCBTSUdfSUdOKTsKKworI2lmZGVmIF9fbGludXhfXworCS8qIFdlIHdpbGwgdXNlIFNJR1VTUnggZm9yIGNvbnNvbGUgc3dpdGNoIGNvbnRyb2w6ICovCisJLyogMTogc2V0IGhhbmRsZXJzICovCisJc2lnbmFsX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdVU1IxLCByZWxlYXNlX3Z0KTsKKwlzaWduYWxfU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR1VTUjIsIGFjcXVpcmVfdnQpOworCS8qIDI6IHVubWFzayB0aGVtICovCisJc2lnX3VuYmxvY2soU0lHVVNSMSk7CisJc2lnX3VuYmxvY2soU0lHVVNSMik7CisjZW5kaWYKKworCS8qIFJldmVydCBzdGRpbi9vdXQgdG8gb3VyIGNvbnRyb2xsaW5nIHR0eQorCSAqIChvciBkaWUgaWYgd2UgaGF2ZSBub25lKSAqLworCXhtb3ZlX2ZkKHhvcGVuKENVUlJFTlRfVFRZLCBPX1JEV1IpLCBTVERJTl9GSUxFTk8pOworCXhkdXAyKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7CisKKyNpZmRlZiBfX2xpbnV4X18KKwl4aW9jdGwoU1RESU5fRklMRU5PLCBWVF9HRVRNT0RFLCAmdnRtKTsKKwlvdnRtID0gdnRtOworCS8qICJjb25zb2xlIHN3aXRjaGVzIGFyZSBjb250cm9sbGVkIGJ5IHVzLCBub3Qga2VybmVsISIgKi8KKwl2dG0ubW9kZSA9IFZUX1BST0NFU1M7CisJdnRtLnJlbHNpZyA9IFNJR1VTUjE7CisJdnRtLmFjcXNpZyA9IFNJR1VTUjI7CisJaW9jdGwoU1RESU5fRklMRU5PLCBWVF9TRVRNT0RFLCAmdnRtKTsKKyNlbmRpZgorCisJdGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJm90ZXJtKTsKKwl0ZXJtID0gb3Rlcm07CisJdGVybS5jX2lmbGFnICY9IH5CUktJTlQ7CisJdGVybS5jX2lmbGFnIHw9IElHTkJSSzsKKwl0ZXJtLmNfbGZsYWcgJj0gfklTSUc7CisJdGVybS5jX2xmbGFnICY9IH4oRUNITyB8IEVDSE9DVEwpOworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0ZXJtKTsKKworCXdoaWxlICgxKSB7CisJCXByaW50ZigiVmlydHVhbCBjb25zb2xlJXMgbG9ja2VkIGJ5ICVzLlxuIiwKKwkJCQkvKiAicyIgaWYgLWEsIGVsc2UgIiI6ICovICJzIiArICFvcHRpb25fbWFzazMyLAorCQkJCXB3LT5wd19uYW1lCisJCSk7CisJCWlmIChjb3JyZWN0X3Bhc3N3b3JkKHB3KSkgeworCQkJYnJlYWs7CisJCX0KKwkJYmJfZG9fZGVsYXkoTE9HSU5fRkFJTF9ERUxBWSk7CisJCXB1dHMoIkluY29ycmVjdCBwYXNzd29yZCIpOworCX0KKworI2lmZGVmIF9fbGludXhfXworCWlvY3RsKFNURElOX0ZJTEVOTywgVlRfU0VUTU9ERSwgJm92dG0pOworI2VuZGlmCisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJm90ZXJtKTsKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvQ29uZmlnLnNyYyBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOWM1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDU1IEBACittZW51ICJNYWlsIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBNQUtFTUlNRQorCWJvb2wgIm1ha2VtaW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENyZWF0ZSBNSU1FLWZvcm1hdHRlZCBtZXNzYWdlcy4KKworY29uZmlnIEZFQVRVUkVfTUlNRV9DSEFSU0VUCisJc3RyaW5nICJEZWZhdWx0IGNoYXJzZXQiCisJZGVmYXVsdCAidXMtYXNjaWkiCisJZGVwZW5kcyBvbiBNQUtFTUlNRSB8fCBSRUZPUk1JTUUgfHwgU0VORE1BSUwKKwloZWxwCisJICBEZWZhdWx0IGNoYXJzZXQgb2YgdGhlIG1lc3NhZ2UuCisKK2NvbmZpZyBQT1BNQUlMRElSCisJYm9vbCAicG9wbWFpbGRpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTaW1wbGUgeWV0IHBvd2VyZnVsIFBPUDMgbWFpbCBwb3BwZXIuIERlbGl2ZXJzIGNvbnRlbnQKKwkgIG9mIHJlbW90ZSBtYWlsYm94ZXMgdG8gbG9jYWwgTWFpbGRpci4KKworY29uZmlnIEZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWQorCWJvb2wgIkFsbG93IG1lc3NhZ2UgZmlsdGVycyBhbmQgY3VzdG9tIGRlbGl2ZXJ5IHByb2dyYW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQT1BNQUlMRElSCisJaGVscAorCSAgQWxsb3cgdG8gdXNlIGEgY3VzdG9tIHByb2dyYW0gdG8gZmlsdGVyIHRoZSBjb250ZW50CisJICBvZiB0aGUgbWVzc2FnZSBiZWZvcmUgYWN0dWFsIGRlbGl2ZXJ5ICgtRiAicHJvZyBbYXJncy4uLl0iKS4KKwkgIEFsbG93IHRvIHVzZSBhIGN1c3RvbSBwcm9ncmFtIGZvciBtZXNzYWdlIGFjdHVhbCBkZWxpdmVyeQorCSAgKC1NICJwcm9nIFthcmdzLi4uXSIpLgorCitjb25maWcgUkVGT1JNSU1FCisJYm9vbCAicmVmb3JtaW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFBhcnNlIE1JTUUtZm9ybWF0dGVkIG1lc3NhZ2VzLgorCitjb25maWcgRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUCisJYm9vbCAiQWNjZXB0IGFuZCBpZ25vcmUgb3B0aW9ucyBvdGhlciB0aGFuIC14IGFuZCAtWCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJFRk9STUlNRQorCWhlbHAKKwkgIEFjY2VwdCAoZm9yIGNvbXBhdGliaWxpdHkgb25seSkgYW5kIGlnbm9yZSBvcHRpb25zCisJICBvdGhlciB0aGFuIC14IGFuZCAtWC4KKworY29uZmlnIFNFTkRNQUlMCisJYm9vbCAic2VuZG1haWwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQmFyZWJvbmVzIHNlbmRtYWlsLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGZiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDkgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWFpbHV0aWxzL21haWwuYyBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9tYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjNzk0NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9tYWlsLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGhlbHBlciByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibWFpbC5oIgorCitzdGF0aWMgdm9pZCBraWxsX2hlbHBlcih2b2lkKQoreworCWlmIChHLmhlbHBlcl9waWQgPiAwKSB7CisJCWtpbGwoRy5oZWxwZXJfcGlkLCBTSUdURVJNKTsKKwkJRy5oZWxwZXJfcGlkID0gMDsKKwl9Cit9CisKKy8vIGdlbmVyaWMgc2lnbmFsIGhhbmRsZXIKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWdubykKK3sKKyNkZWZpbmUgZXJyIHNpZ25vCisJaWYgKFNJR0FMUk0gPT0gc2lnbm8pIHsKKwkJa2lsbF9oZWxwZXIoKTsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRpbWVkIG91dCIpOworCX0KKworCS8vIFNJR0NITEQuIHJlYXAgem9tYmllcworCWlmIChzYWZlX3dhaXRwaWQoRy5oZWxwZXJfcGlkLCAmZXJyLCBXTk9IQU5HKSA+IDApIHsKKwkJaWYgKFdJRlNJR05BTEVEKGVycikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaGVscGVyIGtpbGxlZCBieSBzaWduYWwgJXUiLCBXVEVSTVNJRyhlcnIpKTsKKwkJaWYgKFdJRkVYSVRFRChlcnIpKSB7CisJCQlHLmhlbHBlcl9waWQgPSAwOworCQkJaWYgKFdFWElUU1RBVFVTKGVycikpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImhlbHBlciBleGl0ZWQgKCV1KSIsIFdFWElUU1RBVFVTKGVycikpOworCQl9CisJfQorI3VuZGVmIGVycgorfQorCit2b2lkIEZBU1RfRlVOQyBsYXVuY2hfaGVscGVyKGNvbnN0IGNoYXIgKiphcmd2KQoreworCS8vIHNldHVwIHZhbmlsbGEgdW5pZGlyZWN0aW9uYWwgcGlwZXMgaW50ZXJjaGFuZ2UKKwlpbnQgaTsKKwlpbnQgcGlwZXNbNF07CisKKwl4cGlwZShwaXBlcyk7CisJeHBpcGUocGlwZXMgKyAyKTsKKworCS8vIE5COiBoYW5kbGVyIG11c3QgYmUgaW5zdGFsbGVkIGJlZm9yZSB2Zm9yaworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR0NITEQpCisJCSsgKDEgPDwgU0lHQUxSTSkKKwkJLCBzaWduYWxfaGFuZGxlcik7CisKKwlHLmhlbHBlcl9waWQgPSB4dmZvcmsoKTsKKworCWkgPSAoIUcuaGVscGVyX3BpZCkgKiAyOyAvLyBmb3IgcGFyZW50OjAsIGZvciBjaGlsZDoyCisJY2xvc2UocGlwZXNbaSArIDFdKTsgLy8gMSBvciAzIC0gY2xvc2luZyBvbmUgd3JpdGUgZW5kCisJY2xvc2UocGlwZXNbMiAtIGldKTsgLy8gMiBvciAwIC0gY2xvc2luZyBvbmUgcmVhZCBlbmQKKwl4bW92ZV9mZChwaXBlc1tpXSwgU1RESU5fRklMRU5PKTsgLy8gMCBvciAyIC0gdXNpbmcgb3RoZXIgcmVhZCBlbmQKKwl4bW92ZV9mZChwaXBlc1szIC0gaV0sIFNURE9VVF9GSUxFTk8pOyAvLyAzIG9yIDEgLSBvdGhlciB3cml0ZSBlbmQKKworCWlmICghRy5oZWxwZXJfcGlkKSB7CisJCS8vIGNoaWxkOiB0cnkgdG8gZXhlY3V0ZSBjb25uZWN0aW9uIGhlbHBlcgorCQkvLyBOQjogU0lHQ0hMRCAmIFNJR0FMUk0gcmV2ZXJ0IHRvIFNJR19ERkwgb24gZXhlYworCQlCQl9FWEVDVlBfb3JfZGllKChjaGFyKiopYXJndik7CisJfQorCisJLy8gcGFyZW50CisJLy8gY2hlY2sgd2hldGhlciBjaGlsZCBpcyBhbGl2ZQorCS8vcmVkdW5kYW50OnNpZ25hbF9oYW5kbGVyKFNJR0NITEQpOworCS8vIGNoaWxkIHNlZW1zIE9LIC0+IHBhcmVudCBnb2VzIG9uCisJYXRleGl0KGtpbGxfaGVscGVyKTsKK30KKworY2hhciogRkFTVF9GVU5DIHNlbmRfbWFpbF9jb21tYW5kKGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqcGFyYW0pCit7CisJY2hhciAqbXNnOworCWlmICh0aW1lb3V0KQorCQlhbGFybSh0aW1lb3V0KTsKKwltc2cgPSAoY2hhciopZm10OworCWlmIChmbXQpIHsKKwkJbXNnID0geGFzcHJpbnRmKGZtdCwgcGFyYW0pOworCQlpZiAodmVyYm9zZSkKKwkJCWJiX2Vycm9yX21zZygic2VuZDonJXMnIiwgbXNnKTsKKwkJcHJpbnRmKCIlc1xyXG4iLCBtc2cpOworCX0KKwlmZmx1c2hfYWxsKCk7CisJcmV0dXJuIG1zZzsKK30KKworLy8gTkI6IHBhcnNlX3VybCBjYW4gbW9kaWZ5IHVybFtdIChkZXNwaXRlIGNvbnN0KSwgYnV0IG9ubHkgaWYgJ0AnIGlzIHRoZXJlCisvKgorc3RhdGljIGNoYXIqIEZBU1RfRlVOQyBwYXJzZV91cmwoY2hhciAqdXJsLCBjaGFyICoqdXNlciwgY2hhciAqKnBhc3MpCit7CisJLy8gcGFyc2UgW3VzZXJbOnBhc3NdQF1ob3N0CisJLy8gcmV0dXJuIGhvc3QKKwljaGFyICpzID0gc3RyY2hyKHVybCwgJ0AnKTsKKwkqdXNlciA9ICpwYXNzID0gTlVMTDsKKwlpZiAocykgeworCQkqcysrID0gJ1wwJzsKKwkJKnVzZXIgPSB1cmw7CisJCXVybCA9IHM7CisJCXMgPSBzdHJjaHIoKnVzZXIsICc6Jyk7CisJCWlmIChzKSB7CisJCQkqcysrID0gJ1wwJzsKKwkJCSpwYXNzID0gczsKKwkJfQorCX0KKwlyZXR1cm4gdXJsOworfQorKi8KKwordm9pZCBGQVNUX0ZVTkMgZW5jb2RlX2Jhc2U2NChjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqZW9sKQoreworCWVudW0geworCQlTUkNfQlVGX1NJWkUgPSA0NSwgIC8qIFRoaXMgKk1VU1QqIGJlIGEgbXVsdGlwbGUgb2YgMyAqLworCQlEU1RfQlVGX1NJWkUgPSA0ICogKChTUkNfQlVGX1NJWkUgKyAyKSAvIDMpLAorCX07CisjZGVmaW5lIHNyY19idWYgdGV4dAorCWNoYXIgc3JjW1NSQ19CVUZfU0laRV07CisJRklMRSAqZnAgPSBmcDsKKwlzc2l6ZV90IGxlbiA9IGxlbjsKKwljaGFyIGRzdF9idWZbRFNUX0JVRl9TSVpFICsgMV07CisKKwlpZiAoZm5hbWUpIHsKKwkJZnAgPSAoTk9UX0xPTkVfREFTSChmbmFtZSkpID8geGZvcGVuX2Zvcl9yZWFkKGZuYW1lKSA6IChGSUxFICopdGV4dDsKKwkJc3JjX2J1ZiA9IHNyYzsKKwl9IGVsc2UgaWYgKHRleHQpIHsKKwkJLy8gdGhvdWdoIHdlIGRvIG5vdCBjYWxsIHV1ZW5jb2RlKE5VTEwsIE5VTEwpIGV4cGxpY2l0bHkKKwkJLy8gc3RpbGwgd2UgZG8gbm90IHdhbnQgdG8gYnJlYWsgdGhpbmdzIHN1ZGRlbmx5CisJCWxlbiA9IHN0cmxlbih0ZXh0KTsKKwl9IGVsc2UKKwkJcmV0dXJuOworCisJd2hpbGUgKDEpIHsKKwkJc2l6ZV90IHNpemU7CisJCWlmIChmbmFtZSkgeworCQkJc2l6ZSA9IGZyZWFkKChjaGFyICopc3JjX2J1ZiwgMSwgU1JDX0JVRl9TSVpFLCBmcCk7CisJCQlpZiAoKHNzaXplX3Qpc2l6ZSA8IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJfSBlbHNlIHsKKwkJCXNpemUgPSBsZW47CisJCQlpZiAobGVuID4gU1JDX0JVRl9TSVpFKQorCQkJCXNpemUgPSBTUkNfQlVGX1NJWkU7CisJCX0KKwkJaWYgKCFzaXplKQorCQkJYnJlYWs7CisJCS8vIGVuY29kZSB0aGUgYnVmZmVyIHdlIGp1c3QgcmVhZCBpbgorCQliYl91dWVuY29kZShkc3RfYnVmLCBzcmNfYnVmLCBzaXplLCBiYl91dWVuY190YmxfYmFzZTY0KTsKKwkJaWYgKGZuYW1lKSB7CisJCQlwcmludGYoIiVzXG4iLCBlb2wpOworCQl9IGVsc2UgeworCQkJc3JjX2J1ZiArPSBzaXplOworCQkJbGVuIC09IHNpemU7CisJCX0KKwkJZndyaXRlKGRzdF9idWYsIDEsIDQgKiAoKHNpemUgKyAyKSAvIDMpLCBzdGRvdXQpOworCX0KKwlpZiAoZm5hbWUgJiYgTk9UX0xPTkVfREFTSChmbmFtZSkpCisJCWZjbG9zZShmcCk7CisjdW5kZWYgc3JjX2J1ZgorfQorCisvKgorICogZ2V0IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yCisgKi8KK3ZvaWQgRkFTVF9GVU5DIGdldF9jcmVkX29yX2RpZShpbnQgZmQpCit7CisJaWYgKGlzYXR0eShmZCkpIHsKKwkJRy51c2VyID0geHN0cmR1cChiYl9hc2soZmQsIC8qIHRpbWVvdXQ6ICovIDAsICJVc2VyOiAiKSk7CisJCUcucGFzcyA9IHhzdHJkdXAoYmJfYXNrKGZkLCAvKiB0aW1lb3V0OiAqLyAwLCAiUGFzc3dvcmQ6ICIpKTsKKwl9IGVsc2UgeworCQlHLnVzZXIgPSB4bWFsbG9jX3JlYWRzKGZkLCAvKiBtYXhzaXplOiAqLyBOVUxMKTsKKwkJRy5wYXNzID0geG1hbGxvY19yZWFkcyhmZCwgLyogbWF4c2l6ZTogKi8gTlVMTCk7CisJfQorCWlmICghRy51c2VyIHx8ICEqRy51c2VyIHx8ICFHLnBhc3MpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyB1c2VybmFtZSBvciBwYXNzd29yZCIpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWFpbHV0aWxzL21haWwuaCBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9tYWlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkNzgzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9tYWlsLmgKQEAgLTAsMCArMSw0NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGVscGVyIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlwaWRfdCBoZWxwZXJfcGlkOworCXVuc2lnbmVkIHRpbWVvdXQ7CisJdW5zaWduZWQgdmVyYm9zZTsKKwl1bnNpZ25lZCBvcHRzOworCWNoYXIgKnVzZXI7CisJY2hhciAqcGFzczsKKwlGSUxFICpmcDA7IC8vIGluaXRpYWwgc3RkaW4KKwljaGFyICpvcHRfY2hhcnNldDsKKwljaGFyICpjb250ZW50X3R5cGU7Cit9OworCisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgdGltZW91dCAgICAgICAgIChHLnRpbWVvdXQgICkKKyNkZWZpbmUgdmVyYm9zZSAgICAgICAgIChHLnZlcmJvc2UgICkKKyNkZWZpbmUgb3B0cyAgICAgICAgICAgIChHLm9wdHMgICAgICkKKy8vI2RlZmluZSB1c2VyICAgICAgICAgICAgKEcudXNlciAgICAgKQorLy8jZGVmaW5lIHBhc3MgICAgICAgICAgICAoRy5wYXNzICAgICApCisvLyNkZWZpbmUgZnAwICAgICAgICAgICAgIChHLmZwMCAgICAgICkKKy8vI2RlZmluZSBvcHRfY2hhcnNldCAgICAgKEcub3B0X2NoYXJzZXQpCisvLyNkZWZpbmUgY29udGVudF90eXBlICAgIChHLmNvbnRlbnRfdHlwZSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlHLm9wdF9jaGFyc2V0ID0gKGNoYXIgKilDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQ7IFwKKwlHLmNvbnRlbnRfdHlwZSA9IChjaGFyICopInRleHQvcGxhaW4iOyBcCit9IHdoaWxlICgwKQorCisvL2NoYXIgRkFTVF9GVU5DICpwYXJzZV91cmwoY2hhciAqdXJsLCBjaGFyICoqdXNlciwgY2hhciAqKnBhc3MpOworCit2b2lkIGxhdW5jaF9oZWxwZXIoY29uc3QgY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3ZvaWQgZ2V0X2NyZWRfb3JfZGllKGludCBmZCkgRkFTVF9GVU5DOworCitjaGFyICpzZW5kX21haWxfY29tbWFuZChjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKnBhcmFtKSBGQVNUX0ZVTkM7CisKK3ZvaWQgZW5jb2RlX2Jhc2U2NChjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqZW9sKSBGQVNUX0ZVTkM7CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvbWFrZW1pbWUuYyBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9tYWtlbWltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYzUzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvbWFrZW1pbWUuYwpAQCAtMCwwICsxLDIxNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWFrZW1pbWU6IGNyZWF0ZSBNSU1FLWVuY29kZWQgbWVzc2FnZQorICogcmVmb3JtaW1lOiBwYXJzZSBNSU1FLWVuY29kZWQgbWVzc2FnZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfTUFLRU1JTUUpICs9IG1ha2VtaW1lLm8gbWFpbC5vCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1haWwuaCIKKworI2lmIDAKKyMgZGVmaW5lIGRiZ19lcnJvcl9tc2coLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjZWxzZQorIyBkZWZpbmUgZGJnX2Vycm9yX21zZyguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKy8qCisgIG1ha2VtaW1lIC1jIHR5cGUgWy1vIGZpbGVdIFstZSBlbmNvZGluZ10gWy1DIGNoYXJzZXRdIFstTiBuYW1lXSBcCisgICAgICAgICAgICAgICAgICAgWy1hICJIZWFkZXI6IENvbnRlbnRzIl0gZmlsZQorICAgICAgICAgICAtbSBbIHR5cGUgXSBbLW8gZmlsZV0gWy1lIGVuY29kaW5nXSBbLWEgIkhlYWRlcjogQ29udGVudHMiXSBmaWxlCisgICAgICAgICAgIC1qIFstbyBmaWxlXSBmaWxlMSBmaWxlMgorICAgICAgICAgICBAZmlsZQorCisgICBmaWxlOiAgZmlsZW5hbWUgICAgLSByZWFkIG9yIHdyaXRlIGZyb20gZmlsZW5hbWUKKyAgICAgICAgICAtICAgICAgICAgICAtIHJlYWQgb3Igd3JpdGUgZnJvbSBzdGRpbiBvciBzdGRvdXQKKyAgICAgICAgICAmbiAgICAgICAgICAtIHJlYWQgb3Igd3JpdGUgZnJvbSBmaWxlIGRlc2NyaXB0b3IgbgorICAgICAgICAgIFwoIG9wdHMgXCkgIC0gcmVhZCBmcm9tIGNoaWxkIHByb2Nlc3MsIHRoYXQgZ2VuZXJhdGVzIFsgb3B0cyBdCisKK09wdGlvbnM6CisgIC1jIHR5cGUgICAgICAgICAtIGNyZWF0ZSBhIG5ldyBNSU1FIHNlY3Rpb24gZnJvbSAiZmlsZSIgd2l0aCB0aGlzCisgICAgICAgICAgICAgICAgICAgIENvbnRlbnQtVHlwZTogKGRlZmF1bHQgaXMgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtKS4KKyAgLUMgY2hhcnNldCAgICAgIC0gTUlNRSBjaGFyc2V0IG9mIGEgbmV3IHRleHQvcGxhaW4gc2VjdGlvbi4KKyAgLU4gbmFtZSAgICAgICAgIC0gTUlNRSBjb250ZW50IG5hbWUgb2YgdGhlIG5ldyBtaW1lIHNlY3Rpb24uCisgIC1tIFsgdHlwZSBdICAgICAtIGNyZWF0ZSBhIG11bHRpcGFydCBtaW1lIHNlY3Rpb24gZnJvbSAiZmlsZSIgb2YgdGhpcworICAgICAgICAgICAgICAgICAgICBDb250ZW50LVR5cGU6IChkZWZhdWx0IGlzIG11bHRpcGFydC9taXhlZCkuCisgIC1lIGVuY29kaW5nICAgICAtIHVzZSB0aGUgZ2l2ZW4gZW5jb2RpbmcgKDdiaXQsIDhiaXQsIHF1b3RlZC1wcmludGFibGUsCisgICAgICAgICAgICAgICAgICAgIG9yIGJhc2U2NCksIGluc3RlYWQgb2YgZ3Vlc3NpbmcuICBPbWl0ICItZSIgYW5kIHVzZQorICAgICAgICAgICAgICAgICAgICAtYyBhdXRvIHRvIHNldCBDb250ZW50LVR5cGU6IHRvIHRleHQvcGxhaW4gb3IKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIGJhc2VkIG9uIHBpY2tlZCBlbmNvZGluZy4KKyAgLWogZmlsZTEgZmlsZTIgIC0gam9pbiBtaW1lIHNlY3Rpb24gZmlsZTIgdG8gbXVsdGlwYXJ0IHNlY3Rpb24gZmlsZTEuCisgIC1vIGZpbGUgICAgICAgICAtIHdyaXRlIHRoZSByZXN1bHQgdG8gZmlsZSwgaW5zdGVhZCBvZiBzdGRvdXQgKG5vdAorICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGluIGNoaWxkIHByb2Nlc3NlcykuCisgIC1hIGhlYWRlciAgICAgICAtIHByZXBlbmQgYW4gYWRkaXRpb25hbCBoZWFkZXIgdG8gdGhlIG91dHB1dC4KKworICBAZmlsZSAtIHJlYWQgYWxsIG9mIHRoZSBhYm92ZSBvcHRpb25zIGZyb20gZmlsZSwgb25lIG9wdGlvbiBvcgorICAgICAgICAgIHZhbHVlIG9uIGVhY2ggbGluZS4KKyAge3doaWNoIHZlcnNpb24gb2YgbWFrZW1pbWUgaXMgdGhpcz8gV2hhdCBkbyB3ZSBzdXBwb3J0P30KKyovCisvKiBtYW4gbWFrZW1pbWU6CisKKyAqIC1jIFRZUEU6IGNyZWF0ZSBhIChub24tbXVsdGlwYXJ0KSBNSU1FIHNlY3Rpb24gd2l0aCBDb250ZW50LVR5cGU6IFRZUEUKKyAqIG1ha2VtaW1lIC1jIFRZUEUgWy1lIEVOQ09ESU5HXSBbLW8gT1VURklMRV0gWy1DIENIQVJTRVRdIFstTiBOQU1FXSBbLWEgSEVBREVSLi4uXSBGSUxFCisgKiBUaGUgLUMgb3B0aW9uIHNldHMgdGhlIE1JTUUgY2hhcnNldCBhdHRyaWJ1dGUgZm9yIHRleHQvcGxhaW4gY29udGVudC4KKyAqIFRoZSAtTiBvcHRpb24gc2V0cyB0aGUgbmFtZSBhdHRyaWJ1dGUgZm9yIENvbnRlbnQtVHlwZToKKyAqIEVuY29kaW5nIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6IDdiaXQsIDhiaXQsIHF1b3RlZC1wcmludGFibGUsIG9yIGJhc2U2NC4KKworICogLW0gbXVsdGlwYXJ0L1RZUEU6IGNyZWF0ZSBhIG11bHRpcGFydCBNSU1FIGNvbGxlY3Rpb24gd2l0aCBDb250ZW50LVR5cGU6IG11bHRpcGFydC9UWVBFCisgKiBtYWtlbWltZSAtbSBtdWx0aXBhcnQvVFlQRSBbLWUgRU5DT0RJTkddIFstbyBPVVRGSUxFXSBbLWEgSEVBREVSLi4uXSBGSUxFCisgKiBUeXBlIG11c3QgYmUgZWl0aGVyICJtdWx0aXBhcnQvbWl4ZWQiLCAibXVsdGlwYXJ0L2FsdGVybmF0aXZlIiwgb3Igc29tZSBvdGhlciBNSU1FIG11bHRpcGFydCBjb250ZW50IHR5cGUuCisgKiBBZGRpdGlvbmFsbHksIGVuY29kaW5nIGNhbiBvbmx5IGJlICI3Yml0IiBvciAiOGJpdCIsIGFuZCB3aWxsIGRlZmF1bHQgdG8gIjhiaXQiIGlmIG5vdCBzcGVjaWZpZWQuCisgKiBGaW5hbGx5LCBmaWxlbmFtZSBtdXN0IGJlIGEgTUlNRS1mb3JtYXR0ZWQgc2VjdGlvbiwgTk9UIGEgcmVndWxhciBmaWxlLgorICogVGhlIC1tIG9wdGlvbiBjcmVhdGVzIGFuIGluaXRpYWwgbXVsdGlwYXJ0IE1JTUUgY29sbGVjdGlvbiwgdGhhdCBjb250YWlucyBvbmx5IG9uZSBNSU1FIHNlY3Rpb24sIHRha2VuIGZyb20gZmlsZW5hbWUuCisgKiBUaGUgY29sbGVjdGlvbiBpcyB3cml0dGVuIHRvIHN0YW5kYXJkIG91dHB1dCwgb3IgdGhlIHBpcGUgb3IgdG8gb3V0cHV0ZmlsZS4KKworICogLWogRklMRTE6IGFkZCBhIHNlY3Rpb24gdG8gYSBtdWx0aXBhcnQgTUlNRSBjb2xsZWN0aW9uCisgKiBtYWtlbWltZSAtaiBGSUxFMSBbLW8gT1VURklMRV0gRklMRTIKKyAqIEZJTEUxIG11c3QgYmUgYSBNSU1FIGNvbGxlY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIGJ5IHRoZSAtbSBvcHRpb24uCisgKiBGSUxFMiBtdXN0IGJlIGEgTUlNRSBzZWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBieSB0aGUgLWMgb3B0aW9uLgorICogVGhlIC1qIG9wdGlvbnMgYWRkcyB0aGUgTUlNRSBzZWN0aW9uIGluIEZJTEUyIHRvIHRoZSBNSU1FIGNvbGxlY3Rpb24gaW4gRklMRTEuCisgKi8KKworCisvKiBJbiBidXN5Ym94IDEuMTUuMC5zdm4sIG1ha2VtaW1lIGdlbmVyYXRlcyBvdXRwdXQgbGlrZSB0aGlzCisgKiAoZW1wdHkgbGluZXMgYXJlIHNob3duIGV4YWN0bHkhKToKK3toZWFkZXJzIGFkZGVkIHdpdGggLWEgSERSfQorTWltZS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iMjQyNjk1MzQtMjE0NTU4MzQ0OC0xNjU1ODkwNjc2IgorCistLTI0MjY5NTM0LTIxNDU1ODM0NDgtMTY1NTg5MDY3NgorQ29udGVudC1UeXBlOiB7c2V0IGJ5IC1jLCBlLmcuIHRleHQvcGxhaW59OyBjaGFyc2V0PXtzZXQgYnkgLUMsIGUuZy4gdXMtYXNjaWl9CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSJBIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKKy4uLmZpbGUgQSBjb250ZW50cy4uLgorLS0yNDI2OTUzNC0yMTQ1NTgzNDQ4LTE2NTU4OTA2NzYKK0NvbnRlbnQtVHlwZToge3NldCBieSAtYywgZS5nLiB0ZXh0L3BsYWlufTsgY2hhcnNldD17c2V0IGJ5IC1DLCBlLmcuIHVzLWFzY2lpfQorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iQiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCisuLi5maWxlIEIgY29udGVudHMuLi4KKy0tMjQyNjk1MzQtMjE0NTU4MzQ0OC0xNjU1ODkwNjc2LS0KKworICoKKyAqIEZvciByZWZlcmVuY2U6IGhlcmUgaXMgYW4gZXhhbXBsZSBlbWFpbCB0byBMS01MIHdoaWNoIGhhcworICogMXN0IHVubmFtZWQgcGFydCAoc28gaXQgc2VydmVzIGFzIGFuIGVtYWlsIGJvZHkpCisgKiBhbmQgb25lIGF0dGFjaGVkIGZpbGU6CisuLi5vdGhlciBoZWFkZXJzLi4uCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij0tdE9mVGYzYnlPUzB2Wmd4RVdjWCsiCisuLi5vdGhlciBoZWFkZXJzLi4uCitNaW1lLVZlcnNpb246IDEuMAorLi4ub3RoZXIgaGVhZGVycy4uLgorCisKKy0tPS10T2ZUZjNieU9TMHZaZ3hFV2NYKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKKy4uLmVtYWlsIHRleHQuLi4KKy4uLmVtYWlsIHRleHQuLi4KKworCistLT0tdE9mVGYzYnlPUzB2Wmd4RVdjWCsKK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ4eXoiCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IG5hbWU9Inh5eiI7IGNoYXJzZXQ9IlVURi04IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCisuLi5maWxlIGNvbnRlbnRzLi4uCisuLi5maWxlIGNvbnRlbnRzLi4uCisKKy0tPS10T2ZUZjNieU9TMHZaZ3hFV2NYKy0tCisKKy4uLnJhbmRvbSBqdW5rIGFkZGVkIGJ5IG1haWxpbmcgbGlzdCByb2JvdHMgYW5kIHN1Y2guLi4KKyovCisKKy8vdXNhZ2U6I2RlZmluZSBtYWtlbWltZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBtYWtlbWltZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBtdWx0aXBhcnQgTUlNRS1lbmNvZGVkIG1lc3NhZ2UgZnJvbSBGSUxFc1xuIgorLyogLy91c2FnZTogICAgIlRyYW5zZmVyIGVuY29kaW5nIGlzIGJhc2U2NCwgZGlzcG9zaXRpb24gaXMgaW5saW5lIChub3QgYXR0YWNobWVudClcbiIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLW8gRklMRQlPdXRwdXQuIERlZmF1bHQ6IHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWEgSERSCUFkZCBoZWFkZXIuIEV4YW1wbGVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JCVwiRnJvbTogdXNlckBob3N0Lm9yZ1wiLCBcIkRhdGU6IGBkYXRlIC1SYFwiIgorLy91c2FnZTogICAgICJcbgktYyBDVAlDb250ZW50IHR5cGUuIERlZmF1bHQ6IHRleHQvcGxhaW4iCisvL3VzYWdlOiAgICAgIlxuCS1DIENTCUNoYXJzZXQuIERlZmF1bHQ6ICIgQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUCisvKiAvL3VzYWdlOiAgIlxuCS1lIEVOQwlUcmFuc2ZlciBlbmNvZGluZy4gSWdub3JlZC4gYmFzZTY0IGlzIGFzc3VtZWQiICovCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk90aGVyIG9wdGlvbnMgYXJlIHNpbGVudGx5IGlnbm9yZWQiCisKK2ludCBtYWtlbWltZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWFrZW1pbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWxsaXN0X3QgKm9wdF9oZWFkZXJzID0gTlVMTCwgKmw7CisJY29uc3QgY2hhciAqb3B0X291dHB1dDsKKyNkZWZpbmUgYm91bmRhcnkgb3B0X291dHB1dAorCisJZW51bSB7CisJCU9QVF9jID0gMSA8PCAwLCAgICAgICAgIC8vIGNyZWF0ZSAobm9uLW11bHRpcGFydCkgc2VjdGlvbgorCQlPUFRfZSA9IDEgPDwgMSwgICAgICAgICAvLyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nLiBJZ25vcmVkLiBBc3N1bWVkIGJhc2U2NAorCQlPUFRfbyA9IDEgPDwgMiwgICAgICAgICAvLyBvdXRwdXQgdG8KKwkJT1BUX0MgPSAxIDw8IDMsICAgICAgICAgLy8gY2hhcnNldAorCQlPUFRfTiA9IDEgPDwgNCwgICAgICAgICAvLyBDT01QQVQKKwkJT1BUX2EgPSAxIDw8IDUsICAgICAgICAgLy8gYWRkaXRpb25hbCBoZWFkZXJzCisJCS8vT1BUX20gPSAxIDw8IDYsICAgICAgICAgLy8gY3JlYXRlIG11dGlwYXJ0IHNlY3Rpb24KKwkJLy9PUFRfaiA9IDEgPDwgNywgICAgICAgICAvLyBqb2luIHNlY3Rpb24gdG8gbXVsdGlwYXJ0IHNlY3Rpb24KKwl9OworCisJSU5JVF9HKCk7CisKKwkvLyBwYXJzZSBvcHRpb25zCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiYTo6IjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwKKwkJImM6ZTpvOkM6TjphIiwgLy86bTpqOiIsCisJCSZHLmNvbnRlbnRfdHlwZSwgTlVMTCwgJm9wdF9vdXRwdXQsICZHLm9wdF9jaGFyc2V0LCBOVUxMLCAmb3B0X2hlYWRlcnMgLy8sIE5VTEwsIE5VTEwKKwkpOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvLyByZXNwZWN0IC1vIG91dHB1dAorCWlmIChvcHRzICYgT1BUX28pCisJCWZyZW9wZW4ob3B0X291dHB1dCwgInciLCBzdGRvdXQpOworCisJLy8gbm8gZmlsZXMgZ2l2ZW4gb24gY29tbWFuZCBsaW5lPyAtPiB1c2Ugc3RkaW4KKwlpZiAoISphcmd2KQorCQkqLS1hcmd2ID0gKGNoYXIgKikiLSI7CisKKwkvLyBwdXQgYWRkaXRpb25hbCBoZWFkZXJzCisJZm9yIChsID0gb3B0X2hlYWRlcnM7IGw7IGwgPSBsLT5saW5rKQorCQlwdXRzKGwtPmRhdGEpOworCisJLy8gbWFrZSBhIHJhbmRvbSBzdHJpbmcgLS0gaXQgd2lsbCBkZWxpbWl0IG1lc3NhZ2UgcGFydHMKKwlzcmFuZChtb25vdG9uaWNfdXMoKSk7CisJYm91bmRhcnkgPSB4YXNwcmludGYoIiV1LSV1LSV1IiwKKwkJCSh1bnNpZ25lZClyYW5kKCksICh1bnNpZ25lZClyYW5kKCksICh1bnNpZ25lZClyYW5kKCkpOworCisJLy8gcHV0IG11bHRpcGFydCBoZWFkZXIKKwlwcmludGYoCisJCSJNaW1lLVZlcnNpb246IDEuMFxuIgorCQkiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PVwiJXNcIlxuIgorCQksIGJvdW5kYXJ5CisJKTsKKworCS8vIHB1dCBhdHRhY2htZW50cworCXdoaWxlICgqYXJndikgeworCQlwcmludGYoCisJCQkiXG4tLSVzXG4iCisJCQkiQ29udGVudC1UeXBlOiAlczsgY2hhcnNldD0lc1xuIgorCQkJIkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9XCIlc1wiXG4iCisJCQkiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0XG4iCisJCQksIGJvdW5kYXJ5CisJCQksIEcuY29udGVudF90eXBlCisJCQksIEcub3B0X2NoYXJzZXQKKwkJCSwgYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoKmFyZ3YpCisJCSk7CisJCWVuY29kZV9iYXNlNjQoKmFyZ3YrKywgKGNvbnN0IGNoYXIgKilzdGRpbiwgIiIpOworCX0KKworCS8vIHB1dCBtdWx0aXBhcnQgZm9vdGVyCisJcHJpbnRmKCJcbi0tJXMtLVxuIiAiXG4iLCBib3VuZGFyeSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworI3VuZGVmIGJvdW5kYXJ5Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvcG9wbWFpbGRpci5jIGIvYnVzeWJveC0xLjE5LjMvbWFpbHV0aWxzL3BvcG1haWxkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjAzMDMzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWFpbHV0aWxzL3BvcG1haWxkaXIuYwpAQCAtMCwwICsxLDI3MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcG9wbWFpbGRpcjogYSBzaW1wbGUgeWV0IHBvd2VyZnVsIFBPUDMgY2xpZW50CisgKiBEZWxpdmVycyBjb250ZW50cyBvZiByZW1vdGUgbWFpbGJveGVzIHRvIGxvY2FsIE1haWxkaXIKKyAqCisgKiBJbnNwaXJlZCBieSBvcmlnaW5hbCB1dGlsaXR5IGJ5IE5pa29sYSBWbGFkb3YKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1BPUE1BSUxESVIpICs9IHBvcG1haWxkaXIubyBtYWlsLm8KKworLy91c2FnZTojZGVmaW5lIHBvcG1haWxkaXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBNQUlMRElSIFtDT05OX0hFTFBFUiBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSBwb3BtYWlsZGlyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRmV0Y2ggY29udGVudCBvZiByZW1vdGUgbWFpbGJveCB0byBsb2NhbCBtYWlsZGlyXG4iCisvKiAvL3VzYWdlOiAgIlxuCS1iCQlCaW5hcnkgbW9kZS4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLWQJCURlYnVnLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktbQkJU2hvdyB1c2VkIG1lbW9yeS4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLVYJCVNob3cgdmVyc2lvbi4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLWMJCVVzZSB0Y3BjbGllbnQuIElnbm9yZWQiICovCisvKiAvL3VzYWdlOiAgIlxuCS1hCQlVc2UgQVBPUCBwcm90b2NvbC4gSW1wbGllZC4gSWYgc2VydmVyIHN1cHBvcnRzIEFQT1AgLT4gdXNlIGl0IiAqLworLy91c2FnZTogICAgICJcbgktcwkJU2tpcCBhdXRob3JpemF0aW9uIgorLy91c2FnZTogICAgICJcbgktVAkJR2V0IG1lc3NhZ2VzIHdpdGggVE9QIGluc3RlYWQgb2YgUkVUUiIKKy8vdXNhZ2U6ICAgICAiXG4JLWsJCUtlZXAgcmV0cmlldmVkIG1lc3NhZ2VzIG9uIHRoZSBzZXJ2ZXIiCisvL3VzYWdlOiAgICAgIlxuCS10IFNFQwkJTmV0d29yayB0aW1lb3V0IgorLy91c2FnZToJSUZfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZKAorLy91c2FnZTogICAgICJcbgktRiBcIlBST0cgQVJHU1wiCUZpbHRlciBwcm9ncmFtIChtYXkgYmUgcmVwZWF0ZWQpIgorLy91c2FnZTogICAgICJcbgktTSBcIlBST0cgQVJHU1wiCURlbGl2ZXJ5IHByb2dyYW0iCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbkZldGNoIGZyb20gcGxhaW4gUE9QMyBzZXJ2ZXI6IgorLy91c2FnZTogICAgICJcbnBvcG1haWxkaXIgLWsgRElSIG5jIHBvcDMuc2VydmVyLmNvbSAxMTAgPHVzZXJfYW5kX3Bhc3MudHh0IgorLy91c2FnZTogICAgICJcbkZldGNoIGZyb20gU1NMZWQgUE9QMyBzZXJ2ZXIgYW5kIGRlbGV0ZSBmZXRjaGVkIGVtYWlsczoiCisvL3VzYWdlOiAgICAgIlxucG9wbWFpbGRpciBESVIgLS0gb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3QgcG9wMy5zZXJ2ZXIuY29tOjk5NSA8dXNlcl9hbmRfcGFzcy50eHQiCisvKiAvL3VzYWdlOiAgIlxuCS1SIEJZVEVTCVJlbW92ZSBvbGQgbWVzc2FnZXMgb24gdGhlIHNlcnZlciA+PSBCWVRFUy4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLVogTjEtTjIJUmVtb3ZlIG1lc3NhZ2VzIGZyb20gTjEgdG8gTjIgKGRhbmdlcm91cykuIElnbm9yZWQiICovCisvKiAvL3VzYWdlOiAgIlxuCS1MIEJZVEVTCURvbid0IHJldHJpZXZlIG5ldyBtZXNzYWdlcyA+PSBCWVRFUy4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLUggTElORVMJVHlwZSBmaXJzdCBMSU5FUyBvZiBhIG1lc3NhZ2UuIElnbm9yZWQiICovCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHBvcG1haWxkaXJfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcG9wbWFpbGRpciAtayB+L01haWxkaXIgLS0gbmMgcG9wLmRydnYucnUgMTEwIFs8cGFzc3dvcmRfZmlsZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIkIHBvcG1haWxkaXIgfi9NYWlsZGlyIC0tIG9wZW5zc2wgc19jbGllbnQgLXF1aWV0IC1jb25uZWN0IHBvcC5nbWFpbC5jb206OTk1IFs8cGFzc3dvcmRfZmlsZV1cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibWFpbC5oIgorCitzdGF0aWMgdm9pZCBwb3AzX2NoZWNrcihjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKnBhcmFtLCBjaGFyICoqcmV0KQoreworCWNoYXIgKm1zZyA9IHNlbmRfbWFpbF9jb21tYW5kKGZtdCwgcGFyYW0pOworCWNoYXIgKmFuc3dlciA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pOworCWlmIChhbnN3ZXIgJiYgJysnID09IGFuc3dlclswXSkgeworCQlmcmVlKG1zZyk7CisJCWlmICh0aW1lb3V0KQorCQkJYWxhcm0oMCk7CisJCWlmIChyZXQpIHsKKwkJCS8vIHNraXAgIitPSyAiCisJCQltZW1tb3ZlKGFuc3dlciwgYW5zd2VyICsgNCwgc3RybGVuKGFuc3dlcikgLSA0KTsKKwkJCSpyZXQgPSBhbnN3ZXI7CisJCX0gZWxzZQorCQkJZnJlZShhbnN3ZXIpOworCQlyZXR1cm47CisJfQorCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBmYWlsZWQsIHJlcGx5IHdhczogJXMiLCBtc2csIGFuc3dlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBvcDNfY2hlY2soY29uc3QgY2hhciAqZm10LCBjb25zdCBjaGFyICpwYXJhbSkKK3sKKwlwb3AzX2NoZWNrcihmbXQsIHBhcmFtLCBOVUxMKTsKK30KKworaW50IHBvcG1haWxkaXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBvcG1haWxkaXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBubXNnOworCWNoYXIgKmhvc3RuYW1lOworCXBpZF90IHBpZDsKKwljb25zdCBjaGFyICpyZXRyOworI2lmIEVOQUJMRV9GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkKKwljb25zdCBjaGFyICpkZWxpdmVyeTsKKyNlbmRpZgorCXVuc2lnbmVkIG9wdF9ubGluZXMgPSAwOworCisJZW51bSB7CisJCU9QVF9iID0gMSA8PCAwLAkJLy8gLWIgYmluYXJ5IG1vZGUuIElnbm9yZWQKKwkJT1BUX2QgPSAxIDw8IDEsCQkvLyAtZCwtZGQsLWRkZCBkZWJ1Zy4gSWdub3JlZAorCQlPUFRfbSA9IDEgPDwgMiwJCS8vIC1tIHNob3cgdXNlZCBtZW1vcnkuIElnbm9yZWQKKwkJT1BUX1YgPSAxIDw8IDMsCQkvLyAtViB2ZXJzaW9uLiBJZ25vcmVkCisJCU9QVF9jID0gMSA8PCA0LAkJLy8gLWMgdXNlIHRjcGNsaWVudC4gSWdub3JlZAorCQlPUFRfYSA9IDEgPDwgNSwJCS8vIC1hIHVzZSBBUE9QIHByb3RvY29sCisJCU9QVF9zID0gMSA8PCA2LAkJLy8gLXMgc2tpcCBhdXRob3JpemF0aW9uCisJCU9QVF9UID0gMSA8PCA3LAkJLy8gLVQgZ2V0IG1lc3NhZ2VzIHdpdGggVE9QIGluc3RlYWQgd2l0aCBSRVRSCisJCU9QVF9rID0gMSA8PCA4LAkJLy8gLWsga2VlcCByZXRyaWV2ZWQgbWVzc2FnZXMgb24gdGhlIHNlcnZlcgorCQlPUFRfdCA9IDEgPDwgOSwJCS8vIC10OTAgc2V0IHRpbWVvdXQgdG8gOTAgc2VjCisJCU9QVF9SID0gMSA8PCAxMCwJLy8gLVIyMDAwMCByZW1vdmUgb2xkIG1lc3NhZ2VzIG9uIHRoZSBzZXJ2ZXIgPj0gMjAwMDAgYnl0ZXMgKHJlcXVpcmVzIC1rKS4gSWdub3JlZAorCQlPUFRfWiA9IDEgPDwgMTEsCS8vIC1aMTEtMjMgcmVtb3ZlIG1lc3NhZ2VzIGZyb20gMTEgdG8gMjMgKGRhbmdlcm91cykuIElnbm9yZWQKKwkJT1BUX0wgPSAxIDw8IDEyLAkvLyAtTDUwMDAwIG5vdCByZXRyaWV2ZSBuZXcgbWVzc2FnZXMgPj0gNTAwMDAgYnl0ZXMuIElnbm9yZWQKKwkJT1BUX0ggPSAxIDw8IDEzLAkvLyAtSDMwIHR5cGUgZmlyc3QgMzAgbGluZXMgb2YgYSBtZXNzYWdlOyAoLUwxMjAwMCAtSDMwKS4gSWdub3JlZAorCQlPUFRfTSA9IDEgPDwgMTQsCS8vIC1NXCJwcm9ncmFtIGFyZzEgYXJnMiAuLi5cIjsgZGVsaXZlciBieSBwcm9ncmFtLiBUcmVhdGVkIGxpa2UgLUYKKwkJT1BUX0YgPSAxIDw8IDE1LAkvLyAtRlwicHJvZ3JhbSBhcmcxIGFyZzIgLi4uXCI7IGZpbHRlciBieSBwcm9ncmFtLiBUcmVhdGVkIGxpa2UgLU0KKwl9OworCisJLy8gaW5pdCBnbG9iYWwgdmFyaWFibGVzCisJSU5JVF9HKCk7CisKKwkvLyBwYXJzZSBvcHRpb25zCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6ZGQ6dCs6Uis6TCs6SCsiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LAorCQkiYmRtVmNhc1RrdDoiICJSOlo6TDpIOiIgSUZfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZKCJNOkY6IiksCisJCSZ0aW1lb3V0LCBOVUxMLCBOVUxMLCBOVUxMLCAmb3B0X25saW5lcworCQlJRl9GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkoLCAmZGVsaXZlcnksICZkZWxpdmVyeSkgLy8gd2UgdHJlYXQgLU0gYW5kIC1GIHRoZSBzYW1lCisJKTsKKwkvL2FyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJLy8gZ2V0IGF1dGggaW5mbworCWlmICghKG9wdHMgJiBPUFRfcykpCisJCWdldF9jcmVkX29yX2RpZShTVERJTl9GSUxFTk8pOworCisJLy8gZ290byBtYWlsZGlyCisJeGNoZGlyKCphcmd2KyspOworCisJLy8gbGF1bmNoIGNvbm5lY3QgaGVscGVyLCBpZiBhbnkKKwlpZiAoKmFyZ3YpCisJCWxhdW5jaF9oZWxwZXIoKGNvbnN0IGNoYXIgKiopYXJndik7CisKKwkvLyBnZXQgc2VydmVyIGdyZWV0aW5nCisJcG9wM19jaGVja3IoTlVMTCwgTlVMTCwgJmJ1Zik7CisKKwkvLyBhdXRoZW50aWNhdGUgKGlmIG5vIC1zIGdpdmVuKQorCWlmICghKG9wdHMgJiBPUFRfcykpIHsKKwkJLy8gc2VydmVyIHN1cHBvcnRzIEFQT1AgYW5kIHdlIHdhbnQgaXQ/CisJCWlmICgnPCcgPT0gYnVmWzBdICYmIChvcHRzICYgT1BUX2EpKSB7CisJCQl1bmlvbiB7IC8vIHNhdmUgYSBiaXQgb2Ygc3RhY2sKKwkJCQltZDVfY3R4X3QgY3R4OworCQkJCWNoYXIgaGV4WzE2ICogMiArIDFdOworCQkJfSBtZDU7CisJCQl1aW50MzJfdCByZXNbMTYgLyA0XTsKKworCQkJY2hhciAqcyA9IHN0cmNocihidWYsICc+Jyk7CisJCQlpZiAocykKKwkJCQlzWzFdID0gJ1wwJzsKKwkJCS8vIGdldCBtZDUgc3VtIG9mICI8c3RhbXA+cGFzc3dvcmQiIHN0cmluZworCQkJbWQ1X2JlZ2luKCZtZDUuY3R4KTsKKwkJCW1kNV9oYXNoKCZtZDUuY3R4LCBidWYsIHN0cmxlbihidWYpKTsKKwkJCW1kNV9oYXNoKCZtZDUuY3R4LCBHLnBhc3MsIHN0cmxlbihHLnBhc3MpKTsKKwkJCW1kNV9lbmQoJm1kNS5jdHgsIHJlcyk7CisJCQkqYmluMmhleChtZDUuaGV4LCAoY2hhciopcmVzLCAxNikgPSAnXDAnOworCQkJLy8gQVBPUAorCQkJcyA9IHhhc3ByaW50ZigiJXMgJXMiLCBHLnVzZXIsIG1kNS5oZXgpOworCQkJcG9wM19jaGVjaygiQVBPUCAlcyIsIHMpOworCQkJZnJlZShzKTsKKwkJCWZyZWUoYnVmKTsKKwkJLy8gc2VydmVyIGlnbm9yZXMgQVBPUCAtPiB1c2Ugc2ltcGxlIHRleHQgYXV0aGVudGljYXRpb24KKwkJfSBlbHNlIHsKKwkJCS8vIFVTRVIKKwkJCXBvcDNfY2hlY2soIlVTRVIgJXMiLCBHLnVzZXIpOworCQkJLy8gUEFTUworCQkJcG9wM19jaGVjaygiUEFTUyAlcyIsIEcucGFzcyk7CisJCX0KKwl9CisKKwkvLyBnZXQgbWFpbGJveCBzdGF0aXN0aWNzCisJcG9wM19jaGVja3IoIlNUQVQiLCBOVUxMLCAmYnVmKTsKKworCS8vIHByZXBhcmUgbWVzc2FnZSBmaWxlbmFtZSBzdWZmaXgKKwlob3N0bmFtZSA9IHNhZmVfZ2V0aG9zdG5hbWUoKTsKKwlwaWQgPSBnZXRwaWQoKTsKKworCS8vIGdldCBtZXNzYWdlcyBjb3VudGVyCisJLy8gTk9URTogd2UgZG9uJ3QgdXNlIHhhdG91KGJ1Zikgc2luY2UgYnVmIGlzICJubXNnIG5ieXRlcyIKKwkvLyB3ZSBvbmx5IG5lZWQgbm1zZyBhbmQgYXRvaSBpcyBqdXN0IGV4YWN0bHkgd2hhdCB3ZSBuZWVkCisJLy8gaWYgYXRvaSBmYWlscyB0byBjb252ZXJ0IGJ1ZiBpbnRvIG51bWJlciBpdCByZXR1cm5zIDAKKwkvLyBpbiB0aGlzIGNhc2UgdGhlIGZvbGxvd2luZyBsb29wIHNpbXBseSB3aWxsIG5vdCBiZSBleGVjdXRlZAorCW5tc2cgPSBhdG9pKGJ1Zik7CisJZnJlZShidWYpOworCisJLy8gbG9vcCB0aHJvdWdoIG1lc3NhZ2VzCisJcmV0ciA9IChvcHRzICYgT1BUX1QpID8geGFzcHJpbnRmKCJUT1AgJSV1ICV1Iiwgb3B0X25saW5lcykgOiAiUkVUUiAldSI7CisJZm9yICg7IG5tc2c7IG5tc2ctLSkgeworCisJCWNoYXIgKmZpbGVuYW1lOworCQljaGFyICp0YXJnZXQ7CisJCWNoYXIgKmFuc3dlcjsKKwkJRklMRSAqZnA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWQorCQlpbnQgcmM7CisjZW5kaWYKKwkJLy8gZ2VuZXJhdGUgdW5pcXVlIGZpbGVuYW1lCisJCWZpbGVuYW1lICA9IHhhc3ByaW50ZigidG1wLyVsbHUuJXUuJXMiLAorCQkJbW9ub3RvbmljX3VzKCksICh1bnNpZ25lZClwaWQsIGhvc3RuYW1lKTsKKworCQkvLyByZXRyaWV2ZSBtZXNzYWdlIGluIC4vdG1wLyB1bmxlc3MgZmlsdGVyIGlzIHNwZWNpZmllZAorCQlwb3AzX2NoZWNrKHJldHIsIChjb25zdCBjaGFyICopKHB0cmRpZmZfdClubXNnKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkKKwkJLy8gZGVsaXZlcnkgaGVscGVyIG9yZGVyZWQ/IC0+IHNldHVwIHBpcGUKKwkJaWYgKG9wdHMgJiAoT1BUX0Z8T1BUX00pKSB7CisJCQkvLyBoZWxwZXIgd2lsbCBoYXZlICRGSUxFTkFNRSBzZXQgdG8gZmlsZW5hbWUKKwkJCXhzZXRlbnYoIkZJTEVOQU1FIiwgZmlsZW5hbWUpOworCQkJZnAgPSBwb3BlbihkZWxpdmVyeSwgInciKTsKKwkJCXVuc2V0ZW52KCJGSUxFTkFNRSIpOworCQkJaWYgKCFmcCkgeworCQkJCWJiX3BlcnJvcl9tc2coImRlbGl2ZXJ5IGhlbHBlciIpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKyNlbmRpZgorCQkvLyBjcmVhdGUgYW5kIG9wZW4gZmlsZSBmaWxlbmFtZQorCQlmcCA9IHhmb3Blbl9mb3Jfd3JpdGUoZmlsZW5hbWUpOworCisJCS8vIGNvcHkgc3RkaW4gdG8gZnAgKGVpdGhlciBmaWxlbmFtZSBvciBkZWxpdmVyeSBoZWxwZXIpCisJCXdoaWxlICgoYW5zd2VyID0geG1hbGxvY19mZ2V0c19zdHIoc3RkaW4sICJcclxuIikpICE9IE5VTEwpIHsKKwkJCWNoYXIgKnMgPSBhbnN3ZXI7CisJCQlpZiAoJy4nID09IGFuc3dlclswXSkgeworCQkJCWlmICgnLicgPT0gYW5zd2VyWzFdKQorCQkJCQlzKys7CisJCQkJZWxzZSBpZiAoJ1xyJyA9PSBhbnN3ZXJbMV0gJiYgJ1xuJyA9PSBhbnN3ZXJbMl0gJiYgJ1wwJyA9PSBhbnN3ZXJbM10pCisJCQkJCWJyZWFrOworCQkJfQorCQkJLy8qc3RyY2hybnVsKHMsICdccicpID0gJ1xuJzsKKwkJCWZwdXRzKHMsIGZwKTsKKwkJCWZyZWUoYW5zd2VyKTsKKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWQorCQkvLyBhbmFseXNlIGRlbGl2ZXJ5IHN0YXR1cworCQlpZiAob3B0cyAmIChPUFRfRnxPUFRfTSkpIHsKKwkJCXJjID0gcGNsb3NlKGZwKTsKKwkJCWlmICg5OSA9PSByYykgLy8gOTkgbWVhbnMgYmFpbCBvdXQKKwkJCQlicmVhazsKKy8vCQkJaWYgKHJjKSAvLyAhMCBtZWFucyBza2lwIHRvIHRoZSBuZXh0IG1lc3NhZ2UKKwkJCQlnb3RvIHNraXA7CisvLwkJCS8vIDAgbWVhbnMgY29udGludWUKKwkJfSBlbHNlIHsKKwkJCS8vIGNsb3NlIGZpbGVuYW1lCisJCQlmY2xvc2UoZnApOworCQl9CisjZW5kaWYKKworCQkvLyBkZWxldGUgbWVzc2FnZSBmcm9tIHNlcnZlcgorCQlpZiAoIShvcHRzICYgT1BUX2spKQorCQkJcG9wM19jaGVjaygiREVMRSAldSIsIChjb25zdCBjaGFyKikocHRyZGlmZl90KW5tc2cpOworCisJCS8vIGF0b21pY2FsbHkgbW92ZSBtZXNzYWdlIHRvIC4vbmV3LworCQl0YXJnZXQgPSB4c3RyZHVwKGZpbGVuYW1lKTsKKwkJc3RybmNweSh0YXJnZXQsICJuZXciLCAzKTsKKwkJLy8gLi4uIG9yIGp1c3Qgc3RvcCByZWNlaXZpbmcgb24gZmFpbHVyZQorCQlpZiAocmVuYW1lX29yX3dhcm4oZmlsZW5hbWUsIHRhcmdldCkpCisJCQlicmVhazsKKwkJZnJlZSh0YXJnZXQpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWQorIHNraXA6CisjZW5kaWYKKwkJZnJlZShmaWxlbmFtZSk7CisJfQorCisJLy8gQnllCisJcG9wM19jaGVjaygiUVVJVCIsIE5VTEwpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoRy51c2VyKTsKKwkJZnJlZShHLnBhc3MpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvcmVmb3JtaW1lLmMgYi9idXN5Ym94LTEuMTkuMy9tYWlsdXRpbHMvcmVmb3JtaW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyOGVmNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9yZWZvcm1pbWUuYwpAQCAtMCwwICsxLDI3OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWFrZW1pbWU6IGNyZWF0ZSBNSU1FLWVuY29kZWQgbWVzc2FnZQorICogcmVmb3JtaW1lOiBwYXJzZSBNSU1FLWVuY29kZWQgbWVzc2FnZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfUkVGT1JNSU1FKSArPSByZWZvcm1pbWUubyBtYWlsLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibWFpbC5oIgorCisjaWYgMAorIyBkZWZpbmUgZGJnX2Vycm9yX21zZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjIGRlZmluZSBkYmdfZXJyb3JfbXNnKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfdG9rZW4oY29uc3QgY2hhciAqY29uc3Qgc3RyaW5nX2FycmF5W10sIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqZGVmdmFsdWUpCit7CisJY29uc3QgY2hhciAqciA9IE5VTEw7CisJaW50IGk7CisJZm9yIChpID0gMDsgc3RyaW5nX2FycmF5W2ldICE9IE5VTEw7IGkrKykgeworCQlpZiAoc3RyY2FzZWNtcChzdHJpbmdfYXJyYXlbaV0sIGtleSkgPT0gMCkgeworCQkJciA9IChjaGFyICopc3RyaW5nX2FycmF5W2krMV07CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKHIpID8gciA6IGRlZnZhbHVlOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqeGZpbmRfdG9rZW4oY29uc3QgY2hhciAqY29uc3Qgc3RyaW5nX2FycmF5W10sIGNvbnN0IGNoYXIgKmtleSkKK3sKKwljb25zdCBjaGFyICpyID0gZmluZF90b2tlbihzdHJpbmdfYXJyYXksIGtleSwgTlVMTCk7CisJaWYgKHIpCisJCXJldHVybiByOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgZm91bmQ6ICclcyciLCBrZXkpOworfQorCitlbnVtIHsKKwlPUFRfeCA9IDEgPDwgMCwKKwlPUFRfWCA9IDEgPDwgMSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUCisJT1BUX2QgPSAxIDw8IDIsCisJT1BUX2UgPSAxIDw8IDMsCisJT1BUX2kgPSAxIDw8IDQsCisJT1BUX3MgPSAxIDw8IDUsCisJT1BUX3IgPSAxIDw8IDYsCisJT1BUX2MgPSAxIDw8IDcsCisJT1BUX20gPSAxIDw8IDgsCisJT1BUX2ggPSAxIDw8IDksCisJT1BUX28gPSAxIDw8IDEwLAorCU9QVF9PID0gMSA8PCAxMSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBwYXJzZShjb25zdCBjaGFyICpib3VuZGFyeSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGJvdW5kYXJ5X2xlbiA9IHN0cmxlbihib3VuZGFyeSk7CisJY2hhciB1bmlxW3NpemVvZigiJSVsbHUuJXUiKSArIHNpemVvZihpbnQpKjNdOworCisJZGJnX2Vycm9yX21zZygiQk9VTkRBUllbJXNdIiwgYm91bmRhcnkpOworCisJLy8gcHJlcGFyZSB1bmlxdWUgc3RyaW5nIHBhdHRlcm4KKwlzcHJpbnRmKHVuaXEsICIlJWxsdS4ldSIsICh1bnNpZ25lZClnZXRwaWQoKSk7CisJZGJnX2Vycm9yX21zZygiVU5JUVslc10iLCB1bmlxKTsKKworCXdoaWxlICgxKSB7CisJCWNoYXIgKmhlYWRlcjsKKwkJY29uc3QgY2hhciAqdG9rZW5zWzMyXTsgLyogMzIgaXMgZW5vdWdoICovCisJCWNvbnN0IGNoYXIgKnR5cGU7CisKKwkJLyogUmVhZCB0aGUgaGVhZGVyIChldmVyeXRoaW5nIHVwIHRvIHR3byBcbikgKi8KKwkJeworCQkJdW5zaWduZWQgaGVhZGVyX2lkeCA9IDA7CisJCQlpbnQgbGFzdF9jaCA9IDA7CisJCQloZWFkZXIgPSBOVUxMOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpbnQgY2ggPSBmZ2V0YyhzdGRpbik7CisJCQkJaWYgKGNoID09ICdccicpIC8qIFN1cHBvcnQgYm90aCBsaW5lIGVuZGluZ3MgKi8KKwkJCQkJY29udGludWU7CisJCQkJaWYgKGNoID09IEVPRikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGNoID09ICdcbicgJiYgbGFzdF9jaCA9PSBjaCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCEoaGVhZGVyX2lkeCAmIDB4ZmYpKQorCQkJCQloZWFkZXIgPSB4cmVhbGxvYyhoZWFkZXIsIGhlYWRlcl9pZHggKyAweDEwMSk7CisJCQkJaGVhZGVyW2hlYWRlcl9pZHgrK10gPSBsYXN0X2NoID0gY2g7CisJCQl9CisJCQlpZiAoIWhlYWRlcikgeworCQkJCWRiZ19lcnJvcl9tc2coIkVPRiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaGVhZGVyW2hlYWRlcl9pZHhdID0gJ1wwJzsKKwkJCWRiZ19lcnJvcl9tc2coIkg6JyVzJyIsIHApOworCQl9CisKKwkJLyogU3BsaXQgdG8gdG9rZW5zICovCisJCXsKKwkJCWNoYXIgKnMsICpwOworCQkJdW5zaWduZWQgbnRva2VuczsKKwkJCWNvbnN0IGNoYXIgKmRlbGltcyA9ICI7PVwiIFx0XG4iOworCisJCQkvKiBTa2lwIHRvIGxhc3QgQ29udGVudC1UeXBlOiAqLworCQkJcyA9IHAgPSBoZWFkZXI7CisJCQl3aGlsZSAoKHAgPSBzdHJjaHIocCwgJ1xuJykpICE9IE5VTEwpIHsKKwkJCQlwKys7CisJCQkJaWYgKHN0cm5jYXNlY21wKHAsICJDb250ZW50LVR5cGU6Iiwgc2l6ZW9mKCJDb250ZW50LVR5cGU6IiktMSkgPT0gMCkKKwkJCQkJcyA9IHA7CisJCQl9CisJCQlkYmdfZXJyb3JfbXNnKCJMOiclcyciLCBwKTsKKwkJCW50b2tlbnMgPSAwOworCQkJcyA9IHN0cnRvayhzLCBkZWxpbXMpOworCQkJd2hpbGUgKHMpIHsKKwkJCQl0b2tlbnNbbnRva2Vuc10gPSBzOworCQkJCWlmIChudG9rZW5zIDwgQVJSQVlfU0laRSh0b2tlbnMpIC0gMSkKKwkJCQkJbnRva2VucysrOworCQkJCWRiZ19lcnJvcl9tc2coIkxbJWRdPSclcyciLCBudG9rZW5zLCBzKTsKKwkJCQlzID0gc3RydG9rKE5VTEwsIGRlbGltcyk7CisJCQl9CisJCQl0b2tlbnNbbnRva2Vuc10gPSBOVUxMOworCQkJZGJnX2Vycm9yX21zZygiRU1QVFlMSU5FLCBudG9rZW5zOiVkIiwgbnRva2Vucyk7CisJCQlpZiAobnRva2VucyA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogSXMgaXQgbXVsdGlwYXJ0PyAqLworCQl0eXBlID0gZmluZF90b2tlbih0b2tlbnMsICJDb250ZW50LVR5cGU6IiwgInRleHQvcGxhaW4iKTsKKwkJZGJnX2Vycm9yX21zZygiVFlQRTonJXMnIiwgdHlwZSk7CisJCWlmICgwID09IHN0cm5jYXNlY21wKHR5cGUsICJtdWx0aXBhcnQvIiwgMTApKSB7CisJCQkvKiBZZXMsIHJlY3Vyc2UgKi8KKwkJCWlmIChzdHJjYXNlY21wKHR5cGUgKyAxMCwgIm1peGVkIikgIT0gMCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gc3VwcG9ydCBvZiBjb250ZW50IHR5cGUgJyVzJyIsIHR5cGUpOworCQkJcGFyc2UoeGZpbmRfdG9rZW4odG9rZW5zLCAiYm91bmRhcnkiKSwgYXJndik7CisKKwkJfSBlbHNlIHsKKwkJCS8qIE5vLCBwcm9jZXNzIG9uZSBub24tbXVsdGlwYXJ0IHNlY3Rpb24gKi8KKwkJCWNoYXIgKmVuZDsKKwkJCXBpZF90IHBpZCA9IHBpZDsKKwkJCUZJTEUgKmZwOworCisJCQljb25zdCBjaGFyICpjaGFyc2V0ID0gZmluZF90b2tlbih0b2tlbnMsICJjaGFyc2V0IiwgQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUKTsKKwkJCWNvbnN0IGNoYXIgKmVuY29kaW5nID0gZmluZF90b2tlbih0b2tlbnMsICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiIsICI3Yml0Iik7CisKKwkJCS8qIENvbXBvc2UgdGFyZ2V0IGZpbGVuYW1lICovCisJCQljaGFyICpmaWxlbmFtZSA9IChjaGFyICopZmluZF90b2tlbih0b2tlbnMsICJmaWxlbmFtZSIsIE5VTEwpOworCQkJaWYgKCFmaWxlbmFtZSkKKwkJCQlmaWxlbmFtZSA9IHhhc3ByaW50Zih1bmlxLCBtb25vdG9uaWNfdXMoKSk7CisJCQllbHNlCisJCQkJZmlsZW5hbWUgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcCh4c3RyZHVwKGZpbGVuYW1lKSk7CisKKwkJCWlmIChvcHRzICYgT1BUX1gpIHsKKwkJCQlpbnQgZmRbMl07CisKKwkJCQkvKiBzdGFydCBleHRlcm5hbCBoZWxwZXIgKi8KKwkJCQl4cGlwZShmZCk7CisJCQkJcGlkID0gdmZvcmsoKTsKKwkJCQlpZiAoMCA9PSBwaWQpIHsKKwkJCQkJLyogY2hpbGQgcmVhZHMgZnJvbSBmZFswXSAqLworCQkJCQljbG9zZShmZFsxXSk7CisJCQkJCXhtb3ZlX2ZkKGZkWzBdLCBTVERJTl9GSUxFTk8pOworCQkJCQl4c2V0ZW52KCJDT05URU5UX1RZUEUiLCB0eXBlKTsKKwkJCQkJeHNldGVudigiQ0hBUlNFVCIsIGNoYXJzZXQpOworCQkJCQl4c2V0ZW52KCJFTkNPRElORyIsIGVuY29kaW5nKTsKKwkJCQkJeHNldGVudigiRklMRU5BTUUiLCBmaWxlbmFtZSk7CisJCQkJCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisJCQkJfQorCQkJCS8qIHBhcmVudCB3aWxsIHdyaXRlIHRvIGZkWzFdICovCisJCQkJY2xvc2UoZmRbMF0pOworCQkJCWZwID0geGZkb3Blbl9mb3Jfd3JpdGUoZmRbMV0pOworCQkJCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogd3JpdGUgdG8gZmlsZSAqLworCQkJCWNoYXIgKmZuYW1lID0geGFzcHJpbnRmKCIlcyVzIiwgKmFyZ3YsIGZpbGVuYW1lKTsKKwkJCQlmcCA9IHhmb3Blbl9mb3Jfd3JpdGUoZm5hbWUpOworCQkJCWZyZWUoZm5hbWUpOworCQkJfQorCQkJZnJlZShmaWxlbmFtZSk7CisKKwkJCS8qIHdyaXRlIHRvIGZwICovCisJCQllbmQgPSBOVUxMOworCQkJaWYgKDAgPT0gc3RyY2FzZWNtcChlbmNvZGluZywgImJhc2U2NCIpKSB7CisJCQkJcmVhZF9iYXNlNjQoc3RkaW4sIGZwLCAnLScpOworCQkJfSBlbHNlCisJCQlpZiAoMCAhPSBzdHJjYXNlY21wKGVuY29kaW5nLCAiN2JpdCIpCisJCQkgJiYgMCAhPSBzdHJjYXNlY21wKGVuY29kaW5nLCAiOGJpdCIpCisJCQkpIHsKKwkJCQkvKiBxdW90ZWQtcHJpbnRhYmxlLCBiaW5hcnksIHVzZXItZGVmaW5lZCBhcmUgdW5zdXBwb3J0ZWQgc28gZmFyICovCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVuY29kaW5nICclcycgbm90IHN1cHBvcnRlZCIsIGVuY29kaW5nKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogcGxhaW4gN2JpdCBvciA4Yml0ICovCisJCQkJd2hpbGUgKChlbmQgPSB4bWFsbG9jX2ZnZXRzKHN0ZGluKSkgIT0gTlVMTCkgeworCQkJCQlpZiAoJy0nID09IGVuZFswXQorCQkJCQkgJiYgJy0nID09IGVuZFsxXQorCQkJCQkgJiYgc3RybmNtcChlbmQgKyAyLCBib3VuZGFyeSwgYm91bmRhcnlfbGVuKSA9PSAwCisJCQkJCSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZnB1dHMoZW5kLCBmcCk7CisJCQkJfQorCQkJfQorCQkJZmNsb3NlKGZwKTsKKworCQkJLyogV2FpdCBmb3IgY2hpbGQgKi8KKwkJCWlmIChvcHRzICYgT1BUX1gpIHsKKwkJCQlpbnQgcmM7CisJCQkJc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworCQkJCXJjID0gKHdhaXQ0cGlkKHBpZCkgJiAweGZmKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJcmV0dXJuIHJjICsgMjA7CisJCQl9CisKKwkJCS8qIE11bHRpcGFydCBlbmRlZD8gKi8KKwkJCWlmIChlbmQgJiYgJy0nID09IGVuZFsyICsgYm91bmRhcnlfbGVuXSAmJiAnLScgPT0gZW5kWzIgKyBib3VuZGFyeV9sZW4gKyAxXSkgeworCQkJCWRiZ19lcnJvcl9tc2coIkZJTklTSEVEIE1QQVJUOiclcyciLCBlbmQpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGJnX2Vycm9yX21zZygiRklOSVNIRUQ6JyVzJyIsIGVuZCk7CisJCQlmcmVlKGVuZCk7CisJCX0gLyogZW5kIG9mICJoYW5kbGUgb25lIG5vbi1tdWx0aXBhcnQgYmxvY2siICovCisKKwkJZnJlZShoZWFkZXIpOworCX0gLyogd2hpbGUgKDEpICovCisKKwlkYmdfZXJyb3JfbXNnKCJFTkRQQVJTRVslc10iLCBib3VuZGFyeSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisvL3VzYWdlOiNkZWZpbmUgcmVmb3JtaW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10iCisvL3VzYWdlOiNkZWZpbmUgcmVmb3JtaW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUGFyc2UgTUlNRS1lbmNvZGVkIG1lc3NhZ2Ugb24gc3RkaW5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXggUFJFRklYCUV4dHJhY3QgY29udGVudCBvZiBNSU1FIHNlY3Rpb25zIHRvIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktWCBQUk9HIEFSR1MJRmlsdGVyIGNvbnRlbnQgb2YgTUlNRSBzZWN0aW9ucyB0aHJvdWdoIFBST0ciCisvL3VzYWdlOiAgICAgIlxuCQkJTXVzdCBiZSB0aGUgbGFzdCBvcHRpb24iCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk90aGVyIG9wdGlvbnMgYXJlIHNpbGVudGx5IGlnbm9yZWQiCisKKy8qCitVc2FnZTogcmVmb3JtaW1lIFtvcHRpb25zXQorICAgIC1kIC0gcGFyc2UgYSBkZWxpdmVyeSBzdGF0dXMgbm90aWZpY2F0aW9uLgorICAgIC1lIC0gZXh0cmFjdCBjb250ZW50cyBvZiBNSU1FIHNlY3Rpb24uCisgICAgLXggLSBleHRyYWN0IE1JTUUgc2VjdGlvbiB0byBhIGZpbGUuCisgICAgLVggLSBwaXBlIE1JTUUgc2VjdGlvbiB0byBhIHByb2dyYW0uCisgICAgLWkgLSBzaG93IE1JTUUgaW5mby4KKyAgICAtcyBuLm4ubi5uIC0gc3BlY2lmeSBNSU1FIHNlY3Rpb24uCisgICAgLXIgLSByZXdyaXRlIG1lc3NhZ2UsIGZpbGxpbmcgaW4gbWlzc2luZyBNSU1FIGhlYWRlcnMuCisgICAgLXI3IC0gYWxzbyBjb252ZXJ0IDhiaXQvcmF3IGVuY29kaW5nIHRvIHF1b3RlZC1wcmludGFibGUsIGlmIHBvc3NpYmxlLgorICAgIC1yOCAtIGFsc28gY29udmVydCBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHRvIDhiaXQsIGlmIHBvc3NpYmxlLgorICAgIC1jIGNoYXJzZXQgLSBkZWZhdWx0IGNoYXJzZXQgZm9yIHJld3JpdGluZywgLW8sIGFuZCAtTy4KKyAgICAtbSBbZmlsZV0gW2ZpbGVdLi4uIC0gY3JlYXRlIGEgTUlNRSBtZXNzYWdlIGRpZ2VzdC4KKyAgICAtaCAiaGVhZGVyIiAtIGRlY29kZSBSRkMgMjA0Ny1lbmNvZGVkIGhlYWRlci4KKyAgICAtbyAiaGVhZGVyIiAtIGVuY29kZSB1bnN0cnVjdHVyZWQgaGVhZGVyIHVzaW5nIFJGQyAyMDQ3LgorICAgIC1PICJoZWFkZXIiIC0gZW5jb2RlIGFkZHJlc3MgbGlzdCBoZWFkZXIgdXNpbmcgUkZDIDIwNDcuCisqLworCitpbnQgcmVmb3JtaW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZWZvcm1pbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKm9wdF9wcmVmaXggPSAiIjsKKworCUlOSVRfRygpOworCisJLy8gcGFyc2Ugb3B0aW9ucworCS8vIE4uQi4gb25seSAteCBhbmQgLVggYXJlIHN1cHBvcnRlZCBzbyBmYXIKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ4LS1YOlgtLXgiIElGX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCgiOm06OiIpOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LAorCQkieDpYIiBJRl9GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQoImRlaXM6cjpjOm06aDpvOk86IiksCisJCSZvcHRfcHJlZml4CisJCUlGX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCgsIE5VTEwsIE5VTEwsICZHLm9wdF9jaGFyc2V0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKQorCSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlyZXR1cm4gcGFyc2UoIiIsIChvcHRzICYgT1BUX1gpID8gYXJndiA6IChjaGFyICoqKSZvcHRfcHJlZml4KTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9zZW5kbWFpbC5jIGIvYnVzeWJveC0xLjE5LjMvbWFpbHV0aWxzL3NlbmRtYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhZmYyMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21haWx1dGlscy9zZW5kbWFpbC5jCkBAIC0wLDAgKzEsMzQyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYXJlIGJvbmVzIHNlbmRtYWlsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19TRU5ETUFJTCkgKz0gc2VuZG1haWwubyBtYWlsLm8KKworLy91c2FnZTojZGVmaW5lIHNlbmRtYWlsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW1JFQ0lQSUVOVF9FTUFJTF0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc2VuZG1haWxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZWFkIGVtYWlsIGZyb20gc3RkaW4gYW5kIHNlbmQgaXRcbiIKKy8vdXNhZ2U6ICAgICAiXG5TdGFuZGFyZCBvcHRpb25zOiIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJCVJlYWQgYWRkaXRpb25hbCByZWNpcGllbnRzIGZyb20gbWVzc2FnZSBib2R5IgorLy91c2FnZTogICAgICJcbgktZiBTRU5ERVIJU2VuZGVyIChyZXF1aXJlZCkiCisvL3VzYWdlOiAgICAgIlxuCS1vIE9QVElPTlMJVmFyaW91cyBvcHRpb25zLiAtb2kgaW1wbGllZCwgb3RoZXJzIGFyZSBpZ25vcmVkIgorLy91c2FnZTogICAgICJcbgktaQkJLW9pIHN5bm9ueW0uIGltcGxpZWQgYW5kIGlnbm9yZWQiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbkJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoiCisvL3VzYWdlOiAgICAgIlxuCS12CQlWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdyBTRUNTCQlOZXR3b3JrIHRpbWVvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1IICdQUk9HIEFSR1MnCVJ1biBjb25uZWN0aW9uIGhlbHBlciIKKy8vdXNhZ2U6ICAgICAiXG4JCQlFeGFtcGxlczoiCisvL3VzYWdlOiAgICAgIlxuCQkJLUggJ2V4ZWMgb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLXRsczEgLXN0YXJ0dGxzIHNtdHAiCisvL3VzYWdlOiAgICAgIlxuCQkJCS1jb25uZWN0IHNtdHAuZ21haWwuY29tOjI1JyA8ZW1haWwudHh0IgorLy91c2FnZTogICAgICJcbgkJCQlbNDx1c2VybmFtZV9hbmRfcGFzc3dkLnR4dCB8IC1hdTx1c2VybmFtZT4gLWFwPHBhc3N3b3JkPl0iCisvL3VzYWdlOiAgICAgIlxuCQkJLUggJ2V4ZWMgb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLXRsczEiCisvL3VzYWdlOiAgICAgIlxuCQkJCS1jb25uZWN0IHNtdHAuZ21haWwuY29tOjQ2NScgPGVtYWlsLnR4dCIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJWzQ8dXNlcm5hbWVfYW5kX3Bhc3N3ZC50eHQgfCAtYXU8dXNlcm5hbWU+IC1hcDxwYXNzd29yZD5dIgorLy91c2FnZTogICAgICJcbgktUyBIT1NUWzpQT1JUXQlTZXJ2ZXIiCisvL3VzYWdlOiAgICAgIlxuCS1hdTx1c2VybmFtZT4JVXNlcm5hbWUgZm9yIEFVVEggTE9HSU4iCisvL3VzYWdlOiAgICAgIlxuCS1hcDxwYXNzd29yZD4JUGFzc3dvcmQgZm9yIEFVVEggTE9HSU4iCisvL3VzYWdlOiAgICAgIlxuCS1hbTxtZXRob2Q+CUF1dGhlbnRpY2F0aW9uIG1ldGhvZC4gSWdub3JlZC4gTE9HSU4gaXMgaW1wbGllZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuT3RoZXIgb3B0aW9ucyBhcmUgc2lsZW50bHkgaWdub3JlZDsgLW9pIC10IGlzIGltcGxpZWQiCisvL3VzYWdlOglJRl9NQUtFTUlNRSgKKy8vdXNhZ2U6ICAgICAiXG5Vc2UgbWFrZW1pbWUgYXBwbGV0IHRvIGNyZWF0ZSBtZXNzYWdlIHdpdGggYXR0YWNobWVudHMiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1haWwuaCIKKworLy8gbGltaXQgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBoZWFkZXJzIHRvIHByZXZlbnQgb3ZlcmZsb3dzLgorLy8gc2V0IHRvIDAgdG8gbm90IGxpbWl0CisjZGVmaW5lIE1BWF9IRUFERVJTIDI1NgorCitzdGF0aWMgdm9pZCBzZW5kX3Jfbihjb25zdCBjaGFyICpzKQoreworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coInNlbmQ6JyVzJyIsIHMpOworCXByaW50ZigiJXNcclxuIiwgcyk7Cit9CisKK3N0YXRpYyBpbnQgc210cF9jaGVja3AoY29uc3QgY2hhciAqZm10LCBjb25zdCBjaGFyICpwYXJhbSwgaW50IGNvZGUpCit7CisJY2hhciAqYW5zd2VyOworCWNoYXIgKm1zZyA9IHNlbmRfbWFpbF9jb21tYW5kKGZtdCwgcGFyYW0pOworCS8vIHJlYWQgc3RkaW4KKwkvLyBpZiB0aGUgc3RyaW5nIGhhcyBhIGZvcm0gTk5OLSAtLSByZWFkIG5leHQgc3RyaW5nLiBFLmcuIEVITE8gcmVzcG9uc2UKKwkvLyBwYXJzZSBmaXJzdCBieXRlcyB0byBhIG51bWJlcgorCS8vIGlmIGNvZGUgPSAtMSB0aGVuIGp1c3QgcmV0dXJuIHRoaXMgbnVtYmVyCisJLy8gaWYgY29kZSAhPSAtMSB0aGVuIGNoZWNrcyB3aGV0aGVyIHRoZSBudW1iZXIgZXF1YWxzIHRoZSBjb2RlCisJLy8gaWYgbm90IGVxdWFsIC0+IGRpZSBzYXlpbmcgbXNnCisJd2hpbGUgKChhbnN3ZXIgPSB4bWFsbG9jX2ZnZXRsaW5lKHN0ZGluKSkgIT0gTlVMTCkgeworCQlpZiAodmVyYm9zZSkKKwkJCWJiX2Vycm9yX21zZygicmVjdjonJS4qcycgJWQiLCAoaW50KShzdHJjaHJudWwoYW5zd2VyLCAnXHInKSAtIGFuc3dlciksIGFuc3dlciwgdmVyYm9zZSk7CisJCWlmIChzdHJsZW4oYW5zd2VyKSA8PSAzIHx8ICctJyAhPSBhbnN3ZXJbM10pCisJCQlicmVhazsKKwkJZnJlZShhbnN3ZXIpOworCX0KKwlpZiAoYW5zd2VyKSB7CisJCWludCBuID0gYXRvaShhbnN3ZXIpOworCQlpZiAodGltZW91dCkKKwkJCWFsYXJtKDApOworCQlmcmVlKG1zZyk7CisJCWZyZWUoYW5zd2VyKTsKKwkJaWYgKC0xID09IGNvZGUgfHwgbiA9PSBjb2RlKQorCQkJcmV0dXJuIG47CisJfQorCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBmYWlsZWQiLCBtc2cpOworfQorCitzdGF0aWMgaW50IHNtdHBfY2hlY2soY29uc3QgY2hhciAqZm10LCBpbnQgY29kZSkKK3sKKwlyZXR1cm4gc210cF9jaGVja3AoZm10LCBOVUxMLCBjb2RlKTsKK30KKworLy8gc3RyaXAgYXJndW1lbnQgb2YgYmFkIGNoYXJzCitzdGF0aWMgY2hhciAqc2FuZV9hZGRyZXNzKGNoYXIgKnN0cikKK3sKKwljaGFyICpzID0gc3RyOworCWNoYXIgKnAgPSBzOworCXdoaWxlICgqcykgeworCQlpZiAoaXNhbG51bSgqcykgfHwgJ18nID09ICpzIHx8ICctJyA9PSAqcyB8fCAnLicgPT0gKnMgfHwgJ0AnID09ICpzKSB7CisJCQkqcCsrID0gKnM7CisJCX0KKwkJcysrOworCX0KKwkqcCA9ICdcMCc7CisJcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHZvaWQgcmNwdHRvKGNvbnN0IGNoYXIgKnMpCit7CisJLy8gTi5CLiB3ZSBkb24ndCBkaWUgaWYgcmVjaXBpZW50IGlzIHJlamVjdGVkLCBmb3IgdGhlIG90aGVyIHJlY2lwaWVudHMgbWF5IGJlIGFjY2VwdGVkCisJaWYgKDI1MCAhPSBzbXRwX2NoZWNrcCgiUkNQVCBUTzo8JXM+IiwgcywgLTEpKQorCQliYl9lcnJvcl9tc2coIkJhZCByZWNpcGllbnQ6IDwlcz4iLCBzKTsKK30KKworaW50IHNlbmRtYWlsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZW5kbWFpbF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqb3B0X2Nvbm5lY3QgPSBvcHRfY29ubmVjdDsKKwljaGFyICpvcHRfZnJvbTsKKwljaGFyICpzOworCWxsaXN0X3QgKmxpc3QgPSBOVUxMOworCWNoYXIgKmRvbWFpbiA9IHNhbmVfYWRkcmVzcyhzYWZlX2dldGRvbWFpbm5hbWUoKSk7CisJdW5zaWduZWQgbmhlYWRlcnMgPSAwOworCWludCBjb2RlOworCisJZW51bSB7CisJLy8tLS0gc3RhbmRhcmQgb3B0aW9ucworCQlPUFRfdCA9IDEgPDwgMCwgICAgICAgICAvLyByZWFkIG1lc3NhZ2UgZm9yIHJlY2lwaWVudHMsIGFwcGVuZCB0aGVtIHRvIHRob3NlIG9uIGNtZGxpbmUKKwkJT1BUX2YgPSAxIDw8IDEsICAgICAgICAgLy8gc2VuZGVyIGFkZHJlc3MKKwkJT1BUX28gPSAxIDw8IDIsICAgICAgICAgLy8gdmFyaW91cyBvcHRpb25zLiAtb2kgSU1QTElFRCEgb3RoZXJzIGFyZSBJR05PUkVEIQorCQlPUFRfaSA9IDEgPDwgMywgICAgICAgICAvLyBJTVBMSUVEIQorCS8vLS0tIEJCIHNwZWNpZmljIG9wdGlvbnMKKwkJT1BUX3cgPSAxIDw8IDQsICAgICAgICAgLy8gbmV0d29yayB0aW1lb3V0CisJCU9QVF9IID0gMSA8PCA1LCAgICAgICAgIC8vIHVzZSBleHRlcm5hbCBjb25uZWN0aW9uIGhlbHBlcgorCQlPUFRfUyA9IDEgPDwgNiwgICAgICAgICAvLyBzcGVjaWZ5IGNvbm5lY3Rpb24gc3RyaW5nCisJCU9QVF9hID0gMSA8PCA3LCAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHRva2VucworCQlPUFRfdiA9IDEgPDwgOCwgICAgICAgICAvLyB2ZXJib3NpdHkKKwl9OworCisJLy8gaW5pdCBnbG9iYWwgdmFyaWFibGVzCisJSU5JVF9HKCk7CisKKwkvLyBzYXZlIGluaXRpYWwgc3RkaW4gc2luY2UgYm9keSBpcyBwaXBlZCEKKwl4ZHVwMihTVERJTl9GSUxFTk8sIDMpOworCUcuZnAwID0geGZkb3Blbl9mb3JfcmVhZCgzKTsKKworCS8vIHBhcnNlIG9wdGlvbnMKKwkvLyAtdiBpcyBhIGNvdW50ZXIsIC1mIGlzIHJlcXVpcmVkLiAtSCBhbmQgLVMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgLWEgaXMgYSBsaXN0CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidnY6Zjp3KzpILS1TOlMtLUg6YTo6IjsKKwkvLyBOLkIuIHNpbmNlIC1IIGFuZCAtUyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIHRoZXkgZG8gbm90IGludGVyZmVyZSBpbiBvcHRfY29ubmVjdAorCS8vIC1hIGlzIGZvciBzc210cCAoaHR0cDovL2Rvd25sb2Fkcy5vcGVud3J0Lm9yZy9wZW9wbGUvbmljby9tYW4vbWFuOC9zc210cC44Lmh0bWwpIGNvbXBhdGliaWxpdHksCisJLy8gaXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQuCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJ0ZjpvOml3Okg6UzphOjp2IiwgJm9wdF9mcm9tLCBOVUxMLAorCQkJJnRpbWVvdXQsICZvcHRfY29ubmVjdCwgJm9wdF9jb25uZWN0LCAmbGlzdCwgJnZlcmJvc2UpOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvLyBwcm9jZXNzIC1hW3VwbV08dG9rZW4+IG9wdGlvbnMKKwlpZiAoKG9wdHMgJiBPUFRfYSkgJiYgIWxpc3QpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl3aGlsZSAobGlzdCkgeworCQljaGFyICphID0gKGNoYXIgKikgbGxpc3RfcG9wKCZsaXN0KTsKKwkJaWYgKCd1JyA9PSBhWzBdKQorCQkJRy51c2VyID0geHN0cmR1cChhKzEpOworCQlpZiAoJ3AnID09IGFbMF0pCisJCQlHLnBhc3MgPSB4c3RyZHVwKGErMSk7CisJCS8vIE4uQi4gd2Ugc3VwcG9ydCBvbmx5IEFVVEggTE9HSU4gc28gZmFyCisJCS8vaWYgKCdtJyA9PSBhWzBdKQorCQkvLwlHLm1ldGhvZCA9IHhzdHJkdXAoYSsxKTsKKwl9CisJLy8gTi5CLiBsaXN0ID09IE5VTEwgaGVyZQorCS8vYmJfaW5mb19tc2coIk9QVFsleF0gQVVbJXNdLCBBUFslc10sIEFNWyVzXSwgQVJHVlslc10iLCBvcHRzLCBhdSwgYXAsIGFtLCAqYXJndik7CisKKwkvLyBjb25uZWN0IHRvIHNlcnZlcgorCisJLy8gY29ubmVjdGlvbiBoZWxwZXIgb3JkZXJlZD8gLT4KKwlpZiAob3B0cyAmIE9QVF9IKSB7CisJCWNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsgInNoIiwgIi1jIiwgb3B0X2Nvbm5lY3QsIE5VTEwgfTsKKwkJLy8gcGx1ZyBpdCBpbgorCQlsYXVuY2hfaGVscGVyKGFyZ3MpOworCS8vIHZhbmlsbGEgY29ubmVjdGlvbgorCX0gZWxzZSB7CisJCWludCBmZDsKKwkJLy8gaG9zdFs6cG9ydF0gbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkPyAtPiB1c2UgJFNNVFBIT1NUCisJCS8vIG5vICRTTVRQSE9TVCA/IC0+IHVzZSBsb2NhbGhvc3QKKwkJaWYgKCEob3B0cyAmIE9QVF9TKSkgeworCQkJb3B0X2Nvbm5lY3QgPSBnZXRlbnYoIlNNVFBIT1NUIik7CisJCQlpZiAoIW9wdF9jb25uZWN0KQorCQkJCW9wdF9jb25uZWN0ID0gKGNoYXIgKikiMTI3LjAuMC4xIjsKKwkJfQorCQkvLyBkbyBjb25uZWN0CisJCWZkID0gY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUob3B0X2Nvbm5lY3QsIDI1KTsKKwkJLy8gYW5kIG1ha2Ugb3Vyc2VsdmVzIGEgc2ltcGxlIElPIGZpbHRlcgorCQl4bW92ZV9mZChmZCwgU1RESU5fRklMRU5PKTsKKwkJeGR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwl9CisJLy8gTi5CLiBmcm9tIG5vdyB3ZSBrbm93IG5vdGhpbmcgYWJvdXQgbmV0d29yayA6KQorCisJLy8gd2FpdCBmb3IgaW5pdGlhbCBzZXJ2ZXIgT0sKKwkvLyBOLkIuIGlmIHdlIHVzZWQgb3BlbnNzbCB0aGUgaW5pdGlhbCAyMjAgYW5zd2VyIGlzIGFscmVhZHkgc3dhbGxvd2VkIGR1cmluZyBvcGVuc3NsIFRMUyBpbml0IHByb2NlZHVyZQorCS8vIHNvIHdlIG5lZWQgdG8ga2ljayB0aGUgc2VydmVyIHRvIHNlZSB3aGV0aGVyIHdlIGFyZSBvaworCWNvZGUgPSBzbXRwX2NoZWNrKCJOT09QIiwgLTEpOworCS8vIDIyMCBvbiBwbGFpbiBjb25uZWN0aW9uLCAyNTAgb24gb3BlbnNzbC1oZWxwZWQgVExTIHNlc3Npb24KKwlpZiAoMjIwID09IGNvZGUpCisJCXNtdHBfY2hlY2soTlVMTCwgMjUwKTsgLy8gcmVyZWFkIHRoZSBjb2RlIHRvIHN0YXkgaW4gc3luYworCWVsc2UgaWYgKDI1MCAhPSBjb2RlKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiSU5JVCBmYWlsZWQiKTsKKworCS8vIHdlIHNob3VsZCBzdGFydCB3aXRoIG1vZGVybiBFSExPCisJaWYgKDI1MCAhPSBzbXRwX2NoZWNrcCgiRUhMTyAlcyIsIGRvbWFpbiwgLTEpKSB7CisJCXNtdHBfY2hlY2twKCJIRUxPICVzIiwgZG9tYWluLCAyNTApOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoZG9tYWluKTsKKworCS8vIHBlcmZvcm0gYXV0aGVudGljYXRpb24KKwlpZiAob3B0cyAmIE9QVF9hKSB7CisJCXNtdHBfY2hlY2soIkFVVEggTE9HSU4iLCAzMzQpOworCQkvLyB3ZSBtdXN0IHJlYWQgY3JlZGVudGlhbHMgdW5sZXNzIHRoZXkgYXJlIGdpdmVuIHZpYSAtYVt1cF0gb3B0aW9ucworCQlpZiAoIUcudXNlciB8fCAhRy5wYXNzKQorCQkJZ2V0X2NyZWRfb3JfZGllKDQpOworCQllbmNvZGVfYmFzZTY0KE5VTEwsIEcudXNlciwgTlVMTCk7CisJCXNtdHBfY2hlY2soIiIsIDMzNCk7CisJCWVuY29kZV9iYXNlNjQoTlVMTCwgRy5wYXNzLCBOVUxMKTsKKwkJc210cF9jaGVjaygiIiwgMjM1KTsKKwl9CisKKwkvLyBzZXQgc2VuZGVyCisJLy8gTi5CLiB3ZSBoYXZlIGhlcmUgYSB2ZXJ5IGxvb3NlbHkgZGVmaW5lZCBhbGdvdHl0aG0KKwkvLyBzaW5jZSBzZW5kbWFpbCBoaXN0b3JpY2FsbHkgb2ZmZXJzIG5vIG1lYW5zIHRvIHNwZWNpZnkgc2VjcmV0cyBvbiBjbWRsaW5lLgorCS8vIDEpIHNlcnZlciBjYW4gcmVxdWlyZSBubyBhdXRoZW50aWNhdGlvbiAtPgorCS8vCXdlIG11c3QganVzdCBwcm92aWRlIGEgKHBvc3NpYmx5IGZha2UpIHJlcGx5IGFkZHJlc3MuCisJLy8gMikgc2VydmVyIGNhbiByZXF1aXJlIEFVVEggLT4KKwkvLwl3ZSBtdXN0IHByb3ZpZGUgdmFsaWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFsb25nIHdpdGggYSAocG9zc2libHkgZmFrZSkgcmVwbHkgYWRkcmVzcy4KKwkvLwlGb3IgdGhlIHNha2Ugb2Ygc2VjdXJpdHkgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSB0byBiZSByZWFkIGVpdGhlciBmcm9tIGNvbnNvbGUgb3IgZnJvbSBhIHNlY3VyZWQgZmlsZS4KKwkvLwlTaW5jZSByZWFkaW5nIGZyb20gY29uc29sZSBtYXkgZGVmZWF0IHVzYWJpbGl0eSwgdGhlIHNvbHV0aW9uIGlzIGVpdGhlciB0byByZWFkIGZyb20gYSBwcmVkZWZpbmVkCisJLy8JZmlsZSBkZXNjcmlwdG9yIChlLmcuIDQpLCBvciBhZ2FpbiBmcm9tIGEgc2VjdXJlZCBmaWxlLgorCisJLy8gZ290IG5vIHNlbmRlciBhZGRyZXNzPyAtPiB1c2Ugc3lzdGVtIHVzZXJuYW1lIGFzIGEgcmVzb3J0CisJLy8gTi5CLiB3ZSBtYXJrZWQgLWYgYXMgcmVxdWlyZWQgb3B0aW9uIQorCS8vaWYgKCFHLnVzZXIpIHsKKwkvLwkvLyBOLkIuIElNSE8gZ2V0ZW52KCJVU0VSIikgY2FuIGJlIHdheSBlYXNpbHkgc3Bvb2ZlZCEKKwkvLwlHLnVzZXIgPSB4dWlkMnVuYW1lKGdldHVpZCgpKTsKKwkvLwlvcHRfZnJvbSA9IHhhc3ByaW50ZigiJXNAJXMiLCBHLnVzZXIsIGRvbWFpbik7CisJLy99CisJLy9pZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJLy8JZnJlZShkb21haW4pOworCXNtdHBfY2hlY2twKCJNQUlMIEZST006PCVzPiIsIG9wdF9mcm9tLCAyNTApOworCisJLy8gcHJvY2VzcyBtZXNzYWdlCisKKwkvLyByZWFkIHJlY2lwaWVudHMgZnJvbSBtZXNzYWdlIGFuZCBhZGQgdGhlbSB0byB0aG9zZSBnaXZlbiBvbiBjbWRsaW5lLgorCS8vIHRoaXMgbWVhbnMgd2Ugc2NhbiBzdGRpbiBmb3IgVG86LCBDYzosIEJjYzogbGluZXMgdW50aWwgYW4gZW1wdHkgbGluZQorCS8vIGFuZCB0aGVuIHVzZSB0aGUgcmVzdCBvZiBzdGRpbiBhcyBtZXNzYWdlIGJvZHkKKwljb2RlID0gMDsgLy8gc2V0ICJhbmFseXplIGhlYWRlcnMiIG1vZGUKKwl3aGlsZSAoKHMgPSB4bWFsbG9jX2ZnZXRsaW5lKEcuZnAwKSkgIT0gTlVMTCkgeworIGR1bXA6CisJCS8vIHB1dCBtZXNzYWdlIGxpbmVzIGRvdWJsaW5nIGxlYWRpbmcgZG90cworCQlpZiAoY29kZSkgeworCQkJLy8gZXNjYXBlIGxlYWRpbmcgZG90cworCQkJLy8gTi5CLiB0aGlzIGZlYXR1cmUgaXMgaW1wbGllZCBldmVuIGlmIG5vIC1pICgtb2kpIHN3aXRjaCBnaXZlbgorCQkJLy8gTi5CLiB3ZSBuZWVkIHRvIGVzY2FwZSB0aGUgbGVhZGluZyBkb3QgcmVnYXJkbGVzcyBvZgorCQkJLy8gd2hldGhlciBpdCBpcyBzaW5nbGUgb3Igbm90IGNoYXJhY3RlciBvbiB0aGUgbGluZQorCQkJaWYgKCcuJyA9PSBzWzBdIC8qJiYgJ1wwJyA9PSBzWzFdICovKQorCQkJCXByaW50ZigiLiIpOworCQkJLy8gZHVtcCByZWFkIGxpbmUKKwkJCXNlbmRfcl9uKHMpOworCQkJZnJlZShzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gYW5hbHl6ZSBoZWFkZXJzCisJCS8vIFRvOiBvciBDYzogaGVhZGVycyBhZGQgcmVjaXBpZW50cworCQlpZiAoMCA9PSBzdHJuY2FzZWNtcCgiVG86IiwgcywgMykgfHwgMCA9PSBzdHJuY2FzZWNtcCgiQmNjOiIgKyAxLCBzLCAzKSkgeworCQkJcmNwdHRvKHNhbmVfYWRkcmVzcyhzKzMpKTsKKwkJCWdvdG8gYWRkaGVhZGVyOworCQkvLyBCY2M6IGhlYWRlciBhZGRzIGJsaW5kIGNvcHkgKGhpZGRlbikgcmVjaXBpZW50CisJCX0gZWxzZSBpZiAoMCA9PSBzdHJuY2FzZWNtcCgiQmNjOiIsIHMsIDQpKSB7CisJCQlyY3B0dG8oc2FuZV9hZGRyZXNzKHMrNCkpOworCQkJZnJlZShzKTsKKwkJCS8vIE4uQi4gQmNjOiB2YW5pc2hlcyBmcm9tIGhlYWRlcnMhCisKKwkJLy8gb3RoZXIgaGVhZGVycyBnbyB2ZXJiYXRpbQorCisJCS8vIE4uQi4gUkZDMjgyMiAyLjIuMyAiTG9uZyBIZWFkZXIgRmllbGRzIiBhbGxvd3MgZm9yIGhlYWRlcnMgdG8gb2NjdXB5IHNldmVyYWwgbGluZXMuCisJCS8vIENvbnRpbnVhdGlvbiBpcyBkZW5vdGVkIGJ5IHByZWZpeGluZyBhZGRpdGlvbmFsIGxpbmVzIHdpdGggd2hpdGVzcGFjZShzKS4KKwkJLy8gVGhhbmtzIChzdGVmYW4uc2V5ZnJpZWQgYXQgZ29vZ2xlbWFpbC5jb20pIGZvciBwb2ludGluZyB0aGlzIG91dC4KKwkJfSBlbHNlIGlmIChzdHJjaHIocywgJzonKSB8fCAobGlzdCAmJiBza2lwX3doaXRlc3BhY2UocykgIT0gcykpIHsKKyBhZGRoZWFkZXI6CisJCQkvLyBOLkIuIHdlIGFsbG93IE1BWF9IRUFERVJTIGdlbmVyaWMgaGVhZGVycyBhdCBtb3N0IHRvIHByZXZlbnQgYXR0YWNrcworCQkJaWYgKE1BWF9IRUFERVJTICYmICsrbmhlYWRlcnMgPj0gTUFYX0hFQURFUlMpCisJCQkJZ290byBiYWlsOworCQkJbGxpc3RfYWRkX3RvX2VuZCgmbGlzdCwgcyk7CisJCS8vIGEgbGluZSB3aXRob3V0ICI6IiAoYW4gZW1wdHkgbGluZSB0b28sIGJ5IGRlZmluaXRpb24pIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgaGVhZGVyCisJCS8vIHNvIHN0b3AgImFuYWx5emUgaGVhZGVycyIgbW9kZQorCQl9IGVsc2UgeworIHJlZW50ZXI6CisJCQkvLyBwdXQgcmVjaXBpZW50cyBzcGVjaWZpZWQgb24gY21kbGluZQorCQkJd2hpbGUgKCphcmd2KSB7CisJCQkJY2hhciAqdCA9IHNhbmVfYWRkcmVzcygqYXJndik7CisJCQkJcmNwdHRvKHQpOworCQkJCS8vaWYgKE1BWF9IRUFERVJTICYmICsrbmhlYWRlcnMgPj0gTUFYX0hFQURFUlMpCisJCQkJLy8JZ290byBiYWlsOworCQkJCWxsaXN0X2FkZF90b19lbmQoJmxpc3QsIHhhc3ByaW50ZigiVG86ICVzIiwgdCkpOworCQkJCWFyZ3YrKzsKKwkJCX0KKwkJCS8vIGVudGVyICJwdXQgbWVzc2FnZSIgbW9kZQorCQkJLy8gTi5CLiBEQVRBIGZhaWxzIGlmZiBubyByZWNpcGllbnRzIHdlcmUgYWNjZXB0ZWQgKG9yIGV2ZW4gcHJvdmlkZWQpCisJCQkvLyBpbiB0aGlzIGNhc2UganVzdCBiYWlsIG91dCBncmFjZWZ1bGx5CisJCQlpZiAoMzU0ICE9IHNtdHBfY2hlY2soIkRBVEEiLCAtMSkpCisJCQkJZ290byBiYWlsOworCQkJLy8gZHVtcCB0aGUgaGVhZGVycworCQkJd2hpbGUgKGxpc3QpIHsKKwkJCQlzZW5kX3JfbigoY2hhciAqKSBsbGlzdF9wb3AoJmxpc3QpKTsKKwkJCX0KKwkJCS8vIHN0b3AgYW5hbHl6aW5nIGhlYWRlcnMKKwkJCWNvZGUrKzsKKwkJCS8vIE4uQi4gIXMgbWVhbnM6IHdlIHJlYWQgbm90aGluZywgYW5kIG5vdGhpbmcgdG8gYmUgcmVhZCBpbiB0aGUgZnV0dXJlLgorCQkJLy8ganVzdCBkdW1wIGVtcHR5IGxpbmUgYW5kIGJyZWFrIHRoZSBsb29wCisJCQlpZiAoIXMpIHsKKwkJCQlzZW5kX3JfbigiIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBnbyBkdW1wIG1lc3NhZ2UgYm9keQorCQkJLy8gTi5CLiAicyIgYWxyZWFkeSBjb250YWlucyB0aGUgZmlyc3Qgbm9uLWhlYWRlciBsaW5lLCBzbyBwcmV0ZW5kIHdlIHJlYWQgaXQgZnJvbSBpbnB1dAorCQkJZ290byBkdW1wOworCQl9CisJfQorCS8vIG9kZCBjYXNlOiB3ZSBkaWRuJ3Qgc3RvcCAiYW5hbHl6ZSBoZWFkZXJzIiBtb2RlIC0+IG1lc3NhZ2UgYm9keSBpcyBlbXB0eS4gUmVlbnRlciB0aGUgbG9vcAorCS8vIE4uQi4gYWZ0ZXIgcmVlbnRlciBjb2RlIHdpbGwgYmUgPiAwCisJaWYgKCFjb2RlKQorCQlnb3RvIHJlZW50ZXI7CisKKwkvLyBmaW5hbGl6ZSB0aGUgbWVzc2FnZQorCXNtdHBfY2hlY2soIi4iLCAyNTApOworIGJhaWw6CisJLy8gLi4uIGFuZCBzYXkgZ29vZGJ5ZQorCXNtdHBfY2hlY2soIlFVSVQiLCAyMjEpOworCS8vIGNsZWFudXAKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZjbG9zZShHLmZwMCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWZjMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSw2MTMgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIk1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIEFESlRJTUVYCisJYm9vbCAiYWRqdGltZXgiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQWRqdGltZXggcmVhZHMgYW5kIG9wdGlvbmFsbHkgc2V0cyBhZGp1c3RtZW50IHBhcmFtZXRlcnMgZm9yCisJICB0aGUgTGludXggY2xvY2sgYWRqdXN0bWVudCBhbGdvcml0aG0uCisKK2NvbmZpZyBCQkNPTkZJRworCWJvb2wgImJiY29uZmlnIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoZSBiYmNvbmZpZyBhcHBsZXQgd2lsbCBwcmludCB0aGUgY29uZmlnIGZpbGUgd2l0aCB3aGljaAorCSAgYnVzeWJveCB3YXMgYnVpbHQuCisKK2NvbmZpZyBGRUFUVVJFX0NPTVBSRVNTX0JCQ09ORklHCisJYm9vbCAiQ29tcHJlc3MgYmJjb25maWcgZGF0YSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJCQ09ORklHCisJaGVscAorCSAgU3RvcmUgYmJjb25maWcgZGF0YSBpbiBjb21wcmVzc2VkIGZvcm0sIHVuY29tcHJlc3MgdGhlbSBvbi10aGUtZmx5CisJICBiZWZvcmUgb3V0cHV0LgorCisJICBJZiB5b3UgaGF2ZSBhIHJlYWxseSB0aW55IGJ1c3lib3ggd2l0aCBmZXcgYXBwbGV0cyBlbmFibGVkIChhbmQKKwkgIGJ1bnppcDIgaXNuJ3Qgb25lIG9mIHRoZW0pLCB0aGUgb3ZlcmhlYWQgb2YgdGhlIGRlY29tcHJlc3NvciBtaWdodAorCSAgYmUgbm90aWNlYWJsZS4gQWxzbywgaWYgeW91IHJ1biBleGVjdXRhYmxlcyBkaXJlY3RseSBmcm9tIFJPTQorCSAgYW5kIGhhdmUgdmVyeSBsaXR0bGUgbWVtb3J5LCB0aGlzIG1pZ2h0IG5vdCBiZSBhIHdpbi4gT3RoZXJ3aXNlLAorCSAgeW91IHByb2JhYmx5IHdhbnQgdGhpcy4KKworY29uZmlnIEJFRVAKKwlib29sICJiZWVwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBiZWVwIGFwcGxldHMgYmVlcHMgaW4gYSBnaXZlbiBmcmVxL0h6LgorCitjb25maWcgRkVBVFVSRV9CRUVQX0ZSRVEKKwlpbnQgImRlZmF1bHQgZnJlcXVlbmN5IgorCXJhbmdlIDAgMjE0NzQ4MzY0NworCWRlZmF1bHQgNDAwMAorCWRlcGVuZHMgb24gQkVFUAorCWhlbHAKKwkgIEZyZXF1ZW5jeSBmb3IgZGVmYXVsdCBiZWVwLgorCitjb25maWcgRkVBVFVSRV9CRUVQX0xFTkdUSF9NUworCWludCAiZGVmYXVsdCBsZW5ndGgiCisJcmFuZ2UgMCAyMTQ3NDgzNjQ3CisJZGVmYXVsdCAzMAorCWRlcGVuZHMgb24gQkVFUAorCWhlbHAKKwkgIExlbmd0aCBpbiBtcyBmb3IgZGVmYXVsdCBiZWVwLgorCitjb25maWcgQ0hBVAorCWJvb2wgImNoYXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2ltcGxlIGNoYXQgdXRpbGl0eS4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9OT0ZBSUwKKwlib29sICJFbmFibGUgTk9GQUlMIGV4cGVjdCBzdHJpbmdzIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFdoZW4gZW5hYmxlZCBleHBlY3Qgc3RyaW5ncyB3aGljaCBhcmUgc3RhcnRlZCB3aXRoIGEgZGFzaCB0cmlnZ2VyCisJICBuby1mYWlsIG1vZGUuIFRoYXQgaXMgd2hlbiBleHBlY3RhdGlvbiBpcyBub3QgbWV0IHdpdGhpbiB0aW1lb3V0CisJICB0aGUgc2NyaXB0IGlzIG5vdCB0ZXJtaW5hdGVkIGJ1dCBzZW5kcyBuZXh0IFNFTkQgc3RyaW5nIGFuZCB3YWl0cworCSAgZm9yIG5leHQgRVhQRUNUIHN0cmluZy4gVGhpcyBhbGxvd3MgdG8gY29tcG9zZSBmYXIgbW9yZSBmbGV4aWJsZQorCSAgc2NyaXB0cy4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9UVFlfSElGSQorCWJvb2wgIkZvcmNlIFNURElOIHRvIGJlIGEgVFRZIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIE9yaWdpbmFsIGNoYXQgYWx3YXlzIHRyZWF0cyBTVERJTiBhcyBhIFRUWSBkZXZpY2UgYW5kIHNldHMgZm9yIGl0CisJICBzby1jYWxsZWQgcmF3IG1vZGUuIFRoaXMgb3B0aW9uIHR1cm5zIG9uIHN1Y2ggYmVoYXZpb3VyLgorCitjb25maWcgRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSCisJYm9vbCAiRW5hYmxlIGltcGxpY2l0IENhcnJpYWdlIFJldHVybiIKKwlkZXBlbmRzIG9uIENIQVQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaGVuIGVuYWJsZWQgbWFrZSBjaGF0IHRvIHRlcm1pbmF0ZSBhbGwgU0VORCBzdHJpbmdzIHdpdGggYSAiXHIiCisJICB1bmxlc3MgIlxjIiBpcyBtZXQgYW55d2hlcmUgaW4gdGhlIHN0cmluZy4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFMKKwlib29sICJTd2FsbG93IG9wdGlvbnMiCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgQnVzeWJveCBjaGF0IHJlcXVpcmUgbm8gb3B0aW9ucy4gVG8gbWFrZSBpdCBub3QgZmFpbCB3aGVuIHVzZWQKKwkgIGluIHBsYWNlIG9mIG9yaWdpbmFsIGNoYXQgKHdoaWNoIGhhcyBhIGJ1bmNoIG9mIG9wdGlvbnMpIHR1cm4KKwkgIHRoaXMgb24uCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTCisJYm9vbCAiU3VwcG9ydCB3ZWlyZCBTRU5EIGVzY2FwZXMiCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgT3JpZ2luYWwgY2hhdCB1c2VzIHNvbWUgZXNjYXBlIHNlcXVlbmNlcyBpbiBTRU5EIGFyZ3VtZW50cyB3aGljaAorCSAgYXJlIG5vdCBzZW50IHRvIGRldmljZSBidXQgcmF0aGVyIHBlcmZvcm1zIHNwZWNpYWwgYWN0aW9ucy4KKwkgIEUuZy4gIlxLIiBtZWFucyB0byBzZW5kIGEgYnJlYWsgc2VxdWVuY2UgdG8gZGV2aWNlLgorCSAgIlxkIiBkZWxheXMgZXhlY3V0aW9uIGZvciBhIHNlY29uZCwgIlxwIiAtLSBmb3IgYSAxLzEwMCBvZiBzZWNvbmQuCisJICBCZWZvcmUgdHVybmluZyB0aGlzIG9wdGlvbiBvbiB0aGluayB0d2ljZTogZG8geW91IHJlYWxseSBuZWVkIHRoZW0/CisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTgorCWJvb2wgIlN1cHBvcnQgdmFyaWFibGUtbGVuZ3RoIEFCT1JUIGNvbmRpdGlvbnMiCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgT3JpZ2luYWwgY2hhdCB1c2VzIGZpeGVkIDUwLWJ5dGVzIGxlbmd0aCBBQk9SVCBjb25kaXRpb25zLiBTYXkgTiBoZXJlLgorCitjb25maWcgRkVBVFVSRV9DSEFUX0NMUl9BQk9SVAorCWJvb2wgIlN1cHBvcnQgcmV2b2tpbmcgb2YgQUJPUlQgY29uZGl0aW9ucyIKKwlkZXBlbmRzIG9uIENIQVQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTdXBwb3J0IENMUl9BQk9SVCBkaXJlY3RpdmUuCisKK2NvbmZpZyBDSFJUCisJYm9vbCAiY2hydCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtYW5pcHVsYXRlIHJlYWwtdGltZSBhdHRyaWJ1dGVzIG9mIGEgcHJvY2Vzcy4KKwkgIFRoaXMgcmVxdWlyZXMgc2NoZWRfe2csc31ldHBhcmFtIHN1cHBvcnQgaW4geW91ciBsaWJjLgorCitjb25maWcgQ1JPTkQKKwlib29sICJjcm9uZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBDcm9uZCBpcyBhIGJhY2tncm91bmQgZGFlbW9uIHRoYXQgcGFyc2VzIGluZGl2aWR1YWwgY3JvbnRhYgorCSAgZmlsZXMgYW5kIGV4ZWN1dGVzIGNvbW1hbmRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlcnMgaW4gcXVlc3Rpb24uCisJICBUaGlzIGlzIGEgcG9ydCBvZiBkY3JvbiBmcm9tIHNsYWNrd2FyZS4gSXQgdXNlcyBmaWxlcyBvZiB0aGUKKwkgIGZvcm1hdCAvdmFyL3Nwb29sL2Nyb24vY3JvbnRhYnMvPHVzZXJuYW1lPiBmaWxlcywgZm9yIGV4YW1wbGU6CisJICAgICAgJCBjYXQgL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzL3Jvb3QKKwkgICAgICAjIFJ1biBkYWlseSBjcm9uIGpvYnMgYXQgNDo0MCBldmVyeSBkYXk6CisJICAgICAgNDAgNCAqICogKiAvZXRjL2Nyb24vZGFpbHkgPiAvZGV2L251bGwgMj4mMQorCitjb25maWcgRkVBVFVSRV9DUk9ORF9ECisJYm9vbCAiU3VwcG9ydCBvcHRpb24gLWQgdG8gcmVkaXJlY3Qgb3V0cHV0IHRvIHN0ZGVyciIKKwlkZXBlbmRzIG9uIENST05ECisJZGVmYXVsdCB5CisJaGVscAorCSAgLWQgc2V0cyBsb2dsZXZlbCB0byAwIChtb3N0IHZlcmJvc2UpIGFuZCBkaXJlY3RzIGFsbCBvdXRwdXQgdG8gc3RkZXJyLgorCitjb25maWcgRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisJYm9vbCAiUmVwb3J0IGNvbW1hbmQgb3V0cHV0IHZpYSBlbWFpbCAodXNpbmcgc2VuZG1haWwpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ1JPTkQKKwloZWxwCisJICBDb21tYW5kIG91dHB1dCB3aWxsIGJlIHNlbnQgdG8gY29ycmVzcG9uZGluZyB1c2VyIHZpYSBlbWFpbC4KKworY29uZmlnIEZFQVRVUkVfQ1JPTkRfRElSCisJc3RyaW5nICJjcm9uZCBzcG9vbCBkaXJlY3RvcnkiCisJZGVmYXVsdCAiL3Zhci9zcG9vbC9jcm9uIgorCWRlcGVuZHMgb24gQ1JPTkQgfHwgQ1JPTlRBQgorCWhlbHAKKwkgIExvY2F0aW9uIG9mIGNyb25kIHNwb29sLgorCitjb25maWcgQ1JPTlRBQgorCWJvb2wgImNyb250YWIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ3JvbnRhYiBtYW5pcHVsYXRlcyB0aGUgY3JvbnRhYiBmb3IgYSBwYXJ0aWN1bGFyIHVzZXIuIE9ubHkKKwkgIHRoZSBzdXBlcnVzZXIgbWF5IHNwZWNpZnkgYSBkaWZmZXJlbnQgdXNlciBhbmQvb3IgY3JvbnRhYiBkaXJlY3RvcnkuCisJICBOb3RlIHRoYXQgQnVzeWJveCBiaW5hcnkgbXVzdCBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyBhcHBsZXQgdG8KKwkgIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBEQworCWJvb2wgImRjIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIERjIGlzIGEgcmV2ZXJzZS1wb2xpc2ggZGVzayBjYWxjdWxhdG9yIHdoaWNoIHN1cHBvcnRzIHVubGltaXRlZAorCSAgcHJlY2lzaW9uIGFyaXRobWV0aWMuCisKK2NvbmZpZyBGRUFUVVJFX0RDX0xJQk0KKwlib29sICJFbmFibGUgcG93ZXIgYW5kIGV4cCBmdW5jdGlvbnMgKHJlcXVpcmVzIGxpYm0pIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREMKKwloZWxwCisJICBFbmFibGUgcG93ZXIgYW5kIGV4cCBmdW5jdGlvbnMuCisJICBOT1RFOiBUaGlzIHdpbGwgcmVxdWlyZSBsaWJtIHRvIGJlIHByZXNlbnQgZm9yIGxpbmtpbmcuCisKK2NvbmZpZyBERVZGU0QKKwlib29sICJkZXZmc2QgKG9ic29sZXRlKSIKKwlkZWZhdWx0IG4KKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBOT1QgYmUgdXNlZCBhbnltb3JlLgorCSAgVXNlIGxpbnV4ID49IDIuNiAob3B0aW9uYWxseSB3aXRoIGhvdHBsdWcpIGFuZCBtZGV2IGluc3RlYWQhCisJICBTZWUgZG9jcy9tZGV2LnR4dCBmb3IgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byB1c2UgbWRldgorCSAgaW5zdGVhZC4KKworCSAgUHJvdmlkZXMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBkZXZpY2UgbmFtZXMgb24gYSBkZXZmcyBzeXN0ZW1zLgorCSAgWW91IHNob3VsZCBzZXQgaXQgdG8gdHJ1ZSBpZiB5b3UgaGF2ZSBkZXZmcyBlbmFibGVkLgorCSAgVGhlIGZvbGxvd2luZyBrZXl3b3JkcyBpbiBkZXZzZmQuY29uZiBhcmUgc3VwcG9ydGVkOgorCSAgIkNMRUFSX0NPTkZJRyIsICJJTkNMVURFIiwgIk9QVElPTkFMX0lOQ0xVREUiLCAiUkVTVE9SRSIsCisJICAiUEVSTUlTU0lPTlMiLCAiRVhFQ1VURSIsICJDT1BZIiwgIklHTk9SRSIsCisJICAiTUtPTERDT01QQVQiLCAiTUtORVdDT01QQVQiLCJSTU9MRENPTVBBVCIsICJSTU5FV0NPTVBBVCIuCisKKwkgIEJ1dCBvbmx5IGlmIHRoZXkgYXJlIHdyaXR0ZW4gVVBQRVJDQVNFISEhISEhISEKKworY29uZmlnIERFVkZTRF9NT0RMT0FECisJYm9vbCAiQWRkcyBzdXBwb3J0IGZvciBNT0RMT0FEIGtleXdvcmQgaW4gZGV2c2ZkLmNvbmYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERVZGU0QKKwloZWxwCisJICBUaGlzIGFjdHVhbGx5IGRvZXNuJ3Qgd29yayB3aXRoIGJ1c3lib3ggbW9kdXRpbHMgYnV0IG5lZWRzCisJICB0aGUgZXh0ZXJuYWwgbW9kdXRpbHMuCisKK2NvbmZpZyBERVZGU0RfRkdfTlAKKwlib29sICJFbmFibGVzIHRoZSAtZmcgYW5kIC1ucCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVWRlNECisJaGVscAorCSAgLWZnICBSdW4gdGhlIGRhZW1vbiBpbiB0aGUgZm9yZWdyb3VuZC4KKwkgIC1ucCAgRXhpdCBhZnRlciBwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisJICAgICAgIERvIG5vdCBwb2xsIGZvciBldmVudHMuCisKK2NvbmZpZyBERVZGU0RfVkVSQk9TRQorCWJvb2wgIkluY3JlYXNlcyBsb2dnaW5nIChhbmQgc2l6ZSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERVZGU0QKKwloZWxwCisJICBJbmNyZWFzZXMgbG9nZ2luZyB0byBzdGRlcnIgb3Igc3lzbG9nLgorCitjb25maWcgRkVBVFVSRV9ERVZGUworCWJvb2wgIlVzZSBkZXZmcyBuYW1lcyBmb3IgYWxsIGRldmljZXMgKG9ic29sZXRlKSIKKwlkZWZhdWx0IG4KKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIGlzIG9ic29sZXRlIGFuZCBzaG91bGQgTk9UIGJlIHVzZWQgYW55bW9yZS4KKwkgIFVzZSBsaW51eCA+PSAyLjYgKG9wdGlvbmFsbHkgd2l0aCBob3RwbHVnKSBhbmQgbWRldiBpbnN0ZWFkIQorCisJICBGb3IgbGVnYWN5IHN5c3RlbXMgLS0gaWYgdGhlcmUgaXMgbm8gd2F5IGFyb3VuZCBkZXZmc2QgLS0gdGhpcworCSAgdGVsbHMgYnVzeWJveCB0byBsb29rIGZvciBuYW1lcyBsaWtlIC9kZXYvbG9vcC8wIGluc3RlYWQgb2YKKwkgIC9kZXYvbG9vcDAuIElmIHlvdXIgL2RldiBkaXJlY3RvcnkgaGFzIG5vcm1hbCBuYW1lcyBpbnN0ZWFkIG9mCisJICBkZXZmcyBuYW1lcywgeW91IGRvbid0IHdhbnQgdGhpcy4KKworY29uZmlnIERFVk1FTQorCWJvb2wgImRldm1lbSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBkZXZtZW0gaXMgYSBzbWFsbCBwcm9ncmFtIHRoYXQgcmVhZHMgYW5kIHdyaXRlcyBmcm9tIHBoeXNpY2FsCisJICBtZW1vcnkgdXNpbmcgL2Rldi9tZW0uCisKK2NvbmZpZyBFSkVDVAorCWJvb2wgImVqZWN0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFVzZWQgdG8gZWplY3QgY2Ryb21zLiAoZGVmYXVsdHMgdG8gL2Rldi9jZHJvbSkKKworY29uZmlnIEZFQVRVUkVfRUpFQ1RfU0NTSQorCWJvb2wgIlNDU0kgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEVKRUNUCisJaGVscAorCSAgQWRkIHRoZSAtcyBvcHRpb24gdG8gZWplY3QsIHRoaXMgYWxsb3dzIHRvIGVqZWN0IFNDU0ktRGV2aWNlcyBhbmQKKwkgIHVzYi1zdG9yYWdlIGRldmljZXMuCisKK2NvbmZpZyBGQlNQTEFTSAorCWJvb2wgImZic3BsYXNoIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFNob3dzIHNwbGFzaCBpbWFnZSBhbmQgcHJvZ3Jlc3MgYmFyIG9uIGZyYW1lYnVmZmVyIGRldmljZS4KKwkgIENhbiBiZSB1c2VkIGR1cmluZyBib290IHBoYXNlIG9mIGFuIGVtYmVkZGVkIGRldmljZS4gfjJrYi4KKwkgIFVzYWdlOgorCSAgLSB1c2Uga2VybmVsIG9wdGlvbiAndmdhPXh4eCcgb3Igb3RoZXJ3aXNlIGVuYWJsZSBmYiBkZXZpY2UuCisJICAtIHB1dCBzb21ld2hlcmUgZmJzcGxhc2guY2ZnIGZpbGUgYW5kIGFuIGltYWdlIGluIC5wcG0gZm9ybWF0LgorCSAgLSAkIHNldHNpZCBmYnNwbGFzaCBbcGFyYW1zXSAmCisJICAgIC1jOiBoaWRlIGN1cnNvcgorCSAgICAtZCAvZGV2L2ZiTjogZnJhbWVidWZmZXIgZGV2aWNlIChpZiBub3QgL2Rldi9mYjApCisJICAgIC1zIHBhdGhfdG9faW1hZ2VfZmlsZSAoY2FuIGJlICItIiBmb3Igc3RkaW4pCisJICAgIC1pIHBhdGhfdG9fY2ZnX2ZpbGUgKGNhbiBiZSAiLSIgZm9yIHN0ZGluKQorCSAgICAtZiBwYXRoX3RvX2ZpZm8gKGNhbiBiZSAiLSIgZm9yIHN0ZGluKQorCSAgLSBpZiB5b3Ugd2FudCB0byBydW4gaXQgb25seSBpbiBwcmVzZW5jZSBvZiBrZXJuZWwgcGFyYW1ldGVyOgorCSAgICBncmVwIC1xICJmYnNwbGFzaD1vbiIgPC9wcm9jL2NtZGxpbmUgJiYgc2V0c2lkIGZic3BsYXNoIFtwYXJhbXNdICYKKwkgIC0gY29tbWFuZHMgZm9yIGZpZm86CisJICAgICJOTiIgKEFTQ0lJIGRlY2ltYWwgbnVtYmVyKSAtIHBlcmNlbnRhZ2UgdG8gc2hvdyBvbiBwcm9ncmVzcyBiYXIKKwkgICAgImV4aXQiIC0gd2VsbCB5b3UgZ3Vlc3NlZCBpdAorCitjb25maWcgRkxBU0hDUAorCWJvb2wgImZsYXNoY3AiCisJZGVmYXVsdCBuICAjIGRvZXNuJ3QgYnVpbGQgb24gVWJ1bnR1IDguMDQKKwloZWxwCisJICBUaGUgZmxhc2hjcCBiaW5hcnksIGluc3BpcmVkIGJ5IG10ZC11dGlscyBhcyBvZiBnaXQgaGVhZCA1ZWNlYjc0ZjcuCisJICBUaGlzIHV0aWxpdHkgaXMgdXNlZCB0byBjb3B5IGltYWdlcyBpbnRvIGEgTVREIGRldmljZS4KKworY29uZmlnIEZMQVNIX0xPQ0sKKwlib29sICJmbGFzaF9sb2NrIgorCWRlZmF1bHQgbiAgIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA4LjA0CisJaGVscAorCSAgVGhlIGZsYXNoX2xvY2sgYmluYXJ5IGZyb20gbXRkLXV0aWxzIGFzIG9mIGdpdCBoZWFkIDVlYzBjMTBkMC4gVGhpcworCSAgdXRpbGl0eSBsb2NrcyBwYXJ0IG9yIGFsbCBvZiB0aGUgZmxhc2ggZGV2aWNlLgorCitjb25maWcgRkxBU0hfVU5MT0NLCisJYm9vbCAiZmxhc2hfdW5sb2NrIgorCWRlZmF1bHQgbiAgIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA4LjA0CisJaGVscAorCSAgVGhlIGZsYXNoX3VubG9jayBiaW5hcnkgZnJvbSBtdGQtdXRpbHMgYXMgb2YgZ2l0IGhlYWQgNWVjMGMxMGQwLiBUaGlzCisJICB1dGlsaXR5IHVubG9ja3MgcGFydCBvciBhbGwgb2YgdGhlIGZsYXNoIGRldmljZS4KKworY29uZmlnIEZMQVNIX0VSQVNFQUxMCisJYm9vbCAiZmxhc2hfZXJhc2VhbGwiCisJZGVmYXVsdCBuICAjIGRvZXNuJ3QgYnVpbGQgb24gVWJ1bnR1IDguMDQKKwloZWxwCisJICBUaGUgZmxhc2hfZXJhc2VhbGwgYmluYXJ5IGZyb20gbXRkLXV0aWxzIGFzIG9mIGdpdCBoZWFkIGM0YzZhNTllYi4KKwkgIFRoaXMgdXRpbGl0eSBpcyB1c2VkIHRvIGVyYXNlIHRoZSB3aG9sZSBNVEQgZGV2aWNlLgorCitjb25maWcgSU9OSUNFCisJYm9vbCAiaW9uaWNlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFNldC9zZXQgcHJvZ3JhbSBpbyBzY2hlZHVsaW5nIGNsYXNzIGFuZCBwcmlvcml0eQorCSAgUmVxdWlyZXMga2VybmVsID49IDIuNi4xMworCitjb25maWcgSU5PVElGWUQKKwlib29sICJpbm90aWZ5ZCIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBLbm9wcGl4IDUKKwloZWxwCisJICBTaW1wbGUgaW5vdGlmeSBkYWVtb24uIFJlcG9ydHMgZmlsZXN5c3RlbSBjaGFuZ2VzLiBSZXF1aXJlcworCSAga2VybmVsID49IDIuNi4xMworCitjb25maWcgTEFTVAorCWJvb2wgImxhc3QiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1dUTVAKKwloZWxwCisJICAnbGFzdCcgZGlzcGxheXMgYSBsaXN0IG9mIHRoZSBsYXN0IHVzZXJzIHRoYXQgbG9nZ2VkIGludG8gdGhlIHN5c3RlbS4KKworY2hvaWNlCisJcHJvbXB0ICJDaG9vc2UgbGFzdCBpbXBsZW1lbnRhdGlvbiIKKwlkZXBlbmRzIG9uIExBU1QKKwlkZWZhdWx0IEZFQVRVUkVfTEFTVF9GQU5DWQorCitjb25maWcgRkVBVFVSRV9MQVNUX1NNQUxMCisJYm9vbCAic21hbGwiCisJaGVscAorCSAgVGhpcyBpcyBhIHNtYWxsIHZlcnNpb24gb2YgbGFzdCB3aXRoIGp1c3QgdGhlIGJhc2ljIHNldCBvZgorCSAgZmVhdHVyZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xBU1RfRkFOQ1kKKwlib29sICJodWdlIgorCWhlbHAKKwkgICdsYXN0JyBkaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCB1c2VycyB0aGF0CisJICBsb2dnZWQgaW50byB0aGUgc3lzdGVtIChtaW1pY3Mgc3lzdmluaXQgbGFzdCkuICs5MDAgYnl0ZXMuCitlbmRjaG9pY2UKKworY29uZmlnIEhEUEFSTQorCWJvb2wgImhkcGFybSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBHZXQvU2V0IGhhcmQgZHJpdmUgcGFyYW1ldGVycy4gUHJpbWFyaWx5IGludGVuZGVkIGZvciBBVEEKKwkgIGRyaXZlcy4gQWRkcyBhYm91dCAxM2sgKG9yIGFyb3VuZCAzMGsgaWYgeW91IGVuYWJsZSB0aGUKKwkgIEZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWSBvcHRpb24pLi4uLgorCitjb25maWcgRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZCisJYm9vbCAiU3VwcG9ydCBvYnRhaW5pbmcgZGV0YWlsZWQgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSBkcml2ZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRFBBUk0KKwloZWxwCisJICBFbmFibGVzIHRoZSAtSSBhbmQgLWkgb3B0aW9ucyB0byBvYnRhaW4gZGV0YWlsZWQgaW5mb3JtYXRpb24KKwkgIGRpcmVjdGx5IGZyb20gZHJpdmVzIGFib3V0IHRoZWlyIGNhcGFiaWxpdGllcyBhbmQgc3VwcG9ydGVkIEFUQQorCSAgZmVhdHVyZSBzZXQuIElmIG5vIGRldmljZSBuYW1lIGlzIHNwZWNpZmllZCwgaGRwYXJtIHdpbGwgcmVhZAorCSAgaWRlbnRpZnkgZGF0YSBmcm9tIHN0ZGluLiBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGFkZCBhYm91dCAxNmsuLi4KKworY29uZmlnIEZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJYm9vbCAiUmVnaXN0ZXIgYW4gSURFIGludGVyZmFjZSAoREFOR0VST1VTKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhEUEFSTQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlICdoZHBhcm0gLVInIG9wdGlvbiB0byByZWdpc3RlciBhbiBJREUgaW50ZXJmYWNlLgorCSAgVGhpcyBpcyBkYW5nZXJvdXMgc3R1ZmYsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRgorCWJvb2wgIlVuLXJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UgKERBTkdFUk9VUykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRFBBUk0KKwloZWxwCisJICBFbmFibGVzIHRoZSAnaGRwYXJtIC1VJyBvcHRpb24gdG8gdW4tcmVnaXN0ZXIgYW4gSURFIGludGVyZmFjZS4KKwkgIFRoaXMgaXMgZGFuZ2Vyb3VzIHN0dWZmLCBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IHNheSBOLgorCitjb25maWcgRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVAorCWJvb2wgIlBlcmZvcm0gZGV2aWNlIHJlc2V0IChEQU5HRVJPVVMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSERQQVJNCisJaGVscAorCSAgRW5hYmxlcyB0aGUgJ2hkcGFybSAtdycgb3B0aW9uIHRvIHBlcmZvcm0gYSBkZXZpY2UgcmVzZXQuCisJICBUaGlzIGlzIGRhbmdlcm91cyBzdHVmZiwgc28geW91IHNob3VsZCBwcm9iYWJseSBzYXkgTi4KKworY29uZmlnIEZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorCWJvb2wgIlRyaXN0YXRlIGRldmljZSBmb3IgaG90c3dhcCAoREFOR0VST1VTKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhEUEFSTQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlICdoZHBhcm0gLXgnIG9wdGlvbiB0byB0cmlzdGF0ZSBkZXZpY2UgZm9yIGhvdHN3YXAsCisJICBhbmQgdGhlICctYicgb3B0aW9uIHRvIGdldC9zZXQgYnVzIHN0YXRlLiBUaGlzIGlzIGRhbmdlcm91cworCSAgc3R1ZmYsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEKKwlib29sICJHZXQvc2V0IHVzaW5nX2RtYSBmbGFnIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSERQQVJNCisJaGVscAorCSAgRW5hYmxlcyB0aGUgJ2hkcGFybSAtZCcgb3B0aW9uIHRvIGdldC9zZXQgdXNpbmdfZG1hIGZsYWcuCisKK2NvbmZpZyBNQUtFREVWUworCWJvb2wgIm1ha2VkZXZzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgICdtYWtlZGV2cycgaXMgYSB1dGlsaXR5IHVzZWQgdG8gY3JlYXRlIGEgYmF0Y2ggb2YgZGV2aWNlcyB3aXRoCisJICBvbmUgY29tbWFuZC4KKworCSAgVGhlcmUgYXJlIHR3byBjaG9pY2VzIGZvciBjb21tYW5kIGxpbmUgYmVoYXZpb3VyLCB0aGUgaW50ZXJmYWNlCisJICBhcyB1c2VkIGJ5IExFQUYvTGludXggUm91dGVyIFByb2plY3QsIG9yIGEgZGV2aWNlIHRhYmxlIGZpbGUuCisKKwkgICdsZWFmJyBpcyB0cmFkaXRpb25hbGx5IHdoYXQgYnVzeWJveCBmb2xsb3dzLCBpdCBhbGxvd3MgbXVsdGlwbGUKKwkgIGRldmljZXMgb2YgYSBwYXJ0aWNsdWFyIHR5cGUgdG8gYmUgY3JlYXRlZCBwZXIgY29tbWFuZC4KKwkgIGUuZy4gL2Rldi9oZGFbMC05XQorCSAgRGV2aWNlIHByb3BlcnRpZXMgYXJlIHBhc3NlZCBhcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorCisJICAndGFibGUnIHJlYWRzIGRldmljZSBwcm9wZXJ0aWVzIGZyb20gYSBmaWxlIG9yIHN0ZGluLCBhbGxvd2luZworCSAgYSBiYXRjaCBvZiB1bnJlbGF0ZWQgZGV2aWNlcyB0byBiZSBtYWRlIHdpdGggb25lIGNvbW1hbmQuCisJICBVc2VyL2dyb3VwIG5hbWVzIGFyZSBhbGxvd2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvIHVpZC9naWQuCisKK2Nob2ljZQorCXByb21wdCAiQ2hvb3NlIG1ha2VkZXZzIGJlaGF2aW91ciIKKwlkZXBlbmRzIG9uIE1BS0VERVZTCisJZGVmYXVsdCBGRUFUVVJFX01BS0VERVZTX1RBQkxFCisKK2NvbmZpZyBGRUFUVVJFX01BS0VERVZTX0xFQUYKKwlib29sICJsZWFmIgorCitjb25maWcgRkVBVFVSRV9NQUtFREVWU19UQUJMRQorCWJvb2wgInRhYmxlIgorCitlbmRjaG9pY2UKKworY29uZmlnIE1BTgorCWJvb2wgIm1hbiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBGb3JtYXQgYW5kIGRpc3BsYXkgbWFudWFsIHBhZ2VzLgorCitjb25maWcgTUlDUk9DT00KKwlib29sICJtaWNyb2NvbSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgcG9vciBtYW4ncyBtaW5pY29tIHV0aWxpdHkgZm9yIGNoYXR0aW5nIHdpdGggc2VyaWFsIHBvcnQgZGV2aWNlcy4KKworY29uZmlnIE1PVU5UUE9JTlQKKwlib29sICJtb3VudHBvaW50IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG1vdW50cG9pbnQgY2hlY2tzIGlmIHRoZSBkaXJlY3RvcnkgaXMgYSBtb3VudHBvaW50LgorCitjb25maWcgTVQKKwlib29sICJtdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtdCBpcyB1c2VkIHRvIGNvbnRyb2wgdGFwZSBkZXZpY2VzLiBZb3UgY2FuIHVzZSB0aGUgbXQgdXRpbGl0eQorCSAgdG8gYWR2YW5jZSBvciByZXdpbmQgYSB0YXBlIHBhc3QgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyY2hpdmUKKwkgIGZpbGVzIG9uIHRoZSB0YXBlLgorCitjb25maWcgUkFJREFVVE9SVU4KKwlib29sICJyYWlkYXV0b3J1biIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICByYWlkYXV0b3J1biB0ZWxscyB0aGUga2VybmVsIG1kIGRyaXZlciB0bworCSAgc2VhcmNoIGFuZCBzdGFydCBSQUlEIGFycmF5cy4KKworY29uZmlnIFJFQURBSEVBRAorCWJvb2wgInJlYWRhaGVhZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExGUworCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFByZWxvYWQgdGhlIGZpbGVzIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGludG8gUkFNIGNhY2hlIHNvIHRoYXQKKwkgIHN1YnNlcXVlbnQgcmVhZHMgb24gdGhlc2UgZmlsZXMgd2lsbCBub3QgYmxvY2sgb24gZGlzayBJL08uCisKKwkgIFRoaXMgYXBwbGV0IGp1c3QgY2FsbHMgdGhlIHJlYWRhaGVhZCgyKSBzeXN0ZW0gY2FsbCBvbiBlYWNoIGZpbGUuCisJICBJdCBpcyBtYWlubHkgdXNlZnVsIGluIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMgdG8gcHJlbG9hZCBmaWxlcworCSAgb3IgZXhlY3V0YWJsZXMgYmVmb3JlIHRoZXkgYXJlIHVzZWQuIFdoZW4gdXNlZCBhdCB0aGUgcmlnaHQgdGltZQorCSAgKGluIHBhcnRpY3VsYXIgd2hlbiBhIENQVSBib3VuZCBwcm9jZXNzIGlzIHJ1bm5pbmcpIGl0IGNhbgorCSAgc2lnbmlmaWNhbnRseSBzcGVlZCB1cCBzeXN0ZW0gc3RhcnR1cC4KKworCSAgQXMgcmVhZGFoZWFkKDIpIGJsb2NrcyB1bnRpbCBlYWNoIGZpbGUgaGFzIGJlZW4gcmVhZCwgaXQgaXMgYmVzdCB0bworCSAgcnVuIHRoaXMgYXBwbGV0IGFzIGEgYmFja2dyb3VuZCBqb2IuCisKK2NvbmZpZyBSRktJTEwKKwlib29sICJyZmtpbGwiCisJZGVmYXVsdCBuICAjIGRvZXNuJ3QgYnVpbGQgb24gVWJ1bnR1IDkuMDQKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBFbmFibGUvZGlzYWJsZSB3aXJlbGVzcyBkZXZpY2VzLgorCisJICByZmtpbGwgbGlzdCA6IGxpc3QgYWxsIHdpcmVsZXNzIGRldmljZXMKKwkgIHJma2lsbCBsaXN0IGJsdWV0b290aCA6IGxpc3QgYWxsIGJsdWV0b290aCBkZXZpY2VzCisJICByZmtpbGwgbGlzdCAxIDogbGlzdCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5kZXgKKwkgIHJma2lsbCBibG9ja3x1bmJsb2NrIHdsYW4gOiBibG9jay91bmJsb2NrIGFsbCB3bGFuKHdpZmkpIGRldmljZXMKKworY29uZmlnIFJVTkxFVkVMCisJYm9vbCAicnVubGV2ZWwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKwloZWxwCisJICBmaW5kIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzeXN0ZW0gcnVubGV2ZWwuCisKKwkgIFRoaXMgYXBwbGV0IHVzZXMgdXRtcCBidXQgZG9lcyBub3QgcmVseSBvbiBidXN5Ym94IHN1cHBvcmluZworCSAgdXRtcCBvbiBwdXJwb3NlLiBJdCBpcyB1c2VkIGJ5IGUuZy4gZW1kZWJpYW4gdmlhIC9ldGMvaW5pdC5kL3JjLgorCitjb25maWcgUlgKKwlib29sICJyeCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBSZWNlaXZlIGZpbGVzIHVzaW5nIHRoZSBYbW9kZW0gcHJvdG9jb2wuCisKK2NvbmZpZyBTRVRTSUQKKwlib29sICJzZXRzaWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc2V0c2lkIHJ1bnMgYSBwcm9ncmFtIGluIGEgbmV3IHNlc3Npb24KKworY29uZmlnIFNUUklOR1MKKwlib29sICJzdHJpbmdzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHN0cmluZ3MgcHJpbnRzIHRoZSBwcmludGFibGUgY2hhcmFjdGVyIHNlcXVlbmNlcyBmb3IgZWFjaCBmaWxlCisJICBzcGVjaWZpZWQuCisKK2NvbmZpZyBUQVNLU0VUCisJYm9vbCAidGFza3NldCIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBzb21lIG5vbi14ODYgdGFyZ2V0cyAobTY4aykKKwloZWxwCisJICBSZXRyaWV2ZSBvciBzZXQgYSBwcm9jZXNzZXMncyBDUFUgYWZmaW5pdHkuCisJICBUaGlzIHJlcXVpcmVzIHNjaGVkX3tnLHN9ZXRhZmZpbml0eSBzdXBwb3J0IGluIHlvdXIgbGliYy4KKworY29uZmlnIEZFQVRVUkVfVEFTS1NFVF9GQU5DWQorCWJvb2wgIkZhbmN5IG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBU0tTRVQKKwloZWxwCisJICBBZGQgY29kZSBmb3IgZmFuY3kgb3V0cHV0LiBUaGlzIG1lcmVseSBzaWxlbmNlcyBhIGNvbXBpbGVyLXdhcm5pbmcKKwkgIGFuZCBhZGRzIGFib3V0IDEzNSBCeXRlcy4gTWF5IGJlIG5lZWRlZCBmb3IgbWFjaGluZXMgd2l0aCBhbG90CisJICBvZiBDUFVzLgorCitjb25maWcgVElNRQorCWJvb2wgInRpbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHRpbWUgY29tbWFuZCBydW5zIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisJICBXaGVuIHRoZSBjb21tYW5kIGZpbmlzaGVzLCB0aW1lIHdyaXRlcyBhIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0CisJICBnaXZpbmcgdGltaW5nIHN0YXRpc3RpY3MgYWJvdXQgdGhpcyBwcm9ncmFtIHJ1bi4KKworY29uZmlnIFRJTUVPVVQKKwlib29sICJ0aW1lb3V0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJ1bnMgYSBwcm9ncmFtIGFuZCB3YXRjaGVzIGl0LiBJZiBpdCBkb2VzIG5vdCB0ZXJtaW5hdGUgaW4KKwkgIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcywgaXQgaXMgc2VudCBhIHNpZ25hbC4KKworY29uZmlnIFRUWVNJWkUKKwlib29sICJ0dHlzaXplIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEEgcmVwbGFjZW1lbnQgZm9yICJzdHR5IHNpemUiLiBVbmxpa2Ugc3R0eSwgY2FuIHJlcG9ydCBvbmx5IHdpZHRoLAorCSAgb25seSBoZWlnaHQsIG9yIGJvdGgsIGluIGFueSBvcmRlci4gSXQgYWxzbyBkb2VzIG5vdCBjb21wbGFpbiBvbgorCSAgZXJyb3IsIGJ1dCByZXR1cm5zIGRlZmF1bHQgODB4MjQuCisJICBVc2FnZSBpbiBzaGVsbCBzY3JpcHRzOiB3aWR0aD1gdHR5c2l6ZSB3YC4KKworY29uZmlnIFZPTE5BTUUKKwlib29sICJ2b2xuYW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFByaW50cyBhIENELVJPTSB2b2x1bWUgbmFtZS4KKworY29uZmlnIFdBTEwKKwlib29sICJ3YWxsIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9VVE1QCisJaGVscAorCSAgV3JpdGUgYSBtZXNzYWdlIHRvIGFsbCB1c2VycyB0aGF0IGFyZSBsb2dnZWQgaW4uCisKK2NvbmZpZyBXQVRDSERPRworCWJvb2wgIndhdGNoZG9nIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSB3YXRjaGRvZyB1dGlsaXR5IGlzIHVzZWQgd2l0aCBoYXJkd2FyZSBvciBzb2Z0d2FyZSB3YXRjaGRvZworCSAgZGV2aWNlIGRyaXZlcnMuIEl0IG9wZW5zIHRoZSBzcGVjaWZpZWQgd2F0Y2hkb2cgZGV2aWNlIHNwZWNpYWwgZmlsZQorCSAgYW5kIHBlcmlvZGljYWxseSB3cml0ZXMgYSBtYWdpYyBjaGFyYWN0ZXIgdG8gdGhlIGRldmljZS4gSWYgdGhlCisJICB3YXRjaGRvZyBhcHBsZXQgZXZlciBmYWlscyB0byB3cml0ZSB0aGUgbWFnaWMgY2hhcmFjdGVyIHdpdGhpbiBhCisJICBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLCB0aGUgd2F0Y2hkb2cgZGV2aWNlIGFzc3VtZXMgdGhlIHN5c3RlbSBoYXMKKwkgIGh1bmcsIGFuZCB3aWxsIGNhdXNlIHRoZSBoYXJkd2FyZSB0byByZWJvb3QuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0OTg2NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNTAgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0FESlRJTUVYKSAgICArPSBhZGp0aW1leC5vCitsaWItJChDT05GSUdfQkJDT05GSUcpICAgICs9IGJiY29uZmlnLm8KK2xpYi0kKENPTkZJR19CRUVQKSAgICAgICAgKz0gYmVlcC5vCitsaWItJChDT05GSUdfQ0hBVCkgICAgICAgICs9IGNoYXQubworbGliLSQoQ09ORklHX0NIUlQpICAgICAgICArPSBjaHJ0Lm8KK2xpYi0kKENPTkZJR19DUk9ORCkgICAgICAgKz0gY3JvbmQubworbGliLSQoQ09ORklHX0NST05UQUIpICAgICArPSBjcm9udGFiLm8KK2xpYi0kKENPTkZJR19EQykgICAgICAgICAgKz0gZGMubworbGliLSQoQ09ORklHX0RFVkZTRCkgICAgICArPSBkZXZmc2QubworbGliLSQoQ09ORklHX0RFVk1FTSkgICAgICArPSBkZXZtZW0ubworbGliLSQoQ09ORklHX0VKRUNUKSAgICAgICArPSBlamVjdC5vCitsaWItJChDT05GSUdfRkJTUExBU0gpICAgICs9IGZic3BsYXNoLm8KK2xpYi0kKENPTkZJR19GTEFTSENQKSAgICAgKz0gZmxhc2hjcC5vCitsaWItJChDT05GSUdfRkxBU0hfRVJBU0VBTEwpICs9IGZsYXNoX2VyYXNlYWxsLm8KK2xpYi0kKENPTkZJR19GTEFTSF9MT0NLKSAgICAgKz0gZmxhc2hfbG9ja191bmxvY2subworbGliLSQoQ09ORklHX0ZMQVNIX1VOTE9DSykgICArPSBmbGFzaF9sb2NrX3VubG9jay5vCitsaWItJChDT05GSUdfSU9OSUNFKSAgICAgICs9IGlvbmljZS5vCitsaWItJChDT05GSUdfSERQQVJNKSAgICAgICs9IGhkcGFybS5vCitsaWItJChDT05GSUdfSU5PVElGWUQpICAgICs9IGlub3RpZnlkLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwpKz0gbGFzdC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZKSs9IGxhc3RfZmFuY3kubworbGliLSQoQ09ORklHX0xFU1MpICAgICAgICArPSBsZXNzLm8KK2xpYi0kKENPTkZJR19NQUtFREVWUykgICAgKz0gbWFrZWRldnMubworbGliLSQoQ09ORklHX01BTikgICAgICAgICArPSBtYW4ubworbGliLSQoQ09ORklHX01JQ1JPQ09NKSAgICArPSBtaWNyb2NvbS5vCitsaWItJChDT05GSUdfTU9VTlRQT0lOVCkgICs9IG1vdW50cG9pbnQubworbGliLSQoQ09ORklHX01UKSAgICAgICAgICArPSBtdC5vCitsaWItJChDT05GSUdfUkFJREFVVE9SVU4pICs9IHJhaWRhdXRvcnVuLm8KK2xpYi0kKENPTkZJR19SRUFEQUhFQUQpICAgKz0gcmVhZGFoZWFkLm8KK2xpYi0kKENPTkZJR19SRktJTEwpICAgICAgKz0gcmZraWxsLm8KK2xpYi0kKENPTkZJR19SVU5MRVZFTCkgICAgKz0gcnVubGV2ZWwubworbGliLSQoQ09ORklHX1JYKSAgICAgICAgICArPSByeC5vCitsaWItJChDT05GSUdfU0VUU0lEKSAgICAgICs9IHNldHNpZC5vCitsaWItJChDT05GSUdfU1RSSU5HUykgICAgICs9IHN0cmluZ3MubworbGliLSQoQ09ORklHX1RBU0tTRVQpICAgICArPSB0YXNrc2V0Lm8KK2xpYi0kKENPTkZJR19USU1FKSAgICAgICAgKz0gdGltZS5vCitsaWItJChDT05GSUdfVElNRU9VVCkgICAgICs9IHRpbWVvdXQubworbGliLSQoQ09ORklHX1RUWVNJWkUpICAgICArPSB0dHlzaXplLm8KK2xpYi0kKENPTkZJR19WT0xOQU1FKSAgICAgKz0gdm9sbmFtZS5vCitsaWItJChDT05GSUdfV0FMTCkgICAgICAgICs9IHdhbGwubworbGliLSQoQ09ORklHX1dBVENIRE9HKSAgICArPSB3YXRjaGRvZy5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvYWRqdGltZXguYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9hZGp0aW1leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODE2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvYWRqdGltZXguYwpAQCAtMCwwICsxLDE1OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYWRqdGltZXguYyAtIHJlYWQsIGFuZCBwb3NzaWJseSBtb2RpZnksIHRoZSBMaW51eCBrZXJuZWwgYHRpbWV4JyB2YXJpYWJsZXMuCisgKgorICogT3JpZ2luYWxseSB3cml0dGVuOiBPY3RvYmVyIDE5OTcKKyAqIExhc3QgaGFjazogTWFyY2ggMjAwMQorICogQ29weXJpZ2h0IDE5OTcsIDIwMDAsIDIwMDEgTGFycnkgRG9vbGl0dGxlIDxMUkRvb2xpdHRsZUBsYmwuZ292PgorICoKKyAqIGJ1c3lib3hlZCAyMCBNYXJjaCAyMDAxLCBMYXJyeSBEb29saXR0bGUgPGxkb29saXR0QHJlY3ljbGUubGJsLmdvdj4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhZGp0aW1leF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1xXSBbLW8gT0ZGXSBbLWYgRlJFUV0gWy1wIFRDT05TVF0gWy10IFRJQ0tdIgorLy91c2FnZTojZGVmaW5lIGFkanRpbWV4X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVhZCBhbmQgb3B0aW9uYWxseSBzZXQgc3lzdGVtIHRpbWViYXNlIHBhcmFtZXRlcnMuIFNlZSBhZGp0aW1leCgyKVxuIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLW8gT0ZGCVRpbWUgb2Zmc2V0LCBtaWNyb3NlY29uZHMiCisvL3VzYWdlOiAgICAgIlxuCS1mIEZSRVEJRnJlcXVlbmN5IGFkanVzdCwgaW50ZWdlciBrZXJuZWwgdW5pdHMgKDY1NTM2IGlzIDFwcG0pIgorLy91c2FnZTogICAgICJcbgkJKHBvc2l0aXZlIHZhbHVlcyBtYWtlIGNsb2NrIHJ1biBmYXN0ZXIpIgorLy91c2FnZTogICAgICJcbgktdCBUSUNLCU1pY3Jvc2Vjb25kcyBwZXIgdGljaywgdXN1YWxseSAxMDAwMCIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgVENPTlNUIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZmRlZiBfX0JJT05JQ19fCisjIGluY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjZWxzZQorIyBpbmNsdWRlIDxzeXMvdGltZXguaD4KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc3RhdGxpc3RfYml0W10gPSB7CisJU1RBX1BMTCwKKwlTVEFfUFBTRlJFUSwKKwlTVEFfUFBTVElNRSwKKwlTVEFfRkxMLAorCVNUQV9JTlMsCisJU1RBX0RFTCwKKwlTVEFfVU5TWU5DLAorCVNUQV9GUkVRSE9MRCwKKwlTVEFfUFBTU0lHTkFMLAorCVNUQV9QUFNKSVRURVIsCisJU1RBX1BQU1dBTkRFUiwKKwlTVEFfUFBTRVJST1IsCisJU1RBX0NMT0NLRVJSLAorCTAKK307CitzdGF0aWMgY29uc3QgY2hhciBzdGF0bGlzdF9uYW1lW10gPQorCSJQTEwiICAgICAgICJcMCIKKwkiUFBTRlJFUSIgICAiXDAiCisJIlBQU1RJTUUiICAgIlwwIgorCSJGRkwiICAgICAgICJcMCIKKwkiSU5TIiAgICAgICAiXDAiCisJIkRFTCIgICAgICAgIlwwIgorCSJVTlNZTkMiICAgICJcMCIKKwkiRlJFUUhPTEQiICAiXDAiCisJIlBQU1NJR05BTCIgIlwwIgorCSJQUFNKSVRURVIiICJcMCIKKwkiUFBTV0FOREVSIiAiXDAiCisJIlBQU0VSUk9SIiAgIlwwIgorCSJDTE9DS0VSUiIKKzsKKworc3RhdGljIGNvbnN0IGNoYXIgcmV0X2NvZGVfZGVzY3JpcHRbXSA9CisJImNsb2NrIHN5bmNocm9uaXplZCIgIlwwIgorCSJpbnNlcnQgbGVhcCBzZWNvbmQiICJcMCIKKwkiZGVsZXRlIGxlYXAgc2Vjb25kIiAiXDAiCisJImxlYXAgc2Vjb25kIGluIHByb2dyZXNzIiAiXDAiCisJImxlYXAgc2Vjb25kIGhhcyBvY2N1cnJlZCIgIlwwIgorCSJjbG9jayBub3Qgc3luY2hyb25pemVkIgorOworCitpbnQgYWRqdGltZXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFkanRpbWV4X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJT1BUX3F1aWV0ID0gMHgxCisJfTsKKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqb3B0X28sICpvcHRfZiwgKm9wdF9wLCAqb3B0X3Q7CisJc3RydWN0IHRpbWV4IHR4YzsKKwlpbnQgaSwgcmV0OworCWNvbnN0IGNoYXIgKmRlc2NyaXB0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTAiOyAvKiBubyB2YWxpZCBub24tb3B0aW9uIHBhcmFtZXRlcnMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAicW86ZjpwOnQ6IiwKKwkJCSZvcHRfbywgJm9wdF9mLCAmb3B0X3AsICZvcHRfdCk7CisJdHhjLm1vZGVzID0gMDsKKwkvL2lmIChvcHQgJiAweDEpIC8vIC1xCisJaWYgKG9wdCAmIDB4MikgeyAvLyAtbworCQl0eGMub2Zmc2V0ID0geGF0b2wob3B0X28pOworCQl0eGMubW9kZXMgfD0gQURKX09GRlNFVF9TSU5HTEVTSE9UOworCX0KKwlpZiAob3B0ICYgMHg0KSB7IC8vIC1mCisJCXR4Yy5mcmVxID0geGF0b2wob3B0X2YpOworCQl0eGMubW9kZXMgfD0gQURKX0ZSRVFVRU5DWTsKKwl9CisJaWYgKG9wdCAmIDB4OCkgeyAvLyAtcAorCQl0eGMuY29uc3RhbnQgPSB4YXRvbChvcHRfcCk7CisJCXR4Yy5tb2RlcyB8PSBBREpfVElNRUNPTlNUOworCX0KKwlpZiAob3B0ICYgMHgxMCkgeyAvLyAtdAorCQl0eGMudGljayA9IHhhdG9sKG9wdF90KTsKKwkJdHhjLm1vZGVzIHw9IEFESl9USUNLOworCX0KKworCXJldCA9IGFkanRpbWV4KCZ0eGMpOworCisJaWYgKHJldCA8IDApIHsKKwkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwl9CisKKwlpZiAoIShvcHQgJiBPUFRfcXVpZXQpKSB7CisJCWludCBzZXA7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJcHJpbnRmKAorCQkJIiAgICBtb2RlOiAgICAgICAgICVkXG4iCisJCQkiLW8gIG9mZnNldDogICAgICAgJWxkXG4iCisJCQkiLWYgIGZyZXF1ZW5jeTogICAgJWxkXG4iCisJCQkiICAgIG1heGVycm9yOiAgICAgJWxkXG4iCisJCQkiICAgIGVzdGVycm9yOiAgICAgJWxkXG4iCisJCQkiICAgIHN0YXR1czogICAgICAgJWQgKCIsCisJCXR4Yy5tb2RlcywgdHhjLm9mZnNldCwgdHhjLmZyZXEsIHR4Yy5tYXhlcnJvciwKKwkJdHhjLmVzdGVycm9yLCB0eGMuc3RhdHVzKTsKKworCQkvKiByZXByZXNlbnRhdGl2ZSBvdXRwdXQgb2YgbmV4dCBjb2RlIGZyYWdtZW50OgorCQkgICAiUExMIHwgUFBTVElNRSIgKi8KKwkJbmFtZSA9IHN0YXRsaXN0X25hbWU7CisJCXNlcCA9IDA7CisJCWZvciAoaSA9IDA7IHN0YXRsaXN0X2JpdFtpXTsgaSsrKSB7CisJCQlpZiAodHhjLnN0YXR1cyAmIHN0YXRsaXN0X2JpdFtpXSkgeworCQkJCWlmIChzZXApCisJCQkJCWZwdXRzKCIgfCAiLCBzdGRvdXQpOworCQkJCWZwdXRzKG5hbWUsIHN0ZG91dCk7CisJCQkJc2VwID0gMTsKKwkJCX0KKwkJCW5hbWUgKz0gc3RybGVuKG5hbWUpICsgMTsKKwkJfQorCisJCWRlc2NyaXB0ID0gImVycm9yIjsKKwkJaWYgKHJldCA8PSA1KQorCQkJZGVzY3JpcHQgPSBudGhfc3RyaW5nKHJldF9jb2RlX2Rlc2NyaXB0LCByZXQpOworCQlwcmludGYoIilcbiIKKwkJCSItcCAgdGltZWNvbnN0YW50OiAlbGRcbiIKKwkJCSIgICAgcHJlY2lzaW9uOiAgICAlbGRcbiIKKwkJCSIgICAgdG9sZXJhbmNlOiAgICAlbGRcbiIKKwkJCSItdCAgdGljazogICAgICAgICAlbGRcbiIKKwkJCSIgICAgdGltZS50dl9zZWM6ICAlbGRcbiIKKwkJCSIgICAgdGltZS50dl91c2VjOiAlbGRcbiIKKwkJCSIgICAgcmV0dXJuIHZhbHVlOiAlZCAoJXMpXG4iLAorCQl0eGMuY29uc3RhbnQsCisJCXR4Yy5wcmVjaXNpb24sIHR4Yy50b2xlcmFuY2UsIHR4Yy50aWNrLAorCQkobG9uZyl0eGMudGltZS50dl9zZWMsIChsb25nKXR4Yy50aW1lLnR2X3VzZWMsIHJldCwgZGVzY3JpcHQpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2JiY29uZmlnLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvYmJjb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGJlODEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2JiY29uZmlnLmMKQEAgLTAsMCArMSw0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBUaGlzIGZpbGUgd2FzIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4gYnkgUGF1bCBGb3guCisgKi8KKworLy91c2FnZTojZGVmaW5lIGJiY29uZmlnX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgYmJjb25maWdfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgY29uZmlnIGZpbGUgdXNlZCBieSBidXN5Ym94IGJ1aWxkIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYmNvbmZpZ29wdHMuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRworIyBpbmNsdWRlICJhcmNoaXZlLmgiCisjIGluY2x1ZGUgImJiY29uZmlnb3B0c19iejIuaCIKKyNlbmRpZgorCitpbnQgYmJjb25maWdfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJiY29uZmlnX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ09NUFJFU1NfQkJDT05GSUcKKwlidW56aXBfZGF0YSAqYmQ7CisJaW50IGkgPSBzdGFydF9idW56aXAoJmJkLAorCQkJLyogc3JjX2ZkOiAqLyAtMSwKKwkJCS8qIGluYnVmOiAgKi8gYmJjb25maWdfY29uZmlnX2J6MiwKKwkJCS8qIGxlbjogICAgKi8gc2l6ZW9mKGJiY29uZmlnX2NvbmZpZ19iejIpKTsKKwkvKiByZWFkX2J1bnppcCBjYW4gbG9uZ2ptcCB0byBzdGFydF9idW56aXAsIGFuZCB1bHRpbWF0ZWx5CisJICogZW5kIHVwIGhlcmUgd2l0aCBpICE9IDAgb24gcmVhZCBkYXRhIGVycm9ycyEgTm90IHRyaXZpYWwgKi8KKwlpZiAoIWkpIHsKKwkJLyogQ2Fubm90IHVzZSB4bWFsbG9jOiB3aWxsIGxlYWsgYmQgaW4gTk9GT1JLIGNhc2UhICovCisJCWNoYXIgKm91dGJ1ZiA9IG1hbGxvY19vcl93YXJuKHNpemVvZihiYmNvbmZpZ19jb25maWcpKTsKKwkJaWYgKG91dGJ1ZikgeworCQkJcmVhZF9idW56aXAoYmQsIG91dGJ1Ziwgc2l6ZW9mKGJiY29uZmlnX2NvbmZpZykpOworCQkJZnVsbF93cml0ZTFfc3RyKG91dGJ1Zik7CisJCX0KKwl9CisjZWxzZQorCWZ1bGxfd3JpdGUxX3N0cihiYmNvbmZpZ19jb25maWcpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvYmVlcC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2JlZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBlMDNlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2JlZXAuYwpAQCAtMCwwICsxLDEyNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmVlcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYmVlcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLWYgRlJFUSAtbCBMRU4gLWQgREVMQVkgLXIgQ09VTlQgLW4iCisvL3VzYWdlOiNkZWZpbmUgYmVlcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktZglGcmVxdWVuY3kgaW4gSHoiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxlbmd0aCBpbiBtcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVsYXkgaW4gbXMiCisvL3VzYWdlOiAgICAgIlxuCS1yCVJlcGV0aXRpb25zIgorLy91c2FnZTogICAgICJcbgktbglTdGFydCBuZXcgdG9uZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorI2lmbmRlZiBDTE9DS19USUNLX1JBVEUKKyMgZGVmaW5lIENMT0NLX1RJQ0tfUkFURSAxMTkzMTgwCisjZW5kaWYKKworLyogZGVmYXVsdHMgKi8KKyNpZm5kZWYgQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRCisjIGRlZmluZSBGUkVRICg0MDAwKQorI2Vsc2UKKyMgZGVmaW5lIEZSRVEgKENPTkZJR19GRUFUVVJFX0JFRVBfRlJFUSkKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUworIyBkZWZpbmUgTEVOR1RIICgzMCkKKyNlbHNlCisjIGRlZmluZSBMRU5HVEggKENPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TKQorI2VuZGlmCisjZGVmaW5lIERFTEFZICgwKQorI2RlZmluZSBSRVBFVElUSU9OUyAoMSkKKworaW50IGJlZXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJlZXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHNwZWFrZXIgPSBnZXRfY29uc29sZV9mZF9vcl9kaWUoKTsKKwl1bnNpZ25lZCB0aWNrcmF0ZV9kaXZfZnJlcSA9IHRpY2tyYXRlX2Rpdl9mcmVxOyAvKiBmb3IgY29tcGlsZXIgKi8KKwl1bnNpZ25lZCBsZW5ndGggPSBsZW5ndGg7CisJdW5zaWduZWQgZGVsYXkgPSBkZWxheTsKKwl1bnNpZ25lZCByZXAgPSByZXA7CisJaW50IGM7CisKKwljID0gJ24nOworCXdoaWxlIChjICE9IC0xKSB7CisJCWlmIChjID09ICduJykgeworCQkJdGlja3JhdGVfZGl2X2ZyZXEgPSBDTE9DS19USUNLX1JBVEUgLyBGUkVROworCQkJbGVuZ3RoID0gTEVOR1RIOworCQkJZGVsYXkgPSBERUxBWTsKKwkJCXJlcCA9IFJFUEVUSVRJT05TOworCQl9CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgImY6bDpkOnI6biIpOworLyogVE9ETzogLXMsIC1jOgorICogcGlwZSBzdGRpbiB0byBzdGRvdXQsIGJ1dCBhbHNvIGJlZXAgYWZ0ZXIgZWFjaCBsaW5lICgtcykgb3IgY2hhciAoLWMpCisgKi8KKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2YnOgorLyogVE9ETzogd2hhdCAiLWYgMCIgc2hvdWxkIGRvPyAqLworCQkJdGlja3JhdGVfZGl2X2ZyZXEgPSAodW5zaWduZWQpQ0xPQ0tfVElDS19SQVRFIC8geGF0b3Uob3B0YXJnKTsKKwkJCWNvbnRpbnVlOworCQljYXNlICdsJzoKKwkJCWxlbmd0aCA9IHhhdG91KG9wdGFyZyk7CisJCQljb250aW51ZTsKKwkJY2FzZSAnZCc6CisvKiBUT0RPOgorICogLWQgTiwgLUQgTgorICogc3BlY2lmeSBhIGRlbGF5IG9mIE4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcmVwZXRpdGlvbnMuCisgKiAtZCBzcGVjaWZpZXMgdGhhdCB0aGlzIGRlbGF5IHNob3VsZCBvbmx5IG9jY3VyIGJldHdlZW4gYmVlcHMsCisgKiB0aGF0IGlzLCBpdCBzaG91bGQgbm90IG9jY3VyIGFmdGVyIHRoZSBsYXN0IHJlcGV0aXRpb24uCisgKiAtRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVsYXkgc2hvdWxkIG9jY3VyIGFmdGVyIGV2ZXJ5IHJlcGV0aXRpb24KKyAqLworCQkJZGVsYXkgPSB4YXRvdShvcHRhcmcpOworCQkJY29udGludWU7CisJCWNhc2UgJ3InOgorCQkJcmVwID0geGF0b3Uob3B0YXJnKTsKKwkJCWNvbnRpbnVlOworCQljYXNlICduJzoKKwkJY2FzZSAtMToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJCXdoaWxlIChyZXApIHsKKy8vYmJfaW5mb19tc2coInJlcFslZF0gZnJlcT0lZCwgbGVuZ3RoPSVkLCBkZWxheT0lZCIsIHJlcCwgZnJlcSwgbGVuZ3RoLCBkZWxheSk7CisJCQl4aW9jdGwoc3BlYWtlciwgS0lPQ1NPVU5ELCAodm9pZCopKHVpbnRwdHJfdCl0aWNrcmF0ZV9kaXZfZnJlcSk7CisJCQl1c2xlZXAoMTAwMCAqIGxlbmd0aCk7CisJCQlpb2N0bChzcGVha2VyLCBLSU9DU09VTkQsICh2b2lkKikwKTsKKwkJCWlmICgtLXJlcCkKKwkJCQl1c2xlZXAoMTAwMCAqIGRlbGF5KTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2Uoc3BlYWtlcik7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKy8qCisgKiBzbywgZS5nLiBCZWV0aG92ZW4ncyA5dGggc3ltcGhvbnkgIk9kZSBhbiBkaWUgRnJldWRlIiB3b3VsZCBiZQorICogc29tZXRoaW5nIGxpa2U6CithPSQoKDIyMCozKSkKK2I9JCgoMjQ3KjMpKQorYz0kKCgyNjIqMykpCitkPSQoKDI5NCozKSkKK2U9JCgoMzI5KjMpKQorZj0kKCgzNDkqMykpCitnPSQoKDM5MiozKSkKKyMuL2JlZXAgLWYkZCAtbDIwMCAtcjIgLW4gLWYkZSAtbDEwMCAtZCAxMCAtbiAtZiRjIC1sNDAwIC1mJGcgLWwyMDAKKy4vYmVlcCAtZiRlIC1sMjAwIC1yMiBcCisgICAgICAgIC1uIC1kIDEwMCAtZiRmIC1sMjAwIFwKKyAgICAgICAgLW4gLWYkZyAtbDIwMCAtcjIgXAorICAgICAgICAtbiAtZiRmIC1sMjAwIFwKKyAgICAgICAgLW4gLWYkZSAtbDIwMCBcCisgICAgICAgIC1uIC1mJGQgLWwyMDAgXAorICAgICAgICAtbiAtZiRjIC1sMjAwIC1yMiBcCisgICAgICAgIC1uIC1mJGQgLWwyMDAgXAorICAgICAgICAtbiAtZiRlIC1sMjAwIFwKKyAgICAgICAgLW4gLWYkZSAtbDQwMCBcCisgICAgICAgIC1uIC1mJGQgLWwxMDAgXAorICAgICAgICAtbiAtZiRkIC1sMjAwIFwKKyovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvY2hhdC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2NoYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTk5NGY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2NoYXQuYwpAQCAtMCwwICsxLDQ0NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmFyZSBib25lcyBjaGF0IHV0aWxpdHkKKyAqIGluc3BpcmVkIGJ5IHBwcCdzIGNoYXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNoYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkVYUEVDVCBbU0VORCBbRVhQRUNUIFtTRU5ELi4uXV1dIgorLy91c2FnZTojZGVmaW5lIGNoYXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVc2VmdWwgZm9yIGludGVyYWN0aW5nIHdpdGggYSBtb2RlbSBjb25uZWN0ZWQgdG8gc3RkaW4vc3Rkb3V0LlxuIgorLy91c2FnZTogICAgICAgIkEgc2NyaXB0IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIFwiZXhwZWN0LXNlbmRcIiBwYWlycyBvZiBzdHJpbmdzLFxuIgorLy91c2FnZTogICAgICAgImVhY2ggcGFpciBpcyBhIHBhaXIgb2YgYXJndW1lbnRzLiBFeGFtcGxlOlxuIgorLy91c2FnZTogICAgICAgImNoYXQgJycgQVRaIE9LIEFURDEyMzQ1NiBDT05ORUNUICcnIG9naW46IHBwcHVzZXIgd29yZDogcHBwcGFzcyAnficiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvLyBkZWZhdWx0IHRpbWVvdXQ6IDQ1IHNlYworI2RlZmluZSBERUZBVUxUX0NIQVRfVElNRU9VVCA0NSoxMDAwCisvLyBtYXggbGVuZ3RoIG9mICJhYm9ydCBzdHJpbmciLAorLy8gaS5lLiBkZXZpY2UgcmVwbHkgd2hpY2ggY2F1c2VzIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9BQk9SVF9MRU4gNTAKKworLy8gcG9zc2libGUgZXhpdCBjb2RlcworZW51bSB7CisJRVJSX09LID0gMCwgICAgIC8vIGFsbCdzIHdlbGwKKwlFUlJfTUVNLCAgICAgICAgLy8gcmVhZCB0b28gbXVjaCB3aGlsZSBleHBlY3RpbmcKKwlFUlJfSU8sICAgICAgICAgLy8gc2lnbmFsbGVkIG9yIEkvTyBlcnJvcgorCUVSUl9USU1FT1VULCAgICAvLyB0aW1lZCBvdXQgd2hpbGUgZXhwZWN0aW5nCisJRVJSX0FCT1JULCAgICAgIC8vIGZpcnN0IGFib3J0IGNvbmRpdGlvbiB3YXMgbWV0CisvLwlFUlJfQUJPUlQyLCAgICAgLy8gc2Vjb25kIGFib3J0IGNvbmRpdGlvbiB3YXMgbWV0CisvLwkuLi4KK307CisKKy8vIGV4aXQgY29kZQorI2RlZmluZSBleGl0Y29kZSBiYl9nb3Rfc2lnbmFsCisKKy8vIHRyYXAgZm9yIGNyaXRpY2FsIHNpZ25hbHMKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKFVOVVNFRF9QQVJBTSBpbnQgc2lnbm8pCit7CisJLy8gcmVwb3J0IEkvTyBlcnJvciBjb25kaXRpb24KKwlleGl0Y29kZSA9IEVSUl9JTzsKK30KKworI2lmICFFTkFCTEVfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSCisjZGVmaW5lIHVuZXNjYXBlKHMsIG5vY3IpIHVuZXNjYXBlKHMpCisjZW5kaWYKK3N0YXRpYyBzaXplX3QgdW5lc2NhcGUoY2hhciAqcywgaW50ICpub2NyKQoreworCWNoYXIgKnN0YXJ0ID0gczsKKwljaGFyICpwID0gczsKKworCXdoaWxlICgqcykgeworCQljaGFyIGMgPSAqczsKKwkJLy8gZG8gd2UgbmVlZCBzcGVjaWFsIHByb2Nlc3Npbmc/CisJCS8vIHN0YW5kYXJkIGVzY2FwZXMgKyBccyBmb3Igc3BhY2UgYW5kIFxOIGZvciBcMAorCQkvLyBcYyBpbmhpYml0cyB0ZXJtaW5hdGluZyBcciBmb3IgY29tbWFuZHMgYW5kIGlzIG5vb3AgZm9yIGV4cGVjdHMKKwkJaWYgKCdcXCcgPT0gYykgeworCQkJYyA9ICorK3M7CisJCQlpZiAoYykgeworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IKKwkJCQlpZiAoJ2MnID09IGMpIHsKKwkJCQkJKm5vY3IgPSAxOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKCdOJyA9PSBjKSB7CisJCQkJCWMgPSAnXDAnOworCQkJCX0gZWxzZSBpZiAoJ3MnID09IGMpIHsKKwkJCQkJYyA9ICcgJzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX05PRkFJTAorCQkJCS8vIHVuZXNjYXBlIGxlYWRpbmcgZGFzaCBvbmx5CisJCQkJLy8gVE9ETzogYW5kIG9ubHkgZm9yIGV4cGVjdCwgbm90IGNvbW1hbmQgc3RyaW5nCisJCQkJfSBlbHNlIGlmICgnLScgPT0gYyAmJiAoc3RhcnQgKyAxID09IHMpKSB7CisJCQkJCS8vYyA9ICctJzsKKyNlbmRpZgorCQkJCX0gZWxzZSB7CisJCQkJCWMgPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgoY29uc3QgY2hhciAqKikmcyk7CisJCQkJCXMtLTsKKwkJCQl9CisJCQl9CisJCS8vIF5BIGJlY29tZXMgXDAwMSwgXkIgLS0gXDAwMiBhbmQgc28gb24uLi4KKwkJfSBlbHNlIGlmICgnXicgPT0gYykgeworCQkJYyA9ICorK3MtJ0AnOworCQl9CisJCS8vIHB1dCB1bmVzY2FwZWQgY2hhcgorCQkqcCsrID0gYzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSCisgbmV4dDoKKyNlbmRpZgorCQkvLyBuZXh0IGNoYXIKKwkJcysrOworCX0KKwkqcCA9ICdcMCc7CisKKwlyZXR1cm4gcCAtIHN0YXJ0OworfQorCitpbnQgY2hhdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2hhdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJlY29yZF9mZCA9IC0xOworCWJvb2wgZWNobyA9IDA7CisJLy8gY29sbGVjdGlvbiBvZiBkZXZpY2UgcmVwbGllcyB3aGljaCBjYXVzZSB1bmNvbmRpdGlvbmFsIHRlcm1pbmF0aW9uCisJbGxpc3RfdCAqYWJvcnRzID0gTlVMTDsKKwkvLyBpbmFjdGl2aXR5IHBlcmlvZAorCWludCB0aW1lb3V0ID0gREVGQVVMVF9DSEFUX1RJTUVPVVQ7CisJLy8gbWF4aW11bSBsZW5ndGggb2YgYWJvcnQgc3RyaW5nCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOCisJc2l6ZV90IG1heF9hYm9ydF9sZW4gPSAwOworI2Vsc2UKKyNkZWZpbmUgbWF4X2Fib3J0X2xlbiBNQVhfQUJPUlRfTEVOCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1RUWV9ISUZJCisJc3RydWN0IHRlcm1pb3MgdGlvMCwgdGlvOworI2VuZGlmCisJLy8gZGlyZWN0aXZlIG5hbWVzCisJZW51bSB7CisJCURJUl9IQU5HVVAgPSAwLAorCQlESVJfQUJPUlQsCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQKKwkJRElSX0NMUl9BQk9SVCwKKyNlbmRpZgorCQlESVJfVElNRU9VVCwKKwkJRElSX0VDSE8sCisJCURJUl9TQVksCisJCURJUl9SRUNPUkQsCisJfTsKKworCS8vIG1ha2UgeCogZnVuY3Rpb25zIGZhaWwgd2l0aCBjb3JyZWN0IGV4aXRjb2RlCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gRVJSX0lPOworCisJLy8gdHJhcCB2YW5pbGxhIHNpZ25hbHMgdG8gcHJldmVudCBwcm9jZXNzIGZyb20gYmVpbmcga2lsbGVkIHN1ZGRlbmx5CisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHSFVQKQorCQkrICgxIDw8IFNJR0lOVCkKKwkJKyAoMSA8PCBTSUdURVJNKQorCQkrICgxIDw8IFNJR1BJUEUpCisJCSwgc2lnbmFsX2hhbmRsZXIpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSQorCXRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZ0aW8pOworCXRpbzAgPSB0aW87CisJY2ZtYWtlcmF3KCZ0aW8pOworCXRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FGTFVTSCwgJnRpbyk7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTCisJZ2V0b3B0MzIoYXJndiwgInZWc1NFIik7CisJYXJndiArPSBvcHRpbmQ7CisjZWxzZQorCWFyZ3YrKzsgLy8gZ290byBmaXJzdCBhcmcKKyNlbmRpZgorCS8vIGhhbmRsZSBjaGF0IGV4cGVjdC1zZW5kIHBhaXJzCisJd2hpbGUgKCphcmd2KSB7CisJCS8vIGRpcmVjdGl2ZSBnaXZlbj8gcHJvY2VzcyBpdAorCQlpbnQga2V5ID0gaW5kZXhfaW5fc3RyaW5ncygKKwkJCSJIQU5HVVBcMCIgIkFCT1JUXDAiCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQKKwkJCSJDTFJfQUJPUlRcMCIKKyNlbmRpZgorCQkJIlRJTUVPVVRcMCIgIkVDSE9cMCIgIlNBWVwwIiAiUkVDT1JEXDAiCisJCQksICphcmd2CisJCSk7CisJCWlmIChrZXkgPj0gMCkgeworCQkJLy8gY2FjaGUgZGlyZWN0aXZlIHZhbHVlCisJCQljaGFyICphcmcgPSAqKythcmd2OworCQkJLy8gT0ZGIC0+IDAsIGFueXRoaW5nIGVsc2UgLT4gMQorCQkJYm9vbCBvbm9mZiA9ICgwICE9IHN0cmNtcCgiT0ZGIiwgYXJnKSk7CisJCQkvLyBwcm9jZXNzIGRpcmVjdGl2ZQorCQkJaWYgKERJUl9IQU5HVVAgPT0ga2V5KSB7CisJCQkJLy8gdHVybiBTSUdIVVAgb24vb2ZmCisJCQkJc2lnbmFsKFNJR0hVUCwgb25vZmYgPyBzaWduYWxfaGFuZGxlciA6IFNJR19JR04pOworCQkJfSBlbHNlIGlmIChESVJfQUJPUlQgPT0ga2V5KSB7CisJCQkJLy8gYXBwZW5kIHRoZSBzdHJpbmcgdG8gYWJvcnQgY29uZGl0aW9ucworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTgorCQkJCXNpemVfdCBsZW4gPSBzdHJsZW4oYXJnKTsKKwkJCQlpZiAobGVuID4gbWF4X2Fib3J0X2xlbikKKwkJCQkJbWF4X2Fib3J0X2xlbiA9IGxlbjsKKyNlbmRpZgorCQkJCWxsaXN0X2FkZF90b19lbmQoJmFib3J0cywgYXJnKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVAorCQkJfSBlbHNlIGlmIChESVJfQ0xSX0FCT1JUID09IGtleSkgeworCQkJCWxsaXN0X3QgKmw7CisJCQkJLy8gcmVtb3ZlIHRoZSBzdHJpbmcgZnJvbSBhYm9ydCBjb25kaXRpb25zCisJCQkJLy8gTi5CLiBnb3R0YSByZWZyZXNoIG1heGltdW0gbGVuZ3RoIHRvby4uLgorIyBpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4KKwkJCQltYXhfYWJvcnRfbGVuID0gMDsKKyMgZW5kaWYKKwkJCQlmb3IgKGwgPSBhYm9ydHM7IGw7IGwgPSBsLT5saW5rKSB7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTgorCQkJCQlzaXplX3QgbGVuID0gc3RybGVuKGwtPmRhdGEpOworIyBlbmRpZgorCQkJCQlpZiAoc3RyY21wKGFyZywgbC0+ZGF0YSkgPT0gMCkgeworCQkJCQkJbGxpc3RfdW5saW5rKCZhYm9ydHMsIGwpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOCisJCQkJCWlmIChsZW4gPiBtYXhfYWJvcnRfbGVuKQorCQkJCQkJbWF4X2Fib3J0X2xlbiA9IGxlbjsKKyMgZW5kaWYKKwkJCQl9CisjZW5kaWYKKwkJCX0gZWxzZSBpZiAoRElSX1RJTUVPVVQgPT0ga2V5KSB7CisJCQkJLy8gc2V0IG5ldyB0aW1lb3V0CisJCQkJLy8gLTEgbWVhbnMgT0ZGCisJCQkJdGltZW91dCA9IGF0b2koYXJnKSAqIDEwMDA7CisJCQkJLy8gMCBtZWFucyBkZWZhdWx0CisJCQkJLy8gPjAgbWVhbnMgdmFsdWUgaW4gbXNlY3MKKwkJCQlpZiAoIXRpbWVvdXQpCisJCQkJCXRpbWVvdXQgPSBERUZBVUxUX0NIQVRfVElNRU9VVDsKKwkJCX0gZWxzZSBpZiAoRElSX0VDSE8gPT0ga2V5KSB7CisJCQkJLy8gdHVybiBlY2hvIG9uL29mZgorCQkJCS8vIE4uQi4gZWNobyBtZWFucyBkdW1waW5nIGRldmljZSBpbnB1dC9vdXRwdXQgdG8gc3RkZXJyCisJCQkJZWNobyA9IG9ub2ZmOworCQkJfSBlbHNlIGlmIChESVJfUkVDT1JEID09IGtleSkgeworCQkJCS8vIHR1cm4gcmVjb3JkIG9uL29mZgorCQkJCS8vIE4uQi4gcmVjb3JkIG1lYW5zIGR1bXBpbmcgZGV2aWNlIGlucHV0IHRvIGEgZmlsZQorCQkJCQkvLyBjbG9zZSBwcmV2aW91cyByZWNvcmRfZmQKKwkJCQlpZiAocmVjb3JkX2ZkID4gMCkKKwkJCQkJY2xvc2UocmVjb3JkX2ZkKTsKKwkJCQkvLyBOLkIuIGRvIHdlIGhhdmUgdG8gZGllIGhlcmUgb24gb3BlbiBlcnJvcj8KKwkJCQlyZWNvcmRfZmQgPSAob25vZmYpID8geG9wZW4oYXJnLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMpIDogLTE7CisJCQl9IGVsc2UgaWYgKERJUl9TQVkgPT0ga2V5KSB7CisJCQkJLy8ganVzdCBwcmludCBhcmd1bWVudCB2ZXJiYXRpbQorCQkJCS8vIFRPRE86IHNob3VsZCB3ZSB1c2UgZnVsbF93cml0ZSgpIHRvIGF2b2lkIHVuaXN0ZC9zdGRpbyBjb25mbGljdD8KKwkJCQliYl9lcnJvcl9tc2coIiVzIiwgYXJnKTsKKwkJCX0KKwkJCS8vIG5leHQsIHBsZWFzZSEKKwkJCWFyZ3YrKzsKKwkJLy8gb3JkaW5hcnkgZXhwZWN0LXNlbmQgcGFpciEKKwkJfSBlbHNlIHsKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCS8vIGRvIGV4cGVjdAorCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJaW50IGV4cGVjdF9sZW47CisJCQlzaXplX3QgYnVmX2xlbiA9IDA7CisJCQlzaXplX3QgbWF4X2xlbiA9IG1heF9hYm9ydF9sZW47CisKKwkJCXN0cnVjdCBwb2xsZmQgcGZkOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfTk9GQUlMCisJCQlpbnQgbm9mYWlsID0gMDsKKyNlbmRpZgorCQkJY2hhciAqZXhwZWN0ID0gKmFyZ3YrKzsKKworCQkJLy8gc2FuaXR5IGNoZWNrOiBzaGFsbCB3ZSByZWFsbHkgZXhwZWN0IHNvbWV0aGluZz8KKwkJCWlmICghZXhwZWN0KQorCQkJCWdvdG8gZXhwZWN0X2RvbmU7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX05PRkFJTAorCQkJLy8gaWYgZXhwZWN0IHN0YXJ0cyB3aXRoIC0KKwkJCWlmICgnLScgPT0gKmV4cGVjdCkgeworCQkJCS8vIHN3YWxsb3cgLQorCQkJCWV4cGVjdCsrOworCQkJCS8vIGFuZCBlbnRlciBub2ZhaWwgbW9kZQorCQkJCW5vZmFpbCsrOworCQkJfQorI2VuZGlmCisKKyNpZmRlZiBfX19URVNUX19fQlVGX19fIC8vIHRlc3QgYmVoYXZpb3VyIHdpdGggYSBzbWFsbCBidWZmZXIKKyMJdW5kZWYgQ09NTU9OX0JVRlNJWkUKKyMJZGVmaW5lIENPTU1PTl9CVUZTSVpFIDYKKyNlbmRpZgorCQkJLy8gZXhwYW5kIGVzY2FwZSBzZXF1ZW5jZXMgaW4gZXhwZWN0CisJCQlleHBlY3RfbGVuID0gdW5lc2NhcGUoZXhwZWN0LCAmZXhwZWN0X2xlbiAvKmR1bW15Ki8pOworCQkJaWYgKGV4cGVjdF9sZW4gPiBtYXhfbGVuKQorCQkJCW1heF9sZW4gPSBleHBlY3RfbGVuOworCQkJLy8gc2FuaXR5IGNoZWNrOgorCQkJLy8gd2Ugc2hvdWxkIGV4cGVjdCBtb3JlIHRoYW4gbm90aGluZyBidXQgbm90IG1vcmUgdGhhbiBpbnB1dCBidWZmZXIKKwkJCS8vIFRPRE86IGxhdGVyIHdlJ2xsIGdldCByaWQgb2YgZml4ZWQtc2l6ZSBidWZmZXIKKwkJCWlmICghZXhwZWN0X2xlbikKKwkJCQlnb3RvIGV4cGVjdF9kb25lOworCQkJaWYgKG1heF9sZW4gPj0gQ09NTU9OX0JVRlNJWkUpIHsKKwkJCQlleGl0Y29kZSA9IEVSUl9NRU07CisJCQkJZ290byBleHBlY3RfZG9uZTsKKwkJCX0KKworCQkJLy8gZ2V0IHJlcGx5CisJCQlwZmQuZmQgPSBTVERJTl9GSUxFTk87CisJCQlwZmQuZXZlbnRzID0gUE9MTElOOworCQkJd2hpbGUgKCFleGl0Y29kZQorCQkJICAgICYmIHBvbGwoJnBmZCwgMSwgdGltZW91dCkgPiAwCisJCQkgICAgJiYgKHBmZC5yZXZlbnRzICYgUE9MTElOKQorCQkJKSB7CisjZGVmaW5lIGJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCQkJCWxsaXN0X3QgKmw7CisJCQkJc3NpemVfdCBkZWx0YTsKKworCQkJCS8vIHJlYWQgbmV4dCBjaGFyIGZyb20gZGV2aWNlCisJCQkJaWYgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIGJ1ZitidWZfbGVuLCAxKSA+IDApIHsKKwkJCQkJLy8gZHVtcCBkZXZpY2UgaW5wdXQgaWYgUkVDT1JEIGZuYW1lCisJCQkJCWlmIChyZWNvcmRfZmQgPiAwKSB7CisJCQkJCQlmdWxsX3dyaXRlKHJlY29yZF9mZCwgYnVmK2J1Zl9sZW4sIDEpOworCQkJCQl9CisJCQkJCS8vIGR1bXAgZGV2aWNlIGlucHV0IGlmIEVDSE8gT04KKwkJCQkJaWYgKGVjaG8gPiAwKSB7CisvLwkJCQkJCWlmIChidWZbYnVmX2xlbl0gPCAnICcpIHsKKy8vCQkJCQkJCWZ1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgIl4iLCAxKTsKKy8vCQkJCQkJCWJ1ZltidWZfbGVuXSArPSAnQCc7CisvLwkJCQkJCX0KKwkJCQkJCWZ1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgYnVmK2J1Zl9sZW4sIDEpOworCQkJCQl9CisJCQkJCWJ1Zl9sZW4rKzsKKwkJCQkJLy8gbW92ZSBpbnB1dCBmcmFtZSBpZiB3ZSd2ZSByZWFjaGVkIGhpZ2hlciBib3VuZAorCQkJCQlpZiAoYnVmX2xlbiA+IENPTU1PTl9CVUZTSVpFKSB7CisJCQkJCQltZW1tb3ZlKGJ1ZiwgYnVmK2J1Zl9sZW4tbWF4X2xlbiwgbWF4X2xlbik7CisJCQkJCQlidWZfbGVuID0gbWF4X2xlbjsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBOLkIuIHJ1bGUgb2YgdGh1bWI6IHZhbHVlcyBiZWluZyBsb29rZWQgZm9yIGNhbgorCQkJCS8vIGJlIGZvdW5kIG9ubHkgYXQgdGhlIGVuZCBvZiBpbnB1dCBidWZmZXIKKwkJCQkvLyB0aGlzIGFsbG93cyB0byBnZXQgcmlkIG9mIHN0cnN0cigpIGFuZCBtZW1tZW0oKQorCisJCQkJLy8gVE9ETzogbWFrZSBleHBlY3QgYW5kIGFib3J0IHN0cmluZ3MgcHJvY2Vzc2VkIHVuaWZvcm1seQorCQkJCS8vIGFib3J0IGNvbmRpdGlvbiBpcyBtZXQ/IC0+IGJhaWwgb3V0CisJCQkJZm9yIChsID0gYWJvcnRzLCBleGl0Y29kZSA9IEVSUl9BQk9SVDsgbDsgbCA9IGwtPmxpbmssICsrZXhpdGNvZGUpIHsKKwkJCQkJc2l6ZV90IGxlbiA9IHN0cmxlbihsLT5kYXRhKTsKKwkJCQkJZGVsdGEgPSBidWZfbGVuLWxlbjsKKwkJCQkJaWYgKGRlbHRhID49IDAgJiYgIW1lbWNtcChidWYrZGVsdGEsIGwtPmRhdGEsIGxlbikpCisJCQkJCQlnb3RvIGV4cGVjdF9kb25lOworCQkJCX0KKwkJCQlleGl0Y29kZSA9IEVSUl9PSzsKKworCQkJCS8vIGV4cGVjdGVkIHJlcGx5IHJlY2VpdmVkPyAtPiBnb3RvIG5leHQgY29tbWFuZAorCQkJCWRlbHRhID0gYnVmX2xlbiAtIGV4cGVjdF9sZW47CisJCQkJaWYgKGRlbHRhID49IDAgJiYgIW1lbWNtcChidWYrZGVsdGEsIGV4cGVjdCwgZXhwZWN0X2xlbikpCisJCQkJCWdvdG8gZXhwZWN0X2RvbmU7CisjdW5kZWYgYnVmCisJCQl9IC8qIHdoaWxlIChoYXZlIGRhdGEpICovCisKKwkJCS8vIGRldmljZSB0aW1lZCBvdXQgb3IgdW5leHBlY3RlZCByZXBseSByZWNlaXZlZAorCQkJZXhpdGNvZGUgPSBFUlJfVElNRU9VVDsKKyBleHBlY3RfZG9uZToKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX05PRkFJTAorCQkJLy8gb24gc3VjY2VzcyBhbmQgd2hlbiBpbiBub2ZhaWwgbW9kZQorCQkJLy8gd2Ugc2hvdWxkIHNraXAgZm9sbG93aW5nIHN1YnNlbmQtc3ViZXhwZWN0IHBhaXJzCisJCQlpZiAobm9mYWlsKSB7CisJCQkJaWYgKCFleGl0Y29kZSkgeworCQkJCQkvLyBmaW5kIGxhc3Qgc2VuZCBiZWZvcmUgbm9uLWRhc2hlZCBleHBlY3QKKwkJCQkJd2hpbGUgKCphcmd2ICYmIGFyZ3ZbMV0gJiYgJy0nID09IGFyZ3ZbMV1bMF0pCisJCQkJCQlhcmd2ICs9IDI7CisJCQkJCS8vIHNraXAgdGhlIHBhaXIKKwkJCQkJLy8gTi5CLiBkbyB3ZSByZWFsbHkgbmVlZCB0aGlzPyEKKwkJCQkJaWYgKCEqYXJndisrIHx8ICEqYXJndisrKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIG5vZmFpbCBtb2RlIGFsc28gY2xlYXJzIGFsbCBidXQgSU8gZXJyb3JzIChvciBzaWduYWxzKQorCQkJCWlmIChFUlJfSU8gIT0gZXhpdGNvZGUpCisJCQkJCWV4aXRjb2RlID0gRVJSX09LOworCQkJfQorI2VuZGlmCisJCQkvLyBiYWlsIG91dCB1bmxlc3Mgd2UgZXhwZWN0ZWQgc3VjY2Vzc2Z1bGx5CisJCQlpZiAoZXhpdGNvZGUpCisJCQkJYnJlYWs7CisKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCS8vIGRvIHNlbmQKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCWlmICgqYXJndikgeworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IKKwkJCQlpbnQgbm9jciA9IDA7IC8vIGluaGliaXQgdGVybWluYXRpbmcgY29tbWFuZCB3aXRoIFxyCisjZW5kaWYKKwkJCQljaGFyICpsb2FkZWQgPSBOVUxMOyAvLyBsb2FkZWQgY29tbWFuZAorCQkJCXNpemVfdCBsZW47CisJCQkJY2hhciAqYnVmID0gKmFyZ3YrKzsKKworCQkJCS8vIGlmIGNvbW1hbmQgc3RhcnRzIHdpdGggQAorCQkJCS8vIGxvYWQgInJlYWwiIGNvbW1hbmQgZnJvbSBmaWxlIG5hbWVkIGFmdGVyIEAKKwkJCQlpZiAoJ0AnID09ICpidWYpIHsKKwkJCQkJLy8gc2tpcCB0aGUgQCBhbmQgYW55IGZvbGxvd2luZyB3aGl0ZS1zcGFjZQorCQkJCQl0cmltKCsrYnVmKTsKKwkJCQkJYnVmID0gbG9hZGVkID0geG1hbGxvY194b3Blbl9yZWFkX2Nsb3NlKGJ1ZiwgTlVMTCk7CisJCQkJfQorCQkJCS8vIGV4cGFuZCBlc2NhcGUgc2VxdWVuY2VzIGluIGNvbW1hbmQKKwkJCQlsZW4gPSB1bmVzY2FwZShidWYsICZub2NyKTsKKworCQkJCS8vIHNlbmQgY29tbWFuZAorCQkJCWFsYXJtKHRpbWVvdXQpOworCQkJCXBmZC5mZCA9IFNURE9VVF9GSUxFTk87CisJCQkJcGZkLmV2ZW50cyA9IFBPTExPVVQ7CisJCQkJd2hpbGUgKGxlbiAmJiAhZXhpdGNvZGUKKwkJCQkgICAgJiYgcG9sbCgmcGZkLCAxLCAtMSkgPiAwCisJCQkJICAgICYmIChwZmQucmV2ZW50cyAmIFBPTExPVVQpCisJCQkJKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVMKKwkJCQkJLy8gIlxcZCIgbWVhbnMgMSBzZWMgZGVsYXksICJcXHAiIG1lYW5zIDAuMDEgc2VjIGRlbGF5CisJCQkJCS8vICJcXEsiIG1lYW5zIHNlbmQgQlJFQUsKKwkJCQkJY2hhciBjID0gKmJ1ZjsKKwkJCQkJaWYgKCdcXCcgPT0gYykgeworCQkJCQkJYyA9ICorK2J1ZjsKKwkJCQkJCWlmICgnZCcgPT0gYykgeworCQkJCQkJCXNsZWVwKDEpOworCQkJCQkJCWxlbi0tOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJaWYgKCdwJyA9PSBjKSB7CisJCQkJCQkJdXNsZWVwKDEwMDAwKTsKKwkJCQkJCQlsZW4tLTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCWlmICgnSycgPT0gYykgeworCQkJCQkJCXRjc2VuZGJyZWFrKFNURE9VVF9GSUxFTk8sIDApOworCQkJCQkJCWxlbi0tOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJYnVmLS07CisJCQkJCX0KKwkJCQkJaWYgKHNhZmVfd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCAxKSAhPSAxKQorCQkJCQkJYnJlYWs7CisJCQkJCWxlbi0tOworCQkJCQlidWYrKzsKKyNlbHNlCisJCQkJCWxlbiAtPSBmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiwgbGVuKTsKKyNlbmRpZgorCQkJCX0gLyogd2hpbGUgKGNhbiB3cml0ZSkgKi8KKwkJCQlhbGFybSgwKTsKKworCQkJCS8vIHJlcG9ydCBJL08gZXJyb3IgaWYgdGhlcmUgc3RpbGwgZXhpc3RzIGF0IGxlYXN0IG9uZSBub24tc2VudCBjaGFyCisJCQkJaWYgKGxlbikKKwkJCQkJZXhpdGNvZGUgPSBFUlJfSU87CisKKwkJCQkvLyBmcmVlIGxvYWRlZCBjb21tYW5kIChpZiBhbnkpCisJCQkJaWYgKGxvYWRlZCkKKwkJCQkJZnJlZShsb2FkZWQpOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IKKwkJCQkvLyBvciB0ZXJtaW5hdGUgY29tbWFuZCB3aXRoIFxyIChpZiBub3QgaW5oaWJpdGVkKQorCQkJCWVsc2UgaWYgKCFub2NyKQorCQkJCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgIlxyIiwgMSk7CisjZW5kaWYKKwkJCQkvLyBiYWlsIG91dCB1bmxlc3Mgd2Ugc2VudCBjb21tYW5kIHN1Y2Nlc3NmdWxseQorCQkJCWlmIChleGl0Y29kZSkKKwkJCQkJYnJlYWs7CisJCQl9IC8qIGlmICgqYXJndikgKi8KKwkJfQorCX0gLyogd2hpbGUgKCphcmd2KSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSQorCXRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FGTFVTSCwgJnRpbzApOworI2VuZGlmCisKKwlyZXR1cm4gZXhpdGNvZGU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvY2hydC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2NocnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWI1Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2NocnQuYwpAQCAtMCwwICsxLDE0MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY2hydCAtIG1hbmlwdWxhdGUgcmVhbC10aW1lIGF0dHJpYnV0ZXMgb2YgYSBwcm9jZXNzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaHJ0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXByZm9tXSBbUFJJT10gW1BJRCB8IFBST0cgQVJHU10iCisvL3VzYWdlOiNkZWZpbmUgY2hydF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSBzY2hlZHVsaW5nIHByaW9yaXR5IGFuZCBjbGFzcyBmb3IgYSBwcm9jZXNzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1wCU9wZXJhdGUgb24gUElEIgorLy91c2FnZTogICAgICJcbgktcglTZXQgU0NIRURfUlIgY2xhc3MiCisvL3VzYWdlOiAgICAgIlxuCS1mCVNldCBTQ0hFRF9GSUZPIGNsYXNzIgorLy91c2FnZTogICAgICJcbgktbwlTZXQgU0NIRURfT1RIRVIgY2xhc3MiCisvL3VzYWdlOiAgICAgIlxuCS1tCVNob3cgbWluL21heCBwcmlvcml0aWVzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjaHJ0X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGNocnQgLXIgNCBzbGVlcCA5MDA7IHg9JCFcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGNocnQgLWYgLXAgMyAkeFxuIgorLy91c2FnZTogICAgICAgIllvdSBuZWVkIENBUF9TWVNfTklDRSBwcml2aWxlZ2VzIHRvIHNldCBzY2hlZHVsaW5nIGF0dHJpYnV0ZXMgb2YgYSBwcm9jZXNzIgorCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmbmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI3dhcm5pbmcgeW91ciBzeXN0ZW0gbWF5IGJlIGZvb2JhcmVkCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IHBvbGljeTsKKwljaGFyIG5hbWVbc2l6ZW9mKCJTQ0hFRF9PVEhFUiIpXTsKK30gcG9saWNpZXNbXSA9IHsKKwl7U0NIRURfT1RIRVIsICJTQ0hFRF9PVEhFUiJ9LAorCXtTQ0hFRF9GSUZPLCAiU0NIRURfRklGTyJ9LAorCXtTQ0hFRF9SUiwgIlNDSEVEX1JSIn0KK307CisKKy8vVE9ETzogYWRkCisvLyAtYiwgU0NIRURfQkFUQ0gKKy8vIC1pLCBTQ0hFRF9JRExFCisKK3N0YXRpYyB2b2lkIHNob3dfbWluX21heChpbnQgcG9sKQoreworCWNvbnN0IGNoYXIgKmZtdCA9ICIlcyBtaW4vbWF4IHByaW9yaXR5XHQ6ICV1LyV1XG4iOworCWludCBtYXgsIG1pbjsKKworCW1heCA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgocG9sKTsKKwltaW4gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHBvbCk7CisJaWYgKChtYXh8bWluKSA8IDApCisJCWZtdCA9ICIlcyBub3Qgc3VwcG9ydGVkXG4iOworCXByaW50ZihmbXQsIHBvbGljaWVzW3BvbF0ubmFtZSwgbWluLCBtYXgpOworfQorCisjZGVmaW5lIE9QVF9tICgxPDwwKQorI2RlZmluZSBPUFRfcCAoMTw8MSkKKyNkZWZpbmUgT1BUX3IgKDE8PDIpCisjZGVmaW5lIE9QVF9mICgxPDwzKQorI2RlZmluZSBPUFRfbyAoMTw8NCkKKworaW50IGNocnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNocnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXBpZF90IHBpZCA9IDA7CisJdW5zaWduZWQgb3B0OworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKwljaGFyICpwaWRfc3RyOworCWNoYXIgKnByaW9yaXR5ID0gcHJpb3JpdHk7IC8qIGZvciBjb21waWxlciAqLworCWNvbnN0IGNoYXIgKmN1cnJlbnRfbmV3OworCWludCBwb2xpY3kgPSBTQ0hFRF9SUjsKKworCS8qIG9ubHkgb25lIHBvbGljeSBhY2NlcHRlZCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gInItLWZvOmYtLXJvOm8tLXJmIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK21wcmZvIik7CisJaWYgKG9wdCAmIE9QVF9tKSB7IC8qIHByaW50IG1pbi9tYXggYW5kIGV4aXQgKi8KKwkJc2hvd19taW5fbWF4KFNDSEVEX0ZJRk8pOworCQlzaG93X21pbl9tYXgoU0NIRURfUlIpOworCQlzaG93X21pbl9tYXgoU0NIRURfT1RIRVIpOworCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCWlmIChvcHQgJiBPUFRfcikKKwkJcG9saWN5ID0gU0NIRURfUlI7CisJaWYgKG9wdCAmIE9QVF9mKQorCQlwb2xpY3kgPSBTQ0hFRF9GSUZPOworCWlmIChvcHQgJiBPUFRfbykKKwkJcG9saWN5ID0gU0NIRURfT1RIRVI7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAob3B0ICYgT1BUX3ApIHsKKwkJcGlkX3N0ciA9ICphcmd2Kys7CisJCWlmICgqYXJndikgeyAvKiAiLXAgPHByaW9yaXR5PiA8cGlkPiBbLi4uXSIgKi8KKwkJCXByaW9yaXR5ID0gcGlkX3N0cjsKKwkJCXBpZF9zdHIgPSAqYXJndjsKKwkJfQorCQkvKiBlbHNlICItcCA8cGlkPiIsIGFuZCAqYXJndiA9PSBOVUxMICovCisJCXBpZCA9IHhhdG91bF9yYW5nZShwaWRfc3RyLCAxLCAoKHVuc2lnbmVkKShwaWRfdClVTE9OR19NQVgpID4+IDEpOworCX0gZWxzZSB7CisJCXByaW9yaXR5ID0gKmFyZ3YrKzsKKwkJaWYgKCEqYXJndikKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwljdXJyZW50X25ldyA9ICJjdXJyZW50XDBuZXciOworCWlmIChvcHQgJiBPUFRfcCkgeworCQlpbnQgcG9sOworIHByaW50X3J0X2luZm86CisJCXBvbCA9IHNjaGVkX2dldHNjaGVkdWxlcihwaWQpOworCQlpZiAocG9sIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJWNldCBwaWQgJWQncyBwb2xpY3kiLCAnZycsIChpbnQpcGlkKTsKKwkJcHJpbnRmKCJwaWQgJWQncyAlcyBzY2hlZHVsaW5nIHBvbGljeTogJXNcbiIsCisJCQkJcGlkLCBjdXJyZW50X25ldywgcG9saWNpZXNbcG9sXS5uYW1lKTsKKwkJaWYgKHNjaGVkX2dldHBhcmFtKHBpZCwgJnNwKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IHBpZCAlZCdzIGF0dHJpYnV0ZXMiLCAoaW50KXBpZCk7CisJCXByaW50ZigicGlkICVkJ3MgJXMgc2NoZWR1bGluZyBwcmlvcml0eTogJWRcbiIsCisJCQkJKGludClwaWQsIGN1cnJlbnRfbmV3LCBzcC5zY2hlZF9wcmlvcml0eSk7CisJCWlmICghKmFyZ3YpIHsKKwkJCS8qIEVpdGhlciBpdCB3YXMganVzdCAiLXAgPHBpZD4iLAorCQkJICogb3IgaXQgd2FzICItcCA8cHJpb3JpdHk+IDxwaWQ+IiBhbmQgd2UgY2FtZSBoZXJlCisJCQkgKiBmb3IgdGhlIHNlY29uZCB0aW1lIChzZWUgZ290byBiZWxvdykgKi8KKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJKmFyZ3YgPSBOVUxMOworCQljdXJyZW50X25ldyArPSA4OworCX0KKworCS8qIGZyb20gdGhlIG1hbnBhZ2Ugb2Ygc2NoZWRfZ2V0c2NoZWR1bGVyOgorCVsuLi5dIHNjaGVkX3ByaW9yaXR5IGNhbiBoYXZlIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAgdG8gOTkuCisJWy4uLl0gU0NIRURfT1RIRVIgb3IgU0NIRURfQkFUQ0ggbXVzdCBiZSBhc3NpZ25lZCBzdGF0aWMgcHJpb3JpdHkgMC4KKwlbLi4uXSBTQ0hFRF9GSUZPIG9yIFNDSEVEX1JSIGNhbiBoYXZlIHN0YXRpYyBwcmlvcml0eSBpbiAxLi45OSByYW5nZS4KKwkqLworCXNwLnNjaGVkX3ByaW9yaXR5ID0geHN0cnRvdV9yYW5nZShwcmlvcml0eSwgMCwgcG9saWN5ICE9IFNDSEVEX09USEVSID8gMSA6IDAsIDk5KTsKKworCWlmIChzY2hlZF9zZXRzY2hlZHVsZXIocGlkLCBwb2xpY3ksICZzcCkgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0ICVjZXQgcGlkICVkJ3MgcG9saWN5IiwgJ3MnLCAoaW50KXBpZCk7CisKKwlpZiAoIWFyZ3ZbMF0pIC8qICItcCA8cHJpb3JpdHk+IDxwaWQ+IFsuLi5dIiAqLworCQlnb3RvIHByaW50X3J0X2luZm87CisKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2NvbnNweS5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2NvbnNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2MzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvY29uc3B5LmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEEgdGV4dC1tb2RlIFZOQyBsaWtlIHByb2dyYW0gZm9yIExpbnV4IHZpcnR1YWwgdGVybWluYWxzLgorICoKKyAqIHBhc2NhbC5iZWxsYXJkQGFkcy1sdS5jb20KKyAqCisgKiBCYXNlZCBvbiBSdXNzZWxsIFN0dWFydCdzIGNvbnNweS5jCisgKiAgIGh0dHA6Ly9hY2UtaG9zdC5zdHVhcnQuaWQuYXUvcnVzc2VsbC9maWxlcy9jb25zcHkuYworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfQ09OU1BZKEFQUExFVChjb25zcHksIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19DT05TUFkpICs9IGNvbnNweS5vCisKKy8vY29uZmlnOmNvbmZpZyBDT05TUFkKKy8vY29uZmlnOglib29sICJjb25zcHkiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQSB0ZXh0LW1vZGUgVk5DIGxpa2UgcHJvZ3JhbSBmb3IgTGludXggdmlydHVhbCB0ZXJtaW5hbHMuCisvL2NvbmZpZzoJICBleGFtcGxlOiAgY29uc3B5IE5VTSAgICAgIHNoYXJlZCBhY2Nlc3MgdG8gY29uc29sZSBudW0KKy8vY29uZmlnOgkgIG9yICAgICAgICBjb25zcHkgLW5kIE5VTSAgc2NyZWVuc2hvdCBvZiBjb25zb2xlIG51bQorLy9jb25maWc6CSAgb3IgICAgICAgIGNvbnNweSAtY3MgTlVNICBwb29yIG1hbidzIEdOVSBzY3JlZW4gbGlrZQorCisvL3VzYWdlOiNkZWZpbmUgY29uc3B5X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLXZjc25kZl0gWy14IENPTF0gWy15IExJTkVdIFtDT05TT0xFX05PXSIKKy8vdXNhZ2U6I2RlZmluZSBjb25zcHlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAiQSB0ZXh0LW1vZGUgVk5DIGxpa2UgcHJvZ3JhbSBmb3IgTGludXggdmlydHVhbCBjb25zb2xlcy4iCisvL3VzYWdlOiAgICAgIlxuVG8gZXhpdCwgcXVpY2tseSBwcmVzcyBFU0MgMyB0aW1lcy4iCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbgktdglEb24ndCBzZW5kIGtleXN0cm9rZXMgdG8gdGhlIGNvbnNvbGUiCisvL3VzYWdlOiAgICAgIlxuCS1jCUNyZWF0ZSBtaXNzaW5nIGRldmljZXMgaW4gL2RldiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJT3BlbiBhIFNIRUxMIHNlc3Npb24iCisvL3VzYWdlOiAgICAgIlxuCS1uCUJsYWNrICYgd2hpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1kCUR1bXAgY29uc29sZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvbGxvdyBjdXJzb3IiCisvL3VzYWdlOiAgICAgIlxuCS14IENPTAlTdGFydGluZyBjb2x1bW4iCisvL3VzYWdlOiAgICAgIlxuCS15IExJTkUJU3RhcnRpbmcgbGluZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL2tkLmg+CisKKworI2RlZmluZSBFU0MgIlwwMzMiCisKK3N0cnVjdCBzY3JlZW5faW5mbyB7CisJdW5zaWduZWQgY2hhciBsaW5lcywgY29scywgY3Vyc29yX3gsIGN1cnNvcl95OworfTsKKworI2RlZmluZSBDSEFSKHgpICgqKHVpbnQ4X3QqKSh4KSkKKyNkZWZpbmUgQVRUUih4KSAoKCh1aW50OF90KikoeCkpWzFdKQorI2RlZmluZSBORVhUKHgpICgoeCkgKz0gMikKKyNkZWZpbmUgREFUQSh4KSAoKih1aW50MTZfdCopKHgpKQorCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciogZGF0YTsKKwlpbnQgc2l6ZTsKKwlpbnQgeCwgeTsKKwlpbnQga2JkX2ZkOworCWludCBpb2Vycm9yX2NvdW50OworCWludCBrZXlfY291bnQ7CisJaW50IGVzY2FwZV9jb3VudDsKKwlpbnQgbm9rZXlzOworCWludCBjdXJyZW50OworCWludCBmaXJzdF9saW5lX29mZnNldDsKKwlpbnQgbGFzdF9hdHRyOworCS8vIGNhY2hlZCBsb2NhbCB0dHkgcGFyYW1ldGVycworCXVuc2lnbmVkIHdpZHRoOworCXVuc2lnbmVkIGhlaWdodDsKKwl1bnNpZ25lZCBjb2w7CisJdW5zaWduZWQgbGluZTsKKwlzbWFsbGludCBjdXJvZmY7IC8vIHVua25vd246MCBjdXJzb3Igb246LTEgY3Vyc29yIG9mZjoxCisJY2hhciBhdHRyYnVmW3NpemVvZihFU0MiWzA7MTs1OzMwOzQwbSIpXTsKKwkvLyByZW1vdGUgY29uc29sZQorCXN0cnVjdCBzY3JlZW5faW5mbyByZW1vdGU7CisJLy8gc2F2ZWQgbG9jYWwgdHR5IHRlcm1pbmZvCisJc3RydWN0IHRlcm1pb3MgdGVybV9vcmlnOworCWNoYXIgdmNzYV9uYW1lW3NpemVvZigiL2Rldi92Y3NhTk4iKV07Cit9OworCisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlHLmF0dHJidWZbMF0gPSAnXDAzMyc7IFwKKwlHLmF0dHJidWZbMV0gPSAnWyc7IFwKKwlHLndpZHRoID0gRy5oZWlnaHQgPSBVSU5UX01BWDsgXAorCUcubGFzdF9hdHRyLS07IFwKK30gd2hpbGUgKDApCisKK2VudW0geworCUZMQUdfdiwgIC8vIHZpZXcgb25seQorCUZMQUdfYywgIC8vIGNyZWF0ZSBkZXZpY2UgaWYgbmVlZAorCUZMQUdfcywgIC8vIHNlc3Npb24KKwlGTEFHX24sICAvLyBubyBjb2xvcnMKKwlGTEFHX2QsICAvLyBkdW1wIHNjcmVlbgorCUZMQUdfZiwgIC8vIGZvbGxvdyBjdXJzb3IKK307CisjZGVmaW5lIEZMQUcoeCkgKDEgPDwgRkxBR18jI3gpCisjZGVmaW5lIEJXIChvcHRpb25fbWFzazMyICYgRkxBRyhuKSkKKworc3RhdGljIHZvaWQgY2xyc2NyKHZvaWQpCit7CisJLy8gSG9tZSwgY2xlYXIgdGlsbCBlbmQgb2Ygc2NyZWVuCisJZnB1dHMoRVNDIlsxOzFIIiBFU0MiW0oiLCBzdGRvdXQpOworCUcuY29sID0gRy5saW5lID0gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2N1cnNvcihpbnQgc3RhdGUpCit7CisJaWYgKEcuY3Vyb2ZmICE9IHN0YXRlKSB7CisJCUcuY3Vyb2ZmID0gc3RhdGU7CisJCWZwdXRzKEVTQyJbPzI1Iiwgc3Rkb3V0KTsKKwkJYmJfcHV0Y2hhcigiaD9sIlsxICsgc3RhdGVdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdvdG94eShpbnQgY29sLCBpbnQgbGluZSkKK3sKKwlpZiAoRy5jb2wgIT0gY29sIHx8IEcubGluZSAhPSBsaW5lKSB7CisJCUcuY29sID0gY29sOworCQlHLmxpbmUgPSBsaW5lOworCQlwcmludGYoRVNDIlsldTsldUgiLCBsaW5lICsgMSwgY29sICsgMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwKGludCBjb2RlKQoreworCXNldF9jdXJzb3IoLTEpOyAvLyBjdXJzb3Igb24KKwl0Y3NldGF0dHIoRy5rYmRfZmQsIFRDU0FOT1csICZHLnRlcm1fb3JpZyk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWNsb3NlKEcua2JkX2ZkKTsKKwl9CisJLy8gUmVzZXQgYXR0cmlidXRlcworCWlmICghQlcpCisJCWZwdXRzKEVTQyJbMG0iLCBzdGRvdXQpOworCWJiX3B1dGNoYXIoJ1xuJyk7CisJaWYgKGNvZGUgPiAxKQorCQlraWxsX215c2VsZl93aXRoX3NpZyhjb2RlKTsKKwlleGl0KGNvZGUpOworfQorCitzdGF0aWMgdm9pZCBzY3JlZW5fcmVhZF9jbG9zZSh2b2lkKQoreworCXVuc2lnbmVkIGksIGo7CisJaW50IHZjc2FfZmQ7CisJY2hhciAqZGF0YTsKKworCS8vIENsb3NlICYgcmUtb3BlbiB2Y3NhIGluIGNhc2UgdGhleSBoYXZlIHN3YXBwZWQgdmlydHVhbCBjb25zb2xlcworCXZjc2FfZmQgPSB4b3BlbihHLnZjc2FfbmFtZSwgT19SRE9OTFkpOworCXhyZWFkKHZjc2FfZmQsICZHLnJlbW90ZSwgNCk7CisJaSA9IEcucmVtb3RlLmNvbHMgKiAyOworCUcuZmlyc3RfbGluZV9vZmZzZXQgPSBHLnkgKiBpOworCWkgKj0gRy5yZW1vdGUubGluZXM7CisJaWYgKEcuZGF0YSA9PSBOVUxMKSB7CisJCUcuc2l6ZSA9IGk7CisJCUcuZGF0YSA9IHh6YWxsb2MoMiAqIGkpOworCX0KKwllbHNlIGlmIChHLnNpemUgIT0gaSkgeworCQljbGVhbnVwKDEpOworCX0KKwlkYXRhID0gRy5kYXRhICsgRy5jdXJyZW50OworCXhyZWFkKHZjc2FfZmQsIGRhdGEsIEcuc2l6ZSk7CisJY2xvc2UodmNzYV9mZCk7CisJZm9yIChpID0gMDsgaSA8IEcucmVtb3RlLmxpbmVzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEcucmVtb3RlLmNvbHM7IGorKywgTkVYVChkYXRhKSkgeworCQkJdW5zaWduZWQgeCA9IGogLSBHLng7IC8vIGlmIHdpbGwgY2F0Y2ggaiA8IEcueCB0b28KKwkJCXVuc2lnbmVkIHkgPSBpIC0gRy55OyAvLyBpZiB3aWxsIGNhdGNoIGkgPCBHLnkgdG9vCisKKwkJCWlmIChDSEFSKGRhdGEpIDwgJyAnKQorCQkJCUNIQVIoZGF0YSkgPSAnICc7CisJCQlpZiAoeSA+PSBHLmhlaWdodCB8fCB4ID49IEcud2lkdGgpCisJCQkJREFUQShkYXRhKSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjcmVlbl9jaGFyKGNoYXIgKmRhdGEpCit7CisJaWYgKCFCVykgeworCQl1aW50OF90IGF0dHIgPSBBVFRSKGRhdGEpOworCQkvL3VpbnQ4X3QgYXR0ciA9IEFUVFIoZGF0YSkgPj4gMTsgLy8gZm9yIGZyYW1lYnVmZmVyIGNvbnNvbGUKKwkJdWludDhfdCBhdHRyX2RpZmYgPSBHLmxhc3RfYXR0ciBeIGF0dHI7CisKKwkJaWYgKGF0dHJfZGlmZikgeworLy8gQXR0cmlidXRlIGxheW91dCBmb3IgVkdBIGNvbXBhdGlibGUgdGV4dCB2aWRlb2J1ZmZlcjoKKy8vIGJsaW5raW5nIHRleHQKKy8vIHxyZWQgYmtnZAorLy8gfHxncmVlbiBia2dkCisvLyB8fHxibHVlIGJrZ2QKKy8vIHZ2dnYKKy8vIDAwMDAwMDAwIDwtIGxzYiBiaXQgb24gdGhlIHJpZ2h0CisvLyAgICAgYm9sZCB0ZXh0IC8gdGV4dCA4dGggYml0CisvLyAgICAgIHJlZCB0ZXh0CisvLyAgICAgICBncmVlbiB0ZXh0CisvLyAgICAgICAgYmx1ZSB0ZXh0CisvLyBUT0RPOiBhcHBhcmVudGx5IGZyYW1lYnVmZmVyLWJhc2VkIGNvbnNvbGUgdXNlcyBkaWZmZXJlbnQgbGF5b3V0CisvLyAoYnVnPyBhdHRlbXB0IHRvIGdldCA4dGggdGV4dCBiaXQgaW4gYmV0dGVyIHBvc2l0aW9uPykKKy8vIHJlZCBia2dkCisvLyB8Z3JlZW4gYmtnZAorLy8gfHxibHVlIGJrZ2QKKy8vIHZ2dgorLy8gMDAwMDAwMDAgPC0gbHNiIGJpdCBvbiB0aGUgcmlnaHQKKy8vICAgIGJvbGQgdGV4dAorLy8gICAgIHJlZCB0ZXh0CisvLyAgICAgIGdyZWVuIHRleHQKKy8vICAgICAgIGJsdWUgdGV4dAorLy8gICAgICAgIHRleHQgOHRoIGJpdAorCQkJLy8gY29udmVydGluZyBSR0IgY29sb3IgYml0IHRyaWFkIHRvIEJHUjoKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGNvbG9yWzhdID0gIjA0MjYxNTM3IjsKKwkJCWNvbnN0IHVpbnQ4X3QgZmdfbWFzayA9IDB4MDcsIGJvbGRfbWFzayAgPSAweDA4OworCQkJY29uc3QgdWludDhfdCBiZ19tYXNrID0gMHg3MCwgYmxpbmtfbWFzayA9IDB4ODA7CisJCQljaGFyICpwdHI7CisKKwkJCXB0ciA9IEcuYXR0cmJ1ZiArIDI7IC8vIHNraXAgIkVTQyBbIgorCisJCQkvLyAoRy5sYXN0X2F0dHIgJiB+YXR0cikgaGFzIDEgb25seSB3aGVyZQorCQkJLy8gRy5sYXN0X2F0dHIgaGFzIDEgYnV0IGF0dHIgaGFzIDAuCisJCQkvLyBIZXJlIHdlIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0cmFuc2l0aW9uCisJCQkvLyBib2xkLT5ub24tYm9sZCBvciBibGluay0+bm9uLWJsaW5rOgorCQkJaWYgKEcubGFzdF9hdHRyIDwgMCAgLy8gaW5pdGlhbCB2YWx1ZQorCQkJIHx8ICgoRy5sYXN0X2F0dHIgJiB+YXR0cikgJiAoYm9sZF9tYXNrIHwgYmxpbmtfbWFzaykpICE9IDAKKwkJCSkgeworCQkJCSpwdHIrKyA9ICcwJzsgLy8gInJlc2V0IGFsbCBhdHRycyIKKwkJCQkqcHRyKysgPSAnOyc7CisJCQkJLy8gbXVzdCBzZXQgZmcgJiBiZywgbWF5YmUgbmVlZCB0byBzZXQgYm9sZCBvciBibGluazoKKwkJCQlhdHRyX2RpZmYgPSBhdHRyIHwgfihib2xkX21hc2sgfCBibGlua19tYXNrKTsKKwkJCX0KKwkJCUcubGFzdF9hdHRyID0gYXR0cjsKKwkJCWlmIChhdHRyX2RpZmYgJiBib2xkX21hc2spIHsKKwkJCQkqcHRyKysgPSAnMSc7CisJCQkJKnB0cisrID0gJzsnOworCQkJfQorCQkJaWYgKGF0dHJfZGlmZiAmIGJsaW5rX21hc2spIHsKKwkJCQkqcHRyKysgPSAnNSc7CisJCQkJKnB0cisrID0gJzsnOworCQkJfQorCQkJaWYgKGF0dHJfZGlmZiAmIGZnX21hc2spIHsKKwkJCQkqcHRyKysgPSAnMyc7CisJCQkJKnB0cisrID0gY29sb3JbYXR0ciAmIGZnX21hc2tdOworCQkJCSpwdHIrKyA9ICc7JzsKKwkJCX0KKwkJCWlmIChhdHRyX2RpZmYgJiBiZ19tYXNrKSB7CisJCQkJKnB0cisrID0gJzQnOworCQkJCSpwdHIrKyA9IGNvbG9yWyhhdHRyICYgYmdfbWFzaykgPj4gNF07CisJCQkJKnB0cisrID0gJzsnOworCQkJfQorCQkJaWYgKHB0ciAhPSBHLmF0dHJidWYgKyAyKSB7CisJCQkJcHRyWy0xXSA9ICdtJzsKKwkJCQkqcHRyID0gJ1wwJzsKKwkJCQlmcHV0cyhHLmF0dHJidWYsIHN0ZG91dCk7CisJCQl9CisJCX0KKwl9CisJcHV0Y2hhcihDSEFSKGRhdGEpKTsKKwlHLmNvbCsrOworfQorCitzdGF0aWMgdm9pZCBzY3JlZW5fZHVtcCh2b2lkKQoreworCWludCBsaW5lZmVlZF9jbnQ7CisJaW50IGxpbmUsIGNvbDsKKwlpbnQgbGluZWNudCA9IEcucmVtb3RlLmxpbmVzIC0gRy55OworCWNoYXIgKmRhdGEgPSBHLmRhdGEgKyBHLmN1cnJlbnQgKyBHLmZpcnN0X2xpbmVfb2Zmc2V0OworCisJbGluZWZlZWRfY250ID0gMDsKKwlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbGluZWNudCAmJiBsaW5lIDwgRy5oZWlnaHQ7IGxpbmUrKykgeworCQlpbnQgc3BhY2VfY250ID0gMDsKKwkJZm9yIChjb2wgPSAwOyBjb2wgPCBHLnJlbW90ZS5jb2xzOyBjb2wrKywgTkVYVChkYXRhKSkgeworCQkJdW5zaWduZWQgdHR5X2NvbCA9IGNvbCAtIEcueDsgLy8gaWYgd2lsbCBjYXRjaCBjb2wgPCBHLnggdG9vCisKKwkJCWlmICh0dHlfY29sID49IEcud2lkdGgpCisJCQkJY29udGludWU7CisJCQlzcGFjZV9jbnQrKzsKKwkJCWlmIChCVyAmJiBDSEFSKGRhdGEpID09ICcgJykKKwkJCQljb250aW51ZTsKKwkJCXdoaWxlIChsaW5lZmVlZF9jbnQgIT0gMCkgeworCQkJCS8vYmJfcHV0Y2hhcignXHInKTsgLSB0dHkgZHJpdmVyIGRvZXMgaXQgZm9yIHVzCisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCQlsaW5lZmVlZF9jbnQtLTsKKwkJCX0KKwkJCXdoaWxlICgtLXNwYWNlX2NudCkKKwkJCQliYl9wdXRjaGFyKCcgJyk7CisJCQlzY3JlZW5fY2hhcihkYXRhKTsKKwkJfQorCQlsaW5lZmVlZF9jbnQrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGN1cm1vdmUodm9pZCkKK3sKKwl1bnNpZ25lZCBjeCA9IEcucmVtb3RlLmN1cnNvcl94IC0gRy54OworCXVuc2lnbmVkIGN5ID0gRy5yZW1vdGUuY3Vyc29yX3kgLSBHLnk7CisJaW50IGN1cnNvciA9IDE7CisKKwlpZiAoY3ggPCBHLndpZHRoICYmIGN5IDwgRy5oZWlnaHQpIHsKKwkJZ290b3h5KGN4LCBjeSk7CisJCWN1cnNvciA9IC0xOworCX0KKwlzZXRfY3Vyc29yKGN1cnNvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9jZGV2X2lmX2RvZXNudF9leGlzdChjb25zdCBjaGFyKiBuYW1lLCBkZXZfdCBkZXYpCit7CisJaW50IGZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkICE9IC0xKQorCQljbG9zZShmZCk7CisJZWxzZSBpZiAoZXJybm8gPT0gRU5PRU5UKQorCQlta25vZChuYW1lLCBTX0lGQ0hSIHwgMDY2MCwgZGV2KTsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgc3RhcnRfc2hlbGxfaW5fY2hpbGQoY29uc3QgY2hhciogdHR5X25hbWUpCit7CisJaW50IHBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQlzdHJ1Y3QgdGVybWlvcyB0ZXJtY2hpbGQ7CisJCWNvbnN0IGNoYXIgKnNoZWxsID0gZ2V0X3NoZWxsX25hbWUoKTsKKworCQlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKwkJLy8gc2V0IHR0eSBhcyBhIGNvbnRyb2xsaW5nIHR0eQorCQlzZXRzaWQoKTsKKwkJLy8gbWFrZSB0dHkgdG8gYmUgaW5wdXQsIG91dHB1dCwgZXJyb3IKKwkJY2xvc2UoMCk7CisJCXhvcGVuKHR0eV9uYW1lLCBPX1JEV1IpOyAvLyB1c2VzIGZkIDAKKwkJeGR1cDIoMCwgMSk7CisJCXhkdXAyKDAsIDIpOworCQlpb2N0bCgwLCBUSU9DU0NUVFksIDEpOworCQl0Y3NldHBncnAoMCwgZ2V0cGlkKCkpOworCQl0Y2dldGF0dHIoMCwgJnRlcm1jaGlsZCk7CisJCXRlcm1jaGlsZC5jX2xmbGFnIHw9IEVDSE87CisJCXRlcm1jaGlsZC5jX29mbGFnIHw9IE9OTENSIHwgWFRBQlM7CisJCXRlcm1jaGlsZC5jX2lmbGFnIHw9IElDUk5MOworCQl0ZXJtY2hpbGQuY19pZmxhZyAmPSB+SVhPRkY7CisJCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0ZXJtY2hpbGQpOworCQlleGVjbChzaGVsbCwgc2hlbGwsICItaSIsIChjaGFyICopIE5VTEwpOworCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKHNoZWxsKTsKKwl9Cit9CisKK2ludCBjb25zcHlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNvbnNweV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciB0dHlfbmFtZVtzaXplb2YoIi9kZXYvdHR5Tk4iKV07CisjZGVmaW5lIGtleWJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCXN0cnVjdCB0ZXJtaW9zIHRlcm1idWY7CisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCB0dHludW07CisJaW50IHBvbGxfdGltZW91dF9tczsKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgZ2V0b3B0X2xvbmdvcHRzW10gQUxJR04xID0KKwkJInZpZXdvbmx5XDAiICAgICBOb19hcmd1bWVudCAidiIKKwkJImNyZWF0ZWRldmljZVwwIiBOb19hcmd1bWVudCAiYyIKKwkJInNlc3Npb25cMCIgICAgICBOb19hcmd1bWVudCAicyIKKwkJIm5vY29sb3JzXDAiICAgICBOb19hcmd1bWVudCAibiIKKwkJImR1bXBcMCIgICAgICAgICBOb19hcmd1bWVudCAiZCIKKwkJImZvbGxvd1wwIiAgICAgICBOb19hcmd1bWVudCAiZiIKKwkJOworCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGdldG9wdF9sb25nb3B0czsKKyNlbmRpZgorCUlOSVRfRygpOworCXN0cmNweShHLnZjc2FfbmFtZSwgIi9kZXYvdmNzYSIpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAieCs6eSsiOyAvLyBudW1lcmljIHBhcmFtcworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAidmNzbmRmeDp5OiIsICZHLngsICZHLnkpOworCWFyZ3YgKz0gb3B0aW5kOworCXR0eW51bSA9IDA7CisJaWYgKGFyZ3ZbMF0pIHsKKwkJdHR5bnVtID0geGF0b3VfcmFuZ2UoYXJndlswXSwgMCwgNjMpOworCQlzcHJpbnRmKEcudmNzYV9uYW1lICsgc2l6ZW9mKCIvZGV2L3Zjc2EiKS0xLCAiJXUiLCB0dHludW0pOworCX0KKwlzcHJpbnRmKHR0eV9uYW1lLCAiJXMldSIsICIvZGV2L3R0eSIsIHR0eW51bSk7CisJaWYgKG9wdHMgJiBGTEFHKGMpKSB7CisJCWlmICgob3B0cyAmIChGTEFHKHMpfEZMQUcodikpKSAhPSBGTEFHKHYpKQorCQkJY3JlYXRlX2NkZXZfaWZfZG9lc250X2V4aXN0KHR0eV9uYW1lLCBtYWtlZGV2KDQsIHR0eW51bSkpOworCQljcmVhdGVfY2Rldl9pZl9kb2VzbnRfZXhpc3QoRy52Y3NhX25hbWUsIG1ha2VkZXYoNywgMTI4ICsgdHR5bnVtKSk7CisJfQorCWlmICgob3B0cyAmIEZMQUcocykpICYmIHR0eW51bSkgeworCQlzdGFydF9zaGVsbF9pbl9jaGlsZCh0dHlfbmFtZSk7CisJfQorCisJc2NyZWVuX3JlYWRfY2xvc2UoKTsKKwlpZiAob3B0cyAmIEZMQUcoZCkpIHsKKwkJc2NyZWVuX2R1bXAoKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCBjbGVhbnVwKTsKKworCS8vIEFsbCBjaGFyYWN0ZXJzIG11c3QgYmUgcGFzc2VkIHRocm91Z2ggdG8gdXMgdW5hbHRlcmVkCisJRy5rYmRfZmQgPSB4b3BlbihDVVJSRU5UX1RUWSwgT19SRE9OTFkpOworCXRjZ2V0YXR0cihHLmtiZF9mZCwgJkcudGVybV9vcmlnKTsKKwl0ZXJtYnVmID0gRy50ZXJtX29yaWc7CisJdGVybWJ1Zi5jX2lmbGFnICY9IH4oQlJLSU5UfElOTENSfElDUk5MfElYT058SVhPRkZ8SVVDTEN8SVhBTll8SU1BWEJFTCk7CisJLy90ZXJtYnVmLmNfb2ZsYWcgJj0gfihPUE9TVCk7IC0gbm8sIHdlIHN0aWxsIHdhbnQgXG4gLT4gXHJcbgorCXRlcm1idWYuY19sZmxhZyAmPSB+KElTSUd8SUNBTk9OfEVDSE8pOworCXRlcm1idWYuY19jY1tWTUlOXSA9IDE7CisJdGVybWJ1Zi5jX2NjW1ZUSU1FXSA9IDA7CisJdGNzZXRhdHRyKEcua2JkX2ZkLCBUQ1NBTk9XLCAmdGVybWJ1Zik7CisKKwlwb2xsX3RpbWVvdXRfbXMgPSAyNTA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHBvbGxmZCBwZmQ7CisJCWludCBieXRlc19yZWFkOworCQlpbnQgaSwgajsKKwkJY2hhciAqZGF0YSwgKm9sZDsKKworCQkvLyBpbiB0aGUgZmlyc3QgbG9vcCBHLndpZHRoID0gRy5oZWlnaHQgPSAwOiByZWZyZXNoCisJCWkgPSBHLndpZHRoOworCQlqID0gRy5oZWlnaHQ7CisJCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoRy5rYmRfZmQsICZHLndpZHRoLCAmRy5oZWlnaHQpOworCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUcoZikpIHsKKwkJCWludCBueCA9IEcucmVtb3RlLmN1cnNvcl94IC0gRy53aWR0aCArIDE7CisJCQlpbnQgbnkgPSBHLnJlbW90ZS5jdXJzb3JfeSAtIEcuaGVpZ2h0ICsgMTsKKworCQkJaWYgKEcucmVtb3RlLmN1cnNvcl94IDwgRy54KSB7CisJCQkJRy54ID0gRy5yZW1vdGUuY3Vyc29yX3g7CisJCQkJaSA9IDA7IC8vIGZvcmNlIHJlZnJlc2gKKwkJCX0KKwkJCWlmIChueCA+IEcueCkgeworCQkJCUcueCA9IG54OworCQkJCWkgPSAwOyAvLyBmb3JjZSByZWZyZXNoCisJCQl9CisJCQlpZiAoRy5yZW1vdGUuY3Vyc29yX3kgPCBHLnkpIHsKKwkJCQlHLnkgPSBHLnJlbW90ZS5jdXJzb3JfeTsKKwkJCQlpID0gMDsgLy8gZm9yY2UgcmVmcmVzaAorCQkJfQorCQkJaWYgKG55ID4gRy55KSB7CisJCQkJRy55ID0gbnk7CisJCQkJaSA9IDA7IC8vIGZvcmNlIHJlZnJlc2gKKwkJCX0KKwkJfQorCisJCS8vIFNjYW4gY29uc29sZSBkYXRhIGFuZCByZWRyYXcgb3VyIHR0eSB3aGVyZSBuZWVkZWQKKwkJb2xkID0gRy5kYXRhICsgRy5jdXJyZW50OworCQlHLmN1cnJlbnQgPSBHLnNpemUgLSBHLmN1cnJlbnQ7CisJCWRhdGEgPSBHLmRhdGEgKyBHLmN1cnJlbnQ7CisJCXNjcmVlbl9yZWFkX2Nsb3NlKCk7CisJCWlmIChpICE9IEcud2lkdGggfHwgaiAhPSBHLmhlaWdodCkgeworCQkJY2xyc2NyKCk7CisJCQlzY3JlZW5fZHVtcCgpOworCQl9IGVsc2UgeworCQkJLy8gRm9yIGVhY2ggcmVtb3RlIGxpbmUKKwkJCW9sZCArPSBHLmZpcnN0X2xpbmVfb2Zmc2V0OworCQkJZGF0YSArPSBHLmZpcnN0X2xpbmVfb2Zmc2V0OworCQkJZm9yIChpID0gRy55OyBpIDwgRy5yZW1vdGUubGluZXM7IGkrKykgeworCQkJCWNoYXIgKmZpcnN0ID0gTlVMTDsgLy8gZmlyc3QgY2hhciB3aGljaCBuZWVkcyB1cGRhdGluZworCQkJCWNoYXIgKmxhc3QgPSBsYXN0OyAgLy8gbGFzdCBjaGFyIHdoaWNoIG5lZWRzIHVwZGF0aW5nCisJCQkJdW5zaWduZWQgaXkgPSBpIC0gRy55OworCisJCQkJaWYgKGl5ID49IEcuaGVpZ2h0KQorCQkJCQlicmVhazsKKwkJCQlmb3IgKGogPSAwOyBqIDwgRy5yZW1vdGUuY29sczsgaisrLCBORVhUKG9sZCksIE5FWFQoZGF0YSkpIHsKKwkJCQkJdW5zaWduZWQganggPSBqIC0gRy54OyAvLyBpZiB3aWxsIGNhdGNoIGogPj0gRy54IHRvbworCisJCQkJCWlmIChqeCA8IEcud2lkdGggJiYgREFUQShkYXRhKSAhPSBEQVRBKG9sZCkpIHsKKwkJCQkJCWxhc3QgPSBkYXRhOworCQkJCQkJaWYgKCFmaXJzdCkgeworCQkJCQkJCWZpcnN0ID0gZGF0YTsKKwkJCQkJCQlnb3RveHkoangsIGl5KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJLy8gUmV3cml0ZSB1cGRhdGVkIGRhdGEgb24gdGhlIGxvY2FsIHNjcmVlbgorCQkJCQlmb3IgKDsgZmlyc3QgPD0gbGFzdDsgTkVYVChmaXJzdCkpCisJCQkJCQlzY3JlZW5fY2hhcihmaXJzdCk7CisJCQkJfQorCQkJfQorCQl9CisJCWN1cm1vdmUoKTsKKworCQkvLyBXYWl0IGZvciBsb2NhbCB1c2VyIGtleXByZXNzZXMKKwkJZmZsdXNoX2FsbCgpOworCQlwZmQuZmQgPSBHLmtiZF9mZDsKKwkJcGZkLmV2ZW50cyA9IFBPTExJTjsKKwkJYnl0ZXNfcmVhZCA9IDA7CisJCXN3aXRjaCAocG9sbCgmcGZkLCAxLCBwb2xsX3RpbWVvdXRfbXMpKSB7CisJCQljaGFyICprOworCQljYXNlIC0xOgorCQkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJCWNsZWFudXAoMSk7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJaWYgKCsrRy5ub2tleXMgPj0gNCkKKwkJCQlHLm5va2V5cyA9IEcuZXNjYXBlX2NvdW50ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLy8gUmVhZCB0aGUga2V5cyBwcmVzc2VkCisJCQlrID0ga2V5YnVmICsgRy5rZXlfY291bnQ7CisJCQlieXRlc19yZWFkID0gcmVhZChHLmtiZF9mZCwgaywgc2l6ZW9mKGtleWJ1ZikgLSBHLmtleV9jb3VudCk7CisJCQlpZiAoYnl0ZXNfcmVhZCA8IDApCisJCQkJY2xlYW51cCgxKTsKKworCQkJLy8gRG8gZXhpdCBwcm9jZXNzaW5nCisJCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXNfcmVhZDsgaSsrKSB7CisJCQkJaWYgKGtbaV0gIT0gJ1wwMzMnKQorCQkJCQlHLmVzY2FwZV9jb3VudCA9IDA7CisJCQkJZWxzZSBpZiAoKytHLmVzY2FwZV9jb3VudCA+PSAzKQorCQkJCQljbGVhbnVwKDApOworCQkJfQorCQl9CisJCXBvbGxfdGltZW91dF9tcyA9IDI1MDsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKHYpKSBjb250aW51ZTsKKworCQkvLyBJbnNlcnQgYWxsIGtleXMgcHJlc3NlZCBpbnRvIHRoZSB2aXJ0dWFsIGNvbnNvbGUncyBpbnB1dAorCQkvLyBidWZmZXIuICBEb24ndCBkbyB0aGlzIGlmIHRoZSB2aXJ0dWFsIGNvbnNvbGUgaXMgaW4gc2NhbgorCQkvLyBjb2RlIG1vZGUgLSBnaXZpbmcgQVNDSUkgY2hhcmFjdGVycyB0byBhIHByb2dyYW0gZXhwZWN0aW5nCisJCS8vIHNjYW4gY29kZXMgd2lsbCBjb25mdXNlIGl0LgorCQlHLmtleV9jb3VudCArPSBieXRlc19yZWFkOworCQlpZiAoRy5lc2NhcGVfY291bnQgPT0gMCkgeworCQkJaW50IGhhbmRsZSwgcmVzdWx0OworCQkJbG9uZyBrYmRfbW9kZTsKKworCQkJaGFuZGxlID0geG9wZW4odHR5X25hbWUsIE9fV1JPTkxZKTsKKwkJCXJlc3VsdCA9IGlvY3RsKGhhbmRsZSwgS0RHS0JNT0RFLCAma2JkX21vZGUpOworCQkJaWYgKHJlc3VsdCA+PSAwKSB7CisJCQkJY2hhciAqcCA9IGtleWJ1ZjsKKworCQkJCWlmIChrYmRfbW9kZSAhPSBLX1hMQVRFICYmIGtiZF9tb2RlICE9IEtfVU5JQ09ERSkgeworCQkJCQlHLmtleV9jb3VudCA9IDA7IC8vIHNjYW4gY29kZSBtb2RlCisJCQkJfQorCQkJCWZvciAoOyBHLmtleV9jb3VudCAhPSAwOyBwKyssIEcua2V5X2NvdW50LS0pIHsKKwkJCQkJcmVzdWx0ID0gaW9jdGwoaGFuZGxlLCBUSU9DU1RJLCBwKTsKKwkJCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQkJCW1lbW1vdmUoa2V5YnVmLCBwLCBHLmtleV9jb3VudCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvLyBJZiB0aGVyZSBpcyBhbiBhcHBsaWNhdGlvbiBvbiBjb25zb2xlIHdoaWNoIHJlYWN0cworCQkJCQkvLyB0byBrZXlwcmVzc2VzLCB3ZSBuZWVkIHRvIG1ha2Ugb3VyIGZpcnN0IHNsZWVwCisJCQkJCS8vIHNob3J0ZXIgdG8gcXVpY2tseSByZWRyYXcgd2hhdGV2ZXIgaXQgcHJpbnRlZCB0aGVyZS4KKwkJCQkJcG9sbF90aW1lb3V0X21zID0gMjA7CisJCQkJfQorCQkJfQorCQkJLy8gQ2xvc2UgJiByZS1vcGVuIHR0eSBpbiBjYXNlIHRoZXkgaGF2ZQorCQkJLy8gc3dhcHBlZCB2aXJ0dWFsIGNvbnNvbGVzCisJCQljbG9zZShoYW5kbGUpOworCisJCQkvLyBXZSBzb21ldGltZXMgZ2V0IHNwdXJpb3VzIElPIGVycm9ycyBvbiB0aGUgVFRZCisJCQkvLyBhcyBwcm9ncmFtcyBjbG9zZSBhbmQgcmUtb3BlbiBpdAorCQkJaWYgKHJlc3VsdCA+PSAwKQorCQkJCUcuaW9lcnJvcl9jb3VudCA9IDA7CisJCQllbHNlIGlmIChlcnJubyAhPSBFSU8gfHwgKytHLmlvZXJyb3JfY291bnQgPiA0KQorCQkJCWNsZWFudXAoMSk7CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2Nyb25kLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvY3JvbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGI3M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2Nyb25kLmMKQEAgLTAsMCArMSw5NTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNyb25kIC1kWyNdIC1jIDxjcm9uZGlyPiAtZiAtYgorICoKKyAqIHJ1biBhcyByb290LCBidXQgTk9UIHNldHVpZCByb290CisgKgorICogQ29weXJpZ2h0IDE5OTQgTWF0dGhldyBEaWxsb24gKGRpbGxvbkBhcG9sbG8ud2VzdC5vaWMuY29tKQorICogKHZlcnNpb24gMi4zLjIpCisgKiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IChDKSAyMDAyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY3JvbmRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi1mYlMgLWwgTiAiIElGX0ZFQVRVUkVfQ1JPTkRfRCgiLWQgTiAiKSAiLUwgTE9HRklMRSAtYyBESVIiCisvL3VzYWdlOiNkZWZpbmUgY3JvbmRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWYJRm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJQmFja2dyb3VuZCAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1TCUxvZyB0byBzeXNsb2cgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktbAlTZXQgbG9nIGxldmVsLiAwIGlzIHRoZSBtb3N0IHZlcmJvc2UsIGRlZmF1bHQgOCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQ1JPTkRfRCgKKy8vdXNhZ2U6ICAgICAiXG4JLWQJU2V0IGxvZyBsZXZlbCwgbG9nIHRvIHN0ZGVyciIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLUwJTG9nIHRvIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS1jCVdvcmtpbmcgZGlyIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworLyogZ2xpYmMgZnJlZXMgcHJldmlvdXMgc2V0ZW52J2VkIHZhbHVlIHdoZW4gd2UgZG8gbmV4dCBzZXRlbnYoKQorICogb2YgdGhlIHNhbWUgdmFyaWFibGUuIHVjbGliYyBkb2VzIG5vdCBkbyB0aGlzISAqLworI2lmIChkZWZpbmVkKF9fR0xJQkNfXykgJiYgIWRlZmluZWQoX19VQ0xJQkNfXykpIC8qIHx8IE9USEVSX1NBRkVfTElCQy4uLiAqLworIyBkZWZpbmUgU0VURU5WX0xFQUtTIDAKKyNlbHNlCisjIGRlZmluZSBTRVRFTlZfTEVBS1MgMQorI2VuZGlmCisKKworI2RlZmluZSBUTVBESVIgICAgICAgICAgQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRElSCisjZGVmaW5lIENST05UQUJTICAgICAgICBDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVIgIi9jcm9udGFicyIKKyNpZm5kZWYgU0VORE1BSUwKKyMgZGVmaW5lIFNFTkRNQUlMICAgICAgICJzZW5kbWFpbCIKKyNlbmRpZgorI2lmbmRlZiBTRU5ETUFJTF9BUkdTCisjIGRlZmluZSBTRU5ETUFJTF9BUkdTICAiLXRpIgorI2VuZGlmCisjaWZuZGVmIENST05VUERBVEUKKyMgZGVmaW5lIENST05VUERBVEUgICAgICJjcm9uLnVwZGF0ZSIKKyNlbmRpZgorI2lmbmRlZiBNQVhMSU5FUworIyBkZWZpbmUgTUFYTElORVMgICAgICAgMjU2ICAvKiBtYXggbGluZXMgaW4gbm9uLXJvb3QgY3JvbnRhYnMgKi8KKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IENyb25GaWxlIHsKKwlzdHJ1Y3QgQ3JvbkZpbGUgKmNmX25leHQ7CisJc3RydWN0IENyb25MaW5lICpjZl9saW5lczsKKwljaGFyICpjZl91c2VybmFtZTsKKwlzbWFsbGludCBjZl93YW50c19zdGFydGluZzsgICAgIC8qIGJvb2w6IG9uZSBvciBtb3JlIGpvYnMgcmVhZHkgKi8KKwlzbWFsbGludCBjZl9oYXNfcnVubmluZzsgICAgICAgIC8qIGJvb2w6IG9uZSBvciBtb3JlIGpvYnMgcnVubmluZyAqLworCXNtYWxsaW50IGNmX2RlbGV0ZWQ7ICAgICAgICAgICAgLyogbWFya2VkIGZvciBkZWxldGlvbiAoYnV0IHN0aWxsIGhhcyBydW5uaW5nIGpvYnMpICovCit9IENyb25GaWxlOworCit0eXBlZGVmIHN0cnVjdCBDcm9uTGluZSB7CisJc3RydWN0IENyb25MaW5lICpjbF9uZXh0OworCWNoYXIgKmNsX2NtZDsgICAgICAgICAgICAgICAgICAgLyogc2hlbGwgY29tbWFuZCAqLworCXBpZF90IGNsX3BpZDsgICAgICAgICAgICAgICAgICAgLyogPjA6cnVubmluZywgPDA6bmVlZHMgdG8gYmUgc3RhcnRlZCBpbiB0aGlzIG1pbnV0ZSwgMDpkb3JtYW50ICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTAorCWludCBjbF9lbXB0eV9tYWlsX3NpemU7ICAgICAgICAgLyogc2l6ZSBvZiBtYWlsIGhlYWRlciBvbmx5LCAwIGlmIG5vIG1haWxmaWxlICovCisJY2hhciAqY2xfbWFpbHRvOyAgICAgICAgICAgICAgICAvKiB3aG9tIHRvIG1haWwgcmVzdWx0cywgbWF5IGJlIE5VTEwgKi8KKyNlbmRpZgorCS8qIG9yZGVyZWQgYnkgc2l6ZSwgbm90IGluIG5hdHVyYWwgb3JkZXIuIG1ha2VzIGNvZGUgc21hbGxlcjogKi8KKwljaGFyIGNsX0Rvd1s3XTsgICAgICAgICAgICAgICAgIC8qIDAtNiwgYmVnaW5uaW5nIHN1bmRheSAqLworCWNoYXIgY2xfTW9uc1sxMl07ICAgICAgICAgICAgICAgLyogMC0xMSAqLworCWNoYXIgY2xfSHJzWzI0XTsgICAgICAgICAgICAgICAgLyogMC0yMyAqLworCWNoYXIgY2xfRGF5c1szMl07ICAgICAgICAgICAgICAgLyogMS0zMSAqLworCWNoYXIgY2xfTWluc1s2MF07ICAgICAgICAgICAgICAgLyogMC01OSAqLworfSBDcm9uTGluZTsKKworCisjZGVmaW5lIERBRU1PTl9VSUQgMAorCisKK2VudW0geworCU9QVF9sID0gKDEgPDwgMCksCisJT1BUX0wgPSAoMSA8PCAxKSwKKwlPUFRfZiA9ICgxIDw8IDIpLAorCU9QVF9iID0gKDEgPDwgMyksCisJT1BUX1MgPSAoMSA8PCA0KSwKKwlPUFRfYyA9ICgxIDw8IDUpLAorCU9QVF9kID0gKDEgPDwgNikgKiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9ELAorfTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9ECisjIGRlZmluZSBEZWJ1Z09wdCAob3B0aW9uX21hc2szMiAmIE9QVF9kKQorI2Vsc2UKKyMgZGVmaW5lIERlYnVnT3B0IDAKKyNlbmRpZgorCisKK3N0cnVjdCBnbG9iYWxzIHsKKwl1bnNpZ25lZCBsb2dfbGV2ZWw7IC8qID0gODsgKi8KKwl0aW1lX3QgY3JvbnRhYl9kaXJfbXRpbWU7CisJY29uc3QgY2hhciAqbG9nX2ZpbGVuYW1lOworCWNvbnN0IGNoYXIgKmNyb250YWJfZGlyX25hbWU7IC8qID0gQ1JPTlRBQlM7ICovCisJQ3JvbkZpbGUgKmNyb25fZmlsZXM7CisjaWYgU0VURU5WX0xFQUtTCisJY2hhciAqZW52X3Zhcl91c2VyOworCWNoYXIgKmVudl92YXJfaG9tZTsKKyNlbmRpZgorfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJRy5sb2dfbGV2ZWwgPSA4OyBcCisJRy5jcm9udGFiX2Rpcl9uYW1lID0gQ1JPTlRBQlM7IFwKK30gd2hpbGUgKDApCisKKworLyogMCBpcyB0aGUgbW9zdCB2ZXJib3NlLCBkZWZhdWx0IDggKi8KKyNkZWZpbmUgTFZMNSAgIlx4MDUiCisjZGVmaW5lIExWTDcgICJceDA3IgorI2RlZmluZSBMVkw4ICAiXHgwOCIKKyNkZWZpbmUgV0FSTjkgIlx4NDkiCisjZGVmaW5lIERJRTkgICJceGM5IgorLyogbGV2ZWwgPj0gMjAgaXMgImVycm9yIiAqLworI2RlZmluZSBFUlIyMCAiXHgxNCIKKworc3RhdGljIHZvaWQgY3JvbmRsb2coY29uc3QgY2hhciAqY3RsLCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK3N0YXRpYyB2b2lkIGNyb25kbG9nKGNvbnN0IGNoYXIgKmN0bCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisJaW50IGxldmVsID0gKGN0bFswXSAmIDB4MWYpOworCisJdmFfc3RhcnQodmEsIGN0bCk7CisJaWYgKGxldmVsID49IChpbnQpRy5sb2dfbGV2ZWwpIHsKKwkJLyogRGVidWcgbW9kZTogYWxsIHRvIChub24tcmVkaXJlY3RlZCkgc3RkZXJyLCAqLworCQkvKiBTeXNsb2cgbW9kZTogYWxsIHRvIHN5c2xvZyAobG9nbW9kZSA9IExPR01PREVfU1lTTE9HKSwgKi8KKwkJaWYgKCFEZWJ1Z09wdCAmJiBHLmxvZ19maWxlbmFtZSkgeworCQkJLyogT3RoZXJ3aXNlIChsb2cgdG8gZmlsZSk6IHdlIHJlb3BlbiBsb2cgZmlsZSBhdCBldmVyeSB3cml0ZTogKi8KKwkJCWludCBsb2dmZCA9IG9wZW5fb3Jfd2FybihHLmxvZ19maWxlbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQpOworCQkJaWYgKGxvZ2ZkID49IDApCisJCQkJeG1vdmVfZmQobG9nZmQsIFNUREVSUl9GSUxFTk8pOworCQl9CisJCS8qIFdoZW4gd2UgbG9nIHRvIHN5c2xvZywgbGV2ZWwgPiA4IGlzIGxvZ2dlZCBhdCBMT0dfRVJSCisJCSAqIHN5c2xvZyBsZXZlbCwgbGV2ZWwgPD0gOCBpcyBsb2dnZWQgYXQgTE9HX0lORk8uICovCisJCWlmIChsZXZlbCA+IDgpIHsKKwkJCWJiX3ZlcnJvcl9tc2coY3RsICsgMSwgdmEsIC8qIHN0cmVycjogKi8gTlVMTCk7CisJCX0gZWxzZSB7CisJCQljaGFyICptc2cgPSBOVUxMOworCQkJdmFzcHJpbnRmKCZtc2csIGN0bCArIDEsIHZhKTsKKwkJCWJiX2luZm9fbXNnKCIlczogJXMiLCBhcHBsZXRfbmFtZSwgbXNnKTsKKwkJCWZyZWUobXNnKTsKKwkJfQorCX0KKwl2YV9lbmQodmEpOworCWlmIChjdGxbMF0gJiAweDgwKQorCQlleGl0KDIwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgRG93QXJ5W10gQUxJR04xID0KKwkic3VuIiJtb24iInR1ZSIid2VkIiJ0aHUiImZyaSIic2F0IgorCS8qICJTdW4iIk1vbiIiVHVlIiJXZWQiIlRodSIiRnJpIiJTYXQiICovCis7CisKK3N0YXRpYyBjb25zdCBjaGFyIE1vbkFyeVtdIEFMSUdOMSA9CisJImphbiIiZmViIiJtYXIiImFwciIibWF5IiJqdW4iImp1bCIiYXVnIiJzZXAiIm9jdCIibm92IiJkZWMiCisJLyogIkphbiIiRmViIiJNYXIiIkFwciIiTWF5IiJKdW4iIkp1bCIiQXVnIiJTZXAiIk9jdCIiTm92IiJEZWMiICovCis7CisKK3N0YXRpYyB2b2lkIFBhcnNlRmllbGQoY2hhciAqdXNlciwgY2hhciAqYXJ5LCBpbnQgbW9kdmFsdWUsIGludCBvZmYsCisJCQkJY29uc3QgY2hhciAqbmFtZXMsIGNoYXIgKnB0cikKKy8qICduYW1lcycgaXMgYSBwb2ludGVyIHRvIGEgc2V0IG9mIDMtY2hhciBhYmJyZXZpYXRpb25zICovCit7CisJY2hhciAqYmFzZSA9IHB0cjsKKwlpbnQgbjEgPSAtMTsKKwlpbnQgbjIgPSAtMTsKKworCS8vIHRoaXMgY2FuJ3QgaGFwcGVuIGR1ZSB0byBjb25maWdfcmVhZCgpCisJLyppZiAoYmFzZSA9PSBOVUxMKQorCQlyZXR1cm47Ki8KKworCXdoaWxlICgxKSB7CisJCWludCBza2lwID0gMDsKKworCQkvKiBIYW5kbGUgbnVtZXJpYyBkaWdpdCBvciBzeW1ib2wgb3IgJyonICovCisJCWlmICgqcHRyID09ICcqJykgeworCQkJbjEgPSAwOyAgLyogZXZlcnl0aGluZyB3aWxsIGJlIGZpbGxlZCAqLworCQkJbjIgPSBtb2R2YWx1ZSAtIDE7CisJCQlza2lwID0gMTsKKwkJCSsrcHRyOworCQl9IGVsc2UgaWYgKGlzZGlnaXQoKnB0cikpIHsKKwkJCWNoYXIgKmVuZHA7CisJCQlpZiAobjEgPCAwKSB7CisJCQkJbjEgPSBzdHJ0b2wocHRyLCAmZW5kcCwgMTApICsgb2ZmOworCQkJfSBlbHNlIHsKKwkJCQluMiA9IHN0cnRvbChwdHIsICZlbmRwLCAxMCkgKyBvZmY7CisJCQl9CisJCQlwdHIgPSBlbmRwOyAvKiBnY2MgbGlrZXMgdGVtcCB2YXIgZm9yICZlbmRwICovCisJCQlza2lwID0gMTsKKwkJfSBlbHNlIGlmIChuYW1lcykgeworCQkJaW50IGk7CisKKwkJCWZvciAoaSA9IDA7IG5hbWVzW2ldOyBpICs9IDMpIHsKKwkJCQkvKiB3YXMgdXNpbmcgc3RybmNtcCBiZWZvcmUuLi4gKi8KKwkJCQlpZiAoc3RybmNhc2VjbXAocHRyLCAmbmFtZXNbaV0sIDMpID09IDApIHsKKwkJCQkJcHRyICs9IDM7CisJCQkJCWlmIChuMSA8IDApIHsKKwkJCQkJCW4xID0gaSAvIDM7CisJCQkJCX0gZWxzZSB7CisJCQkJCQluMiA9IGkgLyAzOworCQkJCQl9CisJCQkJCXNraXAgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBoYW5kbGUgb3B0aW9uYWwgcmFuZ2UgJy0nICovCisJCWlmIChza2lwID09IDApIHsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmICgqcHRyID09ICctJyAmJiBuMiA8IDApIHsKKwkJCSsrcHRyOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBjb2xsYXBzZSBzaW5nbGUtdmFsdWUgcmFuZ2VzLCBoYW5kbGUgc2tpcG1hcmssIGFuZCBmaWxsCisJCSAqIGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkgYXBwcm9wcmlhdGVseS4KKwkJICovCisJCWlmIChuMiA8IDApIHsKKwkJCW4yID0gbjE7CisJCX0KKwkJaWYgKCpwdHIgPT0gJy8nKSB7CisJCQljaGFyICplbmRwOworCQkJc2tpcCA9IHN0cnRvbChwdHIgKyAxLCAmZW5kcCwgMTApOworCQkJcHRyID0gZW5kcDsgLyogZ2NjIGxpa2VzIHRlbXAgdmFyIGZvciAmZW5kcCAqLworCQl9CisKKwkJLyoKKwkJICogZmlsbCBhcnJheSwgdXNpbmcgYSBmYWlsc2FmZSBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gcHJldmVudAorCQkgKiBhbiBlbmRsZXNzIGxvb3AKKwkJICovCisJCXsKKwkJCWludCBzMCA9IDE7CisJCQlpbnQgZmFpbHNhZmUgPSAxMDI0OworCisJCQktLW4xOworCQkJZG8geworCQkJCW4xID0gKG4xICsgMSkgJSBtb2R2YWx1ZTsKKworCQkJCWlmICgtLXMwID09IDApIHsKKwkJCQkJYXJ5W24xICUgbW9kdmFsdWVdID0gMTsKKwkJCQkJczAgPSBza2lwOworCQkJCX0KKwkJCQlpZiAoLS1mYWlsc2FmZSA9PSAwKSB7CisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0gd2hpbGUgKG4xICE9IG4yKTsKKwkJfQorCQlpZiAoKnB0ciAhPSAnLCcpIHsKKwkJCWJyZWFrOworCQl9CisJCSsrcHRyOworCQluMSA9IC0xOworCQluMiA9IC0xOworCX0KKworCWlmICgqcHRyKSB7CisgZXJyOgorCQljcm9uZGxvZyhXQVJOOSAidXNlciAlczogcGFyc2UgZXJyb3IgYXQgJXMiLCB1c2VyLCBiYXNlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChEZWJ1Z09wdCAmJiAoRy5sb2dfbGV2ZWwgPD0gNSkpIHsgLyogbGlrZSBMVkw1ICovCisJCS8qIGNhbid0IHVzZSBjcm9uZGxvZywgaXQgaW5zZXJ0cyAnXG4nICovCisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbW9kdmFsdWU7ICsraSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJWQiLCAodW5zaWduZWQgY2hhcilhcnlbaV0pOworCQliYl9wdXRjaGFyX3N0ZGVycignXG4nKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEZpeERheURvdyhDcm9uTGluZSAqbGluZSkKK3sKKwl1bnNpZ25lZCBpOworCWludCB3ZWVrVXNlZCA9IDA7CisJaW50IGRheXNVc2VkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxpbmUtPmNsX0Rvdyk7ICsraSkgeworCQlpZiAobGluZS0+Y2xfRG93W2ldID09IDApIHsKKwkJCXdlZWtVc2VkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxpbmUtPmNsX0RheXMpOyArK2kpIHsKKwkJaWYgKGxpbmUtPmNsX0RheXNbaV0gPT0gMCkgeworCQkJZGF5c1VzZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHdlZWtVc2VkICE9IGRheXNVc2VkKSB7CisJCWlmICh3ZWVrVXNlZCkKKwkJCW1lbXNldChsaW5lLT5jbF9EYXlzLCAwLCBzaXplb2YobGluZS0+Y2xfRGF5cykpOworCQllbHNlIC8qIGRheXNVc2VkICovCisJCQltZW1zZXQobGluZS0+Y2xfRG93LCAwLCBzaXplb2YobGluZS0+Y2xfRG93KSk7CisJfQorfQorCisvKgorICogZGVsZXRlX2Nyb25maWxlKCkgLSBkZWxldGUgdXNlciBkYXRhYmFzZQorICoKKyAqIE5vdGU6IG11bHRpcGxlIGVudHJpZXMgZm9yIHNhbWUgdXNlciBtYXkgZXhpc3QgaWYgd2Ugd2VyZSB1bmFibGUgdG8KKyAqIGNvbXBsZXRlbHkgZGVsZXRlIGEgZGF0YWJhc2UgZHVlIHRvIHJ1bm5pbmcgcHJvY2Vzc2VzLgorICovCisvL0ZJWE1FOiB3ZSB3aWxsIHN0YXJ0IGEgbmV3IGpvYiBldmVuIGlmIHRoZSBvbGQgam9iIGlzIHJ1bm5pbmcKKy8vaWYgY3JvbnRhYiB3YXMgcmVsb2FkZWQ6IGNyb25kIHRoaW5rcyB0aGF0ICJuZXciIGpvYiBpcyBkaWZmZXJlbnQgZnJvbSAib2xkIgorLy9ldmVuIGlmIHRoZXkgYXJlIGluIGZhY3QgY29tcGxldGVseSB0aGUgc2FtZS4gRXhhbXBsZQorLy9Dcm9udGFiIHdhczoKKy8vIDAtNTkgKiAqICogKiBqb2IxCisvLyAwLTU5ICogKiAqICogbG9uZ19ydW5uaW5nX2pvYjIKKy8vVXNlciBlZGl0cyBjcm9udGFiIHRvOgorLy8gMC01OSAqICogKiAqIGpvYjFfdXBkYXRlZAorLy8gMC01OSAqICogKiAqIGxvbmdfcnVubmluZ19qb2IyCisvL0J1ZzogY3JvbmQgY2FuIG5vdyBzdGFydCBhbm90aGVyIGxvbmdfcnVubmluZ19qb2IyIGV2ZW4gaWYgb2xkIG9uZQorLy9pcyBzdGlsbCBydW5uaW5nLgorLy9PVE9IIG1vc3Qgb3RoZXIgdmVyc2lvbnMgb2YgY3JvbiBkbyBub3Qgd2FpdCBmb3Igam9iIHRlcm1pbmF0aW9uIGFueXdheSwKKy8vdGhleSBlbmQgdXAgd2l0aCBtdWx0aXBsZSBjb3BpZXMgb2Ygam9icyBpZiB0aGV5IGRvbid0IHRlcm1pbmF0ZSBzb29uIGVub3VnaC4KK3N0YXRpYyB2b2lkIGRlbGV0ZV9jcm9uZmlsZShjb25zdCBjaGFyICp1c2VyTmFtZSkKK3sKKwlDcm9uRmlsZSAqKnBmaWxlID0gJkcuY3Jvbl9maWxlczsKKwlDcm9uRmlsZSAqZmlsZTsKKworCXdoaWxlICgoZmlsZSA9ICpwZmlsZSkgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKHVzZXJOYW1lLCBmaWxlLT5jZl91c2VybmFtZSkgPT0gMCkgeworCQkJQ3JvbkxpbmUgKipwbGluZSA9ICZmaWxlLT5jZl9saW5lczsKKwkJCUNyb25MaW5lICpsaW5lOworCisJCQlmaWxlLT5jZl9oYXNfcnVubmluZyA9IDA7CisJCQlmaWxlLT5jZl9kZWxldGVkID0gMTsKKworCQkJd2hpbGUgKChsaW5lID0gKnBsaW5lKSAhPSBOVUxMKSB7CisJCQkJaWYgKGxpbmUtPmNsX3BpZCA+IDApIHsKKwkJCQkJZmlsZS0+Y2ZfaGFzX3J1bm5pbmcgPSAxOworCQkJCQlwbGluZSA9ICZsaW5lLT5jbF9uZXh0OworCQkJCX0gZWxzZSB7CisJCQkJCSpwbGluZSA9IGxpbmUtPmNsX25leHQ7CisJCQkJCWZyZWUobGluZS0+Y2xfY21kKTsKKwkJCQkJZnJlZShsaW5lKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Y2ZfaGFzX3J1bm5pbmcgPT0gMCkgeworCQkJCSpwZmlsZSA9IGZpbGUtPmNmX25leHQ7CisJCQkJZnJlZShmaWxlLT5jZl91c2VybmFtZSk7CisJCQkJZnJlZShmaWxlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlwZmlsZSA9ICZmaWxlLT5jZl9uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgbG9hZF9jcm9udGFiKGNvbnN0IGNoYXIgKmZpbGVOYW1lKQoreworCXN0cnVjdCBwYXJzZXJfdCAqcGFyc2VyOworCXN0cnVjdCBzdGF0IHNidWY7CisJaW50IG1heExpbmVzOworCWNoYXIgKnRva2Vuc1s2XTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisJY2hhciAqbWFpbFRvID0gTlVMTDsKKyNlbmRpZgorCisJZGVsZXRlX2Nyb25maWxlKGZpbGVOYW1lKTsKKworCWlmICghZ2V0cHduYW0oZmlsZU5hbWUpKSB7CisJCWNyb25kbG9nKExWTDcgImlnbm9yaW5nIGZpbGUgJyVzJyAobm8gc3VjaCB1c2VyKSIsIGZpbGVOYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXBhcnNlciA9IGNvbmZpZ19vcGVuKGZpbGVOYW1lKTsKKwlpZiAoIXBhcnNlcikKKwkJcmV0dXJuOworCisJbWF4TGluZXMgPSAoc3RyY21wKGZpbGVOYW1lLCAicm9vdCIpID09IDApID8gNjU1MzUgOiBNQVhMSU5FUzsKKworCWlmIChmc3RhdChmaWxlbm8ocGFyc2VyLT5mcCksICZzYnVmKSA9PSAwICYmIHNidWYuc3RfdWlkID09IERBRU1PTl9VSUQpIHsKKwkJQ3JvbkZpbGUgKmZpbGUgPSB4emFsbG9jKHNpemVvZihDcm9uRmlsZSkpOworCQlDcm9uTGluZSAqKnBsaW5lOworCQlpbnQgbjsKKworCQlmaWxlLT5jZl91c2VybmFtZSA9IHhzdHJkdXAoZmlsZU5hbWUpOworCQlwbGluZSA9ICZmaWxlLT5jZl9saW5lczsKKworCQl3aGlsZSAoMSkgeworCQkJQ3JvbkxpbmUgKmxpbmU7CisKKwkJCWlmICghLS1tYXhMaW5lcykKKwkJCQlicmVhazsKKwkJCW4gPSBjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgNiwgMSwgIiMgXHQiLCBQQVJTRV9OT1JNQUwgfCBQQVJTRV9LRUVQX0NPUFkpOworCQkJaWYgKCFuKQorCQkJCWJyZWFrOworCisJCQlpZiAoRGVidWdPcHQpCisJCQkJY3JvbmRsb2coTFZMNSAidXNlcjolcyBlbnRyeTolcyIsIGZpbGVOYW1lLCBwYXJzZXItPmRhdGEpOworCisJCQkvKiBjaGVjayBpZiBsaW5lIGlzIHNldHRpbmcgTUFJTFRPPSAqLworCQkJaWYgKDAgPT0gc3RybmNtcCh0b2tlbnNbMF0sICJNQUlMVE89IiwgNykpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisJCQkJZnJlZShtYWlsVG8pOworCQkJCW1haWxUbyA9ICh0b2tlbnNbMF1bN10pID8geHN0cmR1cCgmdG9rZW5zWzBdWzddKSA6IE5VTEw7CisjZW5kaWYgLyogb3RoZXJ3aXNlIGp1c3QgaWdub3JlIHN1Y2ggbGluZXMgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIGNoZWNrIGlmIGEgbWluaW11bSBvZiB0b2tlbnMgaXMgc3BlY2lmaWVkICovCisJCQlpZiAobiA8IDYpCisJCQkJY29udGludWU7CisJCQkqcGxpbmUgPSBsaW5lID0geHphbGxvYyhzaXplb2YoKmxpbmUpKTsKKwkJCS8qIHBhcnNlIGRhdGUgcmFuZ2VzICovCisJCQlQYXJzZUZpZWxkKGZpbGUtPmNmX3VzZXJuYW1lLCBsaW5lLT5jbF9NaW5zLCA2MCwgMCwgTlVMTCwgdG9rZW5zWzBdKTsKKwkJCVBhcnNlRmllbGQoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUtPmNsX0hycywgMjQsIDAsIE5VTEwsIHRva2Vuc1sxXSk7CisJCQlQYXJzZUZpZWxkKGZpbGUtPmNmX3VzZXJuYW1lLCBsaW5lLT5jbF9EYXlzLCAzMiwgMCwgTlVMTCwgdG9rZW5zWzJdKTsKKwkJCVBhcnNlRmllbGQoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUtPmNsX01vbnMsIDEyLCAtMSwgTW9uQXJ5LCB0b2tlbnNbM10pOworCQkJUGFyc2VGaWVsZChmaWxlLT5jZl91c2VybmFtZSwgbGluZS0+Y2xfRG93LCA3LCAwLCBEb3dBcnksIHRva2Vuc1s0XSk7CisJCQkvKgorCQkJICogZml4IGRheXMgYW5kIGRvdyAtIGlmIG9uZSBpcyBub3QgIioiIGFuZCB0aGUgb3RoZXIKKwkJCSAqIGlzICIqIiwgdGhlIG90aGVyIGlzIHNldCB0byAwLCBhbmQgdmlzZS12ZXJzYQorCQkJICovCisJCQlGaXhEYXlEb3cobGluZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTAorCQkJLyogY29weSBtYWlsdG8gKGNhbiBiZSBOVUxMKSAqLworCQkJbGluZS0+Y2xfbWFpbHRvID0geHN0cmR1cChtYWlsVG8pOworI2VuZGlmCisJCQkvKiBjb3B5IGNvbW1hbmQgKi8KKwkJCWxpbmUtPmNsX2NtZCA9IHhzdHJkdXAodG9rZW5zWzVdKTsKKwkJCWlmIChEZWJ1Z09wdCkgeworCQkJCWNyb25kbG9nKExWTDUgIiBjb21tYW5kOiVzIiwgdG9rZW5zWzVdKTsKKwkJCX0KKwkJCXBsaW5lID0gJmxpbmUtPmNsX25leHQ7CisvL2JiX2Vycm9yX21zZygiTVslc11GWyVzXVslc11bJXNdWyVzXVslc11bJXNdIiwgbWFpbFRvLCB0b2tlbnNbMF0sIHRva2Vuc1sxXSwgdG9rZW5zWzJdLCB0b2tlbnNbM10sIHRva2Vuc1s0XSwgdG9rZW5zWzVdKTsKKwkJfQorCQkqcGxpbmUgPSBOVUxMOworCisJCWZpbGUtPmNmX25leHQgPSBHLmNyb25fZmlsZXM7CisJCUcuY3Jvbl9maWxlcyA9IGZpbGU7CisKKwkJaWYgKG1heExpbmVzID09IDApIHsKKwkJCWNyb25kbG9nKFdBUk45ICJ1c2VyICVzOiB0b28gbWFueSBsaW5lcyIsIGZpbGVOYW1lKTsKKwkJfQorCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19jcm9uX3VwZGF0ZV9maWxlKHZvaWQpCit7CisJRklMRSAqZmk7CisJY2hhciBidWZbMjU2XTsKKworCWZpID0gZm9wZW5fZm9yX3JlYWQoQ1JPTlVQREFURSk7CisJaWYgKGZpICE9IE5VTEwpIHsKKwkJdW5saW5rKENST05VUERBVEUpOworCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZmkpICE9IE5VTEwpIHsKKwkJCS8qIHVzZSBmaXJzdCB3b3JkIG9ubHkgKi8KKwkJCXNraXBfbm9uX3doaXRlc3BhY2UoYnVmKVswXSA9ICdcMCc7CisJCQlsb2FkX2Nyb250YWIoYnVmKTsKKwkJfQorCQlmY2xvc2UoZmkpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzY2FuX2Nyb250YWJfZGlyKHZvaWQpCit7CisJQ3JvbkZpbGUgKmZpbGU7CisKKwkvKiBEZWxldGUgYWxsIGZpbGVzIHVudGlsIHdlIG9ubHkgaGF2ZSBvbmVzIHdpdGggcnVubmluZyBqb2JzIChvciBub25lKSAqLworIGFnYWluOgorCWZvciAoZmlsZSA9IEcuY3Jvbl9maWxlczsgZmlsZTsgZmlsZSA9IGZpbGUtPmNmX25leHQpIHsKKwkJaWYgKCFmaWxlLT5jZl9kZWxldGVkKSB7CisJCQlkZWxldGVfY3JvbmZpbGUoZmlsZS0+Y2ZfdXNlcm5hbWUpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKworCS8qIFJlbW92ZSBjcm9uIHVwZGF0ZSBmaWxlICovCisJdW5saW5rKENST05VUERBVEUpOworCS8qIFJlLWNoZGlyLCBpbiBjYXNlIGRpcmVjdG9yeSB3YXMgcmVuYW1lZCAmIGRlbGV0ZWQgKi8KKwlpZiAoY2hkaXIoRy5jcm9udGFiX2Rpcl9uYW1lKSA8IDApIHsKKwkJY3JvbmRsb2coRElFOSAiY2hkaXIoJXMpIiwgRy5jcm9udGFiX2Rpcl9uYW1lKTsKKwl9CisKKwkvKiBTY2FuIGRpcmVjdG9yeSBhbmQgYWRkIGFzc29jaWF0ZWQgdXNlcnMgKi8KKwl7CisJCURJUiAqZGlyID0gb3BlbmRpcigiLiIpOworCQlzdHJ1Y3QgZGlyZW50ICpkZW47CisKKwkJaWYgKCFkaXIpCisJCQljcm9uZGxvZyhESUU5ICJjaGRpciglcykiLCAiLiIpOyAvKiBleGl0cyAqLworCQl3aGlsZSAoKGRlbiA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJaWYgKHN0cmNocihkZW4tPmRfbmFtZSwgJy4nKSAhPSBOVUxMKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlsb2FkX2Nyb250YWIoZGVuLT5kX25hbWUpOworCQl9CisJCWNsb3NlZGlyKGRpcik7CisJfQorfQorCisjaWYgU0VURU5WX0xFQUtTCisvKiBXZSBzZXQgZW52aXJvbm1lbnQgKmJlZm9yZSogdmZvcmsgKGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgdmZvcmspLAorICogc28gd2UgY2Fubm90IHVzZSBzZXRlbnYoKSAtIHJlcGVhdGVkIGNhbGxzIHRvIHNldGVudigpIG1heSBsZWFrIG1lbW9yeSEKKyAqIFVzaW5nIHB1dGVudigpLCBhbmQgZnJlZWluZyBtZW1vcnkgYWZ0ZXIgdW5zZXRlbnYoKSB3b24ndCBsZWFrICovCitzdGF0aWMgdm9pZCBzYWZlX3NldGVudihjaGFyICoqcHZhcl92YWwsIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsKQoreworCWNoYXIgKnZhcl92YWwgPSAqcHZhcl92YWw7CisKKwlpZiAodmFyX3ZhbCkgeworCQliYl91bnNldGVudl9hbmRfZnJlZSh2YXJfdmFsKTsKKwl9CisJKnB2YXJfdmFsID0geGFzcHJpbnRmKCIlcz0lcyIsIHZhciwgdmFsKTsKKwlwdXRlbnYoKnB2YXJfdmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZXRfZW52X3ZhcnMoc3RydWN0IHBhc3N3ZCAqcGFzKQoreworI2lmIFNFVEVOVl9MRUFLUworCXNhZmVfc2V0ZW52KCZHLmVudl92YXJfdXNlciwgIlVTRVIiLCBwYXMtPnB3X25hbWUpOworCXNhZmVfc2V0ZW52KCZHLmVudl92YXJfaG9tZSwgIkhPTUUiLCBwYXMtPnB3X2Rpcik7CisJLyogaWYgd2Ugd2FudCB0byBzZXQgdXNlcidzIHNoZWxsIGluc3RlYWQ6ICovCisJLypzYWZlX3NldGVudihHLmVudl92YXJfc2hlbGwsICJTSEVMTCIsIHBhcy0+cHdfc2hlbGwpOyovCisjZWxzZQorCXhzZXRlbnYoIlVTRVIiLCBwYXMtPnB3X25hbWUpOworCXhzZXRlbnYoIkhPTUUiLCBwYXMtPnB3X2Rpcik7CisjZW5kaWYKKwkvKiBjdXJyZW50bHksIHdlIHVzZSBjb25zdGFudCBvbmU6ICovCisJLypzZXRlbnYoIlNIRUxMIiwgREVGQVVMVF9TSEVMTCwgMSk7IC0gZG9uZSBlYXJsaWVyICovCit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV91c2VyKHN0cnVjdCBwYXNzd2QgKnBhcykKK3sKKwkvKiBjYXJlZnVsOiB3ZSdyZSBhZnRlciB2Zm9yayEgKi8KKwljaGFuZ2VfaWRlbnRpdHkocGFzKTsgLyogLSBpbml0Z3JvdXBzLCBzZXRnaWQsIHNldHVpZCAqLworCWlmIChjaGRpcihwYXMtPnB3X2RpcikgPCAwKSB7CisJCWNyb25kbG9nKFdBUk45ICJjaGRpciglcykiLCBwYXMtPnB3X2Rpcik7CisJCWlmIChjaGRpcihUTVBESVIpIDwgMCkgeworCQkJY3JvbmRsb2coRElFOSAiY2hkaXIoJXMpIiwgVE1QRElSKTsgLyogZXhpdHMgKi8KKwkJfQorCX0KK30KKworLy8gVE9ETzogc2VuZG1haWwgc2hvdWxkIGJlIF9ydW4tdGltZV8gb3B0aW9uLCBub3QgY29tcGlsZS10aW1lIQorI2lmIEVOQUJMRV9GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwKKworc3RhdGljIHBpZF90Citmb3JrX2pvYihjb25zdCBjaGFyICp1c2VyLCBpbnQgbWFpbEZkLAorCQljb25zdCBjaGFyICpwcm9nLAorCQljb25zdCBjaGFyICpzaGVsbF9jbWQgLyogaWYgTlVMTCwgd2UgcnVuIHNlbmRtYWlsICovCispIHsKKwlzdHJ1Y3QgcGFzc3dkICpwYXM7CisJcGlkX3QgcGlkOworCisJLyogcHJlcGFyZSB0aGluZ3MgYmVmb3JlIHZmb3JrICovCisJcGFzID0gZ2V0cHduYW0odXNlcik7CisJaWYgKCFwYXMpIHsKKwkJY3JvbmRsb2coV0FSTjkgImNhbid0IGdldCB1aWQgZm9yICVzIiwgdXNlcik7CisJCWdvdG8gZXJyOworCX0KKwlzZXRfZW52X3ZhcnMocGFzKTsKKworCXBpZCA9IHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIENISUxEICovCisJCS8qIGluaXRncm91cHMsIHNldGdpZCwgc2V0dWlkLCBhbmQgY2hkaXIgdG8gaG9tZSBvciBUTVBESVIgKi8KKwkJY2hhbmdlX3VzZXIocGFzKTsKKwkJaWYgKERlYnVnT3B0KSB7CisJCQljcm9uZGxvZyhMVkw1ICJjaGlsZCBydW5uaW5nICVzIiwgcHJvZyk7CisJCX0KKwkJaWYgKG1haWxGZCA+PSAwKSB7CisJCQl4bW92ZV9mZChtYWlsRmQsIHNoZWxsX2NtZCA/IDEgOiAwKTsKKwkJCWR1cDIoMSwgMik7CisJCX0KKwkJLyogY3JvbmQgMy4wcGwxLTEwMCBwdXRzIHRhc2tzIGluIHNlcGFyYXRlIHByb2Nlc3MgZ3JvdXBzICovCisJCWJiX3NldHBncnAoKTsKKwkJZXhlY2xwKHByb2csIHByb2csIChzaGVsbF9jbWQgPyAiLWMiIDogU0VORE1BSUxfQVJHUyksIHNoZWxsX2NtZCwgKGNoYXIgKikgTlVMTCk7CisJCWNyb25kbG9nKEVSUjIwICJjYW4ndCBleGVjdXRlICclcycgZm9yIHVzZXIgJXMiLCBwcm9nLCB1c2VyKTsKKwkJaWYgKHNoZWxsX2NtZCkgeworCQkJZmRwcmludGYoMSwgIkV4ZWMgZmFpbGVkOiAlcyAtYyAlc1xuIiwgcHJvZywgc2hlbGxfY21kKTsKKwkJfQorCQlfZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKworCWlmIChwaWQgPCAwKSB7CisJCS8qIEZPUksgRkFJTEVEICovCisJCWNyb25kbG9nKEVSUjIwICJjYW4ndCB2Zm9yayIpOworIGVycjoKKwkJcGlkID0gMDsKKwl9IC8qIGVsc2U6IFBBUkVOVCwgRk9SSyBTVUNDRVNTICovCisKKwkvKgorCSAqIENsb3NlIHRoZSBtYWlsIGZpbGUgZGVzY3JpcHRvci4uIHdlIGNhbid0IGp1c3QgbGVhdmUgaXQgb3BlbiBpbgorCSAqIGEgc3RydWN0dXJlLCBjbG9zaW5nIGl0IGxhdGVyLCBiZWNhdXNlIHdlIG1pZ2h0IHJ1biBvdXQgb2YgZGVzY3JpcHRvcnMKKwkgKi8KKwlpZiAobWFpbEZkID49IDApIHsKKwkJY2xvc2UobWFpbEZkKTsKKwl9CisJcmV0dXJuIHBpZDsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfb25lX2pvYihjb25zdCBjaGFyICp1c2VyLCBDcm9uTGluZSAqbGluZSkKK3sKKwljaGFyIG1haWxGaWxlWzEyOF07CisJaW50IG1haWxGZCA9IC0xOworCisJbGluZS0+Y2xfcGlkID0gMDsKKwlsaW5lLT5jbF9lbXB0eV9tYWlsX3NpemUgPSAwOworCisJaWYgKGxpbmUtPmNsX21haWx0bykgeworCQkvKiBPcGVuIG1haWwgZmlsZSAob3duZXIgaXMgcm9vdCBzbyBub2JvZHkgY2FuIHNjcmV3IHdpdGggaXQpICovCisJCXNucHJpbnRmKG1haWxGaWxlLCBzaXplb2YobWFpbEZpbGUpLCAiJXMvY3Jvbi4lcy4lZCIsIFRNUERJUiwgdXNlciwgZ2V0cGlkKCkpOworCQltYWlsRmQgPSBvcGVuKG1haWxGaWxlLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fV1JPTkxZIHwgT19FWENMIHwgT19BUFBFTkQsIDA2MDApOworCisJCWlmIChtYWlsRmQgPj0gMCkgeworCQkJZmRwcmludGYobWFpbEZkLCAiVG86ICVzXG5TdWJqZWN0OiBjcm9uOiAlc1xuXG4iLCBsaW5lLT5jbF9tYWlsdG8sCisJCQkJbGluZS0+Y2xfY21kKTsKKwkJCWxpbmUtPmNsX2VtcHR5X21haWxfc2l6ZSA9IGxzZWVrKG1haWxGZCwgMCwgU0VFS19DVVIpOworCQl9IGVsc2UgeworCQkJY3JvbmRsb2coRVJSMjAgImNhbid0IGNyZWF0ZSBtYWlsIGZpbGUgJXMgZm9yIHVzZXIgJXMsICIKKwkJCQkJImRpc2NhcmRpbmcgb3V0cHV0IiwgbWFpbEZpbGUsIHVzZXIpOworCQl9CisJfQorCisJbGluZS0+Y2xfcGlkID0gZm9ya19qb2IodXNlciwgbWFpbEZkLCBERUZBVUxUX1NIRUxMLCBsaW5lLT5jbF9jbWQpOworCWlmIChtYWlsRmQgPj0gMCkgeworCQlpZiAobGluZS0+Y2xfcGlkIDw9IDApIHsKKwkJCXVubGluayhtYWlsRmlsZSk7CisJCX0gZWxzZSB7CisJCQkvKiByZW5hbWUgbWFpbC1maWxlIGJhc2VkIG9uIHBpZCBvZiBwcm9jZXNzICovCisJCQljaGFyICptYWlsRmlsZTIgPSB4YXNwcmludGYoIiVzL2Nyb24uJXMuJWQiLCBUTVBESVIsIHVzZXIsIChpbnQpbGluZS0+Y2xfcGlkKTsKKwkJCXJlbmFtZShtYWlsRmlsZSwgbWFpbEZpbGUyKTsgLy8gVE9ETzogeHJlbmFtZT8KKwkJCWZyZWUobWFpbEZpbGUyKTsKKwkJfQorCX0KK30KKworLyoKKyAqIHByb2Nlc3NfZmluaXNoZWRfam9iIC0gY2FsbGVkIHdoZW4gam9iIHRlcm1pbmF0ZXMgYW5kIHdoZW4gbWFpbCB0ZXJtaW5hdGVzCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfZmluaXNoZWRfam9iKGNvbnN0IGNoYXIgKnVzZXIsIENyb25MaW5lICpsaW5lKQoreworCXBpZF90IHBpZDsKKwlpbnQgbWFpbEZkOworCWNoYXIgbWFpbEZpbGVbMTI4XTsKKwlzdHJ1Y3Qgc3RhdCBzYnVmOworCisJcGlkID0gbGluZS0+Y2xfcGlkOworCWxpbmUtPmNsX3BpZCA9IDA7CisJaWYgKHBpZCA8PSAwKSB7CisJCS8qIE5vIGpvYiAqLworCQlyZXR1cm47CisJfQorCWlmIChsaW5lLT5jbF9lbXB0eV9tYWlsX3NpemUgPD0gMCkgeworCQkvKiBFbmQgb2Ygam9iIGFuZCBubyBtYWlsIGZpbGUsIG9yIGVuZCBvZiBzZW5kbWFpbCBqb2IgKi8KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogRW5kIG9mIHByaW1hcnkgam9iIC0gY2hlY2sgZm9yIG1haWwgZmlsZS4KKwkgKiBJZiBzaXplIGhhcyBjaGFuZ2VkIGFuZCB0aGUgZmlsZSBpcyBzdGlsbCB2YWxpZCwgd2Ugc2VuZCBpdC4KKwkgKi8KKwlzbnByaW50ZihtYWlsRmlsZSwgc2l6ZW9mKG1haWxGaWxlKSwgIiVzL2Nyb24uJXMuJWQiLCBUTVBESVIsIHVzZXIsIChpbnQpcGlkKTsKKwltYWlsRmQgPSBvcGVuKG1haWxGaWxlLCBPX1JET05MWSk7CisJdW5saW5rKG1haWxGaWxlKTsKKwlpZiAobWFpbEZkIDwgMCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKGZzdGF0KG1haWxGZCwgJnNidWYpIDwgMAorCSB8fCBzYnVmLnN0X3VpZCAhPSBEQUVNT05fVUlECisJIHx8IHNidWYuc3RfbmxpbmsgIT0gMAorCSB8fCBzYnVmLnN0X3NpemUgPT0gbGluZS0+Y2xfZW1wdHlfbWFpbF9zaXplCisJIHx8ICFTX0lTUkVHKHNidWYuc3RfbW9kZSkKKwkpIHsKKwkJY2xvc2UobWFpbEZkKTsKKwkJcmV0dXJuOworCX0KKwlsaW5lLT5jbF9lbXB0eV9tYWlsX3NpemUgPSAwOworCS8qIGlmIChsaW5lLT5jbF9tYWlsdG8pIC0gYWx3YXlzIHRydWUgaWYgY2xfZW1wdHlfbWFpbF9zaXplIHdhcyBub256ZXJvICovCisJCWxpbmUtPmNsX3BpZCA9IGZvcmtfam9iKHVzZXIsIG1haWxGZCwgU0VORE1BSUwsIE5VTEwpOworfQorCisjZWxzZSAvKiAhRU5BQkxFX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTCAqLworCitzdGF0aWMgdm9pZCBzdGFydF9vbmVfam9iKGNvbnN0IGNoYXIgKnVzZXIsIENyb25MaW5lICpsaW5lKQoreworCXN0cnVjdCBwYXNzd2QgKnBhczsKKwlwaWRfdCBwaWQ7CisKKwlwYXMgPSBnZXRwd25hbSh1c2VyKTsKKwlpZiAoIXBhcykgeworCQljcm9uZGxvZyhXQVJOOSAiY2FuJ3QgZ2V0IHVpZCBmb3IgJXMiLCB1c2VyKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogUHJlcGFyZSB0aGluZ3MgYmVmb3JlIHZmb3JrICovCisJc2V0X2Vudl92YXJzKHBhcyk7CisKKwkvKiBGb3JrIGFzIHRoZSB1c2VyIGluIHF1ZXN0aW9uIGFuZCBydW4gcHJvZ3JhbSAqLworCXBpZCA9IHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIENISUxEICovCisJCS8qIGluaXRncm91cHMsIHNldGdpZCwgc2V0dWlkLCBhbmQgY2hkaXIgdG8gaG9tZSBvciBUTVBESVIgKi8KKwkJY2hhbmdlX3VzZXIocGFzKTsKKwkJaWYgKERlYnVnT3B0KSB7CisJCQljcm9uZGxvZyhMVkw1ICJjaGlsZCBydW5uaW5nICVzIiwgREVGQVVMVF9TSEVMTCk7CisJCX0KKwkJLyogY3JvbmQgMy4wcGwxLTEwMCBwdXRzIHRhc2tzIGluIHNlcGFyYXRlIHByb2Nlc3MgZ3JvdXBzICovCisJCWJiX3NldHBncnAoKTsKKwkJZXhlY2woREVGQVVMVF9TSEVMTCwgREVGQVVMVF9TSEVMTCwgIi1jIiwgbGluZS0+Y2xfY21kLCAoY2hhciAqKSBOVUxMKTsKKwkJY3JvbmRsb2coRVJSMjAgImNhbid0IGV4ZWN1dGUgJyVzJyBmb3IgdXNlciAlcyIsIERFRkFVTFRfU0hFTEwsIHVzZXIpOworCQlfZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKwlpZiAocGlkIDwgMCkgeworCQkvKiBGT1JLIEZBSUxFRCAqLworCQljcm9uZGxvZyhFUlIyMCAiY2FuJ3QgdmZvcmsiKTsKKyBlcnI6CisJCXBpZCA9IDA7CisJfQorCWxpbmUtPmNsX3BpZCA9IHBpZDsKK30KKworI2RlZmluZSBwcm9jZXNzX2ZpbmlzaGVkX2pvYih1c2VyLCBsaW5lKSAgKChsaW5lKS0+Y2xfcGlkID0gMCkKKworI2VuZGlmIC8qICFFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMICovCisKKy8qCisgKiBEZXRlcm1pbmUgd2hpY2ggam9icyBuZWVkIHRvIGJlIHJ1bi4gIFVuZGVyIG5vcm1hbCBjb25kaXRpb25zLCB0aGUKKyAqIHBlcmlvZCBpcyBhYm91dCBhIG1pbnV0ZSAob25lIHNjYW4pLiAgV29yc3QgY2FzZSBpdCB3aWxsIGJlIG9uZQorICogaG91ciAoNjAgc2NhbnMpLgorICovCitzdGF0aWMgdm9pZCBmbGFnX3N0YXJ0aW5nX2pvYnModGltZV90IHQxLCB0aW1lX3QgdDIpCit7CisJdGltZV90IHQ7CisKKwkvKiBGaW5kIGpvYnMgPiB0MSBhbmQgPD0gdDIgKi8KKworCWZvciAodCA9IHQxIC0gdDEgJSA2MDsgdCA8PSB0MjsgdCArPSA2MCkgeworCQlzdHJ1Y3QgdG0gKnB0bTsKKwkJQ3JvbkZpbGUgKmZpbGU7CisJCUNyb25MaW5lICpsaW5lOworCisJCWlmICh0IDw9IHQxKQorCQkJY29udGludWU7CisKKwkJcHRtID0gbG9jYWx0aW1lKCZ0KTsKKwkJZm9yIChmaWxlID0gRy5jcm9uX2ZpbGVzOyBmaWxlOyBmaWxlID0gZmlsZS0+Y2ZfbmV4dCkgeworCQkJaWYgKERlYnVnT3B0KQorCQkJCWNyb25kbG9nKExWTDUgImZpbGUgJXM6IiwgZmlsZS0+Y2ZfdXNlcm5hbWUpOworCQkJaWYgKGZpbGUtPmNmX2RlbGV0ZWQpCisJCQkJY29udGludWU7CisJCQlmb3IgKGxpbmUgPSBmaWxlLT5jZl9saW5lczsgbGluZTsgbGluZSA9IGxpbmUtPmNsX25leHQpIHsKKwkJCQlpZiAoRGVidWdPcHQpCisJCQkJCWNyb25kbG9nKExWTDUgIiBsaW5lICVzIiwgbGluZS0+Y2xfY21kKTsKKwkJCQlpZiAobGluZS0+Y2xfTWluc1twdG0tPnRtX21pbl0KKwkJCQkgJiYgbGluZS0+Y2xfSHJzW3B0bS0+dG1faG91cl0KKwkJCQkgJiYgKGxpbmUtPmNsX0RheXNbcHRtLT50bV9tZGF5XSB8fCBsaW5lLT5jbF9Eb3dbcHRtLT50bV93ZGF5XSkKKwkJCQkgJiYgbGluZS0+Y2xfTW9uc1twdG0tPnRtX21vbl0KKwkJCQkpIHsKKwkJCQkJaWYgKERlYnVnT3B0KSB7CisJCQkJCQljcm9uZGxvZyhMVkw1ICIgam9iOiAlZCAlcyIsCisJCQkJCQkJKGludClsaW5lLT5jbF9waWQsIGxpbmUtPmNsX2NtZCk7CisJCQkJCX0KKwkJCQkJaWYgKGxpbmUtPmNsX3BpZCA+IDApIHsKKwkJCQkJCWNyb25kbG9nKExWTDggInVzZXIgJXM6IHByb2Nlc3MgYWxyZWFkeSBydW5uaW5nOiAlcyIsCisJCQkJCQkJZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUtPmNsX2NtZCk7CisJCQkJCX0gZWxzZSBpZiAobGluZS0+Y2xfcGlkID09IDApIHsKKwkJCQkJCWxpbmUtPmNsX3BpZCA9IC0xOworCQkJCQkJZmlsZS0+Y2Zfd2FudHNfc3RhcnRpbmcgPSAxOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9qb2JzKHZvaWQpCit7CisJQ3JvbkZpbGUgKmZpbGU7CisJQ3JvbkxpbmUgKmxpbmU7CisKKwlmb3IgKGZpbGUgPSBHLmNyb25fZmlsZXM7IGZpbGU7IGZpbGUgPSBmaWxlLT5jZl9uZXh0KSB7CisJCWlmICghZmlsZS0+Y2Zfd2FudHNfc3RhcnRpbmcpCisJCQljb250aW51ZTsKKworCQlmaWxlLT5jZl93YW50c19zdGFydGluZyA9IDA7CisJCWZvciAobGluZSA9IGZpbGUtPmNmX2xpbmVzOyBsaW5lOyBsaW5lID0gbGluZS0+Y2xfbmV4dCkgeworCQkJcGlkX3QgcGlkOworCQkJaWYgKGxpbmUtPmNsX3BpZCA+PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlzdGFydF9vbmVfam9iKGZpbGUtPmNmX3VzZXJuYW1lLCBsaW5lKTsKKwkJCXBpZCA9IGxpbmUtPmNsX3BpZDsKKwkJCWNyb25kbG9nKExWTDggIlVTRVIgJXMgcGlkICUzZCBjbWQgJXMiLAorCQkJCWZpbGUtPmNmX3VzZXJuYW1lLCAoaW50KXBpZCwgbGluZS0+Y2xfY21kKTsKKwkJCWlmIChwaWQgPCAwKSB7CisJCQkJZmlsZS0+Y2Zfd2FudHNfc3RhcnRpbmcgPSAxOworCQkJfQorCQkJaWYgKHBpZCA+IDApIHsKKwkJCQlmaWxlLT5jZl9oYXNfcnVubmluZyA9IDE7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBDaGVjayBmb3Igam9iIGNvbXBsZXRpb24sIHJldHVybiBudW1iZXIgb2Ygam9icyBzdGlsbCBydW5uaW5nIGFmdGVyCisgKiBhbGwgZG9uZS4KKyAqLworc3RhdGljIGludCBjaGVja19jb21wbGV0aW9ucyh2b2lkKQoreworCUNyb25GaWxlICpmaWxlOworCUNyb25MaW5lICpsaW5lOworCWludCBudW1fc3RpbGxfcnVubmluZyA9IDA7CisKKwlmb3IgKGZpbGUgPSBHLmNyb25fZmlsZXM7IGZpbGU7IGZpbGUgPSBmaWxlLT5jZl9uZXh0KSB7CisJCWlmICghZmlsZS0+Y2ZfaGFzX3J1bm5pbmcpCisJCQljb250aW51ZTsKKworCQlmaWxlLT5jZl9oYXNfcnVubmluZyA9IDA7CisJCWZvciAobGluZSA9IGZpbGUtPmNmX2xpbmVzOyBsaW5lOyBsaW5lID0gbGluZS0+Y2xfbmV4dCkgeworCQkJaW50IHI7CisKKwkJCWlmIChsaW5lLT5jbF9waWQgPD0gMCkKKwkJCQljb250aW51ZTsKKworCQkJciA9IHdhaXRwaWQobGluZS0+Y2xfcGlkLCBOVUxMLCBXTk9IQU5HKTsKKwkJCWlmIChyIDwgMCB8fCByID09IGxpbmUtPmNsX3BpZCkgeworCQkJCXByb2Nlc3NfZmluaXNoZWRfam9iKGZpbGUtPmNmX3VzZXJuYW1lLCBsaW5lKTsKKwkJCQlpZiAobGluZS0+Y2xfcGlkID09IDApIHsKKwkJCQkJLyogc2VuZG1haWwgd2FzIG5vdCBzdGFydGVkIGZvciBpdCAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogZWxzZTogc2VuZG1haWwgd2FzIHN0YXJ0ZWQsIGpvYiBpcyBzdGlsbCBydW5uaW5nLCBmYWxsIHRocnUgKi8KKwkJCX0KKwkJCS8qIGVsc2U6IHIgPT0gMDogInByb2Nlc3MgaXMgc3RpbGwgcnVubmluZyIgKi8KKwkJCWZpbGUtPmNmX2hhc19ydW5uaW5nID0gMTsKKwkJfQorLy9GSVhNRTogaWYgIWZpbGUtPmNmX2hhc19ydW5uaW5nICYmIGZpbGUtPmRlbGV0ZWQ6IGRlbGV0ZSBpdCEKKy8vb3RoZXJ3aXNlIGRlbGV0ZWQgZW50cmllcyB3aWxsIHN0YXkgZm9yZXZlciwgcmlnaHQ/CisJCW51bV9zdGlsbF9ydW5uaW5nICs9IGZpbGUtPmNmX2hhc19ydW5uaW5nOworCX0KKwlyZXR1cm4gbnVtX3N0aWxsX3J1bm5pbmc7Cit9CisKK2ludCBjcm9uZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY3JvbmRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXRpbWVfdCB0MjsKKwlpbnQgcmVzY2FuOworCWludCBzbGVlcF90aW1lOworCXVuc2lnbmVkIG9wdHM7CisKKwlJTklUX0coKTsKKworCS8qICItYiBhZnRlciAtZiBpcyBpZ25vcmVkIiwgYW5kIHNvIG9uIGZvciBldmVyeSBwYWlyIGEtYiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gImYtYjpiLWY6Uy1MOkwtUyIgSUZfRkVBVFVSRV9DUk9ORF9EKCI6ZC1sIikKKwkJCS8qIC1sIGFuZCAtZCBoYXZlIG51bWVyaWMgcGFyYW0gKi8KKwkJCSI6bCsiIElGX0ZFQVRVUkVfQ1JPTkRfRCgiOmQrIik7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJsOkw6ZmJTYzoiIElGX0ZFQVRVUkVfQ1JPTkRfRCgiZDoiKSwKKwkJCSZHLmxvZ19sZXZlbCwgJkcubG9nX2ZpbGVuYW1lLCAmRy5jcm9udGFiX2Rpcl9uYW1lCisJCQlJRl9GRUFUVVJFX0NST05EX0QoLCZHLmxvZ19sZXZlbCkpOworCS8qIGJvdGggLWQgTiBhbmQgLWwgTiBzZXQgdGhlIHNhbWUgdmFyaWFibGU6IEcubG9nX2xldmVsICovCisKKwlpZiAoIShvcHRzICYgT1BUX2YpKSB7CisJCS8qIGNsb3NlIHN0ZGluLCBzdGRvdXQsIHN0ZGVyci4KKwkJICogY2xvc2UgdW51c2VkIGRlc2NyaXB0b3JzIC0gZG9uJ3QgbmVlZCB0aGVtLiAqLworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NMT1NFX0VYVFJBX0ZEUywgYXJndik7CisJfQorCisJaWYgKCEob3B0cyAmIE9QVF9kKSAmJiBHLmxvZ19maWxlbmFtZSA9PSBOVUxMKSB7CisJCS8qIGxvZ2dpbmcgdG8gc3lzbG9nICovCisJCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19DT05TIHwgTE9HX1BJRCwgTE9HX0NST04pOworCQlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJeGNoZGlyKEcuY3JvbnRhYl9kaXJfbmFtZSk7CisJLy9zaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsgLyogPyBvcmlnaW5hbCBjcm9uZCBkaWVzIG9uIEhVUC4uLiAqLworCXhzZXRlbnYoIlNIRUxMIiwgREVGQVVMVF9TSEVMTCk7IC8qIG9uY2UsIGZvciBhbGwgZnV0dXJlIGNoaWxkcmVuICovCisJY3JvbmRsb2coTFZMOCAiY3JvbmQgKGJ1c3lib3ggIkJCX1ZFUiIpIHN0YXJ0ZWQsIGxvZyBsZXZlbCAlZCIsIEcubG9nX2xldmVsKTsKKwlyZXNjYW5fY3JvbnRhYl9kaXIoKTsKKwl3cml0ZV9waWRmaWxlKCIvdmFyL3J1bi9jcm9uZC5waWQiKTsKKworCS8qIE1haW4gbG9vcCAqLworCXQyID0gdGltZShOVUxMKTsKKwlyZXNjYW4gPSA2MDsKKwlzbGVlcF90aW1lID0gNjA7CisJZm9yICg7OykgeworCQlzdHJ1Y3Qgc3RhdCBzYnVmOworCQl0aW1lX3QgdDE7CisJCWxvbmcgZHQ7CisKKwkJdDEgPSB0MjsKKworCQkvKiBTeW5jaHJvbml6ZSB0byAxIG1pbnV0ZSwgbWluaW11bSAxIHNlY29uZCAqLworCQlzbGVlcChzbGVlcF90aW1lIC0gKHRpbWUoTlVMTCkgJSBzbGVlcF90aW1lKSArIDEpOworCisJCXQyID0gdGltZShOVUxMKTsKKwkJZHQgPSAobG9uZyl0MiAtIChsb25nKXQxOworCisJCS8qCisJCSAqIFRoZSBmaWxlICdjcm9uLnVwZGF0ZScgaXMgY2hlY2tlZCB0byBkZXRlcm1pbmUgbmV3IGNyb24KKwkJICogam9icy4gIFRoZSBkaXJlY3RvcnkgaXMgcmVzY2FubmVkIG9uY2UgYW4gaG91ciB0byBkZWFsCisJCSAqIHdpdGggYW55IHNjcmV3dXBzLgorCQkgKgorCQkgKiBDaGVjayBmb3IgdGltZSBqdW1wLiAgRGlzcGFyaXRpZXMgb3ZlciBhbiBob3VyIGVpdGhlciB3YXkKKwkJICogcmVzdWx0IGluIHJlc3luY2hyb25pemF0aW9uLiAgQSBuZWdhdGl2ZSBkaXNwYXJpdHkKKwkJICogbGVzcyB0aGFuIGFuIGhvdXIgY2F1c2VzIHVzIHRvIGVmZmVjdGl2ZWx5IHNsZWVwIHVudGlsIHdlCisJCSAqIG1hdGNoIHRoZSBvcmlnaW5hbCB0aW1lIChpLmUuIG5vIHJlLWV4ZWN1dGlvbiBvZiBqb2JzIHRoYXQKKwkJICogaGF2ZSBqdXN0IGJlZW4gcnVuKS4gIEEgcG9zaXRpdmUgZGlzcGFyaXR5IGxlc3MgdGhhbgorCQkgKiBhbiBob3VyIGNhdXNlcyBpbnRlcm1lZGlhdGUgam9icyB0byBiZSBydW4sIGJ1dCBvbmx5IG9uY2UKKwkJICogaW4gdGhlIHdvcnN0IGNhc2UuCisJCSAqCisJCSAqIFdoZW4gcnVubmluZyBqb2JzLCB0aGUgaW5lcXVhbGl0eSB1c2VkIGlzIGdyZWF0ZXIgYnV0IG5vdAorCQkgKiBlcXVhbCB0byB0MSwgYW5kIGxlc3MgdGhlbiBvciBlcXVhbCB0byB0Mi4KKwkJICovCisJCWlmIChzdGF0KEcuY3JvbnRhYl9kaXJfbmFtZSwgJnNidWYpICE9IDApCisJCQlzYnVmLnN0X210aW1lID0gMDsgLyogZm9yY2UgdXBkYXRlIChvbmNlKSBpZiBkaXIgd2FzIGRlbGV0ZWQgKi8KKwkJaWYgKEcuY3JvbnRhYl9kaXJfbXRpbWUgIT0gc2J1Zi5zdF9tdGltZSkgeworCQkJRy5jcm9udGFiX2Rpcl9tdGltZSA9IHNidWYuc3RfbXRpbWU7CisJCQlyZXNjYW4gPSAxOworCQl9CisJCWlmICgtLXJlc2NhbiA9PSAwKSB7CisJCQlyZXNjYW4gPSA2MDsKKwkJCXJlc2Nhbl9jcm9udGFiX2RpcigpOworCQl9CisJCXByb2Nlc3NfY3Jvbl91cGRhdGVfZmlsZSgpOworCQlpZiAoRGVidWdPcHQpCisJCQljcm9uZGxvZyhMVkw1ICJ3YWtldXAgZHQ9JWxkIiwgZHQpOworCQlpZiAoZHQgPCAtNjAgKiA2MCB8fCBkdCA+IDYwICogNjApIHsKKwkJCWNyb25kbG9nKFdBUk45ICJ0aW1lIGRpc3Bhcml0eSBvZiAlbGQgbWludXRlcyBkZXRlY3RlZCIsIGR0IC8gNjApOworCQkJLyogYW5kIHdlIGRvIG5vdCBydW4gYW55IGpvYnMgaW4gdGhpcyBjYXNlICovCisJCX0gZWxzZSBpZiAoZHQgPiAwKSB7CisJCQkvKiBVc3VhbCBjYXNlOiB0aW1lIGFkdmFuY2VzIGZvcndhcmQsIGFzIGV4cGVjdGVkICovCisJCQlmbGFnX3N0YXJ0aW5nX2pvYnModDEsIHQyKTsKKwkJCXN0YXJ0X2pvYnMoKTsKKwkJCWlmIChjaGVja19jb21wbGV0aW9ucygpID4gMCkgeworCQkJCS8qIHNvbWUgam9icyBhcmUgc3RpbGwgcnVubmluZyAqLworCQkJCXNsZWVwX3RpbWUgPSAxMDsKKwkJCX0gZWxzZSB7CisJCQkJc2xlZXBfdGltZSA9IDYwOworCQkJfQorCQl9CisJCS8qIGVsc2U6IHRpbWUganVtcGVkIGJhY2ssIGRvIG5vdCBydW4gYW55IGpvYnMgKi8KKwl9IC8qIGZvciAoOzspICovCisKKwlyZXR1cm4gMDsgLyogbm90IHJlYWNoZWQgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9jcm9udGFiLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvY3JvbnRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzFkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvY3JvbnRhYi5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDUk9OVEFCCisgKgorICogdXN1YWxseSBzZXR1aWQgcm9vdCwgLWMgb3B0aW9uIG9ubHkgd29ya3MgaWYgZ2V0dWlkKCkgPT0gZ2V0ZXVpZCgpCisgKgorICogQ29weXJpZ2h0IDE5OTQgTWF0dGhldyBEaWxsb24gKGRpbGxvbkBhcG9sbG8ud2VzdC5vaWMuY29tKQorICogVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PiAoQykgMjAwMgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNyb250YWJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyBESVJdIFstdSBVU0VSXSBbLWxlcl18W0ZJTEVdIgorLy91c2FnZTojZGVmaW5lIGNyb250YWJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWMJQ3JvbnRhYiBkaXJlY3RvcnkiCisvL3VzYWdlOiAgICAgIlxuCS11CVVzZXIiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgY3JvbnRhYiIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJRWRpdCBjcm9udGFiIgorLy91c2FnZTogICAgICJcbgktcglEZWxldGUgY3JvbnRhYiIKKy8vdXNhZ2U6ICAgICAiXG4JRklMRQlSZXBsYWNlIGNyb250YWIgYnkgRklMRSAoJy0nOiBzdGRpbikiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIENST05UQUJTICAgICAgICBDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVIgIi9jcm9udGFicyIKKyNpZm5kZWYgQ1JPTlVQREFURQorI2RlZmluZSBDUk9OVVBEQVRFICAgICAgImNyb24udXBkYXRlIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGVkaXRfZmlsZShjb25zdCBzdHJ1Y3QgcGFzc3dkICpwYXMsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJY29uc3QgY2hhciAqcHRyOworCXBpZF90IHBpZDsKKworCXBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQpIHsgLyogcGFyZW50ICovCisJCXdhaXQ0cGlkKHBpZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDSElMRCAtIGNoYW5nZSB1c2VyIGFuZCBydW4gZWRpdG9yICovCisJLyogaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQgKi8KKwljaGFuZ2VfaWRlbnRpdHkocGFzKTsKKwlzZXR1cF9lbnZpcm9ubWVudChwYXMtPnB3X3NoZWxsLAorCQkJU0VUVVBfRU5WX0NIQU5HRUVOViB8IFNFVFVQX0VOVl9UT19UTVAsCisJCQlwYXMpOworCXB0ciA9IGdldGVudigiVklTVUFMIik7CisJaWYgKCFwdHIpIHsKKwkJcHRyID0gZ2V0ZW52KCJFRElUT1IiKTsKKwkJaWYgKCFwdHIpCisJCQlwdHIgPSAidmkiOworCX0KKworCUJCX0VYRUNMUChwdHIsIHB0ciwgZmlsZSwgTlVMTCk7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBwdHIpOworfQorCitzdGF0aWMgaW50IG9wZW5fYXNfdXNlcihjb25zdCBzdHJ1Y3QgcGFzc3dkICpwYXMsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJcGlkX3QgcGlkOworCWNoYXIgYzsKKworCXBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQpIHsgLyogUEFSRU5UICovCisJCWlmICh3YWl0NHBpZChwaWQpID09IDApIHsKKwkJCS8qIGV4aXRjb2RlIDA6IGNoaWxkIHNheXMgaXQgY2FuIHJlYWQgKi8KKwkJCXJldHVybiBvcGVuKGZpbGUsIE9fUkRPTkxZKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ0hJTEQgKi8KKwkvKiBpbml0Z3JvdXBzLCBzZXRnaWQsIHNldHVpZCAqLworCWNoYW5nZV9pZGVudGl0eShwYXMpOworCS8qIFdlIGp1c3QgdHJ5IHRvIHJlYWQgb25lIGJ5dGUuIElmIGl0IHdvcmtzLCBmaWxlIGlzIHJlYWRhYmxlCisJICogdW5kZXIgdGhpcyB1c2VyLiBXZSBzaWduYWwgdGhhdCBieSBleGl0aW5nIHdpdGggMC4gKi8KKwlfZXhpdChzYWZlX3JlYWQoeG9wZW4oZmlsZSwgT19SRE9OTFkpLCAmYywgMSkgPCAwKTsKK30KKworaW50IGNyb250YWJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNyb250YWJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IHN0cnVjdCBwYXNzd2QgKnBhczsKKwljb25zdCBjaGFyICpjcm9udGFiX2RpciA9IENST05UQUJTOworCWNoYXIgKnRtcF9mbmFtZTsKKwljaGFyICpuZXdfZm5hbWU7CisJY2hhciAqdXNlcl9uYW1lOyAgLyogLXUgVVNFUiAqLworCWludCBmZDsKKwlpbnQgc3JjX2ZkOworCWludCBvcHRfbGVyOworCisJLyogZmlsZSBbb3B0c10gICAgIFJlcGxhY2UgY3JvbnRhYiBmcm9tIGZpbGUKKwkgKiAtIFtvcHRzXSAgICAgICAgUmVwbGFjZSBjcm9udGFiIGZyb20gc3RkaW4KKwkgKiAtdSB1c2VyICAgICAgICAgVXNlcgorCSAqIC1jIGRpciAgICAgICAgICBDcm9udGFiIGRpcmVjdG9yeQorCSAqIC1sICAgICAgICAgICAgICBMaXN0IGNyb250YWIgZm9yIHVzZXIKKwkgKiAtZSAgICAgICAgICAgICAgRWRpdCBjcm9udGFiIGZvciB1c2VyCisJICogLXIgICAgICAgICAgICAgIERlbGV0ZSBjcm9udGFiIGZvciB1c2VyCisJICogYmJveCBhbHNvIHN1cHBvcnRzIC1kID09IC1yLCBidXQgbW9zdCBvdGhlciBjcm9udGFiCisJICogaW1wbGVtZW50YXRpb25zIGRvIG5vdC4gRGVwcmVjYXRlZC4KKwkgKi8KKwllbnVtIHsKKwkJT1BUX3UgPSAoMSA8PCAwKSwKKwkJT1BUX2MgPSAoMSA8PCAxKSwKKwkJT1BUX2wgPSAoMSA8PCAyKSwKKwkJT1BUX2UgPSAoMSA8PCAzKSwKKwkJT1BUX3IgPSAoMSA8PCA0KSwKKwkJT1BUX2xlciA9IE9QVF9sICsgT1BUX2UgKyBPUFRfciwKKwl9OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzE6ZHIiOyAvKiBtYXggb25lIGFyZ3VtZW50OyAtZCBpbXBsaWVzIC1yICovCisJb3B0X2xlciA9IGdldG9wdDMyKGFyZ3YsICJ1OmM6bGVyZCIsICZ1c2VyX25hbWUsICZjcm9udGFiX2Rpcik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoc2FuaXRpemVfZW52X2lmX3N1aWQoKSkgeyAvKiBDbGVhcnMgZGFuZ2Vyb3VzIHN0dWZmLCBzZXRzIFBBVEggKi8KKwkJLyogUnVuIGJ5IG5vbi1yb290ICovCisJCWlmIChvcHRfbGVyICYgKE9QVF91fE9QVF9jKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKwl9CisKKwlpZiAob3B0X2xlciAmIE9QVF91KSB7CisJCXBhcyA9IHhnZXRwd25hbSh1c2VyX25hbWUpOworCX0gZWxzZSB7CisJCXBhcyA9IHhnZXRwd3VpZChnZXR1aWQoKSk7CisJfQorCisjZGVmaW5lIHVzZXJfbmFtZSBET05UX1VTRV9NRV9CRVlPTkRfVEhJU19QT0lOVAorCisJLyogRnJvbSBub3cgb24sIGtlZXAgb25seSAtbCwgLWUsIC1yIGJpdHMgKi8KKwlvcHRfbGVyICY9IE9QVF9sZXI7CisJaWYgKChvcHRfbGVyIC0gMSkgJiBvcHRfbGVyKSAvKiBtb3JlIHRoYW4gb25lIGJpdCBzZXQ/ICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIFJlYWQgcmVwbGFjZW1lbnQgZmlsZSB1bmRlciB1c2VyJ3MgVUlEL0dJRC9ncm91cCB2ZWN0b3IgKi8KKwlzcmNfZmQgPSBTVERJTl9GSUxFTk87CisJaWYgKCFvcHRfbGVyKSB7IC8qIFJlcGxhY2U/ICovCisJCWlmICghYXJndlswXSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJaWYgKE5PVF9MT05FX0RBU0goYXJndlswXSkpIHsKKwkJCXNyY19mZCA9IG9wZW5fYXNfdXNlcihwYXMsIGFyZ3ZbMF0pOworCQkJaWYgKHNyY19mZCA8IDApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVzZXIgJXMgY2Fubm90IHJlYWQgJXMiLAorCQkJCQkJcGFzLT5wd19uYW1lLCBhcmd2WzBdKTsKKwkJfQorCX0KKworCS8qIGNkIHRvIG91ciBjcm9udGFiIGRpcmVjdG9yeSAqLworCXhjaGRpcihjcm9udGFiX2Rpcik7CisKKwl0bXBfZm5hbWUgPSBOVUxMOworCisJLyogSGFuZGxlIHJlcXVlc3RlZCBvcGVyYXRpb24gKi8KKwlzd2l0Y2ggKG9wdF9sZXIpIHsKKworCWRlZmF1bHQ6IC8qIGNhc2UgT1BUX3I6IERlbGV0ZSAqLworCQl1bmxpbmsocGFzLT5wd19uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIE9QVF9sOiAvKiBMaXN0ICovCisJCXsKKwkJCWNoYXIgKmFyZ3NbMl0gPSB7IHBhcy0+cHdfbmFtZSwgTlVMTCB9OworCQkJcmV0dXJuIGJiX2NhdChhcmdzKTsKKwkJCS8qIGxpc3QgZXhpdHMsCisJCQkgKiB0aGUgcmVzdCBnbyBwbGF5IHdpdGggY3JvbiB1cGRhdGUgZmlsZSAqLworCQl9CisKKwljYXNlIE9QVF9lOiAvKiBFZGl0ICovCisJCXRtcF9mbmFtZSA9IHhhc3ByaW50ZigiJXMuJXUiLCBjcm9udGFiX2RpciwgKHVuc2lnbmVkKWdldHBpZCgpKTsKKwkJLyogTm8gT19FWENMOiB3ZSBkb24ndCB3YW50IHRvIGJlIHN0dWNrIGlmIGVhcmxpZXIgY3JvbnRhYnMKKwkJICogd2VyZSBraWxsZWQsIGxlYXZpbmcgc3RhbGUgdGVtcCBmaWxlIGJlaGluZCAqLworCQlzcmNfZmQgPSB4b3BlbjModG1wX2ZuYW1lLCBPX1JEV1J8T19DUkVBVHxPX1RSVU5DLCAwNjAwKTsKKwkJZmNob3duKHNyY19mZCwgcGFzLT5wd191aWQsIHBhcy0+cHdfZ2lkKTsKKwkJZmQgPSBvcGVuKHBhcy0+cHdfbmFtZSwgT19SRE9OTFkpOworCQlpZiAoZmQgPj0gMCkgeworCQkJYmJfY29weWZkX2VvZihmZCwgc3JjX2ZkKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXhsc2VlayhzcmNfZmQsIDAsIFNFRUtfU0VUKTsKKwkJfQorCQljbG9zZV9vbl9leGVjX29uKHNyY19mZCk7IC8qIGRvbid0IHdhbnQgZWRpdG9yIHRvIHNlZSB0aGlzIGZkICovCisJCWVkaXRfZmlsZShwYXMsIHRtcF9mbmFtZSk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSAwOiAvKiBSZXBsYWNlIChubyAtbCwgLWUsIG9yIC1yIHdlcmUgZ2l2ZW4pICovCisJCW5ld19mbmFtZSA9IHhhc3ByaW50ZigiJXMubmV3IiwgcGFzLT5wd19uYW1lKTsKKwkJZmQgPSBvcGVuKG5ld19mbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DfE9fQVBQRU5ELCAwNjAwKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCWJiX2NvcHlmZF9lb2Yoc3JjX2ZkLCBmZCk7CisJCQljbG9zZShmZCk7CisJCQl4cmVuYW1lKG5ld19mbmFtZSwgcGFzLT5wd19uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgY3JlYXRlICVzLyVzIiwKKwkJCQkJY3JvbnRhYl9kaXIsIG5ld19mbmFtZSk7CisJCX0KKwkJaWYgKHRtcF9mbmFtZSkKKwkJCXVubGluayh0bXBfZm5hbWUpOworCQkvKmZyZWUodG1wX2ZuYW1lKTsqLworCQkvKmZyZWUobmV3X2ZuYW1lKTsqLworCisJfSAvKiBzd2l0Y2ggKi8KKworCS8qIEJ1bXAgbm90aWZpY2F0aW9uIGZpbGUuICBIYW5kbGUgd2luZG93IHdoZXJlIGNyb25kIHBpY2tzIGZpbGUgdXAKKwkgKiBiZWZvcmUgd2UgY2FuIHdyaXRlIG91ciBlbnRyeSBvdXQuCisJICovCisJd2hpbGUgKChmZCA9IG9wZW4oQ1JPTlVQREFURSwgT19XUk9OTFl8T19DUkVBVHxPX0FQUEVORCwgMDYwMCkpID49IDApIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJZmRwcmludGYoZmQsICIlc1xuIiwgcGFzLT5wd19uYW1lKTsKKwkJaWYgKGZzdGF0KGZkLCAmc3QpICE9IDAgfHwgc3Quc3RfbmxpbmsgIT0gMCkgeworCQkJLypjbG9zZShmZCk7Ki8KKwkJCWJyZWFrOworCQl9CisJCS8qIHN0LnN0X25saW5rID09IDA6CisJCSAqIGZpbGUgd2FzIGRlbGV0ZWQsIG1heWJlIGNyb25kIG1pc3NlZCBvdXIgbm90aWZpY2F0aW9uICovCisJCWNsb3NlKGZkKTsKKwkJLyogbG9vcCAqLworCX0KKwlpZiAoZmQgPCAwKSB7CisJCWJiX2Vycm9yX21zZygiY2FuJ3QgYXBwZW5kIHRvICVzLyVzIiwKKwkJCQljcm9udGFiX2RpciwgQ1JPTlVQREFURSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2RjLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTAzNzYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2RjLmMKQEAgLTAsMCArMSwyODEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorCisvL3VzYWdlOiNkZWZpbmUgZGNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkVYUFJFU1NJT04uLi4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRjX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVGlueSBSUE4gY2FsY3VsYXRvci4gT3BlcmF0aW9uczpcbiIKKy8vdXNhZ2U6ICAgICAgICIrLCBhZGQsIC0sIHN1YiwgKiwgbXVsLCAvLCBkaXYsICUsIG1vZCwgIklGX0ZFQVRVUkVfRENfTElCTSgiKiosIGV4cCwgIikiYW5kLCBvciwgbm90LCBlb3IsXG4iCisvL3VzYWdlOiAgICAgICAicCAtIHByaW50IHRvcCBvZiB0aGUgc3RhY2sgKHdpdGhvdXQgcG9wcGluZyksXG4iCisvL3VzYWdlOiAgICAgICAiZiAtIHByaW50IGVudGlyZSBzdGFjayxcbiIKKy8vdXNhZ2U6ICAgICAgICJvIC0gcG9wIHRoZSB2YWx1ZSBhbmQgc2V0IG91dHB1dCByYWRpeCAobXVzdCBiZSAxMCwgMTYsIDggb3IgMikuXG4iCisvL3VzYWdlOiAgICAgICAiRXhhbXBsZXM6ICdkYyAyIDIgYWRkIHAnIC0+IDQsICdkYyA4IDggKiAyIDIgKyAvIHAnIC0+IDE2IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBkY19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkYyAyIDIgKyBwXG4iCisvL3VzYWdlOiAgICAgICAiNFxuIgorLy91c2FnZTogICAgICAgIiQgZGMgOCA4IFxcKiAyIDIgKyAvIHBcbiIKKy8vdXNhZ2U6ICAgICAgICIxNlxuIgorLy91c2FnZTogICAgICAgIiQgZGMgMCAxIGFuZCBwXG4iCisvL3VzYWdlOiAgICAgICAiMFxuIgorLy91c2FnZTogICAgICAgIiQgZGMgMCAxIG9yIHBcbiIKKy8vdXNhZ2U6ICAgICAgICIxXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIDcyIDkgZGl2IDggbXVsIHAgfCBkY1xuIgorLy91c2FnZTogICAgICAgIjY0XG4iCisKKyNpZiAwCit0eXBlZGVmIHVuc2lnbmVkIGRhdGFfdDsKKyNkZWZpbmUgREFUQV9GTVQgIiIKKyNlbGlmIDAKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkYXRhX3Q7CisjZGVmaW5lIERBVEFfRk1UICJsIgorI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGRhdGFfdDsKKyNkZWZpbmUgREFUQV9GTVQgImxsIgorI2VuZGlmCisKKworc3RydWN0IGdsb2JhbHMgeworCXVuc2lnbmVkIHBvaW50ZXI7CisJdW5zaWduZWQgYmFzZTsKKwlkb3VibGUgc3RhY2tbMV07Cit9IEZJWF9BTElBU0lORzsKK2VudW0geyBTVEFDS19TSVpFID0gKENPTU1PTl9CVUZTSVpFIC0gb2Zmc2V0b2Yoc3RydWN0IGdsb2JhbHMsIHN0YWNrKSkgLyBzaXplb2YoZG91YmxlKSB9OworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIHBvaW50ZXIgICAoRy5wb2ludGVyICAgKQorI2RlZmluZSBiYXNlICAgICAgKEcuYmFzZSAgICAgICkKKyNkZWZpbmUgc3RhY2sgICAgIChHLnN0YWNrICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWJhc2UgPSAxMDsgXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBwdXNoKGRvdWJsZSBhKQoreworCWlmIChwb2ludGVyID49IFNUQUNLX1NJWkUpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzdGFjayBvdmVyZmxvdyIpOworCXN0YWNrW3BvaW50ZXIrK10gPSBhOworfQorCitzdGF0aWMgZG91YmxlIHBvcCh2b2lkKQoreworCWlmIChwb2ludGVyID09IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzdGFjayB1bmRlcmZsb3ciKTsKKwlyZXR1cm4gc3RhY2tbLS1wb2ludGVyXTsKK30KKworc3RhdGljIHZvaWQgYWRkKHZvaWQpCit7CisJcHVzaChwb3AoKSArIHBvcCgpKTsKK30KKworc3RhdGljIHZvaWQgc3ViKHZvaWQpCit7CisJZG91YmxlIHN1YnRyYWhlbmQgPSBwb3AoKTsKKworCXB1c2gocG9wKCkgLSBzdWJ0cmFoZW5kKTsKK30KKworc3RhdGljIHZvaWQgbXVsKHZvaWQpCit7CisJcHVzaChwb3AoKSAqIHBvcCgpKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0RDX0xJQk0KK3N0YXRpYyB2b2lkIHBvd2VyKHZvaWQpCit7CisJZG91YmxlIHRvcG93ZXIgPSBwb3AoKTsKKworCXB1c2gocG93KHBvcCgpLCB0b3Bvd2VyKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZGl2aWRlKHZvaWQpCit7CisJZG91YmxlIGRpdmlzb3IgPSBwb3AoKTsKKworCXB1c2gocG9wKCkgLyBkaXZpc29yKTsKK30KKworc3RhdGljIHZvaWQgbW9kKHZvaWQpCit7CisJZGF0YV90IGQgPSBwb3AoKTsKKworCXB1c2goKGRhdGFfdCkgcG9wKCkgJSBkKTsKK30KKworc3RhdGljIHZvaWQgYW5kKHZvaWQpCit7CisJcHVzaCgoZGF0YV90KSBwb3AoKSAmIChkYXRhX3QpIHBvcCgpKTsKK30KKworc3RhdGljIHZvaWQgb3Iodm9pZCkKK3sKKwlwdXNoKChkYXRhX3QpIHBvcCgpIHwgKGRhdGFfdCkgcG9wKCkpOworfQorCitzdGF0aWMgdm9pZCBlb3Iodm9pZCkKK3sKKwlwdXNoKChkYXRhX3QpIHBvcCgpIF4gKGRhdGFfdCkgcG9wKCkpOworfQorCitzdGF0aWMgdm9pZCBub3Qodm9pZCkKK3sKKwlwdXNoKH4oZGF0YV90KSBwb3AoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9vdXRwdXRfYmFzZSh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGJhc2VzW10gQUxJR04xID0geyAyLCA4LCAxMCwgMTYsIDAgfTsKKwl1bnNpZ25lZCBiID0gKHVuc2lnbmVkKXBvcCgpOworCisJYmFzZSA9ICpzdHJjaHJudWwoYmFzZXMsIGIpOworCWlmIChiYXNlID09IDApIHsKKwkJYmJfZXJyb3JfbXNnKCJlcnJvciwgYmFzZSAldSBpcyBub3Qgc3VwcG9ydGVkIiwgYik7CisJCWJhc2UgPSAxMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Jhc2UoZG91YmxlIHByaW50KQoreworCWRhdGFfdCB4LCBpOworCisJeCA9IChkYXRhX3QpIHByaW50OworCWlmIChiYXNlID09IDEwKSB7CisJCWlmICh4ID09IHByaW50KSAvKiBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgdW5zaWduZWQgaW50ZWdlciAqLworCQkJcHJpbnRmKCIlIkRBVEFfRk1UInVcbiIsIHgpOworCQllbHNlCisJCQlwcmludGYoIiVnXG4iLCBwcmludCk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGJhc2UpIHsKKwljYXNlIDE2OgorCQlwcmludGYoIiUiREFUQV9GTVQieFxuIiwgeCk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJcHJpbnRmKCIlIkRBVEFfRk1UIm9cbiIsIHgpOworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBiYXNlIDIgKi8KKwkJaSA9IE1BWElOVChkYXRhX3QpIC0gKE1BWElOVChkYXRhX3QpID4+IDEpOworCQkvKiBpIGlzIDEwMDAwMC4uLjAwMDAwICovCisJCWRvIHsKKwkJCWlmICh4ICYgaSkKKwkJCQlicmVhazsKKwkJCWkgPj49IDE7CisJCX0gd2hpbGUgKGkgPiAxKTsKKwkJZG8geworCQkJYmJfcHV0Y2hhcignMScgLSAhKHggJiBpKSk7CisJCQlpID4+PSAxOworCQl9IHdoaWxlIChpKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YWNrX25vX3BvcCh2b2lkKQoreworCXVuc2lnbmVkIGkgPSBwb2ludGVyOworCXdoaWxlIChpKQorCQlwcmludF9iYXNlKHN0YWNrWy0taV0pOworfQorCitzdGF0aWMgdm9pZCBwcmludF9ub19wb3Aodm9pZCkKK3sKKwlwcmludF9iYXNlKHN0YWNrW3BvaW50ZXItMV0pOworfQorCitzdHJ1Y3Qgb3AgeworCWNvbnN0IGNoYXIgbmFtZVs0XTsKKwl2b2lkICgqZnVuY3Rpb24pICh2b2lkKTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Agb3BlcmF0b3JzW10gPSB7CisJeyIrIiwgICBhZGR9LAorCXsiYWRkIiwgYWRkfSwKKwl7Ii0iLCAgIHN1Yn0sCisJeyJzdWIiLCBzdWJ9LAorCXsiKiIsICAgbXVsfSwKKwl7Im11bCIsIG11bH0sCisJeyIvIiwgICBkaXZpZGV9LAorCXsiZGl2IiwgZGl2aWRlfSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9EQ19MSUJNCisJeyIqKiIsICBwb3dlcn0sCisJeyJleHAiLCBwb3dlcn0sCisJeyJwb3ciLCBwb3dlcn0sCisjZW5kaWYKKwl7IiUiLCAgIG1vZH0sCisJeyJtb2QiLCBtb2R9LAorCXsiYW5kIiwgYW5kfSwKKwl7Im9yIiwgIG9yfSwKKwl7Im5vdCIsIG5vdH0sCisJeyJlb3IiLCBlb3J9LAorCXsieG9yIiwgZW9yfSwKKwl7InAiLCBwcmludF9ub19wb3B9LAorCXsiZiIsIHByaW50X3N0YWNrX25vX3BvcH0sCisJeyJvIiwgc2V0X291dHB1dF9iYXNlfSwKKwl7ICIiLCBOVUxMIH0KK307CisKK3N0YXRpYyB2b2lkIHN0YWNrX21hY2hpbmUoY29uc3QgY2hhciAqYXJndW1lbnQpCit7CisJY2hhciAqZW5kUG9pbnRlcjsKKwlkb3VibGUgZDsKKwljb25zdCBzdHJ1Y3Qgb3AgKm8gPSBvcGVyYXRvcnM7CisKKwlkID0gc3RydG9kKGFyZ3VtZW50LCAmZW5kUG9pbnRlcik7CisKKwlpZiAoZW5kUG9pbnRlciAhPSBhcmd1bWVudCAmJiAqZW5kUG9pbnRlciA9PSAnXDAnKSB7CisJCXB1c2goZCk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoby0+ZnVuY3Rpb24pIHsKKwkJaWYgKHN0cmNtcChvLT5uYW1lLCBhcmd1bWVudCkgPT0gMCkgeworCQkJby0+ZnVuY3Rpb24oKTsKKwkJCXJldHVybjsKKwkJfQorCQlvKys7CisJfQorCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW50YXggZXJyb3IgYXQgJyVzJyIsIGFyZ3VtZW50KTsKK30KKworaW50IGRjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkY19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJSU5JVF9HKCk7CisKKwlhcmd2Kys7CisJaWYgKCFhcmd2WzBdKSB7CisJCS8qIHRha2Ugc3R1ZmYgZnJvbSBzdGRpbiBpZiBubyBhcmdzIGFyZSBnaXZlbiAqLworCQljaGFyICpsaW5lOworCQljaGFyICpjdXJzb3I7CisJCWNoYXIgKnRva2VuOworCQl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHN0ZGluKSkgIT0gTlVMTCkgeworCQkJY3Vyc29yID0gbGluZTsKKwkJCXdoaWxlICgxKSB7CisJCQkJdG9rZW4gPSBza2lwX3doaXRlc3BhY2UoY3Vyc29yKTsKKwkJCQlpZiAoKnRva2VuID09ICdcMCcpCisJCQkJCWJyZWFrOworCQkJCWN1cnNvciA9IHNraXBfbm9uX3doaXRlc3BhY2UodG9rZW4pOworCQkJCWlmICgqY3Vyc29yICE9ICdcMCcpCisJCQkJCSpjdXJzb3IrKyA9ICdcMCc7CisJCQkJc3RhY2tfbWFjaGluZSh0b2tlbik7CisJCQl9CisJCQlmcmVlKGxpbmUpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gd2h5PyBpdCBicmVha3MgImRjIC0yIDIgKyBwIgorCQkvL2lmIChhcmd2WzBdWzBdID09ICctJykKKwkJLy8JYmJfc2hvd191c2FnZSgpOworCQlkbyB7CisJCQlzdGFja19tYWNoaW5lKCphcmd2KTsKKwkJfSB3aGlsZSAoKisrYXJndik7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZGV2ZnNkLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZGV2ZnNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5M2ZlNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9kZXZmc2QuYwpAQCAtMCwwICsxLDE4MDkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKwlkZXZmc2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKworCUNvcHlyaWdodCAoQykgMjAwMyBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisKKwlCdXN5Ym94IHZlcnNpb24gaXMgYmFzZWQgb24gc29tZSBwcmV2aW91cyB3b3JrIGFuZCBpZGVhcworCUNvcHlyaWdodCAoQykgWzIwMDNdIGJ5IFtNYXR0ZW8gQ3JvY2VdIDwzMjk3NjI3Nzk5QHdpbmQuaXQ+CisKKwlkZXZmc2QuYworCisJTWFpbiBmaWxlIGZvciAgZGV2ZnNkICAoZGV2ZnMgZGFlbW9uIGZvciBMaW51eCkuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMiAgUmljaGFyZCBHb29jaAorCisJZGV2ZnNkLmgKKworICAgIEhlYWRlciBmaWxlIGZvciAgZGV2ZnNkICAoZGV2ZnMgZGFlbW9uIGZvciBMaW51eCkuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgUmljaGFyZCBHb29jaAorCisJY29tcGF0X25hbWUuYworCisgICAgQ29tcGF0aWJpbGl0eSBuYW1lIGZpbGUgZm9yICBkZXZmc2QgIChidWlsZCBjb21wYXRpYmlsaXR5IG5hbWVzKS4KKworICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAyICBSaWNoYXJkIEdvb2NoCisKKwlleHByZXNzaW9uLmMKKworICAgIFRoaXMgY29kZSBwcm92aWRlcyBCb3JuZSBTaGVsbC1saWtlIGV4cHJlc3Npb24gZXhwYW5zaW9uLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgIFJpY2hhcmQgR29vY2gKKworCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgICAgUmljaGFyZCBHb29jaCBtYXkgYmUgcmVhY2hlZCBieSBlbWFpbCBhdCAgcmdvb2NoQGF0bmYuY3Npcm8uYXUKKyAgICBUaGUgcG9zdGFsIGFkZHJlc3MgaXM6CisgICAgICBSaWNoYXJkIEdvb2NoLCBjL28gQVRORiwgUC4gTy4gQm94IDc2LCBFcHBpbmcsIE4uUy5XLiwgMjEyMSwgQXVzdHJhbGlhLgorKi8KKworLy91c2FnZTojZGVmaW5lIGRldmZzZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAibW50cG50IFstdl0iIElGX0RFVkZTRF9GR19OUCgiWy1mZ11bLW5wXSIpCisvL3VzYWdlOiNkZWZpbmUgZGV2ZnNkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTWFuYWdlIGRldmZzIHBlcm1pc3Npb25zIGFuZCBvbGQgZGV2aWNlIG5hbWUgc3ltbGlua3NcbiIKKy8vdXNhZ2U6ICAgICAiXG4JbW50cG50CVRoZSBtb3VudCBwb2ludCB3aGVyZSBkZXZmcyBpcyBtb3VudGVkIgorLy91c2FnZTogICAgICJcbgktdglQcmludCB0aGUgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXJzIGZvciBkZXZmc2QiCisvL3VzYWdlOiAgICAgIlxuCQlhbmQgdGhlIGtlcm5lbC1zaWRlIHByb3RvY29sIHZlcnNpb24gYW5kIGV4aXQiCisvL3VzYWdlOglJRl9ERVZGU0RfRkdfTlAoCisvL3VzYWdlOiAgICAgIlxuCS1mZwlSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLW5wCUV4aXQgYWZ0ZXIgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIgorLy91c2FnZTogICAgICJcbgkJYW5kIHByb2Nlc3Npbmcgc3ludGhldGljIFJFR0lTVEVSIGV2ZW50cywiCisvL3VzYWdlOiAgICAgIlxuCQlkb24ndCBwb2xsIGZvciBldmVudHMiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInhyZWdleC5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorCisvKiBWYXJpb3VzIGRlZmluZXMgdGFrZW4gZnJvbSBsaW51eC9tYWpvci5oICovCisjZGVmaW5lIElERTBfTUFKT1IJMworI2RlZmluZSBJREUxX01BSk9SCTIyCisjZGVmaW5lIElERTJfTUFKT1IJMzMKKyNkZWZpbmUgSURFM19NQUpPUgkzNAorI2RlZmluZSBJREU0X01BSk9SCTU2CisjZGVmaW5lIElERTVfTUFKT1IJNTcKKyNkZWZpbmUgSURFNl9NQUpPUgk4OAorI2RlZmluZSBJREU3X01BSk9SCTg5CisjZGVmaW5lIElERThfTUFKT1IJOTAKKyNkZWZpbmUgSURFOV9NQUpPUgk5MQorCisKKy8qIFZhcmlvdXMgZGVmaW5lcyB0YWtlbiBmcm9tIGxpbnV4L2RldmZzX2ZzLmggKi8KKyNkZWZpbmUgREVWRlNEX1BST1RPQ09MX1JFVklTSU9OX0tFUk5FTCAgNQorI2RlZmluZSBERVZGU0RfSU9DVExfQkFTRQknZCcKKy8qICBUaGVzZSBhcmUgdGhlIHZhcmlvdXMgaW9jdGxzICAqLworI2RlZmluZSBERVZGU0RJT0NfR0VUX1BST1RPX1JFViAgICAgICAgIF9JT1IoREVWRlNEX0lPQ1RMX0JBU0UsIDAsIGludCkKKyNkZWZpbmUgREVWRlNESU9DX1NFVF9FVkVOVF9NQVNLICAgICAgICBfSU9XKERFVkZTRF9JT0NUTF9CQVNFLCAyLCBpbnQpCisjZGVmaW5lIERFVkZTRElPQ19SRUxFQVNFX0VWRU5UX1FVRVVFICAgX0lPVyhERVZGU0RfSU9DVExfQkFTRSwgMywgaW50KQorI2RlZmluZSBERVZGU0RJT0NfU0VUX0NPTkZJR19ERUJVR19NQVNLIF9JT1coREVWRlNEX0lPQ1RMX0JBU0UsIDQsIGludCkKKyNkZWZpbmUgREVWRlNEX05PVElGWV9SRUdJU1RFUkVEICAgIDAKKyNkZWZpbmUgREVWRlNEX05PVElGWV9VTlJFR0lTVEVSRUQgIDEKKyNkZWZpbmUgREVWRlNEX05PVElGWV9BU1lOQ19PUEVOICAgIDIKKyNkZWZpbmUgREVWRlNEX05PVElGWV9DTE9TRSAgICAgICAgIDMKKyNkZWZpbmUgREVWRlNEX05PVElGWV9MT09LVVAgICAgICAgIDQKKyNkZWZpbmUgREVWRlNEX05PVElGWV9DSEFOR0UgICAgICAgIDUKKyNkZWZpbmUgREVWRlNEX05PVElGWV9DUkVBVEUgICAgICAgIDYKKyNkZWZpbmUgREVWRlNEX05PVElGWV9ERUxFVEUgICAgICAgIDcKKyNkZWZpbmUgREVWRlNfUEFUSExFTiAgICAgICAgICAgICAgIDEwMjQKKy8qICBOZXZlciBjaGFuZ2UgdGhpcyBvdGhlcndpc2UgdGhlIGJpbmFyeSBpbnRlcmZhY2Ugd2lsbCBjaGFuZ2UgICAqLworCitzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgeworCS8qICBVc2UgbmF0aXZlIEMgdHlwZXMgdG8gZW5zdXJlIHNhbWUgdHlwZXMgaW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlICAgICAqLworCXVuc2lnbmVkIGludCB0eXBlOyAgICAgICAgICAgLyogIERFVkZTRF9OT1RJRllfKiB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBtb2RlOyAgICAgICAgICAgLyogIE1vZGUgb2YgdGhlIGlub2RlIG9yIGRldmljZSBlbnRyeSAgICAgICAqLworCXVuc2lnbmVkIGludCBtYWpvcjsgICAgICAgICAgLyogIE1ham9yIG51bWJlciBvZiBkZXZpY2UgZW50cnkgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBtaW5vcjsgICAgICAgICAgLyogIE1pbm9yIG51bWJlciBvZiBkZXZpY2UgZW50cnkgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCB1aWQ7ICAgICAgICAgICAgLyogIFVpZCBvZiBwcm9jZXNzLCBpbm9kZSBvciBkZXZpY2UgZW50cnkgICAqLworCXVuc2lnbmVkIGludCBnaWQ7ICAgICAgICAgICAgLyogIEdpZCBvZiBwcm9jZXNzLCBpbm9kZSBvciBkZXZpY2UgZW50cnkgICAqLworCXVuc2lnbmVkIGludCBvdmVycnVuX2NvdW50OyAgLyogIE51bWJlciBvZiBsb3N0IGV2ZW50cyAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBuYW1lbGVuOyAgICAgICAgLyogIE51bWJlciBvZiBjaGFyYWN0ZXJzIG5vdCBpbmNsdWRpbmcgJ1wwJyAqLworCS8qICBUaGUgZGV2aWNlIG5hbWUgTVVTVCBjb21lIGxhc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWNoYXIgZGV2bmFtZVtERVZGU19QQVRITEVOXTsgLyogIFRoaXMgd2lsbCBiZSAnXDAnIHRlcm1pbmF0ZWQgICAgICAgICAgICAqLworfTsKKworI2RlZmluZSBCVUZGRVJfU0laRSAxNjM4NAorI2RlZmluZSBERVZGU0RfVkVSU0lPTiAiMS4zLjI1IgorI2RlZmluZSBDT05GSUdfRklMRSAgIi9ldGMvZGV2ZnNkLmNvbmYiCisjZGVmaW5lIE1PRFBST0JFCQkiL3NiaW4vbW9kcHJvYmUiCisjZGVmaW5lIE1PRFBST0JFX1NXSVRDSF8xICItayIKKyNkZWZpbmUgTU9EUFJPQkVfU1dJVENIXzIgIi1DIgorI2RlZmluZSBDT05GSUdfTU9EVUxFU19ERVZGUyAiL2V0Yy9tb2R1bGVzLmRldmZzIgorI2RlZmluZSBNQVhfQVJHUyAgICAgKDYgKyAxKQorI2RlZmluZSBNQVhfU1VCRVhQUiAgMTAKKyNkZWZpbmUgU1RSSU5HX0xFTkdUSCAyNTUKKworLyogZm9yIGdldF91aWRfZ2lkKCkgKi8KKyNkZWZpbmUgVUlECQkJMAorI2RlZmluZSBHSUQJCQkxCisKKy8qIGZvcmtfYW5kX2V4ZWN1dGUoKSAqLworIyBkZWZpbmUgRElFCQkJMQorIyBkZWZpbmUgTk9fRElFCQkJMAorCisvKiBmb3IgZGlyX29wZXJhdGlvbigpICovCisjZGVmaW5lIFJFU1RPUkUJCTAKKyNkZWZpbmUgU0VSVklDRQkJMQorI2RlZmluZSBSRUFEX0NPTkZJRyAyCisKKy8qICBVcGRhdGUgb25seSBhZnRlciBjaGFuZ2luZyBjb2RlIHRvIHJlZmxlY3QgbmV3IHByb3RvY29sICAqLworI2RlZmluZSBERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fREFFTU9OICA1CisKKy8qICBDb21waWxlLXRpbWUgY2hlY2sgICovCisjaWYgREVWRlNEX1BST1RPQ09MX1JFVklTSU9OX0tFUk5FTCAhPSBERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fREFFTU9OCisjZXJyb3IgcHJvdG9jb2wgdmVyc2lvbiBtaXNtYXRjaC4gVXBkYXRlIHlvdXIga2VybmVsIGhlYWRlcnMKKyNlbmRpZgorCisjZGVmaW5lIEFDX1BFUk1JU1NJT05TCQkJCTAKKyNkZWZpbmUgQUNfTU9ETE9BRAkJCQkJMQorI2RlZmluZSBBQ19FWEVDVVRFCQkJCQkyCisjZGVmaW5lIEFDX01GVU5DVElPTgkJCQkzCS8qIG5vdCBzdXBwb3J0ZWQgYnkgYnVzeWJveCAqLworI2RlZmluZSBBQ19DRlVOQ1RJT04JCQkJNAkvKiBub3Qgc3VwcG9ydGVkIGJ5IGJ1c3lib3ggKi8KKyNkZWZpbmUgQUNfQ09QWQkJCQkJCTUKKyNkZWZpbmUgQUNfSUdOT1JFCQkJCQk2CisjZGVmaW5lIEFDX01LT0xEQ09NUEFUCQkJCTcKKyNkZWZpbmUgQUNfTUtORVdDT01QQVQJCQkJOAorI2RlZmluZSBBQ19STU9MRENPTVBBVAkJCQk5CisjZGVmaW5lIEFDX1JNTkVXQ09NUEFUCQkJCTEwCisjZGVmaW5lIEFDX1JFU1RPUkUJCQkJCTExCisKK3N0cnVjdCBwZXJtaXNzaW9uc190eXBlIHsKKwltb2RlX3QgbW9kZTsKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworfTsKKworc3RydWN0IGV4ZWN1dGVfdHlwZSB7CisJY2hhciAqYXJndltNQVhfQVJHUyArIDFdOyAgLyogIGFyZ3ZbMF0gbXVzdCBhbHdheXMgYmUgdGhlIHByb2dyYW1tZSAgKi8KK307CisKK3N0cnVjdCBjb3B5X3R5cGUgeworCWNvbnN0IGNoYXIgKnNvdXJjZTsKKwljb25zdCBjaGFyICpkZXN0aW5hdGlvbjsKK307CisKK3N0cnVjdCBhY3Rpb25fdHlwZSB7CisJdW5zaWduZWQgaW50IHdoYXQ7CisJdW5zaWduZWQgaW50IHdoZW47Cit9OworCitzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCB7CisJc3RydWN0IGFjdGlvbl90eXBlIGFjdGlvbjsKKwlyZWdleF90IHByZWc7CisJdW5pb24KKwl7CisJc3RydWN0IHBlcm1pc3Npb25zX3R5cGUgcGVybWlzc2lvbnM7CisJc3RydWN0IGV4ZWN1dGVfdHlwZSBleGVjdXRlOworCXN0cnVjdCBjb3B5X3R5cGUgY29weTsKKwl9CisJdTsKKwlzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqbmV4dDsKK307CisKK3N0cnVjdCBnZXRfdmFyaWFibGVfaW5mbyB7CisJY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvOworCWNvbnN0IGNoYXIgKmRldm5hbWU7CisJY2hhciBkZXZwYXRoW1NUUklOR19MRU5HVEhdOworfTsKKworc3RhdGljIHZvaWQgZGlyX29wZXJhdGlvbihpbnQgLCBjb25zdCBjaGFyICogLCBpbnQsICB1bnNpZ25lZCBsb25nKik7CitzdGF0aWMgdm9pZCBzZXJ2aWNlKHN0cnVjdCBzdGF0IHN0YXRidWYsIGNoYXIgKnBhdGgpOworc3RhdGljIGludCBzdF9leHByX2V4cGFuZChjaGFyICosIHVuc2lnbmVkLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKigqKShjb25zdCBjaGFyICosIHZvaWQgKiksIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X29sZF9uYW1lKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQsIGNoYXIgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKK3N0YXRpYyBpbnQgbWtzeW1saW5rKGNvbnN0IGNoYXIgKm9sZHBhdGgsIGNvbnN0IGNoYXIgKm5ld3BhdGgpOworc3RhdGljIHZvaWQgcmVhZF9jb25maWdfZmlsZShjaGFyICpwYXRoLCBpbnQgb3B0aW9uYWwsIHVuc2lnbmVkIGxvbmcgKmV2ZW50X21hc2spOworc3RhdGljIHZvaWQgcHJvY2Vzc19jb25maWdfbGluZShjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CitzdGF0aWMgaW50ICBkb19zZXJ2aWNpbmcoaW50LCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHNlcnZpY2VfbmFtZShjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhY3Rpb25fcGVybWlzc2lvbnMoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICosIGNvbnN0IHN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICopOworc3RhdGljIHZvaWQgYWN0aW9uX2V4ZWN1dGUoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICosIGNvbnN0IHN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICosCisJCQkJCQkJY29uc3QgcmVnbWF0Y2hfdCAqLCB1bnNpZ25lZCk7CitzdGF0aWMgdm9pZCBhY3Rpb25fbW9kbG9hZChjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKmluZm8sIGNvbnN0IHN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICplbnRyeSk7CitzdGF0aWMgdm9pZCBhY3Rpb25fY29weShjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKiwgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKiwKKwkJCQkJCSBjb25zdCByZWdtYXRjaF90ICosIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIGFjdGlvbl9jb21wYXQoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICosIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIGZyZWVfY29uZmlnKHZvaWQpOworc3RhdGljIHZvaWQgcmVzdG9yZShjaGFyICpzcGF0aCwgc3RydWN0IHN0YXQgc291cmNlX3N0YXQsIGludCByb290bGVuKTsKK3N0YXRpYyBpbnQgY29weV9pbm9kZShjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBzdGF0ICosIG1vZGVfdCwgY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqKTsKK3N0YXRpYyBtb2RlX3QgZ2V0X21vZGUoY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCk7CitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3ZhcmlhYmxlKGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgbWFrZV9kaXJfdHJlZShjb25zdCBjaGFyICopOworc3RhdGljIGludCBleHBhbmRfZXhwcmVzc2lvbihjaGFyICosIHVuc2lnbmVkLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKigqKShjb25zdCBjaGFyICosIHZvaWQgKiksIHZvaWQgKiwKKwkJCQkJCQkgY29uc3QgY2hhciAqLCBjb25zdCByZWdtYXRjaF90ICosIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIGV4cGFuZF9yZWdleHAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCByZWdtYXRjaF90ICosIHVuc2lnbmVkKTsKK3N0YXRpYyBjb25zdCBjaGFyICpleHBhbmRfdmFyaWFibGUoCWNoYXIgKiwgdW5zaWduZWQsIHVuc2lnbmVkICosIGNvbnN0IGNoYXIgKiwKKwkJCQkJCQkJCWNvbnN0IGNoYXIgKigqKShjb25zdCBjaGFyICosIHZvaWQgKiksIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3ZhcmlhYmxlX3YyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKCopKGNvbnN0IGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK3N0YXRpYyBjaGFyIGdldF9vbGRfaWRlX25hbWUodW5zaWduZWQgLCB1bnNpZ25lZCk7CitzdGF0aWMgY2hhciAqd3JpdGVfb2xkX3NkX25hbWUoY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQsIGNvbnN0IGNoYXIgKik7CisKKy8qIGJ1c3lib3ggZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGdldF91aWRfZ2lkKGludCBmbGFnLCBjb25zdCBjaGFyICpzdHJpbmcpOworc3RhdGljIHZvaWQgc2FmZV9tZW1jcHkoY2hhciAqIGRlc3QsIGNvbnN0IGNoYXIgKiBzcmMsIGludCBsZW4pOworc3RhdGljIHVuc2lnbmVkIGludCBzY2FuX2Rldl9uYW1lX2NvbW1vbihjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgbiwgaW50IGFkZGVuZHVtLCBjb25zdCBjaGFyICpwdHIpOworc3RhdGljIHVuc2lnbmVkIGludCBzY2FuX2Rldl9uYW1lKGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCBuLCBjb25zdCBjaGFyICpwdHIpOworCisvKiBTdHJ1Y3RzIGFuZCB2YXJzICovCitzdGF0aWMgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmZpcnN0X2NvbmZpZyA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmxhc3RfY29uZmlnID0gTlVMTDsKK3N0YXRpYyBjaGFyICptb3VudF9wb2ludCA9IE5VTEw7CitzdGF0aWMgdm9sYXRpbGUgaW50IGNhdWdodF9zaWduYWwgPSBGQUxTRTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY2F1Z2h0X3NpZ2h1cCA9IEZBTFNFOworc3RhdGljIHN0cnVjdCBpbml0aWFsX3N5bWxpbmtfc3RydWN0IHsKKwljb25zdCBjaGFyICpkZXN0OworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IGluaXRpYWxfc3ltbGlua3NbXSA9IHsKKwl7Ii9wcm9jL3NlbGYvZmQiLCAiZmQifSwKKwl7ImZkLzAiLCAic3RkaW4ifSwKKwl7ImZkLzEiLCAic3Rkb3V0In0sCisJeyJmZC8yIiwgInN0ZGVyciJ9LAorCXtOVUxMLCBOVUxMfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfdHlwZSB7CisJdW5zaWduZWQgaW50IHR5cGU7ICAgICAgICAvKiAgVGhlIERFVkZTRF9OT1RJRllfKiB2YWx1ZSAgICAgICAgICAgICAgICAgICovCisJY29uc3QgY2hhciAqY29uZmlnX25hbWU7ICAvKiAgVGhlIG5hbWUgdXNlZCBpbiB0aGUgY29uZmlnIGZpbGUgICAgICAgICAgICovCit9IGV2ZW50X3R5cGVzW10gPSB7CisJe0RFVkZTRF9OT1RJRllfUkVHSVNURVJFRCwgICAiUkVHSVNURVIifSwKKwl7REVWRlNEX05PVElGWV9VTlJFR0lTVEVSRUQsICJVTlJFR0lTVEVSIn0sCisJe0RFVkZTRF9OT1RJRllfQVNZTkNfT1BFTiwgICAiQVNZTkNfT1BFTiJ9LAorCXtERVZGU0RfTk9USUZZX0NMT1NFLCAgICAgICAgIkNMT1NFIn0sCisJe0RFVkZTRF9OT1RJRllfTE9PS1VQLCAgICAgICAiTE9PS1VQIn0sCisJe0RFVkZTRF9OT1RJRllfQ0hBTkdFLCAgICAgICAiQ0hBTkdFIn0sCisJe0RFVkZTRF9OT1RJRllfQ1JFQVRFLCAgICAgICAiQ1JFQVRFIn0sCisJe0RFVkZTRF9OT1RJRllfREVMRVRFLCAgICAgICAiREVMRVRFIn0sCisJezB4ZmZmZmZmZmYsICAgICAgICAgICAgICAgICBOVUxMfQorfTsKKworLyogQnVzeWJveCBtZXNzYWdlcyAqLworCitzdGF0aWMgY29uc3QgY2hhciBiYl9tc2dfcHJvdG9fcmV2W10gQUxJR04xICAgICAgICAgID0gInByb3RvY29sIHJldmlzaW9uIjsKK3N0YXRpYyBjb25zdCBjaGFyIGJiX21zZ19iYWRfY29uZmlnW10gQUxJR04xICAgICAgICAgPSAiYmFkICVzIGNvbmZpZyBmaWxlOiAlcyI7CitzdGF0aWMgY29uc3QgY2hhciBiYl9tc2dfc21hbGxfYnVmZmVyW10gQUxJR04xICAgICAgID0gImJ1ZmZlciB0b28gc21hbGwiOworc3RhdGljIGNvbnN0IGNoYXIgYmJfbXNnX3ZhcmlhYmxlX25vdF9mb3VuZFtdIEFMSUdOMSA9ICJ2YXJpYWJsZTogJXMgbm90IGZvdW5kIjsKKworLyogQnVzeWJveCBzdHVmZiAqLworI2lmIEVOQUJMRV9ERVZGU0RfVkVSQk9TRSB8fCBFTkFCTEVfREVCVUcKKyNkZWZpbmUgaW5mb19sb2dnZXIocCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgYmJfaW5mb19tc2coZm10LCAjIyBhcmdzKQorI2RlZmluZSBtc2dfbG9nZ2VyKHAsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICBiYl9lcnJvcl9tc2coZm10LCAjIyBhcmdzKQorI2RlZmluZSBtc2dfbG9nZ2VyX2FuZF9kaWUocCwgZm10LCBhcmdzLi4uKSAgICAgICAgICBiYl9lcnJvcl9tc2dfYW5kX2RpZShmbXQsICMjIGFyZ3MpCisjZGVmaW5lIGVycm9yX2xvZ2dlcihwLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgIGJiX3BlcnJvcl9tc2coZm10LCAjIyBhcmdzKQorI2RlZmluZSBlcnJvcl9sb2dnZXJfYW5kX2RpZShwLCBmbXQsIGFyZ3MuLi4pICAgICAgICBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoZm10LCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgaW5mb19sb2dnZXIocCwgZm10LCBhcmdzLi4uKQorI2RlZmluZSBtc2dfbG9nZ2VyKHAsIGZtdCwgYXJncy4uLikKKyNkZWZpbmUgbXNnX2xvZ2dlcl9hbmRfZGllKHAsIGZtdCwgYXJncy4uLikgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKQorI2RlZmluZSBlcnJvcl9sb2dnZXIocCwgZm10LCBhcmdzLi4uKQorI2RlZmluZSBlcnJvcl9sb2dnZXJfYW5kX2RpZShwLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpCisjZW5kaWYKKworc3RhdGljIHZvaWQgc2FmZV9tZW1jcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgbGVuKQoreworCW1lbWNweShkZXN0ICwgc3JjLCBsZW4pOworCWRlc3RbbGVuXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2Nhbl9kZXZfbmFtZV9jb21tb24oY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IG4sIGludCBhZGRlbmR1bSwgY29uc3QgY2hhciAqcHRyKQoreworCWlmIChkW24gLSA0XSA9PSAnZCcgJiYgZFtuIC0gM10gPT0gJ2knICYmIGRbbiAtIDJdID09ICdzJyAmJiBkW24gLSAxXSA9PSAnYycpCisJCXJldHVybiAyICsgYWRkZW5kdW07CisJaWYgKGRbbiAtIDJdID09ICdjJyAmJiBkW24gLSAxXSA9PSAnZCcpCisJCXJldHVybiAzICsgYWRkZW5kdW07CisJaWYgKHB0clswXSA9PSAncCcgJiYgcHRyWzFdID09ICdhJyAmJiBwdHJbMl0gPT0gJ3InICYmIHB0clszXSA9PSAndCcpCisJCXJldHVybiA0ICsgYWRkZW5kdW07CisJaWYgKHB0cltuIC0gMl0gPT0gJ20nICYmIHB0cltuIC0gMV0gPT0gJ3QnKQorCQlyZXR1cm4gNSArIGFkZGVuZHVtOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5fZGV2X25hbWUoY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IG4sIGNvbnN0IGNoYXIgKnB0cikKK3sKKwlpZiAoZFswXSA9PSAncycgJiYgZFsxXSA9PSAnYycgJiYgZFsyXSA9PSAncycgJiYgZFszXSA9PSAnaScgJiYgZFs0XSA9PSAnLycpIHsKKwkJaWYgKGRbbiAtIDddID09ICdnJyAmJiBkW24gLSA2XSA9PSAnZScgJiYgZFtuIC0gNV0gPT0gJ24nCisJCQkmJiBkW24gLSA0XSA9PSAnZScgJiYgZFtuIC0gM10gPT0gJ3InICYmIGRbbiAtIDJdID09ICdpJyAmJiBkW24gLSAxXSA9PSAnYycKKwkJKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiBzY2FuX2Rldl9uYW1lX2NvbW1vbihkLCBuLCAwLCBwdHIpOworCX0KKwlpZiAoZFswXSA9PSAnaScgJiYgZFsxXSA9PSAnZCcgJiYgZFsyXSA9PSAnZScgJiYgZFszXSA9PSAnLycKKwkJJiYgZFs0XSA9PSAnaCcgJiYgZFs1XSA9PSAnbycgJiYgZFs2XSA9PSAncycgJiYgZFs3XSA9PSAndCcKKwkpCisJCXJldHVybiBzY2FuX2Rldl9uYW1lX2NvbW1vbihkLCBuLCA0LCBwdHIpOworCWlmIChkWzBdID09ICdzJyAmJiBkWzFdID09ICdiJyAmJiBkWzJdID09ICdwJyAmJiBkWzNdID09ICcvJykKKwkJcmV0dXJuIDEwOworCWlmIChkWzBdID09ICd2JyAmJiBkWzFdID09ICdjJyAmJiBkWzJdID09ICdjJyAmJiBkWzNdID09ICcvJykKKwkJcmV0dXJuIDExOworCWlmIChkWzBdID09ICdwJyAmJiBkWzFdID09ICd0JyAmJiBkWzJdID09ICd5JyAmJiBkWzNdID09ICcvJykKKwkJcmV0dXJuIDEyOworCXJldHVybiAwOworfQorCisvKiAgUHVibGljIGZ1bmN0aW9ucyBmb2xsb3cgICovCisKK2ludCBkZXZmc2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRldmZzZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcHJpbnRfdmVyc2lvbiA9IEZBTFNFOworCWludCBkb19kYWVtb24gPSBUUlVFOworCWludCBub19wb2xsaW5nID0gRkFMU0U7CisJaW50IGRvX3NjYW47CisJaW50IGZkLCBwcm90b19yZXYsIGNvdW50OworCXVuc2lnbmVkIGxvbmcgZXZlbnRfbWFzayA9IDA7CisJc3RydWN0IHNpZ2FjdGlvbiBuZXdfYWN0aW9uOworCXN0cnVjdCBpbml0aWFsX3N5bWxpbmtfc3RydWN0ICpjdXJyOworCisJaWYgKGFyZ2MgPCAyKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlmb3IgKGNvdW50ID0gMjsgY291bnQgPCBhcmdjOyArK2NvdW50KSB7CisJCWlmIChhcmd2W2NvdW50XVswXSA9PSAnLScpIHsKKwkJCWlmIChhcmd2W2NvdW50XVsxXSA9PSAndicgJiYgIWFyZ3ZbY291bnRdWzJdKSAvKiAtdiAqLworCQkJCXByaW50X3ZlcnNpb24gPSBUUlVFOworCQkJZWxzZSBpZiAoRU5BQkxFX0RFVkZTRF9GR19OUCAmJiBhcmd2W2NvdW50XVsxXSA9PSAnZicKKwkJCSAmJiBhcmd2W2NvdW50XVsyXSA9PSAnZycgJiYgIWFyZ3ZbY291bnRdWzNdKSAvKiAtZmcgKi8KKwkJCQlkb19kYWVtb24gPSBGQUxTRTsKKwkJCWVsc2UgaWYgKEVOQUJMRV9ERVZGU0RfRkdfTlAgJiYgYXJndltjb3VudF1bMV0gPT0gJ24nCisJCQkgJiYgYXJndltjb3VudF1bMl0gPT0gJ3AnICYmICFhcmd2W2NvdW50XVszXSkgLyogLW5wICovCisJCQkJbm9fcG9sbGluZyA9IFRSVUU7CisJCQllbHNlCisJCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCisJbW91bnRfcG9pbnQgPSBiYl9zaW1wbGlmeV9wYXRoKGFyZ3ZbMV0pOworCisJeGNoZGlyKG1vdW50X3BvaW50KTsKKworCWZkID0geG9wZW4oIi5kZXZmc2QiLCBPX1JET05MWSk7CisJY2xvc2Vfb25fZXhlY19vbihmZCk7CisJeGlvY3RsKGZkLCBERVZGU0RJT0NfR0VUX1BST1RPX1JFViwgJnByb3RvX3Jldik7CisKKwkvKnNldHVwIGluaXRpYWwgZW50cmllcyAqLworCWZvciAoY3VyciA9IGluaXRpYWxfc3ltbGlua3M7IGN1cnItPmRlc3QgIT0gTlVMTDsgKytjdXJyKQorCQlzeW1saW5rKGN1cnItPmRlc3QsIGN1cnItPm5hbWUpOworCisJLyogTkI6IFRoZSBjaGVjayBmb3IgQ09ORklHX0ZJTEUgaXMgZG9uZSBpbiByZWFkX2NvbmZpZ19maWxlKCkgKi8KKworCWlmIChwcmludF92ZXJzaW9uIHx8IChERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fREFFTU9OICE9IHByb3RvX3JldikpIHsKKwkJcHJpbnRmKCIlcyB2JXNcbkRhZW1vbiAlczpcdCVkXG5LZXJuZWwtc2lkZSAlczpcdCVkXG4iLAorCQkJCWFwcGxldF9uYW1lLCBERVZGU0RfVkVSU0lPTiwgYmJfbXNnX3Byb3RvX3JldiwKKwkJCQlERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fREFFTU9OLCBiYl9tc2dfcHJvdG9fcmV2LCBwcm90b19yZXYpOworCQlpZiAoREVWRlNEX1BST1RPQ09MX1JFVklTSU9OX0RBRU1PTiAhPSBwcm90b19yZXYpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgbWlzbWF0Y2ghIiwgYmJfbXNnX3Byb3RvX3Jldik7CisJCWV4aXQoRVhJVF9TVUNDRVNTKTsgLyogLXYgKi8KKwl9CisJLyogIFRlbGwga2VybmVsIHdlIGFyZSBzcGVjaWFsKGkuZS4gd2UgZ2V0IHRvIHNlZSBoaWRkZW4gZW50cmllcykgICovCisJeGlvY3RsKGZkLCBERVZGU0RJT0NfU0VUX0VWRU5UX01BU0ssIDApOworCisJLyogIFNldCB1cCBTSUdIVVAgYW5kIFNJR1VTUjEgaGFuZGxlcnMgICovCisJc2lnZW1wdHlzZXQoJm5ld19hY3Rpb24uc2FfbWFzayk7CisJbmV3X2FjdGlvbi5zYV9mbGFncyA9IDA7CisJbmV3X2FjdGlvbi5zYV9oYW5kbGVyID0gc2lnbmFsX2hhbmRsZXI7CisJc2lnYWN0aW9uX3NldChTSUdIVVAsICZuZXdfYWN0aW9uKTsKKwlzaWdhY3Rpb25fc2V0KFNJR1VTUjEsICZuZXdfYWN0aW9uKTsKKworCXByaW50ZigiJXMgdiVzIHN0YXJ0ZWQgZm9yICVzXG4iLCBhcHBsZXRfbmFtZSwgREVWRlNEX1ZFUlNJT04sIG1vdW50X3BvaW50KTsKKworCS8qICBTZXQgdW1hc2sgc28gdGhhdCBta25vZCgyKSwgb3BlbigyKSBhbmQgbWtkaXIoMikgaGF2ZSBjb21wbGV0ZSBjb250cm9sIG92ZXIgcGVybWlzc2lvbnMgICovCisJdW1hc2soMCk7CisJcmVhZF9jb25maWdfZmlsZSgoY2hhciopQ09ORklHX0ZJTEUsIEZBTFNFLCAmZXZlbnRfbWFzayk7CisJLyogIERvIHRoZSBzY2FuIGJlZm9yZSBmb3JraW5nLCBzbyB0aGF0IGJvb3Qgc2NyaXB0cyBzZWUgdGhlIGZpbmlzaGVkIHByb2R1Y3QgICovCisJZGlyX29wZXJhdGlvbihTRVJWSUNFLCBtb3VudF9wb2ludCwgMCwgTlVMTCk7CisKKwlpZiAoRU5BQkxFX0RFVkZTRF9GR19OUCAmJiBub19wb2xsaW5nKQorCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisKKwlpZiAoRU5BQkxFX0RFVkZTRF9WRVJCT1NFIHx8IEVOQUJMRV9ERUJVRykKKwkJbG9nbW9kZSA9IExPR01PREVfQk9USDsKKwllbHNlIGlmIChkb19kYWVtb24gPT0gVFJVRSkKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworCS8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgKi8KKwkvKmVsc2UKKwkJbG9nbW9kZSA9IExPR01PREVfU1RESU87ICovCisKKwlpZiAoZG9fZGFlbW9uKSB7CisJCS8qICBSZWxlYXNlIHNvIHRoYXQgdGhlIGNoaWxkIGNhbiBncmFiIGl0ICAqLworCQl4aW9jdGwoZmQsIERFVkZTRElPQ19SRUxFQVNFX0VWRU5UX1FVRVVFLCAwKTsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAsIGFyZ3YpOworCX0gZWxzZSBpZiAoRU5BQkxFX0RFVkZTRF9GR19OUCkgeworCQlzZXRwZ2lkKDAsIDApOyAgLyogIEJlY29tZSBwcm9jZXNzIGdyb3VwIGxlYWRlciAgICAgICAgICAgICAgICAgICAgKi8KKwl9CisKKwl3aGlsZSAoVFJVRSkgeworCQlkb19zY2FuID0gZG9fc2VydmljaW5nKGZkLCBldmVudF9tYXNrKTsKKworCQlmcmVlX2NvbmZpZygpOworCQlyZWFkX2NvbmZpZ19maWxlKChjaGFyKilDT05GSUdfRklMRSwgRkFMU0UsICZldmVudF9tYXNrKTsKKwkJaWYgKGRvX3NjYW4pCisJCQlkaXJfb3BlcmF0aW9uKFNFUlZJQ0UsIG1vdW50X3BvaW50LCAwLCBOVUxMKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKG1vdW50X3BvaW50KTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIG1haW4gICovCisKKworLyogIFByaXZhdGUgZnVuY3Rpb25zIGZvbGxvdyAgKi8KKworc3RhdGljIHZvaWQgcmVhZF9jb25maWdfZmlsZShjaGFyICpwYXRoLCBpbnQgb3B0aW9uYWwsIHVuc2lnbmVkIGxvbmcgKmV2ZW50X21hc2spCisvKiAgW1NVTU1BUlldIFJlYWQgYSBjb25maWd1cmF0aW9uIGRhdGFiYXNlLgorICAgIDxwYXRoPiBUaGUgcGF0aCB0byByZWFkIHRoZSBkYXRhYmFzZSBmcm9tLiBJZiB0aGlzIGlzIGEgZGlyZWN0b3J5LCBhbGwKKyAgICBlbnRyaWVzIGluIHRoYXQgZGlyZWN0b3J5IHdpbGwgYmUgcmVhZChleGNlcHQgaGlkZGVuIGVudHJpZXMpLgorICAgIDxvcHRpb25hbD4gSWYgVFJVRSwgdGhlIHJvdXRpbmUgd2lsbCBzaWxlbnRseSBpZ25vcmUgYSBtaXNzaW5nIGNvbmZpZyBmaWxlLgorICAgIDxldmVudF9tYXNrPiBUaGUgZXZlbnQgbWFzayBpcyB3cml0dGVuIGhlcmUuIFRoaXMgaXMgbm90IGluaXRpYWxpc2VkLgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCUZJTEUgKmZwOworCWNoYXIgYnVmW1NUUklOR19MRU5HVEhdOworCWNoYXIgKmxpbmUgPSBOVUxMOworCWNoYXIgKnA7CisKKwlpZiAoc3RhdChwYXRoLCAmc3RhdGJ1ZikgPT0gMCkgeworCQkvKiBEb24ndCByZWFkIDAgbGVuZ3RoIGZpbGVzOiBpZ25vcmVkICovCisJCS8qaWYgKHN0YXRidWYuc3Rfc2l6ZSA9PSAwKQorCQkJCXJldHVybjsqLworCQlpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7CisJCQlwID0gYmJfc2ltcGxpZnlfcGF0aChwYXRoKTsKKwkJCWRpcl9vcGVyYXRpb24oUkVBRF9DT05GSUcsIHAsIDAsIGV2ZW50X21hc2spOworCQkJZnJlZShwKTsKKwkJCXJldHVybjsKKwkJfQorCQlmcCA9IGZvcGVuX2Zvcl9yZWFkKHBhdGgpOworCQlpZiAoZnAgIT0gTlVMTCkgeworCQkJd2hpbGUgKGZnZXRzKGJ1ZiwgU1RSSU5HX0xFTkdUSCwgZnApICE9IE5VTEwpIHsKKwkJCQkvKiAgU2tpcCB3aGl0ZXNwYWNlICAqLworCQkJCWxpbmUgPSBidWY7CisJCQkJbGluZSA9IHNraXBfd2hpdGVzcGFjZShsaW5lKTsKKwkJCQlpZiAobGluZVswXSA9PSAnXDAnIHx8IGxpbmVbMF0gPT0gJyMnKQorCQkJCQljb250aW51ZTsKKwkJCQlwcm9jZXNzX2NvbmZpZ19saW5lKGxpbmUsIGV2ZW50X21hc2spOworCQkJfQorCQkJZmNsb3NlKGZwKTsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gcmVhZF9jb25maWdfZmlsZV9lcnI7CisJCX0KKwl9IGVsc2UgeworcmVhZF9jb25maWdfZmlsZV9lcnI6CisJCWlmIChvcHRpb25hbCA9PSAwICYmIGVycm5vID09IEVOT0VOVCkKKwkJCWVycm9yX2xvZ2dlcl9hbmRfZGllKExPR19FUlIsICJyZWFkIGNvbmZpZyBmaWxlOiAlcyIsIHBhdGgpOworCX0KK30gICAvKiAgRW5kIEZ1bmN0aW9uIHJlYWRfY29uZmlnX2ZpbGUgICAqLworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2NvbmZpZ19saW5lKGNvbnN0IGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgKmV2ZW50X21hc2spCisvKiAgW1NVTU1BUlldIFByb2Nlc3MgYSBsaW5lIGZyb20gYSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgPGxpbmU+IFRoZSBjb25maWd1cmF0aW9uIGxpbmUuCisgICAgPGV2ZW50X21hc2s+IFRoZSBldmVudCBtYXNrIGlzIHdyaXR0ZW4gaGVyZS4gVGhpcyBpcyBub3QgaW5pdGlhbGlzZWQuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCWludCAgbnVtX2FyZ3MsIGNvdW50OworCXN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICpuZXc7CisJY2hhciBwW01BWF9BUkdTXVtTVFJJTkdfTEVOR1RIXTsKKwljaGFyIHdoZW5bU1RSSU5HX0xFTkdUSF0sIHdoYXRbU1RSSU5HX0xFTkdUSF07CisJY2hhciBuYW1lW1NUUklOR19MRU5HVEhdOworCWNvbnN0IGNoYXIgKm1zZyA9ICIiOworCWNoYXIgKnB0cjsKKwlpbnQgaTsKKworCS8qICEhISEgT25seSBVcHBlcmNhc2UgS2V5d29yZHMgaW4gZGV2c2ZkLmNvbmYgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBvcHRpb25zW10gQUxJR04xID0KKwkJIkNMRUFSX0NPTkZJR1wwIiJJTkNMVURFXDAiIk9QVElPTkFMX0lOQ0xVREVcMCIKKwkJIlJFU1RPUkVcMCIiUEVSTUlTU0lPTlNcMCIiTU9ETE9BRFwwIiJFWEVDVVRFXDAiCisJCSJDT1BZXDAiIklHTk9SRVwwIiJNS09MRENPTVBBVFwwIiJNS05FV0NPTVBBVFwwIgorCQkiUk1PTERDT01QQVRcMCIiUk1ORVdDT01QQVRcMCI7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNQVhfQVJHUzsgKytjb3VudCkKKwkJcFtjb3VudF1bMF0gPSAnXDAnOworCW51bV9hcmdzID0gc3NjYW5mKGxpbmUsICIlcyAlcyAlcyAlcyAlcyAlcyAlcyAlcyAlcyAlcyIsCisJCQl3aGVuLCBuYW1lLCB3aGF0LAorCQkJcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgcFs2XSk7CisKKwlpID0gaW5kZXhfaW5fc3RyaW5ncyhvcHRpb25zLCB3aGVuKTsKKworCS8qICJDTEVBUl9DT05GSUciICovCisJaWYgKGkgPT0gMCkgeworCQlmcmVlX2NvbmZpZygpOworCQkqZXZlbnRfbWFzayA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAobnVtX2FyZ3MgPCAyKQorCQlnb3RvIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOworCisJLyogIklOQ0xVREUiICYgIk9QVElPTkFMX0lOQ0xVREUiICovCisJaWYgKGkgPT0gMSB8fCBpID09IDIpIHsKKwkJc3RfZXhwcl9leHBhbmQobmFtZSwgU1RSSU5HX0xFTkdUSCwgbmFtZSwgZ2V0X3ZhcmlhYmxlLCBOVUxMKTsKKwkJaW5mb19sb2dnZXIoTE9HX0lORk8sICIlc2luY2x1ZGU6ICVzIiwgKHRvdXBwZXIod2hlblswXSkgPT0gJ0knKSA/ICIiOiAib3B0aW9uYWxfIiwgbmFtZSk7CisJCXJlYWRfY29uZmlnX2ZpbGUobmFtZSwgKHRvdXBwZXIod2hlblswXSkgPT0gJ0knKSA/IEZBTFNFIDogVFJVRSwgZXZlbnRfbWFzayk7CisJCXJldHVybjsKKwl9CisJLyogIlJFU1RPUkUiICovCisJaWYgKGkgPT0gMykgeworCQlkaXJfb3BlcmF0aW9uKFJFU1RPUkUsIG5hbWUsIHN0cmxlbihuYW1lKSxOVUxMKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobnVtX2FyZ3MgPCAzKQorCQlnb3RvIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOworCisJbmV3ID0geHphbGxvYyhzaXplb2YgKm5ldyk7CisKKwlmb3IgKGNvdW50ID0gMDsgZXZlbnRfdHlwZXNbY291bnRdLmNvbmZpZ19uYW1lICE9IE5VTEw7ICsrY291bnQpIHsKKwkJaWYgKHN0cmNhc2VjbXAod2hlbiwgZXZlbnRfdHlwZXNbY291bnRdLmNvbmZpZ19uYW1lKSAhPSAwKQorCQkJY29udGludWU7CisJCW5ldy0+YWN0aW9uLndoZW4gPSBldmVudF90eXBlc1tjb3VudF0udHlwZTsKKwkJYnJlYWs7CisJfQorCWlmIChldmVudF90eXBlc1tjb3VudF0uY29uZmlnX25hbWUgPT0gTlVMTCkgeworCQltc2cgPSAiV0hFTiBpbiI7CisJCWdvdG8gcHJvY2Vzc19jb25maWdfbGluZV9lcnI7CisJfQorCisJaSA9IGluZGV4X2luX3N0cmluZ3Mob3B0aW9ucywgd2hhdCk7CisKKwlzd2l0Y2ggKGkpIHsKKwkJY2FzZSA0OgkvKiAiUEVSTUlTU0lPTlMiICovCisJCQluZXctPmFjdGlvbi53aGF0ID0gQUNfUEVSTUlTU0lPTlM7CisJCQkvKiAgR2V0IHVzZXIgYW5kIGdyb3VwICAqLworCQkJcHRyID0gc3RyY2hyKHBbMF0sICcuJyk7CisJCQlpZiAocHRyID09IE5VTEwpIHsKKwkJCQltc2cgPSAiVUlELkdJRCI7CisJCQkJZ290byBwcm9jZXNzX2NvbmZpZ19saW5lX2VycjsgLyoibWlzc2luZyAnLicgaW4gVUlELkdJRCIqLworCQkJfQorCisJCQkqcHRyKysgPSAnXDAnOworCQkJbmV3LT51LnBlcm1pc3Npb25zLnVpZCA9IGdldF91aWRfZ2lkKFVJRCwgcFswXSk7CisJCQluZXctPnUucGVybWlzc2lvbnMuZ2lkID0gZ2V0X3VpZF9naWQoR0lELCBwdHIpOworCQkJLyogIEdldCBtb2RlICAqLworCQkJbmV3LT51LnBlcm1pc3Npb25zLm1vZGUgPSBnZXRfbW9kZShwWzFdKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CS8qICBNT0RMT0FEICovCisJCQkvKlRoaXMgIGFjdGlvbiB3aWxsIHBhc3MgIi9kZXYvJGRldm5hbWUiKGkuZS4gIi9kZXYvIiBwcmVmaXhlZCB0bworCQkJdGhlIGRldmljZSBuYW1lKSB0byB0aGUgbW9kdWxlIGxvYWRpbmcgIGZhY2lsaXR5LiAgSW4gIGFkZGl0aW9uLAorCQkJdGhlIC9ldGMvbW9kdWxlcy5kZXZmcyBjb25maWd1cmF0aW9uIGZpbGUgaXMgdXNlZC4qLworCQkJIGlmIChFTkFCTEVfREVWRlNEX01PRExPQUQpCisJCQkJbmV3LT5hY3Rpb24ud2hhdCA9IEFDX01PRExPQUQ7CisJCQkgYnJlYWs7CisJCWNhc2UgNjogLyogRVhFQ1VURSAqLworCQkJbmV3LT5hY3Rpb24ud2hhdCA9IEFDX0VYRUNVVEU7CisJCQludW1fYXJncyAtPSAzOworCisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBudW1fYXJnczsgKytjb3VudCkKKwkJCQluZXctPnUuZXhlY3V0ZS5hcmd2W2NvdW50XSA9IHhzdHJkdXAocFtjb3VudF0pOworCisJCQluZXctPnUuZXhlY3V0ZS5hcmd2W251bV9hcmdzXSA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSA3OiAvKiBDT1BZICovCisJCQluZXctPmFjdGlvbi53aGF0ID0gQUNfQ09QWTsKKwkJCW51bV9hcmdzIC09IDM7CisJCQlpZiAobnVtX2FyZ3MgIT0gMikKKwkJCQlnb3RvIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOyAvKiBtaXNzaW5nIHBhdGggYW5kIGZ1bmN0aW9uIGluIGxpbmUgKi8KKworCQkJbmV3LT51LmNvcHkuc291cmNlID0geHN0cmR1cChwWzBdKTsKKwkJCW5ldy0+dS5jb3B5LmRlc3RpbmF0aW9uID0geHN0cmR1cChwWzFdKTsKKwkJCWJyZWFrOworCQljYXNlIDg6IC8qIElHTk9SRSAqLworCQkvKiBGQUxMVFJPVUdIICovCisJCWNhc2UgOTogLyogTUtPTERDT01QQVQgKi8KKwkJLyogRkFMTFRST1VHSCAqLworCQljYXNlIDEwOiAvKiBNS05FV0NPTVBBVCAqLworCQkvKiBGQUxMVFJPVUdIICovCisJCWNhc2UgMTE6LyogUk1PTERDT01QQVQgKi8KKwkJLyogRkFMTFRST1VHSCAqLworCQljYXNlIDEyOiAvKiBSTU5FV0NPTVBBVCAqLworCQkvKglBQ19JR05PUkUJCQkJCTYKKwkJCUFDX01LT0xEQ09NUEFUCQkJCTcKKwkJCUFDX01LTkVXQ09NUEFUCQkJCTgKKwkJCUFDX1JNT0xEQ09NUEFUCQkJCTkKKwkJCUFDX1JNTkVXQ09NUEFUCQkJCTEwKi8KKwkJCW5ldy0+YWN0aW9uLndoYXQgPSBpIC0gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbXNnID0gIldIQVQgaW4iOworCQkJZ290byBwcm9jZXNzX2NvbmZpZ19saW5lX2VycjsKKwkJLyplc2FjKi8KKwl9IC8qIHN3aXRjaCAoaSkgKi8KKworCXhyZWdjb21wKCZuZXctPnByZWcsIG5hbWUsIFJFR19FWFRFTkRFRCk7CisKKwkqZXZlbnRfbWFzayB8PSAxIDw8IG5ldy0+YWN0aW9uLndoZW47CisJbmV3LT5uZXh0ID0gTlVMTDsKKwlpZiAoZmlyc3RfY29uZmlnID09IE5VTEwpCisJCWZpcnN0X2NvbmZpZyA9IG5ldzsKKwllbHNlCisJCWxhc3RfY29uZmlnLT5uZXh0ID0gbmV3OworCWxhc3RfY29uZmlnID0gbmV3OworCXJldHVybjsKKworIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOgorCW1zZ19sb2dnZXJfYW5kX2RpZShMT0dfRVJSLCBiYl9tc2dfYmFkX2NvbmZpZywgbXNnICwgbGluZSk7Cit9ICAvKiAgRW5kIEZ1bmN0aW9uIHByb2Nlc3NfY29uZmlnX2xpbmUgICAqLworCitzdGF0aWMgaW50IGRvX3NlcnZpY2luZyhpbnQgZmQsIHVuc2lnbmVkIGxvbmcgZXZlbnRfbWFzaykKKy8qICBbU1VNTUFSWV0gU2VydmljZSBkZXZmcyBjaGFuZ2VzIHVudGlsIGEgc2lnbmFsIGlzIHJlY2VpdmVkLgorICAgIDxmZD4gVGhlIG9wZW4gY29udHJvbCBmaWxlLgorICAgIDxldmVudF9tYXNrPiBUaGUgZXZlbnQgbWFzay4KKyAgICBbUkVUVVJOU10gVFJVRSBpZiBTSUdIVVAgd2FzIGNhdWdodCwgZWxzZSBGQUxTRS4KKyovCit7CisJc3NpemVfdCBieXRlczsKKwlzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgaW5mbzsKKworCS8qICh2b2lkKikgY2FzdCBpcyBvbmx5IGluIG9yZGVyIHRvIG1hdGNoIHByb3RvdHlwZSAqLworCXhpb2N0bChmZCwgREVWRlNESU9DX1NFVF9FVkVOVF9NQVNLLCAodm9pZCopZXZlbnRfbWFzayk7CisJd2hpbGUgKCFjYXVnaHRfc2lnbmFsKSB7CisJCWVycm5vID0gMDsKKwkJYnl0ZXMgPSByZWFkKGZkLCAoY2hhciAqKSAmaW5mbywgc2l6ZW9mIGluZm8pOworCQlpZiAoY2F1Z2h0X3NpZ25hbCkKKwkJCWJyZWFrOyAgICAgIC8qICBNdXN0IHRlc3QgZm9yIHRoaXMgZmlyc3QgICAgICovCisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCWNvbnRpbnVlOyAgLyogIFllcywgdGhlIG9yZGVyIGlzIGltcG9ydGFudCAgKi8KKwkJaWYgKGJ5dGVzIDwgMSkKKwkJCWJyZWFrOworCQlzZXJ2aWNlX25hbWUoJmluZm8pOworCX0KKwlpZiAoY2F1Z2h0X3NpZ25hbCkgeworCQlpbnQgY19zaWdodXAgPSBjYXVnaHRfc2lnaHVwOworCisJCWNhdWdodF9zaWduYWwgPSBGQUxTRTsKKwkJY2F1Z2h0X3NpZ2h1cCA9IEZBTFNFOworCQlyZXR1cm4gY19zaWdodXA7CisJfQorCW1zZ19sb2dnZXJfYW5kX2RpZShMT0dfRVJSLCAicmVhZCBlcnJvciBvbiBjb250cm9sIGZpbGUiKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGRvX3NlcnZpY2luZyAgKi8KKworc3RhdGljIHZvaWQgc2VydmljZV9uYW1lKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbykKKy8qICBbU1VNTUFSWV0gU2VydmljZSBhIHNpbmdsZSBkZXZmcyBjaGFuZ2UuCisgICAgPGluZm8+IFRoZSBkZXZmcyBjaGFuZ2UuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXVuc2lnbmVkIGludCBuOworCXJlZ21hdGNoX3QgbWJ1ZltNQVhfU1VCRVhQUl07CisJc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmVudHJ5OworCisJaWYgKEVOQUJMRV9ERUJVRyAmJiBpbmZvLT5vdmVycnVuX2NvdW50ID4gMCkKKwkJbXNnX2xvZ2dlcihMT0dfRVJSLCAibG9zdCAldSBldmVudHMiLCBpbmZvLT5vdmVycnVuX2NvdW50KTsKKworCS8qICBEaXNjYXJkIGxvb2t1cHMgb24gIi9kZXYvbG9nIiBhbmQgIi9kZXYvaW5pdGN0bCIgICovCisJaWYgKGluZm8tPnR5cGUgPT0gREVWRlNEX05PVElGWV9MT09LVVAKKwkJJiYgKChpbmZvLT5kZXZuYW1lWzBdID09ICdsJyAmJiBpbmZvLT5kZXZuYW1lWzFdID09ICdvJworCQkmJiBpbmZvLT5kZXZuYW1lWzJdID09ICdnJyAmJiAhaW5mby0+ZGV2bmFtZVszXSkKKwkJfHwgKGluZm8tPmRldm5hbWVbMF0gPT0gJ2knICYmIGluZm8tPmRldm5hbWVbMV0gPT0gJ24nCisJCSYmIGluZm8tPmRldm5hbWVbMl0gPT0gJ2knICYmIGluZm8tPmRldm5hbWVbM10gPT0gJ3QnCisJCSYmIGluZm8tPmRldm5hbWVbNF0gPT0gJ2MnICYmIGluZm8tPmRldm5hbWVbNV0gPT0gJ3QnCisJCSYmIGluZm8tPmRldm5hbWVbNl0gPT0gJ2wnICYmICFpbmZvLT5kZXZuYW1lWzddKSkKKwkpCisJCXJldHVybjsKKworCWZvciAoZW50cnkgPSBmaXJzdF9jb25maWc7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKwkJLyogIEZpcnN0IGNoZWNrIGlmIGFjdGlvbiBtYXRjaGVzIHRoZSB0eXBlLCB0aGVuIGNoZWNrIGlmIG5hbWUgbWF0Y2hlcyAqLworCQlpZiAoaW5mby0+dHlwZSAhPSBlbnRyeS0+YWN0aW9uLndoZW4KKwkJfHwgcmVnZXhlYygmZW50cnktPnByZWcsIGluZm8tPmRldm5hbWUsIE1BWF9TVUJFWFBSLCBtYnVmLCAwKSAhPSAwKQorCQkJY29udGludWU7CisJCWZvciAobiA9IDA7KG4gPCBNQVhfU1VCRVhQUikgJiYgKG1idWZbbl0ucm1fc28gIT0gLTEpOyArK24pCisJCQkvKiBWT0lEICovOworCisJCXN3aXRjaCAoZW50cnktPmFjdGlvbi53aGF0KSB7CisJCQljYXNlIEFDX1BFUk1JU1NJT05TOgorCQkJCWFjdGlvbl9wZXJtaXNzaW9ucyhpbmZvLCBlbnRyeSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDX01PRExPQUQ6CisJCQkJaWYgKEVOQUJMRV9ERVZGU0RfTU9ETE9BRCkKKwkJCQkJYWN0aW9uX21vZGxvYWQoaW5mbywgZW50cnkpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ19FWEVDVVRFOgorCQkJCWFjdGlvbl9leGVjdXRlKGluZm8sIGVudHJ5LCBtYnVmLCBuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNfQ09QWToKKwkJCQlhY3Rpb25fY29weShpbmZvLCBlbnRyeSwgbWJ1Ziwgbik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDX0lHTk9SRToKKwkJCQlyZXR1cm47CisJCQkJLypicmVhazsqLworCQkJY2FzZSBBQ19NS09MRENPTVBBVDoKKwkJCWNhc2UgQUNfTUtORVdDT01QQVQ6CisJCQljYXNlIEFDX1JNT0xEQ09NUEFUOgorCQkJY2FzZSBBQ19STU5FV0NPTVBBVDoKKwkJCQlhY3Rpb25fY29tcGF0KGluZm8sIGVudHJ5LT5hY3Rpb24ud2hhdCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW1zZ19sb2dnZXJfYW5kX2RpZShMT0dfRVJSLCAiVW5rbm93biBhY3Rpb24iKTsKKwkJfQorCX0KK30gICAvKiAgRW5kIEZ1bmN0aW9uIHNlcnZpY2VfbmFtZSAgKi8KKworc3RhdGljIHZvaWQgYWN0aW9uX3Blcm1pc3Npb25zKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqZW50cnkpCisvKiAgW1NVTU1BUlldIFVwZGF0ZSBwZXJtaXNzaW9ucyBmb3IgYSBkZXZpY2UgZW50cnkuCisgICAgPGluZm8+IFRoZSBkZXZmcyBjaGFuZ2UuCisgICAgPGVudHJ5PiBUaGUgY29uZmlnIGZpbGUgZW50cnkuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwlpZiAoc3RhdChpbmZvLT5kZXZuYW1lLCAmc3RhdGJ1ZikgIT0gMAorCSB8fCBjaG1vZChpbmZvLT5kZXZuYW1lLCAoc3RhdGJ1Zi5zdF9tb2RlICYgU19JRk1UKSB8IChlbnRyeS0+dS5wZXJtaXNzaW9ucy5tb2RlICYgflNfSUZNVCkpICE9IDAKKwkgfHwgY2hvd24oaW5mby0+ZGV2bmFtZSwgZW50cnktPnUucGVybWlzc2lvbnMudWlkLCBlbnRyeS0+dS5wZXJtaXNzaW9ucy5naWQpICE9IDAKKwkpCisJCWVycm9yX2xvZ2dlcihMT0dfRVJSLCAiQ2FuJ3QgY2htb2Qgb3IgY2hvd246ICVzIiwgaW5mby0+ZGV2bmFtZSk7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBhY3Rpb25fcGVybWlzc2lvbnMgICovCisKK3N0YXRpYyB2b2lkIGFjdGlvbl9tb2Rsb2FkKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqZW50cnkgVU5VU0VEX1BBUkFNKQorLyogIFtTVU1NQVJZXSBMb2FkIGEgbW9kdWxlLgorICAgIDxpbmZvPiBUaGUgZGV2ZnMgY2hhbmdlLgorICAgIDxlbnRyeT4gVGhlIGNvbmZpZyBmaWxlIGVudHJ5LgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwljaGFyICphcmd2WzZdOworCisJYXJndlswXSA9IChjaGFyKilNT0RQUk9CRTsKKwlhcmd2WzFdID0gKGNoYXIqKU1PRFBST0JFX1NXSVRDSF8xOyAvKiAiLWsiICovCisJYXJndlsyXSA9IChjaGFyKilNT0RQUk9CRV9TV0lUQ0hfMjsgLyogIi1DIiAqLworCWFyZ3ZbM10gPSAoY2hhciopQ09ORklHX01PRFVMRVNfREVWRlM7CisJYXJndls0XSA9IGNvbmNhdF9wYXRoX2ZpbGUoIi9kZXYiLCBpbmZvLT5kZXZuYW1lKTsgLyogZGV2aWNlICovCisJYXJndls1XSA9IE5VTEw7CisKKwlzcGF3bl9hbmRfd2FpdChhcmd2KTsKKwlmcmVlKGFyZ3ZbNF0pOworfSAgLyogIEVuZCBGdW5jdGlvbiBhY3Rpb25fbW9kbG9hZCAgKi8KKworc3RhdGljIHZvaWQgYWN0aW9uX2V4ZWN1dGUoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvLAorCQkJICAgIGNvbnN0IHN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICplbnRyeSwKKwkJCSAgICBjb25zdCByZWdtYXRjaF90ICpyZWdleHByLCB1bnNpZ25lZCBpbnQgbnVtZXhwcikKKy8qICBbU1VNTUFSWV0gRXhlY3V0ZSBhIHByb2dyYW1tZS4KKyAgICA8aW5mbz4gVGhlIGRldmZzIGNoYW5nZS4KKyAgICA8ZW50cnk+IFRoZSBjb25maWcgZmlsZSBlbnRyeS4KKyAgICA8cmVnZXhwcj4gVGhlIG51bWJlciBvZiBzdWJleHByZXNzaW9uKHN0YXJ0LCBlbmQpIG9mZnNldHMgd2l0aGluIHRoZQorICAgIGRldmljZSBuYW1lLgorICAgIDxudW1leHByPiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiA8PHJlZ2V4cHI+Pi4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJdW5zaWduZWQgaW50IGNvdW50OworCXN0cnVjdCBnZXRfdmFyaWFibGVfaW5mbyBndl9pbmZvOworCWNoYXIgKmFyZ3ZbTUFYX0FSR1MgKyAxXTsKKwljaGFyIGxhcmd2W01BWF9BUkdTICsgMV1bU1RSSU5HX0xFTkdUSF07CisKKwlndl9pbmZvLmluZm8gPSBpbmZvOworCWd2X2luZm8uZGV2bmFtZSA9IGluZm8tPmRldm5hbWU7CisJc25wcmludGYoZ3ZfaW5mby5kZXZwYXRoLCBzaXplb2YoZ3ZfaW5mby5kZXZwYXRoKSwgIiVzLyVzIiwgbW91bnRfcG9pbnQsIGluZm8tPmRldm5hbWUpOworCWZvciAoY291bnQgPSAwOyBlbnRyeS0+dS5leGVjdXRlLmFyZ3ZbY291bnRdICE9IE5VTEw7ICsrY291bnQpIHsKKwkJZXhwYW5kX2V4cHJlc3Npb24obGFyZ3ZbY291bnRdLCBTVFJJTkdfTEVOR1RILAorCQkJCWVudHJ5LT51LmV4ZWN1dGUuYXJndltjb3VudF0sCisJCQkJZ2V0X3ZhcmlhYmxlLCAmZ3ZfaW5mbywKKwkJCQlndl9pbmZvLmRldm5hbWUsIHJlZ2V4cHIsIG51bWV4cHIpOworCQlhcmd2W2NvdW50XSA9IGxhcmd2W2NvdW50XTsKKwl9CisJYXJndltjb3VudF0gPSBOVUxMOworCXNwYXduX2FuZF93YWl0KGFyZ3YpOworfSAgIC8qICBFbmQgRnVuY3Rpb24gYWN0aW9uX2V4ZWN1dGUgICovCisKKworc3RhdGljIHZvaWQgYWN0aW9uX2NvcHkoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvLAorCQkJIGNvbnN0IHN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICplbnRyeSwKKwkJCSBjb25zdCByZWdtYXRjaF90ICpyZWdleHByLCB1bnNpZ25lZCBpbnQgbnVtZXhwcikKKy8qICBbU1VNTUFSWV0gQ29weSBwZXJtaXNzaW9ucy4KKyAgICA8aW5mbz4gVGhlIGRldmZzIGNoYW5nZS4KKyAgICA8ZW50cnk+IFRoZSBjb25maWcgZmlsZSBlbnRyeS4KKyAgICA8cmVnZXhwcj4gVGhpcyBsaXN0IG9mIHN1YmV4cHJlc3Npb24oc3RhcnQsIGVuZCkgb2Zmc2V0cyB3aXRoaW4gdGhlCisgICAgZGV2aWNlIG5hbWUuCisgICAgPG51bWV4cHI+IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gPDxyZWdleHByPj4uCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCW1vZGVfdCBuZXdfbW9kZTsKKwlzdHJ1Y3QgZ2V0X3ZhcmlhYmxlX2luZm8gZ3ZfaW5mbzsKKwlzdHJ1Y3Qgc3RhdCBzb3VyY2Vfc3RhdCwgZGVzdF9zdGF0OworCWNoYXIgc291cmNlW1NUUklOR19MRU5HVEhdLCBkZXN0aW5hdGlvbltTVFJJTkdfTEVOR1RIXTsKKwlpbnQgcmV0ID0gMDsKKworCWRlc3Rfc3RhdC5zdF9tb2RlID0gMDsKKworCWlmICgoaW5mby0+dHlwZSA9PSBERVZGU0RfTk9USUZZX0NIQU5HRSkgJiYgU19JU0xOSyhpbmZvLT5tb2RlKSkKKwkJcmV0dXJuOworCWd2X2luZm8uaW5mbyA9IGluZm87CisJZ3ZfaW5mby5kZXZuYW1lID0gaW5mby0+ZGV2bmFtZTsKKworCXNucHJpbnRmKGd2X2luZm8uZGV2cGF0aCwgc2l6ZW9mKGd2X2luZm8uZGV2cGF0aCksICIlcy8lcyIsIG1vdW50X3BvaW50LCBpbmZvLT5kZXZuYW1lKTsKKwlleHBhbmRfZXhwcmVzc2lvbihzb3VyY2UsIFNUUklOR19MRU5HVEgsIGVudHJ5LT51LmNvcHkuc291cmNlLAorCQkJCWdldF92YXJpYWJsZSwgJmd2X2luZm8sIGd2X2luZm8uZGV2bmFtZSwKKwkJCQlyZWdleHByLCBudW1leHByKTsKKworCWV4cGFuZF9leHByZXNzaW9uKGRlc3RpbmF0aW9uLCBTVFJJTkdfTEVOR1RILCBlbnRyeS0+dS5jb3B5LmRlc3RpbmF0aW9uLAorCQkJCWdldF92YXJpYWJsZSwgJmd2X2luZm8sIGd2X2luZm8uZGV2bmFtZSwKKwkJCQlyZWdleHByLCBudW1leHByKTsKKworCWlmICghbWFrZV9kaXJfdHJlZShkZXN0aW5hdGlvbikgfHwgbHN0YXQoc291cmNlLCAmc291cmNlX3N0YXQpICE9IDApCisJCQlyZXR1cm47CisJbHN0YXQoZGVzdGluYXRpb24sICZkZXN0X3N0YXQpOworCW5ld19tb2RlID0gc291cmNlX3N0YXQuc3RfbW9kZSAmIH5TX0lTVlRYOworCWlmIChpbmZvLT50eXBlID09IERFVkZTRF9OT1RJRllfQ1JFQVRFKQorCQluZXdfbW9kZSB8PSBTX0lTVlRYOworCWVsc2UgaWYgKChpbmZvLT50eXBlID09IERFVkZTRF9OT1RJRllfQ0hBTkdFKSAmJihkZXN0X3N0YXQuc3RfbW9kZSAmIFNfSVNWVFgpKQorCQluZXdfbW9kZSB8PSBTX0lTVlRYOworCXJldCA9IGNvcHlfaW5vZGUoZGVzdGluYXRpb24sICZkZXN0X3N0YXQsIG5ld19tb2RlLCBzb3VyY2UsICZzb3VyY2Vfc3RhdCk7CisJaWYgKEVOQUJMRV9ERUJVRyAmJiByZXQgJiYgKGVycm5vICE9IEVFWElTVCkpCisJCWVycm9yX2xvZ2dlcihMT0dfRVJSLCAiY29weV9pbm9kZTogJXMgdG8gJXMiLCBzb3VyY2UsIGRlc3RpbmF0aW9uKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGFjdGlvbl9jb3B5ICAqLworCitzdGF0aWMgdm9pZCBhY3Rpb25fY29tcGF0KGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbywgdW5zaWduZWQgaW50IGFjdGlvbikKKy8qICBbU1VNTUFSWV0gUHJvY2VzcyBhIGNvbXBhdGliaWxpdHkgcmVxdWVzdC4KKyAgICA8aW5mbz4gVGhlIGRldmZzIGNoYW5nZS4KKyAgICA8YWN0aW9uPiBUaGUgYWN0aW9uIHRvIHRha2UuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCWludCByZXQ7CisJY29uc3QgY2hhciAqY29tcGF0X25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKmRlc3RfbmFtZSA9IGluZm8tPmRldm5hbWU7CisJY29uc3QgY2hhciAqcHRyOworCWNoYXIgY29tcGF0X2J1ZltTVFJJTkdfTEVOR1RIXSwgZGVzdF9idWZbU1RSSU5HX0xFTkdUSF07CisJaW50IG1vZGUsIGhvc3QsIGJ1cywgdGFyZ2V0LCBsdW47CisJdW5zaWduZWQgaW50IGk7CisJY2hhciByZXdpbmRfOworCS8qIDEgdG8gNSAgInNjc2kvIiAsIDYgdG8gOSAiaWRlL2hvc3QiICovCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZtdFtdID0geworCQlOVUxMICwKKwkJInNnL2MlZGIlZHQlZHUlZCIsCQkvKiBzY3NpL2dlbmVyaWMgKi8KKwkJInNkL2MlZGIlZHQlZHUlZCIsCQkvKiBzY3NpL2Rpc2MgKi8KKwkJInNyL2MlZGIlZHQlZHUlZCIsCQkvKiBzY3NpL2NkICovCisJCSJzZC9jJWRiJWR0JWR1JWRwJWQiLAkJLyogc2NzaS9wYXJ0ICovCisJCSJzdC9jJWRiJWR0JWR1JWRtJWQlYyIsCQkvKiBzY3NpL210ICovCisJCSJpZGUvaGQvYyVkYiVkdCVkdSVkIiwJCS8qIGlkZS9ob3N0L2Rpc2MgKi8KKwkJImlkZS9jZC9jJWRiJWR0JWR1JWQiLAkJLyogaWRlL2hvc3QvY2QgKi8KKwkJImlkZS9oZC9jJWRiJWR0JWR1JWRwJWQiLAkvKiBpZGUvaG9zdC9wYXJ0ICovCisJCSJpZGUvbXQvYyVkYiVkdCVkdSVkJXMiLAkvKiBpZGUvaG9zdC9tdCAqLworCQlOVUxMCisJfTsKKworCS8qICBGaXJzdCBjb25zdHJ1Y3QgY29tcGF0aWJpbGl0eSBuYW1lICAqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJCWNhc2UgQUNfTUtPTERDT01QQVQ6CisJCWNhc2UgQUNfUk1PTERDT01QQVQ6CisJCQljb21wYXRfbmFtZSA9IGdldF9vbGRfbmFtZShpbmZvLT5kZXZuYW1lLCBpbmZvLT5uYW1lbGVuLCBjb21wYXRfYnVmLCBpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpOworCQkJYnJlYWs7CisJCWNhc2UgQUNfTUtORVdDT01QQVQ6CisJCWNhc2UgQUNfUk1ORVdDT01QQVQ6CisJCQlwdHIgPSBiYl9iYXNlbmFtZShpbmZvLT5kZXZuYW1lKTsKKwkJCWkgPSBzY2FuX2Rldl9uYW1lKGluZm8tPmRldm5hbWUsIGluZm8tPm5hbWVsZW4sIHB0cik7CisKKwkJCS8qIG5vdGhpbmcgZm91bmQgKi8KKwkJCWlmIChpID09IDAgfHwgaSA+IDkpCisJCQkJcmV0dXJuOworCisJCQlzc2NhbmYoaW5mby0+ZGV2bmFtZSArICgoaSA8IDYpID8gNSA6IDQpLCAiaG9zdCVkL2J1cyVkL3RhcmdldCVkL2x1biVkLyIsICZob3N0LCAmYnVzLCAmdGFyZ2V0LCAmbHVuKTsKKwkJCXNucHJpbnRmKGRlc3RfYnVmLCBzaXplb2YoZGVzdF9idWYpLCAiLi4vJXMiLCBpbmZvLT5kZXZuYW1lICsgKCggaSA+IDUpID8gNCA6IDApKTsKKwkJCWRlc3RfbmFtZSA9IGRlc3RfYnVmOworCQkJY29tcGF0X25hbWUgPSBjb21wYXRfYnVmOworCisKKwkJCS8qIDEgPT0gc2NzaS9nZW5lcmljICAyID09IHNjc2kvZGlzYyAzID09IHNjc2kvY2QgNiA9PSBpZGUvaG9zdC9kaXNjIDcgPT0gaWRlL2hvc3QvY2QgKi8KKwkJCWlmIChpID09IDEgfHwgaSA9PSAyIHx8IGkgPT0gMyB8fCBpID09IDYgfHwgaSA9PTcpCisJCQkJc3ByaW50Zihjb21wYXRfYnVmLCBmbXRbaV0sIGhvc3QsIGJ1cywgdGFyZ2V0LCBsdW4pOworCisJCQkvKiA0ID09IHNjc2kvcGFydCA4ID09IGlkZS9ob3N0L3BhcnQgKi8KKwkJCWlmIChpID09IDQgfHwgaSA9PSA4KQorCQkJCXNwcmludGYoY29tcGF0X2J1ZiwgZm10W2ldLCBob3N0LCBidXMsIHRhcmdldCwgbHVuLCBhdG9pKHB0ciArIDQpKTsKKworCQkJLyogNSA9PSBzY3NpL210ICovCisJCQlpZiAoaSA9PSA1KSB7CisJCQkJcmV3aW5kXyA9IGluZm8tPmRldm5hbWVbaW5mby0+bmFtZWxlbiAtIDFdOworCQkJCWlmIChyZXdpbmRfICE9ICduJykKKwkJCQkJcmV3aW5kXyA9ICdcMCc7CisJCQkJbW9kZT0wOworCQkJCWlmIChwdHJbMl0gPT0gICdsJyAvKjEwOCovIHx8IHB0clsyXSA9PSAnbScvKjEwOSovKQorCQkJCQltb2RlID0gcHRyWzJdIC0gMTA3OyAvKiAxIG9yIDIgKi8KKwkJCQlpZiAocHRyWzJdID09ICAnYScpCisJCQkJCW1vZGUgPSAzOworCQkJCXNwcmludGYoY29tcGF0X2J1ZiwgZm10W2ldLCBob3N0LCBidXMsIHRhcmdldCwgbHVuLCBtb2RlLCByZXdpbmRfKTsKKwkJCX0KKworCQkJLyogOSA9PSBpZGUvaG9zdC9tdCAqLworCQkJaWYgKGkgPT0gIDkpCisJCQkJc25wcmludGYoY29tcGF0X2J1Ziwgc2l6ZW9mKGNvbXBhdF9idWYpLCBmbXRbaV0sIGhvc3QsIGJ1cywgdGFyZ2V0LCBsdW4sIHB0ciArIDIpOworCQkvKiBlc2FjICovCisJfSAvKiBzd2l0Y2ggKGFjdGlvbikgKi8KKworCWlmIChjb21wYXRfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiAgTm93IGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQgICovCisJc3dpdGNoIChhY3Rpb24pIHsKKwkJY2FzZSBBQ19NS09MRENPTVBBVDoKKwkJY2FzZSBBQ19NS05FV0NPTVBBVDoKKwkJCW1rc3ltbGluayhkZXN0X25hbWUsIGNvbXBhdF9uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIEFDX1JNT0xEQ09NUEFUOgorCQljYXNlIEFDX1JNTkVXQ09NUEFUOgorCQkJcmV0ID0gdW5saW5rKGNvbXBhdF9uYW1lKTsKKwkJCWlmIChFTkFCTEVfREVCVUcgJiYgcmV0KQorCQkJCWVycm9yX2xvZ2dlcihMT0dfRVJSLCAidW5saW5rOiAlcyIsIGNvbXBhdF9uYW1lKTsKKwkJCWJyZWFrOworCQkvKmVzYWMqLworCX0gLyogc3dpdGNoIChhY3Rpb24pICovCit9ICAgLyogIEVuZCBGdW5jdGlvbiBhY3Rpb25fY29tcGF0ICAqLworCitzdGF0aWMgdm9pZCByZXN0b3JlKGNoYXIgKnNwYXRoLCBzdHJ1Y3Qgc3RhdCBzb3VyY2Vfc3RhdCwgaW50IHJvb3RsZW4pCit7CisJY2hhciAqZHBhdGg7CisJc3RydWN0IHN0YXQgZGVzdF9zdGF0OworCisJZGVzdF9zdGF0LnN0X21vZGUgPSAwOworCWRwYXRoID0gY29uY2F0X3BhdGhfZmlsZShtb3VudF9wb2ludCwgc3BhdGggKyByb290bGVuKTsKKwlsc3RhdChkcGF0aCwgJmRlc3Rfc3RhdCk7CisJZnJlZShkcGF0aCk7CisJaWYgKFNfSVNMTksoc291cmNlX3N0YXQuc3RfbW9kZSkgfHwgKHNvdXJjZV9zdGF0LnN0X21vZGUgJiBTX0lTVlRYKSkKKwkJY29weV9pbm9kZShkcGF0aCwgJmRlc3Rfc3RhdCwgKHNvdXJjZV9zdGF0LnN0X21vZGUgJiB+U19JU1ZUWCksIHNwYXRoLCAmc291cmNlX3N0YXQpOworCisJaWYgKFNfSVNESVIoc291cmNlX3N0YXQuc3RfbW9kZSkpCisJCWRpcl9vcGVyYXRpb24oUkVTVE9SRSwgc3BhdGgsIHJvb3RsZW4sIE5VTEwpOworfQorCisKK3N0YXRpYyBpbnQgY29weV9pbm9kZShjb25zdCBjaGFyICpkZXN0cGF0aCwgY29uc3Qgc3RydWN0IHN0YXQgKmRlc3Rfc3RhdCwKKwkJCW1vZGVfdCBuZXdfbW9kZSwKKwkJCWNvbnN0IGNoYXIgKnNvdXJjZXBhdGgsIGNvbnN0IHN0cnVjdCBzdGF0ICpzb3VyY2Vfc3RhdCkKKy8qICBbU1VNTUFSWV0gQ29weSBhbiBpbm9kZS4KKyAgICA8ZGVzdHBhdGg+IFRoZSBkZXN0aW5hdGlvbiBwYXRoLiBBbiBleGlzdGluZyBpbm9kZSBtYXkgYmUgZGVsZXRlZC4KKyAgICA8ZGVzdF9zdGF0PiBUaGUgZGVzdGluYXRpb24gc3RhdCgyKSBpbmZvcm1hdGlvbi4KKyAgICA8bmV3X21vZGU+IFRoZSBkZXNpcmVkIG5ldyBtb2RlIGZvciB0aGUgZGVzdGluYXRpb24uCisgICAgPHNvdXJjZXBhdGg+IFRoZSBzb3VyY2UgcGF0aC4KKyAgICA8c291cmNlX3N0YXQ+IFRoZSBzb3VyY2Ugc3RhdCgyKSBpbmZvcm1hdGlvbi4KKyAgICBbUkVUVVJOU10gVFJVRSBvbiBzdWNjZXNzLCBlbHNlIEZBTFNFLgorKi8KK3sKKwlpbnQgc291cmNlX2xlbiwgZGVzdF9sZW47CisJY2hhciBzb3VyY2VfbGlua1tTVFJJTkdfTEVOR1RIXSwgZGVzdF9saW5rW1NUUklOR19MRU5HVEhdOworCWludCBmZCwgdmFsOworCXN0cnVjdCBzb2NrYWRkcl91biB1bl9hZGRyOworCWNoYXIgc3ltbGlua192YWxbU1RSSU5HX0xFTkdUSF07CisKKwlpZiAoKHNvdXJjZV9zdGF0LT5zdF9tb2RlICYgU19JRk1UKSA9PShkZXN0X3N0YXQtPnN0X21vZGUgJiBTX0lGTVQpKSB7CisJCS8qICBTYW1lIHR5cGUgICovCisJCWlmIChTX0lTTE5LKHNvdXJjZV9zdGF0LT5zdF9tb2RlKSkgeworCQkJc291cmNlX2xlbiA9IHJlYWRsaW5rKHNvdXJjZXBhdGgsIHNvdXJjZV9saW5rLCBTVFJJTkdfTEVOR1RIIC0gMSk7CisJCQlpZiAoKHNvdXJjZV9sZW4gPCAwKQorCQkJIHx8IChkZXN0X2xlbiA9IHJlYWRsaW5rKGRlc3RwYXRoLCBkZXN0X2xpbmssIFNUUklOR19MRU5HVEggLSAxKSkgPCAwCisJCQkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJc291cmNlX2xpbmtbc291cmNlX2xlbl0JPSAnXDAnOworCQkJZGVzdF9saW5rW2Rlc3RfbGVuXQk9ICdcMCc7CisJCQlpZiAoKHNvdXJjZV9sZW4gIT0gZGVzdF9sZW4pIHx8IChzdHJjbXAoc291cmNlX2xpbmssIGRlc3RfbGluaykgIT0gMCkpIHsKKwkJCQl1bmxpbmsoZGVzdHBhdGgpOworCQkJCXN5bWxpbmsoc291cmNlX2xpbmssIGRlc3RwYXRoKTsKKwkJCX0KKwkJCXJldHVybiBUUlVFOworCQl9ICAgLyogIEVsc2Ugbm90IGEgc3ltbGluayAgKi8KKwkJY2htb2QoZGVzdHBhdGgsIG5ld19tb2RlICYgflNfSUZNVCk7CisJCWNob3duKGRlc3RwYXRoLCBzb3VyY2Vfc3RhdC0+c3RfdWlkLCBzb3VyY2Vfc3RhdC0+c3RfZ2lkKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCS8qICBEaWZmZXJlbnQgdHlwZXM6IHVubGluayBhbmQgY3JlYXRlICAqLworCXVubGluayhkZXN0cGF0aCk7CisJc3dpdGNoIChzb3VyY2Vfc3RhdC0+c3RfbW9kZSAmIFNfSUZNVCkgeworCQljYXNlIFNfSUZTT0NLOgorCQkJZmQgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCQkJaWYgKGZkIDwgMCkKKwkJCQlicmVhazsKKwkJCXVuX2FkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisJCQlzbnByaW50Zih1bl9hZGRyLnN1bl9wYXRoLCBzaXplb2YodW5fYWRkci5zdW5fcGF0aCksICIlcyIsIGRlc3RwYXRoKTsKKwkJCXZhbCA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnVuX2FkZHIsIChpbnQpIHNpemVvZiB1bl9hZGRyKTsKKwkJCWNsb3NlKGZkKTsKKwkJCWlmICh2YWwgIT0gMCB8fCBjaG1vZChkZXN0cGF0aCwgbmV3X21vZGUgJiB+U19JRk1UKSAhPSAwKQorCQkJCWJyZWFrOworCQkJZ290byBkb19jaG93bjsKKwkJY2FzZSBTX0lGTE5LOgorCQkJdmFsID0gcmVhZGxpbmsoc291cmNlcGF0aCwgc3ltbGlua192YWwsIFNUUklOR19MRU5HVEggLSAxKTsKKwkJCWlmICh2YWwgPCAwKQorCQkJCWJyZWFrOworCQkJc3ltbGlua192YWxbdmFsXSA9ICdcMCc7CisJCQlpZiAoc3ltbGluayhzeW1saW5rX3ZhbCwgZGVzdHBhdGgpID09IDApCisJCQkJcmV0dXJuIFRSVUU7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGUkVHOgorCQkJZmQgPSBvcGVuKGRlc3RwYXRoLCBPX1JET05MWSB8IE9fQ1JFQVQsIG5ld19tb2RlICYgflNfSUZNVCk7CisJCQlpZiAoZmQgPCAwKQorCQkJCWJyZWFrOworCQkJY2xvc2UoZmQpOworCQkJaWYgKGNobW9kKGRlc3RwYXRoLCBuZXdfbW9kZSAmIH5TX0lGTVQpICE9IDApCisJCQkJYnJlYWs7CisJCQlnb3RvIGRvX2Nob3duOworCQljYXNlIFNfSUZCTEs6CisJCWNhc2UgU19JRkNIUjoKKwkJY2FzZSBTX0lGSUZPOgorCQkJaWYgKG1rbm9kKGRlc3RwYXRoLCBuZXdfbW9kZSwgc291cmNlX3N0YXQtPnN0X3JkZXYpICE9IDApCisJCQkJYnJlYWs7CisJCQlnb3RvIGRvX2Nob3duOworCQljYXNlIFNfSUZESVI6CisJCQlpZiAobWtkaXIoZGVzdHBhdGgsIG5ld19tb2RlICYgflNfSUZNVCkgIT0gMCkKKwkJCQlicmVhazsKK2RvX2Nob3duOgorCQkJaWYgKGNob3duKGRlc3RwYXRoLCBzb3VyY2Vfc3RhdC0+c3RfdWlkLCBzb3VyY2Vfc3RhdC0+c3RfZ2lkKSA9PSAwKQorCQkJCXJldHVybiBUUlVFOworCQkvKmJyZWFrOyovCisJfQorCXJldHVybiBGQUxTRTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGNvcHlfaW5vZGUgICovCisKK3N0YXRpYyB2b2lkIGZyZWVfY29uZmlnKHZvaWQpCisvKiAgW1NVTU1BUlldIEZyZWUgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICpjX2VudHJ5OworCXZvaWQgKm5leHQ7CisKKwlmb3IgKGNfZW50cnkgPSBmaXJzdF9jb25maWc7IGNfZW50cnkgIT0gTlVMTDsgY19lbnRyeSA9IG5leHQpIHsKKwkJdW5zaWduZWQgaW50IGNvdW50OworCisJCW5leHQgPSBjX2VudHJ5LT5uZXh0OworCQlyZWdmcmVlKCZjX2VudHJ5LT5wcmVnKTsKKwkJaWYgKGNfZW50cnktPmFjdGlvbi53aGF0ID09IEFDX0VYRUNVVEUpIHsKKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1BWF9BUkdTOyArK2NvdW50KSB7CisJCQkJaWYgKGNfZW50cnktPnUuZXhlY3V0ZS5hcmd2W2NvdW50XSA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCQlmcmVlKGNfZW50cnktPnUuZXhlY3V0ZS5hcmd2W2NvdW50XSk7CisJCQl9CisJCX0KKwkJZnJlZShjX2VudHJ5KTsKKwl9CisJZmlyc3RfY29uZmlnID0gTlVMTDsKKwlsYXN0X2NvbmZpZyA9IE5VTEw7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBmcmVlX2NvbmZpZyAgKi8KKworc3RhdGljIGludCBnZXRfdWlkX2dpZChpbnQgZmxhZywgY29uc3QgY2hhciAqc3RyaW5nKQorLyogIFtTVU1NQVJZXSBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgVUlEIG9yIEdJRCB2YWx1ZS4KKwk8ZmxhZz4gIlVJRCIgb3IgIkdJRCIuCisJPHN0cmluZz4gVGhlIHN0cmluZy4KKyAgICBbUkVUVVJOU10gVGhlIFVJRCBvciBHSUQgdmFsdWUuCisqLworeworCXN0cnVjdCBwYXNzd2QgKnB3X2VudDsKKwlzdHJ1Y3QgZ3JvdXAgKmdycF9lbnQ7CisJc3RhdGljIGNvbnN0IGNoYXIgKm1zZzsKKworCWlmIChFTkFCTEVfREVWRlNEX1ZFUkJPU0UpCisJCW1zZyA9ICJ1c2VyIjsKKworCWlmIChpc2RpZ2l0KHN0cmluZ1swXSkgfHwoKHN0cmluZ1swXSA9PSAnLScpICYmIGlzZGlnaXQoc3RyaW5nWzFdKSkpCisJCXJldHVybiBhdG9pKHN0cmluZyk7CisKKwlpZiAoZmxhZyA9PSBVSUQgJiYgKHB3X2VudCA9IGdldHB3bmFtKHN0cmluZykpICE9IE5VTEwpCisJCXJldHVybiBwd19lbnQtPnB3X3VpZDsKKworCWlmIChmbGFnID09IEdJRCAmJiAoZ3JwX2VudCA9IGdldGdybmFtKHN0cmluZykpICE9IE5VTEwpCisJCXJldHVybiBncnBfZW50LT5ncl9naWQ7CisJZWxzZSBpZiAoRU5BQkxFX0RFVkZTRF9WRVJCT1NFKQorCQltc2cgPSAiZ3JvdXAiOworCisJaWYgKEVOQUJMRV9ERVZGU0RfVkVSQk9TRSkKKwkJbXNnX2xvZ2dlcihMT0dfRVJSLCAidW5rbm93biAlczogJXMsIGRlZmF1bHRpbmcgdG8gJWNpZD0wIiwgIG1zZywgc3RyaW5nLCBtc2dbMF0pOworCXJldHVybiAwOworfS8qICBFbmQgRnVuY3Rpb24gZ2V0X3VpZF9naWQgICovCisKK3N0YXRpYyBtb2RlX3QgZ2V0X21vZGUoY29uc3QgY2hhciAqc3RyaW5nKQorLyogIFtTVU1NQVJZXSBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgbW9kZSB2YWx1ZS4KKyAgICA8c3RyaW5nPiBUaGUgc3RyaW5nLgorICAgIFtSRVRVUk5TXSBUaGUgbW9kZSB2YWx1ZS4KKyovCit7CisJbW9kZV90IG1vZGU7CisJaW50IGk7CisKKwlpZiAoaXNkaWdpdChzdHJpbmdbMF0pKQorCQlyZXR1cm4gc3RydG91bChzdHJpbmcsIE5VTEwsIDgpOworCWlmIChzdHJsZW4oc3RyaW5nKSAhPSA5KQorCQltc2dfbG9nZ2VyX2FuZF9kaWUoTE9HX0VSUiwgImJhZCBtb2RlOiAlcyIsIHN0cmluZyk7CisKKwltb2RlID0gMDsKKwlpID0gU19JUlVTUjsKKwl3aGlsZSAoaSA+IDApIHsKKwkJaWYgKHN0cmluZ1swXSA9PSAncicgfHwgc3RyaW5nWzBdID09ICd3JyB8fCBzdHJpbmdbMF0gPT0gJ3gnKQorCQkJbW9kZSArPSBpOworCQlpID0gaSAvIDI7CisJCXN0cmluZysrOworCX0KKwlyZXR1cm4gbW9kZTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGdldF9tb2RlICAqLworCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnKQoreworCWNhdWdodF9zaWduYWwgPSBUUlVFOworCWlmIChzaWcgPT0gU0lHSFVQKQorCQljYXVnaHRfc2lnaHVwID0gVFJVRTsKKworCWluZm9fbG9nZ2VyKExPR19JTkZPLCAiQ2F1Z2h0IHNpZ25hbCAlZCIsIHNpZyk7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBzaWduYWxfaGFuZGxlciAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF92YXJpYWJsZShjb25zdCBjaGFyICp2YXJpYWJsZSwgdm9pZCAqaW5mbykKK3sKKwlzdGF0aWMgY2hhciBzYnVmW3NpemVvZihpbnQpKjMgKyAyXTsgLyogc2lnbiBhbmQgTlVMICovCisJc3RhdGljIGNoYXIgKmhvc3RuYW1lOworCisJc3RydWN0IGdldF92YXJpYWJsZV9pbmZvICpndl9pbmZvID0gaW5mbzsKKwljb25zdCBjaGFyICpmaWVsZF9uYW1lc1tdID0geworCQkJImhvc3RuYW1lIiwgIm1udHB0IiwgImRldnBhdGgiLCAiZGV2bmFtZSIsCisJCQkidWlkIiwgImdpZCIsICJtb2RlIiwgaG9zdG5hbWUsIG1vdW50X3BvaW50LAorCQkJZ3ZfaW5mby0+ZGV2cGF0aCwgZ3ZfaW5mby0+ZGV2bmFtZSwgTlVMTAorCX07CisJaW50IGk7CisKKwlpZiAoIWhvc3RuYW1lKQorCQlob3N0bmFtZSA9IHNhZmVfZ2V0aG9zdG5hbWUoKTsKKwkvKiBpbmRleF9pbl9zdHJfYXJyYXkgcmV0dXJucyBpPj0wICAqLworCWkgPSBpbmRleF9pbl9zdHJfYXJyYXkoZmllbGRfbmFtZXMsIHZhcmlhYmxlKTsKKworCWlmIChpID4gNiB8fCBpIDwgMCB8fCAoaSA+IDEgJiYgZ3ZfaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGkgPj0gMCAmJiBpIDw9IDMpCisJCXJldHVybiBmaWVsZF9uYW1lc1tpICsgN107CisKKwlpZiAoaSA9PSA0KQorCQlzcHJpbnRmKHNidWYsICIldSIsIGd2X2luZm8tPmluZm8tPnVpZCk7CisJZWxzZSBpZiAoaSA9PSA1KQorCQlzcHJpbnRmKHNidWYsICIldSIsIGd2X2luZm8tPmluZm8tPmdpZCk7CisJZWxzZSBpZiAoaSA9PSA2KQorCQlzcHJpbnRmKHNidWYsICIlbyIsIGd2X2luZm8tPmluZm8tPm1vZGUpOworCXJldHVybiBzYnVmOworfSAgIC8qICBFbmQgRnVuY3Rpb24gZ2V0X3ZhcmlhYmxlICAqLworCitzdGF0aWMgdm9pZCBzZXJ2aWNlKHN0cnVjdCBzdGF0IHN0YXRidWYsIGNoYXIgKnBhdGgpCit7CisJc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0IGluZm87CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZiBpbmZvKTsKKwlpbmZvLnR5cGUgPSBERVZGU0RfTk9USUZZX1JFR0lTVEVSRUQ7CisJaW5mby5tb2RlID0gc3RhdGJ1Zi5zdF9tb2RlOworCWluZm8ubWFqb3IgPSBtYWpvcihzdGF0YnVmLnN0X3JkZXYpOworCWluZm8ubWlub3IgPSBtaW5vcihzdGF0YnVmLnN0X3JkZXYpOworCWluZm8udWlkID0gc3RhdGJ1Zi5zdF91aWQ7CisJaW5mby5naWQgPSBzdGF0YnVmLnN0X2dpZDsKKwlzbnByaW50ZihpbmZvLmRldm5hbWUsIHNpemVvZihpbmZvLmRldm5hbWUpLCAiJXMiLCBwYXRoICsgc3RybGVuKG1vdW50X3BvaW50KSArIDEpOworCWluZm8ubmFtZWxlbiA9IHN0cmxlbihpbmZvLmRldm5hbWUpOworCXNlcnZpY2VfbmFtZSgmaW5mbyk7CisJaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkKKwkJZGlyX29wZXJhdGlvbihTRVJWSUNFLCBwYXRoLCAwLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZGlyX29wZXJhdGlvbihpbnQgdHlwZSwgY29uc3QgY2hhciAqIGRpcl9uYW1lLCBpbnQgdmFyLCB1bnNpZ25lZCBsb25nICpldmVudF9tYXNrKQorLyogIFtTVU1NQVJZXSBTY2FuIGEgZGlyZWN0b3J5IHRyZWUgYW5kIGdlbmVyYXRlIHJlZ2lzdGVyIGV2ZW50cyBvbiBsZWFmIG5vZGVzLgorCTxmbGFnPiBUbyBjaG9vc2Ugd2hpY2ggZnVuY3Rpb24gdG8gcGVyZm9ybQorCTxkcD4gVGhlIGRpcmVjdG9yeSBwb2ludGVyLiBUaGlzIGlzIGNsb3NlZCB1cG9uIGNvbXBsZXRpb24uCisgICAgPGRpcl9uYW1lPiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5LgorCTxyb290bGVuPiBzdHJpbmcgbGVuZ3RoIHBhcmFtZXRlci4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlESVIgKmRwOworCXN0cnVjdCBkaXJlbnQgKmRlOworCWNoYXIgKnBhdGg7CisKKwlkcCA9IHdhcm5fb3BlbmRpcihkaXJfbmFtZSk7CisJaWYgKGRwID09IE5VTEwpCisJCXJldHVybjsKKworCXdoaWxlICgoZGUgPSByZWFkZGlyKGRwKSkgIT0gTlVMTCkgeworCisJCWlmIChkZS0+ZF9uYW1lICYmIERPVF9PUl9ET1RET1QoZGUtPmRfbmFtZSkpCisJCQljb250aW51ZTsKKwkJcGF0aCA9IGNvbmNhdF9wYXRoX2ZpbGUoZGlyX25hbWUsIGRlLT5kX25hbWUpOworCQlpZiAobHN0YXQocGF0aCwgJnN0YXRidWYpID09IDApIHsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJCWNhc2UgU0VSVklDRToKKwkJCQkJc2VydmljZShzdGF0YnVmLCBwYXRoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVNUT1JFOgorCQkJCQlyZXN0b3JlKHBhdGgsIHN0YXRidWYsIHZhcik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVBRF9DT05GSUc6CisJCQkJCXJlYWRfY29uZmlnX2ZpbGUocGF0aCwgdmFyLCBldmVudF9tYXNrKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZnJlZShwYXRoKTsKKwl9CisJY2xvc2VkaXIoZHApOworfSAgIC8qICBFbmQgRnVuY3Rpb24gZG9fc2Nhbl9hbmRfc2VydmljZSAgKi8KKworc3RhdGljIGludCBta3N5bWxpbmsoY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCkKKy8qICBbU1VNTUFSWV0gQ3JlYXRlIGEgc3ltbGluaywgY3JlYXRpbmcgaW50ZXJ2ZW5pbmcgZGlyZWN0b3JpZXMgYXMgcmVxdWlyZWQuCisgICAgPG9sZHBhdGg+IFRoZSBzdHJpbmcgY29udGFpbmVkIGluIHRoZSBzeW1saW5rLgorICAgIDxuZXdwYXRoPiBUaGUgbmFtZSBvZiB0aGUgbmV3IHN5bWxpbmsuCisgICAgW1JFVFVSTlNdIDAgb24gc3VjY2VzcywgZWxzZSAtMS4KKyovCit7CisJaWYgKCFtYWtlX2Rpcl90cmVlKG5ld3BhdGgpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc3ltbGluayhvbGRwYXRoLCBuZXdwYXRoKSAhPSAwKSB7CisJCWlmIChlcnJubyAhPSBFRVhJU1QpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfSAgIC8qICBFbmQgRnVuY3Rpb24gbWtzeW1saW5rICAqLworCisKK3N0YXRpYyBpbnQgbWFrZV9kaXJfdHJlZShjb25zdCBjaGFyICpwYXRoKQorLyogIFtTVU1NQVJZXSBDcmVhdGluZyBpbnRlcnZlbmluZyBkaXJlY3RvcmllcyBmb3IgYSBwYXRoIGFzIHJlcXVpcmVkLgorICAgIDxwYXRoPiBUaGUgZnVsbCBwYXRobmFtZShpbmNsdWRpbmcgdGhlIGxlYWYgbm9kZSkuCisgICAgW1JFVFVSTlNdIFRSVUUgb24gc3VjY2VzcywgZWxzZSBGQUxTRS4KKyovCit7CisJaWYgKGJiX21ha2VfZGlyZWN0b3J5KGRpcm5hbWUoKGNoYXIgKilwYXRoKSwgLTEsIEZJTEVVVElMU19SRUNVUikgPT0gLTEpCisJCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gVFJVRTsKK30gLyogIEVuZCBGdW5jdGlvbiBtYWtlX2Rpcl90cmVlICAqLworCitzdGF0aWMgaW50IGV4cGFuZF9leHByZXNzaW9uKGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IG91dHNpemUsCisJCQkgICAgICBjb25zdCBjaGFyICppbnB1dCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKigqZ2V0X3ZhcmlhYmxlX2Z1bmMpKGNvbnN0IGNoYXIgKnZhcmlhYmxlLCB2b2lkICppbmZvKSwKKwkJCSAgICAgIHZvaWQgKmluZm8sCisJCQkgICAgICBjb25zdCBjaGFyICpkZXZuYW1lLAorCQkJICAgICAgY29uc3QgcmVnbWF0Y2hfdCAqZXgsIHVuc2lnbmVkIGludCBudW1leHApCisvKiAgW1NVTU1BUlldIEV4cGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHJlZ3VsYXIgc3ViZXhwcmVzc2lvbnMgaW4gc3RyaW5nLgorICAgIDxvdXRwdXQ+IFRoZSBvdXRwdXQgZXhwYW5kZWQgZXhwcmVzc2lvbiBpcyB3cml0dGVuIGhlcmUuCisgICAgPGxlbmd0aD4gVGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgPGlucHV0PiBUaGUgaW5wdXQgZXhwcmVzc2lvbi4gVGhpcyBtYXkgZXF1YWwgPDxvdXRwdXQ+Pi4KKyAgICA8Z2V0X3ZhcmlhYmxlPiBBIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBnZXQgdmFyaWFibGUgdmFsdWVzLiBJZgorICAgIHRoaXMgcmV0dXJucyBOVUxMLCB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQgaW5zdGVhZC4gSWYgdGhpcyBpcyBOVUxMLAorICAgIG9ubHkgdGhlIGVudmlyb25tZW50IGlzIHNlYXJjaGVkLgorICAgIDxpbmZvPiBBbiBhcmJpdHJhcnkgcG9pbnRlciBwYXNzZWQgdG8gPDxnZXRfdmFyaWFibGU+Pi4KKyAgICA8ZGV2bmFtZT4gRGV2aWNlIG5hbWU7IHNwZWNpZmljYWxseSwgdGhpcyBpcyB0aGUgc3RyaW5nIHRoYXQgY29udGFpbnMgYWxsCisgICAgb2YgdGhlIHJlZ3VsYXIgc3ViZXhwcmVzc2lvbnMuCisgICAgPGV4PiBBcnJheSBvZiBzdGFydCAvIGVuZCBvZmZzZXRzIGludG8gaW5mby0+ZGV2bmFtZSBmb3IgZWFjaCBzdWJleHByZXNzaW9uCisgICAgPG51bWV4cD4gTnVtYmVyIG9mIHJlZ3VsYXIgc3ViZXhwcmVzc2lvbnMgZm91bmQgaW4gPDxkZXZuYW1lPj4uCisgICAgW1JFVFVSTlNdIFRSVUUgb24gc3VjY2VzcywgZWxzZSBGQUxTRS4KKyovCit7CisJY2hhciB0ZW1wW1NUUklOR19MRU5HVEhdOworCisJaWYgKCFzdF9leHByX2V4cGFuZCh0ZW1wLCBTVFJJTkdfTEVOR1RILCBpbnB1dCwgZ2V0X3ZhcmlhYmxlX2Z1bmMsIGluZm8pKQorCQlyZXR1cm4gRkFMU0U7CisJZXhwYW5kX3JlZ2V4cChvdXRwdXQsIG91dHNpemUsIHRlbXAsIGRldm5hbWUsIGV4LCBudW1leHApOworCXJldHVybiBUUlVFOworfSAgIC8qICBFbmQgRnVuY3Rpb24gZXhwYW5kX2V4cHJlc3Npb24gICovCisKK3N0YXRpYyB2b2lkIGV4cGFuZF9yZWdleHAoY2hhciAqb3V0cHV0LCBzaXplX3Qgb3V0c2l6ZSwgY29uc3QgY2hhciAqaW5wdXQsCisJCQkgICBjb25zdCBjaGFyICpkZXZuYW1lLAorCQkJICAgY29uc3QgcmVnbWF0Y2hfdCAqZXgsIHVuc2lnbmVkIGludCBudW1leCkKKy8qICBbU1VNTUFSWV0gRXhwYW5kIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgcmVndWxhciBzdWJleHByZXNzaW9ucyBcMCB0byBcOS4KKyAgICA8b3V0cHV0PiBUaGUgb3V0cHV0IGV4cGFuZGVkIGV4cHJlc3Npb24gaXMgd3JpdHRlbiBoZXJlLgorICAgIDxvdXRzaXplPiBUaGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICA8aW5wdXQ+IFRoZSBpbnB1dCBleHByZXNzaW9uLiBUaGlzIG1heSBOT1QgZXF1YWwgPDxvdXRwdXQ+PiwgYmVjYXVzZQorICAgIHN1cHBvcnRpbmcgdGhhdCB3b3VsZCByZXF1aXJlIHlldCBhbm90aGVyIHN0cmluZy1jb3B5LiBIb3dldmVyLCBpdCdzIG5vdAorICAgIGhhcmQgdG8gd3JpdGUgYSBzaW1wbGUgd3JhcHBlciBmdW5jdGlvbiB0byBhZGQgdGhpcyBmdW5jdGlvbmFsaXR5IGZvciB0aG9zZQorICAgIGZldyBjYXNlcyB0aGF0IG5lZWQgaXQuCisgICAgPGRldm5hbWU+IERldmljZSBuYW1lOyBzcGVjaWZpY2FsbHksIHRoaXMgaXMgdGhlIHN0cmluZyB0aGF0IGNvbnRhaW5zIGFsbAorICAgIG9mIHRoZSByZWd1bGFyIHN1YmV4cHJlc3Npb25zLgorICAgIDxleD4gQW4gYXJyYXkgb2Ygc3RhcnQgYW5kIGVuZCBvZmZzZXRzIGludG8gPDxkZXZuYW1lPj4sIG9uZSBmb3IgZWFjaAorICAgIHN1YmV4cHJlc3Npb24KKyAgICA8bnVtZXg+IE51bWJlciBvZiBzdWJleHByZXNzaW9ucyBpbiB0aGUgb2Zmc2V0LWFycmF5IDw8ZXg+Pi4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJY29uc3QgY2hhciBsYXN0X2V4cCA9ICcwJyAtIDEgKyBudW1leDsKKwlpbnQgYyA9IC0xOworCisJLyogIEd1YXJhbnRlZSBOVUxMIHRlcm1pbmF0aW9uIGJ5IHdyaXRpbmcgYW4gZXhwbGljaXQgJ1wwJyBjaGFyYWN0ZXIgaW50bworCXRoZSB2ZXJ5IGxhc3QgYnl0ZSAgKi8KKwlpZiAob3V0c2l6ZSkKKwkJb3V0cHV0Wy0tb3V0c2l6ZV0gPSAnXDAnOworCS8qICBDb3B5IHRoZSBpbnB1dCBzdHJpbmcgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwgcmVwbGFjaW5nICdcXCcgd2l0aCAnXCcKKwlhbmQgJ1wwJyAuLiAnXDknIHdpdGggc3ViZXhwcmVzc2lvbnMgMCAuLiA5LCBpZiB0aGV5IGV4aXN0LiBPdGhlciBceAorCWNvZGVzIGFyZSBkZWxldGVkICAqLworCXdoaWxlICgoYyAhPSAnXDAnKSAmJiAob3V0c2l6ZSAhPSAwKSkgeworCQljID0gKmlucHV0OworCQkrK2lucHV0OworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQljID0gKmlucHV0OworCQkJKytpbnB1dDsKKwkJCWlmIChjICE9ICdcXCcpIHsKKwkJCQlpZiAoKGMgPj0gJzAnKSAmJiAoYyA8PSBsYXN0X2V4cCkpIHsKKwkJCQkJY29uc3QgcmVnbWF0Y2hfdCAqc3ViZXhwID0gZXggKyAoYyAtICcwJyk7CisJCQkJCXVuc2lnbmVkIGludCBzdWJsZW4gPSBzdWJleHAtPnJtX2VvIC0gc3ViZXhwLT5ybV9zbzsKKworCQkJCQkvKiAgUmFuZ2UgY2hlY2tpbmcgICovCisJCQkJCWlmIChzdWJsZW4gPiBvdXRzaXplKQorCQkJCQkJc3VibGVuID0gb3V0c2l6ZTsKKwkJCQkJc3RybmNweShvdXRwdXQsIGRldm5hbWUgKyBzdWJleHAtPnJtX3NvLCBzdWJsZW4pOworCQkJCQlvdXRwdXQgKz0gc3VibGVuOworCQkJCQlvdXRzaXplIC09IHN1YmxlbjsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJKm91dHB1dCA9IGM7CisJCSsrb3V0cHV0OworCQktLW91dHNpemU7CisJfSAvKiB3aGlsZSAqLworfSAgIC8qICBFbmQgRnVuY3Rpb24gZXhwYW5kX3JlZ2V4cCAgKi8KKworCisvKiBmcm9tIGNvbXBhdF9uYW1lLmMgKi8KKworc3RydWN0IHRyYW5zbGF0ZV9zdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm1hdGNoOyAgICAvKiAgVGhlIHN0cmluZyB0byBtYXRjaCB0byh1cCB0byBsZW5ndGgpICAgICAgICAgICAgICAgICovCisJY29uc3QgY2hhciAqZm9ybWF0OyAgIC8qICBGb3JtYXQgb2Ygb3V0cHV0LCAiJXMiIHRha2VzIGRhdGEgcGFzdCBtYXRjaCBzdHJpbmcsCisJCQlOVUxMIGlzIGVmZmVjdGl2ZWx5ICIlcyIoanVzdCBtb3JlIGVmZmljaWVudCkgICAgICAgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdHJhbnNsYXRlX3N0cnVjdCB0cmFuc2xhdGVfdGFibGVbXSA9Cit7CisJeyJzb3VuZC8iLCAgICAgTlVMTH0sCisJeyJwcmludGVycy8iLCAgImxwJXMifSwKKwl7InY0bC8iLCAgICAgICBOVUxMfSwKKwl7InBhcnBvcnRzLyIsICAicGFycG9ydCVzIn0sCisJeyJmYi8iLCAgICAgICAgImZiJXMifSwKKwl7Im5ldGxpbmsvIiwgICBOVUxMfSwKKwl7Imxvb3AvIiwgICAgICAibG9vcCVzIn0sCisJeyJmbG9wcHkvIiwgICAgImZkJXMifSwKKwl7InJkLyIsICAgICAgICAicmFtJXMifSwKKwl7Im1kLyIsICAgICAgICAibWQlcyJ9LCAgICAgICAgIC8qICBNZXRhLWRldmljZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7InZjLyIsICAgICAgICAidHR5JXMifSwKKwl7Im1pc2MvIiwgICAgICBOVUxMfSwKKwl7ImlzZG4vIiwgICAgICBOVUxMfSwKKwl7InBnLyIsICAgICAgICAicGclcyJ9LCAgICAgICAgIC8qICBQYXJhbGxlbCBwb3J0IGdlbmVyaWMgQVRBUEkgaW50ZXJmYWNlKi8KKwl7ImkyYy8iLCAgICAgICAiaTJjLSVzIn0sCisJeyJzdGFsaW9tZW0vIiwgInN0YWxpb21lbSVzIn0sICAvKiAgU3RhbGxpb24gc2VyaWFsIGRyaXZlciBjb250cm9sICAgICAgICovCisJeyJ0dHMvRSIsICAgICAgInR0eUUlcyJ9LCAgICAgICAvKiAgU3RhbGxpb24gc2VyaWFsIGRyaXZlciAgICAgICAgICAgICAgICovCisJeyJjdWEvRSIsICAgICAgImN1ZSVzIn0sICAgICAgICAvKiAgU3RhbGxpb24gc2VyaWFsIGRyaXZlciBjYWxsb3V0ICAgICAgICovCisJeyJ0dHMvUiIsICAgICAgInR0eVIlcyJ9LCAgICAgICAvKiAgUm9ja2V0cG9ydCBzZXJpYWwgZHJpdmVyICAgICAgICAgICAgICovCisJeyJjdWEvUiIsICAgICAgImN1ciVzIn0sICAgICAgICAvKiAgUm9ja2V0cG9ydCBzZXJpYWwgZHJpdmVyIGNhbGxvdXQgICAgICovCisJeyJpcDIvIiwgICAgICAgImlwMiVzIn0sICAgICAgICAvKiAgQ29tcHV0b25lIHNlcmlhbCBkcml2ZXIgY29udHJvbCAgICAgICovCisJeyJ0dHMvRiIsICAgICAgInR0eUYlcyJ9LCAgICAgICAvKiAgQ29tcHV0b25lIHNlcmlhbCBkcml2ZXIgICAgICAgICAgICAgICovCisJeyJjdWEvRiIsICAgICAgImN1ZiVzIn0sICAgICAgICAvKiAgQ29tcHV0b25lIHNlcmlhbCBkcml2ZXIgY2FsbG91dCAgICAgICovCisJeyJ0dHMvQyIsICAgICAgInR0eUMlcyJ9LCAgICAgICAvKiAgQ3ljbGFkZXMgc2VyaWFsIGRyaXZlciAgICAgICAgICAgICAgICovCisJeyJjdWEvQyIsICAgICAgImN1YiVzIn0sICAgICAgICAvKiAgQ3ljbGFkZXMgc2VyaWFsIGRyaXZlciBjYWxsb3V0ICAgICAgICovCisJeyJ0dHMvIiwgICAgICAgInR0eVMlcyJ9LCAgICAgICAvKiAgR2VuZXJpYyBzZXJpYWw6IG11c3QgYmUgYWZ0ZXIgb3RoZXJzICovCisJeyJjdWEvIiwgICAgICAgImN1YSVzIn0sICAgICAgICAvKiAgR2VuZXJpYyBzZXJpYWw6IG11c3QgYmUgYWZ0ZXIgb3RoZXJzICovCisJeyJpbnB1dC9qcyIsICAgImpzJXMifSwgICAgICAgICAvKiAgSm95c3RpY2sgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICovCisJe05VTEwsICAgICAgICAgTlVMTH0KK307CisKK2NvbnN0IGNoYXIgKmdldF9vbGRfbmFtZShjb25zdCBjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBpbnQgbmFtZWxlbiwKKwkJCSAgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbWFqb3IsIHVuc2lnbmVkIGludCBtaW5vcikKKy8qICBbU1VNTUFSWV0gVHJhbnNsYXRlIGEga2VybmVsLXN1cHBsaWVkIG5hbWUgaW50byBhbiBvbGQgbmFtZS4KKyAgICA8ZGV2bmFtZT4gVGhlIGRldmljZSBuYW1lIHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWwuCisgICAgPG5hbWVsZW4+IFRoZSBsZW5ndGggb2YgdGhlIG5hbWUuCisgICAgPGJ1ZmZlcj4gQSBidWZmZXIgdGhhdCBtYXkgYmUgdXNlZC4gVGhpcyBzaG91bGQgYmUgYXQgbGVhc3QgMTI4IGJ5dGVzIGxvbmcuCisgICAgPG1ham9yPiBUaGUgbWFqb3IgbnVtYmVyIGZvciB0aGUgZGV2aWNlLgorICAgIDxtaW5vcj4gVGhlIG1pbm9yIG51bWJlciBmb3IgdGhlIGRldmljZS4KKyAgICBbUkVUVVJOU10gQSBwb2ludGVyIHRvIHRoZSBvbGQgbmFtZSBpZiBrbm93biwgZWxzZSBOVUxMLgorKi8KK3sKKwljb25zdCBjaGFyICpjb21wYXRfbmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqcHRyOworCXN0cnVjdCB0cmFuc2xhdGVfc3RydWN0ICp0cmFuczsKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyIG1vZGU7CisJaW50IGluZGV4eDsKKwljb25zdCBjaGFyICpwdHkxOworCWNvbnN0IGNoYXIgKnB0eTI7CisJc2l6ZV90IGxlbjsKKwkvKiAxIHRvIDUgICJzY3NpLyIgLCA2IHRvIDkgImlkZS9ob3N0IiwgMTAgc2JwLywgMTEgdmNjLywgMTIgcHR5LyAqLworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbXRbXSA9IHsKKwkJTlVMTCAsCisJCSJzZyV1IiwJCQkvKiBzY3NpL2dlbmVyaWMgKi8KKwkJTlVMTCwJCQkvKiBzY3NpL2Rpc2MgKi8KKwkJInNyJXUiLAkJCS8qIHNjc2kvY2QgKi8KKwkJTlVMTCwJCQkvKiBzY3NpL3BhcnQgKi8KKwkJIm5zdCV1JWMiLAkJLyogc2NzaS9tdCAqLworCQkiaGQlYyIJLAkJLyogaWRlL2hvc3QvZGlzYyAqLworCQkiaGQlYyIJLAkJLyogaWRlL2hvc3QvY2QgKi8KKwkJImhkJWMlcyIsCQkvKiBpZGUvaG9zdC9wYXJ0ICovCisJCSIlc2h0JWQiLAkJLyogaWRlL2hvc3QvbXQgKi8KKwkJInNicGNkJXUiLAkJLyogc2JwLyAqLworCQkidmNzJXMiLAkJLyogdmNjLyAqLworCQkiJWN0eSVjJWMiLAkJLyogcHR5LyAqLworCQlOVUxMCisJfTsKKworCWZvciAodHJhbnMgPSB0cmFuc2xhdGVfdGFibGU7IHRyYW5zLT5tYXRjaCAhPSBOVUxMOyArK3RyYW5zKSB7CisJCSBsZW4gPSBzdHJsZW4odHJhbnMtPm1hdGNoKTsKKworCQlpZiAoc3RybmNtcChkZXZuYW1lLCB0cmFucy0+bWF0Y2gsIGxlbikgPT0gMCkgeworCQkJaWYgKHRyYW5zLT5mb3JtYXQgPT0gTlVMTCkKKwkJCQlyZXR1cm4gZGV2bmFtZSArIGxlbjsKKwkJCXNwcmludGYoYnVmZmVyLCB0cmFucy0+Zm9ybWF0LCBkZXZuYW1lICsgbGVuKTsKKwkJCXJldHVybiBidWZmZXI7CisJCX0KKwl9CisKKwlwdHIgPSBiYl9iYXNlbmFtZShkZXZuYW1lKTsKKwlpID0gc2Nhbl9kZXZfbmFtZShkZXZuYW1lLCBuYW1lbGVuLCBwdHIpOworCisJaWYgKGkgPiAwICYmIGkgPCAxMykKKwkJY29tcGF0X25hbWUgPSBidWZmZXI7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKworCS8qIDEgPT0gc2NzaS9nZW5lcmljLCAzID09IHNjc2kvY2QsIDEwID09IHNicC8gKi8KKwlpZiAoaSA9PSAxIHx8IGkgPT0gMyB8fCBpID09IDEwKQorCQlzcHJpbnRmKGJ1ZmZlciwgZm10W2ldLCBtaW5vcik7CisKKwkvKiAyID09c2NzaS9kaXNjLCA0ID09IHNjc2kvcGFydCAqLworCWlmIChpID09IDIgfHwgaSA9PSA0KQorCQljb21wYXRfbmFtZSA9IHdyaXRlX29sZF9zZF9uYW1lKGJ1ZmZlciwgbWFqb3IsIG1pbm9yLCAoKGkgPT0gMikgPyAiIiA6IChwdHIgKyA0KSkpOworCisJLyogNSA9PSBzY3NpL210ICovCisJaWYgKGkgPT0gNSkgeworCQltb2RlID0gcHRyWzJdOworCQlpZiAobW9kZSA9PSAnbicpCisJCQltb2RlID0gJ1wwJzsKKwkJc3ByaW50ZihidWZmZXIsIGZtdFtpXSwgbWlub3IgJiAweDFmLCBtb2RlKTsKKwkJaWYgKGRldm5hbWVbbmFtZWxlbiAtIDFdICE9ICduJykKKwkJCSsrY29tcGF0X25hbWU7CisJfQorCS8qIDYgPT0gaWRlL2hvc3QvZGlzYywgNyA9PSBpZGUvaG9zdC9jZCwgOCA9PSBpZGUvaG9zdC9wYXJ0ICovCisJaWYgKGkgPT0gNiB8fCBpID09IDcgfHwgaSA9PSA4KQorCQkvKiBsYXN0IGFyZyBzaG91bGQgYmUgaWdub3JlZCBmb3IgaSA9PSA2IG9yIGk9PSA3ICovCisJCXNwcmludGYoYnVmZmVyLCBmbXRbaV0gLCBnZXRfb2xkX2lkZV9uYW1lKG1ham9yLCBtaW5vciksIHB0ciArIDQpOworCisJLyogOSA9PSAgaWRlL2hvc3QvbXQgKi8KKwlpZiAoaSA9PSA5KQorCQlzcHJpbnRmKGJ1ZmZlciwgZm10W2ldLCBwdHIgKyAyLCBtaW5vciAmIDB4N2YpOworCisJLyogIDExID09IHZjYy8gKi8KKwlpZiAoaSA9PSAxMSkgeworCQlzcHJpbnRmKGJ1ZmZlciwgZm10W2ldLCBkZXZuYW1lICsgNCk7CisJCWlmIChidWZmZXJbM10gPT0gJzAnKQorCQkJYnVmZmVyWzNdID0gJ1wwJzsKKwl9CisJLyogMTIgPT0gIHB0eS8gKi8KKwlpZiAoaSA9PSAxMikgeworCQlwdHkxID0gInBxcnN0dXZ3eHl6YWJjZGUiOworCQlwdHkyID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCQlpbmRleHggPSBhdG9pKGRldm5hbWUgKyA1KTsKKwkJc3ByaW50ZihidWZmZXIsIGZtdFtpXSwgKGRldm5hbWVbNF0gPT0gJ20nKSA/ICdwJyA6ICd0JywgcHR5MVtpbmRleHggPj4gNF0sIHB0eTJbaW5kZXh4ICYgMHgwZl0pOworCX0KKwlyZXR1cm4gY29tcGF0X25hbWU7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBnZXRfb2xkX25hbWUgICovCisKK3N0YXRpYyBjaGFyIGdldF9vbGRfaWRlX25hbWUodW5zaWduZWQgaW50IG1ham9yLCB1bnNpZ25lZCBpbnQgbWlub3IpCisvKiAgW1NVTU1BUlldIEdldCB0aGUgb2xkIElERSBuYW1lIGZvciBhIGRldmljZS4KKyAgICA8bWFqb3I+IFRoZSBtYWpvciBudW1iZXIgZm9yIHRoZSBkZXZpY2UuCisgICAgPG1pbm9yPiBUaGUgbWlub3IgbnVtYmVyIGZvciB0aGUgZGV2aWNlLgorICAgIFtSRVRVUk5TXSBUaGUgZHJpdmUgbGV0dGVyLgorKi8KK3sKKwljaGFyIGxldHRlciA9ICd5JzsJLyogMTIxICovCisJY2hhciBjID0gJ2EnOwkJLyogIDk3ICovCisJaW50IGkgPSBJREUwX01BSk9SOworCisJLyogSSBob3BlIGl0IHdvcmtzIGxpa2UgdGhlIHByZXZpb3VzIGNvZGUgYXMgaXQgc2F2ZXMgYSBmZXcgYnl0ZXMuIFRpdG8gO1AgKi8KKwlkbyB7CisJCWlmIChpID09IElERTBfTUFKT1IgfHwgaSA9PSBJREUxX01BSk9SIHx8IGkgPT0gSURFMl9NQUpPUgorCQkgfHwgaSA9PSBJREUzX01BSk9SIHx8IGkgPT0gSURFNF9NQUpPUiB8fCBpID09IElERTVfTUFKT1IKKwkJIHx8IGkgPT0gSURFNl9NQUpPUiB8fCBpID09IElERTdfTUFKT1IgfHwgaSA9PSBJREU4X01BSk9SCisJCSB8fCBpID09IElERTlfTUFKT1IKKwkJKSB7CisJCQlpZiAoKHVuc2lnbmVkIGludClpID09IG1ham9yKSB7CisJCQkJbGV0dGVyID0gYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWMgKz0gMjsKKwkJfQorCQlpKys7CisJfSB3aGlsZSAoaSA8PSBJREU5X01BSk9SKTsKKworCWlmIChtaW5vciA+IDYzKQorCQkrK2xldHRlcjsKKwlyZXR1cm4gbGV0dGVyOworfSAgIC8qICBFbmQgRnVuY3Rpb24gZ2V0X29sZF9pZGVfbmFtZSAgKi8KKworc3RhdGljIGNoYXIgKndyaXRlX29sZF9zZF9uYW1lKGNoYXIgKmJ1ZmZlciwKKwkJCQl1bnNpZ25lZCBpbnQgbWFqb3IsIHVuc2lnbmVkIGludCBtaW5vciwKKwkJCQljb25zdCBjaGFyICpwYXJ0KQorLyogIFtTVU1NQVJZXSBXcml0ZSB0aGUgb2xkIFNDU0kgZGlzYyBuYW1lIHRvIGEgYnVmZmVyLgorICAgIDxidWZmZXI+IFRoZSBidWZmZXIgdG8gd3JpdGUgdG8uCisgICAgPG1ham9yPiBUaGUgbWFqb3IgbnVtYmVyIGZvciB0aGUgZGV2aWNlLgorICAgIDxtaW5vcj4gVGhlIG1pbm9yIG51bWJlciBmb3IgdGhlIGRldmljZS4KKyAgICA8cGFydD4gVGhlIHBhcnRpdGlvbiBzdHJpbmcuIE11c3QgYmUgIiIgZm9yIGEgd2hvbGUtZGlzYyBlbnRyeS4KKyAgICBbUkVUVVJOU10gQSBwb2ludGVyIHRvIHRoZSBidWZmZXIgb24gc3VjY2VzcywgZWxzZSBOVUxMLgorKi8KK3sKKwl1bnNpZ25lZCBpbnQgZGlzY19pbmRleDsKKworCWlmIChtYWpvciA9PSA4KSB7CisJCXNwcmludGYoYnVmZmVyLCAic2QlYyVzIiwgJ2EnICsgKG1pbm9yID4+IDQpLCBwYXJ0KTsKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisJaWYgKChtYWpvciA+IDY0KSAmJiAobWFqb3IgPCA3MikpIHsKKwkJZGlzY19pbmRleCA9ICgobWFqb3IgLSA2NCkgPDwgNCkgKyhtaW5vciA+PiA0KTsKKwkJaWYgKGRpc2NfaW5kZXggPCAyNikKKwkJCXNwcmludGYoYnVmZmVyLCAic2QlYyVzIiwgJ2EnICsgZGlzY19pbmRleCwgcGFydCk7CisJCWVsc2UKKwkJCXNwcmludGYoYnVmZmVyLCAic2QlYyVjJXMiLCAnYScgKyhkaXNjX2luZGV4IC8gMjYpIC0gMSwgJ2EnICsgZGlzY19pbmRleCAlIDI2LCBwYXJ0KTsKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiB3cml0ZV9vbGRfc2RfbmFtZSAgKi8KKworCisvKiAgZXhwcmVzc2lvbi5jICovCisKKy8qRVhQRVJJTUVOVEFMX0ZVTkNUSU9OKi8KKworaW50IHN0X2V4cHJfZXhwYW5kKGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IGxlbmd0aCwgY29uc3QgY2hhciAqaW5wdXQsCisJCSAgICAgY29uc3QgY2hhciAqKCpnZXRfdmFyaWFibGVfZnVuYykoY29uc3QgY2hhciAqdmFyaWFibGUsCisJCQkJCQkgIHZvaWQgKmluZm8pLAorCQkgICAgIHZvaWQgKmluZm8pCisvKiAgW1NVTU1BUlldIEV4cGFuZCBhbiBleHByZXNzaW9uIHVzaW5nIEJvcm5lIFNoZWxsLWxpa2UgdW5xdW90ZWQgcnVsZXMuCisgICAgPG91dHB1dD4gVGhlIG91dHB1dCBleHBhbmRlZCBleHByZXNzaW9uIGlzIHdyaXR0ZW4gaGVyZS4KKyAgICA8bGVuZ3RoPiBUaGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICA8aW5wdXQ+IFRoZSBpbnB1dCBleHByZXNzaW9uLiBUaGlzIG1heSBlcXVhbCA8PG91dHB1dD4+LgorICAgIDxnZXRfdmFyaWFibGU+IEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGdldCB2YXJpYWJsZSB2YWx1ZXMuIElmCisgICAgdGhpcyByZXR1cm5zIE5VTEwsIHRoZSBlbnZpcm9ubWVudCBpcyBzZWFyY2hlZCBpbnN0ZWFkLiBJZiB0aGlzIGlzIE5VTEwsCisgICAgb25seSB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQuCisgICAgPGluZm8+IEFuIGFyYml0cmFyeSBwb2ludGVyIHBhc3NlZCB0byA8PGdldF92YXJpYWJsZT4+LgorICAgIFtSRVRVUk5TXSBUUlVFIG9uIHN1Y2Nlc3MsIGVsc2UgRkFMU0UuCisqLworeworCWNoYXIgY2g7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgb3V0X3BvcyA9IDA7CisJY29uc3QgY2hhciAqZW52OworCWNvbnN0IGNoYXIgKnB0cjsKKwlzdHJ1Y3QgcGFzc3dkICpwd2VudDsKKwljaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV0sIHRtcFtTVFJJTkdfTEVOR1RIXTsKKworCWlmIChsZW5ndGggPiBCVUZGRVJfU0laRSkKKwkJbGVuZ3RoID0gQlVGRkVSX1NJWkU7CisJZm9yICg7IFRSVUU7ICsraW5wdXQpIHsKKwkJc3dpdGNoIChjaCA9ICppbnB1dCkgeworCQkJY2FzZSAnJCc6CisJCQkJLyogIFZhcmlhYmxlIGV4cGFuc2lvbiAgKi8KKwkJCQlpbnB1dCA9IGV4cGFuZF92YXJpYWJsZShidWZmZXIsIGxlbmd0aCwgJm91dF9wb3MsICsraW5wdXQsIGdldF92YXJpYWJsZV9mdW5jLCBpbmZvKTsKKwkJCQlpZiAoaW5wdXQgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCWJyZWFrOworCQkJY2FzZSAnfic6CisJCQkJLyogIEhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiAgKi8KKwkJCQljaCA9IGlucHV0WzFdOworCQkJCWlmIChpc3NwYWNlKGNoKSB8fChjaCA9PSAnLycpIHx8KGNoID09ICdcMCcpKSB7CisJCQkJCS8qIFVzZXIncyBvd24gaG9tZSBkaXJlY3Rvcnk6IGxlYXZlIHNlcGFyYXRvciBmb3IgbmV4dCB0aW1lICovCisJCQkJCWVudiA9IGdldGVudigiSE9NRSIpOworCQkJCQlpZiAoZW52ID09IE5VTEwpIHsKKwkJCQkJCWluZm9fbG9nZ2VyKExPR19JTkZPLCBiYl9tc2dfdmFyaWFibGVfbm90X2ZvdW5kLCAiSE9NRSIpOworCQkJCQkJcmV0dXJuIEZBTFNFOworCQkJCQl9CisJCQkJCWxlbiA9IHN0cmxlbihlbnYpOworCQkJCQlpZiAobGVuICsgb3V0X3BvcyA+PSBsZW5ndGgpCisJCQkJCQlnb3RvIHN0X2V4cHJfZXhwYW5kX291dDsKKwkJCQkJbWVtY3B5KGJ1ZmZlciArIG91dF9wb3MsIGVudiwgbGVuICsgMSk7CisJCQkJCW91dF9wb3MgKz0gbGVuOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogIFNvbWVvbmUgZWxzZSdzIGhvbWUgZGlyZWN0b3J5ICAqLworCQkJCWZvciAocHRyID0gKytpbnB1dDsgIWlzc3BhY2UoY2gpICYmIChjaCAhPSAnLycpICYmIChjaCAhPSAnXDAnKTsgY2ggPSAqKytwdHIpCisJCQkJCS8qIFZPSUQgKi87CisJCQkJbGVuID0gcHRyIC0gaW5wdXQ7CisJCQkJaWYgKGxlbiA+PSBzaXplb2YgdG1wKQorCQkJCQlnb3RvIHN0X2V4cHJfZXhwYW5kX291dDsKKwkJCQlzYWZlX21lbWNweSh0bXAsIGlucHV0LCBsZW4pOworCQkJCWlucHV0ID0gcHRyIC0gMTsKKwkJCQlwd2VudCA9IGdldHB3bmFtKHRtcCk7CisJCQkJaWYgKHB3ZW50ID09IE5VTEwpIHsKKwkJCQkJaW5mb19sb2dnZXIoTE9HX0lORk8sICJubyBwd2VudCBmb3I6ICVzIiwgdG1wKTsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQlsZW4gPSBzdHJsZW4ocHdlbnQtPnB3X2Rpcik7CisJCQkJaWYgKGxlbiArIG91dF9wb3MgPj0gbGVuZ3RoKQorCQkJCQlnb3RvIHN0X2V4cHJfZXhwYW5kX291dDsKKwkJCQltZW1jcHkoYnVmZmVyICsgb3V0X3BvcywgcHdlbnQtPnB3X2RpciwgbGVuICsgMSk7CisJCQkJb3V0X3BvcyArPSBsZW47CisJCQkJYnJlYWs7CisJCQljYXNlICdcMCc6CisJCQkvKiBGYWxsdHJvdWdoICovCisJCQlkZWZhdWx0OgorCQkJCWlmIChvdXRfcG9zID49IGxlbmd0aCkKKwkJCQkJZ290byBzdF9leHByX2V4cGFuZF9vdXQ7CisJCQkJYnVmZmVyW291dF9wb3MrK10gPSBjaDsKKwkJCQlpZiAoY2ggPT0gJ1wwJykgeworCQkJCQltZW1jcHkob3V0cHV0LCBidWZmZXIsIG91dF9wb3MpOworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkvKiBlc2FjICovCisJCX0KKwl9CisJcmV0dXJuIEZBTFNFOworc3RfZXhwcl9leHBhbmRfb3V0OgorCWluZm9fbG9nZ2VyKExPR19JTkZPLCBiYl9tc2dfc21hbGxfYnVmZmVyKTsKKwlyZXR1cm4gRkFMU0U7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBzdF9leHByX2V4cGFuZCAgKi8KKworCisvKiAgUHJpdmF0ZSBmdW5jdGlvbnMgZm9sbG93ICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqZXhwYW5kX3ZhcmlhYmxlKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpvdXRfcG9zLCBjb25zdCBjaGFyICppbnB1dCwKKwkJCQkgICAgY29uc3QgY2hhciAqKCpmdW5jKShjb25zdCBjaGFyICp2YXJpYWJsZSwKKwkJCQkJCQkgdm9pZCAqaW5mbyksCisJCQkJICAgIHZvaWQgKmluZm8pCisvKiAgW1NVTU1BUlldIEV4cGFuZCBhIHZhcmlhYmxlLgorICAgIDxidWZmZXI+IFRoZSBidWZmZXIgdG8gd3JpdGUgdG8uCisgICAgPGxlbmd0aD4gVGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICA8b3V0X3Bvcz4gVGhlIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uLiBUaGlzIGlzIHVwZGF0ZWQuCisgICAgPGlucHV0PiBBIHBvaW50ZXIgdG8gdGhlIGlucHV0IGNoYXJhY3RlciBwb2ludGVyLgorICAgIDxmdW5jPiBBIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBnZXQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGlzCisgICAgcmV0dXJucyBOVUxMLCB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQgaW5zdGVhZC4gSWYgdGhpcyBpcyBOVUxMLCBvbmx5CisgICAgdGhlIGVudmlyb25tZW50IGlzIHNlYXJjaGVkLgorICAgIDxpbmZvPiBBbiBhcmJpdHJhcnkgcG9pbnRlciBwYXNzZWQgdG8gPDxmdW5jPj4uCisgICAgPGVycmZwPiBEaWFnbm9zdGljIG1lc3NhZ2VzIGFyZSB3cml0dGVuIGhlcmUuCisgICAgW1JFVFVSTlNdIEEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoaXMgc3ViZXhwcmVzc2lvbiBvbiBzdWNjZXNzLCBlbHNlIE5VTEwuCisqLworeworCWNoYXIgY2g7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgb3Blbl9icmFjZXM7CisJY29uc3QgY2hhciAqZW52LCAqcHRyOworCWNoYXIgdG1wW1NUUklOR19MRU5HVEhdOworCisJY2ggPSBpbnB1dFswXTsKKwlpZiAoY2ggPT0gJyQnKSB7CisJCS8qICBTcGVjaWFsIGNhc2UgZm9yICIkJCI6IFBJRCAgKi8KKwkJc3ByaW50Zih0bXAsICIlZCIsIChpbnQpIGdldHBpZCgpKTsKKwkJbGVuID0gc3RybGVuKHRtcCk7CisJCWlmIChsZW4gKyAqb3V0X3BvcyA+PSBsZW5ndGgpCisJCQlnb3RvIGV4cGFuZF92YXJpYWJsZV9vdXQ7CisKKwkJbWVtY3B5KGJ1ZmZlciArICpvdXRfcG9zLCB0bXAsIGxlbiArIDEpOworCQlvdXRfcG9zICs9IGxlbjsKKwkJcmV0dXJuIGlucHV0OworCX0KKwkvKiAgT3JkaW5hcnkgdmFyaWFibGUgZXhwYW5zaW9uLCBwb3NzaWJseSBpbiBicmFjZXMgICovCisJaWYgKGNoICE9ICd7JykgeworCQkvKiAgU2ltcGxlIHZhcmlhYmxlIGV4cGFuc2lvbiAgKi8KKwkJZm9yIChwdHIgPSBpbnB1dDsgaXNhbG51bShjaCkgfHwgKGNoID09ICdfJykgfHwgKGNoID09ICc6Jyk7IGNoID0gKisrcHRyKQorCQkJLyogVk9JRCAqLzsKKwkJbGVuID0gcHRyIC0gaW5wdXQ7CisJCWlmICgoc2l6ZV90KWxlbiA+PSBzaXplb2YgdG1wKQorCQkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJCXNhZmVfbWVtY3B5KHRtcCwgaW5wdXQsIGxlbik7CisJCWlucHV0ID0gcHRyIC0gMTsKKwkJZW52ID0gZ2V0X3ZhcmlhYmxlX3YyKHRtcCwgZnVuYywgaW5mbyk7CisJCWlmIChlbnYgPT0gTlVMTCkgeworCQkJaW5mb19sb2dnZXIoTE9HX0lORk8sIGJiX21zZ192YXJpYWJsZV9ub3RfZm91bmQsIHRtcCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlsZW4gPSBzdHJsZW4oZW52KTsKKwkJaWYgKGxlbiArICpvdXRfcG9zID49IGxlbmd0aCkKKwkJCWdvdG8gZXhwYW5kX3ZhcmlhYmxlX291dDsKKworCQltZW1jcHkoYnVmZmVyICsgKm91dF9wb3MsIGVudiwgbGVuICsgMSk7CisJCSpvdXRfcG9zICs9IGxlbjsKKwkJcmV0dXJuIGlucHV0OworCX0KKwkvKiAgVmFyaWFibGUgaW4gYnJhY2VzOiBjaGVjayBmb3IgJzonIHRyaWNrcyAgKi8KKwljaCA9ICorK2lucHV0OworCWZvciAocHRyID0gaW5wdXQ7IGlzYWxudW0oY2gpIHx8IChjaCA9PSAnXycpOyBjaCA9ICorK3B0cikKKwkJLyogVk9JRCAqLzsKKwlpZiAoY2ggPT0gJ30nKSB7CisJCS8qICBNdXN0IGJlIHNpbXBsZSB2YXJpYWJsZSBleHBhbnNpb24gd2l0aCAiJHt2YXJ9IiAgKi8KKwkJbGVuID0gcHRyIC0gaW5wdXQ7CisJCWlmICgoc2l6ZV90KWxlbiA+PSBzaXplb2YgdG1wKQorCQkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJCXNhZmVfbWVtY3B5KHRtcCwgaW5wdXQsIGxlbik7CisJCXB0ciA9IGV4cGFuZF92YXJpYWJsZShidWZmZXIsIGxlbmd0aCwgb3V0X3BvcywgdG1wLCBmdW5jLCBpbmZvKTsKKwkJaWYgKHB0ciA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBpbnB1dCArIGxlbjsKKwl9CisJaWYgKGNoICE9ICc6JyB8fCBwdHJbMV0gIT0gJy0nKSB7CisJCWluZm9fbG9nZ2VyKExPR19JTkZPLCAiaWxsZWdhbCBjaGFyIGluIHZhciBuYW1lIik7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiAgSXQncyB0aGF0IGhhbmR5ICIke3Zhcjotd29yZH0iIGV4cHJlc3Npb24uIENoZWNrIGlmIHZhciBpcyBkZWZpbmVkICAqLworCWxlbiA9IHB0ciAtIGlucHV0OworCWlmICgoc2l6ZV90KWxlbiA+PSBzaXplb2YgdG1wKQorCQlnb3RvIGV4cGFuZF92YXJpYWJsZV9vdXQ7CisKKwlzYWZlX21lbWNweSh0bXAsIGlucHV0LCBsZW4pOworCS8qICBNb3ZlIGlucHV0IHBvaW50ZXIgdG8gJzonICAqLworCWlucHV0ID0gcHRyOworCS8qICBGaXJzdCBza2lwIHRvIGNsb3NpbmcgYnJhY2UsIHRha2luZyBub3RlIG9mIG5lc3RlZCBleHByZXNzaW9ucyAgKi8KKwlwdHIgKz0gMjsKKwljaCA9IHB0clswXTsKKwlmb3IgKG9wZW5fYnJhY2VzID0gMTsgb3Blbl9icmFjZXMgPiAwOyBjaCA9ICorK3B0cikgeworCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlICd7JzoKKwkJCQkrK29wZW5fYnJhY2VzOworCQkJCWJyZWFrOworCQkJY2FzZSAnfSc6CisJCQkJLS1vcGVuX2JyYWNlczsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1wwJzoKKwkJCQlpbmZvX2xvZ2dlcihMT0dfSU5GTywgIlwifVwiIG5vdCBmb3VuZCBpbjogJXMiLCBpbnB1dCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJfQorCS0tcHRyOworCS8qICBBdCB0aGlzIHBvaW50IHB0ciBzaG91bGQgcG9pbnQgdG8gY2xvc2luZyBicmFjZSBvZiAiJHt2YXI6LXdvcmR9IiAgKi8KKwllbnYgPSBnZXRfdmFyaWFibGVfdjIodG1wLCBmdW5jLCBpbmZvKTsKKwlpZiAoZW52ICE9IE5VTEwpIHsKKwkJLyogIEZvdW5kIGVudmlyb25tZW50IHZhcmlhYmxlLCBzbyBza2lwIHRoZSBpbnB1dCB0byB0aGUgY2xvc2luZyBicmFjZQorCQkJYW5kIHJldHVybiB0aGUgdmFyaWFibGUgICovCisJCWlucHV0ID0gcHRyOworCQlsZW4gPSBzdHJsZW4oZW52KTsKKwkJaWYgKGxlbiArICpvdXRfcG9zID49IGxlbmd0aCkKKwkJCWdvdG8gZXhwYW5kX3ZhcmlhYmxlX291dDsKKworCQltZW1jcHkoYnVmZmVyICsgKm91dF9wb3MsIGVudiwgbGVuICsgMSk7CisJCSpvdXRfcG9zICs9IGxlbjsKKwkJcmV0dXJuIGlucHV0OworCX0KKwkvKiAgRW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIG5vdCBmb3VuZCwgc28gcHJvY2VzcyB3b3JkLiBBZHZhbmNlIGlucHV0CisJcG9pbnRlciB0byBzdGFydCBvZiB3b3JkIGluICIke3Zhcjotd29yZH0iICAqLworCWlucHV0ICs9IDI7CisJbGVuID0gcHRyIC0gaW5wdXQ7CisJaWYgKChzaXplX3QpbGVuID49IHNpemVvZiB0bXApCisJCWdvdG8gZXhwYW5kX3ZhcmlhYmxlX291dDsKKworCXNhZmVfbWVtY3B5KHRtcCwgaW5wdXQsIGxlbik7CisJaW5wdXQgPSBwdHI7CisJaWYgKCFzdF9leHByX2V4cGFuZCh0bXAsIFNUUklOR19MRU5HVEgsIHRtcCwgZnVuYywgaW5mbykpCisJCXJldHVybiBOVUxMOworCWxlbiA9IHN0cmxlbih0bXApOworCWlmIChsZW4gKyAqb3V0X3BvcyA+PSBsZW5ndGgpCisJCWdvdG8gZXhwYW5kX3ZhcmlhYmxlX291dDsKKworCW1lbWNweShidWZmZXIgKyAqb3V0X3BvcywgdG1wLCBsZW4gKyAxKTsKKwkqb3V0X3BvcyArPSBsZW47CisJcmV0dXJuIGlucHV0OworZXhwYW5kX3ZhcmlhYmxlX291dDoKKwlpbmZvX2xvZ2dlcihMT0dfSU5GTywgYmJfbXNnX3NtYWxsX2J1ZmZlcik7CisJcmV0dXJuIE5VTEw7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBleHBhbmRfdmFyaWFibGUgICovCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF92YXJpYWJsZV92Mihjb25zdCBjaGFyICp2YXJpYWJsZSwKKwkJCQkgIGNvbnN0IGNoYXIgKigqZnVuYykoY29uc3QgY2hhciAqdmFyaWFibGUsIHZvaWQgKmluZm8pLAorCQkJCSB2b2lkICppbmZvKQorLyogIFtTVU1NQVJZXSBHZXQgYSB2YXJpYWJsZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBvciAuCisgICAgPHZhcmlhYmxlPiBUaGUgdmFyaWFibGUgbmFtZS4KKyAgICA8ZnVuYz4gQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZ2V0IHRoZSB2YXJpYWJsZS4gSWYgdGhpcyByZXR1cm5zCisgICAgTlVMTCwgdGhlIGVudmlyb25tZW50IGlzIHNlYXJjaGVkIGluc3RlYWQuIElmIHRoaXMgaXMgTlVMTCwgb25seSB0aGUKKyAgICBlbnZpcm9ubWVudCBpcyBzZWFyY2hlZC4KKyAgICBbUkVUVVJOU10gVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBvbiBzdWNjZXNzLCBlbHNlIE5VTEwuCisqLworeworCWNvbnN0IGNoYXIgKnZhbHVlOworCisJaWYgKGZ1bmMgIT0gTlVMTCkgeworCQl2YWx1ZSA9ICgqZnVuYykodmFyaWFibGUsIGluZm8pOworCQlpZiAodmFsdWUgIT0gTlVMTCkKKwkJCXJldHVybiB2YWx1ZTsKKwl9CisJcmV0dXJuIGdldGVudih2YXJpYWJsZSk7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBnZXRfdmFyaWFibGUgICovCisKKy8qIEVORCBPRiBDT0RFICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZGV2bWVtLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZGV2bWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2YTIxYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9kZXZtZW0uYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLCBKYW4tRGVyayBCYWtrZXIgKEouRC5CYWtrZXJAaXRzLnR1ZGVsZnQubmwpCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LCBCdXN5Qm94IFRlYW0uIC1zb2xhciA0LzI2LzA4CisgKi8KKworLy91c2FnZTojZGVmaW5lIGRldm1lbV90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiQUREUkVTUyBbV0lEVEggW1ZBTFVFXV0iCisvL3VzYWdlOiNkZWZpbmUgZGV2bWVtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVhZC93cml0ZSBmcm9tIHBoeXNpY2FsIGFkZHJlc3NcbiIKKy8vdXNhZ2U6ICAgICAiXG4JQUREUkVTUwlBZGRyZXNzIHRvIGFjdCB1cG9uIgorLy91c2FnZTogICAgICJcbglXSURUSAlXaWR0aCAoOC8xNi8uLi4pIgorLy91c2FnZTogICAgICJcbglWQUxVRQlEYXRhIHRvIGJlIHdyaXR0ZW4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZGV2bWVtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkZXZtZW1fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXZvaWQgKm1hcF9iYXNlLCAqdmlydF9hZGRyOworCXVpbnQ2NF90IHJlYWRfcmVzdWx0OworCXVpbnQ2NF90IHdyaXRldmFsID0gd3JpdGV2YWw7IC8qIGZvciBjb21waWxlciAqLworCW9mZl90IHRhcmdldDsKKwl1bnNpZ25lZCBwYWdlX3NpemUsIG1hcHBlZF9zaXplLCBvZmZzZXRfaW5fcGFnZTsKKwlpbnQgZmQ7CisJdW5zaWduZWQgd2lkdGggPSA4ICogc2l6ZW9mKGludCk7CisKKwkvKiBkZXZtZW0gQUREUkVTUyBbV0lEVEggW1ZBTFVFXV0gKi8KKy8vIFRPRE86IG9wdGlvbnM/CisvLyAtcjogcmVhZCBhbmQgb3V0cHV0IG9ubHkgdGhlIHZhbHVlIGluIGhleCwgd2l0aCAweCBwcmVmaXgKKy8vIC13OiB3cml0ZSBvbmx5LCBubyByZWFkcyBiZWZvcmUgb3IgYWZ0ZXIsIGFuZCBubyBvdXRwdXQKKy8vIG9yIG1ha2UgdGhpcyBiZWhhdmlvciBkZWZhdWx0PworLy8gTGV0J3MgdHJ5IHRoaXMgYW5kIHNlZSBob3cgdXNlcnMgcmVhY3QuCisKKwkvKiBBRERSRVNTICovCisJaWYgKCFhcmd2WzFdKQorCQliYl9zaG93X3VzYWdlKCk7CisJZXJybm8gPSAwOworCXRhcmdldCA9IGJiX3N0cnRvdWxsKGFyZ3ZbMV0sIE5VTEwsIDApOyAvKiBhbGxvd3MgaGV4LCBvY3QgZXRjICovCisKKwkvKiBXSURUSCAqLworCWlmIChhcmd2WzJdKSB7CisJCWlmIChpc2RpZ2l0KGFyZ3ZbMl1bMF0pIHx8IGFyZ3ZbMl1bMV0pCisJCQl3aWR0aCA9IHhhdG91KGFyZ3ZbMl0pOworCQllbHNlIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGJod2xbXSBBTElHTjEgPSAiYmh3bCI7CisJCQlzdGF0aWMgY29uc3QgdWludDhfdCBzaXplc1tdIEFMSUdOMSA9IHsKKwkJCQk4ICogc2l6ZW9mKGNoYXIpLAorCQkJCTggKiBzaXplb2Yoc2hvcnQpLAorCQkJCTggKiBzaXplb2YoaW50KSwKKwkJCQk4ICogc2l6ZW9mKGxvbmcpLAorCQkJCTAgLyogYmFkICovCisJCQl9OworCQkJd2lkdGggPSBzdHJjaHJudWwoYmh3bCwgKGFyZ3ZbMl1bMF0gfCAweDIwKSkgLSBiaHdsOworCQkJd2lkdGggPSBzaXplc1t3aWR0aF07CisJCX0KKwkJLyogVkFMVUUgKi8KKwkJaWYgKGFyZ3ZbM10pCisJCQl3cml0ZXZhbCA9IGJiX3N0cnRvdWxsKGFyZ3ZbM10sIE5VTEwsIDApOworCX0gZWxzZSB7IC8qIGFyZ3ZbMl0gPT0gTlVMTCAqLworCQkvKiBtYWtlIGFyZ3ZbM10gdG8gYmUgYSB2YWxpZCB0aGluZyB0byBmZXRjaCAqLworCQlhcmd2LS07CisJfQorCWlmIChlcnJubykKKwkJYmJfc2hvd191c2FnZSgpOyAvKiBvbmUgb2YgYmJfc3RydG91WFggZmFpbGVkICovCisKKwlmZCA9IHhvcGVuKCIvZGV2L21lbSIsIGFyZ3ZbM10gPyAoT19SRFdSIHwgT19TWU5DKSA6IChPX1JET05MWSB8IE9fU1lOQykpOworCW1hcHBlZF9zaXplID0gcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKKwlvZmZzZXRfaW5fcGFnZSA9ICh1bnNpZ25lZCl0YXJnZXQgJiAocGFnZV9zaXplIC0gMSk7CisJaWYgKG9mZnNldF9pbl9wYWdlICsgd2lkdGggPiBwYWdlX3NpemUpIHsKKwkJLyogVGhpcyBhY2Nlc3Mgc3BhbnMgcGFnZXMuCisJCSAqIE11c3QgbWFwIHR3byBwYWdlcyB0byBtYWtlIGl0IHBvc3NpYmxlOiAqLworCQltYXBwZWRfc2l6ZSAqPSAyOworCX0KKwltYXBfYmFzZSA9IG1tYXAoTlVMTCwKKwkJCW1hcHBlZF9zaXplLAorCQkJYXJndlszXSA/IChQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSA6IFBST1RfUkVBRCwKKwkJCU1BUF9TSEFSRUQsCisJCQlmZCwKKwkJCXRhcmdldCAmIH4ob2ZmX3QpKHBhZ2Vfc2l6ZSAtIDEpKTsKKwlpZiAobWFwX2Jhc2UgPT0gTUFQX0ZBSUxFRCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJtbWFwIik7CisKKy8vCXByaW50ZigiTWVtb3J5IG1hcHBlZCBhdCBhZGRyZXNzICVwLlxuIiwgbWFwX2Jhc2UpOworCisJdmlydF9hZGRyID0gKGNoYXIqKW1hcF9iYXNlICsgb2Zmc2V0X2luX3BhZ2U7CisKKwlpZiAoIWFyZ3ZbM10pIHsKKwkJc3dpdGNoICh3aWR0aCkgeworCQljYXNlIDg6CisJCQlyZWFkX3Jlc3VsdCA9ICoodm9sYXRpbGUgdWludDhfdCopdmlydF9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlyZWFkX3Jlc3VsdCA9ICoodm9sYXRpbGUgdWludDE2X3QqKXZpcnRfYWRkcjsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJcmVhZF9yZXN1bHQgPSAqKHZvbGF0aWxlIHVpbnQzMl90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJY2FzZSA2NDoKKwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50NjRfdCopdmlydF9hZGRyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIHdpZHRoIik7CisJCX0KKy8vCQlwcmludGYoIlZhbHVlIGF0IGFkZHJlc3MgMHglIk9GRl9GTVQiWCAoJXApOiAweCVsbFhcbiIsCisvLwkJCXRhcmdldCwgdmlydF9hZGRyLAorLy8JCQkodW5zaWduZWQgbG9uZyBsb25nKXJlYWRfcmVzdWx0KTsKKwkJLyogWmVyby1wYWRkZWQgb3V0cHV0IHNob3dzIHRoZSB3aWR0aCBvZiBhY2Nlc3MganVzdCBkb25lICovCisJCXByaW50ZigiMHglMCpsbFhcbiIsICh3aWR0aCA+PiAyKSwgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWFkX3Jlc3VsdCk7CisJfSBlbHNlIHsKKwkJc3dpdGNoICh3aWR0aCkgeworCQljYXNlIDg6CisJCQkqKHZvbGF0aWxlIHVpbnQ4X3QqKXZpcnRfYWRkciA9IHdyaXRldmFsOworLy8JCQlyZWFkX3Jlc3VsdCA9ICoodm9sYXRpbGUgdWludDhfdCopdmlydF9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQkqKHZvbGF0aWxlIHVpbnQxNl90Kil2aXJ0X2FkZHIgPSB3cml0ZXZhbDsKKy8vCQkJcmVhZF9yZXN1bHQgPSAqKHZvbGF0aWxlIHVpbnQxNl90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCSoodm9sYXRpbGUgdWludDMyX3QqKXZpcnRfYWRkciA9IHdyaXRldmFsOworLy8JCQlyZWFkX3Jlc3VsdCA9ICoodm9sYXRpbGUgdWludDMyX3QqKXZpcnRfYWRkcjsKKwkJCWJyZWFrOworCQljYXNlIDY0OgorCQkJKih2b2xhdGlsZSB1aW50NjRfdCopdmlydF9hZGRyID0gd3JpdGV2YWw7CisvLwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50NjRfdCopdmlydF9hZGRyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIHdpZHRoIik7CisJCX0KKy8vCQlwcmludGYoIldyaXR0ZW4gMHglbGxYOyByZWFkYmFjayAweCVsbFhcbiIsCisvLwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXdyaXRldmFsLAorLy8JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZWFkX3Jlc3VsdCk7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWlmIChtdW5tYXAobWFwX2Jhc2UsIG1hcHBlZF9zaXplKSA9PSAtMSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibXVubWFwIik7CisJCWNsb3NlKGZkKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2VqZWN0LmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZWplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBlMDRiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2VqZWN0LmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGVqZWN0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0ICBQZXRlciBXaWxsaXMgPHBzeXBocmVha0BwaHJlYWtlci5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBUaGlzIGlzIGEgc2ltcGxlIGhhY2sgb2YgZWplY3QgYmFzZWQgb24gc29tZXRoaW5nIEVyaWsgcG9zdGVkIGluICN1Y2xpYmMuCisgKiBNb3N0IG9mIHRoZSBkaXJ0eSB3b3JrIGJsYXRhbnRseSByaXBwZWQgb2ZmIGZyb20gY2F0LmMgPSkKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZWplY3RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdF0gWy1UXSBbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSBlamVjdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkVqZWN0IERFVklDRSBvciBkZWZhdWx0IC9kZXYvY2Ryb21cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRUpFQ1RfU0NTSSgKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU0NTSSBkZXZpY2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS10CUNsb3NlIHRyYXkiCisvL3VzYWdlOiAgICAgIlxuCS1UCU9wZW4vY2xvc2UgdHJheSAodG9nZ2xlKSIKKworI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisvKiBNdXN0IGJlIGFmdGVyIGxpYmJiLmg6IHRoZXkgbmVlZCBzaXplX3QgKi8KKyNpbmNsdWRlICJmaXhfdTMyLmgiCisjaW5jbHVkZSA8c2NzaS9zZy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorCisvKiB2YXJpb3VzIGRlZmluZXMgc3dpcGVkIGZyb20gbGludXgvY2Ryb20uaCAqLworI2RlZmluZSBDRFJPTUNMT1NFVFJBWSAgICAgICAgICAgIDB4NTMxOSAgLyogcGVuZGFudCBvZiBDRFJPTUVKRUNUICAqLworI2RlZmluZSBDRFJPTUVKRUNUICAgICAgICAgICAgICAgIDB4NTMwOSAgLyogRWplY3RzIHRoZSBjZHJvbSBtZWRpYSAqLworI2RlZmluZSBDRFJPTV9EUklWRV9TVEFUVVMgICAgICAgIDB4NTMyNiAgLyogR2V0IHRyYXkgcG9zaXRpb24sIGV0Yy4gKi8KKy8qIGRyaXZlIHN0YXR1cyBwb3NzaWJpbGl0aWVzIHJldHVybmVkIGJ5IENEUk9NX0RSSVZFX1NUQVRVUyBpb2N0bCAqLworI2RlZmluZSBDRFNfVFJBWV9PUEVOICAgICAgICAyCisKKyNkZWZpbmUgZGV2X2ZkIDMKKworLyogQ29kZSB0YWtlbiBmcm9tIHRoZSBvcmlnaW5hbCBlamVjdCAoaHR0cDovL2VqZWN0LnNvdXJjZWZvcmdlLm5ldC8pLAorICogcmVmYWN0b3JlZCBpdCBhIGJpdCBmb3IgYnVzeWJveCAobmUtYmJAbmljb2VyZnVydGguZGUpICovCisKK3N0YXRpYyB2b2lkIGVqZWN0X3Njc2koY29uc3QgY2hhciAqZGV2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIHNnX2NvbW1hbmRzWzNdWzZdID0geworCQl7IEFMTE9XX01FRElVTV9SRU1PVkFMLCAwLCAwLCAwLCAwLCAwIH0sCisJCXsgU1RBUlRfU1RPUCwgMCwgMCwgMCwgMSwgMCB9LAorCQl7IFNUQVJUX1NUT1AsIDAsIDAsIDAsIDIsIDAgfQorCX07CisKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIGNoYXIgc2Vuc2VfYnVmZmVyWzMyXTsKKwl1bnNpZ25lZCBjaGFyIGlucUJ1ZmZbMl07CisJc2dfaW9faGRyX3QgaW9faGRyOworCisJaWYgKChpb2N0bChkZXZfZmQsIFNHX0dFVF9WRVJTSU9OX05VTSwgJmkpIDwgMCkgfHwgKGkgPCAzMDAwMCkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgYSBzZyBkZXZpY2Ugb3Igb2xkIHNnIGRyaXZlciIpOworCisJbWVtc2V0KCZpb19oZHIsIDAsIHNpemVvZihzZ19pb19oZHJfdCkpOworCWlvX2hkci5pbnRlcmZhY2VfaWQgPSAnUyc7CisJaW9faGRyLmNtZF9sZW4gPSA2OworCWlvX2hkci5teF9zYl9sZW4gPSBzaXplb2Yoc2Vuc2VfYnVmZmVyKTsKKwlpb19oZHIuZHhmZXJfZGlyZWN0aW9uID0gU0dfRFhGRVJfTk9ORTsKKwkvKiBpb19oZHIuZHhmZXJfbGVuID0gMDsgKi8KKwlpb19oZHIuZHhmZXJwID0gaW5xQnVmZjsKKwlpb19oZHIuc2JwID0gc2Vuc2VfYnVmZmVyOworCWlvX2hkci50aW1lb3V0ID0gMjAwMDsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaW9faGRyLmNtZHAgPSAodm9pZCAqKXNnX2NvbW1hbmRzW2ldOworCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShkZXZfZmQsIFNHX0lPLCAodm9pZCAqKSZpb19oZHIsICIlcyIsIGRldik7CisJfQorCisJLyogZm9yY2Uga2VybmVsIHRvIHJlcmVhZCBwYXJ0aXRpb24gdGFibGUgd2hlbiBuZXcgZGlzYyBpcyBpbnNlcnRlZCAqLworCWlvY3RsKGRldl9mZCwgQkxLUlJQQVJUKTsKK30KKworI2RlZmluZSBGTEFHX0NMT1NFICAxCisjZGVmaW5lIEZMQUdfU01BUlQgIDIKKyNkZWZpbmUgRkxBR19TQ1NJICAgNAorCitzdGF0aWMgdm9pZCBlamVjdF9jZHJvbSh1bnNpZ25lZCBmbGFncywgY29uc3QgY2hhciAqZGV2KQoreworCWludCBjbWQgPSBDRFJPTUVKRUNUOworCisJaWYgKGZsYWdzICYgRkxBR19DTE9TRQorCSB8fCAoKGZsYWdzICYgRkxBR19TTUFSVCkgJiYgaW9jdGwoZGV2X2ZkLCBDRFJPTV9EUklWRV9TVEFUVVMpID09IENEU19UUkFZX09QRU4pCisJKSB7CisJCWNtZCA9IENEUk9NQ0xPU0VUUkFZOworCX0KKworCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGRldl9mZCwgY21kLCBOVUxMLCAiJXMiLCBkZXYpOworfQorCitpbnQgZWplY3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGVqZWN0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBmbGFnczsKKwljb25zdCBjaGFyICpkZXZpY2U7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MTp0LS1UOlQtLXQiOworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgInRUIiBJRl9GRUFUVVJFX0VKRUNUX1NDU0koInMiKSk7CisJZGV2aWNlID0gYXJndltvcHRpbmRdID8gYXJndltvcHRpbmRdIDogIi9kZXYvY2Ryb20iOworCisJLyogV2UgdXNlZCB0byBkbyAidW1vdW50IDxkZXZpY2U+IiBoZXJlLCBidXQgaXQgd2FzIGJ1Z2d5CisJICAgaWYgc29tZXRoaW5nIHdhcyBtb3VudGVkIE9WRVIgY2Ryb20gYW5kCisJICAgaWYgY2Ryb20gaXMgbW91bnRlZCBtYW55IHRpbWVzLgorCisJICAgVGhpcyB3b3JrcyBlcXVhbGx5IHdlbGwgKG9yIGJldHRlcik6CisJICAgIyEvYmluL3NoCisJICAgdW1vdW50IC9kZXYvY2Ryb20KKwkgICBlamVjdCAvZGV2L2Nkcm9tCisJKi8KKworCXhtb3ZlX2ZkKHhvcGVuX25vbmJsb2NraW5nKGRldmljZSksIGRldl9mZCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfRUpFQ1RfU0NTSSAmJiAoZmxhZ3MgJiBGTEFHX1NDU0kpKQorCQllamVjdF9zY3NpKGRldmljZSk7CisJZWxzZQorCQllamVjdF9jZHJvbShmbGFncywgZGV2aWNlKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoZGV2X2ZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZmJzcGxhc2guYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9mYnNwbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmE0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZmJzcGxhc2guYwpAQCAtMCwwICsxLDQ1NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hlbGUgU2FuZ2VzIDxtaWNoZWxlLnNhbmdlc0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBVc2FnZToKKyAqIC0gdXNlIGtlcm5lbCBvcHRpb24gJ3ZnYT14eHgnIG9yIG90aGVyd2lzZSBlbmFibGUgZnJhbWVidWZmZXIgZGV2aWNlLgorICogLSBwdXQgc29tZXdoZXJlIGZic3BsYXNoLmNmZyBmaWxlIGFuZCBhbiBpbWFnZSBpbiAucHBtIGZvcm1hdC4KKyAqIC0gcnVuIGFwcGxldDogJCBzZXRzaWQgZmJzcGxhc2ggW3BhcmFtc10gJgorICogICAgICAtYzogaGlkZSBjdXJzb3IKKyAqICAgICAgLWQgL2Rldi9mYk46IGZyYW1lYnVmZmVyIGRldmljZSAoaWYgbm90IC9kZXYvZmIwKQorICogICAgICAtcyBwYXRoX3RvX2ltYWdlX2ZpbGUgKGNhbiBiZSAiLSIgZm9yIHN0ZGluKQorICogICAgICAtaSBwYXRoX3RvX2NmZ19maWxlCisgKiAgICAgIC1mIHBhdGhfdG9fZmlmbyAoY2FuIGJlICItIiBmb3Igc3RkaW4pCisgKiAtIGlmIHlvdSB3YW50IHRvIHJ1biBpdCBvbmx5IGluIHByZXNlbmNlIG9mIGEga2VybmVsIHBhcmFtZXRlcgorICogICAoZm9yIGV4YW1wbGUgZmJzcGxhc2g9b24pLCB1c2U6CisgKiAgIGdyZXAgLXEgImZic3BsYXNoPW9uIiA8L3Byb2MvY21kbGluZSAmJiBzZXRzaWQgZmJzcGxhc2ggW3BhcmFtc10KKyAqIC0gY29tbWFuZHMgZm9yIGZpZm86CisgKiAgICJOTiIgKEFTQ0lJIGRlY2ltYWwgbnVtYmVyKSAtIHBlcmNlbnRhZ2UgdG8gc2hvdyBvbiBwcm9ncmVzcyBiYXIuCisgKiAgICJleGl0IiAob3IganVzdCBjbG9zZSBmaWZvKSAtIHdlbGwgeW91IGd1ZXNzZWQgaXQuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZic3BsYXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItcyBJTUdGSUxFIFstY10gWy1kIERFVl0gWy1pIElOSUZJTEVdIFstZiBDTURdIgorLy91c2FnZTojZGVmaW5lIGZic3BsYXNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1zCUltYWdlIgorLy91c2FnZTogICAgICJcbgktYwlIaWRlIGN1cnNvciIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRnJhbWVidWZmZXIgZGV2aWNlIChkZWZhdWx0IC9kZXYvZmIwKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJQ29uZmlnIGZpbGUgKHZhcj12YWx1ZSk6IgorLy91c2FnZTogICAgICJcbgkJCUJBUl9MRUZULEJBUl9UT1AsQkFSX1dJRFRILEJBUl9IRUlHSFQiCisvL3VzYWdlOiAgICAgIlxuCQkJQkFSX1IsQkFSX0csQkFSX0IiCisvL3VzYWdlOiAgICAgIlxuCS1mCUNvbnRyb2wgcGlwZSAoZWxzZSBleGl0IGFmdGVyIGRyYXdpbmcgaW1hZ2UpIgorLy91c2FnZTogICAgICJcbgkJCWNvbW1hbmRzOiAnTk4nICglIGZvciBwcm9ncmVzcyBiYXIpIG9yICdleGl0JyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworLyogSWYgeW91IHdhbnQgbG9nZ2luZyBtZXNzYWdlcyBvbiAvdG1wL2Zic3BsYXNoLmxvZy4uLiAqLworI2RlZmluZSBERUJVRyAwCisKK3N0cnVjdCBnbG9iYWxzIHsKKyNpZiBERUJVRworCWJvb2wgYmRlYnVnX21lc3NhZ2VzOwkvLyBlbmFibGUvZGlzYWJsZSBsb2dnaW5nCisJRklMRSAqbG9nZmlsZV9mZDsJLy8gbG9nIGZpbGUKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgKmFkZHI7CS8vIHBvaW50ZXIgdG8gZnJhbWVidWZmZXIgbWVtb3J5CisJdW5zaWduZWQgbnNbN107CQkvLyBuLXBhcmFtZXRlcnMKKwljb25zdCBjaGFyICppbWFnZV9maWxlbmFtZTsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gc2NyX3ZhcjsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gc2NyX2ZpeDsKKwl1bnNpZ25lZCBieXRlc19wZXJfcGl4ZWw7Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG5iYXJfd2lkdGgJbnNbMF0JLy8gcHJvZ3Jlc3MgYmFyIHdpZHRoCisjZGVmaW5lIG5iYXJfaGVpZ2h0CW5zWzFdCS8vIHByb2dyZXNzIGJhciBoZWlnaHQKKyNkZWZpbmUgbmJhcl9wb3N4CW5zWzJdCS8vIHByb2dyZXNzIGJhciBob3Jpem9udGFsIHBvc2l0aW9uCisjZGVmaW5lIG5iYXJfcG9zeQluc1szXQkvLyBwcm9ncmVzcyBiYXIgdmVydGljYWwgcG9zaXRpb24KKyNkZWZpbmUgbmJhcl9jb2xyCW5zWzRdCS8vIHByb2dyZXNzIGJhciBjb2xvciByZWQgY29tcG9uZW50CisjZGVmaW5lIG5iYXJfY29sZwluc1s1XQkvLyBwcm9ncmVzcyBiYXIgY29sb3IgZ3JlZW4gY29tcG9uZW50CisjZGVmaW5lIG5iYXJfY29sYgluc1s2XQkvLyBwcm9ncmVzcyBiYXIgY29sb3IgYmx1ZSBjb21wb25lbnQKKworI2lmIERFQlVHCisjZGVmaW5lIERFQlVHX01FU1NBR0Uoc3RyTWVzc2FnZSwgYXJncy4uLikgXAorCWlmIChHLmJkZWJ1Z19tZXNzYWdlcykgeyBcCisJCWZwcmludGYoRy5sb2dmaWxlX2ZkLCAiWyVzXVslc10gLSAlc1xuIiwgXAorCQlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBzdHJNZXNzYWdlKTsJXAorCX0KKyNlbHNlCisjZGVmaW5lIERFQlVHX01FU1NBR0UoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKKy8qKgorICogT3BlbiBhbmQgaW5pdGlhbGl6ZSB0aGUgZnJhbWVidWZmZXIgZGV2aWNlCisgKiBccGFyYW0gKnN0cmZiX2RldmljZSBwb2ludGVyIHRvIGZyYW1lYnVmZmVyIGRldmljZQorICovCitzdGF0aWMgdm9pZCBmYl9vcGVuKGNvbnN0IGNoYXIgKnN0cmZiX2RldmljZSkKK3sKKwlpbnQgZmJmZCA9IHhvcGVuKHN0cmZiX2RldmljZSwgT19SRFdSKTsKKworCS8vIGZyYW1lYnVmZmVyIHByb3BlcnRpZXMKKwl4aW9jdGwoZmJmZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJkcuc2NyX3Zhcik7CisJeGlvY3RsKGZiZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZHLnNjcl9maXgpOworCisJaWYgKEcuc2NyX3Zhci5iaXRzX3Blcl9waXhlbCA8IDE2IHx8IEcuc2NyX3Zhci5iaXRzX3Blcl9waXhlbCA+IDMyKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5zdXBwb3J0ZWQgJXUgYnBwIiwgKGludClHLnNjcl92YXIuYml0c19wZXJfcGl4ZWwpOworCUcuYnl0ZXNfcGVyX3BpeGVsID0gKEcuc2NyX3Zhci5iaXRzX3Blcl9waXhlbCArIDcpID4+IDM7CisKKwkvLyBtYXAgdGhlIGRldmljZSBpbiBtZW1vcnkKKwlHLmFkZHIgPSBtbWFwKE5VTEwsCisJCQlHLnNjcl92YXIueHJlcyAqIEcuc2NyX3Zhci55cmVzICogRy5ieXRlc19wZXJfcGl4ZWwsCisJCQlQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmYmZkLCAwKTsKKwlpZiAoRy5hZGRyID09IE1BUF9GQUlMRUQpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibW1hcCIpOworCisJLy8gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB2aXNpYmxlIHNjcmVlbgorCUcuYWRkciArPSBHLnNjcl92YXIueW9mZnNldCAqIEcuc2NyX2ZpeC5saW5lX2xlbmd0aCArIEcuc2NyX3Zhci54b2Zmc2V0ICogRy5ieXRlc19wZXJfcGl4ZWw7CisJY2xvc2UoZmJmZCk7Cit9CisKKworLyoqCisgKiBSZXR1cm4gcGl4ZWwgdmFsdWUgb2YgdGhlIHBhc3NlZCBSR0IgY29sb3IKKyAqLworc3RhdGljIHVuc2lnbmVkIGZiX3BpeGVsX3ZhbHVlKHVuc2lnbmVkIHIsIHVuc2lnbmVkIGcsIHVuc2lnbmVkIGIpCit7CisJaWYgKEcuYnl0ZXNfcGVyX3BpeGVsID09IDIpIHsKKwkJciA+Pj0gMzsgIC8vIDUtYml0IHJlZAorCQlnID4+PSAyOyAgLy8gNi1iaXQgZ3JlZW4KKwkJYiA+Pj0gMzsgIC8vIDUtYml0IGJsdWUKKwkJcmV0dXJuIGIgKyAoZyA8PCA1KSArIChyIDw8ICg1KzYpKTsKKwl9CisJLy8gUkdCIDg4OAorCXJldHVybiBiICsgKGcgPDwgOCkgKyAociA8PCAxNik7Cit9CisKKy8qKgorICogRHJhdyBwaXhlbCBvbiBmcmFtZWJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBmYl93cml0ZV9waXhlbCh1bnNpZ25lZCBjaGFyICphZGRyLCB1bnNpZ25lZCBwaXhlbCkKK3sKKwlzd2l0Y2ggKEcuYnl0ZXNfcGVyX3BpeGVsKSB7CisJY2FzZSAyOgorCQkqKHVpbnQxNl90ICopYWRkciA9IHBpeGVsOworCQlicmVhazsKKwljYXNlIDQ6CisJCSoodWludDMyX3QgKilhZGRyID0gcGl4ZWw7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8vIDI0IGJpdHMgcGVyIHBpeGVsCisJCWFkZHJbMF0gPSBwaXhlbDsKKwkJYWRkclsxXSA9IHBpeGVsID4+IDg7CisJCWFkZHJbMl0gPSBwaXhlbCA+PiAxNjsKKwl9Cit9CisKKworLyoqCisgKiBEcmF3IGhvbGxvdyByZWN0YW5nbGUgb24gZnJhbWVidWZmZXIKKyAqLworc3RhdGljIHZvaWQgZmJfZHJhd3JlY3RhbmdsZSh2b2lkKQoreworCWludCBjbnQ7CisJdW5zaWduZWQgdGhpc3BpeDsKKwl1bnNpZ25lZCBjaGFyICpwdHIxLCAqcHRyMjsKKwl1bnNpZ25lZCBjaGFyIG5yZWQgPSBHLm5iYXJfY29sci8yOworCXVuc2lnbmVkIGNoYXIgbmdyZWVuID0gIEcubmJhcl9jb2xnLzI7CisJdW5zaWduZWQgY2hhciBuYmx1ZSA9IEcubmJhcl9jb2xiLzI7CisKKwl0aGlzcGl4ID0gZmJfcGl4ZWxfdmFsdWUobnJlZCwgbmdyZWVuLCBuYmx1ZSk7CisKKwkvLyBob3Jpem9udGFsIGxpbmVzCisJcHRyMSA9IEcuYWRkciArIChHLm5iYXJfcG9zeSAqIEcuc2NyX3Zhci54cmVzICsgRy5uYmFyX3Bvc3gpICogRy5ieXRlc19wZXJfcGl4ZWw7CisJcHRyMiA9IEcuYWRkciArICgoRy5uYmFyX3Bvc3kgKyBHLm5iYXJfaGVpZ2h0IC0gMSkgKiBHLnNjcl92YXIueHJlcyArIEcubmJhcl9wb3N4KSAqIEcuYnl0ZXNfcGVyX3BpeGVsOworCWNudCA9IEcubmJhcl93aWR0aCAtIDE7CisJZG8geworCQlmYl93cml0ZV9waXhlbChwdHIxLCB0aGlzcGl4KTsKKwkJZmJfd3JpdGVfcGl4ZWwocHRyMiwgdGhpc3BpeCk7CisJCXB0cjEgKz0gRy5ieXRlc19wZXJfcGl4ZWw7CisJCXB0cjIgKz0gRy5ieXRlc19wZXJfcGl4ZWw7CisJfSB3aGlsZSAoLS1jbnQgPj0gMCk7CisKKwkvLyB2ZXJ0aWNhbCBsaW5lcworCXB0cjEgPSBHLmFkZHIgKyAoRy5uYmFyX3Bvc3kgKiBHLnNjcl92YXIueHJlcyArIEcubmJhcl9wb3N4KSAqIEcuYnl0ZXNfcGVyX3BpeGVsOworCXB0cjIgPSBHLmFkZHIgKyAoRy5uYmFyX3Bvc3kgKiBHLnNjcl92YXIueHJlcyArIEcubmJhcl9wb3N4ICsgRy5uYmFyX3dpZHRoIC0gMSkgKiBHLmJ5dGVzX3Blcl9waXhlbDsKKwljbnQgPSBHLm5iYXJfaGVpZ2h0IC0gMTsKKwlkbyB7CisJCWZiX3dyaXRlX3BpeGVsKHB0cjEsIHRoaXNwaXgpOworCQlmYl93cml0ZV9waXhlbChwdHIyLCB0aGlzcGl4KTsKKwkJcHRyMSArPSBHLnNjcl92YXIueHJlcyAqIEcuYnl0ZXNfcGVyX3BpeGVsOworCQlwdHIyICs9IEcuc2NyX3Zhci54cmVzICogRy5ieXRlc19wZXJfcGl4ZWw7CisJfSB3aGlsZSAoLS1jbnQgPj0gMCk7Cit9CisKKworLyoqCisgKiBEcmF3IGZpbGxlZCByZWN0YW5nbGUgb24gZnJhbWVidWZmZXIKKyAqIFxwYXJhbSBueDFwb3MsbnkxcG9zIHVwcGVyIGxlZnQgcG9zaXRpb24KKyAqIFxwYXJhbSBueDJwb3MsbnkycG9zIGRvd24gcmlnaHQgcG9zaXRpb24KKyAqIFxwYXJhbSBucmVkLG5ncmVlbixuYmx1ZSByZ2IgY29sb3IKKyAqLworc3RhdGljIHZvaWQgZmJfZHJhd2Z1bGxyZWN0YW5nbGUoaW50IG54MXBvcywgaW50IG55MXBvcywgaW50IG54MnBvcywgaW50IG55MnBvcywKKwl1bnNpZ25lZCBjaGFyIG5yZWQsIHVuc2lnbmVkIGNoYXIgbmdyZWVuLCB1bnNpZ25lZCBjaGFyIG5ibHVlKQoreworCWludCBjbnQxLCBjbnQyLCBueXBvczsKKwl1bnNpZ25lZCB0aGlzcGl4OworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCXRoaXNwaXggPSBmYl9waXhlbF92YWx1ZShucmVkLCBuZ3JlZW4sIG5ibHVlKTsKKworCWNudDEgPSBueTJwb3MgLSBueTFwb3M7CisJbnlwb3MgPSBueTFwb3M7CisJZG8geworCQlwdHIgPSBHLmFkZHIgKyAobnlwb3MgKiBHLnNjcl92YXIueHJlcyArIG54MXBvcykgKiBHLmJ5dGVzX3Blcl9waXhlbDsKKwkJY250MiA9IG54MnBvcyAtIG54MXBvczsKKwkJZG8geworCQkJZmJfd3JpdGVfcGl4ZWwocHRyLCB0aGlzcGl4KTsKKwkJCXB0ciArPSBHLmJ5dGVzX3Blcl9waXhlbDsKKwkJfSB3aGlsZSAoLS1jbnQyID49IDApOworCisJCW55cG9zKys7CisJfSB3aGlsZSAoLS1jbnQxID49IDApOworfQorCisKKy8qKgorICogRHJhdyBhIHByb2dyZXNzIGJhciBvbiBmcmFtZWJ1ZmZlcgorICogXHBhcmFtIHBlcmNlbnQgcGVyY2VudGFnZSBvZiBsb2FkaW5nCisgKi8KK3N0YXRpYyB2b2lkIGZiX2RyYXdwcm9ncmVzc2Jhcih1bnNpZ25lZCBwZXJjZW50KQoreworCWludCBpLCBsZWZ0X3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0OworCisJLy8gb3V0ZXIgYm94CisJbGVmdF94ID0gRy5uYmFyX3Bvc3g7CisJdG9wX3kgPSBHLm5iYXJfcG9zeTsKKwl3aWR0aCA9IEcubmJhcl93aWR0aCAtIDE7CisJaGVpZ2h0ID0gRy5uYmFyX2hlaWdodCAtIDE7CisJaWYgKChoZWlnaHQgfCB3aWR0aCkgPCAwKQorCQlyZXR1cm47CisJLy8gTkI6ICJ3aWR0aCIgb2YgMSBhY3R1YWxseSBtYWtlcyByZWN0IHdpdGggd2lkdGggb2YgMiEKKwlmYl9kcmF3cmVjdGFuZ2xlKCk7CisKKwkvLyBpbm5lciAiZW1wdHkiIHJlY3RhbmdsZQorCWxlZnRfeCsrOworCXRvcF95Kys7CisJd2lkdGggLT0gMjsKKwloZWlnaHQgLT0gMjsKKwlpZiAoKGhlaWdodCB8IHdpZHRoKSA8IDApCisJCXJldHVybjsKKwlmYl9kcmF3ZnVsbHJlY3RhbmdsZSgKKwkJCWxlZnRfeCwJdG9wX3ksCisJCQkJCWxlZnRfeCArIHdpZHRoLCB0b3BfeSArIGhlaWdodCwKKwkJCUcubmJhcl9jb2xyLCBHLm5iYXJfY29sZywgRy5uYmFyX2NvbGIpOworCisJaWYgKHBlcmNlbnQgPiAwKSB7CisJCS8vIGFjdHVhbCBwcm9ncmVzcyBiYXIKKwkJd2lkdGggPSB3aWR0aCAqIHBlcmNlbnQgLyAxMDA7CisJCWkgPSBoZWlnaHQ7CisJCWlmIChoZWlnaHQgPT0gMCkKKwkJCWhlaWdodCsrOyAvLyBkaXZpZGUgYnkgMCBpcyBiYWQKKwkJd2hpbGUgKGkgPj0gMCkgeworCQkJLy8gZHJhdyBvbmUtbGluZSB0aGljayAicmVjdGFuZ2xlIgorCQkJLy8gdG9wIGxpbmUgd2lsbCBoYXZlIGdyYXkgbHZsIDIwMCwgYm90dG9tIG9uZSAxMDAKKwkJCXVuc2lnbmVkIGdyYXlfbGV2ZWwgPSAxMDAgKyBpKjEwMC9oZWlnaHQ7CisJCQlmYl9kcmF3ZnVsbHJlY3RhbmdsZSgKKwkJCQkJbGVmdF94LCB0b3BfeSwgbGVmdF94ICsgd2lkdGgsIHRvcF95LAorCQkJCQlncmF5X2xldmVsLCBncmF5X2xldmVsLCBncmF5X2xldmVsKTsKKwkJCXRvcF95Kys7CisJCQlpLS07CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBEcmF3IGltYWdlIGZyb20gUFBNIGZpbGUKKyAqLworc3RhdGljIHZvaWQgZmJfZHJhd2ltYWdlKHZvaWQpCit7CisJRklMRSAqdGhlbWVfZmlsZTsKKwljaGFyICpyZWFkX3B0cjsKKwl1bnNpZ25lZCBjaGFyICpwaXhsaW5lOworCXVuc2lnbmVkIGksIGosIHdpZHRoLCBoZWlnaHQsIGxpbmVfc2l6ZTsKKworCWlmIChMT05FX0RBU0goRy5pbWFnZV9maWxlbmFtZSkpIHsKKwkJdGhlbWVfZmlsZSA9IHN0ZGluOworCX0gZWxzZSB7CisJCWludCBmZCA9IG9wZW5femlwcGVkKEcuaW1hZ2VfZmlsZW5hbWUpOworCQlpZiAoZmQgPCAwKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShHLmltYWdlX2ZpbGVuYW1lKTsKKwkJdGhlbWVfZmlsZSA9IHhmZG9wZW5fZm9yX3JlYWQoZmQpOworCX0KKworCS8qIFBhcnNlIHBwbSBoZWFkZXI6CisJICogLSBNYWdpYzogdHdvIGNoYXJhY3RlcnMgIlA2Ii4KKwkgKiAtIFdoaXRlc3BhY2UgKGJsYW5rcywgVEFCcywgQ1JzLCBMRnMpLgorCSAqIC0gQSB3aWR0aCwgZm9ybWF0dGVkIGFzIEFTQ0lJIGNoYXJhY3RlcnMgaW4gZGVjaW1hbC4KKwkgKiAtIFdoaXRlc3BhY2UuCisJICogLSBBIGhlaWdodCwgQVNDSUkgZGVjaW1hbC4KKwkgKiAtIFdoaXRlc3BhY2UuCisJICogLSBUaGUgbWF4aW11bSBjb2xvciB2YWx1ZSwgQVNDSUkgZGVjaW1hbCwgaW4gMC4uNjU1MzUKKwkgKiAtIE5ld2xpbmUgb3Igb3RoZXIgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLgorCSAqICAgKHdlIHN1cHBvcnQgbmV3bGluZSBvbmx5KQorCSAqIC0gQSByYXN0ZXIgb2YgV2lkdGggKiBIZWlnaHQgcGl4ZWxzIGluIHRyaXBsZXRzIG9mIHJnYgorCSAqICAgaW4gcHVyZSBiaW5hcnkgYnkgMSBvciAyIGJ5dGVzLiAod2Ugc3VwcG9ydCBvbmx5IDEgYnl0ZSkKKwkgKi8KKyNkZWZpbmUgY29uY2F0X2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCXJlYWRfcHRyID0gY29uY2F0X2J1ZjsKKwl3aGlsZSAoMSkgeworCQlpbnQgdywgaCwgbWF4X2NvbG9yX3ZhbDsKKwkJaW50IHJlbSA9IGNvbmNhdF9idWYgKyBzaXplb2YoY29uY2F0X2J1ZikgLSByZWFkX3B0cjsKKwkJaWYgKHJlbSA8IDIKKwkJIHx8IGZnZXRzKHJlYWRfcHRyLCByZW0sIHRoZW1lX2ZpbGUpID09IE5VTEwKKwkJKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIFBQTSBmaWxlICclcyciLCBHLmltYWdlX2ZpbGVuYW1lKTsKKwkJfQorCQlyZWFkX3B0ciA9IHN0cmNocm51bChyZWFkX3B0ciwgJyMnKTsKKwkJKnJlYWRfcHRyID0gJ1wwJzsgLyogaWdub3JlICNjb21tZW50cyAqLworCQlpZiAoc3NjYW5mKGNvbmNhdF9idWYsICJQNiAldSAldSAldSIsICZ3LCAmaCwgJm1heF9jb2xvcl92YWwpID09IDMKKwkJICYmIG1heF9jb2xvcl92YWwgPD0gMjU1CisJCSkgeworCQkJd2lkdGggPSB3OyAvKiB3IGlzIG9uIHN0YWNrLCB3aWR0aCBtYXkgYmUgaW4gcmVnaXN0ZXIgKi8KKwkJCWhlaWdodCA9IGg7CisJCQlicmVhazsKKwkJfQorCX0KKworCWxpbmVfc2l6ZSA9IHdpZHRoKjM7CisJcGl4bGluZSA9IHhtYWxsb2MobGluZV9zaXplKTsKKworCWlmICh3aWR0aCA+IEcuc2NyX3Zhci54cmVzKQorCQl3aWR0aCA9IEcuc2NyX3Zhci54cmVzOworCWlmIChoZWlnaHQgPiBHLnNjcl92YXIueXJlcykKKwkJaGVpZ2h0ID0gRy5zY3JfdmFyLnlyZXM7CisJZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisJCXVuc2lnbmVkIGNoYXIgKnBpeGVsOworCQl1bnNpZ25lZCBjaGFyICpzcmM7CisKKwkJaWYgKGZyZWFkKHBpeGxpbmUsIDEsIGxpbmVfc2l6ZSwgdGhlbWVfZmlsZSkgIT0gbGluZV9zaXplKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBQUE0gZmlsZSAnJXMnIiwgRy5pbWFnZV9maWxlbmFtZSk7CisJCXBpeGVsID0gcGl4bGluZTsKKwkJc3JjID0gRy5hZGRyICsgaiAqIEcuc2NyX2ZpeC5saW5lX2xlbmd0aDsKKwkJZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKwkJCXVuc2lnbmVkIHRoaXNwaXggPSBmYl9waXhlbF92YWx1ZShwaXhlbFswXSwgcGl4ZWxbMV0sIHBpeGVsWzJdKTsKKwkJCWZiX3dyaXRlX3BpeGVsKHNyYywgdGhpc3BpeCk7CisJCQlzcmMgKz0gRy5ieXRlc19wZXJfcGl4ZWw7CisJCQlwaXhlbCArPSAzOworCQl9CisJfQorCWZyZWUocGl4bGluZSk7CisJZmNsb3NlKHRoZW1lX2ZpbGUpOworfQorCisKKy8qKgorICogUGFyc2UgY29uZmlndXJhdGlvbiBmaWxlCisgKiBccGFyYW0gKmNmZ19maWxlbmFtZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyAqLworc3RhdGljIHZvaWQgaW5pdChjb25zdCBjaGFyICpjZmdfZmlsZW5hbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcGFyYW1fbmFtZXNbXSBBTElHTjEgPQorCQkiQkFSX1dJRFRIXDAiICJCQVJfSEVJR0hUXDAiCisJCSJCQVJfTEVGVFwwIiAiQkFSX1RPUFwwIgorCQkiQkFSX1JcMCIgIkJBUl9HXDAiICJCQVJfQlwwIgorI2lmIERFQlVHCisJCSJERUJVR1wwIgorI2VuZGlmCisJCTsKKwljaGFyICp0b2tlblsyXTsKKwlwYXJzZXJfdCAqcGFyc2VyID0gY29uZmlnX29wZW4yKGNmZ19maWxlbmFtZSwgeGZvcGVuX3N0ZGluKTsKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIiM9IiwKKwkJCQkoUEFSU0VfTk9STUFMIHwgUEFSU0VfTUlOX0RJRSkgJiB+KFBBUlNFX1RSSU0gfCBQQVJTRV9DT0xMQVBTRSkpKSB7CisJCXVuc2lnbmVkIHZhbCA9IHhhdG9pX3Bvc2l0aXZlKHRva2VuWzFdKTsKKwkJaW50IGkgPSBpbmRleF9pbl9zdHJpbmdzKHBhcmFtX25hbWVzLCB0b2tlblswXSk7CisJCWlmIChpIDwgMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW50YXggZXJyb3I6ICVzIiwgdG9rZW5bMF0pOworCQlpZiAoaSA+PSAwICYmIGkgPCA3KQorCQkJRy5uc1tpXSA9IHZhbDsKKyNpZiBERUJVRworCQlpZiAoaSA9PSA3KSB7CisJCQlHLmJkZWJ1Z19tZXNzYWdlcyA9IHZhbDsKKwkJCWlmIChHLmJkZWJ1Z19tZXNzYWdlcykKKwkJCQlHLmxvZ2ZpbGVfZmQgPSB4Zm9wZW5fZm9yX3dyaXRlKCIvdG1wL2Zic3BsYXNoLmxvZyIpOworCQl9CisjZW5kaWYKKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7Cit9CisKKworaW50IGZic3BsYXNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmYnNwbGFzaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqZmJfZGV2aWNlLCAqY2ZnX2ZpbGVuYW1lLCAqZmlmb19maWxlbmFtZTsKKwlGSUxFICpmcCA9IGZwOyAvLyBmb3IgY29tcGlsZXIKKwljaGFyICpudW1fYnVmOworCXVuc2lnbmVkIG51bTsKKwlib29sIGJDdXJzb3JPZmY7CisKKwlJTklUX0coKTsKKworCS8vIHBhcnNlIGNvbW1hbmQgbGluZSBvcHRpb25zCisJZmJfZGV2aWNlID0gIi9kZXYvZmIwIjsKKwljZmdfZmlsZW5hbWUgPSBOVUxMOworCWZpZm9fZmlsZW5hbWUgPSBOVUxMOworCWJDdXJzb3JPZmYgPSAxICYgZ2V0b3B0MzIoYXJndiwgImNzOmQ6aTpmOiIsCisJCQkmRy5pbWFnZV9maWxlbmFtZSwgJmZiX2RldmljZSwgJmNmZ19maWxlbmFtZSwgJmZpZm9fZmlsZW5hbWUpOworCisJLy8gcGFyc2UgY29uZmlndXJhdGlvbiBmaWxlCisJaWYgKGNmZ19maWxlbmFtZSkKKwkJaW5pdChjZmdfZmlsZW5hbWUpOworCisJLy8gV2UgbXVzdCBoYXZlIC1zIElNRworCWlmICghRy5pbWFnZV9maWxlbmFtZSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJZmJfb3BlbihmYl9kZXZpY2UpOworCisJaWYgKGZpZm9fZmlsZW5hbWUgJiYgYkN1cnNvck9mZikgeworCQkvLyBoaWRlIGN1cnNvciAoQkVGT1JFIGFueSBmYiBvcHMpCisJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgIlwwMzNbPzI1bCIsIDYpOworCX0KKworCWZiX2RyYXdpbWFnZSgpOworCisJaWYgKCFmaWZvX2ZpbGVuYW1lKQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCisJZnAgPSB4Zm9wZW5fc3RkaW4oZmlmb19maWxlbmFtZSk7CisJaWYgKGZwICE9IHN0ZGluKSB7CisJCS8vIEZvciBuYW1lZCBwaXBlcywgd2Ugd2FudCB0byBzdXBwb3J0IHRoaXM6CisJCS8vICBta2ZpZm8gY21kX3BpcGUKKwkJLy8gIGZic3BsYXNoIC1mIGNtZF9waXBlIC4uLi4gJgorCQkvLyAgLi4uCisJCS8vICBlY2hvIDMzID5jbWRfcGlwZQorCQkvLyAgLi4uCisJCS8vICBlY2hvIDY2ID5jbWRfcGlwZQorCQkvLyBUaGlzIG1lYW5zIHRoYXQgd2UgZG9uJ3Qgd2FudCBmYnNwbGFzaCB0byBnZXQgRU9GCisJCS8vIHdoZW4gbGFzdCB3cml0ZXIgY2xvc2VzIGlucHV0IGVuZC4KKwkJLy8gVGhlIHNpbXBsZXN0IHdheSBpcyB0byBvcGVuIGZpZm8gZm9yIHdyaXRpbmcgdG9vCisJCS8vIGFuZCBiZWNvbWUgYW4gYWRkaXRpb25hbCB3cml0ZXIgOikKKwkJb3BlbihmaWZvX2ZpbGVuYW1lLCBPX1dST05MWSk7IC8vIGVycm9ycyBhcmUgaWdub3JlZAorCX0KKworCWZiX2RyYXdwcm9ncmVzc2JhcigwKTsKKwkvLyBCbG9jayBvbiByZWFkLCB3YWl0aW5nIGZvciBzb21lIGlucHV0LgorCS8vIFVzZSBvZiA8c3RkaW8uaD4gc3R5bGUgSS9PIGFsbG93cyB0byBjb3JyZWN0bHkKKwkvLyBoYW5kbGUgYSBjYXNlIHdoZW4gd2UgaGF2ZSBtYW55IGJ1ZmZlcmVkIGxpbmVzCisJLy8gYWxyZWFkeSBpbiB0aGUgcGlwZQorCXdoaWxlICgobnVtX2J1ZiA9IHhtYWxsb2NfZmdldGxpbmUoZnApKSAhPSBOVUxMKSB7CisJCWlmIChzdHJuY21wKG51bV9idWYsICJleGl0IiwgNCkgPT0gMCkgeworCQkJREVCVUdfTUVTU0FHRSgiZXhpdCIpOworCQkJYnJlYWs7CisJCX0KKwkJbnVtID0gYXRvaShudW1fYnVmKTsKKwkJaWYgKGlzZGlnaXQobnVtX2J1ZlswXSkgJiYgKG51bSA8PSAxMDApKSB7CisjaWYgREVCVUcKKwkJCURFQlVHX01FU1NBR0UoaXRvYShudW0pKTsKKyNlbmRpZgorCQkJZmJfZHJhd3Byb2dyZXNzYmFyKG51bSk7CisJCX0KKwkJZnJlZShudW1fYnVmKTsKKwl9CisKKwlpZiAoYkN1cnNvck9mZikgLy8gcmVzdG9yZSBjdXJzb3IKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAiXDAzM1s/MjVoIiwgNik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2Zic3BsYXNoLmNmZyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9mYnNwbGFzaC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjZjYwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9mYnNwbGFzaC5jZmcKQEAgLTAsMCArMSw5IEBACisjIHByb2dyZXNzIGJhciBwb3NpdGlvbgorQkFSX0xFRlQ9MTcwCitCQVJfVE9QPTMwMAorQkFSX1dJRFRIPTMwMAorQkFSX0hFSUdIVD0yMAorIyBwcm9ncmVzcyBiYXIgY29sb3IKK0JBUl9SPTgwCitCQVJfRz04MAorQkFSX0I9MTMwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZmxhc2hfZXJhc2VhbGwuYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9mbGFzaF9lcmFzZWFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OTgzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZmxhc2hfZXJhc2VhbGwuYwpAQCAtMCwwICsxLDIwNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBlcmFzZWFsbC5jIC0tIGVyYXNlIHRoZSB3aG9sZSBvZiBhIE1URCBkZXZpY2UKKyAqCisgKiBQb3J0ZWQgdG8gYnVzeWJveCBmcm9tIG10ZC11dGlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQXJjb20gQ29udHJvbCBTeXN0ZW0gTHRkCisgKgorICogUmVuYW1lZCB0byBmbGFzaF9lcmFzZWFsbC5jCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmxhc2hfZXJhc2VhbGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstanFdIE1URF9ERVZJQ0UiCisvL3VzYWdlOiNkZWZpbmUgZmxhc2hfZXJhc2VhbGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFcmFzZSBhbiBNVEQgZGV2aWNlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1qCUZvcm1hdCB0aGUgZGV2aWNlIGZvciBqZmZzMiIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJRG9uJ3QgZGlzcGxheSBwcm9ncmVzcyBtZXNzYWdlcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bXRkL210ZC11c2VyLmg+CisjaW5jbHVkZSA8bGludXgvamZmczIuaD4KKworI2RlZmluZSBPUFRJT05fSiAgKDEgPDwgMCkKKyNkZWZpbmUgT1BUSU9OX1EgICgxIDw8IDEpCisjZGVmaW5lIElTX05BTkQgICAoMSA8PCAyKQorI2RlZmluZSBCQlRFU1QgICAgKDEgPDwgMykKKworLyogbXRkL2pmZnMyLXVzZXIuaCB1c2VkIHRvIGhhdmUgdGhpcyBhdHJvY2l0eToKK2V4dGVybiBpbnQgdGFyZ2V0X2VuZGlhbjsKKworI2RlZmluZSB0MTYoeCkgKHsgX191MTYgX19iID0gKHgpOyAodGFyZ2V0X2VuZGlhbj09X19CWVRFX09SREVSKT9fX2I6YnN3YXBfMTYoX19iKTsgfSkKKyNkZWZpbmUgdDMyKHgpICh7IF9fdTMyIF9fYiA9ICh4KTsgKHRhcmdldF9lbmRpYW49PV9fQllURV9PUkRFUik/X19iOmJzd2FwXzMyKF9fYik7IH0pCisKKyNkZWZpbmUgY3B1X3RvX2plMTYoeCkgKChqaW50MTZfdCl7dDE2KHgpfSkKKyNkZWZpbmUgY3B1X3RvX2plMzIoeCkgKChqaW50MzJfdCl7dDMyKHgpfSkKKyNkZWZpbmUgY3B1X3RvX2plbW9kZSh4KSAoKGptb2RlX3Qpe3QzMih4KX0pCisKKyNkZWZpbmUgamUxNl90b19jcHUoeCkgKHQxNigoeCkudjE2KSkKKyNkZWZpbmUgamUzMl90b19jcHUoeCkgKHQzMigoeCkudjMyKSkKKyNkZWZpbmUgamVtb2RlX3RvX2NwdSh4KSAodDMyKCh4KS5tKSkKKworYnV0IG10ZC9qZmZzMi11c2VyLmggaXMgZ29uZSBub3cgKGF0IGxlYXN0IDIuNi4zMS42IGRvZXMgbm90IGhhdmUgaXQgYW55bW9yZSkKKyovCisKKy8qIFdlIGFsd2F5cyB1c2UgbmF0aXZlIGVuZGlhbm5lc3MgKi8KKyN1bmRlZiBjcHVfdG9famUxNgorI3VuZGVmIGNwdV90b19qZTMyCisjZGVmaW5lIGNwdV90b19qZTE2KHYpICgoamludDE2X3Qpeyh2KX0pCisjZGVmaW5lIGNwdV90b19qZTMyKHYpICgoamludDMyX3Qpeyh2KX0pCisKK3N0YXRpYyB2b2lkIHNob3dfcHJvZ3Jlc3MobXRkX2luZm9fdCAqbWVtaW5mbywgZXJhc2VfaW5mb190ICplcmFzZSkKK3sKKwlwcmludGYoIlxyRXJhc2luZyAldSBLaWJ5dGUgQCAleCAtICUydSUlIGNvbXBsZXRlLiIsCisJCSh1bnNpZ25lZCltZW1pbmZvLT5lcmFzZXNpemUgLyAxMDI0LAorCQllcmFzZS0+c3RhcnQsCisJCSh1bnNpZ25lZCkgKCh1bnNpZ25lZCBsb25nIGxvbmcpIGVyYXNlLT5zdGFydCAqIDEwMCAvIG1lbWluZm8tPnNpemUpCisJKTsKKwlmZmx1c2hfYWxsKCk7Cit9CisKK2ludCBmbGFzaF9lcmFzZWFsbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmxhc2hfZXJhc2VhbGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgY2xlYW5tYXJrZXI7CisJbXRkX2luZm9fdCBtZW1pbmZvOworCWludCBmZCwgY2xtcG9zLCBjbG1sZW47CisJZXJhc2VfaW5mb190IGVyYXNlOworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIGludCBmbGFnczsKKwljaGFyICptdGRfbmFtZTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsKKwlmbGFncyA9IEJCVEVTVCB8IGdldG9wdDMyKGFyZ3YsICJqcSIpOworCisJbXRkX25hbWUgPSBhcmd2W29wdGluZF07CisJZmQgPSB4b3BlbihtdGRfbmFtZSwgT19SRFdSKTsKKwlmc3RhdChmZCwgJnN0KTsKKwlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm90IGEgY2hhciBkZXZpY2UiLCBtdGRfbmFtZSk7CisKKwl4aW9jdGwoZmQsIE1FTUdFVElORk8sICZtZW1pbmZvKTsKKwllcmFzZS5sZW5ndGggPSBtZW1pbmZvLmVyYXNlc2l6ZTsKKwlpZiAobWVtaW5mby50eXBlID09IE1URF9OQU5ERkxBU0gpCisJCWZsYWdzIHw9IElTX05BTkQ7CisKKwljbG1wb3MgPSAwOworCWNsbWxlbiA9IDg7CisJaWYgKGZsYWdzICYgT1BUSU9OX0opIHsKKwkJdWludDMyX3QgKmNyYzMyX3RhYmxlOworCisJCWNyYzMyX3RhYmxlID0gY3JjMzJfZmlsbHRhYmxlKE5VTEwsIDApOworCisJCWNsZWFubWFya2VyLm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJCWNsZWFubWFya2VyLm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfQ0xFQU5NQVJLRVIpOworCQlpZiAoIShmbGFncyAmIElTX05BTkQpKQorCQkJY2xlYW5tYXJrZXIudG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgbmFuZF9vb2JpbmZvIG9vYmluZm87CisKKwkJCXhpb2N0bChmZCwgTUVNR0VUT09CU0VMLCAmb29iaW5mbyk7CisKKwkJCS8qIENoZWNrIGZvciBhdXRvcGxhY2VtZW50ICovCisJCQlpZiAob29iaW5mby51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMQUNFKSB7CisJCQkJLyogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZnJlZSBieXRlcyAqLworCQkJCWNsbXBvcyA9IG9vYmluZm8ub29iZnJlZVswXVswXTsKKwkJCQljbG1sZW4gPSBvb2JpbmZvLm9vYmZyZWVbMF1bMV07CisJCQkJaWYgKGNsbWxlbiA+IDgpCisJCQkJCWNsbWxlbiA9IDg7CisJCQkJaWYgKGNsbWxlbiA9PSAwKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYXV0b3BsYWNlbWVudCBzZWxlY3RlZCBhbmQgbm8gZW1wdHkgc3BhY2UgaW4gb29iIik7CisJCQl9IGVsc2UgeworCQkJCS8qIExlZ2FjeSBtb2RlICovCisJCQkJc3dpdGNoIChtZW1pbmZvLm9vYnNpemUpIHsKKwkJCQljYXNlIDg6CisJCQkJCWNsbXBvcyA9IDY7CisJCQkJCWNsbWxlbiA9IDI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTY6CisJCQkJCWNsbXBvcyA9IDg7CisJCQkJCS8qY2xtbGVuID0gODsqLworCQkJCQlicmVhazsKKwkJCQljYXNlIDY0OgorCQkJCQljbG1wb3MgPSAxNjsKKwkJCQkJLypjbG1sZW4gPSA4OyovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWNsZWFubWFya2VyLnRvdGxlbiA9IGNwdV90b19qZTMyKDgpOworCQl9CisKKwkJY2xlYW5tYXJrZXIuaGRyX2NyYyA9IGNwdV90b19qZTMyKAorCQkJY3JjMzJfYmxvY2tfZW5kaWFuMCgwLCAmY2xlYW5tYXJrZXIsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSAtIDQsIGNyYzMyX3RhYmxlKQorCQkpOworCX0KKworCS8qIERvbid0IHdhbnQgdG8gZGVzdHJveSBwcm9ncmVzcyBpbmRpY2F0b3IgYnkgYmJfZXJyb3JfbXNnJ3MgKi8KKwlhcHBsZXRfbmFtZSA9IHhhc3ByaW50ZigiXG4lczogJXMiLCBhcHBsZXRfbmFtZSwgbXRkX25hbWUpOworCisJZm9yIChlcmFzZS5zdGFydCA9IDA7IGVyYXNlLnN0YXJ0IDwgbWVtaW5mby5zaXplOworCSAgICAgZXJhc2Uuc3RhcnQgKz0gbWVtaW5mby5lcmFzZXNpemUpIHsKKwkJaWYgKGZsYWdzICYgQkJURVNUKSB7CisJCQlpbnQgcmV0OworCQkJbG9mZl90IG9mZnNldCA9IGVyYXNlLnN0YXJ0OworCisJCQlyZXQgPSBpb2N0bChmZCwgTUVNR0VUQkFEQkxPQ0ssICZvZmZzZXQpOworCQkJaWYgKHJldCA+IDApIHsKKwkJCQlpZiAoIShmbGFncyAmIE9QVElPTl9RKSkKKwkJCQkJYmJfaW5mb19tc2coIlxuU2tpcHBpbmcgYmFkIGJsb2NrIGF0IDB4JTA4eCIsIGVyYXNlLnN0YXJ0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJLyogQmxhY2sgYmxvY2sgdGFibGUgaXMgbm90IGF2YWlsYWJsZSBvbiBjZXJ0YWluIGZsYXNoCisJCQkJICogdHlwZXMgZS5nLiBOT1IKKwkJCQkgKi8KKwkJCQlpZiAoZXJybm8gPT0gRU9QTk9UU1VQUCkgeworCQkJCQlmbGFncyAmPSB+QkJURVNUOworCQkJCQlpZiAoZmxhZ3MgJiBJU19OQU5EKQorCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBibG9jayBjaGVjayBub3QgYXZhaWxhYmxlIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJNRU1HRVRCQURCTE9DSyBlcnJvciIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghKGZsYWdzICYgT1BUSU9OX1EpKQorCQkJc2hvd19wcm9ncmVzcygmbWVtaW5mbywgJmVyYXNlKTsKKworCQl4aW9jdGwoZmQsIE1FTUVSQVNFLCAmZXJhc2UpOworCisJCS8qIGZvcm1hdCBmb3IgSkZGUzIgPyAqLworCQlpZiAoIShmbGFncyAmIE9QVElPTl9KKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHdyaXRlIGNsZWFubWFya2VyICovCisJCWlmIChmbGFncyAmIElTX05BTkQpIHsKKwkJCXN0cnVjdCBtdGRfb29iX2J1ZiBvb2I7CisKKwkJCW9vYi5wdHIgPSAodW5zaWduZWQgY2hhciAqKSAmY2xlYW5tYXJrZXI7CisJCQlvb2Iuc3RhcnQgPSBlcmFzZS5zdGFydCArIGNsbXBvczsKKwkJCW9vYi5sZW5ndGggPSBjbG1sZW47CisJCQl4aW9jdGwoZmQsIE1FTVdSSVRFT09CLCAmb29iKTsKKwkJfSBlbHNlIHsKKwkJCXhsc2VlayhmZCwgZXJhc2Uuc3RhcnQsIFNFRUtfU0VUKTsKKwkJCS8qIGlmIChsc2VlayhmZCwgZXJhc2Uuc3RhcnQsIFNFRUtfU0VUKSA8IDApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJNVEQgJXMgZmFpbHVyZSIsICJzZWVrIik7CisJCQkJY29udGludWU7CisJCQl9ICovCisJCQl4d3JpdGUoZmQsICZjbGVhbm1hcmtlciwgc2l6ZW9mKGNsZWFubWFya2VyKSk7CisJCQkvKiBpZiAod3JpdGUoZmQsICZjbGVhbm1hcmtlciwgc2l6ZW9mKGNsZWFubWFya2VyKSkgIT0gc2l6ZW9mKGNsZWFubWFya2VyKSkgeworCQkJCWJiX3BlcnJvcl9tc2coIk1URCAlcyBmYWlsdXJlIiwgIndyaXRlIik7CisJCQkJY29udGludWU7CisJCQl9ICovCisJCX0KKwkJaWYgKCEoZmxhZ3MgJiBPUFRJT05fUSkpCisJCQlwcmludGYoIiBDbGVhbm1hcmtlciB3cml0dGVuIGF0ICV4LiIsIGVyYXNlLnN0YXJ0KTsKKwl9CisJaWYgKCEoZmxhZ3MgJiBPUFRJT05fUSkpIHsKKwkJc2hvd19wcm9ncmVzcygmbWVtaW5mbywgJmVyYXNlKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZkKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2ZsYXNoX2xvY2tfdW5sb2NrLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZmxhc2hfbG9ja191bmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmVmZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2ZsYXNoX2xvY2tfdW5sb2NrLmMKQEAgLTAsMCArMSw4MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBQb3J0ZWQgdG8gYnVzeWJveCBmcm9tIG10ZC11dGlscy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmbGFzaF9sb2NrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJNVERfREVWSUNFIE9GRlNFVCBTRUNUT1JTIgorLy91c2FnZTojZGVmaW5lIGZsYXNoX2xvY2tfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMb2NrIHBhcnQgb3IgYWxsIG9mIGFuIE1URCBkZXZpY2UuIElmIFNFQ1RPUlMgaXMgLTEsIHRoZW4gYWxsIHNlY3RvcnNcbiIKKy8vdXNhZ2U6ICAgICAgICJ3aWxsIGJlIGxvY2tlZCwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgT0ZGU0VUIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmbGFzaF91bmxvY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIk1URF9ERVZJQ0UiCisvL3VzYWdlOiNkZWZpbmUgZmxhc2hfdW5sb2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVW5sb2NrIGFuIE1URCBkZXZpY2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG10ZC9tdGQtdXNlci5oPgorCitpbnQgZmxhc2hfbG9ja191bmxvY2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZsYXNoX2xvY2tfdW5sb2NrX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwkvKiBub3RlOiBmaWVsZHMgaW4gdGhlc2Ugc3RydWN0cyBhcmUgMzItYml0cy4KKwkgKiBhcHBhcmVudGx5IHdlIGNhbid0IHdpbiBhbnl0aGluZyBieSB1c2luZyBvZmZfdAorCSAqIG9yIGxvbmcgbG9uZydzIGZvciBvZmZzZXQgYW5kL29yIHNlY3RvcnMgdmFycy4gKi8KKwlzdHJ1Y3QgbXRkX2luZm9fdXNlciBpbmZvOworCXN0cnVjdCBlcmFzZV9pbmZvX3VzZXIgbG9jazsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlsb25nIHNlY3RvcnM7CisJaW50IGZkOworCisjZGVmaW5lIGRvX2xvY2sgKEVOQUJMRV9GTEFTSF9MT0NLICYmICghRU5BQkxFX0ZMQVNIX1VOTE9DSyB8fCAoYXBwbGV0X25hbWVbNl0gPT0gJ2wnKSkpCisKKwlpZiAoIWFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIHBhcnNlIG9mZnNldCBhbmQgbnVtYmVyIG9mIHNlY3RvcnMgdG8gbG9jayAqLworCW9mZnNldCA9IDA7CisJc2VjdG9ycyA9IC0xOworCWlmIChkb19sb2NrKSB7CisJCWlmICghYXJndlsyXSB8fCAhYXJndlszXSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJb2Zmc2V0ID0geHN0cnRvdWwoYXJndlsyXSwgMCk7CisJCXNlY3RvcnMgPSB4c3RydG9sKGFyZ3ZbM10sIDApOworCX0KKworCWZkID0geG9wZW4oYXJndlsxXSwgT19SRFdSKTsKKworCXhpb2N0bChmZCwgTUVNR0VUSU5GTywgJmluZm8pOworCisJbG9jay5zdGFydCA9IDA7CisJbG9jay5sZW5ndGggPSBpbmZvLnNpemU7CisJaWYgKGRvX2xvY2spIHsKKwkJdW5zaWduZWQgbG9uZyBzaXplID0gaW5mby5zaXplIC0gaW5mby5lcmFzZXNpemU7CisJCWlmIChvZmZzZXQgPiBzaXplKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJWx4IGlzIGJleW9uZCBkZXZpY2Ugc2l6ZSAlbHhcbiIsCisJCQkJCW9mZnNldCwgc2l6ZSk7CisJCX0KKworCQlpZiAoc2VjdG9ycyA9PSAtMSkgeworCQkJc2VjdG9ycyA9IGluZm8uc2l6ZSAvIGluZm8uZXJhc2VzaXplOworCQl9IGVsc2UgeworLy8gaXNuJ3QgdGhpcyB1c2VsZXNzPworCQkJdW5zaWduZWQgbG9uZyBudW0gPSBpbmZvLnNpemUgLyBpbmZvLmVyYXNlc2l6ZTsKKwkJCWlmIChzZWN0b3JzID4gbnVtKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVsZCBhcmUgdG9vIG1hbnkgIgorCQkJCQkJInNlY3RvcnMsIGRldmljZSBvbmx5IGhhcyAiCisJCQkJCQkiJWxkXG4iLCBzZWN0b3JzLCBudW0pOworCQkJfQorCQl9CisKKwkJbG9jay5zdGFydCA9IG9mZnNldDsKKwkJbG9jay5sZW5ndGggPSBzZWN0b3JzICogaW5mby5lcmFzZXNpemU7CisJCXhpb2N0bChmZCwgTUVNTE9DSywgJmxvY2spOworCX0gZWxzZSB7CisJCXhpb2N0bChmZCwgTUVNVU5MT0NLLCAmbG9jayk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9mbGFzaGNwLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZmxhc2hjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGY5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvZmxhc2hjcC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBidXN5Ym94IHJlaW1wbGVtZW50YXRpb24gb2YgZmxhc2hjcAorICoKKyAqIChDKSAyMDA5IFN0ZWZhbiBTZXlmcmllZCA8c2VpZmVAc3BoYWlyb24uY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZsYXNoY3BfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi12IEZJTEUgTVREX0RFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBmbGFzaGNwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29weSBhbiBpbWFnZSB0byBNVEQgZGV2aWNlXG4iCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG10ZC9tdGQtdXNlci5oPgorCisjZGVmaW5lIE1URF9ERUJVRyAwCisKKyNkZWZpbmUgT1BUX3YgKDEgPDwgMCkKKworI2RlZmluZSBCVUZTSVpFICg4ICogMTAyNCkKKworc3RhdGljIHZvaWQgcHJvZ3Jlc3MoaW50IG1vZGUsIHVvZmZfdCBjb3VudCwgdW9mZl90IHRvdGFsKQoreworCXVvZmZfdCBwZXJjZW50OworCisJaWYgKCFvcHRpb25fbWFzazMyKSAvL2lmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfdikpCisJCXJldHVybjsKKwlwZXJjZW50ID0gY291bnQgKiAxMDA7CisJaWYgKHRvdGFsKQorCQlwZXJjZW50ID0gKHVuc2lnbmVkKSAocGVyY2VudCAvIHRvdGFsKTsKKwlwcmludGYoIlxyJXM6ICUiT0ZGX0ZNVCJ1LyUiT0ZGX0ZNVCJ1ICgldSUlKSAiLAorCQkobW9kZSA9PSAwKSA/ICJFcmFzaW5nIGJsb2NrIiA6ICgobW9kZSA9PSAxKSA/ICJXcml0aW5nIGtiIiA6ICJWZXJpZnlpbmcga2IiKSwKKwkJY291bnQsIHRvdGFsLCAodW5zaWduZWQpcGVyY2VudCk7CisJZmZsdXNoX2FsbCgpOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmVzc19uZXdsaW5lKHZvaWQpCit7CisJaWYgKCFvcHRpb25fbWFzazMyKSAvL2lmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfdikpCisJCXJldHVybjsKKwliYl9wdXRjaGFyKCdcbicpOworfQorCitpbnQgZmxhc2hjcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmxhc2hjcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkX2YsIGZkX2Q7IC8qIGlucHV0IGZpbGUgYW5kIG10ZCBkZXZpY2UgZmlsZSBkZXNjcmlwdG9ycyAqLworCWludCBpOworCXVvZmZfdCBlcmFzZV9jb3VudDsKKwl1bnNpZ25lZCBvcHRzOworCXN0cnVjdCBtdGRfaW5mb191c2VyIG10ZDsKKwlzdHJ1Y3QgZXJhc2VfaW5mb191c2VyIGU7CisJc3RydWN0IHN0YXQgc3RhdGI7CisvLwljb25zdCBjaGFyICpmaWxlbmFtZSwgKmRldmljZW5hbWU7CisJUkVTRVJWRV9DT05GSUdfVUJVRkZFUihidWYsIEJVRlNJWkUpOworCVJFU0VSVkVfQ09ORklHX1VCVUZGRVIoYnVmMiwgQlVGU0laRSk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MiI7IC8qIGV4YWN0bHkgMiBub24tb3B0aW9uIGFyZ3M6IGZpbGUsIGRldiAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAidiIpOworCWFyZ3YgKz0gb3B0aW5kOworLy8JZmlsZW5hbWUgPSAqYXJndisrOworLy8JZGV2aWNlbmFtZSA9ICphcmd2OworI2RlZmluZSBmaWxlbmFtZSBhcmd2WzBdCisjZGVmaW5lIGRldmljZW5hbWUgYXJndlsxXQorCisJLyogb3BlbiBpbnB1dCBmaWxlIGFuZCBtdGQgZGV2aWNlIGFuZCBkbyBzYW5pdHkgY2hlY2tzICovCisJZmRfZiA9IHhvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJZnN0YXQoZmRfZiwgJnN0YXRiKTsKKwlmZF9kID0geG9wZW4oZGV2aWNlbmFtZSwgT19TWU5DIHwgT19SRFdSKTsKKyNpZiAhTVREX0RFQlVHCisJaWYgKGlvY3RsKGZkX2QsIE1FTUdFVElORk8sICZtdGQpIDwgMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgbm90IGEgTVREIGZsYXNoIGRldmljZSIsIGRldmljZW5hbWUpOworCX0KKwlpZiAoc3RhdGIuc3Rfc2l6ZSA+IG10ZC5zaXplKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBiaWdnZXIgdGhhbiAlcyIsIGZpbGVuYW1lLCBkZXZpY2VuYW1lKTsKKwl9CisjZWxzZQorCW10ZC5lcmFzZXNpemUgPSA2NCAqIDEwMjQ7CisjZW5kaWYKKworCS8qIGFsd2F5cyBlcmFzZSBhIGNvbXBsZXRlIGJsb2NrICovCisJZXJhc2VfY291bnQgPSAodW9mZl90KShzdGF0Yi5zdF9zaXplICsgbXRkLmVyYXNlc2l6ZSAtIDEpIC8gbXRkLmVyYXNlc2l6ZTsKKwkvKiBlcmFzZSAxIGJsb2NrIGF0IGEgdGltZSB0byBiZSBhYmxlIHRvIGdpdmUgdmVyYm9zZSBvdXRwdXQgKi8KKwllLmxlbmd0aCA9IG10ZC5lcmFzZXNpemU7CisjaWYgMAorLyogKDEpIGJsb2F0CisgKiAoMikgd2lsbCBpdCB3b3JrIGZvciBtdWx0aS1naWdhYnl0ZSBkZXZpY2VzPworICogKDMpIHdvcnNlIHdydCBlcnJvciBkZXRlY3Rpb24gZ3JhbnVsYXJpdHkKKyAqLworCS8qIG9wdGltaXphdGlvbjogaWYgbm90IHZlcmJvc2UsIGVyYXNlIGluIG9uZSBnbyAqLworCWlmICghb3B0cykgeyAvLyBpZiAoIShvcHRzICYgT1BUX3YpKQorCQllLmxlbmd0aCA9IG10ZC5lcmFzZXNpemUgKiBlcmFzZV9jb3VudDsKKwkJZXJhc2VfY291bnQgPSAxOworCX0KKyNlbmRpZgorCWUuc3RhcnQgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gZXJhc2VfY291bnQ7IGkrKykgeworCQlwcm9ncmVzcygwLCBpLCBlcmFzZV9jb3VudCk7CisJCWVycm5vID0gMDsKKyNpZiAhTVREX0RFQlVHCisJCWlmIChpb2N0bChmZF9kLCBNRU1FUkFTRSwgJmUpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcmFzZSBlcnJvciBhdCAweCVsbHggb24gJXMiLAorCQkJCShsb25nIGxvbmcpZS5zdGFydCwgZGV2aWNlbmFtZSk7CisJCX0KKyNlbHNlCisJCXVzbGVlcCgxMDAqMTAwMCk7CisjZW5kaWYKKwkJZS5zdGFydCArPSBtdGQuZXJhc2VzaXplOworCX0KKwlwcm9ncmVzc19uZXdsaW5lKCk7CisKKwkvKiBkb2luZyB0aGlzIG91dGVyIGxvb3AgZ2l2ZXMgc2lnbmlmaWNhbnRseSBzbWFsbGVyIGNvZGUKKwkgKiB0aGFuIGRvaW5nIHR3byBzZXBhcmF0ZSBsb29wcyBmb3Igd3JpdGluZyBhbmQgdmVyaWZ5aW5nICovCisJZm9yIChpID0gMTsgaSA8PSAyOyBpKyspIHsKKwkJdW9mZl90IGRvbmU7CisJCXVuc2lnbmVkIGNvdW50OworCisJCXhsc2VlayhmZF9mLCAwLCBTRUVLX1NFVCk7CisJCXhsc2VlayhmZF9kLCAwLCBTRUVLX1NFVCk7CisJCWRvbmUgPSAwOworCQljb3VudCA9IEJVRlNJWkU7CisJCXdoaWxlICgxKSB7CisJCQl1b2ZmX3QgcmVtID0gc3RhdGIuc3Rfc2l6ZSAtIGRvbmU7CisJCQlpZiAocmVtID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAocmVtIDwgQlVGU0laRSkKKwkJCQljb3VudCA9IHJlbTsKKwkJCXByb2dyZXNzKGksIGRvbmUgLyAxMDI0LCAodW9mZl90KXN0YXRiLnN0X3NpemUgLyAxMDI0KTsKKwkJCXhyZWFkKGZkX2YsIGJ1ZiwgY291bnQpOworCQkJaWYgKGkgPT0gMSkgeworCQkJCWludCByZXQ7CisJCQkJZXJybm8gPSAwOworCQkJCXJldCA9IGZ1bGxfd3JpdGUoZmRfZCwgYnVmLCBjb3VudCk7CisJCQkJaWYgKHJldCAhPSBjb3VudCkgeworCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIndyaXRlIGVycm9yIGF0IDB4JSJPRkZfRk1UInggb24gJXMsICIKKwkJCQkJCSJ3cml0ZSByZXR1cm5lZCAlZCIsCisJCQkJCQlkb25lLCBkZXZpY2VuYW1lLCByZXQpOworCQkJCX0KKwkJCX0gZWxzZSB7IC8qIGkgPT0gMiAqLworCQkJCXhyZWFkKGZkX2QsIGJ1ZjIsIGNvdW50KTsKKwkJCQlpZiAobWVtY21wKGJ1ZiwgYnVmMiwgY291bnQpKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ2ZXJpZmljYXRpb24gbWlzbWF0Y2ggYXQgMHglIk9GRl9GTVQieCIsIGRvbmUpOworCQkJCX0KKwkJCX0KKworCQkJZG9uZSArPSBjb3VudDsKKwkJfQorCisJCXByb2dyZXNzX25ld2xpbmUoKTsKKwl9CisJLyogd2Ugd29uJ3QgY29tZSBoZXJlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAqLworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9oZHBhcm0uYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9oZHBhcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzBlN2RlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2hkcGFybS5jCkBAIC0wLDAgKzEsMjEzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGRwYXJtIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSBbMjAwM10gYnkgW01hdHRlbyBDcm9jZV0gPDMyOTc2Mjc3OTlAd2luZC5pdD4KKyAqIEhhY2tlZCBieSBUaXRvIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4gZm9yIHNpemUgb3B0aW1pemF0aW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIHRoZSBzb3VyY2UgY29kZSBvZiBoZHBhcm06IHNlZSBiZWxvdy4uLgorICogaGRwYXJtLmMgLSBDb21tYW5kIGxpbmUgaW50ZXJmYWNlIHRvIGdldC9zZXQgaGFyZCBkaXNrIHBhcmFtZXRlcnMKKyAqICAgICAgICAgIC0gYnkgTWFyayBMb3JkIChDKSAxOTk0LTIwMDIgLS0gZnJlZWx5IGRpc3RyaWJ1dGFibGUKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaGRwYXJtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0RFVklDRV0iCisvL3VzYWdlOiNkZWZpbmUgaGRwYXJtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCUdldC9zZXQgZnMgcmVhZGFoZWFkIgorLy91c2FnZTogICAgICJcbgktQQlTZXQgZHJpdmUgcmVhZC1sb29rYWhlYWQgZmxhZyAoMC8xKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJR2V0L3NldCBidXMgc3RhdGUgKDAgPT0gb2ZmLCAxID09IG9uLCAyID09IHRyaXN0YXRlKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUIJU2V0IEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZyAoMS0yNTUpIgorLy91c2FnZTogICAgICJcbgktYwlHZXQvc2V0IElERSAzMi1iaXQgSU8gc2V0dGluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLUMJQ2hlY2sgSURFIHBvd2VyIG1vZGUgc3RhdHVzIgorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BKAorLy91c2FnZTogICAgICJcbgktZAlHZXQvc2V0IHVzaW5nX2RtYSBmbGFnIikKKy8vdXNhZ2U6ICAgICAiXG4JLUQJRW5hYmxlL2Rpc2FibGUgZHJpdmUgZGVmZWN0LW1nbXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZsdXNoIGJ1ZmZlciBjYWNoZSBmb3IgZGV2aWNlIG9uIGV4aXQiCisvL3VzYWdlOiAgICAgIlxuCS1nCURpc3BsYXkgZHJpdmUgZ2VvbWV0cnkiCisvL3VzYWdlOiAgICAgIlxuCS1oCURpc3BsYXkgdGVyc2UgdXNhZ2UgaW5mb3JtYXRpb24iCisvL3VzYWdlOglJRl9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkoCisvL3VzYWdlOiAgICAgIlxuCS1pCURpc3BsYXkgZHJpdmUgaWRlbnRpZmljYXRpb24iKQorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZKAorLy91c2FnZTogICAgICJcbgktSQlEZXRhaWxlZC9jdXJyZW50IGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gZHJpdmUiKQorLy91c2FnZTogICAgICJcbgktawlHZXQvc2V0IGtlZXBfc2V0dGluZ3Nfb3Zlcl9yZXNldCBmbGFnICgwLzEpIgorLy91c2FnZTogICAgICJcbgktSwlTZXQgZHJpdmUga2VlcF9mZWF0dXJlc19vdmVyX3Jlc2V0IGZsYWcgKDAvMSkiCisvL3VzYWdlOiAgICAgIlxuCS1MCVNldCBkcml2ZSBkb29ybG9jayAoMC8xKSAocmVtb3ZhYmxlIGhhcmRkaXNrcyBvbmx5KSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JR2V0L3NldCBtdWx0aXBsZSBzZWN0b3IgY291bnQiCisvL3VzYWdlOiAgICAgIlxuCS1uCUdldC9zZXQgaWdub3JlLXdyaXRlLWVycm9ycyBmbGFnICgwLzEpIgorLy91c2FnZTogICAgICJcbgktcAlTZXQgUElPIG1vZGUgb24gSURFIGludGVyZmFjZSBjaGlwc2V0ICgwLDEsMiwzLDQsLi4uKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJU2V0IGRyaXZlIHByZWZldGNoIGNvdW50IgorLyogLy91c2FnZTogICJcbgktcQlDaGFuZ2UgbmV4dCBzZXR0aW5nIHF1aWV0bHkiIC0gbm90IHN1cHBvcnRlZCBpYiBiYm94ICovCisvL3VzYWdlOiAgICAgIlxuCS1RCUdldC9zZXQgRE1BIHRhZ2dlZC1xdWV1aW5nIGRlcHRoIChpZiBzdXBwb3J0ZWQpIgorLy91c2FnZTogICAgICJcbgktcglHZXQvc2V0IHJlYWRvbmx5IGZsYWcgKERBTkdFUk9VUyB0byBzZXQpIgorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYoCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UgKERBTkdFUk9VUykiKQorLy91c2FnZTogICAgICJcbgktUwlTZXQgc3RhbmRieSAoc3BpbmRvd24pIHRpbWVvdXQiCisvL3VzYWdlOiAgICAgIlxuCS10CVBlcmZvcm0gZGV2aWNlIHJlYWQgdGltaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLVQJUGVyZm9ybSBjYWNoZSByZWFkIHRpbWluZ3MiCisvL3VzYWdlOiAgICAgIlxuCS11CUdldC9zZXQgdW5tYXNraXJxIGZsYWcgKDAvMSkiCisvL3VzYWdlOglJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRigKKy8vdXNhZ2U6ICAgICAiXG4JLVUJVW5yZWdpc3RlciBhbiBJREUgaW50ZXJmYWNlIChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLXYJRGVmYXVsdHM7IHNhbWUgYXMgLW1jdWRrcmFnIGZvciBJREUgZHJpdmVzIgorLy91c2FnZTogICAgICJcbgktVglEaXNwbGF5IHByb2dyYW0gdmVyc2lvbiBhbmQgZXhpdCBpbW1lZGlhdGVseSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQoCisvL3VzYWdlOiAgICAgIlxuCS13CVBlcmZvcm0gZGV2aWNlIHJlc2V0IChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLVcJU2V0IGRyaXZlIHdyaXRlLWNhY2hpbmcgZmxhZyAoMC8xKSAoREFOR0VST1VTKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRigKKy8vdXNhZ2U6ICAgICAiXG4JLXgJVHJpc3RhdGUgZGV2aWNlIGZvciBob3Rzd2FwICgwLzEpIChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLVgJU2V0IElERSB4ZmVyIG1vZGUgKERBTkdFUk9VUykiCisvL3VzYWdlOiAgICAgIlxuCS15CVB1dCBJREUgZHJpdmUgaW4gc3RhbmRieSBtb2RlIgorLy91c2FnZTogICAgICJcbgktWQlQdXQgSURFIGRyaXZlIHRvIHNsZWVwIgorLy91c2FnZTogICAgICJcbgktWglEaXNhYmxlIFNlYWdhdGUgYXV0by1wb3dlcnNhdmluZyBtb2RlIgorLy91c2FnZTogICAgICJcbgkteglSZXJlYWQgcGFydGl0aW9uIHRhYmxlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIG11c3QgYmUgX2FmdGVyXyBsaWJiYi5oOiAqLworI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaWYgIWRlZmluZWQoQkxLR0VUU0laRTY0KQorIyBkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQorI2VuZGlmCisKKy8qIGRldmljZSB0eXBlcyAqLworLyogLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE5PX0RFViAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBBVEFfREVWICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVRBUElfREVWICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qIHdvcmQgZGVmaW5pdGlvbnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgR0VOX0NPTkZJRwkJMCAgIC8qIGdlbmVyYWwgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMQ1lMUwkJCTEgICAvKiBudW1iZXIgb2YgbG9naWNhbCBjeWxpbmRlcnMgKi8KKyNkZWZpbmUgQ09ORklHCQkJMiAgIC8qIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTEhFQURTCQkJMyAgIC8qIG51bWJlciBvZiBsb2dpY2FsIGhlYWRzICovCisjZGVmaW5lIFRSQUNLX0JZVEVTCQk0ICAgLyogbnVtYmVyIG9mIGJ5dGVzL3RyYWNrIChBVEEtMSkgKi8KKyNkZWZpbmUgU0VDVF9CWVRFUwkJNSAgIC8qIG51bWJlciBvZiBieXRlcy9zZWN0b3IgKEFUQS0xKSAqLworI2RlZmluZSBMU0VDVFMJCQk2ICAgLyogbnVtYmVyIG9mIGxvZ2ljYWwgc2VjdG9ycy90cmFjayAqLworI2RlZmluZSBTVEFSVF9TRVJJQUwgICAgICAgICAgICAxMCAgLyogQVNDSUkgc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBMRU5HVEhfU0VSSUFMICAgICAgICAgICAxMCAgLyogMTAgd29yZHMgKDIwIGJ5dGVzIG9yIGNoYXJhY3RlcnMpICovCisjZGVmaW5lIEJVRl9UWVBFCQkyMCAgLyogYnVmZmVyIHR5cGUgKEFUQS0xKSAqLworI2RlZmluZSBCVUZGRVJfX1NJWkUJCTIxICAvKiBidWZmZXIgc2l6ZSAoQVRBLTEpICovCisjZGVmaW5lIFJXX0xPTkcJCQkyMiAgLyogZXh0cmEgYnl0ZXMgaW4gUi9XIExPTkcgY21kICggPCBBVEEtNCkqLworI2RlZmluZSBTVEFSVF9GV19SRVYgICAgICAgICAgICAyMyAgLyogQVNDSUkgZmlybXdhcmUgcmV2aXNpb24gKi8KKyNkZWZpbmUgTEVOR1RIX0ZXX1JFVgkJIDQgIC8qICA0IHdvcmRzICg4IGJ5dGVzIG9yIGNoYXJhY3RlcnMpICovCisjZGVmaW5lIFNUQVJUX01PREVMCQkyNyAgLyogQVNDSUkgbW9kZWwgbnVtYmVyICovCisjZGVmaW5lIExFTkdUSF9NT0RFTAkJMjAgIC8qIDIwIHdvcmRzICg0MCBieXRlcyBvciBjaGFyYWN0ZXJzKSAqLworI2RlZmluZSBTRUNUT1JfWEZFUl9NQVgJCTQ3ICAvKiByL3cgbXVsdGlwbGU6IG1heCBzZWN0b3JzIHhmZXJlZCAqLworI2RlZmluZSBEV09SRF9JTwkJNDggIC8qIGNhbiBkbyBkb3VibGUtd29yZCBJTyAoQVRBLTEgb25seSkgKi8KKyNkZWZpbmUgQ0FQQUJfMAkJCTQ5ICAvKiBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQ0FQQUJfMQkJCTUwCisjZGVmaW5lIFBJT19NT0RFCQk1MSAgLyogbWF4IFBJTyBtb2RlIHN1cHBvcnRlZCAob2Jzb2xldGUpKi8KKyNkZWZpbmUgRE1BX01PREUJCTUyICAvKiBtYXggU2luZ2xld29yZCBETUEgbW9kZSBzdXBwb3J0ZWQgKG9icykqLworI2RlZmluZSBXSEFUU19WQUxJRAkJNTMgIC8qIHdoYXQgZmllbGRzIGFyZSB2YWxpZCAqLworI2RlZmluZSBMQ1lMU19DVVIJCTU0ICAvKiBjdXJyZW50IGxvZ2ljYWwgY3lsaW5kZXJzICovCisjZGVmaW5lIExIRUFEU19DVVIJCTU1ICAvKiBjdXJyZW50IGxvZ2ljYWwgaGVhZHMgKi8KKyNkZWZpbmUgTFNFQ1RTX0NVUgkJNTYgIC8qIGN1cnJlbnQgbG9naWNhbCBzZWN0b3JzL3RyYWNrICovCisjZGVmaW5lIENBUEFDSVRZX0xTQgkJNTcgIC8qIGN1cnJlbnQgY2FwYWNpdHkgaW4gc2VjdG9ycyAqLworI2RlZmluZSBDQVBBQ0lUWV9NU0IJCTU4CisjZGVmaW5lIFNFQ1RPUl9YRkVSX0NVUgkJNTkgIC8qIHIvdyBtdWx0aXBsZTogY3VycmVudCBzZWN0b3JzIHhmZXJlZCAqLworI2RlZmluZSBMQkFfU0VDVFNfTFNCCQk2MCAgLyogTEJBOiB0b3RhbCBudW1iZXIgb2YgdXNlciAqLworI2RlZmluZSBMQkFfU0VDVFNfTVNCCQk2MSAgLyogICAgICBhZGRyZXNzYWJsZSBzZWN0b3JzICovCisjZGVmaW5lIFNJTkdMRV9ETUEJCTYyICAvKiBzaW5nbGV3b3JkIERNQSBtb2RlcyAqLworI2RlZmluZSBNVUxUSV9ETUEJCTYzICAvKiBtdWx0aXdvcmQgRE1BIG1vZGVzICovCisjZGVmaW5lIEFEVl9QSU9fTU9ERVMJCTY0ICAvKiBhZHZhbmNlZCBQSU8gbW9kZXMgc3VwcG9ydGVkICovCisJCQkJICAgIC8qIG11bHRpd29yZCBETUEgeGZlciBjeWNsZSB0aW1lOiAqLworI2RlZmluZSBETUFfVElNRV9NSU4JCTY1ICAvKiAgIC0gbWluaW11bSAqLworI2RlZmluZSBETUFfVElNRV9OT1JNCQk2NiAgLyogICAtIG1hbnVmYWN0dXJlcidzIHJlY29tbWVuZGVkICovCisJCQkJICAgIC8qIG1pbmltdW0gUElPIHhmZXIgY3ljbGUgdGltZTogKi8KKyNkZWZpbmUgUElPX05PX0ZMT1cJCTY3ICAvKiAgIC0gd2l0aG91dCBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgUElPX0ZMT1cJCTY4ICAvKiAgIC0gd2l0aCBJT1JEWSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEtUX1JFTAkJCTcxICAvKiB0eXBpY2FsICNucyBmcm9tIFBLVCBjbWQgdG8gYnVzIHJlbCAqLworI2RlZmluZSBTVkNfTkJTWQkJNzIgIC8qIHR5cGljYWwgI25zIGZyb20gU0VSVklDRSBjbWQgdG8gIUJTWSAqLworI2RlZmluZSBDRFJfTUFKT1IJCTczICAvKiBDRCBST006IG1ham9yIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIENEUl9NSU5PUgkJNzQgIC8qIENEIFJPTTogbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgUVVFVUVfREVQVEgJCTc1ICAvKiBxdWV1ZSBkZXB0aCAqLworI2RlZmluZSBNQUpPUgkJCTgwICAvKiBtYWpvciB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBNSU5PUgkJCTgxICAvKiBtaW5vciB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBDTURTX1NVUFBfMAkJODIgIC8qIGNvbW1hbmQvZmVhdHVyZSBzZXQocykgc3VwcG9ydGVkICovCisjZGVmaW5lIENNRFNfU1VQUF8xCQk4MworI2RlZmluZSBDTURTX1NVUFBfMgkJODQKKyNkZWZpbmUgQ01EU19FTl8wCQk4NSAgLyogY29tbWFuZC9mZWF0dXJlIHNldChzKSBlbmFibGVkICovCisjZGVmaW5lIENNRFNfRU5fMQkJODYKKyNkZWZpbmUgQ01EU19FTl8yCQk4NworI2RlZmluZSBVTFRSQV9ETUEJCTg4ICAvKiB1bHRyYSBETUEgbW9kZXMgKi8KKwkJCQkgICAgLyogdGltZSB0byBjb21wbGV0ZSBzZWN1cml0eSBlcmFzZSAqLworI2RlZmluZSBFUkFTRV9USU1FCQk4OSAgLyogICAtIG9yZGluYXJ5ICovCisjZGVmaW5lIEVOSF9FUkFTRV9USU1FCQk5MCAgLyogICAtIGVuaGFuY2VkICovCisjZGVmaW5lIEFEVl9QV1IJCQk5MSAgLyogY3VycmVudCBhZHZhbmNlZCBwb3dlciBtYW5hZ2VtZW50IGxldmVsCisJCQkJICAgICAgIGluIGxvdyBieXRlLCAweDQwIGluIGhpZ2ggYnl0ZS4gKi8KKyNkZWZpbmUgUFNXRF9DT0RFCQk5MiAgLyogbWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uIGNvZGUgKi8KKyNkZWZpbmUgSFdSU1RfUlNMVAkJOTMgIC8qIGhhcmR3YXJlIHJlc2V0IHJlc3VsdCAqLworI2RlZmluZSBBQ09VU1RJQwkJOTQgIC8qIGFjb3VzdGljIG1nbXQgdmFsdWVzICggPj0gQVRBLTYpICovCisjZGVmaW5lIExCQV9MU0IJCQkxMDAgLyogTEJBOiBtYXhpbXVtLiAgQ3VycmVudGx5IG9ubHkgNDggKi8KKyNkZWZpbmUgTEJBX01JRAkJCTEwMSAvKiAgICAgIGJpdHMgYXJlIHVzZWQsIGJ1dCBhZGRyIDEwMyAqLworI2RlZmluZSBMQkFfNDhfTVNCCQkxMDIgLyogICAgICBoYXMgYmVlbiByZXNlcnZlZCBmb3IgTEJBIGluICovCisjZGVmaW5lIExCQV82NF9NU0IJCTEwMyAvKiAgICAgIHRoZSBmdXR1cmUuICovCisjZGVmaW5lIFJNX1NUQVQJCQkxMjcgLyogcmVtb3ZhYmxlIG1lZGlhIHN0YXR1cyBub3RpZmljYXRpb24gZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBTRUNVX1NUQVRVUwkJMTI4IC8qIHNlY3VyaXR5IHN0YXR1cyAqLworI2RlZmluZSBDRkFfUFdSX01PREUJCTE2MCAvKiBDRkEgcG93ZXIgbW9kZSAxICovCisjZGVmaW5lIFNUQVJUX01FRElBICAgICAgICAgICAgIDE3NiAvKiBtZWRpYSBzZXJpYWwgbnVtYmVyICovCisjZGVmaW5lIExFTkdUSF9NRURJQSAgICAgICAgICAgIDIwICAvKiAyMCB3b3JkcyAoNDAgYnl0ZXMgb3IgY2hhcmFjdGVycykqLworI2RlZmluZSBTVEFSVF9NQU5VRiAgICAgICAgICAgICAxOTYgLyogbWVkaWEgbWFudWZhY3R1cmVyIEkuRC4gKi8KKyNkZWZpbmUgTEVOR1RIX01BTlVGICAgICAgICAgICAgMTAgIC8qIDEwIHdvcmRzICgyMCBieXRlcyBvciBjaGFyYWN0ZXJzKSAqLworI2RlZmluZSBJTlRFR1JJVFkJCTI1NSAvKiBpbnRlZ3JpdHkgd29yZCAqLworCisvKiBiaXQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSB3b3JkcyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbWFueSB3b3JkcyBhcmUgY29uc2lkZXJlZCB2YWxpZCBpZiBiaXQgMTUgaXMgMCBhbmQgYml0IDE0IGlzIDEgKi8KKyNkZWZpbmUgVkFMSUQJCQkweGMwMDAKKyNkZWZpbmUgVkFMSURfVkFMCQkweDQwMDAKKy8qIG1hbnkgd29yZHMgYXJlIGNvbnNpZGVyZWQgaW52YWxpZCBpZiB0aGV5IGFyZSBlaXRoZXIgYWxsLTAgb3IgYWxsLTEgKi8KKyNkZWZpbmUgTk9WQUxfMAkJCTB4MDAwMAorI2RlZmluZSBOT1ZBTF8xCQkJMHhmZmZmCisKKy8qIHdvcmQgMDogZ2VuX2NvbmZpZyAqLworI2RlZmluZSBOT1RfQVRBCQkJMHg4MDAwCisjZGVmaW5lIE5PVF9BVEFQSQkJMHg0MDAwCS8qIChjaGVjayBvbmx5IGlmIGJpdCAxNSA9PSAxKSAqLworI2RlZmluZSBNRURJQV9SRU1PVkFCTEUJCTB4MDA4MAorI2RlZmluZSBEUklWRV9OT1RfUkVNT1ZBQkxFCTB4MDA0MCAgLyogYml0IG9ic29sZXRlZCBpbiBBVEEgNiAqLworI2RlZmluZSBJTkNPTVBMRVRFCQkweDAwMDQKKyNkZWZpbmUgQ0ZBX1NVUFBPUlRfVkFMCQkweDg0OGEJLyogODQ4YT1DRkEgZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBEUlFfUkVTUE9OU0VfVElNRQkweDAwNjAKKyNkZWZpbmUgRFJRXzNNU19WQUwJCTB4MDAwMAorI2RlZmluZSBEUlFfSU5UUl9WQUwJCTB4MDAyMAorI2RlZmluZSBEUlFfNTBVU19WQUwJCTB4MDA0MAorI2RlZmluZSBQS1RfU0laRV9TVVBQT1JURUQJMHgwMDAzCisjZGVmaW5lIFBLVF9TSVpFXzEyX1ZBTAkJMHgwMDAwCisjZGVmaW5lIFBLVF9TSVpFXzE2X1ZBTAkJMHgwMDAxCisjZGVmaW5lIEVRUFRfVFlQRQkJMHgxZjAwCisjZGVmaW5lIFNISUZUX0VRUFQJCTgKKworI2RlZmluZSBDRFJPTSAweDAwMDUKKworLyogd29yZCAxOiBudW1iZXIgb2YgbG9naWNhbCBjeWxpbmRlcnMgKi8KKyNkZWZpbmUgTENZTFNfTUFYCQkweDNmZmYgLyogbWF4aW11bSBhbGxvd2FibGUgdmFsdWUgKi8KKworLyogd29yZCAyOiBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKiAoYSkgcmVxdWlyZSBTRVQgRkVBVFVSRVMgdG8gc3Bpbi11cAorICogKGIpIHJlcXVpcmUgc3Bpbi11cCB0byBmdWxseSByZXBseSB0byBJREVOVElGWSBERVZJQ0UKKyAqLworI2RlZmluZSBTVEJZX05JRF9WQUwJCTB4MzdjOCAgLyogICAgIChhKSBhbmQgICAgIChiKSAqLworI2RlZmluZSBTVEJZX0lEX1ZBTAkJMHg3MzhjCS8qICAgICAoYSkgYW5kIG5vdCAoYikgKi8KKyNkZWZpbmUgUFdSRF9OSURfVkFMCQkweDhjNzMJLyogbm90IChhKSBhbmQgICAgIChiKSAqLworI2RlZmluZSBQV1JEX0lEX1ZBTAkJMHhjODM3CS8qIG5vdCAoYSkgYW5kIG5vdCAoYikgKi8KKworLyogd29yZHMgNDcgJiA1OTogc2VjdG9yX3hmZXJfbWF4ICYgc2VjdG9yX3hmZXJfY3VyICovCisjZGVmaW5lIFNFQ1RPUl9YRkVSCQkweDAwZmYgIC8qIHNlY3RvcnMgeGZlcmVkIG9uIHIvdyBtdWx0aXBsZSBjbWRzKi8KKyNkZWZpbmUgTVVMVElQTEVfU0VUVElOR19WQUxJRCAgMHgwMTAwICAvKiAxPW11bHRpcGxlIHNlY3RvciBzZXR0aW5nIGlzIHZhbGlkICovCisKKy8qIHdvcmQgNDk6IGNhcGFiaWxpdGllcyAwICovCisjZGVmaW5lIFNURF9TVEJZCQkweDIwMDAgIC8qIDE9c3RhbmRhcmQgdmFsdWVzIHN1cHBvcnRlZCAoQVRBKTsgMD12ZW5kb3Igc3BlY2lmaWMgdmFsdWVzICovCisjZGVmaW5lIElPUkRZX1NVUAkJMHgwODAwICAvKiAxPXN1cHBvcnQ7IDA9bWF5IGJlIHN1cHBvcnRlZCAqLworI2RlZmluZSBJT1JEWV9PRkYJCTB4MDQwMCAgLyogMT1tYXkgYmUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTEJBX1NVUAkJCTB4MDIwMCAgLyogMT1Mb2dpY2FsIEJsb2NrIEFkZHJlc3Mgc3VwcG9ydCAqLworI2RlZmluZSBETUFfU1VQCQkJMHgwMTAwICAvKiAxPURpcmVjdCBNZW1vcnkgQWNjZXNzIHN1cHBvcnQgKi8KKyNkZWZpbmUgRE1BX0lMX1NVUAkJMHg4MDAwICAvKiAxPWludGVybGVhdmVkIERNQSBzdXBwb3J0IChBVEFQSSkgKi8KKyNkZWZpbmUgQ01EX1FfU1VQCQkweDQwMDAgIC8qIDE9Y29tbWFuZCBxdWV1aW5nIHN1cHBvcnQgKEFUQVBJKSAqLworI2RlZmluZSBPVkxQX1NVUAkJMHgyMDAwICAvKiAxPW92ZXJsYXAgb3BlcmF0aW9uIHN1cHBvcnQgKEFUQVBJKSAqLworI2RlZmluZSBTV1JTVF9SRVEJCTB4MTAwMCAgLyogMT1BVEEgU1cgcmVzZXQgcmVxdWlyZWQgKEFUQVBJLCBvYnNvbGV0ZSAqLworCisvKiB3b3JkIDUwOiBjYXBhYmlsaXRpZXMgMSAqLworI2RlZmluZSBNSU5fU1RBTkRCWV9USU1FUgkweDAwMDEgIC8qIDE9ZGV2aWNlIHNwZWNpZmljIHN0YW5kYnkgdGltZXIgdmFsdWUgbWluaW11bSAqLworCisvKiB3b3JkcyA1MSAmIDUyOiBQSU8gJiBETUEgY3ljbGUgdGltZXMgKi8KKyNkZWZpbmUgTU9ERQkJCTB4ZmYwMCAgLyogdGhlIG1vZGUgaXMgaW4gdGhlIE1TQnMgKi8KKworLyogd29yZCA1Mzogd2hhdHNfdmFsaWQgKi8KKyNkZWZpbmUgT0tfVzg4CQkJMHgwMDA0CS8qIHRoZSB1bHRyYV9kbWEgaW5mbyBpcyB2YWxpZCAqLworI2RlZmluZSBPS19XNjRfNzAJCTB4MDAwMiAgLyogc2VlIGFib3ZlIGZvciB3b3JkIGRlc2NyaXB0aW9ucyAqLworI2RlZmluZSBPS19XNTRfNTgJCTB4MDAwMSAgLyogY3VycmVudCBjeWwsIGhlYWQsIHNlY3RvciwgY2FwLiBpbmZvIHZhbGlkICovCisKKy8qd29yZCA2Myw4ODogZG1hX21vZGUsIHVsdHJhX2RtYV9tb2RlKi8KKyNkZWZpbmUgTU9ERV9NQVgJCTcJLyogYml0IGRlZmluaXRpb25zIGZvcmNlIHVkbWEgPD03ICh3aGVuCisJCQkJCSAqIHVkbWEgPj04IGNvbWVzIG91dCBpdCdsbCBoYXZlIHRvIGJlCisJCQkJCSAqIGRlZmluZWQgaW4gYSBuZXcgZG1hX21vZGUgd29yZCEpICovCisKKy8qIHdvcmQgNjQ6IFBJTyB0cmFuc2ZlciBtb2RlcyAqLworI2RlZmluZSBQSU9fU1VQCQkJMHgwMGZmICAvKiBvbmx5IGJpdHMgMCAmIDEgYXJlIHVzZWQgc28gZmFyLCAgKi8KKyNkZWZpbmUgUElPX01PREVfTUFYCQk4ICAgICAgIC8qIGJ1dCBhbGwgOCBiaXRzIGFyZSBkZWZpbmVkICAgICAgICAqLworCisvKiB3b3JkIDc1OiBxdWV1ZV9kZXB0aCAqLworI2RlZmluZSBERVBUSF9CSVRTCQkweDAwMWYgIC8qIGJpdHMgdXNlZCBmb3IgcXVldWUgZGVwdGggKi8KKworLyogd29yZHMgODAtODE6IHZlcnNpb24gbnVtYmVycyAqLworLyogTk9WQUxfMCBvciAgTk9WQUxfMSBtZWFucyBkZXZpY2UgZG9lcyBub3QgcmVwb3J0IHZlcnNpb24gKi8KKworLyogd29yZCA4MTogbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgTUlOT1JfTUFYCQkweDIyCisvKiB3b3JkcyA4Mi04NDogY21kcy9mZWF0cyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQ01EU19XODIJCTB4NzdmZiAgLyogd29yZCA4MjogZGVmaW5lZCBjb21tYW5kIGxvY2F0aW9ucyovCisjZGVmaW5lIENNRFNfVzgzCQkweDNmZmYgIC8qIHdvcmQgODM6IGRlZmluZWQgY29tbWFuZCBsb2NhdGlvbnMqLworI2RlZmluZSBDTURTX1c4NAkJMHgwMDJmICAvKiB3b3JkIDgzOiBkZWZpbmVkIGNvbW1hbmQgbG9jYXRpb25zKi8KKyNkZWZpbmUgU1VQUE9SVF80OF9CSVQJCTB4MDQwMAorI2RlZmluZSBOVU1fQ01EX0ZFQVRfU1RSCTQ4CisKKy8qIHdvcmRzIDg1LTg3OiBjbWRzL2ZlYXRzIGVuYWJsZWQgKi8KKy8qIHVzZSBjbWRfZmVhdF9zdHJbXSB0byBkaXNwbGF5IHdoYXQgY29tbWFuZHMgYW5kIGZlYXR1cmVzIGhhdmUKKyAqIGJlZW4gZW5hYmxlZCB3aXRoIHdvcmRzIDg1LTg3CisgKi8KKworLyogd29yZHMgODksIDkwLCBTRUNVIEVSQVNFIFRJTUUgKi8KKyNkZWZpbmUgRVJBU0VfQklUUyAgICAgIDB4MDBmZgorCisvKiB3b3JkIDkyOiBtYXN0ZXIgcGFzc3dvcmQgcmV2aXNpb24gKi8KKy8qIE5PVkFMXzAgb3IgIE5PVkFMXzEgbWVhbnMgbm8gc3VwcG9ydCBmb3IgbWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uICovCisKKy8qIHdvcmQgOTM6IGh3IHJlc2V0IHJlc3VsdCAqLworI2RlZmluZSBDQkxJRCAgICAgICAgICAgMHgyMDAwICAvKiBDQkxJRCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNUMCAgICAgICAgICAgIDB4MDAwMSAgLyogMT1yZXNldCB0byBkZXZpY2UgIzAgKi8KKyNkZWZpbmUgREVWX0RFVCAgICAgICAgIDB4MDAwNiAgLyogaG93IGRldmljZSBudW0gZGV0ZXJtaW5lZCAqLworI2RlZmluZSBKVU1QRVJfVkFMICAgICAgMHgwMDAyICAvKiBkZXZpY2UgbnVtIGRldGVybWluZWQgYnkganVtcGVyICovCisjZGVmaW5lIENTRUxfVkFMICAgICAgICAweDAwMDQgIC8qIGRldmljZSBudW0gZGV0ZXJtaW5lZCBieSBDU0VMX1ZBTCAqLworCisvKiB3b3JkIDEyNzogcmVtb3ZhYmxlIG1lZGlhIHN0YXR1cyBub3RpZmljYXRpb24gZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBSTV9TVEFUX0JJVFMgICAgMHgwMDAzCisjZGVmaW5lIFJNX1NUQVRfU1VQICAgICAweDAwMDEKKworLyogd29yZCAxMjg6IHNlY3VyaXR5ICovCisjZGVmaW5lIFNFQ1VfRU5BQkxFRCAgICAweDAwMDIKKyNkZWZpbmUgU0VDVV9MRVZFTCAgICAgIDB4MDAxMAorI2RlZmluZSBOVU1fU0VDVV9TVFIgICAgNgorCisvKiB3b3JkIDE2MDogQ0ZBIHBvd2VyIG1vZGUgKi8KKyNkZWZpbmUgVkFMSURfVzE2MCAgICAgICAgICAgICAgMHg4MDAwICAvKiAxPXdvcmQgdmFsaWQgKi8KKyNkZWZpbmUgUFdSX01PREVfUkVRICAgICAgICAgICAgMHgyMDAwICAvKiAxPUNGQSBwb3dlciBtb2RlIHJlcSdkIGJ5IHNvbWUgY21kcyovCisjZGVmaW5lIFBXUl9NT0RFX09GRiAgICAgICAgICAgIDB4MTAwMCAgLyogMT1DRkEgcG93ZXIgbW9kZWQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTUFYX0FNUFMgICAgICAgICAgICAgICAgMHgwZmZmICAvKiB2YWx1ZSA9IG1heCBjdXJyZW50IGluIG1hICovCisKKy8qIHdvcmQgMjU1OiBpbnRlZ3JpdHkgKi8KKyNkZWZpbmUgU0lHICAgICAgICAgICAgICAgICAgICAgMHgwMGZmICAvKiBzaWduYXR1cmUgbG9jYXRpb24gKi8KKyNkZWZpbmUgU0lHX1ZBTCAgICAgICAgICAgICAgICAgMHgwMGE1ICAvKiBzaWduYXR1cmUgdmFsdWUgKi8KKworI2RlZmluZSBUSU1JTkdfQlVGX01CICAgICAgICAgICAxCisjZGVmaW5lIFRJTUlOR19CVUZfQllURVMgICAgICAgIChUSU1JTkdfQlVGX01CICogMTAyNCAqIDEwMjQpCisKKyN1bmRlZiBET19GTFVTSENBQ0hFICAgICAgICAgICAgLyogdW5kZXIgY29uc3RydWN0aW9uOiBmb3JjZSBjYWNoZSBmbHVzaCBvbiAtVzAgKi8KKworCisjZGVmaW5lIElTX0dFVCAxCisjZGVmaW5lIElTX1NFVCAyCisKKworZW51bSB7IGZkID0gMyB9OworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzbWFsbGludCBnZXRfaWRlbnRpdHksIGdldF9nZW9tOworCXNtYWxsaW50IGRvX2ZsdXNoOworCXNtYWxsaW50IGRvX2N0aW1pbmdzLCBkb190aW1pbmdzOworCXNtYWxsaW50IHJlcmVhZF9wYXJ0bjsKKwlzbWFsbGludCBzZXRfcGlvbW9kZSwgbm9pc3lfcGlvbW9kZTsKKwlzbWFsbGludCBnZXRzZXRfcmVhZGFoZWFkOworCXNtYWxsaW50IGdldHNldF9yZWFkb25seTsKKwlzbWFsbGludCBnZXRzZXRfdW5tYXNrOworCXNtYWxsaW50IGdldHNldF9tdWx0OworI2lmZGVmIEhESU9fR0VUX1FETUEKKwlzbWFsbGludCBnZXRzZXRfZG1hX3E7CisjZW5kaWYKKwlzbWFsbGludCBnZXRzZXRfbm93ZXJyOworCXNtYWxsaW50IGdldHNldF9rZWVwOworCXNtYWxsaW50IGdldHNldF9pbzMyYml0OworCWludCBwaW9tb2RlOworCXVuc2lnbmVkIGxvbmcgWHJlYWRhaGVhZDsKKwl1bnNpZ25lZCBsb25nIHJlYWRvbmx5OworCXVuc2lnbmVkIGxvbmcgdW5tYXNrOworCXVuc2lnbmVkIGxvbmcgbXVsdDsKKyNpZmRlZiBIRElPX1NFVF9RRE1BCisJdW5zaWduZWQgbG9uZyBkbWFfcTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgbm93ZXJyOworCXVuc2lnbmVkIGxvbmcga2VlcDsKKwl1bnNpZ25lZCBsb25nIGlvMzJiaXQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQQorCXVuc2lnbmVkIGxvbmcgZG1hOworCXNtYWxsaW50IGdldHNldF9kbWE7CisjZW5kaWYKKyNpZmRlZiBIRElPX0RSSVZFX0NNRAorCXNtYWxsaW50IHNldF94ZmVybW9kZSwgZ2V0X3hmZXJtb2RlOworCXNtYWxsaW50IGdldHNldF9ka2VlcDsKKwlzbWFsbGludCBnZXRzZXRfc3RhbmRieTsKKwlzbWFsbGludCBnZXRzZXRfbG9va2FoZWFkOworCXNtYWxsaW50IGdldHNldF9wcmVmZXRjaDsKKwlzbWFsbGludCBnZXRzZXRfZGVmZWN0czsKKwlzbWFsbGludCBnZXRzZXRfd2NhY2hlOworCXNtYWxsaW50IGdldHNldF9kb29ybG9jazsKKwlzbWFsbGludCBzZXRfc2VhZ2F0ZTsKKwlzbWFsbGludCBzZXRfc3RhbmRieW5vdzsKKwlzbWFsbGludCBzZXRfc2xlZXBub3c7CisJc21hbGxpbnQgZ2V0X3Bvd2VybW9kZTsKKwlzbWFsbGludCBnZXRzZXRfYXBtbW9kZTsKKwlpbnQgeGZlcm1vZGVfcmVxdWVzdGVkOworCXVuc2lnbmVkIGxvbmcgZGtlZXA7CisJdW5zaWduZWQgbG9uZyBzdGFuZGJ5X3JlcXVlc3RlZDsgLyogMC4uMjU1ICovCisJdW5zaWduZWQgbG9uZyBsb29rYWhlYWQ7CisJdW5zaWduZWQgbG9uZyBwcmVmZXRjaDsKKwl1bnNpZ25lZCBsb25nIGRlZmVjdHM7CisJdW5zaWduZWQgbG9uZyB3Y2FjaGU7CisJdW5zaWduZWQgbG9uZyBkb29ybG9jazsKKwl1bnNpZ25lZCBsb25nIGFwbW1vZGU7CisjZW5kaWYKKwlJRl9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkoICAgICAgICBzbWFsbGludCBnZXRfSURlbnRpdHk7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHNtYWxsaW50IGdldHNldF9idXNzdGF0ZTspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCggICAgc21hbGxpbnQgcGVyZm9ybV9yZXNldDspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGKCAgc21hbGxpbnQgcGVyZm9ybV90cmlzdGF0ZTspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYoc21hbGxpbnQgdW5yZWdpc3Rlcl9od2lmOykKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRiggICAgICBzbWFsbGludCBzY2FuX2h3aWY7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHVuc2lnbmVkIGxvbmcgYnVzc3RhdGU7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHVuc2lnbmVkIGxvbmcgdHJpc3RhdGU7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGKHVuc2lnbmVkIGxvbmcgaHdpZjspCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJdW5zaWduZWQgbG9uZyBod2lmX2RhdGE7CisJdW5zaWduZWQgbG9uZyBod2lmX2N0cmw7CisJdW5zaWduZWQgbG9uZyBod2lmX2lycTsKKyNlbmRpZgorI2lmZGVmIERPX0ZMVVNIQ0FDSEUKKwl1bnNpZ25lZCBjaGFyIGZsdXNoY2FjaGVbNF0gPSB7IFdJTl9GTFVTSENBQ0hFLCAwLCAwLCAwIH07CisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCitzdHJ1Y3QgQlVHX0dfdG9vX2JpZyB7CisJY2hhciBCVUdfR190b29fYmlnW3NpemVvZihHKSA8PSBDT01NT05fQlVGU0laRSA/IDEgOiAtMV07Cit9OworI2RlZmluZSBnZXRfaWRlbnRpdHkgICAgICAgKEcuZ2V0X2lkZW50aXR5ICAgICAgICAgICApCisjZGVmaW5lIGdldF9nZW9tICAgICAgICAgICAoRy5nZXRfZ2VvbSAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZG9fZmx1c2ggICAgICAgICAgIChHLmRvX2ZsdXNoICAgICAgICAgICAgICAgKQorI2RlZmluZSBkb19jdGltaW5ncyAgICAgICAgKEcuZG9fY3RpbWluZ3MgICAgICAgICAgICApCisjZGVmaW5lIGRvX3RpbWluZ3MgICAgICAgICAoRy5kb190aW1pbmdzICAgICAgICAgICAgICkKKyNkZWZpbmUgcmVyZWFkX3BhcnRuICAgICAgIChHLnJlcmVhZF9wYXJ0biAgICAgICAgICAgKQorI2RlZmluZSBzZXRfcGlvbW9kZSAgICAgICAgKEcuc2V0X3Bpb21vZGUgICAgICAgICAgICApCisjZGVmaW5lIG5vaXN5X3Bpb21vZGUgICAgICAoRy5ub2lzeV9waW9tb2RlICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X3JlYWRhaGVhZCAgIChHLmdldHNldF9yZWFkYWhlYWQgICAgICAgKQorI2RlZmluZSBnZXRzZXRfcmVhZG9ubHkgICAgKEcuZ2V0c2V0X3JlYWRvbmx5ICAgICAgICApCisjZGVmaW5lIGdldHNldF91bm1hc2sgICAgICAoRy5nZXRzZXRfdW5tYXNrICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X211bHQgICAgICAgIChHLmdldHNldF9tdWx0ICAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfZG1hX3EgICAgICAgKEcuZ2V0c2V0X2RtYV9xICAgICAgICAgICApCisjZGVmaW5lIGdldHNldF9ub3dlcnIgICAgICAoRy5nZXRzZXRfbm93ZXJyICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2tlZXAgICAgICAgIChHLmdldHNldF9rZWVwICAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfaW8zMmJpdCAgICAgKEcuZ2V0c2V0X2lvMzJiaXQgICAgICAgICApCisjZGVmaW5lIHBpb21vZGUgICAgICAgICAgICAoRy5waW9tb2RlICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgWHJlYWRhaGVhZCAgICAgICAgIChHLlhyZWFkYWhlYWQgICAgICAgICAgICAgKQorI2RlZmluZSByZWFkb25seSAgICAgICAgICAgKEcucmVhZG9ubHkgICAgICAgICAgICAgICApCisjZGVmaW5lIHVubWFzayAgICAgICAgICAgICAoRy51bm1hc2sgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgbXVsdCAgICAgICAgICAgICAgIChHLm11bHQgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBkbWFfcSAgICAgICAgICAgICAgKEcuZG1hX3EgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIG5vd2VyciAgICAgICAgICAgICAoRy5ub3dlcnIgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUga2VlcCAgICAgICAgICAgICAgIChHLmtlZXAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBpbzMyYml0ICAgICAgICAgICAgKEcuaW8zMmJpdCAgICAgICAgICAgICAgICApCisjZGVmaW5lIGRtYSAgICAgICAgICAgICAgICAoRy5kbWEgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2RtYSAgICAgICAgIChHLmdldHNldF9kbWEgICAgICAgICAgICAgKQorI2RlZmluZSBzZXRfeGZlcm1vZGUgICAgICAgKEcuc2V0X3hmZXJtb2RlICAgICAgICAgICApCisjZGVmaW5lIGdldF94ZmVybW9kZSAgICAgICAoRy5nZXRfeGZlcm1vZGUgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2RrZWVwICAgICAgIChHLmdldHNldF9ka2VlcCAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfc3RhbmRieSAgICAgKEcuZ2V0c2V0X3N0YW5kYnkgICAgICAgICApCisjZGVmaW5lIGdldHNldF9sb29rYWhlYWQgICAoRy5nZXRzZXRfbG9va2FoZWFkICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X3ByZWZldGNoICAgIChHLmdldHNldF9wcmVmZXRjaCAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfZGVmZWN0cyAgICAgKEcuZ2V0c2V0X2RlZmVjdHMgICAgICAgICApCisjZGVmaW5lIGdldHNldF93Y2FjaGUgICAgICAoRy5nZXRzZXRfd2NhY2hlICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2Rvb3Jsb2NrICAgIChHLmdldHNldF9kb29ybG9jayAgICAgICAgKQorI2RlZmluZSBzZXRfc2VhZ2F0ZSAgICAgICAgKEcuc2V0X3NlYWdhdGUgICAgICAgICAgICApCisjZGVmaW5lIHNldF9zdGFuZGJ5bm93ICAgICAoRy5zZXRfc3RhbmRieW5vdyAgICAgICAgICkKKyNkZWZpbmUgc2V0X3NsZWVwbm93ICAgICAgIChHLnNldF9zbGVlcG5vdyAgICAgICAgICAgKQorI2RlZmluZSBnZXRfcG93ZXJtb2RlICAgICAgKEcuZ2V0X3Bvd2VybW9kZSAgICAgICAgICApCisjZGVmaW5lIGdldHNldF9hcG1tb2RlICAgICAoRy5nZXRzZXRfYXBtbW9kZSAgICAgICAgICkKKyNkZWZpbmUgeGZlcm1vZGVfcmVxdWVzdGVkIChHLnhmZXJtb2RlX3JlcXVlc3RlZCAgICAgKQorI2RlZmluZSBka2VlcCAgICAgICAgICAgICAgKEcuZGtlZXAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIHN0YW5kYnlfcmVxdWVzdGVkICAoRy5zdGFuZGJ5X3JlcXVlc3RlZCAgICAgICkKKyNkZWZpbmUgbG9va2FoZWFkICAgICAgICAgIChHLmxvb2thaGVhZCAgICAgICAgICAgICAgKQorI2RlZmluZSBwcmVmZXRjaCAgICAgICAgICAgKEcucHJlZmV0Y2ggICAgICAgICAgICAgICApCisjZGVmaW5lIGRlZmVjdHMgICAgICAgICAgICAoRy5kZWZlY3RzICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgd2NhY2hlICAgICAgICAgICAgIChHLndjYWNoZSAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBkb29ybG9jayAgICAgICAgICAgKEcuZG9vcmxvY2sgICAgICAgICAgICAgICApCisjZGVmaW5lIGFwbW1vZGUgICAgICAgICAgICAoRy5hcG1tb2RlICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0X0lEZW50aXR5ICAgICAgIChHLmdldF9JRGVudGl0eSAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfYnVzc3RhdGUgICAgKEcuZ2V0c2V0X2J1c3N0YXRlICAgICAgICApCisjZGVmaW5lIHBlcmZvcm1fcmVzZXQgICAgICAoRy5wZXJmb3JtX3Jlc2V0ICAgICAgICAgICkKKyNkZWZpbmUgcGVyZm9ybV90cmlzdGF0ZSAgIChHLnBlcmZvcm1fdHJpc3RhdGUgICAgICAgKQorI2RlZmluZSB1bnJlZ2lzdGVyX2h3aWYgICAgKEcudW5yZWdpc3Rlcl9od2lmICAgICAgICApCisjZGVmaW5lIHNjYW5faHdpZiAgICAgICAgICAoRy5zY2FuX2h3aWYgICAgICAgICAgICAgICkKKyNkZWZpbmUgYnVzc3RhdGUgICAgICAgICAgIChHLmJ1c3N0YXRlICAgICAgICAgICAgICAgKQorI2RlZmluZSB0cmlzdGF0ZSAgICAgICAgICAgKEcudHJpc3RhdGUgICAgICAgICAgICAgICApCisjZGVmaW5lIGh3aWYgICAgICAgICAgICAgICAoRy5od2lmICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgaHdpZl9kYXRhICAgICAgICAgIChHLmh3aWZfZGF0YSAgICAgICAgICAgICAgKQorI2RlZmluZSBod2lmX2N0cmwgICAgICAgICAgKEcuaHdpZl9jdHJsICAgICAgICAgICAgICApCisjZGVmaW5lIGh3aWZfaXJxICAgICAgICAgICAoRy5od2lmX2lycSAgICAgICAgICAgICAgICkKKworCisvKiBCdXN5Ym94IG1lc3NhZ2VzIGFuZCBmdW5jdGlvbnMgKi8KKyNpZiBFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUgorc3RhdGljIGludCBpb2N0bF9hbHRfZnVuYygvKmludCBmZCwqLyBpbnQgY21kLCB1bnNpZ25lZCBjaGFyICphcmdzLCBpbnQgYWx0LCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJaWYgKCFpb2N0bChmZCwgY21kLCBhcmdzKSkKKwkJcmV0dXJuIDA7CisJYXJnc1swXSA9IGFsdDsKKwlyZXR1cm4gYmJfaW9jdGxfb3Jfd2FybihmZCwgY21kLCBhcmdzLCBzdHJpbmcpOworfQorI2RlZmluZSBpb2N0bF9hbHRfb3Jfd2FybihjbWQsYXJncyxhbHQpIGlvY3RsX2FsdF9mdW5jKGNtZCxhcmdzLGFsdCwjY21kKQorI2Vsc2UKK3N0YXRpYyBpbnQgaW9jdGxfYWx0X2Z1bmMoLyppbnQgZmQsKi8gaW50IGNtZCwgdW5zaWduZWQgY2hhciAqYXJncywgaW50IGFsdCkKK3sKKwlpZiAoIWlvY3RsKGZkLCBjbWQsIGFyZ3MpKQorCQlyZXR1cm4gMDsKKwlhcmdzWzBdID0gYWx0OworCXJldHVybiBiYl9pb2N0bF9vcl93YXJuKGZkLCBjbWQsIGFyZ3MpOworfQorI2RlZmluZSBpb2N0bF9hbHRfb3Jfd2FybihjbWQsYXJncyxhbHQpIGlvY3RsX2FsdF9mdW5jKGNtZCxhcmdzLGFsdCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvbl9vZmYoaW50IHZhbHVlKQoreworCXB1dHModmFsdWUgPyAiIChvbikiIDogIiAob2ZmKSIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9mbGFnX29uX29mZihpbnQgZ2V0X2FyZywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKGdldF9hcmcpIHsKKwkJcHJpbnRmKCIgc2V0dGluZyAlcyB0byAlbGQiLCBzLCBhcmcpOworCQlvbl9vZmYoYXJnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZhbHVlX29uX29mZihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgYXJncCkKK3sKKwlwcmludGYoIiAlc1x0PSAlMmxkIiwgc3RyLCBhcmdwKTsKKwlvbl9vZmYoYXJncCAhPSAwKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkKK3N0YXRpYyB2b2lkIHByaW50X2FzY2lpKGNvbnN0IGNoYXIgKnAsIGludCBsZW5ndGgpCit7CisjaWYgQkJfQklHX0VORElBTgorI2RlZmluZSBMRV9PTkxZKHgpCisJZW51bSB7IG9mcyA9IDAgfTsKKyNlbHNlCisjZGVmaW5lIExFX09OTFkoeCkgeAorCS8qIGV2ZXJ5IDE2Yml0IHdvcmQgaXMgYmlnLWVuZGlhbiAoaS5lLiBpbnZlcnRlZCkgKi8KKwkvKiBhY2Nlc3NpbmcgYnl0ZXMgaW4gMSwwLCAzLDIsIDUsNC4uLiBzZXF1ZW5jZSAqLworCWludCBvZnMgPSAxOworI2VuZGlmCisKKwlsZW5ndGggKj0gMjsKKwkvKiBmaW5kIGZpcnN0IG5vbi1zcGFjZSAmIHByaW50IGl0ICovCisJd2hpbGUgKGxlbmd0aCAmJiBwW29mc10gIT0gJyAnKSB7CisJCXArKzsKKwkJTEVfT05MWShvZnMgPSAtb2ZzOykKKwkJbGVuZ3RoLS07CisJfQorCXdoaWxlIChsZW5ndGggJiYgcFtvZnNdKSB7CisJCWJiX3B1dGNoYXIocFtvZnNdKTsKKwkJcCsrOworCQlMRV9PTkxZKG9mcyA9IC1vZnM7KQorCQlsZW5ndGgtLTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKyN1bmRlZiBMRV9PTkxZCit9CisKK3N0YXRpYyB2b2lkIHhwcmludF9hc2NpaSh1aW50MTZfdCAqdmFsLCBpbnQgaSwgY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgbikKK3sKKwlpZiAodmFsW2ldKSB7CisJCXByaW50ZigiXHQlLTIwcyIsIHN0cmluZyk7CisJCXByaW50X2FzY2lpKCh2b2lkKikmdmFsW2ldLCBuKTsKKwl9Cit9CisKK3N0YXRpYyB1aW50OF90IG1vZGVfbG9vcCh1aW50MTZfdCBtb2RlX3N1cCwgdWludDE2X3QgbW9kZV9zZWwsIGludCBjYywgdWludDhfdCAqaGF2ZV9tb2RlKQoreworCXVpbnQxNl90IGlpOworCXVpbnQ4X3QgZXJyX2RtYSA9IDA7CisKKwlmb3IgKGlpID0gMDsgaWkgPD0gTU9ERV9NQVg7IGlpKyspIHsKKwkJaWYgKG1vZGVfc2VsICYgMHgwMDAxKSB7CisJCQlwcmludGYoIiolY2RtYSV1ICIsIGNjLCBpaSk7CisJCQlpZiAoKmhhdmVfbW9kZSkKKwkJCQllcnJfZG1hID0gMTsKKwkJCSpoYXZlX21vZGUgPSAxOworCQl9IGVsc2UgaWYgKG1vZGVfc3VwICYgMHgwMDAxKQorCQkJcHJpbnRmKCIlY2RtYSV1ICIsIGNjLCBpaSk7CisKKwkJbW9kZV9zdXAgPj49IDE7CisJCW1vZGVfc2VsID4+PSAxOworCX0KKwlyZXR1cm4gZXJyX2RtYTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgcGt0X3N0cltdIEFMSUdOMSA9CisJIkRpcmVjdC1hY2Nlc3MgZGV2aWNlIiAiXDAiICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDAgKi8KKwkiU2VxdWVudGlhbC1hY2Nlc3MgZGV2aWNlIiAiXDAiICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwMSAqLworCSJQcmludGVyIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDAyICovCisJIlByb2Nlc3NvciIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDMgKi8KKwkiV3JpdGUtb25jZSBkZXZpY2UiICJcMCIgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwNCAqLworCSJDRC1ST00iICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDA1ICovCisJIlNjYW5uZXIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDYgKi8KKwkiT3B0aWNhbCBtZW1vcnkiICJcMCIgICAgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwNyAqLworCSJNZWRpdW0gY2hhbmdlciIgIlwwIiAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDA4ICovCisJIkNvbW11bmljYXRpb25zIGRldmljZSIgIlwwIiAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDkgKi8KKwkiQUNTLUlUOCBkZXZpY2UiICJcMCIgICAgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwYSAqLworCSJBQ1MtSVQ4IGRldmljZSIgIlwwIiAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDBiICovCisJIkFycmF5IGNvbnRyb2xsZXIiICJcMCIgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMGMgKi8KKwkiRW5jbG9zdXJlIHNlcnZpY2VzIiAiXDAiICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwZCAqLworCSJSZWR1Y2VkIGJsb2NrIGNvbW1hbmQgZGV2aWNlIiAiXDAiICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDBlICovCisJIk9wdGljYWwgY2FyZCByZWFkZXIvd3JpdGVyIiAiXDAiICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMGYgKi8KKzsKKworc3RhdGljIGNvbnN0IGNoYXIgYXRhMV9jZmdfc3RyW10gQUxJR04xID0gICAgICAgLyogd29yZCAwIGluIEFUQS0xIG1vZGUgKi8KKwkicmVzZXJ2ZWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0IDAgKi8KKwkiaGFyZCBzZWN0b3JlZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgLyogYml0IDEgKi8KKwkic29mdCBzZWN0b3JlZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgLyogYml0IDIgKi8KKwkibm90IE1GTSBlbmNvZGVkICIgIlwwIiAgICAgICAgICAgICAgICAgLyogYml0IDMgKi8KKwkiaGVhZCBzd2l0Y2ggdGltZSA+IDE1dXMiICJcMCIgICAgICAgICAgLyogYml0IDQgKi8KKwkic3BpbmRsZSBtb3RvciBjb250cm9sIG9wdGlvbiIgIlwwIiAgICAgLyogYml0IDUgKi8KKwkiZml4ZWQgZHJpdmUiICJcMCIgICAgICAgICAgICAgICAgICAgICAgLyogYml0IDYgKi8KKwkicmVtb3ZhYmxlIGRyaXZlIiAiXDAiICAgICAgICAgICAgICAgICAgLyogYml0IDcgKi8KKwkiZGlzayB4ZmVyIHJhdGUgPD0gNU1icyIgIlwwIiAgICAgICAgICAgLyogYml0IDggKi8KKwkiZGlzayB4ZmVyIHJhdGUgPiA1TWJzLCA8PSAxME1icyIgIlwwIiAgLyogYml0IDkgKi8KKwkiZGlzayB4ZmVyIHJhdGUgPiA1TWJzIiAiXDAiICAgICAgICAgICAgLyogYml0IDEwICovCisJInJvdGF0aW9uYWwgc3BlZWQgdG9sLiIgIlwwIiAgICAgICAgICAgIC8qIGJpdCAxMSAqLworCSJkYXRhIHN0cm9iZSBvZmZzZXQgb3B0aW9uIiAiXDAiICAgICAgICAvKiBiaXQgMTIgKi8KKwkidHJhY2sgb2Zmc2V0IG9wdGlvbiIgIlwwIiAgICAgICAgICAgICAgLyogYml0IDEzICovCisJImZvcm1hdCBzcGVlZCB0b2xlcmFuY2UgZ2FwIHJlcWQiICJcMCIgIC8qIGJpdCAxNCAqLworCSJBVEFQSSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXQgMTQgKi8KKzsKKworc3RhdGljIGNvbnN0IGNoYXIgbWlub3Jfc3RyW10gQUxJR04xID0KKwkvKiB3b3JkIDgxIHZhbHVlOiAqLworCSJVbnNwZWNpZmllZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDAgKi8KKwkiQVRBLTEgWDNUOS4yIDc4MUQgcHJpb3IgdG8gcmV2LjQiICJcMCIgICAgICAgICAgICAgLyogMHgwMDAxICovCisJIkFUQS0xIHB1Ymxpc2hlZCwgQU5TSSBYMy4yMjEtMTk5NCIgIlwwIiAgICAgICAgICAgIC8qIDB4MDAwMiAqLworCSJBVEEtMSBYM1Q5LjIgNzgxRCByZXYuNCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDMgKi8KKwkiQVRBLTIgcHVibGlzaGVkLCBBTlNJIFgzLjI3OS0xOTk2IiAiXDAiICAgICAgICAgICAgLyogMHgwMDA0ICovCisJIkFUQS0yIFgzVDEwIDk0OEQgcHJpb3IgdG8gcmV2LjJrIiAiXDAiICAgICAgICAgICAgIC8qIDB4MDAwNSAqLworCSJBVEEtMyBYM1QxMCAyMDA4RCByZXYuMSIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDYgKi8KKwkiQVRBLTIgWDNUMTAgOTQ4RCByZXYuMmsiICJcMCIgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDA3ICovCisJIkFUQS0zIFgzVDEwIDIwMDhEIHJldi4wIiAiXDAiICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwOCAqLworCSJBVEEtMiBYM1QxMCA5NDhEIHJldi4zIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDkgKi8KKwkiQVRBLTMgcHVibGlzaGVkLCBBTlNJIFgzLjI5OC0xOTl4IiAiXDAiICAgICAgICAgICAgLyogMHgwMDBhICovCisJIkFUQS0zIFgzVDEwIDIwMDhEIHJldi42IiAiXDAiICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwYiAqLworCSJBVEEtMyBYM1QxMyAyMDA4RCByZXYuNyBhbmQgN2EiICJcMCIgICAgICAgICAgICAgICAvKiAweDAwMGMgKi8KKwkiQVRBL0FUQVBJLTQgWDNUMTMgMTE1M0QgcmV2LjYiICJcMCIgICAgICAgICAgICAgICAgLyogMHgwMDBkICovCisJIkFUQS9BVEFQSS00IFQxMyAxMTUzRCByZXYuMTMiICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAwZSAqLworCSJBVEEvQVRBUEktNCBYM1QxMyAxMTUzRCByZXYuNyIgIlwwIiAgICAgICAgICAgICAgICAvKiAweDAwMGYgKi8KKwkiQVRBL0FUQVBJLTQgVDEzIDExNTNEIHJldi4xOCIgIlwwIiAgICAgICAgICAgICAgICAgLyogMHgwMDEwICovCisJIkFUQS9BVEFQSS00IFQxMyAxMTUzRCByZXYuMTUiICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAxMSAqLworCSJBVEEvQVRBUEktNCBwdWJsaXNoZWQsIEFOU0kgSU5DSVRTIDMxNy0xOTk4IiAiXDAiICAvKiAweDAwMTIgKi8KKwkiQVRBL0FUQVBJLTUgVDEzIDEzMjFEIHJldi4zIiAiXDAiICAgICAgICAgICAgICAgICAgLyogMHgwMDEzICovCisJIkFUQS9BVEFQSS00IFQxMyAxMTUzRCByZXYuMTQiICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAxNCAqLworCSJBVEEvQVRBUEktNSBUMTMgMTMyMUQgcmV2LjEiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMTUgKi8KKwkiQVRBL0FUQVBJLTUgcHVibGlzaGVkLCBBTlNJIElOQ0lUUyAzNDAtMjAwMCIgIlwwIiAgLyogMHgwMDE2ICovCisJIkFUQS9BVEFQSS00IFQxMyAxMTUzRCByZXYuMTciICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAxNyAqLworCSJBVEEvQVRBUEktNiBUMTMgMTQxMEQgcmV2LjAiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMTggKi8KKwkiQVRBL0FUQVBJLTYgVDEzIDE0MTBEIHJldi4zYSIgIlwwIiAgICAgICAgICAgICAgICAgLyogMHgwMDE5ICovCisJIkFUQS9BVEFQSS03IFQxMyAxNTMyRCByZXYuMSIgIlwwIiAgICAgICAgICAgICAgICAgIC8qIDB4MDAxYSAqLworCSJBVEEvQVRBUEktNiBUMTMgMTQxMEQgcmV2LjIiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMWIgKi8KKwkiQVRBL0FUQVBJLTYgVDEzIDE0MTBEIHJldi4xIiAiXDAiICAgICAgICAgICAgICAgICAgLyogMHgwMDFjICovCisJIkFUQS9BVEFQSS03IHB1Ymxpc2hlZCwgQU5TSSBJTkNJVFMgMzk3LTIwMDUiICJcMCIgIC8qIDB4MDAxZCAqLworCSJBVEEvQVRBUEktNyBUMTMgMTUzMkQgcmV2LjAiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMWUgKi8KKwkicmVzZXJ2ZWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDFmICovCisJInJlc2VydmVkIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAyMCAqLworCSJBVEEvQVRBUEktNyBUMTMgMTUzMkQgcmV2LjRhIiAiXDAiICAgICAgICAgICAgICAgICAvKiAweDAwMjEgKi8KKwkiQVRBL0FUQVBJLTYgcHVibGlzaGVkLCBBTlNJIElOQ0lUUyAzNjEtMjAwMiIgIlwwIiAgLyogMHgwMDIyICovCisJInJlc2VydmVkIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAyMy0weGZmZmUgKi8KKzsKK3N0YXRpYyBjb25zdCBjaGFyIGFjdHVhbF92ZXJbTUlOT1JfTUFYICsgMl0gQUxJR04xID0geworCSAgIC8qIHdvcmQgODEgdmFsdWU6ICovCisJMCwgLyogMHgwMDAwIFdBUk5JTkc6IGFjdHVhbF92ZXJbXSBhcnJheSAqLworCTEsIC8qIDB4MDAwMSBXQVJOSU5HOiBjb3JyZXNwb25kcyAgICAgICAgKi8KKwkxLCAvKiAweDAwMDIgV0FSTklORzogKmV4YWN0bHkqICAgICAgICAgICovCisJMSwgLyogMHgwMDAzIFdBUk5JTkc6IHRvIHRoZSBBVEEvICAgICAgICAqLworCTIsIC8qIDB4MDAwNCBXQVJOSU5HOiBBVEFQSSB2ZXJzaW9uICAgICAgKi8KKwkyLCAvKiAweDAwMDUgV0FSTklORzogbGlzdGVkIGluICAgICAgICAgICovCisJMywgLyogMHgwMDA2IFdBUk5JTkc6IHRoZSAgICAgICAgICAgICAgICAqLworCTIsIC8qIDB4MDAwNyBXQVJOSU5HOiBtaW5vcl9zdHIgICAgICAgICAgKi8KKwkzLCAvKiAweDAwMDggV0FSTklORzogYXJyYXkgICAgICAgICAgICAgICovCisJMiwgLyogMHgwMDA5IFdBUk5JTkc6IGFib3ZlLiAgICAgICAgICAgICAqLworCTMsIC8qIDB4MDAwYSBXQVJOSU5HOiAgICAgICAgICAgICAgICAgICAgKi8KKwkzLCAvKiAweDAwMGIgV0FSTklORzogSWYgeW91IGNoYW5nZSAgICAgICovCisJMywgLyogMHgwMDBjIFdBUk5JTkc6IHRoYXQgb25lLCAgICAgICAgICAqLworCTQsIC8qIDB4MDAwZCBXQVJOSU5HOiBjaGFuZ2UgdGhpcyBvbmUgICAgKi8KKwk0LCAvKiAweDAwMGUgV0FSTklORzogdG9vISEhICAgICAgICAgICAgICovCisJNCwgLyogMHgwMDBmICovCisJNCwgLyogMHgwMDEwICovCisJNCwgLyogMHgwMDExICovCisJNCwgLyogMHgwMDEyICovCisJNSwgLyogMHgwMDEzICovCisJNCwgLyogMHgwMDE0ICovCisJNSwgLyogMHgwMDE1ICovCisJNSwgLyogMHgwMDE2ICovCisJNCwgLyogMHgwMDE3ICovCisJNiwgLyogMHgwMDE4ICovCisJNiwgLyogMHgwMDE5ICovCisJNywgLyogMHgwMDFhICovCisJNiwgLyogMHgwMDFiICovCisJNiwgLyogMHgwMDFjICovCisJNywgLyogMHgwMDFkICovCisJNywgLyogMHgwMDFlICovCisJMCwgLyogMHgwMDFmICovCisJMCwgLyogMHgwMDIwICovCisJNywgLyogMHgwMDIxICovCisJNiwgLyogMHgwMDIyICovCisJMCAgLyogMHgwMDIzLTB4ZmZmZSAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgY21kX2ZlYXRfc3RyW10gQUxJR04xID0KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0IDE1OiBvYnNvbGV0ZSAgKi8KKwkiTk9QIGNtZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0IDE0ICovCisJIlJFQUQgQlVGRkVSIGNtZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAxMyAqLworCSJXUklURSBCVUZGRVIgY21kIiAiXDAiICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgMTIgKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0IDExOiBvYnNvbGV0ZSAgKi8KKwkiSG9zdCBQcm90ZWN0ZWQgQXJlYSBmZWF0dXJlIHNldCIgIlwwIiAgICAgIC8qIHdvcmQgODIgYml0IDEwICovCisJIkRFVklDRSBSRVNFVCBjbWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgOSAqLworCSJTRVJWSUNFIGludGVycnVwdCIgIlwwIiAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDggKi8KKwkiUmVsZWFzZSBpbnRlcnJ1cHQiICJcMCIgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICA3ICovCisJIkxvb2stYWhlYWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgNiAqLworCSJXcml0ZSBjYWNoZSIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDUgKi8KKwkiUEFDS0VUIGNvbW1hbmQgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICA0ICovCisJIlBvd2VyIE1hbmFnZW1lbnQgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgMyAqLworCSJSZW1vdmFibGUgTWVkaWEgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDIgKi8KKwkiU2VjdXJpdHkgTW9kZSBmZWF0dXJlIHNldCIgIlwwIiAgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICAxICovCisJIlNNQVJUIGZlYXR1cmUgc2V0IiAiXDAiICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgMCAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0gKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODMgYml0IDE1OiAhdmFsaWQgYml0ICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgzIGJpdCAxNDogIHZhbGlkIGJpdCAqLworCSJGTFVTSCBDQUNIRSBFWFQgY21kIiAiXDAiICAgICAgICAgICAgICAgICAgLyogd29yZCA4MyBiaXQgMTMgKi8KKwkiTWFuZGF0b3J5IEZMVVNIIENBQ0hFIGNtZCAiICJcMCIgICAgICAgICAgIC8qIHdvcmQgODMgYml0IDEyICovCisJIkRldmljZSBDb25maWd1cmF0aW9uIE92ZXJsYXkgZmVhdHVyZSBzZXQgIiAiXDAiCisJIjQ4LWJpdCBBZGRyZXNzIGZlYXR1cmUgc2V0ICIgIlwwIiAgICAgICAgICAvKiB3b3JkIDgzIGJpdCAxMCAqLworCSIiICJcMCIKKwkiU0VUIE1BWCBzZWN1cml0eSBleHRlbnNpb24iICJcMCIgICAgICAgICAgIC8qIHdvcmQgODMgYml0ICA4ICovCisJIkFkZHJlc3MgT2Zmc2V0IFJlc2VydmVkIEFyZWEgQm9vdCIgIlwwIiAgICAvKiB3b3JkIDgzIGJpdCAgNyAqLworCSJTRVQgRkVBVFVSRVMgc3ViY29tbWFuZCByZXF1aXJlZCB0byBzcGludXAgYWZ0ZXIgcG93ZXIgdXAiICJcMCIKKwkiUG93ZXItVXAgSW4gU3RhbmRieSBmZWF0dXJlIHNldCIgIlwwIiAgICAgIC8qIHdvcmQgODMgYml0ICA1ICovCisJIlJlbW92YWJsZSBNZWRpYSBTdGF0dXMgTm90aWZpY2F0aW9uIGZlYXR1cmUgc2V0IiAiXDAiCisJIkFkdi4gUG93ZXIgTWFuYWdlbWVudCBmZWF0dXJlIHNldCIgIlwwIiAgICAvKiB3b3JkIDgzIGJpdCAgMyAqLworCSJDRkEgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MyBiaXQgIDIgKi8KKwkiUkVBRC9XUklURSBETUEgUVVFVUVEIiAiXDAiICAgICAgICAgICAgICAgIC8qIHdvcmQgODMgYml0ICAxICovCisJIkRPV05MT0FEIE1JQ1JPQ09ERSBjbWQiICJcMCIgICAgICAgICAgICAgICAvKiB3b3JkIDgzIGJpdCAgMCAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0gKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODQgYml0IDE1OiAhdmFsaWQgYml0ICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAxNDogIHZhbGlkIGJpdCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTM6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTI6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTE6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTA6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDk6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDg6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDc6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDY6ICByZXNlcnZlZCAqLworCSJHZW5lcmFsIFB1cnBvc2UgTG9nZ2luZyBmZWF0dXJlIHNldCIgIlwwIiAgLyogd29yZCA4NCBiaXQgIDUgKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODQgYml0ICA0OiAgcmVzZXJ2ZWQgKi8KKwkiTWVkaWEgQ2FyZCBQYXNzIFRocm91Z2ggQ29tbWFuZCBmZWF0dXJlIHNldCAiICJcMCIKKwkiTWVkaWEgc2VyaWFsIG51bWJlciAiICJcMCIgICAgICAgICAgICAgICAgIC8qIHdvcmQgODQgYml0ICAyICovCisJIlNNQVJUIHNlbGYtdGVzdCAiICJcMCIgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAgMSAqLworCSJTTUFSVCBlcnJvciBsb2dnaW5nICIgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDAgKi8KKzsKKworc3RhdGljIGNvbnN0IGNoYXIgc2VjdV9zdHJbXSBBTElHTjEgPQorCSJzdXBwb3J0ZWQiICJcMCIgICAgICAgICAgICAgICAgLyogd29yZCAxMjgsIGJpdCAwICovCisJImVuYWJsZWQiICJcMCIgICAgICAgICAgICAgICAgICAvKiB3b3JkIDEyOCwgYml0IDEgKi8KKwkibG9ja2VkIiAiXDAiICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMTI4LCBiaXQgMiAqLworCSJmcm96ZW4iICJcMCIgICAgICAgICAgICAgICAgICAgLyogd29yZCAxMjgsIGJpdCAzICovCisJImV4cGlyZWQ6IHNlY3VyaXR5IGNvdW50IiAiXDAiICAvKiB3b3JkIDEyOCwgYml0IDQgKi8KKwkic3VwcG9ydGVkOiBlbmhhbmNlZCBlcmFzZSIgICAgIC8qIHdvcmQgMTI4LCBiaXQgNSAqLworOworCisvLyBQYXJzZSA1MTIgYnl0ZSBkaXNrIGlkZW50aWZpY2F0aW9uIGJsb2NrIGFuZCBwcmludCBtdWNoIGNyYXAuCitzdGF0aWMgdm9pZCBpZGVudGlmeSh1aW50MTZfdCAqdmFsKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGlkZW50aWZ5KHVpbnQxNl90ICp2YWwpCit7CisJdWludDE2X3QgaWksIGpqLCBrazsKKwl1aW50MTZfdCBsaWtlX3N0ZCA9IDEsIHN0ZCA9IDAsIG1pbl9zdGQgPSAweGZmZmY7CisJdWludDE2X3QgZGV2ID0gTk9fREVWLCBlcXB0ID0gTk9fREVWOworCXVpbnQ4X3QgIGhhdmVfbW9kZSA9IDAsIGVycl9kbWEgPSAwOworCXVpbnQ4X3QgIGNoa3N1bSA9IDA7CisJdWludDMyX3QgbGwsIG1tLCBubiwgb287CisJdWludDY0X3QgYmJiaWc7IC8qICg6KSAqLworCWNvbnN0IGNoYXIgKnN0cm5nOworI2lmIEJCX0JJR19FTkRJQU4KKwl1aW50MTZfdCBidWZbMjU2XTsKKworCS8vIEFkanVzdCBmb3IgZW5kaWFubmVzcworCXN3YWIodmFsLCBidWYsIHNpemVvZihidWYpKTsKKwl2YWwgPSBidWY7CisjZW5kaWYKKwkvKiBjaGVjayBpZiB3ZSByZWNvZ25pemUgdGhlIGRldmljZSB0eXBlICovCisJYmJfcHV0Y2hhcignXG4nKTsKKwlpZiAoISh2YWxbR0VOX0NPTkZJR10gJiBOT1RfQVRBKSkgeworCQlkZXYgPSBBVEFfREVWOworCQlwcmludGYoIkFUQSBkZXZpY2UsIHdpdGggIik7CisJfSBlbHNlIGlmICh2YWxbR0VOX0NPTkZJR109PUNGQV9TVVBQT1JUX1ZBTCkgeworCQlkZXYgPSBBVEFfREVWOworCQlsaWtlX3N0ZCA9IDQ7CisJCXByaW50ZigiQ29tcGFjdEZsYXNoIEFUQSBkZXZpY2UsIHdpdGggIik7CisJfSBlbHNlIGlmICghKHZhbFtHRU5fQ09ORklHXSAmIE5PVF9BVEFQSSkpIHsKKwkJZGV2ID0gQVRBUElfREVWOworCQllcXB0ID0gKHZhbFtHRU5fQ09ORklHXSAmIEVRUFRfVFlQRSkgPj4gU0hJRlRfRVFQVDsKKwkJcHJpbnRmKCJBVEFQSSAlcywgd2l0aCAiLCBlcXB0IDw9IDB4ZiA/IG50aF9zdHJpbmcocGt0X3N0ciwgZXFwdCkgOiAidW5rbm93biIpOworCQlsaWtlX3N0ZCA9IDM7CisJfSBlbHNlCisJCS8qICJVbmtub3duIGRldmljZSB0eXBlOlxuXHRiaXRzIDE1JjE0IG9mIGdlbmVyYWwgY29uZmlndXJhdGlvbiB3b3JkIDAgYm90aCBzZXQgdG8gMS5cbiIgKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gZGV2aWNlIHR5cGUiKTsKKworCXByaW50ZigiJXNyZW1vdmFibGUgbWVkaWFcbiIsICEodmFsW0dFTl9DT05GSUddICYgTUVESUFfUkVNT1ZBQkxFKSA/ICJub24tIiA6ICIiKTsKKwkvKiBJbmZvIGZyb20gdGhlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gd29yZCBzYXlzIHdoZXRoZXIgb3Igbm90IHRoZQorCSAqIElEIGNvbW1hbmQgY29tcGxldGVkIGNvcnJlY3RseS4gIEl0IGlzIG9ubHkgZGVmaW5lZCwgaG93ZXZlciBpbgorCSAqIEFUQS9BVEFQSS01ICYgNjsgaXQgaXMgcmVzZXJ2ZWQgKHZhbHVlIHRoZW9yZXRpY2FsbHkgMCkgaW4gcHJpb3IKKwkgKiBzdGFuZGFyZHMuICBTaW5jZSB0aGUgdmFsdWVzIGFsbG93ZWQgZm9yIHRoaXMgd29yZCBhcmUgZXh0cmVtZWx5CisJICogc3BlY2lmaWMsIGl0IHNob3VsZCBiZSBzYWZlIHRvIGNoZWNrIGl0IG5vdywgZXZlbiB0aG91Z2ggd2UgZG9uJ3QKKwkgKiBrbm93IHlldCB3aGF0IHN0YW5kYXJkIHRoaXMgZGV2aWNlIGlzIHVzaW5nLgorCSAqLworCWlmICgodmFsW0NPTkZJR109PVNUQllfTklEX1ZBTCkgfHwgKHZhbFtDT05GSUddPT1TVEJZX0lEX1ZBTCkKKwkgfHwgKHZhbFtDT05GSUddPT1QV1JEX05JRF9WQUwpIHx8ICh2YWxbQ09ORklHXT09UFdSRF9JRF9WQUwpCisJKSB7CisJCWxpa2Vfc3RkID0gNTsKKwkJaWYgKCh2YWxbQ09ORklHXT09U1RCWV9OSURfVkFMKSB8fCAodmFsW0NPTkZJR109PVNUQllfSURfVkFMKSkKKwkJCXByaW50ZigicG93ZXJzLXVwIGluIHN0YW5kYnk7IFNFVCBGRUFUVVJFUyBzdWJjbWQgc3BpbnMtdXAuXG4iKTsKKwkJaWYgKCgodmFsW0NPTkZJR109PVNUQllfTklEX1ZBTCkgfHwgKHZhbFtDT05GSUddPT1QV1JEX05JRF9WQUwpKSAmJiAodmFsW0dFTl9DT05GSUddICYgSU5DT01QTEVURSkpCisJCQlwcmludGYoIlxuXHRXQVJOSU5HOiBJRCByZXNwb25zZSBpbmNvbXBsZXRlLlxuXHRGb2xsb3dpbmcgZGF0YSBtYXkgYmUgaW5jb3JyZWN0LlxuXG4iKTsKKwl9CisKKwkvKiBvdXRwdXQgdGhlIG1vZGVsIGFuZCBzZXJpYWwgbnVtYmVycyBhbmQgdGhlIGZ3IHJldmlzaW9uICovCisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfTU9ERUwsICAiTW9kZWwgTnVtYmVyOiIsICAgICAgICBMRU5HVEhfTU9ERUwpOworCXhwcmludF9hc2NpaSh2YWwsIFNUQVJUX1NFUklBTCwgIlNlcmlhbCBOdW1iZXI6IiwgICAgICAgTEVOR1RIX1NFUklBTCk7CisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfRldfUkVWLCAiRmlybXdhcmUgUmV2aXNpb246IiwgICBMRU5HVEhfRldfUkVWKTsKKwl4cHJpbnRfYXNjaWkodmFsLCBTVEFSVF9NRURJQSwgICJNZWRpYSBTZXJpYWwgTnVtOiIsICAgIExFTkdUSF9NRURJQSk7CisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfTUFOVUYsICAiTWVkaWEgTWFudWZhY3R1cmVyOiIsICBMRU5HVEhfTUFOVUYpOworCisJLyogbWFqb3IgJiBtaW5vciBzdGFuZGFyZHMgdmVyc2lvbiBudW1iZXIgKE5vdGU6IHRoZXNlIHdvcmRzIHdlcmUgbm90CisJICogZGVmaW5lZCB1bnRpbCBBVEEtMyAmIHRoZSBDRFJPTSBzdGQgdXNlcyBkaWZmZXJlbnQgd29yZHMuKSAqLworCXByaW50ZigiU3RhbmRhcmRzOiIpOworCWlmIChlcXB0ICE9IENEUk9NKSB7CisJCWlmICh2YWxbTUlOT1JdICYmICh2YWxbTUlOT1JdIDw9IE1JTk9SX01BWCkpIHsKKwkJCWlmIChsaWtlX3N0ZCA8IDMpIGxpa2Vfc3RkID0gMzsKKwkJCXN0ZCA9IGFjdHVhbF92ZXJbdmFsW01JTk9SXV07CisJCQlpZiAoc3RkKQorCQkJCXByaW50ZigiXG5cdFVzZWQ6ICVzICIsIG50aF9zdHJpbmcobWlub3Jfc3RyLCB2YWxbTUlOT1JdKSk7CisJCX0KKwkJLyogbG9va3MgbGlrZSB3aGVuIHRoZXkgdXAtaXNzdWUgdGhlIHN0ZCwgdGhleSBvYnNvbGV0ZSBvbmU7CisJCSAqIHRodXMsIG9ubHkgdGhlIG5ld2VzdCA0IGlzc3VlcyBuZWVkIGJlIHN1cHBvcnRlZC4gKFRoYXQncworCQkgKiB3aGF0ICJrayIgYW5kICJtaW5fc3RkIiBhcmUgYWxsIGFib3V0LikgKi8KKwkJaWYgKHZhbFtNQUpPUl0gJiYgKHZhbFtNQUpPUl0gIT0gTk9WQUxfMSkpIHsKKwkJCXByaW50ZigiXG5cdFN1cHBvcnRlZDogIik7CisJCQlqaiA9IHZhbFtNQUpPUl0gPDwgMTsKKwkJCWtrID0gbGlrZV9zdGQgPjQgPyBsaWtlX3N0ZC00OiAwOworCQkJZm9yIChpaSA9IDE0OyAoaWkgPjApJiYoaWk+a2spOyBpaS0tKSB7CisJCQkJaWYgKGpqICYgMHg4MDAwKSB7CisJCQkJCXByaW50ZigiJXUgIiwgaWkpOworCQkJCQlpZiAobGlrZV9zdGQgPCBpaSkgeworCQkJCQkJbGlrZV9zdGQgPSBpaTsKKwkJCQkJCWtrID0gbGlrZV9zdGQgPjQgPyBsaWtlX3N0ZC00OiAwOworCQkJCQl9CisJCQkJCWlmIChtaW5fc3RkID4gaWkpIG1pbl9zdGQgPSBpaTsKKwkJCQl9CisJCQkJamogPDw9IDE7CisJCQl9CisJCQlpZiAobGlrZV9zdGQgPCAzKSBsaWtlX3N0ZCA9IDM7CisJCX0KKwkJLyogRmlndXJlIG91dCB3aGF0IHN0YW5kYXJkIHRoZSBkZXZpY2UgaXMgdXNpbmcgaWYgaXQgaGFzbid0IHRvbGQKKwkJICogdXMuICBJZiB3ZSBrbm93IHRoZSBzdGQsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgdXNpbmcgYW55IG9mCisJCSAqIHRoZSB3b3JkcyBmcm9tIHRoZSBuZXh0IGxldmVsIHVwLiAgSXQgaGFwcGVucy4KKwkJICovCisJCWlmIChsaWtlX3N0ZCA8IHN0ZCkgbGlrZV9zdGQgPSBzdGQ7CisKKwkJaWYgKCgoc3RkID09IDUpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDYpKSkgJiYKKwkJCSgoKCh2YWxbQ01EU19TVVBQXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgJiYKKwkJCSgoCXZhbFtDTURTX1NVUFBfMV0gJiBDTURTX1c4MykgPiAweDAwZmYpKSB8fAorCQkJKCgoCXZhbFtDTURTX1NVUFBfMl0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSAmJgorCQkJKAl2YWxbQ01EU19TVVBQXzJdICYgQ01EU19XODQpICkgKQorCQkpIHsKKwkJCWxpa2Vfc3RkID0gNjsKKwkJfSBlbHNlIGlmICgoKHN0ZCA9PSA0KSB8fCAoIXN0ZCAmJiAobGlrZV9zdGQgPCA1KSkpICYmCisJCQkoKCgodmFsW0lOVEVHUklUWV0JJiBTSUcpID09IFNJR19WQUwpICYmICFjaGtzdW0pIHx8CisJCQkoKAl2YWxbSFdSU1RfUlNMVF0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSB8fAorCQkJKCgoCXZhbFtDTURTX1NVUFBfMV0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSAmJgorCQkJKCgJdmFsW0NNRFNfU1VQUF8xXSAmIENNRFNfVzgzKSA+IDB4MDAxZikpICkgKQorCQl7CisJCQlsaWtlX3N0ZCA9IDU7CisJCX0gZWxzZSBpZiAoKChzdGQgPT0gMykgfHwgKCFzdGQgJiYgKGxpa2Vfc3RkIDwgNCkpKSAmJgorCQkJCSgoKCh2YWxbQ01EU19TVVBQXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgJiYKKwkJCQkoKCgJdmFsW0NNRFNfU1VQUF8xXSAmIENNRFNfVzgzKSA+IDB4MDAwMCkgfHwKKwkJCQkoKAl2YWxbQ01EU19TVVBQXzBdICYgQ01EU19XODIpID4gMHgwMDBmKSkpIHx8CisJCQkJKCgJdmFsW0NBUEFCXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgfHwKKwkJCQkoKAl2YWxbV0hBVFNfVkFMSURdICYgT0tfVzg4KSAmJiB2YWxbVUxUUkFfRE1BXSkgfHwKKwkJCQkoKAl2YWxbUk1fU1RBVF0gJiBSTV9TVEFUX0JJVFMpID09IFJNX1NUQVRfU1VQKSApCisJCSkgeworCQkJbGlrZV9zdGQgPSA0OworCQl9IGVsc2UgaWYgKCgoc3RkID09IDIpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDMpKSkKKwkJICYmICgodmFsW0NNRFNfU1VQUF8xXSAmIFZBTElEKSA9PSBWQUxJRF9WQUwpCisJCSkgeworCQkJbGlrZV9zdGQgPSAzOworCQl9IGVsc2UgaWYgKCgoc3RkID09IDEpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDIpKSkgJiYKKwkJCQkoKHZhbFtDQVBBQl8wXSAmIChJT1JEWV9TVVAgfCBJT1JEWV9PRkYpKSB8fAorCQkJCSh2YWxbV0hBVFNfVkFMSURdICYgT0tfVzY0XzcwKSkgKQorCQl7CisJCQlsaWtlX3N0ZCA9IDI7CisJCX0KKworCQlpZiAoIXN0ZCkKKwkJCXByaW50ZigiXG5cdExpa2VseSB1c2VkOiAldVxuIiwgbGlrZV9zdGQpOworCQllbHNlIGlmIChsaWtlX3N0ZCA+IHN0ZCkKKwkJCXByaW50ZigiJiBzb21lIG9mICV1XG4iLCBsaWtlX3N0ZCk7CisJCWVsc2UKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfSBlbHNlIHsKKwkJLyogVEJEOiBkbyBDRFJPTSBzdHVmZiBtb3JlIHRob3JvdWdobHkuICBGb3Igbm93Li4uICovCisJCWtrID0gMDsKKwkJaWYgKHZhbFtDRFJfTUlOT1JdID09IDkpIHsKKwkJCWtrID0gMTsKKwkJCXByaW50ZigiXG5cdFVzZWQ6IEFUQVBJIGZvciBDRC1ST01zLCBTRkYtODAyMGksIHIyLjUiKTsKKwkJfQorCQlpZiAodmFsW0NEUl9NQUpPUl0gJiYgKHZhbFtDRFJfTUFKT1JdICE9Tk9WQUxfMSkpIHsKKwkJCWtrID0gMTsKKwkJCXByaW50ZigiXG5cdFN1cHBvcnRlZDogQ0QtUk9NIEFUQVBJIik7CisJCQlqaiA9IHZhbFtDRFJfTUFKT1JdID4+IDE7CisJCQlmb3IgKGlpID0gMTsgaWkgPCAxNTsgaWkrKykgeworCQkJCWlmIChqaiAmIDB4MDAwMSkgcHJpbnRmKCItJXUgIiwgaWkpOworCQkJCWpqID4+PSAxOworCQkJfQorCQl9CisJCXB1dHMoa2sgPyAiIiA6ICJcblx0TGlrZWx5IHVzZWQgQ0QtUk9NIEFUQVBJLTEiKTsKKwkJLyogdGhlIGNkcm9tIHN0dWZmIGlzIG1vcmUgbGlrZSBBVEEtMiB0aGFuIGFueXRoaW5nIGVsc2UsIHNvOiAqLworCQlsaWtlX3N0ZCA9IDI7CisJfQorCisJaWYgKG1pbl9zdGQgPT0gMHhmZmZmKQorCQltaW5fc3RkID0gbGlrZV9zdGQgPiA0ID8gbGlrZV9zdGQgLSAzIDogMTsKKworCXByaW50ZigiQ29uZmlndXJhdGlvbjpcbiIpOworCS8qIG1vcmUgaW5mbyBmcm9tIHRoZSBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gd29yZCAqLworCWlmICgoZXFwdCAhPSBDRFJPTSkgJiYgKGxpa2Vfc3RkID09IDEpKSB7CisJCWpqID0gdmFsW0dFTl9DT05GSUddID4+IDE7CisJCWZvciAoaWkgPSAxOyBpaSA8IDE1OyBpaSsrKSB7CisJCQlpZiAoamogJiAweDAwMDEpCisJCQkJcHJpbnRmKCJcdCVzXG4iLCBudGhfc3RyaW5nKGF0YTFfY2ZnX3N0ciwgaWkpKTsKKwkJCWpqID4+PTE7CisJCX0KKwl9CisJaWYgKGRldiA9PSBBVEFQSV9ERVYpIHsKKwkJaWYgKCh2YWxbR0VOX0NPTkZJR10gJiBEUlFfUkVTUE9OU0VfVElNRSkgPT0gIERSUV8zTVNfVkFMKQorCQkJc3RybmcgPSAiM21zIjsKKwkJZWxzZSBpZiAoKHZhbFtHRU5fQ09ORklHXSAmIERSUV9SRVNQT05TRV9USU1FKSA9PSAgRFJRX0lOVFJfVkFMKQorCQkJc3RybmcgPSAiPD0xMG1zIHdpdGggSU5UUlEiOworCQllbHNlIGlmICgodmFsW0dFTl9DT05GSUddICYgRFJRX1JFU1BPTlNFX1RJTUUpID09ICBEUlFfNTBVU19WQUwpCisJCQlzdHJuZyA9IjUwdXMiOworCQllbHNlCisJCQlzdHJuZyA9ICJ1bmtub3duIjsKKwkJcHJpbnRmKCJcdERSUSByZXNwb25zZTogJXNcblx0UGFja2V0IHNpemU6ICIsIHN0cm5nKTsgLyogRGF0YSBSZXF1ZXN0IChEUlEpICovCisKKwkJaWYgKCh2YWxbR0VOX0NPTkZJR10gJiBQS1RfU0laRV9TVVBQT1JURUQpID09IFBLVF9TSVpFXzEyX1ZBTCkKKwkJCXN0cm5nID0gIjEyIGJ5dGVzIjsKKwkJZWxzZSBpZiAoKHZhbFtHRU5fQ09ORklHXSAmIFBLVF9TSVpFX1NVUFBPUlRFRCkgPT0gUEtUX1NJWkVfMTZfVkFMKQorCQkJc3RybmcgPSAiMTYgYnl0ZXMiOworCQllbHNlCisJCQlzdHJuZyA9ICJ1bmtub3duIjsKKwkJcHV0cyhzdHJuZyk7CisJfSBlbHNlIHsKKwkJLyogYWRkcmVzc2luZy4uLkNIUz8gU2VlIHNlY3Rpb24gNi4yIG9mIEFUQSBzcGVjcyA0IG9yIDUgKi8KKwkJbGwgPSAodWludDMyX3QpdmFsW0xCQV9TRUNUU19NU0JdIDw8IDE2IHwgdmFsW0xCQV9TRUNUU19MU0JdOworCQltbSA9IDA7CisJCWJiYmlnID0gMDsKKwkJaWYgKChsbCA+IDB4MDBGQkZDMTApICYmICghdmFsW0xDWUxTXSkpCisJCQlwcmludGYoIlx0Q0hTIGFkZHJlc3Npbmcgbm90IHN1cHBvcnRlZFxuIik7CisJCWVsc2UgeworCQkJamogPSB2YWxbV0hBVFNfVkFMSURdICYgT0tfVzU0XzU4OworCQkJcHJpbnRmKCJcdExvZ2ljYWxcdFx0bWF4XHRjdXJyZW50XG4iCisJCQkJIlx0Y3lsaW5kZXJzXHQldVx0JXVcbiIKKwkJCQkiXHRoZWFkc1x0XHQldVx0JXVcbiIKKwkJCQkiXHRzZWN0b3JzL3RyYWNrXHQldVx0JXVcbiIKKwkJCQkiXHQtLVxuIiwKKwkJCQl2YWxbTENZTFNdLAorCQkJCWpqID8gdmFsW0xDWUxTX0NVUl0gOiAwLAorCQkJCXZhbFtMSEVBRFNdLAorCQkJCWpqID8gdmFsW0xIRUFEU19DVVJdIDogMCwKKwkJCQl2YWxbTFNFQ1RTXSwKKwkJCQlqaiA/IHZhbFtMU0VDVFNfQ1VSXSA6IDApOworCisJCQlpZiAoKG1pbl9zdGQgPT0gMSkgJiYgKHZhbFtUUkFDS19CWVRFU10gfHwgdmFsW1NFQ1RfQllURVNdKSkKKwkJCQlwcmludGYoIlx0Ynl0ZXMvdHJhY2s6ICV1XHRieXRlcy9zZWN0b3I6ICV1XG4iLAorCQkJCQl2YWxbVFJBQ0tfQllURVNdLCB2YWxbU0VDVF9CWVRFU10pOworCisJCQlpZiAoamopIHsKKwkJCQltbSA9ICh1aW50MzJfdCl2YWxbQ0FQQUNJVFlfTVNCXSA8PCAxNiB8IHZhbFtDQVBBQ0lUWV9MU0JdOworCQkJCWlmIChsaWtlX3N0ZCA8IDMpIHsKKwkJCQkJLyogY2hlY2sgRW5kaWFuIG9mIGNhcGFjaXR5IGJ5dGVzICovCisJCQkJCW5uID0gdmFsW0xDWUxTX0NVUl0gKiB2YWxbTEhFQURTX0NVUl0gKiB2YWxbTFNFQ1RTX0NVUl07CisJCQkJCW9vID0gKHVpbnQzMl90KXZhbFtDQVBBQ0lUWV9MU0JdIDw8IDE2IHwgdmFsW0NBUEFDSVRZX01TQl07CisJCQkJCWlmIChhYnMobW0gLSBubikgPiBhYnMob28gLSBubikpCisJCQkJCQltbSA9IG9vOworCQkJCX0KKwkJCQlwcmludGYoIlx0Q0hTIGN1cnJlbnQgYWRkcmVzc2FibGUgc2VjdG9yczolMTF1XG4iLCBtbSk7CisJCQl9CisJCX0KKwkJLyogTEJBIGFkZHJlc3NpbmcgKi8KKwkJcHJpbnRmKCJcdExCQSAgICB1c2VyIGFkZHJlc3NhYmxlIHNlY3RvcnM6JTExdVxuIiwgbGwpOworCQlpZiAoKCh2YWxbQ01EU19TVVBQXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkKKwkJICYmICh2YWxbQ01EU19TVVBQXzFdICYgU1VQUE9SVF80OF9CSVQpCisJCSkgeworCQkJYmJiaWcgPSAodWludDY0X3QpdmFsW0xCQV82NF9NU0JdIDw8IDQ4IHwKKwkJCSAgICAgICAgKHVpbnQ2NF90KXZhbFtMQkFfNDhfTVNCXSA8PCAzMiB8CisJCQkgICAgICAgICh1aW50NjRfdCl2YWxbTEJBX01JRF0gPDwgMTYgfAorCQkJCQl2YWxbTEJBX0xTQl07CisJCQlwcmludGYoIlx0TEJBNDggIHVzZXIgYWRkcmVzc2FibGUgc2VjdG9yczolMTEiUFJJdTY0IlxuIiwgYmJiaWcpOworCQl9CisKKwkJaWYgKCFiYmJpZykKKwkJCWJiYmlnID0gKHVpbnQ2NF90KShsbD5tbSA/IGxsIDogbW0pOyAvKiAjIDUxMiBieXRlIGJsb2NrcyAqLworCQlwcmludGYoIlx0ZGV2aWNlIHNpemUgd2l0aCBNID0gMTAyNCoxMDI0OiAlMTEiUFJJdTY0IiBNQnl0ZXNcbiIsIGJiYmlnPj4xMSk7CisJCWJiYmlnID0gKGJiYmlnIDw8IDkpIC8gMTAwMDAwMDsKKwkJcHJpbnRmKCJcdGRldmljZSBzaXplIHdpdGggTSA9IDEwMDAqMTAwMDogJTExIlBSSXU2NCIgTUJ5dGVzICIsIGJiYmlnKTsKKworCQlpZiAoYmJiaWcgPiAxMDAwKQorCQkJcHJpbnRmKCIoJSJQUkl1NjQiIEdCKVxuIiwgYmJiaWcvMTAwMCk7CisJCWVsc2UKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJLyogaHcgc3VwcG9ydCBvZiBjb21tYW5kcyAoY2FwYWJpbGl0aWVzKSAqLworCXByaW50ZigiQ2FwYWJpbGl0aWVzOlxuXHQiKTsKKworCWlmIChkZXYgPT0gQVRBUElfREVWKSB7CisJCWlmIChlcXB0ICE9IENEUk9NICYmICh2YWxbQ0FQQUJfMF0gJiBDTURfUV9TVVApKQorCQkJcHJpbnRmKCJDbWQgcXVldWluZywgIik7CisJCWlmICh2YWxbQ0FQQUJfMF0gJiBPVkxQX1NVUCkKKwkJCXByaW50ZigiQ21kIG92ZXJsYXAsICIpOworCX0KKwlpZiAodmFsW0NBUEFCXzBdICYgTEJBX1NVUCkgcHJpbnRmKCJMQkEsICIpOworCisJaWYgKGxpa2Vfc3RkICE9IDEpIHsKKwkJcHJpbnRmKCJJT1JEWSVzKGNhbiVzIGJlIGRpc2FibGVkKVxuIiwKKwkJCSEodmFsW0NBUEFCXzBdICYgSU9SRFlfU1VQKSA/ICIobWF5IGJlKSIgOiAiIiwKKwkJCSh2YWxbQ0FQQUJfMF0gJiBJT1JEWV9PRkYpID8gIiIgOiJub3QiKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCJubyBJT1JEWVxuIik7CisKKwlpZiAoKGxpa2Vfc3RkID09IDEpICYmIHZhbFtCVUZfVFlQRV0pIHsKKwkJcHJpbnRmKCJcdEJ1ZmZlciB0eXBlOiAlMDR4OiAlcyVzXG4iLCB2YWxbQlVGX1RZUEVdLAorCQkJKHZhbFtCVUZfVFlQRV0gPCAyKSA/ICJzaW5nbGUgcG9ydCwgc2luZ2xlLXNlY3RvciIgOiAiZHVhbCBwb3J0LCBtdWx0aS1zZWN0b3IiLAorCQkJKHZhbFtCVUZfVFlQRV0gPiAyKSA/ICIgd2l0aCByZWFkIGNhY2hpbmcgYWJpbGl0eSIgOiAiIik7CisJfQorCisJaWYgKChtaW5fc3RkID09IDEpICYmICh2YWxbQlVGRkVSX19TSVpFXSAmJiAodmFsW0JVRkZFUl9fU0laRV0gIT0gTk9WQUxfMSkpKSB7CisJCXByaW50ZigiXHRCdWZmZXIgc2l6ZTogJS4xZmtCXG4iLCAoZmxvYXQpdmFsW0JVRkZFUl9fU0laRV0vMik7CisJfQorCWlmICgobWluX3N0ZCA8IDQpICYmICh2YWxbUldfTE9OR10pKSB7CisJCXByaW50ZigiXHRieXRlcyBhdmFpbCBvbiByL3cgbG9uZzogJXVcbiIsIHZhbFtSV19MT05HXSk7CisJfQorCWlmICgoZXFwdCAhPSBDRFJPTSkgJiYgKGxpa2Vfc3RkID4gMykpIHsKKwkJcHJpbnRmKCJcdFF1ZXVlIGRlcHRoOiAldVxuIiwgKHZhbFtRVUVVRV9ERVBUSF0gJiBERVBUSF9CSVRTKSArIDEpOworCX0KKworCWlmIChkZXYgPT0gQVRBX0RFVikgeworCQlpZiAobGlrZV9zdGQgPT0gMSkKKwkJCXByaW50ZigiXHRDYW4lcyBwZXJmb3JtIGRvdWJsZS13b3JkIElPXG4iLCAoIXZhbFtEV09SRF9JT10pID8gIm5vdCIgOiAiIik7CisJCWVsc2UgeworCQkJcHJpbnRmKCJcdFN0YW5kYnkgdGltZXIgdmFsdWVzOiBzcGVjJ2QgYnkgJXMiLAorCQkJCSh2YWxbQ0FQQUJfMF0gJiBTVERfU1RCWSkgPyAic3RhbmRhcmQiIDogInZlbmRvciIpOworCQkJaWYgKChsaWtlX3N0ZCA+IDMpICYmICgodmFsW0NBUEFCXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkpCisJCQkJcHJpbnRmKCIsICVzIGRldmljZSBzcGVjaWZpYyBtaW5pbXVtXG4iLAorCQkJCQkodmFsW0NBUEFCXzFdICYgTUlOX1NUQU5EQllfVElNRVIpID8gIndpdGgiIDogIm5vIik7CisJCQllbHNlCisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCQlwcmludGYoIlx0Ui9XIG11bHRpcGxlIHNlY3RvciB0cmFuc2ZlcjogIik7CisJCWlmICgobGlrZV9zdGQgPCAzKSAmJiAhKHZhbFtTRUNUT1JfWEZFUl9NQVhdICYgU0VDVE9SX1hGRVIpKQorCQkJcHJpbnRmKCJub3Qgc3VwcG9ydGVkXG4iKTsKKwkJZWxzZSB7CisJCQlwcmludGYoIk1heCA9ICV1XHRDdXJyZW50ID0gIiwgdmFsW1NFQ1RPUl9YRkVSX01BWF0gJiBTRUNUT1JfWEZFUik7CisJCQlpZiAodmFsW1NFQ1RPUl9YRkVSX0NVUl0gJiBNVUxUSVBMRV9TRVRUSU5HX1ZBTElEKQorCQkJCXByaW50ZigiJXVcbiIsIHZhbFtTRUNUT1JfWEZFUl9DVVJdICYgU0VDVE9SX1hGRVIpOworCQkJZWxzZQorCQkJCXByaW50ZigiP1xuIik7CisJCX0KKwkJaWYgKChsaWtlX3N0ZCA+IDMpICYmICh2YWxbQ01EU19TVVBQXzFdICYgMHgwMDA4KSkgeworCQkJLyogV2UgcHJpbnQgb3V0IGVsc2V3aGVyZSB3aGV0aGVyIHRoZSBBUE0gZmVhdHVyZSBpcyBlbmFibGVkIG9yCisJCQkgICBub3QuICBJZiBpdCdzIG5vdCBlbmFibGVkLCBsZXQncyBub3QgcmVwZWF0IHRoZSBpbmZvOyBqdXN0IHByaW50CisJCQkgICBub3RoaW5nIGhlcmUuICovCisJCQlwcmludGYoIlx0QWR2YW5jZWRQTSBsZXZlbDogIik7CisJCQlpZiAoKHZhbFtBRFZfUFdSXSAmIDB4RkYwMCkgPT0gMHg0MDAwKSB7CisJCQkJdWludDhfdCBhcG1fbGV2ZWwgPSB2YWxbQURWX1BXUl0gJiAweDAwRkY7CisJCQkJcHJpbnRmKCIldSAoMHgleClcbiIsIGFwbV9sZXZlbCwgYXBtX2xldmVsKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwcmludGYoInVua25vd24gc2V0dGluZyAoMHglMDR4KVxuIiwgdmFsW0FEVl9QV1JdKTsKKwkJfQorCQlpZiAobGlrZV9zdGQgPiA1ICYmIHZhbFtBQ09VU1RJQ10pIHsKKwkJCXByaW50ZigiXHRSZWNvbW1lbmRlZCBhY291c3RpYyBtYW5hZ2VtZW50IHZhbHVlOiAldSwgY3VycmVudCB2YWx1ZTogJXVcbiIsCisJCQkJKHZhbFtBQ09VU1RJQ10gPj4gOCkgJiAweDAwZmYsCisJCQkJdmFsW0FDT1VTVElDXSAmIDB4MDBmZik7CisJCX0KKwl9IGVsc2UgeworCQkgLyogQVRBUEkgKi8KKwkJaWYgKGVxcHQgIT0gQ0RST00gJiYgKHZhbFtDQVBBQl8wXSAmIFNXUlNUX1JFUSkpCisJCQlwcmludGYoIlx0QVRBIHN3IHJlc2V0IHJlcXVpcmVkXG4iKTsKKworCQlpZiAodmFsW1BLVF9SRUxdIHx8IHZhbFtTVkNfTkJTWV0pIHsKKwkJCXByaW50ZigiXHRPdmVybGFwIHN1cHBvcnQ6Iik7CisJCQlpZiAodmFsW1BLVF9SRUxdKQorCQkJCXByaW50ZigiICV1dXMgdG8gcmVsZWFzZSBidXMuIiwgdmFsW1BLVF9SRUxdKTsKKwkJCWlmICh2YWxbU1ZDX05CU1ldKQorCQkJCXByaW50ZigiICV1dXMgdG8gY2xlYXIgQlNZIGFmdGVyIFNFUlZJQ0UgY21kLiIsCisJCQkJCXZhbFtTVkNfTkJTWV0pOworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCX0KKworCS8qIERNQSBzdHVmZi4gQ2hlY2sgdGhhdCBvbmx5IG9uZSBETUEgbW9kZSBpcyBzZWxlY3RlZC4gKi8KKwlwcmludGYoIlx0RE1BOiAiKTsKKwlpZiAoISh2YWxbQ0FQQUJfMF0gJiBETUFfU1VQKSkKKwkJcHJpbnRmKCJub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJaWYgKHZhbFtETUFfTU9ERV0gJiYgIXZhbFtTSU5HTEVfRE1BXSAmJiAhdmFsW01VTFRJX0RNQV0pCisJCQlwcmludGYoIiBzZG1hJXVcbiIsICh2YWxbRE1BX01PREVdICYgTU9ERSkgPj4gOCk7CisJCWlmICh2YWxbU0lOR0xFX0RNQV0pIHsKKwkJCWpqID0gdmFsW1NJTkdMRV9ETUFdOworCQkJa2sgPSB2YWxbU0lOR0xFX0RNQV0gPj4gODsKKwkJCWVycl9kbWEgKz0gbW9kZV9sb29wKGpqLCBraywgJ3MnLCAmaGF2ZV9tb2RlKTsKKwkJfQorCQlpZiAodmFsW01VTFRJX0RNQV0pIHsKKwkJCWpqID0gdmFsW01VTFRJX0RNQV07CisJCQlrayA9IHZhbFtNVUxUSV9ETUFdID4+IDg7CisJCQllcnJfZG1hICs9IG1vZGVfbG9vcChqaiwga2ssICdtJywgJmhhdmVfbW9kZSk7CisJCX0KKwkJaWYgKCh2YWxbV0hBVFNfVkFMSURdICYgT0tfVzg4KSAmJiB2YWxbVUxUUkFfRE1BXSkgeworCQkJamogPSB2YWxbVUxUUkFfRE1BXTsKKwkJCWtrID0gdmFsW1VMVFJBX0RNQV0gPj4gODsKKwkJCWVycl9kbWEgKz0gbW9kZV9sb29wKGpqLCBraywgJ3UnLCAmaGF2ZV9tb2RlKTsKKwkJfQorCQlpZiAoZXJyX2RtYSB8fCAhaGF2ZV9tb2RlKSBwcmludGYoIig/KSIpOworCQliYl9wdXRjaGFyKCdcbicpOworCisJCWlmICgoZGV2ID09IEFUQVBJX0RFVikgJiYgKGVxcHQgIT0gQ0RST00pICYmICh2YWxbQ0FQQUJfMF0gJiBETUFfSUxfU1VQKSkKKwkJCXByaW50ZigiXHRcdEludGVybGVhdmVkIERNQSBzdXBwb3J0XG4iKTsKKworCQlpZiAoKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApCisJCSAmJiAodmFsW0RNQV9USU1FX01JTl0gfHwgdmFsW0RNQV9USU1FX05PUk1dKQorCQkpIHsKKwkJCXByaW50ZigiXHRcdEN5Y2xlIHRpbWU6Iik7CisJCQlpZiAodmFsW0RNQV9USU1FX01JTl0pIHByaW50ZigiIG1pbj0ldW5zIiwgdmFsW0RNQV9USU1FX01JTl0pOworCQkJaWYgKHZhbFtETUFfVElNRV9OT1JNXSkgcHJpbnRmKCIgcmVjb21tZW5kZWQ9JXVucyIsIHZhbFtETUFfVElNRV9OT1JNXSk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorCisJLyogUHJvZ3JhbW1lZCBJTyBzdHVmZiAqLworCXByaW50ZigiXHRQSU86ICIpOworCS8qIElmIGEgZHJpdmUgc3VwcG9ydHMgbW9kZSBuIChlLmcuIDMpLCBpdCBhbHNvIHN1cHBvcnRzIGFsbCBtb2RlcyBsZXNzCisJICogdGhhbiBuIChlLmcuIDMsIDIsIDEgYW5kIDApLiAgUHJpbnQgYWxsIHRoZSBtb2Rlcy4gKi8KKwlpZiAoKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApICYmICh2YWxbQURWX1BJT19NT0RFU10gJiBQSU9fU1VQKSkgeworCQlqaiA9ICgodmFsW0FEVl9QSU9fTU9ERVNdICYgUElPX1NVUCkgPDwgMykgfCAweDAwMDc7CisJCWZvciAoaWkgPSAwOyBpaSA8PSBQSU9fTU9ERV9NQVg7IGlpKyspIHsKKwkJCWlmIChqaiAmIDB4MDAwMSkgcHJpbnRmKCJwaW8lZCAiLCBpaSk7CisJCQlqaiA+Pj0xOworCQl9CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfSBlbHNlIGlmICgoKG1pbl9zdGQgPCA1KSB8fCAoZXFwdCA9PSBDRFJPTSkpICYmICh2YWxbUElPX01PREVdICYgTU9ERSkpIHsKKwkJZm9yIChpaSA9IDA7IGlpIDw9IHZhbFtQSU9fTU9ERV0+Pjg7IGlpKyspCisJCQlwcmludGYoInBpbyVkICIsIGlpKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9IGVsc2UKKwkJcHV0cygidW5rbm93biIpOworCisJaWYgKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApIHsKKwkJaWYgKHZhbFtQSU9fTk9fRkxPV10gfHwgdmFsW1BJT19GTE9XXSkgeworCQkJcHJpbnRmKCJcdFx0Q3ljbGUgdGltZToiKTsKKwkJCWlmICh2YWxbUElPX05PX0ZMT1ddKQorCQkJCXByaW50ZigiIG5vIGZsb3cgY29udHJvbD0ldW5zIiwgdmFsW1BJT19OT19GTE9XXSk7CisJCQlpZiAodmFsW1BJT19GTE9XXSkKKwkJCQlwcmludGYoIiAgSU9SRFkgZmxvdyBjb250cm9sPSV1bnMiLCB2YWxbUElPX0ZMT1ddKTsKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCX0KKwl9CisKKwlpZiAoKHZhbFtDTURTX1NVUFBfMV0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSB7CisJCXByaW50ZigiQ29tbWFuZHMvZmVhdHVyZXM6XG4iCisJCQkiXHRFbmFibGVkXHRTdXBwb3J0ZWQ6XG4iKTsKKwkJamogPSB2YWxbQ01EU19TVVBQXzBdOworCQlrayA9IHZhbFtDTURTX0VOXzBdOworCQlmb3IgKGlpID0gMDsgaWkgPCBOVU1fQ01EX0ZFQVRfU1RSOyBpaSsrKSB7CisJCQljb25zdCBjaGFyICpmZWF0X3N0ciA9IG50aF9zdHJpbmcoY21kX2ZlYXRfc3RyLCBpaSk7CisJCQlpZiAoKGpqICYgMHg4MDAwKSAmJiAoKmZlYXRfc3RyICE9ICdcMCcpKSB7CisJCQkJcHJpbnRmKCJcdCVzXHQlc1xuIiwgKGtrICYgMHg4MDAwKSA/ICIgICAqIiA6ICIiLCBmZWF0X3N0cik7CisJCQl9CisJCQlqaiA8PD0gMTsKKwkJCWtrIDw8PSAxOworCQkJaWYgKGlpICUgMTYgPT0gMTUpIHsKKwkJCQlqaiA9IHZhbFtDTURTX1NVUFBfMCsxKyhpaS8xNildOworCQkJCWtrID0gdmFsW0NNRFNfRU5fMCsxKyhpaS8xNildOworCQkJfQorCQkJaWYgKGlpID09IDMxKSB7CisJCQkJaWYgKCh2YWxbQ01EU19TVVBQXzJdICYgVkFMSUQpICE9IFZBTElEX1ZBTCkKKwkJCQkJaWkgKz0xNjsKKwkJCX0KKwkJfQorCX0KKwkvKiBSZW1vdmFibGUgTWVkaWEgU3RhdHVzIE5vdGlmaWNhdGlvbiBmZWF0dXJlIHNldCAqLworCWlmICgodmFsW1JNX1NUQVRdICYgUk1fU1RBVF9CSVRTKSA9PSBSTV9TVEFUX1NVUCkKKwkJcHJpbnRmKCJcdCVzIHN1cHBvcnRlZFxuIiwgbnRoX3N0cmluZyhjbWRfZmVhdF9zdHIsIDI3KSk7CisKKwkvKiBzZWN1cml0eSAqLworCWlmICgoZXFwdCAhPSBDRFJPTSkgJiYgKGxpa2Vfc3RkID4gMykKKwkgJiYgKHZhbFtTRUNVX1NUQVRVU10gfHwgdmFsW0VSQVNFX1RJTUVdIHx8IHZhbFtFTkhfRVJBU0VfVElNRV0pCisJKSB7CisJCXByaW50ZigiU2VjdXJpdHk6XG4iKTsKKwkJaWYgKHZhbFtQU1dEX0NPREVdICYmICh2YWxbUFNXRF9DT0RFXSAhPSBOT1ZBTF8xKSkKKwkJCXByaW50ZigiXHRNYXN0ZXIgcGFzc3dvcmQgcmV2aXNpb24gY29kZSA9ICV1XG4iLCB2YWxbUFNXRF9DT0RFXSk7CisJCWpqID0gdmFsW1NFQ1VfU1RBVFVTXTsKKwkJaWYgKGpqKSB7CisJCQlmb3IgKGlpID0gMDsgaWkgPCBOVU1fU0VDVV9TVFI7IGlpKyspIHsKKwkJCQlwcmludGYoIlx0JXNcdCVzXG4iLAorCQkJCQkoIShqaiAmIDB4MDAwMSkpID8gIm5vdCIgOiAiIiwKKwkJCQkJbnRoX3N0cmluZyhzZWN1X3N0ciwgaWkpKTsKKwkJCQlqaiA+Pj0xOworCQkJfQorCQkJaWYgKHZhbFtTRUNVX1NUQVRVU10gJiBTRUNVX0VOQUJMRUQpIHsKKwkJCQlwcmludGYoIlx0U2VjdXJpdHkgbGV2ZWwgJXNcbiIsCisJCQkJCSh2YWxbU0VDVV9TVEFUVVNdICYgU0VDVV9MRVZFTCkgPyAibWF4aW11bSIgOiAiaGlnaCIpOworCQkJfQorCQl9CisJCWpqID0gIHZhbFtFUkFTRV9USU1FXSAgICAgJiBFUkFTRV9CSVRTOworCQlrayA9ICB2YWxbRU5IX0VSQVNFX1RJTUVdICYgRVJBU0VfQklUUzsKKwkJaWYgKGpqIHx8IGtrKSB7CisJCQliYl9wdXRjaGFyKCdcdCcpOworCQkJaWYgKGpqKSBwcmludGYoIiV1bWluIGZvciAlc1NFQ1VSSVRZIEVSQVNFIFVOSVQuICIsIGpqPT1FUkFTRV9CSVRTID8gNTA4IDogamo8PDEsICIiKTsKKwkJCWlmIChraykgcHJpbnRmKCIldW1pbiBmb3IgJXNTRUNVUklUWSBFUkFTRSBVTklULiAiLCBraz09RVJBU0VfQklUUyA/IDUwOCA6IGtrPDwxLCAiRU5IQU5DRUQgIik7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorCisJLyogcmVzZXQgcmVzdWx0ICovCisJamogPSB2YWxbSFdSU1RfUlNMVF07CisJaWYgKChqaiAmIFZBTElEKSA9PSBWQUxJRF9WQUwpIHsKKwkJb28gPSAoamogJiBSU1QwKTsKKwkJaWYgKCFvbykKKwkJCWpqID4+PSA4OworCQlpZiAoKGpqICYgREVWX0RFVCkgPT0gSlVNUEVSX1ZBTCkKKwkJCXN0cm5nID0gIiBkZXRlcm1pbmVkIGJ5IHRoZSBqdW1wZXIiOworCQllbHNlIGlmICgoamogJiBERVZfREVUKSA9PSBDU0VMX1ZBTCkKKwkJCXN0cm5nID0gIiBkZXRlcm1pbmVkIGJ5IENTRUwiOworCQllbHNlCisJCQlzdHJuZyA9ICIiOworCQlwcmludGYoIkhXIHJlc2V0IHJlc3VsdHM6XG4iCisJCQkiXHRDQkxJRC0gJXMgVmloXG4iCisJCQkiXHREZXZpY2UgbnVtID0gJWklc1xuIiwKKwkJCSh2YWxbSFdSU1RfUlNMVF0gJiBDQkxJRCkgPyAiYWJvdmUiIDogImJlbG93IiwKKwkJCSEob28pLCBzdHJuZyk7CisJfQorCisJLyogbW9yZSBzdHVmZiBmcm9tIHN0ZCA1ICovCisJaWYgKChsaWtlX3N0ZCA+IDQpICYmIChlcXB0ICE9IENEUk9NKSkgeworCQlpZiAodmFsW0NGQV9QV1JfTU9ERV0gJiBWQUxJRF9XMTYwKSB7CisJCQlwcmludGYoIkNGQSBwb3dlciBtb2RlIDE6XG4iCisJCQkJIlx0JXMlc1xuIiwKKwkJCQkodmFsW0NGQV9QV1JfTU9ERV0gJiBQV1JfTU9ERV9PRkYpID8gImRpc2FibGVkIiA6ICJlbmFibGVkIiwKKwkJCQkodmFsW0NGQV9QV1JfTU9ERV0gJiBQV1JfTU9ERV9SRVEpID8gIiBhbmQgcmVxdWlyZWQgYnkgc29tZSBjb21tYW5kcyIgOiAiIik7CisJCQlpZiAodmFsW0NGQV9QV1JfTU9ERV0gJiBNQVhfQU1QUykKKwkJCQlwcmludGYoIlx0TWF4aW11bSBjdXJyZW50ID0gJXVtYVxuIiwgdmFsW0NGQV9QV1JfTU9ERV0gJiBNQVhfQU1QUyk7CisJCX0KKwkJaWYgKCh2YWxbSU5URUdSSVRZXSAmIFNJRykgPT0gU0lHX1ZBTCkgeworCQkJcHJpbnRmKCJDaGVja3N1bTogJXNjb3JyZWN0XG4iLCBjaGtzdW0gPyAiaW4iIDogIiIpOworCQl9CisJfQorCisJZXhpdChFWElUX1NVQ0NFU1MpOworfQorI2VuZGlmCisKKy8vIEhpc3RvcmljYWxseSwgaWYgdGhlcmUgd2FzIG5vIEhESU9fT0JTT0xFVEVfSURFTlRJVFksIHRoZW4KKy8vIHRoZW4gdGhlIEhESU9fR0VUX0lERU5USVRZIG9ubHkgcmV0dXJuZWQgMTQyIGJ5dGVzLgorLy8gT3RoZXJ3aXNlLCBIRElPX09CU09MRVRFX0lERU5USVRZIHJldHVybnMgMTQyIGJ5dGVzLAorLy8gYW5kIEhESU9fR0VUX0lERU5USVRZIHJldHVybnMgNTEyIGJ5dGVzLiAgQnV0IHRoZSBsYXRlc3QKKy8vIDIuNS54eCBrZXJuZWxzIG5vIGxvbmdlciBkZWZpbmUgSERJT19PQlNPTEVURV9JREVOVElUWQorLy8gKHdoaWNoIHRoZXkgc2hvdWxkLCBidXQgdGhleSBzaG91bGQganVzdCByZXR1cm4gLUVJTlZBTCkuCisvLworLy8gU28uLiB3ZSBtdXN0IG5vdyBhc3N1bWUgdGhhdCBIRElPX0dFVF9JREVOVElUWSByZXR1cm5zIDUxMiBieXRlcy4KKy8vIE9uIGEgcmVhbGx5IG9sZCBzeXN0ZW0sIGl0IHdpbGwgbm90LCBhbmQgd2Ugd2lsbCBiZSBjb25mdXNlZC4KKy8vIFRvbyBiYWQsIHJlYWxseS4KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkKK3N0YXRpYyBjb25zdCBjaGFyIGNmZ19zdHJbXSBBTElHTjEgPQorCSIiIlwwIiAgICAgICAgICAgICJIYXJkU2VjdCIiXDAiICAgIlNvZnRTZWN0IiJcMCIgICJOb3RNRk0iIlwwIgorCSJIZFN3PjE1dVNlYyIiXDAiICJTcGluTW90Q3RsIiJcMCIgIkZpeGVkIiJcMCIgICAgICJSZW1vdmVhYmxlIiJcMCIKKwkiRFRSPD01TWJzIiJcMCIgICAiRFRSPjVNYnMiIlwwIiAgICJEVFI+MTBNYnMiIlwwIiAiUm90U3BkVG9sPi41JSIiXDAiCisJImRTdGJPZmYiIlwwIiAgICAgIlRya09mZiIiXDAiICAgICAiRm10R2FwUmVxIiJcMCIgIm5vbk1hZ25ldGljIgorOworCitzdGF0aWMgY29uc3QgY2hhciBCdWZmVHlwZVtdIEFMSUdOMSA9CisJInVua25vd24iIlwwIiAgICAgIjFTZWN0IiJcMCIgICAgICAiRHVhbFBvcnQiIlwwIiAgIkR1YWxQb3J0Q2FjaGUiCis7CisKK3N0YXRpYyBOT0lOTElORSB2b2lkIGR1bXBfaWRlbnRpdHkoY29uc3Qgc3RydWN0IGhkX2RyaXZlaWQgKmlkKQoreworCWludCBpOworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICppZF9yZWdzID0gKGNvbnN0IHZvaWQqKSBpZDsKKworCXByaW50ZigiXG4gTW9kZWw9JS40MHMsIEZ3UmV2PSUuOHMsIFNlcmlhbE5vPSUuMjBzXG4gQ29uZmlnPXsiLAorCQkJCWlkLT5tb2RlbCwgaWQtPmZ3X3JldiwgaWQtPnNlcmlhbF9ubyk7CisJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrKSB7CisJCWlmIChpZC0+Y29uZmlnICYgKDE8PGkpKQorCQkJcHJpbnRmKCIgJXMiLCBudGhfc3RyaW5nKGNmZ19zdHIsIGkpKTsKKwl9CisJcHJpbnRmKCIgfVxuIFJhd0NIUz0ldS8ldS8ldSwgVHJrU2l6ZT0ldSwgU2VjdFNpemU9JXUsIEVDQ2J5dGVzPSV1XG4iCisJCSIgQnVmZlR5cGU9KCV1KSAlcywgQnVmZlNpemU9JXVrQiwgTWF4TXVsdFNlY3Q9JXUiLAorCQlpZC0+Y3lscywgaWQtPmhlYWRzLCBpZC0+c2VjdG9ycywgaWQtPnRyYWNrX2J5dGVzLAorCQlpZC0+c2VjdG9yX2J5dGVzLCBpZC0+ZWNjX2J5dGVzLAorCQlpZC0+YnVmX3R5cGUsCisJCW50aF9zdHJpbmcoQnVmZlR5cGUsIChpZC0+YnVmX3R5cGUgPiAzKSA/IDAgOiBpZC0+YnVmX3R5cGUpLAorCQlpZC0+YnVmX3NpemUvMiwgaWQtPm1heF9tdWx0c2VjdCk7CisJaWYgKGlkLT5tYXhfbXVsdHNlY3QpIHsKKwkJcHJpbnRmKCIsIE11bHRTZWN0PSIpOworCQlpZiAoIShpZC0+bXVsdHNlY3RfdmFsaWQgJiAxKSkKKwkJCXByaW50ZigiPyV1PyIsIGlkLT5tdWx0c2VjdCk7CisJCWVsc2UgaWYgKGlkLT5tdWx0c2VjdCkKKwkJCXByaW50ZigiJXUiLCBpZC0+bXVsdHNlY3QpOworCQllbHNlCisJCQlwcmludGYoIm9mZiIpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCisJaWYgKCEoaWQtPmZpZWxkX3ZhbGlkICYgMSkpCisJCXByaW50ZigiIChtYXliZSk6Iik7CisKKwlwcmludGYoIiBDdXJDSFM9JXUvJXUvJXUsIEN1clNlY3RzPSVsdSwgTEJBPSVzIiwgaWQtPmN1cl9jeWxzLCBpZC0+Y3VyX2hlYWRzLAorCQlpZC0+Y3VyX3NlY3RvcnMsCisJCShCQl9CSUdfRU5ESUFOKSA/CisJCQkodW5zaWduZWQgbG9uZykoaWQtPmN1cl9jYXBhY2l0eTAgPDwgMTYpIHwgaWQtPmN1cl9jYXBhY2l0eTEgOgorCQkJKHVuc2lnbmVkIGxvbmcpKGlkLT5jdXJfY2FwYWNpdHkxIDw8IDE2KSB8IGlkLT5jdXJfY2FwYWNpdHkwLAorCQkJKChpZC0+Y2FwYWJpbGl0eSYyKSA9PSAwKSA/ICJubyIgOiAieWVzIik7CisKKwlpZiAoaWQtPmNhcGFiaWxpdHkgJiAyKQorCQlwcmludGYoIiwgTEJBc2VjdHM9JXUiLCBpZC0+bGJhX2NhcGFjaXR5KTsKKworCXByaW50ZigiXG4gSU9SRFk9JXMiLAorCQkoaWQtPmNhcGFiaWxpdHkgJiA4KQorCQkJPyAoKGlkLT5jYXBhYmlsaXR5ICYgNCkgPyAib24vb2ZmIiA6ICJ5ZXMiKQorCQkJOiAibm8iKTsKKworCWlmICgoKGlkLT5jYXBhYmlsaXR5ICYgOCkgfHwgKGlkLT5maWVsZF92YWxpZCAmIDIpKSAmJiAoaWQtPmZpZWxkX3ZhbGlkICYgMikpCisJCXByaW50ZigiLCB0UElPPXttaW46JXUsdy9JT1JEWToldX0iLCBpZC0+ZWlkZV9waW8sIGlkLT5laWRlX3Bpb19pb3JkeSk7CisKKwlpZiAoKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgKGlkLT5maWVsZF92YWxpZCAmIDIpKQorCQlwcmludGYoIiwgdERNQT17bWluOiV1LHJlYzoldX0iLCBpZC0+ZWlkZV9kbWFfbWluLCBpZC0+ZWlkZV9kbWFfdGltZSk7CisKKwlwcmludGYoIlxuIFBJTyBtb2RlczogICIpOworCWlmIChpZC0+dFBJTyA8PSA1KSB7CisJCXByaW50ZigicGlvMCAiKTsKKwkJaWYgKGlkLT50UElPID49IDEpIHByaW50ZigicGlvMSAiKTsKKwkJaWYgKGlkLT50UElPID49IDIpIHByaW50ZigicGlvMiAiKTsKKwl9CisJaWYgKGlkLT5maWVsZF92YWxpZCAmIDIpIHsKKwkJc3RhdGljIGNvbnN0IG1hc2tzX2xhYmVsc190IHBpb19tb2RlcyA9IHsKKwkJCS5tYXNrcyA9IHsgMSwgMiwgfjMgfSwKKwkJCS5sYWJlbHMgPSAicGlvMyBcMCIicGlvNCBcMCIicGlvPyBcMCIsCisJCX07CisJCXByaW50X2ZsYWdzKCZwaW9fbW9kZXMsIGlkLT5laWRlX3Bpb19tb2Rlcyk7CisJfQorCWlmIChpZC0+Y2FwYWJpbGl0eSAmIDEpIHsKKwkJaWYgKGlkLT5kbWFfMXdvcmQgfCBpZC0+ZG1hX213b3JkKSB7CisJCQlzdGF0aWMgY29uc3QgaW50IGRtYV93bW9kZV9tYXNrc1tdID0geyAweDEwMCwgMSwgMHgyMDAsIDIsIDB4NDAwLCA0LCAweGY4MDAsIDB4ZjggfTsKKwkJCXByaW50ZigiXG4gRE1BIG1vZGVzOiAgIik7CisJCQlwcmludF9mbGFnc19zZXBhcmF0ZWQoZG1hX3dtb2RlX21hc2tzLAorCQkJCSIqXDAiInNkbWEwIFwwIiIqXDAiInNkbWExIFwwIiIqXDAiInNkbWEyIFwwIiIqXDAiInNkbWE/IFwwIiwKKwkJCQlpZC0+ZG1hXzF3b3JkLCBOVUxMKTsKKwkJCXByaW50X2ZsYWdzX3NlcGFyYXRlZChkbWFfd21vZGVfbWFza3MsCisJCQkJIipcMCIibWRtYTAgXDAiIipcMCIibWRtYTEgXDAiIipcMCIibWRtYTIgXDAiIipcMCIibWRtYT8gXDAiLAorCQkJCWlkLT5kbWFfbXdvcmQsIE5VTEwpOworCQl9CisJfQorCWlmICgoKGlkLT5jYXBhYmlsaXR5ICYgOCkgfHwgKGlkLT5maWVsZF92YWxpZCAmIDIpKSAmJiBpZC0+ZmllbGRfdmFsaWQgJiA0KSB7CisJCXN0YXRpYyBjb25zdCBtYXNrc19sYWJlbHNfdCB1bHRyYV9tb2RlczEgPSB7CisJCQkubWFza3MgPSB7IDB4MTAwLCAweDAwMSwgMHgyMDAsIDB4MDAyLCAweDQwMCwgMHgwMDQgfSwKKwkJCS5sYWJlbHMgPSAiKlwwIiJ1ZG1hMCBcMCIiKlwwIiJ1ZG1hMSBcMCIiKlwwIiJ1ZG1hMiBcMCIsCisJCX07CisKKwkJcHJpbnRmKCJcbiBVRE1BIG1vZGVzOiAiKTsKKwkJcHJpbnRfZmxhZ3MoJnVsdHJhX21vZGVzMSwgaWQtPmRtYV91bHRyYSk7CisjaWZkZWYgX19ORVdfSERfRFJJVkVfSUQKKwkJaWYgKGlkLT5od19jb25maWcgJiAweDIwMDApIHsKKyNlbHNlIC8qICFfX05FV19IRF9EUklWRV9JRCAqLworCQlpZiAoaWQtPndvcmQ5MyAmIDB4MjAwMCkgeworI2VuZGlmIC8qIF9fTkVXX0hEX0RSSVZFX0lEICovCisJCQlzdGF0aWMgY29uc3QgbWFza3NfbGFiZWxzX3QgdWx0cmFfbW9kZXMyID0geworCQkJCS5tYXNrcyA9IHsgMHgwODAwLCAweDAwMDgsIDB4MTAwMCwgMHgwMDEwLAorCQkJCQkweDIwMDAsIDB4MDAyMCwgMHg0MDAwLCAweDAwNDAsCisJCQkJCTB4ODAwMCwgMHgwMDgwIH0sCisJCQkJLmxhYmVscyA9ICIqXDAiInVkbWEzIFwwIiIqXDAiInVkbWE0IFwwIgorCQkJCQkiKlwwIiJ1ZG1hNSBcMCIiKlwwIiJ1ZG1hNiBcMCIKKwkJCQkJIipcMCIidWRtYTcgXDAiCisJCQl9OworCQkJcHJpbnRfZmxhZ3MoJnVsdHJhX21vZGVzMiwgaWQtPmRtYV91bHRyYSk7CisJCX0KKwl9CisJcHJpbnRmKCJcbiBBZHZhbmNlZFBNPSVzIiwgKCEoaWRfcmVnc1s4M10gJiA4KSkgPyAibm8iIDogInllcyIpOworCWlmIChpZF9yZWdzWzgzXSAmIDgpIHsKKwkJaWYgKCEoaWRfcmVnc1s4Nl0gJiA4KSkKKwkJCXByaW50ZigiOiBkaXNhYmxlZCAoMjU1KSIpOworCQllbHNlIGlmICgoaWRfcmVnc1s5MV0gJiAweEZGMDApICE9IDB4NDAwMCkKKwkJCXByaW50ZigiOiB1bmtub3duIHNldHRpbmciKTsKKwkJZWxzZQorCQkJcHJpbnRmKCI6IG1vZGU9MHglMDJYICgldSkiLCBpZF9yZWdzWzkxXSAmIDB4RkYsIGlkX3JlZ3NbOTFdICYgMHhGRik7CisJfQorCWlmIChpZF9yZWdzWzgyXSAmIDB4MjApCisJCXByaW50ZigiIFdyaXRlQ2FjaGU9JXMiLCAoaWRfcmVnc1s4NV0gJiAweDIwKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworI2lmZGVmIF9fTkVXX0hEX0RSSVZFX0lECisJaWYgKChpZC0+bWlub3JfcmV2X251bSAmJiBpZC0+bWlub3JfcmV2X251bSA8PSAzMSkKKwkgfHwgKGlkLT5tYWpvcl9yZXZfbnVtICYmIGlkLT5taW5vcl9yZXZfbnVtIDw9IDMxKQorCSkgeworCQlwcmludGYoIlxuIERyaXZlIGNvbmZvcm1zIHRvOiAlczogIiwKKwkJCShpZC0+bWlub3JfcmV2X251bSA8PSAzMSkgPyBudGhfc3RyaW5nKG1pbm9yX3N0ciwgaWQtPm1pbm9yX3Jldl9udW0pIDogInVua25vd24iKTsKKwkJaWYgKGlkLT5tYWpvcl9yZXZfbnVtICE9IDB4MDAwMCAvKiBOT1ZBTF8wICovCisJCSAmJiBpZC0+bWFqb3JfcmV2X251bSAhPSAweEZGRkYgLyogTk9WQUxfMSAqLworCQkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykgeworCQkJCWlmIChpZC0+bWFqb3JfcmV2X251bSAmICgxPDxpKSkKKwkJCQkJcHJpbnRmKCIgQVRBL0FUQVBJLSV1IiwgaSk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogX19ORVdfSERfRFJJVkVfSUQgKi8KKwlwcmludGYoIlxuXG4gKiBjdXJyZW50IGFjdGl2ZSBtb2RlXG5cbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcl9jYWNoZSgvKmludCBmZCovIHZvaWQpCit7CisJZnN5bmMoZmQpOwkJCQkvKiBmbHVzaCBidWZmZXJzICovCisJaW9jdGxfb3Jfd2FybihmZCwgQkxLRkxTQlVGLCBOVUxMKTsgLyogZG8gaXQgYWdhaW4sIGJpZyB0aW1lICovCisjaWZkZWYgSERJT19EUklWRV9DTUQKKwlzbGVlcCgxKTsKKwlpZiAoaW9jdGwoZmQsIEhESU9fRFJJVkVfQ01ELCBOVUxMKSAmJiBlcnJubyAhPSBFSU5WQUwpIHsJLyogYXdhaXQgY29tcGxldGlvbiAqLworCQlpZiAoRU5BQkxFX0lPQ1RMX0hFWDJTVFJfRVJST1IpIC8qIFRvIGJlIGNvaGVyZW50IHdpdGggaW9jdGxfb3Jfd2FybiAqLworCQkJYmJfcGVycm9yX21zZygiSERJT19EUklWRV9DTUQiKTsKKwkJZWxzZQorCQkJYmJfcGVycm9yX21zZygiaW9jdGwgJSN4IGZhaWxlZCIsIEhESU9fRFJJVkVfQ01EKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc2Vla190b196ZXJvKC8qaW50IGZkKi8gdm9pZCkKK3sKKwl4bHNlZWsoZmQsIChvZmZfdCkgMCwgU0VFS19TRVQpOworfQorCitzdGF0aWMgdm9pZCByZWFkX2JpZ19ibG9jaygvKmludCBmZCwqLyBjaGFyICpidWYpCit7CisJaW50IGk7CisKKwl4cmVhZChmZCwgYnVmLCBUSU1JTkdfQlVGX0JZVEVTKTsKKwkvKiBhY2Nlc3MgYWxsIHNlY3RvcnMgb2YgYnVmIHRvIGVuc3VyZSB0aGUgcmVhZCBmdWxseSBjb21wbGV0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVElNSU5HX0JVRl9CWVRFUzsgaSArPSA1MTIpCisJCWJ1ZltpXSAmPSAxOworfQorCitzdGF0aWMgdW5zaWduZWQgZGV2X3NpemVfbWIoLyppbnQgZmQqLyB2b2lkKQoreworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGJsa3NpemU2NDsKKwkJdW5zaWduZWQgYmxrc2l6ZTMyOworCX0gdTsKKworCWlmICgwID09IGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsICZ1LmJsa3NpemU2NCkpIHsgLy8gYnl0ZXMKKwkJdS5ibGtzaXplNjQgLz0gKDEwMjQgKiAxMDI0KTsKKwl9IGVsc2UgeworCQl4aW9jdGwoZmQsIEJMS0dFVFNJWkUsICZ1LmJsa3NpemUzMik7IC8vIHNlY3RvcnMKKwkJdS5ibGtzaXplNjQgPSB1LmJsa3NpemUzMiAvICgyICogMTAyNCk7CisJfQorCWlmICh1LmJsa3NpemU2NCA+IFVJTlRfTUFYKQorCQlyZXR1cm4gVUlOVF9NQVg7CisJcmV0dXJuIHUuYmxrc2l6ZTY0OworfQorCitzdGF0aWMgdm9pZCBwcmludF90aW1pbmcodW5zaWduZWQgbSwgdW5zaWduZWQgZWxhcHNlZF91cykKK3sKKwl1bnNpZ25lZCBzZWMgPSBlbGFwc2VkX3VzIC8gMTAwMDAwMDsKKwl1bnNpZ25lZCBocyA9IChlbGFwc2VkX3VzICUgMTAwMDAwMCkgLyAxMDAwMDsKKworCXByaW50ZigiJTV1IE1CIGluICV1LiUwMnUgc2Vjb25kcyA9ICV1IGtCL3NcbiIsCisJCW0sIHNlYywgaHMsCisJCS8qICJ8IDEiIHByZXZlbnRzIGRpdi1ieS0wICovCisJCSh1bnNpZ25lZCkgKCh1bnNpZ25lZCBsb25nIGxvbmcpbSAqICgxMDI0ICogMTAwMDAwMCkgLyAoZWxhcHNlZF91cyB8IDEpKQorCQkvLyB+PSAobSAqIDEwMjQpIC8gKGVsYXBzZWRfdXMgLyAxMDAwMDAwKQorCQkvLyA9IGtiIC8gZWxhcHNlZF9zZWMKKwkpOworfQorCitzdGF0aWMgdm9pZCBkb190aW1lKGludCBjYWNoZSAvKixpbnQgZmQqLykKKy8qIGNhY2hlPTE6IHRpbWUgY2FjaGU6IHJlcGVhdGVkbHkgcmVhZCBOIE1CIGF0IG9mZnNldCAwCisgKiBjYWNoZT0wOiB0aW1lIGRldmljZTogbGluZWFyIHJlYWQsIHN0YXJ0aW5nIGF0IG9mZnNldCAwCisgKi8KK3sKKwl1bnNpZ25lZCBtYXhfaXRlcmF0aW9ucywgaXRlcmF0aW9uczsKKwl1bnNpZ25lZCBzdGFydDsgLyogZG9lc24ndCBuZWVkIHRvIGJlIGxvbmcgbG9uZyAqLworCXVuc2lnbmVkIGVsYXBzZWQsIGVsYXBzZWQyOworCXVuc2lnbmVkIHRvdGFsX01COworCWNoYXIgKmJ1ZiA9IHhtYWxsb2MoVElNSU5HX0JVRl9CWVRFUyk7CisKKwlpZiAobWxvY2soYnVmLCBUSU1JTkdfQlVGX0JZVEVTKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJtbG9jayIpOworCisJLyogQ2xlYXIgb3V0IHRoZSBkZXZpY2UgcmVxdWVzdCBxdWV1ZXMgJiBnaXZlIHRoZW0gdGltZSB0byBjb21wbGV0ZS4KKwkgKiBOQjogKnNtYWxsKiBkZWxheS4gVXNlciBpcyBleHBlY3RlZCB0byBoYXZlIGEgY2x1ZSBhbmQgdG8gbm90IHJ1bgorCSAqIGhlYXZ5IGlvIGluIHBhcmFsbGVsIHdpdGggbWVhc3VyZW1lbnRzLiAqLworCXN5bmMoKTsKKwlzbGVlcCgxKTsKKwlpZiAoY2FjaGUpIHsgLyogVGltZSBjYWNoZSAqLworCQlzZWVrX3RvX3plcm8oKTsKKwkJcmVhZF9iaWdfYmxvY2soYnVmKTsKKwkJcHJpbnRmKCJUaW1pbmcgYnVmZmVyLWNhY2hlIHJlYWRzOiAiKTsKKwl9IGVsc2UgeyAvKiBUaW1lIGRldmljZSAqLworCQlwcmludGYoIlRpbWluZyBidWZmZXJlZCBkaXNrIHJlYWRzOiIpOworCX0KKwlmZmx1c2hfYWxsKCk7CisKKwkvKiBOb3cgZG8gdGhlIHRpbWluZyAqLworCWl0ZXJhdGlvbnMgPSAwOworCS8qIE1heCB0aW1lIHRvIHJ1biAoc21hbGwgZm9yIGNhY2hlLCBhdm9pZHMgZ2V0dGluZworCSAqIGh1Z2UgdG90YWxfTUIgd2hpY2ggY2FuIG92ZXJsb3cgdW5zaWduZWQgdHlwZSkgKi8KKwllbGFwc2VkMiA9IDUxMDAwMDsgLyogY2FjaGUgKi8KKwltYXhfaXRlcmF0aW9ucyA9IFVJTlRfTUFYOworCWlmICghY2FjaGUpIHsKKwkJZWxhcHNlZDIgPSAzMDAwMDAwOyAvKiBub3QgY2FjaGUgKi8KKwkJLyogRG9uJ3Qgd2FudCB0byByZWFkIHBhc3QgdGhlIGVuZCEgKi8KKwkJbWF4X2l0ZXJhdGlvbnMgPSBkZXZfc2l6ZV9tYigpIC8gVElNSU5HX0JVRl9NQjsKKwl9CisJc3RhcnQgPSBtb25vdG9uaWNfdXMoKTsKKwlkbyB7CisJCWlmIChjYWNoZSkKKwkJCXNlZWtfdG9femVybygpOworCQlyZWFkX2JpZ19ibG9jayhidWYpOworCQllbGFwc2VkID0gKHVuc2lnbmVkKW1vbm90b25pY191cygpIC0gc3RhcnQ7CisJCSsraXRlcmF0aW9uczsKKwl9IHdoaWxlIChlbGFwc2VkIDwgZWxhcHNlZDIgJiYgaXRlcmF0aW9ucyA8IG1heF9pdGVyYXRpb25zKTsKKwl0b3RhbF9NQiA9IGl0ZXJhdGlvbnMgKiBUSU1JTkdfQlVGX01COworCS8vcHJpbnRmKCIgZWxhcHNlZDoldSBpdGVyYXRpb25zOiV1ICIsIGVsYXBzZWQsIGl0ZXJhdGlvbnMpOworCWlmIChjYWNoZSkgeworCQkvKiBDYWNoZTogcmVtb3ZlIGxzZWVrKCkgYW5kIG1vbm90b25pY191cygpIG92ZXJoZWFkcworCQkgKiBmcm9tIGVsYXBzZWQgKi8KKwkJc3RhcnQgPSBtb25vdG9uaWNfdXMoKTsKKwkJZG8geworCQkJc2Vla190b196ZXJvKCk7CisJCQllbGFwc2VkMiA9ICh1bnNpZ25lZCltb25vdG9uaWNfdXMoKSAtIHN0YXJ0OworCQl9IHdoaWxlICgtLWl0ZXJhdGlvbnMpOworCQkvL3ByaW50ZigiIGVsYXBzZWQyOiV1ICIsIGVsYXBzZWQyKTsKKwkJZWxhcHNlZCAtPSBlbGFwc2VkMjsKKwkJdG90YWxfTUIgKj0gMjsgLy8gQlVGQ0FDSEVfRkFDVE9SICh3aHk/KQorCQlmbHVzaF9idWZmZXJfY2FjaGUoKTsKKwl9CisJcHJpbnRfdGltaW5nKHRvdGFsX01CLCBlbGFwc2VkKTsKKwltdW5sb2NrKGJ1ZiwgVElNSU5HX0JVRl9CWVRFUyk7CisJZnJlZShidWYpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorc3RhdGljIHZvaWQgYnVzX3N0YXRlX3ZhbHVlKHVuc2lnbmVkIHZhbHVlKQoreworCWlmICh2YWx1ZSA9PSBCVVNTVEFURV9PTikKKwkJb25fb2ZmKDEpOworCWVsc2UgaWYgKHZhbHVlID09IEJVU1NUQVRFX09GRikKKwkJb25fb2ZmKDApOworCWVsc2UgaWYgKHZhbHVlID09IEJVU1NUQVRFX1RSSVNUQVRFKQorCQlwcmludGYoIiAodHJpc3RhdGUpXG4iKTsKKwllbHNlCisJCXByaW50ZigiICh1bmtub3duOiAlZClcbiIsIHZhbHVlKTsKK30KKyNlbmRpZgorCisjaWZkZWYgSERJT19EUklWRV9DTUQKK3N0YXRpYyB2b2lkIGludGVycHJldF9zdGFuZGJ5KHVpbnQ4X3Qgc3RhbmRieSkKK3sKKwlwcmludGYoIiAoIik7CisJaWYgKHN0YW5kYnkgPT0gMCkgeworCQlwcmludGYoIm9mZiIpOworCX0gZWxzZSBpZiAoc3RhbmRieSA8PSAyNDAgfHwgc3RhbmRieSA9PSAyNTIgfHwgc3RhbmRieSA9PSAyNTUpIHsKKwkJLyogc3RhbmRieSBpcyBpbiA1IHNlYyB1bml0cyAqLworCQl1bnNpZ25lZCB0ID0gc3RhbmRieSAqIDU7CisJCXByaW50ZigiJXUgbWludXRlcyAldSBzZWNvbmRzIiwgdCAvIDYwLCB0ICUgNjApOworCX0gZWxzZSBpZiAoc3RhbmRieSA8PSAyNTEpIHsKKwkJdW5zaWduZWQgdCA9IChzdGFuZGJ5IC0gMjQwKTsgLyogdCBpcyBpbiAzMCBtaW4gdW5pdHMgKi87CisJCXByaW50ZigiJXUuJWMgaG91cnMiLCB0IC8gMiwgKHQgJiAxKSA/ICc1JyA6ICcwJyk7CisJfQorCWlmIChzdGFuZGJ5ID09IDI1MykKKwkJcHJpbnRmKCJ2ZW5kb3Itc3BlY2lmaWMiKTsKKwlpZiAoc3RhbmRieSA9PSAyNTQpCisJCXByaW50ZigicmVzZXJ2ZWQiKTsKKwlwcmludGYoIilcbiIpOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCB4ZmVybW9kZV92YWxbXSBBTElHTjEgPSB7CisJIDgsICAgICAgOSwgICAgIDEwLCAgICAgMTEsICAgICAxMiwgICAgIDEzLCAgICAgMTQsICAgICAxNSwKKwkxNiwgICAgIDE3LCAgICAgMTgsICAgICAxOSwgICAgIDIwLCAgICAgMjEsICAgICAyMiwgICAgIDIzLAorCTMyLCAgICAgMzMsICAgICAzNCwgICAgIDM1LCAgICAgMzYsICAgICAzNywgICAgIDM4LCAgICAgMzksCisJNjQsICAgICA2NSwgICAgIDY2LCAgICAgNjcsICAgICA2OCwgICAgIDY5LCAgICAgNzAsICAgICA3MQorfTsKKy8qIE5COiB3ZSBzYXZlIHNpemUgYnkgX25vdF8gc3RvcmluZyB0ZXJuaW5hdGluZyBOVUwhICovCitzdGF0aWMgY29uc3QgY2hhciB4ZmVybW9kZV9uYW1lW11bNV0gQUxJR04xID0geworCSJwaW8wIiwgInBpbzEiLCAicGlvMiIsICJwaW8zIiwgInBpbzQiLCAicGlvNSIsICJwaW82IiwgInBpbzciLAorCSJzZG1hMCIsInNkbWExIiwic2RtYTIiLCJzZG1hMyIsInNkbWE0Iiwic2RtYTUiLCJzZG1hNiIsInNkbWE3IiwKKwkibWRtYTAiLCJtZG1hMSIsIm1kbWEyIiwibWRtYTMiLCJtZG1hNCIsIm1kbWE1IiwibWRtYTYiLCJtZG1hNyIsCisJInVkbWEwIiwidWRtYTEiLCJ1ZG1hMiIsInVkbWEzIiwidWRtYTQiLCJ1ZG1hNSIsInVkbWE2IiwidWRtYTciCit9OworCitzdGF0aWMgaW50IHRyYW5zbGF0ZV94ZmVybW9kZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCB2YWw7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHhmZXJtb2RlX3ZhbCk7IGkrKykgeworCQlpZiAoIXN0cm5jbXAobmFtZSwgeGZlcm1vZGVfbmFtZVtpXSwgNSkpCisJCQlpZiAoc3RybGVuKG5hbWUpIDw9IDUpCisJCQkJcmV0dXJuIHhmZXJtb2RlX3ZhbFtpXTsKKwl9CisJLyogTmVnYXRpdmUgbnVtYmVycyBhcmUgaW52YWxpZCBhbmQgYXJlIGNhdWdodCBsYXRlciAqLworCXZhbCA9IGJiX3N0cnRvaShuYW1lLCBOVUxMLCAxMCk7CisJaWYgKCFlcnJubykKKwkJcmV0dXJuIHZhbDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGludGVycHJldF94ZmVybW9kZSh1bnNpZ25lZCB4ZmVybW9kZSkKK3sKKwlwcmludGYoIiAoIik7CisJaWYgKHhmZXJtb2RlID09IDApCisJCXByaW50ZigiZGVmYXVsdCBQSU8gbW9kZSIpOworCWVsc2UgaWYgKHhmZXJtb2RlID09IDEpCisJCXByaW50ZigiZGVmYXVsdCBQSU8gbW9kZSwgZGlzYWJsZSBJT1JEWSIpOworCWVsc2UgaWYgKHhmZXJtb2RlID49IDggJiYgeGZlcm1vZGUgPD0gMTUpCisJCXByaW50ZigiUElPIGZsb3cgY29udHJvbCBtb2RlJXUiLCB4ZmVybW9kZSAtIDgpOworCWVsc2UgaWYgKHhmZXJtb2RlID49IDE2ICYmIHhmZXJtb2RlIDw9IDIzKQorCQlwcmludGYoInNpbmdsZXdvcmQgRE1BIG1vZGUldSIsIHhmZXJtb2RlIC0gMTYpOworCWVsc2UgaWYgKHhmZXJtb2RlID49IDMyICYmIHhmZXJtb2RlIDw9IDM5KQorCQlwcmludGYoIm11bHRpd29yZCBETUEgbW9kZSV1IiwgeGZlcm1vZGUgLSAzMik7CisJZWxzZSBpZiAoeGZlcm1vZGUgPj0gNjQgJiYgeGZlcm1vZGUgPD0gNzEpCisJCXByaW50ZigiVWx0cmFETUEgbW9kZSV1IiwgeGZlcm1vZGUgLSA2NCk7CisJZWxzZQorCQlwcmludGYoInVua25vd24iKTsKKwlwcmludGYoIilcbiIpOworfQorI2VuZGlmIC8qIEhESU9fRFJJVkVfQ01EICovCisKK3N0YXRpYyB2b2lkIHByaW50X2ZsYWcoaW50IGZsYWcsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJaWYgKGZsYWcpCisJCXByaW50ZigiIHNldHRpbmcgJXMgdG8gJWxkXG4iLCBzLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZGV2KGNoYXIgKmRldm5hbWUpCit7CisJLyppbnQgZmQ7Ki8KKwlsb25nIHBhcm0sIG11bHRjb3VudDsKKyNpZm5kZWYgSERJT19EUklWRV9DTUQKKwlpbnQgZm9yY2Vfb3BlcmF0aW9uID0gMDsKKyNlbmRpZgorCS8qIFBsZWFzZSByZXN0b3JlIGFyZ3Nbbl0gdG8gdGhlc2UgdmFsdWVzIGFmdGVyIGVhY2ggaW9jdGwKKwkgICBleGNlcHQgZm9yIGFyZ3NbMl0gKi8KKwl1bnNpZ25lZCBjaGFyIGFyZ3NbNF0gPSB7IFdJTl9TRVRGRUFUVVJFUywgMCwgMCwgMCB9OworCWNvbnN0IGNoYXIgKmZtdCA9ICIgJXNcdD0gJTJsZCI7CisKKwkvKmZkID0geG9wZW5fbm9uYmxvY2tpbmcoZGV2bmFtZSk7Ki8KKwl4bW92ZV9mZCh4b3Blbl9ub25ibG9ja2luZyhkZXZuYW1lKSwgZmQpOworCXByaW50ZigiXG4lczpcbiIsIGRldm5hbWUpOworCisJaWYgKGdldHNldF9yZWFkYWhlYWQgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWcoZ2V0c2V0X3JlYWRhaGVhZCwgImZzIHJlYWRhaGVhZCIsIFhyZWFkYWhlYWQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBCTEtSQVNFVCwgKGludCAqKVhyZWFkYWhlYWQpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYKKwlpZiAodW5yZWdpc3Rlcl9od2lmKSB7CisJCXByaW50ZigiIGF0dGVtcHRpbmcgdG8gdW5yZWdpc3RlciBod2lmIyVsdVxuIiwgaHdpZik7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fVU5SRUdJU1RFUl9IV0lGLCAoaW50ICopKHVuc2lnbmVkIGxvbmcpaHdpZik7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJaWYgKHNjYW5faHdpZiA9PSBJU19TRVQpIHsKKwkJcHJpbnRmKCIgYXR0ZW1wdGluZyB0byBzY2FuIGh3aWYgKDB4JWx4LCAweCVseCwgJWx1KVxuIiwgaHdpZl9kYXRhLCBod2lmX2N0cmwsIGh3aWZfaXJxKTsKKwkJYXJnc1swXSA9IGh3aWZfZGF0YTsKKwkJYXJnc1sxXSA9IGh3aWZfY3RybDsKKwkJYXJnc1syXSA9IGh3aWZfaXJxOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NDQU5fSFdJRiwgYXJncyk7CisJCWFyZ3NbMF0gPSBXSU5fU0VURkVBVFVSRVM7CisJCWFyZ3NbMV0gPSAwOworCX0KKyNlbmRpZgorCWlmIChzZXRfcGlvbW9kZSkgeworCQlpZiAobm9pc3lfcGlvbW9kZSkgeworCQkJcHJpbnRmKCIgYXR0ZW1wdGluZyB0byAiKTsKKwkJCWlmIChwaW9tb2RlID09IDI1NSkKKwkJCQlwcmludGYoImF1dG8tdHVuZSBQSU8gbW9kZVxuIik7CisJCQllbHNlIGlmIChwaW9tb2RlIDwgMTAwKQorCQkJCXByaW50Zigic2V0IFBJTyBtb2RlIHRvICVkXG4iLCBwaW9tb2RlKTsKKwkJCWVsc2UgaWYgKHBpb21vZGUgPCAyMDApCisJCQkJcHJpbnRmKCJzZXQgTURNQSBtb2RlIHRvICVkXG4iLCAocGlvbW9kZS0xMDApKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoInNldCBVRE1BIG1vZGUgdG8gJWRcbiIsIChwaW9tb2RlLTIwMCkpOworCQl9CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fU0VUX1BJT19NT0RFLCAoaW50ICopKHVuc2lnbmVkIGxvbmcpcGlvbW9kZSk7CisJfQorCWlmIChnZXRzZXRfaW8zMmJpdCA9PSBJU19TRVQpIHsKKwkJcHJpbnRfZmxhZyhnZXRzZXRfaW8zMmJpdCwgIjMyLWJpdCBJT19zdXBwb3J0IGZsYWciLCBpbzMyYml0KTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfMzJCSVQsIChpbnQgKilpbzMyYml0KTsKKwl9CisJaWYgKGdldHNldF9tdWx0ID09IElTX1NFVCkgeworCQlwcmludF9mbGFnKGdldHNldF9tdWx0LCAibXVsdGNvdW50IiwgbXVsdCk7CisjaWZkZWYgSERJT19EUklWRV9DTUQKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfTVVMVENPVU5ULCAodm9pZCAqKW11bHQpOworI2Vsc2UKKwkJZm9yY2Vfb3BlcmF0aW9uIHw9ICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfTVVMVENPVU5ULCAodm9pZCAqKW11bHQpKTsKKyNlbmRpZgorCX0KKwlpZiAoZ2V0c2V0X3JlYWRvbmx5ID09IElTX1NFVCkgeworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfcmVhZG9ubHksICJyZWFkb25seSIsIHJlYWRvbmx5KTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgQkxLUk9TRVQsICZyZWFkb25seSk7CisJfQorCWlmIChnZXRzZXRfdW5tYXNrID09IElTX1NFVCkgeworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfdW5tYXNrLCAidW5tYXNraXJxIiwgdW5tYXNrKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfVU5NQVNLSU5UUiwgKGludCAqKXVubWFzayk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEKKwlpZiAoZ2V0c2V0X2RtYSA9PSBJU19TRVQpIHsKKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X2RtYSwgInVzaW5nX2RtYSIsIGRtYSk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fU0VUX0RNQSwgKGludCAqKWRtYSk7CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSAqLworI2lmZGVmIEhESU9fU0VUX1FETUEKKwlpZiAoZ2V0c2V0X2RtYV9xID09IElTX1NFVCkgeworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfZG1hX3EsICJETUEgcXVldWVfZGVwdGgiLCBkbWFfcSk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fU0VUX1FETUEsIChpbnQgKilkbWFfcSk7CisJfQorI2VuZGlmCisJaWYgKGdldHNldF9ub3dlcnIgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF9ub3dlcnIsICJub3dlcnIiLCBub3dlcnIpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NFVF9OT1dFUlIsIChpbnQgKilub3dlcnIpOworCX0KKwlpZiAoZ2V0c2V0X2tlZXAgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF9rZWVwLCAia2VlcF9zZXR0aW5ncyIsIGtlZXApOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NFVF9LRUVQU0VUVElOR1MsIChpbnQgKilrZWVwKTsKKwl9CisjaWZkZWYgSERJT19EUklWRV9DTUQKKwlpZiAoZ2V0c2V0X2Rvb3Jsb2NrID09IElTX1NFVCkgeworCQlhcmdzWzBdID0gZG9vcmxvY2sgPyBXSU5fRE9PUkxPQ0sgOiBXSU5fRE9PUlVOTE9DSzsKKwkJYXJnc1syXSA9IDA7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF9kb29ybG9jaywgImRyaXZlIGRvb3Jsb2NrIiwgZG9vcmxvY2spOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCQlhcmdzWzBdID0gV0lOX1NFVEZFQVRVUkVTOworCX0KKwlpZiAoZ2V0c2V0X2RrZWVwID09IElTX1NFVCkgeworCQkvKiBsb2NrL3VubG9jayB0aGUgZHJpdmUncyAiZmVhdHVyZSIgc2V0dGluZ3MgKi8KKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X2RrZWVwLCAiZHJpdmUga2VlcCBmZWF0dXJlcyIsIGRrZWVwKTsKKwkJYXJnc1syXSA9IGRrZWVwID8gMHg2NiA6IDB4Y2M7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJfQorCWlmIChnZXRzZXRfZGVmZWN0cyA9PSBJU19TRVQpIHsKKwkJYXJnc1syXSA9IGRlZmVjdHMgPyAweDA0IDogMHg4NDsKKwkJcHJpbnRfZmxhZyhnZXRzZXRfZGVmZWN0cywgImRyaXZlIGRlZmVjdC1tZ210IiwgZGVmZWN0cyk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJfQorCWlmIChnZXRzZXRfcHJlZmV0Y2ggPT0gSVNfU0VUKSB7CisJCWFyZ3NbMV0gPSBwcmVmZXRjaDsKKwkJYXJnc1syXSA9IDB4YWI7CisJCXByaW50X2ZsYWcoZ2V0c2V0X3ByZWZldGNoLCAiZHJpdmUgcHJlZmV0Y2giLCBwcmVmZXRjaCk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJCWFyZ3NbMV0gPSAwOworCX0KKwlpZiAoc2V0X3hmZXJtb2RlKSB7CisJCWFyZ3NbMV0gPSB4ZmVybW9kZV9yZXF1ZXN0ZWQ7CisJCWFyZ3NbMl0gPSAzOworCQlwcmludF9mbGFnKDEsICJ4ZmVybW9kZSIsIHhmZXJtb2RlX3JlcXVlc3RlZCk7CisJCWludGVycHJldF94ZmVybW9kZSh4ZmVybW9kZV9yZXF1ZXN0ZWQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCQlhcmdzWzFdID0gMDsKKwl9CisJaWYgKGdldHNldF9sb29rYWhlYWQgPT0gSVNfU0VUKSB7CisJCWFyZ3NbMl0gPSBsb29rYWhlYWQgPyAweGFhIDogMHg1NTsKKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X2xvb2thaGVhZCwgImRyaXZlIHJlYWQtbG9va2FoZWFkIiwgbG9va2FoZWFkKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZhcmdzKTsKKwl9CisJaWYgKGdldHNldF9hcG1tb2RlID09IElTX1NFVCkgeworCQkvKiBmZWF0dXJlIHJlZ2lzdGVyICovCisJCWFyZ3NbMl0gPSAoYXBtbW9kZSA9PSAyNTUpID8gMHg4NSAvKiBkaXNhYmxlICovIDogMHgwNSAvKiBzZXQgKi87CisJCWFyZ3NbMV0gPSBhcG1tb2RlOyAvKiBzZWN0b3IgY291bnQgcmVnaXN0ZXIgMS0yNTUgKi8KKwkJcHJpbnRmKCIgc2V0dGluZyBBUE0gbGV2ZWwgdG8gJXMgMHglMDJsWCAoJWxkKVxuIiwKKwkJCShhcG1tb2RlID09IDI1NSkgPyAiZGlzYWJsZWQiIDogIiIsCisJCQlhcG1tb2RlLCBhcG1tb2RlKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZhcmdzKTsKKwkJYXJnc1sxXSA9IDA7CisJfQorCWlmIChnZXRzZXRfd2NhY2hlID09IElTX1NFVCkgeworI2lmZGVmIERPX0ZMVVNIQ0FDSEUKKyNpZm5kZWYgV0lOX0ZMVVNIQ0FDSEUKKyNkZWZpbmUgV0lOX0ZMVVNIQ0FDSEUgMHhlNworI2VuZGlmCisjZW5kaWYgLyogRE9fRkxVU0hDQUNIRSAqLworCQlhcmdzWzJdID0gd2NhY2hlID8gMHgwMiA6IDB4ODI7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF93Y2FjaGUsICJkcml2ZSB3cml0ZS1jYWNoaW5nIiwgd2NhY2hlKTsKKyNpZmRlZiBET19GTFVTSENBQ0hFCisJCWlmICghd2NhY2hlKQorCQkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZmbHVzaGNhY2hlKTsKKyNlbmRpZiAvKiBET19GTFVTSENBQ0hFICovCisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisjaWZkZWYgRE9fRkxVU0hDQUNIRQorCQlpZiAoIXdjYWNoZSkKKwkJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmZmx1c2hjYWNoZSk7CisjZW5kaWYgLyogRE9fRkxVU0hDQUNIRSAqLworCX0KKworCS8qIEluIGNvZGUgYmVsb3csIHdlIGRvIG5vdCBwcmVzZXJ2ZSBhcmdzWzBdLCBidXQgdGhlIHJlc3QKKwkgICBpcyBwcmVzZXJ2ZWQsIGluY2x1ZGluZyBhcmdzWzJdICovCisJYXJnc1syXSA9IDA7CisKKwlpZiAoc2V0X3N0YW5kYnlub3cpIHsKKyNpZm5kZWYgV0lOX1NUQU5EQllOT1cxCisjZGVmaW5lIFdJTl9TVEFOREJZTk9XMSAweEUwCisjZW5kaWYKKyNpZm5kZWYgV0lOX1NUQU5EQllOT1cyCisjZGVmaW5lIFdJTl9TVEFOREJZTk9XMiAweDk0CisjZW5kaWYKKwkJcHJpbnRmKCIgaXNzdWluZyBzdGFuZGJ5IGNvbW1hbmRcbiIpOworCQlhcmdzWzBdID0gV0lOX1NUQU5EQllOT1cxOworCQlpb2N0bF9hbHRfb3Jfd2FybihIRElPX0RSSVZFX0NNRCwgYXJncywgV0lOX1NUQU5EQllOT1cyKTsKKwl9CisJaWYgKHNldF9zbGVlcG5vdykgeworI2lmbmRlZiBXSU5fU0xFRVBOT1cxCisjZGVmaW5lIFdJTl9TTEVFUE5PVzEgMHhFNgorI2VuZGlmCisjaWZuZGVmIFdJTl9TTEVFUE5PVzIKKyNkZWZpbmUgV0lOX1NMRUVQTk9XMiAweDk5CisjZW5kaWYKKwkJcHJpbnRmKCIgaXNzdWluZyBzbGVlcCBjb21tYW5kXG4iKTsKKwkJYXJnc1swXSA9IFdJTl9TTEVFUE5PVzE7CisJCWlvY3RsX2FsdF9vcl93YXJuKEhESU9fRFJJVkVfQ01ELCBhcmdzLCBXSU5fU0xFRVBOT1cyKTsKKwl9CisJaWYgKHNldF9zZWFnYXRlKSB7CisJCWFyZ3NbMF0gPSAweGZiOworCQlwcmludGYoIiBkaXNhYmxpbmcgU2VhZ2F0ZSBhdXRvIHBvd2Vyc2F2aW5nIG1vZGVcbiIpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCX0KKwlpZiAoZ2V0c2V0X3N0YW5kYnkgPT0gSVNfU0VUKSB7CisJCWFyZ3NbMF0gPSBXSU5fU0VUSURMRTE7CisJCWFyZ3NbMV0gPSBzdGFuZGJ5X3JlcXVlc3RlZDsKKwkJcHJpbnRfZmxhZygxLCAic3RhbmRieSIsIHN0YW5kYnlfcmVxdWVzdGVkKTsKKwkJaW50ZXJwcmV0X3N0YW5kYnkoc3RhbmRieV9yZXF1ZXN0ZWQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCQlhcmdzWzFdID0gMDsKKwl9CisjZWxzZQkvKiBIRElPX0RSSVZFX0NNRCAqLworCWlmIChmb3JjZV9vcGVyYXRpb24pIHsKKwkJY2hhciBidWZbNTEyXTsKKwkJZmx1c2hfYnVmZmVyX2NhY2hlKCk7CisJCWlmICgtMSA9PSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSkKKwkJCWJiX3BlcnJvcl9tc2coInJlYWQgb2YgNTEyIGJ5dGVzIGZhaWxlZCIpOworCX0KKyNlbmRpZiAgLyogSERJT19EUklWRV9DTUQgKi8KKwlpZiAoZ2V0c2V0X211bHQgfHwgZ2V0X2lkZW50aXR5KSB7CisJCW11bHRjb3VudCA9IC0xOworCQlpZiAoaW9jdGwoZmQsIEhESU9fR0VUX01VTFRDT1VOVCwgJm11bHRjb3VudCkpIHsKKwkJCS8qIFRvIGJlIGNvaGVyZW50IHdpdGggaW9jdGxfb3Jfd2Fybi4gKi8KKwkJCWlmIChnZXRzZXRfbXVsdCAmJiBFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUikKKwkJCQliYl9wZXJyb3JfbXNnKCJIRElPX0dFVF9NVUxUQ09VTlQiKTsKKwkJCWVsc2UKKwkJCQliYl9wZXJyb3JfbXNnKCJpb2N0bCAlI3ggZmFpbGVkIiwgSERJT19HRVRfTVVMVENPVU5UKTsKKwkJfSBlbHNlIGlmIChnZXRzZXRfbXVsdCkgeworCQkJcHJpbnRmKGZtdCwgIm11bHRjb3VudCIsIG11bHRjb3VudCk7CisJCQlvbl9vZmYobXVsdGNvdW50ICE9IDApOworCQl9CisJfQorCWlmIChnZXRzZXRfaW8zMmJpdCkgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUXzMyQklULCAmcGFybSkpIHsKKwkJCXByaW50ZigiIElPX3N1cHBvcnRcdD0lM2xkICgiLCBwYXJtKTsKKwkJCWlmIChwYXJtID09IDApCisJCQkJcHJpbnRmKCJkZWZhdWx0IDE2LWJpdClcbiIpOworCQkJZWxzZSBpZiAocGFybSA9PSAyKQorCQkJCXByaW50ZigiMTYtYml0KVxuIik7CisJCQllbHNlIGlmIChwYXJtID09IDEpCisJCQkJcHJpbnRmKCIzMi1iaXQpXG4iKTsKKwkJCWVsc2UgaWYgKHBhcm0gPT0gMykKKwkJCQlwcmludGYoIjMyLWJpdCB3L3N5bmMpXG4iKTsKKwkJCWVsc2UgaWYgKHBhcm0gPT0gOCkKKwkJCQlwcmludGYoIlJlcXVlc3QtUXVldWUtQnlwYXNzKVxuIik7CisJCQllbHNlCisJCQkJcHJpbnRmKCJcP1w/XD8pXG4iKTsKKwkJfQorCX0KKwlpZiAoZ2V0c2V0X3VubWFzaykgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUX1VOTUFTS0lOVFIsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigidW5tYXNraXJxIiwgcGFybSk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEKKwlpZiAoZ2V0c2V0X2RtYSkgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUX0RNQSwgJnBhcm0pKSB7CisJCQlwcmludGYoZm10LCAidXNpbmdfZG1hIiwgcGFybSk7CisJCQlpZiAocGFybSA9PSA4KQorCQkJCXByaW50ZigiIChETUEtQXNzaXN0ZWQtUElPKVxuIik7CisJCQllbHNlCisJCQkJb25fb2ZmKHBhcm0gIT0gMCk7CisJCX0KKwl9CisjZW5kaWYKKyNpZmRlZiBIRElPX0dFVF9RRE1BCisJaWYgKGdldHNldF9kbWFfcSkgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUX1FETUEsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigicXVldWVfZGVwdGgiLCBwYXJtKTsKKwl9CisjZW5kaWYKKwlpZiAoZ2V0c2V0X2tlZXApIHsKKwkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX0dFVF9LRUVQU0VUVElOR1MsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigia2VlcHNldHRpbmdzIiwgcGFybSk7CisJfQorCWlmIChnZXRzZXRfbm93ZXJyKSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19HRVRfTk9XRVJSLCAmcGFybSkpCisJCQlwcmludF92YWx1ZV9vbl9vZmYoIm5vd2VyciIsIHBhcm0pOworCX0KKwlpZiAoZ2V0c2V0X3JlYWRvbmx5KSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgQkxLUk9HRVQsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigicmVhZG9ubHkiLCBwYXJtKTsKKwl9CisJaWYgKGdldHNldF9yZWFkYWhlYWQpIHsKKwkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBCTEtSQUdFVCwgJnBhcm0pKQorCQkJcHJpbnRfdmFsdWVfb25fb2ZmKCJyZWFkYWhlYWQiLCBwYXJtKTsKKwl9CisJaWYgKGdldF9nZW9tKSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgQkxLR0VUU0laRSwgJnBhcm0pKSB7CisJCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZzsKKworCQkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX0dFVEdFTywgJmcpKQorCQkJCXByaW50ZigiIGdlb21ldHJ5XHQ9ICV1LyV1LyV1LCBzZWN0b3JzID0gJWxkLCBzdGFydCA9ICVsZFxuIiwKKwkJCQkJZy5jeWxpbmRlcnMsIGcuaGVhZHMsIGcuc2VjdG9ycywgcGFybSwgZy5zdGFydCk7CisJCX0KKwl9CisjaWZkZWYgSERJT19EUklWRV9DTUQKKwlpZiAoZ2V0X3Bvd2VybW9kZSkgeworI2lmbmRlZiBXSU5fQ0hFQ0tQT1dFUk1PREUxCisjZGVmaW5lIFdJTl9DSEVDS1BPV0VSTU9ERTEgMHhFNQorI2VuZGlmCisjaWZuZGVmIFdJTl9DSEVDS1BPV0VSTU9ERTIKKyNkZWZpbmUgV0lOX0NIRUNLUE9XRVJNT0RFMiAweDk4CisjZW5kaWYKKwkJY29uc3QgY2hhciAqc3RhdGU7CisKKwkJYXJnc1swXSA9IFdJTl9DSEVDS1BPV0VSTU9ERTE7CisJCWlmIChpb2N0bF9hbHRfb3Jfd2FybihIRElPX0RSSVZFX0NNRCwgYXJncywgV0lOX0NIRUNLUE9XRVJNT0RFMikpIHsKKwkJCWlmIChlcnJubyAhPSBFSU8gfHwgYXJnc1swXSAhPSAwIHx8IGFyZ3NbMV0gIT0gMCkKKwkJCQlzdGF0ZSA9ICJ1bmtub3duIjsKKwkJCWVsc2UKKwkJCQlzdGF0ZSA9ICJzbGVlcGluZyI7CisJCX0gZWxzZQorCQkJc3RhdGUgPSAoYXJnc1syXSA9PSAyNTUpID8gImFjdGl2ZS9pZGxlIiA6ICJzdGFuZGJ5IjsKKwkJYXJnc1sxXSA9IGFyZ3NbMl0gPSAwOworCisJCXByaW50ZigiIGRyaXZlIHN0YXRlIGlzOiAgJXNcbiIsIHN0YXRlKTsKKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVAorCWlmIChwZXJmb3JtX3Jlc2V0KSB7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfUkVTRVQsIE5VTEwpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorCWlmIChwZXJmb3JtX3RyaXN0YXRlKSB7CisJCWFyZ3NbMF0gPSAwOworCQlhcmdzWzFdID0gdHJpc3RhdGU7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fVFJJU1RBVEVfSFdJRiwgJmFyZ3MpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZCisJaWYgKGdldF9pZGVudGl0eSkgeworCQlzdHJ1Y3QgaGRfZHJpdmVpZCBpZDsKKworCQlpZiAoIWlvY3RsKGZkLCBIRElPX0dFVF9JREVOVElUWSwgJmlkKSkJeworCQkJaWYgKG11bHRjb3VudCAhPSAtMSkgeworCQkJCWlkLm11bHRzZWN0ID0gbXVsdGNvdW50OworCQkJCWlkLm11bHRzZWN0X3ZhbGlkIHw9IDE7CisJCQl9IGVsc2UKKwkJCQlpZC5tdWx0c2VjdF92YWxpZCAmPSB+MTsKKwkJCWR1bXBfaWRlbnRpdHkoJmlkKTsKKwkJfSBlbHNlIGlmIChlcnJubyA9PSAtRU5PTVNHKQorCQkJcHJpbnRmKCIgbm8gaWRlbnRpZmljYXRpb24gaW5mbyBhdmFpbGFibGVcbiIpOworCQllbHNlIGlmIChFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUikgIC8qIFRvIGJlIGNvaGVyZW50IHdpdGggaW9jdGxfb3Jfd2FybiAqLworCQkJYmJfcGVycm9yX21zZygiSERJT19HRVRfSURFTlRJVFkiKTsKKwkJZWxzZQorCQkJYmJfcGVycm9yX21zZygiaW9jdGwgJSN4IGZhaWxlZCIsIEhESU9fR0VUX0lERU5USVRZKTsKKwl9CisKKwlpZiAoZ2V0X0lEZW50aXR5KSB7CisJCXVuc2lnbmVkIGNoYXIgYXJnczFbNCs1MTJdOyAvKiA9IHsgLi4uIH0gd2lsbCBlYXQgMC41ayBvZiByb2RhdGEhICovCisKKwkJbWVtc2V0KGFyZ3MxLCAwLCBzaXplb2YoYXJnczEpKTsKKwkJYXJnczFbMF0gPSBXSU5fSURFTlRJRlk7CisJCWFyZ3MxWzNdID0gMTsKKwkJaWYgKCFpb2N0bF9hbHRfb3Jfd2FybihIRElPX0RSSVZFX0NNRCwgYXJnczEsIFdJTl9QSURFTlRJRlkpKQorCQkJaWRlbnRpZnkoKHZvaWQgKikoYXJnczEgKyA0KSk7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorCWlmIChnZXRzZXRfYnVzc3RhdGUgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWcoMSwgImJ1cyBzdGF0ZSIsIGJ1c3N0YXRlKTsKKwkJYnVzX3N0YXRlX3ZhbHVlKGJ1c3N0YXRlKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfQlVTU1RBVEUsIChpbnQgKikodW5zaWduZWQgbG9uZylidXNzdGF0ZSk7CisJfQorCWlmIChnZXRzZXRfYnVzc3RhdGUpIHsKKwkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX0dFVF9CVVNTVEFURSwgJnBhcm0pKSB7CisJCQlwcmludGYoZm10LCAiYnVzIHN0YXRlIiwgcGFybSk7CisJCQlidXNfc3RhdGVfdmFsdWUocGFybSk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAocmVyZWFkX3BhcnRuKQorCQlpb2N0bF9vcl93YXJuKGZkLCBCTEtSUlBBUlQsIE5VTEwpOworCisJaWYgKGRvX2N0aW1pbmdzKQorCQlkb190aW1lKDEgLyosZmQqLyk7IC8qIHRpbWUgY2FjaGUgKi8KKwlpZiAoZG9fdGltaW5ncykKKwkJZG9fdGltZSgwIC8qLGZkKi8pOyAvKiB0aW1lIGRldmljZSAqLworCWlmIChkb19mbHVzaCkKKwkJZmx1c2hfYnVmZmVyX2NhY2hlKCk7CisJY2xvc2UoZmQpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWQorc3RhdGljIGludCBmcm9taGV4KHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoaXNkaWdpdChjKSkKKwkJcmV0dXJuIChjIC0gJzAnKTsKKwlpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCXJldHVybiAoYyAtICgnYScgLSAxMCkpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgY2hhcjogJyVjJyAweCUwMngiLCBjLCBjKTsKK30KKworc3RhdGljIHZvaWQgaWRlbnRpZnlfZnJvbV9zdGRpbih2b2lkKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGlkZW50aWZ5X2Zyb21fc3RkaW4odm9pZCkKK3sKKwl1aW50MTZfdCBzYnVmWzI1Nl07CisJdW5zaWduZWQgY2hhciBidWZbMTI4MF07CisJdW5zaWduZWQgY2hhciAqYiA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCWludCBpOworCisJeHJlYWQoU1RESU5fRklMRU5PLCBidWYsIDEyODApOworCisJLy8gQ29udmVydCB0aGUgbmV3bGluZS1zZXBhcmF0ZWQgaGV4IGRhdGEgaW50byBhbiBpZGVudGlmeSBibG9jay4KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCXNidWZbaV0gPSAoc2J1ZltpXSA8PCA0KSArIGZyb21oZXgoKihiKyspKTsKKwl9CisKKwkvLyBQYXJzZSB0aGUgZGF0YS4KKworCWlkZW50aWZ5KHNidWYpOworfQorI2Vsc2UKK3ZvaWQgaWRlbnRpZnlfZnJvbV9zdGRpbih2b2lkKTsKKyNlbmRpZgorCisvKiBidXN5Ym94IHNwZWNpZmljIHN0dWZmICovCitzdGF0aWMgaW50IHBhcnNlX29wdHModW5zaWduZWQgbG9uZyAqdmFsdWUsIGludCBtaW4sIGludCBtYXgpCit7CisJaWYgKG9wdGFyZykgeworCQkqdmFsdWUgPSB4YXRvbF9yYW5nZShvcHRhcmcsIG1pbiwgbWF4KTsKKwkJcmV0dXJuIElTX1NFVDsKKwl9CisJcmV0dXJuIElTX0dFVDsKK30KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0c18wX21heCh1bnNpZ25lZCBsb25nICp2YWx1ZSwgaW50IG1heCkKK3sKKwlyZXR1cm4gcGFyc2Vfb3B0cyh2YWx1ZSwgMCwgbWF4KTsKK30KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0c18wXzEodW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisJcmV0dXJuIHBhcnNlX29wdHModmFsdWUsIDAsIDEpOworfQorc3RhdGljIGludCBwYXJzZV9vcHRzXzBfSU5UTUFYKHVuc2lnbmVkIGxvbmcgKnZhbHVlKQoreworCXJldHVybiBwYXJzZV9vcHRzKHZhbHVlLCAwLCBJTlRfTUFYKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfeGZlcm1vZGUoaW50IGZsYWcsIHNtYWxsaW50ICpnZXQsIHNtYWxsaW50ICpzZXQsIGludCAqdmFsdWUpCit7CisJaWYgKGZsYWcpIHsKKwkJKmdldCA9IElTX0dFVDsKKwkJaWYgKG9wdGFyZykgeworCQkJKnZhbHVlID0gdHJhbnNsYXRlX3hmZXJtb2RlKG9wdGFyZyk7CisJCQkqc2V0ID0gKCp2YWx1ZSA+IC0xKTsKKwkJfQorCX0KK30KKworLyotLS0tLS0tIGdldG9wdCBzaG9ydCBvcHRpb25zIC0tLS0tLS0tKi8KK3N0YXRpYyBjb25zdCBjaGFyIGhkcGFybV9vcHRpb25zW10gQUxJR04xID0KKwkiZ2Z1OjpuOjpwOnI6Om06OmM6Oms6OmE6OkI6dFQiCisJSUZfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZKCJpSSIpCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BKCJkOjoiKQorI2lmZGVmIEhESU9fRFJJVkVfQ01ECisJIlM6RDpQOlg6SzpBOkw6VzpDeVl6WiIKKyNlbmRpZgorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGKCJVOiIpCisjaWZkZWYgSERJT19HRVRfUURNQQorI2lmZGVmIEhESU9fU0VUX1FETUEKKwkiUToiCisjZWxzZQorCSJRIgorI2VuZGlmCisjZW5kaWYKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUKCJ3IikKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYoIng6OmI6IikKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRigiUjoiKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG91ciBtYWluKCkgcm91dGluZTogKi8KK2ludCBoZHBhcm1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGhkcGFybV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYzsKKwlpbnQgZmxhZ2NvdW50ID0gMDsKKworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBoZHBhcm1fb3B0aW9ucykpID49IDApIHsKKwkJZmxhZ2NvdW50Kys7CisJCUlGX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWShnZXRfSURlbnRpdHkgfD0gKGMgPT0gJ0knKSk7CisJCUlGX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWShnZXRfaWRlbnRpdHkgfD0gKGMgPT0gJ2knKSk7CisJCWdldF9nZW9tIHw9IChjID09ICdnJyk7CisJCWRvX2ZsdXNoIHw9IChjID09ICdmJyk7CisJCWlmIChjID09ICd1JykgZ2V0c2V0X3VubWFzayAgICA9IHBhcnNlX29wdHNfMF8xKCZ1bm1hc2spOworCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSgKKwkJaWYgKGMgPT0gJ2QnKSBnZXRzZXRfZG1hICAgICAgID0gcGFyc2Vfb3B0c18wX21heCgmZG1hLCA5KTsKKwkpCisJCWlmIChjID09ICduJykgZ2V0c2V0X25vd2VyciAgICA9IHBhcnNlX29wdHNfMF8xKCZub3dlcnIpOworCQlwYXJzZV94ZmVybW9kZSgoYyA9PSAncCcpLCAmbm9pc3lfcGlvbW9kZSwgJnNldF9waW9tb2RlLCAmcGlvbW9kZSk7CisJCWlmIChjID09ICdyJykgZ2V0c2V0X3JlYWRvbmx5ICA9IHBhcnNlX29wdHNfMF8xKCZyZWFkb25seSk7CisJCWlmIChjID09ICdtJykgZ2V0c2V0X211bHQgICAgICA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJm11bHQgLyozMiovKTsKKwkJaWYgKGMgPT0gJ2MnKSBnZXRzZXRfaW8zMmJpdCAgID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmaW8zMmJpdCAvKjgqLyk7CisJCWlmIChjID09ICdrJykgZ2V0c2V0X2tlZXAgICAgICA9IHBhcnNlX29wdHNfMF8xKCZrZWVwKTsKKwkJaWYgKGMgPT0gJ2EnKSBnZXRzZXRfcmVhZGFoZWFkID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmWHJlYWRhaGVhZCk7CisJCWlmIChjID09ICdCJykgZ2V0c2V0X2FwbW1vZGUgICA9IHBhcnNlX29wdHMoJmFwbW1vZGUsIDEsIDI1NSk7CisJCWRvX2ZsdXNoIHw9IGRvX3RpbWluZ3MgfD0gKGMgPT0gJ3QnKTsKKwkJZG9fZmx1c2ggfD0gZG9fY3RpbWluZ3MgfD0gKGMgPT0gJ1QnKTsKKyNpZmRlZiBIRElPX0RSSVZFX0NNRAorCQlpZiAoYyA9PSAnUycpIGdldHNldF9zdGFuZGJ5ICA9IHBhcnNlX29wdHNfMF9tYXgoJnN0YW5kYnlfcmVxdWVzdGVkLCAyNTUpOworCQlpZiAoYyA9PSAnRCcpIGdldHNldF9kZWZlY3RzICA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJmRlZmVjdHMpOworCQlpZiAoYyA9PSAnUCcpIGdldHNldF9wcmVmZXRjaCA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJnByZWZldGNoKTsKKwkJcGFyc2VfeGZlcm1vZGUoKGMgPT0gJ1gnKSwgJmdldF94ZmVybW9kZSwgJnNldF94ZmVybW9kZSwgJnhmZXJtb2RlX3JlcXVlc3RlZCk7CisJCWlmIChjID09ICdLJykgZ2V0c2V0X2RrZWVwICAgICA9IHBhcnNlX29wdHNfMF8xKCZwcmVmZXRjaCk7CisJCWlmIChjID09ICdBJykgZ2V0c2V0X2xvb2thaGVhZCA9IHBhcnNlX29wdHNfMF8xKCZsb29rYWhlYWQpOworCQlpZiAoYyA9PSAnTCcpIGdldHNldF9kb29ybG9jayAgPSBwYXJzZV9vcHRzXzBfMSgmZG9vcmxvY2spOworCQlpZiAoYyA9PSAnVycpIGdldHNldF93Y2FjaGUgICAgPSBwYXJzZV9vcHRzXzBfMSgmd2NhY2hlKTsKKwkJZ2V0X3Bvd2VybW9kZSB8PSAoYyA9PSAnQycpOworCQlzZXRfc3RhbmRieW5vdyB8PSAoYyA9PSAneScpOworCQlzZXRfc2xlZXBub3cgfD0gKGMgPT0gJ1knKTsKKwkJcmVyZWFkX3BhcnRuIHw9IChjID09ICd6Jyk7CisJCXNldF9zZWFnYXRlIHw9IChjID09ICdaJyk7CisjZW5kaWYKKwkJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYoaWYgKGMgPT0gJ1UnKSB1bnJlZ2lzdGVyX2h3aWYgPSBwYXJzZV9vcHRzXzBfSU5UTUFYKCZod2lmKSk7CisjaWZkZWYgSERJT19HRVRfUURNQQorCQlpZiAoYyA9PSAnUScpIHsKKwkJCWdldHNldF9kbWFfcSA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJmRtYV9xKTsKKwkJfQorI2VuZGlmCisJCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQocGVyZm9ybV9yZXNldCA9IChjID09ICdyJykpOworCQlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYoaWYgKGMgPT0gJ3gnKSBwZXJmb3JtX3RyaXN0YXRlID0gcGFyc2Vfb3B0c18wXzEoJnRyaXN0YXRlKSk7CisJCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRihpZiAoYyA9PSAnYicpIGdldHNldF9idXNzdGF0ZSA9IHBhcnNlX29wdHNfMF9tYXgoJmJ1c3N0YXRlLCAyKSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJCWlmIChjID09ICdSJykgeworCQkJc2Nhbl9od2lmID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmaHdpZl9kYXRhKTsKKwkJCWh3aWZfY3RybCA9IHhhdG9pX3Bvc2l0aXZlKChhcmd2W29wdGluZF0pID8gYXJndltvcHRpbmRdIDogIiIpOworCQkJaHdpZl9pcnEgID0geGF0b2lfcG9zaXRpdmUoKGFyZ3Zbb3B0aW5kKzFdKSA/IGFyZ3Zbb3B0aW5kKzFdIDogIiIpOworCQkJLyogTW92ZSBwYXN0IHRoZSAyIGFkZGl0aW9uYWwgYXJndW1lbnRzICovCisJCQlhcmd2ICs9IDI7CisJCQlhcmdjIC09IDI7CisJCX0KKyNlbmRpZgorCX0KKwkvKiBXaGVuIG5vIGZsYWdzIGFyZSBnaXZlbiAoZmxhZ2NvdW50ID0gMCksIC1hY2Rna21ucnUgaXMgYXNzdW1lZC4gKi8KKwlpZiAoIWZsYWdjb3VudCkgeworCQlnZXRzZXRfbXVsdCA9IGdldHNldF9pbzMyYml0ID0gZ2V0c2V0X3VubWFzayA9IGdldHNldF9rZWVwID0gZ2V0c2V0X3JlYWRvbmx5ID0gZ2V0c2V0X3JlYWRhaGVhZCA9IGdldF9nZW9tID0gSVNfR0VUOworCQlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEoZ2V0c2V0X2RtYSA9IElTX0dFVCk7CisJfQorCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCEqYXJndikgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWSAmJiAhaXNhdHR5KFNURElOX0ZJTEVOTykpCisJCQlpZGVudGlmeV9mcm9tX3N0ZGluKCk7IC8qIEVYSVQgKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWRvIHsKKwkJcHJvY2Vzc19kZXYoKmFyZ3YrKyk7CisJfSB3aGlsZSAoKmFyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9pbm90aWZ5ZC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2lub3RpZnlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0ZTBhYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9pbm90aWZ5ZC5jCkBAIC0wLDAgKzEsMjAzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzaW1wbGUgaW5vdGlmeSBkYWVtb24KKyAqIHJlcG9ydHMgZmlsZXN5c3RlbSBjaGFuZ2VzIHZpYSB1c2Vyc3BhY2UgYWdlbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFVzZSBhcyBmb2xsb3dzOgorICogIyBpbm90aWZ5ZCAvdXNlci9zcGFjZS9hZ2VudCBkaXIvb3IvZmlsZS9iZWluZy93YXRjaGVkWzptYXNrXSAuLi4KKyAqCisgKiBXaGVuIGEgZmlsZXN5c3RlbSBldmVudCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIG1hc2sgaXMgb2NjdXJlZCBvbiBzcGVjaWZpZWQgZmlsZSAob3IgZGlyZWN0b3J5KQorICogYSB1c2Vyc3BhY2UgYWdlbnQgaXMgc3Bhd25lZCBhbmQgZ2l2ZW4gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICogJDEuIGFjdHVhbCBldmVudChzKQorICogJDIuIGZpbGUgKG9yIGRpcmVjdG9yeSkgbmFtZQorICogJDMuIG5hbWUgb2Ygc3ViZmlsZSAoaWYgYW55KSwgaW4gY2FzZSBvZiB3YXRjaGluZyBhIGRpcmVjdG9yeQorICoKKyAqIEUuZy4gaW5vdGlmeWQgLi9kZXYtd2F0Y2hlciAvZGV2Om4KKyAqCisgKiAuL2Rldi13YXRjaGVyIGNhbiBiZSwgc2F5OgorICogIyEvYmluL3NoCisgKiBlY2hvICJXZSBoYXZlIG5ldyBkZXZpY2UgaW4gaGVyZSEgSGVsbG8sICQzISIKKyAqCisgKiBTZWUgYmVsb3cgZm9yIG1hc2sgbmFtZXMgZXhwbGFuYXRpb24uCisgKi8KKworLy91c2FnZTojZGVmaW5lIGlub3RpZnlkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJQUk9HIEZJTEUxWzpNQVNLXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBpbm90aWZ5ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBQUk9HIG9uIGZpbGVzeXN0ZW0gY2hhbmdlcy4iCisvL3VzYWdlOiAgICAgIlxuV2hlbiBhIGZpbGVzeXN0ZW0gZXZlbnQgbWF0Y2hpbmcgTUFTSyBvY2N1cnMgb24gRklMRW4sIgorLy91c2FnZTogICAgICJcblBST0cgQUNUVUFMX0VWRU5UUyBGSUxFbiBbU1VCRklMRV0gaXMgcnVuLiIKKy8vdXNhZ2U6ICAgICAiXG5FdmVudHM6IgorLy91c2FnZTogICAgICJcbglhCUZpbGUgaXMgYWNjZXNzZWQiCisvL3VzYWdlOiAgICAgIlxuCWMJRmlsZSBpcyBtb2RpZmllZCIKKy8vdXNhZ2U6ICAgICAiXG4JZQlNZXRhZGF0YSBjaGFuZ2VkIgorLy91c2FnZTogICAgICJcbgl3CVdyaXRhYmxlIGZpbGUgaXMgY2xvc2VkIgorLy91c2FnZTogICAgICJcbgkwCVVud3JpdGFibGUgZmlsZSBpcyBjbG9zZWQiCisvL3VzYWdlOiAgICAgIlxuCXIJRmlsZSBpcyBvcGVuZWQiCisvL3VzYWdlOiAgICAgIlxuCUQJRmlsZSBpcyBkZWxldGVkIgorLy91c2FnZTogICAgICJcbglNCUZpbGUgaXMgbW92ZWQiCisvL3VzYWdlOiAgICAgIlxuCXUJQmFja2luZyBmcyBpcyB1bm1vdW50ZWQiCisvL3VzYWdlOiAgICAgIlxuCW8JRXZlbnQgcXVldWUgb3ZlcmZsb3dlZCIKKy8vdXNhZ2U6ICAgICAiXG4JeAlGaWxlIGNhbid0IGJlIHdhdGNoZWQgYW55bW9yZSIKKy8vdXNhZ2U6ICAgICAiXG5JZiB3YXRjaGluZyBhIGRpcmVjdG9yeToiCisvL3VzYWdlOiAgICAgIlxuCW0JU3ViZmlsZSBpcyBtb3ZlZCBpbnRvIGRpciIKKy8vdXNhZ2U6ICAgICAiXG4JeQlTdWJmaWxlIGlzIG1vdmVkIG91dCBvZiBkaXIiCisvL3VzYWdlOiAgICAgIlxuCW4JU3ViZmlsZSBpcyBjcmVhdGVkIgorLy91c2FnZTogICAgICJcbglkCVN1YmZpbGUgaXMgZGVsZXRlZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuaW5vdGlmeWQgd2FpdHMgZm9yIFBST0cgdG8gZXhpdC4iCisvL3VzYWdlOiAgICAgIlxuV2hlbiB4IGV2ZW50IGhhcHBlbnMgZm9yIGFsbCBGSUxFcywgaW5vdGlmeWQgZXhpdHMuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvaW5vdGlmeS5oPgorCitzdGF0aWMgY29uc3QgY2hhciBtYXNrX25hbWVzW10gQUxJR04xID0KKwkiYSIJLy8gMHgwMDAwMDAwMQlGaWxlIHdhcyBhY2Nlc3NlZAorCSJjIgkvLyAweDAwMDAwMDAyCUZpbGUgd2FzIG1vZGlmaWVkCisJImUiCS8vIDB4MDAwMDAwMDQJTWV0YWRhdGEgY2hhbmdlZAorCSJ3IgkvLyAweDAwMDAwMDA4CVdyaXRhYmxlIGZpbGUgd2FzIGNsb3NlZAorCSIwIgkvLyAweDAwMDAwMDEwCVVud3JpdGFibGUgZmlsZSBjbG9zZWQKKwkiciIJLy8gMHgwMDAwMDAyMAlGaWxlIHdhcyBvcGVuZWQKKwkibSIJLy8gMHgwMDAwMDA0MAlGaWxlIHdhcyBtb3ZlZCBmcm9tIFgKKwkieSIJLy8gMHgwMDAwMDA4MAlGaWxlIHdhcyBtb3ZlZCB0byBZCisJIm4iCS8vIDB4MDAwMDAxMDAJU3ViZmlsZSB3YXMgY3JlYXRlZAorCSJkIgkvLyAweDAwMDAwMjAwCVN1YmZpbGUgd2FzIGRlbGV0ZWQKKwkiRCIJLy8gMHgwMDAwMDQwMAlTZWxmIHdhcyBkZWxldGVkCisJIk0iCS8vIDB4MDAwMDA4MDAJU2VsZiB3YXMgbW92ZWQKKwkiXDAiCS8vIDB4MDAwMDEwMDAgICAodW51c2VkKQorCS8vIEtlcm5lbCBldmVudHMsIGFsd2F5cyByZXBvcnRlZDoKKwkidSIJLy8gMHgwMDAwMjAwMCAgIEJhY2tpbmcgZnMgd2FzIHVubW91bnRlZAorCSJvIgkvLyAweDAwMDA0MDAwICAgRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQKKwkieCIJLy8gMHgwMDAwODAwMCAgIEZpbGUgaXMgbm8gbG9uZ2VyIHdhdGNoZWQgKHVzdWFsbHkgZGVsZXRlZCkKKzsKK2VudW0geworCU1BU0tfQklUUyA9IHNpemVvZihtYXNrX25hbWVzKSAtIDEKK307CisKK2ludCBpbm90aWZ5ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaW5vdGlmeWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJdW5zaWduZWQgbWFzazsKKwlzdHJ1Y3QgcG9sbGZkIHBmZDsKKwljaGFyICoqd2F0Y2hlczsgLy8gbmFtZXMgb2YgZmlsZXMgYmVpbmcgd2F0Y2hlZAorCWNvbnN0IGNoYXIgKmFyZ3NbNV07CisKKwkvLyBzYW5pdHkgY2hlY2s6IGFnZW50IGFuZCBhdCBsZWFzdCBvbmUgd2F0Y2ggbXVzdCBiZSBnaXZlbgorCWlmICghYXJndlsxXSB8fCAhYXJndlsyXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJYXJndisrOworCS8vIGlub3RpZnlfYWRkX3dhdGNoIHdpbGwgbnVtYmVyIHdhdGNoZWQgZmlsZXMKKwkvLyBzdGFydGluZyBmcm9tIDEsIHRodXMgd2F0Y2hlc1swXSBpcyB1bmltcG9ydGFudCwKKwkvLyBhbmQgMXN0IGZpbGUgbmFtZSBpcyB3YXRjaGVzWzFdLgorCXdhdGNoZXMgPSBhcmd2OworCWFyZ3NbMF0gPSAqYXJndjsKKwlhcmdzWzRdID0gTlVMTDsKKwlhcmdjIC09IDI7IC8vIG51bWJlciBvZiBmaWxlcyB3ZSB3YXRjaAorCisJLy8gb3BlbiBpbm90aWZ5CisJcGZkLmZkID0gaW5vdGlmeV9pbml0KCk7CisJaWYgKHBmZC5mZCA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibm8ga2VybmVsIHN1cHBvcnQiKTsKKworCS8vIHNldHVwIHdhdGNoZXMKKwl3aGlsZSAoKisrYXJndikgeworCQljaGFyICpwYXRoID0gKmFyZ3Y7CisJCWNoYXIgKm1hc2tzID0gc3RyY2hyKHBhdGgsICc6Jyk7CisKKwkJbWFzayA9IDB4MGZmZjsgLy8gYXNzdW1pbmcgd2Ugd2FudCBhbGwgbm9uLWtlcm5lbCBldmVudHMKKwkJLy8gaWYgbWFzayBpcyBzcGVjaWZpZWQgLT4KKwkJaWYgKG1hc2tzKSB7CisJCQkqbWFza3MgPSAnXDAnOyAvLyBzcGxpdCBwYXRoIGFuZCBtYXNrCisJCQkvLyBjb252ZXJ0IG1hc2sgbmFtZXMgdG8gbWFzayBiaXRzZXQKKwkJCW1hc2sgPSAwOworCQkJd2hpbGUgKCorK21hc2tzKSB7CisJCQkJY29uc3QgY2hhciAqZm91bmQ7CisJCQkJZm91bmQgPSBtZW1jaHIobWFza19uYW1lcywgKm1hc2tzLCBNQVNLX0JJVFMpOworCQkJCWlmIChmb3VuZCkKKwkJCQkJbWFzayB8PSAoMSA8PCAoZm91bmQgLSBtYXNrX25hbWVzKSk7CisJCQl9CisJCX0KKwkJLy8gYWRkIHdhdGNoCisJCW4gPSBpbm90aWZ5X2FkZF93YXRjaChwZmQuZmQsIHBhdGgsIG1hc2spOworCQlpZiAobiA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImFkZCB3YXRjaCAoJXMpIGZhaWxlZCIsIHBhdGgpOworCQkvL2JiX2Vycm9yX21zZygiYWRkZWQgJWQgWyVzXTolNFgiLCBuLCBwYXRoLCBtYXNrKTsKKwl9CisKKwkvLyBzZXR1cCBzaWduYWxzCisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCByZWNvcmRfc2lnbm8pOworCisJLy8gZG8gd2F0Y2gKKwlwZmQuZXZlbnRzID0gUE9MTElOOworCXdoaWxlICgxKSB7CisJCWludCBsZW47CisJCXZvaWQgKmJ1ZjsKKwkJc3RydWN0IGlub3RpZnlfZXZlbnQgKmllOworIGFnYWluOgorCQlpZiAoYmJfZ290X3NpZ25hbCkKKwkJCWJyZWFrOworCQluID0gcG9sbCgmcGZkLCAxLCAtMSk7CisJCS8vIFNpZ25hbCBpbnRlcnJ1cHRlZCB1cz8KKwkJaWYgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKQorCQkJZ290byBhZ2FpbjsKKwkJLy8gVW5kZXIgTGludXgsIGFib3ZlIGlmKCkgaXMgbm90IG5lY2Vzc2FyeS4KKwkJLy8gTm9uLWZhdGFsIHNpZ25hbHMsIGUuZy4gU0lHQ0hMRCwgd2hlbiBzZXQgdG8gU0lHX0RGTCwKKwkJLy8gYXJlIG5vdCBpbnRlcnJ1cHRpbmcgcG9sbCgpLgorCQkvLyBUaHVzIHdlIGNhbiBqdXN0IGJyZWFrIGlmIG4gPD0gMCAoc2VlIGJlbG93KSwKKwkJLy8gYmVjYXVzZSBFSU5UUiB3aWxsIGhhcHBlbiBvbmx5IG9uIFNJR1RFUk0gZXQgYWwuCisJCS8vIEJ1dCB0aGlzIG1pZ2h0IGJlIG5vdCB0cnVlIHVuZGVyIG90aGVyIFVuaXhlcywKKwkJLy8gYW5kIGlzIGdlbmVyYWxseSB3YXkgdG9vIHN1YnRsZSB0byBkZXBlbmQgb24uCisJCWlmIChuIDw9IDApIC8vIHN0cmFuZ2UgZXJyb3I/CisJCQlicmVhazsKKworCQkvLyByZWFkIG91dCBhbGwgcGVuZGluZyBldmVudHMKKwkJLy8gKE5COiBsZW4gbXVzdCBiZSBpbnQsIG5vdCBzc2l6ZV90IG9yIGxvbmchKQorCQl4aW9jdGwocGZkLmZkLCBGSU9OUkVBRCwgJmxlbik7CisjZGVmaW5lIGV2ZW50YnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCWllID0gYnVmID0gKGxlbiA8PSBzaXplb2YoZXZlbnRidWYpKSA/IGV2ZW50YnVmIDogeG1hbGxvYyhsZW4pOworCQlsZW4gPSBmdWxsX3JlYWQocGZkLmZkLCBidWYsIGxlbik7CisJCS8vIHByb2Nlc3MgZXZlbnRzLiBOLkIuIGV2ZW50cyBtYXkgdmFyeSBpbiBsZW5ndGgKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCWludCBpOworCQkJLy8gY2FjaGUgcmVsZXZhbnQgZXZlbnRzIG1hc2sKKwkJCXVuc2lnbmVkIG0gPSBpZS0+bWFzayAmICgoMSA8PCBNQVNLX0JJVFMpIC0gMSk7CisJCQlpZiAobSkgeworCQkJCWNoYXIgZXZlbnRzW01BU0tfQklUUyArIDFdOworCQkJCWNoYXIgKnMgPSBldmVudHM7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BU0tfQklUUzsgKytpLCBtID4+PSAxKSB7CisJCQkJCWlmICgobSAmIDEpICYmIChtYXNrX25hbWVzW2ldICE9ICdcMCcpKQorCQkJCQkJKnMrKyA9IG1hc2tfbmFtZXNbaV07CisJCQkJfQorCQkJCSpzID0gJ1wwJzsKKy8vCQkJCWJiX2Vycm9yX21zZygiZXhlYyAlcyAlMDhYXHQlc1x0JXNcdCVzIiwgYXJnc1swXSwKKy8vCQkJCQlpZS0+bWFzaywgZXZlbnRzLCB3YXRjaGVzW2llLT53ZF0sIGllLT5sZW4gPyBpZS0+bmFtZSA6ICIiKTsKKwkJCQlhcmdzWzFdID0gZXZlbnRzOworCQkJCWFyZ3NbMl0gPSB3YXRjaGVzW2llLT53ZF07CisJCQkJYXJnc1szXSA9IGllLT5sZW4gPyBpZS0+bmFtZSA6IE5VTEw7CisJCQkJc3Bhd25fYW5kX3dhaXQoKGNoYXIgKiopYXJncyk7CisJCQkJLy8gd2UgYXJlIGRvbmUgaWYgYWxsIGZpbGVzIGdvdCBmaW5hbCB4IGV2ZW50CisJCQkJaWYgKGllLT5tYXNrICYgMHg4MDAwKSB7CisJCQkJCWlmICgtLWFyZ2MgPD0gMCkKKwkJCQkJCWdvdG8gZG9uZTsKKwkJCQkJaW5vdGlmeV9ybV93YXRjaChwZmQuZmQsIGllLT53ZCk7CisJCQkJfQorCQkJfQorCQkJLy8gbmV4dCBldmVudAorCQkJaSA9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkgKyBpZS0+bGVuOworCQkJbGVuIC09IGk7CisJCQlpZSA9ICh2b2lkKikoKGNoYXIqKWllICsgaSk7CisJCX0KKwkJaWYgKGV2ZW50YnVmICE9IGJ1ZikKKwkJCWZyZWUoYnVmKTsKKwl9IC8vIHdoaWxlICgxKQorIGRvbmU6CisJcmV0dXJuIGJiX2dvdF9zaWduYWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvaW9uaWNlLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvaW9uaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMDA2MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9pb25pY2UuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaW9uaWNlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94IGJhc2VkIG9uIGxpbnV4LXV0aWxzLW5nIDIuMTQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgIDx1MTczMDM0QGluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpb25pY2VfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstYyAxLTNdIFstbiAwLTddIFstcCBQSURdIFtQUk9HXSIKKy8vdXNhZ2U6I2RlZmluZSBpb25pY2VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2UgSS9PIHByaW9yaXR5IGFuZCBjbGFzc1xuIgorLy91c2FnZTogICAgICJcbgktYwlDbGFzcy4gMTpyZWFsdGltZSAyOmJlc3QtZWZmb3J0IDM6aWRsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpb3JpdHkiCisKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgaW50IGlvcHJpb19zZXQoaW50IHdoaWNoLCBpbnQgd2hvLCBpbnQgaW9wcmlvKQoreworCXJldHVybiBzeXNjYWxsKFNZU19pb3ByaW9fc2V0LCB3aGljaCwgd2hvLCBpb3ByaW8pOworfQorCitzdGF0aWMgaW50IGlvcHJpb19nZXQoaW50IHdoaWNoLCBpbnQgd2hvKQoreworCXJldHVybiBzeXNjYWxsKFNZU19pb3ByaW9fZ2V0LCB3aGljaCwgd2hvKTsKK30KKworZW51bSB7CisJSU9QUklPX1dIT19QUk9DRVNTID0gMSwKKwlJT1BSSU9fV0hPX1BHUlAsCisJSU9QUklPX1dIT19VU0VSCit9OworCitlbnVtIHsKKwlJT1BSSU9fQ0xBU1NfTk9ORSwKKwlJT1BSSU9fQ0xBU1NfUlQsCisJSU9QUklPX0NMQVNTX0JFLAorCUlPUFJJT19DTEFTU19JRExFCit9OworCitzdGF0aWMgY29uc3QgY2hhciB0b19wcmlvW10gPSAibm9uZVwwcmVhbHRpbWVcMGJlc3QtZWZmb3J0XDBpZGxlIjsKKworI2RlZmluZSBJT1BSSU9fQ0xBU1NfU0hJRlQgICAgICAxMworCitpbnQgaW9uaWNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpb25pY2VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIERlZmF1bHRzICovCisJaW50IGlvY2xhc3MgPSAwOworCWludCBwcmkgPSAwOworCWludCBwaWQgPSAwOyAvKiBhZmZlY3Qgb3duIHBvcmNlc3MgKi8KKwlpbnQgb3B0OworCWVudW0geworCQlPUFRfbiA9IDEsCisJCU9QVF9jID0gMiwKKwkJT1BUX3AgPSA0LAorCX07CisKKwkvKiBOdW1lcmljIHBhcmFtcyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm4rOmMrOnArIjsKKwkvKiAnKyc6IHN0b3AgYXQgZmlyc3Qgbm9uLW9wdGlvbiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrbjpjOnA6IiwgJnByaSwgJmlvY2xhc3MsICZwaWQpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKG9wdCAmIE9QVF9jKSB7CisJCWlmIChpb2NsYXNzID4gMykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgY2xhc3MgJWQiLCBpb2NsYXNzKTsKKy8vIERvIHdlIG5lZWQgdGhpcyAoY29tcGF0Pyk/CisvLwkJaWYgKGlvY2xhc3MgPT0gSU9QUklPX0NMQVNTX05PTkUpCisvLwkJCWlvY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CisvLwkJaWYgKGlvY2xhc3MgPT0gSU9QUklPX0NMQVNTX0lETEUpIHsKKy8vCQkJLy9pZiAob3B0ICYgT1BUX24pCisvLwkJCS8vCWJiX2Vycm9yX21zZygiaWdub3JpbmcgcHJpb3JpdHkgZm9yIGlkbGUgY2xhc3MiKTsKKy8vCQkJcHJpID0gNzsKKy8vCQl9CisJfQorCisJaWYgKCEob3B0ICYgKE9QVF9ufE9QVF9jKSkpIHsKKwkJaWYgKCEob3B0ICYgT1BUX3ApICYmICphcmd2KQorCQkJcGlkID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YpOworCisJCXByaSA9IGlvcHJpb19nZXQoSU9QUklPX1dIT19QUk9DRVNTLCBwaWQpOworCQlpZiAocHJpID09IC0xKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJpb3ByaW9fJWNldCIsICdnJyk7CisKKwkJaW9jbGFzcyA9IChwcmkgPj4gSU9QUklPX0NMQVNTX1NISUZUKSAmIDB4MzsKKwkJcHJpICY9IDB4ZmY7CisJCXByaW50ZigoaW9jbGFzcyA9PSBJT1BSSU9fQ0xBU1NfSURMRSkgPyAiJXNcbiIgOiAiJXM6IHByaW8gJWRcbiIsCisJCQkJbnRoX3N0cmluZyh0b19wcmlvLCBpb2NsYXNzKSwgcHJpKTsKKwl9IGVsc2UgeworLy9wcmludGYoInByaT0lZCBjbGFzcz0lZCB2YWw9JXhcbiIsCisvL3ByaSwgaW9jbGFzcywgcHJpIHwgKGlvY2xhc3MgPDwgSU9QUklPX0NMQVNTX1NISUZUKSk7CisJCXByaSB8PSAoaW9jbGFzcyA8PCBJT1BSSU9fQ0xBU1NfU0hJRlQpOworCQlpZiAoaW9wcmlvX3NldChJT1BSSU9fV0hPX1BST0NFU1MsIHBpZCwgcHJpKSA9PSAtMSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiaW9wcmlvXyVjZXQiLCAncycpOworCQlpZiAoYXJndlswXSkgeworCQkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwkJfQorCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbGFzdC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2xhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI3ODAzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL2xhc3QuYwpAQCAtMCwwICsxLDE0MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGFzdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsYXN0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiSUZfRkVBVFVSRV9MQVNUX0ZBTkNZKCJbLUhXXSBbLWYgRklMRV0iKQorLy91c2FnZTojZGVmaW5lIGxhc3RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGxpc3Rpbmcgb2YgdGhlIGxhc3QgdXNlcnMgdGhhdCBsb2dnZWQgaW50byB0aGUgc3lzdGVtIgorLy91c2FnZToJSUZfRkVBVFVSRV9MQVNUX0ZBTkNZKCAiXG4iCisvKiAvL3VzYWdlOiAgIlxuCS1ICVNob3cgaGVhZGVyIGxpbmUiICovCisvL3VzYWdlOiAgICAgIlxuCS1XCURpc3BsYXkgd2l0aCBubyBob3N0IGNvbHVtbiB0cnVuY2F0aW9uIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFIFJlYWQgZnJvbSBGSUxFIGluc3RlYWQgb2YgL3Zhci9sb2cvd3RtcCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE5COiB1dF9uYW1lIGFuZCB1dF91c2VyIGFyZSB0aGUgc2FtZSBmaWVsZCwgdXNlIG9ubHkgb25lIG5hbWUgKHV0X3VzZXIpCisgKiB0byByZWR1Y2UgY29uZnVzaW9uICovCisKKyNpZm5kZWYgU0hVVERPV05fVElNRQorIyAgZGVmaW5lIFNIVVRET1dOX1RJTUUgMjU0CisjZW5kaWYKKworLyogR3JyLi4uIHV0bXAgY2hhcltdIG1lbWJlcnMgZG8gbm90IGhhdmUgdG8gYmUgbnVsLXRlcm1pbmF0ZWQuCisgKiBEbyB3aGF0IHdlIGNhbiB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoaXMgcmVhc29uYWJseSBzbWFsbC4KKyAqIE5vdGU6IFdlIGFyZSBhc3N1bWluZyB0aGUgdXRfaWRbXSBzaXplIGlzIGZpeGVkIGF0IDQuICovCisKKyNpZiBkZWZpbmVkIFVUX0xJTkVTSVpFIFwKKwkmJiAoKFVUX0xJTkVTSVpFICE9IDMyKSB8fCAoVVRfTkFNRVNJWkUgIT0gMzIpIHx8IChVVF9IT1NUU0laRSAhPSAyNTYpKQorI2Vycm9yIHN0cnVjdCB1dG1wIG1lbWJlciBjaGFyW10gc2l6ZShzKSBoYXZlIGNoYW5nZWQhCisjZWxpZiBkZWZpbmVkIF9fVVRfTElORVNJWkUgXAorCSYmICgoX19VVF9MSU5FU0laRSAhPSAzMikgfHwgKF9fVVRfTkFNRVNJWkUgIT0gNjQpIHx8IChfX1VUX0hPU1RTSVpFICE9IDI1NikpCisjZXJyb3Igc3RydWN0IHV0bXAgbWVtYmVyIGNoYXJbXSBzaXplKHMpIGhhdmUgY2hhbmdlZCEKKyNlbmRpZgorCisjaWYgRU1QVFkgIT0gMCB8fCBSVU5fTFZMICE9IDEgfHwgQk9PVF9USU1FICE9IDIgfHwgTkVXX1RJTUUgIT0gMyB8fCBcCisJT0xEX1RJTUUgIT0gNAorI2Vycm9yIFZhbHVlcyBmb3IgdGhlIHV0X3R5cGUgZmllbGQgb2Ygc3RydWN0IHV0bXAgY2hhbmdlZAorI2VuZGlmCisKK2ludCBsYXN0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsYXN0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHV0bXAgdXQ7CisJaW50IG4sIGZpbGUgPSBTVERJTl9GSUxFTk87CisJdGltZV90IHRfdG1wOworCW9mZl90IHBvczsKKwlzdGF0aWMgY29uc3QgY2hhciBfdXRfdXNyW10gQUxJR04xID0KKwkJCSJydW5sZXZlbFwwIiAicmVib290XDAiICJzaHV0ZG93blwwIjsKKwlzdGF0aWMgY29uc3QgY2hhciBfdXRfbGluW10gQUxJR04xID0KKwkJCSJ+XDAiICJ7XDAiICJ8XDAiIC8qICJMT0dJTlwwIiAiZGF0ZVwwIiAqLzsKKwllbnVtIHsKKwkJVFlQRV9SVU5fTFZMID0gUlVOX0xWTCwgICAgICAgICAvKiAxICovCisJCVRZUEVfQk9PVF9USU1FID0gQk9PVF9USU1FLCAgICAgLyogMiAqLworCQlUWVBFX1NIVVRET1dOX1RJTUUgPSBTSFVURE9XTl9USU1FCisJfTsKKwllbnVtIHsKKwkJX1RJTERFID0gRU1QVFksIC8qIDAgKi8KKwkJVFlQRV9ORVdfVElNRSwgIC8qIE5FV19USU1FLCAzICovCisJCVRZUEVfT0xEX1RJTUUgICAvKiBPTERfVElNRSwgNCAqLworCX07CisKKwlpZiAoYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCWZpbGUgPSB4b3BlbihiYl9wYXRoX3d0bXBfZmlsZSwgT19SRE9OTFkpOworCisJcHJpbnRmKCIlLTEwcyAlLTE0cyAlLTE4cyAlLTEyLjEycyAlc1xuIiwKKwkgICAgICAgIlVTRVIiLCAiVFRZIiwgIkhPU1QiLCAiTE9HSU4iLCAiVElNRSIpOworCS8qIHlpa2VzLiBXZSByZXZlcnNlIG92ZXIgdGhlIGZpbGUgYW5kIHRoYXQgaXMgYSBub3QgdG9vIGVsZWdhbnQgd2F5ICovCisJcG9zID0geGxzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKKwlwb3MgPSBsc2VlayhmaWxlLCBwb3MgLSBzaXplb2YodXQpLCBTRUVLX1NFVCk7CisJd2hpbGUgKChuID0gZnVsbF9yZWFkKGZpbGUsICZ1dCwgc2l6ZW9mKHV0KSkpID4gMCkgeworCQlpZiAobiAhPSBzaXplb2YodXQpKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkJfQorCQluID0gaW5kZXhfaW5fc3RyaW5ncyhfdXRfbGluLCB1dC51dF9saW5lKTsKKwkJaWYgKG4gPT0gX1RJTERFKSB7IC8qICd+JyAqLworI2lmIDEKKy8qIGRvIHdlIHJlYWxseSBuZWVkIHRvIGJlIGNhdXRpb3VzIGhlcmU/ICovCisJCQluID0gaW5kZXhfaW5fc3RyaW5ncyhfdXRfdXNyLCB1dC51dF91c2VyKTsKKwkJCWlmICgrK24gPiAwKQorCQkJCXV0LnV0X3R5cGUgPSBuICE9IDMgPyBuIDogU0hVVERPV05fVElNRTsKKyNlbHNlCisJCQlpZiAoc3RybmNtcCh1dC51dF91c2VyLCAic2h1dGRvd24iLCA4KSA9PSAwKQorCQkJCXV0LnV0X3R5cGUgPSBTSFVURE9XTl9USU1FOworCQkJZWxzZSBpZiAoc3RybmNtcCh1dC51dF91c2VyLCAicmVib290IiwgNikgPT0gMCkKKwkJCQl1dC51dF90eXBlID0gQk9PVF9USU1FOworCQkJZWxzZSBpZiAoc3RybmNtcCh1dC51dF91c2VyLCAicnVubGV2ZWwiLCA4KSA9PSAwKQorCQkJCXV0LnV0X3R5cGUgPSBSVU5fTFZMOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlpZiAodXQudXRfdXNlclswXSA9PSAnXDAnIHx8IHN0cmNtcCh1dC51dF91c2VyLCAiTE9HSU4iKSA9PSAwKSB7CisJCQkJLyogRG9uJ3QgYm90aGVyLiAgVGhpcyBtZWFucyB3ZSBjYW4ndCBmaW5kIGhvdyBsb25nCisJCQkJICogc29tZW9uZSB3YXMgbG9nZ2VkIGluIGZvci4gIE9oIHdlbGwuICovCisJCQkJZ290byBuZXh0OworCQkJfQorCQkJaWYgKHV0LnV0X3R5cGUgIT0gREVBRF9QUk9DRVNTCisJCQkgJiYgdXQudXRfdXNlclswXQorCQkJICYmIHV0LnV0X2xpbmVbMF0KKwkJCSkgeworCQkJCXV0LnV0X3R5cGUgPSBVU0VSX1BST0NFU1M7CisJCQl9CisJCQlpZiAoc3RyY21wKHV0LnV0X3VzZXIsICJkYXRlIikgPT0gMCkgeworCQkJCWlmIChuID09IFRZUEVfT0xEX1RJTUUpIHsgLyogJ3wnICovCisJCQkJCXV0LnV0X3R5cGUgPSBPTERfVElNRTsKKwkJCQl9CisJCQkJaWYgKG4gPT0gVFlQRV9ORVdfVElNRSkgeyAvKiAneycgKi8KKwkJCQkJdXQudXRfdHlwZSA9IE5FV19USU1FOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICh1dC51dF90eXBlICE9IFVTRVJfUFJPQ0VTUykgeworCQkJc3dpdGNoICh1dC51dF90eXBlKSB7CisJCQkJY2FzZSBPTERfVElNRToKKwkJCQljYXNlIE5FV19USU1FOgorCQkJCWNhc2UgUlVOX0xWTDoKKwkJCQljYXNlIFNIVVRET1dOX1RJTUU6CisJCQkJCWdvdG8gbmV4dDsKKwkJCQljYXNlIEJPT1RfVElNRToKKwkJCQkJc3RyY3B5KHV0LnV0X2xpbmUsICJzeXN0ZW0gYm9vdCIpOworCQkJfQorCQl9CisJCS8qIG1hbnBhZ2VzIHNheSB1dF90di50dl9zZWMgKmlzKiB0aW1lX3QsCisJCSAqIGJ1dCBzb21lIHN5c3RlbXMgaGF2ZSBpdCB3cm9uZyAqLworCQl0X3RtcCA9ICh0aW1lX3QpdXQudXRfdHYudHZfc2VjOworCQlwcmludGYoIiUtMTBzICUtMTRzICUtMThzICUtMTIuMTJzXG4iLAorCQkgICAgICAgdXQudXRfdXNlciwgdXQudXRfbGluZSwgdXQudXRfaG9zdCwgY3RpbWUoJnRfdG1wKSArIDQpOworIG5leHQ6CisJCXBvcyAtPSBzaXplb2YodXQpOworCQlpZiAocG9zIDw9IDApCisJCQlicmVhazsgLyogZG9uZS4gKi8KKwkJeGxzZWVrKGZpbGUsIHBvcywgU0VFS19TRVQpOworCX0KKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9sYXN0X2ZhbmN5LmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbGFzdF9mYW5jeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDliNjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbGFzdF9mYW5jeS5jCkBAIC0wLDAgKzEsMjk1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAoc3lzdmluaXQgbGlrZSkgbGFzdCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYS5tdXNjYWx1QGF4aXMuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE5COiB1dF9uYW1lIGFuZCB1dF91c2VyIGFyZSB0aGUgc2FtZSBmaWVsZCwgdXNlIG9ubHkgb25lIG5hbWUgKHV0X3VzZXIpCisgKiB0byByZWR1Y2UgY29uZnVzaW9uICovCisKKyNpZm5kZWYgU0hVVERPV05fVElNRQorIyAgZGVmaW5lIFNIVVRET1dOX1RJTUUgMjU0CisjZW5kaWYKKworI2RlZmluZSBIRUFERVJfRk9STUFUICAgICAiJS04LjhzICUtMTIuMTJzICUtKi4qcyAlLTE2LjE2cyAlLTcuN3MgJXNcbiIKKyNkZWZpbmUgSEVBREVSX0xJTkUgICAgICAgIlVTRVIiLCAiVFRZIiwgXAorCUlORVRfQUREUlNUUkxFTiwgSU5FVF9BRERSU1RSTEVOLCAiSE9TVCIsICJMT0dJTiIsICIgIFRJTUUiLCAiIgorI2RlZmluZSBIRUFERVJfTElORV9XSURFICAiVVNFUiIsICJUVFkiLCBcCisJSU5FVDZfQUREUlNUUkxFTiwgSU5FVDZfQUREUlNUUkxFTiwgIkhPU1QiLCAiTE9HSU4iLCAiICBUSU1FIiwgIiIKKworZW51bSB7CisJTk9STUFMLAorCUxPR0dFRCwKKwlET1dOLAorCVJFQk9PVCwKKwlDUkFTSCwKKwlHT05FCit9OworCitlbnVtIHsKKwlMQVNUX09QVF9XID0gKDEgPDwgMCksICAvKiAtVyB3aWRlICAgICAgICAgICAgKi8KKwlMQVNUX09QVF9mID0gKDEgPDwgMSksICAvKiAtZiBpbnB1dCBmaWxlICAgICAgKi8KKwlMQVNUX09QVF9IID0gKDEgPDwgMiksICAvKiAtSCBoZWFkZXIgICAgICAgICAgKi8KK307CisKKyNkZWZpbmUgc2hvd193aWRlIChvcHRpb25fbWFzazMyICYgTEFTVF9PUFRfVykKKworc3RhdGljIHZvaWQgc2hvd19lbnRyeShzdHJ1Y3QgdXRtcCAqdXQsIGludCBzdGF0ZSwgdGltZV90IGR1cl9zZWNzKQoreworCXVuc2lnbmVkIGRheXMsIGhvdXJzLCBtaW5zOworCWNoYXIgZHVyYXRpb25bMzJdOworCWNoYXIgbG9naW5fdGltZVsxN107CisJY2hhciBsb2dvdXRfdGltZVs4XTsKKwljb25zdCBjaGFyICpsb2dvdXRfc3RyOworCWNvbnN0IGNoYXIgKmR1cmF0aW9uX3N0cjsKKwl0aW1lX3QgdG1wOworCisJLyogbWFucGFnZXMgc2F5IHV0X3R2LnR2X3NlYyAqaXMqIHRpbWVfdCwKKwkgKiBidXQgc29tZSBzeXN0ZW1zIGhhdmUgaXQgd3JvbmcgKi8KKwl0bXAgPSB1dC0+dXRfdHYudHZfc2VjOworCXNhZmVfc3RybmNweShsb2dpbl90aW1lLCBjdGltZSgmdG1wKSwgMTcpOworCXNucHJpbnRmKGxvZ291dF90aW1lLCA4LCAiLSAlcyIsIGN0aW1lKCZkdXJfc2VjcykgKyAxMSk7CisKKwlkdXJfc2VjcyA9IE1BWChkdXJfc2VjcyAtICh0aW1lX3QpdXQtPnV0X3R2LnR2X3NlYywgKHRpbWVfdCkwKTsKKwkvKiB1bnNpZ25lZCBpbnQgaXMgZWFzaWVyIHRvIGRpdmlkZSB0aGFuIHRpbWVfdCAod2hpY2ggbWF5IGJlIHNpZ25lZCBsb25nKSAqLworCW1pbnMgPSBkdXJfc2VjcyAvIDYwOworCWRheXMgPSBtaW5zIC8gKDI0KjYwKTsKKwltaW5zID0gbWlucyAlICgyNCo2MCk7CisJaG91cnMgPSBtaW5zIC8gNjA7CisJbWlucyA9IG1pbnMgJSA2MDsKKworLy8JaWYgKGRheXMpIHsKKwkJc3ByaW50ZihkdXJhdGlvbiwgIigldSslMDJ1OiUwMnUpIiwgZGF5cywgaG91cnMsIG1pbnMpOworLy8JfSBlbHNlIHsKKy8vCQlzcHJpbnRmKGR1cmF0aW9uLCAiICglMDJ1OiUwMnUpIiwgaG91cnMsIG1pbnMpOworLy8JfQorCisJbG9nb3V0X3N0ciA9IGxvZ291dF90aW1lOworCWR1cmF0aW9uX3N0ciA9IGR1cmF0aW9uOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIE5PUk1BTDoKKwkJYnJlYWs7CisJY2FzZSBMT0dHRUQ6CisJCWxvZ291dF9zdHIgPSAiICBzdGlsbCI7CisJCWR1cmF0aW9uX3N0ciA9ICJsb2dnZWQgaW4iOworCQlicmVhazsKKwljYXNlIERPV046CisJCWxvZ291dF9zdHIgPSAiLSBkb3duICI7CisJCWJyZWFrOworCWNhc2UgUkVCT09UOgorCQlicmVhazsKKwljYXNlIENSQVNIOgorCQlsb2dvdXRfc3RyID0gIi0gY3Jhc2giOworCQlicmVhazsKKwljYXNlIEdPTkU6CisJCWxvZ291dF9zdHIgPSAiICAgZ29uZSI7CisJCWR1cmF0aW9uX3N0ciA9ICItIG5vIGxvZ291dCI7CisJCWJyZWFrOworCX0KKworCXByaW50ZihIRUFERVJfRk9STUFULAorCQkgICB1dC0+dXRfdXNlciwKKwkJICAgdXQtPnV0X2xpbmUsCisJCSAgIHNob3dfd2lkZSA/IElORVQ2X0FERFJTVFJMRU4gOiBJTkVUX0FERFJTVFJMRU4sCisJCSAgIHNob3dfd2lkZSA/IElORVQ2X0FERFJTVFJMRU4gOiBJTkVUX0FERFJTVFJMRU4sCisJCSAgIHV0LT51dF9ob3N0LAorCQkgICBsb2dpbl90aW1lLAorCQkgICBsb2dvdXRfc3RyLAorCQkgICBkdXJhdGlvbl9zdHIpOworfQorCitzdGF0aWMgaW50IGdldF91dF90eXBlKHN0cnVjdCB1dG1wICp1dCkKK3sKKwlpZiAodXQtPnV0X2xpbmVbMF0gPT0gJ34nKSB7CisJCWlmIChzdHJjbXAodXQtPnV0X3VzZXIsICJzaHV0ZG93biIpID09IDApIHsKKwkJCXJldHVybiBTSFVURE9XTl9USU1FOworCQl9CisJCWlmIChzdHJjbXAodXQtPnV0X3VzZXIsICJyZWJvb3QiKSA9PSAwKSB7CisJCQlyZXR1cm4gQk9PVF9USU1FOworCQl9CisJCWlmIChzdHJjbXAodXQtPnV0X3VzZXIsICJydW5sZXZlbCIpID09IDApIHsKKwkJCXJldHVybiBSVU5fTFZMOworCQl9CisJCXJldHVybiB1dC0+dXRfdHlwZTsKKwl9CisKKwlpZiAodXQtPnV0X3VzZXJbMF0gPT0gMCkgeworCQlyZXR1cm4gREVBRF9QUk9DRVNTOworCX0KKworCWlmICgodXQtPnV0X3R5cGUgIT0gREVBRF9QUk9DRVNTKQorCSAmJiAoc3RyY21wKHV0LT51dF91c2VyLCAiTE9HSU4iKSAhPSAwKQorCSAmJiB1dC0+dXRfdXNlclswXQorCSAmJiB1dC0+dXRfbGluZVswXQorCSkgeworCQl1dC0+dXRfdHlwZSA9IFVTRVJfUFJPQ0VTUzsKKwl9CisKKwlpZiAoc3RyY21wKHV0LT51dF91c2VyLCAiZGF0ZSIpID09IDApIHsKKwkJaWYgKHV0LT51dF9saW5lWzBdID09ICd8JykgeworCQkJcmV0dXJuIE9MRF9USU1FOworCQl9CisJCWlmICh1dC0+dXRfbGluZVswXSA9PSAneycpIHsKKwkJCXJldHVybiBORVdfVElNRTsKKwkJfQorCX0KKwlyZXR1cm4gdXQtPnV0X3R5cGU7Cit9CisKK3N0YXRpYyBpbnQgaXNfcnVubGV2ZWxfc2h1dGRvd24oc3RydWN0IHV0bXAgKnV0KQoreworCWlmICgoKHV0LT51dF9waWQgJiAyNTUpID09ICcwJykgfHwgKCh1dC0+dXRfcGlkICYgMjU1KSA9PSAnNicpKSB7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbGFzdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbGFzdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHV0bXAgdXQ7CisJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBfUEFUSF9XVE1QOworCWxsaXN0X3QgKnpsaXN0OworCW9mZl90IHBvczsKKwl0aW1lX3Qgc3RhcnRfdGltZTsKKwl0aW1lX3QgYm9vdF90aW1lOworCXRpbWVfdCBkb3duX3RpbWU7CisJaW50IGZpbGU7CisJc21hbGxpbnQgZ29pbmdfZG93bjsKKwlzbWFsbGludCBib290X2Rvd247CisKKwkvKm9wdCA9Ki8gZ2V0b3B0MzIoYXJndiwgIldmOiIgLyogIkgiICovLCAmZmlsZW5hbWUpOworI2lmZGVmIEJVVF9VVElMX0xJTlVYX0xBU1RfSEFTX05PX1NVQ0hfT1BUCisJaWYgKG9wdCAmIExBU1RfT1BUX0gpIHsKKwkJLyogUHJpbnQgaGVhZGVyIGxpbmUgKi8KKwkJaWYgKG9wdCAmIExBU1RfT1BUX1cpIHsKKwkJCXByaW50ZihIRUFERVJfRk9STUFULCBIRUFERVJfTElORV9XSURFKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZihIRUFERVJfRk9STUFULCBIRUFERVJfTElORSk7CisJCX0KKwl9CisjZW5kaWYKKworCWZpbGUgPSB4b3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCXsKKwkJLyogaW4gY2FzZSB0aGUgZmlsZSBpcyBlbXB0eS4uLiAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJZnN0YXQoZmlsZSwgJnN0KTsKKwkJc3RhcnRfdGltZSA9IHN0LnN0X2N0aW1lOworCX0KKworCXRpbWUoJmRvd25fdGltZSk7CisJZ29pbmdfZG93biA9IDA7CisJYm9vdF9kb3duID0gTk9STUFMOyAvKiAwICovCisJemxpc3QgPSBOVUxMOworCWJvb3RfdGltZSA9IDA7CisJLyogZ2V0IGZpbGUgc2l6ZSwgcm91bmRpbmcgZG93biB0byBsYXN0IGZ1bGwgcmVjb3JkICovCisJcG9zID0geGxzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKSAvIHNpemVvZih1dCkgKiBzaXplb2YodXQpOworCWZvciAoOzspIHsKKwkJcG9zIC09IChvZmZfdClzaXplb2YodXQpOworCQlpZiAocG9zIDwgMCkgeworCQkJLyogQmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgYm91bmRhcnkgPT4KKwkJCSAqIHRoZSB3aG9sZSBmaWxlIGhhcyBiZWVuIHJlYWQuICovCisJCQlicmVhazsKKwkJfQorCQl4bHNlZWsoZmlsZSwgcG9zLCBTRUVLX1NFVCk7CisJCXhyZWFkKGZpbGUsICZ1dCwgc2l6ZW9mKHV0KSk7CisJCS8qIHJld3JpdHRlbiBieSBlYWNoIHJlY29yZCwgZXZlbnRpYWxseSB3aWxsIGhhdmUKKwkJICogZmlyc3QgcmVjb3JkJ3MgdXRfdHYudHZfc2VjOiAqLworCQlzdGFydF90aW1lID0gdXQudXRfdHYudHZfc2VjOworCisJCXN3aXRjaCAoZ2V0X3V0X3R5cGUoJnV0KSkgeworCQljYXNlIFNIVVRET1dOX1RJTUU6CisJCQlkb3duX3RpbWUgPSB1dC51dF90di50dl9zZWM7CisJCQlib290X2Rvd24gPSBET1dOOworCQkJZ29pbmdfZG93biA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBSVU5fTFZMOgorCQkJaWYgKGlzX3J1bmxldmVsX3NodXRkb3duKCZ1dCkpIHsKKwkJCQlkb3duX3RpbWUgPSB1dC51dF90di50dl9zZWM7CisJCQkJZ29pbmdfZG93biA9IDE7CisJCQkJYm9vdF9kb3duID0gRE9XTjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJPT1RfVElNRToKKwkJCXN0cmNweSh1dC51dF9saW5lLCAic3lzdGVtIGJvb3QiKTsKKwkJCXNob3dfZW50cnkoJnV0LCBSRUJPT1QsIGRvd25fdGltZSk7CisJCQlib290X2Rvd24gPSBDUkFTSDsKKwkJCWdvaW5nX2Rvd24gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgREVBRF9QUk9DRVNTOgorCQkJaWYgKCF1dC51dF9saW5lWzBdKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBhZGRfZW50cnkgKi8KKwkJCWxsaXN0X2FkZF90bygmemxpc3QsIG1lbWNweSh4bWFsbG9jKHNpemVvZih1dCkpLCAmdXQsIHNpemVvZih1dCkpKTsKKwkJCWJyZWFrOworCQljYXNlIFVTRVJfUFJPQ0VTUzogeworCQkJaW50IHNob3c7CisKKwkJCWlmICghdXQudXRfbGluZVswXSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmluZF9lbnRyeSAqLworCQkJc2hvdyA9IDE7CisJCQl7CisJCQkJbGxpc3RfdCAqZWwsICpuZXh0OworCQkJCWZvciAoZWwgPSB6bGlzdDsgZWw7IGVsID0gbmV4dCkgeworCQkJCQlzdHJ1Y3QgdXRtcCAqdXAgPSAoc3RydWN0IHV0bXAgKillbC0+ZGF0YTsKKwkJCQkJbmV4dCA9IGVsLT5saW5rOworCQkJCQlpZiAoc3RybmNtcCh1cC0+dXRfbGluZSwgdXQudXRfbGluZSwgVVRfTElORVNJWkUpID09IDApIHsKKwkJCQkJCWlmIChzaG93KSB7CisJCQkJCQkJc2hvd19lbnRyeSgmdXQsIE5PUk1BTCwgdXAtPnV0X3R2LnR2X3NlYyk7CisJCQkJCQkJc2hvdyA9IDA7CisJCQkJCQl9CisJCQkJCQlsbGlzdF91bmxpbmsoJnpsaXN0LCBlbCk7CisJCQkJCQlmcmVlKGVsLT5kYXRhKTsKKwkJCQkJCWZyZWUoZWwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoc2hvdykgeworCQkJCWludCBzdGF0ZSA9IGJvb3RfZG93bjsKKworCQkJCWlmIChib290X3RpbWUgPT0gMCkgeworCQkJCQlzdGF0ZSA9IExPR0dFRDsKKwkJCQkJLyogQ2hlY2sgaWYgdGhlIHByb2Nlc3MgaXMgYWxpdmUgKi8KKwkJCQkJaWYgKCh1dC51dF9waWQgPiAwKQorCQkJCQkgJiYgKGtpbGwodXQudXRfcGlkLCAwKSAhPSAwKQorCQkJCQkgJiYgKGVycm5vID09IEVTUkNIKSkgeworCQkJCQkJc3RhdGUgPSBHT05FOworCQkJCQl9CisJCQkJfQorCQkJCXNob3dfZW50cnkoJnV0LCBzdGF0ZSwgYm9vdF90aW1lKTsKKwkJCX0KKwkJCS8qIGFkZF9lbnRyeSAqLworCQkJbGxpc3RfYWRkX3RvKCZ6bGlzdCwgbWVtY3B5KHhtYWxsb2Moc2l6ZW9mKHV0KSksICZ1dCwgc2l6ZW9mKHV0KSkpOworCQkJYnJlYWs7CisJCX0KKwkJfQorCisJCWlmIChnb2luZ19kb3duKSB7CisJCQlib290X3RpbWUgPSB1dC51dF90di50dl9zZWM7CisJCQlsbGlzdF9mcmVlKHpsaXN0LCBmcmVlKTsKKwkJCXpsaXN0ID0gTlVMTDsKKwkJCWdvaW5nX2Rvd24gPSAwOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWxsaXN0X2ZyZWUoemxpc3QsIGZyZWUpOworCX0KKworCXByaW50ZigiXG53dG1wIGJlZ2lucyAlcyIsIGN0aW1lKCZzdGFydF90aW1lKSk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZpbGUpOworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9sZXNzLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbGVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWZkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbGVzcy5jCkBAIC0wLDAgKzEsMTkxNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBsZXNzIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IFJvYiBTdWxsaXZhbiA8Y29naXRvLmVyZ28uY29naXRvQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBUT0RPOgorICogLSBBZGQgbW9yZSByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCAtIHNlYXJjaCBtb2RpZmllcnMsIGNlcnRhaW4gbWF0Y2hlcywgZXRjLgorICogLSBBZGQgbW9yZSBjb21wbGV4IGJyYWNrZXQgc2VhcmNoaW5nIC0gY3VycmVudGx5LCBuZXN0ZWQgYnJhY2tldHMgYXJlCisgKiAgIG5vdCBjb25zaWRlcmVkLgorICogLSBBZGQgc3VwcG9ydCBmb3IgIkYiIGFzIGFuIGlucHV0LiBUaGlzIGNhdXNlcyBsZXNzIHRvIGFjdCBpbgorICogICBhIHNpbWlsYXIgd2F5IHRvIHRhaWwgLWYuCisgKiAtIEFsbG93IGhvcml6b250YWwgc2Nyb2xsaW5nLgorICoKKyAqIE5vdGVzOgorICogLSB0aGUgaW5wIGZpbGUgcG9pbnRlciBpcyB1c2VkIHNvIHRoYXQga2V5Ym9hcmQgaW5wdXQgd29ya3MgYWZ0ZXIKKyAqICAgcmVkaXJlY3RlZCBpbnB1dCBoYXMgYmVlbiByZWFkIGZyb20gc3RkaW4KKyAqLworCisvL2NvbmZpZzpjb25maWcgTEVTUworLy9jb25maWc6CWJvb2wgImxlc3MiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgJ2xlc3MnIGlzIGEgcGFnZXIsIG1lYW5pbmcgdGhhdCBpdCBkaXNwbGF5cyB0ZXh0IGZpbGVzLiBJdCBwb3NzZXNzZXMKKy8vY29uZmlnOgkgIGEgd2lkZSBhcnJheSBvZiBmZWF0dXJlcywgYW5kIGlzIGFuIGltcHJvdmVtZW50IG92ZXIgJ21vcmUnLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9MRVNTX01BWExJTkVTCisvL2NvbmZpZzoJaW50ICJNYXggbnVtYmVyIG9mIGlucHV0IGxpbmVzIGxlc3Mgd2lsbCB0cnkgdG8gZWF0IgorLy9jb25maWc6CWRlZmF1bHQgOTk5OTk5OQorLy9jb25maWc6CWRlcGVuZHMgb24gTEVTUworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9MRVNTX0JSQUNLRVRTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGJyYWNrZXQgc2VhcmNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTEVTUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIGNhcGFiaWxpdHkgdG8gc2VhcmNoIGZvciBtYXRjaGluZyBsZWZ0IGFuZCByaWdodAorLy9jb25maWc6CSAgYnJhY2tldHMsIGZhY2lsaXRhdGluZyBwcm9ncmFtbWluZy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19GTEFHUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBleHRyYSBmbGFncyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGUgZXh0cmEgZmxhZ3MgcHJvdmlkZWQgZG8gdGhlIGZvbGxvd2luZzoKKy8vY29uZmlnOgorLy9jb25maWc6CSAgVGhlIC1NIGZsYWcgZW5hYmxlcyBhIG1vcmUgc29waGlzdGljYXRlZCBzdGF0dXMgbGluZS4KKy8vY29uZmlnOgkgIFRoZSAtbSBmbGFnIGVuYWJsZXMgYSBzaW1wbGVyIHN0YXR1cyBsaW5lIHdpdGggYSBwZXJjZW50YWdlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9MRVNTX01BUktTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIG1hcmtzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTEVTUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1hcmtzIGVuYWJsZSBwb3NpdGlvbnMgaW4gYSBmaWxlIHRvIGJlIHN0b3JlZCBmb3IgZWFzeSByZWZlcmVuY2UuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfUkVHRVhQCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBMRVNTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGFsbG93aW5nIGNvbXBsZXggZmlsZSBzZWFyY2hlcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19XSU5DSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBhdXRvbWF0aWMgcmVzaXppbmcgb24gd2luZG93IHNpemUgY2hhbmdlcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBNYWtlcyBsZXNzIHRyYWNrIHdpbmRvdyBzaXplIGNoYW5nZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMCisvL2NvbmZpZzoJYm9vbCAiVXNlICd0ZWxsIG1lIGN1cnNvciBwb3NpdGlvbicgRVNDIHNlcXVlbmNlIHRvIG1lYXN1cmUgd2luZG93IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9MRVNTX1dJTkNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWFrZXMgbGVzcyB0cmFjayB3aW5kb3cgc2l6ZSBjaGFuZ2VzLgorLy9jb25maWc6CSAgSWYgdGVybWluYWwgc2l6ZSBjYW4ndCBiZSByZXRyaWV2ZWQgYW5kICRMSU5FUy8kQ09MVU1OUyBhcmUgbm90IHNldCwKKy8vY29uZmlnOgkgIHRoaXMgb3B0aW9uIG1ha2VzIGxlc3MgcGVyZm9ybSBhIGxhc3QtZGl0Y2ggZWZmb3J0IHRvIGZpbmQgaXQ6CisvL2NvbmZpZzoJICBwb3NpdGlvbiBjdXJzb3IgdG8gOTk5LDk5OSBhbmQgYXNrIHRlcm1pbmFsIHRvIHJlcG9ydCByZWFsCisvL2NvbmZpZzoJICBjdXJzb3IgcG9zaXRpb24gdXNpbmcgIkVTQyBbIDYgbiIgZXNjYXBlIHNlcXVlbmNlLCB0aGVuIHJlYWQgc3RkaW4uCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoaXMgaXMgbm90IGNsZWFuIGJ1dCBoZWxwcyBhIGxvdCBvbiBzZXJpYWwgbGluZXMgYW5kIHN1Y2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfREFTSENNRAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBmbGFnIGNoYW5nZXMgKCctJyBjb21tYW5kKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIGVuYWJsZXMgdGhlIGFiaWxpdHkgdG8gY2hhbmdlIGNvbW1hbmQtbGluZSBmbGFncyB3aXRoaW4KKy8vY29uZmlnOgkgIGxlc3MgaXRzZWxmICgnLScga2V5Ym9hcmQgY29tbWFuZCkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfTElORU5VTVMKKy8vY29uZmlnOglib29sICJFbmFibGUgZHluYW1pYyBzd2l0Y2hpbmcgb2YgbGluZSBudW1iZXJzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9MRVNTX0RBU0hDTUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGVzICItTiIgY29tbWFuZC4KKworLy91c2FnZTojZGVmaW5lIGxlc3NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstRU1ObWh+ST9dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsZXNzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVmlldyBGSUxFIChvciBzdGRpbikgb25lIHNjcmVlbmZ1bCBhdCBhIHRpbWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUUJUXVpdCBvbmNlIHRoZSBlbmQgb2YgYSBmaWxlIGlzIHJlYWNoZWQiCisvL3VzYWdlOiAgICAgIlxuCS1NLC1tCURpc3BsYXkgc3RhdHVzIGxpbmUgd2l0aCBsaW5lIG51bWJlcnMiCisvL3VzYWdlOiAgICAgIlxuCQlhbmQgcGVyY2VudGFnZSB0aHJvdWdoIHRoZSBmaWxlIgorLy91c2FnZTogICAgICJcbgktTglQcmVmaXggbGluZSBudW1iZXIgdG8gZWFjaCBsaW5lIgorLy91c2FnZTogICAgICJcbgktSQlJZ25vcmUgY2FzZSBpbiBhbGwgc2VhcmNoZXMiCisvL3VzYWdlOiAgICAgIlxuCS1+CVN1cHByZXNzIH5zIGRpc3BsYXllZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUiCisKKyNpbmNsdWRlIDxzY2hlZC5oPiAgLyogc2NoZWRfeWllbGQoKSAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorI2luY2x1ZGUgInhyZWdleC5oIgorI2VuZGlmCisKKworI2RlZmluZSBFU0MgIlwwMzMiCisvKiBUaGUgZXNjYXBlIGNvZGVzIGZvciBoaWdobGlnaHRlZCBhbmQgbm9ybWFsIHRleHQgKi8KKyNkZWZpbmUgSElHSExJR0hUICAgRVNDIls3bSIKKyNkZWZpbmUgTk9STUFMICAgICAgRVNDIlswbSIKKy8qIFRoZSBlc2NhcGUgY29kZSB0byBob21lIGFuZCBjbGVhciB0byB0aGUgZW5kIG9mIHNjcmVlbiAqLworI2RlZmluZSBDTEVBUiAgICAgICBFU0MiW0hcMDMzW0oiCisvKiBUaGUgZXNjYXBlIGNvZGUgdG8gY2xlYXIgdG8gdGhlIGVuZCBvZiBsaW5lICovCisjZGVmaW5lIENMRUFSXzJfRU9MIEVTQyJbSyIKKworZW51bSB7CisvKiBBYnNvbHV0ZSBtYXggb2YgbGluZXMgZWF0ZW4gKi8KKwlNQVhMSU5FUyA9IENPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVMsCisvKiBUaGlzIG1hbnkgImFmdGVyIHRoZSBlbmQiIGxpbmVzIHdlIHdpbGwgc2hvdyAoYXQgbWF4KSAqLworCVRJTERFUyA9IDEsCit9OworCisvKiBDb21tYW5kIGxpbmUgb3B0aW9ucyAqLworZW51bSB7CisJRkxBR19FID0gMSA8PCAwLAorCUZMQUdfTSA9IDEgPDwgMSwKKwlGTEFHX20gPSAxIDw8IDIsCisJRkxBR19OID0gMSA8PCAzLAorCUZMQUdfVElMREUgPSAxIDw8IDQsCisJRkxBR19JID0gMSA8PCA1LAorCUZMQUdfUyA9ICgxIDw8IDYpICogRU5BQkxFX0ZFQVRVUkVfTEVTU19EQVNIQ01ELAorLyogaGlqYWNrIGNvbW1hbmQgbGluZSBvcHRpb25zIHZhcmlhYmxlIGZvciBpbnRlcm5hbCBzdGF0ZSB2YXJzICovCisJTEVTU19TVEFURV9NQVRDSF9CQUNLV0FSRFMgPSAxIDw8IDE1LAorfTsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorZW51bSB7IHBhdHRlcm5fdmFsaWQgPSAwIH07CisjZW5kaWYKKworc3RydWN0IGdsb2JhbHMgeworCWludCBjdXJfZmxpbmU7IC8qIHNpZ25lZCAqLworCWludCBrYmRfZmQ7ICAvKiBmZCB0byBnZXQgaW5wdXQgZnJvbSAqLworCWludCBsZXNzX2dldHNfcG9zOworLyogbGFzdCBwb3NpdGlvbiBpbiBsYXN0IGxpbmUsIHRha2luZyBpbnRvIGFjY291bnQgdGFicyAqLworCXNpemVfdCBsYXN0X2xpbmVfcG9zOworCXVuc2lnbmVkIG1heF9mbGluZTsKKwl1bnNpZ25lZCBtYXhfbGluZW5vOyAvKiB0aGlzIG9uZSB0cmFja3MgbGluZXdyYXAgKi8KKwl1bnNpZ25lZCBtYXhfZGlzcGxheWVkX2xpbmU7CisJdW5zaWduZWQgd2lkdGg7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19XSU5DSAorCXVuc2lnbmVkIHdpbmNoX2NvdW50ZXI7CisjZW5kaWYKKwlzc2l6ZV90IGVvZl9lcnJvcjsgLyogZW9mIGlmIDAsIGVycm9yIGlmIDwgMCAqLworCXNzaXplX3QgcmVhZHBvczsKKwlzc2l6ZV90IHJlYWRlb2Y7IC8qIG11c3QgYmUgc2lnbmVkICovCisJY29uc3QgY2hhciAqKmJ1ZmZlcjsKKwljb25zdCBjaGFyICoqZmxpbmVzOworCWNvbnN0IGNoYXIgKmVtcHR5X2xpbmVfbWFya2VyOworCXVuc2lnbmVkIG51bV9maWxlczsKKwl1bnNpZ25lZCBjdXJyZW50X2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciAqKmZpbGVzOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfTUFSS1MKKwl1bnNpZ25lZCBudW1fbWFya3M7CisJdW5zaWduZWQgbWFya19saW5lc1sxNV1bMl07CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCXVuc2lnbmVkICptYXRjaF9saW5lczsKKwlpbnQgbWF0Y2hfcG9zOyAvKiBzaWduZWQhICovCisJaW50IHdhbnRlZF9tYXRjaDsgLyogc2lnbmVkISAqLworCWludCBudW1fbWF0Y2hlczsKKwlyZWdleF90IHBhdHRlcm47CisJc21hbGxpbnQgcGF0dGVybl92YWxpZDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMCisJc21hbGxpbnQgd2luc2l6ZV9lcnI7CisjZW5kaWYKKwlzbWFsbGludCB0ZXJtaW5hdGVkOworCXN0cnVjdCB0ZXJtaW9zIHRlcm1fb3JpZywgdGVybV9sZXNzOworCWNoYXIga2JkX2lucHV0W0tFWUNPREVfQlVGRkVSX1NJWkVdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBjdXJfZmxpbmUgICAgICAgICAgIChHLmN1cl9mbGluZSAgICAgICAgICkKKyNkZWZpbmUga2JkX2ZkICAgICAgICAgICAgICAoRy5rYmRfZmQgICAgICAgICAgICApCisjZGVmaW5lIGxlc3NfZ2V0c19wb3MgICAgICAgKEcubGVzc19nZXRzX3BvcyAgICAgKQorI2RlZmluZSBsYXN0X2xpbmVfcG9zICAgICAgIChHLmxhc3RfbGluZV9wb3MgICAgICkKKyNkZWZpbmUgbWF4X2ZsaW5lICAgICAgICAgICAoRy5tYXhfZmxpbmUgICAgICAgICApCisjZGVmaW5lIG1heF9saW5lbm8gICAgICAgICAgKEcubWF4X2xpbmVubyAgICAgICAgKQorI2RlZmluZSBtYXhfZGlzcGxheWVkX2xpbmUgIChHLm1heF9kaXNwbGF5ZWRfbGluZSkKKyNkZWZpbmUgd2lkdGggICAgICAgICAgICAgICAoRy53aWR0aCAgICAgICAgICAgICApCisjZGVmaW5lIHdpbmNoX2NvdW50ZXIgICAgICAgKEcud2luY2hfY291bnRlciAgICAgKQorLyogVGhpcyBvbmUgaXMgMTAwJSBub3QgY2FjaGVkIGJ5IGNvbXBpbGVyIG9uIHJlYWQgYWNjZXNzICovCisjZGVmaW5lIFdJTkNIX0NPVU5URVIgKCoodm9sYXRpbGUgdW5zaWduZWQgKikmd2luY2hfY291bnRlcikKKyNkZWZpbmUgZW9mX2Vycm9yICAgICAgICAgICAoRy5lb2ZfZXJyb3IgICAgICAgICApCisjZGVmaW5lIHJlYWRwb3MgICAgICAgICAgICAgKEcucmVhZHBvcyAgICAgICAgICAgKQorI2RlZmluZSByZWFkZW9mICAgICAgICAgICAgIChHLnJlYWRlb2YgICAgICAgICAgICkKKyNkZWZpbmUgYnVmZmVyICAgICAgICAgICAgICAoRy5idWZmZXIgICAgICAgICAgICApCisjZGVmaW5lIGZsaW5lcyAgICAgICAgICAgICAgKEcuZmxpbmVzICAgICAgICAgICAgKQorI2RlZmluZSBlbXB0eV9saW5lX21hcmtlciAgIChHLmVtcHR5X2xpbmVfbWFya2VyICkKKyNkZWZpbmUgbnVtX2ZpbGVzICAgICAgICAgICAoRy5udW1fZmlsZXMgICAgICAgICApCisjZGVmaW5lIGN1cnJlbnRfZmlsZSAgICAgICAgKEcuY3VycmVudF9maWxlICAgICAgKQorI2RlZmluZSBmaWxlbmFtZSAgICAgICAgICAgIChHLmZpbGVuYW1lICAgICAgICAgICkKKyNkZWZpbmUgZmlsZXMgICAgICAgICAgICAgICAoRy5maWxlcyAgICAgICAgICAgICApCisjZGVmaW5lIG51bV9tYXJrcyAgICAgICAgICAgKEcubnVtX21hcmtzICAgICAgICAgKQorI2RlZmluZSBtYXJrX2xpbmVzICAgICAgICAgIChHLm1hcmtfbGluZXMgICAgICAgICkKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorI2RlZmluZSBtYXRjaF9saW5lcyAgICAgICAgIChHLm1hdGNoX2xpbmVzICAgICAgICkKKyNkZWZpbmUgbWF0Y2hfcG9zICAgICAgICAgICAoRy5tYXRjaF9wb3MgICAgICAgICApCisjZGVmaW5lIG51bV9tYXRjaGVzICAgICAgICAgKEcubnVtX21hdGNoZXMgICAgICAgKQorI2RlZmluZSB3YW50ZWRfbWF0Y2ggICAgICAgIChHLndhbnRlZF9tYXRjaCAgICAgICkKKyNkZWZpbmUgcGF0dGVybiAgICAgICAgICAgICAoRy5wYXR0ZXJuICAgICAgICAgICApCisjZGVmaW5lIHBhdHRlcm5fdmFsaWQgICAgICAgKEcucGF0dGVybl92YWxpZCAgICAgKQorI2VuZGlmCisjZGVmaW5lIHRlcm1pbmF0ZWQgICAgICAgICAgKEcudGVybWluYXRlZCAgICAgICAgKQorI2RlZmluZSB0ZXJtX29yaWcgICAgICAgICAgIChHLnRlcm1fb3JpZyAgICAgICAgICkKKyNkZWZpbmUgdGVybV9sZXNzICAgICAgICAgICAoRy50ZXJtX2xlc3MgICAgICAgICApCisjZGVmaW5lIGtiZF9pbnB1dCAgICAgICAgICAgKEcua2JkX2lucHV0ICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCWxlc3NfZ2V0c19wb3MgPSAtMTsgXAorCWVtcHR5X2xpbmVfbWFya2VyID0gIn4iOyBcCisJbnVtX2ZpbGVzID0gMTsgXAorCWN1cnJlbnRfZmlsZSA9IDE7IFwKKwllb2ZfZXJyb3IgPSAxOyBcCisJdGVybWluYXRlZCA9IDE7IFwKKwlJRl9GRUFUVVJFX0xFU1NfUkVHRVhQKHdhbnRlZF9tYXRjaCA9IC0xOykgXAorfSB3aGlsZSAoMCkKKworLyogZmxpbmVzW10gYXJlIGxpbmVzIHJlYWQgZnJvbSBzdGRpbiwgZWFjaCBpbiBtYWxsb2MnZWQgYnVmZmVyLgorICogTGluZSBudW1iZXJzIGFyZSBzdG9yZWQgYXMgdWludDMyX3QgcHJlcGVuZGVkIHRvIGVhY2ggbGluZS4KKyAqIFBvaW50ZXIgaXMgYWRqdXN0ZWQgc28gdGhhdCBmbGluZXNbaV0gcG9pbnRzIGRpcmVjdGx5IHBhc3QKKyAqIGxpbmUgbnVtYmVyLiBBY2Nlc29yOiAqLworI2RlZmluZSBNRU1QVFIocCkgKChjaGFyKikocCkgLSA0KQorI2RlZmluZSBMSU5FTk8ocCkgKCoodWludDMyX3QqKSgocCkgLSA0KSkKKworCisvKiBSZXNldCB0ZXJtaW5hbCBpbnB1dCB0byBub3JtYWwgKi8KK3N0YXRpYyB2b2lkIHNldF90dHlfY29va2VkKHZvaWQpCit7CisJZmZsdXNoX2FsbCgpOworCXRjc2V0YXR0cihrYmRfZmQsIFRDU0FOT1csICZ0ZXJtX29yaWcpOworfQorCisvKiBNb3ZlIHRoZSBjdXJzb3IgdG8gYSBwb3NpdGlvbiAoeCx5KSwgd2hlcmUgKDAsMCkgaXMgdGhlCisgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvbnNvbGUgKi8KK3N0YXRpYyB2b2lkIG1vdmVfY3Vyc29yKGludCBsaW5lLCBpbnQgcm93KQoreworCXByaW50ZihFU0MiWyV1OyV1SCIsIGxpbmUsIHJvdyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2xpbmUodm9pZCkKK3sKKwlwcmludGYoRVNDIlsldTswSCIgQ0xFQVJfMl9FT0wsIG1heF9kaXNwbGF5ZWRfbGluZSArIDIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oaWxpdGUoY29uc3QgY2hhciAqc3RyKQoreworCXByaW50ZihISUdITElHSFQiJXMiTk9STUFMLCBzdHIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0dXNsaW5lKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljbGVhcl9saW5lKCk7CisJcHJpbnRmKEhJR0hMSUdIVCIlLipzIk5PUk1BTCwgd2lkdGggLSAxLCBzdHIpOworfQorCisvKiBFeGl0IHRoZSBwcm9ncmFtIGdyYWNlZnVsbHkgKi8KK3N0YXRpYyB2b2lkIGxlc3NfZXhpdChpbnQgY29kZSkKK3sKKwlzZXRfdHR5X2Nvb2tlZCgpOworCWNsZWFyX2xpbmUoKTsKKwlpZiAoY29kZSA8IDApCisJCWtpbGxfbXlzZWxmX3dpdGhfc2lnKC0gY29kZSk7IC8qIGRvZXMgbm90IHJldHVybiAqLworCWV4aXQoY29kZSk7Cit9CisKKyNpZiAoRU5BQkxFX0ZFQVRVUkVfTEVTU19EQVNIQ01EICYmIEVOQUJMRV9GRUFUVVJFX0xFU1NfTElORU5VTVMpIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9MRVNTX1dJTkNICitzdGF0aWMgdm9pZCByZV93cmFwKHZvaWQpCit7CisJaW50IHcgPSB3aWR0aDsKKwlpbnQgbmV3X2xpbmVfcG9zOworCWludCBzcmNfaWR4OworCWludCBkc3RfaWR4OworCWludCBuZXdfY3VyX2ZsaW5lID0gMDsKKwl1aW50MzJfdCBsaW5lbm87CisJY2hhciBsaW5lYnVmW3cgKyAxXTsKKwljb25zdCBjaGFyICoqb2xkX2ZsaW5lcyA9IGZsaW5lczsKKwljb25zdCBjaGFyICpzOworCWNoYXIgKipuZXdfZmxpbmVzID0gTlVMTDsKKwljaGFyICpkOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX04pCisJCXcgLT0gODsKKworCXNyY19pZHggPSAwOworCWRzdF9pZHggPSAwOworCXMgPSBvbGRfZmxpbmVzWzBdOworCWxpbmVubyA9IExJTkVOTyhzKTsKKwlkID0gbGluZWJ1ZjsKKwluZXdfbGluZV9wb3MgPSAwOworCXdoaWxlICgxKSB7CisJCSpkID0gKnM7CisJCWlmICgqZCAhPSAnXDAnKSB7CisJCQluZXdfbGluZV9wb3MrKzsKKwkJCWlmICgqZCA9PSAnXHQnKSAvKiB0YWIgKi8KKwkJCQluZXdfbGluZV9wb3MgKz0gNzsKKwkJCXMrKzsKKwkJCWQrKzsKKwkJCWlmIChuZXdfbGluZV9wb3MgPj0gdykgeworCQkJCWludCBzejsKKwkJCQkvKiBuZXcgbGluZSBpcyBmdWxsLCBjcmVhdGUgbmV4dCBvbmUgKi8KKwkJCQkqZCA9ICdcMCc7CisgbmV4dF9uZXc6CisJCQkJc3ogPSAoZCAtIGxpbmVidWYpICsgMTsgLyogKyAxOiBOVUwgKi8KKwkJCQlkID0gKChjaGFyKil4bWFsbG9jKHN6ICsgNCkpICsgNDsKKwkJCQlMSU5FTk8oZCkgPSBsaW5lbm87CisJCQkJbWVtY3B5KGQsIGxpbmVidWYsIHN6KTsKKwkJCQluZXdfZmxpbmVzID0geHJlYWxsb2NfdmVjdG9yKG5ld19mbGluZXMsIDgsIGRzdF9pZHgpOworCQkJCW5ld19mbGluZXNbZHN0X2lkeF0gPSBkOworCQkJCWRzdF9pZHgrKzsKKwkJCQlpZiAobmV3X2xpbmVfcG9zIDwgdykgeworCQkJCQkvKiBpZiB3ZSBjYW1lIGhlcmUgdGhydSAiZ290byBuZXh0X25ldyIgKi8KKwkJCQkJaWYgKHNyY19pZHggPiBtYXhfZmxpbmUpCisJCQkJCQlicmVhazsKKwkJCQkJbGluZW5vID0gTElORU5PKHMpOworCQkJCX0KKwkJCQlkID0gbGluZWJ1ZjsKKwkJCQluZXdfbGluZV9wb3MgPSAwOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLyogKmQgPT0gTlVMOiBvbGQgbGluZSBlbmRlZCwgZ28gdG8gbmV4dCBvbGQgb25lICovCisJCWZyZWUoTUVNUFRSKG9sZF9mbGluZXNbc3JjX2lkeF0pKTsKKwkJLyogYnR3LCBjb252ZXJ0IGN1cl9mbGluZS4uLiAqLworCQlpZiAoY3VyX2ZsaW5lID09IHNyY19pZHgpCisJCQluZXdfY3VyX2ZsaW5lID0gZHN0X2lkeDsKKwkJc3JjX2lkeCsrOworCQkvKiBubyBtb3JlIGxpbmVzPyBmaW5pc2ggbGFzdCBuZXcgbGluZSAoYW5kIGV4aXQgdGhlIGxvb3ApICovCisJCWlmIChzcmNfaWR4ID4gbWF4X2ZsaW5lKQorCQkJZ290byBuZXh0X25ldzsKKwkJcyA9IG9sZF9mbGluZXNbc3JjX2lkeF07CisJCWlmIChsaW5lbm8gIT0gTElORU5PKHMpKSB7CisJCQkvKiB0aGlzIGlzIG5vdCBhIGNvbnRpbnVhdGlvbiBsaW5lIQorCQkJICogY3JlYXRlIG5leHQgX25ld18gbGluZSB0b28gKi8KKwkJCWdvdG8gbmV4dF9uZXc7CisJCX0KKwl9CisKKwlmcmVlKG9sZF9mbGluZXMpOworCWZsaW5lcyA9IChjb25zdCBjaGFyICoqKW5ld19mbGluZXM7CisKKwltYXhfZmxpbmUgPSBkc3RfaWR4IC0gMTsKKwlsYXN0X2xpbmVfcG9zID0gbmV3X2xpbmVfcG9zOworCWN1cl9mbGluZSA9IG5ld19jdXJfZmxpbmU7CisJLyogbWF4X2xpbmVubyBpcyBzY3JlZW4tc2l6ZSBpbmRlcGVuZGVudCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfUkVHRVhQCisJcGF0dGVybl92YWxpZCA9IDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKK3N0YXRpYyB2b2lkIGZpbGxfbWF0Y2hfbGluZXModW5zaWduZWQgcG9zKTsKKyNlbHNlCisjZGVmaW5lIGZpbGxfbWF0Y2hfbGluZXMocG9zKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiBEZXZpbGlzaGx5IGNvbXBsZXggcm91dGluZS4KKyAqCisgKiBIYXMgdG8gZGVhbCB3aXRoIEVPRiBhbmQgRVBJUEUgb24gaW5wdXQsCisgKiB3aXRoIGxpbmUgd3JhcHBpbmcsIHdpdGggbGFzdCBsaW5lIG5vdCBlbmRpbmcgaW4gJ1xuJworICogKHBvc3NpYmx5IG5vdCBlbmRpbmcgWUVUISksIHdpdGggYmFja3NwYWNlIGFuZCB0YWJzLgorICogSXQgcmVhZHMgaW5wdXQgYWdhaW4gaWYgbGFzdCB0aW1lIHdlIGdvdCBhbiBFT0YgKHRodXMgc3VwcG9ydGluZworICogZ3Jvd2luZyBmaWxlcykgb3IgRVBJUEUgKHdhdGNoaW5nIG91dHB1dCBvZiBzbG93IHByb2Nlc3MgbGlrZSBtYWtlKS4KKyAqCisgKiBWYXJpYWJsZXMgdXNlZDoKKyAqIGZsaW5lc1tdIC0gYXJyYXkgb2YgbGluZXMgYWxyZWFkeSByZWFkLiBMaW5ld3JhcCBtYXkgY2F1c2UKKyAqICAgICAgb25lIHNvdXJjZSBmaWxlIGxpbmUgdG8gb2NjdXB5IHNldmVyYWwgZmxpbmVzW25dLgorICogZmxpbmVzW21heF9mbGluZV0gLSBsYXN0IGxpbmUsIHBvc3NpYmx5IGluY29tcGxldGUuCisgKiB0ZXJtaW5hdGVkIC0gMSBpZiBmbGluZXNbbWF4X2ZsaW5lXSBpcyAndGVybWluYXRlZCcKKyAqICAgICAgKGlmIHRoZXJlIHdhcyAnXG4nIFt3aGljaCBpc24ndCBzdG9yZWQgaXRzZWxmLCB3ZSBqdXN0IHJlbWVtYmVyCisgKiAgICAgIHRoYXQgaXQgd2FzIHNlZW5dKQorICogbWF4X2xpbmVubyAtIGxhc3QgbGluZSdzIG51bWJlciwgdGhpcyBvbmUgZG9lc24ndCBpbmNyZW1lbnQKKyAqICAgICAgb24gbGluZSB3cmFwLCBvbmx5IG9uICJyZWFsIiBuZXcgbGluZXMuCisgKiByZWFkYnVmWzAuLnJlYWRlb2YtMV0gLSBzbWFsbCBwcmVsaW1pbmFyeSBidWZmZXIuCisgKiByZWFkYnVmW3JlYWRwb3NdIC0gbmV4dCBjaGFyYWN0ZXIgdG8gYWRkIHRvIGN1cnJlbnQgbGluZS4KKyAqIGxhc3RfbGluZV9wb3MgLSBzY3JlZW4gbGluZSBwb3NpdGlvbiBvZiBuZXh0IGNoYXIgdG8gYmUgcmVhZAorICogICAgICAodGFrZXMgaW50byBhY2NvdW50IHRhYnMgYW5kIGJhY2tzcGFjZXMpCisgKiBlb2ZfZXJyb3IgLSA8IDAgZXJyb3IsID09IDAgRU9GLCA+IDAgbm90IEVPRi9lcnJvcgorICovCitzdGF0aWMgdm9pZCByZWFkX2xpbmVzKHZvaWQpCit7CisjZGVmaW5lIHJlYWRidWYgYmJfY29tbW9uX2J1ZnNpejEKKwljaGFyICpjdXJyZW50X2xpbmUsICpwOworCWludCB3ID0gd2lkdGg7CisJY2hhciBsYXN0X3Rlcm1pbmF0ZWQgPSB0ZXJtaW5hdGVkOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfUkVHRVhQCisJdW5zaWduZWQgb2xkX21heF9mbGluZSA9IG1heF9mbGluZTsKKwl0aW1lX3QgbGFzdF90aW1lID0gMDsKKwl1bnNpZ25lZCBzZWNvbmRzX3AxID0gMzsgLyogc2Vjb25kc190b19sb29wICsgMSAqLworI2VuZGlmCisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfTikKKwkJdyAtPSA4OworCisgSUZfRkVBVFVSRV9MRVNTX1JFR0VYUChhZ2FpbjA6KQorCisJcCA9IGN1cnJlbnRfbGluZSA9ICgoY2hhciopeG1hbGxvYyh3ICsgNCkpICsgNDsKKwltYXhfZmxpbmUgKz0gbGFzdF90ZXJtaW5hdGVkOworCWlmICghbGFzdF90ZXJtaW5hdGVkKSB7CisJCWNvbnN0IGNoYXIgKmNwID0gZmxpbmVzW21heF9mbGluZV07CisJCXN0cmNweShwLCBjcCk7CisJCXAgKz0gc3RybGVuKGN1cnJlbnRfbGluZSk7CisJCWZyZWUoTUVNUFRSKGZsaW5lc1ttYXhfZmxpbmVdKSk7CisJCS8qIGxhc3RfbGluZV9wb3MgaXMgc3RpbGwgdmFsaWQgZnJvbSBwcmV2aW91cyByZWFkX2xpbmVzKCkgKi8KKwl9IGVsc2UgeworCQlsYXN0X2xpbmVfcG9zID0gMDsKKwl9CisKKwl3aGlsZSAoMSkgeyAvKiByZWFkIGxpbmVzIHVudGlsIHdlIHJlYWNoIGN1cl9mbGluZSBvciB3YW50ZWRfbWF0Y2ggKi8KKwkJKnAgPSAnXDAnOworCQl0ZXJtaW5hdGVkID0gMDsKKwkJd2hpbGUgKDEpIHsgLyogcmVhZCBjaGFycyB1bnRpbCB3ZSBoYXZlIGEgbGluZSAqLworCQkJY2hhciBjOworCQkJLyogaWYgbm8gdW5wcm9jZXNzZWQgY2hhcnMgbGVmdCwgZWF0IG1vcmUgKi8KKwkJCWlmIChyZWFkcG9zID49IHJlYWRlb2YpIHsKKwkJCQluZGVsYXlfb24oMCk7CisJCQkJZW9mX2Vycm9yID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgcmVhZGJ1Ziwgc2l6ZW9mKHJlYWRidWYpKTsKKwkJCQluZGVsYXlfb2ZmKDApOworCQkJCXJlYWRwb3MgPSAwOworCQkJCXJlYWRlb2YgPSBlb2ZfZXJyb3I7CisJCQkJaWYgKGVvZl9lcnJvciA8PSAwKQorCQkJCQlnb3RvIHJlYWNoZWRfZW9mOworCQkJfQorCQkJYyA9IHJlYWRidWZbcmVhZHBvc107CisJCQkvKiBiYWNrc3BhY2U/IFtuZWVkZWQgZm9yIG1hbnBhZ2VzXSAqLworCQkJLyogPHRhYj48YnM+IGlzIChhKSBpbnNhbmUgYW5kICovCisJCQkvKiAoYikgaGFyZGVyIHRvIGRvIGNvcnJlY3RseSwgc28gd2UgcmVmdXNlIHRvIGRvIGl0ICovCisJCQlpZiAoYyA9PSAnXHg4JyAmJiBsYXN0X2xpbmVfcG9zICYmIHBbLTFdICE9ICdcdCcpIHsKKwkJCQlyZWFkcG9zKys7IC8qIGVhdCBpdCAqLworCQkJCWxhc3RfbGluZV9wb3MtLTsKKwkJCS8qIHdhcyBidWdneSAocCBjb3VsZCBlbmQgdXAgPD0gY3VycmVudF9saW5lKS4uLiAqLworCQkJCSotLXAgPSAnXDAnOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJeworCQkJCXNpemVfdCBuZXdfbGFzdF9saW5lX3BvcyA9IGxhc3RfbGluZV9wb3MgKyAxOworCQkJCWlmIChjID09ICdcdCcpIHsKKwkJCQkJbmV3X2xhc3RfbGluZV9wb3MgKz0gNzsKKwkJCQkJbmV3X2xhc3RfbGluZV9wb3MgJj0gKH43KTsKKwkJCQl9CisJCQkJaWYgKChpbnQpbmV3X2xhc3RfbGluZV9wb3MgPj0gdykKKwkJCQkJYnJlYWs7CisJCQkJbGFzdF9saW5lX3BvcyA9IG5ld19sYXN0X2xpbmVfcG9zOworCQkJfQorCQkJLyogb2ssIHdlIHdpbGwgZWF0IHRoaXMgY2hhciAqLworCQkJcmVhZHBvcysrOworCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCXRlcm1pbmF0ZWQgPSAxOworCQkJCWxhc3RfbGluZV9wb3MgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogTlVMIGlzIHN1YnN0aXR1dGVkIGJ5ICdcbichICovCisJCQlpZiAoYyA9PSAnXDAnKSBjID0gJ1xuJzsKKwkJCSpwKysgPSBjOworCQkJKnAgPSAnXDAnOworCQl9IC8qIGVuZCBvZiAicmVhZCBjaGFycyB1bnRpbCB3ZSBoYXZlIGEgbGluZSIgbG9vcCAqLworCQkvKiBDb3JuZXIgY2FzZTogbGluZXdyYXAgd2l0aCBvbmx5ICIiIHdyYXBwaW5nIHRvIG5leHQgbGluZSAqLworCQkvKiBMb29rcyB1Z2x5IG9uIHNjcmVlbiwgc28gd2UgZG8gbm90IHN0b3JlIHRoaXMgZW1wdHkgbGluZSAqLworCQlpZiAoIWxhc3RfdGVybWluYXRlZCAmJiAhY3VycmVudF9saW5lWzBdKSB7CisJCQlsYXN0X3Rlcm1pbmF0ZWQgPSAxOworCQkJbWF4X2xpbmVubysrOworCQkJY29udGludWU7CisJCX0KKyByZWFjaGVkX2VvZjoKKwkJbGFzdF90ZXJtaW5hdGVkID0gdGVybWluYXRlZDsKKwkJZmxpbmVzID0geHJlYWxsb2NfdmVjdG9yKGZsaW5lcywgOCwgbWF4X2ZsaW5lKTsKKworCQlmbGluZXNbbWF4X2ZsaW5lXSA9IChjaGFyKil4cmVhbGxvYyhNRU1QVFIoY3VycmVudF9saW5lKSwgc3RybGVuKGN1cnJlbnRfbGluZSkgKyAxICsgNCkgKyA0OworCQlMSU5FTk8oZmxpbmVzW21heF9mbGluZV0pID0gbWF4X2xpbmVubzsKKwkJaWYgKHRlcm1pbmF0ZWQpCisJCQltYXhfbGluZW5vKys7CisKKwkJaWYgKG1heF9mbGluZSA+PSBNQVhMSU5FUykgeworCQkJZW9mX2Vycm9yID0gMDsgLyogUHJldGVuZCB3ZSBzYXcgRU9GICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoIShvcHRpb25fbWFzazMyICYgRkxBR19TKQorCQkgID8gKG1heF9mbGluZSA+IGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZSkKKwkJICA6IChtYXhfZmxpbmUgPj0gY3VyX2ZsaW5lCisJCSAgICAgJiYgbWF4X2xpbmVubyA+IExJTkVOTyhmbGluZXNbY3VyX2ZsaW5lXSkgKyBtYXhfZGlzcGxheWVkX2xpbmUpCisJCSkgeworI2lmICFFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCQkJYnJlYWs7CisjZWxzZQorCQkJaWYgKHdhbnRlZF9tYXRjaCA+PSBudW1fbWF0Y2hlcykgeyAvKiBnb3RvX21hdGNoIGNhbGxlZCB1cyAqLworCQkJCWZpbGxfbWF0Y2hfbGluZXMob2xkX21heF9mbGluZSk7CisJCQkJb2xkX21heF9mbGluZSA9IG1heF9mbGluZTsKKwkJCX0KKwkJCWlmICh3YW50ZWRfbWF0Y2ggPCBudW1fbWF0Y2hlcykKKwkJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWlmIChlb2ZfZXJyb3IgPD0gMCkgeworCQkJaWYgKGVvZl9lcnJvciA8IDApIHsKKwkJCQlpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisJCQkJCS8qIG5vdCB5ZXQgZW9mIG9yIGVycm9yLCByZXNldCBmbGFnIChvciBlbHNlCisJCQkJCSAqIHdlIHdpbGwgaG9nIENQVSAtIHNlbGVjdCgpIHdpbGwgcmV0dXJuCisJCQkJCSAqIGltbWVkaWF0ZWx5ICovCisJCQkJCWVvZl9lcnJvciA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRfc3RhdHVzbGluZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQkJfQorCQkJfQorI2lmICFFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCQkJYnJlYWs7CisjZWxzZQorCQkJaWYgKHdhbnRlZF9tYXRjaCA8IG51bV9tYXRjaGVzKSB7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeyAvKiBnb3RvX21hdGNoIGNhbGxlZCB1cyAqLworCQkJCXRpbWVfdCB0ID0gdGltZShOVUxMKTsKKwkJCQlpZiAodCAhPSBsYXN0X3RpbWUpIHsKKwkJCQkJbGFzdF90aW1lID0gdDsKKwkJCQkJaWYgKC0tc2Vjb25kc19wMSA9PSAwKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNjaGVkX3lpZWxkKCk7CisJCQkJZ290byBhZ2FpbjA7IC8qIGdvIGxvb3AgYWdhaW4gKG1heCAyIHNlY29uZHMpICovCisJCQl9CisjZW5kaWYKKwkJfQorCQltYXhfZmxpbmUrKzsKKwkJY3VycmVudF9saW5lID0gKChjaGFyKil4bWFsbG9jKHcgKyA0KSkgKyA0OworCQlwID0gY3VycmVudF9saW5lOworCQlsYXN0X2xpbmVfcG9zID0gMDsKKwl9IC8qIGVuZCBvZiAicmVhZCBsaW5lcyB1bnRpbCB3ZSByZWFjaCBjdXJfZmxpbmUiIGxvb3AgKi8KKwlmaWxsX21hdGNoX2xpbmVzKG9sZF9tYXhfZmxpbmUpOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfUkVHRVhQCisJLyogcHJldmVudCB1cyBmcm9tIGJlaW5nIHN0dWNrIGluIHNlYXJjaCBmb3IgYSBtYXRjaCAqLworCXdhbnRlZF9tYXRjaCA9IC0xOworI2VuZGlmCisjdW5kZWYgcmVhZGJ1ZgorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19GTEFHUworLyogSW50ZXJlc3RpbmdseSwgd3JpdGluZyBjYWxjX3BlcmNlbnQgYXMgYSBmdW5jdGlvbiBzYXZlcyBhcm91bmQgMzIgYnl0ZXMKKyAqIG9uIG15IGJ1aWxkLiAqLworc3RhdGljIGludCBjYWxjX3BlcmNlbnQodm9pZCkKK3sKKwl1bnNpZ25lZCBwID0gKDEwMCAqIChjdXJfZmxpbmUrbWF4X2Rpc3BsYXllZF9saW5lKzEpICsgbWF4X2ZsaW5lLzIpIC8gKG1heF9mbGluZSsxKTsKKwlyZXR1cm4gcCA8PSAxMDAgPyBwIDogMTAwOworfQorCisvKiBQcmludCBhIHN0YXR1cyBsaW5lIGlmIC1NIHdhcyBzcGVjaWZpZWQgKi8KK3N0YXRpYyB2b2lkIG1fc3RhdHVzX3ByaW50KHZvaWQpCit7CisJaW50IHBlcmNlbnRhZ2U7CisKKwlpZiAobGVzc19nZXRzX3BvcyA+PSAwKSAvKiBkb24ndCB0b3VjaCBzdGF0dXNsaW5lIHdoaWxlIGlucHV0IGlzIGRvbmUhICovCisJCXJldHVybjsKKworCWNsZWFyX2xpbmUoKTsKKwlwcmludGYoSElHSExJR0hUIiVzIiwgZmlsZW5hbWUpOworCWlmIChudW1fZmlsZXMgPiAxKQorCQlwcmludGYoIiAoZmlsZSAlaSBvZiAlaSkiLCBjdXJyZW50X2ZpbGUsIG51bV9maWxlcyk7CisJcHJpbnRmKCIgbGluZXMgJWktJWkvJWkgIiwKKwkJCWN1cl9mbGluZSArIDEsIGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZSArIDEsCisJCQltYXhfZmxpbmUgKyAxKTsKKwlpZiAoY3VyX2ZsaW5lID49IChpbnQpKG1heF9mbGluZSAtIG1heF9kaXNwbGF5ZWRfbGluZSkpIHsKKwkJcHJpbnRmKCIoRU5EKSJOT1JNQUwpOworCQlpZiAobnVtX2ZpbGVzID4gMSAmJiBjdXJyZW50X2ZpbGUgIT0gbnVtX2ZpbGVzKQorCQkJcHJpbnRmKEhJR0hMSUdIVCIgLSBuZXh0OiAlcyJOT1JNQUwsIGZpbGVzW2N1cnJlbnRfZmlsZV0pOworCQlyZXR1cm47CisJfQorCXBlcmNlbnRhZ2UgPSBjYWxjX3BlcmNlbnQoKTsKKwlwcmludGYoIiVpJSUiTk9STUFMLCBwZXJjZW50YWdlKTsKK30KKyNlbmRpZgorCisvKiBQcmludCB0aGUgc3RhdHVzIGxpbmUgKi8KK3N0YXRpYyB2b2lkIHN0YXR1c19wcmludCh2b2lkKQoreworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAobGVzc19nZXRzX3BvcyA+PSAwKSAvKiBkb24ndCB0b3VjaCBzdGF0dXNsaW5lIHdoaWxlIGlucHV0IGlzIGRvbmUhICovCisJCXJldHVybjsKKworCS8qIENoYW5nZSB0aGUgc3RhdHVzIGlmIGZsYWdzIGhhdmUgYmVlbiBzZXQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0ZMQUdTCisJaWYgKG9wdGlvbl9tYXNrMzIgJiAoRkxBR19NfEZMQUdfbSkpIHsKKwkJbV9zdGF0dXNfcHJpbnQoKTsKKwkJcmV0dXJuOworCX0KKwkvKiBObyBmbGFncyBzZXQgKi8KKyNlbmRpZgorCisJY2xlYXJfbGluZSgpOworCWlmIChjdXJfZmxpbmUgJiYgY3VyX2ZsaW5lIDwgKGludCkobWF4X2ZsaW5lIC0gbWF4X2Rpc3BsYXllZF9saW5lKSkgeworCQliYl9wdXRjaGFyKCc6Jyk7CisJCXJldHVybjsKKwl9CisJcCA9ICIoRU5EKSI7CisJaWYgKCFjdXJfZmxpbmUpCisJCXAgPSBmaWxlbmFtZTsKKwlpZiAobnVtX2ZpbGVzID4gMSkgeworCQlwcmludGYoSElHSExJR0hUIiVzIChmaWxlICVpIG9mICVpKSJOT1JNQUwsCisJCQkJcCwgY3VycmVudF9maWxlLCBudW1fZmlsZXMpOworCQlyZXR1cm47CisJfQorCXByaW50X2hpbGl0ZShwKTsKK30KKworc3RhdGljIHZvaWQgY2FwX2N1cl9mbGluZShpbnQgbmxpbmVzKQoreworCWludCBkaWZmOworCWlmIChjdXJfZmxpbmUgPCAwKQorCQljdXJfZmxpbmUgPSAwOworCWlmIChjdXJfZmxpbmUgKyBtYXhfZGlzcGxheWVkX2xpbmUgPiBtYXhfZmxpbmUgKyBUSUxERVMpIHsKKwkJY3VyX2ZsaW5lIC09IG5saW5lczsKKwkJaWYgKGN1cl9mbGluZSA8IDApCisJCQljdXJfZmxpbmUgPSAwOworCQlkaWZmID0gbWF4X2ZsaW5lIC0gKGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZSkgKyBUSUxERVM7CisJCS8qIEFzIHRoZSBudW1iZXIgb2YgbGluZXMgcmVxdWVzdGVkIHdhcyB0b28gbGFyZ2UsIHdlIGp1c3QgbW92ZQorCQkgKiB0byB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisJCWlmIChkaWZmID4gMCkKKwkJCWN1cl9mbGluZSArPSBkaWZmOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgY29udHJvbHNbXSBBTElHTjEgPQorCS8qIE5VTDogbmV2ZXIgZW5jb3VudGVyZWQ7IFRBQjogbm90IGNvbnZlcnRlZCAqLworCS8qKi8iXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiICAiXHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCSJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgorCSJceDdmXHg5YiI7IC8qIERFTCBhbmQgaW5mYW1vdXMgTWV0YS1FU0MgOiggKi8KK3N0YXRpYyBjb25zdCBjaGFyIGN0cmxjb252W10gQUxJR04xID0KKwkvKiB3aHkgNDAgaW5zdGVhZCBvZiA0YSBiZWxvdz8gLSBpdCBpcyBhIHJlcGxhY2VtZW50IGZvciAnXG4nLgorCSAqICdcbicgaXMgYSBmb3JtZXIgTlVMIC0gd2Ugc3Vic3QgaXQgd2l0aCBALCBub3QgSiAqLworCSJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0N1x4NDhceDQ5XHg0MFx4NGJceDRjXHg0ZFx4NGVceDRmIgorCSJceDUwXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1N1x4NThceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmIjsKKworc3RhdGljIHZvaWQgbGluZW5vX3N0cihjaGFyICpuYnVmOSwgY29uc3QgY2hhciAqbGluZSkKK3sKKwluYnVmOVswXSA9ICdcMCc7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX04pIHsKKwkJY29uc3QgY2hhciAqZm10OworCQl1bnNpZ25lZCBuOworCisJCWlmIChsaW5lID09IGVtcHR5X2xpbmVfbWFya2VyKSB7CisJCQltZW1zZXQobmJ1ZjksICcgJywgOCk7CisJCQluYnVmOVs4XSA9ICdcMCc7CisJCQlyZXR1cm47CisJCX0KKwkJLyogV2lkdGggb2YgNyBwcmVzZXJ2ZXMgdGFiIHNwYWNpbmcgaW4gdGhlIHRleHQgKi8KKwkJZm10ID0gIiU3dSAiOworCQluID0gTElORU5PKGxpbmUpICsgMTsKKwkJaWYgKG4gPiA5OTk5OTk5KSB7CisJCQluICU9IDEwMDAwMDAwOworCQkJZm10ID0gIiUwN3UgIjsKKwkJfQorCQlzcHJpbnRmKG5idWY5LCBmbXQsIG4pOworCX0KK30KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKK3N0YXRpYyB2b2lkIHByaW50X2ZvdW5kKGNvbnN0IGNoYXIgKmxpbmUpCit7CisJaW50IG1hdGNoX3N0YXR1czsKKwlpbnQgZWZsYWdzOworCWNoYXIgKmdyb3dsaW5lOworCXJlZ21hdGNoX3QgbWF0Y2hfc3RydWN0czsKKworCWNoYXIgYnVmW3dpZHRoXTsKKwljaGFyIG5idWY5WzldOworCWNvbnN0IGNoYXIgKnN0ciA9IGxpbmU7CisJY2hhciAqcCA9IGJ1ZjsKKwlzaXplX3QgbjsKKworCXdoaWxlICgqc3RyKSB7CisJCW4gPSBzdHJjc3BuKHN0ciwgY29udHJvbHMpOworCQlpZiAobikgeworCQkJaWYgKCFzdHJbbl0pIGJyZWFrOworCQkJbWVtY3B5KHAsIHN0ciwgbik7CisJCQlwICs9IG47CisJCQlzdHIgKz0gbjsKKwkJfQorCQluID0gc3Ryc3BuKHN0ciwgY29udHJvbHMpOworCQltZW1zZXQocCwgJy4nLCBuKTsKKwkJcCArPSBuOworCQlzdHIgKz0gbjsKKwl9CisJc3RyY3B5KHAsIHN0cik7CisKKwkvKiBidWZbXSBob2xkcyBxdWFyYW50aW5lZCB2ZXJzaW9uIG9mIHN0ciAqLworCisJLyogRWFjaCBwYXJ0IG9mIHRoZSBsaW5lIHRoYXQgbWF0Y2hlcyBoYXMgdGhlIEhJR0hMSUdIVAorCSAgIGFuZCBOT1JNQUwgZXNjYXBlIHNlcXVlbmNlcyBwbGFjZWQgYXJvdW5kIGl0LgorCSAgIE5COiB3ZSByZWdleCBhZ2FpbnN0IGxpbmUsIGJ1dCBpbnNlcnQgdGV4dAorCSAgIGZyb20gcXVhcmFudGluZWQgY29weSAoYnVmW10pICovCisJc3RyID0gYnVmOworCWdyb3dsaW5lID0gTlVMTDsKKwllZmxhZ3MgPSAwOworCWdvdG8gc3RhcnQ7CisKKwl3aGlsZSAobWF0Y2hfc3RhdHVzID09IDApIHsKKwkJY2hhciAqbmV3ID0geGFzcHJpbnRmKCIlcyUuKnMiSElHSExJR0hUIiUuKnMiTk9STUFMLAorCQkJCWdyb3dsaW5lID8gZ3Jvd2xpbmUgOiAiIiwKKwkJCQkoaW50KW1hdGNoX3N0cnVjdHMucm1fc28sIHN0ciwKKwkJCQkoaW50KShtYXRjaF9zdHJ1Y3RzLnJtX2VvIC0gbWF0Y2hfc3RydWN0cy5ybV9zbyksCisJCQkJCQlzdHIgKyBtYXRjaF9zdHJ1Y3RzLnJtX3NvKTsKKwkJZnJlZShncm93bGluZSk7CisJCWdyb3dsaW5lID0gbmV3OworCQlzdHIgKz0gbWF0Y2hfc3RydWN0cy5ybV9lbzsKKwkJbGluZSArPSBtYXRjaF9zdHJ1Y3RzLnJtX2VvOworCQllZmxhZ3MgPSBSRUdfTk9UQk9MOworIHN0YXJ0OgorCQkvKiBNb3N0IG9mIHRoZSB0aW1lIGRvZXNuJ3QgZmluZCB0aGUgcmVnZXgsIG9wdGltaXplIGZvciB0aGF0ICovCisJCW1hdGNoX3N0YXR1cyA9IHJlZ2V4ZWMoJnBhdHRlcm4sIGxpbmUsIDEsICZtYXRjaF9zdHJ1Y3RzLCBlZmxhZ3MpOworCQkvKiBpZiBldmVuICIiIG1hdGNoZXMsIHRyZWF0IGl0IGFzICJub3QgYSBtYXRjaCIgKi8KKwkJaWYgKG1hdGNoX3N0cnVjdHMucm1fc28gPj0gbWF0Y2hfc3RydWN0cy5ybV9lbykKKwkJCW1hdGNoX3N0YXR1cyA9IDE7CisJfQorCisJbGluZW5vX3N0cihuYnVmOSwgbGluZSk7CisJaWYgKCFncm93bGluZSkgeworCQlwcmludGYoQ0xFQVJfMl9FT0wiJXMlc1xuIiwgbmJ1ZjksIHN0cik7CisJCXJldHVybjsKKwl9CisJcHJpbnRmKENMRUFSXzJfRU9MIiVzJXMlc1xuIiwgbmJ1ZjksIGdyb3dsaW5lLCBzdHIpOworCWZyZWUoZ3Jvd2xpbmUpOworfQorI2Vsc2UKK3ZvaWQgcHJpbnRfZm91bmQoY29uc3QgY2hhciAqbGluZSk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgcHJpbnRfYXNjaWkoY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgYnVmW3dpZHRoXTsKKwljaGFyIG5idWY5WzldOworCWNoYXIgKnA7CisJc2l6ZV90IG47CisKKwlsaW5lbm9fc3RyKG5idWY5LCBzdHIpOworCXByaW50ZihDTEVBUl8yX0VPTCIlcyIsIG5idWY5KTsKKworCXdoaWxlICgqc3RyKSB7CisJCW4gPSBzdHJjc3BuKHN0ciwgY29udHJvbHMpOworCQlpZiAobikgeworCQkJaWYgKCFzdHJbbl0pIGJyZWFrOworCQkJcHJpbnRmKCIlLipzIiwgKGludCkgbiwgc3RyKTsKKwkJCXN0ciArPSBuOworCQl9CisJCW4gPSBzdHJzcG4oc3RyLCBjb250cm9scyk7CisJCXAgPSBidWY7CisJCWRvIHsKKwkJCWlmICgqc3RyID09IDB4N2YpCisJCQkJKnArKyA9ICc/JzsKKwkJCWVsc2UgaWYgKCpzdHIgPT0gKGNoYXIpMHg5YikKKwkJCS8qIFZUMTAwJ3MgQ1NJLCBha2EgTWV0YS1FU0MuIFdobydzIGludmVudG9yPyAqLworCQkJLyogSSB3YW50IHRvIGtub3cgd2hvIGNvbW1pdHRlZCB0aGlzIHNpbiAqLworCQkJCSpwKysgPSAneyc7CisJCQllbHNlCisJCQkJKnArKyA9IGN0cmxjb252Wyh1bnNpZ25lZCBjaGFyKSpzdHJdOworCQkJc3RyKys7CisJCX0gd2hpbGUgKC0tbik7CisJCSpwID0gJ1wwJzsKKwkJcHJpbnRfaGlsaXRlKGJ1Zik7CisJfQorCXB1dHMoc3RyKTsKK30KKworLyogUHJpbnQgdGhlIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgYnVmZmVyX3ByaW50KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCW1vdmVfY3Vyc29yKDAsIDApOworCWZvciAoaSA9IDA7IGkgPD0gbWF4X2Rpc3BsYXllZF9saW5lOyBpKyspCisJCWlmIChwYXR0ZXJuX3ZhbGlkKQorCQkJcHJpbnRfZm91bmQoYnVmZmVyW2ldKTsKKwkJZWxzZQorCQkJcHJpbnRfYXNjaWkoYnVmZmVyW2ldKTsKKwlzdGF0dXNfcHJpbnQoKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX2ZpbGxfYW5kX3ByaW50KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0RBU0hDTUQKKwlpbnQgZnBvcyA9IGN1cl9mbGluZTsKKworCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19TKSB7CisJCS8qIEdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGxpbmUgKi8KKwkJd2hpbGUgKGZwb3MgJiYgTElORU5PKGZsaW5lc1tmcG9zXSkgPT0gTElORU5PKGZsaW5lc1tmcG9zLTFdKSkKKwkJCWZwb3MtLTsKKwl9CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8PSBtYXhfZGlzcGxheWVkX2xpbmUgJiYgZnBvcyA8PSBtYXhfZmxpbmUpIHsKKwkJaW50IGxpbmVubyA9IExJTkVOTyhmbGluZXNbZnBvc10pOworCQlidWZmZXJbaV0gPSBmbGluZXNbZnBvc107CisJCWkrKzsKKwkJZG8geworCQkJZnBvcysrOworCQl9IHdoaWxlICgoZnBvcyA8PSBtYXhfZmxpbmUpCisJCSAgICAgICYmIChvcHRpb25fbWFzazMyICYgRkxBR19TKQorCQkgICAgICAmJiBsaW5lbm8gPT0gTElORU5PKGZsaW5lc1tmcG9zXSkKKwkJKTsKKwl9CisjZWxzZQorCWZvciAoaSA9IDA7IGkgPD0gbWF4X2Rpc3BsYXllZF9saW5lICYmIGN1cl9mbGluZSArIGkgPD0gbWF4X2ZsaW5lOyBpKyspIHsKKwkJYnVmZmVyW2ldID0gZmxpbmVzW2N1cl9mbGluZSArIGldOworCX0KKyNlbmRpZgorCWZvciAoOyBpIDw9IG1heF9kaXNwbGF5ZWRfbGluZTsgaSsrKSB7CisJCWJ1ZmZlcltpXSA9IGVtcHR5X2xpbmVfbWFya2VyOworCX0KKwlidWZmZXJfcHJpbnQoKTsKK30KKworLyogTW92ZSB0aGUgYnVmZmVyIHVwIGFuZCBkb3duIGluIHRoZSBmaWxlIGluIG9yZGVyIHRvIHNjcm9sbCAqLworc3RhdGljIHZvaWQgYnVmZmVyX2Rvd24oaW50IG5saW5lcykKK3sKKwljdXJfZmxpbmUgKz0gbmxpbmVzOworCXJlYWRfbGluZXMoKTsKKwljYXBfY3VyX2ZsaW5lKG5saW5lcyk7CisJYnVmZmVyX2ZpbGxfYW5kX3ByaW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl91cChpbnQgbmxpbmVzKQoreworCWN1cl9mbGluZSAtPSBubGluZXM7CisJaWYgKGN1cl9mbGluZSA8IDApIGN1cl9mbGluZSA9IDA7CisJcmVhZF9saW5lcygpOworCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfbGluZShpbnQgbGluZW51bSkKK3sKKwlpZiAobGluZW51bSA8IDApCisJCWxpbmVudW0gPSAwOworCWN1cl9mbGluZSA9IGxpbmVudW07CisJcmVhZF9saW5lcygpOworCWlmIChsaW5lbnVtICsgbWF4X2Rpc3BsYXllZF9saW5lID4gbWF4X2ZsaW5lKQorCQlsaW5lbnVtID0gbWF4X2ZsaW5lIC0gbWF4X2Rpc3BsYXllZF9saW5lICsgVElMREVTOworCWlmIChsaW5lbnVtIDwgMCkKKwkJbGluZW51bSA9IDA7CisJY3VyX2ZsaW5lID0gbGluZW51bTsKKwlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKK30KKworc3RhdGljIHZvaWQgb3Blbl9maWxlX2FuZF9yZWFkX2xpbmVzKHZvaWQpCit7CisJaWYgKGZpbGVuYW1lKSB7CisJCXhtb3ZlX2ZkKHhvcGVuKGZpbGVuYW1lLCBPX1JET05MWSksIFNURElOX0ZJTEVOTyk7CisJfSBlbHNlIHsKKwkJLyogImxlc3MiIHdpdGggbm8gYXJndW1lbnRzIGluIGFyZ3ZbXSAqLworCQkvKiBGb3Igc3RhdHVzIGxpbmUgb25seSAqLworCQlmaWxlbmFtZSA9IHhzdHJkdXAoYmJfbXNnX3N0YW5kYXJkX2lucHV0KTsKKwl9CisJcmVhZHBvcyA9IDA7CisJcmVhZGVvZiA9IDA7CisJbGFzdF9saW5lX3BvcyA9IDA7CisJdGVybWluYXRlZCA9IDE7CisJcmVhZF9saW5lcygpOworfQorCisvKiBSZWluaXRpYWxpemUgZXZlcnl0aGluZyBmb3IgYSBuZXcgZmlsZSAtIGZyZWUgdGhlIG1lbW9yeSBhbmQgc3RhcnQgb3ZlciAqLworc3RhdGljIHZvaWQgcmVpbml0aWFsaXplKHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChmbGluZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8PSBtYXhfZmxpbmU7IGkrKykKKwkJCWZyZWUoTUVNUFRSKGZsaW5lc1tpXSkpOworCQlmcmVlKGZsaW5lcyk7CisJCWZsaW5lcyA9IE5VTEw7CisJfQorCisJbWF4X2ZsaW5lID0gLTE7CisJY3VyX2ZsaW5lID0gMDsKKwltYXhfbGluZW5vID0gMDsKKwlvcGVuX2ZpbGVfYW5kX3JlYWRfbGluZXMoKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0FTS19URVJNSU5BTAorCWlmIChHLndpbnNpemVfZXJyKQorCQlwcmludGYoIlwwMzNbOTk5Ozk5OUgiICJcMDMzWzZuIik7CisjZW5kaWYKKwlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKK30KKworc3RhdGljIGludDY0X3QgZ2V0Y2hfbm93YWl0KHZvaWQpCit7CisJaW50IHJkOworCWludDY0X3Qga2V5NjQ7CisJc3RydWN0IHBvbGxmZCBwZmRbMl07CisKKwlwZmRbMF0uZmQgPSBTVERJTl9GSUxFTk87CisJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwlwZmRbMV0uZmQgPSBrYmRfZmQ7CisJcGZkWzFdLmV2ZW50cyA9IFBPTExJTjsKKyBhZ2FpbjoKKwl0Y3NldGF0dHIoa2JkX2ZkLCBUQ1NBTk9XLCAmdGVybV9sZXNzKTsKKwkvKiBOQjogc2VsZWN0L3BvbGwgcmV0dXJucyB3aGVuZXZlciByZWFkIHdpbGwgbm90IGJsb2NrLiBUaGVyZWZvcmU6CisJICogaWYgZW9mIGlzIHJlYWNoZWQsIHNlbGVjdC9wb2xsIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5CisJICogYmVjYXVzZSByZWFkIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIDAgYnl0ZXMuCisJICogRXZlbiBpZiBzZWxlY3QvcG9sbCBzYXlzIHRoYXQgaW5wdXQgaXMgYXZhaWxhYmxlLCByZWFkIENBTiBibG9jaworCSAqIChzd2l0Y2ggZmQgaW50byBPX05PTkJMT0NLJ2VkIG1vZGUgdG8gYXZvaWQgaXQpCisJICovCisJcmQgPSAxOworCS8qIEFyZSB3ZSBpbnRlcmVzdGVkIGluIHN0ZGluPyAqLworLy9UT0RPOiByZXVzZSBjb2RlIGZvciBkZXRlcm1pbmluZyB0aGlzCisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfUykKKwkgICA/ICEobWF4X2ZsaW5lID4gY3VyX2ZsaW5lICsgbWF4X2Rpc3BsYXllZF9saW5lKQorCSAgIDogIShtYXhfZmxpbmUgPj0gY3VyX2ZsaW5lCisJICAgICAgICYmIG1heF9saW5lbm8gPiBMSU5FTk8oZmxpbmVzW2N1cl9mbGluZV0pICsgbWF4X2Rpc3BsYXllZF9saW5lKQorCSkgeworCQlpZiAoZW9mX2Vycm9yID4gMCkgLyogZGlkIE5PVCByZWFjaCBlb2YgeWV0ICovCisJCQlyZCA9IDA7IC8qIHllcywgd2UgYXJlIGludGVyZXN0ZWQgaW4gc3RkaW4gKi8KKwl9CisJLyogUG9zaXRpb24gY3Vyc29yIGlmIGxpbmUgaW5wdXQgaXMgZG9uZSAqLworCWlmIChsZXNzX2dldHNfcG9zID49IDApCisJCW1vdmVfY3Vyc29yKG1heF9kaXNwbGF5ZWRfbGluZSArIDIsIGxlc3NfZ2V0c19wb3MgKyAxKTsKKwlmZmx1c2hfYWxsKCk7CisKKwlpZiAoa2JkX2lucHV0WzBdID09IDApIHsgLyogaWYgbm90aGluZyBpcyBidWZmZXJlZCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKKwkJd2hpbGUgKDEpIHsKKwkJCWludCByOworCQkJLyogTkI6IFNJR1dJTkNIIGludGVycnVwdHMgcG9sbCgpICovCisJCQlyID0gcG9sbChwZmQgKyByZCwgMiAtIHJkLCAtMSk7CisJCQlpZiAoLypyIDwgMCAmJiBlcnJubyA9PSBFSU5UUiAmJiovIHdpbmNoX2NvdW50ZXIpCisJCQkJcmV0dXJuICdcXCc7IC8qIGFueXRoaW5nIHdoaWNoIGhhcyBubyBkZWZpbmVkIGZ1bmN0aW9uICovCisJCQlpZiAocikgYnJlYWs7CisJCX0KKyNlbHNlCisJCXNhZmVfcG9sbChwZmQgKyByZCwgMiAtIHJkLCAtMSk7CisjZW5kaWYKKwl9CisKKwkvKiBXZSBoYXZlIGtiZF9mZCBpbiBPX05PTkJMT0NLIG1vZGUsIHJlYWQgaW5zaWRlIHJlYWRfa2V5KCkKKwkgKiB3b3VsZCBub3QgYmxvY2sgZXZlbiBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUgKi8KKwlrZXk2NCA9IHJlYWRfa2V5KGtiZF9mZCwga2JkX2lucHV0LCAvKnRpbWVvdXQgb2ZmOiovIC0yKTsKKwlpZiAoKGludClrZXk2NCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisJCQkvKiBObyBrZXlib2FyZCBpbnB1dCBhdmFpbGFibGUuIFNpbmNlIHBvbGwoKSBkaWQgcmV0dXJuLAorCQkJICogd2Ugc2hvdWxkIGhhdmUgaW5wdXQgb24gc3RkaW4gKi8KKwkJCXJlYWRfbGluZXMoKTsKKwkJCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQkvKiBFT0YvZXJyb3IgKHNzaCBzZXNzaW9uIGdvdCBraWxsZWQgZXRjKSAqLworCQlsZXNzX2V4aXQoMCk7CisJfQorCXNldF90dHlfY29va2VkKCk7CisJcmV0dXJuIGtleTY0OworfQorCisvKiBHcmFiIGEgY2hhcmFjdGVyIGZyb20gaW5wdXQgd2l0aG91dCByZXF1aXJpbmcgdGhlIHJldHVybiBrZXkuCisgKiBNYXkgcmV0dXJuIEtFWUNPREVfeHh4IHZhbHVlcy4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdvcmtzIGJlc3Qgd2l0aCByYXcgaW5wdXQuICovCitzdGF0aWMgaW50NjRfdCBsZXNzX2dldGNoKGludCBwb3MpCit7CisJaW50NjRfdCBrZXk2NDsKKwlpbnQga2V5OworCisgYWdhaW46CisJbGVzc19nZXRzX3BvcyA9IHBvczsKKwlrZXkgPSBrZXk2NCA9IGdldGNoX25vd2FpdCgpOworCWxlc3NfZ2V0c19wb3MgPSAtMTsKKworCS8qIERpc2NhcmQgQ3RybC1zb21ldGhpbmcgY2hhcnMuCisJICogKGNoZWNraW5nIG9ubHkgbG93ZXIgMzIgYml0cyBpcyBhIHNpemUgb3B0aW1pemF0aW9uOgorCSAqIHVwcGVyIDMyIGJpdHMgYXJlIHVzZWQgb25seSBieSBLRVlDT0RFX0NVUlNPUl9QT1MpCisJICovCisJaWYgKGtleSA+PSAwICYmIGtleSA8ICcgJyAmJiBrZXkgIT0gMHgwZCAmJiBrZXkgIT0gOCkKKwkJZ290byBhZ2FpbjsKKworCXJldHVybiBrZXk2NDsKK30KKworc3RhdGljIGNoYXIqIGxlc3NfZ2V0cyhpbnQgc3opCit7CisJaW50IGM7CisJdW5zaWduZWQgaSA9IDA7CisJY2hhciAqcmVzdWx0ID0geHphbGxvYygxKTsKKworCXdoaWxlICgxKSB7CisJCWMgPSAnXDAnOworCQlsZXNzX2dldHNfcG9zID0gc3ogKyBpOworCQljID0gZ2V0Y2hfbm93YWl0KCk7CisJCWlmIChjID09IDB4MGQpIHsKKwkJCXJlc3VsdFtpXSA9ICdcMCc7CisJCQlsZXNzX2dldHNfcG9zID0gLTE7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmIChjID09IDB4N2YpCisJCQljID0gODsKKwkJaWYgKGMgPT0gOCAmJiBpKSB7CisJCQlwcmludGYoIlx4OCBceDgiKTsKKwkJCWktLTsKKwkJfQorCQlpZiAoYyA8ICcgJykgLyogZmlsdGVycyBvdXQgS0VZQ09ERV94eHggdG9vICg8MCkgKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoaSA+PSB3aWR0aCAtIHN6IC0gMSkKKwkJCWNvbnRpbnVlOyAvKiBsZW4gbGltaXQgKi8KKwkJYmJfcHV0Y2hhcihjKTsKKwkJcmVzdWx0W2krK10gPSBjOworCQlyZXN1bHQgPSB4cmVhbGxvYyhyZXN1bHQsIGkrMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleGFtaW5lX2ZpbGUodm9pZCkKK3sKKwljaGFyICpuZXdfZm5hbWU7CisKKwlwcmludF9zdGF0dXNsaW5lKCJFeGFtaW5lOiAiKTsKKwluZXdfZm5hbWUgPSBsZXNzX2dldHMoc2l6ZW9mKCJFeGFtaW5lOiAiKSAtIDEpOworCWlmICghbmV3X2ZuYW1lWzBdKSB7CisJCXN0YXR1c19wcmludCgpOworIGVycjoKKwkJZnJlZShuZXdfZm5hbWUpOworCQlyZXR1cm47CisJfQorCWlmIChhY2Nlc3MobmV3X2ZuYW1lLCBSX09LKSAhPSAwKSB7CisJCXByaW50X3N0YXR1c2xpbmUoIkNhbm5vdCByZWFkIHRoaXMgZmlsZSIpOworCQlnb3RvIGVycjsKKwl9CisJZnJlZShmaWxlbmFtZSk7CisJZmlsZW5hbWUgPSBuZXdfZm5hbWU7CisJLyogZmlsZXMgc3RhcnQgYnkgPSBhcmd2LiB3aHkgd2UgYXNzdW1lIHRoYXQgYXJndiBpcyBpbmZpbml0ZWx5IGxvbmc/PworCWZpbGVzW251bV9maWxlc10gPSBmaWxlbmFtZTsKKwljdXJyZW50X2ZpbGUgPSBudW1fZmlsZXMgKyAxOworCW51bV9maWxlcysrOyAqLworCWZpbGVzWzBdID0gZmlsZW5hbWU7CisJbnVtX2ZpbGVzID0gY3VycmVudF9maWxlID0gMTsKKwlyZWluaXRpYWxpemUoKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBwYWdlZC4gZGlyZWN0aW9uIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqIC0xOiBnbyBiYWNrIG9uZSBmaWxlCisgKiAgMDogZ28gdG8gdGhlIGZpcnN0IGZpbGUKKyAqICAxOiBnbyBmb3J3YXJkIG9uZSBmaWxlICovCitzdGF0aWMgdm9pZCBjaGFuZ2VfZmlsZShpbnQgZGlyZWN0aW9uKQoreworCWlmIChjdXJyZW50X2ZpbGUgIT0gKChkaXJlY3Rpb24gPiAwKSA/IG51bV9maWxlcyA6IDEpKSB7CisJCWN1cnJlbnRfZmlsZSA9IGRpcmVjdGlvbiA/IGN1cnJlbnRfZmlsZSArIGRpcmVjdGlvbiA6IDE7CisJCWZyZWUoZmlsZW5hbWUpOworCQlmaWxlbmFtZSA9IHhzdHJkdXAoZmlsZXNbY3VycmVudF9maWxlIC0gMV0pOworCQlyZWluaXRpYWxpemUoKTsKKwl9IGVsc2UgeworCQlwcmludF9zdGF0dXNsaW5lKGRpcmVjdGlvbiA+IDAgPyAiTm8gbmV4dCBmaWxlIiA6ICJObyBwcmV2aW91cyBmaWxlIik7CisJfQorfQorCitzdGF0aWMgdm9pZCByZW1vdmVfY3VycmVudF9maWxlKHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChudW1fZmlsZXMgPCAyKQorCQlyZXR1cm47CisKKwlpZiAoY3VycmVudF9maWxlICE9IDEpIHsKKwkJY2hhbmdlX2ZpbGUoLTEpOworCQlmb3IgKGkgPSAzOyBpIDw9IG51bV9maWxlczsgaSsrKQorCQkJZmlsZXNbaSAtIDJdID0gZmlsZXNbaSAtIDFdOworCQludW1fZmlsZXMtLTsKKwl9IGVsc2UgeworCQljaGFuZ2VfZmlsZSgxKTsKKwkJZm9yIChpID0gMjsgaSA8PSBudW1fZmlsZXM7IGkrKykKKwkJCWZpbGVzW2kgLSAyXSA9IGZpbGVzW2kgLSAxXTsKKwkJbnVtX2ZpbGVzLS07CisJCWN1cnJlbnRfZmlsZS0tOworCX0KK30KKworc3RhdGljIHZvaWQgY29sb25fcHJvY2Vzcyh2b2lkKQoreworCWludCBrZXlwcmVzczsKKworCS8qIENsZWFyIHRoZSBjdXJyZW50IGxpbmUgYW5kIHByaW50IGEgcHJvbXB0ICovCisJcHJpbnRfc3RhdHVzbGluZSgiIDoiKTsKKworCWtleXByZXNzID0gbGVzc19nZXRjaCgyKTsKKwlzd2l0Y2ggKGtleXByZXNzKSB7CisJY2FzZSAnZCc6CisJCXJlbW92ZV9jdXJyZW50X2ZpbGUoKTsKKwkJYnJlYWs7CisJY2FzZSAnZSc6CisJCWV4YW1pbmVfZmlsZSgpOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0ZMQUdTCisJY2FzZSAnZic6CisJCW1fc3RhdHVzX3ByaW50KCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSAnbic6CisJCWNoYW5nZV9maWxlKDEpOworCQlicmVhazsKKwljYXNlICdwJzoKKwkJY2hhbmdlX2ZpbGUoLTEpOworCQlicmVhazsKKwljYXNlICdxJzoKKwkJbGVzc19leGl0KEVYSVRfU1VDQ0VTUyk7CisJCWJyZWFrOworCWNhc2UgJ3gnOgorCQljaGFuZ2VfZmlsZSgwKTsKKwkJYnJlYWs7CisJfQorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZV9tYXRjaF9wb3MoaW50IG1hdGNoKQoreworCWlmIChtYXRjaCA+PSBudW1fbWF0Y2hlcykKKwkJbWF0Y2ggPSBudW1fbWF0Y2hlcyAtIDE7CisJaWYgKG1hdGNoIDwgMCkKKwkJbWF0Y2ggPSAwOworCW1hdGNoX3BvcyA9IG1hdGNoOworfQorCitzdGF0aWMgdm9pZCBnb3RvX21hdGNoKGludCBtYXRjaCkKK3sKKwlpZiAoIXBhdHRlcm5fdmFsaWQpCisJCXJldHVybjsKKwlpZiAobWF0Y2ggPCAwKQorCQltYXRjaCA9IDA7CisJLyogVHJ5IHRvIGZpbmQgbmV4dCBtYXRjaCBpZiBlb2YgaXNuJ3QgcmVhY2hlZCB5ZXQgKi8KKwlpZiAobWF0Y2ggPj0gbnVtX21hdGNoZXMgJiYgZW9mX2Vycm9yID4gMCkgeworCQl3YW50ZWRfbWF0Y2ggPSBtYXRjaDsgLyogIkkgd2FudCB0byByZWFkIHVudGlsIEkgc2VlIE4ndGggbWF0Y2giICovCisJCXJlYWRfbGluZXMoKTsKKwl9CisJaWYgKG51bV9tYXRjaGVzKSB7CisJCW5vcm1hbGl6ZV9tYXRjaF9wb3MobWF0Y2gpOworCQlidWZmZXJfbGluZShtYXRjaF9saW5lc1ttYXRjaF9wb3NdKTsKKwl9IGVsc2UgeworCQlwcmludF9zdGF0dXNsaW5lKCJObyBtYXRjaGVzIGZvdW5kIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX21hdGNoX2xpbmVzKHVuc2lnbmVkIHBvcykKK3sKKwlpZiAoIXBhdHRlcm5fdmFsaWQpCisJCXJldHVybjsKKwkvKiBSdW4gdGhlIHJlZ2V4IG9uIGVhY2ggbGluZSBvZiB0aGUgY3VycmVudCBmaWxlICovCisJd2hpbGUgKHBvcyA8PSBtYXhfZmxpbmUpIHsKKwkJLyogSWYgdGhpcyBsaW5lIG1hdGNoZXMgKi8KKwkJaWYgKHJlZ2V4ZWMoJnBhdHRlcm4sIGZsaW5lc1twb3NdLCAwLCBOVUxMLCAwKSA9PSAwCisJCS8qIGFuZCB3ZSBkaWRuJ3QgbWF0Y2ggaXQgbGFzdCB0aW1lICovCisJCSAmJiAhKG51bV9tYXRjaGVzICYmIG1hdGNoX2xpbmVzW251bV9tYXRjaGVzLTFdID09IHBvcykKKwkJKSB7CisJCQltYXRjaF9saW5lcyA9IHhyZWFsbG9jX3ZlY3RvcihtYXRjaF9saW5lcywgNCwgbnVtX21hdGNoZXMpOworCQkJbWF0Y2hfbGluZXNbbnVtX21hdGNoZXMrK10gPSBwb3M7CisJCX0KKwkJcG9zKys7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWdleF9wcm9jZXNzKHZvaWQpCit7CisJY2hhciAqdW5jb21wX3JlZ2V4LCAqZXJyOworCisJLyogUmVzZXQgdmFyaWFibGVzICovCisJZnJlZShtYXRjaF9saW5lcyk7CisJbWF0Y2hfbGluZXMgPSBOVUxMOworCW1hdGNoX3BvcyA9IDA7CisJbnVtX21hdGNoZXMgPSAwOworCWlmIChwYXR0ZXJuX3ZhbGlkKSB7CisJCXJlZ2ZyZWUoJnBhdHRlcm4pOworCQlwYXR0ZXJuX3ZhbGlkID0gMDsKKwl9CisKKwkvKiBHZXQgdGhlIHVuY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHVzZXIgKi8KKwljbGVhcl9saW5lKCk7CisJYmJfcHV0Y2hhcigob3B0aW9uX21hc2szMiAmIExFU1NfU1RBVEVfTUFUQ0hfQkFDS1dBUkRTKSA/ICc/JyA6ICcvJyk7CisJdW5jb21wX3JlZ2V4ID0gbGVzc19nZXRzKDEpOworCWlmICghdW5jb21wX3JlZ2V4WzBdKSB7CisJCWZyZWUodW5jb21wX3JlZ2V4KTsKKwkJYnVmZmVyX3ByaW50KCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb21waWxlIHRoZSByZWdleCBhbmQgY2hlY2sgZm9yIGVycm9ycyAqLworCWVyciA9IHJlZ2NvbXBfb3JfZXJybXNnKCZwYXR0ZXJuLCB1bmNvbXBfcmVnZXgsCisJCQkJKG9wdGlvbl9tYXNrMzIgJiBGTEFHX0kpID8gUkVHX0lDQVNFIDogMCk7CisJZnJlZSh1bmNvbXBfcmVnZXgpOworCWlmIChlcnIpIHsKKwkJcHJpbnRfc3RhdHVzbGluZShlcnIpOworCQlmcmVlKGVycik7CisJCXJldHVybjsKKwl9CisKKwlwYXR0ZXJuX3ZhbGlkID0gMTsKKwltYXRjaF9wb3MgPSAwOworCWZpbGxfbWF0Y2hfbGluZXMoMCk7CisJd2hpbGUgKG1hdGNoX3BvcyA8IG51bV9tYXRjaGVzKSB7CisJCWlmICgoaW50KW1hdGNoX2xpbmVzW21hdGNoX3Bvc10gPiBjdXJfZmxpbmUpCisJCQlicmVhazsKKwkJbWF0Y2hfcG9zKys7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgTEVTU19TVEFURV9NQVRDSF9CQUNLV0FSRFMpCisJCW1hdGNoX3Bvcy0tOworCisJLyogSXQncyBwb3NzaWJsZSB0aGF0IG5vIG1hdGNoZXMgYXJlIGZvdW5kIHlldC4KKwkgKiBnb3RvX21hdGNoKCkgd2lsbCByZWFkIGlucHV0IGxvb2tpbmcgZm9yIG1hdGNoLAorCSAqIGlmIG5lZWRlZCAqLworCWdvdG9fbWF0Y2gobWF0Y2hfcG9zKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBudW1iZXJfcHJvY2VzcyhpbnQgZmlyc3RfZGlnaXQpCit7CisJdW5zaWduZWQgaTsKKwlpbnQgbnVtOworCWludCBrZXlwcmVzczsKKwljaGFyIG51bV9pbnB1dFtzaXplb2YoaW50KSo0XTsgLyogbW9yZSB0aGFuIGVub3VnaCAqLworCisJbnVtX2lucHV0WzBdID0gZmlyc3RfZGlnaXQ7CisKKwkvKiBDbGVhciB0aGUgY3VycmVudCBsaW5lLCBwcmludCBhIHByb21wdCwgYW5kIHRoZW4gcHJpbnQgdGhlIGRpZ2l0ICovCisJY2xlYXJfbGluZSgpOworCXByaW50ZigiOiVjIiwgZmlyc3RfZGlnaXQpOworCisJLyogUmVjZWl2ZSBpbnB1dCB1bnRpbCBhIGxldHRlciBpcyBnaXZlbiAqLworCWkgPSAxOworCXdoaWxlIChpIDwgc2l6ZW9mKG51bV9pbnB1dCktMSkgeworCQlrZXlwcmVzcyA9IGxlc3NfZ2V0Y2goaSArIDEpOworCQlpZiAoKHVuc2lnbmVkKWtleXByZXNzID4gMjU1IHx8ICFpc2RpZ2l0KG51bV9pbnB1dFtpXSkpCisJCQlicmVhazsKKwkJbnVtX2lucHV0W2ldID0ga2V5cHJlc3M7CisJCWJiX3B1dGNoYXIoa2V5cHJlc3MpOworCQlpKys7CisJfQorCisJbnVtX2lucHV0W2ldID0gJ1wwJzsKKwludW0gPSBiYl9zdHJ0b3UobnVtX2lucHV0LCBOVUxMLCAxMCk7CisJLyogb24gZm9ybWF0IGVycm9yLCBudW0gPT0gLTEgKi8KKwlpZiAobnVtIDwgMSB8fCBudW0gPiBNQVhMSU5FUykgeworCQlidWZmZXJfcHJpbnQoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIG5vdyBrbm93IHRoZSBudW1iZXIgYW5kIHRoZSBsZXR0ZXIgZW50ZXJlZCwgc28gd2UgcHJvY2VzcyB0aGVtICovCisJc3dpdGNoIChrZXlwcmVzcykgeworCWNhc2UgS0VZQ09ERV9ET1dOOiBjYXNlICd6JzogY2FzZSAnZCc6IGNhc2UgJ2UnOiBjYXNlICcgJzogY2FzZSAnXDAxNSc6CisJCWJ1ZmZlcl9kb3duKG51bSk7CisJCWJyZWFrOworCWNhc2UgS0VZQ09ERV9VUDogY2FzZSAnYic6IGNhc2UgJ3cnOiBjYXNlICd5JzogY2FzZSAndSc6CisJCWJ1ZmZlcl91cChudW0pOworCQlicmVhazsKKwljYXNlICdnJzogY2FzZSAnPCc6IGNhc2UgJ0cnOiBjYXNlICc+JzoKKwkJY3VyX2ZsaW5lID0gbnVtICsgbWF4X2Rpc3BsYXllZF9saW5lOworCQlyZWFkX2xpbmVzKCk7CisJCWJ1ZmZlcl9saW5lKG51bSAtIDEpOworCQlicmVhazsKKwljYXNlICdwJzogY2FzZSAnJSc6CisJCW51bSA9IG51bSAqIChtYXhfZmxpbmUgLyAxMDApOyAvKiArIG1heF9mbGluZSAvIDI7ICovCisJCWN1cl9mbGluZSA9IG51bSArIG1heF9kaXNwbGF5ZWRfbGluZTsKKwkJcmVhZF9saW5lcygpOworCQlidWZmZXJfbGluZShudW0pOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCWNhc2UgJ24nOgorCQlnb3RvX21hdGNoKG1hdGNoX3BvcyArIG51bSk7CisJCWJyZWFrOworCWNhc2UgJy8nOgorCQlvcHRpb25fbWFzazMyICY9IH5MRVNTX1NUQVRFX01BVENIX0JBQ0tXQVJEUzsKKwkJcmVnZXhfcHJvY2VzcygpOworCQlicmVhazsKKwljYXNlICc/JzoKKwkJb3B0aW9uX21hc2szMiB8PSBMRVNTX1NUQVRFX01BVENIX0JBQ0tXQVJEUzsKKwkJcmVnZXhfcHJvY2VzcygpOworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfREFTSENNRAorc3RhdGljIHZvaWQgZmxhZ19jaGFuZ2Uodm9pZCkKK3sKKwlpbnQga2V5cHJlc3M7CisKKwljbGVhcl9saW5lKCk7CisJYmJfcHV0Y2hhcignLScpOworCWtleXByZXNzID0gbGVzc19nZXRjaCgxKTsKKworCXN3aXRjaCAoa2V5cHJlc3MpIHsKKwljYXNlICdNJzoKKwkJb3B0aW9uX21hc2szMiBePSBGTEFHX007CisJCWJyZWFrOworCWNhc2UgJ20nOgorCQlvcHRpb25fbWFzazMyIF49IEZMQUdfbTsKKwkJYnJlYWs7CisJY2FzZSAnRSc6CisJCW9wdGlvbl9tYXNrMzIgXj0gRkxBR19FOworCQlicmVhazsKKwljYXNlICd+JzoKKwkJb3B0aW9uX21hc2szMiBePSBGTEFHX1RJTERFOworCQlicmVhazsKKwljYXNlICdTJzoKKwkJb3B0aW9uX21hc2szMiBePSBGTEFHX1M7CisJCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0xJTkVOVU1TCisJY2FzZSAnTic6CisJCW9wdGlvbl9tYXNrMzIgXj0gRkxBR19OOworCQlyZV93cmFwKCk7CisJCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworI2lmZGVmIEJMT0FUCitzdGF0aWMgdm9pZCBzaG93X2ZsYWdfc3RhdHVzKHZvaWQpCit7CisJaW50IGtleXByZXNzOworCWludCBmbGFnX3ZhbDsKKworCWNsZWFyX2xpbmUoKTsKKwliYl9wdXRjaGFyKCdfJyk7CisJa2V5cHJlc3MgPSBsZXNzX2dldGNoKDEpOworCisJc3dpdGNoIChrZXlwcmVzcykgeworCWNhc2UgJ00nOgorCQlmbGFnX3ZhbCA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX007CisJCWJyZWFrOworCWNhc2UgJ20nOgorCQlmbGFnX3ZhbCA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX207CisJCWJyZWFrOworCWNhc2UgJ34nOgorCQlmbGFnX3ZhbCA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX1RJTERFOworCQlicmVhazsKKwljYXNlICdOJzoKKwkJZmxhZ192YWwgPSBvcHRpb25fbWFzazMyICYgRkxBR19OOworCQlicmVhazsKKwljYXNlICdFJzoKKwkJZmxhZ192YWwgPSBvcHRpb25fbWFzazMyICYgRkxBR19FOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmbGFnX3ZhbCA9IDA7CisJCWJyZWFrOworCX0KKworCWNsZWFyX2xpbmUoKTsKKwlwcmludGYoSElHSExJR0hUIlRoZSBzdGF0dXMgb2YgdGhlIGZsYWcgaXM6ICV1Ik5PUk1BTCwgZmxhZ192YWwgIT0gMCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEVOQUJMRV9GRUFUVVJFX0xFU1NfREFTSENNRCAqLworCitzdGF0aWMgdm9pZCBzYXZlX2lucHV0X3RvX2ZpbGUodm9pZCkKK3sKKwljb25zdCBjaGFyICptc2cgPSAiIjsKKwljaGFyICpjdXJyZW50X2xpbmU7CisJdW5zaWduZWQgaTsKKwlGSUxFICpmcDsKKworCXByaW50X3N0YXR1c2xpbmUoIkxvZyBmaWxlOiAiKTsKKwljdXJyZW50X2xpbmUgPSBsZXNzX2dldHMoc2l6ZW9mKCJMb2cgZmlsZTogIiktMSk7CisJaWYgKGN1cnJlbnRfbGluZVswXSkgeworCQlmcCA9IGZvcGVuX2Zvcl93cml0ZShjdXJyZW50X2xpbmUpOworCQlpZiAoIWZwKSB7CisJCQltc2cgPSAiRXJyb3Igb3BlbmluZyBsb2cgZmlsZSI7CisJCQlnb3RvIHJldDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDw9IG1heF9mbGluZTsgaSsrKQorCQkJZnByaW50ZihmcCwgIiVzXG4iLCBmbGluZXNbaV0pOworCQlmY2xvc2UoZnApOworCQltc2cgPSAiRG9uZSI7CisJfQorIHJldDoKKwlwcmludF9zdGF0dXNsaW5lKG1zZyk7CisJZnJlZShjdXJyZW50X2xpbmUpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19NQVJLUworc3RhdGljIHZvaWQgYWRkX21hcmsodm9pZCkKK3sKKwlpbnQgbGV0dGVyOworCisJcHJpbnRfc3RhdHVzbGluZSgiTWFyazogIik7CisJbGV0dGVyID0gbGVzc19nZXRjaChzaXplb2YoIk1hcms6ICIpIC0gMSk7CisKKwlpZiAoaXNhbHBoYShsZXR0ZXIpKSB7CisJCS8qIElmIHdlIGV4Y2VlZCAxNSBtYXJrcywgc3RhcnQgb3ZlcndyaXRpbmcgcHJldmlvdXMgb25lcyAqLworCQlpZiAobnVtX21hcmtzID09IDE0KQorCQkJbnVtX21hcmtzID0gMDsKKworCQltYXJrX2xpbmVzW251bV9tYXJrc11bMF0gPSBsZXR0ZXI7CisJCW1hcmtfbGluZXNbbnVtX21hcmtzXVsxXSA9IGN1cl9mbGluZTsKKwkJbnVtX21hcmtzKys7CisJfSBlbHNlIHsKKwkJcHJpbnRfc3RhdHVzbGluZSgiSW52YWxpZCBtYXJrIGxldHRlciIpOworCX0KK30KKworc3RhdGljIHZvaWQgZ290b19tYXJrKHZvaWQpCit7CisJaW50IGxldHRlcjsKKwlpbnQgaTsKKworCXByaW50X3N0YXR1c2xpbmUoIkdvIHRvIG1hcms6ICIpOworCWxldHRlciA9IGxlc3NfZ2V0Y2goc2l6ZW9mKCJHbyB0byBtYXJrOiAiKSAtIDEpOworCWNsZWFyX2xpbmUoKTsKKworCWlmIChpc2FscGhhKGxldHRlcikpIHsKKwkJZm9yIChpID0gMDsgaSA8PSBudW1fbWFya3M7IGkrKykKKwkJCWlmIChsZXR0ZXIgPT0gbWFya19saW5lc1tpXVswXSkgeworCQkJCWJ1ZmZlcl9saW5lKG1hcmtfbGluZXNbaV1bMV0pOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAobnVtX21hcmtzID09IDE0ICYmIGxldHRlciAhPSBtYXJrX2xpbmVzWzE0XVswXSkKKwkJCXByaW50X3N0YXR1c2xpbmUoIk1hcmsgbm90IHNldCIpOworCX0gZWxzZQorCQlwcmludF9zdGF0dXNsaW5lKCJJbnZhbGlkIG1hcmsgbGV0dGVyIik7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfQlJBQ0tFVFMKK3N0YXRpYyBjaGFyIG9wcF9icmFja2V0KGNoYXIgYnJhY2tldCkKK3sKKwlzd2l0Y2ggKGJyYWNrZXQpIHsKKwkJY2FzZSAneyc6IGNhc2UgJ1snOiAvKiAnfScgPT0gJ3snICsgMi4gU2FtZSBmb3IgJ1snICovCisJCQlicmFja2V0Kys7CisJCWNhc2UgJygnOiAgICAgICAgICAgLyogJyknID09ICcoJyArIDEgKi8KKwkJCWJyYWNrZXQrKzsKKwkJCWJyZWFrOworCQljYXNlICd9JzogY2FzZSAnXSc6CisJCQlicmFja2V0LS07CisJCWNhc2UgJyknOgorCQkJYnJhY2tldC0tOworCQkJYnJlYWs7CisJfTsKKwlyZXR1cm4gYnJhY2tldDsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hfcmlnaHRfYnJhY2tldChjaGFyIGJyYWNrZXQpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChzdHJjaHIoZmxpbmVzW2N1cl9mbGluZV0sIGJyYWNrZXQpID09IE5VTEwpIHsKKwkJcHJpbnRfc3RhdHVzbGluZSgiTm8gYnJhY2tldCBpbiB0b3AgbGluZSIpOworCQlyZXR1cm47CisJfQorCWJyYWNrZXQgPSBvcHBfYnJhY2tldChicmFja2V0KTsKKwlmb3IgKGkgPSBjdXJfZmxpbmUgKyAxOyBpIDwgbWF4X2ZsaW5lOyBpKyspIHsKKwkJaWYgKHN0cmNocihmbGluZXNbaV0sIGJyYWNrZXQpICE9IE5VTEwpIHsKKwkJCWJ1ZmZlcl9saW5lKGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCXByaW50X3N0YXR1c2xpbmUoIk5vIG1hdGNoaW5nIGJyYWNrZXQgZm91bmQiKTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hfbGVmdF9icmFja2V0KGNoYXIgYnJhY2tldCkKK3sKKwlpbnQgaTsKKworCWlmIChzdHJjaHIoZmxpbmVzW2N1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZV0sIGJyYWNrZXQpID09IE5VTEwpIHsKKwkJcHJpbnRfc3RhdHVzbGluZSgiTm8gYnJhY2tldCBpbiBib3R0b20gbGluZSIpOworCQlyZXR1cm47CisJfQorCisJYnJhY2tldCA9IG9wcF9icmFja2V0KGJyYWNrZXQpOworCWZvciAoaSA9IGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHN0cmNocihmbGluZXNbaV0sIGJyYWNrZXQpICE9IE5VTEwpIHsKKwkJCWJ1ZmZlcl9saW5lKGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCXByaW50X3N0YXR1c2xpbmUoIk5vIG1hdGNoaW5nIGJyYWNrZXQgZm91bmQiKTsKK30KKyNlbmRpZiAgLyogRkVBVFVSRV9MRVNTX0JSQUNLRVRTICovCisKK3N0YXRpYyB2b2lkIGtleXByZXNzX3Byb2Nlc3MoaW50IGtleXByZXNzKQoreworCXN3aXRjaCAoa2V5cHJlc3MpIHsKKwljYXNlIEtFWUNPREVfRE9XTjogY2FzZSAnZSc6IGNhc2UgJ2onOiBjYXNlIDB4MGQ6CisJCWJ1ZmZlcl9kb3duKDEpOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfVVA6IGNhc2UgJ3knOiBjYXNlICdrJzoKKwkJYnVmZmVyX3VwKDEpOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfUEFHRURPV046IGNhc2UgJyAnOiBjYXNlICd6JzogY2FzZSAnZic6CisJCWJ1ZmZlcl9kb3duKG1heF9kaXNwbGF5ZWRfbGluZSArIDEpOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfUEFHRVVQOiBjYXNlICd3JzogY2FzZSAnYic6CisJCWJ1ZmZlcl91cChtYXhfZGlzcGxheWVkX2xpbmUgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CisJCWJ1ZmZlcl9kb3duKChtYXhfZGlzcGxheWVkX2xpbmUgKyAxKSAvIDIpOworCQlicmVhazsKKwljYXNlICd1JzoKKwkJYnVmZmVyX3VwKChtYXhfZGlzcGxheWVkX2xpbmUgKyAxKSAvIDIpOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfSE9NRTogY2FzZSAnZyc6IGNhc2UgJ3AnOiBjYXNlICc8JzogY2FzZSAnJSc6CisJCWJ1ZmZlcl9saW5lKDApOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfRU5EOiBjYXNlICdHJzogY2FzZSAnPic6CisJCWN1cl9mbGluZSA9IE1BWExJTkVTOworCQlyZWFkX2xpbmVzKCk7CisJCWJ1ZmZlcl9saW5lKGN1cl9mbGluZSk7CisJCWJyZWFrOworCWNhc2UgJ3EnOiBjYXNlICdRJzoKKwkJbGVzc19leGl0KEVYSVRfU1VDQ0VTUyk7CisJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfTUFSS1MKKwljYXNlICdtJzoKKwkJYWRkX21hcmsoKTsKKwkJYnVmZmVyX3ByaW50KCk7CisJCWJyZWFrOworCWNhc2UgJ1wnJzoKKwkJZ290b19tYXJrKCk7CisJCWJ1ZmZlcl9wcmludCgpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgJ3InOiBjYXNlICdSJzoKKwkJLyogVE9ETzogKDEpIGFsc28gYmluZCBeUiwgXkwgdG8gdGhpcz8KKwkJICogKDIpIHJlLW1lYXN1cmUgd2luZG93IHNpemU/CisJCSAqLworCQlidWZmZXJfcHJpbnQoKTsKKwkJYnJlYWs7CisJLypjYXNlICdSJzoKKwkJZnVsbF9yZXBhaW50KCk7CisJCWJyZWFrOyovCisJY2FzZSAncyc6CisJCXNhdmVfaW5wdXRfdG9fZmlsZSgpOworCQlicmVhazsKKwljYXNlICdFJzoKKwkJZXhhbWluZV9maWxlKCk7CisJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfRkxBR1MKKwljYXNlICc9JzoKKwkJbV9zdGF0dXNfcHJpbnQoKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCWNhc2UgJy8nOgorCQlvcHRpb25fbWFzazMyICY9IH5MRVNTX1NUQVRFX01BVENIX0JBQ0tXQVJEUzsKKwkJcmVnZXhfcHJvY2VzcygpOworCQlicmVhazsKKwljYXNlICduJzoKKwkJZ290b19tYXRjaChtYXRjaF9wb3MgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSAnTic6CisJCWdvdG9fbWF0Y2gobWF0Y2hfcG9zIC0gMSk7CisJCWJyZWFrOworCWNhc2UgJz8nOgorCQlvcHRpb25fbWFzazMyIHw9IExFU1NfU1RBVEVfTUFUQ0hfQkFDS1dBUkRTOworCQlyZWdleF9wcm9jZXNzKCk7CisJCWJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19EQVNIQ01ECisJY2FzZSAnLSc6CisJCWZsYWdfY2hhbmdlKCk7CisJCWJ1ZmZlcl9wcmludCgpOworCQlicmVhazsKKyNpZmRlZiBCTE9BVAorCWNhc2UgJ18nOgorCQlzaG93X2ZsYWdfc3RhdHVzKCk7CisJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0JSQUNLRVRTCisJY2FzZSAneyc6IGNhc2UgJygnOiBjYXNlICdbJzoKKwkJbWF0Y2hfcmlnaHRfYnJhY2tldChrZXlwcmVzcyk7CisJCWJyZWFrOworCWNhc2UgJ30nOiBjYXNlICcpJzogY2FzZSAnXSc6CisJCW1hdGNoX2xlZnRfYnJhY2tldChrZXlwcmVzcyk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSAnOic6CisJCWNvbG9uX3Byb2Nlc3MoKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGlzZGlnaXQoa2V5cHJlc3MpKQorCQludW1iZXJfcHJvY2VzcyhrZXlwcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19jYXRjaGVyKGludCBzaWcpCit7CisJbGVzc19leGl0KC0gc2lnKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKK3N0YXRpYyB2b2lkIHNpZ3dpbmNoX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJd2luY2hfY291bnRlcisrOworfQorI2VuZGlmCisKK2ludCBsZXNzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsZXNzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUlOSVRfRygpOworCisJLyogVE9ETzogLXg6IGRvIG5vdCBpbnRlcnByZXQgYmFja3NwYWNlLCAteHg6IHRhYiBhbHNvICovCisJLyogLXh4eDogbmV3bGluZSBhbHNvICovCisJLyogLXcgTjogYXNzdW1lIHdpZHRoIE4gKC14eHggLXcgMzI6IGhleCB2aWV3ZXIgb2Ygc29ydHMpICovCisJZ2V0b3B0MzIoYXJndiwgIkVNbU5+SSIgSUZfRkVBVFVSRV9MRVNTX0RBU0hDTUQoIlMiKSk7CisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJbnVtX2ZpbGVzID0gYXJnYzsKKwlmaWxlcyA9IGFyZ3Y7CisKKwkvKiBBbm90aGVyIHBvcHVsYXIgcGFnZXIsIG1vc3QsIGRldGVjdHMgd2hlbiBzdGRvdXQKKwkgKiBpcyBub3QgYSB0dHkgYW5kIHR1cm5zIGludG8gY2F0LiBUaGlzIG1ha2VzIHNlbnNlLiAqLworCWlmICghaXNhdHR5KFNURE9VVF9GSUxFTk8pKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCisJaWYgKCFudW1fZmlsZXMpIHsKKwkJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pKSB7CisJCQkvKiBKdXN0ICJsZXNzIj8gTm8gYXJncyBhbmQgbm8gcmVkaXJlY3Rpb24/ICovCisJCQliYl9lcnJvcl9tc2coIm1pc3NpbmcgZmlsZW5hbWUiKTsKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0gZWxzZSB7CisJCWZpbGVuYW1lID0geHN0cmR1cChmaWxlc1swXSk7CisJfQorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1RJTERFKQorCQllbXB0eV9saW5lX21hcmtlciA9ICIiOworCisJa2JkX2ZkID0gb3BlbihDVVJSRU5UX1RUWSwgT19SRE9OTFkpOworCWlmIChrYmRfZmQgPCAwKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCW5kZWxheV9vbihrYmRfZmQpOworCisJdGNnZXRhdHRyKGtiZF9mZCwgJnRlcm1fb3JpZyk7CisJdGVybV9sZXNzID0gdGVybV9vcmlnOworCXRlcm1fbGVzcy5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CisJdGVybV9sZXNzLmNfaWZsYWcgJj0gfihJWE9OIHwgSUNSTkwpOworCS8qdGVybV9sZXNzLmNfb2ZsYWcgJj0gfk9OTENSOyovCisJdGVybV9sZXNzLmNfY2NbVk1JTl0gPSAxOworCXRlcm1fbGVzcy5jX2NjW1ZUSU1FXSA9IDA7CisKKwlJRl9GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMKEcud2luc2l6ZV9lcnIgPSkgZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChrYmRfZmQsICZ3aWR0aCwgJm1heF9kaXNwbGF5ZWRfbGluZSk7CisJLyogMjA6IHR3byB0YWJzdG9wcyArIDQgKi8KKwlpZiAod2lkdGggPCAyMCB8fCBtYXhfZGlzcGxheWVkX2xpbmUgPCAzKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCW1heF9kaXNwbGF5ZWRfbGluZSAtPSAyOworCisJLyogV2Ugd2FudCB0byByZXN0b3JlIHRlcm1fb3JpZyBvbiBleGl0ICovCisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCBzaWdfY2F0Y2hlcik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19XSU5DSAorCXNpZ25hbChTSUdXSU5DSCwgc2lnd2luY2hfaGFuZGxlcik7CisjZW5kaWYKKworCWJ1ZmZlciA9IHhtYWxsb2MoKG1heF9kaXNwbGF5ZWRfbGluZSsxKSAqIHNpemVvZihjaGFyICopKTsKKwlyZWluaXRpYWxpemUoKTsKKwl3aGlsZSAoMSkgeworCQlpbnQ2NF90IGtleXByZXNzOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19XSU5DSAorCQl3aGlsZSAoV0lOQ0hfQ09VTlRFUikgeworIGFnYWluOgorCQkJd2luY2hfY291bnRlci0tOworCQkJSUZfRkVBVFVSRV9MRVNTX0FTS19URVJNSU5BTChHLndpbnNpemVfZXJyID0pIGdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoa2JkX2ZkLCAmd2lkdGgsICZtYXhfZGlzcGxheWVkX2xpbmUpOworIElGX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUwoZ290X3NpemU6KQorCQkJLyogMjA6IHR3byB0YWJzdG9wcyArIDQgKi8KKwkJCWlmICh3aWR0aCA8IDIwKQorCQkJCXdpZHRoID0gMjA7CisJCQlpZiAobWF4X2Rpc3BsYXllZF9saW5lIDwgMykKKwkJCQltYXhfZGlzcGxheWVkX2xpbmUgPSAzOworCQkJbWF4X2Rpc3BsYXllZF9saW5lIC09IDI7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlidWZmZXIgPSB4bWFsbG9jKChtYXhfZGlzcGxheWVkX2xpbmUrMSkgKiBzaXplb2YoY2hhciAqKSk7CisJCQkvKiBBdm9pZCByZS13cmFwIGFuZC9vciByZWRyYXcgaWYgd2UgYWxyZWFkeSBrbm93CisJCQkgKiB3ZSBuZWVkIHRvIGRvIGl0IGFnYWluLiBUaGVzZSBvcHMgYXJlIGV4cGVuc2l2ZSAqLworCQkJaWYgKFdJTkNIX0NPVU5URVIpCisJCQkJZ290byBhZ2FpbjsKKwkJCXJlX3dyYXAoKTsKKwkJCWlmIChXSU5DSF9DT1VOVEVSKQorCQkJCWdvdG8gYWdhaW47CisJCQlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKKwkJCS8qIFRoaXMgdG9vayBzb21lIHRpbWUuIExvb3AgYmFjayBhbmQgY2hlY2ssCisJCQkgKiB3ZXJlIHRoZXJlIGFub3RoZXIgU0lHV0lOQ0g/ICovCisJCX0KKwkJa2V5cHJlc3MgPSBsZXNzX2dldGNoKC0xKTsgLyogLTE6IGRvIG5vdCBwb3NpdGlvbiBjdXJzb3IgKi8KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUwKKwkJaWYgKChpbnQzMl90KWtleXByZXNzID09IEtFWUNPREVfQ1VSU09SX1BPUykgeworCQkJdWludDMyX3QgcmMgPSAoa2V5cHJlc3MgPj4gMzIpOworCQkJd2lkdGggPSAocmMgJiAweDdmZmYpOworCQkJbWF4X2Rpc3BsYXllZF9saW5lID0gKChyYyA+PiAxNikgJiAweDdmZmYpOworCQkJZ290byBnb3Rfc2l6ZTsKKwkJfQorIyBlbmRpZgorI2Vsc2UKKwkJa2V5cHJlc3MgPSBsZXNzX2dldGNoKC0xKTsgLyogLTE6IGRvIG5vdCBwb3NpdGlvbiBjdXJzb3IgKi8KKyNlbmRpZgorCQlrZXlwcmVzc19wcm9jZXNzKGtleXByZXNzKTsKKwl9Cit9CisKKy8qCitIZWxwIHRleHQgb2YgbGVzcyB2ZXJzaW9uIDQxOCBpcyBiZWxvdy4KK0lmIHlvdSBhcmUgaW1wbGVtZW50aW5nIHNvbWV0aGluZywga2VlcGluZwora2V5IGFuZC9vciBjb21tYW5kIGxpbmUgc3dpdGNoIGNvbXBhdGliaWxpdHkgaXMgYSBnb29kIGlkZWE6CisKKworICAgICAgICAgICAgICAgICAgIFNVTU1BUlkgT0YgTEVTUyBDT01NQU5EUworCisgICAgICBDb21tYW5kcyBtYXJrZWQgd2l0aCAqIG1heSBiZSBwcmVjZWRlZCBieSBhIG51bWJlciwgTi4KKyAgICAgIE5vdGVzIGluIHBhcmVudGhlc2VzIGluZGljYXRlIHRoZSBiZWhhdmlvciBpZiBOIGlzIGdpdmVuLgorICBoICBIICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscC4KKyAgcSAgOnEgIFEgIDpRICBaWiAgICAgRXhpdC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVklORworICBlICBeRSAgaiAgXk4gIENSICAqICBGb3J3YXJkICBvbmUgbGluZSAgIChvciBOIGxpbmVzKS4KKyAgeSAgXlkgIGsgIF5LICBeUCAgKiAgQmFja3dhcmQgb25lIGxpbmUgICAob3IgTiBsaW5lcykuCisgIGYgIF5GICBeViAgU1BBQ0UgICogIEZvcndhcmQgIG9uZSB3aW5kb3cgKG9yIE4gbGluZXMpLgorICBiICBeQiAgRVNDLXYgICAgICAqICBCYWNrd2FyZCBvbmUgd2luZG93IChvciBOIGxpbmVzKS4KKyAgeiAgICAgICAgICAgICAgICAgKiAgRm9yd2FyZCAgb25lIHdpbmRvdyAoYW5kIHNldCB3aW5kb3cgdG8gTikuCisgIHcgICAgICAgICAgICAgICAgICogIEJhY2t3YXJkIG9uZSB3aW5kb3cgKGFuZCBzZXQgd2luZG93IHRvIE4pLgorICBFU0MtU1BBQ0UgICAgICAgICAqICBGb3J3YXJkICBvbmUgd2luZG93LCBidXQgZG9uJ3Qgc3RvcCBhdCBlbmQtb2YtZmlsZS4KKyAgZCAgXkQgICAgICAgICAgICAgKiAgRm9yd2FyZCAgb25lIGhhbGYtd2luZG93IChhbmQgc2V0IGhhbGYtd2luZG93IHRvIE4pLgorICB1ICBeVSAgICAgICAgICAgICAqICBCYWNrd2FyZCBvbmUgaGFsZi13aW5kb3cgKGFuZCBzZXQgaGFsZi13aW5kb3cgdG8gTikuCisgIEVTQy0pICBSaWdodEFycm93ICogIExlZnQgIG9uZSBoYWxmIHNjcmVlbiB3aWR0aCAob3IgTiBwb3NpdGlvbnMpLgorICBFU0MtKCAgTGVmdEFycm93ICAqICBSaWdodCBvbmUgaGFsZiBzY3JlZW4gd2lkdGggKG9yIE4gcG9zaXRpb25zKS4KKyAgRiAgICAgICAgICAgICAgICAgICAgRm9yd2FyZCBmb3JldmVyOyBsaWtlICJ0YWlsIC1mIi4KKyAgciAgXlIgIF5MICAgICAgICAgICAgUmVwYWludCBzY3JlZW4uCisgIFIgICAgICAgICAgICAgICAgICAgIFJlcGFpbnQgc2NyZWVuLCBkaXNjYXJkaW5nIGJ1ZmZlcmVkIGlucHV0LgorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRGVmYXVsdCAid2luZG93IiBpcyB0aGUgc2NyZWVuIGhlaWdodC4KKyAgICAgICAgRGVmYXVsdCAiaGFsZi13aW5kb3ciIGlzIGhhbGYgb2YgdGhlIHNjcmVlbiBoZWlnaHQuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQVJDSElORworICAvcGF0dGVybiAgICAgICAgICAqICBTZWFyY2ggZm9yd2FyZCBmb3IgKE4tdGgpIG1hdGNoaW5nIGxpbmUuCisgID9wYXR0ZXJuICAgICAgICAgICogIFNlYXJjaCBiYWNrd2FyZCBmb3IgKE4tdGgpIG1hdGNoaW5nIGxpbmUuCisgIG4gICAgICAgICAgICAgICAgICogIFJlcGVhdCBwcmV2aW91cyBzZWFyY2ggKGZvciBOLXRoIG9jY3VycmVuY2UpLgorICBOICAgICAgICAgICAgICAgICAqICBSZXBlYXQgcHJldmlvdXMgc2VhcmNoIGluIHJldmVyc2UgZGlyZWN0aW9uLgorICBFU0MtbiAgICAgICAgICAgICAqICBSZXBlYXQgcHJldmlvdXMgc2VhcmNoLCBzcGFubmluZyBmaWxlcy4KKyAgRVNDLU4gICAgICAgICAgICAgKiAgUmVwZWF0IHByZXZpb3VzIHNlYXJjaCwgcmV2ZXJzZSBkaXIuICYgc3Bhbm5pbmcgZmlsZXMuCisgIEVTQy11ICAgICAgICAgICAgICAgIFVuZG8gKHRvZ2dsZSkgc2VhcmNoIGhpZ2hsaWdodGluZy4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNlYXJjaCBwYXR0ZXJucyBtYXkgYmUgbW9kaWZpZWQgYnkgb25lIG9yIG1vcmUgb2Y6CisgICAgICAgIF5OIG9yICEgIFNlYXJjaCBmb3IgTk9OLW1hdGNoaW5nIGxpbmVzLgorICAgICAgICBeRSBvciAqICBTZWFyY2ggbXVsdGlwbGUgZmlsZXMgKHBhc3MgdGhydSBFTkQgT0YgRklMRSkuCisgICAgICAgIF5GIG9yIEAgIFN0YXJ0IHNlYXJjaCBhdCBGSVJTVCBmaWxlIChmb3IgLykgb3IgbGFzdCBmaWxlIChmb3IgPykuCisgICAgICAgIF5LICAgICAgIEhpZ2hsaWdodCBtYXRjaGVzLCBidXQgZG9uJ3QgbW92ZSAoS0VFUCBwb3NpdGlvbikuCisgICAgICAgIF5SICAgICAgIERvbid0IHVzZSBSRUdVTEFSIEVYUFJFU1NJT05TLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSlVNUElORworICBnICA8ICBFU0MtPCAgICAgICAqICBHbyB0byBmaXJzdCBsaW5lIGluIGZpbGUgKG9yIGxpbmUgTikuCisgIEcgID4gIEVTQy0+ICAgICAgICogIEdvIHRvIGxhc3QgbGluZSBpbiBmaWxlIChvciBsaW5lIE4pLgorICBwICAlICAgICAgICAgICAgICAqICBHbyB0byBiZWdpbm5pbmcgb2YgZmlsZSAob3IgTiBwZXJjZW50IGludG8gZmlsZSkuCisgIHQgICAgICAgICAgICAgICAgICogIEdvIHRvIHRoZSAoTi10aCkgbmV4dCB0YWcuCisgIFQgICAgICAgICAgICAgICAgICogIEdvIHRvIHRoZSAoTi10aCkgcHJldmlvdXMgdGFnLgorICB7ICAoICBbICAgICAgICAgICAqICBGaW5kIGNsb3NlIGJyYWNrZXQgfSApIF0uCisgIH0gICkgIF0gICAgICAgICAgICogIEZpbmQgb3BlbiBicmFja2V0IHsgKCBbLgorICBFU0MtXkYgPGMxPiA8YzI+ICAqICBGaW5kIGNsb3NlIGJyYWNrZXQgPGMyPi4KKyAgRVNDLV5CIDxjMT4gPGMyPiAgKiAgRmluZCBvcGVuIGJyYWNrZXQgPGMxPgorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRWFjaCAiZmluZCBjbG9zZSBicmFja2V0IiBjb21tYW5kIGdvZXMgZm9yd2FyZCB0byB0aGUgY2xvc2UgYnJhY2tldAorICAgICAgICAgIG1hdGNoaW5nIHRoZSAoTi10aCkgb3BlbiBicmFja2V0IGluIHRoZSB0b3AgbGluZS4KKyAgICAgICAgRWFjaCAiZmluZCBvcGVuIGJyYWNrZXQiIGNvbW1hbmQgZ29lcyBiYWNrd2FyZCB0byB0aGUgb3BlbiBicmFja2V0CisgICAgICAgICAgbWF0Y2hpbmcgdGhlIChOLXRoKSBjbG9zZSBicmFja2V0IGluIHRoZSBib3R0b20gbGluZS4KKyAgbTxsZXR0ZXI+ICAgICAgICAgICAgTWFyayB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoIDxsZXR0ZXI+LgorICAnPGxldHRlcj4gICAgICAgICAgICBHbyB0byBhIHByZXZpb3VzbHkgbWFya2VkIHBvc2l0aW9uLgorICAnJyAgICAgICAgICAgICAgICAgICBHbyB0byB0aGUgcHJldmlvdXMgcG9zaXRpb24uCisgIF5YXlggICAgICAgICAgICAgICAgIFNhbWUgYXMgJy4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEEgbWFyayBpcyBhbnkgdXBwZXItY2FzZSBvciBsb3dlci1jYXNlIGxldHRlci4KKyAgICAgICAgQ2VydGFpbiBtYXJrcyBhcmUgcHJlZGVmaW5lZDoKKyAgICAgICAgICAgICBeICBtZWFucyAgYmVnaW5uaW5nIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgJCAgbWVhbnMgIGVuZCBvZiB0aGUgZmlsZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdJTkcgRklMRVMKKyAgOmUgW2ZpbGVdICAgICAgICAgICAgRXhhbWluZSBhIG5ldyBmaWxlLgorICBeWF5WICAgICAgICAgICAgICAgICBTYW1lIGFzIDplLgorICA6biAgICAgICAgICAgICAgICAqICBFeGFtaW5lIHRoZSAoTi10aCkgbmV4dCBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgOnAgICAgICAgICAgICAgICAgKiAgRXhhbWluZSB0aGUgKE4tdGgpIHByZXZpb3VzIGZpbGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICA6eCAgICAgICAgICAgICAgICAqICBFeGFtaW5lIHRoZSBmaXJzdCAob3IgTi10aCkgZmlsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgIDpkICAgICAgICAgICAgICAgICAgIERlbGV0ZSB0aGUgY3VycmVudCBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSBsaXN0LgorICA9ICBeRyAgOmYgICAgICAgICAgICBQcmludCBjdXJyZW50IGZpbGUgbmFtZS4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgTUlTQ0VMTEFORU9VUyBDT01NQU5EUworICAtPGZsYWc+ICAgICAgICAgICAgICBUb2dnbGUgYSBjb21tYW5kIGxpbmUgb3B0aW9uIFtzZWUgT1BUSU9OUyBiZWxvd10uCisgIC0tPG5hbWU+ICAgICAgICAgICAgIFRvZ2dsZSBhIGNvbW1hbmQgbGluZSBvcHRpb24sIGJ5IG5hbWUuCisgIF88ZmxhZz4gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHNldHRpbmcgb2YgYSBjb21tYW5kIGxpbmUgb3B0aW9uLgorICBfXzxuYW1lPiAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZXR0aW5nIG9mIGFuIG9wdGlvbiwgYnkgbmFtZS4KKyAgK2NtZCAgICAgICAgICAgICAgICAgRXhlY3V0ZSB0aGUgbGVzcyBjbWQgZWFjaCB0aW1lIGEgbmV3IGZpbGUgaXMgZXhhbWluZWQuCisgICFjb21tYW5kICAgICAgICAgICAgIEV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgd2l0aCAkU0hFTEwuCisgIHxYY29tbWFuZCAgICAgICAgICAgIFBpcGUgZmlsZSBiZXR3ZWVuIGN1cnJlbnQgcG9zICYgbWFyayBYIHRvIHNoZWxsIGNvbW1hbmQuCisgIHYgICAgICAgICAgICAgICAgICAgIEVkaXQgdGhlIGN1cnJlbnQgZmlsZSB3aXRoICRWSVNVQUwgb3IgJEVESVRPUi4KKyAgViAgICAgICAgICAgICAgICAgICAgUHJpbnQgdmVyc2lvbiBudW1iZXIgb2YgImxlc3MiLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUworICAgICAgICBNb3N0IG9wdGlvbnMgbWF5IGJlIGNoYW5nZWQgZWl0aGVyIG9uIHRoZSBjb21tYW5kIGxpbmUsCisgICAgICAgIG9yIGZyb20gd2l0aGluIGxlc3MgYnkgdXNpbmcgdGhlIC0gb3IgLS0gY29tbWFuZC4KKyAgICAgICAgT3B0aW9ucyBtYXkgYmUgZ2l2ZW4gaW4gb25lIG9mIHR3byBmb3JtczogZWl0aGVyIGEgc2luZ2xlCisgICAgICAgIGNoYXJhY3RlciBwcmVjZWRlZCBieSBhIC0sIG9yIGEgbmFtZSBwcmVjZWVkZWQgYnkgLS0uCisgIC0/ICAuLi4uLi4uLiAgLS1oZWxwCisgICAgICAgICAgICAgICAgICBEaXNwbGF5IGhlbHAgKGZyb20gY29tbWFuZCBsaW5lKS4KKyAgLWEgIC4uLi4uLi4uICAtLXNlYXJjaC1za2lwLXNjcmVlbgorICAgICAgICAgICAgICAgICAgRm9yd2FyZCBzZWFyY2ggc2tpcHMgY3VycmVudCBzY3JlZW4uCisgIC1iIFtOXSAgLi4uLiAgLS1idWZmZXJzPVtOXQorICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGJ1ZmZlcnMuCisgIC1CICAuLi4uLi4uLiAgLS1hdXRvLWJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgIERvbid0IGF1dG9tYXRpY2FsbHkgYWxsb2NhdGUgYnVmZmVycyBmb3IgcGlwZXMuCisgIC1jICAuLi4uLi4uLiAgLS1jbGVhci1zY3JlZW4KKyAgICAgICAgICAgICAgICAgIFJlcGFpbnQgYnkgY2xlYXJpbmcgcmF0aGVyIHRoYW4gc2Nyb2xsaW5nLgorICAtZCAgLi4uLi4uLi4gIC0tZHVtYgorICAgICAgICAgICAgICAgICAgRHVtYiB0ZXJtaW5hbC4KKyAgLUQgW3huLm5dICAuICAtLWNvbG9yPXhuLm4KKyAgICAgICAgICAgICAgICAgIFNldCBzY3JlZW4gY29sb3JzLiAoTVMtRE9TIG9ubHkpCisgIC1lICAtRSAgLi4uLiAgLS1xdWl0LWF0LWVvZiAgLS1RVUlULUFULUVPRgorICAgICAgICAgICAgICAgICAgUXVpdCBhdCBlbmQgb2YgZmlsZS4KKyAgLWYgIC4uLi4uLi4uICAtLWZvcmNlCisgICAgICAgICAgICAgICAgICBGb3JjZSBvcGVuIG5vbi1yZWd1bGFyIGZpbGVzLgorICAtRiAgLi4uLi4uLi4gIC0tcXVpdC1pZi1vbmUtc2NyZWVuCisgICAgICAgICAgICAgICAgICBRdWl0IGlmIGVudGlyZSBmaWxlIGZpdHMgb24gZmlyc3Qgc2NyZWVuLgorICAtZyAgLi4uLi4uLi4gIC0taGlsaXRlLXNlYXJjaAorICAgICAgICAgICAgICAgICAgSGlnaGxpZ2h0IG9ubHkgbGFzdCBtYXRjaCBmb3Igc2VhcmNoZXMuCisgIC1HICAuLi4uLi4uLiAgLS1ISUxJVEUtU0VBUkNICisgICAgICAgICAgICAgICAgICBEb24ndCBoaWdobGlnaHQgYW55IG1hdGNoZXMgZm9yIHNlYXJjaGVzLgorICAtaCBbTl0gIC4uLi4gIC0tbWF4LWJhY2stc2Nyb2xsPVtOXQorICAgICAgICAgICAgICAgICAgQmFja3dhcmQgc2Nyb2xsIGxpbWl0LgorICAtaSAgLi4uLi4uLi4gIC0taWdub3JlLWNhc2UKKyAgICAgICAgICAgICAgICAgIElnbm9yZSBjYXNlIGluIHNlYXJjaGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdXBwZXJjYXNlLgorICAtSSAgLi4uLi4uLi4gIC0tSUdOT1JFLUNBU0UKKyAgICAgICAgICAgICAgICAgIElnbm9yZSBjYXNlIGluIGFsbCBzZWFyY2hlcy4KKyAgLWogW05dICAuLi4uICAtLWp1bXAtdGFyZ2V0PVtOXQorICAgICAgICAgICAgICAgICAgU2NyZWVuIHBvc2l0aW9uIG9mIHRhcmdldCBsaW5lcy4KKyAgLUogIC4uLi4uLi4uICAtLXN0YXR1cy1jb2x1bW4KKyAgICAgICAgICAgICAgICAgIERpc3BsYXkgYSBzdGF0dXMgY29sdW1uIGF0IGxlZnQgZWRnZSBvZiBzY3JlZW4uCisgIC1rIFtmaWxlXSAgLiAgLS1sZXNza2V5LWZpbGU9W2ZpbGVdCisgICAgICAgICAgICAgICAgICBVc2UgYSBsZXNza2V5IGZpbGUuCisgIC1MICAuLi4uLi4uLiAgLS1uby1sZXNzb3BlbgorICAgICAgICAgICAgICAgICAgSWdub3JlIHRoZSBMRVNTT1BFTiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgLW0gIC1NICAuLi4uICAtLWxvbmctcHJvbXB0ICAtLUxPTkctUFJPTVBUCisgICAgICAgICAgICAgICAgICBTZXQgcHJvbXB0IHN0eWxlLgorICAtbiAgLU4gIC4uLi4gIC0tbGluZS1udW1iZXJzICAtLUxJTkUtTlVNQkVSUworICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIGxpbmUgbnVtYmVycy4KKyAgLW8gW2ZpbGVdICAuICAtLWxvZy1maWxlPVtmaWxlXQorICAgICAgICAgICAgICAgICAgQ29weSB0byBsb2cgZmlsZSAoc3RhbmRhcmQgaW5wdXQgb25seSkuCisgIC1PIFtmaWxlXSAgLiAgLS1MT0ctRklMRT1bZmlsZV0KKyAgICAgICAgICAgICAgICAgIENvcHkgdG8gbG9nIGZpbGUgKHVuY29uZGl0aW9uYWxseSBvdmVyd3JpdGUpLgorICAtcCBbcGF0dGVybl0gIC0tcGF0dGVybj1bcGF0dGVybl0KKyAgICAgICAgICAgICAgICAgIFN0YXJ0IGF0IHBhdHRlcm4gKGZyb20gY29tbWFuZCBsaW5lKS4KKyAgLVAgW3Byb21wdF0gICAtLXByb21wdD1bcHJvbXB0XQorICAgICAgICAgICAgICAgICAgRGVmaW5lIG5ldyBwcm9tcHQuCisgIC1xICAtUSAgLi4uLiAgLS1xdWlldCAgLS1RVUlFVCAgLS1zaWxlbnQgLS1TSUxFTlQKKyAgICAgICAgICAgICAgICAgIFF1aWV0IHRoZSB0ZXJtaW5hbCBiZWxsLgorICAtciAgLVIgIC4uLi4gIC0tcmF3LWNvbnRyb2wtY2hhcnMgIC0tUkFXLUNPTlRST0wtQ0hBUlMKKyAgICAgICAgICAgICAgICAgIE91dHB1dCAicmF3IiBjb250cm9sIGNoYXJhY3RlcnMuCisgIC1zICAuLi4uLi4uLiAgLS1zcXVlZXplLWJsYW5rLWxpbmVzCisgICAgICAgICAgICAgICAgICBTcXVlZXplIG11bHRpcGxlIGJsYW5rIGxpbmVzLgorICAtUyAgLi4uLi4uLi4gIC0tY2hvcC1sb25nLWxpbmVzCisgICAgICAgICAgICAgICAgICBDaG9wIGxvbmcgbGluZXMuCisgIC10IFt0YWddICAuLiAgLS10YWc9W3RhZ10KKyAgICAgICAgICAgICAgICAgIEZpbmQgYSB0YWcuCisgIC1UIFt0YWdzZmlsZV0gLS10YWctZmlsZT1bdGFnc2ZpbGVdCisgICAgICAgICAgICAgICAgICBVc2UgYW4gYWx0ZXJuYXRlIHRhZ3MgZmlsZS4KKyAgLXUgIC1VICAuLi4uICAtLXVuZGVybGluZS1zcGVjaWFsICAtLVVOREVSTElORS1TUEVDSUFMCisgICAgICAgICAgICAgICAgICBDaGFuZ2UgaGFuZGxpbmcgb2YgYmFja3NwYWNlcy4KKyAgLVYgIC4uLi4uLi4uICAtLXZlcnNpb24KKyAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mICJsZXNzIi4KKyAgLXcgIC4uLi4uLi4uICAtLWhpbGl0ZS11bnJlYWQKKyAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBmaXJzdCBuZXcgbGluZSBhZnRlciBmb3J3YXJkLXNjcmVlbi4KKyAgLVcgIC4uLi4uLi4uICAtLUhJTElURS1VTlJFQUQKKyAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBmaXJzdCBuZXcgbGluZSBhZnRlciBhbnkgZm9yd2FyZCBtb3ZlbWVudC4KKyAgLXggW05bLC4uLl1dICAtLXRhYnM9W05bLC4uLl1dCisgICAgICAgICAgICAgICAgICBTZXQgdGFiIHN0b3BzLgorICAtWCAgLi4uLi4uLi4gIC0tbm8taW5pdAorICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIHRlcm1jYXAgaW5pdC9kZWluaXQgc3RyaW5ncy4KKyAgICAgICAgICAgICAgICAtLW5vLWtleXBhZAorICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIHRlcm1jYXAga2V5cGFkIGluaXQvZGVpbml0IHN0cmluZ3MuCisgIC15IFtOXSAgLi4uLiAgLS1tYXgtZm9ydy1zY3JvbGw9W05dCisgICAgICAgICAgICAgICAgICBGb3J3YXJkIHNjcm9sbCBsaW1pdC4KKyAgLXogW05dICAuLi4uICAtLXdpbmRvdz1bTl0KKyAgICAgICAgICAgICAgICAgIFNldCBzaXplIG9mIHdpbmRvdy4KKyAgLSIgW2NbY11dICAuICAtLXF1b3Rlcz1bY1tjXV0KKyAgICAgICAgICAgICAgICAgIFNldCBzaGVsbCBxdW90ZSBjaGFyYWN0ZXJzLgorICAtfiAgLi4uLi4uLi4gIC0tdGlsZGUKKyAgICAgICAgICAgICAgICAgIERvbid0IGRpc3BsYXkgdGlsZGVzIGFmdGVyIGVuZCBvZiBmaWxlLgorICAtIyBbTl0gIC4uLi4gIC0tc2hpZnQ9W05dCisgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsIHNjcm9sbCBhbW91bnQgKDAgPSBvbmUgaGFsZiBzY3JlZW4gd2lkdGgpCisKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTElORSBFRElUSU5HCisgICAgICAgIFRoZXNlIGtleXMgY2FuIGJlIHVzZWQgdG8gZWRpdCB0ZXh0IGJlaW5nIGVudGVyZWQKKyAgICAgICAgb24gdGhlICJjb21tYW5kIGxpbmUiIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4KKyBSaWdodEFycm93ICAgICAgICAgICAgICAgICAgICAgICBFU0MtbCAgICAgTW92ZSBjdXJzb3IgcmlnaHQgb25lIGNoYXJhY3Rlci4KKyBMZWZ0QXJyb3cgICAgICAgICAgICAgICAgICAgICAgICBFU0MtaCAgICAgTW92ZSBjdXJzb3IgbGVmdCBvbmUgY2hhcmFjdGVyLgorIENOVEwtUmlnaHRBcnJvdyAgRVNDLVJpZ2h0QXJyb3cgIEVTQy13ICAgICBNb3ZlIGN1cnNvciByaWdodCBvbmUgd29yZC4KKyBDTlRMLUxlZnRBcnJvdyAgIEVTQy1MZWZ0QXJyb3cgICBFU0MtYiAgICAgTW92ZSBjdXJzb3IgbGVmdCBvbmUgd29yZC4KKyBIT01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtMCAgICAgTW92ZSBjdXJzb3IgdG8gc3RhcnQgb2YgbGluZS4KKyBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtJCAgICAgTW92ZSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUuCisgQkFDS1NQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSBjaGFyIHRvIGxlZnQgb2YgY3Vyc29yLgorIERFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQy14ICAgICBEZWxldGUgY2hhciB1bmRlciBjdXJzb3IuCisgQ05UTC1CQUNLU1BBQ0UgICBFU0MtQkFDS1NQQUNFICAgICAgICAgICAgIERlbGV0ZSB3b3JkIHRvIGxlZnQgb2YgY3Vyc29yLgorIENOVEwtREVMRVRFICAgICAgRVNDLURFTEVURSAgICAgIEVTQy1YICAgICBEZWxldGUgd29yZCB1bmRlciBjdXJzb3IuCisgQ05UTC1VICAgICAgICAgICBFU0MgKE1TLURPUyBvbmx5KSAgICAgICAgIERlbGV0ZSBlbnRpcmUgbGluZS4KKyBVcEFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtayAgICAgUmV0cmlldmUgcHJldmlvdXMgY29tbWFuZCBsaW5lLgorIERvd25BcnJvdyAgICAgICAgICAgICAgICAgICAgICAgIEVTQy1qICAgICBSZXRyaWV2ZSBuZXh0IGNvbW1hbmQgbGluZS4KKyBUQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGUgZmlsZW5hbWUgJiBjeWNsZS4KKyBTSElGVC1UQUIgICAgICAgICAgICAgICAgICAgICAgICBFU0MtVEFCICAgQ29tcGxldGUgZmlsZW5hbWUgJiByZXZlcnNlIGN5Y2xlLgorIENOVEwtTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZSBmaWxlbmFtZSwgbGlzdCBhbGwuCisqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL21ha2VkZXZzLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbWFrZWRldnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ1YTEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL21ha2VkZXZzLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHB1YmxpYyBkb21haW4gLS0gRGF2ZSAnS2lsbCBhIENvcCcgQ2luZWdlIDxkY2luZWdlQHBzeWNob3Npcy5jb20+CisgKgorICogbWFrZWRldnMKKyAqIE1ha2UgcmFuZ2VzIG9mIGRldmljZSBmaWxlcyBxdWlja2x5LgorICoga25vd24gYnVnczogY2FuJ3QgZGVhbCB3aXRoIGFscGhhIHJhbmdlcworICovCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX01BS0VERVZTX0xFQUYKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTkFNRSBUWVBFIE1BSk9SIE1JTk9SIEZJUlNUIExBU1QgW3NdIgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIGEgcmFuZ2Ugb2YgYmxvY2sgb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcblRZUEUgaXM6IgorLy91c2FnZTogICAgICJcbgliCUJsb2NrIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JYwlDaGFyYWN0ZXIgZGV2aWNlIgorLy91c2FnZTogICAgICJcbglmCUZJRk8sIE1BSk9SIGFuZCBNSU5PUiBhcmUgaWdub3JlZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuRklSU1QuLkxBU1Qgc3BlY2lmeSBudW1iZXJzIGFwcGVuZGVkIHRvIE5BTUUuIgorLy91c2FnZTogICAgICJcbklmICdzJyBpcyB0aGUgbGFzdCBhcmd1bWVudCwgdGhlIGJhc2UgZGV2aWNlIGlzIGNyZWF0ZWQgYXMgd2VsbC4iCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbkV4YW1wbGVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JbWFrZWRldnMgL2Rldi90dHlTIGMgNCA2NiAyIDYzICAgLT4gIHR0eVMyLXR0eVM2MyIKKy8vdXNhZ2U6ICAgICAiXG4JbWFrZWRldnMgL2Rldi9oZGEgYiAzIDAgMCA4IHMgICAgLT4gIGhkYSxoZGExLWhkYTgiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIjIG1ha2VkZXZzIC9kZXYvdHR5UyBjIDQgNjYgMiA2M1xuIgorLy91c2FnZTogICAgICAgIltjcmVhdGVzIHR0eVMyLXR0eVM2M11cbiIKKy8vdXNhZ2U6ICAgICAgICIjIG1ha2VkZXZzIC9kZXYvaGRhIGIgMyAwIDAgOCBzXG4iCisvL3VzYWdlOiAgICAgICAiW2NyZWF0ZXMgaGRhLGhkYTEtaGRhOF1cbiIKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOgorLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEUKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIGRldmljZV90YWJsZV0gcm9vdGRpciIKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBhIHJhbmdlIG9mIHNwZWNpYWwgZmlsZXMgYXMgc3BlY2lmaWVkIGluIGEgZGV2aWNlIHRhYmxlLlxuIgorLy91c2FnZTogICAgICAgIkRldmljZSB0YWJsZSBlbnRyaWVzIHRha2UgdGhlIGZvcm0gb2Y6XG4iCisvL3VzYWdlOiAgICAgICAiPG5hbWU+IDx0eXBlPiA8bW9kZT4gPHVpZD4gPGdpZD4gPG1ham9yPiA8bWlub3I+IDxzdGFydD4gPGluYz4gPGNvdW50PlxuIgorLy91c2FnZTogICAgICAgIldoZXJlIG5hbWUgaXMgdGhlIGZpbGUgbmFtZSwgdHlwZSBjYW4gYmUgb25lIG9mOlxuIgorLy91c2FnZTogICAgICAgIglmCVJlZ3VsYXIgZmlsZVxuIgorLy91c2FnZTogICAgICAgIglkCURpcmVjdG9yeVxuIgorLy91c2FnZTogICAgICAgIgljCUNoYXJhY3RlciBkZXZpY2VcbiIKKy8vdXNhZ2U6ICAgICAgICIJYglCbG9jayBkZXZpY2VcbiIKKy8vdXNhZ2U6ICAgICAgICIJcAlGaWZvIChuYW1lZCBwaXBlKVxuIgorLy91c2FnZTogICAgICAgInVpZCBpcyB0aGUgdXNlciBpZCBmb3IgdGhlIHRhcmdldCBmaWxlLCBnaWQgaXMgdGhlIGdyb3VwIGlkIGZvciB0aGVcbiIKKy8vdXNhZ2U6ICAgICAgICJ0YXJnZXQgZmlsZS4gVGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMgKG1ham9yLCBtaW5vciwgZXRjKSBhcHBseSB0b1xuIgorLy91c2FnZTogICAgICAgInRvIGRldmljZSBzcGVjaWFsIGZpbGVzLiBBICctJyBtYXkgYmUgdXNlZCBmb3IgYmxhbmsgZW50cmllcy4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGb3IgZXhhbXBsZTpcbiIKKy8vdXNhZ2U6ICAgICAgICI8bmFtZT4gICAgPHR5cGU+IDxtb2RlPjx1aWQ+PGdpZD48bWFqb3I+PG1pbm9yPjxzdGFydD48aW5jPjxjb3VudD5cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2ICAgICAgICAgZCAgIDc1NSAgICAwICAgIDAgICAgLSAgICAgIC0gICAgICAtICAgICAgLSAgICAtXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9jb25zb2xlIGMgICA2NjYgICAgMCAgICAwICAgIDUgICAgICAxICAgICAgLSAgICAgIC0gICAgLVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvbnVsbCAgICBjICAgNjY2ICAgIDAgICAgMCAgICAxICAgICAgMyAgICAgIDAgICAgICAwICAgIC1cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L3plcm8gICAgYyAgIDY2NiAgICAwICAgIDAgICAgMSAgICAgIDUgICAgICAwICAgICAgMCAgICAtXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9oZGEgICAgIGIgICA2NDAgICAgMCAgICAwICAgIDMgICAgICAwICAgICAgMCAgICAgIDAgICAgLVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvaGRhICAgICBiICAgNjQwICAgIDAgICAgMCAgICAzICAgICAgMSAgICAgIDEgICAgICAxICAgIDE1XG5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaWxsIFByb2R1Y2U6XG4iCisvL3VzYWdlOiAgICAgICAiL2RldlxuIgorLy91c2FnZTogICAgICAgIi9kZXYvY29uc29sZVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvbnVsbFxuIgorLy91c2FnZTogICAgICAgIi9kZXYvemVyb1xuIgorLy91c2FnZTogICAgICAgIi9kZXYvaGRhXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9oZGFbMC0xNV1cbiIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUFLRURFVlNfTEVBRgorLyoKK21ha2VkZXZzIE5BTUUgVFlQRSBNQUpPUiBNSU5PUiBGSVJTVCBMQVNUIFtzXQorVFlQRXM6CitiICAgICAgIEJsb2NrIGRldmljZQorYyAgICAgICBDaGFyYWN0ZXIgZGV2aWNlCitmICAgICAgIEZJRk8KKworRklSU1QuLkxBU1Qgc3BlY2lmeSBudW1iZXJzIGFwcGVuZGVkIHRvIE5BTUUuCitJZiAncycgaXMgdGhlIGxhc3QgYXJndW1lbnQsIHRoZSBiYXNlIGRldmljZSBpcyBjcmVhdGVkIGFzIHdlbGwuCitFeGFtcGxlczoKKyAgICAgICAgbWFrZWRldnMgL2Rldi90dHlTIGMgNCA2NiAyIDYzICAgLT4gIHR0eVMyLXR0eVM2MworICAgICAgICBtYWtlZGV2cyAvZGV2L2hkYSBiIDMgMCAwIDggcyAgICAtPiAgaGRhLGhkYTEtaGRhOAorKi8KK2ludCBtYWtlZGV2c19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWFrZWRldnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJbW9kZV90IG1vZGU7CisJY2hhciAqYmFzZWRldiwgKnR5cGUsICpub2RuYW1lLCAqYnVmOworCWludCBTbWFqb3IsIFNtaW5vciwgUywgRTsKKworCWlmIChhcmdjIDwgNyB8fCBhcmd2WzFdWzBdID09ICctJykKKwkJYmJfc2hvd191c2FnZSgpOworCisJYmFzZWRldiA9IGFyZ3ZbMV07CisJYnVmID0geGFzcHJpbnRmKCIlcyV1IiwgYXJndlsxXSwgKHVuc2lnbmVkKS0xKTsKKwl0eXBlID0gYXJndlsyXTsKKwlTbWFqb3IgPSB4YXRvaV9wb3NpdGl2ZShhcmd2WzNdKTsKKwlTbWlub3IgPSB4YXRvaV9wb3NpdGl2ZShhcmd2WzRdKTsKKwlTID0geGF0b2lfcG9zaXRpdmUoYXJndls1XSk7CisJRSA9IHhhdG9pX3Bvc2l0aXZlKGFyZ3ZbNl0pOworCW5vZG5hbWUgPSBhcmd2WzddID8gYmFzZWRldiA6IGJ1ZjsKKworCW1vZGUgPSAwNjYwOworCXN3aXRjaCAodHlwZVswXSkgeworCWNhc2UgJ2MnOgorCQltb2RlIHw9IFNfSUZDSFI7CisJCWJyZWFrOworCWNhc2UgJ2InOgorCQltb2RlIHw9IFNfSUZCTEs7CisJCWJyZWFrOworCWNhc2UgJ2YnOgorCQltb2RlIHw9IFNfSUZJRk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwl3aGlsZSAoUyA8PSBFKSB7CisJCXNwcmludGYoYnVmLCAiJXMldSIsIGJhc2VkZXYsIFMpOworCisJCS8qIGlmIG1vZGUgIT0gU19JRkNIUiBhbmQgIT0gU19JRkJMSywKKwkJICogdGhpcmQgcGFyYW0gaW4gbWtub2QoKSBpZ25vcmVkICovCisJCWlmIChta25vZChub2RuYW1lLCBtb2RlLCBtYWtlZGV2KFNtYWpvciwgU21pbm9yKSkpCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIG5vZG5hbWUpOworCisJCS8qaWYgKG5vZG5hbWUgPT0gYmFzZWRldikqLyAvKiBleC4gL2Rldi9oZGEgLSB0byAvZGV2L2hkYTEgLi4uICovCisJCQlub2RuYW1lID0gYnVmOworCQlTKys7CisJCVNtaW5vcisrOworCX0KKworCXJldHVybiAwOworfQorCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9NQUtFREVWU19UQUJMRQorCisvKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLiAqLworCitpbnQgbWFrZWRldnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1ha2VkZXZzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlwYXJzZXJfdCAqcGFyc2VyOworCWNoYXIgKmxpbmUgPSAoY2hhciAqKSItIjsKKwlpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOyAvKiBleGFjdGx5IG9uZSBwYXJhbSAqLworCWdldG9wdDMyKGFyZ3YsICJkOiIsICZsaW5lKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXhjaGRpcigqYXJndik7IC8qIGVuc3VyZSByb290IGRpciBleGlzdHMgKi8KKworCXVtYXNrKDApOworCisJcHJpbnRmKCJyb290ZGlyPSVzXG50YWJsZT0iLCAqYXJndik7CisJaWYgKE5PVF9MT05FX0RBU0gobGluZSkpIHsKKwkJcHJpbnRmKCInJXMnXG4iLCBsaW5lKTsKKwl9IGVsc2UgeworCQlwdXRzKCI8c3RkaW4+Iik7CisJfQorCisJcGFyc2VyID0gY29uZmlnX29wZW4obGluZSk7CisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgJmxpbmUsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpbnQgbGluZW51bTsKKwkJY2hhciB0eXBlOworCQl1bnNpZ25lZCBtb2RlID0gMDc1NTsKKwkJdW5zaWduZWQgbWFqb3IgPSAwOworCQl1bnNpZ25lZCBtaW5vciA9IDA7CisJCXVuc2lnbmVkIGNvdW50ID0gMDsKKwkJdW5zaWduZWQgaW5jcmVtZW50ID0gMDsKKwkJdW5zaWduZWQgc3RhcnQgPSAwOworCQljaGFyIG5hbWVbNDFdOworCQljaGFyIHVzZXJbNDFdOworCQljaGFyIGdyb3VwWzQxXTsKKwkJY2hhciAqZnVsbF9uYW1lID0gbmFtZTsKKwkJdWlkX3QgdWlkOworCQlnaWRfdCBnaWQ7CisKKwkJbGluZW51bSA9IHBhcnNlci0+bGluZW5vOworCisJCWlmICgoMiA+IHNzY2FuZihsaW5lLCAiJTQwcyAlYyAlbyAlNDBzICU0MHMgJXUgJXUgJXUgJXUgJXUiLAorCQkJCQluYW1lLCAmdHlwZSwgJm1vZGUsIHVzZXIsIGdyb3VwLAorCQkJCQkmbWFqb3IsICZtaW5vciwgJnN0YXJ0LCAmaW5jcmVtZW50LCAmY291bnQpKQorCQkgfHwgKCh1bnNpZ25lZCkobWFqb3IgfCBtaW5vciB8IHN0YXJ0IHwgY291bnQgfCBpbmNyZW1lbnQpID4gMjU1KQorCQkpIHsKKwkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBsaW5lICVkOiAnJXMnIiwgbGluZW51bSwgbGluZSk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWdpZCA9ICgqZ3JvdXApID8gZ2V0X3VnX2lkKGdyb3VwLCB4Z3JvdXAyZ2lkKSA6IGdldGdpZCgpOworCQl1aWQgPSAoKnVzZXIpID8gZ2V0X3VnX2lkKHVzZXIsIHh1bmFtZTJ1aWQpIDogZ2V0dWlkKCk7CisJCS8qIFdlIGFyZSBhbHJlYWR5IGluIHRoZSByaWdodCByb290IGRpciwKKwkJICogc28gbWFrZSBhYnNvbHV0ZSBwYXRocyByZWxhdGl2ZSAqLworCQlpZiAoJy8nID09ICpmdWxsX25hbWUpCisJCQlmdWxsX25hbWUrKzsKKworCQlpZiAodHlwZSA9PSAnZCcpIHsKKwkJCWJiX21ha2VfZGlyZWN0b3J5KGZ1bGxfbmFtZSwgbW9kZSB8IFNfSUZESVIsIEZJTEVVVElMU19SRUNVUik7CisJCQlpZiAoY2hvd24oZnVsbF9uYW1lLCB1aWQsIGdpZCkgPT0gLTEpIHsKKyBjaG93bl9mYWlsOgorCQkJCWJiX3BlcnJvcl9tc2coImxpbmUgJWQ6IGNhbid0IGNob3duICVzIiwgbGluZW51bSwgZnVsbF9uYW1lKTsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY2htb2QoZnVsbF9uYW1lLCBtb2RlKSA8IDApIHsKKyBjaG1vZF9mYWlsOgorCQkJCWJiX3BlcnJvcl9tc2coImxpbmUgJWQ6IGNhbid0IGNobW9kICVzIiwgbGluZW51bSwgZnVsbF9uYW1lKTsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSBpZiAodHlwZSA9PSAnZicpIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaWYgKChzdGF0KGZ1bGxfbmFtZSwgJnN0KSA8IDAgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpKSB7CisJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogcmVndWxhciBmaWxlICclcycgZG9lcyBub3QgZXhpc3QiLCBsaW5lbnVtLCBmdWxsX25hbWUpOworCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjaG93bihmdWxsX25hbWUsIHVpZCwgZ2lkKSA8IDApCisJCQkJZ290byBjaG93bl9mYWlsOworCQkJaWYgKGNobW9kKGZ1bGxfbmFtZSwgbW9kZSkgPCAwKQorCQkJCWdvdG8gY2htb2RfZmFpbDsKKwkJfSBlbHNlIHsKKwkJCWRldl90IHJkZXY7CisJCQl1bnNpZ25lZCBpOworCQkJY2hhciAqZnVsbF9uYW1lX2luYzsKKworCQkJaWYgKHR5cGUgPT0gJ3AnKSB7CisJCQkJbW9kZSB8PSBTX0lGSUZPOworCQkJfSBlbHNlIGlmICh0eXBlID09ICdjJykgeworCQkJCW1vZGUgfD0gU19JRkNIUjsKKwkJCX0gZWxzZSBpZiAodHlwZSA9PSAnYicpIHsKKwkJCQltb2RlIHw9IFNfSUZCTEs7CisJCQl9IGVsc2UgeworCQkJCWJiX2Vycm9yX21zZygibGluZSAlZDogdW5zdXBwb3J0ZWQgZmlsZSB0eXBlICVjIiwgbGluZW51bSwgdHlwZSk7CisJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlmdWxsX25hbWVfaW5jID0geG1hbGxvYyhzdHJsZW4oZnVsbF9uYW1lKSArIHNpemVvZihpbnQpKjMgKyAyKTsKKwkJCWlmIChjb3VudCkKKwkJCQljb3VudC0tOworCQkJZm9yIChpID0gc3RhcnQ7IGkgPD0gc3RhcnQgKyBjb3VudDsgaSsrKSB7CisJCQkJc3ByaW50ZihmdWxsX25hbWVfaW5jLCBjb3VudCA/ICIlcyV1IiA6ICIlcyIsIGZ1bGxfbmFtZSwgaSk7CisJCQkJcmRldiA9IG1ha2VkZXYobWFqb3IsIG1pbm9yICsgKGkgLSBzdGFydCkgKiBpbmNyZW1lbnQpOworCQkJCWlmIChta25vZChmdWxsX25hbWVfaW5jLCBtb2RlLCByZGV2KSA8IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogY2FuJ3QgY3JlYXRlIG5vZGUgJXMiLCBsaW5lbnVtLCBmdWxsX25hbWVfaW5jKTsKKwkJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCX0gZWxzZSBpZiAoY2hvd24oZnVsbF9uYW1lX2luYywgdWlkLCBnaWQpIDwgMCkgeworCQkJCQliYl9wZXJyb3JfbXNnKCJsaW5lICVkOiBjYW4ndCBjaG93biAlcyIsIGxpbmVudW0sIGZ1bGxfbmFtZV9pbmMpOworCQkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJfSBlbHNlIGlmIChjaG1vZChmdWxsX25hbWVfaW5jLCBtb2RlKSA8IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogY2FuJ3QgY2htb2QgJXMiLCBsaW5lbnVtLCBmdWxsX25hbWVfaW5jKTsKKwkJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCX0KKwkJCWZyZWUoZnVsbF9uYW1lX2luYyk7CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNlbHNlCisjIGVycm9yIG1ha2VkZXZzIGNvbmZpZ3VyYXRpb24gZXJyb3IsIGVpdGhlciBsZWFmIG9yIHRhYmxlIG11c3QgYmUgc2VsZWN0ZWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL21hbi5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL21hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjdlODQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbWFuLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIG1pbmkgbWFuIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1hbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hd10gW01BTlBBR0VdLi4uIgorLy91c2FnZTojZGVmaW5lIG1hbl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZvcm1hdCBhbmQgZGlzcGxheSBtYW51YWwgcGFnZVxuIgorLy91c2FnZTogICAgICJcbgktYQlEaXNwbGF5IGFsbCBwYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJU2hvdyBwYWdlIGxvY2F0aW9ucyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCU9QVF9hID0gMSwgLyogYWxsICovCisJT1BUX3cgPSAyLCAvKiBwcmludCBwYXRoICovCit9OworCisvKiBUaGlzIGlzIHdoYXQgSSBzZWUgb24gbXkgZGVza3RvcCBzeXN0ZW0gYmVpbmcgZXhlY3V0ZWQ6CisKKygKK2VjaG8gIi5sbCAxMi40aSIKK2VjaG8gIi5uciBMTCAxMi40aSIKK2VjaG8gIi5wbCAxMTAwaSIKK2d1bnppcCAtYyAnL3Vzci9tYW4vbWFuMS9iemlwMi4xLmd6JworZWNobyAiLlxcXCIiCitlY2hvICIucGwgXG4obmx1KzEwIgorKSB8IGd0YmwgfCBucm9mZiAtVGxhdGluMSAtbWFuZG9jIHwgbGVzcworCisqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQQorI2RlZmluZSBaX1NVRkZJWCAiLmx6bWEiCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKyNkZWZpbmUgWl9TVUZGSVggIi5iejIiCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorI2RlZmluZSBaX1NVRkZJWCAiLmd6IgorI2Vsc2UKKyNkZWZpbmUgWl9TVUZGSVggIiIKKyNlbmRpZgorCitzdGF0aWMgaW50IHNob3dfbWFucGFnZShjb25zdCBjaGFyICpwYWdlciwgY2hhciAqbWFuX2ZpbGVuYW1lLCBpbnQgbWFuLCBpbnQgbGV2ZWwpOworCitzdGF0aWMgaW50IHJ1bl9waXBlKGNvbnN0IGNoYXIgKnBhZ2VyLCBjaGFyICptYW5fZmlsZW5hbWUsIGludCBtYW4sIGludCBsZXZlbCkKK3sKKwljaGFyICpjbWQ7CisKKwkvKiBQcmV2ZW50IG1hbiBwYWdlIGxpbmsgbG9vcHMgKi8KKwlpZiAobGV2ZWwgPiAxMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWNjZXNzKG1hbl9maWxlbmFtZSwgUl9PSykgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF93KSB7CisJCXB1dHMobWFuX2ZpbGVuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1hbikgeyAvKiBtYW4gcGFnZSwgbm90IGNhdCBwYWdlICovCisJCS8qIElzIHRoaXMgYSBsaW5rIHRvIGFub3RoZXIgbWFucGFnZT8gKi8KKwkJLyogVGhlIGxpbmsgaGFzIHRoZSBmb2xsb3dpbmcgb24gdGhlIGZpcnN0IGxpbmU6ICovCisJCS8qICIuc28gYW5vdGhlcl9tYW5fcGFnZSIgKi8KKworCQlzdHJ1Y3Qgc3RhdCBzYjsKKwkJY2hhciAqbGluZTsKKwkJY2hhciAqbGlua25hbWUsICpwOworCisJCS8qIE9uIG15IHN5c3RlbToKKwkJICogbWFuMS9nZW5ob3N0aWQuMS5nejogMjAzIGJ5dGVzIC0gc21hbGxlc3QgcmVhbCBtYW5wYWdlCisJCSAqIG1hbjIvcGF0aF9yZXNvbHV0aW9uLjIuZ3o6IDExNCBieXRlcyAtIGxhcmdlc3QgbGluaworCQkgKi8KKwkJeHN0YXQobWFuX2ZpbGVuYW1lLCAmc2IpOworCQlpZiAoc2Iuc3Rfc2l6ZSA+IDMwMCkgLyogZXJyIG9uIHRoZSBzYWZlIHNpZGUgKi8KKwkJCWdvdG8gb3JkaW5hcnlfbWFucGFnZTsKKworCQlsaW5lID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKG1hbl9maWxlbmFtZSwgTlVMTCk7CisJCWlmICghbGluZSB8fCBzdHJuY21wKGxpbmUsICIuc28gIiwgNCkgIT0gMCkgeworCQkJZnJlZShsaW5lKTsKKwkJCWdvdG8gb3JkaW5hcnlfbWFucGFnZTsKKwkJfQorCQkvKiBFeGFtcGxlOiBtYW4yL3BhdGhfcmVzb2x1dGlvbi4yLmd6IGNvbnRhaW5zCisJCSAqICIuc28gbWFuNy9wYXRoX3Jlc29sdXRpb24uN1xuPGp1bms+IgorCQkgKi8KKwkJKnN0cmNocm51bChsaW5lLCAnXG4nKSA9ICdcMCc7CisJCWxpbmtuYW1lID0gc2tpcF93aGl0ZXNwYWNlKCZsaW5lWzRdKTsKKworCQkvKiBJZiBsaW5rIGhhcyBubyBzbGFzaGVzLCB3ZSBqdXN0IHJlcGxhY2UgbWFuIHBhZ2UgbmFtZS4KKwkJICogSWYgbGluayBoYXMgc2xhc2hlcyAoaG93ZXZlciBtYW55KSwgd2UgZ28gYmFjayAqb25jZSouCisJCSAqICIuc28genp6L2dnZy9wYWdlLjMiIGRvZXMgTk9UIGdvIGJhY2sgdHdvIGxldmVscy4gKi8KKwkJcCA9IHN0cnJjaHIobWFuX2ZpbGVuYW1lLCAnLycpOworCQlpZiAoIXApCisJCQlnb3RvIG9yZGluYXJ5X21hbnBhZ2U7CisJCSpwID0gJ1wwJzsKKwkJaWYgKHN0cmNocihsaW5rbmFtZSwgJy8nKSkgeworCQkJcCA9IHN0cnJjaHIobWFuX2ZpbGVuYW1lLCAnLycpOworCQkJaWYgKCFwKQorCQkJCWdvdG8gb3JkaW5hcnlfbWFucGFnZTsKKwkJCSpwID0gJ1wwJzsKKwkJfQorCisJCS8qIExpbmtzIGRvIG5vdCBoYXZlIC5neiBleHRlbnNpb25zLCBldmVuIGlmIG1hbnBhZ2UKKwkJICogaXMgY29tcHJlc3NlZCAqLworCQltYW5fZmlsZW5hbWUgPSB4YXNwcmludGYoIiVzLyVzIiBaX1NVRkZJWCwgbWFuX2ZpbGVuYW1lLCBsaW5rbmFtZSk7CisJCWZyZWUobGluZSk7CisJCS8qIE5vdGU6IHdlIGxlYWsgIm5ldyIgbWFuX2ZpbGVuYW1lIHN0cmluZyBhcyB3ZWxsLi4uICovCisJCWlmIChzaG93X21hbnBhZ2UocGFnZXIsIG1hbl9maWxlbmFtZSwgbWFuLCBsZXZlbCArIDEpKQorCQkJcmV0dXJuIDE7CisJCS8qIGVsc2U6IHNob3cgdGhlIGxpbmssIGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZyAqLworCX0KKworIG9yZGluYXJ5X21hbnBhZ2U6CisJY2xvc2UoU1RESU5fRklMRU5PKTsKKwlvcGVuX3ppcHBlZChtYW5fZmlsZW5hbWUpOyAvKiBndWFyYW50ZWVkIHRvIHVzZSBmZCAwIChTVERJTl9GSUxFTk8pICovCisJLyogIjI+JjEiIGlzIGFkZGVkIHNvIHRoYXQgbnJvZmYgZXJyb3JzIGFyZSBzaG93biBpbiBwYWdlciB0b28uCisJICogT3RoZXJ3aXNlIGl0IG1heSBzaG93IGp1c3QgZW1wdHkgc2NyZWVuICovCisJY21kID0geGFzcHJpbnRmKAorCQltYW4gPyAiZ3RibCB8IG5yb2ZmIC1UbGF0aW4xIC1tYW5kb2MgMj4mMSB8ICVzIgorCQkgICAgOiAiJXMiLAorCQlwYWdlcik7CisJc3lzdGVtKGNtZCk7CisJZnJlZShjbWQpOworCXJldHVybiAxOworfQorCisvKiBtYW5fZmlsZW5hbWUgaXMgb2YgdGhlIGZvcm0gIi9kaXIvZGlyL2Rpci9uYW1lLnMiIFpfU1VGRklYICovCitzdGF0aWMgaW50IHNob3dfbWFucGFnZShjb25zdCBjaGFyICpwYWdlciwgY2hhciAqbWFuX2ZpbGVuYW1lLCBpbnQgbWFuLCBpbnQgbGV2ZWwpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQQorCWlmIChydW5fcGlwZShwYWdlciwgbWFuX2ZpbGVuYW1lLCBtYW4sIGxldmVsKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwlzdHJjcHkoc3RycmNocihtYW5fZmlsZW5hbWUsICcuJykgKyAxLCAiYnoyIik7CisjZW5kaWYKKwlpZiAocnVuX3BpcGUocGFnZXIsIG1hbl9maWxlbmFtZSwgbWFuLCBsZXZlbCkpCisJCXJldHVybiAxOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEgfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJc3RyY3B5KHN0cnJjaHIobWFuX2ZpbGVuYW1lLCAnLicpICsgMSwgImd6Iik7CisjZW5kaWYKKwlpZiAocnVuX3BpcGUocGFnZXIsIG1hbl9maWxlbmFtZSwgbWFuLCBsZXZlbCkpCisJCXJldHVybiAxOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19MWk1BIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMiB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorCSpzdHJyY2hyKG1hbl9maWxlbmFtZSwgJy4nKSA9ICdcMCc7CisjZW5kaWYKKwlpZiAocnVuX3BpcGUocGFnZXIsIG1hbl9maWxlbmFtZSwgbWFuLCBsZXZlbCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1hbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljb25zdCBjaGFyICpwYWdlcjsKKwljaGFyICoqbWFuX3BhdGhfbGlzdDsKKwljaGFyICpzZWNfbGlzdDsKKwljaGFyICpjdXJfcGF0aCwgKmN1cl9zZWN0OworCWludCBjb3VudF9tcCwgY3VyX21wOworCWludCBvcHQsIG5vdF9mb3VuZDsKKwljaGFyICp0b2tlblsyXTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogYXQgbGVhc3Qgb25lIGFyZ3VtZW50ICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIithdyIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJc2VjX2xpc3QgPSB4c3RyZHVwKCIxOjI6Mzo0OjU6Njo3Ojg6OSIpOworCS8qIExhc3QgdmFsaWQgbWFuX3BhdGhfbGlzdFtdIGlzIFsweDEwXSAqLworCWNvdW50X21wID0gMDsKKwltYW5fcGF0aF9saXN0ID0geHphbGxvYygweDExICogc2l6ZW9mKG1hbl9wYXRoX2xpc3RbMF0pKTsKKwltYW5fcGF0aF9saXN0WzBdID0gZ2V0ZW52KCJNQU5QQVRIIik7CisJaWYgKCFtYW5fcGF0aF9saXN0WzBdKSAvKiBkZWZhdWx0LCBtYXkgYmUgb3ZlcnJpZGRlbiBieSAvZXRjL21hbi5jb25mICovCisJCW1hbl9wYXRoX2xpc3RbMF0gPSAoY2hhciopIi91c3IvbWFuIjsKKwllbHNlCisJCWNvdW50X21wKys7CisJcGFnZXIgPSBnZXRlbnYoIk1BTlBBR0VSIik7CisJaWYgKCFwYWdlcikgeworCQlwYWdlciA9IGdldGVudigiUEFHRVIiKTsKKwkJaWYgKCFwYWdlcikKKwkJCXBhZ2VyID0gIm1vcmUiOworCX0KKworCS8qIFBhcnNlIG1hbi5jb25mW2lnXSBvciBtYW5fZGIuY29uZiAqLworCS8qIG1hbiB2ZXJzaW9uIDEuNmYgdXNlcyBtYW4uY29uZmlnICovCisJLyogbWFuLWRiIGltcGxlbWVudGF0aW9uIG9mIG1hbiB1c2VzIG1hbl9kYi5jb25mICovCisJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL21hbi5jb25maWciLCBmb3Blbl9mb3JfcmVhZCk7CisJaWYgKCFwYXJzZXIpCisJCXBhcnNlciA9IGNvbmZpZ19vcGVuMigiL2V0Yy9tYW4uY29uZiIsIGZvcGVuX2Zvcl9yZWFkKTsKKwlpZiAoIXBhcnNlcikKKwkJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL21hbl9kYi5jb25mIiwgZm9wZW5fZm9yX3JlYWQpOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDAsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpZiAoIXRva2VuWzFdKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAoIk1BTkRBVE9SWV9NQU5QQVRIIisxMCwgdG9rZW5bMF0pID09IDAgLyogIk1BTlBBVEgiPyAqLworCQkgfHwgc3RyY21wKCJNQU5EQVRPUllfTUFOUEFUSCIsIHRva2VuWzBdKSA9PSAwCisJCSkgeworCQkJY2hhciAqcGF0aCA9IHRva2VuWzFdOworCQkJd2hpbGUgKCpwYXRoKSB7CisJCQkJY2hhciAqbmV4dF9wYXRoOworCQkJCWNoYXIgKipwYXRoX2VsZW1lbnQ7CisKKwkJCQluZXh0X3BhdGggPSBzdHJjaHIocGF0aCwgJzonKTsKKwkJCQlpZiAobmV4dF9wYXRoKSB7CisJCQkJCSpuZXh0X3BhdGggPSAnXDAnOworCQkJCQlpZiAobmV4dF9wYXRoKysgPT0gcGF0aCkgLyogIjo6Ij8gKi8KKwkJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQkJLyogRG8gd2UgYWxyZWFkeSBoYXZlIHBhdGg/ICovCisJCQkJcGF0aF9lbGVtZW50ID0gbWFuX3BhdGhfbGlzdDsKKwkJCQl3aGlsZSAoKnBhdGhfZWxlbWVudCkgeworCQkJCQlpZiAoc3RyY21wKCpwYXRoX2VsZW1lbnQsIHBhdGgpID09IDApCisJCQkJCQlnb3RvIHNraXA7CisJCQkJCXBhdGhfZWxlbWVudCsrOworCQkJCX0KKwkJCQltYW5fcGF0aF9saXN0ID0geHJlYWxsb2NfdmVjdG9yKG1hbl9wYXRoX2xpc3QsIDQsIGNvdW50X21wKTsKKwkJCQltYW5fcGF0aF9saXN0W2NvdW50X21wXSA9IHhzdHJkdXAocGF0aCk7CisJCQkJY291bnRfbXArKzsKKwkJCQkvKiBtYW5fcGF0aF9saXN0IGlzIE5VTEwgdGVybWluYXRlZCAqLworCQkJCS8qbWFuX3BhdGhfbGlzdFtjb3VudF9tcF0gPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKyBza2lwOgorCQkJCWlmICghbmV4dF9wYXRoKQorCQkJCQlicmVhazsKKyBuZXh0OgorCQkJCXBhdGggPSBuZXh0X3BhdGg7CisJCQl9CisJCX0KKwkJaWYgKHN0cmNtcCgiTUFOU0VDVCIsIHRva2VuWzBdKSA9PSAwKSB7CisJCQlmcmVlKHNlY19saXN0KTsKKwkJCXNlY19saXN0ID0geHN0cmR1cCh0b2tlblsxXSk7CisJCX0KKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKwlub3RfZm91bmQgPSAwOworCWRvIHsgLyogZm9yIGVhY2ggYXJndltdICovCisJCWludCBmb3VuZCA9IDA7CisJCWN1cl9tcCA9IDA7CisKKwkJaWYgKHN0cmNocigqYXJndiwgJy8nKSkgeworCQkJZm91bmQgPSBzaG93X21hbnBhZ2UocGFnZXIsICphcmd2LCAvKm1hbjoqLyAxLCAwKTsKKwkJCWdvdG8gY2hlY2tfZm91bmQ7CisJCX0KKwkJd2hpbGUgKChjdXJfcGF0aCA9IG1hbl9wYXRoX2xpc3RbY3VyX21wKytdKSAhPSBOVUxMKSB7CisJCQkvKiBmb3IgZWFjaCBNQU5QQVRIICovCisJCQljdXJfc2VjdCA9IHNlY19saXN0OworCQkJZG8geyAvKiBmb3IgZWFjaCBzZWN0aW9uICovCisJCQkJY2hhciAqbmV4dF9zZWN0ID0gc3RyY2hybnVsKGN1cl9zZWN0LCAnOicpOworCQkJCWludCBzZWN0X2xlbiA9IG5leHRfc2VjdCAtIGN1cl9zZWN0OworCQkJCWNoYXIgKm1hbl9maWxlbmFtZTsKKwkJCQlpbnQgY2F0MG1hbjEgPSAwOworCisJCQkJLyogU2VhcmNoIGZvciBjYXQsIHRoZW4gbWFuIHBhZ2UgKi8KKwkJCQl3aGlsZSAoY2F0MG1hbjEgPCAyKSB7CisJCQkJCWludCBmb3VuZF9oZXJlOworCQkJCQltYW5fZmlsZW5hbWUgPSB4YXNwcmludGYoIiVzLyVzJS4qcy8lcy4lLipzIiBaX1NVRkZJWCwKKwkJCQkJCQljdXJfcGF0aCwKKwkJCQkJCQkiY2F0XDBtYW4iICsgKGNhdDBtYW4xICogNCksCisJCQkJCQkJc2VjdF9sZW4sIGN1cl9zZWN0LAorCQkJCQkJCSphcmd2LAorCQkJCQkJCXNlY3RfbGVuLCBjdXJfc2VjdCk7CisJCQkJCWZvdW5kX2hlcmUgPSBzaG93X21hbnBhZ2UocGFnZXIsIG1hbl9maWxlbmFtZSwgY2F0MG1hbjEsIDApOworCQkJCQlmb3VuZCB8PSBmb3VuZF9oZXJlOworCQkJCQljYXQwbWFuMSArPSBmb3VuZF9oZXJlICsgMTsKKwkJCQkJZnJlZShtYW5fZmlsZW5hbWUpOworCQkJCX0KKworCQkJCWlmIChmb3VuZCAmJiAhKG9wdCAmIE9QVF9hKSkKKwkJCQkJZ290byBuZXh0X2FyZzsKKwkJCQljdXJfc2VjdCA9IG5leHRfc2VjdDsKKwkJCQl3aGlsZSAoKmN1cl9zZWN0ID09ICc6JykKKwkJCQkJY3VyX3NlY3QrKzsKKwkJCX0gd2hpbGUgKCpjdXJfc2VjdCk7CisJCX0KKyBjaGVja19mb3VuZDoKKwkJaWYgKCFmb3VuZCkgeworCQkJYmJfZXJyb3JfbXNnKCJubyBtYW51YWwgZW50cnkgZm9yICclcyciLCAqYXJndik7CisJCQlub3RfZm91bmQgPSAxOworCQl9CisgbmV4dF9hcmc6CisJCWFyZ3YrKzsKKwl9IHdoaWxlICgqYXJndik7CisKKwlyZXR1cm4gbm90X2ZvdW5kOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL21pY3JvY29tLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbWljcm9jb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTI5YTFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL21pY3JvY29tLmMKQEAgLTAsMCArMSwxODMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJhcmUgYm9uZXMgJ3RhbGsgdG8gbW9kZW0nIHByb2dyYW0gLSBzaW1pbGFyIHRvICdjdSAtbCAkZGV2aWNlJworICogaW5zcGlyZWQgYnkgbWdldHR5J3MgbWljcm9jb20KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1pY3JvY29tX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWQgREVMQVldIFstdCBUSU1FT1VUXSBbLXMgU1BFRURdIFstWF0gVFRZIgorLy91c2FnZTojZGVmaW5lIG1pY3JvY29tX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29weSBieXRlcyBmb3Igc3RkaW4gdG8gVFRZIGFuZCBmcm9tIFRUWSB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJV2FpdCB1cCB0byBERUxBWSBtcyBmb3IgVFRZIG91dHB1dCBiZWZvcmUgc2VuZGluZyBldmVyeSIKKy8vdXNhZ2U6ICAgICAiXG4JCW5leHQgYnl0ZSB0byBpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJRXhpdCBpZiBib3RoIHN0ZGluIGFuZCBUVFkgYXJlIHNpbGVudCBmb3IgVElNRU9VVCBtcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU2V0IHNlcmlhbCBsaW5lIHRvIFNQRUVEIgorLy91c2FnZTogICAgICJcbgktWAlEaXNhYmxlIHNwZWNpYWwgbWVhbmluZyBvZiBOVUwgYW5kIEN0cmwtWCBmcm9tIHN0ZGluIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLy8gc2V0IHJhdyB0dHkgbW9kZQorc3RhdGljIHZvaWQgeGdldDEoaW50IGZkLCBzdHJ1Y3QgdGVybWlvcyAqdCwgc3RydWN0IHRlcm1pb3MgKm9sZHQpCit7CisJdGNnZXRhdHRyKGZkLCBvbGR0KTsKKwkqdCA9ICpvbGR0OworCWNmbWFrZXJhdyh0KTsKKy8vCXQtPmNfbGZsYWcgJj0gfihJU0lHfElDQU5PTnxFQ0hPfElFWFRFTik7CisvLwl0LT5jX2lmbGFnICY9IH4oQlJLSU5UfElYT058SUNSTkwpOworLy8JdC0+Y19vZmxhZyAmPSB+KE9OTENSKTsKKy8vCXQtPmNfY2NbVk1JTl0gID0gMTsKKy8vCXQtPmNfY2NbVlRJTUVdID0gMDsKK30KKworc3RhdGljIGludCB4c2V0MShpbnQgZmQsIHN0cnVjdCB0ZXJtaW9zICp0aW8sIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwlpbnQgcmV0ID0gdGNzZXRhdHRyKGZkLCBUQ1NBRkxVU0gsIHRpbyk7CisKKwlpZiAocmV0KSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHRjc2V0YXR0ciBmb3IgJXMiLCBkZXZpY2UpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWljcm9jb21fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1pY3JvY29tX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2ZkOworCWludCBuZmQ7CisJc3RydWN0IHBvbGxmZCBwZmRbMl07CisJc3RydWN0IHRlcm1pb3MgdGlvMCwgdGlvc2ZkLCB0aW87CisJY2hhciAqZGV2aWNlX2xvY2tfZmlsZTsKKwllbnVtIHsKKwkJT1BUX1ggPSAxIDw8IDAsIC8vIGRvIG5vdCByZXNwZWN0IEN0cmwtWCwgQ3RybC1ACisJCU9QVF9zID0gMSA8PCAxLCAvLyBiYXVkcmF0ZQorCQlPUFRfZCA9IDEgPDwgMiwgLy8gd2FpdCBmb3IgZGV2aWNlIHJlc3BvbnNlLCBtcworCQlPUFRfdCA9IDEgPDwgMywgLy8gdGltZW91dCwgbXMKKwl9OworCXNwZWVkX3Qgc3BlZWQgPSA5NjAwOworCWludCBkZWxheSA9IC0xOworCWludCB0aW1lb3V0ID0gLTE7CisJdW5zaWduZWQgb3B0czsKKworCS8vIGZldGNoIG9wdGlvbnMKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MTpzKzpkKzp0KyI7IC8vIGV4YWN0bHkgb25lIGFyZywgbnVtZXJpYyBvcHRpb25zCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJYczpkOnQ6IiwgJnNwZWVkLCAmZGVsYXksICZ0aW1lb3V0KTsKKy8vCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJLy8gdHJ5IHRvIGNyZWF0ZSBsb2NrIGZpbGUgaW4gL3Zhci9sb2NrCisJZGV2aWNlX2xvY2tfZmlsZSA9IChjaGFyICopYmJfYmFzZW5hbWUoYXJndlswXSk7CisJZGV2aWNlX2xvY2tfZmlsZSA9IHhhc3ByaW50ZigiL3Zhci9sb2NrL0xDSy4uJXMiLCBkZXZpY2VfbG9ja19maWxlKTsKKwlzZmQgPSBvcGVuKGRldmljZV9sb2NrX2ZpbGUsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0VYQ0wsIDA2NDQpOworCWlmIChzZmQgPCAwKSB7CisJCS8vIGRldmljZSBhbHJlYWR5IGxvY2tlZCAtPiBiYWlsIG91dAorCQlpZiAoZXJybm8gPT0gRUVYSVNUKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjcmVhdGUgJyVzJyIsIGRldmljZV9sb2NrX2ZpbGUpOworCQkvLyBjYW4ndCBjcmVhdGUgbG9jayAtPiBkb24ndCBjYXJlCisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoZGV2aWNlX2xvY2tfZmlsZSk7CisJCWRldmljZV9sb2NrX2ZpbGUgPSBOVUxMOworCX0gZWxzZSB7CisJCS8vICU0ZCB0byBtYWtlIGNvbmN1cnJlbnQgbWdldHR5IChpZiBhbnkpIGhhcHB5LgorCQkvLyBNZ2V0dHkgdHJlYXRzIDQtYnl0ZXMgbG9jayBmaWxlcyBhcyBiaW5hcnksCisJCS8vIG5vdCB0ZXh0LCBQSUQuIE1ha2luZyA1KyBjaGFyIGZpbGUuIEJycnIuLi4KKwkJZmRwcmludGYoc2ZkLCAiJTRkXG4iLCBnZXRwaWQoKSk7CisJCWNsb3NlKHNmZCk7CisJfQorCisJLy8gc2V0dXAgc2lnbmFscworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR0hVUCkKKwkJKyAoMSA8PCBTSUdJTlQpCisJCSsgKDEgPDwgU0lHVEVSTSkKKwkJKyAoMSA8PCBTSUdQSVBFKQorCQksIHJlY29yZF9zaWdubyk7CisKKwkvLyBlcnJvciBleGl0IGNvZGUgaWYgd2UgZmFpbCB0byBvcGVuIHRoZSBkZXZpY2UKKwliYl9nb3Rfc2lnbmFsID0gMTsKKworCS8vIG9wZW4gZGV2aWNlCisJc2ZkID0gb3Blbl9vcl93YXJuKGFyZ3ZbMF0sIE9fUkRXUiB8IE9fTk9DVFRZIHwgT19OT05CTE9DSyk7CisJaWYgKHNmZCA8IDApCisJCWdvdG8gZG9uZTsKKwlmY250bChzZmQsIEZfU0VURkwsIE9fUkRXUik7CisKKwkvLyBwdXQgZGV2aWNlIHRvICJyYXcgbW9kZSIKKwl4Z2V0MShzZmQsICZ0aW8sICZ0aW9zZmQpOworCS8vIHNldCBkZXZpY2Ugc3BlZWQKKwljZnNldHNwZWVkKCZ0aW8sIHR0eV92YWx1ZV90b19iYXVkKHNwZWVkKSk7CisJaWYgKHhzZXQxKHNmZCwgJnRpbywgYXJndlswXSkpCisJCWdvdG8gZG9uZTsKKworCS8vIHB1dCBzdGRpbiB0byAicmF3IG1vZGUiIChpZiBzdGRpbiBpcyBhIFRUWSksCisJLy8gaGFuZGxlIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lCisJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pKSB7CisJCXhnZXQxKFNURElOX0ZJTEVOTywgJnRpbywgJnRpbzApOworCQlpZiAoeHNldDEoU1RESU5fRklMRU5PLCAmdGlvLCAic3RkaW4iKSkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyBtYWluIGxvb3A6IGNoZWNrIHdpdGggcG9sbCgpLCB0aGVuIHJlYWQvd3JpdGUgYnl0ZXMgYWNyb3NzCisJcGZkWzBdLmZkID0gc2ZkOworCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJcGZkWzFdLmZkID0gU1RESU5fRklMRU5POworCXBmZFsxXS5ldmVudHMgPSBQT0xMSU47CisKKwliYl9nb3Rfc2lnbmFsID0gMDsKKwluZmQgPSAyOworCS8vIE5vdCBzYWZlX3BvbGw6IHdlIHdhbnQgdG8gZXhpdCBvbiBzaWduYWwKKwl3aGlsZSAoIWJiX2dvdF9zaWduYWwgJiYgcG9sbChwZmQsIG5mZCwgdGltZW91dCkgPiAwKSB7CisJCWlmIChuZmQgPiAxICYmIHBmZFsxXS5yZXZlbnRzKSB7CisJCQljaGFyIGM7CisJCQkvLyByZWFkIGZyb20gc3RkaW4gLT4gd3JpdGUgdG8gZGV2aWNlCisJCQlpZiAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpIDwgMSkgeworCQkJCS8vIGRvbid0IHBvbGwgc3RkaW4gYW55bW9yZSBpZiB3ZSBnb3QgRU9GL2Vycm9yCisJCQkJbmZkLS07CisJCQkJZ290byBza2lwX3dyaXRlOworCQkJfQorCQkJLy8gZG8gd2UgbmVlZCBzcGVjaWFsIHByb2Nlc3Npbmc/CisJCQlpZiAoIShvcHRzICYgT1BUX1gpKSB7CisJCQkJLy8gXkAgc2VuZHMgQnJlYWsKKwkJCQlpZiAoVklOVFIgPT0gYykgeworCQkJCQl0Y3NlbmRicmVhayhzZmQsIDApOworCQkJCQlnb3RvIHNraXBfd3JpdGU7CisJCQkJfQorCQkJCS8vIF5YIGV4aXRzCisJCQkJaWYgKDI0ID09IGMpCisJCQkJCWJyZWFrOworCQkJfQorCQkJd3JpdGUoc2ZkLCAmYywgMSk7CisJCQlpZiAoZGVsYXkgPj0gMCkKKwkJCQlzYWZlX3BvbGwocGZkLCAxLCBkZWxheSk7Citza2lwX3dyaXRlOiA7CisJCX0KKwkJaWYgKHBmZFswXS5yZXZlbnRzKSB7CisjZGVmaW5lIGlvYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCQlzc2l6ZV90IGxlbjsKKwkJCS8vIHJlYWQgZnJvbSBkZXZpY2UgLT4gd3JpdGUgdG8gc3Rkb3V0CisJCQlsZW4gPSBzYWZlX3JlYWQoc2ZkLCBpb2J1Ziwgc2l6ZW9mKGlvYnVmKSk7CisJCQlpZiAobGVuID4gMCkKKwkJCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGlvYnVmLCBsZW4pOworCQkJZWxzZSB7CisJCQkJLy8gRU9GL2Vycm9yIC0+IGJhaWwgb3V0CisJCQkJYmJfZ290X3NpZ25hbCA9IFNJR0hVUDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIHJlc3RvcmUgZGV2aWNlIG1vZGUKKwl0Y3NldGF0dHIoc2ZkLCBUQ1NBRkxVU0gsICZ0aW9zZmQpOworCisJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pKQorCQl0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBRkxVU0gsICZ0aW8wKTsKKworZG9uZToKKwlpZiAoZGV2aWNlX2xvY2tfZmlsZSkKKwkJdW5saW5rKGRldmljZV9sb2NrX2ZpbGUpOworCisJcmV0dXJuIGJiX2dvdF9zaWduYWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbW91bnRwb2ludC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL21vdW50cG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQxZjdjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL21vdW50cG9pbnQuYwpAQCAtMCwwICsxLDk2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtb3VudHBvaW50IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQmFzZWQgb24gc3lzdmluaXQncyBtb3VudHBvaW50CisgKi8KKworLy91c2FnZTojZGVmaW5lIG1vdW50cG9pbnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstcV0gPFstZG5dIERJUiB8IC14IERFVklDRT4iCisvL3VzYWdlOiNkZWZpbmUgbW91bnRwb2ludF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoZWNrIGlmIHRoZSBkaXJlY3RvcnkgaXMgYSBtb3VudHBvaW50XG4iCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorLy91c2FnZTogICAgICJcbgktZAlQcmludCBtYWpvci9taW5vciBkZXZpY2UgbnVtYmVyIG9mIHRoZSBmaWxlc3lzdGVtIgorLy91c2FnZTogICAgICJcbgktbglQcmludCBkZXZpY2UgbmFtZSBvZiB0aGUgZmlsZXN5c3RlbSIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJUHJpbnQgbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciBvZiB0aGUgYmxvY2tkZXZpY2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1vdW50cG9pbnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbW91bnRwb2ludCAvcHJvY1xuIgorLy91c2FnZTogICAgICAgIi9wcm9jIGlzIG5vdCBhIG1vdW50cG9pbnRcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vdW50cG9pbnQgL3N5c1xuIgorLy91c2FnZTogICAgICAgIi9zeXMgaXMgYSBtb3VudHBvaW50XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgbW91bnRwb2ludF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbW91bnRwb2ludF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY29uc3QgY2hhciAqbXNnOworCWNoYXIgKmFyZzsKKwlpbnQgcmMsIG9wdDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsgLyogbXVzdCBoYXZlIG9uZSBhcmd1bWVudCAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJxZHhuIik7CisjZGVmaW5lIE9QVF9xICgxKQorI2RlZmluZSBPUFRfZCAoMikKKyNkZWZpbmUgT1BUX3ggKDQpCisjZGVmaW5lIE9QVF9uICg4KQorCWFyZyA9IGFyZ3Zbb3B0aW5kXTsKKwltc2cgPSAiJXMiOworCisJcmMgPSAob3B0ICYgT1BUX3gpID8gc3RhdChhcmcsICZzdCkgOiBsc3RhdChhcmcsICZzdCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gZXJyOworCisJaWYgKG9wdCAmIE9QVF94KSB7CisJCWlmIChTX0lTQkxLKHN0LnN0X21vZGUpKSB7CisJCQlwcmludGYoIiV1OiV1XG4iLCBtYWpvcihzdC5zdF9yZGV2KSwKKwkJCQkJCW1pbm9yKHN0LnN0X3JkZXYpKTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJZXJybm8gPSAwOyAvKiBtYWtlIHBlcnJvcl9tc2cgd29yayBhcyBlcnJvcl9tc2cgKi8KKwkJbXNnID0gIiVzOiBub3QgYSBibG9jayBkZXZpY2UiOworCQlnb3RvIGVycjsKKwl9CisKKwllcnJubyA9IEVOT1RESVI7CisJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJZGV2X3Qgc3RfZGV2ID0gc3Quc3RfZGV2OworCQlpbm9fdCBzdF9pbm8gPSBzdC5zdF9pbm87CisJCWNoYXIgKnAgPSB4YXNwcmludGYoIiVzLy4uIiwgYXJnKTsKKworCQlpZiAoc3RhdChwLCAmc3QpID09IDApIHsKKwkJCS8vaW50IGlzX21udCA9IChzdF9kZXYgIT0gc3Quc3RfZGV2KSB8fCAoc3RfZGV2ID09IHN0LnN0X2RldiAmJiBzdF9pbm8gPT0gc3Quc3RfaW5vKTsKKwkJCWludCBpc19ub3RfbW50ID0gKHN0X2RldiA9PSBzdC5zdF9kZXYpICYmIChzdF9pbm8gIT0gc3Quc3RfaW5vKTsKKworCQkJaWYgKG9wdCAmIE9QVF9kKQorCQkJCXByaW50ZigiJXU6JXVcbiIsIG1ham9yKHN0X2RldiksIG1pbm9yKHN0X2RldikpOworCQkJaWYgKG9wdCAmIE9QVF9uKSB7CisJCQkJY29uc3QgY2hhciAqZCA9IGZpbmRfYmxvY2tfZGV2aWNlKGFyZyk7CisJCQkJLyogbmFtZSBpcyB1bmRlZmluZWQsIGJ1dCBkZXZpY2UgaXMgbW91bnRlZCAtPiBhbm9ueW1vdXMgc3VwZXJibG9jayEgKi8KKwkJCQkvKiBoYXBwZW5zIHdpdGggYnRyZnMgKi8KKwkJCQlpZiAoIWQpIHsKKwkJCQkJZCA9ICJVTktOT1dOIjsKKwkJCQkJLyogVE9ETzogaXRlcmF0ZSAvcHJvYy9tb3VudHMsIG9yIC9wcm9jL3NlbGYvbW91bnRpbmZvCisJCQkJCSAqIHRvIGZpbmQgb3V0IHRoZSBkZXZpY2UgbmFtZSAqLworCQkJCX0KKwkJCQlwcmludGYoIiVzICVzXG4iLCBkLCBhcmcpOworCQkJfQorCQkJaWYgKCEob3B0ICYgKE9QVF9xIHwgT1BUX2QgfCBPUFRfbikpKQorCQkJCXByaW50ZigiJXMgaXMgJXNhIG1vdW50cG9pbnRcbiIsIGFyZywgaXNfbm90X21udCA/ICJub3QgIiA6ICIiKTsKKwkJCXJldHVybiBpc19ub3RfbW50OworCQl9CisJCWFyZyA9IHA7CisJCS8qIGVsc2U6IHN0YXQgaGFkIHNldCBlcnJubywganVzdCBmYWxsIHRocm91Z2ggKi8KKwl9CisKKyBlcnI6CisJaWYgKCEob3B0ICYgT1BUX3EpKQorCQliYl9wZXJyb3JfbXNnKG1zZywgYXJnKTsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL210LmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFmZDNhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL210LmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG10X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWYgZGV2aWNlXSBvcGNvZGUgdmFsdWUiCisvL3VzYWdlOiNkZWZpbmUgbXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb250cm9sIG1hZ25ldGljIHRhcGUgZHJpdmUgb3BlcmF0aW9uXG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiQXZhaWxhYmxlIE9wY29kZXM6XG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiYnNmIGJzZm0gYnNyIGJzcyBkYXRhY29tcHJlc3Npb24gZHJ2YnVmZmVyIGVvZiBlb20gZXJhc2VcbiIKKy8vdXNhZ2U6ICAgICAgICJmc2YgZnNmbSBmc3IgZnNzIGxvYWQgbG9jayBta3BhcnQgbm9wIG9mZmxpbmUgcmFzMSByYXMyXG4iCisvL3VzYWdlOiAgICAgICAicmFzMyByZXNldCByZXRlbnNpb24gcmV3aW5kIHJld29mZmxpbmUgc2VlayBzZXRibGsgc2V0ZGVuc2l0eVxuIgorLy91c2FnZTogICAgICAgInNldHBhcnQgdGVsbCB1bmxvYWQgdW5sb2NrIHdlb2Ygd3NldCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL210aW8uaD4KKworLyogbWlzc2luZzogZW9kL3Nlb2QsIHN0b3B0aW9ucywgc3R3cnRocmVzaG9sZCwgZGVuc2l0aWVzICovCitzdGF0aWMgY29uc3Qgc2hvcnQgb3Bjb2RlX3ZhbHVlW10gPSB7CisJTVRCU0YsCisJTVRCU0ZNLAorCU1UQlNSLAorCU1UQlNTLAorCU1UQ09NUFJFU1NJT04sCisJTVRFT00sCisJTVRFUkFTRSwKKwlNVEZTRiwKKwlNVEZTRk0sCisJTVRGU1IsCisJTVRGU1MsCisJTVRMT0FELAorCU1UTE9DSywKKwlNVE1LUEFSVCwKKwlNVE5PUCwKKwlNVE9GRkwsCisJTVRPRkZMLAorCU1UUkFTMSwKKwlNVFJBUzIsCisJTVRSQVMzLAorCU1UUkVTRVQsCisJTVRSRVRFTiwKKwlNVFJFVywKKwlNVFNFRUssCisJTVRTRVRCTEssCisJTVRTRVRERU5TSVRZLAorCU1UU0VURFJWQlVGRkVSLAorCU1UU0VUUEFSVCwKKwlNVFRFTEwsCisJTVRXU00sCisJTVRVTkxPQUQsCisJTVRVTkxPQ0ssCisJTVRXRU9GLAorCU1UV0VPRgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgb3Bjb2RlX25hbWVbXSBBTElHTjEgPQorCSJic2YiICAgICAgICAgICAgICJcMCIKKwkiYnNmbSIgICAgICAgICAgICAiXDAiCisJImJzciIgICAgICAgICAgICAgIlwwIgorCSJic3MiICAgICAgICAgICAgICJcMCIKKwkiZGF0YWNvbXByZXNzaW9uIiAiXDAiCisJImVvbSIgICAgICAgICAgICAgIlwwIgorCSJlcmFzZSIgICAgICAgICAgICJcMCIKKwkiZnNmIiAgICAgICAgICAgICAiXDAiCisJImZzZm0iICAgICAgICAgICAgIlwwIgorCSJmc3IiICAgICAgICAgICAgICJcMCIKKwkiZnNzIiAgICAgICAgICAgICAiXDAiCisJImxvYWQiICAgICAgICAgICAgIlwwIgorCSJsb2NrIiAgICAgICAgICAgICJcMCIKKwkibWtwYXJ0IiAgICAgICAgICAiXDAiCisJIm5vcCIgICAgICAgICAgICAgIlwwIgorCSJvZmZsaW5lIiAgICAgICAgICJcMCIKKwkicmV3b2ZmbGluZSIgICAgICAiXDAiCisJInJhczEiICAgICAgICAgICAgIlwwIgorCSJyYXMyIiAgICAgICAgICAgICJcMCIKKwkicmFzMyIgICAgICAgICAgICAiXDAiCisJInJlc2V0IiAgICAgICAgICAgIlwwIgorCSJyZXRlbnNpb24iICAgICAgICJcMCIKKwkicmV3aW5kIiAgICAgICAgICAiXDAiCisJInNlZWsiICAgICAgICAgICAgIlwwIgorCSJzZXRibGsiICAgICAgICAgICJcMCIKKwkic2V0ZGVuc2l0eSIgICAgICAiXDAiCisJImRydmJ1ZmZlciIgICAgICAgIlwwIgorCSJzZXRwYXJ0IiAgICAgICAgICJcMCIKKwkidGVsbCIgICAgICAgICAgICAiXDAiCisJIndzZXQiICAgICAgICAgICAgIlwwIgorCSJ1bmxvYWQiICAgICAgICAgICJcMCIKKwkidW5sb2NrIiAgICAgICAgICAiXDAiCisJImVvZiIgICAgICAgICAgICAgIlwwIgorCSJ3ZW9mIiAgICAgICAgICAgICJcMCI7CisKK2ludCBtdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmZpbGUgPSAiL2Rldi90YXBlIjsKKwlzdHJ1Y3QgbXRvcCBvcDsKKwlzdHJ1Y3QgbXRwb3MgcG9zaXRpb247CisJaW50IGZkLCBtb2RlLCBpZHg7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmIChzdHJjbXAoYXJndlsxXSwgIi1mIikgPT0gMCkgeworCQlpZiAoIWFyZ3ZbMl0gfHwgIWFyZ3ZbM10pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWZpbGUgPSBhcmd2WzJdOworCQlhcmd2ICs9IDI7CisJfQorCisJaWR4ID0gaW5kZXhfaW5fc3RyaW5ncyhvcGNvZGVfbmFtZSwgYXJndlsxXSk7CisKKwlpZiAoaWR4IDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVucmVjb2duaXplZCBvcGNvZGUgJXMiLCBhcmd2WzFdKTsKKworCW9wLm10X29wID0gb3Bjb2RlX3ZhbHVlW2lkeF07CisJaWYgKGFyZ3ZbMl0pCisJCW9wLm10X2NvdW50ID0geGF0b2lfcG9zaXRpdmUoYXJndlsyXSk7CisJZWxzZQorCQlvcC5tdF9jb3VudCA9IDE7ICAvKiBPbmUsIG5vdCB6ZXJvLCByaWdodD8gKi8KKworCXN3aXRjaCAob3Bjb2RlX3ZhbHVlW2lkeF0pIHsKKwkJY2FzZSBNVFdFT0Y6CisJCWNhc2UgTVRFUkFTRToKKwkJY2FzZSBNVFdTTToKKwkJY2FzZSBNVFNFVERSVkJVRkZFUjoKKwkJCW1vZGUgPSBPX1dST05MWTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQltb2RlID0gT19SRE9OTFk7CisJCQlicmVhazsKKwl9CisKKwlmZCA9IHhvcGVuKGZpbGUsIG1vZGUpOworCisJc3dpdGNoIChvcGNvZGVfdmFsdWVbaWR4XSkgeworCQljYXNlIE1UVEVMTDoKKwkJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGZkLCBNVElPQ1BPUywgJnBvc2l0aW9uLCAiJXMiLCBmaWxlKTsKKwkJCXByaW50ZigiQXQgYmxvY2sgJWRcbiIsIChpbnQpIHBvc2l0aW9uLm10X2Jsa25vKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShmZCwgTVRJT0NUT1AsICZvcCwgIiVzIiwgZmlsZSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL25hbmR3cml0ZS5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL25hbmR3cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmEzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvbmFuZHdyaXRlLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBuYW5kd3JpdGUgYW5kIG5hbmRkdW1wIHBvcnRlZCB0byBidXN5Ym94IGZyb20gbXRkLXV0aWxzCisgKgorICogQXV0aG9yOiBCYXJ1Y2ggU2lhY2ggPGJhcnVjaEB0a29zLmNvLmlsPiwgT3JleCBDb21wdXRlZCBSYWRpb2dyYXBoeQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVE9ETzogYWRkIHN1cHBvcnQgZm9yIGxhcmdlICg+NEdCKSBNVEQgZGV2aWNlcworICovCisKKy8vYXBwbGV0OklGX05BTkRXUklURShBUFBMRVQobmFuZHdyaXRlLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9OQU5EV1JJVEUoQVBQTEVUX09ERE5BTUUobmFuZGR1bXAsIG5hbmR3cml0ZSwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIG5hbmRkdW1wKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX05BTkRXUklURSkgKz0gbmFuZHdyaXRlLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19OQU5ERFVNUCkgKz0gbmFuZHdyaXRlLm8KKworLy9jb25maWc6Y29uZmlnIE5BTkRXUklURQorLy9jb25maWc6CWJvb2wgIm5hbmR3cml0ZSIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBXcml0ZSB0byB0aGUgc3BlY2lmaWVkIE1URCBkZXZpY2UsIHdpdGggYmFkIGJsb2NrcyBhd2FyZW5lc3MKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIE5BTkREVU1QCisvL2NvbmZpZzoJYm9vbCAibmFuZGR1bXAiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRHVtcCB0aGUgY29udGVudCBvZiByYXcgTkFORCBjaGlwCisKKy8vdXNhZ2U6I2RlZmluZSBuYW5kd3JpdGVfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstcF0gWy1zIEFERFJdIE1URF9ERVZJQ0UgW0ZJTEVdIgorLy91c2FnZTojZGVmaW5lIG5hbmR3cml0ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIldyaXRlIHRvIHRoZSBzcGVjaWZpZWQgTVREIGRldmljZVxuIgorLy91c2FnZTogICAgICJcbgktcAlQYWQgdG8gcGFnZSBzaXplIgorLy91c2FnZTogICAgICJcbgktcyBBRERSCVN0YXJ0IGFkZHJlc3MiCisKKy8vdXNhZ2U6I2RlZmluZSBuYW5kZHVtcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1vXSBbLWJdIFstcyBBRERSXSBbLWYgRklMRV0gTVREX0RFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBuYW5kZHVtcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIkR1bXAgdGhlIHNwZWNpZmllZCBNVEQgZGV2aWNlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1vCU9taXQgb29iIGRhdGEiCisvL3VzYWdlOiAgICAgIlxuCS1iCU9taXQgYmFkIGJsb2NrIGZyb20gdGhlIGR1bXAiCisvL3VzYWdlOiAgICAgIlxuCS1zIEFERFIJU3RhcnQgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTEVOCUxlbmd0aCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgRklMRQlEdW1wIHRvIGZpbGUgKCctJyBmb3Igc3Rkb3V0KSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bXRkL210ZC11c2VyLmg+CisKKyNkZWZpbmUgSVNfTkFORERVTVAgIChFTkFCTEVfTkFORERVTVAgJiYgKCFFTkFCTEVfTkFORFdSSVRFIHx8IChhcHBsZXRfbmFtZVs0XSA9PSAnZCcpKSkKKyNkZWZpbmUgSVNfTkFORFdSSVRFIChFTkFCTEVfTkFORFdSSVRFICYmICghRU5BQkxFX05BTkREVU1QIHx8IChhcHBsZXRfbmFtZVs0XSAhPSAnZCcpKSkKKworI2RlZmluZSBPUFRfcCAgKDEgPDwgMCkgLyogbmFuZHdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgT1BUX28gICgxIDw8IDApIC8qIG5hbmRkdW1wIG9ubHkgKi8KKyNkZWZpbmUgT1BUX3MgICgxIDw8IDEpCisjZGVmaW5lIE9QVF9iICAoMSA8PCAyKQorI2RlZmluZSBPUFRfZiAgKDEgPDwgMykKKyNkZWZpbmUgT1BUX2wgICgxIDw8IDQpCisKKy8qIGhlbHBlciBmb3Igd3JpdGluZyBvdXQgMHhmZiBmb3IgYmFkIGJsb2NrcyBwYWQgKi8KK3N0YXRpYyB2b2lkIGR1bXBfYmFkKHN0cnVjdCBtdGRfaW5mb191c2VyICptZW1pbmZvLCB1bnNpZ25lZCBsZW4sIGludCBvb2IpCit7CisJdW5zaWduZWQgY2hhciBidWZbbWVtaW5mby0+d3JpdGVzaXplXTsKKwl1bnNpZ25lZCBjb3VudDsKKworCS8qIHJvdW5kIGxlbiB0byB0aGUgbmV4dCBwYWdlICovCisJbGVuID0gKGxlbiB8IH4obWVtaW5mby0+d3JpdGVzaXplIC0gMSkpICsgMTsKKworCW1lbXNldChidWYsIDB4ZmYsIHNpemVvZihidWYpKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsZW47IGNvdW50ICs9IG1lbWluZm8tPndyaXRlc2l6ZSkgeworCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCBtZW1pbmZvLT53cml0ZXNpemUpOworCQlpZiAob29iKQorCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiwgbWVtaW5mby0+b29ic2l6ZSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbmV4dF9nb29kX2VyYXNlYmxvY2soaW50IGZkLCBzdHJ1Y3QgbXRkX2luZm9fdXNlciAqbWVtaW5mbywKKwkJdW5zaWduZWQgYmxvY2tfb2Zmc2V0KQoreworCXdoaWxlICgxKSB7CisJCWxvZmZfdCBvZmZzOworCisJCWlmIChibG9ja19vZmZzZXQgPj0gbWVtaW5mby0+c2l6ZSkgeworCQkJaWYgKElTX05BTkRXUklURSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGVub3VnaCBzcGFjZSBpbiBNVEQgZGV2aWNlIik7CisJCQlyZXR1cm4gYmxvY2tfb2Zmc2V0OyAvKiBsZXQgdGhlIGNhbGxlciBleGl0ICovCisJCX0KKwkJb2ZmcyA9IGJsb2NrX29mZnNldDsKKwkJaWYgKHhpb2N0bChmZCwgTUVNR0VUQkFEQkxPQ0ssICZvZmZzKSA9PSAwKQorCQkJcmV0dXJuIGJsb2NrX29mZnNldDsKKwkJLyogaW9jdGwgcmV0dXJuZWQgMSA9PiAiYmFkIGJsb2NrIiAqLworCQlpZiAoSVNfTkFORFdSSVRFKQorCQkJcHJpbnRmKCJTa2lwcGluZyBiYWQgYmxvY2sgYXQgMHglMDh4XG4iLCBibG9ja19vZmZzZXQpOworCQlibG9ja19vZmZzZXQgKz0gbWVtaW5mby0+ZXJhc2VzaXplOworCX0KK30KKworaW50IG5hbmR3cml0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbmFuZHdyaXRlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwkvKiBCdWZmZXIgZm9yIE9PQiBkYXRhICovCisJdW5zaWduZWQgY2hhciAqb29iYnVmOworCXVuc2lnbmVkIG9wdHM7CisJaW50IGZkOworCXNzaXplX3QgY250OworCXVuc2lnbmVkIG10ZG9mZnNldCwgbWVtaW5mb193cml0ZXNpemUsIGJsb2Nrc3RhcnQsIGxpbWl0OworCXVuc2lnbmVkIGVuZF9hZGRyID0gfjA7CisJc3RydWN0IG10ZF9pbmZvX3VzZXIgbWVtaW5mbzsKKwlzdHJ1Y3QgbXRkX29vYl9idWYgb29iOworCXVuc2lnbmVkIGNoYXIgKmZpbGVidWY7CisJY29uc3QgY2hhciAqb3B0X3MgPSAiMCIsICpvcHRfZiA9ICItIiwgKm9wdF9sOworCisJaWYgKElTX05BTkREVU1QKSB7CisJCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsKKwkJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJvczpiZjpsOiIsICZvcHRfcywgJm9wdF9mLCAmb3B0X2wpOworCX0gZWxzZSB7IC8qIG5hbmR3cml0ZSAqLworCQlvcHRfY29tcGxlbWVudGFyeSA9ICItMTo/MiI7CisJCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAicHM6IiwgJm9wdF9zKTsKKwl9CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoSVNfTkFORFdSSVRFICYmIGFyZ3ZbMV0pCisJCW9wdF9mID0gYXJndlsxXTsKKwlpZiAoIUxPTkVfREFTSChvcHRfZikpIHsKKwkJaW50IHRtcF9mZCA9IHhvcGVuKG9wdF9mLAorCQkJSVNfTkFORERVTVAgPyBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFUIDogT19SRE9OTFkKKwkJKTsKKwkJeG1vdmVfZmQodG1wX2ZkLCBJU19OQU5ERFVNUCA/IFNURE9VVF9GSUxFTk8gOiBTVERJTl9GSUxFTk8pOworCX0KKworCWZkID0geG9wZW4oYXJndlswXSwgT19SRFdSKTsKKwl4aW9jdGwoZmQsIE1FTUdFVElORk8sICZtZW1pbmZvKTsKKworCW10ZG9mZnNldCA9IHhzdHJ0b3Uob3B0X3MsIDApOworCWlmIChJU19OQU5ERFVNUCAmJiAob3B0cyAmIE9QVF9sKSkgeworCQl1bnNpZ25lZCBsZW5ndGggPSB4c3RydG91KG9wdF9sLCAwKTsKKwkJaWYgKGxlbmd0aCA8IG1lbWluZm8uc2l6ZSAtIG10ZG9mZnNldCkKKwkJCWVuZF9hZGRyID0gbXRkb2Zmc2V0ICsgbGVuZ3RoOworCX0KKworCS8qIFB1bGwgaXQgaW50byBhIENQVSByZWdpc3RlciAoaG9wZWZ1bGx5KSAtIHNtYWxsZXIgY29kZSB0aGF0IHdheSAqLworCW1lbWluZm9fd3JpdGVzaXplID0gbWVtaW5mby53cml0ZXNpemU7CisKKwlpZiAobXRkb2Zmc2V0ICYgKG1lbWluZm9fd3JpdGVzaXplIC0gMSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzdGFydCBhZGRyZXNzIGlzIG5vdCBwYWdlIGFsaWduZWQiKTsKKworCWZpbGVidWYgPSB4bWFsbG9jKG1lbWluZm9fd3JpdGVzaXplKTsKKwlvb2JidWYgPSB4bWFsbG9jKG1lbWluZm8ub29ic2l6ZSk7CisKKwlvb2Iuc3RhcnQgID0gMDsKKwlvb2IubGVuZ3RoID0gbWVtaW5mby5vb2JzaXplOworCW9vYi5wdHIgICAgPSBvb2JidWY7CisKKwlibG9ja3N0YXJ0ID0gbXRkb2Zmc2V0ICYgfihtZW1pbmZvLmVyYXNlc2l6ZSAtIDEpOworCWlmIChibG9ja3N0YXJ0ICE9IG10ZG9mZnNldCkgeworCQl1bnNpZ25lZCB0bXA7CisJCS8qIG10ZG9mZnNldCBpcyBpbiB0aGUgbWlkZGxlIG9mIGFuIGVyYXNlIGJsb2NrLCB2ZXJpZnkgdGhhdAorCQkgKiB0aGlzIGJsb2NrIGlzIE9LLiBBZHZhbmNlIG10ZG9mZnNldCBvbmx5IGlmIHRoaXMgYmxvY2sgaXMKKwkJICogYmFkLgorCQkgKi8KKwkJdG1wID0gbmV4dF9nb29kX2VyYXNlYmxvY2soZmQsICZtZW1pbmZvLCBibG9ja3N0YXJ0KTsKKwkJaWYgKHRtcCAhPSBibG9ja3N0YXJ0KSB7CisJCQkvKiBiYWQgYmxvY2socyksIGFkdmFuY2UgbXRkb2Zmc2V0ICovCisJCQlpZiAoSVNfTkFORERVTVAgJiAhKG9wdHMgJiBPUFRfYikpIHsKKwkJCQlpbnQgYmFkX2xlbiA9IE1JTih0bXAsIGVuZF9hZGRyKSAtIG10ZG9mZnNldDsKKwkJCQlkdW1wX2JhZCgmbWVtaW5mbywgYmFkX2xlbiwgIShvcHRzICYgT1BUX28pKTsKKwkJCX0KKwkJCW10ZG9mZnNldCA9IHRtcDsKKwkJfQorCX0KKworCWNudCA9IC0xOworCWxpbWl0ID0gTUlOKG1lbWluZm8uc2l6ZSwgZW5kX2FkZHIpOworCXdoaWxlIChtdGRvZmZzZXQgPCBsaW1pdCkgeworCQlpbnQgaW5wdXRfZmQgPSBJU19OQU5EV1JJVEUgPyBTVERJTl9GSUxFTk8gOiBmZDsKKwkJaW50IG91dHB1dF9mZCA9IElTX05BTkRXUklURSA/IGZkIDogU1RET1VUX0ZJTEVOTzsKKworCQlibG9ja3N0YXJ0ID0gbXRkb2Zmc2V0ICYgfihtZW1pbmZvLmVyYXNlc2l6ZSAtIDEpOworCQlpZiAoYmxvY2tzdGFydCA9PSBtdGRvZmZzZXQpIHsKKwkJCS8qIHN0YXJ0aW5nIGEgbmV3IGVyYXNlYmxvY2sgKi8KKwkJCW10ZG9mZnNldCA9IG5leHRfZ29vZF9lcmFzZWJsb2NrKGZkLCAmbWVtaW5mbywgYmxvY2tzdGFydCk7CisJCQlpZiAoSVNfTkFORFdSSVRFKQorCQkJCXByaW50ZigiV3JpdGluZyBhdCAweCUwOHhcbiIsIG10ZG9mZnNldCk7CisJCQllbHNlIGlmIChtdGRvZmZzZXQgPiBibG9ja3N0YXJ0KSB7CisJCQkJaW50IGJhZF9sZW4gPSBNSU4obXRkb2Zmc2V0LCBsaW1pdCkgLSBibG9ja3N0YXJ0OworCQkJCWR1bXBfYmFkKCZtZW1pbmZvLCBiYWRfbGVuLCAhKG9wdHMgJiBPUFRfbykpOworCQkJfQorCQkJaWYgKG10ZG9mZnNldCA+PSBsaW1pdCkKKwkJCQlicmVhazsKKwkJfQorCQl4bHNlZWsoZmQsIG10ZG9mZnNldCwgU0VFS19TRVQpOworCisJCS8qIGdldCBzb21lIG1vcmUgZGF0YSBmcm9tIGlucHV0ICovCisJCWNudCA9IGZ1bGxfcmVhZChpbnB1dF9mZCwgZmlsZWJ1ZiwgbWVtaW5mb193cml0ZXNpemUpOworCQlpZiAoY250ID09IDApIHsKKwkJCS8qIGV2ZW4gd2l0aCAtcCwgd2UgZG8gbm90IHBhZCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQKKwkJCSAqICgtcCBvbmx5IHplcm8tcGFkcyBsYXN0IGluY29tcGxldGUgcGFnZSkKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNudCA8IG1lbWluZm9fd3JpdGVzaXplKSB7CisJCQlpZiAoSVNfTkFORERVTVApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkJCWlmICghKG9wdHMgJiBPUFRfcCkpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlucHV0IHNpemUgaXMgbm90IHJvdW5kZWQgdXAgdG8gcGFnZSBzaXplLCAiCisJCQkJCQkidXNlIC1wIHRvIHplcm8gcGFkIik7CisJCQkvKiB6ZXJvIHBhZCB0byBlbmQgb2Ygd3JpdGUgYmxvY2sgKi8KKwkJCW1lbXNldChmaWxlYnVmICsgY250LCAwLCBtZW1pbmZvX3dyaXRlc2l6ZSAtIGNudCk7CisJCX0KKwkJeHdyaXRlKG91dHB1dF9mZCwgZmlsZWJ1ZiwgbWVtaW5mb193cml0ZXNpemUpOworCisJCWlmIChJU19OQU5ERFVNUCAmJiAhKG9wdHMgJiBPUFRfbykpIHsKKwkJCS8qIER1bXAgT09CIGRhdGEgKi8KKwkJCW9vYi5zdGFydCA9IG10ZG9mZnNldDsKKwkJCXhpb2N0bChmZCwgTUVNUkVBRE9PQiwgJm9vYik7CisJCQl4d3JpdGUob3V0cHV0X2ZkLCBvb2JidWYsIG1lbWluZm8ub29ic2l6ZSk7CisJCX0KKworCQltdGRvZmZzZXQgKz0gbWVtaW5mb193cml0ZXNpemU7CisJCWlmIChjbnQgPCBtZW1pbmZvX3dyaXRlc2l6ZSkKKwkJCWJyZWFrOworCX0KKworCWlmIChJU19OQU5EV1JJVEUgJiYgY250ICE9IDApIHsKKwkJLyogV2UgZmlsbGVkIGVudGlyZSBNVEQsIGJ1dCBkaWQgd2UgcmVhY2ggRU9GIG9uIGlucHV0PyAqLworCQlpZiAoZnVsbF9yZWFkKFNURElOX0ZJTEVOTywgZmlsZWJ1ZiwgbWVtaW5mb193cml0ZXNpemUpICE9IDApIHsKKwkJCS8qIG5vICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGVub3VnaCBzcGFjZSBpbiBNVEQgZGV2aWNlIik7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShmaWxlYnVmKTsKKwkJY2xvc2UoZmQpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvcmFpZGF1dG9ydW4uYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9yYWlkYXV0b3J1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MmQ4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvcmFpZGF1dG9ydW4uYwpAQCAtMCwwICsxLDI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByYWlkYXV0b3J1biBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcmFpZGF1dG9ydW5fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkRFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSByYWlkYXV0b3J1bl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlRlbGwgdGhlIGtlcm5lbCB0byBhdXRvbWF0aWNhbGx5IHNlYXJjaCBhbmQgc3RhcnQgUkFJRCBhcnJheXMiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJhaWRhdXRvcnVuX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJhaWRhdXRvcnVuIC9kZXYvbWQwIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvcmFpZC9tZF91Lmg+CisKK2ludCByYWlkYXV0b3J1bl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmFpZGF1dG9ydW5fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXhpb2N0bCh4b3BlbihzaW5nbGVfYXJndihhcmd2KSwgT19SRE9OTFkpLCBSQUlEX0FVVE9SVU4sIE5VTEwpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvcmVhZGFoZWFkLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvcmVhZGFoZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyYWFhNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9yZWFkYWhlYWQuYwpAQCAtMCwwICsxLDQ3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZWFkYWhlYWQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBQcmVsb2FkcyB0aGUgZ2l2ZW4gZmlsZXMgaW4gUkFNLCB0byByZWR1Y2UgYWNjZXNzIHRpbWUuCisgKiBEb2VzIHRoaXMgYnkgY2FsbGluZyB0aGUgcmVhZGFoZWFkKDIpIHN5c3RlbSBjYWxsLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgTWljaGFlbCBPcGRlbmFja2VyIDxtaWNoYWVsQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByZWFkYWhlYWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSByZWFkYWhlYWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmVsb2FkIEZJTEVzIHRvIFJBTSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCByZWFkYWhlYWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlYWRhaGVhZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKworCWlmICghYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJd2hpbGUgKCorK2FyZ3YpIHsKKwkJaW50IGZkID0gb3Blbl9vcl93YXJuKCphcmd2LCBPX1JET05MWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlvZmZfdCBsZW47CisJCQlpbnQgcjsKKworCQkJLyogZmRsZW5ndGggd2FzIHJlcG9ydGVkIHRvIGJlIHVucmVsaWFibGUgLSB1c2Ugc2VlayAqLworCQkJbGVuID0geGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7CisJCQl4bHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwkJCXIgPSByZWFkYWhlYWQoZmQsIDAsIGxlbik7CisJCQljbG9zZShmZCk7CisJCQlpZiAociA+PSAwKQorCQkJCWNvbnRpbnVlOworCQl9CisJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3Jma2lsbC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3Jma2lsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NzE5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvcmZraWxsLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyogcmZraWxsIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisqCisqIENvcHlyaWdodCAoQykgMjAxMCAgTWFsZWsgRGVnYWNoaSA8bWFsZWstZGVnYWNoaUBsYXBvc3RlLm5ldD4KKyoKKyogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyovCisKKy8vdXNhZ2U6I2RlZmluZSByZmtpbGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkNPTU1BTkQgW0lOREVYfFRZUEVdIgorLy91c2FnZTojZGVmaW5lIHJma2lsbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkVuYWJsZS9kaXNhYmxlIHdpcmVsZXNzIGRldmljZXNcbiIKKy8vdXNhZ2U6ICAgICAgICJcbkNvbW1hbmRzOiIKKy8vdXNhZ2U6ICAgICAiXG4JbGlzdCBbSU5ERVh8VFlQRV0JTGlzdCBjdXJyZW50IHN0YXRlIgorLy91c2FnZTogICAgICJcbglibG9jayBJTkRFWHxUWVBFCURpc2FibGUgZGV2aWNlIgorLy91c2FnZTogICAgICJcbgl1bmJsb2NrIElOREVYfFRZUEUJRW5hYmxlIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuCVRZUEU6IGFsbCwgd2xhbih3aWZpKSwgYmx1ZXRvb3RoLCB1d2IodWx0cmF3aWRlYmFuZCksIgorLy91c2FnZTogICAgICJcbgkJd2ltYXgsIHd3YW4sIGdwcywgZm0iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgorCitlbnVtIHsKKwlPUFRfYiA9ICgxIDw8IDApLCAvKiBtdXN0IGJlID0gMSAqLworCU9QVF91ID0gKDEgPDwgMSksCisJT1BUX2wgPSAoMSA8PCAyKSwKK307CisKK2ludCByZmtpbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJma2lsbF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJma2lsbF9ldmVudCBldmVudDsKKwljb25zdCBjaGFyICpyZl9uYW1lOworCWludCByZl9mZDsKKwlpbnQgbW9kZTsKKwlpbnQgcmZfdHlwZTsKKwlpbnQgcmZfaWR4OworCXVuc2lnbmVkIHJmX29wdCA9IDA7CisKKwlhcmd2Kys7CisJLyogTXVzdCBoYXZlIG9uZSBvciB0d28gcGFyYW1zICovCisJaWYgKCFhcmd2WzBdIHx8IChhcmd2WzFdICYmIGFyZ3ZbMl0pKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwltb2RlID0gT19SRFdSIHwgT19OT05CTE9DSzsKKwlyZl9uYW1lID0gYXJndlsxXTsKKwlpZiAoc3RyY21wKGFyZ3ZbMF0sICJsaXN0IikgPT0gMCkgeworCQlyZl9vcHQgfD0gT1BUX2w7CisJCW1vZGUgPSBPX1JET05MWSB8IE9fTk9OQkxPQ0s7CisJfSBlbHNlIGlmIChzdHJjbXAoYXJndlswXSwgImJsb2NrIikgPT0gMCAmJiByZl9uYW1lKSB7CisJCXJmX29wdCB8PSBPUFRfYjsKKwl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzBdLCAidW5ibG9jayIpID09IDAgJiYgcmZfbmFtZSkgeworCQlyZl9vcHQgfD0gT1BUX3U7CisJfSBlbHNlCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCXJmX3R5cGUgPSBSRktJTExfVFlQRV9BTEw7CisJcmZfaWR4ID0gLTE7CisJaWYgKHJmX25hbWUpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgcmZraWxsX3R5cGVzW10gQUxJR04xID0gImFsbFwwd2xhblwwYmx1ZXRvb3RoXDB1d2JcMHdpbWF4XDB3d2FuXDBncHNcMGZtXDAiOworCQlpZiAoc3RyY21wKHJmX25hbWUsICJ3aWZpIikgPT0gMCkKKwkJCXJmX25hbWUgPSAid2xhbiI7CisJCWlmIChzdHJjbXAocmZfbmFtZSwgInVsdHJhd2lkZWJhbmQiKSA9PSAwKQorCQkJcmZfbmFtZSA9ICJ1d2IiOworCQlyZl90eXBlID0gaW5kZXhfaW5fc3RyaW5ncyhyZmtpbGxfdHlwZXMsIHJmX25hbWUpOworCQlpZiAocmZfdHlwZSA8IDApIHsKKwkJCXJmX2lkeCA9IHhhdG9pX3Bvc2l0aXZlKHJmX25hbWUpOworCQl9CisJfQorCisJcmZfZmQgPSBkZXZpY2Vfb3BlbigiL2Rldi9yZmtpbGwiLCBtb2RlKTsKKwlpZiAocmZfZmQgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIi9kZXYvcmZraWxsIik7CisKKwlpZiAocmZfb3B0ICYgT1BUX2wpIHsKKwkJd2hpbGUgKGZ1bGxfcmVhZChyZl9mZCwgJmV2ZW50LCBzaXplb2YoZXZlbnQpKSA9PSBSRktJTExfRVZFTlRfU0laRV9WMSkgeworCQkJcGFyc2VyX3QgKnBhcnNlcjsKKwkJCWNoYXIgKnRva2Vuc1syXTsKKwkJCWNoYXIgcmZfc3lzZnNbc2l6ZW9mKCIvc3lzL2NsYXNzL3Jma2lsbC9yZmtpbGwldS91ZXZlbnQiKSArIHNpemVvZihpbnQpKjNdOworCQkJY2hhciAqbmFtZSwgKnR5cGU7CisKKwkJCWlmIChyZl90eXBlICYmIHJmX3R5cGUgIT0gZXZlbnQudHlwZSAmJiByZl9pZHggPCAwKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChyZl9pZHggPj0gMCAmJiBldmVudC5pZHggIT0gcmZfaWR4KSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCW5hbWUgPSBOVUxMOworCQkJdHlwZSA9IE5VTEw7CisJCQlzcHJpbnRmKHJmX3N5c2ZzLCAiL3N5cy9jbGFzcy9yZmtpbGwvcmZraWxsJXUvdWV2ZW50IiwgZXZlbnQuaWR4KTsKKwkJCXBhcnNlciA9IGNvbmZpZ19vcGVuMihyZl9zeXNmcywgZm9wZW5fZm9yX3JlYWQpOworCQkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCAyLCAyLCAiXG49IiwgUEFSU0VfTk9STUFMKSkgeworCQkJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiUkZLSUxMX05BTUUiKSA9PSAwKSB7CisJCQkJCW5hbWUgPSB4c3RyZHVwKHRva2Vuc1sxXSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoc3RyY21wKHRva2Vuc1swXSwgIlJGS0lMTF9UWVBFIikgPT0gMCkgeworCQkJCQl0eXBlID0geHN0cmR1cCh0b2tlbnNbMV0pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQljb25maWdfY2xvc2UocGFyc2VyKTsKKworCQkJcHJpbnRmKCIldTogJXM6ICVzXG4iLCBldmVudC5pZHgsIG5hbWUsIHR5cGUpOworCQkJcHJpbnRmKCJcdFNvZnQgYmxvY2tlZDogJXNcbiIsIGV2ZW50LnNvZnQgPyAieWVzIiA6ICJubyIpOworCQkJcHJpbnRmKCJcdEhhcmQgYmxvY2tlZDogJXNcbiIsIGV2ZW50LmhhcmQgPyAieWVzIiA6ICJubyIpOworCQkJZnJlZShuYW1lKTsKKwkJCWZyZWUodHlwZSk7CisJCX0KKwl9IGVsc2UgeworCQltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKKwkJaWYgKHJmX3R5cGUgPj0gMCkgeworCQkJZXZlbnQudHlwZSA9IHJmX3R5cGU7CisJCQlldmVudC5vcCA9IFJGS0lMTF9PUF9DSEFOR0VfQUxMOworCQl9CisKKwkJaWYgKHJmX2lkeCA+PSAwKSB7CisJCQlldmVudC5pZHggPSByZl9pZHg7CisJCQlldmVudC5vcCA9IFJGS0lMTF9PUF9DSEFOR0U7CisJCX0KKworCQkvKiBOb3RlOiBPUFRfYiA9PSAxICovCisJCWV2ZW50LnNvZnQgPSAocmZfb3B0ICYgT1BUX2IpOworCisJCXh3cml0ZShyZl9mZCwgJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3J1bmxldmVsLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvcnVubGV2ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDM4Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3J1bmxldmVsLmMKQEAgLTAsMCArMSw1NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUHJpbnRzIG91dCB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IHJ1bmxldmVsLgorICoKKyAqIFZlcnNpb246IEAoIylydW5sZXZlbCAgMS4yMCAgMTYtQXByLTE5OTcgIE12UworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBzeXN2aW5pdCBzdWl0ZSwKKyAqIENvcHlyaWdodCAxOTkxLTE5OTcgTWlxdWVsIHZhbiBTbW9vcmVuYnVyZy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIGluaXRpYWxseSBidXN5Ym94aWZpZWQgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKi8KKyAKKy8vdXNhZ2U6I2RlZmluZSBydW5sZXZlbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW0ZJTEVdIgorLy91c2FnZTojZGVmaW5lIHJ1bmxldmVsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRmluZCB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3lzdGVtIHJ1bmxldmVsXG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiSWYgbm8gdXRtcCBGSUxFIGV4aXN0cyBvciBpZiBubyBydW5sZXZlbCByZWNvcmQgY2FuIGJlIGZvdW5kLFxuIgorLy91c2FnZTogICAgICAgInByaW50IFwidW5rbm93blwiIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBydW5sZXZlbF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBydW5sZXZlbCAvdmFyL3J1bi91dG1wXG4iCisvL3VzYWdlOiAgICAgICAiTiAyIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHJ1bmxldmVsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBydW5sZXZlbF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHV0bXAgKnV0OworCWNoYXIgcHJldjsKKworCWlmIChhcmd2WzFdKSB1dG1wbmFtZShhcmd2WzFdKTsKKworCXNldHV0ZW50KCk7CisJd2hpbGUgKCh1dCA9IGdldHV0ZW50KCkpICE9IE5VTEwpIHsKKwkJaWYgKHV0LT51dF90eXBlID09IFJVTl9MVkwpIHsKKwkJCXByZXYgPSB1dC0+dXRfcGlkIC8gMjU2OworCQkJaWYgKHByZXYgPT0gMCkgcHJldiA9ICdOJzsKKwkJCXByaW50ZigiJWMgJWNcbiIsIHByZXYsIHV0LT51dF9waWQgJSAyNTYpOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWVuZHV0ZW50KCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXB1dHMoInVua25vd24iKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZW5kdXRlbnQoKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9yeC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyMjU3NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9yeC5jCkBAIC0wLDAgKzEsMjc1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQ6ICAgICBDb3B5cmlnaHQgKEMpIDIwMDEsIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKiBBdXRob3I6ICAgICAgICBDaHJpc3RvcGhlciBIb292ZXIgPGNoQGhwbC5ocC5jb20+CisgKiBEZXNjcmlwdGlvbjogICB4bW9kZW0gZnVuY3Rpb25hbGl0eSBmb3IgdXBsb2FkaW5nIG9mIGtlcm5lbHMKKyAqICAgICAgICAgICAgICAgIGFuZCB0aGUgbGlrZQorICogQ3JlYXRlZCBhdDogICAgVGh1IERlYyAyMCAwMTo1ODowOCBQU1QgMjAwMQorICoKKyAqIHhtb2RlbSBmdW5jdGlvbmFsaXR5IGZvciB1cGxvYWRpbmcgb2Yga2VybmVscyBhbmQgdGhlIGxpa2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSGV3bGV0dC1QYWNrYXJkIExhYm9yYXRvcmllcworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGZvciBibG9iIGFuZCB0aGVuIGFkYXB0ZWQgZm9yIGJ1c3lib3guCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJ4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFIgorLy91c2FnZTojZGVmaW5lIHJ4X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVjZWl2ZSBhIGZpbGUgdXNpbmcgdGhlIHhtb2RlbSBwcm90b2NvbCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcnhfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcnggL3RtcC9mb29cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgU09IIDB4MDEKKyNkZWZpbmUgU1RYIDB4MDIKKyNkZWZpbmUgRU9UIDB4MDQKKyNkZWZpbmUgQUNLIDB4MDYKKyNkZWZpbmUgTkFLIDB4MTUKKyNkZWZpbmUgQlMgIDB4MDgKKyNkZWZpbmUgUEFEIDB4MUEKKworLyoKK0NmOgorICBodHRwOi8vd3d3LnRleHRmaWxlcy5jb20vYXBwbGUveG1vZGVtCisgIGh0dHA6Ly93d3cucGh5cy53YXNoaW5ndG9uLmVkdS9+YmVsb25pcy94bW9kZW0vZG9jeG1vZGVtLnR4dAorICBodHRwOi8vd3d3LnBoeXMud2FzaGluZ3Rvbi5lZHUvfmJlbG9uaXMveG1vZGVtL2RvY3ltb2RlbS50eHQKKyAgaHR0cDovL3d3dy5waHlzLndhc2hpbmd0b24uZWR1L35iZWxvbmlzL3htb2RlbS9tb2RtcHJvdC5jb2wKKyovCisKKyNkZWZpbmUgVElNRU9VVCAxCisjZGVmaW5lIFRJTUVPVVRfTE9ORyAxMAorI2RlZmluZSBNQVhFUlJPUlMgMTAKKworI2RlZmluZSByZWFkX2ZkICBTVERJTl9GSUxFTk8KKyNkZWZpbmUgd3JpdGVfZmQgU1RET1VUX0ZJTEVOTworCitzdGF0aWMgaW50IHJlYWRfYnl0ZSh1bnNpZ25lZCB0aW1lb3V0KQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCBuOworCisJYWxhcm0odGltZW91dCk7CisJLyogTk9UIHNhZmVfcmVhZCEgV2Ugd2FudCBBTFJNIHRvIGludGVycnVwdCB1cyAqLworCW4gPSByZWFkKHJlYWRfZmQsICZidWYsIDEpOworCWFsYXJtKDApOworCWlmIChuID09IDEpCisJCXJldHVybiBidWY7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJlY2VpdmUoLyppbnQgcmVhZF9mZCwgKi9pbnQgZmlsZV9mZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJsb2NrQnVmWzEwMjRdOworCXVuc2lnbmVkIGJsb2NrTGVuZ3RoID0gMDsKKwl1bnNpZ25lZCBlcnJvcnMgPSAwOworCXVuc2lnbmVkIHdhbnRCbG9ja05vID0gMTsKKwl1bnNpZ25lZCBsZW5ndGggPSAwOworCWludCBkb19jcmMgPSAxOworCWNoYXIgcmVwbHlfY2hhcjsKKwl1bnNpZ25lZCB0aW1lb3V0ID0gVElNRU9VVF9MT05HOworCisJLyogRmx1c2ggcGVuZGluZyBpbnB1dCAqLworCXRjZmx1c2gocmVhZF9mZCwgVENJRkxVU0gpOworCisJLyogQXNrIGZvciBDUkM7IGlmIHdlIGdldCBlcnJvcnMsIHdlIHdpbGwgZ28gd2l0aCBjaGVja3N1bSAqLworCXJlcGx5X2NoYXIgPSAnQyc7CisJZnVsbF93cml0ZSh3cml0ZV9mZCwgJnJlcGx5X2NoYXIsIDEpOworCisJZm9yICg7OykgeworCQlpbnQgYmxvY2tCZWdpbjsKKwkJaW50IGJsb2NrTm8sIGJsb2NrTm9PbmVzQ29tcGw7CisJCWludCBja3N1bV9vcl9jcmM7CisJCWludCBleHBlY3RlZDsKKwkJaW50IGksIGo7CisKKwkJYmxvY2tCZWdpbiA9IHJlYWRfYnl0ZSh0aW1lb3V0KTsKKwkJaWYgKGJsb2NrQmVnaW4gPCAwKQorCQkJZ290byB0aW1lb3V0OworCisJCS8qIElmIGxhc3QgYmxvY2ssIHJlbW92ZSBwYWRkaW5nICovCisJCWlmIChibG9ja0JlZ2luID09IEVPVCkgeworCQkJLyogRGF0YSBibG9ja3MgY2FuIGJlIHBhZGRlZCB3aXRoIF5aIGNoYXJhY3RlcnMgKi8KKwkJCS8qIFRoaXMgY29kZSB0cmllcyB0byBkZXRlY3QgYW5kIHJlbW92ZSB0aGVtICovCisJCQlpZiAoYmxvY2tMZW5ndGggPj0gMworCQkJICYmIGJsb2NrQnVmW2Jsb2NrTGVuZ3RoIC0gMV0gPT0gUEFECisJCQkgJiYgYmxvY2tCdWZbYmxvY2tMZW5ndGggLSAyXSA9PSBQQUQKKwkJCSAmJiBibG9ja0J1ZltibG9ja0xlbmd0aCAtIDNdID09IFBBRAorCQkJKSB7CisJCQkJd2hpbGUgKGJsb2NrTGVuZ3RoCisJCQkgICAgICAgICAgICYmIGJsb2NrQnVmW2Jsb2NrTGVuZ3RoIC0gMV0gPT0gUEFECisJCQkJKSB7CisJCQkJCWJsb2NrTGVuZ3RoLS07CisJCQkJfQorCQkJfQorCQl9CisJCS8qIFdyaXRlIHByZXZpb3VzbHkgcmVjZWl2ZWQgYmxvY2sgKi8KKwkJaWYgKGJsb2NrTGVuZ3RoKSB7CisJCQllcnJubyA9IDA7CisJCQlpZiAoZnVsbF93cml0ZShmaWxlX2ZkLCBibG9ja0J1ZiwgYmxvY2tMZW5ndGgpICE9IGJsb2NrTGVuZ3RoKSB7CisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgd3JpdGUgdG8gZmlsZSIpOworCQkJCWdvdG8gZmF0YWw7CisJCQl9CisJCX0KKworCQl0aW1lb3V0ID0gVElNRU9VVDsKKwkJcmVwbHlfY2hhciA9IE5BSzsKKworCQlzd2l0Y2ggKGJsb2NrQmVnaW4pIHsKKwkJY2FzZSBTT0g6CisJCWNhc2UgU1RYOgorCQkJYnJlYWs7CisJCWNhc2UgRU9UOgorCQkJcmVwbHlfY2hhciA9IEFDSzsKKwkJCWZ1bGxfd3JpdGUod3JpdGVfZmQsICZyZXBseV9jaGFyLCAxKTsKKwkJCXJldHVybiBsZW5ndGg7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogQmxvY2sgbm8gKi8KKwkJYmxvY2tObyA9IHJlYWRfYnl0ZShUSU1FT1VUKTsKKwkJaWYgKGJsb2NrTm8gPCAwKQorCQkJZ290byB0aW1lb3V0OworCisJCS8qIEJsb2NrIG5vLCBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0gKi8KKwkJYmxvY2tOb09uZXNDb21wbCA9IHJlYWRfYnl0ZShUSU1FT1VUKTsKKwkJaWYgKGJsb2NrTm9PbmVzQ29tcGwgPCAwKQorCQkJZ290byB0aW1lb3V0OworCisJCWlmIChibG9ja05vICE9ICgyNTUgLSBibG9ja05vT25lc0NvbXBsKSkgeworCQkJYmJfZXJyb3JfbXNnKCJiYWQgYmxvY2sgb25lcyBjb21wbCIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWJsb2NrTGVuZ3RoID0gKGJsb2NrQmVnaW4gPT0gU09IKSA/IDEyOCA6IDEwMjQ7CisKKwkJZm9yIChpID0gMDsgaSA8IGJsb2NrTGVuZ3RoOyBpKyspIHsKKwkJCWludCBjYyA9IHJlYWRfYnl0ZShUSU1FT1VUKTsKKwkJCWlmIChjYyA8IDApCisJCQkJZ290byB0aW1lb3V0OworCQkJYmxvY2tCdWZbaV0gPSBjYzsKKwkJfQorCisJCWlmIChkb19jcmMpIHsKKwkJCWNrc3VtX29yX2NyYyA9IHJlYWRfYnl0ZShUSU1FT1VUKTsKKwkJCWlmIChja3N1bV9vcl9jcmMgPCAwKQorCQkJCWdvdG8gdGltZW91dDsKKwkJCWNrc3VtX29yX2NyYyA9IChja3N1bV9vcl9jcmMgPDwgOCkgfCByZWFkX2J5dGUoVElNRU9VVCk7CisJCQlpZiAoY2tzdW1fb3JfY3JjIDwgMCkKKwkJCQlnb3RvIHRpbWVvdXQ7CisJCX0gZWxzZSB7CisJCQlja3N1bV9vcl9jcmMgPSByZWFkX2J5dGUoVElNRU9VVCk7CisJCQlpZiAoY2tzdW1fb3JfY3JjIDwgMCkKKwkJCQlnb3RvIHRpbWVvdXQ7CisJCX0KKworCQlpZiAoYmxvY2tObyA9PSAoKHdhbnRCbG9ja05vIC0gMSkgJiAweGZmKSkgeworCQkJLyogYSByZXBlYXQgb2YgdGhlIGxhc3QgYmxvY2sgaXMgb2ssIGp1c3QgaWdub3JlIGl0LiAqLworCQkJLyogdGhpcyBhbHNvIGlnbm9yZXMgdGhlIGluaXRpYWwgYmxvY2sgMCB3aGljaCBpcyAqLworCQkJLyogbWV0YSBkYXRhLiAqLworCQkJZ290byBuZXh0OworCQl9CisJCWlmIChibG9ja05vICE9ICh3YW50QmxvY2tObyAmIDB4ZmYpKSB7CisJCQliYl9lcnJvcl9tc2coInVuZXhwZWN0ZWQgYmxvY2sgbm8sIDB4JTA4eCwgZXhwZWN0aW5nIDB4JTA4eCIsIGJsb2NrTm8sIHdhbnRCbG9ja05vKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlleHBlY3RlZCA9IDA7CisJCWlmIChkb19jcmMpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBibG9ja0xlbmd0aDsgaSsrKSB7CisJCQkJZXhwZWN0ZWQgPSBleHBlY3RlZCBeIGJsb2NrQnVmW2ldIDw8IDg7CisJCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJCQlpZiAoZXhwZWN0ZWQgJiAweDgwMDApCisJCQkJCQlleHBlY3RlZCA9IChleHBlY3RlZCA8PCAxKSBeIDB4MTAyMTsKKwkJCQkJZWxzZQorCQkJCQkJZXhwZWN0ZWQgPSAoZXhwZWN0ZWQgPDwgMSk7CisJCQkJfQorCQkJfQorCQkJZXhwZWN0ZWQgJj0gMHhmZmZmOworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IGJsb2NrTGVuZ3RoOyBpKyspCisJCQkJZXhwZWN0ZWQgKz0gYmxvY2tCdWZbaV07CisJCQlleHBlY3RlZCAmPSAweGZmOworCQl9CisJCWlmIChja3N1bV9vcl9jcmMgIT0gZXhwZWN0ZWQpIHsKKwkJCWJiX2Vycm9yX21zZyhkb19jcmMgPyAiY3JjIGVycm9yLCBleHBlY3RlZCAweCUwNHgsIGdvdCAweCUwNHgiCisJCQkgICAgICAgICAgICAgICAgICAgOiAiY2hlY2tzdW0gZXJyb3IsIGV4cGVjdGVkIDB4JTAyeCwgZ290IDB4JTAyeCIsCisJCQkJCWV4cGVjdGVkLCBja3N1bV9vcl9jcmMpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXdhbnRCbG9ja05vKys7CisJCWxlbmd0aCArPSBibG9ja0xlbmd0aDsKKyBuZXh0OgorCQllcnJvcnMgPSAwOworCQlyZXBseV9jaGFyID0gQUNLOworCQlmdWxsX3dyaXRlKHdyaXRlX2ZkLCAmcmVwbHlfY2hhciwgMSk7CisJCWNvbnRpbnVlOworIGVycm9yOgorIHRpbWVvdXQ6CisJCWVycm9ycysrOworCQlpZiAoZXJyb3JzID09IE1BWEVSUk9SUykgeworCQkJLyogQWJvcnQgKi8KKworCQkJLyogSWYgd2VyZSBhc2tpbmcgZm9yIGNyYywgdHJ5IGFnYWluIHcvbyBjcmMgKi8KKwkJCWlmIChyZXBseV9jaGFyID09ICdDJykgeworCQkJCXJlcGx5X2NoYXIgPSBOQUs7CisJCQkJZXJyb3JzID0gMDsKKwkJCQlkb19jcmMgPSAwOworCQkJCWdvdG8gdGltZW91dDsKKwkJCX0KKwkJCWJiX2Vycm9yX21zZygidG9vIG1hbnkgZXJyb3JzOyBnaXZpbmcgdXAiKTsKKyBmYXRhbDoKKwkJCS8qIDUgQ0FOIGZvbGxvd2VkIGJ5IDUgQlMuIERvbid0IHRyeSB0b28gaGFyZC4uLiAqLworCQkJc2FmZV93cml0ZSh3cml0ZV9mZCwgIlwwMzBcMDMwXDAzMFwwMzBcMDMwXDAxMFwwMTBcMDEwXDAxMFwwMTAiLCAxMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBGbHVzaCBwZW5kaW5nIGlucHV0ICovCisJCXRjZmx1c2gocmVhZF9mZCwgVENJRkxVU0gpOworCisJCWZ1bGxfd3JpdGUod3JpdGVfZmQsICZyZXBseV9jaGFyLCAxKTsKKwl9IC8qIGZvciAoOzspICovCit9CisKK3N0YXRpYyB2b2lkIHNpZ2Fscm1faGFuZGxlcihpbnQgVU5VU0VEX1BBUkFNIHNpZ251bSkKK3sKK30KKworaW50IHJ4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByeF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHRlcm1pb3MgdHR5LCBvcmlnX3R0eTsKKwlpbnQgdGVybWlvc19lcnI7CisJaW50IGZpbGVfZmQ7CisJaW50IG47CisKKwkvKiBEaXNhYmxlZCBieSB2ZGE6CisJICogd2h5IHdlIGNhbid0IHJlY2VpdmUgZnJvbSBzdGRpbj8gV2h5IHdlICpyZXF1aXJlKgorCSAqIGNvbnRyb2xsaW5nIHR0eT8/ICovCisJLypyZWFkX2ZkID0geG9wZW4oQ1VSUkVOVF9UVFksIE9fUkRXUik7Ki8KKwlmaWxlX2ZkID0geG9wZW4oc2luZ2xlX2FyZ3YoYXJndiksIE9fUkRXUnxPX0NSRUFUfE9fVFJVTkMpOworCisJdGVybWlvc19lcnIgPSB0Y2dldGF0dHIocmVhZF9mZCwgJnR0eSk7CisJaWYgKHRlcm1pb3NfZXJyID09IDApIHsKKwkJb3JpZ190dHkgPSB0dHk7CisJCWNmbWFrZXJhdygmdHR5KTsKKwkJdGNzZXRhdHRyKHJlYWRfZmQsIFRDU0FGTFVTSCwgJnR0eSk7CisJfQorCisJLyogTm8gU0FfUkVTVEFSVDogd2Ugd2FudCBBTFJNIHRvIGludGVycnVwdCByZWFkKCkgKi8KKwlzaWduYWxfbm9fU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR0FMUk0sIHNpZ2Fscm1faGFuZGxlcik7CisKKwluID0gcmVjZWl2ZShmaWxlX2ZkKTsKKworCWlmICh0ZXJtaW9zX2VyciA9PSAwKQorCQl0Y3NldGF0dHIocmVhZF9mZCwgVENTQUZMVVNILCAmb3JpZ190dHkpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoZmlsZV9mZCk7CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChuID49IDApOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3NldHNlcmlhbC5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3NldHNlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMDM0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvc2V0c2VyaWFsLmMKQEAgLTAsMCArMSw3NjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNldHNlcmlhbCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTWFyZWsgQmXEjWthIDx5dWVuQGtsYWNuby5zaz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBTRVRTRVJJQUwKKy8vY29uZmlnOglib29sICJzZXRzZXJpYWwiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUmV0cmlldmUgb3Igc2V0IExpbnV4IHNlcmlhbCBwb3J0LgorCisvL2FwcGxldDpJRl9TRVRTRVJJQUwoQVBQTEVUKHNldHNlcmlhbCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1NFVFNFUklBTCkgKz0gc2V0c2VyaWFsLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpZm5kZWYgUE9SVF9VTktOT1dOCisjIGRlZmluZSBQT1JUX1VOS05PV04gICAgICAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgUE9SVF84MjUwCisjIGRlZmluZSBQT1JUXzgyNTAgICAgICAgICAgICAgICAxCisjZW5kaWYKKyNpZm5kZWYgUE9SVF8xNjQ1MAorIyBkZWZpbmUgUE9SVF8xNjQ1MCAgICAgICAgICAgICAgMgorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY1NTAKKyMgZGVmaW5lIFBPUlRfMTY1NTAgICAgICAgICAgICAgIDMKKyNlbmRpZgorI2lmbmRlZiBQT1JUXzE2NTUwQQorIyBkZWZpbmUgUE9SVF8xNjU1MEEgICAgICAgICAgICAgNAorI2VuZGlmCisjaWZuZGVmIFBPUlRfQ0lSUlVTCisjIGRlZmluZSBQT1JUX0NJUlJVUyAgICAgICAgICAgICA1CisjZW5kaWYKKyNpZm5kZWYgUE9SVF8xNjY1MAorIyBkZWZpbmUgUE9SVF8xNjY1MCAgICAgICAgICAgICAgNgorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY2NTBWMgorIyBkZWZpbmUgUE9SVF8xNjY1MFYyICAgICAgICAgICAgNworI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY3NTAKKyMgZGVmaW5lIFBPUlRfMTY3NTAgICAgICAgICAgICAgIDgKKyNlbmRpZgorI2lmbmRlZiBQT1JUX1NUQVJURUNICisjIGRlZmluZSBQT1JUX1NUQVJURUNIICAgICAgICAgICA5CisjZW5kaWYKKyNpZm5kZWYgUE9SVF8xNkM5NTAKKyMgZGVmaW5lIFBPUlRfMTZDOTUwICAgICAgICAgICAgMTAKKyNlbmRpZgorI2lmbmRlZiBQT1JUXzE2NjU0CisjIGRlZmluZSBQT1JUXzE2NjU0ICAgICAgICAgICAgIDExCisjZW5kaWYKKyNpZm5kZWYgUE9SVF8xNjg1MAorIyBkZWZpbmUgUE9SVF8xNjg1MCAgICAgICAgICAgICAxMgorI2VuZGlmCisjaWZuZGVmIFBPUlRfUlNBCisjIGRlZmluZSBQT1JUX1JTQSAgICAgICAgICAgICAgIDEzCisjZW5kaWYKKyNpZm5kZWYgUE9SVF9OUzE2NTUwQQorIyBkZWZpbmUgUE9SVF9OUzE2NTUwQSAgICAgICAgICAxNAorI2VuZGlmCisjaWZuZGVmIFBPUlRfWFNDQUxFCisjIGRlZmluZSBQT1JUX1hTQ0FMRSAgICAgICAgICAgIDE1CisjZW5kaWYKKyNpZm5kZWYgUE9SVF9STTkwMDAKKyMgZGVmaW5lIFBPUlRfUk05MDAwICAgICAgICAgICAgMTYKKyNlbmRpZgorI2lmbmRlZiBQT1JUX09DVEVPTgorIyBkZWZpbmUgUE9SVF9PQ1RFT04gICAgICAgICAgICAxNworI2VuZGlmCisjaWZuZGVmIFBPUlRfQVI3CisjIGRlZmluZSBQT1JUX0FSNyAgICAgICAgICAgICAgIDE4CisjZW5kaWYKKyNpZm5kZWYgUE9SVF9VNl8xNjU1MEEKKyMgZGVmaW5lIFBPUlRfVTZfMTY1NTBBICAgICAgICAgMTkKKyNlbmRpZgorCisjaWZuZGVmIEFTWU5DQl9IVVBfTk9USUZZCisjIGRlZmluZSBBU1lOQ0JfSFVQX05PVElGWSAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX0ZPVVJQT1JUCisjIGRlZmluZSBBU1lOQ0JfRk9VUlBPUlQgICAgICAgICAxCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX1NBSworIyBkZWZpbmUgQVNZTkNCX1NBSyAgICAgICAgICAgICAgMgorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TUExJVF9URVJNSU9TCisjIGRlZmluZSBBU1lOQ0JfU1BMSVRfVEVSTUlPUyAgICAzCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX1NQRF9ISQorIyBkZWZpbmUgQVNZTkNCX1NQRF9ISSAgICAgICAgICAgNAorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TUERfVkhJCisjIGRlZmluZSBBU1lOQ0JfU1BEX1ZISSAgICAgICAgICA1CisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX1NLSVBfVEVTVAorIyBkZWZpbmUgQVNZTkNCX1NLSVBfVEVTVCAgICAgICAgNgorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9BVVRPX0lSUQorIyBkZWZpbmUgQVNZTkNCX0FVVE9fSVJRICAgICAgICAgNworI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TRVNTSU9OX0xPQ0tPVVQKKyMgZGVmaW5lIEFTWU5DQl9TRVNTSU9OX0xPQ0tPVVQgIDgKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfUEdSUF9MT0NLT1VUCisjIGRlZmluZSBBU1lOQ0JfUEdSUF9MT0NLT1VUICAgICA5CisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX0NBTExPVVRfTk9IVVAKKyMgZGVmaW5lIEFTWU5DQl9DQUxMT1VUX05PSFVQICAgMTAKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfU1BEX1NISQorIyBkZWZpbmUgQVNZTkNCX1NQRF9TSEkgICAgICAgICAxMgorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9MT1dfTEFURU5DWQorIyBkZWZpbmUgQVNZTkNCX0xPV19MQVRFTkNZICAgICAxMworI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9CVUdHWV9VQVJUCisjIGRlZmluZSBBU1lOQ0JfQlVHR1lfVUFSVCAgICAgIDE0CisjZW5kaWYKKworI2lmbmRlZiBBU1lOQ19IVVBfTk9USUZZCisjIGRlZmluZSBBU1lOQ19IVVBfTk9USUZZICAgICAgICgxVSA8PCBBU1lOQ0JfSFVQX05PVElGWSkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19GT1VSUE9SVAorIyBkZWZpbmUgQVNZTkNfRk9VUlBPUlQgICAgICAgICAoMVUgPDwgQVNZTkNCX0ZPVVJQT1JUKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1NBSworIyBkZWZpbmUgQVNZTkNfU0FLICAgICAgICAgICAgICAoMVUgPDwgQVNZTkNCX1NBSykKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19TUExJVF9URVJNSU9TCisjIGRlZmluZSBBU1lOQ19TUExJVF9URVJNSU9TICAgICgxVSA8PCBBU1lOQ0JfU1BMSVRfVEVSTUlPUykKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19TUERfSEkKKyMgZGVmaW5lIEFTWU5DX1NQRF9ISSAgICAgICAgICAgKDFVIDw8IEFTWU5DQl9TUERfSEkpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BEX1ZISQorIyBkZWZpbmUgQVNZTkNfU1BEX1ZISSAgICAgICAgICAoMVUgPDwgQVNZTkNCX1NQRF9WSEkpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU0tJUF9URVNUCisjIGRlZmluZSBBU1lOQ19TS0lQX1RFU1QgICAgICAgICgxVSA8PCBBU1lOQ0JfU0tJUF9URVNUKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX0FVVE9fSVJRCisjIGRlZmluZSBBU1lOQ19BVVRPX0lSUSAgICAgICAgICgxVSA8PCBBU1lOQ0JfQVVUT19JUlEpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU0VTU0lPTl9MT0NLT1VUCisjIGRlZmluZSBBU1lOQ19TRVNTSU9OX0xPQ0tPVVQgICgxVSA8PCBBU1lOQ0JfU0VTU0lPTl9MT0NLT1VUKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1BHUlBfTE9DS09VVAorIyBkZWZpbmUgQVNZTkNfUEdSUF9MT0NLT1VUICAgICAoMVUgPDwgQVNZTkNCX1BHUlBfTE9DS09VVCkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19DQUxMT1VUX05PSFVQCisjIGRlZmluZSBBU1lOQ19DQUxMT1VUX05PSFVQICAgICgxVSA8PCBBU1lOQ0JfQ0FMTE9VVF9OT0hVUCkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19TUERfU0hJCisjIGRlZmluZSBBU1lOQ19TUERfU0hJICAgICAgICAgICgxVSA8PCBBU1lOQ0JfU1BEX1NISSkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19MT1dfTEFURU5DWQorIyBkZWZpbmUgQVNZTkNfTE9XX0xBVEVOQ1kgICAgICAoMVUgPDwgQVNZTkNCX0xPV19MQVRFTkNZKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX0JVR0dZX1VBUlQKKyMgZGVmaW5lIEFTWU5DX0JVR0dZX1VBUlQgICAgICAgKDFVIDw8IEFTWU5DQl9CVUdHWV9VQVJUKQorI2VuZGlmCisKKyNpZm5kZWYgQVNZTkNfU1BEX0NVU1QKKyMgZGVmaW5lIEFTWU5DX1NQRF9DVVNUICAgICAgICAgKEFTWU5DX1NQRF9ISXxBU1lOQ19TUERfVkhJKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1NQRF9XQVJQCisjIGRlZmluZSBBU1lOQ19TUERfV0FSUCAgICAgICAgIChBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1NISSkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19TUERfTUFTSworIyBkZWZpbmUgQVNZTkNfU1BEX01BU0sgICAgICAgICAoQVNZTkNfU1BEX0hJfEFTWU5DX1NQRF9WSEl8QVNZTkNfU1BEX1NISSkKKyNlbmRpZgorCisjaWZuZGVmIEFTWU5DX0NMT1NJTkdfV0FJVF9JTkYKKyMgZGVmaW5lIEFTWU5DX0NMT1NJTkdfV0FJVF9JTkYgICAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUKKyMgZGVmaW5lIEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FICAgICAgICA2NTUzNQorI2VuZGlmCisKKyNpZm5kZWYgX0xJTlVYX1NFUklBTF9ICitzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB7CisJaW50CXR5cGU7CisJaW50CWxpbmU7CisJdW5zaWduZWQgaW50CXBvcnQ7CisJaW50CWlycTsKKwlpbnQJZmxhZ3M7CisJaW50CXhtaXRfZmlmb19zaXplOworCWludAljdXN0b21fZGl2aXNvcjsKKwlpbnQJYmF1ZF9iYXNlOworCXVuc2lnbmVkIHNob3J0CWNsb3NlX2RlbGF5OworCWNoYXIJaW9fdHlwZTsKKwljaGFyCXJlc2VydmVkX2NoYXJbMV07CisJaW50CWh1YjY7CisJdW5zaWduZWQgc2hvcnQJY2xvc2luZ193YWl0OyAvKiB0aW1lIHRvIHdhaXQgYmVmb3JlIGNsb3NpbmcgKi8KKwl1bnNpZ25lZCBzaG9ydAljbG9zaW5nX3dhaXQyOyAvKiBubyBsb25nZXIgdXNlZC4uLiAqLworCXVuc2lnbmVkIGNoYXIJKmlvbWVtX2Jhc2U7CisJdW5zaWduZWQgc2hvcnQJaW9tZW1fcmVnX3NoaWZ0OworCXVuc2lnbmVkIGludAlwb3J0X2hpZ2g7CisJdW5zaWduZWQgbG9uZwlpb21hcF9iYXNlOwkvKiBjb29raWUgcGFzc2VkIGludG8gaW9yZW1hcCAqLworfTsKKyNlbmRpZgorCisvL3VzYWdlOiNkZWZpbmUgc2V0c2VyaWFsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLWdhYkd2elZdIERFVklDRSBbUEFSQU1FVEVSIFtBUkddXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzZXRzZXJpYWxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CSJSZXF1ZXN0IG9yIHNldCBMaW51eCBzZXJpYWwgcG9ydCBpbmZvcm1hdGlvblxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgktZwlJbnRlcnByZXQgcGFyYW1ldGVycyBhcyBsaXN0IG9mIGRldmljZXMgZm9yIHJlcG9ydGluZ1xuIgorLy91c2FnZToJIgktYQlQcmludCBhbGwgYXZhaWxhYmxlIGluZm9ybWF0aW9uXG4iCisvL3VzYWdlOgkiCS1iCVByaW50IHN1bW1hcnkgaW5mb3JtYXRpb25cbiIKKy8vdXNhZ2U6CSIJLUcJUHJpbnQgaW4gZm9ybSB3aGljaCBjYW4gYmUgZmVkIGJhY2tcbiIKKy8vdXNhZ2U6CSIJCXRvIHNldHNlcmlhbCBhcyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyc1xuIgorLy91c2FnZToJIgkteglaZXJvIG91dCBzZXJpYWwgZmxhZ3MgYmVmb3JlIHNldHRpbmdcbiIKKy8vdXNhZ2U6CSIJLXYJVmVyYm9zZVxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIlBhcmFtZXRlcnM6ICgqID0gdGFrZXMgYW4gYXJndW1lbnQsIF4gPSBjYW4gYmUgdHVybmVkIG9mZiBieSBwcmVjZWRpbmcgXilcbiIKKy8vdXNhZ2U6CSIJKnBvcnQsICppcnEsICpkaXZpc29yLCAqdWFydCwgKmJhdW5kX2Jhc2UsICpjbG9zZV9kZWxheSwgKmNsb3Npbmdfd2FpdCxcbiIKKy8vdXNhZ2U6CSIJXmZvdXJwb3J0LCBeYXV0b19pcnEsIF5za2lwX3Rlc3QsIF5zYWssIF5zZXNzaW9uX2xvY2tvdXQsIF5wZ3JwX2xvY2tvdXQsXG4iCisvL3VzYWdlOgkiCV5jYWxsb3V0X25vaHVwLCBec3BsaXRfdGVybWlvcywgXmh1cF9ub3RpZnksIF5sb3dfbGF0ZW5jeSwgYXV0b2NvbmZpZyxcbiIKKy8vdXNhZ2U6CSIJc3BkX25vcm1hbCwgc3BkX2hpLCBzcGRfdmhpLCBzcGRfc2hpLCBzcGRfd2FycCwgc3BkX2N1c3RcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJVQVJUIHR5cGVzOlxuIgorLy91c2FnZToJIgl1bmtub3duLCA4MjUwLCAxNjQ1MCwgMTY1NTAsIDE2NTUwQSwgQ2lycnVzLCAxNjY1MCwgMTY2NTBWMiwgMTY3NTAsXG4iCisvL3VzYWdlOgkiCTE2OTUwLCAxNjk1NCwgMTY2NTQsIDE2ODUwLCBSU0EsIE5TMTY1NTBBLCBYU0NBTEUsIFJNOTAwMCwgT0NURU9OLCBBUjcsXG4iCisvL3VzYWdlOgkiCVU2XzE2NTUwQSIKKworI2RlZmluZSBPUFRfUFJJTlRfU1VNTUFSWSAgICAgICAoMSA8PCAwKQorI2RlZmluZSBPUFRfUFJJTlRfRkVEQkFDSyAgICAgICAoMSA8PCAxKQorI2RlZmluZSBPUFRfUFJJTlRfQUxMICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBPUFRfVkVSQk9TRSAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBPUFRfWkVSTyAgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBPUFRfR0VUICAgICAgICAgICAgICAgICAoMSA8PCA1KQorCisjZGVmaW5lIE9QVF9NT0RFX01BU0sgXAorCShPUFRfUFJJTlRfQUxMIHwgT1BUX1BSSU5UX1NVTU1BUlkgfCBPUFRfUFJJTlRfRkVEQkFDSykKKworZW51bSBwcmludF9tb2RlCit7CisJUFJJTlRfTk9STUFMICA9IDAsCisJUFJJTlRfU1VNTUFSWSA9ICgxIDw8IDApLAorCVBSSU5UX0ZFREJBQ0sgPSAoMSA8PCAxKSwKKwlQUklOVF9BTEwgICAgID0gKDEgPDwgMiksCit9OworCisjZGVmaW5lIENUTF9TRVQgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENUTF9DT05GSUcgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIENUTF9HRVQgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIENUTF9DTE9TRSAgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIENUTF9OT0RJRSAgICAgICAgICAgICAgICgxIDw8IDQpCisKK3N0YXRpYyBjb25zdCBjaGFyIHNlcmlhbF90eXBlc1tdID0KKwkidW5rbm93blwwIgkJLyogMCAqLworCSI4MjUwXDAiCQkvKiAxICovCisJIjE2NDUwXDAiCQkvKiAyICovCisJIjE2NTUwXDAiCQkvKiAzICovCisJIjE2NTUwQVwwIgkJLyogNCAqLworCSJDaXJydXNcMCIJCS8qIDUgKi8KKwkiMTY2NTBcMCIJCS8qIDYgKi8KKwkiMTY2NTBWMlwwIgkJLyogNyAqLworCSIxNjc1MFwwIgkJLyogOCAqLworCSIxNjk1MFwwIgkJLyogOSBVTklNUExFTUVOVEVEOiBhbHNvIGtub3cgYXMgIjE2OTUwLzk1NCIgKi8KKwkiMTY5NTRcMCIJCS8qIDEwICovCisJIjE2NjU0XDAiCQkvKiAxMSAqLworCSIxNjg1MFwwIgkJLyogMTIgKi8KKwkiUlNBXDAiCQkJLyogMTMgKi8KKyNpZm5kZWYgU0VUU0VSSUFMX0JBU0UKKwkiTlMxNjU1MEFcMCIJCS8qIDE0ICovCisJIlhTQ0FMRVwwIgkJLyogMTUgKi8KKwkiUk05MDAwXDAiCQkvKiAxNiAqLworCSJPQ1RFT05cMCIJCS8qIDE3ICovCisJIkFSN1wwIgkJCS8qIDE4ICovCisJIlU2XzE2NTUwQVwwIgkJLyogMTkgKi8KKyNlbmRpZgorOworCisjaWZuZGVmIFNFVFNFUklBTF9CQVNFCisjIGRlZmluZSBNQVhfU0VSSUFMX1RZUEUJMTkKKyNlbHNlCisjIGRlZmluZSBNQVhfU0VSSUFMX1RZUEUJMTMKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBjb21tYW5kc1tdID0KKwkic3BkX25vcm1hbFwwIgorCSJzcGRfaGlcMCIKKwkic3BkX3ZoaVwwIgorCSJzcGRfc2hpXDAiCisJInNwZF93YXJwXDAiCisJInNwZF9jdXN0XDAiCisKKwkic2FrXDAiCisJImZvdXJwb3J0XDAiCisJImh1cF9ub3RpZnlcMCIKKwkic2tpcF90ZXN0XDAiCisJImF1dG9faXJxXDAiCisJInNwbGl0X3Rlcm1pb3NcMCIKKwkic2Vzc2lvbl9sb2Nrb3V0XDAiCisJInBncnBfbG9ja291dFwwIgorCSJjYWxsb3V0X25vaHVwXDAiCisJImxvd19sYXRlbmN5XDAiCisKKwkicG9ydFwwIgorCSJpcnFcMCIKKwkiZGl2aXNvclwwIgorCSJ1YXJ0XDAiCisJImJhdW5kX2Jhc2VcMCIKKwkiY2xvc2VfZGVsYXlcMCIKKwkiY2xvc2luZ193YWl0XDAiCisKKwkiYXV0b2NvbmZpZ1wwIgorOworCitlbnVtCit7CisJQ01EX1NQRF9OT1JNQUwgPSAwLAorCUNNRF9TUERfSEksCisJQ01EX1NQRF9WSEksCisJQ01EX1NQRF9TSEksCisJQ01EX1NQRF9XQVJQLAorCUNNRF9TUERfQ1VTVCwKKworCUNNRF9GTEFHX1NBSywKKwlDTURfRkxBR19GT1VSUE9SVCwKKwlDTURfRkxBR19OVVBfTk9USUZZLAorCUNNRF9GTEFHX1NLSVBfVEVTVCwKKwlDTURfRkxBR19BVVRPX0lSUSwKKwlDTURfRkxBR19TUExJVF9URVJNSU9TLAorCUNNRF9GTEFHX1NFU1NJT05fTE9DS09VVCwKKwlDTURfRkxBR19QR1JQX0xPQ0tPVVQsCisJQ01EX0ZMQUdfQ0FMTE9VVF9OT0hVUCwKKwlDTURfRkxBR19MT1dfTEFURU5DWSwKKworCUNNRF9QT1JULAorCUNNRF9JUlEsCisJQ01EX0RJVklTT1IsCisJQ01EX1VBUlQsCisJQ01EX0JBU0UsCisJQ01EX0RFTEFZLAorCUNNRF9XQUlULAorCisJQ01EX0FVVE9DT05GSUcsCisKKwlDTURfRkxBR19GSVJTVCA9IENNRF9GTEFHX1NBSywKKwlDTURfRkxBR19MQVNUICA9IENNRF9GTEFHX0xPV19MQVRFTkNZLAorfTsKKworc3RhdGljIGJvb2wgY21kX25vcHJpbnQoaW50IGNtZCkKK3sKKwlyZXR1cm4gKGNtZCA+PSBDTURfRkxBR19TS0lQX1RFU1QgJiYgY21kIDw9IENNRF9GTEFHX0NBTExPVVRfTk9IVVApOworfQorCitzdGF0aWMgYm9vbCBjbWRfaXNfZmxhZyhpbnQgY21kKQoreworCXJldHVybiAoY21kID49IENNRF9GTEFHX0ZJUlNUICYmIGNtZCA8PSBDTURfRkxBR19MQVNUKTsKK30KKworc3RhdGljIGJvb2wgY21kX25lZWRfYXJnKGludCBjbWQpCit7CisJcmV0dXJuIChjbWQgPj0gQ01EX1BPUlQgJiYgY21kIDw9IENNRF9XQUlUKTsKK30KKworI2RlZmluZSBBTExfU1BEICggXAorCUFTWU5DX1NQRF9ISSB8IEFTWU5DX1NQRF9WSEkgfCBBU1lOQ19TUERfU0hJIHwgXAorCUFTWU5DX1NQRF9XQVJQIHwgQVNZTkNfU1BEX0NVU1QgXAorCSkKKworI2RlZmluZSBBTExfRkxBR1MgKCBcCisJQVNZTkNfU0FLIHwgQVNZTkNfRk9VUlBPUlQgfCBBU1lOQ19IVVBfTk9USUZZIHwgXAorCUFTWU5DX1NLSVBfVEVTVCB8IEFTWU5DX0FVVE9fSVJRIHwgQVNZTkNfU1BMSVRfVEVSTUlPUyB8IFwKKwlBU1lOQ19TRVNTSU9OX0xPQ0tPVVQgfCBBU1lOQ19QR1JQX0xPQ0tPVVQgfCBBU1lOQ19DQUxMT1VUX05PSFVQIHwgXAorCUFTWU5DX0xPV19MQVRFTkNZIFwKKwkpCisKKyNpZiAoQUxMX1NQRCB8IEFMTF9GTEFHUykgPiAweGZmZmYKKyMgZXJyb3IgIlVuZXhwZWN0ZWQgZmxhZ3Mgc2l6ZSIKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2V0Yml0c1tDTURfRkxBR19MQVNUICsgMV0gPQoreworCTAsCisJQVNZTkNfU1BEX0hJLAorCUFTWU5DX1NQRF9WSEksCisJQVNZTkNfU1BEX1NISSwKKwlBU1lOQ19TUERfV0FSUCwKKwlBU1lOQ19TUERfQ1VTVCwKKworCUFTWU5DX1NBSywKKwlBU1lOQ19GT1VSUE9SVCwKKwlBU1lOQ19IVVBfTk9USUZZLAorCUFTWU5DX1NLSVBfVEVTVCwKKwlBU1lOQ19BVVRPX0lSUSwKKwlBU1lOQ19TUExJVF9URVJNSU9TLAorCUFTWU5DX1NFU1NJT05fTE9DS09VVCwKKwlBU1lOQ19QR1JQX0xPQ0tPVVQsCisJQVNZTkNfQ0FMTE9VVF9OT0hVUCwKKwlBU1lOQ19MT1dfTEFURU5DWQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgU1RSX0lORklOSVRFW10gPSAiaW5maW5pdGUiOworc3RhdGljIGNvbnN0IGNoYXIgU1RSX05PTkVbXSA9ICJub25lIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKnVhcnRfdHlwZShpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA+IE1BWF9TRVJJQUxfVFlQRSkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCisJcmV0dXJuIG50aF9zdHJpbmcoc2VyaWFsX3R5cGVzLCB0eXBlKTsKK30KKworLyogbGliYmIgY2FuZGlkYXRlICovCitzdGF0aWMgaW50IGluZGV4X2luX3N0cmluZ3NfY2FzZV9pbnNlbnNpdGl2ZShjb25zdCBjaGFyICpzdHJpbmdzLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGlkeCA9IDA7CisKKwl3aGlsZSAoKnN0cmluZ3MpIHsKKwkJaWYgKHN0cmNhc2VjbXAoc3RyaW5ncywga2V5KSA9PSAwKSB7CisJCQlyZXR1cm4gaWR4OworCQl9CisJCXN0cmluZ3MgKz0gc3RybGVuKHN0cmluZ3MpICsgMTsgLyogc2tpcCBOVUwgKi8KKwkJaWR4Kys7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB1YXJ0X2lkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGluZGV4X2luX3N0cmluZ3NfY2FzZV9pbnNlbnNpdGl2ZShzZXJpYWxfdHlwZXMsIG5hbWUpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3NwZChpbnQgZmxhZ3MsIGVudW0gcHJpbnRfbW9kZSBtb2RlKQoreworCWludCBpZHg7CisKKwlzd2l0Y2ggKGZsYWdzICYgQVNZTkNfU1BEX01BU0spIHsKKwljYXNlIEFTWU5DX1NQRF9ISToKKwkJaWR4ID0gQ01EX1NQRF9ISTsKKwkJYnJlYWs7CisJY2FzZSBBU1lOQ19TUERfVkhJOgorCQlpZHggPSBDTURfU1BEX1ZISTsKKwkJYnJlYWs7CisJY2FzZSBBU1lOQ19TUERfU0hJOgorCQlpZHggPSBDTURfU1BEX1NISTsKKwkJYnJlYWs7CisJY2FzZSBBU1lOQ19TUERfV0FSUDoKKwkJaWR4ID0gQ01EX1NQRF9XQVJQOworCQlicmVhazsKKwljYXNlIEFTWU5DX1NQRF9DVVNUOgorCQlpZHggPSBDTURfU1BEX0NVU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChtb2RlIDwgUFJJTlRfRkVEQkFDSykKKwkJCXJldHVybiBOVUxMOworCQlpZHggPSBDTURfU1BEX05PUk1BTDsKKwl9CisKKwlyZXR1cm4gbnRoX3N0cmluZyhjb21tYW5kcywgaWR4KTsKK30KKworc3RhdGljIGludCBnZXRfbnVtZXJpYyhjb25zdCBjaGFyICphcmcpCit7CisJcmV0dXJuIGJiX3N0cnRvbChhcmcsIE5VTEwsIDApOworfQorCitzdGF0aWMgaW50IGdldF93YWl0KGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpZiAoc3RyY2FzZWNtcChhcmcsIFNUUl9OT05FKSA9PSAwKQorCQlyZXR1cm4gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkU7CisKKwlpZiAoc3RyY2FzZWNtcChhcmcsIFNUUl9JTkZJTklURSkgPT0gMCkKKwkJcmV0dXJuIEFTWU5DX0NMT1NJTkdfV0FJVF9JTkY7CisKKwlyZXR1cm4gZ2V0X251bWVyaWMoYXJnKTsKK30KKworc3RhdGljIGludCBnZXRfdWFydChjb25zdCBjaGFyICphcmcpCit7CisJaW50IHVhcnQgPSB1YXJ0X2lkKGFyZyk7CisKKwlpZiAodWFydCA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbGxlZ2FsIFVBUlQgdHlwZTogJXMiLCBhcmcpOworCisJcmV0dXJuIHVhcnQ7Cit9CisKK3N0YXRpYyBpbnQgc2VyaWFsX29wZW4oY29uc3QgY2hhciAqZGV2LCBib29sIHF1aWV0KQoreworCWludCBmZDsKKworCWZkID0gZGV2aWNlX29wZW4oZGV2LCBPX1JEV1IgfCBPX05PTkJMT0NLKTsKKwlpZiAoZmQgPCAwICYmICFxdWlldCkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZGV2KTsKKworCXJldHVybiBmZDsKK30KKworc3RhdGljIGludCBzZXJpYWxfY3RsKGludCBmZCwgaW50IG9wcywgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnNlcmluZm8pCit7CisJaW50IHJldCA9IDA7CisJY29uc3QgY2hhciAqZXJyOworCisJaWYgKG9wcyAmIENUTF9TRVQpIHsKKwkJcmV0ID0gaW9jdGwoZmQsIFRJT0NTU0VSSUFMLCBzZXJpbmZvKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVyciA9ICJjYW4ndCBzZXQgc2VyaWFsIGluZm8iOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJaWYgKG9wcyAmIENUTF9DT05GSUcpIHsKKwkJcmV0ID0gaW9jdGwoZmQsIFRJT0NTRVJDT05GSUcpOworCQlpZiAocmV0IDwgMCkgeworCQkJZXJyID0gImNhbid0IGF1dG9jb25maWd1cmUgcG9ydCI7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlpZiAob3BzICYgQ1RMX0dFVCkgeworCQlyZXQgPSBpb2N0bChmZCwgVElPQ0dTRVJJQUwsIHNlcmluZm8pOworCQlpZiAocmV0IDwgMCkgeworCQkJZXJyID0gImNhbid0IGdldCBzZXJpYWwgaW5mbyI7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9Cisgbm9kaWU6CisJaWYgKG9wcyAmIENUTF9DTE9TRSkKKwkJY2xvc2UoZmQpOworCisJcmV0dXJuIHJldDsKKyBmYWlsOgorCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGVycik7CisJaWYgKG9wcyAmIENUTF9OT0RJRSkKKwkJZ290byBub2RpZTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2ZsYWcoY29uc3QgY2hhciAqKnByZWZpeCwgY29uc3QgY2hhciAqZmxhZykKK3sKKwlwcmludGYoIiVzJXMiLCAqcHJlZml4LCBmbGFnKTsKKwkqcHJlZml4ID0gIiAiOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zZXJpYWxfZmxhZ3MoaW50IHNlcmlhbF9mbGFncywgZW51bSBwcmludF9tb2RlIG1vZGUsCisJCQkJY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpwb3N0Zml4KQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnNwZCwgKnByOworCisJcHIgPSBwcmVmaXg7CisKKwlzcGQgPSBnZXRfc3BkKHNlcmlhbF9mbGFncywgbW9kZSk7CisJaWYgKHNwZCkKKwkJcHJpbnRfZmxhZygmcHIsIHNwZCk7CisKKwlmb3IgKGkgPSBDTURfRkxBR19GSVJTVDsgaSA8PSBDTURfRkxBR19MQVNUOyBpKyspIHsKKwkJaWYgKChzZXJpYWxfZmxhZ3MgJiBzZXRiaXRzW2ldKQorCQkgJiYgKG1vZGUgPiBQUklOVF9TVU1NQVJZIHx8ICFjbWRfbm9wcmludChpKSkKKwkJKSB7CisJCQlwcmludF9mbGFnKCZwciwgbnRoX3N0cmluZyhjb21tYW5kcywgaSkpOworCQl9CisJfQorCisJcHV0cyhwciA9PSBwcmVmaXggPyAiIiA6IHBvc3RmaXgpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9jbG9zaW5nX3dhaXQodW5zaWduZWQgaW50IGNsb3Npbmdfd2FpdCkKK3sKKwlzd2l0Y2ggKGNsb3Npbmdfd2FpdCkgeworCWNhc2UgQVNZTkNfQ0xPU0lOR19XQUlUX05PTkU6CisJCXB1dHMoU1RSX05PTkUpOworCQlicmVhazsKKwljYXNlIEFTWU5DX0NMT1NJTkdfV0FJVF9JTkY6CisJCXB1dHMoU1RSX0lORklOSVRFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIldVxuIiwgY2xvc2luZ193YWl0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNlcmlhbF9nZXQoY29uc3QgY2hhciAqZGV2aWNlLCBlbnVtIHByaW50X21vZGUgbW9kZSkKK3sKKwlpbnQgZmQsIHJldDsKKwljb25zdCBjaGFyICp1YXJ0LCAqcHJlZml4LCAqcG9zdGZpeDsKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzZXJpbmZvOworCisJZmQgPSBzZXJpYWxfb3BlbihkZXZpY2UsIC8qcXVpZXQ6Ki8gbW9kZSA9PSBQUklOVF9TVU1NQVJZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisKKwlyZXQgPSBzZXJpYWxfY3RsKGZkLCBDVExfR0VUIHwgQ1RMX0NMT1NFIHwgQ1RMX05PRElFLCAmc2VyaW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKworCXVhcnQgPSB1YXJ0X3R5cGUoc2VyaW5mby50eXBlKTsKKwlwcmVmaXggPSAiLCBGbGFnczogIjsKKwlwb3N0Zml4ID0gIiI7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFBSSU5UX05PUk1BTDoKKwkJcHJpbnRmKCIlcywgVUFSVDogJXMsIFBvcnQ6IDB4JS40eCwgSVJROiAlZCIsCisJCQlkZXZpY2UsIHVhcnQsIHNlcmluZm8ucG9ydCwgc2VyaW5mby5pcnEpOworCQlicmVhazsKKwljYXNlIFBSSU5UX1NVTU1BUlk6CisJCWlmICghc2VyaW5mby50eXBlKQorCQkJcmV0dXJuOworCQlwcmludGYoIiVzIGF0IDB4JS40eCAoaXJxID0gJWQpIGlzIGEgJXMiLAorCQkJZGV2aWNlLCBzZXJpbmZvLnBvcnQsIHNlcmluZm8uaXJxLCB1YXJ0KTsKKwkJcHJlZml4ID0gIiAoIjsKKwkJcG9zdGZpeCA9ICIpIjsKKwkJYnJlYWs7CisJY2FzZSBQUklOVF9GRURCQUNLOgorCQlwcmludGYoIiVzIHVhcnQgJXMgcG9ydCAweCUuNHggaXJxICVkIGJhdWRfYmFzZSAlZCIsIGRldmljZSwKKwkJCXVhcnQsIHNlcmluZm8ucG9ydCwgc2VyaW5mby5pcnEsIHNlcmluZm8uYmF1ZF9iYXNlKTsKKwkJcHJlZml4ID0gIiAiOworCQlicmVhazsKKwljYXNlIFBSSU5UX0FMTDoKKwkJcHJpbnRmKCIlcywgTGluZSAlZCwgVUFSVDogJXMsIFBvcnQ6IDB4JS40eCwgSVJROiAlZFxuIiwKKwkJCWRldmljZSwgc2VyaW5mby5saW5lLCB1YXJ0LCBzZXJpbmZvLnBvcnQsIHNlcmluZm8uaXJxKTsKKwkJcHJpbnRmKCJcdEJhdWRfYmFzZTogJWQsIGNsb3NlX2RlbGF5OiAldSwgZGl2aXNvcjogJWRcbiIsCisJCQlzZXJpbmZvLmJhdWRfYmFzZSwgc2VyaW5mby5jbG9zZV9kZWxheSwKKwkJCXNlcmluZm8uY3VzdG9tX2Rpdmlzb3IpOworCQlwcmludGYoIlx0Y2xvc2luZ193YWl0OiAiKTsKKwkJcHJpbnRfY2xvc2luZ193YWl0KHNlcmluZm8uY2xvc2luZ193YWl0KTsKKwkJcHJlZml4ID0gIlx0RmxhZ3M6ICI7CisJCXBvc3RmaXggPSAiXG4iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhc3NlcnQoMCk7CisJfQorCisJcHJpbnRfc2VyaWFsX2ZsYWdzKHNlcmluZm8uZmxhZ3MsIG1vZGUsIHByZWZpeCwgcG9zdGZpeCk7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9jbWQoY29uc3QgY2hhciAqY21kKQoreworCWludCBpZHg7CisKKwlpZHggPSBpbmRleF9pbl9zdHJpbmdzX2Nhc2VfaW5zZW5zaXRpdmUoY29tbWFuZHMsIGNtZCk7CisJaWYgKGlkeCA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGZsYWc6ICVzIiwgY21kKTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmlhbF9zZXQoY2hhciAqKmFyZywgaW50IG9wdHMpCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyaW5mbzsKKwlpbnQgY21kOworCWNvbnN0IGNoYXIgKndvcmQ7CisJaW50IGZkOworCisJZmQgPSBzZXJpYWxfb3BlbigqYXJnKyssIC8qcXVpZXQ6Ki8gZmFsc2UpOworCWlmIChmZCA8IDApCisJCWV4aXQoMjAxKTsKKworCXNlcmlhbF9jdGwoZmQsIENUTF9HRVQsICZzZXJpbmZvKTsKKworCWlmIChvcHRzICYgT1BUX1pFUk8pCisJCXNlcmluZm8uZmxhZ3MgPSAwOworCisJd2hpbGUgKCphcmcpIHsKKwkJaW50IGludmVydDsKKworCQl3b3JkID0gKmFyZysrOworCQlpbnZlcnQgPSAoKndvcmQgPT0gJ14nKTsKKwkJd29yZCArPSBpbnZlcnQ7CisKKwkJY21kID0gZmluZF9jbWQod29yZCk7CisKKwkJaWYgKCphcmcgPT0gTlVMTCAmJiBjbWRfbmVlZF9hcmcoY21kKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsIHdvcmQpOworCisJCWlmIChpbnZlcnQgJiYgIWNtZF9pc19mbGFnKGNtZCkpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgaW52ZXJ0ICVzIiwgd29yZCk7CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBDTURfU1BEX05PUk1BTDoKKwkJY2FzZSBDTURfU1BEX0hJOgorCQljYXNlIENNRF9TUERfVkhJOgorCQljYXNlIENNRF9TUERfU0hJOgorCQljYXNlIENNRF9TUERfV0FSUDoKKwkJY2FzZSBDTURfU1BEX0NVU1Q6CisJCQlzZXJpbmZvLmZsYWdzICY9IH5BU1lOQ19TUERfTUFTSzsKKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgQ01EX0ZMQUdfU0FLOgorCQljYXNlIENNRF9GTEFHX0ZPVVJQT1JUOgorCQljYXNlIENNRF9GTEFHX05VUF9OT1RJRlk6CisJCWNhc2UgQ01EX0ZMQUdfU0tJUF9URVNUOgorCQljYXNlIENNRF9GTEFHX0FVVE9fSVJROgorCQljYXNlIENNRF9GTEFHX1NQTElUX1RFUk1JT1M6CisJCWNhc2UgQ01EX0ZMQUdfU0VTU0lPTl9MT0NLT1VUOgorCQljYXNlIENNRF9GTEFHX1BHUlBfTE9DS09VVDoKKwkJY2FzZSBDTURfRkxBR19DQUxMT1VUX05PSFVQOgorCQljYXNlIENNRF9GTEFHX0xPV19MQVRFTkNZOgorCQkJaWYgKGludmVydCkKKwkJCQlzZXJpbmZvLmZsYWdzICY9IH5zZXRiaXRzW2NtZF07CisJCQllbHNlCisJCQkJc2VyaW5mby5mbGFncyB8PSBzZXRiaXRzW2NtZF07CisJCQlicmVhazsKKwkJY2FzZSBDTURfUE9SVDoKKwkJCXNlcmluZm8ucG9ydCA9IGdldF9udW1lcmljKCphcmcrKyk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfSVJROgorCQkJc2VyaW5mby5pcnEgPSBnZXRfbnVtZXJpYygqYXJnKyspOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0RJVklTT1I6CisJCQlzZXJpbmZvLmN1c3RvbV9kaXZpc29yID0gZ2V0X251bWVyaWMoKmFyZysrKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9VQVJUOgorCQkJc2VyaW5mby50eXBlID0gZ2V0X3VhcnQoKmFyZysrKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9CQVNFOgorCQkJc2VyaW5mby5iYXVkX2Jhc2UgPSBnZXRfbnVtZXJpYygqYXJnKyspOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0RFTEFZOgorCQkJc2VyaW5mby5jbG9zZV9kZWxheSA9IGdldF9udW1lcmljKCphcmcrKyk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfV0FJVDoKKwkJCXNlcmluZm8uY2xvc2luZ193YWl0ID0gZ2V0X3dhaXQoKmFyZysrKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9BVVRPQ09ORklHOgorCQkJc2VyaWFsX2N0bChmZCwgQ1RMX1NFVCB8IENUTF9DT05GSUcgfCBDVExfR0VULCAmc2VyaW5mbyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWFzc2VydCgwKTsKKwkJfQorCX0KKworCXNlcmlhbF9jdGwoZmQsIENUTF9TRVQgfCBDVExfQ0xPU0UsICZzZXJpbmZvKTsKK30KKworaW50IHNldHNlcmlhbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2V0c2VyaWFsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgb3B0czsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOmItYUc6Ry1hYjphLWJHIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImJHYXZ6ZyIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCFhcmd2WzFdKSAvKiBvbmUgYXJnIG9ubHk/ICovCisJCW9wdHMgfD0gT1BUX0dFVDsKKworCWlmICghKG9wdHMgJiBPUFRfR0VUKSkgeworCQlzZXJpYWxfc2V0KGFyZ3YsIG9wdHMpOworCQlhcmd2WzFdID0gTlVMTDsKKwl9CisKKwlpZiAob3B0cyAmIChPUFRfVkVSQk9TRSB8IE9QVF9HRVQpKSB7CisJCWRvIHsKKwkJCXNlcmlhbF9nZXQoKmFyZ3YrKywgb3B0cyAmIE9QVF9NT0RFX01BU0spOworCQl9IHdoaWxlICgqYXJndik7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9zZXRzaWQuYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9zZXRzaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDJjOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3NldHNpZC5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNldHNpZC5jIC0tIGV4ZWN1dGUgYSBjb21tYW5kIGluIGEgbmV3IHNlc3Npb24KKyAqIFJpY2sgU2xhZGtleSA8anJzQHdvcmxkLnN0ZC5jb20+CisgKiBJbiB0aGUgcHVibGljIGRvbWFpbi4KKyAqCisgKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNaWNraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KKyAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyAqCisgKiAyMDAxLTAxLTE4IEpvaG4gRnJlbWxpbiA8dmlpQHBlbmd1aW5wb3dlcmVkLmNvbT4KKyAqIC0gZm9yayBpbiBjYXNlIHdlIGFyZSBwcm9jZXNzIGdyb3VwIGxlYWRlcgorICoKKyAqIDIwMDQtMTEtMTIgUGF1bCBGb3gKKyAqIC0gYnVzeWJveGVkCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNldHNpZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIHNldHNpZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBQUk9HIGluIGEgbmV3IHNlc3Npb24uIFBST0cgd2lsbCBoYXZlIG5vIGNvbnRyb2xsaW5nIHRlcm1pbmFsXG4iCisvL3VzYWdlOiAgICAgICAiYW5kIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IGtleWJvYXJkIHNpZ25hbHMgKEN0cmwtQyBldGMpLlxuIgorLy91c2FnZTogICAgICAgIlNlZSBzZXRzaWQoMikgZm9yIGRldGFpbHMuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHNldHNpZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2V0c2lkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpZiAoIWFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIHNldHNpZCgpIGlzIGFsbG93ZWQgb25seSB3aGVuIHdlIGFyZSBub3QgYSBwcm9jZXNzIGdyb3VwIGxlYWRlci4KKwkgKiBPdGhlcndpc2Ugb3VyIFBJRCBzZXJ2ZXMgYXMgUEdJRCBvZiBzb21lIGV4aXN0aW5nIHByb2Nlc3MgZ3JvdXAKKwkgKiBhbmQgY2Fubm90IGJlIHVzZWQgYXMgUEdJRCBvZiBhIG5ldyBwcm9jZXNzIGdyb3VwLiAqLworCWlmIChzZXRzaWQoKSA8IDApIHsKKwkJcGlkX3QgcGlkID0gZm9ya19vcl9yZXhlYyhhcmd2KTsKKwkJaWYgKHBpZCAhPSAwKSB7CisJCQkvKiBwYXJlbnQgKi8KKwkJCS8qIFRPRE86CisJCQkgKiB3ZSBjYW4gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApIGFuZCB0aGVuIGV2ZW4KKwkJCSAqIGVtdWxhdGUgZXhpdGNvZGUsIG1ha2luZyB0aGUgYmVoYXZpb3IgY29uc2lzdGVudAorCQkJICogaW4gYm90aCBmb3JrZWQgYW5kIG5vbiBmb3JrZWQgY2FzZXMuCisJCQkgKiBIb3dldmVyLCB0aGUgY29kZSBpcyBsYXJnZXIgYW5kIHVwc3RyZWFtCisJCQkgKiBkb2VzIG5vdCBkbyBzdWNoIHRyaWNrLgorCQkJICovCisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCX0KKworCQkvKiBjaGlsZCAqLworCQkvKiBub3cgdGhlcmUgc2hvdWxkIGJlIG5vIGVycm9yOiAqLworCQlzZXRzaWQoKTsKKwl9CisKKwlhcmd2Kys7CisJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy9zdHJpbmdzLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvc3RyaW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTAxODIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvc3RyaW5ncy5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHN0cmluZ3MgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgMjAwMyBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3RyaW5nc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hZm9dIFstbiBMRU5dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzdHJpbmdzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSBwcmludGFibGUgc3RyaW5ncyBpbiBhIGJpbmFyeSBmaWxlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hCVNjYW4gd2hvbGUgZmlsZSAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1mCVByZWNlZGUgc3RyaW5ncyB3aXRoIGZpbGVuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTEVOCUF0IGxlYXN0IExFTiBjaGFyYWN0ZXJzIGZvcm0gYSBzdHJpbmcgKGRlZmF1bHQgNCkiCisvL3VzYWdlOiAgICAgIlxuCS1vCVByZWNlZGUgc3RyaW5ncyB3aXRoIGRlY2ltYWwgb2Zmc2V0cyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgV0hPTEVfRklMRSAgICAxCisjZGVmaW5lIFBSSU5UX05BTUUgICAgMgorI2RlZmluZSBQUklOVF9PRkZTRVQgIDQKKyNkZWZpbmUgU0laRSAgICAgICAgICA4CisKK2ludCBzdHJpbmdzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdHJpbmdzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbiwgYywgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCXVuc2lnbmVkIGNvdW50OworCW9mZl90IG9mZnNldDsKKwlGSUxFICpmaWxlOworCWNoYXIgKnN0cmluZzsKKwljb25zdCBjaGFyICpmbXQgPSAiJXM6ICI7CisJY29uc3QgY2hhciAqbl9hcmcgPSAiNCI7CisKKwlnZXRvcHQzMihhcmd2LCAiYWZvbjoiLCAmbl9hcmcpOworCS8qIC1hIGlzIG91ciBkZWZhdWx0IGJlaGF2aW91ciAqLworCS8qYXJnYyAtPSBvcHRpbmQ7Ki8KKwlhcmd2ICs9IG9wdGluZDsKKworCW4gPSB4YXRvdV9yYW5nZShuX2FyZywgMSwgSU5UX01BWCk7CisJc3RyaW5nID0geHphbGxvYyhuICsgMSk7CisJbi0tOworCisJaWYgKCEqYXJndikgeworCQlmbXQgPSAieyVzfTogIjsKKwkJKi0tYXJndiA9IChjaGFyICopYmJfbXNnX3N0YW5kYXJkX2lucHV0OworCX0KKworCWRvIHsKKwkJZmlsZSA9IGZvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YpOworCQlpZiAoIWZpbGUpIHsKKwkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9mZnNldCA9IDA7CisJCWNvdW50ID0gMDsKKwkJZG8geworCQkJYyA9IGZnZXRjKGZpbGUpOworCQkJaWYgKGlzcHJpbnRfYXNjaWlvbmx5KGMpIHx8IGMgPT0gJ1x0JykgeworCQkJCWlmIChjb3VudCA+IG4pIHsKKwkJCQkJYmJfcHV0Y2hhcihjKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJpbmdbY291bnRdID0gYzsKKwkJCQkJaWYgKGNvdW50ID09IG4pIHsKKwkJCQkJCWlmIChvcHRpb25fbWFzazMyICYgUFJJTlRfTkFNRSkgeworCQkJCQkJCXByaW50ZihmbXQsICphcmd2KTsKKwkJCQkJCX0KKwkJCQkJCWlmIChvcHRpb25fbWFzazMyICYgUFJJTlRfT0ZGU0VUKSB7CisJCQkJCQkJcHJpbnRmKCIlNyJPRkZfRk1UIm8gIiwgb2Zmc2V0IC0gbik7CisJCQkJCQl9CisJCQkJCQlmcHV0cyhzdHJpbmcsIHN0ZG91dCk7CisJCQkJCX0KKwkJCQkJY291bnQrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjb3VudCA+IG4pIHsKKwkJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCQl9CisJCQkJY291bnQgPSAwOworCQkJfQorCQkJb2Zmc2V0Kys7CisJCX0gd2hpbGUgKGMgIT0gRU9GKTsKKwkJZmNsb3NlX2lmX25vdF9zdGRpbihmaWxlKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShzdHJpbmcpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3Rhc2tzZXQuYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy90YXNrc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5ZTMyMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy90YXNrc2V0LmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHRhc2tzZXQgLSByZXRyaWV2ZSBvciBzZXQgYSBwcm9jZXNzZXMnIENQVSBhZmZpbml0eQorICogQ29weXJpZ2h0IChjKSAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHRhc2tzZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstcF0gW01BU0tdIFtQSUQgfCBQUk9HIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIHRhc2tzZXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZXQgb3IgZ2V0IENQVSBhZmZpbml0eVxuIgorLy91c2FnZTogICAgICJcbgktcAlPcGVyYXRlIG9uIGFuIGV4aXN0aW5nIFBJRCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdGFza3NldF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCB0YXNrc2V0IDB4NyAuL2RnZW1tX3Rlc3QmXG4iCisvL3VzYWdlOiAgICAgICAiJCB0YXNrc2V0IC1wIDB4MSAkIVxuIgorLy91c2FnZTogICAgICAgInBpZCA0NzkwJ3MgY3VycmVudCBhZmZpbml0eSBtYXNrOiA3XG4iCisvL3VzYWdlOiAgICAgICAicGlkIDQ3OTAncyBuZXcgYWZmaW5pdHkgbWFzazogMVxuIgorLy91c2FnZTogICAgICAgIiQgdGFza3NldCAweDcgL2Jpbi9zaCAtYyAnLi90YXNrc2V0IC1wIDB4MSAkJCdcbiIKKy8vdXNhZ2U6ICAgICAgICJwaWQgNjY3MSdzIGN1cnJlbnQgYWZmaW5pdHkgbWFzazogMVxuIgorLy91c2FnZTogICAgICAgInBpZCA2NjcxJ3MgbmV3IGFmZmluaXR5IG1hc2s6IDFcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHRhc2tzZXQgLXAgMVxuIgorLy91c2FnZTogICAgICAgInBpZCAxJ3MgY3VycmVudCBhZmZpbml0eSBtYXNrOiAzXG4iCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZCisjZGVmaW5lIFRBU0tTRVRfUFJJTlRGX01BU0sgIiVzIgorLyogY3JhZnQgYSBzdHJpbmcgZnJvbSB0aGUgbWFzayAqLworc3RhdGljIGNoYXIgKmZyb21fY3B1c2V0KGNwdV9zZXRfdCAqbWFzaykKK3sKKwlpbnQgaTsKKwljaGFyICpyZXQgPSBOVUxMOworCWNoYXIgKnN0ciA9IHh6YWxsb2MoKENQVV9TRVRTSVpFIC8gNCkgKyAxKTsgLyogd2Ugd2lsbCBsZWFrIGl0ICovCisKKwlmb3IgKGkgPSBDUFVfU0VUU0laRSAtIDQ7IGkgPj0gMDsgaSAtPSA0KSB7CisJCWludCB2YWwgPSAwOworCQlpbnQgb2ZmOworCQlmb3IgKG9mZiA9IDA7IG9mZiA8PSAzOyArK29mZikKKwkJCWlmIChDUFVfSVNTRVQoaSArIG9mZiwgbWFzaykpCisJCQkJdmFsIHw9IDEgPDwgb2ZmOworCQlpZiAoIXJldCAmJiB2YWwpCisJCQlyZXQgPSBzdHI7CisJCSpzdHIrKyA9IGJiX2hleGRpZ2l0c191cGNhc2VbdmFsXSB8IDB4MjA7CisJfQorCXJldHVybiByZXQ7Cit9CisjZWxzZQorI2RlZmluZSBUQVNLU0VUX1BSSU5URl9NQVNLICIlbGx4Igorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBmcm9tX2NwdXNldChjcHVfc2V0X3QgKm1hc2spCit7CisJc3RydWN0IEJVR19DUFVfU0VUU0laRV9pc190b29fc21hbGwgeworCQljaGFyIEJVR19DUFVfU0VUU0laRV9pc190b29fc21hbGxbCisJCQlDUFVfU0VUU0laRSA8IHNpemVvZihpbnQpID8gLTEgOiAxXTsKKwl9OworCWNoYXIgKnAgPSAodm9pZCopbWFzazsKKworCS8qIFRha2UgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMuIENhcmVmdWwhCisJICogQ29uc2lkZXIgYm90aCBDUFVfU0VUU0laRT00IGFuZCBDUFVfU0VUU0laRT0xMDI0IGNhc2VzCisJICovCisjaWYgQkJfQklHX0VORElBTgorCS8qIEZvciBiaWcgZW5kaWFuLCBpdCBtZWFucyBMQVNUIGJpdHMgKi8KKwlpZiAoQ1BVX1NFVFNJWkUgPCBzaXplb2YobG9uZykpCisJCXAgKz0gQ1BVX1NFVFNJWkUgLSBzaXplb2YoaW50KTsKKwllbHNlIGlmIChDUFVfU0VUU0laRSA8IHNpemVvZihsb25nIGxvbmcpKQorCQlwICs9IENQVV9TRVRTSVpFIC0gc2l6ZW9mKGxvbmcpOworCWVsc2UKKwkJcCArPSBDUFVfU0VUU0laRSAtIHNpemVvZihsb25nIGxvbmcpOworI2VuZGlmCisJaWYgKENQVV9TRVRTSVpFIDwgc2l6ZW9mKGxvbmcpKQorCQlyZXR1cm4gKih1bnNpZ25lZCopcDsKKwlpZiAoQ1BVX1NFVFNJWkUgPCBzaXplb2YobG9uZyBsb25nKSkKKwkJcmV0dXJuICoodW5zaWduZWQgbG9uZyopcDsKKwlyZXR1cm4gKih1bnNpZ25lZCBsb25nIGxvbmcqKXA7Cit9CisjZW5kaWYKKworCitpbnQgdGFza3NldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGFza3NldF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY3B1X3NldF90IG1hc2s7CisJcGlkX3QgcGlkID0gMDsKKwl1bnNpZ25lZCBvcHRfcDsKKwljb25zdCBjaGFyICpjdXJyZW50X25ldzsKKwljaGFyICpwaWRfc3RyOworCWNoYXIgKmFmZiA9IGFmZjsgLyogZm9yIGNvbXBpbGVyICovCisKKwkvKiBOQjogd2UgbWltaWMgdXRpbC1saW51eCdzIHRhc2tzZXQ6IC1wIGRvZXMgbm90IHRha2UKKwkgKiBhbiBhcmd1bWVudCwgaS5lLiwgIi1wTiIgaXMgTk9UIHZhbGlkLCBvbmx5ICItcCBOIiEKKwkgKiBJbmRlZWQsIHV0aWwtbGludXgtMi4xMy1wcmU3IHVzZXM6CisJICogZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIitwY2hWIiwgLi4uKSwgbm90ICIuLi5wOi4uLiIgKi8KKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogYXQgbGVhc3QgMSBhcmcgKi8KKwlvcHRfcCA9IGdldG9wdDMyKGFyZ3YsICIrcCIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKG9wdF9wKSB7CisJCXBpZF9zdHIgPSAqYXJndisrOworCQlpZiAoKmFyZ3YpIHsgLyogIi1wIDxhZmY+IDxwaWQ+IC4uLnJlc3QuaXMuaWdub3JlZC4uLiIgKi8KKwkJCWFmZiA9IHBpZF9zdHI7CisJCQlwaWRfc3RyID0gKmFyZ3Y7IC8qIE5COiAqYXJndiAhPSBOVUxMIGluIHRoaXMgY2FzZSAqLworCQl9CisJCS8qIGVsc2UgaXQgd2FzIGp1c3QgIi1wIDxwaWQ+IiwgYW5kICphcmd2ID09IE5VTEwgKi8KKwkJcGlkID0geGF0b3VsX3JhbmdlKHBpZF9zdHIsIDEsICgodW5zaWduZWQpKHBpZF90KVVMT05HX01BWCkgPj4gMSk7CisJfSBlbHNlIHsKKwkJYWZmID0gKmFyZ3YrKzsgLyogPGFmZj4gPGNtZC4uLj4gKi8KKwkJaWYgKCEqYXJndikKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwljdXJyZW50X25ldyA9ICJjdXJyZW50XDBuZXciOworCWlmIChvcHRfcCkgeworIHByaW50X2FmZjoKKwkJaWYgKHNjaGVkX2dldGFmZmluaXR5KHBpZCwgc2l6ZW9mKG1hc2spLCAmbWFzaykgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCAlY2V0IHBpZCAlZCdzIGFmZmluaXR5IiwgJ2cnLCBwaWQpOworCQlwcmludGYoInBpZCAlZCdzICVzIGFmZmluaXR5IG1hc2s6ICJUQVNLU0VUX1BSSU5URl9NQVNLIlxuIiwKKwkJCQlwaWQsIGN1cnJlbnRfbmV3LCBmcm9tX2NwdXNldCgmbWFzaykpOworCQlpZiAoISphcmd2KSB7CisJCQkvKiBFaXRoZXIgaXQgd2FzIGp1c3QgIi1wIDxwaWQ+IiwKKwkJCSAqIG9yIGl0IHdhcyAiLXAgPGFmZj4gPHBpZD4iIGFuZCB3ZSBjYW1lIGhlcmUKKwkJCSAqIGZvciB0aGUgc2Vjb25kIHRpbWUgKHNlZSBnb3RvIGJlbG93KSAqLworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQkqYXJndiA9IE5VTEw7CisJCWN1cnJlbnRfbmV3ICs9IDg7IC8qICJuZXciICovCisJfQorCisJeyAvKiBBZmZpbml0eSB3YXMgc3BlY2lmaWVkLCB0cmFuc2xhdGUgaXQgaW50byBjcHVfc2V0X3QgKi8KKwkJdW5zaWduZWQgaTsKKwkJLyogRG8gbm90IGFsbG93IHplcm8gbWFzazogKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIG0gPSB4c3RydG91bGxfcmFuZ2UoYWZmLCAwLCAxLCBVTExPTkdfTUFYKTsKKwkJZW51bSB7IENOVF9CSVQgPSBDUFVfU0VUU0laRSA8IHNpemVvZihtKSo4ID8gQ1BVX1NFVFNJWkUgOiBzaXplb2YobSkqOCB9OworCisJCUNQVV9aRVJPKCZtYXNrKTsKKwkJZm9yIChpID0gMDsgaSA8IENOVF9CSVQ7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBsb25nIGJpdCA9ICgxVUxMIDw8IGkpOworCQkJaWYgKGJpdCAmIG0pCisJCQkJQ1BVX1NFVChpLCAmbWFzayk7CisJCX0KKwl9CisKKwkvKiBTZXQgcGlkJ3Mgb3Igb3VyIG93biAocGlkPT0wKSBhZmZpbml0eSAqLworCWlmIChzY2hlZF9zZXRhZmZpbml0eShwaWQsIHNpemVvZihtYXNrKSwgJm1hc2spKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0ICVjZXQgcGlkICVkJ3MgYWZmaW5pdHkiLCAncycsIHBpZCk7CisKKwlpZiAoIWFyZ3ZbMF0pIC8qICItcCA8YWZmPiA8cGlkPiBbLi4uaWdub3JlZC4uLl0iICovCisJCWdvdG8gcHJpbnRfYWZmOyAvKiBwcmludCBuZXcgYWZmaW5pdHkgYW5kIGV4aXQgKi8KKworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvdGltZS5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVmMTVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3RpbWUuYwpAQCAtMCwwICsxLDQyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiAndGltZScgdXRpbGl0eSB0byBkaXNwbGF5IHJlc291cmNlIHVzYWdlIG9mIHByb2Nlc3Nlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworLyogT3JpZ2luYWxseSB3cml0dGVuIGJ5IERhdmlkIEtlcHBlbCA8cGFyZG9AY3Mud2FzaGluZ3Rvbi5lZHU+LgorICAgSGVhdmlseSBtb2RpZmllZCBieSBEYXZpZCBNYWNLZW56aWUgPGRqbUBnbnUuYWkubWl0LmVkdT4uCisgICBIZWF2aWx5IG1vZGlmaWVkIGZvciBidXN5Ym94IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyovCisKKy8vdXNhZ2U6I2RlZmluZSB0aW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXZdIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSB0aW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIFBST0csIGRpc3BsYXkgcmVzb3VyY2UgdXNhZ2Ugd2hlbiBpdCBleGl0c1xuIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogSW5mb3JtYXRpb24gb24gdGhlIHJlc291cmNlcyB1c2VkIGJ5IGEgY2hpbGQgcHJvY2Vzcy4gICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHdhaXRzdGF0dXM7CisJc3RydWN0IHJ1c2FnZSBydTsKKwl1bnNpZ25lZCBlbGFwc2VkX21zOwkvKiBXYWxsY2xvY2sgdGltZSBvZiBwcm9jZXNzLiAgKi8KK30gcmVzb3VyY2VfdDsKKworLyogbXNlYyA9IG1pbGxpc2Vjb25kcyA9IDEvMSwwMDAgKDEqMTBlLTMpIHNlY29uZC4KKyAgIHVzZWMgPSBtaWNyb3NlY29uZHMgPSAxLzEsMDAwLDAwMCAoMSoxMGUtNikgc2Vjb25kLiAgKi8KKworI2RlZmluZSBVTCB1bnNpZ25lZCBsb25nCisKK3N0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRfZm9ybWF0W10gQUxJR04xID0gInJlYWxcdCVFXG51c2VyXHQldVxuc3lzXHQlVCI7CisKKy8qIFRoZSBvdXRwdXQgZm9ybWF0IGZvciB0aGUgLXAgb3B0aW9uIC4qLworc3RhdGljIGNvbnN0IGNoYXIgcG9zaXhfZm9ybWF0W10gQUxJR04xID0gInJlYWwgJWVcbnVzZXIgJVVcbnN5cyAlUyI7CisKKy8qIEZvcm1hdCBzdHJpbmcgZm9yIHByaW50aW5nIGFsbCBzdGF0aXN0aWNzIHZlcmJvc2VseS4KKyAgIEtlZXAgdGhpcyBvdXRwdXQgdG8gMjQgbGluZXMgc28gdXNlcnMgb24gdGVybWluYWxzIGNhbiBzZWUgaXQgYWxsLiovCitzdGF0aWMgY29uc3QgY2hhciBsb25nX2Zvcm1hdFtdIEFMSUdOMSA9CisJIlx0Q29tbWFuZCBiZWluZyB0aW1lZDogXCIlQ1wiXG4iCisJIlx0VXNlciB0aW1lIChzZWNvbmRzKTogJVVcbiIKKwkiXHRTeXN0ZW0gdGltZSAoc2Vjb25kcyk6ICVTXG4iCisJIlx0UGVyY2VudCBvZiBDUFUgdGhpcyBqb2IgZ290OiAlUFxuIgorCSJcdEVsYXBzZWQgKHdhbGwgY2xvY2spIHRpbWUgKGg6bW06c3Mgb3IgbTpzcyk6ICVFXG4iCisJIlx0QXZlcmFnZSBzaGFyZWQgdGV4dCBzaXplIChrYnl0ZXMpOiAlWFxuIgorCSJcdEF2ZXJhZ2UgdW5zaGFyZWQgZGF0YSBzaXplIChrYnl0ZXMpOiAlRFxuIgorCSJcdEF2ZXJhZ2Ugc3RhY2sgc2l6ZSAoa2J5dGVzKTogJXBcbiIKKwkiXHRBdmVyYWdlIHRvdGFsIHNpemUgKGtieXRlcyk6ICVLXG4iCisJIlx0TWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSAoa2J5dGVzKTogJU1cbiIKKwkiXHRBdmVyYWdlIHJlc2lkZW50IHNldCBzaXplIChrYnl0ZXMpOiAldFxuIgorCSJcdE1ham9yIChyZXF1aXJpbmcgSS9PKSBwYWdlIGZhdWx0czogJUZcbiIKKwkiXHRNaW5vciAocmVjbGFpbWluZyBhIGZyYW1lKSBwYWdlIGZhdWx0czogJVJcbiIKKwkiXHRWb2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlczogJXdcbiIKKwkiXHRJbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzOiAlY1xuIgorCSJcdFN3YXBzOiAlV1xuIgorCSJcdEZpbGUgc3lzdGVtIGlucHV0czogJUlcbiIKKwkiXHRGaWxlIHN5c3RlbSBvdXRwdXRzOiAlT1xuIgorCSJcdFNvY2tldCBtZXNzYWdlcyBzZW50OiAlc1xuIgorCSJcdFNvY2tldCBtZXNzYWdlcyByZWNlaXZlZDogJXJcbiIKKwkiXHRTaWduYWxzIGRlbGl2ZXJlZDogJWtcbiIKKwkiXHRQYWdlIHNpemUgKGJ5dGVzKTogJVpcbiIKKwkiXHRFeGl0IHN0YXR1czogJXgiOworCisvKiBXYWl0IGZvciBhbmQgZmlsbCBpbiBkYXRhIG9uIGNoaWxkIHByb2Nlc3MgUElELgorICAgUmV0dXJuIDAgb24gZXJyb3IsIDEgaWYgb2suICAqLworLyogcGlkX3QgaXMgc2hvcnQgb24gQlNESSwgc28gZG9uJ3QgdHJ5IHRvIHByb21vdGUgaXQuICAqLworc3RhdGljIHZvaWQgcmVzdXNlX2VuZChwaWRfdCBwaWQsIHJlc291cmNlX3QgKnJlc3ApCit7CisJcGlkX3QgY2F1Z2h0OworCisJLyogSWdub3JlIHNpZ25hbHMsIGJ1dCBkb24ndCBpZ25vcmUgdGhlIGNoaWxkcmVuLiAgV2hlbiB3YWl0MworCSAgIHJldHVybnMgdGhlIGNoaWxkIHByb2Nlc3MsIHNldCB0aGUgdGltZSB0aGUgY29tbWFuZCBmaW5pc2hlZC4gKi8KKwl3aGlsZSAoKGNhdWdodCA9IHdhaXQzKCZyZXNwLT53YWl0c3RhdHVzLCAwLCAmcmVzcC0+cnUpKSAhPSBwaWQpIHsKKwkJaWYgKGNhdWdodCA9PSAtMSAmJiBlcnJubyAhPSBFSU5UUikgeworCQkJYmJfcGVycm9yX21zZygid2FpdCIpOworCQkJcmV0dXJuOworCQl9CisJfQorCXJlc3AtPmVsYXBzZWRfbXMgPSBtb25vdG9uaWNfbXMoKSAtIHJlc3AtPmVsYXBzZWRfbXM7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50YXJndihjaGFyICpjb25zdCAqYXJndikKK3sKKwljb25zdCBjaGFyICpmbXQgPSAiICVzIiArIDE7CisJZG8geworCQlwcmludGYoZm10LCAqYXJndik7CisJCWZtdCA9ICIgJXMiOworCX0gd2hpbGUgKCorK2FyZ3YpOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBraWxvYnl0ZXMgY29ycmVzcG9uZGluZyB0byBhIG51bWJlciBvZiBwYWdlcyBQQUdFUy4KKyAgIChBY3R1YWxseSwgd2UgdXNlIGl0IHRvIGNvbnZlcnQgcGFnZXMqdGlja3MgaW50byBraWxvYnl0ZXMqdGlja3MuKQorCisgICBUcnkgdG8gZG8gYXJpdGhtZXRpYyBzbyB0aGF0IHRoZSByaXNrIG9mIG92ZXJmbG93IGVycm9ycyBpcyBtaW5pbWl6ZWQuCisgICBUaGlzIGlzIGZ1bmt5IHNpbmNlIHRoZSBwYWdlc2l6ZSBjb3VsZCBiZSBsZXNzIHRoYW4gMUsuCisgICBOb3RlOiBTb21lIG1hY2hpbmVzIGV4cHJlc3MgZ2V0cnVzYWdlIHN0YXRpc3RpY3MgaW4gdGVybXMgb2YgSywKKyAgIG90aGVycyBpbiB0ZXJtcyBvZiBwYWdlcy4gICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwdG9rKGNvbnN0IHVuc2lnbmVkIHBhZ2VzaXplLCBjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJLyogQ29udmVyc2lvbi4gICovCisJaWYgKHBhZ2VzID4gKExPTkdfTUFYIC8gcGFnZXNpemUpKSB7IC8qIENvdWxkIG92ZXJmbG93LiAgKi8KKwkJdG1wID0gcGFnZXMgLyAxMDI0OyAgICAgLyogU21hbGxlciBmaXJzdCwgKi8KKwkJcmV0dXJuIHRtcCAqIHBhZ2VzaXplOyAgLyogdGhlbiBsYXJnZXIuICAqLworCX0KKwkvKiBDb3VsZCB1bmRlcmZsb3cuICAqLworCXRtcCA9IHBhZ2VzICogcGFnZXNpemU7IC8qIExhcmdlciBmaXJzdCwgKi8KKwlyZXR1cm4gdG1wIC8gMTAyNDsgICAgICAvKiB0aGVuIHNtYWxsZXIuICAqLworfQorCisvKiBzdW1tYXJpemU6IFJlcG9ydCBvbiB0aGUgc3lzdGVtIHVzZSBvZiBhIGNvbW1hbmQuCisKKyAgIFByaW50IHRoZSBGTVQgYXJndW1lbnQgZXhjZXB0IHRoYXQgYCUnIHNlcXVlbmNlcworICAgaGF2ZSBzcGVjaWFsIG1lYW5pbmcsIGFuZCBgXG4nIGFuZCBgXHQnIGFyZSB0cmFuc2xhdGVkIGludG8KKyAgIG5ld2xpbmUgYW5kIHRhYiwgcmVzcGVjdGl2ZWx5LCBhbmQgYFxcJyBpcyB0cmFuc2xhdGVkIGludG8gYFwnLgorCisgICBUaGUgY2hhcmFjdGVyIGZvbGxvd2luZyBhIGAlJyBjYW4gYmU6CisgICAoKiBtZWFucyB0aGUgdGNzaCB0aW1lIGJ1aWx0aW4gYWxzbyByZWNvZ25pemVzIGl0KQorICAgJSA9PSBhIGxpdGVyYWwgYCUnCisgICBDID09IGNvbW1hbmQgbmFtZSBhbmQgYXJndW1lbnRzCisqICBEID09IGF2ZXJhZ2UgdW5zaGFyZWQgZGF0YSBzaXplIGluIEsgKHJ1X2lkcnNzK3J1X2lzcnNzKQorKiAgRSA9PSBlbGFwc2VkIHJlYWwgKHdhbGwgY2xvY2spIHRpbWUgaW4gW2hvdXI6XW1pbjpzZWMKKyogIEYgPT0gbWFqb3IgcGFnZSBmYXVsdHMgKHJlcXVpcmVkIHBoeXNpY2FsIEkvTykgKHJ1X21hamZsdCkKKyogIEkgPT0gZmlsZSBzeXN0ZW0gaW5wdXRzIChydV9pbmJsb2NrKQorKiAgSyA9PSBhdmVyYWdlIHRvdGFsIG1lbSB1c2FnZSAocnVfaWRyc3MrcnVfaXNyc3MrcnVfaXhyc3MpCisqICBNID09IG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgaW4gSyAocnVfbWF4cnNzKQorKiAgTyA9PSBmaWxlIHN5c3RlbSBvdXRwdXRzIChydV9vdWJsb2NrKQorKiAgUCA9PSBwZXJjZW50IG9mIENQVSB0aGlzIGpvYiBnb3QgKHRvdGFsIGNwdSB0aW1lIC8gZWxhcHNlZCB0aW1lKQorKiAgUiA9PSBtaW5vciBwYWdlIGZhdWx0cyAocmVjbGFpbXM7IG5vIHBoeXNpY2FsIEkvTyBpbnZvbHZlZCkgKHJ1X21pbmZsdCkKKyogIFMgPT0gc3lzdGVtIChrZXJuZWwpIHRpbWUgKHNlY29uZHMpIChydV9zdGltZSkKKyogIFQgPT0gc3lzdGVtIHRpbWUgaW4gW2hvdXI6XW1pbjpzZWMKKyogIFUgPT0gdXNlciB0aW1lIChzZWNvbmRzKSAocnVfdXRpbWUpCisqICB1ID09IHVzZXIgdGltZSBpbiBbaG91cjpdbWluOnNlYworKiAgVyA9PSB0aW1lcyBzd2FwcGVkIG91dCAocnVfbnN3YXApCisqICBYID09IGF2ZXJhZ2UgYW1vdW50IG9mIHNoYXJlZCB0ZXh0IGluIEsgKHJ1X2l4cnNzKQorICAgWiA9PSBwYWdlIHNpemUKKyogIGMgPT0gaW52b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyAocnVfbml2Y3N3KQorICAgZSA9PSBlbGFwc2VkIHJlYWwgdGltZSBpbiBzZWNvbmRzCisqICBrID09IHNpZ25hbHMgZGVsaXZlcmVkIChydV9uc2lnbmFscykKKyAgIHAgPT0gYXZlcmFnZSB1bnNoYXJlZCBzdGFjayBzaXplIGluIEsgKHJ1X2lzcnNzKQorKiAgciA9PSBzb2NrZXQgbWVzc2FnZXMgcmVjZWl2ZWQgKHJ1X21zZ3JjdikKKyogIHMgPT0gc29ja2V0IG1lc3NhZ2VzIHNlbnQgKHJ1X21zZ3NuZCkKKyAgIHQgPT0gYXZlcmFnZSByZXNpZGVudCBzZXQgc2l6ZSBpbiBLIChydV9pZHJzcykKKyogIHcgPT0gdm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMgKHJ1X252Y3N3KQorICAgeCA9PSBleGl0IHN0YXR1cyBvZiBjb21tYW5kCisKKyAgIFZhcmlvdXMgbWVtb3J5IHVzYWdlcyBhcmUgZm91bmQgYnkgY29udmVydGluZyBmcm9tIHBhZ2Utc2Vjb25kcworICAgdG8ga2J5dGVzIGJ5IG11bHRpcGx5aW5nIGJ5IHRoZSBwYWdlIHNpemUsIGRpdmlkaW5nIGJ5IDEwMjQsCisgICBhbmQgZGl2aWRpbmcgYnkgZWxhcHNlZCByZWFsIHRpbWUuCisKKyAgIEZNVCBpcyB0aGUgZm9ybWF0IHN0cmluZywgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgorICAgQ09NTUFORCBpcyB0aGUgY29tbWFuZCBhbmQgYXJncyB0aGF0IGFyZSBiZWluZyBzdW1tYXJpemVkLgorICAgUkVTUCBpcyByZXNvdXJjZSBpbmZvcm1hdGlvbiBvbiB0aGUgY29tbWFuZC4gICovCisKKyNpZm5kZWYgVElDS1NfUEVSX1NFQworI2RlZmluZSBUSUNLU19QRVJfU0VDIDEwMAorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHN1bW1hcml6ZShjb25zdCBjaGFyICpmbXQsIGNoYXIgKipjb21tYW5kLCByZXNvdXJjZV90ICpyZXNwKQoreworCXVuc2lnbmVkIHZ2X21zOyAgICAgLyogRWxhcHNlZCB2aXJ0dWFsIChDUFUpIG1pbGxpc2Vjb25kcyAqLworCXVuc2lnbmVkIGNwdV90aWNrczsgLyogU2FtZSwgaW4gIkNQVSB0aWNrcyIgKi8KKwl1bnNpZ25lZCBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKiBJbXBvc3NpYmxlOiB3ZSBkbyBub3QgdXNlIFdVTlRSQUNFRCBmbGFnIGluIHdhaXQoKS4uLgorCWlmIChXSUZTVE9QUEVEKHJlc3AtPndhaXRzdGF0dXMpKQorCQlwcmludGYoIkNvbW1hbmQgc3RvcHBlZCBieSBzaWduYWwgJXVcbiIsCisJCQkJV1NUT1BTSUcocmVzcC0+d2FpdHN0YXR1cykpOworCWVsc2UgKi8KKwlpZiAoV0lGU0lHTkFMRUQocmVzcC0+d2FpdHN0YXR1cykpCisJCXByaW50ZigiQ29tbWFuZCB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAldVxuIiwKKwkJCQlXVEVSTVNJRyhyZXNwLT53YWl0c3RhdHVzKSk7CisJZWxzZSBpZiAoV0lGRVhJVEVEKHJlc3AtPndhaXRzdGF0dXMpICYmIFdFWElUU1RBVFVTKHJlc3AtPndhaXRzdGF0dXMpKQorCQlwcmludGYoIkNvbW1hbmQgZXhpdGVkIHdpdGggbm9uLXplcm8gc3RhdHVzICV1XG4iLAorCQkJCVdFWElUU1RBVFVTKHJlc3AtPndhaXRzdGF0dXMpKTsKKworCXZ2X21zID0gKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3NlYyArIHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYykgKiAxMDAwCisJICAgICAgKyAocmVzcC0+cnUucnVfdXRpbWUudHZfdXNlYyArIHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3VzZWMpIC8gMTAwMDsKKworI2lmICgxMDAwIC8gVElDS1NfUEVSX1NFQykgKiBUSUNLU19QRVJfU0VDID09IDEwMDAKKwkvKiAxMDAwIGlzIGV4YWN0bHkgZGl2aXNpYmxlIGJ5IFRJQ0tTX1BFUl9TRUMgKHR5cGljYWwpICovCisJY3B1X3RpY2tzID0gdnZfbXMgLyAoMTAwMCAvIFRJQ0tTX1BFUl9TRUMpOworI2Vsc2UKKwljcHVfdGlja3MgPSB2dl9tcyAqICh1bnNpZ25lZCBsb25nIGxvbmcpVElDS1NfUEVSX1NFQyAvIDEwMDA7CisjZW5kaWYKKwlpZiAoIWNwdV90aWNrcykgY3B1X3RpY2tzID0gMTsgLyogd2UgZGl2aWRlIGJ5IGl0LCBtdXN0IGJlIG5vbnplcm8gKi8KKworCXdoaWxlICgqZm10KSB7CisJCS8qIEhhbmRsZSBsZWFkaW5nIGxpdGVyYWwgcGFydCAqLworCQlpbnQgbiA9IHN0cmNzcG4oZm10LCAiJVxcIik7CisJCWlmIChuKSB7CisJCQlwcmludGYoIiUuKnMiLCBuLCBmbXQpOworCQkJZm10ICs9IG47CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoKmZtdCkgeworI2lmZGVmIE5PVF9ORUVERUQKKwkJLyogSGFuZGxlIGxpdGVyYWwgY2hhciAqLworCQkvKiBVc3VhbGx5IHdlIG9wdGltaXplIGZvciBzaXplLCBidXQgdGhlcmUgaXMgYSBsaW1pdAorCQkgKiBmb3IgZXZlcnl0aGluZy4gV2l0aCB0aGlzIHdlIGRvIGEgbG90IG9mIDEtYnl0ZSB3cml0ZXMgKi8KKwkJZGVmYXVsdDoKKwkJCWJiX3B1dGNoYXIoKmZtdCk7CisJCQlicmVhazsKKyNlbmRpZgorCisJCWNhc2UgJyUnOgorCQkJc3dpdGNoICgqKytmbXQpIHsKKyNpZmRlZiBOT1RfTkVFREVEX1lFVAorCQkvKiBPdXIgZm9ybWF0IHN0cmluZ3MgZG8gbm90IGhhdmUgdGhlc2UgKi8KKwkJLyogYW5kIHdlIGRvIG5vdCB0YWtlIGZvcm1hdCBzdHIgZnJvbSB1c2VyICovCisJCQlkZWZhdWx0OgorCQkJCWJiX3B1dGNoYXIoJyUnKTsKKwkJCQkvKkZBTExUSFJPVUdIKi8KKwkJCWNhc2UgJyUnOgorCQkJCWlmICghKmZtdCkgZ290byByZXQ7CisJCQkJYmJfcHV0Y2hhcigqZm10KTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSAnQyc6CS8qIFRoZSBjb21tYW5kIHRoYXQgZ290IHRpbWVkLiAgKi8KKwkJCQlwcmludGFyZ3YoY29tbWFuZCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdEJzoJLyogQXZlcmFnZSB1bnNoYXJlZCBkYXRhIHNpemUuICAqLworCQkJCXByaW50ZigiJWx1IiwKKwkJCQkJKHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaWRyc3MpICsKKwkJCQkJIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaXNyc3MpKSAvIGNwdV90aWNrcyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdFJzogewkvKiBFbGFwc2VkIHJlYWwgKHdhbGwgY2xvY2spIHRpbWUuICAqLworCQkJCXVuc2lnbmVkIHNlY29uZHMgPSByZXNwLT5lbGFwc2VkX21zIC8gMTAwMDsKKwkJCQlpZiAoc2Vjb25kcyA+PSAzNjAwKQkvKiBPbmUgaG91ciAtPiBoOm06cy4gICovCisJCQkJCXByaW50ZigiJXVoICV1bSAlMDJ1cyIsCisJCQkJCQkJc2Vjb25kcyAvIDM2MDAsCisJCQkJCQkJKHNlY29uZHMgJSAzNjAwKSAvIDYwLAorCQkJCQkJCXNlY29uZHMgJSA2MCk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiV1bSAldS4lMDJ1cyIsCS8qIC0+IG06cy4gICovCisJCQkJCQkJc2Vjb25kcyAvIDYwLAorCQkJCQkJCXNlY29uZHMgJSA2MCwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPmVsYXBzZWRfbXMgLyAxMCkgJSAxMDApOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAnRic6CS8qIE1ham9yIHBhZ2UgZmF1bHRzLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X21hamZsdCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdJJzoJLyogSW5wdXRzLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X2luYmxvY2spOworCQkJCWJyZWFrOworCQkJY2FzZSAnSyc6CS8qIEF2ZXJhZ2UgbWVtIHVzYWdlID09IGRhdGErc3RhY2srdGV4dC4gICovCisJCQkJcHJpbnRmKCIlbHUiLAorCQkJCQkocHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9pZHJzcykgKworCQkJCQkgcHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9pc3JzcykgKworCQkJCQkgcHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9peHJzcykpIC8gY3B1X3RpY2tzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ00nOgkvKiBNYXhpbXVtIHJlc2lkZW50IHNldCBzaXplLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfbWF4cnNzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdPJzoJLyogT3V0cHV0cy4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9vdWJsb2NrKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1AnOgkvKiBQZXJjZW50IG9mIENQVSB0aGlzIGpvYiBnb3QuICAqLworCQkJCS8qICUgY3B1IGlzICh0b3RhbCBjcHUgdGltZSkvKGVsYXBzZWQgdGltZSkuICAqLworCQkJCWlmIChyZXNwLT5lbGFwc2VkX21zID4gMCkKKwkJCQkJcHJpbnRmKCIldSUlIiwgKHVuc2lnbmVkKSh2dl9tcyAqIDEwMCAvIHJlc3AtPmVsYXBzZWRfbXMpKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiPyUlIik7CisJCQkJYnJlYWs7CisJCQljYXNlICdSJzoJLyogTWlub3IgcGFnZSBmYXVsdHMgKHJlY2xhaW1zKS4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9taW5mbHQpOworCQkJCWJyZWFrOworCQkJY2FzZSAnUyc6CS8qIFN5c3RlbSB0aW1lLiAgKi8KKwkJCQlwcmludGYoIiV1LiUwMnUiLAorCQkJCQkJKHVuc2lnbmVkKXJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYywKKwkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfc3RpbWUudHZfdXNlYyAvIDEwMDAwKSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdUJzoJLyogU3lzdGVtIHRpbWUuICAqLworCQkJCWlmIChyZXNwLT5ydS5ydV9zdGltZS50dl9zZWMgPj0gMzYwMCkgLyogT25lIGhvdXIgLT4gaDptOnMuICAqLworCQkJCQlwcmludGYoIiV1aCAldW0gJTAydXMiLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfc3RpbWUudHZfc2VjIC8gMzYwMCksCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV9zdGltZS50dl9zZWMgJSAzNjAwKSAvIDYwLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfc3RpbWUudHZfc2VjICUgNjApKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiJXVtICV1LiUwMnVzIiwJLyogLT4gbTpzLiAgKi8KKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYyAvIDYwKSwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYyAlIDYwKSwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3VzZWMgLyAxMDAwMCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAnVSc6CS8qIFVzZXIgdGltZS4gICovCisJCQkJcHJpbnRmKCIldS4lMDJ1IiwKKwkJCQkJCSh1bnNpZ25lZClyZXNwLT5ydS5ydV91dGltZS50dl9zZWMsCisJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3VzZWMgLyAxMDAwMCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAndSc6CS8qIFVzZXIgdGltZS4gICovCisJCQkJaWYgKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3NlYyA+PSAzNjAwKSAvKiBPbmUgaG91ciAtPiBoOm06cy4gICovCisJCQkJCXByaW50ZigiJXVoICV1bSAlMDJ1cyIsCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV91dGltZS50dl9zZWMgLyAzNjAwKSwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3NlYyAlIDM2MDApIC8gNjAsCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV91dGltZS50dl9zZWMgJSA2MCkpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIldW0gJXUuJTAydXMiLAkvKiAtPiBtOnMuICAqLworCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfdXRpbWUudHZfc2VjIC8gNjApLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfdXRpbWUudHZfc2VjICUgNjApLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfdXRpbWUudHZfdXNlYyAvIDEwMDAwKSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdXJzoJLyogVGltZXMgc3dhcHBlZCBvdXQuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbnN3YXApOworCQkJCWJyZWFrOworCQkJY2FzZSAnWCc6CS8qIEF2ZXJhZ2Ugc2hhcmVkIHRleHQgc2l6ZS4gICovCisJCQkJcHJpbnRmKCIlbHUiLCBwdG9rKHBhZ2VzaXplLCAoVUwpIHJlc3AtPnJ1LnJ1X2l4cnNzKSAvIGNwdV90aWNrcyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdaJzoJLyogUGFnZSBzaXplLiAgKi8KKwkJCQlwcmludGYoIiV1IiwgcGFnZXNpemUpOworCQkJCWJyZWFrOworCQkJY2FzZSAnYyc6CS8qIEludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbml2Y3N3KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2UnOgkvKiBFbGFwc2VkIHJlYWwgdGltZSBpbiBzZWNvbmRzLiAgKi8KKwkJCQlwcmludGYoIiV1LiUwMnUiLAorCQkJCQkJKHVuc2lnbmVkKXJlc3AtPmVsYXBzZWRfbXMgLyAxMDAwLAorCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5lbGFwc2VkX21zIC8gMTApICUgMTAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2snOgkvKiBTaWduYWxzIGRlbGl2ZXJlZC4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9uc2lnbmFscyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdwJzoJLyogQXZlcmFnZSBzdGFjayBzZWdtZW50LiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaXNyc3MpIC8gY3B1X3RpY2tzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3InOgkvKiBJbmNvbWluZyBzb2NrZXQgbWVzc2FnZXMgcmVjZWl2ZWQuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbXNncmN2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgkvKiBPdXRnb2luZyBzb2NrZXQgbWVzc2FnZXMgc2VudC4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9tc2dzbmQpOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CS8qIEF2ZXJhZ2UgcmVzaWRlbnQgc2V0IHNpemUuICAqLworCQkJCXByaW50ZigiJWx1IiwgcHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9pZHJzcykgLyBjcHVfdGlja3MpOworCQkJCWJyZWFrOworCQkJY2FzZSAndyc6CS8qIFZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X252Y3N3KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3gnOgkvKiBFeGl0IHN0YXR1cy4gICovCisJCQkJcHJpbnRmKCIldSIsIFdFWElUU1RBVFVTKHJlc3AtPndhaXRzdGF0dXMpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgTk9UX05FRURFRF9ZRVQKKwkJY2FzZSAnXFwnOgkJLyogRm9ybWF0IGVzY2FwZS4gICovCisJCQlzd2l0Y2ggKCorK2ZtdCkgeworCQkJZGVmYXVsdDoKKwkJCQliYl9wdXRjaGFyKCdcXCcpOworCQkJCS8qRkFMTFRIUk9VR0gqLworCQkJY2FzZSAnXFwnOgorCQkJCWlmICghKmZtdCkgZ290byByZXQ7CisJCQkJYmJfcHV0Y2hhcigqZm10KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCWJiX3B1dGNoYXIoJ1x0Jyk7CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQkrK2ZtdDsKKwl9CisgLyogcmV0OiAqLworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKKy8qIFJ1biBjb21tYW5kIENNRCBhbmQgcmV0dXJuIHN0YXRpc3RpY3Mgb24gaXQuCisgICBQdXQgdGhlIHN0YXRpc3RpY3MgaW4gKlJFU1AuICAqLworc3RhdGljIHZvaWQgcnVuX2NvbW1hbmQoY2hhciAqY29uc3QgKmNtZCwgcmVzb3VyY2VfdCAqcmVzcCkKK3sKKwlwaWRfdCBwaWQ7CisJdm9pZCAoKmludGVycnVwdF9zaWduYWwpKGludCk7CisJdm9pZCAoKnF1aXRfc2lnbmFsKShpbnQpOworCisJcmVzcC0+ZWxhcHNlZF9tcyA9IG1vbm90b25pY19tcygpOworCXBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBDaGlsZCAqLworCQlCQl9FWEVDVlBfb3JfZGllKChjaGFyKiopY21kKTsKKwl9CisKKwkvKiBIYXZlIHNpZ25hbHMga2lsbCB0aGUgY2hpbGQgYnV0IG5vdCBzZWxmIChpZiBwb3NzaWJsZSkuICAqLworLy9UT0RPOiBqdXN0IGJsb2NrIGFsbCBzaWdzPyBhbmQgcmVlbmFibGUgdGhlbSBpbiB0aGUgdmVyeSBlbmQgaW4gbWFpbj8KKwlpbnRlcnJ1cHRfc2lnbmFsID0gc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisJcXVpdF9zaWduYWwgPSBzaWduYWwoU0lHUVVJVCwgU0lHX0lHTik7CisKKwlyZXN1c2VfZW5kKHBpZCwgcmVzcCk7CisKKwkvKiBSZS1lbmFibGUgc2lnbmFscy4gICovCisJc2lnbmFsKFNJR0lOVCwgaW50ZXJydXB0X3NpZ25hbCk7CisJc2lnbmFsKFNJR1FVSVQsIHF1aXRfc2lnbmFsKTsKK30KKworaW50IHRpbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRpbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJlc291cmNlX3QgcmVzOworCWNvbnN0IGNoYXIgKm91dHB1dF9mb3JtYXQgPSBkZWZhdWx0X2Zvcm1hdDsKKwlpbnQgb3B0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBhdCBsZWFzdCBvbmUgYXJnICovCisJLyogIisiOiBzdG9wIG9uIGZpcnN0IG5vbi1vcHRpb24gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK3ZwIik7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIDEpCisJCW91dHB1dF9mb3JtYXQgPSBsb25nX2Zvcm1hdDsKKwlpZiAob3B0ICYgMikKKwkJb3V0cHV0X2Zvcm1hdCA9IHBvc2l4X2Zvcm1hdDsKKworCXJ1bl9jb21tYW5kKGFyZ3YsICZyZXMpOworCisJLyogQ2hlYXQuIHByaW50ZidzIGFyZSBzaG9ydGVyIDopICovCisJeGR1cDIoU1RERVJSX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7CisJc3VtbWFyaXplKG91dHB1dF9mb3JtYXQsIGFyZ3YsICZyZXMpOworCisJaWYgKFdJRlNUT1BQRUQocmVzLndhaXRzdGF0dXMpKQorCQlyZXR1cm4gV1NUT1BTSUcocmVzLndhaXRzdGF0dXMpOworCWlmIChXSUZTSUdOQUxFRChyZXMud2FpdHN0YXR1cykpCisJCXJldHVybiBXVEVSTVNJRyhyZXMud2FpdHN0YXR1cyk7CisJaWYgKFdJRkVYSVRFRChyZXMud2FpdHN0YXR1cykpCisJCXJldHVybiBXRVhJVFNUQVRVUyhyZXMud2FpdHN0YXR1cyk7CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3RpbWVvdXQuYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy90aW1lb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NjU5MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy90aW1lb3V0LmMKQEAgLTAsMCArMSwxMTggQEAKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgorICogQ09QWUlORyBOT1RFUworICoKKyAqIHRpbWVvdXQuYyAtLSBhIHRpbWVvdXQgaGFuZGxlciBmb3Igc2hlbGwgY29tbWFuZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtNiwgUm9iZXJ0byBBLiBGb2dsaWV0dGEgPG1lQHJvYmVydG8uZm9nbGlldHRhLm5hbWU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICoKKyAqIFJFVklTSU9OIE5PVEVTOgorICogcmVsZWFzZWQgMTctMTEtMjAwNSBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogdGFsYXJtICAgMDQtMTItMjAwNSBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogbW9kaWZpZWQgMDUtMTItMjAwNSBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogc2l6ZXJkY3QgMDYtMTItMjAwNSBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogc3BsaXRzemYgMTItMDUtMjAwNiBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogcmV3cml0ZSAgMTQtMTEtMjAwOCB2ZGEKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdGltZW91dF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy10IFNFQ1NdIFstcyBTSUddIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSB0aW1lb3V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVucyBQUk9HLiBTZW5kcyBTSUcgdG8gaXQgaWYgaXQgaXMgbm90IGdvbmUgaW4gU0VDUyBzZWNvbmRzLlxuIgorLy91c2FnZTogICAgICAgIkRlZmF1bHRzOiBTRUNTOiAxMCwgU0lHOiBURVJNLiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB0aW1lb3V0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0aW1lb3V0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2lnbm87CisJaW50IHN0YXR1czsKKwlpbnQgcGFyZW50ID0gMDsKKwlpbnQgdGltZW91dCA9IDEwOworCXBpZF90IHBpZDsKKyNpZiAhQkJfTU1VCisJY2hhciAqc3YxLCAqc3YyOworI2VuZGlmCisJY29uc3QgY2hhciAqb3B0X3MgPSAiVEVSTSI7CisKKwkvKiAtcCBvcHRpb24gaXMgbm90IGRvY3VtZW50ZWQsIGl0IGlzIG5lZWRlZCB0byBzdXBwb3J0IE5PTU1VLiAqLworCisJLyogLXQgU0VDT05EUzsgLXAgUEFSRU5UX1BJRCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gInQrIiBVU0VfRk9SX05PTU1VKCI6cCsiKTsKKwkvKiAnKyc6IHN0b3AgYXQgZmlyc3Qgbm9uLW9wdGlvbiAqLworCWdldG9wdDMyKGFyZ3YsICIrczp0OiIgVVNFX0ZPUl9OT01NVSgicDoiKSwgJm9wdF9zLCAmdGltZW91dCwgJnBhcmVudCk7CisJLyphcmd2ICs9IG9wdGluZDsgLSBubywgd2FpdCBmb3IgYmJfZGFlbW9uaXplX29yX3JleGVjISAqLworCXNpZ25vID0gZ2V0X3NpZ251bShvcHRfcyk7CisJaWYgKHNpZ25vIDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gc2lnbmFsICclcyciLCBvcHRfcyk7CisKKwkvKiBXZSB3YW50IHRvIGNyZWF0ZSBhIGdyYW5kY2hpbGQgd2hpY2ggd2lsbCB3YXRjaAorCSAqIGFuZCBraWxsIHRoZSBncmFuZHBhcmVudC4gT3RoZXIgbWV0aG9kczoKKwkgKiBtYWtpbmcgcGFyZW50IHdhdGNoIGNoaWxkIGRpc3J1cHRzIHBhcmVudDwtPmNoaWxkIGxpbmsKKwkgKiAoZXhhbXBsZTogInRjcHN2ZCAwLjAuMC4wIDEyMzQgdGltZW91dCBzZXJ2aWNlX3Byb2ciIC0KKwkgKiBpdCdzIGJldHRlciBpZiBzZXJ2aWNlX3Byb2cgaXMgYSBjaGlsZCBvZiB0Y3BzdmQhKSwKKwkgKiBtYWtpbmcgY2hpbGQgd2F0Y2ggcGFyZW50IHJlc3VsdHMgaW4gcHJvZ3JhbXMgaGF2aW5nCisJICogdW5leHBlY3RlZCBjaGlsZHJlbi4gKi8KKworCWlmIChwYXJlbnQpIC8qIHdlIHdlcmUgcmUtZXhlY2VkLCBhbHJlYWR5IGdyYW5kY2hpbGQgKi8KKwkJZ290byBncmFuZGNoaWxkOworCWlmICghYXJndltvcHRpbmRdKSAvKiBubyBQUk9HPyAqLworCQliYl9zaG93X3VzYWdlKCk7CisKKyNpZiAhQkJfTU1VCisJc3YxID0gYXJndltvcHRpbmRdOworCXN2MiA9IGFyZ3Zbb3B0aW5kICsgMV07CisjZW5kaWYKKwlwaWQgPSB4dmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ2hpbGQ6IHNwYXduIGdyYW5kY2hpbGQgYW5kIGV4aXQgKi8KKwkJcGFyZW50ID0gZ2V0cHBpZCgpOworI2lmICFCQl9NTVUKKwkJYXJndltvcHRpbmRdID0geGFzcHJpbnRmKCItcCV1IiwgcGFyZW50KTsKKwkJYXJndltvcHRpbmQgKyAxXSA9IE5VTEw7CisjZW5kaWYKKwkJLyogTkI6IGV4aXRzIHdpdGggbm9uemVybyBvbiBlcnJvcjogKi8KKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAsIGFyZ3YpOworCQkvKiBIZXJlIHdlIGFyZSBncmFuZGNoaWxkLiBTbGVlcCwgdGhlbiBraWxsIGdyYW5kcGFyZW50ICovCisgZ3JhbmRjaGlsZDoKKwkJLyogSnVzdCBzbGVlcChIVUdFX05VTSk7IGtpbGwocGFyZW50KSBtYXkga2lsbCB3cm9uZyBwcm9jZXNzISAqLworCQl3aGlsZSAoMSkgeworCQkJc2xlZXAoMSk7CisJCQlpZiAoLS10aW1lb3V0IDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoa2lsbChwYXJlbnQsIDApKSB7CisJCQkJLyogcHJvY2VzcyBpcyBnb25lICovCisJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCQlraWxsKHBhcmVudCwgc2lnbm8pOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIFBhcmVudCAqLworCXdhaXQoJnN0YXR1cyk7IC8qIHdhaXQgZm9yIGNoaWxkIHRvIGRpZSAqLworCS8qIERpZCBpbnRlcm1lZGlhdGUgW3ZdZm9yayBvciBleGVjIGZhaWw/ICovCisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpICE9IDApCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJLyogT2ssIGV4ZWMgYSBwcm9ncmFtIGFzIHJlcXVlc3RlZCAqLworCWFyZ3YgKz0gb3B0aW5kOworI2lmICFCQl9NTVUKKwlhcmd2WzBdID0gc3YxOworCWFyZ3ZbMV0gPSBzdjI7CisjZW5kaWYKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3R0eXNpemUuYyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy90dHlzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkNDhkMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy90dHlzaXplLmMKQEAgLTAsMCArMSw1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUmVwbGFjZW1lbnQgZm9yICJzdHR5IHNpemUiLCB3aGljaCBpcyBhd2t3YXJkIGZvciBzaGVsbCBzY3JpcHQgdXNlLgorICogLSBBbGxvd3MgdG8gcmVxdWVzdCB3aWR0aCwgaGVpZ2h0LCBvciBib3RoLCBpbiBhbnkgb3JkZXIuCisgKiAtIERvZXMgbm90IGNvbXBsYWluIG9uIGVycm9yLCBidXQgcmV0dXJucyB3aWR0aCA4MCwgaGVpZ2h0IDI0LgorICogLSBTaXplOiBsZXNzIHRoYW4gMjAwIGJ5dGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdHR5c2l6ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW3ddIFtoXSIKKy8vdXNhZ2U6I2RlZmluZSB0dHlzaXplX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgZGltZW5zaW9uKHMpIG9mIHN0ZGluJ3MgdGVybWluYWwsIG9uIGVycm9yIHJldHVybiA4MHgyNSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB0dHlzaXplX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0dHlzaXplX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCB3LCBoOworCXN0cnVjdCB3aW5zaXplIHdzejsKKworCXcgPSA4MDsKKwloID0gMjQ7CisJaWYgKCFpb2N0bCgwLCBUSU9DR1dJTlNaLCAmd3N6KSkgeworCQl3ID0gd3N6LndzX2NvbDsKKwkJaCA9IHdzei53c19yb3c7CisJfQorCisJaWYgKCFhcmd2WzFdKSB7CisJCXByaW50ZigiJXUgJXUiLCB3LCBoKTsKKwl9IGVsc2UgeworCQljb25zdCBjaGFyICpmbXQsICphcmc7CisKKwkJZm10ID0gIiV1ICV1IiArIDM7IC8qICIldSIgKi8KKwkJd2hpbGUgKChhcmcgPSAqKythcmd2KSAhPSBOVUxMKSB7CisJCQljaGFyIGMgPSBhcmdbMF07CisJCQlpZiAoYyA9PSAndycpCisJCQkJcHJpbnRmKGZtdCwgdyk7CisJCQlpZiAoYyA9PSAnaCcpCisJCQkJcHJpbnRmKGZtdCwgaCk7CisJCQlmbXQgPSAiJXUgJXUiICsgMjsgLyogIiAldSIgKi8KKwkJfQorCX0KKwliYl9wdXRjaGFyKCdcbicpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3ViaV90b29scy5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3ViaV90b29scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDI2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvdWJpX3Rvb2xzLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qIFBvcnRlZCB0byBidXN5Ym94IGZyb20gbXRkLXV0aWxzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFVCSUFUVEFDSAorLy9jb25maWc6CWJvb2wgInViaWF0dGFjaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBdHRhY2ggTVREIGRldmljZSB0byBhbiBVQkkgZGV2aWNlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgVUJJREVUQUNICisvL2NvbmZpZzoJYm9vbCAidWJpZGV0YWNoIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIERldGFjaCBNVEQgZGV2aWNlIGZyb20gYW4gVUJJIGRldmljZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSU1LVk9MCisvL2NvbmZpZzoJYm9vbCAidWJpbWt2b2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ3JlYXRlIGEgVUJJIHZvbHVtZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSVJNVk9MCisvL2NvbmZpZzoJYm9vbCAidWJpcm12b2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRGVsZXRlIGEgVUJJIHZvbHVtZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSVJTVk9MCisvL2NvbmZpZzoJYm9vbCAidWJpcnN2b2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUmVzaXplIGEgVUJJIHZvbHVtZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSVVQREFURVZPTAorLy9jb25maWc6CWJvb2wgInViaXVwZGF0ZXZvbCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBVcGRhdGUgYSBVQkkgdm9sdW1lLgorCisvL2FwcGxldDpJRl9VQklBVFRBQ0goQVBQTEVUX09ERE5BTUUodWJpYXR0YWNoLCB1YmlfdG9vbHMsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCB1YmlhdHRhY2gpKQorLy9hcHBsZXQ6SUZfVUJJREVUQUNIKEFQUExFVF9PREROQU1FKHViaWRldGFjaCwgdWJpX3Rvb2xzLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgdWJpZGV0YWNoKSkKKy8vYXBwbGV0OklGX1VCSU1LVk9MKEFQUExFVF9PREROQU1FKHViaW1rdm9sLCB1YmlfdG9vbHMsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCB1Ymlta3ZvbCkpCisvL2FwcGxldDpJRl9VQklSTVZPTChBUFBMRVRfT0RETkFNRSh1YmlybXZvbCwgdWJpX3Rvb2xzLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgdWJpcm12b2wpKQorLy9hcHBsZXQ6SUZfVUJJUlNWT0woQVBQTEVUX09ERE5BTUUodWJpcnN2b2wsIHViaV90b29scywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIHViaXJzdm9sKSkKKy8vYXBwbGV0OklGX1VCSVVQREFURVZPTChBUFBMRVRfT0RETkFNRSh1Yml1cGRhdGV2b2wsIHViaV90b29scywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIHViaXVwZGF0ZXZvbCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19VQklBVFRBQ0gpICs9IHViaV90b29scy5vCisvL2tidWlsZDpsaWItJChDT05GSUdfVUJJREVUQUNIKSArPSB1YmlfdG9vbHMubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VCSU1LVk9MKSAgKz0gdWJpX3Rvb2xzLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19VQklSTVZPTCkgICs9IHViaV90b29scy5vCisvL2tidWlsZDpsaWItJChDT05GSUdfVUJJUlNWT0wpICArPSB1YmlfdG9vbHMubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VCSVVQREFURVZPTCkgKz0gdWJpX3Rvb2xzLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bXRkL3ViaS11c2VyLmg+CisKKyNkZWZpbmUgT1BUSU9OX00gICgxIDw8IDApCisjZGVmaW5lIE9QVElPTl9EICAoMSA8PCAxKQorI2RlZmluZSBPUFRJT05fbiAgKDEgPDwgMikKKyNkZWZpbmUgT1BUSU9OX04gICgxIDw8IDMpCisjZGVmaW5lIE9QVElPTl9zICAoMSA8PCA0KQorI2RlZmluZSBPUFRJT05fYSAgKDEgPDwgNSkKKyNkZWZpbmUgT1BUSU9OX3QgICgxIDw8IDYpCisKKyNkZWZpbmUgZG9fYXR0YWNoIChFTkFCTEVfVUJJQVRUQUNIICYmIGFwcGxldF9uYW1lWzNdID09ICdhJykKKyNkZWZpbmUgZG9fZGV0YWNoIChFTkFCTEVfVUJJREVUQUNIICYmIGFwcGxldF9uYW1lWzNdID09ICdkJykKKyNkZWZpbmUgZG9fbWt2b2wgIChFTkFCTEVfVUJJTUtWT0wgICYmIGFwcGxldF9uYW1lWzNdID09ICdtJykKKyNkZWZpbmUgZG9fcm12b2wgIChFTkFCTEVfVUJJUk1WT0wgICYmIGFwcGxldF9uYW1lWzRdID09ICdtJykKKyNkZWZpbmUgZG9fcnN2b2wgIChFTkFCTEVfVUJJUlNWT0wgICYmIGFwcGxldF9uYW1lWzRdID09ICdzJykKKyNkZWZpbmUgZG9fdXBkYXRlIChFTkFCTEVfVUJJVVBEQVRFVk9MICYmIGFwcGxldF9uYW1lWzNdID09ICd1JykKKworLy91c2FnZTojZGVmaW5lIHViaWF0dGFjaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLW0gTVREX05VTSBbLWQgVUJJX05VTV0gVUJJX0NUUkxfREVWIgorLy91c2FnZTojZGVmaW5lIHViaWF0dGFjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkF0dGFjaCBNVEQgZGV2aWNlIHRvIFVCSVxuIgorLy91c2FnZTogICAgICJcbgktbSBNVERfTlVNCU1URCBkZXZpY2UgbnVtYmVyIHRvIGF0dGFjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgVUJJX05VTQlVQkkgZGV2aWNlIG51bWJlciB0byBhc3NpZ24iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHViaWRldGFjaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLWQgVUJJX05VTSBVQklfQ1RSTF9ERVYiCisvL3VzYWdlOiNkZWZpbmUgdWJpZGV0YWNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGV0YWNoIE1URCBkZXZpY2UgZnJvbSBVQklcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgVUJJX05VTQlVQkkgZGV2aWNlIG51bWJlciIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdWJpbWt2b2xfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlVCSV9ERVZJQ0UgLU4gTkFNRSAtcyBTSVpFIgorLy91c2FnZTojZGVmaW5lIHViaW1rdm9sX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIFVCSSB2b2x1bWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEgQUxJR05NRU5UCVZvbHVtZSBhbGlnbm1lbnQgKGRlZmF1bHQgMSkiCisvL3VzYWdlOiAgICAgIlxuCS1uIFZPTElECVZvbHVtZSBJRCwgaWYgbm90IHNwZWNpZmllZCwgaXQiCisvL3VzYWdlOiAgICAgIlxuCQkJd2lsbCBiZSBhc3NpZ25lZCBhdXRvbWF0aWNhbGx5IgorLy91c2FnZTogICAgICJcbgktTiBOQU1FCQlWb2x1bWUgbmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0laRQkJU2l6ZSBpbiBieXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgVFlQRQkJVm9sdW1lIHR5cGUgKHN0YXRpY3xkeW5hbWljKSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdWJpcm12b2xfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlVCSV9ERVZJQ0UgLW4gVk9MSUQiCisvL3VzYWdlOiNkZWZpbmUgdWJpcm12b2xfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZW1vdmUgVUJJIHZvbHVtZVxuIgorLy91c2FnZTogICAgICJcbgktbiBWT0xJRAlWb2x1bWUgSUQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHViaXJzdm9sX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJVQklfREVWSUNFIC1uIFZPTElEIC1zIFNJWkUiCisvL3VzYWdlOiNkZWZpbmUgdWJpcnN2b2xfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXNpemUgVUJJIHZvbHVtZVxuIgorLy91c2FnZTogICAgICJcbgktbiBWT0xJRAlWb2x1bWUgSUQgdG8gcmVzaXplIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlTaXplIGluIGJ5dGVzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1Yml1cGRhdGV2b2xfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlVCSV9ERVZJQ0UgW0lNR19GSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSB1Yml1cGRhdGV2b2xfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVcGRhdGUgVUJJIHZvbHVtZVxuIgorLy91c2FnZTogICAgICJcbgktdAlUcnVuY2F0ZSBVQkkgdm9sdW1lIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCUJ5dGVzIGluIGlucHV0IChpZiByZWFkaW5nIHN0ZGluKSIKKworCitpbnQgdWJpX3Rvb2xzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1YmlfdG9vbHNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdHM7CisJY2hhciAqdWJpX2N0cmw7CisJLy9zdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgZmQ7CisJaW50IG10ZF9udW07CisJaW50IGRldl9udW0gPSBVQklfREVWX05VTV9BVVRPOworCWludCB2b2xfaWQgPSBVQklfVk9MX05VTV9BVVRPOworCWNoYXIgKnZvbF9uYW1lID0gTlVMTDsKKwlpbnQgc2l6ZV9ieXRlczsKKwlpbnQgYWxpZ25tZW50ID0gMTsKKwljaGFyICp0eXBlID0gTlVMTDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOm0rOmQrOm4rOnMrOmErIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIm06ZDpuOk46czphOnQ6OiIsCisJCQkmbXRkX251bSwgJmRldl9udW0sICZ2b2xfaWQsCisJCQkmdm9sX25hbWUsICZzaXplX2J5dGVzLCAmYWxpZ25tZW50LCAmdHlwZQorCSk7CisJdWJpX2N0cmwgPSBhcmd2W29wdGluZF07CisKKwlmZCA9IHhvcGVuKHViaV9jdHJsLCBPX1JEV1IpOworCS8veGZzdGF0KGZkLCAmc3QsIHViaV9jdHJsKTsKKwkvL2lmICghU19JU0NIUihzdC5zdF9tb2RlKSkKKwkvLwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGNoYXIgZGV2aWNlIiwgdWJpX2N0cmwpOworCisJaWYgKGRvX2F0dGFjaCkgeworCQlzdHJ1Y3QgdWJpX2F0dGFjaF9yZXEgcmVxOworCQlpZiAoIShvcHRzICYgT1BUSU9OX00pKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGRldmljZSBub3Qgc3BlY2lmaWVkIiwgIk1URCIpOworCisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJCXJlcS5tdGRfbnVtID0gbXRkX251bTsKKwkJcmVxLnViaV9udW0gPSBkZXZfbnVtOworCisJCXhpb2N0bChmZCwgVUJJX0lPQ0FUVCwgJnJlcSk7CisJfSBlbHNlCisJaWYgKGRvX2RldGFjaCkgeworCQlpZiAoIShvcHRzICYgT1BUSU9OX0QpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGRldmljZSBub3Qgc3BlY2lmaWVkIiwgIlVCSSIpOworCisJCXhpb2N0bChmZCwgVUJJX0lPQ0RFVCwgJmRldl9udW0pOworCX0gZWxzZQorCWlmIChkb19ta3ZvbCkgeworCQlzdHJ1Y3QgdWJpX21rdm9sX3JlcSByZXE7CisJCWludCB2b2xfbmFtZV9sZW47CisJCWlmICghKG9wdHMgJiBPUFRJT05fcykpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgc2l6ZSBub3Qgc3BlY2lmaWVkIiwgIlVCSSIpOworCQlpZiAoIShvcHRzICYgT1BUSU9OX04pKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIG5hbWUgbm90IHNwZWNpZmllZCIsICJVQkkiKTsKKwkJdm9sX25hbWVfbGVuID0gc3RybGVuKHZvbF9uYW1lKTsKKwkJaWYgKHZvbF9uYW1lX2xlbiA+IFVCSV9NQVhfVk9MVU1FX05BTUUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgdm9sdW1lIG5hbWUgdG9vIGxvbmciLCAiVUJJIik7CisKKwkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwkJcmVxLnZvbF9pZCA9IHZvbF9pZDsKKwkJaWYgKChvcHRzICYgT1BUSU9OX3QpICYmIHR5cGUpIHsKKwkJCWlmICh0eXBlWzBdID09ICdzJykKKwkJCQlyZXEudm9sX3R5cGUgPSBVQklfU1RBVElDX1ZPTFVNRTsKKwkJCWVsc2UKKwkJCQlyZXEudm9sX3R5cGUgPSBVQklfRFlOQU1JQ19WT0xVTUU7CisJCX0gZWxzZSB7CisJCQlyZXEudm9sX3R5cGUgPSBVQklfRFlOQU1JQ19WT0xVTUU7CisJCX0KKwkJcmVxLmFsaWdubWVudCA9IGFsaWdubWVudDsKKwkJcmVxLmJ5dGVzID0gc2l6ZV9ieXRlczsKKwkJc3RybmNweShyZXEubmFtZSwgdm9sX25hbWUsIFVCSV9NQVhfVk9MVU1FX05BTUUpOworCQlyZXEubmFtZV9sZW4gPSB2b2xfbmFtZV9sZW47CisKKwkJeGlvY3RsKGZkLCBVQklfSU9DTUtWT0wsICZyZXEpOworCX0gZWxzZQorCWlmIChkb19ybXZvbCkgeworCQlpZiAoIShvcHRzICYgT1BUSU9OX24pKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHZvbHVtZSBpZCBub3Qgc3BlY2lmaWVkIiwgIlVCSSIpOworCisJCXhpb2N0bChmZCwgVUJJX0lPQ1JNVk9MLCAmdm9sX2lkKTsKKwl9IGVsc2UKKwlpZiAoZG9fcnN2b2wpIHsKKwkJc3RydWN0IHViaV9yc3ZvbF9yZXEgcmVxOworCQlpZiAoIShvcHRzICYgT1BUSU9OX3MpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHNpemUgbm90IHNwZWNpZmllZCIsICJVQkkiKTsKKwkJaWYgKCEob3B0cyAmIE9QVElPTl9uKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyB2b2x1bWUgaWQgbm90IHNwZWNpZmllZCIsICJVQkkiKTsKKworCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCQlyZXEuYnl0ZXMgPSBzaXplX2J5dGVzOworCQlyZXEudm9sX2lkID0gdm9sX2lkOworCisJCXhpb2N0bChmZCwgVUJJX0lPQ1JTVk9MLCAmcmVxKTsKKwl9IGVsc2UKKwlpZiAoZG9fdXBkYXRlKSB7CisJCWxvbmcgbG9uZyBieXRlczsKKworCQlpZiAob3B0cyAmIE9QVElPTl90KSB7CisJCQkvLyB0cnVuY2F0ZSB0aGUgdm9sdW1lIGJ5IHN0YXJ0aW5nIGFuIHVwZGF0ZSBmb3Igc2l6ZSAwCisJCQlieXRlcyA9IDA7CisJCQl4aW9jdGwoZmQsIFVCSV9JT0NWT0xVUCwgJmJ5dGVzKTsKKwkJfQorCQllbHNlIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJY2hhciBidWZbc2l6ZW9mKCIvc3lzL2NsYXNzL3ViaS91YmklZF8lZC91c2FibGVfZWJfc2l6ZSIpICsgMiAqIHNpemVvZihpbnQpKjNdOworCQkJaW50IGlucHV0X2ZkOworCQkJdW5zaWduZWQgdWJpbnVtLCB2b2xudW07CisJCQl1bnNpZ25lZCBsZWJfc2l6ZTsKKwkJCXNzaXplX3QgbGVuOworCQkJY2hhciAqaW5wdXRfZGF0YTsKKworCQkJLy8gTWFrZSBhc3N1bXB0aW9uIHRoYXQgZGV2aWNlIG5vdCBpcyBpbiBub3JtYWwgZm9ybWF0LgorCQkJLy8gUmVtb3ZlcyBuZWVkIGZvciBzY2FubmluZyBzeXNmcyB0cmVlIGFzIGZ1bGwgbGlidWJpIGRvZXMKKwkJCWlmIChzc2NhbmYodWJpX2N0cmwsICIvZGV2L3ViaSV1XyV1IiwgJnViaW51bSwgJnZvbG51bSkgIT0gMikKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgdm9sdW1lIG5vZGUgbm90IGluIGNvcnJlY3QgZm9ybWF0IiwgIlVCSSIpOworCisJCQlzcHJpbnRmKGJ1ZiwgIi9zeXMvY2xhc3MvdWJpL3ViaSV1XyV1L3VzYWJsZV9lYl9zaXplIiwgdWJpbnVtLCB2b2xudW0pOworCQkJaWYgKG9wZW5fcmVhZF9jbG9zZShidWYsIGJ1Ziwgc2l6ZW9mKGJ1ZikpIDw9IDApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGNvdWxkIG5vdCBnZXQgTEVCIHNpemUiLCAiVUJJIik7CisJCQlpZiAoc3NjYW5mKGJ1ZiwgIiV1IiwgJmxlYl9zaXplKSAhPSAxKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBjb3VsZCBub3QgZ2V0IExFQiBzaXplIiwgIlVCSSIpOworCisJCQlpZiAob3B0cyAmIE9QVElPTl9zKSB7CisJCQkJaW5wdXRfZmQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWFyZ3Zbb3B0aW5kKzFdKQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJeHN0YXQoYXJndltvcHRpbmQrMV0sICZzdCk7CisJCQkJc2l6ZV9ieXRlcyA9IHN0LnN0X3NpemU7CisJCQkJaW5wdXRfZmQgPSB4b3Blbihhcmd2W29wdGluZCsxXSwgT19SRE9OTFkpOworCQkJfQorCisJCQlieXRlcyA9IHNpemVfYnl0ZXM7CisJCQl4aW9jdGwoZmQsIFVCSV9JT0NWT0xVUCwgJmJ5dGVzKTsKKworCQkJaW5wdXRfZGF0YSA9IHhtYWxsb2MobGViX3NpemUpOworCQkJd2hpbGUgKChsZW4gPSBmdWxsX3JlYWQoaW5wdXRfZmQsIGlucHV0X2RhdGEsIGxlYl9zaXplKSkgPiAwKSB7CisJCQkJeHdyaXRlKGZkLCBpbnB1dF9kYXRhLCBsZW4pOworCQkJfQorCQkJaWYgKGxlbiA8IDApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHZvbHVtZSB1cGRhdGUgZmFpbGVkIiwgIlVCSSIpOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWNsb3NlKGlucHV0X2ZkKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoZmQpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy92b2xuYW1lLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvdm9sbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGU3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvdm9sbmFtZS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBSZWFkcyBhbmQgZGlzcGxheXMgQ0QtUk9NIHZvbHVtZSBuYW1lCisgKgorICogU2V2ZXJhbCBwZW9wbGUgaGF2ZSBhc2tlZCBob3cgdG8gcmVhZCBDRCB2b2x1bWUgbmFtZXMgc28gSSB3cm90ZSB0aGlzCisgKiBzbWFsbCBwcm9ncmFtIHRvIGRvIGl0LgorICoKKyAqIHVzYWdlOiB2b2xuYW1lIFs8ZGV2aWNlLWZpbGU+XQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIEplZmYgVHJhbnRlciAodHJhbnRlckBwb2JveC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogbW9kcyBmcm9tIGRpc3RyaWJ1dGVkIHNvdXJjZSAoZWplY3QtMi4wLjEzKSBhcmUgYnkKKyAqIE1hdHRoZXcgU3RvbHRlbmJlcmcgPGQzbWF0dEBnbWFpbC5jb20+CisgKi8KKworLy91c2FnZTojZGVmaW5lIHZvbG5hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltERVZJQ0VdIgorLy91c2FnZTojZGVmaW5lIHZvbG5hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IENEIHZvbHVtZSBuYW1lIG9mIHRoZSBERVZJQ0UgKGRlZmF1bHQgL2Rldi9jZHJvbSkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgdm9sbmFtZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdm9sbmFtZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCWNoYXIgYnVmZmVyWzMyXTsKKwljb25zdCBjaGFyICpkZXZpY2U7CisKKwlkZXZpY2UgPSAiL2Rldi9jZHJvbSI7CisJaWYgKGFyZ3ZbMV0pIHsKKwkJZGV2aWNlID0gYXJndlsxXTsKKwkJaWYgKGFyZ3ZbMl0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJZmQgPSB4b3BlbihkZXZpY2UsIE9fUkRPTkxZKTsKKwl4bHNlZWsoZmQsIDMyODA4LCBTRUVLX1NFVCk7CisJeHJlYWQoZmQsIGJ1ZmZlciwgMzIpOworCXByaW50ZigiJTMyLjMyc1xuIiwgYnVmZmVyKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UoZmQpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy93YWxsLmMgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvd2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmY1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9taXNjdXRpbHMvd2FsbC5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHdhbGwgLSB3cml0ZSBhIG1lc3NhZ2UgdG8gYWxsIGxvZ2dlZC1pbiB1c2VycworICogQ29weXJpZ2h0IChjKSAyMDA5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHdhbGxfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIltGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSB3YWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiV3JpdGUgY29udGVudCBvZiBGSUxFIG9yIHN0ZGluIHRvIGFsbCBsb2dnZWQtaW4gdXNlcnMiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHdhbGxfc2FtcGxlX3VzYWdlCisvL3VzYWdlOgkiZWNobyBmb28gfCB3YWxsXG4iCisvL3VzYWdlOgkid2FsbCAuL215bWVzc2FnZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB3YWxsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3YWxsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdXRtcCAqdXQ7CisJY2hhciAqbXNnOworCWludCBmZCA9IGFyZ3ZbMV0gPyB4b3Blbihhcmd2WzFdLCBPX1JET05MWSkgOiBTVERJTl9GSUxFTk87CisKKwltc2cgPSB4bWFsbG9jX3JlYWQoZmQsIE5VTEwpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBhcmd2WzFdKQorCQljbG9zZShmZCk7CisJc2V0dXRlbnQoKTsKKwl3aGlsZSAoKHV0ID0gZ2V0dXRlbnQoKSkgIT0gTlVMTCkgeworCQljaGFyICpsaW5lOworCQlpZiAodXQtPnV0X3R5cGUgIT0gVVNFUl9QUk9DRVNTKQorCQkJY29udGludWU7CisJCWxpbmUgPSBjb25jYXRfcGF0aF9maWxlKCIvZGV2IiwgdXQtPnV0X2xpbmUpOworCQl4b3Blbl94d3JpdGVfY2xvc2UobGluZSwgbXNnKTsKKwkJZnJlZShsaW5lKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWVuZHV0ZW50KCk7CisJCWZyZWUobXNnKTsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy93YXRjaGRvZy5jIGIvYnVzeWJveC0xLjE5LjMvbWlzY3V0aWxzL3dhdGNoZG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyOGRjMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21pc2N1dGlscy93YXRjaGRvZy5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHdhdGNoZG9nIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIgPGJ1c3lib3hAYnVzeWJveC5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIERhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgd2F0Y2hkb2dfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdCBOW21zXV0gWy1UIE5bbXNdXSBbLUZdIERFViIKKy8vdXNhZ2U6I2RlZmluZSB3YXRjaGRvZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBlcmlvZGljYWxseSB3cml0ZSB0byB3YXRjaGRvZyBkZXZpY2UgREVWXG4iCisvL3VzYWdlOiAgICAgIlxuCS1UIE4JUmVib290IGFmdGVyIE4gc2Vjb25kcyBpZiBub3QgcmVzZXQgKGRlZmF1bHQgNjApIgorLy91c2FnZTogICAgICJcbgktdCBOCVJlc2V0IGV2ZXJ5IE4gc2Vjb25kcyAoZGVmYXVsdCAzMCkiCisvL3VzYWdlOiAgICAgIlxuCS1GCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5Vc2UgNTAwbXMgdG8gc3BlY2lmeSBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaW51eC90eXBlcy5oIiAvKiBmb3IgX191MzIgKi8KKyNpbmNsdWRlICJsaW51eC93YXRjaGRvZy5oIgorCisjZGVmaW5lIE9QVF9GT1JFR1JPVU5EICAoMSA8PCAwKQorI2RlZmluZSBPUFRfU1RJTUVSICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgT1BUX0hUSU1FUiAgICAgICgxIDw8IDIpCisKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX3NodXRkb3duKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXN0YXRpYyBjb25zdCBjaGFyIFYgPSAnVic7CisKKwl3cml0ZSgzLCAmViwgMSk7ICAvKiBNYWdpYywgc2VlIHdhdGNoZG9nLWFwaS50eHQgaW4ga2VybmVsICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZSgzKTsKKwlfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCitpbnQgd2F0Y2hkb2dfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHdhdGNoZG9nX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgc3VmZml4ZXNbXSA9IHsKKwkJeyAibXMiLCAxIH0sCisJCXsgIiIsIDEwMDAgfSwKKwkJeyAiIiwgMCB9CisJfTsKKworCXVuc2lnbmVkIG9wdHM7CisJdW5zaWduZWQgc3RpbWVyX2R1cmF0aW9uOyAvKiBob3cgb2Z0ZW4gdG8gcmVzdGFydCAqLworCXVuc2lnbmVkIGh0aW1lcl9kdXJhdGlvbiA9IDYwMDAwOyAvKiByZWJvb3RzIGFmdGVyIE4gbXMgaWYgbm90IHJlc3RhcnRlZCAqLworCWNoYXIgKnN0X2FyZzsKKwljaGFyICpodF9hcmc7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MSI7IC8qIG11c3QgaGF2ZSBleGFjdGx5IDEgYXJndW1lbnQgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIkZ0OlQ6IiwgJnN0X2FyZywgJmh0X2FyZyk7CisKKwkvKiBXZSBuZWVkIHRvIGRhZW1vbml6ZSAqYmVmb3JlKiBvcGVuaW5nIHRoZSB3YXRjaGRvZyBhcyBtYW55IGRyaXZlcnMKKwkgKiB3aWxsIG9ubHkgYWxsb3cgb25lIHByb2Nlc3MgYXQgYSB0aW1lIHRvIGRvIHNvLiAgU2luY2UgZGFlbW9uaXppbmcKKwkgKiBpcyBub3QgcGVyZmVjdCAoY2hpbGQgbWF5IHJ1biBiZWZvcmUgcGFyZW50IGZpbmlzaGVzIGV4aXRpbmcpLCB3ZQorCSAqIGNhbid0IHJlbHkgb24gcGFyZW50IGV4aXRpbmcgYmVmb3JlIHVzIChsZXQgYWxvbmUgKmNsZWFubHkqIHJlbGVhc2luZworCSAqIHRoZSB3YXRjaGRvZyBmZCAtLSBzb21ldGhpbmcgZWxzZSB0aGF0IG1heSBub3QgZXZlbiBiZSBhbGxvd2VkKS4KKwkgKi8KKwlpZiAoIShvcHRzICYgT1BUX0ZPUkVHUk9VTkQpKQorCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NIRElSX1JPT1QsIGFyZ3YpOworCisJaWYgKG9wdHMgJiBPUFRfSFRJTUVSKQorCQlodGltZXJfZHVyYXRpb24gPSB4YXRvdV9zZngoaHRfYXJnLCBzdWZmaXhlcyk7CisJc3RpbWVyX2R1cmF0aW9uID0gaHRpbWVyX2R1cmF0aW9uIC8gMjsKKwlpZiAob3B0cyAmIE9QVF9TVElNRVIpCisJCXN0aW1lcl9kdXJhdGlvbiA9IHhhdG91X3NmeChzdF9hcmcsIHN1ZmZpeGVzKTsKKworCWJiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgd2F0Y2hkb2dfc2h1dGRvd24pOworCisJLyogVXNlIGtub3duIGZkICMgLSBhdm9pZCBuZWVkaW5nIGdsb2JhbCAnaW50IGZkJyAqLworCXhtb3ZlX2ZkKHhvcGVuKGFyZ3ZbYXJnYyAtIDFdLCBPX1dST05MWSksIDMpOworCisJLyogV0RJT0NfU0VUVElNRU9VVCB0YWtlcyBzZWNvbmRzLCBub3QgbWlsbGlzZWNvbmRzICovCisJaHRpbWVyX2R1cmF0aW9uID0gaHRpbWVyX2R1cmF0aW9uIC8gMTAwMDsKKyNpZm5kZWYgV0RJT0NfU0VUVElNRU9VVAorIyBlcnJvciBXRElPQ19TRVRUSU1FT1VUIGlzIG5vdCBkZWZpbmVkLCBjYW5ub3QgY29tcGlsZSB3YXRjaGRvZyBhcHBsZXQKKyNlbHNlCisjIGlmIGRlZmluZWQgV0RJT0NfU0VUT1BUSU9OUyAmJiBkZWZpbmVkIFdESU9TX0VOQUJMRUNBUkQKKwl7CisJCXN0YXRpYyBjb25zdCBpbnQgZW5hYmxlID0gV0RJT1NfRU5BQkxFQ0FSRDsKKwkJaW9jdGxfb3Jfd2FybigzLCBXRElPQ19TRVRPUFRJT05TLCAodm9pZCopICZlbmFibGUpOworCX0KKyMgZW5kaWYKKwlpb2N0bF9vcl93YXJuKDMsIFdESU9DX1NFVFRJTUVPVVQsICZodGltZXJfZHVyYXRpb24pOworI2VuZGlmCisKKyNpZiAwCisJaW9jdGxfb3Jfd2FybigzLCBXRElPQ19HRVRUSU1FT1VULCAmaHRpbWVyX2R1cmF0aW9uKTsKKwlwcmludGYoIndhdGNoZG9nOiBTVyB0aW1lciBpcyAlZG1zLCBIVyB0aW1lciBpcyAlZHNcbiIsCisJCXN0aW1lcl9kdXJhdGlvbiwgaHRpbWVyX2R1cmF0aW9uICogMTAwMCk7CisjZW5kaWYKKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgY291bnRlciBiZWZvcmUgc2xlZXBpbmcsCisJCSAqIGFzIHRoZSBjb3VudGVyIHZhbHVlIGlzIHVuZGVmaW5lZCBhdCB0aGlzIHBvaW50IC0tIFBGTQorCQkgKi8KKwkJd3JpdGUoMywgIiIsIDEpOyAvKiB3cml0ZSB6ZXJvIGJ5dGUgKi8KKwkJdXNsZWVwKHN0aW1lcl9kdXJhdGlvbiAqIDEwMDBMKTsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLyogLSBub3QgcmVhY2hlZCwgYnV0IGdjYyA0LjIuMSBpcyB0b28gZHVtYiEgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWFjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMjYzIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJMaW51eCBNb2R1bGUgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIE1PRFBST0JFX1NNQUxMCisJYm9vbCAiU2ltcGxpZmllZCBtb2R1dGlscyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTaW1wbGlmaWVkIG1vZHV0aWxzLgorCisJICBXaXRoIHRoaXMgb3B0aW9uIG1vZHByb2JlIGRvZXMgbm90IHJlcXVpcmUgbW9kdWxlcy5kZXAgZmlsZQorCSAgYW5kIGRvZXMgbm90IHVzZSAvZXRjL21vZHVsZXMuY29uZiBmaWxlLgorCSAgSXQgc2NhbnMgbW9kdWxlIGZpbGVzIGluIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgIGFuZAorCSAgZGV0ZXJtaW5lcyBkZXBlbmRlbmNpZXMgYW5kIG1vZHVsZSBhbGlhcyBuYW1lcyBvbiB0aGUgZmx5LgorCSAgVGhpcyBtYXkgbWFrZSBtb2R1bGUgbG9hZGluZyBzbG93ZXIsIG1vc3Qgbm90YWJseQorCSAgd2hlbiBvbmUgbmVlZHMgdG8gbG9hZCBtb2R1bGUgYnkgYWxpYXMgKHRoaXMgcmVxdWlyZXMKKwkgIHNjYW5uaW5nIHRocm91Z2ggbW9kdWxlIF9ib2RpZXNfKS4KKworCSAgQXQgdGhlIGZpcnN0IGF0dGVtcHQgdG8gbG9hZCBhIG1vZHVsZSBieSBhbGlhcyBtb2Rwcm9iZQorCSAgd2lsbCB0cnkgdG8gZ2VuZXJhdGUgbW9kdWxlcy5kZXAuYmIgZmlsZSBpbiBvcmRlciB0byBzcGVlZCB1cAorCSAgZnV0dXJlIGxvYWRzIGJ5IGFsaWFzLiBGYWlsdXJlIHRvIGRvIHNvIChyZWFkLW9ubHkgL2xpYi9tb2R1bGVzLAorCSAgZXRjKSBpcyBub3QgcmVwb3J0ZWQsIGFuZCBmdXR1cmUgbW9kcHJvYmVzIHdpbGwgYmUgc2xvdyB0b28uCisKKwkgIE5COiBtb2R1bGVzLmRlcC5iYiBmaWxlIGZvcm1hdCBpcyBub3QgY29tcGF0aWJsZQorCSAgd2l0aCBtb2R1bGVzLmRlcCBmaWxlIGFzIGNyZWF0ZWQvdXNlZCBieSBzdGFuZGFyZCBtb2R1bGUgdG9vbHMuCisKKwkgIEFkZGl0aW9uYWwgbW9kdWxlIHBhcmFtZXRlcnMgY2FuIGJlIHN0b3JlZCBpbgorCSAgL2V0Yy9tb2R1bGVzLyRtb2R1bGVfbmFtZSBmaWxlcy4KKworCSAgQXBhcnQgZnJvbSBtb2Rwcm9iZSwgb3RoZXIgdXRpbGl0aWVzIGFyZSBhbHNvIHByb3ZpZGVkOgorCSAgLSBpbnNtb2QgaXMgYW4gYWxpYXMgdG8gbW9kcHJvYmUKKwkgIC0gcm1tb2QgaXMgYW4gYWxpYXMgdG8gbW9kcHJvYmUgLXIKKwkgIC0gZGVwbW9kIGdlbmVyYXRlcyBtb2R1bGVzLmRlcC5iYgorCisJICBBcyBvZiAyMDA4LTA3LCB0aGlzIGNvZGUgaXMgZXhwZXJpbWVudGFsLiBJdCBpcyAxNGtiIHNtYWxsZXIKKwkgIHRoYW4gIm5vbi1zbWFsbCIgbW9kdXRpbHMuCisKK2NvbmZpZyBGRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORQorCWJvb2wgIkFjY2VwdCBtb2R1bGUgb3B0aW9ucyBvbiBtb2Rwcm9iZSBjb21tYW5kIGxpbmUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFsbG93IGluc21vZCBhbmQgbW9kcHJvYmUgdGFrZSBtb2R1bGUgb3B0aW9ucyBmcm9tIGNvbW1hbmQgbGluZS4KKworY29uZmlnIEZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQKKwlib29sICJTa2lwIGxvYWRpbmcgb2YgYWxyZWFkeSBsb2FkZWQgbW9kdWxlcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PRFBST0JFX1NNQUxMCisJaGVscAorCSAgQ2hlY2sgaWYgdGhlIG1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC4KKworY29uZmlnIElOU01PRAorCWJvb2wgImluc21vZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGluc21vZCBpcyB1c2VkIHRvIGxvYWQgc3BlY2lmaWVkIG1vZHVsZXMgaW4gdGhlIHJ1bm5pbmcga2VybmVsLgorCitjb25maWcgUk1NT0QKKwlib29sICJybW1vZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIHJtbW9kIGlzIHVzZWQgdG8gdW5sb2FkIHNwZWNpZmllZCBtb2R1bGVzIGZyb20gdGhlIGtlcm5lbC4KKworY29uZmlnIExTTU9ECisJYm9vbCAibHNtb2QiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAhTU9EUFJPQkVfU01BTEwKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBsc21vZCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzLgorCitjb25maWcgRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVAorCWJvb2wgIlByZXR0eSBvdXRwdXQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBMU01PRAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIG91dHB1dCBmb3JtYXQgb2YgbHNtb2QgYWRqdXN0ZWQgdG8KKwkgIHRoZSBmb3JtYXQgb2YgbW9kdWxlLWluaXQtdG9vbHMgZm9yIExpbnV4IGtlcm5lbCAyLjYuCisJICBJbmNyZWFzZXMgc2l6ZSBzb21ld2hhdC4KKworY29uZmlnIE1PRFBST0JFCisJYm9vbCAibW9kcHJvYmUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAhTU9EUFJPQkVfU01BTEwKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBIYW5kbGUgdGhlIGxvYWRpbmcgb2YgbW9kdWxlcywgYW5kIHRoZWlyIGRlcGVuZGVuY2llcyBvbiBhIGhpZ2gKKwkgIGxldmVsLgorCitjb25maWcgRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QKKwlib29sICJCbGFja2xpc3Qgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE1PRFBST0JFCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU2F5ICd5JyBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgJ2JsYWNrbGlzdCcgY29tbWFuZCBpbgorCSAgbW9kcHJvYmUuY29uZi4gVGhpcyBwcmV2ZW50cyB0aGUgYWxpYXMgcmVzb2x2ZXIgdG8gcmVzb2x2ZQorCSAgYmxhY2tsaXN0ZWQgbW9kdWxlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcHJldmVudCB5b3VyCisJICBoYXJkd2FyZSBhdXRvZGV0ZWN0aW9uIHNjcmlwdHMgdG8gbG9hZCBtb2R1bGVzIGxpa2UgZXZkZXYsIGZyYW1lCisJICBidWZmZXIgZHJpdmVycyBldGMuCisKK2NvbmZpZyBERVBNT0QKKwlib29sICJkZXBtb2QiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAhTU9EUFJPQkVfU01BTEwKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBkZXBtb2QgZ2VuZXJhdGVzIG1vZHVsZXMuZGVwIChhbmQgcG90ZW50aWFsbHkgbW9kdWxlcy5hbGlhcworCSAgYW5kIG1vZHVsZXMuc3ltYm9scykgdGhhdCBjb250YWluIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KKwkgIGZvciBtb2Rwcm9iZS4KKworY29tbWVudCAiT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMiCisKK2NvbmZpZyBGRUFUVVJFXzJfNF9NT0RVTEVTCisJYm9vbCAiU3VwcG9ydCB2ZXJzaW9uIDIuMi8yLjQgTGludXgga2VybmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElOU01PRCB8fCBSTU1PRCB8fCBMU01PRAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFN1cHBvcnQgbW9kdWxlIGxvYWRpbmcgZm9yIDIuMi54IGFuZCAyLjQueCBMaW51eCBrZXJuZWxzLgorCSAgVGhpcyBpbmNyZWFzZXMgc2l6ZSBjb25zaWRlcmFibHkuIFNheSBOIHVubGVzcyB5b3UgcGxhbgorCSAgdG8gcnVuIGFuY2llbnQga2VybmVscy4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQCisJYm9vbCAiVHJ5IHRvIGxvYWQgbW9kdWxlIGZyb20gYSBtbWFwJ2VkIGFyZWEiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBJTlNNT0QgfHwgTU9EUFJPQkVfU01BTEwKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgbW9kdWxlIGxvYWRpbmcgY29kZSB0byB0cnkgdG8gbW1hcAorCSAgbW9kdWxlIGZpcnN0LiBJZiBpdCBkb2VzIG5vdCB3b3JrIChmb3IgZXhhbXBsZSwKKwkgIGl0IGRvZXMgbm90IHdvcmsgZm9yIGNvbXByZXNzZWQgbW9kdWxlcyksIG1vZHVsZSB3aWxsIGJlIHJlYWQKKwkgIChhbmQgdW5wYWNrZWQgaWYgbmVlZGVkKSBpbnRvIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBieSBtYWxsb2MuCisKKwkgIFRoZSBvbmx5IGNhc2Ugd2hlbiBtbWFwIHdvcmtzIGJ1dCBtYWxsb2MgZG9lcyBub3QgaXMgd2hlbgorCSAgeW91IGFyZSB0cnlpbmcgdG8gbG9hZCBhIGJpZyBtb2R1bGUgb24gYSB2ZXJ5IG1lbW9yeS1jb25zdHJhaW5lZAorCSAgbWFjaGluZS4gTWFsbG9jIHdpbGwgbW9tZW50YXJpbHkgbmVlZCAyeCBhcyBtdWNoIG1lbW9yeSBhcyBtbWFwLgorCisJICBDaG9vc2luZyBOIHNhdmVzIGFib3V0IDI1MCBieXRlcyBvZiBjb2RlIChvbiAzMi1iaXQgeDg2KS4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKKwlib29sICJFbmFibGUgbW9kdWxlIHZlcnNpb24gY2hlY2tpbmciCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRUFUVVJFXzJfNF9NT0RVTEVTICYmIChJTlNNT0QgfHwgTU9EUFJPQkUpCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU3VwcG9ydCBjaGVja2luZyBvZiB2ZXJzaW9ucyBmb3IgbW9kdWxlcy4gVGhpcyBpcyB1c2VkIHRvCisJICBlbnN1cmUgdGhhdCB0aGUga2VybmVsIGFuZCBtb2R1bGUgYXJlIG1hZGUgZm9yIGVhY2ggb3RoZXIuCisKK2NvbmZpZyBGRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTCisJYm9vbCAiQWRkIG1vZHVsZSBzeW1ib2xzIHRvIGtlcm5lbCBzeW1ib2wgdGFibGUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRUFUVVJFXzJfNF9NT0RVTEVTICYmIChJTlNNT0QgfHwgTU9EUFJPQkUpCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQnkgYWRkaW5nIG1vZHVsZSBzeW1ib2xzIHRvIHRoZSBrZXJuZWwgc3ltYm9sIHRhYmxlLCBPb3BzIG1lc3NhZ2VzCisJICBvY2N1cmluZyB3aXRoaW4ga2VybmVsIG1vZHVsZXMgY2FuIGJlIHByb3Blcmx5IGRlYnVnZ2VkLiBCeSBlbmFibGluZworCSAgdGhpcyBmZWF0dXJlLCBtb2R1bGUgc3ltYm9scyB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUga2VybmVsIHN5bWJvbAorCSAgdGFibGUgZm9yIHByb3BlciBkZWJ1Z2dpbmcgc3VwcG9ydC4gSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbgorCSAgT29wcyBtZXNzYWdlcyBmcm9tIGtlcm5lbCBtb2R1bGVzLCBzYXkgTi4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0KKwlib29sICJJbiBrZXJuZWwgbWVtb3J5IG9wdGltaXphdGlvbiAodUNsaW51eCBvbmx5KSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfMl80X01PRFVMRVMgJiYgKElOU01PRCB8fCBNT0RQUk9CRSkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIGlzIGEgc3BlY2lhbCB1Q2xpbnV4IG9ubHkgbWVtb3J5IG9wdGltaXphdGlvbiB0aGF0IGxldHMgaW5zbW9kCisJICBsb2FkIHRoZSBzcGVjaWZpZWQga2VybmVsIG1vZHVsZSBkaXJlY3RseSBpbnRvIGtlcm5lbCBzcGFjZSwgcmVkdWNpbmcKKwkgIG1lbW9yeSB1c2FnZSBieSBwcmV2ZW50aW5nIHRoZSBuZWVkIGZvciB0d28gY29waWVzIG9mIHRoZSBtb2R1bGUKKwkgIGJlaW5nIGxvYWRlZCBpbnRvIG1lbW9yeS4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCisJYm9vbCAiRW5hYmxlIGluc21vZCBsb2FkIG1hcCAoLW0pIG9wdGlvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfMl80X01PRFVMRVMgJiYgSU5TTU9ECisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcywgb25lIHdvdWxkIGJlIGFibGUgdG8gZ2V0IGEgbG9hZCBtYXAKKwkgIG91dHB1dCBvbiBzdGRvdXQuIFRoaXMgbWFrZXMga2VybmVsIG1vZHVsZSBkZWJ1Z2dpbmcKKwkgIGVhc2llci4KKwkgIElmIHlvdSBkb24ndCBwbGFuIHRvIGRlYnVnIGtlcm5lbCBtb2R1bGVzLCB5b3UKKwkgIGRvbid0IG5lZWQgdGhpcyBvcHRpb24uCisKK2NvbmZpZyBGRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMCisJYm9vbCAiU3ltYm9scyBpbiBsb2FkIG1hcCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSU5TTU9EX0xPQURfTUFQICYmICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFdpdGhvdXQgdGhpcyBvcHRpb24sIC1tIHdpbGwgb25seSBvdXRwdXQgc2VjdGlvbgorCSAgbG9hZCBtYXAuIFdpdGggdGhpcyBvcHRpb24sIC1tIHdpbGwgYWxzbyBvdXRwdXQKKwkgIHN5bWJvbHMgbG9hZCBtYXAuCisKK2NvbmZpZyBGRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCisJYm9vbCAiU3VwcG9ydCB0YWludGVkIG1vZHVsZSBjaGVja2luZyB3aXRoIG5ldyBrZXJuZWxzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gKExTTU9EIHx8IEZFQVRVUkVfMl80X01PRFVMRVMpICYmICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFN1cHBvcnQgY2hlY2tpbmcgZm9yIHRhaW50ZWQgbW9kdWxlcy4gVGhlc2UgYXJlIHVzdWFsbHkgYmluYXJ5CisJICBvbmx5IG1vZHVsZXMgdGhhdCB3aWxsIG1ha2UgdGhlIGxpbnV4LWtlcm5lbCBsaXN0IGlnbm9yZSB5b3VyCisJICBzdXBwb3J0IHJlcXVlc3QuCisJICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCB0byBzdXBwb3J0IEdQTE9OTFkgbW9kdWxlcy4KKworY29uZmlnIEZFQVRVUkVfTU9EVVRJTFNfQUxJQVMKKwlib29sICJTdXBwb3J0IGZvciBtb2R1bGUuYWxpYXNlcyBmaWxlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVQTU9EIHx8IE1PRFBST0JFCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgR2VuZXJhdGUgYW5kIHBhcnNlIG1vZHVsZXMuYWxpYXMgY29udGFpbmluZyBhbGlhc2VzIGZvciBidXMKKwkgIGlkZW50aWZpZXJzOgorCSAgICBhbGlhcyBwY21jaWE6bSpjKmYwM2ZuKnBmbipwYSpwYipwYypwZCogcGFycG9ydF9jcworCisJICBhbmQgYWxpYXNlcyBmb3IgbG9naWNhbCBtb2R1bGVzIG5hbWVzIGUuZy46CisJICAgIGFsaWFzIHBhZGxvY2tfYWVzIGFlcworCSAgICBhbGlhcyBhZXNfaTU4NiBhZXMKKwkgICAgYWxpYXMgYWVzX2dlbmVyaWMgYWVzCisKKwkgIFNheSBZIGlmIHVuc3VyZS4KKworY29uZmlnIEZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUworCWJvb2wgIlN1cHBvcnQgZm9yIG1vZHVsZS5zeW1ib2xzIGZpbGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERVBNT0QgfHwgTU9EUFJPQkUKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBHZW5lcmF0ZSBhbmQgcGFyc2UgbW9kdWxlcy5zeW1ib2xzIGNvbnRhaW5pbmcgYWxpYXNlcyBmb3IKKwkgIHN5bWJvbF9yZXF1ZXN0KCkga2VybmVsIGNhbGxzLCBzdWNoIGFzOgorCSAgICBhbGlhcyBzeW1ib2w6dXNiX3NnX2luaXQgdXNiY29yZQorCisJICBTYXkgWSBpZiB1bnN1cmUuCisKK2NvbmZpZyBERUZBVUxUX01PRFVMRVNfRElSCisJc3RyaW5nICJEZWZhdWx0IGRpcmVjdG9yeSBjb250YWluaW5nIG1vZHVsZXMiCisJZGVmYXVsdCAiL2xpYi9tb2R1bGVzIgorCWRlcGVuZHMgb24gREVQTU9EIHx8IE1PRFBST0JFIHx8IE1PRFBST0JFX1NNQUxMIHx8IE1PRElORk8KKwloZWxwCisJICBEaXJlY3RvcnkgdGhhdCBjb250YWlucyBrZXJuZWwgbW9kdWxlcy4KKwkgIERlZmF1bHRzIHRvICIvbGliL21vZHVsZXMiCisKK2NvbmZpZyBERUZBVUxUX0RFUE1PRF9GSUxFCisJc3RyaW5nICJEZWZhdWx0IG5hbWUgb2YgbW9kdWxlcy5kZXAiCisJZGVmYXVsdCAibW9kdWxlcy5kZXAiCisJZGVwZW5kcyBvbiBERVBNT0QgfHwgTU9EUFJPQkUgfHwgTU9EUFJPQkVfU01BTEwgfHwgTU9ESU5GTworCWhlbHAKKwkgIEZpbGVuYW1lIHRoYXQgY29udGFpbnMga2VybmVsIG1vZHVsZXMgZGVwZW5kZW5jaWVzLgorCSAgRGVmYXVsdHMgdG8gIm1vZHVsZXMuZGVwIgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTdhYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE2IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19NT0RQUk9CRV9TTUFMTCkgICAgICArPSBtb2Rwcm9iZS1zbWFsbC5vCitsaWItJChDT05GSUdfREVQTU9EKSAgICAgICAgICAgICAgKz0gZGVwbW9kLm8gbW9kdXRpbHMubworbGliLSQoQ09ORklHX0lOU01PRCkgICAgICAgICAgICAgICs9IGluc21vZC5vIG1vZHV0aWxzLm8KK2xpYi0kKENPTkZJR19MU01PRCkgICAgICAgICAgICAgICArPSBsc21vZC5vIG1vZHV0aWxzLm8KK2xpYi0kKENPTkZJR19NT0RQUk9CRSkgICAgICAgICAgICArPSBtb2Rwcm9iZS5vIG1vZHV0aWxzLm8KK2xpYi0kKENPTkZJR19STU1PRCkgICAgICAgICAgICAgICArPSBybW1vZC5vIG1vZHV0aWxzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTKSArPSBtb2R1dGlscy0yNC5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9kZXBtb2QuYyBiL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL2RlcG1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzBiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9kZXBtb2QuYwpAQCAtMCwwICsxLDI3NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZGVwbW9kIC0gZ2VuZXJhdGUgbW9kdWxlcy5kZXAKKyAqIENvcHlyaWdodCAoYykgMjAwOCBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqIENvcHlyaWhndCAoYykgMjAwOCBUaW1vIFRlcmFzIDx0aW1vLnRlcmFzQGlraS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBEcm9ubmlrb3YKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX0RFUE1PRChBUFBMRVQoZGVwbW9kLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy91c2FnZTojaWYgIUVOQUJMRV9NT0RQUk9CRV9TTUFMTAorLy91c2FnZTojZGVmaW5lIGRlcG1vZF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZGVwbW9kX2Z1bGxfdXNhZ2UgIiIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1vZHV0aWxzLmgiCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4gLyogdW5hbWUoKSAqLworCisvKgorICogVGhlb3J5IG9mIG9wZXJhdGlvbjoKKyAqIC0gaXRlcmF0ZSBvdmVyIGFsbCBtb2R1bGVzIGFuZCByZWNvcmQgdGhlaXIgZnVsbCBwYXRoCisgKiAtIGl0ZXJhdGUgb3ZlciBhbGwgbW9kdWxlcyBsb29raW5nIGZvciAiZGVwZW5kcz0iIGVudHJpZXMKKyAqICAgZm9yIGVhY2ggZGVwZW5kcywgbG9vayB0aHJvdWdoIG91ciBsaXN0IG9mIGZ1bGwgcGF0aHMgYW5kIGVtaXQgaWYgZm91bmQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBtb2R1bGVfaW5mbyB7CisJc3RydWN0IG1vZHVsZV9pbmZvICpuZXh0OworCWNoYXIgKm5hbWUsICptb2RuYW1lOworCWxsaXN0X3QgKmRlcGVuZGVuY2llczsKKwlsbGlzdF90ICphbGlhc2VzOworCWxsaXN0X3QgKnN5bWJvbHM7CisJc3RydWN0IG1vZHVsZV9pbmZvICpkbmV4dCwgKmRwcmV2OworfSBtb2R1bGVfaW5mbzsKKworc3RhdGljIGludCBGQVNUX0ZVTkMgcGFyc2VfbW9kdWxlKGNvbnN0IGNoYXIgKmZuYW1lLCBzdHJ1Y3Qgc3RhdCAqc2IgVU5VU0VEX1BBUkFNLAorCQkJCSAgdm9pZCAqZGF0YSwgaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyIG1vZG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwltb2R1bGVfaW5mbyAqKmZpcnN0ID0gKG1vZHVsZV9pbmZvICoqKSBkYXRhOworCWNoYXIgKmltYWdlLCAqcHRyOworCW1vZHVsZV9pbmZvICppbmZvOworCS8qIEFyYml0cmFyeS4gV2FzIHNiLT5zdF9zaXplLCBidXQgdGhhdCBicmVha3MgLmd6IGV0YyAqLworCXNpemVfdCBsZW4gPSAoNjQqMTAyNCoxMDI0IC0gNDA5Nik7CisKKwlpZiAoc3RycnN0cihmbmFtZSwgIi5rbyIpID09IE5VTEwpCisJCXJldHVybiBUUlVFOworCisJaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoZm5hbWUsICZsZW4pOworCWluZm8gPSB4emFsbG9jKHNpemVvZigqaW5mbykpOworCisJaW5mby0+bmV4dCA9ICpmaXJzdDsKKwkqZmlyc3QgPSBpbmZvOworCisJaW5mby0+ZG5leHQgPSBpbmZvLT5kcHJldiA9IGluZm87CisJaW5mby0+bmFtZSA9IHhzdHJkdXAoZm5hbWUgKyAyKTsgLyogc2tpcCAiLi8iICovCisJaW5mby0+bW9kbmFtZSA9IHhzdHJkdXAoZmlsZW5hbWUybW9kbmFtZShmbmFtZSwgbW9kbmFtZSkpOworCWZvciAocHRyID0gaW1hZ2U7IHB0ciA8IGltYWdlICsgbGVuIC0gMTA7IHB0cisrKSB7CisJCWlmIChzdHJuY21wKHB0ciwgImRlcGVuZHM9IiwgOCkgPT0gMCkgeworCQkJY2hhciAqdTsKKworCQkJcHRyICs9IDg7CisJCQlmb3IgKHUgPSBwdHI7ICp1OyB1KyspCisJCQkJaWYgKCp1ID09ICctJykKKwkJCQkJKnUgPSAnXyc7CisJCQlwdHIgKz0gc3RyaW5nX3RvX2xsaXN0KHB0ciwgJmluZm8tPmRlcGVuZGVuY2llcywgIiwiKTsKKwkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19BTElBUworCQkgJiYgc3RybmNtcChwdHIsICJhbGlhcz0iLCA2KSA9PSAwCisJCSkgeworCQkJbGxpc3RfYWRkX3RvKCZpbmZvLT5hbGlhc2VzLCB4c3RyZHVwKHB0ciArIDYpKTsKKwkJCXB0ciArPSBzdHJsZW4ocHRyKTsKKwkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTCisJCSAmJiBzdHJuY21wKHB0ciwgIl9fa3N5bXRhYl8iLCAxMCkgPT0gMAorCQkpIHsKKwkJCXB0ciArPSAxMDsKKwkJCWlmIChzdHJuY21wKHB0ciwgImdwbCIsIDMpID09IDAKKwkJCSB8fCBzdHJjbXAocHRyLCAic3RyaW5ncyIpID09IDAKKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbGxpc3RfYWRkX3RvKCZpbmZvLT5zeW1ib2xzLCB4c3RyZHVwKHB0cikpOworCQkJcHRyICs9IHN0cmxlbihwdHIpOworCQl9CisJfQorCWZyZWUoaW1hZ2UpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBtb2R1bGVfaW5mbyAqZmluZF9tb2R1bGUobW9kdWxlX2luZm8gKm1vZHVsZXMsIGNvbnN0IGNoYXIgKm1vZG5hbWUpCit7CisJbW9kdWxlX2luZm8gKm07CisKKwlmb3IgKG0gPSBtb2R1bGVzOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQorCQlpZiAoc3RyY21wKG0tPm1vZG5hbWUsIG1vZG5hbWUpID09IDApCisJCQlyZXR1cm4gbTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgb3JkZXJfZGVwX2xpc3QobW9kdWxlX2luZm8gKm1vZHVsZXMsIG1vZHVsZV9pbmZvICpzdGFydCwKKwkJCSAgIGxsaXN0X3QgKmFkZCkKK3sKKwltb2R1bGVfaW5mbyAqbTsKKwlsbGlzdF90ICpuOworCisJZm9yIChuID0gYWRkOyBuICE9IE5VTEw7IG4gPSBuLT5saW5rKSB7CisJCW0gPSBmaW5kX21vZHVsZShtb2R1bGVzLCBuLT5kYXRhKTsKKwkJaWYgKG0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHVubGluayBjdXJyZW50IGVudHJ5ICovCisJCW0tPmRuZXh0LT5kcHJldiA9IG0tPmRwcmV2OworCQltLT5kcHJldi0+ZG5leHQgPSBtLT5kbmV4dDsKKworCQkvKiBhbmQgYWRkIGl0IHRvIHRhaWwgKi8KKwkJbS0+ZG5leHQgPSBzdGFydDsKKwkJbS0+ZHByZXYgPSBzdGFydC0+ZHByZXY7CisJCXN0YXJ0LT5kcHJldi0+ZG5leHQgPSBtOworCQlzdGFydC0+ZHByZXYgPSBtOworCisJCS8qIHJlY3Vyc2UgKi8KKwkJb3JkZXJfZGVwX2xpc3QobW9kdWxlcywgc3RhcnQsIG0tPmRlcGVuZGVuY2llcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4ZnJlb3Blbl93cml0ZShjb25zdCBjaGFyICpmaWxlLCBGSUxFICpmKQoreworCWlmIChmcmVvcGVuKGZpbGUsICJ3IiwgZikgPT0gTlVMTCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCBmaWxlKTsKK30KKworLyogVXNhZ2U6CisgKiBbLWFBZW52XSBbLUMgRklMRSBvciBESVJdIFstYiBCQVNFXSBbLUYgU3lzdGVtLm1hcF0gW1ZFUlNJT05dIFtNT0RGSUxFU10uLi4KKyAqCS1hIC0tYWxsCisgKgkJUHJvYmUgYWxsIG1vZHVsZXMuIERlZmF1bHQgaWYgbm8gTU9ERklMRVMuCisgKgktQSAtLXF1aWNrCisgKgkJQ2hlY2sgbW9kdWxlcy5kZXAncyBtdGltZSBhZ2FpbnN0IG1vZHVsZSBmaWxlcycgbXRpbWVzLgorICoJLWIgLS1iYXNlZGlyIEJBU0UKKyAqCQlVc2UgJEJBU0UvbGliL21vZHVsZXMvVkVSU0lPTgorICoJLUMgLS1jb25maWcgRklMRSBvciBESVIKKyAqCQlQYXRoIHRvIC9ldGMvZGVwbW9kLmNvbmYgb3IgL2V0Yy9kZXBtb2QuZC8KKyAqCS1lIC0tZXJyc3ltcworICoJCVdoZW4gY29tYmluZWQgd2l0aCB0aGUgLUYgb3B0aW9uLCB0aGlzIHJlcG9ydHMgYW55IHN5bWJvbHMgd2hpY2gKKyAqCQl3aGljaCBhcmUgbm90IHN1cHBsaWVkIGJ5IG90aGVyIG1vZHVsZXMgb3Iga2VybmVsLgorICoJLUYgLS1maWxlc3ltcyBTeXN0ZW0ubWFwCisgKgktbiAtLWRyeS1ydW4KKyAqCQlQcmludCBtb2R1bGVzLmRlcCBldGMgdG8gc3RhbmRhcmQgb3V0cHV0CisgKgktdiAtLXZlcmJvc2UKKyAqCQlQcmludCB0byBzdGRvdXQgYWxsIHRoZSBzeW1ib2xzIGVhY2ggbW9kdWxlIGRlcGVuZHMgb24KKyAqCQlhbmQgdGhlIG1vZHVsZSdzIGZpbGUgbmFtZSB3aGljaCBwcm92aWRlcyB0aGF0IHN5bWJvbC4KKyAqCS1yCU5vLW9wCisgKgktdQlOby1vcAorICoJLXEJTm8tb3AKKyAqCisgKiBTbyBmYXIgd2Ugb25seSBzdXBwb3J0OiBbLXJuXSBbLWIgQkFTRV0gW1ZFUlNJT05dIFtNT0RGSUxFU10uLi4KKyAqIC1hQWVGIGFyZSBhY2NlcHRlZCBidXQgaWdub3JlZC4gLXZDIGFyZSBub3QgYWNjZXB0ZWQuCisgKi8KK2VudW0geworCS8vT1BUX2EgPSAoMSA8PCAwKSwgLyogQWxsIG1vZHVsZXMsIGlnbm9yZSBtb2RzIGluIGFyZ3YgKi8KKwkvL09QVF9BID0gKDEgPDwgMSksIC8qIE9ubHkgZW1pdCAua28gdGhhdCBhcmUgbmV3ZXIgdGhhbiBtb2R1bGVzLmRlcCBmaWxlICovCisJT1BUX2IgPSAoMSA8PCAyKSwgLyogYmFzZSBkaXJlY3Rvcnkgd2hlbiBtb2R1bGVzIGFyZSBpbiBzdGFnaW5nIGFyZWEgKi8KKwkvL09QVF9lID0gKDEgPDwgMyksIC8qIHdpdGggLUYsIHByaW50IHVucmVzb2x2ZWQgc3ltYm9scyAqLworCS8vT1BUX0YgPSAoMSA8PCA0KSwgLyogU3lzdGVtLm1hcCB0aGF0IGNvbnRhaW5zIHRoZSBzeW1ib2xzICovCisJT1BUX24gPSAoMSA8PCA1KSwgLyogZHJ5LXJ1biwgcHJpbnQgdG8gc3Rkb3V0IG9ubHkgKi8KKwlPUFRfciA9ICgxIDw8IDYpLCAvKiBDb21wYXQgZHVtbXkuIExpbnV4IE1ha2VmaWxlIHVzZXMgaXQgKi8KKwlPUFRfdSA9ICgxIDw8IDcpLCAvKiAtdSwtLXVucmVzb2x2ZWQtZXJyb3I6IGlnbm9yZWQgKi8KKwlPUFRfcSA9ICgxIDw8IDgpLCAvKiAtcSwtLXF1aWV0OiBpZ25vcmVkICovCisJT1BUX0MgPSAoMSA8PCA5KSwgLyogLUMsLS1jb25maWcgZXRjX21vZHVsZXNfY29uZjogaWdub3JlZCAqLworfTsKKworaW50IGRlcG1vZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGVwbW9kX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwltb2R1bGVfaW5mbyAqbW9kdWxlcywgKm0sICpkZXA7CisJY29uc3QgY2hhciAqbW9kZGlyX2Jhc2UgPSAiLyI7CisJY2hhciAqbW9kZGlyLCAqdmVyc2lvbjsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJaW50IHRtcDsKKworCWdldG9wdDMyKGFyZ3YsICJhQWI6ZUY6bnJ1cUM6IiwgJm1vZGRpcl9iYXNlLCBOVUxMLCBOVUxMKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIGdvdG8gbW9kdWxlcyBsb2NhdGlvbiAqLworCXhjaGRpcihtb2RkaXJfYmFzZSk7CisKKwkvKiBJZiBhIHZlcnNpb24gaXMgcHJvdmlkZWQsIHRoZW4gdGhhdCBrZXJuZWwgdmVyc2lvbidzIG1vZHVsZSBkaXJlY3RvcnkKKwkgKiBpcyB1c2VkLCByYXRoZXIgdGhhbiB0aGUgY3VycmVudCBrZXJuZWwgdmVyc2lvbiAoYXMgcmV0dXJuZWQgYnkKKwkgKiAidW5hbWUgLXIiKS4gICovCisJaWYgKCphcmd2ICYmIHNzY2FuZigqYXJndiwgIiV1LiV1LiV1IiwgJnRtcCwgJnRtcCwgJnRtcCkgPT0gMykgeworCQl2ZXJzaW9uID0gKmFyZ3YrKzsKKwl9IGVsc2UgeworCQl1bmFtZSgmdXRzKTsKKwkJdmVyc2lvbiA9IHV0cy5yZWxlYXNlOworCX0KKwltb2RkaXIgPSBjb25jYXRfcGF0aF9maWxlKCZDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUlsxXSwgdmVyc2lvbik7CisJeGNoZGlyKG1vZGRpcik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKG1vZGRpcik7CisKKwkvKiBTY2FuIG1vZHVsZXMgKi8KKwltb2R1bGVzID0gTlVMTDsKKwlpZiAoKmFyZ3YpIHsKKwkJZG8geworCQkJcGFyc2VfbW9kdWxlKCphcmd2LCAvKnNiICh1bnVzZWQpOiovIE5VTEwsICZtb2R1bGVzLCAwKTsKKwkJfSB3aGlsZSAoKisrYXJndik7CisJfSBlbHNlIHsKKwkJcmVjdXJzaXZlX2FjdGlvbigiLiIsIEFDVElPTl9SRUNVUlNFLAorCQkJCSBwYXJzZV9tb2R1bGUsIE5VTEwsICZtb2R1bGVzLCAwKTsKKwl9CisKKwkvKiBHZW5lcmF0ZSBkZXBlbmRlbmN5IGFuZCBhbGlhcyBmaWxlcyAqLworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikpCisJCXhmcmVvcGVuX3dyaXRlKENPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFLCBzdGRvdXQpOworCWZvciAobSA9IG1vZHVsZXM7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpIHsKKwkJcHJpbnRmKCIlczoiLCBtLT5uYW1lKTsKKworCQlvcmRlcl9kZXBfbGlzdChtb2R1bGVzLCBtLCBtLT5kZXBlbmRlbmNpZXMpOworCQl3aGlsZSAobS0+ZG5leHQgIT0gbSkgeworCQkJZGVwID0gbS0+ZG5leHQ7CisJCQlwcmludGYoIiAlcyIsIGRlcC0+bmFtZSk7CisKKwkJCS8qIHVubGluayBjdXJyZW50IGVudHJ5ICovCisJCQlkZXAtPmRuZXh0LT5kcHJldiA9IGRlcC0+ZHByZXY7CisJCQlkZXAtPmRwcmV2LT5kbmV4dCA9IGRlcC0+ZG5leHQ7CisJCQlkZXAtPmRuZXh0ID0gZGVwLT5kcHJldiA9IGRlcDsKKwkJfQorCQliYl9wdXRjaGFyKCdcbicpOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX01PRFVUSUxTX0FMSUFTCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9uKSkKKwkJeGZyZW9wZW5fd3JpdGUoIm1vZHVsZXMuYWxpYXMiLCBzdGRvdXQpOworCWZvciAobSA9IG1vZHVsZXM7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpIHsKKwkJY29uc3QgY2hhciAqZm5hbWUgPSBiYl9iYXNlbmFtZShtLT5uYW1lKTsKKwkJaW50IGZubGVuID0gc3RyY2hybnVsKGZuYW1lLCAnLicpIC0gZm5hbWU7CisJCXdoaWxlIChtLT5hbGlhc2VzKSB7CisJCQkvKiBMYXN0IHdvcmQgY2FuIHdlbGwgYmUgbS0+bW9kbmFtZSBpbnN0ZWFkLAorCQkJICogYnV0IGRlcG1vZCBmcm9tIG1vZHVsZS1pbml0LXRvb2xzIDMuNAorCQkJICogdXNlcyBtb2R1bGUgYmFzZW5hbWUsIGkuZS4sIG5vIHMvLS9fL2cuCisJCQkgKiAocGF0aG5hbWUgYW5kIC5rby4qIGFyZSBzdGlsbCBzdHJpcHBlZCkKKwkJCSAqIE1pbWlja2luZyB0aGF0Li4uICovCisJCQlwcmludGYoImFsaWFzICVzICUuKnNcbiIsCisJCQkJKGNoYXIqKWxsaXN0X3BvcCgmbS0+YWxpYXNlcyksCisJCQkJZm5sZW4sIGZuYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX24pKQorCQl4ZnJlb3Blbl93cml0ZSgibW9kdWxlcy5zeW1ib2xzIiwgc3Rkb3V0KTsKKwlmb3IgKG0gPSBtb2R1bGVzOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KSB7CisJCWNvbnN0IGNoYXIgKmZuYW1lID0gYmJfYmFzZW5hbWUobS0+bmFtZSk7CisJCWludCBmbmxlbiA9IHN0cmNocm51bChmbmFtZSwgJy4nKSAtIGZuYW1lOworCQl3aGlsZSAobS0+c3ltYm9scykgeworCQkJcHJpbnRmKCJhbGlhcyBzeW1ib2w6JXMgJS4qc1xuIiwKKwkJCQkoY2hhciopbGxpc3RfcG9wKCZtLT5zeW1ib2xzKSwKKwkJCQlmbmxlbiwgZm5hbWUpOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJd2hpbGUgKG1vZHVsZXMpIHsKKwkJCW1vZHVsZV9pbmZvICpvbGQgPSBtb2R1bGVzOworCQkJbW9kdWxlcyA9IG1vZHVsZXMtPm5leHQ7CisJCQlmcmVlKG9sZC0+bmFtZSk7CisJCQlmcmVlKG9sZC0+bW9kbmFtZSk7CisJCQlmcmVlKG9sZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvZGVwbW9kX3Byb2Nlc3Muc2ggYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9kZXBtb2RfcHJvY2Vzcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOTliMDkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvZGVwbW9kX3Byb2Nlc3Muc2gKQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisKKyMgRGVwbW9kIG91dHB1dCBtYXkgYmUgaGFyZCB0byBkaWZmLgorIyBUaGlzIHNjcmlwdCBzb3J0cyBkZXBlbmRlbmNpZXMgd2l0aGluICJ4eC5rbzogeXkua28genoua28iIGxpbmVzLAorIyBhbmQgc29ydHMgYWxsIGxpbmVzIHRvby4KKyMgVXNhZ2U6CisjCisjIFsuL2J1c3lib3hdIGRlcG1vZCAtbiB8IC4vZGVwbW9kX3Byb2Nlc3Muc2ggfCBzb3J0ID5PVVRGSUxFCisjCisjIGFuZCB0aGVuIHlvdSBjYW4gZGlmZiBPVVRGSUxFcy4gVXNlZnVsIGZvciBjb21wYXJpbmcgYmJveCBkZXBtb2QKKyMgd2l0aCBtb2R1bGUtaW5pdC10b29scyBkZXBtb2QgYW5kIHN1Y2guCisKK3doaWxlIHJlYWQgLXIgd29yZCByZXN0OyBkbworICAgIGlmICEgdGVzdCAiJHt3b3JkLyo6L30iOyB0aGVuCisJZWNobyAtbiAiJHdvcmQgIgorCWVjaG8gIiRyZXN0IiB8IHhhcmdzIC1uMSB8IHNvcnQgfCB4YXJncworICAgIGVsc2UKKwllY2hvICIkd29yZCAkcmVzdCI7CisgICAgZmkKK2RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL2luc21vZC5jIGIvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvaW5zbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ZDlmMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL2luc21vZC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgaW5zbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRpbW8gVGVyYXMgPHRpbW8udGVyYXNAaWtpLmZpPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfSU5TTU9EKEFQUExFVChpbnNtb2QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorCisvKiAyLjYgc3R5bGUgaW5zbW9kIGhhcyBubyBvcHRpb25zIGFuZCByZXF1aXJlZCBmaWxlbmFtZQorICogKG5vdCBtb2R1bGUgbmFtZSAtIC5rbyBjYW4ndCBiZSBvbWl0dGVkKSAqLworCisvL3VzYWdlOiNpZiAhRU5BQkxFX01PRFBST0JFX1NNQUxMCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoIltPUFRJT05TXSBNT0RVTEUgIikKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFXzJfNF9NT0RVTEVTKCJGSUxFICIpCisvL3VzYWdlOgkiW1NZTUJPTD1WQUxVRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCB0aGUgc3BlY2lmaWVkIGtlcm5lbCBtb2R1bGVzIGludG8gdGhlIGtlcm5lbCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgbW9kdWxlIHRvIGxvYWQgaW50byB0aGUgd3Jvbmcga2VybmVsIHZlcnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS1rCU1ha2UgbW9kdWxlIGF1dG9jbGVhbi1hYmxlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJTG9jazogcHJldmVudCBzaW11bHRhbmVvdXMgbG9hZHMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCgKKy8vdXNhZ2U6ICAgICAiXG4JLW0JT3V0cHV0IGxvYWQgbWFwIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXgJRG9uJ3QgZXhwb3J0IGV4dGVybnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiNlbmRpZgorCitpbnQgaW5zbW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpbnNtb2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmZpbGVuYW1lOworCWludCByYzsKKworCS8qIENvbXBhdCBub3RlOgorCSAqIDIuNiBzdHlsZSBpbnNtb2QgaGFzIG5vIG9wdGlvbnMgYW5kIHJlcXVpcmVkIGZpbGVuYW1lCisJICogKG5vdCBtb2R1bGUgbmFtZSAtIC5rbyBjYW4ndCBiZSBvbWl0dGVkKS4KKwkgKiAyLjQgc3R5bGUgaW5zbW9kIGNhbiB0YWtlIG1vZHVsZSBuYW1lIHdpdGhvdXQgLm8KKwkgKiBhbmQgcGVyZm9ybXMgbW9kdWxlIHNlYXJjaCBpbiBkZWZhdWx0IGRpcmVjdG9yaWVzCisJICogb3IgaW4gJE1PRFBBVEguCisJICovCisKKwlJRl9GRUFUVVJFXzJfNF9NT0RVTEVTKAorCQlnZXRvcHQzMihhcmd2LCBJTlNNT0RfT1BUUyBJTlNNT0RfQVJHUyk7CisJCWFyZ3YgKz0gb3B0aW5kIC0gMTsKKwkpOworCisJZmlsZW5hbWUgPSAqKythcmd2OworCWlmICghZmlsZW5hbWUpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCXJjID0gYmJfaW5pdF9tb2R1bGUoZmlsZW5hbWUsIHBhcnNlX2NtZGxpbmVfbW9kdWxlX29wdGlvbnMoYXJndiwgLypxdW90ZV9zcGFjZXM6Ki8gMCkpOworCWlmIChyYykKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBpbnNlcnQgJyVzJzogJXMiLCBmaWxlbmFtZSwgbW9kZXJyb3IocmMpKTsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL2xzbW9kLmMgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9sc21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiM2MxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9sc21vZC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGxzbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX0xTTU9EKEFQUExFVChsc21vZCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKy8vdXNhZ2U6I2lmICFFTkFCTEVfTU9EUFJPQkVfU01BTEwKKy8vdXNhZ2U6I2RlZmluZSBsc21vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIGxzbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdCB0aGUgY3VycmVudGx5IGxvYWRlZCBrZXJuZWwgbW9kdWxlcyIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCitlbnVtIHsKKwlUQUlOVF9QUk9QUklFVE9SWV9NT0RVTEUgPSAoMSA8PCAwKSwKKwlUQUlOVF9GT1JDRURfTU9EVUxFICAgICAgPSAoMSA8PCAxKSwKKwlUQUlOVF9VTlNBRkVfU01QICAgICAgICAgPSAoMSA8PCAyKSwKK307CisKK3N0YXRpYyB2b2lkIGNoZWNrX3RhaW50ZWQodm9pZCkKK3sKKwlpbnQgdGFpbnRlZCA9IDA7CisJY2hhciAqYnVmID0geG1hbGxvY19vcGVuX3JlYWRfY2xvc2UoIi9wcm9jL3N5cy9rZXJuZWwvdGFpbnRlZCIsIE5VTEwpOworCWlmIChidWYpIHsKKwkJdGFpbnRlZCA9IGF0b2koYnVmKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShidWYpOworCX0KKworCWlmICh0YWludGVkKSB7CisJCXByaW50ZigiICAgIFRhaW50ZWQ6ICVjJWMlY1xuIiwKKwkJCQl0YWludGVkICYgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFICAgICAgPyAnUCcgOiAnRycsCisJCQkJdGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUgICAgICAgICAgID8gJ0YnIDogJyAnLAorCQkJCXRhaW50ZWQgJiBUQUlOVF9VTlNBRkVfU01QICAgICAgICAgICAgICA/ICdTJyA6ICcgJyk7CisJfSBlbHNlIHsKKwkJcHV0cygiICAgIE5vdCB0YWludGVkIik7CisJfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGNoZWNrX3RhaW50ZWQodm9pZCkgeyBwdXRjaGFyKCdcbicpOyB9CisjZW5kaWYKKworaW50IGxzbW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsc21vZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUCisJY2hhciAqdG9rZW5bNF07CisJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuKCIvcHJvYy9tb2R1bGVzIik7CisJaW5pdF91bmljb2RlKCk7CisKKwlwcmludGYoIiUtMjRzU2l6ZSAgVXNlZCBieSIsICJNb2R1bGUiKTsKKwljaGVja190YWludGVkKCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMKKwkgJiYgZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJKSB7CisJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCA0LCAzLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJCWlmICh0b2tlblszXSAhPSBOVUxMICYmIHRva2VuWzNdWzBdID09ICdbJykgeworCQkJCXRva2VuWzNdKys7CisJCQkJdG9rZW5bM11bc3RybGVuKHRva2VuWzNdKS0xXSA9ICdcMCc7CisJCQl9IGVsc2UKKwkJCQl0b2tlblszXSA9IChjaGFyICopICIiOworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQl7CisJCQkJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKwkJCQljaGFyICp1bmlfbmFtZSA9IHVuaWNvZGVfY29udl90b19wcmludGFibGUoJnVuaV9zdGF0LCB0b2tlblswXSk7CisJCQkJdW5zaWduZWQgcGFkX2xlbiA9ICh1bmlfc3RhdC51bmljb2RlX3dpZHRoID4gMTkpID8gMCA6IDE5IC0gdW5pX3N0YXQudW5pY29kZV93aWR0aDsKKwkJCQlwcmludGYoIiVzJSpzICU4cyAlMnMgJXNcbiIsIHVuaV9uYW1lLCBwYWRfbGVuLCAiIiwgdG9rZW5bMV0sIHRva2VuWzJdLCB0b2tlblszXSk7CisJCQkJZnJlZSh1bmlfbmFtZSk7CisJCQl9CisjIGVsc2UKKwkJCXByaW50ZigiJS0xOXMgJThzICUycyAlc1xuIiwgdG9rZW5bMF0sIHRva2VuWzFdLCB0b2tlblsyXSwgdG9rZW5bM10pOworIyBlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDQsIDQsICIjIFx0IiwgUEFSU0VfTk9STUFMICYgflBBUlNFX0dSRUVEWSkpIHsKKwkJCS8vIE4uQi4gdG9rZW5bM10gaXMgZWl0aGVyICctJyAobW9kdWxlIGlzIG5vdCB1c2VkIGJ5IG90aGVycykKKwkJCS8vIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGVuZGVkIGJ5IGNvbW1hCisJCQkvLyBzbyB0cmltbWluZyB0aGUgdHJhaWxpbmcgY2hhciBpcyBqdXN0IHdoYXQgd2UgbmVlZCEKKwkJCWlmICh0b2tlblszXVswXSkKKwkJCQl0b2tlblszXVtzdHJsZW4odG9rZW5bM10pIC0gMV0gPSAnXDAnOworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQl7CisJCQkJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKwkJCQljaGFyICp1bmlfbmFtZSA9IHVuaWNvZGVfY29udl90b19wcmludGFibGUoJnVuaV9zdGF0LCB0b2tlblswXSk7CisJCQkJdW5zaWduZWQgcGFkX2xlbiA9ICh1bmlfc3RhdC51bmljb2RlX3dpZHRoID4gMTkpID8gMCA6IDE5IC0gdW5pX3N0YXQudW5pY29kZV93aWR0aDsKKwkJCQlwcmludGYoIiVzJSpzICU4cyAlMnMgJXNcbiIsIHVuaV9uYW1lLCBwYWRfbGVuLCAiIiwgdG9rZW5bMV0sIHRva2VuWzJdLCB0b2tlblszXSk7CisJCQkJZnJlZSh1bmlfbmFtZSk7CisJCQl9CisjIGVsc2UKKwkJCXByaW50ZigiJS0xOXMgJThzICUycyAlc1xuIiwgdG9rZW5bMF0sIHRva2VuWzFdLCB0b2tlblsyXSwgdG9rZW5bM10pOworIyBlbmRpZgorCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisjZWxzZQorCWNoZWNrX3RhaW50ZWQoKTsKKwl4cHJpbnRfYW5kX2Nsb3NlX2ZpbGUoeGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9tb2R1bGVzIikpOworI2VuZGlmCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL21vZGluZm8uYyBiL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL21vZGluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTBiNmZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvbW9kaW5mby5jCkBAIC0wLDAgKzEsMTY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtb2RpbmZvIC0gcmV0cmlldmUgbW9kdWxlIGluZm8KKyAqIENvcHlyaWdodCAoYykgMjAwOCBQYXNjYWwgQmVsbGFyZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfTU9ESU5GTyhBUFBMRVQobW9kaW5mbywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19NT0RJTkZPKSArPSBtb2RpbmZvLm8gbW9kdXRpbHMubworCisvL2NvbmZpZzpjb25maWcgTU9ESU5GTworLy9jb25maWc6CWJvb2wgIm1vZGluZm8iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBhIExpbnV4IEtlcm5lbCBtb2R1bGUKKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAvKiB1bmFtZSgpICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorCisKK2VudW0geworCU9QVF9UQUdTID0gKDEgPDwgOCkgLSAxLAorCU9QVF9GID0gKDEgPDwgOCksIC8qIGZpZWxkIG5hbWUgKi8KKwlPUFRfMCA9ICgxIDw8IDkpLCAgLyogXDAgYXMgc2VwYXJhdG9yICovCit9OworCitzdHJ1Y3QgbW9kaW5mb19lbnYgeworCWNoYXIgKmZpZWxkOworCWludCB0YWdzOworfTsKKworc3RhdGljIGludCBkaXNwbGF5KGNvbnN0IGNoYXIgKmRhdGEsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIGludCBmbGFnKQoreworCWlmIChmbGFnKSB7CisJCWludCBuID0gcHJpbnRmKCIlczoiLCBwYXR0ZXJuKTsKKwkJd2hpbGUgKG4rKyA8IDE2KQorCQkJYmJfcHV0Y2hhcignICcpOworCX0KKwlyZXR1cm4gcHJpbnRmKCIlcyVjIiwgZGF0YSwgKG9wdGlvbl9tYXNrMzIgJiBPUFRfMCkgPyAnXDAnIDogJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIG1vZGluZm8oY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqdmVyc2lvbiwKKwkJCWNvbnN0IHN0cnVjdCBtb2RpbmZvX2VudiAqZW52KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaG9ydGN1dHNbXSA9IHsKKwkJImZpbGVuYW1lIiwKKwkJImRlc2NyaXB0aW9uIiwKKwkJImF1dGhvciIsCisJCSJsaWNlbnNlIiwKKwkJInZlcm1hZ2ljIiwKKwkJInBhcm0iLAorCQkiZmlybXdhcmUiLAorCQkiZGVwZW5kcyIsCisJfTsKKwlzaXplX3QgbGVuOworCWludCBqLCBsZW5ndGg7CisJY2hhciAqcHRyLCAqdGhlX21vZHVsZTsKKwljb25zdCBjaGFyICpmaWVsZCA9IGVudi0+ZmllbGQ7CisJaW50IHRhZ3MgPSBlbnYtPnRhZ3M7CisKKwlpZiAodGFncyAmIDEpIHsgLyogZmlsZW5hbWUgKi8KKwkJZGlzcGxheShwYXRoLCBzaG9ydGN1dHNbMF0sIDEgIT0gdGFncyk7CisJfQorCisJbGVuID0gTUFYSU5UKHNzaXplX3QpOworCXRoZV9tb2R1bGUgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aCwgJmxlbik7CisJaWYgKCF0aGVfbW9kdWxlKSB7CisJCWlmIChwYXRoWzBdID09ICcvJykKKwkJCXJldHVybjsKKwkJLyogTmV3ZXIgZGVwbW9kIHB1dHMgcmVsYXRpdmUgcGF0aHMgaW4gbW9kdWxlcy5kZXAgKi8KKwkJcGF0aCA9IHhhc3ByaW50ZigiJXMvJXMvJXMiLCBDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUiwgdmVyc2lvbiwgcGF0aCk7CisJCXRoZV9tb2R1bGUgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aCwgJmxlbik7CisJCWZyZWUoKGNoYXIqKXBhdGgpOworCQlpZiAoIXRoZV9tb2R1bGUpCisJCQlyZXR1cm47CisJfQorCisJaWYgKGZpZWxkKQorCQl0YWdzIHw9IE9QVF9GOworCWZvciAoaiA9IDE7ICgxPDxqKSAmIChPUFRfVEFHUyArIE9QVF9GKTsgaisrKSB7CisJCWNvbnN0IGNoYXIgKnBhdHRlcm47CisKKwkJaWYgKCEoKDE8PGopICYgdGFncykpCisJCQljb250aW51ZTsKKwkJcGF0dGVybiA9IGZpZWxkOworCQlpZiAoKDE8PGopICYgT1BUX1RBR1MpCisJCQlwYXR0ZXJuID0gc2hvcnRjdXRzW2pdOworCQlsZW5ndGggPSBzdHJsZW4ocGF0dGVybik7CisJCXB0ciA9IHRoZV9tb2R1bGU7CisJCXdoaWxlICgxKSB7CisJCQlwdHIgPSBtZW1jaHIocHRyLCAqcGF0dGVybiwgbGVuIC0gKHB0ciAtIChjaGFyKil0aGVfbW9kdWxlKSk7CisJCQlpZiAocHRyID09IE5VTEwpIC8qIG5vIG9jY3VyYW5jZSBsZWZ0LCBkb25lICovCisJCQkJYnJlYWs7CisJCQlpZiAoc3RybmNtcChwdHIsIHBhdHRlcm4sIGxlbmd0aCkgPT0gMCAmJiBwdHJbbGVuZ3RoXSA9PSAnPScpIHsKKwkJCQlwdHIgKz0gbGVuZ3RoICsgMTsKKwkJCQlwdHIgKz0gZGlzcGxheShwdHIsIHBhdHRlcm4sICgxPDxqKSAhPSB0YWdzKTsKKwkJCX0KKwkJCSsrcHRyOworCQl9CisJfQorCWZyZWUodGhlX21vZHVsZSk7Cit9CisKKy8vdXNhZ2U6I2RlZmluZSBtb2RpbmZvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFkbHAwXSBbLUYga2V5d29yZF0gTU9EVUxFIgorLy91c2FnZTojZGVmaW5lIG1vZGluZm9fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWEJCVNob3J0Y3V0IGZvciAnLUYgYXV0aG9yJyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJCVNob3J0Y3V0IGZvciAnLUYgZGVzY3JpcHRpb24nIgorLy91c2FnZTogICAgICJcbgktbAkJU2hvcnRjdXQgZm9yICctRiBsaWNlbnNlJyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJCVNob3J0Y3V0IGZvciAnLUYgcGFybSciCisvL3VzYWdlOiAgICAgIlxuCS1GIGtleXdvcmQJS2V5d29yZCB0byBsb29rIGZvciIKKy8vdXNhZ2U6ICAgICAiXG4JLTAJCVNlcGFyYXRlIG91dHB1dCB3aXRoIE5VTHMiCisvL3VzYWdlOiNkZWZpbmUgbW9kaW5mb19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBtb2RpbmZvIC1GIHZlcm1hZ2ljIGxvb3BcbiIKKworaW50IG1vZGluZm9fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1vZGluZm9fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBtb2RpbmZvX2VudiBlbnY7CisJY2hhciBuYW1lW01PRFVMRV9OQU1FX0xFTl07CisJc3RydWN0IHV0c25hbWUgdXRzOworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqY29sb24sICp0b2tlbnNbMl07CisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCBpOworCisJZW52LmZpZWxkID0gTlVMTDsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIG1pbmltdW0gb25lIHBhcmFtICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJmZGFsdnBGOjAiLCAmZW52LmZpZWxkKTsKKwllbnYudGFncyA9IG9wdHMgJiBPUFRfVEFHUyA/IG9wdHMgJiBPUFRfVEFHUyA6IE9QVF9UQUdTOworCWFyZ3YgKz0gb3B0aW5kOworCisJdW5hbWUoJnV0cyk7CisJcGFyc2VyID0gY29uZmlnX29wZW4yKAorCQl4YXNwcmludGYoIiVzLyVzLyVzIiwgQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVIsIHV0cy5yZWxlYXNlLCBDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRSksCisJCXhmb3Blbl9mb3JfcmVhZAorCSk7CisKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIDIsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQljb2xvbiA9IGxhc3RfY2hhcl9pcyh0b2tlbnNbMF0sICc6Jyk7CisJCWlmIChjb2xvbiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCSpjb2xvbiA9ICdcMCc7CisJCWZpbGVuYW1lMm1vZG5hbWUodG9rZW5zWzBdLCBuYW1lKTsKKwkJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKSB7CisJCQlpZiAoZm5tYXRjaChhcmd2W2ldLCBuYW1lLCAwKSA9PSAwKSB7CisJCQkJbW9kaW5mbyh0b2tlbnNbMF0sIHV0cy5yZWxlYXNlLCAmZW52KTsKKwkJCQlhcmd2W2ldID0gKGNoYXIgKikgIiI7CisJCQl9CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKworCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQlpZiAoYXJndltpXVswXSkgeworCQkJbW9kaW5mbyhhcmd2W2ldLCB1dHMucmVsZWFzZSwgJmVudik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL21vZHByb2JlLXNtYWxsLmMgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9tb2Rwcm9iZS1zbWFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjI4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9tb2Rwcm9iZS1zbWFsbC5jCkBAIC0wLDAgKzEsODcyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzaW1wbGlmaWVkIG1vZHByb2JlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZsYWRpbWlyIERyb25uaWtvdgorICogQ29weXJpZ2h0IChjKSAyMDA4IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlciAoaW5pdGlhbCBkZXBtb2QgY29kZSkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX01PRFBST0JFX1NNQUxMKEFQUExFVChtb2Rwcm9iZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9NT0RQUk9CRV9TTUFMTChBUFBMRVRfT0RETkFNRShkZXBtb2QsIG1vZHByb2JlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBtb2Rwcm9iZSkpCisvL2FwcGxldDpJRl9NT0RQUk9CRV9TTUFMTChBUFBMRVRfT0RETkFNRShpbnNtb2QsIG1vZHByb2JlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBtb2Rwcm9iZSkpCisvL2FwcGxldDpJRl9NT0RQUk9CRV9TTUFMTChBUFBMRVRfT0RETkFNRShsc21vZCwgbW9kcHJvYmUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIG1vZHByb2JlKSkKKy8vYXBwbGV0OklGX01PRFBST0JFX1NNQUxMKEFQUExFVF9PREROQU1FKHJtbW9kLCBtb2Rwcm9iZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbW9kcHJvYmUpKQorCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIEFmdGVyIGxpYmJiLmgsIHNpbmNlIGl0IG5lZWRzIHN5cy90eXBlcy5oIG9uIHNvbWUgc3lzdGVtcyAqLworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+IC8qIHVuYW1lKCkgKi8KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKK2V4dGVybiBpbnQgaW5pdF9tb2R1bGUodm9pZCAqbW9kdWxlLCB1bnNpZ25lZCBsb25nIGxlbiwgY29uc3QgY2hhciAqb3B0aW9ucyk7CitleHRlcm4gaW50IGRlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlLCB1bnNpZ25lZCBmbGFncyk7CitleHRlcm4gaW50IHF1ZXJ5X21vZHVsZShjb25zdCBjaGFyICpuYW1lLCBpbnQgd2hpY2gsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCAqcmV0KTsKKworCisjaWYgMQorIyBkZWZpbmUgZGJnMV9lcnJvcl9tc2coLi4uKSAoKHZvaWQpMCkKKyMgZGVmaW5lIGRiZzJfZXJyb3JfbXNnKC4uLikgKCh2b2lkKTApCisjZWxzZQorIyBkZWZpbmUgZGJnMV9lcnJvcl9tc2coLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjIGRlZmluZSBkYmcyX2Vycm9yX21zZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisjZGVmaW5lIERFUEZJTEVfQkIgQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEUiLmJiIgorCitlbnVtIHsKKwlPUFRfcSA9ICgxIDw8IDApLCAvKiBiZSBxdWlldCAqLworCU9QVF9yID0gKDEgPDwgMSksIC8qIG1vZHVsZSByZW1vdmFsIGluc3RlYWQgb2YgbG9hZGluZyAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbW9kdWxlX2luZm8geworCWNoYXIgKnBhdGhuYW1lOworCWNoYXIgKmFsaWFzZXM7CisJY2hhciAqZGVwczsKK30gbW9kdWxlX2luZm87CisKKy8qCisgKiBHTE9CQUxTCisgKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwltb2R1bGVfaW5mbyAqbW9kaW5mbzsKKwljaGFyICptb2R1bGVfbG9hZF9vcHRpb25zOworCXNtYWxsaW50IGRlcF9iYl9zZWVuOworCXNtYWxsaW50IHdyb3RlX2RlcF9iYl9vazsKKwl1bnNpZ25lZCBtb2R1bGVfY291bnQ7CisJaW50IG1vZHVsZV9mb3VuZF9pZHg7CisJdW5zaWduZWQgc3RyaW5nYnVmX2lkeDsKKwl1bnNpZ25lZCBzdHJpbmdidWZfc2l6ZTsKKwljaGFyICpzdHJpbmdidWY7IC8qIHNvbWUgbW9kdWxlcyBoYXZlIGxvdHMgb2Ygc3R1ZmYgKi8KKwkvKiBmb3IgZXhhbXBsZSwgZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQua28gKi8KKwkvKiB0aGVyZWZvcmUgaGF2aW5nIGEgZml4ZWQgYmlnZ2lzaCBidWZmZXIgaXMgbm90IHdpc2UgKi8KK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgbW9kaW5mbyAgICAgICAgICAgICAoRy5tb2RpbmZvICAgICAgICAgICAgKQorI2RlZmluZSBkZXBfYmJfc2VlbiAgICAgICAgIChHLmRlcF9iYl9zZWVuICAgICAgICApCisjZGVmaW5lIHdyb3RlX2RlcF9iYl9vayAgICAgKEcud3JvdGVfZGVwX2JiX29rICAgICkKKyNkZWZpbmUgbW9kdWxlX2NvdW50ICAgICAgICAoRy5tb2R1bGVfY291bnQgICAgICAgKQorI2RlZmluZSBtb2R1bGVfZm91bmRfaWR4ICAgIChHLm1vZHVsZV9mb3VuZF9pZHggICApCisjZGVmaW5lIG1vZHVsZV9sb2FkX29wdGlvbnMgKEcubW9kdWxlX2xvYWRfb3B0aW9ucykKKyNkZWZpbmUgc3RyaW5nYnVmX2lkeCAgICAgICAoRy5zdHJpbmdidWZfaWR4ICAgICAgKQorI2RlZmluZSBzdHJpbmdidWZfc2l6ZSAgICAgIChHLnN0cmluZ2J1Zl9zaXplICAgICApCisjZGVmaW5lIHN0cmluZ2J1ZiAgICAgICAgICAgKEcuc3RyaW5nYnVmICAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGFwcGVuZChjb25zdCBjaGFyICpzKQoreworCXVuc2lnbmVkIGxlbiA9IHN0cmxlbihzKTsKKwlpZiAoc3RyaW5nYnVmX2lkeCArIGxlbiArIDE1ID4gc3RyaW5nYnVmX3NpemUpIHsKKwkJc3RyaW5nYnVmX3NpemUgPSBzdHJpbmdidWZfaWR4ICsgbGVuICsgMTI3OworCQlkYmcyX2Vycm9yX21zZygiZ3JvdyBzdHJpbmdidWYgdG8gJXUiLCBzdHJpbmdidWZfc2l6ZSk7CisJCXN0cmluZ2J1ZiA9IHhyZWFsbG9jKHN0cmluZ2J1Ziwgc3RyaW5nYnVmX3NpemUpOworCX0KKwltZW1jcHkoc3RyaW5nYnVmICsgc3RyaW5nYnVmX2lkeCwgcywgbGVuKTsKKwlzdHJpbmdidWZfaWR4ICs9IGxlbjsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kYyhjaGFyIGMpCit7CisJLyogV2UgYXBwZW5kYygpIG9ubHkgYWZ0ZXIgYXBwZW5kKCksICsgMTUgdHJpY2sgaW4gYXBwZW5kKCkKKwkgKiBtYWtlcyBpdCB1bm5lY2Vzc2FyeSB0byBjaGVjayBmb3Igb3ZlcmZsb3cgaGVyZSAqLworCXN0cmluZ2J1ZltzdHJpbmdidWZfaWR4KytdID0gYzsKK30KKworc3RhdGljIHZvaWQgYmtzcCh2b2lkKQoreworCWlmIChzdHJpbmdidWZfaWR4KQorCQlzdHJpbmdidWZfaWR4LS07Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3N0cmluZ2J1Zih2b2lkKQoreworCXN0cmluZ2J1Zl9pZHggPSAwOworfQorCitzdGF0aWMgY2hhciogY29weV9zdHJpbmdidWYodm9pZCkKK3sKKwljaGFyICpjb3B5ID0geHphbGxvYyhzdHJpbmdidWZfaWR4ICsgMSk7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLworCXJldHVybiBtZW1jcHkoY29weSwgc3RyaW5nYnVmLCBzdHJpbmdidWZfaWR4KTsKK30KKworc3RhdGljIGNoYXIqIGZpbmRfa2V5d29yZChjaGFyICpwdHIsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKndvcmQpCit7CisJaW50IHdsZW47CisKKwlpZiAoIXB0cikgLyogaGFwcGVucyBpZiB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UgY2Fubm90IHJlYWQgaXQgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwl3bGVuID0gc3RybGVuKHdvcmQpOworCWxlbiAtPSB3bGVuIC0gMTsKKwl3aGlsZSAoKHNzaXplX3QpbGVuID4gMCkgeworCQljaGFyICpvbGQgPSBwdHI7CisJCS8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGNoYXIgaW4gd29yZCAqLworCQlwdHIgPSBtZW1jaHIocHRyLCAqd29yZCwgbGVuKTsKKwkJaWYgKHB0ciA9PSBOVUxMKSAvKiBubyBvY2N1cmFuY2UgbGVmdCwgZG9uZSAqLworCQkJYnJlYWs7CisJCWlmIChzdHJuY21wKHB0ciwgd29yZCwgd2xlbikgPT0gMCkKKwkJCXJldHVybiBwdHIgKyB3bGVuOyAvKiBmb3VuZCwgcmV0dXJuIHB0ciBwYXN0IGl0ICovCisJCSsrcHRyOworCQlsZW4gLT0gKHB0ciAtIG9sZCk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCByZXBsYWNlKGNoYXIgKnMsIGNoYXIgd2hhdCwgY2hhciB3aXRoKQoreworCXdoaWxlICgqcykgeworCQlpZiAod2hhdCA9PSAqcykKKwkJCSpzID0gd2l0aDsKKwkJKytzOworCX0KK30KKworLyogVGFrZSAid29yZCB3b3JkIiwgcmV0dXJuIG1hbGxvY2VkICJ3b3JkIixOVUwsIndvcmQiLE5VTCxOVUwgKi8KK3N0YXRpYyBjaGFyKiBzdHJfMl9saXN0KGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cikgKyAxOworCWNoYXIgKmRzdCA9IHhtYWxsb2MobGVuICsgMSk7CisKKwlkc3RbbGVuXSA9ICdcMCc7CisJbWVtY3B5KGRzdCwgc3RyLCBsZW4pOworLy9UT0RPOiBwcm90ZWN0IGFnYWluc3QgMisgc3BhY2VzOiAid29yZCAgd29yZCIKKwlyZXBsYWNlKGRzdCwgJyAnLCAnXDAnKTsKKwlyZXR1cm4gZHN0OworfQorCisvKiBXZSB1c2UgZXJyb3IgbnVtYmVycyBpbiBhIGxvb3NlIHRyYW5zbGF0aW9uLi4uICovCitzdGF0aWMgY29uc3QgY2hhciAqbW9kZXJyb3IoaW50IGVycikKK3sKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgRU5PRVhFQzoKKwkJcmV0dXJuICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOworCWNhc2UgRU5PRU5UOgorCQlyZXR1cm4gInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciBpbnZhbGlkIHBhcmFtZXRlciI7CisJY2FzZSBFU1JDSDoKKwkJcmV0dXJuICJtb2R1bGUgaGFzIHdyb25nIHN5bWJvbCB2ZXJzaW9uIjsKKwljYXNlIEVJTlZBTDogLyogImludmFsaWQgcGFyYW1ldGVyIiAqLworCQlyZXR1cm4gInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciBpbnZhbGlkIHBhcmFtZXRlciIKKwkJKyBzaXplb2YoInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciIpOworCWRlZmF1bHQ6CisJCXJldHVybiBzdHJlcnJvcihlcnIpOworCX0KK30KKworc3RhdGljIGludCBsb2FkX21vZHVsZShjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sKKyNpZiAxCisJaW50IHI7CisJc2l6ZV90IGxlbiA9IE1BWElOVChzc2l6ZV90KTsKKwljaGFyICptb2R1bGVfaW1hZ2U7CisJZGJnMV9lcnJvcl9tc2coImxvYWRfbW9kdWxlKCclcycsJyVzJykiLCBmbmFtZSwgb3B0aW9ucyk7CisKKwltb2R1bGVfaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoZm5hbWUsICZsZW4pOworCXIgPSAoIW1vZHVsZV9pbWFnZSB8fCBpbml0X21vZHVsZShtb2R1bGVfaW1hZ2UsIGxlbiwgb3B0aW9ucyA/IG9wdGlvbnMgOiAiIikgIT0gMCk7CisJZnJlZShtb2R1bGVfaW1hZ2UpOworCWRiZzFfZXJyb3JfbXNnKCJsb2FkX21vZHVsZTolZCIsIHIpOworCXJldHVybiByOyAvKiAwID0gc3VjY2VzcyAqLworI2Vsc2UKKwkvKiBGb3IgdGVzdGluZyAqLworCWRiZzFfZXJyb3JfbXNnKCJsb2FkX21vZHVsZSgnJXMnLCclcycpIiwgZm5hbWUsIG9wdGlvbnMpOworCXJldHVybiAxOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX21vZHVsZShtb2R1bGVfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJY2hhciAqbW9kdWxlX2ltYWdlOworCWNoYXIgKnB0cjsKKwlzaXplX3QgbGVuOworCXNpemVfdCBwb3M7CisJZGJnMV9lcnJvcl9tc2coInBhcnNlX21vZHVsZSgnJXMnKSIsIHBhdGhuYW1lKTsKKworCS8qIFJlYWQgKHBvc3NpYmx5IGNvbXByZXNzZWQpIG1vZHVsZSAqLworCWxlbiA9IDY0ICogMTAyNCAqIDEwMjQ7IC8qIDY0IE1iIGF0IG1vc3QgKi8KKwltb2R1bGVfaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aG5hbWUsICZsZW4pOworCS8qIG1vZHVsZV9pbWFnZSA9PSBOVUxMIGlzIG9rIGhlcmUsIGZpbmRfa2V5d29yZCBoYW5kbGVzIGl0ICovCisvL1RPRE86IG9wdGltaXplIHJlZHVuZGFudCBtb2R1bGUgYm9keSByZWFkcworCisJLyogImFsaWFzMSBzeW1ib2w6c3ltMSBhbGlhczIgc3ltYm9sOnN5bTIiICovCisJcmVzZXRfc3RyaW5nYnVmKCk7CisJcG9zID0gMDsKKwl3aGlsZSAoMSkgeworCQlwdHIgPSBmaW5kX2tleXdvcmQobW9kdWxlX2ltYWdlICsgcG9zLCBsZW4gLSBwb3MsICJhbGlhcz0iKTsKKwkJaWYgKCFwdHIpIHsKKwkJCXB0ciA9IGZpbmRfa2V5d29yZChtb2R1bGVfaW1hZ2UgKyBwb3MsIGxlbiAtIHBvcywgIl9fa3N5bXRhYl8iKTsKKwkJCWlmICghcHRyKQorCQkJCWJyZWFrOworCQkJLyogRE9DTUU6IF9fa3N5bXRhYl9ncGwgYW5kIF9fa3N5bXRhYl9zdHJpbmdzIG9jY3VyCisJCQkgKiBpbiBtYW55IG1vZHVsZXMuIFdoYXQgZG8gdGhleSBtZWFuPyAqLworCQkJaWYgKHN0cmNtcChwdHIsICJncGwiKSA9PSAwIHx8IHN0cmNtcChwdHIsICJzdHJpbmdzIikgPT0gMCkKKwkJCQlnb3RvIHNraXA7CisJCQlkYmcyX2Vycm9yX21zZygiYWxpYXM6J3N5bWJvbDolcyciLCBwdHIpOworCQkJYXBwZW5kKCJzeW1ib2w6Iik7CisJCX0gZWxzZSB7CisJCQlkYmcyX2Vycm9yX21zZygiYWxpYXM6JyVzJyIsIHB0cik7CisJCX0KKwkJYXBwZW5kKHB0cik7CisJCWFwcGVuZGMoJyAnKTsKKyBza2lwOgorCQlwb3MgPSAocHRyIC0gbW9kdWxlX2ltYWdlKTsKKwl9CisJYmtzcCgpOyAvKiByZW1vdmUgbGFzdCAnICcgKi8KKwlpbmZvLT5hbGlhc2VzID0gY29weV9zdHJpbmdidWYoKTsKKwlyZXBsYWNlKGluZm8tPmFsaWFzZXMsICctJywgJ18nKTsKKworCS8qICJkZXBlbmRlbmN5MSBkZXBhbmRlbmN5MiIgKi8KKwlyZXNldF9zdHJpbmdidWYoKTsKKwlwdHIgPSBmaW5kX2tleXdvcmQobW9kdWxlX2ltYWdlLCBsZW4sICJkZXBlbmRzPSIpOworCWlmIChwdHIgJiYgKnB0cikgeworCQlyZXBsYWNlKHB0ciwgJywnLCAnICcpOworCQlyZXBsYWNlKHB0ciwgJy0nLCAnXycpOworCQlkYmcyX2Vycm9yX21zZygiZGVwOiclcyciLCBwdHIpOworCQlhcHBlbmQocHRyKTsKKwl9CisJaW5mby0+ZGVwcyA9IGNvcHlfc3RyaW5nYnVmKCk7CisKKwlmcmVlKG1vZHVsZV9pbWFnZSk7Cit9CisKK3N0YXRpYyBpbnQgcGF0aG5hbWVfbWF0Y2hlc19tb2RuYW1lKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBjb25zdCBjaGFyICptb2RuYW1lKQoreworCWNvbnN0IGNoYXIgKmZuYW1lID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcChwYXRobmFtZSk7CisJY29uc3QgY2hhciAqc3VmZml4ID0gc3RycnN0cihmbmFtZSwgIi5rbyIpOworLy9UT0RPOiBjYW4gZG8gd2l0aG91dCBtYWxsb2M/CisJY2hhciAqbmFtZSA9IHhzdHJuZHVwKGZuYW1lLCBzdWZmaXggLSBmbmFtZSk7CisJaW50IHI7CisJcmVwbGFjZShuYW1lLCAnLScsICdfJyk7CisJciA9IChzdHJjbXAobmFtZSwgbW9kbmFtZSkgPT0gMCk7CisJZnJlZShuYW1lKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIEZBU1RfRlVOQyBpbnQgZmlsZUFjdGlvbihjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJc3RydWN0IHN0YXQgKnNiIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqbW9kbmFtZV90b19tYXRjaCwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgY3VyOworCWNvbnN0IGNoYXIgKmZuYW1lOworCisJcGF0aG5hbWUgKz0gMjsgLyogc2tpcCAiLi8iICovCisJZm5hbWUgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKHBhdGhuYW1lKTsKKwlpZiAoIXN0cnJzdHIoZm5hbWUsICIua28iKSkgeworCQlkYmcxX2Vycm9yX21zZygiJyVzJyBpcyBub3QgYSBtb2R1bGUiLCBwYXRobmFtZSk7CisJCXJldHVybiBUUlVFOyAvKiBub3QgYSBtb2R1bGUsIGNvbnRpbnVlIHNlYXJjaCAqLworCX0KKworCWN1ciA9IG1vZHVsZV9jb3VudCsrOworCW1vZGluZm8gPSB4cmVhbGxvY192ZWN0b3IobW9kaW5mbywgMTIsIGN1cik7CisJbW9kaW5mb1tjdXJdLnBhdGhuYW1lID0geHN0cmR1cChwYXRobmFtZSk7CisJLyptb2RpbmZvW2N1cl0uYWxpYXNlcyA9IE5VTEw7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCS8qbW9kaW5mb1tjdXIrMV0ucGF0aG5hbWUgPSBOVUxMOyovCisKKwlpZiAoIXBhdGhuYW1lX21hdGNoZXNfbW9kbmFtZShmbmFtZSwgbW9kbmFtZV90b19tYXRjaCkpIHsKKwkJZGJnMV9lcnJvcl9tc2coIiclcycgbW9kdWxlIG5hbWUgZG9lc24ndCBtYXRjaCIsIHBhdGhuYW1lKTsKKwkJcmV0dXJuIFRSVUU7IC8qIG1vZHVsZSBuYW1lIGRvZXNuJ3QgbWF0Y2gsIGNvbnRpbnVlIHNlYXJjaCAqLworCX0KKworCWRiZzFfZXJyb3JfbXNnKCInJXMnIG1vZHVsZSBuYW1lIG1hdGNoZXMiLCBwYXRobmFtZSk7CisJbW9kdWxlX2ZvdW5kX2lkeCA9IGN1cjsKKwlwYXJzZV9tb2R1bGUoJm1vZGluZm9bY3VyXSwgcGF0aG5hbWUpOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9yKSkgeworCQlpZiAobG9hZF9tb2R1bGUocGF0aG5hbWUsIG1vZHVsZV9sb2FkX29wdGlvbnMpID09IDApIHsKKwkJCS8qIExvYWQgd2FzIHN1Y2Nlc3NmdWwsIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkby4KKwkJCSAqIFRoaXMgY2FuIGhhcHBlbiBPTkxZIGZvciAidG9wLWxldmVsIiBtb2R1bGUgbG9hZCwKKwkJCSAqIG5vdCBhIGRlcCwgYmVjYXVzZSBkZXBzIGRvbnQgZG8gZGlyc2Nhbi4gKi8KKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGxvYWRfZGVwX2JiKHZvaWQpCit7CisJY2hhciAqbGluZTsKKwlGSUxFICpmcCA9IGZvcGVuX2Zvcl9yZWFkKERFUEZJTEVfQkIpOworCisJaWYgKCFmcCkKKwkJcmV0dXJuIDA7CisKKwlkZXBfYmJfc2VlbiA9IDE7CisJZGJnMV9lcnJvcl9tc2coImxvYWRpbmcgIkRFUEZJTEVfQkIpOworCisJLyogV2h5PyBUaGVyZSBpcyBhIHJhcmUgc2NlbmFyaW86IHdlIGRpZCBub3QgZmluZCBtb2Rwcm9iZS5kZXAuYmIsCisJICogd2Ugc2Nhbm5lZCB0aGUgZGlyIGFuZCBmb3VuZCBubyBtb2R1bGUgYnkgbmFtZSwgdGhlbiB3ZSBzZWFyY2gKKwkgKiBmb3IgYWxpYXMgKGZ1bGwgc2NhbiksIGFuZCB3ZSBkZWNpZGVkIHRvIGdlbmVyYXRlIG1vZHByb2JlLmRlcC5iYi4KKwkgKiBCdXQgd2Ugc2VlIG1vZHByb2JlLmRlcC5iYi5uZXchIE90aGVyIG1vZHByb2JlIGlzIGF0IHdvcmshCisJICogV2Ugd2FpdCBhbmQgb3RoZXIgbW9kcHJvYmUgcmVuYW1lcyBpdCB0byBtb2Rwcm9iZS5kZXAuYmIuCisJICogTm93IHdlIGNhbiB1c2UgaXQuCisJICogQnV0IHdlIGFscmVhZHkgaGF2ZSBtb2RpbmZvW10gZmlsbGVkLCBhbmQgIm1vZHVsZV9jb3VudCA9IDAiCisJICogbWFrZXMgdXMgc3RhcnQgYW5ldy4gWWVzLCB3ZSBsZWFrIG1vZGluZm9bXS54eHggcG9pbnRlcnMgLQorCSAqIHRoZXJlIGlzIG5vdCBtdWNoIG9mIGRhdGEgdGhlcmUgYW55d2F5LiAqLworCW1vZHVsZV9jb3VudCA9IDA7CisJbWVtc2V0KCZtb2RpbmZvWzBdLCAwLCBzaXplb2YobW9kaW5mb1swXSkpOworCisJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpIHsKKwkJY2hhciogc3BhY2U7CisJCWNoYXIqIGxpbmVidWY7CisJCWludCBjdXI7CisKKwkJaWYgKCFsaW5lWzBdKSB7CisJCQlmcmVlKGxpbmUpOworCQkJY29udGludWU7CisJCX0KKwkJc3BhY2UgPSBzdHJjaHJudWwobGluZSwgJyAnKTsKKwkJY3VyID0gbW9kdWxlX2NvdW50Kys7CisJCW1vZGluZm8gPSB4cmVhbGxvY192ZWN0b3IobW9kaW5mbywgMTIsIGN1cik7CisJCS8qbW9kaW5mb1tjdXIrMV0ucGF0aG5hbWUgPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKwkJbW9kaW5mb1tjdXJdLnBhdGhuYW1lID0gbGluZTsgLyogd2UgdGFrZSBvd25lcnNoaXAgb2YgbWFsbG9jZWQgYmxvY2sgaGVyZSAqLworCQlpZiAoKnNwYWNlKQorCQkJKnNwYWNlKysgPSAnXDAnOworCQltb2RpbmZvW2N1cl0uYWxpYXNlcyA9IHNwYWNlOworCQlsaW5lYnVmID0geG1hbGxvY19mZ2V0bGluZShmcCk7CisJCW1vZGluZm9bY3VyXS5kZXBzID0gbGluZWJ1ZiA/IGxpbmVidWYgOiB4emFsbG9jKDEpOworCQlpZiAobW9kaW5mb1tjdXJdLmRlcHNbMF0pIHsKKwkJCS8qIGRlcHMgYXJlIG5vdCAiIiwgc28gbmV4dCBsaW5lIG11c3QgYmUgZW1wdHkgKi8KKwkJCWxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGZwKTsKKwkJCS8qIFJlZnVzZSB0byB3b3JrIHdpdGggZGFtYWdlZCBjb25maWcgZmlsZSAqLworCQkJaWYgKGxpbmUgJiYgbGluZVswXSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgaW4gJXMgYXQgJyVzJyIsIERFUEZJTEVfQkIsIGxpbmUpOworCQkJZnJlZShsaW5lKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzdGFydF9kZXBfYmJfd3JpdGVvdXQodm9pZCkKK3sKKwlpbnQgZmQ7CisKKwkvKiBkZXBtb2QgLW46IHdyaXRlIHJlc3VsdCB0byBzdGRvdXQgKi8KKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ2QnICYmIChvcHRpb25fbWFzazMyICYgMSkpCisJCXJldHVybiBTVERPVVRfRklMRU5POworCisJZmQgPSBvcGVuKERFUEZJTEVfQkIiLm5ldyIsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0VYQ0wsIDA2NDQpOworCWlmIChmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVFWElTVCkgeworCQkJaW50IGNvdW50ID0gNSAqIDIwOworCQkJZGJnMV9lcnJvcl9tc2coREVQRklMRV9CQiIubmV3IGV4aXN0cywgd2FpdGluZyBmb3IgIkRFUEZJTEVfQkIpOworCQkJd2hpbGUgKDEpIHsKKwkJCQl1c2xlZXAoMTAwMCoxMDAwIC8gMjApOworCQkJCWlmIChsb2FkX2RlcF9iYigpKSB7CisJCQkJCWRiZzFfZXJyb3JfbXNnKERFUEZJTEVfQkIiIGFwcGVhcmVkIik7CisJCQkJCXJldHVybiAtMjsgLyogbWFnaWMgbnVtYmVyICovCisJCQkJfQorCQkJCWlmICghLS1jb3VudCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQliYl9lcnJvcl9tc2coImRlbGV0aW5nIHN0YWxlICVzIiwgREVQRklMRV9CQiIubmV3Iik7CisJCQlmZCA9IG9wZW5fb3Jfd2FybihERVBGSUxFX0JCIi5uZXciLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DKTsKKwkJfQorCX0KKwlkYmcxX2Vycm9yX21zZygib3BlbmVkICJERVBGSUxFX0JCIi5uZXc6JWQiLCBmZCk7CisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9vdXRfZGVwX2JiKGludCBmZCkKK3sKKwlpbnQgaTsKKwlGSUxFICpmcDsKKworCS8qIFdlIHdhbnQgZ29vZCBlcnJvciByZXBvcnRpbmcuIGZkcHJpbnRmIGlzIG5vdCBnb29kIGVub3VnaC4gKi8KKwlmcCA9IHhmZG9wZW5fZm9yX3dyaXRlKGZkKTsKKwlpID0gMDsKKwl3aGlsZSAobW9kaW5mb1tpXS5wYXRobmFtZSkgeworCQlmcHJpbnRmKGZwLCAiJXMlcyVzXG4iICIlcyVzXG4iLAorCQkJbW9kaW5mb1tpXS5wYXRobmFtZSwgbW9kaW5mb1tpXS5hbGlhc2VzWzBdID8gIiAiIDogIiIsIG1vZGluZm9baV0uYWxpYXNlcywKKwkJCW1vZGluZm9baV0uZGVwcywgbW9kaW5mb1tpXS5kZXBzWzBdID8gIlxuIiA6ICIiKTsKKwkJaSsrOworCX0KKwkvKiBCYWRseSBmb3JtYXR0ZWQgZGVwZmlsZSBpcyBhIG5vLW5vLiBCZSBwYXJhbm9pZC4gKi8KKwllcnJubyA9IDA7CisJaWYgKGZlcnJvcihmcCkgfCBmY2xvc2UoZnApKSAvKiB8IGluc3RlYWQgb2YgfHwgaXMgaW50ZW5kZWQgKi8KKwkJZ290byBlcnI7CisKKwlpZiAoZmQgPT0gU1RET1VUX0ZJTEVOTykgLyogaXQgd2FzIGRlcG1vZCAtbiAqLworCQlnb3RvIG9rOworCisJaWYgKHJlbmFtZShERVBGSUxFX0JCIi5uZXciLCBERVBGSUxFX0JCKSAhPSAwKSB7CisgZXJyOgorCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIERFUEZJTEVfQkIpOworCQl1bmxpbmsoREVQRklMRV9CQiIubmV3Iik7CisJfSBlbHNlIHsKKyBvazoKKwkJd3JvdGVfZGVwX2JiX29rID0gMTsKKwkJZGJnMV9lcnJvcl9tc2coImNyZWF0ZWQgIkRFUEZJTEVfQkIpOworCX0KK30KKworc3RhdGljIG1vZHVsZV9pbmZvKiBmaW5kX2FsaWFzKGNvbnN0IGNoYXIgKmFsaWFzKQoreworCWludCBpOworCWludCBkZXBfYmJfZmQ7CisJbW9kdWxlX2luZm8gKnJlc3VsdDsKKwlkYmcxX2Vycm9yX21zZygiZmluZF9hbGlhcygnJXMnKSIsIGFsaWFzKTsKKworIHRyeV9hZ2FpbjoKKwkvKiBGaXJzdCB0cnkgdG8gZmluZCBieSBuYW1lIChjaGVhcGVyKSAqLworCWkgPSAwOworCXdoaWxlIChtb2RpbmZvW2ldLnBhdGhuYW1lKSB7CisJCWlmIChwYXRobmFtZV9tYXRjaGVzX21vZG5hbWUobW9kaW5mb1tpXS5wYXRobmFtZSwgYWxpYXMpKSB7CisJCQlkYmcxX2Vycm9yX21zZygiZm91bmQgJyVzJyBpbiBtb2R1bGUgJyVzJyIsCisJCQkJCWFsaWFzLCBtb2RpbmZvW2ldLnBhdGhuYW1lKTsKKwkJCWlmICghbW9kaW5mb1tpXS5hbGlhc2VzKSB7CisJCQkJcGFyc2VfbW9kdWxlKCZtb2RpbmZvW2ldLCBtb2RpbmZvW2ldLnBhdGhuYW1lKTsKKwkJCX0KKwkJCXJldHVybiAmbW9kaW5mb1tpXTsKKwkJfQorCQlpKys7CisJfQorCisJLyogT2ssIHdlIGRlZmluaXRlbHkgaGF2ZSB0byBzY2FuIG1vZHVsZSBib2RpZXMuIFRoaXMgaXMgYSBnb29kCisJICogbW9tZW50IHRvIGdlbmVyYXRlIG1vZHByb2JlLmRlcC5iYiwgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0ICovCisJZGVwX2JiX2ZkID0gZGVwX2JiX3NlZW4gPyAtMSA6IHN0YXJ0X2RlcF9iYl93cml0ZW91dCgpOworCWlmIChkZXBfYmJfZmQgPT0gLTIpIC8qIG1vZHByb2JlLmRlcC5iYiBhcHBlYXJlZD8gKi8KKwkJZ290byB0cnlfYWdhaW47CisKKwkvKiBTY2FuIGFsbCBtb2R1bGUgYm9kaWVzLCBleHRyYWN0IG1vZGluZm8gKGl0IGNvbnRhaW5zIGFsaWFzZXMpICovCisJaSA9IDA7CisJcmVzdWx0ID0gTlVMTDsKKwl3aGlsZSAobW9kaW5mb1tpXS5wYXRobmFtZSkgeworCQljaGFyICpkZXNjLCAqczsKKwkJaWYgKCFtb2RpbmZvW2ldLmFsaWFzZXMpIHsKKwkJCXBhcnNlX21vZHVsZSgmbW9kaW5mb1tpXSwgbW9kaW5mb1tpXS5wYXRobmFtZSk7CisJCX0KKwkJaWYgKHJlc3VsdCkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKwkJLyogImFsaWFzMSBzeW1ib2w6c3ltMSBhbGlhczIgc3ltYm9sOnN5bTIiICovCisJCWRlc2MgPSBzdHJfMl9saXN0KG1vZGluZm9baV0uYWxpYXNlcyk7CisJCS8qIERvZXMgbWF0Y2hpbmcgc3Vic3RyaW5nIGV4aXN0PyAqLworCQlmb3IgKHMgPSBkZXNjOyAqczsgcyArPSBzdHJsZW4ocykgKyAxKSB7CisJCQkvKiBBbGlhc2VzIGluIG1vZHVsZSBib2RpZXMgY2FuIGJlIGRlZmluZWQgd2l0aAorCQkJICogc2hlbGwgcGF0dGVybnMuIEV4YW1wbGU6CisJCQkgKiAicGNpOnYwMDAwMTBERWQwMDAwMDBEOXN2KnNkKmJjKnNjKmkqIi4KKwkJCSAqIFBsYWluIHN0cmNtcCgpIHdvbid0IGNhdGNoIHRoYXQgKi8KKwkJCWlmIChmbm1hdGNoKHMsIGFsaWFzLCAwKSA9PSAwKSB7CisJCQkJZGJnMV9lcnJvcl9tc2coImZvdW5kIGFsaWFzICclcycgaW4gbW9kdWxlICclcyciLAorCQkJCQkJYWxpYXMsIG1vZGluZm9baV0ucGF0aG5hbWUpOworCQkJCXJlc3VsdCA9ICZtb2RpbmZvW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZyZWUoZGVzYyk7CisJCWlmIChyZXN1bHQgJiYgZGVwX2JiX2ZkIDwgMCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWkrKzsKKwl9CisKKwkvKiBDcmVhdGUgbW9kdWxlLmRlcC5iYiBpZiBuZWVkZWQgKi8KKwlpZiAoZGVwX2JiX2ZkID49IDApIHsKKwkJd3JpdGVfb3V0X2RlcF9iYihkZXBfYmJfZmQpOworCX0KKworCWRiZzFfZXJyb3JfbXNnKCJmaW5kX2FsaWFzICclcycgcmV0dXJucyAlcCIsIGFsaWFzLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRAorLy8gVE9ETzogb3BlbiBvbmx5IG9uY2UsIGludmVudCBjb25maWdfcmV3aW5kKCkKK3N0YXRpYyBpbnQgYWxyZWFkeV9sb2FkZWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpzOworCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoIi9wcm9jL21vZHVsZXMiLCB4Zm9wZW5fZm9yX3JlYWQpOworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsICZzLCAxLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCAmIH5QQVJTRV9HUkVFRFkpKSB7CisJCWlmIChzdHJjbXAocywgbmFtZSkgPT0gMCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCXJldHVybiByZXQ7Cit9CisjZWxzZQorI2RlZmluZSBhbHJlYWR5X2xvYWRlZChuYW1lKSBpc19ybW1vZAorI2VuZGlmCisKKy8qCisgKiBHaXZlbiBtb2R1bGVzIGRlZmluaXRpb24gYW5kIG1vZHVsZSBuYW1lIChvciBhbGlhcywgb3Igc3ltYm9sKQorICogbG9hZC9yZW1vdmUgdGhlIG1vZHVsZSByZXNwZWN0aW5nIGRlcGVuZGVuY2llcy4KKyAqIE5COiBhbHNvIGNhbGxlZCBieSBkZXBtb2Qgd2l0aCBib2d1cyBuYW1lICIvIiwKKyAqIGp1c3QgaW4gb3JkZXIgdG8gZm9yY2UgbW9kcHJvYmUuZGVwLmJiIGNyZWF0aW9uLgorKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FCisjZGVmaW5lIHByb2Nlc3NfbW9kdWxlKGEsYikgcHJvY2Vzc19tb2R1bGUoYSkKKyNkZWZpbmUgY21kbGluZV9vcHRpb25zICIiCisjZW5kaWYKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbW9kdWxlKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNtZGxpbmVfb3B0aW9ucykKK3sKKwljaGFyICpzLCAqZGVwcywgKm9wdGlvbnM7CisJbW9kdWxlX2luZm8gKmluZm87CisJaW50IGlzX3JtbW9kID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfcikgIT0gMDsKKwlkYmcxX2Vycm9yX21zZygicHJvY2Vzc19tb2R1bGUoJyVzJywnJXMnKSIsIG5hbWUsIGNtZGxpbmVfb3B0aW9ucyk7CisKKwlyZXBsYWNlKG5hbWUsICctJywgJ18nKTsKKworCWRiZzFfZXJyb3JfbXNnKCJhbHJlYWR5X2xvYWRlZDolZCBpc19ybW1vZDolZCIsIGFscmVhZHlfbG9hZGVkKG5hbWUpLCBpc19ybW1vZCk7CisJaWYgKGFscmVhZHlfbG9hZGVkKG5hbWUpICE9IGlzX3JtbW9kKSB7CisJCWRiZzFfZXJyb3JfbXNnKCJub3RoaW5nIHRvIGRvIGZvciAnJXMnIiwgbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlvcHRpb25zID0gTlVMTDsKKwlpZiAoIWlzX3JtbW9kKSB7CisJCWNoYXIgKm9wdF9maWxlbmFtZSA9IHhhc3ByaW50ZigiL2V0Yy9tb2R1bGVzLyVzIiwgbmFtZSk7CisJCW9wdGlvbnMgPSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShvcHRfZmlsZW5hbWUsIE5VTEwpOworCQlpZiAob3B0aW9ucykKKwkJCXJlcGxhY2Uob3B0aW9ucywgJ1xuJywgJyAnKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUKKwkJaWYgKGNtZGxpbmVfb3B0aW9ucykgeworCQkJLyogTkI6IGNtZGxpbmVfb3B0aW9ucyBhbHdheXMgaGF2ZSBvbmUgbGVhZGluZyAnICcKKwkJCSAqIChzZWUgbWFpbigpKSwgd2UgcmVtb3ZlIGl0IGhlcmUgKi8KKwkJCWNoYXIgKm9wID0geGFzcHJpbnRmKG9wdGlvbnMgPyAiJXMgJXMiIDogIiVzICVzIiArIDMsCisJCQkJCQljbWRsaW5lX29wdGlvbnMgKyAxLCBvcHRpb25zKTsKKwkJCWZyZWUob3B0aW9ucyk7CisJCQlvcHRpb25zID0gb3A7CisJCX0KKyNlbmRpZgorCQlmcmVlKG9wdF9maWxlbmFtZSk7CisJCW1vZHVsZV9sb2FkX29wdGlvbnMgPSBvcHRpb25zOworCQlkYmcxX2Vycm9yX21zZygicHJvY2Vzc19tb2R1bGUoJyVzJyk6IG9wdGlvbnM6JyVzJyIsIG5hbWUsIG9wdGlvbnMpOworCX0KKworCWlmICghbW9kdWxlX2NvdW50KSB7CisJCS8qIFNjYW4gbW9kdWxlIGRpcmVjdG9yeS4gVGhpcyBpcyBkb25lIG9ubHkgb25jZS4KKwkJICogSXQgd2lsbCBhdHRlbXB0IG1vZHVsZSBsb2FkLCBhbmQgd2lsbCBleGl0KEVYSVRfU1VDQ0VTUykKKwkJICogb24gc3VjY2Vzcy4gKi8KKwkJbW9kdWxlX2ZvdW5kX2lkeCA9IC0xOworCQlyZWN1cnNpdmVfYWN0aW9uKCIuIiwKKwkJCUFDVElPTl9SRUNVUlNFLCAvKiBmbGFncyAqLworCQkJZmlsZUFjdGlvbiwgLyogZmlsZSBhY3Rpb24gKi8KKwkJCU5VTEwsIC8qIGRpciBhY3Rpb24gKi8KKwkJCW5hbWUsIC8qIHVzZXIgZGF0YSAqLworCQkJMCk7IC8qIGRlcHRoICovCisJCWRiZzFfZXJyb3JfbXNnKCJkaXJzY2FuIGNvbXBsZXRlIik7CisJCS8qIE1vZHVsZSB3YXMgbm90IGZvdW5kLCBvciBsb2FkIGZhaWxlZCwgb3IgaXNfcm1tb2QgKi8KKwkJaWYgKG1vZHVsZV9mb3VuZF9pZHggPj0gMCkgeyAvKiBtb2R1bGUgd2FzIGZvdW5kICovCisJCQlpbmZvID0gJm1vZGluZm9bbW9kdWxlX2ZvdW5kX2lkeF07CisJCX0gZWxzZSB7IC8qIHNlYXJjaCBmb3IgYWxpYXMsIG5vdCBhIHBsYWluIG1vZHVsZSBuYW1lICovCisJCQlpbmZvID0gZmluZF9hbGlhcyhuYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCWluZm8gPSBmaW5kX2FsaWFzKG5hbWUpOworCX0KKworLy8gUHJvYmxlbSBoZXJlOiB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBtb2R1bGUKKy8vIGZvciB0aGUgZ2l2ZW4gYWxpYXMuIEZvciBleGFtcGxlLAorLy8gInBjaTp2MDAwMDgwODZkMDAwMDcwMTBzdjAwMDAwMDAwc2QwMDAwMDAwMGJjMDFzYzAxaTgwIiBtYXRjaGVzCisvLyBhdGFfcGlpeCBiZWNhdXNlIGl0IGhhcyBhbiBhbGlhcyAicGNpOnYwMDAwODA4NmQwMDAwNzAxMHN2KnNkKmJjKnNjKmkqIgorLy8gYW5kIGF0YV9nZW5lcmljLCBpdCBoYXMgYW4gYWxpYXMgImFsaWFzPXBjaTp2KmQqc3Yqc2QqYmMwMXNjMDFpKiIKKy8vIFN0YW5kYXJkIG1vZHByb2JlIHdvdWxkIGxvYWQgdGhlbSBib3RoLgorLy8gSW4gdGhpcyBjb2RlLCBmaW5kX2FsaWFzKCkgcmV0dXJucyBvbmx5IHRoZSBmaXJzdCBtYXRjaGluZyBtb2R1bGUuCisKKwkvKiBybW1vZD8gdW5sb2FkIGl0IGJ5IG5hbWUgKi8KKwlpZiAoaXNfcm1tb2QpIHsKKwkJaWYgKGRlbGV0ZV9tb2R1bGUobmFtZSwgT19OT05CTE9DSyB8IE9fRVhDTCkgIT0gMCkgeworCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9xKSkKKwkJCQliYl9wZXJyb3JfbXNnKCJyZW1vdmUgJyVzJyIsIG5hbWUpOworCQkJZ290byByZXQ7CisJCX0KKwkJLyogTi5CLiB3ZSBkbyBub3Qgc3RvcCBoZXJlIC0KKwkJICogY29udGludWUgdG8gdW5sb2FkIG1vZHVsZXMgb24gd2hpY2ggdGhlIG1vZHVsZSBkZXBlbmRzOgorCQkgKiAiLXIgLS1yZW1vdmU6IG9wdGlvbiBjYXVzZXMgbW9kcHJvYmUgdG8gcmVtb3ZlIGEgbW9kdWxlLgorCQkgKiBJZiB0aGUgbW9kdWxlcyBpdCBkZXBlbmRzIG9uIGFyZSBhbHNvIHVudXNlZCwgbW9kcHJvYmUKKwkJICogd2lsbCB0cnkgdG8gcmVtb3ZlIHRoZW0sIHRvby4iICovCisJfQorCisJaWYgKCFpbmZvKSB7CisJCS8qIGJvdGggZGlyc2NhbiBhbmQgZmluZF9hbGlhcyBmb3VuZCBub3RoaW5nICovCisJCWlmICghaXNfcm1tb2QgJiYgYXBwbGV0X25hbWVbMF0gIT0gJ2QnKSAvKiBpdCB3YXNuJ3Qgcm1tb2Qgb3IgZGVwbW9kICovCisJCQliYl9lcnJvcl9tc2coIm1vZHVsZSAnJXMnIG5vdCBmb3VuZCIsIG5hbWUpOworLy9UT0RPOiBfYW5kX2RpZSgpPyBvciBzaG91bGQgd2UgY29udGludWUgKHVuKWxvYWRpbmcgbW9kdWxlcyBsaXN0ZWQgb24gY21kbGluZT8KKwkJZ290byByZXQ7CisJfQorCisJLyogSXRlcmF0ZSB0aHJ1IGRlcGVuZGVuY2llcywgdHJ5aW5nIHRvICh1bilsb2FkIHRoZW0gKi8KKwlkZXBzID0gc3RyXzJfbGlzdChpbmZvLT5kZXBzKTsKKwlmb3IgKHMgPSBkZXBzOyAqczsgcyArPSBzdHJsZW4ocykgKyAxKSB7CisJCS8vaWYgKHN0cmNtcChuYW1lLCBzKSAhPSAwKSAvLyBOLkIuIGRvIGxvb3BzIGV4aXN0PworCQlkYmcxX2Vycm9yX21zZygicmVjdXJzZSBvbiBkZXAgJyVzJyIsIHMpOworCQlwcm9jZXNzX21vZHVsZShzLCBOVUxMKTsKKwkJZGJnMV9lcnJvcl9tc2coInJlY3Vyc2Ugb24gZGVwICclcycgZG9uZSIsIHMpOworCX0KKwlmcmVlKGRlcHMpOworCisJLyogbW9kcHJvYmUgLT4gbG9hZCBpdCAqLworCWlmICghaXNfcm1tb2QpIHsKKwkJaWYgKCFvcHRpb25zIHx8IHN0cnN0cihvcHRpb25zLCAiYmxhY2tsaXN0IikgPT0gTlVMTCkgeworCQkJZXJybm8gPSAwOworCQkJaWYgKGxvYWRfbW9kdWxlKGluZm8tPnBhdGhuYW1lLCBvcHRpb25zKSAhPSAwKSB7CisJCQkJaWYgKEVFWElTVCAhPSBlcnJubykgeworCQkJCQliYl9lcnJvcl9tc2coIiclcyc6ICVzIiwKKwkJCQkJCWluZm8tPnBhdGhuYW1lLAorCQkJCQkJbW9kZXJyb3IoZXJybm8pKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkYmcxX2Vycm9yX21zZygiJyVzJzogJXMiLAorCQkJCQkJaW5mby0+cGF0aG5hbWUsCisJCQkJCQltb2RlcnJvcihlcnJubykpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRiZzFfZXJyb3JfbXNnKCInJXMnOiBibGFja2xpc3RlZCIsIGluZm8tPnBhdGhuYW1lKTsKKwkJfQorCX0KKyByZXQ6CisJZnJlZShvcHRpb25zKTsKKy8vVE9ETzogcmV0dXJuIGxvYWQgYXR0ZW1wdCByZXN1bHQgZnJvbSBwcm9jZXNzX21vZHVsZS4KKy8vSWYgZGVwIGRpZG4ndCBsb2FkIG9rLCBjb250aW51aW5nIG1ha2VzIGxpdHRsZSBzZW5zZS4KK30KKyN1bmRlZiBjbWRsaW5lX29wdGlvbnMKKworCisvKiBGb3IgcmVmZXJlbmNlLCBtb2R1bGUtaW5pdC10b29scyB2My40IG9wdGlvbnM6CisKKyMgaW5zbW9kCitVc2FnZTogaW5zbW9kIGZpbGVuYW1lIFthcmdzXQorCisjIHJtbW9kIC0taGVscAorVXNhZ2U6IHJtbW9kIFstZmhzd3ZWXSBtb2R1bGVuYW1lIC4uLgorIC1mIChvciAtLWZvcmNlKSBmb3JjZXMgYSBtb2R1bGUgdW5sb2FkLCBhbmQgbWF5IGNyYXNoIHlvdXIKKyAgICBtYWNoaW5lLiBUaGlzIHJlcXVpcmVzIHRoZSBGb3JjZWQgTW9kdWxlIFJlbW92YWwgb3B0aW9uCisgICAgd2hlbiB0aGUga2VybmVsIHdhcyBjb21waWxlZC4KKyAtaCAob3IgLS1oZWxwKSBwcmludHMgdGhpcyBoZWxwIHRleHQKKyAtcyAob3IgLS1zeXNsb2cpIHNheXMgdXNlIHN5c2xvZywgbm90IHN0ZGVycgorIC12IChvciAtLXZlcmJvc2UpIGVuYWJsZXMgbW9yZSBtZXNzYWdlcworIC1WIChvciAtLXZlcnNpb24pIHByaW50cyB0aGUgdmVyc2lvbiBjb2RlCisgLXcgKG9yIC0td2FpdCkgYmVnaW5zIG1vZHVsZSByZW1vdmFsIGV2ZW4gaWYgaXQgaXMgdXNlZAorICAgIGFuZCB3aWxsIHN0b3AgbmV3IHVzZXJzIGZyb20gYWNjZXNzaW5nIHRoZSBtb2R1bGUgKHNvIGl0CisgICAgc2hvdWxkIGV2ZW50dWFsbHkgZmFsbCB0byB6ZXJvKS4KKworIyBtb2Rwcm9iZQorVXNhZ2U6IG1vZHByb2JlIFstdl0gWy1WXSBbLUMgY29uZmlnLWZpbGVdIFstbl0gWy1pXSBbLXFdIFstYl0KKyAgICBbLW8gPG1vZG5hbWU+XSBbIC0tZHVtcC1tb2R2ZXJzaW9ucyBdIDxtb2RuYW1lPiBbcGFyYW1ldGVycy4uLl0KK21vZHByb2JlIC1yIFstbl0gWy1pXSBbLXZdIDxtb2R1bGVuYW1lPiAuLi4KK21vZHByb2JlIC1sIC10IDxkaXJuYW1lPiBbIC1hIDxtb2R1bGVuYW1lPiAuLi5dCisKKyMgZGVwbW9kIC0taGVscAorZGVwbW9kIDMuNCAtLSBwYXJ0IG9mIG1vZHVsZS1pbml0LXRvb2xzCitkZXBtb2QgLVthQV0gWy1uIC1lIC12IC1xIC1WIC1yIC11XQorICAgICAgWy1iIGJhc2VkaXJlY3RvcnldIFtmb3JjZWRfdmVyc2lvbl0KK2RlcG1vZCBbLW4gLWUgLXYgLXEgLXIgLXVdIFstRiBrZXJuZWxzeW1zXSBtb2R1bGUxLmtvIG1vZHVsZTIua28gLi4uCitJZiBubyBhcmd1bWVudHMgKGV4Y2VwdCBvcHRpb25zKSBhcmUgZ2l2ZW4sICJkZXBtb2QgLWEiIGlzIGFzc3VtZWQuCitkZXBtb2Qgd2lsbCBvdXRwdXQgYSBkZXBlbmRlbmN5IGxpc3Qgc3VpdGFibGUgZm9yIHRoZSBtb2Rwcm9iZSB1dGlsaXR5LgorT3B0aW9uczoKKyAgICAtYSwgLS1hbGwgICAgICAgICAgIFByb2JlIGFsbCBtb2R1bGVzCisgICAgLUEsIC0tcXVpY2sgICAgICAgICBPbmx5IGRvZXMgdGhlIHdvcmsgaWYgdGhlcmUncyBhIG5ldyBtb2R1bGUKKyAgICAtbiwgLS1zaG93ICAgICAgICAgIFdyaXRlIHRoZSBkZXBlbmRlbmN5IGZpbGUgb24gc3Rkb3V0IG9ubHkKKyAgICAtZSwgLS1lcnJzeW1zICAgICAgIFJlcG9ydCBub3Qgc3VwcGxpZWQgc3ltYm9scworICAgIC1WLCAtLXZlcnNpb24gICAgICAgUHJpbnQgdGhlIHJlbGVhc2UgdmVyc2lvbgorICAgIC12LCAtLXZlcmJvc2UgICAgICAgRW5hYmxlIHZlcmJvc2UgbW9kZQorICAgIC1oLCAtLWhlbHAgICAgICAgICAgUHJpbnQgdGhpcyB1c2FnZSBtZXNzYWdlCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHVzZWZ1bCBmb3IgcGVvcGxlIG1hbmFnaW5nIGRpc3RyaWJ1dGlvbnM6CisgICAgLWIgYmFzZWRpcmVjdG9yeQorICAgIC0tYmFzZWRpciBiYXNlZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICBVc2UgYW4gaW1hZ2Ugb2YgYSBtb2R1bGUgdHJlZQorICAgIC1GIGtlcm5lbHN5bXMKKyAgICAtLWZpbGVzeW1zIGtlcm5lbHN5bXMKKyAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgZmlsZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGtlcm5lbCBzeW1ib2xzCisqLworCisvL3VzYWdlOiNpZiBFTkFCTEVfTU9EUFJPQkVfU01BTEwKKworLy91c2FnZTojZGVmaW5lIGRlcG1vZF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZGVwbW9kX2Z1bGxfdXNhZ2UgIiIKKworLy91c2FnZTojZGVmaW5lIGxzbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgbHNtb2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0IHRoZSBjdXJyZW50bHkgbG9hZGVkIGtlcm5lbCBtb2R1bGVzIgorCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoIltPUFRJT05TXSBNT0RVTEUgIikKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFXzJfNF9NT0RVTEVTKCJGSUxFICIpCisvL3VzYWdlOgkiW1NZTUJPTD1WQUxVRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCB0aGUgc3BlY2lmaWVkIGtlcm5lbCBtb2R1bGVzIGludG8gdGhlIGtlcm5lbCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgbW9kdWxlIHRvIGxvYWQgaW50byB0aGUgd3Jvbmcga2VybmVsIHZlcnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS1rCU1ha2UgbW9kdWxlIGF1dG9jbGVhbi1hYmxlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJTG9jazogcHJldmVudCBzaW11bHRhbmVvdXMgbG9hZHMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCgKKy8vdXNhZ2U6ICAgICAiXG4JLW0JT3V0cHV0IGxvYWQgbWFwIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXgJRG9uJ3QgZXhwb3J0IGV4dGVybnMiCisvL3VzYWdlOgkpCisKKy8vdXNhZ2U6I2RlZmluZSBybW1vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy13ZmFdIFtNT0RVTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHJtbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVW5sb2FkIGtlcm5lbCBtb2R1bGVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS13CVdhaXQgdW50aWwgdGhlIG1vZHVsZSBpcyBubyBsb25nZXIgdXNlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgdW5sb2FkIgorLy91c2FnZTogICAgICJcbgktYQlSZW1vdmUgYWxsIHVudXNlZCBtb2R1bGVzIChyZWN1cnNpdmVseSkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJtbW9kX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJtbW9kIHR1bGlwXG4iCisKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1xZndyc3ZdIE1PRFVMRSBbc3ltYm9sPXZhbHVlXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktcglSZW1vdmUgTU9EVUxFIChzdGFja3MpIG9yIGRvIGF1dG9jbGVhbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJUXVpZXQiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTogICAgICJcbgktdwlXYWl0IGZvciB1bmxvYWQiCisvL3VzYWdlOiAgICAgIlxuCS1zCVJlcG9ydCB2aWEgc3lzbG9nIGluc3RlYWQgb2Ygc3RkZXJyIgorCisvL3VzYWdlOiNlbmRpZgorCitpbnQgbW9kcHJvYmVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1vZHByb2JlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJY2hhciBhcHBsZXQwID0gYXBwbGV0X25hbWVbMF07CisJSUZfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUoY2hhciAqb3B0aW9uczspCisKKwkvKiBhcmUgd2UgbHNtb2Q/IC0+IGp1c3QgZHVtcCAvcHJvYy9tb2R1bGVzICovCisJaWYgKCdsJyA9PSBhcHBsZXQwKSB7CisJCXhwcmludF9hbmRfY2xvc2VfZmlsZSh4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL21vZHVsZXMiKSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJSU5JVF9HKCk7CisKKwkvKiBQcmV2ZW50IHVnbHkgY29ybmVyIGNhc2VzIHdpdGggbm8gbW9kdWxlcyBhdCBhbGwgKi8KKwltb2RpbmZvID0geHphbGxvYyhzaXplb2YobW9kaW5mb1swXSkpOworCisJaWYgKCdpJyAhPSBhcHBsZXQwKSB7IC8qIG5vdCBpbnNtb2QgKi8KKwkJLyogR290byBtb2R1bGVzIGRpcmVjdG9yeSAqLworCQl4Y2hkaXIoQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVIpOworCX0KKwl1bmFtZSgmdXRzKTsgLyogbmV2ZXIgZmFpbHMgKi8KKworCS8qIGRlcG1vZD8gKi8KKwlpZiAoJ2QnID09IGFwcGxldDApIHsKKwkJLyogU3VwcG9ydGVkOgorCQkgKiAtbjogcHJpbnQgcmVzdWx0IHRvIHN0ZG91dAorCQkgKiAtYTogcHJvY2VzcyBhbGwgbW9kdWxlcyAoZGVmYXVsdCkKKwkJICogb3B0aW9uYWwgVkVSU0lPTiBwYXJhbWV0ZXIKKwkJICogSWdub3JlZDoKKwkJICogLUE6IGRvIHdvcmsgb25seSBpZiBhIG1vZHVsZSBpcyBuZXdlciB0aGFuIGRlcGZpbGUKKwkJICogLWU6IHJlcG9ydCBhbnkgc3ltYm9scyB3aGljaCBhIG1vZHVsZSBuZWVkcworCQkgKiAgd2hpY2ggYXJlIG5vdCBzdXBwbGllZCBieSBvdGhlciBtb2R1bGVzIG9yIHRoZSBrZXJuZWwKKwkJICogLUYgRklMRTogU3lzdGVtLm1hcCAoc3ltYm9scyBmb3IgLWUpCisJCSAqIC1xLCAtciwgLXU6IG5vb3A/CisJCSAqIE5vdCBzdXBwb3J0ZWQ6CisJCSAqIC1iIEJBU0VESVI6IChUT0RPISkgbW9kdWxlcyBhcmUgaW4KKwkJICogICRCQVNFRElSL2xpYi9tb2R1bGVzLyRWRVJTSU9OCisJCSAqIC12OiBodW1hbiByZWFkYWJsZSBkZXBzIHRvIHN0ZG91dAorCQkgKiAtVjogdmVyc2lvbiAoZG9uJ3Qgd2FudCB0byBzdXBwb3J0IGl0IC0gcGVvcGxlIG1heSBkZXBlbmQKKwkJICogIG9uIGl0IGFzIGFuIGluZGljYXRvciBvZiAic3RhbmRhcmQiIGRlcG1vZCkKKwkJICogLWg6IGhlbHAgKHdlbGwgZHVoKQorCQkgKiBtb2R1bGUxLm8gbW9kdWxlMi5vIHBhcmFtZXRlcnMgKGp1c3QgaWdub3JlZCBmb3Igbm93KQorCQkgKi8KKwkJZ2V0b3B0MzIoYXJndiwgIm5hIiAiQWVGOnFydSIgLyogImI6dlYiLCBOVUxMICovLCBOVUxMKTsKKwkJYXJndiArPSBvcHRpbmQ7CisJCS8qIGlmIChhcmd2WzBdICYmIGFyZ3ZbMV0pIGJiX3Nob3dfdXNhZ2UoKTsgKi8KKwkJLyogR290byAkVkVSU0lPTiBkaXJlY3RvcnkgKi8KKwkJeGNoZGlyKGFyZ3ZbMF0gPyBhcmd2WzBdIDogdXRzLnJlbGVhc2UpOworCQkvKiBGb3JjZSBmdWxsIG1vZHVsZSBzY2FuIGJ5IGFza2luZyB0byBmaW5kIGEgYm9ndXMgbW9kdWxlLgorCQkgKiBUaGlzIHdpbGwgZ2VuZXJhdGUgbW9kdWxlcy5kZXAuYmIgYXMgYSBzaWRlIGVmZmVjdC4gKi8KKwkJcHJvY2Vzc19tb2R1bGUoKGNoYXIqKSIvIiwgTlVMTCk7CisJCXJldHVybiAhd3JvdGVfZGVwX2JiX29rOworCX0KKworCS8qIGluc21vZCwgbW9kcHJvYmUsIHJtbW9kIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50ICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCS8qIG9ubHkgLXEgKHF1aWV0KSBhbmQgLXIgKHJtbW9kKSwKKwkgKiB0aGUgcmVzdCBhcmUgYWNjZXB0ZWQgYW5kIGlnbm9yZWQgKGNvbXBhdCkgKi8KKwlnZXRvcHQzMihhcmd2LCAicXJmc3Z3Iik7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBhcmUgd2Ugcm1tb2Q/IC0+IHNpbXVsYXRlIG1vZHByb2JlIC1yICovCisJaWYgKCdyJyA9PSBhcHBsZXQwKSB7CisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX3I7CisJfQorCisJaWYgKCdpJyAhPSBhcHBsZXQwKSB7IC8qIG5vdCBpbnNtb2QgKi8KKwkJLyogR290byAkVkVSU0lPTiBkaXJlY3RvcnkgKi8KKwkJeGNoZGlyKHV0cy5yZWxlYXNlKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUKKwkvKiBJZiBub3Qgcm1tb2QsIHBhcnNlIHBvc3NpYmxlIG1vZHVsZSBvcHRpb25zIGdpdmVuIG9uIGNvbW1hbmQgbGluZS4KKwkgKiBpbnNtb2QvbW9kcHJvYmUgdGFrZXMgb25lIG1vZHVsZSBuYW1lLCB0aGUgcmVzdCBhcmUgcGFyYW1ldGVycy4gKi8KKwlvcHRpb25zID0gTlVMTDsKKwlpZiAoJ3InICE9IGFwcGxldDApIHsKKwkJY2hhciAqKmFyZyA9IGFyZ3Y7CisJCXdoaWxlICgqKythcmcpIHsKKwkJCS8qIEVuY2xvc2Ugb3B0aW9ucyBpbiBxdW90ZXMgKi8KKwkJCWNoYXIgKnMgPSBvcHRpb25zOworCQkJb3B0aW9ucyA9IHhhc3ByaW50ZigiJXMgXCIlc1wiIiwgcyA/IHMgOiAiIiwgKmFyZyk7CisJCQlmcmVlKHMpOworCQkJKmFyZyA9IE5VTEw7CisJCX0KKwl9CisjZWxzZQorCWlmICgncicgIT0gYXBwbGV0MCkKKwkJYXJndlsxXSA9IE5VTEw7CisjZW5kaWYKKworCWlmICgnaScgPT0gYXBwbGV0MCkgeyAvKiBpbnNtb2QgKi8KKwkJc2l6ZV90IGxlbjsKKwkJdm9pZCAqbWFwOworCisJCWxlbiA9IE1BWElOVChzc2l6ZV90KTsKKwkJbWFwID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKCphcmd2LCAmbGVuKTsKKwkJaWYgKCFtYXApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJyVzJyIsICphcmd2KTsKKwkJaWYgKGluaXRfbW9kdWxlKG1hcCwgbGVuLAorCQkJSUZfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUob3B0aW9ucyA/IG9wdGlvbnMgOiAiIikKKwkJCUlGX05PVF9GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSgiIikKKwkJCSkgIT0gMAorCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBpbnNlcnQgJyVzJzogJXMiLAorCQkJCQkqYXJndiwgbW9kZXJyb3IoZXJybm8pKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgdG8gbG9hZCBtb2Rwcm9iZS5kZXAuYmIgKi8KKwlsb2FkX2RlcF9iYigpOworCisJLyogTG9hZC9yZW1vdmUgbW9kdWxlcy4KKwkgKiBPbmx5IHJtbW9kIGxvb3BzIGhlcmUsIG1vZHByb2JlIGhhcyBvbmx5IGFyZ3ZbMF0gKi8KKwlkbyB7CisJCXByb2Nlc3NfbW9kdWxlKCphcmd2LCBvcHRpb25zKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlJRl9GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORShmcmVlKG9wdGlvbnMpOykKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL21vZHByb2JlLmMgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9tb2Rwcm9iZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTE4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9tb2Rwcm9iZS5jCkBAIC0wLDAgKzEsNjYyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNb2Rwcm9iZSB3cml0dGVuIGZyb20gc2NyYXRjaCBmb3IgQnVzeUJveAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaW1vIFRlcmFzIDx0aW1vLnRlcmFzQGlraS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBEcm9ubmlrb3YKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX01PRFBST0JFKEFQUExFVChtb2Rwcm9iZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1vZHV0aWxzLmgiCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKy8vI2RlZmluZSBEQkcoZm10LCAuLi4pIGJiX2Vycm9yX21zZygiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIERCRyguLi4pICgodm9pZCkwKQorCisvKiBOb3RlIHRoYXQgdW5saWtlIG9sZGVyIHZlcnNpb25zIG9mIG1vZHVsZXMuZGVwL2RlcG1vZCAoYnVzeWJveCBhbmQgbS1pLXQpLAorICogd2UgZXhwZWN0IHRoZSBmdWxsIGRlcGVuZGVuY3kgbGlzdCB0byBiZSBzcGVjaWZpZWQgaW4gbW9kdWxlcy5kZXAuCisgKiBPbGRlciB2ZXJzaW9ucyB3b3VsZCBvbmx5IGV4cG9ydCB0aGUgZGlyZWN0IGRlcGVuZGVuY3kgbGlzdC4KKyAqLworCisKKy8vdXNhZ2U6I2lmICFFTkFCTEVfTU9EUFJPQkVfU01BTEwKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9ub3Rlc191c2FnZQorLy91c2FnZToJIm1vZHByb2JlIGNhbiAodW4pbG9hZCBhIHN0YWNrIG9mIG1vZHVsZXMsIHBhc3NpbmcgZWFjaCBtb2R1bGUgb3B0aW9ucyAod2hlblxuIgorLy91c2FnZToJImxvYWRpbmcpLiBtb2Rwcm9iZSB1c2VzIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGRldGVybWluZSB3aGF0IG9wdGlvbihzKSB0b1xuIgorLy91c2FnZToJInBhc3MgZWFjaCBtb2R1bGUgaXQgbG9hZHMuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBzZWFyY2hlZCAoaW4gdGhpcyBvcmRlcik6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvbW9kcHJvYmUuY29uZiAoMi42IG9ubHkpXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvbW9kdWxlcy5jb25mXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvY29uZi5tb2R1bGVzIChkZXByZWNhdGVkKVxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIlRoZXkgYWxsIGhhdmUgdGhlIHNhbWUgc3ludGF4IChzZWUgYmVsb3cpLiBJZiBub25lIGlzIHByZXNlbnQsIGl0IGlzXG4iCisvL3VzYWdlOgkiX25vdF8gYW4gZXJyb3I7IGVhY2ggbG9hZGVkIG1vZHVsZSBpcyB0aGVuIGV4cGVjdGVkIHRvIGxvYWQgd2l0aG91dFxuIgorLy91c2FnZToJIm9wdGlvbnMuIE9uY2UgYSBmaWxlIGlzIGZvdW5kLCB0aGUgb3RoZXJzIGFyZSB0ZXN0ZWQgZm9yLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIi9ldGMvbW9kdWxlcy5jb25mIGVudHJ5IGZvcm1hdDpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIgIGFsaWFzIDxhbGlhc19uYW1lPiA8bW9kX25hbWU+XG4iCisvL3VzYWdlOgkiICAgIE1ha2VzIGl0IHBvc3NpYmxlIHRvIG1vZHByb2JlIGFsaWFzX25hbWUsIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBtb2R1bGUuXG4iCisvL3VzYWdlOgkiICAgIEl0IG1ha2VzIHNlbnNlIGlmIHlvdXIgbW9kX25hbWUgaXMgbG9uZywgb3IgeW91IHdhbnQgYSBtb3JlIHJlcHJlc2VudGF0aXZlXG4iCisvL3VzYWdlOgkiICAgIG5hbWUgZm9yIHRoYXQgbW9kdWxlIChlZy4gJ3Njc2knIGluIHBsYWNlIG9mICdhaGE3eHh4JykuXG4iCisvL3VzYWdlOgkiICAgIFRoaXMgbWFrZXMgaXQgYWxzbyBwb3NzaWJsZSB0byB1c2UgYSBkaWZmZXJlbnQgc2V0IG9mIG9wdGlvbnMgKGJlbG93KSBmb3JcbiIKKy8vdXNhZ2U6CSIgICAgdGhlIG1vZHVsZSBhbmQgdGhlIGFsaWFzLlxuIgorLy91c2FnZToJIiAgICBBIG1vZHVsZSBjYW4gYmUgYWxpYXNlZCBtb3JlIHRoYW4gb25jZS5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIgIG9wdGlvbnMgPG1vZF9uYW1lfGFsaWFzX25hbWU+IDxzeW1ib2w9dmFsdWUuLi4+XG4iCisvL3VzYWdlOgkiICAgIFdoZW4gbG9hZGluZyBtb2R1bGUgbW9kX25hbWUgKG9yIHRoZSBtb2R1bGUgYWxpYXNlZCBieSBhbGlhc19uYW1lKSwgcGFzc1xuIgorLy91c2FnZToJIiAgICB0aGUgXCJzeW1ib2w9dmFsdWVcIiBwYWlycyBhcyBvcHRpb24gdG8gdGhhdCBtb2R1bGUuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiU2FtcGxlIC9ldGMvbW9kdWxlcy5jb25mIGZpbGU6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiICBvcHRpb25zIHR1bGlwIGlycT0zXG4iCisvL3VzYWdlOgkiICBhbGlhcyB0dWxpcCB0dWxpcDJcbiIKKy8vdXNhZ2U6CSIgIG9wdGlvbnMgdHVsaXAyIGlycT00IGlvPTB4MzA4XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiT3RoZXIgZnVuY3Rpb25hbGl0eSBvZmZlcmVkIGJ5ICdjbGFzc2ljJyBtb2Rwcm9iZSBpcyBub3QgYXZhaWxhYmxlIGluXG4iCisvL3VzYWdlOgkidGhpcyBpbXBsZW1lbnRhdGlvbi5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJJZiBtb2R1bGUgb3B0aW9ucyBhcmUgcHJlc2VudCBib3RoIGluIHRoZSBjb25maWcgZmlsZSwgYW5kIG9uIHRoZSBjb21tYW5kIGxpbmUsXG4iCisvL3VzYWdlOgkidGhlbiB0aGUgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG1vZHVsZSBfYWZ0ZXJfXG4iCisvL3VzYWdlOgkidGhlIG9wdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGUuIFRoYXQgd2F5LCB5b3UgY2FuIGhhdmUgZGVmYXVsdHMgaW4gdGhlIGNvbmZpZ1xuIgorLy91c2FnZToJImZpbGUsIGFuZCBvdmVycmlkZSB0aGVtIGZvciBhIHNwZWNpZmljIHVzYWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS5cbiIKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiKHdpdGggdGhlIGFib3ZlIC9ldGMvbW9kdWxlcy5jb25mKTpcblxuIgorLy91c2FnZTogICAgICAgIiQgbW9kcHJvYmUgdHVsaXBcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aWxsIGxvYWQgdGhlIG1vZHVsZSAndHVsaXAnIHdpdGggZGVmYXVsdCBvcHRpb24gJ2lycT0zJ1xuXG4iCisvL3VzYWdlOiAgICAgICAiJCBtb2Rwcm9iZSB0dWxpcCBpcnE9NVxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBvcHRpb24gJ2lycT01JywgdGh1cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vZHByb2JlIHR1bGlwMlxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBkZWZhdWx0IG9wdGlvbnMgJ2lycT00IGlvPTB4MzA4JyxcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aGljaCBhcmUgdGhlIGRlZmF1bHQgZm9yIGFsaWFzICd0dWxpcDInXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vZHByb2JlIHR1bGlwMiBpcnE9OFxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBkZWZhdWx0IG9wdGlvbnMgJ2lycT00IGlvPTB4MzA4IGlycT04JyxcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aGljaCBhcmUgdGhlIGRlZmF1bHQgZm9yIGFsaWFzICd0dWxpcDInIG92ZXJyaWRkZW4gYnkgdGhlIG9wdGlvbiAnaXJxPTgnXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgICBmcm9tIHRoZSBjb21tYW5kIGxpbmVcblxuIgorLy91c2FnZTogICAgICAgIiQgbW9kcHJvYmUgdHVsaXAyIGlycT0yIGlvPTB4MjEwXG4iCisvL3VzYWdlOiAgICAgICAiICAgd2lsbCBsb2FkIHRoZSBtb2R1bGUgJ3R1bGlwJyB3aXRoIGRlZmF1bHQgb3B0aW9ucyAnaXJxPTQgaW89MHgzMDggaXJxPTQgaW89MHgyMTAnLFxuIgorLy91c2FnZTogICAgICAgIiAgIHdoaWNoIGFyZSB0aGUgZGVmYXVsdCBmb3IgYWxpYXMgJ3R1bGlwMicgb3ZlcnJpZGRlbiBieSB0aGUgb3B0aW9ucyAnaXJxPTIgaW89MHgyMTAnXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgICBmcm9tIHRoZSBjb21tYW5kIGxpbmVcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbW9kcHJvYmVfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstYWxycXZzRCIgSUZfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QoImIiKSAiXSIKKy8vdXNhZ2U6CSIgTU9EVUxFIFtzeW1ib2w9dmFsdWVdLi4uIgorLy91c2FnZTojZGVmaW5lIG1vZHByb2JlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCUxvYWQgbXVsdGlwbGUgTU9EVUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCAoTU9EVUxFIGlzIGEgcGF0dGVybikiCisvL3VzYWdlOiAgICAgIlxuCS1yCVJlbW92ZSBNT0RVTEUgKHN0YWNrcykgb3IgZG8gYXV0b2NsZWFuIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTG9nIHRvIHN5c2xvZyIKKy8vdXNhZ2U6ICAgICAiXG4JLUQJU2hvdyBkZXBlbmRlbmNpZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCgKKy8vdXNhZ2U6ICAgICAiXG4JLWIJQXBwbHkgYmxhY2tsaXN0IHRvIG1vZHVsZSBuYW1lcyB0b28iCisvL3VzYWdlOgkpCisvL3VzYWdlOiNlbmRpZiAvKiAhRU5BQkxFX01PRFBST0JFX1NNQUxMICovCisKKy8qIE5vdGUgdGhhdCB1c2FnZSB0ZXh0IGRvZXNuJ3QgZG9jdW1lbnQgdmFyaW91cyAyLjQgb3B0aW9ucworICogd2UgcHVsbCBpbiB0aHJvdWdoIElOU01PRF9PUFRTIGRlZmluZSAqLworI2RlZmluZSBNT0RQUk9CRV9PUFRTICAiYWxyRCIgSUZfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QoImIiKQorLyogLWEgYW5kIC1EIF9hcmVfIGluIGZhY3QgY29tcGF0aWJsZSAqLworI2RlZmluZSBNT0RQUk9CRV9DT01QTEVNRU5UQVJZICgicS12OnYtcTpsLS1hckQ6ci0tYWxEOmEtLWxyOkQtLXJsIikKKy8vI2RlZmluZSBNT0RQUk9CRV9PUFRTICAiYWNkOmxucnQ6QzoiIElGX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUKCJiIikKKy8vI2RlZmluZSBNT0RQUk9CRV9DT01QTEVNRU5UQVJZICJxLXY6di1xOmwtLWFjcjphLS1scjpyLS1hbCIKK2VudW0geworCU9QVF9JTlNFUlRfQUxMICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgMCksIC8qIGEgKi8KKwkvL09QVF9EVU1QX09OTFkgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IHgpLCAvKiBjICovCisJLy9PUFRfRElSTkFNRSAgICA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCB4KSwgLyogZCAqLworCU9QVF9MSVNUX09OTFkgICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgMSksIC8qIGwgKi8KKwkvL09QVF9TSE9XX09OTFkgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IHgpLCAvKiBuICovCisJT1BUX1JFTU9WRSAgICAgICA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCAyKSwgLyogciAqLworCS8vT1BUX1JFU1RSSUNUICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgeCksIC8qIHQgKi8KKwkvL09QVF9WRVJPTkxZICAgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IHgpLCAvKiBWICovCisJLy9PUFRfQ09ORklHRklMRSA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCB4KSwgLyogQyAqLworCU9QVF9TSE9XX0RFUFMgICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgMyksIC8qIEQgKi8KKwlPUFRfQkxBQ0tMSVNUICAgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNULAorfTsKKyNpZiBFTkFCTEVfTE9OR19PUFRTCitzdGF0aWMgY29uc3QgY2hhciBtb2Rwcm9iZV9sb25nb3B0c1tdIEFMSUdOMSA9CisJLyogbm9ib2R5IGFza2VkIGZvciBsb25nIG9wdHMgKHlldCkgKi8KKwkvLyAiYWxsXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICJhIgorCS8vICJsaXN0XDAiICAgICAgICAgTm9fYXJndW1lbnQgImwiCisJLy8gInJlbW92ZVwwIiAgICAgICBOb19hcmd1bWVudCAiciIKKwkvLyAicXVpZXRcMCIgICAgICAgIE5vX2FyZ3VtZW50ICJxIgorCS8vICJ2ZXJib3NlXDAiICAgICAgTm9fYXJndW1lbnQgInYiCisJLy8gInN5c2xvZ1wwIiAgICAgICBOb19hcmd1bWVudCAicyIKKwkvKiBtb2R1bGUtaW5pdC10b29scyAzLjExLjEgaGFzIG9ubHkgbG9uZyBvcHQgLS1zaG93LWRlcGVuZHMKKwkgKiBidXQgbm8gc2hvcnQgLUQsIHdlIHByb3ZpZGUgbG9uZyBvcHQgZm9yIHNjcmlwdHMgd2hpY2gKKwkgKiB3ZXJlIHdyaXR0ZW4gZm9yIDMuMTEuMTogKi8KKwkic2hvdy1kZXBlbmRzXDAiIE5vX2FyZ3VtZW50ICJEIgorCS8vIElGX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUKAorCS8vICJ1c2UtYmxhY2tsaXN0XDAiIE5vX2FyZ3VtZW50ICJiIgorCS8vICkKKwk7CisjZW5kaWYKKworI2RlZmluZSBNT0RVTEVfRkxBR19MT0FERUQgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNT0RVTEVfRkxBR19ORUVEX0RFUFMgICAgICAgICAgIDB4MDAwMgorLyogIndhcyBzZWVuIGluIG1vZHVsZXMuZGVwIjogKi8KKyNkZWZpbmUgTU9EVUxFX0ZMQUdfRk9VTkRfSU5fTU9EREVQICAgICAweDAwMDQKKyNkZWZpbmUgTU9EVUxFX0ZMQUdfQkxBQ0tMSVNURUQgICAgICAgICAweDAwMDgKKworc3RydWN0IG1vZHVsZV9lbnRyeSB7IC8qIEknbGwgY2FsbCBpdCBNRS4gKi8KKwl1bnNpZ25lZCBmbGFnczsKKwljaGFyICptb2RuYW1lOyAvKiBzdHJpcHBlZCBvZiAvcGF0aC8sIC5leHQgYW5kIHMvLS9fL2cgKi8KKwljb25zdCBjaGFyICpwcm9iZWRfbmFtZTsgLyogdmVyYmF0aW0gYXMgc2VlbiBvbiBjbWRsaW5lICovCisJY2hhciAqb3B0aW9uczsgLyogb3B0aW9ucyBmcm9tIGNvbmZpZyBmaWxlcyAqLworCWxsaXN0X3QgKnJlYWxuYW1lczsgLyogc3RyaW5ncy4gaWYgdGhpcyBtb2R1bGUgaXMgYW4gYWxpYXMsICovCisJLyogcmVhbCBtb2R1bGUgbmFtZSBpcyBvbmUgb2YgdGhlc2UuICovCisvL0NhbiB0aGVyZSByZWFsbHkgYmUgbW9yZSB0aGFuIG9uZT8gRXhhbXBsZSBmcm9tIHJlYWwga2VybmVsPworCWxsaXN0X3QgKmRlcHM7IC8qIHN0cmluZ3MuIG1vZHVsZXMgd2UgZGVwZW5kIG9uICovCit9OworCisjZGVmaW5lIERCX0hBU0hfU0laRSAyNTYKKworc3RydWN0IGdsb2JhbHMgeworCWxsaXN0X3QgKnByb2JlczsgLyogTUVzIG9mIG1vZHVsZShzKSByZXF1ZXN0ZWQgb24gY21kbGluZSAqLworCWNoYXIgKmNtZGxpbmVfbW9wdHM7IC8qIG1vZHVsZSBvcHRpb25zIGZyb20gY21kbGluZSAqLworCWludCBudW1fdW5yZXNvbHZlZF9kZXBzOworCS8qIGJvb2wuICJEaWQgd2UgaGF2ZSAnc3ltYm9sOkZPTycgcmVxdWVzdGVkIG9uIGNtZGxpbmU/IiAqLworCXNtYWxsaW50IG5lZWRfc3ltYm9sczsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJbGxpc3RfdCAqZGJbREJfSEFTSF9TSVpFXTsgLyogTUVzIG9mIGFsbCBtb2R1bGVzIGV2ZXIgc2VlbiAoY2FjaGluZyBmb3Igc3BlZWQpICovCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKyAgICAgICAgU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIGludCByZWFkX2NvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKworc3RhdGljIGNoYXIgKmdhdGhlcl9vcHRpb25zX3N0cihjaGFyICpvcHRzLCBjb25zdCBjaGFyICphcHBlbmQpCit7CisJLyogU3BlZWQtb3B0aW1pemVkLiBXZSBjYWxsIGdhdGhlcl9vcHRpb25zX3N0ciBtYW55IHRpbWVzLiAqLworCWlmIChhcHBlbmQpIHsKKwkJaWYgKG9wdHMgPT0gTlVMTCkgeworCQkJb3B0cyA9IHhzdHJkdXAoYXBwZW5kKTsKKwkJfSBlbHNlIHsKKwkJCWludCBvcHRsZW4gPSBzdHJsZW4ob3B0cyk7CisJCQlvcHRzID0geHJlYWxsb2Mob3B0cywgb3B0bGVuICsgc3RybGVuKGFwcGVuZCkgKyAyKTsKKwkJCXNwcmludGYob3B0cyArIG9wdGxlbiwgIiAlcyIsIGFwcGVuZCk7CisJCX0KKwl9CisJcmV0dXJuIG9wdHM7Cit9CisKKy8qIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBjYWxsZWQgbWFueSB0aW1lcywgb3B0aW1pemluZyBmb3Igc3BlZWQuCisgKiBVc2VycyByZXBvcnRlZCBtaW51dGUtbG9uZyBkZWxheXMgd2hlbiB0aGV5IHJ1bm4gaXB0YWJsZXMgcmVwZWF0ZWRseQorICogKGlwdGFibGVzIHVzZSBtb2Rwcm9iZSB0byBpbnN0YWxsIG5lZWRlZCBrZXJuZWwgbW9kdWxlcykuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlX2VudHJ5ICpoZWxwZXJfZ2V0X21vZHVsZShjb25zdCBjaGFyICptb2R1bGUsIGludCBjcmVhdGUpCit7CisJY2hhciBtb2RuYW1lW01PRFVMRV9OQU1FX0xFTl07CisJc3RydWN0IG1vZHVsZV9lbnRyeSAqZTsKKwlsbGlzdF90ICpsOworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgaGFzaDsKKworCWZpbGVuYW1lMm1vZG5hbWUobW9kdWxlLCBtb2RuYW1lKTsKKworCWhhc2ggPSAwOworCWZvciAoaSA9IDA7IG1vZG5hbWVbaV07IGkrKykKKwkJaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgbW9kbmFtZVtpXTsKKwloYXNoICU9IERCX0hBU0hfU0laRTsKKworCWZvciAobCA9IEcuZGJbaGFzaF07IGw7IGwgPSBsLT5saW5rKSB7CisJCWUgPSAoc3RydWN0IG1vZHVsZV9lbnRyeSAqKSBsLT5kYXRhOworCQlpZiAoc3RyY21wKGUtPm1vZG5hbWUsIG1vZG5hbWUpID09IDApCisJCQlyZXR1cm4gZTsKKwl9CisJaWYgKCFjcmVhdGUpCisJCXJldHVybiBOVUxMOworCisJZSA9IHh6YWxsb2Moc2l6ZW9mKCplKSk7CisJZS0+bW9kbmFtZSA9IHhzdHJkdXAobW9kbmFtZSk7CisJbGxpc3RfYWRkX3RvKCZHLmRiW2hhc2hdLCBlKTsKKworCXJldHVybiBlOworfQorc3RhdGljIEFMV0FZU19JTkxJTkUgc3RydWN0IG1vZHVsZV9lbnRyeSAqZ2V0X29yX2FkZF9tb2RlbnRyeShjb25zdCBjaGFyICptb2R1bGUpCit7CisJcmV0dXJuIGhlbHBlcl9nZXRfbW9kdWxlKG1vZHVsZSwgMSk7Cit9CitzdGF0aWMgQUxXQVlTX0lOTElORSBzdHJ1Y3QgbW9kdWxlX2VudHJ5ICpnZXRfbW9kZW50cnkoY29uc3QgY2hhciAqbW9kdWxlKQoreworCXJldHVybiBoZWxwZXJfZ2V0X21vZHVsZShtb2R1bGUsIDApOworfQorCitzdGF0aWMgdm9pZCBhZGRfcHJvYmUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptOworCisJbSA9IGdldF9vcl9hZGRfbW9kZW50cnkobmFtZSk7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIChPUFRfUkVNT1ZFIHwgT1BUX1NIT1dfREVQUykpCisJICYmIChtLT5mbGFncyAmIE1PRFVMRV9GTEFHX0xPQURFRCkKKwkpIHsKKwkJREJHKCJza2lwcGluZyAlcywgaXQgaXMgYWxyZWFkeSBsb2FkZWQiLCBuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCURCRygicXVldWluZyAlcyIsIG5hbWUpOworCW0tPnByb2JlZF9uYW1lID0gbmFtZTsKKwltLT5mbGFncyB8PSBNT0RVTEVfRkxBR19ORUVEX0RFUFM7CisJbGxpc3RfYWRkX3RvX2VuZCgmRy5wcm9iZXMsIG0pOworCUcubnVtX3VucmVzb2x2ZWRfZGVwcysrOworCWlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTCisJICYmIHN0cm5jbXAobS0+bW9kbmFtZSwgInN5bWJvbDoiLCA3KSA9PSAwCisJKSB7CisJCUcubmVlZF9zeW1ib2xzID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGNvbmZpZ19maWxlX2FjdGlvbihjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCQkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQkJCQl2b2lkICp1c2VyZGF0YSBVTlVTRURfUEFSQU0sCisJCQkJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqdG9rZW5zWzNdOworCXBhcnNlcl90ICpwOworCXN0cnVjdCBtb2R1bGVfZW50cnkgKm07CisJaW50IHJjID0gVFJVRTsKKworCWlmIChiYl9iYXNlbmFtZShmaWxlbmFtZSlbMF0gPT0gJy4nKQorCQlnb3RvIGVycm9yOworCisJcCA9IGNvbmZpZ19vcGVuMihmaWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCWlmIChwID09IE5VTEwpIHsKKwkJcmMgPSBGQUxTRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl3aGlsZSAoY29uZmlnX3JlYWQocCwgdG9rZW5zLCAzLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKy8vVXNlIGluZGV4X2luX3N0cmluZ3M/CisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiYWxpYXMiKSA9PSAwKSB7CisJCQkvKiBhbGlhcyA8d2lsZGNhcmQ+IDxtb2R1bGVuYW1lPiAqLworCQkJbGxpc3RfdCAqbDsKKwkJCWNoYXIgd2lsZGNhcmRbTU9EVUxFX05BTUVfTEVOXTsKKwkJCWNoYXIgKnJtb2Q7CisKKwkJCWlmICh0b2tlbnNbMl0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWZpbGVuYW1lMm1vZG5hbWUodG9rZW5zWzFdLCB3aWxkY2FyZCk7CisKKwkJCWZvciAobCA9IEcucHJvYmVzOyBsOyBsID0gbC0+bGluaykgeworCQkJCW0gPSAoc3RydWN0IG1vZHVsZV9lbnRyeSAqKSBsLT5kYXRhOworCQkJCWlmIChmbm1hdGNoKHdpbGRjYXJkLCBtLT5tb2RuYW1lLCAwKSAhPSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlybW9kID0gZmlsZW5hbWUybW9kbmFtZSh0b2tlbnNbMl0sIE5VTEwpOworCQkJCWxsaXN0X2FkZF90bygmbS0+cmVhbG5hbWVzLCBybW9kKTsKKworCQkJCWlmIChtLT5mbGFncyAmIE1PRFVMRV9GTEFHX05FRURfREVQUykgeworCQkJCQltLT5mbGFncyAmPSB+TU9EVUxFX0ZMQUdfTkVFRF9ERVBTOworCQkJCQlHLm51bV91bnJlc29sdmVkX2RlcHMtLTsKKwkJCQl9CisKKwkJCQltID0gZ2V0X29yX2FkZF9tb2RlbnRyeShybW9kKTsKKwkJCQlpZiAoIShtLT5mbGFncyAmIE1PRFVMRV9GTEFHX05FRURfREVQUykpIHsKKwkJCQkJbS0+ZmxhZ3MgfD0gTU9EVUxFX0ZMQUdfTkVFRF9ERVBTOworCQkJCQlHLm51bV91bnJlc29sdmVkX2RlcHMrKzsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKHRva2Vuc1swXSwgIm9wdGlvbnMiKSA9PSAwKSB7CisJCQkvKiBvcHRpb25zIDxtb2R1bGVuYW1lPiA8b3B0aW9uLi4uPiAqLworCQkJaWYgKHRva2Vuc1syXSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJbSA9IGdldF9vcl9hZGRfbW9kZW50cnkodG9rZW5zWzFdKTsKKwkJCW0tPm9wdGlvbnMgPSBnYXRoZXJfb3B0aW9uc19zdHIobS0+b3B0aW9ucywgdG9rZW5zWzJdKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAodG9rZW5zWzBdLCAiaW5jbHVkZSIpID09IDApIHsKKwkJCS8qIGluY2x1ZGUgPGZpbGVuYW1lPiAqLworCQkJcmVhZF9jb25maWcodG9rZW5zWzFdKTsKKwkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QKKwkJICYmIHN0cmNtcCh0b2tlbnNbMF0sICJibGFja2xpc3QiKSA9PSAwCisJCSkgeworCQkJLyogYmxhY2tsaXN0IDxtb2R1bGVuYW1lPiAqLworCQkJZ2V0X29yX2FkZF9tb2RlbnRyeSh0b2tlbnNbMV0pLT5mbGFncyB8PSBNT0RVTEVfRkxBR19CTEFDS0xJU1RFRDsKKwkJfQorCX0KKwljb25maWdfY2xvc2UocCk7CisgZXJyb3I6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJlYWRfY29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHJlY3Vyc2l2ZV9hY3Rpb24ocGF0aCwgQUNUSU9OX1JFQ1VSU0UgfCBBQ1RJT05fUVVJRVQsCisJCQkJY29uZmlnX2ZpbGVfYWN0aW9uLCBOVUxMLCBOVUxMLCAxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmh1bWFubHlfcmVhZGFibGVfbmFtZShzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptKQoreworCS8qIHByb2JlZF9uYW1lIG1heSBiZSBOVUxMLiBtb2RuYW1lIGFsd2F5cyBleGlzdHMuICovCisJcmV0dXJuIG0tPnByb2JlZF9uYW1lID8gbS0+cHJvYmVkX25hbWUgOiBtLT5tb2RuYW1lOworfQorCitzdGF0aWMgY2hhciAqcGFyc2VfYW5kX2FkZF9rY21kbGluZV9tb2R1bGVfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBjb25zdCBjaGFyICptb2R1bGVuYW1lKQoreworCWNoYXIgKmtjbWRsaW5lX2J1ZjsKKwljaGFyICprY21kbGluZTsKKwljaGFyICprcHRyOworCWludCBsZW47CisKKwlrY21kbGluZV9idWYgPSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZSgiL3Byb2MvY21kbGluZSIsIE5VTEwpOworCWlmICgha2NtZGxpbmVfYnVmKQorCQlyZXR1cm4gb3B0aW9uczsKKworCWtjbWRsaW5lID0ga2NtZGxpbmVfYnVmOworCWxlbiA9IHN0cmxlbihtb2R1bGVuYW1lKTsKKwl3aGlsZSAoKGtwdHIgPSBzdHJzZXAoJmtjbWRsaW5lLCAiXG5cdCAiKSkgIT0gTlVMTCkgeworCQlpZiAoc3RybmNtcChtb2R1bGVuYW1lLCBrcHRyLCBsZW4pICE9IDApCisJCQljb250aW51ZTsKKwkJa3B0ciArPSBsZW47CisJCWlmICgqa3B0ciAhPSAnLicpCisJCQljb250aW51ZTsKKwkJLyogSXQgaXMgIm1vZHVsZW5hbWUueHh4eCIgKi8KKwkJa3B0cisrOworCQlpZiAoc3RyY2hyKGtwdHIsICc9JykgIT0gTlVMTCkgeworCQkJLyogSXQgaXMgIm1vZHVsZW5hbWUub3B0PVt2YWxdIiAqLworCQkJb3B0aW9ucyA9IGdhdGhlcl9vcHRpb25zX3N0cihvcHRpb25zLCBrcHRyKTsKKwkJfQorCX0KKwlmcmVlKGtjbWRsaW5lX2J1Zik7CisKKwlyZXR1cm4gb3B0aW9uczsKK30KKworLyogUmV0dXJuOiBzaW1pbGFyIHRvIGJiX2luaXRfbW9kdWxlOgorICogMCBvbiBzdWNjZXNzLAorICogLWVycm5vIG9uIG9wZW4vcmVhZCBlcnJvciwKKyAqIGVycm5vIG9uIGluaXRfbW9kdWxlKCkgZXJyb3IKKyAqLworLyogTkI6IElOU01PRF9PUFRfU0lMRU5UIGJpdCBzdXBwcmVzc2VzIE9OTFkgbm9uLWV4aXN0ZW50IG1vZHVsZXMsCisgKiBub3QgZGVsZXRlZCBvbmVzICh0aG9zZSBhcmUgc3RpbGwgbGlzdGVkIGluIG1vZHVsZXMuZGVwKS4KKyAqIG1vZHVsZS1pbml0LXRvb2xzIHZlcnNpb24gMy40OgorICogIyBtb2Rwcm9iZSBib2d1cworICogRkFUQUw6IE1vZHVsZSBib2d1cyBub3QgZm91bmQuIFtleGl0Y29kZSAxXQorICogIyBtb2Rwcm9iZSAtcSBib2d1cyAgICAgICAgICAgIFtzaWxlbnQsIGV4aXRjb2RlIHN0aWxsIDFdCisgKiBidXQ6CisgKiAjIHJtIGtlcm5lbC9kcml2ZXJzL25ldC9kdW1teS5rbworICogIyBtb2Rwcm9iZSAtcSBkdW1teQorICogRkFUQUw6IENvdWxkIG5vdCBvcGVuICcvbGliL21vZHVsZXMveHh4L2tlcm5lbC9kcml2ZXJzL25ldC9kdW1teS5rbyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAqIFtleGl0Y29kZSAxXQorICovCitzdGF0aWMgaW50IGRvX21vZHByb2JlKHN0cnVjdCBtb2R1bGVfZW50cnkgKm0pCit7CisJaW50IHJjLCBmaXJzdDsKKworCWlmICghKG0tPmZsYWdzICYgTU9EVUxFX0ZMQUdfRk9VTkRfSU5fTU9EREVQKSkgeworCQlpZiAoIShvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9TSUxFTlQpKQorCQkJYmJfZXJyb3JfbXNnKCJtb2R1bGUgJXMgbm90IGZvdW5kIGluIG1vZHVsZXMuZGVwIiwKKwkJCQlodW1hbmx5X3JlYWRhYmxlX25hbWUobSkpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJREJHKCJkb19tb2Rwcm9iJ2luZyAlcyIsIG0tPm1vZG5hbWUpOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9SRU1PVkUpKQorCQltLT5kZXBzID0gbGxpc3RfcmV2KG0tPmRlcHMpOworCisJaWYgKDApIHsKKwkJbGxpc3RfdCAqbDsKKwkJZm9yIChsID0gbS0+ZGVwczsgbDsgbCA9IGwtPmxpbmspCisJCQlEQkcoImRlcDogJXMiLCBsLT5kYXRhKTsKKwl9CisKKwlmaXJzdCA9IDE7CisJcmMgPSAwOworCXdoaWxlIChtLT5kZXBzKSB7CisJCXN0cnVjdCBtb2R1bGVfZW50cnkgKm0yOworCQljaGFyICpmbiwgKm9wdGlvbnM7CisKKwkJcmMgPSAwOworCQlmbiA9IGxsaXN0X3BvcCgmbS0+ZGVwcyk7IC8qIHdlIGxlYWsgaXQgKi8KKwkJbTIgPSBnZXRfb3JfYWRkX21vZGVudHJ5KGZuKTsKKworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9SRU1PVkUpIHsKKwkJCS8qIG1vZHByb2JlIC1yICovCisJCQlpZiAobTItPmZsYWdzICYgTU9EVUxFX0ZMQUdfTE9BREVEKSB7CisJCQkJcmMgPSBiYl9kZWxldGVfbW9kdWxlKG0yLT5tb2RuYW1lLCBPX0VYQ0wpOworCQkJCWlmIChyYykgeworCQkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgdW5sb2FkIG1vZHVsZSAlczogJXMiLAorCQkJCQkJCWh1bWFubHlfcmVhZGFibGVfbmFtZShtMiksCisJCQkJCQkJbW9kZXJyb3IocmMpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbTItPmZsYWdzICY9IH5NT0RVTEVfRkxBR19MT0FERUQ7CisJCQkJfQorCQkJfQorCQkJLyogZG8gbm90IGVycm9yIG91dCBpZiAqZGVwcyogZmFpbCB0byB1bmxvYWQgKi8KKwkJCWZpcnN0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJb3B0aW9ucyA9IG0yLT5vcHRpb25zOworCQltMi0+b3B0aW9ucyA9IE5VTEw7CisJCW9wdGlvbnMgPSBwYXJzZV9hbmRfYWRkX2tjbWRsaW5lX21vZHVsZV9vcHRpb25zKG9wdGlvbnMsIG0yLT5tb2RuYW1lKTsKKwkJaWYgKG0gPT0gbTIpCisJCQlvcHRpb25zID0gZ2F0aGVyX29wdGlvbnNfc3RyKG9wdGlvbnMsIEcuY21kbGluZV9tb3B0cyk7CisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0hPV19ERVBTKSB7CisJCQlwcmludGYob3B0aW9ucyA/ICJpbnNtb2QgJXMvJXMvJXMgJXNcbiIKKwkJCQkJOiAiaW5zbW9kICVzLyVzLyVzXG4iLAorCQkJCUNPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSLCBHLnV0cy5yZWxlYXNlLCBmbiwKKwkJCQlvcHRpb25zKTsKKwkJCWZyZWUob3B0aW9ucyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtMi0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19MT0FERUQpIHsKKwkJCURCRygiJXMgaXMgYWxyZWFkeSBsb2FkZWQsIHNraXBwaW5nIiwgZm4pOworCQkJZnJlZShvcHRpb25zKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmMgPSBiYl9pbml0X21vZHVsZShmbiwgb3B0aW9ucyk7CisJCURCRygibG9hZGVkICVzICclcycsIHJjOiVkIiwgZm4sIG9wdGlvbnMsIHJjKTsKKwkJaWYgKHJjID09IEVFWElTVCkKKwkJCXJjID0gMDsKKwkJZnJlZShvcHRpb25zKTsKKwkJaWYgKHJjKSB7CisJCQliYl9lcnJvcl9tc2coImNhbid0IGxvYWQgbW9kdWxlICVzICglcyk6ICVzIiwKKwkJCQlodW1hbmx5X3JlYWRhYmxlX25hbWUobTIpLAorCQkJCWZuLAorCQkJCW1vZGVycm9yKHJjKQorCQkJKTsKKwkJCWJyZWFrOworCQl9CisJCW0yLT5mbGFncyB8PSBNT0RVTEVfRkxBR19MT0FERUQ7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBsb2FkX21vZHVsZXNfZGVwKHZvaWQpCit7CisJc3RydWN0IG1vZHVsZV9lbnRyeSAqbTsKKwljaGFyICpjb2xvbiwgKnRva2Vuc1syXTsKKwlwYXJzZXJfdCAqcDsKKworCS8qIE1vZHByb2JlIGRvZXMgbm90IHdvcmsgYXQgYWxsIHdpdGhvdXQgbW9kdWxlcy5kZXAsCisJICogZXZlbiBpZiB0aGUgZnVsbCBtb2R1bGUgbmFtZSBpcyBnaXZlbi4gUmV0dXJuaW5nIGVycm9yIGhlcmUKKwkgKiB3YXMgbWFraW5nIHVzIGxhdGVyIGNvbmZ1c2UgdXNlciB3aXRoIHRoaXMgbWVzc2FnZToKKwkgKiAibW9kdWxlIC9mdWxsL3BhdGgvdG8vZXhpc3RpbmcvZmlsZS9tb2R1bGUua28gbm90IGZvdW5kIi4KKwkgKiBJdCdzIGJldHRlciB0byBkaWUgaW1tZWRpYXRlbHksIHdpdGggZ29vZCBtZXNzYWdlLgorCSAqIHhmb3Blbl9mb3JfcmVhZCBwcm92aWRlcyB0aGF0LiAqLworCXAgPSBjb25maWdfb3BlbjIoQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEUsIHhmb3Blbl9mb3JfcmVhZCk7CisKKwl3aGlsZSAoRy5udW1fdW5yZXNvbHZlZF9kZXBzCisJICYmIGNvbmZpZ19yZWFkKHAsIHRva2VucywgMiwgMSwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpCisJKSB7CisJCWNvbG9uID0gbGFzdF9jaGFyX2lzKHRva2Vuc1swXSwgJzonKTsKKwkJaWYgKGNvbG9uID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJKmNvbG9uID0gMDsKKworCQltID0gZ2V0X21vZGVudHJ5KHRva2Vuc1swXSk7CisJCWlmIChtID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKiBPcHRpbWl6YXRpb24uLi4gKi8KKwkJaWYgKChtLT5mbGFncyAmIE1PRFVMRV9GTEFHX0xPQURFRCkKKwkJICYmICEob3B0aW9uX21hc2szMiAmIChPUFRfUkVNT1ZFIHwgT1BUX1NIT1dfREVQUykpCisJCSkgeworCQkJREJHKCJza2lwIGRlcHMgb2YgJXMsIGl0J3MgYWxyZWFkeSBsb2FkZWQiLCB0b2tlbnNbMF0pOworCQkJY29udGludWU7CisJCX0KKworCQltLT5mbGFncyB8PSBNT0RVTEVfRkxBR19GT1VORF9JTl9NT0RERVA7CisJCWlmICgobS0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19ORUVEX0RFUFMpICYmIChtLT5kZXBzID09IE5VTEwpKSB7CisJCQlHLm51bV91bnJlc29sdmVkX2RlcHMtLTsKKwkJCWxsaXN0X2FkZF90bygmbS0+ZGVwcywgeHN0cmR1cCh0b2tlbnNbMF0pKTsKKwkJCWlmICh0b2tlbnNbMV0pCisJCQkJc3RyaW5nX3RvX2xsaXN0KHRva2Vuc1sxXSwgJm0tPmRlcHMsICIgXHQiKTsKKwkJfSBlbHNlCisJCQlEQkcoInNraXBwaW5nIGRlcCBsaW5lIik7CisJfQorCWNvbmZpZ19jbG9zZShwKTsKK30KKworaW50IG1vZHByb2JlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtb2Rwcm9iZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCXVuc2lnbmVkIG9wdDsKKwlzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptZTsKKworCUlOSVRfRygpOworCisJSUZfTE9OR19PUFRTKGFwcGxldF9sb25nX29wdGlvbnMgPSBtb2Rwcm9iZV9sb25nb3B0czspCisJb3B0X2NvbXBsZW1lbnRhcnkgPSBNT0RQUk9CRV9DT01QTEVNRU5UQVJZOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIElOU01PRF9PUFRTIE1PRFBST0JFX09QVFMgSU5TTU9EX0FSR1MpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogR290byBtb2R1bGVzIGxvY2F0aW9uICovCisJeGNoZGlyKENPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSKTsKKwl1bmFtZSgmRy51dHMpOworCXhjaGRpcihHLnV0cy5yZWxlYXNlKTsKKworCWlmIChvcHQgJiBPUFRfTElTVF9PTkxZKSB7CisJCWludCBpOworCQljaGFyIG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwkJY2hhciAqY29sb24sICp0b2tlbnNbMl07CisJCXBhcnNlcl90ICpwID0gY29uZmlnX29wZW4yKENPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFLCB4Zm9wZW5fZm9yX3JlYWQpOworCisJCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykKKwkJCXJlcGxhY2UoYXJndltpXSwgJy0nLCAnXycpOworCisJCXdoaWxlIChjb25maWdfcmVhZChwLCB0b2tlbnMsIDIsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQkJY29sb24gPSBsYXN0X2NoYXJfaXModG9rZW5zWzBdLCAnOicpOworCQkJaWYgKCFjb2xvbikKKwkJCQljb250aW51ZTsKKwkJCSpjb2xvbiA9ICdcMCc7CisJCQlmaWxlbmFtZTJtb2RuYW1lKHRva2Vuc1swXSwgbmFtZSk7CisJCQlpZiAoIWFyZ3ZbMF0pCisJCQkJcHV0cyh0b2tlbnNbMF0pOworCQkJZWxzZSB7CisJCQkJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKSB7CisJCQkJCWlmIChmbm1hdGNoKGFyZ3ZbaV0sIG5hbWUsIDApID09IDApIHsKKwkJCQkJCXB1dHModG9rZW5zWzBdKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIFllcywgZm9yIHNvbWUgcmVhc29uIC1sIGlnbm9yZXMgLXMuLi4gKi8KKwlpZiAob3B0ICYgSU5TTU9EX09QVF9TWVNMT0cpCisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKworCWlmICghYXJndlswXSkgeworCQlpZiAob3B0ICYgT1BUX1JFTU9WRSkgeworCQkJLyogIm1vZHByb2JlIC1yIiAody9vIHBhcmFtcykuCisJCQkgKiAiSWYgbmFtZSBpcyBOVUxMLCBhbGwgdW51c2VkIG1vZHVsZXMgbWFya2VkCisJCQkgKiBhdXRvY2xlYW4gd2lsbCBiZSByZW1vdmVkIi4KKwkJCSAqLworCQkJaWYgKGJiX2RlbGV0ZV9tb2R1bGUoTlVMTCwgT19OT05CTE9DSyB8IE9fRVhDTCkgIT0gMCkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInJtbW9kIik7CisJCX0KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBSZXRyaWV2ZSBtb2R1bGUgbmFtZXMgb2YgYWxyZWFkeSBsb2FkZWQgbW9kdWxlcyAqLworCXsKKwkJY2hhciAqczsKKwkJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuMigiL3Byb2MvbW9kdWxlcyIsIGZvcGVuX2Zvcl9yZWFkKTsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgJnMsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMICYgflBBUlNFX0dSRUVEWSkpCisJCQlnZXRfb3JfYWRkX21vZGVudHJ5KHMpLT5mbGFncyB8PSBNT0RVTEVfRkxBR19MT0FERUQ7CisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX0KKworCWlmIChvcHQgJiAoT1BUX0lOU0VSVF9BTEwgfCBPUFRfUkVNT1ZFKSkgeworCQkvKiBFYWNoIGFyZ3VtZW50IGlzIGEgbW9kdWxlIG5hbWUgKi8KKwkJZG8geworCQkJREJHKCJhZGRpbmcgbW9kdWxlICVzIiwgKmFyZ3YpOworCQkJYWRkX3Byb2JlKCphcmd2KyspOworCQl9IHdoaWxlICgqYXJndik7CisJfSBlbHNlIHsKKwkJLyogRmlyc3QgYXJndW1lbnQgaXMgbW9kdWxlIG5hbWUsIHJlc3QgYXJlIHBhcmFtZXRlcnMgKi8KKwkJREJHKCJwcm9iaW5nIGp1c3QgbW9kdWxlICVzIiwgKmFyZ3YpOworCQlhZGRfcHJvYmUoYXJndlswXSk7CisJCUcuY21kbGluZV9tb3B0cyA9IHBhcnNlX2NtZGxpbmVfbW9kdWxlX29wdGlvbnMoYXJndiwgLypxdW90ZV9zcGFjZXM6Ki8gMSk7CisJfQorCisJLyogSGFwcGVucyBpZiBhbGwgcmVxdWVzdGVkIG1vZHVsZXMgYXJlIGFscmVhZHkgbG9hZGVkICovCisJaWYgKEcucHJvYmVzID09IE5VTEwpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKwlyZWFkX2NvbmZpZygiL2V0Yy9tb2Rwcm9iZS5jb25mIik7CisJcmVhZF9jb25maWcoIi9ldGMvbW9kcHJvYmUuZCIpOworCWlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTICYmIEcubmVlZF9zeW1ib2xzKQorCQlyZWFkX2NvbmZpZygibW9kdWxlcy5zeW1ib2xzIik7CisJbG9hZF9tb2R1bGVzX2RlcCgpOworCWlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19BTElBUyAmJiBHLm51bV91bnJlc29sdmVkX2RlcHMpIHsKKwkJcmVhZF9jb25maWcoIm1vZHVsZXMuYWxpYXMiKTsKKwkJbG9hZF9tb2R1bGVzX2RlcCgpOworCX0KKworCXJjID0gMDsKKwl3aGlsZSAoKG1lID0gbGxpc3RfcG9wKCZHLnByb2JlcykpICE9IE5VTEwpIHsKKwkJaWYgKG1lLT5yZWFsbmFtZXMgPT0gTlVMTCkgeworCQkJREJHKCJwcm9iaW5nIGJ5IG1vZHVsZSBuYW1lIik7CisJCQkvKiBUaGlzIGlzIG5vdCBhbiBhbGlhcy4gTGl0ZXJhbCBuYW1lcyBhcmUgYmxhY2tsaXN0ZWQKKwkJCSAqIG9ubHkgaWYgJy1iJyBpcyBnaXZlbi4KKwkJCSAqLworCQkJaWYgKCEob3B0ICYgT1BUX0JMQUNLTElTVCkKKwkJCSB8fCAhKG1lLT5mbGFncyAmIE1PRFVMRV9GTEFHX0JMQUNLTElTVEVEKQorCQkJKSB7CisJCQkJcmMgfD0gZG9fbW9kcHJvYmUobWUpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBQcm9iZSBhbGwgcmVhbCBuYW1lcyBmb3IgdGhlIGFsaWFzICovCisJCWRvIHsKKwkJCWNoYXIgKnJlYWxuYW1lID0gbGxpc3RfcG9wKCZtZS0+cmVhbG5hbWVzKTsKKwkJCXN0cnVjdCBtb2R1bGVfZW50cnkgKm0yOworCisJCQlEQkcoInByb2JpbmcgYWxpYXMgJXMgYnkgcmVhbG5hbWUgJXMiLCBtZS0+bW9kbmFtZSwgcmVhbG5hbWUpOworCQkJbTIgPSBnZXRfb3JfYWRkX21vZGVudHJ5KHJlYWxuYW1lKTsKKwkJCWlmICghKG0yLT5mbGFncyAmIE1PRFVMRV9GTEFHX0JMQUNLTElTVEVEKQorCQkJICYmICghKG0yLT5mbGFncyAmIE1PRFVMRV9GTEFHX0xPQURFRCkKKwkJCSAgICB8fCAob3B0ICYgKE9QVF9SRU1PVkUgfCBPUFRfU0hPV19ERVBTKSkpCisJCQkpIHsKKy8vVE9ETzogd2UgY2FuIHBhc3MgIm1lIiBhcyAybmQgcGFyYW0gdG8gZG9fbW9kcHJvYmUsCisvL2FuZCBtYWtlIGRvX21vZHByb2JlIGVtaXQgbW9yZSBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2VzCisvL3dpdGggYWxpYXMgbmFtZSBpbmNsdWRlZCwgbm90IGp1c3QgbW9kdWxlIG5hbWUgYWxpYXMgcmVzb2x2ZXMgdG8uCisJCQkJcmMgfD0gZG9fbW9kcHJvYmUobTIpOworCQkJfQorCQkJZnJlZShyZWFsbmFtZSk7CisJCX0gd2hpbGUgKG1lLT5yZWFsbmFtZXMgIT0gTlVMTCk7CisJfQorCisJcmV0dXJuIChyYyAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL21vZHV0aWxzLTI0LmMgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9tb2R1dGlscy0yNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzU0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9tb2R1dGlscy0yNC5jCkBAIC0wLDAgKzEsMzk0OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBpbnNtb2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBUaGlzIHZlcnNpb24gb2YgaW5zbW9kIHN1cHBvcnRzIEFSTSwgQ1JJUywgSDgvMzAwLCB4ODYsIGlhNjQsIHg4Nl82NCwKKyAqIG02OGssIE1JUFMsIFBvd2VyUEMsIFMzOTAsIFNIMy80LzUsIFNwYXJjLCB2ODUwZSwgYW5kIHg4Nl82NC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBhbmQgUm9uIEFsZGVyIDxhbGRlckBsaW5lby5jb20+CisgKgorICogUm9kbmV5IFJhZGZvcmQgPHJyYWRmb3JkQG1pbmRzcHJpbmcuY29tPiAxNy1BdWctMjAwNC4KKyAqICAgQWRkZWQgeDg2XzY0IHN1cHBvcnQuCisgKgorICogTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5vcmc+IGFkZGVkIE5FQyBWODUwRSBzdXBwb3J0LgorICoKKyAqIE1vZGlmaWVkIGJ5IEJyeWFuIFJpdHRtZXllciA8YnJ5YW5AaXhpYWNvbS5jb20+IHRvIHN1cHBvcnQgU0g0CisgKiBhbmQgKHRoZW9yZXRpY2FsbHkpIFNIMy4gSSBoYXZlIG9ubHkgdGVzdGVkIFNINCBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCisgKgorICogTW9kaWZpZWQgYnkgQWxjb3ZlLCBKdWxpZW4gR2F1bG1pbiA8anVsaWVuLmdhdWxtaW5AYWxjb3ZlLmZyPiBhbmQKKyAqIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYWxjb3ZlLmZyPiB0byBzdXBwb3J0IEFSTTdURE1JLiAgT25seQorICogdmVyeSBtaW5vciBjaGFuZ2VzIHJlcXVpcmVkIHRvIGFsc28gd29yayB3aXRoIFN0cm9uZ0FybSBhbmQgcHJlc3VtYWJseQorICogYWxsIEFSTSBiYXNlZCBzeXN0ZW1zLgorICoKKyAqIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4gMTktTWF5LTIwMDQuCisgKiAgIGFkZGVkIFJlbmVzYXMgSDgvMzAwIHN1cHBvcnQuCisgKgorICogUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4gMDgtQXVnLTIwMDMuCisgKiAgIEludGVncmF0ZWQgc3VwcG9ydCBmb3Igc2g2NCAoU0gtNSksIGZyb20gcHJlbGltaW5hcnkgbW9kdXRpbHMKKyAqICAgcGF0Y2hlcyBmcm9tIEJlbmVkaWN0IEdhc3RlciA8YmVuZWRpY3QuZ2FzdGVyQHN1cGVyaC5jb20+LgorICogICBDdXJyZW50bHkgbGltaXRlZCB0byBzdXBwb3J0IGZvciAzMmJpdCBBQkkuCisgKgorICogTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4gMjItTWF5LTIwMDIuCisgKiAgIFRoZSBwbHQgYW5kIGdvdCBjb2RlIGFyZSBub3cgdXNpbmcgdGhlIHNhbWUgc3RydWN0cy4KKyAqICAgQWRkZWQgZ2VuZXJpYyBsaW5rZWQgbGlzdCBjb2RlIHRvIGZ1bGx5IHN1cHBvcnQgUG93ZXJQQy4KKyAqICAgUmVwbGFjZWQgdGhlIG1lc3MgaW4gYXJjaF9hcHBseV9yZWxvY2F0aW9uKCkgd2l0aCBhcmNoaXRlY3R1cmUgYmxvY2tzLgorICogICBUaGUgYXJjaF9jcmVhdGVfZ290KCkgZnVuY3Rpb24gZ290IGNsZWFuZWQgdXAgd2l0aCBhcmNoaXRlY3R1cmUgYmxvY2tzLgorICogICBUaGVzZSBibG9ja3Mgc2hvdWxkIGJlIGVhc3kgbWFpbnRhaW4gYW5kIHN5bmMgd2l0aCBvYmpfeHh4LmMgaW4gbW9kdXRpbHMuCisgKgorICogTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4gYWRkZWQgUG93ZXJQQyBzdXBwb3J0IDIwLUZlYi0yMDAxLgorICogICBQb3dlclBDIHNwZWNpZmljIGNvZGUgc3RvbGVuIGZyb20gbW9kdXRpbHMtMi4zLjE2LAorICogICB3cml0dGVuIGJ5IFBhdWwgTWFja2VycmFzLCBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorICogICBJJ3ZlIG9ubHkgdGVzdGVkIHRoZSBjb2RlIG9uIG1wYzh4eCBwbGF0Zm9ybXMgaW4gYmlnLWVuZGlhbiBtb2RlLgorICogICBEaWQgc29tZSBjbGVhbnVwIGFuZCBhZGRlZCBVU0VfeHh4X0VOVFJJRVMuLi4KKyAqCisgKiBRdWlubiBKZW5zZW4gPGplbnNlbnFAbGluZW8uY29tPiBhZGRlZCBNSVBTIHN1cHBvcnQgMjMtRmViLTIwMDEuCisgKiAgIGJhc2VkIG9uIG1vZHV0aWxzLTIuNC4yCisgKiAgIE1JUFMgc3BlY2lmaWMgc3VwcG9ydCBmb3IgRWxmIGxvYWRpbmcgYW5kIHJlbG9jYXRpb24uCisgKiAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCisgKiAgIENvbnRyaWJ1dGVkIGJ5IFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT4KKyAqCisgKiBCYXNlZCBhbG1vc3QgZW50aXJlbHkgb24gdGhlIExpbnV4IG1vZHV0aWxzLTIuMy4xMSBpbXBsZW1lbnRhdGlvbi4KKyAqICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKyAqICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgKiAgIEJhc2VkIG9uIG9yaWdpbmFsIHdvcmsgYnkgQmpvcm4gRWt3YWxsIDxiajBybkBibG94LnNlPgorICogICBSZXN0cnVjdHVyZWQgKGFuZCBwYXJ0bHkgcmV3cml0dGVuKSBieToKKyAqICAgQmr2cm4gRWt3YWxsIDxiajBybkBibG94LnNlPiBGZWJydWFyeSAxOTk5CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTQorI2RlZmluZSBMT0FEQklUUyAwCisjZWxzZQorI2RlZmluZSBMT0FEQklUUyAxCisjZW5kaWYKKworLyogQWxwaGEgKi8KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9BTFBIQSkKKyNkZWZpbmUgU0hUX1JFTE0gICAgICAgU0hUX1JFTEEKKyNkZWZpbmUgRWxmNjRfUmVsTSAgICAgRWxmNjRfUmVsYQorI2RlZmluZSBFTEZDTEFTU00gICAgICBFTEZDTEFTUzY0CisjZW5kaWYKKworLyogQVJNIHN1cHBvcnQgKi8KKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQVJNKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9QTFRfRU5UUklFUworI2RlZmluZSBQTFRfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNlbmRpZgorCisvKiBORFMzMiBzdXBwb3J0ICovCisjaWYgZGVmaW5lZChfX25kczMyX18pIHx8IGRlZmluZWQoX19ORFMzMl9fKQorI2RlZmluZSBDT05GSUdfVVNFX0dPVF9FTlRSSUVTCisjZGVmaW5lIENPTkZJR19HT1RfRU5UUllfU0laRSA0CisjZGVmaW5lIENPTkZJR19VU0VfU0lOR0xFCisKKyNpZiBkZWZpbmVkKF9fTkRTMzJfRUJfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9ORFMzMikKKyNkZWZpbmUgU0hUX1JFTE0gICAgU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTSAgRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00gICBFTEZDTEFTUzMyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ORFMzMl9FTF9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX05EUzMyKQorI2RlZmluZSBTSFRfUkVMTSAgICBTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNICBFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTSAgIEVMRkNMQVNTMzIKKyNlbmRpZgorI2VuZGlmCisKKy8qIGJsYWNrZmluICovCisjaWYgZGVmaW5lZChCRklOKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0JMQUNLRklOKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKyNlbmRpZgorCisvKiBDUklTICovCisjaWYgZGVmaW5lZChfX2NyaXNfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9DUklTKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKyNpZm5kZWYgRU1fQ1JJUworI2RlZmluZSBFTV9DUklTIDc2CisjZGVmaW5lIFJfQ1JJU19OT05FIDAKKyNkZWZpbmUgUl9DUklTXzMyICAgMworI2VuZGlmCisjZW5kaWYKKworLyogSDgvMzAwICovCisjaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fSDhfMzAwKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKyNkZWZpbmUgVVNFX1NJTkdMRQorI2RlZmluZSBTWU1CT0xfUFJFRklYCSJfIgorI2VuZGlmCisKKy8qIFBBLVJJU0MgLyBIUC1QQSAqLworI2lmIGRlZmluZWQoX19ocHBhX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fUEFSSVNDKQorI2RlZmluZSBTSFRfUkVMTSAgICAgICBTSFRfUkVMQQorI2lmIGRlZmluZWQoX19MUDY0X18pCisjZGVmaW5lIEVsZjY0X1JlbE0gICAgIEVsZjY0X1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1M2NAorI2Vsc2UKKyNkZWZpbmUgRWxmMzJfUmVsTSAgICAgRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00gICAgICBFTEZDTEFTUzMyCisjZW5kaWYKKyNlbmRpZgorCisvKiB4ODYgKi8KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2lmbmRlZiBFTV80ODYKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV8zODYpCisjZWxzZQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNXzM4NiB8fCB4ID09IEVNXzQ4NikKKyNlbmRpZgorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA0CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNlbmRpZgorCisvKiBJQTY0LCBha2EgSXRhbml1bSAqLworI2lmIGRlZmluZWQoX19pYTY0X18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fSUFfNjQpCisjZGVmaW5lIFNIVF9SRUxNICAgICAgIFNIVF9SRUxBCisjZGVmaW5lIEVsZjY0X1JlbE0gICAgIEVsZjY0X1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1M2NAorI2VuZGlmCisKKy8qIG02OGsgKi8KKyNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNXzY4SykKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA0CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNlbmRpZgorCisvKiBNaWNyb2JsYXplICovCisjaWYgZGVmaW5lZChfX21pY3JvYmxhemVfXykKKyNkZWZpbmUgVVNFX1NJTkdMRQorI2luY2x1ZGUgPGxpbnV4L2VsZi1lbS5oPgorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1hJTElOWF9NSUNST0JMQVpFKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKyNlbmRpZgorCisvKiBNSVBTICovCisjaWYgZGVmaW5lZChfX21pcHNfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9NSVBTIHx8IHggPT0gRU1fTUlQU19SUzNfTEUpCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUwKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWwKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKy8qIEFjY291bnQgZm9yIEVMRiBzcGVjIGNoYW5nZXMuICAqLworI2lmbmRlZiBFTV9NSVBTX1JTM19MRQorI2lmZGVmIEVNX01JUFNfUlM0X0JFCisjZGVmaW5lIEVNX01JUFNfUlMzX0xFCUVNX01JUFNfUlM0X0JFCisjZWxzZQorI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAorI2VuZGlmCisjZW5kaWYgLyogIUVNX01JUFNfUlMzX0xFICovCisjZGVmaW5lIEFSQ0hEQVRBTSAgICAgICAiX19kYmVfdGFibGUiCisjZW5kaWYKKworLyogTmlvcyBJSSAqLworI2lmIGRlZmluZWQoX19uaW9zMl9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0FMVEVSQV9OSU9TMikKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZW5kaWYKKworLyogUG93ZXJQQyAqLworI2lmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9QUEM2NCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmNjRfUmVsTQlFbGY2NF9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzY0CisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1BQQykKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9QTFRfRU5UUklFUworI2RlZmluZSBQTFRfRU5UUllfU0laRSAxNgorI2RlZmluZSBVU0VfUExUX0xJU1QKKyNkZWZpbmUgTElTVF9BUkNIVFlQRSBFbGZXKEFkZHIpCisjZGVmaW5lIFVTRV9MSVNUCisjZGVmaW5lIEFSQ0hEQVRBTSAgICAgICAiX19mdHJfZml4dXAiCisjZW5kaWYKKworLyogUzM5MCAqLworI2lmIGRlZmluZWQoX19zMzkwX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fUzM5MCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9QTFRfRU5UUklFUworI2RlZmluZSBQTFRfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNlbmRpZgorCisvKiBTdXBlckggKi8KKyNpZiBkZWZpbmVkKF9fc2hfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9TSCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA0CisjZGVmaW5lIFVTRV9TSU5HTEUKKy8qIHRoZSBTSCBjaGFuZ2VzIGhhdmUgb25seSBiZWVuIHRlc3RlZCBpbiA9bGl0dGxlIGVuZGlhbj0gbW9kZSAqLworLyogSSdtIG5vdCBzdXJlIGFib3V0IGJpZyBlbmRpYW4sIHNvIGxldCdzIHdhcm46ICovCisjaWYgZGVmaW5lZChfX3NoX18pICYmIEJCX0JJR19FTkRJQU4KKyMgZXJyb3IgaW5zbW9kLmMgbWF5IHJlcXVpcmUgY2hhbmdlcyBmb3IgdXNlIG9uIGJpZyBlbmRpYW4gU0gKKyNlbmRpZgorLyogaXQgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgU0gxL1NIMi4uLiBFcnJvciBvbiB0aG9zZSBhbHNvICovCisjaWYgKCghKGRlZmluZWQoX19TSDNfXykgfHwgZGVmaW5lZChfX1NINF9fKSB8fCBkZWZpbmVkKF9fU0g1X18pKSkpICYmIChkZWZpbmVkKF9fc2hfXykpCisjZXJyb3IgaW5zbW9kLmMgbWF5IHJlcXVpcmUgY2hhbmdlcyBmb3IgU0gxIG9yIFNIMiB1c2UKKyNlbmRpZgorI2VuZGlmCisKKy8qIFNwYXJjICovCisjaWYgZGVmaW5lZChfX3NwYXJjX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fU1BBUkMpCisjZGVmaW5lIFNIVF9SRUxNICAgICAgIFNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0gICAgIEVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1MzMgorI2VuZGlmCisKKy8qIHY4NTBlICovCisjaWYgZGVmaW5lZChfX3Y4NTBlX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKCh4KSA9PSBFTV9WODUwIHx8ICh4KSA9PSBFTV9DWUdOVVNfVjg1MCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9QTFRfRU5UUklFUworI2RlZmluZSBQTFRfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNpZm5kZWYgRU1fQ1lHTlVTX1Y4NTAJLyogZ3J1bWJsZSAqLworI2RlZmluZSBFTV9DWUdOVVNfVjg1MAkweDkwODAKKyNlbmRpZgorI2RlZmluZSBTWU1CT0xfUFJFRklYCSJfIgorI2VuZGlmCisKKy8qIFg4Nl82NCAgKi8KKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fWDg2XzY0KQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKKyNkZWZpbmUgR09UX0VOVFJZX1NJWkUgOAorI2RlZmluZSBVU0VfU0lOR0xFCisjZGVmaW5lIEVsZjY0X1JlbE0JRWxmNjRfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1M2NAorI2VuZGlmCisKKyNpZm5kZWYgU0hUX1JFTE0KKyNlcnJvciBTb3JyeSwgYnV0IGluc21vZC5jIGRvZXMgbm90IHlldCBzdXBwb3J0IHRoaXMgYXJjaGl0ZWN0dXJlLi4uCisjZW5kaWYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0tLS1tb2R1dGlscyBtb2R1bGUuaCwgbGluZXMgNDUtMjQyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBMaW51eCBtb2R1bGUgc3lzY2FsbCBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorCisgICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXggbW9kdXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2lmbmRlZiBNT0RVVElMU19NT0RVTEVfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRm9yIHNpemVvZigpIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBtb2R1bGUgcGxhdGZvcm0gYW5kIG5vdCB0byB0aGUKKyAgIGVudmlyb25tZW50IGlzbm1vZCBpcyBydW5uaW5nIGluLCB1c2Ugc2l6ZW9mX3h4IGluc3RlYWQgb2Ygc2l6ZW9mKHh4KS4gICovCisKKyNkZWZpbmUgdGd0X3NpemVvZl9jaGFyCQlzaXplb2YoY2hhcikKKyNkZWZpbmUgdGd0X3NpemVvZl9zaG9ydAlzaXplb2Yoc2hvcnQpCisjZGVmaW5lIHRndF9zaXplb2ZfaW50CQlzaXplb2YoaW50KQorI2RlZmluZSB0Z3Rfc2l6ZW9mX2xvbmcJCXNpemVvZihsb25nKQorI2RlZmluZSB0Z3Rfc2l6ZW9mX2NoYXJfcAlzaXplb2YoY2hhciAqKQorI2RlZmluZSB0Z3Rfc2l6ZW9mX3ZvaWRfcAlzaXplb2Yodm9pZCAqKQorI2RlZmluZSB0Z3RfbG9uZwkJbG9uZworCisjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykgJiYgZGVmaW5lZChBUkNIX3NwYXJjNjQpCisjdW5kZWYgdGd0X3NpemVvZl9sb25nCisjdW5kZWYgdGd0X3NpemVvZl9jaGFyX3AKKyN1bmRlZiB0Z3Rfc2l6ZW9mX3ZvaWRfcAorI3VuZGVmIHRndF9sb25nCitlbnVtIHsKKwl0Z3Rfc2l6ZW9mX2xvbmcgPSA4LAorCXRndF9zaXplb2ZfY2hhcl9wID0gOCwKKwl0Z3Rfc2l6ZW9mX3ZvaWRfcCA9IDgKK307CisjZGVmaW5lIHRndF9sb25nCQlsb25nIGxvbmcKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogVGhlIHN0cnVjdHVyZXMgdXNlZCBpbiBMaW51eCAyLjEuICAqLworCisvKiBOb3RlOiBuZXdfbW9kdWxlX3N5bWJvbCBkb2VzIG5vdCB1c2UgdGd0X2xvbmcgaW50ZW50aW9uYWxseSAqLworc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sIHsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgbmFtZTsKK307CisKK3N0cnVjdCBuZXdfbW9kdWxlX3BlcnNpc3Q7CisKK3N0cnVjdCBuZXdfbW9kdWxlX3JlZiB7CisJdW5zaWduZWQgdGd0X2xvbmcgZGVwOwkJLyoga2VybmVsIGFkZHJlc3NlcyAqLworCXVuc2lnbmVkIHRndF9sb25nIHJlZjsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBuZXh0X3JlZjsKK307CisKK3N0cnVjdCBuZXdfbW9kdWxlIHsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBzaXplX29mX3N0cnVjdDsJLyogPT0gc2l6ZW9mKG1vZHVsZSkgKi8KKwl1bnNpZ25lZCB0Z3RfbG9uZyBuZXh0OworCXVuc2lnbmVkIHRndF9sb25nIG5hbWU7CisJdW5zaWduZWQgdGd0X2xvbmcgc2l6ZTsKKworCXRndF9sb25nIHVzZWNvdW50OworCXVuc2lnbmVkIHRndF9sb25nIGZsYWdzOwkJLyogQVVUT0NMRUFOIGV0IGFsICovCisKKwl1bnNpZ25lZCBuc3ltczsKKwl1bnNpZ25lZCBuZGVwczsKKworCXVuc2lnbmVkIHRndF9sb25nIHN5bXM7CisJdW5zaWduZWQgdGd0X2xvbmcgZGVwczsKKwl1bnNpZ25lZCB0Z3RfbG9uZyByZWZzOworCXVuc2lnbmVkIHRndF9sb25nIGluaXQ7CisJdW5zaWduZWQgdGd0X2xvbmcgY2xlYW51cDsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBleF90YWJsZV9zdGFydDsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBleF90YWJsZV9lbmQ7CisjaWZkZWYgX19hbHBoYV9fCisJdW5zaWduZWQgdGd0X2xvbmcgZ3A7CisjZW5kaWYKKwkvKiBFdmVyeXRoaW5nIGFmdGVyIGhlcmUgaXMgZXh0ZW5zaW9uLiAgKi8KKwl1bnNpZ25lZCB0Z3RfbG9uZyBwZXJzaXN0X3N0YXJ0OworCXVuc2lnbmVkIHRndF9sb25nIHBlcnNpc3RfZW5kOworCXVuc2lnbmVkIHRndF9sb25nIGNhbl91bmxvYWQ7CisJdW5zaWduZWQgdGd0X2xvbmcgcnVuc2l6ZTsKKwljb25zdCBjaGFyICprYWxsc3ltc19zdGFydDsgICAgIC8qIEFsbCBzeW1ib2xzIGZvciBrZXJuZWwgZGVidWdnaW5nICovCisJY29uc3QgY2hhciAqa2FsbHN5bXNfZW5kOworCWNvbnN0IGNoYXIgKmFyY2hkYXRhX3N0YXJ0OyAgICAgLyogYXJjaCBzcGVjaWZpYyBkYXRhIGZvciBtb2R1bGUgKi8KKwljb25zdCBjaGFyICphcmNoZGF0YV9lbmQ7CisJY29uc3QgY2hhciAqa2VybmVsX2RhdGE7ICAgICAgICAvKiBSZXNlcnZlZCBmb3Iga2VybmVsIGludGVybmFsIHVzZSAqLworfTsKKworI2lmZGVmIEFSQ0hEQVRBTQorI2RlZmluZSBBUkNIREFUQV9TRUNfTkFNRSBBUkNIREFUQU0KKyNlbHNlCisjZGVmaW5lIEFSQ0hEQVRBX1NFQ19OQU1FICJfX2FyY2hkYXRhIgorI2VuZGlmCisjZGVmaW5lIEtBTExTWU1TX1NFQ19OQU1FICJfX2thbGxzeW1zIgorCisKK3N0cnVjdCBuZXdfbW9kdWxlX2luZm8geworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIHVzZWNvdW50OworfTsKKworLyogQml0cyBvZiBtb2R1bGUuZmxhZ3MuICAqLworZW51bSB7CisJTkVXX01PRF9SVU5OSU5HID0gMSwKKwlORVdfTU9EX0RFTEVURUQgPSAyLAorCU5FV19NT0RfQVVUT0NMRUFOID0gNCwKKwlORVdfTU9EX1ZJU0lURUQgPSA4LAorCU5FV19NT0RfVVNFRF9PTkNFID0gMTYKK307CisKK2ludCBpbml0X21vZHVsZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3QgbmV3X21vZHVsZSAqKTsKK2ludCBxdWVyeV9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgaW50IHdoaWNoLCB2b2lkICpidWYsCisJCXNpemVfdCBidWZzaXplLCBzaXplX3QgKnJldCk7CisKKy8qIFZhbHVlcyBmb3IgcXVlcnlfbW9kdWxlJ3Mgd2hpY2guICAqLworZW51bSB7CisJUU1fTU9EVUxFUyA9IDEsCisJUU1fREVQUyA9IDIsCisJUU1fUkVGUyA9IDMsCisJUU1fU1lNQk9MUyA9IDQsCisJUU1fSU5GTyA9IDUKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBUaGUgc3lzdGVtIGNhbGxzIHVuY2hhbmdlZCBiZXR3ZWVuIDIuMCBhbmQgMi4xLiAgKi8KKwordW5zaWduZWQgbG9uZyBjcmVhdGVfbW9kdWxlKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK2ludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKKworCisjZW5kaWYgLyogbW9kdWxlLmggKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tZW5kIG9mIG1vZHV0aWxzIG1vZHVsZS5oCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8tLS0tLS0tLW1vZHV0aWxzIG9iai5oLCBsaW5lcyAyNTMtNDYyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyogRWxmIG9iamVjdCBmaWxlIGxvYWRpbmcgYW5kIHJlbG9jYXRpb24gcm91dGluZXMuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorCisgICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXggbW9kdXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2lmbmRlZiBNT0RVVElMU19PQkpfSAorCisvKiBUaGUgcmVsb2NhdGFibGUgb2JqZWN0IGlzIG1hbmlwdWxhdGVkIHVzaW5nIGVsZmluIHR5cGVzLiAgKi8KKworI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorCisjaWZuZGVmIEVsZlcKKyMgaWYgRUxGQ0xBU1NNID09IEVMRkNMQVNTMzIKKyMgIGRlZmluZSBFbGZXKHgpICBFbGYzMl8gIyMgeAorIyAgZGVmaW5lIEVMRlcoeCkgIEVMRjMyXyAjIyB4CisjIGVsc2UKKyMgIGRlZmluZSBFbGZXKHgpICBFbGY2NF8gIyMgeAorIyAgZGVmaW5lIEVMRlcoeCkgIEVMRjY0XyAjIyB4CisjIGVuZGlmCisjZW5kaWYKKworLyogRm9yIHNvbWUgcmVhc29uIHRoaXMgaXMgbWlzc2luZyBmcm9tIHNvbWUgYW5jaWVudCBDIGxpYnJhcmllcy4uLi4gICovCisjaWZuZGVmIEVMRjMyX1NUX0lORk8KKyMgZGVmaW5lIEVMRjMyX1NUX0lORk8oYmluZCwgdHlwZSkgICAgICAgKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKKyNlbmRpZgorCisjaWZuZGVmIEVMRjY0X1NUX0lORk8KKyMgZGVmaW5lIEVMRjY0X1NUX0lORk8oYmluZCwgdHlwZSkgICAgICAgKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKKyNlbmRpZgorCisjZGVmaW5lIEVMRl9TVF9CSU5EKGluZm8pIEVMRlcoU1RfQklORCkoaW5mbykKKyNkZWZpbmUgRUxGX1NUX1RZUEUoaW5mbykgRUxGVyhTVF9UWVBFKShpbmZvKQorI2RlZmluZSBFTEZfU1RfSU5GTyhiaW5kLCB0eXBlKSBFTEZXKFNUX0lORk8pKGJpbmQsIHR5cGUpCisjZGVmaW5lIEVMRl9SX1RZUEUodmFsKSBFTEZXKFJfVFlQRSkodmFsKQorI2RlZmluZSBFTEZfUl9TWU0odmFsKSBFTEZXKFJfU1lNKSh2YWwpCisKK3N0cnVjdCBvYmpfc3RyaW5nX3BhdGNoOworc3RydWN0IG9ial9zeW1ib2xfcGF0Y2g7CisKK3N0cnVjdCBvYmpfc2VjdGlvbiB7CisJRWxmVyhTaGRyKSBoZWFkZXI7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICpjb250ZW50czsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmxvYWRfbmV4dDsKKwlpbnQgaWR4OworfTsKKworc3RydWN0IG9ial9zeW1ib2wgeworCXN0cnVjdCBvYmpfc3ltYm9sICpuZXh0OwkvKiBoYXNoIHRhYmxlIGxpbmsgKi8KKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBzZWNpZHg7CQkJLyogdGhlIGRlZmluaW5nIHNlY3Rpb24gaW5kZXgvbW9kdWxlICovCisJaW50IGluZm87CisJaW50IGtzeW1pZHg7CQkJLyogZm9yIGV4cG9ydCB0byB0aGUga2VybmVsIHN5bXRhYiAqLworCWludCByZWZlcmVuY2VkOwkJLyogYWN0dWFsbHkgdXNlZCBpbiB0aGUgbGluayAqLworfTsKKworLyogSGFyZGNvZGUgdGhlIGhhc2ggdGFibGUgc2l6ZS4gIFdlIHNob3VsZG4ndCBiZSBuZWVkaW5nIHNvIG1hbnkKKyAgIHN5bWJvbHMgdGhhdCB3ZSBiZWdpbiB0byBkZWdyYWRlIHBlcmZvcm1hbmNlLCBhbmQgd2UgZ2V0IGEgYmlnIHdpbgorICAgYnkgZ2l2aW5nIHRoZSBjb21waWxlciBhIGNvbnN0YW50IGRpdmlzb3IuICAqLworCisjZGVmaW5lIEhBU0hfQlVDS0VUUyAgNTIxCisKK3N0cnVjdCBvYmpfZmlsZSB7CisJRWxmVyhFaGRyKSBoZWFkZXI7CisJRWxmVyhBZGRyKSBiYXNlYWRkcjsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKipzZWN0aW9uczsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmxvYWRfb3JkZXI7CisJc3RydWN0IG9ial9zZWN0aW9uICoqbG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQ7CisJc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggKnN0cmluZ19wYXRjaGVzOworCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpzeW1ib2xfcGF0Y2hlczsKKwlpbnQgKCpzeW1ib2xfY21wKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7IC8qIGNhbnQgYmUgRkFTVF9GVU5DICovCisJdW5zaWduZWQgbG9uZyAoKnN5bWJvbF9oYXNoKShjb25zdCBjaGFyICopIEZBU1RfRlVOQzsKKwl1bnNpZ25lZCBsb25nIGxvY2FsX3N5bXRhYl9zaXplOworCXN0cnVjdCBvYmpfc3ltYm9sICoqbG9jYWxfc3ltdGFiOworCXN0cnVjdCBvYmpfc3ltYm9sICpzeW10YWJbSEFTSF9CVUNLRVRTXTsKK307CisKK2VudW0gb2JqX3JlbG9jIHsKKwlvYmpfcmVsb2Nfb2ssCisJb2JqX3JlbG9jX292ZXJmbG93LAorCW9ial9yZWxvY19kYW5nZXJvdXMsCisJb2JqX3JlbG9jX3VuaGFuZGxlZAorfTsKKworc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggeworCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpuZXh0OworCWludCByZWxvY19zZWNpZHg7CisJRWxmVyhBZGRyKSByZWxvY19vZmZzZXQ7CisJRWxmVyhBZGRyKSBzdHJpbmdfb2Zmc2V0OworfTsKKworc3RydWN0IG9ial9zeW1ib2xfcGF0Y2ggeworCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpuZXh0OworCWludCByZWxvY19zZWNpZHg7CisJRWxmVyhBZGRyKSByZWxvY19vZmZzZXQ7CisJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKK307CisKKworLyogR2VuZXJpYyBvYmplY3QgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgRkFTVF9GVU5DIG9ial9lbGZfaGFzaChjb25zdCBjaGFyICopOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2hfbihjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcgbGVuKTsKKworc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICpvYmpfZmluZF9zeW1ib2woc3RydWN0IG9ial9maWxlICpmLAorCQljb25zdCBjaGFyICpuYW1lKTsKKworc3RhdGljIEVsZlcoQWRkcikgb2JqX3N5bWJvbF9maW5hbF92YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKK3N0YXRpYyB2b2lkIG9ial9zZXRfc3ltYm9sX2NvbXBhcmUoc3RydWN0IG9ial9maWxlICpmLAorCQlpbnQgKCpjbXApKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSwKKwkJdW5zaWduZWQgbG9uZyAoKmhhc2gpKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfZmluZF9zZWN0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSk7CisKK3N0YXRpYyB2b2lkIG9ial9pbnNlcnRfc2VjdGlvbl9sb2FkX29yZGVyKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMpOworCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uX2ZpcnN0KHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJdW5zaWduZWQgbG9uZyBzaXplKTsKKworc3RhdGljIHZvaWQgKm9ial9leHRlbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYywgdW5zaWduZWQgbG9uZyBtb3JlKTsKKworc3RhdGljIHZvaWQgb2JqX3N0cmluZ19wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAorCQljb25zdCBjaGFyICpzdHJpbmcpOworCitzdGF0aWMgdm9pZCBvYmpfc3ltYm9sX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0pOworCitzdGF0aWMgdm9pZCBvYmpfY2hlY2tfdW5kZWZpbmVkcyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOworCitzdGF0aWMgdm9pZCBvYmpfYWxsb2NhdGVfY29tbW9ucyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfbG9hZF9zaXplKHN0cnVjdCBvYmpfZmlsZSAqZik7CisKK3N0YXRpYyBpbnQgb2JqX3JlbG9jYXRlKHN0cnVjdCBvYmpfZmlsZSAqZiwgRWxmVyhBZGRyKSBiYXNlKTsKKworI2lmICFMT0FEQklUUworI2RlZmluZSBvYmpfbG9hZChpbWFnZSwgaW1hZ2Vfc2l6ZSwgbG9hZHByb2diaXRzKSBcCisJb2JqX2xvYWQoaW1hZ2UsIGltYWdlX3NpemUpCisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKm9ial9sb2FkKGNoYXIgKmltYWdlLCBzaXplX3QgaW1hZ2Vfc2l6ZSwgaW50IGxvYWRwcm9nYml0cyk7CisKK3N0YXRpYyBpbnQgb2JqX2NyZWF0ZV9pbWFnZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgKmltYWdlKTsKKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKmFyY2hfbmV3X2ZpbGUodm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmFyY2hfbmV3X3NlY3Rpb24odm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sKHZvaWQpOworCitzdGF0aWMgZW51bSBvYmpfcmVsb2MgYXJjaF9hcHBseV9yZWxvY2F0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjLAorCQkvKnN0cnVjdCBvYmpfc2VjdGlvbiAqc3ltc2VjLCovCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0sCisJCUVsZlcoUmVsTSkgKnJlbCwgRWxmVyhBZGRyKSB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFyY2hfY3JlYXRlX2dvdChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCitzdGF0aWMgaW50IG9ial9ncGxfbGljZW5zZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKipsaWNlbnNlKTsKKyNlbmRpZgorI2VuZGlmIC8qIG9iai5oICovCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0tLS1lbmQgb2YgbW9kdXRpbHMgb2JqLmgKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8qIFNQRlggaXMgYWx3YXlzIGEgc3RyaW5nLCBzbyBpdCBjYW4gYmUgY29uY2F0ZW5hdGVkIHRvIHN0cmluZyBjb25zdGFudHMuICAqLworI2lmZGVmIFNZTUJPTF9QUkVGSVgKKyNkZWZpbmUgU1BGWAlTWU1CT0xfUFJFRklYCisjZWxzZQorI2RlZmluZSBTUEZYCSIiCisjZW5kaWYKKworZW51bSB7IFNUUlZFUlNJT05MRU4gPSA2NCB9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIGZsYWdfZm9yY2VfbG9hZCAob3B0aW9uX21hc2szMiAmIElOU01PRF9PUFRfRk9SQ0UpCisjZGVmaW5lIGZsYWdfYXV0b2NsZWFuIChvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9LRVJORUxEKQorI2RlZmluZSBmbGFnX3ZlcmJvc2UgKG9wdGlvbl9tYXNrMzIgJiBJTlNNT0RfT1BUX1ZFUkJPU0UpCisjZGVmaW5lIGZsYWdfcXVpZXQgKG9wdGlvbl9tYXNrMzIgJiBJTlNNT0RfT1BUX1NJTEVOVCkKKyNkZWZpbmUgZmxhZ19ub2V4cG9ydCAob3B0aW9uX21hc2szMiAmIElOU01PRF9PUFRfTk9fRVhQT1JUKQorI2RlZmluZSBmbGFnX3ByaW50X2xvYWRfbWFwIChvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9QUklOVF9NQVApCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZiBkZWZpbmVkKFVTRV9MSVNUKQorCitzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5IHsKKwlzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpuZXh0OworCUxJU1RfQVJDSFRZUEUgYWRkZW5kOworCWludCBvZmZzZXQ7CisJaW50IGluaXRlZCA6IDE7Cit9OworCisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX1NJTkdMRSkKKworc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5IHsKKwlpbnQgb2Zmc2V0OworCWludCBpbml0ZWQgOiAxOworCWludCBhbGxvY2F0ZWQgOiAxOworfTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorc3RydWN0IG1pcHNfaGkxNiB7CisJc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKKwlFbGZXKEFkZHIpICphZGRyOworCUVsZlcoQWRkcikgdmFsdWU7Cit9OworI2VuZGlmCisKK3N0cnVjdCBhcmNoX2ZpbGUgeworCXN0cnVjdCBvYmpfZmlsZSByb290OworI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQorCXN0cnVjdCBvYmpfc2VjdGlvbiAqcGx0OworI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJc3RydWN0IG9ial9zZWN0aW9uICpnb3Q7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorCXN0cnVjdCBtaXBzX2hpMTYgKm1pcHNfaGkxNl9saXN0OworI2VuZGlmCit9OworCitzdHJ1Y3QgYXJjaF9zeW1ib2wgeworCXN0cnVjdCBvYmpfc3ltYm9sIHJvb3Q7CisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisjaWYgZGVmaW5lZChVU0VfUExUX0xJU1QpCisJc3RydWN0IGFyY2hfbGlzdF9lbnRyeSAqcGx0ZW50OworI2Vsc2UKKwlzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgcGx0ZW50OworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKKwlzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgZ290ZW50OworI2VuZGlmCit9OworCisKK3N0cnVjdCBleHRlcm5hbF9tb2R1bGUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJRWxmVyhBZGRyKSBhZGRyOworCWludCB1c2VkOworCXNpemVfdCBuc3ltczsKKwlzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnN5bXM7Cit9OworCitzdGF0aWMgc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICprc3ltczsKK3N0YXRpYyBzaXplX3QgbmtzeW1zOworCitzdGF0aWMgc3RydWN0IGV4dGVybmFsX21vZHVsZSAqZXh0X21vZHVsZXM7CitzdGF0aWMgaW50IG5fZXh0X21vZHVsZXM7CitzdGF0aWMgaW50IG5fZXh0X21vZHVsZXNfdXNlZDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdGF0aWMgc3RydWN0IG9ial9maWxlICphcmNoX25ld19maWxlKHZvaWQpCit7CisJc3RydWN0IGFyY2hfZmlsZSAqZjsKKwlmID0geHphbGxvYyhzaXplb2YoKmYpKTsKKwlyZXR1cm4gJmYtPnJvb3Q7IC8qIGl0J3MgYSBmaXJzdCBtZW1iZXIgKi8KK30KKworc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF9uZXdfc2VjdGlvbih2b2lkKQoreworCXJldHVybiB4emFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqX3NlY3Rpb24pKTsKK30KKworc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICphcmNoX25ld19zeW1ib2wodm9pZCkKK3sKKwlzdHJ1Y3QgYXJjaF9zeW1ib2wgKnN5bTsKKwlzeW0gPSB4emFsbG9jKHNpemVvZigqc3ltKSk7CisJcmV0dXJuICZzeW0tPnJvb3Q7Cit9CisKK3N0YXRpYyBlbnVtIG9ial9yZWxvYworYXJjaF9hcHBseV9yZWxvY2F0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjLAorCQkvKnN0cnVjdCBvYmpfc2VjdGlvbiAqc3ltc2VjLCovCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0sCisJCUVsZlcoUmVsTSkgKnJlbCwgRWxmVyhBZGRyKSB2KQoreworI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgXAorIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIFwKKyB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorCXN0cnVjdCBhcmNoX2ZpbGUgKmlmaWxlID0gKHN0cnVjdCBhcmNoX2ZpbGUgKikgZjsKKyNlbmRpZgorCWVudW0gb2JqX3JlbG9jIHJldCA9IG9ial9yZWxvY19vazsKKwlFbGZXKEFkZHIpICpsb2MgPSAoRWxmVyhBZGRyKSAqKSAodGFyZ3NlYy0+Y29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKSBcCisgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChfX21pY3JvYmxhemVfXykgXAorIHx8IGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19uaW9zMl9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSBcCisgfHwgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwlFbGZXKEFkZHIpIGRvdCA9IHRhcmdzZWMtPmhlYWRlci5zaF9hZGRyICsgcmVsLT5yX29mZnNldDsKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKwlzdHJ1Y3QgYXJjaF9zeW1ib2wgKmlzeW0gPSAoc3RydWN0IGFyY2hfc3ltYm9sICopIHN5bTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgXAorIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fczM5MF9fKQorI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQorCUVsZlcoQWRkcikgZ290ID0gaWZpbGUtPmdvdCA/IGlmaWxlLT5nb3QtPmhlYWRlci5zaF9hZGRyIDogMDsKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJRWxmVyhBZGRyKSBwbHQgPSBpZmlsZS0+cGx0ID8gaWZpbGUtPnBsdC0+aGVhZGVyLnNoX2FkZHIgOiAwOworCXVuc2lnbmVkIGxvbmcgKmlwOworIyBpZiBkZWZpbmVkKFVTRV9QTFRfTElTVCkKKwlzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwZTsKKyMgZWxzZQorCXN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSAqcGU7CisjIGVuZGlmCisjZW5kaWYKKworCXN3aXRjaCAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykpIHsKKworI2lmIGRlZmluZWQoX19hcm1fXykKKworCQljYXNlIFJfQVJNX05PTkU6CisJCQlicmVhazsKKworCQljYXNlIFJfQVJNX0FCUzMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX0FSTV9HT1QzMjoKKwkJCWdvdG8gYmJfdXNlX2dvdDsKKworCQljYXNlIFJfQVJNX0dPVFBDOgorCQkJLyogcmVsYXRpdmUgcmVsb2MsIGFsd2F5cyB0byBfR0xPQkFMX09GRlNFVF9UQUJMRV8KKwkJCSAqICh3aGljaCBpcyAuZ290KSBzaW1pbGFyIHRvIGJyYW5jaCwKKwkJCSAqIGJ1dCBpcyBmdWxsIDMyIGJpdHMgcmVsYXRpdmUgKi8KKworCQkJKmxvYyArPSBnb3QgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfQVJNX1BDMjQ6CisJCWNhc2UgUl9BUk1fUExUMzI6CisJCQlnb3RvIGJiX3VzZV9wbHQ7CisKKwkJY2FzZSBSX0FSTV9HT1RPRkY6IC8qIGFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIGdvdCAqLworCQkJKmxvYyArPSB2IC0gZ290OworCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19jcmlzX18pCisKKwkJY2FzZSBSX0NSSVNfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl9DUklTXzMyOgorCQkJLyogQ1JJUyBrZWVwcyB0aGUgcmVsb2NhdGlvbiB2YWx1ZSBpbiB0aGUgcl9hZGRlbmQgZmllbGQgYW5kCisJCQkgKiBzaG91bGQgbm90IHVzZSB3aGF0cyBpbiAqbG9jIGF0IGFsbAorCQkJICovCisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKKworCQljYXNlIFJfSDhfRElSMjRSODoKKwkJCWxvYyA9IChFbGZXKEFkZHIpICopKChFbGZXKEFkZHIpKWxvYyAtIDEpOworCQkJKmxvYyA9ICgqbG9jICYgMHhmZjAwMDAwMCkgfCAoKCpsb2MgJiAweGZmZmZmZikgKyB2KTsKKwkJCWJyZWFrOworCQljYXNlIFJfSDhfRElSMjRBODoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCQljYXNlIFJfSDhfRElSMzI6CisJCWNhc2UgUl9IOF9ESVIzMkExNjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCQljYXNlIFJfSDhfUENSRUwxNjoKKwkJCXYgLT0gZG90ICsgMjsKKwkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4N2ZmZgorCQkJIHx8IChFbGZXKFN3b3JkKSl2IDwgLShFbGZXKFN3b3JkKSkweDgwMDAKKwkJCSkgeworCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCX0gZWxzZSB7CisJCQkJKih1bnNpZ25lZCBzaG9ydCAqKWxvYyA9IHY7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSX0g4X1BDUkVMODoKKwkJCXYgLT0gZG90ICsgMTsKKwkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4N2YKKwkJCSB8fCAoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MAorCQkJKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfSBlbHNlIHsKKwkJCQkqKHVuc2lnbmVkIGNoYXIgKilsb2MgPSB2OworCQkJfQorCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisKKwkJY2FzZSBSXzM4Nl9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM4Nl8zMjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zODZfUExUMzI6CisJCWNhc2UgUl8zODZfUEMzMjoKKwkJY2FzZSBSXzM4Nl9HT1RPRkY6CisJCQkqbG9jICs9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfMzg2X0dMT0JfREFUOgorCQljYXNlIFJfMzg2X0pNUF9TTE9UOgorCQkJKmxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfMzg2X1JFTEFUSVZFOgorCQkJKmxvYyArPSBmLT5iYXNlYWRkcjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zODZfR09UUEM6CisJCQkqbG9jICs9IGdvdCAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zODZfR09UMzI6CisJCQlnb3RvIGJiX3VzZV9nb3Q7CisJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX21pY3JvYmxhemVfXykKKwkJY2FzZSBSX01JQ1JPQkxBWkVfTk9ORToKKwkJY2FzZSBSX01JQ1JPQkxBWkVfNjRfTk9ORToKKwkJY2FzZSBSX01JQ1JPQkxBWkVfMzJfU1lNX09QX1NZTToKKwkJY2FzZSBSX01JQ1JPQkxBWkVfMzJfUENSRUw6CisJCQlicmVhazsKKworCQljYXNlIFJfTUlDUk9CTEFaRV82NF9QQ1JFTDogeworCQkJLyogZG90IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgorCQkJICogdiBpcyB0aGUgdGFyZ2V0IHN5bWJvbCBhZGRyZXNzLgorCQkJICogU28gd2UgbmVlZCB0byBleHRyYWN0IHRoZSBvZmZzZXQgaW4gdGhlIGNvZGUsCisJCQkgKiBhZGRpbmcgdiwgdGhlbiBzdWJ0cmF0aW5nIHRoZSBjdXJyZW50IGFkZHJlc3MKKwkJCSAqIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uCisJCQkgKiBFeDogIklNTSAweEZGRkUgIGJyYWxpZCAweDAwMDAiID0gImJyYWxpZCAweEZGRkUwMDAwIgorCQkJICovCisKKwkJCS8qIEdldCBzcGxpdCBvZmZzZXQgc3RvcmVkIGluIGNvZGUgKi8KKwkJCXVuc2lnbmVkIGludCB0ZW1wID0gKGxvY1swXSAmIDB4RkZGRikgPDwgMTYgfAorCQkJCQkJKGxvY1sxXSAmIDB4RkZGRik7CisKKwkJCS8qIEFkanVzdCByZWxhdGl2ZSBvZmZzZXQuIC00IGFkanVzdG1lbnQgcmVxdWlyZWQKKwkJCSAqIGJlY2F1c2UgZG90IHBvaW50cyB0byB0aGUgSU1NIGluc24sIGJ1dCBicmFuY2gKKwkJCSAqIGlzIGNvbXB1dGVkIHJlbGF0aXZlIHRvIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXRzZWxmLgorCQkJICovCisJCQl0ZW1wICs9IHYgLSBkb3QgLSA0OworCisJCQkvKiBTdG9yZSBiYWNrIGludG8gY29kZSAqLworCQkJbG9jWzBdID0gKGxvY1swXSAmIDB4RkZGRjAwMDApIHwgdGVtcCA+PiAxNjsKKwkJCWxvY1sxXSA9IChsb2NbMV0gJiAweEZGRkYwMDAwKSB8ICh0ZW1wICYgMHhGRkZGKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFJfTUlDUk9CTEFaRV8zMjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9NSUNST0JMQVpFXzY0OiB7CisJCQkvKiBHZXQgc3BsaXQgcG9pbnRlciBzdG9yZWQgaW4gY29kZSAqLworCQkJdW5zaWduZWQgaW50IHRlbXAxID0gKGxvY1swXSAmIDB4RkZGRikgPDwgMTYgfAorCQkJCQkJKGxvY1sxXSAmIDB4RkZGRik7CisKKwkJCS8qIEFkZCByZWxvYyBvZmZzZXQgKi8KKwkJCXRlbXAxKz12OworCisJCQkvKiBTdG9yZSBiYWNrIGludG8gY29kZSAqLworCQkJbG9jWzBdID0gKGxvY1swXSAmIDB4RkZGRjAwMDApIHwgdGVtcDEgPj4gMTY7CisJCQlsb2NbMV0gPSAobG9jWzFdICYgMHhGRkZGMDAwMCkgfCAodGVtcDEgJiAweEZGRkYpOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgUl9NSUNST0JMQVpFXzMyX1BDUkVMX0xPOgorCQljYXNlIFJfTUlDUk9CTEFaRV8zMl9MTzoKKwkJY2FzZSBSX01JQ1JPQkxBWkVfU1JPMzI6CisJCWNhc2UgUl9NSUNST0JMQVpFX1NSVzMyOgorCQkJcmV0ID0gb2JqX3JlbG9jX3VuaGFuZGxlZDsKKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQorCisJCWNhc2UgUl82OEtfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfMzI6CisJCQkqbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLXzg6CisJCQlpZiAodiA+IDB4ZmYpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9CisJCQkqKGNoYXIgKilsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzY4S18xNjoKKwkJCWlmICh2ID4gMHhmZmZmKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfQorCQkJKihzaG9ydCAqKWxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLX1BDODoKKwkJCXYgLT0gZG90OworCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHg3ZgorCQkJIHx8IChFbGZXKFN3b3JkKSl2IDwgLShFbGZXKFN3b3JkKSkweDgwCisJCQkpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9CisJCQkqKGNoYXIgKilsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzY4S19QQzE2OgorCQkJdiAtPSBkb3Q7CisJCQlpZiAoKEVsZlcoU3dvcmQpKXYgPiAweDdmZmYKKwkJCSB8fCAoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MDAwCisJCQkpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9CisJCQkqKHNob3J0ICopbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfUEMzMjoKKwkJCSooaW50ICopbG9jID0gdiAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfR0xPQl9EQVQ6CisJCWNhc2UgUl82OEtfSk1QX1NMT1Q6CisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfUkVMQVRJVkU6CisJCQkqKGludCAqKWxvYyArPSBmLT5iYXNlYWRkcjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfR09UMzI6CisJCQlnb3RvIGJiX3VzZV9nb3Q7CisKKyMgaWZkZWYgUl82OEtfR09UT0ZGCisJCWNhc2UgUl82OEtfR09UT0ZGOgorCQkJKmxvYyArPSB2IC0gZ290OworCQkJYnJlYWs7CisjIGVuZGlmCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisKKwkJY2FzZSBSX01JUFNfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl9NSVBTXzMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX01JUFNfMjY6CisJCQlpZiAodiAlIDQpCisJCQkJcmV0ID0gb2JqX3JlbG9jX2Rhbmdlcm91czsKKwkJCWlmICgodiAmIDB4ZjAwMDAwMDApICE9ICgoZG90ICsgNCkgJiAweGYwMDAwMDAwKSkKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQkqbG9jID0KKwkJCQkoKmxvYyAmIH4weDAzZmZmZmZmKSB8ICgoKmxvYyArICh2ID4+IDIpKSAmCisJCQkJCQkJCQkJMHgwM2ZmZmZmZik7CisJCQlicmVhazsKKworCQljYXNlIFJfTUlQU19ISTE2OgorCQkJeworCQkJCXN0cnVjdCBtaXBzX2hpMTYgKm47CisKKwkJCQkvKiBXZSBjYW5ub3QgcmVsb2NhdGUgdGhpcyBvbmUgbm93IGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgdmFsdWUKKwkJCQkgICBvZiB0aGUgY2Fycnkgd2UgbmVlZCB0byBhZGQuICBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2CisJCQkJICAgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KKwkJCQluID0geG1hbGxvYyhzaXplb2YgKm4pOworCQkJCW4tPmFkZHIgPSBsb2M7CisJCQkJbi0+dmFsdWUgPSB2OworCQkJCW4tPm5leHQgPSBpZmlsZS0+bWlwc19oaTE2X2xpc3Q7CisJCQkJaWZpbGUtPm1pcHNfaGkxNl9saXN0ID0gbjsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFJfTUlQU19MTzE2OgorCQkJeworCQkJCXVuc2lnbmVkIGxvbmcgaW5zbmxvID0gKmxvYzsKKwkJCQlFbGZXKEFkZHIpIHZhbCwgdmFsbG87CisKKwkJCQkvKiBTaWduIGV4dGVuZCB0aGUgYWRkZW5kIHdlIGV4dHJhY3QgZnJvbSB0aGUgbG8gaW5zbi4gICovCisJCQkJdmFsbG8gPSAoKGluc25sbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOworCisJCQkJaWYgKGlmaWxlLT5taXBzX2hpMTZfbGlzdCAhPSBOVUxMKSB7CisJCQkJCXN0cnVjdCBtaXBzX2hpMTYgKmw7CisKKwkJCQkJbCA9IGlmaWxlLT5taXBzX2hpMTZfbGlzdDsKKwkJCQkJd2hpbGUgKGwgIT0gTlVMTCkgeworCQkJCQkJc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKKwkJCQkJCXVuc2lnbmVkIGxvbmcgaW5zbjsKKworCQkJCQkJLyogRG8gdGhlIEhJMTYgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAorCQkJCQkJICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBMTzE2IGl0c2VsZiwgZXhjZXB0IHdoZXJlCisJCQkJCQkgICB0byBmaW5kIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG5lZWRlZCBieSB0aGUgTE8xNi4gICovCisJCQkJCQlpbnNuID0gKmwtPmFkZHI7CisJCQkJCQl2YWwgPQorCQkJCQkJCSgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsKKwkJCQkJCQl2YWxsbzsKKwkJCQkJCXZhbCArPSB2OworCisJCQkJCQkvKiBBY2NvdW50IGZvciB0aGUgc2lnbiBleHRlbnNpb24gdGhhdCB3aWxsIGhhcHBlbiBpbiB0aGUKKwkJCQkJCSAgIGxvdyBiaXRzLiAgKi8KKwkJCQkJCXZhbCA9CisJCQkJCQkJKCh2YWwgPj4gMTYpICsKKwkJCQkJCQkgKCh2YWwgJiAweDgwMDApICE9CisJCQkJCQkJICAwKSkgJiAweGZmZmY7CisKKwkJCQkJCWluc24gPSAoaW5zbiAmIH4weGZmZmYpIHwgdmFsOworCQkJCQkJKmwtPmFkZHIgPSBpbnNuOworCisJCQkJCQluZXh0ID0gbC0+bmV4dDsKKwkJCQkJCWZyZWUobCk7CisJCQkJCQlsID0gbmV4dDsKKwkJCQkJfQorCisJCQkJCWlmaWxlLT5taXBzX2hpMTZfbGlzdCA9IE5VTEw7CisJCQkJfQorCisJCQkJLyogT2ssIHdlJ3JlIGRvbmUgd2l0aCB0aGUgSEkxNiByZWxvY3MuICBOb3cgZGVhbCB3aXRoIHRoZSBMTzE2LiAgKi8KKwkJCQl2YWwgPSB2ICsgdmFsbG87CisJCQkJaW5zbmxvID0gKGluc25sbyAmIH4weGZmZmYpIHwgKHZhbCAmIDB4ZmZmZik7CisJCQkJKmxvYyA9IGluc25sbzsKKwkJCQlicmVhazsKKwkJCX0KKworI2VsaWYgZGVmaW5lZChfX25pb3MyX18pCisKKwkJY2FzZSBSX05JT1MyX05PTkU6CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfQkZEX1JFTE9DXzMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0JGRF9SRUxPQ18xNjoKKwkJCWlmICh2ID4gMHhmZmZmKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfQorCQkJKihzaG9ydCAqKWxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfQkZEX1JFTE9DXzg6CisJCQlpZiAodiA+IDB4ZmYpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9CisJCQkqKGNoYXIgKilsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX1MxNjoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQlpZiAoKEVsZjMyX1N3b3JkKXYgPiAweDdmZmYKKwkJCQkgfHwgKEVsZjMyX1N3b3JkKXYgPCAtKEVsZjMyX1N3b3JkKTB4ODAwMAorCQkJCSkgeworCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQkJfQorCisJCQkJd29yZCA9ICpsb2M7CisJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAodiAmIDB4ZmZmZikpIDw8IDYpIHwKKwkJCQkgICAgICAgKHdvcmQgJiAweDNmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUl9OSU9TMl9VMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJaWYgKHYgPiAweGZmZmYpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jOworCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8CisJCQkJICAgICAgICh3b3JkICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfUENSRUwxNjoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQl2IC09IGRvdCArIDQ7CisJCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHg3ZmZmCisJCQkJIHx8IChFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwMDAKKwkJCQkpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jOworCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8ICh3b3JkICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfR1BSRUw6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkLCBncDsKKwkJCQkvKiBnZXQgX2dwICovCisJCQkJZ3AgPSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIG9ial9maW5kX3N5bWJvbChmLCBTUEZYICJfZ3AiKSk7CisJCQkJdiAtPSBncDsKKwkJCQlpZiAoKEVsZjMyX1N3b3JkKXYgPiAweDdmZmYKKwkJCQkgfHwgKEVsZjMyX1N3b3JkKXYgPCAtKEVsZjMyX1N3b3JkKTB4ODAwMAorCQkJCSkgeworCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQkJfQorCisJCQkJd29yZCA9ICpsb2M7CisJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAodiAmIDB4ZmZmZikpIDw8IDYpIHwgKHdvcmQgJiAweDNmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUl9OSU9TMl9DQUxMMjY6CisJCQlpZiAodiAmIDMpCisJCQkJcmV0ID0gb2JqX3JlbG9jX2Rhbmdlcm91czsKKwkJCWlmICgodiA+PiAyOCkgIT0gKGRvdCA+PiAyOCkpCisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJKmxvYyA9ICgqbG9jICYgMHgzZikgfCAoKHYgPj4gMikgPDwgNik7CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfSU1NNToKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQlpZiAodiA+IDB4MWYpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jICYgfjB4N2MwOworCQkJCSpsb2MgPSB3b3JkIHwgKCh2ICYgMHgxZikgPDwgNik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfSU1NNjoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQlpZiAodiA+IDB4M2YpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jICYgfjB4ZmMwOworCQkJCSpsb2MgPSB3b3JkIHwgKCh2ICYgMHgzZikgPDwgNik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfSU1NODoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQlpZiAodiA+IDB4ZmYpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jICYgfjB4M2ZjMDsKKwkJCQkqbG9jID0gd29yZCB8ICgodiAmIDB4ZmYpIDw8IDYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0hJMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJd29yZCA9ICpsb2M7CisJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAoKHYgPj4xNikgJiAweGZmZmYpKSA8PCA2KSB8CisJCQkJICAgICAgICh3b3JkICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfTE8xNjoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQl3b3JkID0gKmxvYzsKKwkJCQkqbG9jID0gKCgoKHdvcmQgPj4gMjIpIDw8IDE2KSB8ICh2ICYgMHhmZmZmKSkgPDwgNikgfAorCQkJCSAgICAgICAod29yZCAmIDB4M2YpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0hJQURKMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkMSwgd29yZDI7CisKKwkJCQl3b3JkMSA9ICpsb2M7CisJCQkJd29yZDIgPSAoKHYgPj4gMTYpICsgKCh2ID4+IDE1KSAmIDEpKSAmIDB4ZmZmZjsKKwkJCQkqbG9jID0gKCgoKHdvcmQxID4+IDIyKSA8PCAxNikgfCB3b3JkMikgPDwgNikgfAorCQkJCSAgICAgICAod29yZDEgJiAweDNmKTsKKwkJCX0KKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisJCS8qIFBQQzY0IG5lZWRzIGEgMi42IGtlcm5lbCwgMi40IG1vZHVsZSByZWxvY2F0aW9uIGlycmVsZXZhbnQgKi8KKworI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKworCQljYXNlIFJfUFBDX0FERFIxNl9IQToKKwkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSAodiArIDB4ODAwMCkgPj4gMTY7CisJCQlicmVhazsKKworCQljYXNlIFJfUFBDX0FERFIxNl9ISToKKwkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSB2ID4+IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1BQQ19BRERSMTZfTE86CisJCQkqKHVuc2lnbmVkIHNob3J0ICopbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9QUENfUkVMMjQ6CisJCQlnb3RvIGJiX3VzZV9wbHQ7CisKKwkJY2FzZSBSX1BQQ19SRUwzMjoKKwkJCSpsb2MgPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1BQQ19BRERSMzI6CisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fczM5MF9fKQorCisJCWNhc2UgUl8zOTBfMzI6CisJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gdjsKKwkJCWJyZWFrOworCQljYXNlIFJfMzkwXzE2OgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gdjsKKwkJCWJyZWFrOworCQljYXNlIFJfMzkwXzg6CisJCQkqKHVuc2lnbmVkIGNoYXIgKikgbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfMzkwX1BDMzI6CisJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gdiAtIGRvdDsKKwkJCWJyZWFrOworCQljYXNlIFJfMzkwX1BDMTZEQkw6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSAodiAtIGRvdCkgPj4gMTsKKwkJCWJyZWFrOworCQljYXNlIFJfMzkwX1BDMTY6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM5MF9QTFQzMjoKKwkJY2FzZSBSXzM5MF9QTFQxNkRCTDoKKwkJCS8qIGZpbmQgdGhlIHBsdCBlbnRyeSBhbmQgaW5pdGlhbGl6ZSBpdC4gICovCisJCQlwZSA9IChzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgKikgJmlzeW0tPnBsdGVudDsKKwkJCWlmIChwZS0+aW5pdGVkID09IDApIHsKKwkJCQlpcCA9ICh1bnNpZ25lZCBsb25nICopKGlmaWxlLT5wbHQtPmNvbnRlbnRzICsgcGUtPm9mZnNldCk7CisJCQkJaXBbMF0gPSAweDBkMTA1ODEwOyAvKiBiYXNyIDEsMDsgbGcgMSwxMCgxKTsgYnIgMSAqLworCQkJCWlwWzFdID0gMHgxMDA2MDdmMTsKKwkJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfUExUMTZEQkwpCisJCQkJCWlwWzJdID0gdiAtIDI7CisJCQkJZWxzZQorCQkJCQlpcFsyXSA9IHY7CisJCQkJcGUtPmluaXRlZCA9IDE7CisJCQl9CisKKwkJCS8qIEluc2VydCByZWxhdGl2ZSBkaXN0YW5jZSB0byB0YXJnZXQuICAqLworCQkJdiA9IHBsdCArIHBlLT5vZmZzZXQgLSBkb3Q7CisJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfUExUMzIpCisJCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jID0gKHVuc2lnbmVkIGludCkgdjsKKwkJCWVsc2UgaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX1BMVDE2REJMKQorCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jID0gKHVuc2lnbmVkIHNob3J0KSAoKHYgKyAyKSA+PiAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zOTBfR0xPQl9EQVQ6CisJCWNhc2UgUl8zOTBfSk1QX1NMT1Q6CisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zOTBfUkVMQVRJVkU6CisJCQkqbG9jICs9IGYtPmJhc2VhZGRyOworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM5MF9HT1RQQzoKKwkJCSoodW5zaWduZWQgbG9uZyAqKSBsb2MgKz0gZ290IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM5MF9HT1QxMjoKKwkJY2FzZSBSXzM5MF9HT1QxNjoKKwkJY2FzZSBSXzM5MF9HT1QzMjoKKwkJCWlmICghaXN5bS0+Z290ZW50LmluaXRlZCkKKwkJCXsKKwkJCQlpc3ltLT5nb3RlbnQuaW5pdGVkID0gMTsKKwkJCQkqKEVsZlcoQWRkcikgKikoaWZpbGUtPmdvdC0+Y29udGVudHMgKyBpc3ltLT5nb3RlbnQub2Zmc2V0KSA9IHY7CisJCQl9CisJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfR09UMTIpCisJCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgfD0gKCoodW5zaWduZWQgc2hvcnQgKikgbG9jICsgaXN5bS0+Z290ZW50Lm9mZnNldCkgJiAweGZmZjsKKwkJCWVsc2UgaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX0dPVDE2KQorCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CisJCQllbHNlIGlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9HT1QzMikKKwkJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldDsKKwkJCWJyZWFrOworCisjIGlmbmRlZiBSXzM5MF9HT1RPRkYzMgorIyAgZGVmaW5lIFJfMzkwX0dPVE9GRjMyIFJfMzkwX0dPVE9GRgorIyBlbmRpZgorCQljYXNlIFJfMzkwX0dPVE9GRjMyOgorCQkJKmxvYyArPSB2IC0gZ290OworCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19zaF9fKQorCisJCWNhc2UgUl9TSF9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX0RJUjMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX1JFTDMyOgorCQkJKmxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX1BMVDMyOgorCQkJKmxvYyA9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfU0hfR0xPQl9EQVQ6CisJCWNhc2UgUl9TSF9KTVBfU0xPVDoKKwkJCSpsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX1JFTEFUSVZFOgorCQkJKmxvYyA9IGYtPmJhc2VhZGRyICsgcmVsLT5yX2FkZGVuZDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9TSF9HT1RQQzoKKwkJCSpsb2MgPSBnb3QgLSBkb3QgKyByZWwtPnJfYWRkZW5kOworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX0dPVDMyOgorCQkJZ290byBiYl91c2VfZ290OworCisJCWNhc2UgUl9TSF9HT1RPRkY6CisJCQkqbG9jID0gdiAtIGdvdDsKKwkJCWJyZWFrOworCisjIGlmIGRlZmluZWQoX19TSDVfXykKKwkJY2FzZSBSX1NIX0lNTV9NRURMT1cxNjoKKwkJY2FzZSBSX1NIX0lNTV9MT1cxNjoKKwkJCXsKKwkJCQlFbGZXKEFkZHIpIHdvcmQ7CisKKwkJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl9TSF9JTU1fTUVETE9XMTYpCisJCQkJCXYgPj49IDE2OworCisJCQkJLyoKKwkJCQkgKiAgbW92aSBhbmQgc2hvcmkgaGF2ZSB0aGUgZm9ybWF0OgorCQkJCSAqCisJCQkJICogIHwgIG9wICB8IGltbSAgfCByZWcgfCByZXNlcnZlZCB8CisJCQkJICogICAzMS4uMjYgMjUuLjEwIDkuLiA0IDMgICAuLiAgIDAKKwkJCQkgKgorCQkJCSAqIHNvIHdlIHNpbXBseSBtYXNrIGFuZCBvciBpbiBpbW0uCisJCQkJICovCisJCQkJd29yZCA9ICpsb2MgJiB+MHgzZmZmYzAwOworCQkJCXdvcmQgfD0gKHYgJiAweGZmZmYpIDw8IDEwOworCisJCQkJKmxvYyA9IHdvcmQ7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFJfU0hfSU1NX01FRExPVzE2X1BDUkVMOgorCQljYXNlIFJfU0hfSU1NX0xPVzE2X1BDUkVMOgorCQkJeworCQkJCUVsZlcoQWRkcikgd29yZDsKKworCQkJCXdvcmQgPSAqbG9jICYgfjB4M2ZmZmMwMDsKKworCQkJCXYgLT0gZG90OworCisJCQkJaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfU0hfSU1NX01FRExPVzE2X1BDUkVMKQorCQkJCQl2ID4+PSAxNjsKKworCQkJCXdvcmQgfD0gKHYgJiAweGZmZmYpIDw8IDEwOworCisJCQkJKmxvYyA9IHdvcmQ7CisKKwkJCQlicmVhazsKKwkJCX0KKyMgZW5kaWYgLyogX19TSDVfXyAqLworCisjZWxpZiBkZWZpbmVkKF9fdjg1MGVfXykKKworCQljYXNlIFJfVjg1MF9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSX1Y4NTBfMzI6CisJCQkvKiBXZSB3cml0ZSB0d28gc2hvcnRzIGluc3RlYWQgb2YgYSBsb25nIGJlY2F1c2UgZXZlbgorCQkJICAgMzItYml0IGluc25zIG9ubHkgbmVlZCBoYWxmLXdvcmQgYWxpZ25tZW50LCBidXQKKwkJCSAgIDMyLWJpdCBkYXRhIG5lZWRzIHRvIGJlIGxvbmctd29yZCBhbGlnbmVkLiAgKi8KKwkJCXYgKz0gKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMF07CisJCQl2ICs9ICgodW5zaWduZWQgc2hvcnQgKilsb2MpWzFdIDw8IDE2OworCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMF0gPSB2ICYgMHhmZmZmOworCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMV0gPSAodiA+PiAxNikgJiAweGZmZmY7CisJCQlicmVhazsKKworCQljYXNlIFJfVjg1MF8yMl9QQ1JFTDoKKwkJCWdvdG8gYmJfdXNlX3BsdDsKKworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCisJCWNhc2UgUl9YODZfNjRfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl9YODZfNjRfNjQ6CisJCQkqbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0XzMyOgorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IHY7CisJCQlpZiAodiA+IDB4ZmZmZmZmZmYpCisJCQl7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OyAvKiBLZXJuZWwgbW9kdWxlIGNvbXBpbGVkIHdpdGhvdXQgLW1jbW9kZWw9a2VybmVsLiAqLworCQkJCS8qIGVycm9yKCJQb3NzaWJseSBpcyBtb2R1bGUgY29tcGlsZWQgd2l0aG91dCAtbWNtb2RlbD1rZXJuZWwhIik7ICovCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0XzMyUzoKKwkJCSooc2lnbmVkIGludCAqKSBsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9YODZfNjRfMTY6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF84OgorCQkJKih1bnNpZ25lZCBjaGFyICopIGxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9QQzMyOgorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0X1BDMTY6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9QQzg6CisJCQkqKHVuc2lnbmVkIGNoYXIgKikgbG9jICs9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0X0dMT0JfREFUOgorCQljYXNlIFJfWDg2XzY0X0pVTVBfU0xPVDoKKwkJCSpsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9SRUxBVElWRToKKwkJCSpsb2MgKz0gZi0+YmFzZWFkZHI7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0X0dPVDMyOgorCQljYXNlIFJfWDg2XzY0X0dPVFBDUkVMOgorCQkJZ290byBiYl91c2VfZ290OworIyBpZiAwCisJCQlpZiAoIWlzeW0tPmdvdGVudC5yZWxvY19kb25lKQorCQkJeworCQkJCWlzeW0tPmdvdGVudC5yZWxvY19kb25lID0gMTsKKwkJCQkqKEVsZjY0X0FkZHIgKikoaWZpbGUtPmdvdC0+Y29udGVudHMgKyBpc3ltLT5nb3RlbnQub2Zmc2V0KSA9IHY7CisJCQl9CisJCQkvKiBYWFggYXJlIHRoZXNlIHJlYWxseSBjb3JyZWN0PyAgKi8KKwkJCWlmIChFTEY2NF9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfWDg2XzY0X0dPVFBDUkVMKQorCQkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2ICsgaXN5bS0+Z290ZW50Lm9mZnNldDsKKwkJCWVsc2UKKwkJCQkqbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CisJCQlicmVhazsKKyMgZW5kaWYKKworI2Vsc2UKKyMgd2FybmluZyAibm8gaWRlYSBob3cgdG8gaGFuZGxlIHJlbG9jYXRpb25zIG9uIHlvdXIgYXJjaCIKKyNlbmRpZgorCisJCWRlZmF1bHQ6CisJCQlwcmludGYoIldhcm5pbmc6IHVuaGFuZGxlZCByZWxvYyAlZFxuIiwgKGludClFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CisJCQlyZXQgPSBvYmpfcmVsb2NfdW5oYW5kbGVkOworCQkJYnJlYWs7CisKKyNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKworYmJfdXNlX3BsdDoKKworCQkJLyogZmluZCB0aGUgcGx0IGVudHJ5IGFuZCBpbml0aWFsaXplIGl0IGlmIG5lY2Vzc2FyeSAqLworCisjaWYgZGVmaW5lZChVU0VfUExUX0xJU1QpCisJCQlmb3IgKHBlID0gaXN5bS0+cGx0ZW50OyBwZSAhPSBOVUxMICYmIHBlLT5hZGRlbmQgIT0gcmVsLT5yX2FkZGVuZDspCisJCQkJcGUgPSBwZS0+bmV4dDsKKyNlbHNlCisJCQlwZSA9ICZpc3ltLT5wbHRlbnQ7CisjZW5kaWYKKworCQkJaWYgKCEgcGUtPmluaXRlZCkgeworCQkJCWlwID0gKHVuc2lnbmVkIGxvbmcgKikgKGlmaWxlLT5wbHQtPmNvbnRlbnRzICsgcGUtPm9mZnNldCk7CisKKwkJCQkvKiBnZW5lcmF0ZSBzb21lIG1hY2hpbmUgY29kZSAqLworCisjaWYgZGVmaW5lZChfX2FybV9fKQorCQkJCWlwWzBdID0gMHhlNTFmZjAwNDsJCQkvKiBsZHIgcGMsW3BjLCMtNF0gKi8KKwkJCQlpcFsxXSA9IHY7CQkJCS8qIHN5bUAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCisJCQkJaXBbMF0gPSAweDNkNjAwMDAwICsgKCh2ICsgMHg4MDAwKSA+PiAxNik7ICAvKiBsaXMgcjExLHN5bUBoYSAqLworCQkJCWlwWzFdID0gMHgzOTZiMDAwMCArICh2ICYgMHhmZmZmKTsgICAgICAgICAgLyogYWRkaSByMTEscjExLHN5bUBsICovCisJCQkJaXBbMl0gPSAweDdkNjkwM2E2OwkJCSAgICAgIC8qIG10Y3RyIHIxMSAqLworCQkJCWlwWzNdID0gMHg0ZTgwMDQyMDsJCQkgICAgICAvKiBiY3RyICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fdjg1MGVfXykKKwkJCQkvKiBXZSBoYXZlIHRvIHRyYXNoIGEgcmVnaXN0ZXIsIHNvIHdlIGFzc3VtZSB0aGF0IGFueSBjb250cm9sCisJCQkJICAgdHJhbnNmZXIgbW9yZSB0aGFuIDIxLWJpdHMgYXdheSBtdXN0IGJlIGEgZnVuY3Rpb24gY2FsbAorCQkJCSAgIChzbyB3ZSBjYW4gdXNlIGEgY2FsbC1jbG9iYmVyZWQgcmVnaXN0ZXIpLiAgKi8KKwkJCQlpcFswXSA9IDB4MDYyMSArICgodiAmIDB4ZmZmZikgPDwgMTYpOyAgIC8qIG1vdiBzeW0sIHIxIC4uLiAqLworCQkJCWlwWzFdID0gKCh2ID4+IDE2KSAmIDB4ZmZmZikgKyAweDYxMDAwMDsgLyogLi4uOyBqbXAgcjEgKi8KKyNlbmRpZgorCQkJCXBlLT5pbml0ZWQgPSAxOworCQkJfQorCisJCQkvKiByZWxhdGl2ZSBkaXN0YW5jZSB0byB0YXJnZXQgKi8KKwkJCXYgLT0gZG90OworCQkJLyogaWYgdGhlIHRhcmdldCBpcyB0b28gZmFyIGF3YXkuLi4uICovCisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKQorCQkJaWYgKChpbnQpdiA8IC0weDAyMDAwMDAwIHx8IChpbnQpdiA+PSAweDAyMDAwMDAwKQorI2VsaWYgZGVmaW5lZChfX3Y4NTBlX18pCisJCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHgxZmZmZmYgfHwgKEVsZlcoU3dvcmQpKXYgPCAoRWxmVyhTd29yZCkpLTB4MjAwMDAwKQorI2VuZGlmCisJCQkJCS8qIGdvIHZpYSB0aGUgcGx0ICovCisJCQkJCXYgPSBwbHQgKyBwZS0+b2Zmc2V0IC0gZG90OworCisjaWYgZGVmaW5lZChfX3Y4NTBlX18pCisJCQlpZiAodiAmIDEpCisjZWxzZQorCQkJCWlmICh2ICYgMykKKyNlbmRpZgorCQkJCQlyZXQgPSBvYmpfcmVsb2NfZGFuZ2Vyb3VzOworCisJCQkvKiBtZXJnZSB0aGUgb2Zmc2V0IGludG8gdGhlIGluc3RydWN0aW9uLiAqLworI2lmIGRlZmluZWQoX19hcm1fXykKKwkJCS8qIENvbnZlcnQgdG8gd29yZHMuICovCisJCQl2ID4+PSAyOworCisJCQkqbG9jID0gKCpsb2MgJiB+MHgwMGZmZmZmZikgfCAoKHYgKyAqbG9jKSAmIDB4MDBmZmZmZmYpOworI2VuZGlmCisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKwkJCSpsb2MgPSAoKmxvYyAmIH4weDAzZmZmZmZjKSB8ICh2ICYgMHgwM2ZmZmZmYyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fdjg1MGVfXykKKwkJCS8qIFdlIHdyaXRlIHR3byBzaG9ydHMgaW5zdGVhZCBvZiBhIGxvbmcgYmVjYXVzZSBldmVuIDMyLWJpdCBpbnNucworCQkJICAgb25seSBuZWVkIGhhbGYtd29yZCBhbGlnbm1lbnQsIGJ1dCB0aGUgMzItYml0IGRhdGEgd3JpdGUgbmVlZHMKKwkJCSAgIHRvIGJlIGxvbmctd29yZCBhbGlnbmVkLiAgKi8KKwkJCSgodW5zaWduZWQgc2hvcnQgKilsb2MpWzBdID0KKwkJCQkoKih1bnNpZ25lZCBzaG9ydCAqKWxvYyAmIDB4ZmZjMCkgLyogb3Bjb2RlICsgcmVnICovCisJCQkJfCAoKHYgPj4gMTYpICYgMHgzZik7ICAgICAgICAgICAgIC8qIG9mZnMgaGlnaCBwYXJ0ICovCisJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA9CisJCQkJKHYgJiAweGZmZmYpOyAgICAgICAgICAgICAgICAgICAgLyogb2ZmcyBsb3cgcGFydCAqLworI2VuZGlmCisJCQlicmVhazsKKyNlbmRpZiAvKiBVU0VfUExUX0VOVFJJRVMgKi8KKworI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQorYmJfdXNlX2dvdDoKKworCQkJLyogbmVlZHMgYW4gZW50cnkgaW4gdGhlIC5nb3Q6IHNldCBpdCwgb25jZSAqLworCQkJaWYgKCFpc3ltLT5nb3RlbnQuaW5pdGVkKSB7CisJCQkJaXN5bS0+Z290ZW50LmluaXRlZCA9IDE7CisJCQkJKihFbGZXKEFkZHIpICopIChpZmlsZS0+Z290LT5jb250ZW50cyArIGlzeW0tPmdvdGVudC5vZmZzZXQpID0gdjsKKwkJCX0KKwkJCS8qIG1ha2UgdGhlIHJlbG9jIHdpdGhfcmVzcGVjdF90b18uZ290ICovCisjaWYgZGVmaW5lZChfX3NoX18pCisJCQkqbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQgKyByZWwtPnJfYWRkZW5kOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fbWM2ODAwMF9fKQorCQkJKmxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0OworI2VuZGlmCisJCQlicmVhazsKKworI2VuZGlmIC8qIFVTRV9HT1RfRU5UUklFUyAqLworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworI2lmIGRlZmluZWQoVVNFX0xJU1QpCisKK3N0YXRpYyBpbnQgYXJjaF9saXN0X2FkZChFbGZXKFJlbE0pICpyZWwsIHN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKipsaXN0LAorCQkJICBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwZTsKKworCWZvciAocGUgPSAqbGlzdDsgcGUgIT0gTlVMTDsgcGUgPSBwZS0+bmV4dCkgeworCQlpZiAocGUtPmFkZGVuZCA9PSByZWwtPnJfYWRkZW5kKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwZSA9PSBOVUxMKSB7CisJCXBlID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGFyY2hfbGlzdF9lbnRyeSkpOworCQlwZS0+bmV4dCA9ICpsaXN0OworCQlwZS0+YWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKKwkJcGUtPm9mZnNldCA9IG9mZnNldDsKKwkJLypwZS0+aW5pdGVkID0gMDsqLworCQkqbGlzdCA9IHBlOworCQlyZXR1cm4gc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfU0lOR0xFKQorCitzdGF0aWMgaW50IGFyY2hfc2luZ2xlX2luaXQoLypFbGZXKFJlbE0pICpyZWwsKi8gc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5ICpzaW5nbGUsCisJCWludCBvZmZzZXQsIGludCBzaXplKQoreworCWlmIChzaW5nbGUtPmFsbG9jYXRlZCA9PSAwKSB7CisJCXNpbmdsZS0+YWxsb2NhdGVkID0gMTsKKwkJc2luZ2xlLT5vZmZzZXQgPSBvZmZzZXQ7CisJCXNpbmdsZS0+aW5pdGVkID0gMDsKKwkJcmV0dXJuIHNpemU7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKworc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF94c2VjdF9pbml0KHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSwKKwkJaW50IG9mZnNldCwgaW50IHNpemUpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpteXJlbHNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgbmFtZSk7CisKKwlpZiAob2Zmc2V0ID09IDApIHsKKwkJb2Zmc2V0ICs9IHNpemU7CisJfQorCisJaWYgKG15cmVsc2VjKSB7CisJCW9ial9leHRlbmRfc2VjdGlvbihteXJlbHNlYywgb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlteXJlbHNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsIG5hbWUsCisJCQkJc2l6ZSwgb2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gbXlyZWxzZWM7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhcmNoX2NyZWF0ZV9nb3Qoc3RydWN0IG9ial9maWxlICpmKQoreworI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKwlzdHJ1Y3QgYXJjaF9maWxlICppZmlsZSA9IChzdHJ1Y3QgYXJjaF9maWxlICopIGY7CisJaW50IGk7CisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJaW50IGdvdF9vZmZzZXQgPSAwLCBnb3RfbmVlZGVkID0gMCwgZ290X2FsbG9jYXRlOworI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJaW50IHBsdF9vZmZzZXQgPSAwLCBwbHRfbmVlZGVkID0gMCwgcGx0X2FsbG9jYXRlOworI2VuZGlmCisJc3RydWN0IG9ial9zZWN0aW9uICpyZWxzZWMsICpzeW1zZWMsICpzdHJzZWM7CisJRWxmVyhSZWxNKSAqcmVsLCAqcmVsZW5kOworCUVsZlcoU3ltKSAqc3ltdGFiLCAqZXh0c3ltOworCWNvbnN0IGNoYXIgKnN0cnRhYiwgKm5hbWU7CisJc3RydWN0IGFyY2hfc3ltYm9sICppbnRzeW07CisKKwlmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkgeworCQlyZWxzZWMgPSBmLT5zZWN0aW9uc1tpXTsKKwkJaWYgKHJlbHNlYy0+aGVhZGVyLnNoX3R5cGUgIT0gU0hUX1JFTE0pCisJCQljb250aW51ZTsKKworCQlzeW1zZWMgPSBmLT5zZWN0aW9uc1tyZWxzZWMtPmhlYWRlci5zaF9saW5rXTsKKwkJc3Ryc2VjID0gZi0+c2VjdGlvbnNbc3ltc2VjLT5oZWFkZXIuc2hfbGlua107CisKKwkJcmVsID0gKEVsZlcoUmVsTSkgKikgcmVsc2VjLT5jb250ZW50czsKKwkJcmVsZW5kID0gcmVsICsgKHJlbHNlYy0+aGVhZGVyLnNoX3NpemUgLyBzaXplb2YoRWxmVyhSZWxNKSkpOworCQlzeW10YWIgPSAoRWxmVyhTeW0pICopIHN5bXNlYy0+Y29udGVudHM7CisJCXN0cnRhYiA9IChjb25zdCBjaGFyICopIHN0cnNlYy0+Y29udGVudHM7CisKKwkJZm9yICg7IHJlbCA8IHJlbGVuZDsgKytyZWwpIHsKKwkJCWV4dHN5bSA9ICZzeW10YWJbRUxGX1JfU1lNKHJlbC0+cl9pbmZvKV07CisKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKKwkJCWdvdF9hbGxvY2F0ZSA9IDA7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKwkJCXBsdF9hbGxvY2F0ZSA9IDA7CisjZW5kaWYKKworCQkJc3dpdGNoIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSkgeworI2lmIGRlZmluZWQoX19hcm1fXykKKwkJCWNhc2UgUl9BUk1fUEMyNDoKKwkJCWNhc2UgUl9BUk1fUExUMzI6CisJCQkJcGx0X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSX0FSTV9HT1RPRkY6CisJCQljYXNlIFJfQVJNX0dPVFBDOgorCQkJCWdvdF9uZWVkZWQgPSAxOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlIFJfQVJNX0dPVDMyOgorCQkJCWdvdF9hbGxvY2F0ZSA9IDE7CisJCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisJCQljYXNlIFJfMzg2X0dPVFBDOgorCQkJY2FzZSBSXzM4Nl9HT1RPRkY6CisJCQkJZ290X25lZWRlZCA9IDE7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgUl8zODZfR09UMzI6CisJCQkJZ290X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKwkJCWNhc2UgUl9QUENfUkVMMjQ6CisJCQkJcGx0X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX21jNjgwMDBfXykKKwkJCWNhc2UgUl82OEtfR09UMzI6CisJCQkJZ290X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworI2lmZGVmIFJfNjhLX0dPVE9GRgorCQkJY2FzZSBSXzY4S19HT1RPRkY6CisJCQkJZ290X25lZWRlZCA9IDE7CisJCQkJY29udGludWU7CisjZW5kaWYKKworI2VsaWYgZGVmaW5lZChfX3NoX18pCisJCQljYXNlIFJfU0hfR09UMzI6CisJCQkJZ290X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSX1NIX0dPVFBDOgorCQkJY2FzZSBSX1NIX0dPVE9GRjoKKwkJCQlnb3RfbmVlZGVkID0gMTsKKwkJCQljb250aW51ZTsKKworI2VsaWYgZGVmaW5lZChfX3Y4NTBlX18pCisJCQljYXNlIFJfVjg1MF8yMl9QQ1JFTDoKKwkJCQlwbHRfbmVlZGVkID0gMTsKKwkJCQlicmVhazsKKworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoZXh0c3ltLT5zdF9uYW1lICE9IDApIHsKKwkJCQluYW1lID0gc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lOworCQkJfSBlbHNlIHsKKwkJCQluYW1lID0gZi0+c2VjdGlvbnNbZXh0c3ltLT5zdF9zaG5keF0tPm5hbWU7CisJCQl9CisJCQlpbnRzeW0gPSAoc3RydWN0IGFyY2hfc3ltYm9sICopIG9ial9maW5kX3N5bWJvbChmLCBuYW1lKTsKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKKwkJCWlmIChnb3RfYWxsb2NhdGUpIHsKKwkJCQlnb3Rfb2Zmc2V0ICs9IGFyY2hfc2luZ2xlX2luaXQoCisJCQkJCQkvKnJlbCwqLyAmaW50c3ltLT5nb3RlbnQsCisJCQkJCQlnb3Rfb2Zmc2V0LCBHT1RfRU5UUllfU0laRSk7CisKKwkJCQlnb3RfbmVlZGVkID0gMTsKKwkJCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQorCQkJaWYgKHBsdF9hbGxvY2F0ZSkgeworI2lmIGRlZmluZWQoVVNFX1BMVF9MSVNUKQorCQkJCXBsdF9vZmZzZXQgKz0gYXJjaF9saXN0X2FkZCgKKwkJCQkJCXJlbCwgJmludHN5bS0+cGx0ZW50LAorCQkJCQkJcGx0X29mZnNldCwgUExUX0VOVFJZX1NJWkUpOworI2Vsc2UKKwkJCQlwbHRfb2Zmc2V0ICs9IGFyY2hfc2luZ2xlX2luaXQoCisJCQkJCQkvKnJlbCwqLyAmaW50c3ltLT5wbHRlbnQsCisJCQkJCQlwbHRfb2Zmc2V0LCBQTFRfRU5UUllfU0laRSk7CisjZW5kaWYKKwkJCQlwbHRfbmVlZGVkID0gMTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJaWYgKGdvdF9uZWVkZWQpIHsKKwkJaWZpbGUtPmdvdCA9IGFyY2hfeHNlY3RfaW5pdChmLCAiLmdvdCIsIGdvdF9vZmZzZXQsCisJCQkJR09UX0VOVFJZX1NJWkUpOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJaWYgKHBsdF9uZWVkZWQpIHsKKwkJaWZpbGUtPnBsdCA9IGFyY2hfeHNlY3RfaW5pdChmLCAiLnBsdCIsIHBsdF9vZmZzZXQsCisJCQkJUExUX0VOVFJZX1NJWkUpOworCX0KKyNlbmRpZgorCisjZW5kaWYgLyogZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpIHx8IGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKSAqLworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBTdGFuZGFyZCBFTEYgaGFzaCBmdW5jdGlvbi4gICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2hfbihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG4pCit7CisJdW5zaWduZWQgbG9uZyBoID0gMDsKKwl1bnNpZ25lZCBsb25nIGc7CisJdW5zaWduZWQgY2hhciBjaDsKKworCXdoaWxlIChuID4gMCkgeworCQljaCA9ICpuYW1lKys7CisJCWggPSAoaCA8PCA0KSArIGNoOworCQlnID0gKGggJiAweGYwMDAwMDAwKTsKKwkJaWYgKGcgIT0gMCkgeworCQkJaCBePSBnID4+IDI0OworCQkJaCAmPSB+ZzsKKwkJfQorCQluLS07CisJfQorCXJldHVybiBoOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBGQVNUX0ZVTkMgb2JqX2VsZl9oYXNoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIG9ial9lbGZfaGFzaF9uKG5hbWUsIHN0cmxlbihuYW1lKSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworLyogU3RyaW5nIGNvbXBhcmlzb24gZm9yIG5vbi1jby12ZXJzaW9uZWQga2VybmVsIGFuZCBtb2R1bGUuICAqLworCitzdGF0aWMgaW50IG5jdl9zdHJjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKwlzaXplX3QgYWxlbiA9IHN0cmxlbihhKSwgYmxlbiA9IHN0cmxlbihiKTsKKworCWlmIChibGVuID09IGFsZW4gKyAxMCAmJiBiW2FsZW5dID09ICdfJyAmJiBiW2FsZW4gKyAxXSA9PSAnUicpCisJCXJldHVybiBzdHJuY21wKGEsIGIsIGFsZW4pOworCWVsc2UgaWYgKGFsZW4gPT0gYmxlbiArIDEwICYmIGFbYmxlbl0gPT0gJ18nICYmIGFbYmxlbiArIDFdID09ICdSJykKKwkJcmV0dXJuIHN0cm5jbXAoYSwgYiwgYmxlbik7CisJZWxzZQorCQlyZXR1cm4gc3RyY21wKGEsIGIpOworfQorCisvKiBTdHJpbmcgaGFzaGluZyBmb3Igbm9uLWNvLXZlcnNpb25lZCBrZXJuZWwgYW5kIG1vZHVsZS4gIEhlcmUKKyAgIHdlIGFyZSBzaW1wbHkgZm9yY2VkIHRvIGRyb3AgdGhlIGNyYyBmcm9tIHRoZSBoYXNoLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgRkFTVF9GVU5DIG5jdl9zeW1ib2xfaGFzaChjb25zdCBjaGFyICpzdHIpCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOworCWlmIChsZW4gPiAxMCAmJiBzdHJbbGVuIC0gMTBdID09ICdfJyAmJiBzdHJbbGVuIC0gOV0gPT0gJ1InKQorCQlsZW4gLT0gMTA7CisJcmV0dXJuIG9ial9lbGZfaGFzaF9uKHN0ciwgbGVuKTsKK30KKworc3RhdGljIHZvaWQKK29ial9zZXRfc3ltYm9sX2NvbXBhcmUoc3RydWN0IG9ial9maWxlICpmLAorCQlpbnQgKCpjbXApIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCisJCXVuc2lnbmVkIGxvbmcgKCpoYXNoKSAoY29uc3QgY2hhciAqKSBGQVNUX0ZVTkMpCit7CisJaWYgKGNtcCkKKwkJZi0+c3ltYm9sX2NtcCA9IGNtcDsKKwlpZiAoaGFzaCkgeworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqdG1wdGFiW0hBU0hfQlVDS0VUU10sICpzeW0sICpuZXh0OworCQlpbnQgaTsKKworCQlmLT5zeW1ib2xfaGFzaCA9IGhhc2g7CisKKwkJbWVtY3B5KHRtcHRhYiwgZi0+c3ltdGFiLCBzaXplb2YodG1wdGFiKSk7CisJCW1lbXNldChmLT5zeW10YWIsIDAsIHNpemVvZihmLT5zeW10YWIpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpIHsKKwkJCWZvciAoc3ltID0gdG1wdGFiW2ldOyBzeW07IHN5bSA9IG5leHQpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGggPSBoYXNoKHN5bS0+bmFtZSkgJSBIQVNIX0JVQ0tFVFM7CisJCQkJbmV4dCA9IHN5bS0+bmV4dDsKKwkJCQlzeW0tPm5leHQgPSBmLT5zeW10YWJbaF07CisJCQkJZi0+c3ltdGFiW2hdID0gc3ltOworCQkJfQorCQl9CisJfQorfQorCisjZW5kaWYgLyogRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLworCitzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKgorb2JqX2FkZF9zeW1ib2woc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lLAorCQl1bnNpZ25lZCBsb25nIHN5bWlkeCwgaW50IGluZm8sCisJCWludCBzZWNpZHgsIEVsZlcoQWRkcikgdmFsdWUsCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGYtPnN5bWJvbF9oYXNoKG5hbWUpICUgSEFTSF9CVUNLRVRTOworCWludCBuX3R5cGUgPSBFTEZfU1RfVFlQRShpbmZvKTsKKwlpbnQgbl9iaW5kaW5nID0gRUxGX1NUX0JJTkQoaW5mbyk7CisKKwlmb3IgKHN5bSA9IGYtPnN5bXRhYltoYXNoXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIHsKKwkJaWYgKGYtPnN5bWJvbF9jbXAoc3ltLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpbnQgb19zZWNpZHggPSBzeW0tPnNlY2lkeDsKKwkJCWludCBvX2luZm8gPSBzeW0tPmluZm87CisJCQlpbnQgb190eXBlID0gRUxGX1NUX1RZUEUob19pbmZvKTsKKwkJCWludCBvX2JpbmRpbmcgPSBFTEZfU1RfQklORChvX2luZm8pOworCisJCQkvKiBBIHJlZGVmaW5pdGlvbiEgIElzIGl0IGxlZ2FsPyAgKi8KKworCQkJaWYgKHNlY2lkeCA9PSBTSE5fVU5ERUYpCisJCQkJcmV0dXJuIHN5bTsKKwkJCWVsc2UgaWYgKG9fc2VjaWR4ID09IFNITl9VTkRFRikKKwkJCQlnb3RvIGZvdW5kOworCQkJZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9HTE9CQUwgJiYgb19iaW5kaW5nID09IFNUQl9MT0NBTCkgeworCQkJCS8qIENvcGUgd2l0aCBsb2NhbCBhbmQgZ2xvYmFsIHN5bWJvbHMgb2YgdGhlIHNhbWUgbmFtZQorCQkJCSAgIGluIHRoZSBzYW1lIG9iamVjdCBmaWxlLCBhcyBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZAorCQkJCSAgIGJ5IGxkIC1yLiAgVGhlIG9ubHkgcmVhc29uIGxvY2FscyBhcmUgbm93IHNlZW4gYXQgdGhpcworCQkJCSAgIGxldmVsIGF0IGFsbCBpcyBzbyB0aGF0IHdlIGNhbiBkbyBzZW1pLXNlbnNpYmxlIHRoaW5ncworCQkJCSAgIHdpdGggcGFyYW1ldGVycy4gICovCisKKwkJCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqbnN5bSwgKipwOworCisJCQkJbnN5bSA9IGFyY2hfbmV3X3N5bWJvbCgpOworCQkJCW5zeW0tPm5leHQgPSBzeW0tPm5leHQ7CisJCQkJbnN5bS0+a3N5bWlkeCA9IC0xOworCisJCQkJLyogRXhjaXNlIHRoZSBvbGQgKGxvY2FsKSBzeW1ib2wgZnJvbSB0aGUgaGFzaCBjaGFpbi4gICovCisJCQkJZm9yIChwID0gJmYtPnN5bXRhYltoYXNoXTsgKnAgIT0gc3ltOyBwID0gJigqcCktPm5leHQpCisJCQkJCWNvbnRpbnVlOworCQkJCSpwID0gc3ltID0gbnN5bTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfSBlbHNlIGlmIChuX2JpbmRpbmcgPT0gU1RCX0xPQ0FMKSB7CisJCQkJLyogQW5vdGhlciBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuCisJCQkJICAgSnVzdCBhZGQgdGhpcyB0byB0aGUgbG9jYWwgdGFibGUuICAqLworCQkJCXN5bSA9IGFyY2hfbmV3X3N5bWJvbCgpOworCQkJCXN5bS0+bmV4dCA9IE5VTEw7CisJCQkJc3ltLT5rc3ltaWR4ID0gLTE7CisJCQkJZi0+bG9jYWxfc3ltdGFiW3N5bWlkeF0gPSBzeW07CisJCQkJZ290byBmb3VuZDsKKwkJCX0gZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9XRUFLKQorCQkJCXJldHVybiBzeW07CisJCQllbHNlIGlmIChvX2JpbmRpbmcgPT0gU1RCX1dFQUspCisJCQkJZ290byBmb3VuZDsKKwkJCS8qIERvbid0IHVuaWZ5IENPTU1PTiBzeW1ib2xzIHdpdGggb2JqZWN0IHR5cGVzIHRoZSBwcm9ncmFtbWVyCisJCQkgICBkb2Vzbid0IGV4cGVjdC4gICovCisJCQllbHNlIGlmIChzZWNpZHggPT0gU0hOX0NPTU1PTgorCQkJCQkmJiAob190eXBlID09IFNUVF9OT1RZUEUgfHwgb190eXBlID09IFNUVF9PQkpFQ1QpKQorCQkJCXJldHVybiBzeW07CisJCQllbHNlIGlmIChvX3NlY2lkeCA9PSBTSE5fQ09NTU9OCisJCQkJCSYmIChuX3R5cGUgPT0gU1RUX05PVFlQRSB8fCBuX3R5cGUgPT0gU1RUX09CSkVDVCkpCisJCQkJZ290byBmb3VuZDsKKwkJCWVsc2UgeworCQkJCS8qIERvbid0IHJlcG9ydCBhbiBlcnJvciBpZiB0aGUgc3ltYm9sIGlzIGNvbWluZyBmcm9tCisJCQkJICAgdGhlIGtlcm5lbCBvciBzb21lIGV4dGVybmFsIG1vZHVsZS4gICovCisJCQkJaWYgKHNlY2lkeCA8PSBTSE5fSElSRVNFUlZFKQorCQkJCQliYl9lcnJvcl9tc2coIiVzIG11bHRpcGx5IGRlZmluZWQiLCBuYW1lKTsKKwkJCQlyZXR1cm4gc3ltOworCQkJfQorCQl9CisJfQorCisJLyogQ29tcGxldGVseSBuZXcgc3ltYm9sLiAgKi8KKwlzeW0gPSBhcmNoX25ld19zeW1ib2woKTsKKwlzeW0tPm5leHQgPSBmLT5zeW10YWJbaGFzaF07CisJZi0+c3ltdGFiW2hhc2hdID0gc3ltOworCXN5bS0+a3N5bWlkeCA9IC0xOworCWlmIChFTEZfU1RfQklORChpbmZvKSA9PSBTVEJfTE9DQUwgJiYgc3ltaWR4ICE9ICh1bnNpZ25lZCBsb25nKSgtMSkpIHsKKwkJaWYgKHN5bWlkeCA+PSBmLT5sb2NhbF9zeW10YWJfc2l6ZSkKKwkJCWJiX2Vycm9yX21zZygibG9jYWwgc3ltYm9sICVzIHdpdGggaW5kZXggJWxkIGV4Y2VlZHMgbG9jYWxfc3ltdGFiX3NpemUgJWxkIiwKKwkJCQkJbmFtZSwgKGxvbmcpIHN5bWlkeCwgKGxvbmcpIGYtPmxvY2FsX3N5bXRhYl9zaXplKTsKKwkJZWxzZQorCQkJZi0+bG9jYWxfc3ltdGFiW3N5bWlkeF0gPSBzeW07CisJfQorCitmb3VuZDoKKwlzeW0tPm5hbWUgPSBuYW1lOworCXN5bS0+dmFsdWUgPSB2YWx1ZTsKKwlzeW0tPnNpemUgPSBzaXplOworCXN5bS0+c2VjaWR4ID0gc2VjaWR4OworCXN5bS0+aW5mbyA9IGluZm87CisKKwlyZXR1cm4gc3ltOworfQorCitzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKgorb2JqX2ZpbmRfc3ltYm9sKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGYtPnN5bWJvbF9oYXNoKG5hbWUpICUgSEFTSF9CVUNLRVRTOworCisJZm9yIChzeW0gPSBmLT5zeW10YWJbaGFzaF07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQorCQlpZiAoZi0+c3ltYm9sX2NtcChzeW0tPm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gc3ltOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgRWxmVyhBZGRyKSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKHN0cnVjdCBvYmpfZmlsZSAqIGYsIHN0cnVjdCBvYmpfc3ltYm9sICogc3ltKQoreworCWlmIChzeW0pIHsKKwkJaWYgKHN5bS0+c2VjaWR4ID49IFNITl9MT1JFU0VSVkUpCisJCQlyZXR1cm4gc3ltLT52YWx1ZTsKKwkJcmV0dXJuIHN5bS0+dmFsdWUgKyBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF0tPmhlYWRlci5zaF9hZGRyOworCX0KKwkvKiBBcyBhIHNwZWNpYWwgY2FzZSwgYSBOVUxMIHN5bSBoYXMgdmFsdWUgemVyby4gICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9maW5kX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpLCBuID0gZi0+aGVhZGVyLmVfc2hudW07CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCQlpZiAoc3RyY21wKGYtPnNlY3Rpb25zW2ldLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIGYtPnNlY3Rpb25zW2ldOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG9ial9sb2FkX29yZGVyX3ByaW8oc3RydWN0IG9ial9zZWN0aW9uICphKQoreworCXVuc2lnbmVkIGxvbmcgYWYsIGFjOworCisJYWYgPSBhLT5oZWFkZXIuc2hfZmxhZ3M7CisKKwlhYyA9IDA7CisJaWYgKGEtPm5hbWVbMF0gIT0gJy4nIHx8IHN0cmxlbihhLT5uYW1lKSAhPSAxMAorCSB8fCBzdHJjbXAoYS0+bmFtZSArIDUsICIuaW5pdCIpICE9IDAKKwkpIHsKKwkJYWMgfD0gMzI7CisJfQorCWlmIChhZiAmIFNIRl9BTExPQykKKwkJYWMgfD0gMTY7CisJaWYgKCEoYWYgJiBTSEZfV1JJVEUpKQorCQlhYyB8PSA4OworCWlmIChhZiAmIFNIRl9FWEVDSU5TVFIpCisJCWFjIHw9IDQ7CisJaWYgKGEtPmhlYWRlci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCisJCWFjIHw9IDI7CisKKwlyZXR1cm4gYWM7Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIHN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqKnA7CisJaW50IHByaW8gPSBvYmpfbG9hZF9vcmRlcl9wcmlvKHNlYyk7CisJZm9yIChwID0gZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQ7ICpwOyBwID0gJigqcCktPmxvYWRfbmV4dCkKKwkJaWYgKG9ial9sb2FkX29yZGVyX3ByaW8oKnApIDwgcHJpbykKKwkJCWJyZWFrOworCXNlYy0+bG9hZF9uZXh0ID0gKnA7CisJKnAgPSBzZWM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmhlbHBlcl9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBuZXdpZHggPSBmLT5oZWFkZXIuZV9zaG51bSsrOworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCisJZi0+c2VjdGlvbnMgPSB4cmVhbGxvY192ZWN0b3IoZi0+c2VjdGlvbnMsIDIsIG5ld2lkeCk7CisJZi0+c2VjdGlvbnNbbmV3aWR4XSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKKworCXNlYy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisJc2VjLT5oZWFkZXIuc2hfZmxhZ3MgPSBTSEZfV1JJVEUgfCBTSEZfQUxMT0M7CisJc2VjLT5oZWFkZXIuc2hfc2l6ZSA9IHNpemU7CisJc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gYWxpZ247CisJc2VjLT5uYW1lID0gbmFtZTsKKwlzZWMtPmlkeCA9IG5ld2lkeDsKKwlpZiAoc2l6ZSkKKwkJc2VjLT5jb250ZW50cyA9IHh6YWxsb2Moc2l6ZSk7CisKKwlyZXR1cm4gc2VjOworfQorCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCXNlYyA9IGhlbHBlcl9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsIG5hbWUsIGFsaWduLCBzaXplKTsKKwlvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihmLCBzZWMpOworCXJldHVybiBzZWM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uX2ZpcnN0KHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCisJc2VjID0gaGVscGVyX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgbmFtZSwgYWxpZ24sIHNpemUpOworCXNlYy0+bG9hZF9uZXh0ID0gZi0+bG9hZF9vcmRlcjsKKwlmLT5sb2FkX29yZGVyID0gc2VjOworCWlmIChmLT5sb2FkX29yZGVyX3NlYXJjaF9zdGFydCA9PSAmZi0+bG9hZF9vcmRlcikKKwkJZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPSAmc2VjLT5sb2FkX25leHQ7CisKKwlyZXR1cm4gc2VjOworfQorCitzdGF0aWMgdm9pZCAqb2JqX2V4dGVuZF9zZWN0aW9uKHN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjLCB1bnNpZ25lZCBsb25nIG1vcmUpCit7CisJdW5zaWduZWQgbG9uZyBvbGRzaXplID0gc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwlpZiAobW9yZSkgeworCQlzZWMtPmhlYWRlci5zaF9zaXplICs9IG1vcmU7CisJCXNlYy0+Y29udGVudHMgPSB4cmVhbGxvYyhzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplKTsKKwl9CisJcmV0dXJuIHNlYy0+Y29udGVudHMgKyBvbGRzaXplOworfQorCisKKy8qIENvbmRpdGlvbmFsbHkgYWRkIHRoZSBzeW1ib2xzIGZyb20gdGhlIGdpdmVuIHN5bWJvbCBzZXQgdG8gdGhlCisgICBuZXcgbW9kdWxlLiAgKi8KKworc3RhdGljIGludCBhZGRfc3ltYm9sc19mcm9tKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJaW50IGlkeCwKKwkJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zLAorCQlzaXplX3QgbnN5bXMpCit7CisJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzOworCXNpemVfdCBpOworCWludCB1c2VkID0gMDsKKyNpZmRlZiBTWU1CT0xfUFJFRklYCisJY2hhciAqbmFtZV9idWYgPSBOVUxMOworCXNpemVfdCBuYW1lX2FsbG9jZWRfc2l6ZSA9IDA7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQorCWludCBncGw7CisKKwlncGwgPSBvYmpfZ3BsX2xpY2Vuc2UoZiwgTlVMTCkgPT0gMDsKKyNlbmRpZgorCWZvciAoaSA9IDAsIHMgPSBzeW1zOyBpIDwgbnN5bXM7ICsraSwgKytzKSB7CisJCS8qIE9ubHkgYWRkIHN5bWJvbHMgdGhhdCBhcmUgYWxyZWFkeSBtYXJrZWQgZXh0ZXJuYWwuCisJCSAgIElmIHdlIG92ZXJyaWRlIGxvY2FscyB3ZSBtYXkgY2F1c2UgcHJvYmxlbXMgZm9yCisJCSAgIGFyZ3VtZW50IGluaXRpYWxpemF0aW9uLiAgV2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIGZhbHNlCisJCSAgIGRlcGVuZGVuY3kgb24gdGhlIG1vZHVsZS4gICovCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJCWNoYXIgKm5hbWU7CisKKwkJLyogR1BMIGxpY2Vuc2VkIG1vZHVsZXMgY2FuIHVzZSBzeW1ib2xzIGV4cG9ydGVkIHdpdGgKKwkJICogRVhQT1JUX1NZTUJPTF9HUEwsIHNvIGlnbm9yZSBhbnkgR1BMT05MWV8gcHJlZml4IG9uIHRoZQorCQkgKiBleHBvcnRlZCBuYW1lcy4gIE5vbi1HUEwgbW9kdWxlcyBuZXZlciBzZWUgYW55IEdQTE9OTFlfCisJCSAqIHN5bWJvbHMgc28gdGhleSBjYW5ub3QgZnVkZ2UgaXQgYnkgYWRkaW5nIHRoZSBwcmVmaXggb24KKwkJICogdGhlaXIgcmVmZXJlbmNlcy4KKwkJICovCisJCWlmIChzdHJuY21wKChjaGFyICopcy0+bmFtZSwgIkdQTE9OTFlfIiwgOCkgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCisJCQlpZiAoZ3BsKQorCQkJCXMtPm5hbWUgKz0gODsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCWNvbnRpbnVlOworCQl9CisJCW5hbWUgPSAoY2hhciAqKXMtPm5hbWU7CisKKyNpZmRlZiBTWU1CT0xfUFJFRklYCisJCS8qIFByZXBlbmQgU1lNQk9MX1BSRUZJWCB0byB0aGUgc3ltYm9sJ3MgbmFtZSAodGhlCisJCSAgIGtlcm5lbCBleHBvcnRzIGBDIG5hbWVzJywgYnV0IG1vZHVsZSBvYmplY3QgZmlsZXMKKwkJICAgcmVmZXJlbmNlIGBsaW5rZXIgbmFtZXMnKS4gICovCisJCXNpemVfdCBleHRyYSA9IHNpemVvZiBTWU1CT0xfUFJFRklYOworCQlzaXplX3QgbmFtZV9zaXplID0gc3RybGVuKG5hbWUpICsgZXh0cmE7CisJCWlmIChuYW1lX3NpemUgPiBuYW1lX2FsbG9jZWRfc2l6ZSkgeworCQkJbmFtZV9hbGxvY2VkX3NpemUgPSBuYW1lX3NpemUgKiAyOworCQkJbmFtZV9idWYgPSBhbGxvY2EobmFtZV9hbGxvY2VkX3NpemUpOworCQl9CisJCXN0cmNweShuYW1lX2J1ZiwgU1lNQk9MX1BSRUZJWCk7CisJCXN0cmNweShuYW1lX2J1ZiArIGV4dHJhIC0gMSwgbmFtZSk7CisJCW5hbWUgPSBuYW1lX2J1ZjsKKyNlbmRpZgorCisJCXN5bSA9IG9ial9maW5kX3N5bWJvbChmLCBuYW1lKTsKKwkJaWYgKHN5bSAmJiAhKEVMRl9TVF9CSU5EKHN5bS0+aW5mbykgPT0gU1RCX0xPQ0FMKSkgeworI2lmZGVmIFNZTUJPTF9QUkVGSVgKKwkJCS8qIFB1dCBOQU1FX0JVRiBpbnRvIG1vcmUgcGVybWFuZW50IHN0b3JhZ2UuICAqLworCQkJbmFtZSA9IHhtYWxsb2MobmFtZV9zaXplKTsKKwkJCXN0cmNweShuYW1lLCBuYW1lX2J1Zik7CisjZW5kaWYKKwkJCXN5bSA9IG9ial9hZGRfc3ltYm9sKGYsIG5hbWUsIC0xLAorCQkJCQlFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLAorCQkJCQkJU1RUX05PVFlQRSksCisJCQkJCWlkeCwgcy0+dmFsdWUsIDApOworCQkJLyogRGlkIG91ciBzeW1ib2wganVzdCBnZXQgaW5zdGFsbGVkPyAgSWYgc28sIG1hcmsgdGhlCisJCQkgICBtb2R1bGUgYXMgInVzZWQiLiAgKi8KKwkJCWlmIChzeW0tPnNlY2lkeCA9PSBpZHgpCisJCQkJdXNlZCA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gdXNlZDsKK30KKworc3RhdGljIHZvaWQgYWRkX2tlcm5lbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKwlzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlICptOworCWludCBpLCBudXNlZCA9IDA7CisKKwkvKiBBZGQgbW9kdWxlIHN5bWJvbHMgZmlyc3QuICAqLworCisJZm9yIChpID0gMCwgbSA9IGV4dF9tb2R1bGVzOyBpIDwgbl9leHRfbW9kdWxlczsgKytpLCArK20pIHsKKwkJaWYgKG0tPm5zeW1zCisJCSAmJiBhZGRfc3ltYm9sc19mcm9tKGYsIFNITl9ISVJFU0VSVkUgKyAyICsgaSwgbS0+c3ltcywgbS0+bnN5bXMpCisJCSkgeworCQkJbS0+dXNlZCA9IDE7CisJCQkrK251c2VkOworCQl9CisJfQorCisJbl9leHRfbW9kdWxlc191c2VkID0gbnVzZWQ7CisKKwkvKiBBbmQgZmluYWxseSB0aGUgc3ltYm9scyBmcm9tIHRoZSBrZXJuZWwgcHJvcGVyLiAgKi8KKworCWlmIChua3N5bXMpCisJCWFkZF9zeW1ib2xzX2Zyb20oZiwgU0hOX0hJUkVTRVJWRSArIDEsIGtzeW1zLCBua3N5bXMpOworfQorCitzdGF0aWMgY2hhciAqZ2V0X21vZGluZm9fdmFsdWUoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICprZXkpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisJY2hhciAqcCwgKnYsICpuLCAqZXA7CisJc2l6ZV90IGtsZW4gPSBzdHJsZW4oa2V5KTsKKworCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5tb2RpbmZvIik7CisJaWYgKHNlYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gc2VjLT5jb250ZW50czsKKwllcCA9IHAgKyBzZWMtPmhlYWRlci5zaF9zaXplOworCXdoaWxlIChwIDwgZXApIHsKKwkJdiA9IHN0cmNocihwLCAnPScpOworCQluID0gc3RyY2hyKHAsICdcMCcpOworCQlpZiAodikgeworCQkJaWYgKHAgKyBrbGVuID09IHYgJiYgc3RybmNtcChwLCBrZXksIGtsZW4pID09IDApCisJCQkJcmV0dXJuIHYgKyAxOworCQl9IGVsc2UgeworCQkJaWYgKHAgKyBrbGVuID09IG4gJiYgc3RyY21wKHAsIGtleSkgPT0gMCkKKwkJCQlyZXR1cm4gbjsKKwkJfQorCQlwID0gbiArIDE7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEZ1bmN0aW9ucyByZWxhdGluZyB0byBtb2R1bGUgbG9hZGluZyBhZnRlciAyLjEuMTguICAqLworCisvKiBGcm9tIExpbnV4LTIuNiBzb3VyY2VzICovCisvKiBZb3UgY2FuIHVzZSAiIGFyb3VuZCBzcGFjZXMsIGJ1dCBjYW4ndCBlc2NhcGUgIi4gKi8KKy8qIEh5cGhlbnMgYW5kIHVuZGVyc2NvcmVzIGVxdWl2YWxlbnQgaW4gcGFyYW1ldGVyIG5hbWVzLiAqLworc3RhdGljIGNoYXIgKm5leHRfYXJnKGNoYXIgKmFyZ3MsIGNoYXIgKipwYXJhbSwgY2hhciAqKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgZXF1YWxzID0gMDsKKwlpbnQgaW5fcXVvdGUgPSAwLCBxdW90ZWQgPSAwOworCWNoYXIgKm5leHQ7CisKKwlpZiAoKmFyZ3MgPT0gJyInKSB7CisJCWFyZ3MrKzsKKwkJaW5fcXVvdGUgPSAxOworCQlxdW90ZWQgPSAxOworCX0KKworCWZvciAoaSA9IDA7IGFyZ3NbaV07IGkrKykgeworCQlpZiAoYXJnc1tpXSA9PSAnICcgJiYgIWluX3F1b3RlKQorCQkJYnJlYWs7CisJCWlmIChlcXVhbHMgPT0gMCkgeworCQkJaWYgKGFyZ3NbaV0gPT0gJz0nKQorCQkJCWVxdWFscyA9IGk7CisJCX0KKwkJaWYgKGFyZ3NbaV0gPT0gJyInKQorCQkJaW5fcXVvdGUgPSAhaW5fcXVvdGU7CisJfQorCisJKnBhcmFtID0gYXJnczsKKwlpZiAoIWVxdWFscykKKwkJKnZhbCA9IE5VTEw7CisJZWxzZSB7CisJCWFyZ3NbZXF1YWxzXSA9ICdcMCc7CisJCSp2YWwgPSBhcmdzICsgZXF1YWxzICsgMTsKKworCQkvKiBEb24ndCBpbmNsdWRlIHF1b3RlcyBpbiB2YWx1ZS4gKi8KKwkJaWYgKCoqdmFsID09ICciJykgeworCQkJKCp2YWwpKys7CisJCQlpZiAoYXJnc1tpLTFdID09ICciJykKKwkJCQlhcmdzW2ktMV0gPSAnXDAnOworCQl9CisJCWlmIChxdW90ZWQgJiYgYXJnc1tpLTFdID09ICciJykKKwkJCWFyZ3NbaS0xXSA9ICdcMCc7CisJfQorCisJaWYgKGFyZ3NbaV0pIHsKKwkJYXJnc1tpXSA9ICdcMCc7CisJCW5leHQgPSBhcmdzICsgaSArIDE7CisJfSBlbHNlCisJCW5leHQgPSBhcmdzICsgaTsKKworCS8qIENoZXcgdXAgdHJhaWxpbmcgc3BhY2VzLiAqLworCXJldHVybiBza2lwX3doaXRlc3BhY2UobmV4dCk7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfcHJvY2Vzc19tb2R1bGVfYXJndW1lbnRzKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICp4b3B0aW9ucywgKnBvczsKKwljaGFyICpwYXJhbSwgKnZhbDsKKworCXhvcHRpb25zID0gcG9zID0geHN0cmR1cChza2lwX3doaXRlc3BhY2Uob3B0aW9ucykpOworCXdoaWxlICgqcG9zKSB7CisJCXVuc2lnbmVkIGxvbmcgY2hhcnNzaXplID0gMDsKKwkJY2hhciAqdG1wLCAqY29udGVudHMsICpsb2MsICpwaW5mbywgKnA7CisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJCWludCBtaW4sIG1heCwgbiwgbGVuOworCisJCXBvcyA9IG5leHRfYXJnKHBvcywgJnBhcmFtLCAmdmFsKTsKKworCQl0bXAgPSB4YXNwcmludGYoInBhcm1fJXMiLCBwYXJhbSk7CisJCXBpbmZvID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgdG1wKTsKKwkJZnJlZSh0bXApOworCQlpZiAocGluZm8gPT0gTlVMTCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHBhcmFtZXRlciAlcyIsIHBhcmFtKTsKKworI2lmZGVmIFNZTUJPTF9QUkVGSVgKKwkJdG1wID0geGFzcHJpbnRmKFNZTUJPTF9QUkVGSVggIiVzIiwgcGFyYW0pOworCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgdG1wKTsKKwkJZnJlZSh0bXApOworI2Vsc2UKKwkJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIHBhcmFtKTsKKyNlbmRpZgorCisJCS8qIEFsc28gY2hlY2sgdGhhdCB0aGUgcGFyYW1ldGVyIHdhcyBub3QgcmVzb2x2ZWQgZnJvbSB0aGUga2VybmVsLiAgKi8KKwkJaWYgKHN5bSA9PSBOVUxMIHx8IHN5bS0+c2VjaWR4ID4gU0hOX0hJUkVTRVJWRSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW1ib2wgZm9yIHBhcmFtZXRlciAlcyBub3QgZm91bmQiLCBwYXJhbSk7CisKKwkJLyogTnVtYmVyIG9mIHBhcmFtZXRlcnMgKi8KKwkJbWluID0gbWF4ID0gMTsKKwkJaWYgKGlzZGlnaXQoKnBpbmZvKSkgeworCQkJbWluID0gbWF4ID0gc3RydG91bChwaW5mbywgJnBpbmZvLCAxMCk7CisJCQlpZiAoKnBpbmZvID09ICctJykKKwkJCQltYXggPSBzdHJ0b3VsKHBpbmZvICsgMSwgJnBpbmZvLCAxMCk7CisJCX0KKworCQljb250ZW50cyA9IGYtPnNlY3Rpb25zW3N5bS0+c2VjaWR4XS0+Y29udGVudHM7CisJCWxvYyA9IGNvbnRlbnRzICsgc3ltLT52YWx1ZTsKKworCQlpZiAoKnBpbmZvID09ICdjJykgeworCQkJaWYgKCFpc2RpZ2l0KHBpbmZvWzFdKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwYXJhbWV0ZXIgdHlwZSAnYycgZm9yICVzIG11c3QgYmUgZm9sbG93ZWQgYnkiCisJCQkJCQkgICAgICIgdGhlIG1heGltdW0gc2l6ZSIsIHBhcmFtKTsKKwkJCX0KKwkJCWNoYXJzc2l6ZSA9IHN0cnRvdWwocGluZm8gKyAxLCBOVUxMLCAxMCk7CisJCX0KKworCQlpZiAodmFsID09IE5VTEwpIHsKKwkJCWlmICgqcGluZm8gIT0gJ2InKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJhcmd1bWVudCBleHBlY3RlZCBmb3IgcGFyYW1ldGVyICVzIiwgcGFyYW0pOworCQkJdmFsID0gKGNoYXIgKikgIjEiOworCQl9CisKKwkJLyogUGFyc2UgcGFyYW1ldGVyIHZhbHVlcyAqLworCQluID0gMDsKKwkJcCA9IHZhbDsKKwkJd2hpbGUgKCpwKSB7CisJCQljaGFyIHN2X2NoOworCQkJY2hhciAqZW5kcDsKKworCQkJaWYgKCsrbiA+IG1heCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgdmFsdWVzIGZvciAlcyAobWF4ICVkKSIsIHBhcmFtLCBtYXgpOworCisJCQlzd2l0Y2ggKCpwaW5mbykgeworCQkJY2FzZSAncyc6CisJCQkJbGVuID0gc3RyY3NwbihwLCAiLCIpOworCQkJCXN2X2NoID0gcFtsZW5dOworCQkJCXBbbGVuXSA9ICdcMCc7CisJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzeW0tPnNlY2lkeCwKKwkJCQkJCSBsb2MgLSBjb250ZW50cywgcCk7CisJCQkJbG9jICs9IHRndF9zaXplb2ZfY2hhcl9wOworCQkJCXAgKz0gbGVuOworCQkJCSpwID0gc3ZfY2g7CisJCQkJYnJlYWs7CisJCQljYXNlICdjJzoKKwkJCQlsZW4gPSBzdHJjc3BuKHAsICIsIik7CisJCQkJc3ZfY2ggPSBwW2xlbl07CisJCQkJcFtsZW5dID0gJ1wwJzsKKwkJCQlpZiAobGVuID49IGNoYXJzc2l6ZSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0cmluZyB0b28gbG9uZyBmb3IgJXMgKG1heCAlbGQpIiwgcGFyYW0sCisJCQkJCQkJICAgICBjaGFyc3NpemUgLSAxKTsKKwkJCQlzdHJjcHkoKGNoYXIgKikgbG9jLCBwKTsKKwkJCQlsb2MgKz0gY2hhcnNzaXplOworCQkJCXAgKz0gbGVuOworCQkJCSpwID0gc3ZfY2g7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQkqbG9jKysgPSBzdHJ0b3VsKHAsICZlbmRwLCAwKTsKKwkJCQlwID0gZW5kcDsgLyogZ2NjIGxpa2VzIHRlbXAgdmFyIGZvciAmZW5kcCAqLworCQkJCWJyZWFrOworCQkJY2FzZSAnaCc6CisJCQkJKihzaG9ydCAqKSBsb2MgPSBzdHJ0b3VsKHAsICZlbmRwLCAwKTsKKwkJCQlsb2MgKz0gdGd0X3NpemVvZl9zaG9ydDsKKwkJCQlwID0gZW5kcDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2knOgorCQkJCSooaW50ICopIGxvYyA9IHN0cnRvdWwocCwgJmVuZHAsIDApOworCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX2ludDsKKwkJCQlwID0gZW5kcDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCSoobG9uZyAqKSBsb2MgPSBzdHJ0b3VsKHAsICZlbmRwLCAwKTsKKwkJCQlsb2MgKz0gdGd0X3NpemVvZl9sb25nOworCQkJCXAgPSBlbmRwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBwYXJhbWV0ZXIgdHlwZSAnJWMnIGZvciAlcyIsCisJCQkJCQkgICAgICpwaW5mbywgcGFyYW0pOworCQkJfQorCisJCQlwID0gc2tpcF93aGl0ZXNwYWNlKHApOworCQkJaWYgKCpwICE9ICcsJykKKwkJCQlicmVhazsKKwkJCXAgPSBza2lwX3doaXRlc3BhY2UocCArIDEpOworCQl9CisKKwkJaWYgKG4gPCBtaW4pCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicGFyYW1ldGVyICVzIHJlcXVpcmVzIGF0IGxlYXN0ICVkIGFyZ3VtZW50cyIsIHBhcmFtLCBtaW4pOworCQlpZiAoKnAgIT0gJ1wwJykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGFyZ3VtZW50IHN5bnRheCBmb3IgJXMiLCBwYXJhbSk7CisJfQorCisJZnJlZSh4b3B0aW9ucyk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworc3RhdGljIGludCBuZXdfaXNfbW9kdWxlX2NoZWNrc3VtbWVkKHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKwljb25zdCBjaGFyICpwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgInVzaW5nX2NoZWNrc3VtcyIpOworCWlmIChwKQorCQlyZXR1cm4geGF0b2kocCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCB0aGUgbW9kdWxlJ3Mga2VybmVsIHZlcnNpb24gaW4gdGhlIGNhbm9uaWNhbCBpbnRlZ2VyIGZvcm0uICAqLworCitzdGF0aWMgaW50CituZXdfZ2V0X21vZHVsZV92ZXJzaW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciBzdHJbU1RSVkVSU0lPTkxFTl0pCit7CisJY2hhciAqcCwgKnE7CisJaW50IGEsIGIsIGM7CisKKwlwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgImtlcm5lbF92ZXJzaW9uIik7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXNhZmVfc3RybmNweShzdHIsIHAsIFNUUlZFUlNJT05MRU4pOworCisJYSA9IHN0cnRvdWwocCwgJnAsIDEwKTsKKwlpZiAoKnAgIT0gJy4nKQorCQlyZXR1cm4gLTE7CisJYiA9IHN0cnRvdWwocCArIDEsICZwLCAxMCk7CisJaWYgKCpwICE9ICcuJykKKwkJcmV0dXJuIC0xOworCWMgPSBzdHJ0b3VsKHAgKyAxLCAmcSwgMTApOworCWlmIChwICsgMSA9PSBxKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYSA8PCAxNiB8IGIgPDwgOCB8IGM7Cit9CisKKyNlbmRpZiAgIC8qIEZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KKworCisvKiBGZXRjaCB0aGUgbG9hZGVkIG1vZHVsZXMsIGFuZCBhbGwgY3VycmVudGx5IGV4cG9ydGVkIHN5bWJvbHMuICAqLworCitzdGF0aWMgdm9pZCBuZXdfZ2V0X2tlcm5lbF9zeW1ib2xzKHZvaWQpCit7CisJY2hhciAqbW9kdWxlX25hbWVzLCAqbW47CisJc3RydWN0IGV4dGVybmFsX21vZHVsZSAqbW9kdWxlcywgKm07CisJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zLCAqczsKKwlzaXplX3QgcmV0LCBidWZzaXplLCBubW9kLCBuc3ltcywgaSwgajsKKworCS8qIENvbGxlY3QgdGhlIGxvYWRlZCBtb2R1bGVzLiAgKi8KKworCWJ1ZnNpemUgPSAyNTY7CisJbW9kdWxlX25hbWVzID0geG1hbGxvYyhidWZzaXplKTsKKworIHJldHJ5X21vZHVsZXNfbG9hZDoKKwlpZiAocXVlcnlfbW9kdWxlKE5VTEwsIFFNX01PRFVMRVMsIG1vZHVsZV9uYW1lcywgYnVmc2l6ZSwgJnJldCkpIHsKKwkJaWYgKGVycm5vID09IEVOT1NQQyAmJiBidWZzaXplIDwgcmV0KSB7CisJCQlidWZzaXplID0gcmV0OworCQkJbW9kdWxlX25hbWVzID0geHJlYWxsb2MobW9kdWxlX25hbWVzLCBidWZzaXplKTsKKwkJCWdvdG8gcmV0cnlfbW9kdWxlc19sb2FkOworCQl9CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiUU1fTU9EVUxFUyIpOworCX0KKworCW5fZXh0X21vZHVsZXMgPSBubW9kID0gcmV0OworCisJLyogQ29sbGVjdCB0aGUgbW9kdWxlcycgc3ltYm9scy4gICovCisKKwlpZiAobm1vZCkgeworCQlleHRfbW9kdWxlcyA9IG1vZHVsZXMgPSB4emFsbG9jKG5tb2QgKiBzaXplb2YoKm1vZHVsZXMpKTsKKwkJZm9yIChpID0gMCwgbW4gPSBtb2R1bGVfbmFtZXMsIG0gPSBtb2R1bGVzOworCQkJCWkgPCBubW9kOyArK2ksICsrbSwgbW4gKz0gc3RybGVuKG1uKSArIDEpIHsKKwkJCXN0cnVjdCBuZXdfbW9kdWxlX2luZm8gaW5mbzsKKworCQkJaWYgKHF1ZXJ5X21vZHVsZShtbiwgUU1fSU5GTywgJmluZm8sIHNpemVvZihpbmZvKSwgJnJldCkpIHsKKwkJCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCQkJCS8qIFRoZSBtb2R1bGUgd2FzIHJlbW92ZWQgb3V0IGZyb20gdW5kZXJuZWF0aCB1cy4gICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInF1ZXJ5X21vZHVsZTogUU1fSU5GTzogJXMiLCBtbik7CisJCQl9CisKKwkJCWJ1ZnNpemUgPSAxMDI0OworCQkJc3ltcyA9IHhtYWxsb2MoYnVmc2l6ZSk7CisgcmV0cnlfbW9kX3N5bV9sb2FkOgorCQkJaWYgKHF1ZXJ5X21vZHVsZShtbiwgUU1fU1lNQk9MUywgc3ltcywgYnVmc2l6ZSwgJnJldCkpIHsKKwkJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJCWNhc2UgRU5PU1BDOgorCQkJCQkJYnVmc2l6ZSA9IHJldDsKKwkJCQkJCXN5bXMgPSB4cmVhbGxvYyhzeW1zLCBidWZzaXplKTsKKwkJCQkJCWdvdG8gcmV0cnlfbW9kX3N5bV9sb2FkOworCQkJCQljYXNlIEVOT0VOVDoKKwkJCQkJCS8qIFRoZSBtb2R1bGUgd2FzIHJlbW92ZWQgb3V0IGZyb20gdW5kZXJuZWF0aCB1cy4gICovCisJCQkJCQljb250aW51ZTsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicXVlcnlfbW9kdWxlOiBRTV9TWU1CT0xTOiAlcyIsIG1uKTsKKwkJCQl9CisJCQl9CisJCQluc3ltcyA9IHJldDsKKworCQkJbS0+bmFtZSA9IG1uOworCQkJbS0+YWRkciA9IGluZm8uYWRkcjsKKwkJCW0tPm5zeW1zID0gbnN5bXM7CisJCQltLT5zeW1zID0gc3ltczsKKworCQkJZm9yIChqID0gMCwgcyA9IHN5bXM7IGogPCBuc3ltczsgKytqLCArK3MpIHsKKwkJCQlzLT5uYW1lICs9ICh1bnNpZ25lZCBsb25nKSBzeW1zOworCQkJfQorCQl9CisJfQorCisJLyogQ29sbGVjdCB0aGUga2VybmVsJ3Mgc3ltYm9scy4gICovCisKKwlidWZzaXplID0gMTYgKiAxMDI0OworCXN5bXMgPSB4bWFsbG9jKGJ1ZnNpemUpOworIHJldHJ5X2tlcm5fc3ltX2xvYWQ6CisJaWYgKHF1ZXJ5X21vZHVsZShOVUxMLCBRTV9TWU1CT0xTLCBzeW1zLCBidWZzaXplLCAmcmV0KSkgeworCQlpZiAoZXJybm8gPT0gRU5PU1BDICYmIGJ1ZnNpemUgPCByZXQpIHsKKwkJCWJ1ZnNpemUgPSByZXQ7CisJCQlzeW1zID0geHJlYWxsb2Moc3ltcywgYnVmc2l6ZSk7CisJCQlnb3RvIHJldHJ5X2tlcm5fc3ltX2xvYWQ7CisJCX0KKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJrZXJuZWw6IFFNX1NZTUJPTFMiKTsKKwl9CisJbmtzeW1zID0gbnN5bXMgPSByZXQ7CisJa3N5bXMgPSBzeW1zOworCisJZm9yIChqID0gMCwgcyA9IHN5bXM7IGogPCBuc3ltczsgKytqLCArK3MpIHsKKwkJcy0+bmFtZSArPSAodW5zaWduZWQgbG9uZykgc3ltczsKKwl9Cit9CisKKworLyogUmV0dXJuIHRoZSBrZXJuZWwgc3ltYm9sIGNoZWNrc3VtIHZlcnNpb24sIG9yIHplcm8gaWYgbm90IHVzZWQuICAqLworCitzdGF0aWMgaW50IG5ld19pc19rZXJuZWxfY2hlY2tzdW1tZWQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnM7CisJc2l6ZV90IGk7CisKKwkvKiBVc2luZ19WZXJzaW9ucyBpcyBub3QgdGhlIGZpcnN0IHN5bWJvbCwgYnV0IGl0IHNob3VsZCBiZSBpbiB0aGVyZS4gICovCisKKwlmb3IgKGkgPSAwLCBzID0ga3N5bXM7IGkgPCBua3N5bXM7ICsraSwgKytzKQorCQlpZiAoc3RyY21wKChjaGFyICopIHMtPm5hbWUsICJVc2luZ19WZXJzaW9ucyIpID09IDApCisJCQlyZXR1cm4gcy0+dmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBuZXdfY3JlYXRlX3RoaXNfbW9kdWxlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbV9uYW1lKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCisJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3QoZiwgIi50aGlzIiwgdGd0X3NpemVvZl9sb25nLAorCQkJc2l6ZW9mKHN0cnVjdCBuZXdfbW9kdWxlKSk7CisJLyogZG9uZSBieSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbl9maXJzdDogKi8KKwkvKm1lbXNldChzZWMtPmNvbnRlbnRzLCAwLCBzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsqLworCisJb2JqX2FkZF9zeW1ib2woZiwgU1BGWCAiX190aGlzX21vZHVsZSIsIC0xLAorCQkJRUxGX1NUX0lORk8oU1RCX0xPQ0FMLCBTVFRfT0JKRUNUKSwgc2VjLT5pZHgsIDAsCisJCQlzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKKworCW9ial9zdHJpbmdfcGF0Y2goZiwgc2VjLT5pZHgsIG9mZnNldG9mKHN0cnVjdCBuZXdfbW9kdWxlLCBuYW1lKSwKKwkJCW1fbmFtZSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUworLyogYWRkIGFuIGVudHJ5IHRvIHRoZSBfX2tzeW10YWIgc2VjdGlvbiwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5ICovCitzdGF0aWMgdm9pZCBuZXdfYWRkX2tzeW10YWIoc3RydWN0IG9ial9maWxlICpmLCBzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCUVsZlcoQWRkcikgb2ZzOworCisJLyogZW5zdXJlIF9fa3N5bXRhYiBpcyBhbGxvY2F0ZWQsIEVYUE9SVF9OT1NZTUJPTFMgY3JlYXRlcyBhIG5vbi1hbGxvYyBzZWN0aW9uLgorCSAqIElmIF9fa3N5bXRhYiBpcyBkZWZpbmVkIGJ1dCBub3QgbWFya2VkIGFsbG9jLCB4IG91dCB0aGUgZmlyc3QgY2hhcmFjdGVyCisJICogKG5vIG9ial9kZWxldGUgcm91dGluZSkgYW5kIGNyZWF0ZSBhIG5ldyBfX2tzeW10YWIgd2l0aCB0aGUgY29ycmVjdAorCSAqIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKTsKKwlpZiAoc2VjICYmICEoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKSB7CisJCSooKGNoYXIgKikoc2VjLT5uYW1lKSkgPSAneCc7CS8qIG92ZXJyaWRlIGNvbnN0ICovCisJCXNlYyA9IE5VTEw7CisJfQorCWlmICghc2VjKQorCQlzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiX19rc3ltdGFiIiwKKwkJCQl0Z3Rfc2l6ZW9mX3ZvaWRfcCwgMCk7CisJaWYgKCFzZWMpCisJCXJldHVybjsKKwlzZWMtPmhlYWRlci5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CisJLyogRW1wdHkgc2VjdGlvbiBtaWdodCBiZSBieXRlLWFsaWduZWQgKi8KKwlzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ24gPSB0Z3Rfc2l6ZW9mX3ZvaWRfcDsKKwlvZnMgPSBzZWMtPmhlYWRlci5zaF9zaXplOworCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcywgc3ltKTsKKwlvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMgKyB0Z3Rfc2l6ZW9mX3ZvaWRfcCwgc3ltLT5uYW1lKTsKKwlvYmpfZXh0ZW5kX3NlY3Rpb24oc2VjLCAyICogdGd0X3NpemVvZl9jaGFyX3ApOworfQorI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgKi8KKworc3RhdGljIGludCBuZXdfY3JlYXRlX21vZHVsZV9rc3ltdGFiKHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKwlpbnQgaTsKKworCS8qIFdlIG11c3QgYWx3YXlzIGFkZCB0aGUgbW9kdWxlIHJlZmVyZW5jZXMuICAqLworCisJaWYgKG5fZXh0X21vZHVsZXNfdXNlZCkgeworCQlzdHJ1Y3QgbmV3X21vZHVsZV9yZWYgKmRlcDsKKwkJc3RydWN0IG9ial9zeW1ib2wgKnRtOworCisJCXNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICIua21vZHRhYiIsIHRndF9zaXplb2Zfdm9pZF9wLAorCQkJCShzaXplb2Yoc3RydWN0IG5ld19tb2R1bGVfcmVmKQorCQkJCSAqIG5fZXh0X21vZHVsZXNfdXNlZCkpOworCQlpZiAoIXNlYykKKwkJCXJldHVybiAwOworCisJCXRtID0gb2JqX2ZpbmRfc3ltYm9sKGYsIFNQRlggIl9fdGhpc19tb2R1bGUiKTsKKwkJZGVwID0gKHN0cnVjdCBuZXdfbW9kdWxlX3JlZiAqKSBzZWMtPmNvbnRlbnRzOworCQlmb3IgKGkgPSAwOyBpIDwgbl9leHRfbW9kdWxlczsgKytpKQorCQkJaWYgKGV4dF9tb2R1bGVzW2ldLnVzZWQpIHsKKwkJCQlkZXAtPmRlcCA9IGV4dF9tb2R1bGVzW2ldLmFkZHI7CisJCQkJb2JqX3N5bWJvbF9wYXRjaChmLCBzZWMtPmlkeCwKKwkJCQkJCShjaGFyICopICZkZXAtPnJlZiAtIHNlYy0+Y29udGVudHMsIHRtKTsKKwkJCQlkZXAtPm5leHRfcmVmID0gMDsKKwkJCQkrK2RlcDsKKwkJCX0KKwl9CisKKwlpZiAoIWZsYWdfbm9leHBvcnQgJiYgIW9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpKSB7CisJCXNpemVfdCBuc3ltczsKKwkJaW50ICpsb2FkZWQ7CisKKwkJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIsIHRndF9zaXplb2Zfdm9pZF9wLCAwKTsKKworCQkvKiBXZSBkb24ndCB3YW50IHRvIGV4cG9ydCBzeW1ib2xzIHJlc2lkaW5nIGluIHNlY3Rpb25zIHRoYXQKKwkJICAgYXJlbid0IGxvYWRlZC4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGVzZSBjcmVhdGVkIHNvIHRoYXQKKwkJICAgd2UgbWFrZSBzdXJlIGNlcnRhaW4gbW9kdWxlIG9wdGlvbnMgZG9uJ3QgYXBwZWFyIHR3aWNlLiAgKi8KKwkJaSA9IGYtPmhlYWRlci5lX3NobnVtOworCQlsb2FkZWQgPSBhbGxvY2Eoc2l6ZW9mKGludCkgKiBpKTsKKwkJd2hpbGUgKC0taSA+PSAwKQorCQkJbG9hZGVkW2ldID0gKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDA7CisKKwkJZm9yIChuc3ltcyA9IGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpIHsKKwkJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIHsKKwkJCQlpZiAoRUxGX1NUX0JJTkQoc3ltLT5pbmZvKSAhPSBTVEJfTE9DQUwKKwkJCQkgJiYgc3ltLT5zZWNpZHggPD0gU0hOX0hJUkVTRVJWRQorCQkJCSAmJiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSB8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKQorCQkJCSkgeworCQkJCQlFbGZXKEFkZHIpIG9mcyA9IG5zeW1zICogMiAqIHRndF9zaXplb2Zfdm9pZF9wOworCisJCQkJCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcywgc3ltKTsKKwkJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzZWMtPmlkeCwgb2ZzICsgdGd0X3NpemVvZl92b2lkX3AsCisJCQkJCQkJc3ltLT5uYW1lKTsKKwkJCQkJbnN5bXMrKzsKKwkJCQl9CisJCQl9CisJCX0KKworCQlvYmpfZXh0ZW5kX3NlY3Rpb24oc2VjLCBuc3ltcyAqIDIgKiB0Z3Rfc2l6ZW9mX2NoYXJfcCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludAorbmV3X2luaXRfbW9kdWxlKGNvbnN0IGNoYXIgKm1fbmFtZSwgc3RydWN0IG9ial9maWxlICpmLCB1bnNpZ25lZCBsb25nIG1fc2l6ZSkKK3sKKwlzdHJ1Y3QgbmV3X21vZHVsZSAqbW9kdWxlOworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCXZvaWQgKmltYWdlOworCWludCByZXQ7CisJdGd0X2xvbmcgbV9hZGRyOworCisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLnRoaXMiKTsKKwlpZiAoIXNlYyB8fCAhc2VjLT5jb250ZW50cykgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHQgbW9kdWxlICVzPyIsIG1fbmFtZSk7CisJfQorCW1vZHVsZSA9IChzdHJ1Y3QgbmV3X21vZHVsZSAqKSBzZWMtPmNvbnRlbnRzOworCW1fYWRkciA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CisKKwltb2R1bGUtPnNpemVfb2Zfc3RydWN0ID0gc2l6ZW9mKCptb2R1bGUpOworCW1vZHVsZS0+c2l6ZSA9IG1fc2l6ZTsKKwltb2R1bGUtPmZsYWdzID0gZmxhZ19hdXRvY2xlYW4gPyBORVdfTU9EX0FVVE9DTEVBTiA6IDA7CisKKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKTsKKwlpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKKwkJbW9kdWxlLT5zeW1zID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5uc3ltcyA9IHNlYy0+aGVhZGVyLnNoX3NpemUgLyAoMiAqIHRndF9zaXplb2ZfY2hhcl9wKTsKKwl9CisKKwlpZiAobl9leHRfbW9kdWxlc191c2VkKSB7CisJCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rbW9kdGFiIik7CisJCW1vZHVsZS0+ZGVwcyA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CisJCW1vZHVsZS0+bmRlcHMgPSBuX2V4dF9tb2R1bGVzX3VzZWQ7CisJfQorCisJbW9kdWxlLT5pbml0ID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiaW5pdF9tb2R1bGUiKSk7CisJbW9kdWxlLT5jbGVhbnVwID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiY2xlYW51cF9tb2R1bGUiKSk7CisKKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2V4X3RhYmxlIik7CisJaWYgKHNlYykgeworCQltb2R1bGUtPmV4X3RhYmxlX3N0YXJ0ID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5leF90YWJsZV9lbmQgPSBzZWMtPmhlYWRlci5zaF9hZGRyICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwl9CisKKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIudGV4dC5pbml0Iik7CisJaWYgKHNlYykgeworCQltb2R1bGUtPnJ1bnNpemUgPSBzZWMtPmhlYWRlci5zaF9hZGRyIC0gbV9hZGRyOworCX0KKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIuZGF0YS5pbml0Iik7CisJaWYgKHNlYykgeworCQlpZiAoIW1vZHVsZS0+cnVuc2l6ZQorCQkgfHwgbW9kdWxlLT5ydW5zaXplID4gc2VjLT5oZWFkZXIuc2hfYWRkciAtIG1fYWRkcgorCQkpIHsKKwkJCW1vZHVsZS0+cnVuc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBtX2FkZHI7CisJCX0KKwl9CisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBBUkNIREFUQV9TRUNfTkFNRSk7CisJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CisJCW1vZHVsZS0+YXJjaGRhdGFfc3RhcnQgPSAodm9pZCopc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5hcmNoZGF0YV9lbmQgPSBtb2R1bGUtPmFyY2hkYXRhX3N0YXJ0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwl9CisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBLQUxMU1lNU19TRUNfTkFNRSk7CisJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CisJCW1vZHVsZS0+a2FsbHN5bXNfc3RhcnQgPSAodm9pZCopc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5rYWxsc3ltc19lbmQgPSBtb2R1bGUtPmthbGxzeW1zX3N0YXJ0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwl9CisKKwkvKiBXaGV3ISAgQWxsIG9mIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4gIENvbGxlY3QgdGhlIGZpbmFsCisJICAgbW9kdWxlIGltYWdlIGFuZCBnaXZlIGl0IHRvIHRoZSBrZXJuZWwuICAqLworCisJaW1hZ2UgPSB4bWFsbG9jKG1fc2l6ZSk7CisJb2JqX2NyZWF0ZV9pbWFnZShmLCBpbWFnZSk7CisKKwlyZXQgPSBpbml0X21vZHVsZShtX25hbWUsIChzdHJ1Y3QgbmV3X21vZHVsZSAqKSBpbWFnZSk7CisJaWYgKHJldCkKKwkJYmJfcGVycm9yX21zZygiaW5pdF9tb2R1bGU6ICVzIiwgbV9uYW1lKTsKKworCWZyZWUoaW1hZ2UpOworCisJcmV0dXJuIHJldCA9PSAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkCitvYmpfc3RyaW5nX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCisJCQkJIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaCAqcDsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN0cnNlYzsKKwlzaXplX3QgbGVuID0gc3RybGVuKHN0cmluZykgKyAxOworCWNoYXIgKmxvYzsKKworCXAgPSB4emFsbG9jKHNpemVvZigqcCkpOworCXAtPm5leHQgPSBmLT5zdHJpbmdfcGF0Y2hlczsKKwlwLT5yZWxvY19zZWNpZHggPSBzZWNpZHg7CisJcC0+cmVsb2Nfb2Zmc2V0ID0gb2Zmc2V0OworCWYtPnN0cmluZ19wYXRjaGVzID0gcDsKKworCXN0cnNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rc3RydGFiIik7CisJaWYgKHN0cnNlYyA9PSBOVUxMKSB7CisJCXN0cnNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICIua3N0cnRhYiIsIDEsIGxlbik7CisJCS8qcC0+c3RyaW5nX29mZnNldCA9IDA7Ki8KKwkJbG9jID0gc3Ryc2VjLT5jb250ZW50czsKKwl9IGVsc2UgeworCQlwLT5zdHJpbmdfb2Zmc2V0ID0gc3Ryc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwkJbG9jID0gb2JqX2V4dGVuZF9zZWN0aW9uKHN0cnNlYywgbGVuKTsKKwl9CisJbWVtY3B5KGxvYywgc3RyaW5nLCBsZW4pOworfQorCitzdGF0aWMgdm9pZAorb2JqX3N5bWJvbF9wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAorCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKQoreworCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpwOworCisJcCA9IHhtYWxsb2Moc2l6ZW9mKCpwKSk7CisJcC0+bmV4dCA9IGYtPnN5bWJvbF9wYXRjaGVzOworCXAtPnJlbG9jX3NlY2lkeCA9IHNlY2lkeDsKKwlwLT5yZWxvY19vZmZzZXQgPSBvZmZzZXQ7CisJcC0+c3ltID0gc3ltOworCWYtPnN5bWJvbF9wYXRjaGVzID0gcDsKK30KKworc3RhdGljIHZvaWQgb2JqX2NoZWNrX3VuZGVmaW5lZHMoc3RydWN0IG9ial9maWxlICpmKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpIHsKKwkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKwkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KSB7CisJCQlpZiAoc3ltLT5zZWNpZHggPT0gU0hOX1VOREVGKSB7CisJCQkJaWYgKEVMRl9TVF9CSU5EKHN5bS0+aW5mbykgPT0gU1RCX1dFQUspIHsKKwkJCQkJc3ltLT5zZWNpZHggPSBTSE5fQUJTOworCQkJCQlzeW0tPnZhbHVlID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIWZsYWdfcXVpZXQpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5yZXNvbHZlZCBzeW1ib2wgJXMiLCBzeW0tPm5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgb2JqX2FsbG9jYXRlX2NvbW1vbnMoc3RydWN0IG9ial9maWxlICpmKQoreworCXN0cnVjdCBjb21tb25fZW50cnkgeworCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpuZXh0OworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCX0gKmNvbW1vbl9oZWFkID0gTlVMTDsKKworCXVuc2lnbmVkIGxvbmcgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgeworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIHsKKwkJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fQ09NTU9OKSB7CisJCQkJLyogQ29sbGVjdCBhbGwgQ09NTU9OIHN5bWJvbHMgYW5kIHNvcnQgdGhlbSBieSBzaXplIHNvIGFzIHRvCisJCQkJICAgbWluaW1pemUgc3BhY2Ugd2FzdGVkIGJ5IGFsaWdubWVudCByZXF1aXJlbWVudHMuICAqLworCQkJCXN0cnVjdCBjb21tb25fZW50cnkgKipwLCAqbjsKKwkJCQlmb3IgKHAgPSAmY29tbW9uX2hlYWQ7ICpwOyBwID0gJigqcCktPm5leHQpCisJCQkJCWlmIChzeW0tPnNpemUgPD0gKCpwKS0+c3ltLT5zaXplKQorCQkJCQkJYnJlYWs7CisJCQkJbiA9IGFsbG9jYShzaXplb2YoKm4pKTsKKwkJCQluLT5uZXh0ID0gKnA7CisJCQkJbi0+c3ltID0gc3ltOworCQkJCSpwID0gbjsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDE7IGkgPCBmLT5sb2NhbF9zeW10YWJfc2l6ZTsgKytpKSB7CisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0gPSBmLT5sb2NhbF9zeW10YWJbaV07CisJCWlmIChzeW0gJiYgc3ltLT5zZWNpZHggPT0gU0hOX0NPTU1PTikgeworCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOworCQkJZm9yIChwID0gJmNvbW1vbl9oZWFkOyAqcDsgcCA9ICYoKnApLT5uZXh0KSB7CisJCQkJaWYgKHN5bSA9PSAoKnApLT5zeW0pCisJCQkJCWJyZWFrOworCQkJCWlmIChzeW0tPnNpemUgPCAoKnApLT5zeW0tPnNpemUpIHsKKwkJCQkJbiA9IGFsbG9jYShzaXplb2YoKm4pKTsKKwkJCQkJbi0+bmV4dCA9ICpwOworCQkJCQluLT5zeW0gPSBzeW07CisJCQkJCSpwID0gbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKGNvbW1vbl9oZWFkKSB7CisJCS8qIEZpbmQgdGhlIGJzcyBzZWN0aW9uLiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IGYtPmhlYWRlci5lX3NobnVtOyArK2kpCisJCQlpZiAoZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF90eXBlID09IFNIVF9OT0JJVFMpCisJCQkJYnJlYWs7CisKKwkJLyogSWYgZm9yIHNvbWUgcmVhc29uIHRoZXJlIGhhZG4ndCBiZWVuIG9uZSwgY3JlYXRlIG9uZS4gICovCisJCWlmIChpID09IGYtPmhlYWRlci5lX3NobnVtKSB7CisJCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCQkJZi0+aGVhZGVyLmVfc2hudW0rKzsKKwkJCWYtPnNlY3Rpb25zID0geHJlYWxsb2NfdmVjdG9yKGYtPnNlY3Rpb25zLCAyLCBpKTsKKwkJCWYtPnNlY3Rpb25zW2ldID0gc2VjID0gYXJjaF9uZXdfc2VjdGlvbigpOworCisJCQlzZWMtPmhlYWRlci5zaF90eXBlID0gU0hUX1BST0dCSVRTOworCQkJc2VjLT5oZWFkZXIuc2hfZmxhZ3MgPSBTSEZfV1JJVEUgfCBTSEZfQUxMT0M7CisJCQlzZWMtPm5hbWUgPSAiLmJzcyI7CisJCQlzZWMtPmlkeCA9IGk7CisJCX0KKworCQkvKiBBbGxvY2F0ZSB0aGUgQ09NTU9OUy4gICovCisJCXsKKwkJCUVsZlcoQWRkcikgYnNzX3NpemUgPSBmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX3NpemU7CisJCQlFbGZXKEFkZHIpIG1heF9hbGlnbiA9IGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduOworCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqYzsKKworCQkJZm9yIChjID0gY29tbW9uX2hlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CisJCQkJRWxmVyhBZGRyKSBhbGlnbiA9IGMtPnN5bS0+dmFsdWU7CisKKwkJCQlpZiAoYWxpZ24gPiBtYXhfYWxpZ24pCisJCQkJCW1heF9hbGlnbiA9IGFsaWduOworCQkJCWlmIChic3Nfc2l6ZSAmIChhbGlnbiAtIDEpKQorCQkJCQlic3Nfc2l6ZSA9IChic3Nfc2l6ZSB8IChhbGlnbiAtIDEpKSArIDE7CisKKwkJCQljLT5zeW0tPnNlY2lkeCA9IGk7CisJCQkJYy0+c3ltLT52YWx1ZSA9IGJzc19zaXplOworCisJCQkJYnNzX3NpemUgKz0gYy0+c3ltLT5zaXplOworCQkJfQorCisJCQlmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX3NpemUgPSBic3Nfc2l6ZTsKKwkJCWYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gbWF4X2FsaWduOworCQl9CisJfQorCisJLyogRm9yIHRoZSBzYWtlIG9mIHBhdGNoIHJlbG9jYXRpb24gYW5kIHBhcmFtZXRlciBpbml0aWFsaXphdGlvbiwKKwkgICBhbGxvY2F0ZSB6ZXJvZWQgZGF0YSBmb3IgTk9CSVRTIHNlY3Rpb25zIG5vdy4gIE5vdGUgdGhhdCBhZnRlcgorCSAgIHRoaXMgd2UgY2Fubm90IGFzc3VtZSBOT0JJVFMgYXJlIHJlYWxseSBlbXB0eS4gICovCisJZm9yIChpID0gMDsgaSA8IGYtPmhlYWRlci5lX3NobnVtOyArK2kpIHsKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzID0gZi0+c2VjdGlvbnNbaV07CisJCWlmIChzLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKSB7CisJCQlzLT5jb250ZW50cyA9IE5VTEw7CisJCQlpZiAocy0+aGVhZGVyLnNoX3NpemUgIT0gMCkKKwkJCQlzLT5jb250ZW50cyA9IHh6YWxsb2Mocy0+aGVhZGVyLnNoX3NpemUpOworCQkJcy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9sb2FkX3NpemUoc3RydWN0IG9ial9maWxlICpmKQoreworCXVuc2lnbmVkIGxvbmcgZG90ID0gMDsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCS8qIEZpbmFsaXplIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHNlY3Rpb25zIHJlbGF0aXZlIHRvIG9uZSBhbm90aGVyLiAgKi8KKworCWZvciAoc2VjID0gZi0+bG9hZF9vcmRlcjsgc2VjOyBzZWMgPSBzZWMtPmxvYWRfbmV4dCkgeworCQlFbGZXKEFkZHIpIGFsaWduOworCisJCWFsaWduID0gc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduOworCQlpZiAoYWxpZ24gJiYgKGRvdCAmIChhbGlnbiAtIDEpKSkKKwkJCWRvdCA9IChkb3QgfCAoYWxpZ24gLSAxKSkgKyAxOworCisJCXNlYy0+aGVhZGVyLnNoX2FkZHIgPSBkb3Q7CisJCWRvdCArPSBzZWMtPmhlYWRlci5zaF9zaXplOworCX0KKworCXJldHVybiBkb3Q7Cit9CisKK3N0YXRpYyBpbnQgb2JqX3JlbG9jYXRlKHN0cnVjdCBvYmpfZmlsZSAqZiwgRWxmVyhBZGRyKSBiYXNlKQoreworCWludCBpLCBuID0gZi0+aGVhZGVyLmVfc2hudW07CisJaW50IHJldCA9IDE7CisKKwkvKiBGaW5hbGl6ZSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucy4gICovCisKKwlmLT5iYXNlYWRkciA9IGJhc2U7CisJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9hZGRyICs9IGJhc2U7CisKKwkvKiBBbmQgaXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgcmVsb2NhdGlvbnMuICAqLworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnJlbHNlYywgKnN5bXNlYywgKnRhcmdzZWMsICpzdHJzZWM7CisJCUVsZlcoUmVsTSkgKiByZWwsICpyZWxlbmQ7CisJCUVsZlcoU3ltKSAqIHN5bXRhYjsKKwkJY29uc3QgY2hhciAqc3RydGFiOworCisJCXJlbHNlYyA9IGYtPnNlY3Rpb25zW2ldOworCQlpZiAocmVsc2VjLT5oZWFkZXIuc2hfdHlwZSAhPSBTSFRfUkVMTSkKKwkJCWNvbnRpbnVlOworCisJCXN5bXNlYyA9IGYtPnNlY3Rpb25zW3JlbHNlYy0+aGVhZGVyLnNoX2xpbmtdOworCQl0YXJnc2VjID0gZi0+c2VjdGlvbnNbcmVsc2VjLT5oZWFkZXIuc2hfaW5mb107CisJCXN0cnNlYyA9IGYtPnNlY3Rpb25zW3N5bXNlYy0+aGVhZGVyLnNoX2xpbmtdOworCisJCXJlbCA9IChFbGZXKFJlbE0pICopIHJlbHNlYy0+Y29udGVudHM7CisJCXJlbGVuZCA9IHJlbCArIChyZWxzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoUmVsTSkpKTsKKwkJc3ltdGFiID0gKEVsZlcoU3ltKSAqKSBzeW1zZWMtPmNvbnRlbnRzOworCQlzdHJ0YWIgPSAoY29uc3QgY2hhciAqKSBzdHJzZWMtPmNvbnRlbnRzOworCisJCWZvciAoOyByZWwgPCByZWxlbmQ7ICsrcmVsKSB7CisJCQlFbGZXKEFkZHIpIHZhbHVlID0gMDsKKwkJCXN0cnVjdCBvYmpfc3ltYm9sICppbnRzeW0gPSBOVUxMOworCQkJdW5zaWduZWQgbG9uZyBzeW1uZHg7CisJCQlFbGZXKFN5bSkgKmV4dHN5bSA9IE5VTEw7CisJCQljb25zdCBjaGFyICplcnJtc2c7CisKKwkJCS8qIEF0dGVtcHQgdG8gZmluZCBhIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyByZWxvY2F0aW9uLiAgKi8KKworCQkJc3ltbmR4ID0gRUxGX1JfU1lNKHJlbC0+cl9pbmZvKTsKKwkJCWlmIChzeW1uZHgpIHsKKwkJCQkvKiBOb3RlIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuICAqLworCisJCQkJZXh0c3ltID0gJnN5bXRhYltzeW1uZHhdOworCQkJCWlmIChFTEZfU1RfQklORChleHRzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTCkgeworCQkJCQkvKiBMb2NhbCBzeW1ib2xzIHdlIGxvb2sgdXAgaW4gdGhlIGxvY2FsIHRhYmxlIHRvIGJlIHN1cmUKKwkJCQkJICAgd2UgZ2V0IHRoZSBvbmUgdGhhdCBpcyByZWFsbHkgaW50ZW5kZWQuICAqLworCQkJCQlpbnRzeW0gPSBmLT5sb2NhbF9zeW10YWJbc3ltbmR4XTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBPdGhlcnMgd2UgbG9vayB1cCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCisJCQkJCWNvbnN0IGNoYXIgKm5hbWU7CisJCQkJCWlmIChleHRzeW0tPnN0X25hbWUpCisJCQkJCQluYW1lID0gc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lOworCQkJCQllbHNlCisJCQkJCQluYW1lID0gZi0+c2VjdGlvbnNbZXh0c3ltLT5zdF9zaG5keF0tPm5hbWU7CisJCQkJCWludHN5bSA9IG9ial9maW5kX3N5bWJvbChmLCBuYW1lKTsKKwkJCQl9CisKKwkJCQl2YWx1ZSA9IG9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgaW50c3ltKTsKKwkJCQlpbnRzeW0tPnJlZmVyZW5jZWQgPSAxOworCQkJfQorI2lmIFNIVF9SRUxNID09IFNIVF9SRUxBCisjaWYgZGVmaW5lZChfX2FscGhhX18pICYmIGRlZmluZWQoQVhQX0JST0tFTl9HQVMpCisJCQkvKiBXb3JrIGFyb3VuZCBhIG5hc3R5IEdBUyBidWcsIHRoYXQgaXMgZml4ZWQgYXMgb2YgMi43LjAuOS4gICovCisJCQlpZiAoIWV4dHN5bSB8fCAhZXh0c3ltLT5zdF9uYW1lCisJCQkgfHwgRUxGX1NUX0JJTkQoZXh0c3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCisjZW5kaWYKKwkJCQl2YWx1ZSArPSByZWwtPnJfYWRkZW5kOworI2VuZGlmCisKKwkJCS8qIERvIGl0ISAqLworCQkJc3dpdGNoIChhcmNoX2FwcGx5X3JlbG9jYXRpb24KKwkJCQkJKGYsIHRhcmdzZWMsIC8qc3ltc2VjLCovIGludHN5bSwgcmVsLCB2YWx1ZSkKKwkJCSkgeworCQkJY2FzZSBvYmpfcmVsb2Nfb2s6CisJCQkJYnJlYWs7CisKKwkJCWNhc2Ugb2JqX3JlbG9jX292ZXJmbG93OgorCQkJCWVycm1zZyA9ICJSZWxvY2F0aW9uIG92ZXJmbG93IjsKKwkJCQlnb3RvIGJhZF9yZWxvYzsKKwkJCWNhc2Ugb2JqX3JlbG9jX2Rhbmdlcm91czoKKwkJCQllcnJtc2cgPSAiRGFuZ2Vyb3VzIHJlbG9jYXRpb24iOworCQkJCWdvdG8gYmFkX3JlbG9jOworCQkJY2FzZSBvYmpfcmVsb2NfdW5oYW5kbGVkOgorCQkJCWVycm1zZyA9ICJVbmhhbmRsZWQgcmVsb2NhdGlvbiI7CitiYWRfcmVsb2M6CisJCQkJaWYgKGV4dHN5bSkgeworCQkJCQliYl9lcnJvcl9tc2coIiVzIG9mIHR5cGUgJWxkIGZvciAlcyIsIGVycm1zZywKKwkJCQkJCQkobG9uZykgRUxGX1JfVFlQRShyZWwtPnJfaW5mbyksCisJCQkJCQkJc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQliYl9lcnJvcl9tc2coIiVzIG9mIHR5cGUgJWxkIiwgZXJybXNnLAorCQkJCQkJCShsb25nKSBFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CisJCQkJfQorCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBGaW5hbGx5LCB0YWtlIGNhcmUgb2YgdGhlIHBhdGNoZXMuICAqLworCisJaWYgKGYtPnN0cmluZ19wYXRjaGVzKSB7CisJCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpwOworCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN0cnNlYzsKKwkJRWxmVyhBZGRyKSBzdHJzZWNfYmFzZTsKKwkJc3Ryc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiKTsKKwkJc3Ryc2VjX2Jhc2UgPSBzdHJzZWMtPmhlYWRlci5zaF9hZGRyOworCisJCWZvciAocCA9IGYtPnN0cmluZ19wYXRjaGVzOyBwOyBwID0gcC0+bmV4dCkgeworCQkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjID0gZi0+c2VjdGlvbnNbcC0+cmVsb2Nfc2VjaWR4XTsKKwkJCSooRWxmVyhBZGRyKSAqKSAodGFyZ3NlYy0+Y29udGVudHMgKyBwLT5yZWxvY19vZmZzZXQpCisJCQkJPSBzdHJzZWNfYmFzZSArIHAtPnN0cmluZ19vZmZzZXQ7CisJCX0KKwl9CisKKwlpZiAoZi0+c3ltYm9sX3BhdGNoZXMpIHsKKwkJc3RydWN0IG9ial9zeW1ib2xfcGF0Y2ggKnA7CisKKwkJZm9yIChwID0gZi0+c3ltYm9sX3BhdGNoZXM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnRhcmdzZWMgPSBmLT5zZWN0aW9uc1twLT5yZWxvY19zZWNpZHhdOworCQkJKihFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHAtPnJlbG9jX29mZnNldCkKKwkJCQk9IG9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgcC0+c3ltKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2JqX2NyZWF0ZV9pbWFnZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgKmltYWdlKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCUVsZlcoQWRkcikgYmFzZSA9IGYtPmJhc2VhZGRyOworCisJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CisJCWNoYXIgKnNlY2ltZzsKKworCQlpZiAoc2VjLT5jb250ZW50cyA9PSAwIHx8IHNlYy0+aGVhZGVyLnNoX3NpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXNlY2ltZyA9IGltYWdlICsgKHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBiYXNlKTsKKworCQkvKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGVkIGRhdGEgZm9yIE5PQklUUyBzZWN0aW9ucyBlYXJsaWVyLiAgKi8KKwkJbWVtY3B5KHNlY2ltZywgc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKm9ial9sb2FkKGNoYXIgKmltYWdlLCBzaXplX3QgaW1hZ2Vfc2l6ZSwgaW50IGxvYWRwcm9nYml0cykKK3sKKwl0eXBlZGVmIHVpbnQzMl90IGFsaWFzZWRfdWludDMyX3QgRklYX0FMSUFTSU5HOworI2lmIEJCX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIEVMRk1BR19VMzIgKCh1aW50MzJfdCkoRUxGTUFHMCArIDB4MTAwICogKEVMRk1BRzEgKyAoMHgxMDAgKiAoRUxGTUFHMiArIDB4MTAwICogRUxGTUFHMykpKSkpCisjZWxzZQorIyBkZWZpbmUgRUxGTUFHX1UzMiAoKHVpbnQzMl90KSgoKChFTEZNQUcwICogMHgxMDApICsgRUxGTUFHMSkgKiAweDEwMCArIEVMRk1BRzIpICogMHgxMDAgKyBFTEZNQUczKSkKKyNlbmRpZgorCXN0cnVjdCBvYmpfZmlsZSAqZjsKKwlFbGZXKFNoZHIpICogc2VjdGlvbl9oZWFkZXJzOworCXNpemVfdCBzaG51bSwgaTsKKwljaGFyICpzaHN0cnRhYjsKKworCS8qIFJlYWQgdGhlIGZpbGUgaGVhZGVyLiAgKi8KKworCWYgPSBhcmNoX25ld19maWxlKCk7CisJZi0+c3ltYm9sX2NtcCA9IHN0cmNtcDsKKwlmLT5zeW1ib2xfaGFzaCA9IG9ial9lbGZfaGFzaDsKKwlmLT5sb2FkX29yZGVyX3NlYXJjaF9zdGFydCA9ICZmLT5sb2FkX29yZGVyOworCisJaWYgKGltYWdlX3NpemUgPCBzaXplb2YoZi0+aGVhZGVyKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIHdoaWxlIGxvYWRpbmcgRUxGIGhlYWRlciIpOworCW1lbWNweSgmZi0+aGVhZGVyLCBpbWFnZSwgc2l6ZW9mKGYtPmhlYWRlcikpOworCisJaWYgKCooYWxpYXNlZF91aW50MzJfdCopKCZmLT5oZWFkZXIuZV9pZGVudCkgIT0gRUxGTUFHX1UzMikgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGFuIEVMRiBmaWxlIik7CisJfQorCWlmIChmLT5oZWFkZXIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1NNCisJIHx8IGYtPmhlYWRlci5lX2lkZW50W0VJX0RBVEFdICE9IChCQl9CSUdfRU5ESUFOID8gRUxGREFUQTJNU0IgOiBFTEZEQVRBMkxTQikKKwkgfHwgZi0+aGVhZGVyLmVfaWRlbnRbRUlfVkVSU0lPTl0gIT0gRVZfQ1VSUkVOVAorCSB8fCAhTUFUQ0hfTUFDSElORShmLT5oZWFkZXIuZV9tYWNoaW5lKQorCSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiRUxGIGZpbGUgbm90IGZvciB0aGlzIGFyY2hpdGVjdHVyZSIpOworCX0KKwlpZiAoZi0+aGVhZGVyLmVfdHlwZSAhPSBFVF9SRUwpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkVMRiBmaWxlIG5vdCBhIHJlbG9jYXRhYmxlIG9iamVjdCIpOworCX0KKworCS8qIFJlYWQgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCisKKwlpZiAoZi0+aGVhZGVyLmVfc2hlbnRzaXplICE9IHNpemVvZihFbGZXKFNoZHIpKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2VjdGlvbiBoZWFkZXIgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCisJCQkJKHVuc2lnbmVkIGxvbmcpIGYtPmhlYWRlci5lX3NoZW50c2l6ZSwKKwkJCQkodW5zaWduZWQgbG9uZykgc2l6ZW9mKEVsZlcoU2hkcikpKTsKKwl9CisKKwlzaG51bSA9IGYtPmhlYWRlci5lX3NobnVtOworCS8qIEdyb3d0aCBvZiAtPnNlY3Rpb25zIHZlY3RvciB3aWxsIGJlIGRvbmUgYnkKKwkgKiB4cmVhbGxvY192ZWN0b3IoLi4uLCAyLCAuLi4pLCB0aGVyZWZvcmUgd2UgbXVzdCBhbGxvY2F0ZQorCSAqIGF0IGxlYXN0IDJeMiA9IDQgZXh0cmEgZWxlbWVudHMgaGVyZS4gKi8KKwlmLT5zZWN0aW9ucyA9IHh6YWxsb2Moc2l6ZW9mKGYtPnNlY3Rpb25zWzBdKSAqIChzaG51bSArIDQpKTsKKworCXNlY3Rpb25faGVhZGVycyA9IGFsbG9jYShzaXplb2YoRWxmVyhTaGRyKSkgKiBzaG51bSk7CisJaWYgKGltYWdlX3NpemUgPCBmLT5oZWFkZXIuZV9zaG9mZiArIHNpemVvZihFbGZXKFNoZHIpKSAqIHNobnVtKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgbG9hZGluZyBzZWN0aW9uIGhlYWRlcnMiKTsKKwltZW1jcHkoc2VjdGlvbl9oZWFkZXJzLCBpbWFnZSArIGYtPmhlYWRlci5lX3Nob2ZmLCBzaXplb2YoRWxmVyhTaGRyKSkgKiBzaG51bSk7CisKKwkvKiBSZWFkIHRoZSBzZWN0aW9uIGRhdGEuICAqLworCisJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisKKwkJZi0+c2VjdGlvbnNbaV0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CisKKwkJc2VjLT5oZWFkZXIgPSBzZWN0aW9uX2hlYWRlcnNbaV07CisJCXNlYy0+aWR4ID0gaTsKKworCQlpZiAoc2VjLT5oZWFkZXIuc2hfc2l6ZSkgeworCQkJc3dpdGNoIChzZWMtPmhlYWRlci5zaF90eXBlKSB7CisJCQljYXNlIFNIVF9OVUxMOgorCQkJY2FzZSBTSFRfTk9URToKKwkJCWNhc2UgU0hUX05PQklUUzoKKwkJCQkvKiBpZ25vcmUgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgU0hUX1BST0dCSVRTOgorI2lmIExPQURCSVRTCisJCQkJaWYgKCFsb2FkcHJvZ2JpdHMpIHsKKwkJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKyNlbmRpZgorCQkJY2FzZSBTSFRfU1lNVEFCOgorCQkJY2FzZSBTSFRfU1RSVEFCOgorCQkJY2FzZSBTSFRfUkVMTToKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorCQkJY2FzZSBTSFRfTUlQU19EV0FSRjoKKyNlbmRpZgorCQkJCXNlYy0+Y29udGVudHMgPSBOVUxMOworCQkJCWlmIChzZWMtPmhlYWRlci5zaF9zaXplID4gMCkgeworCQkJCQlzZWMtPmNvbnRlbnRzID0geG1hbGxvYyhzZWMtPmhlYWRlci5zaF9zaXplKTsKKwkJCQkJaWYgKGltYWdlX3NpemUgPCAoc2VjLT5oZWFkZXIuc2hfb2Zmc2V0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZSkpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgbG9hZGluZyBzZWN0aW9uIGRhdGEiKTsKKwkJCQkJbWVtY3B5KHNlYy0+Y29udGVudHMsIGltYWdlICsgc2VjLT5oZWFkZXIuc2hfb2Zmc2V0LCBzZWMtPmhlYWRlci5zaF9zaXplKTsKKwkJCQl9CisJCQkJYnJlYWs7CisjaWYgU0hUX1JFTE0gPT0gU0hUX1JFTAorCQkJY2FzZSBTSFRfUkVMQToKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiUkVMQSByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIik7CisjZWxzZQorCQkJY2FzZSBTSFRfUkVMOgorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJSRUwgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSIpOworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCWlmIChzZWMtPmhlYWRlci5zaF90eXBlID49IFNIVF9MT1BST0MpIHsKKwkJCQkJLyogQXNzdW1lIHByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzIGFyZSBkZWJ1ZworCQkJCQkgICBpbmZvIGFuZCBjYW4gc2FmZWx5IGJlIGlnbm9yZWQuICBJZiB0aGlzIGlzIGV2ZXIgbm90CisJCQkJCSAgIHRoZSBjYXNlIChIZWxsbyBNSVBTPyksIGRvbid0IHB1dCBpZmRlZnMgaGVyZSBidXQKKwkJCQkJICAgY3JlYXRlIGFuIGFyY2hfbG9hZF9wcm9jX3NlY3Rpb24oKS4gICovCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBoYW5kbGUgc2VjdGlvbnMgb2YgdHlwZSAlbGQiLAorCQkJCQkJKGxvbmcpIHNlYy0+aGVhZGVyLnNoX3R5cGUpOworCQkJfQorCQl9CisJfQorCisJLyogRG8gd2hhdCBzb3J0IG9mIGludGVycHJldGF0aW9uIGFzIG5lZWRlZCBieSBlYWNoIHNlY3Rpb24uICAqLworCisJc2hzdHJ0YWIgPSBmLT5zZWN0aW9uc1tmLT5oZWFkZXIuZV9zaHN0cm5keF0tPmNvbnRlbnRzOworCisJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMgPSBmLT5zZWN0aW9uc1tpXTsKKwkJc2VjLT5uYW1lID0gc2hzdHJ0YWIgKyBzZWMtPmhlYWRlci5zaF9uYW1lOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaG51bTsgKytpKSB7CisJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjID0gZi0+c2VjdGlvbnNbaV07CisKKwkJLyogLm1vZGluZm8gc2hvdWxkIGJlIGNvbnRlbnRzIG9ubHkgYnV0IGdjYyBoYXMgbm8gYXR0cmlidXRlIGZvciB0aGF0LgorCQkgKiBUaGUga2VybmVsIG1heSBoYXZlIG1hcmtlZCAubW9kaW5mbyBhcyBBTExPQywgaWdub3JlIHRoaXMgYml0LgorCQkgKi8KKwkJaWYgKHN0cmNtcChzZWMtPm5hbWUsICIubW9kaW5mbyIpID09IDApCisJCQlzZWMtPmhlYWRlci5zaF9mbGFncyAmPSB+U0hGX0FMTE9DOworCisJCWlmIChzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykKKwkJCW9ial9pbnNlcnRfc2VjdGlvbl9sb2FkX29yZGVyKGYsIHNlYyk7CisKKwkJc3dpdGNoIChzZWMtPmhlYWRlci5zaF90eXBlKSB7CisJCWNhc2UgU0hUX1NZTVRBQjoKKwkJCXsKKwkJCQl1bnNpZ25lZCBsb25nIG5zeW0sIGo7CisJCQkJY2hhciAqc3RydGFiOworCQkJCUVsZlcoU3ltKSAqIHN5bTsKKworCQkJCWlmIChzZWMtPmhlYWRlci5zaF9lbnRzaXplICE9IHNpemVvZihFbGZXKFN5bSkpKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW1ib2wgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNlYy0+aGVhZGVyLnNoX2VudHNpemUsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFN5bSkpKTsKKwkJCQl9CisKKwkJCQluc3ltID0gc2VjLT5oZWFkZXIuc2hfc2l6ZSAvIHNpemVvZihFbGZXKFN5bSkpOworCQkJCXN0cnRhYiA9IGYtPnNlY3Rpb25zW3NlYy0+aGVhZGVyLnNoX2xpbmtdLT5jb250ZW50czsKKwkJCQlzeW0gPSAoRWxmVyhTeW0pICopIHNlYy0+Y29udGVudHM7CisKKwkJCQkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSB0YWJsZSBvZiBsb2NhbCBzeW1ib2xzLiAgKi8KKwkJCQlqID0gZi0+bG9jYWxfc3ltdGFiX3NpemUgPSBzZWMtPmhlYWRlci5zaF9pbmZvOworCQkJCWYtPmxvY2FsX3N5bXRhYiA9IHh6YWxsb2MoaiAqIHNpemVvZihzdHJ1Y3Qgb2JqX3N5bWJvbCAqKSk7CisKKwkJCQkvKiBJbnNlcnQgYWxsIHN5bWJvbHMgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCisJCQkJZm9yIChqID0gMSwgKytzeW07IGogPCBuc3ltOyArK2osICsrc3ltKSB7CisJCQkJCUVsZlcoQWRkcikgdmFsID0gc3ltLT5zdF92YWx1ZTsKKwkJCQkJY29uc3QgY2hhciAqbmFtZTsKKwkJCQkJaWYgKHN5bS0+c3RfbmFtZSkKKwkJCQkJCW5hbWUgPSBzdHJ0YWIgKyBzeW0tPnN0X25hbWU7CisJCQkJCWVsc2UgaWYgKHN5bS0+c3Rfc2huZHggPCBzaG51bSkKKwkJCQkJCW5hbWUgPSBmLT5zZWN0aW9uc1tzeW0tPnN0X3NobmR4XS0+bmFtZTsKKwkJCQkJZWxzZQorCQkJCQkJY29udGludWU7CisjaWYgZGVmaW5lZChfX1NINV9fKQorCQkJCQkvKgorCQkJCQkgKiBGb3Igc2g2NCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB0YXJnZXQgb2YgYSBicmFuY2gKKwkJCQkJICogcmVxdWlyZXMgYSBtb2RlIHN3aXRjaCAoMzIgdG8gMTYgYW5kIGJhY2sgYWdhaW4pLgorCQkJCQkgKgorCQkJCQkgKiBUaGlzIGlzIGltcGxpZWQgYnkgdGhlIGxzYiBiZWluZyBzZXQgaW4gdGhlIHRhcmdldAorCQkJCQkgKiBhZGRyZXNzIGZvciBTSG1lZGlhIG1vZGUgYW5kIGNsZWFyIGZvciBTSGNvbXBhY3QuCisJCQkJCSAqLworCQkJCQl2YWwgfD0gc3ltLT5zdF9vdGhlciAmIDQ7CisjZW5kaWYKKwkJCQkJb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgaiwgc3ltLT5zdF9pbmZvLCBzeW0tPnN0X3NobmR4LAorCQkJCQkJCXZhbCwgc3ltLT5zdF9zaXplKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNIVF9SRUxNOgorCQkJaWYgKHNlYy0+aGVhZGVyLnNoX2VudHNpemUgIT0gc2l6ZW9mKEVsZlcoUmVsTSkpKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlbG9jYXRpb24gZW50cnkgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCisJCQkJCQkodW5zaWduZWQgbG9uZykgc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSwKKwkJCQkJCSh1bnNpZ25lZCBsb25nKSBzaXplb2YoRWxmVyhSZWxNKSkpOworCQkJfQorCQkJYnJlYWs7CisJCQkvKiBYWFggIFJlbG9jYXRpb24gY29kZSBmcm9tIG1vZHV0aWxzLTIuMy4xOSBpcyBub3QgaGVyZS4KKwkJCSAqIFdoeT8gIFRoYXQncyBhYm91dCAyMCBsaW5lcyBvZiBjb2RlIGZyb20gb2JqL29ial9sb2FkLmMsCisJCQkgKiB3aGljaCBnZXRzIGRvbmUgaW4gYSBzZWNvbmQgcGFzcyB0aHJvdWdoIHRoZSBzZWN0aW9ucy4KKwkJCSAqIFRoaXMgQnVzeUJveCBpbnNtb2QgZG9lcyBzaW1pbGFyIHdvcmsgaW4gb2JqX3JlbG9jYXRlKCkuICovCisJCX0KKwl9CisKKwlyZXR1cm4gZjsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNCisvKgorICogbG9hZCB0aGUgdW5sb2FkZWQgc2VjdGlvbnMgZGlyZWN0bHkgaW50byB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieQorICoga2VybmVsIGZvciB0aGUgbW9kdWxlCisgKi8KKworc3RhdGljIGludCBvYmpfbG9hZF9wcm9nYml0cyhjaGFyICppbWFnZSwgc2l6ZV90IGltYWdlX3NpemUsIHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciAqaW1hZ2ViYXNlKQoreworCUVsZlcoQWRkcikgYmFzZSA9IGYtPmJhc2VhZGRyOworCXN0cnVjdCBvYmpfc2VjdGlvbiogc2VjOworCisJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CisJCS8qIHNlY3Rpb24gYWxyZWFkeSBsb2FkZWQ/ICovCisJCWlmIChzZWMtPmNvbnRlbnRzICE9IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHNlYy0+aGVhZGVyLnNoX3NpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzZWMtPmNvbnRlbnRzID0gaW1hZ2ViYXNlICsgKHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBiYXNlKTsKKwkJaWYgKGltYWdlX3NpemUgPCAoc2VjLT5oZWFkZXIuc2hfb2Zmc2V0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZSkpIHsKKwkJCWJiX2Vycm9yX21zZygiZXJyb3IgcmVhZGluZyBFTEYgc2VjdGlvbiBkYXRhIik7CisJCQlyZXR1cm4gMDsgLyogbmVlZCB0byBkZWxldGUgaGFsZi1sb2FkZWQgbW9kdWxlISAqLworCQl9CisJCW1lbWNweShzZWMtPmNvbnRlbnRzLCBpbWFnZSArIHNlYy0+aGVhZGVyLnNoX29mZnNldCwgc2VjLT5oZWFkZXIuc2hfc2l6ZSk7CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGhpZGVfc3BlY2lhbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3BlY2lhbHNbXSA9IHsKKwkJU1BGWCAiY2xlYW51cF9tb2R1bGUiLAorCQlTUEZYICJpbml0X21vZHVsZSIsCisJCVNQRlggImtlcm5lbF92ZXJzaW9uIiwKKwkJTlVMTAorCX07CisKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCWNvbnN0IGNoYXIgKmNvbnN0ICpwOworCisJZm9yIChwID0gc3BlY2lhbHM7ICpwOyArK3ApIHsKKwkJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsICpwKTsKKwkJaWYgKHN5bSAhPSBOVUxMKQorCQkJc3ltLT5pbmZvID0gRUxGX1NUX0lORk8oU1RCX0xPQ0FMLCBFTEZfU1RfVFlQRShzeW0tPmluZm8pKTsKKwl9Cit9CisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCitzdGF0aWMgaW50IG9ial9ncGxfbGljZW5zZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKipsaWNlbnNlKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCS8qIFRoaXMgbGlzdCBtdXN0IG1hdGNoICpleGFjdGx5KiB0aGUgbGlzdCBvZiBhbGxvd2FibGUgbGljZW5zZXMgaW4KKwkgKiBsaW51eC9pbmNsdWRlL2xpbnV4L21vZHVsZS5oLiAgQ2hlY2tpbmcgZm9yIGxlYWRpbmcgIkdQTCIgd2lsbCBub3QKKwkgKiB3b3JrLCBzb21lYm9keSB3aWxsIHVzZSAiR1BMIHN1Y2tzLCB0aGlzIGlzIHByb3ByaWV0YXJ5Ii4KKwkgKi8KKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ3BsX2xpY2Vuc2VzW10gPSB7CisJCSJHUEwiLAorCQkiR1BMIHYyIiwKKwkJIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiLAorCQkiRHVhbCBCU0QvR1BMIiwKKwkJIkR1YWwgTVBML0dQTCIKKwl9OworCisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLm1vZGluZm8iKTsKKwlpZiAoc2VjKSB7CisJCWNvbnN0IGNoYXIgKnZhbHVlLCAqcHRyLCAqZW5kcHRyOworCQlwdHIgPSBzZWMtPmNvbnRlbnRzOworCQllbmRwdHIgPSBwdHIgKyBzZWMtPmhlYWRlci5zaF9zaXplOworCQl3aGlsZSAocHRyIDwgZW5kcHRyKSB7CisJCQl2YWx1ZSA9IHN0cmNocihwdHIsICc9Jyk7CisJCQlpZiAodmFsdWUgJiYgc3RybmNtcChwdHIsICJsaWNlbnNlIiwgdmFsdWUtcHRyKSA9PSAwKSB7CisJCQkJdW5zaWduZWQgaTsKKwkJCQlpZiAobGljZW5zZSkKKwkJCQkJKmxpY2Vuc2UgPSB2YWx1ZSsxOworCQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwbF9saWNlbnNlcyk7ICsraSkgeworCQkJCQlpZiAoc3RyY21wKHZhbHVlKzEsIGdwbF9saWNlbnNlc1tpXSkgPT0gMCkKKwkJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCXB0ciA9IHN0cmNocihwdHIsICdcMCcpOworCQkJaWYgKHB0cikKKwkJCQlwdHIrKzsKKwkJCWVsc2UKKwkJCQlwdHIgPSBlbmRwdHI7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgVEFJTlRfRklMRU5BTUUgICAgICAgICAgICAgICAgICAiL3Byb2Mvc3lzL2tlcm5lbC90YWludGVkIgorI2RlZmluZSBUQUlOVF9QUk9QUklFVE9SWV9NT0RVTEUgICAgICAgICgxIDw8IDApCisjZGVmaW5lIFRBSU5UX0ZPUkNFRF9NT0RVTEUgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgVEFJTlRfVU5TQUZFX1NNUCAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBUQUlOVF9VUkwgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnR1eC5vcmcvbGttbC8jZXhwb3J0LXRhaW50ZWQiCisKK3N0YXRpYyB2b2lkIHNldF90YWludGVkKGludCBmZCwgY29uc3QgY2hhciAqbV9uYW1lLAorCQlpbnQga2VybmVsX2hhc190YWludGVkLCBpbnQgdGFpbnQsCisJCWNvbnN0IGNoYXIgKnRleHQxLCBjb25zdCBjaGFyICp0ZXh0MikKK3sKKwlzdGF0aWMgc21hbGxpbnQgcHJpbnRlZF9pbmZvOworCisJY2hhciBidWZbODBdOworCWludCBvbGR2YWw7CisKKwlpZiAoZmQgPCAwICYmICFrZXJuZWxfaGFzX3RhaW50ZWQpCisJCXJldHVybjsJCS8qIE5ldyBtb2R1dGlscyBvbiBvbGQga2VybmVsICovCisJcHJpbnRmKCJXYXJuaW5nOiBsb2FkaW5nICVzIHdpbGwgdGFpbnQgdGhlIGtlcm5lbDogJXMlc1xuIiwKKwkJCW1fbmFtZSwgdGV4dDEsIHRleHQyKTsKKwlpZiAoIXByaW50ZWRfaW5mbykgeworCQlwcmludGYoIiAgU2VlICVzIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0YWludGVkIG1vZHVsZXNcbiIsIFRBSU5UX1VSTCk7CisJCXByaW50ZWRfaW5mbyA9IDE7CisJfQorCWlmIChmZCA+PSAwKSB7CisJCXJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiktMSk7CisJCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisJCW9sZHZhbCA9IHN0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJCXNwcmludGYoYnVmLCAiJWRcbiIsIG9sZHZhbCB8IHRhaW50KTsKKwkJeHdyaXRlX3N0cihmZCwgYnVmKTsKKwl9Cit9CisKKy8qIENoZWNrIGlmIGxvYWRpbmcgdGhpcyBtb2R1bGUgd2lsbCB0YWludCB0aGUga2VybmVsLiAqLworc3RhdGljIHZvaWQgY2hlY2tfdGFpbnRlZF9tb2R1bGUoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICptX25hbWUpCit7CisJaW50IGZkLCBrZXJuZWxfaGFzX3RhaW50ZWQ7CisJY29uc3QgY2hhciAqcHRyOworCisJa2VybmVsX2hhc190YWludGVkID0gMTsKKwlmZCA9IG9wZW4oVEFJTlRfRklMRU5BTUUsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJa2VybmVsX2hhc190YWludGVkID0gMDsKKwkJZWxzZSBpZiAoZXJybm8gPT0gRUFDQ0VTKQorCQkJa2VybmVsX2hhc190YWludGVkID0gMTsKKwkJZWxzZSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhUQUlOVF9GSUxFTkFNRSk7CisJCQlrZXJuZWxfaGFzX3RhaW50ZWQgPSAwOworCQl9CisJfQorCisJc3dpdGNoIChvYmpfZ3BsX2xpY2Vuc2UoZiwgJnB0cikpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXNldF90YWludGVkKGZkLCBtX25hbWUsIGtlcm5lbF9oYXNfdGFpbnRlZCwgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFLCAibm8gbGljZW5zZSIsICIiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBjYXNlIDI6ICovCisJCQkvKiBUaGUgbW9kdWxlIGhhcyBhIG5vbi1HUEwgbGljZW5zZSBzbyB3ZSBwcmV0ZW5kIHRoYXQgdGhlCisJCQkgKiBrZXJuZWwgYWx3YXlzIGhhcyBhIHRhaW50IGZsYWcgdG8gZ2V0IGEgd2FybmluZyBldmVuIG9uCisJCQkgKiBrZXJuZWxzIHdpdGhvdXQgdGhlIHByb2MgZmxhZy4KKwkJCSAqLworCQkJc2V0X3RhaW50ZWQoZmQsIG1fbmFtZSwgMSwgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFLCAibm9uLUdQTCBsaWNlbnNlIC0gIiwgcHRyKTsKKwkJCWJyZWFrOworCX0KKworCWlmIChmbGFnX2ZvcmNlX2xvYWQpCisJCXNldF90YWludGVkKGZkLCBtX25hbWUsIDEsIFRBSU5UX0ZPUkNFRF9NT0RVTEUsICJmb3JjZWQgbG9hZCIsICIiKTsKKworCWlmIChmZCA+PSAwKQorCQljbG9zZShmZCk7Cit9CisjZWxzZSAvKiAhRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSAqLworI2RlZmluZSBjaGVja190YWludGVkX21vZHVsZSh4LCB5KSBkbyB7IH0gd2hpbGUgKDApOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUworLyogYWRkIG1vZHVsZSBzb3VyY2UsIHRpbWVzdGFtcCwga2VybmVsIHZlcnNpb24gYW5kIGEgc3ltYm9sIGZvciB0aGUKKyAqIHN0YXJ0IG9mIHNvbWUgc2VjdGlvbnMuICB0aGlzIGluZm8gaXMgdXNlZCBieSBrc3ltb29wcyB0byBkbyBiZXR0ZXIKKyAqIGRlYnVnZ2luZy4KKyAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworI2RlZmluZSBnZXRfbW9kdWxlX3ZlcnNpb24oZiwgc3RyKSBnZXRfbW9kdWxlX3ZlcnNpb24oc3RyKQorI2VuZGlmCitzdGF0aWMgaW50CitnZXRfbW9kdWxlX3ZlcnNpb24oc3RydWN0IG9ial9maWxlICpmLCBjaGFyIHN0cltTVFJWRVJTSU9OTEVOXSkKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworCXJldHVybiBuZXdfZ2V0X21vZHVsZV92ZXJzaW9uKGYsIHN0cik7CisjZWxzZQorCXN0cm5jcHkoc3RyLCAiPz8/Iiwgc2l6ZW9mKHN0cikpOworCXJldHVybiAtMTsKKyNlbmRpZgorfQorCisvKiBhZGQgbW9kdWxlIHNvdXJjZSwgdGltZXN0YW1wLCBrZXJuZWwgdmVyc2lvbiBhbmQgYSBzeW1ib2wgZm9yIHRoZQorICogc3RhcnQgb2Ygc29tZSBzZWN0aW9ucy4gIHRoaXMgaW5mbyBpcyB1c2VkIGJ5IGtzeW1vb3BzIHRvIGRvIGJldHRlcgorICogZGVidWdnaW5nLgorICovCitzdGF0aWMgdm9pZAorYWRkX2tzeW1vb3BzX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJY29uc3QgY2hhciAqbV9uYW1lKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHN5bXByZWZpeFtdIEFMSUdOMSA9ICJfX2luc21vZF8iOworCXN0YXRpYyBjb25zdCBjaGFyIHNlY3Rpb25fbmFtZXNbXVs4XSA9IHsKKwkJIi50ZXh0IiwKKwkJIi5yb2RhdGEiLAorCQkiLmRhdGEiLAorCQkiLmJzcyIsCisJCSIuc2JzcyIKKwl9OworCisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKwljaGFyICpuYW1lLCAqYWJzb2x1dGVfZmlsZW5hbWU7CisJY2hhciBzdHJbU1RSVkVSU0lPTkxFTl07CisJdW5zaWduZWQgaTsKKwlpbnQgbG1fbmFtZSwgbGZpbGVuYW1lLCB1c2Vfa3N5bXRhYiwgdmVyc2lvbjsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCisJLyogV0FSTklORzogd2FzIHVzaW5nIHJlYWxwYXRoLCBidXQgcmVwbGFjZWQgYnkgcmVhZGxpbmsgdG8gc3RvcCB1c2luZworCSAqIGxvdHMgb2Ygc3RhY2suIEJ1dCBoZXJlIGl0IHNlZW1zIHRvIGJlIGFibGUgdG8gY2F1c2UgcHJvYmxlbXM/ICovCisJYWJzb2x1dGVfZmlsZW5hbWUgPSB4bWFsbG9jX3JlYWRsaW5rKGZpbGVuYW1lKTsKKwlpZiAoIWFic29sdXRlX2ZpbGVuYW1lKQorCQlhYnNvbHV0ZV9maWxlbmFtZSA9IHhzdHJkdXAoZmlsZW5hbWUpOworCisJbG1fbmFtZSA9IHN0cmxlbihtX25hbWUpOworCWxmaWxlbmFtZSA9IHN0cmxlbihhYnNvbHV0ZV9maWxlbmFtZSk7CisKKwkvKiBhZGQgdG8ga3N5bXRhYiBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvciB0aGVyZSBpcyBubyBrc3ltdGFiIGFuZCBvdGhlciBzeW1ib2xzCisJICogYXJlIG5vdCB0byBiZSBleHBvcnRlZC4gIG90aGVyd2lzZSBsZWF2ZSBrc3ltdGFiIGFsb25lIGZvciBub3csIHRoZQorCSAqICJleHBvcnQgYWxsIHN5bWJvbHMiIGNvbXBhdGliaWxpdHkgY29kZSB3aWxsIGV4cG9ydCB0aGVzZSBzeW1ib2xzIGxhdGVyLgorCSAqLworCXVzZV9rc3ltdGFiID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiX19rc3ltdGFiIikgfHwgZmxhZ19ub2V4cG9ydDsKKworCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50aGlzIik7CisJaWYgKHNlYykgeworCQkvKiB0YWcgdGhlIG1vZHVsZSBoZWFkZXIgd2l0aCB0aGUgb2JqZWN0IG5hbWUsIGxhc3QgbW9kaWZpZWQKKwkJICogdGltZXN0YW1wIGFuZCBtb2R1bGUgdmVyc2lvbi4gIHdvcnN0IGNhc2UgZm9yIG1vZHVsZSB2ZXJzaW9uCisJCSAqIGlzIDB4ZmZmZmZmLCBkZWNpbWFsIDE2Nzc3MjE1LiAgcHV0dGluZyBhbGwgdGhyZWUgZmllbGRzIGluCisJCSAqIG9uZSBzeW1ib2wgaXMgbGVzcyByZWFkYWJsZSBidXQgc2F2ZXMga2VybmVsIHNwYWNlLgorCQkgKi8KKwkJaWYgKHN0YXQoYWJzb2x1dGVfZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKQorCQkJc3RhdGJ1Zi5zdF9tdGltZSA9IDA7CisJCXZlcnNpb24gPSBnZXRfbW9kdWxlX3ZlcnNpb24oZiwgc3RyKTsJLyogLTEgaWYgbm90IGZvdW5kICovCisJCW5hbWUgPSB4YXNwcmludGYoIiVzJXNfTyVzX00lMCpsWF9WJWQiLAorCQkJCXN5bXByZWZpeCwgbV9uYW1lLCBhYnNvbHV0ZV9maWxlbmFtZSwKKwkJCQkoaW50KSgyICogc2l6ZW9mKHN0YXRidWYuc3RfbXRpbWUpKSwKKwkJCQkobG9uZylzdGF0YnVmLnN0X210aW1lLAorCQkJCXZlcnNpb24pOworCQlzeW0gPSBvYmpfYWRkX3N5bWJvbChmLCBuYW1lLCAtMSwKKwkJCQlFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfTk9UWVBFKSwKKwkJCQlzZWMtPmlkeCwgc2VjLT5oZWFkZXIuc2hfYWRkciwgMCk7CisJCWlmICh1c2Vfa3N5bXRhYikKKwkJCW5ld19hZGRfa3N5bXRhYihmLCBzeW0pOworCX0KKwlmcmVlKGFic29sdXRlX2ZpbGVuYW1lKTsKKyNpZmRlZiBfTk9UX1NVUFBPUlRFRF8KKwkvKiByZWNvcmQgd2hlcmUgdGhlIHBlcnNpc3RlbnQgZGF0YSBpcyBnb2luZywgc2FtZSBhZGRyZXNzIGFzIHByZXZpb3VzIHN5bWJvbCAqLworCWlmIChmLT5wZXJzaXN0KSB7CisJCW5hbWUgPSB4YXNwcmludGYoIiVzJXNfUCVzIiwKKwkJCQlzeW1wcmVmaXgsIG1fbmFtZSwgZi0+cGVyc2lzdCk7CisJCXN5bSA9IG9ial9hZGRfc3ltYm9sKGYsIG5hbWUsIC0xLCBFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfTk9UWVBFKSwKKwkJCQlzZWMtPmlkeCwgc2VjLT5oZWFkZXIuc2hfYWRkciwgMCk7CisJCWlmICh1c2Vfa3N5bXRhYikKKwkJCW5ld19hZGRfa3N5bXRhYihmLCBzeW0pOworCX0KKyNlbmRpZgorCS8qIHRhZyB0aGUgZGVzaXJlZCBzZWN0aW9ucyBpZiBzaXplIGlzIG5vbi16ZXJvICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2VjdGlvbl9uYW1lcyk7ICsraSkgeworCQlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIHNlY3Rpb25fbmFtZXNbaV0pOworCQlpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKKwkJCW5hbWUgPSB4YXNwcmludGYoIiVzJXNfUyVzX0wlbGQiLAorCQkJCQlzeW1wcmVmaXgsIG1fbmFtZSwgc2VjLT5uYW1lLAorCQkJCQkobG9uZylzZWMtPmhlYWRlci5zaF9zaXplKTsKKwkJCXN5bSA9IG9ial9hZGRfc3ltYm9sKGYsIG5hbWUsIC0xLCBFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfTk9UWVBFKSwKKwkJCQkJc2VjLT5pZHgsIHNlYy0+aGVhZGVyLnNoX2FkZHIsIDApOworCQkJaWYgKHVzZV9rc3ltdGFiKQorCQkJCW5ld19hZGRfa3N5bXRhYihmLCBzeW0pOworCQl9CisJfQorfQorI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUAorc3RhdGljIHZvaWQgcHJpbnRfbG9hZF9tYXAoc3RydWN0IG9ial9maWxlICpmKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMCisJc3RydWN0IG9ial9zeW1ib2wgKiphbGwsICoqcDsKKwlpbnQgaSwgbnN5bXM7CisJY2hhciAqbG9hZGVkOyAvKiBhcnJheSBvZiBib29sZWFucyAqLworCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisjZW5kaWYKKwkvKiBSZXBvcnQgb24gdGhlIHNlY3Rpb24gbGF5b3V0LiAgKi8KKwlwcmludGYoIlNlY3Rpb25zOiAgICAgICBTaXplICAgICAgJS0qcyAgQWxpZ25cbiIsCisJCQkoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwgIkFkZHJlc3MiKTsKKworCWZvciAoc2VjID0gZi0+bG9hZF9vcmRlcjsgc2VjOyBzZWMgPSBzZWMtPmxvYWRfbmV4dCkgeworCQlpbnQgYTsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJZm9yIChhID0gLTEsIHRtcCA9IHNlYy0+aGVhZGVyLnNoX2FkZHJhbGlnbjsgdG1wOyArK2EpCisJCQl0bXAgPj49IDE7CisJCWlmIChhID09IC0xKQorCQkJYSA9IDA7CisKKwkJcHJpbnRmKCIlLTE1cyAlMDhseCAgJTAqbHggIDIqKiVkXG4iLAorCQkJCXNlYy0+bmFtZSwKKwkJCQkobG9uZylzZWMtPmhlYWRlci5zaF9zaXplLAorCQkJCShpbnQpICgyICogc2l6ZW9mKHZvaWQgKikpLAorCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX2FkZHIsCisJCQkJYSk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMCisJLyogUXVpY2sgcmVmZXJlbmNlIHdoaWNoIHNlY3Rpb24gaW5kaWNlcyBhcmUgbG9hZGVkLiAgKi8KKwlpID0gZi0+aGVhZGVyLmVfc2hudW07CisJbG9hZGVkID0gYWxsb2NhKGkgKiBzaXplb2YobG9hZGVkWzBdKSk7CisJd2hpbGUgKC0taSA+PSAwKQorCQlsb2FkZWRbaV0gPSAoKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApOworCisJLyogQ29sbGVjdCB0aGUgc3ltYm9scyB3ZSdsbCBiZSBsaXN0aW5nLiAgKi8KKwlmb3IgKG5zeW1zID0gaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkKKwkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQorCQkJaWYgKHN5bS0+c2VjaWR4IDw9IFNITl9ISVJFU0VSVkUKKwkJCSAmJiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSB8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKQorCQkJKSB7CisJCQkJKytuc3ltczsKKwkJCX0KKworCWFsbCA9IGFsbG9jYShuc3ltcyAqIHNpemVvZihhbGxbMF0pKTsKKworCWZvciAoaSA9IDAsIHAgPSBhbGw7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkKKwkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQorCQkJaWYgKHN5bS0+c2VjaWR4IDw9IFNITl9ISVJFU0VSVkUKKwkJCSAmJiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSB8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKQorCQkJKSB7CisJCQkJKnArKyA9IHN5bTsKKwkJCX0KKworCS8qIEFuZCBsaXN0IHRoZW0uICAqLworCXByaW50ZigiXG5TeW1ib2xzOlxuIik7CisJZm9yIChwID0gYWxsOyBwIDwgYWxsICsgbnN5bXM7ICsrcCkgeworCQljaGFyIHR5cGUgPSAnPyc7CisJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkJc3ltID0gKnA7CisJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fQUJTKSB7CisJCQl0eXBlID0gJ0EnOworCQkJdmFsdWUgPSBzeW0tPnZhbHVlOworCQl9IGVsc2UgaWYgKHN5bS0+c2VjaWR4ID09IFNITl9VTkRFRikgeworCQkJdHlwZSA9ICdVJzsKKwkJCXZhbHVlID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNlYyA9IGYtPnNlY3Rpb25zW3N5bS0+c2VjaWR4XTsKKworCQkJaWYgKHNlYy0+aGVhZGVyLnNoX3R5cGUgPT0gU0hUX05PQklUUykKKwkJCQl0eXBlID0gJ0InOworCQkJZWxzZSBpZiAoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpIHsKKwkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKQorCQkJCQl0eXBlID0gJ1QnOworCQkJCWVsc2UgaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX1dSSVRFKQorCQkJCQl0eXBlID0gJ0QnOworCQkJCWVsc2UKKwkJCQkJdHlwZSA9ICdSJzsKKwkJCX0KKwkJCXZhbHVlID0gc3ltLT52YWx1ZSArIHNlYy0+aGVhZGVyLnNoX2FkZHI7CisJCX0KKworCQlpZiAoRUxGX1NUX0JJTkQoc3ltLT5pbmZvKSA9PSBTVEJfTE9DQUwpCisJCQl0eXBlIHw9IDB4MjA7IC8qIHRvbG93ZXIuIHNhZmUgZm9yICc/JyB0b28gKi8KKworCQlwcmludGYoIiUwKmx4ICVjICVzXG4iLCAoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwgdmFsdWUsCisJCQkJdHlwZSwgc3ltLT5uYW1lKTsKKwl9CisjZW5kaWYKK30KKyNlbHNlIC8qICFGRUFUVVJFX0lOU01PRF9MT0FEX01BUCAqLworc3RhdGljIHZvaWQgcHJpbnRfbG9hZF9tYXAoc3RydWN0IG9ial9maWxlICpmIFVOVVNFRF9QQVJBTSkKK3sKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIGJiX2luaXRfbW9kdWxlXzI0KGNvbnN0IGNoYXIgKm1fZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpCit7CisJaW50IGtfY3JjczsKKwl1bnNpZ25lZCBsb25nIG1fc2l6ZTsKKwlFbGZXKEFkZHIpIG1fYWRkcjsKKwlzdHJ1Y3Qgb2JqX2ZpbGUgKmY7CisJaW50IGV4aXRfc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCWNoYXIgKm1fbmFtZTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworCWludCBtX2hhc19tb2RpbmZvOworI2VuZGlmCisJY2hhciAqaW1hZ2U7CisJc2l6ZV90IGltYWdlX3NpemU7CisJYm9vbCBtbWFwZWQ7CisKKwlpbWFnZV9zaXplID0gSU5UX01BWCAtIDQwOTU7CisJbW1hcGVkID0gMDsKKwlpbWFnZSA9IHRyeV90b19tbWFwX21vZHVsZShtX2ZpbGVuYW1lLCAmaW1hZ2Vfc2l6ZSk7CisJaWYgKGltYWdlKSB7CisJCW1tYXBlZCA9IDE7CisJfSBlbHNlIHsKKwkJLyogTG9hZCBtb2R1bGUgaW50byBtZW1vcnkgYW5kIHVuemlwIGlmIGNvbXByZXNzZWQgKi8KKwkJaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UobV9maWxlbmFtZSwgJmltYWdlX3NpemUpOworCQlpZiAoIWltYWdlKQorCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwltX25hbWUgPSB4c3RyZHVwKGJiX2Jhc2VuYW1lKG1fZmlsZW5hbWUpKTsKKwkvKiAibW9kdWxlLm9bLmd6XSIgLT4gIm1vZHVsZSIgKi8KKwkqc3RyY2hybnVsKG1fbmFtZSwgJy4nKSA9ICdcMCc7CisKKwlmID0gb2JqX2xvYWQoaW1hZ2UsIGltYWdlX3NpemUsIExPQURCSVRTKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCisJLyogVmVyc2lvbiBjb3JyZXNwb25kZW5jZT8gICovCisJbV9oYXNfbW9kaW5mbyA9IChnZXRfbW9kaW5mb192YWx1ZShmLCAia2VybmVsX3ZlcnNpb24iKSAhPSBOVUxMKTsKKwlpZiAoIWZsYWdfcXVpZXQpIHsKKwkJY2hhciBtX3N0cnZlcnNpb25bU1RSVkVSU0lPTkxFTl07CisJCXN0cnVjdCB1dHNuYW1lIHV0czsKKworCQlpZiAobV9oYXNfbW9kaW5mbykgeworCQkJaW50IG1fdmVyc2lvbiA9IG5ld19nZXRfbW9kdWxlX3ZlcnNpb24oZiwgbV9zdHJ2ZXJzaW9uKTsKKwkJCWlmIChtX3ZlcnNpb24gPT0gLTEpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCB0aGUga2VybmVsIHZlcnNpb24gIgorCQkJCQkidGhlIG1vZHVsZSB3YXMgY29tcGlsZWQgZm9yIik7CisJCQl9CisJCX0KKworCQl1bmFtZSgmdXRzKTsKKwkJaWYgKHN0cm5jbXAodXRzLnJlbGVhc2UsIG1fc3RydmVyc2lvbiwgU1RSVkVSU0lPTkxFTikgIT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCIlc2tlcm5lbC1tb2R1bGUgdmVyc2lvbiBtaXNtYXRjaFxuIgorCQkJCSJcdCVzIHdhcyBjb21waWxlZCBmb3Iga2VybmVsIHZlcnNpb24gJXNcbiIKKwkJCQkiXHR3aGlsZSB0aGlzIGtlcm5lbCBpcyB2ZXJzaW9uICVzIiwKKwkJCQlmbGFnX2ZvcmNlX2xvYWQgPyAid2FybmluZzogIiA6ICIiLAorCQkJCW1fbmFtZSwgbV9zdHJ2ZXJzaW9uLCB1dHMucmVsZWFzZSk7CisJCQlpZiAoIWZsYWdfZm9yY2VfbG9hZCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKHF1ZXJ5X21vZHVsZShOVUxMLCAwLCBOVUxMLCAwLCBOVUxMKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm9sZCAodW5zdXBwb3J0ZWQpIGtlcm5lbCIpOworCW5ld19nZXRfa2VybmVsX3N5bWJvbHMoKTsKKwlrX2NyY3MgPSBuZXdfaXNfa2VybmVsX2NoZWNrc3VtbWVkKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworCXsKKwkJaW50IG1fY3JjcyA9IDA7CisJCWlmIChtX2hhc19tb2RpbmZvKQorCQkJbV9jcmNzID0gbmV3X2lzX21vZHVsZV9jaGVja3N1bW1lZChmKTsKKwkJaWYgKG1fY3JjcyAhPSBrX2NyY3MpCisJCQlvYmpfc2V0X3N5bWJvbF9jb21wYXJlKGYsIG5jdl9zdHJjbXAsIG5jdl9zeW1ib2xfaGFzaCk7CisJfQorI2VuZGlmCisKKwkvKiBMZXQgdGhlIG1vZHVsZSBrbm93IGFib3V0IHRoZSBrZXJuZWwgc3ltYm9scy4gICovCisJYWRkX2tlcm5lbF9zeW1ib2xzKGYpOworCisJLyogQWxsb2NhdGUgY29tbW9uIHN5bWJvbHMsIHN5bWJvbCB0YWJsZXMsIGFuZCBzdHJpbmcgdGFibGVzLiAgKi8KKwluZXdfY3JlYXRlX3RoaXNfbW9kdWxlKGYsIG1fbmFtZSk7CisJb2JqX2NoZWNrX3VuZGVmaW5lZHMoZik7CisJb2JqX2FsbG9jYXRlX2NvbW1vbnMoZik7CisJY2hlY2tfdGFpbnRlZF9tb2R1bGUoZiwgbV9uYW1lKTsKKworCS8qIERvbmUgd2l0aCB0aGUgbW9kdWxlIG5hbWUsIG9uIHRvIHRoZSBvcHRpb25hbCB2YXI9dmFsdWUgYXJndW1lbnRzICovCisJbmV3X3Byb2Nlc3NfbW9kdWxlX2FyZ3VtZW50cyhmLCBvcHRpb25zKTsKKworCWFyY2hfY3JlYXRlX2dvdChmKTsKKwloaWRlX3NwZWNpYWxfc3ltYm9scyhmKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTCisJYWRkX2tzeW1vb3BzX3N5bWJvbHMoZiwgbV9maWxlbmFtZSwgbV9uYW1lKTsKKyNlbmRpZgorCisJbmV3X2NyZWF0ZV9tb2R1bGVfa3N5bXRhYihmKTsKKworCS8qIEZpbmQgY3VycmVudCBzaXplIG9mIHRoZSBtb2R1bGUgKi8KKwltX3NpemUgPSBvYmpfbG9hZF9zaXplKGYpOworCisJbV9hZGRyID0gY3JlYXRlX21vZHVsZShtX25hbWUsIG1fc2l6ZSk7CisJaWYgKG1fYWRkciA9PSAoRWxmVyhBZGRyKSkoLTEpKSBzd2l0Y2ggKGVycm5vKSB7CisJY2FzZSBFRVhJU1Q6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJhIG1vZHVsZSBuYW1lZCAlcyBhbHJlYWR5IGV4aXN0cyIsIG1fbmFtZSk7CisJY2FzZSBFTk9NRU06CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBhbGxvY2F0ZSBrZXJuZWwgbWVtb3J5IGZvciBtb2R1bGU7IG5lZWRlZCAlbHUgYnl0ZXMiLAorCQkJCW1fc2l6ZSk7CisJZGVmYXVsdDoKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjcmVhdGVfbW9kdWxlOiAlcyIsIG1fbmFtZSk7CisJfQorCisjaWYgIUxPQURCSVRTCisJLyoKKwkgKiB0aGUgUFJPR0JJVFMgc2VjdGlvbiB3YXMgbm90IGxvYWRlZCBieSB0aGUgb2JqX2xvYWQKKwkgKiBub3cgd2UgY2FuIGxvYWQgdGhlbSBkaXJlY3RseSBpbnRvIHRoZSBrZXJuZWwgbWVtb3J5CisJICovCisJaWYgKCFvYmpfbG9hZF9wcm9nYml0cyhpbWFnZSwgaW1hZ2Vfc2l6ZSwgZiwgKGNoYXIqKW1fYWRkcikpIHsKKwkJZGVsZXRlX21vZHVsZShtX25hbWUsIDApOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKworCWlmICghb2JqX3JlbG9jYXRlKGYsIG1fYWRkcikpIHsKKwkJZGVsZXRlX21vZHVsZShtX25hbWUsIDApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIW5ld19pbml0X21vZHVsZShtX25hbWUsIGYsIG1fc2l6ZSkpIHsKKwkJZGVsZXRlX21vZHVsZShtX25hbWUsIDApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZmxhZ19wcmludF9sb2FkX21hcCkKKwkJcHJpbnRfbG9hZF9tYXAoZik7CisKKwlleGl0X3N0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKworIG91dDoKKwlpZiAobW1hcGVkKQorCQltdW5tYXAoaW1hZ2UsIGltYWdlX3NpemUpOworCWVsc2UKKwkJZnJlZShpbWFnZSk7CisJZnJlZShtX25hbWUpOworCisJcmV0dXJuIGV4aXRfc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvbW9kdXRpbHMuYyBiL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL21vZHV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4N2NhNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL21vZHV0aWxzLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb21tb24gbW9kdXRpbHMgcmVsYXRlZCBmdW5jdGlvbnMgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVGltbyBUZXJhcyA8dGltby50ZXJhc0Bpa2kuZmk+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgIm1vZHV0aWxzLmgiCisKKyNpZmRlZiBfX1VDTElCQ19fCitleHRlcm4gaW50IGluaXRfbW9kdWxlKHZvaWQgKm1vZHVsZSwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKm9wdGlvbnMpOworZXh0ZXJuIGludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKKyNlbHNlCisjIGluY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjIGRlZmluZSBpbml0X21vZHVsZShtb2QsIGxlbiwgb3B0cykgc3lzY2FsbChfX05SX2luaXRfbW9kdWxlLCBtb2QsIGxlbiwgb3B0cykKKyMgZGVmaW5lIGRlbGV0ZV9tb2R1bGUobW9kLCBmbGFncykgc3lzY2FsbChfX05SX2RlbGV0ZV9tb2R1bGUsIG1vZCwgZmxhZ3MpCisjZW5kaWYKKwordm9pZCBGQVNUX0ZVTkMgcmVwbGFjZShjaGFyICpzLCBjaGFyIHdoYXQsIGNoYXIgd2l0aCkKK3sKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKHdoYXQgPT0gKnMpCisJCQkqcyA9IHdpdGg7CisJCSsrczsKKwl9Cit9CisKK2NoYXIqIEZBU1RfRlVOQyByZXBsYWNlX3VuZGVyc2NvcmVzKGNoYXIgKnMpCit7CisJcmVwbGFjZShzLCAnLScsICdfJyk7CisJcmV0dXJuIHM7Cit9CisKK2ludCBGQVNUX0ZVTkMgc3RyaW5nX3RvX2xsaXN0KGNoYXIgKnN0cmluZywgbGxpc3RfdCAqKmxsaXN0LCBjb25zdCBjaGFyICpkZWxpbSkKK3sKKwljaGFyICp0b2s7CisJaW50IGxlbiA9IDA7CisKKwl3aGlsZSAoKHRvayA9IHN0cnNlcCgmc3RyaW5nLCBkZWxpbSkpICE9IE5VTEwpIHsKKwkJaWYgKHRva1swXSA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWxsaXN0X2FkZF90b19lbmQobGxpc3QsIHhzdHJkdXAodG9rKSk7CisJCWxlbiArPSBzdHJsZW4odG9rKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworY2hhciogRkFTVF9GVU5DIGZpbGVuYW1lMm1vZG5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKm1vZG5hbWUpCit7CisJaW50IGk7CisJY2hhciAqZnJvbTsKKworCWlmIChmaWxlbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobW9kbmFtZSA9PSBOVUxMKQorCQltb2RuYW1lID0geG1hbGxvYyhNT0RVTEVfTkFNRV9MRU4pOworCWZyb20gPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKGZpbGVuYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgKE1PRFVMRV9OQU1FX0xFTi0xKSAmJiBmcm9tW2ldICE9ICdcMCcgJiYgZnJvbVtpXSAhPSAnLic7IGkrKykKKwkJbW9kbmFtZVtpXSA9IChmcm9tW2ldID09ICctJykgPyAnXycgOiBmcm9tW2ldOworCW1vZG5hbWVbaV0gPSAnXDAnOworCisJcmV0dXJuIG1vZG5hbWU7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBwYXJzZV9jbWRsaW5lX21vZHVsZV9vcHRpb25zKGNoYXIgKiphcmd2LCBpbnQgcXVvdGVfc3BhY2VzKQoreworCWNoYXIgKm9wdGlvbnM7CisJaW50IG9wdGxlbjsKKworCW9wdGlvbnMgPSB4emFsbG9jKDEpOworCW9wdGxlbiA9IDA7CisJd2hpbGUgKCorK2FyZ3YpIHsKKwkJY29uc3QgY2hhciAqZm10OworCQljb25zdCBjaGFyICp2YXI7CisJCWNvbnN0IGNoYXIgKnZhbDsKKworCQl2YXIgPSAqYXJndjsKKwkJb3B0aW9ucyA9IHhyZWFsbG9jKG9wdGlvbnMsIG9wdGxlbiArIDIgKyBzdHJsZW4odmFyKSArIDIpOworCQlmbXQgPSAiJS4qcyVzICI7CisJCXZhbCA9IHN0cmNocm51bCh2YXIsICc9Jyk7CisJCWlmIChxdW90ZV9zcGFjZXMpIHsKKwkJCS8qCisJCQkgKiBtb2Rwcm9iZSAobW9kdWxlLWluaXQtdG9vbHMgdmVyc2lvbiAzLjExLjEpIGNvbXBhdDoKKwkJCSAqIHF1b3RlIG9ubHkgdmFsdWU6CisJCQkgKiB2YXI9InZhbCB3aXRoIHNwYWNlcyIsIG5vdCAidmFyPXZhbCB3aXRoIHNwYWNlcyIKKwkJCSAqIChub3RlOiB2YXIgKm5hbWUqIGlzIG5vdCBjaGVja2VkIGZvciBzcGFjZXMhKQorCQkJICovCisJCQlpZiAoKnZhbCkgeyAvKiBoYXMgdmFyPXZhbCBmb3JtYXQuIHNraXAgJz0nICovCisJCQkJdmFsKys7CisJCQkJaWYgKHN0cmNocih2YWwsICcgJykpCisJCQkJCWZtdCA9ICIlLipzXCIlc1wiICI7CisJCQl9CisJCX0KKwkJb3B0bGVuICs9IHNwcmludGYob3B0aW9ucyArIG9wdGxlbiwgZm10LCAoaW50KSh2YWwgLSB2YXIpLCB2YXIsIHZhbCk7CisJfQorCS8qIFJlbW92ZSB0cmFpbGluZyBzcGFjZS4gRGlzYWJsZWQgKi8KKwkvKiBpZiAob3B0bGVuICE9IDApIG9wdGlvbnNbb3B0bGVuLTFdID0gJ1wwJzsgKi8KKwlyZXR1cm4gb3B0aW9uczsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9UUllfTU1BUAordm9pZCogRkFTVF9GVU5DIHRyeV90b19tbWFwX21vZHVsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICppbWFnZV9zaXplX3ApCit7CisJLyogV2UgaGF2ZSB1c2VyIHJlcG9ydHMgb2YgZmFpbHVyZSB0byBsb2FkIDNNQiBtb2R1bGUKKwkgKiBvbiBhIDE2TUIgUkFNIG1hY2hpbmUuIEFwcGFyZW50bHkgZXZlbiBhIHRyYW5zaWVudAorCSAqIG1lbW9yeSBzcGlrZSB0byA2TUIgZHVyaW5nIG1vZHVsZSBsb2FkCisJICogaXMgdG9vIGJpZyBmb3IgdGhhdCBzeXN0ZW0uICovCisJdm9pZCAqaW1hZ2U7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IGZkOworCisJZmQgPSB4b3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWZzdGF0KGZkLCAmc3QpOworCWltYWdlID0gTlVMTDsKKwkvKiBzdC5zdF9zaXplIGlzIG9mZl90LCB3ZSBjYW4ndCBqdXN0IHBhc3MgaXQgdG8gbW1hcCAqLworCWlmIChzdC5zdF9zaXplIDw9ICppbWFnZV9zaXplX3ApIHsKKwkJc2l6ZV90IGltYWdlX3NpemUgPSBzdC5zdF9zaXplOworCQlpbWFnZSA9IG1tYXAoTlVMTCwgaW1hZ2Vfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCQlpZiAoaW1hZ2UgPT0gTUFQX0ZBSUxFRCkgeworCQkJaW1hZ2UgPSBOVUxMOworCQl9IGVsc2UgaWYgKCoodWludDMyX3QqKWltYWdlICE9IFNXQVBfQkUzMigweDdmNDU0QzQ2KSkgeworCQkJLyogTm8gRUxGIHNpZ25hdHVyZS4gQ29tcHJlc3NlZCBtb2R1bGU/ICovCisJCQltdW5tYXAoaW1hZ2UsIGltYWdlX3NpemUpOworCQkJaW1hZ2UgPSBOVUxMOworCQl9IGVsc2UgeworCQkJLyogU3VjY2Vzcy4gUmVwb3J0IHRoZSBzaXplICovCisJCQkqaW1hZ2Vfc2l6ZV9wID0gaW1hZ2Vfc2l6ZTsKKwkJfQorCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIGltYWdlOworfQorI2VuZGlmCisKKy8qIFJldHVybjoKKyAqIDAgb24gc3VjY2VzcywKKyAqIC1lcnJubyBvbiBvcGVuL3JlYWQgZXJyb3IsCisgKiBlcnJubyBvbiBpbml0X21vZHVsZSgpIGVycm9yCisgKi8KK2ludCBGQVNUX0ZVTkMgYmJfaW5pdF9tb2R1bGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpCit7CisJc2l6ZV90IGltYWdlX3NpemU7CisJY2hhciAqaW1hZ2U7CisJaW50IHJjOworCWJvb2wgbW1hcGVkOworCisJaWYgKCFvcHRpb25zKQorCQlvcHRpb25zID0gIiI7CisKKy8vVE9ETzogYXVkaXQgYmJfaW5pdF9tb2R1bGVfMjQgdG8gbWF0Y2ggZXJyb3IgY29kZSBjb252ZW50aW9uCisjaWYgRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMKKwlpZiAoZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQorCQlyZXR1cm4gYmJfaW5pdF9tb2R1bGVfMjQoZmlsZW5hbWUsIG9wdGlvbnMpOworI2VuZGlmCisKKwlpbWFnZV9zaXplID0gSU5UX01BWCAtIDQwOTU7CisJbW1hcGVkID0gMDsKKwlpbWFnZSA9IHRyeV90b19tbWFwX21vZHVsZShmaWxlbmFtZSwgJmltYWdlX3NpemUpOworCWlmIChpbWFnZSkgeworCQltbWFwZWQgPSAxOworCX0gZWxzZSB7CisJCWVycm5vID0gRU5PTUVNOyAvKiBtYXkgYmUgY2hhbmdlZCBieSBlLmcuIG9wZW4gZXJyb3JzIGJlbG93ICovCisJCWltYWdlID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKGZpbGVuYW1lLCAmaW1hZ2Vfc2l6ZSk7CisJCWlmICghaW1hZ2UpCisJCQlyZXR1cm4gLWVycm5vOworCX0KKworCWVycm5vID0gMDsKKwlpbml0X21vZHVsZShpbWFnZSwgaW1hZ2Vfc2l6ZSwgb3B0aW9ucyk7CisJcmMgPSBlcnJubzsKKwlpZiAobW1hcGVkKQorCQltdW5tYXAoaW1hZ2UsIGltYWdlX3NpemUpOworCWVsc2UKKwkJZnJlZShpbWFnZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgRkFTVF9GVU5DIGJiX2RlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJZXJybm8gPSAwOworCWRlbGV0ZV9tb2R1bGUobW9kdWxlLCBmbGFncyk7CisJcmV0dXJuIGVycm5vOworfQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgbW9kZXJyb3IoaW50IGVycikKK3sKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgLTE6IC8qIGJ0dzogaXQncyAtRVBFUk0gKi8KKwkJcmV0dXJuICJubyBzdWNoIG1vZHVsZSI7CisJY2FzZSBFTk9FWEVDOgorCQlyZXR1cm4gImludmFsaWQgbW9kdWxlIGZvcm1hdCI7CisJY2FzZSBFTk9FTlQ6CisJCXJldHVybiAidW5rbm93biBzeW1ib2wgaW4gbW9kdWxlLCBvciB1bmtub3duIHBhcmFtZXRlciI7CisJY2FzZSBFU1JDSDoKKwkJcmV0dXJuICJtb2R1bGUgaGFzIHdyb25nIHN5bWJvbCB2ZXJzaW9uIjsKKwljYXNlIEVOT1NZUzoKKwkJcmV0dXJuICJrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCByZXF1ZXN0ZWQgb3BlcmF0aW9uIjsKKwl9CisJaWYgKGVyciA8IDApIC8qIHNob3VsZCBhbHdheXMgYmUgKi8KKwkJZXJyID0gLWVycjsKKwlyZXR1cm4gc3RyZXJyb3IoZXJyKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL21vZHV0aWxzL21vZHV0aWxzLmggYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9tb2R1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDU5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9tb2R1dGlscy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb21tb24gbW9kdXRpbHMgcmVsYXRlZCBmdW5jdGlvbnMgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVGltbyBUZXJhcyA8dGltby50ZXJhc0Bpa2kuZmk+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIE1PRFVUSUxTX0gKKyNkZWZpbmUgTU9EVVRJTFNfSCAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogbGludXgvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBoYXMgNjQsIGJ1dCB0aGlzIGlzIGFsc28gdXNlZAorICogaW50ZXJuYWxseSBmb3IgdGhlIG1heGltdW0gYWxpYXMgbmFtZSBsZW5ndGgsIHdoaWNoIGNhbiBiZSBxdWl0ZSBsb25nICovCisjZGVmaW5lIE1PRFVMRV9OQU1FX0xFTiAyNTYKKwordm9pZCByZXBsYWNlKGNoYXIgKnMsIGNoYXIgd2hhdCwgY2hhciB3aXRoKSBGQVNUX0ZVTkM7CitjaGFyICpyZXBsYWNlX3VuZGVyc2NvcmVzKGNoYXIgKnMpIEZBU1RfRlVOQzsKK2ludCBzdHJpbmdfdG9fbGxpc3QoY2hhciAqc3RyaW5nLCBsbGlzdF90ICoqbGxpc3QsIGNvbnN0IGNoYXIgKmRlbGltKSBGQVNUX0ZVTkM7CitjaGFyICpmaWxlbmFtZTJtb2RuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICptb2RuYW1lKSBGQVNUX0ZVTkM7CitjaGFyICpwYXJzZV9jbWRsaW5lX21vZHVsZV9vcHRpb25zKGNoYXIgKiphcmd2LCBpbnQgcXVvdGVfc3BhY2VzKSBGQVNUX0ZVTkM7CisKKy8qIGluc21vZCBmb3IgMi40IGFuZCBtb2Rwcm9iZSdzIG9wdGlvbnMgKGluc21vZCAyLjYgaGFzIG5vIG9wdGlvbnMgYXQgYWxsKTogKi8KKyNkZWZpbmUgSU5TTU9EX09QVFMgXAorCSJ2cXMiIFwKKwlJRl9GRUFUVVJFXzJfNF9NT0RVTEVTKCJMZmt4IiBJRl9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCgibSIpKQorI2RlZmluZSBJTlNNT0RfQVJHUyAvKiAod2FzIG1lYW50IHRvIHN1cHBvcnQgLW8gTkFNRSkgLCBOVUxMICovCisKK2VudW0geworCUlOU01PRF9PUFRfVkVSQk9TRSAgICAgID0gKDEgPDwgMCksCisJSU5TTU9EX09QVF9TSUxFTlQgICAgICAgPSAoMSA8PCAxKSwKKwlJTlNNT0RfT1BUX1NZU0xPRyAgICAgICA9ICgxIDw8IDIpLAorCS8vSU5TTU9EX09QVF9PVVRQVVROQU1FID0gKDEgPDwgeCkgLSBub3Qgc3VwcG9ydGVkIHlldAorCUlOU01PRF9PUFRfTE9DSyAgICAgICAgID0gKDEgPDwgMykgKiBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUywKKwlJTlNNT0RfT1BUX0ZPUkNFICAgICAgICA9ICgxIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMsCisJSU5TTU9EX09QVF9LRVJORUxEICAgICAgPSAoMSA8PCA1KSAqIEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTLAorCUlOU01PRF9PUFRfTk9fRVhQT1JUICAgID0gKDEgPDwgNikgKiBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUywKKwlJTlNNT0RfT1BUX1BSSU5UX01BUCAgICA9ICgxIDw8IDcpICogRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQLAorCUlOU01PRF9PUFRfVU5VU0VEICAgICAgID0KKwkJKElOU01PRF9PUFRfUFJJTlRfTUFQID8gSU5TTU9EX09QVF9QUklOVF9NQVAKKwkJOiBJTlNNT0RfT1BUX05PX0VYUE9SVCA/IElOU01PRF9PUFRfTk9fRVhQT1JUCisJCTogSU5TTU9EX09QVF9TWVNMT0cKKwkJKSA8PCAxCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQCit2b2lkKiBGQVNUX0ZVTkMgdHJ5X3RvX21tYXBfbW9kdWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKmltYWdlX3NpemVfcCk7CisjZWxzZQorIyBkZWZpbmUgdHJ5X3RvX21tYXBfbW9kdWxlKGZpbGVuYW1lLCBpbWFnZV9zaXplKSBOVUxMCisjZW5kaWYKKworLyogUmV0dXJuOgorICogMCBvbiBzdWNjZXNzLAorICogLWVycm5vIG9uIG9wZW4vcmVhZCBlcnJvciwKKyAqIGVycm5vIG9uIGluaXRfbW9kdWxlKCkgZXJyb3IKKyAqLworaW50IEZBU1RfRlVOQyBiYl9pbml0X21vZHVsZShjb25zdCBjaGFyICptb2R1bGUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpOworLyogUmV0dXJuOgorICogMCBvbiBzdWNjZXNzLAorICogZXJybm8gb24gaW5pdF9tb2R1bGUoKSBlcnJvcgorICovCitpbnQgRkFTVF9GVU5DIGJiX2RlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworLyogVHJhbnNsYXRlcyBlcnJvciByZXR1cm4gdG8gYSBzdHJpbmcgKi8KK2NvbnN0IGNoYXIgKm1vZGVycm9yKGludCBlcnIpIEZBU1RfRlVOQzsKKworI2lmIEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTCitpbnQgRkFTVF9GVU5DIGJiX2luaXRfbW9kdWxlXzI0KGNvbnN0IGNoYXIgKm1vZHVsZSwgY29uc3QgY2hhciAqb3B0aW9ucyk7CisjZW5kaWYKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9tb2R1dGlscy9ybW1vZC5jIGIvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvcm1tb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTRhOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbW9kdXRpbHMvcm1tb2QuYwpAQCAtMCwwICsxLDY3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJtbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRpbW8gVGVyYXMgPHRpbW8udGVyYXNAaWtpLmZpPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfUk1NT0QoQVBQTEVUKHJtbW9kLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy91c2FnZTojaWYgIUVOQUJMRV9NT0RQUk9CRV9TTUFMTAorLy91c2FnZTojZGVmaW5lIHJtbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXdmYV0gW01PRFVMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgcm1tb2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVbmxvYWQga2VybmVsIG1vZHVsZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJV2FpdCB1bnRpbCB0aGUgbW9kdWxlIGlzIG5vIGxvbmdlciB1c2VkIgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSB1bmxvYWQiCisvL3VzYWdlOiAgICAgIlxuCS1hCVJlbW92ZSBhbGwgdW51c2VkIG1vZHVsZXMgKHJlY3Vyc2l2ZWx5KSIKKy8vdXNhZ2U6I2RlZmluZSBybW1vZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBybW1vZCB0dWxpcFxuIgorLy91c2FnZTojZW5kaWYKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibW9kdXRpbHMuaCIKKworaW50IHJtbW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBybW1vZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJdW5zaWduZWQgZmxhZ3MgPSBPX05PTkJMT0NLIHwgT19FWENMOworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lLiAqLworCW4gPSBnZXRvcHQzMihhcmd2LCAid2ZhcyIpOyAvLyAtcyBpZ25vcmVkCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG4gJiAxKSAgLy8gLS13YWl0CisJCWZsYWdzICY9IH5PX05PTkJMT0NLOworCWlmIChuICYgMikgIC8vIC0tZm9yY2UKKwkJZmxhZ3MgfD0gT19UUlVOQzsKKwlpZiAobiAmIDQpIHsKKwkJLyogVW5sb2FkIF9hbGxfIHVudXNlZCBtb2R1bGVzIHZpYSBOVUxMIGRlbGV0ZV9tb2R1bGUoKSBjYWxsICovCisJCWlmIChiYl9kZWxldGVfbW9kdWxlKE5VTEwsIGZsYWdzKSAhPSAwICYmIGVycm5vICE9IEVGQVVMVCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicm1tb2QiKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlpZiAoISphcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisKKwluID0gRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMgJiYgZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApOworCXdoaWxlICgqYXJndikgeworCQljaGFyIG1vZG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwkJY29uc3QgY2hhciAqYm5hbWU7CisKKwkJYm5hbWUgPSBiYl9iYXNlbmFtZSgqYXJndisrKTsKKwkJaWYgKG4pCisJCQlzYWZlX3N0cm5jcHkobW9kbmFtZSwgYm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7CisJCWVsc2UKKwkJCWZpbGVuYW1lMm1vZG5hbWUoYm5hbWUsIG1vZG5hbWUpOworCQlpZiAoYmJfZGVsZXRlX21vZHVsZShtb2RuYW1lLCBmbGFncykpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgdW5sb2FkICclcyc6ICVzIiwKKwkJCQkJICAgICBtb2RuYW1lLCBtb2RlcnJvcihlcnJubykpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlYmEwZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDk4OSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiTmV0d29ya2luZyBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgRkVBVFVSRV9JUFY2CisJYm9vbCAiRW5hYmxlIElQdjYgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgSVB2NiBzdXBwb3J0IGluIGJ1c3lib3guCisJICBUaGlzIGFkZHMgSVB2NiBzdXBwb3J0IGluIHRoZSBuZXR3b3JraW5nIGFwcGxldHMuCisKK2NvbmZpZyBGRUFUVVJFX1VOSVhfTE9DQUwKKwlib29sICJFbmFibGUgVW5peCBkb21haW4gc29ja2V0IHN1cHBvcnQgKHVzdWFsbHkgbm90IG5lZWRlZCkiCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0IGluIGFsbCBidXN5Ym94IG5ldHdvcmtpbmcKKwkgIGFwcGxldHMuICBBZGRyZXNzIG9mIHRoZSBmb3JtIGxvY2FsOi9wYXRoL3RvL3VuaXgvc29ja2V0CisJICB3aWxsIGJlIHJlY29nbml6ZWQuCisKKwkgIFRoaXMgZXh0ZW5zaW9uIGlzIGFsbW9zdCBuZXZlciB1c2VkIGluIHJlYWwgd29ybGQgdXNhZ2UuCisJICBZb3UgbW9zdCBsaWtlbHkgd2FudCB0byBzYXkgTi4KKworY29uZmlnIEZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUworCWJvb2wgIlByZWZlciBJUHY0IGFkZHJlc3NlcyBmcm9tIEROUyBxdWVyaWVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUFY2CisJaGVscAorCSAgVXNlIElQdjQgYWRkcmVzcyBvZiBuZXR3b3JrIGhvc3QgaWYgaXQgaGFzIG9uZS4KKworCSAgSWYgdGhpcyBvcHRpb24gaXMgb2ZmLCB0aGUgZmlyc3QgcmV0dXJuZWQgYWRkcmVzcyB3aWxsIGJlIHVzZWQuCisJICBUaGlzIG1heSBjYXVzZSBwcm9ibGVtcyB3aGVuIHlvdXIgRE5TIHNlcnZlciBpcyBJUHY2LWNhcGFibGUgYW5kCisJICBpcyByZXR1cm5pbmcgSVB2NiBob3N0IGFkZHJlc3NlcyB0b28uIElmIElQdjYgYWRkcmVzcworCSAgcHJlY2VkZXMgSVB2NCBvbmUgaW4gRE5TIHJlcGx5LCBidXN5Ym94IG5ldHdvcmsgYXBwbGV0cworCSAgKGUuZy4gd2dldCkgd2lsbCB1c2UgSVB2NiBhZGRyZXNzLiBPbiBhbiBJUHY2LWluY2FwYWJsZSBob3N0CisJICBvciBuZXR3b3JrIGFwcGxldHMgd2lsbCBmYWlsIHRvIGNvbm5lY3QgdG8gdGhlIGhvc3QKKwkgIHVzaW5nIElQdjYgYWRkcmVzcy4KKworY29uZmlnIFZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlMKKwlib29sICJWZXJib3NlIHJlc29sdXRpb24gZXJyb3JzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsZSBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCBzaW1wbGlzdGljCisJICAiY2FuJ3QgcmVzb2x2ZSAnaG9zdG5hbWUuY29tJyIgYW5kIHdhbnQgdG8ga25vdyBtb3JlLgorCSAgVGhpcyBtYXkgaW5jcmVhc2Ugc2l6ZSBvZiB5b3VyIGV4ZWN1dGFibGUgYSBiaXQuCisKK2NvbmZpZyBBUlAKKwlib29sICJhcnAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgTWFuaXB1bGF0ZSB0aGUgc3lzdGVtIEFSUCBjYWNoZS4KKworY29uZmlnIEFSUElORworCWJvb2wgImFycGluZyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBQaW5nIGhvc3RzIGJ5IEFSUCBwYWNrZXRzLgorCitjb25maWcgQlJDVEwKKwlib29sICJicmN0bCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBNYW5hZ2UgZXRoZXJuZXQgYnJpZGdlcy4KKwkgIFN1cHBvcnRzIGFkZGJyL2RlbGJyIGFuZCBhZGRpZi9kZWxpZi4KKworY29uZmlnIEZFQVRVUkVfQlJDVExfRkFOQ1kKKwlib29sICJGYW5jeSBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQlJDVEwKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgZXh0ZW5kZWQgb3B0aW9uIGxpa2U6CisJICAgIHNldGFnZWluZywgc2V0ZmQsIHNldGhlbGxvLCBzZXRtYXhhZ2UsCisJICAgIHNldHBhdGhjb3N0LCBzZXRwb3J0cHJpbywgc2V0YnJpZGdlcHJpbywKKwkgICAgc3RwCisJICBUaGlzIGFkZHMgYWJvdXQgNjAwIGJ5dGVzLgorCitjb25maWcgRkVBVFVSRV9CUkNUTF9TSE9XCisJYm9vbCAiU3VwcG9ydCBzaG93LCBzaG93bWFjIGFuZCBzaG93c3RwIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQlJDVEwgJiYgRkVBVFVSRV9CUkNUTF9GQU5DWQorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciBvcHRpb24gd2hpY2ggcHJpbnRzIHRoZSBjdXJyZW50IGNvbmZpZzoKKwkgICAgc2hvd21hY3MsIHNob3dzdHAsIHNob3cKKworY29uZmlnIEROU0QKKwlib29sICJkbnNkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNtYWxsIGFuZCBzdGF0aWMgRE5TIHNlcnZlciBkYWVtb24uCisKK2NvbmZpZyBFVEhFUl9XQUtFCisJYm9vbCAiZXRoZXItd2FrZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTZW5kIGEgbWFnaWMgcGFja2V0IHRvIHdha2UgdXAgc2xlZXBpbmcgbWFjaGluZXMuCisKK2NvbmZpZyBGQUtFSURFTlRECisJYm9vbCAiZmFrZWlkZW50ZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBmYWtlaWRlbnRkIGxpc3RlbnMgb24gdGhlIGlkZW50IHBvcnQgYW5kIHJldHVybnMgYSBwcmVkZWZpbmVkCisJICBmYWtlIHZhbHVlIG9uIGFueSBxdWVyeS4KKworY29uZmlnIEZUUEQKKwlib29sICJmdHBkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHNpbXBsZSBGVFAgZGFlbW9uLiBZb3UgaGF2ZSB0byBydW4gaXQgdmlhIGluZXRkLgorCitjb25maWcgRkVBVFVSRV9GVFBfV1JJVEUKKwlib29sICJFbmFibGUgdXBsb2FkIGNvbW1hbmRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRlRQRAorCWhlbHAKKwkgIEVuYWJsZSBhbGwga2luZHMgb2YgRlRQIHVwbG9hZCBjb21tYW5kcyAoLXcgb3B0aW9uKQorCitjb25maWcgRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVAorCWJvb2wgIkVuYWJsZSB3b3JrYXJvdW5kIGZvciBSRkMtdmlvbGF0aW5nIGNsaWVudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGVFBECisJaGVscAorCSAgU29tZSBmdHAgY2xpZW50cyAoYW1vbmcgdGhlbSBLREUncyBLb25xdWVyb3IpIGlzc3VlIGlsbGVnYWwKKwkgICJMSVNUIC1sIiByZXF1ZXN0cy4gVGhpcyBvcHRpb24gd29ya3MgYXJvdW5kIHN1Y2ggcHJvYmxlbXMuCisJICBJdCBtaWdodCBwcmV2ZW50IHlvdSBmcm9tIGxpc3RpbmcgZmlsZXMgc3RhcnRpbmcgd2l0aCAiLSIgYW5kCisJICBpdCBpbmNyZWFzZXMgdGhlIGNvZGUgc2l6ZSBieSB+NDAgYnl0ZXMuCisJICBNb3N0IG90aGVyIGZ0cCBzZXJ2ZXJzIHNlZW0gdG8gYmVoYXZlIHNpbWlsYXIgdG8gdGhpcy4KKworY29uZmlnIEZUUEdFVAorCWJvb2wgImZ0cGdldCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBSZXRyaWV2ZSBhIHJlbW90ZSBmaWxlIHZpYSBGVFAuCisKK2NvbmZpZyBGVFBQVVQKKwlib29sICJmdHBwdXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3RvcmUgYSByZW1vdGUgZmlsZSB2aWEgRlRQLgorCitjb25maWcgRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyBpbiBmdHBnZXQvZnRwcHV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9OR19PUFRTICYmIChGVFBHRVQgfHwgRlRQUFVUKQorCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgZnRwZ2V0L2Z0cHB1dCBhcHBsZXQuCisKK2NvbmZpZyBIT1NUTkFNRQorCWJvb2wgImhvc3RuYW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNob3cgb3Igc2V0IHRoZSBzeXN0ZW0ncyBob3N0IG5hbWUuCisKK2NvbmZpZyBIVFRQRAorCWJvb2wgImh0dHBkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNlcnZlIHdlYiBwYWdlcyB2aWEgYW4gSFRUUCBzZXJ2ZXIuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX1JBTkdFUworCWJvb2wgIlN1cHBvcnQgJ1JhbmdlczonIGhlYWRlciIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgTWFrZXMgaHR0cGQgZW1pdCAiQWNjZXB0LVJhbmdlczogYnl0ZXMiIGhlYWRlciBhbmQgdW5kZXJzdGFuZAorCSAgIlJhbmdlOiBieXRlcz1OTk4tW01NTV0iIGhlYWRlci4gQWxsb3dzIGZvciByZXN1bWluZyBpbnRlcnJ1cHRlZAorCSAgZG93bmxvYWRzLCBzZWVraW5nIGluIG11bHRpbWVkaWEgcGxheWVycyBldGMuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX1VTRV9TRU5ERklMRQorCWJvb2wgIlVzZSBzZW5kZmlsZSBzeXN0ZW0gY2FsbCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgV2hlbiBlbmFibGVkLCBodHRwZCB3aWxsIHVzZSB0aGUga2VybmVsIHNlbmRmaWxlKCkgZnVuY3Rpb24KKwkgIGluc3RlYWQgb2YgcmVhZC93cml0ZSBsb29wLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9TRVRVSUQKKwlib29sICJFbmFibGUgLXUgPHVzZXI+IG9wdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gcnVuIGFzIGEgc3BlY2lmaWMgdXNlcgorCSAgcmF0aGVyIHRoYW4gZGVmYXVsdGluZyB0byB0aGUgdXNlciB0aGF0IHN0YXJ0cyB0aGUgc2VydmVyLgorCSAgVXNlIG9mIHRoaXMgb3B0aW9uIHJlcXVpcmVzIHNwZWNpYWwgcHJpdmlsZWdlcyB0byBjaGFuZ2UgdG8gYQorCSAgZGlmZmVyZW50IHVzZXIuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwlib29sICJFbmFibGUgQmFzaWMgaHR0cCBBdXRoZW50aWNhdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgVXRpbGl6ZXMgcGFzc3dvcmQgc2V0dGluZ3MgZnJvbSAvZXRjL2h0dHBkLmNvbmYgZm9yIGJhc2ljCisJICBhdXRoZW50aWNhdGlvbiBvbiBhIHBlciB1cmwgYmFzaXMuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0FVVEhfTUQ1CisJYm9vbCAiU3VwcG9ydCBNRDUgY3J5cHRlZCBwYXNzd29yZHMgZm9yIGh0dHAgQXV0aGVudGljYXRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwloZWxwCisJICBFbmFibGVzIGJhc2ljIHBlciBVUkwgYXV0aGVudGljYXRpb24gZnJvbSAvZXRjL2h0dHBkLmNvbmYKKwkgIHVzaW5nIG1kNSBwYXNzd29yZHMuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0NHSQorCWJvb2wgIlN1cHBvcnQgQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIChDR0kpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFRUUEQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3Mgc2NyaXB0cyBhbmQgZXhlY3V0YWJsZXMgdG8gYmUgaW52b2tlZAorCSAgd2hlbiBzcGVjaWZpYyBVUkxzIGFyZSByZXF1ZXN0ZWQuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSCisJYm9vbCAiU3VwcG9ydCBmb3IgcnVubmluZyBzY3JpcHRzIHRocm91Z2ggYW4gaW50ZXJwcmV0ZXIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0hUVFBEX0NHSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgcnVubmluZyBzY3JpcHRzIHRocm91Z2ggYW4KKwkgIGludGVycHJldGVyLiBUdXJuIHRoaXMgb24gaWYgeW91IHdhbnQgUEhQIHNjcmlwdHMgdG8gd29yaworCSAgcHJvcGVybHkuIFlvdSBuZWVkIHRvIHN1cHBseSBhbiBhZGRpdGlvbmFsIGxpbmUgaW4geW91ciBodHRwZAorCSAgY29uZmlnIGZpbGU6CisJICAqLnBocDovcGF0aC90by95b3VyL3BocAorCitjb25maWcgRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WCisJYm9vbCAiU2V0IFJFTU9URV9QT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBDR0kiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0hUVFBEX0NHSQorCWhlbHAKKwkgIFVzZSBvZiB0aGlzIG9wdGlvbiBjYW4gYXNzaXN0IHNjcmlwdHMgaW4gZ2VuZXJhdGluZworCSAgcmVmZXJlbmNlcyB0aGF0IGNvbnRhaW4gYSB1bmlxdWUgcG9ydCBudW1iZXIuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSCisJYm9vbCAiRW5hYmxlIC1lIG9wdGlvbiAodXNlZnVsIGZvciBDR0lzIHdyaXR0ZW4gYXMgc2hlbGwgc2NyaXB0cykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyBodG1sIGVuY29kaW5nIG9mIGFyYml0cmFyeSBzdHJpbmdzIGZvciBkaXNwbGF5CisJICBieSB0aGUgYnJvd3Nlci4gT3V0cHV0IGdvZXMgdG8gc3Rkb3V0LgorCSAgRm9yIGV4YW1wbGUsIGh0dHBkIC1lICI8SGVsbG8gV29ybGQ+IiBwcm9kdWNlcworCSAgIiYjNjBIZWxsbyYjMzJXb3JsZCYjNjIiLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUworCWJvb2wgIlN1cHBvcnQgZm9yIGN1c3RvbSBlcnJvciBwYWdlcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBkZWZpbmUgY3VzdG9tIGVycm9yIHBhZ2VzIGluCisJICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgSFRUUCBzdGF0dXMKKwkgIGVycm9yIHBhZ2VzLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBhZGQgdGhlIGxpbmU6CisJICAgICAgICBFNDA0Oi9wYXRoL2U0MDQuaHRtbAorCSAgaW4gdGhlIGNvbmZpZyBmaWxlLCB0aGUgc2VydmVyIHdpbGwgcmVzcG9uZCB0aGUgc3BlY2lmaWVkCisJICAnL3BhdGgvZTQwNC5odG1sJyBmaWxlIGluc3RlYWQgb2YgdGhlIHRlcnNlICc0MDQgTk9UIEZPVU5EJworCSAgbWVzc2FnZS4KKworY29uZmlnIEZFQVRVUkVfSFRUUERfUFJPWFkKKwlib29sICJTdXBwb3J0IGZvciByZXZlcnNlIHByb3h5IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFRUUEQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGRlZmluZSBVUkxzIHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQKKwkgIHRvIGFub3RoZXIgSFRUUCBzZXJ2ZXIuIFRvIHNldHVwIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gdGhlCisJICBjb25maWd1cmF0aW9uIGZpbGUKKwkgICAgICAgIFA6L3VybC86aHR0cDovL2hvc3RuYW1lWzpwb3J0XS9uZXcvcGF0aC8KKwkgIFRoZW4gYSByZXF1ZXN0IHRvIC91cmwvbXlmaWxlIHdpbGwgYmUgZm9yd2FyZGVkIHRvCisJICBodHRwOi8vaG9zdG5hbWVbOnBvcnRdL25ldy9wYXRoL215ZmlsZS4KKworY29uZmlnIEZFQVRVUkVfSFRUUERfR1pJUAorCWJvb2wgIlN1cHBvcnQgZm9yIEdaSVAgY29udGVudCBlbmNvZGluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgTWFrZXMgaHR0cGQgc2VuZCBmaWxlcyB1c2luZyBHWklQIGNvbnRlbnQgZW5jb2RpbmcgaWYgdGhlCisJICBjbGllbnQgc3VwcG9ydHMgaXQgYW5kIGEgcHJlLWNvbXByZXNzZWQgPGZpbGU+Lmd6IGV4aXN0cy4KKworY29uZmlnIElGQ09ORklHCisJYm9vbCAiaWZjb25maWciCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgSWZjb25maWcgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGtlcm5lbC1yZXNpZGVudCBuZXR3b3JrIGludGVyZmFjZXMuCisKK2NvbmZpZyBGRUFUVVJFX0lGQ09ORklHX1NUQVRVUworCWJvb2wgIkVuYWJsZSBzdGF0dXMgcmVwb3J0aW5nIG91dHB1dCAoKzdrKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGQ09ORklHCisJaGVscAorCSAgSWYgaWZjb25maWcgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIGl0IHdpbGwgZGlzcGxheSB0aGUgc3RhdHVzCisJICBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbnRlcmZhY2VzLgorCitjb25maWcgRkVBVFVSRV9JRkNPTkZJR19TTElQCisJYm9vbCAiRW5hYmxlIHNsaXAtc3BlY2lmaWMgb3B0aW9ucyBcImtlZXBhbGl2ZVwiIGFuZCBcIm91dGZpbGxcIiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGQ09ORklHCisJaGVscAorCSAgQWxsb3cgImtlZXBhbGl2ZSIgYW5kICJvdXRmaWxsIiBzdXBwb3J0IGZvciBTTElQLiBJZiB5b3UncmUgbm90CisJICBwbGFubmluZyBvbiB1c2luZyBzZXJpYWwgbGluZXMsIGxlYXZlIHRoaXMgdW5jaGVja2VkLgorCitjb25maWcgRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRCisJYm9vbCAiRW5hYmxlIG9wdGlvbnMgXCJtZW1fc3RhcnRcIiwgXCJpb19hZGRyXCIsIGFuZCBcImlycVwiIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZDT05GSUcKKwloZWxwCisJICBBbGxvdyB0aGUgc3RhcnQgYWRkcmVzcyBmb3Igc2hhcmVkIG1lbW9yeSwgc3RhcnQgYWRkcmVzcyBmb3IgSS9PLAorCSAgYW5kL29yIHRoZSBpbnRlcnJ1cHQgbGluZSB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorCitjb25maWcgRkVBVFVSRV9JRkNPTkZJR19IVworCWJvb2wgIkVuYWJsZSBvcHRpb24gXCJod1wiIChldGhlciBvbmx5KSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGQ09ORklHCisJaGVscAorCSAgU2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9mIHRoaXMgaW50ZXJmYWNlLCBpZiB0aGUgZGV2aWNlIGRyaXZlcgorCSAgc3VwcG9ydHMgIHRoaXMgIG9wZXJhdGlvbi4gQ3VycmVudGx5LCB3ZSBvbmx5IHN1cHBvcnQgdGhlICdldGhlcicKKwkgIGNsYXNzLgorCitjb25maWcgRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUworCWJvb2wgIlNldCB0aGUgYnJvYWRjYXN0IGF1dG9tYXRpY2FsbHkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIFNldHRpbmcgdGhpcyB3aWxsIG1ha2UgaWZjb25maWcgYXR0ZW1wdCB0byBmaW5kIHRoZSBicm9hZGNhc3QKKwkgIGF1dG9tYXRpY2FsbHkgaWYgdGhlIHZhbHVlICcrJyBpcyB1c2VkLgorCitjb25maWcgSUZFTlNMQVZFCisJYm9vbCAiaWZlbnNsYXZlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFVzZXJzcGFjZSBhcHBsaWNhdGlvbiB0byBiaW5kIHNldmVyYWwgaW50ZXJmYWNlcworCSAgdG8gYSBsb2dpY2FsIGludGVyZmFjZSAodXNlIHdpdGgga2VybmVsIGJvbmRpbmcgZHJpdmVyKS4KKworY29uZmlnIElGUExVR0QKKwlib29sICJpZnBsdWdkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIE5ldHdvcmsgaW50ZXJmYWNlIHBsdWcgZGV0ZWN0aW9uIGRhZW1vbi4KKworY29uZmlnIElGVVBET1dOCisJYm9vbCAiaWZ1cGRvd24iCisJZGVmYXVsdCB5CisJaGVscAorCSAgQWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIGludGVyZmFjZXMuIFRoaXMgYXBwbGV0IG1ha2VzCisJICB1c2Ugb2YgZWl0aGVyICJpZmNvbmZpZyIgYW5kICJyb3V0ZSIgb3IgdGhlICJpcCIgY29tbWFuZCB0byBhY3R1YWxseQorCSAgY29uZmlndXJlIG5ldHdvcmsgaW50ZXJmYWNlcy4gVGhlcmVmb3JlLCB5b3Ugd2lsbCBwcm9iYWJseSBhbHNvIHdhbnQKKwkgIHRvIGVuYWJsZSBlaXRoZXIgSUZDT05GSUcgYW5kIFJPVVRFLCBvciBlbmFibGUKKwkgIEZFQVRVUkVfSUZVUERPV05fSVAgYW5kIHRoZSB2YXJpb3VzIElQIG9wdGlvbnMuIE9mCisJICBjb3Vyc2UgeW91IGNvdWxkIHVzZSBub24tYnVzeWJveCB2ZXJzaW9ucyBvZiB0aGVzZSBwcm9ncmFtcywgc28KKwkgIGFnYWluc3QgbXkgYmV0dGVyIGp1ZGdlbWVudCAoc2luY2UgdGhpcyB3aWxsIHN1cmVseSByZXN1bHQgaW4gcGxlbnR5CisJICBvZiBzdXBwb3J0IHF1ZXN0aW9ucyBvbiB0aGUgbWFpbGluZyBsaXN0KSwgSSBkbyBub3QgZm9yY2UgeW91IHRvCisJICBlbmFibGUgdGhlc2UgYWRkaXRpb25hbCBvcHRpb25zLiBJdCBpcyB1cCB0byB5b3UgdG8gc3VwcGx5IGVpdGhlcgorCSAgImlmY29uZmlnIiwgInJvdXRlIiBhbmQgInJ1bi1wYXJ0cyIgb3IgdGhlICJpcCIgY29tbWFuZCwgZWl0aGVyCisJICB2aWEgYnVzeWJveCBvciB2aWEgc3RhbmRhbG9uZSB1dGlsaXRpZXMuCisKK2NvbmZpZyBJRlVQRE9XTl9JRlNUQVRFX1BBVEgKKwlzdHJpbmcgIkFic29sdXRlIHBhdGggdG8gaWZzdGF0ZSBmaWxlIgorCWRlZmF1bHQgIi92YXIvcnVuL2lmc3RhdGUiCisJZGVwZW5kcyBvbiBJRlVQRE9XTgorCWhlbHAKKwkgIGlmdXBkb3duIGtlZXBzIHN0YXRlIGluZm9ybWF0aW9uIGluIGEgZmlsZSBjYWxsZWQgaWZzdGF0ZS4KKwkgIFR5cGljYWxseSBpdCBpcyBsb2NhdGVkIGluIC92YXIvcnVuL2lmc3RhdGUsIGhvd2V2ZXIKKwkgIHNvbWUgZGlzdHJpYnV0aW9ucyB0ZW5kIHRvIHB1dCBpdCBpbiBvdGhlciBwbGFjZXMKKwkgIChkZWJpYW4sIGZvciBleGFtcGxlLCB1c2VzIC9ldGMvbmV0d29yay9ydW4vaWZzdGF0ZSkuCisJICBUaGlzIGNvbmZpZyBvcHRpb24gZGVmaW5lcyBsb2NhdGlvbiBvZiBpZnN0YXRlLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9JUAorCWJvb2wgIlVzZSBpcCBhcHBsZXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRlVQRE9XTgorCWhlbHAKKwkgIFVzZSB0aGUgaXByb3V0ZSAiaXAiIGNvbW1hbmQgdG8gaW1wbGVtZW50ICJpZnVwIiBhbmQgImlmZG93biIsIHJhdGhlcgorCSAgdGhhbiB0aGUgZGVmYXVsdCBvZiB1c2luZyB0aGUgb2xkZXIgJ2lmY29uZmlnJyBhbmQgJ3JvdXRlJyB1dGlsaXRpZXMuCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4KKwlib29sICJVc2UgYnVzeWJveCBpcCBhcHBsZXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lGVVBET1dOX0lQCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJc2VsZWN0IElQCisJc2VsZWN0IEZFQVRVUkVfSVBfQUREUkVTUworCXNlbGVjdCBGRUFUVVJFX0lQX0xJTksKKwlzZWxlY3QgRkVBVFVSRV9JUF9ST1VURQorCWhlbHAKKwkgIFVzZSB0aGUgYnVzeWJveCBpcHJvdXRlICJpcCIgYXBwbGV0IHRvIGltcGxlbWVudCAiaWZ1cGRvd24iLgorCisJICBJZiBsZWZ0IGRpc2FibGVkLCB5b3UgbXVzdCBpbnN0YWxsIHRoZSBmdWxsLWJsb3duIGlwcm91dGUyCisJICB1dGlsaXR5IG9yIHRoZSAgImlmdXAiIGFuZCAiaWZkb3duIiBhcHBsZXRzIHdpbGwgbm90IHdvcmsuCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX0lGQ09ORklHX0JVSUxUSU4KKwlib29sICJVc2UgYnVzeWJveCBpZmNvbmZpZyBhbmQgcm91dGUgYXBwbGV0cyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElGVVBET1dOICYmICFGRUFUVVJFX0lGVVBET1dOX0lQCisJc2VsZWN0IElGQ09ORklHCisJc2VsZWN0IFJPVVRFCisJaGVscAorCSAgVXNlIHRoZSBidXN5Ym94IGlwcm91dGUgImlmY29uZmlnIiBhbmQgInJvdXRlIiBhcHBsZXRzIHRvCisJICBpbXBsZW1lbnQgdGhlICJpZnVwIiBhbmQgImlmZG93biIgdXRpbGl0aWVzLgorCisJICBJZiBsZWZ0IGRpc2FibGVkLCB5b3UgbXVzdCBpbnN0YWxsIHRoZSBmdWxsLWJsb3duIGlmY29uZmlnCisJICBhbmQgcm91dGUgdXRpbGl0aWVzLCBvciB0aGUgICJpZnVwIiBhbmQgImlmZG93biIgYXBwbGV0cyB3aWxsIG5vdAorCSAgd29yay4KKworY29uZmlnIEZFQVRVUkVfSUZVUERPV05fSVBWNAorCWJvb2wgIlN1cHBvcnQgZm9yIElQdjQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRlVQRE9XTgorCWhlbHAKKwkgIElmIHlvdSB3YW50IGlmdXAvaWZkb3duIHRvIHRhbGsgSVB2NCwgbGVhdmUgdGhpcyBvbi4KKworY29uZmlnIEZFQVRVUkVfSUZVUERPV05fSVBWNgorCWJvb2wgIlN1cHBvcnQgZm9yIElQdjYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRlVQRE9XTiAmJiBGRUFUVVJFX0lQVjYKKwloZWxwCisJICBJZiB5b3UgbmVlZCBzdXBwb3J0IGZvciBJUHY2LCB0dXJuIHRoaXMgb3B0aW9uIG9uLgorCisjIyMgVU5VU0VECisjIyNjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9JUFgKKyMjIwlib29sICJTdXBwb3J0IGZvciBJUFgiCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBJRlVQRE9XTgorIyMjCWhlbHAKKyMjIwkgIElmIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIHlvdSBjYW4gdXNlIGJ1c3lib3ggdG8gd29yayB3aXRoIElQWAorIyMjCSAgbmV0d29ya3MuCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX01BUFBJTkcKKwlib29sICJFbmFibGUgbWFwcGluZyBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlICJtYXBwaW5nIiBzdGFuemEsIHVubGVzcyB5b3UgaGF2ZQorCSAgYSB3ZWlyZCBuZXR3b3JrIHNldHVwIHlvdSBkb24ndCBuZWVkIGl0LgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQCisJYm9vbCAiU3VwcG9ydCBmb3IgZXh0ZXJuYWwgZGhjcCBjbGllbnRzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIGV4dGVybmFsIGRoY3AgY2xpZW50cy4gQ2xpZW50cyBhcmUKKwkgIHRyaWVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IGRoY3BjZCwgZGhjbGllbnQsIHB1bXAgYW5kIHVkaGNwYy4KKwkgIE90aGVyd2lzZSwgaWYgdWRoY3BjIGFwcGxldCBpcyBlbmFibGVkLCBpdCBpcyB1c2VkLgorCSAgT3RoZXJ3aXNlLCBpZnVwL2lmZG93biB3aWxsIGhhdmUgbm8gc3VwcG9ydCBmb3IgREhDUC4KKworY29uZmlnIElORVRECisJYm9vbCAiaW5ldGQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgSW50ZXJuZXQgc3VwZXJzZXJ2ZXIgZGFlbW9uCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPCisJYm9vbCAiU3VwcG9ydCBlY2hvIHNlcnZpY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTkVURAorCWhlbHAKKwkgIEVjaG8gcmVjZWl2ZWQgZGF0YSBpbnRlcm5hbCBpbmV0ZCBzZXJ2aWNlCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJECisJYm9vbCAiU3VwcG9ydCBkaXNjYXJkIHNlcnZpY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTkVURAorCWhlbHAKKwkgIEludGVybmV0IC9kZXYvbnVsbCBpbnRlcm5hbCBpbmV0ZCBzZXJ2aWNlCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FCisJYm9vbCAiU3VwcG9ydCB0aW1lIHNlcnZpY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTkVURAorCWhlbHAKKwkgIFJldHVybiAzMiBiaXQgdGltZSBzaW5jZSAxOTAwIGludGVybmFsIGluZXRkIHNlcnZpY2UKKworY29uZmlnIEZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUKKwlib29sICJTdXBwb3J0IGRheXRpbWUgc2VydmljZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElORVRECisJaGVscAorCSAgUmV0dXJuIGh1bWFuLXJlYWRhYmxlIHRpbWUgaW50ZXJuYWwgaW5ldGQgc2VydmljZQorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTgorCWJvb2wgIlN1cHBvcnQgY2hhcmdlbiBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBGYW1pbGlhciBjaGFyYWN0ZXIgZ2VuZXJhdG9yIGludGVybmFsIGluZXRkIHNlcnZpY2UKKworY29uZmlnIEZFQVRVUkVfSU5FVERfUlBDCisJYm9vbCAiU3VwcG9ydCBSUEMgc2VydmljZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTkVURAorCXNlbGVjdCBGRUFUVVJFX0hBVkVfUlBDCisJaGVscAorCSAgU3VwcG9ydCBTdW4tUlBDIGJhc2VkIHNlcnZpY2VzCisKK2NvbmZpZyBJUAorCWJvb2wgImlwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSAiaXAiIGFwcGxldCBpcyBhIFRDUC9JUCBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBhbmQgcm91dGluZworCSAgdXRpbGl0eS4gWW91IGdlbmVyYWxseSBkb24ndCBuZWVkICJpcCIgdG8gdXNlIGJ1c3lib3ggd2l0aAorCSAgVENQL0lQLgorCitjb25maWcgRkVBVFVSRV9JUF9BRERSRVNTCisJYm9vbCAiaXAgYWRkcmVzcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQCisJaGVscAorCSAgQWRkcmVzcyBtYW5pcHVsYXRpb24gc3VwcG9ydCBmb3IgdGhlICJpcCIgYXBwbGV0LgorCitjb25maWcgRkVBVFVSRV9JUF9MSU5LCisJYm9vbCAiaXAgbGluayIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQCisJaGVscAorCSAgQ29uZmlndXJlIG5ldHdvcmsgZGV2aWNlcyB3aXRoICJpcCIuCisKK2NvbmZpZyBGRUFUVVJFX0lQX1JPVVRFCisJYm9vbCAiaXAgcm91dGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciByb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQgdG8gImlwIi4KKworY29uZmlnIEZFQVRVUkVfSVBfVFVOTkVMCisJYm9vbCAiaXAgdHVubmVsIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgdHVubmVsaW5nIGNvbW1hbmRzIHRvICJpcCIuCisKK2NvbmZpZyBGRUFUVVJFX0lQX1JVTEUKKwlib29sICJpcCBydWxlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgcnVsZSBjb21tYW5kcyB0byAiaXAiLgorCitjb25maWcgRkVBVFVSRV9JUF9TSE9SVF9GT1JNUworCWJvb2wgIlN1cHBvcnQgc2hvcnQgZm9ybXMgb2YgaXAgY29tbWFuZHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIEFsc28gc3VwcG9ydCBzaG9ydC1mb3JtIG9mIGlwIDxPQkpFQ1Q+IGNvbW1hbmRzOgorCSAgaXAgYWRkciAgIC0+IGlwYWRkcgorCSAgaXAgbGluayAgIC0+IGlwbGluaworCSAgaXAgcm91dGUgIC0+IGlwcm91dGUKKwkgIGlwIHR1bm5lbCAtPiBpcHR1bm5lbAorCSAgaXAgcnVsZSAgIC0+IGlwcnVsZQorCisJICBTYXkgTiB1bmxlc3MgeW91IGRlc3BhcmF0ZWx5IG5lZWQgdGhlIHNob3J0IGZvcm0gb2YgdGhlIGlwCisJICBvYmplY3QgY29tbWFuZHMuCisKK2NvbmZpZyBGRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTCisJYm9vbCAiU3VwcG9ydCBkaXNwbGF5aW5nIHJhcmVseSB1c2VkIGxpbmsgdHlwZXMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIElmIHlvdSBhcmUgbm90IGdvaW5nIHRvIHVzZSBsaW5rcyBvZiB0eXBlICJmcmFkIiwgImVjb25ldCIsCisJICAiYmlmIiBldGMsIHlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGVuYWJsZSB0aGlzLgorCSAgRXRoZXJuZXQsIHdpcmVsZXNzLCBpbmZyYXJlZCwgcHBwL3NsaXAsIGlwIHR1bm5lbGxpbmcKKwkgIGxpbmsgdHlwZXMgYXJlIHN1cHBvcnRlZCB3aXRob3V0IHRoaXMgb3B0aW9uIHNlbGVjdGVkLgorCitjb25maWcgSVBBRERSCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUF9TSE9SVF9GT1JNUyAmJiBGRUFUVVJFX0lQX0FERFJFU1MKKworY29uZmlnIElQTElOSworCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMgJiYgRkVBVFVSRV9JUF9MSU5LCisKK2NvbmZpZyBJUFJPVVRFCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUF9TSE9SVF9GT1JNUyAmJiBGRUFUVVJFX0lQX1JPVVRFCisKK2NvbmZpZyBJUFRVTk5FTAorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMgJiYgRkVBVFVSRV9JUF9UVU5ORUwKKworY29uZmlnIElQUlVMRQorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMgJiYgRkVBVFVSRV9JUF9SVUxFCisKK2NvbmZpZyBJUENBTEMKKwlib29sICJpcGNhbGMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgaXBjYWxjIHRha2VzIGFuIElQIGFkZHJlc3MgYW5kIG5ldG1hc2sgYW5kIGNhbGN1bGF0ZXMgdGhlCisJICByZXN1bHRpbmcgYnJvYWRjYXN0LCBuZXR3b3JrLCBhbmQgaG9zdCByYW5nZS4KKworY29uZmlnIEZFQVRVUkVfSVBDQUxDX0ZBTkNZCisJYm9vbCAiRmFuY3kgSVBDQUxDLCBtb3JlIG9wdGlvbnMsIGFkZHMgMSBrYnl0ZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQQ0FMQworCWhlbHAKKwkgIEFkZHMgdGhlIG9wdGlvbnMgaG9zdG5hbWUsIHByZWZpeCBhbmQgc2lsZW50IHRvIHRoZSBvdXRwdXQgb2YKKwkgICJpcGNhbGMiLgorCitjb25maWcgRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQQ0FMQyAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIGlwY2FsYyBhcHBsZXQuCisKK2NvbmZpZyBORVRTVEFUCisJYm9vbCAibmV0c3RhdCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBuZXRzdGF0IHByaW50cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTGludXggbmV0d29ya2luZyBzdWJzeXN0ZW0uCisKK2NvbmZpZyBGRUFUVVJFX05FVFNUQVRfV0lERQorCWJvb2wgIkVuYWJsZSB3aWRlIG5ldHN0YXQgb3V0cHV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTkVUU1RBVAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciB3aWRlIGNvbHVtbnMuIFVzZWZ1bCB3aGVuIGRpc3BsYXlpbmcgSVB2NiBhZGRyZXNzZXMKKwkgICgtVyBvcHRpb24pLgorCitjb25maWcgRkVBVFVSRV9ORVRTVEFUX1BSRworCWJvb2wgIkVuYWJsZSBQSUQvUHJvZ3JhbSBuYW1lIG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5FVFNUQVQKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgLXAgZmxhZyB0byBwcmludCBvdXQgUElEIGFuZCBwcm9ncmFtIG5hbWUuCisJICArNzAwIGJ5dGVzIG9mIGNvZGUuCisKK2NvbmZpZyBOU0xPT0tVUAorCWJvb2wgIm5zbG9va3VwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG5zbG9va3VwIGlzIGEgdG9vbCB0byBxdWVyeSBJbnRlcm5ldCBuYW1lIHNlcnZlcnMuCisKK2NvbmZpZyBOVFBECisJYm9vbCAibnRwZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgTlRQIGNsaWVudC9zZXJ2ZXIgZGFlbW9uLgorCitjb25maWcgRkVBVFVSRV9OVFBEX1NFUlZFUgorCWJvb2wgIk1ha2UgbnRwZCB1c2FibGUgYXMgYSBOVFAgc2VydmVyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTlRQRAorCWhlbHAKKwkgIE1ha2UgbnRwZCB1c2FibGUgYXMgYSBOVFAgc2VydmVyLiBJZiB5b3UgZGlzYWJsZSB0aGlzIG9wdGlvbgorCSAgbnRwZCB3aWxsIGJlIHVzYWJsZSBvbmx5IGFzIGEgTlRQIGNsaWVudC4KKworY29uZmlnIFBTQ0FOCisJYm9vbCAicHNjYW4iCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2ltcGxlIG5ldHdvcmsgcG9ydCBzY2FubmVyLgorCitjb25maWcgUk9VVEUKKwlib29sICJyb3V0ZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBSb3V0ZSBkaXNwbGF5cyBvciBtYW5pcHVsYXRlcyB0aGUga2VybmVsJ3MgSVAgcm91dGluZyB0YWJsZXMuCisKK2NvbmZpZyBTTEFUVEFDSAorCWJvb2wgInNsYXR0YWNoIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIHNsYXR0YWNoIGlzIGEgc21hbGwgdXRpbGl0eSB0byBhdHRhY2ggbmV0d29yayBpbnRlcmZhY2VzIHRvIHNlcmlhbAorCSAgbGluZXMuCisKKyNjb25maWcgVEMKKyMJYm9vbCAidGMiCisjCWRlZmF1bHQgeQorIwloZWxwCisjCSAgc2hvdyAvIG1hbmlwdWxhdGUgdHJhZmZpYyBjb250cm9sIHNldHRpbmdzCisjCisjY29uZmlnIEZFQVRVUkVfVENfSU5HUkVTUworIwlkZWZfYm9vbCBuCisjCWRlcGVuZHMgb24gVEMKKworY29uZmlnIFRDUFNWRAorCWJvb2wgInRjcHN2ZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0Y3BzdmQgbGlzdGVucyBvbiBhIFRDUCBwb3J0IGFuZCBydW5zIGEgcHJvZ3JhbSBmb3IgZWFjaCBuZXcKKwkgIGNvbm5lY3Rpb24uCisKK2NvbmZpZyBURUxORVQKKwlib29sICJ0ZWxuZXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGVsbmV0IGlzIGFuIGludGVyZmFjZSB0byB0aGUgVEVMTkVUIHByb3RvY29sLCBidXQgaXMgYWxzbyBjb21tb25seQorCSAgdXNlZCB0byB0ZXN0IG90aGVyIHNpbXBsZSBwcm90b2NvbHMuCisKK2NvbmZpZyBGRUFUVVJFX1RFTE5FVF9UVFlQRQorCWJvb2wgIlBhc3MgVEVSTSB0eXBlIHRvIHJlbW90ZSBob3N0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEVMTkVUCisJaGVscAorCSAgU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIGZvcndhcmQgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlCisJICByZW1vdGUgaG9zdCB5b3UgYXJlIGNvbm5lY3RpbmcgdG8uIFRoaXMgaXMgdXNlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0CisJICB0aGluZ3MgbGlrZSBBTlNJIGNvbG9ycyBhbmQgb3RoZXIgY29udHJvbCBzZXF1ZW5jZXMgYmVoYXZlLgorCitjb25maWcgRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCisJYm9vbCAiUGFzcyBVU0VSIHR5cGUgdG8gcmVtb3RlIGhvc3QiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURUxORVQKKwloZWxwCisJICBTZXR0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZm9yd2FyZCB0aGUgVVNFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUKKwkgIHJlbW90ZSBob3N0IHlvdSBhcmUgY29ubmVjdGluZyB0by4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0bworCSAgbG9nIGludG8gYSBtYWNoaW5lIHdpdGhvdXQgdGVsbGluZyB0aGUgdXNlcm5hbWUgKGF1dG9sb2dpbikuIFRoaXMKKwkgIG9wdGlvbiBlbmFibGVzIGAtYScgYW5kIGAtbCBVU0VSJyBhcmd1bWVudHMuCisKK2NvbmZpZyBURUxORVRECisJYm9vbCAidGVsbmV0ZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBBIGRhZW1vbiBmb3IgdGhlIFRFTE5FVCBwcm90b2NvbCwgYWxsb3dpbmcgeW91IHRvIGxvZyBvbnRvIHRoZSBob3N0CisJICBydW5uaW5nIHRoZSBkYWVtb24uIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgVEVMTkVUIHByb3RvY29sCisJICBzZW5kcyBwYXNzd29yZHMgaW4gcGxhaW4gdGV4dC4gSWYgeW91IGNhbid0IGFmZm9yZCB0aGUgc3BhY2UgZm9yIGFuCisJICBTU0ggZGFlbW9uIGFuZCB5b3UgdHJ1c3QgeW91ciBuZXR3b3JrLCB5b3UgbWF5IHNheSAneScgaGVyZS4gQXMgYQorCSAgbW9yZSBzZWN1cmUgYWx0ZXJuYXRpdmUsIHlvdSBzaG91bGQgc2VyaW91c2x5IGNvbnNpZGVyIGluc3RhbGxpbmcgdGhlCisJICB2ZXJ5IHNtYWxsIERyb3BiZWFyIFNTSCBkYWVtb24gaW5zdGVhZDoKKwkJaHR0cDovL21hdHQudWNjLmFzbi5hdS9kcm9wYmVhci9kcm9wYmVhci5odG1sCisKKwkgIE5vdGUgdGhhdCBmb3IgYnVzeWJveCB0ZWxuZXRkIHRvIHdvcmsgeW91IG5lZWQgc2V2ZXJhbCB0aGluZ3M6CisJICBGaXJzdCBvZiBhbGwsIHlvdXIga2VybmVsIG5lZWRzOgorCQkgIFVOSVg5OF9QVFlTPXkKKwkJICBERVZQVFNfRlM9eQorCisJICBOZXh0LCB5b3UgbmVlZCBhIC9kZXYvcHRzIGRpcmVjdG9yeSBvbiB5b3VyIHJvb3QgZmlsZXN5c3RlbToKKworCQkgICQgbHMgLWxkIC9kZXYvcHRzCisJCSAgZHJ3eHIteHIteCAgMiByb290IHJvb3QgMCBTZXAgMjMgMTM6MjEgL2Rldi9wdHMvCisKKwkgIE5leHQgeW91IG5lZWQgdGhlIHBzZXVkbyB0ZXJtaW5hbCBtYXN0ZXIgbXVsdGlwbGV4ZXIgL2Rldi9wdG14OgorCisJCSAgJCBscyAtbGEgL2Rldi9wdG14CisJCSAgY3J3LXJ3LXJ3LSAgMSByb290IHR0eSA1LCAyIFNlcCAyMyAxMzo1NSAvZGV2L3B0bXgKKworCSAgQW55IC9kZXYvdHR5cFswLTldKiBmaWxlcyB5b3UgbWF5IGhhdmUgY2FuIGJlIHJlbW92ZWQuCisJICBOZXh0LCB5b3UgbmVlZCB0byBtb3VudCB0aGUgZGV2cHRzIGZpbGVzeXN0ZW0gb24gL2Rldi9wdHMgdXNpbmc6CisKKwkJICBtb3VudCAtdCBkZXZwdHMgZGV2cHRzIC9kZXYvcHRzCisKKwkgIFlvdSBuZWVkIHRvIGJlIHN1cmUgdGhhdCBidXN5Ym94IGhhcyBMT0dJTiBhbmQKKwkgIEZFQVRVUkVfU1VJRCBlbmFibGVkLiBBbmQgZmluYWxseSwgeW91IHNob3VsZCBtYWtlCisJICBjZXJ0YWluIHRoYXQgQnVzeWJveCBoYXMgYmVlbiBpbnN0YWxsZWQgc2V0dWlkIHJvb3Q6CisKKwkJY2hvd24gcm9vdC5yb290IC9iaW4vYnVzeWJveAorCQljaG1vZCA0NzU1IC9iaW4vYnVzeWJveAorCisJICB3aXRoIGFsbCB0aGF0IGRvbmUsIHRlbG5ldGQgX3Nob3VsZF8gd29yay4uLi4KKworCitjb25maWcgRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKwlib29sICJTdXBwb3J0IHN0YW5kYWxvbmUgdGVsbmV0ZCAobm90IGluZXRkIG9ubHkpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEVMTkVURAorCWhlbHAKKwkgIFNlbGVjdGluZyB0aGlzIHdpbGwgbWFrZSB0ZWxuZXRkIGFibGUgdG8gcnVuIHN0YW5kYWxvbmUuCisKK2NvbmZpZyBGRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVAorCWJvb2wgIlN1cHBvcnQgLXcgU0VDIG9wdGlvbiAoaW5ldGQgd2FpdCBtb2RlKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBydW4gdGVsbmV0ZCBpbiAiaW5ldCB3YWl0IiBtb2RlLgorCSAgRXhhbXBsZSBpbmV0ZC5jb25mIGxpbmUgKG5vdGUgIndhaXQiLCBub3QgdXN1YWwgIm5vd2FpdCIpOgorCisJICB0ZWxuZXQgc3RyZWFtIHRjcCB3YWl0IHJvb3QgL2Jpbi90ZWxuZXRkIHRlbG5ldGQgLXcxMAorCisJICBJbiB0aGlzIGV4YW1wbGUsIGluZXRkIHBhc3NlcyBfbGlzdGVuaW5nXyBzb2NrZXRfIGFzIGZkIDAKKwkgIHRvIHRlbG5ldGQgd2hlbiBjb25uZWN0aW9uIGFwcGVhcnMuCisJICB0ZWxuZXRkIHdpbGwgd2FpdCBmb3IgY29ubmVjdGlvbnMgdW50aWwgYWxsIGV4aXN0aW5nCisJICBjb25uZWN0aW9ucyBhcmUgY2xvc2VkLCBhbmQgbm8gbmV3IGNvbm5lY3Rpb25zCisJICBhcHBlYXIgZHVyaW5nIDEwIHNlY29uZHMuIFRoZW4gaXQgZXhpdHMsIGFuZCBpbmV0ZCBjb250aW51ZXMKKwkgIHRvIGxpc3RlbiBmb3IgbmV3IGNvbm5lY3Rpb25zLgorCisJICBUaGlzIG9wdGlvbiBpcyByYXJlbHkgdXNlZC4gInRjcCBub3dhaXQiIGlzIG11Y2ggbW9yZSB1c3VhbAorCSAgd2F5IG9mIHJ1bm5pbmcgdGNwIHNlcnZpY2VzLCBpbmNsdWRpbmcgdGVsbmV0ZC4KKwkgIFlvdSBtb3N0IHByb2JhYmx5IHdhbnQgdG8gc2F5IE4gaGVyZS4KKworY29uZmlnIFRGVFAKKwlib29sICJ0ZnRwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgVHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIGNsaWVudCBwcm9ncmFtLiBURlRQCisJICBpcyB1c3VhbGx5IHVzZWQgZm9yIHNpbXBsZSwgc21hbGwgdHJhbnNmZXJzIHN1Y2ggYXMgYSByb290IGltYWdlCisJICBmb3IgYSBuZXR3b3JrLWVuYWJsZWQgYm9vdGxvYWRlci4KKworY29uZmlnIFRGVFBECisJYm9vbCAidGZ0cGQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wgc2VydmVyIHByb2dyYW0uCisJICBJdCBleHBlY3RzIHRoYXQgc3RkaW4gaXMgYSBkYXRhZ3JhbSBzb2NrZXQgYW5kIGEgcGFja2V0CisJICBpcyBhbHJlYWR5IHBlbmRpbmcgb24gaXQuIEl0IHdpbGwgZXhpdCBhZnRlciBvbmUgdHJhbnNmZXIuCisJICBJbiBvdGhlciB3b3JkczogaXQgc2hvdWxkIGJlIHJ1biBmcm9tIGluZXRkIGluIG5vd2FpdCBtb2RlLAorCSAgb3IgZnJvbSB1ZHBzdmQuIEV4YW1wbGU6ICJ1ZHBzdmQgLUUgMCA2OSB0ZnRwZCBESVIiCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciB0ZnRwL3RmdHBkIgorCWRlcGVuZHMgb24gVEZUUCB8fCBURlRQRAorCitjb25maWcgRkVBVFVSRV9URlRQX0dFVAorCWJvb2wgIkVuYWJsZSAndGZ0cCBnZXQnIGFuZC9vciB0ZnRwZCB1cGxvYWQgY29kZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRGVFAgfHwgVEZUUEQKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgdGhlIEdFVCBjb21tYW5kIHdpdGhpbiB0aGUgVEZUUCBjbGllbnQuIFRoaXMgYWxsb3dzCisJICBhIGNsaWVudCB0byByZXRyaWV2ZSBhIGZpbGUgZnJvbSBhIFRGVFAgc2VydmVyLgorCSAgQWxzbyBlbmFibGUgdXBsb2FkIHN1cHBvcnQgaW4gdGZ0cGQsIGlmIHRmdHBkIGlzIHNlbGVjdGVkLgorCisJICBOb3RlOiB0aGlzIG9wdGlvbiBkb2VzIF9ub3RfIG1ha2UgdGZ0cGQgY2FwYWJsZSBvZiBkb3dubG9hZAorCSAgKHRoZSB1c3VhbCBvcGVyYXRpb24gcGVvcGxlIG5lZWQgZnJvbSBpdCkhCisKK2NvbmZpZyBGRUFUVVJFX1RGVFBfUFVUCisJYm9vbCAiRW5hYmxlICd0ZnRwIHB1dCcgYW5kL29yIHRmdHBkIGRvd25sb2FkIGNvZGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURlRQIHx8IFRGVFBECisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBQVVQgY29tbWFuZCB3aXRoaW4gdGhlIFRGVFAgY2xpZW50LiBUaGlzIGFsbG93cworCSAgYSBjbGllbnQgdG8gdHJhbnNmZXIgYSBmaWxlIHRvIGEgVEZUUCBzZXJ2ZXIuCisJICBBbHNvIGVuYWJsZSBkb3dubG9hZCBzdXBwb3J0IGluIHRmdHBkLCBpZiB0ZnRwZCBpcyBzZWxlY3RlZC4KKworY29uZmlnIEZFQVRVUkVfVEZUUF9CTE9DS1NJWkUKKwlib29sICJFbmFibGUgJ2Jsa3NpemUnIGFuZCAndHNpemUnIHByb3RvY29sIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURlRQIHx8IFRGVFBECisJaGVscAorCSAgQWxsb3cgdGZ0cCB0byBzcGVjaWZ5IGJsb2NrIHNpemUsIGFuZCB0ZnRwZCB0byB1bmRlcnN0YW5kCisJICAiYmxrc2l6ZSIgYW5kICJ0c2l6ZSIgb3B0aW9ucy4KKworY29uZmlnIEZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwlib29sICJFbmFibGUgdGZ0cCBwcm9ncmVzcyBtZXRlciIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRGVFAgJiYgRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCWhlbHAKKwkgIFNob3cgcHJvZ3Jlc3MgYmFyLgorCitjb25maWcgVEZUUF9ERUJVRworCWJvb2wgIkVuYWJsZSBkZWJ1ZyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFRGVFAgfHwgVEZUUEQKKwloZWxwCisJICBNYWtlIHRmdHBbZF0gcHJpbnQgZGVidWdnaW5nIG1lc3NhZ2VzIG9uIHN0ZGVyci4KKwkgIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBhcmUgZGlhZ25vc2luZyBhIGJ1ZyBpbiB0ZnRwW2RdLgorCitjb25maWcgVFJBQ0VST1VURQorCWJvb2wgInRyYWNlcm91dGUiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVXRpbGl0eSB0byB0cmFjZSB0aGUgcm91dGUgb2YgSVAgcGFja2V0cy4KKworY29uZmlnIFRSQUNFUk9VVEU2CisJYm9vbCAidHJhY2Vyb3V0ZTYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQVjYgJiYgVFJBQ0VST1VURQorCWhlbHAKKwkgIFV0aWxpdHkgdG8gdHJhY2UgdGhlIHJvdXRlIG9mIElQdjYgcGFja2V0cy4KKworY29uZmlnIEZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisJYm9vbCAiRW5hYmxlIHZlcmJvc2Ugb3V0cHV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVFJBQ0VST1VURQorCWhlbHAKKwkgIEFkZCBzb21lIHZlcmJvc2l0eSB0byB0cmFjZXJvdXRlLiBUaGlzIGluY2x1ZGVzIGFtb25nIG90aGVyIHRoaW5ncworCSAgaG9zdG5hbWVzIGFuZCBJQ01QIHJlc3BvbnNlIHR5cGVzLgorCitjb25maWcgRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURQorCWJvb2wgIkVuYWJsZSBsb29zZSBzb3VyY2Ugcm91dGUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBUUkFDRVJPVVRFCisJaGVscAorCSAgQWRkIG9wdGlvbiB0byBzcGVjaWZ5IGEgbG9vc2Ugc291cmNlIHJvdXRlIGdhdGV3YXkKKwkgICg4IG1heGltdW0pLgorCitjb25maWcgRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QCisJYm9vbCAiVXNlIElDTVAgaW5zdGVhZCBvZiBVRFAiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBUUkFDRVJPVVRFCisJaGVscAorCSAgQWRkIG9wdGlvbiAtSSB0byB1c2UgSUNNUCBFQ0hPIGluc3RlYWQgb2YgVURQIGRhdGFncmFtcy4KKworY29uZmlnIFRVTkNUTAorCWJvb2wgInR1bmN0bCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICB0dW5jdGwgY3JlYXRlcyBvciBkZWxldGVzIHR1biBkZXZpY2VzLgorCitjb25maWcgRkVBVFVSRV9UVU5DVExfVUcKKwlib29sICJTdXBwb3J0IG93bmVyOmdyb3VwIGFzc2lnbm1lbnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUVU5DVEwKKwloZWxwCisJICBBbGxvdyB0byBzcGVjaWZ5IG93bmVyIGFuZCBncm91cCBvZiBuZXdseSBjcmVhdGVkIGludGVyZmFjZS4KKwkgIDM0MCBieXRlcyBvZiBwdXJlIGJsb2F0LiBTYXkgbm8gaGVyZS4KKworc291cmNlIG5ldHdvcmtpbmcvdWRoY3AvQ29uZmlnLmluCisKK2NvbmZpZyBJRlVQRE9XTl9VREhDUENfQ01EX09QVElPTlMKKwlzdHJpbmcgImlmdXAgdWRoY3BjIGNvbW1hbmQgbGluZSBvcHRpb25zIgorCWRlZmF1bHQgIi1SIC1uIgorCWRlcGVuZHMgb24gSUZVUERPV04gJiYgVURIQ1BDCisJaGVscAorCSAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gcGFzcyB0byB1ZGhjcGMgZnJvbSBpZnVwLgorCSAgSW50ZW5kZWQgdG8gYWx0ZXIgb3B0aW9ucyBub3QgYXZhaWxhYmxlIGluIC9ldGMvbmV0d29yay9pbnRlcmZhY2VzLgorCSAgKElFOiAtLXN5c2xvZyAtLWJhY2tncm91bmQgZXRjLi4uKQorCitjb25maWcgVURQU1ZECisJYm9vbCAidWRwc3ZkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVkcHN2ZCBsaXN0ZW5zIG9uIGFuIFVEUCBwb3J0IGFuZCBydW5zIGEgcHJvZ3JhbSBmb3IgZWFjaCBuZXcKKwkgIGNvbm5lY3Rpb24uCisKK2NvbmZpZyBWQ09ORklHCisJYm9vbCAidmNvbmZpZyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBDcmVhdGVzLCByZW1vdmVzLCBhbmQgY29uZmlndXJlcyBWTEFOIGludGVyZmFjZXMKKworY29uZmlnIFdHRVQKKwlib29sICJ3Z2V0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHdnZXQgaXMgYSB1dGlsaXR5IGZvciBub24taW50ZXJhY3RpdmUgZG93bmxvYWQgb2YgZmlsZXMgZnJvbSBIVFRQLAorCSAgSFRUUFMsIGFuZCBGVFAgc2VydmVycy4KKworY29uZmlnIEZFQVRVUkVfV0dFVF9TVEFUVVNCQVIKKwlib29sICJFbmFibGUgYSBuaWZ0eSBwcm9jZXNzIG1ldGVyICgrMmspIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gV0dFVAorCWhlbHAKKwkgIEVuYWJsZSB0aGUgdHJhbnNmZXIgcHJvZ3Jlc3MgYmFyIGZvciB3Z2V0IHRyYW5zZmVycy4KKworY29uZmlnIEZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTgorCWJvb2wgIkVuYWJsZSBIVFRQIGF1dGhlbnRpY2F0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gV0dFVAorCWhlbHAKKwkgIFN1cHBvcnQgYXV0aGVudGljYXRlZCBIVFRQIHRyYW5zZmVycy4KKworY29uZmlnIEZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gV0dFVCAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHdnZXQgYXBwbGV0LgorCitjb25maWcgRkVBVFVSRV9XR0VUX1RJTUVPVVQKKwlib29sICJFbmFibGUgcmVhZCB0aW1lb3V0IG9wdGlvbiAtVCBTRUMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBXR0VUCisJaGVscAorCSAgU3VwcG9ydHMgbmV0d29yayByZWFkIHRpbWVvdXQgZm9yIHdnZXQsIHNvIHRoYXQgd2dldCB3aWxsIGdpdmUKKwkgIHVwIGFuZCB0aW1lb3V0IHdoZW4gcmVhZGluZyBuZXR3b3JrIGRhdGEsIHRocm91Z2ggdGhlIC1UIGNvbW1hbmQKKwkgIGxpbmUgb3B0aW9uLiAgQ3VycmVudGx5IG9ubHkgbmV0d29yayBkYXRhIHJlYWQgdGltZW91dCBpcworCSAgc3VwcG9ydGVkIChpLmUuLCB0aW1lb3V0IGlzIG5vdCBhcHBsaWVkIHRvIHRoZSBETlMgbm9yIFRDUAorCSAgY29ubmVjdGlvbiBpbml0aWFsaXphdGlvbikuICBXaGVuIEZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMgaXMKKwkgIGFsc28gZW5hYmxlZCwgdGhlIC0tdGltZW91dCBvcHRpb24gd2lsbCB3b3JrIGluIGFkZGl0aW9uIHRvIC1ULgorCitjb25maWcgWkNJUAorCWJvb2wgInpjaXAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgWkNJUCBwcm92aWRlcyBaZXJvQ29uZiBJUHY0IGFkZHJlc3Mgc2VsZWN0aW9uLCBhY2NvcmRpbmcgdG8gUkZDIDM5MjcuCisJICBJdCdzIGEgZGFlbW9uIHRoYXQgYWxsb2NhdGVzIGFuZCBkZWZlbmRzIGEgZHluYW1pY2FsbHkgYXNzaWduZWQKKwkgIGFkZHJlc3Mgb24gdGhlIDE2OS4yNTQvMTYgbmV0d29yaywgcmVxdWlyaW5nIG5vIHN5c3RlbSBhZG1pbmlzdHJhdG9yLgorCisJICBTZWUgaHR0cDovL3d3dy56ZXJvY29uZi5vcmcgZm9yIGZ1cnRoZXIgZGV0YWlscywgYW5kICJ6Y2lwLnNjcmlwdCIKKwkgIGluIHRoZSBidXN5Ym94IGV4YW1wbGVzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0ZjI3YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDQ4IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19BUlApICAgICAgICAgICs9IGFycC5vIGludGVyZmFjZS5vCitsaWItJChDT05GSUdfQVJQSU5HKSAgICAgICArPSBhcnBpbmcubworbGliLSQoQ09ORklHX0JSQ1RMKSAgICAgICAgKz0gYnJjdGwubworbGliLSQoQ09ORklHX0ROU0QpICAgICAgICAgKz0gZG5zZC5vCitsaWItJChDT05GSUdfRVRIRVJfV0FLRSkgICArPSBldGhlci13YWtlLm8KK2xpYi0kKENPTkZJR19GQUtFSURFTlREKSAgICs9IGlzcnZfaWRlbnRkLm8gaXNydi5vCitsaWItJChDT05GSUdfRlRQRCkgICAgICAgICArPSBmdHBkLm8KK2xpYi0kKENPTkZJR19GVFBHRVQpICAgICAgICs9IGZ0cGdldHB1dC5vCitsaWItJChDT05GSUdfRlRQUFVUKSAgICAgICArPSBmdHBnZXRwdXQubworbGliLSQoQ09ORklHX0hPU1ROQU1FKSAgICAgKz0gaG9zdG5hbWUubworbGliLSQoQ09ORklHX0hUVFBEKSAgICAgICAgKz0gaHR0cGQubworbGliLSQoQ09ORklHX0lGQ09ORklHKSAgICAgKz0gaWZjb25maWcubyBpbnRlcmZhY2UubworbGliLSQoQ09ORklHX0lGRU5TTEFWRSkgICAgKz0gaWZlbnNsYXZlLm8gaW50ZXJmYWNlLm8KK2xpYi0kKENPTkZJR19JRlBMVUdEKSAgICAgICs9IGlmcGx1Z2QubworbGliLSQoQ09ORklHX0lGVVBET1dOKSAgICAgKz0gaWZ1cGRvd24ubworbGliLSQoQ09ORklHX0lORVREKSAgICAgICAgKz0gaW5ldGQubworbGliLSQoQ09ORklHX0lQKSAgICAgICAgICAgKz0gaXAubworbGliLSQoQ09ORklHX0lQQ0FMQykgICAgICAgKz0gaXBjYWxjLm8KK2xpYi0kKENPTkZJR19OQU1FSUYpICAgICAgICs9IG5hbWVpZi5vCitsaWItJChDT05GSUdfTkMpICAgICAgICAgICArPSBuYy5vCitsaWItJChDT05GSUdfTkVUU1RBVCkgICAgICArPSBuZXRzdGF0Lm8KK2xpYi0kKENPTkZJR19OU0xPT0tVUCkgICAgICs9IG5zbG9va3VwLm8KK2xpYi0kKENPTkZJR19OVFBEKSAgICAgICAgICs9IG50cGQubworbGliLSQoQ09ORklHX1BTQ0FOKSAgICAgICAgKz0gcHNjYW4ubworbGliLSQoQ09ORklHX1JPVVRFKSAgICAgICAgKz0gcm91dGUubworbGliLSQoQ09ORklHX1NMQVRUQUNIKSAgICAgKz0gc2xhdHRhY2gubworbGliLSQoQ09ORklHX1RDKSAgICAgICAgICAgKz0gdGMubworbGliLSQoQ09ORklHX1RFTE5FVCkgICAgICAgKz0gdGVsbmV0Lm8KK2xpYi0kKENPTkZJR19URUxORVREKSAgICAgICs9IHRlbG5ldGQubworbGliLSQoQ09ORklHX1RGVFApICAgICAgICAgKz0gdGZ0cC5vCitsaWItJChDT05GSUdfVEZUUEQpICAgICAgICArPSB0ZnRwLm8KK2xpYi0kKENPTkZJR19UUkFDRVJPVVRFKSAgICs9IHRyYWNlcm91dGUubworbGliLSQoQ09ORklHX1RVTkNUTCkgICAgICAgKz0gdHVuY3RsLm8KK2xpYi0kKENPTkZJR19WQ09ORklHKSAgICAgICs9IHZjb25maWcubworbGliLSQoQ09ORklHX1dHRVQpICAgICAgICAgKz0gd2dldC5vCitsaWItJChDT05GSUdfWkNJUCkgICAgICAgICArPSB6Y2lwLm8KKworbGliLSQoQ09ORklHX1RDUFNWRCkgICAgICAgKz0gdGNwdWRwLm8gdGNwdWRwX3Blcmhvc3QubworbGliLSQoQ09ORklHX1VEUFNWRCkgICAgICAgKz0gdGNwdWRwLm8gdGNwdWRwX3Blcmhvc3QubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9hcnAuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvYXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2YzQwMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvYXJwLmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFycC5jIC0gTWFuaXB1bGF0ZSB0aGUgc3lzdGVtIEFSUCBjYWNoZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yOiBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amUgYXQgdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqIEJ1c3lib3ggcG9ydDogUGF1bCB2YW4gR29vbCA8cHZhbmdvb2wgYXQgbWltb3RlY2guY29tPgorICoKKyAqIG1vZGlmaWVkIGZvciBnZXRvcHQzMiBieSBBcm5lIEJlcm5pbiA8YXJuZSBbYXRdIGFsYW11dC5kZT4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYXJwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAiXG5bLXZuXQlbLUggSFdUWVBFXSBbLWkgSUZdIC1hIFtIT1NUTkFNRV0iCisvL3VzYWdlOiAgICAgIlxuWy12XQkJICAgIFstaSBJRl0gLWQgSE9TVE5BTUUgW3B1Yl0iCisvL3VzYWdlOiAgICAgIlxuWy12XQlbLUggSFdUWVBFXSBbLWkgSUZdIC1zIEhPU1ROQU1FIEhXQUREUiBbdGVtcF0iCisvL3VzYWdlOiAgICAgIlxuWy12XQlbLUggSFdUWVBFXSBbLWkgSUZdIC1zIEhPU1ROQU1FIEhXQUREUiBbbmV0bWFzayBNQVNLXSBwdWIiCisvL3VzYWdlOiAgICAgIlxuWy12XQlbLUggSFdUWVBFXSBbLWkgSUZdIC1EcyBIT1NUTkFNRSBJRkFDRSBbbmV0bWFzayBNQVNLXSBwdWIiCisvL3VzYWdlOiNkZWZpbmUgYXJwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTWFuaXB1bGF0ZSBBUlAgY2FjaGVcbiIKKy8vdXNhZ2U6ICAgICAgICJcbgktYQkJRGlzcGxheSAoYWxsKSBob3N0cyIKKy8vdXNhZ2U6ICAgICAgICJcbgktcwkJU2V0IG5ldyBBUlAgZW50cnkiCisvL3VzYWdlOiAgICAgICAiXG4JLWQJCURlbGV0ZSBhIHNwZWNpZmllZCBlbnRyeSIKKy8vdXNhZ2U6ICAgICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAgICJcbgktbgkJRG9uJ3QgcmVzb2x2ZSBuYW1lcyIKKy8vdXNhZ2U6ICAgICAgICJcbgktaSBJRgkJTmV0d29yayBpbnRlcmZhY2UiCisvL3VzYWdlOiAgICAgICAiXG4JLUQJCVJlYWQgPGh3YWRkcj4gZnJvbSBnaXZlbiBkZXZpY2UiCisvL3VzYWdlOiAgICAgICAiXG4JLUEsLXAgQUYJUHJvdG9jb2wgZmFtaWx5IgorLy91c2FnZTogICAgICAgIlxuCS1IIEhXVFlQRQlIYXJkd2FyZSBhZGRyZXNzIHR5cGUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KKworI2RlZmluZSBERUJVRyAwCisKKyNkZWZpbmUgREZMVF9BRiAiaW5ldCIKKyNkZWZpbmUgREZMVF9IVyAiZXRoZXIiCisKK2VudW0geworCUFSUF9PUFRfQSA9ICgxIDw8IDApLAorCUFSUF9PUFRfcCA9ICgxIDw8IDEpLAorCUFSUF9PUFRfSCA9ICgxIDw8IDIpLAorCUFSUF9PUFRfdCA9ICgxIDw8IDMpLAorCUFSUF9PUFRfaSA9ICgxIDw8IDQpLAorCUFSUF9PUFRfYSA9ICgxIDw8IDUpLAorCUFSUF9PUFRfZCA9ICgxIDw8IDYpLAorCUFSUF9PUFRfbiA9ICgxIDw8IDcpLCAvKiBkbyBub3QgcmVzb2x2ZSBhZGRyZXNzZXMgKi8KKwlBUlBfT1BUX0QgPSAoMSA8PCA4KSwgLyogSFctYWRkcmVzcyBpcyBkZXZpY2VuYW1lICovCisJQVJQX09QVF9zID0gKDEgPDwgOSksCisJQVJQX09QVF92ID0gKDEgPDwgMTApICogREVCVUcsIC8qIGRlYnVnZ2luZyBvdXRwdXQgZmxhZyAqLworfTsKKworZW51bSB7CisJc29ja2ZkID0gMywgLyogYWN0aXZlIHNvY2tldCBkZXNjcmlwdG9yICovCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJY29uc3Qgc3RydWN0IGFmdHlwZSAqYXA7IC8qIGN1cnJlbnQgYWRkcmVzcyBmYW1pbHkgKi8KKwljb25zdCBzdHJ1Y3QgaHd0eXBlICpodzsgLyogY3VycmVudCBoYXJkd2FyZSB0eXBlICovCisJY29uc3QgY2hhciAqZGV2aWNlOyAgICAgIC8qIGN1cnJlbnQgZGV2aWNlICovCisJc21hbGxpbnQgaHdfc2V0OyAgICAgICAgIC8qIGZsYWcgaWYgaHctdHlwZSB3YXMgc2V0ICgtSCkgKi8KKworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgYXAgICAgICAgICAoRy5hcCAgICAgICAgKQorI2RlZmluZSBodyAgICAgICAgIChHLmh3ICAgICAgICApCisjZGVmaW5lIGRldmljZSAgICAgKEcuZGV2aWNlICAgICkKKyNkZWZpbmUgaHdfc2V0ICAgICAoRy5od19zZXQgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlkZXZpY2UgPSAiIjsgXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgY29uc3QgY2hhciBvcHRpb25zW10gQUxJR04xID0KKwkicHViXDAiCisJInByaXZcMCIKKwkidGVtcFwwIgorCSJ0cmFpbFwwIgorCSJkb250cHViXDAiCisJImF1dG9cMCIKKwkiZGV2XDAiCisJIm5ldG1hc2tcMCI7CisKKy8qIERlbGV0ZSBhbiBlbnRyeSBmcm9tIHRoZSBBUlAgY2FjaGUuICovCisvKiBDYWxsZWQgb25seSBmcm9tIG1haW4sIG9uY2UgKi8KK3N0YXRpYyBpbnQgYXJwX2RlbChjaGFyICoqYXJncykKK3sKKwljaGFyICpob3N0OworCXN0cnVjdCBhcnByZXEgcmVxOworCXN0cnVjdCBzb2NrYWRkciBzYTsKKwlpbnQgZmxhZ3MgPSAwOworCWludCBlcnI7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJLyogUmVzb2x2ZSB0aGUgaG9zdCBuYW1lLiAqLworCWhvc3QgPSAqYXJnczsKKwlpZiAoYXAtPmlucHV0KGhvc3QsICZzYSkgPCAwKSB7CisJCWJiX2hlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBob3N0KTsKKwl9CisKKwkvKiBJZiBhIGhvc3QgaGFzIG1vcmUgdGhhbiBvbmUgYWRkcmVzcywgdXNlIHRoZSBjb3JyZWN0IG9uZSEgKi8KKwltZW1jcHkoJnJlcS5hcnBfcGEsICZzYSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCisJaWYgKGh3X3NldCkKKwkJcmVxLmFycF9oYS5zYV9mYW1pbHkgPSBody0+dHlwZTsKKworCXJlcS5hcnBfZmxhZ3MgPSBBVEZfUEVSTTsKKwlhcmdzKys7CisJd2hpbGUgKCphcmdzICE9IE5VTEwpIHsKKwkJc3dpdGNoIChpbmRleF9pbl9zdHJpbmdzKG9wdGlvbnMsICphcmdzKSkgeworCQljYXNlIDA6IC8qICJwdWIiICovCisJCQlmbGFncyB8PSAxOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogInByaXYiICovCisJCQlmbGFncyB8PSAyOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogInRlbXAiICovCisJCQlyZXEuYXJwX2ZsYWdzICY9IH5BVEZfUEVSTTsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDM6IC8qICJ0cmFpbCIgKi8KKwkJCXJlcS5hcnBfZmxhZ3MgfD0gQVRGX1VTRVRSQUlMRVJTOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgNDogLyogImRvbnRwdWIiICovCisjaWZkZWYgSEFWRV9BVEZfRE9OVFBVQgorCQkJcmVxLmFycF9mbGFncyB8PSBBVEZfRE9OVFBVQjsKKyNlbHNlCisJCQliYl9lcnJvcl9tc2coImZlYXR1cmUgQVRGX0RPTlRQVUIgaXMgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSA1OiAvKiAiYXV0byIgKi8KKyNpZmRlZiBIQVZFX0FURl9NQUdJQworCQkJcmVxLmFycF9mbGFncyB8PSBBVEZfTUFHSUM7CisjZWxzZQorCQkJYmJfZXJyb3JfbXNnKCJmZWF0dXJlIEFURl9NQUdJQyBpcyBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDY6IC8qICJkZXYiICovCisJCQlpZiAoKisrYXJncyA9PSBOVUxMKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWRldmljZSA9ICphcmdzOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgNzogLyogIm5ldG1hc2siICovCisJCQlpZiAoKisrYXJncyA9PSBOVUxMKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3MsICIyNTUuMjU1LjI1NS4yNTUiKSAhPSAwKSB7CisJCQkJaG9zdCA9ICphcmdzOworCQkJCWlmIChhcC0+aW5wdXQoaG9zdCwgJnNhKSA8IDApIHsKKwkJCQkJYmJfaGVycm9yX21zZ19hbmRfZGllKCIlcyIsIGhvc3QpOworCQkJCX0KKwkJCQltZW1jcHkoJnJlcS5hcnBfbmV0bWFzaywgJnNhLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJCQkJcmVxLmFycF9mbGFncyB8PSBBVEZfTkVUTUFTSzsKKwkJCX0KKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGZsYWdzID09IDApCisJCWZsYWdzID0gMzsKKworCXN0cm5jcHkocmVxLmFycF9kZXYsIGRldmljZSwgc2l6ZW9mKHJlcS5hcnBfZGV2KSk7CisKKwllcnIgPSAtMTsKKworCS8qIENhbGwgdGhlIGtlcm5lbC4gKi8KKwlpZiAoZmxhZ3MgJiAyKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgQVJQX09QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJTSU9DREFSUChub3B1YikiKTsKKwkJZXJyID0gaW9jdGwoc29ja2ZkLCBTSU9DREFSUCwgJnJlcSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5YSU8pIHsKKwkJCQlpZiAoZmxhZ3MgJiAxKQorCQkJCQlnb3RvIG5vcHViOworCQkJCXByaW50ZigiTm8gQVJQIGVudHJ5IGZvciAlc1xuIiwgaG9zdCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJTSU9DREFSUChwcml2KSIpOworCQl9CisJfQorCWlmICgoZmxhZ3MgJiAxKSAmJiBlcnIpIHsKKyBub3B1YjoKKwkJcmVxLmFycF9mbGFncyB8PSBBVEZfUFVCTDsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBBUlBfT1BUX3YpCisJCQliYl9lcnJvcl9tc2coIlNJT0NEQVJQKHB1YikiKTsKKwkJaWYgKGlvY3RsKHNvY2tmZCwgU0lPQ0RBUlAsICZyZXEpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOWElPKSB7CisJCQkJcHJpbnRmKCJObyBBUlAgZW50cnkgZm9yICVzXG4iLCBob3N0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlNJT0NEQVJQKHB1YikiKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIHRvIGEgc3BlY2lmaWVkIGludGVyZmFjZSBuYW1lICovCitzdGF0aWMgdm9pZCBhcnBfZ2V0ZGV2aHcoY2hhciAqaWZuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLAorCQkJCQkJIGNvbnN0IHN0cnVjdCBod3R5cGUgKmh3dCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWNvbnN0IHN0cnVjdCBod3R5cGUgKnhodzsKKworCXN0cmNweShpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoc29ja2ZkLCBTSU9DR0lGSFdBRERSLCAmaWZyLAorCQkJCQkiY2FudCBnZXQgSFctQWRkcmVzcyBmb3IgJyVzJyIsIGlmbmFtZSk7CisJaWYgKGh3dCAmJiAoaWZyLmlmcl9od2FkZHIuc2FfZmFtaWx5ICE9IGh3LT50eXBlKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicHJvdG9jb2wgdHlwZSBtaXNtYXRjaCIpOworCX0KKwltZW1jcHkoc2EsICYoaWZyLmlmcl9od2FkZHIpLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfdikgeworCQl4aHcgPSBnZXRfaHdudHlwZShpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHkpOworCQlpZiAoIXhodyB8fCAheGh3LT5wcmludCkgeworCQkJeGh3ID0gZ2V0X2h3bnR5cGUoLTEpOworCQl9CisJCWJiX2Vycm9yX21zZygiZGV2aWNlICclcycgaGFzIEhXIGFkZHJlc3MgJXMgJyVzJyIsCisJCQkJCSBpZm5hbWUsIHhody0+bmFtZSwKKwkJCQkJIHhody0+cHJpbnQoKHVuc2lnbmVkIGNoYXIgKikgJmlmci5pZnJfaHdhZGRyLnNhX2RhdGEpKTsKKwl9Cit9CisKKy8qIFNldCBhbiBlbnRyeSBpbiB0aGUgQVJQIGNhY2hlLiAqLworLyogQ2FsbGVkIG9ubHkgZnJvbSBtYWluLCBvbmNlICovCitzdGF0aWMgaW50IGFycF9zZXQoY2hhciAqKmFyZ3MpCit7CisJY2hhciAqaG9zdDsKKwlzdHJ1Y3QgYXJwcmVxIHJlcTsKKwlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJaW50IGZsYWdzOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCWhvc3QgPSAqYXJncysrOworCWlmIChhcC0+aW5wdXQoaG9zdCwgJnNhKSA8IDApIHsKKwkJYmJfaGVycm9yX21zZ19hbmRfZGllKCIlcyIsIGhvc3QpOworCX0KKwkvKiBJZiBhIGhvc3QgaGFzIG1vcmUgdGhhbiBvbmUgYWRkcmVzcywgdXNlIHRoZSBjb3JyZWN0IG9uZSEgKi8KKwltZW1jcHkoJnJlcS5hcnBfcGEsICZzYSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCisJLyogRmV0Y2ggdGhlIGhhcmR3YXJlIGFkZHJlc3MuICovCisJaWYgKCphcmdzID09IE5VTEwpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5lZWQgaGFyZHdhcmUgYWRkcmVzcyIpOworCX0KKwlpZiAob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfRCkgeworCQlhcnBfZ2V0ZGV2aHcoKmFyZ3MrKywgJnJlcS5hcnBfaGEsIGh3X3NldCA/IGh3IDogTlVMTCk7CisJfSBlbHNlIHsKKwkJaWYgKGh3LT5pbnB1dCgqYXJncysrLCAmcmVxLmFycF9oYSkgPCAwKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBoYXJkd2FyZSBhZGRyZXNzIik7CisJCX0KKwl9CisKKwkvKiBDaGVjayBvdXQgYW55IG1vZGlmaWVycy4gKi8KKwlmbGFncyA9IEFURl9QRVJNIHwgQVRGX0NPTTsKKwl3aGlsZSAoKmFyZ3MgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGluZGV4X2luX3N0cmluZ3Mob3B0aW9ucywgKmFyZ3MpKSB7CisJCWNhc2UgMDogLyogInB1YiIgKi8KKwkJCWZsYWdzIHw9IEFURl9QVUJMOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogInByaXYiICovCisJCQlmbGFncyAmPSB+QVRGX1BVQkw7CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiAidGVtcCIgKi8KKwkJCWZsYWdzICY9IH5BVEZfUEVSTTsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDM6IC8qICJ0cmFpbCIgKi8KKwkJCWZsYWdzIHw9IEFURl9VU0VUUkFJTEVSUzsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDQ6IC8qICJkb250cHViIiAqLworI2lmZGVmIEhBVkVfQVRGX0RPTlRQVUIKKwkJCWZsYWdzIHw9IEFURl9ET05UUFVCOworI2Vsc2UKKwkJCWJiX2Vycm9yX21zZygiZmVhdHVyZSBBVEZfRE9OVFBVQiBpcyBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDU6IC8qICJhdXRvIiAqLworI2lmZGVmIEhBVkVfQVRGX01BR0lDCisJCQlmbGFncyB8PSBBVEZfTUFHSUM7CisjZWxzZQorCQkJYmJfZXJyb3JfbXNnKCJmZWF0dXJlIEFURl9NQUdJQyBpcyBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDY6IC8qICJkZXYiICovCisJCQlpZiAoKisrYXJncyA9PSBOVUxMKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWRldmljZSA9ICphcmdzOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgNzogLyogIm5ldG1hc2siICovCisJCQlpZiAoKisrYXJncyA9PSBOVUxMKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3MsICIyNTUuMjU1LjI1NS4yNTUiKSAhPSAwKSB7CisJCQkJaG9zdCA9ICphcmdzOworCQkJCWlmIChhcC0+aW5wdXQoaG9zdCwgJnNhKSA8IDApIHsKKwkJCQkJYmJfaGVycm9yX21zZ19hbmRfZGllKCIlcyIsIGhvc3QpOworCQkJCX0KKwkJCQltZW1jcHkoJnJlcS5hcnBfbmV0bWFzaywgJnNhLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJCQkJZmxhZ3MgfD0gQVRGX05FVE1BU0s7CisJCQl9CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluZGVyIG9mIHRoZSByZXF1ZXN0LiAqLworCXJlcS5hcnBfZmxhZ3MgPSBmbGFnczsKKworCXN0cm5jcHkocmVxLmFycF9kZXYsIGRldmljZSwgc2l6ZW9mKHJlcS5hcnBfZGV2KSk7CisKKwkvKiBDYWxsIHRoZSBrZXJuZWwuICovCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBBUlBfT1BUX3YpCisJCWJiX2Vycm9yX21zZygiU0lPQ1NBUlAoKSIpOworCXhpb2N0bChzb2NrZmQsIFNJT0NTQVJQLCAmcmVxKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBQcmludCB0aGUgY29udGVudHMgb2YgYW4gQVJQIHJlcXVlc3QgYmxvY2suICovCitzdGF0aWMgdm9pZAorYXJwX2Rpc3AoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqaXAsIGludCB0eXBlLCBpbnQgYXJwX2ZsYWdzLAorCQkgY2hhciAqaHdhLCBjaGFyICptYXNrLCBjaGFyICpkZXYpCit7CisJc3RhdGljIGNvbnN0IGludCBhcnBfbWFza3NbXSA9IHsKKwkJQVRGX1BFUk0sIEFURl9QVUJMLAorI2lmZGVmIEhBVkVfQVRGX01BR0lDCisJCUFURl9NQUdJQywKKyNlbmRpZgorI2lmZGVmIEhBVkVfQVRGX0RPTlRQVUIKKwkJQVRGX0RPTlRQVUIsCisjZW5kaWYKKwkJQVRGX1VTRVRSQUlMRVJTLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgYXJwX2xhYmVsc1tdIEFMSUdOMSA9ICJQRVJNXDAiIlBVUFwwIgorI2lmZGVmIEhBVkVfQVRGX01BR0lDCisJCSJBVVRPXDAiCisjZW5kaWYKKyNpZmRlZiBIQVZFX0FURl9ET05UUFVCCisJCSJET05UUFVCXDAiCisjZW5kaWYKKwkJIlRSQUlMXDAiCisJOworCisJY29uc3Qgc3RydWN0IGh3dHlwZSAqeGh3OworCisJeGh3ID0gZ2V0X2h3bnR5cGUodHlwZSk7CisJaWYgKHhodyA9PSBOVUxMKQorCQl4aHcgPSBnZXRfaHd0eXBlKERGTFRfSFcpOworCisJcHJpbnRmKCIlcyAoJXMpIGF0ICIsIG5hbWUsIGlwKTsKKworCWlmICghKGFycF9mbGFncyAmIEFURl9DT00pKSB7CisJCWlmIChhcnBfZmxhZ3MgJiBBVEZfUFVCTCkKKwkJCXByaW50ZigiKiAiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCI8aW5jb21wbGV0ZT4gIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlcyBbJXNdICIsIGh3YSwgeGh3LT5uYW1lKTsKKwl9CisKKwlpZiAoYXJwX2ZsYWdzICYgQVRGX05FVE1BU0spCisJCXByaW50ZigibmV0bWFzayAlcyAiLCBtYXNrKTsKKworCXByaW50X2ZsYWdzX3NlcGFyYXRlZChhcnBfbWFza3MsIGFycF9sYWJlbHMsIGFycF9mbGFncywgIiAiKTsKKwlwcmludGYoIiBvbiAlc1xuIiwgZGV2KTsKK30KKworLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIEFSUCBjYWNoZSBpbiB0aGUga2VybmVsLiAqLworLyogQ2FsbGVkIG9ubHkgZnJvbSBtYWluLCBvbmNlICovCitzdGF0aWMgaW50IGFycF9zaG93KGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqaG9zdDsKKwljb25zdCBjaGFyICpob3N0bmFtZTsKKwlGSUxFICpmcDsKKwlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJaW50IHR5cGUsIGZsYWdzOworCWludCBudW07CisJdW5zaWduZWQgZW50cmllcyA9IDAsIHNob3duID0gMDsKKwljaGFyIGlwWzEyOF07CisJY2hhciBod2FbMTI4XTsKKwljaGFyIG1hc2tbMTI4XTsKKwljaGFyIGxpbmVbMTI4XTsKKwljaGFyIGRldlsxMjhdOworCisJaG9zdCA9IE5VTEw7CisJaWYgKG5hbWUgIT0gTlVMTCkgeworCQkvKiBSZXNvbHZlIHRoZSBob3N0IG5hbWUuICovCisJCWlmIChhcC0+aW5wdXQobmFtZSwgJnNhKSA8IDApIHsKKwkJCWJiX2hlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBuYW1lKTsKKwkJfQorCQlob3N0ID0geHN0cmR1cChhcC0+c3ByaW50KCZzYSwgMSkpOworCX0KKwlmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2MvbmV0L2FycCIpOworCS8qIEJ5cGFzcyBoZWFkZXIgLS0gcmVhZCBvbmUgbGluZSAqLworCWZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApOworCisJLyogUmVhZCB0aGUgQVJQIGNhY2hlIGVudHJpZXMuICovCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7CisKKwkJbWFza1swXSA9ICctJzsgbWFza1sxXSA9ICdcMCc7CisJCWRldlswXSA9ICctJzsgZGV2WzFdID0gJ1wwJzsKKwkJLyogQWxsIHRoZXNlIHN0cmluZ3MgY2FuJ3Qgb3ZlcmZsb3cKKwkJICogYmVjYXVzZSBmZ2V0cyBhYm92ZSByZWFkcyBsaW1pdGVkIGFtb3VudCBvZiBkYXRhICovCisJCW51bSA9IHNzY2FuZihsaW5lLCAiJXMgMHgleCAweCV4ICVzICVzICVzXG4iLAorCQkJCQkgaXAsICZ0eXBlLCAmZmxhZ3MsIGh3YSwgbWFzaywgZGV2KTsKKwkJaWYgKG51bSA8IDQpCisJCQlicmVhazsKKworCQllbnRyaWVzKys7CisJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBody10eXBlIGRpZmZlcnMsIHNraXAgaXQgKi8KKwkJaWYgKGh3X3NldCAmJiAodHlwZSAhPSBody0+dHlwZSkpCisJCQljb250aW51ZTsKKworCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgYWRkcmVzcyBkaWZmZXJzLCBza2lwIGl0ICovCisJCWlmIChob3N0ICYmIHN0cmNtcChpcCwgaG9zdCkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBkZXZpY2UgZGlmZmVycywgc2tpcCBpdCAqLworCQlpZiAoZGV2aWNlWzBdICYmIHN0cmNtcChkZXYsIGRldmljZSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXNob3duKys7CisJCS8qIFRoaXMgSVMgdWdseSBidXQgaXQgd29ya3MgLWJlICovCisJCWhvc3RuYW1lID0gIj8iOworCQlpZiAoIShvcHRpb25fbWFzazMyICYgQVJQX09QVF9uKSkgeworCQkJaWYgKGFwLT5pbnB1dChpcCwgJnNhKSA8IDApCisJCQkJaG9zdG5hbWUgPSBpcDsKKwkJCWVsc2UKKwkJCQlob3N0bmFtZSA9IGFwLT5zcHJpbnQoJnNhLCAob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfbikgfCAweDgwMDApOworCQkJaWYgKHN0cmNtcChob3N0bmFtZSwgaXApID09IDApCisJCQkJaG9zdG5hbWUgPSAiPyI7CisJCX0KKworCQlhcnBfZGlzcChob3N0bmFtZSwgaXAsIHR5cGUsIGZsYWdzLCBod2EsIG1hc2ssIGRldik7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgQVJQX09QVF92KQorCQlwcmludGYoIkVudHJpZXM6ICVkXHRTa2lwcGVkOiAlZFx0Rm91bmQ6ICVkXG4iLAorCQkJICAgZW50cmllcywgZW50cmllcyAtIHNob3duLCBzaG93bik7CisKKwlpZiAoIXNob3duKSB7CisJCWlmIChod19zZXQgfHwgaG9zdCB8fCBkZXZpY2VbMF0pCisJCQlwcmludGYoIk5vIG1hdGNoIGZvdW5kIGluICVkIGVudHJpZXNcbiIsIGVudHJpZXMpOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZSgoY2hhciopaG9zdCk7CisJCWZjbG9zZShmcCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgYXJwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhcnBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmh3X3R5cGUgPSAiZXRoZXIiOworCWNvbnN0IGNoYXIgKnByb3RvY29sOworCXVuc2lnbmVkIG9wdHM7CisKKwlJTklUX0coKTsKKworCXhtb3ZlX2ZkKHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCksIHNvY2tmZCk7CisJYXAgPSBnZXRfYWZ0eXBlKERGTFRfQUYpOworCWlmICghYXApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogJXMgbm90IHN1cHBvcnRlZCIsIERGTFRfQUYsICJhZGRyZXNzIGZhbWlseSIpOworCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJBOnA6SDp0Omk6YWRuRHN2IiwgJnByb3RvY29sLCAmcHJvdG9jb2wsCisJCQkJICZod190eXBlLCAmaHdfdHlwZSwgJmRldmljZSk7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdHMgJiAoQVJQX09QVF9BIHwgQVJQX09QVF9wKSkgeworCQlhcCA9IGdldF9hZnR5cGUocHJvdG9jb2wpOworCQlpZiAoYXAgPT0gTlVMTCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogdW5rbm93biAlcyIsIHByb3RvY29sLCAiYWRkcmVzcyBmYW1pbHkiKTsKKwl9CisJaWYgKG9wdHMgJiAoQVJQX09QVF9BIHwgQVJQX09QVF9wKSkgeworCQlodyA9IGdldF9od3R5cGUoaHdfdHlwZSk7CisJCWlmIChodyA9PSBOVUxMKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiB1bmtub3duICVzIiwgaHdfdHlwZSwgImhhcmR3YXJlIHR5cGUiKTsKKwkJaHdfc2V0ID0gMTsKKwl9CisJLy9pZiAob3B0cyAmIEFSUF9PUFRfaSkuLi4gLWkKKworCWlmIChhcC0+YWYgIT0gQUZfSU5FVCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IGtlcm5lbCBvbmx5IHN1cHBvcnRzICdpbmV0JyIsIGFwLT5uYW1lKTsKKwl9CisKKwkvKiBJZiBubyBodyB0eXBlIHNwZWNpZmllZCBnZXQgZGVmYXVsdCAqLworCWlmICghaHcpIHsKKwkJaHcgPSBnZXRfaHd0eXBlKERGTFRfSFcpOworCQlpZiAoIWh3KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiAlcyBub3Qgc3VwcG9ydGVkIiwgREZMVF9IVywgImhhcmR3YXJlIHR5cGUiKTsKKwl9CisKKwlpZiAoaHctPmFsZW4gPD0gMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6ICVzIHdpdGhvdXQgQVJQIHN1cHBvcnQiLAorCQkJCQkJCSBody0+bmFtZSwgImhhcmR3YXJlIHR5cGUiKTsKKwl9CisKKwkvKiBOb3cgc2VlIHdoYXQgd2UgaGF2ZSB0byBkbyBoZXJlLi4uICovCisJaWYgKG9wdHMgJiAoQVJQX09QVF9kIHwgQVJQX09QVF9zKSkgeworCQlpZiAoYXJndlswXSA9PSBOVUxMKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5lZWQgaG9zdCBuYW1lIik7CisJCWlmIChvcHRzICYgQVJQX09QVF9zKQorCQkJcmV0dXJuIGFycF9zZXQoYXJndik7CisJCXJldHVybiBhcnBfZGVsKGFyZ3YpOworCX0KKwkvL2lmIChvcHRzICYgQVJQX09QVF9hKSAtIGRlZmF1bHQKKwlyZXR1cm4gYXJwX3Nob3coYXJndlswXSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2FycGluZy5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9hcnBpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQyMWVkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9hcnBpbmcuYwpAQCAtMCwwICsxLDQyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBdXRob3I6IEFsZXhleSBLdXpuZXRzb3YgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICogQnVzeWJveCBwb3J0OiBOaWNrIEZlZGNoaWsgPG5pY2tAZmVkY2hpay5vcmcudWE+CisgKi8KKworLy91c2FnZTojZGVmaW5lIGFycGluZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mcWJEVUFdIFstYyBDTlRdIFstdyBUSU1FT1VUXSBbLUkgSUZBQ0VdIFstcyBTUkNfSVBdIERTVF9JUCIKKy8vdXNhZ2U6I2RlZmluZSBhcnBpbmdfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIEFSUCByZXF1ZXN0cy9yZXBsaWVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCQlRdWl0IG9uIGZpcnN0IEFSUCByZXBseSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCVF1aWV0IgorLy91c2FnZTogICAgICJcbgktYgkJS2VlcCBicm9hZGNhc3RpbmcsIGRvbid0IGdvIHVuaWNhc3QiCisvL3VzYWdlOiAgICAgIlxuCS1ECQlEdXBsaWNhdGVkIGFkZHJlc3MgZGV0ZWN0aW9uIG1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS1VCQlVbnNvbGljaXRlZCBBUlAgbW9kZSwgdXBkYXRlIHlvdXIgbmVpZ2hib3JzIgorLy91c2FnZTogICAgICJcbgktQQkJQVJQIGFuc3dlciBtb2RlLCB1cGRhdGUgeW91ciBuZWlnaGJvcnMiCisvL3VzYWdlOiAgICAgIlxuCS1jIE4JCVN0b3AgYWZ0ZXIgc2VuZGluZyBOIEFSUCByZXF1ZXN0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcgVElNRU9VVAlUaW1lIHRvIHdhaXQgZm9yIEFSUCByZXBseSwgc2Vjb25kcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUkgSUZBQ0UJSW50ZXJmYWNlIHRvIHVzZSAoZGVmYXVsdCBldGgwKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU1JDX0lQCVNlbmRlciBJUCBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbglEU1RfSVAJCVRhcmdldCBJUCBhZGRyZXNzIgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFdlIGRvbid0IGV4cGVjdCB0byBzZWUgMTAwMCsgc2Vjb25kcyBkZWxheSwgdW5zaWduZWQgaXMgZW5vdWdoICovCisjZGVmaW5lIE1PTk9UT05JQ19VUygpICgodW5zaWduZWQpbW9ub3RvbmljX3VzKCkpCisKK2VudW0geworCURBRCA9IDEsCisJVU5TT0xJQ0lURUQgPSAyLAorCUFEVkVSVCA9IDQsCisJUVVJRVQgPSA4LAorCVFVSVRfT05fUkVQTFkgPSAxNiwKKwlCQ0FTVF9PTkxZID0gMzIsCisJVU5JQ0FTVElORyA9IDY0Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IGluX2FkZHIgc3JjOworCXN0cnVjdCBpbl9hZGRyIGRzdDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgbWU7CisJc3RydWN0IHNvY2thZGRyX2xsIGhlOworCWludCBzb2NrX2ZkOworCisJaW50IGNvdW50OyAvLyA9IC0xOworCXVuc2lnbmVkIGxhc3Q7CisJdW5zaWduZWQgdGltZW91dF91czsKKwl1bnNpZ25lZCBzdGFydDsKKworCXVuc2lnbmVkIHNlbnQ7CisJdW5zaWduZWQgYnJkX3NlbnQ7CisJdW5zaWduZWQgcmVjZWl2ZWQ7CisJdW5zaWduZWQgYnJkX3JlY3Y7CisJdW5zaWduZWQgcmVxX3JlY3Y7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBzcmMgICAgICAgIChHLnNyYyAgICAgICApCisjZGVmaW5lIGRzdCAgICAgICAgKEcuZHN0ICAgICAgICkKKyNkZWZpbmUgbWUgICAgICAgICAoRy5tZSAgICAgICAgKQorI2RlZmluZSBoZSAgICAgICAgIChHLmhlICAgICAgICApCisjZGVmaW5lIHNvY2tfZmQgICAgKEcuc29ja19mZCAgICkKKyNkZWZpbmUgY291bnQgICAgICAoRy5jb3VudCAgICAgKQorI2RlZmluZSBsYXN0ICAgICAgIChHLmxhc3QgICAgICApCisjZGVmaW5lIHRpbWVvdXRfdXMgKEcudGltZW91dF91cykKKyNkZWZpbmUgc3RhcnQgICAgICAoRy5zdGFydCAgICAgKQorI2RlZmluZSBzZW50ICAgICAgIChHLnNlbnQgICAgICApCisjZGVmaW5lIGJyZF9zZW50ICAgKEcuYnJkX3NlbnQgICkKKyNkZWZpbmUgcmVjZWl2ZWQgICAoRy5yZWNlaXZlZCAgKQorI2RlZmluZSBicmRfcmVjdiAgIChHLmJyZF9yZWN2ICApCisjZGVmaW5lIHJlcV9yZWN2ICAgKEcucmVxX3JlY3YgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJY291bnQgPSAtMTsgXAorfSB3aGlsZSAoMCkKKworLy8gSWYgR05VaXNtcyBhcmUgbm90IGF2YWlsYWJsZS4uLgorLy9zdGF0aWMgdm9pZCAqbWVtcGNweSh2b2lkICpfZHN0LCBjb25zdCB2b2lkICpfc3JjLCBpbnQgbikKKy8veworLy8JbWVtY3B5KF9kc3QsIF9zcmMsIG4pOworLy8JcmV0dXJuIChjaGFyKilfZHN0ICsgbjsKKy8vfQorCitzdGF0aWMgaW50IHNlbmRfcGFjayhzdHJ1Y3QgaW5fYWRkciAqc3JjX2FkZHIsCisJCQlzdHJ1Y3QgaW5fYWRkciAqZHN0X2FkZHIsIHN0cnVjdCBzb2NrYWRkcl9sbCAqTUUsCisJCQlzdHJ1Y3Qgc29ja2FkZHJfbGwgKkhFKQoreworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBidWZbMjU2XTsKKwlzdHJ1Y3QgYXJwaGRyICphaCA9IChzdHJ1Y3QgYXJwaGRyICopIGJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgKGFoICsgMSk7CisKKwlhaC0+YXJfaHJkID0gaHRvbnMoQVJQSFJEX0VUSEVSKTsKKwlhaC0+YXJfcHJvID0gaHRvbnMoRVRIX1BfSVApOworCWFoLT5hcl9obG4gPSBNRS0+c2xsX2hhbGVuOworCWFoLT5hcl9wbG4gPSA0OworCWFoLT5hcl9vcCA9IG9wdGlvbl9tYXNrMzIgJiBBRFZFUlQgPyBodG9ucyhBUlBPUF9SRVBMWSkgOiBodG9ucyhBUlBPUF9SRVFVRVNUKTsKKworCXAgPSBtZW1wY3B5KHAsICZNRS0+c2xsX2FkZHIsIGFoLT5hcl9obG4pOworCXAgPSBtZW1wY3B5KHAsIHNyY19hZGRyLCA0KTsKKworCWlmIChvcHRpb25fbWFzazMyICYgQURWRVJUKQorCQlwID0gbWVtcGNweShwLCAmTUUtPnNsbF9hZGRyLCBhaC0+YXJfaGxuKTsKKwllbHNlCisJCXAgPSBtZW1wY3B5KHAsICZIRS0+c2xsX2FkZHIsIGFoLT5hcl9obG4pOworCisJcCA9IG1lbXBjcHkocCwgZHN0X2FkZHIsIDQpOworCisJZXJyID0gc2VuZHRvKHNvY2tfZmQsIGJ1ZiwgcCAtIGJ1ZiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSBIRSwgc2l6ZW9mKCpIRSkpOworCWlmIChlcnIgPT0gcCAtIGJ1ZikgeworCQlsYXN0ID0gTU9OT1RPTklDX1VTKCk7CisJCXNlbnQrKzsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIFVOSUNBU1RJTkcpKQorCQkJYnJkX3NlbnQrKzsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZmluaXNoKHZvaWQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZmluaXNoKHZvaWQpCit7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIFFVSUVUKSkgeworCQlwcmludGYoIlNlbnQgJXUgcHJvYmUocykgKCV1IGJyb2FkY2FzdChzKSlcbiIKKwkJCSJSZWNlaXZlZCAldSByZXBsJXMiCisJCQkiICgldSByZXF1ZXN0KHMpLCAldSBicm9hZGNhc3QocykpXG4iLAorCQkJc2VudCwgYnJkX3NlbnQsCisJCQlyZWNlaXZlZCwgKHJlY2VpdmVkID09IDEpID8gImllcyIgOiAieSIsCisJCQlyZXFfcmVjdiwgYnJkX3JlY3YpOworCX0KKwlpZiAob3B0aW9uX21hc2szMiAmIERBRCkKKwkJZXhpdCghIXJlY2VpdmVkKTsKKwlpZiAob3B0aW9uX21hc2szMiAmIFVOU09MSUNJVEVEKQorCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJZXhpdCghcmVjZWl2ZWQpOworfQorCitzdGF0aWMgdm9pZCBjYXRjaGVyKHZvaWQpCit7CisJdW5zaWduZWQgbm93OworCisJbm93ID0gTU9OT1RPTklDX1VTKCk7CisJaWYgKHN0YXJ0ID09IDApCisJCXN0YXJ0ID0gbm93OworCisJaWYgKGNvdW50ID09IDAgfHwgKHRpbWVvdXRfdXMgJiYgKG5vdyAtIHN0YXJ0KSA+IHRpbWVvdXRfdXMpKQorCQlmaW5pc2goKTsKKworCS8qIGNvdW50IDwgMCBtZWFucyAiaW5maW5pdGUgY291bnQiICovCisJaWYgKGNvdW50ID4gMCkKKwkJY291bnQtLTsKKworCWlmIChsYXN0ID09IDAgfHwgKG5vdyAtIGxhc3QpID4gNTAwMDAwKSB7CisJCXNlbmRfcGFjaygmc3JjLCAmZHN0LCAmbWUsICZoZSk7CisJCWlmIChjb3VudCA9PSAwICYmIChvcHRpb25fbWFzazMyICYgVU5TT0xJQ0lURUQpKQorCQkJZmluaXNoKCk7CisJfQorCWFsYXJtKDEpOworfQorCitzdGF0aWMgYm9vbCByZWN2X3BhY2sodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBzdHJ1Y3Qgc29ja2FkZHJfbGwgKkZST00pCit7CisJc3RydWN0IGFycGhkciAqYWggPSAoc3RydWN0IGFycGhkciAqKSBidWY7CisJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIChhaCArIDEpOworCXN0cnVjdCBpbl9hZGRyIHNyY19pcCwgZHN0X2lwOworCS8qIG1vdmVzIGJlbG93IGFzc3VtZSBpbl9hZGRyIGlzIDQgYnl0ZXMgYmlnLCBlbnN1cmUgdGhhdCAqLworCXN0cnVjdCBCVUdfaW5fYWRkcl9tdXN0X2JlXzQgeworCQljaGFyIEJVR19pbl9hZGRyX211c3RfYmVfNFsKKwkJCXNpemVvZihzdHJ1Y3QgaW5fYWRkcikgPT0gNCA/IDEgOiAtMQorCQldOworCQljaGFyIEJVR19zX2FkZHJfbXVzdF9iZV80WworCQkJc2l6ZW9mKHNyY19pcC5zX2FkZHIpID09IDQgPyAxIDogLTEKKwkJXTsKKwl9OworCisJLyogRmlsdGVyIG91dCB3aWxkIHBhY2tldHMgKi8KKwlpZiAoRlJPTS0+c2xsX3BrdHR5cGUgIT0gUEFDS0VUX0hPU1QKKwkgJiYgRlJPTS0+c2xsX3BrdHR5cGUgIT0gUEFDS0VUX0JST0FEQ0FTVAorCSAmJiBGUk9NLT5zbGxfcGt0dHlwZSAhPSBQQUNLRVRfTVVMVElDQVNUKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBPbmx5IHRoZXNlIHR5cGVzIGFyZSByZWNvZ25pemVkICovCisJaWYgKGFoLT5hcl9vcCAhPSBodG9ucyhBUlBPUF9SRVFVRVNUKSAmJiBhaC0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVQTFkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBBUlBIUkQgY2hlY2sgYW5kIHRoaXMgZGFybmVkIEZEREkgaGFjayBoZXJlIDotKCAqLworCWlmIChhaC0+YXJfaHJkICE9IGh0b25zKEZST00tPnNsbF9oYXR5cGUpCisJICYmIChGUk9NLT5zbGxfaGF0eXBlICE9IEFSUEhSRF9GRERJIHx8IGFoLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0VUSEVSKSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFByb3RvY29sIG11c3QgYmUgSVAuICovCisJaWYgKGFoLT5hcl9wcm8gIT0gaHRvbnMoRVRIX1BfSVApCisJIHx8IChhaC0+YXJfcGxuICE9IDQpCisJIHx8IChhaC0+YXJfaGxuICE9IG1lLnNsbF9oYWxlbikKKwkgfHwgKGxlbiA8IChpbnQpKHNpemVvZigqYWgpICsgMiAqICg0ICsgYWgtPmFyX2hsbikpKSkKKwkJcmV0dXJuIGZhbHNlOworCisJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHNyY19pcC5zX2FkZHIsIHAgKyBhaC0+YXJfaGxuKTsKKwltb3ZlX2Zyb21fdW5hbGlnbmVkMzIoZHN0X2lwLnNfYWRkciwgcCArIGFoLT5hcl9obG4gKyA0ICsgYWgtPmFyX2hsbik7CisKKwlpZiAoZHN0LnNfYWRkciAhPSBzcmNfaXAuc19hZGRyKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIERBRCkpIHsKKwkJaWYgKChzcmMuc19hZGRyICE9IGRzdF9pcC5zX2FkZHIpCisJCQl8fCAobWVtY21wKHAgKyBhaC0+YXJfaGxuICsgNCwgJm1lLnNsbF9hZGRyLCBhaC0+YXJfaGxuKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJLyogREFEIHBhY2tldCB3YXM6CisJCSAgIHNyY19pcCA9IDAgKG9yIHNvbWUgc3JjKQorCQkgICBzcmNfaHcgPSBNRQorCQkgICBkc3RfaXAgPSB0ZXN0ZWQgYWRkcmVzcworCQkgICBkc3RfaHcgPSA8dW5zcGVjPgorCisJCSAgIFdlIGZhaWwsIGlmIHJlY2VpdmUgcmVxdWVzdC9yZXBseSB3aXRoOgorCQkgICBzcmNfaXAgPSB0ZXN0ZWRfYWRkcmVzcworCQkgICBzcmNfaHcgIT0gTUUKKwkJICAgaWYgc3JjX2lwIGluIHJlcXVlc3Qgd2FzIG5vdCB6ZXJvLCBjaGVjaworCQkgICBhbHNvIHRoYXQgaXQgbWF0Y2hlcyB0byBkc3RfaXAsIG90aGVyd2lzZQorCQkgICBkc3RfaXAvZHN0X2h3IGRvIG5vdCBtYXR0ZXIuCisJCSAqLworCQlpZiAoKG1lbWNtcChwLCAmbWUuc2xsX2FkZHIsIG1lLnNsbF9oYWxlbikgPT0gMCkKKwkJIHx8IChzcmMuc19hZGRyICYmIHNyYy5zX2FkZHIgIT0gZHN0X2lwLnNfYWRkcikpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICghKG9wdGlvbl9tYXNrMzIgJiBRVUlFVCkpIHsKKwkJaW50IHNfcHJpbnRlZCA9IDA7CisKKwkJcHJpbnRmKCIlc2Nhc3QgcmUlcyBmcm9tICVzIFslc10iLAorCQkJRlJPTS0+c2xsX3BrdHR5cGUgPT0gUEFDS0VUX0hPU1QgPyAiVW5pIiA6ICJCcm9hZCIsCisJCQlhaC0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVQTFkpID8gInBseSIgOiAicXVlc3QiLAorCQkJaW5ldF9udG9hKHNyY19pcCksCisJCQlldGhlcl9udG9hKChzdHJ1Y3QgZXRoZXJfYWRkciAqKSBwKSk7CisJCWlmIChkc3RfaXAuc19hZGRyICE9IHNyYy5zX2FkZHIpIHsKKwkJCXByaW50ZigiZm9yICVzICIsIGluZXRfbnRvYShkc3RfaXApKTsKKwkJCXNfcHJpbnRlZCA9IDE7CisJCX0KKwkJaWYgKG1lbWNtcChwICsgYWgtPmFyX2hsbiArIDQsIG1lLnNsbF9hZGRyLCBhaC0+YXJfaGxuKSkgeworCQkJaWYgKCFzX3ByaW50ZWQpCisJCQkJcHJpbnRmKCJmb3IgIik7CisJCQlwcmludGYoIlslc10iLAorCQkJCWV0aGVyX250b2EoKHN0cnVjdCBldGhlcl9hZGRyICopIHAgKyBhaC0+YXJfaGxuICsgNCkpOworCQl9CisKKwkJaWYgKGxhc3QpIHsKKwkJCXVuc2lnbmVkIGRpZmYgPSBNT05PVE9OSUNfVVMoKSAtIGxhc3Q7CisJCQlwcmludGYoIiAldS4lMDN1bXNcbiIsIGRpZmYgLyAxMDAwLCBkaWZmICUgMTAwMCk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiBVTlNPTElDSVRFRD9cbiIpOworCQl9CisJCWZmbHVzaF9hbGwoKTsKKwl9CisJcmVjZWl2ZWQrKzsKKwlpZiAoRlJPTS0+c2xsX3BrdHR5cGUgIT0gUEFDS0VUX0hPU1QpCisJCWJyZF9yZWN2Kys7CisJaWYgKGFoLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVFVRVNUKSkKKwkJcmVxX3JlY3YrKzsKKwlpZiAob3B0aW9uX21hc2szMiAmIFFVSVRfT05fUkVQTFkpCisJCWZpbmlzaCgpOworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBCQ0FTVF9PTkxZKSkgeworCQltZW1jcHkoaGUuc2xsX2FkZHIsIHAsIG1lLnNsbF9oYWxlbik7CisJCW9wdGlvbl9tYXNrMzIgfD0gVU5JQ0FTVElORzsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBhcnBpbmdfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFycGluZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqZGV2aWNlID0gImV0aDAiOworCWNoYXIgKnNvdXJjZSA9IE5VTEw7CisJY2hhciAqdGFyZ2V0OworCXVuc2lnbmVkIGNoYXIgKnBhY2tldDsKKwljaGFyICplcnJfc3RyOworCisJSU5JVF9HKCk7CisKKwlzb2NrX2ZkID0geHNvY2tldChBRl9QQUNLRVQsIFNPQ0tfREdSQU0sIDApOworCisJLy8gRHJvcCBzdWlkIHJvb3QgcHJpdmlsZWdlcworCS8vIE5lZWQgdG8gcmVtb3ZlIFNVSURfTkVWRVIgZnJvbSBhcHBsZXRzLmggZm9yIHRoaXMgdG8gd29yaworCS8veHNldHVpZChnZXR1aWQoKSk7CisKKwllcnJfc3RyID0geGFzcHJpbnRmKCJpbnRlcmZhY2UgJXMgJSVzIiwgZGV2aWNlKTsKKwl7CisJCXVuc2lnbmVkIG9wdDsKKwkJY2hhciAqc3RyX3RpbWVvdXQ7CisKKwkJLyogRGFkIGFsc28gc2V0cyBxdWl0X29uX3JlcGx5LgorCQkgKiBBZHZlcnQgYWxzbyBzZXRzIHVuc29saWNpdGVkLgorCQkgKi8KKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTE6RGY6QVU6YysiOworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAiRFVBcWZiYzp3Okk6czoiLAorCQkJCSZjb3VudCwgJnN0cl90aW1lb3V0LCAmZGV2aWNlLCAmc291cmNlKTsKKwkJaWYgKG9wdCAmIDB4ODApIC8qIC13OiB0aW1lb3V0ICovCisJCQl0aW1lb3V0X3VzID0geGF0b3VfcmFuZ2Uoc3RyX3RpbWVvdXQsIDAsIElOVF9NQVgvMjAwMDAwMCkgKiAxMDAwMDAwICsgNTAwMDAwOworCQkvL2lmIChvcHQgJiAweDIwMCkgLyogLXM6IHNvdXJjZSAqLworCQlvcHRpb25fbWFzazMyICY9IDB4M2Y7IC8qIHNldCByZXNwZWN0aXZlIGZsYWdzICovCisJfQorCisJdGFyZ2V0ID0gYXJndltvcHRpbmRdOworCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMjsKKworCXsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKworCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgZGV2aWNlKTsKKwkJLyogV2UgdXNlIGlmci5pZnJfbmFtZSBpbiBlcnJvciBtc2cgc28gdGhhdCBwcm9ibGVtCisJCSAqIHdpdGggdHJ1bmNhdGVkIG5hbWUgd2lsbCBiZSB2aXNpYmxlICovCisJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKHNvY2tfZmQsIFNJT0NHSUZJTkRFWCwgJmlmciwgZXJyX3N0ciwgIm5vdCBmb3VuZCIpOworCQltZS5zbGxfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKworCQl4aW9jdGwoc29ja19mZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSAmaWZyKTsKKworCQlpZiAoIShpZnIuaWZyX2ZsYWdzICYgSUZGX1VQKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoZXJyX3N0ciwgImlzIGRvd24iKTsKKwkJfQorCQlpZiAoaWZyLmlmcl9mbGFncyAmIChJRkZfTk9BUlAgfCBJRkZfTE9PUEJBQ0spKSB7CisJCQliYl9lcnJvcl9tc2coZXJyX3N0ciwgImlzIG5vdCBBUlBhYmxlIik7CisJCQlyZXR1cm4gKG9wdGlvbl9tYXNrMzIgJiBEQUQgPyAwIDogMik7CisJCX0KKwl9CisKKwkvKiBpZiAoIWluZXRfYXRvbih0YXJnZXQsICZkc3QpKSAtIG5vdCBuZWVkZWQgKi8geworCQlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJCWxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcih0YXJnZXQsIDAsIEFGX0lORVQpOworCQlkc3QgPSBsc2EtPnUuc2luLnNpbl9hZGRyOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGxzYSk7CisJfQorCisJaWYgKHNvdXJjZSAmJiAhaW5ldF9hdG9uKHNvdXJjZSwgJnNyYykpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgc291cmNlIGFkZHJlc3MgJXMiLCBzb3VyY2UpOworCX0KKworCWlmICgob3B0aW9uX21hc2szMiAmIChEQUR8VU5TT0xJQ0lURUQpKSA9PSBVTlNPTElDSVRFRCAmJiBzcmMuc19hZGRyID09IDApCisJCXNyYyA9IGRzdDsKKworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBEQUQpIHx8IHNyYy5zX2FkZHIpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCQlpbnQgcHJvYmVfZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisJCXNldHNvY2tvcHRfYmluZHRvZGV2aWNlKHByb2JlX2ZkLCBkZXZpY2UpOworCQltZW1zZXQoJnNhZGRyLCAwLCBzaXplb2Yoc2FkZHIpKTsKKwkJc2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWlmIChzcmMuc19hZGRyKSB7CisJCQkvKiBDaGVjayB0aGF0IHRoaXMgaXMgaW5kZWVkIG91ciBJUCAqLworCQkJc2FkZHIuc2luX2FkZHIgPSBzcmM7CisJCQl4YmluZChwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsIHNpemVvZihzYWRkcikpOworCQl9IGVsc2UgeyAvKiAhKG9wdGlvbl9tYXNrMzIgJiBEQUQpIGNhc2UgKi8KKwkJCS8qIEZpbmQgSVAgYWRkcmVzcyBvbiB0aGlzIGlmYWNlICovCisJCQlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihzYWRkcik7CisKKwkJCXNhZGRyLnNpbl9wb3J0ID0gaHRvbnMoMTAyNSk7CisJCQlzYWRkci5zaW5fYWRkciA9IGRzdDsKKworCQkJaWYgKHNldHNvY2tvcHQocHJvYmVfZmQsIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwgJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKSA9PSAtMSkKKwkJCQliYl9wZXJyb3JfbXNnKCJzZXRzb2Nrb3B0KFNPX0RPTlRST1VURSkiKTsKKwkJCXhjb25uZWN0KHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisJCQlnZXRzb2NrbmFtZShwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsICZhbGVuKTsKKwkJCS8vbmV2ZXIgaGFwcGVuczoKKwkJCS8vaWYgKGdldHNvY2tuYW1lKHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgJmFsZW4pID09IC0xKQorCQkJLy8JYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRzb2NrbmFtZSIpOworCQkJaWYgKHNhZGRyLnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gSVAgYWRkcmVzcyBjb25maWd1cmVkIik7CisJCQlzcmMgPSBzYWRkci5zaW5fYWRkcjsKKwkJfQorCQljbG9zZShwcm9iZV9mZCk7CisJfQorCisJbWUuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwkvL21lLnNsbF9pZmluZGV4ID0gaWZpbmRleDsgLSBkb25lIGJlZm9yZQorCW1lLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FSUCk7CisJeGJpbmQoc29ja19mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmbWUsIHNpemVvZihtZSkpOworCisJeworCQlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihtZSk7CisJCWdldHNvY2tuYW1lKHNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJm1lLCAmYWxlbik7CisJCS8vbmV2ZXIgaGFwcGVuczoKKwkJLy9pZiAoZ2V0c29ja25hbWUoc29ja19mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmbWUsICZhbGVuKSA9PSAtMSkKKwkJLy8JYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRzb2NrbmFtZSIpOworCX0KKwlpZiAobWUuc2xsX2hhbGVuID09IDApIHsKKwkJYmJfZXJyb3JfbXNnKGVycl9zdHIsICJpcyBub3QgQVJQYWJsZSAobm8gbGwgYWRkcmVzcykiKTsKKwkJcmV0dXJuIChvcHRpb25fbWFzazMyICYgREFEID8gMCA6IDIpOworCX0KKwloZSA9IG1lOworCW1lbXNldChoZS5zbGxfYWRkciwgLTEsIGhlLnNsbF9oYWxlbik7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgUVVJRVQpKSB7CisJCS8qIGluZXRfbnRvYSB1c2VzIHN0YXRpYyBzdG9yYWdlLCBjYW4ndCB1c2UgaW4gc2FtZSBwcmludGYgKi8KKwkJcHJpbnRmKCJBUlBJTkcgdG8gJXMiLCBpbmV0X250b2EoZHN0KSk7CisJCXByaW50ZigiIGZyb20gJXMgdmlhICVzXG4iLCBpbmV0X250b2Eoc3JjKSwgZGV2aWNlKTsKKwl9CisKKwlzaWduYWxfU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR0lOVCwgICh2b2lkICgqKShpbnQpKWZpbmlzaCk7CisJc2lnbmFsX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdBTFJNLCAodm9pZCAoKikoaW50KSljYXRjaGVyKTsKKworCWNhdGNoZXIoKTsKKworCXBhY2tldCA9IHhtYWxsb2MoNDA5Nik7CisJd2hpbGUgKDEpIHsKKwkJc2lnc2V0X3Qgc3NldCwgb3NzZXQ7CisJCXN0cnVjdCBzb2NrYWRkcl9sbCBmcm9tOworCQlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihmcm9tKTsKKwkJaW50IGNjOworCisJCWNjID0gcmVjdmZyb20oc29ja19mZCwgcGFja2V0LCA0MDk2LCAwLCAoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCAmYWxlbik7CisJCWlmIChjYyA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coInJlY3Zmcm9tIik7CisJCQljb250aW51ZTsKKwkJfQorCQlzaWdlbXB0eXNldCgmc3NldCk7CisJCXNpZ2FkZHNldCgmc3NldCwgU0lHQUxSTSk7CisJCXNpZ2FkZHNldCgmc3NldCwgU0lHSU5UKTsKKwkJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc3NldCwgJm9zc2V0KTsKKwkJcmVjdl9wYWNrKHBhY2tldCwgY2MsICZmcm9tKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvc3NldCwgTlVMTCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9icmN0bC5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9icmN0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjQ3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2JyY3RsLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNtYWxsIGltcGxlbWVudGF0aW9uIG9mIGJyY3RsIGZvciBidXN5Ym94LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBTb21lIGhlbHBlciBmdW5jdGlvbnMgZnJvbSBicmlkZ2UtdXRpbHMgYXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGVubmVydCBCdXl0ZW5oZWsKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBUaGlzIGFwcGxldCBjdXJyZW50bHkgdXNlcyBvbmx5IHRoZSBpb2N0bCBpbnRlcmZhY2UgYW5kIG5vIHN5c2ZzIGF0IGFsbC4KKyAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyB0aGlzIHdhcyBjb25zaWRlcmVkIGEgZmVhdHVyZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYnJjdGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkNPTU1BTkQgW0JSSURHRSBbSU5URVJGQUNFXV0iCisvL3VzYWdlOiNkZWZpbmUgYnJjdGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNYW5hZ2UgZXRoZXJuZXQgYnJpZGdlc1xuIgorLy91c2FnZTogICAgICJcbkNvbW1hbmRzOiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQlJDVExfU0hPVygKKy8vdXNhZ2U6ICAgICAiXG4Jc2hvdwkJCVNob3cgYSBsaXN0IG9mIGJyaWRnZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCWFkZGJyIEJSSURHRQkJQ3JlYXRlIEJSSURHRSIKKy8vdXNhZ2U6ICAgICAiXG4JZGVsYnIgQlJJREdFCQlEZWxldGUgQlJJREdFIgorLy91c2FnZTogICAgICJcbglhZGRpZiBCUklER0UgSUZBQ0UJQWRkIElGQUNFIHRvIEJSSURHRSIKKy8vdXNhZ2U6ICAgICAiXG4JZGVsaWYgQlJJREdFIElGQUNFCURlbGV0ZSBJRkFDRSBmcm9tIEJSSURHRSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQlJDVExfRkFOQ1koCisvL3VzYWdlOiAgICAgIlxuCXNldGFnZWluZyBCUklER0UgVElNRQkJU2V0IGFnZWluZyB0aW1lIgorLy91c2FnZTogICAgICJcbglzZXRmZCBCUklER0UgVElNRQkJU2V0IGJyaWRnZSBmb3J3YXJkIGRlbGF5IgorLy91c2FnZTogICAgICJcbglzZXRoZWxsbyBCUklER0UgVElNRQkJU2V0IGhlbGxvIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCXNldG1heGFnZSBCUklER0UgVElNRQkJU2V0IG1heCBtZXNzYWdlIGFnZSIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0cGF0aGNvc3QgQlJJREdFIENPU1QJCVNldCBwYXRoIGNvc3QiCisvL3VzYWdlOiAgICAgIlxuCXNldHBvcnRwcmlvIEJSSURHRSBQUklPCQlTZXQgcG9ydCBwcmlvcml0eSIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0YnJpZGdlcHJpbyBCUklER0UgUFJJTwlTZXQgYnJpZGdlIHByaW9yaXR5IgorLy91c2FnZTogICAgICJcbglzdHAgQlJJREdFIFsxL3llcy9vbnwwL25vL29mZl0JU1RQIG9uL29mZiIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaWZuZGVmIFNJT0NCUkFEREJSCisjIGRlZmluZSBTSU9DQlJBRERCUiBCUkNUTF9BRERfQlJJREdFCisjZW5kaWYKKyNpZm5kZWYgU0lPQ0JSREVMQlIKKyMgZGVmaW5lIFNJT0NCUkRFTEJSIEJSQ1RMX0RFTF9CUklER0UKKyNlbmRpZgorI2lmbmRlZiBTSU9DQlJBRERJRgorIyBkZWZpbmUgU0lPQ0JSQURESUYgQlJDVExfQUREX0lGCisjZW5kaWYKKyNpZm5kZWYgU0lPQ0JSREVMSUYKKyMgZGVmaW5lIFNJT0NCUkRFTElGIEJSQ1RMX0RFTF9JRgorI2VuZGlmCisKKworLyogTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgc3VwcG9ydGVkIHBlciBicmlkZ2UgaW50ZXJmYWNlLiAgKi8KKyNpZm5kZWYgTUFYX1BPUlRTCisjIGRlZmluZSBNQVhfUE9SVFMgMzIKKyNlbmRpZgorCisvKiBVc2UgaW50ZXJuYWwgbnVtYmVyIHBhcnNpbmcgYW5kIG5vdCB0aGUgImV4YWN0IiBjb252ZXJzaW9uLiAgKi8KKy8qICNkZWZpbmUgQlJDVExfVVNFX0lOVEVSTkFMIDAgKi8gLyogdXNlIGV4YWN0IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQlJDVExfVVNFX0lOVEVSTkFMIDEKKworI2lmIEVOQUJMRV9GRUFUVVJFX0JSQ1RMX0ZBTkNZCisjIGluY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorCisvKiBGSVhNRTogVGhlc2UgNCBmdW5jcyBhcmUgbm90IHJlYWxseSBjbGVhbiBhbmQgY291bGQgYmUgaW1wcm92ZWQgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgc3RydG90aW1ldmFsKHN0cnVjdCB0aW1ldmFsICp0diwKKwkJY29uc3QgY2hhciAqdGltZV9zdHIpCit7CisJZG91YmxlIHNlY3M7CisjIGlmIEJSQ1RMX1VTRV9JTlRFUk5BTAorCWNoYXIgKmVuZHB0cjsKKwlzZWNzID0gLypiYl8qL3N0cnRvZCh0aW1lX3N0ciwgJmVuZHB0cik7CisJaWYgKGVuZHB0ciA9PSB0aW1lX3N0cikKKyMgZWxzZQorCWlmIChzc2NhbmYodGltZV9zdHIsICIlbGYiLCAmc2VjcykgIT0gMSkKKyMgZW5kaWYKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCB0aW1lX3N0ciwgInRpbWVzcGVjIik7CisJdHYtPnR2X3NlYyA9IHNlY3M7CisJdHYtPnR2X3VzZWMgPSAxMDAwMDAwICogKHNlY3MgLSB0di0+dHZfc2VjKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgbG9uZyB0dl90b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgamlmOworCisJamlmID0gMTAwMDAwMFVMTCAqIHR2LT50dl9zZWMgKyB0di0+dHZfdXNlYzsKKworCXJldHVybiBqaWYvMTAwMDA7Cit9CisjIGlmIDAKK3N0YXRpYyB2b2lkIGppZmZpZXNfdG9fdHYoc3RydWN0IHRpbWV2YWwgKnR2LCB1bnNpZ25lZCBsb25nIGppZmZpZXMpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHR2dXNlYzsKKworCXR2dXNlYyA9IDEwMDAwVUxMKmppZmZpZXM7CisJdHYtPnR2X3NlYyA9IHR2dXNlYy8xMDAwMDAwOworCXR2LT50dl91c2VjID0gdHZ1c2VjIC0gMTAwMDAwMCAqIHR2LT50dl9zZWM7Cit9CisjIGVuZGlmCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdHJfdG9famlmZmllcyhjb25zdCBjaGFyICp0aW1lX3N0cikKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ0b3RpbWV2YWwoJnR2LCB0aW1lX3N0cik7CisJcmV0dXJuIHR2X3RvX2ppZmZpZXMoJnR2KTsKK30KKworc3RhdGljIHZvaWQgYXJtX2lvY3RsKHVuc2lnbmVkIGxvbmcgKmFyZ3MsCisJCXVuc2lnbmVkIGxvbmcgYXJnMCwgdW5zaWduZWQgbG9uZyBhcmcxLCB1bnNpZ25lZCBsb25nIGFyZzIpCit7CisJYXJnc1swXSA9IGFyZzA7CisJYXJnc1sxXSA9IGFyZzE7CisJYXJnc1syXSA9IGFyZzI7CisJYXJnc1szXSA9IDA7Cit9CisjZW5kaWYKKworCitpbnQgYnJjdGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJyY3RsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJhZGRiclwwIiAiZGVsYnJcMCIgImFkZGlmXDAiICJkZWxpZlwwIgorCUlGX0ZFQVRVUkVfQlJDVExfRkFOQ1koCisJCSJzdHBcMCIKKwkJInNldGFnZWluZ1wwIiAic2V0ZmRcMCIgInNldGhlbGxvXDAiICJzZXRtYXhhZ2VcMCIKKwkJInNldHBhdGhjb3N0XDAiICJzZXRwb3J0cHJpb1wwIiAic2V0YnJpZGdlcHJpb1wwIgorCSkKKwlJRl9GRUFUVVJFX0JSQ1RMX1NIT1coInNob3dtYWNzXDAiICJzaG93XDAiKTsKKworCWVudW0geyBBUkdfYWRkYnIgPSAwLCBBUkdfZGVsYnIsIEFSR19hZGRpZiwgQVJHX2RlbGlmCisJCUlGX0ZFQVRVUkVfQlJDVExfRkFOQ1koLAorCQkgICBBUkdfc3RwLAorCQkgICBBUkdfc2V0YWdlaW5nLCBBUkdfc2V0ZmQsIEFSR19zZXRoZWxsbywgQVJHX3NldG1heGFnZSwKKwkJICAgQVJHX3NldHBhdGhjb3N0LCBBUkdfc2V0cG9ydHByaW8sIEFSR19zZXRicmlkZ2VwcmlvCisJCSkKKwkJSUZfRkVBVFVSRV9CUkNUTF9TSE9XKCwgQVJHX3Nob3dtYWNzLCBBUkdfc2hvdykKKwl9OworCisJaW50IGZkOworCXNtYWxsaW50IGtleTsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWNoYXIgKmJyLCAqYnJpZjsKKworCWFyZ3YrKzsKKwl3aGlsZSAoKmFyZ3YpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9CUkNUTF9GQU5DWQorCQlpbnQgaWZpZHhbTUFYX1BPUlRTXTsKKwkJdW5zaWduZWQgbG9uZyBhcmdzWzRdOworCQlpZnIuaWZyX2RhdGEgPSAoY2hhciAqKSAmYXJnczsKKyNlbmRpZgorCisJCWtleSA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJaWYgKGtleSA9PSAtMSkgLyogbm8gbWF0Y2ggZm91bmQgaW4ga2V5d29yZHMgYXJyYXksIGJhaWwgb3V0LiAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQlhcmd2Kys7CisJCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9CUkNUTF9TSE9XCisJCWlmIChrZXkgPT0gQVJHX3Nob3cpIHsgLyogc2hvdyAqLworCQkJY2hhciBicm5hbWVbSUZOQU1TSVpdOworCQkJaW50IGJyaWR4W01BWF9QT1JUU107CisJCQlpbnQgaSwgbnVtOworCQkJYXJtX2lvY3RsKGFyZ3MsIEJSQ1RMX0dFVF9CUklER0VTLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcpIGJyaWR4LCBNQVhfUE9SVFMpOworCQkJbnVtID0geGlvY3RsKGZkLCBTSU9DR0lGQlIsIGFyZ3MpOworCQkJcHJpbnRmKCJicmlkZ2UgbmFtZVx0YnJpZGdlIGlkXHRcdFNUUCBlbmFibGVkXHRpbnRlcmZhY2VzXG4iKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQkJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKwkJCQlpbnQgaiwgdGFiczsKKwkJCQlzdHJ1Y3QgX19icmlkZ2VfaW5mbyBiaTsKKwkJCQl1bnNpZ25lZCBjaGFyICp4OworCisJCQkJaWYgKCFpZl9pbmRleHRvbmFtZShicmlkeFtpXSwgYnJuYW1lKSkKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgYnJpZGdlIG5hbWUgZm9yIGluZGV4ICVkIiwgaSk7CisJCQkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGJybmFtZSk7CisKKwkJCQlhcm1faW9jdGwoYXJncywgQlJDVExfR0VUX0JSSURHRV9JTkZPLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nKSAmYmksIDApOworCQkJCXhpb2N0bChmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpOworCQkJCXByaW50ZigiJXNcdFx0IiwgYnJuYW1lKTsKKworCQkJCS8qIHByaW50IGJyaWRnZSBpZCAqLworCQkJCXggPSAodW5zaWduZWQgY2hhciAqKSAmYmkuYnJpZGdlX2lkOworCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQkJcHJpbnRmKCIlLjJ4IiwgeFtqXSk7CisJCQkJCWlmIChqID09IDEpCisJCQkJCQliYl9wdXRjaGFyKCcuJyk7CisJCQkJfQorCQkJCXByaW50ZihiaS5zdHBfZW5hYmxlZCA/ICJcdHllcyIgOiAiXHRubyIpOworCisJCQkJLyogcHJpbnQgaW50ZXJmYWNlIGxpc3QgKi8KKwkJCQlhcm1faW9jdGwoYXJncywgQlJDVExfR0VUX1BPUlRfTElTVCwKKwkJCQkJCQkodW5zaWduZWQgbG9uZykgaWZpZHgsIE1BWF9QT1JUUyk7CisJCQkJeGlvY3RsKGZkLCBTSU9DREVWUFJJVkFURSwgJmlmcik7CisJCQkJdGFicyA9IDA7CisJCQkJZm9yIChqID0gMDsgaiA8IE1BWF9QT1JUUzsgaisrKSB7CisJCQkJCWlmICghaWZpZHhbal0pCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKCFpZl9pbmRleHRvbmFtZShpZmlkeFtqXSwgaWZuYW1lKSkKKwkJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IGludGVyZmFjZSBuYW1lIGZvciBpbmRleCAlZCIsIGopOworCQkJCQlpZiAodGFicykKKwkJCQkJCXByaW50ZigiXHRcdFx0XHRcdCIpOworCQkJCQllbHNlCisJCQkJCQl0YWJzID0gMTsKKwkJCQkJcHJpbnRmKCJcdFx0JXNcbiIsIGlmbmFtZSk7CisJCQkJfQorCQkJCWlmICghdGFicykgIC8qIGJyaWRnZSBoYXMgbm8gaW50ZXJmYWNlcyAqLworCQkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJfQorCQkJZ290byBkb25lOworCQl9CisjZW5kaWYKKworCQlpZiAoISphcmd2KSAvKiBhbGwgYnV0ICdzaG93JyBuZWVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudCAqLworCQkJYmJfc2hvd191c2FnZSgpOworCisJCWJyID0gKmFyZ3YrKzsKKworCQlpZiAoa2V5ID09IEFSR19hZGRiciB8fCBrZXkgPT0gQVJHX2RlbGJyKSB7IC8qIGFkZGJyIG9yIGRlbGJyICovCisJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShmZCwKKwkJCQkJa2V5ID09IEFSR19hZGRiciA/IFNJT0NCUkFEREJSIDogU0lPQ0JSREVMQlIsCisJCQkJCWJyLCAiYnJpZGdlICVzIiwgYnIpOworCQkJZ290byBkb25lOworCQl9CisKKwkJaWYgKCEqYXJndikgLyogYWxsIGJ1dCAnYWRkYnIvZGVsYnInIG5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyAqLworCQkJYmJfc2hvd191c2FnZSgpOworCisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBicik7CisJCWlmIChrZXkgPT0gQVJHX2FkZGlmIHx8IGtleSA9PSBBUkdfZGVsaWYpIHsgLyogYWRkaWYgb3IgZGVsaWYgKi8KKwkJCWJyaWYgPSAqYXJndjsKKwkJCWlmci5pZnJfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGJyaWYpOworCQkJaWYgKCFpZnIuaWZyX2lmaW5kZXgpIHsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImlmYWNlICVzIiwgYnJpZik7CisJCQl9CisJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShmZCwKKwkJCQkJa2V5ID09IEFSR19hZGRpZiA/IFNJT0NCUkFERElGIDogU0lPQ0JSREVMSUYsCisJCQkJCSZpZnIsICJicmlkZ2UgJXMiLCBicik7CisJCQlnb3RvIGRvbmVfbmV4dF9hcmd2OworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfQlJDVExfRkFOQ1kKKwkJaWYgKGtleSA9PSBBUkdfc3RwKSB7IC8qIHN0cCAqLworCQkJc3RhdGljIGNvbnN0IGNoYXIgbm9feWVzW10gQUxJR04xID0KKwkJCQkiMFwwIiAib2ZmXDAiICJuXDAiICJub1wwIiAgIC8qIDAgLi4gMyAqLworCQkJCSIxXDAiICJvblwwIiAgInlcMCIgInllc1wwIjsgLyogNCAuLiA3ICovCisJCQlpbnQgb25vZmYgPSBpbmRleF9pbl9zdHJpbmdzKG5vX3llcywgKmFyZ3YpOworCQkJaWYgKG9ub2ZmIDwgMCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsICphcmd2LCBhcHBsZXRfbmFtZSk7CisJCQlvbm9mZiA9ICh1bnNpZ25lZClvbm9mZiAvIDQ7CisJCQlhcm1faW9jdGwoYXJncywgQlJDVExfU0VUX0JSSURHRV9TVFBfU1RBVEUsIG9ub2ZmLCAwKTsKKwkJCWdvdG8gZmlyZTsKKwkJfQorCQlpZiAoKHVuc2lnbmVkKShrZXkgLSBBUkdfc2V0YWdlaW5nKSA8IDQpIHsgLyogdGltZSByZWxhdGVkIG9wcyAqLworCQkJc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3BzW10gQUxJR04xID0geworCQkJCUJSQ1RMX1NFVF9BR0VJTkdfVElNRSwgICAgICAgICAgLyogQVJHX3NldGFnZWluZyAqLworCQkJCUJSQ1RMX1NFVF9CUklER0VfRk9SV0FSRF9ERUxBWSwgLyogQVJHX3NldGZkICAgICAqLworCQkJCUJSQ1RMX1NFVF9CUklER0VfSEVMTE9fVElNRSwgICAgLyogQVJHX3NldGhlbGxvICAqLworCQkJCUJSQ1RMX1NFVF9CUklER0VfTUFYX0FHRSAgICAgICAgLyogQVJHX3NldG1heGFnZSAqLworCQkJfTsKKwkJCWFybV9pb2N0bChhcmdzLCBvcHNba2V5IC0gQVJHX3NldGFnZWluZ10sIHN0cl90b19qaWZmaWVzKCphcmd2KSwgMCk7CisJCQlnb3RvIGZpcmU7CisJCX0KKwkJaWYgKGtleSA9PSBBUkdfc2V0cGF0aGNvc3QKKwkJIHx8IGtleSA9PSBBUkdfc2V0cG9ydHByaW8KKwkJIHx8IGtleSA9PSBBUkdfc2V0YnJpZGdlcHJpbworCQkpIHsKKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IG9wc1tdIEFMSUdOMSA9IHsKKwkJCQlCUkNUTF9TRVRfUEFUSF9DT1NULCAgICAgIC8qIEFSR19zZXRwYXRoY29zdCAgICovCisJCQkJQlJDVExfU0VUX1BPUlRfUFJJT1JJVFksICAvKiBBUkdfc2V0cG9ydHByaW8gICAqLworCQkJCUJSQ1RMX1NFVF9CUklER0VfUFJJT1JJVFkgLyogQVJHX3NldGJyaWRnZXByaW8gKi8KKwkJCX07CisJCQlpbnQgcG9ydCA9IC0xOworCQkJdW5zaWduZWQgYXJnMSwgYXJnMjsKKworCQkJaWYgKGtleSAhPSBBUkdfc2V0YnJpZGdlcHJpbykgeworCQkJCS8qIGdldCBwb3J0bnVtICovCisJCQkJdW5zaWduZWQgaTsKKworCQkJCXBvcnQgPSBpZl9uYW1ldG9pbmRleCgqYXJndisrKTsKKwkJCQlpZiAoIXBvcnQpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgKmFyZ3YsICJwb3J0Iik7CisJCQkJbWVtc2V0KGlmaWR4LCAwLCBzaXplb2YgaWZpZHgpOworCQkJCWFybV9pb2N0bChhcmdzLCBCUkNUTF9HRVRfUE9SVF9MSVNULCAodW5zaWduZWQgbG9uZylpZmlkeCwKKwkJCQkJCSAgTUFYX1BPUlRTKTsKKwkJCQl4aW9jdGwoZmQsIFNJT0NERVZQUklWQVRFLCAmaWZyKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BPUlRTOyBpKyspIHsKKwkJCQkJaWYgKGlmaWR4W2ldID09IHBvcnQpIHsKKwkJCQkJCXBvcnQgPSBpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlhcmcxID0gcG9ydDsKKwkJCWFyZzIgPSB4YXRvaV9wb3NpdGl2ZSgqYXJndik7CisJCQlpZiAoa2V5ID09IEFSR19zZXRicmlkZ2VwcmlvKSB7CisJCQkJYXJnMSA9IGFyZzI7CisJCQkJYXJnMiA9IDA7CisJCQl9CisJCQlhcm1faW9jdGwoYXJncywgb3BzW2tleSAtIEFSR19zZXRwYXRoY29zdF0sIGFyZzEsIGFyZzIpOworCQl9CisgZmlyZToKKwkJLyogRXhlY3V0ZSB0aGUgcHJldmlvdXNseSBzZXQgY29tbWFuZCAqLworCQl4aW9jdGwoZmQsIFNJT0NERVZQUklWQVRFLCAmaWZyKTsKKyNlbmRpZgorIGRvbmVfbmV4dF9hcmd2OgorCQlhcmd2Kys7CisgZG9uZToKKwkJY2xvc2UoZmQpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2Ruc2QuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvZG5zZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTg0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2Ruc2QuYwpAQCAtMCwwICsxLDU1OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBETlMgc2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJvYmVydG8gQS4gRm9nbGlldHRhIChtZUByb2JlcnRvLmZvZ2xpZXR0YS5uYW1lKQorICogQ29weXJpZ2h0IChDKSAyMDA1IE9kZCBBcmlsZCBPbHNlbiAob2FvIGF0IGZpYnVsYSBkb3Qgbm8pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUGF1bCBTaGVlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT2RkIEFyaWxkIE9sc2VuIHN0YXJ0ZWQgb3V0IHdpdGggdGhlIHNoZWVyZG5zIFsxXSBvZiBQYXVsIFNoZWVyIGFuZCByZXdyb3RlCisgKiBpdCBpbnRvIGEgc2hhcGUgd2hpY2ggSSBiZWxpZXZlIGlzIGJvdGggZWFzaWVyIHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLgorICogSSBhbHNvIHJldXNlZCB0aGUgaW5wdXQgYnVmZmVyIGZvciBvdXRwdXQgYW5kIHJlbW92ZWQgc2VydmljZXMgaGUgZGlkIG5vdAorICogbmVlZC4gIFsxXSBodHRwOi8vdGhyZWFkaW5nLjIwMzhidWcuY29tL3NoZWVyZG5zLworICoKKyAqIFNvbWUgYnVnZml4IGFuZCBtaW5vciBjaGFuZ2VzIHdhcyBhcHBsaWVkIGJ5IFJvYmVydG8gQS4gRm9nbGlldHRhIHdobyBtYWRlCisgKiB0aGUgZmlyc3QgcG9ydGluZyBvZiBvYW8nIHNjZG5zIHRvIGJ1c3lib3ggYWxzby4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZG5zZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kdnNdIFstYyBDT05GRklMRV0gWy10IFRUTF9TRUNdIFstcCBQT1JUXSBbLWkgQUREUl0iCisvL3VzYWdlOiNkZWZpbmUgZG5zZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNtYWxsIHN0YXRpYyBETlMgc2VydmVyIGRhZW1vblxuIgorLy91c2FnZTogICAgICJcbgktYyBGSUxFCUNvbmZpZyBmaWxlIgorLy91c2FnZTogICAgICJcbgktdCBTRUMJVFRMIgorLy91c2FnZTogICAgICJcbgktcCBQT1JUCUxpc3RlbiBvbiBQT1JUIgorLy91c2FnZTogICAgICJcbgktaSBBRERSCUxpc3RlbiBvbiBBRERSIgorLy91c2FnZTogICAgICJcbgktZAlEYWVtb25pemUiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1zCVNlbmQgc3VjY2Vzc2Z1bCByZXBsaWVzIG9ubHkuIFVzZSB0aGlzIGlmIHlvdSB3YW50IgorLy91c2FnZTogICAgICJcbgkJdG8gdXNlIC9ldGMvcmVzb2x2LmNvbmYgd2l0aCB0d28gbmFtZXNlcnZlciBsaW5lczoiCisvL3VzYWdlOiAgICAgIlxuCQkJbmFtZXNlcnZlciBETlNEX1NFUlZFUiIKKy8vdXNhZ2U6ICAgICAiXG4JCQluYW1lc2VydmVyIE5PUk1BTF9ETlNfU0VSVkVSIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworLy8jZGVmaW5lIERFQlVHIDEKKyNkZWZpbmUgREVCVUcgMAorCitlbnVtIHsKKwkvKiBjYW4gdHdlYWsgdGhpcyAqLworCURFRkFVTFRfVFRMID0gMTIwLAorCisJLyogY2Fubm90IGdldCBiaWdnZXIgcGFja2V0cyB0aGFuIDUxMiBwZXIgUkZDMTAzNS4gKi8KKwlNQVhfUEFDS19MRU4gPSA1MTIsCisJSVBfU1RSSU5HX0xFTiA9IHNpemVvZigiLnh4eC54eHgueHh4Lnh4eCIpLAorCU1BWF9OQU1FX0xFTiA9IElQX1NUUklOR19MRU4gLSAxICsgc2l6ZW9mKCIuaW4tYWRkci5hcnBhIiksCisJUkVRX0EgPSAxLAorCVJFUV9QVFIgPSAxMiwKK307CisKKy8qIHRoZSBtZXNzYWdlIGZyb20gY2xpZW50IGFuZCBmaXJzdCBwYXJ0IG9mIHJlc3BvbnNlIG1zZyAqLworc3RydWN0IGRuc19oZWFkIHsKKwl1aW50MTZfdCBpZDsKKwl1aW50MTZfdCBmbGFnczsKKwl1aW50MTZfdCBucXVlcjsKKwl1aW50MTZfdCBuYW5zdzsKKwl1aW50MTZfdCBuYXV0aDsKKwl1aW50MTZfdCBuYWRkOworfTsKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIGFjY2VzcyB0eXBlIGFuZCBjbGFzcyBmaWVsZHMuCisgKiBUaGV5IGFyZSB0b3RhbGx5IHVuYWxpZ25lZCwgYnV0IGdjYyA0LjMuNCB0aGlua3MgdGhhdCBwb2ludGVyIG9mIHR5cGUgdWludDE2X3QqCisgKiBpcyAxNi1iaXQgYWxpZ25lZCBhbmQgcmVwbGFjZXMgMTYtYml0IG1lbWNweSAoaW4gbW92ZV9mcm9tX3VuYWxpZ25lZDE2IG1hY3JvKQorICogd2l0aCBhbGlnbmVkIGhhbGZ3b3JkIGFjY2VzcyBvbiBhcm05MjB0IQorICogT2ggd2VsbC4gU2xhcHBpbmcgUEFDS0VEIGV2ZXJ5d2hlcmUgc2VlbXMgdG8gaGVscDogKi8KK3N0cnVjdCB0eXBlX2FuZF9jbGFzcyB7CisJdWludDE2X3QgdHlwZSBQQUNLRUQ7CisJdWludDE2X3QgY2xhc3MgUEFDS0VEOworfSBQQUNLRUQ7CisvKiBlbGVtZW50IG9mIGtub3duIG5hbWUsIGlwIGFkZHJlc3MgYW5kIHJldmVyc2VkIGlwIGFkZHJlc3MgKi8KK3N0cnVjdCBkbnNfZW50cnkgeworCXN0cnVjdCBkbnNfZW50cnkgKm5leHQ7CisJdWludDMyX3QgaXA7CisJY2hhciByaXBbSVBfU1RSSU5HX0xFTl07IC8qIGxlbmd0aCBkZWNpbWFsIHJldmVyc2VkIElQICovCisJY2hhciBuYW1lWzFdOworfTsKKworI2RlZmluZSBPUFRfdmVyYm9zZSAob3B0aW9uX21hc2szMiAmIDEpCisjZGVmaW5lIE9QVF9zaWxlbnQgIChvcHRpb25fbWFzazMyICYgMikKKworCisvKgorICogSW5zZXJ0IGxlbmd0aCBvZiBzdWJzdHJpbmdzIGluc3RlYWQgb2YgZG90cworICovCitzdGF0aWMgdm9pZCB1bmRvdChjaGFyICpyaXApCit7CisJaW50IGkgPSAwOworCWludCBzID0gMDsKKworCXdoaWxlIChyaXBbaV0pCisJCWkrKzsKKwlmb3IgKC0taTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHJpcFtpXSA9PSAnLicpIHsKKwkJCXJpcFtpXSA9IHM7CisJCQlzID0gMDsKKwkJfSBlbHNlIHsKKwkJCXMrKzsKKwkJfQorCX0KK30KKworLyoKKyAqIFJlYWQgaG9zdG5hbWUvSVAgcmVjb3JkcyBmcm9tIGZpbGUKKyAqLworc3RhdGljIHN0cnVjdCBkbnNfZW50cnkgKnBhcnNlX2NvbmZfZmlsZShjb25zdCBjaGFyICpmaWxlY29uZikKK3sKKwljaGFyICp0b2tlblsyXTsKKwlwYXJzZXJfdCAqcGFyc2VyOworCXN0cnVjdCBkbnNfZW50cnkgKm0sICpjb25mX2RhdGE7CisJc3RydWN0IGRuc19lbnRyeSAqKm5leHRwOworCisJY29uZl9kYXRhID0gTlVMTDsKKwluZXh0cCA9ICZjb25mX2RhdGE7CisKKwlwYXJzZXIgPSBjb25maWdfb3BlbihmaWxlY29uZik7CisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDIsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlzdHJ1Y3QgaW5fYWRkciBpcDsKKwkJdWludDMyX3QgdjMyOworCisJCWlmIChpbmV0X2F0b24odG9rZW5bMV0sICZpcCkgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJlcnJvciBhdCBsaW5lICV1LCBza2lwcGluZyIsIHBhcnNlci0+bGluZW5vKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKE9QVF92ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKCJuYW1lOiVzLCBpcDolcyIsIHRva2VuWzBdLCB0b2tlblsxXSk7CisKKwkJLyogc2l6ZW9mKCptKSBpbmNsdWRlcyAxIGJ5dGUgZm9yIG0tPm5hbWVbMF0gKi8KKwkJbSA9IHh6YWxsb2Moc2l6ZW9mKCptKSArIHN0cmxlbih0b2tlblswXSkgKyAxKTsKKwkJLyptLT5uZXh0ID0gTlVMTDsqLworCQkqbmV4dHAgPSBtOworCQluZXh0cCA9ICZtLT5uZXh0OworCisJCW0tPm5hbWVbMF0gPSAnLic7CisJCXN0cmNweShtLT5uYW1lICsgMSwgdG9rZW5bMF0pOworCQl1bmRvdChtLT5uYW1lKTsKKwkJbS0+aXAgPSBpcC5zX2FkZHI7IC8qIGluIG5ldHdvcmsgb3JkZXIgKi8KKwkJdjMyID0gbnRvaGwobS0+aXApOworCQkvKiBpbnZlcnRlZCBvcmRlciAqLworCQlzcHJpbnRmKG0tPnJpcCwgIi4ldS4ldS4ldS4ldSIsCisJCQkodWludDhfdCkodjMyKSwKKwkJCSh1aW50OF90KSh2MzIgPj4gOCksCisJCQkodWludDhfdCkodjMyID4+IDE2KSwKKwkJCSh2MzIgPj4gMjQpCisJCSk7CisJCXVuZG90KG0tPnJpcCk7CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCXJldHVybiBjb25mX2RhdGE7Cit9CisKKy8qCisgKiBMb29rIHF1ZXJ5IHVwIGluIGRucyByZWNvcmRzIGFuZCByZXR1cm4gYW5zd2VyIGlmIGZvdW5kLgorICovCitzdGF0aWMgY2hhciAqdGFibGVfbG9va3VwKHN0cnVjdCBkbnNfZW50cnkgKmQsCisJCXVpbnQxNl90IHR5cGUsCisJCWNoYXIqIHF1ZXJ5X3N0cmluZykKK3sKKwl3aGlsZSAoZCkgeworCQl1bnNpZ25lZCBsZW4gPSBkLT5uYW1lWzBdOworCQkvKiBkLT5uYW1lW2xlbl0gaXMgdGhlIGxhc3QgKG5vbiBOVUwpIGNoYXIgKi8KKyNpZiBERUJVRworCQljaGFyICpwLCAqcTsKKwkJcSA9IHF1ZXJ5X3N0cmluZyArIDE7CisJCXAgPSBkLT5uYW1lICsgMTsKKwkJZnByaW50ZihzdGRlcnIsICIlZC8lZCBwOiVzIHE6JXMgJWRcbiIsCisJCQkoaW50KXN0cmxlbihwKSwgbGVuLAorCQkJcCwgcSwgKGludClzdHJsZW4ocSkKKwkJKTsKKyNlbmRpZgorCQlpZiAodHlwZSA9PSBodG9ucyhSRVFfQSkpIHsKKwkJCS8qIHNlYXJjaCBieSBob3N0IG5hbWUgKi8KKwkJCWlmIChsZW4gIT0gMSB8fCBkLT5uYW1lWzFdICE9ICcqJykgeworLyogd2UgYXJlIGxheCwgaG9wZSBubyBuYW1lIGNvbXBvbmVudCBpcyBldmVyID42NCBzbyB0aGF0IGxlbmd0aAorICogKHdoaWNoIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgJ0EnLCdCJy4uLikgbWF0Y2hlcyBhIGxvd2VyY2FzZSBsZXR0ZXIuCisgKiBBY3R1YWxseSwgSSB0aGluayBmYWxzZSBtYXRjaGVzIGFyZSBoYXJkIHRvIGNvbnN0cnVjdC4KKyAqIEV4YW1wbGUuCisgKiBbMzFdIGxlbiBpcyByZXByZXNlbnRlZCBhcyAnMScsIFs2NV0gYXMgJ0EnLCBbNjUrMzJdIGFzICdhJy4KKyAqIFs2NV0gICA8NjUgc2FtZSBjaGFycz5bMzFdPDMxIHNhbWUgY2hhcnM+TlVMCisgKiBbNjUrMzJdPDY1IHNhbWUgY2hhcnM+MSAgIDwzMSBzYW1lIGNoYXJzPk5VTAorICogVGhpcyBleGFtcGxlIHNlZW1zIHRvIGJlIHRoZSBtaW5pbWFsIGNhc2Ugd2hlbiBmYWxzZSBtYXRjaCBvY2N1cnMuCisgKi8KKwkJCQlpZiAoc3RyY2FzZWNtcChkLT5uYW1lLCBxdWVyeV9zdHJpbmcpICE9IDApCisJCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCXJldHVybiAoY2hhciAqKSZkLT5pcDsKKyNpZiBERUJVRworCQkJZnByaW50ZihzdGRlcnIsICJGb3VuZCBJUDoleFxuIiwgKGludClkLT5pcCk7CisjZW5kaWYKKwkJCXJldHVybiAwOworCQl9CisJCS8qIHNlYXJjaCBieSBJUC1hZGRyZXNzICovCisJCWlmICgobGVuICE9IDEgfHwgZC0+bmFtZVsxXSAhPSAnKicpCisJCS8qIHdlIGFzc3VtZSAoZG8gbm90IGNoZWNrKSB0aGF0IHF1ZXJ5X3N0cmluZworCQkgKiBlbmRzIGluICIuaW4tYWRkci5hcnBhIiAqLworCQkgJiYgc3RybmNtcChkLT5yaXAsIHF1ZXJ5X3N0cmluZywgc3RybGVuKGQtPnJpcCkpID09IDAKKwkJKSB7CisjaWYgREVCVUcKKwkJCWZwcmludGYoc3RkZXJyLCAiRm91bmQgbmFtZTolc1xuIiwgZC0+bmFtZSk7CisjZW5kaWYKKwkJCXJldHVybiBkLT5uYW1lOworCQl9CisgbmV4dDoKKwkJZCA9IGQtPm5leHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBEZWNvZGUgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgYW5zd2VyCisgKi8KKy8qIFJGQyAxMDM1CisuLi4KK1doZW5ldmVyIGFuIG9jdGV0IHJlcHJlc2VudHMgYSBudW1lcmljIHF1YW50aXR5LCB0aGUgbGVmdCBtb3N0IGJpdAoraW4gdGhlIGRpYWdyYW0gaXMgdGhlIGhpZ2ggb3JkZXIgb3IgbW9zdCBzaWduaWZpY2FudCBiaXQuCitUaGF0IGlzLCB0aGUgYml0IGxhYmVsZWQgMCBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuCisuLi4KKworNC4xLjEuIEhlYWRlciBzZWN0aW9uIGZvcm1hdAorICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNQorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHxRUnwgICBPUENPREUgIHxBQXxUQ3xSRHxSQXwgMCAgMCAgMHwgICBSQ09ERSAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgUURDT1VOVCAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICBBTkNPVU5UICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgIE5TQ09VTlQgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgQVJDT1VOVCAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKK0lEICAgICAgMTYgYml0IHJhbmRvbSBpZGVudGlmaWVyIGFzc2lnbmVkIGJ5IHF1ZXJ5aW5nIHBlZXIuCisgICAgICAgIFVzZWQgdG8gbWF0Y2ggcXVlcnkvcmVzcG9uc2UuCitRUiAgICAgIG1lc3NhZ2UgaXMgYSBxdWVyeSAoMCksIG9yIGEgcmVzcG9uc2UgKDEpLgorT1BDT0RFICAwICAgc3RhbmRhcmQgcXVlcnkgKFFVRVJZKQorICAgICAgICAxICAgaW52ZXJzZSBxdWVyeSAoSVFVRVJZKQorICAgICAgICAyICAgc2VydmVyIHN0YXR1cyByZXF1ZXN0IChTVEFUVVMpCitBQSAgICAgIEF1dGhvcml0YXRpdmUgQW5zd2VyIC0gdGhpcyBiaXQgaXMgdmFsaWQgaW4gcmVzcG9uc2VzLgorICAgICAgICBSZXNwb25kaW5nIG5hbWUgc2VydmVyIGlzIGFuIGF1dGhvcml0eSBmb3IgdGhlIGRvbWFpbiBuYW1lCisgICAgICAgIGluIHF1ZXN0aW9uIHNlY3Rpb24uIEFuc3dlciBzZWN0aW9uIG1heSBoYXZlIG11bHRpcGxlIG93bmVyIG5hbWVzCisgICAgICAgIGJlY2F1c2Ugb2YgYWxpYXNlcy4gIFRoZSBBQSBiaXQgY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgd2hpY2ggbWF0Y2hlcworICAgICAgICB0aGUgcXVlcnkgbmFtZSwgb3IgdGhlIGZpcnN0IG93bmVyIG5hbWUgaW4gdGhlIGFuc3dlciBzZWN0aW9uLgorVEMgICAgICBUcnVuQ2F0aW9uIC0gdGhpcyBtZXNzYWdlIHdhcyB0cnVuY2F0ZWQuCitSRCAgICAgIFJlY3Vyc2lvbiBEZXNpcmVkIC0gdGhpcyBiaXQgbWF5IGJlIHNldCBpbiBhIHF1ZXJ5IGFuZAorICAgICAgICBpcyBjb3BpZWQgaW50byB0aGUgcmVzcG9uc2UuICBJZiBSRCBpcyBzZXQsIGl0IGRpcmVjdHMKKyAgICAgICAgdGhlIG5hbWUgc2VydmVyIHRvIHB1cnN1ZSB0aGUgcXVlcnkgcmVjdXJzaXZlbHkuCisgICAgICAgIFJlY3Vyc2l2ZSBxdWVyeSBzdXBwb3J0IGlzIG9wdGlvbmFsLgorUkEgICAgICBSZWN1cnNpb24gQXZhaWxhYmxlIC0gdGhpcyBiZSBpcyBzZXQgb3IgY2xlYXJlZCBpbiBhCisgICAgICAgIHJlc3BvbnNlLCBhbmQgZGVub3RlcyB3aGV0aGVyIHJlY3Vyc2l2ZSBxdWVyeSBzdXBwb3J0IGlzCisgICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgbmFtZSBzZXJ2ZXIuCitSQ09ERSAgIFJlc3BvbnNlIGNvZGUuCisgICAgICAgIDAgICBObyBlcnJvciBjb25kaXRpb24KKyAgICAgICAgMSAgIEZvcm1hdCBlcnJvcgorICAgICAgICAyICAgU2VydmVyIGZhaWx1cmUgLSBzZXJ2ZXIgd2FzIHVuYWJsZSB0byBwcm9jZXNzIHRoZSBxdWVyeQorICAgICAgICAgICAgZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHRoZSBuYW1lIHNlcnZlci4KKyAgICAgICAgMyAgIE5hbWUgRXJyb3IgLSBtZWFuaW5nZnVsIG9ubHkgZm9yIHJlc3BvbnNlcyBmcm9tCisgICAgICAgICAgICBhbiBhdXRob3JpdGF0aXZlIG5hbWUgc2VydmVyLiBUaGUgcmVmZXJlbmNlZCBkb21haW4gbmFtZQorICAgICAgICAgICAgZG9lcyBub3QgZXhpc3QuCisgICAgICAgIDQgICBOb3QgSW1wbGVtZW50ZWQuCisgICAgICAgIDUgICBSZWZ1c2VkLgorUURDT1VOVCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcXVlc3Rpb24gc2VjdGlvbi4KK0FOQ09VTlQgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGFuc3dlciBzZWN0aW9uLgorTlNDT1VOVCBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgYXV0aG9yaXR5IHJlY29yZHMgc2VjdGlvbi4KK0FSQ09VTlQgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGFkZGl0aW9uYWwgcmVjb3JkcyBzZWN0aW9uLgorCis0LjEuMi4gUXVlc3Rpb24gc2VjdGlvbiBmb3JtYXQKKworVGhlIHNlY3Rpb24gY29udGFpbnMgUURDT1VOVCAodXN1YWxseSAxKSBlbnRyaWVzLCBlYWNoIG9mIHRoaXMgZm9ybWF0OgorICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNQorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICAvICAgICAgICAgICAgICAgICAgICAgUU5BTUUgICAgICAgICAgICAgICAgICAgICAvCisgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgUVRZUEUgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICBRQ0xBU1MgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCitRTkFNRSAgIGEgZG9tYWluIG5hbWUgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSBvZiBsYWJlbHMsIHdoZXJlCisgICAgICAgIGVhY2ggbGFiZWwgY29uc2lzdHMgb2YgYSBsZW5ndGggb2N0ZXQgZm9sbG93ZWQgYnkgdGhhdAorICAgICAgICBudW1iZXIgb2Ygb2N0ZXRzLiBUaGUgZG9tYWluIG5hbWUgdGVybWluYXRlcyB3aXRoIHRoZQorICAgICAgICB6ZXJvIGxlbmd0aCBvY3RldCBmb3IgdGhlIG51bGwgbGFiZWwgb2YgdGhlIHJvb3QuIE5vdGUKKyAgICAgICAgdGhhdCB0aGlzIGZpZWxkIG1heSBiZSBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0czsgbm8KKyAgICAgICAgcGFkZGluZyBpcyB1c2VkLgorUVRZUEUgICBhIHR3byBvY3RldCB0eXBlIG9mIHRoZSBxdWVyeS4KKyAgICAgICAgICAxIGEgaG9zdCBhZGRyZXNzIFtSRVFfQSBjb25zdF0KKyAgICAgICAgICAyIGFuIGF1dGhvcml0YXRpdmUgbmFtZSBzZXJ2ZXIKKyAgICAgICAgICAzIGEgbWFpbCBkZXN0aW5hdGlvbiAoT2Jzb2xldGUgLSB1c2UgTVgpCisgICAgICAgICAgNCBhIG1haWwgZm9yd2FyZGVyIChPYnNvbGV0ZSAtIHVzZSBNWCkKKyAgICAgICAgICA1IHRoZSBjYW5vbmljYWwgbmFtZSBmb3IgYW4gYWxpYXMKKyAgICAgICAgICA2IG1hcmtzIHRoZSBzdGFydCBvZiBhIHpvbmUgb2YgYXV0aG9yaXR5CisgICAgICAgICAgNyBhIG1haWxib3ggZG9tYWluIG5hbWUgKEVYUEVSSU1FTlRBTCkKKyAgICAgICAgICA4IGEgbWFpbCBncm91cCBtZW1iZXIgKEVYUEVSSU1FTlRBTCkKKyAgICAgICAgICA5IGEgbWFpbCByZW5hbWUgZG9tYWluIG5hbWUgKEVYUEVSSU1FTlRBTCkKKyAgICAgICAgIDEwIGEgbnVsbCBSUiAoRVhQRVJJTUVOVEFMKQorICAgICAgICAgMTEgYSB3ZWxsIGtub3duIHNlcnZpY2UgZGVzY3JpcHRpb24KKyAgICAgICAgIDEyIGEgZG9tYWluIG5hbWUgcG9pbnRlciBbUkVRX1BUUiBjb25zdF0KKyAgICAgICAgIDEzIGhvc3QgaW5mb3JtYXRpb24KKyAgICAgICAgIDE0IG1haWxib3ggb3IgbWFpbCBsaXN0IGluZm9ybWF0aW9uCisgICAgICAgICAxNSBtYWlsIGV4Y2hhbmdlCisgICAgICAgICAxNiB0ZXh0IHN0cmluZ3MKKyAgICAgICAweDFjIElQdjY/CisgICAgICAgIDI1MiBhIHJlcXVlc3QgZm9yIGEgdHJhbnNmZXIgb2YgYW4gZW50aXJlIHpvbmUKKyAgICAgICAgMjUzIGEgcmVxdWVzdCBmb3IgbWFpbGJveC1yZWxhdGVkIHJlY29yZHMgKE1CLCBNRyBvciBNUikKKyAgICAgICAgMjU0IGEgcmVxdWVzdCBmb3IgbWFpbCBhZ2VudCBSUnMgKE9ic29sZXRlIC0gc2VlIE1YKQorICAgICAgICAyNTUgYSByZXF1ZXN0IGZvciBhbGwgcmVjb3JkcworUUNMQVNTICBhIHR3byBvY3RldCBjb2RlIHRoYXQgc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiB0aGUgcXVlcnkuCisgICAgICAgICAgMSB0aGUgSW50ZXJuZXQKKyAgICAgICAgKG90aGVycyBhcmUgaGlzdG9yaWMgb25seSkKKyAgICAgICAgMjU1IGFueSBjbGFzcworCis0LjEuMy4gUmVzb3VyY2UgUmVjb3JkIGZvcm1hdAorCitUaGUgYW5zd2VyLCBhdXRob3JpdHksIGFuZCBhZGRpdGlvbmFsIHNlY3Rpb25zIGFsbCBzaGFyZSB0aGUgc2FtZSBmb3JtYXQ6CithIHZhcmlhYmxlIG51bWJlciBvZiByZXNvdXJjZSByZWNvcmRzLCB3aGVyZSB0aGUgbnVtYmVyIG9mIHJlY29yZHMKK2lzIHNwZWNpZmllZCBpbiB0aGUgY29ycmVzcG9uZGluZyBjb3VudCBmaWVsZCBpbiB0aGUgaGVhZGVyLgorRWFjaCByZXNvdXJjZSByZWNvcmQgaGFzIHRoaXMgZm9ybWF0OgorICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNQorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgLyAgICAgICAgICAgICAgICAgICAgICBOQU1FICAgICAgICAgICAgICAgICAgICAgLworICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICBDTEFTUyAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBUVEwgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICBSRExFTkdUSCAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLXwKKyAgICAvICAgICAgICAgICAgICAgICAgICAgUkRBVEEgICAgICAgICAgICAgICAgICAgICAvCisgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKK05BTUUgICAgYSBkb21haW4gbmFtZSB0byB3aGljaCB0aGlzIHJlc291cmNlIHJlY29yZCBwZXJ0YWlucy4KK1RZUEUgICAgdHdvIG9jdGV0cyBjb250YWluaW5nIG9uZSBvZiB0aGUgUlIgdHlwZSBjb2Rlcy4gIFRoaXMKKyAgICAgICAgZmllbGQgc3BlY2lmaWVzIHRoZSBtZWFuaW5nIG9mIHRoZSBkYXRhIGluIHRoZSBSREFUQSBmaWVsZC4KK0NMQVNTICAgdHdvIG9jdGV0cyB3aGljaCBzcGVjaWZ5IHRoZSBjbGFzcyBvZiB0aGUgZGF0YSBpbiB0aGUgUkRBVEEgZmllbGQuCitUVEwgICAgIGEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHRpbWUgaW50ZXJ2YWwKKyAgICAgICAgKGluIHNlY29uZHMpIHRoYXQgdGhlIHJlY29yZCBtYXkgYmUgY2FjaGVkLgorUkRMRU5HVEggYSAxNiBiaXQgaW50ZWdlciwgbGVuZ3RoIGluIG9jdGV0cyBvZiB0aGUgUkRBVEEgZmllbGQuCitSREFUQSAgIGEgdmFyaWFibGUgbGVuZ3RoIHN0cmluZyBvZiBvY3RldHMgdGhhdCBkZXNjcmliZXMgdGhlIHJlc291cmNlLgorICAgICAgICBUaGUgZm9ybWF0IG9mIHRoaXMgaW5mb3JtYXRpb24gdmFyaWVzIGFjY29yZGluZyB0byB0aGUgVFlQRQorICAgICAgICBhbmQgQ0xBU1Mgb2YgdGhlIHJlc291cmNlIHJlY29yZC4KKyAgICAgICAgSWYgdGhlIFRZUEUgaXMgQSBhbmQgdGhlIENMQVNTIGlzIElOLCBpdCdzIGEgNCBvY3RldCBJUCBhZGRyZXNzLgorCis0LjEuNC4gTWVzc2FnZSBjb21wcmVzc2lvbgorCitJbiBvcmRlciB0byByZWR1Y2UgdGhlIHNpemUgb2YgbWVzc2FnZXMsIGRvbWFpbiBuYW1lcyBjb2FuIGJlIGNvbXByZXNzZWQuCitBbiBlbnRpcmUgZG9tYWluIG5hbWUgb3IgYSBsaXN0IG9mIGxhYmVscyBhdCB0aGUgZW5kIG9mIGEgZG9tYWluIG5hbWUKK2lzIHJlcGxhY2VkIHdpdGggYSBwb2ludGVyIHRvIGEgcHJpb3Igb2NjdXJhbmNlIG9mIHRoZSBzYW1lIG5hbWUuCisKK1RoZSBwb2ludGVyIHRha2VzIHRoZSBmb3JtIG9mIGEgdHdvIG9jdGV0IHNlcXVlbmNlOgorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8IDEgIDF8ICAgICAgICAgICAgICAgIE9GRlNFVCAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworVGhlIGZpcnN0IHR3byBiaXRzIGFyZSBvbmVzLiAgVGhpcyBhbGxvd3MgYSBwb2ludGVyIHRvIGJlIGRpc3Rpbmd1aXNoZWQKK2Zyb20gYSBsYWJlbCwgc2luY2UgdGhlIGxhYmVsIG11c3QgYmVnaW4gd2l0aCB0d28gemVybyBiaXRzIGJlY2F1c2UKK2xhYmVscyBhcmUgcmVzdHJpY3RlZCB0byA2MyBvY3RldHMgb3IgbGVzcy4gIFRoZSBPRkZTRVQgZmllbGQgc3BlY2lmaWVzCithbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2UgKGkuZS4sIHRoZSBmaXJzdCBvY3RldAorb2YgdGhlIElEIGZpZWxkIGluIHRoZSBkb21haW4gaGVhZGVyKS4KK0EgemVybyBvZmZzZXQgc3BlY2lmaWVzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBJRCBmaWVsZCwgZXRjLgorRG9tYWluIG5hbWUgaW4gYSBtZXNzYWdlIGNhbiBiZSByZXByZXNlbnRlZCBhcyBlaXRoZXI6CisgICAtIGEgc2VxdWVuY2Ugb2YgbGFiZWxzIGVuZGluZyBpbiBhIHplcm8gb2N0ZXQKKyAgIC0gYSBwb2ludGVyCisgICAtIGEgc2VxdWVuY2Ugb2YgbGFiZWxzIGVuZGluZyB3aXRoIGEgcG9pbnRlcgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfcGFja2V0KHN0cnVjdCBkbnNfZW50cnkgKmNvbmZfZGF0YSwKKwkJdWludDMyX3QgY29uZl90dGwsCisJCXVpbnQ4X3QgKmJ1ZikKK3sKKwlzdHJ1Y3QgZG5zX2hlYWQgKmhlYWQ7CisJc3RydWN0IHR5cGVfYW5kX2NsYXNzICp1bmFsaWduZWRfdHlwZV9jbGFzczsKKwljb25zdCBjaGFyICplcnJfbXNnOworCWNoYXIgKnF1ZXJ5X3N0cmluZzsKKwljaGFyICphbnN3c3RyOworCXVpbnQ4X3QgKmFuc3diOworCXVpbnQxNl90IG91dHJfcmxlbjsKKwl1aW50MTZfdCBvdXRyX2ZsYWdzOworCXVpbnQxNl90IHR5cGU7CisJdWludDE2X3QgY2xhc3M7CisJaW50IHF1ZXJ5X2xlbjsKKworCWhlYWQgPSAoc3RydWN0IGRuc19oZWFkICopYnVmOworCWlmIChoZWFkLT5ucXVlciA9PSAwKSB7CisJCWJiX2Vycm9yX21zZygicGFja2V0IGhhcyAwIHF1ZXJpZXMsIGlnbm9yZWQiKTsKKwkJcmV0dXJuIDA7IC8qIGRvbid0IHJlcGx5ICovCisJfQorCWlmIChoZWFkLT5mbGFncyAmIGh0b25zKDB4ODAwMCkpIHsgLyogUVIgYml0ICovCisJCWJiX2Vycm9yX21zZygicmVzcG9uc2UgcGFja2V0LCBpZ25vcmVkIik7CisJCXJldHVybiAwOyAvKiBkb24ndCByZXBseSAqLworCX0KKwkvKiBRUiA9IDEgInJlc3BvbnNlIiwgUkNPREUgPSA0ICJOb3QgSW1wbGVtZW50ZWQiICovCisJb3V0cl9mbGFncyA9IGh0b25zKDB4ODAwMCB8IDQpOworCWVycl9tc2cgPSBOVUxMOworCisJLyogc3RhcnQgb2YgcXVlcnkgc3RyaW5nICovCisJcXVlcnlfc3RyaW5nID0gKHZvaWQgKikoaGVhZCArIDEpOworCS8qIGNhbGxlciBndWFyYW50ZWVzIHN0cmxlbiBpcyA8PSBNQVhfUEFDS19MRU4gKi8KKwlxdWVyeV9sZW4gPSBzdHJsZW4ocXVlcnlfc3RyaW5nKSArIDE7CisJLyogbWF5IGJlIHVuYWxpZ25lZCEgKi8KKwl1bmFsaWduZWRfdHlwZV9jbGFzcyA9ICh2b2lkICopKHF1ZXJ5X3N0cmluZyArIHF1ZXJ5X2xlbik7CisJcXVlcnlfbGVuICs9IHNpemVvZigqdW5hbGlnbmVkX3R5cGVfY2xhc3MpOworCS8qIHdoZXJlIHRvIGFwcGVuZCBhbnN3ZXIgYmxvY2sgKi8KKwlhbnN3YiA9ICh2b2lkICopKHVuYWxpZ25lZF90eXBlX2NsYXNzICsgMSk7CisKKwkvKiBPUENPREUgIT0gMCAic3RhbmRhcmQgcXVlcnkiPyAqLworCWlmICgoaGVhZC0+ZmxhZ3MgJiBodG9ucygweDc4MDApKSAhPSAwKSB7CisJCWVycl9tc2cgPSAib3Bjb2RlICE9IDAiOworCQlnb3RvIGVtcHR5X3BhY2tldDsKKwl9CisJbW92ZV9mcm9tX3VuYWxpZ25lZDE2KGNsYXNzLCAmdW5hbGlnbmVkX3R5cGVfY2xhc3MtPmNsYXNzKTsKKwlpZiAoY2xhc3MgIT0gaHRvbnMoMSkpIHsgLyogbm90IGNsYXNzIElORVQ/ICovCisJCWVycl9tc2cgPSAiY2xhc3MgIT0gMSI7CisJCWdvdG8gZW1wdHlfcGFja2V0OworCX0KKwltb3ZlX2Zyb21fdW5hbGlnbmVkMTYodHlwZSwgJnVuYWxpZ25lZF90eXBlX2NsYXNzLT50eXBlKTsKKwlpZiAodHlwZSAhPSBodG9ucyhSRVFfQSkgJiYgdHlwZSAhPSBodG9ucyhSRVFfUFRSKSkgeworCQkvKiB3ZSBjYW4ndCBoYW5kbGUgdGhpcyBxdWVyeSB0eXBlICovCisvL1RPRE86IGhhcHBlbnMgYWxsIHRoZSB0aW1lIHdpdGggUkVRX0FBQUEgKDB4MWMpIHJlcXVlc3RzIC0gaW1wbGVtZW50IHRob3NlPworCQllcnJfbXNnID0gInR5cGUgaXMgIVJFUV9BIGFuZCAhUkVRX1BUUiI7CisJCWdvdG8gZW1wdHlfcGFja2V0OworCX0KKworCS8qIGxvb2sgdXAgdGhlIG5hbWUgKi8KKwlhbnN3c3RyID0gdGFibGVfbG9va3VwKGNvbmZfZGF0YSwgdHlwZSwgcXVlcnlfc3RyaW5nKTsKKyNpZiBERUJVRworCS8qIFNob3dzIGxlbmd0aHMgaW5zdGVhZCBvZiBkb3RzLCB1bnVzYWJsZSBmb3IgIURFQlVHICovCisJYmJfZXJyb3JfbXNnKCInJXMnLT4nJXMnIiwgcXVlcnlfc3RyaW5nLCBhbnN3c3RyKTsKKyNlbmRpZgorCW91dHJfcmxlbiA9IDQ7CisJaWYgKGFuc3dzdHIgJiYgdHlwZSA9PSBodG9ucyhSRVFfUFRSKSkgeworCQkvKiByZXR1cm5pbmcgYSBob3N0IG5hbWUgKi8KKwkJb3V0cl9ybGVuID0gc3RybGVuKGFuc3dzdHIpICsgMTsKKwl9CisJaWYgKCFhbnN3c3RyCisJIHx8ICh1bnNpZ25lZCkoYW5zd2IgLSBidWYpICsgcXVlcnlfbGVuICsgNCArIDIgKyBvdXRyX3JsZW4gPiBNQVhfUEFDS19MRU4KKwkpIHsKKwkJLyogUVIgPSAxICJyZXNwb25zZSIKKwkJICogQUEgPSAxICJBdXRob3JpdGF0aXZlIEFuc3dlciIKKwkJICogUkNPREUgPSAzICJOYW1lIEVycm9yIiAqLworCQllcnJfbXNnID0gIm5hbWUgaXMgbm90IGZvdW5kIjsKKwkJb3V0cl9mbGFncyA9IGh0b25zKDB4ODAwMCB8IDB4MDQwMCB8IDMpOworCQlnb3RvIGVtcHR5X3BhY2tldDsKKwl9CisKKwkvKiBBcHBlbmQgYW5zd2VyIFJlc291cmNlIFJlY29yZCAqLworCW1lbWNweShhbnN3YiwgcXVlcnlfc3RyaW5nLCBxdWVyeV9sZW4pOyAvKiBuYW1lLCB0eXBlLCBjbGFzcyAqLworCWFuc3diICs9IHF1ZXJ5X2xlbjsKKwltb3ZlX3RvX3VuYWxpZ25lZDMyKCh1aW50MzJfdCAqKWFuc3diLCBodG9ubChjb25mX3R0bCkpOworCWFuc3diICs9IDQ7CisJbW92ZV90b191bmFsaWduZWQxNigodWludDE2X3QgKilhbnN3YiwgaHRvbnMob3V0cl9ybGVuKSk7CisJYW5zd2IgKz0gMjsKKwltZW1jcHkoYW5zd2IsIGFuc3dzdHIsIG91dHJfcmxlbik7CisJYW5zd2IgKz0gb3V0cl9ybGVuOworCisJLyogUVIgPSAxICJyZXNwb25zZSIsCisJICogQUEgPSAxICJBdXRob3JpdGF0aXZlIEFuc3dlciIsCisJICogVE9ETzogbmVlZCB0byBzZXQgUkEgYml0IDB4ODA/IE9uZSB1c2VyIHNheXMgbnNsb29rdXAgY29tcGxhaW5zCisJICogIkdvdCByZWN1cnNpb24gbm90IGF2YWlsYWJsZSBmcm9tIFNFUlZFUiwgdHJ5aW5nIG5leHQgc2VydmVyIgorCSAqICIqKiBzZXJ2ZXIgY2FuJ3QgZmluZCBIT1NUTkFNRSIKKwkgKiBSQ09ERSA9IDAgInN1Y2Nlc3MiCisJICovCisJaWYgKE9QVF92ZXJib3NlKQorCQliYl9lcnJvcl9tc2coInJldHVybmluZyBwb3NpdGl2ZSByZXBseSIpOworCW91dHJfZmxhZ3MgPSBodG9ucygweDgwMDAgfCAweDA0MDAgfCAwKTsKKwkvKiB3ZSBoYXZlIG9uZSBhbnN3ZXIgKi8KKwloZWFkLT5uYW5zdyA9IGh0b25zKDEpOworCisgZW1wdHlfcGFja2V0OgorCWlmICgob3V0cl9mbGFncyAmIGh0b25zKDB4ZikpICE9IDApIHsgLyogbm90IGEgcG9zaXRpdmUgcmVzcG9uc2UgKi8KKwkJaWYgKE9QVF92ZXJib3NlKSB7CisJCQliYl9lcnJvcl9tc2coIiVzLCAlcyIsCisJCQkJZXJyX21zZywKKwkJCQlPUFRfc2lsZW50ID8gImRyb3BwaW5nIHF1ZXJ5IiA6ICJzZW5kaW5nIGVycm9yIHJlcGx5IgorCQkJKTsKKwkJfQorCQlpZiAoT1BUX3NpbGVudCkKKwkJCXJldHVybiAwOworCX0KKwloZWFkLT5mbGFncyB8PSBvdXRyX2ZsYWdzOworCWhlYWQtPm5hdXRoID0gaGVhZC0+bmFkZCA9IDA7CisJaGVhZC0+bnF1ZXIgPSBodG9ucygxKTsgLy8gd2h5Pz8/CisKKwlyZXR1cm4gYW5zd2IgLSBidWY7Cit9CisKK2ludCBkbnNkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkbnNkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpsaXN0ZW5faW50ZXJmYWNlID0gIjAuMC4wLjAiOworCWNvbnN0IGNoYXIgKmZpbGVjb25mID0gIi9ldGMvZG5zZC5jb25mIjsKKwlzdHJ1Y3QgZG5zX2VudHJ5ICpjb25mX2RhdGE7CisJdWludDMyX3QgY29uZl90dGwgPSBERUZBVUxUX1RUTDsKKwljaGFyICpzdHRsLCAqc3BvcnQ7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhLCAqZnJvbSwgKnRvOworCXVuc2lnbmVkIGxzYV9zaXplOworCWludCB1ZHBzLCBvcHRzOworCXVpbnQxNl90IHBvcnQgPSA1MzsKKwkvKiBFbnN1cmUgYnVmIGlzIDMyYml0IGFsaWduZWQgKHdlIG5lZWQgMTZiaXQsIGJ1dCAzMmJpdCBjYW4ndCBodXJ0KSAqLworCXVpbnQ4X3QgYnVmW01BWF9QQUNLX0xFTiArIDFdIEFMSUdONDsKKworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAidnNpOmM6dDpwOmQiLCAmbGlzdGVuX2ludGVyZmFjZSwgJmZpbGVjb25mLCAmc3R0bCwgJnNwb3J0KTsKKwkvL2lmIChvcHRzICYgKDEgPDwgMCkpIC8vIC12CisJLy9pZiAob3B0cyAmICgxIDw8IDEpKSAvLyAtcworCS8vaWYgKG9wdHMgJiAoMSA8PCAyKSkgLy8gLWkKKwkvL2lmIChvcHRzICYgKDEgPDwgMykpIC8vIC1jCisJaWYgKG9wdHMgJiAoMSA8PCA0KSkgLy8gLXQKKwkJY29uZl90dGwgPSB4YXRvdV9yYW5nZShzdHRsLCAxLCAweGZmZmZmZmZmKTsKKwlpZiAob3B0cyAmICgxIDw8IDUpKSAvLyAtcAorCQlwb3J0ID0geGF0b3VfcmFuZ2Uoc3BvcnQsIDEsIDB4ZmZmZik7CisJaWYgKG9wdHMgJiAoMSA8PCA2KSkgeyAvLyAtZAorCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NMT1NFX0VYVFJBX0ZEUywgYXJndik7CisJCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQsIExPR19EQUVNT04pOworCQlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJY29uZl9kYXRhID0gcGFyc2VfY29uZl9maWxlKGZpbGVjb25mKTsKKworCWxzYSA9IHhkb3R0ZWQyc29ja2FkZHIobGlzdGVuX2ludGVyZmFjZSwgcG9ydCk7CisJdWRwcyA9IHhzb2NrZXQobHNhLT51LnNhLnNhX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJeGJpbmQodWRwcywgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCXNvY2tldF93YW50X3BrdGluZm8odWRwcyk7IC8qIG5lZWRlZCBmb3IgcmVjdl9mcm9tX3RvIHRvIHdvcmsgKi8KKwlsc2Ffc2l6ZSA9IExTQV9MRU5fU0laRSArIGxzYS0+bGVuOworCWZyb20gPSB4emFsbG9jKGxzYV9zaXplKTsKKwl0byA9IHh6YWxsb2MobHNhX3NpemUpOworCisJeworCQljaGFyICpwID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJmxzYS0+dS5zYSk7CisJCWJiX2Vycm9yX21zZygiYWNjZXB0aW5nIFVEUCBwYWNrZXRzIG9uICVzIiwgcCk7CisJCWZyZWUocCk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50IHI7CisJCS8qIFRyeSB0byBnZXQgKkRFU1QqIGFkZHJlc3MgKHRvIHdoaWNoIG9mIG91ciBhZGRyZXNzZXMKKwkJICogdGhpcyBxdWVyeSB3YXMgZGlyZWN0ZWQpLCBhbmQgcmVwbHkgZnJvbSB0aGUgc2FtZSBhZGRyZXNzLgorCQkgKiBPciBlbHNlIHdlIGNhbiBleGhpYml0IHVzdWFsIFVEUCB1Z2xpbmVzczoKKwkJICogW2lwMS5tdWx0aWhvbWVkLmlwMl0gPD0gIHF1ZXJ5IHRvIGlwMSAgPD0gcGVlcgorCQkgKiBbaXAxLm11bHRpaG9tZWQuaXAyXSA9PiByZXBseSBmcm9tIGlwMiA9PiBwZWVyIChjb25mdXNlZCkgKi8KKwkJbWVtY3B5KHRvLCBsc2EsIGxzYV9zaXplKTsKKwkJciA9IHJlY3ZfZnJvbV90byh1ZHBzLCBidWYsIE1BWF9QQUNLX0xFTiArIDEsIDAsICZmcm9tLT51LnNhLCAmdG8tPnUuc2EsIGxzYS0+bGVuKTsKKwkJaWYgKHIgPCAxMiB8fCByID4gTUFYX1BBQ0tfTEVOKSB7CisJCQliYl9lcnJvcl9tc2coInBhY2tldCBzaXplICVkLCBpZ25vcmVkIiwgcik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoT1BUX3ZlcmJvc2UpCisJCQliYl9lcnJvcl9tc2coImdvdCBVRFAgcGFja2V0Iik7CisJCWJ1ZltyXSA9ICdcMCc7IC8qIHBhcmFub2lhICovCisJCXIgPSBwcm9jZXNzX3BhY2tldChjb25mX2RhdGEsIGNvbmZfdHRsLCBidWYpOworCQlpZiAociA8PSAwKQorCQkJY29udGludWU7CisJCXNlbmRfdG9fZnJvbSh1ZHBzLCBidWYsIHIsIDAsICZmcm9tLT51LnNhLCAmdG8tPnUuc2EsIGxzYS0+bGVuKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2V0aGVyLXdha2UuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvZXRoZXItd2FrZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODgyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2V0aGVyLXdha2UuYwpAQCAtMCwwICsxLDI4NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZXRoZXItd2FrZS5jIC0gU2VuZCBhIG1hZ2ljIHBhY2tldCB0byB3YWtlIHVwIHNsZWVwaW5nIG1hY2hpbmVzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yOiAgICAgIERvbmFsZCBCZWNrZXIsIGh0dHA6Ly93d3cuc2N5bGQuY29tLyI7IGh0dHA6Ly93d3cuc2N5bGQuY29tL3dha2Vvbmxhbi5odG1sCisgKiBCdXN5Ym94IHBvcnQ6IENocmlzdGlhbiBWb2xrbWFubiA8aGF2ZWFuaWNlZGF5QG9ubGluZS5kZT4KKyAqICAgICAgICAgICAgICAgVXNlZCB2ZXJzaW9uIG9mIGV0aGVyLXdha2UuYzogdjEuMDkgMTEvMTIvMjAwMyBEb25hbGQgQmVja2VyLCBodHRwOi8vd3d3LnNjeWxkLmNvbS8iOworICovCisKKy8qIGZ1bGwgdXNhZ2UgYWNjb3JkaW5nIERvbmFsZCBCZWNrZXIKKyAqIHVzYWdlOiBldGhlci13YWtlIFstaSA8aWZuYW1lPl0gWy1wIGFhOmJiOmNjOmRkWzplZTpmZl1dIDAwOjExOjIyOjMzOjQ0OjU1XG4iCisgKgorICoJVGhpcyBwcm9ncmFtIGdlbmVyYXRlcyBhbmQgdHJhbnNtaXRzIGEgV2FrZS1Pbi1MQU4gKFdPTClcbiIKKyAqCVwiTWFnaWMgUGFja2V0XCIsIHVzZWQgZm9yIHJlc3RhcnRpbmcgbWFjaGluZXMgdGhhdCBoYXZlIGJlZW5cbiIKKyAqCXNvZnQtcG93ZXJlZC1kb3duIChBQ1BJIEQzLXdhcm0gc3RhdGUpLlxuIgorICoJSXQgY3VycmVudGx5IGdlbmVyYXRlcyB0aGUgc3RhbmRhcmQgQU1EIE1hZ2ljIFBhY2tldCBmb3JtYXQsIHdpdGhcbiIKKyAqCWFuIG9wdGlvbmFsIHBhc3N3b3JkIGFwcGVuZGVkLlxuIgorICoKKyAqCVRoZSBzaW5nbGUgcmVxdWlyZWQgcGFyYW1ldGVyIGlzIHRoZSBFdGhlcm5ldCBNQUMgKHN0YXRpb24pIGFkZHJlc3NcbiIKKyAqCW9mIHRoZSBtYWNoaW5lIHRvIHdha2Ugb3IgYSBob3N0IElEIHdpdGgga25vd24gTlNTICdldGhlcnMnIGVudHJ5LlxuIgorICoJVGhlIE1BQyBhZGRyZXNzIG1heSBiZSBmb3VuZCB3aXRoIHRoZSAnYXJwJyBwcm9ncmFtIHdoaWxlIHRoZSB0YXJnZXRcbiIKKyAqCW1hY2hpbmUgaXMgYXdha2UuXG4iCisgKgorICoJT3B0aW9uczpcbiIKKyAqCQktYglTZW5kIHdha2UtdXAgcGFja2V0IHRvIHRoZSBicm9hZGNhc3QgYWRkcmVzcy5cbiIKKyAqCQktRAlJbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwuXG4iCisgKgkJLWkgaWZuYW1lCVVzZSBpbnRlcmZhY2UgSUZOQU1FIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgJ2V0aDAnLlxuIgorICoJCS1wIDxwdz4JCUFwcGVuZCB0aGUgZm91ciBvciBzaXggYnl0ZSBwYXNzd29yZCBQVyB0byB0aGUgcGFja2V0LlxuIgorICoJCQkJCUEgcGFzc3dvcmQgaXMgb25seSByZXF1aXJlZCBmb3IgYSBmZXcgYWRhcHRlciB0eXBlcy5cbiIKKyAqCQkJCQlUaGUgcGFzc3dvcmQgbWF5IGJlIHNwZWNpZmllZCBpbiBldGhlcm5ldCBoZXggZm9ybWF0XG4iCisgKgkJCQkJb3IgZG90dGVkIGRlY2ltYWwgKEludGVybmV0IGFkZHJlc3MpXG4iCisgKgkJLXAgMDA6MjI6NDQ6NjY6ODg6YWFcbiIKKyAqCQktcCAxOTIuMTY4LjEuMVxuIjsKKyAqCisgKgorICoJVGhpcyBwcm9ncmFtIGdlbmVyYXRlcyBhbmQgdHJhbnNtaXRzIGEgV2FrZS1Pbi1MQU4gKFdPTCkgIk1hZ2ljIFBhY2tldCIsCisgKgl1c2VkIGZvciByZXN0YXJ0aW5nIG1hY2hpbmVzIHRoYXQgaGF2ZSBiZWVuIHNvZnQtcG93ZXJlZC1kb3duCisgKgkoQUNQSSBEMy13YXJtIHN0YXRlKS4gIEl0IGN1cnJlbnRseSBnZW5lcmF0ZXMgdGhlIHN0YW5kYXJkIEFNRCBNYWdpYyBQYWNrZXQKKyAqCWZvcm1hdCwgd2l0aCBhbiBvcHRpb25hbCBwYXNzd29yZCBhcHBlbmRlZC4KKyAqCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKglvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCUNvbnRhY3QgdGhlIGF1dGhvciBmb3IgdXNlIHVuZGVyIG90aGVyIHRlcm1zLgorICoKKyAqCVRoaXMgc291cmNlIGZpbGUgd2FzIG9yaWdpbmFsbHkgcGFydCBvZiB0aGUgbmV0d29yayB0cmlja3MgcGFja2FnZSwgYW5kCisgKglpcyBub3cgZGlzdHJpYnV0ZWQgdG8gc3VwcG9ydCB0aGUgU2N5bGQgQmVvd3VsZiBzeXN0ZW0uCisgKglDb3B5cmlnaHQgMTk5OS0yMDAzIERvbmFsZCBCZWNrZXIgYW5kIFNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbi4KKyAqCisgKglUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZCwgb3IgQy9PCisgKgkgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisgKgkgOTE0IEJheSBSaWRnZSBSb2FkLCBTdWl0ZSAyMjAKKyAqCSBBbm5hcG9saXMgTUQgMjE0MDMKKyAqCisgKiAgIE5vdGVzOgorICogICBPbiBzb21lIHN5c3RlbXMgZHJvcHBpbmcgcm9vdCBjYXBhYmlsaXR5IGFsbG93cyB0aGUgcHJvY2VzcyB0byBiZQorICogICBkdW1wZWQsIHRyYWNlZCBvciBkZWJ1Z2dlZC4KKyAqICAgSWYgc29tZW9uZSB0cmFjZXMgdGhpcyBwcm9ncmFtLCB0aGV5IGdldCBjb250cm9sIG9mIGEgcmF3IHNvY2tldC4KKyAqICAgTGludXggaGFuZGxlcyB0aGlzIHNhZmVseSwgYnV0IGJld2FyZSB3aGVuIHBvcnRpbmcgdGhpcyBwcm9ncmFtLgorICoKKyAqICAgQW4gYWx0ZXJuYXRpdmUgdG8gbmVlZGluZyAncm9vdCcgaXMgdXNpbmcgYSBVRFAgYnJvYWRjYXN0IHNvY2tldCwgaG93ZXZlcgorICogICBkb2luZyBzbyBvbmx5IHdvcmtzIHdpdGggYWRhcHRlcnMgY29uZmlndXJlZCBmb3IgdW5pY2FzdCticm9hZGNhc3QgUngKKyAqICAgZmlsdGVyLiAgVGhhdCBjb25maWd1cmF0aW9uIGNvbnN1bWVzIG1vcmUgcG93ZXIuCisqLworCisvL3VzYWdlOiNkZWZpbmUgZXRoZXJfd2FrZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1iXSBbLWkgaWZhY2VdIFstcCBhYTpiYjpjYzpkZFs6ZWU6ZmZdXSBNQUMiCisvL3VzYWdlOiNkZWZpbmUgZXRoZXJfd2FrZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgYSBtYWdpYyBwYWNrZXQgdG8gd2FrZSB1cCBzbGVlcGluZyBtYWNoaW5lcy5cbiIKKy8vdXNhZ2U6ICAgICAgICJNQUMgbXVzdCBiZSBhIHN0YXRpb24gYWRkcmVzcyAoMDA6MTE6MjI6MzM6NDQ6NTUpIG9yXG4iCisvL3VzYWdlOiAgICAgICAiYSBob3N0bmFtZSB3aXRoIGEga25vd24gJ2V0aGVycycgZW50cnkuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1iCQlTZW5kIHdha2UtdXAgcGFja2V0IHRvIHRoZSBicm9hZGNhc3QgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWkgaWZhY2UJSW50ZXJmYWNlIHRvIHVzZSAoZGVmYXVsdCBldGgwKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgcGFzcwkJQXBwZW5kIGZvdXIgb3Igc2l4IGJ5dGUgcGFzc3dvcmQgUFcgdG8gdGhlIHBhY2tldCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisvKiBOb3RlOiBQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCB3b3VsZCBhbGxvdyBTSU9DR0lGSFdBRERSIHRvCisgKiB3b3JrIGFzIG5vbi1yb290LCBidXQgd2UgbmVlZCBTT0NLX1BBQ0tFVCB0byBzcGVjaWZ5IHRoZSBFdGhlcm5ldAorICogZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqLworI2lmZGVmIFBGX1BBQ0tFVAorIyBkZWZpbmUgd2hlcmV0b190IHNvY2thZGRyX2xsCisjIGRlZmluZSBtYWtlX3NvY2tldCgpIHhzb2NrZXQoUEZfUEFDS0VULCBTT0NLX1JBVywgMCkKKyNlbHNlCisjIGRlZmluZSB3aGVyZXRvX3Qgc29ja2FkZHIKKyMgZGVmaW5lIG1ha2Vfc29ja2V0KCkgeHNvY2tldChBRl9JTkVULCBTT0NLX1BBQ0tFVCwgU09DS19QQUNLRVQpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBiYl9kZWJ1Z19tc2coZm10LCBhcmdzLi4uKSBmcHJpbnRmKHN0ZGVyciwgZm10LCAjIyBhcmdzKQordm9pZCBiYl9kZWJ1Z19kdW1wX3BhY2tldCh1bnNpZ25lZCBjaGFyICpvdXRwYWNrLCBpbnQgcGt0c2l6ZSkKK3sKKwlpbnQgaTsKKwlwcmludGYoInBhY2tldCBkdW1wOlxuIik7CisJZm9yIChpID0gMDsgaSA8IHBrdHNpemU7ICsraSkgeworCQlwcmludGYoIiUyLjJ4ICIsIG91dHBhY2tbaV0pOworCQlpZiAoaSAlIDIwID09IDE5KSBiYl9wdXRjaGFyKCdcbicpOworCX0KKwlwcmludGYoIlxuXG4iKTsKK30KKyNlbHNlCisjIGRlZmluZSBiYl9kZWJ1Z19tc2coZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIGJiX2RlYnVnX2R1bXBfcGFja2V0KG91dHBhY2ssIHBrdHNpemUpICgodm9pZCkwKQorI2VuZGlmCisKKy8qIENvbnZlcnQgdGhlIGhvc3QgSUQgc3RyaW5nIHRvIGEgTUFDIGFkZHJlc3MuCisgKiBUaGUgc3RyaW5nIG1heSBiZSBhOgorICogICAgSG9zdCBuYW1lCisgKiAgICBJUCBhZGRyZXNzIHN0cmluZworICogICAgTUFDIGFkZHJlc3Mgc3RyaW5nCisqLworc3RhdGljIHZvaWQgZ2V0X2Rlc3RfYWRkcihjb25zdCBjaGFyICpob3N0aWQsIHN0cnVjdCBldGhlcl9hZGRyICplYWRkcikKK3sKKwlzdHJ1Y3QgZXRoZXJfYWRkciAqZWFwOworCisJZWFwID0gZXRoZXJfYXRvbl9yKGhvc3RpZCwgZWFkZHIpOworCWlmIChlYXApIHsKKwkJYmJfZGVidWdfbXNnKCJUaGUgdGFyZ2V0IHN0YXRpb24gYWRkcmVzcyBpcyAlc1xuXG4iLCBldGhlcl9udG9hKGVhcCkpOworI2lmICFkZWZpbmVkKF9fVUNMSUJDX01BSk9SX18pIFwKKyB8fCBfX1VDTElCQ19NQUpPUl9fID4gMCBcCisgfHwgX19VQ0xJQkNfTUlOT1JfXyA+IDkgXAorIHx8IChfX1VDTElCQ19NSU5PUl9fID09IDkgJiYgX19VQ0xJQkNfU1VCTEVWRUxfXyA+PSAzMCkKKwl9IGVsc2UgaWYgKGV0aGVyX2hvc3R0b24oaG9zdGlkLCBlYWRkcikgPT0gMCkgeworCQliYl9kZWJ1Z19tc2coIlN0YXRpb24gYWRkcmVzcyBmb3IgaG9zdG5hbWUgJXMgaXMgJXNcblxuIiwgaG9zdGlkLCBldGhlcl9udG9hKGVhZGRyKSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorfQorCitzdGF0aWMgaW50IGdldF9maWxsKHVuc2lnbmVkIGNoYXIgKnBrdCwgc3RydWN0IGV0aGVyX2FkZHIgKmVhZGRyLCBpbnQgYnJvYWRjYXN0KQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKnN0YXRpb25fYWRkciA9IGVhZGRyLT5ldGhlcl9hZGRyX29jdGV0OworCisJbWVtc2V0KHBrdCwgMHhmZiwgNik7CisJaWYgKCFicm9hZGNhc3QpCisJCW1lbWNweShwa3QsIHN0YXRpb25fYWRkciwgNik7CisJcGt0ICs9IDY7CisKKwltZW1jcHkocGt0LCBzdGF0aW9uX2FkZHIsIDYpOyAvKiA2ICovCisJcGt0ICs9IDY7CisKKwkqcGt0KysgPSAweDA4OyAvKiAxMiAqLyAvKiBPciAweDA4MDYgZm9yIEFSUCwgMHg4MDM1IGZvciBSQVJQICovCisJKnBrdCsrID0gMHg0MjsgLyogMTMgKi8KKworCW1lbXNldChwa3QsIDB4ZmYsIDYpOyAvKiAxNCAqLworCisJZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKwkJcGt0ICs9IDY7CisJCW1lbWNweShwa3QsIHN0YXRpb25fYWRkciwgNik7IC8qIDIwLDI2LDMyLC4uLiAqLworCX0KKworCXJldHVybiAyMCArIDE2KjY7IC8qIGxlbmd0aCBvZiBwYWNrZXQgKi8KK30KKworc3RhdGljIGludCBnZXRfd29sX3B3KGNvbnN0IGNoYXIgKmV0aG9wdGFyZywgdW5zaWduZWQgY2hhciAqd29sX3Bhc3N3ZCkKK3sKKwl1bnNpZ25lZCBwYXNzd2RbNl07CisJaW50IGJ5dGVfY250LCBpOworCisJLyogaGFuZGxlIE1BQyBmb3JtYXQgKi8KKwlieXRlX2NudCA9IHNzY2FuZihldGhvcHRhcmcsICIlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCIsCisJICAgICAgICAgICAgICAgICAgJnBhc3N3ZFswXSwgJnBhc3N3ZFsxXSwgJnBhc3N3ZFsyXSwKKwkgICAgICAgICAgICAgICAgICAmcGFzc3dkWzNdLCAmcGFzc3dkWzRdLCAmcGFzc3dkWzVdKTsKKwkvKiBoYW5kbGUgSVAgZm9ybWF0ICovCisvLyBGSVhNRTogd2h5IDwgND8/IHNob3VsZCBpdCBiZSA8IDY/CisJaWYgKGJ5dGVfY250IDwgNCkKKwkJYnl0ZV9jbnQgPSBzc2NhbmYoZXRob3B0YXJnLCAiJXUuJXUuJXUuJXUiLAorCQkgICAgICAgICAgICAgICAgICAmcGFzc3dkWzBdLCAmcGFzc3dkWzFdLCAmcGFzc3dkWzJdLCAmcGFzc3dkWzNdKTsKKwlpZiAoYnl0ZV9jbnQgPCA0KSB7CisJCWJiX2Vycm9yX21zZygiY2FuJ3QgcmVhZCBXYWtlLU9uLUxBTiBwYXNzIik7CisJCXJldHVybiAwOworCX0KKy8vIFRPRE86IGNoZWNrIGludmFsaWQgbnVtYmVycyA+MjU1Pz8KKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZV9jbnQ7ICsraSkKKwkJd29sX3Bhc3N3ZFtpXSA9IHBhc3N3ZFtpXTsKKworCWJiX2RlYnVnX21zZygicGFzc3dvcmQ6ICUyLjJ4ICUyLjJ4ICUyLjJ4ICUyLjJ4ICglZClcblxuIiwKKwkgICAgICAgICAgICAgd29sX3Bhc3N3ZFswXSwgd29sX3Bhc3N3ZFsxXSwgd29sX3Bhc3N3ZFsyXSwgd29sX3Bhc3N3ZFszXSwKKwkgICAgICAgICAgICAgYnl0ZV9jbnQpOworCisJcmV0dXJuIGJ5dGVfY250OworfQorCitpbnQgZXRoZXJfd2FrZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZXRoZXJfd2FrZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqaWZuYW1lID0gImV0aDAiOworCWNoYXIgKnBhc3M7CisJdW5zaWduZWQgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB3b2xfcGFzc3dkWzZdOworCWludCB3b2xfcGFzc3dkX3N6ID0gMDsKKwlpbnQgczsgIC8qIFJhdyBzb2NrZXQgKi8KKwlpbnQgcGt0c2l6ZTsKKwl1bnNpZ25lZCBjaGFyIG91dHBhY2tbMTAwMF07CisKKwlzdHJ1Y3QgZXRoZXJfYWRkciBlYWRkcjsKKwlzdHJ1Y3Qgd2hlcmV0b190IHdoZXJldG87ICAvKiB3aG8gdG8gd2FrZSB1cCAqLworCisJLyogaGFuZGxlIG1pc2MgdXNlciBvcHRpb25zICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImJpOnA6IiwgJmlmbmFtZSwgJnBhc3MpOworCWlmIChmbGFncyAmIDQpIC8qIC1wICovCisJCXdvbF9wYXNzd2Rfc3ogPSBnZXRfd29sX3B3KHBhc3MsIHdvbF9wYXNzd2QpOworCWZsYWdzICY9IDE7IC8qIHdlIGZ1cnRoZXIgaW50ZXJlc3RlZCBvbmx5IGluIC1iIFtiY2FzdF0gZmxhZyAqLworCisJLyogY3JlYXRlIHRoZSByYXcgc29ja2V0ICovCisJcyA9IG1ha2Vfc29ja2V0KCk7CisKKwkvKiBub3cgdGhhdCB3ZSBoYXZlIGEgcmF3IHNvY2tldCB3ZSBjYW4gZHJvcCByb290ICovCisJLyogeHNldHVpZChnZXR1aWQoKSk7IC0gYnV0IHNhdmUgb24gY29kZSBzaXplLi4uICovCisKKwkvKiBsb29rIHVwIHRoZSBkZXN0IG1hYyBhZGRyZXNzICovCisJZ2V0X2Rlc3RfYWRkcihhcmd2W29wdGluZF0sICZlYWRkcik7CisKKwkvKiBmaWxsIG91dCB0aGUgaGVhZGVyIG9mIHRoZSBwYWNrZXQgKi8KKwlwa3RzaXplID0gZ2V0X2ZpbGwob3V0cGFjaywgJmVhZGRyLCBmbGFncyAvKiAmIDEgT1BUX0JST0FEQ0FTVCAqLyk7CisKKwliYl9kZWJ1Z19kdW1wX3BhY2tldChvdXRwYWNrLCBwa3RzaXplKTsKKworCS8qIEZpbGwgaW4gdGhlIHNvdXJjZSBhZGRyZXNzLCBpZiBwb3NzaWJsZS4gKi8KKyNpZmRlZiBfX2xpbnV4X18KKwl7CisJCXN0cnVjdCBpZnJlcSBpZl9od2FkZHI7CisKKwkJc3RybmNweV9JRk5BTVNJWihpZl9od2FkZHIuaWZyX25hbWUsIGlmbmFtZSk7CisJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKHMsIFNJT0NHSUZIV0FERFIsICZpZl9od2FkZHIsICJTSU9DR0lGSFdBRERSIG9uICVzIGZhaWxlZCIsIGlmbmFtZSk7CisKKwkJbWVtY3B5KG91dHBhY2srNiwgaWZfaHdhZGRyLmlmcl9od2FkZHIuc2FfZGF0YSwgNik7CisKKyMgaWZkZWYgREVCVUcKKwkJeworCQkJdW5zaWduZWQgY2hhciAqaHdhZGRyID0gaWZfaHdhZGRyLmlmcl9od2FkZHIuc2FfZGF0YTsKKwkJCXByaW50ZigiVGhlIGhhcmR3YXJlIGFkZHJlc3MgKFNJT0NHSUZIV0FERFIpIG9mICVzIGlzIHR5cGUgJWQgICIKKwkJCQkgICAiJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMnhcblxuIiwgaWZuYW1lLAorCQkJCSAgIGlmX2h3YWRkci5pZnJfaHdhZGRyLnNhX2ZhbWlseSwgaHdhZGRyWzBdLCBod2FkZHJbMV0sCisJCQkJICAgaHdhZGRyWzJdLCBod2FkZHJbM10sIGh3YWRkcls0XSwgaHdhZGRyWzVdKTsKKwkJfQorIyBlbmRpZgorCX0KKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKworCWJiX2RlYnVnX2R1bXBfcGFja2V0KG91dHBhY2ssIHBrdHNpemUpOworCisJLyogYXBwZW5kIHRoZSBwYXNzd29yZCBpZiBzcGVjaWZpZWQgKi8KKwlpZiAod29sX3Bhc3N3ZF9zeiA+IDApIHsKKwkJbWVtY3B5KG91dHBhY2srcGt0c2l6ZSwgd29sX3Bhc3N3ZCwgd29sX3Bhc3N3ZF9zeik7CisJCXBrdHNpemUgKz0gd29sX3Bhc3N3ZF9zejsKKwl9CisKKwliYl9kZWJ1Z19kdW1wX3BhY2tldChvdXRwYWNrLCBwa3RzaXplKTsKKworCS8qIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBicm9hZGNhc3RzIHRvIHdvcmsgKi8KKwlpZiAoZmxhZ3MgLyogJiAxIE9QVF9CUk9BRENBU1QgKi8pIHsKKwkJaWYgKHNldHNvY2tvcHRfYnJvYWRjYXN0KHMpICE9IDApCisJCQliYl9wZXJyb3JfbXNnKCJTT19CUk9BRENBU1QiKTsKKwl9CisKKyNpZiBkZWZpbmVkKFBGX1BBQ0tFVCkKKwl7CisJCXN0cnVjdCBpZnJlcSBpZnI7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCQl4aW9jdGwocywgU0lPQ0dJRklOREVYLCAmaWZyKTsKKwkJbWVtc2V0KCZ3aGVyZXRvLCAwLCBzaXplb2Yod2hlcmV0bykpOworCQl3aGVyZXRvLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJCXdoZXJldG8uc2xsX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7CisJCS8qIFRoZSBtYW51YWwgcGFnZSBpbmNvcnJlY3RseSBjbGFpbXMgdGhlIGFkZHJlc3MgbXVzdCBiZSBmaWxsZWQuCisJCSAgIFdlIGRvIHNvIGJlY2F1c2UgdGhlIGNvZGUgbWF5IGNoYW5nZSB0byBtYXRjaCB0aGUgZG9jcy4gKi8KKwkJd2hlcmV0by5zbGxfaGFsZW4gPSBFVEhfQUxFTjsKKwkJbWVtY3B5KHdoZXJldG8uc2xsX2FkZHIsIG91dHBhY2ssIEVUSF9BTEVOKTsKKwl9CisjZWxzZQorCXdoZXJldG8uc2FfZmFtaWx5ID0gMDsKKwlzdHJjcHkod2hlcmV0by5zYV9kYXRhLCBpZm5hbWUpOworI2VuZGlmCisJeHNlbmR0byhzLCBvdXRwYWNrLCBwa3RzaXplLCAoc3RydWN0IHNvY2thZGRyICopJndoZXJldG8sIHNpemVvZih3aGVyZXRvKSk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShzKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9mdHBkLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2Z0cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzgxMzhjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9mdHBkLmMKQEAgLTAsMCArMSwxMzc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTaW1wbGUgRlRQIGRhZW1vbiwgYmFzZWQgb24gdnNmdHBkIDIuMC43ICh3cml0dGVuIGJ5IENocmlzIEV2YW5zKQorICoKKyAqIEF1dGhvcjogQWRhbSBUa2FjIDx2b25zY2hAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT25seSBzdWJzZXQgb2YgRlRQIHByb3RvY29sIGlzIGltcGxlbWVudGVkIGJ1dCB2YXN0IG1ham9yaXR5IG9mIGNsaWVudHMKKyAqIHNob3VsZCBub3QgaGF2ZSBhbnkgcHJvYmxlbS4KKyAqCisgKiBZb3UgaGF2ZSB0byBydW4gdGhpcyBkYWVtb24gdmlhIGluZXRkLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmdHBkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXd2U10gWy10IE5dIFstVCBOXSBbRElSXSIKKy8vdXNhZ2U6I2RlZmluZSBmdHBkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQW5vbnltb3VzIEZUUCBzZXJ2ZXJcbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJmdHBkIHNob3VsZCBiZSB1c2VkIGFzIGFuIGluZXRkIHNlcnZpY2UuXG4iCisvL3VzYWdlOiAgICAgICAiZnRwZCdzIGxpbmUgZm9yIGluZXRkLmNvbmY6XG4iCisvL3VzYWdlOiAgICAgICAiCTIxIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgZnRwZCBmdHBkIC9maWxlcy90by9zZXJ2ZVxuIgorLy91c2FnZTogICAgICAgIkl0IGFsc28gY2FuIGJlIHJhbiBmcm9tIHRjcHN2ZDpcbiIKKy8vdXNhZ2U6ICAgICAgICIJdGNwc3ZkIC12RSAwLjAuMC4wIDIxIGZ0cGQgL2ZpbGVzL3RvL3NlcnZlXG4iCisvL3VzYWdlOiAgICAgIlxuCS13CUFsbG93IHVwbG9hZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJTG9nIGVycm9ycyB0byBzdGRlcnIuIC12djogdmVyYm9zZSBsb2ciCisvL3VzYWdlOiAgICAgIlxuCS1TCUxvZyBlcnJvcnMgdG8gc3lzbG9nLiAtU1M6IHZlcmJvc2UgbG9nIgorLy91c2FnZTogICAgICJcbgktdCwtVAlJZGxlIGFuZCBhYnNvbHV0ZSB0aW1lb3V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JRElSCUNoYW5nZSByb290IHRvIHRoaXMgZGlyZWN0b3J5IgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorCisjZGVmaW5lIEZUUF9EQVRBQ09OTiAgICAgICAgICAgIDE1MAorI2RlZmluZSBGVFBfTk9PUE9LICAgICAgICAgICAgICAyMDAKKyNkZWZpbmUgRlRQX1RZUEVPSyAgICAgICAgICAgICAgMjAwCisjZGVmaW5lIEZUUF9QT1JUT0sgICAgICAgICAgICAgIDIwMAorI2RlZmluZSBGVFBfU1RSVU9LICAgICAgICAgICAgICAyMDAKKyNkZWZpbmUgRlRQX01PREVPSyAgICAgICAgICAgICAgMjAwCisjZGVmaW5lIEZUUF9BTExPT0sgICAgICAgICAgICAgIDIwMgorI2RlZmluZSBGVFBfU1RBVE9LICAgICAgICAgICAgICAyMTEKKyNkZWZpbmUgRlRQX1NUQVRGSUxFX09LICAgICAgICAgMjEzCisjZGVmaW5lIEZUUF9IRUxQICAgICAgICAgICAgICAgIDIxNAorI2RlZmluZSBGVFBfU1lTVE9LICAgICAgICAgICAgICAyMTUKKyNkZWZpbmUgRlRQX0dSRUVUICAgICAgICAgICAgICAgMjIwCisjZGVmaW5lIEZUUF9HT09EQllFICAgICAgICAgICAgIDIyMQorI2RlZmluZSBGVFBfVFJBTlNGRVJPSyAgICAgICAgICAyMjYKKyNkZWZpbmUgRlRQX1BBU1ZPSyAgICAgICAgICAgICAgMjI3CisvKiNkZWZpbmUgRlRQX0VQUlRPSyAgICAgICAgICAgICAgMjI4Ki8KKyNkZWZpbmUgRlRQX0VQU1ZPSyAgICAgICAgICAgICAgMjI5CisjZGVmaW5lIEZUUF9MT0dJTk9LICAgICAgICAgICAgIDIzMAorI2RlZmluZSBGVFBfQ1dET0sgICAgICAgICAgICAgICAyNTAKKyNkZWZpbmUgRlRQX1JNRElST0sgICAgICAgICAgICAgMjUwCisjZGVmaW5lIEZUUF9ERUxFT0sgICAgICAgICAgICAgIDI1MAorI2RlZmluZSBGVFBfUkVOQU1FT0sgICAgICAgICAgICAyNTAKKyNkZWZpbmUgRlRQX1BXRE9LICAgICAgICAgICAgICAgMjU3CisjZGVmaW5lIEZUUF9NS0RJUk9LICAgICAgICAgICAgIDI1NworI2RlZmluZSBGVFBfR0lWRVBXT1JEICAgICAgICAgICAzMzEKKyNkZWZpbmUgRlRQX1JFU1RPSyAgICAgICAgICAgICAgMzUwCisjZGVmaW5lIEZUUF9STkZST0sgICAgICAgICAgICAgIDM1MAorI2RlZmluZSBGVFBfVElNRU9VVCAgICAgICAgICAgICA0MjEKKyNkZWZpbmUgRlRQX0JBRFNFTkRDT05OICAgICAgICAgNDI1CisjZGVmaW5lIEZUUF9CQURTRU5ETkVUICAgICAgICAgIDQyNgorI2RlZmluZSBGVFBfQkFEU0VOREZJTEUgICAgICAgICA0NTEKKyNkZWZpbmUgRlRQX0JBRENNRCAgICAgICAgICAgICAgNTAwCisjZGVmaW5lIEZUUF9DT01NQU5ETk9USU1QTCAgICAgIDUwMgorI2RlZmluZSBGVFBfTkVFRFVTRVIgICAgICAgICAgICA1MDMKKyNkZWZpbmUgRlRQX05FRURSTkZSICAgICAgICAgICAgNTAzCisjZGVmaW5lIEZUUF9CQURTVFJVICAgICAgICAgICAgIDUwNAorI2RlZmluZSBGVFBfQkFETU9ERSAgICAgICAgICAgICA1MDQKKyNkZWZpbmUgRlRQX0xPR0lORVJSICAgICAgICAgICAgNTMwCisjZGVmaW5lIEZUUF9GSUxFRkFJTCAgICAgICAgICAgIDU1MAorI2RlZmluZSBGVFBfTk9QRVJNICAgICAgICAgICAgICA1NTAKKyNkZWZpbmUgRlRQX1VQTE9BREZBSUwgICAgICAgICAgNTUzCisKKyNkZWZpbmUgU1RSMShzKSAjcworI2RlZmluZSBTVFIocykgU1RSMShzKQorCisvKiBDb252ZXJ0IGEgY29uc3RhbnQgdG8gMy1kaWdpdCBzdHJpbmcsIHBhY2tlZCBpbnRvIHVpbnQzMl90ICovCitlbnVtIHsKKwkvKiBTaGlmdCBmb3IgTnRoIGRlY2ltYWwgZGlnaXQgKi8KKwlTSElGVDIgID0gIDAgKiBCQl9MSVRUTEVfRU5ESUFOICsgMjQgKiBCQl9CSUdfRU5ESUFOLAorCVNISUZUMSAgPSAgOCAqIEJCX0xJVFRMRV9FTkRJQU4gKyAxNiAqIEJCX0JJR19FTkRJQU4sCisJU0hJRlQwICA9IDE2ICogQkJfTElUVExFX0VORElBTiArIDggKiBCQl9CSUdfRU5ESUFOLAorCS8qIEFuZCBmb3IgNHRoIHBvc2l0aW9uIChzcGFjZSkgKi8KKwlTSElGVHNwID0gMjQgKiBCQl9MSVRUTEVfRU5ESUFOICsgMCAqIEJCX0JJR19FTkRJQU4sCit9OworI2RlZmluZSBTVFJOVU0zMihzKSAodWludDMyX3QpKDAgXAorCXwgKCgnMCcgKyAoKHMpIC8gMSAlIDEwKSkgPDwgU0hJRlQwKSBcCisJfCAoKCcwJyArICgocykgLyAxMCAlIDEwKSkgPDwgU0hJRlQxKSBcCisJfCAoKCcwJyArICgocykgLyAxMDAgJSAxMCkpIDw8IFNISUZUMikgXAorKQorI2RlZmluZSBTVFJOVU0zMnNwKHMpICh1aW50MzJfdCkoMCBcCisJfCAoJyAnIDw8IFNISUZUc3ApIFwKKwl8ICgoJzAnICsgKChzKSAvIDEgJSAxMCkpIDw8IFNISUZUMCkgXAorCXwgKCgnMCcgKyAoKHMpIC8gMTAgJSAxMCkpIDw8IFNISUZUMSkgXAorCXwgKCgnMCcgKyAoKHMpIC8gMTAwICUgMTApKSA8PCBTSElGVDIpIFwKKykKKworI2RlZmluZSBNU0dfT0sgIk9wZXJhdGlvbiBzdWNjZXNzZnVsXHJcbiIKKyNkZWZpbmUgTVNHX0VSUiAiRXJyb3JcclxuIgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IHBhc3ZfbGlzdGVuX2ZkOworI2lmICFCQl9NTVUKKwlpbnQgcm9vdF9mZDsKKyNlbmRpZgorCWludCBsb2NhbF9maWxlX2ZkOworCXVuc2lnbmVkIGVuZF90aW1lOworCXVuc2lnbmVkIHRpbWVvdXQ7CisJdW5zaWduZWQgdmVyYm9zZTsKKwlvZmZfdCBsb2NhbF9maWxlX3BvczsKKwlvZmZfdCByZXN0YXJ0X3BvczsKKwlsZW5fYW5kX3NvY2thZGRyICpsb2NhbF9hZGRyOworCWxlbl9hbmRfc29ja2FkZHIgKnBvcnRfYWRkcjsKKwljaGFyICpmdHBfY21kOworCWNoYXIgKmZ0cF9hcmc7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRlRQX1dSSVRFCisJY2hhciAqcm5mcl9maWxlbmFtZTsKKyNlbmRpZgorCS8qIFdlIG5lZWQgdGhlc2UgYWxpZ25lZCB0byB1aW50MzJfdCAqLworCWNoYXIgbXNnX29rIFsoc2l6ZW9mKCJOTk4gIiBNU0dfT0sgKSArIDMpICYgMHhmZmZjXTsKKwljaGFyIG1zZ19lcnJbKHNpemVvZigiTk5OICIgTVNHX0VSUikgKyAzKSAmIDB4ZmZmY107Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwkvKiBNb3ZlZCB0byBtYWluICovIFwKKwkvKnN0cmNweShHLm1zZ19vayAgKyA0LCBNU0dfT0sgKTsqLyBcCisJLypzdHJjcHkoRy5tc2dfZXJyICsgNCwgTVNHX0VSUik7Ki8gXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgY2hhciAqCitlc2NhcGVfdGV4dChjb25zdCBjaGFyICpwcmVwZW5kLCBjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGVzY2FwZWUpCit7CisJdW5zaWduZWQgcmV0bGVuLCByZW1haW5sZW4sIGNodW5rbGVuOworCWNoYXIgKnJldCwgKmZvdW5kOworCWNoYXIgYXBwZW5kOworCisJYXBwZW5kID0gKGNoYXIpZXNjYXBlZTsKKwllc2NhcGVlID4+PSA4OworCisJcmVtYWlubGVuID0gc3RybGVuKHN0cik7CisJcmV0bGVuID0gc3RybGVuKHByZXBlbmQpOworCXJldCA9IHhtYWxsb2MocmV0bGVuICsgcmVtYWlubGVuICogMiArIDEgKyAxKTsKKwlzdHJjcHkocmV0LCBwcmVwZW5kKTsKKworCWZvciAoOzspIHsKKwkJZm91bmQgPSBzdHJjaHJudWwoc3RyLCBlc2NhcGVlKTsKKwkJY2h1bmtsZW4gPSBmb3VuZCAtIHN0ciArIDE7CisKKwkJLyogQ29weSBjaHVuayB1cCB0byBhbmQgaW5jbHVkaW5nIGVzY2FwZWUgKG9yIE5VTCkgdG8gcmV0ICovCisJCW1lbWNweShyZXQgKyByZXRsZW4sIHN0ciwgY2h1bmtsZW4pOworCQlyZXRsZW4gKz0gY2h1bmtsZW47CisKKwkJaWYgKCpmb3VuZCA9PSAnXDAnKSB7CisJCQkvKiBJdCB3YXNuJ3QgZXNjYXBlZSwgaXQgd2FzIE5VTCEgKi8KKwkJCXJldFtyZXRsZW4gLSAxXSA9IGFwcGVuZDsgLyogcmVwbGFjZSBOVUwgKi8KKwkJCXJldFtyZXRsZW5dID0gJ1wwJzsgLyogYWRkIE5VTCAqLworCQkJYnJlYWs7CisJCX0KKwkJcmV0W3JldGxlbisrXSA9IGVzY2FwZWU7IC8qIGR1cGxpY2F0ZSBlc2NhcGVlICovCisJCXN0ciA9IGZvdW5kICsgMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJucyBzdHJsZW4gYXMgYSBib251cyAqLworc3RhdGljIHVuc2lnbmVkCityZXBsYWNlX2NoYXIoY2hhciAqc3RyLCBjaGFyIGZyb20sIGNoYXIgdG8pCit7CisJY2hhciAqcCA9IHN0cjsKKwl3aGlsZSAoKnApIHsKKwkJaWYgKCpwID09IGZyb20pCisJCQkqcCA9IHRvOworCQlwKys7CisJfQorCXJldHVybiBwIC0gc3RyOworfQorCitzdGF0aWMgdm9pZAordmVyYm9zZV9sb2coY29uc3QgY2hhciAqc3RyKQoreworCWJiX2Vycm9yX21zZygiJS4qcyIsIChpbnQpc3RyY3NwbihzdHIsICJcclxuIiksIHN0cik7Cit9CisKKy8qIE5COiBzdGF0dXNfc3RyIGlzIGNoYXJbNF0gcGFja2VkIGludG8gdWludDMyX3QgKi8KK3N0YXRpYyB2b2lkCitjbWRpb193cml0ZSh1aW50MzJfdCBzdGF0dXNfc3RyLCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqcmVzcG9uc2U7CisJaW50IGxlbjsKKworCS8qIEZUUCB1c2VzIHRlbG5ldCBwcm90b2NvbCBmb3IgY29tbWFuZCBsaW5rLgorCSAqIEluIHRlbG5ldCwgMHhmZiBpcyBhbiBlc2NhcGUgY2hhciwgYW5kIG5lZWRzIHRvIGJlIGVzY2FwZWQ6ICovCisJcmVzcG9uc2UgPSBlc2NhcGVfdGV4dCgoY2hhciAqKSAmc3RhdHVzX3N0ciwgc3RyLCAoMHhmZiA8PCA4KSArICdccicpOworCisJLyogRlRQIHNlbmRzIGVtYmVkZGVkIExGcyBhcyBOVUxzICovCisJbGVuID0gcmVwbGFjZV9jaGFyKHJlc3BvbnNlLCAnXG4nLCAnXDAnKTsKKworCXJlc3BvbnNlW2xlbisrXSA9ICdcbic7IC8qIHRhY2sgb24gdHJhaWxpbmcgJ1xuJyAqLworCXh3cml0ZShTVERPVVRfRklMRU5PLCByZXNwb25zZSwgbGVuKTsKKwlpZiAoRy52ZXJib3NlID4gMSkKKwkJdmVyYm9zZV9sb2cocmVzcG9uc2UpOworCWZyZWUocmVzcG9uc2UpOworfQorCitzdGF0aWMgdm9pZAorY21kaW9fd3JpdGVfb2sodW5zaWduZWQgc3RhdHVzKQoreworCSoodWludDMyX3QgKikgRy5tc2dfb2sgPSBzdGF0dXM7CisJeHdyaXRlKFNURE9VVF9GSUxFTk8sIEcubXNnX29rLCBzaXplb2YoIk5OTiAiIE1TR19PSykgLSAxKTsKKwlpZiAoRy52ZXJib3NlID4gMSkKKwkJdmVyYm9zZV9sb2coRy5tc2dfb2spOworfQorI2RlZmluZSBXUklURV9PSyhhKSBjbWRpb193cml0ZV9vayhTVFJOVU0zMnNwKGEpKQorCisvKiBUT0RPOiBvdXRwdXQgc3RyZXJyKGVycm5vKSBpZiBlcnJubyAhPSAwPyAqLworc3RhdGljIHZvaWQKK2NtZGlvX3dyaXRlX2Vycm9yKHVuc2lnbmVkIHN0YXR1cykKK3sKKwkqKHVpbnQzMl90ICopIEcubXNnX2VyciA9IHN0YXR1czsKKwl4d3JpdGUoU1RET1VUX0ZJTEVOTywgRy5tc2dfZXJyLCBzaXplb2YoIk5OTiAiIE1TR19FUlIpIC0gMSk7CisJaWYgKEcudmVyYm9zZSA+IDApCisJCXZlcmJvc2VfbG9nKEcubXNnX2Vycik7Cit9CisjZGVmaW5lIFdSSVRFX0VSUihhKSBjbWRpb193cml0ZV9lcnJvcihTVFJOVU0zMnNwKGEpKQorCitzdGF0aWMgdm9pZAorY21kaW9fd3JpdGVfcmF3KGNvbnN0IGNoYXIgKnBfdGV4dCkKK3sKKwl4d3JpdGVfc3RyKFNURE9VVF9GSUxFTk8sIHBfdGV4dCk7CisJaWYgKEcudmVyYm9zZSA+IDEpCisJCXZlcmJvc2VfbG9nKHBfdGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aW1lb3V0X2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJb2ZmX3QgcG9zOworCWludCBzdl9lcnJubyA9IGVycm5vOworCisJaWYgKChpbnQpKG1vbm90b25pY19zZWMoKSAtIEcuZW5kX3RpbWUpID49IDApCisJCWdvdG8gdGltZWRfb3V0OworCisJaWYgKCFHLmxvY2FsX2ZpbGVfZmQpCisJCWdvdG8gdGltZWRfb3V0OworCisJcG9zID0geGxzZWVrKEcubG9jYWxfZmlsZV9mZCwgMCwgU0VFS19DVVIpOworCWlmIChwb3MgPT0gRy5sb2NhbF9maWxlX3BvcykKKwkJZ290byB0aW1lZF9vdXQ7CisJRy5sb2NhbF9maWxlX3BvcyA9IHBvczsKKworCWFsYXJtKEcudGltZW91dCk7CisJZXJybm8gPSBzdl9lcnJubzsKKwlyZXR1cm47CisKKyB0aW1lZF9vdXQ6CisJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfVElNRU9VVCkiIFRpbWVvdXRcclxuIik7CisvKiBUT0RPOiBkbyB3ZSBuZWVkIHRvIGFib3J0IChhcyBvcHBvc2VkIHRvIHVzdWFsIHNodXRkb3duKSBkYXRhIHRyYW5zZmVyPyAqLworCWV4aXQoMSk7Cit9CisKKy8qIFNpbXBsZSBjb21tYW5kcyAqLworCitzdGF0aWMgdm9pZAoraGFuZGxlX3B3ZCh2b2lkKQoreworCWNoYXIgKmN3ZCwgKnJlc3BvbnNlOworCisJY3dkID0geHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oTlVMTCk7CisJaWYgKGN3ZCA9PSBOVUxMKQorCQljd2QgPSB4c3RyZHVwKCIiKTsKKworCS8qIFdlIGhhdmUgdG8gcHJvbW90ZSBlYWNoICIgdG8gIiIgKi8KKwlyZXNwb25zZSA9IGVzY2FwZV90ZXh0KCIgXCIiLCBjd2QsICgnIicgPDwgOCkgKyAnIicpOworCWZyZWUoY3dkKTsKKwljbWRpb193cml0ZShTVFJOVU0zMihGVFBfUFdET0spLCByZXNwb25zZSk7CisJZnJlZShyZXNwb25zZSk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY3dkKHZvaWQpCit7CisJaWYgKCFHLmZ0cF9hcmcgfHwgY2hkaXIoRy5mdHBfYXJnKSAhPSAwKSB7CisJCVdSSVRFX0VSUihGVFBfRklMRUZBSUwpOworCQlyZXR1cm47CisJfQorCVdSSVRFX09LKEZUUF9DV0RPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY2R1cCh2b2lkKQoreworCUcuZnRwX2FyZyA9IChjaGFyKikiLi4iOworCWhhbmRsZV9jd2QoKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9zdGF0KHZvaWQpCit7CisJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfU1RBVE9LKSItU2VydmVyIHN0YXR1czpcclxuIgorCQkJIiBUWVBFOiBCSU5BUllcclxuIgorCQkJU1RSKEZUUF9TVEFUT0spIiBPa1xyXG4iKTsKK30KKworLyogRXhhbXBsZXMgb2YgSEVMUCBhbmQgRkVBVDoKKyMgbmMgLXZ2diBmdHAua2VybmVsLm9yZyAyMQorZnRwLmtlcm5lbC5vcmcgKDEzMC4yMzkuMTcuNDoyMSkgb3BlbgorMjIwIFdlbGNvbWUgdG8gZnRwLmtlcm5lbC5vcmcuCitGRUFUCisyMTEtRmVhdHVyZXM6CisgRVBSVAorIEVQU1YKKyBNRFRNCisgUEFTVgorIFJFU1QgU1RSRUFNCisgU0laRQorIFRWRlMKKyBVVEY4CisyMTEgRW5kCitIRUxQCisyMTQtVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgcmVjb2duaXplZC4KKyBBQk9SIEFDQ1QgQUxMTyBBUFBFIENEVVAgQ1dEICBERUxFIEVQUlQgRVBTViBGRUFUIEhFTFAgTElTVCBNRFRNIE1LRAorIE1PREUgTkxTVCBOT09QIE9QVFMgUEFTUyBQQVNWIFBPUlQgUFdEICBRVUlUIFJFSU4gUkVTVCBSRVRSIFJNRCAgUk5GUgorIFJOVE8gU0lURSBTSVpFIFNNTlQgU1RBVCBTVE9SIFNUT1UgU1RSVSBTWVNUIFRZUEUgVVNFUiBYQ1VQIFhDV0QgWE1LRAorIFhQV0QgWFJNRAorMjE0IEhlbHAgT0suCisqLworc3RhdGljIHZvaWQKK2hhbmRsZV9mZWF0KHVuc2lnbmVkIHN0YXR1cykKK3sKKwljbWRpb193cml0ZShzdGF0dXMsICItRmVhdHVyZXM6Iik7CisJY21kaW9fd3JpdGVfcmF3KCIgRVBTVlxyXG4iCisJCQkiIFBBU1ZcclxuIgorCQkJIiBSRVNUIFNUUkVBTVxyXG4iCisJCQkiIE1EVE1cclxuIgorCQkJIiBTSVpFXHJcbiIpOworCWNtZGlvX3dyaXRlKHN0YXR1cywgIiBPayIpOworfQorCisvKiBEb3dubG9hZCBjb21tYW5kcyAqLworCitzdGF0aWMgaW5saW5lIGludAorcG9ydF9hY3RpdmUodm9pZCkKK3sKKwlyZXR1cm4gKEcucG9ydF9hZGRyICE9IE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lIGludAorcGFzdl9hY3RpdmUodm9pZCkKK3sKKwlyZXR1cm4gKEcucGFzdl9saXN0ZW5fZmQgPiBTVERPVVRfRklMRU5PKTsKK30KKworc3RhdGljIHZvaWQKK3BvcnRfcGFzdl9jbGVhbnVwKHZvaWQpCit7CisJZnJlZShHLnBvcnRfYWRkcik7CisJRy5wb3J0X2FkZHIgPSBOVUxMOworCWlmIChHLnBhc3ZfbGlzdGVuX2ZkID4gU1RET1VUX0ZJTEVOTykKKwkJY2xvc2UoRy5wYXN2X2xpc3Rlbl9mZCk7CisJRy5wYXN2X2xpc3Rlbl9mZCA9IC0xOworfQorCisvKiBPbiBlcnJvciwgZW1pdHMgZXJyb3IgY29kZSB0byB0aGUgcGVlciAqLworc3RhdGljIGludAorZnRwZGF0YWlvX2dldF9wYXN2X2ZkKHZvaWQpCit7CisJaW50IHJlbW90ZV9mZDsKKworCXJlbW90ZV9mZCA9IGFjY2VwdChHLnBhc3ZfbGlzdGVuX2ZkLCBOVUxMLCAwKTsKKworCWlmIChyZW1vdGVfZmQgPCAwKSB7CisJCVdSSVRFX0VSUihGVFBfQkFEU0VORENPTk4pOworCQlyZXR1cm4gcmVtb3RlX2ZkOworCX0KKworCXNldHNvY2tvcHQocmVtb3RlX2ZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisJcmV0dXJuIHJlbW90ZV9mZDsKK30KKworLyogQ2xlYXJzIHBvcnQvcGFzdiBkYXRhLgorICogVGhpcyBtZWFucyB3ZSBkb250IHdhc3RlIHJlc291cmNlcywgZm9yIGV4YW1wbGUsIGtlZXBpbmcKKyAqIFBBU1YgbGlzdGVuaW5nIHNvY2tldCBvcGVuIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqIE9uIGVycm9yLCBlbWl0cyBlcnJvciBjb2RlIHRvIHRoZSBwZWVyIChvciBleGl0cykuCisgKiBPbiBzdWNjZXNzLCBlbWl0cyBwX3N0YXR1c19tc2cgdG8gdGhlIHBlZXIuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9yZW1vdGVfdHJhbnNmZXJfZmQoY29uc3QgY2hhciAqcF9zdGF0dXNfbXNnKQoreworCWludCByZW1vdGVfZmQ7CisKKwlpZiAocGFzdl9hY3RpdmUoKSkKKwkJLyogT24gZXJyb3IsIGVtaXRzIGVycm9yIGNvZGUgdG8gdGhlIHBlZXIgKi8KKwkJcmVtb3RlX2ZkID0gZnRwZGF0YWlvX2dldF9wYXN2X2ZkKCk7CisJZWxzZQorCQkvKiBFeGl0cyBvbiBlcnJvciAqLworCQlyZW1vdGVfZmQgPSB4Y29ubmVjdF9zdHJlYW0oRy5wb3J0X2FkZHIpOworCisJcG9ydF9wYXN2X2NsZWFudXAoKTsKKworCWlmIChyZW1vdGVfZmQgPCAwKQorCQlyZXR1cm4gcmVtb3RlX2ZkOworCisJY21kaW9fd3JpdGUoU1RSTlVNMzIoRlRQX0RBVEFDT05OKSwgcF9zdGF0dXNfbXNnKTsKKwlyZXR1cm4gcmVtb3RlX2ZkOworfQorCisvKiBJZiB0aGVyZSB3ZXJlIG5laXRoZXIgUEFTViBub3IgUE9SVCwgZW1pdHMgZXJyb3IgY29kZSB0byB0aGUgcGVlciAqLworc3RhdGljIGludAorcG9ydF9vcl9wYXN2X3dhc19zZWVuKHZvaWQpCit7CisJaWYgKCFwYXN2X2FjdGl2ZSgpICYmICFwb3J0X2FjdGl2ZSgpKSB7CisJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX0JBRFNFTkRDT05OKSIgVXNlIFBPUlQvUEFTViBmaXJzdFxyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdW5zaWduZWQKK2JpbmRfZm9yX3Bhc3NpdmVfbW9kZSh2b2lkKQoreworCWludCBmZDsKKwl1bnNpZ25lZCBwb3J0OworCisJcG9ydF9wYXN2X2NsZWFudXAoKTsKKworCUcucGFzdl9saXN0ZW5fZmQgPSBmZCA9IHhzb2NrZXQoRy5sb2NhbF9hZGRyLT51LnNhLnNhX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworCXNldHNvY2tvcHRfcmV1c2VhZGRyKGZkKTsKKworCXNldF9ucG9ydCgmRy5sb2NhbF9hZGRyLT51LnNhLCAwKTsKKwl4YmluZChmZCwgJkcubG9jYWxfYWRkci0+dS5zYSwgRy5sb2NhbF9hZGRyLT5sZW4pOworCXhsaXN0ZW4oZmQsIDEpOworCWdldHNvY2tuYW1lKGZkLCAmRy5sb2NhbF9hZGRyLT51LnNhLCAmRy5sb2NhbF9hZGRyLT5sZW4pOworCisJcG9ydCA9IGdldF9ucG9ydCgmRy5sb2NhbF9hZGRyLT51LnNhKTsKKwlwb3J0ID0gbnRvaHMocG9ydCk7CisJcmV0dXJuIHBvcnQ7Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZAoraGFuZGxlX3Bhc3Yodm9pZCkKK3sKKwl1bnNpZ25lZCBwb3J0OworCWNoYXIgKmFkZHIsICpyZXNwb25zZTsKKworCXBvcnQgPSBiaW5kX2Zvcl9wYXNzaXZlX21vZGUoKTsKKworCWlmIChHLmxvY2FsX2FkZHItPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpCisJCWFkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoJkcubG9jYWxfYWRkci0+dS5zYSk7CisJZWxzZSAvKiBzZWVuIHRoaXMgaW4gdGhlIHdpbGQgZG9uZSBieSBvdGhlciBmdHAgc2VydmVyczogKi8KKwkJYWRkciA9IHhzdHJkdXAoIjAuMC4wLjAiKTsKKwlyZXBsYWNlX2NoYXIoYWRkciwgJy4nLCAnLCcpOworCisJcmVzcG9uc2UgPSB4YXNwcmludGYoU1RSKEZUUF9QQVNWT0spIiBQQVNWIG9rICglcywldSwldSlcclxuIiwKKwkJCWFkZHIsIChpbnQpKHBvcnQgPj4gOCksIChpbnQpKHBvcnQgJiAyNTUpKTsKKwlmcmVlKGFkZHIpOworCWNtZGlvX3dyaXRlX3JhdyhyZXNwb25zZSk7CisJZnJlZShyZXNwb25zZSk7Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZAoraGFuZGxlX2Vwc3Yodm9pZCkKK3sKKwl1bnNpZ25lZCBwb3J0OworCWNoYXIgKnJlc3BvbnNlOworCisJcG9ydCA9IGJpbmRfZm9yX3Bhc3NpdmVfbW9kZSgpOworCXJlc3BvbnNlID0geGFzcHJpbnRmKFNUUihGVFBfRVBTVk9LKSIgRVBTViBvayAofHx8JXV8KVxyXG4iLCBwb3J0KTsKKwljbWRpb193cml0ZV9yYXcocmVzcG9uc2UpOworCWZyZWUocmVzcG9uc2UpOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3BvcnQodm9pZCkKK3sKKwl1bnNpZ25lZCBwb3J0LCBwb3J0X2hpOworCWNoYXIgKnJhdywgKmNvbW1hOworI2lmZGVmIFdIWV9CT1RIRVJfV0VfQ0FOX0FTU1VNRV9JUF9NQVRDSEVTCisJc29ja2xlbl90IHBlZXJfaXB2NF9sZW47CisJc3RydWN0IHNvY2thZGRyX2luIHBlZXJfaXB2NDsKKwlzdHJ1Y3QgaW5fYWRkciBwb3J0X2lwdjRfc2luX2FkZHI7CisjZW5kaWYKKworCXBvcnRfcGFzdl9jbGVhbnVwKCk7CisKKwlyYXcgPSBHLmZ0cF9hcmc7CisKKwkvKiBQT1JUIGNvbW1hbmQgZm9ybWF0IG1ha2VzIHNlbnNlIG9ubHkgb3ZlciBJUHY0ICovCisJaWYgKCFyYXcKKyNpZmRlZiBXSFlfQk9USEVSX1dFX0NBTl9BU1NVTUVfSVBfTUFUQ0hFUworCSB8fCBHLmxvY2FsX2FkZHItPnUuc2Euc2FfZmFtaWx5ICE9IEFGX0lORVQKKyNlbmRpZgorCSkgeworIGJhaWw6CisJCVdSSVRFX0VSUihGVFBfQkFEQ01EKTsKKwkJcmV0dXJuOworCX0KKworCWNvbW1hID0gc3RycmNocihyYXcsICcsJyk7CisJaWYgKGNvbW1hID09IE5VTEwpCisJCWdvdG8gYmFpbDsKKwkqY29tbWEgPSAnXDAnOworCXBvcnQgPSBiYl9zdHJ0b3UoJmNvbW1hWzFdLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vIHx8IHBvcnQgPiAweGZmKQorCQlnb3RvIGJhaWw7CisKKwljb21tYSA9IHN0cnJjaHIocmF3LCAnLCcpOworCWlmIChjb21tYSA9PSBOVUxMKQorCQlnb3RvIGJhaWw7CisJKmNvbW1hID0gJ1wwJzsKKwlwb3J0X2hpID0gYmJfc3RydG91KCZjb21tYVsxXSwgTlVMTCwgMTApOworCWlmIChlcnJubyB8fCBwb3J0X2hpID4gMHhmZikKKwkJZ290byBiYWlsOworCXBvcnQgfD0gcG9ydF9oaSA8PCA4OworCisjaWZkZWYgV0hZX0JPVEhFUl9XRV9DQU5fQVNTVU1FX0lQX01BVENIRVMKKwlyZXBsYWNlX2NoYXIocmF3LCAnLCcsICcuJyk7CisKKwkvKiBXZSBhcmUgdmVyaWZ5aW5nIHRoYXQgUE9SVCdzIElQIG1hdGNoZXMgZ2V0cGVlcm5hbWUoKS4KKwkgKiBPdGhlcndpc2UgcGVlciBjYW4gbWFrZSB1cyBvcGVuIGRhdGEgY29ubmVjdGlvbnMKKwkgKiB0byBvdGhlciBob3N0cyAoc2VjdXJpdHkgcHJvYmxlbSEpCisJICogVGhpcyBjb2RlIHdvdWxkIGJlIHRvbyBzaW1wbGlzdGljOgorCSAqIGxzYSA9IHhkb3R0ZWQyc29ja2FkZHIocmF3LCBwb3J0KTsKKwkgKiBpZiAobHNhID09IE5VTEwpIGdvdG8gYmFpbDsKKwkgKi8KKwlpZiAoIWluZXRfYXRvbihyYXcsICZwb3J0X2lwdjRfc2luX2FkZHIpKQorCQlnb3RvIGJhaWw7CisJcGVlcl9pcHY0X2xlbiA9IHNpemVvZihwZWVyX2lwdjQpOworCWlmIChnZXRwZWVybmFtZShTVERJTl9GSUxFTk8sICZwZWVyX2lwdjQsICZwZWVyX2lwdjRfbGVuKSAhPSAwKQorCQlnb3RvIGJhaWw7CisJaWYgKG1lbWNtcCgmcG9ydF9pcHY0X3Npbl9hZGRyLCAmcGVlcl9pcHY0LnNpbl9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSAhPSAwKQorCQlnb3RvIGJhaWw7CisKKwlHLnBvcnRfYWRkciA9IHhkb3R0ZWQyc29ja2FkZHIocmF3LCBwb3J0KTsKKyNlbHNlCisJRy5wb3J0X2FkZHIgPSBnZXRfcGVlcl9sc2EoU1RESU5fRklMRU5PKTsKKwlzZXRfbnBvcnQoJkcucG9ydF9hZGRyLT51LnNhLCBodG9ucyhwb3J0KSk7CisjZW5kaWYKKwlXUklURV9PSyhGVFBfUE9SVE9LKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9yZXN0KHZvaWQpCit7CisJLyogV2hlbiBmdHBfYXJnID09IE5VTEwgc2ltcGx5IHJlc3RhcnQgZnJvbSBiZWdpbm5pbmcgKi8KKwlHLnJlc3RhcnRfcG9zID0gRy5mdHBfYXJnID8geGF0b2lfcG9zaXRpdmUoRy5mdHBfYXJnKSA6IDA7CisJV1JJVEVfT0soRlRQX1JFU1RPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcmV0cih2b2lkKQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJb2ZmX3QgYnl0ZXNfdHJhbnNmZXJyZWQ7CisJaW50IHJlbW90ZV9mZDsKKwlpbnQgbG9jYWxfZmlsZV9mZDsKKwlvZmZfdCBvZmZzZXQgPSBHLnJlc3RhcnRfcG9zOworCWNoYXIgKnJlc3BvbnNlOworCisJRy5yZXN0YXJ0X3BvcyA9IDA7CisKKwlpZiAoIXBvcnRfb3JfcGFzdl93YXNfc2VlbigpKQorCQlyZXR1cm47IC8qIHBvcnRfb3JfcGFzdl93YXNfc2VlbiBlbWl0dGVkIGVycm9yIHJlc3BvbnNlICovCisKKwkvKiBPX05PTkJMT0NLIGlzIHVzZWZ1bCBpZiBmaWxlIGhhcHBlbnMgdG8gYmUgYSBkZXZpY2Ugbm9kZSAqLworCWxvY2FsX2ZpbGVfZmQgPSBHLmZ0cF9hcmcgPyBvcGVuKEcuZnRwX2FyZywgT19SRE9OTFkgfCBPX05PTkJMT0NLKSA6IC0xOworCWlmIChsb2NhbF9maWxlX2ZkIDwgMCkgeworCQlXUklURV9FUlIoRlRQX0ZJTEVGQUlMKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmc3RhdChsb2NhbF9maWxlX2ZkLCAmc3RhdGJ1ZikgIT0gMCB8fCAhU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpKSB7CisJCS8qIE5vdGUgLSBwcmV0ZW5kIG9wZW4gZmFpbGVkICovCisJCVdSSVRFX0VSUihGVFBfRklMRUZBSUwpOworCQlnb3RvIGZpbGVfY2xvc2Vfb3V0OworCX0KKwlHLmxvY2FsX2ZpbGVfZmQgPSBsb2NhbF9maWxlX2ZkOworCisJLyogTm93IGRlYWN0aXZlIE9fTk9OQkxPQ0ssIG90aGVyd2lzZSB3ZSBoYXZlIGEgcHJvYmxlbQorCSAqIG9uIERNQVBJIGZpbGVzeXN0ZW1zIHN1Y2ggYXMgWEZTIERNQVBJLgorCSAqLworCW5kZWxheV9vZmYobG9jYWxfZmlsZV9mZCk7CisKKwkvKiBTZXQgdGhlIGRvd25sb2FkIG9mZnNldCAoZnJvbSBSRVNUKSBpZiBhbnkgKi8KKwlpZiAob2Zmc2V0ICE9IDApCisJCXhsc2Vlayhsb2NhbF9maWxlX2ZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKworCXJlc3BvbnNlID0geGFzcHJpbnRmKAorCQkiIE9wZW5pbmcgQklOQVJZIGNvbm5lY3Rpb24gZm9yICVzICglIk9GRl9GTVQidSBieXRlcykiLAorCQlHLmZ0cF9hcmcsIHN0YXRidWYuc3Rfc2l6ZSk7CisJcmVtb3RlX2ZkID0gZ2V0X3JlbW90ZV90cmFuc2Zlcl9mZChyZXNwb25zZSk7CisJZnJlZShyZXNwb25zZSk7CisJaWYgKHJlbW90ZV9mZCA8IDApCisJCWdvdG8gZmlsZV9jbG9zZV9vdXQ7CisKKwlieXRlc190cmFuc2ZlcnJlZCA9IGJiX2NvcHlmZF9lb2YobG9jYWxfZmlsZV9mZCwgcmVtb3RlX2ZkKTsKKwljbG9zZShyZW1vdGVfZmQpOworCWlmIChieXRlc190cmFuc2ZlcnJlZCA8IDApCisJCVdSSVRFX0VSUihGVFBfQkFEU0VOREZJTEUpOworCWVsc2UKKwkJV1JJVEVfT0soRlRQX1RSQU5TRkVST0spOworCisgZmlsZV9jbG9zZV9vdXQ6CisJY2xvc2UobG9jYWxfZmlsZV9mZCk7CisJRy5sb2NhbF9maWxlX2ZkID0gMDsKK30KKworLyogTGlzdCBjb21tYW5kcyAqLworCitzdGF0aWMgaW50Citwb3Blbl9scyhjb25zdCBjaGFyICpvcHQpCit7CisJY29uc3QgY2hhciAqYXJndls1XTsKKwlzdHJ1Y3QgZmRfcGFpciBvdXRmZDsKKwlwaWRfdCBwaWQ7CisKKwlhcmd2WzBdID0gImZ0cGQiOworCWFyZ3ZbMV0gPSBvcHQ7IC8qICItbCIgb3IgIi0xIiAqLworI2lmIEJCX01NVQorCWFyZ3ZbMl0gPSAiLS0iOworI2Vsc2UKKwkvKiBOT01NVSBmdHBkIGxzIGhlbHBlciBjaGRpcnMgdG8gYXJndlsyXSwKKwkgKiBwcmV2ZW50aW5nIHBlZXIgZnJvbSBzZWVpbmcgcmVhbCByb290LiAqLworCWFyZ3ZbMl0gPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihOVUxMKTsKKyNlbmRpZgorCWFyZ3ZbM10gPSBHLmZ0cF9hcmc7CisJYXJndls0XSA9IE5VTEw7CisKKwkvKiBJbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCBub24tUkZDIGNvbmZvcm1pbmcgRlRQIGNsaWVudHMKKwkgKiB3aGljaCBzZW5kIGUuZy4gIkxJU1QgLWwiLCAiTElTVCAtbGEiLCAiTElTVCAtYUwiLgorCSAqIFNlZSBodHRwczovL2J1Z3Mua2RlLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk1NTc4ICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0ZUUERfQUNDRVBUX0JST0tFTl9MSVNUCisJICYmIEcuZnRwX2FyZyAmJiBHLmZ0cF9hcmdbMF0gPT0gJy0nCisJKSB7CisJCWNvbnN0IGNoYXIgKnRtcCA9IHN0cmNocihHLmZ0cF9hcmcsICcgJyk7CisJCWlmICh0bXApIC8qIHNraXAgdGhlIHNwYWNlICovCisJCQl0bXArKzsKKwkJYXJndlszXSA9IHRtcDsKKwl9CisKKwl4cGlwZWRfcGFpcihvdXRmZCk7CisKKwkvKmZmbHVzaF9hbGwoKTsgLSBzbyBmYXIgd2UgZG9udCB1c2Ugc3RkaW8gb24gb3V0cHV0ICovCisJcGlkID0gQkJfTU1VID8geGZvcmsoKSA6IHh2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBjaGlsZCAqLworI2lmICFCQl9NTVUKKwkJLyogT24gTk9NTVUsIHdlIHdhbnQgdG8gZXhlY3V0ZSBhIGNoaWxkIC0gY29weSBvZiBvdXJzZWxmLgorCQkgKiBJbiBjaHJvb3Qgd2UgdXN1YWxseSBjYW4ndCBkbyBpdC4gVGh1cyB3ZSBjaGRpcgorCQkgKiBvdXQgb2YgdGhlIGNocm9vdCBiYWNrIHRvIG9yaWdpbmFsIHJvb3QsCisJCSAqIGFuZCAoc2VlIGxhdGVyIGJlbG93KSBleGVjdXRlIGJiX2J1c3lib3hfZXhlY19wYXRoCisJCSAqIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5ICovCisJCWlmIChmY2hkaXIoRy5yb290X2ZkKSAhPSAwKQorCQkJX2V4aXQoMTI3KTsKKwkJLypjbG9zZShHLnJvb3RfZmQpOyAtIGNsb3NlX29uX2V4ZWNfb24oKSB0b29rIGNhcmUgb2YgdGhpcyAqLworI2VuZGlmCisJCS8qIE5COiBjbG9zZSBfZmlyc3RfLCB0aGVuIG1vdmUgZmQhICovCisJCWNsb3NlKG91dGZkLnJkKTsKKwkJeG1vdmVfZmQob3V0ZmQud3IsIFNURE9VVF9GSUxFTk8pOworCQkvKiBPcGVuaW5nIC9kZXYvbnVsbCBpbiBjaHJvb3QgaXMgaGFyZC4KKwkJICogSnVzdCBtYWtpbmcgc3VyZSBTVERJTl9GSUxFTk8gaXMgb3BlbmVkCisJCSAqIHRvIHNvbWV0aGluZyBoYXJtbGVzcy4gUGFyYW5vaWEsCisJCSAqIGxzIHdvbid0IHJlYWQgaXQgYW55d2F5ICovCisJCWNsb3NlKFNURElOX0ZJTEVOTyk7CisJCWR1cChTVERPVVRfRklMRU5PKTsgLyogY29weSB3aWxsIGJlY29tZSBTVERJTl9GSUxFTk8gKi8KKyNpZiBCQl9NTVUKKwkJLyogbWVtc2V0KCZHLCAwLCBzaXplb2YoRykpOyAtIGxzX21haW4gZG9lcyBpdCAqLworCQlleGl0KGxzX21haW4oQVJSQVlfU0laRShhcmd2KSAtIDEsIChjaGFyKiopIGFyZ3YpKTsKKyNlbHNlCisJCS8qICsgMTogd2UgbXVzdCB1c2UgcmVsYXRpdmUgcGF0aCBoZXJlIGlmIGluIGNocm9vdC4KKwkJICogRm9yIGV4YW1wbGUsIGV4ZWN2KCIvcHJvYy9zZWxmL2V4ZSIpIHdpbGwgZmFpbCwgc2luY2UKKwkJICogaXQgbG9va3MgZm9yICIvcHJvYy9zZWxmL2V4ZSIgX3JlbGF0aXZlIHRvIGNocm9vdCFfICovCisJCWV4ZWN2KGJiX2J1c3lib3hfZXhlY19wYXRoICsgMSwgKGNoYXIqKikgYXJndik7CisJCV9leGl0KDEyNyk7CisjZW5kaWYKKwl9CisKKwkvKiBwYXJlbnQgKi8KKwljbG9zZShvdXRmZC53cik7CisjaWYgIUJCX01NVQorCWZyZWUoKGNoYXIqKWFyZ3ZbMl0pOworI2VuZGlmCisJcmV0dXJuIG91dGZkLnJkOworfQorCitlbnVtIHsKKwlVU0VfQ1RSTF9DT05OID0gMSwKKwlMT05HX0xJU1RJTkcgPSAyLAorfTsKKworc3RhdGljIHZvaWQKK2hhbmRsZV9kaXJfY29tbW9uKGludCBvcHRzKQoreworCUZJTEUgKmxzX2ZwOworCWNoYXIgKmxpbmU7CisJaW50IGxzX2ZkOworCisJaWYgKCEob3B0cyAmIFVTRV9DVFJMX0NPTk4pICYmICFwb3J0X29yX3Bhc3Zfd2FzX3NlZW4oKSkKKwkJcmV0dXJuOyAvKiBwb3J0X29yX3Bhc3Zfd2FzX3NlZW4gZW1pdHRlZCBlcnJvciByZXNwb25zZSAqLworCisJLyogLW4gcHJldmVudHMgdXNlci9ncm91cG5hbWUgZGlzcGxheSwKKwkgKiB3aGljaCBjYW4gYmUgcHJvYmxlbWF0aWMgaW4gY2hyb290ICovCisJbHNfZmQgPSBwb3Blbl9scygob3B0cyAmIExPTkdfTElTVElORykgPyAiLWwiIDogIi0xIik7CisJbHNfZnAgPSB4ZmRvcGVuX2Zvcl9yZWFkKGxzX2ZkKTsKKworCWlmIChvcHRzICYgVVNFX0NUUkxfQ09OTikgeworCQkvKiBTVEFUIDxmaWxlbmFtZT4gKi8KKwkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfU1RBVEZJTEVfT0spIi1GaWxlIHN0YXR1czpcclxuIik7CisJCXdoaWxlICgxKSB7CisJCQlsaW5lID0geG1hbGxvY19mZ2V0bGluZShsc19mcCk7CisJCQlpZiAoIWxpbmUpCisJCQkJYnJlYWs7CisJCQkvKiBIYWNrOiAwIHJlc3VsdHMgaW4gbm8gc3RhdHVzIGF0IGFsbCAqLworCQkJLyogTm90ZTogaXQncyBvayB0aGF0IHdlIGRvbid0IHByZXBlbmQgc3BhY2UsCisJCQkgKiBmdHAua2VybmVsLm9yZyBkb2Vzbid0IGRvIHRoYXQgdG9vICovCisJCQljbWRpb193cml0ZSgwLCBsaW5lKTsKKwkJCWZyZWUobGluZSk7CisJCX0KKwkJV1JJVEVfT0soRlRQX1NUQVRGSUxFX09LKTsKKwl9IGVsc2UgeworCQkvKiBMSVNUL05MU1QgWzxmaWxlbmFtZT5dICovCisJCWludCByZW1vdGVfZmQgPSBnZXRfcmVtb3RlX3RyYW5zZmVyX2ZkKCIgRGlyZWN0b3J5IGxpc3RpbmciKTsKKwkJaWYgKHJlbW90ZV9mZCA+PSAwKSB7CisJCQl3aGlsZSAoMSkgeworCQkJCWxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGxzX2ZwKTsKKwkJCQlpZiAoIWxpbmUpCisJCQkJCWJyZWFrOworCQkJCS8qIEkndmUgc2VlbiBjbGllbnRzIGNvbXBsYWluaW5nIHdoZW4gdGhleQorCQkJCSAqIGFyZSBmZWQgd2l0aCBscyBvdXRwdXQgd2l0aCBiYXJlICdcbicuCisJCQkJICogUGl0eS4uLiB0aGF0IHdvdWxkIGJlIG11Y2ggc2ltcGxlci4KKwkJCQkgKi8KKy8qIFRPRE86IG5lZWQgdG8gcy9MRi9OVUwvZyBoZXJlICovCisJCQkJeHdyaXRlX3N0cihyZW1vdGVfZmQsIGxpbmUpOworCQkJCXh3cml0ZShyZW1vdGVfZmQsICJcclxuIiwgMik7CisJCQkJZnJlZShsaW5lKTsKKwkJCX0KKwkJfQorCQljbG9zZShyZW1vdGVfZmQpOworCQlXUklURV9PSyhGVFBfVFJBTlNGRVJPSyk7CisJfQorCWZjbG9zZShsc19mcCk7IC8qIGNsb3NlcyBsc19mZCB0b28gKi8KK30KK3N0YXRpYyB2b2lkCitoYW5kbGVfbGlzdCh2b2lkKQoreworCWhhbmRsZV9kaXJfY29tbW9uKExPTkdfTElTVElORyk7Cit9CitzdGF0aWMgdm9pZAoraGFuZGxlX25sc3Qodm9pZCkKK3sKKwkvKiBOTFNUIHJldHVybnMgbGlzdCBvZiBuYW1lcywgIlxyXG4iIHRlcm1pbmF0ZWQgd2l0aG91dCByZWdhcmQKKwkgKiB0byB0aGUgY3VycmVudCBiaW5hcnkgZmxhZy4gTmFtZXMgbWF5IHN0YXJ0IHdpdGggIi8iLAorCSAqIHRoZW4gdGhleSByZXByZXNlbnQgZnVsbCBuYW1lcyAod2UgZG9uJ3QgcHJvZHVjZSBzdWNoIG5hbWVzKSwKKwkgKiBvdGhlcndpc2UgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5LgorCSAqIEVtYmVkZGVkICJcbiIgYXJlIHJlcGxhY2VkIGJ5IE5VTHMuIFRoaXMgaXMgc2FmZSBzaW5jZSBuYW1lcworCSAqIGNhbiBuZXZlciBjb250YWluIE5VTC4KKwkgKi8KKwloYW5kbGVfZGlyX2NvbW1vbigwKTsKK30KK3N0YXRpYyB2b2lkCitoYW5kbGVfc3RhdF9maWxlKHZvaWQpCit7CisJaGFuZGxlX2Rpcl9jb21tb24oTE9OR19MSVNUSU5HICsgVVNFX0NUUkxfQ09OTik7Cit9CisKKy8qIFRoaXMgY2FuIGJlIGV4dGVuZGVkIHRvIGhhbmRsZSBNTFNULCBhcyBhbGwgaW5mbyBpcyBhdmFpbGFibGUKKyAqIGluIHN0cnVjdCBzdGF0IGZvciB0aGF0OgorICogTUxTVCBmaWxlX25hbWUKKyAqIDI1MC1MaXN0aW5nIGZpbGVfbmFtZQorICogIHR5cGU9ZmlsZTtzaXplPTQxNjE7bW9kaWZ5PTE5OTcwMjE0MTY1ODAwOyAvZGlyL2Rpci9maWxlX25hbWUKKyAqIDI1MCBFbmQKKyAqIE5hbm8tZG9jOgorICogTUxTVCBbPGZpbGUgb3IgZGlyIG5hbWUsICIuIiBhc3N1bWVkIGlmIG5vdCBnaXZlbj5dCisgKiBSZXR1cm5lZCBuYW1lIHNob3VsZCBiZSBlaXRoZXIgdGhlIHNhbWUgYXMgcmVxdWVzdGVkLCBvciBmdWxseSBxdWFsaWZpZWQuCisgKiBJZiB0aGVyZSB3YXMgbm8gcGFyYW1ldGVyLCByZXR1cm4gIiIgb3IgKHByZWZlcnJlZCkgZnVsbHktcXVhbGlmaWVkIG5hbWUuCisgKiBSZXR1cm5lZCAiZmFjdHMiIChjYXNlIGlzIG5vdCBpbXBvcnRhbnQpOgorICogIHNpemUgICAgLSBzaXplIGluIG9jdGV0cworICogIG1vZGlmeSAgLSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lCisgKiAgdHlwZSAgICAtIGVudHJ5IHR5cGUgKGZpbGUsZGlyLE9TLnVuaXg9YmxvY2spCisgKiAgICAgICAgICAgICgrIGNkaXIgYW5kIHBkaXIgdHlwZXMgZm9yIE1MU0QpCisgKiAgdW5pcXVlICAtIHVuaXF1ZSBpZCBvZiBmaWxlL2RpcmVjdG9yeSAoaW5vZGUjKQorICogIHBlcm0gICAgLQorICogICAgICBhOiBjYW4gYmUgYXBwZW5kZWQgdG8gKEFQUEUpCisgKiAgICAgIGQ6IGNhbiBiZSBkZWxldGVkIChSTUQvREVMRSkKKyAqICAgICAgZjogY2FuIGJlIHJlbmFtZWQgKFJORlIpCisgKiAgICAgIHI6IGNhbiBiZSByZWFkIChSRVRSKQorICogICAgICB3OiBjYW4gYmUgd3JpdHRlbiAoU1RPUikKKyAqICAgICAgZTogY2FuIENXRCBpbnRvIHRoaXMgZGlyCisgKiAgICAgIGw6IHRoaXMgZGlyIGNhbiBiZSBsaXN0ZWQgKGRpciBvbmx5ISkKKyAqICAgICAgYzogY2FuIGNyZWF0ZSBmaWxlcyBpbiB0aGlzIGRpcgorICogICAgICBtOiBjYW4gY3JlYXRlIGRpcnMgaW4gdGhpcyBkaXIgKE1LRCkKKyAqICAgICAgcDogY2FuIGRlbGV0ZSBmaWxlcyBpbiB0aGlzIGRpcgorICogIFVOSVgubW9kZSAtIHVuaXggZmlsZSBtb2RlCisgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfc2l6ZV9vcl9tZHRtKGludCBuZWVkX3NpemUpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlzdHJ1Y3QgdG0gYnJva2VuX291dDsKKwljaGFyIGJ1Zlsoc2l6ZW9mKCJOTk4gJSJPRkZfRk1UInVcclxuIikgKyBzaXplb2Yob2ZmX3QpICogMykKKwkJfCBzaXplb2YoIk5OTiBZWVlZTU1ERGhobW1zc1xyXG4iKQorCV07CisKKwlpZiAoIUcuZnRwX2FyZworCSB8fCBzdGF0KEcuZnRwX2FyZywgJnN0YXRidWYpICE9IDAKKwkgfHwgIVNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKQorCSkgeworCQlXUklURV9FUlIoRlRQX0ZJTEVGQUlMKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobmVlZF9zaXplKSB7CisJCXNwcmludGYoYnVmLCBTVFIoRlRQX1NUQVRGSUxFX09LKSIgJSJPRkZfRk1UInVcclxuIiwgc3RhdGJ1Zi5zdF9zaXplKTsKKwl9IGVsc2UgeworCQlnbXRpbWVfcigmc3RhdGJ1Zi5zdF9tdGltZSwgJmJyb2tlbl9vdXQpOworCQlzcHJpbnRmKGJ1ZiwgU1RSKEZUUF9TVEFURklMRV9PSykiICUwNHUlMDJ1JTAydSUwMnUlMDJ1JTAydVxyXG4iLAorCQkJYnJva2VuX291dC50bV95ZWFyICsgMTkwMCwKKwkJCWJyb2tlbl9vdXQudG1fbW9uLAorCQkJYnJva2VuX291dC50bV9tZGF5LAorCQkJYnJva2VuX291dC50bV9ob3VyLAorCQkJYnJva2VuX291dC50bV9taW4sCisJCQlicm9rZW5fb3V0LnRtX3NlYyk7CisJfQorCWNtZGlvX3dyaXRlX3JhdyhidWYpOworfQorCisvKiBVcGxvYWQgY29tbWFuZHMgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUF9XUklURQorc3RhdGljIHZvaWQKK2hhbmRsZV9ta2Qodm9pZCkKK3sKKwlpZiAoIUcuZnRwX2FyZyB8fCBta2RpcihHLmZ0cF9hcmcsIDA3NzcpICE9IDApIHsKKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfT0soRlRQX01LRElST0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3JtZCh2b2lkKQoreworCWlmICghRy5mdHBfYXJnIHx8IHJtZGlyKEcuZnRwX2FyZykgIT0gMCkgeworCQlXUklURV9FUlIoRlRQX0ZJTEVGQUlMKTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9PSyhGVFBfUk1ESVJPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfZGVsZSh2b2lkKQoreworCWlmICghRy5mdHBfYXJnIHx8IHVubGluayhHLmZ0cF9hcmcpICE9IDApIHsKKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfT0soRlRQX0RFTEVPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcm5mcih2b2lkKQoreworCWZyZWUoRy5ybmZyX2ZpbGVuYW1lKTsKKwlHLnJuZnJfZmlsZW5hbWUgPSB4c3RyZHVwKEcuZnRwX2FyZyk7CisJV1JJVEVfT0soRlRQX1JORlJPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcm50byh2b2lkKQoreworCWludCByZXR2YWw7CisKKwkvKiBJZiB3ZSBkaWRuJ3QgZ2V0IGEgUk5GUiwgdGhyb3cgYSB3b2JibHkgKi8KKwlpZiAoRy5ybmZyX2ZpbGVuYW1lID09IE5VTEwgfHwgRy5mdHBfYXJnID09IE5VTEwpIHsKKwkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfTkVFRFJORlIpIiBVc2UgUk5GUiBmaXJzdFxyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJldHZhbCA9IHJlbmFtZShHLnJuZnJfZmlsZW5hbWUsIEcuZnRwX2FyZyk7CisJZnJlZShHLnJuZnJfZmlsZW5hbWUpOworCUcucm5mcl9maWxlbmFtZSA9IE5VTEw7CisKKwlpZiAocmV0dmFsKSB7CisJCVdSSVRFX0VSUihGVFBfRklMRUZBSUwpOworCQlyZXR1cm47CisJfQorCVdSSVRFX09LKEZUUF9SRU5BTUVPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfdXBsb2FkX2NvbW1vbihpbnQgaXNfYXBwZW5kLCBpbnQgaXNfdW5pcXVlKQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJY2hhciAqdGVtcG5hbWU7CisJb2ZmX3QgYnl0ZXNfdHJhbnNmZXJyZWQ7CisJb2ZmX3Qgb2Zmc2V0OworCWludCBsb2NhbF9maWxlX2ZkOworCWludCByZW1vdGVfZmQ7CisKKwlvZmZzZXQgPSBHLnJlc3RhcnRfcG9zOworCUcucmVzdGFydF9wb3MgPSAwOworCisJaWYgKCFwb3J0X29yX3Bhc3Zfd2FzX3NlZW4oKSkKKwkJcmV0dXJuOyAvKiBwb3J0X29yX3Bhc3Zfd2FzX3NlZW4gZW1pdHRlZCBlcnJvciByZXNwb25zZSAqLworCisJdGVtcG5hbWUgPSBOVUxMOworCWxvY2FsX2ZpbGVfZmQgPSAtMTsKKwlpZiAoaXNfdW5pcXVlKSB7CisJCXRlbXBuYW1lID0geHN0cmR1cCgiIEZJTEU6IHVuaXEuWFhYWFhYIik7CisJCWxvY2FsX2ZpbGVfZmQgPSBta3N0ZW1wKHRlbXBuYW1lICsgNyk7CisJfSBlbHNlIGlmIChHLmZ0cF9hcmcpIHsKKwkJaW50IGZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKwkJaWYgKGlzX2FwcGVuZCkKKwkJCWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQ7CisJCWlmIChvZmZzZXQpCisJCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVDsKKwkJbG9jYWxfZmlsZV9mZCA9IG9wZW4oRy5mdHBfYXJnLCBmbGFncywgMDY2Nik7CisJfQorCisJaWYgKGxvY2FsX2ZpbGVfZmQgPCAwCisJIHx8IGZzdGF0KGxvY2FsX2ZpbGVfZmQsICZzdGF0YnVmKSAhPSAwCisJIHx8ICFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkKKwkpIHsKKwkJV1JJVEVfRVJSKEZUUF9VUExPQURGQUlMKTsKKwkJaWYgKGxvY2FsX2ZpbGVfZmQgPj0gMCkKKwkJCWdvdG8gY2xvc2VfbG9jYWxfYW5kX2JhaWw7CisJCXJldHVybjsKKwl9CisJRy5sb2NhbF9maWxlX2ZkID0gbG9jYWxfZmlsZV9mZDsKKworCWlmIChvZmZzZXQpCisJCXhsc2Vlayhsb2NhbF9maWxlX2ZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKworCXJlbW90ZV9mZCA9IGdldF9yZW1vdGVfdHJhbnNmZXJfZmQodGVtcG5hbWUgPyB0ZW1wbmFtZSA6ICIgT2sgdG8gc2VuZCBkYXRhIik7CisJZnJlZSh0ZW1wbmFtZSk7CisKKwlpZiAocmVtb3RlX2ZkIDwgMCkKKwkJZ290byBjbG9zZV9sb2NhbF9hbmRfYmFpbDsKKworCWJ5dGVzX3RyYW5zZmVycmVkID0gYmJfY29weWZkX2VvZihyZW1vdGVfZmQsIGxvY2FsX2ZpbGVfZmQpOworCWNsb3NlKHJlbW90ZV9mZCk7CisJaWYgKGJ5dGVzX3RyYW5zZmVycmVkIDwgMCkKKwkJV1JJVEVfRVJSKEZUUF9CQURTRU5ERklMRSk7CisJZWxzZQorCQlXUklURV9PSyhGVFBfVFJBTlNGRVJPSyk7CisKKyBjbG9zZV9sb2NhbF9hbmRfYmFpbDoKKwljbG9zZShsb2NhbF9maWxlX2ZkKTsKKwlHLmxvY2FsX2ZpbGVfZmQgPSAwOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3N0b3Iodm9pZCkKK3sKKwloYW5kbGVfdXBsb2FkX2NvbW1vbigwLCAwKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9hcHBlKHZvaWQpCit7CisJRy5yZXN0YXJ0X3BvcyA9IDA7CisJaGFuZGxlX3VwbG9hZF9jb21tb24oMSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfc3RvdSh2b2lkKQoreworCUcucmVzdGFydF9wb3MgPSAwOworCWhhbmRsZV91cGxvYWRfY29tbW9uKDAsIDEpOworfQorI2VuZGlmIC8qIEVOQUJMRV9GRUFUVVJFX0ZUUF9XUklURSAqLworCitzdGF0aWMgdWludDMyX3QKK2NtZGlvX2dldF9jbWRfYW5kX2FyZyh2b2lkKQoreworCWludCBsZW47CisJdWludDMyX3QgY21kdmFsOworCWNoYXIgKmNtZDsKKworCWFsYXJtKEcudGltZW91dCk7CisKKwlmcmVlKEcuZnRwX2NtZCk7CisJeworCQkvKiBQYXJhbm9pYS4gUGVlciBtYXkgc2VuZCAxIGdpZ2FieXRlIGxvbmcgY21kLi4uICovCisJCS8qIFVzaW5nIHNlcGFyYXRlIGxlbl9vbl9zdGsgaW5zdGVhZCBvZiBsZW4gb3B0aW1pemVzCisJCSAqIGNvZGUgc2l6ZSAoYWxsb3dzIGxlbiB0byBiZSBpbiBDUFUgcmVnaXN0ZXIpICovCisJCXNpemVfdCBsZW5fb25fc3RrID0gOCAqIDEwMjQ7CisJCUcuZnRwX2NtZCA9IGNtZCA9IHhtYWxsb2NfZmdldHNfc3RyX2xlbihzdGRpbiwgIlxyXG4iLCAmbGVuX29uX3N0ayk7CisJCWlmICghY21kKQorCQkJZXhpdCgwKTsKKwkJbGVuID0gbGVuX29uX3N0azsKKwl9CisKKwkvKiBEZS1lc2NhcGUgdGVsbmV0OiAweGZmLDB4ZmYgPT4gMHhmZiAqLworCS8qIFJGQzk1OSBzYXlzIHRoYXQgQUJPUiwgU1RBVCwgUVVJVCBtYXkgYmUgc2VudCBldmVuIGR1cmluZworCSAqIGRhdGEgdHJhbnNmZXIsIGFuZCBtYXkgYmUgcHJlY2VkZWQgYnkgdGVsbmV0J3MgIkludGVycnVwdCBQcm9jZXNzIgorCSAqIGNvZGUgKHR3by1ieXRlIHNlcXVlbmNlIDI1NSwyNDQpIGFuZCB0aGVuIGJ5IHRlbG5ldCAiU3luY2giIGNvZGUKKwkgKiAyNTUsMjQyIChieXRlIDI0MiBpcyBzZW50IHdpdGggVENQIFVSRyBiaXQgdXNpbmcgc2VuZChNU0dfT09CKQorCSAqIGFuZCBtYXkgZ2VuZXJhdGUgU0lHVVJHIG9uIG91ciBzaWRlLiBTZWUgUkZDODU0KS4KKwkgKiBTbyBmYXIgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0IChtYXkgaW5zdGFsbCBTSUdVUkcgaGFuZGxlciBpZiB3ZSdkIHdhbnQgdG8pLAorCSAqIGJ1dCB3ZSBuZWVkIHRvIGF0IGxlYXN0IHJlbW92ZSAyNTUseHh4IHBhaXJzLiBsZnRwIHNlbmRzIHRob3NlLiAqLworCS8qIFRoZW4gZGUtZXNjYXBlIEZUUDogTlVMID0+ICdcbicgKi8KKwkvKiBUZXN0aW5nIGZvciBceGZmOgorCSAqIENyZWF0ZSBmaWxlIG5hbWVkICdceGZmJzogZWNobyBIZWxsbyA+YGVjaG8gLW5lICJceGZmImAKKwkgKiBUcnkgdG8gZ2V0IGl0OiAgICAgICAgICAgIGZ0cGdldCAtdiAxMjcuMC4wLjEgRWZmIGBlY2hvIC1uZSAiXHhmZlx4ZmYiYAorCSAqIChuZWVkICJceGZmXHhmZiIgdW50aWwgZnRwZ2V0IGFwcGxldCBpcyBmaXhlZCB0byBkbyBlc2NhcGluZyA6KQorCSAqIFRlc3RpbmcgZm9yIGVtYmVkZGVkIExGOgorCSAqIExGX0hFUkU9YGVjaG8gLW5lICJMRlxuSEVSRSJgCisJICogZWNobyBIZWxsbyA+IiRMRl9IRVJFIgorCSAqIGZ0cGdldCAtdiAxMjcuMC4wLjEgTEZfSEVSRSAiJExGX0hFUkUiCisJICovCisJeworCQlpbnQgZHN0LCBzcmM7CisKKwkJLyogU3RyaXAgIlxyXG4iIGlmIGl0IGlzIHRoZXJlICovCisJCWlmIChsZW4gIT0gMCAmJiBjbWRbbGVuIC0gMV0gPT0gJ1xuJykgeworCQkJbGVuLS07CisJCQlpZiAobGVuICE9IDAgJiYgY21kW2xlbiAtIDFdID09ICdccicpCisJCQkJbGVuLS07CisJCQljbWRbbGVuXSA9ICdcMCc7CisJCX0KKwkJc3JjID0gc3RyY2hybnVsKGNtZCwgMHhmZikgLSBjbWQ7CisJCS8qIDk5LDk5JSB0aGVyZSBhcmUgbmVpdGhlciBOVUxzIG5vciAyNTVzIGFuZCBzcmMgPT0gbGVuICovCisJCWlmIChzcmMgPCBsZW4pIHsKKwkJCWRzdCA9IHNyYzsKKwkJCWRvIHsKKwkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKGNtZFtzcmNdKSA9PSAyNTUpIHsKKwkJCQkJc3JjKys7CisJCQkJCS8qIDI1NSx4eHggLSBza2lwIDI1NSAqLworCQkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKGNtZFtzcmNdKSAhPSAyNTUpIHsKKwkJCQkJCS8qIDI1NSwhMjU1IC0gc2tpcCBib3RoICovCisJCQkJCQlzcmMrKzsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCS8qIDI1NSwyNTUgLSByZXRhaW4gb25lIDI1NSAqLworCQkJCX0KKwkJCQkvKiBOVUwgPT4gJ1xuJyAqLworCQkJCWNtZFtkc3QrK10gPSBjbWRbc3JjXSA/IGNtZFtzcmNdIDogJ1xuJzsKKwkJCQlzcmMrKzsKKwkJCX0gd2hpbGUgKHNyYyA8IGxlbik7CisJCQljbWRbZHN0XSA9ICdcMCc7CisJCX0KKwl9CisKKwlpZiAoRy52ZXJib3NlID4gMSkKKwkJdmVyYm9zZV9sb2coY21kKTsKKworCUcuZnRwX2FyZyA9IHN0cmNocihjbWQsICcgJyk7CisJaWYgKEcuZnRwX2FyZyAhPSBOVUxMKQorCQkqRy5mdHBfYXJnKysgPSAnXDAnOworCisJLyogVXBwZXJjYXNlIGFuZCBwYWNrIGludG8gdWludDMyX3QgZmlyc3Qgd29yZCBvZiB0aGUgY29tbWFuZCAqLworCWNtZHZhbCA9IDA7CisJd2hpbGUgKCpjbWQpCisJCWNtZHZhbCA9IChjbWR2YWwgPDwgOCkgKyAoKHVuc2lnbmVkIGNoYXIpKmNtZCsrICYgKHVuc2lnbmVkIGNoYXIpfjB4MjApOworCisJcmV0dXJuIGNtZHZhbDsKK30KKworI2RlZmluZSBta19jb25zdDQoYSxiLGMsZCkgKCgoYSAqIDB4MTAwICsgYikgKiAweDEwMCArIGMpICogMHgxMDAgKyBkKQorI2RlZmluZSBta19jb25zdDMoYSxiLGMpICAgICgoYSAqIDB4MTAwICsgYikgKiAweDEwMCArIGMpCitlbnVtIHsKKwljb25zdF9BTExPID0gbWtfY29uc3Q0KCdBJywgJ0wnLCAnTCcsICdPJyksCisJY29uc3RfQVBQRSA9IG1rX2NvbnN0NCgnQScsICdQJywgJ1AnLCAnRScpLAorCWNvbnN0X0NEVVAgPSBta19jb25zdDQoJ0MnLCAnRCcsICdVJywgJ1AnKSwKKwljb25zdF9DV0QgID0gbWtfY29uc3QzKCdDJywgJ1cnLCAnRCcpLAorCWNvbnN0X0RFTEUgPSBta19jb25zdDQoJ0QnLCAnRScsICdMJywgJ0UnKSwKKwljb25zdF9FUFNWID0gbWtfY29uc3Q0KCdFJywgJ1AnLCAnUycsICdWJyksCisJY29uc3RfRkVBVCA9IG1rX2NvbnN0NCgnRicsICdFJywgJ0EnLCAnVCcpLAorCWNvbnN0X0hFTFAgPSBta19jb25zdDQoJ0gnLCAnRScsICdMJywgJ1AnKSwKKwljb25zdF9MSVNUID0gbWtfY29uc3Q0KCdMJywgJ0knLCAnUycsICdUJyksCisJY29uc3RfTURUTSA9IG1rX2NvbnN0NCgnTScsICdEJywgJ1QnLCAnTScpLAorCWNvbnN0X01LRCAgPSBta19jb25zdDMoJ00nLCAnSycsICdEJyksCisJY29uc3RfTU9ERSA9IG1rX2NvbnN0NCgnTScsICdPJywgJ0QnLCAnRScpLAorCWNvbnN0X05MU1QgPSBta19jb25zdDQoJ04nLCAnTCcsICdTJywgJ1QnKSwKKwljb25zdF9OT09QID0gbWtfY29uc3Q0KCdOJywgJ08nLCAnTycsICdQJyksCisJY29uc3RfUEFTUyA9IG1rX2NvbnN0NCgnUCcsICdBJywgJ1MnLCAnUycpLAorCWNvbnN0X1BBU1YgPSBta19jb25zdDQoJ1AnLCAnQScsICdTJywgJ1YnKSwKKwljb25zdF9QT1JUID0gbWtfY29uc3Q0KCdQJywgJ08nLCAnUicsICdUJyksCisJY29uc3RfUFdEICA9IG1rX2NvbnN0MygnUCcsICdXJywgJ0QnKSwKKwljb25zdF9RVUlUID0gbWtfY29uc3Q0KCdRJywgJ1UnLCAnSScsICdUJyksCisJY29uc3RfUkVTVCA9IG1rX2NvbnN0NCgnUicsICdFJywgJ1MnLCAnVCcpLAorCWNvbnN0X1JFVFIgPSBta19jb25zdDQoJ1InLCAnRScsICdUJywgJ1InKSwKKwljb25zdF9STUQgID0gbWtfY29uc3QzKCdSJywgJ00nLCAnRCcpLAorCWNvbnN0X1JORlIgPSBta19jb25zdDQoJ1InLCAnTicsICdGJywgJ1InKSwKKwljb25zdF9STlRPID0gbWtfY29uc3Q0KCdSJywgJ04nLCAnVCcsICdPJyksCisJY29uc3RfU0laRSA9IG1rX2NvbnN0NCgnUycsICdJJywgJ1onLCAnRScpLAorCWNvbnN0X1NUQVQgPSBta19jb25zdDQoJ1MnLCAnVCcsICdBJywgJ1QnKSwKKwljb25zdF9TVE9SID0gbWtfY29uc3Q0KCdTJywgJ1QnLCAnTycsICdSJyksCisJY29uc3RfU1RPVSA9IG1rX2NvbnN0NCgnUycsICdUJywgJ08nLCAnVScpLAorCWNvbnN0X1NUUlUgPSBta19jb25zdDQoJ1MnLCAnVCcsICdSJywgJ1UnKSwKKwljb25zdF9TWVNUID0gbWtfY29uc3Q0KCdTJywgJ1knLCAnUycsICdUJyksCisJY29uc3RfVFlQRSA9IG1rX2NvbnN0NCgnVCcsICdZJywgJ1AnLCAnRScpLAorCWNvbnN0X1VTRVIgPSBta19jb25zdDQoJ1UnLCAnUycsICdFJywgJ1InKSwKKworI2lmICFCQl9NTVUKKwlPUFRfbCA9ICgxIDw8IDApLAorCU9QVF8xID0gKDEgPDwgMSksCisjZW5kaWYKKwlPUFRfdiA9ICgxIDw8ICgoIUJCX01NVSkgKiAyICsgMCkpLAorCU9QVF9TID0gKDEgPDwgKCghQkJfTU1VKSAqIDIgKyAxKSksCisJT1BUX3cgPSAoMSA8PCAoKCFCQl9NTVUpICogMiArIDIpKSAqIEVOQUJMRV9GRUFUVVJFX0ZUUF9XUklURSwKK307CisKK2ludCBmdHBkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKyNpZiAhQkJfTU1VCitpbnQgZnRwZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyNlbHNlCitpbnQgZnRwZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCisjZW5kaWYKK3sKKwl1bnNpZ25lZCBhYnNfdGltZW91dDsKKwl1bnNpZ25lZCB2ZXJib3NlX1M7CisJc21hbGxpbnQgb3B0czsKKworCUlOSVRfRygpOworCisJYWJzX3RpbWVvdXQgPSAxICogNjAgKiA2MDsKKwl2ZXJib3NlX1MgPSAwOworCUcudGltZW91dCA9IDIgKiA2MDsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ0KzpUKzp2djpTUyI7CisjaWYgQkJfTU1VCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICAgInZTIiBJRl9GRUFUVVJFX0ZUUF9XUklURSgidyIpICJ0OlQ6IiwgJkcudGltZW91dCwgJmFic190aW1lb3V0LCAmRy52ZXJib3NlLCAmdmVyYm9zZV9TKTsKKyNlbHNlCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJsMXZTIiBJRl9GRUFUVVJFX0ZUUF9XUklURSgidyIpICJ0OlQ6IiwgJkcudGltZW91dCwgJmFic190aW1lb3V0LCAmRy52ZXJib3NlLCAmdmVyYm9zZV9TKTsKKwlpZiAob3B0cyAmIChPUFRfbHxPUFRfMSkpIHsKKwkJLyogT3VyIHNlY3JldCBiYWNrZG9vciB0byBscyAqLworLyogVE9ETzogcGFzcyAtbj8gSXQgcHJldmVudHMgdXNlci9ncm91cCByZXNvbHV0aW9uLCB3aGljaCBtYXkgbm90IHdvcmsgaW4gY2hyb290IGFueXdheSAqLworLyogVE9ETzogcGFzcyAtQT8gSXQgc2hvd3MgZG90IGZpbGVzICovCisvKiBUT0RPOiBwYXNzIC0tZ3JvdXAtZGlyZWN0b3JpZXMtZmlyc3Q/IHdvdWxkIGJlIG5pY2UsIGJ1dCBscyBkb2Vzbid0IGRvIHRoYXQgeWV0ICovCisJCXhjaGRpcihhcmd2WzJdKTsKKwkJYXJndlsyXSA9IChjaGFyKikiLS0iOworCQkvKiBtZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7IC0gbHNfbWFpbiBkb2VzIGl0ICovCisJCXJldHVybiBsc19tYWluKGFyZ2MsIGFyZ3YpOworCX0KKyNlbmRpZgorCWlmIChHLnZlcmJvc2UgPCB2ZXJib3NlX1MpCisJCUcudmVyYm9zZSA9IHZlcmJvc2VfUzsKKwlpZiAoYWJzX3RpbWVvdXQgfCBHLnRpbWVvdXQpIHsKKwkJaWYgKGFic190aW1lb3V0ID09IDApCisJCQlhYnNfdGltZW91dCA9IElOVF9NQVg7CisJCUcuZW5kX3RpbWUgPSBtb25vdG9uaWNfc2VjKCkgKyBhYnNfdGltZW91dDsKKwkJaWYgKEcudGltZW91dCA+IGFic190aW1lb3V0KQorCQkJRy50aW1lb3V0ID0gYWJzX3RpbWVvdXQ7CisJfQorCXN0cmNweShHLm1zZ19vayAgKyA0LCBNU0dfT0sgKTsKKwlzdHJjcHkoRy5tc2dfZXJyICsgNCwgTVNHX0VSUik7CisKKwlHLmxvY2FsX2FkZHIgPSBnZXRfc29ja19sc2EoU1RESU5fRklMRU5PKTsKKwlpZiAoIUcubG9jYWxfYWRkcikgeworCQkvKiBUaGlzIGlzIGNvbmZ1c2luZzoKKwkJICogYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0ZGluIGlzIG5vdCBhIHNvY2tldCIpOworCQkgKiBCZXR0ZXI6ICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJLyogSGVscCB0ZXh0IHNheXMgdGhhdCBmdHBkIG11c3QgYmUgdXNlZCBhcyBpbmV0ZCBzZXJ2aWNlLAorCQkgKiB3aGljaCBpcyBieSBmYXIgdGhlIG1vc3QgdXN1YWwgY2F1c2Ugb2YgZ2V0X3NvY2tfbHNhCisJCSAqIGZhaWx1cmUgKi8KKwl9CisKKwlpZiAoIShvcHRzICYgT1BUX3YpKQorCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOworCWlmIChvcHRzICYgT1BUX1MpIHsKKwkJLyogTE9HX05ERUxBWSBpcyBuZWVkZWQgc2luY2Ugd2UgbWF5IGNocm9vdCBsYXRlciAqLworCQlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfUElEIHwgTE9HX05ERUxBWSwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CisJfQorCWlmIChsb2dtb2RlKQorCQlhcHBsZXRfbmFtZSA9IHhhc3ByaW50ZigiJXNbJXVdIiwgYXBwbGV0X25hbWUsIChpbnQpZ2V0cGlkKCkpOworCisjaWYgIUJCX01NVQorCUcucm9vdF9mZCA9IHhvcGVuKCIvIiwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSk7CisJY2xvc2Vfb25fZXhlY19vbihHLnJvb3RfZmQpOworI2VuZGlmCisKKwlpZiAoYXJndltvcHRpbmRdKSB7CisJCXhjaGRpcihhcmd2W29wdGluZF0pOworCQljaHJvb3QoIi4iKTsKKwl9CisKKwkvL3VtYXNrKDA3Nyk7IC0gYWRtaW4gY2FuIHNldCB1bWFzayBiZWZvcmUgc3RhcnRpbmcgdXMKKworCS8qIFNpZ25hbHMuIFdlJ2xsIGFsd2F5cyB0YWtlIC1FUElQRSByYXRoZXIgdGhhbiBhIHJ1ZGUgc2lnbmFsLCB0aGFua3MgKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwkvKiBTZXQgdXAgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBzb2NrZXQgKGRvIHdlIG5lZWQgdGhlc2UgYWxsPyB3aHk/KSAqLworCXNldHNvY2tvcHQoU1RESU5fRklMRU5PLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisJc2V0c29ja29wdChTVERJTl9GSUxFTk8sIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKwkvKiBUZWxuZXQgcHJvdG9jb2wgb3ZlciBjb21tYW5kIGxpbmsgbWF5IHNlbmQgInVyZ2VudCIgZGF0YSwKKwkgKiB3ZSBwcmVmZXIgaXQgdG8gYmUgcmVjZWl2ZWQgaW4gdGhlICJub3JtYWwiIGRhdGEgc3RyZWFtOiAqLworCXNldHNvY2tvcHQoU1RESU5fRklMRU5PLCBTT0xfU09DS0VULCBTT19PT0JJTkxJTkUsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisKKwlXUklURV9PSyhGVFBfR1JFRVQpOworCXNpZ25hbChTSUdBTFJNLCB0aW1lb3V0X2hhbmRsZXIpOworCisjaWZkZWYgSUZfV0VfV0FOVF9UT19SRVFVSVJFX0xPR0lOCisJeworCQlzbWFsbGludCB1c2VyX3dhc19zcGVjaWZpZWQgPSAwOworCQl3aGlsZSAoMSkgeworCQkJdWludDMyX3QgY21kdmFsID0gY21kaW9fZ2V0X2NtZF9hbmRfYXJnKCk7CisKKwkJCWlmIChjbWR2YWwgPT0gY29uc3RfVVNFUikgeworCQkJCWlmIChHLmZ0cF9hcmcgPT0gTlVMTCB8fCBzdHJjYXNlY21wKEcuZnRwX2FyZywgImFub255bW91cyIpICE9IDApCisJCQkJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX0xPR0lORVJSKSIgU2VydmVyIGlzIGFub255bW91cyBvbmx5XHJcbiIpOworCQkJCWVsc2UgeworCQkJCQl1c2VyX3dhc19zcGVjaWZpZWQgPSAxOworCQkJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9HSVZFUFdPUkQpIiBQbGVhc2Ugc3BlY2lmeSB0aGUgcGFzc3dvcmRcclxuIik7CisJCQkJfQorCQkJfSBlbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUEFTUykgeworCQkJCWlmICh1c2VyX3dhc19zcGVjaWZpZWQpCisJCQkJCWJyZWFrOworCQkJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX05FRURVU0VSKSIgTG9naW4gd2l0aCBVU0VSXHJcbiIpOworCQkJfSBlbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUVVJVCkgeworCQkJCVdSSVRFX09LKEZUUF9HT09EQllFKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfTE9HSU5FUlIpIiBMb2dpbiB3aXRoIFVTRVIgYW5kIFBBU1NcclxuIik7CisJCQl9CisJCX0KKwl9CisJV1JJVEVfT0soRlRQX0xPR0lOT0spOworI2VuZGlmCisKKwkvKiBSRkMtOTU5IFNlY3Rpb24gNS4xCisJICogVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhbmQgb3B0aW9ucyBNVVNUIGJlIHN1cHBvcnRlZCBieSBldmVyeQorCSAqIHNlcnZlci1GVFAgYW5kIHVzZXItRlRQLCBleGNlcHQgaW4gY2FzZXMgd2hlcmUgdGhlIHVuZGVybHlpbmcKKwkgKiBmaWxlIHN5c3RlbSBvciBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IGFsbG93IG9yIHN1cHBvcnQKKwkgKiBhIHBhcnRpY3VsYXIgY29tbWFuZC4KKwkgKiBUeXBlOiBBU0NJSSBOb24tcHJpbnQsIElNQUdFLCBMT0NBTCA4CisJICogTW9kZTogU3RyZWFtCisJICogU3RydWN0dXJlOiBGaWxlLCBSZWNvcmQqCisJICogKFJlY29yZCBzdHJ1Y3R1cmUgaXMgUkVRVUlSRUQgb25seSBmb3IgaG9zdHMgd2hvc2UgZmlsZQorCSAqICBzeXN0ZW1zIHN1cHBvcnQgcmVjb3JkIHN0cnVjdHVyZSkuCisJICogQ29tbWFuZHM6CisJICogVVNFUiwgUEFTUywgQUNDVCwgW2Jib3g6IEFDQ1Qgbm90IHN1cHBvcnRlZF0KKwkgKiBQT1JULCBQQVNWLAorCSAqIFRZUEUsIE1PREUsIFNUUlUsCisJICogUkVUUiwgU1RPUiwgQVBQRSwKKwkgKiBSTkZSLCBSTlRPLCBERUxFLAorCSAqIENXRCwgIENEVVAsIFJNRCwgIE1LRCwgIFBXRCwKKwkgKiBMSVNULCBOTFNULAorCSAqIFNZU1QsIFNUQVQsCisJICogSEVMUCwgTk9PUCwgUVVJVC4KKwkgKi8KKwkvKiBBQ0NPVU5UIChBQ0NUKQorCSAqICJUaGUgYXJndW1lbnQgZmllbGQgaXMgYSBUZWxuZXQgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSB1c2VyJ3MgYWNjb3VudC4KKwkgKiBUaGUgY29tbWFuZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVsYXRlZCB0byB0aGUgVVNFUiBjb21tYW5kLCBhcyBzb21lCisJICogc2l0ZXMgbWF5IHJlcXVpcmUgYW4gYWNjb3VudCBmb3IgbG9naW4gYW5kIG90aGVycyBvbmx5IGZvciBzcGVjaWZpYworCSAqIGFjY2Vzcywgc3VjaCBhcyBzdG9yaW5nIGZpbGVzLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlIGNvbW1hbmQgbWF5CisJICogYXJyaXZlIGF0IGFueSB0aW1lLgorCSAqIFRoZXJlIGFyZSByZXBseSBjb2RlcyB0byBkaWZmZXJlbnRpYXRlIHRoZXNlIGNhc2VzIGZvciB0aGUgYXV0b21hdGlvbjoKKwkgKiB3aGVuIGFjY291bnQgaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQgZm9yIGxvZ2luLCB0aGUgcmVzcG9uc2UgdG8KKwkgKiBhIHN1Y2Nlc3NmdWwgUEFTU3dvcmQgY29tbWFuZCBpcyByZXBseSBjb2RlIDMzMi4gT24gdGhlIG90aGVyIGhhbmQsCisJICogaWYgYWNjb3VudCBpbmZvcm1hdGlvbiBpcyBOT1QgcmVxdWlyZWQgZm9yIGxvZ2luLCB0aGUgcmVwbHkgdG8KKwkgKiBhIHN1Y2Nlc3NmdWwgUEFTU3dvcmQgY29tbWFuZCBpcyAyMzA7IGFuZCBpZiB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbgorCSAqIGlzIG5lZWRlZCBmb3IgYSBjb21tYW5kIGlzc3VlZCBsYXRlciBpbiB0aGUgZGlhbG9ndWUsIHRoZSBzZXJ2ZXIKKwkgKiBzaG91bGQgcmV0dXJuIGEgMzMyIG9yIDUzMiByZXBseSBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBzdG9yZXMKKwkgKiAocGVuZGluZyByZWNlaXB0IG9mIHRoZSBBQ0NvdW5UIGNvbW1hbmQpIG9yIGRpc2NhcmRzIHRoZSBjb21tYW5kLAorCSAqIHJlc3BlY3RpdmVseS4iCisJICovCisKKwl3aGlsZSAoMSkgeworCQl1aW50MzJfdCBjbWR2YWwgPSBjbWRpb19nZXRfY21kX2FuZF9hcmcoKTsKKworCQlpZiAoY21kdmFsID09IGNvbnN0X1FVSVQpIHsKKwkJCVdSSVRFX09LKEZUUF9HT09EQllFKTsKKwkJCXJldHVybiAwOworCQl9CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9VU0VSKQorCQkJLyogVGhpcyB3b3VsZCBtZWFuICJvaywgbm93IGdpdmUgbWUgUEFTUyIuICovCisJCQkvKldSSVRFX09LKEZUUF9HSVZFUFdPUkQpOyovCisJCQkvKiB2c2Z0cGQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gbm90IHJlcXVpcmUgdGhhdCwKKwkJCSAqIGFuZCB0aGlzIGFsc28gc2F2ZXMgb25lIHJvdW5kdHJpcDoKKwkJCSAqLworCQkJV1JJVEVfT0soRlRQX0xPR0lOT0spOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUEFTUykKKwkJCVdSSVRFX09LKEZUUF9MT0dJTk9LKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X05PT1ApCisJCQlXUklURV9PSyhGVFBfTk9PUE9LKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1RZUEUpCisJCQlXUklURV9PSyhGVFBfVFlQRU9LKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1NUUlUpCisJCQlXUklURV9PSyhGVFBfU1RSVU9LKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X01PREUpCisJCQlXUklURV9PSyhGVFBfTU9ERU9LKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X0FMTE8pCisJCQlXUklURV9PSyhGVFBfQUxMT09LKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1NZU1QpCisJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9TWVNUT0spIiBVTklYIFR5cGU6IEw4XHJcbiIpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUFdEKQorCQkJaGFuZGxlX3B3ZCgpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfQ1dEKQorCQkJaGFuZGxlX2N3ZCgpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfQ0RVUCkgLyogY2QgLi4gKi8KKwkJCWhhbmRsZV9jZHVwKCk7CisJCS8qIEhFTFAgaXMgbmVhcmx5IHVzZWxlc3MsIGJ1dCB3ZSBjYW4gcmV1c2UgRkVBVCBmb3IgaXQgKi8KKwkJLyogbGZ0cCB1c2VzIEZFQVQgKi8KKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X0hFTFAgfHwgY21kdmFsID09IGNvbnN0X0ZFQVQpCisJCQloYW5kbGVfZmVhdChjbWR2YWwgPT0gY29uc3RfSEVMUAorCQkJCQk/IFNUUk5VTTMyKEZUUF9IRUxQKQorCQkJCQk6IFNUUk5VTTMyKEZUUF9TVEFUT0spCisJCQkpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfTElTVCkgLyogbHMgLWwgKi8KKwkJCWhhbmRsZV9saXN0KCk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9OTFNUKSAvKiAibmFtZSBsaXN0IiwgYmFyZSBscyAqLworCQkJaGFuZGxlX25sc3QoKTsKKwkJLyogU0laRSBpcyBjcnVjaWFsIGZvciB3Z2V0J3MgZG93bmxvYWQgaW5kaWNhdG9yIGV0YyAqLworCQkvKiBNb3ppbGxhLCBsZnRwIHVzZSBNRFRNIChwcmVzdW1hYmx5IGZvciBjYWNoaW5nKSAqLworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfU0laRSB8fCBjbWR2YWwgPT0gY29uc3RfTURUTSkKKwkJCWhhbmRsZV9zaXplX29yX21kdG0oY21kdmFsID09IGNvbnN0X1NJWkUpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfU1RBVCkgeworCQkJaWYgKEcuZnRwX2FyZyA9PSBOVUxMKQorCQkJCWhhbmRsZV9zdGF0KCk7CisJCQllbHNlCisJCQkJaGFuZGxlX3N0YXRfZmlsZSgpOworCQl9CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9QQVNWKQorCQkJaGFuZGxlX3Bhc3YoKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X0VQU1YpCisJCQloYW5kbGVfZXBzdigpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUkVUUikKKwkJCWhhbmRsZV9yZXRyKCk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9QT1JUKQorCQkJaGFuZGxlX3BvcnQoKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1JFU1QpCisJCQloYW5kbGVfcmVzdCgpOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUF9XUklURQorCQllbHNlIGlmIChvcHRzICYgT1BUX3cpIHsKKwkJCWlmIChjbWR2YWwgPT0gY29uc3RfU1RPUikKKwkJCQloYW5kbGVfc3RvcigpOworCQkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X01LRCkKKwkJCQloYW5kbGVfbWtkKCk7CisJCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUk1EKQorCQkJCWhhbmRsZV9ybWQoKTsKKwkJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9ERUxFKQorCQkJCWhhbmRsZV9kZWxlKCk7CisJCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUk5GUikgLyogInJlbmFtZSBmcm9tIiAqLworCQkJCWhhbmRsZV9ybmZyKCk7CisJCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUk5UTykgLyogInJlbmFtZSB0byIgKi8KKwkJCQloYW5kbGVfcm50bygpOworCQkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X0FQUEUpCisJCQkJaGFuZGxlX2FwcGUoKTsKKwkJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9TVE9VKSAvKiAic3RvcmUgdW5pcXVlIiAqLworCQkJCWhhbmRsZV9zdG91KCk7CisJCQllbHNlCisJCQkJZ290byBiYWRfY21kOworCQl9CisjZW5kaWYKKyNpZiAwCisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9TVE9SCisJCSB8fCBjbWR2YWwgPT0gY29uc3RfTUtECisJCSB8fCBjbWR2YWwgPT0gY29uc3RfUk1ECisJCSB8fCBjbWR2YWwgPT0gY29uc3RfREVMRQorCQkgfHwgY21kdmFsID09IGNvbnN0X1JORlIKKwkJIHx8IGNtZHZhbCA9PSBjb25zdF9STlRPCisJCSB8fCBjbWR2YWwgPT0gY29uc3RfQVBQRQorCQkgfHwgY21kdmFsID09IGNvbnN0X1NUT1UKKwkJKSB7CisJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9OT1BFUk0pIiBQZXJtaXNzaW9uIGRlbmllZFxyXG4iKTsKKwkJfQorI2VuZGlmCisJCWVsc2UgeworCQkJLyogV2hpY2ggdW5zdXBwb3J0ZWQgY29tbWFuZHMgd2VyZSBzZWVuIGluIHRoZSB3aWxkPworCQkJICogKGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbiAid2UgbXVzdCBzdXBwb3J0IHRoZW0iKQorCQkJICogZm9vIDEuMi4zOiBYWFhYIC0gY29tbWVudAorCQkJICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfRlRQX1dSSVRFCisgYmFkX2NtZDoKKyNlbmRpZgorCQkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfQkFEQ01EKSIgVW5rbm93biBjb21tYW5kXHJcbiIpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9mdHBnZXRwdXQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvZnRwZ2V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkZjk0YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvZnRwZ2V0cHV0LmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGZ0cGdldAorICoKKyAqIE1pbmkgaW1wbGVtZW50YXRpb24gb2YgRlRQIHRvIHJldHJpZXZlIGEgcmVtb3RlIGZpbGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgQW5naWVsc2tpLCBUaGUgUFRSIEdyb3VwIDxqZWZmQHRoZXB0cmdyb3VwLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBHbGVubiBNY0dyYXRoCisgKgorICogQmFzZWQgb24gd2dldC5jIGJ5IENoaXAgUm9zZW50aGFsIENvdmFkIENvbW11bmljYXRpb25zCisgKiA8Y2hpcEBsYXNlcmxpbmsubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZ0cGdldF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEhPU1QgW0xPQ0FMX0ZJTEVdIFJFTU9URV9GSUxFIgorLy91c2FnZTojZGVmaW5lIGZ0cGdldF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJldHJpZXZlIGEgcmVtb3RlIGZpbGUgdmlhIEZUUFxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktYywtLWNvbnRpbnVlCUNvbnRpbnVlIHByZXZpb3VzIHRyYW5zZmVyIgorLy91c2FnZTogICAgICJcbgktdiwtLXZlcmJvc2UJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUsLS11c2VybmFtZQlVc2VybmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAsLS1wYXNzd29yZAlQYXNzd29yZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVAsLS1wb3J0CVBvcnQgbnVtYmVyIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ29udGludWUgcHJldmlvdXMgdHJhbnNmZXIiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS11CVVzZXJuYW1lIgorLy91c2FnZTogICAgICJcbgktcAlQYXNzd29yZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJUG9ydCBudW1iZXIiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGZ0cHB1dF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEhPU1QgW1JFTU9URV9GSUxFXSBMT0NBTF9GSUxFIgorLy91c2FnZTojZGVmaW5lIGZ0cHB1dF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlN0b3JlIGEgbG9jYWwgZmlsZSBvbiBhIHJlbW90ZSBtYWNoaW5lIHZpYSBGVFBcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLXYsLS12ZXJib3NlCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS11LC0tdXNlcm5hbWUJVXNlcm5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1wLC0tcGFzc3dvcmQJUGFzc3dvcmQiCisvL3VzYWdlOiAgICAgIlxuCS1QLC0tcG9ydAlQb3J0IG51bWJlciIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS11CVVzZXJuYW1lIgorLy91c2FnZTogICAgICJcbgktcAlQYXNzd29yZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJUG9ydCBudW1iZXIiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJY29uc3QgY2hhciAqdXNlcjsKKwljb25zdCBjaGFyICpwYXNzd29yZDsKKwlzdHJ1Y3QgbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCUZJTEUgKmNvbnRyb2xfc3RyZWFtOworCWludCB2ZXJib3NlX2ZsYWc7CisJaW50IGRvX2NvbnRpbnVlOworCWNoYXIgYnVmWzRdOyAvKiBhY3R1YWxseSBbQlVGU1pdICovCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorZW51bSB7IEJVRlNaID0gQ09NTU9OX0JVRlNJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgZ2xvYmFscywgYnVmKSB9Oworc3RydWN0IEJVR19HX3Rvb19iaWcgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgdXNlciAgICAgICAgICAgKEcudXNlciAgICAgICAgICApCisjZGVmaW5lIHBhc3N3b3JkICAgICAgIChHLnBhc3N3b3JkICAgICAgKQorI2RlZmluZSBsc2EgICAgICAgICAgICAoRy5sc2EgICAgICAgICAgICkKKyNkZWZpbmUgY29udHJvbF9zdHJlYW0gKEcuY29udHJvbF9zdHJlYW0pCisjZGVmaW5lIHZlcmJvc2VfZmxhZyAgIChHLnZlcmJvc2VfZmxhZyAgKQorI2RlZmluZSBkb19jb250aW51ZSAgICAoRy5kb19jb250aW51ZSAgICkKKyNkZWZpbmUgYnVmICAgICAgICAgICAgKEcuYnVmICAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBmdHBfZGllKGNvbnN0IGNoYXIgKm1zZykgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBmdHBfZGllKGNvbnN0IGNoYXIgKm1zZykKK3sKKwljaGFyICpjcCA9IGJ1ZjsgLyogYnVmIGhvbGRzIHBlZXIncyByZXNwb25zZSAqLworCisJLyogR3VhcmQgYWdhaW5zdCBnYXJiYWdlIGZyb20gcmVtb3RlIHNlcnZlciAqLworCXdoaWxlICgqY3AgPj0gJyAnICYmICpjcCA8ICdceDdmJykKKwkJY3ArKzsKKwkqY3AgPSAnXDAnOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSVzJXM6ICVzIiwKKwkJCShtc2cgPyAiIHRvICIgOiAiIiksIChtc2cgPyBtc2cgOiAiIiksIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgZnRwY21kKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKwl1bnNpZ25lZCBuOworCisJaWYgKHZlcmJvc2VfZmxhZykgeworCQliYl9lcnJvcl9tc2coImNtZCAlcyAlcyIsIHMxLCBzMik7CisJfQorCisJaWYgKHMxKSB7CisJCWZwcmludGYoY29udHJvbF9zdHJlYW0sIChzMiA/ICIlcyAlc1xyXG4iIDogIiVzICVzXHJcbiIrMyksCisJCQkJCQlzMSwgczIpOworCQlmZmx1c2goY29udHJvbF9zdHJlYW0pOworCX0KKworCWRvIHsKKwkJc3RyY3B5KGJ1ZiwgIkVPRiIpOyAvKiBmb3IgZnRwX2RpZSAqLworCQlpZiAoZmdldHMoYnVmLCBCVUZTWiAtIDIsIGNvbnRyb2xfc3RyZWFtKSA9PSBOVUxMKSB7CisJCQlmdHBfZGllKE5VTEwpOworCQl9CisJfSB3aGlsZSAoIWlzZGlnaXQoYnVmWzBdKSB8fCBidWZbM10gIT0gJyAnKTsKKworCWJ1ZlszXSA9ICdcMCc7CisJbiA9IHhhdG91KGJ1Zik7CisJYnVmWzNdID0gJyAnOworCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBmdHBfbG9naW4odm9pZCkKK3sKKwkvKiBDb25uZWN0IHRvIHRoZSBjb21tYW5kIHNvY2tldCAqLworCWNvbnRyb2xfc3RyZWFtID0gZmRvcGVuKHhjb25uZWN0X3N0cmVhbShsc2EpLCAicisiKTsKKwlpZiAoY29udHJvbF9zdHJlYW0gPT0gTlVMTCkgeworCQkvKiBmZG9wZW4gZmFpbGVkIC0gZXh0cmVtZWx5IHVubGlrZWx5ICovCisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJfQorCisJaWYgKGZ0cGNtZChOVUxMLCBOVUxMKSAhPSAyMjApIHsKKwkJZnRwX2RpZShOVUxMKTsKKwl9CisKKwkvKiAgTG9naW4gdG8gdGhlIHNlcnZlciAqLworCXN3aXRjaCAoZnRwY21kKCJVU0VSIiwgdXNlcikpIHsKKwljYXNlIDIzMDoKKwkJYnJlYWs7CisJY2FzZSAzMzE6CisJCWlmIChmdHBjbWQoIlBBU1MiLCBwYXNzd29yZCkgIT0gMjMwKSB7CisJCQlmdHBfZGllKCJQQVNTIik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnRwX2RpZSgiVVNFUiIpOworCX0KKworCWZ0cGNtZCgiVFlQRSBJIiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgeGNvbm5lY3RfZnRwZGF0YSh2b2lkKQoreworCWNoYXIgKmJ1Zl9wdHI7CisJdW5zaWduZWQgcG9ydF9udW07CisKKy8qCitUT0RPOiBQQVNWIGNvbW1hbmQgd2lsbCBub3Qgd29yayBmb3IgSVB2Ni4gUkZDMjQyOCBkZXNjcmliZXMKK0lQdjYtY2FwYWJsZSAiZXh0ZW5kZWQgUEFTViIgLSBFUFNWLgorCisiRVBTViBbcHJvdG9jb2xdIiBhc2tzIHNlcnZlciB0byBiaW5kIHRvIGFuZCBsaXN0ZW4gb24gYSBkYXRhIHBvcnQKK2luIHNwZWNpZmllZCBwcm90b2NvbC4gUHJvdG9jb2wgaXMgMSBmb3IgSVB2NCwgMiBmb3IgSVB2Ni4KK0lmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvICJzYW1lIGFzIHVzZWQgZm9yIGNvbnRyb2wgY29ubmVjdGlvbiIuCitJZiBzZXJ2ZXIgdW5kZXJzdG9vZCB5b3UsIGl0IHNob3VsZCBhbnN3ZXIgIjIyOSA8c29tZSB0ZXh0Pih8fHxwb3J0fCkiCit3aGVyZSAifCIgYXJlIGxpdGVyYWwgcGlwZSBjaGFycyBhbmQgInBvcnQiIGlzIEFTQ0lJIGRlY2ltYWwgcG9ydCMuCisKK1RoZXJlIGlzIGFsc28gYW4gSVB2Ni1jYXBhYmxlIHJlcGxhY2VtZW50IGZvciBQT1JUIChFUFJUKSwKK2J1dCB3ZSBkb24ndCBuZWVkIHRoYXQuCisKK05COiBQQVNWIG1heSBzdGlsbCB3b3JrIGZvciBzb21lIHNlcnZlcnMgZXZlbiBvdmVyIElQdjYuCitGb3IgZXhhbXBsZSwgdnNmdHAgaGFwcGlseSBhbnN3ZXJzCisiMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoMCwwLDAsMCxuLG4pIiBhbmQgcHJvY2VlZHMgYXMgdXN1YWwuCisKK1RPRE8yOiBuZWVkIHRvIHN0b3AgaWdub3JpbmcgSVAgYWRkcmVzcyBpbiBQQVNWIHJlc3BvbnNlLgorKi8KKworCWlmIChmdHBjbWQoIlBBU1YiLCBOVUxMKSAhPSAyMjcpIHsKKwkJZnRwX2RpZSgiUEFTViIpOworCX0KKworCS8qIFJlc3BvbnNlIGlzICJOTk4gZ2FyYmFnZU4xLE4yLE4zLE40LFAxLFAyWylnYXJiYWdlXQorCSAqIFNlcnZlcidzIElQIGlzIE4xLk4yLk4zLk40ICh3ZSBpZ25vcmUgaXQpCisJICogU2VydmVyJ3MgcG9ydCBmb3IgZGF0YSBjb25uZWN0aW9uIGlzIFAxKjI1NitQMiAqLworCWJ1Zl9wdHIgPSBzdHJyY2hyKGJ1ZiwgJyknKTsKKwlpZiAoYnVmX3B0cikgKmJ1Zl9wdHIgPSAnXDAnOworCisJYnVmX3B0ciA9IHN0cnJjaHIoYnVmLCAnLCcpOworCSpidWZfcHRyID0gJ1wwJzsKKwlwb3J0X251bSA9IHhhdG91bF9yYW5nZShidWZfcHRyICsgMSwgMCwgMjU1KTsKKworCWJ1Zl9wdHIgPSBzdHJyY2hyKGJ1ZiwgJywnKTsKKwkqYnVmX3B0ciA9ICdcMCc7CisJcG9ydF9udW0gKz0geGF0b3VsX3JhbmdlKGJ1Zl9wdHIgKyAxLCAwLCAyNTUpICogMjU2OworCisJc2V0X25wb3J0KCZsc2EtPnUuc2EsIGh0b25zKHBvcnRfbnVtKSk7CisJcmV0dXJuIHhjb25uZWN0X3N0cmVhbShsc2EpOworfQorCitzdGF0aWMgaW50IHB1bXBfZGF0YV9hbmRfUVVJVChpbnQgZnJvbSwgaW50IHRvKQoreworCS8qIGNvcHkgdGhlIGZpbGUgKi8KKwlpZiAoYmJfY29weWZkX2VvZihmcm9tLCB0bykgPT0gLTEpIHsKKwkJLyogZXJyb3IgbXNnIGlzIGFscmVhZHkgcHJpbnRlZCBieSBiYl9jb3B5ZmRfZW9mICovCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJLyogY2xvc2UgZGF0YSBjb25uZWN0aW9uICovCisJY2xvc2UoZnJvbSk7IC8qIGRvbid0IGtub3cgd2hpY2ggb25lIGlzIHRoYXQsIHNvIHdlIGNsb3NlIGJvdGggKi8KKwljbG9zZSh0byk7CisKKwkvKiBkb2VzIHNlcnZlciBjb25maXJtIHRoYXQgdHJhbnNmZXIgaXMgZmluaXNoZWQ/ICovCisJaWYgKGZ0cGNtZChOVUxMLCBOVUxMKSAhPSAyMjYpIHsKKwkJZnRwX2RpZShOVUxMKTsKKwl9CisJZnRwY21kKCJRVUlUIiwgTlVMTCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisjaWYgIUVOQUJMRV9GVFBHRVQKK2ludCBmdHBfcmVjZWl2ZShjb25zdCBjaGFyICpsb2NhbF9wYXRoLCBjaGFyICpzZXJ2ZXJfcGF0aCk7CisjZWxzZQorc3RhdGljCitpbnQgZnRwX3JlY2VpdmUoY29uc3QgY2hhciAqbG9jYWxfcGF0aCwgY2hhciAqc2VydmVyX3BhdGgpCit7CisJaW50IGZkX2RhdGE7CisJaW50IGZkX2xvY2FsID0gLTE7CisJb2ZmX3QgYmVnX3JhbmdlID0gMDsKKworCS8qIGNvbm5lY3QgdG8gdGhlIGRhdGEgc29ja2V0ICovCisJZmRfZGF0YSA9IHhjb25uZWN0X2Z0cGRhdGEoKTsKKworCWlmIChmdHBjbWQoIlNJWkUiLCBzZXJ2ZXJfcGF0aCkgIT0gMjEzKSB7CisJCWRvX2NvbnRpbnVlID0gMDsKKwl9CisKKwlpZiAoTE9ORV9EQVNIKGxvY2FsX3BhdGgpKSB7CisJCWZkX2xvY2FsID0gU1RET1VUX0ZJTEVOTzsKKwkJZG9fY29udGludWUgPSAwOworCX0KKworCWlmIChkb19jb250aW51ZSkgeworCQlzdHJ1Y3Qgc3RhdCBzYnVmOworCQkvKiBsc3RhdCB3b3VsZCBiZSB3cm9uZyBoZXJlISAqLworCQlpZiAoc3RhdChsb2NhbF9wYXRoLCAmc2J1ZikgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInN0YXQiKTsKKwkJfQorCQlpZiAoc2J1Zi5zdF9zaXplID4gMCkgeworCQkJYmVnX3JhbmdlID0gc2J1Zi5zdF9zaXplOworCQl9IGVsc2UgeworCQkJZG9fY29udGludWUgPSAwOworCQl9CisJfQorCisJaWYgKGRvX2NvbnRpbnVlKSB7CisJCXNwcmludGYoYnVmLCAiUkVTVCAlIk9GRl9GTVQidSIsIGJlZ19yYW5nZSk7CisJCWlmIChmdHBjbWQoYnVmLCBOVUxMKSAhPSAzNTApIHsKKwkJCWRvX2NvbnRpbnVlID0gMDsKKwkJfQorCX0KKworCWlmIChmdHBjbWQoIlJFVFIiLCBzZXJ2ZXJfcGF0aCkgPiAxNTApIHsKKwkJZnRwX2RpZSgiUkVUUiIpOworCX0KKworCS8qIGNyZWF0ZSBsb2NhbCBmaWxlIF9hZnRlcl8gd2Uga25vdyB0aGF0IHJlbW90ZSBmaWxlIGV4aXN0cyAqLworCWlmIChmZF9sb2NhbCA9PSAtMSkgeworCQlmZF9sb2NhbCA9IHhvcGVuKGxvY2FsX3BhdGgsCisJCQlkb19jb250aW51ZSA/IChPX0FQUEVORCB8IE9fV1JPTkxZKQorCQkJICAgICAgICAgICAgOiAoT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSkKKwkJKTsKKwl9CisKKwlyZXR1cm4gcHVtcF9kYXRhX2FuZF9RVUlUKGZkX2RhdGEsIGZkX2xvY2FsKTsKK30KKyNlbmRpZgorCisjaWYgIUVOQUJMRV9GVFBQVVQKK2ludCBmdHBfc2VuZChjb25zdCBjaGFyICpzZXJ2ZXJfcGF0aCwgY2hhciAqbG9jYWxfcGF0aCk7CisjZWxzZQorc3RhdGljCitpbnQgZnRwX3NlbmQoY29uc3QgY2hhciAqc2VydmVyX3BhdGgsIGNoYXIgKmxvY2FsX3BhdGgpCit7CisJaW50IGZkX2RhdGE7CisJaW50IGZkX2xvY2FsOworCWludCByZXNwb25zZTsKKworCS8qIGNvbm5lY3QgdG8gdGhlIGRhdGEgc29ja2V0ICovCisJZmRfZGF0YSA9IHhjb25uZWN0X2Z0cGRhdGEoKTsKKworCS8qIGdldCB0aGUgbG9jYWwgZmlsZSAqLworCWZkX2xvY2FsID0gU1RESU5fRklMRU5POworCWlmIChOT1RfTE9ORV9EQVNIKGxvY2FsX3BhdGgpKQorCQlmZF9sb2NhbCA9IHhvcGVuKGxvY2FsX3BhdGgsIE9fUkRPTkxZKTsKKworCXJlc3BvbnNlID0gZnRwY21kKCJTVE9SIiwgc2VydmVyX3BhdGgpOworCXN3aXRjaCAocmVzcG9uc2UpIHsKKwljYXNlIDEyNToKKwljYXNlIDE1MDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnRwX2RpZSgiU1RPUiIpOworCX0KKworCXJldHVybiBwdW1wX2RhdGFfYW5kX1FVSVQoZmRfbG9jYWwsIGZkX2RhdGEpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBmdHBnZXRwdXRfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJjb250aW51ZVwwIiBSZXF1aXJlZF9hcmd1bWVudCAiYyIKKwkidmVyYm9zZVwwIiAgTm9fYXJndW1lbnQgICAgICAgInYiCisJInVzZXJuYW1lXDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJwYXNzd29yZFwwIiBSZXF1aXJlZF9hcmd1bWVudCAicCIKKwkicG9ydFwwIiAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlAiCisJOworI2VuZGlmCisKK2ludCBmdHBnZXRwdXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZ0cGdldHB1dF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcG9ydCA9ICJmdHAiOworCS8qIHNvY2tldCB0byBmdHAgc2VydmVyICovCisKKyNpZiBFTkFCTEVfRlRQUFVUICYmICFFTkFCTEVfRlRQR0VUCisjIGRlZmluZSBmdHBfYWN0aW9uIGZ0cF9zZW5kCisjZWxpZiBFTkFCTEVfRlRQR0VUICYmICFFTkFCTEVfRlRQUFVUCisjIGRlZmluZSBmdHBfYWN0aW9uIGZ0cF9yZWNlaXZlCisjZWxzZQorCWludCAoKmZ0cF9hY3Rpb24pKGNvbnN0IGNoYXIgKiwgY2hhciAqKSA9IGZ0cF9zZW5kOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBjb21tYW5kIGlzIGZ0cGdldCBvciBmdHB1dCAqLworCWlmIChhcHBsZXRfbmFtZVszXSA9PSAnZycpIHsKKwkJZnRwX2FjdGlvbiA9IGZ0cF9yZWNlaXZlOworCX0KKyNlbmRpZgorCisJSU5JVF9HKCk7CisJLyogU2V0IGRlZmF1bHQgdmFsdWVzICovCisJdXNlciA9ICJhbm9ueW1vdXMiOworCXBhc3N3b3JkID0gImJ1c3lib3hAIjsKKworCS8qCisJICogRGVjaXBoZXIgdGhlIGNvbW1hbmQgbGluZQorCSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZnRwZ2V0cHV0X2xvbmdvcHRzOworI2VuZGlmCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTI6dnY6Y2MiOyAvKiBtdXN0IGhhdmUgMiB0byAzIHBhcmFtczsgLXYgYW5kIC1jIGNvdW50ICovCisJZ2V0b3B0MzIoYXJndiwgImN2dTpwOlA6IiwgJnVzZXIsICZwYXNzd29yZCwgJnBvcnQsCisJCQkJCSZ2ZXJib3NlX2ZsYWcsICZkb19jb250aW51ZSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBXZSB3YW50IHRvIGRvIGV4YWN0bHkgX29uZV8gRE5TIGxvb2t1cCwgc2luY2Ugc29tZQorCSAqIHNpdGVzIChpLmUuIGZ0cC51cy5kZWJpYW4ub3JnKSB1c2Ugcm91bmQtcm9iaW4gRE5TCisJICogYW5kIHdlIHdhbnQgdG8gY29ubmVjdCB0byBvbmx5IG9uZSBJUC4uLiAqLworCWxzYSA9IHhob3N0MnNvY2thZGRyKGFyZ3ZbMF0sIGJiX2xvb2t1cF9wb3J0KHBvcnQsICJ0Y3AiLCAyMSkpOworCWlmICh2ZXJib3NlX2ZsYWcpIHsKKwkJcHJpbnRmKCJDb25uZWN0aW5nIHRvICVzICglcylcbiIsIGFyZ3ZbMF0sCisJCQl4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmbHNhLT51LnNhKSk7CisJfQorCisJZnRwX2xvZ2luKCk7CisJcmV0dXJuIGZ0cF9hY3Rpb24oYXJndlsxXSwgYXJndlsyXSA/IGFyZ3ZbMl0gOiBhcmd2WzFdKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaG9zdG5hbWUuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaG9zdG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjY2MzkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9ob3N0bmFtZS5jCkBAIC0wLDAgKzEsMTc2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGhvc3RuYW1lIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICoKKyAqIEFkanVzdGVkIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gdG8gcmVtb3ZlCisgKiB1c2Ugb2YgbG9uZyBvcHRpb25zIGFuZCBHTlUgZ2V0b3B0LiAgSW1wcm92ZWQgdGhlIHVzYWdlIGluZm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaG9zdG5hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbSE9TVE5BTUUgfCAtRiBGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBob3N0bmFtZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkdldCBvciBzZXQgaG9zdG5hbWUgb3IgRE5TIGRvbWFpbiBuYW1lXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCVNob3J0IgorLy91c2FnZTogICAgICJcbgktaQlBZGRyZXNzZXMgZm9yIHRoZSBob3N0bmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRE5TIGRvbWFpbiBuYW1lIgorLy91c2FnZTogICAgICJcbgktZglGdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1GIEZJTEUJVXNlIEZJTEUncyBjb250ZW50IGFzIGhvc3RuYW1lIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBob3N0bmFtZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBob3N0bmFtZVxuIgorLy91c2FnZTogICAgICAgInNhZ2VcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZG5zZG9tYWlubmFtZV90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZG5zZG9tYWlubmFtZV9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdm9pZCBkb19zZXRob3N0bmFtZShjaGFyICpzLCBpbnQgaXNmaWxlKQoreworLy8JaWYgKCFzKQorLy8JCXJldHVybjsKKwlpZiAoaXNmaWxlKSB7CisJCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIocywgeGZvcGVuX2Zvcl9yZWFkKTsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgJnMsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMICYgflBBUlNFX0dSRUVEWSkpIHsKKwkJCWRvX3NldGhvc3RuYW1lKHMsIDApOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX0gZWxzZSBpZiAoc2V0aG9zdG5hbWUocywgc3RybGVuKHMpKSkgeworLy8JCWlmIChlcnJubyA9PSBFUEVSTSkKKy8vCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0aG9zdG5hbWUiKTsKKwl9Cit9CisKKy8qIE1hbnBhZ2UgY2lyY2EgMjAwOToKKyAqCisgKiBob3N0bmFtZSBbLXZdIFstYV0gWy0tYWxpYXNdIFstZF0gWy0tZG9tYWluXSBbLWZdIFstLWZxZG5dIFstLWxvbmddCisgKiAgICAgIFstaV0gWy0taXAtYWRkcmVzc10gWy1zXSBbLS1zaG9ydF0gWy15XSBbLS15cF0gWy0tbmlzXQorICoKKyAqIGhvc3RuYW1lIFstdl0gWy1GIGZpbGVuYW1lXSBbLS1maWxlIGZpbGVuYW1lXSAvIFtob3N0bmFtZV0KKyAqCisgKiBkb21haW5uYW1lIFstdl0gWy1GIGZpbGVuYW1lXSBbLS1maWxlIGZpbGVuYW1lXSAgLyBbbmFtZV0KKyAqICB7IGJib3g6IG5vdCBzdXBwb3J0ZWQgfQorICoKKyAqIG5vZGVuYW1lIFstdl0gWy1GIGZpbGVuYW1lXSBbLS1maWxlIGZpbGVuYW1lXSAvIFtuYW1lXQorICogIHsgYmJveDogbm90IHN1cHBvcnRlZCB9CisgKgorICogZG5zZG9tYWlubmFtZSBbLXZdCisgKiAgeyBiYm94OiBzdXBwb3J0ZWQ6IExpbnV4IGtlcm5lbCBidWlsZCBuZWVkcyB0aGlzIH0KKyAqIG5pc2RvbWFpbm5hbWUgWy12XQorICogIHsgYmJveDogbm90IHN1cHBvcnRlZCB9CisgKiB5cGRvbWFpbm5hbWUgWy12XQorICogIHsgYmJveDogbm90IHN1cHBvcnRlZCB9CisgKgorICogLWEsIC0tYWxpYXMKKyAqICBEaXNwbGF5IHRoZSBhbGlhcyBuYW1lIG9mIHRoZSBob3N0IChpZiB1c2VkKS4KKyAqICB7IGJib3g6IG5vdCBzdXBwb3J0ZWQgfQorICogLWQsIC0tZG9tYWluCisgKiAgRGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgRE5TIGRvbWFpbi4gRG9uJ3QgdXNlIHRoZSBjb21tYW5kCisgKiAgZG9tYWlubmFtZSB0byBnZXQgdGhlIEROUyBkb21haW4gbmFtZSBiZWNhdXNlIGl0IHdpbGwgc2hvdyB0aGUKKyAqICBOSVMgZG9tYWluIG5hbWUgYW5kIG5vdCB0aGUgRE5TIGRvbWFpbiBuYW1lLiBVc2UgZG5zZG9tYWlubmFtZQorICogIGluc3RlYWQuCisgKiAtZiwgLS1mcWRuLCAtLWxvbmcKKyAqICBEaXNwbGF5IHRoZSBGUUROIChGdWxseSBRdWFsaWZpZWQgRG9tYWluIE5hbWUpLiBBIEZRRE4gY29uc2lzdHMKKyAqICBvZiBhIHNob3J0IGhvc3QgbmFtZSBhbmQgdGhlIEROUyBkb21haW4gbmFtZS4gVW5sZXNzIHlvdSBhcmUKKyAqICB1c2luZyBiaW5kIG9yIE5JUyBmb3IgaG9zdCBsb29rdXBzIHlvdSBjYW4gY2hhbmdlIHRoZSBGUUROIGFuZAorICogIHRoZSBETlMgZG9tYWluIG5hbWUgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEZRRE4pIGluIHRoZQorICogIC9ldGMvaG9zdHMgZmlsZS4KKyAqIC1pLCAtLWlwLWFkZHJlc3MKKyAqICBEaXNwbGF5IHRoZSBJUCBhZGRyZXNzKGVzKSBvZiB0aGUgaG9zdC4KKyAqIC1zLCAtLXNob3J0CisgKiAgRGlzcGxheSB0aGUgc2hvcnQgaG9zdCBuYW1lLiBUaGlzIGlzIHRoZSBob3N0IG5hbWUgY3V0IGF0IHRoZQorICogIGZpcnN0IGRvdC4KKyAqIC12LCAtLXZlcmJvc2UKKyAqICBCZSB2ZXJib3NlIGFuZCB0ZWxsIHdoYXQncyBnb2luZyBvbi4KKyAqICB7IGJib3g6IHN1cHBvcnRlZCBidXQgaWdub3JlZCB9CisgKiAteSwgLS15cCwgLS1uaXMKKyAqICBEaXNwbGF5IHRoZSBOSVMgZG9tYWluIG5hbWUuIElmIGEgcGFyYW1ldGVyIGlzIGdpdmVuIChvciAtLWZpbGUKKyAqICBuYW1lICkgdGhlbiByb290IGNhbiBhbHNvIHNldCBhIG5ldyBOSVMgZG9tYWluLgorICogIHsgYmJveDogbm90IHN1cHBvcnRlZCB9CisgKiAtRiwgLS1maWxlIGZpbGVuYW1lCisgKiAgUmVhZCB0aGUgaG9zdCBuYW1lIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLiBDb21tZW50cyAobGluZXMKKyAqICBzdGFydGluZyB3aXRoIGEgYCMnKSBhcmUgaWdub3JlZC4KKyAqLworaW50IGhvc3RuYW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBob3N0bmFtZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF9kID0gMHgxLAorCQlPUFRfZiA9IDB4MiwKKwkJT1BUX2kgPSAweDQsCisJCU9QVF9zID0gMHg4LAorCQlPUFRfRiA9IDB4MTAsCisJCU9QVF9kZmlzID0gMHhmLAorCX07CisKKwl1bnNpZ25lZCBvcHRzOworCWNoYXIgKmJ1ZjsKKwljaGFyICpob3N0bmFtZV9zdHI7CisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9CisJCSJkb21haW5cMCIgICAgIE5vX2FyZ3VtZW50ICJkIgorCQkiZnFkblwwIiAgICAgICBOb19hcmd1bWVudCAiZiIKKwkvL0VuYWJsZSBpZiBzZWVuIGluIGFjdGl2ZSB1c2UgaW4gc29tZSBkaXN0cm86CisJLy8JImxvbmdcMCIgICAgICAgTm9fYXJndW1lbnQgImYiCisJLy8JImlwLWFkZHJlc3NcMCIgTm9fYXJndW1lbnQgImkiCisJLy8JInNob3J0XDAiICAgICAgTm9fYXJndW1lbnQgInMiCisJLy8JInZlcmJvc2VcMCIgICAgTm9fYXJndW1lbnQgInYiCisJCSJmaWxlXDAiICAgICAgIE5vX2FyZ3VtZW50ICJGIgorCQk7CisKKyNlbmRpZgorCS8qIGRuc2RvbWFpbm5hbWUgZnJvbSBuZXQtdG9vbHMgMS42MCwgaG9zdG5hbWUgMS4xMDAgKDIwMDEtMDQtMTQpLAorCSAqIHN1cHBvcnRzIGhvc3RuYW1lJ3Mgb3B0aW9ucyB0b28gKG5vdCBqdXN0IC12IGFzIG1hbnBhZ2Ugc2F5cykgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImRmaXNGOnYiLCAmaG9zdG5hbWVfc3RyKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlidWYgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisJaWYgKGFwcGxldF9uYW1lWzBdID09ICdkJykgLyogZG5zZG9tYWlubmFtZT8gKi8KKwkJb3B0cyA9IE9QVF9kOworCisJaWYgKG9wdHMgJiBPUFRfZGZpcykgeworCQkvKiBDYXNlcyB3aGVuIHdlIG5lZWQgZnVsbCBob3N0bmFtZSAob3IgaXRzIHBhcnQpICovCisJCXN0cnVjdCBob3N0ZW50ICpocDsKKwkJY2hhciAqcDsKKworCQlocCA9IHhnZXRob3N0YnluYW1lKGJ1Zik7CisJCXAgPSBzdHJjaHJudWwoaHAtPmhfbmFtZSwgJy4nKTsKKwkJaWYgKG9wdHMgJiBPUFRfZikgeworCQkJcHV0cyhocC0+aF9uYW1lKTsKKwkJfSBlbHNlIGlmIChvcHRzICYgT1BUX3MpIHsKKwkJCSpwID0gJ1wwJzsKKwkJCXB1dHMoaHAtPmhfbmFtZSk7CisJCX0gZWxzZSBpZiAob3B0cyAmIE9QVF9kKSB7CisJCQlpZiAoKnApCisJCQkJcHV0cyhwICsgMSk7CisJCX0gZWxzZSAvKmlmIChvcHRzICYgT1BUX2kpKi8geworCQkJaWYgKGhwLT5oX2xlbmd0aCA9PSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisJCQkJc3RydWN0IGluX2FkZHIgKipoX2FkZHJfbGlzdCA9IChzdHJ1Y3QgaW5fYWRkciAqKilocC0+aF9hZGRyX2xpc3Q7CisJCQkJd2hpbGUgKCpoX2FkZHJfbGlzdCkgeworCQkJCQlwcmludGYoIiVzICIsIGluZXRfbnRvYSgqKmhfYWRkcl9saXN0KSk7CisJCQkJCWhfYWRkcl9saXN0Kys7CisJCQkJfQorCQkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKG9wdHMgJiBPUFRfRikgeworCQkvKiBTZXQgdGhlIGhvc3RuYW1lICovCisJCWRvX3NldGhvc3RuYW1lKGhvc3RuYW1lX3N0ciwgMSk7CisJfSBlbHNlIGlmIChhcmd2WzBdKSB7CisJCS8qIFNldCB0aGUgaG9zdG5hbWUgKi8KKwkJZG9fc2V0aG9zdG5hbWUoYXJndlswXSwgMCk7CisJfSBlbHNlIHsKKwkJLyogSnVzdCBwcmludCB0aGUgY3VycmVudCBob3N0bmFtZSAqLworCQlwdXRzKGJ1Zik7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKGJ1Zik7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaHR0cGQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaHR0cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTVlZWJhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9odHRwZC5jCkBAIC0wLDAgKzEsMjQ5MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaHR0cGQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBHbGVubiBFbmdlbCA8Z2xlbm5lQGVuZ2VsLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFR5cGljYWwgdXNhZ2U6CisgKiBGb3Igbm9uIHJvb3QgdXNlcjoKKyAqICAgICAgaHR0cGQgLXAgODA4MCAtaCAkSE9NRS9wdWJsaWNfaHRtbAorICogRm9yIGRhZW1vbiBzdGFydCBmcm9tIHJjIHNjcmlwdCB3aXRoIHVpZD0wOgorICogICAgICBodHRwZCAtdSB3d3cKKyAqIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gKGFzc3VtaW5nIHVzZXIgd3d3IGhhcyB1aWQgODApOgorICogICAgICBodHRwZCAtcCA4MCAtdSA4MCAtaCAkUFdEIC1jIC9ldGMvaHR0cGQuY29uZiAtciAiV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiIKKyAqCisgKiBXaGVuIGFuIHVybCBzdGFydHMgd2l0aCAiL2NnaS1iaW4vIiBpdCBpcyBhc3N1bWVkIHRvIGJlIGEgY2dpIHNjcmlwdC4KKyAqIFRoZSBzZXJ2ZXIgY2hhbmdlcyBkaXJlY3RvcnkgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzY3JpcHQgYW5kIGV4ZWN1dGVzIGl0CisgKiBhZnRlciBzZXR0aW5nIFFVRVJZX1NUUklORyBhbmQgb3RoZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICoKKyAqIElmIGRpcmVjdG9yeSBVUkwgaXMgZ2l2ZW4sIG5vIGluZGV4Lmh0bWwgaXMgZm91bmQgYW5kIENHSSBzdXBwb3J0IGlzIGVuYWJsZWQsCisgKiBjZ2ktYmluL2luZGV4LmNnaSB3aWxsIGJlIHJ1bi4gRGlyZWN0b3J5IHRvIGxpc3QgaXMgLi4vJFFVRVJZX1NUUklORy4KKyAqIFNlZSBodHRwZF9pbmRleGNnaS5jIGZvciBhbiBleGFtcGxlIEdDSSBjb2RlLgorICoKKyAqIERvYzoKKyAqICJDR0kgRW52aXJvbm1lbnQgVmFyaWFibGVzIjogaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbAorICoKKyAqIFRoZSBhcHBsZXQgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhbiB1cmwgYXJnIGRlY29kZXIgYW5kIGh0bWwgdGV4dCBlbmNvZGVyCisgKiBhcyBmb2xsb3dzOgorICogICAgICBmb289YGh0dHBkIC1kICRmb29gICAgICAgICAgICAgICMgZGVjb2RlICJIZWxsbyUyMFdvcmxkIiBhcyAiSGVsbG8gV29ybGQiCisgKiAgICAgIGJhcj1gaHR0cGQgLWUgIjxIZWxsbyBXb3JsZD4iYCAgIyBlbmNvZGUgYXMgIiYjNjBIZWxsbyYjMzJXb3JsZCYjNjIiCisgKiBOb3RlIHRoYXQgdXJsIGVuY29kaW5nIGZvciBhcmd1bWVudHMgaXMgbm90IHRoZSBzYW1lIGFzIGh0bWwgZW5jb2RpbmcgZm9yCisgKiBwcmVzZW50YXRpb24uICAtZCBkZWNvZGVzIGFuIHVybC1lbmNvZGVkIGFyZ3VtZW50IHdoaWxlIC1lIGVuY29kZXMgaW4gaHRtbAorICogZm9yIHBhZ2UgZGlzcGxheS4KKyAqCisgKiBodHRwZC5jb25mIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqCisgKiBIOi9zZXJ2ZXJyb290ICAgICAjIGRlZmluZSB0aGUgc2VydmVyIHJvb3QuIEl0IHdpbGwgb3ZlcnJpZGUgLWgKKyAqIEE6MTcyLjIwLiAgICAgICAgICMgQWxsb3cgYWRkcmVzcyBmcm9tIDE3Mi4yMC4wLjAvMTYKKyAqIEE6MTAuMC4wLjAvMjUgICAgICMgQWxsb3cgYW55IGFkZHJlc3MgZnJvbSAxMC4wLjAuMC0xMC4wLjAuMTI3CisgKiBBOjEwLjAuMC4wLzI1NS4yNTUuMjU1LjEyOCAgIyBBbGxvdyBhbnkgYWRkcmVzcyB0aGF0IHByZXZpb3VzIHNldAorICogQToxMjcuMC4wLjEgICAgICAgIyBBbGxvdyBsb2NhbCBsb29wYmFjayBjb25uZWN0aW9ucworICogRDoqICAgICAgICAgICAgICAgIyBEZW55IGZyb20gb3RoZXIgSVAgY29ubmVjdGlvbnMKKyAqIEU0MDQ6L3BhdGgvZTQwNC5odG1sICMgL3BhdGgvZTQwNC5odG1sIGlzIHRoZSA0MDQgKG5vdCBmb3VuZCkgZXJyb3IgcGFnZQorICogSTppbmRleC5odG1sICAgICAgIyBTaG93IGluZGV4Lmh0bWwgd2hlbiBhIGRpcmVjdG9yeSBpcyByZXF1ZXN0ZWQKKyAqCisgKiBQOi91cmw6W2h0dHA6Ly9daG9zdG5hbWVbOnBvcnRdL25ldy9wYXRoCisgKiAgICAgICAgICAgICAgICAgICAjIFdoZW4gL3VybFhYWFhYWCBpcyByZXF1ZXN0ZWQsIHJldmVyc2UgcHJveHkKKyAqICAgICAgICAgICAgICAgICAgICMgaXQgdG8gaHR0cDovL2hvc3RuYW1lWzpwb3J0XS9uZXcvcGF0aFhYWFhYWAorICoKKyAqIC9jZ2ktYmluOmZvbzpiYXIgICMgUmVxdWlyZSB1c2VyIGZvbywgcHdkIGJhciBvbiB1cmxzIHN0YXJ0aW5nIHdpdGggL2NnaS1iaW4vCisgKiAvYWRtOmFkbWluOnNldHVwICAjIFJlcXVpcmUgdXNlciBhZG1pbiwgcHdkIHNldHVwIG9uIHVybHMgc3RhcnRpbmcgd2l0aCAvYWRtLworICogL2FkbTp0b29yOlBhU3NXZCAgIyBvciB1c2VyIHRvb3IsIHB3ZCBQYVNzV2Qgb24gdXJscyBzdGFydGluZyB3aXRoIC9hZG0vCisgKiAuYXU6YXVkaW8vYmFzaWMgICAjIGFkZGl0aW9uYWwgbWltZSB0eXBlIGZvciBhdWRpby5hdSBmaWxlcworICogKi5waHA6L3BhdGgvcGhwICAgIyBydW4geHh4LnBocCB0aHJvdWdoIGFuIGludGVycHJldGVyCisgKgorICogQS9EIG1heSBiZSBhcyBhL2Qgb3IgYWxsb3cvZGVueSAtIG9ubHkgZmlyc3QgY2hhciBtYXR0ZXJzLgorICogRGVueS9BbGxvdyBJUCBsb2dpYzoKKyAqICAtIERlZmF1bHQgaXMgdG8gYWxsb3cgYWxsIChBbGxvdyBhbGwgKEE6KikgaXMgYSBuby1vcCkuCisgKiAgLSBEZW55IHJ1bGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGFsbG93IHJ1bGVzLgorICogIC0gIkRlbnkgYWxsIiBydWxlIChEOiopIGlzIGFwcGxpZWQgbGFzdC4KKyAqCisgKiBFeGFtcGxlOgorICogICAxLiBBbGxvdyBvbmx5IHNwZWNpZmllZCBhZGRyZXNzZXMKKyAqICAgICBBOjE3Mi4yMCAgICAgICAgICAjIEFsbG93IGFueSBhZGRyZXNzIHRoYXQgYmVnaW5zIHdpdGggMTcyLjIwLgorICogICAgIEE6MTAuMTAuICAgICAgICAgICMgQWxsb3cgYW55IGFkZHJlc3MgdGhhdCBiZWdpbnMgd2l0aCAxMC4xMC4KKyAqICAgICBBOjEyNy4wLjAuMSAgICAgICAjIEFsbG93IGxvY2FsIGxvb3BiYWNrIGNvbm5lY3Rpb25zCisgKiAgICAgRDoqICAgICAgICAgICAgICAgIyBEZW55IGZyb20gb3RoZXIgSVAgY29ubmVjdGlvbnMKKyAqCisgKiAgIDIuIE9ubHkgZGVueSBzcGVjaWZpZWQgYWRkcmVzc2VzCisgKiAgICAgRDoxLjIuMy4gICAgICAgICMgZGVueSBmcm9tIDEuMi4zLjAgLSAxLjIuMy4yNTUKKyAqICAgICBEOjIuMy40LiAgICAgICAgIyBkZW55IGZyb20gMi4zLjQuMCAtIDIuMy40LjI1NQorICogICAgIEE6KiAgICAgICAgICAgICAjIChvcHRpb25hbCBsaW5lIGFkZGVkIGZvciBjbGFyaXR5KQorICoKKyAqIElmIGEgc3ViIGRpcmVjdG9yeSBjb250YWlucyBjb25maWcgZmlsZSwgaXQgaXMgcGFyc2VkIGFuZCBtZXJnZWQgd2l0aAorICogYW55IGV4aXN0aW5nIHNldHRpbmdzIGFzIGlmIGl0IHdhcyBhcHBlbmRlZCB0byB0aGUgb3JpZ2luYWwgY29uZmlndXJhdGlvbi4KKyAqCisgKiBzdWJkaXIgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluaW5nIHN1YmRpciBhbmQgdGh1cyBjYW5ub3QKKyAqIGFmZmVjdCB0aGUgcGFyZW50IHJ1bGVzLgorICoKKyAqIE5vdGUgdGhhdCBzaW5jZSB0aGUgc3ViIGRpciBpcyBwYXJzZWQgaW4gdGhlIGZvcmtlZCB0aHJlYWQgc2VydmljaW5nIHRoZQorICogc3ViZGlyIGh0dHAgcmVxdWVzdCwgYW55IG1lcmdlIGlzIGRpc2NhcmRlZCB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzLiAgQXMgYQorICogcmVzdWx0LCB0aGUgc3ViZGlyIHNldHRpbmdzIG9ubHkgaGF2ZSBhIGxpZmV0aW1lIG9mIGEgc2luZ2xlIHJlcXVlc3QuCisgKgorICogQ3VzdG9tIGVycm9yIHBhZ2VzIGNhbiBjb250YWluIGFuIGFic29sdXRlIHBhdGggb3IgYmUgcmVsYXRpdmUgdG8KKyAqICdob21lX2h0dHBkJy4gRXJyb3IgcGFnZXMgYXJlIHRvIGJlIHN0YXRpYyBmaWxlcyAobm8gQ0dJIG9yIHNjcmlwdCkuIEVycm9yCisgKiBwYWdlIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gdGhlIHJvb3QgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBhcmUgbm90IHRha2VuCisgKiBpbnRvIGFjY291bnQgaW4gbG9jYWwgKGRpcmVjdG9yaWVzKSBjb25maWcgZmlsZXMuCisgKgorICogSWYgLWMgaXMgbm90IHNldCwgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gb3BlbiB0aGUgZGVmYXVsdAorICogcm9vdCBjb25maWd1cmF0aW9uIGZpbGUuICBJZiAtYyBpcyBzZXQgYW5kIHRoZSBmaWxlIGlzIG5vdCBmb3VuZCwgdGhlCisgKiBzZXJ2ZXIgZXhpdHMgd2l0aCBhbiBlcnJvci4KKyAqCisgKi8KKyAvKiBUT0RPOiB1c2UgVENQX0NPUkssIHBhcnNlX2NvbmZpZygpICovCisKKy8vdXNhZ2U6I2RlZmluZSBodHRwZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1pZnZbdl1dIgorLy91c2FnZTogICAgICAgIiBbLWMgQ09ORkZJTEVdIgorLy91c2FnZTogICAgICAgIiBbLXAgW0lQOl1QT1JUXSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFRUUERfU0VUVUlEKCIgWy11IFVTRVJbOkdSUF1dIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCgiIFstciBSRUFMTV0iKQorLy91c2FnZTogICAgICAgIiBbLWggSE9NRV1cbiIKKy8vdXNhZ2U6ICAgICAgICJvciBodHRwZCAtZC8tZSIgSUZfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSgiLy1tIikgIiBTVFJJTkciCisvL3VzYWdlOiNkZWZpbmUgaHR0cGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0ZW4gZm9yIGluY29taW5nIEhUVFAgcmVxdWVzdHNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCUluZXRkIG1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS1mCQlEb24ndCBkYWVtb25pemUiCisvL3VzYWdlOiAgICAgIlxuCS12W3ZdCQlWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcCBbSVA6XVBPUlQJQmluZCB0byBJUDpQT1JUIChkZWZhdWx0ICo6ODApIgorLy91c2FnZToJSUZfRkVBVFVSRV9IVFRQRF9TRVRVSUQoCisvL3VzYWdlOiAgICAgIlxuCS11IFVTRVJbOkdSUF0JU2V0IHVpZC9naWQgYWZ0ZXIgYmluZGluZyB0byBwb3J0IikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCgKKy8vdXNhZ2U6ICAgICAiXG4JLXIgUkVBTE0JQXV0aGVudGljYXRpb24gUmVhbG0gZm9yIEJhc2ljIEF1dGhlbnRpY2F0aW9uIikKKy8vdXNhZ2U6ICAgICAiXG4JLWggSE9NRQkJSG9tZSBkaXJlY3RvcnkgKGRlZmF1bHQgLikiCisvL3VzYWdlOiAgICAgIlxuCS1jIEZJTEUJCUNvbmZpZ3VyYXRpb24gZmlsZSAoZGVmYXVsdCB7L2V0YyxIT01FfS9odHRwZC5jb25mKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUoCisvL3VzYWdlOiAgICAgIlxuCS1tIFNUUklORwlNRDUgY3J5cHQgU1RSSU5HIikKKy8vdXNhZ2U6ICAgICAiXG4JLWUgU1RSSU5HCUhUTUwgZW5jb2RlIFNUUklORyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgU1RSSU5HCVVSTCBkZWNvZGUgU1RSSU5HIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUKKyMgaW5jbHVkZSA8c3lzL3NlbmRmaWxlLmg+CisjZW5kaWYKKy8qIGFtb3VudCBvZiBidWZmZXJpbmcgaW4gYSBwaXBlICovCisjaWZuZGVmIFBJUEVfQlVGCisjIGRlZmluZSBQSVBFX0JVRiA0MDk2CisjZW5kaWYKKworI2RlZmluZSBERUJVRyAwCisKKyNkZWZpbmUgSU9CVUZfU0laRSA4MTkyCisjaWYgUElQRV9CVUYgPj0gSU9CVUZfU0laRQorIyBlcnJvciAiUElQRV9CVUYgPj0gSU9CVUZfU0laRSIKKyNlbmRpZgorCisjZGVmaW5lIEhFQURFUl9SRUFEX1RJTUVPVVQgNjAKKworc3RhdGljIGNvbnN0IGNoYXIgREVGQVVMVF9QQVRIX0hUVFBEX0NPTkZbXSBBTElHTjEgPSAiL2V0YyI7CitzdGF0aWMgY29uc3QgY2hhciBIVFRQRF9DT05GW10gQUxJR04xID0gImh0dHBkLmNvbmYiOworc3RhdGljIGNvbnN0IGNoYXIgSFRUUF8yMDBbXSBBTElHTjEgPSAiSFRUUC8xLjAgMjAwIE9LXHJcbiI7CitzdGF0aWMgY29uc3QgY2hhciBpbmRleF9odG1sW10gQUxJR04xID0gImluZGV4Lmh0bWwiOworCit0eXBlZGVmIHN0cnVjdCBoYXNfbmV4dF9wdHIgeworCXN0cnVjdCBoYXNfbmV4dF9wdHIgKm5leHQ7Cit9IGhhc19uZXh0X3B0cjsKKworLyogTXVzdCBoYXZlICJuZXh0IiBhcyBhIGZpcnN0IG1lbWJlciAqLwordHlwZWRlZiBzdHJ1Y3QgSHRhY2Nlc3MgeworCXN0cnVjdCBIdGFjY2VzcyAqbmV4dDsKKwljaGFyICphZnRlcl9jb2xvbjsKKwljaGFyIGJlZm9yZV9jb2xvblsxXTsgIC8qIHJlYWxseSBiaWdnZXIsIG11c3QgYmUgbGFzdCAqLworfSBIdGFjY2VzczsKKworLyogTXVzdCBoYXZlICJuZXh0IiBhcyBhIGZpcnN0IG1lbWJlciAqLwordHlwZWRlZiBzdHJ1Y3QgSHRhY2Nlc3NfSVAgeworCXN0cnVjdCBIdGFjY2Vzc19JUCAqbmV4dDsKKwl1bnNpZ25lZCBpcDsKKwl1bnNpZ25lZCBtYXNrOworCWludCBhbGxvd19kZW55OworfSBIdGFjY2Vzc19JUDsKKworLyogTXVzdCBoYXZlICJuZXh0IiBhcyBhIGZpcnN0IG1lbWJlciAqLwordHlwZWRlZiBzdHJ1Y3QgSHRhY2Nlc3NfUHJveHkgeworCXN0cnVjdCBIdGFjY2Vzc19Qcm94eSAqbmV4dDsKKwljaGFyICp1cmxfZnJvbTsKKwljaGFyICpob3N0X3BvcnQ7CisJY2hhciAqdXJsX3RvOworfSBIdGFjY2Vzc19Qcm94eTsKKworZW51bSB7CisJSFRUUF9PSyA9IDIwMCwKKwlIVFRQX1BBUlRJQUxfQ09OVEVOVCA9IDIwNiwKKwlIVFRQX01PVkVEX1RFTVBPUkFSSUxZID0gMzAyLAorCUhUVFBfQkFEX1JFUVVFU1QgPSA0MDAsICAgICAgIC8qIG1hbGZvcm1lZCBzeW50YXggKi8KKwlIVFRQX1VOQVVUSE9SSVpFRCA9IDQwMSwgLyogYXV0aGVudGljYXRpb24gbmVlZGVkLCByZXNwb25kIHdpdGggYXV0aCBoZHIgKi8KKwlIVFRQX05PVF9GT1VORCA9IDQwNCwKKwlIVFRQX0ZPUkJJRERFTiA9IDQwMywKKwlIVFRQX1JFUVVFU1RfVElNRU9VVCA9IDQwOCwKKwlIVFRQX05PVF9JTVBMRU1FTlRFRCA9IDUwMSwgICAvKiB1c2VkIGZvciB1bnJlY29nbml6ZWQgcmVxdWVzdHMgKi8KKwlIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiA9IDUwMCwKKwlIVFRQX0NPTlRJTlVFID0gMTAwLAorI2lmIDAgICAvKiBmdXR1cmUgdXNlICovCisJSFRUUF9TV0lUQ0hJTkdfUFJPVE9DT0xTID0gMTAxLAorCUhUVFBfQ1JFQVRFRCA9IDIwMSwKKwlIVFRQX0FDQ0VQVEVEID0gMjAyLAorCUhUVFBfTk9OX0FVVEhPUklUQVRJVkVfSU5GTyA9IDIwMywKKwlIVFRQX05PX0NPTlRFTlQgPSAyMDQsCisJSFRUUF9NVUxUSVBMRV9DSE9JQ0VTID0gMzAwLAorCUhUVFBfTU9WRURfUEVSTUFORU5UTFkgPSAzMDEsCisJSFRUUF9OT1RfTU9ESUZJRUQgPSAzMDQsCisJSFRUUF9QQVlNRU5UX1JFUVVJUkVEID0gNDAyLAorCUhUVFBfQkFEX0dBVEVXQVkgPSA1MDIsCisJSFRUUF9TRVJWSUNFX1VOQVZBSUxBQkxFID0gNTAzLCAvKiBvdmVybG9hZCwgbWFpbnRlbmFuY2UgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGh0dHBfcmVzcG9uc2VfdHlwZVtdIEFMSUdOMiA9IHsKKwlIVFRQX09LLAorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCUhUVFBfUEFSVElBTF9DT05URU5ULAorI2VuZGlmCisJSFRUUF9NT1ZFRF9URU1QT1JBUklMWSwKKwlIVFRQX1JFUVVFU1RfVElNRU9VVCwKKwlIVFRQX05PVF9JTVBMRU1FTlRFRCwKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJSFRUUF9VTkFVVEhPUklaRUQsCisjZW5kaWYKKwlIVFRQX05PVF9GT1VORCwKKwlIVFRQX0JBRF9SRVFVRVNULAorCUhUVFBfRk9SQklEREVOLAorCUhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorI2lmIDAgICAvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwlIVFRQX0NSRUFURUQsCisJSFRUUF9BQ0NFUFRFRCwKKwlIVFRQX05PX0NPTlRFTlQsCisJSFRUUF9NVUxUSVBMRV9DSE9JQ0VTLAorCUhUVFBfTU9WRURfUEVSTUFORU5UTFksCisJSFRUUF9OT1RfTU9ESUZJRUQsCisJSFRUUF9CQURfR0FURVdBWSwKKwlIVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqaW5mbzsKK30gaHR0cF9yZXNwb25zZVtBUlJBWV9TSVpFKGh0dHBfcmVzcG9uc2VfdHlwZSldID0geworCXsgIk9LIiwgTlVMTCB9LAorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCXsgIlBhcnRpYWwgQ29udGVudCIsIE5VTEwgfSwKKyNlbmRpZgorCXsgIkZvdW5kIiwgTlVMTCB9LAorCXsgIlJlcXVlc3QgVGltZW91dCIsICJObyByZXF1ZXN0IGFwcGVhcmVkIHdpdGhpbiA2MCBzZWNvbmRzIiB9LAorCXsgIk5vdCBJbXBsZW1lbnRlZCIsICJUaGUgcmVxdWVzdGVkIG1ldGhvZCBpcyBub3QgcmVjb2duaXplZCIgfSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJeyAiVW5hdXRob3JpemVkIiwgIiIgfSwKKyNlbmRpZgorCXsgIk5vdCBGb3VuZCIsICJUaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIiB9LAorCXsgIkJhZCBSZXF1ZXN0IiwgIlVuc3VwcG9ydGVkIG1ldGhvZCIgfSwKKwl7ICJGb3JiaWRkZW4iLCAiIiAgfSwKKwl7ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiLCAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiB9LAorI2lmIDAgICAvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwl7ICJDcmVhdGVkIiB9LAorCXsgIkFjY2VwdGVkIiB9LAorCXsgIk5vIENvbnRlbnQiIH0sCisJeyAiTXVsdGlwbGUgQ2hvaWNlcyIgfSwKKwl7ICJNb3ZlZCBQZXJtYW5lbnRseSIgfSwKKwl7ICJOb3QgTW9kaWZpZWQiIH0sCisJeyAiQmFkIEdhdGV3YXkiLCAiIiB9LAorCXsgIlNlcnZpY2UgVW5hdmFpbGFibGUiLCAiIiB9LAorI2VuZGlmCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IHZlcmJvc2U7ICAgICAgICAgICAgLyogbXVzdCBiZSBpbnQgKHVzZWQgYnkgZ2V0b3B0MzIpICovCisJc21hbGxpbnQgZmxnX2RlbnlfYWxsOworCisJdW5zaWduZWQgcm10X2lwOyAgICAgICAgLyogdXNlZCBmb3IgSVAtYmFzZWQgYWxsb3cvZGVueSBydWxlcyAqLworCXRpbWVfdCBsYXN0X21vZDsKKwljaGFyICpybXRfaXBfc3RyOyAgICAgICAvKiBmb3IgJFJFTU9URV9BRERSIGFuZCAkUkVNT1RFX1BPUlQgKi8KKwljb25zdCBjaGFyICpiaW5kX2FkZHJfb3JfcG9ydDsKKworCWNvbnN0IGNoYXIgKmdfcXVlcnk7CisJY29uc3QgY2hhciAqb3B0X2NfY29uZmlnRmlsZTsKKwljb25zdCBjaGFyICpob21lX2h0dHBkOworCWNvbnN0IGNoYXIgKmluZGV4X3BhZ2U7CisKKwljb25zdCBjaGFyICpmb3VuZF9taW1lX3R5cGU7CisJY29uc3QgY2hhciAqZm91bmRfbW92ZWRfdGVtcG9yYXJpbHk7CisJSHRhY2Nlc3NfSVAgKmlwX2FfZDsgICAgLyogY29uZmlnIGFsbG93L2RlbnkgbGluZXMgKi8KKworCUlGX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSChjb25zdCBjaGFyICpnX3JlYWxtOykKKwlJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoY2hhciAqcmVtb3RldXNlcjspCisJSUZfRkVBVFVSRV9IVFRQRF9DR0koY2hhciAqcmVmZXJlcjspCisJSUZfRkVBVFVSRV9IVFRQRF9DR0koY2hhciAqdXNlcl9hZ2VudDspCisJSUZfRkVBVFVSRV9IVFRQRF9DR0koY2hhciAqaG9zdDspCisJSUZfRkVBVFVSRV9IVFRQRF9DR0koY2hhciAqaHR0cF9hY2NlcHQ7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKmh0dHBfYWNjZXB0X2xhbmd1YWdlOykKKworCW9mZl90IGZpbGVfc2l6ZTsgICAgICAgIC8qIC0xIC0gdW5rbm93biAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCW9mZl90IHJhbmdlX3N0YXJ0OworCW9mZl90IHJhbmdlX2VuZDsKKwlvZmZfdCByYW5nZV9sZW47CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwlIdGFjY2VzcyAqZ19hdXRoOyAgICAgICAvKiBjb25maWcgdXNlcjpwYXNzd29yZCBsaW5lcyAqLworI2VuZGlmCisJSHRhY2Nlc3MgKm1pbWVfYTsgICAgICAgLyogY29uZmlnIG1pbWUgdHlwZXMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUgorCUh0YWNjZXNzICpzY3JpcHRfaTsgICAgIC8qIGNvbmZpZyBzY3JpcHQgaW50ZXJwcmV0ZXJzICovCisjZW5kaWYKKwljaGFyICppb2J1ZjsgICAgICAgICAgICAvKiBbSU9CVUZfU0laRV0gKi8KKyNkZWZpbmUgaGRyX2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCWNoYXIgKmhkcl9wdHI7CisJaW50IGhkcl9jbnQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMKKwljb25zdCBjaGFyICpodHRwX2Vycm9yX3BhZ2VbQVJSQVlfU0laRShodHRwX3Jlc3BvbnNlX3R5cGUpXTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisJSHRhY2Nlc3NfUHJveHkgKnByb3h5OworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfR1pJUAorCS8qIGNsaWVudCBjYW4gaGFuZGxlIGd6aXAgLyB3ZSBhcmUgZ29pbmcgdG8gc2VuZCBnemlwICovCisJc21hbGxpbnQgY29udGVudF9nemlwOworI2VuZGlmCit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIHZlcmJvc2UgICAgICAgICAgIChHLnZlcmJvc2UgICAgICAgICAgKQorI2RlZmluZSBmbGdfZGVueV9hbGwgICAgICAoRy5mbGdfZGVueV9hbGwgICAgICkKKyNkZWZpbmUgcm10X2lwICAgICAgICAgICAgKEcucm10X2lwICAgICAgICAgICApCisjZGVmaW5lIGJpbmRfYWRkcl9vcl9wb3J0IChHLmJpbmRfYWRkcl9vcl9wb3J0KQorI2RlZmluZSBnX3F1ZXJ5ICAgICAgICAgICAoRy5nX3F1ZXJ5ICAgICAgICAgICkKKyNkZWZpbmUgb3B0X2NfY29uZmlnRmlsZSAgKEcub3B0X2NfY29uZmlnRmlsZSApCisjZGVmaW5lIGhvbWVfaHR0cGQgICAgICAgIChHLmhvbWVfaHR0cGQgICAgICAgKQorI2RlZmluZSBpbmRleF9wYWdlICAgICAgICAoRy5pbmRleF9wYWdlICAgICAgICkKKyNkZWZpbmUgZm91bmRfbWltZV90eXBlICAgKEcuZm91bmRfbWltZV90eXBlICApCisjZGVmaW5lIGZvdW5kX21vdmVkX3RlbXBvcmFyaWx5IChHLmZvdW5kX21vdmVkX3RlbXBvcmFyaWx5KQorI2RlZmluZSBsYXN0X21vZCAgICAgICAgICAoRy5sYXN0X21vZCAgICAgICAgICkKKyNkZWZpbmUgaXBfYV9kICAgICAgICAgICAgKEcuaXBfYV9kICAgICAgICAgICApCisjZGVmaW5lIGdfcmVhbG0gICAgICAgICAgIChHLmdfcmVhbG0gICAgICAgICAgKQorI2RlZmluZSByZW1vdGV1c2VyICAgICAgICAoRy5yZW1vdGV1c2VyICAgICAgICkKKyNkZWZpbmUgcmVmZXJlciAgICAgICAgICAgKEcucmVmZXJlciAgICAgICAgICApCisjZGVmaW5lIHVzZXJfYWdlbnQgICAgICAgIChHLnVzZXJfYWdlbnQgICAgICAgKQorI2RlZmluZSBob3N0ICAgICAgICAgICAgICAoRy5ob3N0ICAgICAgICAgICAgICkKKyNkZWZpbmUgaHR0cF9hY2NlcHQgICAgICAgKEcuaHR0cF9hY2NlcHQgICAgICApCisjZGVmaW5lIGh0dHBfYWNjZXB0X2xhbmd1YWdlIChHLmh0dHBfYWNjZXB0X2xhbmd1YWdlKQorI2RlZmluZSBmaWxlX3NpemUgICAgICAgICAoRy5maWxlX3NpemUgICAgICAgICkKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKyNkZWZpbmUgcmFuZ2Vfc3RhcnQgICAgICAgKEcucmFuZ2Vfc3RhcnQgICAgICApCisjZGVmaW5lIHJhbmdlX2VuZCAgICAgICAgIChHLnJhbmdlX2VuZCAgICAgICAgKQorI2RlZmluZSByYW5nZV9sZW4gICAgICAgICAoRy5yYW5nZV9sZW4gICAgICAgICkKKyNlbHNlCitlbnVtIHsKKwlyYW5nZV9zdGFydCA9IDAsCisJcmFuZ2VfZW5kID0gTUFYSU5UKG9mZl90KSAtIDEsCisJcmFuZ2VfbGVuID0gTUFYSU5UKG9mZl90KSwKK307CisjZW5kaWYKKyNkZWZpbmUgcm10X2lwX3N0ciAgICAgICAgKEcucm10X2lwX3N0ciAgICAgICApCisjZGVmaW5lIGdfYXV0aCAgICAgICAgICAgIChHLmdfYXV0aCAgICAgICAgICAgKQorI2RlZmluZSBtaW1lX2EgICAgICAgICAgICAoRy5taW1lX2EgICAgICAgICAgICkKKyNkZWZpbmUgc2NyaXB0X2kgICAgICAgICAgKEcuc2NyaXB0X2kgICAgICAgICApCisjZGVmaW5lIGlvYnVmICAgICAgICAgICAgIChHLmlvYnVmICAgICAgICAgICAgKQorI2RlZmluZSBoZHJfcHRyICAgICAgICAgICAoRy5oZHJfcHRyICAgICAgICAgICkKKyNkZWZpbmUgaGRyX2NudCAgICAgICAgICAgKEcuaGRyX2NudCAgICAgICAgICApCisjZGVmaW5lIGh0dHBfZXJyb3JfcGFnZSAgIChHLmh0dHBfZXJyb3JfcGFnZSAgKQorI2RlZmluZSBwcm94eSAgICAgICAgICAgICAoRy5wcm94eSAgICAgICAgICAgICkKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9HWklQCisjIGRlZmluZSBjb250ZW50X2d6aXAgICAgIChHLmNvbnRlbnRfZ3ppcCAgICAgKQorI2Vsc2UKKyMgZGVmaW5lIGNvbnRlbnRfZ3ppcCAgICAgMAorI2VuZGlmCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKGdfcmVhbG0gPSAiV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiI7KSBcCisJYmluZF9hZGRyX29yX3BvcnQgPSAiODAiOyBcCisJaW5kZXhfcGFnZSA9IGluZGV4X2h0bWw7IFwKKwlmaWxlX3NpemUgPSAtMTsgXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIFNUUk5DQVNFQ01QKGEsIHN0cikgc3RybmNhc2VjbXAoKGEpLCAoc3RyKSwgc2l6ZW9mKHN0ciktMSkKKworLyogUHJvdG90eXBlcyAqLworZW51bSB7CisJU0VORF9IRUFERVJTICAgICA9ICgxIDw8IDApLAorCVNFTkRfQk9EWSAgICAgICAgPSAoMSA8PCAxKSwKKwlTRU5EX0hFQURFUlNfQU5EX0JPRFkgPSBTRU5EX0hFQURFUlMgKyBTRU5EX0JPRFksCit9Oworc3RhdGljIHZvaWQgc2VuZF9maWxlX2FuZF9leGl0KGNvbnN0IGNoYXIgKnVybCwgaW50IHdoYXQpIE5PUkVUVVJOOworCitzdGF0aWMgdm9pZCBmcmVlX2xsaXN0KGhhc19uZXh0X3B0ciAqKnBwdHIpCit7CisJaGFzX25leHRfcHRyICpjdXIgPSAqcHB0cjsKKwl3aGlsZSAoY3VyKSB7CisJCWhhc19uZXh0X3B0ciAqdCA9IGN1cjsKKwkJY3VyID0gY3VyLT5uZXh0OworCQlmcmVlKHQpOworCX0KKwkqcHB0ciA9IE5VTEw7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgZnJlZV9IdGFjY2Vzc19saXN0KEh0YWNjZXNzICoqcHB0cikKK3sKKwlmcmVlX2xsaXN0KChoYXNfbmV4dF9wdHIqKilwcHRyKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCBmcmVlX0h0YWNjZXNzX0lQX2xpc3QoSHRhY2Nlc3NfSVAgKipwcHRyKQoreworCWZyZWVfbGxpc3QoKGhhc19uZXh0X3B0cioqKXBwdHIpOworfQorCisvKiBSZXR1cm5zIHByZXN1bWVkIG1hc2sgd2lkdGggaW4gYml0cyBvciA8IDAgb24gZXJyb3IuCisgKiBVcGRhdGVzIHN0cnAsIHN0b3JlcyBJUCBhdCBwcm92aWRlZCBwb2ludGVyICovCitzdGF0aWMgaW50IHNjYW5faXAoY29uc3QgY2hhciAqKnN0cnAsIHVuc2lnbmVkICppcHAsIHVuc2lnbmVkIGNoYXIgZW5kYykKK3sKKwljb25zdCBjaGFyICpwID0gKnN0cnA7CisJaW50IGF1dG9fbWFzayA9IDg7CisJdW5zaWduZWQgaXAgPSAwOworCWludCBqOworCisJaWYgKCpwID09ICcvJykKKwkJcmV0dXJuIC1hdXRvX21hc2s7CisKKwlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCXVuc2lnbmVkIG9jdGV0OworCisJCWlmICgoKnAgPCAnMCcgfHwgKnAgPiAnOScpICYmICpwICE9ICcvJyAmJiAqcCkKKwkJCXJldHVybiAtYXV0b19tYXNrOworCQlvY3RldCA9IDA7CisJCXdoaWxlICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKSB7CisJCQlvY3RldCAqPSAxMDsKKwkJCW9jdGV0ICs9ICpwIC0gJzAnOworCQkJaWYgKG9jdGV0ID4gMjU1KQorCQkJCXJldHVybiAtYXV0b19tYXNrOworCQkJcCsrOworCQl9CisJCWlmICgqcCA9PSAnLicpCisJCQlwKys7CisJCWlmICgqcCAhPSAnLycgJiYgKnApCisJCQlhdXRvX21hc2sgKz0gODsKKwkJaXAgPSAoaXAgPDwgOCkgfCBvY3RldDsKKwl9CisJaWYgKCpwKSB7CisJCWlmICgqcCAhPSBlbmRjKQorCQkJcmV0dXJuIC1hdXRvX21hc2s7CisJCXArKzsKKwkJaWYgKCpwID09ICdcMCcpCisJCQlyZXR1cm4gLWF1dG9fbWFzazsKKwl9CisJKmlwcCA9IGlwOworCSpzdHJwID0gcDsKKwlyZXR1cm4gYXV0b19tYXNrOworfQorCisvKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gU3RvcmVzIElQIGFuZCBtYXNrIGF0IHByb3ZpZGVkIHBvaW50ZXJzICovCitzdGF0aWMgaW50IHNjYW5faXBfbWFzayhjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkICppcHAsIHVuc2lnbmVkICptYXNrcCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBtYXNrOworCWNoYXIgKnA7CisKKwlpID0gc2Nhbl9pcCgmc3RyLCBpcHAsICcvJyk7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gaTsKKworCWlmICgqc3RyKSB7CisJCS8qIHRoZXJlIGlzIC94eHggYWZ0ZXIgZG90dGVkLUlQIGFkZHJlc3MgKi8KKwkJaSA9IGJiX3N0cnRvdShzdHIsICZwLCAxMCk7CisJCWlmICgqcCA9PSAnLicpIHsKKwkJCS8qICd4eHgnIGl0c2VsZiBpcyBkb3R0ZWQtSVAgbWFzaywgcGFyc2UgaXQgKi8KKwkJCS8qIChyZXR1cm4gMCAoc3VjY2Vzcykgb25seSBpZiBpdCBoYXMgTi5OLk4uTiBmb3JtKSAqLworCQkJcmV0dXJuIHNjYW5faXAoJnN0ciwgbWFza3AsICdcMCcpIC0gMzI7CisJCX0KKwkJaWYgKCpwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChpID4gMzIpCisJCXJldHVybiAtMTsKKworCWlmIChzaXplb2YodW5zaWduZWQpID09IDQgJiYgaSA9PSAzMikgeworCQkvKiBtYXNrID4+PSAzMiBiZWxvdyBtYXkgbm90IHdvcmsgKi8KKwkJbWFzayA9IDA7CisJfSBlbHNlIHsKKwkJbWFzayA9IDB4ZmZmZmZmZmY7CisJCW1hc2sgPj49IGk7CisJfQorCS8qIGkgPT0gMCAtPiAqbWFza3AgPSAweDAwMDAwMDAwCisJICogaSA9PSAxIC0+ICptYXNrcCA9IDB4ODAwMDAwMDAKKwkgKiBpID09IDQgLT4gKm1hc2twID0gMHhmMDAwMDAwMAorCSAqIGkgPT0gMzEgLT4gKm1hc2twID0gMHhmZmZmZmZmZQorCSAqIGkgPT0gMzIgLT4gKm1hc2twID0gMHhmZmZmZmZmZiAqLworCSptYXNrcCA9ICh1aW50MzJfdCkofm1hc2spOworCXJldHVybiAwOworfQorCisvKgorICogUGFyc2UgY29uZmlndXJhdGlvbiBmaWxlIGludG8gaW4tbWVtb3J5IGxpbmtlZCBsaXN0LgorICoKKyAqIEFueSBwcmV2aW91cyBJUCBydWxlcyBhcmUgZGlzY2FyZGVkLgorICogSWYgdGhlIGZsYWcgYXJndW1lbnQgaXMgbm90IFNVQkRJUl9QQVJTRSB0aGVuIGFsbCAvcGF0aCBhbmQgbWltZSBydWxlcworICogYXJlIGFsc28gZGlzY2FyZGVkLiAgVGhhdCBpcywgcHJldmlvdXMgc2V0dGluZ3MgYXJlIHJldGFpbmVkIGlmIGZsYWcgaXMKKyAqIFNVQkRJUl9QQVJTRS4KKyAqIEVycm9yIHBhZ2VzIGFyZSBvbmx5IHBhcnNlZCBvbiB0aGUgbWFpbiBjb25maWcgZmlsZS4KKyAqCisgKiBwYXRoICAgUGF0aCB3aGVyZSB0byBsb29rIGZvciBodHRwZC5jb25mICh3aXRob3V0IGZpbGVuYW1lKS4KKyAqIGZsYWcgICBUeXBlIG9mIHRoZSBwYXJzZSByZXF1ZXN0LgorICovCisvKiBmbGFnIHBhcmFtOiAqLworZW51bSB7CisJRklSU1RfUEFSU0UgICAgPSAwLCAvKiBwYXRoIHdpbGwgYmUgIi9ldGMiICovCisJU0lHTkFMRURfUEFSU0UgPSAxLCAvKiBwYXRoIHdpbGwgYmUgIi9ldGMiICovCisJU1VCRElSX1BBUlNFICAgPSAyLCAvKiBwYXRoIHdpbGwgYmUgZGVyaXZlZCBmcm9tIFVSTCAqLworfTsKK3N0YXRpYyB2b2lkIHBhcnNlX2NvbmYoY29uc3QgY2hhciAqcGF0aCwgaW50IGZsYWcpCit7CisJLyogaW50ZXJuYWxseSB1c2VkIGV4dHJhIGZsYWcgc3RhdGUgKi8KKwllbnVtIHsgVFJZX0NVUkRJUl9QQVJTRSA9IDMgfTsKKworCUZJTEUgKmY7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJY2hhciBidWZbMTYwXTsKKworCS8qIGRpc2NhcmQgb2xkIHJ1bGVzICovCisJZnJlZV9IdGFjY2Vzc19JUF9saXN0KCZpcF9hX2QpOworCWZsZ19kZW55X2FsbCA9IDA7CisJLyogcmV0YWluIHByZXZpb3VzIGF1dGggYW5kIG1pbWUgY29uZmlnIG9ubHkgZm9yIHN1YmRpciBwYXJzZSAqLworCWlmIChmbGFnICE9IFNVQkRJUl9QQVJTRSkgeworCQlmcmVlX0h0YWNjZXNzX2xpc3QoJm1pbWVfYSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCQlmcmVlX0h0YWNjZXNzX2xpc3QoJmdfYXV0aCk7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUgorCQlmcmVlX0h0YWNjZXNzX2xpc3QoJnNjcmlwdF9pKTsKKyNlbmRpZgorCX0KKworCWZpbGVuYW1lID0gb3B0X2NfY29uZmlnRmlsZTsKKwlpZiAoZmxhZyA9PSBTVUJESVJfUEFSU0UgfHwgZmlsZW5hbWUgPT0gTlVMTCkgeworCQlmaWxlbmFtZSA9IGFsbG9jYShzdHJsZW4ocGF0aCkgKyBzaXplb2YoSFRUUERfQ09ORikgKyAyKTsKKwkJc3ByaW50ZigoY2hhciAqKWZpbGVuYW1lLCAiJXMvJXMiLCBwYXRoLCBIVFRQRF9DT05GKTsKKwl9CisKKwl3aGlsZSAoKGYgPSBmb3Blbl9mb3JfcmVhZChmaWxlbmFtZSkpID09IE5VTEwpIHsKKwkJaWYgKGZsYWcgPj0gU1VCRElSX1BBUlNFKSB7IC8qIFNVQkRJUiBvciBUUllfQ1VSRElSICovCisJCQkvKiBjb25maWcgZmlsZSBub3QgZm91bmQsIG5vIGNoYW5nZXMgdG8gY29uZmlnICovCisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGZsYWcgPT0gRklSU1RfUEFSU0UpIHsKKwkJCS8qIC1jIENPTkZGSUxFIGdpdmVuLCBidXQgQ09ORkZJTEUgZG9lc24ndCBleGlzdD8gKi8KKwkJCWlmIChvcHRfY19jb25maWdGaWxlKQorCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUob3B0X2NfY29uZmlnRmlsZSk7CisJCQkvKiBlbHNlOiBubyAtYywgdGh1cyB3ZSBsb29rZWQgYXQgL2V0Yy9odHRwZC5jb25mLAorCQkJICogYW5kIGl0J3Mgbm90IHRoZXJlLiB0cnkgLi9odHRwZC5jb25mOiAqLworCQl9CisJCWZsYWcgPSBUUllfQ1VSRElSX1BBUlNFOworCQlmaWxlbmFtZSA9IEhUVFBEX0NPTkY7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCS8qIGluICIvZmlsZTp1c2VyOnBhc3MiIGxpbmVzLCB3ZSBwcmVwZW5kIHBhdGggaW4gc3ViZGlycyAqLworCWlmIChmbGFnICE9IFNVQkRJUl9QQVJTRSkKKwkJcGF0aCA9ICIiOworI2VuZGlmCisJLyogVGhlIGxpbmVzIGNhbiBiZToKKwkgKgorCSAqIEk6ZGVmYXVsdF9pbmRleF9maWxlCisJICogSDpodHRwX2hvbWUKKwkgKiBbQURdOklQWy9tYXNrXSAgICMgYWxsb3cvZGVueSwgKiBmb3Igd2lsZGNhcmQKKwkgKiBFbm5uOmVycm9yLmh0bWwgICMgZXJyb3IgcGFnZSBmb3Igc3RhdHVzIG5ubgorCSAqIFA6L3VybDpbaHR0cDovL11ob3N0bmFtZVs6cG9ydF0vbmV3L3BhdGggIyByZXZlcnNlIHByb3h5CisJICogLmV4dDptaW1lL3R5cGUgICAjIG1pbWUgdHlwZQorCSAqICoucGhwOi9wYXRoL3BocCAgIyBydW4geHh4LnBocCB0aHJvdWdoIGFuIGludGVycHJldGVyCisJICogL2ZpbGU6dXNlcjpwYXNzICAjIHVzZXJuYW1lIGFuZCBwYXNzd29yZAorCSAqLworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIHN0cmxlbl9idWY7CisJCXVuc2lnbmVkIGNoYXIgY2g7CisJCWNoYXIgKmFmdGVyX2NvbG9uOworCisJCXsgLyogcmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBhbmQgIyBjb21tZW50cyAqLworCQkJY2hhciAqcCwgKnAwOworCisJCQlwMCA9IGJ1ZjsKKwkJCS8qIHNraXAgbm9uLXdoaXRlc3BhY2UgYmVnaW5uaW5nLiBPZnRlbiB0aGUgd2hvbGUgbGluZQorCQkJICogaXMgbm9uLXdoaXRlc3BhY2UuIFdlIHdhbnQgdGhpcyBjYXNlIHRvIHdvcmsgZmFzdCwKKwkJCSAqIHdpdGhvdXQgbmVlZGxlc3MgY29weWluZywgdGhlcmVmb3JlIHdlIGRvbid0IG1lcmdlCisJCQkgKiB0aGlzIG9wZXJhdGlvbiBpbnRvIG5leHQgd2hpbGUgbG9vcC4gKi8KKwkJCXdoaWxlICgoY2ggPSAqcDApICE9ICdcMCcgJiYgY2ggIT0gJ1xuJyAmJiBjaCAhPSAnIycKKwkJCSAmJiBjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JworCQkJKSB7CisJCQkJcDArKzsKKwkJCX0KKwkJCXAgPSBwMDsKKwkJCS8qIGlmIHdlIGVudGVyIHRoaXMgbG9vcCwgd2UgaGF2ZSBzb21lIHdoaXRlc3BhY2UuCisJCQkgKiBkaXNjYXJkIGl0ICovCisJCQl3aGlsZSAoY2ggIT0gJ1wwJyAmJiBjaCAhPSAnXG4nICYmIGNoICE9ICcjJykgeworCQkJCWlmIChjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JykgeworCQkJCQkqcCsrID0gY2g7CisJCQkJfQorCQkJCWNoID0gKisrcDA7CisJCQl9CisJCQkqcCA9ICdcMCc7CisJCQlzdHJsZW5fYnVmID0gcCAtIGJ1ZjsKKwkJCWlmIChzdHJsZW5fYnVmID09IDApCisJCQkJY29udGludWU7IC8qIGVtcHR5IGxpbmUgKi8KKwkJfQorCisJCWFmdGVyX2NvbG9uID0gc3RyY2hyKGJ1ZiwgJzonKTsKKwkJLyogc3RyYW5nZSBsaW5lPyAqLworCQlpZiAoYWZ0ZXJfY29sb24gPT0gTlVMTCB8fCAqKythZnRlcl9jb2xvbiA9PSAnXDAnKQorCQkJZ290byBjb25maWdfZXJyb3I7CisKKwkJY2ggPSAoYnVmWzBdICYgfjB4MjApOyAvKiB0b3VwcGVyIGlmIGl0J3MgYSBsZXR0ZXIgKi8KKworCQlpZiAoY2ggPT0gJ0knKSB7CisJCQlpZiAoaW5kZXhfcGFnZSAhPSBpbmRleF9odG1sKQorCQkJCWZyZWUoKGNoYXIqKWluZGV4X3BhZ2UpOworCQkJaW5kZXhfcGFnZSA9IHhzdHJkdXAoYWZ0ZXJfY29sb24pOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBkbyBub3QgYWxsb3cganVtcGluZyBhcm91bmQgdXNpbmcgSCBpbiBzdWJkaXIncyBjb25maWdzICovCisJCWlmIChmbGFnID09IEZJUlNUX1BBUlNFICYmIGNoID09ICdIJykgeworCQkJaG9tZV9odHRwZCA9IHhzdHJkdXAoYWZ0ZXJfY29sb24pOworCQkJeGNoZGlyKGhvbWVfaHR0cGQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY2ggPT0gJ0EnIHx8IGNoID09ICdEJykgeworCQkJSHRhY2Nlc3NfSVAgKnBpcDsKKworCQkJaWYgKCphZnRlcl9jb2xvbiA9PSAnKicpIHsKKwkJCQlpZiAoY2ggPT0gJ0QnKSB7CisJCQkJCS8qIG1lbW9yaXplICJkZW55IGFsbCIgKi8KKwkJCQkJZmxnX2RlbnlfYWxsID0gMTsKKwkJCQl9CisJCQkJLyogc2tpcCBhc3N1bWVkICJBOioiLCBpdCBpcyBhIGRlZmF1bHQgYW55d2F5ICovCisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBzdG9yZSAiYWxsb3cvZGVueSBJUC9tYXNrIiBsaW5lICovCisJCQlwaXAgPSB4emFsbG9jKHNpemVvZigqcGlwKSk7CisJCQlpZiAoc2Nhbl9pcF9tYXNrKGFmdGVyX2NvbG9uLCAmcGlwLT5pcCwgJnBpcC0+bWFzaykpIHsKKwkJCQkvKiBJUHsvbWFza30gc3ludGF4IGVycm9yIGRldGVjdGVkLCBwcm90ZWN0IGFsbCAqLworCQkJCWNoID0gJ0QnOworCQkJCXBpcC0+bWFzayA9IDA7CisJCQl9CisJCQlwaXAtPmFsbG93X2RlbnkgPSBjaDsKKwkJCWlmIChjaCA9PSAnRCcpIHsKKwkJCQkvKiBEZW55OmZyb21fSVAgLSBwcmVwZW5kICovCisJCQkJcGlwLT5uZXh0ID0gaXBfYV9kOworCQkJCWlwX2FfZCA9IHBpcDsKKwkJCX0gZWxzZSB7CisJCQkJLyogQTpmcm9tX0lQIC0gYXBwZW5kICh0aHVzIGFsbCBEJ3MgcHJlY2VkZXMgQSdzKSAqLworCQkJCUh0YWNjZXNzX0lQICpwcmV2X0lQID0gaXBfYV9kOworCQkJCWlmIChwcmV2X0lQID09IE5VTEwpIHsKKwkJCQkJaXBfYV9kID0gcGlwOworCQkJCX0gZWxzZSB7CisJCQkJCXdoaWxlIChwcmV2X0lQLT5uZXh0KQorCQkJCQkJcHJldl9JUCA9IHByZXZfSVAtPm5leHQ7CisJCQkJCXByZXZfSVAtPm5leHQgPSBwaXA7CisJCQkJfQorCQkJfQorCQkJY29udGludWU7CisJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTCisJCWlmIChmbGFnID09IEZJUlNUX1BBUlNFICYmIGNoID09ICdFJykgeworCQkJdW5zaWduZWQgaTsKKwkJCWludCBzdGF0dXMgPSBhdG9pKGJ1ZiArIDEpOyAvKiBlcnJvciBzdGF0dXMgY29kZSAqLworCisJCQlpZiAoc3RhdHVzIDwgSFRUUF9DT05USU5VRSkgeworCQkJCWdvdG8gY29uZmlnX2Vycm9yOworCQkJfQorCQkJLyogdGhlbiBlcnJvciBwYWdlOyBmaW5kIG1hdGNoaW5nIHN0YXR1cyAqLworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHR0cF9yZXNwb25zZV90eXBlKTsgaSsrKSB7CisJCQkJaWYgKGh0dHBfcmVzcG9uc2VfdHlwZVtpXSA9PSBzdGF0dXMpIHsKKwkJCQkJLyogV2UgY2hkaXIgdG8gaG9tZV9odHRwZCwgdGh1cyBubyBuZWVkIHRvCisJCQkJCSAqIGNvbmNhdF9wYXRoX2ZpbGUoaG9tZV9odHRwZCwgYWZ0ZXJfY29sb24pCisJCQkJCSAqIGhlcmUgKi8KKwkJCQkJaHR0cF9lcnJvcl9wYWdlW2ldID0geHN0cmR1cChhZnRlcl9jb2xvbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisJCWlmIChmbGFnID09IEZJUlNUX1BBUlNFICYmIGNoID09ICdQJykgeworCQkJLyogUDovdXJsOltodHRwOi8vXWhvc3RuYW1lWzpwb3J0XS9uZXcvcGF0aCAqLworCQkJY2hhciAqdXJsX2Zyb20sICpob3N0X3BvcnQsICp1cmxfdG87CisJCQlIdGFjY2Vzc19Qcm94eSAqcHJveHlfZW50cnk7CisKKwkJCXVybF9mcm9tID0gYWZ0ZXJfY29sb247CisJCQlob3N0X3BvcnQgPSBzdHJjaHIoYWZ0ZXJfY29sb24sICc6Jyk7CisJCQlpZiAoaG9zdF9wb3J0ID09IE5VTEwpIHsKKwkJCQlnb3RvIGNvbmZpZ19lcnJvcjsKKwkJCX0KKwkJCSpob3N0X3BvcnQrKyA9ICdcMCc7CisJCQlpZiAoc3RybmNtcChob3N0X3BvcnQsICJodHRwOi8vIiwgNykgPT0gMCkKKwkJCQlob3N0X3BvcnQgKz0gNzsKKwkJCWlmICgqaG9zdF9wb3J0ID09ICdcMCcpIHsKKwkJCQlnb3RvIGNvbmZpZ19lcnJvcjsKKwkJCX0KKwkJCXVybF90byA9IHN0cmNocihob3N0X3BvcnQsICcvJyk7CisJCQlpZiAodXJsX3RvID09IE5VTEwpIHsKKwkJCQlnb3RvIGNvbmZpZ19lcnJvcjsKKwkJCX0KKwkJCSp1cmxfdG8gPSAnXDAnOworCQkJcHJveHlfZW50cnkgPSB4emFsbG9jKHNpemVvZigqcHJveHlfZW50cnkpKTsKKwkJCXByb3h5X2VudHJ5LT51cmxfZnJvbSA9IHhzdHJkdXAodXJsX2Zyb20pOworCQkJcHJveHlfZW50cnktPmhvc3RfcG9ydCA9IHhzdHJkdXAoaG9zdF9wb3J0KTsKKwkJCSp1cmxfdG8gPSAnLyc7CisJCQlwcm94eV9lbnRyeS0+dXJsX3RvID0geHN0cmR1cCh1cmxfdG8pOworCQkJcHJveHlfZW50cnktPm5leHQgPSBwcm94eTsKKwkJCXByb3h5ID0gcHJveHlfZW50cnk7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisJCS8qIHRoZSByZXN0IG9mIGRpcmVjdGl2ZXMgYXJlIG5vbi1hbHBoYWJldGljLAorCQkgKiBtdXN0IGF2b2lkIHVzaW5nICJ0b3VwcGVyJ2VkIiBjaCAqLworCQljaCA9IGJ1ZlswXTsKKworCQlpZiAoY2ggPT0gJy4nIC8qICIuZXh0Om1pbWUvdHlwZSIgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUgorCQkgfHwgKGNoID09ICcqJyAmJiBidWZbMV0gPT0gJy4nKSAvKiAiKi5waHA6L3BhdGgvcGhwIiAqLworI2VuZGlmCisJCSkgeworCQkJY2hhciAqcDsKKwkJCUh0YWNjZXNzICpjdXI7CisKKwkJCWN1ciA9IHh6YWxsb2Moc2l6ZW9mKCpjdXIpIC8qIGluY2x1ZGVzIHNwYWNlIGZvciBOVUwgKi8gKyBzdHJsZW5fYnVmKTsKKwkJCXN0cmNweShjdXItPmJlZm9yZV9jb2xvbiwgYnVmKTsKKwkJCXAgPSBjdXItPmJlZm9yZV9jb2xvbiArIChhZnRlcl9jb2xvbiAtIGJ1Zik7CisJCQlwWy0xXSA9ICdcMCc7CisJCQljdXItPmFmdGVyX2NvbG9uID0gcDsKKwkJCWlmIChjaCA9PSAnLicpIHsKKwkJCQkvKiAubWltZSBsaW5lOiBwcmVwZW5kIHRvIG1pbWVfYSBsaXN0ICovCisJCQkJY3VyLT5uZXh0ID0gbWltZV9hOworCQkJCW1pbWVfYSA9IGN1cjsKKwkJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUgorCQkJZWxzZSB7CisJCQkJLyogc2NyaXB0IGludGVycHJldGVyIGxpbmU6IHByZXBlbmQgdG8gc2NyaXB0X2kgbGlzdCAqLworCQkJCWN1ci0+bmV4dCA9IHNjcmlwdF9pOworCQkJCXNjcmlwdF9pID0gY3VyOworCQkJfQorI2VuZGlmCisJCQljb250aW51ZTsKKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCQlpZiAoY2ggPT0gJy8nKSB7IC8qICIvZmlsZTp1c2VyOnBhc3MiICovCisJCQljaGFyICpwOworCQkJSHRhY2Nlc3MgKmN1cjsKKwkJCXVuc2lnbmVkIGZpbGVfbGVuOworCisJCQkvKiBub3RlOiBwYXRoIGlzICIiIHVubGVzcyB3ZSBhcmUgaW4gU1VCRElSIHBhcnNlLAorCQkJICogb3RoZXJ3aXNlIGl0IGRvZXMgTk9UIHN0YXJ0IHdpdGggIi8iICovCisJCQljdXIgPSB4emFsbG9jKHNpemVvZigqY3VyKSAvKiBpbmNsdWRlcyBzcGFjZSBmb3IgTlVMICovCisJCQkJKyAxICsgc3RybGVuKHBhdGgpCisJCQkJKyBzdHJsZW5fYnVmCisJCQkJKTsKKwkJCS8qIGZvcm0gIi9wYXRoL2ZpbGUiICovCisJCQlzcHJpbnRmKGN1ci0+YmVmb3JlX2NvbG9uLCAiLyVzJS4qcyIsCisJCQkJcGF0aCwKKwkJCQkoaW50KSAoYWZ0ZXJfY29sb24gLSBidWYgLSAxKSwgLyogaW5jbHVkZXMgIi8iLCBidXQgbm90ICI6IiAqLworCQkJCWJ1Zik7CisJCQkvKiBjYW5vbmljYWxpemUgaXQgKi8KKwkJCXAgPSBiYl9zaW1wbGlmeV9hYnNfcGF0aF9pbnBsYWNlKGN1ci0+YmVmb3JlX2NvbG9uKTsKKwkJCWZpbGVfbGVuID0gcCAtIGN1ci0+YmVmb3JlX2NvbG9uOworCQkJLyogYWRkICJ1c2VyOnBhc3MiIGFmdGVyIE5VTCAqLworCQkJc3RyY3B5KCsrcCwgYWZ0ZXJfY29sb24pOworCQkJY3VyLT5hZnRlcl9jb2xvbiA9IHA7CisKKwkJCS8qIGluc2VydCBjdXIgaW50byBnX2F1dGggKi8KKwkJCS8qIGdfYXV0aCBpcyBzb3J0ZWQgYnkgZGVjcmVhc2VkIGZpbGVuYW1lIGxlbmd0aCAqLworCQkJeworCQkJCUh0YWNjZXNzICphdXRoLCAqKmF1dGhwOworCisJCQkJYXV0aHAgPSAmZ19hdXRoOworCQkJCXdoaWxlICgoYXV0aCA9ICphdXRocCkgIT0gTlVMTCkgeworCQkJCQlpZiAoZmlsZV9sZW4gPj0gc3RybGVuKGF1dGgtPmJlZm9yZV9jb2xvbikpIHsKKwkJCQkJCS8qIGluc2VydCBjdXIgYmVmb3JlIGF1dGggKi8KKwkJCQkJCWN1ci0+bmV4dCA9IGF1dGg7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlhdXRocCA9ICZhdXRoLT5uZXh0OworCQkJCX0KKwkJCQkqYXV0aHAgPSBjdXI7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmIC8qIEJBU0lDX0FVVEggKi8KKworCQkvKiB0aGUgbGluZSBpcyBub3QgcmVjb2duaXplZCAqLworIGNvbmZpZ19lcnJvcjoKKwkJYmJfZXJyb3JfbXNnKCJjb25maWcgZXJyb3IgJyVzJyBpbiAnJXMnIiwgYnVmLCBmaWxlbmFtZSk7CisJIH0gLyogd2hpbGUgKGZnZXRzKSAqLworCisJIGZjbG9zZShmKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSCisvKgorICogR2l2ZW4gYSBzdHJpbmcsIGh0bWwtZW5jb2RlIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIC1lIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gcHJvdmlkZSBhbiBlYXN5IHdheQorICogZm9yIHNjcmlwdHMgdG8gZW5jb2RlIHJlc3VsdCBkYXRhIHdpdGhvdXQgY29uZnVzaW5nIGJyb3dzZXJzLiAgVGhlCisgKiByZXR1cm5lZCBzdHJpbmcgcG9pbnRlciBpcyBtZW1vcnkgYWxsb2NhdGVkIGJ5IG1hbGxvYygpLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmNvZGVkIHN0cmluZyAobWFsbG9jZWQpLgorICovCitzdGF0aWMgY2hhciAqZW5jb2RlU3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwkvKiB0YWtlIHRoZSBzaW1wbGUgcm91dGUgYW5kIGVuY29kZSBldmVyeXRoaW5nICovCisJLyogY291bGQgcG9zc2libHkgc2NhbiBvbmNlIHRvIGdldCBsZW5ndGguICAgICAqLworCWludCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwljaGFyICpvdXQgPSB4bWFsbG9jKGxlbiAqIDYgKyAxKTsKKwljaGFyICpwID0gb3V0OworCWNoYXIgY2g7CisKKwl3aGlsZSAoKGNoID0gKnN0cmluZysrKSAhPSAnXDAnKSB7CisJCS8qIHZlcnkgc2ltcGxlIGNoZWNrIGZvciB3aGF0IHRvIGVuY29kZSAqLworCQlpZiAoaXNhbG51bShjaCkpCisJCQkqcCsrID0gY2g7CisJCWVsc2UKKwkJCXAgKz0gc3ByaW50ZihwLCAiJiMlZDsiLCAodW5zaWduZWQgY2hhcikgY2gpOworCX0KKwkqcCA9ICdcMCc7CisJcmV0dXJuIG91dDsKK30KKyNlbmRpZgorCisvKgorICogR2l2ZW4gYSBVUkwgZW5jb2RlZCBzdHJpbmcsIGNvbnZlcnQgaXQgdG8gcGxhaW4gYXNjaWkuCisgKiBTaW5jZSBkZWNvZGluZyBhbHdheXMgbWFrZXMgc3RyaW5ncyBzbWFsbGVyLCB0aGUgZGVjb2RlIGlzIGRvbmUgaW4tcGxhY2UuCisgKiBUaHVzLCBjYWxsZXJzIHNob3VsZCB4c3RyZHVwKCkgdGhlIGFyZ3VtZW50IGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlCisgKiBhcmd1bWVudCBtb2RpZmllZC4gIFRoZSByZXR1cm4gaXMgdGhlIG9yaWdpbmFsIHBvaW50ZXIsIGFsbG93aW5nIHRoaXMKKyAqIGZ1bmN0aW9uIHRvIGJlIGVhc2lseSB1c2VkIGFzIGFyZ3VtZW50cyB0byBvdGhlciBmdW5jdGlvbnMuCisgKgorICogc3RyaW5nICAgIFRoZSBmaXJzdCBzdHJpbmcgdG8gZGVjb2RlLgorICogb3B0aW9uX2QgIDEgaWYgY2FsbGVkIGZvciBodHRwZCAtZAorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHN0cmluZyAoc2FtZSBhcyBpbnB1dCkuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBoZXhfdG9fYmluKHVuc2lnbmVkIGNoYXIgYykKK3sKKwl1bnNpZ25lZCB2OworCisJdiA9IGMgLSAnMCc7CisJaWYgKHYgPD0gOSkKKwkJcmV0dXJuIHY7CisJLyogYyB8IDB4MjA6IGxldHRlcnMgdG8gbG93ZXIgY2FzZSwgbm9uLWxldHRlcnMKKwkgKiB0byAocG90ZW50aWFsbHkgZGlmZmVyZW50KSBub24tbGV0dGVycyAqLworCXYgPSAodW5zaWduZWQpKGMgfCAweDIwKSAtICdhJzsKKwlpZiAodiA8PSA1KQorCQlyZXR1cm4gdiArIDEwOworCXJldHVybiB+MDsKKy8qIEZvciB0ZXN0aW5nOgordm9pZCB0KGNoYXIgYykgeyBwcmludGYoIiclYycoJXUpICV1XG4iLCBjLCBjLCBoZXhfdG9fYmluKGMpKTsgfQoraW50IG1haW4oKSB7IHQoMHgxMCk7IHQoMHgyMCk7IHQoJzAnKTsgdCgnOScpOyB0KCdBJyk7IHQoJ0YnKTsgdCgnYScpOyB0KCdmJyk7Cit0KCcwJy0xKTsgdCgnOScrMSk7IHQoJ0EnLTEpOyB0KCdGJysxKTsgdCgnYSctMSk7IHQoJ2YnKzEpOyByZXR1cm4gMDsgfQorKi8KK30KK3N0YXRpYyBjaGFyICpkZWNvZGVTdHJpbmcoY2hhciAqb3JpZywgaW50IG9wdGlvbl9kKQoreworCS8qIG5vdGUgdGhhdCBkZWNvZGVkIHN0cmluZyBpcyBhbHdheXMgc2hvcnRlciB0aGFuIG9yaWdpbmFsICovCisJY2hhciAqc3RyaW5nID0gb3JpZzsKKwljaGFyICpwdHIgPSBzdHJpbmc7CisJY2hhciBjOworCisJd2hpbGUgKChjID0gKnB0cisrKSAhPSAnXDAnKSB7CisJCXVuc2lnbmVkIHY7CisKKwkJaWYgKG9wdGlvbl9kICYmIGMgPT0gJysnKSB7CisJCQkqc3RyaW5nKysgPSAnICc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyAhPSAnJScpIHsKKwkJCSpzdHJpbmcrKyA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQl2ID0gaGV4X3RvX2JpbihwdHJbMF0pOworCQlpZiAodiA+IDE1KSB7CisgYmFkX2hleDoKKwkJCWlmICghb3B0aW9uX2QpCisJCQkJcmV0dXJuIE5VTEw7CisJCQkqc3RyaW5nKysgPSAnJSc7CisJCQljb250aW51ZTsKKwkJfQorCQl2ID0gKHYgKiAxNikgfCBoZXhfdG9fYmluKHB0clsxXSk7CisJCWlmICh2ID4gMjU1KQorCQkJZ290byBiYWRfaGV4OworCQlpZiAoIW9wdGlvbl9kICYmICh2ID09ICcvJyB8fCB2ID09ICdcMCcpKSB7CisJCQkvKiBjYWxsZXIgdGFrZXMgaXQgYXMgaW5kaWNhdGlvbiBvZiBpbnZhbGlkCisJCQkgKiAoZGFuZ2Vyb3VzIHdydCBleHBsb2l0cykgY2hhcnMgKi8KKwkJCXJldHVybiBvcmlnICsgMTsKKwkJfQorCQkqc3RyaW5nKysgPSB2OworCQlwdHIgKz0gMjsKKwl9CisJKnN0cmluZyA9ICdcMCc7CisJcmV0dXJuIG9yaWc7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisvKgorICogRGVjb2RlIGEgYmFzZTY0IGRhdGEgc3RyZWFtIGFzIHBlciByZmMxNTIxLgorICogTm90ZSB0aGF0IHRoZSByZmMgc3RhdGVzIHRoYXQgbm9uIGJhc2U2NCBjaGFycyBhcmUgdG8gYmUgaWdub3JlZC4KKyAqIFNpbmNlIHRoZSBkZWNvZGUgYWx3YXlzIHJlc3VsdHMgaW4gYSBzaG9ydGVyIHNpemUgdGhhbiB0aGUgaW5wdXQsCisgKiBpdCBpcyBPSyB0byBwYXNzIHRoZSBpbnB1dCBhcmcgYXMgYW4gb3V0cHV0IGFyZy4KKyAqIFBhcmFtZXRlcjogYSBwb2ludGVyIHRvIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nLgorICogRGVjb2RlZCBkYXRhIGlzIHN0b3JlZCBpbi1wbGFjZS4KKyAqLworc3RhdGljIHZvaWQgZGVjb2RlQmFzZTY0KGNoYXIgKkRhdGEpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaW4gPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKURhdGE7CisJLyogVGhlIGRlY29kZWQgc2l6ZSB3aWxsIGJlIGF0IG1vc3QgMy80IHRoZSBzaXplIG9mIHRoZSBlbmNvZGVkICovCisJdW5zaWduZWQgY2ggPSAwOworCWludCBpID0gMDsKKworCXdoaWxlICgqaW4pIHsKKwkJaW50IHQgPSAqaW4rKzsKKworCQlpZiAodCA+PSAnMCcgJiYgdCA8PSAnOScpCisJCQl0ID0gdCAtICcwJyArIDUyOworCQllbHNlIGlmICh0ID49ICdBJyAmJiB0IDw9ICdaJykKKwkJCXQgPSB0IC0gJ0EnOworCQllbHNlIGlmICh0ID49ICdhJyAmJiB0IDw9ICd6JykKKwkJCXQgPSB0IC0gJ2EnICsgMjY7CisJCWVsc2UgaWYgKHQgPT0gJysnKQorCQkJdCA9IDYyOworCQllbHNlIGlmICh0ID09ICcvJykKKwkJCXQgPSA2MzsKKwkJZWxzZSBpZiAodCA9PSAnPScpCisJCQl0ID0gMDsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJY2ggPSAoY2ggPDwgNikgfCB0OworCQlpKys7CisJCWlmIChpID09IDQpIHsKKwkJCSpEYXRhKysgPSAoY2hhcikgKGNoID4+IDE2KTsKKwkJCSpEYXRhKysgPSAoY2hhcikgKGNoID4+IDgpOworCQkJKkRhdGErKyA9IChjaGFyKSBjaDsKKwkJCWkgPSAwOworCQl9CisJfQorCSpEYXRhID0gJ1wwJzsKK30KKyNlbmRpZgorCisvKgorICogQ3JlYXRlIGEgbGlzdGVuIHNlcnZlciBzb2NrZXQgb24gdGhlIGRlc2lnbmF0ZWQgcG9ydC4KKyAqLworc3RhdGljIGludCBvcGVuU2VydmVyKHZvaWQpCit7CisJdW5zaWduZWQgbiA9IGJiX3N0cnRvdShiaW5kX2FkZHJfb3JfcG9ydCwgTlVMTCwgMTApOworCWlmICghZXJybm8gJiYgbiAmJiBuIDw9IDB4ZmZmZikKKwkJbiA9IGNyZWF0ZV9hbmRfYmluZF9zdHJlYW1fb3JfZGllKE5VTEwsIG4pOworCWVsc2UKKwkJbiA9IGNyZWF0ZV9hbmRfYmluZF9zdHJlYW1fb3JfZGllKGJpbmRfYWRkcl9vcl9wb3J0LCA4MCk7CisJeGxpc3RlbihuLCA5KTsKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIExvZyB0aGUgY29ubmVjdGlvbiBjbG9zdXJlIGFuZCBleGl0LgorICovCitzdGF0aWMgdm9pZCBsb2dfYW5kX2V4aXQodm9pZCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBsb2dfYW5kX2V4aXQodm9pZCkKK3sKKwkvKiBQYXJhbm9pYS4gSUUgc2FpZCB0byBiZSBidWdneS4gSXQgbWF5IHNlbmQgc29tZSBleHRyYSBkYXRhCisJICogb3IgYmUgY29uZnVzZWQgYnkgdXMganVzdCBleGl0aW5nIHdpdGhvdXQgU0hVVF9XUi4gT2ggd2VsbC4gKi8KKwlzaHV0ZG93bigxLCBTSFVUX1dSKTsKKwkvKiBXaHk/PworCSh0aGlzIGFsc28gbWVzc2VzIHVwIHN0ZGluIHdoZW4gdXNlciBydW5zIGh0dHBkIC1pIGZyb20gdGVybWluYWwpCisJbmRlbGF5X29uKDApOworCXdoaWxlIChyZWFkKFNURElOX0ZJTEVOTywgaW9idWYsIElPQlVGX1NJWkUpID4gMCkKKwkJY29udGludWU7CisJKi8KKworCWlmICh2ZXJib3NlID4gMikKKwkJYmJfZXJyb3JfbXNnKCJjbG9zZWQiKTsKKwlfZXhpdCh4ZnVuY19lcnJvcl9yZXR2YWwpOworfQorCisvKgorICogQ3JlYXRlIGFuZCBzZW5kIEhUVFAgcmVzcG9uc2UgaGVhZGVycy4KKyAqIFRoZSBhcmd1bWVudHMgYXJlIGNvbWJpbmVkIGFuZCBzZW50IGFzIG9uZSB3cml0ZSBvcGVyYXRpb24uICBOb3RlIHRoYXQKKyAqIElFIHdpbGwgcHVrZSBiaWctdGltZSBpZiB0aGUgaGVhZGVycyBhcmUgbm90IHNlbnQgaW4gb25lIHBhY2tldCBhbmQgdGhlCisgKiBzZWNvbmQgcGFja2V0IGlzIGRlbGF5ZWQgZm9yIGFueSByZWFzb24uCisgKiByZXNwb25zZU51bSAtIHRoZSByZXN1bHQgY29kZSB0byBzZW5kLgorICovCitzdGF0aWMgdm9pZCBzZW5kX2hlYWRlcnMoaW50IHJlc3BvbnNlTnVtKQoreworCXN0YXRpYyBjb25zdCBjaGFyIFJGQzExMjNGTVRbXSBBTElHTjEgPSAiJWEsICVkICViICVZICVIOiVNOiVTIEdNVCI7CisKKwljb25zdCBjaGFyICpyZXNwb25zZVN0cmluZyA9ICIiOworCWNvbnN0IGNoYXIgKmluZm9TdHJpbmcgPSBOVUxMOworCWNvbnN0IGNoYXIgKm1pbWVfdHlwZTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUworCWNvbnN0IGNoYXIgKmVycm9yX3BhZ2UgPSBOVUxMOworI2VuZGlmCisJdW5zaWduZWQgaTsKKwl0aW1lX3QgdGltZXIgPSB0aW1lKE5VTEwpOworCWNoYXIgdG1wX3N0cls4MF07CisJaW50IGxlbjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh0dHBfcmVzcG9uc2VfdHlwZSk7IGkrKykgeworCQlpZiAoaHR0cF9yZXNwb25zZV90eXBlW2ldID09IHJlc3BvbnNlTnVtKSB7CisJCQlyZXNwb25zZVN0cmluZyA9IGh0dHBfcmVzcG9uc2VbaV0ubmFtZTsKKwkJCWluZm9TdHJpbmcgPSBodHRwX3Jlc3BvbnNlW2ldLmluZm87CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMKKwkJCWVycm9yX3BhZ2UgPSBodHRwX2Vycm9yX3BhZ2VbaV07CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIGVycm9yIG1lc3NhZ2UgaXMgSFRNTCAqLworCW1pbWVfdHlwZSA9IHJlc3BvbnNlTnVtID09IEhUVFBfT0sgPworCQkJCWZvdW5kX21pbWVfdHlwZSA6ICJ0ZXh0L2h0bWwiOworCisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZygicmVzcG9uc2U6JXUiLCByZXNwb25zZU51bSk7CisKKwkvKiBlbWl0IHRoZSBjdXJyZW50IGRhdGUgKi8KKwlzdHJmdGltZSh0bXBfc3RyLCBzaXplb2YodG1wX3N0ciksIFJGQzExMjNGTVQsIGdtdGltZSgmdGltZXIpKTsKKwlsZW4gPSBzcHJpbnRmKGlvYnVmLAorCQkJIkhUVFAvMS4wICVkICVzXHJcbkNvbnRlbnQtdHlwZTogJXNcclxuIgorCQkJIkRhdGU6ICVzXHJcbkNvbm5lY3Rpb246IGNsb3NlXHJcbiIsCisJCQlyZXNwb25zZU51bSwgcmVzcG9uc2VTdHJpbmcsIG1pbWVfdHlwZSwgdG1wX3N0cik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJaWYgKHJlc3BvbnNlTnVtID09IEhUVFBfVU5BVVRIT1JJWkVEKSB7CisJCWxlbiArPSBzcHJpbnRmKGlvYnVmICsgbGVuLAorCQkJCSJXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT1cIiVzXCJcclxuIiwKKwkJCQlnX3JlYWxtKTsKKwl9CisjZW5kaWYKKwlpZiAocmVzcG9uc2VOdW0gPT0gSFRUUF9NT1ZFRF9URU1QT1JBUklMWSkgeworCQlsZW4gKz0gc3ByaW50Zihpb2J1ZiArIGxlbiwgIkxvY2F0aW9uOiAlcy8lcyVzXHJcbiIsCisJCQkJZm91bmRfbW92ZWRfdGVtcG9yYXJpbHksCisJCQkJKGdfcXVlcnkgPyAiPyIgOiAiIiksCisJCQkJKGdfcXVlcnkgPyBnX3F1ZXJ5IDogIiIpKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUworCWlmIChlcnJvcl9wYWdlICYmIGFjY2VzcyhlcnJvcl9wYWdlLCBSX09LKSA9PSAwKSB7CisJCXN0cmNhdChpb2J1ZiwgIlxyXG4iKTsKKwkJbGVuICs9IDI7CisKKwkJaWYgKERFQlVHKQorCQkJZnByaW50ZihzdGRlcnIsICJoZWFkZXJzOiAnJXMnXG4iLCBpb2J1Zik7CisJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgaW9idWYsIGxlbik7CisJCWlmIChERUJVRykKKwkJCWZwcmludGYoc3RkZXJyLCAid3JpdGluZyBlcnJvciBwYWdlOiAnJXMnXG4iLCBlcnJvcl9wYWdlKTsKKwkJcmV0dXJuIHNlbmRfZmlsZV9hbmRfZXhpdChlcnJvcl9wYWdlLCBTRU5EX0JPRFkpOworCX0KKyNlbmRpZgorCisJaWYgKGZpbGVfc2l6ZSAhPSAtMSkgeyAgICAvKiBmaWxlICovCisJCXN0cmZ0aW1lKHRtcF9zdHIsIHNpemVvZih0bXBfc3RyKSwgUkZDMTEyM0ZNVCwgZ210aW1lKCZsYXN0X21vZCkpOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCQlpZiAocmVzcG9uc2VOdW0gPT0gSFRUUF9QQVJUSUFMX0NPTlRFTlQpIHsKKwkJCWxlbiArPSBzcHJpbnRmKGlvYnVmICsgbGVuLCAiQ29udGVudC1SYW5nZTogYnl0ZXMgJSJPRkZfRk1UInUtJSJPRkZfRk1UInUvJSJPRkZfRk1UInVcclxuIiwKKwkJCQkJcmFuZ2Vfc3RhcnQsCisJCQkJCXJhbmdlX2VuZCwKKwkJCQkJZmlsZV9zaXplKTsKKwkJCWZpbGVfc2l6ZSA9IHJhbmdlX2VuZCAtIHJhbmdlX3N0YXJ0ICsgMTsKKwkJfQorI2VuZGlmCisJCWxlbiArPSBzcHJpbnRmKGlvYnVmICsgbGVuLAorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCQkJIkFjY2VwdC1SYW5nZXM6IGJ5dGVzXHJcbiIKKyNlbmRpZgorCQkJIkxhc3QtTW9kaWZpZWQ6ICVzXHJcbiVzICUiT0ZGX0ZNVCJ1XHJcbiIsCisJCQkJdG1wX3N0ciwKKwkJCQljb250ZW50X2d6aXAgPyAiVHJhbnNmZXItbGVuZ3RoOiIgOiAiQ29udGVudC1sZW5ndGg6IiwKKwkJCQlmaWxlX3NpemUKKwkJKTsKKwl9CisKKwlpZiAoY29udGVudF9nemlwKQorCQlsZW4gKz0gc3ByaW50Zihpb2J1ZiArIGxlbiwgIkNvbnRlbnQtRW5jb2Rpbmc6IGd6aXBcclxuIik7CisKKwlpb2J1ZltsZW4rK10gPSAnXHInOworCWlvYnVmW2xlbisrXSA9ICdcbic7CisJaWYgKGluZm9TdHJpbmcpIHsKKwkJbGVuICs9IHNwcmludGYoaW9idWYgKyBsZW4sCisJCQkJIjxIVE1MPjxIRUFEPjxUSVRMRT4lZCAlczwvVElUTEU+PC9IRUFEPlxuIgorCQkJCSI8Qk9EWT48SDE+JWQgJXM8L0gxPlxuJXNcbjwvQk9EWT48L0hUTUw+XG4iLAorCQkJCXJlc3BvbnNlTnVtLCByZXNwb25zZVN0cmluZywKKwkJCQlyZXNwb25zZU51bSwgcmVzcG9uc2VTdHJpbmcsIGluZm9TdHJpbmcpOworCX0KKwlpZiAoREVCVUcpCisJCWZwcmludGYoc3RkZXJyLCAiaGVhZGVyczogJyVzJ1xuIiwgaW9idWYpOworCWlmIChmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGlvYnVmLCBsZW4pICE9IGxlbikgeworCQlpZiAodmVyYm9zZSA+IDEpCisJCQliYl9wZXJyb3JfbXNnKCJlcnJvciIpOworCQlsb2dfYW5kX2V4aXQoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfaGVhZGVyc19hbmRfZXhpdChpbnQgcmVzcG9uc2VOdW0pIE5PUkVUVVJOOworc3RhdGljIHZvaWQgc2VuZF9oZWFkZXJzX2FuZF9leGl0KGludCByZXNwb25zZU51bSkKK3sKKwlJRl9GRUFUVVJFX0hUVFBEX0daSVAoY29udGVudF9nemlwID0gMDspCisJc2VuZF9oZWFkZXJzKHJlc3BvbnNlTnVtKTsKKwlsb2dfYW5kX2V4aXQoKTsKK30KKworLyoKKyAqIFJlYWQgZnJvbSB0aGUgc29ja2V0IHVudGlsICdcbicgb3IgRU9GLiAnXHInIGNoYXJzIGFyZSByZW1vdmVkLgorICogJ1xuJyBpcyByZXBsYWNlZCB3aXRoIE5VTC4KKyAqIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIG9yIDAgaWYgbm90aGluZyBpcyByZWFkCisgKiAoJ1xyJyBhbmQgJ1xuJyBhcmUgbm90IGNvdW50ZWQpLgorICogRGF0YSBpcyByZXR1cm5lZCBpbiBpb2J1Zi4KKyAqLworc3RhdGljIGludCBnZXRfbGluZSh2b2lkKQoreworCWludCBjb3VudCA9IDA7CisJY2hhciBjOworCisJYWxhcm0oSEVBREVSX1JFQURfVElNRU9VVCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGhkcl9jbnQgPD0gMCkgeworCQkJaGRyX2NudCA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIGhkcl9idWYsIHNpemVvZihoZHJfYnVmKSk7CisJCQlpZiAoaGRyX2NudCA8PSAwKQorCQkJCWJyZWFrOworCQkJaGRyX3B0ciA9IGhkcl9idWY7CisJCX0KKwkJaW9idWZbY291bnRdID0gYyA9ICpoZHJfcHRyKys7CisJCWhkcl9jbnQtLTsKKworCQlpZiAoYyA9PSAnXHInKQorCQkJY29udGludWU7CisJCWlmIChjID09ICdcbicpIHsKKwkJCWlvYnVmW2NvdW50XSA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY291bnQgPCAoSU9CVUZfU0laRSAtIDEpKSAgICAgIC8qIGNoZWNrIG92ZXJmbG93ICovCisJCQljb3VudCsrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kgfHwgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKworLyogZ2NjIDQuMi4xIGZhcmVzIGJldHRlciB3aXRoIE5PSU5MSU5FICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBjZ2lfaW9fbG9vcF9hbmRfZXhpdChpbnQgZnJvbUNnaV9yZCwgaW50IHRvQ2dpX3dyLCBpbnQgcG9zdF9sZW4pIE5PUkVUVVJOOworc3RhdGljIE5PSU5MSU5FIHZvaWQgY2dpX2lvX2xvb3BfYW5kX2V4aXQoaW50IGZyb21DZ2lfcmQsIGludCB0b0NnaV93ciwgaW50IHBvc3RfbGVuKQoreworCWVudW0geyBGUk9NX0NHSSA9IDEsIFRPX0NHSSA9IDIgfTsgLyogaW5kZXhlcyBpbiBwZmRbXSAqLworCXN0cnVjdCBwb2xsZmQgcGZkWzNdOworCWludCBvdXRfY250OyAvKiB3ZSBidWZmZXIgYSBiaXQgb2YgaW5pdGlhbCBDR0kgb3V0cHV0ICovCisJaW50IGNvdW50OworCisJLyogaW9idWYgaXMgdXNlZCBmb3IgQ0dJIC0+IG5ldHdvcmsgZGF0YSwKKwkgKiBoZHJfYnVmIGlzIGZvciBuZXR3b3JrIC0+IENHSSBkYXRhIChQT1NUREFUQSkgKi8KKworCS8qIElmIENHSSBkaWVzLCB3ZSBzdGlsbCB3YW50IHRvIGNvcnJlY3RseSBmaW5pc2ggcmVhZGluZyBpdHMgb3V0cHV0CisJICogYW5kIHNlbmQgaXQgdG8gdGhlIHBlZXIuIFNvIHBsZWFzZSBubyBTSUdQSVBFcyEgKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwkvLyBXZSBpbmNvbnNpc3RlbnRseSBoYW5kbGUgYSBjYXNlIHdoZW4gbW9yZSBQT1NUREFUQSBmcm9tIG5ldHdvcmsKKwkvLyBpcyBjb21pbmcgdGhhbiB3ZSBleHBlY3RlZC4gV2UgbWF5IGdpdmUgKnNvbWUgcGFydCogb2YgdGhhdAorCS8vIGV4dHJhIGRhdGEgdG8gQ0dJLgorCisJLy9pZiAoaGRyX2NudCA+IHBvc3RfbGVuKSB7CisJLy8JLyogV2UgZ290IG1vcmUgUE9TVERBVEEgZnJvbSBuZXR3b3JrIHRoYW4gd2UgZXhwZWN0ZWQgKi8KKwkvLwloZHJfY250ID0gcG9zdF9sZW47CisJLy99CisJcG9zdF9sZW4gLT0gaGRyX2NudDsKKwkvKiBwb3N0X2xlbiAtIG51bWJlciBvZiBQT1NUIGJ5dGVzIG5vdCB5ZXQgcmVhZCBmcm9tIG5ldHdvcmsgKi8KKworCS8qIE5COiBicmVha2luZyBvdXQgb2YgdGhpcyBsb29wIGp1bXBzIHRvIGxvZ19hbmRfZXhpdCgpICovCisJb3V0X2NudCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJbWVtc2V0KHBmZCwgMCwgc2l6ZW9mKHBmZCkpOworCisJCXBmZFtGUk9NX0NHSV0uZmQgPSBmcm9tQ2dpX3JkOworCQlwZmRbRlJPTV9DR0ldLmV2ZW50cyA9IFBPTExJTjsKKworCQlpZiAodG9DZ2lfd3IpIHsKKwkJCXBmZFtUT19DR0ldLmZkID0gdG9DZ2lfd3I7CisJCQlpZiAoaGRyX2NudCA+IDApIHsKKwkJCQlwZmRbVE9fQ0dJXS5ldmVudHMgPSBQT0xMT1VUOworCQkJfSBlbHNlIGlmIChwb3N0X2xlbiA+IDApIHsKKwkJCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQkJfSBlbHNlIHsKKwkJCQkvKiBwb3N0X2xlbiA8PSAwICYmIGhkcl9jbnQgPD0gMDoKKwkJCQkgKiBubyBtb3JlIFBPU1QgZGF0YSB0byBDR0ksCisJCQkJICogbGV0IENHSSBzZWUgRU9GIG9uIENHSSdzIHN0ZGluICovCisJCQkJaWYgKHRvQ2dpX3dyICE9IGZyb21DZ2lfcmQpCisJCQkJCWNsb3NlKHRvQ2dpX3dyKTsKKwkJCQl0b0NnaV93ciA9IDA7CisJCQl9CisJCX0KKworCQkvKiBOb3cgd2FpdCBvbiB0aGUgc2V0IG9mIHNvY2tldHMgKi8KKwkJY291bnQgPSBzYWZlX3BvbGwocGZkLCB0b0NnaV93ciA/IFRPX0NHSSsxIDogRlJPTV9DR0krMSwgLTEpOworCQlpZiAoY291bnQgPD0gMCkgeworI2lmIDAKKwkJCWlmIChzYWZlX3dhaXRwaWQocGlkLCAmc3RhdHVzLCBXTk9IQU5HKSA8PSAwKSB7CisJCQkJLyogV2VpcmQuIENHSSBkaWRuJ3QgZXhpdCBhbmQgbm8gZmQncworCQkJCSAqIGFyZSByZWFkeSwgeWV0IHBvbGwgcmV0dXJuZWQ/ISAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKERFQlVHICYmIFdJRkVYSVRFRChzdGF0dXMpKQorCQkJCWJiX2Vycm9yX21zZygiQ0dJIGV4aXRlZCwgc3RhdHVzPSVkIiwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisJCQlpZiAoREVCVUcgJiYgV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCQliYl9lcnJvcl9tc2coIkNHSSBraWxsZWQsIHNpZ25hbD0lZCIsIFdURVJNU0lHKHN0YXR1cykpOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCWlmIChwZmRbVE9fQ0dJXS5yZXZlbnRzKSB7CisJCQkvKiBoZHJfY250ID4gMCBoZXJlIGR1ZSB0byB0aGUgd2F5IHBmZFtUT19DR0ldLmV2ZW50cyBzZXQgKi8KKwkJCS8qIEhhdmUgZGF0YSBmcm9tIHBlZXIgYW5kIGNhbiB3cml0ZSB0byBDR0kgKi8KKwkJCWNvdW50ID0gc2FmZV93cml0ZSh0b0NnaV93ciwgaGRyX3B0ciwgaGRyX2NudCk7CisJCQkvKiBEb2Vzbid0IGhhcHBlbiwgd2UgZG9udCB1c2Ugbm9uYmxvY2tpbmcgSU8gaGVyZQorCQkJICppZiAoY291bnQgPCAwICYmIGVycm5vID09IEVBR0FJTikgeworCQkJICoJLi4uCisJCQkgKn0gZWxzZSAqLworCQkJaWYgKGNvdW50ID4gMCkgeworCQkJCWhkcl9wdHIgKz0gY291bnQ7CisJCQkJaGRyX2NudCAtPSBjb3VudDsKKwkJCX0gZWxzZSB7CisJCQkJLyogRU9GL2Jyb2tlbiBwaXBlIHRvIENHSSwgc3RvcCBwaXBpbmcgUE9TVCBkYXRhICovCisJCQkJaGRyX2NudCA9IHBvc3RfbGVuID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChwZmRbMF0ucmV2ZW50cykgeworCQkJLyogcG9zdF9sZW4gPiAwICYmIGhkcl9jbnQgPT0gMCBoZXJlICovCisJCQkvKiBXZSBleHBlY3QgZGF0YSwgcHJldiBkYXRhIHBvcnRpb24gaXMgZWF0ZW4gYnkgQ0dJCisJCQkgKiBhbmQgdGhlcmUgKmlzKiBkYXRhIHRvIHJlYWQgZnJvbSB0aGUgcGVlcgorCQkJICogKFBPU1REQVRBKSAqLworCQkJLy9jb3VudCA9IHBvc3RfbGVuID4gKGludClzaXplb2YoaGRyX2J1ZikgPyAoaW50KXNpemVvZihoZHJfYnVmKSA6IHBvc3RfbGVuOworCQkJLy9jb3VudCA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIGhkcl9idWYsIGNvdW50KTsKKwkJCWNvdW50ID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgaGRyX2J1Ziwgc2l6ZW9mKGhkcl9idWYpKTsKKwkJCWlmIChjb3VudCA+IDApIHsKKwkJCQloZHJfY250ID0gY291bnQ7CisJCQkJaGRyX3B0ciA9IGhkcl9idWY7CisJCQkJcG9zdF9sZW4gLT0gY291bnQ7CisJCQl9IGVsc2UgeworCQkJCS8qIG5vIG1vcmUgUE9TVCBkYXRhIGNhbiBiZSByZWFkICovCisJCQkJcG9zdF9sZW4gPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHBmZFtGUk9NX0NHSV0ucmV2ZW50cykgeworCQkJLyogVGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlYWQgZnJvbSBDR0kgKi8KKwkJCWNoYXIgKnJidWYgPSBpb2J1ZjsKKworCQkJLyogQXJlIHdlIHN0aWxsIGJ1ZmZlcmluZyBDR0kgb3V0cHV0PyAqLworCQkJaWYgKG91dF9jbnQgPj0gMCkgeworCQkJCS8qIEhUVFBfMjAwW10gaGFzIHNpbmdsZSAiXHJcbiIgYXQgdGhlIGVuZC4KKwkJCQkgKiBBY2NvcmRpbmcgdG8gaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9vdXQuaHRtbCwKKwkJCQkgKiBDR0kgc2NyaXB0cyBNVVNUIHNlbmQgdGhlaXIgb3duIGhlYWRlciB0ZXJtaW5hdGVkIGJ5CisJCQkJICogZW1wdHkgbGluZSwgdGhlbiBkYXRhLiBUaGF0J3Mgd2h5IHdlIGhhdmUgb25seSBvbmUKKwkJCQkgKiA8Y3I+PGxmPiBwYWlyIGhlcmUuIFdlIHdpbGwgb3V0cHV0ICIyMDAgT0siIGxpbmUKKwkJCQkgKiBpZiBuZWVkZWQsIGJ1dCBDR0kgc3RpbGwgaGFzIHRvIHByb3ZpZGUgYmxhbmsgbGluZQorCQkJCSAqIGJldHdlZW4gaGVhZGVyIGFuZCBib2R5ICovCisKKwkJCQkvKiBNdXN0IHVzZSBzYWZlX3JlYWQsIG5vdCBmdWxsX3JlYWQsIGJlY2F1c2UKKwkJCQkgKiBDR0kgbWF5IG91dHB1dCBhIGZldyBmaXJzdCBieXRlcyBhbmQgdGhlbiB3YWl0CisJCQkJICogZm9yIFBPU1REQVRBIHdpdGhvdXQgY2xvc2luZyBzdGRvdXQuCisJCQkJICogV2l0aCBmdWxsX3JlYWQgd2UgbWF5IHdhaXQgaGVyZSBmb3JldmVyLiAqLworCQkJCWNvdW50ID0gc2FmZV9yZWFkKGZyb21DZ2lfcmQsIHJidWYgKyBvdXRfY250LCBQSVBFX0JVRiAtIDgpOworCQkJCWlmIChjb3VudCA8PSAwKSB7CisJCQkJCS8qIGVvZiAob3IgZXJyb3IpIGFuZCB0aGVyZSB3YXMgbm8gIkhUVFAiLAorCQkJCQkgKiBzbyB3cml0ZSBpdCwgdGhlbiB3cml0ZSByZWNlaXZlZCBkYXRhICovCisJCQkJCWlmIChvdXRfY250KSB7CisJCQkJCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIEhUVFBfMjAwLCBzaXplb2YoSFRUUF8yMDApLTEpOworCQkJCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCByYnVmLCBvdXRfY250KTsKKwkJCQkJfQorCQkJCQlicmVhazsgLyogQ0dJIHN0ZG91dCBpcyBjbG9zZWQsIGV4aXRpbmcgKi8KKwkJCQl9CisJCQkJb3V0X2NudCArPSBjb3VudDsKKwkJCQljb3VudCA9IDA7CisJCQkJLyogIlN0YXR1cyIgaGVhZGVyIGZvcm1hdCBpczogIlN0YXR1czogMzAyIFJlZGlyZWN0ZWRcclxuIiAqLworCQkJCWlmIChvdXRfY250ID49IDggJiYgbWVtY21wKHJidWYsICJTdGF0dXM6ICIsIDgpID09IDApIHsKKwkJCQkJLyogc2VuZCAiSFRUUC8xLjAgIiAqLworCQkJCQlpZiAoZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBIVFRQXzIwMCwgOSkgIT0gOSkKKwkJCQkJCWJyZWFrOworCQkJCQlyYnVmICs9IDg7IC8qIHNraXAgIlN0YXR1czogIiAqLworCQkJCQljb3VudCA9IG91dF9jbnQgLSA4OworCQkJCQlvdXRfY250ID0gLTE7IC8qIGJ1ZmZlcmluZyBvZmYgKi8KKwkJCQl9IGVsc2UgaWYgKG91dF9jbnQgPj0gNCkgeworCQkJCQkvKiBEaWQgQ0dJIGFkZCAiSFRUUCI/ICovCisJCQkJCWlmIChtZW1jbXAocmJ1ZiwgSFRUUF8yMDAsIDQpICE9IDApIHsKKwkJCQkJCS8qIHRoZXJlIGlzIG5vICJIVFRQIiwgZG8gaXQgb3Vyc2VsZiAqLworCQkJCQkJaWYgKGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgSFRUUF8yMDAsIHNpemVvZihIVFRQXzIwMCktMSkgIT0gc2l6ZW9mKEhUVFBfMjAwKS0xKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8qIENvbW1lbnRlZCBvdXQ6CisJCQkJCWlmICghc3Ryc3RyKHJidWYsICJvbnRlbnQtIikpIHsKKwkJCQkJCWZ1bGxfd3JpdGUocywgIkNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxyXG5cclxuIiwgMjgpOworCQkJCQl9CisJCQkJCSAqIENvdW50ZXItZXhhbXBsZSBvZiB2YWxpZCBDR0kgd2l0aG91dCBDb250ZW50LXR5cGU6CisJCQkJCSAqIGVjaG8gLWVuICJIVFRQLzEuMCAzMDIgRm91bmRcclxuIgorCQkJCQkgKiBlY2hvIC1lbiAiTG9jYXRpb246IGh0dHA6Ly93d3cuYnVzeWJveC5uZXRcclxuIgorCQkJCQkgKiBlY2hvIC1lbiAiXHJcbiIKKwkJCQkJICovCisJCQkJCWNvdW50ID0gb3V0X2NudDsKKwkJCQkJb3V0X2NudCA9IC0xOyAvKiBidWZmZXJpbmcgb2ZmICovCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljb3VudCA9IHNhZmVfcmVhZChmcm9tQ2dpX3JkLCByYnVmLCBQSVBFX0JVRik7CisJCQkJaWYgKGNvdW50IDw9IDApCisJCQkJCWJyZWFrOyAgLyogZW9mIChvciBlcnJvcikgKi8KKwkJCX0KKwkJCWlmIChmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIHJidWYsIGNvdW50KSAhPSBjb3VudCkKKwkJCQlicmVhazsKKwkJCWlmIChERUJVRykKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImNnaSByZWFkICVkIGJ5dGVzOiAnJS4qcydcbiIsIGNvdW50LCBjb3VudCwgcmJ1Zik7CisJCX0gLyogaWYgKHBmZFtGUk9NX0NHSV0ucmV2ZW50cykgKi8KKwl9IC8qIHdoaWxlICgxKSAqLworCWxvZ19hbmRfZXhpdCgpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kKKworc3RhdGljIHZvaWQgc2V0ZW52MShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlzZXRlbnYobmFtZSwgdmFsdWUgPyB2YWx1ZSA6ICIiLCAxKTsKK30KKworLyoKKyAqIFNwYXduIENHSSBzY3JpcHQsIGZvcndhcmQgQ0dJJ3Mgc3RkaW4vb3V0IDw9PiBuZXR3b3JrCisgKgorICogRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgdXAgYW5kIHRoZSBzY3JpcHQgaXMgaW52b2tlZCB3aXRoIHBpcGVzCisgKiBmb3Igc3RkaW4vc3Rkb3V0LiAgSWYgYSBQT1NUIGlzIGJlaW5nIGRvbmUgdGhlIHNjcmlwdCBpcyBmZWQgdGhlIFBPU1QKKyAqIGRhdGEgaW4gYWRkaXRpb24gdG8gc2V0dGluZyB0aGUgUVVFUllfU1RSSU5HIHZhcmlhYmxlIChmb3IgR0VUcyBvciBQT1NUcykuCisgKgorICogUGFyYW1ldGVyczoKKyAqIGNvbnN0IGNoYXIgKnVybCAgICAgICAgICAgICAgVGhlIHJlcXVlc3RlZCBVUkwgKHdpdGggbGVhZGluZyAvKS4KKyAqIGludCBwb3N0X2xlbiAgICAgICAgICAgICAgICAgTGVuZ3RoIG9mIHRoZSBQT1NUIGJvZHkuCisgKiBjb25zdCBjaGFyICpjb29raWUgICAgICAgICAgIEZvciBzZXQgSFRUUF9DT09LSUUuCisgKiBjb25zdCBjaGFyICpjb250ZW50X3R5cGUgICAgIEZvciBzZXQgQ09OVEVOVF9UWVBFLgorICovCitzdGF0aWMgdm9pZCBzZW5kX2NnaV9hbmRfZXhpdCgKKwkJY29uc3QgY2hhciAqdXJsLAorCQljb25zdCBjaGFyICpyZXF1ZXN0LAorCQlpbnQgcG9zdF9sZW4sCisJCWNvbnN0IGNoYXIgKmNvb2tpZSwKKwkJY29uc3QgY2hhciAqY29udGVudF90eXBlKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHNlbmRfY2dpX2FuZF9leGl0KAorCQljb25zdCBjaGFyICp1cmwsCisJCWNvbnN0IGNoYXIgKnJlcXVlc3QsCisJCWludCBwb3N0X2xlbiwKKwkJY29uc3QgY2hhciAqY29va2llLAorCQljb25zdCBjaGFyICpjb250ZW50X3R5cGUpCit7CisJc3RydWN0IGZkX3BhaXIgZnJvbUNnaTsgIC8qIENHSSAtPiBodHRwZCBwaXBlICovCisJc3RydWN0IGZkX3BhaXIgdG9DZ2k7ICAgIC8qIGh0dHBkIC0+IENHSSBwaXBlICovCisJY2hhciAqc2NyaXB0OworCWludCBwaWQ7CisKKwkvKiBNYWtlIGEgY29weS4gTkI6IGNhbGxlciBndWFyYW50ZWVzOgorCSAqIHVybFswXSA9PSAnLycsIHVybFsxXSAhPSAnLycgKi8KKwl1cmwgPSB4c3RyZHVwKHVybCk7CisKKwkvKgorCSAqIFdlIGFyZSBtdWNraW5nIHdpdGggZW52aXJvbm1lbnQgX2ZpcnN0XyBhbmQgdGhlbiB2Zm9yay9leGVjLAorCSAqIHRoaXMgYWxsb3dzIHVzIHRvIHVzZSB2Zm9yayBzYWZlbHkuIFBhcmVudCBkb2Vzbid0IGNhcmUgYWJvdXQKKwkgKiB0aGVzZSBlbnZpcm9ubWVudCBjaGFuZ2VzIGFueXdheS4KKwkgKi8KKworCS8qIENoZWNrIGZvciBbZGlycy9dc2NyaXB0LmNnaS9QQVRIX0lORk8gKi8KKwlzY3JpcHQgPSAoY2hhciopdXJsOworCXdoaWxlICgoc2NyaXB0ID0gc3RyY2hyKHNjcmlwdCArIDEsICcvJykpICE9IE5VTEwpIHsKKwkJKnNjcmlwdCA9ICdcMCc7CisJCWlmICghaXNfZGlyZWN0b3J5KHVybCArIDEsIDEsIE5VTEwpKSB7CisJCQkvKiBub3QgZGlyZWN0b3J5LCBmb3VuZCBzY3JpcHQuY2dpL1BBVEhfSU5GTyAqLworCQkJKnNjcmlwdCA9ICcvJzsKKwkJCWJyZWFrOworCQl9CisJCSpzY3JpcHQgPSAnLyc7IC8qIGlzIGRpcmVjdG9yeSwgZmluZCBuZXh0ICcvJyAqLworCX0KKwlzZXRlbnYxKCJQQVRIX0lORk8iLCBzY3JpcHQpOyAgIC8qIHNldCB0byAvUEFUSF9JTkZPIG9yICIiICovCisJc2V0ZW52MSgiUkVRVUVTVF9NRVRIT0QiLCByZXF1ZXN0KTsKKwlpZiAoZ19xdWVyeSkgeworCQlwdXRlbnYoeGFzcHJpbnRmKCIlcz0lcz8lcyIsICJSRVFVRVNUX1VSSSIsIHVybCwgZ19xdWVyeSkpOworCX0gZWxzZSB7CisJCXNldGVudjEoIlJFUVVFU1RfVVJJIiwgdXJsKTsKKwl9CisJaWYgKHNjcmlwdCAhPSBOVUxMKQorCQkqc2NyaXB0ID0gJ1wwJzsgICAgICAgICAvKiBjdXQgb2ZmIC9QQVRIX0lORk8gKi8KKworCS8qIFNDUklQVF9GSUxFTkFNRSBpcyByZXF1aXJlZCBieSBQSFAgaW4gQ0dJIG1vZGUgKi8KKwlpZiAoaG9tZV9odHRwZFswXSA9PSAnLycpIHsKKwkJY2hhciAqZnVsbHBhdGggPSBjb25jYXRfcGF0aF9maWxlKGhvbWVfaHR0cGQsIHVybCk7CisJCXNldGVudjEoIlNDUklQVF9GSUxFTkFNRSIsIGZ1bGxwYXRoKTsKKwl9CisJLyogc2V0IFNDUklQVF9OQU1FIGFzIGZ1bGwgcGF0aDogL2NnaS1iaW4vZGlycy9zY3JpcHQuY2dpICovCisJc2V0ZW52MSgiU0NSSVBUX05BTUUiLCB1cmwpOworCS8qIGh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZW52Lmh0bWw6CisJICogUVVFUllfU1RSSU5HOiBUaGUgaW5mb3JtYXRpb24gd2hpY2ggZm9sbG93cyB0aGUgPyBpbiB0aGUgVVJMCisJICogd2hpY2ggcmVmZXJlbmNlZCB0aGlzIHNjcmlwdC4gVGhpcyBpcyB0aGUgcXVlcnkgaW5mb3JtYXRpb24uCisJICogSXQgc2hvdWxkIG5vdCBiZSBkZWNvZGVkIGluIGFueSBmYXNoaW9uLiBUaGlzIHZhcmlhYmxlCisJICogc2hvdWxkIGFsd2F5cyBiZSBzZXQgd2hlbiB0aGVyZSBpcyBxdWVyeSBpbmZvcm1hdGlvbiwKKwkgKiByZWdhcmRsZXNzIG9mIGNvbW1hbmQgbGluZSBkZWNvZGluZy4gKi8KKwkvKiAoT2xkZXIgdmVyc2lvbnMgb2YgYmJveCBzZWVtIHRvIGRvIHNvbWUgZGVjb2RpbmcpICovCisJc2V0ZW52MSgiUVVFUllfU1RSSU5HIiwgZ19xdWVyeSk7CisJcHV0ZW52KChjaGFyKikiU0VSVkVSX1NPRlRXQVJFPWJ1c3lib3ggaHR0cGQvIkJCX1ZFUik7CisJcHV0ZW52KChjaGFyKikiU0VSVkVSX1BST1RPQ09MPUhUVFAvMS4wIik7CisJcHV0ZW52KChjaGFyKikiR0FURVdBWV9JTlRFUkZBQ0U9Q0dJLzEuMSIpOworCS8qIEhhdmluZyBfc2VwYXJhdGVfIHZhcmlhYmxlcyBmb3IgSVAgYW5kIHBvcnQgZGVmZWF0cworCSAqIHRoZSBwdXJwb3NlIG9mIGhhdmluZyBzb2NrZXQgYWJzdHJhY3Rpb24uIFdoaWNoICJwb3J0IgorCSAqIGFyZSB5b3UgdXNpbmcgb24gVW5peCBkb21haW4gc29ja2V0PworCSAqIElPVyAtIFJFTU9URV9QRUVSPSIxLjIuMy40OjU2IiBtYWtlcyBtdWNoIG1vcmUgc2Vuc2UuCisJICogT2ggd2VsbC4uLiAqLworCXsKKwkJY2hhciAqcCA9IHJtdF9pcF9zdHIgPyBybXRfaXBfc3RyIDogKGNoYXIqKSIiOworCQljaGFyICpjcCA9IHN0cnJjaHIocCwgJzonKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgY3AgJiYgc3RyY2hyKGNwLCAnXScpKQorCQkJY3AgPSBOVUxMOworCQlpZiAoY3ApICpjcCA9ICdcMCc7IC8qIGRlbGV0ZSA6UE9SVCAqLworCQlzZXRlbnYxKCJSRU1PVEVfQUREUiIsIHApOworCQlpZiAoY3ApIHsKKwkJCSpjcCA9ICc6JzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WCisJCQlzZXRlbnYxKCJSRU1PVEVfUE9SVCIsIGNwICsgMSk7CisjZW5kaWYKKwkJfQorCX0KKwlzZXRlbnYxKCJIVFRQX1VTRVJfQUdFTlQiLCB1c2VyX2FnZW50KTsKKwlpZiAoaHR0cF9hY2NlcHQpCisJCXNldGVudjEoIkhUVFBfQUNDRVBUIiwgaHR0cF9hY2NlcHQpOworCWlmIChodHRwX2FjY2VwdF9sYW5ndWFnZSkKKwkJc2V0ZW52MSgiSFRUUF9BQ0NFUFRfTEFOR1VBR0UiLCBodHRwX2FjY2VwdF9sYW5ndWFnZSk7CisJaWYgKHBvc3RfbGVuKQorCQlwdXRlbnYoeGFzcHJpbnRmKCJDT05URU5UX0xFTkdUSD0lZCIsIHBvc3RfbGVuKSk7CisJaWYgKGNvb2tpZSkKKwkJc2V0ZW52MSgiSFRUUF9DT09LSUUiLCBjb29raWUpOworCWlmIChjb250ZW50X3R5cGUpCisJCXNldGVudjEoIkNPTlRFTlRfVFlQRSIsIGNvbnRlbnRfdHlwZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCWlmIChyZW1vdGV1c2VyKSB7CisJCXNldGVudjEoIlJFTU9URV9VU0VSIiwgcmVtb3RldXNlcik7CisJCXB1dGVudigoY2hhciopIkFVVEhfVFlQRT1CYXNpYyIpOworCX0KKyNlbmRpZgorCWlmIChyZWZlcmVyKQorCQlzZXRlbnYxKCJIVFRQX1JFRkVSRVIiLCByZWZlcmVyKTsKKwlzZXRlbnYxKCJIVFRQX0hPU1QiLCBob3N0KTsgLyogc2V0IHRvICIiIGlmIE5VTEwgKi8KKwkvKiBzZXRlbnYxKCJTRVJWRVJfTkFNRSIsIHNhZmVfZ2V0aG9zdG5hbWUoKSk7IC0gZG9uJ3QgZG8gdGhpcywKKwkgKiBqdXN0IHJ1biAiZW52IFNFUlZFUl9OQU1FPXh5eiBodHRwZCAuLi4iIGluc3RlYWQgKi8KKworCXhwaXBlZF9wYWlyKGZyb21DZ2kpOworCXhwaXBlZF9wYWlyKHRvQ2dpKTsKKworCXBpZCA9IHZmb3JrKCk7CisJaWYgKHBpZCA8IDApIHsKKwkJLyogVE9ETzogbG9nIHBlcnJvcj8gKi8KKwkJbG9nX2FuZF9leGl0KCk7CisJfQorCisJaWYgKCFwaWQpIHsKKwkJLyogQ2hpbGQgcHJvY2VzcyAqLworCQljaGFyICphcmd2WzNdOworCisJCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI0MjsKKworCQkvKiBOQjogY2xvc2UgX2ZpcnN0XywgdGhlbiBtb3ZlIGZkcyEgKi8KKwkJY2xvc2UodG9DZ2kud3IpOworCQljbG9zZShmcm9tQ2dpLnJkKTsKKwkJeG1vdmVfZmQodG9DZ2kucmQsIDApOyAgLyogcmVwbGFjZSBzdGRpbiB3aXRoIHRoZSBwaXBlICovCisJCXhtb3ZlX2ZkKGZyb21DZ2kud3IsIDEpOyAgLyogcmVwbGFjZSBzdGRvdXQgd2l0aCB0aGUgcGlwZSAqLworCQkvKiBVc2VyIHNlZWluZyBzdGRlcnIgb3V0cHV0IGNhbiBiZSBhIHNlY3VyaXR5IHByb2JsZW0uCisJCSAqIElmIENHSSByZWFsbHkgd2FudHMgdGhhdCwgaXQgY2FuIGFsd2F5cyBkbyBkdXAgaXRzZWxmLiAqLworCQkvKiBkdXAyKDEsIDIpOyAqLworCisJCS8qIENoZGlyaW5nIHRvIHNjcmlwdCdzIGRpciAqLworCQlzY3JpcHQgPSBzdHJyY2hyKHVybCwgJy8nKTsKKwkJaWYgKHNjcmlwdCAhPSB1cmwpIHsgLyogcGFyYW5vaWEgKi8KKwkJCSpzY3JpcHQgPSAnXDAnOworCQkJaWYgKGNoZGlyKHVybCArIDEpICE9IDApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjaGRpciglcykiLCB1cmwgKyAxKTsKKwkJCQlnb3RvIGVycm9yX2V4ZWNpbmdfY2dpOworCQkJfQorCQkJLy8gbm90IG5lZWRlZDogKnNjcmlwdCA9ICcvJzsKKwkJfQorCQlzY3JpcHQrKzsKKworCQkvKiBzZXQgYXJndlswXSB0byBuYW1lIHdpdGhvdXQgcGF0aCAqLworCQlhcmd2WzBdID0gc2NyaXB0OworCQlhcmd2WzFdID0gTlVMTDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSCisJCXsKKwkJCWNoYXIgKnN1ZmZpeCA9IHN0cnJjaHIoc2NyaXB0LCAnLicpOworCisJCQlpZiAoc3VmZml4KSB7CisJCQkJSHRhY2Nlc3MgKmN1cjsKKwkJCQlmb3IgKGN1ciA9IHNjcmlwdF9pOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQkJCQlpZiAoc3RyY21wKGN1ci0+YmVmb3JlX2NvbG9uICsgMSwgc3VmZml4KSA9PSAwKSB7CisJCQkJCQkvKiBmb3VuZCBpbnRlcnByZXRlciBuYW1lICovCisJCQkJCQlhcmd2WzBdID0gY3VyLT5hZnRlcl9jb2xvbjsKKwkJCQkJCWFyZ3ZbMV0gPSBzY3JpcHQ7CisJCQkJCQlhcmd2WzJdID0gTlVMTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwkJLyogcmVzdG9yZSBkZWZhdWx0IHNpZ25hbCBkaXNwb3NpdGlvbnMgZm9yIENHSSBwcm9jZXNzICovCisJCWJiX3NpZ25hbHMoMAorCQkJfCAoMSA8PCBTSUdDSExEKQorCQkJfCAoMSA8PCBTSUdQSVBFKQorCQkJfCAoMSA8PCBTSUdIVVApCisJCQksIFNJR19ERkwpOworCisJCS8qIF9OT1RfIGV4ZWN2cC4gV2UgZG8gbm90IHNlYXJjaCBQQVRILiBhcmd2WzBdIGlzIGEgZmlsZW5hbWUKKwkJICogd2l0aG91dCBhbnkgZGlyIGNvbXBvbmVudHMgYW5kIHdpbGwgb25seSBtYXRjaCBhIGZpbGUKKwkJICogaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5ICovCisJCWV4ZWN2KGFyZ3ZbMF0sIGFyZ3YpOworCQlpZiAodmVyYm9zZSkKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGV4ZWN1dGUgJyVzJyIsIGFyZ3ZbMF0pOworIGVycm9yX2V4ZWNpbmdfY2dpOgorCQkvKiBzZW5kIHRvIHN0ZG91dAorCQkgKiAod2UgYXJlIENHSSBoZXJlLCBvdXIgc3Rkb3V0IGlzIHB1bXBlZCB0byB0aGUgbmV0KSAqLworCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9OT1RfRk9VTkQpOworCX0gLyogZW5kIGNoaWxkICovCisKKwkvKiBQYXJlbnQgcHJvY2VzcyAqLworCisJLyogUmVzdG9yZSB2YXJpYWJsZXMgcG9zc2libHkgY2hhbmdlZCBieSBjaGlsZCAqLworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDA7CisKKwkvKiBQdW1wIGRhdGEgKi8KKwljbG9zZShmcm9tQ2dpLndyKTsKKwljbG9zZSh0b0NnaS5yZCk7CisJY2dpX2lvX2xvb3BfYW5kX2V4aXQoZnJvbUNnaS5yZCwgdG9DZ2kud3IsIHBvc3RfbGVuKTsKK30KKworI2VuZGlmICAgICAgICAgIC8qIEZFQVRVUkVfSFRUUERfQ0dJICovCisKKy8qCisgKiBTZW5kIGEgZmlsZSByZXNwb25zZSB0byBhIEhUVFAgcmVxdWVzdCwgYW5kIGV4aXQKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogY29uc3QgY2hhciAqdXJsICBUaGUgcmVxdWVzdGVkIFVSTCAod2l0aCBsZWFkaW5nIC8pLgorICogd2hhdCAgICAgICAgICAgICBXaGF0IHRvIHNlbmQgKGhlYWRlcnMvYm9keS9ib3RoKS4KKyAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2VuZF9maWxlX2FuZF9leGl0KGNvbnN0IGNoYXIgKnVybCwgaW50IHdoYXQpCit7CisJY2hhciAqc3VmZml4OworCWludCBmZDsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKGNvbnRlbnRfZ3ppcCkgeworCQkvKiBkb2VzIDx1cmw+Lmd6IGV4aXN0PyBUaGVuIHVzZSBpdCBpbnN0ZWFkICovCisJCWNoYXIgKmd6dXJsID0geGFzcHJpbnRmKCIlcy5neiIsIHVybCk7CisJCWZkID0gb3BlbihnenVybCwgT19SRE9OTFkpOworCQlmcmVlKGd6dXJsKTsKKwkJaWYgKGZkICE9IC0xKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzYjsKKwkJCWZzdGF0KGZkLCAmc2IpOworCQkJZmlsZV9zaXplID0gc2Iuc3Rfc2l6ZTsKKwkJCWxhc3RfbW9kID0gc2Iuc3RfbXRpbWU7CisJCX0gZWxzZSB7CisJCQlJRl9GRUFUVVJFX0hUVFBEX0daSVAoY29udGVudF9nemlwID0gMDspCisJCQlmZCA9IG9wZW4odXJsLCBPX1JET05MWSk7CisJCX0KKwl9IGVsc2UgeworCQlmZCA9IG9wZW4odXJsLCBPX1JET05MWSk7CisJfQorCWlmIChmZCA8IDApIHsKKwkJaWYgKERFQlVHKQorCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgb3BlbiAnJXMnIiwgdXJsKTsKKwkJLyogRXJyb3IgcGFnZXMgYXJlIHNlbnQgYnkgdXNpbmcgc2VuZF9maWxlX2FuZF9leGl0KFNFTkRfQk9EWSkuCisJCSAqIElPVzogaXQgaXMgdW5zYWZlIHRvIGNhbGwgc2VuZF9oZWFkZXJzX2FuZF9leGl0CisJCSAqIGlmIHdoYXQgaXMgU0VORF9CT0RZISBDYW4gcmVjdXJzZSEgKi8KKwkJaWYgKHdoYXQgIT0gU0VORF9CT0RZKQorCQkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfTk9UX0ZPVU5EKTsKKwkJbG9nX2FuZF9leGl0KCk7CisJfQorCS8qIElmIHlvdSB3YW50IHRvIGtub3cgYWJvdXQgRVBJUEUgYmVsb3cKKwkgKiAoaGFwcGVucyBpZiB5b3UgYWJvcnQgZG93bmxvYWRzIGZyb20gbG9jYWwgaHR0cGQpOiAqLworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworCS8qIElmIG5vdCBmb3VuZCwgZGVmYXVsdCBpcyAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiAqLworCWZvdW5kX21pbWVfdHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworCXN1ZmZpeCA9IHN0cnJjaHIodXJsLCAnLicpOworCWlmIChzdWZmaXgpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgc3VmZml4VGFibGVbXSBBTElHTjEgPQorCQkJLyogU2hvcnRlciBzdWZmaXggbXVzdCBiZSBmaXJzdDoKKwkJCSAqICIuaHRtbC5odG0iIHdpbGwgZmFpbCBmb3IgIi5odG0iCisJCQkgKi8KKwkJCSIudHh0LmguYy5jYy5jcHBcMCIgInRleHQvcGxhaW5cMCIKKwkJCS8qIC5odG0gbGluZSBtdXN0IGJlIGFmdGVyIC5oIGxpbmUgKi8KKwkJCSIuaHRtLmh0bWxcMCIgInRleHQvaHRtbFwwIgorCQkJIi5qcGcuanBlZ1wwIiAiaW1hZ2UvanBlZ1wwIgorCQkJIi5naWZcMCIgICAgICAiaW1hZ2UvZ2lmXDAiCisJCQkiLnBuZ1wwIiAgICAgICJpbWFnZS9wbmdcMCIKKwkJCS8qIC5jc3MgbGluZSBtdXN0IGJlIGFmdGVyIC5jIGxpbmUgKi8KKwkJCSIuY3NzXDAiICAgICAgInRleHQvY3NzXDAiCisJCQkiLndhdlwwIiAgICAgICJhdWRpby93YXZcMCIKKwkJCSIuYXZpXDAiICAgICAgInZpZGVvL3gtbXN2aWRlb1wwIgorCQkJIi5xdC5tb3ZcMCIgICAidmlkZW8vcXVpY2t0aW1lXDAiCisJCQkiLm1wZS5tcGVnXDAiICJ2aWRlby9tcGVnXDAiCisJCQkiLm1pZC5taWRpXDAiICJhdWRpby9taWRpXDAiCisJCQkiLm1wM1wwIiAgICAgICJhdWRpby9tcGVnXDAiCisjaWYgMCAgLyogdW5wb3B1bGFyICovCisJCQkiLmF1XDAiICAgICAgICJhdWRpby9iYXNpY1wwIgorCQkJIi5wYWNcMCIgICAgICAiYXBwbGljYXRpb24veC1ucy1wcm94eS1hdXRvY29uZmlnXDAiCisJCQkiLnZybWwud3JsXDAiICJtb2RlbC92cm1sXDAiCisjZW5kaWYKKwkJCS8qIGNvbXBpbGVyIGFkZHMgYW5vdGhlciAiXDAiIGhlcmUgKi8KKwkJOworCQlIdGFjY2VzcyAqY3VyOworCisJCS8qIEV4YW1pbmUgYnVpbHQtaW4gdGFibGUgKi8KKwkJY29uc3QgY2hhciAqdGFibGUgPSBzdWZmaXhUYWJsZTsKKwkJY29uc3QgY2hhciAqdGFibGVfbmV4dDsKKwkJZm9yICg7ICp0YWJsZTsgdGFibGUgPSB0YWJsZV9uZXh0KSB7CisJCQljb25zdCBjaGFyICp0cnlfc3VmZml4OworCQkJY29uc3QgY2hhciAqbWltZV90eXBlOworCQkJbWltZV90eXBlICA9IHRhYmxlICsgc3RybGVuKHRhYmxlKSArIDE7CisJCQl0YWJsZV9uZXh0ID0gbWltZV90eXBlICsgc3RybGVuKG1pbWVfdHlwZSkgKyAxOworCQkJdHJ5X3N1ZmZpeCA9IHN0cnN0cih0YWJsZSwgc3VmZml4KTsKKwkJCWlmICghdHJ5X3N1ZmZpeCkKKwkJCQljb250aW51ZTsKKwkJCXRyeV9zdWZmaXggKz0gc3RybGVuKHN1ZmZpeCk7CisJCQlpZiAoKnRyeV9zdWZmaXggPT0gJ1wwJyB8fCAqdHJ5X3N1ZmZpeCA9PSAnLicpIHsKKwkJCQlmb3VuZF9taW1lX3R5cGUgPSBtaW1lX3R5cGU7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBFeGFtcGxlOiBzdHJzdHIodGFibGUsICIuYXYiKSAhPSBOVUxMLCBidXQgaXQKKwkJCSAqIGRvZXMgbm90IG1hdGNoICIuYXZpIiBhZnRlciBhbGwgYW5kIHdlIGVuZCB1cCBoZXJlLgorCQkJICogVGhlIHRhYmxlIGlzIGFycmFuZ2VkIHNvIHRoYXQgaW4gdGhpcyBjYXNlIHdlIGtub3cKKwkJCSAqIHRoYXQgaXQgY2FuJ3QgbWF0Y2ggYW55dGhpbmcgaW4gdGhlIGZvbGxvd2luZyBsaW5lcywKKwkJCSAqIGFuZCB3ZSBzdG9wIHRoZSBzZWFyY2g6ICovCisJCQlicmVhazsKKwkJfQorCQkvKiAuLi50aGVuIHVzZXIncyB0YWJsZSAqLworCQlmb3IgKGN1ciA9IG1pbWVfYTsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJCWlmIChzdHJjbXAoY3VyLT5iZWZvcmVfY29sb24sIHN1ZmZpeCkgPT0gMCkgeworCQkJCWZvdW5kX21pbWVfdHlwZSA9IGN1ci0+YWZ0ZXJfY29sb247CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoREVCVUcpCisJCWJiX2Vycm9yX21zZygic2VuZGluZyBmaWxlICclcycgY29udGVudC10eXBlOiAlcyIsCisJCQl1cmwsIGZvdW5kX21pbWVfdHlwZSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwlpZiAod2hhdCA9PSBTRU5EX0JPRFkgLyogZXJyIHBhZ2VzIGFuZCByYW5nZXMgZG9uJ3QgbWl4ICovCisJIHx8IGNvbnRlbnRfZ3ppcCAvKiB3ZSBhcmUgc2VuZGluZyBjb21wcmVzc2VkIHBhZ2U6IGNhbid0IGRvIHJhbmdlcyAqLyAgLy8vd2h5PworCSkgeworCQlyYW5nZV9zdGFydCA9IDA7CisJfQorCXJhbmdlX2xlbiA9IE1BWElOVChvZmZfdCk7CisJaWYgKHJhbmdlX3N0YXJ0KSB7CisJCWlmICghcmFuZ2VfZW5kKSB7CisJCQlyYW5nZV9lbmQgPSBmaWxlX3NpemUgLSAxOworCQl9CisJCWlmIChyYW5nZV9lbmQgPCByYW5nZV9zdGFydAorCQkgfHwgbHNlZWsoZmQsIHJhbmdlX3N0YXJ0LCBTRUVLX1NFVCkgIT0gcmFuZ2Vfc3RhcnQKKwkJKSB7CisJCQlsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCQkJcmFuZ2Vfc3RhcnQgPSAwOworCQl9IGVsc2UgeworCQkJcmFuZ2VfbGVuID0gcmFuZ2VfZW5kIC0gcmFuZ2Vfc3RhcnQgKyAxOworCQkJc2VuZF9oZWFkZXJzKEhUVFBfUEFSVElBTF9DT05URU5UKTsKKwkJCXdoYXQgPSBTRU5EX0JPRFk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAod2hhdCAmIFNFTkRfSEVBREVSUykKKwkJc2VuZF9oZWFkZXJzKEhUVFBfT0spOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1VTRV9TRU5ERklMRQorCXsKKwkJb2ZmX3Qgb2Zmc2V0ID0gcmFuZ2Vfc3RhcnQ7CisJCXdoaWxlICgxKSB7CisJCQkvKiBzeiBpcyByb3VuZGVkIGRvd24gdG8gNjRrICovCisJCQlzc2l6ZV90IHN6ID0gTUFYSU5UKHNzaXplX3QpIC0gMHhmZmZmOworCQkJSUZfRkVBVFVSRV9IVFRQRF9SQU5HRVMoaWYgKHN6ID4gcmFuZ2VfbGVuKSBzeiA9IHJhbmdlX2xlbjspCisJCQljb3VudCA9IHNlbmRmaWxlKFNURE9VVF9GSUxFTk8sIGZkLCAmb2Zmc2V0LCBzeik7CisJCQlpZiAoY291bnQgPCAwKSB7CisJCQkJaWYgKG9mZnNldCA9PSByYW5nZV9zdGFydCkKKwkJCQkJYnJlYWs7IC8qIGZhbGwgYmFjayB0byByZWFkL3dyaXRlIGxvb3AgKi8KKwkJCQlnb3RvIGZpbjsKKwkJCX0KKwkJCUlGX0ZFQVRVUkVfSFRUUERfUkFOR0VTKHJhbmdlX2xlbiAtPSBzejspCisJCQlpZiAoY291bnQgPT0gMCB8fCByYW5nZV9sZW4gPT0gMCkKKwkJCQlsb2dfYW5kX2V4aXQoKTsKKwkJfQorCX0KKyNlbmRpZgorCXdoaWxlICgoY291bnQgPSBzYWZlX3JlYWQoZmQsIGlvYnVmLCBJT0JVRl9TSVpFKSkgPiAwKSB7CisJCXNzaXplX3QgbjsKKwkJSUZfRkVBVFVSRV9IVFRQRF9SQU5HRVMoaWYgKGNvdW50ID4gcmFuZ2VfbGVuKSBjb3VudCA9IHJhbmdlX2xlbjspCisJCW4gPSBmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGlvYnVmLCBjb3VudCk7CisJCWlmIChjb3VudCAhPSBuKQorCQkJYnJlYWs7CisJCUlGX0ZFQVRVUkVfSFRUUERfUkFOR0VTKHJhbmdlX2xlbiAtPSBjb3VudDspCisJCWlmIChyYW5nZV9sZW4gPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoY291bnQgPCAwKSB7CisgSUZfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUoZmluOikKKwkJaWYgKHZlcmJvc2UgPiAxKQorCQkJYmJfcGVycm9yX21zZygiZXJyb3IiKTsKKwl9CisJbG9nX2FuZF9leGl0KCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tQZXJtSVAodm9pZCkKK3sKKwlIdGFjY2Vzc19JUCAqY3VyOworCisJZm9yIChjdXIgPSBpcF9hX2Q7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisjaWYgREVCVUcKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiY2hlY2tQZXJtSVA6ICclcycgPyAnJXUuJXUuJXUuJXUvJXUuJXUuJXUuJXUnXG4iLAorCQkJcm10X2lwX3N0ciwKKwkJCSh1bnNpZ25lZCBjaGFyKShjdXItPmlwID4+IDI0KSwKKwkJCSh1bnNpZ25lZCBjaGFyKShjdXItPmlwID4+IDE2KSwKKwkJCSh1bnNpZ25lZCBjaGFyKShjdXItPmlwID4+IDgpLAorCQkJKHVuc2lnbmVkIGNoYXIpKGN1ci0+aXApLAorCQkJKHVuc2lnbmVkIGNoYXIpKGN1ci0+bWFzayA+PiAyNCksCisJCQkodW5zaWduZWQgY2hhcikoY3VyLT5tYXNrID4+IDE2KSwKKwkJCSh1bnNpZ25lZCBjaGFyKShjdXItPm1hc2sgPj4gOCksCisJCQkodW5zaWduZWQgY2hhcikoY3VyLT5tYXNrKQorCQkpOworI2VuZGlmCisJCWlmICgocm10X2lwICYgY3VyLT5tYXNrKSA9PSBjdXItPmlwKQorCQkJcmV0dXJuIChjdXItPmFsbG93X2RlbnkgPT0gJ0EnKTsgLyogQSAtPiAxICovCisJfQorCisJcmV0dXJuICFmbGdfZGVueV9hbGw7IC8qIGRlcGVuZHMgb24gd2hldGhlciB3ZSBzYXcgIkQ6KiIgKi8KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKy8qCisgKiBDb25maWcgZmlsZSBlbnRyaWVzIGFyZSBvZiB0aGUgZm9ybSAiLzxwYXRoPjo8dXNlcj46PHBhc3N3ZD4iLgorICogSWYgY29uZmlnIGZpbGUgaGFzIG5vIHByZWZpeCBtYXRjaCBmb3IgcGF0aCwgYWNjZXNzIGlzIGFsbG93ZWQuCisgKgorICogcGF0aCAgICAgICAgICAgICAgICAgVGhlIGZpbGUgcGF0aAorICogdXNlcl9hbmRfcGFzc3dkICAgICAgInVzZXI6cGFzc3dkIiB0byB2YWxpZGF0ZQorICoKKyAqIFJldHVybnMgMSBpZiB1c2VyX2FuZF9wYXNzd2QgaXMgT0suCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfdXNlcl9wYXNzd2QoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqdXNlcl9hbmRfcGFzc3dkKQoreworCUh0YWNjZXNzICpjdXI7CisJY29uc3QgY2hhciAqcHJldiA9IE5VTEw7CisKKwlmb3IgKGN1ciA9IGdfYXV0aDsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJY29uc3QgY2hhciAqZGlyX3ByZWZpeDsKKwkJc2l6ZV90IGxlbjsKKworCQlkaXJfcHJlZml4ID0gY3VyLT5iZWZvcmVfY29sb247CisKKwkJLyogV0hZPyAqLworCQkvKiBJZiBhbHJlYWR5IHNhdyBhIG1hdGNoLCBkb24ndCBhY2NlcHQgb3RoZXIgZGlmZmVyZW50IG1hdGNoZXMgKi8KKwkJaWYgKHByZXYgJiYgc3RyY21wKHByZXYsIGRpcl9wcmVmaXgpICE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAoREVCVUcpCisJCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrUGVybTogJyVzJyA/ICclcydcbiIsIGRpcl9wcmVmaXgsIHVzZXJfYW5kX3Bhc3N3ZCk7CisKKwkJLyogSWYgaXQncyBub3QgYSBwcmVmaXggbWF0Y2gsIGNvbnRpbnVlIHNlYXJjaGluZyAqLworCQlsZW4gPSBzdHJsZW4oZGlyX3ByZWZpeCk7CisJCWlmIChsZW4gIT0gMSAvKiBkaXJfcHJlZml4ICIvIiBtYXRjaGVzIGFsbCwgZG9uJ3QgbmVlZCB0byBjaGVjayAqLworCQkgJiYgKHN0cm5jbXAoZGlyX3ByZWZpeCwgcGF0aCwgbGVuKSAhPSAwCisJCSAgICB8fCAocGF0aFtsZW5dICE9ICcvJyAmJiBwYXRoW2xlbl0gIT0gJ1wwJykpCisJCSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBQYXRoIG1hdGNoIGZvdW5kICovCisJCXByZXYgPSBkaXJfcHJlZml4OworCisJCWlmIChFTkFCTEVfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSkgeworCQkJY2hhciAqbWQ1X3Bhc3N3ZDsKKworCQkJbWQ1X3Bhc3N3ZCA9IHN0cmNocihjdXItPmFmdGVyX2NvbG9uLCAnOicpOworCQkJaWYgKG1kNV9wYXNzd2QgJiYgbWQ1X3Bhc3N3ZFsxXSA9PSAnJCcgJiYgbWQ1X3Bhc3N3ZFsyXSA9PSAnMScKKwkJCSAmJiBtZDVfcGFzc3dkWzNdID09ICckJyAmJiBtZDVfcGFzc3dkWzRdCisJCQkpIHsKKwkJCQljaGFyICplbmNyeXB0ZWQ7CisJCQkJaW50IHIsIHVzZXJfbGVuX3AxOworCisJCQkJbWQ1X3Bhc3N3ZCsrOworCQkJCXVzZXJfbGVuX3AxID0gbWQ1X3Bhc3N3ZCAtIGN1ci0+YWZ0ZXJfY29sb247CisJCQkJLyogY29tcGFyaW5nICJ1c2VyOiIgKi8KKwkJCQlpZiAoc3RybmNtcChjdXItPmFmdGVyX2NvbG9uLCB1c2VyX2FuZF9wYXNzd2QsIHVzZXJfbGVuX3AxKSAhPSAwKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWVuY3J5cHRlZCA9IHB3X2VuY3J5cHQoCisJCQkJCXVzZXJfYW5kX3Bhc3N3ZCArIHVzZXJfbGVuX3AxIC8qIGNsZWFydGV4dCBwd2QgZnJvbSB1c2VyICovLAorCQkJCQltZDVfcGFzc3dkIC8qc2FsdCAqLywgMSAvKiBjbGVhbnVwICovKTsKKwkJCQlyID0gc3RyY21wKGVuY3J5cHRlZCwgbWQ1X3Bhc3N3ZCk7CisJCQkJZnJlZShlbmNyeXB0ZWQpOworCQkJCWlmIChyID09IDApCisJCQkJCWdvdG8gc2V0X3JlbW90ZXVzZXJfdmFyOyAvKiBPayAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogQ29tcGFyaW5nIHBsYWludGV4dCAidXNlcjpwYXNzIiBpbiBvbmUgZ28gKi8KKwkJaWYgKHN0cmNtcChjdXItPmFmdGVyX2NvbG9uLCB1c2VyX2FuZF9wYXNzd2QpID09IDApIHsKKyBzZXRfcmVtb3RldXNlcl92YXI6CisJCQlyZW1vdGV1c2VyID0geHN0cm5kdXAodXNlcl9hbmRfcGFzc3dkLAorCQkJCQlzdHJjaHJudWwodXNlcl9hbmRfcGFzc3dkLCAnOicpIC0gdXNlcl9hbmRfcGFzc3dkKTsKKwkJCXJldHVybiAxOyAvKiBPayAqLworCQl9CisJfSAvKiBmb3IgKi8KKworCS8qIDAoYmFkKSBpZiBwcmV2IGlzIHNldDogbWF0Y2hlcyB3ZXJlIGZvdW5kIGJ1dCBwYXNzd2Qgd2FzIHdyb25nICovCisJcmV0dXJuIChwcmV2ID09IE5VTEwpOworfQorI2VuZGlmICAvKiBGRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEggKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCitzdGF0aWMgSHRhY2Nlc3NfUHJveHkgKmZpbmRfcHJveHlfZW50cnkoY29uc3QgY2hhciAqdXJsKQoreworCUh0YWNjZXNzX1Byb3h5ICpwOworCWZvciAocCA9IHByb3h5OyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAoc3RybmNtcCh1cmwsIHAtPnVybF9mcm9tLCBzdHJsZW4ocC0+dXJsX2Zyb20pKSA9PSAwKQorCQkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qCisgKiBIYW5kbGUgdGltZW91dHMKKyAqLworc3RhdGljIHZvaWQgc2VuZF9SRVFVRVNUX1RJTUVPVVRfYW5kX2V4aXQoaW50IHNpZykgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBzZW5kX1JFUVVFU1RfVElNRU9VVF9hbmRfZXhpdChpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9SRVFVRVNUX1RJTUVPVVQpOworfQorCisvKgorICogSGFuZGxlIGFuIGluY29taW5nIGh0dHAgcmVxdWVzdCBhbmQgZXhpdC4KKyAqLworc3RhdGljIHZvaWQgaGFuZGxlX2luY29taW5nX2FuZF9leGl0KGNvbnN0IGxlbl9hbmRfc29ja2FkZHIgKmZyb21BZGRyKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGhhbmRsZV9pbmNvbWluZ19hbmRfZXhpdChjb25zdCBsZW5fYW5kX3NvY2thZGRyICpmcm9tQWRkcikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciByZXF1ZXN0X0dFVFtdIEFMSUdOMSA9ICJHRVQiOworCXN0cnVjdCBzdGF0IHNiOworCWNoYXIgKnVybGNvcHk7CisJY2hhciAqdXJscDsKKwljaGFyICp0cHRyOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSQorCXN0YXRpYyBjb25zdCBjaGFyIHJlcXVlc3RfSEVBRFtdIEFMSUdOMSA9ICJIRUFEIjsKKwljb25zdCBjaGFyICpwcmVxdWVzdDsKKwljaGFyICpjb29raWUgPSBOVUxMOworCWNoYXIgKmNvbnRlbnRfdHlwZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsZW5ndGggPSAwOworI2VsaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKyNkZWZpbmUgcHJlcXVlc3QgcmVxdWVzdF9HRVQKKwl1bnNpZ25lZCBsb25nIGxlbmd0aCA9IDA7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJc21hbGxpbnQgYXV0aG9yaXplZCA9IC0xOworI2VuZGlmCisJc21hbGxpbnQgaXBfYWxsb3dlZDsKKwljaGFyIGh0dHBfbWFqb3JfdmVyc2lvbjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCWNoYXIgaHR0cF9taW5vcl92ZXJzaW9uOworCWNoYXIgKmhlYWRlcl9idWYgPSBoZWFkZXJfYnVmOyAvKiBmb3IgZ2NjICovCisJY2hhciAqaGVhZGVyX3B0ciA9IGhlYWRlcl9wdHI7CisJSHRhY2Nlc3NfUHJveHkgKnByb3h5X2VudHJ5OworI2VuZGlmCisKKwkvKiBBbGxvY2F0aW9uIG9mIGlvYnVmIGlzIHBvc3Rwb25lZCB1bnRpbCBub3cKKwkgKiAoSU9XLCBzZXJ2ZXIgcHJvY2VzcyBkb2Vzbid0IG5lZWQgdG8gd2FzdGUgOGspICovCisJaW9idWYgPSB4bWFsbG9jKElPQlVGX1NJWkUpOworCisJcm10X2lwID0gMDsKKwlpZiAoZnJvbUFkZHItPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJcm10X2lwID0gbnRvaGwoZnJvbUFkZHItPnUuc2luLnNpbl9hZGRyLnNfYWRkcik7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoZnJvbUFkZHItPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2CisJICYmIGZyb21BZGRyLT51LnNpbjYuc2luNl9hZGRyLnM2X2FkZHIzMlswXSA9PSAwCisJICYmIGZyb21BZGRyLT51LnNpbjYuc2luNl9hZGRyLnM2X2FkZHIzMlsxXSA9PSAwCisJICYmIG50b2hsKGZyb21BZGRyLT51LnNpbjYuc2luNl9hZGRyLnM2X2FkZHIzMlsyXSkgPT0gMHhmZmZmKQorCQlybXRfaXAgPSBudG9obChmcm9tQWRkci0+dS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbM10pOworI2VuZGlmCisJaWYgKEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSSB8fCBERUJVRyB8fCB2ZXJib3NlKSB7CisJCS8qIE5COiBjYW4gYmUgTlVMTCAodXNlciBydW5zIGh0dHBkIC1pIGJ5IGhhbmQ/KSAqLworCQlybXRfaXBfc3RyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJmZyb21BZGRyLT51LnNhKTsKKwl9CisJaWYgKHZlcmJvc2UpIHsKKwkJLyogdGhpcyB0cmljayBtYWtlcyAtdiBsb2dnaW5nIG11Y2ggc2ltcGxlciAqLworCQlpZiAocm10X2lwX3N0cikKKwkJCWFwcGxldF9uYW1lID0gcm10X2lwX3N0cjsKKwkJaWYgKHZlcmJvc2UgPiAyKQorCQkJYmJfZXJyb3JfbXNnKCJjb25uZWN0ZWQiKTsKKwl9CisKKwkvKiBJbnN0YWxsIHRpbWVvdXQgaGFuZGxlci4gZ2V0X2xpbmUoKSBuZWVkcyBpdC4gKi8KKwlzaWduYWwoU0lHQUxSTSwgc2VuZF9SRVFVRVNUX1RJTUVPVVRfYW5kX2V4aXQpOworCisJaWYgKCFnZXRfbGluZSgpKSAvKiBFT0Ygb3IgZXJyb3Igb3IgZW1wdHkgbGluZSAqLworCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9CQURfUkVRVUVTVCk7CisKKwkvKiBEZXRlcm1pbmUgdHlwZSBvZiByZXF1ZXN0IChHRVQvUE9TVCkgKi8KKwl1cmxwID0gc3RycGJyayhpb2J1ZiwgIiBcdCIpOworCWlmICh1cmxwID09IE5VTEwpCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX0JBRF9SRVFVRVNUKTsKKwkqdXJscCsrID0gJ1wwJzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kKKwlwcmVxdWVzdCA9IHJlcXVlc3RfR0VUOworCWlmIChzdHJjYXNlY21wKGlvYnVmLCBwcmVxdWVzdCkgIT0gMCkgeworCQlwcmVxdWVzdCA9IHJlcXVlc3RfSEVBRDsKKwkJaWYgKHN0cmNhc2VjbXAoaW9idWYsIHByZXF1ZXN0KSAhPSAwKSB7CisJCQlwcmVxdWVzdCA9ICJQT1NUIjsKKwkJCWlmIChzdHJjYXNlY21wKGlvYnVmLCBwcmVxdWVzdCkgIT0gMCkKKwkJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9OT1RfSU1QTEVNRU5URUQpOworCQl9CisJfQorI2Vsc2UKKwlpZiAoc3RyY2FzZWNtcChpb2J1ZiwgcmVxdWVzdF9HRVQpICE9IDApCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX05PVF9JTVBMRU1FTlRFRCk7CisjZW5kaWYKKwl1cmxwID0gc2tpcF93aGl0ZXNwYWNlKHVybHApOworCWlmICh1cmxwWzBdICE9ICcvJykKKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCisJLyogRmluZCBlbmQgb2YgVVJMIGFuZCBwYXJzZSBIVFRQIHZlcnNpb24sIGlmIGFueSAqLworCWh0dHBfbWFqb3JfdmVyc2lvbiA9ICcwJzsKKwlJRl9GRUFUVVJFX0hUVFBEX1BST1hZKGh0dHBfbWlub3JfdmVyc2lvbiA9ICcwJzspCisJdHB0ciA9IHN0cmNocm51bCh1cmxwLCAnICcpOworCS8qIElzIGl0ICIgSFRUUC8iPyAqLworCWlmICh0cHRyWzBdICYmIHN0cm5jbXAodHB0ciArIDEsIEhUVFBfMjAwLCA1KSA9PSAwKSB7CisJCWh0dHBfbWFqb3JfdmVyc2lvbiA9IHRwdHJbNl07CisJCUlGX0ZFQVRVUkVfSFRUUERfUFJPWFkoaHR0cF9taW5vcl92ZXJzaW9uID0gdHB0cls4XTspCisJfQorCSp0cHRyID0gJ1wwJzsKKworCS8qIENvcHkgVVJMIGZyb20gYWZ0ZXIgIkdFVCAiLyJQT1NUICIgdG8gc3RhY2stYWxsb2NhdGVkIGNoYXJbXSAqLworCXVybGNvcHkgPSBhbGxvY2EoKHRwdHIgLSB1cmxwKSArIDIgKyBzdHJsZW4oaW5kZXhfcGFnZSkpOworCS8qaWYgKHVybGNvcHkgPT0gTlVMTCkKKwkgKglzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOyovCisJc3RyY3B5KHVybGNvcHksIHVybHApOworCS8qIE5COiB1cmxjb3B5IHB0ciBpcyBuZXZlciBjaGFuZ2VkIGFmdGVyIHRoaXMgKi8KKworCS8qIEV4dHJhY3QgdXJsIGFyZ3MgaWYgcHJlc2VudCAqLworCWdfcXVlcnkgPSBOVUxMOworCXRwdHIgPSBzdHJjaHIodXJsY29weSwgJz8nKTsKKwlpZiAodHB0cikgeworCQkqdHB0cisrID0gJ1wwJzsKKwkJZ19xdWVyeSA9IHRwdHI7CisJfQorCisJLyogRGVjb2RlIFVSTCBlc2NhcGUgc2VxdWVuY2VzICovCisJdHB0ciA9IGRlY29kZVN0cmluZyh1cmxjb3B5LCAwKTsKKwlpZiAodHB0ciA9PSBOVUxMKQorCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9CQURfUkVRVUVTVCk7CisJaWYgKHRwdHIgPT0gdXJsY29weSArIDEpIHsKKwkJLyogJy8nIG9yIE5VTCBpcyBlbmNvZGVkICovCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX05PVF9GT1VORCk7CisJfQorCisJLyogQ2Fub25pY2FsaXplIHBhdGggKi8KKwkvKiBBbGdvcml0aG0gc3RvbGVuIGZyb20gbGliYmIgYmJfc2ltcGxpZnlfcGF0aCgpLAorCSAqIGJ1dCBkb24ndCBzdHJkdXAsIHJldGFpbiB0cmFpbGluZyBzbGFzaCwgcHJvdGVjdCByb290ICovCisJdXJscCA9IHRwdHIgPSB1cmxjb3B5OworCWRvIHsKKwkJaWYgKCp1cmxwID09ICcvJykgeworCQkJLyogc2tpcCBkdXBsaWNhdGUgKG9yIGluaXRpYWwpIHNsYXNoICovCisJCQlpZiAoKnRwdHIgPT0gJy8nKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoKnRwdHIgPT0gJy4nKSB7CisJCQkJLyogc2tpcCBleHRyYSAiLy4vIiAqLworCQkJCWlmICh0cHRyWzFdID09ICcvJyB8fCAhdHB0clsxXSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogIi4uIjogYmUgY2FyZWZ1bCAqLworCQkJCWlmICh0cHRyWzFdID09ICcuJyAmJiAodHB0clsyXSA9PSAnLycgfHwgIXRwdHJbMl0pKSB7CisJCQkJCSsrdHB0cjsKKwkJCQkJaWYgKHVybHAgPT0gdXJsY29weSkgLyogcHJvdGVjdCByb290ICovCisJCQkJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9CQURfUkVRVUVTVCk7CisJCQkJCXdoaWxlICgqLS11cmxwICE9ICcvJykgLyogb21pdCBwcmV2aW91cyBkaXIgKi87CisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJKisrdXJscCA9ICp0cHRyOworCX0gd2hpbGUgKCorK3RwdHIpOworCSorK3VybHAgPSAnXDAnOyAgICAgICAvKiB0ZXJtaW5hdGUgYWZ0ZXIgbGFzdCBjaGFyYWN0ZXIgKi8KKworCS8qIElmIFVSTCBpcyBhIGRpcmVjdG9yeSwgYWRkICcvJyAqLworCWlmICh1cmxwWy0xXSAhPSAnLycpIHsKKwkJaWYgKGlzX2RpcmVjdG9yeSh1cmxjb3B5ICsgMSwgMSwgTlVMTCkpIHsKKwkJCWZvdW5kX21vdmVkX3RlbXBvcmFyaWx5ID0gdXJsY29weTsKKwkJfQorCX0KKworCS8qIExvZyBpdCAqLworCWlmICh2ZXJib3NlID4gMSkKKwkJYmJfZXJyb3JfbXNnKCJ1cmw6JXMiLCB1cmxjb3B5KTsKKworCXRwdHIgPSB1cmxjb3B5OworCWlwX2FsbG93ZWQgPSBjaGVja1Blcm1JUCgpOworCXdoaWxlIChpcF9hbGxvd2VkICYmICh0cHRyID0gc3RyY2hyKHRwdHIgKyAxLCAnLycpKSAhPSBOVUxMKSB7CisJCS8qIGhhdmUgcGF0aDEvcGF0aDIgKi8KKwkJKnRwdHIgPSAnXDAnOworCQlpZiAoaXNfZGlyZWN0b3J5KHVybGNvcHkgKyAxLCAxLCBOVUxMKSkgeworCQkJLyogbWF5IGhhdmUgc3ViZGlyIGNvbmZpZyAqLworCQkJcGFyc2VfY29uZih1cmxjb3B5ICsgMSwgU1VCRElSX1BBUlNFKTsKKwkJCWlwX2FsbG93ZWQgPSBjaGVja1Blcm1JUCgpOworCQl9CisJCSp0cHRyID0gJy8nOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisJcHJveHlfZW50cnkgPSBmaW5kX3Byb3h5X2VudHJ5KHVybGNvcHkpOworCWlmIChwcm94eV9lbnRyeSkKKwkJaGVhZGVyX2J1ZiA9IGhlYWRlcl9wdHIgPSB4bWFsbG9jKElPQlVGX1NJWkUpOworI2VuZGlmCisKKwlpZiAoaHR0cF9tYWpvcl92ZXJzaW9uID49ICcwJykgeworCQkvKiBSZXF1ZXN0IHdhcyB3aXRoICIuLi4gSFRUUC9uWFhYIiwgYW5kIG4gPj0gMCAqLworCisJCS8qIFJlYWQgdW50aWwgYmxhbmsgbGluZSAqLworCQl3aGlsZSAoMSkgeworCQkJaWYgKCFnZXRfbGluZSgpKQorCQkJCWJyZWFrOyAvKiBFT0Ygb3IgZXJyb3Igb3IgZW1wdHkgbGluZSAqLworCQkJaWYgKERFQlVHKQorCQkJCWJiX2Vycm9yX21zZygiaGVhZGVyOiAnJXMnIiwgaW9idWYpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKwkJCS8qIFdlIG5lZWQgMiBtb3JlIGJ5dGVzIGZvciB5ZXQgYW5vdGhlciAiXHJcbiIgLQorCQkJICogc2VlIG5lYXIgZmRwcmludGYocHJveHlfZmQuLi4pIGZ1cnRoZXIgYmVsb3cgKi8KKwkJCWlmIChwcm94eV9lbnRyeSAmJiAoaGVhZGVyX3B0ciAtIGhlYWRlcl9idWYpIDwgSU9CVUZfU0laRSAtIDIpIHsKKwkJCQlpbnQgbGVuID0gc3RybGVuKGlvYnVmKTsKKwkJCQlpZiAobGVuID4gSU9CVUZfU0laRSAtIChoZWFkZXJfcHRyIC0gaGVhZGVyX2J1ZikgLSA0KQorCQkJCQlsZW4gPSBJT0JVRl9TSVpFIC0gKGhlYWRlcl9wdHIgLSBoZWFkZXJfYnVmKSAtIDQ7CisJCQkJbWVtY3B5KGhlYWRlcl9wdHIsIGlvYnVmLCBsZW4pOworCQkJCWhlYWRlcl9wdHIgKz0gbGVuOworCQkJCWhlYWRlcl9wdHJbMF0gPSAnXHInOworCQkJCWhlYWRlcl9wdHJbMV0gPSAnXG4nOworCQkJCWhlYWRlcl9wdHIgKz0gMjsKKwkJCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJIHx8IEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisJCQkvKiBUcnkgYW5kIGRvIG91ciBiZXN0IHRvIHBhcnNlIG1vcmUgbGluZXMgKi8KKwkJCWlmICgoU1RSTkNBU0VDTVAoaW9idWYsICJDb250ZW50LWxlbmd0aDoiKSA9PSAwKSkgeworCQkJCS8qIGV4dHJhIHJlYWQgb25seSBmb3IgUE9TVCAqLworCQkJCWlmIChwcmVxdWVzdCAhPSByZXF1ZXN0X0dFVAorIyBpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kKKwkJCQkgJiYgcHJlcXVlc3QgIT0gcmVxdWVzdF9IRUFECisjIGVuZGlmCisJCQkJKSB7CisJCQkJCXRwdHIgPSBza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIkNvbnRlbnQtbGVuZ3RoOiIpIC0gMSk7CisJCQkJCWlmICghdHB0clswXSkKKwkJCQkJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX0JBRF9SRVFVRVNUKTsKKwkJCQkJLyogbm90IHVzaW5nIHN0cnRvdWw6IGl0IGlnbm9yZXMgbGVhZGluZyBtaW51cyEgKi8KKwkJCQkJbGVuZ3RoID0gYmJfc3RydG91KHRwdHIsIE5VTEwsIDEwKTsKKwkJCQkJLyogbGVuZ3RoIGlzICJ1bG9uZyIsIGJ1dCB3ZSBuZWVkIHRvIHBhc3MgaXQgdG8gaW50IGxhdGVyICovCisJCQkJCWlmIChlcnJubyB8fCBsZW5ndGggPiBJTlRfTUFYKQorCQkJCQkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCQkJCX0KKwkJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSQorCQkJZWxzZSBpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJDb29raWU6IikgPT0gMCkgeworCQkJCWNvb2tpZSA9IHhzdHJkdXAoc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJDb29raWU6IiktMSkpOworCQkJfSBlbHNlIGlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIkNvbnRlbnQtVHlwZToiKSA9PSAwKSB7CisJCQkJY29udGVudF90eXBlID0geHN0cmR1cChza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIkNvbnRlbnQtVHlwZToiKS0xKSk7CisJCQl9IGVsc2UgaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiUmVmZXJlcjoiKSA9PSAwKSB7CisJCQkJcmVmZXJlciA9IHhzdHJkdXAoc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJSZWZlcmVyOiIpLTEpKTsKKwkJCX0gZWxzZSBpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJVc2VyLUFnZW50OiIpID09IDApIHsKKwkJCQl1c2VyX2FnZW50ID0geHN0cmR1cChza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIlVzZXItQWdlbnQ6IiktMSkpOworCQkJfSBlbHNlIGlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIkhvc3Q6IikgPT0gMCkgeworCQkJCWhvc3QgPSB4c3RyZHVwKHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiSG9zdDoiKS0xKSk7CisJCQl9IGVsc2UgaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiQWNjZXB0OiIpID09IDApIHsKKwkJCQlodHRwX2FjY2VwdCA9IHhzdHJkdXAoc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJBY2NlcHQ6IiktMSkpOworCQkJfSBlbHNlIGlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIkFjY2VwdC1MYW5ndWFnZToiKSA9PSAwKSB7CisJCQkJaHR0cF9hY2NlcHRfbGFuZ3VhZ2UgPSB4c3RyZHVwKHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiQWNjZXB0LUxhbmd1YWdlOiIpLTEpKTsKKwkJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwkJCWlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIkF1dGhvcml6YXRpb246IikgPT0gMCkgeworCQkJCS8qIFdlIG9ubHkgYWxsb3cgQmFzaWMgY3JlZGVudGlhbHMuCisJCQkJICogSXQgc2hvd3MgdXAgYXMgIkF1dGhvcml6YXRpb246IEJhc2ljIDx1c2VyPjo8cGFzc3dkPiIgd2hlcmUKKwkJCQkgKiAiPHVzZXI+OjxwYXNzd2Q+IiBpcyBiYXNlNjQgZW5jb2RlZC4KKwkJCQkgKi8KKwkJCQl0cHRyID0gc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJBdXRob3JpemF0aW9uOiIpLTEpOworCQkJCWlmIChTVFJOQ0FTRUNNUCh0cHRyLCAiQmFzaWMiKSAhPSAwKQorCQkJCQljb250aW51ZTsKKwkJCQl0cHRyICs9IHNpemVvZigiQmFzaWMiKS0xOworCQkJCS8qIGRlY29kZUJhc2U2NCgpIHNraXBzIHdoaXRlc3BhY2UgaXRzZWxmICovCisJCQkJZGVjb2RlQmFzZTY0KHRwdHIpOworCQkJCWF1dGhvcml6ZWQgPSBjaGVja191c2VyX3Bhc3N3ZCh1cmxjb3B5LCB0cHRyKTsKKwkJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCQkJaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiUmFuZ2U6IikgPT0gMCkgeworCQkJCS8qIFdlIGtub3cgb25seSBieXRlcz1OTk4tW01NTV0gKi8KKwkJCQljaGFyICpzID0gc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJSYW5nZToiKS0xKTsKKwkJCQlpZiAoc3RybmNtcChzLCAiYnl0ZXM9IiwgNikgPT0gMCkgeworCQkJCQlzICs9IHNpemVvZigiYnl0ZXM9IiktMTsKKwkJCQkJcmFuZ2Vfc3RhcnQgPSBCQl9TVFJUT09GRihzLCAmcywgMTApOworCQkJCQlpZiAoc1swXSAhPSAnLScgfHwgcmFuZ2Vfc3RhcnQgPCAwKSB7CisJCQkJCQlyYW5nZV9zdGFydCA9IDA7CisJCQkJCX0gZWxzZSBpZiAoc1sxXSkgeworCQkJCQkJcmFuZ2VfZW5kID0gQkJfU1RSVE9PRkYocysxLCBOVUxMLCAxMCk7CisJCQkJCQlpZiAoZXJybm8gfHwgcmFuZ2VfZW5kIDwgcmFuZ2Vfc3RhcnQpCisJCQkJCQkJcmFuZ2Vfc3RhcnQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfR1pJUAorCQkJaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiQWNjZXB0LUVuY29kaW5nOiIpID09IDApIHsKKwkJCQkvKiBOb3RlOiB3ZSBkbyBub3Qgc3VwcG9ydCAiZ3ppcDtxPTAiCisJCQkJICogbWV0aG9kIG9mIF9kaXNhYmxpbmdfIGd6aXAKKwkJCQkgKiBkZWxpdmVyeS4gTm8gb25lIHVzZXMgdGhhdCwgdGhvdWdoICovCisJCQkJY29uc3QgY2hhciAqcyA9IHN0cnN0cihpb2J1ZiwgImd6aXAiKTsKKwkJCQlpZiAocykgeworCQkJCQkvLyB3YW50IG1vcmUgdGhvcm91Z2ggY2hlY2tzPworCQkJCQkvL2lmIChzWy0xXSA9PSAnICcKKwkJCQkJLy8gfHwgc1stMV0gPT0gJywnCisJCQkJCS8vIHx8IHNbLTFdID09ICc6JworCQkJCQkvLykgeworCQkJCQkJY29udGVudF9nemlwID0gMTsKKwkJCQkJLy99CisJCQkJfQorCQkJfQorI2VuZGlmCisJCX0gLyogd2hpbGUgZXh0cmEgaGVhZGVyIHJlYWRpbmcgKi8KKwl9CisKKwkvKiBXZSBhcmUgZG9uZSByZWFkaW5nIGhlYWRlcnMsIGRpc2FibGUgcGVlciB0aW1lb3V0ICovCisJYWxhcm0oMCk7CisKKwlpZiAoc3RyY21wKGJiX2Jhc2VuYW1lKHVybGNvcHkpLCBIVFRQRF9DT05GKSA9PSAwIHx8ICFpcF9hbGxvd2VkKSB7CisJCS8qIHByb3RlY3QgbGlzdGluZyBbL3BhdGhdL2h0dHBkLmNvbmYgb3IgSVAgZGVueSAqLworCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9GT1JCSURERU4pOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwkvKiBDYXNlOiBubyAiQXV0aG9yaXphdGlvbjoiIHdhcyBzZWVuLCBidXQgcGFnZSBkb2VzIHJlcXVpcmUgcGFzc3dkLgorCSAqIENoZWNrIHRoYXQgd2l0aCBkdW1teSB1c2VyOnBhc3MgKi8KKwlpZiAoYXV0aG9yaXplZCA8IDApCisJCWF1dGhvcml6ZWQgPSBjaGVja191c2VyX3Bhc3N3ZCh1cmxjb3B5LCAiOiIpOworCWlmICghYXV0aG9yaXplZCkKKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfVU5BVVRIT1JJWkVEKTsKKyNlbmRpZgorCisJaWYgKGZvdW5kX21vdmVkX3RlbXBvcmFyaWx5KSB7CisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX01PVkVEX1RFTVBPUkFSSUxZKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCWlmIChwcm94eV9lbnRyeSAhPSBOVUxMKSB7CisJCWludCBwcm94eV9mZDsKKwkJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCisJCXByb3h5X2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKwkJaWYgKHByb3h5X2ZkIDwgMCkKKwkJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisJCWxzYSA9IGhvc3Qyc29ja2FkZHIocHJveHlfZW50cnktPmhvc3RfcG9ydCwgODApOworCQlpZiAobHNhID09IE5VTEwpCisJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCQlpZiAoY29ubmVjdChwcm94eV9mZCwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pIDwgMCkKKwkJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisJCWZkcHJpbnRmKHByb3h5X2ZkLCAiJXMgJXMlcyVzJXMgSFRUUC8lYy4lY1xyXG4iLAorCQkJCXByZXF1ZXN0LCAvKiBHRVQgb3IgUE9TVCAqLworCQkJCXByb3h5X2VudHJ5LT51cmxfdG8sIC8qIHVybCBwYXJ0IDEgKi8KKwkJCQl1cmxjb3B5ICsgc3RybGVuKHByb3h5X2VudHJ5LT51cmxfZnJvbSksIC8qIHVybCBwYXJ0IDIgKi8KKwkJCQkoZ19xdWVyeSA/ICI/IiA6ICIiKSwgLyogIj8iIChtYXliZSkgKi8KKwkJCQkoZ19xdWVyeSA/IGdfcXVlcnkgOiAiIiksIC8qIHF1ZXJ5IHN0cmluZyAobWF5YmUpICovCisJCQkJaHR0cF9tYWpvcl92ZXJzaW9uLCBodHRwX21pbm9yX3ZlcnNpb24pOworCQloZWFkZXJfcHRyWzBdID0gJ1xyJzsKKwkJaGVhZGVyX3B0clsxXSA9ICdcbic7CisJCWhlYWRlcl9wdHIgKz0gMjsKKwkJd3JpdGUocHJveHlfZmQsIGhlYWRlcl9idWYsIGhlYWRlcl9wdHIgLSBoZWFkZXJfYnVmKTsKKwkJZnJlZShoZWFkZXJfYnVmKTsgLyogb24gdGhlIG9yZGVyIG9mIDhrLCBmcmVlIGl0ICovCisJCWNnaV9pb19sb29wX2FuZF9leGl0KHByb3h5X2ZkLCBwcm94eV9mZCwgbGVuZ3RoKTsKKwl9CisjZW5kaWYKKworCXRwdHIgPSB1cmxjb3B5ICsgMTsgICAgICAvKiBza2lwIGZpcnN0ICcvJyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJCisJaWYgKHN0cm5jbXAodHB0ciwgImNnaS1iaW4vIiwgOCkgPT0gMCkgeworCQlpZiAodHB0cls4XSA9PSAnXDAnKSB7CisJCQkvKiBwcm90ZWN0IGxpc3RpbmcgImNnaS1iaW4vIiAqLworCQkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfRk9SQklEREVOKTsKKwkJfQorCQlzZW5kX2NnaV9hbmRfZXhpdCh1cmxjb3B5LCBwcmVxdWVzdCwgbGVuZ3RoLCBjb29raWUsIGNvbnRlbnRfdHlwZSk7CisJfQorI2VuZGlmCisKKwlpZiAodXJscFstMV0gPT0gJy8nKQorCQlzdHJjcHkodXJscCwgaW5kZXhfcGFnZSk7CisJaWYgKHN0YXQodHB0ciwgJnNiKSA9PSAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIKKwkJY2hhciAqc3VmZml4ID0gc3RycmNocih0cHRyLCAnLicpOworCQlpZiAoc3VmZml4KSB7CisJCQlIdGFjY2VzcyAqY3VyOworCQkJZm9yIChjdXIgPSBzY3JpcHRfaTsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJCQlpZiAoc3RyY21wKGN1ci0+YmVmb3JlX2NvbG9uICsgMSwgc3VmZml4KSA9PSAwKSB7CisJCQkJCXNlbmRfY2dpX2FuZF9leGl0KHVybGNvcHksIHByZXF1ZXN0LCBsZW5ndGgsIGNvb2tpZSwgY29udGVudF90eXBlKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCQlmaWxlX3NpemUgPSBzYi5zdF9zaXplOworCQlsYXN0X21vZCA9IHNiLnN0X210aW1lOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kKKwllbHNlIGlmICh1cmxwWy0xXSA9PSAnLycpIHsKKwkJLyogSXQncyBhIGRpciBVUkwgYW5kIHRoZXJlIGlzIG5vIGluZGV4Lmh0bWwKKwkJICogVHJ5IGNnaS1iaW4vaW5kZXguY2dpICovCisJCWlmIChhY2Nlc3MoIi9jZ2ktYmluL2luZGV4LmNnaSIrMSwgWF9PSykgPT0gMCkgeworCQkJdXJscFswXSA9ICdcMCc7CisJCQlnX3F1ZXJ5ID0gdXJsY29weTsKKwkJCXNlbmRfY2dpX2FuZF9leGl0KCIvY2dpLWJpbi9pbmRleC5jZ2kiLCBwcmVxdWVzdCwgbGVuZ3RoLCBjb29raWUsIGNvbnRlbnRfdHlwZSk7CisJCX0KKwl9CisJLyogZWxzZSBmYWxsIHRocm91Z2ggdG8gc2VuZF9maWxlLCBpdCBlcnJvcnMgb3V0IGlmIG9wZW4gZmFpbHM6ICovCisKKwlpZiAocHJlcXVlc3QgIT0gcmVxdWVzdF9HRVQgJiYgcHJlcXVlc3QgIT0gcmVxdWVzdF9IRUFEKSB7CisJCS8qIFBPU1QgZm9yIGZpbGVzIGRvZXMgbm90IG1ha2Ugc2Vuc2UgKi8KKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfTk9UX0lNUExFTUVOVEVEKTsKKwl9CisJc2VuZF9maWxlX2FuZF9leGl0KHRwdHIsCisJCShwcmVxdWVzdCAhPSByZXF1ZXN0X0hFQUQgPyBTRU5EX0hFQURFUlNfQU5EX0JPRFkgOiBTRU5EX0hFQURFUlMpCisJKTsKKyNlbHNlCisJc2VuZF9maWxlX2FuZF9leGl0KHRwdHIsIFNFTkRfSEVBREVSU19BTkRfQk9EWSk7CisjZW5kaWYKK30KKworLyoKKyAqIFRoZSBtYWluIGh0dHAgc2VydmVyIGZ1bmN0aW9uLgorICogR2l2ZW4gYSBzb2NrZXQsIGxpc3RlbiBmb3IgbmV3IGNvbm5lY3Rpb25zIGFuZCBmYXJtIG91dAorICogdGhlIHByb2Nlc3NpbmcgYXMgYSBbdl1mb3JrZWQgcHJvY2Vzcy4KKyAqIE5ldmVyIHJldHVybnMuCisgKi8KKyNpZiBCQl9NTVUKK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGQoaW50IHNlcnZlcl9zb2NrZXQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgbWluaV9odHRwZChpbnQgc2VydmVyX3NvY2tldCkKK3sKKwkvKiBOQjogaXQncyBiZXN0IHRvIG5vdCB1c2UgeGZ1bmNzIGluIHRoaXMgbG9vcCBiZWZvcmUgZm9yaygpLgorCSAqIE90aGVyd2lzZSBzZXJ2ZXIgbWF5IGRpZSBvbiB0cmFuc2llbnQgZXJyb3JzICh0ZW1wb3JhcnkKKwkgKiBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbiwgZXRjKSwgd2hpY2ggaXMgQmFkKHRtKS4KKwkgKiBUcnkgdG8gZG8gYW55IGRhbmdlcm91cyBjYWxscyBhZnRlciBmb3JrLgorCSAqLworCXdoaWxlICgxKSB7CisJCWludCBuOworCQlsZW5fYW5kX3NvY2thZGRyIGZyb21BZGRyOworCisJCS8qIFdhaXQgZm9yIGNvbm5lY3Rpb25zLi4uICovCisJCWZyb21BZGRyLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJCW4gPSBhY2NlcHQoc2VydmVyX3NvY2tldCwgJmZyb21BZGRyLnUuc2EsICZmcm9tQWRkci5sZW4pOworCQlpZiAobiA8IDApCisJCQljb250aW51ZTsKKworCQkvKiBzZXQgdGhlIEtFRVBBTElWRSBvcHRpb24gdG8gY3VsbCBkZWFkIGNvbm5lY3Rpb25zICovCisJCXNldHNvY2tvcHQobiwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworCisJCWlmIChmb3JrKCkgPT0gMCkgeworCQkJLyogY2hpbGQgKi8KKwkJCS8qIERvIG5vdCByZWxvYWQgY29uZmlnIG9uIEhVUCAqLworCQkJc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisJCQljbG9zZShzZXJ2ZXJfc29ja2V0KTsKKwkJCXhtb3ZlX2ZkKG4sIDApOworCQkJeGR1cDIoMCwgMSk7CisKKwkJCWhhbmRsZV9pbmNvbWluZ19hbmRfZXhpdCgmZnJvbUFkZHIpOworCQl9CisJCS8qIHBhcmVudCwgb3IgZm9yayBmYWlsZWQgKi8KKwkJY2xvc2Uobik7CisJfSAvKiB3aGlsZSAoMSkgKi8KKwkvKiBuZXZlciByZWFjaGVkICovCit9CisjZWxzZQorc3RhdGljIHZvaWQgbWluaV9odHRwZF9ub21tdShpbnQgc2VydmVyX3NvY2tldCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGRfbm9tbXUoaW50IHNlcnZlcl9zb2NrZXQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICphcmd2X2NvcHlbYXJnYyArIDJdOworCisJYXJndl9jb3B5WzBdID0gYXJndlswXTsKKwlhcmd2X2NvcHlbMV0gPSAoY2hhciopIi1pIjsKKwltZW1jcHkoJmFyZ3ZfY29weVsyXSwgJmFyZ3ZbMV0sIGFyZ2MgKiBzaXplb2YoYXJndlswXSkpOworCisJLyogTkI6IGl0J3MgYmVzdCB0byBub3QgdXNlIHhmdW5jcyBpbiB0aGlzIGxvb3AgYmVmb3JlIHZmb3JrKCkuCisJICogT3RoZXJ3aXNlIHNlcnZlciBtYXkgZGllIG9uIHRyYW5zaWVudCBlcnJvcnMgKHRlbXBvcmFyeQorCSAqIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uLCBldGMpLCB3aGljaCBpcyBCYWQodG0pLgorCSAqIFRyeSB0byBkbyBhbnkgZGFuZ2Vyb3VzIGNhbGxzIGFmdGVyIGZvcmsuCisJICovCisJd2hpbGUgKDEpIHsKKwkJaW50IG47CisJCWxlbl9hbmRfc29ja2FkZHIgZnJvbUFkZHI7CisKKwkJLyogV2FpdCBmb3IgY29ubmVjdGlvbnMuLi4gKi8KKwkJZnJvbUFkZHIubGVuID0gTFNBX1NJWkVPRl9TQTsKKwkJbiA9IGFjY2VwdChzZXJ2ZXJfc29ja2V0LCAmZnJvbUFkZHIudS5zYSwgJmZyb21BZGRyLmxlbik7CisJCWlmIChuIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNldCB0aGUgS0VFUEFMSVZFIG9wdGlvbiB0byBjdWxsIGRlYWQgY29ubmVjdGlvbnMgKi8KKwkJc2V0c29ja29wdChuLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisKKwkJaWYgKHZmb3JrKCkgPT0gMCkgeworCQkJLyogY2hpbGQgKi8KKwkJCS8qIERvIG5vdCByZWxvYWQgY29uZmlnIG9uIEhVUCAqLworCQkJc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisJCQljbG9zZShzZXJ2ZXJfc29ja2V0KTsKKwkJCXhtb3ZlX2ZkKG4sIDApOworCQkJeGR1cDIoMCwgMSk7CisKKwkJCS8qIFJ1biBhIGNvcHkgb2Ygb3Vyc2VsZiBpbiBpbmV0ZCBtb2RlICovCisJCQlyZV9leGVjKGFyZ3ZfY29weSk7CisJCX0KKwkJLyogcGFyZW50LCBvciB2Zm9yayBmYWlsZWQgKi8KKwkJY2xvc2Uobik7CisJfSAvKiB3aGlsZSAoMSkgKi8KKwkvKiBuZXZlciByZWFjaGVkICovCit9CisjZW5kaWYKKworLyoKKyAqIFByb2Nlc3MgYSBIVFRQIGNvbm5lY3Rpb24gb24gc3RkaW4vb3V0LgorICogTmV2ZXIgcmV0dXJucy4KKyAqLworc3RhdGljIHZvaWQgbWluaV9odHRwZF9pbmV0ZCh2b2lkKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGRfaW5ldGQodm9pZCkKK3sKKwlsZW5fYW5kX3NvY2thZGRyIGZyb21BZGRyOworCisJbWVtc2V0KCZmcm9tQWRkciwgMCwgc2l6ZW9mKGZyb21BZGRyKSk7CisJZnJvbUFkZHIubGVuID0gTFNBX1NJWkVPRl9TQTsKKwkvKiBOQjogY2FuIGZhaWwgaWYgdXNlciBydW5zIGl0IGJ5IGhhbmQgYW5kIHR5cGVzIGluIGh0dHAgY21kcyAqLworCWdldHBlZXJuYW1lKDAsICZmcm9tQWRkci51LnNhLCAmZnJvbUFkZHIubGVuKTsKKwloYW5kbGVfaW5jb21pbmdfYW5kX2V4aXQoJmZyb21BZGRyKTsKK30KKworc3RhdGljIHZvaWQgc2lnaHVwX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJcGFyc2VfY29uZihERUZBVUxUX1BBVEhfSFRUUERfQ09ORiwgU0lHTkFMRURfUEFSU0UpOworfQorCitlbnVtIHsKKwljX29wdF9jb25maWdfZmlsZSA9IDAsCisJZF9vcHRfZGVjb2RlX3VybCwKKwloX29wdF9ob21lX2h0dHBkLAorCUlGX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIoZV9vcHRfZW5jb2RlX3VybCwpCisJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKCAgICByX29wdF9yZWFsbSAgICAgLCkKKwlJRl9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KCAgICAgIG1fb3B0X21kNSAgICAgICAsKQorCUlGX0ZFQVRVUkVfSFRUUERfU0VUVUlEKCAgICAgICAgdV9vcHRfc2V0dWlkICAgICwpCisJcF9vcHRfcG9ydCAgICAgICwKKwlwX29wdF9pbmV0ZCAgICAgLAorCXBfb3B0X2ZvcmVncm91bmQsCisJcF9vcHRfdmVyYm9zZSAgICwKKwlPUFRfQ09ORklHX0ZJTEUgPSAxIDw8IGNfb3B0X2NvbmZpZ19maWxlLAorCU9QVF9ERUNPREVfVVJMICA9IDEgPDwgZF9vcHRfZGVjb2RlX3VybCwKKwlPUFRfSE9NRV9IVFRQRCAgPSAxIDw8IGhfb3B0X2hvbWVfaHR0cGQsCisJT1BUX0VOQ09ERV9VUkwgID0gSUZfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUigoMSA8PCBlX29wdF9lbmNvZGVfdXJsKSkgKyAwLAorCU9QVF9SRUFMTSAgICAgICA9IElGX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCggICAgKDEgPDwgcl9vcHRfcmVhbG0gICAgICkpICsgMCwKKwlPUFRfTUQ1ICAgICAgICAgPSBJRl9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KCAgICAgICgxIDw8IG1fb3B0X21kNSAgICAgICApKSArIDAsCisJT1BUX1NFVFVJRCAgICAgID0gSUZfRkVBVFVSRV9IVFRQRF9TRVRVSUQoICAgICAgICAoMSA8PCB1X29wdF9zZXR1aWQgICAgKSkgKyAwLAorCU9QVF9QT1JUICAgICAgICA9IDEgPDwgcF9vcHRfcG9ydCwKKwlPUFRfSU5FVEQgICAgICAgPSAxIDw8IHBfb3B0X2luZXRkLAorCU9QVF9GT1JFR1JPVU5EICA9IDEgPDwgcF9vcHRfZm9yZWdyb3VuZCwKKwlPUFRfVkVSQk9TRSAgICAgPSAxIDw8IHBfb3B0X3ZlcmJvc2UsCit9OworCisKK2ludCBodHRwZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaHR0cGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBzZXJ2ZXJfc29ja2V0ID0gc2VydmVyX3NvY2tldDsgLyogZm9yIGdjYyAqLworCXVuc2lnbmVkIG9wdDsKKwljaGFyICp1cmxfZm9yX2RlY29kZTsKKwlJRl9GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSKGNvbnN0IGNoYXIgKnVybF9mb3JfZW5jb2RlOykKKwlJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRChjb25zdCBjaGFyICpzX3VnaWQgPSBOVUxMOykKKwlJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRChzdHJ1Y3QgYmJfdWlkZ2lkX3QgdWdpZDspCisJSUZfRkVBVFVSRV9IVFRQRF9BVVRIX01ENShjb25zdCBjaGFyICpwYXNzOykKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisJLyogVW5kbyBidXN5Ym94LmM6IHdlIHdhbnQgdG8gc3BlYWsgRW5nbGlzaCBpbiBodHRwIChkYXRlcyBldGMpICovCisJc2V0bG9jYWxlKExDX1RJTUUsICJDIik7CisjZW5kaWYKKworCWhvbWVfaHR0cGQgPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihOVUxMKTsKKwkvKiAtdiBjb3VudHMsIC1pIGltcGxpZXMgLWYgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ2djppZiI7CisJLyogV2UgZG8gbm90ICJhYnNvbHV0aXplIiBwYXRoIGdpdmVuIGJ5IC1oIChob21lKSBvcHQuCisJICogSWYgdXNlciBnaXZlcyByZWxhdGl2ZSBwYXRoIGluIC1oLAorCSAqICRTQ1JJUFRfRklMRU5BTUUgd2lsbCBub3QgYmUgc2V0LiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJjOmQ6aDoiCisJCQlJRl9GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSKCJlOiIpCisJCQlJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoInI6IikKKwkJCUlGX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUoIm06IikKKwkJCUlGX0ZFQVRVUkVfSFRUUERfU0VUVUlEKCJ1OiIpCisJCQkicDppZnYiLAorCQkJJm9wdF9jX2NvbmZpZ0ZpbGUsICZ1cmxfZm9yX2RlY29kZSwgJmhvbWVfaHR0cGQKKwkJCUlGX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIoLCAmdXJsX2Zvcl9lbmNvZGUpCisJCQlJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoLCAmZ19yZWFsbSkKKwkJCUlGX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUoLCAmcGFzcykKKwkJCUlGX0ZFQVRVUkVfSFRUUERfU0VUVUlEKCwgJnNfdWdpZCkKKwkJCSwgJmJpbmRfYWRkcl9vcl9wb3J0CisJCQksICZ2ZXJib3NlCisJCSk7CisJaWYgKG9wdCAmIE9QVF9ERUNPREVfVVJMKSB7CisJCWZwdXRzKGRlY29kZVN0cmluZyh1cmxfZm9yX2RlY29kZSwgMSksIHN0ZG91dCk7CisJCXJldHVybiAwOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUgorCWlmIChvcHQgJiBPUFRfRU5DT0RFX1VSTCkgeworCQlmcHV0cyhlbmNvZGVTdHJpbmcodXJsX2Zvcl9lbmNvZGUpLCBzdGRvdXQpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9BVVRIX01ENQorCWlmIChvcHQgJiBPUFRfTUQ1KSB7CisJCWNoYXIgc2FsdFtzaXplb2YoIiQxJFhYWFhYWFhYIildOworCQlzYWx0WzBdID0gJyQnOworCQlzYWx0WzFdID0gJzEnOworCQlzYWx0WzJdID0gJyQnOworCQljcnlwdF9tYWtlX3NhbHQoc2FsdCArIDMsIDQpOworCQlwdXRzKHB3X2VuY3J5cHQocGFzcywgc2FsdCwgMSkpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9TRVRVSUQKKwlpZiAob3B0ICYgT1BUX1NFVFVJRCkgeworCQl4Z2V0X3VpZGdpZCgmdWdpZCwgc191Z2lkKTsKKwl9CisjZW5kaWYKKworI2lmICFCQl9NTVUKKwlpZiAoIShvcHQgJiBPUFRfRk9SRUdST1VORCkpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAsIGFyZ3YpOyAvKiBkb24ndCBjaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkgKi8KKwl9CisjZW5kaWYKKworCXhjaGRpcihob21lX2h0dHBkKTsKKwlpZiAoIShvcHQgJiBPUFRfSU5FVEQpKSB7CisJCXNpZ25hbChTSUdDSExELCBTSUdfSUdOKTsKKwkJc2VydmVyX3NvY2tldCA9IG9wZW5TZXJ2ZXIoKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9TRVRVSUQKKwkJLyogZHJvcCBwcml2aWxlZ2VzICovCisJCWlmIChvcHQgJiBPUFRfU0VUVUlEKSB7CisJCQlpZiAodWdpZC5naWQgIT0gKGdpZF90KS0xKSB7CisJCQkJaWYgKHNldGdyb3VwcygxLCAmdWdpZC5naWQpID09IC0xKQorCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldGdyb3VwcyIpOworCQkJCXhzZXRnaWQodWdpZC5naWQpOworCQkJfQorCQkJeHNldHVpZCh1Z2lkLnVpZCk7CisJCX0KKyNlbmRpZgorCX0KKworI2lmIDAKKwkvKiBVc2VyIGNhbiBkbyBpdCBoaW1zZWxmOiAnZW52IC0gUEFUSD0iJFBBVEgiIGh0dHBkJworCSAqIFdlIGRvbid0IGRvIGl0IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBzY3JldyB1c2VycworCSAqIHdoaWNoIHdhbnQgdG8gZG8KKwkgKiAnZW52IC0gVkFSMT12YWwxIFZBUjI9dmFsMiBodHRwZCcKKwkgKiBhbmQgaGF2ZSBWQVIxIGFuZCBWQVIyIHZhbHVlcyB2aXNpYmxlIGluIHRoZWlyIENHSXMuCisJICogQmVzaWRlcywgaXQgaXMgYWxzbyBzbWFsbGVyLiAqLworCXsKKwkJY2hhciAqcCA9IGdldGVudigiUEFUSCIpOworCQkvKiBlbnYgc3RyaW5ncyB0aGVtc2VsZiBhcmUgbm90IGZyZWVkLCBubyBuZWVkIHRvIHhzdHJkdXAocCk6ICovCisJCWNsZWFyZW52KCk7CisJCWlmIChwKQorCQkJcHV0ZW52KHAgLSA1KTsKKy8vCQlpZiAoIShvcHQgJiBPUFRfSU5FVEQpKQorLy8JCQlzZXRlbnZfbG9uZygiU0VSVkVSX1BPUlQiLCA/Pz8pOworCX0KKyNlbmRpZgorCisJcGFyc2VfY29uZihERUZBVUxUX1BBVEhfSFRUUERfQ09ORiwgRklSU1RfUEFSU0UpOworCWlmICghKG9wdCAmIE9QVF9JTkVURCkpCisJCXNpZ25hbChTSUdIVVAsIHNpZ2h1cF9oYW5kbGVyKTsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDA7CisJaWYgKG9wdCAmIE9QVF9JTkVURCkKKwkJbWluaV9odHRwZF9pbmV0ZCgpOworI2lmIEJCX01NVQorCWlmICghKG9wdCAmIE9QVF9GT1JFR1JPVU5EKSkKKwkJYmJfZGFlbW9uaXplKDApOyAvKiBkb24ndCBjaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkgKi8KKwltaW5pX2h0dHBkKHNlcnZlcl9zb2NrZXQpOyAvKiBuZXZlciByZXR1cm5zICovCisjZWxzZQorCW1pbmlfaHR0cGRfbm9tbXUoc2VydmVyX3NvY2tldCwgYXJnYywgYXJndik7IC8qIG5ldmVyIHJldHVybnMgKi8KKyNlbmRpZgorCS8qIHJldHVybiAwOyAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9odHRwZF9pbmRleGNnaS5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9odHRwZF9pbmRleGNnaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDIyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2h0dHBkX2luZGV4Y2dpLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgYSBDR0kgYXBwbGljYXRpb24uIEl0IG91dHB1dHMgZGlyZWN0b3J5IGluZGV4IHBhZ2UuCisgKiBQdXQgaXQgaW50byBjZ2ktYmluL2luZGV4LmNnaSBhbmQgY2htb2QgMDc1NS4KKyAqLworCisvKiBCdWlsZCBhLWxhCitpNDg2LWxpbnV4LXVjbGliYy1nY2MgXAorLXN0YXRpYyAtc3RhdGljLWxpYmdjYyBcCistRF9MQVJHRUZJTEVfU09VUkNFIC1EX0xBUkdFRklMRTY0X1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IFwKKy1XYWxsIC1Xc2hhZG93IC1Xd3JpdGUtc3RyaW5ncyAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdlcnJvciBcCistV29sZC1zdHlsZS1kZWZpbml0aW9uIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xbm8tcG9pbnRlci1zaWduIFwKKy1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgXAorLU9zIC1mbm8tYnVpbHRpbi1zdHJsZW4gLWZpbmxpbmUtbGltaXQ9MCAtZm9taXQtZnJhbWUtcG9pbnRlciBcCistZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucyAtZm5vLWd1ZXNzLWJyYW5jaC1wcm9iYWJpbGl0eSBcCistZnVuc2lnbmVkLWNoYXIgXAorLWZhbGlnbi1mdW5jdGlvbnM9MSAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sYWJlbHM9MSAtZmFsaWduLWxvb3BzPTEgXAorLW1hcmNoPWkzODYgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiBcCistV2wsLU1hcCAtV2wsbGluay5tYXAgLVdsLC0td2Fybi1jb21tb24gLVdsLC0tc29ydC1jb21tb24gLVdsLC0tZ2Mtc2VjdGlvbnMgXAoraHR0cGRfaW5kZXhjZ2kuYyAtbyBpbmRleC5jZ2kKKyovCisKKy8qIFdlIGRvbid0IHVzZSBwcmludGYsIGFzIGl0IHB1bGxzIGluID4xMiBrYiBvZiBjb2RlIGZyb20gdWNsaWJjIChpMzg2KS4gKi8KKy8qIEN1cnJlbnRseSBtYWxsb2MgbWFjaGluZXJ5IGlzIHRoZSBiaWdnZXN0IHBhcnQgb2YgbGliYyB3ZSBwdWxsIGluLiAqLworLyogV2UgaGF2ZSBvbmx5IG9uZSByZWFsbG9jIGFuZCBvbmUgc3RyZHVwLCBhbnkgaWRlYSBob3cgdG8gZG8gd2l0aG91dD8gKi8KKworLyogU2l6ZSAoaTM4Niwgc3RhdGljIHVjbGliYywgYXBwcm94aW1hdGUpOgorICogICB0ZXh0ICAgIGRhdGEgICAgIGJzcyAgICAgZGVjICAgICBoZXggZmlsZW5hbWUKKyAqICAxMzAzNiAgICAgIDQ0ICAgIDMwNTIgICAxNjEzMiAgICAzZjA0IGluZGV4LmNnaQorICogICAyNTc2ICAgICAgIDQgICAgMjA0OCAgICA0NjI4ICAgIDEyMTQgaW5kZXguY2dpLm8KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisvKiBBcHBlYXJhbmNlIG9mIHRoZSB0YWJsZSBpcyBjb250cm9sbGVkIGJ5IHN0eWxlIHNoZWV0ICpPTkxZKiwKKyAqIGZvcm1hdHRpbmcgY29kZSB1c2VzIDxUQUcgY2xhc3M9Q0xBU1M+IHRvIGFwcGx5IHN0eWxlCisgKiB0byBlbGVtZW50cy4gRWRpdCBzdHlsZXNoZWV0IHRvIHlvdXIgbGlraW5nIGFuZCByZWNvbXBpbGUuICovCisKKyNkZWZpbmUgU1RZTEVfU1RSIFwKKyI8c3R5bGU+IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0YWJsZSB7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgIndpZHRoOjEwMCU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJhY2tncm91bmQtY29sb3I6I2ZmZjVlZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci13aWR0aDoxcHg7IiAvKiAxcHggMXB4IDFweCAxcHg7ICovICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci1zcGFjaW5nOjJweDsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci1zdHlsZTpzb2xpZDsiIC8qIHNvbGlkIHNvbGlkIHNvbGlkIHNvbGlkOyAqLyAgIlxuIlwKKyAgImJvcmRlci1jb2xvcjpibGFjazsiIC8qIGJsYWNrIGJsYWNrIGJsYWNrIGJsYWNrOyAqLyAgIlxuIlwKKyAgImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0aCB7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci13aWR0aDoxcHg7IiAvKiAxcHggMXB4IDFweCAxcHg7ICovICAgICAgICAgICAgIlxuIlwKKyAgInBhZGRpbmc6MXB4OyIgLyogMXB4IDFweCAxcHggMXB4OyAqLyAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci1zdHlsZTpzb2xpZDsiIC8qIHNvbGlkIHNvbGlkIHNvbGlkIHNvbGlkOyAqLyAgIlxuIlwKKyAgImJvcmRlci1jb2xvcjpibGFjazsiIC8qIGJsYWNrIGJsYWNrIGJsYWNrIGJsYWNrOyAqLyAgIlxuIlwKKyJ9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ZCB7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgICAgICAgICAgICAvKiB0b3AgcmlnaHQgYm90dG9tIGxlZnQgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgImJvcmRlci13aWR0aDowcHggMXB4IDBweCAxcHg7IiAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgInBhZGRpbmc6MXB4OyIgLyogMXB4IDFweCAxcHggMXB4OyAqLyAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci1zdHlsZTpzb2xpZDsiIC8qIHNvbGlkIHNvbGlkIHNvbGlkIHNvbGlkOyAqLyAgIlxuIlwKKyAgImJvcmRlci1jb2xvcjpibGFjazsiIC8qIGJsYWNrIGJsYWNrIGJsYWNrIGJsYWNrOyAqLyAgIlxuIlwKKyAgIndoaXRlLXNwYWNlOm5vd3JhcDsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ci5oZHIgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlZWU1ZGU7IH0iICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ci5vIHsgYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmOyB9IiAgICAgICAgICAgICAgICAgICAgIlxuIlwKKy8qIHRyLmUgeyAuLi4gfSAtIGZvciBldmVuIHJvd3MgKGN1cnJlbnRseSBub25lKSAqLyAgICAgICAgIFwKKyJ0ci5mb290IHsgYmFja2dyb3VuZC1jb2xvcjojZWVlNWRlOyB9IiAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0aC5jbnQgeyB0ZXh0LWFsaWduOmxlZnQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0aC5zeiB7IHRleHQtYWxpZ246cmlnaHQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0aC5kdCB7IHRleHQtYWxpZ246cmlnaHQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ZC5zeiB7IHRleHQtYWxpZ246cmlnaHQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ZC5kdCB7IHRleHQtYWxpZ246cmlnaHQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJjb2wubm0geyB3aWR0aDo5OCU7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJjb2wuc3ogeyB3aWR0aDoxJTsgfSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJjb2wuZHQgeyB3aWR0aDoxJTsgfSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyI8L3N0eWxlPiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKwordHlwZWRlZiBzdHJ1Y3QgZGlyX2xpc3RfdCB7CisJY2hhciAgKmRsX25hbWU7CisJbW9kZV90IGRsX21vZGU7CisJb2ZmX3QgIGRsX3NpemU7CisJdGltZV90IGRsX210aW1lOworfSBkaXJfbGlzdF90OworCitzdGF0aWMgaW50IGNvbXBhcmVfZGwoZGlyX2xpc3RfdCAqYSwgZGlyX2xpc3RfdCAqYikKK3sKKwkvKiAiLi4iIGlzICdsZXNzIHRoYW4nIGFueSBvdGhlciBkaXIgZW50cnkgKi8KKwlpZiAoc3RyY21wKGEtPmRsX25hbWUsICIuLiIpID09IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc3RyY21wKGItPmRsX25hbWUsICIuLiIpID09IDApIHsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChTX0lTRElSKGEtPmRsX21vZGUpICE9IFNfSVNESVIoYi0+ZGxfbW9kZSkpIHsKKwkJLyogMSBpZiBiIGlzIGEgZGlyIChhbmQgdGh1cyBhIGlzICdhZnRlcicgYiwgYSA+IGIpLAorCQkgKiBlbHNlIC0xIChhIDwgYikgKi8KKwkJcmV0dXJuIChTX0lTRElSKGItPmRsX21vZGUpICE9IDApID8gMSA6IC0xOworCX0KKwlyZXR1cm4gc3RyY21wKGEtPmRsX25hbWUsIGItPmRsX25hbWUpOworfQorCitzdGF0aWMgY2hhciBidWZmZXJbMioxMDI0ID4gc2l6ZW9mKFNUWUxFX1NUUikgPyAyKjEwMjQgOiBzaXplb2YoU1RZTEVfU1RSKV07CitzdGF0aWMgY2hhciAqZHN0ID0gYnVmZmVyOworZW51bSB7CisJQlVGRkVSX1NJWkUgPSBzaXplb2YoYnVmZmVyKSwKKwlIRUFEUk9PTSA9IDY0LAorfTsKKworLyogQWZ0ZXIgdGhpcyBjYWxsLCB5b3UgaGF2ZSBhdCBsZWFzdCBzaXplICsgSEVBRFJPT00gYnl0ZXMgYXZhaWxhYmxlCisgKiBhaGVhZCBvZiBkc3QgKi8KK3N0YXRpYyB2b2lkIGd1YXJhbnRlZShpbnQgc2l6ZSkKK3sKKwlpZiAoYnVmZmVyICsgKEJVRkZFUl9TSVpFLUhFQURST09NKSAtIGRzdCA+PSBzaXplKQorCQlyZXR1cm47CisJd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmZmVyLCBkc3QgLSBidWZmZXIpOworCWRzdCA9IGJ1ZmZlcjsKK30KKworLyogTkI6IGZvcm1hdHRlcnMgZG8gbm90IHN0b3JlIHRlcm1pbmF0aW5nIE5VTCEgKi8KKworLyogSEVBRFJPT00gYnl0ZXMgYXJlIGF2YWlsYWJsZSBhZnRlciBkc3QgYWZ0ZXIgdGhpcyBjYWxsICovCitzdGF0aWMgdm9pZCBmbXRfc3RyKC8qY2hhciAqZHN0LCovIGNvbnN0IGNoYXIgKnNyYykKK3sKKwl1bnNpZ25lZCBsZW4gPSBzdHJsZW4oc3JjKTsKKwlndWFyYW50ZWUobGVuKTsKKwltZW1jcHkoZHN0LCBzcmMsIGxlbik7CisJZHN0ICs9IGxlbjsKK30KKworLyogSEVBRFJPT00gYnl0ZXMgYWZ0ZXIgZHN0IGFyZSBhdmFpbGFibGUgYWZ0ZXIgdGhpcyBjYWxsICovCitzdGF0aWMgdm9pZCBmbXRfdXJsKC8qY2hhciAqZHN0LCovIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJd2hpbGUgKCpuYW1lKSB7CisJCXVuc2lnbmVkIGMgPSAqbmFtZSsrOworCQlndWFyYW50ZWUoMyk7CisJCSpkc3QgPSBjOworCQlpZiAoKGMgLSAnMCcpID4gOSAvKiBub3QgYSBkaWdpdCAqLworCQkgJiYgKChjfDB4MjApIC0gJ2EnKSA+ICgneicgLSAnYScpIC8qIG5vdCBBLVogb3IgYS16ICovCisJCSAmJiAhc3RyY2hyKCIuXy0rQCIsIGMpCisJCSkgeworCQkJKmRzdCsrID0gJyUnOworCQkJKmRzdCsrID0gIjAxMjM0NTY3ODlBQkNERUYiW2MgPj4gNF07CisJCQkqZHN0ID0gIjAxMjM0NTY3ODlBQkNERUYiW2MgJiAweGZdOworCQl9CisJCWRzdCsrOworCX0KK30KKworLyogSEVBRFJPT00gYnl0ZXMgYXJlIGF2YWlsYWJsZSBhZnRlciBkc3QgYWZ0ZXIgdGhpcyBjYWxsICovCitzdGF0aWMgdm9pZCBmbXRfaHRtbCgvKmNoYXIgKmRzdCwqLyBjb25zdCBjaGFyICpuYW1lKQoreworCXdoaWxlICgqbmFtZSkgeworCQljaGFyIGMgPSAqbmFtZSsrOworCQlpZiAoYyA9PSAnPCcpCisJCQlmbXRfc3RyKCImbHQ7Iik7CisJCWVsc2UgaWYgKGMgPT0gJz4nKQorCQkJZm10X3N0cigiJmd0OyIpOworCQllbHNlIGlmIChjID09ICcmJykgeworCQkJZm10X3N0cigiJmFtcDsiKTsKKwkJfSBlbHNlIHsKKwkJCWd1YXJhbnRlZSgxKTsKKwkJCSpkc3QrKyA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCX0KK30KKworLyogSEVBRFJPT00gYnl0ZXMgYXJlIGF2YWlsYWJsZSBhZnRlciBkc3QgYWZ0ZXIgdGhpcyBjYWxsICovCitzdGF0aWMgdm9pZCBmbXRfdWxsKC8qY2hhciAqZHN0LCovIHVuc2lnbmVkIGxvbmcgbG9uZyBuKQoreworCWNoYXIgYnVmW3NpemVvZihuKSozICsgMl07CisJY2hhciAqcDsKKworCXAgPSBidWYgKyBzaXplb2YoYnVmKSAtIDE7CisJKnAgPSAnXDAnOworCWRvIHsKKwkJKi0tcCA9IChuICUgMTApICsgJzAnOworCQluIC89IDEwOworCX0gd2hpbGUgKG4pOworCWZtdF9zdHIoLypkc3QsKi8gcCk7Cit9CisKKy8qIERvZXMgbm90IGNhbGwgZ3VhcmFudGVlIC0gZWF0cyBpbnRvIGhlYWRyb29tIGluc3RlYWQgKi8KK3N0YXRpYyB2b2lkIGZtdF8wMnUoLypjaGFyICpkc3QsKi8gdW5zaWduZWQgbikKK3sKKwkvKiBuICU9IDEwMDsgLSBub3QgbmVlZGVkLCBjYWxsZXJzIGRvbid0IHBhc3MgYmlnIG4gKi8KKwlkc3RbMF0gPSAobiAvIDEwKSArICcwJzsKKwlkc3RbMV0gPSAobiAlIDEwKSArICcwJzsKKwlkc3QgKz0gMjsKK30KKworLyogRG9lcyBub3QgY2FsbCBndWFyYW50ZWUgLSBlYXRzIGludG8gaGVhZHJvb20gaW5zdGVhZCAqLworc3RhdGljIHZvaWQgZm10XzA0dSgvKmNoYXIgKmRzdCwqLyB1bnNpZ25lZCBuKQoreworCS8qIG4gJT0gMTAwMDA7IC0gbm90IG5lZWRlZCwgY2FsbGVycyBkb24ndCBwYXNzIGJpZyBuICovCisJZm10XzAydShuIC8gMTAwKTsKKwlmbXRfMDJ1KG4gJSAxMDApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWRpcl9saXN0X3QgKmRpcl9saXN0OworCWRpcl9saXN0X3QgKmNkaXI7CisJdW5zaWduZWQgZGlyX2xpc3RfY291bnQ7CisJdW5zaWduZWQgY291bnRfZGlyczsKKwl1bnNpZ25lZCBjb3VudF9maWxlczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZV90b3RhbDsKKwlpbnQgb2RkOworCURJUiAqZGlycDsKKwljaGFyICpRVUVSWV9TVFJJTkc7CisKKwlRVUVSWV9TVFJJTkcgPSBnZXRlbnYoIlFVRVJZX1NUUklORyIpOworCWlmICghUVVFUllfU1RSSU5HCisJIHx8IFFVRVJZX1NUUklOR1swXSAhPSAnLycKKwkgfHwgc3Ryc3RyKFFVRVJZX1NUUklORywgIi8vIikKKwkgfHwgc3Ryc3RyKFFVRVJZX1NUUklORywgIi8uLi8iKQorCSB8fCBzdHJjbXAoc3RycmNocihRVUVSWV9TVFJJTkcsICcvJyksICIvLi4iKSA9PSAwCisJKSB7CisJCXJldHVybiAxOworCX0KKworCWlmIChjaGRpcigiLi4iKQorCSB8fCAoUVVFUllfU1RSSU5HWzFdICYmIGNoZGlyKFFVRVJZX1NUUklORyArIDEpKQorCSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlkaXJwID0gb3BlbmRpcigiLiIpOworCWlmICghZGlycCkKKwkJcmV0dXJuIDE7CisJZGlyX2xpc3QgPSBOVUxMOworCWRpcl9saXN0X2NvdW50ID0gMDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgZGlyZW50ICpkcDsKKwkJc3RydWN0IHN0YXQgc2I7CisKKwkJZHAgPSByZWFkZGlyKGRpcnApOworCQlpZiAoIWRwKQorCQkJYnJlYWs7CisJCWlmIChkcC0+ZF9uYW1lWzBdID09ICcuJyAmJiAhZHAtPmRfbmFtZVsxXSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RhdChkcC0+ZF9uYW1lLCAmc2IpICE9IDApCisJCQljb250aW51ZTsKKwkJZGlyX2xpc3QgPSByZWFsbG9jKGRpcl9saXN0LCAoZGlyX2xpc3RfY291bnQgKyAxKSAqIHNpemVvZihkaXJfbGlzdFswXSkpOworCQlkaXJfbGlzdFtkaXJfbGlzdF9jb3VudF0uZGxfbmFtZSA9IHN0cmR1cChkcC0+ZF9uYW1lKTsKKwkJZGlyX2xpc3RbZGlyX2xpc3RfY291bnRdLmRsX21vZGUgPSBzYi5zdF9tb2RlOworCQlkaXJfbGlzdFtkaXJfbGlzdF9jb3VudF0uZGxfc2l6ZSA9IHNiLnN0X3NpemU7CisJCWRpcl9saXN0W2Rpcl9saXN0X2NvdW50XS5kbF9tdGltZSA9IHNiLnN0X210aW1lOworCQlkaXJfbGlzdF9jb3VudCsrOworCX0KKwljbG9zZWRpcihkaXJwKTsKKworCXFzb3J0KGRpcl9saXN0LCBkaXJfbGlzdF9jb3VudCwgc2l6ZW9mKGRpcl9saXN0WzBdKSwgKHZvaWQqKWNvbXBhcmVfZGwpOworCisJZm10X3N0cigKKwkJIiIgLyogQWRkaXRpb25hbCBoZWFkZXJzIChjdXJyZW50bHkgbm9uZSkgKi8KKwkJIlxyXG4iIC8qIE1hbmRhdG9yeSBlbXB0eSBsaW5lIGFmdGVyIGhlYWRlcnMgKi8KKwkJIjxodG1sPjxoZWFkPjx0aXRsZT5JbmRleCBvZiAiKTsKKwkvKiBHdWFyZCBhZ2FpbnN0IGRpcmVjdG9yaWVzIHdpdGggJiwgPiBldGMgKi8KKwlmbXRfaHRtbChRVUVSWV9TVFJJTkcpOworCWZtdF9zdHIoCisJCSI8L3RpdGxlPlxuIgorCQlTVFlMRV9TVFIKKwkJIjwvaGVhZD4iICJcbiIKKwkJIjxib2R5PiIgIlxuIgorCQkiPGgxPkluZGV4IG9mICIpOworCWZtdF9odG1sKFFVRVJZX1NUUklORyk7CisJZm10X3N0cigKKwkJIjwvaDE+IiAiXG4iCisJCSI8dGFibGU+IiAiXG4iCisJCSI8Y29sIGNsYXNzPW5tPjxjb2wgY2xhc3M9c3o+PGNvbCBjbGFzcz1kdD4iICJcbiIKKwkJIjx0ciBjbGFzcz1oZHI+PHRoIGNsYXNzPWNudD5OYW1lPHRoIGNsYXNzPXN6PlNpemU8dGggY2xhc3M9ZHQ+TGFzdCBtb2RpZmllZCIgIlxuIik7CisKKwlvZGQgPSAwOworCWNvdW50X2RpcnMgPSAwOworCWNvdW50X2ZpbGVzID0gMDsKKwlzaXplX3RvdGFsID0gMDsKKwljZGlyID0gZGlyX2xpc3Q7CisJd2hpbGUgKGRpcl9saXN0X2NvdW50LS0pIHsKKwkJc3RydWN0IHRtICpwdG07CisKKwkJaWYgKFNfSVNESVIoY2Rpci0+ZGxfbW9kZSkpIHsKKwkJCWNvdW50X2RpcnMrKzsKKwkJfSBlbHNlIGlmIChTX0lTUkVHKGNkaXItPmRsX21vZGUpKSB7CisJCQljb3VudF9maWxlcysrOworCQkJc2l6ZV90b3RhbCArPSBjZGlyLT5kbF9zaXplOworCQl9IGVsc2UKKwkJCWdvdG8gbmV4dDsKKworCQlmbXRfc3RyKCI8dHIgY2xhc3M9Iik7CisJCSpkc3QrKyA9IChvZGQgPyAnbycgOiAnZScpOworCQlmbXRfc3RyKCI+PHRkIGNsYXNzPW5tPjxhIGhyZWY9JyIpOworCQlmbXRfdXJsKGNkaXItPmRsX25hbWUpOyAvKiAlMjAgZXRjICovCisJCWlmIChTX0lTRElSKGNkaXItPmRsX21vZGUpKQorCQkJKmRzdCsrID0gJy8nOworCQlmbXRfc3RyKCInPiIpOworCQlmbXRfaHRtbChjZGlyLT5kbF9uYW1lKTsgLyogJmx0OyBldGMgKi8KKwkJaWYgKFNfSVNESVIoY2Rpci0+ZGxfbW9kZSkpCisJCQkqZHN0KysgPSAnLyc7CisJCWZtdF9zdHIoIjwvYT48dGQgY2xhc3M9c3o+Iik7CisJCWlmIChTX0lTUkVHKGNkaXItPmRsX21vZGUpKQorCQkJZm10X3VsbChjZGlyLT5kbF9zaXplKTsKKwkJZm10X3N0cigiPHRkIGNsYXNzPWR0PiIpOworCQlwdG0gPSBnbXRpbWUoJmNkaXItPmRsX210aW1lKTsKKwkJZm10XzA0dSgxOTAwICsgcHRtLT50bV95ZWFyKTsgKmRzdCsrID0gJy0nOworCQlmbXRfMDJ1KHB0bS0+dG1fbW9uICsgMSk7ICpkc3QrKyA9ICctJzsKKwkJZm10XzAydShwdG0tPnRtX21kYXkpOyAqZHN0KysgPSAnICc7CisJCWZtdF8wMnUocHRtLT50bV9ob3VyKTsgKmRzdCsrID0gJzonOworCQlmbXRfMDJ1KHB0bS0+dG1fbWluKTsgKmRzdCsrID0gJzonOworCQlmbXRfMDJ1KHB0bS0+dG1fc2VjKTsKKwkJKmRzdCsrID0gJ1xuJzsKKworCQlvZGQgPSAxIC0gb2RkOworIG5leHQ6CisJCWNkaXIrKzsKKwl9CisKKwlmbXRfc3RyKCI8dHIgY2xhc3M9Zm9vdD48dGggY2xhc3M9Y250PkZpbGVzOiAiKTsKKwlmbXRfdWxsKGNvdW50X2ZpbGVzKTsKKwkvKiBjb3VudF9kaXJzIC0gMTogd2UgZG9uJ3Qgd2FudCB0byBjb3VudCAiLi4iICovCisJZm10X3N0cigiLCBkaXJlY3RvcmllczogIik7CisJZm10X3VsbChjb3VudF9kaXJzIC0gMSk7CisJZm10X3N0cigiPHRoIGNsYXNzPXN6PiIpOworCWZtdF91bGwoc2l6ZV90b3RhbCk7CisJZm10X3N0cigiPHRoIGNsYXNzPWR0PlxuIik7CisJLyogIjwvdGFibGU+PC9ib2R5PjwvaHRtbD4iIC0gd2h5IGJvdGhlcj8gKi8KKwlndWFyYW50ZWUoQlVGRkVSX1NJWkUgKiAyKTsgLyogZmx1c2ggKi8KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9odHRwZF9wb3N0X3VwbG9hZC50eHQgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2h0dHBkX3Bvc3RfdXBsb2FkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDUwNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9odHRwZF9wb3N0X3VwbG9hZC50eHQKQEAgLTAsMCArMSw2NSBAQAorUE9TVCB1cGxvYWQgZXhhbXBsZToKKworcG9zdF91cGxvYWQuaHRtCis9PT09PT09PT09PT09PT0KKzxodG1sPgorPGJvZHk+Cis8Zm9ybSBhY3Rpb249L2NnaS1iaW4vcG9zdF91cGxvYWQuY2dpIG1ldGhvZD1wb3N0IGVuY3R5cGU9bXVsdGlwYXJ0L2Zvcm0tZGF0YT4KK0ZpbGUgdG8gdXBsb2FkOiA8aW5wdXQgdHlwZT1maWxlIG5hbWU9ZmlsZTE+IDxpbnB1dCB0eXBlPXN1Ym1pdD4KKzwvZm9ybT4KKworCitwb3N0X3VwbG9hZC5jZ2kKKz09PT09PT09PT09PT09PQorIyEvYmluL3NoCisKKyMgUE9TVCB1cGxvYWQgZm9ybWF0OgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTI5OTk1ODA5MjE4MDkzNzQ5MjIxODU2NDQ2MDMyXk0KKyMgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJmaWxlMSI7IGZpbGVuYW1lPSIuLi4iXk0KKyMgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1eTQorIyBeTSAgICA8LS0tLS0tLS0tIGhlYWRlcnMgZW5kIHdpdGggZW1wdHkgbGluZQorIyBmaWxlIGNvbnRlbnRzCisjIGZpbGUgY29udGVudHMKKyMgZmlsZSBjb250ZW50cworIyBeTSAgICA8LS0tLS0tLS0tIGV4dHJhIGVtcHR5IGxpbmUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0yOTk5NTgwOTIxODA5Mzc0OTIyMTg1NjQ0NjAzMi0tXk0KKworZmlsZT0vdG1wLyQkLSRSQU5ET00KKworQ1I9YHByaW50ZiAnXHInYAorCisjIENHSSBvdXRwdXQgbXVzdCBzdGFydCB3aXRoIGF0IGxlYXN0IGVtcHR5IGxpbmUgKG9yIGhlYWRlcnMpCitwcmludGYgJ1xyXG4nCisKK0lGUz0iJENSIgorcmVhZCAtciBkZWxpbV9saW5lCitJRlM9IiIKKword2hpbGUgcmVhZCAtciBsaW5lOyBkbworICAgIHRlc3QgeCIkbGluZSIgPSB4IiIgJiYgYnJlYWsKKyAgICB0ZXN0IHgiJGxpbmUiID0geCIkQ1IiICYmIGJyZWFrCitkb25lCisKK2NhdCA+IiRmaWxlIgorCisjIFdlIG5lZWQgdG8gZGVsZXRlIHRoZSB0YWlsIG9mICJcclxuZGVsaW1fbGluZS0tXHJcbiIKK3RhaWxfbGVuPSQoKCR7I2RlbGltX2xpbmV9ICsgNikpCisKKyMgR2V0IGFuZCBjaGVjayBmaWxlIHNpemUKK2ZpbGVzaXplPWBzdGF0IC1jIiVzIiAiJGZpbGUiYAordGVzdCAiJGZpbGVzaXplIiAtbHQgIiR0YWlsX2xlbiIgJiYgZXhpdCAxCisKKyMgQ2hlY2sgdGhhdCB0YWlsIGlzIGNvcnJlY3QKK2RkIGlmPSIkZmlsZSIgc2tpcD0kKChmaWxlc2l6ZSAtIHRhaWxfbGVuKSkgYnM9MSBjb3VudD0xMDAwID4iJGZpbGUudGFpbCIgMj4vZGV2L251bGwKK3ByaW50ZiAiXHJcbiVzLS1cclxuIiAiJGRlbGltX2xpbmUiID4iJGZpbGUudGFpbC5leHBlY3RlZCIKK2lmICEgZGlmZiAtcSAiJGZpbGUudGFpbCIgIiRmaWxlLnRhaWwuZXhwZWN0ZWQiID4vZGV2L251bGw7IHRoZW4KKyAgICBwcmludGYgIjxodG1sPlxuPGJvZHk+XG5NYWxmb3JtZWQgZmlsZSB1cGxvYWQiCisgICAgZXhpdCAxCitmaQorcm0gIiRmaWxlLnRhaWwiCitybSAiJGZpbGUudGFpbC5leHBlY3RlZCIKKworIyBUcnVuY2F0ZSB0aGUgZmlsZQorZGQgb2Y9IiRmaWxlIiBzZWVrPSQoKGZpbGVzaXplIC0gdGFpbF9sZW4pKSBicz0xIGNvdW50PTAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorCitwcmludGYgIjxodG1sPlxuPGJvZHk+XG5GaWxlIHVwbG9hZCBoYXMgYmVlbiBhY2NlcHRlZCIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaHR0cGRfc3NpLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2h0dHBkX3NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTY0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2h0dHBkX3NzaS5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGEgQ0dJIGFwcGxpY2F0aW9uLiBJdCBwcm9jZXNzZXMgc2VydmVyLXNpZGUgaW5jbHVkZXM6CisgKiA8IS0tI2luY2x1ZGUgZmlsZT0iZmlsZS5odG1sIiAtLT4KKyAqCisgKiBVc2FnZTogcHV0IHRoZXNlIGxpbmVzIGluIGh0dHBkLmNvbmY6CisgKgorICogKi5odG1sOi9iaW4vaHR0cGRfc3NpCisgKiAqLmh0bTovYmluL2h0dHBkX3NzaQorICovCisKKy8qIEJ1aWxkIGEtbGEKK2k0ODYtbGludXgtdWNsaWJjLWdjYyBcCistc3RhdGljIC1zdGF0aWMtbGliZ2NjIFwKKy1EX0xBUkdFRklMRV9TT1VSQ0UgLURfTEFSR0VGSUxFNjRfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgXAorLVdhbGwgLVdzaGFkb3cgLVd3cml0ZS1zdHJpbmdzIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV2Vycm9yIFwKKy1Xb2xkLXN0eWxlLWRlZmluaXRpb24gLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVduby1wb2ludGVyLXNpZ24gXAorLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyBcCistT3MgLWZuby1idWlsdGluLXN0cmxlbiAtZmlubGluZS1saW1pdD0wIC1mb21pdC1mcmFtZS1wb2ludGVyIFwKKy1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIC1mbm8tZ3Vlc3MtYnJhbmNoLXByb2JhYmlsaXR5IFwKKy1mdW5zaWduZWQtY2hhciBcCistZmFsaWduLWZ1bmN0aW9ucz0xIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxhYmVscz0xIC1mYWxpZ24tbG9vcHM9MSBcCistbWFyY2g9aTM4NiAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yIFwKKy1XbCwtTWFwIC1XbCxsaW5rLm1hcCAtV2wsLS13YXJuLWNvbW1vbiAtV2wsLS1zb3J0LWNvbW1vbiAtV2wsLS1nYy1zZWN0aW9ucyBcCitodHRwZF9zc2kuYyAtbyBodHRwZF9zc2kKKyovCisKKy8qIFNpemUgKGkzODYsIHN0YXRpYyB1Y2xpYmMsIGFwcHJveGltYXRlKToKKyAqIHRleHQgICAgZGF0YSAgICAgYnNzICAgICBkZWMgICAgIGhleCBmaWxlbmFtZQorICogOTQ4NyAgICAgMTYwICAgNjg1NTIgICA3ODE5OSAgIDEzMTc3IGh0dHBkX3NzaQorICoKKyAqIE5vdGU6IGl0IHdvdWxkbid0IGJlIHRvbyBoYXJkIHRvIGdldCByaWQgb2Ygc3RkaW8gYW5kIHN0cmR1cCwKKyAqIChlc3BlY2lhbGx5IHRoYXQgZmdldHMoKSBtYW5nbGVzIE5VTHMuLi4pCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitzdGF0aWMgY2hhciogc2tpcF93aGl0ZXNwYWNlKGNoYXIgKnMpCit7CisJd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSArK3M7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIGNoYXIgbGluZVs2NCAqIDEwMjRdOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2luY2x1ZGVzKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCBjdXJkaXJfZmQ7CisJY2hhciAqZW5kOworCUZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisJaWYgKCFmcCkKKwkJZXhpdCgxKTsKKworCS8qIEVuc3VyZSB0aGF0IG5lc3RlZCBpbmNsdWRlcyBhcmUgcmVsYXRpdmU6CisJICogaWYgd2UgaW5jbHVkZSBhLzEuaHRtIGFuZCBpdCBpbmNsdWRlcyBiLzIuaHRtLAorCSAqIHdlIG5lZWQgdG8gaW5jbHVkZSBhL2IvMi5odG0sIG5vdCBiLzIuaHRtCisJICovCisJY3VyZGlyX2ZkID0gLTE7CisJZW5kID0gc3RycmNocihmaWxlbmFtZSwgJy8nKTsKKwlpZiAoZW5kKSB7CisJCWN1cmRpcl9mZCA9IG9wZW4oIi4iLCBPX1JET05MWSk7CisJCS8qICplbmQgPSAnXDAnIHdvdWxkIG1pc2hhbmRsZSAiL2ZpbGUuaHRtIiAqLworCQllbmRbMV0gPSAnXDAnOworCQljaGRpcihmaWxlbmFtZSk7CisJfQorCisjZGVmaW5lIElOQ0xVREUgIjwhLS0jaW5jbHVkZSIKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHsKKwkJdW5zaWduZWQgcHJlY2VkaW5nX2xlbjsKKwkJY2hhciAqaW5jbHVkZV9kaXJlY3RpdmU7CisKKwkJaW5jbHVkZV9kaXJlY3RpdmUgPSBzdHJzdHIobGluZSwgSU5DTFVERSk7CisJCWlmICghaW5jbHVkZV9kaXJlY3RpdmUpIHsKKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmVjZWRpbmdfbGVuID0gaW5jbHVkZV9kaXJlY3RpdmUgLSBsaW5lOworCQlpZiAobWVtY2hyKGxpbmUsICdcIicsIHByZWNlZGluZ19sZW4pCisJCSB8fCBtZW1jaHIobGluZSwgJ1wnJywgcHJlY2VkaW5nX2xlbikKKwkJKSB7CisJCQkvKiBJTkNMVURFIHN0cmluZyBtYXkgYmUgaW5zaWRlICJzdHIiIG9yICdzdHInLAorCQkJICogaWdub3JlIGl0ICovCisJCQlmcHV0cyhsaW5lLCBzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJLyogU21hbGwgYnVnOiB3ZSBhY2NlcHQgI2luY2x1ZGVmaWxlPSJmaWxlIiB0b28gKi8KKwkJaW5jbHVkZV9kaXJlY3RpdmUgPSBza2lwX3doaXRlc3BhY2UoaW5jbHVkZV9kaXJlY3RpdmUgKyBzaXplb2YoSU5DTFVERSktMSk7CisJCWlmIChzdHJuY21wKGluY2x1ZGVfZGlyZWN0aXZlLCAiZmlsZT1cIiIsIDYpICE9IDApIHsKKwkJCS8qICI8IS0tI2luY2x1ZGUgdmlydHVhbD0uLi4iPyAtIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpbmNsdWRlX2RpcmVjdGl2ZSArPSA2OyAvKiBub3cgaXQgcG9pbnRzIHRvIGZpbGUgbmFtZSAqLworCQllbmQgPSBzdHJjaHIoaW5jbHVkZV9kaXJlY3RpdmUsICdcIicpOworCQlpZiAoIWVuZCkgeworCQkJZnB1dHMobGluZSwgc3Rkb3V0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFdlIGNoZWNrZWQgdGhhdCB0aGlzIGlzIGEgdmFsaWQgaW5jbHVkZSBkaXJlY3RpdmUgKi8KKworCQkvKiBQcmludCBldmVyeXRoaW5nIGJlZm9yZSBkaXJlY3RpdmUgKi8KKwkJaWYgKHByZWNlZGluZ19sZW4pIHsKKwkJCWxpbmVbcHJlY2VkaW5nX2xlbl0gPSAnXDAnOworCQkJZnB1dHMobGluZSwgc3Rkb3V0KTsKKwkJfQorCQkvKiBTYXZlIGV2ZXJ5dGhpbmcgYWZ0ZXIgZGlyZWN0aXZlICovCisJCSplbmQrKyA9ICdcMCc7CisJCWVuZCA9IHN0cmNocihlbmQsICc+Jyk7CisJCWlmIChlbmQpCisJCQllbmQgPSBzdHJkdXAoZW5kICsgMSk7CisKKwkJLyogRklYTUU6CisJCSAqICgxKSBhcmUgcmVsYXRpdmUgcGF0aHMgd2l0aCAvLi4vIGV0YyBvaz8KKwkJICogKDIpIHdoYXQgdG8gZG8gd2l0aCBhYnNvbHV0ZSBwYXRocz8KKwkJICogYXJlIHRoZXkgcmVsYXRpdmUgdG8gZG9jIHJvb3Qgb3IgdG8gcmVhbCByb290PworCQkgKi8KKwkJcHJvY2Vzc19pbmNsdWRlcyhpbmNsdWRlX2RpcmVjdGl2ZSk7CisKKwkJLyogUHJpbnQgZXZlcnl0aGluZyBhZnRlciBkaXJlY3RpdmUgKi8KKwkgICAgICAgIGlmIChlbmQpIHsKKwkJCWZwdXRzKGVuZCwgc3Rkb3V0KTsKKwkJCWZyZWUoZW5kKTsKKwkJfQorCX0KKwlpZiAoY3VyZGlyX2ZkID49IDApCisJCWZjaGRpcihjdXJkaXJfZmQpOworCWZjbG9zZShmcCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaWYgKCFhcmd2WzFdKQorCQlyZXR1cm4gMTsKKworCS8qIFNlZW4gZnJvbSBidXN5Ym94Lm5ldCdzIEFwYWNoZToKKwkgKiBIVFRQLzEuMSAyMDAgT0sKKwkgKiBEYXRlOiBUaHUsIDEwIFNlcCAyMDA5IDE4OjIzOjI4IEdNVAorCSAqIFNlcnZlcjogQXBhY2hlCisJICogQWNjZXB0LVJhbmdlczogYnl0ZXMKKwkgKiBDb25uZWN0aW9uOiBjbG9zZQorCSAqIENvbnRlbnQtVHlwZTogdGV4dC9odG1sCisJICovCisJZnB1dHMoCisJCS8qICJEYXRlOiBUaHUsIDEwIFNlcCAyMDA5IDE4OjIzOjI4IEdNVFxyXG4iICovCisJCS8qICJTZXJ2ZXI6IEFwYWNoZVxyXG4iICovCisJCS8qICJBY2NlcHQtUmFuZ2VzOiBieXRlc1xyXG4iIC0gZG8gd2UgcmVhbGx5IGFjY2VwdCBieXRlcz8hICovCisJCSJDb25uZWN0aW9uOiBjbG9zZVxyXG4iCisJCSJDb250ZW50LVR5cGU6IHRleHQvaHRtbFxyXG4iCisJCSJcclxuIiwKKwkJc3Rkb3V0CisJKTsKKwlwcm9jZXNzX2luY2x1ZGVzKGFyZ3ZbMV0pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pZmNvbmZpZy5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pZmNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjA0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2lmY29uZmlnLmMKQEAgLTAsMCArMSw1NTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogaWZjb25maWcKKyAqCisgKiBTaW1pbGFyIHRvIHRoZSBzdGFuZGFyZCBVbml4IGlmY29uZmlnLCBidXQgd2l0aCBvbmx5IHRoZSBuZWNlc3NhcnkKKyAqIHBhcnRzIGZvciBBRl9JTkVULCBhbmQgd2l0aG91dCBhbnkgcHJpbnRpbmcgb2YgaWYgaW5mbyAoZm9yIG5vdykuCisgKgorICogQmpvcm4gV2VzZW4sIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqCisgKgorICogQXV0aG9ycyBvZiB0aGUgb3JpZ2luYWwgaWZjb25maWcgd2FzOgorICogICAgICAgICAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIEhlYXZpbHkgbW9kaWZpZWQgYnkgTWFudWVsIE5vdm9hIElJSSAgICAgICBNYXIgNiwgMjAwMQorICoKKyAqIEZyb20gaW5pdGlhbCBwb3J0IHRvIGJ1c3lib3gsIHJlbW92ZWQgbW9zdCBvZiB0aGUgcmVkdW5kYW5jeSBieQorICogY29udmVydGluZyB0byBhIHRhYmxlLWRyaXZlbiBhcHByb2FjaC4gIEFkZGVkIHNldmVyYWwgKG9wdGlvbmFsKQorICogYXJncyBtaXNzaW5nIGZyb20gaW5pdGlhbCBwb3J0LgorICoKKyAqIFN0aWxsIG1pc3Npbmc6ICBtZWRpYSwgdHVubmVsLgorICoKKyAqIDIwMDItMDQtMjAKKyAqIElQVjYgc3VwcG9ydCBhZGRlZCBieSBCYXJ0IFZpc3NjaGVyIDxtYWdpY2tAbGludXgtZmFuLmNvbT4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaWZjb25maWdfdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMoIlstYV0iKSAiIGludGVyZmFjZSBbYWRkcmVzc10iCisvL3VzYWdlOiNkZWZpbmUgaWZjb25maWdfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb25maWd1cmUgYSBuZXR3b3JrIGludGVyZmFjZVxuIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBWNigKKy8vdXNhZ2U6ICAgICAgICIJW2FkZCBBRERSRVNTWy9QUkVGSVhMRU5dXVxuIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBWNigKKy8vdXNhZ2U6ICAgICAgICIJW2RlbCBBRERSRVNTWy9QUkVGSVhMRU5dXVxuIikKKy8vdXNhZ2U6ICAgICAgICIJW1stXWJyb2FkY2FzdCBbQUREUkVTU11dIFtbLV1wb2ludG9wb2ludCBbQUREUkVTU11dXG4iCisvL3VzYWdlOiAgICAgICAiCVtuZXRtYXNrIEFERFJFU1NdIFtkc3RhZGRyIEFERFJFU1NdXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0lGQ09ORklHX1NMSVAoCisvL3VzYWdlOiAgICAgICAiCVtvdXRmaWxsIE5OXSBba2VlcGFsaXZlIE5OXVxuIikKKy8vdXNhZ2U6ICAgICAgICIJIiBJRl9GRUFUVVJFX0lGQ09ORklHX0hXKCJbaHcgZXRoZXIiIElGX0ZFQVRVUkVfSFdJQigifGluZmluaWJhbmQiKSIgQUREUkVTU10gIikgIlttZXRyaWMgTk5dIFttdHUgTk5dXG4iCisvL3VzYWdlOiAgICAgICAiCVtbLV10cmFpbGVyc10gW1stXWFycF0gW1stXWFsbG11bHRpXVxuIgorLy91c2FnZTogICAgICAgIglbbXVsdGljYXN0XSBbWy1dcHJvbWlzY10gW3R4cXVldWVsZW4gTk5dIFtbLV1keW5hbWljXVxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRKAorLy91c2FnZTogICAgICAgIglbbWVtX3N0YXJ0IE5OXSBbaW9fYWRkciBOTl0gW2lycSBOTl1cbiIpCisvL3VzYWdlOiAgICAgICAiCVt1cHxkb3duXSAuLi4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpZmRlZiBIQVZFX05FVF9FVEhFUk5FVF9ICisjIGluY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19TTElQCisjIGluY2x1ZGUgPG5ldC9pZl9zbGlwLmg+CisjZW5kaWYKKworLyogSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgbmVlZGVkIGZvciBidXN5Ym94IG9yIG5vdC4gIEFueW9uZT8gKi8KKyNkZWZpbmUgUVVFU1RJT05BQkxFX0FMSUFTX0NBU0UKKworCisvKiBEZWZpbmVzIGZvciBnbGliYzIuMCB1c2Vycy4gKi8KKyNpZm5kZWYgU0lPQ1NJRlRYUUxFTgorIyBkZWZpbmUgU0lPQ1NJRlRYUUxFTiAgICAgIDB4ODk0MworIyBkZWZpbmUgU0lPQ0dJRlRYUUxFTiAgICAgIDB4ODk0MgorI2VuZGlmCisKKy8qIGlmcl9xbGVuIGlzIGlmcnVfaXZhbHVlLCBidXQgaXQgaXNuJ3QgcHJlc2VudCBpbiAyLjAga2VybmVsIGhlYWRlcnMgKi8KKyNpZm5kZWYgaWZyX3FsZW4KKyMgZGVmaW5lIGlmcl9xbGVuICAgICAgICBpZnJfaWZydS5pZnJ1X210dQorI2VuZGlmCisKKyNpZm5kZWYgSUZGX0RZTkFNSUMKKyMgZGVmaW5lIElGRl9EWU5BTUlDICAgICAweDgwMDAJLyogZGlhbHVwIGRldmljZSB3aXRoIGNoYW5naW5nIGFkZHJlc3NlcyAqLworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CitzdHJ1Y3QgaW42X2lmcmVxIHsKKwlzdHJ1Y3QgaW42X2FkZHIgaWZyNl9hZGRyOworCXVpbnQzMl90IGlmcjZfcHJlZml4bGVuOworCWludCBpZnI2X2lmaW5kZXg7Cit9OworI2VuZGlmCisKKy8qCisgKiBIZXJlIGFyZSB0aGUgYml0IG1hc2tzIGZvciB0aGUgImZsYWdzIiBtZW1iZXIgb2Ygc3RydWN0IG9wdGlvbnMgYmVsb3cuCisgKiBOXyBzaWduaWZpZXMgbm8gYXJnIHByZWZpeDsgTV8gc2lnbmlmaWVzIGFyZyBwcmVmaXhlZCBieSAnLScuCisgKiBDTFIgY2xlYXJzIHRoZSBmbGFnOyBTRVQgc2V0cyB0aGUgZmxhZzsgQVJHIHNpZ25pZmllcyAob3B0aW9uYWwpIGFyZy4KKyAqLworI2RlZmluZSBOX0NMUiAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTV9DTFIgICAgICAgICAgICAweDAyCisjZGVmaW5lIE5fU0VUICAgICAgICAgICAgMHgwNAorI2RlZmluZSBNX1NFVCAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTl9BUkcgICAgICAgICAgICAweDEwCisjZGVmaW5lIE1fQVJHICAgICAgICAgICAgMHgyMAorCisjZGVmaW5lIE1fTUFTSyAgICAgICAgICAgKE1fQ0xSIHwgTV9TRVQgfCBNX0FSRykKKyNkZWZpbmUgTl9NQVNLICAgICAgICAgICAoTl9DTFIgfCBOX1NFVCB8IE5fQVJHKQorI2RlZmluZSBTRVRfTUFTSyAgICAgICAgIChOX1NFVCB8IE1fU0VUKQorI2RlZmluZSBDTFJfTUFTSyAgICAgICAgIChOX0NMUiB8IE1fQ0xSKQorI2RlZmluZSBTRVRfQ0xSX01BU0sgICAgIChTRVRfTUFTSyB8IENMUl9NQVNLKQorI2RlZmluZSBBUkdfTUFTSyAgICAgICAgIChNX0FSRyB8IE5fQVJHKQorCisvKgorICogSGVyZSBhcmUgdGhlIGJpdCBtYXNrcyBmb3IgdGhlICJhcmdfZmxhZ3MiIG1lbWJlciBvZiBzdHJ1Y3Qgb3B0aW9ucyBiZWxvdy4KKyAqLworCisvKgorICogY2FzdCB0eXBlOgorICogICAwMCBpbnQKKyAqICAgMDEgY2hhciAqCisgKiAgIDAyIEhPU1RfQ09QWSBpbl9ldGhlcgorICogICAwMyBIT1NUX0NPUFkgSU5FVF9yZXNvbHZlCisgKi8KKyNkZWZpbmUgQV9DQVNUX1RZUEUgICAgICAweDAzCisvKgorICogbWFwIHR5cGU6CisgKiAgIDAwIG5vdCBhIG1hcCB0eXBlIChtZW1fc3RhcnQsIGlvX2FkZHIsIGlycSkKKyAqICAgMDQgbWVtc3RhcnQgKHVuc2lnbmVkIGxvbmcpCisgKiAgIDA4IGlvX2FkZHIgICh1bnNpZ25lZCBzaG9ydCkKKyAqICAgMEMgaXJxICAgICAgKHVuc2lnbmVkIGNoYXIpCisgKi8KKyNkZWZpbmUgQV9NQVBfVFlQRSAgICAgICAweDBDCisjZGVmaW5lIEFfQVJHX1JFUSAgICAgICAgMHgxMAkvKiBTZXQgaWYgYW4gYXJnIGlzIHJlcXVpcmVkLiAqLworI2RlZmluZSBBX05FVE1BU0sgICAgICAgIDB4MjAJLyogU2V0IGlmIG5ldG1hc2sgKGNoZWNrIGZvciBtdWx0aXBsZSBzZXRzKS4gKi8KKyNkZWZpbmUgQV9TRVRfQUZURVIgICAgICAweDQwCS8qIFNldCBhIGZsYWcgYXQgdGhlIGVuZC4gKi8KKyNkZWZpbmUgQV9DT0xPTl9DSEsgICAgICAweDgwCS8qIElzIHRoaXMgbmVlZGVkPyAgU2VlIGJlbG93LiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTCisjZGVmaW5lIEFfSE9TVE5BTUUgICAgICAweDEwMAkvKiBTZXQgaWYgaXQgaXMgaXAgYWRkci4gKi8KKyNkZWZpbmUgQV9CUk9BRENBU1QgICAgIDB4MjAwCS8qIFNldCBpZiBpdCBpcyBicm9hZGNhc3QgYWRkci4gKi8KKyNlbHNlCisjZGVmaW5lIEFfSE9TVE5BTUUgICAgICAgICAgMAorI2RlZmluZSBBX0JST0FEQ0FTVCAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICogVGhlc2UgZGVmaW5lcyBhcmUgZm9yIGRlYWxpbmcgd2l0aCB0aGUgQV9DQVNUX1RZUEUgZmllbGQuCisgKi8KKyNkZWZpbmUgQV9DQVNUX0NIQVJfUFRSICAweDAxCisjZGVmaW5lIEFfQ0FTVF9SRVNPTFZFICAgMHgwMQorI2RlZmluZSBBX0NBU1RfSE9TVF9DT1BZIDB4MDIKKyNkZWZpbmUgQV9DQVNUX0hPU1RfQ09QWV9JTl9FVEhFUiAgICBBX0NBU1RfSE9TVF9DT1BZCisjZGVmaW5lIEFfQ0FTVF9IT1NUX0NPUFlfUkVTT0xWRSAgICAgKEFfQ0FTVF9IT1NUX0NPUFkgfCBBX0NBU1RfUkVTT0xWRSkKKworLyoKKyAqIFRoZXNlIGRlZmluZXMgYXJlIGZvciBkZWFsaW5nIHdpdGggdGhlIEFfTUFQX1RZUEUgZmllbGQuCisgKi8KKyNkZWZpbmUgQV9NQVBfVUxPTkcgICAgICAweDA0CS8qIG1lbXN0YXJ0ICovCisjZGVmaW5lIEFfTUFQX1VTSE9SVCAgICAgMHgwOAkvKiBpb19hZGRyICovCisjZGVmaW5lIEFfTUFQX1VDSEFSICAgICAgMHgwQwkvKiBpcnEgKi8KKworLyoKKyAqIERlZmluZSB0aGUgYml0IG1hc2tzIHNpZ25pZnlpbmcgd2hpY2ggb3BlcmF0aW9ucyB0byBwZXJmb3JtIGZvciBlYWNoIGFyZy4KKyAqLworCisjZGVmaW5lIEFSR19NRVRSSUMgICAgICAgKEFfQVJHX1JFUSAvKnwgQV9DQVNUX0lOVCovKQorI2RlZmluZSBBUkdfTVRVICAgICAgICAgIChBX0FSR19SRVEgLyp8IEFfQ0FTVF9JTlQqLykKKyNkZWZpbmUgQVJHX1RYUVVFVUVMRU4gICAoQV9BUkdfUkVRIC8qfCBBX0NBU1RfSU5UKi8pCisjZGVmaW5lIEFSR19NRU1fU1RBUlQgICAgKEFfQVJHX1JFUSB8IEFfTUFQX1VMT05HKQorI2RlZmluZSBBUkdfSU9fQUREUiAgICAgIChBX0FSR19SRVEgfCBBX01BUF9VTE9ORykKKyNkZWZpbmUgQVJHX0lSUSAgICAgICAgICAoQV9BUkdfUkVRIHwgQV9NQVBfVUNIQVIpCisjZGVmaW5lIEFSR19EU1RBRERSICAgICAgKEFfQVJHX1JFUSB8IEFfQ0FTVF9IT1NUX0NPUFlfUkVTT0xWRSkKKyNkZWZpbmUgQVJHX05FVE1BU0sgICAgICAoQV9BUkdfUkVRIHwgQV9DQVNUX0hPU1RfQ09QWV9SRVNPTFZFIHwgQV9ORVRNQVNLKQorI2RlZmluZSBBUkdfQlJPQURDQVNUICAgIChBX0FSR19SRVEgfCBBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUgfCBBX1NFVF9BRlRFUiB8IEFfQlJPQURDQVNUKQorI2RlZmluZSBBUkdfSFcgICAgICAgICAgIChBX0FSR19SRVEgfCBBX0NBU1RfSE9TVF9DT1BZX0lOX0VUSEVSKQorI2RlZmluZSBBUkdfUE9JTlRPUE9JTlQgIChBX0FSR19SRVEgfCBBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUgfCBBX1NFVF9BRlRFUikKKyNkZWZpbmUgQVJHX0tFRVBBTElWRSAgICAoQV9BUkdfUkVRIHwgQV9DQVNUX0NIQVJfUFRSKQorI2RlZmluZSBBUkdfT1VURklMTCAgICAgIChBX0FSR19SRVEgfCBBX0NBU1RfQ0hBUl9QVFIpCisjZGVmaW5lIEFSR19IT1NUTkFNRSAgICAgKEFfQ0FTVF9IT1NUX0NPUFlfUkVTT0xWRSB8IEFfU0VUX0FGVEVSIHwgQV9DT0xPTl9DSEsgfCBBX0hPU1ROQU1FKQorI2RlZmluZSBBUkdfQUREX0RFTCAgICAgIChBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUgfCBBX1NFVF9BRlRFUikKKworCisvKgorICogU2V0IHVwIHRoZSB0YWJsZXMuICBXYXJuaW5nISAgVGhleSBtdXN0IGhhdmUgY29ycmVzcG9uZGluZyBvcmRlciEKKyAqLworCitzdHJ1Y3QgYXJnMW9wdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBzaG9ydCBzZWxlY3RvcjsKKwl1bnNpZ25lZCBzaG9ydCBpZnJfb2Zmc2V0OworfTsKKworc3RydWN0IG9wdGlvbnMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwljb25zdCB1bnNpZ25lZCBpbnQgZmxhZ3M6NjsKKwljb25zdCB1bnNpZ25lZCBpbnQgYXJnX2ZsYWdzOjEwOworI2Vsc2UKKwljb25zdCB1bnNpZ25lZCBjaGFyIGZsYWdzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgYXJnX2ZsYWdzOworI2VuZGlmCisJY29uc3QgdW5zaWduZWQgc2hvcnQgc2VsZWN0b3I7Cit9OworCisjZGVmaW5lIGlmcmVxX29mZnNldG9mKHgpICBvZmZzZXRvZihzdHJ1Y3QgaWZyZXEsIHgpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJnMW9wdCBBcmcxT3B0W10gPSB7CisJeyAiU0lGTUVUUklDIiwgIFNJT0NTSUZNRVRSSUMsICBpZnJlcV9vZmZzZXRvZihpZnJfbWV0cmljKSB9LAorCXsgIlNJRk1UVSIsICAgICBTSU9DU0lGTVRVLCAgICAgaWZyZXFfb2Zmc2V0b2YoaWZyX210dSkgfSwKKwl7ICJTSUZUWFFMRU4iLCAgU0lPQ1NJRlRYUUxFTiwgIGlmcmVxX29mZnNldG9mKGlmcl9xbGVuKSB9LAorCXsgIlNJRkRTVEFERFIiLCBTSU9DU0lGRFNUQUREUiwgaWZyZXFfb2Zmc2V0b2YoaWZyX2RzdGFkZHIpIH0sCisJeyAiU0lGTkVUTUFTSyIsIFNJT0NTSUZORVRNQVNLLCBpZnJlcV9vZmZzZXRvZihpZnJfbmV0bWFzaykgfSwKKwl7ICJTSUZCUkRBRERSIiwgU0lPQ1NJRkJSREFERFIsIGlmcmVxX29mZnNldG9mKGlmcl9icm9hZGFkZHIpIH0sCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfSFcKKwl7ICJTSUZIV0FERFIiLCAgU0lPQ1NJRkhXQUREUiwgIGlmcmVxX29mZnNldG9mKGlmcl9od2FkZHIpIH0sCisjZW5kaWYKKwl7ICJTSUZEU1RBRERSIiwgU0lPQ1NJRkRTVEFERFIsIGlmcmVxX29mZnNldG9mKGlmcl9kc3RhZGRyKSB9LAorI2lmZGVmIFNJT0NTS0VFUEFMSVZFCisJeyAiU0tFRVBBTElWRSIsIFNJT0NTS0VFUEFMSVZFLCBpZnJlcV9vZmZzZXRvZihpZnJfZGF0YSkgfSwKKyNlbmRpZgorI2lmZGVmIFNJT0NTT1VURklMTAorCXsgIlNPVVRGSUxMIiwgICBTSU9DU09VVEZJTEwsICAgaWZyZXFfb2Zmc2V0b2YoaWZyX2RhdGEpIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRCisJeyAiU0lGTUFQIiwgICAgIFNJT0NTSUZNQVAsICAgICBpZnJlcV9vZmZzZXRvZihpZnJfbWFwLm1lbV9zdGFydCkgfSwKKwl7ICJTSUZNQVAiLCAgICAgU0lPQ1NJRk1BUCwgICAgIGlmcmVxX29mZnNldG9mKGlmcl9tYXAuYmFzZV9hZGRyKSB9LAorCXsgIlNJRk1BUCIsICAgICBTSU9DU0lGTUFQLCAgICAgaWZyZXFfb2Zmc2V0b2YoaWZyX21hcC5pcnEpIH0sCisjZW5kaWYKKwkvKiBMYXN0IGVudHJ5IGlmIGZvciB1bm1hdGNoZWQgKHBvc3NpYmx5IGhvc3RuYW1lKSBhcmcuICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCXsgIlNJRkFERFIiLCAgICBTSU9DU0lGQUREUiwgICAgaWZyZXFfb2Zmc2V0b2YoaWZyX2FkZHIpIH0sIC8qIElQdjYgdmVyc2lvbiBpZ25vcmVzIHRoZSBvZmZzZXQgKi8KKwl7ICJESUZBRERSIiwgICAgU0lPQ0RJRkFERFIsICAgIGlmcmVxX29mZnNldG9mKGlmcl9hZGRyKSB9LCAvKiBJUHY2IHZlcnNpb24gaWdub3JlcyB0aGUgb2Zmc2V0ICovCisjZW5kaWYKKwl7ICJTSUZBRERSIiwgICAgU0lPQ1NJRkFERFIsICAgIGlmcmVxX29mZnNldG9mKGlmcl9hZGRyKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb25zIE9wdEFycmF5W10gPSB7CisJeyAibWV0cmljIiwgICAgICBOX0FSRywgICAgICAgICBBUkdfTUVUUklDLCAgICAgIDAgfSwKKwl7ICJtdHUiLCAgICAgICAgIE5fQVJHLCAgICAgICAgIEFSR19NVFUsICAgICAgICAgMCB9LAorCXsgInR4cXVldWVsZW4iLCAgTl9BUkcsICAgICAgICAgQVJHX1RYUVVFVUVMRU4sICAwIH0sCisJeyAiZHN0YWRkciIsICAgICBOX0FSRywgICAgICAgICBBUkdfRFNUQUREUiwgICAgIDAgfSwKKwl7ICJuZXRtYXNrIiwgICAgIE5fQVJHLCAgICAgICAgIEFSR19ORVRNQVNLLCAgICAgMCB9LAorCXsgImJyb2FkY2FzdCIsICAgTl9BUkcgfCBNX0NMUiwgQVJHX0JST0FEQ0FTVCwgICBJRkZfQlJPQURDQVNUIH0sCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfSFcKKwl7ICJodyIsICAgICAgICAgIE5fQVJHLCAgICAgICAgIEFSR19IVywgICAgICAgICAgMCB9LAorI2VuZGlmCisJeyAicG9pbnRvcG9pbnQiLCBOX0FSRyB8IE1fQ0xSLCBBUkdfUE9JTlRPUE9JTlQsIElGRl9QT0lOVE9QT0lOVCB9LAorI2lmZGVmIFNJT0NTS0VFUEFMSVZFCisJeyAia2VlcGFsaXZlIiwgICBOX0FSRywgICAgICAgICBBUkdfS0VFUEFMSVZFLCAgIDAgfSwKKyNlbmRpZgorI2lmZGVmIFNJT0NTT1VURklMTAorCXsgIm91dGZpbGwiLCAgICAgTl9BUkcsICAgICAgICAgQVJHX09VVEZJTEwsICAgICAwIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRCisJeyAibWVtX3N0YXJ0IiwgICBOX0FSRywgICAgICAgICBBUkdfTUVNX1NUQVJULCAgIDAgfSwKKwl7ICJpb19hZGRyIiwgICAgIE5fQVJHLCAgICAgICAgIEFSR19JT19BRERSLCAgICAgMCB9LAorCXsgImlycSIsICAgICAgICAgTl9BUkcsICAgICAgICAgQVJHX0lSUSwgICAgICAgICAwIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJeyAiYWRkIiwgICAgICAgICBOX0FSRywgICAgICAgICBBUkdfQUREX0RFTCwgICAgIDAgfSwKKwl7ICJkZWwiLCAgICAgICAgIE5fQVJHLCAgICAgICAgIEFSR19BRERfREVMLCAgICAgMCB9LAorI2VuZGlmCisJeyAiYXJwIiwgICAgICAgICBOX0NMUiB8IE1fU0VULCAwLCAgICAgICAgICAgICAgIElGRl9OT0FSUCB9LAorCXsgInRyYWlsZXJzIiwgICAgTl9DTFIgfCBNX1NFVCwgMCwgICAgICAgICAgICAgICBJRkZfTk9UUkFJTEVSUyB9LAorCXsgInByb21pc2MiLCAgICAgTl9TRVQgfCBNX0NMUiwgMCwgICAgICAgICAgICAgICBJRkZfUFJPTUlTQyB9LAorCXsgIm11bHRpY2FzdCIsICAgTl9TRVQgfCBNX0NMUiwgMCwgICAgICAgICAgICAgICBJRkZfTVVMVElDQVNUIH0sCisJeyAiYWxsbXVsdGkiLCAgICBOX1NFVCB8IE1fQ0xSLCAwLCAgICAgICAgICAgICAgIElGRl9BTExNVUxUSSB9LAorCXsgImR5bmFtaWMiLCAgICAgTl9TRVQgfCBNX0NMUiwgMCwgICAgICAgICAgICAgICBJRkZfRFlOQU1JQyB9LAorCXsgInVwIiwgICAgICAgICAgTl9TRVQsICAgICAgICAgMCwgICAgICAgICAgICAgICAoSUZGX1VQIHwgSUZGX1JVTk5JTkcpIH0sCisJeyAiZG93biIsICAgICAgICBOX0NMUiwgICAgICAgICAwLCAgICAgICAgICAgICAgIElGRl9VUCB9LAorCXsgTlVMTCwgICAgICAgICAgMCwgICAgICAgICAgICAgQVJHX0hPU1ROQU1FLCAgICAoSUZGX1VQIHwgSUZGX1JVTk5JTkcpIH0KK307CisKKy8qCisgKiBBIGNvdXBsZSBvZiBwcm90b3R5cGVzLgorICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfSFcKK3N0YXRpYyBpbnQgaW5fZXRoZXIoY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApOworI2VuZGlmCisKKy8qCisgKiBPdXIgbWFpbiBmdW5jdGlvbi4KKyAqLworaW50IGlmY29uZmlnX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpZmNvbmZpZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FpOworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisJc3RydWN0IHNvY2thZGRyIHNhOworI2VuZGlmCisJY29uc3Qgc3RydWN0IGFyZzFvcHQgKmExb3A7CisJY29uc3Qgc3RydWN0IG9wdGlvbnMgKm9wOworCWludCBzb2NrZmQ7CQkJLyogc29ja2V0IGZkIHdlIHVzZSB0byBtYW5pcHVsYXRlIHN0dWZmIHdpdGggKi8KKwlpbnQgc2VsZWN0b3I7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwl1bnNpZ25lZCBpbnQgZGlkX2ZsYWdzOworCXVuc2lnbmVkIGludCBzYWlfaG9zdG5hbWUsIHNhaV9uZXRtYXNrOworI2Vsc2UKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CisJdW5zaWduZWQgY2hhciBkaWRfZmxhZ3M7CisjZW5kaWYKKwljaGFyICpwOworCS8qY2hhciBob3N0WzEyOF07Ki8KKwljb25zdCBjaGFyICpob3N0ID0gTlVMTDsgLyogbWFrZSBnY2MgaGFwcHkgKi8KKworCWRpZF9mbGFncyA9IDA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwlzYWlfaG9zdG5hbWUgPSAwOworCXNhaV9uZXRtYXNrID0gMDsKKyNlbmRpZgorCisJLyogc2tpcCBhcmd2WzBdICovCisJKythcmd2OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTCisJaWYgKGFyZ3ZbMF0gJiYgKGFyZ3ZbMF1bMF0gPT0gJy0nICYmIGFyZ3ZbMF1bMV0gPT0gJ2EnICYmICFhcmd2WzBdWzJdKSkgeworCQlpbnRlcmZhY2Vfb3B0X2EgPSAxOworCQkrK2FyZ3Y7CisJfQorI2VuZGlmCisKKwlpZiAoIWFyZ3ZbMF0gfHwgIWFyZ3ZbMV0pIHsgLyogb25lIG9yIG5vIGFyZ3MgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMKKwkJcmV0dXJuIGRpc3BsYXlfaW50ZXJmYWNlcyhhcmd2WzBdIC8qIGNhbiBiZSBOVUxMICovKTsKKyNlbHNlCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBzdXBwb3J0IGZvciBzdGF0dXMgZGlzcGxheSIpOworI2VuZGlmCisJfQorCisJLyogQ3JlYXRlIGEgY2hhbm5lbCB0byB0aGUgTkVUIGtlcm5lbC4gKi8KKwlzb2NrZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisJLyogZ2V0IGludGVyZmFjZSBuYW1lICovCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsICphcmd2KTsKKworCS8qIFByb2Nlc3MgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuICovCisJd2hpbGUgKCorK2FyZ3YgIT0gKGNoYXIgKikgTlVMTCkgeworCQlwID0gKmFyZ3Y7CisJCW1hc2sgPSBOX01BU0s7CisJCWlmICgqcCA9PSAnLScpIHsJLyogSWYgdGhlIGFyZyBzdGFydHMgd2l0aCAnLScuLi4gKi8KKwkJCSsrcDsJCS8qICAgIGFkdmFuY2UgcGFzdCBpdCBhbmQgKi8KKwkJCW1hc2sgPSBNX01BU0s7CS8qICAgIHNldCB0aGUgYXBwcm9wcmlhdGUgbWFzay4gKi8KKwkJfQorCQlmb3IgKG9wID0gT3B0QXJyYXk7IG9wLT5uYW1lOyBvcCsrKSB7CS8qIEZpbmQgdGFibGUgZW50cnkuICovCisJCQlpZiAoc3RyY21wKHAsIG9wLT5uYW1lKSA9PSAwKSB7CS8qIElmIG5hbWUgbWF0Y2hlcy4uLiAqLworCQkJCW1hc2sgJj0gb3AtPmZsYWdzOworCQkJCWlmIChtYXNrKQkvKiBzZXQgdGhlIG1hc2sgYW5kIGdvLiAqLworCQkJCQlnb3RvIEZPVU5EX0FSRzsKKwkJCQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlcmUgd2FzIGEgdmFsaWQgYXJnIHdpdGggYW4gKi8KKwkJCQkvKiBpbnZhbGlkICctJyBwcmVmaXguICovCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZDogJyVzJyIsIHAtMSk7CisJCQl9CisJCX0KKworCQkvKiBXZSBmZWxsIHRocm91Z2gsIHNvIHRyZWF0IGFzIHBvc3NpYmxlIGhvc3RuYW1lLiAqLworCQlhMW9wID0gQXJnMU9wdCArIEFSUkFZX1NJWkUoQXJnMU9wdCkgLSAxOworCQltYXNrID0gb3AtPmFyZ19mbGFnczsKKwkJZ290byBIT1NUTkFNRTsKKworIEZPVU5EX0FSRzoKKwkJaWYgKG1hc2sgJiBBUkdfTUFTSykgeworCQkJbWFzayA9IG9wLT5hcmdfZmxhZ3M7CisJCQlhMW9wID0gQXJnMU9wdCArIChvcCAtIE9wdEFycmF5KTsKKwkJCWlmIChtYXNrICYgQV9ORVRNQVNLICYgZGlkX2ZsYWdzKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWlmICgqKythcmd2ID09IE5VTEwpIHsKKwkJCQlpZiAobWFzayAmIEFfQVJHX1JFUSkKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCS0tYXJndjsKKwkJCQltYXNrICY9IEFfU0VUX0FGVEVSOwkvKiBqdXN0IGZvciBicm9hZGNhc3QgKi8KKwkJCX0gZWxzZSB7CS8qIGdvdCBhbiBhcmcgc28gcHJvY2VzcyBpdCAqLworIEhPU1ROQU1FOgorCQkJCWRpZF9mbGFncyB8PSAobWFzayAmIChBX05FVE1BU0t8QV9IT1NUTkFNRSkpOworCQkJCWlmIChtYXNrICYgQV9DQVNUX0hPU1RfQ09QWSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisJCQkJCWlmIChtYXNrICYgQV9DQVNUX1JFU09MVkUpIHsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJCQkJCWNoYXIgKnByZWZpeDsKKwkJCQkJCWludCBwcmVmaXhfbGVuID0gMDsKKyNlbmRpZgorCQkJCQkJLypzYWZlX3N0cm5jcHkoaG9zdCwgKmFyZ3YsIChzaXplb2YgaG9zdCkpOyovCisJCQkJCQlob3N0ID0gKmFyZ3Y7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQkJCQkJcHJlZml4ID0gc3RyY2hyKGhvc3QsICcvJyk7CisJCQkJCQlpZiAocHJlZml4KSB7CisJCQkJCQkJcHJlZml4X2xlbiA9IHhhdG91X3JhbmdlKHByZWZpeCArIDEsIDAsIDEyOCk7CisJCQkJCQkJKnByZWZpeCA9ICdcMCc7CisJCQkJCQl9CisjZW5kaWYKKwkJCQkJCXNhaS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCQkJCXNhaS5zaW5fcG9ydCA9IDA7CisJCQkJCQlpZiAoc3RyY21wKGhvc3QsICJkZWZhdWx0IikgPT0gMCkgeworCQkJCQkJCS8qIERlZmF1bHQgaXMgc3BlY2lhbCwgbWVhbmluZyAwLjAuMC4wLiAqLworCQkJCQkJCXNhaS5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCQkJCQkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTCisJCQkJCQllbHNlIGlmICgoaG9zdFswXSA9PSAnKycgJiYgIWhvc3RbMV0pICYmIChtYXNrICYgQV9CUk9BRENBU1QpCisJCQkJCQkgJiYgKGRpZF9mbGFncyAmIChBX05FVE1BU0t8QV9IT1NUTkFNRSkpID09IChBX05FVE1BU0t8QV9IT1NUTkFNRSkKKwkJCQkJCSkgeworCQkJCQkJCS8qICsgaXMgc3BlY2lhbCwgbWVhbmluZyBicm9hZGNhc3QgaXMgZGVyaXZlZC4gKi8KKwkJCQkJCQlzYWkuc2luX2FkZHIuc19hZGRyID0gKH5zYWlfbmV0bWFzaykgfCAoc2FpX2hvc3RuYW1lICYgc2FpX25ldG1hc2spOworCQkJCQkJfQorI2VuZGlmCisJCQkJCQllbHNlIHsKKwkJCQkJCQlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJCQkJCQkJaWYgKHN0cmNtcChob3N0LCAiaW5ldCIpID09IDApCisJCQkJCQkJCWNvbnRpbnVlOyAvKiBjb21wYXQgc3R1ZmYgKi8KKwkJCQkJCQlsc2EgPSB4aG9zdDJzb2NrYWRkcihob3N0LCAwKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCQkJCQkJaWYgKGxzYS0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJCQkJCQkJaW50IHNvY2tmZDY7CisJCQkJCQkJCXN0cnVjdCBpbjZfaWZyZXEgaWZyNjsKKworCQkJCQkJCQltZW1jcHkoKGNoYXIgKikgJmlmcjYuaWZyNl9hZGRyLAorCQkJCQkJCQkJCShjaGFyICopICYobHNhLT51LnNpbjYuc2luNl9hZGRyKSwKKwkJCQkJCQkJCQlzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisKKwkJCQkJCQkJLyogQ3JlYXRlIGEgY2hhbm5lbCB0byB0aGUgTkVUIGtlcm5lbC4gKi8KKwkJCQkJCQkJc29ja2ZkNiA9IHhzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworCQkJCQkJCQl4aW9jdGwoc29ja2ZkNiwgU0lPR0lGSU5ERVgsICZpZnIpOworCQkJCQkJCQlpZnI2LmlmcjZfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKwkJCQkJCQkJaWZyNi5pZnI2X3ByZWZpeGxlbiA9IHByZWZpeF9sZW47CisJCQkJCQkJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKHNvY2tmZDYsIGExb3AtPnNlbGVjdG9yLCAmaWZyNiwgIlNJT0MlcyIsIGExb3AtPm5hbWUpOworCQkJCQkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJCQkJCQlmcmVlKGxzYSk7CisJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKyNlbmRpZgorCQkJCQkJCXNhaS5zaW5fYWRkciA9IGxzYS0+dS5zaW4uc2luX2FkZHI7CisJCQkJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCQkJCQlmcmVlKGxzYSk7CisJCQkJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwkJCQkJCWlmIChtYXNrICYgQV9IT1NUTkFNRSkKKwkJCQkJCQlzYWlfaG9zdG5hbWUgPSBzYWkuc2luX2FkZHIuc19hZGRyOworCQkJCQkJaWYgKG1hc2sgJiBBX05FVE1BU0spCisJCQkJCQkJc2FpX25ldG1hc2sgPSBzYWkuc2luX2FkZHIuc19hZGRyOworI2VuZGlmCisJCQkJCQlwID0gKGNoYXIgKikgJnNhaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19IVworCQkJCQl9IGVsc2UgewkvKiBBX0NBU1RfSE9TVF9DT1BZX0lOX0VUSEVSICovCisJCQkJCQkvKiBUaGlzIGlzIHRoZSAiaHciIGFyZyBjYXNlLiAqLworCQkJCQkJc21hbGx1aW50IGh3X2NsYXNzPSBpbmRleF9pbl9zdWJzdHJpbmdzKCJldGhlclwwIgorCQkJCQkJCQlJRl9GRUFUVVJFX0hXSUIoImluZmluaWJhbmRcMCIpLCAqYXJndikgKyAxOworCQkJCQkJaWYgKCFod19jbGFzcyB8fCAhKisrYXJndikKKwkJCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJCQkvKnNhZmVfc3RybmNweShob3N0LCAqYXJndiwgc2l6ZW9mKGhvc3QpKTsqLworCQkJCQkJaG9zdCA9ICphcmd2OworCQkJCQkJaWYgKGh3X2NsYXNzID09IDEgPyBpbl9ldGhlcihob3N0LCAmc2EpIDogaW5faWIoaG9zdCwgJnNhKSkKKwkJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBody1hZGRyICVzIiwgaG9zdCk7CisJCQkJCQlwID0gKGNoYXIgKikgJnNhOworCQkJCQl9CisjZW5kaWYKKwkJCQkJbWVtY3B5KCAoKChjaGFyICopJmlmcikgKyBhMW9wLT5pZnJfb2Zmc2V0KSwKKwkJCQkJCSAgIHAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBGSVhNRTogZXJyb3IgY2hlY2s/PyAqLworCQkJCQl1bnNpZ25lZCBsb25nIGkgPSBzdHJ0b3VsKCphcmd2LCBOVUxMLCAwKTsKKwkJCQkJcCA9ICgoY2hhciAqKSZpZnIpICsgYTFvcC0+aWZyX29mZnNldDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRCisJCQkJCWlmIChtYXNrICYgQV9NQVBfVFlQRSkgeworCQkJCQkJeGlvY3RsKHNvY2tmZCwgU0lPQ0dJRk1BUCwgJmlmcik7CisJCQkJCQlpZiAoKG1hc2sgJiBBX01BUF9VQ0hBUikgPT0gQV9NQVBfVUNIQVIpCisJCQkJCQkJKigodW5zaWduZWQgY2hhciAqKSBwKSA9IGk7CisJCQkJCQllbHNlIGlmIChtYXNrICYgQV9NQVBfVVNIT1JUKQorCQkJCQkJCSooKHVuc2lnbmVkIHNob3J0ICopIHApID0gaTsKKwkJCQkJCWVsc2UKKwkJCQkJCQkqKCh1bnNpZ25lZCBsb25nICopIHApID0gaTsKKwkJCQkJfSBlbHNlCisjZW5kaWYKKwkJCQkJaWYgKG1hc2sgJiBBX0NBU1RfQ0hBUl9QVFIpCisJCQkJCQkqKChjYWRkcl90ICopIHApID0gKGNhZGRyX3QpIGk7CisJCQkJCWVsc2UJLyogQV9DQVNUX0lOVCAqLworCQkJCQkJKigoaW50ICopIHApID0gaTsKKwkJCQl9CisKKwkJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShzb2NrZmQsIGExb3AtPnNlbGVjdG9yLCAmaWZyLCAiU0lPQyVzIiwgYTFvcC0+bmFtZSk7CisjaWZkZWYgUVVFU1RJT05BQkxFX0FMSUFTX0NBU0UKKwkJCQlpZiAobWFzayAmIEFfQ09MT05fQ0hLKSB7CisJCQkJCS8qCisJCQkJCSAqIERvbid0IGRvIHRoZSBzZXRfZmxhZygpIGlmIHRoZSBhZGRyZXNzIGlzIGFuIGFsaWFzIHdpdGgKKwkJCQkJICogYSAnLScgYXQgdGhlIGVuZCwgc2luY2UgaXQncyBkZWxldGVkIGFscmVhZHkhIC0gUm9tYW4KKwkJCQkJICoKKwkJCQkJICogU2hvdWxkIHJlYWxseSB1c2UgcmVnZXguaCBoZXJlLCBub3Qgc3VyZSB0aG91Z2ggaG93IHdlbGwKKwkJCQkJICogaXQnbGwgZ28gd2l0aCB0aGUgY3Jvc3MtcGxhdGZvcm0gc3VwcG9ydCBldGMuCisJCQkJCSAqLworCQkJCQljaGFyICpwdHI7CisJCQkJCXNob3J0IGludCBmb3VuZF9jb2xvbiA9IDA7CisJCQkJCWZvciAocHRyID0gaWZyLmlmcl9uYW1lOyAqcHRyOyBwdHIrKykKKwkJCQkJCWlmICgqcHRyID09ICc6JykKKwkJCQkJCQlmb3VuZF9jb2xvbisrOworCQkJCQlpZiAoZm91bmRfY29sb24gJiYgcHRyWy0xXSA9PSAnLScpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCX0KKwkJCWlmICghKG1hc2sgJiBBX1NFVF9BRlRFUikpCisJCQkJY29udGludWU7CisJCQltYXNrID0gTl9TRVQ7CisJCX0KKworCQl4aW9jdGwoc29ja2ZkLCBTSU9DR0lGRkxBR1MsICZpZnIpOworCQlzZWxlY3RvciA9IG9wLT5zZWxlY3RvcjsKKwkJaWYgKG1hc2sgJiBTRVRfTUFTSykKKwkJCWlmci5pZnJfZmxhZ3MgfD0gc2VsZWN0b3I7CisJCWVsc2UKKwkJCWlmci5pZnJfZmxhZ3MgJj0gfnNlbGVjdG9yOworCQl4aW9jdGwoc29ja2ZkLCBTSU9DU0lGRkxBR1MsICZpZnIpOworCX0gLyogd2hpbGUgKCkgKi8KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2Uoc29ja2ZkKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisvKiBJbnB1dCBhbiBFdGhlcm5ldCBhZGRyZXNzIGFuZCBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KK3N0YXRpYyBpbnQgaW5fZXRoZXIoY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJY2hhciAqcHRyOworCWludCBpLCBqOworCXVuc2lnbmVkIGNoYXIgdmFsOworCXVuc2lnbmVkIGNoYXIgYzsKKworCXNhcC0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXB0ciA9IChjaGFyICopIHNhcC0+c2FfZGF0YTsKKworCWkgPSAwOworCWRvIHsKKwkJaiA9IHZhbCA9IDA7CisKKwkJLyogV2UgbWlnaHQgZ2V0IGEgc2VtaWNvbG9uIGhlcmUgLSBub3QgcmVxdWlyZWQuICovCisJCWlmIChpICYmICgqYnVmcCA9PSAnOicpKSB7CisJCQlidWZwKys7CisJCX0KKworCQlkbyB7CisJCQljID0gKmJ1ZnA7CisJCQlpZiAoKCh1bnNpZ25lZCBjaGFyKShjIC0gJzAnKSkgPD0gOSkgeworCQkJCWMgLT0gJzAnOworCQkJfSBlbHNlIGlmICgoKHVuc2lnbmVkIGNoYXIpKChjfDB4MjApIC0gJ2EnKSkgPD0gNSkgeworCQkJCWMgPSAoY3wweDIwKSAtICgnYSctMTApOworCQkJfSBlbHNlIGlmIChqICYmIChjID09ICc6JyB8fCBjID09IDApKSB7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCSsrYnVmcDsKKwkJCXZhbCA8PD0gNDsKKwkJCXZhbCArPSBjOworCQl9IHdoaWxlICgrK2ogPCAyKTsKKwkJKnB0cisrID0gdmFsOworCX0gd2hpbGUgKCsraSA8IEVUSF9BTEVOKTsKKworCXJldHVybiAqYnVmcDsgLyogRXJyb3IgaWYgd2UgZG9uJ3QgZW5kIGF0IGVuZCBvZiBzdHJpbmcuICovCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaWZlbnNsYXZlLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2lmZW5zbGF2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzcxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2lmZW5zbGF2ZS5jCkBAIC0wLDAgKzEsNjE3IEBACisvKiBNb2RlOiBDOworICoKKyAqIE1pbmkgaWZlbnNsYXZlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGJhcmNvLmNvbT4KKyAqCisgKiBpZmVuc2xhdmUuYzogQ29uZmlndXJlIG5ldHdvcmsgaW50ZXJmYWNlcyBmb3IgcGFyYWxsZWwgcm91dGluZy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBjb250cm9scyB0aGUgTGludXggaW1wbGVtZW50YXRpb24gb2YgcnVubmluZyBtdWx0aXBsZQorICogICAgICBuZXR3b3JrIGludGVyZmFjZXMgaW4gcGFyYWxsZWwuCisgKgorICogQXV0aG9yOiAgICAgIERvbmFsZCBCZWNrZXIgPGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdj4KKyAqICAgICAgICAgICAgICBDb3B5cmlnaHQgMTk5NC0xOTk2IERvbmFsZCBCZWNrZXIKKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CisgKiAgICAgICAgICAgICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgICAgICAgICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogICAgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBDRVNESVMuZ3NmYy5uYXNhLmdvdiwgb3IgQy9PCisgKiAgICAgIENlbnRlciBvZiBFeGNlbGxlbmNlIGluIFNwYWNlIERhdGEgYW5kIEluZm9ybWF0aW9uIFNjaWVuY2VzCisgKiAgICAgICAgIENvZGUgOTMwLjUsIEdvZGRhcmQgU3BhY2UgRmxpZ2h0IENlbnRlciwgR3JlZW5iZWx0IE1EIDIwNzcxCisgKgorICogIENoYW5nZXMgOgorICogICAgLSAyMDAwLzEwLzAyIFdpbGx5IFRhcnJlYXUgPHdpbGx5IGF0IG1ldGEteC5vcmc+IDoKKyAqICAgICAgIC0gZmV3IGZpeGVzLiBNYXN0ZXIncyBNQUMgYWRkcmVzcyBpcyBub3cgY29ycmVjdGx5IHRha2VuIGZyb20KKyAqICAgICAgICAgdGhlIGZpcnN0IGRldmljZSB3aGVuIG5vdCBwcmV2aW91c2x5IHNldCA7CisgKiAgICAgICAtIGRldGFjaCBzdXBwb3J0IDogY2FsbCBCT05EX1JFTEVBU0UgdG8gZGV0YWNoIGFuIGVuc2xhdmVkIGludGVyZmFjZS4KKyAqICAgICAgIC0gZ2l2ZSBhIG1pbmktaG93dG8gZnJvbSBjb21tYW5kLWxpbmUgaGVscCA6ICMgaWZlbnNsYXZlIC1oCisgKgorICogICAgLSAyMDAxLzAyLzE2IENoYWQgTi4gVGluZGVsIDxjdGluZGVsIGF0IGllZWUgZG90IG9yZz4gOgorICogICAgICAgLSBNYXN0ZXIgaXMgbm93IGJyb3VnaHQgZG93biBiZWZvcmUgc2V0dGluZyB0aGUgTUFDIGFkZHJlc3MuICBJbgorICogICAgICAgICB0aGUgMi40IGtlcm5lbCB5b3UgY2FuJ3QgY2hhbmdlIHRoZSBNQUMgYWRkcmVzcyB3aGlsZSB0aGUgZGV2aWNlIGlzCisgKiAgICAgICAgIHVwIGJlY2F1c2UgeW91IGdldCBFQlVTWS4KKyAqCisgKiAgICAtIDIwMDEvMDkvMTMgVGFrYW8gSW5kb2ggPGluZG91IGRvdCB0YWthbyBhdCBqcCBkb3QgZnVqaXRzdSBkb3QgY29tPgorICogICAgICAgLSBBZGRlZCB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgdGhlIGFjdGl2ZSBpbnRlcmZhY2Ugb24gYSBtb2RlIDEgYm9uZAorICogICAgICAgICBhdCBydW50aW1lLgorICoKKyAqICAgIC0gMjAwMS8xMC8yMyBDaGFkIE4uIFRpbmRlbCA8Y3RpbmRlbCBhdCBpZWVlIGRvdCBvcmc+IDoKKyAqICAgICAgIC0gTm8gbG9uZ2VyIHNldCB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIG1hc3Rlci4gIFRoZSBib25kIGRldmljZSB3aWxsCisgKiAgICAgICAgIHRha2UgY2FyZSBvZiB0aGlzIGl0c2VsZgorICogICAgICAgLSBUcnkgdGhlIFNJT0MqKiogdmVyc2lvbnMgb2YgdGhlIGJvbmRpbmcgaW9jdGxzIGJlZm9yZSB1c2luZyB0aGUKKyAqICAgICAgICAgb2xkIHZlcnNpb25zCisgKiAgICAtIDIwMDIvMDIvMTggRXJpayBIYWJiaW5nYSA8ZXJpa19oYWJiaW5nYSBAIGhwIGRvdCBjb20+IDoKKyAqICAgICAgIC0gaWZyMi5pZnJfZmxhZ3Mgd2FzIG5vdCBpbml0aWFsaXplZCBpbiB0aGUgaHdhZGRyX25vdHNldCBjYXNlLAorICogICAgICAgICBTSU9DR0lGRkxBR1Mgbm93IGNhbGxlZCBiZWZvcmUgaHdhZGRyX25vdHNldCB0ZXN0CisgKgorICogICAgLSAyMDAyLzEwLzMxIFRvbnkgQ3VyZWluZ3RvbiA8dG9ueS5jdXJlaW5ndG9uICogaHBfY29tPiA6CisgKiAgICAgICAtIElmIHRoZSBtYXN0ZXIgZG9lcyBub3QgaGF2ZSBhIGhhcmR3YXJlIGFkZHJlc3Mgd2hlbiB0aGUgZmlyc3Qgc2xhdmUKKyAqICAgICAgICAgaXMgZW5zbGF2ZWQsIHRoZSBtYXN0ZXIgaXMgYXNzaWduZWQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb2YgdGhhdAorICogICAgICAgICBzbGF2ZSAtIHRoZXJlIGlzIGEgY29tbWVudCBpbiBib25kaW5nLmMgc3RhdGluZyAiaWZlbnNsYXZlIHRha2VzCisgKiAgICAgICAgIGNhcmUgb2YgdGhpcyBub3cuIiBUaGlzIGNvcnJlY3RzIHRoZSBwcm9ibGVtIG9mIHNsYXZlcyBoYXZpbmcKKyAqICAgICAgICAgZGlmZmVyZW50IGhhcmR3YXJlIGFkZHJlc3NlcyBpbiBhY3RpdmUtYmFja3VwIG1vZGUgd2hlbgorICogICAgICAgICBtdWx0aXBsZSBpbnRlcmZhY2VzIGFyZSBzcGVjaWZpZWQgb24gYSBzaW5nbGUgaWZlbnNsYXZlIGNvbW1hbmQKKyAqICAgICAgICAgKGlmZW5zbGF2ZSBib25kMCBldGgwIGV0aDEpLgorICoKKyAqICAgIC0gMjAwMy8wMy8xOCAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKiAgICAgICAgICAgICAgICAgICBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqICAgICAgIC0gTW92ZWQgc2V0dGluZyB0aGUgc2xhdmUncyBtYWMgYWRkcmVzcyBhbmQgb3Blbm5pbmcgaXQsIGZyb20KKyAqICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBkcml2ZXIuIFRoaXMgZW5hYmxlcyBzdXBwb3J0IG9mIG1vZGVzCisgKiAgICAgICAgIHRoYXQgbmVlZCB0byB1c2UgdGhlIHVuaXF1ZSBtYWMgYWRkcmVzcyBvZiBlYWNoIHNsYXZlLgorICogICAgICAgICBUaGUgZHJpdmVyIGFsc28gdGFrZXMgY2FyZSBvZiBjbG9zaW5nIHRoZSBzbGF2ZSBhbmQgcmVzdG9yaW5nIGl0cworICogICAgICAgICBvcmlnaW5hbCBtYWMgYWRkcmVzcyB1cG9uIHJlbGVhc2UuCisgKiAgICAgICAgIEluIGFkZGl0aW9uLCBibG9jayBwb3NzaWJpbGl0eSBvZiBlbnNsYXZpbmcgYmVmb3JlIHRoZSBtYXN0ZXIgaXMgdXAuCisgKiAgICAgICAgIFRoaXMgcHJldmVudHMgcHV0dGluZyB0aGUgc3lzdGVtIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KKyAqCisgKiAgICAtIDIwMDMvMDUvMDEgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICogICAgICAgLSBBZGRlZCBBQkkgdmVyc2lvbiBjb250cm9sIHRvIHJlc3RvcmUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuCisgKiAgICAgICAgIG5ldy9vbGQgaWZlbnNsYXZlIGFuZCBuZXcvb2xkIGJvbmRpbmcuCisgKiAgICAgICAtIFByZXZlbnQgYWRkaW5nIGFuIGFkYXB0ZXIgdGhhdCBpcyBhbHJlYWR5IGEgc2xhdmUuCisgKiAgICAgICAgIEZpeGVzIHRoZSBwcm9ibGVtIG9mIHN0YWxsaW5nIHRoZSB0cmFuc21pc3Npb24gYW5kIGxlYXZpbmcKKyAqICAgICAgICAgdGhlIHNsYXZlIGluIGEgZG93biBzdGF0ZS4KKyAqCisgKiAgICAtIDIwMDMvMDUvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqICAgICAgIC0gUHJldmVudCBlbnNsYXZpbmcgaWYgdGhlIGJvbmQgZGV2aWNlIGlzIGRvd24uCisgKiAgICAgICAgIEZpeGVzIHRoZSBwcm9ibGVtIG9mIGxlYXZpbmcgdGhlIHN5c3RlbSBpbiB1bnN0YWJsZSBzdGF0ZSBhbmQKKyAqICAgICAgICAgaGFsdGluZyB3aGVuIHRyeWluZyB0byByZW1vdmUgdGhlIG1vZHVsZS4KKyAqICAgICAgIC0gQ2xvc2Ugc29ja2V0IG9uIGFsbCBhYm5vcm1hbCBleGlzdHMuCisgKiAgICAgICAtIEFkZCB2ZXJzaW9uaW5nIHNjaGVtZSB0aGF0IGZvbGxvd3MgdGhhdCBvZiB0aGUgYm9uZGluZyBkcml2ZXIuCisgKiAgICAgICAgIGN1cnJlbnQgdmVyc2lvbiBpcyAxLjAuMCBhcyBhIGJhc2UgbGluZS4KKyAqCisgKiAgICAtIDIwMDMvMDUvMjIgLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqICAgICAgIC0gaWZlbnNsYXZlIC1jIHdhcyBicm9rZW47IGl0J3Mgbm93IGZpeGVkCisgKiAgICAgICAtIEZpeGVkIHByb2JsZW0gd2l0aCByb3V0ZXMgdmFuaXNoaW5nIGZyb20gbWFzdGVyIGR1cmluZyBlbnNsYXZlCisgKiAgICAgICAgIHByb2Nlc3NpbmcuCisgKgorICogICAgLSAyMDAzLzA1LzI3IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqICAgICAgIC0gRml4IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWVzOgorICogICAgICAgICBGb3IgZHJpdmVycyBub3QgdXNpbmcgQUJJIHZlcnNpb25zLCBzbGF2ZSB3YXMgc2V0IGRvd24gd2hpbGUKKyAqICAgICAgICAgaXQgc2hvdWxkIGJlIGxlZnQgdXAgYmVmb3JlIGVuc2xhdmluZy4KKyAqICAgICAgICAgQWxzbywgbWFzdGVyIHdhcyBub3Qgc2V0IGRvd24gYW5kIHRoZSBkZWZhdWx0IHNldF9tYWNfYWRkcmVzcygpCisgKiAgICAgICAgIHdvdWxkIGZhaWwgYW5kIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIHN5c3RlbSBsb2cuCisgKiAgICAgICAtIEZvciBvcHRfYzogc2xhdmUgc2hvdWxkIG5vdCBiZSBzZXQgdG8gdGhlIG1hc3RlcidzIHNldHRpbmcKKyAqICAgICAgICAgd2hpbGUgaXQgaXMgcnVubmluZy4gSXQgd2FzIGFscmVhZHkgc2V0IGR1cmluZyBlbnNsYXZlLiBUbworICogICAgICAgICBzaW1wbGlmeSB0aGluZ3MsIGl0IGlzIG5vdyBoYW5kZWxlZCBzZXBhcmF0ZWx5LgorICoKKyAqICAgIC0gMjAwMy8xMi8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICogICAgICAgLSBDb2RlIGNsZWFudXAgYW5kIHN0eWxlIGNoYW5nZXMKKyAqICAgICAgICAgc2V0IHZlcnNpb24gdG8gMS4xLjAKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaWZlbnNsYXZlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNkZl0gTUFTVEVSX0lGQUNFIFNMQVZFX0lGQUNFLi4uIgorLy91c2FnZTojZGVmaW5lIGlmZW5zbGF2ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbmZpZ3VyZSBuZXR3b3JrIGludGVyZmFjZXMgZm9yIHBhcmFsbGVsIHJvdXRpbmdcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jaGFuZ2UtYWN0aXZlCUNoYW5nZSBhY3RpdmUgc2xhdmUiCisvL3VzYWdlOiAgICAgIlxuCS1kLC0tZGV0YWNoCQlSZW1vdmUgc2xhdmUgaW50ZXJmYWNlIGZyb20gYm9uZGluZyBkZXZpY2UiCisvL3VzYWdlOiAgICAgIlxuCS1mLC0tZm9yY2UJCUZvcmNlLCBldmVuIGlmIGludGVyZmFjZSBpcyBub3QgRXRoZXJuZXQiCisvKiAvL3VzYWdlOiAgIlxuCS1yLC0tcmVjZWl2ZS1zbGF2ZQlDcmVhdGUgYSByZWNlaXZlLW9ubHkgc2xhdmUiICovCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlmZW5zbGF2ZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiVG8gY3JlYXRlIGEgYm9uZCBkZXZpY2UsIHNpbXBseSBmb2xsb3cgdGhlc2UgdGhyZWUgc3RlcHM6XG4iCisvL3VzYWdlOiAgICAgICAiLSBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgZHJpdmVycyBhcmUgcHJvcGVybHkgbG9hZGVkOlxuIgorLy91c2FnZTogICAgICAgIiAgIyBtb2Rwcm9iZSBib25kaW5nIDsgbW9kcHJvYmUgPDNjNTl4fGVlcHJvMTAwfHBjbmV0MzJ8dHVsaXB8Li4uPlxuIgorLy91c2FnZTogICAgICAgIi0gYXNzaWduIGFuIElQIGFkZHJlc3MgdG8gdGhlIGJvbmQgZGV2aWNlOlxuIgorLy91c2FnZTogICAgICAgIiAgIyBpZmNvbmZpZyBib25kMCA8YWRkcj4gbmV0bWFzayA8bWFzaz4gYnJvYWRjYXN0IDxiY2FzdD5cbiIKKy8vdXNhZ2U6ICAgICAgICItIGF0dGFjaCBhbGwgdGhlIGludGVyZmFjZXMgeW91IG5lZWQgdG8gdGhlIGJvbmQgZGV2aWNlOlxuIgorLy91c2FnZTogICAgICAgIiAgIyBpZmVuc2xhdmUgYm9uZDAgZXRoMCBldGgxIGV0aDJcbiIKKy8vdXNhZ2U6ICAgICAgICIgIElmIGJvbmQwIGRpZG4ndCBoYXZlIGEgTUFDIGFkZHJlc3MsIGl0IHdpbGwgdGFrZSBldGgwJ3MuIFRoZW4sIGFsbFxuIgorLy91c2FnZTogICAgICAgIiAgaW50ZXJmYWNlcyBhdHRhY2hlZCBBRlRFUiB0aGlzIGFzc2lnbm1lbnQgd2lsbCBnZXQgdGhlIHNhbWUgTUFDIGFkZHIuXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgIFRvIGRldGFjaCBhIGRlYWQgaW50ZXJmYWNlIHdpdGhvdXQgc2V0dGluZyB0aGUgYm9uZCBkZXZpY2UgZG93bjpcbiIKKy8vdXNhZ2U6ICAgICAgICIgICMgaWZlbnNsYXZlIC1kIGJvbmQwIGV0aDFcblxuIgorLy91c2FnZTogICAgICAgIiAgVG8gc2V0IHRoZSBib25kIGRldmljZSBkb3duIGFuZCBhdXRvbWF0aWNhbGx5IHJlbGVhc2UgYWxsIHRoZSBzbGF2ZXM6XG4iCisvL3VzYWdlOiAgICAgICAiICAjIGlmY29uZmlnIGJvbmQwIGRvd25cblxuIgorLy91c2FnZTogICAgICAgIiAgVG8gY2hhbmdlIGFjdGl2ZSBzbGF2ZTpcbiIKKy8vdXNhZ2U6ICAgICAgICIgICMgaWZlbnNsYXZlIC1jIGJvbmQwIGV0aDBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qICNpbmNsdWRlIDxuZXQvaWYuaD4gLSBuby4gbGludXgvaWZfYm9uZGluZy5oIHB1bGxzIGluIGxpbnV4L2lmLmggKi8KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorLy8jaW5jbHVkZSA8bmV0L2lmX2FycC5oPiAtIG5vdCBuZWVkZWQ/CisjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlICJmaXhfdTMyLmgiIC8qIGhhY2ssIHNvIHdlIG1heSBpbmNsdWRlIGtlcm5lbCdzIGV0aHRvb2wuaCAqLworI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpZm5kZWYgQk9ORF9BQklfVkVSU0lPTgorIyBkZWZpbmUgQk9ORF9BQklfVkVSU0lPTiAyCisjZW5kaWYKKyNpZm5kZWYgSUZOQU1TSVoKKyMgZGVmaW5lIElGTkFNU0laIDE2CisjZW5kaWYKKworCitzdHJ1Y3QgZGV2X2RhdGEgeworCXN0cnVjdCBpZnJlcSBtdHUsIGZsYWdzLCBod2FkZHI7Cit9OworCisKK2VudW0geyBza2ZkID0gMyB9OyAgICAgIC8qIEFGX0lORVQgc29ja2V0IGZvciBpb2N0bCgpIGNhbGxzLiAqLworc3RydWN0IGdsb2JhbHMgeworCXVuc2lnbmVkIGFiaV92ZXI7ICAgICAgIC8qIHVzZXJsYW5kIC0ga2VybmVsIEFCSSB2ZXJzaW9uICovCisJc21hbGxpbnQgaHdhZGRyX3NldDsgICAgLyogTWFzdGVyJ3MgaHdhZGRyIGlzIHNldCAqLworCXN0cnVjdCBkZXZfZGF0YSBtYXN0ZXI7CisJc3RydWN0IGRldl9kYXRhIHNsYXZlOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBhYmlfdmVyICAgIChHLmFiaV92ZXIgICApCisjZGVmaW5lIGh3YWRkcl9zZXQgKEcuaHdhZGRyX3NldCkKKyNkZWZpbmUgbWFzdGVyICAgICAoRy5tYXN0ZXIgICAgKQorI2RlZmluZSBzbGF2ZSAgICAgIChHLnNsYXZlICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisKKy8qIE5PSU5MSU5FcyBhcmUgcGxhY2VkIHdoZXJlIGl0IHJlc3VsdHMgaW4gc21hbGxlciBjb2RlIChnY2MgNC4zLjEpICovCisKK3N0YXRpYyBpbnQgaW9jdGxfb25fc2tmZCh1bnNpZ25lZCByZXF1ZXN0LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlyZXR1cm4gaW9jdGwoc2tmZCwgcmVxdWVzdCwgaWZyKTsKK30KKworc3RhdGljIGludCBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwodW5zaWduZWQgcmVxdWVzdCwgc3RydWN0IGlmcmVxICppZnIsIGNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJuY3B5X0lGTkFNU0laKGlmci0+aWZyX25hbWUsIGlmbmFtZSk7CisJcmV0dXJuIGlvY3RsX29uX3NrZmQocmVxdWVzdCwgaWZyKTsKK30KKworc3RhdGljIGludCBnZXRfaWZfc2V0dGluZ3MoY2hhciAqaWZuYW1lLCBzdHJ1Y3QgZGV2X2RhdGEgKmRkKQoreworCWludCByZXM7CisKKwlyZXMgPSBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ0dJRk1UVSwgJmRkLT5tdHUsIGlmbmFtZSk7CisJcmVzIHw9IHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DR0lGRkxBR1MsICZkZC0+ZmxhZ3MsIGlmbmFtZSk7CisJcmVzIHw9IHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DR0lGSFdBRERSLCAmZGQtPmh3YWRkciwgaWZuYW1lKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NsYXZlX2ZsYWdzKGNoYXIgKnNsYXZlX2lmbmFtZSkKK3sKKwlyZXR1cm4gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NHSUZGTEFHUywgJnNsYXZlLmZsYWdzLCBzbGF2ZV9pZm5hbWUpOworfQorCitzdGF0aWMgaW50IHNldF9od2FkZHIoY2hhciAqaWZuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmh3YWRkcikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJbWVtY3B5KCYoaWZyLmlmcl9od2FkZHIpLCBod2FkZHIsIHNpemVvZigqaHdhZGRyKSk7CisJcmV0dXJuIHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DU0lGSFdBRERSLCAmaWZyLCBpZm5hbWUpOworfQorCitzdGF0aWMgaW50IHNldF9tdHUoY2hhciAqaWZuYW1lLCBpbnQgbXR1KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwlpZnIuaWZyX210dSA9IG10dTsKKwlyZXR1cm4gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NTSUZNVFUsICZpZnIsIGlmbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lmX2ZsYWdzKGNoYXIgKmlmbmFtZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwlpZnIuaWZyX2ZsYWdzID0gZmxhZ3M7CisJcmV0dXJuIHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DU0lGRkxBR1MsICZpZnIsIGlmbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lmX3VwKGNoYXIgKmlmbmFtZSwgaW50IGZsYWdzKQoreworCWludCByZXMgPSBzZXRfaWZfZmxhZ3MoaWZuYW1lLCBmbGFncyB8IElGRl9VUCk7CisJaWYgKHJlcykKKwkJYmJfcGVycm9yX21zZygiJXM6IGNhbid0IHVwIiwgaWZuYW1lKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNldF9pZl9kb3duKGNoYXIgKmlmbmFtZSwgaW50IGZsYWdzKQoreworCWludCByZXMgPSBzZXRfaWZfZmxhZ3MoaWZuYW1lLCBmbGFncyAmIH5JRkZfVVApOworCWlmIChyZXMpCisJCWJiX3BlcnJvcl9tc2coIiVzOiBjYW4ndCBkb3duIiwgaWZuYW1lKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGNsZWFyX2lmX2FkZHIoY2hhciAqaWZuYW1lKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwlpZnIuaWZyX2FkZHIuc2FfZmFtaWx5ID0gQUZfSU5FVDsKKwltZW1zZXQoaWZyLmlmcl9hZGRyLnNhX2RhdGEsIDAsIHNpemVvZihpZnIuaWZyX2FkZHIuc2FfZGF0YSkpOworCXJldHVybiBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ1NJRkFERFIsICZpZnIsIGlmbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lmX2FkZHIoY2hhciAqbWFzdGVyX2lmbmFtZSwgY2hhciAqc2xhdmVfaWZuYW1lKQoreworI2lmIChTSU9DR0lGQUREUiB8IFNJT0NTSUZBRERSIFwKKyAgfCBTSU9DR0lGRFNUQUREUiB8IFNJT0NTSUZEU1RBRERSIFwKKyAgfCBTSU9DR0lGQlJEQUREUiB8IFNJT0NTSUZCUkRBRERSIFwKKyAgfCBTSU9DR0lGTkVUTUFTSyB8IFNJT0NTSUZORVRNQVNLKSA8PSAweGZmZmYKKyNkZWZpbmUgSU5UIHVpbnQxNl90CisjZWxzZQorI2RlZmluZSBJTlQgaW50CisjZW5kaWYKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJSU5UIGdfaW9jdGw7CisJCUlOVCBzX2lvY3RsOworCX0gaWZyYVtdID0geworCQl7IFNJT0NHSUZBRERSLCAgICBTSU9DU0lGQUREUiAgICB9LAorCQl7IFNJT0NHSUZEU1RBRERSLCBTSU9DU0lGRFNUQUREUiB9LAorCQl7IFNJT0NHSUZCUkRBRERSLCBTSU9DU0lGQlJEQUREUiB9LAorCQl7IFNJT0NHSUZORVRNQVNLLCBTSU9DU0lGTkVUTUFTSyB9LAorCX07CisKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCByZXM7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlmcmEpOyBpKyspIHsKKwkJcmVzID0gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKGlmcmFbaV0uZ19pb2N0bCwgJmlmciwgbWFzdGVyX2lmbmFtZSk7CisJCWlmIChyZXMgPCAwKSB7CisJCQlpZnIuaWZyX2FkZHIuc2FfZmFtaWx5ID0gQUZfSU5FVDsKKwkJCW1lbXNldChpZnIuaWZyX2FkZHIuc2FfZGF0YSwgMCwKKwkJCSAgICAgICBzaXplb2YoaWZyLmlmcl9hZGRyLnNhX2RhdGEpKTsKKwkJfQorCisJCXJlcyA9IHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChpZnJhW2ldLnNfaW9jdGwsICZpZnIsIHNsYXZlX2lmbmFtZSk7CisJCWlmIChyZXMgPCAwKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hhbmdlX2FjdGl2ZShjaGFyICptYXN0ZXJfaWZuYW1lLCBjaGFyICpzbGF2ZV9pZm5hbWUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWlmICghKHNsYXZlLmZsYWdzLmlmcl9mbGFncyAmIElGRl9TTEFWRSkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGlzIG5vdCBhIHNsYXZlIiwgc2xhdmVfaWZuYW1lKTsKKwl9CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfc2xhdmUsIHNsYXZlX2lmbmFtZSk7CisJaWYgKHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DQk9ORENIQU5HRUFDVElWRSwgJmlmciwgbWFzdGVyX2lmbmFtZSkKKwkgJiYgaW9jdGxfb25fc2tmZChCT05EX0NIQU5HRV9BQ1RJVkVfT0xELCAmaWZyKQorCSkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkibWFzdGVyICVzLCBzbGF2ZSAlczogY2FuJ3QgIgorCQkJImNoYW5nZSBhY3RpdmUiLAorCQkJbWFzdGVyX2lmbmFtZSwgc2xhdmVfaWZuYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBOT0lOTElORSBpbnQgZW5zbGF2ZShjaGFyICptYXN0ZXJfaWZuYW1lLCBjaGFyICpzbGF2ZV9pZm5hbWUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgcmVzOworCisJaWYgKHNsYXZlLmZsYWdzLmlmcl9mbGFncyAmIElGRl9TTEFWRSkgeworCQliYl9lcnJvcl9tc2coCisJCQkiJXMgaXMgYWxyZWFkeSBhIHNsYXZlIiwKKwkJCXNsYXZlX2lmbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXJlcyA9IHNldF9pZl9kb3duKHNsYXZlX2lmbmFtZSwgc2xhdmUuZmxhZ3MuaWZyX2ZsYWdzKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJaWYgKGFiaV92ZXIgPCAyKSB7CisJCS8qIE9sZGVyIGJvbmRpbmcgdmVyc2lvbnMgd291bGQgcGFuaWMgaWYgdGhlIHNsYXZlIGhhcyBubyBJUAorCQkgKiBhZGRyZXNzLCBzbyBnZXQgdGhlIElQIHNldHRpbmcgZnJvbSB0aGUgbWFzdGVyLgorCQkgKi8KKwkJcmVzID0gc2V0X2lmX2FkZHIobWFzdGVyX2lmbmFtZSwgc2xhdmVfaWZuYW1lKTsKKwkJaWYgKHJlcykgeworCQkJYmJfcGVycm9yX21zZygiJXM6IGNhbid0IHNldCBhZGRyZXNzIiwgc2xhdmVfaWZuYW1lKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9IGVsc2UgeworCQlyZXMgPSBjbGVhcl9pZl9hZGRyKHNsYXZlX2lmbmFtZSk7CisJCWlmIChyZXMpIHsKKwkJCWJiX3BlcnJvcl9tc2coIiVzOiBjYW4ndCBjbGVhciBhZGRyZXNzIiwgc2xhdmVfaWZuYW1lKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9CisKKwlpZiAobWFzdGVyLm10dS5pZnJfbXR1ICE9IHNsYXZlLm10dS5pZnJfbXR1KSB7CisJCXJlcyA9IHNldF9tdHUoc2xhdmVfaWZuYW1lLCBtYXN0ZXIubXR1Lmlmcl9tdHUpOworCQlpZiAocmVzKSB7CisJCQliYl9wZXJyb3JfbXNnKCIlczogY2FuJ3Qgc2V0IE1UVSIsIHNsYXZlX2lmbmFtZSk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCisJaWYgKGh3YWRkcl9zZXQpIHsKKwkJLyogTWFzdGVyIGFscmVhZHkgaGFzIGFuIGh3YWRkcgorCQkgKiBzbyBzZXQgaXQncyBod2FkZHIgdG8gdGhlIHNsYXZlCisJCSAqLworCQlpZiAoYWJpX3ZlciA8IDEpIHsKKwkJCS8qIFRoZSBkcml2ZXIgaXMgdXNpbmcgYW4gb2xkIEFCSSwgc28KKwkJCSAqIHRoZSBhcHBsaWNhdGlvbiBzZXRzIHRoZSBzbGF2ZSdzCisJCQkgKiBod2FkZHIKKwkJCSAqLworCQkJaWYgKHNldF9od2FkZHIoc2xhdmVfaWZuYW1lLCAmKG1hc3Rlci5od2FkZHIuaWZyX2h3YWRkcikpKSB7CisJCQkJYmJfcGVycm9yX21zZygiJXM6IGNhbid0IHNldCBodyBhZGRyZXNzIiwKKwkJCQkJCXNsYXZlX2lmbmFtZSk7CisJCQkJZ290byB1bmRvX210dTsKKwkJCX0KKworCQkJLyogRm9yIG9sZCBBQkkgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGJyaW5nIHRoZQorCQkJICogc2xhdmUgYmFjayB1cAorCQkJICovCisJCQlpZiAoc2V0X2lmX3VwKHNsYXZlX2lmbmFtZSwgc2xhdmUuZmxhZ3MuaWZyX2ZsYWdzKSkKKwkJCQlnb3RvIHVuZG9fc2xhdmVfbWFjOworCQl9CisJCS8qIFRoZSBkcml2ZXIgaXMgdXNpbmcgYSBuZXcgQUJJLAorCQkgKiBzbyB0aGUgZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2V0dGluZworCQkgKiB0aGUgc2xhdmUncyBod2FkZHIgYW5kIGJyaW5naW5nCisJCSAqIGl0IHVwIGFnYWluCisJCSAqLworCX0gZWxzZSB7CisJCS8qIE5vIGh3YWRkciBmb3IgbWFzdGVyIHlldCwgc28KKwkJICogc2V0IHRoZSBzbGF2ZSdzIGh3YWRkciB0byBpdAorCQkgKi8KKwkJaWYgKGFiaV92ZXIgPCAxKSB7CisJCQkvKiBGb3Igb2xkIEFCSSwgdGhlIG1hc3RlciBuZWVkcyB0byBiZQorCQkJICogZG93biBiZWZvcmUgc2V0dGluZyBpdCdzIGh3YWRkcgorCQkJICovCisJCQlpZiAoc2V0X2lmX2Rvd24obWFzdGVyX2lmbmFtZSwgbWFzdGVyLmZsYWdzLmlmcl9mbGFncykpCisJCQkJZ290byB1bmRvX210dTsKKwkJfQorCisJCWlmIChzZXRfaHdhZGRyKG1hc3Rlcl9pZm5hbWUsICYoc2xhdmUuaHdhZGRyLmlmcl9od2FkZHIpKSkgeworCQkJYmJfZXJyb3JfbXNnKCIlczogY2FuJ3Qgc2V0IGh3IGFkZHJlc3MiLAorCQkJCW1hc3Rlcl9pZm5hbWUpOworCQkJZ290byB1bmRvX210dTsKKwkJfQorCisJCWlmIChhYmlfdmVyIDwgMSkgeworCQkJLyogRm9yIG9sZCBBQkksIGJyaW5nIHRoZSBtYXN0ZXIKKwkJCSAqIGJhY2sgdXAKKwkJCSAqLworCQkJaWYgKHNldF9pZl91cChtYXN0ZXJfaWZuYW1lLCBtYXN0ZXIuZmxhZ3MuaWZyX2ZsYWdzKSkKKwkJCQlnb3RvIHVuZG9fbWFzdGVyX21hYzsKKwkJfQorCisJCWh3YWRkcl9zZXQgPSAxOworCX0KKworCS8qIERvIHRoZSByZWFsIHRoaW5nICovCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX3NsYXZlLCBzbGF2ZV9pZm5hbWUpOworCWlmIChzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ0JPTkRFTlNMQVZFLCAmaWZyLCBtYXN0ZXJfaWZuYW1lKQorCSAmJiBpb2N0bF9vbl9za2ZkKEJPTkRfRU5TTEFWRV9PTEQsICZpZnIpCisJKSB7CisJCWdvdG8gdW5kb19tYXN0ZXJfbWFjOworCX0KKworCXJldHVybiAwOworCisvKiByb2xsYmFjayAoYmVzdCBlZmZvcnQpICovCisgdW5kb19tYXN0ZXJfbWFjOgorCXNldF9od2FkZHIobWFzdGVyX2lmbmFtZSwgJihtYXN0ZXIuaHdhZGRyLmlmcl9od2FkZHIpKTsKKwlod2FkZHJfc2V0ID0gMDsKKwlnb3RvIHVuZG9fbXR1OworCisgdW5kb19zbGF2ZV9tYWM6CisJc2V0X2h3YWRkcihzbGF2ZV9pZm5hbWUsICYoc2xhdmUuaHdhZGRyLmlmcl9od2FkZHIpKTsKKyB1bmRvX210dToKKwlzZXRfbXR1KHNsYXZlX2lmbmFtZSwgc2xhdmUubXR1Lmlmcl9tdHUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlbGVhc2UoY2hhciAqbWFzdGVyX2lmbmFtZSwgY2hhciAqc2xhdmVfaWZuYW1lKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoIShzbGF2ZS5mbGFncy5pZnJfZmxhZ3MgJiBJRkZfU0xBVkUpKSB7CisJCWJiX2Vycm9yX21zZygiJXMgaXMgbm90IGEgc2xhdmUiLCBzbGF2ZV9pZm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfc2xhdmUsIHNsYXZlX2lmbmFtZSk7CisJaWYgKHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DQk9ORFJFTEVBU0UsICZpZnIsIG1hc3Rlcl9pZm5hbWUpIDwgMAorCSAmJiBpb2N0bF9vbl9za2ZkKEJPTkRfUkVMRUFTRV9PTEQsICZpZnIpIDwgMAorCSkgeworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGFiaV92ZXIgPCAxKSB7CisJCS8qIFRoZSBkcml2ZXIgaXMgdXNpbmcgYW4gb2xkIEFCSSwgc28gd2UnbGwgc2V0IHRoZSBpbnRlcmZhY2UKKwkJICogZG93biB0byBhdm9pZCBhbnkgY29uZmxpY3RzIGR1ZSB0byBzYW1lIE1BQy9JUAorCQkgKi8KKwkJcmVzID0gc2V0X2lmX2Rvd24oc2xhdmVfaWZuYW1lLCBzbGF2ZS5mbGFncy5pZnJfZmxhZ3MpOworCX0KKworCS8qIHNldCB0byBkZWZhdWx0IG10dSAqLworCXNldF9tdHUoc2xhdmVfaWZuYW1lLCAxNTAwKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBOT0lOTElORSB2b2lkIGdldF9kcnZfaW5mbyhjaGFyICptYXN0ZXJfaWZuYW1lKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyBpbmZvOworCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlpZnIuaWZyX2RhdGEgPSAoY2FkZHJfdCkmaW5mbzsKKwlpbmZvLmNtZCA9IEVUSFRPT0xfR0RSVklORk87CisJLyogYm90aCBmaWVsZHMgYXJlIDMyIGJ5dGVzIGxvbmcgKGxvbmcgZW5vdWdoKSAqLworCXN0cmNweShpbmZvLmRyaXZlciwgImlmZW5zbGF2ZSIpOworCXN0cmNweShpbmZvLmZ3X3ZlcnNpb24sIHV0b2EoQk9ORF9BQklfVkVSU0lPTikpOworCWlmIChzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ0VUSFRPT0wsICZpZnIsIG1hc3Rlcl9pZm5hbWUpIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU9QTk9UU1VQUCkKKwkJCXJldHVybjsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCIlczogU0lPQ0VUSFRPT0wgZXJyb3IiLCBtYXN0ZXJfaWZuYW1lKTsKKwl9CisKKwlhYmlfdmVyID0gYmJfc3RydG91KGluZm8uZndfdmVyc2lvbiwgTlVMTCwgMCk7CisJaWYgKGVycm5vKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IFNJT0NFVEhUT09MIGVycm9yIiwgbWFzdGVyX2lmbmFtZSk7Cit9CisKK2ludCBpZmVuc2xhdmVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlmZW5zbGF2ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbWFzdGVyX2lmbmFtZSwgKnNsYXZlX2lmbmFtZTsKKwlpbnQgcnY7CisJaW50IHJlczsKKwl1bnNpZ25lZCBvcHQ7CisJZW51bSB7CisJCU9QVF9jID0gKDEgPDwgMCksCisJCU9QVF9kID0gKDEgPDwgMSksCisJCU9QVF9mID0gKDEgPDwgMiksCisJfTsKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgaWZlbnNsYXZlX2xvbmdvcHRzW10gQUxJR04xID0KKwkJImNoYW5nZS1hY3RpdmVcMCIgIE5vX2FyZ3VtZW50ICJjIgorCQkiZGV0YWNoXDAiICAgICAgICAgTm9fYXJndW1lbnQgImQiCisJCSJmb3JjZVwwIiAgICAgICAgICBOb19hcmd1bWVudCAiZiIKKwkJLyogImFsbC1pbnRlcmZhY2VzXDAiIE5vX2FyZ3VtZW50ICJhIiAqLworCQk7CisKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gaWZlbnNsYXZlX2xvbmdvcHRzOworI2VuZGlmCisJSU5JVF9HKCk7CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiY2RmYSIpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiAob3B0LTEpKSAvKiBPbmx5IG9uZSBvcHRpb24gY2FuIGJlIGdpdmVuICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCW1hc3Rlcl9pZm5hbWUgPSAqYXJndisrOworCisJLyogTm8gaW50ZXJmYWNlIG5hbWVzIC0gc2hvdyBhbGwgaW50ZXJmYWNlcy4gKi8KKwlpZiAoIW1hc3Rlcl9pZm5hbWUpIHsKKwkJZGlzcGxheV9pbnRlcmZhY2VzKE5VTEwpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIE9wZW4gYSBiYXNpYyBzb2NrZXQgKi8KKwl4bW92ZV9mZCh4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApLCBza2ZkKTsKKworCS8qIEV4Y2hhbmdlIGFiaSB2ZXJzaW9uIHdpdGggYm9uZGluZyBtb2R1bGUgKi8KKwlnZXRfZHJ2X2luZm8obWFzdGVyX2lmbmFtZSk7CisKKwlzbGF2ZV9pZm5hbWUgPSAqYXJndisrOworCWlmICghc2xhdmVfaWZuYW1lKSB7CisJCWlmIChvcHQgJiAoT1BUX2R8T1BUX2MpKSB7CisJCQkvKiAtLWNoYW5nZSBvciAtLWRldGFjaCwgYW5kIG5vIHNsYXZlcyBnaXZlbiAtCisJCQkgKiBzaG93IGFsbCBpbnRlcmZhY2VzLiAqLworCQkJZGlzcGxheV9pbnRlcmZhY2VzKHNsYXZlX2lmbmFtZSAvKiA9PSBOVUxMICovKTsKKwkJCXJldHVybiAyOyAvKiB3aHkgMj8gKi8KKwkJfQorCQkvKiBBIHNpbmdsZSBhcmcgbWVhbnMgc2hvdyB0aGUKKwkJICogY29uZmlndXJhdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UKKwkJICovCisJCWRpc3BsYXlfaW50ZXJmYWNlcyhtYXN0ZXJfaWZuYW1lKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlpZiAoZ2V0X2lmX3NldHRpbmdzKG1hc3Rlcl9pZm5hbWUsICZtYXN0ZXIpKSB7CisJCS8qIFByb2JhYmx5IGEgZ29vZCByZWFzb24gbm90IHRvIGdvIG9uICovCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXM6IGNhbid0IGdldCBzZXR0aW5ncyIsIG1hc3Rlcl9pZm5hbWUpOworCX0KKworCS8qIENoZWNrIGlmIG1hc3RlciBpcyBpbmRlZWQgYSBtYXN0ZXI7CisJICogaWYgbm90IHRoZW4gZmFpbCBhbnkgb3BlcmF0aW9uCisJICovCisJaWYgKCEobWFzdGVyLmZsYWdzLmlmcl9mbGFncyAmIElGRl9NQVNURVIpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgbm90IGEgbWFzdGVyIiwgbWFzdGVyX2lmbmFtZSk7CisKKwkvKiBDaGVjayBpZiBtYXN0ZXIgaXMgdXA7IGlmIG5vdCB0aGVuIGZhaWwgYW55IG9wZXJhdGlvbiAqLworCWlmICghKG1hc3Rlci5mbGFncy5pZnJfZmxhZ3MgJiBJRkZfVVApKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgbm90IHVwIiwgbWFzdGVyX2lmbmFtZSk7CisKKyNpZmRlZiBXSFlfQk9USEVSCisJLyogTmVpdGhlciAtY1toYW5nZV0gbm9yIC1kW2V0YWNoXSAtPiBpdCdzICJlbnNsYXZlIiB0aGVuOworCSAqIGFuZCAtZltvcmNlXSBpcyBub3QgdGhlcmUgdG9vLiBDaGVjayB0aGF0IGl0J3MgZXRoZXJuZXQuICovCisJaWYgKCEob3B0ICYgKE9QVF9kfE9QVF9jfE9QVF9mKSkgeworCQkvKiBUaGUgZmFtaWx5ICcxJyBpcyBBUlBIUkRfRVRIRVIgZm9yIGV0aGVybmV0LiAqLworCQlpZiAobWFzdGVyLmh3YWRkci5pZnJfaHdhZGRyLnNhX2ZhbWlseSAhPSAxKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJCQkiJXMgaXMgbm90IGV0aGVybmV0LWxpa2UgKC1mIG92ZXJyaWRlcykiLAorCQkJCW1hc3Rlcl9pZm5hbWUpOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBBY2NlcHRzIG9ubHkgb25lIHNsYXZlICovCisJaWYgKG9wdCAmIE9QVF9jKSB7CisJCS8qIENoYW5nZSBhY3RpdmUgc2xhdmUgKi8KKwkJaWYgKGdldF9zbGF2ZV9mbGFncyhzbGF2ZV9pZm5hbWUpKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJIiVzOiBjYW4ndCBnZXQgZmxhZ3MiLCBzbGF2ZV9pZm5hbWUpOworCQl9CisJCWNoYW5nZV9hY3RpdmUobWFzdGVyX2lmbmFtZSwgc2xhdmVfaWZuYW1lKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBBY2NlcHRzIG11bHRpcGxlIHNsYXZlcyAqLworCXJlcyA9IDA7CisJZG8geworCQlpZiAob3B0ICYgT1BUX2QpIHsKKwkJCS8qIERldGFjaCBhIHNsYXZlIGludGVyZmFjZSBmcm9tIHRoZSBtYXN0ZXIgKi8KKwkJCXJ2ID0gZ2V0X3NsYXZlX2ZsYWdzKHNsYXZlX2lmbmFtZSk7CisJCQlpZiAocnYpIHsKKwkJCQkvKiBDYW4ndCB3b3JrIHdpdGggdGhpcyBzbGF2ZSwgKi8KKwkJCQkvKiByZW1lbWJlciB0aGUgZXJyb3IgYW5kIHNraXAgaXQgKi8KKwkJCQliYl9wZXJyb3JfbXNnKAorCQkJCQkic2tpcHBpbmcgJXM6IGNhbid0IGdldCBmbGFncyIsCisJCQkJCXNsYXZlX2lmbmFtZSk7CisJCQkJcmVzID0gcnY7CisJCQkJY29udGludWU7CisJCQl9CisJCQlydiA9IHJlbGVhc2UobWFzdGVyX2lmbmFtZSwgc2xhdmVfaWZuYW1lKTsKKwkJCWlmIChydikgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlbGVhc2UgJXMgZnJvbSAlcyIsCisJCQkJCXNsYXZlX2lmbmFtZSwgbWFzdGVyX2lmbmFtZSk7CisJCQkJcmVzID0gcnY7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBBdHRhY2ggYSBzbGF2ZSBpbnRlcmZhY2UgdG8gdGhlIG1hc3RlciAqLworCQkJcnYgPSBnZXRfaWZfc2V0dGluZ3Moc2xhdmVfaWZuYW1lLCAmc2xhdmUpOworCQkJaWYgKHJ2KSB7CisJCQkJLyogQ2FuJ3Qgd29yayB3aXRoIHRoaXMgc2xhdmUsICovCisJCQkJLyogcmVtZW1iZXIgdGhlIGVycm9yIGFuZCBza2lwIGl0ICovCisJCQkJYmJfcGVycm9yX21zZygKKwkJCQkJInNraXBwaW5nICVzOiBjYW4ndCBnZXQgc2V0dGluZ3MiLAorCQkJCQlzbGF2ZV9pZm5hbWUpOworCQkJCXJlcyA9IHJ2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcnYgPSBlbnNsYXZlKG1hc3Rlcl9pZm5hbWUsIHNsYXZlX2lmbmFtZSk7CisJCQlpZiAocnYpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBlbnNsYXZlICVzIHRvICVzIiwKKwkJCQkJc2xhdmVfaWZuYW1lLCBtYXN0ZXJfaWZuYW1lKTsKKwkJCQlyZXMgPSBydjsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKChzbGF2ZV9pZm5hbWUgPSAqYXJndisrKSAhPSBOVUxMKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShza2ZkKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pZnBsdWdkLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2lmcGx1Z2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM1OGNkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pZnBsdWdkLmMKQEAgLTAsMCArMSw3MzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlmcGx1Z2QgZm9yIGJ1c3lib3gsIGJhc2VkIG9uIGlmcGx1Z2QgMC4yOCAod3JpdHRlbiBieSBMZW5uYXJ0IFBvZXR0ZXJpbmcpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYWtzeW0gS3J5emhhbm92c2t5eSA8eG1ha3NAZW1haWwuY3o+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaWZwbHVnZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIgorLy91c2FnZTojZGVmaW5lIGlmcGx1Z2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJOZXR3b3JrIGludGVyZmFjZSBwbHVnIGRldGVjdGlvbiBkYWVtb25cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCURvbid0IGRhZW1vbml6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJCURvbid0IGxvZyB0byBzeXNsb2ciCisvL3VzYWdlOiAgICAgIlxuCS1pIElGQUNFCUludGVyZmFjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYvLUYJCVRyZWF0IGxpbmsgZGV0ZWN0aW9uIGVycm9yIGFzIGxpbmsgZG93bi9saW5rIHVwIgorLy91c2FnZTogICAgICJcbgkJCShvdGhlcndpc2UgZXhpdCBvbiBlcnJvcikiCisvL3VzYWdlOiAgICAgIlxuCS1hCQlEb24ndCB1cCBpbnRlcmZhY2UgYXQgZWFjaCBsaW5rIHByb2JlIgorLy91c2FnZTogICAgICJcbgktTQkJTW9uaXRvciBjcmVhdGlvbi9kZXN0cnVjdGlvbiBvZiBpbnRlcmZhY2UiCisvL3VzYWdlOiAgICAgIlxuCQkJKG90aGVyd2lzZSBpdCBtdXN0IGV4aXN0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgUFJPRwkJU2NyaXB0IHRvIHJ1biIKKy8vdXNhZ2U6ICAgICAiXG4JLXggQVJHCQlFeHRyYSBhcmd1bWVudCBmb3Igc2NyaXB0IgorLy91c2FnZTogICAgICJcbgktSQkJRG9uJ3QgZXhpdCBvbiBub256ZXJvIGV4aXQgY29kZSBmcm9tIHNjcmlwdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJCURvbid0IHJ1biBzY3JpcHQgb24gZGFlbW9uIHN0YXJ0dXAiCisvL3VzYWdlOiAgICAgIlxuCS1xCQlEb24ndCBydW4gc2NyaXB0IG9uIGRhZW1vbiBxdWl0IgorLy91c2FnZTogICAgICJcbgktbAkJUnVuIHNjcmlwdCBvbiBzdGFydHVwIGV2ZW4gaWYgbm8gY2FibGUgaXMgZGV0ZWN0ZWQiCisvL3VzYWdlOiAgICAgIlxuCS10IFNFQ1MJCVBvbGwgdGltZSBpbiBzZWNvbmRzIgorLy91c2FnZTogICAgICJcbgktdSBTRUNTCQlEZWxheSBiZWZvcmUgcnVubmluZyBzY3JpcHQgYWZ0ZXIgbGluayB1cCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgU0VDUwkJRGVsYXkgYWZ0ZXIgbGluayBkb3duIgorLy91c2FnZTogICAgICJcbgktbSBNT0RFCQlBUEkgbW9kZSAobWlpLCBwcml2LCBldGh0b29sLCB3bGFuLCBpZmYsIGF1dG8pIgorLy91c2FnZTogICAgICJcbgktawkJS2lsbCBydW5uaW5nIGRhZW1vbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpbmNsdWRlICJmaXhfdTMyLmgiCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaWZkZWYgSEFWRV9ORVRfRVRIRVJORVRfSAorIyBpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNkZWZpbmUgX191c2VyCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworLyoKK0Zyb20gaW5pdGlhbCBwb3J0IHRvIGJ1c3lib3gsIHJlbW92ZWQgbW9zdCBvZiB0aGUgcmVkdW5kYW5jeSBieQorY29udmVydGluZyBpbXBsZW1lbnRhdGlvbiBvZiBhIHBvbHltb3JwaGljIGludGVyZmFjZSB0byB0aGUgc3RyaWN0CitmdW5jdGlvbmFsIHN0eWxlLiBUaGUgbWFpbiByb2xlIGlzIHJ1biBhIHNjcmlwdCB3aGVuIGxpbmsgc3RhdGUKK2NoYW5nZWQsIG90aGVyIGFjdGl2aXRpZXMgbGlrZSBhdWRpbyBzaWduYWwgb3IgZGV0YWlsZWQgcmVwb3J0cworYXJlIG9uIHRoZSBzY3JpcHQgaXRzZWxmLgorCitPbmUgcXVlc3Rpb25hYmxlIHBvaW50IG9mIHRoZSBkZXNpZ24gaXMgbmV0bGluayB1c2FnZToKKworV2UgaGF2ZSAxIHNlY29uZCB0aW1lb3V0IGJ5IGRlZmF1bHQgdG8gcG9sbCB0aGUgbGluayBzdGF0dXMsCitpdCBpcyBzaG9ydCBlbm91Z2ggc28gdGhhdCB0aGVyZSBhcmUgbm8gcmVhbCBiZW5lZml0cyBpbgordXNpbmcgbmV0bGluayB0byBnZXQgImluc3RhbnRhbmVvdXMiIGludGVyZmFjZSBjcmVhdGlvbi9kZWxldGlvbgorbm90aWZpY2F0aW9ucy4gV2UgY2FuIGNoZWNrIGZvciBpbnRlcmZhY2UgZXhpc3RlbmNlIGJ5IGp1c3QKK2RvaW5nIHNvbWUgZmFzdCBpb2N0bCB1c2luZyBpdHMgbmFtZS4KKworTmV0bGluayBjb2RlIHRoZW4gY2FuIGJlIGp1c3QgZHJvcHBlZCAoMWsgb3IgbW9yZT8pCisqLworCisKKyNkZWZpbmUgSUZQTFVHRF9FTlZfUFJFVklPVVMgIklGUExVR0RfUFJFVklPVVMiCisjZGVmaW5lIElGUExVR0RfRU5WX0NVUlJFTlQgIklGUExVR0RfQ1VSUkVOVCIKKworZW51bSB7CisJRkxBR19OT19BVVRPCQkJPSAxIDw8ICAwLCAvLyAtYSwgRG8gbm90IGVuYWJsZSBpbnRlcmZhY2UgYXV0b21hdGljYWxseQorCUZMQUdfTk9fREFFTU9OCQkJPSAxIDw8ICAxLCAvLyAtbiwgRG8gbm90IGRhZW1vbml6ZQorCUZMQUdfTk9fU1lTTE9HCQkJPSAxIDw8ICAyLCAvLyAtcywgRG8gbm90IHVzZSBzeXNsb2csIHVzZSBzdGRlcnIgaW5zdGVhZAorCUZMQUdfSUdOT1JFX0ZBSUwJCT0gMSA8PCAgMywgLy8gLWYsIElnbm9yZSBkZXRlY3Rpb24gZmFpbHVyZSwgcmV0cnkgaW5zdGVhZCAoZmFpbHVyZSBpcyB0cmVhdGVkIGFzIERPV04pCisJRkxBR19JR05PUkVfRkFJTF9QT1NJVElWRQk9IDEgPDwgIDQsIC8vIC1GLCBJZ25vcmUgZGV0ZWN0aW9uIGZhaWx1cmUsIHJldHJ5IGluc3RlYWQgKGZhaWx1cmUgaXMgdHJlYXRlZCBhcyBVUCkKKwlGTEFHX0lGQUNFCQkJPSAxIDw8ICA1LCAvLyAtaSwgU3BlY2lmeSBldGhlcm5ldCBpbnRlcmZhY2UKKwlGTEFHX1JVTgkJCT0gMSA8PCAgNiwgLy8gLXIsIFNwZWNpZnkgcHJvZ3JhbSB0byBleGVjdXRlCisJRkxBR19JR05PUkVfUkVUVkFMCQk9IDEgPDwgIDcsIC8vIC1JLCBEb24ndCBleGl0IG9uIG5vbnplcm8gcmV0dXJuIHZhbHVlIG9mIHByb2dyYW0gZXhlY3V0ZWQKKwlGTEFHX1BPTExfVElNRQkJCT0gMSA8PCAgOCwgLy8gLXQsIFNwZWNpZnkgcG9sbCB0aW1lIGluIHNlY29uZHMKKwlGTEFHX0RFTEFZX1VQCQkJPSAxIDw8ICA5LCAvLyAtdSwgU3BlY2lmeSBkZWxheSBmb3IgY29uZmlndXJpbmcgaW50ZXJmYWNlCisJRkxBR19ERUxBWV9ET1dOCQkJPSAxIDw8IDEwLCAvLyAtZCwgU3BlY2lmeSBkZWxheSBmb3IgZGVjb25maWd1cmluZyBpbnRlcmZhY2UKKwlGTEFHX0FQSV9NT0RFCQkJPSAxIDw8IDExLCAvLyAtbSwgRm9yY2UgQVBJIG1vZGUgKG1paSwgcHJpdiwgZXRodG9vbCwgd2xhbiwgYXV0bykKKwlGTEFHX05PX1NUQVJUVVAJCQk9IDEgPDwgMTIsIC8vIC1wLCBEb24ndCBydW4gc2NyaXB0IG9uIGRhZW1vbiBzdGFydHVwCisJRkxBR19OT19TSFVURE9XTgkJPSAxIDw8IDEzLCAvLyAtcSwgRG9uJ3QgcnVuIHNjcmlwdCBvbiBkYWVtb24gcXVpdAorCUZMQUdfSU5JVElBTF9ET1dOCQk9IDEgPDwgMTQsIC8vIC1sLCBSdW4gImRvd24iIHNjcmlwdCBvbiBzdGFydHVwIGlmIG5vIGNhYmxlIGlzIGRldGVjdGVkCisJRkxBR19FWFRSQV9BUkcJCQk9IDEgPDwgMTUsIC8vIC14LCBTcGVjaWZ5IGFuIGV4dHJhIGFyZ3VtZW50IGZvciBhY3Rpb24gc2NyaXB0CisJRkxBR19NT05JVE9SCQkJPSAxIDw8IDE2LCAvLyAtTSwgVXNlIGludGVyZmFjZSBtb25pdG9yaW5nCisjaWYgRU5BQkxFX0ZFQVRVUkVfUElERklMRQorCUZMQUdfS0lMTAkJCT0gMSA8PCAxNywgLy8gLWssIEtpbGwgYSBydW5uaW5nIGRhZW1vbgorI2VuZGlmCit9OworI2lmIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUKKyMgZGVmaW5lIE9QVElPTl9TVFIgIithbnNmRmk6cjpJdDp1OmQ6bTpwcWx4Ok1rIgorI2Vsc2UKKyMgZGVmaW5lIE9QVElPTl9TVFIgIithbnNmRmk6cjpJdDp1OmQ6bTpwcWx4Ok0iCisjZW5kaWYKKworZW51bSB7IC8vIGludGVyZmFjZSBzdGF0dXMKKwlJRlNUQVRVU19FUlIgPSAtMSwKKwlJRlNUQVRVU19ET1dOID0gMCwKKwlJRlNUQVRVU19VUCA9IDEsCit9OworCitlbnVtIHsgLy8gY29uc3RhbnQgZmRzCisJaW9jdGxfZmQgPSAzLAorCW5ldGxpbmtfZmQgPSA0LAorfTsKKworc3RydWN0IGdsb2JhbHMgeworCXNtYWxsaW50IGlmYWNlX2xhc3Rfc3RhdHVzOworCXNtYWxsaW50IGlmYWNlX3ByZXZfc3RhdHVzOworCXNtYWxsaW50IGlmYWNlX2V4aXN0czsKKwlzbWFsbGludCBhcGlfbWV0aG9kX251bTsKKworCS8qIFVzZWQgaW4gZ2V0b3B0MzIsIG11c3QgaGF2ZSBzaXplb2YgPT0gc2l6ZW9mKGludCkgKi8KKwl1bnNpZ25lZCBwb2xsX3RpbWU7CisJdW5zaWduZWQgZGVsYXlfdXA7CisJdW5zaWduZWQgZGVsYXlfZG93bjsKKworCWNvbnN0IGNoYXIgKmlmYWNlOworCWNvbnN0IGNoYXIgKmFwaV9tb2RlOworCWNvbnN0IGNoYXIgKnNjcmlwdF9uYW1lOworCWNvbnN0IGNoYXIgKmV4dHJhX2FyZzsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlHLmlmYWNlX2xhc3Rfc3RhdHVzID0gLTE7IFwKKwlHLmlmYWNlX2V4aXN0cyAgID0gMTsgXAorCUcucG9sbF90aW1lICAgICAgPSAxOyBcCisJRy5kZWxheV9kb3duICAgICA9IDU7IFwKKwlHLmlmYWNlICAgICAgICAgID0gImV0aDAiOyBcCisJRy5hcGlfbW9kZSAgICAgICA9ICJhIjsgXAorCUcuc2NyaXB0X25hbWUgICAgPSAiL2V0Yy9pZnBsdWdkL2lmcGx1Z2QuYWN0aW9uIjsgXAorfSB3aGlsZSAoMCkKKworCisvKiBVdGlsaXR5IHJvdXRpbmVzICovCisKK3N0YXRpYyB2b2lkIHNldF9pZnJlcV90b19pZm5hbWUoc3RydWN0IGlmcmVxICppZnJlcSkKK3sKKwltZW1zZXQoaWZyZXEsIDAsIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmcmVxLT5pZnJfbmFtZSwgRy5pZmFjZSk7Cit9CisKK3N0YXRpYyBpbnQgbmV0d29ya19pb2N0bChpbnQgcmVxdWVzdCwgdm9pZCogZGF0YSwgY29uc3QgY2hhciAqZXJybXNnKQoreworCWludCByID0gaW9jdGwoaW9jdGxfZmQsIHJlcXVlc3QsIGRhdGEpOworCWlmIChyIDwgMCAmJiBlcnJtc2cpCisJCWJiX3BlcnJvcl9tc2coIiVzIGZhaWxlZCIsIGVycm1zZyk7CisJcmV0dXJuIHI7Cit9CisKKy8qIExpbmsgZGV0ZWN0aW9uIHJvdXRpbmVzIGFuZCB0YWJsZSAqLworCitzdGF0aWMgc21hbGxpbnQgZGV0ZWN0X2xpbmtfbWlpKHZvaWQpCit7CisJLyogY2hhciBidWZmZXIgaW5zdGVhZCBvZiBib25hLWZpZGUgc3RydWN0IGF2b2lkcyBhbGlhc2luZyB3YXJuaW5nICovCisJY2hhciBidWZbc2l6ZW9mKHN0cnVjdCBpZnJlcSldOworCXN0cnVjdCBpZnJlcSAqY29uc3QgaWZyZXEgPSAodm9pZCAqKWJ1ZjsKKworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpID0gKHZvaWQgKikmaWZyZXEtPmlmcl9kYXRhOworCisJc2V0X2lmcmVxX3RvX2lmbmFtZShpZnJlcSk7CisKKwlpZiAobmV0d29ya19pb2N0bChTSU9DR01JSVBIWSwgaWZyZXEsICJTSU9DR01JSVBIWSIpIDwgMCkgeworCQlyZXR1cm4gSUZTVEFUVVNfRVJSOworCX0KKworCW1paS0+cmVnX251bSA9IDE7CisKKwlpZiAobmV0d29ya19pb2N0bChTSU9DR01JSVJFRywgaWZyZXEsICJTSU9DR01JSVJFRyIpIDwgMCkgeworCQlyZXR1cm4gSUZTVEFUVVNfRVJSOworCX0KKworCXJldHVybiAobWlpLT52YWxfb3V0ICYgMHgwMDA0KSA/IElGU1RBVFVTX1VQIDogSUZTVEFUVVNfRE9XTjsKK30KKworc3RhdGljIHNtYWxsaW50IGRldGVjdF9saW5rX3ByaXYodm9pZCkKK3sKKwkvKiBjaGFyIGJ1ZmZlciBpbnN0ZWFkIG9mIGJvbmEtZmlkZSBzdHJ1Y3QgYXZvaWRzIGFsaWFzaW5nIHdhcm5pbmcgKi8KKwljaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGlmcmVxKV07CisJc3RydWN0IGlmcmVxICpjb25zdCBpZnJlcSA9ICh2b2lkICopYnVmOworCisJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWkgPSAodm9pZCAqKSZpZnJlcS0+aWZyX2RhdGE7CisKKwlzZXRfaWZyZXFfdG9faWZuYW1lKGlmcmVxKTsKKworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NERVZQUklWQVRFLCBpZnJlcSwgIlNJT0NERVZQUklWQVRFIikgPCAwKSB7CisJCXJldHVybiBJRlNUQVRVU19FUlI7CisJfQorCisJbWlpLT5yZWdfbnVtID0gMTsKKworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NERVZQUklWQVRFKzEsIGlmcmVxLCAiU0lPQ0RFVlBSSVZBVEUrMSIpIDwgMCkgeworCQlyZXR1cm4gSUZTVEFUVVNfRVJSOworCX0KKworCXJldHVybiAobWlpLT52YWxfb3V0ICYgMHgwMDA0KSA/IElGU1RBVFVTX1VQIDogSUZTVEFUVVNfRE9XTjsKK30KKworc3RhdGljIHNtYWxsaW50IGRldGVjdF9saW5rX2V0aHRvb2wodm9pZCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyZXE7CisJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGE7CisKKwlzZXRfaWZyZXFfdG9faWZuYW1lKCZpZnJlcSk7CisKKwllZGF0YS5jbWQgPSBFVEhUT09MX0dMSU5LOworCWlmcmVxLmlmcl9kYXRhID0gKHZvaWQqKSAmZWRhdGE7CisKKwlpZiAobmV0d29ya19pb2N0bChTSU9DRVRIVE9PTCwgJmlmcmVxLCAiRVRIVE9PTF9HTElOSyIpIDwgMCkgeworCQlyZXR1cm4gSUZTVEFUVVNfRVJSOworCX0KKworCXJldHVybiBlZGF0YS5kYXRhID8gSUZTVEFUVVNfVVAgOiBJRlNUQVRVU19ET1dOOworfQorCitzdGF0aWMgc21hbGxpbnQgZGV0ZWN0X2xpbmtfaWZmKHZvaWQpCit7CisJc3RydWN0IGlmcmVxIGlmcmVxOworCisJc2V0X2lmcmVxX3RvX2lmbmFtZSgmaWZyZXEpOworCisJaWYgKG5ldHdvcmtfaW9jdGwoU0lPQ0dJRkZMQUdTLCAmaWZyZXEsICJTSU9DR0lGRkxBR1MiKSA8IDApIHsKKwkJcmV0dXJuIElGU1RBVFVTX0VSUjsKKwl9CisKKwkvKiBJZiBJRkZfVVAgaXMgbm90IHNldCAoaW50ZXJmYWNlIGlzIGRvd24pLCBJRkZfUlVOTklORyBpcyBuZXZlciBzZXQKKwkgKiByZWdhcmRsZXNzIG9mIGxpbmsgc3RhdHVzLiBTaW1wbHkgY29udGludWUgdG8gcmVwb3J0IGxhc3Qgc3RhdHVzIC0KKwkgKiBubyBwb2ludCBpbiByZXBvcnRpbmcgc3B1cmlvdXMgbGluayBkb3ducyBpZiBpbnRlcmZhY2UgaXMgZGlzYWJsZWQKKwkgKiBieSBhZG1pbi4gV2hlbi9pZiBpdCB3aWxsIGJlIGJyb3VnaHQgdXAsCisJICogd2UnbGwgcmVwb3J0IHJlYWwgbGluayBzdGF0dXMuCisJICovCisJaWYgKCEoaWZyZXEuaWZyX2ZsYWdzICYgSUZGX1VQKSAmJiBHLmlmYWNlX2xhc3Rfc3RhdHVzICE9IElGU1RBVFVTX0VSUikKKwkJcmV0dXJuIEcuaWZhY2VfbGFzdF9zdGF0dXM7CisKKwlyZXR1cm4gKGlmcmVxLmlmcl9mbGFncyAmIElGRl9SVU5OSU5HKSA/IElGU1RBVFVTX1VQIDogSUZTVEFUVVNfRE9XTjsKK30KKworc3RhdGljIHNtYWxsaW50IGRldGVjdF9saW5rX3dsYW4odm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXdyZXEgaXdyZXF1ZXN0OworCXVpbnQ4X3QgbWFjW0VUSF9BTEVOXTsKKworCW1lbXNldCgmaXdyZXF1ZXN0LCAwLCBzaXplb2YoaXdyZXF1ZXN0KSk7CisJc3RybmNweV9JRk5BTVNJWihpd3JlcXVlc3QuaWZyX2lmcm4uaWZybl9uYW1lLCBHLmlmYWNlKTsKKworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NHSVdBUCwgJml3cmVxdWVzdCwgIlNJT0NHSVdBUCIpIDwgMCkgeworCQlyZXR1cm4gSUZTVEFUVVNfRVJSOworCX0KKworCW1lbWNweShtYWMsICZpd3JlcXVlc3QudS5hcF9hZGRyLnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCWlmIChtYWNbMF0gPT0gMHhGRiB8fCBtYWNbMF0gPT0gMHg0NCB8fCBtYWNbMF0gPT0gMHgwMCkgeworCQlmb3IgKGkgPSAxOyBpIDwgRVRIX0FMRU47ICsraSkgeworCQkJaWYgKG1hY1tpXSAhPSBtYWNbMF0pCisJCQkJcmV0dXJuIElGU1RBVFVTX1VQOworCQl9CisJCXJldHVybiBJRlNUQVRVU19ET1dOOworCX0KKworCXJldHVybiBJRlNUQVRVU19VUDsKK30KKworZW51bSB7IC8vIGFwaSBtb2RlCisJQVBJX0VUSFRPT0wsIC8vICdlJworCUFQSV9NSUksICAgICAvLyAnbScKKwlBUElfUFJJVkFURSwgLy8gJ3AnCisJQVBJX1dMQU4sICAgIC8vICd3JworCUFQSV9JRkYsICAgICAvLyAnaScKKwlBUElfQVVUTywgICAgLy8gJ2EnCit9OworCitzdGF0aWMgY29uc3QgY2hhciBhcGlfbW9kZXNbXSBBTElHTjEgPSAiZW1wd2lhIjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzbWFsbGludCAoKmZ1bmMpKHZvaWQpOworfSBtZXRob2RfdGFibGVbXSA9IHsKKwl7ICJTSU9DRVRIVE9PTCIgICAgICAgLCAmZGV0ZWN0X2xpbmtfZXRodG9vbCB9LAorCXsgIlNJT0NHTUlJUEhZIiAgICAgICAsICZkZXRlY3RfbGlua19taWkgICAgIH0sCisJeyAiU0lPQ0RFVlBSSVZBVEUiICAgICwgJmRldGVjdF9saW5rX3ByaXYgICAgfSwKKwl7ICJ3aXJlbGVzcyBleHRlbnNpb24iLCAmZGV0ZWN0X2xpbmtfd2xhbiAgICB9LAorCXsgIklGRl9SVU5OSU5HIiAgICAgICAsICZkZXRlY3RfbGlua19pZmYgICAgIH0sCit9OworCisKKworc3RhdGljIGNvbnN0IGNoYXIgKnN0cnN0YXR1cyhpbnQgc3RhdHVzKQoreworCWlmIChzdGF0dXMgPT0gSUZTVEFUVVNfRVJSKQorCQlyZXR1cm4gImVycm9yIjsKKwlyZXR1cm4gImRvd25cMHVwIiArIChzdGF0dXMgKiA1KTsKK30KKworc3RhdGljIGludCBydW5fc2NyaXB0KGNvbnN0IGNoYXIgKmFjdGlvbikKK3sKKwljaGFyICplbnZfUFJFVklPVVMsICplbnZfQ1VSUkVOVDsKKwljaGFyICphcmd2WzVdOworCWludCByOworCisJYmJfZXJyb3JfbXNnKCJleGVjdXRpbmcgJyVzICVzICVzJyIsIEcuc2NyaXB0X25hbWUsIEcuaWZhY2UsIGFjdGlvbik7CisKKwlhcmd2WzBdID0gKGNoYXIqKSBHLnNjcmlwdF9uYW1lOworCWFyZ3ZbMV0gPSAoY2hhciopIEcuaWZhY2U7CisJYXJndlsyXSA9IChjaGFyKikgYWN0aW9uOworCWFyZ3ZbM10gPSAoY2hhciopIEcuZXh0cmFfYXJnOworCWFyZ3ZbNF0gPSBOVUxMOworCisJZW52X1BSRVZJT1VTID0geGFzcHJpbnRmKCIlcz0lcyIsIElGUExVR0RfRU5WX1BSRVZJT1VTLCBzdHJzdGF0dXMoRy5pZmFjZV9wcmV2X3N0YXR1cykpOworCXB1dGVudihlbnZfUFJFVklPVVMpOworCWVudl9DVVJSRU5UID0geGFzcHJpbnRmKCIlcz0lcyIsIElGUExVR0RfRU5WX0NVUlJFTlQsIHN0cnN0YXR1cyhHLmlmYWNlX2xhc3Rfc3RhdHVzKSk7CisJcHV0ZW52KGVudl9DVVJSRU5UKTsKKworCS8qIHIgPCAwIC0gY2FuJ3QgZXhlYywgMCA8PSByIDwgMHgxODAgLSBleGl0ZWQsID49MHgxODAgLSBraWxsZWQgYnkgc2lnIChyLTB4MTgwKSAqLworCXIgPSBzcGF3bl9hbmRfd2FpdChhcmd2KTsKKworCXVuc2V0ZW52KElGUExVR0RfRU5WX1BSRVZJT1VTKTsKKwl1bnNldGVudihJRlBMVUdEX0VOVl9DVVJSRU5UKTsKKwlmcmVlKGVudl9QUkVWSU9VUyk7CisJZnJlZShlbnZfQ1VSUkVOVCk7CisKKwliYl9lcnJvcl9tc2coImV4aXQgY29kZTogJWQiLCByICYgMHhmZik7CisJcmV0dXJuIChvcHRpb25fbWFzazMyICYgRkxBR19JR05PUkVfUkVUVkFMKSA/IDAgOiByOworfQorCitzdGF0aWMgdm9pZCB1cF9pZmFjZSh2b2lkKQoreworCXN0cnVjdCBpZnJlcSBpZnJlcXVlc3Q7CisKKwlpZiAoIUcuaWZhY2VfZXhpc3RzKQorCQlyZXR1cm47CisKKwlzZXRfaWZyZXFfdG9faWZuYW1lKCZpZnJlcXVlc3QpOworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NHSUZGTEFHUywgJmlmcmVxdWVzdCwgImdldHRpbmcgaW50ZXJmYWNlIGZsYWdzIikgPCAwKSB7CisJCUcuaWZhY2VfZXhpc3RzID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmICghKGlmcmVxdWVzdC5pZnJfZmxhZ3MgJiBJRkZfVVApKSB7CisJCWlmcmVxdWVzdC5pZnJfZmxhZ3MgfD0gSUZGX1VQOworCQkvKiBMZXQgdXNlciBrbm93IHdlIG1lc3MgdXAgd2l0aCBpbnRlcmZhY2UgKi8KKwkJYmJfZXJyb3JfbXNnKCJ1cHBpbmcgaW50ZXJmYWNlIik7CisJCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NTSUZGTEFHUywgJmlmcmVxdWVzdCwgInNldHRpbmcgaW50ZXJmYWNlIGZsYWdzIikgPCAwKQorCQkJeGZ1bmNfZGllKCk7CisJfQorCisjaWYgMCAvKiB3aHkgZG8gd2UgbWVzcyB3aXRoIElQIGFkZHI/IEl0J3Mgbm90IG91ciBidXNpbmVzcyAqLworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NHSUZBRERSLCAmaWZyZXF1ZXN0LCAiY2FuJ3QgZ2V0IGludGVyZmFjZSBhZGRyZXNzIikgPCAwKSB7CisJfSBlbHNlIGlmIChpZnJlcXVlc3QuaWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJYmJfcGVycm9yX21zZygidGhlIGludGVyZmFjZSBpcyBub3QgSVAtYmFzZWQiKTsKKwl9IGVsc2UgeworCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiopKCZpZnJlcXVlc3QuaWZyX2FkZHIpKS0+c2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKwkJbmV0d29ya19pb2N0bChTSU9DU0lGQUREUiwgJmlmcmVxdWVzdCwgImNhbid0IHNldCBpbnRlcmZhY2UgYWRkcmVzcyIpOworCX0KKwluZXR3b3JrX2lvY3RsKFNJT0NHSUZGTEFHUywgJmlmcmVxdWVzdCwgImNhbid0IGdldCBpbnRlcmZhY2UgZmxhZ3MiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBtYXliZV91cF9uZXdfaWZhY2Uodm9pZCkKK3sKKwlpZiAoIShvcHRpb25fbWFzazMyICYgRkxBR19OT19BVVRPKSkKKwkJdXBfaWZhY2UoKTsKKworI2lmIDAgLyogYmxvYXQgKi8KKwlzdHJ1Y3QgaWZyZXEgaWZyZXF1ZXN0OworCXN0cnVjdCBldGh0b29sX2RydmluZm8gZHJpdmVyX2luZm87CisKKwlzZXRfaWZyZXFfdG9faWZuYW1lKCZpZnJlcXVlc3QpOworCWRyaXZlcl9pbmZvLmNtZCA9IEVUSFRPT0xfR0RSVklORk87CisJaWZyZXF1ZXN0Lmlmcl9kYXRhID0gJmRyaXZlcl9pbmZvOworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NFVEhUT09MLCAmaWZyZXF1ZXN0LCBOVUxMKSA9PSAwKSB7CisJCWNoYXIgYnVmW3NpemVvZigiL3h4Onh4Onh4Onh4Onh4Onh4IildOworCisJCS8qIEdldCBNQUMgKi8KKwkJYnVmWzBdID0gJ1wwJzsKKwkJc2V0X2lmcmVxX3RvX2lmbmFtZSgmaWZyZXF1ZXN0KTsKKwkJaWYgKG5ldHdvcmtfaW9jdGwoU0lPQ0dJRkhXQUREUiwgJmlmcmVxdWVzdCwgTlVMTCkgPT0gMCkgeworCQkJc3ByaW50ZihidWYsICIvJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAorCQkJCSh1aW50OF90KShpZnJlcXVlc3QuaWZyX2h3YWRkci5zYV9kYXRhWzBdKSwKKwkJCQkodWludDhfdCkoaWZyZXF1ZXN0Lmlmcl9od2FkZHIuc2FfZGF0YVsxXSksCisJCQkJKHVpbnQ4X3QpKGlmcmVxdWVzdC5pZnJfaHdhZGRyLnNhX2RhdGFbMl0pLAorCQkJCSh1aW50OF90KShpZnJlcXVlc3QuaWZyX2h3YWRkci5zYV9kYXRhWzNdKSwKKwkJCQkodWludDhfdCkoaWZyZXF1ZXN0Lmlmcl9od2FkZHIuc2FfZGF0YVs0XSksCisJCQkJKHVpbnQ4X3QpKGlmcmVxdWVzdC5pZnJfaHdhZGRyLnNhX2RhdGFbNV0pKTsKKwkJfQorCisJCWJiX2Vycm9yX21zZygidXNpbmcgaW50ZXJmYWNlICVzJXMgd2l0aCBkcml2ZXI8JXM+ICh2ZXJzaW9uOiAlcykiLAorCQkJRy5pZmFjZSwgYnVmLCBkcml2ZXJfaW5mby5kcml2ZXIsIGRyaXZlcl9pbmZvLnZlcnNpb24pOworCX0KKyNlbmRpZgorCWlmIChHLmFwaV9tb2RlWzBdID09ICdhJykKKwkJRy5hcGlfbWV0aG9kX251bSA9IEFQSV9BVVRPOworfQorCitzdGF0aWMgc21hbGxpbnQgZGV0ZWN0X2xpbmsodm9pZCkKK3sKKwlzbWFsbGludCBzdGF0dXM7CisKKwlpZiAoIUcuaWZhY2VfZXhpc3RzKQorCQlyZXR1cm4gKG9wdGlvbl9tYXNrMzIgJiBGTEFHX01PTklUT1IpID8gSUZTVEFUVVNfRE9XTiA6IElGU1RBVFVTX0VSUjsKKworCS8qIFNvbWUgZHJpdmVycyBjYW4ndCBkZXRlY3QgbGluayBzdGF0dXMgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGRvd24uCisJICogSSBpbWFnaW5lIGRldGVjdF9saW5rX2lmZigpIGlzIHRoZSBtb3N0IHZ1bG5lcmFibGUuCisJICogVGhhdCdzIHdoeSAtYSAibm9hdXRvIiBpbiBhbiBvcHRpb24sIG5vdCBhIGhhcmR3aXJlZCBiZWhhdmlvci4KKwkgKi8KKwlpZiAoIShvcHRpb25fbWFzazMyICYgRkxBR19OT19BVVRPKSkKKwkJdXBfaWZhY2UoKTsKKworCWlmIChHLmFwaV9tZXRob2RfbnVtID09IEFQSV9BVVRPKSB7CisJCWludCBpOworCQlzbWFsbGludCBzdl9sb2dtb2RlOworCisJCXN2X2xvZ21vZGUgPSBsb2dtb2RlOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZXRob2RfdGFibGUpOyBpKyspIHsKKwkJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJCQlzdGF0dXMgPSBtZXRob2RfdGFibGVbaV0uZnVuYygpOworCQkJbG9nbW9kZSA9IHN2X2xvZ21vZGU7CisJCQlpZiAoc3RhdHVzICE9IElGU1RBVFVTX0VSUikgeworCQkJCUcuYXBpX21ldGhvZF9udW0gPSBpOworCQkJCWJiX2Vycm9yX21zZygidXNpbmcgJXMgZGV0ZWN0aW9uIG1vZGUiLCBtZXRob2RfdGFibGVbaV0ubmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSBtZXRob2RfdGFibGVbRy5hcGlfbWV0aG9kX251bV0uZnVuYygpOworCX0KKworCWlmIChzdGF0dXMgPT0gSUZTVEFUVVNfRVJSKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19JR05PUkVfRkFJTCkKKwkJCXN0YXR1cyA9IElGU1RBVFVTX0RPV047CisJCWVsc2UgaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX0lHTk9SRV9GQUlMX1BPU0lUSVZFKQorCQkJc3RhdHVzID0gSUZTVEFUVVNfVVA7CisJCWVsc2UgaWYgKEcuYXBpX21vZGVbMF0gPT0gJ2EnKQorCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBkZXRlY3QgbGluayBzdGF0dXMiKTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IEcuaWZhY2VfbGFzdF9zdGF0dXMpIHsKKwkJRy5pZmFjZV9wcmV2X3N0YXR1cyA9IEcuaWZhY2VfbGFzdF9zdGF0dXM7CisJCUcuaWZhY2VfbGFzdF9zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIE5PSU5MSU5FIGludCBjaGVja19leGlzdGVuY2VfdGhyb3VnaF9uZXRsaW5rKHZvaWQpCit7CisJaW50IGlmYWNlX2xlbjsKKwljaGFyIHJlcGx5YnVmWzEwMjRdOworCisJaWZhY2VfbGVuID0gc3RybGVuKEcuaWZhY2UpOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBubG1zZ2hkciAqbWhkcjsKKwkJc3NpemVfdCBieXRlczsKKworCQlieXRlcyA9IHJlY3YobmV0bGlua19mZCwgJnJlcGx5YnVmLCBzaXplb2YocmVwbHlidWYpLCBNU0dfRE9OVFdBSVQpOworCQlpZiAoYnl0ZXMgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUFHQUlOKQorCQkJCXJldHVybiBHLmlmYWNlX2V4aXN0czsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKworCQkJYmJfcGVycm9yX21zZygibmV0bGluazogcmVjdiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbWhkciA9IChzdHJ1Y3Qgbmxtc2doZHIqKXJlcGx5YnVmOworCQl3aGlsZSAoYnl0ZXMgPiAwKSB7CisJCQlpZiAoIU5MTVNHX09LKG1oZHIsIGJ5dGVzKSkgeworCQkJCWJiX2Vycm9yX21zZygibmV0bGluayBwYWNrZXQgdG9vIHNtYWxsIG9yIHRydW5jYXRlZCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJaWYgKG1oZHItPm5sbXNnX3R5cGUgPT0gUlRNX05FV0xJTksgfHwgbWhkci0+bmxtc2dfdHlwZSA9PSBSVE1fREVMTElOSykgeworCQkJCXN0cnVjdCBydGF0dHIgKmF0dHI7CisJCQkJaW50IGF0dHJfbGVuOworCisJCQkJaWYgKG1oZHItPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpKSB7CisJCQkJCWJiX2Vycm9yX21zZygibmV0bGluayBwYWNrZXQgdG9vIHNtYWxsIG9yIHRydW5jYXRlZCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCisJCQkJYXR0ciA9IElGTEFfUlRBKE5MTVNHX0RBVEEobWhkcikpOworCQkJCWF0dHJfbGVuID0gSUZMQV9QQVlMT0FEKG1oZHIpOworCisJCQkJd2hpbGUgKFJUQV9PSyhhdHRyLCBhdHRyX2xlbikpIHsKKwkJCQkJaWYgKGF0dHItPnJ0YV90eXBlID09IElGTEFfSUZOQU1FKSB7CisJCQkJCQlpbnQgbGVuID0gUlRBX1BBWUxPQUQoYXR0cik7CisJCQkJCQlpZiAobGVuID4gSUZOQU1TSVopCisJCQkJCQkJbGVuID0gSUZOQU1TSVo7CisJCQkJCQlpZiAoaWZhY2VfbGVuIDw9IGxlbgorCQkJCQkJICYmIHN0cm5jbXAoRy5pZmFjZSwgUlRBX0RBVEEoYXR0ciksIGxlbikgPT0gMAorCQkJCQkJKSB7CisJCQkJCQkJRy5pZmFjZV9leGlzdHMgPSAobWhkci0+bmxtc2dfdHlwZSA9PSBSVE1fTkVXTElOSyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYXR0ciA9IFJUQV9ORVhUKGF0dHIsIGF0dHJfbGVuKTsKKwkJCQl9CisJCQl9CisKKwkJCW1oZHIgPSBOTE1TR19ORVhUKG1oZHIsIGJ5dGVzKTsKKwkJfQorCX0KKworCXJldHVybiBHLmlmYWNlX2V4aXN0czsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUKK3N0YXRpYyBOT0lOTElORSBwaWRfdCByZWFkX3BpZChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgbGVuOworCWNoYXIgYnVmWzEyOF07CisKKwlsZW4gPSBvcGVuX3JlYWRfY2xvc2UoZmlsZW5hbWUsIGJ1ZiwgMTI3KTsKKwlpZiAobGVuID4gMCkgeworCQlidWZbbGVuXSA9ICdcMCc7CisJCS8qIHJldHVybnMgVUxPTkdfTUFYIG9uIGVycm9yID0+IC0xICovCisJCXJldHVybiBiYl9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgaWZwbHVnZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaWZwbHVnZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGlmYWNlX3N0YXR1czsKKwlpbnQgZGVsYXlfdGltZTsKKwljb25zdCBjaGFyICppZmFjZV9zdGF0dXNfc3RyOworCXN0cnVjdCBwb2xsZmQgbmV0bGlua19wb2xsZmRbMV07CisJdW5zaWduZWQgb3B0czsKKwljb25zdCBjaGFyICphcGlfbW9kZV9mb3VuZDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFCisJY2hhciAqcGlkZmlsZV9uYW1lOworCXBpZF90IHBpZF9mcm9tX3BpZGZpbGU7CisjZW5kaWYKKworCUlOSVRfRygpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidCs6dSs6ZCsiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCBPUFRJT05fU1RSLAorCQkmRy5pZmFjZSwgJkcuc2NyaXB0X25hbWUsICZHLnBvbGxfdGltZSwgJkcuZGVsYXlfdXAsCisJCSZHLmRlbGF5X2Rvd24sICZHLmFwaV9tb2RlLCAmRy5leHRyYV9hcmcpOworCUcucG9sbF90aW1lICo9IDEwMDA7CisKKwlhcHBsZXRfbmFtZSA9IHhhc3ByaW50ZigiaWZwbHVnZCglcykiLCBHLmlmYWNlKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUKKwlwaWRmaWxlX25hbWUgPSB4YXNwcmludGYoX1BBVEhfVkFSUlVOImlmcGx1Z2QuJXMucGlkIiwgRy5pZmFjZSk7CisJcGlkX2Zyb21fcGlkZmlsZSA9IHJlYWRfcGlkKHBpZGZpbGVfbmFtZSk7CisKKwlpZiAob3B0cyAmIEZMQUdfS0lMTCkgeworCQlpZiAocGlkX2Zyb21fcGlkZmlsZSA+IDApCisJCQlraWxsKHBpZF9mcm9tX3BpZGZpbGUsIFNJR1FVSVQpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCWlmIChwaWRfZnJvbV9waWRmaWxlID4gMCAmJiBraWxsKHBpZF9mcm9tX3BpZGZpbGUsIDApID09IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkYWVtb24gYWxyZWFkeSBydW5uaW5nIik7CisjZW5kaWYKKworCWFwaV9tb2RlX2ZvdW5kID0gc3RyY2hyKGFwaV9tb2RlcywgRy5hcGlfbW9kZVswXSk7CisJaWYgKCFhcGlfbW9kZV9mb3VuZCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gQVBJIG1vZGUgJyVzJyIsIEcuYXBpX21vZGUpOworCUcuYXBpX21ldGhvZF9udW0gPSBhcGlfbW9kZV9mb3VuZCAtIGFwaV9tb2RlczsKKworCWlmICghKG9wdHMgJiBGTEFHX05PX0RBRU1PTikpCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fQ0hESVJfUk9PVCwgYXJndik7CisKKwl4bW92ZV9mZCh4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApLCBpb2N0bF9mZCk7CisJaWYgKG9wdHMgJiBGTEFHX01PTklUT1IpIHsKKwkJc3RydWN0IHNvY2thZGRyX25sIGFkZHI7CisJCWludCBmZCA9IHhzb2NrZXQoUEZfTkVUTElOSywgU09DS19ER1JBTSwgTkVUTElOS19ST1VURSk7CisKKwkJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCQlhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJCWFkZHIubmxfZ3JvdXBzID0gUlRNR1JQX0xJTks7CisJCWFkZHIubmxfcGlkID0gZ2V0cGlkKCk7CisKKwkJeGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBzaXplb2YoYWRkcikpOworCQl4bW92ZV9mZChmZCwgbmV0bGlua19mZCk7CisJfQorCisJd3JpdGVfcGlkZmlsZShwaWRmaWxlX25hbWUpOworCisJLyogdGhpcyBjYW4ndCBiZSBtb3ZlZCBiZWZvcmUgc29ja2V0IGNyZWF0aW9uICovCisJaWYgKCEob3B0cyAmIEZMQUdfTk9fU1lTTE9HKSkgeworCQlvcGVubG9nKGFwcGxldF9uYW1lLCAwLCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKKwl9CisKKwliYl9zaWduYWxzKDAKKwkJfCAoMSA8PCBTSUdJTlQgKQorCQl8ICgxIDw8IFNJR1RFUk0pCisJCXwgKDEgPDwgU0lHUVVJVCkKKwkJfCAoMSA8PCBTSUdIVVAgKSAvKiB3aHkgd2UgaWdub3JlIGl0PyAqLworCQkvKiB8ICgxIDw8IFNJR0NITEQpIC0gcnVuX3NjcmlwdCBkb2VzIG5vdCB1c2UgaXQgYW55bW9yZSAqLworCQksIHJlY29yZF9zaWdubyk7CisKKwliYl9lcnJvcl9tc2coInN0YXJ0ZWQ6ICVzIiwgYmJfYmFubmVyKTsKKworCWlmIChvcHRzICYgRkxBR19NT05JVE9SKSB7CisJCXN0cnVjdCBpZnJlcSBpZnJlcXVlc3Q7CisJCXNldF9pZnJlcV90b19pZm5hbWUoJmlmcmVxdWVzdCk7CisJCUcuaWZhY2VfZXhpc3RzID0gKG5ldHdvcmtfaW9jdGwoU0lPQ0dJRklOREVYLCAmaWZyZXF1ZXN0LCBOVUxMKSA9PSAwKTsKKwl9CisKKwlpZiAoRy5pZmFjZV9leGlzdHMpCisJCW1heWJlX3VwX25ld19pZmFjZSgpOworCisJaWZhY2Vfc3RhdHVzID0gZGV0ZWN0X2xpbmsoKTsKKwlpZiAoaWZhY2Vfc3RhdHVzID09IElGU1RBVFVTX0VSUikKKwkJZ290byBleGl0aW5nOworCWlmYWNlX3N0YXR1c19zdHIgPSBzdHJzdGF0dXMoaWZhY2Vfc3RhdHVzKTsKKworCWlmIChvcHRzICYgRkxBR19NT05JVE9SKSB7CisJCWJiX2Vycm9yX21zZygiaW50ZXJmYWNlICVzIiwKKwkJCUcuaWZhY2VfZXhpc3RzID8gImV4aXN0cyIKKwkJCTogImRvZXNuJ3QgZXhpc3QsIHdhaXRpbmciKTsKKwl9CisJLyogZWxzZSB3ZSBhc3N1bWUgaXQgYWx3YXlzIGV4aXN0cywgYnV0IGRvbid0IG1pc2xlYWQgdXNlcgorCSAqIGJ5IHBvdGVudGlhbGx5IGx5aW5nIHRoYXQgaXQgcmVhbGx5IGV4aXN0cyAqLworCisJaWYgKEcuaWZhY2VfZXhpc3RzKSB7CisJCWJiX2Vycm9yX21zZygibGluayBpcyAlcyIsIGlmYWNlX3N0YXR1c19zdHIpOworCX0KKworCWlmICgoIShvcHRzICYgRkxBR19OT19TVEFSVFVQKQorCSAgICAgJiYgaWZhY2Vfc3RhdHVzID09IElGU1RBVFVTX1VQCisJICAgICkKKwkgfHwgKG9wdHMgJiBGTEFHX0lOSVRJQUxfRE9XTikKKwkpIHsKKwkJaWYgKHJ1bl9zY3JpcHQoaWZhY2Vfc3RhdHVzX3N0cikgIT0gMCkKKwkJCWdvdG8gZXhpdGluZzsKKwl9CisKKwkvKiBNYWluIGxvb3AgKi8KKwluZXRsaW5rX3BvbGxmZFswXS5mZCA9IG5ldGxpbmtfZmQ7CisJbmV0bGlua19wb2xsZmRbMF0uZXZlbnRzID0gUE9MTElOOworCWRlbGF5X3RpbWUgPSAwOworCXdoaWxlICgxKSB7CisJCWludCBpZmFjZV9zdGF0dXNfb2xkOworCQlpbnQgaWZhY2VfZXhpc3RzX29sZDsKKworCQlzd2l0Y2ggKGJiX2dvdF9zaWduYWwpIHsKKwkJY2FzZSBTSUdJTlQ6CisJCWNhc2UgU0lHVEVSTToKKwkJCWJiX2dvdF9zaWduYWwgPSAwOworCQkJZ290byBjbGVhbnVwOworCQljYXNlIFNJR1FVSVQ6CisJCQliYl9nb3Rfc2lnbmFsID0gMDsKKwkJCWdvdG8gZXhpdGluZzsKKwkJZGVmYXVsdDoKKwkJCWJiX2dvdF9zaWduYWwgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocG9sbChuZXRsaW5rX3BvbGxmZCwKKwkJCQkob3B0cyAmIEZMQUdfTU9OSVRPUikgPyAxIDogMCwKKwkJCQlHLnBvbGxfdGltZQorCQkJKSA8IDAKKwkJKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQliYl9wZXJyb3JfbXNnKCJwb2xsIik7CisJCQlnb3RvIGV4aXRpbmc7CisJCX0KKworCQlpZmFjZV9zdGF0dXNfb2xkID0gaWZhY2Vfc3RhdHVzOworCQlpZmFjZV9leGlzdHNfb2xkID0gRy5pZmFjZV9leGlzdHM7CisKKwkJaWYgKChvcHRzICYgRkxBR19NT05JVE9SKQorCQkgJiYgKG5ldGxpbmtfcG9sbGZkWzBdLnJldmVudHMgJiBQT0xMSU4pCisJCSkgeworCQkJRy5pZmFjZV9leGlzdHMgPSBjaGVja19leGlzdGVuY2VfdGhyb3VnaF9uZXRsaW5rKCk7CisJCQlpZiAoRy5pZmFjZV9leGlzdHMgPCAwKSAvKiBlcnJvciAqLworCQkJCWdvdG8gZXhpdGluZzsKKwkJCWlmIChpZmFjZV9leGlzdHNfb2xkICE9IEcuaWZhY2VfZXhpc3RzKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJpbnRlcmZhY2UgJXNhcHBlYXJlZCIsCisJCQkJCQlHLmlmYWNlX2V4aXN0cyA/ICIiIDogImRpcyIpOworCQkJCWlmIChHLmlmYWNlX2V4aXN0cykKKwkJCQkJbWF5YmVfdXBfbmV3X2lmYWNlKCk7CisJCQl9CisJCX0KKworCQkvKiBub3RlOiBpZiAhRy5pZmFjZV9leGlzdHMsIHJldHVybnMgRE9XTiAqLworCQlpZmFjZV9zdGF0dXMgPSBkZXRlY3RfbGluaygpOworCQlpZiAoaWZhY2Vfc3RhdHVzID09IElGU1RBVFVTX0VSUikgeworCQkJaWYgKCEob3B0cyAmIEZMQUdfTU9OSVRPUikpCisJCQkJZ290byBleGl0aW5nOworCQkJaWZhY2Vfc3RhdHVzID0gSUZTVEFUVVNfRE9XTjsKKwkJfQorCQlpZmFjZV9zdGF0dXNfc3RyID0gc3Ryc3RhdHVzKGlmYWNlX3N0YXR1cyk7CisKKwkJaWYgKGlmYWNlX3N0YXR1c19vbGQgIT0gaWZhY2Vfc3RhdHVzKSB7CisJCQliYl9lcnJvcl9tc2coImxpbmsgaXMgJXMiLCBpZmFjZV9zdGF0dXNfc3RyKTsKKworCQkJaWYgKGRlbGF5X3RpbWUpIHsKKwkJCQkvKiBsaW5rIHJlc3RvcmVkIGl0cyBvbGQgc3RhdHVzIGJlZm9yZQorCQkJCSAqIHdlIHJ1biBzY3JpcHQuIGRvbid0IHJ1biB0aGUgc2NyaXB0OiAqLworCQkJCWRlbGF5X3RpbWUgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlkZWxheV90aW1lID0gbW9ub3RvbmljX3NlYygpOworCQkJCWlmIChpZmFjZV9zdGF0dXMgPT0gSUZTVEFUVVNfVVApCisJCQkJCWRlbGF5X3RpbWUgKz0gRy5kZWxheV91cDsKKwkJCQlpZiAoaWZhY2Vfc3RhdHVzID09IElGU1RBVFVTX0RPV04pCisJCQkJCWRlbGF5X3RpbWUgKz0gRy5kZWxheV9kb3duOworCQkJCWlmIChkZWxheV90aW1lID09IDApCisJCQkJCWRlbGF5X3RpbWUrKzsKKwkJCX0KKwkJfQorCisJCWlmIChkZWxheV90aW1lICYmIChpbnQpKG1vbm90b25pY19zZWMoKSAtIGRlbGF5X3RpbWUpID49IDApIHsKKwkJCWRlbGF5X3RpbWUgPSAwOworCQkJaWYgKHJ1bl9zY3JpcHQoaWZhY2Vfc3RhdHVzX3N0cikgIT0gMCkKKwkJCQlnb3RvIGV4aXRpbmc7CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworCisgY2xlYW51cDoKKwlpZiAoIShvcHRzICYgRkxBR19OT19TSFVURE9XTikKKwkgJiYgKGlmYWNlX3N0YXR1cyA9PSBJRlNUQVRVU19VUAorCSAgICAgfHwgKGlmYWNlX3N0YXR1cyA9PSBJRlNUQVRVU19ET1dOICYmIGRlbGF5X3RpbWUpCisJICAgICkKKwkpIHsKKwkJc2V0ZW52KElGUExVR0RfRU5WX1BSRVZJT1VTLCBzdHJzdGF0dXMoaWZhY2Vfc3RhdHVzKSwgMSk7CisJCXNldGVudihJRlBMVUdEX0VOVl9DVVJSRU5ULCBzdHJzdGF0dXMoLTEpLCAxKTsKKwkJcnVuX3NjcmlwdCgiZG93blwwdXAiKTsgLyogcmV1c2luZyBzdHJpbmcgKi8KKwl9CisKKyBleGl0aW5nOgorCXJlbW92ZV9waWRmaWxlKHBpZGZpbGVfbmFtZSk7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImV4aXRpbmciKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaWZ1cGRvd24uYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaWZ1cGRvd24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODIwMzMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pZnVwZG93bi5jCkBAIC0wLDAgKzEsMTM1MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIGlmdXBkb3duIGZvciBidXN5Ym94CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIEdsZW5uIE1jR3JhdGgKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogIEJhc2VkIG9uIGlmdXBkb3duIHYgMC42LjQgYnkgQW50aG9ueSBUb3ducworICogIENvcHlyaWdodCAoYykgMTk5OSBBbnRob255IFRvd25zIDxhakBhenVyZS5odW1idWcub3JnLmF1PgorICoKKyAqICBDaGFuZ2VzIHRvIHVwc3RyZWFtIHZlcnNpb24KKyAqICBSZW1vdmUgY2hlY2tzIGZvciBrZXJuZWwgdmVyc2lvbiwgYXNzdW1lIGtlcm5lbCB2ZXJzaW9uIDIuMi4wIG9yIGJldHRlci4KKyAqICBMaW5lcyBpbiB0aGUgaW50ZXJmYWNlcyBmaWxlIGNhbm5vdCB3cmFwLgorICogIFRvIGFkaGVyZSB0byB0aGUgRkhTLCB0aGUgZGVmYXVsdCBzdGF0ZSBmaWxlIGlzIC92YXIvcnVuL2lmc3RhdGUKKyAqICAoZGVmaW5lZCB2aWEgQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSCkgYW5kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGJ1aWxkCisgKiAgY29uZmlndXJhdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpZnVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFuIklGX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORygibSIpInZmXSBbLWkgRklMRV0gSUZBQ0UuLi4iCisvL3VzYWdlOiNkZWZpbmUgaWZ1cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktYQlEZS9jb25maWd1cmUgYWxsIGludGVyZmFjZXMgYXV0b21hdGljYWxseSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkgRklMRQlVc2UgRklMRSBmb3IgaW50ZXJmYWNlIGRlZmluaXRpb25zIgorLy91c2FnZTogICAgICJcbgktbglQcmludCBvdXQgd2hhdCB3b3VsZCBoYXBwZW4sIGJ1dCBkb24ndCBkbyBpdCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORygKKy8vdXNhZ2U6ICAgICAiXG4JCShub3RlOiBkb2Vzbid0IGRpc2FibGUgbWFwcGluZ3MpIgorLy91c2FnZTogICAgICJcbgktbQlEb24ndCBydW4gYW55IG1hcHBpbmdzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktdglQcmludCBvdXQgd2hhdCB3b3VsZCBoYXBwZW4gYmVmb3JlIGRvaW5nIGl0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSBkZS9jb25maWd1cmF0aW9uIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBpZmRvd25fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYW4iSUZfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HKCJtIikidmZdIFstaSBGSUxFXSBJRkFDRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBpZmRvd25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWEJRGUvY29uZmlndXJlIGFsbCBpbnRlcmZhY2VzIGF1dG9tYXRpY2FsbHkiCisvL3VzYWdlOiAgICAgIlxuCS1pIEZJTEUJVXNlIEZJTEUgZm9yIGludGVyZmFjZSBkZWZpbml0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpbnQgb3V0IHdoYXQgd291bGQgaGFwcGVuLCBidXQgZG9uJ3QgZG8gaXQiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcoCisvL3VzYWdlOiAgICAgIlxuCQkobm90ZTogZG9lc24ndCBkaXNhYmxlIG1hcHBpbmdzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JRG9uJ3QgcnVuIGFueSBtYXBwaW5ncyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXYJUHJpbnQgb3V0IHdoYXQgd291bGQgaGFwcGVuIGJlZm9yZSBkb2luZyBpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgZGUvY29uZmlndXJhdGlvbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBBZnRlciBsaWJiYi5oLCBzaW5jZSBpdCBuZWVkcyBzeXMvdHlwZXMuaCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKworI2RlZmluZSBNQVhfT1BUX0RFUFRIIDEwCisjZGVmaW5lIEVVTkJBTEJSQUNLIDEwMDAxCisjZGVmaW5lIEVVTkRFRlZBUiAgIDEwMDAyCisjZGVmaW5lIEVVTkJBTFBFUiAgIDEwMDAwCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HCisjZGVmaW5lIE1BWF9JTlRFUkZBQ0VfTEVOR1RIIDEwCisjZW5kaWYKKworI2RlZmluZSBVREhDUENfQ01EX09QVElPTlMgQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUworCisjZGVmaW5lIGRlYnVnX25vaXNlKGFyZ3MuLi4pIC8qZnByaW50ZihzdGRlcnIsIGFyZ3MpKi8KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RydWN0IGludGVyZmFjZV9kZWZuX3Q7CisKK3R5cGVkZWYgaW50IGV4ZWNmbihjaGFyICpjb21tYW5kKTsKKworc3RydWN0IG1ldGhvZF90IHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnVwKShzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmUpIEZBU1RfRlVOQzsKKwlpbnQgKCpkb3duKShzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmUpIEZBU1RfRlVOQzsKK307CisKK3N0cnVjdCBhZGRyZXNzX2ZhbWlseV90IHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBuX21ldGhvZHM7CisJY29uc3Qgc3RydWN0IG1ldGhvZF90ICptZXRob2Q7Cit9OworCitzdHJ1Y3QgbWFwcGluZ19kZWZuX3QgeworCXN0cnVjdCBtYXBwaW5nX2RlZm5fdCAqbmV4dDsKKworCWludCBtYXhfbWF0Y2hlczsKKwlpbnQgbl9tYXRjaGVzOworCWNoYXIgKiptYXRjaDsKKworCWNoYXIgKnNjcmlwdDsKKworCWludCBtYXhfbWFwcGluZ3M7CisJaW50IG5fbWFwcGluZ3M7CisJY2hhciAqKm1hcHBpbmc7Cit9OworCitzdHJ1Y3QgdmFyaWFibGVfdCB7CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZTsKK307CisKK3N0cnVjdCBpbnRlcmZhY2VfZGVmbl90IHsKKwljb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCAqYWRkcmVzc19mYW1pbHk7CisJY29uc3Qgc3RydWN0IG1ldGhvZF90ICptZXRob2Q7CisKKwljaGFyICppZmFjZTsKKwlpbnQgbWF4X29wdGlvbnM7CisJaW50IG5fb3B0aW9uczsKKwlzdHJ1Y3QgdmFyaWFibGVfdCAqb3B0aW9uOworfTsKKworc3RydWN0IGludGVyZmFjZXNfZmlsZV90IHsKKwlsbGlzdF90ICphdXRvaW50ZXJmYWNlczsKKwlsbGlzdF90ICppZmFjZXM7CisJc3RydWN0IG1hcHBpbmdfZGVmbl90ICptYXBwaW5nczsKK307CisKKworI2RlZmluZSBPUFRJT05fU1RSICJhbnZmIiBJRl9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcoIm0iKSAiaToiCitlbnVtIHsKKwlPUFRfZG9fYWxsICAgICAgPSAweDEsCisJT1BUX25vX2FjdCAgICAgID0gMHgyLAorCU9QVF92ZXJib3NlICAgICA9IDB4NCwKKwlPUFRfZm9yY2UgICAgICAgPSAweDgsCisJT1BUX25vX21hcHBpbmdzID0gMHgxMCwKK307CisjZGVmaW5lIERPX0FMTCAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX2RvX2FsbCkKKyNkZWZpbmUgTk9fQUNUICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbm9fYWN0KQorI2RlZmluZSBWRVJCT1NFICAgICAob3B0aW9uX21hc2szMiAmIE9QVF92ZXJib3NlKQorI2RlZmluZSBGT1JDRSAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9mb3JjZSkKKyNkZWZpbmUgTk9fTUFQUElOR1MgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbm9fbWFwcGluZ3MpCisKKworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgKipteV9lbnZpcm9uOworCWNvbnN0IGNoYXIgKnN0YXJ0dXBfUEFUSDsKKwljaGFyICpzaGVsbDsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVBWNCB8fCBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUFY2CisKK3N0YXRpYyB2b2lkIGFkZHN0cihjaGFyICoqYnVmcCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3Qgc3RyX2xlbmd0aCkKK3sKKwkvKiB4YXNwcmludGYgdHJpY2sgd2lsbCBiZSBzbWFsbGVyLCBidXQgd2UgYXJlIG9mdGVuCisJICogY2FsbGVkIHdpdGggc3RyX2xlbmd0aCA9PSAxIC0gZG9uJ3Qgd2FudCB0byBoYXZlCisJICogVEhBVCBtdWNoIG9mIG1hbGxvYy9mcmVlaW5nISAqLworCWNoYXIgKmJ1ZiA9ICpidWZwOworCWludCBsZW4gPSAoYnVmID8gc3RybGVuKGJ1ZikgOiAwKTsKKwlzdHJfbGVuZ3RoKys7CisJYnVmID0geHJlYWxsb2MoYnVmLCBsZW4gKyBzdHJfbGVuZ3RoKTsKKwkvKiBjb3BpZXMgYXQgbW9zdCBzdHJfbGVuZ3RoLTEgY2hhcnMhICovCisJc2FmZV9zdHJuY3B5KGJ1ZiArIGxlbiwgc3RyLCBzdHJfbGVuZ3RoKTsKKwkqYnVmcCA9IGJ1ZjsKK30KKworc3RhdGljIGludCBzdHJuY21weihjb25zdCBjaGFyICpsLCBjb25zdCBjaGFyICpyLCBzaXplX3QgbGxlbikKK3sKKwlpbnQgaSA9IHN0cm5jbXAobCwgciwgbGxlbik7CisKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLSAodW5zaWduZWQgY2hhcilyW2xsZW5dOworCXJldHVybiBpOworfQorCitzdGF0aWMgY2hhciAqZ2V0X3Zhcihjb25zdCBjaGFyICppZCwgc2l6ZV90IGlkbGVuLCBzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkKQoreworCWludCBpOworCisJaWYgKHN0cm5jbXB6KGlkLCAiaWZhY2UiLCBpZGxlbikgPT0gMCkgeworCQkvLyB1YnVudHUncyBpZnVwIGRvZXNuJ3QgZG8gdGhpczoKKwkJLy9zdGF0aWMgY2hhciAqbGFiZWxfYnVmOworCQkvL2NoYXIgKnJlc3VsdDsKKwkJLy9mcmVlKGxhYmVsX2J1Zik7CisJCS8vbGFiZWxfYnVmID0geHN0cmR1cChpZmQtPmlmYWNlKTsKKwkJLy8gUmVtb3ZlIHZpcnR1YWwgaWZhY2Ugc3VmZml4CisJCS8vcmVzdWx0ID0gc3RyY2hybnVsKGxhYmVsX2J1ZiwgJzonKTsKKwkJLy8qcmVzdWx0ID0gJ1wwJzsKKwkJLy9yZXR1cm4gbGFiZWxfYnVmOworCisJCXJldHVybiBpZmQtPmlmYWNlOworCX0KKwlpZiAoc3RybmNtcHooaWQsICJsYWJlbCIsIGlkbGVuKSA9PSAwKSB7CisJCXJldHVybiBpZmQtPmlmYWNlOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaWZkLT5uX29wdGlvbnM7IGkrKykgeworCQlpZiAoc3RybmNtcHooaWQsIGlmZC0+b3B0aW9uW2ldLm5hbWUsIGlkbGVuKSA9PSAwKSB7CisJCQlyZXR1cm4gaWZkLT5vcHRpb25baV0udmFsdWU7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKK3N0YXRpYyBpbnQgY291bnRfbmV0bWFza19iaXRzKGNvbnN0IGNoYXIgKmRvdHRlZF9xdWFkKQoreworLy8JaW50IHJlc3VsdDsKKy8vCXVuc2lnbmVkIGEsIGIsIGMsIGQ7CisvLwkvKiBGb3VuZCBhIG5ldG1hc2suLi4gIENoZWNrIGlmIGl0IGlzIGRvdHRlZCBxdWFkICovCisvLwlpZiAoc3NjYW5mKGRvdHRlZF9xdWFkLCAiJXUuJXUuJXUuJXUiLCAmYSwgJmIsICZjLCAmZCkgIT0gNCkKKy8vCQlyZXR1cm4gLTE7CisvLwlpZiAoKGF8YnxjfGQpID4+IDgpCisvLwkJcmV0dXJuIC0xOyAvKiBvbmUgb2YgbnVtYmVycyBpcyA+PSAyNTYgKi8KKy8vCWQgfD0gKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGMgPDwgOCk7IC8qIElQICovCisvLwlkID0gfmQ7IC8qIDExMTEwMDAwIC0+IDAwMDAxMTExICovCisKKwkvKiBTaG9ydGVyIHZlcnNpb24gKi8KKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpbl9hZGRyIGlwOworCXVuc2lnbmVkIGQ7CisKKwlpZiAoaW5ldF9hdG9uKGRvdHRlZF9xdWFkLCAmaXApID09IDApCisJCXJldHVybiAtMTsgLyogbWFsZm9ybWVkIGRvdHRlZCBJUCAqLworCWQgPSBudG9obChpcC5zX2FkZHIpOyAvKiBJUCBpbiBob3N0IG9yZGVyICovCisJZCA9IH5kOyAvKiAxMTExMDAwMCAtPiAwMDAwMTExMSAqLworCWlmIChkICYgKGQrMSkpIC8qIGNoZWNrIHRoYXQgaXQgaXMgaW4gMDAwMDExMTEgZm9ybSAqLworCQlyZXR1cm4gLTE7IC8qIG5vIGl0IGlzIG5vdCAqLworCXJlc3VsdCA9IDMyOworCXdoaWxlIChkKSB7CisJCWQgPj49IDE7CisJCXJlc3VsdC0tOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorIyBlbmRpZgorCitzdGF0aWMgY2hhciAqcGFyc2UoY29uc3QgY2hhciAqY29tbWFuZCwgc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCkKK3sKKwlzaXplX3Qgb2xkX3Bvc1tNQVhfT1BUX0RFUFRIXSA9IHsgMCB9OworCWludCBva2F5W01BWF9PUFRfREVQVEhdID0geyAxIH07CisJaW50IG9wdF9kZXB0aCA9IDE7CisJY2hhciAqcmVzdWx0ID0gTlVMTDsKKworCXdoaWxlICgqY29tbWFuZCkgeworCQlzd2l0Y2ggKCpjb21tYW5kKSB7CisJCWRlZmF1bHQ6CisJCQlhZGRzdHIoJnJlc3VsdCwgY29tbWFuZCwgMSk7CisJCQljb21tYW5kKys7CisJCQlicmVhazsKKwkJY2FzZSAnXFwnOgorCQkJaWYgKGNvbW1hbmRbMV0pIHsKKwkJCQlhZGRzdHIoJnJlc3VsdCwgY29tbWFuZCArIDEsIDEpOworCQkJCWNvbW1hbmQgKz0gMjsKKwkJCX0gZWxzZSB7CisJCQkJYWRkc3RyKCZyZXN1bHQsIGNvbW1hbmQsIDEpOworCQkJCWNvbW1hbmQrKzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdbJzoKKwkJCWlmIChjb21tYW5kWzFdID09ICdbJyAmJiBvcHRfZGVwdGggPCBNQVhfT1BUX0RFUFRIKSB7CisJCQkJb2xkX3Bvc1tvcHRfZGVwdGhdID0gcmVzdWx0ID8gc3RybGVuKHJlc3VsdCkgOiAwOworCQkJCW9rYXlbb3B0X2RlcHRoXSA9IDE7CisJCQkJb3B0X2RlcHRoKys7CisJCQkJY29tbWFuZCArPSAyOworCQkJfSBlbHNlIHsKKwkJCQlhZGRzdHIoJnJlc3VsdCwgIlsiLCAxKTsKKwkJCQljb21tYW5kKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXSc6CisJCQlpZiAoY29tbWFuZFsxXSA9PSAnXScgJiYgb3B0X2RlcHRoID4gMSkgeworCQkJCW9wdF9kZXB0aC0tOworCQkJCWlmICghb2theVtvcHRfZGVwdGhdKSB7CisJCQkJCXJlc3VsdFtvbGRfcG9zW29wdF9kZXB0aF1dID0gJ1wwJzsKKwkJCQl9CisJCQkJY29tbWFuZCArPSAyOworCQkJfSBlbHNlIHsKKwkJCQlhZGRzdHIoJnJlc3VsdCwgIl0iLCAxKTsKKwkJCQljb21tYW5kKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnJSc6CisJCQl7CisJCQkJY2hhciAqbmV4dHBlcmNlbnQ7CisJCQkJY2hhciAqdmFydmFsdWU7CisKKwkJCQljb21tYW5kKys7CisJCQkJbmV4dHBlcmNlbnQgPSBzdHJjaHIoY29tbWFuZCwgJyUnKTsKKwkJCQlpZiAoIW5leHRwZXJjZW50KSB7CisJCQkJCWVycm5vID0gRVVOQkFMUEVSOworCQkJCQlmcmVlKHJlc3VsdCk7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKworCQkJCXZhcnZhbHVlID0gZ2V0X3Zhcihjb21tYW5kLCBuZXh0cGVyY2VudCAtIGNvbW1hbmQsIGlmZCk7CisKKwkJCQlpZiAodmFydmFsdWUpIHsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwkJCQkJLyogImh3YWRkcmVzcyA8Y2xhc3M+IDxhZGRyZXNzPiI6CisJCQkJCSAqIHVubGlrZSBpZmNvbmZpZywgaXAgZG9lc250IHdhbnQgPGNsYXNzPgorCQkJCQkgKiAodXN1YWxseSAiZXRoZXIiIGtleXdvcmQpLiBTa2lwIGl0LiAqLworCQkJCQlpZiAoc3RybmNtcChjb21tYW5kLCAiaHdhZGRyZXNzIiwgOSkgPT0gMCkgeworCQkJCQkJdmFydmFsdWUgPSBza2lwX3doaXRlc3BhY2Uoc2tpcF9ub25fd2hpdGVzcGFjZSh2YXJ2YWx1ZSkpOworCQkJCQl9CisjIGVuZGlmCisJCQkJCWFkZHN0cigmcmVzdWx0LCB2YXJ2YWx1ZSwgc3RybGVuKHZhcnZhbHVlKSk7CisJCQkJfSBlbHNlIHsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwkJCQkJLyogU2lnaC4uLiAgQWRkIGEgc3BlY2lhbCBjYXNlIGZvciAnaXAnIHRvIGNvbnZlcnQgZnJvbQorCQkJCQkgKiBkb3R0ZWQgcXVhZCB0byBiaXQgY291bnQgc3R5bGUgbmV0bWFza3MuICAqLworCQkJCQlpZiAoc3RybmNtcChjb21tYW5kLCAiYm5tYXNrIiwgNikgPT0gMCkgeworCQkJCQkJdW5zaWduZWQgcmVzOworCQkJCQkJdmFydmFsdWUgPSBnZXRfdmFyKCJuZXRtYXNrIiwgNywgaWZkKTsKKwkJCQkJCWlmICh2YXJ2YWx1ZSkgeworCQkJCQkJCXJlcyA9IGNvdW50X25ldG1hc2tfYml0cyh2YXJ2YWx1ZSk7CisJCQkJCQkJaWYgKHJlcyA+IDApIHsKKwkJCQkJCQkJY29uc3QgY2hhciAqYXJndW1lbnQgPSB1dG9hKHJlcyk7CisJCQkJCQkJCWFkZHN0cigmcmVzdWx0LCBhcmd1bWVudCwgc3RybGVuKGFyZ3VtZW50KSk7CisJCQkJCQkJCWNvbW1hbmQgPSBuZXh0cGVyY2VudCArIDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorIyBlbmRpZgorCQkJCQlva2F5W29wdF9kZXB0aCAtIDFdID0gMDsKKwkJCQl9CisKKwkJCQljb21tYW5kID0gbmV4dHBlcmNlbnQgKyAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAob3B0X2RlcHRoID4gMSkgeworCQllcnJubyA9IEVVTkJBTEJSQUNLOworCQlmcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghb2theVswXSkgeworCQllcnJubyA9IEVVTkRFRlZBUjsKKwkJZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBleGVjdXRlKCkgcmV0dXJucyAxIGZvciBzdWNjZXNzIGFuZCAwIGZvciBmYWlsdXJlICovCitzdGF0aWMgaW50IGV4ZWN1dGUoY29uc3QgY2hhciAqY29tbWFuZCwgc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCWNoYXIgKm91dDsKKwlpbnQgcmV0OworCisJb3V0ID0gcGFyc2UoY29tbWFuZCwgaWZkKTsKKwlpZiAoIW91dCkgeworCQkvKiBwYXJzZSBlcnJvcj8gKi8KKwkJcmV0dXJuIDA7CisJfQorCS8qIG91dCA9PSAiIjogcGFyc2VkIG9rIGJ1dCBub3QgYWxsIG5lZWRlZCB2YXJpYWJsZXMga25vd24sIHNraXAgKi8KKwlyZXQgPSBvdXRbMF0gPyAoKmV4ZWMpKG91dCkgOiAxOworCisJZnJlZShvdXQpOworCWlmIChyZXQgIT0gMSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX0lGVVBET1dOX0lQVjQgfHwgRkVBVFVSRV9JRlVQRE9XTl9JUFY2ICovCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQVjYKKworc3RhdGljIGludCBGQVNUX0ZVTkMgbG9vcGJhY2tfdXA2KHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwlpbnQgcmVzdWx0OworCXJlc3VsdCA9IGV4ZWN1dGUoImlwIGFkZHIgYWRkIDo6MSBkZXYgJWlmYWNlJSIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpOworCXJldHVybiAoKHJlc3VsdCA9PSAyKSA/IDIgOiAwKTsKKyMgZWxzZQorCXJldHVybiBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIGFkZCA6OjEiLCBpZmQsIGV4ZWMpOworIyBlbmRpZgorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBsb29wYmFja19kb3duNihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJcmV0dXJuIGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgZG93biIsIGlmZCwgZXhlYyk7CisjIGVsc2UKKwlyZXR1cm4gZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJSBkZWwgOjoxIiwgaWZkLCBleGVjKTsKKyMgZW5kaWYKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgbWFudWFsX3VwX2Rvd242KHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQgVU5VU0VEX1BBUkFNLCBleGVjZm4gKmV4ZWMgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfdXA2KHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlpbnQgcmVzdWx0OworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCXJlc3VsdCA9IGV4ZWN1dGUoImlwIGFkZHIgYWRkICVhZGRyZXNzJS8lbmV0bWFzayUgZGV2ICVpZmFjZSVbWyBsYWJlbCAlbGFiZWwlXV0iLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpcCBsaW5rIHNldFtbIG10dSAlbXR1JV1dW1sgYWRkciAlaHdhZGRyZXNzJV1dICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpOworCS8qIFdhczogIltbIGlwIC4uLi4lZ2F0ZXdheSUgXV0iLiBSZW1vdmVkIGV4dHJhIHNwYWNlcyB3L28gY2hlY2tpbmcgKi8KKwlyZXN1bHQgKz0gZXhlY3V0ZSgiW1tpcCByb3V0ZSBhZGQgOjovMCB2aWEgJWdhdGV3YXklXV0iLCBpZmQsIGV4ZWMpOworIyBlbHNlCisJcmVzdWx0ID0gZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJVtbIG1lZGlhICVtZWRpYSVdXVtbIGh3ICVod2FkZHJlc3MlXV1bWyBtdHUgJW10dSVdXSB1cCIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSUgYWRkICVhZGRyZXNzJS8lbmV0bWFzayUiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJbW3JvdXRlIC1BIGluZXQ2IGFkZCA6Oi8wIGd3ICVnYXRld2F5JV1dIiwgaWZkLCBleGVjKTsKKyMgZW5kaWYKKwlyZXR1cm4gKChyZXN1bHQgPT0gMykgPyAzIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHN0YXRpY19kb3duNihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJcmV0dXJuIGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgZG93biIsIGlmZCwgZXhlYyk7CisjIGVsc2UKKwlyZXR1cm4gZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJSBkb3duIiwgaWZkLCBleGVjKTsKKyMgZW5kaWYKK30KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorc3RhdGljIGludCBGQVNUX0ZVTkMgdjR0dW5uZWxfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCWludCByZXN1bHQ7CisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgdHVubmVsIGFkZCAlaWZhY2UlIG1vZGUgc2l0IHJlbW90ZSAiCisJCQkiJWVuZHBvaW50JVtbIGxvY2FsICVsb2NhbCVdXVtbIHR0bCAldHRsJV1dIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiaXAgbGluayBzZXQgJWlmYWNlJSB1cCIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGFkZHIgYWRkICVhZGRyZXNzJS8lbmV0bWFzayUgZGV2ICVpZmFjZSUiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJbW2lwIHJvdXRlIGFkZCA6Oi8wIHZpYSAlZ2F0ZXdheSVdXSIsIGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDQpID8gNCA6IDApOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB2NHR1bm5lbF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICogaWZkLCBleGVjZm4gKiBleGVjKQoreworCXJldHVybiBleGVjdXRlKCJpcCB0dW5uZWwgZGVsICVpZmFjZSUiLCBpZmQsIGV4ZWMpOworfQorIyBlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1ldGhvZF90IG1ldGhvZHM2W10gPSB7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJeyAidjR0dW5uZWwiICwgdjR0dW5uZWxfdXAgICAgICwgdjR0dW5uZWxfZG93biAgICwgfSwKKyMgZW5kaWYKKwl7ICJzdGF0aWMiICAgLCBzdGF0aWNfdXA2ICAgICAgLCBzdGF0aWNfZG93bjYgICAgLCB9LAorCXsgIm1hbnVhbCIgICAsIG1hbnVhbF91cF9kb3duNiAsIG1hbnVhbF91cF9kb3duNiAsIH0sCisJeyAibG9vcGJhY2siICwgbG9vcGJhY2tfdXA2ICAgICwgbG9vcGJhY2tfZG93bjYgICwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCBhZGRyX2luZXQ2ID0geworCSJpbmV0NiIsCisJQVJSQVlfU0laRShtZXRob2RzNiksCisJbWV0aG9kczYKK307CisKKyNlbmRpZiAvKiBGRUFUVVJFX0lGVVBET1dOX0lQVjYgKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVBWNAorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBsb29wYmFja191cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJaW50IHJlc3VsdDsKKwlyZXN1bHQgPSBleGVjdXRlKCJpcCBhZGRyIGFkZCAxMjcuMC4wLjEvOCBkZXYgJWlmYWNlJSIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpOworCXJldHVybiAoKHJlc3VsdCA9PSAyKSA/IDIgOiAwKTsKKyMgZWxzZQorCXJldHVybiBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIDEyNy4wLjAuMSB1cCIsIGlmZCwgZXhlYyk7CisjIGVuZGlmCit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGxvb3BiYWNrX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCWludCByZXN1bHQ7CisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgYWRkciBmbHVzaCBkZXYgJWlmYWNlJSIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgZG93biIsIGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDIpID8gMiA6IDApOworIyBlbHNlCisJcmV0dXJuIGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSUgMTI3LjAuMC4xIGRvd24iLCBpZmQsIGV4ZWMpOworIyBlbmRpZgorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCWludCByZXN1bHQ7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgYWRkciBhZGQgJWFkZHJlc3MlLyVibm1hc2slW1sgYnJvYWRjYXN0ICVicm9hZGNhc3QlXV0gIgorCQkJImRldiAlaWZhY2UlW1sgcGVlciAlcG9pbnRvcG9pbnQlXV1bWyBsYWJlbCAlbGFiZWwlXV0iLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpcCBsaW5rIHNldFtbIG10dSAlbXR1JV1dW1sgYWRkciAlaHdhZGRyZXNzJV1dICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJbW2lwIHJvdXRlIGFkZCBkZWZhdWx0IHZpYSAlZ2F0ZXdheSUgZGV2ICVpZmFjZSVdXSIsIGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDMpID8gMyA6IDApOworIyBlbHNlCisJLyogaWZjb25maWcgc2FpZCB0byBzZXQgaWZhY2UgdXAgYmVmb3JlIGl0IHByb2Nlc3NlcyBodyAlaHdhZGRyZXNzJSwKKwkgKiB3aGljaCB0aGVuIG9mIGNvdXJzZSBmYWlscy4gVGh1cyB3ZSBydW4gdHdvIHNlcGFyYXRlIGlmY29uZmlnICovCisJcmVzdWx0ID0gZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJVtbIGh3ICVod2FkZHJlc3MlXV1bWyBtZWRpYSAlbWVkaWElXV1bWyBtdHUgJW10dSVdXSB1cCIsCisJCQkJaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJSAlYWRkcmVzcyUgbmV0bWFzayAlbmV0bWFzayUiCisJCQkJIltbIGJyb2FkY2FzdCAlYnJvYWRjYXN0JV1dW1sgcG9pbnRvcG9pbnQgJXBvaW50b3BvaW50JV1dICIsCisJCQkJaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiW1tyb3V0ZSBhZGQgZGVmYXVsdCBndyAlZ2F0ZXdheSUgJWlmYWNlJV1dIiwgaWZkLCBleGVjKTsKKwlyZXR1cm4gKChyZXN1bHQgPT0gMykgPyAzIDogMCk7CisjIGVuZGlmCit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHN0YXRpY19kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlpbnQgcmVzdWx0OworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCXJlc3VsdCA9IGV4ZWN1dGUoImlwIGFkZHIgZmx1c2ggZGV2ICVpZmFjZSUiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpcCBsaW5rIHNldCAlaWZhY2UlIGRvd24iLCBpZmQsIGV4ZWMpOworIyBlbHNlCisJLyogcmVzdWx0ID0gZXhlY3V0ZSgiW1tyb3V0ZSBkZWwgZGVmYXVsdCBndyAlZ2F0ZXdheSUgJWlmYWNlJV1dIiwgaWZkLCBleGVjKTsgKi8KKwkvKiBCcmluZ2luZyB0aGUgaW50ZXJmYWNlIGRvd24gZGVsZXRlcyB0aGUgcm91dGVzIGluIGl0c2VsZi4KKwkgICBPdGhlcndpc2UgdGhpcyBmYWlscyBpZiB3ZSByZWZlcmVuY2UgJ2dhdGV3YXknIHdoZW4gdXNpbmcgdGhpcyBmcm9tIGRoY3BfZG93biAqLworCXJlc3VsdCA9IDE7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSUgZG93biIsIGlmZCwgZXhlYyk7CisjIGVuZGlmCisJcmV0dXJuICgocmVzdWx0ID09IDIpID8gMiA6IDApOworfQorCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1AKK3N0cnVjdCBkaGNwX2NsaWVudF90IHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnN0YXJ0Y21kOworCWNvbnN0IGNoYXIgKnN0b3BjbWQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRoY3BfY2xpZW50X3QgZXh0X2RoY3BfY2xpZW50c1tdID0geworCXsgImRoY3BjZCIsCisJCSJkaGNwY2RbWyAtaCAlaG9zdG5hbWUlXV1bWyAtaSAldmVuZG9yJV1dW1sgLUkgJWNsaWVudCVdXVtbIC1sICVsZWFzZXRpbWUlXV0gJWlmYWNlJSIsCisJCSJkaGNwY2QgLWsgJWlmYWNlJSIsCisJfSwKKwl7ICJkaGNsaWVudCIsCisJCSJkaGNsaWVudCAtcGYgL3Zhci9ydW4vZGhjbGllbnQuJWlmYWNlJS5waWQgJWlmYWNlJSIsCisJCSJraWxsIC05IGBjYXQgL3Zhci9ydW4vZGhjbGllbnQuJWlmYWNlJS5waWRgIDI+L2Rldi9udWxsIiwKKwl9LAorCXsgInB1bXAiLAorCQkicHVtcCAtaSAlaWZhY2UlW1sgLWggJWhvc3RuYW1lJV1dW1sgLWwgJWxlYXNlaG91cnMlXV0iLAorCQkicHVtcCAtaSAlaWZhY2UlIC1rIiwKKwl9LAorCXsgInVkaGNwYyIsCisJCSJ1ZGhjcGMgIiBVREhDUENfQ01EX09QVElPTlMgIiAtcCAvdmFyL3J1bi91ZGhjcGMuJWlmYWNlJS5waWQgLWkgJWlmYWNlJVtbIC1IICVob3N0bmFtZSVdXVtbIC1jICVjbGllbnQlXV0iCisJCQkJIltbIC1zICVzY3JpcHQlXV1bWyAldWRoY3BjX29wdHMlXV0iLAorCQkia2lsbCBgY2F0IC92YXIvcnVuL3VkaGNwYy4laWZhY2UlLnBpZGAgMj4vZGV2L251bGwiLAorCX0sCit9OworIyBlbmRpZiAvKiBGRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1BDICovCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUAorc3RhdGljIGludCBGQVNUX0ZVTkMgZGhjcF91cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJdW5zaWduZWQgaTsKKyMgIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJLyogaXAgZG9lc24ndCB1cCBpZmFjZSB3aGVuIGl0IGNvbmZpZ3VyZXMgaXQgKHVubGlrZSBpZmNvbmZpZykgKi8KKwlpZiAoIWV4ZWN1dGUoImlwIGxpbmsgc2V0W1sgYWRkciAlaHdhZGRyZXNzJV1dICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpKQorCQlyZXR1cm4gMDsKKyMgIGVsc2UKKwkvKiBuZWVkZWQgaWYgd2UgaGF2ZSBod2FkZHJlc3Mgb24gZGhjcCBpZmFjZSAqLworCWlmICghZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJVtbIGh3ICVod2FkZHJlc3MlXV0gdXAiLCBpZmQsIGV4ZWMpKQorCQlyZXR1cm4gMDsKKyMgIGVuZGlmCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXh0X2RoY3BfY2xpZW50cyk7IGkrKykgeworCQlpZiAoZXhpc3RzX2V4ZWNhYmxlKGV4dF9kaGNwX2NsaWVudHNbaV0ubmFtZSkpCisJCQlyZXR1cm4gZXhlY3V0ZShleHRfZGhjcF9jbGllbnRzW2ldLnN0YXJ0Y21kLCBpZmQsIGV4ZWMpOworCX0KKwliYl9lcnJvcl9tc2coIm5vIGRoY3AgY2xpZW50cyBmb3VuZCIpOworCXJldHVybiAwOworfQorIyBlbGlmIEVOQUJMRV9VREhDUEMKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRoY3BfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworIyAgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwkvKiBpcCBkb2Vzbid0IHVwIGlmYWNlIHdoZW4gaXQgY29uZmlndXJlcyBpdCAodW5saWtlIGlmY29uZmlnKSAqLworCWlmICghZXhlY3V0ZSgiaXAgbGluayBzZXRbWyBhZGRyICVod2FkZHJlc3MlXV0gJWlmYWNlJSB1cCIsIGlmZCwgZXhlYykpCisJCXJldHVybiAwOworIyAgZWxzZQorCS8qIG5lZWRlZCBpZiB3ZSBoYXZlIGh3YWRkcmVzcyBvbiBkaGNwIGlmYWNlICovCisJaWYgKCFleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlW1sgaHcgJWh3YWRkcmVzcyVdXSB1cCIsIGlmZCwgZXhlYykpCisJCXJldHVybiAwOworIyAgZW5kaWYKKwlyZXR1cm4gZXhlY3V0ZSgidWRoY3BjICIgVURIQ1BDX0NNRF9PUFRJT05TICIgLXAgL3Zhci9ydW4vdWRoY3BjLiVpZmFjZSUucGlkICIKKwkJCSItaSAlaWZhY2UlW1sgLUggJWhvc3RuYW1lJV1dW1sgLWMgJWNsaWVudCVdXVtbIC1zICVzY3JpcHQlXV1bWyAldWRoY3BjX29wdHMlXV0iLAorCQkJaWZkLCBleGVjKTsKK30KKyMgZWxzZQorc3RhdGljIGludCBGQVNUX0ZVTkMgZGhjcF91cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkIFVOVVNFRF9QQVJBTSwKKwkJZXhlY2ZuICpleGVjIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMDsgLyogbm8gZGhjcCBzdXBwb3J0ICovCit9CisjIGVuZGlmCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUAorc3RhdGljIGludCBGQVNUX0ZVTkMgZGhjcF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXh0X2RoY3BfY2xpZW50cyk7IGkrKykgeworCQlpZiAoZXhpc3RzX2V4ZWNhYmxlKGV4dF9kaGNwX2NsaWVudHNbaV0ubmFtZSkpIHsKKwkJCXJlc3VsdCA9IGV4ZWN1dGUoZXh0X2RoY3BfY2xpZW50c1tpXS5zdG9wY21kLCBpZmQsIGV4ZWMpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcmVzdWx0KQorCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IG5vIGRoY3AgY2xpZW50cyBmb3VuZCBhbmQgc3RvcHBlZCIpOworCisJLyogU2xlZXAgYSBiaXQsIG90aGVyd2lzZSBzdGF0aWNfZG93biB0cmllcyB0byBicmluZyBkb3duIGludGVyZmFjZSB0b28gc29vbiwKKwkgICBhbmQgaXQgbWF5IGNvbWUgYmFjayB1cCBiZWNhdXNlIHVkaGNwYyBpcyBzdGlsbCBzaHV0dGluZyBkb3duICovCisJdXNsZWVwKDEwMDAwMCk7CisJcmVzdWx0ICs9IHN0YXRpY19kb3duKGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDMpID8gMyA6IDApOworfQorIyBlbGlmIEVOQUJMRV9VREhDUEMKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRoY3BfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJaW50IHJlc3VsdDsKKwlyZXN1bHQgPSBleGVjdXRlKAorCQkidGVzdCAtZiAvdmFyL3J1bi91ZGhjcGMuJWlmYWNlJS5waWQgJiYgIgorCQkia2lsbCBgY2F0IC92YXIvcnVuL3VkaGNwYy4laWZhY2UlLnBpZGAgMj4vZGV2L251bGwiLAorCQlpZmQsIGV4ZWMpOworCS8qIEFsc28gYnJpbmcgdGhlIGhhcmR3YXJlIGludGVyZmFjZSBkb3duIHNpbmNlCisJICAga2lsbGluZyB0aGUgZGhjcCBjbGllbnQgYWxvbmUgZG9lc24ndCBkbyBpdC4KKwkgICBUaGlzIGVuYWJsZXMgY29uc2VjdXRpdmUgaWZ1cC0+aWZkb3duLT5pZnVwICovCisJLyogU2xlZXAgYSBiaXQsIG90aGVyd2lzZSBzdGF0aWNfZG93biB0cmllcyB0byBicmluZyBkb3duIGludGVyZmFjZSB0b28gc29vbiwKKwkgICBhbmQgaXQgbWF5IGNvbWUgYmFjayB1cCBiZWNhdXNlIHVkaGNwYyBpcyBzdGlsbCBzaHV0dGluZyBkb3duICovCisJdXNsZWVwKDEwMDAwMCk7CisJcmVzdWx0ICs9IHN0YXRpY19kb3duKGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDMpID8gMyA6IDApOworfQorIyBlbHNlCitzdGF0aWMgaW50IEZBU1RfRlVOQyBkaGNwX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCBVTlVTRURfUEFSQU0sCisJCWV4ZWNmbiAqZXhlYyBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDA7IC8qIG5vIGRoY3Agc3VwcG9ydCAqLworfQorIyBlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBtYW51YWxfdXBfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkIFVOVVNFRF9QQVJBTSwgZXhlY2ZuICpleGVjIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYm9vdHBfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCXJldHVybiBleGVjdXRlKCJib290cGNbWyAtLWJvb3RmaWxlICVib290ZmlsZSVdXSAtLWRldiAlaWZhY2UlIgorCQkJIltbIC0tc2VydmVyICVzZXJ2ZXIlXV1bWyAtLWh3YWRkciAlaHdhZGRyJV1dIgorCQkJIiAtLXJldHVybmlmZmFpbCAtLXNlcnZlcmJjYXN0IiwgaWZkLCBleGVjKTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgcHBwX3VwKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlyZXR1cm4gZXhlY3V0ZSgicG9uW1sgJXByb3ZpZGVyJV1dIiwgaWZkLCBleGVjKTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgcHBwX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCXJldHVybiBleGVjdXRlKCJwb2ZmW1sgJXByb3ZpZGVyJV1dIiwgaWZkLCBleGVjKTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgd3ZkaWFsX3VwKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlyZXR1cm4gZXhlY3V0ZSgic3RhcnQtc3RvcC1kYWVtb24gLS1zdGFydCAteCB3dmRpYWwgIgorCQkiLXAgL3Zhci9ydW4vd3ZkaWFsLiVpZmFjZSUgLWIgLW0gLS1bWyAlcHJvdmlkZXIlXV0iLCBpZmQsIGV4ZWMpOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB3dmRpYWxfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJcmV0dXJuIGV4ZWN1dGUoInN0YXJ0LXN0b3AtZGFlbW9uIC0tc3RvcCAteCB3dmRpYWwgIgorCQkJIi1wIC92YXIvcnVuL3d2ZGlhbC4laWZhY2UlIC1zIDIiLCBpZmQsIGV4ZWMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1ldGhvZF90IG1ldGhvZHNbXSA9IHsKKwl7ICJtYW51YWwiICAsIG1hbnVhbF91cF9kb3duLCBtYW51YWxfdXBfZG93biwgfSwKKwl7ICJ3dmRpYWwiICAsIHd2ZGlhbF91cCAgICAgLCB3dmRpYWxfZG93biAgICwgfSwKKwl7ICJwcHAiICAgICAsIHBwcF91cCAgICAgICAgLCBwcHBfZG93biAgICAgICwgfSwKKwl7ICJzdGF0aWMiICAsIHN0YXRpY191cCAgICAgLCBzdGF0aWNfZG93biAgICwgfSwKKwl7ICJib290cCIgICAsIGJvb3RwX3VwICAgICAgLCBzdGF0aWNfZG93biAgICwgfSwKKwl7ICJkaGNwIiAgICAsIGRoY3BfdXAgICAgICAgLCBkaGNwX2Rvd24gICAgICwgfSwKKwl7ICJsb29wYmFjayIsIGxvb3BiYWNrX3VwICAgLCBsb29wYmFja19kb3duICwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCBhZGRyX2luZXQgPSB7CisJImluZXQiLAorCUFSUkFZX1NJWkUobWV0aG9kcyksCisJbWV0aG9kcworfTsKKworI2VuZGlmICAvKiBGRUFUVVJFX0lGVVBET1dOX0lQVjQgKi8KKworCisvKiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIG5leHQgd29yZCwgb3IgTlVMTC4KKyAqIEluIDFzdCBjYXNlLCBhZHZhbmNlcyAqYnVmIHRvIHRoZSB3b3JkIGFmdGVyIHRoaXMgb25lLgorICovCitzdGF0aWMgY2hhciAqbmV4dF93b3JkKGNoYXIgKipidWYpCit7CisJdW5zaWduZWQgbGVuZ3RoOworCWNoYXIgKndvcmQ7CisKKwkvKiBTa2lwIG92ZXIgbGVhZGluZyB3aGl0ZXNwYWNlICovCisJd29yZCA9IHNraXBfd2hpdGVzcGFjZSgqYnVmKTsKKworCS8qIFN0b3Agb24gRU9MICovCisJaWYgKCp3b3JkID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCisJLyogRmluZCB0aGUgbGVuZ3RoIG9mIHRoaXMgd29yZCAoY2FuJ3QgYmUgMCkgKi8KKwlsZW5ndGggPSBzdHJjc3BuKHdvcmQsICIgXHRcbiIpOworCisJLyogVW5sZXNzIHdlIGFyZSBhbHJlYWR5IGF0IE5VTCwgc3RvcmUgTlVMIGFuZCBhZHZhbmNlICovCisJaWYgKHdvcmRbbGVuZ3RoXSAhPSAnXDAnKQorCQl3b3JkW2xlbmd0aCsrXSA9ICdcMCc7CisKKwkqYnVmID0gc2tpcF93aGl0ZXNwYWNlKHdvcmQgKyBsZW5ndGgpOworCisJcmV0dXJuIHdvcmQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCAqZ2V0X2FkZHJlc3NfZmFtaWx5KGNvbnN0IHN0cnVjdCBhZGRyZXNzX2ZhbWlseV90ICpjb25zdCBhZltdLCBjaGFyICpuYW1lKQoreworCWludCBpOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGFmW2ldOyBpKyspIHsKKwkJaWYgKHN0cmNtcChhZltpXS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJcmV0dXJuIGFmW2ldOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1ldGhvZF90ICpnZXRfbWV0aG9kKGNvbnN0IHN0cnVjdCBhZGRyZXNzX2ZhbWlseV90ICphZiwgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisJLyogVE9ETzogdXNlIGluZGV4X2luX3N0cl9hcnJheSgpICovCisJZm9yIChpID0gMDsgaSA8IGFmLT5uX21ldGhvZHM7IGkrKykgeworCQlpZiAoc3RyY21wKGFmLT5tZXRob2RbaV0ubmFtZSwgbmFtZSkgPT0gMCkgeworCQkJcmV0dXJuICZhZi0+bWV0aG9kW2ldOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGludGVyZmFjZXNfZmlsZV90ICpyZWFkX2ludGVyZmFjZXMoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJLyogTGV0J3MgdHJ5IHRvIGJlIGNvbXBhdGlibGUuCisJICoKKwkgKiAibWFuIDUgaW50ZXJmYWNlcyIgc2F5czoKKwkgKiBMaW5lcyBzdGFydGluZyB3aXRoICIjIiBhcmUgaWdub3JlZC4gTm90ZSB0aGF0IGVuZC1vZi1saW5lCisJICogY29tbWVudHMgYXJlIE5PVCBzdXBwb3J0ZWQsIGNvbW1lbnRzIG11c3QgYmUgb24gYSBsaW5lIG9mIHRoZWlyIG93bi4KKwkgKiBBIGxpbmUgbWF5IGJlIGV4dGVuZGVkIGFjcm9zcyBtdWx0aXBsZSBsaW5lcyBieSBtYWtpbmcKKwkgKiB0aGUgbGFzdCBjaGFyYWN0ZXIgYSBiYWNrc2xhc2guCisJICoKKwkgKiBTZWVuIGVsc2V3aGVyZSBpbiBleGFtcGxlIGNvbmZpZyBmaWxlOgorCSAqIEEgZmlyc3Qgbm9uLWJsYW5rICIjIiBjaGFyYWN0ZXIgbWFrZXMgdGhlIHJlc3Qgb2YgdGhlIGxpbmUKKwkgKiBiZSBpZ25vcmVkLiBCbGFuayBsaW5lcyBhcmUgaWdub3JlZC4gTGluZXMgbWF5IGJlIGluZGVudGVkIGZyZWVseS4KKwkgKiBBICJcIiBjaGFyYWN0ZXIgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBsaW5lIGluZGljYXRlcyB0aGUgbmV4dCBsaW5lCisJICogc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBjb250aW51YXRpb24gb2YgdGhlIGN1cnJlbnQgb25lLgorCSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcKKwlzdHJ1Y3QgbWFwcGluZ19kZWZuX3QgKmN1cnJtYXAgPSBOVUxMOworI2VuZGlmCisJc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmN1cnJpZiA9IE5VTEw7CisJc3RydWN0IGludGVyZmFjZXNfZmlsZV90ICpkZWZuOworCUZJTEUgKmY7CisJY2hhciAqYnVmOworCWNoYXIgKmZpcnN0X3dvcmQ7CisJY2hhciAqcmVzdF9vZl9saW5lOworCWVudW0geyBOT05FLCBJRkFDRSwgTUFQUElORyB9IGN1cnJlbnRseV9wcm9jZXNzaW5nID0gTk9ORTsKKworCWRlZm4gPSB4emFsbG9jKHNpemVvZigqZGVmbikpOworCWYgPSB4Zm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCisJd2hpbGUgKChidWYgPSB4bWFsbG9jX2ZnZXRsaW5lKGYpKSAhPSBOVUxMKSB7CisjaWYgRU5BQkxFX0RFU0tUT1AKKwkJLyogVHJhaWxpbmcgIlwiIGNvbmNhdGVuYXRlcyBsaW5lcyAqLworCQljaGFyICpwOworCQl3aGlsZSAoKHAgPSBsYXN0X2NoYXJfaXMoYnVmLCAnXFwnKSkgIT0gTlVMTCkgeworCQkJKnAgPSAnXDAnOworCQkJcmVzdF9vZl9saW5lID0geG1hbGxvY19mZ2V0bGluZShmKTsKKwkJCWlmICghcmVzdF9vZl9saW5lKQorCQkJCWJyZWFrOworCQkJcCA9IHhhc3ByaW50ZigiJXMlcyIsIGJ1ZiwgcmVzdF9vZl9saW5lKTsKKwkJCWZyZWUoYnVmKTsKKwkJCWZyZWUocmVzdF9vZl9saW5lKTsKKwkJCWJ1ZiA9IHA7CisJCX0KKyNlbmRpZgorCQlyZXN0X29mX2xpbmUgPSBidWY7CisJCWZpcnN0X3dvcmQgPSBuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSk7CisJCWlmICghZmlyc3Rfd29yZCB8fCAqZmlyc3Rfd29yZCA9PSAnIycpIHsKKwkJCWZyZWUoYnVmKTsKKwkJCWNvbnRpbnVlOyAvKiBibGFuay9jb21tZW50IGxpbmUgKi8KKwkJfQorCisJCWlmIChzdHJjbXAoZmlyc3Rfd29yZCwgIm1hcHBpbmciKSA9PSAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORworCQkJY3Vycm1hcCA9IHh6YWxsb2Moc2l6ZW9mKCpjdXJybWFwKSk7CisKKwkJCXdoaWxlICgoZmlyc3Rfd29yZCA9IG5leHRfd29yZCgmcmVzdF9vZl9saW5lKSkgIT0gTlVMTCkgeworCQkJCWN1cnJtYXAtPm1hdGNoID0geHJlYWxsb2NfdmVjdG9yKGN1cnJtYXAtPm1hdGNoLCA0LCBjdXJybWFwLT5uX21hdGNoZXMpOworCQkJCWN1cnJtYXAtPm1hdGNoW2N1cnJtYXAtPm5fbWF0Y2hlcysrXSA9IHhzdHJkdXAoZmlyc3Rfd29yZCk7CisJCQl9CisJCQkvKmN1cnJtYXAtPm1heF9tYXBwaW5ncyA9IDA7IC0gZG9uZSBieSB4emFsbG9jICovCisJCQkvKmN1cnJtYXAtPm5fbWFwcGluZ3MgPSAwOyovCisJCQkvKmN1cnJtYXAtPm1hcHBpbmcgPSBOVUxMOyovCisJCQkvKmN1cnJtYXAtPnNjcmlwdCA9IE5VTEw7Ki8KKwkJCXsKKwkJCQlzdHJ1Y3QgbWFwcGluZ19kZWZuX3QgKip3aGVyZSA9ICZkZWZuLT5tYXBwaW5nczsKKwkJCQl3aGlsZSAoKndoZXJlICE9IE5VTEwpIHsKKwkJCQkJd2hlcmUgPSAmKCp3aGVyZSktPm5leHQ7CisJCQkJfQorCQkJCSp3aGVyZSA9IGN1cnJtYXA7CisJCQkJLypjdXJybWFwLT5uZXh0ID0gTlVMTDsqLworCQkJfQorCQkJZGVidWdfbm9pc2UoIkFkZGVkIG1hcHBpbmdcbiIpOworI2VuZGlmCisJCQljdXJyZW50bHlfcHJvY2Vzc2luZyA9IE1BUFBJTkc7CisJCX0gZWxzZSBpZiAoc3RyY21wKGZpcnN0X3dvcmQsICJpZmFjZSIpID09IDApIHsKKwkJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCAqY29uc3QgYWRkcl9mYW1zW10gPSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVBWNAorCQkJCSZhZGRyX2luZXQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUFY2CisJCQkJJmFkZHJfaW5ldDYsCisjZW5kaWYKKwkJCQlOVUxMCisJCQl9OworCQkJY2hhciAqaWZhY2VfbmFtZTsKKwkJCWNoYXIgKmFkZHJlc3NfZmFtaWx5X25hbWU7CisJCQljaGFyICptZXRob2RfbmFtZTsKKwkJCWxsaXN0X3QgKmlmYWNlX2xpc3Q7CisKKwkJCWN1cnJpZiA9IHh6YWxsb2Moc2l6ZW9mKCpjdXJyaWYpKTsKKwkJCWlmYWNlX25hbWUgPSBuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSk7CisJCQlhZGRyZXNzX2ZhbWlseV9uYW1lID0gbmV4dF93b3JkKCZyZXN0X29mX2xpbmUpOworCQkJbWV0aG9kX25hbWUgPSBuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSk7CisKKwkJCWlmIChtZXRob2RfbmFtZSA9PSBOVUxMKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gZmV3IHBhcmFtZXRlcnMgZm9yIGxpbmUgXCIlc1wiIiwgYnVmKTsKKworCQkJLyogc2hpcCBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCQkJcmVzdF9vZl9saW5lID0gc2tpcF93aGl0ZXNwYWNlKHJlc3Rfb2ZfbGluZSk7CisKKwkJCWlmIChyZXN0X29mX2xpbmVbMF0gIT0gJ1wwJyAvKiAmJiByZXN0X29mX2xpbmVbMF0gIT0gJyMnICovKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBwYXJhbWV0ZXJzIFwiJXNcIiIsIGJ1Zik7CisKKwkJCWN1cnJpZi0+aWZhY2UgPSB4c3RyZHVwKGlmYWNlX25hbWUpOworCisJCQljdXJyaWYtPmFkZHJlc3NfZmFtaWx5ID0gZ2V0X2FkZHJlc3NfZmFtaWx5KGFkZHJfZmFtcywgYWRkcmVzc19mYW1pbHlfbmFtZSk7CisJCQlpZiAoIWN1cnJpZi0+YWRkcmVzc19mYW1pbHkpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gYWRkcmVzcyB0eXBlIFwiJXNcIiIsIGFkZHJlc3NfZmFtaWx5X25hbWUpOworCisJCQljdXJyaWYtPm1ldGhvZCA9IGdldF9tZXRob2QoY3VycmlmLT5hZGRyZXNzX2ZhbWlseSwgbWV0aG9kX25hbWUpOworCQkJaWYgKCFjdXJyaWYtPm1ldGhvZCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBtZXRob2QgXCIlc1wiIiwgbWV0aG9kX25hbWUpOworCisJCQlmb3IgKGlmYWNlX2xpc3QgPSBkZWZuLT5pZmFjZXM7IGlmYWNlX2xpc3Q7IGlmYWNlX2xpc3QgPSBpZmFjZV9saXN0LT5saW5rKSB7CisJCQkJc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKnRtcCA9IChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqKSBpZmFjZV9saXN0LT5kYXRhOworCQkJCWlmICgoc3RyY21wKHRtcC0+aWZhY2UsIGN1cnJpZi0+aWZhY2UpID09IDApCisJCQkJICYmICh0bXAtPmFkZHJlc3NfZmFtaWx5ID09IGN1cnJpZi0+YWRkcmVzc19mYW1pbHkpCisJCQkJKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkdXBsaWNhdGUgaW50ZXJmYWNlIFwiJXNcIiIsIHRtcC0+aWZhY2UpOworCQkJCX0KKwkJCX0KKwkJCWxsaXN0X2FkZF90b19lbmQoJihkZWZuLT5pZmFjZXMpLCAoY2hhciopY3VycmlmKTsKKworCQkJZGVidWdfbm9pc2UoImlmYWNlICVzICVzICVzXG4iLCBjdXJyaWYtPmlmYWNlLCBhZGRyZXNzX2ZhbWlseV9uYW1lLCBtZXRob2RfbmFtZSk7CisJCQljdXJyZW50bHlfcHJvY2Vzc2luZyA9IElGQUNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChmaXJzdF93b3JkLCAiYXV0byIpID09IDApIHsKKwkJCXdoaWxlICgoZmlyc3Rfd29yZCA9IG5leHRfd29yZCgmcmVzdF9vZl9saW5lKSkgIT0gTlVMTCkgeworCisJCQkJLyogQ2hlY2sgdGhlIGludGVyZmFjZSBpc250IGFscmVhZHkgbGlzdGVkICovCisJCQkJaWYgKGxsaXN0X2ZpbmRfc3RyKGRlZm4tPmF1dG9pbnRlcmZhY2VzLCBmaXJzdF93b3JkKSkgeworCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImludGVyZmFjZSBkZWNsYXJlZCBhdXRvIHR3aWNlIFwiJXNcIiIsIGJ1Zik7CisJCQkJfQorCisJCQkJLyogQWRkIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGxpc3QgKi8KKwkJCQlsbGlzdF9hZGRfdG9fZW5kKCYoZGVmbi0+YXV0b2ludGVyZmFjZXMpLCB4c3RyZHVwKGZpcnN0X3dvcmQpKTsKKwkJCQlkZWJ1Z19ub2lzZSgiXG5hdXRvICVzXG4iLCBmaXJzdF93b3JkKTsKKwkJCX0KKwkJCWN1cnJlbnRseV9wcm9jZXNzaW5nID0gTk9ORTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoY3VycmVudGx5X3Byb2Nlc3NpbmcpIHsKKwkJCWNhc2UgSUZBQ0U6CisJCQkJaWYgKHJlc3Rfb2ZfbGluZVswXSA9PSAnXDAnKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgib3B0aW9uIHdpdGggZW1wdHkgdmFsdWUgXCIlc1wiIiwgYnVmKTsKKworCQkJCWlmIChzdHJjbXAoZmlyc3Rfd29yZCwgInVwIikgIT0gMAorCQkJCSAmJiBzdHJjbXAoZmlyc3Rfd29yZCwgImRvd24iKSAhPSAwCisJCQkJICYmIHN0cmNtcChmaXJzdF93b3JkLCAicHJlLXVwIikgIT0gMAorCQkJCSAmJiBzdHJjbXAoZmlyc3Rfd29yZCwgInBvc3QtZG93biIpICE9IDAKKwkJCQkpIHsKKwkJCQkJaW50IGk7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBjdXJyaWYtPm5fb3B0aW9uczsgaSsrKSB7CisJCQkJCQlpZiAoc3RyY21wKGN1cnJpZi0+b3B0aW9uW2ldLm5hbWUsIGZpcnN0X3dvcmQpID09IDApCisJCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImR1cGxpY2F0ZSBvcHRpb24gXCIlc1wiIiwgYnVmKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoY3VycmlmLT5uX29wdGlvbnMgPj0gY3VycmlmLT5tYXhfb3B0aW9ucykgeworCQkJCQljdXJyaWYtPm1heF9vcHRpb25zICs9IDEwOworCQkJCQljdXJyaWYtPm9wdGlvbiA9IHhyZWFsbG9jKGN1cnJpZi0+b3B0aW9uLAorCQkJCQkJc2l6ZW9mKCpjdXJyaWYtPm9wdGlvbikgKiBjdXJyaWYtPm1heF9vcHRpb25zKTsKKwkJCQl9CisJCQkJZGVidWdfbm9pc2UoIlx0JXM9JXNcbiIsIGZpcnN0X3dvcmQsIHJlc3Rfb2ZfbGluZSk7CisJCQkJY3VycmlmLT5vcHRpb25bY3VycmlmLT5uX29wdGlvbnNdLm5hbWUgPSB4c3RyZHVwKGZpcnN0X3dvcmQpOworCQkJCWN1cnJpZi0+b3B0aW9uW2N1cnJpZi0+bl9vcHRpb25zXS52YWx1ZSA9IHhzdHJkdXAocmVzdF9vZl9saW5lKTsKKwkJCQljdXJyaWYtPm5fb3B0aW9ucysrOworCQkJCWJyZWFrOworCQkJY2FzZSBNQVBQSU5HOgorI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcKKwkJCQlpZiAoc3RyY21wKGZpcnN0X3dvcmQsICJzY3JpcHQiKSA9PSAwKSB7CisJCQkJCWlmIChjdXJybWFwLT5zY3JpcHQgIT0gTlVMTCkKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkdXBsaWNhdGUgc2NyaXB0IGluIG1hcHBpbmcgXCIlc1wiIiwgYnVmKTsKKwkJCQkJY3Vycm1hcC0+c2NyaXB0ID0geHN0cmR1cChuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSkpOworCQkJCX0gZWxzZSBpZiAoc3RyY21wKGZpcnN0X3dvcmQsICJtYXAiKSA9PSAwKSB7CisJCQkJCWlmIChjdXJybWFwLT5uX21hcHBpbmdzID49IGN1cnJtYXAtPm1heF9tYXBwaW5ncykgeworCQkJCQkJY3Vycm1hcC0+bWF4X21hcHBpbmdzID0gY3Vycm1hcC0+bWF4X21hcHBpbmdzICogMiArIDE7CisJCQkJCQljdXJybWFwLT5tYXBwaW5nID0geHJlYWxsb2MoY3Vycm1hcC0+bWFwcGluZywKKwkJCQkJCQlzaXplb2YoY2hhciAqKSAqIGN1cnJtYXAtPm1heF9tYXBwaW5ncyk7CisJCQkJCX0KKwkJCQkJY3Vycm1hcC0+bWFwcGluZ1tjdXJybWFwLT5uX21hcHBpbmdzXSA9IHhzdHJkdXAobmV4dF93b3JkKCZyZXN0X29mX2xpbmUpKTsKKwkJCQkJY3Vycm1hcC0+bl9tYXBwaW5ncysrOworCQkJCX0gZWxzZSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtaXNwbGFjZWQgb3B0aW9uIFwiJXNcIiIsIGJ1Zik7CisJCQkJfQorI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIE5PTkU6CisJCQlkZWZhdWx0OgorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtaXNwbGFjZWQgb3B0aW9uIFwiJXNcIiIsIGJ1Zik7CisJCQl9CisJCX0KKwkJZnJlZShidWYpOworCX0gLyogd2hpbGUgKGZnZXRzKSAqLworCisJaWYgKGZlcnJvcihmKSAhPSAwKSB7CisJCS8qIGZlcnJvciBkb2VzIE5PVCBzZXQgZXJybm8hICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogSS9PIGVycm9yIiwgZmlsZW5hbWUpOworCX0KKwlmY2xvc2UoZik7CisKKwlyZXR1cm4gZGVmbjsKK30KKworc3RhdGljIGNoYXIgKnNldGxvY2FsZW52KGNvbnN0IGNoYXIgKmZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJY2hhciAqcmVzdWx0OworCWNoYXIgKmRzdDsKKwljaGFyICpzcmM7CisJY2hhciBjOworCisJcmVzdWx0ID0geGFzcHJpbnRmKGZvcm1hdCwgbmFtZSwgdmFsdWUpOworCisJZm9yIChkc3QgPSBzcmMgPSByZXN1bHQ7IChjID0gKnNyYykgIT0gJz0nICYmIGM7IHNyYysrKSB7CisJCWlmIChjID09ICctJykKKwkJCWMgPSAnXyc7CisJCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKKwkJCWMgLT0gKCdhJyAtICdBJyk7CisJCWlmIChpc2FsbnVtKGMpIHx8IGMgPT0gJ18nKQorCQkJKmRzdCsrID0gYzsKKwl9CisJb3ZlcmxhcHBpbmdfc3RyY3B5KGRzdCwgc3JjKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9lbnZpcm9uKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmFjZSwgY29uc3QgY2hhciAqbW9kZSkKK3sKKwlpbnQgaTsKKwljaGFyICoqcHA7CisKKwlpZiAoRy5teV9lbnZpcm9uICE9IE5VTEwpIHsKKwkJZm9yIChwcCA9IEcubXlfZW52aXJvbjsgKnBwOyBwcCsrKSB7CisJCQlmcmVlKCpwcCk7CisJCX0KKwkJZnJlZShHLm15X2Vudmlyb24pOworCX0KKworCS8qIG5vdGU6IGxhc3QgZWxlbWVudCB3aWxsIHN0YXkgTlVMTDogKi8KKwlHLm15X2Vudmlyb24gPSB4emFsbG9jKHNpemVvZihjaGFyICopICogKGlmYWNlLT5uX29wdGlvbnMgKyA2KSk7CisJcHAgPSBHLm15X2Vudmlyb247CisKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2UtPm5fb3B0aW9uczsgaSsrKSB7CisJCWlmIChzdHJjbXAoaWZhY2UtPm9wdGlvbltpXS5uYW1lLCAidXAiKSA9PSAwCisJCSB8fCBzdHJjbXAoaWZhY2UtPm9wdGlvbltpXS5uYW1lLCAiZG93biIpID09IDAKKwkJIHx8IHN0cmNtcChpZmFjZS0+b3B0aW9uW2ldLm5hbWUsICJwcmUtdXAiKSA9PSAwCisJCSB8fCBzdHJjbXAoaWZhY2UtPm9wdGlvbltpXS5uYW1lLCAicG9zdC1kb3duIikgPT0gMAorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpwcCsrID0gc2V0bG9jYWxlbnYoIklGXyVzPSVzIiwgaWZhY2UtPm9wdGlvbltpXS5uYW1lLCBpZmFjZS0+b3B0aW9uW2ldLnZhbHVlKTsKKwl9CisKKwkqcHArKyA9IHNldGxvY2FsZW52KCIlcz0lcyIsICJJRkFDRSIsIGlmYWNlLT5pZmFjZSk7CisJKnBwKysgPSBzZXRsb2NhbGVudigiJXM9JXMiLCAiQUREUkZBTSIsIGlmYWNlLT5hZGRyZXNzX2ZhbWlseS0+bmFtZSk7CisJKnBwKysgPSBzZXRsb2NhbGVudigiJXM9JXMiLCAiTUVUSE9EIiwgaWZhY2UtPm1ldGhvZC0+bmFtZSk7CisJKnBwKysgPSBzZXRsb2NhbGVudigiJXM9JXMiLCAiTU9ERSIsIG1vZGUpOworCWlmIChHLnN0YXJ0dXBfUEFUSCkKKwkJKnBwKysgPSBzZXRsb2NhbGVudigiJXM9JXMiLCAiUEFUSCIsIEcuc3RhcnR1cF9QQVRIKTsKK30KKworc3RhdGljIGludCBkb2l0KGNoYXIgKnN0cikKK3sKKwlpZiAob3B0aW9uX21hc2szMiAmIChPUFRfbm9fYWN0fE9QVF92ZXJib3NlKSkgeworCQlwdXRzKHN0cik7CisJfQorCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfbm9fYWN0KSkgeworCQlwaWRfdCBjaGlsZDsKKwkJaW50IHN0YXR1czsKKworCQlmZmx1c2hfYWxsKCk7CisJCWNoaWxkID0gdmZvcmsoKTsKKwkJaWYgKGNoaWxkIDwgMCkgLyogZmFpbHVyZSAqLworCQkJcmV0dXJuIDA7CisJCWlmIChjaGlsZCA9PSAwKSB7IC8qIGNoaWxkICovCisJCQlleGVjbGUoRy5zaGVsbCwgRy5zaGVsbCwgIi1jIiwgc3RyLCAoY2hhciAqKSBOVUxMLCBHLm15X2Vudmlyb24pOworCQkJX2V4aXQoMTI3KTsKKwkJfQorCQlzYWZlX3dhaXRwaWQoY2hpbGQsICZzdGF0dXMsIDApOworCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXhlY3V0ZV9hbGwoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgY29uc3QgY2hhciAqb3B0KQoreworCWludCBpOworCWNoYXIgKmJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgaWZkLT5uX29wdGlvbnM7IGkrKykgeworCQlpZiAoc3RyY21wKGlmZC0+b3B0aW9uW2ldLm5hbWUsIG9wdCkgPT0gMCkgeworCQkJaWYgKCFkb2l0KGlmZC0+b3B0aW9uW2ldLnZhbHVlKSkgeworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJYnVmID0geGFzcHJpbnRmKCJydW4tcGFydHMgL2V0Yy9uZXR3b3JrL2lmLSVzLmQiLCBvcHQpOworCS8qIGhlaCwgd2UgZG9uJ3QgYm90aGVyIGZyZWUnaW5nIGl0ICovCisJcmV0dXJuIGRvaXQoYnVmKTsKK30KKworc3RhdGljIGludCBjaGVjayhjaGFyICpzdHIpCit7CisJcmV0dXJuIHN0ciAhPSBOVUxMOworfQorCitzdGF0aWMgaW50IGlmYWNlX3VwKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmFjZSkKK3sKKwlpZiAoIWlmYWNlLT5tZXRob2QtPnVwKGlmYWNlLCBjaGVjaykpIHJldHVybiAtMTsKKwlzZXRfZW52aXJvbihpZmFjZSwgInN0YXJ0Iik7CisJaWYgKCFleGVjdXRlX2FsbChpZmFjZSwgInByZS11cCIpKSByZXR1cm4gMDsKKwlpZiAoIWlmYWNlLT5tZXRob2QtPnVwKGlmYWNlLCBkb2l0KSkgcmV0dXJuIDA7CisJaWYgKCFleGVjdXRlX2FsbChpZmFjZSwgInVwIikpIHJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlmYWNlX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmYWNlKQoreworCWlmICghaWZhY2UtPm1ldGhvZC0+ZG93bihpZmFjZSxjaGVjaykpIHJldHVybiAtMTsKKwlzZXRfZW52aXJvbihpZmFjZSwgInN0b3AiKTsKKwlpZiAoIWV4ZWN1dGVfYWxsKGlmYWNlLCAiZG93biIpKSByZXR1cm4gMDsKKwlpZiAoIWlmYWNlLT5tZXRob2QtPmRvd24oaWZhY2UsIGRvaXQpKSByZXR1cm4gMDsKKwlpZiAoIWV4ZWN1dGVfYWxsKGlmYWNlLCAicG9zdC1kb3duIikpIHJldHVybiAwOworCXJldHVybiAxOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORworc3RhdGljIGludCBwb3BlbjIoRklMRSAqKmluLCBGSUxFICoqb3V0LCBjaGFyICpjb21tYW5kLCBjaGFyICpwYXJhbSkKK3sKKwljaGFyICphcmd2WzNdID0geyBjb21tYW5kLCBwYXJhbSwgTlVMTCB9OworCXN0cnVjdCBmZF9wYWlyIGluZmQsIG91dGZkOworCXBpZF90IHBpZDsKKworCXhwaXBlZF9wYWlyKGluZmQpOworCXhwaXBlZF9wYWlyKG91dGZkKTsKKworCWZmbHVzaF9hbGwoKTsKKwlwaWQgPSB4dmZvcmsoKTsKKworCWlmIChwaWQgPT0gMCkgeworCQkvKiBDaGlsZCAqLworCQkvKiBOQjogY2xvc2UgX2ZpcnN0XywgdGhlbiBtb3ZlIGZkcyEgKi8KKwkJY2xvc2UoaW5mZC53cik7CisJCWNsb3NlKG91dGZkLnJkKTsKKwkJeG1vdmVfZmQoaW5mZC5yZCwgMCk7CisJCXhtb3ZlX2ZkKG91dGZkLndyLCAxKTsKKwkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwl9CisJLyogcGFyZW50ICovCisJY2xvc2UoaW5mZC5yZCk7CisJY2xvc2Uob3V0ZmQud3IpOworCSppbiA9IHhmZG9wZW5fZm9yX3dyaXRlKGluZmQud3IpOworCSpvdXQgPSB4ZmRvcGVuX2Zvcl9yZWFkKG91dGZkLnJkKTsKKwlyZXR1cm4gcGlkOworfQorCitzdGF0aWMgY2hhciAqcnVuX21hcHBpbmcoY2hhciAqcGh5c2ljYWwsIHN0cnVjdCBtYXBwaW5nX2RlZm5fdCAqbWFwKQoreworCUZJTEUgKmluLCAqb3V0OworCWludCBpLCBzdGF0dXM7CisJcGlkX3QgcGlkOworCisJY2hhciAqbG9naWNhbCA9IHhzdHJkdXAocGh5c2ljYWwpOworCisJLyogUnVuIHRoZSBtYXBwaW5nIHNjcmlwdC4gTmV2ZXIgZmFpbHMuICovCisJcGlkID0gcG9wZW4yKCZpbiwgJm91dCwgbWFwLT5zY3JpcHQsIHBoeXNpY2FsKTsKKworCS8qIFdyaXRlIG1hcHBpbmdzIHRvIHN0ZGluIG9mIG1hcHBpbmcgc2NyaXB0LiAqLworCWZvciAoaSA9IDA7IGkgPCBtYXAtPm5fbWFwcGluZ3M7IGkrKykgeworCQlmcHJpbnRmKGluLCAiJXNcbiIsIG1hcC0+bWFwcGluZ1tpXSk7CisJfQorCWZjbG9zZShpbik7CisJc2FmZV93YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7CisKKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykgJiYgV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwKSB7CisJCS8qIElmIHRoZSBtYXBwaW5nIHNjcmlwdCBleGl0ZWQgc3VjY2Vzc2Z1bGx5LCB0cnkgdG8KKwkJICogZ3JhYiBhIGxpbmUgb2Ygb3V0cHV0IGFuZCB1c2UgdGhhdCBhcyB0aGUgbmFtZSBvZiB0aGUKKwkJICogbG9naWNhbCBpbnRlcmZhY2UuICovCisJCWNoYXIgKm5ld19sb2dpY2FsID0geG1hbGxvY19mZ2V0bGluZShvdXQpOworCisJCWlmIChuZXdfbG9naWNhbCkgeworCQkJLyogSWYgd2UgYXJlIGFibGUgdG8gcmVhZCBhIGxpbmUgb2Ygb3V0cHV0IGZyb20gdGhlIHNjcmlwdCwKKwkJCSAqIHJlbW92ZSBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgdXNlIHRoaXMgdmFsdWUKKwkJCSAqIGFzIHRoZSBuYW1lIG9mIHRoZSBsb2dpY2FsIGludGVyZmFjZS4gKi8KKwkJCWNoYXIgKnBjaCA9IG5ld19sb2dpY2FsICsgc3RybGVuKG5ld19sb2dpY2FsKSAtIDE7CisKKwkJCXdoaWxlIChwY2ggPj0gbmV3X2xvZ2ljYWwgJiYgaXNzcGFjZSgqcGNoKSkKKwkJCQkqKHBjaC0tKSA9ICdcMCc7CisKKwkJCWZyZWUobG9naWNhbCk7CisJCQlsb2dpY2FsID0gbmV3X2xvZ2ljYWw7CisJCX0KKwl9CisKKwlmY2xvc2Uob3V0KTsKKworCXJldHVybiBsb2dpY2FsOworfQorI2VuZGlmIC8qIEZFQVRVUkVfSUZVUERPV05fTUFQUElORyAqLworCitzdGF0aWMgbGxpc3RfdCAqZmluZF9pZmFjZV9zdGF0ZShsbGlzdF90ICpzdGF0ZV9saXN0LCBjb25zdCBjaGFyICppZmFjZSkKK3sKKwl1bnNpZ25lZCBpZmFjZV9sZW4gPSBzdHJsZW4oaWZhY2UpOworCWxsaXN0X3QgKnNlYXJjaCA9IHN0YXRlX2xpc3Q7CisKKwl3aGlsZSAoc2VhcmNoKSB7CisJCWlmICgoc3RybmNtcChzZWFyY2gtPmRhdGEsIGlmYWNlLCBpZmFjZV9sZW4pID09IDApCisJCSAmJiAoc2VhcmNoLT5kYXRhW2lmYWNlX2xlbl0gPT0gJz0nKQorCQkpIHsKKwkJCXJldHVybiBzZWFyY2g7CisJCX0KKwkJc2VhcmNoID0gc2VhcmNoLT5saW5rOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogcmVhZCB0aGUgcHJldmlvdXMgc3RhdGUgZnJvbSB0aGUgc3RhdGUgZmlsZSAqLworc3RhdGljIGxsaXN0X3QgKnJlYWRfaWZhY2Vfc3RhdGUodm9pZCkKK3sKKwlsbGlzdF90ICpzdGF0ZV9saXN0ID0gTlVMTDsKKwlGSUxFICpzdGF0ZV9mcCA9IGZvcGVuX2Zvcl9yZWFkKENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEgpOworCisJaWYgKHN0YXRlX2ZwKSB7CisJCWNoYXIgKnN0YXJ0LCAqZW5kX3B0cjsKKwkJd2hpbGUgKChzdGFydCA9IHhtYWxsb2NfZmdldHMoc3RhdGVfZnApKSAhPSBOVUxMKSB7CisJCQkvKiBXZSBzaG91bGQgb25seSBuZWVkIHRvIGNoZWNrIGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgKi8KKwkJCWVuZF9wdHIgPSBzdGFydCArIHN0cmNzcG4oc3RhcnQsICIgXHRcbiIpOworCQkJKmVuZF9wdHIgPSAnXDAnOworCQkJbGxpc3RfYWRkX3RvKCZzdGF0ZV9saXN0LCBzdGFydCk7CisJCX0KKwkJZmNsb3NlKHN0YXRlX2ZwKTsKKwl9CisJcmV0dXJuIHN0YXRlX2xpc3Q7Cit9CisKKworaW50IGlmdXBkb3duX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpZnVwZG93bl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50ICgqY21kcykoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKik7CisJc3RydWN0IGludGVyZmFjZXNfZmlsZV90ICpkZWZuOworCWxsaXN0X3QgKnRhcmdldF9saXN0ID0gTlVMTDsKKwljb25zdCBjaGFyICppbnRlcmZhY2VzID0gIi9ldGMvbmV0d29yay9pbnRlcmZhY2VzIjsKKwlib29sIGFueV9mYWlsdXJlcyA9IDA7CisKKwlJTklUX0coKTsKKworCUcuc3RhcnR1cF9QQVRIID0gZ2V0ZW52KCJQQVRIIik7CisJRy5zaGVsbCA9IHhzdHJkdXAoZ2V0X3NoZWxsX25hbWUoKSk7CisKKwljbWRzID0gaWZhY2VfZG93bjsKKwlpZiAoYXBwbGV0X25hbWVbMl0gPT0gJ3UnKSB7CisJCS8qIGlmdXAgY29tbWFuZCAqLworCQljbWRzID0gaWZhY2VfdXA7CisJfQorCisJZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUiwgJmludGVyZmFjZXMpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChhcmd2WzBdKSB7CisJCWlmIChET19BTEwpIGJiX3Nob3dfdXNhZ2UoKTsKKwl9IGVsc2UgeworCQlpZiAoIURPX0FMTCkgYmJfc2hvd191c2FnZSgpOworCX0KKworCWRlYnVnX25vaXNlKCJyZWFkaW5nICVzIGZpbGU6XG4iLCBpbnRlcmZhY2VzKTsKKwlkZWZuID0gcmVhZF9pbnRlcmZhY2VzKGludGVyZmFjZXMpOworCWRlYnVnX25vaXNlKCJcbmRvbmUgcmVhZGluZyAlc1xuXG4iLCBpbnRlcmZhY2VzKTsKKworCS8qIENyZWF0ZSBhIGxpc3Qgb2YgaW50ZXJmYWNlcyB0byB3b3JrIG9uICovCisJaWYgKERPX0FMTCkgeworCQl0YXJnZXRfbGlzdCA9IGRlZm4tPmF1dG9pbnRlcmZhY2VzOworCX0gZWxzZSB7CisJCWxsaXN0X2FkZF90b19lbmQoJnRhcmdldF9saXN0LCBhcmd2WzBdKTsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIGludGVyZmFjZXMgKi8KKwl3aGlsZSAodGFyZ2V0X2xpc3QpIHsKKwkJbGxpc3RfdCAqaWZhY2VfbGlzdDsKKwkJc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmN1cnJpZjsKKwkJY2hhciAqaWZhY2U7CisJCWNoYXIgKmxpZmFjZTsKKwkJY2hhciAqcGNoOworCQlib29sIG9rYXkgPSAwOworCQlpbnQgY21kc19yZXQ7CisKKwkJaWZhY2UgPSB4c3RyZHVwKHRhcmdldF9saXN0LT5kYXRhKTsKKwkJdGFyZ2V0X2xpc3QgPSB0YXJnZXRfbGlzdC0+bGluazsKKworCQlwY2ggPSBzdHJjaHIoaWZhY2UsICc9Jyk7CisJCWlmIChwY2gpIHsKKwkJCSpwY2ggPSAnXDAnOworCQkJbGlmYWNlID0geHN0cmR1cChwY2ggKyAxKTsKKwkJfSBlbHNlIHsKKwkJCWxpZmFjZSA9IHhzdHJkdXAoaWZhY2UpOworCQl9CisKKwkJaWYgKCFGT1JDRSkgeworCQkJbGxpc3RfdCAqc3RhdGVfbGlzdCA9IHJlYWRfaWZhY2Vfc3RhdGUoKTsKKwkJCWNvbnN0IGxsaXN0X3QgKmlmYWNlX3N0YXRlID0gZmluZF9pZmFjZV9zdGF0ZShzdGF0ZV9saXN0LCBpZmFjZSk7CisKKwkJCWlmIChjbWRzID09IGlmYWNlX3VwKSB7CisJCQkJLyogaWZ1cCAqLworCQkJCWlmIChpZmFjZV9zdGF0ZSkgeworCQkJCQliYl9lcnJvcl9tc2coImludGVyZmFjZSAlcyBhbHJlYWR5IGNvbmZpZ3VyZWQiLCBpZmFjZSk7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIGlmZG93biAqLworCQkJCWlmICghaWZhY2Vfc3RhdGUpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJpbnRlcmZhY2UgJXMgbm90IGNvbmZpZ3VyZWQiLCBpZmFjZSk7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQlsbGlzdF9mcmVlKHN0YXRlX2xpc3QsIGZyZWUpOworCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HCisJCWlmICgoY21kcyA9PSBpZmFjZV91cCkgJiYgIU5PX01BUFBJTkdTKSB7CisJCQlzdHJ1Y3QgbWFwcGluZ19kZWZuX3QgKmN1cnJtYXA7CisKKwkJCWZvciAoY3Vycm1hcCA9IGRlZm4tPm1hcHBpbmdzOyBjdXJybWFwOyBjdXJybWFwID0gY3Vycm1hcC0+bmV4dCkgeworCQkJCWludCBpOworCQkJCWZvciAoaSA9IDA7IGkgPCBjdXJybWFwLT5uX21hdGNoZXM7IGkrKykgeworCQkJCQlpZiAoZm5tYXRjaChjdXJybWFwLT5tYXRjaFtpXSwgbGlmYWNlLCAwKSAhPSAwKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChWRVJCT1NFKSB7CisJCQkJCQlwcmludGYoIlJ1bm5pbmcgbWFwcGluZyBzY3JpcHQgJXMgb24gJXNcbiIsIGN1cnJtYXAtPnNjcmlwdCwgbGlmYWNlKTsKKwkJCQkJfQorCQkJCQlsaWZhY2UgPSBydW5fbWFwcGluZyhpZmFjZSwgY3Vycm1hcCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJaWZhY2VfbGlzdCA9IGRlZm4tPmlmYWNlczsKKwkJd2hpbGUgKGlmYWNlX2xpc3QpIHsKKwkJCWN1cnJpZiA9IChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqKSBpZmFjZV9saXN0LT5kYXRhOworCQkJaWYgKHN0cmNtcChsaWZhY2UsIGN1cnJpZi0+aWZhY2UpID09IDApIHsKKwkJCQljaGFyICpvbGRpZmFjZSA9IGN1cnJpZi0+aWZhY2U7CisKKwkJCQlva2F5ID0gMTsKKwkJCQljdXJyaWYtPmlmYWNlID0gaWZhY2U7CisKKwkJCQlkZWJ1Z19ub2lzZSgiXG5Db25maWd1cmluZyBpbnRlcmZhY2UgJXMgKCVzKVxuIiwgbGlmYWNlLCBjdXJyaWYtPmFkZHJlc3NfZmFtaWx5LT5uYW1lKTsKKworCQkJCS8qIENhbGwgdGhlIGNtZHMgZnVuY3Rpb24gcG9pbnRlciwgZG9lcyBlaXRoZXIgaWZhY2VfdXAoKSBvciBpZmFjZV9kb3duKCkgKi8KKwkJCQljbWRzX3JldCA9IGNtZHMoY3VycmlmKTsKKwkJCQlpZiAoY21kc19yZXQgPT0gLTEpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJkb24ndCBzZWVtIHRvIGhhdmUgYWxsIHRoZSB2YXJpYWJsZXMgZm9yICVzLyVzIiwKKwkJCQkJCQlsaWZhY2UsIGN1cnJpZi0+YWRkcmVzc19mYW1pbHktPm5hbWUpOworCQkJCQlhbnlfZmFpbHVyZXMgPSAxOworCQkJCX0gZWxzZSBpZiAoY21kc19yZXQgPT0gMCkgeworCQkJCQlhbnlfZmFpbHVyZXMgPSAxOworCQkJCX0KKworCQkJCWN1cnJpZi0+aWZhY2UgPSBvbGRpZmFjZTsKKwkJCX0KKwkJCWlmYWNlX2xpc3QgPSBpZmFjZV9saXN0LT5saW5rOworCQl9CisJCWlmIChWRVJCT1NFKSB7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisKKwkJaWYgKCFva2F5ICYmICFGT1JDRSkgeworCQkJYmJfZXJyb3JfbXNnKCJpZ25vcmluZyB1bmtub3duIGludGVyZmFjZSAlcyIsIGxpZmFjZSk7CisJCQlhbnlfZmFpbHVyZXMgPSAxOworCQl9IGVsc2UgaWYgKCFOT19BQ1QpIHsKKwkJCS8qIHVwZGF0ZSB0aGUgc3RhdGUgZmlsZSAqLworCQkJRklMRSAqc3RhdGVfZnA7CisJCQlsbGlzdF90ICpzdGF0ZTsKKwkJCWxsaXN0X3QgKnN0YXRlX2xpc3QgPSByZWFkX2lmYWNlX3N0YXRlKCk7CisJCQlsbGlzdF90ICppZmFjZV9zdGF0ZSA9IGZpbmRfaWZhY2Vfc3RhdGUoc3RhdGVfbGlzdCwgaWZhY2UpOworCisJCQlpZiAoY21kcyA9PSBpZmFjZV91cCkgeworCQkJCWNoYXIgKiBjb25zdCBuZXdpZmFjZSA9IHhhc3ByaW50ZigiJXM9JXMiLCBpZmFjZSwgbGlmYWNlKTsKKwkJCQlpZiAoaWZhY2Vfc3RhdGUgPT0gTlVMTCkgeworCQkJCQlsbGlzdF9hZGRfdG9fZW5kKCZzdGF0ZV9saXN0LCBuZXdpZmFjZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZnJlZShpZmFjZV9zdGF0ZS0+ZGF0YSk7CisJCQkJCWlmYWNlX3N0YXRlLT5kYXRhID0gbmV3aWZhY2U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBSZW1vdmUgYW4gaW50ZXJmYWNlIGZyb20gc3RhdGVfbGlzdCAqLworCQkJCWxsaXN0X3VubGluaygmc3RhdGVfbGlzdCwgaWZhY2Vfc3RhdGUpOworCQkJCWZyZWUobGxpc3RfcG9wKCZpZmFjZV9zdGF0ZSkpOworCQkJfQorCisJCQkvKiBBY3R1YWxseSB3cml0ZSB0aGUgbmV3IHN0YXRlICovCisJCQlzdGF0ZV9mcCA9IHhmb3Blbl9mb3Jfd3JpdGUoQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSCk7CisJCQlzdGF0ZSA9IHN0YXRlX2xpc3Q7CisJCQl3aGlsZSAoc3RhdGUpIHsKKwkJCQlpZiAoc3RhdGUtPmRhdGEpIHsKKwkJCQkJZnByaW50ZihzdGF0ZV9mcCwgIiVzXG4iLCBzdGF0ZS0+ZGF0YSk7CisJCQkJfQorCQkJCXN0YXRlID0gc3RhdGUtPmxpbms7CisJCQl9CisJCQlmY2xvc2Uoc3RhdGVfZnApOworCQkJbGxpc3RfZnJlZShzdGF0ZV9saXN0LCBmcmVlKTsKKwkJfQorIG5leHQ6CisJCWZyZWUoaWZhY2UpOworCQlmcmVlKGxpZmFjZSk7CisJfQorCisJcmV0dXJuIGFueV9mYWlsdXJlczsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaW5ldGQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaW5ldGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWFkOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pbmV0ZC5jCkBAIC0wLDAgKzEsMTYzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiAgICAgICRTbGFja3dhcmU6IGluZXRkLmMgMS43OXMgMjAwMS8wMi8wNiAxMzoxODowMCB2b2xrZXJkaSBFeHAgJCAgICAqLworLyogICAgICAkT3BlbkJTRDogaW5ldGQuYyx2IDEuNzkgMjAwMS8wMS8zMCAwODozMDo1NyBkZXJhYWR0IEV4cCAkICAgICAgKi8KKy8qICAgICAgJE5ldEJTRDogaW5ldGQuYyx2IDEuMTEgMTk5Ni8wMi8yMiAxMToxNDo0MSBteWNyb2Z0IEV4cCAkICAgICAgICovCisvKiBCdXN5Ym94IHBvcnQgYnkgVmxhZGltaXIgT2xleW5payAoQykgMjAwMS0yMDA1IDxkem9Ac2ltdHJlYXMucnU+ICAgICAqLworLyogSVB2NiBzdXBwb3J0LCBtYW55IGJ1ZyBmaXhlcyBieSBEZW55cyBWbGFzZW5rbyAoYykgMjAwOCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBJbmV0ZCAtIEludGVybmV0IHN1cGVyLXNlcnZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpbnZva2VzIGNvbmZpZ3VyZWQgc2VydmljZXMgd2hlbiBhIGNvbm5lY3Rpb24KKyAqIGZyb20gYSBwZWVyIGlzIGVzdGFibGlzaGVkIG9yIGEgZGF0YWdyYW0gYXJyaXZlcy4KKyAqIENvbm5lY3Rpb24tb3JpZW50ZWQgc2VydmljZXMgYXJlIGludm9rZWQgZWFjaCB0aW1lIGEKKyAqIGNvbm5lY3Rpb24gaXMgbWFkZSwgYnkgY3JlYXRpbmcgYSBwcm9jZXNzLiAgVGhpcyBwcm9jZXNzCisgKiBpcyBwYXNzZWQgdGhlIGNvbm5lY3Rpb24gYXMgZmlsZSBkZXNjcmlwdG9yIDAgYW5kIGlzCisgKiBleHBlY3RlZCB0byBkbyBhIGdldHBlZXJuYW1lIHRvIGZpbmQgb3V0IHBlZXIncyBob3N0CisgKiBhbmQgcG9ydC4KKyAqIERhdGFncmFtIG9yaWVudGVkIHNlcnZpY2VzIGFyZSBpbnZva2VkIHdoZW4gYSBkYXRhZ3JhbQorICogYXJyaXZlczsgYSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHBhc3NlZCBhIHBlbmRpbmcgbWVzc2FnZQorICogb24gZmlsZSBkZXNjcmlwdG9yIDAuIHBlZXIncyBhZGRyZXNzIGNhbiBiZSBvYnRhaW5lZAorICogdXNpbmcgcmVjdmZyb20uCisgKgorICogSW5ldGQgdXNlcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3aGljaCBpcyByZWFkIGF0IHN0YXJ0dXAKKyAqIGFuZCwgcG9zc2libHksIGF0IHNvbWUgbGF0ZXIgdGltZSBpbiByZXNwb25zZSB0byBhIGhhbmd1cCBzaWduYWwuCisgKiBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzICJmcmVlIGZvcm1hdCIgd2l0aCBmaWVsZHMgZ2l2ZW4gaW4gdGhlCisgKiBvcmRlciBzaG93biBiZWxvdy4gIENvbnRpbnVhdGlvbiBsaW5lcyBmb3IgYW4gZW50cnkgbXVzdCBiZWdpbiB3aXRoCisgKiBhIHNwYWNlIG9yIHRhYi4gIEFsbCBmaWVsZHMgbXVzdCBiZSBwcmVzZW50IGluIGVhY2ggZW50cnkuCisgKgorICogICAgICBzZXJ2aWNlX25hbWUgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgaW4gL2V0Yy9zZXJ2aWNlcworICogICAgICBzb2NrZXRfdHlwZSAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS9kZ3JhbS9yYXcvcmRtL3NlcXBhY2tldAorICogICAgICBwcm90b2NvbCAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgaW4gL2V0Yy9wcm90b2NvbHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXN1YWxseSAidGNwIiBvciAidWRwIikKKyAqICAgICAgd2FpdC9ub3dhaXRbLm1heF0gICAgICAgICAgICAgICBzaW5nbGUtdGhyZWFkZWQvbXVsdGktdGhyZWFkZWQsIG1heCAjCisgKiAgICAgIHVzZXJbLmdyb3VwXSBvciB1c2VyWzpncm91cF0gICAgdXNlci9ncm91cCB0byBydW4gZGFlbW9uIGFzCisgKiAgICAgIHNlcnZlcl9wcm9ncmFtICAgICAgICAgICAgICAgICAgZnVsbCBwYXRoIG5hbWUKKyAqICAgICAgc2VydmVyX3Byb2dyYW1fYXJndW1lbnRzICAgICAgICBtYXhpbXVtIG9mIE1BWEFSR1MgKDIwKQorICoKKyAqIEZvciBSUEMgc2VydmljZXMKKyAqICAgICAgc2VydmljZV9uYW1lL3ZlcnNpb24gICAgICAgICAgICBtdXN0IGJlIGluIC9ldGMvcnBjCisgKiAgICAgIHNvY2tldF90eXBlICAgICAgICAgICAgICAgICAgICAgc3RyZWFtL2RncmFtL3Jhdy9yZG0vc2VxcGFja2V0CisgKiAgICAgIHJwYy9wcm90b2NvbCAgICAgICAgICAgICAgICAgICAgInJwYy90Y3AiIGV0YworICogICAgICB3YWl0L25vd2FpdFsubWF4XSAgICAgICAgICAgICAgIHNpbmdsZS10aHJlYWRlZC9tdWx0aS10aHJlYWRlZAorICogICAgICB1c2VyWy5ncm91cF0gb3IgdXNlcls6Z3JvdXBdICAgIHVzZXIgdG8gcnVuIGRhZW1vbiBhcworICogICAgICBzZXJ2ZXJfcHJvZ3JhbSAgICAgICAgICAgICAgICAgIGZ1bGwgcGF0aCBuYW1lCisgKiAgICAgIHNlcnZlcl9wcm9ncmFtX2FyZ3VtZW50cyAgICAgICAgbWF4aW11bSBvZiBNQVhBUkdTICgyMCkKKyAqCisgKiBGb3Igbm9uLVJQQyBzZXJ2aWNlcywgdGhlICJzZXJ2aWNlIG5hbWUiIGNhbiBiZSBvZiB0aGUgZm9ybQorICogaG9zdGFkZHJlc3M6c2VydmljZW5hbWUsIGluIHdoaWNoIGNhc2UgdGhlIGhvc3RhZGRyZXNzIGlzIHVzZWQKKyAqIGFzIHRoZSBob3N0IHBvcnRpb24gb2YgdGhlIGFkZHJlc3MgdG8gbGlzdGVuIG9uLiAgSWYgaG9zdGFkZHJlc3MKKyAqIGNvbnNpc3RzIG9mIGEgc2luZ2xlICcqJyBjaGFyYWN0ZXIsIElOQUREUl9BTlkgaXMgdXNlZC4KKyAqCisgKiBBIGxpbmUgY2FuIGFsc28gY29uc2lzdCBvZiBqdXN0CisgKiAgICAgIGhvc3RhZGRyZXNzOgorICogd2hlcmUgaG9zdGFkZHJlc3MgaXMgYXMgaW4gdGhlIHByZWNlZGluZyBwYXJhZ3JhcGguICBTdWNoIGEgbGluZSBtdXN0CisgKiBoYXZlIG5vIGZ1cnRoZXIgZmllbGRzOyB0aGUgc3BlY2lmaWVkIGhvc3RhZGRyZXNzIGlzIHJlbWVtYmVyZWQgYW5kCisgKiB1c2VkIGZvciBhbGwgZnVydGhlciBsaW5lcyB0aGF0IGhhdmUgbm8gaG9zdGFkZHJlc3Mgc3BlY2lmaWVkLAorICogdW50aWwgdGhlIG5leHQgc3VjaCBsaW5lIChvciBFT0YpLiAgKFRoaXMgaXMgd2h5ICogaXMgcHJvdmlkZWQgdG8KKyAqIGFsbG93IGV4cGxpY2l0IHNwZWNpZmljYXRpb24gb2YgSU5BRERSX0FOWS4pICBBIGxpbmUKKyAqICAgICAgKjoKKyAqIGlzIGltcGxpY2l0bHkgaW4gZWZmZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKgorICogVGhlIGhvc3RhZGRyZXNzIHNwZWNpZmllciBtYXkgKGFuZCBvZnRlbiB3aWxsKSBjb250YWluIGRvdHM7CisgKiB0aGUgc2VydmljZSBuYW1lIG11c3Qgbm90LgorICoKKyAqIEZvciBSUEMgc2VydmljZXMsIGhvc3QtYWRkcmVzcyBzcGVjaWZpZXJzIGFyZSBhY2NlcHRlZCBhbmQgd2lsbAorICogd29yayB0byBzb21lIGV4dGVudDsgaG93ZXZlciwgYmVjYXVzZSBvZiBsaW1pdGF0aW9ucyBpbiB0aGUKKyAqIHBvcnRtYXBwZXIgaW50ZXJmYWNlLCBpdCB3aWxsIG5vdCB3b3JrIHRvIHRyeSB0byBnaXZlIG1vcmUgdGhhbgorICogb25lIGxpbmUgZm9yIGFueSBnaXZlbiBSUEMgc2VydmljZSwgZXZlbiBpZiB0aGUgaG9zdC1hZGRyZXNzCisgKiBzcGVjaWZpZXJzIGFyZSBkaWZmZXJlbnQuCisgKgorICogQ29tbWVudCBsaW5lcyBhcmUgaW5kaWNhdGVkIGJ5IGEgJyMnIGluIGNvbHVtbiAxLgorICovCisKKy8qIGluZXRkIHJ1bGVzIGZvciBwYXNzaW5nIGZpbGUgZGVzY3JpcHRvcnMgdG8gY2hpbGRyZW4KKyAqIChodHRwOi8vd3d3LmZyZWVic2Qub3JnL2NnaS9tYW4uY2dpP3F1ZXJ5PWluZXRkKToKKyAqCisgKiBUaGUgd2FpdC9ub3dhaXQgZW50cnkgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHNlcnZlciB0aGF0IGlzIGludm9rZWQgYnkKKyAqIGluZXRkIHdpbGwgdGFrZSBvdmVyIHRoZSBzb2NrZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlIGFjY2VzcyBwb2ludCwKKyAqIGFuZCB0aHVzIHdoZXRoZXIgaW5ldGQgc2hvdWxkIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gZXhpdCBiZWZvcmUgbGlzdGVuLQorICogaW5nIGZvciBuZXcgc2VydmljZSByZXF1ZXN0cy4gIERhdGFncmFtIHNlcnZlcnMgbXVzdCB1c2UgIndhaXQiLCBhcworICogdGhleSBhcmUgYWx3YXlzIGludm9rZWQgd2l0aCB0aGUgb3JpZ2luYWwgZGF0YWdyYW0gc29ja2V0IGJvdW5kIHRvIHRoZQorICogc3BlY2lmaWVkIHNlcnZpY2UgYWRkcmVzcy4gIFRoZXNlIHNlcnZlcnMgbXVzdCByZWFkIGF0IGxlYXN0IG9uZSBkYXRhZ3JhbQorICogZnJvbSB0aGUgc29ja2V0IGJlZm9yZSBleGl0aW5nLiAgSWYgYSBkYXRhZ3JhbSBzZXJ2ZXIgY29ubmVjdHMgdG8gaXRzCisgKiBwZWVyLCBmcmVlaW5nIHRoZSBzb2NrZXQgc28gaW5ldGQgY2FuIHJlY2VpdmUgZnVydGhlciBtZXNzYWdlcyBvbiB0aGUKKyAqIHNvY2tldCwgaXQgaXMgc2FpZCB0byBiZSBhICJtdWx0aS10aHJlYWRlZCIgc2VydmVyOyBpdCBzaG91bGQgcmVhZCBvbmUKKyAqIGRhdGFncmFtIGZyb20gdGhlIHNvY2tldCBhbmQgY3JlYXRlIGEgbmV3IHNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIHBlZXIuCisgKiBJdCBzaG91bGQgZm9yaywgYW5kIHRoZSBwYXJlbnQgc2hvdWxkIHRoZW4gZXhpdCB0byBhbGxvdyBpbmV0ZCB0byBjaGVjaworICogZm9yIG5ldyBzZXJ2aWNlIHJlcXVlc3RzIHRvIHNwYXduIG5ldyBzZXJ2ZXJzLiAgRGF0YWdyYW0gc2VydmVycyB3aGljaAorICogcHJvY2VzcyBhbGwgaW5jb21pbmcgZGF0YWdyYW1zIG9uIGEgc29ja2V0IGFuZCBldmVudHVhbGx5IHRpbWUgb3V0IGFyZQorICogc2FpZCB0byBiZSAic2luZ2xlLXRocmVhZGVkIi4gIFRoZSBjb21zYXQoOCksIGJpZmYoMSkgYW5kIHRhbGtkKDgpCisgKiB1dGlsaXRpZXMgYXJlIGJvdGggZXhhbXBsZXMgb2YgdGhlIGxhdHRlciB0eXBlIG9mIGRhdGFncmFtIHNlcnZlci4gIFRoZQorICogdGZ0cGQoOCkgdXRpbGl0eSBpcyBhbiBleGFtcGxlIG9mIGEgbXVsdGktdGhyZWFkZWQgZGF0YWdyYW0gc2VydmVyLgorICoKKyAqIFNlcnZlcnMgdXNpbmcgc3RyZWFtIHNvY2tldHMgZ2VuZXJhbGx5IGFyZSBtdWx0aS10aHJlYWRlZCBhbmQgdXNlIHRoZQorICogIm5vd2FpdCIgZW50cnkuIENvbm5lY3Rpb24gcmVxdWVzdHMgZm9yIHRoZXNlIHNlcnZpY2VzIGFyZSBhY2NlcHRlZCBieQorICogaW5ldGQsIGFuZCB0aGUgc2VydmVyIGlzIGdpdmVuIG9ubHkgdGhlIG5ld2x5LWFjY2VwdGVkIHNvY2tldCBjb25uZWN0ZWQKKyAqIHRvIGEgY2xpZW50IG9mIHRoZSBzZXJ2aWNlLiAgTW9zdCBzdHJlYW0tYmFzZWQgc2VydmljZXMgb3BlcmF0ZSBpbiB0aGlzCisgKiBtYW5uZXIuICBTdHJlYW0tYmFzZWQgc2VydmVycyB0aGF0IHVzZSAid2FpdCIgYXJlIHN0YXJ0ZWQgd2l0aCB0aGUgbGlzLQorICogdGVuaW5nIHNlcnZpY2Ugc29ja2V0LCBhbmQgbXVzdCBhY2NlcHQgYXQgbGVhc3Qgb25lIGNvbm5lY3Rpb24gcmVxdWVzdAorICogYmVmb3JlIGV4aXRpbmcuICBTdWNoIGEgc2VydmVyIHdvdWxkIG5vcm1hbGx5IGFjY2VwdCBhbmQgcHJvY2VzcyBpbmNvbWluZworICogY29ubmVjdGlvbiByZXF1ZXN0cyB1bnRpbCBhIHRpbWVvdXQuCisgKi8KKworLyogRGVzcGl0ZSBvZiBhYm92ZSBkb2Mgc2F5aW5nIHRoYXQgZGdyYW0gc2VydmljZXMgbXVzdCB1c2UgIndhaXQiLAorICogInVkcCBub3dhaXQiIHNlcnZlcnMgYXJlIGltcGxlbWVudGVkIGluIGJ1c3lib3hlZCBpbmV0ZC4KKyAqIElQdjYgYWRkcmVzc2VzIGFyZSBhbHNvIGltcGxlbWVudGVkLiBIb3dldmVyLCB0aGV5IG1heSBsb29rIHVnbHkgLQorICogIjo6OnNlcnZpY2UuLi4iIG1lYW5zICJhZGRyZXNzICc6OicgKElQdjYgd2lsZGNhcmQgYWRkcikiOiJzZXJ2aWNlIi4uLgorICogWW91IGhhdmUgdG8gcHV0ICJ0Y3A2Ii8idWRwNiIgaW4gcHJvdG9jb2wgZmllbGQgdG8gc2VsZWN0IElQdjYuCisgKi8KKworLyogSGVyZSdzIHRoZSBzY29vcCBjb25jZXJuaW5nIHRoZSB1c2VyWzpncm91cF0gZmVhdHVyZToKKyAqIDEpIGdyb3VwIGlzIG5vdCBzcGVjaWZpZWQ6CisgKiAgICAgIGEpIHVzZXIgPSByb290OiBOTyBzZXR1aWQoKSBvciBzZXRnaWQoKSBpcyBkb25lCisgKiAgICAgIGIpIG90aGVyOiAgICAgICBpbml0Z3JvdXBzKG5hbWUsIHByaW1hcnkgZ3JvdXApCisgKiAgICAgICAgICAgICAgICAgICAgICBzZXRnaWQocHJpbWFyeSBncm91cCBhcyBmb3VuZCBpbiBwYXNzd2QpCisgKiAgICAgICAgICAgICAgICAgICAgICBzZXR1aWQoKQorICogMikgZ3JvdXAgaXMgc3BlY2lmaWVkOgorICogICAgICBhKSB1c2VyID0gcm9vdDogc2V0Z2lkKHNwZWNpZmllZCBncm91cCkKKyAqICAgICAgICAgICAgICAgICAgICAgIE5PIGluaXRncm91cHMoKQorICogICAgICAgICAgICAgICAgICAgICAgTk8gc2V0dWlkKCkKKyAqICAgICAgYikgb3RoZXI6ICAgICAgIGluaXRncm91cHMobmFtZSwgc3BlY2lmaWVkIGdyb3VwKQorICogICAgICAgICAgICAgICAgICAgICAgc2V0Z2lkKHNwZWNpZmllZCBncm91cCkKKyAqICAgICAgICAgICAgICAgICAgICAgIHNldHVpZCgpCisgKi8KKworLy91c2FnZTojZGVmaW5lIGluZXRkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWZlXSBbLXEgTl0gWy1SIE5dIFtDT05GRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgaW5ldGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0ZW4gZm9yIG5ldHdvcmsgY29ubmVjdGlvbnMgYW5kIGxhdW5jaCBwcm9ncmFtc1xuIgorLy91c2FnZTogICAgICJcbgktZglSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJTG9nIHRvIHN0ZGVyciIKKy8vdXNhZ2U6ICAgICAiXG4JLXEgTglTb2NrZXQgbGlzdGVuIHF1ZXVlIChkZWZhdWx0OiAxMjgpIgorLy91c2FnZTogICAgICJcbgktUiBOCVBhdXNlIHNlcnZpY2VzIGFmdGVyIE4gY29ubmVjdHMvbWluIgorLy91c2FnZTogICAgICJcbgkJKGRlZmF1bHQ6IDAgLSBkaXNhYmxlZCkiCisKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKyMgaWYgZGVmaW5lZChfX1VDTElCQ19fKSAmJiAhIGRlZmluZWQoX19VQ0xJQkNfSEFTX1JQQ19fKQorIyAgZXJyb3IgIllvdSBuZWVkIHRvIGJ1aWxkIHVDbGliYyB3aXRoIFVDTElCQ19IQVNfUlBDIGZvciBORlMgc3VwcG9ydCIKKyMgZW5kaWYKKyMgaW5jbHVkZSA8cnBjL3JwYy5oPgorIyBpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CisjZW5kaWYKKworI2lmICFCQl9NTVUKKy8qIHN0cmVhbSB2ZXJzaW9uIG9mIGNoYXJnZW4gaXMgZm9ya2luZyBidXQgbm90IGV4ZWNpbmcsCisgKiBjYW4ndCBkbyB0aGF0IChlYXNpbHkpIG9uIE5PTU1VICovCisjdW5kZWYgIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOIDAKKyNlbmRpZgorCisjZGVmaW5lIF9QQVRIX0lORVREUElEICAiL3Zhci9ydW4vaW5ldGQucGlkIgorCisjZGVmaW5lIENOVF9JTlRFUlZBTCAgICA2MCAgICAgIC8qIHNlcnZlcnMgaW4gQ05UX0lOVEVSVkFMIHNlYy4gKi8KKyNkZWZpbmUgUkVUUllUSU1FICAgICAgIDYwICAgICAgLyogcmV0cnkgYWZ0ZXIgYmluZCBvciBzZXJ2ZXIgZmFpbCAqLworCisvLyBUT0RPOiBleHBsYWluLCBvciBnZXQgcmlkIG9mIHNldHJsaW1pdCBnYW1lcworCisjaWZuZGVmIFJMSU1JVF9OT0ZJTEUKKyNkZWZpbmUgUkxJTUlUX05PRklMRSAgIFJMSU1JVF9PRklMRQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTl9NQVgKKyNkZWZpbmUgT1BFTl9NQVggICAgICAgIDY0CisjZW5kaWYKKworLyogUmVzZXJ2ZSBzb21lIGRlc2NyaXB0b3JzLCAzIHN0ZGlvICsgYXQgbGVhc3Q6IDEgbG9nLCAxIGNvbmYuIGZpbGUgKi8KKyNkZWZpbmUgRkRfTUFSR0lOICAgICAgIDgKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJEIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITyAgICBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FICAgIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRQorIyBkZWZpbmUgSU5FVERfQlVJTFRJTlNfRU5BQkxFRAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHNlcnZ0YWJfdCB7CisJLyogVGhlIG1vc3QgZnJlcXVlbnRseSByZWZlcmVuY2VkIG9uZTogKi8KKwlpbnQgc2VfZmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZW4gZGVzY3JpcHRvciAqLworCS8qIE5COiAnYmlnZ2VzdCBmaWVsZHMgbGFzdCcgc2F2ZXMgb24gY29kZSBzaXplICh+MjUwIGJ5dGVzKSAqLworCS8qIFthZGRyOl1zZXJ2aWNlIHNvY2t0eXBlIHByb3RvIHdhaXQgdXNlcls6Z3JvdXBdIHByb2cgW2FyZ3NdICovCisJY2hhciAqc2VfbG9jYWxfaG9zdG5hbWU7ICAgICAgICAgICAgICAvKiBhZGRyIHRvIGxpc3RlbiBvbiAqLworCWNoYXIgKnNlX3NlcnZpY2U7ICAgICAgICAgICAgICAgICAgICAgLyogIjgwIiBvciAid3d3IiBvciAibW91bnQvMlstM10iICovCisJLyogc29ja3R5cGUgaXMgaW4gc2Vfc29ja3R5cGUgKi8gICAgICAvKiAic3RyZWFtIiAiZGdyYW0iICJyYXciICJyZG0iICJzZXFwYWNrZXQiICovCisJY2hhciAqc2VfcHJvdG87ICAgICAgICAgICAgICAgICAgICAgICAvKiAidW5peCIgb3IgIltycGMvXXRjcFs2XSIgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwlpbnQgc2VfcnBjcHJvZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJwYyBwcm9ncmFtIG51bWJlciAqLworCWludCBzZV9ycGN2ZXJfbG87ICAgICAgICAgICAgICAgICAgICAgLyogcnBjIHByb2dyYW0gbG93ZXN0IHZlcnNpb24gKi8KKwlpbnQgc2VfcnBjdmVyX2hpOyAgICAgICAgICAgICAgICAgICAgIC8qIHJwYyBwcm9ncmFtIGhpZ2hlc3QgdmVyc2lvbiAqLworI2RlZmluZSBpc19ycGNfc2VydmljZShzZXApICAgICAgICgoc2VwKS0+c2VfcnBjdmVyX2xvICE9IDApCisjZWxzZQorI2RlZmluZSBpc19ycGNfc2VydmljZShzZXApICAgICAgIDAKKyNlbmRpZgorCXBpZF90IHNlX3dhaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMDoibm93YWl0IiwgMToid2FpdCIsID4xOiJ3YWl0IiAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHdhaXRpbmcgZm9yIHRoaXMgcGlkICovCisJc29ja3R5cGVfdCBzZV9zb2NrdHlwZTsgICAgICAgICAgICAgICAvKiBTT0NLX1NUUkVBTS9ER1JBTS9SRE0vLi4uICovCisJZmFtaWx5X3Qgc2VfZmFtaWx5OyAgICAgICAgICAgICAgICAgICAvKiBBRl9VTklYL0lORVRbNl0gKi8KKwkvKiBzZV9wcm90b19ubyBpcyB1c2VkIGJ5IFJQQyBjb2RlIG9ubHkuLi4gaG1tICovCisJc21hbGxpbnQgc2VfcHJvdG9fbm87ICAgICAgICAgICAgICAgICAvKiBJUFBST1RPX1RDUC9VRFAsIG4vYSBmb3IgQUZfVU5JWCAqLworCXNtYWxsaW50IHNlX2NoZWNrZWQ7ICAgICAgICAgICAgICAgICAgLyogbG9va2VkIGF0IGR1cmluZyBtZXJnZSAqLworCXVuc2lnbmVkIHNlX21heDsgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb3dlZCBpbnN0YW5jZXMgcGVyIG1pbnV0ZSAqLworCXVuc2lnbmVkIHNlX2NvdW50OyAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIHN0YXJ0ZWQgc2luY2Ugc2VfdGltZSAqLworCXVuc2lnbmVkIHNlX3RpbWU7ICAgICAgICAgICAgICAgICAgICAgLyogd2hlbiB3ZSBzdGFydGVkIGNvdW50aW5nICovCisJY2hhciAqc2VfdXNlcjsgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VyIG5hbWUgdG8gcnVuIGFzICovCisJY2hhciAqc2VfZ3JvdXA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBncm91cCBuYW1lIHRvIHJ1biBhcywgY2FuIGJlIE5VTEwgKi8KKyNpZmRlZiBJTkVURF9CVUlMVElOU19FTkFCTEVECisJY29uc3Qgc3RydWN0IGJ1aWx0aW4gKnNlX2J1aWx0aW47ICAgICAvKiBpZiBidWlsdC1pbiwgZGVzY3JpcHRpb24gKi8KKyNlbmRpZgorCXN0cnVjdCBzZXJ2dGFiX3QgKnNlX25leHQ7CisJbGVuX2FuZF9zb2NrYWRkciAqc2VfbHNhOworCWNoYXIgKnNlX3Byb2dyYW07ICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIHByb2dyYW0gKi8KKyNkZWZpbmUgTUFYQVJHViAyMAorCWNoYXIgKnNlX2FyZ3ZbTUFYQVJHViArIDFdOyAgICAgICAgICAgLyogcHJvZ3JhbSBhcmd1bWVudHMgKi8KK30gc2VydnRhYl90OworCisjaWZkZWYgSU5FVERfQlVJTFRJTlNfRU5BQkxFRAorLyogRWNobyByZWNlaXZlZCBkYXRhICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBlY2hvX3N0cmVhbShpbnQsIHNlcnZ0YWJfdCAqKTsKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBlY2hvX2RnKGludCwgc2VydnRhYl90ICopOworI2VuZGlmCisvKiBJbnRlcm5ldCAvZGV2L251bGwgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRAorc3RhdGljIHZvaWQgRkFTVF9GVU5DIGRpc2NhcmRfc3RyZWFtKGludCwgc2VydnRhYl90ICopOworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGRpc2NhcmRfZGcoaW50LCBzZXJ2dGFiX3QgKik7CisjZW5kaWYKKy8qIFJldHVybiAzMiBiaXQgdGltZSBzaW5jZSAxOTAwICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUUKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBtYWNodGltZV9zdHJlYW0oaW50LCBzZXJ2dGFiX3QgKik7CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgbWFjaHRpbWVfZGcoaW50LCBzZXJ2dGFiX3QgKik7CisjZW5kaWYKKy8qIFJldHVybiBodW1hbi1yZWFkYWJsZSB0aW1lICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkYXl0aW1lX3N0cmVhbShpbnQsIHNlcnZ0YWJfdCAqKTsKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkYXl0aW1lX2RnKGludCwgc2VydnRhYl90ICopOworI2VuZGlmCisvKiBGYW1pbGlhciBjaGFyYWN0ZXIgZ2VuZXJhdG9yICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjaGFyZ2VuX3N0cmVhbShpbnQsIHNlcnZ0YWJfdCAqKTsKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjaGFyZ2VuX2RnKGludCwgc2VydnRhYl90ICopOworI2VuZGlmCisKK3N0cnVjdCBidWlsdGluIHsKKwkvKiBOQjogbm90IG5lY2Vzc2FyaWx5IE5VTCB0ZXJtaW5hdGVkICovCisJY2hhciBiaV9zZXJ2aWNlN1s3XTsgICAgICAvKiBpbnRlcm5hbGx5IHByb3ZpZGVkIHNlcnZpY2UgbmFtZSAqLworCXVpbnQ4X3QgYmlfZm9yazsgICAgICAgICAgLyogMSBpZiBzdHJlYW0gZm4gc2hvdWxkIHJ1biBpbiBjaGlsZCAqLworCXZvaWQgKCpiaV9zdHJlYW1fZm4pKGludCwgc2VydnRhYl90ICopIEZBU1RfRlVOQzsKKwl2b2lkICgqYmlfZGdyYW1fZm4pKGludCwgc2VydnRhYl90ICopIEZBU1RfRlVOQzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluc1tdID0geworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPCisJeyAiZWNobyIsIDEsIGVjaG9fc3RyZWFtLCBlY2hvX2RnIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRAorCXsgImRpc2NhcmQiLCAxLCBkaXNjYXJkX3N0cmVhbSwgZGlzY2FyZF9kZyB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4KKwl7ICJjaGFyZ2VuIiwgMSwgY2hhcmdlbl9zdHJlYW0sIGNoYXJnZW5fZGcgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FCisJeyAidGltZSIsIDAsIG1hY2h0aW1lX3N0cmVhbSwgbWFjaHRpbWVfZGcgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FCisJeyAiZGF5dGltZSIsIDAsIGRheXRpbWVfc3RyZWFtLCBkYXl0aW1lX2RnIH0sCisjZW5kaWYKK307CisjZW5kaWYgLyogSU5FVERfQlVJTFRJTlNfRU5BQkxFRCAqLworCitzdHJ1Y3QgZ2xvYmFscyB7CisJcmxpbV90IHJsaW1fb2ZpbGVfY3VyOworCXN0cnVjdCBybGltaXQgcmxpbV9vZmlsZTsKKwlzZXJ2dGFiX3QgKnNlcnZfbGlzdDsKKwlpbnQgZ2xvYmFsX3F1ZXVlbGVuOworCWludCBtYXhzb2NrOyAgICAgICAgIC8qIG1heCBmZCMgaW4gYWxsc29jaywgLTE6IHVua25vd24gKi8KKwkvKiB3aGVuZXZlciBtYXhzb2NrIGdyb3dzLCBwcmV2X21heHNvY2sgaXMgc2V0IHRvIG5ldyBtYXhzb2NrLAorCSAqIGJ1dCBpZiBtYXhzb2NrIGlzIHNldCB0byAtMSwgcHJldl9tYXhzb2NrIGlzIG5vdCBjaGFuZ2VkICovCisJaW50IHByZXZfbWF4c29jazsKKwl1bnNpZ25lZCBtYXhfY29uY3VycmVuY3k7CisJc21hbGxpbnQgYWxhcm1fYXJtZWQ7CisJdWlkX3QgcmVhbF91aWQ7IC8qIHVzZXIgSUQgd2hvIHJhbiB1cyAqLworCWNvbnN0IGNoYXIgKmNvbmZpZ19maWxlbmFtZTsKKwlwYXJzZXJfdCAqcGFyc2VyOworCWNoYXIgKmRlZmF1bHRfbG9jYWxfaG9zdG5hbWU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4KKwljaGFyICplbmRfcmluZzsKKwljaGFyICpyaW5nX3BvczsKKwljaGFyIHJpbmdbMTI4XTsKKyNlbmRpZgorCWZkX3NldCBhbGxzb2NrOworCS8qIFVzZWQgaW4gbmV4dF9saW5lKCksIGFuZCBhcyBzY3JhdGNoIHJlYWQgYnVmZmVyICovCisJY2hhciBsaW5lWzI1Nl07ICAgICAgICAgIC8qIF9hdCBsZWFzdF8gMjU2LCBzZWUgTElORV9TSVpFICovCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorZW51bSB7IExJTkVfU0laRSA9IENPTU1PTl9CVUZTSVpFIC0gb2Zmc2V0b2Yoc3RydWN0IGdsb2JhbHMsIGxpbmUpIH07CitzdHJ1Y3QgQlVHX0dfdG9vX2JpZyB7CisJY2hhciBCVUdfR190b29fYmlnW3NpemVvZihHKSA8PSBDT01NT05fQlVGU0laRSA/IDEgOiAtMV07Cit9OworI2RlZmluZSBybGltX29maWxlX2N1ciAgKEcucmxpbV9vZmlsZV9jdXIgKQorI2RlZmluZSBybGltX29maWxlICAgICAgKEcucmxpbV9vZmlsZSAgICAgKQorI2RlZmluZSBzZXJ2X2xpc3QgICAgICAgKEcuc2Vydl9saXN0ICAgICAgKQorI2RlZmluZSBnbG9iYWxfcXVldWVsZW4gKEcuZ2xvYmFsX3F1ZXVlbGVuKQorI2RlZmluZSBtYXhzb2NrICAgICAgICAgKEcubWF4c29jayAgICAgICAgKQorI2RlZmluZSBwcmV2X21heHNvY2sgICAgKEcucHJldl9tYXhzb2NrICAgKQorI2RlZmluZSBtYXhfY29uY3VycmVuY3kgKEcubWF4X2NvbmN1cnJlbmN5KQorI2RlZmluZSBhbGFybV9hcm1lZCAgICAgKEcuYWxhcm1fYXJtZWQgICAgKQorI2RlZmluZSByZWFsX3VpZCAgICAgICAgKEcucmVhbF91aWQgICAgICAgKQorI2RlZmluZSBjb25maWdfZmlsZW5hbWUgKEcuY29uZmlnX2ZpbGVuYW1lKQorI2RlZmluZSBwYXJzZXIgICAgICAgICAgKEcucGFyc2VyICAgICAgICAgKQorI2RlZmluZSBkZWZhdWx0X2xvY2FsX2hvc3RuYW1lIChHLmRlZmF1bHRfbG9jYWxfaG9zdG5hbWUpCisjZGVmaW5lIGZpcnN0X3BzX2J5dGUgICAoRy5maXJzdF9wc19ieXRlICApCisjZGVmaW5lIGxhc3RfcHNfYnl0ZSAgICAoRy5sYXN0X3BzX2J5dGUgICApCisjZGVmaW5lIGVuZF9yaW5nICAgICAgICAoRy5lbmRfcmluZyAgICAgICApCisjZGVmaW5lIHJpbmdfcG9zICAgICAgICAoRy5yaW5nX3BvcyAgICAgICApCisjZGVmaW5lIHJpbmcgICAgICAgICAgICAoRy5yaW5nICAgICAgICAgICApCisjZGVmaW5lIGFsbHNvY2sgICAgICAgICAoRy5hbGxzb2NrICAgICAgICApCisjZGVmaW5lIGxpbmUgICAgICAgICAgICAoRy5saW5lICAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCXJsaW1fb2ZpbGVfY3VyID0gT1BFTl9NQVg7IFwKKwlnbG9iYWxfcXVldWVsZW4gPSAxMjg7IFwKKwljb25maWdfZmlsZW5hbWUgPSAiL2V0Yy9pbmV0ZC5jb25mIjsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgbWF5YmVfY2xvc2UoaW50IGZkKQoreworCWlmIChmZCA+PSAwKQorCQljbG9zZShmZCk7Cit9CisKKy8vIFRPRE86IG1vdmUgdG8gbGliYmI/CitzdGF0aWMgbGVuX2FuZF9zb2NrYWRkciAqeHphbGxvY19sc2EoaW50IGZhbWlseSkKK3sKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJaW50IHN6OworCisJc3ogPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwlpZiAoZmFtaWx5ID09IEFGX1VOSVgpCisJCXN6ID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpCisJCXN6ID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworI2VuZGlmCisJbHNhID0geHphbGxvYyhMU0FfTEVOX1NJWkUgKyBzeik7CisJbHNhLT5sZW4gPSBzejsKKwlsc2EtPnUuc2Euc2FfZmFtaWx5ID0gZmFtaWx5OworCXJldHVybiBsc2E7Cit9CisKK3N0YXRpYyB2b2lkIHJlYXJtX2FsYXJtKHZvaWQpCit7CisJaWYgKCFhbGFybV9hcm1lZCkgeworCQlhbGFybV9hcm1lZCA9IDE7CisJCWFsYXJtKFJFVFJZVElNRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibG9ja19DSExEX0hVUF9BTFJNKHNpZ3NldF90ICptKQoreworCXNpZ2VtcHR5c2V0KG0pOworCXNpZ2FkZHNldChtLCBTSUdDSExEKTsKKwlzaWdhZGRzZXQobSwgU0lHSFVQKTsKKwlzaWdhZGRzZXQobSwgU0lHQUxSTSk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCBtLCBtKTsgLyogb2xkIHNpZ21hc2sgaXMgc3RvcmVkIGluIG0gKi8KK30KKworc3RhdGljIHZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICptKQoreworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBtLCBOVUxMKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworc3RhdGljIHZvaWQgcmVnaXN0ZXJfcnBjKHNlcnZ0YWJfdCAqc2VwKQoreworCWludCBuOworCXN0cnVjdCBzb2NrYWRkcl9pbiBpcl9zaW47CisJc29ja2xlbl90IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKGlyX3Npbik7CisJaWYgKGdldHNvY2tuYW1lKHNlcC0+c2VfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmlyX3NpbiwgJnNpemUpIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJnZXRzb2NrbmFtZSIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChuID0gc2VwLT5zZV9ycGN2ZXJfbG87IG4gPD0gc2VwLT5zZV9ycGN2ZXJfaGk7IG4rKykgeworCQlwbWFwX3Vuc2V0KHNlcC0+c2VfcnBjcHJvZywgbik7CisJCWlmICghcG1hcF9zZXQoc2VwLT5zZV9ycGNwcm9nLCBuLCBzZXAtPnNlX3Byb3RvX25vLCBudG9ocyhpcl9zaW4uc2luX3BvcnQpKSkKKwkJCWJiX3BlcnJvcl9tc2coIiVzICVzOiBwbWFwX3NldCgldSwldSwldSwldSkiLAorCQkJCXNlcC0+c2Vfc2VydmljZSwgc2VwLT5zZV9wcm90bywKKwkJCQlzZXAtPnNlX3JwY3Byb2csIG4sIHNlcC0+c2VfcHJvdG9fbm8sIG50b2hzKGlyX3Npbi5zaW5fcG9ydCkpOworCX0KK30KKworc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9ycGMoc2VydnRhYl90ICpzZXApCit7CisJaW50IG47CisKKwlmb3IgKG4gPSBzZXAtPnNlX3JwY3Zlcl9sbzsgbiA8PSBzZXAtPnNlX3JwY3Zlcl9oaTsgbisrKSB7CisJCWlmICghcG1hcF91bnNldChzZXAtPnNlX3JwY3Byb2csIG4pKQorCQkJYmJfcGVycm9yX21zZygicG1hcF91bnNldCgldSwldSkiLCBzZXAtPnNlX3JwY3Byb2csIG4pOworCX0KK30KKyNlbmRpZiAvKiBGRUFUVVJFX0lORVREX1JQQyAqLworCitzdGF0aWMgdm9pZCBidW1wX25vZmlsZSh2b2lkKQoreworCWVudW0geyBGRF9DSFVOSyA9IDMyIH07CisJc3RydWN0IHJsaW1pdCBybDsKKworCS8qIE5ldmVyIGZhaWxzIHVuZGVyIExpbnV4IChleGNlcHQgaWYgeW91IHBhc3MgaXQgYmFkIGFyZ3VtZW50cykgKi8KKwlnZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsKTsKKwlybC5ybGltX2N1ciA9IE1JTihybC5ybGltX21heCwgcmwucmxpbV9jdXIgKyBGRF9DSFVOSyk7CisJcmwucmxpbV9jdXIgPSBNSU4oRkRfU0VUU0laRSwgcmwucmxpbV9jdXIgKyBGRF9DSFVOSyk7CisJaWYgKHJsLnJsaW1fY3VyIDw9IHJsaW1fb2ZpbGVfY3VyKSB7CisJCWJiX2Vycm9yX21zZygiY2FuJ3QgZXh0ZW5kIGZpbGUgbGltaXQsIG1heCA9ICVkIiwKKwkJCQkJCShpbnQpIHJsLnJsaW1fY3VyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsKSA8IDApIHsKKwkJYmJfcGVycm9yX21zZygic2V0cmxpbWl0Iik7CisJCXJldHVybjsKKwl9CisKKwlybGltX29maWxlX2N1ciA9IHJsLnJsaW1fY3VyOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZmRfZnJvbV9zZXQoaW50IGZkKQoreworCWlmIChmZCA+PSAwKSB7CisJCUZEX0NMUihmZCwgJmFsbHNvY2spOworCQltYXhzb2NrID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfZmRfdG9fc2V0KGludCBmZCkKK3sKKwlpZiAoZmQgPj0gMCkgeworCQlGRF9TRVQoZmQsICZhbGxzb2NrKTsKKwkJaWYgKG1heHNvY2sgPj0gMCAmJiBmZCA+IG1heHNvY2spIHsKKwkJCXByZXZfbWF4c29jayA9IG1heHNvY2sgPSBmZDsKKwkJCWlmICgocmxpbV90KWZkID4gcmxpbV9vZmlsZV9jdXIgLSBGRF9NQVJHSU4pCisJCQkJYnVtcF9ub2ZpbGUoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVjYWxjdWxhdGVfbWF4c29jayh2b2lkKQoreworCWludCBmZCA9IDA7CisKKwkvKiBXZSBtYXkgaGF2ZSBubyBzZXJ2aWNlcywgaW4gdGhpcyBjYXNlIG1heHNvY2sgc2hvdWxkIHN0aWxsIGJlID49IDAKKwkgKiAoY29kZSBlbHNld2hlcmUgaXMgbm90IGhhcHB5IHdpdGggbWF4c29jayA9PSAtMSkgKi8KKwltYXhzb2NrID0gMDsKKwl3aGlsZSAoZmQgPD0gcHJldl9tYXhzb2NrKSB7CisJCWlmIChGRF9JU1NFVChmZCwgJmFsbHNvY2spKQorCQkJbWF4c29jayA9IGZkOworCQlmZCsrOworCX0KKwlwcmV2X21heHNvY2sgPSBtYXhzb2NrOworCWlmICgocmxpbV90KW1heHNvY2sgPiBybGltX29maWxlX2N1ciAtIEZEX01BUkdJTikKKwkJYnVtcF9ub2ZpbGUoKTsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9zb2NrZXRfZmQoc2VydnRhYl90ICpzZXApCit7CisJaW50IHIsIGZkOworCisJZmQgPSBzb2NrZXQoc2VwLT5zZV9mYW1pbHksIHNlcC0+c2Vfc29ja3R5cGUsIDApOworCWlmIChmZCA8IDApIHsKKwkJYmJfcGVycm9yX21zZygic29ja2V0Iik7CisJCXJldHVybjsKKwl9CisJc2V0c29ja29wdF9yZXVzZWFkZHIoZmQpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJaWYgKGlzX3JwY19zZXJ2aWNlKHNlcCkpIHsKKwkJc3RydWN0IHBhc3N3ZCAqcHdkOworCisJCS8qIHplcm8gb3V0IHRoZSBwb3J0IGZvciBhbGwgUlBDIHNlcnZpY2VzOyBsZXQgYmluZCgpCisJCSAqIGZpbmQgb25lLiAqLworCQlzZXRfbnBvcnQoJnNlcC0+c2VfbHNhLT51LnNhLCAwKTsKKworCQkvKiBmb3IgUlBDIHNlcnZpY2VzLCBhdHRlbXB0IHRvIHVzZSBhIHJlc2VydmVkIHBvcnQKKwkJICogaWYgdGhleSBhcmUgZ29pbmcgdG8gYmUgcnVubmluZyBhcyByb290LiAqLworCQlpZiAocmVhbF91aWQgPT0gMCAmJiBzZXAtPnNlX2ZhbWlseSA9PSBBRl9JTkVUCisJCSAmJiAocHdkID0gZ2V0cHduYW0oc2VwLT5zZV91c2VyKSkgIT0gTlVMTAorCQkgJiYgcHdkLT5wd191aWQgPT0gMAorCQkpIHsKKwkJCXIgPSBiaW5kcmVzdnBvcnQoZmQsICZzZXAtPnNlX2xzYS0+dS5zaW4pOworCQl9IGVsc2UgeworCQkJciA9IGJpbmQoZmQsICZzZXAtPnNlX2xzYS0+dS5zYSwgc2VwLT5zZV9sc2EtPmxlbik7CisJCX0KKwkJaWYgKHIgPT0gMCkgeworCQkJaW50IHNhdmVlcnJubyA9IGVycm5vOworCQkJLyogdXBkYXRlIGxzYSB3aXRoIHBvcnQjICovCisJCQlnZXRzb2NrbmFtZShmZCwgJnNlcC0+c2VfbHNhLT51LnNhLCAmc2VwLT5zZV9sc2EtPmxlbik7CisJCQllcnJubyA9IHNhdmVlcnJubzsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQlpZiAoc2VwLT5zZV9mYW1pbHkgPT0gQUZfVU5JWCkgeworCQkJc3RydWN0IHNvY2thZGRyX3VuICpzdW47CisJCQlzdW4gPSAoc3RydWN0IHNvY2thZGRyX3VuKikmKHNlcC0+c2VfbHNhLT51LnNhKTsKKwkJCXVubGluayhzdW4tPnN1bl9wYXRoKTsKKwkJfQorCQlyID0gYmluZChmZCwgJnNlcC0+c2VfbHNhLT51LnNhLCBzZXAtPnNlX2xzYS0+bGVuKTsKKwl9CisJaWYgKHIgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIiVzLyVzOiBiaW5kIiwKKwkJCQlzZXAtPnNlX3NlcnZpY2UsIHNlcC0+c2VfcHJvdG8pOworCQljbG9zZShmZCk7CisJCXJlYXJtX2FsYXJtKCk7CisJCXJldHVybjsKKwl9CisJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19TVFJFQU0pCisJCWxpc3RlbihmZCwgZ2xvYmFsX3F1ZXVlbGVuKTsKKworCWFkZF9mZF90b19zZXQoZmQpOworCXNlcC0+c2VfZmQgPSBmZDsKK30KKworc3RhdGljIGludCByZW9wZW5fY29uZmlnX2ZpbGUodm9pZCkKK3sKKwlmcmVlKGRlZmF1bHRfbG9jYWxfaG9zdG5hbWUpOworCWRlZmF1bHRfbG9jYWxfaG9zdG5hbWUgPSB4c3RyZHVwKCIqIik7CisJaWYgKHBhcnNlciAhPSBOVUxMKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwlwYXJzZXIgPSBjb25maWdfb3Blbihjb25maWdfZmlsZW5hbWUpOworCXJldHVybiAocGFyc2VyICE9IE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9jb25maWdfZmlsZSh2b2lkKQoreworCWlmIChwYXJzZXIpIHsKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJCXBhcnNlciA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBmcmVlX3NlcnZ0YWJfc3RyaW5ncyhzZXJ2dGFiX3QgKmNwKQoreworCWludCBpOworCisJZnJlZShjcC0+c2VfbG9jYWxfaG9zdG5hbWUpOworCWZyZWUoY3AtPnNlX3NlcnZpY2UpOworCWZyZWUoY3AtPnNlX3Byb3RvKTsKKwlmcmVlKGNwLT5zZV91c2VyKTsKKwlmcmVlKGNwLT5zZV9ncm91cCk7CisJZnJlZShjcC0+c2VfbHNhKTsgLyogbm90IGEgc3RyaW5nIGluIGZhY3QgKi8KKwlmcmVlKGNwLT5zZV9wcm9ncmFtKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQVJHVjsgaSsrKQorCQlmcmVlKGNwLT5zZV9hcmd2W2ldKTsKK30KKworc3RhdGljIHNlcnZ0YWJfdCAqbmV3X3NlcnZ0YWIodm9pZCkKK3sKKwlzZXJ2dGFiX3QgKm5ld3RhYiA9IHh6YWxsb2Moc2l6ZW9mKHNlcnZ0YWJfdCkpOworCW5ld3RhYi0+c2VfZmQgPSAtMTsgLyogcGFyYW5vaWEgKi8KKwlyZXR1cm4gbmV3dGFiOworfQorCitzdGF0aWMgc2VydnRhYl90ICpkdXBfc2VydnRhYihzZXJ2dGFiX3QgKnNlcCkKK3sKKwlzZXJ2dGFiX3QgKm5ld3RhYjsKKwlpbnQgYXJnYzsKKworCW5ld3RhYiA9IG5ld19zZXJ2dGFiKCk7CisJKm5ld3RhYiA9ICpzZXA7IC8qIHN0cnVjdCBjb3B5ICovCisJLyogZGVlcC1jb3B5aW5nIHN0cmluZ3MgKi8KKwluZXd0YWItPnNlX3NlcnZpY2UgPSB4c3RyZHVwKG5ld3RhYi0+c2Vfc2VydmljZSk7CisJbmV3dGFiLT5zZV9wcm90byA9IHhzdHJkdXAobmV3dGFiLT5zZV9wcm90byk7CisJbmV3dGFiLT5zZV91c2VyID0geHN0cmR1cChuZXd0YWItPnNlX3VzZXIpOworCW5ld3RhYi0+c2VfZ3JvdXAgPSB4c3RyZHVwKG5ld3RhYi0+c2VfZ3JvdXApOworCW5ld3RhYi0+c2VfcHJvZ3JhbSA9IHhzdHJkdXAobmV3dGFiLT5zZV9wcm9ncmFtKTsKKwlmb3IgKGFyZ2MgPSAwOyBhcmdjIDw9IE1BWEFSR1Y7IGFyZ2MrKykKKwkJbmV3dGFiLT5zZV9hcmd2W2FyZ2NdID0geHN0cmR1cChuZXd0YWItPnNlX2FyZ3ZbYXJnY10pOworCS8qIE5COiBzZV9mZCwgc2VfaG9zdGFkZHIgYW5kIHNlX25leHQgYXJlIGFsd2F5cworCSAqIG92ZXJ3cml0dGVuZCBieSBjYWxsZXJzLCBzbyB3ZSBkb24ndCBib3RoZXIgcmVzZXR0aW5nIHRoZW0KKwkgKiB0byBOVUxMLzAvLTEgZXRjICovCisKKwlyZXR1cm4gbmV3dGFiOworfQorCisvKiBnY2MgZ2VuZXJhdGVzIG11Y2ggbW9yZSBjb2RlIGlmIHRoaXMgaXMgaW5saW5lZCAqLworc3RhdGljIHNlcnZ0YWJfdCAqcGFyc2Vfb25lX2xpbmUodm9pZCkKK3sKKwlpbnQgYXJnYzsKKwljaGFyICp0b2tlbls2K01BWEFSR1ZdOworCWNoYXIgKnAsICphcmc7CisJY2hhciAqaG9zdGRlbGltOworCXNlcnZ0YWJfdCAqc2VwOworCXNlcnZ0YWJfdCAqbnNlcDsKKyBuZXc6CisJc2VwID0gbmV3X3NlcnZ0YWIoKTsKKyBtb3JlOgorCWFyZ2MgPSBjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCA2K01BWEFSR1YsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKTsKKwlpZiAoIWFyZ2MpIHsKKwkJZnJlZShzZXApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBbaG9zdDpdc2VydmljZSBzb2NrdHlwZSBwcm90byB3YWl0IHVzZXJbOmdyb3VwXSBwcm9nIFthcmdzXSAqLworCS8qIENoZWNrIGZvciAiaG9zdDouLi4uIiBsaW5lICovCisJYXJnID0gdG9rZW5bMF07CisJaG9zdGRlbGltID0gc3RycmNocihhcmcsICc6Jyk7CisJaWYgKGhvc3RkZWxpbSkgeworCQkqaG9zdGRlbGltID0gJ1wwJzsKKwkJc2VwLT5zZV9sb2NhbF9ob3N0bmFtZSA9IHhzdHJkdXAoYXJnKTsKKwkJYXJnID0gaG9zdGRlbGltICsgMTsKKwkJaWYgKCphcmcgPT0gJ1wwJyAmJiBhcmdjID09IDEpIHsKKwkJCS8qIExpbmUgaGFzIGp1c3QgImhvc3Q6IiwgY2hhbmdlIHRoZQorCQkJICogZGVmYXVsdCBob3N0IGZvciB0aGUgZm9sbG93aW5nIGxpbmVzLiAqLworCQkJZnJlZShkZWZhdWx0X2xvY2FsX2hvc3RuYW1lKTsKKwkJCWRlZmF1bHRfbG9jYWxfaG9zdG5hbWUgPSBzZXAtPnNlX2xvY2FsX2hvc3RuYW1lOworCQkJZ290byBtb3JlOworCQl9CisJfSBlbHNlCisJCXNlcC0+c2VfbG9jYWxfaG9zdG5hbWUgPSB4c3RyZHVwKGRlZmF1bHRfbG9jYWxfaG9zdG5hbWUpOworCisJLyogc2VydmljZSBzb2NrdHlwZSBwcm90byB3YWl0IHVzZXJbOmdyb3VwXSBwcm9nIFthcmdzXSAqLworCXNlcC0+c2Vfc2VydmljZSA9IHhzdHJkdXAoYXJnKTsKKworCS8qIHNvY2t0eXBlIHByb3RvIHdhaXQgdXNlcls6Z3JvdXBdIHByb2cgW2FyZ3NdICovCisJaWYgKGFyZ2MgPCA2KSB7CisgcGFyc2VfZXJyOgorCQliYl9lcnJvcl9tc2coInBhcnNlIGVycm9yIG9uIGxpbmUgJXUsIGxpbmUgaXMgaWdub3JlZCIsCisJCQkJcGFyc2VyLT5saW5lbm8pOworCQlmcmVlX3NlcnZ0YWJfc3RyaW5ncyhzZXApOworCQkvKiBKdXN0ICJnb3RvIG1vcmUiIGNhbiBtYWtlIHNlcCB0byBjYXJyeSBvdmVyIGUuZy4KKwkJICogInJwYyItbmVzcyAoYnkgaGF2aW5nIHNlX3JwY3Zlcl9sbyAhPSAwKS4KKwkJICogV2Ugd2lsbCBiZSBtb3JlIHBhcmFub2lkOiAqLworCQlmcmVlKHNlcCk7CisJCWdvdG8gbmV3OworCX0KKworCXsKKwkJc3RhdGljIGNvbnN0IGludDhfdCBTT0NLX3h4eFtdIEFMSUdOMSA9IHsKKwkJCS0xLAorCQkJU09DS19TVFJFQU0sIFNPQ0tfREdSQU0sIFNPQ0tfUkRNLAorCQkJU09DS19TRVFQQUNLRVQsIFNPQ0tfUkFXCisJCX07CisJCXNlcC0+c2Vfc29ja3R5cGUgPSBTT0NLX3h4eFsxICsgaW5kZXhfaW5fc3RyaW5ncygKKwkJCSJzdHJlYW0iIlwwIiAiZGdyYW0iIlwwIiAicmRtIiJcMCIKKwkJCSJzZXFwYWNrZXQiIlwwIiAicmF3IiJcMCIKKwkJCSwgdG9rZW5bMV0pXTsKKwl9CisKKwkvKiB7dW5peCxbcnBjL117dGNwLHVkcH1bNl19IHdhaXQgdXNlcls6Z3JvdXBdIHByb2cgW2FyZ3NdICovCisJc2VwLT5zZV9wcm90byA9IGFyZyA9IHhzdHJkdXAodG9rZW5bMl0pOworCWlmIChzdHJjbXAoYXJnLCAidW5peCIpID09IDApIHsKKwkJc2VwLT5zZV9mYW1pbHkgPSBBRl9VTklYOworCX0gZWxzZSB7CisJCWNoYXIgKnNpeDsKKwkJc2VwLT5zZV9mYW1pbHkgPSBBRl9JTkVUOworCQlzaXggPSBsYXN0X2NoYXJfaXMoYXJnLCAnNicpOworCQlpZiAoc2l4KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQkJKnNpeCA9ICdcMCc7CisJCQlzZXAtPnNlX2ZhbWlseSA9IEFGX0lORVQ2OworI2Vsc2UKKwkJCWJiX2Vycm9yX21zZygiJXM6IG5vIHN1cHBvcnQgZm9yIElQdjYiLCBzZXAtPnNlX3Byb3RvKTsKKwkJCWdvdG8gcGFyc2VfZXJyOworI2VuZGlmCisJCX0KKwkJaWYgKHN0cm5jbXAoYXJnLCAicnBjLyIsIDQpID09IDApIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwkJCXVuc2lnbmVkIG47CisJCQlhcmcgKz0gNDsKKwkJCXAgPSBzdHJjaHIoc2VwLT5zZV9zZXJ2aWNlLCAnLycpOworCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZygibm8gcnBjIHZlcnNpb246ICclcyciLCBzZXAtPnNlX3NlcnZpY2UpOworCQkJCWdvdG8gcGFyc2VfZXJyOworCQkJfQorCQkJKnArKyA9ICdcMCc7CisJCQluID0gYmJfc3RydG91KHAsICZwLCAxMCk7CisJCQlpZiAobiA+IElOVF9NQVgpIHsKKyBiYWRfdmVyX3NwZWM6CisJCQkJYmJfZXJyb3JfbXNnKCJiYWQgcnBjIHZlcnNpb24iKTsKKwkJCQlnb3RvIHBhcnNlX2VycjsKKwkJCX0KKwkJCXNlcC0+c2VfcnBjdmVyX2xvID0gc2VwLT5zZV9ycGN2ZXJfaGkgPSBuOworCQkJaWYgKCpwID09ICctJykgeworCQkJCXArKzsKKwkJCQluID0gYmJfc3RydG91KHAsICZwLCAxMCk7CisJCQkJaWYgKG4gPiBJTlRfTUFYIHx8IChpbnQpbiA8IHNlcC0+c2VfcnBjdmVyX2xvKQorCQkJCQlnb3RvIGJhZF92ZXJfc3BlYzsKKwkJCQlzZXAtPnNlX3JwY3Zlcl9oaSA9IG47CisJCQl9CisJCQlpZiAoKnAgIT0gJ1wwJykKKwkJCQlnb3RvIGJhZF92ZXJfc3BlYzsKKyNlbHNlCisJCQliYl9lcnJvcl9tc2coIm5vIHN1cHBvcnQgZm9yIHJwYyBzZXJ2aWNlcyIpOworCQkJZ290byBwYXJzZV9lcnI7CisjZW5kaWYKKwkJfQorCQkvKiB3ZSBkb24ndCByZWFsbHkgbmVlZCBnZXRwcm90b2J5bmFtZSgpISAqLworCQlpZiAoc3RyY21wKGFyZywgInRjcCIpID09IDApCisJCQlzZXAtPnNlX3Byb3RvX25vID0gSVBQUk9UT19UQ1A7IC8qID0gNiAqLworCQlpZiAoc3RyY21wKGFyZywgInVkcCIpID09IDApCisJCQlzZXAtPnNlX3Byb3RvX25vID0gSVBQUk9UT19VRFA7IC8qID0gMTcgKi8KKwkJaWYgKHNpeCkKKwkJCSpzaXggPSAnNic7CisJCWlmICghc2VwLT5zZV9wcm90b19ubykgLyogbm90IHRjcC91ZHA/PyAqLworCQkJZ290byBwYXJzZV9lcnI7CisJfQorCisJLyogW25vXXdhaXRbLm1heF0gdXNlcls6Z3JvdXBdIHByb2cgW2FyZ3NdICovCisJYXJnID0gdG9rZW5bM107CisJc2VwLT5zZV9tYXggPSBtYXhfY29uY3VycmVuY3k7CisJcCA9IHN0cmNocihhcmcsICcuJyk7CisJaWYgKHApIHsKKwkJKnArKyA9ICdcMCc7CisJCXNlcC0+c2VfbWF4ID0gYmJfc3RydG91KHAsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKQorCQkJZ290byBwYXJzZV9lcnI7CisJfQorCXNlcC0+c2Vfd2FpdCA9IChhcmdbMF0gIT0gJ24nIHx8IGFyZ1sxXSAhPSAnbycpOworCWlmICghc2VwLT5zZV93YWl0KSAvKiAibm8iIHNlZW4gKi8KKwkJYXJnICs9IDI7CisJaWYgKHN0cmNtcChhcmcsICJ3YWl0IikgIT0gMCkKKwkJZ290byBwYXJzZV9lcnI7CisKKwkvKiB1c2VyWzpncm91cF0gcHJvZyBbYXJnc10gKi8KKwlzZXAtPnNlX3VzZXIgPSB4c3RyZHVwKHRva2VuWzRdKTsKKwlhcmcgPSBzdHJjaHIoc2VwLT5zZV91c2VyLCAnLicpOworCWlmIChhcmcgPT0gTlVMTCkKKwkJYXJnID0gc3RyY2hyKHNlcC0+c2VfdXNlciwgJzonKTsKKwlpZiAoYXJnKSB7CisJCSphcmcrKyA9ICdcMCc7CisJCXNlcC0+c2VfZ3JvdXAgPSB4c3RyZHVwKGFyZyk7CisJfQorCisJLyogcHJvZyBbYXJnc10gKi8KKwlzZXAtPnNlX3Byb2dyYW0gPSB4c3RyZHVwKHRva2VuWzVdKTsKKyNpZmRlZiBJTkVURF9CVUlMVElOU19FTkFCTEVECisJaWYgKHN0cmNtcChzZXAtPnNlX3Byb2dyYW0sICJpbnRlcm5hbCIpID09IDAKKwkgJiYgc3RybGVuKHNlcC0+c2Vfc2VydmljZSkgPD0gNworCSAmJiAoc2VwLT5zZV9zb2NrdHlwZSA9PSBTT0NLX1NUUkVBTQorCSAgICAgfHwgc2VwLT5zZV9zb2NrdHlwZSA9PSBTT0NLX0RHUkFNKQorCSkgeworCQl1bnNpZ25lZCBpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidWlsdGlucyk7IGkrKykKKwkJCWlmIChzdHJuY21wKGJ1aWx0aW5zW2ldLmJpX3NlcnZpY2U3LCBzZXAtPnNlX3NlcnZpY2UsIDcpID09IDApCisJCQkJZ290byBmb3VuZF9iaTsKKwkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIGludGVybmFsIHNlcnZpY2UgJXMiLCBzZXAtPnNlX3NlcnZpY2UpOworCQlnb3RvIHBhcnNlX2VycjsKKyBmb3VuZF9iaToKKwkJc2VwLT5zZV9idWlsdGluID0gJmJ1aWx0aW5zW2ldOworCQkvKiBzdHJlYW0gYnVpbHRpbnMgbXVzdCBiZSAibm93YWl0IiwgZGdyYW0gbXVzdCBiZSAid2FpdCIgKi8KKwkJaWYgKHNlcC0+c2Vfd2FpdCAhPSAoc2VwLT5zZV9zb2NrdHlwZSA9PSBTT0NLX0RHUkFNKSkKKwkJCWdvdG8gcGFyc2VfZXJyOworCX0KKyNlbmRpZgorCWFyZ2MgPSAwOworCXdoaWxlICgoYXJnID0gdG9rZW5bNithcmdjXSkgIT0gTlVMTCAmJiBhcmdjIDwgTUFYQVJHVikKKwkJc2VwLT5zZV9hcmd2W2FyZ2MrK10gPSB4c3RyZHVwKGFyZyk7CisJLyogU29tZSBpbmV0ZC5jb25mIGZpbGVzIGhhdmUgbm8gYXJndidzLCBub3QgZXZlbiBhcmd2WzBdLgorCSAqIEZpeCB0aGVtIHVwLgorCSAqIChUZWNobmljYWxseSwgcHJvZ3JhbXMgY2FuIGJlIGV4ZWNlZCB3aXRoIGFyZ3ZbMF0gPSBOVUxMLAorCSAqIGJ1dCBtYW55IHByb2dyYW1zIGRvIG5vdCBsaWtlIHRoYXQgYXQgYWxsKSAqLworCWlmIChhcmdjID09IDApCisJCXNlcC0+c2VfYXJndlswXSA9IHhzdHJkdXAoc2VwLT5zZV9wcm9ncmFtKTsKKworCS8qIGNhdGNoIG1peHVwcy4gIjxzZXJ2aWNlPiBzdHJlYW0gdWRwIC4uLiIgPT0gd3RmICovCisJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19TVFJFQU0pIHsKKwkJaWYgKHNlcC0+c2VfcHJvdG9fbm8gPT0gSVBQUk9UT19VRFApCisJCQlnb3RvIHBhcnNlX2VycjsKKwl9CisJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19ER1JBTSkgeworCQlpZiAoc2VwLT5zZV9wcm90b19ubyA9PSBJUFBST1RPX1RDUCkKKwkJCWdvdG8gcGFyc2VfZXJyOworCX0KKworLy8JYmJfaW5mb19tc2coCisvLwkJIkVOVFJZWyVzXVslc11bJXNdWyVkXVslZF1bJWRdWyVkXVslZF1bJXNdWyVzXVslc10iLAorLy8JCXNlcC0+c2VfbG9jYWxfaG9zdG5hbWUsIHNlcC0+c2Vfc2VydmljZSwgc2VwLT5zZV9wcm90bywgc2VwLT5zZV93YWl0LCBzZXAtPnNlX3Byb3RvX25vLAorLy8JCXNlcC0+c2VfbWF4LCBzZXAtPnNlX2NvdW50LCBzZXAtPnNlX3RpbWUsIHNlcC0+c2VfdXNlciwgc2VwLT5zZV9ncm91cCwgc2VwLT5zZV9wcm9ncmFtKTsKKworCS8qIGNoZWNrIGlmIHRoZSBob3N0bmFtZSBzcGVjaWZpZXIgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdAorCSAqIG9mIGhvc3RuYW1lcy4gd2UnbGwgbWFrZSBuZXcgZW50cmllcyBmb3IgZWFjaCBhZGRyZXNzLiAqLworCXdoaWxlICgoaG9zdGRlbGltID0gc3RycmNocihzZXAtPnNlX2xvY2FsX2hvc3RuYW1lLCAnLCcpKSAhPSBOVUxMKSB7CisJCW5zZXAgPSBkdXBfc2VydnRhYihzZXApOworCQkvKiBOVUwgdGVybWluYXRlIHRoZSBob3N0bmFtZSBmaWVsZCBvZiB0aGUgZXhpc3RpbmcgZW50cnksCisJCSAqIGFuZCBtYWtlIGEgZHVwIGZvciB0aGUgbmV3IGVudHJ5LiAqLworCQkqaG9zdGRlbGltKysgPSAnXDAnOworCQluc2VwLT5zZV9sb2NhbF9ob3N0bmFtZSA9IHhzdHJkdXAoaG9zdGRlbGltKTsKKwkJbnNlcC0+c2VfbmV4dCA9IHNlcC0+c2VfbmV4dDsKKwkJc2VwLT5zZV9uZXh0ID0gbnNlcDsKKwl9CisKKwkvKiB3YXMgZG9pbmcgaXQgaGVyZTogKi8KKwkvKiBETlMgcmVzb2x1dGlvbiwgY3JlYXRlIGNvcGllcyBmb3IgZWFjaCBJUCBhZGRyZXNzICovCisJLyogSVB2Ni1pemF0aW9uIGRlc3Ryb3llZCBpdCA6KCAqLworCisJcmV0dXJuIHNlcDsKK30KKworc3RhdGljIHNlcnZ0YWJfdCAqaW5zZXJ0X2luX3NlcnZsaXN0KHNlcnZ0YWJfdCAqY3ApCit7CisJc2VydnRhYl90ICpzZXA7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzZXAgPSBuZXdfc2VydnRhYigpOworCSpzZXAgPSAqY3A7IC8qIHN0cnVjdCBjb3B5ICovCisJc2VwLT5zZV9mZCA9IC0xOworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworCXNlcC0+c2VfcnBjcHJvZyA9IC0xOworI2VuZGlmCisJYmxvY2tfQ0hMRF9IVVBfQUxSTSgmb21hc2spOworCXNlcC0+c2VfbmV4dCA9IHNlcnZfbGlzdDsKKwlzZXJ2X2xpc3QgPSBzZXA7CisJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisJcmV0dXJuIHNlcDsKK30KKworc3RhdGljIGludCBzYW1lX3NlcnZfYWRkcl9wcm90byhzZXJ2dGFiX3QgKm9sZCwgc2VydnRhYl90ICpuZXcpCit7CisJaWYgKHN0cmNtcChvbGQtPnNlX2xvY2FsX2hvc3RuYW1lLCBuZXctPnNlX2xvY2FsX2hvc3RuYW1lKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyY21wKG9sZC0+c2Vfc2VydmljZSwgbmV3LT5zZV9zZXJ2aWNlKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyY21wKG9sZC0+c2VfcHJvdG8sIG5ldy0+c2VfcHJvdG8pICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCByZXJlYWRfY29uZmlnX2ZpbGUoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc2VydnRhYl90ICpzZXAsICpjcCwgKipzZXBwOworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlzaWdzZXRfdCBvbWFzazsKKwl1bnNpZ25lZCBuOworCXVpbnQxNl90IHBvcnQ7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKworCWlmICghcmVvcGVuX2NvbmZpZ19maWxlKCkpCisJCWdvdG8gcmV0OworCWZvciAoc2VwID0gc2Vydl9saXN0OyBzZXA7IHNlcCA9IHNlcC0+c2VfbmV4dCkKKwkJc2VwLT5zZV9jaGVja2VkID0gMDsKKworCWdvdG8gZmlyc3RfbGluZTsKKwl3aGlsZSAoMSkgeworCQlpZiAoY3AgPT0gTlVMTCkgeworIGZpcnN0X2xpbmU6CisJCQljcCA9IHBhcnNlX29uZV9saW5lKCk7CisJCQlpZiAoY3AgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJfQorCQlmb3IgKHNlcCA9IHNlcnZfbGlzdDsgc2VwOyBzZXAgPSBzZXAtPnNlX25leHQpCisJCQlpZiAoc2FtZV9zZXJ2X2FkZHJfcHJvdG8oc2VwLCBjcCkpCisJCQkJZ290byBlcXVhbF9zZXJ2dGFiOworCQkvKiBub3QgYW4gImVxdWFsIiBzZXJ2dGFiICovCisJCXNlcCA9IGluc2VydF9pbl9zZXJ2bGlzdChjcCk7CisJCWdvdG8gYWZ0ZXJfY2hlY2s7CisgZXF1YWxfc2VydnRhYjoKKwkJeworCQkJaW50IGk7CisKKwkJCWJsb2NrX0NITERfSFVQX0FMUk0oJm9tYXNrKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwkJCWlmIChpc19ycGNfc2VydmljZShzZXApKQorCQkJCXVucmVnaXN0ZXJfcnBjKHNlcCk7CisJCQlzZXAtPnNlX3JwY3Zlcl9sbyA9IGNwLT5zZV9ycGN2ZXJfbG87CisJCQlzZXAtPnNlX3JwY3Zlcl9oaSA9IGNwLT5zZV9ycGN2ZXJfaGk7CisjZW5kaWYKKwkJCWlmIChjcC0+c2Vfd2FpdCA9PSAwKSB7CisJCQkJLyogTmV3IGNvbmZpZyBzYXlzICJub3dhaXQiLiBJZiBvbGQgb25lCisJCQkJICogd2FzICJ3YWl0Iiwgd2UgY3VycmVudGx5IG1heSBiZSB3YWl0aW5nCisJCQkJICogZm9yIGEgY2hpbGQgKGFuZCBub3QgYWNjZXB0aW5nIGNvbm5lY3RzKS4KKwkJCQkgKiBTdG9wIHdhaXRpbmcsIHN0YXJ0IGxpc3RlbmluZyBhZ2Fpbi4KKwkJCQkgKiAoaWYgaXQncyBub3QgdHJ1ZSwgdGhpcyBvcCBpcyBoYXJtbGVzcykgKi8KKwkJCQlhZGRfZmRfdG9fc2V0KHNlcC0+c2VfZmQpOworCQkJfQorCQkJc2VwLT5zZV93YWl0ID0gY3AtPnNlX3dhaXQ7CisJCQlzZXAtPnNlX21heCA9IGNwLT5zZV9tYXg7CisJCQkvKiBzdHJpbmcgZmllbGRzIG5lZWQgbW9yZSBsb3ZlIC0gd2UgZG9uJ3Qgd2FudCB0byBsZWFrIHRoZW0gKi8KKyNkZWZpbmUgU1dBUCh0eXBlLCBhLCBiKSBkbyB7IHR5cGUgYyA9ICh0eXBlKWE7IGEgPSAodHlwZSliOyBiID0gKHR5cGUpYzsgfSB3aGlsZSAoMCkKKwkJCVNXQVAoY2hhciosIHNlcC0+c2VfdXNlciwgY3AtPnNlX3VzZXIpOworCQkJU1dBUChjaGFyKiwgc2VwLT5zZV9ncm91cCwgY3AtPnNlX2dyb3VwKTsKKwkJCVNXQVAoY2hhciosIHNlcC0+c2VfcHJvZ3JhbSwgY3AtPnNlX3Byb2dyYW0pOworCQkJZm9yIChpID0gMDsgaSA8IE1BWEFSR1Y7IGkrKykKKwkJCQlTV0FQKGNoYXIqLCBzZXAtPnNlX2FyZ3ZbaV0sIGNwLT5zZV9hcmd2W2ldKTsKKyN1bmRlZiBTV0FQCisJCQlyZXN0b3JlX3NpZ21hc2soJm9tYXNrKTsKKwkJCWZyZWVfc2VydnRhYl9zdHJpbmdzKGNwKTsKKwkJfQorIGFmdGVyX2NoZWNrOgorCQkvKiBjcC0+c3RyaW5nX2ZpZWxkcyBhcmUgY29uc3VtZWQgYnkgaW5zZXJ0X2luX3NlcnZsaXN0KCkKKwkJICogb3IgZnJlZWQgYXQgdGhpcyBwb2ludCwgY3AgaXRzZWxmIGlzIG5vdCB5ZXQgZnJlZWQuICovCisJCXNlcC0+c2VfY2hlY2tlZCA9IDE7CisKKwkJLyogY3JlYXRlIG5ldyBsZW5fYW5kX3NvY2thZGRyICovCisJCXN3aXRjaCAoc2VwLT5zZV9mYW1pbHkpIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuOworCQljYXNlIEFGX1VOSVg6CisJCQlsc2EgPSB4emFsbG9jX2xzYShBRl9VTklYKTsKKwkJCXN1biA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4qKSZsc2EtPnUuc2E7CisJCQlzYWZlX3N0cm5jcHkoc3VuLT5zdW5fcGF0aCwgc2VwLT5zZV9zZXJ2aWNlLCBzaXplb2Yoc3VuLT5zdW5fcGF0aCkpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogLyogY2FzZSBBRl9JTkVULCBjYXNlIEFGX0lORVQ2ICovCisJCQluID0gYmJfc3RydG91KHNlcC0+c2Vfc2VydmljZSwgTlVMTCwgMTApOworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworCQkJaWYgKGlzX3JwY19zZXJ2aWNlKHNlcCkpIHsKKwkJCQlzZXAtPnNlX3JwY3Byb2cgPSBuOworCQkJCWlmIChlcnJubykgeyAvKiBzZV9zZXJ2aWNlIGlzIG5vdCBudW1lcmljICovCisJCQkJCXN0cnVjdCBycGNlbnQgKnJwID0gZ2V0cnBjYnluYW1lKHNlcC0+c2Vfc2VydmljZSk7CisJCQkJCWlmIChycCA9PSBOVUxMKSB7CisJCQkJCQliYl9lcnJvcl9tc2coIiVzOiB1bmtub3duIHJwYyBzZXJ2aWNlIiwgc2VwLT5zZV9zZXJ2aWNlKTsKKwkJCQkJCWdvdG8gbmV4dF9jcDsKKwkJCQkJfQorCQkJCQlzZXAtPnNlX3JwY3Byb2cgPSBycC0+cl9udW1iZXI7CisJCQkJfQorCQkJCWlmIChzZXAtPnNlX2ZkID09IC0xKQorCQkJCQlwcmVwYXJlX3NvY2tldF9mZChzZXApOworCQkJCWlmIChzZXAtPnNlX2ZkICE9IC0xKQorCQkJCQlyZWdpc3Rlcl9ycGMoc2VwKTsKKwkJCQlnb3RvIG5leHRfY3A7CisJCQl9CisjZW5kaWYKKwkJCS8qIHdoYXQgcG9ydCB0byBsaXN0ZW4gb24/ICovCisJCQlwb3J0ID0gaHRvbnMobik7CisJCQlpZiAoZXJybm8gfHwgbiA+IDB4ZmZmZikgeyAvKiBzZV9zZXJ2aWNlIGlzIG5vdCBudW1lcmljICovCisJCQkJY2hhciBwcm90b25hbWVbNF07CisJCQkJc3RydWN0IHNlcnZlbnQgKnNwOworCQkJCS8qIGNhbiByZXN1bHQgb25seSBpbiAidGNwIiBvciAidWRwIjogKi8KKwkJCQlzYWZlX3N0cm5jcHkocHJvdG9uYW1lLCBzZXAtPnNlX3Byb3RvLCA0KTsKKwkJCQlzcCA9IGdldHNlcnZieW5hbWUoc2VwLT5zZV9zZXJ2aWNlLCBwcm90b25hbWUpOworCQkJCWlmIChzcCA9PSBOVUxMKSB7CisJCQkJCWJiX2Vycm9yX21zZygiJXMvJXM6IHVua25vd24gc2VydmljZSIsCisJCQkJCQkJc2VwLT5zZV9zZXJ2aWNlLCBzZXAtPnNlX3Byb3RvKTsKKwkJCQkJZ290byBuZXh0X2NwOworCQkJCX0KKwkJCQlwb3J0ID0gc3AtPnNfcG9ydDsKKwkJCX0KKwkJCWlmIChMT05FX0NIQVIoc2VwLT5zZV9sb2NhbF9ob3N0bmFtZSwgJyonKSkgeworCQkJCWxzYSA9IHh6YWxsb2NfbHNhKHNlcC0+c2VfZmFtaWx5KTsKKwkJCQlzZXRfbnBvcnQoJmxzYS0+dS5zYSwgcG9ydCk7CisJCQl9IGVsc2UgeworCQkJCWxzYSA9IGhvc3RfYW5kX2FmMnNvY2thZGRyKHNlcC0+c2VfbG9jYWxfaG9zdG5hbWUsCisJCQkJCQludG9ocyhwb3J0KSwgc2VwLT5zZV9mYW1pbHkpOworCQkJCWlmICghbHNhKSB7CisJCQkJCWJiX2Vycm9yX21zZygiJXMvJXM6IHVua25vd24gaG9zdCAnJXMnIiwKKwkJCQkJCXNlcC0+c2Vfc2VydmljZSwgc2VwLT5zZV9wcm90bywKKwkJCQkJCXNlcC0+c2VfbG9jYWxfaG9zdG5hbWUpOworCQkJCQlnb3RvIG5leHRfY3A7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0gLyogZW5kIG9mICJzd2l0Y2ggKHNlcC0+c2VfZmFtaWx5KSIgKi8KKworCQkvKiBkaWQgbHNhIGNoYW5nZT8gVGhlbiBjbG9zZS9vcGVuICovCisJCWlmIChzZXAtPnNlX2xzYSA9PSBOVUxMCisJCSB8fCBsc2EtPmxlbiAhPSBzZXAtPnNlX2xzYS0+bGVuCisJCSB8fCBtZW1jbXAoJmxzYS0+dS5zYSwgJnNlcC0+c2VfbHNhLT51LnNhLCBsc2EtPmxlbikgIT0gMAorCQkpIHsKKwkJCXJlbW92ZV9mZF9mcm9tX3NldChzZXAtPnNlX2ZkKTsKKwkJCW1heWJlX2Nsb3NlKHNlcC0+c2VfZmQpOworCQkJZnJlZShzZXAtPnNlX2xzYSk7CisJCQlzZXAtPnNlX2xzYSA9IGxzYTsKKwkJCXNlcC0+c2VfZmQgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCWZyZWUobHNhKTsKKwkJfQorCQlpZiAoc2VwLT5zZV9mZCA9PSAtMSkKKwkJCXByZXBhcmVfc29ja2V0X2ZkKHNlcCk7CisgbmV4dF9jcDoKKwkJc2VwID0gY3AtPnNlX25leHQ7CisJCWZyZWUoY3ApOworCQljcCA9IHNlcDsKKwl9IC8qIGVuZCBvZiAid2hpbGUgKDEpIHBhcnNlIGxpbmVzIiAqLworCWNsb3NlX2NvbmZpZ19maWxlKCk7CisKKwkvKiBQdXJnZSBhbnl0aGluZyBub3QgbG9va2VkIGF0IGFib3ZlIC0gdGhlc2UgYXJlIHN0YWxlIGVudHJpZXMsCisJICogbmV3IGNvbmZpZyBmaWxlIGRvZXNudCBoYXZlIHRoZW0uICovCisJYmxvY2tfQ0hMRF9IVVBfQUxSTSgmb21hc2spOworCXNlcHAgPSAmc2Vydl9saXN0OworCXdoaWxlICgoc2VwID0gKnNlcHApKSB7CisJCWlmIChzZXAtPnNlX2NoZWNrZWQpIHsKKwkJCXNlcHAgPSAmc2VwLT5zZV9uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJKnNlcHAgPSBzZXAtPnNlX25leHQ7CisJCXJlbW92ZV9mZF9mcm9tX3NldChzZXAtPnNlX2ZkKTsKKwkJbWF5YmVfY2xvc2Uoc2VwLT5zZV9mZCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJCWlmIChpc19ycGNfc2VydmljZShzZXApKQorCQkJdW5yZWdpc3Rlcl9ycGMoc2VwKTsKKyNlbmRpZgorCQlpZiAoc2VwLT5zZV9mYW1pbHkgPT0gQUZfVU5JWCkKKwkJCXVubGluayhzZXAtPnNlX3NlcnZpY2UpOworCQlmcmVlX3NlcnZ0YWJfc3RyaW5ncyhzZXApOworCQlmcmVlKHNlcCk7CisJfQorCXJlc3RvcmVfc2lnbWFzaygmb21hc2spOworIHJldDoKKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKK3N0YXRpYyB2b2lkIHJlYXBfY2hpbGQoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJcGlkX3QgcGlkOworCWludCBzdGF0dXM7CisJc2VydnRhYl90ICpzZXA7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKworCWZvciAoOzspIHsKKwkJcGlkID0gd2FpdF9hbnlfbm9oYW5nKCZzdGF0dXMpOworCQlpZiAocGlkIDw9IDApCisJCQlicmVhazsKKwkJZm9yIChzZXAgPSBzZXJ2X2xpc3Q7IHNlcDsgc2VwID0gc2VwLT5zZV9uZXh0KSB7CisJCQlpZiAoc2VwLT5zZV93YWl0ICE9IHBpZCkKKwkJCQljb250aW51ZTsKKwkJCS8qIE9uZSBvZiBvdXIgIndhaXQiIHNlcnZpY2VzICovCisJCQlpZiAoV0lGRVhJVEVEKHN0YXR1cykgJiYgV0VYSVRTVEFUVVMoc3RhdHVzKSkKKwkJCQliYl9lcnJvcl9tc2coIiVzOiBleGl0IHN0YXR1cyAldSIsCisJCQkJCQlzZXAtPnNlX3Byb2dyYW0sIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQkJZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCQliYl9lcnJvcl9tc2coIiVzOiBleGl0IHNpZ25hbCAldSIsCisJCQkJCQlzZXAtPnNlX3Byb2dyYW0sIFdURVJNU0lHKHN0YXR1cykpOworCQkJc2VwLT5zZV93YWl0ID0gMTsKKwkJCWFkZF9mZF90b19zZXQoc2VwLT5zZV9mZCk7CisJCQlicmVhazsKKwkJfQorCX0KKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKK3N0YXRpYyB2b2lkIHJldHJ5X25ldHdvcmtfc2V0dXAoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKwlzZXJ2dGFiX3QgKnNlcDsKKworCWFsYXJtX2FybWVkID0gMDsKKwlmb3IgKHNlcCA9IHNlcnZfbGlzdDsgc2VwOyBzZXAgPSBzZXAtPnNlX25leHQpIHsKKwkJaWYgKHNlcC0+c2VfZmQgPT0gLTEpIHsKKwkJCXByZXBhcmVfc29ja2V0X2ZkKHNlcCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJCQlpZiAoc2VwLT5zZV9mZCAhPSAtMSAmJiBpc19ycGNfc2VydmljZShzZXApKQorCQkJCXJlZ2lzdGVyX3JwYyhzZXApOworI2VuZGlmCisJCX0KKwl9CisJZXJybm8gPSBzYXZlX2Vycm5vOworfQorCitzdGF0aWMgdm9pZCBjbGVhbl91cF9hbmRfZXhpdChpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlzZXJ2dGFiX3QgKnNlcDsKKworCS8qIFhYWCBzaWduYWwgcmFjZSB3YWxraW5nIHNlcCBsaXN0ICovCisJZm9yIChzZXAgPSBzZXJ2X2xpc3Q7IHNlcDsgc2VwID0gc2VwLT5zZV9uZXh0KSB7CisJCWlmIChzZXAtPnNlX2ZkID09IC0xKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChzZXAtPnNlX2ZhbWlseSkgeworCQljYXNlIEFGX1VOSVg6CisJCQl1bmxpbmsoc2VwLT5zZV9zZXJ2aWNlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBjYXNlIEFGX0lORVQsIEFGX0lORVQ2ICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJCQlpZiAoc2VwLT5zZV93YWl0ID09IDEgJiYgaXNfcnBjX3NlcnZpY2Uoc2VwKSkKKwkJCQl1bnJlZ2lzdGVyX3JwYyhzZXApOyAgIC8qIFhYWCBzaWduYWwgcmFjZSAqLworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQljbG9zZShzZXAtPnNlX2ZkKTsKKwl9CisJcmVtb3ZlX3BpZGZpbGUoX1BBVEhfSU5FVERQSUQpOworCWV4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworaW50IGluZXRkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpbmV0ZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYSwgc2F2ZWRfcGlwZV9oYW5kbGVyOworCXNlcnZ0YWJfdCAqc2VwLCAqc2VwMjsKKwlzdHJ1Y3QgcGFzc3dkICpwd2Q7CisJc3RydWN0IGdyb3VwICpncnAgPSBncnA7IC8qIGZvciBjb21waWxlciAqLworCWludCBvcHQ7CisJcGlkX3QgcGlkOworCXNpZ3NldF90IG9tYXNrOworCisJSU5JVF9HKCk7CisKKwlyZWFsX3VpZCA9IGdldHVpZCgpOworCWlmIChyZWFsX3VpZCAhPSAwKSAvKiBydW4gYnkgbm9uLXJvb3QgdXNlciAqLworCQljb25maWdfZmlsZW5hbWUgPSBOVUxMOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiUis6cSsiOyAvKiAtcSBOLCAtUiBOICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIlI6ZmVxOiIsICZtYXhfY29uY3VycmVuY3ksICZnbG9iYWxfcXVldWVsZW4pOworCWFyZ3YgKz0gb3B0aW5kOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJaWYgKGFyZ3ZbMF0pCisJCWNvbmZpZ19maWxlbmFtZSA9IGFyZ3ZbMF07CisJaWYgKGNvbmZpZ19maWxlbmFtZSA9PSBOVUxMKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm9uLXJvb3QgbXVzdCBzcGVjaWZ5IGNvbmZpZyBmaWxlIik7CisJaWYgKCEob3B0ICYgMikpCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2IC0gb3B0aW5kKTsKKwllbHNlCisJCWJiX3Nhbml0aXplX3N0ZGlvKCk7CisJaWYgKCEob3B0ICYgNCkpIHsKKwkJLyogTE9HX05ERUxBWTogY29ubmVjdCB0byBzeXNsb2cgZGFlbW9uIE5PVy4KKwkJICogT3RoZXJ3aXNlLCB3ZSBtYXkgb3BlbiBzeXNsb2cgc29ja2V0CisJCSAqIGluIHZmb3JrZWQgY2hpbGQsIG1ha2luZyBvcGVuZWQgZmRzIGFuZCBzeXNsb2coKQorCQkgKiBpbnRlcm5hbCBzdGF0ZSBpbmNvbnNpc3RlbnQuCisJCSAqIFRoaXMgd2FzIG9ic2VydmVkIHRvIGxlYWsgZmlsZSBkZXNjcmlwdG9ycy4gKi8KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCB8IExPR19OREVMQVksIExPR19EQUVNT04pOworCQlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJaWYgKHJlYWxfdWlkID09IDApIHsKKwkJLyogcnVuIGJ5IHJvb3QsIGVuc3VyZSBncm91cHMgdmVjdG9yIGdldHMgdHJhc2hlZCAqLworCQlnaWRfdCBnaWQgPSBnZXRnaWQoKTsKKwkJc2V0Z3JvdXBzKDEsICZnaWQpOworCX0KKworCXdyaXRlX3BpZGZpbGUoX1BBVEhfSU5FVERQSUQpOworCisJLyogbmV2ZXIgZmFpbHMgdW5kZXIgTGludXggKGV4Y2VwdCBpZiB5b3UgcGFzcyBpdCBiYWQgYXJndW1lbnRzKSAqLworCWdldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmxpbV9vZmlsZSk7CisJcmxpbV9vZmlsZV9jdXIgPSBybGltX29maWxlLnJsaW1fY3VyOworCWlmIChybGltX29maWxlX2N1ciA9PSBSTElNX0lORklOSVRZKSAgICAvKiAhICovCisJCXJsaW1fb2ZpbGVfY3VyID0gT1BFTl9NQVg7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkvKnNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsgLSBtZW1zZXQgZGlkIGl0ICovCisJc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBTSUdBTFJNKTsKKwlzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR0NITEQpOworCXNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHSFVQKTsKKy8vRklYTUU6IGV4cGxhaW4gd2h5IG5vIFNBX1JFU1RBUlQKKy8vRklYTUU6IHJldHJ5X25ldHdvcmtfc2V0dXAgaXMgdW5zYWZlIHRvIHJ1biBpbiBzaWduYWwgaGFuZGxlciAobWFueSByZWFzb25zKSEKKwlzYS5zYV9oYW5kbGVyID0gcmV0cnlfbmV0d29ya19zZXR1cDsKKwlzaWdhY3Rpb25fc2V0KFNJR0FMUk0sICZzYSk7CisvL0ZJWE1FOiByZXJlYWRfY29uZmlnX2ZpbGUgaXMgdW5zYWZlIHRvIHJ1biBpbiBzaWduYWwgaGFuZGxlcihtYW55IHJlYXNvbnMpIQorCXNhLnNhX2hhbmRsZXIgPSByZXJlYWRfY29uZmlnX2ZpbGU7CisJc2lnYWN0aW9uX3NldChTSUdIVVAsICZzYSk7CisvL0ZJWE1FOiByZWFwX2NoaWxkIGlzIHVuc2FmZSB0byBydW4gaW4gc2lnbmFsIGhhbmRsZXIgKHVzZXMgc3RkaW8pIQorCXNhLnNhX2hhbmRsZXIgPSByZWFwX2NoaWxkOworCXNpZ2FjdGlvbl9zZXQoU0lHQ0hMRCwgJnNhKTsKKy8vRklYTUU6IGNsZWFuX3VwX2FuZF9leGl0IGlzIHVuc2FmZSB0byBydW4gaW4gc2lnbmFsIGhhbmRsZXIgKHVzZXMgc3RkaW8pIQorCXNhLnNhX2hhbmRsZXIgPSBjbGVhbl91cF9hbmRfZXhpdDsKKwlzaWdhY3Rpb25fc2V0KFNJR1RFUk0sICZzYSk7CisJc2Euc2FfaGFuZGxlciA9IGNsZWFuX3VwX2FuZF9leGl0OworCXNpZ2FjdGlvbl9zZXQoU0lHSU5ULCAmc2EpOworCXNhLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworCXNpZ2FjdGlvbihTSUdQSVBFLCAmc2EsICZzYXZlZF9waXBlX2hhbmRsZXIpOworCisJcmVyZWFkX2NvbmZpZ19maWxlKFNJR0hVUCk7IC8qIGxvYWQgY29uZmlnIGZyb20gZmlsZSAqLworCisJZm9yICg7OykgeworCQlpbnQgcmVhZHlfZmRfY250OworCQlpbnQgY3RybCwgYWNjZXB0ZWRfZmQsIG5ld191ZHBfZmQ7CisJCWZkX3NldCByZWFkYWJsZTsKKworCQlpZiAobWF4c29jayA8IDApCisJCQlyZWNhbGN1bGF0ZV9tYXhzb2NrKCk7CisKKwkJcmVhZGFibGUgPSBhbGxzb2NrOyAvKiBzdHJ1Y3QgY29weSAqLworCQkvKiBpZiB0aGVyZSBhcmUgbm8gZmRzIHRvIHdhaXQgb24sIHdlIHdpbGwgYmxvY2sKKwkJICogdW50aWwgc2lnbmFsIHdha2VzIHVzIHVwIChtYXhzb2NrID09IDAsIGJ1dCByZWFkYWJsZQorCQkgKiBuZXZlciBjb250YWlucyBmZHMgMCBhbmQgMS4uLikgKi8KKwkJcmVhZHlfZmRfY250ID0gc2VsZWN0KG1heHNvY2sgKyAxLCAmcmVhZGFibGUsIE5VTEwsIE5VTEwsIE5VTEwpOworCQlpZiAocmVhZHlfZmRfY250IDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSKSB7CisJCQkJYmJfcGVycm9yX21zZygic2VsZWN0Iik7CisJCQkJc2xlZXAoMSk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoc2VwID0gc2Vydl9saXN0OyByZWFkeV9mZF9jbnQgJiYgc2VwOyBzZXAgPSBzZXAtPnNlX25leHQpIHsKKwkJCWlmIChzZXAtPnNlX2ZkID09IC0xIHx8ICFGRF9JU1NFVChzZXAtPnNlX2ZkLCAmcmVhZGFibGUpKQorCQkJCWNvbnRpbnVlOworCisJCQlyZWFkeV9mZF9jbnQtLTsKKwkJCWN0cmwgPSBzZXAtPnNlX2ZkOworCQkJYWNjZXB0ZWRfZmQgPSAtMTsKKwkJCW5ld191ZHBfZmQgPSAtMTsKKwkJCWlmICghc2VwLT5zZV93YWl0KSB7CisJCQkJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19TVFJFQU0pIHsKKwkJCQkJY3RybCA9IGFjY2VwdGVkX2ZkID0gYWNjZXB0KHNlcC0+c2VfZmQsIE5VTEwsIE5VTEwpOworCQkJCQlpZiAoY3RybCA8IDApIHsKKwkJCQkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQkJCQliYl9wZXJyb3JfbXNnKCJhY2NlcHQgKGZvciAlcykiLCBzZXAtPnNlX3NlcnZpY2UpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogIm5vd2FpdCIgdWRwICovCisJCQkJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19ER1JBTQorCQkJCSAmJiBzZXAtPnNlX2ZhbWlseSAhPSBBRl9VTklYCisJCQkJKSB7CisvKiBIb3cgdWRwICJub3dhaXQiIHdvcmtzOgorICogY2hpbGQgcGVla3MgYXQgKHJlY2VpdmVkIGFuZCBidWZmZXJlZCBieSBrZXJuZWwpIFVEUCBwYWNrZXQsCisgKiBwZXJmb3JtcyBjb25uZWN0KCkgb24gdGhlIHNvY2tldCBzbyB0aGF0IGl0IGlzIGxpbmtlZCBvbmx5CisgKiB0byB0aGlzIHBlZXIuIEJ1dCB0aGlzIGFsc28gYWZmZWN0cyBwYXJlbnQsIGJlY2F1c2UgZGVzY3JpcHRvcnMKKyAqIGFyZSBzaGFyZWQgYWZ0ZXIgZm9yaygpIGEtbGEgZHVwKCkuIFdoZW4gcGFyZW50IHBlcmZvcm1zCisgKiBzZWxlY3QoKSwgaXQgd2lsbCBzZWUgdGhpcyBkZXNjcmlwdG9yIGNvbm5lY3RlZCB0byB0aGUgcGVlciAoISkKKyAqIGFuZCBzdGlsbCByZWFkYWJsZSwgd2lsbCBhY3Qgb24gaXQgYW5kIG1lc3MgdGhpbmdzIHVwCisgKiAoY2FuIGNyZWF0ZSBtYW55IGNvcGllcyBvZiBzYW1lIGNoaWxkLCBldGMpLgorICogUGFyZW50IG11c3QgY3JlYXRlIGFuZCB1c2UgbmV3IHNvY2tldCBpbnN0ZWFkLiAqLworCQkJCQluZXdfdWRwX2ZkID0gc29ja2V0KHNlcC0+c2VfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKKwkJCQkJaWYgKG5ld191ZHBfZmQgPCAwKSB7IC8qIGVycm9yOiBlYXQgcGFja2V0LCBmb3JnZXQgYWJvdXQgaXQgKi8KKyB1ZHBfZXJyOgorCQkJCQkJcmVjdihzZXAtPnNlX2ZkLCBsaW5lLCBMSU5FX1NJWkUsIE1TR19ET05UV0FJVCk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlzZXRzb2Nrb3B0X3JldXNlYWRkcihuZXdfdWRwX2ZkKTsKKwkJCQkJLyogVE9ETzogYmV0dGVyIGRvIGJpbmQgYWZ0ZXIgdmZvcmsgaW4gcGFyZW50LAorCQkJCQkgKiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdHdvIHdpbGRjYXJkIGJvdW5kIHNvY2tldHMKKwkJCQkJICogZXZlbiBmb3IgYSBicmllZiBtb21lbnQ/ICovCisJCQkJCWlmIChiaW5kKG5ld191ZHBfZmQsICZzZXAtPnNlX2xzYS0+dS5zYSwgc2VwLT5zZV9sc2EtPmxlbikgPCAwKSB7CisJCQkJCQljbG9zZShuZXdfdWRwX2ZkKTsKKwkJCQkJCWdvdG8gdWRwX2VycjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJYmxvY2tfQ0hMRF9IVVBfQUxSTSgmb21hc2spOworCQkJcGlkID0gMDsKKyNpZmRlZiBJTkVURF9CVUlMVElOU19FTkFCTEVECisJCQkvKiBkbyB3ZSBuZWVkIHRvIGZvcms/ICovCisJCQlpZiAoc2VwLT5zZV9idWlsdGluID09IE5VTEwKKwkJCSB8fCAoc2VwLT5zZV9zb2NrdHlwZSA9PSBTT0NLX1NUUkVBTQorCQkJICAgICAmJiBzZXAtPnNlX2J1aWx0aW4tPmJpX2ZvcmspKQorI2VuZGlmCisJCQl7CisJCQkJaWYgKHNlcC0+c2VfbWF4ICE9IDApIHsKKwkJCQkJaWYgKCsrc2VwLT5zZV9jb3VudCA9PSAxKQorCQkJCQkJc2VwLT5zZV90aW1lID0gbW9ub3RvbmljX3NlYygpOworCQkJCQllbHNlIGlmIChzZXAtPnNlX2NvdW50ID49IHNlcC0+c2VfbWF4KSB7CisJCQkJCQl1bnNpZ25lZCBub3cgPSBtb25vdG9uaWNfc2VjKCk7CisJCQkJCQkvKiBkaWQgd2UgYWNjdW11bGF0ZSBzZV9tYXggY29ubmVjdHMgdG9vIHF1aWNrbHk/ICovCisJCQkJCQlpZiAobm93IC0gc2VwLT5zZV90aW1lIDw9IENOVF9JTlRFUlZBTCkgeworCQkJCQkJCWJiX2Vycm9yX21zZygiJXMvJXM6IHRvbyBtYW55IGNvbm5lY3Rpb25zLCBwYXVzaW5nIiwKKwkJCQkJCQkJCXNlcC0+c2Vfc2VydmljZSwgc2VwLT5zZV9wcm90byk7CisJCQkJCQkJcmVtb3ZlX2ZkX2Zyb21fc2V0KHNlcC0+c2VfZmQpOworCQkJCQkJCWNsb3NlKHNlcC0+c2VfZmQpOworCQkJCQkJCXNlcC0+c2VfZmQgPSAtMTsKKwkJCQkJCQlzZXAtPnNlX2NvdW50ID0gMDsKKwkJCQkJCQlyZWFybV9hbGFybSgpOyAvKiB3aWxsIHJldml2ZSBpdCBpbiBSRVRSWVRJTUUgc2VjICovCisJCQkJCQkJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisJCQkJCQkJbWF5YmVfY2xvc2UobmV3X3VkcF9mZCk7CisJCQkJCQkJbWF5YmVfY2xvc2UoYWNjZXB0ZWRfZmQpOworCQkJCQkJCWNvbnRpbnVlOyAvKiAtPiBjaGVjayBuZXh0IGZkIGluIGZkIHNldCAqLworCQkJCQkJfQorCQkJCQkJc2VwLT5zZV9jb3VudCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogb24gTk9NTVUsIHN0cmVhbWVkIGNoYXJnZW4KKwkJCQkgKiBidWlsdGluIHdvdWxkbid0IHdvcmssIGJ1dCBpdCBpcworCQkJCSAqIG5vdCBhbGxvd2VkIG9uIE5PTU1VIChpZmRlZmVkIG91dCkgKi8KKyNpZmRlZiBJTkVURF9CVUlMVElOU19FTkFCTEVECisJCQkJaWYgKEJCX01NVSAmJiBzZXAtPnNlX2J1aWx0aW4pCisJCQkJCXBpZCA9IGZvcmsoKTsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQkJcGlkID0gdmZvcmsoKTsKKworCQkJCWlmIChwaWQgPCAwKSB7IC8qIGZvcmsgZXJyb3IgKi8KKwkJCQkJYmJfcGVycm9yX21zZygidmZvcmsiKzEpOworCQkJCQlzbGVlcCgxKTsKKwkJCQkJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisJCQkJCW1heWJlX2Nsb3NlKG5ld191ZHBfZmQpOworCQkJCQltYXliZV9jbG9zZShhY2NlcHRlZF9mZCk7CisJCQkJCWNvbnRpbnVlOyAvKiAtPiBjaGVjayBuZXh0IGZkIGluIGZkIHNldCAqLworCQkJCX0KKwkJCQlpZiAocGlkID09IDApCisJCQkJCXBpZC0tOyAvKiAtMTogIndlIGRpZCBmb3JrIGFuZCB3ZSBhcmUgY2hpbGQiICovCisJCQl9CisJCQkvKiBpZiBwaWQgPT0gMCBoZXJlLCB3ZSBkaWRuJ3QgZm9yayAqLworCisJCQlpZiAocGlkID4gMCkgeyAvKiBwYXJlbnQgKi8KKwkJCQlpZiAoc2VwLT5zZV93YWl0KSB7CisJCQkJCS8qIHdhaXQ6IHdlIHBhc3NlZCBzb2NrZXQgdG8gY2hpbGQsCisJCQkJCSAqIHdpbGwgd2FpdCBmb3IgY2hpbGQgdG8gdGVybWluYXRlICovCisJCQkJCXNlcC0+c2Vfd2FpdCA9IHBpZDsKKwkJCQkJcmVtb3ZlX2ZkX2Zyb21fc2V0KHNlcC0+c2VfZmQpOworCQkJCX0KKwkJCQlpZiAobmV3X3VkcF9mZCA+PSAwKSB7CisJCQkJCS8qIHVkcCBub3dhaXQ6IGNoaWxkIGNvbm5lY3RlZCB0aGUgc29ja2V0LAorCQkJCQkgKiB3ZSBjcmVhdGVkIGFuZCB3aWxsIHVzZSBuZXcsIHVuY29ubmVjdGVkIG9uZSAqLworCQkJCQl4bW92ZV9mZChuZXdfdWRwX2ZkLCBzZXAtPnNlX2ZkKTsKKwkJCQl9CisJCQkJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisJCQkJbWF5YmVfY2xvc2UoYWNjZXB0ZWRfZmQpOworCQkJCWNvbnRpbnVlOyAvKiAtPiBjaGVjayBuZXh0IGZkIGluIGZkIHNldCAqLworCQkJfQorCisJCQkvKiB3ZSBhcmUgZWl0aGVyIGNoaWxkIG9yIGRpZG4ndCB2Zm9yayBhdCBhbGwgKi8KKyNpZmRlZiBJTkVURF9CVUlMVElOU19FTkFCTEVECisJCQlpZiAoc2VwLT5zZV9idWlsdGluKSB7CisJCQkJaWYgKHBpZCkgeyAvKiAicGlkIiBpcyAtMTogd2UgZGlkIHZmb3JrICovCisJCQkJCWNsb3NlKHNlcC0+c2VfZmQpOyAvKiBsaXN0ZW5pbmcgc29ja2V0ICovCisJCQkJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7IC8qIG1ha2UgeHdyaXRlIGV0YyBzaWxlbnQgKi8KKwkJCQl9CisJCQkJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisJCQkJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19TVFJFQU0pCisJCQkJCXNlcC0+c2VfYnVpbHRpbi0+Ymlfc3RyZWFtX2ZuKGN0cmwsIHNlcCk7CisJCQkJZWxzZQorCQkJCQlzZXAtPnNlX2J1aWx0aW4tPmJpX2RncmFtX2ZuKGN0cmwsIHNlcCk7CisJCQkJaWYgKHBpZCkgLyogd2UgZGlkIHZmb3JrICovCisJCQkJCV9leGl0KEVYSVRfRkFJTFVSRSk7CisJCQkJbWF5YmVfY2xvc2UoYWNjZXB0ZWRfZmQpOworCQkJCWNvbnRpbnVlOyAvKiAtPiBjaGVjayBuZXh0IGZkIGluIGZkIHNldCAqLworCQkJfQorI2VuZGlmCisJCQkvKiBjaGlsZCAqLworCQkJc2V0c2lkKCk7CisJCQkvKiAibm93YWl0IiB1ZHAgKi8KKwkJCWlmIChuZXdfdWRwX2ZkID49IDApIHsKKwkJCQlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJCQkJaW50IHI7CisKKwkJCQljbG9zZShuZXdfdWRwX2ZkKTsKKwkJCQlsc2EgPSB4emFsbG9jX2xzYShzZXAtPnNlX2ZhbWlseSk7CisJCQkJLyogcGVlayBhdCB0aGUgcGFja2V0IGFuZCByZW1lbWJlciBwZWVyIGFkZHIgKi8KKwkJCQlyID0gcmVjdmZyb20oY3RybCwgTlVMTCwgMCwgTVNHX1BFRUt8TVNHX0RPTlRXQUlULAorCQkJCQkmbHNhLT51LnNhLCAmbHNhLT5sZW4pOworCQkJCWlmIChyIDwgMCkKKwkJCQkJZ290byBkb19leGl0MTsKKwkJCQkvKiBtYWtlIHRoaXMgc29ja2V0ICJjb25uZWN0ZWQiIHRvIHBlZXIgYWRkcjoKKwkJCQkgKiBvbmx5IHBhY2tldHMgZnJvbSB0aGlzIHBlZXIgd2lsbCBiZSByZWN2J2VkLAorCQkJCSAqIGFuZCBiYXJlIHdyaXRlKCkvc2VuZCgpIHdpbGwgd29yayBvbiBpdCAqLworCQkJCWNvbm5lY3QoY3RybCwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCQkJCWZyZWUobHNhKTsKKwkJCX0KKwkJCS8qIHByZXBhcmUgZW52IGFuZCBleGVjIHByb2dyYW0gKi8KKwkJCXB3ZCA9IGdldHB3bmFtKHNlcC0+c2VfdXNlcik7CisJCQlpZiAocHdkID09IE5VTEwpIHsKKwkJCQliYl9lcnJvcl9tc2coIiVzOiBubyBzdWNoICVzIiwgc2VwLT5zZV91c2VyLCAidXNlciIpOworCQkJCWdvdG8gZG9fZXhpdDE7CisJCQl9CisJCQlpZiAoc2VwLT5zZV9ncm91cCAmJiAoZ3JwID0gZ2V0Z3JuYW0oc2VwLT5zZV9ncm91cCkpID09IE5VTEwpIHsKKwkJCQliYl9lcnJvcl9tc2coIiVzOiBubyBzdWNoICVzIiwgc2VwLT5zZV9ncm91cCwgImdyb3VwIik7CisJCQkJZ290byBkb19leGl0MTsKKwkJCX0KKwkJCWlmIChyZWFsX3VpZCAhPSAwICYmIHJlYWxfdWlkICE9IHB3ZC0+cHdfdWlkKSB7CisJCQkJLyogYSB1c2VyIHJ1bm5pbmcgcHJpdmF0ZSBpbmV0ZCAqLworCQkJCWJiX2Vycm9yX21zZygibm9uLXJvb3QgbXVzdCBydW4gc2VydmljZXMgYXMgaGltc2VsZiIpOworCQkJCWdvdG8gZG9fZXhpdDE7CisJCQl9CisJCQlpZiAocHdkLT5wd191aWQpIHsKKwkJCQlpZiAoc2VwLT5zZV9ncm91cCkKKwkJCQkJcHdkLT5wd19naWQgPSBncnAtPmdyX2dpZDsKKwkJCQkvKiBpbml0Z3JvdXBzLCBzZXRnaWQsIHNldHVpZDogKi8KKwkJCQljaGFuZ2VfaWRlbnRpdHkocHdkKTsKKwkJCX0gZWxzZSBpZiAoc2VwLT5zZV9ncm91cCkgeworCQkJCXhzZXRnaWQoZ3JwLT5ncl9naWQpOworCQkJCXNldGdyb3VwcygxLCAmZ3JwLT5ncl9naWQpOworCQkJfQorCQkJaWYgKHJsaW1fb2ZpbGUucmxpbV9jdXIgIT0gcmxpbV9vZmlsZV9jdXIpCisJCQkJaWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmxpbV9vZmlsZSkgPCAwKQorCQkJCQliYl9wZXJyb3JfbXNnKCJzZXRybGltaXQiKTsKKworCQkJLyogY2xvc2Vsb2coKTsgLSBXUk9ORy4gd2UgYXJlIGFmdGVyIHZmb3JrLAorCQkJICogdGhpcyBtYXkgY29uZnVzZSBzeXNsb2coKSBpbnRlcm5hbCBzdGF0ZS4KKwkJCSAqIExldCdzIGhvcGUgbGliYyBzZXRzIHN5c2xvZyBmZCB0byBDTE9FWEVDLi4uCisJCQkgKi8KKwkJCXhtb3ZlX2ZkKGN0cmwsIFNURElOX0ZJTEVOTyk7CisJCQl4ZHVwMihTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCQkJLyogbWFucGFnZXMgb2YgaW5ldGQgSSBtYW5hZ2VkIHRvIGZpbmQgZWl0aGVyIHNheQorCQkJICogdGhhdCBzdGRlcnIgaXMgYWxzbyByZWRpcmVjdGVkIHRvIHRoZSBuZXR3b3JrLAorCQkJICogb3IgZG8gbm90IHRhbGsgYWJvdXQgcmVkaXJlY3Rpb24gYXQgYWxsICghKSAqLworCQkJaWYgKCFzZXAtPnNlX3dhaXQpIC8qIG9ubHkgZm9yIHVzdWFsICJ0Y3Agbm93YWl0IiAqLworCQkJCXhkdXAyKFNURElOX0ZJTEVOTywgU1RERVJSX0ZJTEVOTyk7CisJCQkvKiBOQjogYW1vbmcgb3RoZXJzLCB0aGlzIGxvb3AgY2xvc2VzIGxpc3RlbmluZyBzb2NrZXRzCisJCQkgKiBmb3Igbm93YWl0IHN0cmVhbSBjaGlsZHJlbiAqLworCQkJZm9yIChzZXAyID0gc2Vydl9saXN0OyBzZXAyOyBzZXAyID0gc2VwMi0+c2VfbmV4dCkKKwkJCQlpZiAoc2VwMi0+c2VfZmQgIT0gY3RybCkKKwkJCQkJbWF5YmVfY2xvc2Uoc2VwMi0+c2VfZmQpOworCQkJc2lnYWN0aW9uX3NldChTSUdQSVBFLCAmc2F2ZWRfcGlwZV9oYW5kbGVyKTsKKwkJCXJlc3RvcmVfc2lnbWFzaygmb21hc2spOworCQkJQkJfRVhFQ1ZQKHNlcC0+c2VfcHJvZ3JhbSwgc2VwLT5zZV9hcmd2KTsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGV4ZWN1dGUgJyVzJyIsIHNlcC0+c2VfcHJvZ3JhbSk7CisgZG9fZXhpdDE6CisJCQkvKiBlYXQgcGFja2V0IGluIHVkcCBjYXNlICovCisJCQlpZiAoc2VwLT5zZV9zb2NrdHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJCQlyZWN2KDAsIGxpbmUsIExJTkVfU0laRSwgTVNHX0RPTlRXQUlUKTsKKwkJCV9leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0gLyogZm9yIChzZXAgPSBzZXJ2dGFiLi4uKSAqLworCX0gLyogZm9yICg7OykgKi8KK30KKworI2lmICFCQl9NTVUKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjYXRfYXJnc1tdID0geyAiY2F0IiwgTlVMTCB9OworI2VuZGlmCisKKy8qCisgKiBJbnRlcm5ldCBzZXJ2aWNlcyBwcm92aWRlZCBpbnRlcm5hbGx5IGJ5IGluZXRkOgorICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8KKy8qIEVjaG8gc2VydmljZSAtLSBlY2hvIGRhdGEgYmFjay4gKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZWNob19zdHJlYW0oaW50IHMsIHNlcnZ0YWJfdCAqc2VwIFVOVVNFRF9QQVJBTSkKK3sKKyNpZiBCQl9NTVUKKwl3aGlsZSAoMSkgeworCQlzc2l6ZV90IHN6ID0gc2FmZV9yZWFkKHMsIGxpbmUsIExJTkVfU0laRSk7CisJCWlmIChzeiA8PSAwKQorCQkJYnJlYWs7CisJCXh3cml0ZShzLCBsaW5lLCBzeik7CisJfQorI2Vsc2UKKwkvKiBXZSBhcmUgYWZ0ZXIgdmZvcmsgaGVyZSEgKi8KKwkvKiBtb3ZlIG5ldHdvcmsgc29ja2V0IHRvIHN0ZGluL3N0ZG91dCAqLworCXhtb3ZlX2ZkKHMsIFNURElOX0ZJTEVOTyk7CisJeGR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwkvKiBubyBlcnJvciBtZXNzYWdlcyBwbGVhc2UuLi4gKi8KKwljbG9zZShTVERFUlJfRklMRU5PKTsKKwl4b3BlbihiYl9kZXZfbnVsbCwgT19XUk9OTFkpOworCUJCX0VYRUNWUCgiY2F0IiwgKGNoYXIqKiljYXRfYXJncyk7CisJLyogb24gZmFpbHVyZSB3ZSByZXR1cm4gdG8gbWFpbiwgd2hpY2ggZG9lcyBleGl0KEVYSVRfRkFJTFVSRSkgKi8KKyNlbmRpZgorfQorc3RhdGljIHZvaWQgRkFTVF9GVU5DIGVjaG9fZGcoaW50IHMsIHNlcnZ0YWJfdCAqc2VwKQoreworCWVudW0geyBCVUZTSVpFID0gMTIqMTAyNCB9OyAvKiBmb3IganVtYm8gc2l6ZWQgcGFja2V0cyEgOikgKi8KKwljaGFyICpidWYgPSB4bWFsbG9jKEJVRlNJWkUpOyAvKiB0b28gYmlnIGZvciBzdGFjayAqLworCWludCBzejsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2EgPSBhbGxvY2EoTFNBX0xFTl9TSVpFICsgc2VwLT5zZV9sc2EtPmxlbik7CisKKwlsc2EtPmxlbiA9IHNlcC0+c2VfbHNhLT5sZW47CisJLyogZGdyYW0gYnVpbHRpbnMgYXJlIG5vbi1mb3JraW5nIC0gRE9OVCBCTE9DSyEgKi8KKwlzeiA9IHJlY3Zmcm9tKHMsIGJ1ZiwgQlVGU0laRSwgTVNHX0RPTlRXQUlULCAmbHNhLT51LnNhLCAmbHNhLT5sZW4pOworCWlmIChzeiA+IDApCisJCXNlbmR0byhzLCBidWYsIHN6LCAwLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7CisJZnJlZShidWYpOworfQorI2VuZGlmICAvKiBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPICovCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJECisvKiBEaXNjYXJkIHNlcnZpY2UgLS0gaWdub3JlIGRhdGEuICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGRpc2NhcmRfc3RyZWFtKGludCBzLCBzZXJ2dGFiX3QgKnNlcCBVTlVTRURfUEFSQU0pCit7CisjaWYgQkJfTU1VCisJd2hpbGUgKHNhZmVfcmVhZChzLCBsaW5lLCBMSU5FX1NJWkUpID4gMCkKKwkJY29udGludWU7CisjZWxzZQorCS8qIFdlIGFyZSBhZnRlciB2Zm9yayBoZXJlISAqLworCS8qIG1vdmUgbmV0d29yayBzb2NrZXQgdG8gc3RkaW4gKi8KKwl4bW92ZV9mZChzLCBTVERJTl9GSUxFTk8pOworCS8qIGRpc2NhcmQgb3V0cHV0ICovCisJY2xvc2UoU1RET1VUX0ZJTEVOTyk7CisJeG9wZW4oYmJfZGV2X251bGwsIE9fV1JPTkxZKTsKKwkvKiBubyBlcnJvciBtZXNzYWdlcyBwbGVhc2UuLi4gKi8KKwl4ZHVwMihTVERPVVRfRklMRU5PLCBTVERFUlJfRklMRU5PKTsKKwlCQl9FWEVDVlAoImNhdCIsIChjaGFyKiopY2F0X2FyZ3MpOworCS8qIG9uIGZhaWx1cmUgd2UgcmV0dXJuIHRvIG1haW4sIHdoaWNoIGRvZXMgZXhpdChFWElUX0ZBSUxVUkUpICovCisjZW5kaWYKK30KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGlzY2FyZF9kZyhpbnQgcywgc2VydnRhYl90ICpzZXAgVU5VU0VEX1BBUkFNKQoreworCS8qIGRncmFtIGJ1aWx0aW5zIGFyZSBub24tZm9ya2luZyAtIERPTlQgQkxPQ0shICovCisJcmVjdihzLCBsaW5lLCBMSU5FX1NJWkUsIE1TR19ET05UV0FJVCk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTgorI2RlZmluZSBMSU5FU0laIDcyCitzdGF0aWMgdm9pZCBpbml0X3Jpbmcodm9pZCkKK3sKKwlpbnQgaTsKKworCWVuZF9yaW5nID0gcmluZzsKKwlmb3IgKGkgPSAnICc7IGkgPCAxMjc7IGkrKykKKwkJKmVuZF9yaW5nKysgPSBpOworfQorLyogQ2hhcmFjdGVyIGdlbmVyYXRvci4gTU1VIGFyY2hlcyBvbmx5LiAqLworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjaGFyZ2VuX3N0cmVhbShpbnQgcywgc2VydnRhYl90ICpzZXAgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKnJzOworCWludCBsZW47CisJY2hhciB0ZXh0W0xJTkVTSVogKyAyXTsKKworCWlmICghZW5kX3JpbmcpIHsKKwkJaW5pdF9yaW5nKCk7CisJCXJzID0gcmluZzsKKwl9CisKKwl0ZXh0W0xJTkVTSVpdID0gJ1xyJzsKKwl0ZXh0W0xJTkVTSVogKyAxXSA9ICdcbic7CisJcnMgPSByaW5nOworCWZvciAoOzspIHsKKwkJbGVuID0gZW5kX3JpbmcgLSByczsKKwkJaWYgKGxlbiA+PSBMSU5FU0laKQorCQkJbWVtbW92ZSh0ZXh0LCBycywgTElORVNJWik7CisJCWVsc2UgeworCQkJbWVtbW92ZSh0ZXh0LCBycywgbGVuKTsKKwkJCW1lbW1vdmUodGV4dCArIGxlbiwgcmluZywgTElORVNJWiAtIGxlbik7CisJCX0KKwkJaWYgKCsrcnMgPT0gZW5kX3JpbmcpCisJCQlycyA9IHJpbmc7CisJCXh3cml0ZShzLCB0ZXh0LCBzaXplb2YodGV4dCkpOworCX0KK30KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY2hhcmdlbl9kZyhpbnQgcywgc2VydnRhYl90ICpzZXApCit7CisJaW50IGxlbjsKKwljaGFyIHRleHRbTElORVNJWiArIDJdOworCWxlbl9hbmRfc29ja2FkZHIgKmxzYSA9IGFsbG9jYShMU0FfTEVOX1NJWkUgKyBzZXAtPnNlX2xzYS0+bGVuKTsKKworCS8qIEVhdCBVRFAgcGFja2V0IHdoaWNoIHN0YXJ0ZWQgaXQgYWxsICovCisJLyogZGdyYW0gYnVpbHRpbnMgYXJlIG5vbi1mb3JraW5nIC0gRE9OVCBCTE9DSyEgKi8KKwlsc2EtPmxlbiA9IHNlcC0+c2VfbHNhLT5sZW47CisJaWYgKHJlY3Zmcm9tKHMsIHRleHQsIHNpemVvZih0ZXh0KSwgTVNHX0RPTlRXQUlULCAmbHNhLT51LnNhLCAmbHNhLT5sZW4pIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKCFlbmRfcmluZykgeworCQlpbml0X3JpbmcoKTsKKwkJcmluZ19wb3MgPSByaW5nOworCX0KKworCWxlbiA9IGVuZF9yaW5nIC0gcmluZ19wb3M7CisJaWYgKGxlbiA+PSBMSU5FU0laKQorCQltZW1tb3ZlKHRleHQsIHJpbmdfcG9zLCBMSU5FU0laKTsKKwllbHNlIHsKKwkJbWVtbW92ZSh0ZXh0LCByaW5nX3BvcywgbGVuKTsKKwkJbWVtbW92ZSh0ZXh0ICsgbGVuLCByaW5nLCBMSU5FU0laIC0gbGVuKTsKKwl9CisJaWYgKCsrcmluZ19wb3MgPT0gZW5kX3JpbmcpCisJCXJpbmdfcG9zID0gcmluZzsKKwl0ZXh0W0xJTkVTSVpdID0gJ1xyJzsKKwl0ZXh0W0xJTkVTSVogKyAxXSA9ICdcbic7CisJc2VuZHRvKHMsIHRleHQsIHNpemVvZih0ZXh0KSwgMCwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworfQorI2VuZGlmIC8qIEZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUUKKy8qCisgKiBSZXR1cm4gYSBtYWNoaW5lIHJlYWRhYmxlIGRhdGUgYW5kIHRpbWUsIGluIHRoZSBmb3JtIG9mIHRoZQorICogbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgbWlkbmlnaHQsIEphbiAxLCAxOTAwLiAgU2luY2UgZ2V0dGltZW9mZGF5CisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgSmFuIDEsIDE5NzAsCisgKiB3ZSBtdXN0IGFkZCAyMjA4OTg4ODAwIHNlY29uZHMgdG8gdGhpcyBmaWd1cmUgdG8gbWFrZSB1cCBmb3IKKyAqIHNvbWUgc2V2ZW50eSB5ZWFycyBCZWxsIExhYnMgd2FzIGFzbGVlcC4KKyAqLworc3RhdGljIHVpbnQzMl90IG1hY2h0aW1lKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlyZXR1cm4gaHRvbmwoKHVpbnQzMl90KSh0di50dl9zZWMgKyAyMjA4OTg4ODAwKSk7Cit9CisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIG1hY2h0aW1lX3N0cmVhbShpbnQgcywgc2VydnRhYl90ICpzZXAgVU5VU0VEX1BBUkFNKQoreworCXVpbnQzMl90IHJlc3VsdDsKKworCXJlc3VsdCA9IG1hY2h0aW1lKCk7CisJZnVsbF93cml0ZShzLCAmcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7Cit9CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgbWFjaHRpbWVfZGcoaW50IHMsIHNlcnZ0YWJfdCAqc2VwKQoreworCXVpbnQzMl90IHJlc3VsdDsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2EgPSBhbGxvY2EoTFNBX0xFTl9TSVpFICsgc2VwLT5zZV9sc2EtPmxlbik7CisKKwlsc2EtPmxlbiA9IHNlcC0+c2VfbHNhLT5sZW47CisJaWYgKHJlY3Zmcm9tKHMsIGxpbmUsIExJTkVfU0laRSwgTVNHX0RPTlRXQUlULCAmbHNhLT51LnNhLCAmbHNhLT5sZW4pIDwgMCkKKwkJcmV0dXJuOworCisJcmVzdWx0ID0gbWFjaHRpbWUoKTsKKwlzZW5kdG8ocywgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksIDAsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FICovCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FCisvKiBSZXR1cm4gaHVtYW4tcmVhZGFibGUgdGltZSBvZiBkYXkgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGF5dGltZV9zdHJlYW0oaW50IHMsIHNlcnZ0YWJfdCAqc2VwIFVOVVNFRF9QQVJBTSkKK3sKKwl0aW1lX3QgdDsKKworCXQgPSB0aW1lKE5VTEwpOworCWZkcHJpbnRmKHMsICIlLjI0c1xyXG4iLCBjdGltZSgmdCkpOworfQorc3RhdGljIHZvaWQgRkFTVF9GVU5DIGRheXRpbWVfZGcoaW50IHMsIHNlcnZ0YWJfdCAqc2VwKQoreworCXRpbWVfdCB0OworCWxlbl9hbmRfc29ja2FkZHIgKmxzYSA9IGFsbG9jYShMU0FfTEVOX1NJWkUgKyBzZXAtPnNlX2xzYS0+bGVuKTsKKworCWxzYS0+bGVuID0gc2VwLT5zZV9sc2EtPmxlbjsKKwlpZiAocmVjdmZyb20ocywgbGluZSwgTElORV9TSVpFLCBNU0dfRE9OVFdBSVQsICZsc2EtPnUuc2EsICZsc2EtPmxlbikgPCAwKQorCQlyZXR1cm47CisKKwl0ID0gdGltZShOVUxMKTsKKwlzcHJpbnRmKGxpbmUsICIlLjI0c1xyXG4iLCBjdGltZSgmdCkpOworCXNlbmR0byhzLCBsaW5lLCBzdHJsZW4obGluZSksIDAsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2ludGVyZmFjZS5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWMzMjJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDEyMzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHN0b2xlbiBmcm9tIG5ldC10b29scy0xLjU5IGFuZCBzdHJpcHBlZCBkb3duIGZvciBidXN5Ym94IGJ5CisgKgkJCUVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBIZWF2aWx5IG1vZGlmaWVkIGJ5IE1hbnVlbCBOb3ZvYSBJSUkgICAgICAgTWFyIDEyLCAyMDAxCisgKgorICogQWRkZWQgcHJpbnRfYnl0ZXNfc2NhbGVkIGZ1bmN0aW9uIHRvIHJlZHVjZSBjb2RlIHNpemUuCisgKiBBZGRlZCBzb21lIChwb3RlbnRpYWxseSkgbWlzc2luZyBkZWZpbmVzLgorICogSW1wcm92ZWQgZGlzcGxheSBzdXBwb3J0IGZvciAtYSBhbmQgZm9yIGEgbmFtZWQgaW50ZXJmYWNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogaWZjb25maWcgICBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQKKyAqICAgICAgICAgICAgICB0aGF0IGVpdGhlciBkaXNwbGF5cyBvciBzZXRzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YKKyAqICAgICAgICAgICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgc3lzdGVtJ3MgbmV0d29ya2luZyBpbnRlcmZhY2VzLgorICoKKyAqCisgKiBBdXRob3I6ICAgICAgRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHV3YWx0Lm5sLm11Z25ldC5vcmc+CisgKiAgICAgICAgICAgICAgYW5kIG90aGVycy4gIENvcHlyaWdodCAxOTkzIE1pY3JvV2FsdCBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogUGF0Y2hlZCB0byBzdXBwb3J0ICdhZGQnIGFuZCAnZGVsJyBrZXl3b3JkcyBmb3IgSU5FVCg0KSBhZGRyZXNzZXMKKyAqIGJ5IE1ycy4gQnJpc2J5IDxtcnMuYnJpc2J5QG5pbWgub3JnPgorICoKKyAqIHsxLjM0fSAtIDE5OTgwNjMwIC0gQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKiAgICAgICAgICAgICAgICAgICAgIC0gZ2V0dGV4dCBpbnN0ZWFkIG9mIGNhdGdldHMgZm9yIGkxOG4KKyAqICAgICAgICAgIDEwLzE5OTggIC0gQW5kaSBLbGVlbi4gVXNlIGludGVyZmFjZSBsaXN0IHByaW1pdGl2ZXMuCisgKgkgICAgMjAwMDEwMDggLSBCZXJuZCBFY2tlbmZlbHMsIFBhdGNoIGZyb20gUkggZm9yIHNldHRpbmcgbXR1CisgKgkJCShkZWZhdWx0IEFGIHdhcyB3cm9uZykKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpZmRlZiBIQVZFX05FVF9FVEhFUk5FVF9ICisjIGluY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0lCCisvKiAjaW5jbHVkZSA8bGludXgvaWZfaW5maW5pYmFuZC5oPiAqLworIyB1bmRlZiBJTkZJTklCQU5EX0FMRU4KKyMgZGVmaW5lIElORklOSUJBTkRfQUxFTiAyMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisjIGRlZmluZSBIQVZFX0FGSU5FVDYgMQorI2Vsc2UKKyMgdW5kZWYgSEFWRV9BRklORVQ2CisjZW5kaWYKKworI2RlZmluZSBfUEFUSF9QUk9DTkVUX0RFViAgICAgICAgICAgICAgICIvcHJvYy9uZXQvZGV2IgorI2RlZmluZSBfUEFUSF9QUk9DTkVUX0lGSU5FVDYgICAgICAgICAgICIvcHJvYy9uZXQvaWZfaW5ldDYiCisKKyNpZmRlZiBIQVZFX0FGSU5FVDYKKyMgaWZuZGVmIF9MSU5VWF9JTjZfSAorLyoKKyAqIFRoaXMgaXMgZnJvbSBsaW51eC9pbmNsdWRlL25ldC9pcHY2LmgKKyAqLworc3RydWN0IGluNl9pZnJlcSB7CisJc3RydWN0IGluNl9hZGRyIGlmcjZfYWRkcjsKKwl1aW50MzJfdCBpZnI2X3ByZWZpeGxlbjsKKwl1bnNpZ25lZCBpbnQgaWZyNl9pZmluZGV4OworfTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBIQVZFX0FGSU5FVDYgKi8KKworLyogRGVmaW5lcyBmb3IgZ2xpYmMyLjAgdXNlcnMuICovCisjaWZuZGVmIFNJT0NTSUZUWFFMRU4KKyMgZGVmaW5lIFNJT0NTSUZUWFFMRU4gICAgICAweDg5NDMKKyMgZGVmaW5lIFNJT0NHSUZUWFFMRU4gICAgICAweDg5NDIKKyNlbmRpZgorCisvKiBpZnJfcWxlbiBpcyBpZnJ1X2l2YWx1ZSwgYnV0IGl0IGlzbid0IHByZXNlbnQgaW4gMi4wIGtlcm5lbCBoZWFkZXJzICovCisjaWZuZGVmIGlmcl9xbGVuCisjIGRlZmluZSBpZnJfcWxlbiAgICAgICAgaWZyX2lmcnUuaWZydV9tdHUKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVFhRVUVVRUxFTgorIyBkZWZpbmUgSEFWRV9UWFFVRVVFTEVOIDEKKyNlbmRpZgorCisjaWZuZGVmIElGRl9EWU5BTUlDCisjIGRlZmluZSBJRkZfRFlOQU1JQyAgICAgMHg4MDAwIC8qIGRpYWx1cCBkZXZpY2Ugd2l0aCBjaGFuZ2luZyBhZGRyZXNzZXMgKi8KKyNlbmRpZgorCisvKiBEaXNwbGF5IGFuIEludGVybmV0IHNvY2tldCBhZGRyZXNzLiAqLworc3RhdGljIGNvbnN0IGNoYXIqIEZBU1RfRlVOQyBJTkVUX3NwcmludChzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgaW50IG51bWVyaWMpCit7CisJc3RhdGljIGNoYXIgKmJ1ZmY7IC8qIGRlZmF1bHRzIHRvIE5VTEwgKi8KKworCWZyZWUoYnVmZik7CisJaWYgKHNhcC0+c2FfZmFtaWx5ID09IDB4RkZGRiB8fCBzYXAtPnNhX2ZhbWlseSA9PSAwKQorCQlyZXR1cm4gIltOT05FIFNFVF0iOworCWJ1ZmYgPSBJTkVUX3JyZXNvbHZlKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2FwLCBudW1lcmljLCAweGZmZmZmZjAwKTsKKwlyZXR1cm4gYnVmZjsKK30KKworI2lmZGVmIFVOVVNFRF9BTkRfQlVHR1kKK3N0YXRpYyBpbnQgSU5FVF9nZXRzb2NrKGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNoYXIgKnNwID0gYnVmcCwgKmJwOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIHZhbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNvY2tfaW47CisKKwlzb2NrX2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYXA7CisJc29ja19pbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc29ja19pbi0+c2luX3BvcnQgPSAwOworCisJdmFsID0gMDsKKwlicCA9IChjaGFyICopICZ2YWw7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2NrX2luLT5zaW5fYWRkci5zX2FkZHIpOyBpKyspIHsKKwkJKnNwID0gdG91cHBlcigqc3ApOworCisJCWlmICgodW5zaWduZWQpKCpzcCAtICdBJykgPD0gNSkKKwkJCWJwW2ldIHw9IChpbnQpICgqc3AgLSAoJ0EnIC0gMTApKTsKKwkJZWxzZSBpZiAoaXNkaWdpdCgqc3ApKQorCQkJYnBbaV0gfD0gKGludCkgKCpzcCAtICcwJyk7CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKworCQlicFtpXSA8PD0gNDsKKwkJc3ArKzsKKwkJKnNwID0gdG91cHBlcigqc3ApOworCisJCWlmICgodW5zaWduZWQpKCpzcCAtICdBJykgPD0gNSkKKwkJCWJwW2ldIHw9IChpbnQpICgqc3AgLSAoJ0EnIC0gMTApKTsKKwkJZWxzZSBpZiAoaXNkaWdpdCgqc3ApKQorCQkJYnBbaV0gfD0gKGludCkgKCpzcCAtICcwJyk7CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKworCQlzcCsrOworCX0KKwlzb2NrX2luLT5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCh2YWwpOworCisJcmV0dXJuIChzcCAtIGJ1ZnApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIElORVRfaW5wdXQoLyppbnQgdHlwZSwqLyBjb25zdCBjaGFyICpidWZwLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlyZXR1cm4gSU5FVF9yZXNvbHZlKGJ1ZnAsIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2FwLCAwKTsKKy8qCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gKElORVRfZ2V0c29jayhidWZwLCBzYXApKTsKKwljYXNlIDI1NjoKKwkJcmV0dXJuIChJTkVUX3Jlc29sdmUoYnVmcCwgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYXAsIDEpKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKElORVRfcmVzb2x2ZShidWZwLCAoc3RydWN0IHNvY2thZGRyX2luICopIHNhcCwgMCkpOworCX0KKyovCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZ0eXBlIGluZXRfYWZ0eXBlID0geworCS5uYW1lICAgPSAiaW5ldCIsCisJLnRpdGxlICA9ICJEQVJQQSBJbnRlcm5ldCIsCisJLmFmICAgICA9IEFGX0lORVQsCisJLmFsZW4gICA9IDQsCisJLnNwcmludCA9IElORVRfc3ByaW50LAorCS5pbnB1dCAgPSBJTkVUX2lucHV0LAorfTsKKworI2lmZGVmIEhBVkVfQUZJTkVUNgorCisvKiBEaXNwbGF5IGFuIEludGVybmV0IHNvY2tldCBhZGRyZXNzLiAqLworLyogZGlydHkhIHN0cnVjdCBzb2NrYWRkciB1c3VhbGx5IGRvZXNuJ3Qgc3VmZmVyIGZvciBpbmV0NiBhZGRyZXNzZXMsIGZzdC4gKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBGQVNUX0ZVTkMgSU5FVDZfc3ByaW50KHN0cnVjdCBzb2NrYWRkciAqc2FwLCBpbnQgbnVtZXJpYykKK3sKKwlzdGF0aWMgY2hhciAqYnVmZjsKKworCWZyZWUoYnVmZik7CisJaWYgKHNhcC0+c2FfZmFtaWx5ID09IDB4RkZGRiB8fCBzYXAtPnNhX2ZhbWlseSA9PSAwKQorCQlyZXR1cm4gIltOT05FIFNFVF0iOworCWJ1ZmYgPSBJTkVUNl9ycmVzb2x2ZSgoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYXAsIG51bWVyaWMpOworCXJldHVybiBidWZmOworfQorCisjaWZkZWYgVU5VU0VECitzdGF0aWMgaW50IElORVQ2X2dldHNvY2soY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKworCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYXA7CisJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwlzaW42LT5zaW42X3BvcnQgPSAwOworCisJaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgYnVmcCwgc2luNi0+c2luNl9hZGRyLnM2X2FkZHIpIDw9IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAxNjsJCQkvKiA/OykgKi8KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBJTkVUNl9pbnB1dCgvKmludCB0eXBlLCovIGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXJldHVybiBJTkVUNl9yZXNvbHZlKGJ1ZnAsIChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHNhcCk7CisvKgorCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMToKKwkJcmV0dXJuIChJTkVUNl9nZXRzb2NrKGJ1ZnAsIHNhcCkpOworCWRlZmF1bHQ6CisJCXJldHVybiAoSU5FVDZfcmVzb2x2ZShidWZwLCAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYXApKTsKKwl9CisqLworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmdHlwZSBpbmV0Nl9hZnR5cGUgPSB7CisJLm5hbWUgICA9ICJpbmV0NiIsCisJLnRpdGxlICA9ICJJUHY2IiwKKwkuYWYgICAgID0gQUZfSU5FVDYsCisJLmFsZW4gICA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAorCS5zcHJpbnQgPSBJTkVUNl9zcHJpbnQsCisJLmlucHV0ICA9IElORVQ2X2lucHV0LAorfTsKKworI2VuZGlmIC8qIEhBVkVfQUZJTkVUNiAqLworCisvKiBEaXNwbGF5IGFuIFVOU1BFQyBhZGRyZXNzLiAqLworc3RhdGljIGNoYXIqIEZBU1RfRlVOQyBVTlNQRUNfcHJpbnQodW5zaWduZWQgY2hhciAqcHRyKQoreworCXN0YXRpYyBjaGFyICpidWZmOworCisJY2hhciAqcG9zOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFidWZmKQorCQlidWZmID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIDMgKyAxKTsKKwlwb3MgPSBidWZmOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsgaSsrKSB7CisJCS8qIGNhcmVmdWwgLS0gbm90IGV2ZXJ5IGxpYmMncyBzcHJpbnRmIHJldHVybnMgIyBieXRlcyB3cml0dGVuICovCisJCXNwcmludGYocG9zLCAiJTAyWC0iLCAoKnB0cisrICYgMDM3NykpOworCQlwb3MgKz0gMzsKKwl9CisJLyogRXJhc2UgdHJhaWxpbmcgIi0iLiAgV29ya3MgYXMgbG9uZyBhcyBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAhPSAwICovCisJKi0tcG9zID0gJ1wwJzsKKwlyZXR1cm4gYnVmZjsKK30KKworLyogRGlzcGxheSBhbiBVTlNQRUMgc29ja2V0IGFkZHJlc3MuICovCitzdGF0aWMgY29uc3QgY2hhciogRkFTVF9GVU5DIFVOU1BFQ19zcHJpbnQoc3RydWN0IHNvY2thZGRyICpzYXAsIGludCBudW1lcmljIFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAoc2FwLT5zYV9mYW1pbHkgPT0gMHhGRkZGIHx8IHNhcC0+c2FfZmFtaWx5ID09IDApCisJCXJldHVybiAiW05PTkUgU0VUXSI7CisJcmV0dXJuIFVOU1BFQ19wcmludCgodW5zaWduZWQgY2hhciAqKXNhcC0+c2FfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZ0eXBlIHVuc3BlY19hZnR5cGUgPSB7CisJLm5hbWUgICA9ICJ1bnNwZWMiLAorCS50aXRsZSAgPSAiVU5TUEVDIiwKKwkuYWYgICAgID0gQUZfVU5TUEVDLAorCS5hbGVuICAgPSAwLAorCS5wcmludCAgPSBVTlNQRUNfcHJpbnQsCisJLnNwcmludCA9IFVOU1BFQ19zcHJpbnQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmdHlwZSAqY29uc3QgYWZ0eXBlc1tdID0geworCSZpbmV0X2FmdHlwZSwKKyNpZmRlZiBIQVZFX0FGSU5FVDYKKwkmaW5ldDZfYWZ0eXBlLAorI2VuZGlmCisJJnVuc3BlY19hZnR5cGUsCisJTlVMTAorfTsKKworLyogQ2hlY2sgb3VyIHByb3RvY29sIGZhbWlseSB0YWJsZSBmb3IgdGhpcyBmYW1pbHkuICovCitjb25zdCBzdHJ1Y3QgYWZ0eXBlKiBGQVNUX0ZVTkMgZ2V0X2FmdHlwZShjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IHN0cnVjdCBhZnR5cGUgKmNvbnN0ICphZnA7CisKKwlhZnAgPSBhZnR5cGVzOworCXdoaWxlICgqYWZwICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJjbXAoKCphZnApLT5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiAoKmFmcCk7CisJCWFmcCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2hlY2sgb3VyIHByb3RvY29sIGZhbWlseSB0YWJsZSBmb3IgdGhpcyBmYW1pbHkuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmdHlwZSAqZ2V0X2FmbnR5cGUoaW50IGFmKQoreworCWNvbnN0IHN0cnVjdCBhZnR5cGUgKmNvbnN0ICphZnA7CisKKwlhZnAgPSBhZnR5cGVzOworCXdoaWxlICgqYWZwICE9IE5VTEwpIHsKKwkJaWYgKCgqYWZwKS0+YWYgPT0gYWYpCisJCQlyZXR1cm4gKmFmcDsKKwkJYWZwKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgdXNlcl9uZXRfZGV2aWNlX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcnhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyB0eF9wYWNrZXRzOwkvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkICAgICovCisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X2J5dGVzOwkvKiB0b3RhbCBieXRlcyByZWNlaXZlZCAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyBsb25nIHR4X2J5dGVzOwkvKiB0b3RhbCBieXRlcyB0cmFuc21pdHRlZCAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CS8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfZHJvcHBlZDsJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycyAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZDsJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4ICAqLworCXVuc2lnbmVkIGxvbmcgcnhfbXVsdGljYXN0OwkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZCAgICovCisJdW5zaWduZWQgbG9uZyByeF9jb21wcmVzc2VkOworCXVuc2lnbmVkIGxvbmcgdHhfY29tcHJlc3NlZDsKKwl1bnNpZ25lZCBsb25nIGNvbGxpc2lvbnM7CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJdW5zaWduZWQgbG9uZyByeF9sZW5ndGhfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcgcnhfb3Zlcl9lcnJvcnM7CS8qIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdyAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2NyY19lcnJvcnM7CS8qIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IgICAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2ZyYW1lX2Vycm9yczsJLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworCXVuc2lnbmVkIGxvbmcgcnhfZmlmb19lcnJvcnM7CS8qIHJlY3YnciBmaWZvIG92ZXJydW4gICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X21pc3NlZF9lcnJvcnM7CS8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQgICAgICovCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJdW5zaWduZWQgbG9uZyB0eF9hYm9ydGVkX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIHR4X2NhcnJpZXJfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcgdHhfZmlmb19lcnJvcnM7CisJdW5zaWduZWQgbG9uZyB0eF9oZWFydGJlYXRfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcgdHhfd2luZG93X2Vycm9yczsKK307CisKK3N0cnVjdCBpbnRlcmZhY2UgeworCXN0cnVjdCBpbnRlcmZhY2UgKm5leHQsICpwcmV2OworCWNoYXIgbmFtZVtJRk5BTVNJWl07ICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgbmFtZSAgICAgICAgKi8KKwlzaG9ydCB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdHlwZSAgICAgICAgICAgICAgICovCisJc2hvcnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgZmxhZ3MgICAgICAgICAqLworCWludCBtZXRyaWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByb3V0aW5nIG1ldHJpYyAgICAgICAgKi8KKwlpbnQgbXR1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTVRVIHZhbHVlICAgICAgICAgICAgICovCisJaW50IHR4X3F1ZXVlX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyYW5zbWl0IHF1ZXVlIGxlbmd0aCAqLworCXN0cnVjdCBpZm1hcCBtYXA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXJkd2FyZSBzZXR1cCAgICAgICAgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsgICAgICAgICAgICAgICAgICAgLyogSVAgYWRkcmVzcyAgICAgICAgICAgICovCisJc3RydWN0IHNvY2thZGRyIGRzdGFkZHI7ICAgICAgICAgICAgICAgIC8qIFAtUCBJUCBhZGRyZXNzICAgICAgICAqLworCXN0cnVjdCBzb2NrYWRkciBicm9hZGFkZHI7ICAgICAgICAgICAgICAvKiBJUCBicm9hZGNhc3QgYWRkcmVzcyAgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgbmV0bWFzazsgICAgICAgICAgICAgICAgLyogSVAgbmV0d29yayBtYXNrICAgICAgICovCisJaW50IGhhc19pcDsKKwljaGFyIGh3YWRkclszMl07ICAgICAgICAgICAgICAgICAgICAgICAgLyogSFcgYWRkcmVzcyAgICAgICAgICAgICovCisJaW50IHN0YXRpc3RpY3NfdmFsaWQ7CisJc3RydWN0IHVzZXJfbmV0X2RldmljZV9zdGF0cyBzdGF0czsgICAgIC8qIHN0YXRpc3RpY3MgICAgICAgICAgICAqLworCWludCBrZWVwYWxpdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBrZWVwYWxpdmUgdmFsdWUgZm9yIFNMSVAgKi8KKwlpbnQgb3V0ZmlsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ZmlsbCB2YWx1ZSBmb3IgU0xJUCAqLworfTsKKworCitzbWFsbGludCBpbnRlcmZhY2Vfb3B0X2E7CS8qIHNob3cgYWxsIGludGVyZmFjZXMgKi8KKworc3RhdGljIHN0cnVjdCBpbnRlcmZhY2UgKmludF9saXN0LCAqaW50X2xhc3Q7CisKKworI2lmIDAKKy8qIGxpa2Ugc3RyY21wKCksIGJ1dCBrbm93cyBhYm91dCBudW1iZXJzICovCitleGNlcHQgdGhhdCB0aGUgZnJlc2hseSBhZGRlZCBjYWxscyB0byB4YXRvdWwoKSBicmYgb24gZXRoZXJuZXQgYWxpYXNlcyB3aXRoCit1Q2xpYmMgd2l0aCBlLmcuOiBpZmUtPm5hbWU9J2xvJyAgbmFtZT0nZXRoMDoxJworc3RhdGljIGludCBuc3RyY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisJY29uc3QgY2hhciAqYV9wdHIgPSBhOworCWNvbnN0IGNoYXIgKmJfcHRyID0gYjsKKworCXdoaWxlICgqYSA9PSAqYikgeworCQlpZiAoKmEgPT0gJ1wwJykgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFpc2RpZ2l0KCphKSAmJiBpc2RpZ2l0KCooYSsxKSkpIHsKKwkJCWFfcHRyID0gYSsxOworCQkJYl9wdHIgPSBiKzE7CisJCX0KKwkJYSsrOworCQliKys7CisJfQorCisJaWYgKGlzZGlnaXQoKmEpICYmIGlzZGlnaXQoKmIpKSB7CisJCXJldHVybiB4YXRvdWwoYV9wdHIpID4geGF0b3VsKGJfcHRyKSA/IDEgOiAtMTsKKwl9CisJcmV0dXJuICphIC0gKmI7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpbnRlcmZhY2UgKmFkZF9pbnRlcmZhY2UoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW50ZXJmYWNlICppZmUsICoqbmV4dHAsICpuZXc7CisKKwlmb3IgKGlmZSA9IGludF9sYXN0OyBpZmU7IGlmZSA9IGlmZS0+cHJldikgeworCQlpbnQgbiA9IC8qbiovc3RyY21wKGlmZS0+bmFtZSwgbmFtZSk7CisKKwkJaWYgKG4gPT0gMCkKKwkJCXJldHVybiBpZmU7CisJCWlmIChuIDwgMCkKKwkJCWJyZWFrOworCX0KKworCW5ldyA9IHh6YWxsb2Moc2l6ZW9mKCpuZXcpKTsKKwlzdHJuY3B5X0lGTkFNU0laKG5ldy0+bmFtZSwgbmFtZSk7CisJbmV4dHAgPSBpZmUgPyAmaWZlLT5uZXh0IDogJmludF9saXN0OworCW5ldy0+cHJldiA9IGlmZTsKKwluZXctPm5leHQgPSAqbmV4dHA7CisJaWYgKG5ldy0+bmV4dCkKKwkJbmV3LT5uZXh0LT5wcmV2ID0gbmV3OworCWVsc2UKKwkJaW50X2xhc3QgPSBuZXc7CisJKm5leHRwID0gbmV3OworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfbmFtZShjaGFyICpuYW1lLCBjaGFyICpwKQoreworCS8qIEV4dHJhY3QgPG5hbWU+IGZyb20gbnVsLXRlcm1pbmF0ZWQgcCB3aGVyZSBwIG1hdGNoZXMKKwkgKiA8bmFtZT46IGFmdGVyIGxlYWRpbmcgd2hpdGVzcGFjZS4KKwkgKiBJZiBtYXRjaCBpcyBub3QgbWFkZSwgc2V0IG5hbWUgZW1wdHkgYW5kIHJldHVybiB1bmNoYW5nZWQgcAorCSAqLworCWNoYXIgKm5hbWVlbmQ7CisJY2hhciAqbmFtZXN0YXJ0ID0gc2tpcF93aGl0ZXNwYWNlKHApOworCisJbmFtZWVuZCA9IG5hbWVzdGFydDsKKwl3aGlsZSAoKm5hbWVlbmQgJiYgKm5hbWVlbmQgIT0gJzonICYmICFpc3NwYWNlKCpuYW1lZW5kKSkKKwkJbmFtZWVuZCsrOworCWlmICgqbmFtZWVuZCA9PSAnOicpIHsKKwkJaWYgKChuYW1lZW5kIC0gbmFtZXN0YXJ0KSA8IElGTkFNU0laKSB7CisJCQltZW1jcHkobmFtZSwgbmFtZXN0YXJ0LCBuYW1lZW5kIC0gbmFtZXN0YXJ0KTsKKwkJCW5hbWVbbmFtZWVuZCAtIG5hbWVzdGFydF0gPSAnXDAnOworCQkJcCA9IG5hbWVlbmQ7CisJCX0gZWxzZSB7CisJCQkvKiBJbnRlcmZhY2UgbmFtZSB0b28gbGFyZ2UgKi8KKwkJCW5hbWVbMF0gPSAnXDAnOworCQl9CisJfSBlbHNlIHsKKwkJLyogdHJhaWxpbmcgJzonIG5vdCBmb3VuZCAtIHJldHVybiBlbXB0eSAqLworCQluYW1lWzBdID0gJ1wwJzsKKwl9CisJcmV0dXJuIHAgKyAxOworfQorCisvKiBJZiBzY2FuZiBzdXBwb3J0cyBzaXplIHF1YWxpZmllcnMgZm9yICVuIGNvbnZlcnNpb25zLCB0aGVuIHdlIGNhbgorICogdXNlIGEgbW9kaWZpZWQgZm10IHRoYXQgc2ltcGx5IHN0b3JlcyB0aGUgcG9zaXRpb24gaW4gdGhlIGZpZWxkcworICogaGF2aW5nIG5vIGFzc29jaWF0ZWQgZmllbGRzIGluIHRoZSBwcm9jIHN0cmluZy4gIE9mIGNvdXJzZSwgd2UgbmVlZAorICogdG8gemVybyB0aGVtIGFnYWluIHdoZW4gd2UncmUgZG9uZS4gIEJ1dCB0aGF0IGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAqIG9sZCBhcHByb2FjaCBvZiBtdWx0aXBsZSBzY2FuZiBvY2N1cnJlbmNlcyB3aXRoIGxhcmdlIG51bWJlcnMgb2YKKyAqIGFyZ3MuICovCisKKy8qIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzc19mbXRbXSA9IHsgKi8KKy8qCSIlbGxuJWxsdSVsdSVsdSVsdSVsdSVsbiVsbiVsbG4lbGx1JWx1JWx1JWx1JWx1JWx1IiwgKi8KKy8qCSIlbGx1JWxsdSVsdSVsdSVsdSVsdSVsbiVsbiVsbHUlbGx1JWx1JWx1JWx1JWx1JWx1IiwgKi8KKy8qCSIlbGx1JWxsdSVsdSVsdSVsdSVsdSVsdSVsdSVsbHUlbGx1JWx1JWx1JWx1JWx1JWx1JWx1IiAqLworLyogfTsgKi8KKworCS8qIExpZSBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgaW50IHBvaW50ZWQgdG8gZm9yICVuLiAqLworI2lmIElOVF9NQVggPT0gTE9OR19NQVgKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzc19mbXRbXSA9IHsKKwkiJW4lbGx1JXUldSV1JXUlbiVuJW4lbGx1JXUldSV1JXUldSIsCisJIiVsbHUlbGx1JXUldSV1JXUlbiVuJWxsdSVsbHUldSV1JXUldSV1IiwKKwkiJWxsdSVsbHUldSV1JXUldSV1JXUlbGx1JWxsdSV1JXUldSV1JXUldSIKK307CisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNzX2ZtdFtdID0geworCSIlbiVsbHUlbHUlbHUlbHUlbHUlbiVuJW4lbGx1JWx1JWx1JWx1JWx1JWx1IiwKKwkiJWxsdSVsbHUlbHUlbHUlbHUlbHUlbiVuJWxsdSVsbHUlbHUlbHUlbHUlbHUlbHUiLAorCSIlbGx1JWxsdSVsdSVsdSVsdSVsdSVsdSVsdSVsbHUlbGx1JWx1JWx1JWx1JWx1JWx1JWx1IgorfTsKKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdldF9kZXZfZmllbGRzKGNoYXIgKmJwLCBzdHJ1Y3QgaW50ZXJmYWNlICppZmUsIGludCBwcm9jbmV0ZGV2X3ZzbikKK3sKKwltZW1zZXQoJmlmZS0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgdXNlcl9uZXRfZGV2aWNlX3N0YXRzKSk7CisKKwlzc2NhbmYoYnAsIHNzX2ZtdFtwcm9jbmV0ZGV2X3Zzbl0sCisJCSAgICZpZmUtPnN0YXRzLnJ4X2J5dGVzLCAvKiBtaXNzaW5nIGZvciAwICovCisJCSAgICZpZmUtPnN0YXRzLnJ4X3BhY2tldHMsCisJCSAgICZpZmUtPnN0YXRzLnJ4X2Vycm9ycywKKwkJICAgJmlmZS0+c3RhdHMucnhfZHJvcHBlZCwKKwkJICAgJmlmZS0+c3RhdHMucnhfZmlmb19lcnJvcnMsCisJCSAgICZpZmUtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycywKKwkJICAgJmlmZS0+c3RhdHMucnhfY29tcHJlc3NlZCwgLyogbWlzc2luZyBmb3IgPD0gMSAqLworCQkgICAmaWZlLT5zdGF0cy5yeF9tdWx0aWNhc3QsIC8qIG1pc3NpbmcgZm9yIDw9IDEgKi8KKwkJICAgJmlmZS0+c3RhdHMudHhfYnl0ZXMsIC8qIG1pc3NpbmcgZm9yIDAgKi8KKwkJICAgJmlmZS0+c3RhdHMudHhfcGFja2V0cywKKwkJICAgJmlmZS0+c3RhdHMudHhfZXJyb3JzLAorCQkgICAmaWZlLT5zdGF0cy50eF9kcm9wcGVkLAorCQkgICAmaWZlLT5zdGF0cy50eF9maWZvX2Vycm9ycywKKwkJICAgJmlmZS0+c3RhdHMuY29sbGlzaW9ucywKKwkJICAgJmlmZS0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMsCisJCSAgICZpZmUtPnN0YXRzLnR4X2NvbXByZXNzZWQgLyogbWlzc2luZyBmb3IgPD0gMSAqLworCQkgICApOworCisJaWYgKHByb2NuZXRkZXZfdnNuIDw9IDEpIHsKKwkJaWYgKHByb2NuZXRkZXZfdnNuID09IDApIHsKKwkJCWlmZS0+c3RhdHMucnhfYnl0ZXMgPSAwOworCQkJaWZlLT5zdGF0cy50eF9ieXRlcyA9IDA7CisJCX0KKwkJaWZlLT5zdGF0cy5yeF9tdWx0aWNhc3QgPSAwOworCQlpZmUtPnN0YXRzLnJ4X2NvbXByZXNzZWQgPSAwOworCQlpZmUtPnN0YXRzLnR4X2NvbXByZXNzZWQgPSAwOworCX0KK30KKworc3RhdGljIGludCBwcm9jbmV0ZGV2X3ZlcnNpb24oY2hhciAqYnVmKQoreworCWlmIChzdHJzdHIoYnVmLCAiY29tcHJlc3NlZCIpKQorCQlyZXR1cm4gMjsKKwlpZiAoc3Ryc3RyKGJ1ZiwgImJ5dGVzIikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlmX3JlYWRjb25mKHZvaWQpCit7CisJaW50IG51bXJlcXMgPSAzMDsKKwlzdHJ1Y3QgaWZjb25mIGlmYzsKKwlzdHJ1Y3QgaWZyZXEgKmlmcjsKKwlpbnQgbiwgZXJyID0gLTE7CisJaW50IHNrZmQ7CisKKwlpZmMuaWZjX2J1ZiA9IE5VTEw7CisKKwkvKiBTSU9DR0lGQ09ORiBjdXJyZW50bHkgc2VlbXMgdG8gb25seSB3b3JrIHByb3Blcmx5IG9uIEFGX0lORVQgc29ja2V0cworCSAgIChhcyBvZiAyLjEuMTI4KSAqLworCXNrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHNrZmQgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coImVycm9yOiBubyBpbmV0IHNvY2tldCBhdmFpbGFibGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoOzspIHsKKwkJaWZjLmlmY19sZW4gPSBzaXplb2Yoc3RydWN0IGlmcmVxKSAqIG51bXJlcXM7CisJCWlmYy5pZmNfYnVmID0geHJlYWxsb2MoaWZjLmlmY19idWYsIGlmYy5pZmNfbGVuKTsKKworCQlpZiAoaW9jdGxfb3Jfd2Fybihza2ZkLCBTSU9DR0lGQ09ORiwgJmlmYykgPCAwKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoaWZjLmlmY19sZW4gPT0gKGludCkoc2l6ZW9mKHN0cnVjdCBpZnJlcSkgKiBudW1yZXFzKSkgeworCQkJLyogYXNzdW1lIGl0IG92ZXJmbG93ZWQgYW5kIHRyeSBhZ2FpbiAqLworCQkJbnVtcmVxcyArPSAxMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKworCWlmciA9IGlmYy5pZmNfcmVxOworCWZvciAobiA9IDA7IG4gPCBpZmMuaWZjX2xlbjsgbiArPSBzaXplb2Yoc3RydWN0IGlmcmVxKSkgeworCQlhZGRfaW50ZXJmYWNlKGlmci0+aWZyX25hbWUpOworCQlpZnIrKzsKKwl9CisJZXJyID0gMDsKKworIG91dDoKKwljbG9zZShza2ZkKTsKKwlmcmVlKGlmYy5pZmNfYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlmX3JlYWRsaXN0X3Byb2MoY2hhciAqdGFyZ2V0KQoreworCXN0YXRpYyBzbWFsbGludCBwcm9jX3JlYWQ7CisKKwlGSUxFICpmaDsKKwljaGFyIGJ1Zls1MTJdOworCXN0cnVjdCBpbnRlcmZhY2UgKmlmZTsKKwlpbnQgZXJyLCBwcm9jbmV0ZGV2X3ZzbjsKKworCWlmIChwcm9jX3JlYWQpCisJCXJldHVybiAwOworCWlmICghdGFyZ2V0KQorCQlwcm9jX3JlYWQgPSAxOworCisJZmggPSBmb3Blbl9vcl93YXJuKF9QQVRIX1BST0NORVRfREVWLCAiciIpOworCWlmICghZmgpIHsKKwkJcmV0dXJuIGlmX3JlYWRjb25mKCk7CisJfQorCWZnZXRzKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZmgpOwkvKiBlYXQgbGluZSAqLworCWZnZXRzKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZmgpOworCisJcHJvY25ldGRldl92c24gPSBwcm9jbmV0ZGV2X3ZlcnNpb24oYnVmKTsKKworCWVyciA9IDA7CisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZmgpKSB7CisJCWNoYXIgKnMsIG5hbWVbMTI4XTsKKworCQlzID0gZ2V0X25hbWUobmFtZSwgYnVmKTsKKwkJaWZlID0gYWRkX2ludGVyZmFjZShuYW1lKTsKKwkJZ2V0X2Rldl9maWVsZHMocywgaWZlLCBwcm9jbmV0ZGV2X3Zzbik7CisJCWlmZS0+c3RhdGlzdGljc192YWxpZCA9IDE7CisJCWlmICh0YXJnZXQgJiYgIXN0cmNtcCh0YXJnZXQsIG5hbWUpKQorCQkJYnJlYWs7CisJfQorCWlmIChmZXJyb3IoZmgpKSB7CisJCWJiX3BlcnJvcl9tc2coX1BBVEhfUFJPQ05FVF9ERVYpOworCQllcnIgPSAtMTsKKwkJcHJvY19yZWFkID0gMDsKKwl9CisJZmNsb3NlKGZoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlmX3JlYWRsaXN0KHZvaWQpCit7CisJaW50IGVyciA9IGlmX3JlYWRsaXN0X3Byb2MoTlVMTCk7CisJLyogTmVlZGVkIGluIG9yZGVyIHRvIGdldCBldGhOOk0gYWxpYXNlcyAqLworCWlmICghZXJyKQorCQllcnIgPSBpZl9yZWFkY29uZigpOworCXJldHVybiBlcnI7Cit9CisKKy8qIEZldGNoIHRoZSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBrZXJuZWwuICovCitzdGF0aWMgaW50IGlmX2ZldGNoKHN0cnVjdCBpbnRlcmZhY2UgKmlmZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWNoYXIgKmlmbmFtZSA9IGlmZS0+bmFtZTsKKwlpbnQgc2tmZDsKKworCXNrZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZGTEFHUywgJmlmcikgPCAwKSB7CisJCWNsb3NlKHNrZmQpOworCQlyZXR1cm4gLTE7CisJfQorCWlmZS0+ZmxhZ3MgPSBpZnIuaWZyX2ZsYWdzOworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJbWVtc2V0KGlmZS0+aHdhZGRyLCAwLCAzMik7CisJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZIV0FERFIsICZpZnIpID49IDApCisJCW1lbWNweShpZmUtPmh3YWRkciwgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgOCk7CisKKwlpZmUtPnR5cGUgPSBpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHk7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwlpZmUtPm1ldHJpYyA9IDA7CisJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZNRVRSSUMsICZpZnIpID49IDApCisJCWlmZS0+bWV0cmljID0gaWZyLmlmcl9tZXRyaWM7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwlpZmUtPm10dSA9IDA7CisJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZNVFUsICZpZnIpID49IDApCisJCWlmZS0+bXR1ID0gaWZyLmlmcl9tdHU7CisKKwltZW1zZXQoJmlmZS0+bWFwLCAwLCBzaXplb2Yoc3RydWN0IGlmbWFwKSk7CisjaWZkZWYgU0lPQ0dJRk1BUAorCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGTUFQLCAmaWZyKSA9PSAwKQorCQlpZmUtPm1hcCA9IGlmci5pZnJfbWFwOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RYUVVFVUVMRU4KKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwlpZmUtPnR4X3F1ZXVlX2xlbiA9IC0xOwkvKiB1bmtub3duIHZhbHVlICovCisJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZUWFFMRU4sICZpZnIpID49IDApCisJCWlmZS0+dHhfcXVldWVfbGVuID0gaWZyLmlmcl9xbGVuOworI2Vsc2UKKwlpZmUtPnR4X3F1ZXVlX2xlbiA9IC0xOwkvKiB1bmtub3duIHZhbHVlICovCisjZW5kaWYKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCWlmci5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOworCW1lbXNldCgmaWZlLT5hZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZBRERSLCAmaWZyKSA9PSAwKSB7CisJCWlmZS0+aGFzX2lwID0gMTsKKwkJaWZlLT5hZGRyID0gaWZyLmlmcl9hZGRyOworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwkJbWVtc2V0KCZpZmUtPmRzdGFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKwkJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZEU1RBRERSLCAmaWZyKSA+PSAwKQorCQkJaWZlLT5kc3RhZGRyID0gaWZyLmlmcl9kc3RhZGRyOworCisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCQltZW1zZXQoJmlmZS0+YnJvYWRhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGQlJEQUREUiwgJmlmcikgPj0gMCkKKwkJCWlmZS0+YnJvYWRhZGRyID0gaWZyLmlmcl9icm9hZGFkZHI7CisKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJCW1lbXNldCgmaWZlLT5uZXRtYXNrLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGTkVUTUFTSywgJmlmcikgPj0gMCkKKwkJCWlmZS0+bmV0bWFzayA9IGlmci5pZnJfbmV0bWFzazsKKwl9CisKKwljbG9zZShza2ZkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19pZl9mZXRjaChzdHJ1Y3QgaW50ZXJmYWNlICppZmUpCit7CisJaWYgKGlmX2ZldGNoKGlmZSkgPCAwKSB7CisJCWNvbnN0IGNoYXIgKmVycm1zZzsKKworCQlpZiAoZXJybm8gPT0gRU5PREVWKSB7CisJCQkvKiBHaXZlIGJldHRlciBlcnJvciBtZXNzYWdlIGZvciB0aGlzIGNhc2UuICovCisJCQllcnJtc2cgPSAiRGV2aWNlIG5vdCBmb3VuZCI7CisJCX0gZWxzZSB7CisJCQllcnJtc2cgPSBzdHJlcnJvcihlcnJubyk7CisJCX0KKwkJYmJfZXJyb3JfbXNnKCIlczogZXJyb3IgZmV0Y2hpbmcgaW50ZXJmYWNlIGluZm9ybWF0aW9uOiAlcyIsCisJCQkJaWZlLT5uYW1lLCBlcnJtc2cpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3dHlwZSB1bnNwZWNfaHd0eXBlID0geworCS5uYW1lID0JCSJ1bnNwZWMiLAorCS50aXRsZSA9CSJVTlNQRUMiLAorCS50eXBlID0JCS0xLAorCS5wcmludCA9CVVOU1BFQ19wcmludAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod3R5cGUgbG9vcF9od3R5cGUgPSB7CisJLm5hbWUgPQkJImxvb3AiLAorCS50aXRsZSA9CSJMb2NhbCBMb29wYmFjayIsCisJLnR5cGUgPQkJQVJQSFJEX0xPT1BCQUNLCit9OworCisvKiBEaXNwbGF5IGFuIEV0aGVybmV0IGFkZHJlc3MgaW4gcmVhZGFibGUgZm9ybWF0LiAqLworc3RhdGljIGNoYXIqIEZBU1RfRlVOQyBldGhlcl9wcmludCh1bnNpZ25lZCBjaGFyICpwdHIpCit7CisJc3RhdGljIGNoYXIgKmJ1ZmY7CisKKwlmcmVlKGJ1ZmYpOworCWJ1ZmYgPSB4YXNwcmludGYoIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKwkJCSAocHRyWzBdICYgMDM3NyksIChwdHJbMV0gJiAwMzc3KSwgKHB0clsyXSAmIDAzNzcpLAorCQkJIChwdHJbM10gJiAwMzc3KSwgKHB0cls0XSAmIDAzNzcpLCAocHRyWzVdICYgMDM3NykKKwkJKTsKKwlyZXR1cm4gYnVmZjsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgZXRoZXJfaW5wdXQoY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3dHlwZSBldGhlcl9od3R5cGUgPSB7CisJLm5hbWUgID0gImV0aGVyIiwKKwkudGl0bGUgPSAiRXRoZXJuZXQiLAorCS50eXBlICA9IEFSUEhSRF9FVEhFUiwKKwkuYWxlbiAgPSBFVEhfQUxFTiwKKwkucHJpbnQgPSBldGhlcl9wcmludCwKKwkuaW5wdXQgPSBldGhlcl9pbnB1dAorfTsKKworc3RhdGljIHVuc2lnbmVkIGhleGNoYXIyaW50KGNoYXIgYykKK3sKKwlpZiAoaXNkaWdpdChjKSkKKwkJcmV0dXJuIGMgLSAnMCc7CisJYyAmPSB+MHgyMDsgLyogYSAtPiBBICovCisJaWYgKCh1bnNpZ25lZCkoYyAtICdBJykgPD0gNSkKKwkJcmV0dXJuIGMgLSAoJ0EnIC0gMTApOworCXJldHVybiB+MFU7Cit9CisKKy8qIElucHV0IGFuIEV0aGVybmV0IGFkZHJlc3MgYW5kIGNvbnZlcnQgdG8gYmluYXJ5LiAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgZXRoZXJfaW5wdXQoY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCWNoYXIgYzsKKwlpbnQgaTsKKwl1bnNpZ25lZCB2YWw7CisKKwlzYXAtPnNhX2ZhbWlseSA9IGV0aGVyX2h3dHlwZS50eXBlOworCXB0ciA9ICh1bnNpZ25lZCBjaGFyKikgc2FwLT5zYV9kYXRhOworCisJaSA9IDA7CisJd2hpbGUgKCgqYnVmcCAhPSAnXDAnKSAmJiAoaSA8IEVUSF9BTEVOKSkgeworCQl2YWwgPSBoZXhjaGFyMmludCgqYnVmcCsrKSAqIDB4MTA7CisJCWlmICh2YWwgPiAweGZmKSB7CisJCQllcnJubyA9IEVJTlZBTDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljID0gKmJ1ZnA7CisJCWlmIChjID09ICc6JyB8fCBjID09IDApCisJCQl2YWwgPj49IDQ7CisJCWVsc2UgeworCQkJdmFsIHw9IGhleGNoYXIyaW50KGMpOworCQkJaWYgKHZhbCA+IDB4ZmYpIHsKKwkJCQllcnJubyA9IEVJTlZBTDsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGMgIT0gMCkKKwkJCWJ1ZnArKzsKKwkJKnB0cisrID0gKHVuc2lnbmVkIGNoYXIpIHZhbDsKKwkJaSsrOworCisJCS8qIFdlIG1pZ2h0IGdldCBhIHNlbWljb2xvbiBoZXJlIC0gbm90IHJlcXVpcmVkLiAqLworCQlpZiAoKmJ1ZnAgPT0gJzonKSB7CisJCQlidWZwKys7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHd0eXBlIHBwcF9od3R5cGUgPSB7CisJLm5hbWUgPQkJInBwcCIsCisJLnRpdGxlID0JIlBvaW50LXRvLVBvaW50IFByb3RvY29sIiwKKwkudHlwZSA9CQlBUlBIUkRfUFBQCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorc3RhdGljIGNvbnN0IHN0cnVjdCBod3R5cGUgc2l0X2h3dHlwZSA9IHsKKwkubmFtZSA9CQkJInNpdCIsCisJLnRpdGxlID0JCSJJUHY2LWluLUlQdjQiLAorCS50eXBlID0JCQlBUlBIUkRfU0lULAorCS5wcmludCA9CQlVTlNQRUNfcHJpbnQsCisJLnN1cHByZXNzX251bGxfYWRkciA9CTEKK307CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0lCCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3dHlwZSBpYl9od3R5cGUgPSB7CisJLm5hbWUgID0gImluZmluaWJhbmQiLAorCS50aXRsZSA9ICJJbmZpbmlCYW5kIiwKKwkudHlwZSAgPSBBUlBIUkRfSU5GSU5JQkFORCwKKwkuYWxlbiAgPSBJTkZJTklCQU5EX0FMRU4sCisJLnByaW50ID0gVU5TUEVDX3ByaW50LAorCS5pbnB1dCA9IGluX2liLAorfTsKKyNlbmRpZgorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHd0eXBlICpjb25zdCBod3R5cGVzW10gPSB7CisJJmxvb3BfaHd0eXBlLAorCSZldGhlcl9od3R5cGUsCisJJnBwcF9od3R5cGUsCisJJnVuc3BlY19od3R5cGUsCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCSZzaXRfaHd0eXBlLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFdJQgorCSZpYl9od3R5cGUsCisjZW5kaWYKKwlOVUxMCit9OworCisjaWZkZWYgSUZGX1BPUlRTRUwKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpZl9wb3J0X3RleHRbXSA9IHsKKwkvKiBLZWVwIGluIHN0ZXAgd2l0aCA8bGludXgvbmV0ZGV2aWNlLmg+ICovCisJInVua25vd24iLAorCSIxMGJhc2UyIiwKKwkiMTBiYXNlVCIsCisJIkFVSSIsCisJIjEwMGJhc2VUIiwKKwkiMTAwYmFzZVRYIiwKKwkiMTAwYmFzZUZYIiwKKwlOVUxMCit9OworI2VuZGlmCisKKy8qIENoZWNrIG91ciBoYXJkd2FyZSB0eXBlIHRhYmxlIGZvciB0aGlzIHR5cGUuICovCitjb25zdCBzdHJ1Y3QgaHd0eXBlKiBGQVNUX0ZVTkMgZ2V0X2h3dHlwZShjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IHN0cnVjdCBod3R5cGUgKmNvbnN0ICpod3A7CisKKwlod3AgPSBod3R5cGVzOworCXdoaWxlICgqaHdwICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJjbXAoKCpod3ApLT5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiAoKmh3cCk7CisJCWh3cCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2hlY2sgb3VyIGhhcmR3YXJlIHR5cGUgdGFibGUgZm9yIHRoaXMgdHlwZS4gKi8KK2NvbnN0IHN0cnVjdCBod3R5cGUqIEZBU1RfRlVOQyBnZXRfaHdudHlwZShpbnQgdHlwZSkKK3sKKwljb25zdCBzdHJ1Y3QgaHd0eXBlICpjb25zdCAqaHdwOworCisJaHdwID0gaHd0eXBlczsKKwl3aGlsZSAoKmh3cCAhPSBOVUxMKSB7CisJCWlmICgoKmh3cCktPnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiAqaHdwOworCQlod3ArKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHJldHVybiAxIGlmIGFkZHJlc3MgaXMgYWxsIHplcm9zICovCitzdGF0aWMgaW50IGh3X251bGxfYWRkcmVzcyhjb25zdCBzdHJ1Y3QgaHd0eXBlICpodywgdm9pZCAqYXApCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqYWRkcmVzcyA9ICh1bnNpZ25lZCBjaGFyICopIGFwOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5hbGVuOyBpKyspCisJCWlmIChhZGRyZXNzW2ldKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIFRSZXh0W10gQUxJR04xID0gIlwwXDBcMEtpXDBNaVwwR2lcMFRpIjsKKworc3RhdGljIHZvaWQgcHJpbnRfYnl0ZXNfc2NhbGVkKHVuc2lnbmVkIGxvbmcgbG9uZyB1bGwsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgaW50X3BhcnQ7CisJY29uc3QgY2hhciAqZXh0OworCXVuc2lnbmVkIGludCBmcmFjX3BhcnQ7CisJaW50IGk7CisKKwlmcmFjX3BhcnQgPSAwOworCWV4dCA9IFRSZXh0OworCWludF9wYXJ0ID0gdWxsOworCWkgPSA0OworCWRvIHsKKwkJaWYgKGludF9wYXJ0ID49IDEwMjQpIHsKKwkJCWZyYWNfcGFydCA9ICgoKCh1bnNpZ25lZCBpbnQpIGludF9wYXJ0KSAmICgxMDI0LTEpKSAqIDEwKSAvIDEwMjQ7CisJCQlpbnRfcGFydCAvPSAxMDI0OworCQkJZXh0ICs9IDM7CS8qIEtpQiwgTWlCLCBHaUIsIFRpQiAqLworCQl9CisJCS0taTsKKwl9IHdoaWxlIChpKTsKKworCXByaW50ZigiWCBieXRlczolbGx1ICglbGx1LiV1ICVzQiklcyIsIHVsbCwgaW50X3BhcnQsIGZyYWNfcGFydCwgZXh0LCBlbmQpOworfQorCisKKyNpZmRlZiBIQVZFX0FGSU5FVDYKKyNkZWZpbmUgSVBWNl9BRERSX0FOWSAgICAgICAgICAgMHgwMDAwVQorCisjZGVmaW5lIElQVjZfQUREUl9VTklDQVNUICAgICAgIDB4MDAwMVUKKyNkZWZpbmUgSVBWNl9BRERSX01VTFRJQ0FTVCAgICAgMHgwMDAyVQorI2RlZmluZSBJUFY2X0FERFJfQU5ZQ0FTVCAgICAgICAweDAwMDRVCisKKyNkZWZpbmUgSVBWNl9BRERSX0xPT1BCQUNLICAgICAgMHgwMDEwVQorI2RlZmluZSBJUFY2X0FERFJfTElOS0xPQ0FMICAgICAweDAwMjBVCisjZGVmaW5lIElQVjZfQUREUl9TSVRFTE9DQUwgICAgIDB4MDA0MFUKKworI2RlZmluZSBJUFY2X0FERFJfQ09NUEFUdjQgICAgICAweDAwODBVCisKKyNkZWZpbmUgSVBWNl9BRERSX1NDT1BFX01BU0sgICAgMHgwMGYwVQorCisjZGVmaW5lIElQVjZfQUREUl9NQVBQRUQgICAgICAgIDB4MTAwMFUKKyNkZWZpbmUgSVBWNl9BRERSX1JFU0VSVkVEICAgICAgMHgyMDAwVQkvKiByZXNlcnZlZCBhZGRyZXNzIHNwYWNlICovCisKKworc3RhdGljIHZvaWQgaWZlX3ByaW50NihzdHJ1Y3QgaW50ZXJmYWNlICpwdHIpCit7CisJRklMRSAqZjsKKwljaGFyIGFkZHI2WzQwXSwgZGV2bmFtZVsyMF07CisJc3RydWN0IHNvY2thZGRyX2luNiBzYXA7CisJaW50IHBsZW4sIHNjb3BlLCBkYWRfc3RhdHVzLCBpZl9pZHg7CisJY2hhciBhZGRyNnBbOF1bNV07CisKKwlmID0gZm9wZW5fZm9yX3JlYWQoX1BBVEhfUFJPQ05FVF9JRklORVQ2KTsKKwlpZiAoZiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl3aGlsZSAoZnNjYW5mCisJCSAgIChmLCAiJTRzJTRzJTRzJTRzJTRzJTRzJTRzJTRzICUwOHggJTAyeCAlMDJ4ICUwMnggJTIwc1xuIiwKKwkJCWFkZHI2cFswXSwgYWRkcjZwWzFdLCBhZGRyNnBbMl0sIGFkZHI2cFszXSwgYWRkcjZwWzRdLAorCQkJYWRkcjZwWzVdLCBhZGRyNnBbNl0sIGFkZHI2cFs3XSwgJmlmX2lkeCwgJnBsZW4sICZzY29wZSwKKwkJCSZkYWRfc3RhdHVzLCBkZXZuYW1lKSAhPSBFT0YKKwkpIHsKKwkJaWYgKCFzdHJjbXAoZGV2bmFtZSwgcHRyLT5uYW1lKSkgeworCQkJc3ByaW50ZihhZGRyNiwgIiVzOiVzOiVzOiVzOiVzOiVzOiVzOiVzIiwKKwkJCQkJYWRkcjZwWzBdLCBhZGRyNnBbMV0sIGFkZHI2cFsyXSwgYWRkcjZwWzNdLAorCQkJCQlhZGRyNnBbNF0sIGFkZHI2cFs1XSwgYWRkcjZwWzZdLCBhZGRyNnBbN10pOworCQkJaW5ldF9wdG9uKEFGX0lORVQ2LCBhZGRyNiwKKwkJCQkJICAoc3RydWN0IHNvY2thZGRyICopICZzYXAuc2luNl9hZGRyKTsKKwkJCXNhcC5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJcHJpbnRmKCIgICAgICAgICAgaW5ldDYgYWRkcjogJXMvJWQiLAorCQkJCSAgIElORVQ2X3NwcmludCgoc3RydWN0IHNvY2thZGRyICopICZzYXAsIDEpLAorCQkJCSAgIHBsZW4pOworCQkJcHJpbnRmKCIgU2NvcGU6Iik7CisJCQlzd2l0Y2ggKHNjb3BlICYgSVBWNl9BRERSX1NDT1BFX01BU0spIHsKKwkJCWNhc2UgMDoKKwkJCQlwdXRzKCJHbG9iYWwiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVBWNl9BRERSX0xJTktMT0NBTDoKKwkJCQlwdXRzKCJMaW5rIik7CisJCQkJYnJlYWs7CisJCQljYXNlIElQVjZfQUREUl9TSVRFTE9DQUw6CisJCQkJcHV0cygiU2l0ZSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFY2X0FERFJfQ09NUEFUdjQ6CisJCQkJcHV0cygiQ29tcGF0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIElQVjZfQUREUl9MT09QQkFDSzoKKwkJCQlwdXRzKCJIb3N0Iik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXB1dHMoIlVua25vd24iKTsKKwkJCX0KKwkJfQorCX0KKwlmY2xvc2UoZik7Cit9CisjZWxzZQorI2RlZmluZSBpZmVfcHJpbnQ2KGEpICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGlmZV9wcmludChzdHJ1Y3QgaW50ZXJmYWNlICpwdHIpCit7CisJY29uc3Qgc3RydWN0IGFmdHlwZSAqYXA7CisJY29uc3Qgc3RydWN0IGh3dHlwZSAqaHc7CisJaW50IGhmOworCWludCBjYW5fY29tcHJlc3MgPSAwOworCisJYXAgPSBnZXRfYWZudHlwZShwdHItPmFkZHIuc2FfZmFtaWx5KTsKKwlpZiAoYXAgPT0gTlVMTCkKKwkJYXAgPSBnZXRfYWZudHlwZSgwKTsKKworCWhmID0gcHRyLT50eXBlOworCisJaWYgKGhmID09IEFSUEhSRF9DU0xJUCB8fCBoZiA9PSBBUlBIUkRfQ1NMSVA2KQorCQljYW5fY29tcHJlc3MgPSAxOworCisJaHcgPSBnZXRfaHdudHlwZShoZik7CisJaWYgKGh3ID09IE5VTEwpCisJCWh3ID0gZ2V0X2h3bnR5cGUoLTEpOworCisJcHJpbnRmKCIlLTlzIExpbmsgZW5jYXA6JXMgICIsIHB0ci0+bmFtZSwgaHctPnRpdGxlKTsKKwkvKiBGb3Igc29tZSBoYXJkd2FyZSB0eXBlcyAoZWcgQXNoLCBBVE0pIHdlIGRvbid0IHByaW50IHRoZQorCSAgIGhhcmR3YXJlIGFkZHJlc3MgaWYgaXQncyBudWxsLiAgKi8KKwlpZiAoaHctPnByaW50ICE9IE5VTEwKKwkgJiYgIShod19udWxsX2FkZHJlc3MoaHcsIHB0ci0+aHdhZGRyKSAmJiBody0+c3VwcHJlc3NfbnVsbF9hZGRyKQorCSkgeworCQlwcmludGYoIkhXYWRkciAlcyAgIiwgaHctPnByaW50KCh1bnNpZ25lZCBjaGFyICopcHRyLT5od2FkZHIpKTsKKwl9CisjaWZkZWYgSUZGX1BPUlRTRUwKKwlpZiAocHRyLT5mbGFncyAmIElGRl9QT1JUU0VMKSB7CisJCXByaW50ZigiTWVkaWE6JXMiLCBpZl9wb3J0X3RleHRbcHRyLT5tYXAucG9ydF0gLyogWzBdICovKTsKKwkJaWYgKHB0ci0+ZmxhZ3MgJiBJRkZfQVVUT01FRElBKQorCQkJcHJpbnRmKCIoYXV0bykiKTsKKwl9CisjZW5kaWYKKwliYl9wdXRjaGFyKCdcbicpOworCisJaWYgKHB0ci0+aGFzX2lwKSB7CisJCXByaW50ZigiICAgICAgICAgICVzIGFkZHI6JXMgIiwgYXAtPm5hbWUsCisJCQkgICBhcC0+c3ByaW50KCZwdHItPmFkZHIsIDEpKTsKKwkJaWYgKHB0ci0+ZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpIHsKKwkJCXByaW50ZigiIFAtdC1QOiVzICIsIGFwLT5zcHJpbnQoJnB0ci0+ZHN0YWRkciwgMSkpOworCQl9CisJCWlmIChwdHItPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkgeworCQkJcHJpbnRmKCIgQmNhc3Q6JXMgIiwgYXAtPnNwcmludCgmcHRyLT5icm9hZGFkZHIsIDEpKTsKKwkJfQorCQlwcmludGYoIiBNYXNrOiVzXG4iLCBhcC0+c3ByaW50KCZwdHItPm5ldG1hc2ssIDEpKTsKKwl9CisKKwlpZmVfcHJpbnQ2KHB0cik7CisKKwlwcmludGYoIiAgICAgICAgICAiKTsKKwkvKiBET05UIEZPUkdFVCBUTyBBREQgVEhFIEZMQUdTIElOIGlmZV9wcmludF9zaG9ydCwgdG9vICovCisKKwlpZiAocHRyLT5mbGFncyA9PSAwKSB7CisJCXByaW50ZigiW05PIEZMQUdTXSAiKTsKKwl9IGVsc2UgeworCQlzdGF0aWMgY29uc3QgY2hhciBpZmVfcHJpbnRfZmxhZ3Nfc3Ryc1tdIEFMSUdOMSA9CisJCQkiVVBcMCIKKwkJCSJCUk9BRENBU1RcMCIKKwkJCSJERUJVR1wwIgorCQkJIkxPT1BCQUNLXDAiCisJCQkiUE9JTlRPUE9JTlRcMCIKKwkJCSJOT1RSQUlMRVJTXDAiCisJCQkiUlVOTklOR1wwIgorCQkJIk5PQVJQXDAiCisJCQkiUFJPTUlTQ1wwIgorCQkJIkFMTE1VTFRJXDAiCisJCQkiU0xBVkVcMCIKKwkJCSJNQVNURVJcMCIKKwkJCSJNVUxUSUNBU1RcMCIKKyNpZmRlZiBIQVZFX0RZTkFNSUMKKwkJCSJEWU5BTUlDXDAiCisjZW5kaWYKKwkJCTsKKwkJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGlmZV9wcmludF9mbGFnc19tYXNrW10gQUxJR04yID0geworCQkJSUZGX1VQLAorCQkJSUZGX0JST0FEQ0FTVCwKKwkJCUlGRl9ERUJVRywKKwkJCUlGRl9MT09QQkFDSywKKwkJCUlGRl9QT0lOVE9QT0lOVCwKKwkJCUlGRl9OT1RSQUlMRVJTLAorCQkJSUZGX1JVTk5JTkcsCisJCQlJRkZfTk9BUlAsCisJCQlJRkZfUFJPTUlTQywKKwkJCUlGRl9BTExNVUxUSSwKKwkJCUlGRl9TTEFWRSwKKwkJCUlGRl9NQVNURVIsCisJCQlJRkZfTVVMVElDQVNUCisjaWZkZWYgSEFWRV9EWU5BTUlDCisJCQksSUZGX0RZTkFNSUMKKyNlbmRpZgorCQl9OworCQljb25zdCB1bnNpZ25lZCBzaG9ydCAqbWFzayA9IGlmZV9wcmludF9mbGFnc19tYXNrOworCQljb25zdCBjaGFyICpzdHIgPSBpZmVfcHJpbnRfZmxhZ3Nfc3RyczsKKwkJZG8geworCQkJaWYgKHB0ci0+ZmxhZ3MgJiAqbWFzaykgeworCQkJCXByaW50ZigiJXMgIiwgc3RyKTsKKwkJCX0KKwkJCW1hc2srKzsKKwkJCXN0ciArPSBzdHJsZW4oc3RyKSArIDE7CisJCX0gd2hpbGUgKCpzdHIpOworCX0KKworCS8qIERPTlQgRk9SR0VUIFRPIEFERCBUSEUgRkxBR1MgSU4gaWZlX3ByaW50X3Nob3J0ICovCisJcHJpbnRmKCIgTVRVOiVkICBNZXRyaWM6JWQiLCBwdHItPm10dSwgcHRyLT5tZXRyaWMgPyBwdHItPm1ldHJpYyA6IDEpOworI2lmZGVmIFNJT0NTS0VFUEFMSVZFCisJaWYgKHB0ci0+b3V0ZmlsbCB8fCBwdHItPmtlZXBhbGl2ZSkKKwkJcHJpbnRmKCIgIE91dGZpbGw6JWQgIEtlZXBhbGl2ZTolZCIsIHB0ci0+b3V0ZmlsbCwgcHRyLT5rZWVwYWxpdmUpOworI2VuZGlmCisJYmJfcHV0Y2hhcignXG4nKTsKKworCS8qIElmIG5lZWRlZCwgZGlzcGxheSB0aGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MuICovCisKKwlpZiAocHRyLT5zdGF0aXN0aWNzX3ZhbGlkKSB7CisJCS8qIFhYWDogc3RhdGlzdGljcyBhcmUgY3VycmVudGx5IG9ubHkgcHJpbnRlZCBmb3IgdGhlIHByaW1hcnkgYWRkcmVzcywKKwkJICogICAgICBub3QgZm9yIHRoZSBhbGlhc2VzLCBhbHRob3VnaCBzdHJpY3RseSBzcGVha2luZyB0aGV5J3JlIHNoYXJlZAorCQkgKiAgICAgIGJ5IGFsbCBhZGRyZXNzZXMuCisJCSAqLworCQlwcmludGYoIiAgICAgICAgICAiKTsKKworCQlwcmludGYoIlJYIHBhY2tldHM6JWxsdSBlcnJvcnM6JWx1IGRyb3BwZWQ6JWx1IG92ZXJydW5zOiVsdSBmcmFtZTolbHVcbiIsCisJCQkgICBwdHItPnN0YXRzLnJ4X3BhY2tldHMsIHB0ci0+c3RhdHMucnhfZXJyb3JzLAorCQkJICAgcHRyLT5zdGF0cy5yeF9kcm9wcGVkLCBwdHItPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzLAorCQkJICAgcHRyLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMpOworCQlpZiAoY2FuX2NvbXByZXNzKQorCQkJcHJpbnRmKCIgICAgICAgICAgICAgY29tcHJlc3NlZDolbHVcbiIsCisJCQkJICAgcHRyLT5zdGF0cy5yeF9jb21wcmVzc2VkKTsKKwkJcHJpbnRmKCIgICAgICAgICAgIik7CisJCXByaW50ZigiVFggcGFja2V0czolbGx1IGVycm9yczolbHUgZHJvcHBlZDolbHUgb3ZlcnJ1bnM6JWx1IGNhcnJpZXI6JWx1XG4iLAorCQkJICAgcHRyLT5zdGF0cy50eF9wYWNrZXRzLCBwdHItPnN0YXRzLnR4X2Vycm9ycywKKwkJCSAgIHB0ci0+c3RhdHMudHhfZHJvcHBlZCwgcHRyLT5zdGF0cy50eF9maWZvX2Vycm9ycywKKwkJCSAgIHB0ci0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMpOworCQlwcmludGYoIiAgICAgICAgICBjb2xsaXNpb25zOiVsdSAiLCBwdHItPnN0YXRzLmNvbGxpc2lvbnMpOworCQlpZiAoY2FuX2NvbXByZXNzKQorCQkJcHJpbnRmKCJjb21wcmVzc2VkOiVsdSAiLCBwdHItPnN0YXRzLnR4X2NvbXByZXNzZWQpOworCQlpZiAocHRyLT50eF9xdWV1ZV9sZW4gIT0gLTEpCisJCQlwcmludGYoInR4cXVldWVsZW46JWQgIiwgcHRyLT50eF9xdWV1ZV9sZW4pOworCQlwcmludGYoIlxuICAgICAgICAgIFIiKTsKKwkJcHJpbnRfYnl0ZXNfc2NhbGVkKHB0ci0+c3RhdHMucnhfYnl0ZXMsICIgIFQiKTsKKwkJcHJpbnRfYnl0ZXNfc2NhbGVkKHB0ci0+c3RhdHMudHhfYnl0ZXMsICJcbiIpOworCX0KKworCWlmIChwdHItPm1hcC5pcnEgfHwgcHRyLT5tYXAubWVtX3N0YXJ0CisJIHx8IHB0ci0+bWFwLmRtYSB8fCBwdHItPm1hcC5iYXNlX2FkZHIKKwkpIHsKKwkJcHJpbnRmKCIgICAgICAgICAgIik7CisJCWlmIChwdHItPm1hcC5pcnEpCisJCQlwcmludGYoIkludGVycnVwdDolZCAiLCBwdHItPm1hcC5pcnEpOworCQlpZiAocHRyLT5tYXAuYmFzZV9hZGRyID49IDB4MTAwKQkvKiBPbmx5IHByaW50IGRldmljZXMgdXNpbmcgaXQgZm9yCisJCQkJCQkJCQkJCSAgIEkvTyBtYXBzICovCisJCQlwcmludGYoIkJhc2UgYWRkcmVzczoweCVseCAiLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKSBwdHItPm1hcC5iYXNlX2FkZHIpOworCQlpZiAocHRyLT5tYXAubWVtX3N0YXJ0KSB7CisJCQlwcmludGYoIk1lbW9yeTolbHgtJWx4ICIsIHB0ci0+bWFwLm1lbV9zdGFydCwKKwkJCQkgICBwdHItPm1hcC5tZW1fZW5kKTsKKwkJfQorCQlpZiAocHRyLT5tYXAuZG1hKQorCQkJcHJpbnRmKCJETUEgY2hhbjoleCAiLCBwdHItPm1hcC5kbWEpOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworfQorCitzdGF0aWMgaW50IGRvX2lmX3ByaW50KHN0cnVjdCBpbnRlcmZhY2UgKmlmZSkgLyosIGludCAqb3B0X2EpKi8KK3sKKwlpbnQgcmVzOworCisJcmVzID0gZG9faWZfZmV0Y2goaWZlKTsKKwlpZiAocmVzID49IDApIHsKKwkJaWYgKChpZmUtPmZsYWdzICYgSUZGX1VQKSB8fCBpbnRlcmZhY2Vfb3B0X2EpCisJCQlpZmVfcHJpbnQoaWZlKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlcmZhY2UgKmxvb2t1cF9pbnRlcmZhY2UoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW50ZXJmYWNlICppZmUgPSBOVUxMOworCisJaWYgKGlmX3JlYWRsaXN0X3Byb2MobmFtZSkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZmUgPSBhZGRfaW50ZXJmYWNlKG5hbWUpOworCXJldHVybiBpZmU7Cit9CisKKyNpZmRlZiBVTlVTRUQKK3N0YXRpYyBpbnQgZm9yX2FsbF9pbnRlcmZhY2VzKGludCAoKmRvaXQpIChzdHJ1Y3QgaW50ZXJmYWNlICosIHZvaWQgKiksCisJCQkJCQkJICB2b2lkICpjb29raWUpCit7CisJc3RydWN0IGludGVyZmFjZSAqaWZlOworCisJaWYgKCFpbnRfbGlzdCAmJiAoaWZfcmVhZGxpc3QoKSA8IDApKQorCQlyZXR1cm4gLTE7CisJZm9yIChpZmUgPSBpbnRfbGlzdDsgaWZlOyBpZmUgPSBpZmUtPm5leHQpIHsKKwkJaW50IGVyciA9IGRvaXQoaWZlLCBjb29raWUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogZm9yIGlwdjQgYWRkL2RlbCBtb2RlcyAqLworc3RhdGljIGludCBpZl9wcmludChjaGFyICppZm5hbWUpCit7CisJc3RydWN0IGludGVyZmFjZSAqaWZlOworCWludCByZXM7CisKKwlpZiAoIWlmbmFtZSkgeworCQkvKnJlcyA9IGZvcl9hbGxfaW50ZXJmYWNlcyhkb19pZl9wcmludCwgJmludGVyZmFjZV9vcHRfYSk7Ki8KKwkJaWYgKCFpbnRfbGlzdCAmJiAoaWZfcmVhZGxpc3QoKSA8IDApKQorCQkJcmV0dXJuIC0xOworCQlmb3IgKGlmZSA9IGludF9saXN0OyBpZmU7IGlmZSA9IGlmZS0+bmV4dCkgeworCQkJaW50IGVyciA9IGRvX2lmX3ByaW50KGlmZSk7IC8qLCAmaW50ZXJmYWNlX29wdF9hKTsqLworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZmUgPSBsb29rdXBfaW50ZXJmYWNlKGlmbmFtZSk7CisJcmVzID0gZG9faWZfZmV0Y2goaWZlKTsKKwlpZiAocmVzID49IDApCisJCWlmZV9wcmludChpZmUpOworCXJldHVybiByZXM7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0lCCisvKiBJbnB1dCBhbiBJbmZpbmliYW5kIGFkZHJlc3MgYW5kIGNvbnZlcnQgdG8gYmluYXJ5LiAqLworaW50IEZBU1RfRlVOQyBpbl9pYihjb25zdCBjaGFyICpidWZwLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlzYXAtPnNhX2ZhbWlseSA9IGliX2h3dHlwZS50eXBlOworLy9UT0RPOiBlcnJvciBjaGVjaz8KKwloZXgyYmluKChjaGFyKilzYXAtPnNhX2RhdGEsIGJ1ZnAsIElORklOSUJBTkRfQUxFTik7CisjIGlmZGVmIEhXSUJfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgImluX2liKCVzKTogJXNcbiIsIGJ1ZnAsIFVOU1BFQ19wcmludChzYXAtPnNhX2RhdGEpKTsKKyMgZW5kaWYKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIGRpc3BsYXlfaW50ZXJmYWNlcyhjaGFyICppZm5hbWUpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGlmX3ByaW50KGlmbmFtZSk7CisKKwlyZXR1cm4gKHN0YXR1cyA8IDApOyAvKiBzdGF0dXMgPCAwID09IDEgLS0gZXJyb3IgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaXAuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjJmNWUyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pcC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkyOTogcmVzb2x2ZSBhZGRyZXNzZXMKKyAqIEJlcm5oYXJkIFJldXRuZXItRmlzY2hlciByZXdyb3RlIHRvIHVzZSBpbmRleF9pbl9zdWJzdHJfYXJyYXkKKyAqLworCisvKiB3b3VsZCBuZWVkIHRvIG1ha2UgdGhlICIgfCAiIG9wdGlvbmFsIGRlcGVuZGluZyBvbiBtb3JlIHRoYW4gb25lIHNlbGVjdGVkOiAqLworLy91c2FnZTojZGVmaW5lIGlwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10geyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfQUREUkVTUygiYWRkcmVzcyB8ICIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX1JPVVRFKCJyb3V0ZSB8ICIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX0xJTksoImxpbmsgfCAiKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9UVU5ORUwoInR1bm5lbCB8ICIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX1JVTEUoInJ1bGUiKQorLy91c2FnZTogICAgICAgIn0ge0NPTU1BTkR9IgorLy91c2FnZTojZGVmaW5lIGlwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiaXAgW09QVElPTlNdIE9CSkVDVCB7Q09NTUFORH1cbiIKKy8vdXNhZ2U6ICAgICAgICJ3aGVyZSBPQkpFQ1QgOj0geyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfQUREUkVTUygiYWRkcmVzcyB8ICIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX1JPVVRFKCJyb3V0ZSB8ICIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX0xJTksoImxpbmsgfCAiKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9UVU5ORUwoInR1bm5lbCB8ICIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX1JVTEUoInJ1bGUiKQorLy91c2FnZTogICAgICAgIn1cbiIKKy8vdXNhZ2U6ICAgICAgICJPUFRJT05TIDo9IHsgLWZbYW1pbHldIHsgaW5ldCB8IGluZXQ2IHwgbGluayB9IHwgLW9bbmVsaW5lXSB9IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBpcGFkZHJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInsge2FkZHxkZWx9IElGQUREUiBkZXYgU1RSSU5HIHwge3Nob3d8Zmx1c2h9XG4iCisvL3VzYWdlOiAgICAgICAiCQlbZGV2IFNUUklOR10gW3RvIFBSRUZJWF0gfSIKKy8vdXNhZ2U6I2RlZmluZSBpcGFkZHJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJpcGFkZHIge2FkZHxkZWxldGV9IElGQUREUiBkZXYgU1RSSU5HXG4iCisvL3VzYWdlOiAgICAgICAiaXBhZGRyIHtzaG93fGZsdXNofSBbZGV2IFNUUklOR10gW3Njb3BlIFNDT1BFLUlEXVxuIgorLy91c2FnZTogICAgICAgIglbdG8gUFJFRklYXSBbbGFiZWwgUEFUVEVSTl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJSUZBRERSIDo9IFBSRUZJWCB8IEFERFIgcGVlciBQUkVGSVhcbiIKKy8vdXNhZ2U6ICAgICAgICIJW2Jyb2FkY2FzdCBBRERSXSBbYW55Y2FzdCBBRERSXVxuIgorLy91c2FnZTogICAgICAgIglbbGFiZWwgU1RSSU5HXSBbc2NvcGUgU0NPUEUtSURdXG4iCisvL3VzYWdlOiAgICAgICAiCVNDT1BFLUlEIDo9IFtob3N0IHwgbGluayB8IGdsb2JhbCB8IE5VTUJFUl0iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlwbGlua190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAieyBzZXQgREVWSUNFIHsgdXAgfCBkb3duIHwgYXJwIHsgb24gfCBvZmYgfSB8IHNob3cgW0RFVklDRV0gfSIKKy8vdXNhZ2U6I2RlZmluZSBpcGxpbmtfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJpcGxpbmsgc2V0IERFVklDRSB7IHVwIHwgZG93biB8IGFycCB8IG11bHRpY2FzdCB7IG9uIHwgb2ZmIH0gfFxuIgorLy91c2FnZTogICAgICAgIgkJCWR5bmFtaWMgeyBvbiB8IG9mZiB9IHxcbiIKKy8vdXNhZ2U6ICAgICAgICIJCQltdHUgTVRVIH1cbiIKKy8vdXNhZ2U6ICAgICAgICJpcGxpbmsgc2hvdyBbREVWSUNFXSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaXByb3V0ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAieyBsaXN0IHwgZmx1c2ggfCB7IGFkZCB8IGRlbCB8IGNoYW5nZSB8IGFwcGVuZCB8XG4iCisvL3VzYWdlOiAgICAgICAiCQlyZXBsYWNlIHwgbW9uaXRvciB9IFJPVVRFIH0iCisvL3VzYWdlOiNkZWZpbmUgaXByb3V0ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgImlwcm91dGUgeyBsaXN0IHwgZmx1c2ggfSBTRUxFQ1RPUlxuIgorLy91c2FnZTogICAgICAgImlwcm91dGUgZ2V0IEFERFJFU1MgW2Zyb20gQUREUkVTUyBpaWYgU1RSSU5HXVxuIgorLy91c2FnZTogICAgICAgIgkJCVtvaWYgU1RSSU5HXSBbdG9zIFRPU11cbiIKKy8vdXNhZ2U6ICAgICAgICJpcHJvdXRlIHsgYWRkIHwgZGVsIHwgY2hhbmdlIHwgYXBwZW5kIHwgcmVwbGFjZSB8IG1vbml0b3IgfSBST1VURVxuIgorLy91c2FnZTogICAgICAgIgkJCVNFTEVDVE9SIDo9IFtyb290IFBSRUZJWF0gW21hdGNoIFBSRUZJWF0gW3Byb3RvIFJUUFJPVE9dXG4iCisvL3VzYWdlOiAgICAgICAiCQkJUk9VVEUgOj0gW1RZUEVdIFBSRUZJWCBbdG9zIFRPU10gW3Byb3RvIFJUUFJPVE9dXG4iCisvL3VzYWdlOiAgICAgICAiCQkJCVttZXRyaWMgTUVUUklDXSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaXBydWxlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJ7W2xpc3QgfCBhZGQgfCBkZWxdIFJVTEV9IgorLy91c2FnZTojZGVmaW5lIGlwcnVsZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgImlwcnVsZSBbbGlzdCB8IGFkZCB8IGRlbF0gU0VMRUNUT1IgQUNUSU9OXG4iCisvL3VzYWdlOiAgICAgICAiCVNFTEVDVE9SIDo9IFtmcm9tIFBSRUZJWF0gW3RvIFBSRUZJWF0gW3RvcyBUT1NdIFtmd21hcmsgRldNQVJLXVxuIgorLy91c2FnZTogICAgICAgIgkJCVtkZXYgU1RSSU5HXSBbcHJlZiBOVU1CRVJdXG4iCisvL3VzYWdlOiAgICAgICAiCUFDVElPTiA6PSBbdGFibGUgVEFCTEVfSURdIFtuYXQgQUREUkVTU11cbiIKKy8vdXNhZ2U6ICAgICAgICIJCQlbcHJvaGliaXQgfCByZWplY3QgfCB1bnJlYWNoYWJsZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJCQlbcmVhbG1zIFtTUkNSRUFMTS9dRFNUUkVBTE1dXG4iCisvL3VzYWdlOiAgICAgICAiCVRBQkxFX0lEIDo9IFtsb2NhbCB8IG1haW4gfCBkZWZhdWx0IHwgTlVNQkVSXSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaXB0dW5uZWxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInsgYWRkIHwgY2hhbmdlIHwgZGVsIHwgc2hvdyB9IFtOQU1FXVxuIgorLy91c2FnZTogICAgICAgIglbbW9kZSB7IGlwaXAgfCBncmUgfCBzaXQgfV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW3JlbW90ZSBBRERSXSBbbG9jYWwgQUREUl0gW3R0bCBUVExdIgorLy91c2FnZTojZGVmaW5lIGlwdHVubmVsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiaXB0dW5uZWwgeyBhZGQgfCBjaGFuZ2UgfCBkZWwgfCBzaG93IH0gW05BTUVdXG4iCisvL3VzYWdlOiAgICAgICAiCVttb2RlIHsgaXBpcCB8IGdyZSB8IHNpdCB9XSBbcmVtb3RlIEFERFJdIFtsb2NhbCBBRERSXVxuIgorLy91c2FnZTogICAgICAgIglbW2l8b11zZXFdIFtbaXxvXWtleSBLRVldIFtbaXxvXWNzdW1dXG4iCisvL3VzYWdlOiAgICAgICAiCVt0dGwgVFRMXSBbdG9zIFRPU10gW1tub11wbXR1ZGlzY10gW2RldiBQSFlTX0RFVl0iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaW5jbHVkZSAibGliaXByb3V0ZS91dGlscy5oIgorI2luY2x1ZGUgImxpYmlwcm91dGUvaXBfY29tbW9uLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9BRERSRVNTIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JUF9ST1VURSBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfTElOSyBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfVFVOTkVMIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JUF9SVUxFCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGlwX3ByaW50X2hlbHAoY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWJiX3Nob3dfdXNhZ2UoKTsKK30KKwordHlwZWRlZiBpbnQgRkFTVF9GVU5DICgqaXBfZnVuY19wdHJfdCkoY2hhcioqKTsKKworc3RhdGljIGludCBpcF9kbyhpcF9mdW5jX3B0cl90IGlwX2Z1bmMsIGNoYXIgKiphcmd2KQoreworCWFyZ3YgPSBpcF9wYXJzZV9jb21tb25fYXJncyhhcmd2ICsgMSk7CisJcmV0dXJuIGlwX2Z1bmMoYXJndik7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9BRERSRVNTCitpbnQgaXBhZGRyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpcGFkZHJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBpcF9kbyhkb19pcGFkZHIsIGFyZ3YpOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfTElOSworaW50IGlwbGlua19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBsaW5rX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gaXBfZG8oZG9faXBsaW5rLCBhcmd2KTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1JPVVRFCitpbnQgaXByb3V0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXByb3V0ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGlwX2RvKGRvX2lwcm91dGUsIGFyZ3YpOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQoraW50IGlwcnVsZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBydWxlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gaXBfZG8oZG9faXBydWxlLCBhcmd2KTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1RVTk5FTAoraW50IGlwdHVubmVsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpcHR1bm5lbF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGlwX2RvKGRvX2lwdHVubmVsLCBhcmd2KTsKK30KKyNlbmRpZgorCisKK2ludCBpcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJSUZfRkVBVFVSRV9JUF9BRERSRVNTKCJhZGRyZXNzXDAiKQorCQlJRl9GRUFUVVJFX0lQX1JPVVRFKCJyb3V0ZVwwIikKKwkJSUZfRkVBVFVSRV9JUF9ST1VURSgiclwwIikKKwkJSUZfRkVBVFVSRV9JUF9MSU5LKCJsaW5rXDAiKQorCQlJRl9GRUFUVVJFX0lQX1RVTk5FTCgidHVubmVsXDAiKQorCQlJRl9GRUFUVVJFX0lQX1RVTk5FTCgidHVubFwwIikKKwkJSUZfRkVBVFVSRV9JUF9SVUxFKCJydWxlXDAiKQorCQk7CisJc3RhdGljIGNvbnN0IGlwX2Z1bmNfcHRyX3QgaXBfZnVuY19wdHJzW10gPSB7CisJCWlwX3ByaW50X2hlbHAsCisJCUlGX0ZFQVRVUkVfSVBfQUREUkVTUyhkb19pcGFkZHIsKQorCQlJRl9GRUFUVVJFX0lQX1JPVVRFKGRvX2lwcm91dGUsKQorCQlJRl9GRUFUVVJFX0lQX1JPVVRFKGRvX2lwcm91dGUsKQorCQlJRl9GRUFUVVJFX0lQX0xJTksoZG9faXBsaW5rLCkKKwkJSUZfRkVBVFVSRV9JUF9UVU5ORUwoZG9faXB0dW5uZWwsKQorCQlJRl9GRUFUVVJFX0lQX1RVTk5FTChkb19pcHR1bm5lbCwpCisJCUlGX0ZFQVRVUkVfSVBfUlVMRShkb19pcHJ1bGUsKQorCX07CisJaXBfZnVuY19wdHJfdCBpcF9mdW5jOworCWludCBrZXk7CisKKwlhcmd2ID0gaXBfcGFyc2VfY29tbW9uX2FyZ3MoYXJndiArIDEpOworCWtleSA9ICphcmd2ID8gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YrKykgOiAtMTsKKwlpcF9mdW5jID0gaXBfZnVuY19wdHJzW2tleSArIDFdOworCisJcmV0dXJuIGlwX2Z1bmMoYXJndik7Cit9CisKKyNlbmRpZiAvKiBhbnkgb2YgRU5BQkxFX0ZFQVRVUkVfSVBfeHh4IGlzIDEgKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaXBjYWxjLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2lwY2FsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGI4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2lwY2FsYy5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGlwY2FsYyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIEJ5IEpvcmRhbiBDcm91c2UgPGpvcmRhbkBjb3NtaWNwZW5ndWluLm5ldD4KKyAqICAgIFN0ZXBoYW4gTGlueiAgPGxpbnpAbGktcHJvLm5ldD4KKyAqCisgKiBUaGlzIGlzIGEgY29tcGxldGUgcmVpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaXBjYWxjIHByb2dyYW0KKyAqIGZyb20gUmVkIEhhdC4gIEkgZGlkbid0IGxvb2sgYXQgdGhlaXIgc291cmNlIGNvZGUsIGJ1dCB0aGVyZQorICogaXMgbm8gZGVueWluZyB0aGF0IHRoaXMgaXMgYSBsb3ZpbmcgcmVpbXBsZW1lbnRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGlwY2FsY190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEFERFJFU1NbWy9dTkVUTUFTS10gW05FVE1BU0tdIgorLy91c2FnZTojZGVmaW5lIGlwY2FsY19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNhbGN1bGF0ZSBJUCBuZXR3b3JrIHNldHRpbmdzIGZyb20gYSBJUCBhZGRyZXNzXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1iLC0tYnJvYWRjYXN0CURpc3BsYXkgY2FsY3VsYXRlZCBicm9hZGNhc3QgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4sLS1uZXR3b3JrCURpc3BsYXkgY2FsY3VsYXRlZCBuZXR3b3JrIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1tLC0tbmV0bWFzawlEaXNwbGF5IGRlZmF1bHQgbmV0bWFzayBmb3IgSVAiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQQ0FMQ19GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLXAsLS1wcmVmaXgJRGlzcGxheSB0aGUgcHJlZml4IGZvciBJUC9ORVRNQVNLIgorLy91c2FnZTogICAgICJcbgktaCwtLWhvc3RuYW1lCURpc3BsYXkgZmlyc3QgcmVzb2x2ZWQgaG9zdCBuYW1lIgorLy91c2FnZTogICAgICJcbgktcywtLXNpbGVudAlEb24ndCBldmVyIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktYglEaXNwbGF5IGNhbGN1bGF0ZWQgYnJvYWRjYXN0IGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1uCURpc3BsYXkgY2FsY3VsYXRlZCBuZXR3b3JrIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1tCURpc3BsYXkgZGVmYXVsdCBuZXRtYXNrIGZvciBJUCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktcAlEaXNwbGF5IHRoZSBwcmVmaXggZm9yIElQL05FVE1BU0siCisvL3VzYWdlOiAgICAgIlxuCS1oCURpc3BsYXkgZmlyc3QgcmVzb2x2ZWQgaG9zdCBuYW1lIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBldmVyIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgbmVlZHMgb3RoZXIgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2RlZmluZSBDTEFTU19BX05FVE1BU0sgbnRvaGwoMHhGRjAwMDAwMCkKKyNkZWZpbmUgQ0xBU1NfQl9ORVRNQVNLIG50b2hsKDB4RkZGRjAwMDApCisjZGVmaW5lIENMQVNTX0NfTkVUTUFTSyBudG9obCgweEZGRkZGRjAwKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbmV0bWFzayh1bnNpZ25lZCBsb25nIGlwYWRkcikKK3sKKwlpcGFkZHIgPSBodG9ubChpcGFkZHIpOworCisJaWYgKChpcGFkZHIgJiAweEMwMDAwMDAwKSA9PSAweEMwMDAwMDAwKQorCQlyZXR1cm4gQ0xBU1NfQ19ORVRNQVNLOworCWVsc2UgaWYgKChpcGFkZHIgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKQorCQlyZXR1cm4gQ0xBU1NfQl9ORVRNQVNLOworCWVsc2UgaWYgKChpcGFkZHIgJiAweDgwMDAwMDAwKSA9PSAwKQorCQlyZXR1cm4gQ0xBU1NfQV9ORVRNQVNLOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kKK3N0YXRpYyBpbnQgZ2V0X3ByZWZpeCh1bnNpZ25lZCBsb25nIG5ldG1hc2spCit7CisJdW5zaWduZWQgbG9uZyBtc2sgPSAweDgwMDAwMDAwOworCWludCByZXQgPSAwOworCisJbmV0bWFzayA9IGh0b25sKG5ldG1hc2spOworCXdoaWxlIChtc2spIHsKKwkJaWYgKG5ldG1hc2sgJiBtc2spCisJCQlyZXQrKzsKKwkJbXNrID4+PSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKK2ludCBnZXRfcHJlZml4KHVuc2lnbmVkIGxvbmcgbmV0bWFzayk7CisjZW5kaWYKKworCisjZGVmaW5lIE5FVE1BU0sgICAweDAxCisjZGVmaW5lIEJST0FEQ0FTVCAweDAyCisjZGVmaW5lIE5FVFdPUksgICAweDA0CisjZGVmaW5lIE5FVFBSRUZJWCAweDA4CisjZGVmaW5lIEhPU1ROQU1FICAweDEwCisjZGVmaW5lIFNJTEVOVCAgICAweDIwCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TCisJc3RhdGljIGNvbnN0IGNoYXIgaXBjYWxjX2xvbmdvcHRzW10gQUxJR04xID0KKwkJIm5ldG1hc2tcMCIgICBOb19hcmd1bWVudCAibSIgLy8gbmV0bWFzayBmcm9tIElQIChhc3N1bWluZyBjb21wbGV0ZSBjbGFzcyBBLCBCLCBvciBDIG5ldHdvcmspCisJCSJicm9hZGNhc3RcMCIgTm9fYXJndW1lbnQgImIiIC8vIGJyb2FkY2FzdCBmcm9tIElQIFtuZXRtYXNrXQorCQkibmV0d29ya1wwIiAgIE5vX2FyZ3VtZW50ICJuIiAvLyBuZXR3b3JrIGZyb20gSVAgW25ldG1hc2tdCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lQQ0FMQ19GQU5DWQorCQkicHJlZml4XDAiICAgIE5vX2FyZ3VtZW50ICJwIiAvLyBwcmVmaXggZnJvbSBJUFsvcHJlZml4XSBbbmV0bWFza10KKwkJImhvc3RuYW1lXDAiICBOb19hcmd1bWVudCAiaCIgLy8gaG9zdG5hbWUgZnJvbSBJUAorCQkic2lsZW50XDAiICAgIE5vX2FyZ3VtZW50ICJzIiAvLyBkb27igJl0IGV2ZXIgZGlzcGxheSBlcnJvciBtZXNzYWdlcworIyBlbmRpZgorCQk7CisjZW5kaWYKKworaW50IGlwY2FsY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBjYWxjX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisJYm9vbCBoYXZlX25ldG1hc2sgPSAwOworCXN0cnVjdCBpbl9hZGRyIHNfbmV0bWFzaywgc19icm9hZGNhc3QsIHNfbmV0d29yaywgc19pcGFkZHI7CisJLyogc3RydWN0IGluX2FkZHIgeyBpbl9hZGRyX3Qgc19hZGRyOyB9ICBhbmQgIGluX2FkZHJfdAorCSAqICh3aGljaCBpbiB0dXJuIGlzIGp1c3QgYSB0eXBlZGVmIHRvIHVpbnQzMl90KQorCSAqIGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZSB0eXBlLiBBIGZldyBtYWNyb3MgZm9yIGxlc3MgdmVyYm9zaXR5OiAqLworI2RlZmluZSBuZXRtYXNrICAgKHNfbmV0bWFzay5zX2FkZHIpCisjZGVmaW5lIGJyb2FkY2FzdCAoc19icm9hZGNhc3Quc19hZGRyKQorI2RlZmluZSBuZXR3b3JrICAgKHNfbmV0d29yay5zX2FkZHIpCisjZGVmaW5lIGlwYWRkciAgICAoc19pcGFkZHIuc19hZGRyKQorCWNoYXIgKmlwc3RyOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBpcGNhbGNfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTo/MiI7IC8qIG1pbmltdW0gMSBhcmcsIG1heGltdW0gMiBhcmdzICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIm1ibiIgSUZfRkVBVFVSRV9JUENBTENfRkFOQ1koInBocyIpKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgU0lMRU5UKQorCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOyAvKiBzdXBwcmVzcyBlcnJvcl9tc2coKSBvdXRwdXQgKi8KKwlvcHQgJj0gflNJTEVOVDsKKwlpZiAoIShvcHQgJiAoQlJPQURDQVNUIHwgTkVUV09SSyB8IE5FVFBSRUZJWCkpKSB7CisJCS8qIGlmIG5vIG9wdGlvbnMgYXQgYWxsIG9yCisJCSAqIChubyBicm9hZGNhc3QsbmV0d29yayxwcmVmaXgpIGFuZCAodHdvIGFyZ3MpLi4uICovCisJCWlmICghb3B0IHx8IGFyZ3ZbMV0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaXBzdHIgPSBhcmd2WzBdOworCWlmIChFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kpIHsKKwkJdW5zaWduZWQgbG9uZyBuZXRwcmVmaXggPSAwOworCQljaGFyICpwcmVmaXhzdHI7CisKKwkJcHJlZml4c3RyID0gaXBzdHI7CisKKwkJd2hpbGUgKCpwcmVmaXhzdHIpIHsKKwkJCWlmICgqcHJlZml4c3RyID09ICcvJykgeworCQkJCSpwcmVmaXhzdHIrKyA9ICdcMCc7CisJCQkJaWYgKCpwcmVmaXhzdHIpIHsKKwkJCQkJdW5zaWduZWQgbXNrOworCQkJCQluZXRwcmVmaXggPSB4YXRvdWxfcmFuZ2UocHJlZml4c3RyLCAwLCAzMik7CisJCQkJCW5ldG1hc2sgPSAwOworCQkJCQltc2sgPSAweDgwMDAwMDAwOworCQkJCQl3aGlsZSAobmV0cHJlZml4ID4gMCkgeworCQkJCQkJbmV0bWFzayB8PSBtc2s7CisJCQkJCQltc2sgPj49IDE7CisJCQkJCQluZXRwcmVmaXgtLTsKKwkJCQkJfQorCQkJCQluZXRtYXNrID0gaHRvbmwobmV0bWFzayk7CisJCQkJCS8qIEV2ZW4gaWYgaXQgd2FzIDAsIHdlIHdpbGwgc2lnbmlmeSB0aGF0IHdlIGhhdmUgYSBuZXRtYXNrLiBUaGlzIGFsbG93cyAqLworCQkJCQkvKiBmb3Igc3BlY2lmaWNhdGlvbiBvZiBkZWZhdWx0IHJvdXRlcywgZXRjIHdoaWNoIGhhdmUgYSAwIG5ldG1hc2svcHJlZml4ICovCisJCQkJCWhhdmVfbmV0bWFzayA9IDE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJcHJlZml4c3RyKys7CisJCX0KKwl9CisKKwlpZiAoaW5ldF9hdG9uKGlwc3RyLCAmc19pcGFkZHIpID09IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBJUCBhZGRyZXNzOiAlcyIsIGFyZ3ZbMF0pOworCX0KKworCWlmIChhcmd2WzFdKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kgJiYgaGF2ZV9uZXRtYXNrKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidXNlIHByZWZpeCBvciBuZXRtYXNrLCBub3QgYm90aCIpOworCQl9CisJCWlmIChpbmV0X2F0b24oYXJndlsxXSwgJnNfbmV0bWFzaykgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBuZXRtYXNrOiAlcyIsIGFyZ3ZbMV0pOworCQl9CisJfSBlbHNlIHsKKwkJLyogSkhDIC0gSWYgdGhlIG5ldG1hc2sgd2Fzbid0IHByb3ZpZGVkIHRoZW4gY2FsY3VsYXRlIGl0ICovCisJCWlmICghRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZIHx8ICFoYXZlX25ldG1hc2spCisJCQluZXRtYXNrID0gZ2V0X25ldG1hc2soaXBhZGRyKTsKKwl9CisKKwlpZiAob3B0ICYgTkVUTUFTSykgeworCQlwcmludGYoIk5FVE1BU0s9JXNcbiIsIGluZXRfbnRvYShzX25ldG1hc2spKTsKKwl9CisKKwlpZiAob3B0ICYgQlJPQURDQVNUKSB7CisJCWJyb2FkY2FzdCA9IChpcGFkZHIgJiBuZXRtYXNrKSB8IH5uZXRtYXNrOworCQlwcmludGYoIkJST0FEQ0FTVD0lc1xuIiwgaW5ldF9udG9hKHNfYnJvYWRjYXN0KSk7CisJfQorCisJaWYgKG9wdCAmIE5FVFdPUkspIHsKKwkJbmV0d29yayA9IGlwYWRkciAmIG5ldG1hc2s7CisJCXByaW50ZigiTkVUV09SSz0lc1xuIiwgaW5ldF9udG9hKHNfbmV0d29yaykpOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kpIHsKKwkJaWYgKG9wdCAmIE5FVFBSRUZJWCkgeworCQkJcHJpbnRmKCJQUkVGSVg9JWlcbiIsIGdldF9wcmVmaXgobmV0bWFzaykpOworCQl9CisKKwkJaWYgKG9wdCAmIEhPU1ROQU1FKSB7CisJCQlzdHJ1Y3QgaG9zdGVudCAqaG9zdGluZm87CisKKwkJCWhvc3RpbmZvID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSAmaXBhZGRyLCBzaXplb2YoaXBhZGRyKSwgQUZfSU5FVCk7CisJCQlpZiAoIWhvc3RpbmZvKSB7CisJCQkJYmJfaGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIGhvc3RuYW1lIGZvciAlcyIsIGFyZ3ZbMF0pOworCQkJfQorCQkJc3RyX3RvbG93ZXIoaG9zdGluZm8tPmhfbmFtZSk7CisKKwkJCXByaW50ZigiSE9TVE5BTUU9JXNcbiIsIGhvc3RpbmZvLT5oX25hbWUpOworCQl9CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaXNydi5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pc3J2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2NDkxZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaXNydi5jCkBAIC0wLDAgKzEsMzM4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBHZW5lcmljIG5vbi1mb3JraW5nIHNlcnZlciBpbmZyYXN0cnVjdHVyZS4KKyAqIEludGVuZGVkIHRvIG1ha2Ugd3JpdGluZyB0ZWxuZXRkLXR5cGUgc2VydmVycyBlYXNpZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpc3J2LmgiCisKKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcKKyNkZWZpbmUgRFBSSU5URihhcmdzLi4uKSBiYl9lcnJvcl9tc2coYXJncykKKyNlbHNlCisjZGVmaW5lIERQUklOVEYoYXJncy4uLikgKCh2b2lkKTApCisjZW5kaWYKKworLyogSGVscGVycyAqLworCisvKiBPcGFxdWUgc3RydWN0dXJlICovCisKK3N0cnVjdCBpc3J2X3N0YXRlX3QgeworCXNob3J0ICAqZmQycGVlcjsgLyogb25lIHBlciByZWdpc3RlcmVkIGZkICovCisJdm9pZCAgKipwYXJhbV90Ymw7IC8qIG9uZSBwZXIgcmVnaXN0ZXJlZCBwZWVyICovCisJLyogb25lIHBlciByZWdpc3RlcmVkIHBlZXI7IGRvZXNuJ3QgZXhpc3QgaWYgIXRpbWVvdXQgKi8KKwl0aW1lX3QgKnRpbWVvX3RibDsKKwlpbnQgICAoKm5ld19wZWVyKShpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpOworCXRpbWVfdCAgY3VydGltZTsKKwlpbnQgICAgIHRpbWVvdXQ7CisJaW50ICAgICBmZF9jb3VudDsKKwlpbnQgICAgIHBlZXJfY291bnQ7CisJaW50ICAgICB3cl9jb3VudDsKKwlmZF9zZXQgIHJkOworCWZkX3NldCAgd3I7Cit9OworI2RlZmluZSBGRDJQRUVSICAgIChzdGF0ZS0+ZmQycGVlcikKKyNkZWZpbmUgUEFSQU1fVEJMICAoc3RhdGUtPnBhcmFtX3RibCkKKyNkZWZpbmUgVElNRU9fVEJMICAoc3RhdGUtPnRpbWVvX3RibCkKKyNkZWZpbmUgQ1VSVElNRSAgICAoc3RhdGUtPmN1cnRpbWUpCisjZGVmaW5lIFRJTUVPVVQgICAgKHN0YXRlLT50aW1lb3V0KQorI2RlZmluZSBGRF9DT1VOVCAgIChzdGF0ZS0+ZmRfY291bnQpCisjZGVmaW5lIFBFRVJfQ09VTlQgKHN0YXRlLT5wZWVyX2NvdW50KQorI2RlZmluZSBXUl9DT1VOVCAgIChzdGF0ZS0+d3JfY291bnQpCisKKy8qIGNhbGxiYWNrICovCit2b2lkIGlzcnZfd2FudF9yZChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpCit7CisJRkRfU0VUKGZkLCAmc3RhdGUtPnJkKTsKK30KKworLyogY2FsbGJhY2sgKi8KK3ZvaWQgaXNydl93YW50X3dyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCkKK3sKKwlpZiAoIUZEX0lTU0VUKGZkLCAmc3RhdGUtPndyKSkgeworCQlXUl9DT1VOVCsrOworCQlGRF9TRVQoZmQsICZzdGF0ZS0+d3IpOworCX0KK30KKworLyogY2FsbGJhY2sgKi8KK3ZvaWQgaXNydl9kb250X3dhbnRfcmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKQoreworCUZEX0NMUihmZCwgJnN0YXRlLT5yZCk7Cit9CisKKy8qIGNhbGxiYWNrICovCit2b2lkIGlzcnZfZG9udF93YW50X3dyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCkKK3sKKwlpZiAoRkRfSVNTRVQoZmQsICZzdGF0ZS0+d3IpKSB7CisJCVdSX0NPVU5ULS07CisJCUZEX0NMUihmZCwgJnN0YXRlLT53cik7CisJfQorfQorCisvKiBjYWxsYmFjayAqLworaW50IGlzcnZfcmVnaXN0ZXJfZmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IHBlZXIsIGludCBmZCkKK3sKKwlpbnQgbjsKKworCURQUklOVEYoInJlZ2lzdGVyX2ZkKHBlZXI6JWQsZmQ6JWQpIiwgcGVlciwgZmQpOworCisJaWYgKEZEX0NPVU5UID49IEZEX1NFVFNJWkUpIHJldHVybiAtMTsKKwlpZiAoRkRfQ09VTlQgPD0gZmQpIHsKKwkJbiA9IEZEX0NPVU5UOworCQlGRF9DT1VOVCA9IGZkICsgMTsKKworCQlEUFJJTlRGKCJyZWdpc3Rlcl9mZDogRkRfQ09VTlQgJWQiLCBGRF9DT1VOVCk7CisKKwkJRkQyUEVFUiA9IHhyZWFsbG9jKEZEMlBFRVIsIEZEX0NPVU5UICogc2l6ZW9mKEZEMlBFRVJbMF0pKTsKKwkJd2hpbGUgKG4gPCBmZCkgRkQyUEVFUltuKytdID0gLTE7CisJfQorCisJRFBSSU5URigicmVnaXN0ZXJfZmQ6IEZEMlBFRVJbJWRdID0gJWQiLCBmZCwgcGVlcik7CisKKwlGRDJQRUVSW2ZkXSA9IHBlZXI7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrICovCit2b2lkIGlzcnZfY2xvc2VfZmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKQoreworCURQUklOVEYoImNsb3NlX2ZkKCVkKSIsIGZkKTsKKworCWNsb3NlKGZkKTsKKwlpc3J2X2RvbnRfd2FudF9yZChzdGF0ZSwgZmQpOworCWlmIChXUl9DT1VOVCkgaXNydl9kb250X3dhbnRfd3Ioc3RhdGUsIGZkKTsKKworCUZEMlBFRVJbZmRdID0gLTE7CisJaWYgKGZkID09IEZEX0NPVU5ULTEpIHsKKwkJZG8gZmQtLTsgd2hpbGUgKGZkID49IDAgJiYgRkQyUEVFUltmZF0gPT0gLTEpOworCQlGRF9DT1VOVCA9IGZkICsgMTsKKworCQlEUFJJTlRGKCJjbG9zZV9mZDogRkRfQ09VTlQgJWQiLCBGRF9DT1VOVCk7CisKKwkJRkQyUEVFUiA9IHhyZWFsbG9jKEZEMlBFRVIsIEZEX0NPVU5UICogc2l6ZW9mKEZEMlBFRVJbMF0pKTsKKwl9Cit9CisKKy8qIGNhbGxiYWNrICovCitpbnQgaXNydl9yZWdpc3Rlcl9wZWVyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIHZvaWQgKnBhcmFtKQoreworCWludCBuOworCisJaWYgKFBFRVJfQ09VTlQgPj0gRkRfU0VUU0laRSkgcmV0dXJuIC0xOworCW4gPSBQRUVSX0NPVU5UKys7CisKKwlEUFJJTlRGKCJyZWdpc3Rlcl9wZWVyOiBQRUVSX0NPVU5UICVkIiwgUEVFUl9DT1VOVCk7CisKKwlQQVJBTV9UQkwgPSB4cmVhbGxvYyhQQVJBTV9UQkwsIFBFRVJfQ09VTlQgKiBzaXplb2YoUEFSQU1fVEJMWzBdKSk7CisJUEFSQU1fVEJMW25dID0gcGFyYW07CisJaWYgKFRJTUVPVVQpIHsKKwkJVElNRU9fVEJMID0geHJlYWxsb2MoVElNRU9fVEJMLCBQRUVSX0NPVU5UICogc2l6ZW9mKFRJTUVPX1RCTFswXSkpOworCQlUSU1FT19UQkxbbl0gPSBDVVJUSU1FOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3BlZXIoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IHBlZXIpCit7CisJaW50IG1vdmVzaXplOworCWludCBmZDsKKworCURQUklOVEYoInJlbW92ZV9wZWVyKCVkKSIsIHBlZXIpOworCisJZmQgPSBGRF9DT1VOVCAtIDE7CisJd2hpbGUgKGZkID49IDApIHsKKwkJaWYgKEZEMlBFRVJbZmRdID09IHBlZXIpIHsKKwkJCWlzcnZfY2xvc2VfZmQoc3RhdGUsIGZkKTsKKwkJCWZkLS07CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoRkQyUEVFUltmZF0gPiBwZWVyKQorCQkJRkQyUEVFUltmZF0tLTsKKwkJZmQtLTsKKwl9CisKKwlQRUVSX0NPVU5ULS07CisJRFBSSU5URigicmVtb3ZlX3BlZXI6IFBFRVJfQ09VTlQgJWQiLCBQRUVSX0NPVU5UKTsKKworCW1vdmVzaXplID0gKFBFRVJfQ09VTlQgLSBwZWVyKSAqIHNpemVvZih2b2lkKik7CisJaWYgKG1vdmVzaXplID4gMCkgeworCQltZW1jcHkoJlBBUkFNX1RCTFtwZWVyXSwgJlBBUkFNX1RCTFtwZWVyKzFdLCBtb3Zlc2l6ZSk7CisJCWlmIChUSU1FT1VUKQorCQkJbWVtY3B5KCZUSU1FT19UQkxbcGVlcl0sICZUSU1FT19UQkxbcGVlcisxXSwgbW92ZXNpemUpOworCX0KKwlQQVJBTV9UQkwgPSB4cmVhbGxvYyhQQVJBTV9UQkwsIFBFRVJfQ09VTlQgKiBzaXplb2YoUEFSQU1fVEJMWzBdKSk7CisJaWYgKFRJTUVPVVQpCisJCVRJTUVPX1RCTCA9IHhyZWFsbG9jKFRJTUVPX1RCTCwgUEVFUl9DT1VOVCAqIHNpemVvZihUSU1FT19UQkxbMF0pKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2FjY2VwdChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpCit7CisJaW50IG4sIG5ld2ZkOworCisJLyogc3VwcHJlc3MgZ2NjIHdhcm5pbmcgImNhc3QgZnJvbSBwdHIgdG8gaW50IG9mIGRpZmZlcmVudCBzaXplIiAqLworCWZjbnRsKGZkLCBGX1NFVEZMLCAoaW50KShwdHJkaWZmX3QpKFBBUkFNX1RCTFswXSkgfCBPX05PTkJMT0NLKTsKKwluZXdmZCA9IGFjY2VwdChmZCwgTlVMTCwgMCk7CisJZmNudGwoZmQsIEZfU0VURkwsIChpbnQpKHB0cmRpZmZfdCkoUEFSQU1fVEJMWzBdKSk7CisJaWYgKG5ld2ZkIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUFHQUlOKSByZXR1cm47CisJCS8qIE1vc3QgcHJvYmFibHkgc29tZW9uZSBnYXZlIHVzIHdyb25nIGZkIHR5cGUKKwkJICogKGZvciBleGFtcGxlLCBub24tc29ja2V0KS4gRG9uJ3Qgd2FudAorCQkgKiB0byBsb29wIGZvcmV2ZXIuICovCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiYWNjZXB0Iik7CisJfQorCisJRFBSSU5URigibmV3X3BlZXIoJWQpIiwgbmV3ZmQpOworCW4gPSBzdGF0ZS0+bmV3X3BlZXIoc3RhdGUsIG5ld2ZkKTsKKwlpZiAobikKKwkJcmVtb3ZlX3BlZXIoc3RhdGUsIG4pOyAvKiB1bnN1Y2Nlc2Z1bCBwZWVyIHN0YXJ0ICovCit9CisKK3ZvaWQgQlVHX3NpemVvZl9mZF9zZXRfaXNfc3RyYW5nZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9mZF9zZXQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgZmRfc2V0ICpmZHMsIGludCAoKmgpKGludCwgdm9pZCAqKikpCit7CisJZW51bSB7IExPTkdfQ05UID0gc2l6ZW9mKGZkX3NldCkgLyBzaXplb2YobG9uZykgfTsKKwlpbnQgZmRzX3BvczsKKwlpbnQgZmQsIHBlZXI7CisJLyogbmVlZCB0byBrbm93IHZhbHVlIGF0IF90aGUgYmVnaW5uaW5nXyBvZiB0aGlzIHJvdXRpbmUgKi8KKwlpbnQgZmRfY250ID0gRkRfQ09VTlQ7CisKKwlpZiAoTE9OR19DTlQgKiBzaXplb2YobG9uZykgIT0gc2l6ZW9mKGZkX3NldCkpCisJCUJVR19zaXplb2ZfZmRfc2V0X2lzX3N0cmFuZ2UoKTsKKworCWZkc19wb3MgPSAwOworCXdoaWxlICgxKSB7CisJCS8qIEZpbmQgbmV4dCBub256ZXJvIGJpdCAqLworCQl3aGlsZSAoZmRzX3BvcyA8IExPTkdfQ05UKSB7CisJCQlpZiAoKChsb25nKilmZHMpW2Zkc19wb3NdID09IDApIHsKKwkJCQlmZHNfcG9zKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBGb3VuZCBub24temVybyB3b3JkICovCisJCQlmZCA9IGZkc19wb3MgKiBzaXplb2YobG9uZykqODsgLyogd29yZCMgLT4gYml0IyAqLworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoRkRfSVNTRVQoZmQsIGZkcykpIHsKKwkJCQkJRkRfQ0xSKGZkLCBmZHMpOworCQkJCQlnb3RvIGZvdW5kX2ZkOworCQkJCX0KKwkJCQlmZCsrOworCQkJfQorCQl9CisJCWJyZWFrOyAvKiBhbGwgd29yZHMgYXJlIHplcm8gKi8KKyBmb3VuZF9mZDoKKwkJaWYgKGZkID49IGZkX2NudCkgeyAvKiBwYXJhbm9pYSAqLworCQkJRFBSSU5URigiaGFuZGxlX2ZkX3NldDogZmQgPiBmZF9jbnQ/PyAoJWQgPiAlZCkiLAorCQkJCQlmZCwgZmRfY250KTsKKwkJCWJyZWFrOworCQl9CisJCURQUklOVEYoImhhbmRsZV9mZF9zZXQ6IGZkICVkIGlzIGFjdGl2ZSIsIGZkKTsKKwkJcGVlciA9IEZEMlBFRVJbZmRdOworCQlpZiAocGVlciA8IDApCisJCQljb250aW51ZTsgLyogcGVlciBpcyBhbHJlYWR5IGdvbmUgKi8KKwkJaWYgKHBlZXIgPT0gMCkgeworCQkJaGFuZGxlX2FjY2VwdChzdGF0ZSwgZmQpOworCQkJY29udGludWU7CisJCX0KKwkJRFBSSU5URigiaChmZDolZCkiLCBmZCk7CisJCWlmIChoKGZkLCAmUEFSQU1fVEJMW3BlZXJdKSkgeworCQkJLyogdGhpcyBwZWVyIGlzIGdvbmUgKi8KKwkJCXJlbW92ZV9wZWVyKHN0YXRlLCBwZWVyKTsKKwkJfSBlbHNlIGlmIChUSU1FT1VUKSB7CisJCQlUSU1FT19UQkxbcGVlcl0gPSBtb25vdG9uaWNfc2VjKCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV90aW1lb3V0KGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCAoKmRvX3RpbWVvdXQpKHZvaWQgKiopKQoreworCWludCBuLCBwZWVyOworCXBlZXIgPSBQRUVSX0NPVU5ULTE7CisJLyogcGVlciAwIGlzIG5vdCBjaGVja2VkICovCisJd2hpbGUgKHBlZXIgPiAwKSB7CisJCURQUklOVEYoInBlZXIgJWQ6IHRpbWUgZGlmZiAlZCIsIHBlZXIsCisJCQkJKGludCkoQ1VSVElNRSAtIFRJTUVPX1RCTFtwZWVyXSkpOworCQlpZiAoKENVUlRJTUUgLSBUSU1FT19UQkxbcGVlcl0pID49IFRJTUVPVVQpIHsKKwkJCURQUklOVEYoInBlZXIgJWQ6IGRvX3RpbWVvdXQoKSIsIHBlZXIpOworCQkJbiA9IGRvX3RpbWVvdXQoJlBBUkFNX1RCTFtwZWVyXSk7CisJCQlpZiAobikKKwkJCQlyZW1vdmVfcGVlcihzdGF0ZSwgcGVlcik7CisJCX0KKwkJcGVlci0tOworCX0KK30KKworLyogRHJpdmVyICovCit2b2lkIGlzcnZfcnVuKAorCWludCBsaXN0ZW5fZmQsCisJaW50ICgqbmV3X3BlZXIpKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCksCisJaW50ICgqZG9fcmQpKGludCBmZCwgdm9pZCAqKiksCisJaW50ICgqZG9fd3IpKGludCBmZCwgdm9pZCAqKiksCisJaW50ICgqZG9fdGltZW91dCkodm9pZCAqKiksCisJaW50IHRpbWVvdXQsCisJaW50IGxpbmdlcl90aW1lb3V0KQoreworCWlzcnZfc3RhdGVfdCAqc3RhdGUgPSB4emFsbG9jKHNpemVvZigqc3RhdGUpKTsKKwlzdGF0ZS0+bmV3X3BlZXIgPSBuZXdfcGVlcjsKKwlzdGF0ZS0+dGltZW91dCAgPSB0aW1lb3V0OworCisJLyogcmVnaXN0ZXIgInBlZXIiICMwIC0gaXQgd2lsbCBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zICovCisJaXNydl9yZWdpc3Rlcl9wZWVyKHN0YXRlLCBOVUxMKTsKKwlpc3J2X3JlZ2lzdGVyX2ZkKHN0YXRlLCAvKnBlZXI6Ki8gMCwgbGlzdGVuX2ZkKTsKKwlpc3J2X3dhbnRfcmQoc3RhdGUsIGxpc3Rlbl9mZCk7CisJLyogcmVtZW1iZXIgZmxhZ3MgdG8gbWFrZSBibG9ja2luZzwtPm5vbmJsb2NraW5nIHN3aXRjaCBmYXN0ZXIgKi8KKwkvKiAoc3VwcHJlc3MgZ2NjIHdhcm5pbmcgImNhc3QgZnJvbSBwdHIgdG8gaW50IG9mIGRpZmZlcmVudCBzaXplIikgKi8KKwlQQVJBTV9UQkxbMF0gPSAodm9pZCopKHB0cmRpZmZfdCkoZmNudGwobGlzdGVuX2ZkLCBGX0dFVEZMKSk7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJZmRfc2V0IHJkOworCQlmZF9zZXQgd3I7CisJCWZkX3NldCAqd3JwID0gTlVMTDsKKwkJaW50IG47CisKKwkJdHYudHZfc2VjID0gdGltZW91dDsKKwkJaWYgKFBFRVJfQ09VTlQgPD0gMSkKKwkJCXR2LnR2X3NlYyA9IGxpbmdlcl90aW1lb3V0OworCQl0di50dl91c2VjID0gMDsKKwkJcmQgPSBzdGF0ZS0+cmQ7CisJCWlmIChXUl9DT1VOVCkgeworCQkJd3IgPSBzdGF0ZS0+d3I7CisJCQl3cnAgPSAmd3I7CisJCX0KKworCQlEUFJJTlRGKCJydW46IHNlbGVjdChGRF9DT1VOVDolZCx0aW1lb3V0OiVkKS4uLiIsCisJCQkJRkRfQ09VTlQsIChpbnQpdHYudHZfc2VjKTsKKwkJbiA9IHNlbGVjdChGRF9DT1VOVCwgJnJkLCB3cnAsIE5VTEwsIHR2LnR2X3NlYyA/ICZ0diA6IE5VTEwpOworCQlEUFJJTlRGKCJydW46IC4uLnNlbGVjdDolZCIsIG4pOworCisJCWlmIChuIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJCWJiX3BlcnJvcl9tc2coInNlbGVjdCIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobiA9PSAwICYmIGxpbmdlcl90aW1lb3V0ICYmIFBFRVJfQ09VTlQgPD0gMSkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lb3V0KSB7CisJCQl0aW1lX3QgdCA9IG1vbm90b25pY19zZWMoKTsKKwkJCWlmICh0ICE9IENVUlRJTUUpIHsKKwkJCQlDVVJUSU1FID0gdDsKKwkJCQloYW5kbGVfdGltZW91dChzdGF0ZSwgZG9fdGltZW91dCk7CisJCQl9CisJCX0KKwkJaWYgKG4gPiAwKSB7CisJCQloYW5kbGVfZmRfc2V0KHN0YXRlLCAmcmQsIGRvX3JkKTsKKwkJCWlmICh3cnApCisJCQkJaGFuZGxlX2ZkX3NldChzdGF0ZSwgd3JwLCBkb193cik7CisJCX0KKwl9CisJRFBSSU5URigicnVuOiBiYWlsb3V0Iik7CisJLyogTkI6IGFjY2VwdCBzb2NrZXQgaXMgbm90IGNsb3NlZC4gQ2FsbGVyIGlzIHRvIGRlY2lkZSB3aGF0IHRvIGRvICovCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2lzcnYuaCBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaXNydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjN2UwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2lzcnYuaApAQCAtMCwwICsxLDM3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBHZW5lcmljIG5vbi1mb3JraW5nIHNlcnZlciBpbmZyYXN0cnVjdHVyZS4KKyAqIEludGVuZGVkIHRvIG1ha2Ugd3JpdGluZyB0ZWxuZXRkLXR5cGUgc2VydmVycyBlYXNpZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogb3BhcXVlIHN0cnVjdHVyZSAqLworc3RydWN0IGlzcnZfc3RhdGVfdDsKK3R5cGVkZWYgc3RydWN0IGlzcnZfc3RhdGVfdCBpc3J2X3N0YXRlX3Q7CisKKy8qIGNhbGxiYWNrcyAqLwordm9pZCBpc3J2X3dhbnRfcmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKTsKK3ZvaWQgaXNydl93YW50X3dyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCk7Cit2b2lkIGlzcnZfZG9udF93YW50X3JkKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCk7Cit2b2lkIGlzcnZfZG9udF93YW50X3dyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCk7CitpbnQgaXNydl9yZWdpc3Rlcl9mZChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgcGVlciwgaW50IGZkKTsKK3ZvaWQgaXNydl9jbG9zZV9mZChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpOworaW50IGlzcnZfcmVnaXN0ZXJfcGVlcihpc3J2X3N0YXRlX3QgKnN0YXRlLCB2b2lkICpwYXJhbSk7CisKKy8qIGRyaXZlciAqLwordm9pZCBpc3J2X3J1bigKKwlpbnQgbGlzdGVuX2ZkLAorCWludCAoKm5ld19wZWVyKShpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpLAorCWludCAoKmRvX3JkKShpbnQgZmQsIHZvaWQgKiopLAorCWludCAoKmRvX3dyKShpbnQgZmQsIHZvaWQgKiopLAorCWludCAoKmRvX3RpbWVvdXQpKHZvaWQgKiopLAorCWludCB0aW1lb3V0LAorCWludCBsaW5nZXJfdGltZW91dAorKTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaXNydl9pZGVudGQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvaXNydl9pZGVudGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE0MDVjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9pc3J2X2lkZW50ZC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBGYWtlIGlkZW50ZCBzZXJ2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmFrZWlkZW50ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1maXddIFstYiBBRERSXSBbU1RSSU5HXSIKKy8vdXNhZ2U6I2RlZmluZSBmYWtlaWRlbnRkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJvdmlkZSBmYWtlIGlkZW50IChhdXRoKSBzZXJ2aWNlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktaQlJbmV0ZCBtb2RlIgorLy91c2FnZTogICAgICJcbgktdwlJbmV0ZCAnd2FpdCcgbW9kZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgQUREUglCaW5kIHRvIHNwZWNpZmllZCBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbglTVFJJTkcJSWRlbnQgYW5zd2VyIHN0cmluZyAoZGVmYXVsdDogbm9ib2R5KSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSAiaXNydi5oIgorCitlbnVtIHsgVElNRU9VVCA9IDIwIH07CisKK3R5cGVkZWYgc3RydWN0IGlkZW50ZF9idWZfdCB7CisJaW50IHBvczsKKwlpbnQgZmRfZmxhZzsKKwljaGFyIGJ1Zls2NCAtIDIqc2l6ZW9mKGludCldOworfSBpZGVudGRfYnVmX3Q7CisKKyNkZWZpbmUgYm9nb3VzZXIgYmJfY29tbW9uX2J1ZnNpejEKKworc3RhdGljIGludCBuZXdfcGVlcihpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpCit7CisJaW50IHBlZXI7CisJaWRlbnRkX2J1Zl90ICpidWYgPSB4emFsbG9jKHNpemVvZigqYnVmKSk7CisKKwlwZWVyID0gaXNydl9yZWdpc3Rlcl9wZWVyKHN0YXRlLCBidWYpOworCWlmIChwZWVyIDwgMCkKKwkJcmV0dXJuIDA7IC8qIGZhaWx1cmUgKi8KKwlpZiAoaXNydl9yZWdpc3Rlcl9mZChzdGF0ZSwgcGVlciwgZmQpIDwgMCkKKwkJcmV0dXJuIHBlZXI7IC8qIGZhaWx1cmUsIHVucmVnaXN0ZXIgcGVlciAqLworCisJYnVmLT5mZF9mbGFnID0gZmNudGwoZmQsIEZfR0VURkwpIHwgT19OT05CTE9DSzsKKwlpc3J2X3dhbnRfcmQoc3RhdGUsIGZkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19yZChpbnQgZmQsIHZvaWQgKipwYXJhbXApCit7CisJaWRlbnRkX2J1Zl90ICpidWYgPSAqcGFyYW1wOworCWNoYXIgKmN1ciwgKnA7CisJaW50IHJldHZhbCA9IDA7IC8qIHNlc3Npb24gaXMgb2sgKHNvIGZhcikgKi8KKwlpbnQgc3o7CisKKwljdXIgPSBidWYtPmJ1ZiArIGJ1Zi0+cG9zOworCisJaWYgKGJ1Zi0+ZmRfZmxhZyAmIE9fTk9OQkxPQ0spCisJCWZjbnRsKGZkLCBGX1NFVEZMLCBidWYtPmZkX2ZsYWcpOworCXN6ID0gc2FmZV9yZWFkKGZkLCBjdXIsIHNpemVvZihidWYtPmJ1ZikgLSBidWYtPnBvcyk7CisKKwlpZiAoc3ogPCAwKSB7CisJCWlmIChlcnJubyAhPSBFQUdBSU4pCisJCQlnb3RvIHRlcm07IC8qIHRlcm1pbmF0ZSB0aGlzIHNlc3Npb24gaWYgIUVBR0FJTiAqLworCQlnb3RvIG9rOworCX0KKworCWJ1Zi0+cG9zICs9IHN6OworCWJ1Zi0+YnVmW2J1Zi0+cG9zXSA9ICdcMCc7CisJcCA9IHN0cnBicmsoY3VyLCAiXHJcbiIpOworCWlmIChwKQorCQkqcCA9ICdcMCc7CisJaWYgKCFwICYmIHN6ICYmIGJ1Zi0+cG9zIDw9IChpbnQpc2l6ZW9mKGJ1Zi0+YnVmKSkKKwkJZ290byBvazsKKwkvKiBUZXJtaW5hdGUgc2Vzc2lvbi4gSWYgd2UgYXJlIGluIHNlcnZlciBtb2RlLCB0aGVuCisJICogZmQgaXMgc3RpbGwgaW4gbm9uYmxvY2tpbmcgbW9kZSAtIHdlIG5ldmVyIGJsb2NrIGhlcmUgKi8KKwlpZiAoZmQgPT0gMCkgZmQrKzsgLyogaW5ldGQgbW9kZT8gdGhlbiB3cml0ZSB0byBmZCAxICovCisJZmRwcmludGYoZmQsICIlcyA6IFVTRVJJRCA6IFVOSVggOiAlc1xyXG4iLCBidWYtPmJ1ZiwgYm9nb3VzZXIpOworIHRlcm06CisJZnJlZShidWYpOworCXJldHZhbCA9IDE7IC8qIHRlcm1pbmF0ZSAqLworIG9rOgorCWlmIChidWYtPmZkX2ZsYWcgJiBPX05PTkJMT0NLKQorCQlmY250bChmZCwgRl9TRVRGTCwgYnVmLT5mZF9mbGFnICYgfk9fTk9OQkxPQ0spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZG9fdGltZW91dCh2b2lkICoqcGFyYW1wIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMTsgLyogdGVybWluYXRlIHNlc3Npb24gKi8KK30KKworc3RhdGljIHZvaWQgaW5ldGRfbW9kZSh2b2lkKQoreworCWlkZW50ZF9idWZfdCAqYnVmID0geHphbGxvYyhzaXplb2YoKmJ1ZikpOworCS8qIGJ1Zi0+cG9zID0gMDsgLSB4emFsbG9jIGRpZCBpdCAqLworCS8qIFdlIGRvIE5PVCB3YW50IG5vbmJsb2NraW5nIEkvTyBoZXJlISAqLworCS8qIGJ1Zi0+ZmRfZmxhZyA9IDA7IC0geHphbGxvYyBkaWQgaXQgKi8KKwlkbworCQlhbGFybShUSU1FT1VUKTsKKwl3aGlsZSAoZG9fcmQoMCwgKHZvaWQqKSZidWYpID09IDApOworfQorCitpbnQgZmFrZWlkZW50ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmFrZWlkZW50ZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF9mb3JlZ3JvdW5kID0gMHgxLAorCQlPUFRfaW5ldGQgICAgICA9IDB4MiwKKwkJT1BUX2luZXRkd2FpdCAgPSAweDQsCisJCU9QVF9maXcgICAgICAgID0gMHg3LAorCQlPUFRfYmluZGFkZHIgICA9IDB4OCwKKwl9OworCisJY29uc3QgY2hhciAqYmluZF9hZGRyZXNzID0gTlVMTDsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGZkOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImZpd2I6IiwgJmJpbmRfYWRkcmVzcyk7CisJc3RyY3B5KGJvZ291c2VyLCAibm9ib2R5Iik7CisJaWYgKGFyZ3Zbb3B0aW5kXSkKKwkJc3RybmNweShib2dvdXNlciwgYXJndltvcHRpbmRdLCBzaXplb2YoYm9nb3VzZXIpKTsKKworCS8qIERhZW1vbml6ZSBpZiBubyAtZiBhbmQgbm8gLWkgYW5kIG5vIC13ICovCisJaWYgKCEob3B0ICYgT1BUX2ZpdykpCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2KTsKKworCS8qIFdoZXJlIHRvIGxvZyBpbiBpbmV0ZCBtb2Rlcz8gIkNsYXNzaWMiIGluZXRkCisJICogcHJvYmFibHkgaGFzIGl0cyBzdGRlcnIgL2Rldi9udWxsJ2VkICh3ZSBuZWVkIGxvZyB0byBzeXNsb2c/KSwKKwkgKiBidXQgZGFlbW9udG9vbHMtbGlrZSB1dGlsaXRpZXMgdXN1YWxseSBleHBlY3QgdGhhdCBjaGlsZHJlbgorCSAqIGxvZyB0byBzdGRlcnIuIEkgbGlrZSBkYWVtb250b29scyBtb3JlLiBHbyB0aGVpciB3YXkuCisJICogKE9yIG1heWJlIHdlIG5lZWQgeWV0IGFub3RoZXIgb3B0aW9uICJsb2cgdG8gc3lzbG9nIikgKi8KKwlpZiAoIShvcHQgJiBPUFRfZml3KSAvKiB8fCAob3B0ICYgT1BUX3N5c2xvZykgKi8pIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwl9CisKKwlpZiAob3B0ICYgT1BUX2luZXRkKSB7CisJCWluZXRkX21vZGUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWdub3JlIGNsb3NlZCBjb25uZWN0aW9ucyB3aGVuIHdyaXRpbmcgKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwlmZCA9IDA7CisJaWYgKCEob3B0ICYgT1BUX2luZXRkd2FpdCkpIHsKKwkJZmQgPSBjcmVhdGVfYW5kX2JpbmRfc3RyZWFtX29yX2RpZShiaW5kX2FkZHJlc3MsCisJCQkJYmJfbG9va3VwX3BvcnQoImlkZW50ZCIsICJ0Y3AiLCAxMTMpKTsKKwkJeGxpc3RlbihmZCwgNSk7CisJfQorCisJaXNydl9ydW4oZmQsIG5ld19wZWVyLCBkb19yZCwgLypkb193cjoqLyBOVUxMLCBkb190aW1lb3V0LAorCQkJVElNRU9VVCwgKG9wdCAmIE9QVF9pbmV0ZHdhaXQpID8gVElNRU9VVCA6IDApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc4ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL0tidWlsZC5zcmMKQEAgLTAsMCArMSw2NiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisjCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19TTEFUVEFDSCkgKz0gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0lQKSArPSBcCisJaXBfcGFyc2VfY29tbW9uX2FyZ3MubyBcCisJbGlibmV0bGluay5vIFwKKwlsbF9hZGRyLm8gXAorCWxsX21hcC5vIFwKKwlsbF9wcm90by5vIFwKKwlsbF90eXBlcy5vIFwKKwlydF9uYW1lcy5vIFwKKwlydG1fbWFwLm8gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfSVBfQUREUkVTUykgKz0gXAorCWlwX3BhcnNlX2NvbW1vbl9hcmdzLm8gXAorCWlwYWRkcmVzcy5vIFwKKwlsaWJuZXRsaW5rLm8gXAorCWxsX2FkZHIubyBcCisJbGxfbWFwLm8gXAorCWxsX3R5cGVzLm8gXAorCXJ0X25hbWVzLm8gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfSVBfTElOSykgKz0gXAorCWlwX3BhcnNlX2NvbW1vbl9hcmdzLm8gXAorCWlwYWRkcmVzcy5vIFwKKwlpcGxpbmsubyBcCisJbGlibmV0bGluay5vIFwKKwlsbF9hZGRyLm8gXAorCWxsX21hcC5vIFwKKwlsbF90eXBlcy5vIFwKKwlydF9uYW1lcy5vIFwKKwl1dGlscy5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX0lQX1JPVVRFKSArPSBcCisJaXBfcGFyc2VfY29tbW9uX2FyZ3MubyBcCisJaXByb3V0ZS5vIFwKKwlsaWJuZXRsaW5rLm8gXAorCWxsX21hcC5vIFwKKwlydF9uYW1lcy5vIFwKKwlydG1fbWFwLm8gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMKSArPSBcCisJaXBfcGFyc2VfY29tbW9uX2FyZ3MubyBcCisJaXB0dW5uZWwubyBcCisJcnRfbmFtZXMubyBcCisJdXRpbHMubworCitsaWItJChDT05GSUdfRkVBVFVSRV9JUF9SVUxFKSArPSBcCisJaXBfcGFyc2VfY29tbW9uX2FyZ3MubyBcCisJaXBydWxlLm8gXAorCXJ0X25hbWVzLm8gXAorCXV0aWxzLm8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9jb21tb24uaCBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGM3ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwX2NvbW1vbi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmbmRlZiBJUF9DT01NT05fSAorI2RlZmluZSBJUF9DT01NT05fSCAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpZiAhZGVmaW5lZCBJRkFfUlRBCisjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgorI2VuZGlmCisjaWYgIWRlZmluZWQgSUZMQV9SVEEKKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisjZW5kaWYKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2NoYXIgRkFTVF9GVU5DICoqaXBfcGFyc2VfY29tbW9uX2FyZ3MoY2hhciAqKmFyZ3YpOworLy9pbnQgRkFTVF9GVU5DIHByaW50X25laWdoKHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitpbnQgRkFTVF9GVU5DIGlwYWRkcl9saXN0X29yX2ZsdXNoKGNoYXIgKiphcmd2LCBpbnQgZmx1c2gpOworLy9pbnQgRkFTVF9GVU5DIGlwcm91dGVfbW9uaXRvcihjaGFyICoqYXJndik7CisvL3ZvaWQgRkFTVF9GVU5DIGlwbmVpZ2hfcmVzZXRfZmlsdGVyKHZvaWQpOworCitpbnQgRkFTVF9GVU5DIGRvX2lwYWRkcihjaGFyICoqYXJndik7CitpbnQgRkFTVF9GVU5DIGRvX2lwcm91dGUoY2hhciAqKmFyZ3YpOworaW50IEZBU1RfRlVOQyBkb19pcHJ1bGUoY2hhciAqKmFyZ3YpOworLy9pbnQgRkFTVF9GVU5DIGRvX2lwbmVpZ2goY2hhciAqKmFyZ3YpOworaW50IEZBU1RfRlVOQyBkb19pcHR1bm5lbChjaGFyICoqYXJndik7CitpbnQgRkFTVF9GVU5DIGRvX2lwbGluayhjaGFyICoqYXJndik7CisvL2ludCBGQVNUX0ZVTkMgZG9faXBtb25pdG9yKGNoYXIgKiphcmd2KTsKKy8vaW50IEZBU1RfRlVOQyBkb19tdWx0aWFkZHIoY2hhciAqKmFyZ3YpOworLy9pbnQgRkFTVF9GVU5DIGRvX211bHRpcm91dGUoY2hhciAqKmFyZ3YpOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9wYXJzZV9jb21tb25fYXJncy5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwX3BhcnNlX2NvbW1vbl9hcmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNzU5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9wYXJzZV9jb21tb25fYXJncy5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkyOTogcmVzb2x2ZSBhZGRyZXNzZXMKKyAqLworCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiICAvKiAjaW5jbHVkZSAibGliYmIuaCIgaXMgaW5zaWRlICovCisjaW5jbHVkZSAidXRpbHMuaCIKKworZmFtaWx5X3QgcHJlZmVycmVkX2ZhbWlseSA9IEFGX1VOU1BFQzsKK3NtYWxsaW50IG9uZWxpbmU7CitjaGFyIF9TTF87CisKK2NoYXIqKiBGQVNUX0ZVTkMgaXBfcGFyc2VfY29tbW9uX2FyZ3MoY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgaXBfY29tbW9uX2NvbW1hbmRzW10gQUxJR04xID0KKwkJIm9uZWxpbmUiICJcMCIKKwkJImZhbWlseSIgIlwwIgorCQkiNCIgIlwwIgorCQkiNiIgIlwwIgorCQkiMCIgIlwwIgorCQk7CisJZW51bSB7CisJCUFSR19vbmVsaW5lLAorCQlBUkdfZmFtaWx5LAorCQlBUkdfSVB2NCwKKwkJQVJHX0lQdjYsCisJCUFSR19wYWNrZXQsCisJfTsKKwlzdGF0aWMgY29uc3QgZmFtaWx5X3QgYWZfbnVtYmVyc1tdID0geyBBRl9JTkVULCBBRl9JTkVUNiwgQUZfUEFDS0VUIH07CisJaW50IGFyZzsKKworCXdoaWxlICgqYXJndikgeworCQljaGFyICpvcHQgPSAqYXJndjsKKworCQlpZiAob3B0WzBdICE9ICctJykKKwkJCWJyZWFrOworCQlvcHQrKzsKKwkJaWYgKG9wdFswXSA9PSAnLScpIHsKKwkJCW9wdCsrOworCQkJaWYgKCFvcHRbMF0pIHsgLyogIi0tIiAqLworCQkJCWFyZ3YrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlhcmcgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGlwX2NvbW1vbl9jb21tYW5kcywgb3B0KTsKKwkJaWYgKGFyZyA8IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChhcmcgPT0gQVJHX29uZWxpbmUpIHsKKwkJCW9uZWxpbmUgPSAxOworCQkJYXJndisrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFyZyA9PSBBUkdfZmFtaWx5KSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBmYW1pbGllc1tdIEFMSUdOMSA9CisJCQkJImluZXQiICJcMCIgImluZXQ2IiAiXDAiICJsaW5rIiAiXDAiOworCQkJYXJndisrOworCQkJaWYgKCEqYXJndikKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlhcmcgPSBpbmRleF9pbl9zdHJpbmdzKGZhbWlsaWVzLCAqYXJndik7CisJCQlpZiAoYXJnIDwgMCkKKwkJCQlpbnZhcmcoKmFyZ3YsICJwcm90b2NvbCBmYW1pbHkiKTsKKwkJCS8qIG5vdyBhcmcgPT0gMCwgMSBvciAyICovCisJCX0gZWxzZSB7CisJCQlhcmcgLT0gQVJHX0lQdjQ7CisJCQkvKiBub3cgYXJnID09IDAsIDEgb3IgMiAqLworCQl9CisJCXByZWZlcnJlZF9mYW1pbHkgPSBhZl9udW1iZXJzW2FyZ107CisJCWFyZ3YrKzsKKwl9CisJX1NMXyA9IG9uZWxpbmUgPyAnXFwnIDogJ1xuJzsKKwlyZXR1cm4gYXJndjsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGFkZHJlc3MuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGFkZHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc0OGU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwYWRkcmVzcy5jCkBAIC0wLDAgKzEsNzY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICogTGFzemxvIFZhbGtvIDx2YWxrb0BsaW51eC5rYXJpbnRoeS5odT4gOTkwMjIzOiBhZGRyZXNzIGxhYmVsIG11c3QgYmUgemVybyB0ZXJtaW5hdGVkCisgKi8KKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJpcF9jb21tb24uaCIgIC8qICNpbmNsdWRlICJsaWJiYi5oIiBpcyBpbnNpZGUgKi8KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpZm5kZWYgSUZGX0xPV0VSX1VQCisvKiBmcm9tIGxpbnV4L2lmLmggKi8KKyNkZWZpbmUgSUZGX0xPV0VSX1VQICAweDEwMDAwICAvKiBkcml2ZXIgc2lnbmFscyBMMSB1cCAqLworI2VuZGlmCisKK3N0cnVjdCBmaWx0ZXJfdCB7CisJY2hhciAqbGFiZWw7CisJY2hhciAqZmx1c2hiOworCXN0cnVjdCBydG5sX2hhbmRsZSAqcnRoOworCWludCBzY29wZSwgc2NvcGVtYXNrOworCWludCBmbGFncywgZmxhZ21hc2s7CisJaW50IGZsdXNocDsKKwlpbnQgZmx1c2hlOworCWludCBpZmluZGV4OworCWZhbWlseV90IGZhbWlseTsKKwlzbWFsbGludCBzaG93cXVldWU7CisJc21hbGxpbnQgb25lbGluZTsKKwlzbWFsbGludCB1cDsKKwlzbWFsbGludCBmbHVzaGVkOworCWluZXRfcHJlZml4IHBmeDsKK30gRklYX0FMSUFTSU5HOwordHlwZWRlZiBzdHJ1Y3QgZmlsdGVyX3QgZmlsdGVyX3Q7CisKKyNkZWZpbmUgR19maWx0ZXIgKCooZmlsdGVyX3QqKSZiYl9jb21tb25fYnVmc2l6MSkKKworCitzdGF0aWMgdm9pZCBwcmludF9saW5rX2ZsYWdzKHVuc2lnbmVkIGZsYWdzLCB1bnNpZ25lZCBtZG93bikKK3sKKwlzdGF0aWMgY29uc3QgaW50IGZsYWdfbWFza3NbXSA9IHsKKwkJSUZGX0xPT1BCQUNLLCBJRkZfQlJPQURDQVNULCBJRkZfUE9JTlRPUE9JTlQsCisJCUlGRl9NVUxUSUNBU1QsIElGRl9OT0FSUCwgSUZGX1VQLCBJRkZfTE9XRVJfVVAgfTsKKwlzdGF0aWMgY29uc3QgY2hhciBmbGFnX2xhYmVsc1tdIEFMSUdOMSA9CisJCSJMT09QQkFDS1wwIiJCUk9BRENBU1RcMCIiUE9JTlRPUE9JTlRcMCIKKwkJIk1VTFRJQ0FTVFwwIiJOT0FSUFwwIiJVUFwwIiJMT1dFUl9VUFwwIjsKKworCWJiX3B1dGNoYXIoJzwnKTsKKwlpZiAoZmxhZ3MgJiBJRkZfVVAgJiYgIShmbGFncyAmIElGRl9SVU5OSU5HKSkKKwkJcHJpbnRmKCJOTy1DQVJSSUVSLCIpOworCWZsYWdzICY9IH5JRkZfUlVOTklORzsKKyNpZiAwCisJX1BGKEFMTE1VTFRJKTsKKwlfUEYoUFJPTUlTQyk7CisJX1BGKE1BU1RFUik7CisJX1BGKFNMQVZFKTsKKwlfUEYoREVCVUcpOworCV9QRihEWU5BTUlDKTsKKwlfUEYoQVVUT01FRElBKTsKKwlfUEYoUE9SVFNFTCk7CisJX1BGKE5PVFJBSUxFUlMpOworI2VuZGlmCisJZmxhZ3MgPSBwcmludF9mbGFnc19zZXBhcmF0ZWQoZmxhZ19tYXNrcywgZmxhZ19sYWJlbHMsIGZsYWdzLCAiLCIpOworCWlmIChmbGFncykKKwkJcHJpbnRmKCIleCIsIGZsYWdzKTsKKwlpZiAobWRvd24pCisJCXByaW50ZigiLE0tRE9XTiIpOworCXByaW50ZigiPiAiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcXVldWVsZW4oY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBzOworCisJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHMgPCAwKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBuYW1lKTsKKwlpZiAoaW9jdGxfb3Jfd2FybihzLCBTSU9DR0lGVFhRTEVOLCAmaWZyKSA8IDApIHsKKwkJY2xvc2Uocyk7CisJCXJldHVybjsKKwl9CisJY2xvc2Uocyk7CisKKwlpZiAoaWZyLmlmcl9xbGVuKQorCQlwcmludGYoInFsZW4gJWQiLCBpZnIuaWZyX3FsZW4pOworfQorCitzdGF0aWMgTk9JTkxJTkUgaW50IHByaW50X2xpbmtpbmZvKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSBOTE1TR19EQVRBKG4pOworCXN0cnVjdCBydGF0dHIgKnRiW0lGTEFfTUFYKzFdOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXTElOSyAmJiBuLT5ubG1zZ190eXBlICE9IFJUTV9ERUxMSU5LKQorCQlyZXR1cm4gMDsKKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKEdfZmlsdGVyLmlmaW5kZXggJiYgaWZpLT5pZmlfaW5kZXggIT0gR19maWx0ZXIuaWZpbmRleCkKKwkJcmV0dXJuIDA7CisJaWYgKEdfZmlsdGVyLnVwICYmICEoaWZpLT5pZmlfZmxhZ3MgJiBJRkZfVVApKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoaWZpKSwgbGVuKTsKKwlpZiAodGJbSUZMQV9JRk5BTUVdID09IE5VTEwpIHsKKwkJYmJfZXJyb3JfbXNnKCJuaWwgaWZuYW1lIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKEdfZmlsdGVyLmxhYmVsCisJICYmICghR19maWx0ZXIuZmFtaWx5IHx8IEdfZmlsdGVyLmZhbWlseSA9PSBBRl9QQUNLRVQpCisJICYmIGZubWF0Y2goR19maWx0ZXIubGFiZWwsIFJUQV9EQVRBKHRiW0lGTEFfSUZOQU1FXSksIDApCisJKSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxMSU5LKQorCQlwcmludGYoIkRlbGV0ZWQgIik7CisKKwlwcmludGYoIiVkOiAlcyIsIGlmaS0+aWZpX2luZGV4LAorCQkvKnRiW0lGTEFfSUZOQU1FXSA/IChjaGFyKilSVEFfREFUQSh0YltJRkxBX0lGTkFNRV0pIDogIjxuaWw+IiAtIHdlIGNoZWNrZWQgdGJbSUZMQV9JRk5BTUVdIGFib3ZlKi8KKwkJKGNoYXIqKVJUQV9EQVRBKHRiW0lGTEFfSUZOQU1FXSkKKwkpOworCisJeworCQl1bnNpZ25lZCBtX2ZsYWcgPSAwOworCQlpZiAodGJbSUZMQV9MSU5LXSkgeworCQkJU1BSSU5UX0JVRihiMSk7CisJCQlpbnQgaWZsaW5rID0gKihpbnQqKVJUQV9EQVRBKHRiW0lGTEFfTElOS10pOworCQkJaWYgKGlmbGluayA9PSAwKQorCQkJCXByaW50ZigiQE5PTkU6ICIpOworCQkJZWxzZSB7CisJCQkJcHJpbnRmKCJAJXM6ICIsIGxsX2lkeF9uMmEoaWZsaW5rLCBiMSkpOworCQkJCW1fZmxhZyA9IGxsX2luZGV4X3RvX2ZsYWdzKGlmbGluayk7CisJCQkJbV9mbGFnID0gIShtX2ZsYWcgJiBJRkZfVVApOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRmKCI6ICIpOworCQl9CisJCXByaW50X2xpbmtfZmxhZ3MoaWZpLT5pZmlfZmxhZ3MsIG1fZmxhZyk7CisJfQorCisJaWYgKHRiW0lGTEFfTVRVXSkKKwkJcHJpbnRmKCJtdHUgJXUgIiwgKihpbnQqKVJUQV9EQVRBKHRiW0lGTEFfTVRVXSkpOworCWlmICh0YltJRkxBX1FESVNDXSkKKwkJcHJpbnRmKCJxZGlzYyAlcyAiLCAoY2hhciopUlRBX0RBVEEodGJbSUZMQV9RRElTQ10pKTsKKyNpZmRlZiBJRkxBX01BU1RFUgorCWlmICh0YltJRkxBX01BU1RFUl0pIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCXByaW50ZigibWFzdGVyICVzICIsIGxsX2lkeF9uMmEoKihpbnQqKVJUQV9EQVRBKHRiW0lGTEFfTUFTVEVSXSksIGIxKSk7CisJfQorI2VuZGlmCisvKiBJRkxBX09QRVJTVEFURSB3YXMgYWRkZWQgdG8ga2VybmVsIHdpdGggdGhlIHNhbWUgY29tbWl0IGFzIElGRl9ET1JNQU5UICovCisjaWZkZWYgSUZGX0RPUk1BTlQKKwlpZiAodGJbSUZMQV9PUEVSU1RBVEVdKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIG9wZXJzdGF0ZV9sYWJlbHNbXSBBTElHTjEgPQorCQkJIlVOS05PV05cMCIiTk9UUFJFU0VOVFwwIiJET1dOXDAiIkxPV0VSTEFZRVJET1dOXDAiCisJCQkiVEVTVElOR1wwIiJET1JNQU5UXDAiIlVQXDAiOworCQlwcmludGYoInN0YXRlICVzICIsIG50aF9zdHJpbmcob3BlcnN0YXRlX2xhYmVscywKKwkJCQkJKih1aW50OF90ICopUlRBX0RBVEEodGJbSUZMQV9PUEVSU1RBVEVdKSkpOworCX0KKyNlbmRpZgorCWlmIChHX2ZpbHRlci5zaG93cXVldWUpCisJCXByaW50X3F1ZXVlbGVuKChjaGFyKilSVEFfREFUQSh0YltJRkxBX0lGTkFNRV0pKTsKKworCWlmICghR19maWx0ZXIuZmFtaWx5IHx8IEdfZmlsdGVyLmZhbWlseSA9PSBBRl9QQUNLRVQpIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCXByaW50ZigiJWMgICAgbGluay8lcyAiLCBfU0xfLCBsbF90eXBlX24yYShpZmktPmlmaV90eXBlLCBiMSkpOworCisJCWlmICh0YltJRkxBX0FERFJFU1NdKSB7CisJCQlmcHV0cyhsbF9hZGRyX24yYShSVEFfREFUQSh0YltJRkxBX0FERFJFU1NdKSwKKwkJCQkJCSAgICAgIFJUQV9QQVlMT0FEKHRiW0lGTEFfQUREUkVTU10pLAorCQkJCQkJICAgICAgaWZpLT5pZmlfdHlwZSwKKwkJCQkJCSAgICAgIGIxLCBzaXplb2YoYjEpKSwgc3Rkb3V0KTsKKwkJfQorCQlpZiAodGJbSUZMQV9CUk9BRENBU1RdKSB7CisJCQlpZiAoaWZpLT5pZmlfZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpCisJCQkJcHJpbnRmKCIgcGVlciAiKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiBicmQgIik7CisJCQlmcHV0cyhsbF9hZGRyX24yYShSVEFfREFUQSh0YltJRkxBX0JST0FEQ0FTVF0pLAorCQkJCQkJICAgICAgUlRBX1BBWUxPQUQodGJbSUZMQV9CUk9BRENBU1RdKSwKKwkJCQkJCSAgICAgIGlmaS0+aWZpX3R5cGUsCisJCQkJCQkgICAgICBiMSwgc2l6ZW9mKGIxKSksIHN0ZG91dCk7CisJCX0KKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKwkvKmZmbHVzaF9hbGwoKTsqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsdXNoX3VwZGF0ZSh2b2lkKQoreworCWlmIChydG5sX3NlbmQoR19maWx0ZXIucnRoLCBHX2ZpbHRlci5mbHVzaGIsIEdfZmlsdGVyLmZsdXNocCkgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHNlbmQgZmx1c2ggcmVxdWVzdCIpOworCQlyZXR1cm4gLTE7CisJfQorCUdfZmlsdGVyLmZsdXNocCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHByaW50X2FkZHJpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvIFVOVVNFRF9QQVJBTSwKKwkJc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBpZmFkZHJtc2cgKmlmYSA9IE5MTVNHX0RBVEEobik7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICogcnRhX3RiW0lGQV9NQVgrMV07CisJY2hhciBhYnVmWzI1Nl07CisJU1BSSU5UX0JVRihiMSk7CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXQUREUiAmJiBuLT5ubG1zZ190eXBlICE9IFJUTV9ERUxBRERSKQorCQlyZXR1cm4gMDsKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZhKSk7CisJaWYgKGxlbiA8IDApIHsKKwkJYmJfZXJyb3JfbXNnKCJ3cm9uZyBubG1zZyBsZW4gJWQiLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKEdfZmlsdGVyLmZsdXNoYiAmJiBuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdBRERSKQorCQlyZXR1cm4gMDsKKworCW1lbXNldChydGFfdGIsIDAsIHNpemVvZihydGFfdGIpKTsKKwlwYXJzZV9ydGF0dHIocnRhX3RiLCBJRkFfTUFYLCBJRkFfUlRBKGlmYSksIG4tPm5sbXNnX2xlbiAtIE5MTVNHX0xFTkdUSChzaXplb2YoKmlmYSkpKTsKKworCWlmICghcnRhX3RiW0lGQV9MT0NBTF0pCisJCXJ0YV90YltJRkFfTE9DQUxdID0gcnRhX3RiW0lGQV9BRERSRVNTXTsKKwlpZiAoIXJ0YV90YltJRkFfQUREUkVTU10pCisJCXJ0YV90YltJRkFfQUREUkVTU10gPSBydGFfdGJbSUZBX0xPQ0FMXTsKKworCWlmIChHX2ZpbHRlci5pZmluZGV4ICYmIEdfZmlsdGVyLmlmaW5kZXggIT0gaWZhLT5pZmFfaW5kZXgpCisJCXJldHVybiAwOworCWlmICgoR19maWx0ZXIuc2NvcGUgXiBpZmEtPmlmYV9zY29wZSkgJiBHX2ZpbHRlci5zY29wZW1hc2spCisJCXJldHVybiAwOworCWlmICgoR19maWx0ZXIuZmxhZ3MgXiBpZmEtPmlmYV9mbGFncykgJiBHX2ZpbHRlci5mbGFnbWFzaykKKwkJcmV0dXJuIDA7CisJaWYgKEdfZmlsdGVyLmxhYmVsKSB7CisJCWNvbnN0IGNoYXIgKmxhYmVsOworCQlpZiAocnRhX3RiW0lGQV9MQUJFTF0pCisJCQlsYWJlbCA9IFJUQV9EQVRBKHJ0YV90YltJRkFfTEFCRUxdKTsKKwkJZWxzZQorCQkJbGFiZWwgPSBsbF9pZHhfbjJhKGlmYS0+aWZhX2luZGV4LCBiMSk7CisJCWlmIChmbm1hdGNoKEdfZmlsdGVyLmxhYmVsLCBsYWJlbCwgMCkgIT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlpZiAoR19maWx0ZXIucGZ4LmZhbWlseSkgeworCQlpZiAocnRhX3RiW0lGQV9MT0NBTF0pIHsKKwkJCWluZXRfcHJlZml4IGRzdDsKKwkJCW1lbXNldCgmZHN0LCAwLCBzaXplb2YoZHN0KSk7CisJCQlkc3QuZmFtaWx5ID0gaWZhLT5pZmFfZmFtaWx5OworCQkJbWVtY3B5KCZkc3QuZGF0YSwgUlRBX0RBVEEocnRhX3RiW0lGQV9MT0NBTF0pLCBSVEFfUEFZTE9BRChydGFfdGJbSUZBX0xPQ0FMXSkpOworCQkJaWYgKGluZXRfYWRkcl9tYXRjaCgmZHN0LCAmR19maWx0ZXIucGZ4LCBHX2ZpbHRlci5wZnguYml0bGVuKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChHX2ZpbHRlci5mbHVzaGIpIHsKKwkJc3RydWN0IG5sbXNnaGRyICpmbjsKKwkJaWYgKE5MTVNHX0FMSUdOKEdfZmlsdGVyLmZsdXNocCkgKyBuLT5ubG1zZ19sZW4gPiBHX2ZpbHRlci5mbHVzaGUpIHsKKwkJCWlmIChmbHVzaF91cGRhdGUoKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJZm4gPSAoc3RydWN0IG5sbXNnaGRyKikoR19maWx0ZXIuZmx1c2hiICsgTkxNU0dfQUxJR04oR19maWx0ZXIuZmx1c2hwKSk7CisJCW1lbWNweShmbiwgbiwgbi0+bmxtc2dfbGVuKTsKKwkJZm4tPm5sbXNnX3R5cGUgPSBSVE1fREVMQUREUjsKKwkJZm4tPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJZm4tPm5sbXNnX3NlcSA9ICsrR19maWx0ZXIucnRoLT5zZXE7CisJCUdfZmlsdGVyLmZsdXNocCA9ICgoKGNoYXIqKWZuKSArIG4tPm5sbXNnX2xlbikgLSBHX2ZpbHRlci5mbHVzaGI7CisJCUdfZmlsdGVyLmZsdXNoZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMQUREUikKKwkJcHJpbnRmKCJEZWxldGVkICIpOworCisJaWYgKEdfZmlsdGVyLm9uZWxpbmUpCisJCXByaW50ZigiJXU6ICVzIiwgaWZhLT5pZmFfaW5kZXgsIGxsX2luZGV4X3RvX25hbWUoaWZhLT5pZmFfaW5kZXgpKTsKKwlpZiAoaWZhLT5pZmFfZmFtaWx5ID09IEFGX0lORVQpCisJCXByaW50ZigiICAgIGluZXQgIik7CisJZWxzZSBpZiAoaWZhLT5pZmFfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlwcmludGYoIiAgICBpbmV0NiAiKTsKKwllbHNlCisJCXByaW50ZigiICAgIGZhbWlseSAlZCAiLCBpZmEtPmlmYV9mYW1pbHkpOworCisJaWYgKHJ0YV90YltJRkFfTE9DQUxdKSB7CisJCWZwdXRzKHJ0X2FkZHJfbjJhKGlmYS0+aWZhX2ZhbWlseSwKKwkJCQkJICAgICAgUlRBX0RBVEEocnRhX3RiW0lGQV9MT0NBTF0pLAorCQkJCQkgICAgICBhYnVmLCBzaXplb2YoYWJ1ZikpLCBzdGRvdXQpOworCisJCWlmIChydGFfdGJbSUZBX0FERFJFU1NdID09IE5VTEwKKwkJIHx8IG1lbWNtcChSVEFfREFUQShydGFfdGJbSUZBX0FERFJFU1NdKSwgUlRBX0RBVEEocnRhX3RiW0lGQV9MT0NBTF0pLCA0KSA9PSAwCisJCSkgeworCQkJcHJpbnRmKCIvJWQgIiwgaWZhLT5pZmFfcHJlZml4bGVuKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiIHBlZXIgJXMvJWQgIiwKKwkJCQlydF9hZGRyX24yYShpZmEtPmlmYV9mYW1pbHksCisJCQkJCSAgICBSVEFfREFUQShydGFfdGJbSUZBX0FERFJFU1NdKSwKKwkJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSksCisJCQkJaWZhLT5pZmFfcHJlZml4bGVuKTsKKwkJfQorCX0KKworCWlmIChydGFfdGJbSUZBX0JST0FEQ0FTVF0pIHsKKwkJcHJpbnRmKCJicmQgJXMgIiwKKwkJCXJ0X2FkZHJfbjJhKGlmYS0+aWZhX2ZhbWlseSwKKwkJCQkgICAgUlRBX0RBVEEocnRhX3RiW0lGQV9CUk9BRENBU1RdKSwKKwkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJfQorCWlmIChydGFfdGJbSUZBX0FOWUNBU1RdKSB7CisJCXByaW50ZigiYW55ICVzICIsCisJCQlydF9hZGRyX24yYShpZmEtPmlmYV9mYW1pbHksCisJCQkJICAgIFJUQV9EQVRBKHJ0YV90YltJRkFfQU5ZQ0FTVF0pLAorCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwl9CisJcHJpbnRmKCJzY29wZSAlcyAiLCBydG5sX3J0c2NvcGVfbjJhKGlmYS0+aWZhX3Njb3BlLCBiMSkpOworCWlmIChpZmEtPmlmYV9mbGFncyAmIElGQV9GX1NFQ09OREFSWSkgeworCQlpZmEtPmlmYV9mbGFncyAmPSB+SUZBX0ZfU0VDT05EQVJZOworCQlwcmludGYoInNlY29uZGFyeSAiKTsKKwl9CisJaWYgKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfVEVOVEFUSVZFKSB7CisJCWlmYS0+aWZhX2ZsYWdzICY9IH5JRkFfRl9URU5UQVRJVkU7CisJCXByaW50ZigidGVudGF0aXZlICIpOworCX0KKwlpZiAoaWZhLT5pZmFfZmxhZ3MgJiBJRkFfRl9ERVBSRUNBVEVEKSB7CisJCWlmYS0+aWZhX2ZsYWdzICY9IH5JRkFfRl9ERVBSRUNBVEVEOworCQlwcmludGYoImRlcHJlY2F0ZWQgIik7CisJfQorCWlmICghKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfUEVSTUFORU5UKSkgeworCQlwcmludGYoImR5bmFtaWMgIik7CisJfSBlbHNlCisJCWlmYS0+aWZhX2ZsYWdzICY9IH5JRkFfRl9QRVJNQU5FTlQ7CisJaWYgKGlmYS0+aWZhX2ZsYWdzKQorCQlwcmludGYoImZsYWdzICUwMnggIiwgaWZhLT5pZmFfZmxhZ3MpOworCWlmIChydGFfdGJbSUZBX0xBQkVMXSkKKwkJZnB1dHMoKGNoYXIqKVJUQV9EQVRBKHJ0YV90YltJRkFfTEFCRUxdKSwgc3Rkb3V0KTsKKwlpZiAocnRhX3RiW0lGQV9DQUNIRUlORk9dKSB7CisJCXN0cnVjdCBpZmFfY2FjaGVpbmZvICpjaSA9IFJUQV9EQVRBKHJ0YV90YltJRkFfQ0FDSEVJTkZPXSk7CisJCWNoYXIgYnVmWzEyOF07CisJCWJiX3B1dGNoYXIoX1NMXyk7CisJCWlmIChjaS0+aWZhX3ZhbGlkID09IDB4RkZGRkZGRkZVKQorCQkJc3ByaW50ZihidWYsICJ2YWxpZF9sZnQgZm9yZXZlciIpOworCQllbHNlCisJCQlzcHJpbnRmKGJ1ZiwgInZhbGlkX2xmdCAlZHNlYyIsIGNpLT5pZmFfdmFsaWQpOworCQlpZiAoY2ktPmlmYV9wcmVmZXJlZCA9PSAweEZGRkZGRkZGVSkKKwkJCXNwcmludGYoYnVmK3N0cmxlbihidWYpLCAiIHByZWZlcnJlZF9sZnQgZm9yZXZlciIpOworCQllbHNlCisJCQlzcHJpbnRmKGJ1ZitzdHJsZW4oYnVmKSwgIiBwcmVmZXJyZWRfbGZ0ICVkc2VjIiwgY2ktPmlmYV9wcmVmZXJlZCk7CisJCXByaW50ZigiICAgICAgICVzIiwgYnVmKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKwkvKmZmbHVzaF9hbGwoKTsqLworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBubG1zZ19saXN0IHsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqbmV4dDsKKwlzdHJ1Y3Qgbmxtc2doZHIgICBoOworfTsKKworc3RhdGljIGludCBwcmludF9zZWxlY3RlZF9hZGRyaW5mbyhpbnQgaWZpbmRleCwgc3RydWN0IG5sbXNnX2xpc3QgKmFpbmZvKQoreworCWZvciAoOyBhaW5mbzsgYWluZm8gPSBhaW5mby0+bmV4dCkgeworCQlzdHJ1Y3Qgbmxtc2doZHIgKm4gPSAmYWluZm8tPmg7CisJCXN0cnVjdCBpZmFkZHJtc2cgKmlmYSA9IE5MTVNHX0RBVEEobik7CisKKwkJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV0FERFIpCisJCQljb250aW51ZTsKKwkJaWYgKG4tPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2YoaWZhKSkpCisJCQlyZXR1cm4gLTE7CisJCWlmIChpZmEtPmlmYV9pbmRleCAhPSBpZmluZGV4CisJCSB8fCAoR19maWx0ZXIuZmFtaWx5ICYmIEdfZmlsdGVyLmZhbWlseSAhPSBpZmEtPmlmYV9mYW1pbHkpCisJCSkgeworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRfYWRkcmluZm8oTlVMTCwgbiwgTlVMTCk7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHN0b3JlX25sbXNnKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqKmxpbmZvID0gKHN0cnVjdCBubG1zZ19saXN0KiopYXJnOworCXN0cnVjdCBubG1zZ19saXN0ICpoOworCXN0cnVjdCBubG1zZ19saXN0ICoqbHA7CisKKwloID0geHphbGxvYyhuLT5ubG1zZ19sZW4gKyBzaXplb2Yodm9pZCopKTsKKworCW1lbWNweSgmaC0+aCwgbiwgbi0+bmxtc2dfbGVuKTsKKwkvKmgtPm5leHQgPSBOVUxMOyAtIHh6YWxsb2MgZGlkIGl0ICovCisKKwlmb3IgKGxwID0gbGluZm87ICpscDsgbHAgPSAmKCpscCktPm5leHQpCisJCWNvbnRpbnVlOworCSpscCA9IGg7CisKKwlsbF9yZW1lbWJlcl9pbmRleCh3aG8sIG4sIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcGFkZHJfcmVzZXRfZmlsdGVyKGludCBfb25lbGluZSkKK3sKKwltZW1zZXQoJkdfZmlsdGVyLCAwLCBzaXplb2YoR19maWx0ZXIpKTsKKwlHX2ZpbHRlci5vbmVsaW5lID0gX29uZWxpbmU7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK2ludCBGQVNUX0ZVTkMgaXBhZGRyX2xpc3Rfb3JfZmx1c2goY2hhciAqKmFyZ3YsIGludCBmbHVzaCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBvcHRpb25bXSBBTElHTjEgPSAidG9cMCIic2NvcGVcMCIidXBcMCIibGFiZWxcMCIiZGV2XDAiOworCisJc3RydWN0IG5sbXNnX2xpc3QgKmxpbmZvID0gTlVMTDsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqYWluZm8gPSBOVUxMOworCXN0cnVjdCBubG1zZ19saXN0ICpsOworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJY2hhciAqZmlsdGVyX2RldiA9IE5VTEw7CisJaW50IG5vX2xpbmsgPSAwOworCisJaXBhZGRyX3Jlc2V0X2ZpbHRlcihvbmVsaW5lKTsKKwlHX2ZpbHRlci5zaG93cXVldWUgPSAxOworCisJaWYgKEdfZmlsdGVyLmZhbWlseSA9PSBBRl9VTlNQRUMpCisJCUdfZmlsdGVyLmZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisKKwlpZiAoZmx1c2gpIHsKKwkJaWYgKCEqYXJndikgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlcXVpcmVzX2FyZywgImZsdXNoIik7CisJCX0KKwkJaWYgKEdfZmlsdGVyLmZhbWlseSA9PSBBRl9QQUNLRVQpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmbHVzaCBsaW5rIGFkZHJlc3NlcyIpOworCQl9CisJfQorCisJd2hpbGUgKCphcmd2KSB7CisJCWNvbnN0IHNtYWxsdWludCBrZXkgPSBpbmRleF9pbl9zdHJpbmdzKG9wdGlvbiwgKmFyZ3YpOworCQlpZiAoa2V5ID09IDApIHsgLyogdG8gKi8KKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZHX2ZpbHRlci5wZngsICphcmd2LCBHX2ZpbHRlci5mYW1pbHkpOworCQkJaWYgKEdfZmlsdGVyLmZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJCQlHX2ZpbHRlci5mYW1pbHkgPSBHX2ZpbHRlci5wZnguZmFtaWx5OworCQkJfQorCQl9IGVsc2UgaWYgKGtleSA9PSAxKSB7IC8qIHNjb3BlICovCisJCQl1aW50MzJfdCBzY29wZSA9IDA7CisJCQlORVhUX0FSRygpOworCQkJR19maWx0ZXIuc2NvcGVtYXNrID0gLTE7CisJCQlpZiAocnRubF9ydHNjb3BlX2Eybigmc2NvcGUsICphcmd2KSkgeworCQkJCWlmIChzdHJjbXAoKmFyZ3YsICJhbGwiKSAhPSAwKSB7CisJCQkJCWludmFyZygqYXJndiwgInNjb3BlIik7CisJCQkJfQorCQkJCXNjb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKwkJCQlHX2ZpbHRlci5zY29wZW1hc2sgPSAwOworCQkJfQorCQkJR19maWx0ZXIuc2NvcGUgPSBzY29wZTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gMikgeyAvKiB1cCAqLworCQkJR19maWx0ZXIudXAgPSAxOworCQl9IGVsc2UgaWYgKGtleSA9PSAzKSB7IC8qIGxhYmVsICovCisJCQlORVhUX0FSRygpOworCQkJR19maWx0ZXIubGFiZWwgPSAqYXJndjsKKwkJfSBlbHNlIHsKKwkJCWlmIChrZXkgPT0gNCkgLyogZGV2ICovCisJCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChmaWx0ZXJfZGV2KQorCQkJCWR1cGFyZzIoImRldiIsICphcmd2KTsKKwkJCWZpbHRlcl9kZXYgPSAqYXJndjsKKwkJfQorCQlhcmd2Kys7CisJfQorCisJeHJ0bmxfb3BlbigmcnRoKTsKKworCXhydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgcHJlZmVycmVkX2ZhbWlseSwgUlRNX0dFVExJTkspOworCXhydG5sX2R1bXBfZmlsdGVyKCZydGgsIHN0b3JlX25sbXNnLCAmbGluZm8pOworCisJaWYgKGZpbHRlcl9kZXYpIHsKKwkJR19maWx0ZXIuaWZpbmRleCA9IHhsbF9uYW1lX3RvX2luZGV4KGZpbHRlcl9kZXYpOworCX0KKworCWlmIChmbHVzaCkgeworCQljaGFyIGZsdXNoYls0MDk2LTUxMl07CisKKwkJR19maWx0ZXIuZmx1c2hiID0gZmx1c2hiOworCQlHX2ZpbHRlci5mbHVzaHAgPSAwOworCQlHX2ZpbHRlci5mbHVzaGUgPSBzaXplb2YoZmx1c2hiKTsKKwkJR19maWx0ZXIucnRoID0gJnJ0aDsKKworCQlmb3IgKDs7KSB7CisJCQl4cnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIEdfZmlsdGVyLmZhbWlseSwgUlRNX0dFVEFERFIpOworCQkJR19maWx0ZXIuZmx1c2hlZCA9IDA7CisJCQl4cnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF9hZGRyaW5mbywgTlVMTCk7CisJCQlpZiAoR19maWx0ZXIuZmx1c2hlZCA9PSAwKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoZmx1c2hfdXBkYXRlKCkgPCAwKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoR19maWx0ZXIuZmFtaWx5ICE9IEFGX1BBQ0tFVCkgeworCQl4cnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIEdfZmlsdGVyLmZhbWlseSwgUlRNX0dFVEFERFIpOworCQl4cnRubF9kdW1wX2ZpbHRlcigmcnRoLCBzdG9yZV9ubG1zZywgJmFpbmZvKTsKKwl9CisKKworCWlmIChHX2ZpbHRlci5mYW1pbHkgJiYgR19maWx0ZXIuZmFtaWx5ICE9IEFGX1BBQ0tFVCkgeworCQlzdHJ1Y3Qgbmxtc2dfbGlzdCAqKmxwOworCQlscCA9ICZsaW5mbzsKKworCQlpZiAoR19maWx0ZXIub25lbGluZSkKKwkJCW5vX2xpbmsgPSAxOworCisJCXdoaWxlICgobCA9ICpscCkgIT0gTlVMTCkgeworCQkJaW50IG9rID0gMDsKKwkJCXN0cnVjdCBpZmluZm9tc2cgKmlmaSA9IE5MTVNHX0RBVEEoJmwtPmgpOworCQkJc3RydWN0IG5sbXNnX2xpc3QgKmE7CisKKwkJCWZvciAoYSA9IGFpbmZvOyBhOyBhID0gYS0+bmV4dCkgeworCQkJCXN0cnVjdCBubG1zZ2hkciAqbiA9ICZhLT5oOworCQkJCXN0cnVjdCBpZmFkZHJtc2cgKmlmYSA9IE5MTVNHX0RBVEEobik7CisKKwkJCQlpZiAoaWZhLT5pZmFfaW5kZXggIT0gaWZpLT5pZmlfaW5kZXgKKwkJCQkgfHwgKEdfZmlsdGVyLmZhbWlseSAmJiBHX2ZpbHRlci5mYW1pbHkgIT0gaWZhLT5pZmFfZmFtaWx5KQorCQkJCSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKChHX2ZpbHRlci5zY29wZSBeIGlmYS0+aWZhX3Njb3BlKSAmIEdfZmlsdGVyLnNjb3BlbWFzaykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKChHX2ZpbHRlci5mbGFncyBeIGlmYS0+aWZhX2ZsYWdzKSAmIEdfZmlsdGVyLmZsYWdtYXNrKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoR19maWx0ZXIucGZ4LmZhbWlseSB8fCBHX2ZpbHRlci5sYWJlbCkgeworCQkJCQlzdHJ1Y3QgcnRhdHRyICp0YltJRkFfTUFYKzFdOworCQkJCQltZW1zZXQodGIsIDAsIHNpemVvZih0YikpOworCQkJCQlwYXJzZV9ydGF0dHIodGIsIElGQV9NQVgsIElGQV9SVEEoaWZhKSwgSUZBX1BBWUxPQUQobikpOworCQkJCQlpZiAoIXRiW0lGQV9MT0NBTF0pCisJCQkJCQl0YltJRkFfTE9DQUxdID0gdGJbSUZBX0FERFJFU1NdOworCisJCQkJCWlmIChHX2ZpbHRlci5wZnguZmFtaWx5ICYmIHRiW0lGQV9MT0NBTF0pIHsKKwkJCQkJCWluZXRfcHJlZml4IGRzdDsKKwkJCQkJCW1lbXNldCgmZHN0LCAwLCBzaXplb2YoZHN0KSk7CisJCQkJCQlkc3QuZmFtaWx5ID0gaWZhLT5pZmFfZmFtaWx5OworCQkJCQkJbWVtY3B5KCZkc3QuZGF0YSwgUlRBX0RBVEEodGJbSUZBX0xPQ0FMXSksIFJUQV9QQVlMT0FEKHRiW0lGQV9MT0NBTF0pKTsKKwkJCQkJCWlmIChpbmV0X2FkZHJfbWF0Y2goJmRzdCwgJkdfZmlsdGVyLnBmeCwgR19maWx0ZXIucGZ4LmJpdGxlbikpCisJCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJaWYgKEdfZmlsdGVyLmxhYmVsKSB7CisJCQkJCQlTUFJJTlRfQlVGKGIxKTsKKwkJCQkJCWNvbnN0IGNoYXIgKmxhYmVsOworCQkJCQkJaWYgKHRiW0lGQV9MQUJFTF0pCisJCQkJCQkJbGFiZWwgPSBSVEFfREFUQSh0YltJRkFfTEFCRUxdKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlsYWJlbCA9IGxsX2lkeF9uMmEoaWZhLT5pZmFfaW5kZXgsIGIxKTsKKwkJCQkJCWlmIChmbm1hdGNoKEdfZmlsdGVyLmxhYmVsLCBsYWJlbCwgMCkgIT0gMCkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCW9rID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghb2spCisJCQkJKmxwID0gbC0+bmV4dDsKKwkJCWVsc2UKKwkJCQlscCA9ICZsLT5uZXh0OworCQl9CisJfQorCisJZm9yIChsID0gbGluZm87IGw7IGwgPSBsLT5uZXh0KSB7CisJCWlmIChub19saW5rIHx8IHByaW50X2xpbmtpbmZvKCZsLT5oKSA9PSAwKSB7CisJCQlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSBOTE1TR19EQVRBKCZsLT5oKTsKKwkJCWlmIChHX2ZpbHRlci5mYW1pbHkgIT0gQUZfUEFDS0VUKQorCQkJCXByaW50X3NlbGVjdGVkX2FkZHJpbmZvKGlmaS0+aWZpX2luZGV4LCBhaW5mbyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3Njb3BlKGluZXRfcHJlZml4ICpsY2wpCit7CisJaWYgKGxjbC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJaWYgKGxjbC0+Ynl0ZWxlbiA+PSAxICYmICoodWludDhfdCopJmxjbC0+ZGF0YSA9PSAxMjcpCisJCQlyZXR1cm4gUlRfU0NPUEVfSE9TVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgaXBhZGRyX21vZGlmeShpbnQgY21kLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBvcHRpb25bXSBBTElHTjEgPQorCQkicGVlclwwIiJyZW1vdGVcMCIiYnJvYWRjYXN0XDAiImJyZFwwIgorCQkiYW55Y2FzdFwwIiJzY29wZVwwIiJkZXZcMCIibGFiZWxcMCIibG9jYWxcMCI7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgIG47CisJCXN0cnVjdCBpZmFkZHJtc2cgaWZhOworCQljaGFyICAgICAgICAgICAgIGJ1ZlsyNTZdOworCX0gcmVxOworCWNoYXIgKmQgPSBOVUxMOworCWNoYXIgKmwgPSBOVUxMOworCWluZXRfcHJlZml4IGxjbDsKKwlpbmV0X3ByZWZpeCBwZWVyOworCWludCBsb2NhbF9sZW4gPSAwOworCWludCBwZWVyX2xlbiA9IDA7CisJaW50IGJyZF9sZW4gPSAwOworCWludCBhbnlfbGVuID0gMDsKKwlib29sIHNjb3BlZCA9IDA7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLmlmYS5pZmFfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCXdoaWxlICgqYXJndikgeworCQljb25zdCBzbWFsbHVpbnQgYXJnID0gaW5kZXhfaW5fc3RyaW5ncyhvcHRpb24sICphcmd2KTsKKwkJaWYgKGFyZyA8PSAxKSB7IC8qIHBlZXIsIHJlbW90ZSAqLworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKHBlZXJfbGVuKSB7CisJCQkJZHVwYXJnKCJwZWVyIiwgKmFyZ3YpOworCQkJfQorCQkJZ2V0X3ByZWZpeCgmcGVlciwgKmFyZ3YsIHJlcS5pZmEuaWZhX2ZhbWlseSk7CisJCQlwZWVyX2xlbiA9IHBlZXIuYnl0ZWxlbjsKKwkJCWlmIChyZXEuaWZhLmlmYV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJcmVxLmlmYS5pZmFfZmFtaWx5ID0gcGVlci5mYW1pbHk7CisJCQl9CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZBX0FERFJFU1MsICZwZWVyLmRhdGEsIHBlZXIuYnl0ZWxlbik7CisJCQlyZXEuaWZhLmlmYV9wcmVmaXhsZW4gPSBwZWVyLmJpdGxlbjsKKwkJfSBlbHNlIGlmIChhcmcgPD0gMykgeyAvKiBicm9hZGNhc3QsIGJyZCAqLworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoYnJkX2xlbikgeworCQkJCWR1cGFyZygiYnJvYWRjYXN0IiwgKmFyZ3YpOworCQkJfQorCQkJaWYgKExPTkVfQ0hBUigqYXJndiwgJysnKSkgeworCQkJCWJyZF9sZW4gPSAtMTsKKwkJCX0gZWxzZSBpZiAoTE9ORV9EQVNIKCphcmd2KSkgeworCQkJCWJyZF9sZW4gPSAtMjsKKwkJCX0gZWxzZSB7CisJCQkJZ2V0X2FkZHIoJmFkZHIsICphcmd2LCByZXEuaWZhLmlmYV9mYW1pbHkpOworCQkJCWlmIChyZXEuaWZhLmlmYV9mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCQlyZXEuaWZhLmlmYV9mYW1pbHkgPSBhZGRyLmZhbWlseTsKKwkJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZBX0JST0FEQ0FTVCwgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJCQlicmRfbGVuID0gYWRkci5ieXRlbGVuOworCQkJfQorCQl9IGVsc2UgaWYgKGFyZyA9PSA0KSB7IC8qIGFueWNhc3QgKi8KKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGFueV9sZW4pIHsKKwkJCQlkdXBhcmcoImFueWNhc3QiLCAqYXJndik7CisJCQl9CisJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIHJlcS5pZmEuaWZhX2ZhbWlseSk7CisJCQlpZiAocmVxLmlmYS5pZmFfZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQkJCXJlcS5pZmEuaWZhX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJfQorCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9BTllDQVNULCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQkJYW55X2xlbiA9IGFkZHIuYnl0ZWxlbjsKKwkJfSBlbHNlIGlmIChhcmcgPT0gNSkgeyAvKiBzY29wZSAqLworCQkJdWludDMyX3Qgc2NvcGUgPSAwOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX3J0c2NvcGVfYTJuKCZzY29wZSwgKmFyZ3YpKSB7CisJCQkJaW52YXJnKCphcmd2LCAic2NvcGUiKTsKKwkJCX0KKwkJCXJlcS5pZmEuaWZhX3Njb3BlID0gc2NvcGU7CisJCQlzY29wZWQgPSAxOworCQl9IGVsc2UgaWYgKGFyZyA9PSA2KSB7IC8qIGRldiAqLworCQkJTkVYVF9BUkcoKTsKKwkJCWQgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChhcmcgPT0gNykgeyAvKiBsYWJlbCAqLworCQkJTkVYVF9BUkcoKTsKKwkJCWwgPSAqYXJndjsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfTEFCRUwsIGwsIHN0cmxlbihsKSArIDEpOworCQl9IGVsc2UgeworCQkJaWYgKGFyZyA9PSA4KSAvKiBsb2NhbCAqLworCQkJCU5FWFRfQVJHKCk7CisJCQlpZiAobG9jYWxfbGVuKSB7CisJCQkJZHVwYXJnMigibG9jYWwiLCAqYXJndik7CisJCQl9CisJCQlnZXRfcHJlZml4KCZsY2wsICphcmd2LCByZXEuaWZhLmlmYV9mYW1pbHkpOworCQkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJCQlyZXEuaWZhLmlmYV9mYW1pbHkgPSBsY2wuZmFtaWx5OworCQkJfQorCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9MT0NBTCwgJmxjbC5kYXRhLCBsY2wuYnl0ZWxlbik7CisJCQlsb2NhbF9sZW4gPSBsY2wuYnl0ZWxlbjsKKwkJfQorCQlhcmd2Kys7CisJfQorCisJaWYgKCFkKSB7CisJCS8qIFRoZXJlIHdhcyBubyAiZGV2IElGQUNFIiwgYnV0IHdlIG5lZWQgdGhhdCAqLworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibmVlZCBcImRldiBJRkFDRVwiIik7CisJfQorCWlmIChsICYmIHN0cm5jbXAoZCwgbCwgc3RybGVuKGQpKSAhPSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJcImRldlwiICglcykgbXVzdCBtYXRjaCBcImxhYmVsXCIgKCVzKSIsIGQsIGwpOworCX0KKworCWlmIChwZWVyX2xlbiA9PSAwICYmIGxvY2FsX2xlbiAmJiBjbWQgIT0gUlRNX0RFTEFERFIpIHsKKwkJcGVlciA9IGxjbDsKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9BRERSRVNTLCAmbGNsLmRhdGEsIGxjbC5ieXRlbGVuKTsKKwl9CisJaWYgKHJlcS5pZmEuaWZhX3ByZWZpeGxlbiA9PSAwKQorCQlyZXEuaWZhLmlmYV9wcmVmaXhsZW4gPSBsY2wuYml0bGVuOworCisJaWYgKGJyZF9sZW4gPCAwICYmIGNtZCAhPSBSVE1fREVMQUREUikgeworCQlpbmV0X3ByZWZpeCBicmQ7CisJCWludCBpOworCQlpZiAocmVxLmlmYS5pZmFfZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJicm9hZGNhc3QgY2FuIGJlIHNldCBvbmx5IGZvciBJUHY0IGFkZHJlc3NlcyIpOworCQl9CisJCWJyZCA9IHBlZXI7CisJCWlmIChicmQuYml0bGVuIDw9IDMwKSB7CisJCQlmb3IgKGk9MzE7IGk+PWJyZC5iaXRsZW47IGktLSkgeworCQkJCWlmIChicmRfbGVuID09IC0xKQorCQkJCQlicmQuZGF0YVswXSB8PSBodG9ubCgxPDwoMzEtaSkpOworCQkJCWVsc2UKKwkJCQkJYnJkLmRhdGFbMF0gJj0gfmh0b25sKDE8PCgzMS1pKSk7CisJCQl9CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZBX0JST0FEQ0FTVCwgJmJyZC5kYXRhLCBicmQuYnl0ZWxlbik7CisJCQlicmRfbGVuID0gYnJkLmJ5dGVsZW47CisJCX0KKwl9CisJaWYgKCFzY29wZWQgJiYgY21kICE9IFJUTV9ERUxBRERSKQorCQlyZXEuaWZhLmlmYV9zY29wZSA9IGRlZmF1bHRfc2NvcGUoJmxjbCk7CisKKwl4cnRubF9vcGVuKCZydGgpOworCisJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwlyZXEuaWZhLmlmYV9pbmRleCA9IHhsbF9uYW1lX3RvX2luZGV4KGQpOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkKKwkJcmV0dXJuIDI7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworaW50IEZBU1RfRlVOQyBkb19pcGFkZHIoY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgY29tbWFuZHNbXSBBTElHTjEgPQorCQkiYWRkXDAiImRlbGV0ZVwwIiJsaXN0XDAiInNob3dcMCIibHN0XDAiImZsdXNoXDAiOworCXNtYWxsdWludCBjbWQgPSAyOworCWlmICgqYXJndikgeworCQljbWQgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGNvbW1hbmRzLCAqYXJndik7CisJCWlmIChjbWQgPiA1KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQlhcmd2Kys7CisJCWlmIChjbWQgPD0gMSkKKwkJCXJldHVybiBpcGFkZHJfbW9kaWZ5KChjbWQgPT0gMCkgPyBSVE1fTkVXQUREUiA6IFJUTV9ERUxBRERSLCBhcmd2KTsKKwl9CisJLyogMiA9PSBsaXN0LCAzID09IHNob3csIDQgPT0gbHN0ICovCisJcmV0dXJuIGlwYWRkcl9saXN0X29yX2ZsdXNoKGFyZ3YsIGNtZCA9PSA1KTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGxpbmsuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQyMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwbGluay5jCkBAIC0wLDAgKzEsMzg0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiICAvKiAjaW5jbHVkZSAibGliYmIuaCIgaXMgaW5zaWRlICovCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaWZuZGVmIElGTEFfTElOS0lORk8KKyMgZGVmaW5lIElGTEFfTElOS0lORk8gMTgKKyMgZGVmaW5lIElGTEFfSU5GT19LSU5EIDEKKyNlbmRpZgorCisvKiB0YWtlbiBmcm9tIGxpbnV4L3NvY2tpb3MuaCAqLworI2RlZmluZSBTSU9DU0lGTkFNRSAgMHg4OTIzICAvKiBzZXQgaW50ZXJmYWNlIG5hbWUgKi8KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQgZ2V0X2N0bF9mZCh2b2lkKQoreworCWludCBmZDsKKworCWZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChmZCA+PSAwKQorCQlyZXR1cm4gZmQ7CisJZmQgPSBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQgPj0gMCkKKwkJcmV0dXJuIGZkOworCXJldHVybiB4c29ja2V0KFBGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkIGRvX2NoZmxhZ3MoY2hhciAqZGV2LCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgbWFzaykKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXYpOworCWZkID0gZ2V0X2N0bF9mZCgpOworCXhpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKTsKKwlpZiAoKGlmci5pZnJfZmxhZ3MgXiBmbGFncykgJiBtYXNrKSB7CisJCWlmci5pZnJfZmxhZ3MgJj0gfm1hc2s7CisJCWlmci5pZnJfZmxhZ3MgfD0gbWFzayAmIGZsYWdzOworCQl4aW9jdGwoZmQsIFNJT0NTSUZGTEFHUywgJmlmcik7CisJfQorCWNsb3NlKGZkKTsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkIGRvX2NoYW5nZW5hbWUoY2hhciAqZGV2LCBjaGFyICpuZXdkZXYpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgZGV2KTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmV3bmFtZSwgbmV3ZGV2KTsKKwlmZCA9IGdldF9jdGxfZmQoKTsKKwl4aW9jdGwoZmQsIFNJT0NTSUZOQU1FLCAmaWZyKTsKKwljbG9zZShmZCk7Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZCBzZXRfcWxlbihjaGFyICpkZXYsIGludCBxbGVuKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHM7CisKKwlzID0gZ2V0X2N0bF9mZCgpOworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldik7CisJaWZyLmlmcl9xbGVuID0gcWxlbjsKKwl4aW9jdGwocywgU0lPQ1NJRlRYUUxFTiwgJmlmcik7CisJY2xvc2Uocyk7Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZCBzZXRfbXR1KGNoYXIgKmRldiwgaW50IG10dSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBzOworCisJcyA9IGdldF9jdGxfZmQoKTsKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXYpOworCWlmci5pZnJfbXR1ID0gbXR1OworCXhpb2N0bChzLCBTSU9DU0lGTVRVLCAmaWZyKTsKKwljbG9zZShzKTsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQgZ2V0X2FkZHJlc3MoY2hhciAqZGV2LCBpbnQgKmh0eXBlKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJc3RydWN0IHNvY2thZGRyX2xsIG1lOworCXNvY2tsZW5fdCBhbGVuOworCWludCBzOworCisJcyA9IHhzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCAwKTsKKworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldik7CisJeGlvY3RsKHMsIFNJT0NHSUZJTkRFWCwgJmlmcik7CisKKwltZW1zZXQoJm1lLCAwLCBzaXplb2YobWUpKTsKKwltZS5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworCW1lLnNsbF9pZmluZGV4ID0gaWZyLmlmcl9pZmluZGV4OworCW1lLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0xPT1ApOworCXhiaW5kKHMsIChzdHJ1Y3Qgc29ja2FkZHIqKSZtZSwgc2l6ZW9mKG1lKSk7CisJYWxlbiA9IHNpemVvZihtZSk7CisJZ2V0c29ja25hbWUocywgKHN0cnVjdCBzb2NrYWRkciopJm1lLCAmYWxlbik7CisJLy9uZXZlciBoYXBwZW5zOgorCS8vaWYgKGdldHNvY2tuYW1lKHMsIChzdHJ1Y3Qgc29ja2FkZHIqKSZtZSwgJmFsZW4pID09IC0xKQorCS8vCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0c29ja25hbWUiKTsKKwljbG9zZShzKTsKKwkqaHR5cGUgPSBtZS5zbGxfaGF0eXBlOworCXJldHVybiBtZS5zbGxfaGFsZW47Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZCBwYXJzZV9hZGRyZXNzKGNoYXIgKmRldiwgaW50IGhhdHlwZSwgaW50IGhhbGVuLCBjaGFyICpsbGEsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCWludCBhbGVuOworCisJbWVtc2V0KGlmciwgMCwgc2l6ZW9mKCppZnIpKTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci0+aWZyX25hbWUsIGRldik7CisJaWZyLT5pZnJfaHdhZGRyLnNhX2ZhbWlseSA9IGhhdHlwZTsKKworCWFsZW4gPSBoYXR5cGUgPT0gMS8qQVJQSFJEX0VUSEVSKi8gPyAxNC8qRVRIX0hMRU4qLyA6IDE5LypJTkZJTklCQU5EX0hMRU4qLzsKKwlhbGVuID0gbGxfYWRkcl9hMm4oKHVuc2lnbmVkIGNoYXIgKikoaWZyLT5pZnJfaHdhZGRyLnNhX2RhdGEpLCBhbGVuLCBsbGEpOworCWlmIChhbGVuIDwgMCkKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCWlmIChhbGVuICE9IGhhbGVuKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3cm9uZyBhZGRyZXNzICglcykgbGVuZ3RoOiBleHBlY3RlZCAlZCBieXRlcyIsIGxsYSwgaGFsZW4pOworCX0KK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkIHNldF9hZGRyZXNzKHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgYnJkKQoreworCWludCBzOworCisJcyA9IGdldF9jdGxfZmQoKTsKKwlpZiAoYnJkKQorCQl4aW9jdGwocywgU0lPQ1NJRkhXQlJPQURDQVNULCBpZnIpOworCWVsc2UKKwkJeGlvY3RsKHMsIFNJT0NTSUZIV0FERFIsIGlmcik7CisJY2xvc2Uocyk7Cit9CisKKworc3RhdGljIHZvaWQgZGllX211c3RfYmVfb25fb2ZmKGNvbnN0IGNoYXIgKm1zZykgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBkaWVfbXVzdF9iZV9vbl9vZmYoY29uc3QgY2hhciAqbXNnKQoreworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJhcmd1bWVudCBvZiBcIiVzXCIgbXVzdCBiZSBcIm9uXCIgb3IgXCJvZmZcIiIsIG1zZyk7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgZG9fc2V0KGNoYXIgKiphcmd2KQoreworCWNoYXIgKmRldiA9IE5VTEw7CisJdWludDMyX3QgbWFzayA9IDA7CisJdWludDMyX3QgZmxhZ3MgPSAwOworCWludCBxbGVuID0gLTE7CisJaW50IG10dSA9IC0xOworCWNoYXIgKm5ld2FkZHIgPSBOVUxMOworCWNoYXIgKm5ld2JyZCA9IE5VTEw7CisJc3RydWN0IGlmcmVxIGlmcjAsIGlmcjE7CisJY2hhciAqbmV3bmFtZSA9IE5VTEw7CisJaW50IGh0eXBlLCBoYWxlbjsKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJ1cFwwIiJkb3duXDAiIm5hbWVcMCIibXR1XDAiInFsZW5cMCIibXVsdGljYXN0XDAiCisJCSJhcnBcMCIiYWRkcmVzc1wwIiJkZXZcMCI7CisJZW51bSB7IEFSR191cCA9IDAsIEFSR19kb3duLCBBUkdfbmFtZSwgQVJHX210dSwgQVJHX3FsZW4sIEFSR19tdWx0aWNhc3QsCisJCUFSR19hcnAsIEFSR19hZGRyLCBBUkdfZGV2IH07CisJc3RhdGljIGNvbnN0IGNoYXIgc3RyX29uX29mZltdIEFMSUdOMSA9ICJvblwwIiJvZmZcMCI7CisJZW51bSB7IFBBUk1fb24gPSAwLCBQQVJNX29mZiB9OworCXNtYWxsdWludCBrZXk7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJLyogc3Vic3RyaW5nIHNlYXJjaCBlbnN1cmVzIHRoYXQgZS5nLiAiYWRkciIgYW5kICJhZGRyZXNzIgorCQkgKiBhcmUgYm90aCBhY2NlcHRlZCAqLworCQlrZXkgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChrZXkgPT0gQVJHX3VwKSB7CisJCQltYXNrIHw9IElGRl9VUDsKKwkJCWZsYWdzIHw9IElGRl9VUDsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2Rvd24pIHsKKwkJCW1hc2sgfD0gSUZGX1VQOworCQkJZmxhZ3MgJj0gfklGRl9VUDsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX25hbWUpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQluZXduYW1lID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19tdHUpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobXR1ICE9IC0xKQorCQkJCWR1cGFyZygibXR1IiwgKmFyZ3YpOworCQkJbXR1ID0gZ2V0X3Vuc2lnbmVkKCphcmd2LCAibXR1Iik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19xbGVuKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHFsZW4gIT0gLTEpCisJCQkJZHVwYXJnKCJxbGVuIiwgKmFyZ3YpOworCQkJcWxlbiA9IGdldF91bnNpZ25lZCgqYXJndiwgInFsZW4iKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2FkZHIpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQluZXdhZGRyID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoa2V5ID49IEFSR19kZXYpIHsKKwkJCWlmIChrZXkgPT0gQVJHX2RldikgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoZGV2KQorCQkJCWR1cGFyZzIoImRldiIsICphcmd2KTsKKwkJCWRldiA9ICphcmd2OworCQl9IGVsc2UgeworCQkJaW50IHBhcmFtOworCQkJTkVYVF9BUkcoKTsKKwkJCXBhcmFtID0gaW5kZXhfaW5fc3RyaW5ncyhzdHJfb25fb2ZmLCAqYXJndik7CisJCQlpZiAoa2V5ID09IEFSR19tdWx0aWNhc3QpIHsKKwkJCQlpZiAocGFyYW0gPCAwKQorCQkJCQlkaWVfbXVzdF9iZV9vbl9vZmYoIm11bHRpY2FzdCIpOworCQkJCW1hc2sgfD0gSUZGX01VTFRJQ0FTVDsKKwkJCQlpZiAocGFyYW0gPT0gUEFSTV9vbikKKwkJCQkJZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKwkJCQllbHNlCisJCQkJCWZsYWdzICY9IH5JRkZfTVVMVElDQVNUOworCQkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2FycCkgeworCQkJCWlmIChwYXJhbSA8IDApCisJCQkJCWRpZV9tdXN0X2JlX29uX29mZigiYXJwIik7CisJCQkJbWFzayB8PSBJRkZfTk9BUlA7CisJCQkJaWYgKHBhcmFtID09IFBBUk1fb24pCisJCQkJCWZsYWdzICY9IH5JRkZfTk9BUlA7CisJCQkJZWxzZQorCQkJCQlmbGFncyB8PSBJRkZfTk9BUlA7CisJCQl9CisJCX0KKwkJYXJndisrOworCX0KKworCWlmICghZGV2KSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsICJcImRldlwiIik7CisJfQorCisJaWYgKG5ld2FkZHIgfHwgbmV3YnJkKSB7CisJCWhhbGVuID0gZ2V0X2FkZHJlc3MoZGV2LCAmaHR5cGUpOworCQlpZiAobmV3YWRkcikgeworCQkJcGFyc2VfYWRkcmVzcyhkZXYsIGh0eXBlLCBoYWxlbiwgbmV3YWRkciwgJmlmcjApOworCQkJc2V0X2FkZHJlc3MoJmlmcjAsIDApOworCQl9CisJCWlmIChuZXdicmQpIHsKKwkJCXBhcnNlX2FkZHJlc3MoZGV2LCBodHlwZSwgaGFsZW4sIG5ld2JyZCwgJmlmcjEpOworCQkJc2V0X2FkZHJlc3MoJmlmcjEsIDEpOworCQl9CisJfQorCisJaWYgKG5ld25hbWUgJiYgc3RyY21wKGRldiwgbmV3bmFtZSkpIHsKKwkJZG9fY2hhbmdlbmFtZShkZXYsIG5ld25hbWUpOworCQlkZXYgPSBuZXduYW1lOworCX0KKwlpZiAocWxlbiAhPSAtMSkgeworCQlzZXRfcWxlbihkZXYsIHFsZW4pOworCX0KKwlpZiAobXR1ICE9IC0xKSB7CisJCXNldF9tdHUoZGV2LCBtdHUpOworCX0KKwlpZiAobWFzaykKKwkJZG9fY2hmbGFncyhkZXYsIGZsYWdzLCBtYXNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGFkZHJfbGlzdF9saW5rKGNoYXIgKiphcmd2KQoreworCXByZWZlcnJlZF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJcmV0dXJuIGlwYWRkcl9saXN0X29yX2ZsdXNoKGFyZ3YsIDApOworfQorCisjaWZuZGVmIE5MTVNHX1RBSUwKKyNkZWZpbmUgTkxNU0dfVEFJTChubXNnKSBcCisJKChzdHJ1Y3QgcnRhdHRyICopICgoKHZvaWQgKikgKG5tc2cpKSArIE5MTVNHX0FMSUdOKChubXNnKS0+bmxtc2dfbGVuKSkpCisjZW5kaWYKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgZG9fY2hhbmdlKGNoYXIgKiphcmd2LCBjb25zdCB1bnNpZ25lZCBydG0pCit7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkibGlua1wwIiJuYW1lXDAiInR5cGVcMCIiZGV2XDAiOworCWVudW0geworCQlBUkdfbGluaywKKwkJQVJHX25hbWUsCisJCUFSR190eXBlLAorCQlBUkdfZGV2LAorCX07CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgIG47CisJCXN0cnVjdCBpZmluZm9tc2cgaTsKKwkJY2hhciAgICAgICAgICAgICBidWZbMTAyNF07CisJfSByZXE7CisJc21hbGx1aW50IGFyZzsKKwljaGFyICpuYW1lX3N0ciA9IE5VTEwsICpsaW5rX3N0ciA9IE5VTEwsICp0eXBlX3N0ciA9IE5VTEwsICpkZXZfc3RyID0gTlVMTDsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IHJ0bTsKKwlyZXEuaS5pZmlfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwlpZiAocnRtID09IFJUTV9ORVdMSU5LKQorCQlyZXEubi5ubG1zZ19mbGFncyB8PSBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTDsKKworCXdoaWxlICgqYXJndikgeworCQlhcmcgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChhcmcgPT0gQVJHX2xpbmspIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlsaW5rX3N0ciA9ICphcmd2OworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfbmFtZSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCW5hbWVfc3RyID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR190eXBlKSB7CisJCQlORVhUX0FSRygpOworCQkJdHlwZV9zdHIgPSAqYXJndjsKKwkJfSBlbHNlIHsKKwkJCWlmIChhcmcgPT0gQVJHX2RldikgeworCQkJCWlmIChkZXZfc3RyKQorCQkJCQlkdXBhcmcoKmFyZ3YsICJkZXYiKTsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJZGV2X3N0ciA9ICphcmd2OworCQl9CisJCWFyZ3YrKzsKKwl9CisJeHJ0bmxfb3BlbigmcnRoKTsKKwlsbF9pbml0X21hcCgmcnRoKTsKKwlpZiAodHlwZV9zdHIpIHsKKwkJc3RydWN0IHJ0YXR0ciAqbGlua2luZm8gPSBOTE1TR19UQUlMKCZyZXEubik7CisKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfTElOS0lORk8sIE5VTEwsIDApOworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9JTkZPX0tJTkQsIHR5cGVfc3RyLAorCQkJCXN0cmxlbih0eXBlX3N0cikpOworCQlsaW5raW5mby0+cnRhX2xlbiA9ICh2b2lkICopTkxNU0dfVEFJTCgmcmVxLm4pIC0gKHZvaWQgKilsaW5raW5mbzsKKwl9CisJaWYgKHJ0bSAhPSBSVE1fTkVXTElOSykgeworCQlpZiAoIWRldl9zdHIpCisJCQlyZXR1cm4gMTsgLyogTmVlZCBhIGRldmljZSB0byBkZWxldGUgKi8KKwkJcmVxLmkuaWZpX2luZGV4ID0geGxsX25hbWVfdG9faW5kZXgoZGV2X3N0cik7CisJfSBlbHNlIHsKKwkJaWYgKCFuYW1lX3N0cikKKwkJCW5hbWVfc3RyID0gZGV2X3N0cjsKKwkJaWYgKGxpbmtfc3RyKSB7CisJCQlpbnQgaWR4ID0geGxsX25hbWVfdG9faW5kZXgobGlua19zdHIpOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfTElOSywgJmlkeCwgNCk7CisJCX0KKwl9CisJaWYgKG5hbWVfc3RyKSB7CisJCWNvbnN0IHNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbihuYW1lX3N0cikgKyAxOworCQlpZiAobmFtZV9sZW4gPCAyIHx8IG5hbWVfbGVuID4gSUZOQU1TSVopCisJCQlpbnZhcmcobmFtZV9zdHIsICJuYW1lIik7CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0lGTkFNRSwgbmFtZV9zdHIsIG5hbWVfbGVuKTsKKwl9CisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkKKwkJcmV0dXJuIDI7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK2ludCBGQVNUX0ZVTkMgZG9faXBsaW5rKGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJImFkZFwwIiJkZWxldGVcMCIic2V0XDAiInNob3dcMCIibHN0XDAiImxpc3RcMCI7CisJaWYgKCphcmd2KSB7CisJCXNtYWxsdWludCBrZXkgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChrZXkgPiA1KSAvKiBpbnZhbGlkIGFyZ3VtZW50ICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsICphcmd2LCBhcHBsZXRfbmFtZSk7CisJCWFyZ3YrKzsKKwkJaWYgKGtleSA8PSAxKSAvKiBhZGQvZGVsZXRlICovCisJCQlyZXR1cm4gZG9fY2hhbmdlKGFyZ3YsIGtleSA/IFJUTV9ERUxMSU5LIDogUlRNX05FV0xJTkspOworCQllbHNlIGlmIChrZXkgPT0gMikgLyogc2V0ICovCisJCQlyZXR1cm4gZG9fc2V0KGFyZ3YpOworCX0KKwkvKiBzaG93LCBsc3QsIGxpc3QgKi8KKwlyZXR1cm4gaXBhZGRyX2xpc3RfbGluayhhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHJvdXRlLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXByb3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTY3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXByb3V0ZS5jCkBAIC0wLDAgKzEsOTQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIFJhbmkgQXNzYWYgPHJhbmlAbWFnaWMubWV0YXdpcmUuY29tPiA5ODA5Mjk6IHJlc29sdmUgYWRkcmVzc2VzCisgKiBLdW5paGlybyBJc2hpZ3VybyA8a3VuaWhpcm9AemVicmEub3JnPiAwMDExMDI6IHJ0bmhfaWZpbmRleCB3YXMgbm90IGluaXRpYWxpemVkCisgKi8KKworI2luY2x1ZGUgImlwX2NvbW1vbi5oIiAgLyogI2luY2x1ZGUgImxpYmJiLmgiIGlzIGluc2lkZSAqLworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2lmbmRlZiBSVEFYX1JUVFZBUgorI2RlZmluZSBSVEFYX1JUVFZBUiBSVEFYX0hPUFMKKyNlbmRpZgorCisKK3N0cnVjdCBmaWx0ZXJfdCB7CisJaW50IHRiOworCXNtYWxsaW50IGZsdXNoZWQ7CisJY2hhciAqZmx1c2hiOworCWludCBmbHVzaHA7CisJaW50IGZsdXNoZTsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aDsKKwkvL2ludCBwcm90b2NvbCwgcHJvdG9jb2xtYXNrOyAtIHdyaXRlLW9ubHkgZmllbGRzPyEKKwkvL2ludCBzY29wZSwgc2NvcGVtYXNrOyAtIHVudXNlZAorCS8vaW50IHR5cGU7IC0gcmVhZC1vbmx5CisJLy9pbnQgdHlwZW1hc2s7IC0gdW51c2VkCisJLy9pbnQgdG9zLCB0b3NtYXNrOyAtIHVudXNlZAorCWludCBpaWY7CisJaW50IG9pZjsKKwkvL2ludCByZWFsbSwgcmVhbG1tYXNrOyAtIHVudXNlZAorCS8vaW5ldF9wcmVmaXggcnByZWZzcmM7IC0gcmVhZC1vbmx5CisJaW5ldF9wcmVmaXggcnZpYTsKKwlpbmV0X3ByZWZpeCByZHN0OworCWluZXRfcHJlZml4IG1kc3Q7CisJaW5ldF9wcmVmaXggcnNyYzsKKwlpbmV0X3ByZWZpeCBtc3JjOworfSBGSVhfQUxJQVNJTkc7Cit0eXBlZGVmIHN0cnVjdCBmaWx0ZXJfdCBmaWx0ZXJfdDsKKworI2RlZmluZSBHX2ZpbHRlciAoKihmaWx0ZXJfdCopJmJiX2NvbW1vbl9idWZzaXoxKQorCitzdGF0aWMgaW50IGZsdXNoX3VwZGF0ZSh2b2lkKQoreworCWlmIChydG5sX3NlbmQoR19maWx0ZXIucnRoLCBHX2ZpbHRlci5mbHVzaGIsIEdfZmlsdGVyLmZsdXNocCkgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHNlbmQgZmx1c2ggcmVxdWVzdCIpOworCQlyZXR1cm4gLTE7CisJfQorCUdfZmlsdGVyLmZsdXNocCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBnZXRfaHoodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaHpfaW50ZXJuYWw7CisJRklMRSAqZnA7CisKKwlpZiAoaHpfaW50ZXJuYWwpCisJCXJldHVybiBoel9pbnRlcm5hbDsKKworCWZwID0gZm9wZW5fZm9yX3JlYWQoIi9wcm9jL25ldC9wc2NoZWQiKTsKKwlpZiAoZnApIHsKKwkJdW5zaWduZWQgbm9tLCBkZW5vbTsKKworCQlpZiAoZnNjYW5mKGZwLCAiJSowOHglKjA4eCUwOHglMDh4IiwgJm5vbSwgJmRlbm9tKSA9PSAyKQorCQkJaWYgKG5vbSA9PSAxMDAwMDAwKQorCQkJCWh6X2ludGVybmFsID0gZGVub207CisJCWZjbG9zZShmcCk7CisJfQorCWlmICghaHpfaW50ZXJuYWwpCisJCWh6X2ludGVybmFsID0gc3lzY29uZihfU0NfQ0xLX1RDSyk7CisJcmV0dXJuIGh6X2ludGVybmFsOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBwcmludF9yb3V0ZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCXN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqdGJbUlRBX01BWCsxXTsKKwljaGFyIGFidWZbMjU2XTsKKwlpbmV0X3ByZWZpeCBkc3Q7CisJaW5ldF9wcmVmaXggc3JjOworCWludCBob3N0X2xlbiA9IC0xOworCVNQUklOVF9CVUYoYjEpOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV1JPVVRFICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0RFTFJPVVRFKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGEgcm91dGU6ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJbi0+bmxtc2dfbGVuLCBuLT5ubG1zZ190eXBlLCBuLT5ubG1zZ19mbGFncyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoR19maWx0ZXIuZmx1c2hiICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV1JPVVRFKQorCQlyZXR1cm4gMDsKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpOworCWlmIChsZW4gPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid3Jvbmcgbmxtc2cgbGVuICVkIiwgbGVuKTsKKworCWlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2KQorCQlob3N0X2xlbiA9IDEyODsKKwllbHNlIGlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQpCisJCWhvc3RfbGVuID0gMzI7CisKKwlpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlpZiAoR19maWx0ZXIudGIpIHsKKwkJCWlmIChHX2ZpbHRlci50YiA8IDApIHsKKwkJCQlpZiAoIShyLT5ydG1fZmxhZ3MgJiBSVE1fRl9DTE9ORUQpKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHItPnJ0bV9mbGFncyAmIFJUTV9GX0NMT05FRCkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJaWYgKEdfZmlsdGVyLnRiID09IFJUX1RBQkxFX0xPQ0FMKSB7CisJCQkJCWlmIChyLT5ydG1fdHlwZSAhPSBSVE5fTE9DQUwpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChHX2ZpbHRlci50YiA9PSBSVF9UQUJMRV9NQUlOKSB7CisJCQkJCWlmIChyLT5ydG1fdHlwZSA9PSBSVE5fTE9DQUwpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKEdfZmlsdGVyLnRiID4gMCAmJiBHX2ZpbHRlci50YiAhPSByLT5ydG1fdGFibGUpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChHX2ZpbHRlci5yZHN0LmZhbWlseQorCSAmJiAoci0+cnRtX2ZhbWlseSAhPSBHX2ZpbHRlci5yZHN0LmZhbWlseSB8fCBHX2ZpbHRlci5yZHN0LmJpdGxlbiA+IHItPnJ0bV9kc3RfbGVuKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLm1kc3QuZmFtaWx5CisJICYmIChyLT5ydG1fZmFtaWx5ICE9IEdfZmlsdGVyLm1kc3QuZmFtaWx5CisJICAgIHx8IChHX2ZpbHRlci5tZHN0LmJpdGxlbiA+PSAwICYmIEdfZmlsdGVyLm1kc3QuYml0bGVuIDwgci0+cnRtX2RzdF9sZW4pCisJICAgICkKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5yc3JjLmZhbWlseQorCSAmJiAoci0+cnRtX2ZhbWlseSAhPSBHX2ZpbHRlci5yc3JjLmZhbWlseSB8fCBHX2ZpbHRlci5yc3JjLmJpdGxlbiA+IHItPnJ0bV9zcmNfbGVuKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLm1zcmMuZmFtaWx5CisJICYmIChyLT5ydG1fZmFtaWx5ICE9IEdfZmlsdGVyLm1zcmMuZmFtaWx5CisJICAgIHx8IChHX2ZpbHRlci5tc3JjLmJpdGxlbiA+PSAwICYmIEdfZmlsdGVyLm1zcmMuYml0bGVuIDwgci0+cnRtX3NyY19sZW4pCisJICAgICkKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KHRiLCAwLCBzaXplb2YodGIpKTsKKwltZW1zZXQoJnNyYywgMCwgc2l6ZW9mKHNyYykpOworCW1lbXNldCgmZHN0LCAwLCBzaXplb2YoZHN0KSk7CisJcGFyc2VfcnRhdHRyKHRiLCBSVEFfTUFYLCBSVE1fUlRBKHIpLCBsZW4pOworCisJaWYgKHRiW1JUQV9TUkNdKSB7CisJCXNyYy5iaXRsZW4gPSByLT5ydG1fc3JjX2xlbjsKKwkJc3JjLmJ5dGVsZW4gPSAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNiA/IDE2IDogNCk7CisJCW1lbWNweShzcmMuZGF0YSwgUlRBX0RBVEEodGJbUlRBX1NSQ10pLCBzcmMuYnl0ZWxlbik7CisJfQorCWlmICh0YltSVEFfRFNUXSkgeworCQlkc3QuYml0bGVuID0gci0+cnRtX2RzdF9sZW47CisJCWRzdC5ieXRlbGVuID0gKHItPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYgPyAxNiA6IDQpOworCQltZW1jcHkoZHN0LmRhdGEsIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwgZHN0LmJ5dGVsZW4pOworCX0KKworCWlmIChHX2ZpbHRlci5yZHN0LmZhbWlseQorCSAmJiBpbmV0X2FkZHJfbWF0Y2goJmRzdCwgJkdfZmlsdGVyLnJkc3QsIEdfZmlsdGVyLnJkc3QuYml0bGVuKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLm1kc3QuZmFtaWx5CisJICYmIEdfZmlsdGVyLm1kc3QuYml0bGVuID49IDAKKwkgJiYgaW5ldF9hZGRyX21hdGNoKCZkc3QsICZHX2ZpbHRlci5tZHN0LCByLT5ydG1fZHN0X2xlbikKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5yc3JjLmZhbWlseQorCSAmJiBpbmV0X2FkZHJfbWF0Y2goJnNyYywgJkdfZmlsdGVyLnJzcmMsIEdfZmlsdGVyLnJzcmMuYml0bGVuKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLm1zcmMuZmFtaWx5ICYmIEdfZmlsdGVyLm1zcmMuYml0bGVuID49IDAKKwkgJiYgaW5ldF9hZGRyX21hdGNoKCZzcmMsICZHX2ZpbHRlci5tc3JjLCByLT5ydG1fc3JjX2xlbikKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5vaWYgIT0gMCkgeworCQlpZiAoIXRiW1JUQV9PSUZdKQorCQkJcmV0dXJuIDA7CisJCWlmIChHX2ZpbHRlci5vaWYgIT0gKihpbnQqKVJUQV9EQVRBKHRiW1JUQV9PSUZdKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChHX2ZpbHRlci5mbHVzaGIpIHsKKwkJc3RydWN0IG5sbXNnaGRyICpmbjsKKworCQkvKiBXZSBhcmUgY3JlYXRpbmcgcm91dGUgZmx1c2ggY29tbWFuZHMgKi8KKworCQlpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNgorCQkgJiYgci0+cnRtX2RzdF9sZW4gPT0gMAorCQkgJiYgci0+cnRtX3R5cGUgPT0gUlROX1VOUkVBQ0hBQkxFCisJCSAmJiB0YltSVEFfUFJJT1JJVFldCisJCSAmJiAqKGludCopUlRBX0RBVEEodGJbUlRBX1BSSU9SSVRZXSkgPT0gLTEKKwkJKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChOTE1TR19BTElHTihHX2ZpbHRlci5mbHVzaHApICsgbi0+bmxtc2dfbGVuID4gR19maWx0ZXIuZmx1c2hlKSB7CisJCQlpZiAoZmx1c2hfdXBkYXRlKCkpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZsdXNoIik7CisJCX0KKwkJZm4gPSAodm9pZCopKEdfZmlsdGVyLmZsdXNoYiArIE5MTVNHX0FMSUdOKEdfZmlsdGVyLmZsdXNocCkpOworCQltZW1jcHkoZm4sIG4sIG4tPm5sbXNnX2xlbik7CisJCWZuLT5ubG1zZ190eXBlID0gUlRNX0RFTFJPVVRFOworCQlmbi0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCQlmbi0+bmxtc2dfc2VxID0gKytHX2ZpbHRlci5ydGgtPnNlcTsKKwkJR19maWx0ZXIuZmx1c2hwID0gKCgoY2hhciopZm4pICsgbi0+bmxtc2dfbGVuKSAtIEdfZmlsdGVyLmZsdXNoYjsKKwkJR19maWx0ZXIuZmx1c2hlZCA9IDE7CisJCXJldHVybiAwOworCX0KKworCS8qIFdlIGFyZSBwcmludGluZyByb3V0ZXMgKi8KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxST1VURSkgeworCQlwcmludGYoIkRlbGV0ZWQgIik7CisJfQorCWlmIChyLT5ydG1fdHlwZSAhPSBSVE5fVU5JQ0FTVCAvKiAmJiAhR19maWx0ZXIudHlwZSAtIGFsd2F5cyAwICovKSB7CisJCXByaW50ZigiJXMgIiwgcnRubF9ydG50eXBlX24yYShyLT5ydG1fdHlwZSwgYjEpKTsKKwl9CisKKwlpZiAodGJbUlRBX0RTVF0pIHsKKwkJaWYgKHItPnJ0bV9kc3RfbGVuICE9IGhvc3RfbGVuKSB7CisJCQlwcmludGYoIiVzLyV1ICIsIHJ0X2FkZHJfbjJhKHItPnJ0bV9mYW1pbHksCisJCQkJCQlSVEFfREFUQSh0YltSVEFfRFNUXSksCisJCQkJCQlhYnVmLCBzaXplb2YoYWJ1ZikpLAorCQkJCQlyLT5ydG1fZHN0X2xlbgorCQkJCQkpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIlcyAiLCBmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQkJUlRBX1BBWUxPQUQodGJbUlRBX0RTVF0pLAorCQkJCQkJUlRBX0RBVEEodGJbUlRBX0RTVF0pLAorCQkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKQorCQkJCQkpOworCQl9CisJfSBlbHNlIGlmIChyLT5ydG1fZHN0X2xlbikgeworCQlwcmludGYoIjAvJWQgIiwgci0+cnRtX2RzdF9sZW4pOworCX0gZWxzZSB7CisJCXByaW50ZigiZGVmYXVsdCAiKTsKKwl9CisJaWYgKHRiW1JUQV9TUkNdKSB7CisJCWlmIChyLT5ydG1fc3JjX2xlbiAhPSBob3N0X2xlbikgeworCQkJcHJpbnRmKCJmcm9tICVzLyV1ICIsIHJ0X2FkZHJfbjJhKHItPnJ0bV9mYW1pbHksCisJCQkJCQlSVEFfREFUQSh0YltSVEFfU1JDXSksCisJCQkJCQlhYnVmLCBzaXplb2YoYWJ1ZikpLAorCQkJCQlyLT5ydG1fc3JjX2xlbgorCQkJCQkpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJmcm9tICVzICIsIGZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCQlSVEFfUEFZTE9BRCh0YltSVEFfU1JDXSksCisJCQkJCQlSVEFfREFUQSh0YltSVEFfU1JDXSksCisJCQkJCQlhYnVmLCBzaXplb2YoYWJ1ZikpCisJCQkJCSk7CisJCX0KKwl9IGVsc2UgaWYgKHItPnJ0bV9zcmNfbGVuKSB7CisJCXByaW50ZigiZnJvbSAwLyV1ICIsIHItPnJ0bV9zcmNfbGVuKTsKKwl9CisJaWYgKHRiW1JUQV9HQVRFV0FZXSAmJiBHX2ZpbHRlci5ydmlhLmJpdGxlbiAhPSBob3N0X2xlbikgeworCQlwcmludGYoInZpYSAlcyAiLCBmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQlSVEFfUEFZTE9BRCh0YltSVEFfR0FURVdBWV0pLAorCQkJCQlSVEFfREFUQSh0YltSVEFfR0FURVdBWV0pLAorCQkJCQlhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwl9CisJaWYgKHRiW1JUQV9PSUZdKSB7CisJCXByaW50ZigiZGV2ICVzICIsIGxsX2luZGV4X3RvX25hbWUoKihpbnQqKVJUQV9EQVRBKHRiW1JUQV9PSUZdKSkpOworCX0KKworCS8qIFRvZG86IHBhcnNlICYgc2hvdyAicHJvdG8ga2VybmVsIiwgInNjb3BlIGxpbmsiIGhlcmUgKi8KKworCWlmICh0YltSVEFfUFJFRlNSQ10gJiYgLypHX2ZpbHRlci5ycHJlZnNyYy5iaXRsZW4gLSBhbHdheXMgMCovIDAgIT0gaG9zdF9sZW4pIHsKKwkJLyogRG8gbm90IHVzZSBmb3JtYXRfaG9zdCgpLiBJdCBpcyBvdXIgbG9jYWwgYWRkcgorCQkgICBhbmQgc3ltYm9saWMgbmFtZSB3aWxsIG5vdCBiZSB1c2VmdWwuCisJCSAqLworCQlwcmludGYoIiBzcmMgJXMgIiwgcnRfYWRkcl9uMmEoci0+cnRtX2ZhbWlseSwKKwkJCQkJUlRBX0RBVEEodGJbUlRBX1BSRUZTUkNdKSwKKwkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJfQorCWlmICh0YltSVEFfUFJJT1JJVFldKSB7CisJCXByaW50ZigiIG1ldHJpYyAlZCAiLCAqKHVpbnQzMl90KilSVEFfREFUQSh0YltSVEFfUFJJT1JJVFldKSk7CisJfQorCWlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXN0cnVjdCBydGFfY2FjaGVpbmZvICpjaSA9IE5VTEw7CisJCWlmICh0YltSVEFfQ0FDSEVJTkZPXSkgeworCQkJY2kgPSBSVEFfREFUQSh0YltSVEFfQ0FDSEVJTkZPXSk7CisJCX0KKwkJaWYgKChyLT5ydG1fZmxhZ3MgJiBSVE1fRl9DTE9ORUQpIHx8IChjaSAmJiBjaS0+cnRhX2V4cGlyZXMpKSB7CisJCQlpZiAoci0+cnRtX2ZsYWdzICYgUlRNX0ZfQ0xPTkVEKSB7CisJCQkJcHJpbnRmKCIlYyAgICBjYWNoZSAiLCBfU0xfKTsKKwkJCX0KKwkJCWlmIChjaS0+cnRhX2V4cGlyZXMpIHsKKwkJCQlwcmludGYoIiBleHBpcmVzICVkc2VjIiwgY2ktPnJ0YV9leHBpcmVzIC8gZ2V0X2h6KCkpOworCQkJfQorCQkJaWYgKGNpLT5ydGFfZXJyb3IgIT0gMCkgeworCQkJCXByaW50ZigiIGVycm9yICVkIiwgY2ktPnJ0YV9lcnJvcik7CisJCQl9CisJCX0gZWxzZSBpZiAoY2kpIHsKKwkJCWlmIChjaS0+cnRhX2Vycm9yICE9IDApCisJCQkJcHJpbnRmKCIgZXJyb3IgJWQiLCBjaS0+cnRhX2Vycm9yKTsKKwkJfQorCX0KKwlpZiAodGJbUlRBX0lJRl0gJiYgR19maWx0ZXIuaWlmID09IDApIHsKKwkJcHJpbnRmKCIgaWlmICVzIiwgbGxfaW5kZXhfdG9fbmFtZSgqKGludCopUlRBX0RBVEEodGJbUlRBX0lJRl0pKSk7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgaXByb3V0ZV9tb2RpZnkoaW50IGNtZCwgdW5zaWduZWQgZmxhZ3MsIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJInNyY1wwIiJ2aWFcMCIibXR1XDAiImxvY2tcMCIicHJvdG9jb2xcMCJJRl9GRUFUVVJFX0lQX1JVTEUoInRhYmxlXDAiKQorCQkiZGV2XDAiIm9pZlwwIiJ0b1wwIiJtZXRyaWNcMCI7CisJZW51bSB7CisJCUFSR19zcmMsCisJCUFSR192aWEsCisJCUFSR19tdHUsIFBBUk1fbG9jaywKKwkJQVJHX3Byb3RvY29sLAorSUZfRkVBVFVSRV9JUF9SVUxFKEFSR190YWJsZSwpCisJCUFSR19kZXYsCisJCUFSR19vaWYsCisJCUFSR190bywKKwkJQVJHX21ldHJpYywKKwl9OworCWVudW0geworCQlnd19vayA9IDEgPDwgMCwKKwkJZHN0X29rID0gMSA8PCAxLAorCQlwcm90b19vayA9IDEgPDwgMiwKKwkJdHlwZV9vayA9IDEgPDwgMworCX07CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbjsKKwkJc3RydWN0IHJ0bXNnICAgIHI7CisJCWNoYXIgICAgICAgICAgICBidWZbMTAyNF07CisJfSByZXE7CisJY2hhciBteGJ1ZlsyNTZdOworCXN0cnVjdCBydGF0dHIgKiBteHJ0YSA9ICh2b2lkKilteGJ1ZjsKKwl1bnNpZ25lZCBteGxvY2sgPSAwOworCWNoYXIgKmQgPSBOVUxMOworCXNtYWxsdWludCBvayA9IDA7CisJaW50IGFyZzsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydG1zZykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLnIucnRtX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJaWYgKFJUX1RBQkxFX01BSU4pIC8qIGlmIGl0IGlzIHplcm8sIG1lbXNldCBhbHJlYWR5IGRpZCBpdCAqLworCQlyZXEuci5ydG1fdGFibGUgPSBSVF9UQUJMRV9NQUlOOworCWlmIChSVF9TQ09QRV9OT1dIRVJFKQorCQlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFOworCisJaWYgKGNtZCAhPSBSVE1fREVMUk9VVEUpIHsKKwkJcmVxLnIucnRtX3Byb3RvY29sID0gUlRQUk9UX0JPT1Q7CisJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworCQlyZXEuci5ydG1fdHlwZSA9IFJUTl9VTklDQVNUOworCX0KKworCW14cnRhLT5ydGFfdHlwZSA9IFJUQV9NRVRSSUNTOworCW14cnRhLT5ydGFfbGVuID0gUlRBX0xFTkdUSCgwKTsKKworCXdoaWxlICgqYXJndikgeworCQlhcmcgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChhcmcgPT0gQVJHX3NyYykgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCXJlcS5yLnJ0bV9mYW1pbHkgPSBhZGRyLmZhbWlseTsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfUFJFRlNSQywgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX3ZpYSkgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCW9rIHw9IGd3X29rOworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9hZGRyKCZhZGRyLCAqYXJndiwgcmVxLnIucnRtX2ZhbWlseSk7CisJCQlpZiAocmVxLnIucnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJCQlyZXEuci5ydG1fZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQl9CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0dBVEVXQVksICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19tdHUpIHsKKwkJCXVuc2lnbmVkIG10dTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpID09IFBBUk1fbG9jaykgeworCQkJCW14bG9jayB8PSAoMSA8PCBSVEFYX01UVSk7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCW10dSA9IGdldF91bnNpZ25lZCgqYXJndiwgIm10dSIpOworCQkJcnRhX2FkZGF0dHIzMihteHJ0YSwgc2l6ZW9mKG14YnVmKSwgUlRBWF9NVFUsIG10dSk7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19wcm90b2NvbCkgeworCQkJdWludDMyX3QgcHJvdDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9ydHByb3RfYTJuKCZwcm90LCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAicHJvdG9jb2wiKTsKKwkJCXJlcS5yLnJ0bV9wcm90b2NvbCA9IHByb3Q7CisJCQlvayB8PSBwcm90b19vazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9SVUxFCisJCX0gZWxzZSBpZiAoYXJnID09IEFSR190YWJsZSkgeworCQkJdWludDMyX3QgdGlkOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX3J0dGFibGVfYTJuKCZ0aWQsICphcmd2KSkKKwkJCQlpbnZhcmcoKmFyZ3YsICJ0YWJsZSIpOworCQkJcmVxLnIucnRtX3RhYmxlID0gdGlkOworI2VuZGlmCisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19kZXYgfHwgYXJnID09IEFSR19vaWYpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19tZXRyaWMpIHsKKwkJCXVpbnQzMl90IG1ldHJpYzsKKwkJCU5FWFRfQVJHKCk7CisJCQltZXRyaWMgPSBnZXRfdTMyKCphcmd2LCAibWV0cmljIik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BSSU9SSVRZLCBtZXRyaWMpOworCQl9IGVsc2UgeworCQkJaW50IHR5cGU7CisJCQlpbmV0X3ByZWZpeCBkc3Q7CisKKwkJCWlmIChhcmcgPT0gQVJHX3RvKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmICgoKiphcmd2IDwgJzAnIHx8ICoqYXJndiA+ICc5JykKKwkJCSAmJiBydG5sX3J0bnR5cGVfYTJuKCZ0eXBlLCAqYXJndikgPT0gMAorCQkJKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlyZXEuci5ydG1fdHlwZSA9IHR5cGU7CisJCQkJb2sgfD0gdHlwZV9vazsKKwkJCX0KKworCQkJaWYgKG9rICYgZHN0X29rKSB7CisJCQkJZHVwYXJnMigidG8iLCAqYXJndik7CisJCQl9CisJCQlnZXRfcHJlZml4KCZkc3QsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQkJCXJlcS5yLnJ0bV9mYW1pbHkgPSBkc3QuZmFtaWx5OworCQkJfQorCQkJcmVxLnIucnRtX2RzdF9sZW4gPSBkc3QuYml0bGVuOworCQkJb2sgfD0gZHN0X29rOworCQkJaWYgKGRzdC5ieXRlbGVuKSB7CisJCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9EU1QsICZkc3QuZGF0YSwgZHN0LmJ5dGVsZW4pOworCQkJfQorCQl9CisJCWFyZ3YrKzsKKwl9CisKKwl4cnRubF9vcGVuKCZydGgpOworCisJaWYgKGQpICB7CisJCWludCBpZHg7CisKKwkJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwkJaWYgKGQpIHsKKwkJCWlkeCA9IHhsbF9uYW1lX3RvX2luZGV4KGQpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9PSUYsIGlkeCk7CisJCX0KKwl9CisKKwlpZiAobXhydGEtPnJ0YV9sZW4gPiBSVEFfTEVOR1RIKDApKSB7CisJCWlmIChteGxvY2spIHsKKwkJCXJ0YV9hZGRhdHRyMzIobXhydGEsIHNpemVvZihteGJ1ZiksIFJUQVhfTE9DSywgbXhsb2NrKTsKKwkJfQorCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX01FVFJJQ1MsIFJUQV9EQVRBKG14cnRhKSwgUlRBX1BBWUxPQUQobXhydGEpKTsKKwl9CisKKwlpZiAocmVxLnIucnRtX3R5cGUgPT0gUlROX0xPQ0FMIHx8IHJlcS5yLnJ0bV90eXBlID09IFJUTl9OQVQpCisJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX0hPU1Q7CisJZWxzZQorCWlmIChyZXEuci5ydG1fdHlwZSA9PSBSVE5fQlJPQURDQVNUCisJIHx8IHJlcS5yLnJ0bV90eXBlID09IFJUTl9NVUxUSUNBU1QKKwkgfHwgcmVxLnIucnRtX3R5cGUgPT0gUlROX0FOWUNBU1QKKwkpIHsKKwkJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfTElOSzsKKwl9CisJZWxzZSBpZiAocmVxLnIucnRtX3R5cGUgPT0gUlROX1VOSUNBU1QgfHwgcmVxLnIucnRtX3R5cGUgPT0gUlROX1VOU1BFQykgeworCQlpZiAoY21kID09IFJUTV9ERUxST1VURSkKKwkJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX05PV0hFUkU7CisJCWVsc2UgaWYgKCEob2sgJiBnd19vaykpCisJCQlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9MSU5LOworCX0KKworCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQlyZXEuci5ydG1fZmFtaWx5ID0gQUZfSU5FVDsKKwl9CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKSB7CisJCXJldHVybiAyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bmxfcnRjYWNoZV9yZXF1ZXN0KHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBpbnQgZmFtaWx5KQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBubGg7CisJCXN0cnVjdCBydG1zZyBydG07CisJfSByZXE7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKworCW1lbXNldCgmbmxhZGRyLCAwLCBzaXplb2YobmxhZGRyKSk7CisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwlubGFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKworCXJlcS5ubGgubmxtc2dfbGVuID0gc2l6ZW9mKHJlcSk7CisJaWYgKFJUTV9HRVRST1VURSkKKwkJcmVxLm5saC5ubG1zZ190eXBlID0gUlRNX0dFVFJPVVRFOworCWlmIChOTE1fRl9ST09UIHwgTkxNX0ZfUkVRVUVTVCkKKwkJcmVxLm5saC5ubG1zZ19mbGFncyA9IE5MTV9GX1JPT1QgfCBOTE1fRl9SRVFVRVNUOworCS8qcmVxLm5saC5ubG1zZ19waWQgPSAwOyAtIG1lbXNldCBkaWQgaXQgYWxyZWFkeSAqLworCXJlcS5ubGgubmxtc2dfc2VxID0gcnRoLT5kdW1wID0gKytydGgtPnNlcTsKKwlyZXEucnRtLnJ0bV9mYW1pbHkgPSBmYW1pbHk7CisJaWYgKFJUTV9GX0NMT05FRCkKKwkJcmVxLnJ0bS5ydG1fZmxhZ3MgPSBSVE1fRl9DTE9ORUQ7CisKKwlyZXR1cm4geHNlbmR0byhydGgtPmZkLCAodm9pZCopJnJlcSwgc2l6ZW9mKHJlcSksIChzdHJ1Y3Qgc29ja2FkZHIqKSZubGFkZHIsIHNpemVvZihubGFkZHIpKTsKK30KKworc3RhdGljIHZvaWQgaXByb3V0ZV9mbHVzaF9jYWNoZSh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGZuW10gQUxJR04xID0gIi9wcm9jL3N5cy9uZXQvaXB2NC9yb3V0ZS9mbHVzaCI7CisJaW50IGZsdXNoX2ZkID0gb3Blbl9vcl93YXJuKGZuLCBPX1dST05MWSk7CisKKwlpZiAoZmx1c2hfZmQgPCAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAod3JpdGUoZmx1c2hfZmQsICItMSIsIDIpIDwgMikgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBmbHVzaCByb3V0aW5nIGNhY2hlIik7CisJCXJldHVybjsKKwl9CisJY2xvc2UoZmx1c2hfZmQpOworfQorCitzdGF0aWMgdm9pZCBpcHJvdXRlX3Jlc2V0X2ZpbHRlcih2b2lkKQoreworCW1lbXNldCgmR19maWx0ZXIsIDAsIHNpemVvZihHX2ZpbHRlcikpOworCUdfZmlsdGVyLm1kc3QuYml0bGVuID0gLTE7CisJR19maWx0ZXIubXNyYy5iaXRsZW4gPSAtMTsKK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworc3RhdGljIGludCBpcHJvdXRlX2xpc3Rfb3JfZmx1c2goY2hhciAqKmFyZ3YsIGludCBmbHVzaCkKK3sKKwlpbnQgZG9faXB2NiA9IHByZWZlcnJlZF9mYW1pbHk7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwljaGFyICppZCA9IE5VTEw7CisJY2hhciAqb2QgPSBOVUxMOworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJLyogImlwIHJvdXRlIGxpc3QvZmx1c2giIHBhcmFtZXRlcnM6ICovCisJCSJwcm90b2NvbFwwIiAiZGV2XDAiICAgIm9pZlwwIiAgICJpaWZcMCIKKwkJInZpYVwwIiAgICAgICJ0YWJsZVwwIiAiY2FjaGVcMCIKKwkJImZyb21cMCIgICAgICJ0b1wwIgorCQkvKiBhbmQgcG9zc2libGUgZnVydGhlciBrZXl3b3JkcyAqLworCQkiYWxsXDAiCisJCSJyb290XDAiCisJCSJtYXRjaFwwIgorCQkiZXhhY3RcMCIKKwkJIm1haW5cMCIKKwkJOworCWVudW0geworCQlLV19wcm90bywgS1dfZGV2LCAgIEtXX29pZiwgIEtXX2lpZiwKKwkJS1dfdmlhLCAgIEtXX3RhYmxlLCBLV19jYWNoZSwKKwkJS1dfZnJvbSwgIEtXX3RvLAorCQkvKiAqLworCQlLV19hbGwsCisJCUtXX3Jvb3QsCisJCUtXX21hdGNoLAorCQlLV19leGFjdCwKKwkJS1dfbWFpbiwKKwl9OworCWludCBhcmcsIHBhcm07CisKKwlpcHJvdXRlX3Jlc2V0X2ZpbHRlcigpOworCUdfZmlsdGVyLnRiID0gUlRfVEFCTEVfTUFJTjsKKworCWlmIChmbHVzaCAmJiAhKmFyZ3YpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsICJcImlwIHJvdXRlIGZsdXNoXCIiKTsKKworCXdoaWxlICgqYXJndikgeworCQlhcmcgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChhcmcgPT0gS1dfcHJvdG8pIHsKKwkJCXVpbnQzMl90IHByb3QgPSAwOworCQkJTkVYVF9BUkcoKTsKKwkJCS8vR19maWx0ZXIucHJvdG9jb2xtYXNrID0gLTE7CisJCQlpZiAocnRubF9ydHByb3RfYTJuKCZwcm90LCAqYXJndikpIHsKKwkJCQlpZiAoaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpICE9IEtXX2FsbCkKKwkJCQkJaW52YXJnKCphcmd2LCAicHJvdG9jb2wiKTsKKwkJCQlwcm90ID0gMDsKKwkJCQkvL0dfZmlsdGVyLnByb3RvY29sbWFzayA9IDA7CisJCQl9CisJCQkvL0dfZmlsdGVyLnByb3RvY29sID0gcHJvdDsKKwkJfSBlbHNlIGlmIChhcmcgPT0gS1dfZGV2IHx8IGFyZyA9PSBLV19vaWYpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlvZCA9ICphcmd2OworCQl9IGVsc2UgaWYgKGFyZyA9PSBLV19paWYpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZCA9ICphcmd2OworCQl9IGVsc2UgaWYgKGFyZyA9PSBLV192aWEpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZHX2ZpbHRlci5ydmlhLCAqYXJndiwgZG9faXB2Nik7CisJCX0gZWxzZSBpZiAoYXJnID09IEtXX3RhYmxlKSB7IC8qIHRhYmxlIGFsbC9jYWNoZS9tYWluICovCisJCQlORVhUX0FSRygpOworCQkJcGFybSA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJCWlmIChwYXJtID09IEtXX2NhY2hlKQorCQkJCUdfZmlsdGVyLnRiID0gLTE7CisJCQllbHNlIGlmIChwYXJtID09IEtXX2FsbCkKKwkJCQlHX2ZpbHRlci50YiA9IDA7CisJCQllbHNlIGlmIChwYXJtICE9IEtXX21haW4pIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9SVUxFCisJCQkJdWludDMyX3QgdGlkOworCQkJCWlmIChydG5sX3J0dGFibGVfYTJuKCZ0aWQsICphcmd2KSkKKwkJCQkJaW52YXJnKCphcmd2LCAidGFibGUiKTsKKwkJCQlHX2ZpbHRlci50YiA9IHRpZDsKKyNlbHNlCisJCQkJaW52YXJnKCphcmd2LCAidGFibGUiKTsKKyNlbmRpZgorCQkJfQorCQl9IGVsc2UgaWYgKGFyZyA9PSBLV19jYWNoZSkgeworCQkJLyogVGhlIGNvbW1hbmQgJ2lwIHJvdXRlIGZsdXNoIGNhY2hlJyBpcyB1c2VkIGJ5IE9wZW5TV0FOLgorCQkJICogQXNzdW1pbmcgaXQncyBhIHN5bm9ueW0gZm9yICdpcCByb3V0ZSBmbHVzaCB0YWJsZSBjYWNoZScgKi8KKwkJCUdfZmlsdGVyLnRiID0gLTE7CisJCX0gZWxzZSBpZiAoYXJnID09IEtXX2Zyb20pIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlwYXJtID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQkJaWYgKHBhcm0gPT0gS1dfcm9vdCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIucnNyYywgKmFyZ3YsIGRvX2lwdjYpOworCQkJfSBlbHNlIGlmIChwYXJtID09IEtXX21hdGNoKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZHX2ZpbHRlci5tc3JjLCAqYXJndiwgZG9faXB2Nik7CisJCQl9IGVsc2UgeworCQkJCWlmIChwYXJtID09IEtXX2V4YWN0KQorCQkJCQlORVhUX0FSRygpOworCQkJCWdldF9wcmVmaXgoJkdfZmlsdGVyLm1zcmMsICphcmd2LCBkb19pcHY2KTsKKwkJCQlHX2ZpbHRlci5yc3JjID0gR19maWx0ZXIubXNyYzsKKwkJCX0KKwkJfSBlbHNlIHsgLyogInRvIiBpcyB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgKi8KKwkJCWlmIChhcmcgPT0gS1dfdG8pIHsKKwkJCQlORVhUX0FSRygpOworCQkJCWFyZyA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJCX0KKwkJCS8qIHBhcm0gPSBhcmc7IC0gd291bGQgYmUgbW9yZSBwbGF1c2libGUsIGJ1dCB3ZSByZXVzZSAnYXJnJyBoZXJlICovCisJCQlpZiAoYXJnID09IEtXX3Jvb3QpIHsKKwkJCQlORVhUX0FSRygpOworCQkJCWdldF9wcmVmaXgoJkdfZmlsdGVyLnJkc3QsICphcmd2LCBkb19pcHY2KTsKKwkJCX0gZWxzZSBpZiAoYXJnID09IEtXX21hdGNoKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZHX2ZpbHRlci5tZHN0LCAqYXJndiwgZG9faXB2Nik7CisJCQl9IGVsc2UgeyAvKiAidG8gZXhhY3QiIGlzIHRoZSBkZWZhdWx0ICovCisJCQkJaWYgKGFyZyA9PSBLV19leGFjdCkKKwkJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZHX2ZpbHRlci5tZHN0LCAqYXJndiwgZG9faXB2Nik7CisJCQkJR19maWx0ZXIucmRzdCA9IEdfZmlsdGVyLm1kc3Q7CisJCQl9CisJCX0KKwkJYXJndisrOworCX0KKworCWlmIChkb19pcHY2ID09IEFGX1VOU1BFQyAmJiBHX2ZpbHRlci50YikgeworCQlkb19pcHY2ID0gQUZfSU5FVDsKKwl9CisKKwl4cnRubF9vcGVuKCZydGgpOworCWxsX2luaXRfbWFwKCZydGgpOworCisJaWYgKGlkIHx8IG9kKSAgeworCQlpbnQgaWR4OworCisJCWlmIChpZCkgeworCQkJaWR4ID0geGxsX25hbWVfdG9faW5kZXgoaWQpOworCQkJR19maWx0ZXIuaWlmID0gaWR4OworCQl9CisJCWlmIChvZCkgeworCQkJaWR4ID0geGxsX25hbWVfdG9faW5kZXgob2QpOworCQkJR19maWx0ZXIub2lmID0gaWR4OworCQl9CisJfQorCisJaWYgKGZsdXNoKSB7CisJCWNoYXIgZmx1c2hiWzQwOTYtNTEyXTsKKworCQlpZiAoR19maWx0ZXIudGIgPT0gLTEpIHsgLyogImZsdXNoIHRhYmxlIGNhY2hlIiAqLworCQkJaWYgKGRvX2lwdjYgIT0gQUZfSU5FVDYpCisJCQkJaXByb3V0ZV9mbHVzaF9jYWNoZSgpOworCQkJaWYgKGRvX2lwdjYgPT0gQUZfSU5FVCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJCUdfZmlsdGVyLmZsdXNoYiA9IGZsdXNoYjsKKwkJR19maWx0ZXIuZmx1c2hwID0gMDsKKwkJR19maWx0ZXIuZmx1c2hlID0gc2l6ZW9mKGZsdXNoYik7CisJCUdfZmlsdGVyLnJ0aCA9ICZydGg7CisKKwkJZm9yICg7OykgeworCQkJeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBkb19pcHY2LCBSVE1fR0VUUk9VVEUpOworCQkJR19maWx0ZXIuZmx1c2hlZCA9IDA7CisJCQl4cnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF9yb3V0ZSwgTlVMTCk7CisJCQlpZiAoR19maWx0ZXIuZmx1c2hlZCA9PSAwKQorCQkJCXJldHVybiAwOworCQkJaWYgKGZsdXNoX3VwZGF0ZSgpKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKEdfZmlsdGVyLnRiICE9IC0xKSB7CisJCXhydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgZG9faXB2NiwgUlRNX0dFVFJPVVRFKTsKKwl9IGVsc2UgaWYgKHJ0bmxfcnRjYWNoZV9yZXF1ZXN0KCZydGgsIGRvX2lwdjYpIDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNlbmQgZHVtcCByZXF1ZXN0Iik7CisJfQorCXhydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X3JvdXRlLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgaXByb3V0ZV9nZXQoY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbjsKKwkJc3RydWN0IHJ0bXNnICAgIHI7CisJCWNoYXIgICAgICAgICAgICBidWZbMTAyNF07CisJfSByZXE7CisJY2hhciAqaWRldiA9IE5VTEw7CisJY2hhciAqb2RldiA9IE5VTEw7CisJYm9vbCBjb25uZWN0ZWQgPSAwOworCWJvb2wgZnJvbV9vayA9IDA7CisJc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uc1tdIEFMSUdOMSA9CisJCSJmcm9tXDAiImlpZlwwIiJvaWZcMCIiZGV2XDAiIm5vdGlmeVwwIiJjb25uZWN0ZWRcMCIidG9cMCI7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJaXByb3V0ZV9yZXNldF9maWx0ZXIoKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSk7CisJaWYgKE5MTV9GX1JFUVVFU1QpCisJCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwlpZiAoUlRNX0dFVFJPVVRFKQorCQlyZXEubi5ubG1zZ190eXBlID0gUlRNX0dFVFJPVVRFOworCXJlcS5yLnJ0bV9mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCS8qcmVxLnIucnRtX3RhYmxlID0gMDsgLSBtZW1zZXQgZGlkIHRoaXMgYWxyZWFkeSAqLworCS8qcmVxLnIucnRtX3Byb3RvY29sID0gMDsqLworCS8qcmVxLnIucnRtX3Njb3BlID0gMDsqLworCS8qcmVxLnIucnRtX3R5cGUgPSAwOyovCisJLypyZXEuci5ydG1fc3JjX2xlbiA9IDA7Ki8KKwkvKnJlcS5yLnJ0bV9kc3RfbGVuID0gMDsqLworCS8qcmVxLnIucnRtX3RvcyA9IDA7Ki8KKworCXdoaWxlICgqYXJndikgeworCQlzd2l0Y2ggKGluZGV4X2luX3N0cmluZ3Mob3B0aW9ucywgKmFyZ3YpKSB7CisJCQljYXNlIDA6IC8qIGZyb20gKi8KKwkJCXsKKwkJCQlpbmV0X3ByZWZpeCBhZGRyOworCQkJCU5FWFRfQVJHKCk7CisJCQkJZnJvbV9vayA9IDE7CisJCQkJZ2V0X3ByZWZpeCgmYWRkciwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQkJCQlyZXEuci5ydG1fZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQkJfQorCQkJCWlmIChhZGRyLmJ5dGVsZW4pIHsKKwkJCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9TUkMsICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCQkJfQorCQkJCXJlcS5yLnJ0bV9zcmNfbGVuID0gYWRkci5iaXRsZW47CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIDE6IC8qIGlpZiAqLworCQkJCU5FWFRfQVJHKCk7CisJCQkJaWRldiA9ICphcmd2OworCQkJCWJyZWFrOworCQkJY2FzZSAyOiAvKiBvaWYgKi8KKwkJCWNhc2UgMzogLyogZGV2ICovCisJCQkJTkVYVF9BUkcoKTsKKwkJCQlvZGV2ID0gKmFyZ3Y7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6IC8qIG5vdGlmeSAqLworCQkJCXJlcS5yLnJ0bV9mbGFncyB8PSBSVE1fRl9OT1RJRlk7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6IC8qIGNvbm5lY3RlZCAqLworCQkJCWNvbm5lY3RlZCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6IC8qIHRvICovCisJCQkJTkVYVF9BUkcoKTsKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCQlnZXRfcHJlZml4KCZhZGRyLCAqYXJndiwgcmVxLnIucnRtX2ZhbWlseSk7CisJCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJCXJlcS5yLnJ0bV9mYW1pbHkgPSBhZGRyLmZhbWlseTsKKwkJCQl9CisJCQkJaWYgKGFkZHIuYnl0ZWxlbikgeworCQkJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0RTVCwgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJCQl9CisJCQkJcmVxLnIucnRtX2RzdF9sZW4gPSBhZGRyLmJpdGxlbjsKKwkJCX0KKwkJfQorCQlhcmd2Kys7CisJfQorCisJaWYgKHJlcS5yLnJ0bV9kc3RfbGVuID09IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5lZWQgYXQgbGVhc3QgZGVzdGluYXRpb24gYWRkcmVzcyIpOworCX0KKworCXhydG5sX29wZW4oJnJ0aCk7CisKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCWlmIChpZGV2IHx8IG9kZXYpICB7CisJCWludCBpZHg7CisKKwkJaWYgKGlkZXYpIHsKKwkJCWlkeCA9IHhsbF9uYW1lX3RvX2luZGV4KGlkZXYpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9JSUYsIGlkeCk7CisJCX0KKwkJaWYgKG9kZXYpIHsKKwkJCWlkeCA9IHhsbF9uYW1lX3RvX2luZGV4KG9kZXYpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9PSUYsIGlkeCk7CisJCX0KKwl9CisKKwlpZiAocmVxLnIucnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJcmVxLnIucnRtX2ZhbWlseSA9IEFGX0lORVQ7CisJfQorCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIDAsIDAsICZyZXEubiwgTlVMTCwgTlVMTCkgPCAwKSB7CisJCXJldHVybiAyOworCX0KKworCWlmIChjb25uZWN0ZWQgJiYgIWZyb21fb2spIHsKKwkJc3RydWN0IHJ0bXNnICpyID0gTkxNU0dfREFUQSgmcmVxLm4pOworCQlpbnQgbGVuID0gcmVxLm4ubmxtc2dfbGVuOworCQlzdHJ1Y3QgcnRhdHRyICogdGJbUlRBX01BWCsxXTsKKworCQlwcmludF9yb3V0ZShOVUxMLCAmcmVxLm4sIE5VTEwpOworCisJCWlmIChyZXEubi5ubG1zZ190eXBlICE9IFJUTV9ORVdST1VURSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhIHJvdXRlPyIpOworCQl9CisJCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpyKSk7CisJCWlmIChsZW4gPCAwKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid3JvbmcgbGVuICVkIiwgbGVuKTsKKwkJfQorCisJCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJCXBhcnNlX3J0YXR0cih0YiwgUlRBX01BWCwgUlRNX1JUQShyKSwgbGVuKTsKKworCQlpZiAodGJbUlRBX1BSRUZTUkNdKSB7CisJCQl0YltSVEFfUFJFRlNSQ10tPnJ0YV90eXBlID0gUlRBX1NSQzsKKwkJCXItPnJ0bV9zcmNfbGVuID0gOCpSVEFfUEFZTE9BRCh0YltSVEFfUFJFRlNSQ10pOworCQl9IGVsc2UgaWYgKCF0YltSVEFfU1JDXSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNvbm5lY3QgdGhlIHJvdXRlIik7CisJCX0KKwkJaWYgKCFvZGV2ICYmIHRiW1JUQV9PSUZdKSB7CisJCQl0YltSVEFfT0lGXS0+cnRhX3R5cGUgPSAwOworCQl9CisJCWlmICh0YltSVEFfR0FURVdBWV0pIHsKKwkJCXRiW1JUQV9HQVRFV0FZXS0+cnRhX3R5cGUgPSAwOworCQl9CisJCWlmICghaWRldiAmJiB0YltSVEFfSUlGXSkgeworCQkJdGJbUlRBX0lJRl0tPnJ0YV90eXBlID0gMDsKKwkJfQorCQlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJCXJlcS5uLm5sbXNnX3R5cGUgPSBSVE1fR0VUUk9VVEU7CisKKwkJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIDAsIDAsICZyZXEubiwgTlVMTCwgTlVMTCkgPCAwKSB7CisJCQlyZXR1cm4gMjsKKwkJfQorCX0KKwlwcmludF9yb3V0ZShOVUxMLCAmcmVxLm4sIE5VTEwpOworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitpbnQgRkFTVF9GVU5DIGRvX2lwcm91dGUoY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgaXBfcm91dGVfY29tbWFuZHNbXSBBTElHTjEgPQorCS8qMC0zKi8JImFkZFwwIiJhcHBlbmRcMCIiY2hhbmdlXDAiImNoZ1wwIgorCS8qNC03Ki8JImRlbGV0ZVwwIiJnZXRcMCIibGlzdFwwIiJzaG93XDAiCisJLyo4Li4qLwkicHJlcGVuZFwwIiJyZXBsYWNlXDAiInRlc3RcMCIiZmx1c2hcMCI7CisJaW50IGNvbW1hbmRfbnVtOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwlpbnQgY21kID0gUlRNX05FV1JPVVRFOworCisJaWYgKCEqYXJndikKKwkJcmV0dXJuIGlwcm91dGVfbGlzdF9vcl9mbHVzaChhcmd2LCAwKTsKKworCS8qICJTdGFuZGFyZCIgJ2lwIHIgYScgdHJlYXRzICdhJyBhcyAnYWRkJywgbm90ICdhcHBlbmQnICovCisJLyogSXQgcHJvYmFibHkgbWVhbnMgdGhhdCBpdCBpcyB1c2luZyAiZmlyc3QgbWF0Y2giIHJ1bGUgKi8KKwljb21tYW5kX251bSA9IGluZGV4X2luX3N1YnN0cmluZ3MoaXBfcm91dGVfY29tbWFuZHMsICphcmd2KTsKKworCXN3aXRjaCAoY29tbWFuZF9udW0pIHsKKwkJY2FzZSAwOiAvKiBhZGQgKi8KKwkJCWZsYWdzID0gTkxNX0ZfQ1JFQVRFfE5MTV9GX0VYQ0w7CisJCQlicmVhazsKKwkJY2FzZSAxOiAvKiBhcHBlbmQgKi8KKwkJCWZsYWdzID0gTkxNX0ZfQ1JFQVRFfE5MTV9GX0FQUEVORDsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8qIGNoYW5nZSAqLworCQljYXNlIDM6IC8qIGNoZyAqLworCQkJZmxhZ3MgPSBOTE1fRl9SRVBMQUNFOworCQkJYnJlYWs7CisJCWNhc2UgNDogLyogZGVsZXRlICovCisJCQljbWQgPSBSVE1fREVMUk9VVEU7CisJCQlicmVhazsKKwkJY2FzZSA1OiAvKiBnZXQgKi8KKwkJCXJldHVybiBpcHJvdXRlX2dldChhcmd2KzEpOworCQljYXNlIDY6IC8qIGxpc3QgKi8KKwkJY2FzZSA3OiAvKiBzaG93ICovCisJCQlyZXR1cm4gaXByb3V0ZV9saXN0X29yX2ZsdXNoKGFyZ3YrMSwgMCk7CisJCWNhc2UgODogLyogcHJlcGVuZCAqLworCQkJZmxhZ3MgPSBOTE1fRl9DUkVBVEU7CisJCQlicmVhazsKKwkJY2FzZSA5OiAvKiByZXBsYWNlICovCisJCQlmbGFncyA9IE5MTV9GX0NSRUFURXxOTE1fRl9SRVBMQUNFOworCQkJYnJlYWs7CisJCWNhc2UgMTA6IC8qIHRlc3QgKi8KKwkJCWZsYWdzID0gTkxNX0ZfRVhDTDsKKwkJCWJyZWFrOworCQljYXNlIDExOiAvKiBmbHVzaCAqLworCQkJcmV0dXJuIGlwcm91dGVfbGlzdF9vcl9mbHVzaChhcmd2KzEsIDEpOworCQlkZWZhdWx0OgorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gY29tbWFuZCAlcyIsICphcmd2KTsKKwl9CisKKwlyZXR1cm4gaXByb3V0ZV9tb2RpZnkoY21kLCBmbGFncywgYXJndisxKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHJ1bGUuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHJ1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDMyNjVjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwcnVsZS5jCkBAIC0wLDAgKzEsMzE3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIFJhbmkgQXNzYWYgPHJhbmlAbWFnaWMubWV0YXdpcmUuY29tPiA5ODA5Mjk6IHJlc29sdmUgYWRkcmVzc2VzCisgKiBpbml0aWFsbHkgaW50ZWdyYXRlZCBpbnRvIGJ1c3lib3ggYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKi8KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlICJpcF9jb21tb24uaCIgIC8qICNpbmNsdWRlICJsaWJiYi5oIiBpcyBpbnNpZGUgKi8KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKy8qCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIHJ1bGUgWyBsaXN0IHwgYWRkIHwgZGVsIF0gU0VMRUNUT1IgQUNUSU9OXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlNFTEVDVE9SIDo9IFsgZnJvbSBQUkVGSVggXSBbIHRvIFBSRUZJWCBdIFsgdG9zIFRPUyBdIFsgZndtYXJrIEZXTUFSSyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgIFsgZGV2IFNUUklORyBdIFsgcHJlZiBOVU1CRVIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJBQ1RJT04gOj0gWyB0YWJsZSBUQUJMRV9JRCBdIFsgbmF0IEFERFJFU1MgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgWyBwcm9oaWJpdCB8IHJlamVjdCB8IHVucmVhY2hhYmxlIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgcmVhbG1zIFtTUkNSRUFMTS9dRFNUUkVBTE0gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJUQUJMRV9JRCA6PSBbIGxvY2FsIHwgbWFpbiB8IGRlZmF1bHQgfCBOVU1CRVIgXVxuIik7CisJZXhpdCgtMSk7Cit9CisqLworCitzdGF0aWMgaW50IEZBU1RfRlVOQyBwcmludF9ydWxlKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvIFVOVVNFRF9QQVJBTSwKKwkJCQkJc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBydG1zZyAqciA9IE5MTVNHX0RBVEEobik7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwlpbnQgaG9zdF9sZW4gPSAtMTsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbUlRBX01BWCsxXTsKKwljaGFyIGFidWZbMjU2XTsKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdSVUxFKQorCQlyZXR1cm4gMDsKKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpyKSk7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiAtMTsKKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBSVEFfTUFYLCBSVE1fUlRBKHIpLCBsZW4pOworCisJaWYgKHItPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJaG9zdF9sZW4gPSAzMjsKKwllbHNlIGlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2KQorCQlob3N0X2xlbiA9IDEyODsKKy8qCWVsc2UgaWYgKHItPnJ0bV9mYW1pbHkgPT0gQUZfREVDbmV0KQorCQlob3N0X2xlbiA9IDE2OworCWVsc2UgaWYgKHItPnJ0bV9mYW1pbHkgPT0gQUZfSVBYKQorCQlob3N0X2xlbiA9IDgwOworKi8KKwlwcmludGYoIiV1Olx0IiwgdGJbUlRBX1BSSU9SSVRZXSA/CisJCQkJCSoodW5zaWduZWQqKVJUQV9EQVRBKHRiW1JUQV9QUklPUklUWV0pCisJCQkJCTogMCk7CisJcHJpbnRmKCJmcm9tICIpOworCWlmICh0YltSVEFfU1JDXSkgeworCQlpZiAoci0+cnRtX3NyY19sZW4gIT0gaG9zdF9sZW4pIHsKKwkJCXByaW50ZigiJXMvJXUiLCBydF9hZGRyX24yYShyLT5ydG1fZmFtaWx5LAorCQkJCQkJCSBSVEFfREFUQSh0YltSVEFfU1JDXSksCisJCQkJCQkJIGFidWYsIHNpemVvZihhYnVmKSksCisJCQkJci0+cnRtX3NyY19sZW4KKwkJCQkpOworCQl9IGVsc2UgeworCQkJZnB1dHMoZm9ybWF0X2hvc3Qoci0+cnRtX2ZhbWlseSwKKwkJCQkJCSAgICAgICBSVEFfUEFZTE9BRCh0YltSVEFfU1JDXSksCisJCQkJCQkgICAgICAgUlRBX0RBVEEodGJbUlRBX1NSQ10pLAorCQkJCQkJICAgICAgIGFidWYsIHNpemVvZihhYnVmKSksIHN0ZG91dCk7CisJCX0KKwl9IGVsc2UgaWYgKHItPnJ0bV9zcmNfbGVuKSB7CisJCXByaW50ZigiMC8lZCIsIHItPnJ0bV9zcmNfbGVuKTsKKwl9IGVsc2UgeworCQlwcmludGYoImFsbCIpOworCX0KKwliYl9wdXRjaGFyKCcgJyk7CisKKwlpZiAodGJbUlRBX0RTVF0pIHsKKwkJaWYgKHItPnJ0bV9kc3RfbGVuICE9IGhvc3RfbGVuKSB7CisJCQlwcmludGYoInRvICVzLyV1ICIsIHJ0X2FkZHJfbjJhKHItPnJ0bV9mYW1pbHksCisJCQkJCQkJIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwKKwkJCQkJCQkgYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJCQlyLT5ydG1fZHN0X2xlbgorCQkJCSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoInRvICVzICIsIGZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCQkgICAgICAgUlRBX1BBWUxPQUQodGJbUlRBX0RTVF0pLAorCQkJCQkJICAgICAgIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwKKwkJCQkJCSAgICAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwkJfQorCX0gZWxzZSBpZiAoci0+cnRtX2RzdF9sZW4pIHsKKwkJcHJpbnRmKCJ0byAwLyVkICIsIHItPnJ0bV9kc3RfbGVuKTsKKwl9CisKKwlpZiAoci0+cnRtX3RvcykgeworCQlwcmludGYoInRvcyAlcyAiLCBydG5sX2RzZmllbGRfbjJhKHItPnJ0bV90b3MsIGIxKSk7CisJfQorCWlmICh0YltSVEFfUFJPVE9JTkZPXSkgeworCQlwcmludGYoImZ3bWFyayAlI3ggIiwgKih1aW50MzJfdCopUlRBX0RBVEEodGJbUlRBX1BST1RPSU5GT10pKTsKKwl9CisKKwlpZiAodGJbUlRBX0lJRl0pIHsKKwkJcHJpbnRmKCJpaWYgJXMgIiwgKGNoYXIqKVJUQV9EQVRBKHRiW1JUQV9JSUZdKSk7CisJfQorCisJaWYgKHItPnJ0bV90YWJsZSkKKwkJcHJpbnRmKCJsb29rdXAgJXMgIiwgcnRubF9ydHRhYmxlX24yYShyLT5ydG1fdGFibGUsIGIxKSk7CisKKwlpZiAodGJbUlRBX0ZMT1ddKSB7CisJCXVpbnQzMl90IHRvID0gKih1aW50MzJfdCopUlRBX0RBVEEodGJbUlRBX0ZMT1ddKTsKKwkJdWludDMyX3QgZnJvbSA9IHRvPj4xNjsKKwkJdG8gJj0gMHhGRkZGOworCQlpZiAoZnJvbSkgeworCQkJcHJpbnRmKCJyZWFsbXMgJXMvIiwKKwkJCQlydG5sX3J0cmVhbG1fbjJhKGZyb20sIGIxKSk7CisJCX0KKwkJcHJpbnRmKCIlcyAiLAorCQkJcnRubF9ydHJlYWxtX24yYSh0bywgYjEpKTsKKwl9CisKKwlpZiAoci0+cnRtX3R5cGUgPT0gUlROX05BVCkgeworCQlpZiAodGJbUlRBX0dBVEVXQVldKSB7CisJCQlwcmludGYoIm1hcC10byAlcyAiLAorCQkJCWZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCSAgICBSVEFfUEFZTE9BRCh0YltSVEFfR0FURVdBWV0pLAorCQkJCQkgICAgUlRBX0RBVEEodGJbUlRBX0dBVEVXQVldKSwKKwkJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCQl9IGVsc2UKKwkJCXByaW50ZigibWFzcXVlcmFkZSIpOworCX0gZWxzZSBpZiAoci0+cnRtX3R5cGUgIT0gUlROX1VOSUNBU1QpCisJCWZwdXRzKHJ0bmxfcnRudHlwZV9uMmEoci0+cnRtX3R5cGUsIGIxKSwgc3Rkb3V0KTsKKworCWJiX3B1dGNoYXIoJ1xuJyk7CisJLypmZmx1c2hfYWxsKCk7Ki8KKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworc3RhdGljIGludCBpcHJ1bGVfbGlzdChjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCWludCBhZiA9IHByZWZlcnJlZF9mYW1pbHk7CisKKwlpZiAoYWYgPT0gQUZfVU5TUEVDKQorCQlhZiA9IEFGX0lORVQ7CisKKwlpZiAoKmFyZ3YpIHsKKwkJLy9iYl9lcnJvcl9tc2coIlwicnVsZSBzaG93XCIgbmVlZHMgbm8gYXJndW1lbnRzIik7CisJCWJiX3dhcm5faWdub3JpbmdfYXJncygqYXJndik7CisJCXJldHVybiAtMTsKKwl9CisKKwl4cnRubF9vcGVuKCZydGgpOworCisJeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBhZiwgUlRNX0dFVFJVTEUpOworCXhydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X3J1bGUsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgaXBydWxlX21vZGlmeShpbnQgY21kLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJmcm9tXDAiInRvXDAiInByZWZlcmVuY2VcMCIib3JkZXJcMCIicHJpb3JpdHlcMCIKKwkJInRvc1wwIiJmd21hcmtcMCIicmVhbG1zXDAiInRhYmxlXDAiImxvb2t1cFwwIiJkZXZcMCIKKwkJImlpZlwwIiJuYXRcMCIibWFwLXRvXDAiInR5cGVcMCIiaGVscFwwIjsKKwllbnVtIHsKKwkJQVJHX2Zyb20gPSAxLCBBUkdfdG8sIEFSR19wcmVmZXJlbmNlLCBBUkdfb3JkZXIsIEFSR19wcmlvcml0eSwKKwkJQVJHX3RvcywgQVJHX2Z3bWFyaywgQVJHX3JlYWxtcywgQVJHX3RhYmxlLCBBUkdfbG9va3VwLCBBUkdfZGV2LAorCQlBUkdfaWlmLCBBUkdfbmF0LCBBUkdfbWFwX3RvLCBBUkdfdHlwZSwgQVJHX2hlbHAKKwl9OworCWJvb2wgdGFibGVfb2sgPSAwOworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBydG1zZyAgICByOworCQljaGFyICAgICAgICAgICAgYnVmWzEwMjRdOworCX0gcmVxOworCXNtYWxsdWludCBrZXk7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfdHlwZSA9IGNtZDsKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydG1zZykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwlyZXEuci5ydG1fZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwlyZXEuci5ydG1fcHJvdG9jb2wgPSBSVFBST1RfQk9PVDsKKwlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKwlyZXEuci5ydG1fdGFibGUgPSAwOworCXJlcS5yLnJ0bV90eXBlID0gUlROX1VOU1BFQzsKKworCWlmIChjbWQgPT0gUlRNX05FV1JVTEUpIHsKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgfD0gTkxNX0ZfQ1JFQVRFfE5MTV9GX0VYQ0w7CisJCXJlcS5yLnJ0bV90eXBlID0gUlROX1VOSUNBU1Q7CisJfQorCisJd2hpbGUgKCphcmd2KSB7CisJCWtleSA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KSArIDE7CisJCWlmIChrZXkgPT0gMCkgLyogbm8gbWF0Y2ggZm91bmQgaW4ga2V5d29yZHMgYXJyYXksIGJhaWwgb3V0LiAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQlpZiAoa2V5ID09IEFSR19mcm9tKSB7CisJCQlpbmV0X3ByZWZpeCBkc3Q7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmZHN0LCAqYXJndiwgcmVxLnIucnRtX2ZhbWlseSk7CisJCQlyZXEuci5ydG1fc3JjX2xlbiA9IGRzdC5iaXRsZW47CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1NSQywgJmRzdC5kYXRhLCBkc3QuYnl0ZWxlbik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR190bykgeworCQkJaW5ldF9wcmVmaXggZHN0OworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9wcmVmaXgoJmRzdCwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJcmVxLnIucnRtX2RzdF9sZW4gPSBkc3QuYml0bGVuOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9EU1QsICZkc3QuZGF0YSwgZHN0LmJ5dGVsZW4pOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfcHJlZmVyZW5jZSB8fAorCQkJICAga2V5ID09IEFSR19vcmRlciB8fAorCQkJICAga2V5ID09IEFSR19wcmlvcml0eQorCQkpIHsKKwkJCXVpbnQzMl90IHByZWY7CisJCQlORVhUX0FSRygpOworCQkJcHJlZiA9IGdldF91MzIoKmFyZ3YsICJwcmVmZXJlbmNlIik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BSSU9SSVRZLCBwcmVmKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3RvcykgeworCQkJdWludDMyX3QgdG9zOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX2RzZmllbGRfYTJuKCZ0b3MsICphcmd2KSkKKwkJCQlpbnZhcmcoKmFyZ3YsICJUT1MiKTsKKwkJCXJlcS5yLnJ0bV90b3MgPSB0b3M7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19md21hcmspIHsKKwkJCXVpbnQzMl90IGZ3bWFyazsKKwkJCU5FWFRfQVJHKCk7CisJCQlmd21hcmsgPSBnZXRfdTMyKCphcmd2LCAiZndtYXJrIik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BST1RPSU5GTywgZndtYXJrKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3JlYWxtcykgeworCQkJdWludDMyX3QgcmVhbG07CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9ydF9yZWFsbXMoJnJlYWxtLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAicmVhbG1zIik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0ZMT1csIHJlYWxtKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3RhYmxlIHx8CisJCQkgICBrZXkgPT0gQVJHX2xvb2t1cAorCQkpIHsKKwkJCXVpbnQzMl90IHRpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9ydHRhYmxlX2EybigmdGlkLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAidGFibGUgSUQiKTsKKwkJCXJlcS5yLnJ0bV90YWJsZSA9IHRpZDsKKwkJCXRhYmxlX29rID0gMTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2RldiB8fAorCQkJICAga2V5ID09IEFSR19paWYKKwkJKSB7CisJCQlORVhUX0FSRygpOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9JSUYsICphcmd2LCBzdHJsZW4oKmFyZ3YpKzEpOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfbmF0IHx8CisJCQkgICBrZXkgPT0gQVJHX21hcF90bworCQkpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0dBVEVXQVksIGdldF9hZGRyMzIoKmFyZ3YpKTsKKwkJCXJlcS5yLnJ0bV90eXBlID0gUlROX05BVDsKKwkJfSBlbHNlIHsKKwkJCWludCB0eXBlOworCisJCQlpZiAoa2V5ID09IEFSR190eXBlKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChrZXkgPT0gQVJHX2hlbHApCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJaWYgKHJ0bmxfcnRudHlwZV9hMm4oJnR5cGUsICphcmd2KSkKKwkJCQlpbnZhcmcoKmFyZ3YsICJ0eXBlIik7CisJCQlyZXEuci5ydG1fdHlwZSA9IHR5cGU7CisJCX0KKwkJYXJndisrOworCX0KKworCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJcmVxLnIucnRtX2ZhbWlseSA9IEFGX0lORVQ7CisKKwlpZiAoIXRhYmxlX29rICYmIGNtZCA9PSBSVE1fTkVXUlVMRSkKKwkJcmVxLnIucnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKworCXhydG5sX29wZW4oJnJ0aCk7CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKQorCQlyZXR1cm4gMjsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitpbnQgRkFTVF9GVU5DIGRvX2lwcnVsZShjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBpcF9ydWxlX2NvbW1hbmRzW10gQUxJR04xID0KKwkJImFkZFwwIiJkZWxldGVcMCIibGlzdFwwIiJzaG93XDAiOworCWlmICgqYXJndikgeworCQlzbWFsbHVpbnQgY21kID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhpcF9ydWxlX2NvbW1hbmRzLCAqYXJndik7CisJCWlmIChjbWQgPiAzKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQlhcmd2Kys7CisJCWlmIChjbWQgPCAyKQorCQkJcmV0dXJuIGlwcnVsZV9tb2RpZnkoKGNtZCA9PSAwKSA/IFJUTV9ORVdSVUxFIDogUlRNX0RFTFJVTEUsIGFyZ3YpOworCX0KKwlyZXR1cm4gaXBydWxlX2xpc3QoYXJndik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXB0dW5uZWwuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHR1bm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDJmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXB0dW5uZWwuYwpAQCAtMCwwICsxLDU3NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogQ2hhbmdlczoKKyAqCisgKiBSYW5pIEFzc2FmIDxyYW5pQG1hZ2ljLm1ldGF3aXJlLmNvbT4gOTgwOTI5OiByZXNvbHZlIGFkZHJlc3NlcworICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkzMDogZG8gbm90IGFsbG93IGtleSBmb3IgaXBpcC9zaXQKKyAqIFBoaWwgS2FybiA8a2FybkBrYTlxLmFtcHIub3JnPiAgICAgICA5OTA0MDg6ICJwbXR1ZGlzYyIgZmxhZworICovCisKKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZuZGVmIF9fY29uc3RhbnRfaHRvbnMKKyNkZWZpbmUgX19jb25zdGFudF9odG9ucyBodG9ucworI2VuZGlmCisKKy8vIEZZSTogI2RlZmluZSBTSU9DREVWUFJJVkFURSAweDg5RjAKKworLyogRnJvbSBsaW51eC9pZl90dW5uZWwuaC4gI2luY2x1ZGluZyBpdCBwcm92ZWQgdHJvdWJsZXNvbWUKKyAqIChyZWRlZmluaXRvbiBlcnJvcnMgZHVlIHRvIG5hbWUgY29sbGlzaW9ucyBpbiBsaW51eC8gYW5kIG5ldFtpbmV0XS8pICovCisjZGVmaW5lIFNJT0NHRVRUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAwKQorI2RlZmluZSBTSU9DQUREVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMSkKKyNkZWZpbmUgU0lPQ0RFTFRVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDIpCisjZGVmaW5lIFNJT0NDSEdUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAzKQorLy8jZGVmaW5lIFNJT0NHRVRQUkwgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA0KQorLy8jZGVmaW5lIFNJT0NBRERQUkwgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA1KQorLy8jZGVmaW5lIFNJT0NERUxQUkwgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA2KQorLy8jZGVmaW5lIFNJT0NDSEdQUkwgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA3KQorI2RlZmluZSBHUkVfQ1NVTSAgICAgICAgX19jb25zdGFudF9odG9ucygweDgwMDApCisvLyNkZWZpbmUgR1JFX1JPVVRJTkcgICAgIF9fY29uc3RhbnRfaHRvbnMoMHg0MDAwKQorI2RlZmluZSBHUkVfS0VZICAgICAgICAgX19jb25zdGFudF9odG9ucygweDIwMDApCisjZGVmaW5lIEdSRV9TRVEgICAgICAgICBfX2NvbnN0YW50X2h0b25zKDB4MTAwMCkKKy8vI2RlZmluZSBHUkVfU1RSSUNUICAgICAgX19jb25zdGFudF9odG9ucygweDA4MDApCisvLyNkZWZpbmUgR1JFX1JFQyAgICAgICAgIF9fY29uc3RhbnRfaHRvbnMoMHgwNzAwKQorLy8jZGVmaW5lIEdSRV9GTEFHUyAgICAgICBfX2NvbnN0YW50X2h0b25zKDB4MDBGOCkKKy8vI2RlZmluZSBHUkVfVkVSU0lPTiAgICAgX19jb25zdGFudF9odG9ucygweDAwMDcpCitzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0geworCWNoYXIgICAgICAgICAgICBuYW1lW0lGTkFNU0laXTsKKwlpbnQgICAgICAgICAgICAgbGluazsKKwl1aW50MTZfdCAgICAgICAgaV9mbGFnczsKKwl1aW50MTZfdCAgICAgICAgb19mbGFnczsKKwl1aW50MzJfdCAgICAgICAgaV9rZXk7CisJdWludDMyX3QgICAgICAgIG9fa2V5OworCXN0cnVjdCBpcGhkciAgICBpcGg7Cit9OworLyogU0lULW1vZGUgaV9mbGFncyAqLworLy8jZGVmaW5lIFNJVF9JU0FUQVAgMHgwMDAxCisvL3N0cnVjdCBpcF90dW5uZWxfcHJsIHsKKy8vCXVpbnQzMl90ICAgICAgICAgIGFkZHI7CisvLwl1aW50MTZfdCAgICAgICAgICBmbGFnczsKKy8vCXVpbnQxNl90ICAgICAgICAgIF9fcmVzZXJ2ZWQ7CisvLwl1aW50MzJfdCAgICAgICAgICBkYXRhbGVuOworLy8JdWludDMyX3QgICAgICAgICAgX19yZXNlcnZlZDI7CisvLwkvKiBkYXRhIGZvbGxvd3MgKi8KKy8vfTsKKy8vLyogUFJMIGZsYWdzICovCisvLyNkZWZpbmUgUFJMX0RFRkFVTFQgMHgwMDAxCisKKyNpbmNsdWRlICJpcF9jb21tb24uaCIgIC8qICNpbmNsdWRlICJsaWJiYi5oIiBpcyBpbnNpZGUgKi8KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKworLyogRGllcyBvbiBlcnJvciAqLworc3RhdGljIGludCBkb19pb2N0bF9nZXRfaWZpbmRleChjaGFyICpkZXYpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgZGV2KTsKKwlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJeGlvY3RsKGZkLCBTSU9DR0lGSU5ERVgsICZpZnIpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gaWZyLmlmcl9pZmluZGV4OworfQorCitzdGF0aWMgaW50IGRvX2lvY3RsX2dldF9pZnR5cGUoY2hhciAqZGV2KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCWludCBlcnI7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgZGV2KTsKKwlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJZXJyID0gaW9jdGxfb3Jfd2FybihmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcik7CisJY2xvc2UoZmQpOworCXJldHVybiBlcnIgPyAtMSA6IGlmci5pZnJfYWRkci5zYV9mYW1pbHk7Cit9CisKK3N0YXRpYyBjaGFyICpkb19pb2N0bF9nZXRfaWZuYW1lKGludCBpZHgpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJaW50IGVycjsKKworCWlmci5pZnJfaWZpbmRleCA9IGlkeDsKKwlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJZXJyID0gaW9jdGxfb3Jfd2FybihmZCwgU0lPQ0dJRk5BTUUsICZpZnIpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gZXJyID8gTlVMTCA6IHhzdHJuZHVwKGlmci5pZnJfbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworfQorCitzdGF0aWMgaW50IGRvX2dldF9pb2N0bChjb25zdCBjaGFyICpiYXNlZGV2LCBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnApCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJaW50IGVycjsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBiYXNlZGV2KTsKKwlpZnIuaWZyX2lmcnUuaWZydV9kYXRhID0gKHZvaWQqKXA7CisJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWVyciA9IGlvY3RsX29yX3dhcm4oZmQsIFNJT0NHRVRUVU5ORUwsICZpZnIpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBEaWVzIG9uIGVycm9yLCBvdGhlcndpc2UgcmV0dXJucyAwICovCitzdGF0aWMgaW50IGRvX2FkZF9pb2N0bChpbnQgY21kLCBjb25zdCBjaGFyICpiYXNlZGV2LCBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnApCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisKKwlpZiAoY21kID09IFNJT0NDSEdUVU5ORUwgJiYgcC0+bmFtZVswXSkgeworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgcC0+bmFtZSk7CisJfSBlbHNlIHsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGJhc2VkZXYpOworCX0KKwlpZnIuaWZyX2lmcnUuaWZydV9kYXRhID0gKHZvaWQqKXA7CisJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworI2lmIEVOQUJMRV9JT0NUTF9IRVgyU1RSX0VSUk9SCisJLyogI2RlZmluZSBtYWdpYyB3aWxsIHR1cm4gaW9jdGwjIGludG8gc3RyaW5nICovCisJaWYgKGNtZCA9PSBTSU9DQ0hHVFVOTkVMKQorCQl4aW9jdGwoZmQsIFNJT0NDSEdUVU5ORUwsICZpZnIpOworCWVsc2UKKwkJeGlvY3RsKGZkLCBTSU9DQUREVFVOTkVMLCAmaWZyKTsKKyNlbHNlCisJeGlvY3RsKGZkLCBjbWQsICZpZnIpOworI2VuZGlmCisJY2xvc2UoZmQpOworCXJldHVybiAwOworfQorCisvKiBEaWVzIG9uIGVycm9yLCBvdGhlcndpc2UgcmV0dXJucyAwICovCitzdGF0aWMgaW50IGRvX2RlbF9pb2N0bChjb25zdCBjaGFyICpiYXNlZGV2LCBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnApCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisKKwlpZiAocC0+bmFtZVswXSkgeworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgcC0+bmFtZSk7CisJfSBlbHNlIHsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGJhc2VkZXYpOworCX0KKwlpZnIuaWZyX2lmcnUuaWZydV9kYXRhID0gKHZvaWQqKXA7CisJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCXhpb2N0bChmZCwgU0lPQ0RFTFRVTk5FTCwgJmlmcik7CisJY2xvc2UoZmQpOworCXJldHVybiAwOworfQorCisvKiBEaWVzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZCBwYXJzZV9hcmdzKGNoYXIgKiphcmd2LCBpbnQgY21kLCBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnApCit7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkibW9kZVwwIiJpcGlwXDAiImlwL2lwXDAiImdyZVwwIiJncmUvaXBcMCIic2l0XDAiImlwdjYvaXBcMCIKKwkJImtleVwwIiJpa2V5XDAiIm9rZXlcMCIic2VxXDAiImlzZXFcMCIib3NlcVwwIgorCQkiY3N1bVwwIiJpY3N1bVwwIiJvY3N1bVwwIiJub3BtdHVkaXNjXDAiInBtdHVkaXNjXDAiCisJCSJyZW1vdGVcMCIiYW55XDAiImxvY2FsXDAiImRldlwwIgorCQkidHRsXDAiImluaGVyaXRcMCIidG9zXDAiImRzZmllbGRcMCIKKwkJIm5hbWVcMCI7CisJZW51bSB7CisJCUFSR19tb2RlLCBBUkdfaXBpcCwgQVJHX2lwX2lwLCBBUkdfZ3JlLCBBUkdfZ3JlX2lwLCBBUkdfc2l0LCBBUkdfaXA2X2lwLAorCQlBUkdfa2V5LCBBUkdfaWtleSwgQVJHX29rZXksIEFSR19zZXEsIEFSR19pc2VxLCBBUkdfb3NlcSwKKwkJQVJHX2NzdW0sIEFSR19pY3N1bSwgQVJHX29jc3VtLCBBUkdfbm9wbXR1ZGlzYywgQVJHX3BtdHVkaXNjLAorCQlBUkdfcmVtb3RlLCBBUkdfYW55LCBBUkdfbG9jYWwsIEFSR19kZXYsCisJCUFSR190dGwsIEFSR19pbmhlcml0LCBBUkdfdG9zLCBBUkdfZHNmaWVsZCwKKwkJQVJHX25hbWUKKwl9OworCWludCBjb3VudCA9IDA7CisJY2hhciBtZWRpdW1bSUZOQU1TSVpdOworCWludCBrZXk7CisKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJbWVkaXVtWzBdID0gJ1wwJzsKKworCXAtPmlwaC52ZXJzaW9uID0gNDsKKwlwLT5pcGguaWhsID0gNTsKKyNpZm5kZWYgSVBfREYKKyNkZWZpbmUgSVBfREYgMHg0MDAwICAvKiBGbGFnOiAiRG9uJ3QgRnJhZ21lbnQiICovCisjZW5kaWYKKwlwLT5pcGguZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJa2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoa2V5ID09IEFSR19tb2RlKSB7CisJCQlORVhUX0FSRygpOworCQkJa2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQkJaWYgKGtleSA9PSBBUkdfaXBpcCB8fAorCQkJICAgIGtleSA9PSBBUkdfaXBfaXAKKwkJCSkgeworCQkJCWlmIChwLT5pcGgucHJvdG9jb2wgJiYgcC0+aXBoLnByb3RvY29sICE9IElQUFJPVE9fSVBJUCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgdHVubmVsIG1vZGUiLCAieW91IG1hbmFnZWQgdG8gYXNrIGZvciBtb3JlIHRoYW4gb25lIik7CisJCQkJfQorCQkJCXAtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBJUDsKKwkJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19ncmUgfHwKKwkJCQkgICBrZXkgPT0gQVJHX2dyZV9pcAorCQkJKSB7CisJCQkJaWYgKHAtPmlwaC5wcm90b2NvbCAmJiBwLT5pcGgucHJvdG9jb2wgIT0gSVBQUk9UT19HUkUpIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHR1bm5lbCBtb2RlIiwgInlvdSBtYW5hZ2VkIHRvIGFzayBmb3IgbW9yZSB0aGFuIG9uZSIpOworCQkJCX0KKwkJCQlwLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0dSRTsKKwkJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19zaXQgfHwKKwkJCQkgICBrZXkgPT0gQVJHX2lwNl9pcAorCQkJKSB7CisJCQkJaWYgKHAtPmlwaC5wcm90b2NvbCAmJiBwLT5pcGgucHJvdG9jb2wgIT0gSVBQUk9UT19JUFY2KSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyB0dW5uZWwgbW9kZSIsICJ5b3UgbWFuYWdlZCB0byBhc2sgZm9yIG1vcmUgdGhhbiBvbmUiKTsKKwkJCQl9CisJCQkJcC0+aXBoLnByb3RvY29sID0gSVBQUk9UT19JUFY2OworCQkJfSBlbHNlIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgdHVubmVsIG1vZGUiLCAiY2FuJ3QgZ3Vlc3MiKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2tleSkgeworCQkJdW5zaWduZWQgdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9LRVk7CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9LRVk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXAtPmlfa2V5ID0gcC0+b19rZXkgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCXV2YWwgPSBnZXRfdW5zaWduZWQoKmFyZ3YsICJrZXkiKTsKKwkJCQlwLT5pX2tleSA9IHAtPm9fa2V5ID0gaHRvbmwodXZhbCk7CisJCQl9CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19pa2V5KSB7CisJCQl1bnNpZ25lZCB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCWlmIChzdHJjaHIoKmFyZ3YsICcuJykpCisJCQkJcC0+b19rZXkgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCXV2YWwgPSBnZXRfdW5zaWduZWQoKmFyZ3YsICJpa2V5Iik7CisJCQkJcC0+aV9rZXkgPSBodG9ubCh1dmFsKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX29rZXkpIHsKKwkJCXVuc2lnbmVkIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJcC0+b19mbGFncyB8PSBHUkVfS0VZOworCQkJaWYgKHN0cmNocigqYXJndiwgJy4nKSkKKwkJCQlwLT5vX2tleSA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJZWxzZSB7CisJCQkJdXZhbCA9IGdldF91bnNpZ25lZCgqYXJndiwgIm9rZXkiKTsKKwkJCQlwLT5vX2tleSA9IGh0b25sKHV2YWwpOworCQkJfQorCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfc2VxKSB7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9TRVE7CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9TRVE7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19pc2VxKSB7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9TRVE7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19vc2VxKSB7CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9TRVE7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19jc3VtKSB7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9DU1VNOworCQkJcC0+b19mbGFncyB8PSBHUkVfQ1NVTTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2ljc3VtKSB7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9DU1VNOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfb2NzdW0pIHsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX0NTVU07CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19ub3BtdHVkaXNjKSB7CisJCQlwLT5pcGguZnJhZ19vZmYgPSAwOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfcG10dWRpc2MpIHsKKwkJCXAtPmlwaC5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3JlbW90ZSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWtleSA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJCWlmIChrZXkgIT0gQVJHX2FueSkKKwkJCQlwLT5pcGguZGFkZHIgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2xvY2FsKSB7CisJCQlORVhUX0FSRygpOworCQkJa2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQkJaWYgKGtleSAhPSBBUkdfYW55KQorCQkJCXAtPmlwaC5zYWRkciA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfZGV2KSB7CisJCQlORVhUX0FSRygpOworCQkJc3RybmNweV9JRk5BTVNJWihtZWRpdW0sICphcmd2KTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3R0bCkgeworCQkJdW5zaWduZWQgdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlrZXkgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCQlpZiAoa2V5ICE9IEFSR19pbmhlcml0KSB7CisJCQkJdXZhbCA9IGdldF91bnNpZ25lZCgqYXJndiwgIlRUTCIpOworCQkJCWlmICh1dmFsID4gMjU1KQorCQkJCQlpbnZhcmcoKmFyZ3YsICJUVEwgbXVzdCBiZSA8PTI1NSIpOworCQkJCXAtPmlwaC50dGwgPSB1dmFsOworCQkJfQorCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfdG9zIHx8CisJCQkgICBrZXkgPT0gQVJHX2RzZmllbGQKKwkJKSB7CisJCQl1aW50MzJfdCB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCWtleSA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJCWlmIChrZXkgIT0gQVJHX2luaGVyaXQpIHsKKwkJCQlpZiAocnRubF9kc2ZpZWxkX2EybigmdXZhbCwgKmFyZ3YpKQorCQkJCQlpbnZhcmcoKmFyZ3YsICJUT1MiKTsKKwkJCQlwLT5pcGgudG9zID0gdXZhbDsKKwkJCX0gZWxzZQorCQkJCXAtPmlwaC50b3MgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGtleSA9PSBBUkdfbmFtZSkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAocC0+bmFtZVswXSkKKwkJCQlkdXBhcmcyKCJuYW1lIiwgKmFyZ3YpOworCQkJc3RybmNweV9JRk5BTVNJWihwLT5uYW1lLCAqYXJndik7CisJCQlpZiAoY21kID09IFNJT0NDSEdUVU5ORUwgJiYgY291bnQgPT0gMCkgeworCQkJCXN0cnVjdCBpcF90dW5uZWxfcGFybSBvbGRfcDsKKwkJCQltZW1zZXQoJm9sZF9wLCAwLCBzaXplb2Yob2xkX3ApKTsKKwkJCQlpZiAoZG9fZ2V0X2lvY3RsKCphcmd2LCAmb2xkX3ApKQorCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQkJKnAgPSBvbGRfcDsKKwkJCX0KKwkJfQorCQljb3VudCsrOworCQlhcmd2Kys7CisJfQorCisJaWYgKHAtPmlwaC5wcm90b2NvbCA9PSAwKSB7CisJCWlmIChtZW1jbXAocC0+bmFtZSwgImdyZSIsIDMpID09IDApCisJCQlwLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0dSRTsKKwkJZWxzZSBpZiAobWVtY21wKHAtPm5hbWUsICJpcGlwIiwgNCkgPT0gMCkKKwkJCXAtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBJUDsKKwkJZWxzZSBpZiAobWVtY21wKHAtPm5hbWUsICJzaXQiLCAzKSA9PSAwKQorCQkJcC0+aXBoLnByb3RvY29sID0gSVBQUk9UT19JUFY2OworCX0KKworCWlmIChwLT5pcGgucHJvdG9jb2wgPT0gSVBQUk9UT19JUElQIHx8IHAtPmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0lQVjYpIHsKKwkJaWYgKChwLT5pX2ZsYWdzICYgR1JFX0tFWSkgfHwgKHAtPm9fZmxhZ3MgJiBHUkVfS0VZKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImtleXMgYXJlIG5vdCBhbGxvd2VkIHdpdGggaXBpcCBhbmQgc2l0Iik7CisJCX0KKwl9CisKKwlpZiAobWVkaXVtWzBdKSB7CisJCXAtPmxpbmsgPSBkb19pb2N0bF9nZXRfaWZpbmRleChtZWRpdW0pOworCX0KKworCWlmIChwLT5pX2tleSA9PSAwICYmIElOX01VTFRJQ0FTVChudG9obChwLT5pcGguZGFkZHIpKSkgeworCQlwLT5pX2tleSA9IHAtPmlwaC5kYWRkcjsKKwkJcC0+aV9mbGFncyB8PSBHUkVfS0VZOworCX0KKwlpZiAocC0+b19rZXkgPT0gMCAmJiBJTl9NVUxUSUNBU1QobnRvaGwocC0+aXBoLmRhZGRyKSkpIHsKKwkJcC0+b19rZXkgPSBwLT5pcGguZGFkZHI7CisJCXAtPm9fZmxhZ3MgfD0gR1JFX0tFWTsKKwl9CisJaWYgKElOX01VTFRJQ0FTVChudG9obChwLT5pcGguZGFkZHIpKSAmJiAhcC0+aXBoLnNhZGRyKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJicm9hZGNhc3QgdHVubmVsIHJlcXVpcmVzIGEgc291cmNlIGFkZHJlc3MiKTsKKwl9Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgZG9fYWRkKGludCBjbWQsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpcF90dW5uZWxfcGFybSBwOworCisJcGFyc2VfYXJncyhhcmd2LCBjbWQsICZwKTsKKworCWlmIChwLmlwaC50dGwgJiYgcC5pcGguZnJhZ19vZmYgPT0gMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidHRsICE9IDAgYW5kIG5vcHRtdWRpc2MgYXJlIGluY29tcGF0aWJsZSIpOworCX0KKworCXN3aXRjaCAocC5pcGgucHJvdG9jb2wpIHsKKwljYXNlIElQUFJPVE9fSVBJUDoKKwkJcmV0dXJuIGRvX2FkZF9pb2N0bChjbWQsICJ0dW5sMCIsICZwKTsKKwljYXNlIElQUFJPVE9fR1JFOgorCQlyZXR1cm4gZG9fYWRkX2lvY3RsKGNtZCwgImdyZTAiLCAmcCk7CisJY2FzZSBJUFBST1RPX0lQVjY6CisJCXJldHVybiBkb19hZGRfaW9jdGwoY21kLCAic2l0MCIsICZwKTsKKwlkZWZhdWx0OgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZGV0ZXJtaW5lIHR1bm5lbCBtb2RlIChpcGlwLCBncmUgb3Igc2l0KSIpOworCX0KK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworc3RhdGljIGludCBkb19kZWwoY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHA7CisKKwlwYXJzZV9hcmdzKGFyZ3YsIFNJT0NERUxUVU5ORUwsICZwKTsKKworCXN3aXRjaCAocC5pcGgucHJvdG9jb2wpIHsKKwljYXNlIElQUFJPVE9fSVBJUDoKKwkJcmV0dXJuIGRvX2RlbF9pb2N0bCgidHVubDAiLCAmcCk7CisJY2FzZSBJUFBST1RPX0dSRToKKwkJcmV0dXJuIGRvX2RlbF9pb2N0bCgiZ3JlMCIsICZwKTsKKwljYXNlIElQUFJPVE9fSVBWNjoKKwkJcmV0dXJuIGRvX2RlbF9pb2N0bCgic2l0MCIsICZwKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZG9fZGVsX2lvY3RsKHAubmFtZSwgJnApOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfdHVubmVsKHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcCkKK3sKKwljaGFyIHMxWzI1Nl07CisJY2hhciBzMlsyNTZdOworCWNoYXIgczNbNjRdOworCWNoYXIgczRbNjRdOworCisJZm9ybWF0X2hvc3QoQUZfSU5FVCwgNCwgJnAtPmlwaC5kYWRkciwgczEsIHNpemVvZihzMSkpOworCWZvcm1hdF9ob3N0KEFGX0lORVQsIDQsICZwLT5pcGguc2FkZHIsIHMyLCBzaXplb2YoczIpKTsKKwlpbmV0X250b3AoQUZfSU5FVCwgJnAtPmlfa2V5LCBzMywgc2l6ZW9mKHMzKSk7CisJaW5ldF9udG9wKEFGX0lORVQsICZwLT5vX2tleSwgczQsIHNpemVvZihzNCkpOworCisJcHJpbnRmKCIlczogJXMvaXAgIHJlbW90ZSAlcyAgbG9jYWwgJXMgIiwKKwkgICAgICAgcC0+bmFtZSwKKwkgICAgICAgcC0+aXBoLnByb3RvY29sID09IElQUFJPVE9fSVBJUCA/ICJpcCIgOgorCSAgICAgICAocC0+aXBoLnByb3RvY29sID09IElQUFJPVE9fR1JFID8gImdyZSIgOgorCQkocC0+aXBoLnByb3RvY29sID09IElQUFJPVE9fSVBWNiA/ICJpcHY2IiA6ICJ1bmtub3duIikpLAorCSAgICAgICBwLT5pcGguZGFkZHIgPyBzMSA6ICJhbnkiLCBwLT5pcGguc2FkZHIgPyBzMiA6ICJhbnkiKTsKKwlpZiAocC0+bGluaykgeworCQljaGFyICpuID0gZG9faW9jdGxfZ2V0X2lmbmFtZShwLT5saW5rKTsKKwkJaWYgKG4pIHsKKwkJCXByaW50ZigiIGRldiAlcyAiLCBuKTsKKwkJCWZyZWUobik7CisJCX0KKwl9CisJaWYgKHAtPmlwaC50dGwpCisJCXByaW50ZigiIHR0bCAlZCAiLCBwLT5pcGgudHRsKTsKKwllbHNlCisJCXByaW50ZigiIHR0bCBpbmhlcml0ICIpOworCWlmIChwLT5pcGgudG9zKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlwcmludGYoIiB0b3MiKTsKKwkJaWYgKHAtPmlwaC50b3MgJiAxKQorCQkJcHJpbnRmKCIgaW5oZXJpdCIpOworCQlpZiAocC0+aXBoLnRvcyAmIH4xKQorCQkJcHJpbnRmKCIlYyVzICIsIHAtPmlwaC50b3MgJiAxID8gJy8nIDogJyAnLAorCQkJICAgICAgIHJ0bmxfZHNmaWVsZF9uMmEocC0+aXBoLnRvcyAmIH4xLCBiMSkpOworCX0KKwlpZiAoIShwLT5pcGguZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpKQorCQlwcmludGYoIiBub3BtdHVkaXNjIik7CisKKwlpZiAoKHAtPmlfZmxhZ3MgJiBHUkVfS0VZKSAmJiAocC0+b19mbGFncyAmIEdSRV9LRVkpICYmIHAtPm9fa2V5ID09IHAtPmlfa2V5KQorCQlwcmludGYoIiBrZXkgJXMiLCBzMyk7CisJZWxzZSBpZiAoKHAtPmlfZmxhZ3MgfCBwLT5vX2ZsYWdzKSAmIEdSRV9LRVkpIHsKKwkJaWYgKHAtPmlfZmxhZ3MgJiBHUkVfS0VZKQorCQkJcHJpbnRmKCIgaWtleSAlcyAiLCBzMyk7CisJCWlmIChwLT5vX2ZsYWdzICYgR1JFX0tFWSkKKwkJCXByaW50ZigiIG9rZXkgJXMgIiwgczQpOworCX0KKworCWlmIChwLT5pX2ZsYWdzICYgR1JFX1NFUSkKKwkJcHJpbnRmKCIlYyAgRHJvcCBwYWNrZXRzIG91dCBvZiBzZXF1ZW5jZS5cbiIsIF9TTF8pOworCWlmIChwLT5pX2ZsYWdzICYgR1JFX0NTVU0pCisJCXByaW50ZigiJWMgIENoZWNrc3VtIGluIHJlY2VpdmVkIHBhY2tldCBpcyByZXF1aXJlZC4iLCBfU0xfKTsKKwlpZiAocC0+b19mbGFncyAmIEdSRV9TRVEpCisJCXByaW50ZigiJWMgIFNlcXVlbmNlIHBhY2tldHMgb24gb3V0cHV0LiIsIF9TTF8pOworCWlmIChwLT5vX2ZsYWdzICYgR1JFX0NTVU0pCisJCXByaW50ZigiJWMgIENoZWNrc3VtIG91dHB1dCBwYWNrZXRzLiIsIF9TTF8pOworfQorCitzdGF0aWMgdm9pZCBkb190dW5uZWxzX2xpc3Qoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJdW5zaWduZWQgbG9uZyByeF9ieXRlcywgcnhfcGFja2V0cywgcnhfZXJycywgcnhfZHJvcHMsCisJCXJ4X2ZpZm8sIHJ4X2ZyYW1lLAorCQl0eF9ieXRlcywgdHhfcGFja2V0cywgdHhfZXJycywgdHhfZHJvcHMsCisJCXR4X2ZpZm8sIHR4X2NvbGxzLCB0eF9jYXJyaWVyLCByeF9tdWx0aTsKKwlpbnQgdHlwZTsKKwlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDE7CisJY2hhciBidWZbNTEyXTsKKwlGSUxFICpmcCA9IGZvcGVuX29yX3dhcm4oIi9wcm9jL25ldC9kZXYiLCAiciIpOworCisJaWYgKGZwID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwkvKiBza2lwIGhlYWRlcnMgKi8KKwlmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCk7CisJZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApOworCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSAhPSBOVUxMKSB7CisJCWNoYXIgKnB0cjsKKworCQkvKmJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsgLSBmZ2V0cyBpcyBzYWZlIGFueXdheSAqLworCQlwdHIgPSBzdHJjaHIoYnVmLCAnOicpOworCQlpZiAocHRyID09IE5VTEwgfHwKKwkJICAgICgqcHRyKysgPSAwLCBzc2NhbmYoYnVmLCAiJXMiLCBuYW1lKSAhPSAxKQorCQkpIHsKKwkJCWJiX2Vycm9yX21zZygid3JvbmcgZm9ybWF0IG9mIC9wcm9jL25ldC9kZXYiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc3NjYW5mKHB0ciwgIiVsdSVsdSVsdSVsdSVsdSVsdSVsdSUqZCVsdSVsdSVsdSVsdSVsdSVsdSVsdSIsCisJCQkgICAmcnhfYnl0ZXMsICZyeF9wYWNrZXRzLCAmcnhfZXJycywgJnJ4X2Ryb3BzLAorCQkJICAgJnJ4X2ZpZm8sICZyeF9mcmFtZSwgJnJ4X211bHRpLAorCQkJICAgJnR4X2J5dGVzLCAmdHhfcGFja2V0cywgJnR4X2VycnMsICZ0eF9kcm9wcywKKwkJCSAgICZ0eF9maWZvLCAmdHhfY29sbHMsICZ0eF9jYXJyaWVyKSAhPSAxNCkKKwkJCWNvbnRpbnVlOworCQlpZiAocC0+bmFtZVswXSAmJiBzdHJjbXAocC0+bmFtZSwgbmFtZSkpCisJCQljb250aW51ZTsKKwkJdHlwZSA9IGRvX2lvY3RsX2dldF9pZnR5cGUobmFtZSk7CisJCWlmICh0eXBlID09IC0xKSB7CisJCQliYl9lcnJvcl9tc2coImNhbid0IGdldCB0eXBlIG9mIFslc10iLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0eXBlICE9IEFSUEhSRF9UVU5ORUwgJiYgdHlwZSAhPSBBUlBIUkRfSVBHUkUgJiYgdHlwZSAhPSBBUlBIUkRfU0lUKQorCQkJY29udGludWU7CisJCW1lbXNldCgmcDEsIDAsIHNpemVvZihwMSkpOworCQlpZiAoZG9fZ2V0X2lvY3RsKG5hbWUsICZwMSkpCisJCQljb250aW51ZTsKKwkJaWYgKChwLT5saW5rICYmIHAxLmxpbmsgIT0gcC0+bGluaykgfHwKKwkJICAgIChwLT5uYW1lWzBdICYmIHN0cmNtcChwMS5uYW1lLCBwLT5uYW1lKSkgfHwKKwkJICAgIChwLT5pcGguZGFkZHIgJiYgcDEuaXBoLmRhZGRyICE9IHAtPmlwaC5kYWRkcikgfHwKKwkJICAgIChwLT5pcGguc2FkZHIgJiYgcDEuaXBoLnNhZGRyICE9IHAtPmlwaC5zYWRkcikgfHwKKwkJICAgIChwLT5pX2tleSAmJiBwMS5pX2tleSAhPSBwLT5pX2tleSkKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludF90dW5uZWwoJnAxKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgZG9fc2hvdyhjaGFyICoqYXJndikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpcF90dW5uZWxfcGFybSBwOworCisJcGFyc2VfYXJncyhhcmd2LCBTSU9DR0VUVFVOTkVMLCAmcCk7CisKKwlzd2l0Y2ggKHAuaXBoLnByb3RvY29sKSB7CisJY2FzZSBJUFBST1RPX0lQSVA6CisJCWVyciA9IGRvX2dldF9pb2N0bChwLm5hbWVbMF0gPyBwLm5hbWUgOiAidHVubDAiLCAmcCk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19HUkU6CisJCWVyciA9IGRvX2dldF9pb2N0bChwLm5hbWVbMF0gPyBwLm5hbWUgOiAiZ3JlMCIsICZwKTsKKwkJYnJlYWs7CisJY2FzZSBJUFBST1RPX0lQVjY6CisJCWVyciA9IGRvX2dldF9pb2N0bChwLm5hbWVbMF0gPyBwLm5hbWUgOiAic2l0MCIsICZwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZG9fdHVubmVsc19saXN0KCZwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChlcnIpCisJCXJldHVybiAtMTsKKworCXByaW50X3R1bm5lbCgmcCk7CisJYmJfcHV0Y2hhcignXG4nKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworaW50IEZBU1RfRlVOQyBkb19pcHR1bm5lbChjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJhZGRcMCIiY2hhbmdlXDAiImRlbGV0ZVwwIiJzaG93XDAiImxpc3RcMCIibHN0XDAiOworCWVudW0geyBBUkdfYWRkID0gMCwgQVJHX2NoYW5nZSwgQVJHX2RlbCwgQVJHX3Nob3csIEFSR19saXN0LCBBUkdfbHN0IH07CisKKwlpZiAoKmFyZ3YpIHsKKwkJc21hbGx1aW50IGtleSA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJaWYgKGtleSA+IDUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsICphcmd2LCBhcHBsZXRfbmFtZSk7CisJCWFyZ3YrKzsKKwkJaWYgKGtleSA9PSBBUkdfYWRkKQorCQkJcmV0dXJuIGRvX2FkZChTSU9DQUREVFVOTkVMLCBhcmd2KTsKKwkJaWYgKGtleSA9PSBBUkdfY2hhbmdlKQorCQkJcmV0dXJuIGRvX2FkZChTSU9DQ0hHVFVOTkVMLCBhcmd2KTsKKwkJaWYgKGtleSA9PSBBUkdfZGVsKQorCQkJcmV0dXJuIGRvX2RlbChhcmd2KTsKKwl9CisJcmV0dXJuIGRvX3Nob3coYXJndik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGlibmV0bGluay5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2xpYm5ldGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzUzM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2xpYm5ldGxpbmsuYwpAQCAtMCwwICsxLDQwMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImxpYm5ldGxpbmsuaCIKKwordm9pZCBGQVNUX0ZVTkMgeHJ0bmxfb3BlbihzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aC8qLCB1bnNpZ25lZCBzdWJzY3JpcHRpb25zKi8pCit7CisJc29ja2xlbl90IGFkZHJfbGVuOworCisJbWVtc2V0KHJ0aCwgMCwgc2l6ZW9mKCpydGgpKTsKKwlydGgtPmZkID0geHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19ST1VURSk7CisJcnRoLT5sb2NhbC5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCS8qcnRoLT5sb2NhbC5ubF9ncm91cHMgPSBzdWJzY3JpcHRpb25zOyovCisKKwl4YmluZChydGgtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmcnRoLT5sb2NhbCwgc2l6ZW9mKHJ0aC0+bG9jYWwpKTsKKwlhZGRyX2xlbiA9IHNpemVvZihydGgtPmxvY2FsKTsKKwlnZXRzb2NrbmFtZShydGgtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmcnRoLT5sb2NhbCwgJmFkZHJfbGVuKTsKKworLyogdG9vIG11Y2ggcGFyYW5vaWEKKwlpZiAoZ2V0c29ja25hbWUocnRoLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnJ0aC0+bG9jYWwsICZhZGRyX2xlbikgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldHNvY2tuYW1lIik7CisJaWYgKGFkZHJfbGVuICE9IHNpemVvZihydGgtPmxvY2FsKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIndyb25nIGFkZHJlc3MgbGVuZ3RoICVkIiwgYWRkcl9sZW4pOworCWlmIChydGgtPmxvY2FsLm5sX2ZhbWlseSAhPSBBRl9ORVRMSU5LKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid3JvbmcgYWRkcmVzcyBmYW1pbHkgJWQiLCBydGgtPmxvY2FsLm5sX2ZhbWlseSk7CisqLworCXJ0aC0+c2VxID0gdGltZShOVUxMKTsKK30KKworaW50IEZBU1RfRlVOQyB4cnRubF93aWxkZHVtcF9yZXF1ZXN0KHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbmxoOworCQlzdHJ1Y3QgcnRnZW5tc2cgZzsKKwl9IHJlcTsKKworCXJlcS5ubGgubmxtc2dfbGVuID0gc2l6ZW9mKHJlcSk7CisJcmVxLm5saC5ubG1zZ190eXBlID0gdHlwZTsKKwlyZXEubmxoLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUk9PVHxOTE1fRl9NQVRDSHxOTE1fRl9SRVFVRVNUOworCXJlcS5ubGgubmxtc2dfcGlkID0gMDsKKwlyZXEubmxoLm5sbXNnX3NlcSA9IHJ0aC0+ZHVtcCA9ICsrcnRoLT5zZXE7CisJcmVxLmcucnRnZW5fZmFtaWx5ID0gZmFtaWx5OworCisJcmV0dXJuIHJ0bmxfc2VuZChydGgsICh2b2lkKikmcmVxLCBzaXplb2YocmVxKSk7Cit9CisKKy8vVE9ETzogcGFzcyBydGgtPmZkIGluc3RlYWQgb2YgZnVsbCBydGg/CitpbnQgRkFTVF9GVU5DIHJ0bmxfc2VuZChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CisKKwltZW1zZXQoJm5sYWRkciwgMCwgc2l6ZW9mKG5sYWRkcikpOworCW5sYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCisJcmV0dXJuIHhzZW5kdG8ocnRoLT5mZCwgYnVmLCBsZW4sIChzdHJ1Y3Qgc29ja2FkZHIqKSZubGFkZHIsIHNpemVvZihubGFkZHIpKTsKK30KKworaW50IEZBU1RfRlVOQyBydG5sX2R1bXBfcmVxdWVzdChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IHR5cGUsIHZvaWQgKnJlcSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgbmxoOworCXN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CisJc3RydWN0IGlvdmVjIGlvdlsyXSA9IHsgeyAmbmxoLCBzaXplb2YobmxoKSB9LCB7IHJlcSwgbGVuIH0gfTsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKwkJKHZvaWQqKSZubGFkZHIsIHNpemVvZihubGFkZHIpLAorCQlpb3YsICAyLAorCQlOVUxMLCAwLAorCQkwCisJfTsKKworCW1lbXNldCgmbmxhZGRyLCAwLCBzaXplb2YobmxhZGRyKSk7CisJbmxhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisKKwlubGgubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKGxlbik7CisJbmxoLm5sbXNnX3R5cGUgPSB0eXBlOworCW5saC5ubG1zZ19mbGFncyA9IE5MTV9GX1JPT1R8TkxNX0ZfTUFUQ0h8TkxNX0ZfUkVRVUVTVDsKKwlubGgubmxtc2dfcGlkID0gMDsKKwlubGgubmxtc2dfc2VxID0gcnRoLT5kdW1wID0gKytydGgtPnNlcTsKKworCXJldHVybiBzZW5kbXNnKHJ0aC0+ZmQsICZtc2csIDApOworfQorCitzdGF0aWMgaW50IHJ0bmxfZHVtcF9maWx0ZXIoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsCisJCWludCAoKmZpbHRlcikoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICosIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqKSBGQVNUX0ZVTkMsCisJCXZvaWQgKmFyZzEvKiwKKwkJaW50ICgqanVuaykoc3RydWN0IHNvY2thZGRyX25sICosIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqKSwKKwkJdm9pZCAqYXJnMiovKQoreworCWludCByZXR2YWwgPSAtMTsKKwljaGFyICpidWYgPSB4bWFsbG9jKDgqMTAyNCk7IC8qIGF2b2lkIGJpZyBzdGFjayBidWZmZXIgKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCXN0cnVjdCBpb3ZlYyBpb3YgPSB7IGJ1ZiwgOCoxMDI0IH07CisKKwl3aGlsZSAoMSkgeworCQlpbnQgc3RhdHVzOworCQlzdHJ1Y3Qgbmxtc2doZHIgKmg7CisKKwkJc3RydWN0IG1zZ2hkciBtc2cgPSB7CisJCQkodm9pZCopJm5sYWRkciwgc2l6ZW9mKG5sYWRkciksCisJCQkmaW92LCAxLAorCQkJTlVMTCwgMCwKKwkJCTAKKwkJfTsKKworCQlzdGF0dXMgPSByZWN2bXNnKHJ0aC0+ZmQsICZtc2csIDApOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQliYl9wZXJyb3JfbXNnKCJPVkVSUlVOIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCWJiX2Vycm9yX21zZygiRU9GIG9uIG5ldGxpbmsiKTsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChtc2cubXNnX25hbWVsZW4gIT0gc2l6ZW9mKG5sYWRkcikpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzZW5kZXIgYWRkcmVzcyBsZW5ndGggPT0gJWQiLCBtc2cubXNnX25hbWVsZW4pOworCQl9CisKKwkJaCA9IChzdHJ1Y3Qgbmxtc2doZHIqKWJ1ZjsKKwkJd2hpbGUgKE5MTVNHX09LKGgsIHN0YXR1cykpIHsKKwkJCWludCBlcnI7CisKKwkJCWlmIChubGFkZHIubmxfcGlkICE9IDAgfHwKKwkJCSAgICBoLT5ubG1zZ19waWQgIT0gcnRoLT5sb2NhbC5ubF9waWQgfHwKKwkJCSAgICBoLT5ubG1zZ19zZXEgIT0gcnRoLT5kdW1wCisJCQkpIHsKKy8vCQkJCWlmIChqdW5rKSB7CisvLwkJCQkJZXJyID0ganVuaygmbmxhZGRyLCBoLCBhcmcyKTsKKy8vCQkJCQlpZiAoZXJyIDwgMCkgeworLy8JCQkJCQlyZXR2YWwgPSBlcnI7CisvLwkJCQkJCWdvdG8gcmV0OworLy8JCQkJCX0KKy8vCQkJCX0KKwkJCQlnb3RvIHNraXBfaXQ7CisJCQl9CisKKwkJCWlmIChoLT5ubG1zZ190eXBlID09IE5MTVNHX0RPTkUpIHsKKwkJCQlnb3RvIHJldF8wOworCQkJfQorCQkJaWYgKGgtPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpIHsKKwkJCQlzdHJ1Y3Qgbmxtc2dlcnIgKmxfZXJyID0gKHN0cnVjdCBubG1zZ2VyciopTkxNU0dfREFUQShoKTsKKwkJCQlpZiAoaC0+bmxtc2dfbGVuIDwgTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3Qgbmxtc2dlcnIpKSkgeworCQkJCQliYl9lcnJvcl9tc2coIkVSUk9SIHRydW5jYXRlZCIpOworCQkJCX0gZWxzZSB7CisJCQkJCWVycm5vID0gLWxfZXJyLT5lcnJvcjsKKwkJCQkJYmJfcGVycm9yX21zZygiUlRORVRMSU5LIGFuc3dlcnMiKTsKKwkJCQl9CisJCQkJZ290byByZXQ7CisJCQl9CisJCQllcnIgPSBmaWx0ZXIoJm5sYWRkciwgaCwgYXJnMSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCXJldHZhbCA9IGVycjsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKworIHNraXBfaXQ6CisJCQloID0gTkxNU0dfTkVYVChoLCBzdGF0dXMpOworCQl9CisJCWlmIChtc2cubXNnX2ZsYWdzICYgTVNHX1RSVU5DKSB7CisJCQliYl9lcnJvcl9tc2coIm1lc3NhZ2UgdHJ1bmNhdGVkIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhdHVzKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVtbmFudCBvZiBzaXplICVkISIsIHN0YXR1cyk7CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworIHJldF8wOgorCXJldHZhbCsrOyAvKiA9IDAgKi8KKyByZXQ6CisJZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBGQVNUX0ZVTkMgeHJ0bmxfZHVtcF9maWx0ZXIoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsCisJCWludCAoKmZpbHRlcikoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICosIHN0cnVjdCBubG1zZ2hkciAqLCB2b2lkICopIEZBU1RfRlVOQywKKwkJdm9pZCAqYXJnMSkKK3sKKwlpbnQgcmV0ID0gcnRubF9kdW1wX2ZpbHRlcihydGgsIGZpbHRlciwgYXJnMS8qLCBOVUxMLCBOVUxMKi8pOworCWlmIChyZXQgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZHVtcCB0ZXJtaW5hdGVkIik7CisJcmV0dXJuIHJldDsKK30KKworaW50IEZBU1RfRlVOQyBydG5sX3RhbGsoc3RydWN0IHJ0bmxfaGFuZGxlICpydG5sLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCXBpZF90IHBlZXIsIHVuc2lnbmVkIGdyb3VwcywKKwkJc3RydWN0IG5sbXNnaGRyICphbnN3ZXIsCisJCWludCAoKmp1bmspKHN0cnVjdCBzb2NrYWRkcl9ubCAqLCBzdHJ1Y3Qgbmxtc2doZHIgKiwgdm9pZCAqKSwKKwkJdm9pZCAqamFyZykKK3sKKy8qIGJib3ggZG9lc24ndCB1c2UgcGFyYW1ldGVycyBuby4gMywgNCwgNiwgNywgdGhleSBhcmUgc3R1YmJlZCBvdXQgKi8KKyNkZWZpbmUgcGVlciAgIDAKKyNkZWZpbmUgZ3JvdXBzIDAKKyNkZWZpbmUganVuayAgIE5VTEwKKyNkZWZpbmUgamFyZyAgIE5VTEwKKwlpbnQgcmV0dmFsID0gLTE7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBzZXE7CisJc3RydWN0IG5sbXNnaGRyICpoOworCXN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CisJc3RydWN0IGlvdmVjIGlvdiA9IHsgKHZvaWQqKW4sIG4tPm5sbXNnX2xlbiB9OworCWNoYXIgICAqYnVmID0geG1hbGxvYyg4KjEwMjQpOyAvKiBhdm9pZCBiaWcgc3RhY2sgYnVmZmVyICovCisJc3RydWN0IG1zZ2hkciBtc2cgPSB7CisJCSh2b2lkKikmbmxhZGRyLCBzaXplb2YobmxhZGRyKSwKKwkJJmlvdiwgMSwKKwkJTlVMTCwgMCwKKwkJMAorCX07CisKKwltZW1zZXQoJm5sYWRkciwgMCwgc2l6ZW9mKG5sYWRkcikpOworCW5sYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworLy8JbmxhZGRyLm5sX3BpZCA9IHBlZXI7CisvLwlubGFkZHIubmxfZ3JvdXBzID0gZ3JvdXBzOworCisJbi0+bmxtc2dfc2VxID0gc2VxID0gKytydG5sLT5zZXE7CisJaWYgKGFuc3dlciA9PSBOVUxMKSB7CisJCW4tPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX0FDSzsKKwl9CisJc3RhdHVzID0gc2VuZG1zZyhydG5sLT5mZCwgJm1zZywgMCk7CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCB0YWxrIHRvIHJ0bmV0bGluayIpOworCQlnb3RvIHJldDsKKwl9CisKKwlpb3YuaW92X2Jhc2UgPSBidWY7CisKKwl3aGlsZSAoMSkgeworCQlpb3YuaW92X2xlbiA9IDgqMTAyNDsKKwkJc3RhdHVzID0gcmVjdm1zZyhydG5sLT5mZCwgJm1zZywgMCk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYmJfcGVycm9yX21zZygiT1ZFUlJVTiIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQliYl9lcnJvcl9tc2coIkVPRiBvbiBuZXRsaW5rIik7CisJCQlnb3RvIHJldDsKKwkJfQorCQlpZiAobXNnLm1zZ19uYW1lbGVuICE9IHNpemVvZihubGFkZHIpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2VuZGVyIGFkZHJlc3MgbGVuZ3RoID09ICVkIiwgbXNnLm1zZ19uYW1lbGVuKTsKKwkJfQorCQlmb3IgKGggPSAoc3RydWN0IG5sbXNnaGRyKilidWY7IHN0YXR1cyA+PSAoaW50KXNpemVvZigqaCk7ICkgeworLy8JCQlpbnQgbF9lcnI7CisJCQlpbnQgbGVuID0gaC0+bmxtc2dfbGVuOworCQkJaW50IGwgPSBsZW4gLSBzaXplb2YoKmgpOworCisJCQlpZiAobCA8IDAgfHwgbGVuID4gc3RhdHVzKSB7CisJCQkJaWYgKG1zZy5tc2dfZmxhZ3MgJiBNU0dfVFJVTkMpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJ0cnVuY2F0ZWQgbWVzc2FnZSIpOworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm1hbGZvcm1lZCBtZXNzYWdlOiBsZW49JWQhIiwgbGVuKTsKKwkJCX0KKworCQkJaWYgKG5sYWRkci5ubF9waWQgIT0gcGVlciB8fAorCQkJICAgIGgtPm5sbXNnX3BpZCAhPSBydG5sLT5sb2NhbC5ubF9waWQgfHwKKwkJCSAgICBoLT5ubG1zZ19zZXEgIT0gc2VxCisJCQkpIHsKKy8vCQkJCWlmIChqdW5rKSB7CisvLwkJCQkJbF9lcnIgPSBqdW5rKCZubGFkZHIsIGgsIGphcmcpOworLy8JCQkJCWlmIChsX2VyciA8IDApIHsKKy8vCQkJCQkJcmV0dmFsID0gbF9lcnI7CisvLwkJCQkJCWdvdG8gcmV0OworLy8JCQkJCX0KKy8vCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGgtPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpIHsKKwkJCQlzdHJ1Y3Qgbmxtc2dlcnIgKmVyciA9IChzdHJ1Y3Qgbmxtc2dlcnIqKU5MTVNHX0RBVEEoaCk7CisJCQkJaWYgKGwgPCAoaW50KXNpemVvZihzdHJ1Y3Qgbmxtc2dlcnIpKSB7CisJCQkJCWJiX2Vycm9yX21zZygiRVJST1IgdHJ1bmNhdGVkIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJybm8gPSAtIGVyci0+ZXJyb3I7CisJCQkJCWlmIChlcnJubyA9PSAwKSB7CisJCQkJCQlpZiAoYW5zd2VyKSB7CisJCQkJCQkJbWVtY3B5KGFuc3dlciwgaCwgaC0+bmxtc2dfbGVuKTsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gcmV0XzA7CisJCQkJCX0KKwkJCQkJYmJfcGVycm9yX21zZygiUlRORVRMSU5LIGFuc3dlcnMiKTsKKwkJCQl9CisJCQkJZ290byByZXQ7CisJCQl9CisJCQlpZiAoYW5zd2VyKSB7CisJCQkJbWVtY3B5KGFuc3dlciwgaCwgaC0+bmxtc2dfbGVuKTsKKwkJCQlnb3RvIHJldF8wOworCQkJfQorCisJCQliYl9lcnJvcl9tc2coInVuZXhwZWN0ZWQgcmVwbHkhIik7CisKKwkJCXN0YXR1cyAtPSBOTE1TR19BTElHTihsZW4pOworCQkJaCA9IChzdHJ1Y3Qgbmxtc2doZHIqKSgoY2hhciopaCArIE5MTVNHX0FMSUdOKGxlbikpOworCQl9CisJCWlmIChtc2cubXNnX2ZsYWdzICYgTVNHX1RSVU5DKSB7CisJCQliYl9lcnJvcl9tc2coIm1lc3NhZ2UgdHJ1bmNhdGVkIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhdHVzKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVtbmFudCBvZiBzaXplICVkISIsIHN0YXR1cyk7CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworIHJldF8wOgorCXJldHZhbCsrOyAvKiA9IDAgKi8KKyByZXQ6CisJZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBGQVNUX0ZVTkMgYWRkYXR0cjMyKHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsIHVpbnQzMl90IGRhdGEpCit7CisJaW50IGxlbiA9IFJUQV9MRU5HVEgoNCk7CisJc3RydWN0IHJ0YXR0ciAqcnRhOworCisJaWYgKChpbnQpKE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikgKyBsZW4pID4gbWF4bGVuKSB7CisJCXJldHVybiAtMTsKKwl9CisJcnRhID0gKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKW4pICsgTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSk7CisJcnRhLT5ydGFfdHlwZSA9IHR5cGU7CisJcnRhLT5ydGFfbGVuID0gbGVuOworCW1vdmVfdG9fdW5hbGlnbmVkMzIoUlRBX0RBVEEocnRhKSwgZGF0YSk7CisJbi0+bmxtc2dfbGVuID0gTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSArIGxlbjsKKwlyZXR1cm4gMDsKK30KKworaW50IEZBU1RfRlVOQyBhZGRhdHRyX2woc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdm9pZCAqZGF0YSwgaW50IGFsZW4pCit7CisJaW50IGxlbiA9IFJUQV9MRU5HVEgoYWxlbik7CisJc3RydWN0IHJ0YXR0ciAqcnRhOworCisJaWYgKChpbnQpKE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikgKyBsZW4pID4gbWF4bGVuKSB7CisJCXJldHVybiAtMTsKKwl9CisJcnRhID0gKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKW4pICsgTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSk7CisJcnRhLT5ydGFfdHlwZSA9IHR5cGU7CisJcnRhLT5ydGFfbGVuID0gbGVuOworCW1lbWNweShSVEFfREFUQShydGEpLCBkYXRhLCBhbGVuKTsKKwluLT5ubG1zZ19sZW4gPSBOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pICsgbGVuOworCXJldHVybiAwOworfQorCitpbnQgRkFTVF9GVU5DIHJ0YV9hZGRhdHRyMzIoc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdWludDMyX3QgZGF0YSkKK3sKKwlpbnQgbGVuID0gUlRBX0xFTkdUSCg0KTsKKwlzdHJ1Y3QgcnRhdHRyICpzdWJydGE7CisKKwlpZiAoUlRBX0FMSUdOKHJ0YS0+cnRhX2xlbikgKyBsZW4gPiBtYXhsZW4pIHsKKwkJcmV0dXJuIC0xOworCX0KKwlzdWJydGEgPSAoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopcnRhKSArIFJUQV9BTElHTihydGEtPnJ0YV9sZW4pKTsKKwlzdWJydGEtPnJ0YV90eXBlID0gdHlwZTsKKwlzdWJydGEtPnJ0YV9sZW4gPSBsZW47CisJbW92ZV90b191bmFsaWduZWQzMihSVEFfREFUQShzdWJydGEpLCBkYXRhKTsKKwlydGEtPnJ0YV9sZW4gPSBOTE1TR19BTElHTihydGEtPnJ0YV9sZW4pICsgbGVuOworCXJldHVybiAwOworfQorCitpbnQgRkFTVF9GVU5DIHJ0YV9hZGRhdHRyX2woc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdm9pZCAqZGF0YSwgaW50IGFsZW4pCit7CisJc3RydWN0IHJ0YXR0ciAqc3VicnRhOworCWludCBsZW4gPSBSVEFfTEVOR1RIKGFsZW4pOworCisJaWYgKFJUQV9BTElHTihydGEtPnJ0YV9sZW4pICsgbGVuID4gbWF4bGVuKSB7CisJCXJldHVybiAtMTsKKwl9CisJc3VicnRhID0gKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKXJ0YSkgKyBSVEFfQUxJR04ocnRhLT5ydGFfbGVuKSk7CisJc3VicnRhLT5ydGFfdHlwZSA9IHR5cGU7CisJc3VicnRhLT5ydGFfbGVuID0gbGVuOworCW1lbWNweShSVEFfREFUQShzdWJydGEpLCBkYXRhLCBhbGVuKTsKKwlydGEtPnJ0YV9sZW4gPSBOTE1TR19BTElHTihydGEtPnJ0YV9sZW4pICsgbGVuOworCXJldHVybiAwOworfQorCisKK3ZvaWQgRkFTVF9GVU5DIHBhcnNlX3J0YXR0cihzdHJ1Y3QgcnRhdHRyICp0YltdLCBpbnQgbWF4LCBzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBsZW4pCit7CisJd2hpbGUgKFJUQV9PSyhydGEsIGxlbikpIHsKKwkJaWYgKHJ0YS0+cnRhX3R5cGUgPD0gbWF4KSB7CisJCQl0YltydGEtPnJ0YV90eXBlXSA9IHJ0YTsKKwkJfQorCQlydGEgPSBSVEFfTkVYVChydGEsIGxlbik7CisJfQorCWlmIChsZW4pIHsKKwkJYmJfZXJyb3JfbXNnKCJkZWZpY2l0ICVkLCBydGFfbGVuPSVkISIsIGxlbiwgcnRhLT5ydGFfbGVuKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGlibmV0bGluay5oIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2xpYm5ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJlZTJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2xpYm5ldGxpbmsuaApAQCAtMCwwICsxLDQ5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpZm5kZWYgTElCTkVUTElOS19ICisjZGVmaW5lIExJQk5FVExJTktfSCAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorLyogV2UgbmVlZCBsaW51eC90eXBlcy5oIGJlY2F1c2Ugb2xkZXIga2VybmVscyB1c2UgX191MzIgZXRjCisgKiBpbiBsaW51eC9bcnRdbmV0bGluay5oLiAyLjYuMTkgc2VlbXMgdG8gYmUgb2ssIHRob3VnaCAqLworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK3N0cnVjdCBydG5sX2hhbmRsZSB7CisJaW50ICAgICAgICAgICAgICAgIGZkOworCXN0cnVjdCBzb2NrYWRkcl9ubCBsb2NhbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgcGVlcjsKKwl1aW50MzJfdCAgICAgICAgICAgc2VxOworCXVpbnQzMl90ICAgICAgICAgICBkdW1wOworfTsKKworZXh0ZXJuIHZvaWQgeHJ0bmxfb3BlbihzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCkgRkFTVF9GVU5DOworI2RlZmluZSBydG5sX2Nsb3NlKHJ0aCkgKGNsb3NlKChydGgpLT5mZCkpCitleHRlcm4gaW50IHhydG5sX3dpbGRkdW1wX3JlcXVlc3Qoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGludCBmYW0sIGludCB0eXBlKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHJ0bmxfZHVtcF9yZXF1ZXN0KHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBpbnQgdHlwZSwgdm9pZCAqcmVxLCBpbnQgbGVuKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHhydG5sX2R1bXBfZmlsdGVyKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLAorCQlpbnQgKCpmaWx0ZXIpKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCosIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCopIEZBU1RfRlVOQywKKwkJdm9pZCAqYXJnMSkgRkFTVF9GVU5DOworCisvKiBiYm94IGRvZXNuJ3QgdXNlIHBhcmFtZXRlcnMgbm8uIDMsIDQsIDYsIDcsIHN0dWIgdGhlbSBvdXQgKi8KKyNkZWZpbmUgcnRubF90YWxrKHJ0bmwsIG4sIHBlZXIsIGdyb3VwcywgYW5zd2VyLCBqdW5rLCBqYXJnKSBcCisJcnRubF90YWxrKHJ0bmwsIG4sIGFuc3dlcikKK2V4dGVybiBpbnQgcnRubF90YWxrKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRubCwgc3RydWN0IG5sbXNnaGRyICpuLCBwaWRfdCBwZWVyLAorCQl1bnNpZ25lZCBncm91cHMsIHN0cnVjdCBubG1zZ2hkciAqYW5zd2VyLAorCQlpbnQgKCpqdW5rKShzdHJ1Y3Qgc29ja2FkZHJfbmwgKixzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKiksCisJCXZvaWQgKmphcmcpIEZBU1RfRlVOQzsKKworZXh0ZXJuIGludCBydG5sX3NlbmQoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGNoYXIgKmJ1ZiwgaW50KSBGQVNUX0ZVTkM7CisKKworZXh0ZXJuIGludCBhZGRhdHRyMzIoc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdWludDMyX3QgZGF0YSkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBhZGRhdHRyX2woc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdm9pZCAqZGF0YSwgaW50IGFsZW4pIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgcnRhX2FkZGF0dHIzMihzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBtYXhsZW4sIGludCB0eXBlLCB1aW50MzJfdCBkYXRhKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHJ0YV9hZGRhdHRyX2woc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdm9pZCAqZGF0YSwgaW50IGFsZW4pIEZBU1RfRlVOQzsKKworZXh0ZXJuIHZvaWQgcGFyc2VfcnRhdHRyKHN0cnVjdCBydGF0dHIgKnRiW10sIGludCBtYXgsIHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IGxlbikgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9hZGRyLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTU0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfYWRkci5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgbGxfYWRkcl9uMmEodW5zaWduZWQgY2hhciAqYWRkciwgaW50IGFsZW4sIGludCB0eXBlLCBjaGFyICpidWYsIGludCBibGVuKQoreworCWludCBpOworCWludCBsOworCisJaWYgKGFsZW4gPT0gNAorCSAmJiAodHlwZSA9PSBBUlBIUkRfVFVOTkVMIHx8IHR5cGUgPT0gQVJQSFJEX1NJVCB8fCB0eXBlID09IEFSUEhSRF9JUEdSRSkKKwkpIHsKKwkJcmV0dXJuIGluZXRfbnRvcChBRl9JTkVULCBhZGRyLCBidWYsIGJsZW4pOworCX0KKwlsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYWxlbjsgaSsrKSB7CisJCWlmIChpID09IDApIHsKKwkJCXNucHJpbnRmKGJ1ZiArIGwsIGJsZW4sICI6JTAyeCIrMSwgYWRkcltpXSk7CisJCQlibGVuIC09IDI7CisJCQlsICs9IDI7CisJCX0gZWxzZSB7CisJCQlzbnByaW50ZihidWYgKyBsLCBibGVuLCAiOiUwMngiLCBhZGRyW2ldKTsKKwkJCWJsZW4gLT0gMzsKKwkJCWwgKz0gMzsKKwkJfQorCX0KKwlyZXR1cm4gYnVmOworfQorCitpbnQgRkFTVF9GVU5DIGxsX2FkZHJfYTJuKHVuc2lnbmVkIGNoYXIgKmxsYWRkciwgaW50IGxlbiwgY2hhciAqYXJnKQoreworCWludCBpOworCisJaWYgKHN0cmNocihhcmcsICcuJykpIHsKKwkJaW5ldF9wcmVmaXggcGZ4OworCQlpZiAoZ2V0X2FkZHJfMSgmcGZ4LCBhcmcsIEFGX0lORVQpKSB7CisJCQliYl9lcnJvcl9tc2coIlwiJXNcIiBpcyBpbnZhbGlkIGxsYWRkciIsIGFyZyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGxlbiA8IDQpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1jcHkobGxhZGRyLCBwZnguZGF0YSwgNCk7CisJCXJldHVybiA0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgdGVtcDsKKwkJY2hhciAqY3AgPSBzdHJjaHIoYXJnLCAnOicpOworCQlpZiAoY3ApIHsKKwkJCSpjcCA9IDA7CisJCQljcCsrOworCQl9CisJCWlmIChzc2NhbmYoYXJnLCAiJXgiLCAmdGVtcCkgIT0gMSB8fCAodGVtcCA8IDAgfHwgdGVtcCA+IDI1NSkpIHsKKwkJCWJiX2Vycm9yX21zZygiXCIlc1wiIGlzIGludmFsaWQgbGxhZGRyIiwgYXJnKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlsbGFkZHJbaV0gPSB0ZW1wOworCQlpZiAoIWNwKSB7CisJCQlicmVhazsKKwkJfQorCQlhcmcgPSBjcDsKKwl9CisJcmV0dXJuIGkrMTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9tYXAuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2NkOTBmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX21hcC5jCkBAIC0wLDAgKzEsMjAyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8bmV0L2lmLmg+ICAvKiBzdHJ1Y3QgaWZyZXEgYW5kIGNvLiAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisjaW5jbHVkZSAibGxfbWFwLmgiCisKK3N0cnVjdCBpZHhtYXAgeworCXN0cnVjdCBpZHhtYXAgKm5leHQ7CisJaW50ICAgICAgICAgICAgaW5kZXg7CisJaW50ICAgICAgICAgICAgdHlwZTsKKwlpbnQgICAgICAgICAgICBhbGVuOworCXVuc2lnbmVkICAgICAgIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgIGFkZHJbOF07CisJY2hhciAgICAgICAgICAgbmFtZVsxNl07Cit9OworCitzdGF0aWMgc3RydWN0IGlkeG1hcCAqKmlkeG1hcDsgLyogdHJlYXQgYXMgKmlkeG1hcFsxNl0gKi8KKworc3RhdGljIHN0cnVjdCBpZHhtYXAgKmZpbmRfYnlfaW5kZXgoaW50IGlkeCkKK3sKKwlzdHJ1Y3QgaWR4bWFwICppbTsKKworCWlmIChpZHhtYXApCisJCWZvciAoaW0gPSBpZHhtYXBbaWR4ICYgMHhGXTsgaW07IGltID0gaW0tPm5leHQpCisJCQlpZiAoaW0tPmluZGV4ID09IGlkeCkKKwkJCQlyZXR1cm4gaW07CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBGQVNUX0ZVTkMgbGxfcmVtZW1iZXJfaW5kZXgoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8gVU5VU0VEX1BBUkFNLAorCQlzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCXZvaWQgKmFyZyBVTlVTRURfUEFSQU0pCit7CisJaW50IGg7CisJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgaWR4bWFwICppbSwgKippbXA7CisJc3RydWN0IHJ0YXR0ciAqdGJbSUZMQV9NQVgrMV07CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXTElOSykKKwkJcmV0dXJuIDA7CisKKwlpZiAobi0+bmxtc2dfbGVuIDwgTkxNU0dfTEVOR1RIKHNpemVvZihpZmkpKSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KHRiLCAwLCBzaXplb2YodGIpKTsKKwlwYXJzZV9ydGF0dHIodGIsIElGTEFfTUFYLCBJRkxBX1JUQShpZmkpLCBJRkxBX1BBWUxPQUQobikpOworCWlmICh0YltJRkxBX0lGTkFNRV0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWlkeG1hcCkKKwkJaWR4bWFwID0geHphbGxvYyhzaXplb2YoaWR4bWFwWzBdKSAqIDE2KTsKKworCWggPSBpZmktPmlmaV9pbmRleCAmIDB4RjsKKwlmb3IgKGltcCA9ICZpZHhtYXBbaF07IChpbSA9ICppbXApICE9IE5VTEw7IGltcCA9ICZpbS0+bmV4dCkKKwkJaWYgKGltLT5pbmRleCA9PSBpZmktPmlmaV9pbmRleCkKKwkJCWdvdG8gZm91bmQ7CisKKwlpbSA9IHhtYWxsb2Moc2l6ZW9mKCppbSkpOworCWltLT5uZXh0ID0gKmltcDsKKwlpbS0+aW5kZXggPSBpZmktPmlmaV9pbmRleDsKKwkqaW1wID0gaW07CisgZm91bmQ6CisJaW0tPnR5cGUgPSBpZmktPmlmaV90eXBlOworCWltLT5mbGFncyA9IGlmaS0+aWZpX2ZsYWdzOworCWlmICh0YltJRkxBX0FERFJFU1NdKSB7CisJCWludCBhbGVuOworCQlpbS0+YWxlbiA9IGFsZW4gPSBSVEFfUEFZTE9BRCh0YltJRkxBX0FERFJFU1NdKTsKKwkJaWYgKGFsZW4gPiAoaW50KXNpemVvZihpbS0+YWRkcikpCisJCQlhbGVuID0gc2l6ZW9mKGltLT5hZGRyKTsKKwkJbWVtY3B5KGltLT5hZGRyLCBSVEFfREFUQSh0YltJRkxBX0FERFJFU1NdKSwgYWxlbik7CisJfSBlbHNlIHsKKwkJaW0tPmFsZW4gPSAwOworCQltZW1zZXQoaW0tPmFkZHIsIDAsIHNpemVvZihpbS0+YWRkcikpOworCX0KKwlzdHJjcHkoaW0tPm5hbWUsIFJUQV9EQVRBKHRiW0lGTEFfSUZOQU1FXSkpOworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyIEZBU1RfRlVOQyAqbGxfaWR4X24yYShpbnQgaWR4LCBjaGFyICpidWYpCit7CisJc3RydWN0IGlkeG1hcCAqaW07CisKKwlpZiAoaWR4ID09IDApCisJCXJldHVybiAiKiI7CisJaW0gPSBmaW5kX2J5X2luZGV4KGlkeCk7CisJaWYgKGltKQorCQlyZXR1cm4gaW0tPm5hbWU7CisJc25wcmludGYoYnVmLCAxNiwgImlmJWQiLCBpZHgpOworCXJldHVybiBidWY7Cit9CisKKworY29uc3QgY2hhciBGQVNUX0ZVTkMgKmxsX2luZGV4X3RvX25hbWUoaW50IGlkeCkKK3sKKwlzdGF0aWMgY2hhciBuYnVmWzE2XTsKKworCXJldHVybiBsbF9pZHhfbjJhKGlkeCwgbmJ1Zik7Cit9CisKKyNpZmRlZiBVTlVTRUQKK2ludCBsbF9pbmRleF90b190eXBlKGludCBpZHgpCit7CisJc3RydWN0IGlkeG1hcCAqaW07CisKKwlpZiAoaWR4ID09IDApCisJCXJldHVybiAtMTsKKwlpbSA9IGZpbmRfYnlfaW5kZXgoaWR4KTsKKwlpZiAoaW0pCisJCXJldHVybiBpbS0+dHlwZTsKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKwordW5zaWduZWQgRkFTVF9GVU5DIGxsX2luZGV4X3RvX2ZsYWdzKGludCBpZHgpCit7CisJc3RydWN0IGlkeG1hcCAqaW07CisKKwlpZiAoaWR4ID09IDApCisJCXJldHVybiAwOworCWltID0gZmluZF9ieV9pbmRleChpZHgpOworCWlmIChpbSkKKwkJcmV0dXJuIGltLT5mbGFnczsKKwlyZXR1cm4gMDsKK30KKworaW50IEZBU1RfRlVOQyB4bGxfbmFtZV90b19pbmRleChjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXQgPSAwOworCWludCBzb2NrX2ZkOworCisvKiBjYWNoaW5nIGlzIG5vdCB3YXJyYW50ZWQgLSBubyB1c2VycyB3aGljaCByZXBlYXRlZGx5IGNhbGwgaXQgKi8KKyNpZmRlZiBVTlVTRUQKKwlzdGF0aWMgY2hhciBuY2FjaGVbMTZdOworCXN0YXRpYyBpbnQgaWNhY2hlOworCisJc3RydWN0IGlkeG1hcCAqaW07CisJaW50IGk7CisKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAoaWNhY2hlICYmIHN0cmNtcChuYW1lLCBuY2FjaGUpID09IDApIHsKKwkJcmV0ID0gaWNhY2hlOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGlkeG1hcCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJZm9yIChpbSA9IGlkeG1hcFtpXTsgaW07IGltID0gaW0tPm5leHQpIHsKKwkJCQlpZiAoc3RyY21wKGltLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQkJCWljYWNoZSA9IGltLT5pbmRleDsKKwkJCQkJc3RyY3B5KG5jYWNoZSwgbmFtZSk7CisJCQkJCXJldCA9IGltLT5pbmRleDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCS8qIFdlIGhhdmUgbm90IGZvdW5kIHRoZSBpbnRlcmZhY2UgaW4gb3VyIGNhY2hlLCBidXQgdGhlIGtlcm5lbAorCSAqIG1heSBzdGlsbCBrbm93IGFib3V0IGl0LiBPbmUgcmVhc29uIGlzIHRoYXQgd2UgbWF5IGJlIHVzaW5nCisJICogbW9kdWxlIG9uLWRlbWFuZCBsb2FkaW5nLCB3aGljaCBtZWFucyB0aGF0IHRoZSBrZXJuZWwgd2lsbAorCSAqIGxvYWQgdGhlIG1vZHVsZSBhbmQgbWFrZSB0aGUgaW50ZXJmYWNlIGV4aXN0IG9ubHkgd2hlbgorCSAqIHdlIGV4cGxpY2l0ZWx5IHJlcXVlc3QgaXQgKGNoZWNrIGZvciBkZXZfbG9hZCgpIGluIG5ldC9jb3JlL2Rldi5jKS4KKwkgKiBJIGNhbiB0aGluayBvZiBvdGhlciBzaW1pbGFyIHNjZW5hcmlvLCBidXQgdGhleSBhcmUgbGVzcyBjb21tb24uLi4KKwkgKiBKZWFuIElJICovCisjZW5kaWYKKworCXNvY2tfZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHNvY2tfZmQgPj0gMCkgeworCQlzdHJ1Y3QgaWZyZXEgaWZyOworCQlpbnQgdG1wOworCisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBuYW1lKTsKKwkJaWZyLmlmcl9pZmluZGV4ID0gLTE7CisJCXRtcCA9IGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZJTkRFWCwgJmlmcik7CisJCWNsb3NlKHNvY2tfZmQpOworCQlpZiAodG1wID49IDApCisJCQkvKiBJbiB0aGVvcnksIHdlIHNob3VsZCByZWR1bXAgdGhlIGludGVyZmFjZSBsaXN0CisJCQkgKiB0byB1cGRhdGUgb3VyIGNhY2hlLCB0aGlzIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UKKwkJCSAqIHRvIHRoZSByZWFkZXIuLi4gSmVhbiBJSSAqLworCQkJcmV0ID0gaWZyLmlmcl9pZmluZGV4OworCX0KKy8qIG91dDoqLworCWlmIChyZXQgPD0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgZGV2aWNlICclcyciLCBuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgRkFTVF9GVU5DIGxsX2luaXRfbWFwKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoKQoreworCXhydG5sX3dpbGRkdW1wX3JlcXVlc3QocnRoLCBBRl9VTlNQRUMsIFJUTV9HRVRMSU5LKTsKKwl4cnRubF9kdW1wX2ZpbHRlcihydGgsIGxsX3JlbWVtYmVyX2luZGV4LCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9tYXAuaCBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQzODM0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX21hcC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmbmRlZiBMTF9NQVBfSAorI2RlZmluZSBMTF9NQVBfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitpbnQgbGxfcmVtZW1iZXJfaW5kZXgoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKSBGQVNUX0ZVTkM7CitpbnQgbGxfaW5pdF9tYXAoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgpIEZBU1RfRlVOQzsKK2ludCB4bGxfbmFtZV90b19pbmRleChjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7Citjb25zdCBjaGFyICpsbF9pbmRleF90b19uYW1lKGludCBpZHgpIEZBU1RfRlVOQzsKK2NvbnN0IGNoYXIgKmxsX2lkeF9uMmEoaW50IGlkeCwgY2hhciAqYnVmKSBGQVNUX0ZVTkM7CisvKiBpbnQgbGxfaW5kZXhfdG9fdHlwZShpbnQgaWR4KTsgKi8KK3Vuc2lnbmVkIGxsX2luZGV4X3RvX2ZsYWdzKGludCBpZHgpIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfcHJvdG8uYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9wcm90by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYWM4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfcHJvdG8uYwpAQCAtMCwwICsxLDEyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorCisjaWYgIUVOQUJMRV9XRVJST1IKKyN3YXJuaW5nIGRlLWJsb2F0CisjZW5kaWYKKy8qIEJlZm9yZSByZS1lbmFibGluZyB0aGlzLCBwbGVhc2UgKDEpIGNvbmRpdGlvbmFsaXplIGV4b3RpYyBwcm90b2NvbHMKKyAqIG9uIENPTkZJR19zb21ldGhpbmcsIGFuZCAoMikgZGVjb3VwbGUgc3RyaW5ncyBhbmQgbnVtYmVycworICogKHVzZSBsbHByb3RvX2lkc1tdID0gbixuLG4uLjsgYW5kIGxscHJvdG9fbmFtZXNbXSA9ICJsb29wXDAiICJwdXBcMCIgLi4uOykKKyAqLworCisjZGVmaW5lIF9fUEYoZixuKSB7IEVUSF9QXyMjZiwgI24gfSwKK3N0YXRpYyBzdHJ1Y3QgeworCWludCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworfSBsbHByb3RvX25hbWVzW10gPSB7CitfX1BGKExPT1AsbG9vcCkKK19fUEYoUFVQLHB1cCkKKyNpZmRlZiBFVEhfUF9QVVBBVAorX19QRihQVVBBVCxwdXBhdCkKKyNlbmRpZgorX19QRihJUCxpcCkKK19fUEYoWDI1LHgyNSkKK19fUEYoQVJQLGFycCkKK19fUEYoQlBRLGJwcSkKKyNpZmRlZiBFVEhfUF9JRUVFUFVQCitfX1BGKElFRUVQVVAsaWVlZXB1cCkKKyNlbmRpZgorI2lmZGVmIEVUSF9QX0lFRUVQVVBBVAorX19QRihJRUVFUFVQQVQsaWVlZXB1cGF0KQorI2VuZGlmCitfX1BGKERFQyxkZWMpCitfX1BGKEROQV9ETCxkbmFfZGwpCitfX1BGKEROQV9SQyxkbmFfcmMpCitfX1BGKEROQV9SVCxkbmFfcnQpCitfX1BGKExBVCxsYXQpCitfX1BGKERJQUcsZGlhZykKK19fUEYoQ1VTVCxjdXN0KQorX19QRihTQ0Esc2NhKQorX19QRihSQVJQLHJhcnApCitfX1BGKEFUQUxLLGF0YWxrKQorX19QRihBQVJQLGFhcnApCitfX1BGKElQWCxpcHgpCitfX1BGKElQVjYsaXB2NikKKyNpZmRlZiBFVEhfUF9QUFBfRElTQworX19QRihQUFBfRElTQyxwcHBfZGlzYykKKyNlbmRpZgorI2lmZGVmIEVUSF9QX1BQUF9TRVMKK19fUEYoUFBQX1NFUyxwcHBfc2VzKQorI2VuZGlmCisjaWZkZWYgRVRIX1BfQVRNTVBPQQorX19QRihBVE1NUE9BLGF0bW1wb2EpCisjZW5kaWYKKyNpZmRlZiBFVEhfUF9BVE1GQVRFCitfX1BGKEFUTUZBVEUsYXRtZmF0ZSkKKyNlbmRpZgorCitfX1BGKDgwMl8zLDgwMl8zKQorX19QRihBWDI1LGF4MjUpCitfX1BGKEFMTCxhbGwpCitfX1BGKDgwMl8yLDgwMl8yKQorX19QRihTTkFQLHNuYXApCitfX1BGKEREQ01QLGRkY21wKQorX19QRihXQU5fUFBQLHdhbl9wcHApCitfX1BGKFBQUF9NUCxwcHBfbXApCitfX1BGKExPQ0FMVEFMSyxsb2NhbHRhbGspCitfX1BGKFBQUFRBTEsscHBwdGFsaykKK19fUEYoVFJfODAyXzIsdHJfODAyXzIpCitfX1BGKE1PQklURVgsbW9iaXRleCkKK19fUEYoQ09OVFJPTCxjb250cm9sKQorX19QRihJUkRBLGlyZGEpCisjaWZkZWYgRVRIX1BfRUNPTkVUCitfX1BGKEVDT05FVCxlY29uZXQpCisjZW5kaWYKKworeyAweDgxMDAsICI4MDIuMVEiIH0sCit7IEVUSF9QX0lQLCAiaXB2NCIgfSwKK307CisjdW5kZWYgX19QRgorCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBsbF9wcm90b19uMmEodW5zaWduZWQgc2hvcnQgaWQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpOworCWlkID0gbnRvaHMoaWQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxscHJvdG9fbmFtZXMpOyBpKyspIHsKKwkJIGlmIChsbHByb3RvX25hbWVzW2ldLmlkID09IGlkKQorCQkJcmV0dXJuIGxscHJvdG9fbmFtZXNbaV0ubmFtZTsKKwl9CisJc25wcmludGYoYnVmLCBsZW4sICJbJWRdIiwgaWQpOworCXJldHVybiBidWY7Cit9CisKK2ludCBGQVNUX0ZVTkMgbGxfcHJvdG9fYTJuKHVuc2lnbmVkIHNob3J0ICppZCwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGxwcm90b19uYW1lcyk7IGkrKykgeworCQkgaWYgKHN0cmNhc2VjbXAobGxwcm90b19uYW1lc1tpXS5uYW1lLCBidWYpID09IDApIHsKKwkJCSBpID0gbGxwcm90b19uYW1lc1tpXS5pZDsKKwkJCSBnb3RvIGdvb2Q7CisJCSB9CisJfQorCWkgPSBiYl9zdHJ0b3UoYnVmLCBOVUxMLCAwKTsKKwlpZiAoZXJybm8gfHwgaSA+IDB4ZmZmZikKKwkJcmV0dXJuIC0xOworIGdvb2Q6CisJKmlkID0gaHRvbnMoaSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfdHlwZXMuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF90eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDJlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfdHlwZXMuYwpAQCAtMCwwICsxLDIwNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+IC8qIGxpbnV4L2lmX2FycC5oIG5lZWRzIGl0IG9uIHNvbWUgc3lzdGVtcyAqLworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgbGxfdHlwZV9uMmEoaW50IHR5cGUsIGNoYXIgKmJ1ZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBhcnBocmRfbmFtZVtdID0KKwkvKiAwLCAgICAgICAgICAgICAgICAgICovICJnZW5lcmljIiAiXDAiCisJLyogQVJQSFJEX0xPT1BCQUNLLCAgICAqLyAibG9vcGJhY2siICJcMCIKKwkvKiBBUlBIUkRfRVRIRVIsICAgICAgICovICJldGhlciIgIlwwIgorI2lmZGVmIEFSUEhSRF9JTkZJTklCQU5ECisJLyogQVJQSFJEX0lORklOSUJBTkQsICAqLyAiaW5maW5pYmFuZCIgIlwwIgorI2VuZGlmCisjaWZkZWYgQVJQSFJEX0lFRUU4MDJfVFIKKwkvKiBBUlBIUkRfSUVFRTgwMiwgICAgICovICJpZWVlODAyIiAiXDAiCisJLyogQVJQSFJEX0lFRUU4MDJfVFIsICAqLyAidHIiICJcMCIKKyNlbHNlCisJLyogQVJQSFJEX0lFRUU4MDIsICAgICAqLyAidHIiICJcMCIKKyNlbmRpZgorI2lmZGVmIEFSUEhSRF9JRUVFODAyMTEKKwkvKiBBUlBIUkRfSUVFRTgwMjExLCAgICovICJpZWVlODAyLjExIiAiXDAiCisjZW5kaWYKKyNpZmRlZiBBUlBIUkRfSUVFRTEzOTQKKwkvKiBBUlBIUkRfSUVFRTEzOTQsICAgICovICJpZWVlMTM5NCIgIlwwIgorI2VuZGlmCisJLyogQVJQSFJEX0lSREEsICAgICAgICAqLyAiaXJkYSIgIlwwIgorCS8qIEFSUEhSRF9TTElQLCAgICAgICAgKi8gInNsaXAiICJcMCIKKwkvKiBBUlBIUkRfQ1NMSVAsICAgICAgICovICJjc2xpcCIgIlwwIgorCS8qIEFSUEhSRF9TTElQNiwgICAgICAgKi8gInNsaXA2IiAiXDAiCisJLyogQVJQSFJEX0NTTElQNiwgICAgICAqLyAiY3NsaXA2IiAiXDAiCisJLyogQVJQSFJEX1BQUCwgICAgICAgICAqLyAicHBwIiAiXDAiCisJLyogQVJQSFJEX1RVTk5FTCwgICAgICAqLyAiaXBpcCIgIlwwIgorCS8qIEFSUEhSRF9UVU5ORUw2LCAgICAgKi8gInR1bm5lbDYiICJcMCIKKwkvKiBBUlBIUkRfU0lULCAgICAgICAgICovICJzaXQiICJcMCIKKwkvKiBBUlBIUkRfSVBHUkUsICAgICAgICovICJncmUiICJcMCIKKyNpZmRlZiBBUlBIUkRfVk9JRAorCS8qIEFSUEhSRF9WT0lELCAgICAgICAgKi8gInZvaWQiICJcMCIKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMKKwkvKiBBUlBIUkRfRUVUSEVSLCAgICAgICovICJlZXRoZXIiICJcMCIKKwkvKiBBUlBIUkRfQVgyNSwgICAgICAgICovICJheDI1IiAiXDAiCisJLyogQVJQSFJEX1BST05FVCwgICAgICAqLyAicHJvbmV0IiAiXDAiCisJLyogQVJQSFJEX0NIQU9TLCAgICAgICAqLyAiY2hhb3MiICJcMCIKKwkvKiBBUlBIUkRfQVJDTkVULCAgICAgICovICJhcmNuZXQiICJcMCIKKwkvKiBBUlBIUkRfQVBQTEVUTEssICAgICovICJhdGFsayIgIlwwIgorCS8qIEFSUEhSRF9ETENJLCAgICAgICAgKi8gImRsY2kiICJcMCIKKyNpZmRlZiBBUlBIUkRfQVRNCisJLyogQVJQSFJEX0FUTSwgICAgICAgICAqLyAiYXRtIiAiXDAiCisjZW5kaWYKKwkvKiBBUlBIUkRfTUVUUklDT00sICAgICovICJtZXRyaWNvbSIgIlwwIgorCS8qIEFSUEhSRF9SU1JWRCwgICAgICAgKi8gInJzcnZkIiAiXDAiCisJLyogQVJQSFJEX0FEQVBULCAgICAgICAqLyAiYWRhcHQiICJcMCIKKwkvKiBBUlBIUkRfUk9TRSwgICAgICAgICovICJyb3NlIiAiXDAiCisJLyogQVJQSFJEX1gyNSwgICAgICAgICAqLyAieDI1IiAiXDAiCisjaWZkZWYgQVJQSFJEX0hXWDI1CisJLyogQVJQSFJEX0hXWDI1LCAgICAgICAqLyAiaHd4MjUiICJcMCIKKyNlbmRpZgorCS8qIEFSUEhSRF9IRExDLCAgICAgICAgKi8gImhkbGMiICJcMCIKKwkvKiBBUlBIUkRfTEFQQiwgICAgICAgICovICJsYXBiIiAiXDAiCisjaWZkZWYgQVJQSFJEX0REQ01QCisJLyogQVJQSFJEX0REQ01QLCAgICAgICAqLyAiZGRjbXAiICJcMCIKKwkvKiBBUlBIUkRfUkFXSERMQywgICAgICovICJyYXdoZGxjIiAiXDAiCisjZW5kaWYKKwkvKiBBUlBIUkRfRlJBRCwgICAgICAgICovICJmcmFkIiAiXDAiCisJLyogQVJQSFJEX1NLSVAsICAgICAgICAqLyAic2tpcCIgIlwwIgorCS8qIEFSUEhSRF9MT0NBTFRMSywgICAgKi8gImx0YWxrIiAiXDAiCisJLyogQVJQSFJEX0ZEREksICAgICAgICAqLyAiZmRkaSIgIlwwIgorCS8qIEFSUEhSRF9CSUYsICAgICAgICAgKi8gImJpZiIgIlwwIgorCS8qIEFSUEhSRF9JUEREUCwgICAgICAgKi8gImlwL2RkcCIgIlwwIgorCS8qIEFSUEhSRF9QSU1SRUcsICAgICAgKi8gInBpbXJlZyIgIlwwIgorCS8qIEFSUEhSRF9ISVBQSSwgICAgICAgKi8gImhpcHBpIiAiXDAiCisJLyogQVJQSFJEX0FTSCwgICAgICAgICAqLyAiYXNoIiAiXDAiCisJLyogQVJQSFJEX0VDT05FVCwgICAgICAqLyAiZWNvbmV0IiAiXDAiCisJLyogQVJQSFJEX0ZDUFAsICAgICAgICAqLyAiZmNwcCIgIlwwIgorCS8qIEFSUEhSRF9GQ0FMLCAgICAgICAgKi8gImZjYWwiICJcMCIKKwkvKiBBUlBIUkRfRkNQTCwgICAgICAgICovICJmY3BsIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDLCAgICAqLyAiZmNmYjAiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrMSwgICovICJmY2ZiMSIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQysyLCAgKi8gImZjZmIyIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzMsICAqLyAiZmNmYjMiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrNCwgICovICJmY2ZiNCIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQys1LCAgKi8gImZjZmI1IiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzYsICAqLyAiZmNmYjYiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrNywgICovICJmY2ZiNyIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQys4LCAgKi8gImZjZmI4IiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzksICAqLyAiZmNmYjkiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrMTAsICovICJmY2ZiMTAiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrMTEsICovICJmY2ZiMTEiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrMTIsICovICJmY2ZiMTIiICJcMCIKKyNlbmRpZiAvKiBGRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTICovCisJOworCisJLyogS2VlcCB0aGVzZSBhcnJheXMgaW4gc3luYyEgKi8KKworCXN0YXRpYyBjb25zdCB1aW50MTZfdCBhcnBocmRfdHlwZVtdID0geworCTAsICAgICAgICAgICAgICAgICAgLyogImdlbmVyaWMiICJcMCIgKi8KKwlBUlBIUkRfTE9PUEJBQ0ssICAgIC8qICJsb29wYmFjayIgIlwwIiAqLworCUFSUEhSRF9FVEhFUiwgICAgICAgLyogImV0aGVyIiAiXDAiICovCisjaWZkZWYgQVJQSFJEX0lORklOSUJBTkQKKwlBUlBIUkRfSU5GSU5JQkFORCwgIC8qICJpbmZpbmliYW5kIiAiXDAiICovCisjZW5kaWYKKyNpZmRlZiBBUlBIUkRfSUVFRTgwMl9UUgorCUFSUEhSRF9JRUVFODAyLCAgICAgLyogImllZWU4MDIiICJcMCIgKi8KKwlBUlBIUkRfSUVFRTgwMl9UUiwgIC8qICJ0ciIgIlwwIiAqLworI2Vsc2UKKwlBUlBIUkRfSUVFRTgwMiwgICAgIC8qICJ0ciIgIlwwIiAqLworI2VuZGlmCisjaWZkZWYgQVJQSFJEX0lFRUU4MDIxMQorCUFSUEhSRF9JRUVFODAyMTEsICAgLyogImllZWU4MDIuMTEiICJcMCIgKi8KKyNlbmRpZgorI2lmZGVmIEFSUEhSRF9JRUVFMTM5NAorCUFSUEhSRF9JRUVFMTM5NCwgICAgLyogImllZWUxMzk0IiAiXDAiICovCisjZW5kaWYKKwlBUlBIUkRfSVJEQSwgICAgICAgIC8qICJpcmRhIiAiXDAiICovCisJQVJQSFJEX1NMSVAsICAgICAgICAvKiAic2xpcCIgIlwwIiAqLworCUFSUEhSRF9DU0xJUCwgICAgICAgLyogImNzbGlwIiAiXDAiICovCisJQVJQSFJEX1NMSVA2LCAgICAgICAvKiAic2xpcDYiICJcMCIgKi8KKwlBUlBIUkRfQ1NMSVA2LCAgICAgIC8qICJjc2xpcDYiICJcMCIgKi8KKwlBUlBIUkRfUFBQLCAgICAgICAgIC8qICJwcHAiICJcMCIgKi8KKwlBUlBIUkRfVFVOTkVMLCAgICAgIC8qICJpcGlwIiAiXDAiICovCisJQVJQSFJEX1RVTk5FTDYsICAgICAvKiAidHVubmVsNiIgIlwwIiAqLworCUFSUEhSRF9TSVQsICAgICAgICAgLyogInNpdCIgIlwwIiAqLworCUFSUEhSRF9JUEdSRSwgICAgICAgLyogImdyZSIgIlwwIiAqLworI2lmZGVmIEFSUEhSRF9WT0lECisJQVJQSFJEX1ZPSUQsICAgICAgICAvKiAidm9pZCIgIlwwIiAqLworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUworCUFSUEhSRF9FRVRIRVIsICAgICAgLyogImVldGhlciIgIlwwIiAqLworCUFSUEhSRF9BWDI1LCAgICAgICAgLyogImF4MjUiICJcMCIgKi8KKwlBUlBIUkRfUFJPTkVULCAgICAgIC8qICJwcm9uZXQiICJcMCIgKi8KKwlBUlBIUkRfQ0hBT1MsICAgICAgIC8qICJjaGFvcyIgIlwwIiAqLworCUFSUEhSRF9BUkNORVQsICAgICAgLyogImFyY25ldCIgIlwwIiAqLworCUFSUEhSRF9BUFBMRVRMSywgICAgLyogImF0YWxrIiAiXDAiICovCisJQVJQSFJEX0RMQ0ksICAgICAgICAvKiAiZGxjaSIgIlwwIiAqLworI2lmZGVmIEFSUEhSRF9BVE0KKwlBUlBIUkRfQVRNLCAgICAgICAgIC8qICJhdG0iICJcMCIgKi8KKyNlbmRpZgorCUFSUEhSRF9NRVRSSUNPTSwgICAgLyogIm1ldHJpY29tIiAiXDAiICovCisJQVJQSFJEX1JTUlZELCAgICAgICAvKiAicnNydmQiICJcMCIgKi8KKwlBUlBIUkRfQURBUFQsICAgICAgIC8qICJhZGFwdCIgIlwwIiAqLworCUFSUEhSRF9ST1NFLCAgICAgICAgLyogInJvc2UiICJcMCIgKi8KKwlBUlBIUkRfWDI1LCAgICAgICAgIC8qICJ4MjUiICJcMCIgKi8KKyNpZmRlZiBBUlBIUkRfSFdYMjUKKwlBUlBIUkRfSFdYMjUsICAgICAgIC8qICJod3gyNSIgIlwwIiAqLworI2VuZGlmCisJQVJQSFJEX0hETEMsICAgICAgICAvKiAiaGRsYyIgIlwwIiAqLworCUFSUEhSRF9MQVBCLCAgICAgICAgLyogImxhcGIiICJcMCIgKi8KKyNpZmRlZiBBUlBIUkRfRERDTVAKKwlBUlBIUkRfRERDTVAsICAgICAgIC8qICJkZGNtcCIgIlwwIiAqLworCUFSUEhSRF9SQVdIRExDLCAgICAgLyogInJhd2hkbGMiICJcMCIgKi8KKyNlbmRpZgorCUFSUEhSRF9GUkFELCAgICAgICAgLyogImZyYWQiICJcMCIgKi8KKwlBUlBIUkRfU0tJUCwgICAgICAgIC8qICJza2lwIiAiXDAiICovCisJQVJQSFJEX0xPQ0FMVExLLCAgICAvKiAibHRhbGsiICJcMCIgKi8KKwlBUlBIUkRfRkRESSwgICAgICAgIC8qICJmZGRpIiAiXDAiICovCisJQVJQSFJEX0JJRiwgICAgICAgICAvKiAiYmlmIiAiXDAiICovCisJQVJQSFJEX0lQRERQLCAgICAgICAvKiAiaXAvZGRwIiAiXDAiICovCisJQVJQSFJEX1BJTVJFRywgICAgICAvKiAicGltcmVnIiAiXDAiICovCisJQVJQSFJEX0hJUFBJLCAgICAgICAvKiAiaGlwcGkiICJcMCIgKi8KKwlBUlBIUkRfQVNILCAgICAgICAgIC8qICJhc2giICJcMCIgKi8KKwlBUlBIUkRfRUNPTkVULCAgICAgIC8qICJlY29uZXQiICJcMCIgKi8KKwlBUlBIUkRfRkNQUCwgICAgICAgIC8qICJmY3BwIiAiXDAiICovCisJQVJQSFJEX0ZDQUwsICAgICAgICAvKiAiZmNhbCIgIlwwIiAqLworCUFSUEhSRF9GQ1BMLCAgICAgICAgLyogImZjcGwiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMsICAgIC8qICJmY2ZiMCIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQysxLCAgLyogImZjZmIxIiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzIsICAvKiAiZmNmYjIiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMywgIC8qICJmY2ZiMyIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQys0LCAgLyogImZjZmI0IiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzUsICAvKiAiZmNmYjUiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrNiwgIC8qICJmY2ZiNiIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQys3LCAgLyogImZjZmI3IiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzgsICAvKiAiZmNmYjgiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrOSwgIC8qICJmY2ZiOSIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQysxMCwgLyogImZjZmIxMCIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQysxMSwgLyogImZjZmIxMSIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQysxMiwgLyogImZjZmIxMiIgIlwwIiAqLworI2VuZGlmIC8qIEZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgKi8KKwl9OworCisJdW5zaWduZWQgaTsKKwljb25zdCBjaGFyICphbmFtZSA9IGFycGhyZF9uYW1lOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFycGhyZF90eXBlKTsgaSsrKSB7CisJCWlmIChhcnBocmRfdHlwZVtpXSA9PSB0eXBlKQorCQkJcmV0dXJuIGFuYW1lOworCQlhbmFtZSArPSBzdHJsZW4oYW5hbWUpICsgMTsKKwl9CisJc3ByaW50ZihidWYsICJbJWRdIiwgdHlwZSk7CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydF9uYW1lcy5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3J0X25hbWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3NGFiOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydF9uYW1lcy5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgcnRubF90YWJfdCB7CisJY29uc3QgY2hhciAqY2FjaGVkX3N0cjsKKwl1bnNpZ25lZCBjYWNoZWRfcmVzdWx0OworCWNvbnN0IGNoYXIgKnRhYlsyNTZdOworfSBydG5sX3RhYl90OworCitzdGF0aWMgdm9pZCBydG5sX3RhYl9pbml0aWFsaXplKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKip0YWIpCit7CisJY2hhciAqdG9rZW5bMl07CisJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuMihmaWxlLCBmb3Blbl9mb3JfcmVhZCk7CisKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpKSB7CisJCXVuc2lnbmVkIGlkID0gYmJfc3RydG91KHRva2VuWzBdLCBOVUxMLCAwKTsKKwkJaWYgKGlkID4gMjU2KSB7CisJCQliYl9lcnJvcl9tc2coImRhdGFiYXNlICVzIGlzIGNvcnJ1cHRlZCBhdCBsaW5lICVkIiwKKwkJCQlmaWxlLCBwYXJzZXItPmxpbmVubyk7CisJCQlicmVhazsKKwkJfQorCQl0YWJbaWRdID0geHN0cmR1cCh0b2tlblsxXSk7CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworfQorCitzdGF0aWMgaW50IHJ0bmxfYTJuKHJ0bmxfdGFiX3QgKnRhYiwgdWludDMyX3QgKmlkLCBjb25zdCBjaGFyICphcmcsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGk7CisKKwlpZiAodGFiLT5jYWNoZWRfc3RyICYmIHN0cmNtcCh0YWItPmNhY2hlZF9zdHIsIGFyZykgPT0gMCkgeworCQkqaWQgPSB0YWItPmNhY2hlZF9yZXN1bHQ7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpZiAodGFiLT50YWJbaV0KKwkJICYmIHN0cmNtcCh0YWItPnRhYltpXSwgYXJnKSA9PSAwCisJCSkgeworCQkJdGFiLT5jYWNoZWRfc3RyID0gdGFiLT50YWJbaV07CisJCQl0YWItPmNhY2hlZF9yZXN1bHQgPSBpOworCQkJKmlkID0gaTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaSA9IGJiX3N0cnRvdShhcmcsIE5VTEwsIGJhc2UpOworCWlmIChpID4gMjU1KQorCQlyZXR1cm4gLTE7CisJKmlkID0gaTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgcnRubF90YWJfdCAqcnRubF9ydHByb3RfdGFiOworCitzdGF0aWMgdm9pZCBydG5sX3J0cHJvdF9pbml0aWFsaXplKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGluaXRfdGFiW10gPSB7CisJCSJub25lIiwKKwkJInJlZGlyZWN0IiwKKwkJImtlcm5lbCIsCisJCSJib290IiwKKwkJInN0YXRpYyIsCisJCU5VTEwsCisJCU5VTEwsCisJCU5VTEwsCisJCSJnYXRlZCIsCisJCSJyYSIsCisJCSJtcnQiLAorCQkiemVicmEiLAorCQkiYmlyZCIsCisJfTsKKworCWlmIChydG5sX3J0cHJvdF90YWIpCisJCXJldHVybjsKKwlydG5sX3J0cHJvdF90YWIgPSB4emFsbG9jKHNpemVvZigqcnRubF9ydHByb3RfdGFiKSk7CisJbWVtY3B5KHJ0bmxfcnRwcm90X3RhYi0+dGFiLCBpbml0X3RhYiwgc2l6ZW9mKGluaXRfdGFiKSk7CisJcnRubF90YWJfaW5pdGlhbGl6ZSgiL2V0Yy9pcHJvdXRlMi9ydF9wcm90b3MiLCBydG5sX3J0cHJvdF90YWItPnRhYik7Cit9CisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBydG5sX3J0cHJvdF9uMmEoaW50IGlkLCBjaGFyICpidWYpCit7CisJaWYgKGlkIDwgMCB8fCBpZCA+PSAyNTYpIHsKKwkJc3ByaW50ZihidWYsICIlZCIsIGlkKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlydG5sX3J0cHJvdF9pbml0aWFsaXplKCk7CisKKwlpZiAocnRubF9ydHByb3RfdGFiLT50YWJbaWRdKQorCQlyZXR1cm4gcnRubF9ydHByb3RfdGFiLT50YWJbaWRdOworCS8qIGJ1ZiBpcyBTUFJJTlRfQlNJWkUgYmlnICovCisJc3ByaW50ZihidWYsICIlZCIsIGlkKTsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgRkFTVF9GVU5DIHJ0bmxfcnRwcm90X2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykKK3sKKwlydG5sX3J0cHJvdF9pbml0aWFsaXplKCk7CisJcmV0dXJuIHJ0bmxfYTJuKHJ0bmxfcnRwcm90X3RhYiwgaWQsIGFyZywgMCk7Cit9CisKKworc3RhdGljIHJ0bmxfdGFiX3QgKnJ0bmxfcnRzY29wZV90YWI7CisKK3N0YXRpYyB2b2lkIHJ0bmxfcnRzY29wZV9pbml0aWFsaXplKHZvaWQpCit7CisJaWYgKHJ0bmxfcnRzY29wZV90YWIpCisJCXJldHVybjsKKwlydG5sX3J0c2NvcGVfdGFiID0geHphbGxvYyhzaXplb2YoKnJ0bmxfcnRzY29wZV90YWIpKTsKKwlydG5sX3J0c2NvcGVfdGFiLT50YWJbMF0gPSAiZ2xvYmFsIjsKKwlydG5sX3J0c2NvcGVfdGFiLT50YWJbMjU1XSA9ICJub3doZXJlIjsKKwlydG5sX3J0c2NvcGVfdGFiLT50YWJbMjU0XSA9ICJob3N0IjsKKwlydG5sX3J0c2NvcGVfdGFiLT50YWJbMjUzXSA9ICJsaW5rIjsKKwlydG5sX3J0c2NvcGVfdGFiLT50YWJbMjAwXSA9ICJzaXRlIjsKKwlydG5sX3RhYl9pbml0aWFsaXplKCIvZXRjL2lwcm91dGUyL3J0X3Njb3BlcyIsIHJ0bmxfcnRzY29wZV90YWItPnRhYik7Cit9CisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBydG5sX3J0c2NvcGVfbjJhKGludCBpZCwgY2hhciAqYnVmKQoreworCWlmIChpZCA8IDAgfHwgaWQgPj0gMjU2KSB7CisJCXNwcmludGYoYnVmLCAiJWQiLCBpZCk7CisJCXJldHVybiBidWY7CisJfQorCisJcnRubF9ydHNjb3BlX2luaXRpYWxpemUoKTsKKworCWlmIChydG5sX3J0c2NvcGVfdGFiLT50YWJbaWRdKQorCQlyZXR1cm4gcnRubF9ydHNjb3BlX3RhYi0+dGFiW2lkXTsKKwkvKiBidWYgaXMgU1BSSU5UX0JTSVpFIGJpZyAqLworCXNwcmludGYoYnVmLCAiJWQiLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IEZBU1RfRlVOQyBydG5sX3J0c2NvcGVfYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKQoreworCXJ0bmxfcnRzY29wZV9pbml0aWFsaXplKCk7CisJcmV0dXJuIHJ0bmxfYTJuKHJ0bmxfcnRzY29wZV90YWIsIGlkLCBhcmcsIDApOworfQorCisKK3N0YXRpYyBydG5sX3RhYl90ICpydG5sX3J0cmVhbG1fdGFiOworCitzdGF0aWMgdm9pZCBydG5sX3J0cmVhbG1faW5pdGlhbGl6ZSh2b2lkKQoreworCWlmIChydG5sX3J0cmVhbG1fdGFiKSByZXR1cm47CisJcnRubF9ydHJlYWxtX3RhYiA9IHh6YWxsb2Moc2l6ZW9mKCpydG5sX3J0cmVhbG1fdGFiKSk7CisJcnRubF9ydHJlYWxtX3RhYi0+dGFiWzBdID0gInVua25vd24iOworCXJ0bmxfdGFiX2luaXRpYWxpemUoIi9ldGMvaXByb3V0ZTIvcnRfcmVhbG1zIiwgcnRubF9ydHJlYWxtX3RhYi0+dGFiKTsKK30KKworaW50IEZBU1RfRlVOQyBydG5sX3J0cmVhbG1fYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKQoreworCXJ0bmxfcnRyZWFsbV9pbml0aWFsaXplKCk7CisJcmV0dXJuIHJ0bmxfYTJuKHJ0bmxfcnRyZWFsbV90YWIsIGlkLCBhcmcsIDApOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorY29uc3QgY2hhciogRkFTVF9GVU5DIHJ0bmxfcnRyZWFsbV9uMmEoaW50IGlkLCBjaGFyICpidWYpCit7CisJaWYgKGlkIDwgMCB8fCBpZCA+PSAyNTYpIHsKKwkJc3ByaW50ZihidWYsICIlZCIsIGlkKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlydG5sX3J0cmVhbG1faW5pdGlhbGl6ZSgpOworCisJaWYgKHJ0bmxfcnRyZWFsbV90YWItPnRhYltpZF0pCisJCXJldHVybiBydG5sX3J0cmVhbG1fdGFiLT50YWJbaWRdOworCS8qIGJ1ZiBpcyBTUFJJTlRfQlNJWkUgYmlnICovCisJc3ByaW50ZihidWYsICIlZCIsIGlkKTsKKwlyZXR1cm4gYnVmOworfQorI2VuZGlmCisKKworc3RhdGljIHJ0bmxfdGFiX3QgKnJ0bmxfcnRkc2ZpZWxkX3RhYjsKKworc3RhdGljIHZvaWQgcnRubF9ydGRzZmllbGRfaW5pdGlhbGl6ZSh2b2lkKQoreworCWlmIChydG5sX3J0ZHNmaWVsZF90YWIpIHJldHVybjsKKwlydG5sX3J0ZHNmaWVsZF90YWIgPSB4emFsbG9jKHNpemVvZigqcnRubF9ydGRzZmllbGRfdGFiKSk7CisJcnRubF9ydGRzZmllbGRfdGFiLT50YWJbMF0gPSAiMCI7CisJcnRubF90YWJfaW5pdGlhbGl6ZSgiL2V0Yy9pcHJvdXRlMi9ydF9kc2ZpZWxkIiwgcnRubF9ydGRzZmllbGRfdGFiLT50YWIpOworfQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgcnRubF9kc2ZpZWxkX24yYShpbnQgaWQsIGNoYXIgKmJ1ZikKK3sKKwlpZiAoaWQgPCAwIHx8IGlkID49IDI1NikgeworCQlzcHJpbnRmKGJ1ZiwgIiVkIiwgaWQpOworCQlyZXR1cm4gYnVmOworCX0KKworCXJ0bmxfcnRkc2ZpZWxkX2luaXRpYWxpemUoKTsKKworCWlmIChydG5sX3J0ZHNmaWVsZF90YWItPnRhYltpZF0pCisJCXJldHVybiBydG5sX3J0ZHNmaWVsZF90YWItPnRhYltpZF07CisJLyogYnVmIGlzIFNQUklOVF9CU0laRSBiaWcgKi8KKwlzcHJpbnRmKGJ1ZiwgIjB4JTAyeCIsIGlkKTsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgRkFTVF9GVU5DIHJ0bmxfZHNmaWVsZF9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpCit7CisJcnRubF9ydGRzZmllbGRfaW5pdGlhbGl6ZSgpOworCXJldHVybiBydG5sX2EybihydG5sX3J0ZHNmaWVsZF90YWIsIGlkLCBhcmcsIDE2KTsKK30KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorc3RhdGljIHJ0bmxfdGFiX3QgKnJ0bmxfcnR0YWJsZV90YWI7CisKK3N0YXRpYyB2b2lkIHJ0bmxfcnR0YWJsZV9pbml0aWFsaXplKHZvaWQpCit7CisJaWYgKHJ0bmxfcnRkc2ZpZWxkX3RhYikgcmV0dXJuOworCXJ0bmxfcnR0YWJsZV90YWIgPSB4emFsbG9jKHNpemVvZigqcnRubF9ydHRhYmxlX3RhYikpOworCXJ0bmxfcnR0YWJsZV90YWItPnRhYlswXSA9ICJ1bnNwZWMiOworCXJ0bmxfcnR0YWJsZV90YWItPnRhYlsyNTVdID0gImxvY2FsIjsKKwlydG5sX3J0dGFibGVfdGFiLT50YWJbMjU0XSA9ICJtYWluIjsKKwlydG5sX3J0dGFibGVfdGFiLT50YWJbMjUzXSA9ICJkZWZhdWx0IjsKKwlydG5sX3RhYl9pbml0aWFsaXplKCIvZXRjL2lwcm91dGUyL3J0X3RhYmxlcyIsIHJ0bmxfcnR0YWJsZV90YWItPnRhYik7Cit9CisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBydG5sX3J0dGFibGVfbjJhKGludCBpZCwgY2hhciAqYnVmKQoreworCWlmIChpZCA8IDAgfHwgaWQgPj0gMjU2KSB7CisJCXNwcmludGYoYnVmLCAiJWQiLCBpZCk7CisJCXJldHVybiBidWY7CisJfQorCisJcnRubF9ydHRhYmxlX2luaXRpYWxpemUoKTsKKworCWlmIChydG5sX3J0dGFibGVfdGFiLT50YWJbaWRdKQorCQlyZXR1cm4gcnRubF9ydHRhYmxlX3RhYi0+dGFiW2lkXTsKKwkvKiBidWYgaXMgU1BSSU5UX0JTSVpFIGJpZyAqLworCXNwcmludGYoYnVmLCAiJWQiLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IEZBU1RfRlVOQyBydG5sX3J0dGFibGVfYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKQoreworCXJ0bmxfcnR0YWJsZV9pbml0aWFsaXplKCk7CisJcmV0dXJuIHJ0bmxfYTJuKHJ0bmxfcnR0YWJsZV90YWIsIGlkLCBhcmcsIDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydF9uYW1lcy5oIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3J0X25hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczYWE4NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydF9uYW1lcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmbmRlZiBSVF9OQU1FU19ICisjZGVmaW5lIFJUX05BTUVTX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogYnVmIGlzIFNQUklOVF9CU0laRSBiaWcgKi8KK2V4dGVybiBjb25zdCBjaGFyKiBydG5sX3J0cHJvdF9uMmEoaW50IGlkLCBjaGFyICpidWYpIEZBU1RfRlVOQzsKK2V4dGVybiBjb25zdCBjaGFyKiBydG5sX3J0c2NvcGVfbjJhKGludCBpZCwgY2hhciAqYnVmKSBGQVNUX0ZVTkM7CitleHRlcm4gY29uc3QgY2hhciogcnRubF9ydHJlYWxtX24yYShpbnQgaWQsIGNoYXIgKmJ1ZikgRkFTVF9GVU5DOworZXh0ZXJuIGNvbnN0IGNoYXIqIHJ0bmxfZHNmaWVsZF9uMmEoaW50IGlkLCBjaGFyICpidWYpIEZBU1RfRlVOQzsKK2V4dGVybiBjb25zdCBjaGFyKiBydG5sX3J0dGFibGVfbjJhKGludCBpZCwgY2hhciAqYnVmKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHJ0bmxfcnRwcm90X2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykgRkFTVF9GVU5DOworZXh0ZXJuIGludCBydG5sX3J0c2NvcGVfYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHJ0bmxfcnRyZWFsbV9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgcnRubF9kc2ZpZWxkX2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykgRkFTVF9GVU5DOworZXh0ZXJuIGludCBydG5sX3J0dGFibGVfYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CisKK2V4dGVybiBjb25zdCBjaGFyKiBsbF90eXBlX24yYShpbnQgdHlwZSwgY2hhciAqYnVmKSBGQVNUX0ZVTkM7CisKK2V4dGVybiBjb25zdCBjaGFyKiBsbF9hZGRyX24yYSh1bnNpZ25lZCBjaGFyICphZGRyLCBpbnQgYWxlbiwgaW50IHR5cGUsCisJCQkJY2hhciAqYnVmLCBpbnQgYmxlbikgRkFTVF9GVU5DOworZXh0ZXJuIGludCBsbF9hZGRyX2Eybih1bnNpZ25lZCBjaGFyICpsbGFkZHIsIGludCBsZW4sIGNoYXIgKmFyZykgRkFTVF9GVU5DOworCitleHRlcm4gY29uc3QgY2hhciogbGxfcHJvdG9fbjJhKHVuc2lnbmVkIHNob3J0IGlkLCBjaGFyICpidWYsIGludCBsZW4pIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgbGxfcHJvdG9fYTJuKHVuc2lnbmVkIHNob3J0ICppZCwgY2hhciAqYnVmKSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3J0bV9tYXAuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydG1fbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhYjUzYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydG1fbWFwLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworY29uc3QgY2hhciogRkFTVF9GVU5DIHJ0bmxfcnRudHlwZV9uMmEoaW50IGlkLCBjaGFyICpidWYpCit7CisJc3dpdGNoIChpZCkgeworCWNhc2UgUlROX1VOU1BFQzoKKwkJcmV0dXJuICJub25lIjsKKwljYXNlIFJUTl9VTklDQVNUOgorCQlyZXR1cm4gInVuaWNhc3QiOworCWNhc2UgUlROX0xPQ0FMOgorCQlyZXR1cm4gImxvY2FsIjsKKwljYXNlIFJUTl9CUk9BRENBU1Q6CisJCXJldHVybiAiYnJvYWRjYXN0IjsKKwljYXNlIFJUTl9BTllDQVNUOgorCQlyZXR1cm4gImFueWNhc3QiOworCWNhc2UgUlROX01VTFRJQ0FTVDoKKwkJcmV0dXJuICJtdWx0aWNhc3QiOworCWNhc2UgUlROX0JMQUNLSE9MRToKKwkJcmV0dXJuICJibGFja2hvbGUiOworCWNhc2UgUlROX1VOUkVBQ0hBQkxFOgorCQlyZXR1cm4gInVucmVhY2hhYmxlIjsKKwljYXNlIFJUTl9QUk9ISUJJVDoKKwkJcmV0dXJuICJwcm9oaWJpdCI7CisJY2FzZSBSVE5fVEhST1c6CisJCXJldHVybiAidGhyb3ciOworCWNhc2UgUlROX05BVDoKKwkJcmV0dXJuICJuYXQiOworCWNhc2UgUlROX1hSRVNPTFZFOgorCQlyZXR1cm4gInhyZXNvbHZlIjsKKwlkZWZhdWx0OgorCQkvKiBidWYgaXMgU1BSSU5UX0JTSVpFIGJpZyAqLworCQlzcHJpbnRmKGJ1ZiwgIiVkIiwgaWQpOworCQlyZXR1cm4gYnVmOworCX0KK30KKworCitpbnQgRkFTVF9GVU5DIHJ0bmxfcnRudHlwZV9hMm4oaW50ICppZCwgY2hhciAqYXJnKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJImxvY2FsXDAiIm5hdFwwIiJicm9hZGNhc3RcMCIiYnJkXDAiImFueWNhc3RcMCIKKwkJIm11bHRpY2FzdFwwIiJwcm9oaWJpdFwwIiJ1bnJlYWNoYWJsZVwwIiJibGFja2hvbGVcMCIKKwkJInhyZXNvbHZlXDAiInVuaWNhc3RcMCIidGhyb3dcMCI7CisJZW51bSB7CisJCUFSR19sb2NhbCA9IDEsIEFSR19uYXQsIEFSR19icm9hZGNhc3QsIEFSR19icmQsIEFSR19hbnljYXN0LAorCQlBUkdfbXVsdGljYXN0LCBBUkdfcHJvaGliaXQsIEFSR191bnJlYWNoYWJsZSwgQVJHX2JsYWNraG9sZSwKKwkJQVJHX3hyZXNvbHZlLCBBUkdfdW5pY2FzdCwgQVJHX3Rocm93CisJfTsKKwljb25zdCBzbWFsbHVpbnQga2V5ID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgYXJnKSArIDE7CisJY2hhciAqZW5kOworCXVuc2lnbmVkIGxvbmcgcmVzOworCisJaWYgKGtleSA9PSBBUkdfbG9jYWwpCisJCXJlcyA9IFJUTl9MT0NBTDsKKwllbHNlIGlmIChrZXkgPT0gQVJHX25hdCkKKwkJcmVzID0gUlROX05BVDsKKwllbHNlIGlmIChrZXkgPT0gQVJHX2Jyb2FkY2FzdCB8fCBrZXkgPT0gQVJHX2JyZCkKKwkJcmVzID0gUlROX0JST0FEQ0FTVDsKKwllbHNlIGlmIChrZXkgPT0gQVJHX2FueWNhc3QpCisJCXJlcyA9IFJUTl9BTllDQVNUOworCWVsc2UgaWYgKGtleSA9PSBBUkdfbXVsdGljYXN0KQorCQlyZXMgPSBSVE5fTVVMVElDQVNUOworCWVsc2UgaWYgKGtleSA9PSBBUkdfcHJvaGliaXQpCisJCXJlcyA9IFJUTl9QUk9ISUJJVDsKKwllbHNlIGlmIChrZXkgPT0gQVJHX3VucmVhY2hhYmxlKQorCQlyZXMgPSBSVE5fVU5SRUFDSEFCTEU7CisJZWxzZSBpZiAoa2V5ID09IEFSR19ibGFja2hvbGUpCisJCXJlcyA9IFJUTl9CTEFDS0hPTEU7CisJZWxzZSBpZiAoa2V5ID09IEFSR194cmVzb2x2ZSkKKwkJcmVzID0gUlROX1hSRVNPTFZFOworCWVsc2UgaWYgKGtleSA9PSBBUkdfdW5pY2FzdCkKKwkJcmVzID0gUlROX1VOSUNBU1Q7CisJZWxzZSBpZiAoa2V5ID09IEFSR190aHJvdykKKwkJcmVzID0gUlROX1RIUk9XOworCWVsc2UgeworCQlyZXMgPSBzdHJ0b3VsKGFyZywgJmVuZCwgMCk7CisJCWlmIChlbmQgPT0gYXJnIHx8ICplbmQgfHwgcmVzID4gMjU1KQorCQkJcmV0dXJuIC0xOworCX0KKwkqaWQgPSByZXM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBGQVNUX0ZVTkMgZ2V0X3J0X3JlYWxtcyh1aW50MzJfdCAqcmVhbG1zLCBjaGFyICphcmcpCit7CisJdWludDMyX3QgcmVhbG0gPSAwOworCWNoYXIgKnAgPSBzdHJjaHIoYXJnLCAnLycpOworCisJKnJlYWxtcyA9IDA7CisJaWYgKHApIHsKKwkJKnAgPSAwOworCQlpZiAocnRubF9ydHJlYWxtX2EybihyZWFsbXMsIGFyZykpIHsKKwkJCSpwID0gJy8nOworCQkJcmV0dXJuIC0xOworCQl9CisJCSpyZWFsbXMgPDw9IDE2OworCQkqcCA9ICcvJzsKKwkJYXJnID0gcCsxOworCX0KKwlpZiAoKmFyZyAmJiBydG5sX3J0cmVhbG1fYTJuKCZyZWFsbSwgYXJnKSkKKwkJcmV0dXJuIC0xOworCSpyZWFsbXMgfD0gcmVhbG07CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRtX21hcC5oIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3J0bV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzc3YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3J0bV9tYXAuaApAQCAtMCwwICsxLDE0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpZm5kZWYgUlRNX01BUF9ICisjZGVmaW5lIFJUTV9NQVBfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitjb25zdCBjaGFyICpydG5sX3J0bnR5cGVfbjJhKGludCBpZCwgY2hhciAqYnVmKSBGQVNUX0ZVTkM7CitpbnQgcnRubF9ydG50eXBlX2EybihpbnQgKmlkLCBjaGFyICphcmcpIEZBU1RfRlVOQzsKKworaW50IGdldF9ydF9yZWFsbXModWludDMyX3QgKnJlYWxtcywgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGZlMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkyOTogcmVzb2x2ZSBhZGRyZXNzZXMKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisKK3Vuc2lnbmVkIGdldF91bnNpZ25lZChjaGFyICphcmcsIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoKmFyZykgeworCQlyZXMgPSBzdHJ0b3VsKGFyZywgJnB0ciwgMCk7CisvL0ZJWE1FOiAiIiB3aWxsIGJlIGFjY2VwdGVkIHRvbywgaXMgaXQgY29ycmVjdD8hCisJCWlmICghKnB0ciAmJiByZXMgPD0gVUlOVF9NQVgpIHsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9CisJaW52YXJnKGFyZywgZXJybXNnKTsgLyogZG9lcyBub3QgcmV0dXJuICovCit9CisKK3VpbnQzMl90IGdldF91MzIoY2hhciAqYXJnLCBjb25zdCBjaGFyICplcnJtc2cpCit7CisJdW5zaWduZWQgbG9uZyByZXM7CisJY2hhciAqcHRyOworCisJaWYgKCphcmcpIHsKKwkJcmVzID0gc3RydG91bChhcmcsICZwdHIsIDApOworLy9GSVhNRTogIiIgd2lsbCBiZSBhY2NlcHRlZCB0b28sIGlzIGl0IGNvcnJlY3Q/IQorCQlpZiAoISpwdHIgJiYgcmVzIDw9IDB4RkZGRkZGRkZVTCkgeworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlpbnZhcmcoYXJnLCBlcnJtc2cpOyAvKiBkb2VzIG5vdCByZXR1cm4gKi8KK30KKwordWludDE2X3QgZ2V0X3UxNihjaGFyICphcmcsIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoKmFyZykgeworCQlyZXMgPSBzdHJ0b3VsKGFyZywgJnB0ciwgMCk7CisvL0ZJWE1FOiAiIiB3aWxsIGJlIGFjY2VwdGVkIHRvbywgaXMgaXQgY29ycmVjdD8hCisJCWlmICghKnB0ciAmJiByZXMgPD0gMHhGRkZGKSB7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCWludmFyZyhhcmcsIGVycm1zZyk7IC8qIGRvZXMgbm90IHJldHVybiAqLworfQorCitpbnQgZ2V0X2FkZHJfMShpbmV0X3ByZWZpeCAqYWRkciwgY2hhciAqbmFtZSwgaW50IGZhbWlseSkKK3sKKwltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKCphZGRyKSk7CisKKwlpZiAoc3RyY21wKG5hbWUsICJkZWZhdWx0IikgPT0gMAorCSB8fCBzdHJjbXAobmFtZSwgImFsbCIpID09IDAKKwkgfHwgc3RyY21wKG5hbWUsICJhbnkiKSA9PSAwCisJKSB7CisJCWFkZHItPmZhbWlseSA9IGZhbWlseTsKKwkJYWRkci0+Ynl0ZWxlbiA9IChmYW1pbHkgPT0gQUZfSU5FVDYgPyAxNiA6IDQpOworCQlhZGRyLT5iaXRsZW4gPSAtMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNocihuYW1lLCAnOicpKSB7CisJCWFkZHItPmZhbWlseSA9IEFGX0lORVQ2OworCQlpZiAoZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBmYW1pbHkgIT0gQUZfSU5FVDYpCisJCQlyZXR1cm4gLTE7CisJCWlmIChpbmV0X3B0b24oQUZfSU5FVDYsIG5hbWUsIGFkZHItPmRhdGEpIDw9IDApCisJCQlyZXR1cm4gLTE7CisJCWFkZHItPmJ5dGVsZW4gPSAxNjsKKwkJYWRkci0+Yml0bGVuID0gLTE7CisJCXJldHVybiAwOworCX0KKworCWlmIChmYW1pbHkgIT0gQUZfVU5TUEVDICYmIGZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gLTE7CisKKwkvKiBUcnkgdG8gcGFyc2UgaXQgYXMgSVB2NCAqLworCWFkZHItPmZhbWlseSA9IEFGX0lORVQ7CisjaWYgMCAvKiBEb2Vzbid0IGhhbmRsZSBlLmcuICIxMC4xMCIsIGZvciBleGFtcGxlLCAiaXAgciBsIHJvb3QgMTAuMTAvMTYiICovCisJaWYgKGluZXRfcHRvbihBRl9JTkVULCBuYW1lLCBhZGRyLT5kYXRhKSA8PSAwKQorCQlyZXR1cm4gLTE7CisjZWxzZQorCXsKKwkJdW5zaWduZWQgaSA9IDA7CisJCXVuc2lnbmVkIG4gPSAwOworCQljb25zdCBjaGFyICpjcCA9IG5hbWUgLSAxOworCQl3aGlsZSAoKisrY3ApIHsKKwkJCWlmICgodW5zaWduZWQgY2hhcikoKmNwIC0gJzAnKSA8PSA5KSB7CisJCQkJbiA9IDEwICogbiArICh1bnNpZ25lZCBjaGFyKSgqY3AgLSAnMCcpOworCQkJCWlmIChuID49IDI1NikKKwkJCQkJcmV0dXJuIC0xOworCQkJCSgodWludDhfdCopYWRkci0+ZGF0YSlbaV0gPSBuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCpjcCA9PSAnLicgJiYgKytpIDw9IDMpIHsKKwkJCQluID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKyNlbmRpZgorCWFkZHItPmJ5dGVsZW4gPSA0OworCWFkZHItPmJpdGxlbiA9IC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wcmVmaXhfMShpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpCit7CisJY2hhciAqc2xhc2g7CisKKwltZW1zZXQoZHN0LCAwLCBzaXplb2YoKmRzdCkpOworCisJaWYgKHN0cmNtcChhcmcsICJkZWZhdWx0IikgPT0gMAorCSB8fCBzdHJjbXAoYXJnLCAiYWxsIikgPT0gMAorCSB8fCBzdHJjbXAoYXJnLCAiYW55IikgPT0gMAorCSkgeworCQlkc3QtPmZhbWlseSA9IGZhbWlseTsKKwkJLypkc3QtPmJ5dGVsZW4gPSAwOyAtIGRvbmUgYnkgbWVtc2V0ICovCisJCS8qZHN0LT5iaXRsZW4gPSAwOyovCisJCXJldHVybjsKKwl9CisKKwlzbGFzaCA9IHN0cmNocihhcmcsICcvJyk7CisJaWYgKHNsYXNoKQorCQkqc2xhc2ggPSAnXDAnOworCisJaWYgKGdldF9hZGRyXzEoZHN0LCBhcmcsIGZhbWlseSkgPT0gMCkgeworCQlkc3QtPmJpdGxlbiA9IChkc3QtPmZhbWlseSA9PSBBRl9JTkVUNikgPyAxMjggOiAzMjsKKwkJaWYgKHNsYXNoKSB7CisJCQl1bnNpZ25lZCBwbGVuOworCQkJaW5ldF9wcmVmaXggbmV0bWFza19wZng7CisKKwkJCW5ldG1hc2tfcGZ4LmZhbWlseSA9IEFGX1VOU1BFQzsKKwkJCXBsZW4gPSBiYl9zdHJ0b3Uoc2xhc2ggKyAxLCBOVUxMLCAwKTsKKwkJCWlmICgoZXJybm8gfHwgcGxlbiA+IGRzdC0+Yml0bGVuKQorCQkJICYmIGdldF9hZGRyXzEoJm5ldG1hc2tfcGZ4LCBzbGFzaCArIDEsIGZhbWlseSkgIT0gMAorCQkJKSB7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAobmV0bWFza19wZnguZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCQkvKiBmaWxsIGluIHByZWZpeCBsZW5ndGggb2YgZG90dGVkIHF1YWQgKi8KKwkJCQl1aW50MzJfdCBtYXNrID0gbnRvaGwobmV0bWFza19wZnguZGF0YVswXSk7CisJCQkJdWludDMyX3QgaG9zdCA9IH5tYXNrOworCisJCQkJLyogYSB2YWxpZCBuZXRtYXNrIG11c3QgYmUgMl5uIC0gMSAqLworCQkJCWlmIChob3N0ICYgKGhvc3QgKyAxKSkKKwkJCQkJZ290byBiYWQ7CisKKwkJCQlmb3IgKHBsZW4gPSAwOyBtYXNrOyBtYXNrIDw8PSAxKQorCQkJCQkrK3BsZW47CisJCQkJaWYgKHBsZW4gPiBkc3QtPmJpdGxlbikKKwkJCQkJZ290byBiYWQ7CisJCQkJLyogZHN0LT5mbGFncyB8PSBQUkVGSVhMRU5fU1BFQ0lGSUVEOyAqLworCQkJfQorCQkJZHN0LT5iaXRsZW4gPSBwbGVuOworCQl9CisJfQorCisJaWYgKHNsYXNoKQorCQkqc2xhc2ggPSAnLyc7CisJcmV0dXJuOworIGJhZDoKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYW4gJXMgJXMgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiIiwgImluZXQiLCAicHJlZml4IiwgYXJnKTsKK30KKworaW50IGdldF9hZGRyKGluZXRfcHJlZml4ICpkc3QsIGNoYXIgKmFyZywgaW50IGZhbWlseSkKK3sKKwlpZiAoZmFtaWx5ID09IEFGX1BBQ0tFVCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiXCIlc1wiIG1heSBiZSBpbmV0ICVzLCBidXQgaXQgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0IiwgYXJnLCAiYWRkcmVzcyIpOworCX0KKwlpZiAoZ2V0X2FkZHJfMShkc3QsIGFyZywgZmFtaWx5KSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYW4gJXMgJXMgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiIiwgImluZXQiLCAiYWRkcmVzcyIsIGFyZyk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGdldF9wcmVmaXgoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KQoreworCWlmIChmYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJcIiVzXCIgbWF5IGJlIGluZXQgJXMsIGJ1dCBpdCBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIGNvbnRleHQiLCBhcmcsICJwcmVmaXgiKTsKKwl9CisJZ2V0X3ByZWZpeF8xKGRzdCwgYXJnLCBmYW1pbHkpOworfQorCit1aW50MzJfdCBnZXRfYWRkcjMyKGNoYXIgKm5hbWUpCit7CisJaW5ldF9wcmVmaXggYWRkcjsKKworCWlmIChnZXRfYWRkcl8xKCZhZGRyLCBuYW1lLCBBRl9JTkVUKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYW4gJXMgJXMgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiIiwgIklQIiwgImFkZHJlc3MiLCBuYW1lKTsKKwl9CisJcmV0dXJuIGFkZHIuZGF0YVswXTsKK30KKwordm9pZCBpbmNvbXBsZXRlX2NvbW1hbmQodm9pZCkKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29tbWFuZCBsaW5lIGlzIG5vdCBjb21wbGV0ZSwgdHJ5IG9wdGlvbiBcImhlbHBcIiIpOworfQorCit2b2lkIGludmFyZyhjb25zdCBjaGFyICphcmcsIGNvbnN0IGNoYXIgKm9wdCkKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsIGFyZywgb3B0KTsKK30KKwordm9pZCBkdXBhcmcoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICphcmcpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImR1cGxpY2F0ZSBcIiVzXCI6IFwiJXNcIiBpcyB0aGUgc2Vjb25kIHZhbHVlIiwga2V5LCBhcmcpOworfQorCit2b2lkIGR1cGFyZzIoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICphcmcpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVpdGhlciBcIiVzXCIgaXMgZHVwbGljYXRlLCBvciBcIiVzXCIgaXMgZ2FyYmFnZSIsIGtleSwgYXJnKTsKK30KKworaW50IGluZXRfYWRkcl9tYXRjaChjb25zdCBpbmV0X3ByZWZpeCAqYSwgY29uc3QgaW5ldF9wcmVmaXggKmIsIGludCBiaXRzKQoreworCWNvbnN0IHVpbnQzMl90ICphMSA9IGEtPmRhdGE7CisJY29uc3QgdWludDMyX3QgKmEyID0gYi0+ZGF0YTsKKwlpbnQgd29yZHMgPSBiaXRzID4+IDU7CisKKwliaXRzICY9IDB4MWY7CisKKwlpZiAod29yZHMpCisJCWlmIChtZW1jbXAoYTEsIGEyLCB3b3JkcyA8PCAyKSkKKwkJCXJldHVybiAtMTsKKworCWlmIChiaXRzKSB7CisJCXVpbnQzMl90IHcxLCB3MjsKKwkJdWludDMyX3QgbWFzazsKKworCQl3MSA9IGExW3dvcmRzXTsKKwkJdzIgPSBhMlt3b3Jkc107CisKKwkJbWFzayA9IGh0b25sKCgweGZmZmZmZmZmKSA8PCAoMHgyMCAtIGJpdHMpKTsKKworCQlpZiAoKHcxIF4gdzIpICYgbWFzaykKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICpydF9hZGRyX24yYShpbnQgYWYsCisJCXZvaWQgKmFkZHIsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBBRl9JTkVUOgorCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBpbmV0X250b3AoYWYsIGFkZHIsIGJ1ZiwgYnVmbGVuKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIj8/PyI7CisJfQorfQorCisjaWZkZWYgUkVTT0xWRV9IT1NUTkFNRVMKK2NvbnN0IGNoYXIgKmZvcm1hdF9ob3N0KGludCBhZiwgaW50IGxlbiwgdm9pZCAqYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCWlmIChyZXNvbHZlX2hvc3RzKSB7CisJCXN0cnVjdCBob3N0ZW50ICpoX2VudDsKKworCQlpZiAobGVuIDw9IDApIHsKKwkJCXN3aXRjaCAoYWYpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQlsZW4gPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBBRl9JTkVUNjoKKwkJCQlsZW4gPSAxNjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6OworCQkJfQorCQl9CisJCWlmIChsZW4gPiAwKSB7CisJCQloX2VudCA9IGdldGhvc3RieWFkZHIoYWRkciwgbGVuLCBhZik7CisJCQlpZiAoaF9lbnQgIT0gTlVMTCkgeworCQkJCXNhZmVfc3RybmNweShidWYsIGhfZW50LT5oX25hbWUsIGJ1Zmxlbik7CisJCQkJcmV0dXJuIGJ1ZjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcnRfYWRkcl9uMmEoYWYsIGFkZHIsIGJ1ZiwgYnVmbGVuKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmggYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL2xpYmlwcm91dGUvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI0YTg2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmgKQEAgLTAsMCArMSw5MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaWZuZGVmIFVUSUxTX0gKKyNkZWZpbmUgVVRJTFNfSCAxCisKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisjaW5jbHVkZSAibGxfbWFwLmgiCisjaW5jbHVkZSAicnRtX21hcC5oIgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworZXh0ZXJuIGZhbWlseV90IHByZWZlcnJlZF9mYW1pbHk7CitleHRlcm4gc21hbGxpbnQgc2hvd19zdGF0czsgICAgLyogVU5VU0VEICovCitleHRlcm4gc21hbGxpbnQgc2hvd19kZXRhaWxzOyAgLyogVU5VU0VEICovCitleHRlcm4gc21hbGxpbnQgc2hvd19yYXc7ICAgICAgLyogVU5VU0VEICovCitleHRlcm4gc21hbGxpbnQgcmVzb2x2ZV9ob3N0czsgLyogVU5VU0VEICovCitleHRlcm4gc21hbGxpbnQgb25lbGluZTsKK2V4dGVybiBjaGFyIF9TTF87CisKKyNpZm5kZWYgSVBQUk9UT19FU1AKKyNkZWZpbmUgSVBQUk9UT19FU1AgIDUwCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19BSAorI2RlZmluZSBJUFBST1RPX0FIICA1MQorI2VuZGlmCisKKyNkZWZpbmUgU1BSSU5UX0JTSVpFIDY0CisjZGVmaW5lIFNQUklOVF9CVUYoeCkgIGNoYXIgeFtTUFJJTlRfQlNJWkVdCisKK2V4dGVybiB2b2lkIGluY29tcGxldGVfY29tbWFuZCh2b2lkKSBOT1JFVFVSTjsKKworI2RlZmluZSBORVhUX0FSRygpIGRvIHsgaWYgKCEqKythcmd2KSBpbmNvbXBsZXRlX2NvbW1hbmQoKTsgfSB3aGlsZSAoMCkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZmFtaWx5OworCXVpbnQ4X3QgYnl0ZWxlbjsKKwlpbnQxNl90IGJpdGxlbjsKKwl1aW50MzJfdCBkYXRhWzRdOworfSBpbmV0X3ByZWZpeDsKKworI2RlZmluZSBQUkVGSVhMRU5fU1BFQ0lGSUVEIDEKKworI2RlZmluZSBETl9NQVhBRERMIDIwCisjaWZuZGVmIEFGX0RFQ25ldAorI2RlZmluZSBBRl9ERUNuZXQgMTIKKyNlbmRpZgorCitzdHJ1Y3QgZG5fbmFkZHIgeworCXVuc2lnbmVkIHNob3J0IGFfbGVuOworCXVuc2lnbmVkIGNoYXIgIGFfYWRkcltETl9NQVhBRERMXTsKK307CisKKyNkZWZpbmUgSVBYX05PREVfTEVOIDYKKworc3RydWN0IGlweF9hZGRyIHsKKwl1aW50MzJfdCBpcHhfbmV0OworCXVpbnQ4X3QgIGlweF9ub2RlW0lQWF9OT0RFX0xFTl07Cit9OworCitleHRlcm4gdWludDMyX3QgZ2V0X2FkZHIzMihjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQgZ2V0X2FkZHJfMShpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpOworLypleHRlcm4gdm9pZCBnZXRfcHJlZml4XzEoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KTsqLworZXh0ZXJuIGludCBnZXRfYWRkcihpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpOworZXh0ZXJuIHZvaWQgZ2V0X3ByZWZpeChpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpOworCitleHRlcm4gdW5zaWduZWQgZ2V0X3Vuc2lnbmVkKGNoYXIgKmFyZywgY29uc3QgY2hhciAqZXJybXNnKTsKK2V4dGVybiB1aW50MzJfdCBnZXRfdTMyKGNoYXIgKmFyZywgY29uc3QgY2hhciAqZXJybXNnKTsKK2V4dGVybiB1aW50MTZfdCBnZXRfdTE2KGNoYXIgKmFyZywgY29uc3QgY2hhciAqZXJybXNnKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnJ0X2FkZHJfbjJhKGludCBhZiwgdm9pZCAqYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKyNpZmRlZiBSRVNPTFZFX0hPU1ROQU1FUworZXh0ZXJuIGNvbnN0IGNoYXIgKmZvcm1hdF9ob3N0KGludCBhZiwgaW50IGxlbiwgdm9pZCAqYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKyNlbHNlCisjZGVmaW5lIGZvcm1hdF9ob3N0KGFmLCBsZW4sIGFkZHIsIGJ1ZiwgYnVmbGVuKSBcCisJcnRfYWRkcl9uMmEoYWYsIGFkZHIsIGJ1ZiwgYnVmbGVuKQorI2VuZGlmCisKK3ZvaWQgaW52YXJnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBOT1JFVFVSTjsKK3ZvaWQgZHVwYXJnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBOT1JFVFVSTjsKK3ZvaWQgZHVwYXJnMihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgTk9SRVRVUk47CitpbnQgaW5ldF9hZGRyX21hdGNoKGNvbnN0IGluZXRfcHJlZml4ICphLCBjb25zdCBpbmV0X3ByZWZpeCAqYiwgaW50IGJpdHMpOworCitjb25zdCBjaGFyICpkbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICphZGRyLCBjaGFyICpzdHIsIHNpemVfdCBsZW4pOworaW50IGRuZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqYWRkcik7CisKK2NvbnN0IGNoYXIgKmlweF9udG9wKGludCBhZiwgY29uc3Qgdm9pZCAqYWRkciwgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK2ludCBpcHhfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqYWRkcik7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9uYW1laWYuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbmFtZWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3ZThmOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbmFtZWlmLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG5hbWVpZi5jIC0gTmFtaW5nIEludGVyZmFjZXMgYmFzZWQgb24gTUFDIGFkZHJlc3MgZm9yIGJ1c3lib3guCisgKgorICogV3JpdHRlbiAyMDAwIGJ5IEFuZGkgS2xlZW4uCisgKiBCdXN5Ym94IHBvcnQgMjAwMiBieSBOaWNrIEZlZGNoaWsgPG5pY2tAZmVkY2hpay5vcmcudWE+CisgKgkJCUdsZW5uIE1jR3JhdGgKKyAqIEV4dGVuZGVkIG1hdGNoaW5nIHN1cHBvcnQgMjAwOCBieSBOaWNvIEVyZnVydGggPG1hc3RhQHBlcmxnb2xmLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIE5BTUVJRgorLy9jb25maWc6CWJvb2wgIm5hbWVpZiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOglzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBuYW1laWYgaXMgdXNlZCB0byByZW5hbWUgbmV0d29yayBpbnRlcmZhY2UgYnkgaXRzIE1BQyBhZGRyZXNzLgorLy9jb25maWc6CSAgUmVuYW1lZCBpbnRlcmZhY2VzIE1VU1QgYmUgaW4gdGhlIGRvd24gc3RhdGUuCisvL2NvbmZpZzoJICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgYSBmaWxlIChkZWZhdWx0OiAvZXRjL21hY3RhYikKKy8vY29uZmlnOgkgIHdpdGggbGlzdCBvZiBuZXcgaW50ZXJmYWNlIG5hbWVzIGFuZCBNQUNzLgorLy9jb25maWc6CSAgTWF4aW11bSBpbnRlcmZhY2UgbmFtZSBsZW5ndGg6IElGTkFNU0laID0gMTYKKy8vY29uZmlnOgkgIEZpbGUgZmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2Ugb3IgdGFiLgorLy9jb25maWc6CSAgRmlsZSBmb3JtYXQ6CisvL2NvbmZpZzoJICAjIENvbW1lbnQKKy8vY29uZmlnOgkgIG5ld19pbnRlcmZhY2VfbmFtZSAgICBYWDpYWDpYWDpYWDpYWDpYWAorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKy8vY29uZmlnOglib29sICJFeHRlbmRlZCBuYW1laWYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBOQU1FSUYKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIGV4dGVuZHMgdGhlIG5hbWVpZiBzeW50YXggdG8gc3VwcG9ydCB0aGUgYnVzX2luZm8sIGRyaXZlciwKKy8vY29uZmlnOgkgIHBoeWFkZHIgc2VsZWN0b3JzLiBUaGUgc3ludGF4IGlzIGNvbXBhdGlibGUgdG8gdGhlIG5vcm1hbCBuYW1laWYuCisvL2NvbmZpZzoJICBGaWxlIGZvcm1hdDoKKy8vY29uZmlnOgkgICAgbmV3X2ludGVyZmFjZV9uYW1lICBkcml2ZXI9YXNpeCBidXM9dXNiLTAwMDA6MDA6MDguMi0zCisvL2NvbmZpZzoJICAgIG5ld19pbnRlcmZhY2VfbmFtZSAgYnVzPXVzYi0wMDAwOjAwOjA4LjItMyAwMDo4MDpDODozODo5MTpCNQorLy9jb25maWc6CSAgICBuZXdfaW50ZXJmYWNlX25hbWUgIHBoeV9hZGRyZXNzPTIgMDA6ODA6Qzg6Mzg6OTE6QjUKKy8vY29uZmlnOgkgICAgbmV3X2ludGVyZmFjZV9uYW1lICBtYWM9MDA6ODA6Qzg6Mzg6OTE6QjUKKy8vY29uZmlnOgkgICAgbmV3X2ludGVyZmFjZV9uYW1lICAwMDo4MDpDODozODo5MTpCNQorCisvL3VzYWdlOiNkZWZpbmUgbmFtZWlmX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCgKKy8vdXNhZ2U6CQkiWy1zXSBbLWMgRklMRV0gW0lGTkFNRSBIV0FERFJdLi4uIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQoCisvL3VzYWdlOgkJIlstc10gWy1jIEZJTEVdIFtJRk5BTUUgU0VMRUNUT1JdLi4uIgorLy91c2FnZToJKQorLy91c2FnZTojZGVmaW5lIG5hbWVpZl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIlJlbmFtZSBuZXR3b3JrIGludGVyZmFjZSB3aGlsZSBpdCBpbiB0aGUgZG93biBzdGF0ZS4iCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQoCisvL3VzYWdlOiAgICAgIlxuVGhlIGRldmljZSB3aXRoIGFkZHJlc3MgSFdBRERSIGlzIHJlbmFtZWQgdG8gSUZBQ0UuIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQoCisvL3VzYWdlOiAgICAgIlxuVGhlIGRldmljZSBtYXRjaGVkIGJ5IFNFTEVDVE9SIGlzIHJlbmFtZWQgdG8gSUZBQ0UuIgorLy91c2FnZTogICAgICJcblNFTEVDVE9SIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mOiIKKy8vdXNhZ2U6ICAgICAiXG4JZHJpdmVyPVNUUklORyIKKy8vdXNhZ2U6ICAgICAiXG4JYnVzPVNUUklORyIKKy8vdXNhZ2U6ICAgICAiXG4JcGh5X2FkZHJlc3M9TlVNIgorLy91c2FnZTogICAgICJcbglbbWFjPV1YWDpYWDpYWDpYWDpYWDpYWCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jIEZJTEUJQ29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0OiAvZXRjL21hY3RhYikiCisvL3VzYWdlOiAgICAgIlxuCS1zCUxvZyB0byBzeXNsb2ciCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG5hbWVpZl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBuYW1laWYgLXMgZG16MCAwMDpBMDpDOTo4QzpGNjozRlxuIgorLy91c2FnZTogICAgICAgIiBvclxuIgorLy91c2FnZTogICAgICAgIiQgbmFtZWlmIC1jIC9ldGMvbXlfbWFjdGFiX2ZpbGVcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2lmbmRlZiBJRk5BTVNJWgorI2RlZmluZSBJRk5BTVNJWiAxNgorI2VuZGlmCisKKy8qIFRha2VuIGZyb20gbGludXgvc29ja2lvcy5oICovCisjZGVmaW5lIFNJT0NTSUZOQU1FICAweDg5MjMgIC8qIHNldCBpbnRlcmZhY2UgbmFtZSAqLworCisvKiBPY3RldHMgaW4gb25lIEV0aGVybmV0IGFkZHIsIGZyb20gPGxpbnV4L2lmX2V0aGVyLmg+ICovCisjZGVmaW5lIEVUSF9BTEVOICAgICA2CisKKyNpZm5kZWYgaWZyX25ld25hbWUKKyNkZWZpbmUgaWZyX25ld25hbWUgaWZyX2lmcnUuaWZydV9zbGF2ZQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGV0aHRhYmxlX3MgeworCXN0cnVjdCBldGh0YWJsZV9zICpuZXh0OworCXN0cnVjdCBldGh0YWJsZV9zICpwcmV2OworCWNoYXIgKmlmbmFtZTsKKwlzdHJ1Y3QgZXRoZXJfYWRkciAqbWFjOworI2lmIEVOQUJMRV9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRAorCWNoYXIgKmJ1c19pbmZvOworCWNoYXIgKmRyaXZlcjsKKwlpbnQzMl90IHBoeV9hZGRyZXNzOworI2VuZGlmCit9IGV0aHRhYmxlX3Q7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKy8qIEN1dCduJ3Bhc3RlIGZyb20gZXRodG9vbC5oICovCisjZGVmaW5lIEVUSFRPT0xfQlVTSU5GT19MRU4gMzIKKy8qIHRoZXNlIHN0cmluZ3MgYXJlIHNldCB0byB3aGF0ZXZlciB0aGUgZHJpdmVyIGF1dGhvciBkZWNpZGVzLi4uICovCitzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIHsKKwl1aW50MzJfdCBjbWQ7CisJY2hhciAgZHJpdmVyWzMyXTsgLyogZHJpdmVyIHNob3J0IG5hbWUsICJ0dWxpcCIsICJlZXBybzEwMCIgKi8KKwljaGFyICB2ZXJzaW9uWzMyXTsgIC8qIGRyaXZlciB2ZXJzaW9uIHN0cmluZyAqLworCWNoYXIgIGZ3X3ZlcnNpb25bMzJdOyAvKiBmaXJtd2FyZSB2ZXJzaW9uIHN0cmluZywgaWYgYXBwbGljYWJsZSAqLworCWNoYXIgIGJ1c19pbmZvW0VUSFRPT0xfQlVTSU5GT19MRU5dOyAgLyogQnVzIGluZm8gZm9yIHRoaXMgSUYuICovCisJLyogRm9yIFBDSSBkZXZpY2VzLCB1c2UgcGNpX2Rldi0+c2xvdF9uYW1lLiAqLworCWNoYXIgIHJlc2VydmVkMVszMl07CisJY2hhciAgcmVzZXJ2ZWQyWzE2XTsKKwl1aW50MzJfdCBuX3N0YXRzOyAgLyogbnVtYmVyIG9mIHU2NCdzIGZyb20gRVRIVE9PTF9HU1RBVFMgKi8KKwl1aW50MzJfdCB0ZXN0aW5mb19sZW47CisJdWludDMyX3QgZWVkdW1wX2xlbjsgLyogU2l6ZSBvZiBkYXRhIGZyb20gRVRIVE9PTF9HRUVQUk9NIChieXRlcykgKi8KKwl1aW50MzJfdCByZWdkdW1wX2xlbjsgIC8qIFNpemUgb2YgZGF0YSBmcm9tIEVUSFRPT0xfR1JFR1MgKGJ5dGVzKSAqLworfTsKKworc3RydWN0IGV0aHRvb2xfY21kIHsKKwl1aW50MzJfdCAgIGNtZDsKKwl1aW50MzJfdCAgIHN1cHBvcnRlZDsgICAgICAvKiBGZWF0dXJlcyB0aGlzIGludGVyZmFjZSBzdXBwb3J0cyAqLworCXVpbnQzMl90ICAgYWR2ZXJ0aXNpbmc7ICAgIC8qIEZlYXR1cmVzIHRoaXMgaW50ZXJmYWNlIGFkdmVydGlzZXMgKi8KKwl1aW50MTZfdCAgIHNwZWVkOyAgICAgICAgICAvKiBUaGUgZm9yY2VkIHNwZWVkLCAxME1iLCAxMDBNYiwgZ2lnYWJpdCAqLworCXVpbnQ4X3QgICAgZHVwbGV4OyAgICAgICAgIC8qIER1cGxleCwgaGFsZiBvciBmdWxsICovCisJdWludDhfdCAgICBwb3J0OyAgICAgICAgICAgLyogV2hpY2ggY29ubmVjdG9yIHBvcnQgKi8KKwl1aW50OF90ICAgIHBoeV9hZGRyZXNzOworCXVpbnQ4X3QgICAgdHJhbnNjZWl2ZXI7ICAgIC8qIFdoaWNoIHRyYW5zY2VpdmVyIHRvIHVzZSAqLworCXVpbnQ4X3QgICAgYXV0b25lZzsgICAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9uZWdvdGlhdGlvbiAqLworCXVpbnQzMl90ICAgbWF4dHhwa3Q7ICAgICAgIC8qIFR4IHBrdHMgYmVmb3JlIGdlbmVyYXRpbmcgdHggaW50ICovCisJdWludDMyX3QgICBtYXhyeHBrdDsgICAgICAgLyogUnggcGt0cyBiZWZvcmUgZ2VuZXJhdGluZyByeCBpbnQgKi8KKwl1aW50MTZfdCAgIHNwZWVkX2hpOworCXVpbnQxNl90ICAgcmVzZXJ2ZWQyOworCXVpbnQzMl90ICAgcmVzZXJ2ZWRbM107Cit9OworCisjZGVmaW5lIEVUSFRPT0xfR1NFVCAgICAgIDB4MDAwMDAwMDEgLyogR2V0IHNldHRpbmdzLiAqLworI2RlZmluZSBFVEhUT09MX0dEUlZJTkZPICAweDAwMDAwMDAzIC8qIEdldCBkcml2ZXIgaW5mby4gKi8KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIG5hbWVpZl9wYXJzZV9zZWxlY3RvcihldGh0YWJsZV90ICpjaCwgY2hhciAqc2VsZWN0b3IpCit7CisJc3RydWN0IGV0aGVyX2FkZHIgKmxtYWM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJaW50IGZvdW5kX3NlbGVjdG9yID0gMDsKKworCXdoaWxlICgqc2VsZWN0b3IpIHsKKwkJY2hhciAqbmV4dDsKKyNlbmRpZgorCQlzZWxlY3RvciA9IHNraXBfd2hpdGVzcGFjZShzZWxlY3Rvcik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJCWNoLT5waHlfYWRkcmVzcyA9IC0xOworCQlpZiAoKnNlbGVjdG9yID09ICdcMCcpCisJCQlicmVhazsKKwkJLyogU2VhcmNoIGZvciB0aGUgZW5kIC4uLi4gKi8KKwkJbmV4dCA9IHNraXBfbm9uX3doaXRlc3BhY2Uoc2VsZWN0b3IpOworCQlpZiAoKm5leHQpCisJCQkqbmV4dCsrID0gJ1wwJzsKKwkJLyogQ2hlY2sgZm9yIHNlbGVjdG9ycywgbWFjPSBpcyBhc3N1bWVkICovCisJCWlmIChzdHJuY21wKHNlbGVjdG9yLCAiYnVzPSIsIDQpID09IDApIHsKKwkJCWNoLT5idXNfaW5mbyA9IHhzdHJkdXAoc2VsZWN0b3IgKyA0KTsKKwkJCWZvdW5kX3NlbGVjdG9yKys7CisJCX0gZWxzZSBpZiAoc3RybmNtcChzZWxlY3RvciwgImRyaXZlcj0iLCA3KSA9PSAwKSB7CisJCQljaC0+ZHJpdmVyID0geHN0cmR1cChzZWxlY3RvciArIDcpOworCQkJZm91bmRfc2VsZWN0b3IrKzsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHNlbGVjdG9yLCAicGh5YWRkcj0iLCA4KSA9PSAwKSB7CisJCQljaC0+cGh5X2FkZHJlc3MgPSB4YXRvaV9wb3NpdGl2ZShzZWxlY3RvciArIDgpOworCQkJZm91bmRfc2VsZWN0b3IrKzsKKwkJfSBlbHNlIHsKKyNlbmRpZgorCQkJbG1hYyA9IHhtYWxsb2MoRVRIX0FMRU4pOworCQkJY2gtPm1hYyA9IGV0aGVyX2F0b25fcihzZWxlY3RvciArIChzdHJuY21wKHNlbGVjdG9yLCAibWFjPSIsIDQpICE9IDAgPyAwIDogNCksIGxtYWMpOworCQkJaWYgKGNoLT5tYWMgPT0gTlVMTCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcGFyc2UgJXMiLCBzZWxlY3Rvcik7CisjaWYgIEVOQUJMRV9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRAorCQkJZm91bmRfc2VsZWN0b3IrKzsKKwkJfTsKKwkJc2VsZWN0b3IgPSBuZXh0OworCX0KKwlpZiAoZm91bmRfc2VsZWN0b3IgPT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHNlbGVjdG9ycyBmb3VuZCBmb3IgJXMiLCBjaC0+aWZuYW1lKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwcmVwZW5kX25ld19ldGhfdGFibGUoZXRodGFibGVfdCAqKmNsaXN0LCBjaGFyICppZm5hbWUsIGNoYXIgKnNlbGVjdG9yKQoreworCWV0aHRhYmxlX3QgKmNoOworCWlmIChzdHJsZW4oaWZuYW1lKSA+PSBJRk5BTVNJWikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludGVyZmFjZSBuYW1lICclcycgdG9vIGxvbmciLCBpZm5hbWUpOworCWNoID0geHphbGxvYyhzaXplb2YoKmNoKSk7CisJY2gtPmlmbmFtZSA9IHhzdHJkdXAoaWZuYW1lKTsKKwluYW1laWZfcGFyc2Vfc2VsZWN0b3IoY2gsIHNlbGVjdG9yKTsKKwljaC0+bmV4dCA9ICpjbGlzdDsKKwlpZiAoKmNsaXN0KQorCQkoKmNsaXN0KS0+cHJldiA9IGNoOworCSpjbGlzdCA9IGNoOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKK3N0YXRpYyB2b2lkIGRlbGV0ZV9ldGhfdGFibGUoZXRodGFibGVfdCAqY2gpCit7CisJZnJlZShjaC0+aWZuYW1lKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKwlmcmVlKGNoLT5idXNfaW5mbyk7CisJZnJlZShjaC0+ZHJpdmVyKTsKKyNlbmRpZgorCWZyZWUoY2gtPm1hYyk7CisJZnJlZShjaCk7Cit9OworI2Vsc2UKK3ZvaWQgZGVsZXRlX2V0aF90YWJsZShldGh0YWJsZV90ICpjaCk7CisjZW5kaWYKKworaW50IG5hbWVpZl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbmFtZWlmX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlldGh0YWJsZV90ICpjbGlzdCA9IE5VTEw7CisJY29uc3QgY2hhciAqZm5hbWUgPSAiL2V0Yy9tYWN0YWIiOworCWludCBjdGxfc2s7CisJZXRodGFibGVfdCAqY2g7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljaGFyICp0b2tlblsyXTsKKworCWlmICgxICYgZ2V0b3B0MzIoYXJndiwgInNjOiIsICZmbmFtZSkpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0xPQ0FMMCk7CisJCS8qIFdoeSBub3QganVzdCAiPSI/IEkgYXNzdW1lIGxvZ2dpbmcgdG8gc3RkZXJyCisJCSAqIGNhbid0IGh1cnQuIDI+L2Rldi9udWxsIGlmIHlvdSBkb24ndCBsaWtlIGl0OiAqLworCQlsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworCX0KKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzBdKSB7CisJCWRvIHsKKwkJCWlmICghYXJndlsxXSkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlwcmVwZW5kX25ld19ldGhfdGFibGUoJmNsaXN0LCBhcmd2WzBdLCBhcmd2WzFdKTsKKwkJCWFyZ3YgKz0gMjsKKwkJfSB3aGlsZSAoKmFyZ3YpOworCX0gZWxzZSB7CisJCXBhcnNlciA9IGNvbmZpZ19vcGVuKGZuYW1lKTsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDIsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkKKwkJCXByZXBlbmRfbmV3X2V0aF90YWJsZSgmY2xpc3QsIHRva2VuWzBdLCB0b2tlblsxXSk7CisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX0KKworCWN0bF9zayA9IHhzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvcHJvYy9uZXQvZGV2IiwgeGZvcGVuX2Zvcl9yZWFkKTsKKworCXdoaWxlIChjbGlzdCAmJiBjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiXDA6IFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlzdHJ1Y3QgaWZyZXEgaWZyOworI2lmICBFTkFCTEVfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKwkJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyBkcnZpbmZvOworCQlzdHJ1Y3QgZXRodG9vbF9jbWQgZXRoX3NldHRpbmdzOworI2VuZGlmCisJCWlmIChwYXJzZXItPmxpbmVubyA8PSAyKQorCQkJY29udGludWU7IC8qIFNraXAgdGhlIGZpcnN0IHR3byBsaW5lcyAqLworCisJCS8qIEZpbmQgdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG5hbWUgYW5kIGNvcHkgaXQgdG8gaWZyLmlmcl9uYW1lICovCisJCW1lbXNldCgmaWZyLCAwLCBzaXplb2Yoc3RydWN0IGlmcmVxKSk7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCB0b2tlblswXSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKwkJLyogQ2hlY2sgZm9yIHBoeSBhZGRyZXNzICovCisJCW1lbXNldCgmZXRoX3NldHRpbmdzLCAwLCBzaXplb2YoZXRoX3NldHRpbmdzKSk7CisJCWV0aF9zZXR0aW5ncy5jbWQgPSBFVEhUT09MX0dTRVQ7CisJCWlmci5pZnJfZGF0YSA9IChjYWRkcl90KSAmZXRoX3NldHRpbmdzOworCQlpb2N0bChjdGxfc2ssIFNJT0NFVEhUT09MLCAmaWZyKTsKKworCQkvKiBDaGVjayBmb3IgZHJpdmVyIGV0Yy4gKi8KKwkJbWVtc2V0KCZkcnZpbmZvLCAwLCBzaXplb2YoZHJ2aW5mbykpOworCQlkcnZpbmZvLmNtZCA9IEVUSFRPT0xfR0RSVklORk87CisJCWlmci5pZnJfZGF0YSA9IChjYWRkcl90KSAmZHJ2aW5mbzsKKwkJLyogR2V0IGRyaXZlciBhbmQgYnVzaW5mbyBmaXJzdCwgc28gd2UgaGF2ZSBpdCBpbiBkcnZpbmZvICovCisJCWlvY3RsKGN0bF9zaywgU0lPQ0VUSFRPT0wsICZpZnIpOworI2VuZGlmCisJCWlvY3RsKGN0bF9zaywgU0lPQ0dJRkhXQUREUiwgJmlmcik7CisKKwkJLyogU2VhcmNoIHRoZSBsaXN0IGZvciBhIG1hdGNoaW5nIGRldmljZSAqLworCQlmb3IgKGNoID0gY2xpc3Q7IGNoOyBjaCA9IGNoLT5uZXh0KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJCQlpZiAoY2gtPmJ1c19pbmZvICYmIHN0cmNtcChjaC0+YnVzX2luZm8sIGRydmluZm8uYnVzX2luZm8pICE9IDApCisJCQkJY29udGludWU7CisJCQlpZiAoY2gtPmRyaXZlciAmJiBzdHJjbXAoY2gtPmRyaXZlciwgZHJ2aW5mby5kcml2ZXIpICE9IDApCisJCQkJY29udGludWU7CisJCQlpZiAoY2gtPnBoeV9hZGRyZXNzICE9IC0xICYmIGNoLT5waHlfYWRkcmVzcyAhPSBldGhfc2V0dGluZ3MucGh5X2FkZHJlc3MpCisJCQkJY29udGludWU7CisjZW5kaWYKKwkJCWlmIChjaC0+bWFjICYmIG1lbWNtcChjaC0+bWFjLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBFVEhfQUxFTikgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCS8qIGlmIHdlIGNhbWUgaGVyZSwgYWxsIHNlbGVjdG9ycyBoYXZlIG1hdGNoZWQgKi8KKwkJCWJyZWFrOworCQl9CisJCS8qIE5vdGhpbmcgZm91bmQgZm9yIGN1cnJlbnQgaW50ZXJmYWNlICovCisJCWlmICghY2gpCisJCQljb250aW51ZTsKKworCQlpZiAoc3RyY21wKGlmci5pZnJfbmFtZSwgY2gtPmlmbmFtZSkgIT0gMCkgeworCQkJc3RyY3B5KGlmci5pZnJfbmV3bmFtZSwgY2gtPmlmbmFtZSk7CisJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShjdGxfc2ssIFNJT0NTSUZOQU1FLCAmaWZyLAorCQkJCQkiY2FuJ3QgY2hhbmdlIGlmbmFtZSAlcyB0byAlcyIsCisJCQkJCWlmci5pZnJfbmFtZSwgY2gtPmlmbmFtZSk7CisJCX0KKwkJLyogUmVtb3ZlIGxpc3QgZW50cnkgb2YgcmVuYW1lZCBpbnRlcmZhY2UgKi8KKwkJaWYgKGNoLT5wcmV2ICE9IE5VTEwpCisJCQljaC0+cHJldi0+bmV4dCA9IGNoLT5uZXh0OworCQllbHNlCisJCQljbGlzdCA9IGNoLT5uZXh0OworCQlpZiAoY2gtPm5leHQgIT0gTlVMTCkKKwkJCWNoLT5uZXh0LT5wcmV2ID0gY2gtPnByZXY7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWRlbGV0ZV9ldGhfdGFibGUoY2gpOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZm9yIChjaCA9IGNsaXN0OyBjaDsgY2ggPSBjaC0+bmV4dCkKKwkJCWRlbGV0ZV9ldGhfdGFibGUoY2gpOworCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9OworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL25iZC1jbGllbnQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbmJkLWNsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGRhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL25iZC1jbGllbnQuYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisvL2FwcGxldDpJRl9OQkRDTElFTlQoQVBQTEVUX09ERE5BTUUobmJkLWNsaWVudCwgbmJkY2xpZW50LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgbmJkY2xpZW50KSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX05CRENMSUVOVCkgKz0gbmJkLWNsaWVudC5vCisKKy8vY29uZmlnOmNvbmZpZyBOQkRDTElFTlQKKy8vY29uZmlnOglib29sICJuYmQtY2xpZW50IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE5ldHdvcmsgYmxvY2sgZGV2aWNlIGNsaWVudAorCisjZGVmaW5lIE5CRF9TRVRfU09DSyAgICAgICAgICBfSU8oMHhhYiwgMCkKKyNkZWZpbmUgTkJEX1NFVF9CTEtTSVpFICAgICAgIF9JTygweGFiLCAxKQorI2RlZmluZSBOQkRfU0VUX1NJWkUgICAgICAgICAgX0lPKDB4YWIsIDIpCisjZGVmaW5lIE5CRF9ET19JVCAgICAgICAgICAgICBfSU8oMHhhYiwgMykKKyNkZWZpbmUgTkJEX0NMRUFSX1NPQ0sgICAgICAgIF9JTygweGFiLCA0KQorI2RlZmluZSBOQkRfQ0xFQVJfUVVFVUUgICAgICAgX0lPKDB4YWIsIDUpCisjZGVmaW5lIE5CRF9QUklOVF9ERUJVRyAgICAgICBfSU8oMHhhYiwgNikKKyNkZWZpbmUgTkJEX1NFVF9TSVpFX0JMT0NLUyAgIF9JTygweGFiLCA3KQorI2RlZmluZSBOQkRfRElTQ09OTkVDVCAgICAgICAgX0lPKDB4YWIsIDgpCisjZGVmaW5lIE5CRF9TRVRfVElNRU9VVCAgICAgICBfSU8oMHhhYiwgOSkKKworLy91c2FnZTojZGVmaW5lIG5iZGNsaWVudF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiSE9TVCBQT1JUIEJMT0NLREVWIgorLy91c2FnZTojZGVmaW5lIG5iZGNsaWVudF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbm5lY3QgdG8gSE9TVCBhbmQgcHJvdmlkZSBhIG5ldHdvcmsgYmxvY2sgZGV2aWNlIG9uIEJMT0NLREVWIgorCisvL1RPRE86IG1vcmUgY29tcGF0IHdpdGggbmJkLWNsaWVudCB2ZXJzaW9uIDIuOS4xMyAtCisvL1VzYWdlOiBuYmQtY2xpZW50IFticz1ibG9ja3NpemVdIFt0aW1lb3V0PXNlY10gaG9zdCBwb3J0IG5iZF9kZXZpY2UgWy1zd2FwXSBbLXBlcnNpc3RdIFstbm9mb3JrXQorLy9PciAgIDogbmJkLWNsaWVudCAtZCBuYmRfZGV2aWNlCisvL09yICAgOiBuYmQtY2xpZW50IC1jIG5iZF9kZXZpY2UKKy8vRGVmYXVsdCB2YWx1ZSBmb3IgYmxvY2tzaXplIGlzIDEwMjQgKHJlY29tbWVuZGVkIGZvciBldGhlcm5ldCkKKy8vQWxsb3dlZCB2YWx1ZXMgZm9yIGJsb2Nrc2l6ZSBhcmUgNTEyLDEwMjQsMjA0OCw0MDk2CisvL05vdGUsIHRoYXQga2VybmVsIDIuNC4yIGFuZCBvbGRlciBvbmVzIGRvIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoCisvL2Jsb2Nrc2l6ZXMgb3RoZXIgdGhhbiAxMDI0IHdpdGhvdXQgcGF0Y2hlcworCitpbnQgbmJkY2xpZW50X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBuYmRjbGllbnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gMDsKKyNpZiBCQl9NTVUKKwlpbnQgbm9mb3JrID0gMDsKKyNlbmRpZgorCWNoYXIgKmhvc3QsICpwb3J0LCAqZGV2aWNlOworCXN0cnVjdCBuYmRfaGVhZGVyX3QgeworCQl1aW50NjRfdCBtYWdpYzE7IC8vICJOQkRNQUdJQyIKKwkJdWludDY0X3QgbWFnaWMyOyAvLyAweDQyMDI4MTg2MTI1MyBiaWcgZW5kaWFuCisJCXVpbnQ2NF90IGRldnNpemU7CisJCXVpbnQzMl90IGZsYWdzOworCQljaGFyIGRhdGFbMTI0XTsKKwl9IG5iZF9oZWFkZXI7CisJc3RydWN0IGJ1Z19jaGVjayB7CisJCWNoYXIgY1tvZmZzZXRvZihzdHJ1Y3QgbmJkX2hlYWRlcl90LCBkYXRhKSA9PSA4KzgrOCs0ID8gMSA6IC0xXTsKKwl9OworCisJLy8gUGFyc2UgY29tbWFuZCBsaW5lIHN0dWZmIChqdXN0IGEgc3R1YiBub3cpCisJaWYgKGFyZ2MgIT0gNCkKKwkJYmJfc2hvd191c2FnZSgpOworCisjaWYgIUJCX01NVQorCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fQ0xPU0VfRVhUUkFfRkRTLCBhcmd2KTsKKyNlbmRpZgorCisJaG9zdCA9IGFyZ3ZbMV07CisJcG9ydCA9IGFyZ3ZbMl07CisJZGV2aWNlID0gYXJndlszXTsKKworCS8vIFJlcGVhdCB1bnRpbCBzcGFua2VkICgtcGVyc2lzdCBiZWhhdmlvcikKKwlmb3IgKDs7KSB7CisJCWludCBzb2NrLCBuYmQ7CisJCWludCBybzsKKworCQkvLyBNYWtlIHN1cmUgdGhlIC9kZXYvbmJkIGV4aXN0cworCQluYmQgPSB4b3BlbihkZXZpY2UsIE9fUkRXUik7CisKKwkJLy8gRmluZCBhbmQgY29ubmVjdCB0byBzZXJ2ZXIKKwkJc29jayA9IGNyZWF0ZV9hbmRfY29ubmVjdF9zdHJlYW1fb3JfZGllKGhvc3QsIHhhdG91MTYocG9ydCkpOworCQlzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKworCQkvLyBMb2cgb24gdG8gdGhlIHNlcnZlcgorCQl4cmVhZChzb2NrLCAmbmJkX2hlYWRlciwgOCs4KzgrNCArIDEyNCk7CisJCWlmIChtZW1jbXAoJm5iZF9oZWFkZXIubWFnaWMxLCAiTkJETUFHSUMiIlx4MDBceDAwXHg0Mlx4MDJceDgxXHg4Nlx4MTJceDUzIiwgMTYpICE9IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibG9naW4gZmFpbGVkIik7CisKKwkJLy8gU2V0IDRrIGJsb2NrIHNpemUuICBFdmVyeXRoaW5nIHVzZXMgdGhhdCB0aGVzZSBkYXlzCisJCWlvY3RsKG5iZCwgTkJEX1NFVF9CTEtTSVpFLCA0MDk2KTsKKwkJaW9jdGwobmJkLCBOQkRfU0VUX1NJWkVfQkxPQ0tTLCBTV0FQX0JFNjQobmJkX2hlYWRlci5kZXZzaXplKSAvIDQwOTYpOworCQlpb2N0bChuYmQsIE5CRF9DTEVBUl9TT0NLKTsKKworCQkvLyBJZiB0aGUgc3Vja2VyIHdhcyBleHBvcnRlZCByZWFkIG9ubHksIHJlc3BlY3QgdGhhdCBsb2NhbGx5CisJCXJvID0gKG5iZF9oZWFkZXIuZmxhZ3MgJiBTV0FQX0JFMzIoMikpIC8gU1dBUF9CRTMyKDIpOworCQlpZiAoaW9jdGwobmJkLCBCTEtST1NFVCwgJnJvKSA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIkJMS1JPU0VUIik7CisKKwkJaWYgKHRpbWVvdXQpCisJCQlpZiAoaW9jdGwobmJkLCBOQkRfU0VUX1RJTUVPVVQsIHRpbWVvdXQpKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiTkJEX1NFVF9USU1FT1VUIik7CisJCWlmIChpb2N0bChuYmQsIE5CRF9TRVRfU09DSywgc29jaykpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIk5CRF9TRVRfU09DSyIpOworCisJCS8vIGlmIChzd2FwKSBtbG9ja2FsbChNQ0xfQ1VSUkVOVHxNQ0xfRlVUVVJFKTsKKworI2lmIEJCX01NVQorCQkvLyBPcGVuIHRoZSBkZXZpY2UgdG8gZm9yY2UgcmVyZWFkIG9mIHRoZSBwYXJ0aXRpb24gdGFibGUuCisJCS8vIE5lZWQgdG8gZG8gaXQgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzLCBzaW5jZSBvcGVuKGRldmljZSkKKwkJLy8gbmVlZHMgc29tZSBvdGhlciBwcm9jZXNzIHRvIHNpdCBpbiBpb2N0bChuYmQsIE5CRF9ET19JVCkuCisJCWlmIChmb3JrKCkgPT0gMCkgeworCQkJY2hhciAqcyA9IHN0cnJjaHIoZGV2aWNlLCAnLycpOworCQkJc3ByaW50ZihuYmRfaGVhZGVyLmRhdGEsICIvc3lzL2Jsb2NrLyUuMzJzL3BpZCIsIHMgPyBzICsgMSA6IGRldmljZSk7CisJCQkvLyBJcyBpdCB1cCB5ZXQ/CisJCQlmb3IgKDs7KSB7CisJCQkJaW50IGZkID0gb3BlbihuYmRfaGVhZGVyLmRhdGEsIE9fUkRPTkxZKTsKKwkJCQlpZiAoZmQgPj0gMCkgeworCQkJCQkvL2Nsb3NlKGZkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNsZWVwKDEpOworCQkJfQorCQkJb3BlbihkZXZpY2UsIE9fUkRPTkxZKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLy8gRGFlbW9uaXplIGhlcmUKKwkJaWYgKCFub2ZvcmspIHsKKwkJCWRhZW1vbigwLCAwKTsKKwkJCW5vZm9yayA9IDE7CisJCX0KKyNlbmRpZgorCisJCS8vIFRoaXMgdHVybnMgdXMgKHRoZSBwcm9jZXNzIHRoYXQgY2FsbHMgdGhpcyBpb2N0bCkKKwkJLy8gaW50byBhIGRlZGljYXRlZCBOQkQgcmVxdWVzdCBoYW5kbGVyLgorCQkvLyBXZSBibG9jayBoZXJlIGZvciBhIGxvbmcgdGltZS4KKwkJLy8gV2hlbiBleGFjdGx5IGlvY3RsIHJldHVybnM/IE9uIGEgc2lnbmFsLAorCQkvLyBvciBpZiBzb21lb25lIGRvZXMgaW9jdGwoTkJEX0RJU0NPTk5FQ1QpIFtuYmQtY2xpZW50IC1kXS4KKwkJaWYgKGlvY3RsKG5iZCwgTkJEX0RPX0lUKSA+PSAwIHx8IGVycm5vID09IEVCQURSKSB7CisJCQkvLyBGbHVzaCBxdWV1ZSBhbmQgZXhpdAorCQkJaW9jdGwobmJkLCBOQkRfQ0xFQVJfUVVFVUUpOworCQkJaW9jdGwobmJkLCBOQkRfQ0xFQVJfU09DSyk7CisJCQlicmVhazsKKwkJfQorCisJCWNsb3NlKHNvY2spOworCQljbG9zZShuYmQpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9uYy5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9uYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzJlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL25jLmMKQEAgLTAsMCArMSwyNzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogbmM6IG1pbmktbmV0Y2F0IC0gYnVpbHQgZnJvbSB0aGUgZ3JvdW5kIHVwIGZvciBMUlAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgIENoYXJsZXMgUC4gV3JpZ2h0CisgKiBDb3B5cmlnaHQgKEMpIDE5OTggIERhdmUgQ2luZWdlCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLy9jb25maWc6Y29uZmlnIE5DCisvL2NvbmZpZzoJYm9vbCAibmMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQSBzaW1wbGUgVW5peCB1dGlsaXR5IHdoaWNoIHJlYWRzIGFuZCB3cml0ZXMgZGF0YSBhY3Jvc3MgbmV0d29yaworLy9jb25maWc6CSAgY29ubmVjdGlvbnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBOQ19TRVJWRVIKKy8vY29uZmlnOglib29sICJOZXRjYXQgc2VydmVyIG9wdGlvbnMgKC1sKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIE5DCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQWxsb3cgbmV0Y2F0IHRvIGFjdCBhcyBhIHNlcnZlci4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIE5DX0VYVFJBCisvL2NvbmZpZzoJYm9vbCAiTmV0Y2F0IGV4dGVuc2lvbnMgKC1laXcgYW5kIGZpbGVuYW1lKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIE5DCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQWRkIC1lIChzdXBwb3J0IGZvciBleGVjdXRpbmcgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZSBhZnRlcgorLy9jb25maWc6CSAgbWFraW5nIG9yIHJlY2VpdmluZyBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbiksIC1pIChkZWxheSBpbnRlcnZhbCBmb3IKKy8vY29uZmlnOgkgIGxpbmVzIHNlbnQpLCAtdyAodGltZW91dCBmb3IgaW5pdGlhbCBjb25uZWN0aW9uKS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIE5DXzExMF9DT01QQVQKKy8vY29uZmlnOglib29sICJOZXRjYXQgMS4xMCBjb21wYXRpYmlsaXR5ICgrMi41aykiCisvL2NvbmZpZzoJZGVmYXVsdCBuICAjIG9mZiBzcGVjaWFsbHkgZm9yIFJvYgorLy9jb25maWc6CWRlcGVuZHMgb24gTkMKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIG9wdGlvbiBtYWtlcyBuYyBjbG9zZWx5IGZvbGxvdyBvcmlnaW5hbCBuYy0xLjEwLgorLy9jb25maWc6CSAgVGhlIGNvZGUgaXMgYWJvdXQgMi41ayBiaWdnZXIuIEl0IGVuYWJsZXMKKy8vY29uZmlnOgkgIC1zIEFERFIsIC1uLCAtdSwgLXYsIC1vIEZJTEUsIC16IG9wdGlvbnMsIGJ1dCBsb3NlcworLy9jb25maWc6CSAgYnVzeWJveC1zcGVjaWZpYyBleHRlbnNpb25zOiAtZiBGSUxFIGFuZCAtbGwuCisKKyNpZiBFTkFCTEVfTkNfMTEwX0NPTVBBVAorIyBpbmNsdWRlICJuY19ibG9hdHkuYyIKKyNlbHNlCisKKy8vdXNhZ2U6I2lmICFFTkFCTEVfTkNfMTEwX0NPTVBBVAorLy91c2FnZToKKy8vdXNhZ2U6I2lmIEVOQUJMRV9OQ19TRVJWRVIgfHwgRU5BQkxFX05DX0VYVFJBCisvL3VzYWdlOiNkZWZpbmUgTkNfT1BUSU9OU19TVFIgIlxuIgorLy91c2FnZTojZWxzZQorLy91c2FnZTojZGVmaW5lIE5DX09QVElPTlNfU1RSCisvL3VzYWdlOiNlbmRpZgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBuY190cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9OQ19FWFRSQSgiWy1pTl0gWy13Tl0gIilJRl9OQ19TRVJWRVIoIlstbF0gWy1wIFBPUlRdICIpCisvL3VzYWdlOiAgICAgICAiWyJJRl9OQ19FWFRSQSgiLWYgRklMRXwiKSJJUEFERFIgUE9SVF0iSUZfTkNfRVhUUkEoIiBbLWUgUFJPR10iKQorLy91c2FnZTojZGVmaW5lIG5jX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiT3BlbiBhIHBpcGUgdG8gSVA6UE9SVCIgSUZfTkNfRVhUUkEoIiBvciBGSUxFIikKKy8vdXNhZ2U6CU5DX09QVElPTlNfU1RSCisvL3VzYWdlOglJRl9OQ19FWFRSQSgKKy8vdXNhZ2U6ICAgICAiXG4JLWUgUFJPRwlSdW4gUFJPRyBhZnRlciBjb25uZWN0IgorLy91c2FnZToJSUZfTkNfU0VSVkVSKAorLy91c2FnZTogICAgICJcbgktbAlMaXN0ZW4gbW9kZSwgZm9yIGluYm91bmQgY29ubmVjdHMiCisvL3VzYWdlOglJRl9OQ19FWFRSQSgKKy8vdXNhZ2U6ICAgICAiXG4JCSh1c2UgLWwgdHdpY2Ugd2l0aCAtZSBmb3IgcGVyc2lzdGVudCBzZXJ2ZXIpIikKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUE9SVAlMb2NhbCBwb3J0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktdyBTRUMJVGltZW91dCBmb3IgY29ubmVjdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkgU0VDCURlbGF5IGludGVydmFsIGZvciBsaW5lcyBzZW50IgorLy91c2FnZTogICAgICJcbgktZiBGSUxFCVVzZSBmaWxlIChhbGEgL2Rldi90dHlTMCkgaW5zdGVhZCBvZiBuZXR3b3JrIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBuY19ub3Rlc191c2FnZSAiIgorLy91c2FnZToJSUZfTkNfRVhUUkEoCisvL3VzYWdlOiAgICAgICAiVG8gdXNlIG5ldGNhdCBhcyBhIHRlcm1pbmFsIGVtdWxhdG9yIG9uIGEgc2VyaWFsIHBvcnQ6XG5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIHN0dHkgMTE1MjAwIC1GIC9kZXYvdHR5UzBcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHN0dHkgcmF3IC1lY2hvIC1jdGxlY2hvICYmIG5jIC1mIC9kZXYvdHR5UzBcbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbmNfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbmMgZm9vYmFyLnNvbWVkb21haW4uY29tIDI1XG4iCisvL3VzYWdlOiAgICAgICAiMjIwIGZvb2JhciBFU01UUCBFeGltIDMuMTIgIzEgU2F0LCAxNSBBcHIgMjAwMCAwMDowMzowMiAtMDYwMFxuIgorLy91c2FnZTogICAgICAgImhlbHBcbiIKKy8vdXNhZ2U6ICAgICAgICIyMTQtQ29tbWFuZHMgc3VwcG9ydGVkOlxuIgorLy91c2FnZTogICAgICAgIjIxNC0gICAgSEVMTyBFSExPIE1BSUwgUkNQVCBEQVRBIEFVVEhcbiIKKy8vdXNhZ2U6ICAgICAgICIyMTQgICAgIE5PT1AgUVVJVCBSU0VUIEhFTFBcbiIKKy8vdXNhZ2U6ICAgICAgICJxdWl0XG4iCisvL3VzYWdlOiAgICAgICAiMjIxIGZvb2JhciBjbG9zaW5nIGNvbm5lY3Rpb25cbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNlbmRpZgorCisvKiBMb3RzIG9mIHNtYWxsIGRpZmZlcmVuY2VzIGluIGZlYXR1cmVzCisgKiB3aGVuIGNvbXBhcmVkIHRvICJzdGFuZGFyZCIgbmMKKyAqLworCitzdGF0aWMgdm9pZCB0aW1lb3V0KGludCBzaWdudW0gVU5VU0VEX1BBUkFNKQoreworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0aW1lZCBvdXQiKTsKK30KKworaW50IG5jX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBuY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvKiBzZmQgc2l0cyBfaGVyZV8gb25seSBiZWNhdXNlIG9mICJyZXBlYXQiIG9wdGlvbiAoLWwgLWwpLiAqLworCWludCBzZmQgPSBzZmQ7IC8qIGZvciBnY2MgKi8KKwlpbnQgY2ZkID0gMDsKKwl1bnNpZ25lZCBscG9ydCA9IDA7CisJSUZfTk9UX05DX1NFUlZFUihjb25zdCkgdW5zaWduZWQgZG9fbGlzdGVuID0gMDsKKwlJRl9OT1RfTkNfRVhUUkEgKGNvbnN0KSB1bnNpZ25lZCB3c2VjcyA9IDA7CisJSUZfTk9UX05DX0VYVFJBIChjb25zdCkgdW5zaWduZWQgZGVsYXkgPSAwOworCUlGX05PVF9OQ19FWFRSQSAoY29uc3QgaW50IGV4ZWNwYXJhbSA9IDA7KQorCUlGX05DX0VYVFJBICAgICAoY2hhciAqKmV4ZWNwYXJhbSA9IE5VTEw7KQorCWZkX3NldCByZWFkZmRzLCB0ZXN0ZmRzOworCWludCBvcHQ7IC8qIG11c3QgYmUgc2lnbmVkIChnZXRvcHQgcmV0dXJucyAtMSkgKi8KKworCWlmIChFTkFCTEVfTkNfU0VSVkVSIHx8IEVOQUJMRV9OQ19FWFRSQSkgeworCQkvKiBnZXRvcHQzMiBpcyBfYWxtb3N0XyB1c2FibGU6CisJCSoqIGl0IGNhbm5vdCBoYW5kbGUgIi4uLiAtZSBQUk9HIC1wcm9nLW9wdCIgKi8KKwkJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwKKwkJICAgICAgICAiIiBJRl9OQ19TRVJWRVIoImxwOiIpIElGX05DX0VYVFJBKCJ3Omk6ZjplOiIpICkpID4gMAorCQkpIHsKKwkJCWlmIChFTkFCTEVfTkNfU0VSVkVSICYmIG9wdCA9PSAnbCcpCisJCQkJSUZfTkNfU0VSVkVSKGRvX2xpc3RlbisrKTsKKwkJCWVsc2UgaWYgKEVOQUJMRV9OQ19TRVJWRVIgJiYgb3B0ID09ICdwJykKKwkJCQlJRl9OQ19TRVJWRVIobHBvcnQgPSBiYl9sb29rdXBfcG9ydChvcHRhcmcsICJ0Y3AiLCAwKSk7CisJCQllbHNlIGlmIChFTkFCTEVfTkNfRVhUUkEgJiYgb3B0ID09ICd3JykKKwkJCQlJRl9OQ19FWFRSQSggd3NlY3MgPSB4YXRvdShvcHRhcmcpKTsKKwkJCWVsc2UgaWYgKEVOQUJMRV9OQ19FWFRSQSAmJiBvcHQgPT0gJ2knKQorCQkJCUlGX05DX0VYVFJBKCBkZWxheSA9IHhhdG91KG9wdGFyZykpOworCQkJZWxzZSBpZiAoRU5BQkxFX05DX0VYVFJBICYmIG9wdCA9PSAnZicpCisJCQkJSUZfTkNfRVhUUkEoIGNmZCA9IHhvcGVuKG9wdGFyZywgT19SRFdSKSk7CisJCQllbHNlIGlmIChFTkFCTEVfTkNfRVhUUkEgJiYgb3B0ID09ICdlJyAmJiBvcHRpbmQgPD0gYXJnYykgeworCQkJCS8qIFdlIGNhbm5vdCBqdXN0ICdicmVhaycuIFdlIHNob3VsZCBsZXQgZ2V0b3B0IGZpbmlzaC4KKwkJCQkqKiBPciBlbHNlIHdlIHdvbid0IGJlIGFibGUgdG8gZmluZCB3aGVyZQorCQkJCSoqICdob3N0JyBhbmQgJ3BvcnQnIHBhcmFtcyBhcmUKKwkJCQkqKiAodGhpbmsgIm5jIC13IDYwIGhvc3QgcG9ydCAtZSBQUk9HIikuICovCisJCQkJSUZfTkNfRVhUUkEoCisJCQkJCWNoYXIgKipwOworCQkJCQkvLyArMjogb25lIGZvciBwcm9nbmFtZSAob3B0YXJnKSBhbmQgb25lIGZvciBOVUxMCisJCQkJCWV4ZWNwYXJhbSA9IHh6YWxsb2Moc2l6ZW9mKGNoYXIqKSAqIChhcmdjIC0gb3B0aW5kICsgMikpOworCQkJCQlwID0gZXhlY3BhcmFtOworCQkJCQkqcCsrID0gb3B0YXJnOworCQkJCQl3aGlsZSAob3B0aW5kIDwgYXJnYykgeworCQkJCQkJKnArKyA9IGFyZ3Zbb3B0aW5kKytdOworCQkJCQl9CisJCQkJKQorCQkJCS8qIG9wdGluZCBwb2ludHMgdG8gYXJndlthcnZjXSAoTlVMTCkgbm93LgorCQkJCSoqIEZJWE1FOiB3ZSBhc3N1bWUgdGhhdCBnZXRvcHQgd2lsbCBub3QgY291bnQgb3B0aW9ucworCQkJCSoqIHBvc3NpYmx5IHByZXNlbnQgb24gIi1lIFBST0cgQVJHUyIgYW5kIHdpbGwgbm90CisJCQkJKiogaW5jbHVkZSB0aGVtIGludG8gZmluYWwgdmFsdWUgb2Ygb3B0aW5kCisJCQkJKiogd2hpY2ggaXMgdG8gYmUgdXNlZCAuLi4gICovCisJCQl9IGVsc2UgYmJfc2hvd191c2FnZSgpOworCQl9CisJCWFyZ3YgKz0gb3B0aW5kOyAvKiAuLi4gaGVyZSEgKi8KKwkJYXJnYyAtPSBvcHRpbmQ7CisJCS8vIC1sIGFuZCAtZiBkb24ndCBtaXgKKwkJaWYgKGRvX2xpc3RlbiAmJiBjZmQpIGJiX3Nob3dfdXNhZ2UoKTsKKwkJLy8gRmlsZSBtb2RlIG5lZWRzIG5lZWQgemVybyBhcmd1bWVudHMsIGxpc3RlbiBtb2RlIG5lZWRzIHplcm8gb3Igb25lLAorCQkvLyBjbGllbnQgbW9kZSBuZWVkcyBvbmUgb3IgdHdvCisJCWlmIChjZmQpIHsKKwkJCWlmIChhcmdjKSBiYl9zaG93X3VzYWdlKCk7CisJCX0gZWxzZSBpZiAoZG9fbGlzdGVuKSB7CisJCQlpZiAoYXJnYyA+IDEpIGJiX3Nob3dfdXNhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghYXJnYyB8fCBhcmdjID4gMikgYmJfc2hvd191c2FnZSgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFyZ2MgIT0gMykgYmJfc2hvd191c2FnZSgpOworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAod3NlY3MpIHsKKwkJc2lnbmFsKFNJR0FMUk0sIHRpbWVvdXQpOworCQlhbGFybSh3c2Vjcyk7CisJfQorCisJaWYgKCFjZmQpIHsKKwkJaWYgKGRvX2xpc3RlbikgeworCQkJc2ZkID0gY3JlYXRlX2FuZF9iaW5kX3N0cmVhbV9vcl9kaWUoYXJndlswXSwgbHBvcnQpOworCQkJeGxpc3RlbihzZmQsIGRvX2xpc3Rlbik7IC8qIGNhbiBiZSA+IDEgKi8KKyNpZiAwICAvKiBuYy0xLjEwIGRvZXMgbm90IGRvIHRoaXMgKHdpdGhvdXQgLXYpICovCisJCQkvKiBJZiB3ZSBkaWRuJ3Qgc3BlY2lmeSBhIHBvcnQgbnVtYmVyLAorCQkJICogcXVlcnkgYW5kIHByaW50IGl0IGFmdGVyIGxpc3RlbigpICovCisJCQlpZiAoIWxwb3J0KSB7CisJCQkJbGVuX2FuZF9zb2NrYWRkciBsc2E7CisJCQkJbHNhLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJCQkJZ2V0c29ja25hbWUoc2ZkLCAmbHNhLnUuc2EsICZsc2EubGVuKTsKKwkJCQlscG9ydCA9IGdldF9ucG9ydCgmbHNhLnUuc2EpOworCQkJCWZkcHJpbnRmKDIsICIlZFxuIiwgbnRvaHMobHBvcnQpKTsKKwkJCX0KKyNlbmRpZgorCQkJY2xvc2Vfb25fZXhlY19vbihzZmQpOworIGFjY2VwdF9hZ2FpbjoKKwkJCWNmZCA9IGFjY2VwdChzZmQsIE5VTEwsIDApOworCQkJaWYgKGNmZCA8IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhY2NlcHQiKTsKKwkJCWlmICghZXhlY3BhcmFtKQorCQkJCWNsb3NlKHNmZCk7CisJCX0gZWxzZSB7CisJCQljZmQgPSBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShhcmd2WzBdLAorCQkJCWFyZ3ZbMV0gPyBiYl9sb29rdXBfcG9ydChhcmd2WzFdLCAidGNwIiwgMCkgOiAwKTsKKwkJfQorCX0KKworCWlmICh3c2VjcykgeworCQlhbGFybSgwKTsKKwkJLyogTm9uLWlnbm9yZWQgc2lnbmFscyByZXZlcnQgdG8gU0lHX0RGTCBvbiBleGVjIGFueXdheSAqLworCQkvKnNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsqLworCX0KKworCS8qIC1lIGdpdmVuPyAqLworCWlmIChleGVjcGFyYW0pIHsKKwkJcGlkX3QgcGlkOworCQkvKiBXaXRoIG1vcmUgdGhhbiBvbmUgLWwsIHJlcGVhdGVkbHkgYWN0IGFzIHNlcnZlciAqLworCQlpZiAoZG9fbGlzdGVuID4gMSAmJiAocGlkID0geHZmb3JrKCkpICE9IDApIHsKKwkJCS8qIHBhcmVudCAqLworCQkJLyogcHJldmVudCB6b21iaWVzICovCisJCQlzaWduYWwoU0lHQ0hMRCwgU0lHX0lHTik7CisJCQljbG9zZShjZmQpOworCQkJZ290byBhY2NlcHRfYWdhaW47CisJCX0KKwkJLyogY2hpbGQsIG9yIG1haW4gdGhyZWFkIGlmIG9ubHkgb25lIC1sICovCisJCXhtb3ZlX2ZkKGNmZCwgMCk7CisJCXhkdXAyKDAsIDEpOworCQl4ZHVwMigwLCAyKTsKKwkJSUZfTkNfRVhUUkEoQkJfRVhFQ1ZQKGV4ZWNwYXJhbVswXSwgZXhlY3BhcmFtKTspCisJCS8qIERvbid0IHByaW50IHN0dWZmIG9yIGl0IHdpbGwgZ28gb3ZlciB0aGUgd2lyZS4uLiAqLworCQlfZXhpdCgxMjcpOworCX0KKworCS8qIFNlbGVjdCBsb29wIGNvcHlpbmcgc3RkaW4gdG8gY2ZkLCBhbmQgY2ZkIHRvIHN0ZG91dCAqLworCisJRkRfWkVSTygmcmVhZGZkcyk7CisJRkRfU0VUKGNmZCwgJnJlYWRmZHMpOworCUZEX1NFVChTVERJTl9GSUxFTk8sICZyZWFkZmRzKTsKKworCWZvciAoOzspIHsKKwkJaW50IGZkOworCQlpbnQgb2ZkOworCQlpbnQgbnJlYWQ7CisKKwkJdGVzdGZkcyA9IHJlYWRmZHM7CisKKwkJaWYgKHNlbGVjdChjZmQgKyAxLCAmdGVzdGZkcywgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZWxlY3QiKTsKKworI2RlZmluZSBpb2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCQlmZCA9IFNURElOX0ZJTEVOTzsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChGRF9JU1NFVChmZCwgJnRlc3RmZHMpKSB7CisJCQkJbnJlYWQgPSBzYWZlX3JlYWQoZmQsIGlvYnVmLCBzaXplb2YoaW9idWYpKTsKKwkJCQlpZiAoZmQgPT0gY2ZkKSB7CisJCQkJCWlmIChucmVhZCA8IDEpCisJCQkJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCQkJCW9mZCA9IFNURE9VVF9GSUxFTk87CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKG5yZWFkIDwgMSkgeworCQkJCQkJLyogQ2xvc2Ugb3V0Z29pbmcgaGFsZi1jb25uZWN0aW9uIHNvIHRoZXkgZ2V0IEVPRiwKKwkJCQkJCSAqIGJ1dCBsZWF2ZSBpbmNvbWluZyBhbG9uZSBzbyB3ZSBjYW4gc2VlIHJlc3BvbnNlICovCisJCQkJCQlzaHV0ZG93bihjZmQsIDEpOworCQkJCQkJRkRfQ0xSKFNURElOX0ZJTEVOTywgJnJlYWRmZHMpOworCQkJCQl9CisJCQkJCW9mZCA9IGNmZDsKKwkJCQl9CisJCQkJeHdyaXRlKG9mZCwgaW9idWYsIG5yZWFkKTsKKwkJCQlpZiAoZGVsYXkgPiAwKQorCQkJCQlzbGVlcChkZWxheSk7CisJCQl9CisJCQlpZiAoZmQgPT0gY2ZkKQorCQkJCWJyZWFrOworCQkJZmQgPSBjZmQ7CisJCX0KKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbmNfYmxvYXR5LmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL25jX2Jsb2F0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWFkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL25jX2Jsb2F0eS5jCkBAIC0wLDAgKzEsODg3IEBACisvKiBCYXNlZCBvbiBuZXRjYXQgMS4xMCBSRUxFQVNFIDk2MDMyMCB3cml0dGVuIGJ5IGhvYmJpdEBhdmlhbi5vcmcuCisgKiBSZWxlYXNlZCBpbnRvIHB1YmxpYyBkb21haW4gYnkgdGhlIGF1dGhvci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBBdXRob3IncyBjb21tZW50cyBmcm9tIG5jIDEuMTA6CisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqIE5ldGNhdCBpcyBlbnRpcmVseSBteSBvd24gY3JlYXRpb24sIGFsdGhvdWdoIHBsZW50eSBvZiBvdGhlciBjb2RlIHdhcyB1c2VkIGFzCisgKiBleGFtcGxlcy4gIEl0IGlzIGZyZWVseSBnaXZlbiBhd2F5IHRvIHRoZSBJbnRlcm5ldCBjb21tdW5pdHkgaW4gdGhlIGhvcGUgdGhhdAorICogaXQgd2lsbCBiZSB1c2VmdWwsIHdpdGggbm8gcmVzdHJpY3Rpb25zIGV4Y2VwdCBnaXZpbmcgY3JlZGl0IHdoZXJlIGl0IGlzIGR1ZS4KKyAqIE5vIEdQTHMsIEJlcmtlbGV5IGNvcHlyaWdodHMgb3IgYW55IG9mIHRoYXQgbm9uc2Vuc2UuICBUaGUgYXV0aG9yIGFzc3VtZXMgTk8KKyAqIHJlc3BvbnNpYmlsaXR5IGZvciBob3cgYW55b25lIHVzZXMgaXQuICBJZiBuZXRjYXQgbWFrZXMgeW91IHJpY2ggc29tZWhvdyBhbmQKKyAqIHlvdSdyZSBmZWVsaW5nIGdlbmVyb3VzLCBtYWlsIG1lIGEgY2hlY2suICBJZiB5b3UgYXJlIGFmZmlsaWF0ZWQgaW4gYW55IHdheQorICogd2l0aCBNaWNyb3NvZnQgTmV0d29yaywgZ2V0IGEgbGlmZS4gIEFsd2F5cyBza2kgaW4gY29udHJvbC4gIENvbW1lbnRzLAorICogcXVlc3Rpb25zLCBhbmQgcGF0Y2hlcyB0byBob2JiaXRAYXZpYW4ub3JnLgorICogLi4uCisgKiBOZXRjYXQgYW5kIHRoZSBhc3NvY2lhdGVkIHBhY2thZ2UgaXMgYSBwcm9kdWN0IG9mIEF2aWFuIFJlc2VhcmNoLCBhbmQgaXMgZnJlZWx5CisgKiBhdmFpbGFibGUgaW4gZnVsbCBzb3VyY2UgZm9ybSB3aXRoIG5vIHJlc3RyaWN0aW9ucyBzYXZlIGFuIG9ibGlnYXRpb24gdG8gZ2l2ZQorICogY3JlZGl0IHdoZXJlIGR1ZS4KKyAqIC4uLgorICogQSBkYW1uIHVzZWZ1bCBsaXR0bGUgImJhY2tlbmQiIHV0aWxpdHkgYmVndW4gOTUwOTE1IG9yIHRoZXJlYWJvdXRzLAorICogYXMgKkhvYmJpdConcyBmaXJzdCByZWFsIHN0YWIgYXQgc29tZSBzb2NrZXRzIHByb2dyYW1taW5nLiAgU29tZXRoaW5nIHRoYXQKKyAqIHNob3VsZCBoYXZlIGFuZCBpbmRlZWQgbWF5IGhhdmUgZXhpc3RlZCB0ZW4geWVhcnMgYWdvLCBidXQgbmV2ZXIgYmVjYW1lIGEKKyAqIHN0YW5kYXJkIFVuaXggdXRpbGl0eS4gIElNSE8sICJuYyIgY291bGQgdGFrZSBpdHMgcGxhY2UgcmlnaHQgbmV4dCB0byBjYXQsCisgKiBjcCwgcm0sIG12LCBkZCwgbHMsIGFuZCBhbGwgdGhvc2Ugb3RoZXIgY3J5cHRpYyBhbmQgVW5peC1saWtlIHRoaW5ncy4KKyAqID09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIE11Y2ggb2YgYXV0aG9yJ3MgY29tbWVudHMgYXJlIHN0aWxsIHJldGFpbmVkIGluIHRoZSBjb2RlLgorICoKKyAqIEZ1bmN0aW9uYWxpdHkgcmVtb3ZlZCAocmF0aW9uYWxlKToKKyAqIC0gbWlsdGlwbGUtcG9ydCByYW5nZXMsIHJhbmRvbWl6ZWQgcG9ydCBzY2FubmluZyAodXNlIG5tYXApCisgKiAtIHRlbG5ldCBzdXBwb3J0ICh1c2UgdGVsbmV0KQorICogLSBzb3VyY2Ugcm91dGluZworICogLSBtdWx0aXBsZSBETlMgY2hlY2tzCisgKiBGdW5jdGlvbmFsdHkgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gbmMgMS4xMDoKKyAqIC0gUFJPRyBpbiAnLWUgUFJPRycgY2FuIGhhdmUgQVJHUyAoYW5kIG9wdGlvbnMpLgorICogICBCZWNhdXNlIG9mIHRoaXMgLWUgb3B0aW9uIG11c3QgYmUgbGFzdC4KKy8vVE9ETzogcmVtb3ZlIC1lIGluY29tcGF0aWJpbGl0eT8KKyAqIC0gd2UgZG9uJ3QgcmVkaXJlY3Qgc3RkZXJyIHRvIHRoZSBuZXR3b3JrIHNvY2tldCBmb3IgdGhlIC1lIFBST0cuCisgKiAgIChQUk9HIGNhbiBkbyBpdCBpdHNlbGYgaWYgbmVlZGVkLCBidXQgc29tZXRpbWVzIGl0IGlzIE5PVCB3YW50ZWQhKQorICogLSBudW1lcmljIGFkZHJlc3NlcyBhcmUgcHJpbnRlZCBpbiAoKSwgbm90IFtdIChJUHY2IGxvb2tzIGJldHRlciksCisgKiAgIHBvcnQgbnVtYmVycyBhcmUgaW5zaWRlICgpOiAoMS4yLjMuNDo1Njc4KQorICogLSBuZXR3b3JrIHJlYWQgZXJyb3JzIGFyZSByZXBvcnRlZCBvbiB2ZXJib3NlIGxldmVscyA+IDEKKyAqICAgKG5jIDEuMTAgdHJlYXRzIHRoZW0gYXMgRU9GKQorICogLSBUQ1AgY29ubmVjdHMgZnJvbSB3cm9uZyBpcC9wb3J0cyAoaWYgcGVlciBpcDpwb3J0IGlzIHNwZWNpZmllZAorICogICBvbiB0aGUgY29tbWFuZCBsaW5lLCBidXQgYWNjZXB0KCkgc2F5cyB0aGF0IGl0IGNhbWUgZnJvbSBkaWZmZXJlbnQgYWRkcikKKyAqICAgYXJlIGNsb3NlZCwgYnV0IHdlIGRvbid0IGV4aXQgLSB3ZSBjb250aW51ZSB0byBsaXN0ZW4vYWNjZXB0LgorICovCisKKy8qIGRvbmUgaW4gbmMuYzogI2luY2x1ZGUgImxpYmJiLmgiICovCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9OQ18xMTBfQ09NUEFUCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG5jX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gSE9TVCBQT1JUICAtIGNvbm5lY3QiCisvL3VzYWdlOglJRl9OQ19TRVJWRVIoIlxuIgorLy91c2FnZTogICAgICAgIm5jIFtPUFRJT05TXSAtbCAtcCBQT1JUIFtIT1NUXSBbUE9SVF0gIC0gbGlzdGVuIgorLy91c2FnZToJKQorLy91c2FnZTojZGVmaW5lIG5jX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1lIFBST0cJUnVuIFBST0cgYWZ0ZXIgY29ubmVjdCAobXVzdCBiZSBsYXN0KSIKKy8vdXNhZ2U6CUlGX05DX1NFUlZFUigKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdGVuIG1vZGUsIGZvciBpbmJvdW5kIGNvbm5lY3RzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktcCBQT1JUCUxvY2FsIHBvcnQiCisvL3VzYWdlOiAgICAgIlxuCS1zIEFERFIJTG9jYWwgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcgU0VDCVRpbWVvdXQgZm9yIGNvbm5lY3RzIGFuZCBmaW5hbCBuZXQgcmVhZHMiCisvL3VzYWdlOglJRl9OQ19FWFRSQSgKKy8vdXNhZ2U6ICAgICAiXG4JLWkgU0VDCURlbGF5IGludGVydmFsIGZvciBsaW5lcyBzZW50IiAvKiAiLCBwb3J0cyBzY2FubmVkIiAqLworLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbglEb24ndCBkbyBETlMgcmVzb2x1dGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJVURQIG1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOglJRl9OQ19FWFRSQSgKKy8vdXNhZ2U6ICAgICAiXG4JLW8gRklMRQlIZXggZHVtcCB0cmFmZmljIgorLy91c2FnZTogICAgICJcbgkteglaZXJvLUkvTyBtb2RlIChzY2FubmluZykiCisvL3VzYWdlOgkpCisvL3VzYWdlOiNlbmRpZgorCisvKiAgICJcbgktcgkJUmFuZG9taXplIGxvY2FsIGFuZCByZW1vdGUgcG9ydHMiICovCisvKiAgICJcbgktZyBnYXRld2F5CVNvdXJjZS1yb3V0aW5nIGhvcCBwb2ludFtzXSwgdXAgdG8gOCIgKi8KKy8qICAgIlxuCS1HIG51bQkJU291cmNlLXJvdXRpbmcgcG9pbnRlcjogNCwgOCwgMTIsIC4uLiIgKi8KKy8qICAgIlxucG9ydCBudW1iZXJzIGNhbiBiZSBpbmRpdmlkdWFsIG9yIHJhbmdlczogbG8taGkgW2luY2x1c2l2ZV0iICovCisKKy8qIC1lIFBST0cgY2FuIHRha2UgQVJHUyB0b286ICJuYyAuLi4gLWUgbHMgLWwiLCBidXQgd2UgZG9uJ3QgZG9jdW1lbnQgaXQKKyAqIGluIGhlbHAgdGV4dDogbmMgMS4xMCBkb2VzIG5vdCBhbGxvdyB0aGF0LiBXZSBkb24ndCB3YW50IHRvIGVudGljZQorICogdXNlcnMgdG8gdXNlIHRoaXMgaW5jb21wYXRpYmlsaXR5ICovCisKK2VudW0geworCVNMRUFaRV9QT1JUID0gMzEzMzcsICAgICAgICAgICAgICAgLyogZm9yIFVEUC1zY2FuIFJUVCB0cmljaywgY2hhbmdlIGlmIHlhIHdhbnQgKi8KKwlCSUdTSVogPSA4MTkyLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpZyBidWZmZXJzICovCisKKwluZXRmZCA9IDMsCisJb2ZkID0gNCwKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwkvKiBnbG9iYWwgY21kIGZsYWdzOiAqLworCXVuc2lnbmVkIG9fdmVyYm9zZTsKKwl1bnNpZ25lZCBvX3dhaXQ7CisjaWYgRU5BQkxFX05DX0VYVFJBCisJdW5zaWduZWQgb19pbnRlcnZhbDsKKyNlbmRpZgorCisJLyppbnQgbmV0ZmQ7Ki8KKwkvKmludCBvZmQ7Ki8gICAgICAgICAgICAgICAgICAgICAvKiBoZXhkdW1wIG91dHB1dCBmZCAqLworI2lmIEVOQUJMRV9MRlMKKyNkZWZpbmUgU0VOVF9OX1JFQ1ZfTSAic2VudCAlbGx1LCByY3ZkICVsbHVcbiIKKwl1bnNpZ25lZCBsb25nIGxvbmcgd3JvdGVfb3V0OyAgICAgICAgICAvKiB0b3RhbCBzdGRvdXQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgd3JvdGVfbmV0OyAgICAgICAgICAvKiB0b3RhbCBuZXQgYnl0ZXMgKi8KKyNlbHNlCisjZGVmaW5lIFNFTlRfTl9SRUNWX00gInNlbnQgJXUsIHJjdmQgJXVcbiIKKwl1bnNpZ25lZCB3cm90ZV9vdXQ7ICAgICAgICAgIC8qIHRvdGFsIHN0ZG91dCBieXRlcyAqLworCXVuc2lnbmVkIHdyb3RlX25ldDsgICAgICAgICAgLyogdG90YWwgbmV0IGJ5dGVzICovCisjZW5kaWYKKwkvKiBvdXJhZGRyIGlzIG5ldmVyIE5VTEwgYW5kIGdvZXMgdGhyb3VnaCB0aHJlZSBzdGF0ZXMgYXMgd2UgcHJvZ3Jlc3M6CisJIDEgLSBsb2NhbCBhZGRyZXNzIGJlZm9yZSBiaW5kIChJUC9wb3J0IHBvc3NpYmx5IHplcm8pCisJIDIgLSBsb2NhbCBhZGRyZXNzIGFmdGVyIGJpbmQgKHBvcnQgaXMgbm9uemVybykKKwkgMyAtIGxvY2FsIGFkZHJlc3MgYWZ0ZXIgY29ubmVjdD8/L3JlY3YvYWNjZXB0IChJUCBhbmQgcG9ydCBhcmUgbm9uemVybykgKi8KKwlzdHJ1Y3QgbGVuX2FuZF9zb2NrYWRkciAqb3VyYWRkcjsKKwkvKiB0aGVtYWRkciBpcyBOVUxMIGlmIG5vIHBlZXIgaG9zdG5hbWVbOnBvcnRdIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUgKi8KKwlzdHJ1Y3QgbGVuX2FuZF9zb2NrYWRkciAqdGhlbWFkZHI7CisJLyogcmVtZW5kIGlzIHNldCBhZnRlciBjb25uZWN0L3JlY3YvYWNjZXB0IHRvIHRoZSBhY3R1YWwgaXA6cG9ydCBvZiBwZWVyICovCisJc3RydWN0IGxlbl9hbmRfc29ja2FkZHIgcmVtZW5kOworCisJam1wX2J1ZiBqYnVmOyAgICAgICAgICAgICAgICAvKiB0aW1lciBjcnVkICovCisKKwkvKiB3aWxsIG1hbGxvYyB1cCB0aGUgZm9sbG93aW5nIGdsb2JhbHM6ICovCisJZmRfc2V0IGRpbmcxOyAgICAgICAgICAgICAgICAvKiBmb3Igc2VsZWN0IGxvb3AgKi8KKwlmZF9zZXQgZGluZzI7CisJY2hhciBiaWdidWZfaW5bQklHU0laXTsgICAgICAvKiBkYXRhIGJ1ZmZlcnMgKi8KKwljaGFyIGJpZ2J1Zl9uZXRbQklHU0laXTsKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSB3cm90ZV9vdXQgIChHLndyb3RlX291dCApCisjZGVmaW5lIHdyb3RlX25ldCAgKEcud3JvdGVfbmV0ICkKKyNkZWZpbmUgb3VyYWRkciAgICAoRy5vdXJhZGRyICAgKQorI2RlZmluZSB0aGVtYWRkciAgIChHLnRoZW1hZGRyICApCisjZGVmaW5lIHJlbWVuZCAgICAgKEcucmVtZW5kICAgICkKKyNkZWZpbmUgamJ1ZiAgICAgICAoRy5qYnVmICAgICAgKQorI2RlZmluZSBkaW5nMSAgICAgIChHLmRpbmcxICAgICApCisjZGVmaW5lIGRpbmcyICAgICAgKEcuZGluZzIgICAgICkKKyNkZWZpbmUgYmlnYnVmX2luICAoRy5iaWdidWZfaW4gKQorI2RlZmluZSBiaWdidWZfbmV0IChHLmJpZ2J1Zl9uZXQpCisjZGVmaW5lIG9fdmVyYm9zZSAgKEcub192ZXJib3NlICkKKyNkZWZpbmUgb193YWl0ICAgICAoRy5vX3dhaXQgICAgKQorI2lmIEVOQUJMRV9OQ19FWFRSQQorI2RlZmluZSBvX2ludGVydmFsIChHLm9faW50ZXJ2YWwpCisjZWxzZQorI2RlZmluZSBvX2ludGVydmFsIDAKKyNlbmRpZgorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIGNhbGwhICovCitlbnVtIHsKKwlPUFRfaCA9ICgxIDw8IDApLAorCU9QVF9uID0gKDEgPDwgMSksCisJT1BUX3AgPSAoMSA8PCAyKSwKKwlPUFRfcyA9ICgxIDw8IDMpLAorCU9QVF91ID0gKDEgPDwgNCksCisJT1BUX3YgPSAoMSA8PCA1KSwKKwlPUFRfdyA9ICgxIDw8IDYpLAorCU9QVF9sID0gKDEgPDwgNykgKiBFTkFCTEVfTkNfU0VSVkVSLAorCU9QVF9pID0gKDEgPDwgKDcrRU5BQkxFX05DX1NFUlZFUikpICogRU5BQkxFX05DX0VYVFJBLAorCU9QVF9vID0gKDEgPDwgKDgrRU5BQkxFX05DX1NFUlZFUikpICogRU5BQkxFX05DX0VYVFJBLAorCU9QVF96ID0gKDEgPDwgKDkrRU5BQkxFX05DX1NFUlZFUikpICogRU5BQkxFX05DX0VYVFJBLAorfTsKKworI2RlZmluZSBvX25mbGFnICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikKKyNkZWZpbmUgb191ZHBtb2RlIChvcHRpb25fbWFzazMyICYgT1BUX3UpCisjaWYgRU5BQkxFX05DX1NFUlZFUgorI2RlZmluZSBvX2xpc3RlbiAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbCkKKyNlbHNlCisjZGVmaW5lIG9fbGlzdGVuICAwCisjZW5kaWYKKyNpZiBFTkFCTEVfTkNfRVhUUkEKKyNkZWZpbmUgb19vZmlsZSAgIChvcHRpb25fbWFzazMyICYgT1BUX28pCisjZGVmaW5lIG9femVybyAgICAob3B0aW9uX21hc2szMiAmIE9QVF96KQorI2Vsc2UKKyNkZWZpbmUgb19vZmlsZSAgIDAKKyNkZWZpbmUgb196ZXJvICAgIDAKKyNlbmRpZgorCisvKiBEZWJ1Zzogc3F1aXJ0IHdoYXRldmVyIG1lc3NhZ2UgYW5kIHNsZWVwIGEgYml0IHNvIHdlIGNhbiBzZWUgaXQgZ28gYnkuICovCisvKiBCZXdhcmU6IHdyaXRlcyB0byBzdGRPVVQuLi4gKi8KKyNpZiAwCisjZGVmaW5lIERlYnVnKC4uLikgZG8geyBwcmludGYoX19WQV9BUkdTX18pOyBwcmludGYoIlxuIik7IGZmbHVzaF9hbGwoKTsgc2xlZXAoMSk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBEZWJ1ZyguLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIGhvbGxlcl9lcnJvciguLi4pICBkbyB7IGlmIChvX3ZlcmJvc2UpIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGhvbGxlcl9wZXJyb3IoLi4uKSBkbyB7IGlmIChvX3ZlcmJvc2UpIGJiX3BlcnJvcl9tc2coX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorCisvKiBjYXRjaDogbm8tYnJhaW5lciBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIHZvaWQgY2F0Y2goaW50IHNpZykKK3sKKwlpZiAob192ZXJib3NlID4gMSkgICAgICAgICAgICAgICAgLyogbm9ybWFsbHkgd2UgZG9uJ3QgY2FyZSAqLworCQlmcHJpbnRmKHN0ZGVyciwgU0VOVF9OX1JFQ1ZfTSwgd3JvdGVfbmV0LCB3cm90ZV9vdXQpOworCWZwcmludGYoc3RkZXJyLCAicHVudCFcbiIpOworCWtpbGxfbXlzZWxmX3dpdGhfc2lnKHNpZyk7Cit9CisKKy8qIHVuYXJtICAqLworc3RhdGljIHZvaWQgdW5hcm0odm9pZCkKK3sKKwlzaWduYWwoU0lHQUxSTSwgU0lHX0lHTik7CisJYWxhcm0oMCk7Cit9CisKKy8qIHRpbWVvdXQgYW5kIG90aGVyIHNpZ25hbCBoYW5kbGluZyBjcnVmdCAqLworc3RhdGljIHZvaWQgdG10cmF2ZWwoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJdW5hcm0oKTsKKwlsb25nam1wKGpidWYsIDEpOworfQorCisvKiBhcm06IHNldCB0aGUgdGltZXIuICAqLworc3RhdGljIHZvaWQgYXJtKHVuc2lnbmVkIHNlY3MpCit7CisJc2lnbmFsKFNJR0FMUk0sIHRtdHJhdmVsKTsKKwlhbGFybShzZWNzKTsKK30KKworLyogZmluZGxpbmU6CisgZmluZCB0aGUgbmV4dCBuZXdsaW5lIGluIGEgYnVmZmVyOyByZXR1cm4gaW5jbHVzaXZlIHNpemUgb2YgdGhhdCAibGluZSIsCisgb3IgdGhlIGVudGlyZSBidWZmZXIgc2l6ZSwgc28gdGhlIGNhbGxlciBrbm93cyBob3cgbXVjaCB0byB0aGVuIHdyaXRlKCkuCisgTm90IGRpc3Rpbmd1aXNoaW5nIFxuIHZzIFxyXG4gZm9yIHRoZSBub25jZTsgaXQganVzdCB3b3JrcyBhcyBpcy4uLiAqLworc3RhdGljIHVuc2lnbmVkIGZpbmRsaW5lKGNoYXIgKmJ1ZiwgdW5zaWduZWQgc2l6KQoreworCWNoYXIgKiBwOworCWludCB4OworCWlmICghYnVmKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgc2FuaXR5IGNoZWNrcy4uLiAqLworCQlyZXR1cm4gMDsKKwlpZiAoc2l6ID4gQklHU0laKQorCQlyZXR1cm4gMDsKKwl4ID0gc2l6OworCWZvciAocCA9IGJ1ZjsgeCA+IDA7IHgtLSkgeworCQlpZiAoKnAgPT0gJ1xuJykgeworCQkJeCA9IChpbnQpIChwIC0gYnVmKTsKKwkJCXgrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiAnc29rYXkgaWYgaXQgcG9pbnRzIGp1c3QgcGFzdCB0aGUgZW5kISAqLworRGVidWcoImZpbmRsaW5lIHJldHVybmluZyAlZCIsIHgpOworCQkJcmV0dXJuIHg7CisJCX0KKwkJcCsrOworCX0gLyogZm9yICovCitEZWJ1ZygiZmluZGxpbmUgcmV0dXJuaW5nIHdob2xlIHRoaW5nOiAlZCIsIHNpeik7CisJcmV0dXJuIHNpejsKK30gLyogZmluZGxpbmUgKi8KKworLyogZG9leGVjOgorIGZpZGRsZSBhbGwgdGhlIGZpbGUgZGVzY3JpcHRvcnMgYXJvdW5kLCBhbmQgaGFuZCBvZmYgdG8gYW5vdGhlciBwcm9nLiAgU29ydAorIG9mIGxpa2UgYSBvbmUtb2ZmICJwb29yIG1hbidzIGluZXRkIi4gIFRoaXMgaXMgdGhlIG9ubHkgc2VjdGlvbiBvZiBjb2RlCisgdGhhdCB3b3VsZCBiZSBzZWN1cml0eS1jcml0aWNhbCwgd2hpY2ggaXMgd2h5IGl0J3MgaWZkZWZlZCBvdXQgYnkgZGVmYXVsdC4KKyBVc2UgYXQgeW91ciBvd24gaGFpcnkgcmlzazsgaWYgeW91IGxlYXZlIHNoZWxscyBseWluZyBhcm91bmQgYmVoaW5kIG9wZW4KKyBsaXN0ZW5pbmcgcG9ydHMgeW91IGRlc2VydmUgdG8gbG9zZSEhICovCitzdGF0aWMgaW50IGRvZXhlYyhjaGFyICoqcHJvZ2dpZSkgTk9SRVRVUk47CitzdGF0aWMgaW50IGRvZXhlYyhjaGFyICoqcHJvZ2dpZSkKK3sKKwl4bW92ZV9mZChuZXRmZCwgMCk7CisJZHVwMigwLCAxKTsKKwkvKiBkdXAyKDAsIDIpOyAtIGRvIHdlICpyZWFsbHkqIHdhbnQgdGhpcz8gTk8hCisJICogZXhlYydlZCBwcm9nIGNhbiBkbyBpdCB5b3Vyc2VsZiwgaWYgbmVlZGVkICovCisJQkJfRVhFQ1ZQX29yX2RpZShwcm9nZ2llKTsKK30KKworLyogY29ubmVjdF93X3RpbWVvdXQ6CisgcmV0dXJuIGFuIGZkIGZvciBvbmUgb2YKKyBhbiBvcGVuIG91dGJvdW5kIFRDUCBjb25uZWN0aW9uLCBhIFVEUCBzdHViLXNvY2tldCB0aGluZ2llLCBvcgorIGFuIHVuY29ubmVjdGVkIFRDUCBvciBVRFAgc29ja2V0IHRvIGxpc3RlbiBvbi4KKyBFeGFtaW5lcyB2YXJpb3VzIGdsb2JhbCBvX2JsYWggZmxhZ3MgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvLgorIGxhZCBjYW4gYmUgTlVMTCwgdGhlbiBzb2NrZXQgaXMgbm90IGJvdW5kIHRvIGFueSBsb2NhbCBpcFs6cG9ydF0gKi8KK3N0YXRpYyBpbnQgY29ubmVjdF93X3RpbWVvdXQoaW50IGZkKQoreworCWludCBycjsKKworCS8qIHdyYXAgY29ubmVjdCBpbnNpZGUgYSB0aW1lciwgYW5kIGhpdCBpdCAqLworCWFybShvX3dhaXQpOworCWlmIChzZXRqbXAoamJ1ZikgPT0gMCkgeworCQlyciA9IGNvbm5lY3QoZmQsICZ0aGVtYWRkci0+dS5zYSwgdGhlbWFkZHItPmxlbik7CisJCXVuYXJtKCk7CisJfSBlbHNlIHsgLyogc2V0am1wOiBjb25uZWN0IGZhaWxlZC4uLiAqLworCQlyciA9IC0xOworCQllcnJubyA9IEVUSU1FRE9VVDsgLyogZmFrZSBpdCAqLworCX0KKwlyZXR1cm4gcnI7Cit9CisKKy8qIGRvbGlzdGVuOgorIGxpc3RlbnMgZm9yCisgaW5jb21pbmcgYW5kIHJldHVybnMgYW4gb3BlbiBjb25uZWN0aW9uICpmcm9tKiBzb21lcGxhY2UuICBJZiB3ZSB3ZXJlCisgZ2l2ZW4gaG9zdC9wb3J0IGFyZ3MsIGFueSBjb25uZWN0aW9ucyBmcm9tIGVsc2V3aGVyZSBhcmUgcmVqZWN0ZWQuICBUaGlzCisgaW4gY29uanVuY3Rpb24gd2l0aCBsb2NhbC1hZGRyZXNzIGJpbmRpbmcgc2hvdWxkIGxpbWl0IHRoaW5ncyBuaWNlbHkuLi4gKi8KK3N0YXRpYyB2b2lkIGRvbGlzdGVuKHZvaWQpCit7CisJaW50IHJyOworCisJaWYgKCFvX3VkcG1vZGUpCisJCXhsaXN0ZW4obmV0ZmQsIDEpOyAvKiBUQ1A6IGdvdHRhIGxpc3RlbigpIGJlZm9yZSB3ZSBjYW4gZ2V0ICovCisKKwkvKiBWYXJpb3VzIHRoaW5ncyB0aGF0IGZvbGxvdyB0ZW1wb3JhcmlseSB0cmFzaCBiaWdidWZfbmV0LCB3aGljaCBtaWdodCBjb250YWluCisJIGEgY29weSBvZiBhbnkgcmVjdmZyb20oKWVkIHBhY2tldCwgYnV0IHdlJ2xsIHJlYWQoKSBhbm90aGVyIGNvcHkgbGF0ZXIuICovCisKKwkvKiBJIGNhbid0IGJlbGlldmUgSSBoYXZlIHRvIGRvIGFsbCB0aGlzIHRvIGdldCBteSBvd24gZ29kZGFtbiBib3VuZCBhZGRyZXNzCisJIGFuZCBwb3J0IG51bWJlci4gIEl0IHNob3VsZCBqdXN0IGdldCBmaWxsZWQgaW4gZHVyaW5nIGJpbmQoKSBvciBzb21ldGhpbmcuCisJIEFsbCB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHdlIGRpZG4ndCBzYXkgLXAgZm9yIGxpc3RlbmluZywgc2luY2UgaWYgd2UKKwkgc2FpZCAtcCB3ZSAqa25vdyogd2hhdCBwb3J0IHdlJ3JlIGxpc3RlbmluZyBvbi4gIEF0IGFueSByYXRlIHdlIHdvbid0IGJvdGhlcgorCSB3aXRoIGl0IGFsbCB1bmxlc3Mgd2Ugd2FudGVkIHRvIHNlZSBpdCwgYWx0aG91Z2ggbGlzdGVuaW5nIHF1aWV0bHkgb24gYQorCSByYW5kb20gdW5rbm93biBwb3J0IGlzIHByb2JhYmx5IG5vdCB2ZXJ5IHVzZWZ1bCB3aXRob3V0ICJuZXRzdGF0Ii4gKi8KKwlpZiAob192ZXJib3NlKSB7CisJCWNoYXIgKmFkZHI7CisJCWdldHNvY2tuYW1lKG5ldGZkLCAmb3VyYWRkci0+dS5zYSwgJm91cmFkZHItPmxlbik7CisJCS8vaWYgKHJyIDwgMCkKKwkJLy8JYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRzb2NrbmFtZSBhZnRlciBiaW5kIik7CisJCWFkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmb3VyYWRkci0+dS5zYSk7CisJCWZwcmludGYoc3RkZXJyLCAibGlzdGVuaW5nIG9uICVzIC4uLlxuIiwgYWRkcik7CisJCWZyZWUoYWRkcik7CisJfQorCisJaWYgKG9fdWRwbW9kZSkgeworCQkvKiBVRFAgaXMgYSBzcGVlZWVlY2lhbCBjYXNlIC0tIHdlIGhhdmUgdG8gZG8gSS9PICphbmQqIGdldCB0aGUgY2FsbGluZworCQkgcGFydHkncyBwYXJ0aWN1bGFycyBhbGwgYXQgb25jZSwgbGlzdGVuKCkgYW5kIGFjY2VwdCgpIGRvbid0IGFwcGx5LgorCQkgQXQgbGVhc3QgaW4gdGhlIEJTRCB1bml2ZXJzZSwgaG93ZXZlciwgcmVjdmZyb20vUEVFSyBpcyBlbm91Z2ggdG8gdGVsbAorCQkgdXMgc29tZXRoaW5nIGNhbWUgaW4sIGFuZCB3ZSBjYW4gc2V0IHRoaW5ncyB1cCBzbyBzdHJhaWdodCByZWFkL3dyaXRlCisJCSBhY3R1YWxseSBkb2VzIHdvcmsgYWZ0ZXIgYWxsLiAgWW93LiAgWU1NViBvbiBzdHJhbmdlIHBsYXRmb3JtcyEgICovCisKKwkJLyogSSdtIG5vdCBjb21wbGV0ZWx5IGNsZWFyIG9uIGhvdyB0aGlzIHdvcmtzIC0tIEJTRCBzZWVtcyB0byBtYWtlIFVEUAorCQkganVzdCBtYWdpY2FsbHkgd29yayBpbiBhIGNvbm5lY3QoKWVkIGNvbnRleHQsIGJ1dCB3ZSdsbCB1bmRvdWJ0ZWRseSBydW4KKwkJIGludG8gc3lzdGVtcyB0aGlzIGRlYWwgZG9lc24ndCB3b3JrIG9uLiAgRm9yIG5vdywgd2UgYXBwYXJlbnRseSBoYXZlIHRvCisJCSBpc3N1ZSBhIGNvbm5lY3QoKSBvbiBvdXIganVzdC10aWNrbGVkIHNvY2tldCBzbyB3ZSBjYW4gd3JpdGUoKSBiYWNrLgorCQkgQWdhaW4sIHdoeSB0aGUgZnVjayBkb2Vzbid0IGl0IGp1c3QgZ2V0IGZpbGxlZCBpbiBhbmQgdGFrZW4gY2FyZSBvZj8hCisJCSBUaGlzIGhhY2sgaXMgYW55dGhpbmcgYnV0IG9wdGltYWwuICBCYXNpY2FsbHksIGlmIHlvdSB3YW50IHlvdXIgbGlzdGVuZXIKKwkJIHRvIGFsc28gYmUgYWJsZSB0byBzZW5kIGRhdGEgYmFjaywgeW91IG5lZWQgdGhpcyBjb25uZWN0KCkgbGluZSwgd2hpY2gKKwkJIGFsc28gaGFzIHRoZSBzaWRlIGVmZmVjdCB0aGF0IG5vdyBhbnl0aGluZyBmcm9tIGEgZGlmZmVyZW50IHNvdXJjZSBvciBldmVuIGEKKwkJIGRpZmZlcmVudCBwb3J0IG9uIHRoZSBvdGhlciBlbmQgd29uJ3Qgc2hvdyB1cCBhbmQgd2lsbCBjYXVzZSBJQ01QIGVycm9ycy4KKwkJIEkgZ3Vlc3MgdGhhdCdzIHdoYXQgdGhleSBtZWFudCBieSAiY29ubmVjdCIuCisJCSBMZXQncyB0cnkgdG8gcmVtZW1iZXIgd2hhdCB0aGUgIlUiIGlzICpyZWFsbHkqIGZvciwgZWg/ICovCisKKwkJLyogSWYgcGVlciBhZGRyZXNzIGlzIHNwZWNpZmllZCwgY29ubmVjdCB0byBpdCAqLworCQlyZW1lbmQubGVuID0gTFNBX1NJWkVPRl9TQTsKKwkJaWYgKHRoZW1hZGRyKSB7CisJCQlyZW1lbmQgPSAqdGhlbWFkZHI7CisJCQl4Y29ubmVjdChuZXRmZCwgJnRoZW1hZGRyLT51LnNhLCB0aGVtYWRkci0+bGVuKTsKKwkJfQorCQkvKiBwZWVrIGZpcnN0IHBhY2tldCBhbmQgcmVtZW1iZXIgcGVlciBhZGRyICovCisJCWFybShvX3dhaXQpOyAgICAgICAgICAgICAgICAvKiBtaWdodCBhcyB3ZWxsIHRpbWVvdXQgdGhpcywgdG9vICovCisJCWlmIChzZXRqbXAoamJ1ZikgPT0gMCkgeyAgICAgICAvKiBkbyB0aW1lb3V0IGZvciBpbml0aWFsIGNvbm5lY3QgKi8KKwkJCS8qICgqb3VyYWRkcikgaXMgcHJlZmlsbGVkIHdpdGggImRlZmF1bHQiIGFkZHJlc3MgKi8KKwkJCS8qIGFuZCBoZXJlIHdlIGJsb2NrLi4uICovCisJCQlyciA9IHJlY3ZfZnJvbV90byhuZXRmZCwgTlVMTCwgMCwgTVNHX1BFRUssIC8qd2FzIGJpZ2J1Zl9uZXQsIEJJR1NJWiovCisJCQkJJnJlbWVuZC51LnNhLCAmb3VyYWRkci0+dS5zYSwgb3VyYWRkci0+bGVuKTsKKwkJCWlmIChyciA8IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJyZWN2ZnJvbSIpOworCQkJdW5hcm0oKTsKKwkJfSBlbHNlCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGltZW91dCIpOworLyogTm93IHdlIGxlYXJuZWQgKnRvIHdoaWNoIElQKiBwZWVyIGhhcyBjb25uZWN0ZWQsIGFuZCB3ZSB3YW50IHRvIGFuY2hvcgorb3VyIHNvY2tldCBvbiBpdCwgc28gdGhhdCBvdXIgb3V0Ym91bmQgcGFja2V0cyB3aWxsIGhhdmUgY29ycmVjdCBsb2NhbCBJUC4KK1VuZm9ydHVuYXRlbHksIGJpbmQoKSBvbiBhbHJlYWR5IGJvdW5kIHNvY2tldCB3aWxsIGZhaWwgbm93IChFSU5WQUwpOgorCXhiaW5kKG5ldGZkLCAmb3VyYWRkci0+dS5zYSwgb3VyYWRkci0+bGVuKTsKK05lZWQgdG8gcmVhZCB0aGUgcGFja2V0LCBzYXZlIGRhdGEsIGNsb3NlIHRoaXMgc29ja2V0IGFuZAorY3JlYXRlIG5ldyBvbmUsIGFuZCBiaW5kKCkgaXQuIFRPRE8gKi8KKwkJaWYgKCF0aGVtYWRkcikKKwkJCXhjb25uZWN0KG5ldGZkLCAmcmVtZW5kLnUuc2EsIG91cmFkZHItPmxlbik7CisJfSBlbHNlIHsKKwkJLyogVENQICovCisJCWFybShvX3dhaXQpOyAvKiB3cmFwIHRoaXMgaW4gYSB0aW1lciwgdG9vOyAwID0gZm9yZXZlciAqLworCQlpZiAoc2V0am1wKGpidWYpID09IDApIHsKKyBhZ2FpbjoKKwkJCXJlbWVuZC5sZW4gPSBMU0FfU0laRU9GX1NBOworCQkJcnIgPSBhY2NlcHQobmV0ZmQsICZyZW1lbmQudS5zYSwgJnJlbWVuZC5sZW4pOworCQkJaWYgKHJyIDwgMCkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImFjY2VwdCIpOworCQkJaWYgKHRoZW1hZGRyKSB7CisJCQkJaW50IHN2X3BvcnQsIHBvcnQsIHI7CisKKwkJCQlzdl9wb3J0ID0gZ2V0X25wb3J0KCZyZW1lbmQudS5zYSk7IC8qIHNhdmUgKi8KKwkJCQlwb3J0ID0gZ2V0X25wb3J0KCZ0aGVtYWRkci0+dS5zYSk7CisJCQkJaWYgKHBvcnQgPT0gMCkgeworCQkJCQkvKiAibmMgLW5sIC1wIExQT1JUIFJIT1NUIiAody9vIFJQT1JUISk6CisJCQkJCSAqIHdlIHNob3VsZCBhY2NlcHQgYW55IHJlbW90ZSBwb3J0ICovCisJCQkJCXNldF9ucG9ydCgmcmVtZW5kLnUuc2EsIDApOyAvKiBibG90IG91dCByZW1vdGUgcG9ydCMgKi8KKwkJCQl9CisJCQkJciA9IG1lbWNtcCgmcmVtZW5kLnUuc2EsICZ0aGVtYWRkci0+dS5zYSwgcmVtZW5kLmxlbik7CisJCQkJc2V0X25wb3J0KCZyZW1lbmQudS5zYSwgc3ZfcG9ydCk7IC8qIHJlc3RvcmUgKi8KKwkJCQlpZiAociAhPSAwKSB7CisJCQkJCS8qIG5jIDEuMTAgYmFpbHMgb3V0IGluc3RlYWQsIGFuZCBpdHMgZXJyb3IgbWVzc2FnZQorCQkJCQkgKiBpcyBub3Qgc3VwcHJlc3NlZCBieSBvX3ZlcmJvc2UgKi8KKwkJCQkJaWYgKG9fdmVyYm9zZSkgeworCQkJCQkJY2hhciAqcmVtYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZyZW1lbmQudS5zYSk7CisJCQkJCQliYl9lcnJvcl9tc2coImNvbm5lY3QgZnJvbSB3cm9uZyBpcC9wb3J0ICVzIGlnbm9yZWQiLCByZW1hZGRyKTsKKwkJCQkJCWZyZWUocmVtYWRkcik7CisJCQkJCX0KKwkJCQkJY2xvc2UocnIpOworCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKwkJCX0KKwkJCXVuYXJtKCk7CisJCX0gZWxzZQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRpbWVvdXQiKTsKKwkJeG1vdmVfZmQocnIsIG5ldGZkKTsgLyogZHVtcCB0aGUgb2xkIHNvY2tldCwgaGVyZSdzIG91ciBuZXcgb25lICovCisJCS8qIGZpbmQgb3V0IHdoYXQgYWRkcmVzcyB0aGUgY29ubmVjdGlvbiB3YXMgKnRvKiBvbiBvdXIgZW5kLCBpbiBjYXNlIHdlJ3JlCisJCSBkb2luZyBhIGxpc3Rlbi1vbi1hbnkgb24gYSBtdWx0aWhvbWVkIG1hY2hpbmUuICBUaGlzIGFsbG93cyBvbmUgdG8KKwkJIG9mZmVyIGRpZmZlcmVudCBzZXJ2aWNlcyB2aWEgZGlmZmVyZW50IGFsaWFzIGFkZHJlc3Nlcywgc3VjaCBhcyB0aGUKKwkJICJ2aXJ0dWFsIHdlYiBzaXRlIiBoYWNrLiAqLworCQlnZXRzb2NrbmFtZShuZXRmZCwgJm91cmFkZHItPnUuc2EsICZvdXJhZGRyLT5sZW4pOworCQkvL2lmIChyciA8IDApCisJCS8vCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0c29ja25hbWUgYWZ0ZXIgYWNjZXB0Iik7CisJfQorCisJaWYgKG9fdmVyYm9zZSkgeworCQljaGFyICpsY2xhZGRyLCAqcmVtYWRkciwgKnJlbWhvc3RuYW1lOworCisjaWYgRU5BQkxFX05DX0VYVFJBICYmIGRlZmluZWQoSVBfT1BUSU9OUykKKwkvKiBJZiB3ZSBjYW4sIGxvb2sgZm9yIGFueSBJUCBvcHRpb25zLiAgVXNlZnVsIGZvciB0ZXN0aW5nIHRoZSByZWNlaXZpbmcgZW5kIG9mCisJIHN1Y2ggdGhpbmdzLCBhbmQgaXMgYSBnb29kIGV4ZXJjaXNlIGluIGRlYWxpbmcgd2l0aCBpdC4gIFdlIGRvIHRoaXMgYmVmb3JlCisJIHRoZSBjb25uZWN0IG1lc3NhZ2UsIHRvIGVuc3VyZSB0aGF0IHRoZSBjb25uZWN0IG1zZyBpcyB1bmlmb3JtbHkgdGhlIExBU1QKKwkgdGhpbmcgdG8gZW1lcmdlIGFmdGVyIGFsbCB0aGUgaW50ZXJ2ZW5pbmcgY3J1ZC4gIERvZXNuJ3Qgd29yayBmb3IgVURQIG9uCisJIGFueSBtYWNoaW5lcyBJJ3ZlIHRlc3RlZCwgYnV0IGZlZWwgZnJlZSB0byBzdXJwcmlzZSBtZS4gKi8KKwkJY2hhciBvcHRidWZbNDBdOworCQlzb2NrbGVuX3QgeCA9IHNpemVvZihvcHRidWYpOworCisJCXJyID0gZ2V0c29ja29wdChuZXRmZCwgSVBQUk9UT19JUCwgSVBfT1BUSU9OUywgb3B0YnVmLCAmeCk7CisJCWlmIChyciA+PSAwICYmIHgpIHsgICAgLyogd2UndmUgZ290IG9wdGlvbnMsIGxlc3NlZSBlbS4uLiAqLworCQkJYmluMmhleChiaWdidWZfbmV0LCBvcHRidWYsIHgpOworCQkJYmlnYnVmX25ldFsyKnhdID0gJ1wwJzsKKwkJCWZwcmludGYoc3RkZXJyLCAiSVAgb3B0aW9uczogJXNcbiIsIGJpZ2J1Zl9uZXQpOworCQl9CisjZW5kaWYKKworCS8qIG5vdyBjaGVjayBvdXQgd2hvIGl0IGlzLiAgV2UgZG9uJ3QgY2FyZSBhYm91dCBtaXNtYXRjaGVkIEROUyBuYW1lcyBoZXJlLAorCSBidXQgYW55IEFERFIgYW5kIFBPUlQgd2Ugc3BlY2lmaWVkIGhhZCBiZXR0ZXIgZnVja2luZyB3ZWxsIG1hdGNoIHRoZSBjYWxsZXIuCisJIENvbnZlcnRpbmcgZnJvbSBhZGRyIHRvIGluZXRfbnRvYSBhbmQgYmFjayBhZ2FpbiBpcyBhIGJpdCBvZiBhIGtsdWRnZSwgYnV0CisJIGdldGhvc3Rwb29wIHdhbnRzIGEgc3RyaW5nIGFuZCB0aGVyZSdzIG11Y2ggZ25hcmxpZXIgY29kZSBvdXQgdGhlcmUgYWxyZWFkeSwKKwkgc28gSSBkb24ndCBmZWVsIGJhZC4KKwkgVGhlICpyZWFsKiBxdWVzdGlvbiBpcyB3aHkgQkZEIHNvY2tldHMgd2Fzbid0IGRlc2lnbmVkIHRvIGFsbG93IGxpc3RlbnMgZm9yCisJIGNvbm5lY3Rpb25zICpmcm9tKiBzcGVjaWZpYyBob3N0cy9wb3J0cywgaW5zdGVhZCBvZiByZXF1aXJpbmcgdGhlIGNhbGxlciB0bworCSBhY2NlcHQgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZW4gcmVqZWN0IHVuZGVzaXJlYWJsZSBvbmVzIGJ5IGNsb3NpbmcuCisJIEluIG90aGVyIHdvcmRzLCB3ZSBuZWVkIGEgVENQIE1TR19QRUVLLiAqLworCS8qIGJib3g6IHJlbW92ZWQgbW9zdCBvZiBpdCAqLworCQlsY2xhZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJm91cmFkZHItPnUuc2EpOworCQlyZW1hZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJnJlbWVuZC51LnNhKTsKKwkJcmVtaG9zdG5hbWUgPSBvX25mbGFnID8gcmVtYWRkciA6IHhtYWxsb2Nfc29ja2FkZHIyaG9zdCgmcmVtZW5kLnUuc2EpOworCQlmcHJpbnRmKHN0ZGVyciwgImNvbm5lY3QgdG8gJXMgZnJvbSAlcyAoJXMpXG4iLAorCQkJCWxjbGFkZHIsIHJlbWhvc3RuYW1lLCByZW1hZGRyKTsKKwkJZnJlZShsY2xhZGRyKTsKKwkJZnJlZShyZW1hZGRyKTsKKwkJaWYgKCFvX25mbGFnKQorCQkJZnJlZShyZW1ob3N0bmFtZSk7CisJfQorfQorCisvKiB1ZHB0ZXN0OgorIGZpcmUgYSBjb3VwbGUgb2YgcGFja2V0cyBhdCBhIFVEUCB0YXJnZXQgcG9ydCwganVzdCB0byBzZWUgaWYgaXQncyByZWFsbHkKKyB0aGVyZS4gIE9uIEJTRCBrZXJuZWxzLCBJQ01QIGhvc3QvcG9ydC11bnJlYWNoYWJsZSBlcnJvcnMgZ2V0IGRlbGl2ZXJlZCB0bworIG91ciBzb2NrZXQgYXMgRUNPTk5SRUZVU0VEIHdyaXRlIGVycm9ycy4gIE9uIFNWIGtlcm5lbHMsIHdlIGxvc2U7IHdlJ2xsIGhhdmUKKyB0byBjb2xsZWN0IGFuZCBhbmFseXplIHJhdyBJQ01QIG91cnNlbHZlcyBhIGxhIHNhdGFuJ3MgcHJvYmVfdWRwX3BvcnRzCisgYmFja2VuZC4gIEd1ZXNzIHdoZXJlIG9uZSBjb3VsZCBzd2lwZSB0aGUgYXBwcm9wcmlhdGUgY29kZSBmcm9tLi4uCisKKyBVc2UgdGhlIHRpbWUgZGVsYXkgYmV0d2VlbiB3cml0ZXMgaWYgZ2l2ZW4sIG90aGVyd2lzZSB1c2UgdGhlICJ0Y3AgcGluZyIKKyB0cmljayBmb3IgZ2V0dGluZyB0aGUgUlRULiAgW0kgZ290IHRoYXQgaWRlYSBmcm9tIHBsdXZpdXMsIGFuZCB3YXJwZWQgaXQuXQorIFJldHVybiBlaXRoZXIgdGhlIG9yaWdpbmFsIGZkLCBvciBjbGVhbiB1cCBhbmQgcmV0dXJuIC0xLiAqLworI2lmIEVOQUJMRV9OQ19FWFRSQQorc3RhdGljIGludCB1ZHB0ZXN0KHZvaWQpCit7CisJaW50IHJyOworCisJcnIgPSB3cml0ZShuZXRmZCwgYmlnYnVmX2luLCAxKTsKKwlpZiAocnIgIT0gMSkKKwkJYmJfcGVycm9yX21zZygidWRwdGVzdCBmaXJzdCB3cml0ZSIpOworCisJaWYgKG9fd2FpdCkKKwkJc2xlZXAob193YWl0KTsgLy8gY2FuIGJlIGludGVycnVwdGVkISB3aGlsZSAodCkgbmFub3NsZWVwKCZ0KT8KKwllbHNlIHsKKwkvKiB1c2UgdGhlIHRjcC1waW5nIHRyaWNrOiB0cnkgY29ubmVjdGluZyB0byBhIG5vcm1hbGx5IHJlZnVzZWQgcG9ydCwgd2hpY2gKKwkgY2F1c2VzIHVzIHRvIGJsb2NrIGZvciB0aGUgdGltZSB0aGF0IFNZTiBnZXRzIHRoZXJlIGFuZCBSU1QgZ2V0cyBiYWNrLgorCSBOb3QgY29tcGxldGVseSByZWxpYWJsZSwgYnV0IGl0ICpkb2VzKiBtb3N0bHkgd29yay4gKi8KKwkvKiBTZXQgYSB0ZW1wb3JhcnkgY29ubmVjdCB0aW1lb3V0LCBzbyBwYWNrZXQgZmlsdHJhdGlvbiBkb2VzbnQgY2F1c2UKKwkgdXMgdG8gaGFuZyBmb3JldmVyLCBhbmQgaGl0IGl0ICovCisJCW9fd2FpdCA9IDU7ICAgICAgICAgICAgICAgICAgICAgLyogZW5vdWdoIHRoYXQgd2UnbGwgbm90aWNlPz8gKi8KKwkJcnIgPSB4c29ja2V0KG91cmFkZHItPnUuc2Euc2FfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCk7CisJCXNldF9ucG9ydCgmdGhlbWFkZHItPnUuc2EsIGh0b25zKFNMRUFaRV9QT1JUKSk7CisJCWNvbm5lY3Rfd190aW1lb3V0KHJyKTsKKwkJLyogZG9uJ3QgbmVlZCB0byByZXN0b3JlIHRoZW1hZGRyJ3MgcG9ydCwgaXQncyBub3QgdXNlZCBhbnltb3JlICovCisJCWNsb3NlKHJyKTsKKwkJb193YWl0ID0gMDsgLyogcmVzdG9yZSAqLworCX0KKworCXJyID0gd3JpdGUobmV0ZmQsIGJpZ2J1Zl9pbiwgMSk7CisJcmV0dXJuIChyciAhPSAxKTsgLyogaWYgcnIgPT0gMSwgcmV0dXJuIDAgKHN1Y2Nlc3MpICovCit9CisjZWxzZQoraW50IHVkcHRlc3Qodm9pZCk7CisjZW5kaWYKKworLyogb3ByaW50OgorIEhleGR1bXAgYnl0ZXMgc2hvdmVsZWQgZWl0aGVyIHdheSB0byBhIHJ1bm5pbmcgbG9nZmlsZSwgaW4gdGhlIGZvcm1hdDoKKyBEIG9mZnNldCAgICAgICAtICAtIC0gLSAtLS0gMTYgYnl0ZXMgLS0tIC0gLSAtICAtICAgICAjIC4uLi4gYXNjaWkgLi4uLi4KKyB3aGVyZSAid2hpY2giIHNldHMgdGhlIGRpcmVjdGlvbiBpbmRpY2F0b3IsIEQ6CisgMCAtLSBzZW50IHRvIG5ldHdvcmssIG9yICI+IgorIDEgLS0gcmN2ZCBhbmQgcHJpbnRlZCB0byBzdGRvdXQsIG9yICI8IgorIGFuZCAiYnVmIiBhbmQgIm4iIGFyZSBkYXRhLWJsb2NrIGFuZCBsZW5ndGguICBJZiB0aGUgY3VycmVudCBibG9jayBnZW5lcmF0ZXMKKyBhIHBhcnRpYWwgbGluZSwgc28gYmUgaXQ7IHdlICp3YW50KiB0aGF0IGxvY2tzdGVwIGluZGljYXRpb24gb2Ygd2hvIHNlbnQKKyB3aGF0IHdoZW4uICBBZGFwdGVkIGZyb20gZGdhdWRldCdzIG9yaWdpbmFsIGV4YW1wbGUgLS0gYnV0IG11c3QgYmUgcmlwcGluZworICpmYXN0Kiwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBiZSB0b28gZGlzay1ib3VuZC4uLiAqLworI2lmIEVOQUJMRV9OQ19FWFRSQQorc3RhdGljIHZvaWQgb3ByaW50KGludCBkaXJlY3Rpb24sIHVuc2lnbmVkIGNoYXIgKnAsIHVuc2lnbmVkIGJjKQoreworCXVuc2lnbmVkIG9iYzsgICAgICAgICAgIC8qIGN1cnJlbnQgImdsb2JhbCIgb2Zmc2V0ICovCisJdW5zaWduZWQgeDsKKwl1bnNpZ25lZCBjaGFyICpvcDsgICAgICAvKiBvdXQgaGV4ZHVtcCBwdHIgKi8KKwl1bnNpZ25lZCBjaGFyICphcDsgICAgICAvKiBvdXQgYXNjLWR1bXAgcHRyICovCisJdW5zaWduZWQgY2hhciBzdGFnZVsxMDBdOworCisJaWYgKGJjID09IDApCisJCXJldHVybjsKKworCW9iYyA9IHdyb3RlX25ldDsgLyogdXNlIHRoZSBnbG9iYWxzISAqLworCWlmIChkaXJlY3Rpb24gPT0gJzwnKQorCQlvYmMgPSB3cm90ZV9vdXQ7CisJc3RhZ2VbMF0gPSBkaXJlY3Rpb247CisJc3RhZ2VbNTldID0gJyMnOyAvKiBwcmVsb2FkIHNlcGFyYXRvciAqLworCXN0YWdlWzYwXSA9ICcgJzsKKworCWRvIHsgICAgLyogZm9yIGNodW5rLW8tZGF0YSAuLi4gKi8KKwkJeCA9IDE2OworCQlpZiAoYmMgPCAxNikgeworCQkJLyogbWVtc2V0KCZzdGFnZVtiYyozICsgMTFdLCAnICcsIDE2KjMgLSBiYyozKTsgKi8KKwkJCW1lbXNldCgmc3RhZ2VbMTFdLCAnICcsIDE2KjMpOworCQkJeCA9IGJjOworCQl9CisJCXNwcmludGYoKGNoYXIgKikmc3RhZ2VbMV0sICIgJTguOHggIiwgb2JjKTsgIC8qIHh4eDogc3RpbGwgc2xvdz8gKi8KKwkJYmMgLT0geDsgICAgICAgICAgLyogZml4IGN1cnJlbnQgY291bnQgKi8KKwkJb2JjICs9IHg7ICAgICAgICAgLyogZml4IGN1cnJlbnQgb2Zmc2V0ICovCisJCW9wID0gJnN0YWdlWzExXTsgIC8qIHdoZXJlIGhleCBzdGFydHMgKi8KKwkJYXAgPSAmc3RhZ2VbNjFdOyAgLyogd2hlcmUgYXNjaWkgc3RhcnRzICovCisKKwkJZG8geyAgLyogZm9yIGxpbmUgb2YgZHVtcCwgaG93ZXZlciBsb25nIC4uLiAqLworCQkJKm9wKysgPSAweDIwIHwgYmJfaGV4ZGlnaXRzX3VwY2FzZVsqcCA+PiA0XTsKKwkJCSpvcCsrID0gMHgyMCB8IGJiX2hleGRpZ2l0c191cGNhc2VbKnAgJiAweDBmXTsKKwkJCSpvcCsrID0gJyAnOworCQkJaWYgKCgqcCA+IDMxKSAmJiAoKnAgPCAxMjcpKQorCQkJCSphcCA9ICpwOyAgIC8qIHByaW50aW5nICovCisJCQllbHNlCisJCQkJKmFwID0gJy4nOyAgLyogbm9ucHJpbnRpbmcsIGxvb3NlIGRlZiAqLworCQkJYXArKzsKKwkJCXArKzsKKwkJfSB3aGlsZSAoLS14KTsKKwkJKmFwKysgPSAnXG4nOyAgLyogZmluaXNoIHRoZSBsaW5lICovCisJCXh3cml0ZShvZmQsIHN0YWdlLCBhcCAtIHN0YWdlKTsKKwl9IHdoaWxlIChiYyk7Cit9CisjZWxzZQordm9pZCBvcHJpbnQoaW50IGRpcmVjdGlvbiwgdW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgYmMpOworI2VuZGlmCisKKy8qIHJlYWR3cml0ZToKKyBoYW5kbGUgc3RkaW4vc3Rkb3V0L25ldHdvcmsgSS9PLiAgQndhaGFoYSEhIC0tIHRoZSBzZWxlY3QgbG9vcCBmcm9tIGhlbGwuCisgSW4gdGhpcyBpbnN0YW5jZSwgcmV0dXJuIHdoYXQgbWlnaHQgYmVjb21lIG91ciBleGl0IHN0YXR1cy4gKi8KK3N0YXRpYyBpbnQgcmVhZHdyaXRlKHZvaWQpCit7CisJaW50IHJyOworCWNoYXIgKnpwID0genA7IC8qIGdjYyAqLyAgLyogc3RkaW4gYnVmIHB0ciAqLworCWNoYXIgKm5wID0gbnA7ICAgICAgICAgICAgLyogbmV0LWluIGJ1ZiBwdHIgKi8KKwl1bnNpZ25lZCByemxlZnQ7CisJdW5zaWduZWQgcm5sZWZ0OworCXVuc2lnbmVkIG5ldHJldHJ5OyAgICAgICAgICAgICAgLyogbmV0LXJlYWQgcmV0cnkgY291bnRlciAqLworCXVuc2lnbmVkIHdyZXRyeTsgICAgICAgICAgICAgICAgLyogbmV0LXdyaXRlIHNhbml0eSBjb3VudGVyICovCisJdW5zaWduZWQgd2ZpcnN0OyAgICAgICAgICAgICAgICAvKiBvbmUtc2hvdCBmbGFnIHRvIHNraXAgZmlyc3QgbmV0IHJlYWQgKi8KKworCS8qIGlmIHlvdSBkb24ndCBoYXZlIGFsbCB0aGlzIEZEXyogbWFjcm8gaGFpciBpbiBzeXMvdHlwZXMuaCwgeW91J2xsIGhhdmUgdG8KKwkgZWl0aGVyIGZpbmQgaXQgb3IgZG8geW91ciBvd24gYml0LWJhc2hpbmc6ICpkaW5nMSB8PSAoMSA8PCBmZCksIGV0Yy4uLiAqLworCUZEX1NFVChuZXRmZCwgJmRpbmcxKTsgICAgICAgICAgICAgICAgLyogZ2xvYmFsOiB0aGUgbmV0IGlzIG9wZW4gKi8KKwluZXRyZXRyeSA9IDI7CisJd2ZpcnN0ID0gMDsKKwlyemxlZnQgPSBybmxlZnQgPSAwOworCWlmIChvX2ludGVydmFsKQorCQlzbGVlcChvX2ludGVydmFsKTsgICAgICAgICAgICAgICAgLyogcGF1c2UgKmJlZm9yZSogc2VuZGluZyBzdHVmZiwgdG9vICovCisKKwllcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgZnJvbSBzbGVlcCwgY2xvc2UsIHdoYXRldmVyICovCisJLyogYW5kIG5vdyB0aGUgYmlnIG9sJyBzZWxlY3Qgc2hvdmVsaW5nIGxvb3AgLi4uICovCisJd2hpbGUgKEZEX0lTU0VUKG5ldGZkLCAmZGluZzEpKSB7ICAgICAgICAvKiBpLmUuIHRpbGwgdGhlICpuZXQqIGNsb3NlcyEgKi8KKwkJd3JldHJ5ID0gODIwMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3JlIHRoYW4gd2UnbGwgZXZlciBoYWZ0YSB3cml0ZSAqLworCQlpZiAod2ZpcnN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55IHNhdmVkIHN0ZGluIGJ1ZmZlcj8gKi8KKwkJCXdmaXJzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgZmxhZyBmb3IgdGhlIGR1cmF0aW9uICovCisJCQlnb3RvIHNob3ZlbDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZ28gaGFuZGxlIGl0IGZpcnN0ICovCisJCX0KKwkJZGluZzIgPSBkaW5nMTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRF9DT1BZIGFpbid0IHBvcnRhYmxlLi4uICovCisJLyogc29tZSBzeXN0ZW1zLCBub3RhYmx5IGxpbnV4LCBjcmFwIGludG8gdGhlaXIgc2VsZWN0IHRpbWVycyBvbiByZXR1cm4sIHNvCisJIHdlIGNyZWF0ZSBhIGV4cGVuZGFibGUgY29weSBhbmQgZ2l2ZSAqdGhhdCogdG8gc2VsZWN0LiAgKi8KKwkJaWYgKG9fd2FpdCkgeworCQkJc3RydWN0IHRpbWV2YWwgdG1wX3RpbWVyOworCQkJdG1wX3RpbWVyLnR2X3NlYyA9IG9fd2FpdDsKKwkJCXRtcF90aW1lci50dl91c2VjID0gMDsKKwkJLyogaGlnaGVzdCBwb3NzaWJsZSBmZCBpcyBuZXRmZCAoMykgKi8KKwkJCXJyID0gc2VsZWN0KG5ldGZkKzEsICZkaW5nMiwgTlVMTCwgTlVMTCwgJnRtcF90aW1lcik7CisJCX0gZWxzZQorCQkJcnIgPSBzZWxlY3QobmV0ZmQrMSwgJmRpbmcyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHJyIDwgMCAmJiBlcnJubyAhPSBFSU5UUikgeyAgICAgICAgICAgICAgICAvKiBtaWdodCBoYXZlIGdvdHRlbiBeWmVkLCBldGMgKi8KKwkJCWhvbGxlcl9wZXJyb3IoInNlbGVjdCIpOworCQkJY2xvc2UobmV0ZmQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkvKiBpZiB3ZSBoYXZlIGEgdGltZW91dCBBTkQgc3RkaW4gaXMgY2xvc2VkIEFORCB3ZSBoYXZlbid0IGhlYXJkIGFueXRoaW5nCisJIGZyb20gdGhlIG5ldCBkdXJpbmcgdGhhdCB0aW1lLCBhc3N1bWUgaXQncyBkZWFkIGFuZCBjbG9zZSBpdCB0b28uICovCisJCWlmIChyciA9PSAwKSB7CisJCQlpZiAoIUZEX0lTU0VUKFNURElOX0ZJTEVOTywgJmRpbmcxKSkKKwkJCQluZXRyZXRyeS0tOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGFjdHVhbGx5IHRyeSBhIGNvdXBsYSB0aW1lcy4gKi8KKwkJCWlmICghbmV0cmV0cnkpIHsKKwkJCQlpZiAob192ZXJib3NlID4gMSkgICAgICAgICAgICAgICAgLyogbm9ybWFsbHkgd2UgZG9uJ3QgY2FyZSAqLworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIm5ldCB0aW1lb3V0XG4iKTsKKwkJCQljbG9zZShuZXRmZCk7CisJCQkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGFuIGVycm9yISAqLworCQkJfQorCQl9IC8qIHNlbGVjdCB0aW1lb3V0ICovCisJLyogeHh4OiBzaG91bGQgd2UgY2hlY2sgdGhlIGV4Y2VwdGlvbiBmZHMgdG9vPyAgVGhlIHJlYWQgZmRzIHNlZW0gdG8gZ2l2ZQorCSB1cyB0aGUgcmlnaHQgaW5mbywgYW5kIG5vbmUgb2YgdGhlIGV4YW1wbGVzIEkgZm91bmQgYm90aGVyZWQuICovCisKKwkvKiBEaW5nISEgIFNvbWV0aGluZyBhcnJpdmVkLCBnbyBjaGVjayBhbGwgdGhlIGluY29taW5nIGhvcHBlcnMsIG5ldCBmaXJzdCAqLworCQlpZiAoRkRfSVNTRVQobmV0ZmQsICZkaW5nMikpIHsgICAgICAgICAgICAgICAgLyogbmV0OiBkaW5nISAqLworCQkJcnIgPSByZWFkKG5ldGZkLCBiaWdidWZfbmV0LCBCSUdTSVopOworCQkJaWYgKHJyIDw9IDApIHsKKwkJCQlpZiAocnIgPCAwICYmIG9fdmVyYm9zZSA+IDEpIHsKKwkJCQkJLyogbmMgMS4xMCBkb2Vzbid0IGRvIHRoaXMgKi8KKwkJCQkJYmJfcGVycm9yX21zZygibmV0IHJlYWQiKTsKKwkJCQl9CisJCQkJRkRfQ0xSKG5ldGZkLCAmZGluZzEpOyAgICAgICAgICAgICAgICAvKiBuZXQgY2xvc2VkLCB3ZSdsbCBmaW5pc2ggdXAuLi4gKi8KKwkJCQlyemxlZnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbid0IHdyaXRlIGFueW1vcmU6IGJyb2tlbiBwaXBlICovCisJCQl9IGVsc2UgeworCQkJCXJubGVmdCA9IHJyOworCQkJCW5wID0gYmlnYnVmX25ldDsKKwkJCX0KK0RlYnVnKCJnb3QgJWQgZnJvbSB0aGUgbmV0LCBlcnJubyAlZCIsIHJyLCBlcnJubyk7CisJCX0gLyogbmV0OmRpbmcgKi8KKworCS8qIGlmIHdlJ3JlIGluICJzbG93bHkiIG1vZGUgdGhlcmUncyBwcm9iYWJseSBzdGlsbCBzdHVmZiBpbiB0aGUgc3RkaW4KKwkgYnVmZmVyLCBzbyBkb24ndCByZWFkIHVubGVzcyB3ZSByZWFsbHkgbmVlZCBNT1JFIElOUFVUISAgTU9SRSBJTlBVVCEgKi8KKwkJaWYgKHJ6bGVmdCkKKwkJCWdvdG8gc2hvdmVsOworCisJLyogb2theSwgc3VjayBtb3JlIHN0ZGluICovCisJCWlmIChGRF9JU1NFVChTVERJTl9GSUxFTk8sICZkaW5nMikpIHsgICAgICAgICAgICAgICAgLyogc3RkaW46IGRpbmchICovCisJCQlyciA9IHJlYWQoU1RESU5fRklMRU5PLCBiaWdidWZfaW4sIEJJR1NJWik7CisJLyogQ29uc2lkZXJlZCBtYWtpbmcgcmVhZHMgaGVyZSBzbWFsbGVyIGZvciBVRFAgbW9kZSwgYnV0IDgxOTItYnl0ZQorCSBtb2J5Z3JhbXMgYXJlIGtpbmRhIGZ1biBhbmQgZXhlcmNpc2UgdGhlIHJlYXNzZW1ibGVyLiAqLworCQkJaWYgKHJyIDw9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdCBlbmQsIG9yIGZ1a3QsIG9yIC4uLiAqLworCQkJCUZEX0NMUihTVERJTl9GSUxFTk8sICZkaW5nMSk7ICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgYW5kIGNsb3NlIHN0ZGluICovCisJCQkJY2xvc2UoU1RESU5fRklMRU5PKTsKKy8vIERvZXMgaXQgbWFrZSBzZW5zZSB0byBzaHV0ZG93bihuZXRfZmQsIFNIVVRfV1IpCisvLyB0byBsZXQgb3RoZXIgc2lkZSBrbm93IHRoYXQgd2Ugd29uJ3Qgd3JpdGUgYW55dGhpbmcgYW55bW9yZT8KKy8vIChhbmQgd2hhdCBhYm91dCBrZWVwaW5nIGNvbXBhdCBpZiB3ZSBkbyB0aGF0PykKKwkJCX0gZWxzZSB7CisJCQkJcnpsZWZ0ID0gcnI7CisJCQkJenAgPSBiaWdidWZfaW47CisJCQl9CisJCX0gLyogc3RkaW46ZGluZyAqLworIHNob3ZlbDoKKwkvKiBub3cgdGhhdCB3ZSd2ZSBkaW5nZG9uZ2VkIGFsbCBvdXIgdGhpbmdkaW5ncywgc2VuZCBvZmYgdGhlIHJlc3VsdHMuCisJIEdlZXosIHdoeSBkb2VzIHRoaXMgbG9vayBhbiBhd2Z1bCBsb3QgbGlrZSB0aGUgYmlnIGxvb3AgaW4gInJzaCI/IC4uLgorCSBub3Qgc3VyZSBpZiB0aGUgb3JkZXIgb2YgdGhpcyBtYXR0ZXJzLCBidXQgd3JpdGUgbmV0IC0+IHN0ZG91dCBmaXJzdC4gKi8KKworCS8qIHNhbml0eSBjaGVjay4gIFdvcmtzIGJlY2F1c2UgdGhleSdyZSBib3RoIHVuc2lnbmVkLi4uICovCisJCWlmICgocnpsZWZ0ID4gODIwMCkgfHwgKHJubGVmdCA+IDgyMDApKSB7CisJCQlob2xsZXJfZXJyb3IoImJvZ3VzIGJ1ZmZlcnM6ICV1LCAldSIsIHJ6bGVmdCwgcm5sZWZ0KTsKKwkJCXJ6bGVmdCA9IHJubGVmdCA9IDA7CisJCX0KKwkvKiBuZXQgd3JpdGUgcmV0cmllcyBzb21ldGltZXMgaGFwcGVuIG9uIFVEUCBjb25uZWN0aW9ucyAqLworCQlpZiAoIXdyZXRyeSkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIHNvbWV0aGluZyBodW5nPyAqLworCQkJaG9sbGVyX2Vycm9yKCJ0b28gbWFueSBvdXRwdXQgcmV0cmllcyIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHJubGVmdCkgeworCQkJcnIgPSB3cml0ZShTVERPVVRfRklMRU5PLCBucCwgcm5sZWZ0KTsKKwkJCWlmIChyciA+IDApIHsKKwkJCQlpZiAob19vZmlsZSkgLyogbG9nIHRoZSBzdGRvdXQgKi8KKwkJCQkJb3ByaW50KCc8JywgKHVuc2lnbmVkIGNoYXIgKilucCwgcnIpOworCQkJCW5wICs9IHJyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeCB1cCBwdHJzIGFuZCB3aGF0bm90ICovCisJCQkJcm5sZWZ0IC09IHJyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpbGwgZ2V0IHNhbml0eS1jaGVja2VkIGFib3ZlICovCisJCQkJd3JvdGVfb3V0ICs9IHJyOyAgICAgICAgICAgICAgICAvKiBnbG9iYWwgY291bnQgKi8KKwkJCX0KK0RlYnVnKCJ3cm90ZSAlZCB0byBzdGRvdXQsIGVycm5vICVkIiwgcnIsIGVycm5vKTsKKwkJfSAvKiBybmxlZnQgKi8KKwkJaWYgKHJ6bGVmdCkgeworCQkJaWYgKG9faW50ZXJ2YWwpICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gInNsb3dseSIgbW9kZSA/PyAqLworCQkJCXJyID0gZmluZGxpbmUoenAsIHJ6bGVmdCk7CisJCQllbHNlCisJCQkJcnIgPSByemxlZnQ7CisJCQlyciA9IHdyaXRlKG5ldGZkLCB6cCwgcnIpOyAgICAgICAgLyogb25lIGxpbmUsIG9yIHRoZSB3aG9sZSBidWZmZXIgKi8KKwkJCWlmIChyciA+IDApIHsKKwkJCQlpZiAob19vZmlsZSkgLyogbG9nIHdoYXQgZ290IHNlbnQgKi8KKwkJCQkJb3ByaW50KCc+JywgKHVuc2lnbmVkIGNoYXIgKil6cCwgcnIpOworCQkJCXpwICs9IHJyOworCQkJCXJ6bGVmdCAtPSBycjsKKwkJCQl3cm90ZV9uZXQgKz0gcnI7ICAgICAgICAgICAgICAgIC8qIGdsb2JhbCBjb3VudCAqLworCQkJfQorRGVidWcoIndyb3RlICVkIHRvIG5ldCwgZXJybm8gJWQiLCByciwgZXJybm8pOworCQl9IC8qIHJ6bGVmdCAqLworCQlpZiAob19pbnRlcnZhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xlIGJldHdlZW4gc2xvdyBsaW5lcywgb3IgLi4uICovCisJCQlzbGVlcChvX2ludGVydmFsKTsKKwkJCWVycm5vID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBmcm9tIHNsZWVwICovCisJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiAuLi53aXRoIGhhaXJ5IHNlbGVjdCBsb29wLi4uICovCisJCX0KKwkJaWYgKChyemxlZnQpIHx8IChybmxlZnQpKSB7ICAgICAgICAgICAgICAgIC8qIHNob3ZlbCB0aGF0IHNoaXQgdGlsbCB0aGV5IGFpbid0ICovCisJCQl3cmV0cnktLTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBub25lIGxlZnQsIGFuZCBnZXQgYW5vdGhlciBsb2FkICovCisJCQlnb3RvIHNob3ZlbDsKKwkJfQorCX0gLyogd2hpbGUgZGluZzE6bmV0ZmQgaXMgb3BlbiAqLworCisJLyogWFhYOiBtYXliZSB3YW50IGEgbW9yZSBncmFjZWZ1bCBzaHV0ZG93bigpIGhlcmUsIG9yIHNjcmV3IGFyb3VuZCB3aXRoCisJIGxpbmdlciB0aW1lcz8/ICBJIHN1c3BlY3QgdGhhdCBJIGRvbid0IG5lZWQgdG8gc2luY2UgSSdtIGFsd2F5cyBkb2luZworCSBibG9ja2luZyByZWFkcyBhbmQgd3JpdGVzIGFuZCBteSBvd24gbWFudWFsICJsYXN0IGRpdGNoIiBlZmZvcnRzIHRvIHJlYWQKKwkgdGhlIG5ldCBhZ2FpbiBhZnRlciBhIHRpbWVvdXQuICBJIGhhdmVuJ3Qgc2VlbiBhbnkgc2NyZXd1cHMgeWV0LCBidXQgaXQncworCSBub3QgbGlrZSBteSB0ZXN0IG5ldHdvcmsgaXMgcGFydGljdWxhcmx5IGJ1c3kuLi4gKi8KKwljbG9zZShuZXRmZCk7CisJcmV0dXJuIDA7Cit9IC8qIHJlYWR3cml0ZSAqLworCisvKiBtYWluOiBub3cgd2UgcHVsbCBpdCBhbGwgdG9nZXRoZXIuLi4gKi8KK2ludCBuY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbmNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnN0cl9wLCAqc3RyX3M7CisJSUZfTkNfRVhUUkEoY2hhciAqc3RyX2ksICpzdHJfbzspCisJY2hhciAqdGhlbWRvdHRlZCA9IHRoZW1kb3R0ZWQ7IC8qIGdjYyAqLworCWNoYXIgKipwcm9nZ2llOworCWludCB4OworCXVuc2lnbmVkIG9fbHBvcnQgPSAwOworCisJSU5JVF9HKCk7CisKKwkvKiBjYXRjaCBhIHNpZ25hbCBvciB0d28gZm9yIGNsZWFudXAgKi8KKwliYl9zaWduYWxzKDAKKwkJKyAoMSA8PCBTSUdJTlQpCisJCSsgKDEgPDwgU0lHUVVJVCkKKwkJKyAoMSA8PCBTSUdURVJNKQorCQksIGNhdGNoKTsKKwkvKiBhbmQgc3VwcHJlc3Mgb3RoZXJzLi4uICovCisJYmJfc2lnbmFscygwCisjaWZkZWYgU0lHVVJHCisJCSsgKDEgPDwgU0lHVVJHKQorI2VuZGlmCisJCSsgKDEgPDwgU0lHUElQRSkgLyogaW1wb3J0YW50ISAqLworCQksIFNJR19JR04pOworCisJcHJvZ2dpZSA9IGFyZ3Y7CisJd2hpbGUgKCorK3Byb2dnaWUpIHsKKwkJaWYgKHN0cmNtcCgqcHJvZ2dpZSwgIi1lIikgPT0gMCkgeworCQkJKnByb2dnaWUgPSBOVUxMOworCQkJcHJvZ2dpZSsrOworCQkJZ290byBlX2ZvdW5kOworCQl9CisJfQorCXByb2dnaWUgPSBOVUxMOworIGVfZm91bmQ6CisKKwkvLyAtZyAtRyAtdCAtciBkZWxldGVkLCB1bmltcGxlbWVudGVkIC1hIGRlbGV0ZWQgdG9vCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzI6dnY6dysiOyAvKiBtYXggMiBwYXJhbXM7IC12IGlzIGEgY291bnRlcjsgLXcgTiAqLworCWdldG9wdDMyKGFyZ3YsICJobnA6czp1dnc6IiBJRl9OQ19TRVJWRVIoImwiKQorCQkJSUZfTkNfRVhUUkEoImk6bzp6IiksCisJCQkmc3RyX3AsICZzdHJfcywgJm9fd2FpdAorCQkJSUZfTkNfRVhUUkEoLCAmc3RyX2ksICZzdHJfbyksICZvX3ZlcmJvc2UpOworCWFyZ3YgKz0gb3B0aW5kOworI2lmIEVOQUJMRV9OQ19FWFRSQQorCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2kpIC8qIGxpbmUtaW50ZXJ2YWwgdGltZSAqLworCQlvX2ludGVydmFsID0geGF0b3VfcmFuZ2Uoc3RyX2ksIDEsIDB4ZmZmZik7CisjZW5kaWYKKwkvL2lmIChvcHRpb25fbWFzazMyICYgT1BUX2wpIC8qIGxpc3RlbiBtb2RlICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF9uKSAvKiBudW1lcmljLW9ubHksIG5vIEROUyBsb29rdXBzICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF9vKSAvKiBoZXhkdW1wIGxvZyAqLworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3ApIHsgLyogbG9jYWwgc291cmNlIHBvcnQgKi8KKwkJb19scG9ydCA9IGJiX2xvb2t1cF9wb3J0KHN0cl9wLCBvX3VkcG1vZGUgPyAidWRwIiA6ICJ0Y3AiLCAwKTsKKwkJaWYgKCFvX2xwb3J0KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBsb2NhbCBwb3J0ICclcyciLCBzdHJfcCk7CisJfQorCS8vaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcikgLyogcmFuZG9taXplIHZhcmlvdXMgdGhpbmdzICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF91KSAvKiB1c2UgVURQICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF92KSAvKiB2ZXJib3NlICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF93KSAvKiB3YWl0IHRpbWUgKi8KKwkvL2lmIChvcHRpb25fbWFzazMyICYgT1BUX3opIC8qIGxpdHRsZSBvciBubyBkYXRhIHhmZXIgKi8KKworCS8qIFdlIG1hbmFnZSBvdXIgZmQncyBzbyB0aGF0IHRoZXkgYXJlIG5ldmVyIDAsMSwyICovCisJLypiYl9zYW5pdGl6ZV9zdGRpbygpOyAtIG5vdCBuZWVkZWQgKi8KKworCWlmIChhcmd2WzBdKSB7CisJCXRoZW1hZGRyID0geGhvc3Qyc29ja2FkZHIoYXJndlswXSwKKwkJCWFyZ3ZbMV0KKwkJCT8gYmJfbG9va3VwX3BvcnQoYXJndlsxXSwgb191ZHBtb2RlID8gInVkcCIgOiAidGNwIiwgMCkKKwkJCTogMCk7CisJfQorCisJLyogY3JlYXRlICYgYmluZCBuZXR3b3JrIHNvY2tldCAqLworCXggPSAob191ZHBtb2RlID8gU09DS19ER1JBTSA6IFNPQ0tfU1RSRUFNKTsKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9zKSB7IC8qIGxvY2FsIGFkZHJlc3MgKi8KKwkJLyogaWYgb19scG9ydCBpcyBzdGlsbCAwLCB0aGVuIHdlIHdpbGwgdXNlIHJhbmRvbSBwb3J0ICovCisJCW91cmFkZHIgPSB4aG9zdDJzb2NrYWRkcihzdHJfcywgb19scG9ydCk7CisjaWZkZWYgQkxPQVQKKwkJLyogcHJldmVudCBzcHVyaW91cyAiVURQIGxpc3RlbiBuZWVkcyAhMCBwb3J0IiAqLworCQlvX2xwb3J0ID0gZ2V0X25wb3J0KG91cmFkZHIpOworCQlvX2xwb3J0ID0gbnRvaHMob19scG9ydCk7CisjZW5kaWYKKwkJeCA9IHhzb2NrZXQob3VyYWRkci0+dS5zYS5zYV9mYW1pbHksIHgsIDApOworCX0gZWxzZSB7CisJCS8qIFdlIHRyeSBJUHY2LCB0aGVuIElQdjQsIHVubGVzcyBhZGRyIGZhbWlseSBpcworCQkgKiBpbXBsaWNpdGx5IHNldCBieSB3YXkgb2YgcmVtb3RlIGFkZHIvcG9ydCBzcGVjICovCisJCXggPSB4c29ja2V0X3R5cGUoJm91cmFkZHIsCisJCQkJKHRoZW1hZGRyID8gdGhlbWFkZHItPnUuc2Euc2FfZmFtaWx5IDogQUZfVU5TUEVDKSwKKwkJCQl4KTsKKwkJaWYgKG9fbHBvcnQpCisJCQlzZXRfbnBvcnQoJm91cmFkZHItPnUuc2EsIGh0b25zKG9fbHBvcnQpKTsKKwl9CisJeG1vdmVfZmQoeCwgbmV0ZmQpOworCXNldHNvY2tvcHRfcmV1c2VhZGRyKG5ldGZkKTsKKwlpZiAob191ZHBtb2RlKQorCQlzb2NrZXRfd2FudF9wa3RpbmZvKG5ldGZkKTsKKwlpZiAoIUVOQUJMRV9GRUFUVVJFX1VOSVhfTE9DQUwKKwkgfHwgb19saXN0ZW4KKwkgfHwgb3VyYWRkci0+dS5zYS5zYV9mYW1pbHkgIT0gQUZfVU5JWAorCSkgeworCQl4YmluZChuZXRmZCwgJm91cmFkZHItPnUuc2EsIG91cmFkZHItPmxlbik7CisJfQorI2lmIDAKKwlzZXRzb2Nrb3B0KG5ldGZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZvX3JjdmJ1Ziwgc2l6ZW9mIG9fcmN2YnVmKTsKKwlzZXRzb2Nrb3B0KG5ldGZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZvX3NuZGJ1Ziwgc2l6ZW9mIG9fc25kYnVmKTsKKyNlbmRpZgorCisjaWZkZWYgQkxPQVQKKwlpZiAoT1BUX2wgJiYgKG9wdGlvbl9tYXNrMzIgJiAoT1BUX3V8T1BUX2wpKSA9PSAoT1BUX3V8T1BUX2wpKSB7CisJCS8qIGFwcGFyZW50bHkgVURQIGNhbiBsaXN0ZW4gT04gInBvcnQgMCIsCisJCSBidXQgdGhhdCdzIG5vdCB1c2VmdWwgKi8KKwkJaWYgKCFvX2xwb3J0KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlVEUCBsaXN0ZW4gbmVlZHMgbm9uemVybyAtcCBwb3J0Iik7CisJfQorI2VuZGlmCisKKwlGRF9TRVQoU1RESU5fRklMRU5PLCAmZGluZzEpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0ZGluICppcyogaW5pdGlhbGx5IG9wZW4gKi8KKwlpZiAocHJvZ2dpZSkgeworCQljbG9zZSgwKTsgLyogd29uJ3QgbmVlZCBzdGRpbiAqLworCQlvcHRpb25fbWFzazMyICY9IH5PUFRfbzsgLyogLW8gd2l0aCAtZSBpcyBtZWFuaW5nbGVzcyEgKi8KKwl9CisjaWYgRU5BQkxFX05DX0VYVFJBCisJaWYgKG9fb2ZpbGUpCisJCXhtb3ZlX2ZkKHhvcGVuKHN0cl9vLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMpLCBvZmQpOworI2VuZGlmCisKKwlpZiAob19saXN0ZW4pIHsKKwkJZG9saXN0ZW4oKTsKKwkJLyogZG9saXN0ZW4gZG9lcyBpdHMgb3duIGNvbm5lY3QgcmVwb3J0aW5nICovCisJCWlmIChwcm9nZ2llKSAvKiAtZSBnaXZlbj8gKi8KKwkJCWRvZXhlYyhwcm9nZ2llKTsKKwkJeCA9IHJlYWR3cml0ZSgpOyAvKiBpdCBldmVuIHdvcmtzIHdpdGggVURQISAqLworCX0gZWxzZSB7CisJCS8qIE91dGJvdW5kIGNvbm5lY3RzLiAgTm93IHdlJ3JlIG1vcmUgcGlja3kgYWJvdXQgYXJncy4uLiAqLworCQlpZiAoIXRoZW1hZGRyKQorCQkJYmJfc2hvd191c2FnZSgpOworCisJCXJlbWVuZCA9ICp0aGVtYWRkcjsKKwkJaWYgKG9fdmVyYm9zZSkKKwkJCXRoZW1kb3R0ZWQgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmdGhlbWFkZHItPnUuc2EpOworCisJCXggPSBjb25uZWN0X3dfdGltZW91dChuZXRmZCk7CisJCWlmIChvX3plcm8gJiYgeCA9PSAwICYmIG9fdWRwbW9kZSkgICAgICAgIC8qIGlmIFVEUCBzY2FubmluZy4uLiAqLworCQkJeCA9IHVkcHRlc3QoKTsKKwkJaWYgKHggPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFlvdywgYXJlIHdlIE9QRU4gWUVUPyEgKi8KKwkJCWlmIChvX3ZlcmJvc2UpCisJCQkJZnByaW50ZihzdGRlcnIsICIlcyAoJXMpIG9wZW5cbiIsIGFyZ3ZbMF0sIHRoZW1kb3R0ZWQpOworCQkJaWYgKHByb2dnaWUpICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhlYyBpcyB2YWxpZCBmb3Igb3V0Ym91bmQsIHRvbyAqLworCQkJCWRvZXhlYyhwcm9nZ2llKTsKKwkJCWlmICghb196ZXJvKQorCQkJCXggPSByZWFkd3JpdGUoKTsKKwkJfSBlbHNlIHsgLyogY29ubmVjdCBvciB1ZHB0ZXN0IHdhc24ndCBzdWNjZXNzZnVsICovCisJCQl4ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgc3RhdHVzICovCisJCQkvKiBpZiB3ZSdyZSBzY2FubmluZyBhdCBhICJvbmUgLXYiIHZlcmJvc2l0eSBsZXZlbCwgZG9uJ3QgcHJpbnQgcmVmdXNhbHMuCisJCQkgR2l2ZSBpdCBhbm90aGVyIC12IGlmIHlvdSB3YW50IHRvIHNlZSBldmVyeXRoaW5nLiAqLworCQkJaWYgKG9fdmVyYm9zZSA+IDEgfHwgKG9fdmVyYm9zZSAmJiBlcnJubyAhPSBFQ09OTlJFRlVTRUQpKQorCQkJCWJiX3BlcnJvcl9tc2coIiVzICglcykiLCBhcmd2WzBdLCB0aGVtZG90dGVkKTsKKwkJfQorCX0KKwlpZiAob192ZXJib3NlID4gMSkgICAgICAgICAgICAgICAgLyogbm9ybWFsbHkgd2UgZG9uJ3QgY2FyZSAqLworCQlmcHJpbnRmKHN0ZGVyciwgU0VOVF9OX1JFQ1ZfTSwgd3JvdGVfbmV0LCB3cm90ZV9vdXQpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9uZXRzdGF0LmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL25ldHN0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzIzOTU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9uZXRzdGF0LmMKQEAgLTAsMCArMSw3NDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbmV0c3RhdCBpbXBsZW1lbnRhdGlvbihzKSBmb3IgYnVzeWJveAorICogYmFzZWQgaW4gcGFydCBvbiB0aGUgbmV0c3RhdCBpbXBsZW1lbnRhdGlvbiBmcm9tIG5ldC10b29scy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgQmFydCBWaXNzY2hlciA8bWFnaWNrQGxpbnV4LWZhbi5jb20+CisgKgorICogMjAwMi0wNC0yMAorICogSVBWNiBzdXBwb3J0IGFkZGVkIGJ5IEJhcnQgVmlzc2NoZXIgPG1hZ2lja0BsaW51eC1mYW4uY29tPgorICoKKyAqIDIwMDgtMDctMTAKKyAqIG9wdGlvbmFsICctcCcgZmxhZyBzdXBwb3J0IHBvcnRlZCBmcm9tIG5ldC10b29scyBieSBHLiBTb21sbyA8c29tbG9AY211LmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisKKy8vdXNhZ2U6I2RlZmluZSBuZXRzdGF0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLSJJRl9ST1VURSgiciIpImFsXSBbLXR1d3hdIFstZW4iSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoIlciKUlGX0ZFQVRVUkVfTkVUU1RBVF9QUkcoInAiKSJdIgorLy91c2FnZTojZGVmaW5lIG5ldHN0YXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IG5ldHdvcmtpbmcgaW5mb3JtYXRpb25cbiIKKy8vdXNhZ2U6CUlGX1JPVVRFKAorLy91c2FnZTogICAgICJcbgktcglSb3V0aW5nIHRhYmxlIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktYQlBbGwgc29ja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdGVuaW5nIHNvY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCQlFbHNlOiBjb25uZWN0ZWQgc29ja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJVENQIHNvY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCS11CVVEUCBzb2NrZXRzIgorLy91c2FnZTogICAgICJcbgktdwlSYXcgc29ja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJVW5peCBzb2NrZXRzIgorLy91c2FnZTogICAgICJcbgkJRWxzZTogYWxsIHNvY2tldCB0eXBlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJT3RoZXIvbW9yZSBpbmZvcm1hdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3QgcmVzb2x2ZSBuYW1lcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTkVUU1RBVF9XSURFKAorLy91c2FnZTogICAgICJcbgktVwlXaWRlIGRpc3BsYXkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX05FVFNUQVRfUFJHKAorLy91c2FnZTogICAgICJcbgktcAlTaG93IFBJRC9wcm9ncmFtIG5hbWUgZm9yIHNvY2tldHMiCisvL3VzYWdlOgkpCisKKyNkZWZpbmUgTkVUU1RBVF9PUFRTICJsYWVudHV3eCIgXAorCUlGX1JPVVRFKCAgICAgICAgICAgICAgICJyIikgXAorCUlGX0ZFQVRVUkVfTkVUU1RBVF9XSURFKCJXIikgXAorCUlGX0ZFQVRVUkVfTkVUU1RBVF9QUkcoICJwIikKKworZW51bSB7CisJT1BUX3NvY2tfbGlzdGVuID0gMSA8PCAwLCAvLyBsCisJT1BUX3NvY2tfYWxsICAgID0gMSA8PCAxLCAvLyBhCisJT1BUX2V4dGVuZGVkICAgID0gMSA8PCAyLCAvLyBlCisJT1BUX25vcmVzb2x2ZSAgID0gMSA8PCAzLCAvLyBuCisJT1BUX3NvY2tfdGNwICAgID0gMSA8PCA0LCAvLyB0CisJT1BUX3NvY2tfdWRwICAgID0gMSA8PCA1LCAvLyB1CisJT1BUX3NvY2tfcmF3ICAgID0gMSA8PCA2LCAvLyB3CisJT1BUX3NvY2tfdW5peCAgID0gMSA8PCA3LCAvLyB4CisJT1BUQklUX3ggICAgICAgID0gNywKKwlJRl9ST1VURSggICAgICAgICAgICAgICBPUFRCSVRfUk9VVEUsKQorCUlGX0ZFQVRVUkVfTkVUU1RBVF9XSURFKE9QVEJJVF9XSURFICwpCisJSUZfRkVBVFVSRV9ORVRTVEFUX1BSRyggT1BUQklUX1BSRyAgLCkKKwlPUFRfcm91dGUgICAgICAgPSBJRl9ST1VURSggICAgICAgICAgICAgICAoMSA8PCBPUFRCSVRfUk9VVEUpKSArIDAsIC8vIHIKKwlPUFRfd2lkZSAgICAgICAgPSBJRl9GRUFUVVJFX05FVFNUQVRfV0lERSgoMSA8PCBPUFRCSVRfV0lERSApKSArIDAsIC8vIFcKKwlPUFRfcHJnICAgICAgICAgPSBJRl9GRUFUVVJFX05FVFNUQVRfUFJHKCAoMSA8PCBPUFRCSVRfUFJHICApKSArIDAsIC8vIHAKK307CisKKyNkZWZpbmUgTkVUU1RBVF9DT05ORUNURUQgMHgwMQorI2RlZmluZSBORVRTVEFUX0xJU1RFTklORyAweDAyCisjZGVmaW5lIE5FVFNUQVRfTlVNRVJJQyAgIDB4MDQKKy8qIE11c3QgbWF0Y2ggZ2V0b3B0MzIgb3B0aW9uIHN0cmluZyAqLworI2RlZmluZSBORVRTVEFUX1RDUCAgICAgICAweDEwCisjZGVmaW5lIE5FVFNUQVRfVURQICAgICAgIDB4MjAKKyNkZWZpbmUgTkVUU1RBVF9SQVcgICAgICAgMHg0MAorI2RlZmluZSBORVRTVEFUX1VOSVggICAgICAweDgwCisjZGVmaW5lIE5FVFNUQVRfQUxMUFJPVE8gIChORVRTVEFUX1RDUHxORVRTVEFUX1VEUHxORVRTVEFUX1JBV3xORVRTVEFUX1VOSVgpCisKKworZW51bSB7CisJVENQX0VTVEFCTElTSEVEID0gMSwKKwlUQ1BfU1lOX1NFTlQsCisJVENQX1NZTl9SRUNWLAorCVRDUF9GSU5fV0FJVDEsCisJVENQX0ZJTl9XQUlUMiwKKwlUQ1BfVElNRV9XQUlULAorCVRDUF9DTE9TRSwKKwlUQ1BfQ0xPU0VfV0FJVCwKKwlUQ1BfTEFTVF9BQ0ssCisJVENQX0xJU1RFTiwKKwlUQ1BfQ0xPU0lORywgLyogbm93IGEgdmFsaWQgc3RhdGUgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0Y3Bfc3RhdGVbXSA9IHsKKwkiIiwKKwkiRVNUQUJMSVNIRUQiLAorCSJTWU5fU0VOVCIsCisJIlNZTl9SRUNWIiwKKwkiRklOX1dBSVQxIiwKKwkiRklOX1dBSVQyIiwKKwkiVElNRV9XQUlUIiwKKwkiQ0xPU0UiLAorCSJDTE9TRV9XQUlUIiwKKwkiTEFTVF9BQ0siLAorCSJMSVNURU4iLAorCSJDTE9TSU5HIgorfTsKKwordHlwZWRlZiBlbnVtIHsKKwlTU19GUkVFID0gMCwgICAgIC8qIG5vdCBhbGxvY2F0ZWQgICAgICAgICAgICAgICAgKi8KKwlTU19VTkNPTk5FQ1RFRCwgIC8qIHVuY29ubmVjdGVkIHRvIGFueSBzb2NrZXQgICAgKi8KKwlTU19DT05ORUNUSU5HLCAgIC8qIGluIHByb2Nlc3Mgb2YgY29ubmVjdGluZyAgICAgKi8KKwlTU19DT05ORUNURUQsICAgIC8qIGNvbm5lY3RlZCB0byBzb2NrZXQgICAgICAgICAgKi8KKwlTU19ESVNDT05ORUNUSU5HIC8qIGluIHByb2Nlc3Mgb2YgZGlzY29ubmVjdGluZyAgKi8KK30gc29ja2V0X3N0YXRlOworCisjZGVmaW5lIFNPX0FDQ0VQVENPTiAoMTw8MTYpICAvKiBwZXJmb3JtZWQgYSBsaXN0ZW4gICAgICAgICAgICovCisjZGVmaW5lIFNPX1dBSVREQVRBICAoMTw8MTcpICAvKiB3YWl0IGRhdGEgdG8gcmVhZCAgICAgICAgICAgICovCisjZGVmaW5lIFNPX05PU1BBQ0UgICAoMTw8MTgpICAvKiBubyBzcGFjZSB0byB3cml0ZSAgICAgICAgICAgICovCisKKyNkZWZpbmUgQUREUl9OT1JNQUxfV0lEVEggICAgICAgIDIzCisvKiBXaGVuIHRoZXJlIGFyZSBJUHY2IGNvbm5lY3Rpb25zIHRoZSBJUHY2IGFkZHJlc3NlcyB3aWxsIGJlCisgKiB0cnVuY2F0ZWQgdG8gbm9uZS1yZWNvZ25pdGlvbi4gVGhlICctVycgb3B0aW9uIG1ha2VzIHRoZQorICogYWRkcmVzcyBjb2x1bW5zIHdpZGUgZW5vdWdoIHRvIGFjY29tb2RhdGUgZm9yIGxvbmdlc3QgcG9zc2libGUKKyAqIElQdjYgYWRkcmVzc2VzLCBpLmUuIGFkZHJlc3NlcyBvZiB0aGUgZm9ybQorICogeHh4eDp4eHh4Onh4eHg6eHh4eDp4eHh4Onh4eHg6ZGRkLmRkZC5kZGQuZGRkCisgKi8KKyNkZWZpbmUgQUREUl9XSURFICAgICAgICAgICAgICAgIDUxICAvKiBJTkVUNl9BRERSU1RSTEVOICsgNSBmb3IgdGhlIHBvcnQgbnVtYmVyICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9XSURFCisjIGRlZmluZSBGTVRfTkVUX0NPTk5fREFUQSAgICAgICAiJXMgICAlNmxkICU2bGQgJS0qcyAlLSpzICUtMTJzIgorIyBkZWZpbmUgRk1UX05FVF9DT05OX0hFQURFUiAgICAgIlxuUHJvdG8gUmVjdi1RIFNlbmQtUSAlLSpzICUtKnMgU3RhdGUgICAgICAgJXNcbiIKKyNlbHNlCisjIGRlZmluZSBGTVRfTkVUX0NPTk5fREFUQSAgICAgICAiJXMgICAlNmxkICU2bGQgJS0yM3MgJS0yM3MgJS0xMnMiCisjIGRlZmluZSBGTVRfTkVUX0NPTk5fSEVBREVSICAgICAiXG5Qcm90byBSZWN2LVEgU2VuZC1RICUtMjNzICUtMjNzIFN0YXRlICAgICAgICVzXG4iCisjZW5kaWYKKworI2RlZmluZSBQUk9HTkFNRV9XSURUSCAgICAgMjAKKyNkZWZpbmUgUFJPR05BTUVfV0lEVEhfU1RSICIyMCIKKy8qIFBST0dOQU1FX1dJRFRIIGNoYXJzOiAxMjM0NTY3ODkwMTIzNDU2Nzg5MCAqLworI2RlZmluZSBQUk9HTkFNRV9CQU5ORVIgIlBJRC9Qcm9ncmFtIG5hbWUgICAgIgorCitzdHJ1Y3QgcHJnX25vZGUgeworCXN0cnVjdCBwcmdfbm9kZSAqbmV4dDsKKwlsb25nIGlub2RlOworCWNoYXIgbmFtZVtQUk9HTkFNRV9XSURUSF07Cit9OworCisjZGVmaW5lIFBSR19IQVNIX1NJWkUgMjExCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzbWFsbGludCBmbGFnczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ORVRTVEFUX1BSRworCXNtYWxsaW50IHByZ19jYWNoZV9sb2FkZWQ7CisJc3RydWN0IHByZ19ub2RlICpwcmdfaGFzaFtQUkdfSEFTSF9TSVpFXTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisJY29uc3QgY2hhciAqcHJvZ25hbWVfYmFubmVyOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9XSURFCisJdW5zaWduZWQgYWRkcl93aWR0aDsKKyNlbmRpZgorfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBmbGFncyAgICAgICAgICAgIChHLmZsYWdzICAgICAgICAgICApCisjZGVmaW5lIHByZ19jYWNoZV9sb2FkZWQgKEcucHJnX2NhY2hlX2xvYWRlZCkKKyNkZWZpbmUgcHJnX2hhc2ggICAgICAgICAoRy5wcmdfaGFzaCAgICAgICAgKQorI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisjIGRlZmluZSBwcm9nbmFtZV9iYW5uZXIgKEcucHJvZ25hbWVfYmFubmVyICkKKyNlbHNlCisjIGRlZmluZSBwcm9nbmFtZV9iYW5uZXIgIiIKKyNlbmRpZgorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCWZsYWdzID0gTkVUU1RBVF9DT05ORUNURUQgfCBORVRTVEFUX0FMTFBST1RPOyBcCit9IHdoaWxlICgwKQorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9ORVRTVEFUX1BSRworCisvKiBEZWxpYmVyYXRlbHkgdHJ1bmNhdGluZyBsb25nIHRvIHVuc2lnbmVkICppbnQqICovCisjZGVmaW5lIFBSR19IQVNISVQoeCkgKCh1bnNpZ25lZCkoeCkgJSBQUkdfSEFTSF9TSVpFKQorCitzdGF0aWMgdm9pZCBwcmdfY2FjaGVfYWRkKGxvbmcgaW5vZGUsIGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaGkgPSBQUkdfSEFTSElUKGlub2RlKTsKKwlzdHJ1Y3QgcHJnX25vZGUgKipwbnAsICpwbjsKKworCXByZ19jYWNoZV9sb2FkZWQgPSAyOworCWZvciAocG5wID0gcHJnX2hhc2ggKyBoaTsgKHBuID0gKnBucCkgIT0gTlVMTDsgcG5wID0gJnBuLT5uZXh0KSB7CisJCWlmIChwbi0+aW5vZGUgPT0gaW5vZGUpIHsKKwkJCS8qIFNvbWUgd2FybmluZyBzaG91bGQgYmUgYXBwcm9wcmlhdGUgaGVyZQorCQkJICAgYXMgd2UgZ290IG11bHRpcGxlIHByb2Nlc3NlcyBmb3Igb25lIGktbm9kZSAqLworCQkJcmV0dXJuOworCQl9CisJfQorCSpwbnAgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgcHJnX25vZGUpKTsKKwlwbiA9ICpwbnA7CisJcG4tPmlub2RlID0gaW5vZGU7CisJc2FmZV9zdHJuY3B5KHBuLT5uYW1lLCBuYW1lLCBQUk9HTkFNRV9XSURUSCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcmdfY2FjaGVfZ2V0KGxvbmcgaW5vZGUpCit7CisJdW5zaWduZWQgaGkgPSBQUkdfSEFTSElUKGlub2RlKTsKKwlzdHJ1Y3QgcHJnX25vZGUgKnBuOworCisJZm9yIChwbiA9IHByZ19oYXNoW2hpXTsgcG47IHBuID0gcG4tPm5leHQpCisJCWlmIChwbi0+aW5vZGUgPT0gaW5vZGUpCisJCQlyZXR1cm4gcG4tPm5hbWU7CisJcmV0dXJuICItIjsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCitzdGF0aWMgdm9pZCBwcmdfY2FjaGVfY2xlYXIodm9pZCkKK3sKKwlzdHJ1Y3QgcHJnX25vZGUgKipwbnAsICpwbjsKKworCWZvciAocG5wID0gcHJnX2hhc2g7IHBucCA8IHByZ19oYXNoICsgUFJHX0hBU0hfU0laRTsgcG5wKyspIHsKKwkJd2hpbGUgKChwbiA9ICpwbnApICE9IE5VTEwpIHsKKwkJCSpwbnAgPSBwbi0+bmV4dDsKKwkJCWZyZWUocG4pOworCQl9CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgcHJnX2NhY2hlX2NsZWFyKCkgKCh2b2lkKTApCisjZW5kaWYKKworc3RhdGljIGxvbmcgZXh0cmFjdF9zb2NrZXRfaW5vZGUoY29uc3QgY2hhciAqbG5hbWUpCit7CisJbG9uZyBpbm9kZSA9IC0xOworCisJaWYgKHN0cm5jbXAobG5hbWUsICJzb2NrZXQ6WyIsIHNpemVvZigic29ja2V0OlsiKS0xKSA9PSAwKSB7CisJCS8qICJzb2NrZXQ6WzEyMzQ1XSIsIGV4dHJhY3QgdGhlICIxMjM0NSIgYXMgaW5vZGUgKi8KKwkJaW5vZGUgPSBiYl9zdHJ0b3VsKGxuYW1lICsgc2l6ZW9mKCJzb2NrZXQ6WyIpLTEsIChjaGFyKiopJmxuYW1lLCAwKTsKKwkJaWYgKCpsbmFtZSAhPSAnXScpCisJCQlpbm9kZSA9IC0xOworCX0gZWxzZSBpZiAoc3RybmNtcChsbmFtZSwgIlswMDAwXToiLCBzaXplb2YoIlswMDAwXToiKS0xKSA9PSAwKSB7CisJCS8qICJbMDAwMF06MTIzNDUiLCBleHRyYWN0IHRoZSAiMTIzNDUiIGFzIGlub2RlICovCisJCWlub2RlID0gYmJfc3RydG91bChsbmFtZSArIHNpemVvZigiWzAwMDBdOiIpLTEsIE5VTEwsIDApOworCQlpZiAoZXJybm8pIC8qIG5vdCBOVUwgdGVybWluYXRlZD8gKi8KKwkJCWlub2RlID0gLTE7CisJfQorCisjaWYgMCAvKiBiYl9zdHJ0b2wgcmV0dXJucyBhbGwtb25lcyBiaXQgcGF0dGVybiBvbiBFUkFOR0UgYW55d2F5ICovCisJaWYgKGVycm5vID09IEVSQU5HRSkKKwkJaW5vZGUgPSAtMTsKKyNlbmRpZgorCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYWRkX3RvX3ByZ19jYWNoZV9pZl9zb2NrZXQoY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqcGlkX3NsYXNoX3Byb2duYW1lLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKmxpbmtuYW1lOworCWxvbmcgaW5vZGU7CisKKwlsaW5rbmFtZSA9IHhtYWxsb2NfcmVhZGxpbmsoZmlsZU5hbWUpOworCWlmIChsaW5rbmFtZSAhPSBOVUxMKSB7CisJCWlub2RlID0gZXh0cmFjdF9zb2NrZXRfaW5vZGUobGlua25hbWUpOworCQlmcmVlKGxpbmtuYW1lKTsKKwkJaWYgKGlub2RlID49IDApCisJCQlwcmdfY2FjaGVfYWRkKGlub2RlLCAoY2hhciAqKXBpZF9zbGFzaF9wcm9nbmFtZSk7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBkaXJfYWN0KGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sCisJCXZvaWQgKnVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoKQoreworCWNvbnN0IGNoYXIgKnBpZDsKKwljaGFyICpwaWRfc2xhc2hfcHJvZ25hbWU7CisJY2hhciBwcm9jX3BpZF9mbmFtZVtzaXplb2YoIi9wcm9jLyV1L2NtZGxpbmUiKSArIHNpemVvZihsb25nKSozXTsKKwljaGFyIGNtZGxpbmVfYnVmWzUxMl07CisJaW50IG4sIGxlbjsKKworCWlmIChkZXB0aCA9PSAwKSAvKiAiL3Byb2MiIGl0c2VsZiAqLworCQlyZXR1cm4gVFJVRTsgLyogY29udGludWUgbG9va2luZyBvbmUgbGV2ZWwgYmVsb3cgL3Byb2MgKi8KKworCXBpZCA9IGZpbGVOYW1lICsgc2l6ZW9mKCIvcHJvYy8iKS0xOyAvKiBwb2ludCBhZnRlciAiL3Byb2MvIiAqLworCWlmICghaXNkaWdpdChwaWRbMF0pKSAvKiBza2lwIC9wcm9jIGVudHJpZXMgd2hpY2ggYXJlbid0IHByb2Nlc3NlcyAqLworCQlyZXR1cm4gU0tJUDsKKworCWxlbiA9IHNucHJpbnRmKHByb2NfcGlkX2ZuYW1lLCBzaXplb2YocHJvY19waWRfZm5hbWUpLCAiJXMvY21kbGluZSIsIGZpbGVOYW1lKTsKKwluID0gb3Blbl9yZWFkX2Nsb3NlKHByb2NfcGlkX2ZuYW1lLCBjbWRsaW5lX2J1Ziwgc2l6ZW9mKGNtZGxpbmVfYnVmKSAtIDEpOworCWlmIChuIDwgMCkKKwkJcmV0dXJuIEZBTFNFOworCWNtZGxpbmVfYnVmW25dID0gJ1wwJzsKKworCS8qIGdvIHRocm91Z2ggYWxsIGZpbGVzIGluIC9wcm9jL1BJRC9mZCBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBzb2NrZXRzICovCisJc3RyY3B5KHByb2NfcGlkX2ZuYW1lICsgbGVuIC0gKHNpemVvZigiY21kbGluZSIpLTEpLCAiZmQiKTsKKwlwaWRfc2xhc2hfcHJvZ25hbWUgPSBjb25jYXRfcGF0aF9maWxlKHBpZCwgYmJfYmFzZW5hbWUoY21kbGluZV9idWYpKTsgLyogIlBJRC9hcmd2MCIgKi8KKwluID0gcmVjdXJzaXZlX2FjdGlvbihwcm9jX3BpZF9mbmFtZSwKKwkJCUFDVElPTl9SRUNVUlNFIHwgQUNUSU9OX1FVSUVULAorCQkJYWRkX3RvX3ByZ19jYWNoZV9pZl9zb2NrZXQsCisJCQlOVUxMLAorCQkJKHZvaWQgKilwaWRfc2xhc2hfcHJvZ25hbWUsCisJCQkwKTsKKwlmcmVlKHBpZF9zbGFzaF9wcm9nbmFtZSk7CisKKwlpZiAoIW4pCisJCXJldHVybiBGQUxTRTsgLyogc2lnbmFsIHBlcm1pc3Npb25zIGVycm9yIHRvIGNhbGxlciAqLworCisJcmV0dXJuIFNLSVA7IC8qIGNhbGxlciBzaG91bGQgbm90IHJlY3Vyc2UgZnVydGhlciBpbnRvIHRoaXMgZGlyICovCit9CisKK3N0YXRpYyB2b2lkIHByZ19jYWNoZV9sb2FkKHZvaWQpCit7CisJaW50IGxvYWRfb2s7CisKKwlwcmdfY2FjaGVfbG9hZGVkID0gMTsKKwlsb2FkX29rID0gcmVjdXJzaXZlX2FjdGlvbigiL3Byb2MiLCBBQ1RJT05fUkVDVVJTRSB8IEFDVElPTl9RVUlFVCwKKwkJCQlOVUxMLCBkaXJfYWN0LCBOVUxMLCAwKTsKKwlpZiAobG9hZF9vaykKKwkJcmV0dXJuOworCisJaWYgKHByZ19jYWNoZV9sb2FkZWQgPT0gMSkKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBzY2FuIC9wcm9jIC0gYXJlIHlvdSByb290PyIpOworCWVsc2UKKwkJYmJfZXJyb3JfbXNnKCJzaG93aW5nIG9ubHkgcHJvY2Vzc2VzIHdpdGggeW91ciB1c2VyIElEIik7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgcHJnX2NhY2hlX2NsZWFyKCkgICAgICAgKCh2b2lkKTApCisKKyNlbmRpZiAvL0VOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK3N0YXRpYyB2b2lkIGJ1aWxkX2lwdjZfYWRkcihjaGFyKiBsb2NhbF9hZGRyLCBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBsb2NhbGFkZHIpCit7CisJY2hhciBhZGRyNltJTkVUNl9BRERSU1RSTEVOXTsKKwlzdHJ1Y3QgaW42X2FkZHIgaW42OworCisJc3NjYW5mKGxvY2FsX2FkZHIsICIlMDhYJTA4WCUwOFglMDhYIiwKKwkJICAgJmluNi5zNl9hZGRyMzJbMF0sICZpbjYuczZfYWRkcjMyWzFdLAorCQkgICAmaW42LnM2X2FkZHIzMlsyXSwgJmluNi5zNl9hZGRyMzJbM10pOworCWluZXRfbnRvcChBRl9JTkVUNiwgJmluNiwgYWRkcjYsIHNpemVvZihhZGRyNikpOworCWluZXRfcHRvbihBRl9JTkVUNiwgYWRkcjYsICZsb2NhbGFkZHItPnNpbjZfYWRkcik7CisKKwlsb2NhbGFkZHItPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYnVpbGRfaXB2NF9hZGRyKGNoYXIqIGxvY2FsX2FkZHIsIHN0cnVjdCBzb2NrYWRkcl9pbiogbG9jYWxhZGRyKQoreworCXNzY2FuZihsb2NhbF9hZGRyLCAiJVgiLCAmbG9jYWxhZGRyLT5zaW5fYWRkci5zX2FkZHIpOworCWxvY2FsYWRkci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfc25hbWUoaW50IHBvcnQsIGNvbnN0IGNoYXIgKnByb3RvLCBpbnQgbnVtZXJpYykKK3sKKwlpZiAoIXBvcnQpCisJCXJldHVybiAiKiI7CisJaWYgKCFudW1lcmljKSB7CisJCXN0cnVjdCBzZXJ2ZW50ICpzZSA9IGdldHNlcnZieXBvcnQocG9ydCwgcHJvdG8pOworCQlpZiAoc2UpCisJCQlyZXR1cm4gc2UtPnNfbmFtZTsKKwl9CisJLyogaHVtbW0sIHdlIG1heSByZXR1cm4gc3RhdGljIGJ1ZmZlciBoZXJlISEgKi8KKwlyZXR1cm4gaXRvYShudG9ocyhwb3J0KSk7Cit9CisKK3N0YXRpYyBjaGFyICppcF9wb3J0X3N0cihzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBwb3J0LCBjb25zdCBjaGFyICpwcm90bywgaW50IG51bWVyaWMpCit7CisJY2hhciAqaG9zdCwgKmhvc3RfcG9ydDsKKworCS8qIENvZGUgd2hpY2ggdXNlZCAiKiIgZm9yIElOQUREUl9BTlkgaXMgcmVtb3ZlZDogaXQncyBhbWJpZ3VvdXMKKwkgKiBpbiBJUHY2LCB3aGlsZSAiMC4wLjAuMCIgaXMgbm90LiAqLworCisJaG9zdCA9IG51bWVyaWMgPyB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoYWRkcikKKwkgICAgICAgICAgICAgICA6IHhtYWxsb2Nfc29ja2FkZHIyaG9zdF9ub3BvcnQoYWRkcik7CisKKwlob3N0X3BvcnQgPSB4YXNwcmludGYoIiVzOiVzIiwgaG9zdCwgZ2V0X3NuYW1lKGh0b25zKHBvcnQpLCBwcm90bywgbnVtZXJpYykpOworCWZyZWUoaG9zdCk7CisJcmV0dXJuIGhvc3RfcG9ydDsKK30KKworc3RydWN0IGluZXRfcGFyYW1zIHsKKwlpbnQgbG9jYWxfcG9ydCwgcmVtX3BvcnQsIHN0YXRlLCB1aWQ7CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHIgICAgIHNhOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gIHNpbjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNjsKKyNlbmRpZgorCX0gbG9jYWxhZGRyLCByZW1hZGRyOworCXVuc2lnbmVkIGxvbmcgcnhxLCB0eHEsIGlub2RlOworfTsKKworc3RhdGljIGludCBzY2FuX2luZXRfcHJvY19saW5lKHN0cnVjdCBpbmV0X3BhcmFtcyAqcGFyYW0sIGNoYXIgKmxpbmUpCit7CisJaW50IG51bTsKKwkvKiBJUHY2IC9wcm9jIGZpbGVzIHVzZSAzMi1jaGFyIGhleCByZXByZXNlbnRhdGlvbgorCSAqIG9mIElQdjYgYWRkcmVzcywgZm9sbG93ZWQgYnkgOlBPUlRfSU5fSEVYCisJICovCisJY2hhciBsb2NhbF9hZGRyWzMzXSwgcmVtX2FkZHJbMzNdOyAvKiAzMiArIDEgZm9yIE5VTCAqLworCisJbnVtID0gc3NjYW5mKGxpbmUsCisJCQkiJSpkOiAlMzJbMC05QS1GYS1mXTolWCAiCisJCQkiJTMyWzAtOUEtRmEtZl06JVggJVggIgorCQkJIiVsWDolbFggJSpYOiUqWCAiCisJCQkiJSpYICVkICUqZCAlbGQgIiwKKwkJCWxvY2FsX2FkZHIsICZwYXJhbS0+bG9jYWxfcG9ydCwKKwkJCXJlbV9hZGRyLCAmcGFyYW0tPnJlbV9wb3J0LCAmcGFyYW0tPnN0YXRlLAorCQkJJnBhcmFtLT50eHEsICZwYXJhbS0+cnhxLAorCQkJJnBhcmFtLT51aWQsICZwYXJhbS0+aW5vZGUpOworCWlmIChudW0gPCA5KSB7CisJCXJldHVybiAxOyAvKiBlcnJvciAqLworCX0KKworCWlmIChzdHJsZW4obG9jYWxfYWRkcikgPiA4KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlidWlsZF9pcHY2X2FkZHIobG9jYWxfYWRkciwgJnBhcmFtLT5sb2NhbGFkZHIuc2luNik7CisJCWJ1aWxkX2lwdjZfYWRkcihyZW1fYWRkciwgJnBhcmFtLT5yZW1hZGRyLnNpbjYpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJYnVpbGRfaXB2NF9hZGRyKGxvY2FsX2FkZHIsICZwYXJhbS0+bG9jYWxhZGRyLnNpbik7CisJCWJ1aWxkX2lwdjRfYWRkcihyZW1fYWRkciwgJnBhcmFtLT5yZW1hZGRyLnNpbik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9pbmV0X2xpbmUoc3RydWN0IGluZXRfcGFyYW1zICpwYXJhbSwKKwkJY29uc3QgY2hhciAqc3RhdGVfc3RyLCBjb25zdCBjaGFyICpwcm90bywgaW50IGlzX2Nvbm5lY3RlZCkKK3sKKwlpZiAoKGlzX2Nvbm5lY3RlZCAmJiAoZmxhZ3MgJiBORVRTVEFUX0NPTk5FQ1RFRCkpCisJIHx8ICghaXNfY29ubmVjdGVkICYmIChmbGFncyAmIE5FVFNUQVRfTElTVEVOSU5HKSkKKwkpIHsKKwkJY2hhciAqbCA9IGlwX3BvcnRfc3RyKAorCQkJCSZwYXJhbS0+bG9jYWxhZGRyLnNhLCBwYXJhbS0+bG9jYWxfcG9ydCwKKwkJCQlwcm90bywgZmxhZ3MgJiBORVRTVEFUX05VTUVSSUMpOworCQljaGFyICpyID0gaXBfcG9ydF9zdHIoCisJCQkJJnBhcmFtLT5yZW1hZGRyLnNhLCBwYXJhbS0+cmVtX3BvcnQsCisJCQkJcHJvdG8sIGZsYWdzICYgTkVUU1RBVF9OVU1FUklDKTsKKwkJcHJpbnRmKEZNVF9ORVRfQ09OTl9EQVRBLAorCQkJcHJvdG8sIHBhcmFtLT5yeHEsIHBhcmFtLT50eHEsCisJCQlJRl9GRUFUVVJFX05FVFNUQVRfV0lERShHLmFkZHJfd2lkdGgsKSBsLAorCQkJSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoRy5hZGRyX3dpZHRoLCkgciwKKwkJCXN0YXRlX3N0cik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcHJnKQorCQkJcHJpbnRmKCIlLiJQUk9HTkFNRV9XSURUSF9TVFIicyIsIHByZ19jYWNoZV9nZXQocGFyYW0tPmlub2RlKSk7CisjZW5kaWYKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJZnJlZShsKTsKKwkJZnJlZShyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHRjcF9kb19vbmUoY2hhciAqbGluZSkKK3sKKwlzdHJ1Y3QgaW5ldF9wYXJhbXMgcGFyYW07CisKKwltZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YocGFyYW0pKTsKKwlpZiAoc2Nhbl9pbmV0X3Byb2NfbGluZSgmcGFyYW0sIGxpbmUpKQorCQlyZXR1cm4gMTsKKworCXByaW50X2luZXRfbGluZSgmcGFyYW0sIHRjcF9zdGF0ZVtwYXJhbS5zdGF0ZV0sICJ0Y3AiLCBwYXJhbS5yZW1fcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisjIGRlZmluZSBOT1RfTlVMTF9BRERSKEEpICggXAorCSggKEEuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSBcCisJICAmJiAoQS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMF0gfCBBLnNpbjYuc2luNl9hZGRyLnM2X2FkZHIzMlsxXSB8IFwKKwkgICAgICBBLnNpbjYuc2luNl9hZGRyLnM2X2FkZHIzMlsyXSB8IEEuc2luNi5zaW42X2FkZHIuczZfYWRkcjMyWzNdKSAgXAorCSkgfHwgKCBcCisJICAoQS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgXAorCSAgJiYgQS5zaW4uc2luX2FkZHIuc19hZGRyICE9IDAgXAorCSkgXAorKQorI2Vsc2UKKyMgZGVmaW5lIE5PVF9OVUxMX0FERFIoQSkgKEEuc2luLnNpbl9hZGRyLnNfYWRkcikKKyNlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB1ZHBfZG9fb25lKGNoYXIgKmxpbmUpCit7CisJaW50IGhhdmVfcmVtYWRkcjsKKwljb25zdCBjaGFyICpzdGF0ZV9zdHI7CisJc3RydWN0IGluZXRfcGFyYW1zIHBhcmFtOworCisJbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKHBhcmFtKSk7IC8qIG90aGVyd2lzZSB3ZSBkaXNwbGF5IGdhcmJhZ2UgSVB2NiBzY29wZV9pZHMgKi8KKwlpZiAoc2Nhbl9pbmV0X3Byb2NfbGluZSgmcGFyYW0sIGxpbmUpKQorCQlyZXR1cm4gMTsKKworCXN0YXRlX3N0ciA9ICJVTktOT1dOIjsKKwlzd2l0Y2ggKHBhcmFtLnN0YXRlKSB7CisJY2FzZSBUQ1BfRVNUQUJMSVNIRUQ6CisJCXN0YXRlX3N0ciA9ICJFU1RBQkxJU0hFRCI7CisJCWJyZWFrOworCWNhc2UgVENQX0NMT1NFOgorCQlzdGF0ZV9zdHIgPSAiIjsKKwkJYnJlYWs7CisJfQorCisJaGF2ZV9yZW1hZGRyID0gTk9UX05VTExfQUREUihwYXJhbS5yZW1hZGRyKTsKKwlwcmludF9pbmV0X2xpbmUoJnBhcmFtLCBzdGF0ZV9zdHIsICJ1ZHAiLCBoYXZlX3JlbWFkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyByYXdfZG9fb25lKGNoYXIgKmxpbmUpCit7CisJaW50IGhhdmVfcmVtYWRkcjsKKwlzdHJ1Y3QgaW5ldF9wYXJhbXMgcGFyYW07CisKKwlpZiAoc2Nhbl9pbmV0X3Byb2NfbGluZSgmcGFyYW0sIGxpbmUpKQorCQlyZXR1cm4gMTsKKworCWhhdmVfcmVtYWRkciA9IE5PVF9OVUxMX0FERFIocGFyYW0ucmVtYWRkcik7CisJcHJpbnRfaW5ldF9saW5lKCZwYXJhbSwgaXRvYShwYXJhbS5zdGF0ZSksICJyYXciLCBoYXZlX3JlbWFkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB1bml4X2RvX29uZShjaGFyICpsaW5lKQoreworCXVuc2lnbmVkIGxvbmcgcmVmY250LCBwcm90bywgdW5peF9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGlub2RlOworCWludCB0eXBlLCBzdGF0ZTsKKwlpbnQgbnVtLCBwYXRoX29mczsKKwljb25zdCBjaGFyICpzc19wcm90bywgKnNzX3N0YXRlLCAqc3NfdHlwZTsKKwljaGFyIHNzX2ZsYWdzWzMyXTsKKworCS8qIDIuNi4xNSBtYXkgcmVwb3J0IGxpbmVzIGxpa2UgIi4uLiBAL3RtcC9mYW0tdXNlci1eQF5AXkBeQF5AXkBeQC4uLiIKKwkgKiBPdGhlciB1c2VycyByZXBvcnQgbG9uZyBsaW5lcyBmaWxsZWQgYnkgTlVMIGJ5dGVzLgorCSAqICh0aG9zZSBeQCBhcmUgTlVMIGJ5dGVzIHRvbykuIFdlIHNlZSB0aGVtIGFzIGVtcHR5IGxpbmVzLiAqLworCWlmICghbGluZVswXSkKKwkJcmV0dXJuIDA7CisKKwlwYXRoX29mcyA9IDA7IC8qIHBhcmFub2lhICovCisJbnVtID0gc3NjYW5mKGxpbmUsICIlKnA6ICVsWCAlbFggJWxYICVYICVYICVsdSAlbiIsCisJCQkmcmVmY250LCAmcHJvdG8sICZ1bml4X2ZsYWdzLCAmdHlwZSwgJnN0YXRlLCAmaW5vZGUsICZwYXRoX29mcyk7CisJaWYgKG51bSA8IDYpIHsKKwkJcmV0dXJuIDE7IC8qIGVycm9yICovCisJfQorCWlmICgoZmxhZ3MgJiAoTkVUU1RBVF9MSVNURU5JTkd8TkVUU1RBVF9DT05ORUNURUQpKSAhPSAoTkVUU1RBVF9MSVNURU5JTkd8TkVUU1RBVF9DT05ORUNURUQpKSB7CisJCWlmICgoc3RhdGUgPT0gU1NfVU5DT05ORUNURUQpICYmICh1bml4X2ZsYWdzICYgU09fQUNDRVBUQ09OKSkgeworCQkJaWYgKCEoZmxhZ3MgJiBORVRTVEFUX0xJU1RFTklORykpCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlpZiAoIShmbGFncyAmIE5FVFNUQVRfQ09OTkVDVEVEKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXN3aXRjaCAocHJvdG8pIHsKKwkJY2FzZSAwOgorCQkJc3NfcHJvdG8gPSAidW5peCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNzX3Byb3RvID0gIj8/IjsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBTT0NLX1NUUkVBTToKKwkJCXNzX3R5cGUgPSAiU1RSRUFNIjsKKwkJCWJyZWFrOworCQljYXNlIFNPQ0tfREdSQU06CisJCQlzc190eXBlID0gIkRHUkFNIjsKKwkJCWJyZWFrOworCQljYXNlIFNPQ0tfUkFXOgorCQkJc3NfdHlwZSA9ICJSQVciOworCQkJYnJlYWs7CisJCWNhc2UgU09DS19SRE06CisJCQlzc190eXBlID0gIlJETSI7CisJCQlicmVhazsKKwkJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJCXNzX3R5cGUgPSAiU0VRUEFDS0VUIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3NfdHlwZSA9ICJVTktOT1dOIjsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1NfRlJFRToKKwkJCXNzX3N0YXRlID0gIkZSRUUiOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVU5DT05ORUNURUQ6CisJCQkvKgorCQkJICogVW5jb25uZWN0ZWQgc29ja2V0cyBtYXkgYmUgbGlzdGVuaW5nCisJCQkgKiBmb3Igc29tZXRoaW5nLgorCQkJICovCisJCQlpZiAodW5peF9mbGFncyAmIFNPX0FDQ0VQVENPTikgeworCQkJCXNzX3N0YXRlID0gIkxJU1RFTklORyI7CisJCQl9IGVsc2UgeworCQkJCXNzX3N0YXRlID0gIiI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTU19DT05ORUNUSU5HOgorCQkJc3Nfc3RhdGUgPSAiQ09OTkVDVElORyI7CisJCQlicmVhazsKKwkJY2FzZSBTU19DT05ORUNURUQ6CisJCQlzc19zdGF0ZSA9ICJDT05ORUNURUQiOworCQkJYnJlYWs7CisJCWNhc2UgU1NfRElTQ09OTkVDVElORzoKKwkJCXNzX3N0YXRlID0gIkRJU0NPTk5FQ1RJTkciOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzc19zdGF0ZSA9ICJVTktOT1dOIjsKKwl9CisKKwlzdHJjcHkoc3NfZmxhZ3MsICJbICIpOworCWlmICh1bml4X2ZsYWdzICYgU09fQUNDRVBUQ09OKQorCQlzdHJjYXQoc3NfZmxhZ3MsICJBQ0MgIik7CisJaWYgKHVuaXhfZmxhZ3MgJiBTT19XQUlUREFUQSkKKwkJc3RyY2F0KHNzX2ZsYWdzLCAiVyAiKTsKKwlpZiAodW5peF9mbGFncyAmIFNPX05PU1BBQ0UpCisJCXN0cmNhdChzc19mbGFncywgIk4gIik7CisJc3RyY2F0KHNzX2ZsYWdzLCAiXSIpOworCisJcHJpbnRmKCIlLTVzICUtNmxkICUtMTFzICUtMTBzICUtMTNzICU2bHUgIiwKKwkJc3NfcHJvdG8sIHJlZmNudCwgc3NfZmxhZ3MsIHNzX3R5cGUsIHNzX3N0YXRlLCBpbm9kZQorCQkpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9wcmcpCisJCXByaW50ZigiJS0iUFJPR05BTUVfV0lEVEhfU1RSInMiLCBwcmdfY2FjaGVfZ2V0KGlub2RlKSk7CisjZW5kaWYKKworCS8qIFRPRE86IGN1cnJlbnRseSB3ZSBzdG9wIGF0IGZpcnN0IE5VTCBieXRlLiBJcyBpdCBhIHByb2JsZW0/ICovCisJbGluZSArPSBwYXRoX29mczsKKwkqc3RyY2hybnVsKGxpbmUsICdcbicpID0gJ1wwJzsKKwl3aGlsZSAoKmxpbmUpCisJCWZwdXRjX3ByaW50YWJsZSgqbGluZSsrLCBzdGRvdXQpOworCWJiX3B1dGNoYXIoJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2luZm8oY29uc3QgY2hhciAqZmlsZSwgaW50IEZBU1RfRlVOQyAoKnByb2MpKGNoYXIgKikpCit7CisJaW50IGxucjsKKwlGSUxFICpwcm9jaW5mbzsKKwljaGFyICpidWZmZXI7CisKKwkvKiBfc3RkaW4gaXMganVzdCB0byBzYXZlICJyIiBwYXJhbSAqLworCXByb2NpbmZvID0gZm9wZW5fb3Jfd2Fybl9zdGRpbihmaWxlKTsKKwlpZiAocHJvY2luZm8gPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCWxuciA9IDA7CisJLyogV2h5IHhtYWxsb2NfZmdldHNfc3RyPyBiZWNhdXNlIGl0IGRvZXNuJ3Qgc3RvcCBvbiBOVUxzICovCisJd2hpbGUgKChidWZmZXIgPSB4bWFsbG9jX2ZnZXRzX3N0cihwcm9jaW5mbywgIlxuIikpICE9IE5VTEwpIHsKKwkJLyogbGluZSAwIGlzIHNraXBwZWQgKi8KKwkJaWYgKGxuciAmJiBwcm9jKGJ1ZmZlcikpCisJCQliYl9lcnJvcl9tc2coIiVzOiBib2d1cyBkYXRhIG9uIGxpbmUgJWQiLCBmaWxlLCBsbnIgKyAxKTsKKwkJbG5yKys7CisJCWZyZWUoYnVmZmVyKTsKKwl9CisJZmNsb3NlKHByb2NpbmZvKTsKK30KKworaW50IG5ldHN0YXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5ldHN0YXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKworCUlOSVRfRygpOworCisJLyogT3B0aW9uIHN0cmluZyBtdXN0IG1hdGNoIE5FVFNUQVRfeHh4IGNvbnN0YW50cyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIE5FVFNUQVRfT1BUUyk7CisJaWYgKG9wdCAmIE9QVF9zb2NrX2xpc3RlbikgeyAvLyAtbAorCQlmbGFncyAmPSB+TkVUU1RBVF9DT05ORUNURUQ7CisJCWZsYWdzIHw9IE5FVFNUQVRfTElTVEVOSU5HOworCX0KKwlpZiAob3B0ICYgT1BUX3NvY2tfYWxsKSBmbGFncyB8PSBORVRTVEFUX0xJU1RFTklORyB8IE5FVFNUQVRfQ09OTkVDVEVEOyAvLyAtYQorCS8vaWYgKG9wdCAmIE9QVF9leHRlbmRlZCkgLy8gLWUKKwlpZiAob3B0ICYgT1BUX25vcmVzb2x2ZSkgZmxhZ3MgfD0gTkVUU1RBVF9OVU1FUklDOyAvLyAtbgorCS8vaWYgKG9wdCAmIE9QVF9zb2NrX3RjcCkgLy8gLXQ6IE5FVFNUQVRfVENQCisJLy9pZiAob3B0ICYgT1BUX3NvY2tfdWRwKSAvLyAtdTogTkVUU1RBVF9VRFAKKwkvL2lmIChvcHQgJiBPUFRfc29ja19yYXcpIC8vIC13OiBORVRTVEFUX1JBVworCS8vaWYgKG9wdCAmIE9QVF9zb2NrX3VuaXgpIC8vIC14OiBORVRTVEFUX1VOSVgKKyNpZiBFTkFCTEVfUk9VVEUKKwlpZiAob3B0ICYgT1BUX3JvdXRlKSB7IC8vIC1yCisJCWJiX2Rpc3BsYXlyb3V0ZXMoZmxhZ3MgJiBORVRTVEFUX05VTUVSSUMsICEob3B0ICYgT1BUX2V4dGVuZGVkKSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfV0lERQorCUcuYWRkcl93aWR0aCA9IEFERFJfTk9STUFMX1dJRFRIOworCWlmIChvcHQgJiBPUFRfd2lkZSkgeyAvLyAtVworCQlHLmFkZHJfd2lkdGggPSBBRERSX1dJREU7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKwlwcm9nbmFtZV9iYW5uZXIgPSAiIjsKKwlpZiAob3B0ICYgT1BUX3ByZykgeyAvLyAtcAorCQlwcm9nbmFtZV9iYW5uZXIgPSBQUk9HTkFNRV9CQU5ORVI7CisJCXByZ19jYWNoZV9sb2FkKCk7CisJfQorI2VuZGlmCisKKwlvcHQgJj0gTkVUU1RBVF9BTExQUk9UTzsKKwlpZiAob3B0KSB7CisJCWZsYWdzICY9IH5ORVRTVEFUX0FMTFBST1RPOworCQlmbGFncyB8PSBvcHQ7CisJfQorCWlmIChmbGFncyAmIChORVRTVEFUX1RDUHxORVRTVEFUX1VEUHxORVRTVEFUX1JBVykpIHsKKwkJcHJpbnRmKCJBY3RpdmUgSW50ZXJuZXQgY29ubmVjdGlvbnMgIik7IC8qIHh4eCAqLworCisJCWlmICgoZmxhZ3MgJiAoTkVUU1RBVF9MSVNURU5JTkd8TkVUU1RBVF9DT05ORUNURUQpKSA9PSAoTkVUU1RBVF9MSVNURU5JTkd8TkVUU1RBVF9DT05ORUNURUQpKQorCQkJcHJpbnRmKCIoc2VydmVycyBhbmQgZXN0YWJsaXNoZWQpIik7CisJCWVsc2UgaWYgKGZsYWdzICYgTkVUU1RBVF9MSVNURU5JTkcpCisJCQlwcmludGYoIihvbmx5IHNlcnZlcnMpIik7CisJCWVsc2UKKwkJCXByaW50ZigiKHcvbyBzZXJ2ZXJzKSIpOworCQlwcmludGYoRk1UX05FVF9DT05OX0hFQURFUiwKKwkJCQlJRl9GRUFUVVJFX05FVFNUQVRfV0lERShHLmFkZHJfd2lkdGgsKSAiTG9jYWwgQWRkcmVzcyIsCisJCQkJSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoRy5hZGRyX3dpZHRoLCkgIkZvcmVpZ24gQWRkcmVzcyIsCisJCQkJcHJvZ25hbWVfYmFubmVyCisJCSk7CisJfQorCWlmIChmbGFncyAmIE5FVFNUQVRfVENQKSB7CisJCWRvX2luZm8oIi9wcm9jL25ldC90Y3AiLCB0Y3BfZG9fb25lKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCWRvX2luZm8oIi9wcm9jL25ldC90Y3A2IiwgdGNwX2RvX29uZSk7CisjZW5kaWYKKwl9CisJaWYgKGZsYWdzICYgTkVUU1RBVF9VRFApIHsKKwkJZG9faW5mbygiL3Byb2MvbmV0L3VkcCIsIHVkcF9kb19vbmUpOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJZG9faW5mbygiL3Byb2MvbmV0L3VkcDYiLCB1ZHBfZG9fb25lKTsKKyNlbmRpZgorCX0KKwlpZiAoZmxhZ3MgJiBORVRTVEFUX1JBVykgeworCQlkb19pbmZvKCIvcHJvYy9uZXQvcmF3IiwgcmF3X2RvX29uZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlkb19pbmZvKCIvcHJvYy9uZXQvcmF3NiIsIHJhd19kb19vbmUpOworI2VuZGlmCisJfQorCWlmIChmbGFncyAmIE5FVFNUQVRfVU5JWCkgeworCQlwcmludGYoIkFjdGl2ZSBVTklYIGRvbWFpbiBzb2NrZXRzICIpOworCQlpZiAoKGZsYWdzICYgKE5FVFNUQVRfTElTVEVOSU5HfE5FVFNUQVRfQ09OTkVDVEVEKSkgPT0gKE5FVFNUQVRfTElTVEVOSU5HfE5FVFNUQVRfQ09OTkVDVEVEKSkKKwkJCXByaW50ZigiKHNlcnZlcnMgYW5kIGVzdGFibGlzaGVkKSIpOworCQllbHNlIGlmIChmbGFncyAmIE5FVFNUQVRfTElTVEVOSU5HKQorCQkJcHJpbnRmKCIob25seSBzZXJ2ZXJzKSIpOworCQllbHNlCisJCQlwcmludGYoIih3L28gc2VydmVycykiKTsKKwkJcHJpbnRmKCJcblByb3RvIFJlZkNudCBGbGFncyAgICAgICBUeXBlICAgICAgIFN0YXRlICAgICAgICAgSS1Ob2RlICVzUGF0aFxuIiwgcHJvZ25hbWVfYmFubmVyKTsKKwkJZG9faW5mbygiL3Byb2MvbmV0L3VuaXgiLCB1bml4X2RvX29uZSk7CisJfQorCXByZ19jYWNoZV9jbGVhcigpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9uc2xvb2t1cC5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9uc2xvb2t1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmQ0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL25zbG9va3VwLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbnNsb29rdXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBieSBMaW5lbywgaW5jLiBhbmQgSm9obiBCZXBwdQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBKb2huIEJlcHB1IDxiZXBwdUBjb2RlcG9ldC5vcmc+CisgKgorICogQ29ycmVjdCBkZWZhdWx0IG5hbWUgc2VydmVyIGRpc3BsYXkgYW5kIGV4cGxpY2l0IG5hbWUgc2VydmVyIG9wdGlvbgorICogYWRkZWQgYnkgQmVuIFplY2tlbCA8YnplY2tlbEBobWMuZWR1PiBKdW5lIDIwMDEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBuc2xvb2t1cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW0hPU1RdIFtTRVJWRVJdIgorLy91c2FnZTojZGVmaW5lIG5zbG9va3VwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUXVlcnkgdGhlIG5hbWVzZXJ2ZXIgZm9yIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBnaXZlbiBIT1NUXG4iCisvL3VzYWdlOiAgICAgICAib3B0aW9uYWxseSB1c2luZyBhIHNwZWNpZmllZCBETlMgc2VydmVyIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBuc2xvb2t1cF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBuc2xvb2t1cCBsb2NhbGhvc3RcbiIKKy8vdXNhZ2U6ICAgICAgICJTZXJ2ZXI6ICAgICBkZWZhdWx0XG4iCisvL3VzYWdlOiAgICAgICAiQWRkcmVzczogICAgZGVmYXVsdFxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIk5hbWU6ICAgICAgIGRlYmlhblxuIgorLy91c2FnZTogICAgICAgIkFkZHJlc3M6ICAgIDEyNy4wLjAuMVxuIgorCisjaW5jbHVkZSA8cmVzb2x2Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIEknbSBvbmx5IGltcGxlbWVudGluZyBub24taW50ZXJhY3RpdmUgbW9kZTsKKyAqIEkgdG90YWxseSBmb3Jnb3QgbnNsb29rdXAgZXZlbiBoYWQgYW4gaW50ZXJhY3RpdmUgbW9kZS4KKyAqCisgKiBUaGlzIGFwcGxldCBpcyB0aGUgb25seSB1c2VyIG9mIHJlc19pbml0KCkuIFdpdGhvdXQgaXQsCisgKiB5b3UgbWF5IGF2b2lkIHB1bGxpbmcgaW4gX3JlcyBnbG9iYWwgZnJvbSBsaWJjLgorICovCisKKy8qIEV4YW1wbGVzIG9mICdzdGFuZGFyZCcgbnNsb29rdXAgb3V0cHV0CisgKiAkIG5zbG9va3VwIHlhaG9vLmNvbQorICogU2VydmVyOiAgICAgICAgIDEyOC4xOTMuMC4xMAorICogQWRkcmVzczogICAgICAgIDEyOC4xOTMuMC4xMCM1MworICoKKyAqIE5vbi1hdXRob3JpdGF0aXZlIGFuc3dlcjoKKyAqIE5hbWU6ICAgeWFob28uY29tCisgKiBBZGRyZXNzOiAyMTYuMTA5LjExMi4xMzUKKyAqIE5hbWU6ICAgeWFob28uY29tCisgKiBBZGRyZXNzOiA2Ni45NC4yMzQuMTMKKyAqCisgKiAkIG5zbG9va3VwIDIwNC4xNTIuMTkxLjM3CisgKiBTZXJ2ZXI6ICAgICAgICAgMTI4LjE5My40LjIwCisgKiBBZGRyZXNzOiAgICAgICAgMTI4LjE5My40LjIwIzUzCisgKgorICogTm9uLWF1dGhvcml0YXRpdmUgYW5zd2VyOgorICogMzcuMTkxLjE1Mi4yMDQuaW4tYWRkci5hcnBhICAgICBjYW5vbmljYWwgbmFtZSA9IDM3LjMyLTI3LjE5MS4xNTIuMjA0LmluLWFkZHIuYXJwYS4KKyAqIDM3LjMyLTI3LjE5MS4xNTIuMjA0LmluLWFkZHIuYXJwYSAgICAgICBuYW1lID0gemV1cy1wdWIyLmtlcm5lbC5vcmcuCisgKgorICogQXV0aG9yaXRhdGl2ZSBhbnN3ZXJzIGNhbiBiZSBmb3VuZCBmcm9tOgorICogMzItMjcuMTkxLjE1Mi4yMDQuaW4tYWRkci5hcnBhICBuYW1lc2VydmVyID0gbnMxLmtlcm5lbC5vcmcuCisgKiAzMi0yNy4xOTEuMTUyLjIwNC5pbi1hZGRyLmFycGEgIG5hbWVzZXJ2ZXIgPSBuczIua2VybmVsLm9yZy4KKyAqIDMyLTI3LjE5MS4xNTIuMjA0LmluLWFkZHIuYXJwYSAgbmFtZXNlcnZlciA9IG5zMy5rZXJuZWwub3JnLgorICogbnMxLmtlcm5lbC5vcmcgIGludGVybmV0IGFkZHJlc3MgPSAxNDAuMjExLjE2Ny4zNAorICogbnMyLmtlcm5lbC5vcmcgIGludGVybmV0IGFkZHJlc3MgPSAyMDQuMTUyLjE5MS40CisgKiBuczMua2VybmVsLm9yZyAgaW50ZXJuZXQgYWRkcmVzcyA9IDIwNC4xNTIuMTkxLjM2CisgKi8KKworc3RhdGljIGludCBwcmludF9ob3N0KGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFyICpoZWFkZXIpCit7CisJLyogV2UgY2FuJ3QgdXNlIHhob3N0MnNvY2thZGRyKCkgLSB3ZSB3YW50IHRvIGdldCBBTEwgYWRkcmVzc2VzLAorCSAqIG5vdCBqdXN0IG9uZSAqLworCXN0cnVjdCBhZGRyaW5mbyAqcmVzdWx0ID0gTlVMTDsKKwlpbnQgcmM7CisJc3RydWN0IGFkZHJpbmZvIGhpbnQ7CisKKwltZW1zZXQoJmhpbnQsIDAgLCBzaXplb2YoaGludCkpOworCS8qIGhpbnQuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAtIHplcm8gYW55d2F5ICovCisJLyogTmVlZGVkLiBPciBlbHNlIHdlIHdpbGwgZ2V0IGVhY2ggYWRkcmVzcyB0aHJpY2UgKG9yIG1vcmUpCisJICogZm9yIGVhY2ggcG9zc2libGUgc29ja2V0IHR5cGUgKHRjcCx1ZHAscmF3Li4uKTogKi8KKwloaW50LmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJLy8gaGludC5haV9mbGFncyA9IEFJX0NBTk9OTkFNRTsKKwlyYyA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBOVUxMIC8qc2VydmljZSovLCAmaGludCwgJnJlc3VsdCk7CisKKwlpZiAocmMgPT0gMCkgeworCQlzdHJ1Y3QgYWRkcmluZm8gKmN1ciA9IHJlc3VsdDsKKwkJdW5zaWduZWQgY250ID0gMDsKKworCQlwcmludGYoIiUtMTBzICVzXG4iLCBoZWFkZXIsIGhvc3RuYW1lKTsKKwkJLy8gcHV0cyhjdXItPmFpX2Nhbm9ubmFtZSk7ID8KKwkJd2hpbGUgKGN1cikgeworCQkJY2hhciAqZG90dGVkLCAqcmV2aG9zdDsKKwkJCWRvdHRlZCA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChjdXItPmFpX2FkZHIpOworCQkJcmV2aG9zdCA9IHhtYWxsb2Nfc29ja2FkZHIyaG9zdG9ubHlfbm9wb3J0KGN1ci0+YWlfYWRkcik7CisKKwkJCXByaW50ZigiQWRkcmVzcyAldTogJXMlYyIsICsrY250LCBkb3R0ZWQsIHJldmhvc3QgPyAnICcgOiAnXG4nKTsKKwkJCWlmIChyZXZob3N0KSB7CisJCQkJcHV0cyhyZXZob3N0KTsKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJCWZyZWUocmV2aG9zdCk7CisJCQl9CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShkb3R0ZWQpOworCQkJY3VyID0gY3VyLT5haV9uZXh0OworCQl9CisJfSBlbHNlIHsKKyNpZiBFTkFCTEVfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUworCQliYl9lcnJvcl9tc2coImNhbid0IHJlc29sdmUgJyVzJzogJXMiLCBob3N0bmFtZSwgZ2FpX3N0cmVycm9yKHJjKSk7CisjZWxzZQorCQliYl9lcnJvcl9tc2coImNhbid0IHJlc29sdmUgJyVzJyIsIGhvc3RuYW1lKTsKKyNlbmRpZgorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgcmVzdWx0KQorCQlmcmVlYWRkcmluZm8ocmVzdWx0KTsKKwlyZXR1cm4gKHJjICE9IDApOworfQorCisvKiBsb29rdXAgdGhlIGRlZmF1bHQgbmFtZXNlcnZlciBhbmQgZGlzcGxheSBpdCAqLworc3RhdGljIHZvaWQgc2VydmVyX3ByaW50KHZvaWQpCit7CisJY2hhciAqc2VydmVyOworCXN0cnVjdCBzb2NrYWRkciAqc2E7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJc2EgPSAoc3RydWN0IHNvY2thZGRyKilfcmVzLl91Ll9leHQubnNhZGRyc1swXTsKKwlpZiAoIXNhKQorI2VuZGlmCisJCXNhID0gKHN0cnVjdCBzb2NrYWRkciopJl9yZXMubnNhZGRyX2xpc3RbMF07CisJc2VydmVyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KHNhKTsKKworCXByaW50X2hvc3Qoc2VydmVyLCAiU2VydmVyOiIpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShzZXJ2ZXIpOworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKKy8qIGFsdGVyIHRoZSBnbG9iYWwgX3JlcyBuYW1lc2VydmVyIHN0cnVjdHVyZSB0byB1c2UKKyAgIGFuIGV4cGxpY2l0IGRucyBzZXJ2ZXIgaW5zdGVhZCBvZiB3aGF0IGlzIGluIC9ldGMvcmVzb2x2LmNvbmYgKi8KK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2Rucyhjb25zdCBjaGFyICpzZXJ2ZXIpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCisJLyogTkI6IHRoaXMgd29ya3MgZXZlbiB3aXRoLCBzYXksICJbOjoxXTo1MzUzIiEgOikgKi8KKwlsc2EgPSB4aG9zdDJzb2NrYWRkcihzZXJ2ZXIsIDUzKTsKKworCWlmIChsc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJX3Jlcy5uc2NvdW50ID0gMTsKKwkJLyogc3RydWN0IGNvcHkgKi8KKwkJX3Jlcy5uc2FkZHJfbGlzdFswXSA9IGxzYS0+dS5zaW47CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkvKiBIb3BlZCBsaWJjIGNhbiBjb3BlIHdpdGggSVB2NCBhZGRyZXNzIHRoZXJlIHRvby4KKwkgKiBObyBzdWNoIGx1Y2ssIGdsaWJjIDIuNCBzZWdmYXVsdHMgZXZlbiB3aXRoIElQdjYsCisJICogbWF5YmUgSSBtaXN1bmRlcnN0YW5kIGhvdyB0byBtYWtlIGdsaWJjIHVzZSBJUHY2IGFkZHI/CisJICogKHVjbGliYyAwLjkuMzErIHNob3VsZCB3b3JrKSAqLworCWlmIChsc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCS8vIGdsaWJjIG5laXRoZXIgU0VHVnMgbm9yIHNlbmRzIGFueSBkZ3JhbXMgd2l0aCB0aGlzCisJCS8vIChzdHJhY2Ugc2hvd3Mgbm8gc29ja2V0IG9wcyk6CisJCS8vX3Jlcy5uc2NvdW50ID0gMDsKKwkJX3Jlcy5fdS5fZXh0Lm5zY291bnQgPSAxOworCQkvKiBzdG9yZSBhIHBvaW50ZXIgdG8gcGFydCBvZiBtYWxsb2MnZWQgbHNhICovCisJCV9yZXMuX3UuX2V4dC5uc2FkZHJzWzBdID0gJmxzYS0+dS5zaW42OworCQkvKiBtdXN0IG5vdCBmcmVlKGxzYSkhICovCisJfQorI2VuZGlmCit9CisKK2ludCBuc2xvb2t1cF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbnNsb29rdXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyogV2UgYWxsb3cgMSBvciAyIGFyZ3VtZW50cy4KKwkgKiBUaGUgZmlyc3QgaXMgdGhlIG5hbWUgdG8gYmUgbG9va2VkIHVwIGFuZCB0aGUgc2Vjb25kIGlzIGFuCisJICogb3B0aW9uYWwgRE5TIHNlcnZlciB3aXRoIHdoaWNoIHRvIGRvIHRoZSBsb29rdXAuCisJICogTW9yZSB0aGFuIDMgYXJndW1lbnRzIGlzIGFuIGVycm9yIHRvIGZvbGxvdyB0aGUgcGF0dGVybiBvZiB0aGUKKwkgKiBzdGFuZGFyZCBuc2xvb2t1cCAqLworCWlmICghYXJndlsxXSB8fCBhcmd2WzFdWzBdID09ICctJyB8fCBhcmdjID4gMykKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogaW5pdGlhbGl6ZSBETlMgc3RydWN0dXJlIF9yZXMgdXNlZCBpbiBwcmludGluZyB0aGUgZGVmYXVsdAorCSAqIG5hbWUgc2VydmVyIGFuZCBpbiB0aGUgZXhwbGljaXQgbmFtZSBzZXJ2ZXIgb3B0aW9uIGZlYXR1cmUuICovCisJcmVzX2luaXQoKTsKKwkvKiByZmMyMTMzIHNheXMgdGhpcyBlbmFibGVzIElQdjYgbG9va3VwcyAqLworCS8qIChidXQgaXQgYWxzbyBzYXlzICJtYXkgYmUgZW5hYmxlZCBpbiAvZXRjL3Jlc29sdi5jb25mIikgKi8KKwkvKl9yZXMub3B0aW9ucyB8PSBSRVNfVVNFX0lORVQ2OyovCisKKwlpZiAoYXJndlsyXSkKKwkJc2V0X2RlZmF1bHRfZG5zKGFyZ3ZbMl0pOworCisJc2VydmVyX3ByaW50KCk7CisJcmV0dXJuIHByaW50X2hvc3QoYXJndlsxXSwgIk5hbWU6Iik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL250cGQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbnRwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmFmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL250cGQuYwpAQCAtMCwwICsxLDIyOTIgQEAKKy8qCisgKiBOVFAgY2xpZW50L3NlcnZlciwgYmFzZWQgb24gT3Blbk5UUEQgMy45cDEKKyAqCisgKiBBdXRob3I6IEFkYW0gVGthYyA8dm9uc2NoQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFBhcnRzIG9mIE9wZW5OVFBEIGNsb2NrIHN5bmNyb25pemF0aW9uIGNvZGUgaXMgcmVwbGFjZWQgYnkKKyAqIGNvZGUgd2hpY2ggaXMgYmFzZWQgb24gbnRwLTQuMi42LCB3aHVjaCBjYXJyaWVzIHRoZSBmb2xsb3dpbmcKKyAqIGNvcHlyaWdodCBub3RpY2U6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoYykgVW5pdmVyc2l0eSBvZiBEZWxhd2FyZSAxOTkyLTIwMDkgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCAgICoKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSAgICAgKgorICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCAgICAqCisgKiBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uICAgICAgICoKKyAqIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSAgICAgICAgKgorICogVW5pdmVyc2l0eSBvZiBEZWxhd2FyZSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgICAgICAqCisgKiBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgICAgICAgICoKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGhlIFVuaXZlcnNpdHkgb2YgRGVsYXdhcmUgbWFrZXMgbm8gICAgICAgKgorICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgICAgICAgICAqCisgKiBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkICAgICAgICAgICoKKyAqIHdhcnJhbnR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbnRwZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1kbnFOdyJJRl9GRUFUVVJFX05UUERfU0VSVkVSKCJsIikiXSBbLVMgUFJPR10gWy1wIFBFRVJdLi4uIgorLy91c2FnZTojZGVmaW5lIG50cGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJOVFAgY2xpZW50L3NlcnZlclxuIgorLy91c2FnZTogICAgICJcbgktZAlWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktbglEbyBub3QgZGFlbW9uaXplIgorLy91c2FnZTogICAgICJcbgktcQlRdWl0IGFmdGVyIGNsb2NrIGlzIHNldCIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JUnVuIGF0IGhpZ2ggcHJpb3JpdHkiCisvL3VzYWdlOiAgICAgIlxuCS13CURvIG5vdCBzZXQgdGltZSAob25seSBxdWVyeSBwZWVycyksIGltcGxpZXMgLW4iCisvL3VzYWdlOglJRl9GRUFUVVJFX05UUERfU0VSVkVSKAorLy91c2FnZTogICAgICJcbgktbAlSdW4gYXMgc2VydmVyIG9uIHBvcnQgMTIzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktUyBQUk9HCVJ1biBQUk9HIGFmdGVyIHN0ZXBwaW5nIHRpbWUsIHN0cmF0dW0gY2hhbmdlLCBhbmQgZXZlcnkgMTEgbWlucyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUEVFUglPYnRhaW4gdGltZSBmcm9tIFBFRVIgKG1heSBiZSByZXBlYXRlZCkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+IC8qIEZvciBJUFRPU19MT1dERUxBWSBkZWZpbml0aW9uICovCisjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CisjaWZuZGVmIElQVE9TX0xPV0RFTEFZCisjIGRlZmluZSBJUFRPU19MT1dERUxBWSAweDEwCisjZW5kaWYKKyNpZm5kZWYgSVBfUEtUSU5GTworIyBlcnJvciAiU29ycnksIHlvdXIga2VybmVsIGhhcyB0byBzdXBwb3J0IElQX1BLVElORk8iCisjZW5kaWYKKworCisvKiBWZXJib3NpdHkgY29udHJvbCAobWF4IGxldmVsIG9mIC1kZGRkIG9wdGlvbnMgYWNjZXB0ZWQpLgorICogbWF4IDUgaXMgdmVyeSB0YWxrYXRpdmUgKGFuZCBibG9hdGVkKS4gMiBpcyBub24tYmxvYXRlZCwKKyAqIHByb2R1Y3Rpb24gbGV2ZWwgc2V0dGluZy4KKyAqLworI2RlZmluZSBNQVhfVkVSQk9TRSAgICAgMgorCisKKy8qIEhpZ2gtbGV2ZWwgZGVzY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobToKKyAqCisgKiBXZSBzdGFydCBydW5uaW5nIHdpdGggdmVyeSBzbWFsbCBwb2xsX2V4cCwgQlVSU1RQT0xMLAorICogaW4gb3JkZXIgdG8gcXVpY2tseSBhY2N1bXVsYXRlIElOSVRJQUxfU0FNUExFUyBkYXRhcG9pbnRzCisgKiBmb3IgZWFjaCBwZWVyLiBUaGVuLCB0aW1lIGlzIHN0ZXBwZWQgaWYgdGhlIG9mZnNldCBpcyBsYXJnZXIKKyAqIHRoYW4gU1RFUF9USFJFU0hPTEQsIG90aGVyd2lzZSBpdCBpc24ndDsgYW55d2F5LCB3ZSBlbmxhcmdlCisgKiBwb2xsX2V4cCB0byBNSU5QT0xMIGFuZCBlbnRlciBmcmVxdWVuY3kgbWVhc3VyZW1lbnQgc3RlcDoKKyAqIHdlIGNvbGxlY3QgbmV3IGRhdGFwb2ludHMgYnV0IGlnbm9yZSB0aGVtIGZvciBXQVRDSF9USFJFU0hPTEQKKyAqIHNlY29uZHMuIEFmdGVyIFdBVENIX1RIUkVTSE9MRCBzZWNvbmRzIHdlIGxvb2sgYXQgYWNjdW11bGF0ZWQKKyAqIG9mZnNldCBhbmQgZXN0aW1hdGUgZnJlcXVlbmN5IGRyaWZ0LgorICoKKyAqIChmcmVxdWVuY3kgbWVhc3VyZW1lbnQgc3RlcCBzZWVtcyB0byBub3QgYmUgc3RyaWN0bHkgbmVlZGVkLAorICogaXQgaXMgY29uZGl0aW9uYWxseSBkaXNhYmxlZCB3aXRoIFVTSU5HX0lOSVRJQUxfRlJFUV9FU1RJTUFUSU9OCisgKiBkZWZpbmUgc2V0IHRvIDApCisgKgorICogQWZ0ZXIgdGhpcywgd2UgZW50ZXIgInN0ZWFkeSBzdGF0ZSI6IHdlIGNvbGxlY3QgYSBkYXRhcG9pbnQsCisgKiB3ZSBzZWxlY3QgdGhlIGJlc3QgcGVlciwgaWYgdGhpcyBkYXRhcG9pbnQgaXMgbm90IGEgbmV3IG9uZQorICogKElPVzogaWYgdGhpcyBkYXRhcG9pbnQgaXNuJ3QgZm9yIHNlbGVjdGVkIHBlZXIpLCBzbGVlcAorICogYW5kIGNvbGxlY3QgYW5vdGhlciBvbmU7IG90aGVyd2lzZSwgdXNlIGl0cyBvZmZzZXQgdG8gdXBkYXRlCisgKiBmcmVxdWVuY3kgZHJpZnQsIGlmIG9mZnNldCBpcyBzb21ld2hhdCBsYXJnZSwgcmVkdWNlIHBvbGxfZXhwLAorICogb3RoZXJ3aXNlIGluY3JlYXNlIHBvbGxfZXhwLgorICoKKyAqIElmIG9mZnNldCBpcyBsYXJnZXIgdGhhbiBTVEVQX1RIUkVTSE9MRCwgd2hpY2ggc2hvdWxkbid0IG5vcm1hbGx5CisgKiBoYXBwZW4sIHdlIGFzc3VtZSB0aGF0IHNvbWV0aGluZyAiYmFkIiBoYXBwZW5lZCAoY29tcHV0ZXIKKyAqIHdhcyBoaWJlcm5hdGVkLCBzb21lb25lIHNldCB0b3RhbGx5IHdyb25nIGRhdGUsIGV0YyksCisgKiB0aGVuIHRoZSB0aW1lIGlzIHN0ZXBwZWQsIGFsbCBkYXRhcG9pbnRzIGFyZSBkaXNjYXJkZWQsCisgKiBhbmQgd2UgZ28gYmFjayB0byBzdGVhZHkgc3RhdGUuCisgKi8KKworI2RlZmluZSBSRVRSWV9JTlRFUlZBTCAgNSAgICAgICAvKiBvbiBlcnJvciwgcmV0cnkgaW4gTiBzZWNzICovCisjZGVmaW5lIFJFU1BPTlNFX0lOVEVSVkFMIDE1ICAgIC8qIHdhaXQgZm9yIHJlcGx5IHVwIHRvIE4gc2VjcyAqLworI2RlZmluZSBJTklUSUFMX1NBTVBMRVMgNCAgICAgICAvKiBob3cgbWFueSBzYW1wbGVzIGRvIHdlIHdhbnQgZm9yIGluaXQgKi8KKworLyogQ2xvY2sgZGlzY2lwbGluZSBwYXJhbWV0ZXJzIGFuZCBjb25zdGFudHMgKi8KKworLyogU3RlcCB0aHJlc2hvbGQgKHNlYykuIHN0ZCBudHBkIHVzZXMgMC4xMjguCisgKiBVc2luZyBleGFjdCBwb3dlciBvZiAyICgxLzgpIHJlc3VsdHMgaW4gc21hbGxlciBjb2RlICovCisjZGVmaW5lIFNURVBfVEhSRVNIT0xEICAwLjEyNQorI2RlZmluZSBXQVRDSF9USFJFU0hPTEQgMTI4ICAgICAvKiBzdGVwb3V0IHRocmVzaG9sZCAoc2VjKS4gc3RkIG50cGQgdXNlcyA5MDAgKDExIG1pbnMgKCEpKSAqLworLyogTkI6IHNldCBXQVRDSF9USFJFU0hPTEQgdG8gfjYwIHdoZW4gZGVidWdnaW5nIHRvIHNhdmUgdGltZSkgKi8KKy8vVU5VU0VEOiAjZGVmaW5lIFBBTklDX1RIUkVTSE9MRCAxMDAwICAgIC8qIHBhbmljIHRocmVzaG9sZCAoc2VjKSAqLworCisjZGVmaW5lIEZSRVFfVE9MRVJBTkNFICAwLjAwMDAxNSAvKiBmcmVxdWVuY3kgdG9sZXJhbmNlICgxNSBQUE0pICovCisjZGVmaW5lIEJVUlNUUE9MTCAgICAgICAwICAgICAgIC8qIGluaXRpYWwgcG9sbCAqLworI2RlZmluZSBNSU5QT0xMICAgICAgICAgNSAgICAgICAvKiBtaW5pbXVtIHBvbGwgaW50ZXJ2YWwuIHN0ZCBudHBkIHVzZXMgNiAoNjogNjQgc2VjKSAqLworI2RlZmluZSBCSUdQT0xMICAgICAgICAgMTAgICAgICAvKiBkcm9wIHRvIGxvd2VyIHBvbGwgYXQgYW55IHRyb3VibGUgKDEwOiAxNyBtaW4pICovCisjZGVmaW5lIE1BWFBPTEwgICAgICAgICAxMiAgICAgIC8qIG1heGltdW0gcG9sbCBpbnRlcnZhbCAoMTI6IDEuMWgsIDE3OiAzNi40aCkuIHN0ZCBudHBkIHVzZXMgMTcgKi8KKy8qIEFjdGl2ZWx5IGxvd2VyIHBvbGwgd2hlbiB3ZSBzZWUgc3VjaCBiaWcgb2Zmc2V0cy4KKyAqIFdpdGggU1RFUF9USFJFU0hPTEQgPSAwLjEyNSwgaXQgbWVhbnMgd2UgdHJ5IHRvIHN5bmMgbW9yZSBhZ2dyZXNzaXZlbHkKKyAqIGlmIG9mZnNldCBpbmNyZWFzZXMgb3ZlciAwLjAzIHNlYyAqLworI2RlZmluZSBQT0xMRE9XTl9PRkZTRVQgKFNURVBfVEhSRVNIT0xEIC8gNCkKKyNkZWZpbmUgTUlORElTUCAgICAgICAgIDAuMDEgICAgLyogbWluaW11bSBkaXNwZXJzaW9uIChzZWMpICovCisjZGVmaW5lIE1BWERJU1AgICAgICAgICAxNiAgICAgIC8qIG1heGltdW0gZGlzcGVyc2lvbiAoc2VjKSAqLworI2RlZmluZSBNQVhTVFJBVCAgICAgICAgMTYgICAgICAvKiBtYXhpbXVtIHN0cmF0dW0gKGluZmluaXR5IG1ldHJpYykgKi8KKyNkZWZpbmUgTUFYRElTVCAgICAgICAgIDEgICAgICAgLyogZGlzdGFuY2UgdGhyZXNob2xkIChzZWMpICovCisjZGVmaW5lIE1JTl9TRUxFQ1RFRCAgICAxICAgICAgIC8qIG1pbmltdW0gaW50ZXJzZWN0aW9uIHN1cnZpdm9ycyAqLworI2RlZmluZSBNSU5fQ0xVU1RFUkVEICAgMyAgICAgICAvKiBtaW5pbXVtIGNsdXN0ZXIgc3Vydml2b3JzICovCisKKyNkZWZpbmUgTUFYRFJJRlQgICAgICAgIDAuMDAwNTAwIC8qIGZyZXF1ZW5jeSBkcmlmdCB3ZSBjYW4gY29ycmVjdCAoNTAwIFBQTSkgKi8KKworLyogUG9sbC1hZGp1c3QgdGhyZXNob2xkLgorICogV2hlbiB3ZSBzZWUgdGhhdCBvZmZzZXQgaXMgc21hbGwgZW5vdWdoIGNvbXBhcmVkIHRvIGRpc2NpcGxpbmUgaml0dGVyLAorICogd2UgZ3JvdyBhIGNvdW50ZXI6ICs9IE1JTlBPTEwuIFdoZW4gaXQgZ29lcyBvdmVyIFBPTExBREpfTElNSVQsCisgKiB3ZSBwb2xsX2V4cCsrLiBJZiBvZmZzZXQgaXNuJ3Qgc21hbGwsIGNvdW50ZXIgLT0gcG9sbF9leHAqMiwKKyAqIGFuZCB3aGVuIGl0IGdvZXMgYmVsb3cgLVBPTExBREpfTElNSVQsIHdlIHBvbGxfZXhwLS0KKyAqIChidW1wZWQgZnJvbSAzMCB0byAzNiBzaW5jZSBvdGhlcndpc2UgSSBvZnRlbiBzZWUgcG9sbF9leHAgZ29pbmcgKjIqIHN0ZXBzIGRvd24pCisgKi8KKyNkZWZpbmUgUE9MTEFESl9MSU1JVCAgIDM2CisvKiBJZiBvZmZzZXQgPCBQT0xMQURKX0dBVEUgKiBkaXNjaXBsaW5lX2ppdHRlciwgdGhlbiB3ZSBjYW4gaW5jcmVhc2UKKyAqIHBvbGwgaW50ZXJ2YWwgKHdlIHRoaW5rIHdlIGNhbid0IGltcHJvdmUgdGltZWtlZXBpbmcKKyAqIGJ5IHN0YXlpbmcgYXQgc21hbGxlciBwb2xsKS4KKyAqLworI2RlZmluZSBQT0xMQURKX0dBVEUgICAgNAorLyogQ29tcHJvbWlzZSBBbGxhbiBpbnRlcmNlcHQgKHNlYykuIGRvYyB1c2VzIDE1MDAsIHN0ZCBudHBkIHVzZXMgNTEyICovCisjZGVmaW5lIEFMTEFOICAgICAgICAgICA1MTIKKy8qIFBMTCBsb29wIGdhaW4gKi8KKyNkZWZpbmUgUExMICAgICAgICAgICAgIDY1NTM2CisvKiBGTEwgbG9vcCBnYWluIFt3aHkgaXQgZGVwZW5kcyBvbiBNQVhQT0xMPz9dICovCisjZGVmaW5lIEZMTCAgICAgICAgICAgICAoTUFYUE9MTCArIDEpCisvKiBQYXJhbWV0ZXIgYXZlcmFnaW5nIGNvbnN0YW50ICovCisjZGVmaW5lIEFWRyAgICAgICAgICAgICA0CisKKworZW51bSB7CisJTlRQX1ZFUlNJT04gICAgID0gNCwKKwlOVFBfTUFYU1RSQVRVTSAgPSAxNSwKKworCU5UUF9ESUdFU1RTSVpFICAgICA9IDE2LAorCU5UUF9NU0dTSVpFX05PQVVUSCA9IDQ4LAorCU5UUF9NU0dTSVpFICAgICAgICA9IChOVFBfTVNHU0laRV9OT0FVVEggKyA0ICsgTlRQX0RJR0VTVFNJWkUpLAorCisJLyogU3RhdHVzIE1hc2tzICovCisJTU9ERV9NQVNLICAgICAgID0gKDcgPDwgMCksCisJVkVSU0lPTl9NQVNLICAgID0gKDcgPDwgMyksCisJVkVSU0lPTl9TSElGVCAgID0gMywKKwlMSV9NQVNLICAgICAgICAgPSAoMyA8PCA2KSwKKworCS8qIExlYXAgU2Vjb25kIENvZGVzIChoaWdoIG9yZGVyIHR3byBiaXRzIG9mIG1fc3RhdHVzKSAqLworCUxJX05PV0FSTklORyAgICA9ICgwIDw8IDYpLCAgICAvKiBubyB3YXJuaW5nICovCisJTElfUExVU1NFQyAgICAgID0gKDEgPDwgNiksICAgIC8qIGFkZCBhIHNlY29uZCAoNjEgc2Vjb25kcykgKi8KKwlMSV9NSU5VU1NFQyAgICAgPSAoMiA8PCA2KSwgICAgLyogbWludXMgYSBzZWNvbmQgKDU5IHNlY29uZHMpICovCisJTElfQUxBUk0gICAgICAgID0gKDMgPDwgNiksICAgIC8qIGFsYXJtIGNvbmRpdGlvbiAqLworCisJLyogTW9kZSB2YWx1ZXMgKi8KKwlNT0RFX1JFUzAgICAgICAgPSAwLCAgICAvKiByZXNlcnZlZCAqLworCU1PREVfU1lNX0FDVCAgICA9IDEsICAgIC8qIHN5bW1ldHJpYyBhY3RpdmUgKi8KKwlNT0RFX1NZTV9QQVMgICAgPSAyLCAgICAvKiBzeW1tZXRyaWMgcGFzc2l2ZSAqLworCU1PREVfQ0xJRU5UICAgICA9IDMsICAgIC8qIGNsaWVudCAqLworCU1PREVfU0VSVkVSICAgICA9IDQsICAgIC8qIHNlcnZlciAqLworCU1PREVfQlJPQURDQVNUICA9IDUsICAgIC8qIGJyb2FkY2FzdCAqLworCU1PREVfUkVTMSAgICAgICA9IDYsICAgIC8qIHJlc2VydmVkIGZvciBOVFAgY29udHJvbCBtZXNzYWdlICovCisJTU9ERV9SRVMyICAgICAgID0gNywgICAgLyogcmVzZXJ2ZWQgZm9yIHByaXZhdGUgdXNlICovCit9OworCisvL1RPRE86IGJldHRlciBiYXNlIHNlbGVjdGlvbgorI2RlZmluZSBPRkZTRVRfMTkwMF8xOTcwIDIyMDg5ODg4MDBVTCAgLyogMTk3MCAtIDE5MDAgaW4gc2Vjb25kcyAqLworCisjZGVmaW5lIE5VTV9EQVRBUE9JTlRTICA4CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBpbnRfcGFydGw7CisJdWludDMyX3QgZnJhY3Rpb25sOworfSBsX2ZpeGVkcHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IGludF9wYXJ0czsKKwl1aW50MTZfdCBmcmFjdGlvbnM7Cit9IHNfZml4ZWRwdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCAgICAgbV9zdGF0dXM7ICAgICAvKiBzdGF0dXMgb2YgbG9jYWwgY2xvY2sgYW5kIGxlYXAgaW5mbyAqLworCXVpbnQ4X3QgICAgIG1fc3RyYXR1bTsKKwl1aW50OF90ICAgICBtX3Bwb2xsOyAgICAgIC8qIHBvbGwgdmFsdWUgKi8KKwlpbnQ4X3QgICAgICBtX3ByZWNpc2lvbl9leHA7CisJc19maXhlZHB0X3QgbV9yb290ZGVsYXk7CisJc19maXhlZHB0X3QgbV9yb290ZGlzcDsKKwl1aW50MzJfdCAgICBtX3JlZmlkOworCWxfZml4ZWRwdF90IG1fcmVmdGltZTsKKwlsX2ZpeGVkcHRfdCBtX29yZ3RpbWU7CisJbF9maXhlZHB0X3QgbV9yZWN0aW1lOworCWxfZml4ZWRwdF90IG1feG10dGltZTsKKwl1aW50MzJfdCAgICBtX2tleWlkOworCXVpbnQ4X3QgICAgIG1fZGlnZXN0W05UUF9ESUdFU1RTSVpFXTsKK30gbXNnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlkb3VibGUgZF9yZWN2X3RpbWU7CisJZG91YmxlIGRfb2Zmc2V0OworCWRvdWJsZSBkX2Rpc3BlcnNpb247Cit9IGRhdGFwb2ludF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJbGVuX2FuZF9zb2NrYWRkciAqcF9sc2E7CisJY2hhciAgICAgICAgICAgICAqcF9kb3R0ZWQ7CisJLyogd2hlbiB0byBzZW5kIG5ldyBxdWVyeSAoaWYgcF9mZCA9PSAtMSkKKwkgKiBvciB3aGVuIHJlY2VpdmUgdGltZXMgb3V0IChpZiBwX2ZkID49IDApOiAqLworCWludCAgICAgICAgICAgICAgcF9mZDsKKwlpbnQgICAgICAgICAgICAgIGRhdGFwb2ludF9pZHg7CisJdWludDMyX3QgICAgICAgICBsYXN0cGt0X3JlZmlkOworCXVpbnQ4X3QgICAgICAgICAgbGFzdHBrdF9zdGF0dXM7CisJdWludDhfdCAgICAgICAgICBsYXN0cGt0X3N0cmF0dW07CisJdWludDhfdCAgICAgICAgICByZWFjaGFibGVfYml0czsKKwlkb3VibGUgICAgICAgICAgIG5leHRfYWN0aW9uX3RpbWU7CisJZG91YmxlICAgICAgICAgICBwX3htdHRpbWU7CisJZG91YmxlICAgICAgICAgICBsYXN0cGt0X3JlY3ZfdGltZTsKKwlkb3VibGUgICAgICAgICAgIGxhc3Rwa3RfZGVsYXk7CisJZG91YmxlICAgICAgICAgICBsYXN0cGt0X3Jvb3RkZWxheTsKKwlkb3VibGUgICAgICAgICAgIGxhc3Rwa3Rfcm9vdGRpc3A7CisJLyogcHJvZHVjZWQgYnkgZmlsdGVyIGFsZ29yaXRobTogKi8KKwlkb3VibGUgICAgICAgICAgIGZpbHRlcl9vZmZzZXQ7CisJZG91YmxlICAgICAgICAgICBmaWx0ZXJfZGlzcGVyc2lvbjsKKwlkb3VibGUgICAgICAgICAgIGZpbHRlcl9qaXR0ZXI7CisJZGF0YXBvaW50X3QgICAgICBmaWx0ZXJfZGF0YXBvaW50W05VTV9EQVRBUE9JTlRTXTsKKwkvKiBsYXN0IHNlbnQgcGFja2V0OiAqLworCW1zZ190ICAgICAgICAgICAgcF94bXRfbXNnOworfSBwZWVyX3Q7CisKKworI2RlZmluZSBVU0lOR19LRVJORUxfUExMX0xPT1AgICAgICAgICAgMQorI2RlZmluZSBVU0lOR19JTklUSUFMX0ZSRVFfRVNUSU1BVElPTiAgMAorCitlbnVtIHsKKwlPUFRfbiA9ICgxIDw8IDApLAorCU9QVF9xID0gKDEgPDwgMSksCisJT1BUX04gPSAoMSA8PCAyKSwKKwlPUFRfeCA9ICgxIDw8IDMpLAorCS8qIEluc2VydCBuZXcgb3B0aW9ucyBhYm92ZSB0aGlzIGxpbmUuICovCisJLyogTm9uLWNvbXBhdCBvcHRpb25zOiAqLworCU9QVF93ID0gKDEgPDwgNCksCisJT1BUX3AgPSAoMSA8PCA1KSwKKwlPUFRfUyA9ICgxIDw8IDYpLAorCU9QVF9sID0gKDEgPDwgNykgKiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUiwKKwkvKiBXZSBoaWphY2sgc29tZSBiaXRzIGZvciBvdGhlciBwdXJwb3NlcyAqLworCU9QVF9xcSA9ICgxIDw8IDgpLAorfTsKKworc3RydWN0IGdsb2JhbHMgeworCWRvdWJsZSAgIGN1cl90aW1lOworCS8qIHRvdGFsIHJvdW5kIHRyaXAgZGVsYXkgdG8gY3VycmVudGx5IHNlbGVjdGVkIHJlZmVyZW5jZSBjbG9jayAqLworCWRvdWJsZSAgIHJvb3RkZWxheTsKKwkvKiByZWZlcmVuY2UgdGltZXN0YW1wOiB0aW1lIHdoZW4gdGhlIHN5c3RlbSBjbG9jayB3YXMgbGFzdCBzZXQgb3IgY29ycmVjdGVkICovCisJZG91YmxlICAgcmVmdGltZTsKKwkvKiB0b3RhbCBkaXNwZXJzaW9uIHRvIGN1cnJlbnRseSBzZWxlY3RlZCByZWZlcmVuY2UgY2xvY2sgKi8KKwlkb3VibGUgICByb290ZGlzcDsKKworCWRvdWJsZSAgIGxhc3Rfc2NyaXB0X3J1bjsKKwljaGFyICAgICAqc2NyaXB0X25hbWU7CisJbGxpc3RfdCAgKm50cF9wZWVyczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorCWludCAgICAgIGxpc3Rlbl9mZDsKKyNlbmRpZgorCXVuc2lnbmVkIHZlcmJvc2U7CisJdW5zaWduZWQgcGVlcl9jbnQ7CisJLyogcmVmaWQ6IDMyLWJpdCBjb2RlIGlkZW50aWZ5aW5nIHRoZSBwYXJ0aWN1bGFyIHNlcnZlciBvciByZWZlcmVuY2UgY2xvY2sKKwkgKiAgaW4gc3RyYXR1bSAwIHBhY2tldHMgdGhpcyBpcyBhIGZvdXItY2hhcmFjdGVyIEFTQ0lJIHN0cmluZywKKwkgKiAgY2FsbGVkIHRoZSBraXNzIGNvZGUsIHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgbW9uaXRvcmluZworCSAqICBpbiBzdHJhdHVtIDEgcGFja2V0cyB0aGlzIGlzIGEgZm91ci1jaGFyYWN0ZXIgQVNDSUkgc3RyaW5nCisJICogIGFzc2lnbmVkIHRvIHRoZSByZWZlcmVuY2UgY2xvY2sgYnkgSUFOQS4gRXhhbXBsZTogIkdQUyAiCisJICogIGluIHN0cmF0dW0gMisgcGFja2V0cywgaXQncyBJUHY0IGFkZHJlc3Mgb3IgNCBmaXJzdCBieXRlcyBvZiBNRDUgaGFzaCBvZiBJUHY2CisJICovCisJdWludDMyX3QgcmVmaWQ7CisJdWludDhfdCAgbnRwX3N0YXR1czsKKwkvKiBwcmVjaXNpb24gaXMgZGVmaW5lZCBhcyB0aGUgbGFyZ2VyIG9mIHRoZSByZXNvbHV0aW9uIGFuZCB0aW1lIHRvCisJICogcmVhZCB0aGUgY2xvY2ssIGluIGxvZzIgdW5pdHMuICBGb3IgaW5zdGFuY2UsIHRoZSBwcmVjaXNpb24gb2YgYQorCSAqIG1haW5zLWZyZXF1ZW5jeSBjbG9jayBpbmNyZW1lbnRpbmcgYXQgNjAgSHogaXMgMTYgbXMsIGV2ZW4gd2hlbiB0aGUKKwkgKiBzeXN0ZW0gY2xvY2sgaGFyZHdhcmUgcmVwcmVzZW50YXRpb24gaXMgdG8gdGhlIG5hbm9zZWNvbmQuCisJICoKKwkgKiBEZWxheXMsIGppdHRlcnMgb2YgdmFyaW91cyBraW5kcyBhcmUgY2xhbXBlciBkb3duIHRvIHByZWNpc2lvbi4KKwkgKgorCSAqIElmIHByZWNpc2lvbl9zZWMgaXMgdG9vIGxhcmdlLCBkaXNjaXBsaW5lX2ppdHRlciBnZXRzIGNsYW1wZWQgdG8gaXQKKwkgKiBhbmQgaWYgb2Zmc2V0IGlzIG11Y2ggc21hbGxlciB0aGFuIGRpc2NpcGxpbmVfaml0dGVyLCBwb2xsIGludGVydmFsCisJICogZ3Jvd3MgZXZlbiB0aG91Z2ggd2UgcmVhbGx5IGNhbiBiZW5lZml0IGZyb20gc3RheWluZyBhdCBzbWFsbGVyIG9uZSwKKwkgKiBjb2xsZWN0aW5nIG5vbi1sYWdnZWQgZGF0YXBvaXRzIGFuZCBjb3JyZWN0aW5nIHRoZSBvZmZzZXQuCisJICogKExhZ2dlZCBkYXRhcG9pdHMgZXhpc3Qgd2hlbiBwb2xsX2V4cCBpcyBsYXJnZSBidXQgd2Ugc3RpbGwgaGF2ZQorCSAqIHN5c3RlbWF0aWMgb2Zmc2V0IGVycm9yIC0gdGhlIHRpbWUgZGlzdGFuY2UgYmV0d2VlbiBkYXRhcG9pbnRzCisJICogaXMgc2lnbmlmaWNhdCBhbmQgb2xkZXIgZGF0YXBvaW50cyBoYXZlIHNtYWxsZXIgb2Zmc2V0cy4KKwkgKiBUaGlzIG1ha2VzIG91ciBvZmZzZXQgZXN0aW1hdGlvbiBhIGJpdCBzbWFsbGVyIHRoYW4gcmVhbGl0eSkKKwkgKiBEdWUgdG8gdGhpcyBlZmZlY3QsIHNldHRpbmcgR19wcmVjaXNpb25fc2VjIGNsb3NlIHRvCisJICogU1RFUF9USFJFU0hPTEQgaXNuJ3Qgc3VjaCBhIGdvb2QgaWRlYSAtIG9mZnNldHMgbWF5IGdyb3cKKwkgKiB0b28gYmlnIGFuZCB3ZSB3aWxsIHN0ZXAuIEkgb2JzZXJ2ZWQgaXQgd2l0aCAtNi4KKwkgKgorCSAqIE9UT0gsIHNldHRpbmcgcHJlY2lzaW9uIHRvbyBzbWFsbCB3b3VsZCByZXN1bHQgaW4gZnV0aWxlIGF0dGVtcHRzCisJICogdG8gc3luY3Jvbml6ZSB0byB0aGUgdW5hY2hpZXZhYmxlIHByZWNpc2lvbi4KKwkgKgorCSAqIC02IGlzIDEvNjQgc2VjLCAtNyBpcyAxLzEyOCBzZWMgYW5kIHNvIG9uLgorCSAqLworI2RlZmluZSBHX3ByZWNpc2lvbl9leHAgIC04CisjZGVmaW5lIEdfcHJlY2lzaW9uX3NlYyAgKDEuMCAvICgxIDw8ICgtIEdfcHJlY2lzaW9uX2V4cCkpKQorCXVpbnQ4X3QgIHN0cmF0dW07CisJLyogQm9vbC4gQWZ0ZXIgc2V0IHRvIDEsIG5ldmVyIGdvZXMgYmFjayB0byAwOiAqLworCXNtYWxsaW50IGluaXRpYWxfcG9sbF9jb21wbGV0ZTsKKworI2RlZmluZSBTVEFURV9OU0VUICAgICAgMCAgICAgICAvKiBpbml0aWFsIHN0YXRlLCAibm90aGluZyBpcyBzZXQiICovCisvLyNkZWZpbmUgU1RBVEVfRlNFVCAgICAxICAgICAgIC8qIGZyZXF1ZW5jeSBzZXQgZnJvbSBmaWxlICovCisjZGVmaW5lIFNUQVRFX1NQSUsgICAgICAyICAgICAgIC8qIHNwaWtlIGRldGVjdGVkICovCisvLyNkZWZpbmUgU1RBVEVfRlJFUSAgICAzICAgICAgIC8qIGluaXRpYWwgZnJlcXVlbmN5ICovCisjZGVmaW5lIFNUQVRFX1NZTkMgICAgICA0ICAgICAgIC8qIGNsb2NrIHN5bmNocm9uaXplZCAobm9ybWFsIG9wZXJhdGlvbikgKi8KKwl1aW50OF90ICBkaXNjaXBsaW5lX3N0YXRlOyAgICAgIC8vIGRvYyBjYWxscyBpdCBjLnN0YXRlCisJdWludDhfdCAgcG9sbF9leHA7ICAgICAgICAgICAgICAvLyBzLnBvbGwKKwlpbnQgICAgICBwb2xsYWRqX2NvdW50OyAgICAgICAgIC8vIGMuY291bnQKKwlsb25nICAgICBrZXJuZWxfZnJlcV9kcmlmdDsKKwlwZWVyX3QgICAqbGFzdF91cGRhdGVfcGVlcjsKKwlkb3VibGUgICBsYXN0X3VwZGF0ZV9vZmZzZXQ7ICAgIC8vIGMubGFzdAorCWRvdWJsZSAgIGxhc3RfdXBkYXRlX3JlY3ZfdGltZTsgLy8gcy50CisJZG91YmxlICAgZGlzY2lwbGluZV9qaXR0ZXI7ICAgICAvLyBjLmppdHRlcgorCS8vZG91YmxlICAgY2x1c3Rlcl9vZmZzZXQ7ICAgICAgICAvLyBzLm9mZnNldAorCS8vZG91YmxlICAgY2x1c3Rlcl9qaXR0ZXI7ICAgICAgICAvLyBzLmppdHRlcgorI2lmICFVU0lOR19LRVJORUxfUExMX0xPT1AKKwlkb3VibGUgICBkaXNjaXBsaW5lX2ZyZXFfZHJpZnQ7IC8vIGMuZnJlcQorCS8qIE1heWJlIGNvbmRpdGlvbmFsbHkgY2FsY3VsYXRlIHdhbmRlcj8gaXQncyB1c2VkIG9ubHkgZm9yIGxvZ2dpbmcgKi8KKwlkb3VibGUgICBkaXNjaXBsaW5lX3dhbmRlcjsgICAgIC8vIGMud2FuZGVyCisjZW5kaWYKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKworc3RhdGljIGNvbnN0IGludCBjb25zdF9JUFRPU19MT1dERUxBWSA9IElQVE9TX0xPV0RFTEFZOworCisKKyNkZWZpbmUgVkVSQjEgaWYgKE1BWF9WRVJCT1NFICYmIEcudmVyYm9zZSkKKyNkZWZpbmUgVkVSQjIgaWYgKE1BWF9WRVJCT1NFID49IDIgJiYgRy52ZXJib3NlID49IDIpCisjZGVmaW5lIFZFUkIzIGlmIChNQVhfVkVSQk9TRSA+PSAzICYmIEcudmVyYm9zZSA+PSAzKQorI2RlZmluZSBWRVJCNCBpZiAoTUFYX1ZFUkJPU0UgPj0gNCAmJiBHLnZlcmJvc2UgPj0gNCkKKyNkZWZpbmUgVkVSQjUgaWYgKE1BWF9WRVJCT1NFID49IDUgJiYgRy52ZXJib3NlID49IDUpCisKKworc3RhdGljIGRvdWJsZSBMT0cyRChpbnQgYSkKK3sKKwlpZiAoYSA8IDApCisJCXJldHVybiAxLjAgLyAoMVVMIDw8IC1hKTsKKwlyZXR1cm4gMVVMIDw8IGE7Cit9CitzdGF0aWMgQUxXQVlTX0lOTElORSBkb3VibGUgU1FVQVJFKGRvdWJsZSB4KQoreworCXJldHVybiB4ICogeDsKK30KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGRvdWJsZSBNQVhEKGRvdWJsZSBhLCBkb3VibGUgYikKK3sKKwlpZiAoYSA+IGIpCisJCXJldHVybiBhOworCXJldHVybiBiOworfQorc3RhdGljIEFMV0FZU19JTkxJTkUgZG91YmxlIE1JTkQoZG91YmxlIGEsIGRvdWJsZSBiKQoreworCWlmIChhIDwgYikKKwkJcmV0dXJuIGE7CisJcmV0dXJuIGI7Cit9CitzdGF0aWMgTk9JTkxJTkUgZG91YmxlIG15X1NRUlQoZG91YmxlIFgpCit7CisJdW5pb24geworCQlmbG9hdCAgIGY7CisJCWludDMyX3QgaTsKKwl9IHY7CisJZG91YmxlIGludnNxcnQ7CisJZG91YmxlIFhoYWxmID0gWCAqIDAuNTsKKworCS8qIEZhc3QgYW5kIGdvb2QgYXBwcm94aW1hdGlvbiB0byAxL3NxcnQoWCksIGJsYWNrIG1hZ2ljICovCisJdi5mID0gWDsKKwkvKnYuaSA9IDB4NWYzNzU5ZGYgLSAodi5pID4+IDEpOyovCisJdi5pID0gMHg1ZjM3NWE4NiAtICh2LmkgPj4gMSk7IC8qIC0gdGhpcyBjb25zdGFudCBpcyBzbGlnaHRseSBiZXR0ZXIgKi8KKwlpbnZzcXJ0ID0gdi5mOyAvKiBiZXR0ZXIgdGhhbiAwLjIlIGFjY3VyYWN5ICovCisKKwkvKiBSZWZpbmluZyBpdCB1c2luZyBOZXd0b24ncyBtZXRob2Q6IHgxID0geDAgLSBmKHgwKS9mJyh4MCkKKwkgKiBmKHgpID0gMS8oeCp4KSAtIFggIChmPT0wIHdoZW4geCA9IDEvc3FydChYKSkKKwkgKiBmJyh4KSA9IC0yLyh4KngqeCkKKwkgKiBmKHgpL2YnKHgpID0gKFggLSAxLyh4KngpKSAvICgyLyh4KngqeCkpID0gWCp4KngqeC8yIC0geC8yCisJICogeDEgPSB4MCAtIChYKngwKngwKngwLzIgLSB4MC8yKSA9IDEuNSp4MCAtIFgqeDAqeDAqeDAvMiA9IHgwKigxLjUgLSAoWC8yKSp4MCp4MCkKKwkgKi8KKwlpbnZzcXJ0ID0gaW52c3FydCAqICgxLjUgLSBYaGFsZiAqIGludnNxcnQgKiBpbnZzcXJ0KTsgLyogfjAuMDUlIGFjY3VyYWN5ICovCisJLyogaW52c3FydCA9IGludnNxcnQgKiAoMS41IC0gWGhhbGYgKiBpbnZzcXJ0ICogaW52c3FydCk7IDJuZCBpdGVyOiB+MC4wMDAxJSBhY2N1cmFjeSAqLworCS8qIFdpdGggNCBpdGVyYXRpb25zLCBtb3JlIHRoYW4gaGFsZiByZXN1bHRzIHdpbGwgYmUgZXhhY3QsCisJICogYXQgNnRoIGl0ZXJhdGlvbnMgcmVzdWx0IHN0YWJpbGl6ZXMgd2l0aCBhYm91dCA3MiUgcmVzdWx0cyBleGFjdC4KKwkgKiBXZSBhcmUgd2VsbCBzYXRpc2ZpZWQgd2l0aCAwLjA1JSBhY2N1cmFjeS4KKwkgKi8KKworCXJldHVybiBYICogaW52c3FydDsgLyogWCAqIDEvc3FydChYKSB+PSBzcXJ0KFgpICovCit9CitzdGF0aWMgQUxXQVlTX0lOTElORSBkb3VibGUgU1FSVChkb3VibGUgWCkKK3sKKwkvKiBJZiB0aGlzIGFyY2ggZG9lc24ndCB1c2UgSUVFRSA3NTQgZmxvYXRzLCBmYWxsIGJhY2sgdG8gdXNpbmcgbGlibSAqLworCWlmIChzaXplb2YoZmxvYXQpICE9IDQpCisJCXJldHVybiBzcXJ0KFgpOworCisJLyogVGhpcyBhdm9pZHMgbmVlZGluZyBsaWJtLCBzYXZlcyBhYm91dCAwLjVrIG9uIHg4Ni0zMiAqLworCXJldHVybiBteV9TUVJUKFgpOworfQorCitzdGF0aWMgZG91YmxlCitnZXR0aW1lMTkwMGQodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsgLyogbmV2ZXIgZmFpbHMgKi8KKwlHLmN1cl90aW1lID0gdHYudHZfc2VjICsgKDEuMGUtNiAqIHR2LnR2X3VzZWMpICsgT0ZGU0VUXzE5MDBfMTk3MDsKKwlyZXR1cm4gRy5jdXJfdGltZTsKK30KKworc3RhdGljIHZvaWQKK2RfdG9fdHYoZG91YmxlIGQsIHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwl0di0+dHZfc2VjID0gKGxvbmcpZDsKKwl0di0+dHZfdXNlYyA9IChkIC0gdHYtPnR2X3NlYykgKiAxMDAwMDAwOworfQorCitzdGF0aWMgZG91YmxlCitsZnBfdG9fZChsX2ZpeGVkcHRfdCBsZnApCit7CisJZG91YmxlIHJldDsKKwlsZnAuaW50X3BhcnRsID0gbnRvaGwobGZwLmludF9wYXJ0bCk7CisJbGZwLmZyYWN0aW9ubCA9IG50b2hsKGxmcC5mcmFjdGlvbmwpOworCXJldCA9IChkb3VibGUpbGZwLmludF9wYXJ0bCArICgoZG91YmxlKWxmcC5mcmFjdGlvbmwgLyBVSU5UX01BWCk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBkb3VibGUKK3NmcF90b19kKHNfZml4ZWRwdF90IHNmcCkKK3sKKwlkb3VibGUgcmV0OworCXNmcC5pbnRfcGFydHMgPSBudG9ocyhzZnAuaW50X3BhcnRzKTsKKwlzZnAuZnJhY3Rpb25zID0gbnRvaHMoc2ZwLmZyYWN0aW9ucyk7CisJcmV0ID0gKGRvdWJsZSlzZnAuaW50X3BhcnRzICsgKChkb3VibGUpc2ZwLmZyYWN0aW9ucyAvIFVTSFJUX01BWCk7CisJcmV0dXJuIHJldDsKK30KKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorc3RhdGljIGxfZml4ZWRwdF90CitkX3RvX2xmcChkb3VibGUgZCkKK3sKKwlsX2ZpeGVkcHRfdCBsZnA7CisJbGZwLmludF9wYXJ0bCA9ICh1aW50MzJfdClkOworCWxmcC5mcmFjdGlvbmwgPSAodWludDMyX3QpKChkIC0gbGZwLmludF9wYXJ0bCkgKiBVSU5UX01BWCk7CisJbGZwLmludF9wYXJ0bCA9IGh0b25sKGxmcC5pbnRfcGFydGwpOworCWxmcC5mcmFjdGlvbmwgPSBodG9ubChsZnAuZnJhY3Rpb25sKTsKKwlyZXR1cm4gbGZwOworfQorc3RhdGljIHNfZml4ZWRwdF90CitkX3RvX3NmcChkb3VibGUgZCkKK3sKKwlzX2ZpeGVkcHRfdCBzZnA7CisJc2ZwLmludF9wYXJ0cyA9ICh1aW50MTZfdClkOworCXNmcC5mcmFjdGlvbnMgPSAodWludDE2X3QpKChkIC0gc2ZwLmludF9wYXJ0cykgKiBVU0hSVF9NQVgpOworCXNmcC5pbnRfcGFydHMgPSBodG9ucyhzZnAuaW50X3BhcnRzKTsKKwlzZnAuZnJhY3Rpb25zID0gaHRvbnMoc2ZwLmZyYWN0aW9ucyk7CisJcmV0dXJuIHNmcDsKK30KKyNlbmRpZgorCitzdGF0aWMgZG91YmxlCitkaXNwZXJzaW9uKGNvbnN0IGRhdGFwb2ludF90ICpkcCkKK3sKKwlyZXR1cm4gZHAtPmRfZGlzcGVyc2lvbiArIEZSRVFfVE9MRVJBTkNFICogKEcuY3VyX3RpbWUgLSBkcC0+ZF9yZWN2X3RpbWUpOworfQorCitzdGF0aWMgZG91YmxlCityb290X2Rpc3RhbmNlKHBlZXJfdCAqcCkKK3sKKwkvKiBUaGUgcm9vdCBzeW5jaHJvbml6YXRpb24gZGlzdGFuY2UgaXMgdGhlIG1heGltdW0gZXJyb3IgZHVlIHRvCisJICogYWxsIGNhdXNlcyBvZiB0aGUgbG9jYWwgY2xvY2sgcmVsYXRpdmUgdG8gdGhlIHByaW1hcnkgc2VydmVyLgorCSAqIEl0IGlzIGRlZmluZWQgYXMgaGFsZiB0aGUgdG90YWwgZGVsYXkgcGx1cyB0b3RhbCBkaXNwZXJzaW9uCisJICogcGx1cyBwZWVyIGppdHRlci4KKwkgKi8KKwlyZXR1cm4gTUFYRChNSU5ESVNQLCBwLT5sYXN0cGt0X3Jvb3RkZWxheSArIHAtPmxhc3Rwa3RfZGVsYXkpIC8gMgorCQkrIHAtPmxhc3Rwa3Rfcm9vdGRpc3AKKwkJKyBwLT5maWx0ZXJfZGlzcGVyc2lvbgorCQkrIEZSRVFfVE9MRVJBTkNFICogKEcuY3VyX3RpbWUgLSBwLT5sYXN0cGt0X3JlY3ZfdGltZSkKKwkJKyBwLT5maWx0ZXJfaml0dGVyOworfQorCitzdGF0aWMgdm9pZAorc2V0X25leHQocGVlcl90ICpwLCB1bnNpZ25lZCB0KQoreworCXAtPm5leHRfYWN0aW9uX3RpbWUgPSBHLmN1cl90aW1lICsgdDsKK30KKworLyoKKyAqIFBlZXIgY2xvY2sgZmlsdGVyIGFuZCBpdHMgaGVscGVycworICovCitzdGF0aWMgdm9pZAorZmlsdGVyX2RhdGFwb2ludHMocGVlcl90ICpwKQoreworCWludCBpLCBpZHg7CisJaW50IGdvdF9uZXdlc3Q7CisJZG91YmxlIG1pbm9mZiwgbWF4b2ZmLCB3YXZnLCBzdW0sIHc7CisJZG91YmxlIHggPSB4OyAvKiBmb3IgY29tcGlsZXIgKi8KKwlkb3VibGUgb2xkZXN0X29mZiA9IG9sZGVzdF9vZmY7CisJZG91YmxlIG9sZGVzdF9hZ2UgPSBvbGRlc3RfYWdlOworCWRvdWJsZSBuZXdlc3Rfb2ZmID0gbmV3ZXN0X29mZjsKKwlkb3VibGUgbmV3ZXN0X2FnZSA9IG5ld2VzdF9hZ2U7CisKKwltaW5vZmYgPSBtYXhvZmYgPSBwLT5maWx0ZXJfZGF0YXBvaW50WzBdLmRfb2Zmc2V0OworCWZvciAoaSA9IDE7IGkgPCBOVU1fREFUQVBPSU5UUzsgaSsrKSB7CisJCWlmIChtaW5vZmYgPiBwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0KQorCQkJbWlub2ZmID0gcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX29mZnNldDsKKwkJaWYgKG1heG9mZiA8IHAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9vZmZzZXQpCisJCQltYXhvZmYgPSBwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0OworCX0KKworCWlkeCA9IHAtPmRhdGFwb2ludF9pZHg7IC8qIG1vc3QgcmVjZW50IGRhdGFwb2ludCAqLworCS8qIEF2ZXJhZ2Ugb2Zmc2V0OgorCSAqIERyb3AgdHdvIG91dGxpZXJzIGFuZCB0YWtlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIHJlc3Q6CisJICogbW9zdF9yZWNlbnQvMiArIG9sZGVyMS80ICsgb2xkZXIyLzggLi4uICsgb2xkZXI1LzMyICsgb2xkZXI2LzMyCisJICogd2UgdXNlIG9sZGVyNi8zMiwgbm90IG9sZGVyNi82NCBzaW5jZSBzdW0gb2Ygd2VpZ2h0cyBzaG91bGQgYmUgMToKKwkgKiAxLzIgKyAxLzQgKyAxLzggKyAxLzE2ICsgMS8zMiArIDEvMzIgPSAxCisJICovCisJd2F2ZyA9IDA7CisJdyA9IDAuNTsKKwkvKiAgICAgICAgICAgICAgICAgICAgIG4tMQorCSAqICAgICAgICAgICAgICAgICAgICAgLS0tICAgIGRpc3BlcnNpb24oaSkKKwkgKiBmaWx0ZXJfZGlzcGVyc2lvbiA9ICBcICAgICAtLS0tLS0tLS0tLS0tCisJICogICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAoaSsxKQorCSAqICAgICAgICAgICAgICAgICAgICAgLS0tICAgICAyCisJICogICAgICAgICAgICAgICAgICAgICBpPTAKKwkgKi8KKwlnb3RfbmV3ZXN0ID0gMDsKKwlzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fREFUQVBPSU5UUzsgaSsrKSB7CisJCVZFUkI0IHsKKwkJCWJiX2Vycm9yX21zZygiZGF0YXBvaW50WyVkXTogb2ZmOiVmIGRpc3A6JWYoJWYpIGFnZTolZiVzIiwKKwkJCQlpLAorCQkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaWR4XS5kX29mZnNldCwKKwkJCQlwLT5maWx0ZXJfZGF0YXBvaW50W2lkeF0uZF9kaXNwZXJzaW9uLCBkaXNwZXJzaW9uKCZwLT5maWx0ZXJfZGF0YXBvaW50W2lkeF0pLAorCQkJCUcuY3VyX3RpbWUgLSBwLT5maWx0ZXJfZGF0YXBvaW50W2lkeF0uZF9yZWN2X3RpbWUsCisJCQkJKG1pbm9mZiA9PSBwLT5maWx0ZXJfZGF0YXBvaW50W2lkeF0uZF9vZmZzZXQgfHwgbWF4b2ZmID09IHAtPmZpbHRlcl9kYXRhcG9pbnRbaWR4XS5kX29mZnNldCkKKwkJCQkJPyAiIChvdXRsaWVyIGJ5IG9mZnNldCkiIDogIiIKKwkJCSk7CisJCX0KKworCQlzdW0gKz0gZGlzcGVyc2lvbigmcC0+ZmlsdGVyX2RhdGFwb2ludFtpZHhdKSAvICgyIDw8IGkpOworCisJCWlmIChtaW5vZmYgPT0gcC0+ZmlsdGVyX2RhdGFwb2ludFtpZHhdLmRfb2Zmc2V0KSB7CisJCQltaW5vZmYgLT0gMTsgLyogc28gdGhhdCB3ZSBkb24ndCBtYXRjaCBpdCBldmVyIGFnYWluICovCisJCX0gZWxzZQorCQlpZiAobWF4b2ZmID09IHAtPmZpbHRlcl9kYXRhcG9pbnRbaWR4XS5kX29mZnNldCkgeworCQkJbWF4b2ZmICs9IDE7CisJCX0gZWxzZSB7CisJCQlvbGRlc3Rfb2ZmID0gcC0+ZmlsdGVyX2RhdGFwb2ludFtpZHhdLmRfb2Zmc2V0OworCQkJb2xkZXN0X2FnZSA9IEcuY3VyX3RpbWUgLSBwLT5maWx0ZXJfZGF0YXBvaW50W2lkeF0uZF9yZWN2X3RpbWU7CisJCQlpZiAoIWdvdF9uZXdlc3QpIHsKKwkJCQlnb3RfbmV3ZXN0ID0gMTsKKwkJCQluZXdlc3Rfb2ZmID0gb2xkZXN0X29mZjsKKwkJCQluZXdlc3RfYWdlID0gb2xkZXN0X2FnZTsKKwkJCX0KKwkJCXggPSBvbGRlc3Rfb2ZmICogdzsKKwkJCXdhdmcgKz0geDsKKwkJCXcgLz0gMjsKKwkJfQorCisJCWlkeCA9IChpZHggLSAxKSAmIChOVU1fREFUQVBPSU5UUyAtIDEpOworCX0KKwlwLT5maWx0ZXJfZGlzcGVyc2lvbiA9IHN1bTsKKwl3YXZnICs9IHg7IC8qIGFkZCBhbm90aGVyIG9sZGVyNi82NCB0byBmb3JtIG9sZGVyNi8zMiAqLworCS8qIEZpeCBzeXN0ZW1hdGljIHVuZGVyZXN0aW1hdGlvbiB3aXRoIGxhcmdlIHBvbGwgaW50ZXJ2YWxzLgorCSAqIEltYWdpbmUgdGhhdCB3ZSBzdGlsbCBoYXZlIGEgYml0IG9mIHVuY29ycmVjdGVkIGRyaWZ0LAorCSAqIGFuZCBwb2xsIGludGVydmFsIGlzIGJpZyAoc2F5LCAxMDAgc2VjKS4gT2Zmc2V0cyBmb3JtIGEgcHJvZ3Jlc3Npb246CisJICogMC4wIDAuMSAwLjIgMC4zIDAuNCAwLjUgMC42IDAuNyAtIDAuNyBpcyBtb3N0IHJlY2VudC4KKwkgKiBUaGUgYWxnb3JpdGhtIGFib3ZlIGRyb3BzIDAuMCBhbmQgMC43IGFzIG91dGxpZXJzLAorCSAqIGFuZCB0aGVuIHdlIGhhdmUgdGhpcyBlc3RpbWF0aW9uLCB+MjUlIG9mZiBmcm9tIDAuNzoKKwkgKiAwLjEvMzIgKyAwLjIvMzIgKyAwLjMvMTYgKyAwLjQvOCArIDAuNS80ICsgMC42LzIgPSAwLjUwMzEyNQorCSAqLworCXggPSBvbGRlc3RfYWdlIC0gbmV3ZXN0X2FnZTsKKwlpZiAoeCAhPSAwKSB7CisJCXggPSBuZXdlc3RfYWdlIC8geDsgLyogaW4gYWJvdmUgZXhhbXBsZSwgMTAwIC8gKDYwMCAtIDEwMCkgKi8KKwkJaWYgKHggPCAxKSB7IC8qIHBhcmFub2lhIGNoZWNrICovCisJCQl4ID0gKG5ld2VzdF9vZmYgLSBvbGRlc3Rfb2ZmKSAqIHg7IC8qIDAuNSAqIDEwMC81MDAgPSAwLjEgKi8KKwkJCXdhdmcgKz0geDsKKwkJfQorCX0KKwlwLT5maWx0ZXJfb2Zmc2V0ID0gd2F2ZzsKKworCS8qICAgICAgICAgICAgICAgICAgKy0tLS0tICAgICAgICAgICAgICAgICAtLS0tLSsgXiAxLzIKKwkgKiAgICAgICAgICAgICAgICAgIHwgICAgICAgbi0xICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICB8ICAgICAgIC0tLSAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgfCAgMSAgICBcICAgICAgICAgICAgICAgIDIgIHwKKwkgKiBmaWx0ZXJfaml0dGVyID0gIHwgLS0tICogLyAgKGF2Zy1vZmZzZXRfaikgICB8CisJICogICAgICAgICAgICAgICAgICB8ICBuICAgIC0tLSAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgfCAgICAgICBqPTAgICAgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgICAgICstLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0rCisJICogd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIHZhbGlkIGRhdGFwb2ludHMgaW4gdGhlIGZpbHRlciAobiA+IDEpOworCSAqIGlmIGZpbHRlcl9qaXR0ZXIgPCBwcmVjaXNpb24gdGhlbiBmaWx0ZXJfaml0dGVyID0gcHJlY2lzaW9uCisJICovCisJc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RBVEFQT0lOVFM7IGkrKykgeworCQlzdW0gKz0gU1FVQVJFKHdhdmcgLSBwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0KTsKKwl9CisJc3VtID0gU1FSVChzdW0gLyBOVU1fREFUQVBPSU5UUyk7CisJcC0+ZmlsdGVyX2ppdHRlciA9IHN1bSA+IEdfcHJlY2lzaW9uX3NlYyA/IHN1bSA6IEdfcHJlY2lzaW9uX3NlYzsKKworCVZFUkIzIGJiX2Vycm9yX21zZygiZmlsdGVyIG9mZnNldDolZihjb3JyOiVlKSBkaXNwOiVmIGppdHRlcjolZiIsCisJCQlwLT5maWx0ZXJfb2Zmc2V0LCB4LAorCQkJcC0+ZmlsdGVyX2Rpc3BlcnNpb24sCisJCQlwLT5maWx0ZXJfaml0dGVyKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X3BlZXJfc3RhdHMocGVlcl90ICpwLCBkb3VibGUgb2Zmc2V0KQoreworCWludCBpOworCWJvb2wgc21hbGxfb2ZzID0gZmFicyhvZmZzZXQpIDwgMTYgKiBTVEVQX1RIUkVTSE9MRDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fREFUQVBPSU5UUzsgaSsrKSB7CisJCWlmIChzbWFsbF9vZnMpIHsKKwkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9yZWN2X3RpbWUgKz0gb2Zmc2V0OworCQkJaWYgKHAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9vZmZzZXQgIT0gMCkgeworCQkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9vZmZzZXQgKz0gb2Zmc2V0OworCQkJfQorCQl9IGVsc2UgeworCQkJcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX3JlY3ZfdGltZSAgPSBHLmN1cl90aW1lOworCQkJcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX29mZnNldCAgICAgPSAwOworCQkJcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX2Rpc3BlcnNpb24gPSBNQVhESVNQOworCQl9CisJfQorCWlmIChzbWFsbF9vZnMpIHsKKwkJcC0+bGFzdHBrdF9yZWN2X3RpbWUgKz0gb2Zmc2V0OworCX0gZWxzZSB7CisJCXAtPnJlYWNoYWJsZV9iaXRzID0gMDsKKwkJcC0+bGFzdHBrdF9yZWN2X3RpbWUgPSBHLmN1cl90aW1lOworCX0KKwlmaWx0ZXJfZGF0YXBvaW50cyhwKTsgLyogcmVjYWxjIHAtPmZpbHRlcl94eHggKi8KKwlWRVJCNSBiYl9lcnJvcl9tc2coIiVzLT5sYXN0cGt0X3JlY3ZfdGltZT0lZiIsIHAtPnBfZG90dGVkLCBwLT5sYXN0cGt0X3JlY3ZfdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfcGVlcnMoY2hhciAqcykKK3sKKwlwZWVyX3QgKnA7CisKKwlwID0geHphbGxvYyhzaXplb2YoKnApKTsKKwlwLT5wX2xzYSA9IHhob3N0MnNvY2thZGRyKHMsIDEyMyk7CisJcC0+cF9kb3R0ZWQgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoJnAtPnBfbHNhLT51LnNhKTsKKwlwLT5wX2ZkID0gLTE7CisJcC0+cF94bXRfbXNnLm1fc3RhdHVzID0gTU9ERV9DTElFTlQgfCAoTlRQX1ZFUlNJT04gPDwgMyk7CisJcC0+bmV4dF9hY3Rpb25fdGltZSA9IEcuY3VyX3RpbWU7IC8qID0gc2V0X25leHQocCwgMCk7ICovCisJcmVzZXRfcGVlcl9zdGF0cyhwLCAxNiAqIFNURVBfVEhSRVNIT0xEKTsKKworCWxsaXN0X2FkZF90bygmRy5udHBfcGVlcnMsIHApOworCUcucGVlcl9jbnQrKzsKK30KKworc3RhdGljIGludAorZG9fc2VuZHRvKGludCBmZCwKKwkJY29uc3Qgc3RydWN0IHNvY2thZGRyICpmcm9tLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBzb2NrbGVuX3QgYWRkcmxlbiwKKwkJbXNnX3QgKm1zZywgc3NpemVfdCBsZW4pCit7CisJc3NpemVfdCByZXQ7CisKKwllcnJubyA9IDA7CisJaWYgKCFmcm9tKSB7CisJCXJldCA9IHNlbmR0byhmZCwgbXNnLCBsZW4sIE1TR19ET05UV0FJVCwgdG8sIGFkZHJsZW4pOworCX0gZWxzZSB7CisJCXJldCA9IHNlbmRfdG9fZnJvbShmZCwgbXNnLCBsZW4sIE1TR19ET05UV0FJVCwgdG8sIGZyb20sIGFkZHJsZW4pOworCX0KKwlpZiAocmV0ICE9IGxlbikgeworCQliYl9wZXJyb3JfbXNnKCJzZW5kIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9xdWVyeV90b19wZWVyKHBlZXJfdCAqcCkKK3sKKwkvKiBXaHkgZG8gd2UgbmVlZCB0byBiaW5kKCk/CisJICogU2VlIHdoYXQgaGFwcGVucyB3aGVuIHdlIGRvbid0IGJpbmQ6CisJICoKKwkgKiBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19JUCkgPSAzCisJICogc2V0c29ja29wdCgzLCBTT0xfSVAsIElQX1RPUywgWzE2XSwgNCkgPSAwCisJICogZ2V0dGltZW9mZGF5KHsxMjU5MDcxMjY2LCAzMjc4ODV9LCBOVUxMKSA9IDAKKwkgKiBzZW5kdG8oMywgInh4eCIsIDQ4LCBNU0dfRE9OVFdBSVQsIHtzYV9mYW1pbHk9QUZfSU5FVCwgc2luX3BvcnQ9aHRvbnMoMTIzKSwgc2luX2FkZHI9aW5ldF9hZGRyKCIxMC4zNC4zMi4xMjUiKX0sIDE2KSA9IDQ4CisJICogXl5eIHdlIHNlbnQgaXQgZnJvbSBzb21lIHNvdXJjZSBwb3J0IHBpY2tlZCBieSBrZXJuZWwuCisJICogdGltZShOVUxMKSAgICAgICAgICAgICAgPSAxMjU5MDcxMjY2CisJICogd3JpdGUoMiwgIm50cGQ6IGVudGVyaW5nIHBvbGwgMTUgc2Vjc1xuIiwgMjgpID0gMjgKKwkgKiBwb2xsKFt7ZmQ9MywgZXZlbnRzPVBPTExJTn1dLCAxLCAxNTAwMCkgPSAxIChbe2ZkPTMsIHJldmVudHM9UE9MTElOfV0pCisJICogcmVjdigzLCAieXl5IiwgNjgsIE1TR19ET05UV0FJVCkgPSA0OAorCSAqIF5eXiB0aGlzIHJlY3Ygd2lsbCByZWNlaXZlIHBhY2tldHMgdG8gYW55IGxvY2FsIHBvcnQhCisJICoKKwkgKiBVbmNvbW1lbnQgdGhpcyBhbmQgdXNlIHN0cmFjZSB0byBzZWUgaXQgaW4gYWN0aW9uOgorCSAqLworI2RlZmluZSBQUk9CRV9MT0NBTF9BRERSIC8qIHsgbGVuX2FuZF9zb2NrYWRkciBsc2E7IGxzYS5sZW4gPSBMU0FfU0laRU9GX1NBOyBnZXRzb2NrbmFtZShwLT5xdWVyeS5mZCwgJmxzYS51LnNhLCAmbHNhLmxlbik7IH0gKi8KKworCWlmIChwLT5wX2ZkID09IC0xKSB7CisJCWludCBmZCwgZmFtaWx5OworCQlsZW5fYW5kX3NvY2thZGRyICpsb2NhbF9sc2E7CisKKwkJZmFtaWx5ID0gcC0+cF9sc2EtPnUuc2Euc2FfZmFtaWx5OworCQlwLT5wX2ZkID0gZmQgPSB4c29ja2V0X3R5cGUoJmxvY2FsX2xzYSwgZmFtaWx5LCBTT0NLX0RHUkFNKTsKKwkJLyogbG9jYWxfbHNhIGhhcyAibnVsbCIgYWRkcmVzcyBhbmQgcG9ydCAwIG5vdy4KKwkJICogYmluZCgpIGVuc3VyZXMgd2UgaGF2ZSBhICpwYXJ0aWN1bGFyIHBvcnQqIHNlbGVjdGVkIGJ5IGtlcm5lbAorCQkgKiBhbmQgcmVtZW1iZXJlZCBpbiBwLT5wX2ZkLCB0aHVzIGxhdGVyIHJlY3YocC0+cF9mZCkKKwkJICogcmVjZWl2ZXMgb25seSBwYWNrZXRzIHNlbnQgdG8gdGhpcyBwb3J0LgorCQkgKi8KKwkJUFJPQkVfTE9DQUxfQUREUgorCQl4YmluZChmZCwgJmxvY2FsX2xzYS0+dS5zYSwgbG9jYWxfbHNhLT5sZW4pOworCQlQUk9CRV9MT0NBTF9BRERSCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlpZiAoZmFtaWx5ID09IEFGX0lORVQpCisjZW5kaWYKKwkJCXNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVAsIElQX1RPUywgJmNvbnN0X0lQVE9TX0xPV0RFTEFZLCBzaXplb2YoY29uc3RfSVBUT1NfTE9XREVMQVkpKTsKKwkJZnJlZShsb2NhbF9sc2EpOworCX0KKworCS8qCisJICogU2VuZCBvdXQgYSByYW5kb20gNjQtYml0IG51bWJlciBhcyBvdXIgdHJhbnNtaXQgdGltZS4gIFRoZSBOVFAKKwkgKiBzZXJ2ZXIgd2lsbCBjb3B5IHNhaWQgbnVtYmVyIGludG8gdGhlIG9yaWdpbmF0ZSBmaWVsZCBvbiB0aGUKKwkgKiByZXNwb25zZSB0aGF0IGl0IHNlbmRzIHVzLiAgVGhpcyBpcyB0b3RhbGx5IGxlZ2FsIHBlciB0aGUgU05UUCBzcGVjLgorCSAqCisJICogVGhlIGltcGFjdCBvZiB0aGlzIGlzIHR3byBmb2xkOiB3ZSBubyBsb25nZXIgc2VuZCBvdXQgdGhlIGN1cnJlbnQKKwkgKiBzeXN0ZW0gdGltZSBmb3IgdGhlIHdvcmxkIHRvIHNlZSAod2hpY2ggbWF5IGFpZCBhbiBhdHRhY2tlciksIGFuZAorCSAqIGl0IGdpdmVzIHVzIGEgKG5vdCB2ZXJ5IHNlY3VyZSkgd2F5IG9mIGtub3dpbmcgdGhhdCB3ZSdyZSBub3QKKwkgKiBnZXR0aW5nIHNwb29mZWQgYnkgYW4gYXR0YWNrZXIgdGhhdCBjYW4ndCBjYXB0dXJlIG91ciB0cmFmZmljCisJICogYnV0IGNhbiBzcG9vZiBwYWNrZXRzIGZyb20gdGhlIE5UUCBzZXJ2ZXIgd2UncmUgY29tbXVuaWNhdGluZyB3aXRoLgorCSAqCisJICogU2F2ZSB0aGUgcmVhbCB0cmFuc21pdCB0aW1lc3RhbXAgbG9jYWxseS4KKwkgKi8KKwlwLT5wX3htdF9tc2cubV94bXR0aW1lLmludF9wYXJ0bCA9IHJhbmRvbSgpOworCXAtPnBfeG10X21zZy5tX3htdHRpbWUuZnJhY3Rpb25sID0gcmFuZG9tKCk7CisJcC0+cF94bXR0aW1lID0gZ2V0dGltZTE5MDBkKCk7CisKKwlpZiAoZG9fc2VuZHRvKHAtPnBfZmQsIC8qZnJvbToqLyBOVUxMLCAvKnRvOiovICZwLT5wX2xzYS0+dS5zYSwgLyphZGRybGVuOiovIHAtPnBfbHNhLT5sZW4sCisJCQkmcC0+cF94bXRfbXNnLCBOVFBfTVNHU0laRV9OT0FVVEgpID09IC0xCisJKSB7CisJCWNsb3NlKHAtPnBfZmQpOworCQlwLT5wX2ZkID0gLTE7CisJCXNldF9uZXh0KHAsIFJFVFJZX0lOVEVSVkFMKTsKKwkJcmV0dXJuOworCX0KKworCXAtPnJlYWNoYWJsZV9iaXRzIDw8PSAxOworCVZFUkIxIGJiX2Vycm9yX21zZygic2VudCBxdWVyeSB0byAlcyIsIHAtPnBfZG90dGVkKTsKKwlzZXRfbmV4dChwLCBSRVNQT05TRV9JTlRFUlZBTCk7Cit9CisKKworLyogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHByb3Zpc2lvbiB0byBwcmV2ZW50IHNldmVyYWwgcnVuX3NjcmlwdHMKKyAqIHRvIGJlIGRvbmUgaW4gcXVpY2sgc3VjY2Vzc2lvbi4gSW4gZmFjdCwgaXQgaGFwcGVucyByYXRoZXIgb2Z0ZW4KKyAqIGlmIGluaXRpYWwgc3luY3Jvbml6YXRpb24gcmVzdWx0cyBpbiBhIHN0ZXAuCisgKiBZb3Ugd2lsbCBzZWUgInN0ZXAiIGFuZCB0aGVuICJzdHJhdHVtIiBzY3JpcHQgcnVucywgc29tZXRpbWVzCisgKiBhcyBjbG9zZSBhcyBvbmx5IDAuMDAyIHNlY29uZHMgYXBhcnQuCisgKiBTY3JpcHQgc2hvdWxkIGJlIHJlYWR5IHRvIGRlYWwgd2l0aCB0aGlzLgorICovCitzdGF0aWMgdm9pZCBydW5fc2NyaXB0KGNvbnN0IGNoYXIgKmFjdGlvbiwgZG91YmxlIG9mZnNldCkKK3sKKwljaGFyICphcmd2WzNdOworCWNoYXIgKmVudjEsICplbnYyLCAqZW52MywgKmVudjQ7CisKKwlpZiAoIUcuc2NyaXB0X25hbWUpCisJCXJldHVybjsKKworCWFyZ3ZbMF0gPSAoY2hhciopIEcuc2NyaXB0X25hbWU7CisJYXJndlsxXSA9IChjaGFyKikgYWN0aW9uOworCWFyZ3ZbMl0gPSBOVUxMOworCisJVkVSQjEgYmJfZXJyb3JfbXNnKCJleGVjdXRpbmcgJyVzICVzJyIsIEcuc2NyaXB0X25hbWUsIGFjdGlvbik7CisKKwllbnYxID0geGFzcHJpbnRmKCIlcz0ldSIsICJzdHJhdHVtIiwgRy5zdHJhdHVtKTsKKwlwdXRlbnYoZW52MSk7CisJZW52MiA9IHhhc3ByaW50ZigiJXM9JWxkIiwgImZyZXFfZHJpZnRfcHBtIiwgRy5rZXJuZWxfZnJlcV9kcmlmdCk7CisJcHV0ZW52KGVudjIpOworCWVudjMgPSB4YXNwcmludGYoIiVzPSV1IiwgInBvbGxfaW50ZXJ2YWwiLCAxIDw8IEcucG9sbF9leHApOworCXB1dGVudihlbnYzKTsKKwllbnY0ID0geGFzcHJpbnRmKCIlcz0lZiIsICJvZmZzZXQiLCBvZmZzZXQpOworCXB1dGVudihlbnY0KTsKKwkvKiBPdGhlciBpdGVtcyBvZiBwb3RlbnRpYWwgaW50ZXJlc3Q6IHNlbGVjdGVkIHBlZXIsCisJICogcm9vdGRlbGF5LCByZWZ0aW1lLCByb290ZGlzcCwgcmVmaWQsIG50cF9zdGF0dXMsCisJICogbGFzdF91cGRhdGVfb2Zmc2V0LCBsYXN0X3VwZGF0ZV9yZWN2X3RpbWUsIGRpc2NpcGxpbmVfaml0dGVyLAorCSAqIGhvdyBtYW55IHBlZXJzIGhhdmUgcmVhY2hhYmxlX2JpdHMgPSAwPworCSAqLworCisJLyogRG9uJ3Qgd2FudCB0byB3YWl0OiBpdCBtYXkgcnVuIGh3Y2xvY2sgLS1zeXN0b2hjLCBhbmQgdGhhdAorCSAqIG1heSB0YWtlIHNvbWUgdGltZSAoc2Vjb25kcyk6ICovCisJLypzcGF3bl9hbmRfd2FpdChhcmd2KTsqLworCXNwYXduKGFyZ3YpOworCisJdW5zZXRlbnYoInN0cmF0dW0iKTsKKwl1bnNldGVudigiZnJlcV9kcmlmdF9wcG0iKTsKKwl1bnNldGVudigicG9sbF9pbnRlcnZhbCIpOworCXVuc2V0ZW52KCJvZmZzZXQiKTsKKwlmcmVlKGVudjEpOworCWZyZWUoZW52Mik7CisJZnJlZShlbnYzKTsKKwlmcmVlKGVudjQpOworCisJRy5sYXN0X3NjcmlwdF9ydW4gPSBHLmN1cl90aW1lOworfQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZAorc3RlcF90aW1lKGRvdWJsZSBvZmZzZXQpCit7CisJbGxpc3RfdCAqaXRlbTsKKwlkb3VibGUgZHRpbWU7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJY2hhciBidWZbODBdOworCXRpbWVfdCB0dmFsOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7IC8qIG5ldmVyIGZhaWxzICovCisJZHRpbWUgPSBvZmZzZXQgKyB0di50dl9zZWM7CisJZHRpbWUgKz0gMS4wZS02ICogdHYudHZfdXNlYzsKKwlkX3RvX3R2KGR0aW1lLCAmdHYpOworCisJaWYgKHNldHRpbWVvZmRheSgmdHYsIE5VTEwpID09IC0xKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHRpbWVvZmRheSIpOworCisJdHZhbCA9IHR2LnR2X3NlYzsKKwlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJWEgJWIgJWUgJUg6JU06JVMgJVogJVkiLCBsb2NhbHRpbWUoJnR2YWwpKTsKKworCWJiX2Vycm9yX21zZygic2V0dGluZyBjbG9jayB0byAlcyAob2Zmc2V0ICVmcykiLCBidWYsIG9mZnNldCk7CisKKwkvKiBDb3JyZWN0IHZhcmlvdXMgZmllbGRzIHdoaWNoIGNvbnRhaW4gdGltZS1yZWxhdGl2ZSB2YWx1ZXM6ICovCisKKwkvKiBwLT5sYXN0cGt0X3JlY3ZfdGltZSwgcC0+bmV4dF9hY3Rpb25fdGltZSBhbmQgc3VjaDogKi8KKwlmb3IgKGl0ZW0gPSBHLm50cF9wZWVyczsgaXRlbSAhPSBOVUxMOyBpdGVtID0gaXRlbS0+bGluaykgeworCQlwZWVyX3QgKnBwID0gKHBlZXJfdCAqKSBpdGVtLT5kYXRhOworCQlyZXNldF9wZWVyX3N0YXRzKHBwLCBvZmZzZXQpOworCQkvL2JiX2Vycm9yX21zZygib2Zmc2V0OiVmIHBwLT5uZXh0X2FjdGlvbl90aW1lOiVmIC0+ICVmIiwKKwkJLy8Jb2Zmc2V0LCBwcC0+bmV4dF9hY3Rpb25fdGltZSwgcHAtPm5leHRfYWN0aW9uX3RpbWUgKyBvZmZzZXQpOworCQlwcC0+bmV4dF9hY3Rpb25fdGltZSArPSBvZmZzZXQ7CisJfQorCS8qIEdsb2JhbHM6ICovCisJRy5jdXJfdGltZSArPSBvZmZzZXQ7CisJRy5sYXN0X3VwZGF0ZV9yZWN2X3RpbWUgKz0gb2Zmc2V0OworCUcubGFzdF9zY3JpcHRfcnVuICs9IG9mZnNldDsKK30KKworCisvKgorICogU2VsZWN0aW9uIGFuZCBjbHVzdGVyaW5nLCBhbmQgdGhlaXIgaGVscGVycworICovCit0eXBlZGVmIHN0cnVjdCB7CisJcGVlcl90ICpwOworCWludCAgICB0eXBlOworCWRvdWJsZSBlZGdlOworCWRvdWJsZSBvcHRfcmQ7IC8qIG9wdGltaXphdGlvbiAqLworfSBwb2ludF90Oworc3RhdGljIGludAorY29tcGFyZV9wb2ludF9lZGdlKGNvbnN0IHZvaWQgKmFhLCBjb25zdCB2b2lkICpiYikKK3sKKwljb25zdCBwb2ludF90ICphID0gYWE7CisJY29uc3QgcG9pbnRfdCAqYiA9IGJiOworCWlmIChhLT5lZGdlIDwgYi0+ZWRnZSkgeworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAoYS0+ZWRnZSA+IGItPmVkZ2UpOworfQordHlwZWRlZiBzdHJ1Y3QgeworCXBlZXJfdCAqcDsKKwlkb3VibGUgbWV0cmljOworfSBzdXJ2aXZvcl90Oworc3RhdGljIGludAorY29tcGFyZV9zdXJ2aXZvcl9tZXRyaWMoY29uc3Qgdm9pZCAqYWEsIGNvbnN0IHZvaWQgKmJiKQoreworCWNvbnN0IHN1cnZpdm9yX3QgKmEgPSBhYTsKKwljb25zdCBzdXJ2aXZvcl90ICpiID0gYmI7CisJaWYgKGEtPm1ldHJpYyA8IGItPm1ldHJpYykgeworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAoYS0+bWV0cmljID4gYi0+bWV0cmljKTsKK30KK3N0YXRpYyBpbnQKK2ZpdChwZWVyX3QgKnAsIGRvdWJsZSByZCkKK3sKKwlpZiAoKHAtPnJlYWNoYWJsZV9iaXRzICYgKHAtPnJlYWNoYWJsZV9iaXRzLTEpKSA9PSAwKSB7CisJCS8qIE9uZSBvciB6ZXJvIGJpdHMgaW4gcmVhY2hhYmxlX2JpdHMgKi8KKwkJVkVSQjMgYmJfZXJyb3JfbXNnKCJwZWVyICVzIHVuZml0IGZvciBzZWxlY3Rpb246IHVucmVhY2hhYmxlIiwgcC0+cF9kb3R0ZWQpOworCQlyZXR1cm4gMDsKKwl9CisjaWYgMCAvKiB3ZSBmaWx0ZXIgb3V0IHN1Y2ggcGFja2V0cyBlYXJsaWVyICovCisJaWYgKChwLT5sYXN0cGt0X3N0YXR1cyAmIExJX0FMQVJNKSA9PSBMSV9BTEFSTQorCSB8fCBwLT5sYXN0cGt0X3N0cmF0dW0gPj0gTUFYU1RSQVQKKwkpIHsKKwkJVkVSQjMgYmJfZXJyb3JfbXNnKCJwZWVyICVzIHVuZml0IGZvciBzZWxlY3Rpb246IGJhZCBzdGF0dXMvc3RyYXR1bSIsIHAtPnBfZG90dGVkKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJLyogcmQgaXMgcm9vdF9kaXN0YW5jZShwKSAqLworCWlmIChyZCA+IE1BWERJU1QgKyBGUkVRX1RPTEVSQU5DRSAqICgxIDw8IEcucG9sbF9leHApKSB7CisJCVZFUkIzIGJiX2Vycm9yX21zZygicGVlciAlcyB1bmZpdCBmb3Igc2VsZWN0aW9uOiByb290IGRpc3RhbmNlIHRvbyBoaWdoIiwgcC0+cF9kb3R0ZWQpOworCQlyZXR1cm4gMDsKKwl9CisvL1RPRE8KKy8vCS8qIERvIHdlIGhhdmUgYSBsb29wPyAqLworLy8JaWYgKHAtPnJlZmlkID09IHAtPmRzdGFkZHIgfHwgcC0+cmVmaWQgPT0gcy5yZWZpZCkKKy8vCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KK3N0YXRpYyBwZWVyX3QqCitzZWxlY3RfYW5kX2NsdXN0ZXIodm9pZCkKK3sKKwlwZWVyX3QgICAgICpwOworCWxsaXN0X3QgICAgKml0ZW07CisJaW50ICAgICAgICBpLCBqOworCWludCAgICAgICAgc2l6ZSA9IDMgKiBHLnBlZXJfY250OworCS8qIGZvciBzZWxlY3Rpb24gYWxnb3JpdGhtICovCisJcG9pbnRfdCAgICBwb2ludFtzaXplXTsKKwl1bnNpZ25lZCAgIG51bV9wb2ludHMsIG51bV9jYW5kaWRhdGVzOworCWRvdWJsZSAgICAgbG93LCBoaWdoOworCXVuc2lnbmVkICAgbnVtX2ZhbHNldGlja2VyczsKKwkvKiBmb3IgY2x1c3RlciBhbGdvcml0aG0gKi8KKwlzdXJ2aXZvcl90IHN1cnZpdm9yW3NpemVdOworCXVuc2lnbmVkICAgbnVtX3N1cnZpdm9yczsKKworCS8qIFNlbGVjdGlvbiAqLworCisJbnVtX3BvaW50cyA9IDA7CisJaXRlbSA9IEcubnRwX3BlZXJzOworCWlmIChHLmluaXRpYWxfcG9sbF9jb21wbGV0ZSkgd2hpbGUgKGl0ZW0gIT0gTlVMTCkgeworCQlkb3VibGUgcmQsIG9mZnNldDsKKworCQlwID0gKHBlZXJfdCAqKSBpdGVtLT5kYXRhOworCQlyZCA9IHJvb3RfZGlzdGFuY2UocCk7CisJCW9mZnNldCA9IHAtPmZpbHRlcl9vZmZzZXQ7CisJCWlmICghZml0KHAsIHJkKSkgeworCQkJaXRlbSA9IGl0ZW0tPmxpbms7CisJCQljb250aW51ZTsKKwkJfQorCisJCVZFUkI0IGJiX2Vycm9yX21zZygiaW50ZXJ2YWw6IFslZiAlZiAlZl0gJXMiLAorCQkJCW9mZnNldCAtIHJkLAorCQkJCW9mZnNldCwKKwkJCQlvZmZzZXQgKyByZCwKKwkJCQlwLT5wX2RvdHRlZAorCQkpOworCQlwb2ludFtudW1fcG9pbnRzXS5wID0gcDsKKwkJcG9pbnRbbnVtX3BvaW50c10udHlwZSA9IC0xOworCQlwb2ludFtudW1fcG9pbnRzXS5lZGdlID0gb2Zmc2V0IC0gcmQ7CisJCXBvaW50W251bV9wb2ludHNdLm9wdF9yZCA9IHJkOworCQludW1fcG9pbnRzKys7CisJCXBvaW50W251bV9wb2ludHNdLnAgPSBwOworCQlwb2ludFtudW1fcG9pbnRzXS50eXBlID0gMDsKKwkJcG9pbnRbbnVtX3BvaW50c10uZWRnZSA9IG9mZnNldDsKKwkJcG9pbnRbbnVtX3BvaW50c10ub3B0X3JkID0gcmQ7CisJCW51bV9wb2ludHMrKzsKKwkJcG9pbnRbbnVtX3BvaW50c10ucCA9IHA7CisJCXBvaW50W251bV9wb2ludHNdLnR5cGUgPSAxOworCQlwb2ludFtudW1fcG9pbnRzXS5lZGdlID0gb2Zmc2V0ICsgcmQ7CisJCXBvaW50W251bV9wb2ludHNdLm9wdF9yZCA9IHJkOworCQludW1fcG9pbnRzKys7CisJCWl0ZW0gPSBpdGVtLT5saW5rOworCX0KKwludW1fY2FuZGlkYXRlcyA9IG51bV9wb2ludHMgLyAzOworCWlmIChudW1fY2FuZGlkYXRlcyA9PSAwKSB7CisJCVZFUkIzIGJiX2Vycm9yX21zZygibm8gdmFsaWQgZGF0YXBvaW50cywgbm8gcGVlciBzZWxlY3RlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisvL1RPRE86IHNvcnRpbmcgZG9lcyBub3Qgc2VlbSB0byBiZSBkb25lIGluIHJlZmVyZW5jZSBjb2RlCisJcXNvcnQocG9pbnQsIG51bV9wb2ludHMsIHNpemVvZihwb2ludFswXSksIGNvbXBhcmVfcG9pbnRfZWRnZSk7CisKKwkvKiBTdGFydCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlcmUgYXJlIG5vIGZhbHNldGlja2Vycy4KKwkgKiBBdHRlbXB0IHRvIGZpbmQgYSBub25lbXB0eSBpbnRlcnNlY3Rpb24gaW50ZXJ2YWwgY29udGFpbmluZworCSAqIHRoZSBtaWRwb2ludHMgb2YgYWxsIHRydWVjaGltZXJzLgorCSAqIElmIGEgbm9uZW1wdHkgaW50ZXJ2YWwgY2Fubm90IGJlIGZvdW5kLCBpbmNyZWFzZSB0aGUgbnVtYmVyCisJICogb2YgYXNzdW1lZCBmYWxzZXRpY2tlcnMgYnkgb25lIGFuZCB0cnkgYWdhaW4uCisJICogSWYgYSBub25lbXB0eSBpbnRlcnZhbCBpcyBmb3VuZCBhbmQgdGhlIG51bWJlciBvZiBmYWxzZXRpY2tlcnMKKwkgKiBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiB0cnVlY2hpbWVycywgYSBtYWpvcml0eSBoYXMgYmVlbiBmb3VuZAorCSAqIGFuZCB0aGUgbWlkcG9pbnQgb2YgZWFjaCB0cnVlY2hpbWVyIHJlcHJlc2VudHMKKwkgKiB0aGUgY2FuZGlkYXRlcyBhdmFpbGFibGUgdG8gdGhlIGNsdXN0ZXIgYWxnb3JpdGhtLgorCSAqLworCW51bV9mYWxzZXRpY2tlcnMgPSAwOworCXdoaWxlICgxKSB7CisJCWludCBjOworCQl1bnNpZ25lZCBudW1fbWlkcG9pbnRzID0gMDsKKworCQlsb3cgPSAxIDw8IDk7CisJCWhpZ2ggPSAtICgxIDw8IDkpOworCQljID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wb2ludHM7IGkrKykgeworCQkJLyogV2Ugd2FudCB0byBkbzoKKwkJCSAqIGlmIChwb2ludFtpXS50eXBlID09IC0xKSBjKys7CisJCQkgKiBpZiAocG9pbnRbaV0udHlwZSA9PSAxKSBjLS07CisJCQkgKiBhbmQgaXQncyBzaW1wbGVyIHRvIGRvIGl0IHRoaXMgd2F5OgorCQkJICovCisJCQljIC09IHBvaW50W2ldLnR5cGU7CisJCQlpZiAoYyA+PSBudW1fY2FuZGlkYXRlcyAtIG51bV9mYWxzZXRpY2tlcnMpIHsKKwkJCQkvKiBJZiBpdCB3YXMgYysrIGFuZCBpdCBnb3QgYmlnIGVub3VnaC4uLiAqLworCQkJCWxvdyA9IHBvaW50W2ldLmVkZ2U7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocG9pbnRbaV0udHlwZSA9PSAwKQorCQkJCW51bV9taWRwb2ludHMrKzsKKwkJfQorCQljID0gMDsKKwkJZm9yIChpID0gbnVtX3BvaW50cy0xOyBpID49IDA7IGktLSkgeworCQkJYyArPSBwb2ludFtpXS50eXBlOworCQkJaWYgKGMgPj0gbnVtX2NhbmRpZGF0ZXMgLSBudW1fZmFsc2V0aWNrZXJzKSB7CisJCQkJaGlnaCA9IHBvaW50W2ldLmVkZ2U7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocG9pbnRbaV0udHlwZSA9PSAwKQorCQkJCW51bV9taWRwb2ludHMrKzsKKwkJfQorCQkvKiBJZiB0aGUgbnVtYmVyIG9mIG1pZHBvaW50cyBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgorCQkgKiBvZiBhbGxvd2VkIGZhbHNldGlja2VycywgdGhlIGludGVyc2VjdGlvbiBjb250YWlucyBhdAorCQkgKiBsZWFzdCBvbmUgdHJ1ZWNoaW1lciB3aXRoIG5vIG1pZHBvaW50IC0gYmFkLgorCQkgKiBBbHNvLCBpbnRlcnZhbCBzaG91bGQgYmUgbm9uZW1wdHkuCisJCSAqLworCQlpZiAobnVtX21pZHBvaW50cyA8PSBudW1fZmFsc2V0aWNrZXJzICYmIGxvdyA8IGhpZ2gpCisJCQlicmVhazsKKwkJbnVtX2ZhbHNldGlja2VycysrOworCQlpZiAobnVtX2ZhbHNldGlja2VycyAqIDIgPj0gbnVtX2NhbmRpZGF0ZXMpIHsKKwkJCVZFUkIzIGJiX2Vycm9yX21zZygidG9vIG1hbnkgZmFsc2V0aWNrZXJzOiVkIChjYW5kaWRhdGVzOiVkKSwgbm8gcGVlciBzZWxlY3RlZCIsCisJCQkJCW51bV9mYWxzZXRpY2tlcnMsIG51bV9jYW5kaWRhdGVzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCVZFUkIzIGJiX2Vycm9yX21zZygic2VsZWN0ZWQgaW50ZXJ2YWw6IFslZiwgJWZdOyBjYW5kaWRhdGVzOiVkIGZhbHNldGlja2VyczolZCIsCisJCQlsb3csIGhpZ2gsIG51bV9jYW5kaWRhdGVzLCBudW1fZmFsc2V0aWNrZXJzKTsKKworCS8qIENsdXN0ZXJpbmcgKi8KKworCS8qIENvbnN0cnVjdCBhIGxpc3Qgb2Ygc3Vydml2b3JzIChwLCBtZXRyaWMpCisJICogZnJvbSB0aGUgY2hpbWUgbGlzdCwgd2hlcmUgbWV0cmljIGlzIGRvbWluYXRlZAorCSAqIGZpcnN0IGJ5IHN0cmF0dW0gYW5kIHRoZW4gYnkgcm9vdCBkaXN0YW5jZS4KKwkgKiBBbGwgb3RoZXIgdGhpbmdzIGJlaW5nIGVxdWFsLCB0aGlzIGlzIHRoZSBvcmRlciBvZiBwcmVmZXJlbmNlLgorCSAqLworCW51bV9zdXJ2aXZvcnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fcG9pbnRzOyBpKyspIHsKKwkJaWYgKHBvaW50W2ldLmVkZ2UgPCBsb3cgfHwgcG9pbnRbaV0uZWRnZSA+IGhpZ2gpCisJCQljb250aW51ZTsKKwkJcCA9IHBvaW50W2ldLnA7CisJCXN1cnZpdm9yW251bV9zdXJ2aXZvcnNdLnAgPSBwOworCQkvKiB4Lm9wdF9yZCA9PSByb290X2Rpc3RhbmNlKHApOyAqLworCQlzdXJ2aXZvcltudW1fc3Vydml2b3JzXS5tZXRyaWMgPSBNQVhESVNUICogcC0+bGFzdHBrdF9zdHJhdHVtICsgcG9pbnRbaV0ub3B0X3JkOworCQlWRVJCNCBiYl9lcnJvcl9tc2coInN1cnZpdm9yWyVkXSBtZXRyaWM6JWYgcGVlcjolcyIsCisJCQludW1fc3Vydml2b3JzLCBzdXJ2aXZvcltudW1fc3Vydml2b3JzXS5tZXRyaWMsIHAtPnBfZG90dGVkKTsKKwkJbnVtX3N1cnZpdm9ycysrOworCX0KKwkvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IE1JTl9TRUxFQ1RFRCBzdXJ2aXZvcnMgdG8gc2F0aXNmeSB0aGUKKwkgKiBjb3JyZWN0bmVzcyBhc3NlcnRpb25zLiBPcmRpbmFyaWx5LCB0aGUgQnl6YW50aW5lIGNyaXRlcmlhCisJICogcmVxdWlyZSBmb3VyIHN1cnZpdm9ycywgYnV0IGZvciB0aGUgZGVtb25zdHJhdGlvbiBoZXJlLCBvbmUKKwkgKiBpcyBhY2NlcHRhYmxlLgorCSAqLworCWlmIChudW1fc3Vydml2b3JzIDwgTUlOX1NFTEVDVEVEKSB7CisJCVZFUkIzIGJiX2Vycm9yX21zZygibnVtX3N1cnZpdm9ycyAlZCA8ICVkLCBubyBwZWVyIHNlbGVjdGVkIiwKKwkJCQludW1fc3Vydml2b3JzLCBNSU5fU0VMRUNURUQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKy8vbG9va3MgbGlrZSB0aGlzIGlzIE9OTFkgdXNlZCBieSB0aGUgZmFjdCB0aGF0IGxhdGVyIHdlIHBpY2sgc3Vydml2b3JbMF0uCisvL3dlIGNhbiBhdm9pZCBzb3J0aW5nIHRoZW4sIGp1c3QgZmluZCB0aGUgbWluaW11bSBvbmNlIQorCXFzb3J0KHN1cnZpdm9yLCBudW1fc3Vydml2b3JzLCBzaXplb2Yoc3Vydml2b3JbMF0pLCBjb21wYXJlX3N1cnZpdm9yX21ldHJpYyk7CisKKwkvKiBGb3IgZWFjaCBhc3NvY2lhdGlvbiBwIGluIHR1cm4sIGNhbGN1bGF0ZSB0aGUgc2VsZWN0aW9uCisJICogaml0dGVyIHAtPnNqaXR0ZXIgYXMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBzdW0gb2Ygc3F1YXJlcworCSAqIChwLT5vZmZzZXQgLSBxLT5vZmZzZXQpIG92ZXIgYWxsIHEgYXNzb2NpYXRpb25zLiBUaGUgaWRlYSBpcworCSAqIHRvIHJlcGVhdGVkbHkgZGlzY2FyZCB0aGUgc3Vydml2b3Igd2l0aCBtYXhpbXVtIHNlbGVjdGlvbgorCSAqIGppdHRlciB1bnRpbCBhIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBpcyBtZXQuCisJICovCisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgbWF4X2lkeCA9IG1heF9pZHg7CisJCWRvdWJsZSBtYXhfc2VsZWN0aW9uX2ppdHRlciA9IG1heF9zZWxlY3Rpb25faml0dGVyOworCQlkb3VibGUgbWluX2ppdHRlciA9IG1pbl9qaXR0ZXI7CisKKwkJaWYgKG51bV9zdXJ2aXZvcnMgPD0gTUlOX0NMVVNURVJFRCkgeworCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJudW1fc3Vydml2b3JzICVkIDw9ICVkLCBub3QgZGlzY2FyZGluZyBtb3JlIiwKKwkJCQkJbnVtX3N1cnZpdm9ycywgTUlOX0NMVVNURVJFRCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRvIG1ha2Ugc3VyZSBhIGZldyBzdXJ2aXZvcnMgYXJlIGxlZnQKKwkJICogZm9yIHRoZSBjbHVzdGVyaW5nIGFsZ29yaXRobSB0byBjaGV3IG9uLAorCQkgKiB3ZSBzdG9wIGlmIHRoZSBudW1iZXIgb2Ygc3Vydml2b3JzCisJCSAqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBNSU5fQ0xVU1RFUkVEICgzKS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fc3Vydml2b3JzOyBpKyspIHsKKwkJCWRvdWJsZSBzZWxlY3Rpb25faml0dGVyX3NxOworCisJCQlwID0gc3Vydml2b3JbaV0ucDsKKwkJCWlmIChpID09IDAgfHwgcC0+ZmlsdGVyX2ppdHRlciA8IG1pbl9qaXR0ZXIpCisJCQkJbWluX2ppdHRlciA9IHAtPmZpbHRlcl9qaXR0ZXI7CisKKwkJCXNlbGVjdGlvbl9qaXR0ZXJfc3EgPSAwOworCQkJZm9yIChqID0gMDsgaiA8IG51bV9zdXJ2aXZvcnM7IGorKykgeworCQkJCXBlZXJfdCAqcSA9IHN1cnZpdm9yW2pdLnA7CisJCQkJc2VsZWN0aW9uX2ppdHRlcl9zcSArPSBTUVVBUkUocC0+ZmlsdGVyX29mZnNldCAtIHEtPmZpbHRlcl9vZmZzZXQpOworCQkJfQorCQkJaWYgKGkgPT0gMCB8fCBzZWxlY3Rpb25faml0dGVyX3NxID4gbWF4X3NlbGVjdGlvbl9qaXR0ZXIpIHsKKwkJCQltYXhfc2VsZWN0aW9uX2ppdHRlciA9IHNlbGVjdGlvbl9qaXR0ZXJfc3E7CisJCQkJbWF4X2lkeCA9IGk7CisJCQl9CisJCQlWRVJCNSBiYl9lcnJvcl9tc2coInN1cnZpdm9yICVkIHNlbGVjdGlvbl9qaXR0ZXJeMjolZiIsCisJCQkJCWksIHNlbGVjdGlvbl9qaXR0ZXJfc3EpOworCQl9CisJCW1heF9zZWxlY3Rpb25faml0dGVyID0gU1FSVChtYXhfc2VsZWN0aW9uX2ppdHRlciAvIG51bV9zdXJ2aXZvcnMpOworCQlWRVJCNCBiYl9lcnJvcl9tc2coIm1heF9zZWxlY3Rpb25faml0dGVyIChhdCAlZCk6JWYgbWluX2ppdHRlcjolZiIsCisJCQkJbWF4X2lkeCwgbWF4X3NlbGVjdGlvbl9qaXR0ZXIsIG1pbl9qaXR0ZXIpOworCisJCS8qIElmIHRoZSBtYXhpbXVtIHNlbGVjdGlvbiBqaXR0ZXIgaXMgbGVzcyB0aGFuIHRoZQorCQkgKiBtaW5pbXVtIHBlZXIgaml0dGVyLCB0aGVuIHRvc3Npbmcgb3V0IG1vcmUgc3Vydml2b3JzCisJCSAqIHdpbGwgbm90IGxvd2VyIHRoZSBtaW5pbXVtIHBlZXIgaml0dGVyLCBzbyB3ZSBtaWdodAorCQkgKiBhcyB3ZWxsIHN0b3AuCisJCSAqLworCQlpZiAobWF4X3NlbGVjdGlvbl9qaXR0ZXIgPCBtaW5faml0dGVyKSB7CisJCQlWRVJCMyBiYl9lcnJvcl9tc2coIm1heF9zZWxlY3Rpb25faml0dGVyOiVmIDwgbWluX2ppdHRlcjolZiwgbnVtX3N1cnZpdm9yczolZCwgbm90IGRpc2NhcmRpbmcgbW9yZSIsCisJCQkJCW1heF9zZWxlY3Rpb25faml0dGVyLCBtaW5faml0dGVyLCBudW1fc3Vydml2b3JzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogRGVsZXRlIHN1cnZpdm9yW21heF9pZHhdIGZyb20gdGhlIGxpc3QKKwkJICogYW5kIGdvIGFyb3VuZCBhZ2Fpbi4KKwkJICovCisJCVZFUkI1IGJiX2Vycm9yX21zZygiZHJvcHBpbmcgc3Vydml2b3IgJWQiLCBtYXhfaWR4KTsKKwkJbnVtX3N1cnZpdm9ycy0tOworCQl3aGlsZSAobWF4X2lkeCA8IG51bV9zdXJ2aXZvcnMpIHsKKwkJCXN1cnZpdm9yW21heF9pZHhdID0gc3Vydml2b3JbbWF4X2lkeCArIDFdOworCQkJbWF4X2lkeCsrOworCQl9CisJfQorCisJaWYgKDApIHsKKwkJLyogQ29tYmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgY2x1c3RlcmluZyBhbGdvcml0aG0gc3Vydml2b3JzCisJCSAqIHVzaW5nIGEgd2VpZ2h0ZWQgYXZlcmFnZSB3aXRoIHdlaWdodCBkZXRlcm1pbmVkIGJ5IHRoZSByb290CisJCSAqIGRpc3RhbmNlLiBDb21wdXRlIHRoZSBzZWxlY3Rpb24gaml0dGVyIGFzIHRoZSB3ZWlnaHRlZCBSTVMKKwkJICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCBzdXJ2aXZvciBhbmQgdGhlIHJlbWFpbmluZworCQkgKiBzdXJ2aXZvcnMuIEluIHNvbWUgY2FzZXMgdGhlIGluaGVyZW50IGNsb2NrIGppdHRlciBjYW4gYmUKKwkJICogcmVkdWNlZCBieSBub3QgdXNpbmcgdGhpcyBhbGdvcml0aG0sIGVzcGVjaWFsbHkgd2hlbiBmcmVxdWVudAorCQkgKiBjbG9ja2hvcHBpbmcgaXMgaW52b2x2ZWQuIGJib3g6IHRodXMgd2UgZG9uJ3QgZG8gaXQuCisJCSAqLworCQlkb3VibGUgeCwgeSwgeiwgdzsKKwkJeSA9IHogPSB3ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9zdXJ2aXZvcnM7IGkrKykgeworCQkJcCA9IHN1cnZpdm9yW2ldLnA7CisJCQl4ID0gcm9vdF9kaXN0YW5jZShwKTsKKwkJCXkgKz0gMSAvIHg7CisJCQl6ICs9IHAtPmZpbHRlcl9vZmZzZXQgLyB4OworCQkJdyArPSBTUVVBUkUocC0+ZmlsdGVyX29mZnNldCAtIHN1cnZpdm9yWzBdLnAtPmZpbHRlcl9vZmZzZXQpIC8geDsKKwkJfQorCQkvL0cuY2x1c3Rlcl9vZmZzZXQgPSB6IC8geTsKKwkJLy9HLmNsdXN0ZXJfaml0dGVyID0gU1FSVCh3IC8geSk7CisJfQorCisJLyogUGljayB0aGUgYmVzdCBjbG9jay4gSWYgdGhlIG9sZCBzeXN0ZW0gcGVlciBpcyBvbiB0aGUgbGlzdAorCSAqIGFuZCBhdCB0aGUgc2FtZSBzdHJhdHVtIGFzIHRoZSBmaXJzdCBzdXJ2aXZvciBvbiB0aGUgbGlzdCwKKwkgKiB0aGVuIGRvbid0IGRvIGEgY2xvY2sgaG9wLiBPdGhlcndpc2UsIHNlbGVjdCB0aGUgZmlyc3QKKwkgKiBzdXJ2aXZvciBvbiB0aGUgbGlzdCBhcyB0aGUgbmV3IHN5c3RlbSBwZWVyLgorCSAqLworCXAgPSBzdXJ2aXZvclswXS5wOworCWlmIChHLmxhc3RfdXBkYXRlX3BlZXIKKwkgJiYgRy5sYXN0X3VwZGF0ZV9wZWVyLT5sYXN0cGt0X3N0cmF0dW0gPD0gcC0+bGFzdHBrdF9zdHJhdHVtCisJKSB7CisJCS8qIFN0YXJ0aW5nIGZyb20gMSBpcyBvayBoZXJlICovCisJCWZvciAoaSA9IDE7IGkgPCBudW1fc3Vydml2b3JzOyBpKyspIHsKKwkJCWlmIChHLmxhc3RfdXBkYXRlX3BlZXIgPT0gc3Vydml2b3JbaV0ucCkgeworCQkJCVZFUkI0IGJiX2Vycm9yX21zZygia2VlcGluZyBvbGQgc3luY2VkIHBlZXIiKTsKKwkJCQlwID0gRy5sYXN0X3VwZGF0ZV9wZWVyOworCQkJCWdvdG8ga2VlcF9vbGQ7CisJCQl9CisJCX0KKwl9CisJRy5sYXN0X3VwZGF0ZV9wZWVyID0gcDsKKyBrZWVwX29sZDoKKwlWRVJCMyBiYl9lcnJvcl9tc2coInNlbGVjdGVkIHBlZXIgJXMgZmlsdGVyX29mZnNldDolZiBhZ2U6JWYiLAorCQkJcC0+cF9kb3R0ZWQsCisJCQlwLT5maWx0ZXJfb2Zmc2V0LAorCQkJRy5jdXJfdGltZSAtIHAtPmxhc3Rwa3RfcmVjdl90aW1lCisJKTsKKwlyZXR1cm4gcDsKK30KKworCisvKgorICogTG9jYWwgY2xvY2sgZGlzY2lwbGluZSBhbmQgaXRzIGhlbHBlcnMKKyAqLworc3RhdGljIHZvaWQKK3NldF9uZXdfdmFsdWVzKGludCBkaXNjX3N0YXRlLCBkb3VibGUgb2Zmc2V0LCBkb3VibGUgcmVjdl90aW1lKQoreworCS8qIEVudGVyIG5ldyBzdGF0ZSBhbmQgc2V0IHN0YXRlIHZhcmlhYmxlcy4gTm90ZSB3ZSB1c2UgdGhlIHRpbWUKKwkgKiBvZiB0aGUgbGFzdCBjbG9jayBmaWx0ZXIgc2FtcGxlLCB3aGljaCBtdXN0IGJlIGVhcmxpZXIgdGhhbgorCSAqIHRoZSBjdXJyZW50IHRpbWUuCisJICovCisJVkVSQjMgYmJfZXJyb3JfbXNnKCJkaXNjX3N0YXRlPSVkIGxhc3QgdXBkYXRlIG9mZnNldD0lZiByZWN2X3RpbWU9JWYiLAorCQkJZGlzY19zdGF0ZSwgb2Zmc2V0LCByZWN2X3RpbWUpOworCUcuZGlzY2lwbGluZV9zdGF0ZSA9IGRpc2Nfc3RhdGU7CisJRy5sYXN0X3VwZGF0ZV9vZmZzZXQgPSBvZmZzZXQ7CisJRy5sYXN0X3VwZGF0ZV9yZWN2X3RpbWUgPSByZWN2X3RpbWU7Cit9CisvKiBSZXR1cm46IC0xOiBkZWNyZWFzZSBwb2xsIGludGVydmFsLCAwOiBsZWF2ZSBhcyBpcywgMTogaW5jcmVhc2UgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQKK3VwZGF0ZV9sb2NhbF9jbG9jayhwZWVyX3QgKnApCit7CisJaW50IHJjOworCXN0cnVjdCB0aW1leCB0bXg7CisJLyogTm90ZTogY2FuIHVzZSBHLmNsdXN0ZXJfb2Zmc2V0IGluc3RlYWQ6ICovCisJZG91YmxlIG9mZnNldCA9IHAtPmZpbHRlcl9vZmZzZXQ7CisJZG91YmxlIHJlY3ZfdGltZSA9IHAtPmxhc3Rwa3RfcmVjdl90aW1lOworCWRvdWJsZSBhYnNfb2Zmc2V0OworI2lmICFVU0lOR19LRVJORUxfUExMX0xPT1AKKwlkb3VibGUgZnJlcV9kcmlmdDsKKyNlbmRpZgorCWRvdWJsZSBzaW5jZV9sYXN0X3VwZGF0ZTsKKwlkb3VibGUgZXRlbXAsIGR0ZW1wOworCisJYWJzX29mZnNldCA9IGZhYnMob2Zmc2V0KTsKKworI2lmIDAKKwkvKiBJZiBuZWVkZWQsIC1TIHNjcmlwdCBjYW4gZG8gaXQgYnkgbG9va2luZyBhdCAkb2Zmc2V0CisJICogZW52IHZhciBhbmQga2lsbGluZyBwYXJlbnQgKi8KKwkvKiBJZiB0aGUgb2Zmc2V0IGlzIHRvbyBsYXJnZSwgZ2l2ZSB1cCBhbmQgZ28gaG9tZSAqLworCWlmIChhYnNfb2Zmc2V0ID4gUEFOSUNfVEhSRVNIT0xEKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvZmZzZXQgJWYgZmFyIHRvbyBiaWcsIGV4aXRpbmciLCBvZmZzZXQpOworCX0KKyNlbmRpZgorCisJLyogSWYgdGhpcyBpcyBhbiBvbGQgdXBkYXRlLCBmb3IgaW5zdGFuY2UgYXMgdGhlIHJlc3VsdAorCSAqIG9mIGEgc3lzdGVtIHBlZXIgY2hhbmdlLCBhdm9pZCBpdC4gV2UgbmV2ZXIgdXNlCisJICogYW4gb2xkIHNhbXBsZSBvciB0aGUgc2FtZSBzYW1wbGUgdHdpY2UuCisJICovCisJaWYgKHJlY3ZfdGltZSA8PSBHLmxhc3RfdXBkYXRlX3JlY3ZfdGltZSkgeworCQlWRVJCMyBiYl9lcnJvcl9tc2coInNhbWUgb3Igb2xkZXIgZGF0YXBvaW50OiAlZiA+PSAlZiwgbm90IHVzaW5nIGl0IiwKKwkJCQlHLmxhc3RfdXBkYXRlX3JlY3ZfdGltZSwgcmVjdl90aW1lKTsKKwkJcmV0dXJuIDA7IC8qICJsZWF2ZSBwb2xsIGludGVydmFsIGFzIGlzIiAqLworCX0KKworCS8qIENsb2NrIHN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbiBmdW5jdGlvbi4gVGhpcyBpcyB3aGVyZSB0aGUKKwkgKiBhY3Rpb24gaXMgYW5kIGRlZmluZXMgaG93IHRoZSBzeXN0ZW0gcmVhY3RzIHRvIGxhcmdlIHRpbWUKKwkgKiBhbmQgZnJlcXVlbmN5IGVycm9ycy4KKwkgKi8KKwlzaW5jZV9sYXN0X3VwZGF0ZSA9IHJlY3ZfdGltZSAtIEcucmVmdGltZTsKKyNpZiAhVVNJTkdfS0VSTkVMX1BMTF9MT09QCisJZnJlcV9kcmlmdCA9IDA7CisjZW5kaWYKKyNpZiBVU0lOR19JTklUSUFMX0ZSRVFfRVNUSU1BVElPTgorCWlmIChHLmRpc2NpcGxpbmVfc3RhdGUgPT0gU1RBVEVfRlJFUSkgeworCQkvKiBJZ25vcmUgdXBkYXRlcyB1bnRpbCB0aGUgc3RlcG91dCB0aHJlc2hvbGQgKi8KKwkJaWYgKHNpbmNlX2xhc3RfdXBkYXRlIDwgV0FUQ0hfVEhSRVNIT0xEKSB7CisJCQlWRVJCMyBiYl9lcnJvcl9tc2coIm1lYXN1cmluZyBkcmlmdCwgZGF0YXBvaW50IGlnbm9yZWQsICVmIHNlYyByZW1haW5zIiwKKwkJCQkJV0FUQ0hfVEhSRVNIT0xEIC0gc2luY2VfbGFzdF91cGRhdGUpOworCQkJcmV0dXJuIDA7IC8qICJsZWF2ZSBwb2xsIGludGVydmFsIGFzIGlzIiAqLworCQl9CisjIGlmICFVU0lOR19LRVJORUxfUExMX0xPT1AKKwkJZnJlcV9kcmlmdCA9IChvZmZzZXQgLSBHLmxhc3RfdXBkYXRlX29mZnNldCkgLyBzaW5jZV9sYXN0X3VwZGF0ZTsKKyMgZW5kaWYKKwl9CisjZW5kaWYKKworCS8qIFRoZXJlIGFyZSB0d28gbWFpbiByZWdpbWVzOiB3aGVuIHRoZQorCSAqIG9mZnNldCBleGNlZWRzIHRoZSBzdGVwIHRocmVzaG9sZCBhbmQgd2hlbiBpdCBkb2VzIG5vdC4KKwkgKi8KKwlpZiAoYWJzX29mZnNldCA+IFNURVBfVEhSRVNIT0xEKSB7CisJCXN3aXRjaCAoRy5kaXNjaXBsaW5lX3N0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1lOQzoKKwkJCS8qIFRoZSBmaXJzdCBvdXRseWVyOiBpZ25vcmUgaXQsIHN3aXRjaCB0byBTUElLIHN0YXRlICovCisJCQlWRVJCMyBiYl9lcnJvcl9tc2coIm9mZnNldDolZiAtIHNwaWtlIGRldGVjdGVkIiwgb2Zmc2V0KTsKKwkJCUcuZGlzY2lwbGluZV9zdGF0ZSA9IFNUQVRFX1NQSUs7CisJCQlyZXR1cm4gLTE7IC8qICJkZWNyZWFzZSBwb2xsIGludGVydmFsIiAqLworCisJCWNhc2UgU1RBVEVfU1BJSzoKKwkJCS8qIElnbm9yZSBzdWNjZWVkaW5nIG91dGx5ZXJzIHVudGlsIGVpdGhlciBhbiBpbmx5ZXIKKwkJCSAqIGlzIGZvdW5kIG9yIHRoZSBzdGVwb3V0IHRocmVzaG9sZCBpcyBleGNlZWRlZC4KKwkJCSAqLworCQkJaWYgKHNpbmNlX2xhc3RfdXBkYXRlIDwgV0FUQ0hfVEhSRVNIT0xEKSB7CisJCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJzcGlrZSBkZXRlY3RlZCwgZGF0YXBvaW50IGlnbm9yZWQsICVmIHNlYyByZW1haW5zIiwKKwkJCQkJCVdBVENIX1RIUkVTSE9MRCAtIHNpbmNlX2xhc3RfdXBkYXRlKTsKKwkJCQlyZXR1cm4gLTE7IC8qICJkZWNyZWFzZSBwb2xsIGludGVydmFsIiAqLworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoOiB3ZSBuZWVkIHRvIHN0ZXAgKi8KKwkJfSAvKiBzd2l0Y2ggKi8KKworCQkvKiBTdGVwIHRoZSB0aW1lIGFuZCBjbGFtcCBkb3duIHRoZSBwb2xsIGludGVydmFsLgorCQkgKgorCQkgKiBJbiBOU0VUIHN0YXRlIGFuIGluaXRpYWwgZnJlcXVlbmN5IGNvcnJlY3Rpb24gaXMKKwkJICogbm90IGF2YWlsYWJsZSwgdXN1YWxseSBiZWNhdXNlIHRoZSBmcmVxdWVuY3kgZmlsZSBoYXMKKwkJICogbm90IHlldCBiZWVuIHdyaXR0ZW4uIFNpbmNlIHRoZSB0aW1lIGlzIG91dHNpZGUgdGhlCisJCSAqIGNhcHR1cmUgcmFuZ2UsIHRoZSBjbG9jayBpcyBzdGVwcGVkLiBUaGUgZnJlcXVlbmN5CisJCSAqIHdpbGwgYmUgc2V0IGRpcmVjdGx5IGZvbGxvd2luZyB0aGUgc3RlcG91dCBpbnRlcnZhbC4KKwkJICoKKwkJICogSW4gRlNFVCBzdGF0ZSB0aGUgaW5pdGlhbCBmcmVxdWVuY3kgaGFzIGJlZW4gc2V0CisJCSAqIGZyb20gdGhlIGZyZXF1ZW5jeSBmaWxlLiBTaW5jZSB0aGUgdGltZSBpcyBvdXRzaWRlCisJCSAqIHRoZSBjYXB0dXJlIHJhbmdlLCB0aGUgY2xvY2sgaXMgc3RlcHBlZCBpbW1lZGlhdGVseSwKKwkJICogcmF0aGVyIHRoYW4gYWZ0ZXIgdGhlIHN0ZXBvdXQgaW50ZXJ2YWwuIEd1eXMgZ2V0CisJCSAqIG5lcnZvdXMgaWYgaXQgdGFrZXMgMTcgbWludXRlcyB0byBzZXQgdGhlIGNsb2NrIGZvcgorCQkgKiB0aGUgZmlyc3QgdGltZS4KKwkJICoKKwkJICogSW4gU1BJSyBzdGF0ZSB0aGUgc3RlcG91dCB0aHJlc2hvbGQgaGFzIGV4cGlyZWQgYW5kCisJCSAqIHRoZSBwaGFzZSBpcyBzdGlsbCBhYm92ZSB0aGUgc3RlcCB0aHJlc2hvbGQuIE5vdGUKKwkJICogdGhhdCBhIHNpbmdsZSBzcGlrZSBncmVhdGVyIHRoYW4gdGhlIHN0ZXAgdGhyZXNob2xkCisJCSAqIGlzIGFsd2F5cyBzdXBwcmVzc2VkLCBldmVuIGF0IHRoZSBsb25nZXIgcG9sbAorCQkgKiBpbnRlcnZhbHMuCisJCSAqLworCQlWRVJCMyBiYl9lcnJvcl9tc2coInN0ZXBwaW5nIHRpbWUgYnkgJWY7IHBvbGxfZXhwPU1JTlBPTEwiLCBvZmZzZXQpOworCQlzdGVwX3RpbWUob2Zmc2V0KTsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcSkgeworCQkJLyogV2Ugd2VyZSBvbmx5IGFza2VkIHRvIHNldCB0aW1lIG9uY2UuIERvbmUuICovCisJCQlleGl0KDApOworCQl9CisKKwkJRy5wb2xsYWRqX2NvdW50ID0gMDsKKwkJRy5wb2xsX2V4cCA9IE1JTlBPTEw7CisJCUcuc3RyYXR1bSA9IE1BWFNUUkFUOworCisJCXJ1bl9zY3JpcHQoInN0ZXAiLCBvZmZzZXQpOworCisjaWYgVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04KKwkJaWYgKEcuZGlzY2lwbGluZV9zdGF0ZSA9PSBTVEFURV9OU0VUKSB7CisJCQlzZXRfbmV3X3ZhbHVlcyhTVEFURV9GUkVRLCAvKm9mZnNldDoqLyAwLCByZWN2X3RpbWUpOworCQkJcmV0dXJuIDE7IC8qICJvayB0byBpbmNyZWFzZSBwb2xsIGludGVydmFsIiAqLworCQl9CisjZW5kaWYKKwkJc2V0X25ld192YWx1ZXMoU1RBVEVfU1lOQywgLypvZmZzZXQ6Ki8gMCwgcmVjdl90aW1lKTsKKworCX0gZWxzZSB7IC8qIGFic19vZmZzZXQgPD0gU1RFUF9USFJFU0hPTEQgKi8KKworCQlpZiAoRy5wb2xsX2V4cCA8IE1JTlBPTEwgJiYgRy5pbml0aWFsX3BvbGxfY29tcGxldGUpIHsKKwkJCVZFUkIzIGJiX2Vycm9yX21zZygic21hbGwgb2Zmc2V0OiVmLCBkaXNhYmxpbmcgYnVyc3QgbW9kZSIsIG9mZnNldCk7CisJCQlHLnBvbGxhZGpfY291bnQgPSAwOworCQkJRy5wb2xsX2V4cCA9IE1JTlBPTEw7CisJCX0KKworCQkvKiBDb21wdXRlIHRoZSBjbG9jayBqaXR0ZXIgYXMgdGhlIFJNUyBvZiBleHBvbmVudGlhbGx5CisJCSAqIHdlaWdodGVkIG9mZnNldCBkaWZmZXJlbmNlcy4gVXNlZCBieSB0aGUgcG9sbCBhZGp1c3QgY29kZS4KKwkJICovCisJCWV0ZW1wID0gU1FVQVJFKEcuZGlzY2lwbGluZV9qaXR0ZXIpOworCQlkdGVtcCA9IFNRVUFSRShNQVhEKGZhYnMob2Zmc2V0IC0gRy5sYXN0X3VwZGF0ZV9vZmZzZXQpLCBHX3ByZWNpc2lvbl9zZWMpKTsKKwkJRy5kaXNjaXBsaW5lX2ppdHRlciA9IFNRUlQoZXRlbXAgKyAoZHRlbXAgLSBldGVtcCkgLyBBVkcpOworCQlWRVJCMyBiYl9lcnJvcl9tc2coImRpc2NpcGxpbmUgaml0dGVyPSVmIiwgRy5kaXNjaXBsaW5lX2ppdHRlcik7CisKKwkJc3dpdGNoIChHLmRpc2NpcGxpbmVfc3RhdGUpIHsKKwkJY2FzZSBTVEFURV9OU0VUOgorCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcSkgeworCQkJCS8qIFdlIHdlcmUgb25seSBhc2tlZCB0byBzZXQgdGltZSBvbmNlLgorCQkJCSAqIFRoZSBjbG9jayBpcyBwcmVjaXNlIGVub3VnaCwgbm8gbmVlZCB0byBzdGVwLgorCQkJCSAqLworCQkJCWV4aXQoMCk7CisJCQl9CisjaWYgVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04KKwkJCS8qIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZSByZWNlaXZlZCBhbmQgdGhlIGZyZXF1ZW5jeQorCQkJICogaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBUaGUgZmlyc3QgdGhpbmcgdG8gZG8KKwkJCSAqIGlzIGRpcmVjdGx5IG1lYXN1cmUgdGhlIG9zY2lsbGF0b3IgZnJlcXVlbmN5LgorCQkJICovCisJCQlzZXRfbmV3X3ZhbHVlcyhTVEFURV9GUkVRLCBvZmZzZXQsIHJlY3ZfdGltZSk7CisjZWxzZQorCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfU1lOQywgb2Zmc2V0LCByZWN2X3RpbWUpOworI2VuZGlmCisJCQlWRVJCMyBiYl9lcnJvcl9tc2coInRyYW5zaXRpb25pbmcgdG8gRlJFUSwgZGF0YXBvaW50IGlnbm9yZWQiKTsKKwkJCXJldHVybiAwOyAvKiAibGVhdmUgcG9sbCBpbnRlcnZhbCBhcyBpcyIgKi8KKworI2lmIDAgLyogdGhpcyBpcyBkZWFkIGNvZGUgZm9yIG5vdyAqLworCQljYXNlIFNUQVRFX0ZTRVQ6CisJCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgYW5kIHRoZSBmcmVxdWVuY3kKKwkJCSAqIGhhcyBiZWVuIGluaXRpYWxpemVkLiBBZGp1c3QgdGhlIHBoYXNlLCBidXQKKwkJCSAqIGRvbid0IGFkanVzdCB0aGUgZnJlcXVlbmN5IHVudGlsIHRoZSBuZXh0IHVwZGF0ZS4KKwkJCSAqLworCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfU1lOQywgb2Zmc2V0LCByZWN2X3RpbWUpOworCQkJLyogZnJlcV9kcmlmdCByZW1haW5zIDAgKi8KKwkJCWJyZWFrOworI2VuZGlmCisKKyNpZiBVU0lOR19JTklUSUFMX0ZSRVFfRVNUSU1BVElPTgorCQljYXNlIFNUQVRFX0ZSRVE6CisJCQkvKiBzaW5jZV9sYXN0X3VwZGF0ZSA+PSBXQVRDSF9USFJFU0hPTEQsIHdlIHdhaXRlZCBlbm91Z2guCisJCQkgKiBDb3JyZWN0IHRoZSBwaGFzZSBhbmQgZnJlcXVlbmN5IGFuZCBzd2l0Y2ggdG8gU1lOQyBzdGF0ZS4KKwkJCSAqIGZyZXFfZHJpZnQgd2FzIGFscmVhZHkgZXN0aW1hdGVkIChzZWUgY29kZSBhYm92ZSkKKwkJCSAqLworCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfU1lOQywgb2Zmc2V0LCByZWN2X3RpbWUpOworCQkJYnJlYWs7CisjZW5kaWYKKworCQlkZWZhdWx0OgorI2lmICFVU0lOR19LRVJORUxfUExMX0xPT1AKKwkJCS8qIENvbXB1dGUgZnJlcV9kcmlmdCBkdWUgdG8gUExMIGFuZCBGTEwgY29udHJpYnV0aW9ucy4KKwkJCSAqCisJCQkgKiBUaGUgRkxMIGFuZCBQTEwgZnJlcXVlbmN5IGdhaW4gY29uc3RhbnRzCisJCQkgKiBkZXBlbmQgb24gdGhlIHBvbGwgaW50ZXJ2YWwgYW5kIEFsbGFuCisJCQkgKiBpbnRlcmNlcHQuIFRoZSBGTEwgaXMgbm90IHVzZWQgYmVsb3cgb25lLWhhbGYKKwkJCSAqIHRoZSBBbGxhbiBpbnRlcmNlcHQuIEFib3ZlIHRoYXQgdGhlIGxvb3AgZ2FpbgorCQkJICogaW5jcmVhc2VzIGluIHN0ZXBzIHRvIDEgLyBBVkcuCisJCQkgKi8KKwkJCWlmICgoMSA8PCBHLnBvbGxfZXhwKSA+IEFMTEFOIC8gMikgeworCQkJCWV0ZW1wID0gRkxMIC0gRy5wb2xsX2V4cDsKKwkJCQlpZiAoZXRlbXAgPCBBVkcpCisJCQkJCWV0ZW1wID0gQVZHOworCQkJCWZyZXFfZHJpZnQgKz0gKG9mZnNldCAtIEcubGFzdF91cGRhdGVfb2Zmc2V0KSAvIChNQVhEKHNpbmNlX2xhc3RfdXBkYXRlLCBBTExBTikgKiBldGVtcCk7CisJCQl9CisJCQkvKiBGb3IgdGhlIFBMTCB0aGUgaW50ZWdyYXRpb24gaW50ZXJ2YWwKKwkJCSAqIChudW1lcmF0b3IpIGlzIHRoZSBtaW5pbXVtIG9mIHRoZSB1cGRhdGUKKwkJCSAqIGludGVydmFsIGFuZCBwb2xsIGludGVydmFsLiBUaGlzIGFsbG93cworCQkJICogb3ZlcnNhbXBsaW5nLCBidXQgbm90IHVuZGVyc2FtcGxpbmcuCisJCQkgKi8KKwkJCWV0ZW1wID0gTUlORChzaW5jZV9sYXN0X3VwZGF0ZSwgKDEgPDwgRy5wb2xsX2V4cCkpOworCQkJZHRlbXAgPSAoNCAqIFBMTCkgPDwgRy5wb2xsX2V4cDsKKwkJCWZyZXFfZHJpZnQgKz0gb2Zmc2V0ICogZXRlbXAgLyBTUVVBUkUoZHRlbXApOworI2VuZGlmCisJCQlzZXRfbmV3X3ZhbHVlcyhTVEFURV9TWU5DLCBvZmZzZXQsIHJlY3ZfdGltZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoRy5zdHJhdHVtICE9IHAtPmxhc3Rwa3Rfc3RyYXR1bSArIDEpIHsKKwkJCUcuc3RyYXR1bSA9IHAtPmxhc3Rwa3Rfc3RyYXR1bSArIDE7CisJCQlydW5fc2NyaXB0KCJzdHJhdHVtIiwgb2Zmc2V0KTsKKwkJfQorCX0KKworCUcucmVmdGltZSA9IEcuY3VyX3RpbWU7CisJRy5udHBfc3RhdHVzID0gcC0+bGFzdHBrdF9zdGF0dXM7CisJRy5yZWZpZCA9IHAtPmxhc3Rwa3RfcmVmaWQ7CisJRy5yb290ZGVsYXkgPSBwLT5sYXN0cGt0X3Jvb3RkZWxheSArIHAtPmxhc3Rwa3RfZGVsYXk7CisJZHRlbXAgPSBwLT5maWx0ZXJfaml0dGVyOyAvLyBTUVJUKFNRVUFSRShwLT5maWx0ZXJfaml0dGVyKSArIFNRVUFSRShHLmNsdXN0ZXJfaml0dGVyKSk7CisJZHRlbXAgKz0gTUFYRChwLT5maWx0ZXJfZGlzcGVyc2lvbiArIEZSRVFfVE9MRVJBTkNFICogKEcuY3VyX3RpbWUgLSBwLT5sYXN0cGt0X3JlY3ZfdGltZSkgKyBhYnNfb2Zmc2V0LCBNSU5ESVNQKTsKKwlHLnJvb3RkaXNwID0gcC0+bGFzdHBrdF9yb290ZGlzcCArIGR0ZW1wOworCVZFUkIzIGJiX2Vycm9yX21zZygidXBkYXRpbmcgbGVhcC9yZWZpZC9yZWZ0aW1lL3Jvb3RkaXNwIGZyb20gcGVlciAlcyIsIHAtPnBfZG90dGVkKTsKKworCS8qIFdlIGFyZSBpbiBTVEFURV9TWU5DIG5vdywgYnV0IGRpZCBub3QgZG8gYWRqdGltZXggeWV0LgorCSAqIChBbnkgb3RoZXIgc3RhdGUgZG9lcyBub3QgcmVhY2ggdGhpcywgdGhleSBhbGwgcmV0dXJuIGVhcmxpZXIpCisJICogQnkgdGhpcyB0aW1lLCBmcmVxX2RyaWZ0IGFuZCBHLmxhc3RfdXBkYXRlX29mZnNldCBhcmUgc2V0CisJICogdG8gdmFsdWVzIHN1aXRhYmxlIGZvciBhZGp0aW1leC4KKwkgKi8KKyNpZiAhVVNJTkdfS0VSTkVMX1BMTF9MT09QCisJLyogQ2FsY3VsYXRlIHRoZSBuZXcgZnJlcXVlbmN5IGRyaWZ0IGFuZCBmcmVxdWVuY3kgc3RhYmlsaXR5ICh3YW5kZXIpLgorCSAqIENvbXB1dGUgdGhlIGNsb2NrIHdhbmRlciBhcyB0aGUgUk1TIG9mIGV4cG9uZW50aWFsbHkgd2VpZ2h0ZWQKKwkgKiBmcmVxdWVuY3kgZGlmZmVyZW5jZXMuIFRoaXMgaXMgbm90IHVzZWQgZGlyZWN0bHksIGJ1dCBjYW4sCisJICogYWxvbmcgd2l0aCB0aGUgaml0dGVyLCBiZSBhIGhpZ2hseSB1c2VmdWwgbW9uaXRvcmluZyBhbmQKKwkgKiBkZWJ1Z2dpbmcgdG9vbC4KKwkgKi8KKwlkdGVtcCA9IEcuZGlzY2lwbGluZV9mcmVxX2RyaWZ0ICsgZnJlcV9kcmlmdDsKKwlHLmRpc2NpcGxpbmVfZnJlcV9kcmlmdCA9IE1BWEQoTUlORChNQVhEUklGVCwgZHRlbXApLCAtTUFYRFJJRlQpOworCWV0ZW1wID0gU1FVQVJFKEcuZGlzY2lwbGluZV93YW5kZXIpOworCWR0ZW1wID0gU1FVQVJFKGR0ZW1wKTsKKwlHLmRpc2NpcGxpbmVfd2FuZGVyID0gU1FSVChldGVtcCArIChkdGVtcCAtIGV0ZW1wKSAvIEFWRyk7CisKKwlWRVJCMyBiYl9lcnJvcl9tc2coImRpc2NpcGxpbmUgZnJlcV9kcmlmdD0lLjlmKGludDolbGQgY29ycjolZSkgd2FuZGVyPSVmIiwKKwkJCUcuZGlzY2lwbGluZV9mcmVxX2RyaWZ0LAorCQkJKGxvbmcpKEcuZGlzY2lwbGluZV9mcmVxX2RyaWZ0ICogNjU1MzZlNiksCisJCQlmcmVxX2RyaWZ0LAorCQkJRy5kaXNjaXBsaW5lX3dhbmRlcik7CisjZW5kaWYKKwlWRVJCMyB7CisJCW1lbXNldCgmdG14LCAwLCBzaXplb2YodG14KSk7CisJCWlmIChhZGp0aW1leCgmdG14KSA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImFkanRpbWV4Iik7CisJCVZFUkIzIGJiX2Vycm9yX21zZygicCBhZGp0aW1leCBmcmVxOiVsZCBvZmZzZXQ6JWxkIGNvbnN0YW50OiVsZCBzdGF0dXM6MHgleCIsCisJCQkJdG14LmZyZXEsIHRteC5vZmZzZXQsIHRteC5jb25zdGFudCwgdG14LnN0YXR1cyk7CisJfQorCisJbWVtc2V0KCZ0bXgsIDAsIHNpemVvZih0bXgpKTsKKyNpZiAwCisvL2RvZXNuJ3Qgd29yaywgb2Zmc2V0IHJlbWFpbnMgMCAoISkgaW4ga2VybmVsOgorLy9udHBkOiAgc2V0IGFkanRpbWV4IGZyZXE6MTc4NjA5NyB0bXgub2Zmc2V0Ojc3NDg3CisvL250cGQ6IHByZXYgYWRqdGltZXggZnJlcToxNzg2MDk3IHRteC5vZmZzZXQ6MAorLy9udHBkOiAgY3VyIGFkanRpbWV4IGZyZXE6MTc4NjA5NyB0bXgub2Zmc2V0OjAKKwl0bXgubW9kZXMgPSBBREpfRlJFUVVFTkNZIHwgQURKX09GRlNFVDsKKwkvKiA2NTUzNiBpcyBvbmUgcHBtICovCisJdG14LmZyZXEgPSBHLmRpc2NpcGxpbmVfZnJlcV9kcmlmdCAqIDY1NTM2ZTY7CisJdG14Lm9mZnNldCA9IEcubGFzdF91cGRhdGVfb2Zmc2V0ICogMTAwMDAwMDsgLyogdXNlYyAqLworI2VuZGlmCisJdG14Lm1vZGVzID0gQURKX09GRlNFVCB8IEFESl9TVEFUVVMgfCBBREpfVElNRUNPTlNUOy8vIHwgQURKX01BWEVSUk9SIHwgQURKX0VTVEVSUk9SOworCXRteC5vZmZzZXQgPSAoRy5sYXN0X3VwZGF0ZV9vZmZzZXQgKiAxMDAwMDAwKTsgLyogdXNlYyAqLworCQkJLyogKyAoRy5sYXN0X3VwZGF0ZV9vZmZzZXQgPCAwID8gLTAuNSA6IDAuNSkgLSB0b28gc21hbGwgdG8gYm90aGVyICovCisJdG14LnN0YXR1cyA9IFNUQV9QTEw7CisJaWYgKEcubnRwX3N0YXR1cyAmIExJX1BMVVNTRUMpCisJCXRteC5zdGF0dXMgfD0gU1RBX0lOUzsKKwlpZiAoRy5udHBfc3RhdHVzICYgTElfTUlOVVNTRUMpCisJCXRteC5zdGF0dXMgfD0gU1RBX0RFTDsKKwl0bXguY29uc3RhbnQgPSBHLnBvbGxfZXhwIC0gNDsKKwkvL3RteC5lc3RlcnJvciA9ICh1X2ludDMyKShjbG9ja19qaXR0ZXIgKiAxZTYpOworCS8vdG14Lm1heGVycm9yID0gKHVfaW50MzIpKChzeXNfcm9vdGRlbGF5IC8gMiArIHN5c19yb290ZGlzcCkgKiAxZTYpOworCXJjID0gYWRqdGltZXgoJnRteCk7CisJaWYgKHJjIDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhZGp0aW1leCIpOworCS8qIE5COiBoZXJlIGtlcm5lbCByZXR1cm5zIGNvbnN0YW50ID09IEcucG9sbF9leHAsIG5vdCA9PSBHLnBvbGxfZXhwIC0gNC4KKwkgKiBOb3Qgc3VyZSB3aHkuIFBlcmhhcHMgaXQgaXMgbm9ybWFsLgorCSAqLworCVZFUkIzIGJiX2Vycm9yX21zZygiYWRqdGltZXg6JWQgZnJlcTolbGQgb2Zmc2V0OiVsZCBjb25zdGFudDolbGQgc3RhdHVzOjB4JXgiLAorCQkJCXJjLCB0bXguZnJlcSwgdG14Lm9mZnNldCwgdG14LmNvbnN0YW50LCB0bXguc3RhdHVzKTsKKyNpZiAwCisJVkVSQjMgeworCQkvKiBhbHdheXMgZ2l2ZXMgdGhlIHNhbWUgb3V0cHV0IGFzIGFib3ZlIG1zZyAqLworCQltZW1zZXQoJnRteCwgMCwgc2l6ZW9mKHRteCkpOworCQlpZiAoYWRqdGltZXgoJnRteCkgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhZGp0aW1leCIpOworCQlWRVJCMyBiYl9lcnJvcl9tc2coImMgYWRqdGltZXggZnJlcTolbGQgb2Zmc2V0OiVsZCBjb25zdGFudDolbGQgc3RhdHVzOjB4JXgiLAorCQkJCXRteC5mcmVxLCB0bXgub2Zmc2V0LCB0bXguY29uc3RhbnQsIHRteC5zdGF0dXMpOworCX0KKyNlbmRpZgorCUcua2VybmVsX2ZyZXFfZHJpZnQgPSB0bXguZnJlcSAvIDY1NTM2OworCVZFUkIyIGJiX2Vycm9yX21zZygidXBkYXRlIHBlZXI6JXMsIG9mZnNldDolZiwgY2xvY2sgZHJpZnQ6JWxkIHBwbSIsCisJCQlwLT5wX2RvdHRlZCwgRy5sYXN0X3VwZGF0ZV9vZmZzZXQsIEcua2VybmVsX2ZyZXFfZHJpZnQpOworCisJcmV0dXJuIDE7IC8qICJvayB0byBpbmNyZWFzZSBwb2xsIGludGVydmFsIiAqLworfQorCisKKy8qCisgKiBXZSd2ZSBnb3QgYSBuZXcgcmVwbHkgcGFja2V0IGZyb20gYSBwZWVyLCBwcm9jZXNzIGl0CisgKiAoaGVscGVycyBmaXJzdCkKKyAqLworc3RhdGljIHVuc2lnbmVkCityZXRyeV9pbnRlcnZhbCh2b2lkKQoreworCS8qIExvY2FsIHByb2JsZW0sIHdhbnQgdG8gcmV0cnkgc29vbiAqLworCXVuc2lnbmVkIGludGVydmFsLCByOworCWludGVydmFsID0gUkVUUllfSU5URVJWQUw7CisJciA9IHJhbmRvbSgpOworCWludGVydmFsICs9IHIgJSAodW5zaWduZWQpKFJFVFJZX0lOVEVSVkFMIC8gNCk7CisJVkVSQjMgYmJfZXJyb3JfbXNnKCJjaG9zZSByZXRyeSBpbnRlcnZhbDoldSIsIGludGVydmFsKTsKKwlyZXR1cm4gaW50ZXJ2YWw7Cit9CitzdGF0aWMgdW5zaWduZWQKK3BvbGxfaW50ZXJ2YWwoaW50IGV4cG9uZW50KQoreworCXVuc2lnbmVkIGludGVydmFsLCByOworCWV4cG9uZW50ID0gRy5wb2xsX2V4cCArIGV4cG9uZW50OworCWlmIChleHBvbmVudCA8IDApCisJCWV4cG9uZW50ID0gMDsKKwlpbnRlcnZhbCA9IDEgPDwgZXhwb25lbnQ7CisJciA9IHJhbmRvbSgpOworCWludGVydmFsICs9ICgociAmIChpbnRlcnZhbC0xKSkgPj4gNCkgKyAoKHIgPj4gOCkgJiAxKTsgLyogKyAxLzE2IG9mIGludGVydmFsLCBtYXggKi8KKwlWRVJCMyBiYl9lcnJvcl9tc2coImNob3NlIHBvbGwgaW50ZXJ2YWw6JXUgKHBvbGxfZXhwOiVkIGV4cDolZCkiLCBpbnRlcnZhbCwgRy5wb2xsX2V4cCwgZXhwb25lbnQpOworCXJldHVybiBpbnRlcnZhbDsKK30KK3N0YXRpYyBOT0lOTElORSB2b2lkCityZWN2X2FuZF9wcm9jZXNzX3BlZXJfcGt0KHBlZXJfdCAqcCkKK3sKKwlpbnQgICAgICAgICByYzsKKwlzc2l6ZV90ICAgICBzaXplOworCW1zZ190ICAgICAgIG1zZzsKKwlkb3VibGUgICAgICBUMSwgVDIsIFQzLCBUNDsKKwl1bnNpZ25lZCAgICBpbnRlcnZhbDsKKwlkYXRhcG9pbnRfdCAqZGF0YXBvaW50OworCXBlZXJfdCAgICAgICpxOworCisJLyogV2UgY2FuIHJlY3Zmcm9tIGhlcmUgYW5kIGNoZWNrIGZyb20uSVAsIGJ1dCBzb21lIG11bHRpaG9tZWQKKwkgKiBudHAgc2VydmVycyByZXBseSBmcm9tIHRoZWlyICpvdGhlciBJUCouCisJICogVE9ETzogbWF5YmUgd2Ugc2hvdWxkIGNoZWNrIGF0IGxlYXN0IHdoYXQgd2UgY2FuOiBmcm9tLnBvcnQgPT0gMTIzPworCSAqLworCXNpemUgPSByZWN2KHAtPnBfZmQsICZtc2csIHNpemVvZihtc2cpLCBNU0dfRE9OVFdBSVQpOworCWlmIChzaXplID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coInJlY3YoJXMpIGVycm9yIiwgcC0+cF9kb3R0ZWQpOworCQlpZiAoZXJybm8gPT0gRUhPU1RVTlJFQUNIIHx8IGVycm5vID09IEVIT1NURE9XTgorCQkgfHwgZXJybm8gPT0gRU5FVFVOUkVBQ0ggfHwgZXJybm8gPT0gRU5FVERPV04KKwkJIHx8IGVycm5vID09IEVDT05OUkVGVVNFRCB8fCBlcnJubyA9PSBFQUREUk5PVEFWQUlMCisJCSB8fCBlcnJubyA9PSBFQUdBSU4KKwkJKSB7CisvL1RPRE86IGFsd2F5cyBkbyB0aGlzPworCQkJaW50ZXJ2YWwgPSByZXRyeV9pbnRlcnZhbCgpOworCQkJZ290byBzZXRfbmV4dF9hbmRfY2xvc2Vfc29jazsKKwkJfQorCQl4ZnVuY19kaWUoKTsKKwl9CisKKwlpZiAoc2l6ZSAhPSBOVFBfTVNHU0laRV9OT0FVVEggJiYgc2l6ZSAhPSBOVFBfTVNHU0laRSkgeworCQliYl9lcnJvcl9tc2coIm1hbGZvcm1lZCBwYWNrZXQgcmVjZWl2ZWQgZnJvbSAlcyIsIHAtPnBfZG90dGVkKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmIChtc2cubV9vcmd0aW1lLmludF9wYXJ0bCAhPSBwLT5wX3htdF9tc2cubV94bXR0aW1lLmludF9wYXJ0bAorCSB8fCBtc2cubV9vcmd0aW1lLmZyYWN0aW9ubCAhPSBwLT5wX3htdF9tc2cubV94bXR0aW1lLmZyYWN0aW9ubAorCSkgeworCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKChtc2cubV9zdGF0dXMgJiBMSV9BTEFSTSkgPT0gTElfQUxBUk0KKwkgfHwgbXNnLm1fc3RyYXR1bSA9PSAwCisJIHx8IG1zZy5tX3N0cmF0dW0gPiBOVFBfTUFYU1RSQVRVTQorCSkgeworLy8gVE9ETzogc3RyYXR1bSAwIHJlc3BvbnNlcyBtYXkgaGF2ZSBjb21tYW5kcyBpbiAzMi1iaXQgbV9yZWZpZCBmaWVsZDoKKy8vICJERU5ZIiwgIlJTVFIiIC0gcGVlciBkb2VzIG5vdCBsaWtlIHVzIGF0IGFsbAorLy8gIlJBVEUiIC0gcGVlciBpcyBvdmVybG9hZGVkLCByZWR1Y2UgcG9sbGluZyBmcmVxCisJCWludGVydmFsID0gcG9sbF9pbnRlcnZhbCgwKTsKKwkJYmJfZXJyb3JfbXNnKCJyZXBseSBmcm9tICVzOiBub3Qgc3luY2VkLCBuZXh0IHF1ZXJ5IGluICV1cyIsIHAtPnBfZG90dGVkLCBpbnRlcnZhbCk7CisJCWdvdG8gc2V0X25leHRfYW5kX2Nsb3NlX3NvY2s7CisJfQorCisvLwkvKiBWZXJpZnkgdmFsaWQgcm9vdCBkaXN0YW5jZSAqLworLy8JaWYgKG1zZy5tX3Jvb3RkZWxheSAvIDIgKyBtc2cubV9yb290ZGlzcCA+PSBNQVhESVNQIHx8IHAtPmxhc3Rwa3RfcmVmdGltZSA+IG1zZy5tX3htdCkKKy8vCQlyZXR1cm47ICAgICAgICAgICAgICAgICAvKiBpbnZhbGlkIGhlYWRlciB2YWx1ZXMgKi8KKworCXAtPmxhc3Rwa3Rfc3RhdHVzID0gbXNnLm1fc3RhdHVzOworCXAtPmxhc3Rwa3Rfc3RyYXR1bSA9IG1zZy5tX3N0cmF0dW07CisJcC0+bGFzdHBrdF9yb290ZGVsYXkgPSBzZnBfdG9fZChtc2cubV9yb290ZGVsYXkpOworCXAtPmxhc3Rwa3Rfcm9vdGRpc3AgPSBzZnBfdG9fZChtc2cubV9yb290ZGlzcCk7CisJcC0+bGFzdHBrdF9yZWZpZCA9IG1zZy5tX3JlZmlkOworCisJLyoKKwkgKiBGcm9tIFJGQyAyMDMwICh3aXRoIGEgY29ycmVjdGlvbiB0byB0aGUgZGVsYXkgbWF0aCk6CisJICoKKwkgKiBUaW1lc3RhbXAgTmFtZSAgICAgICAgICBJRCAgIFdoZW4gR2VuZXJhdGVkCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogT3JpZ2luYXRlIFRpbWVzdGFtcCAgICAgVDEgICB0aW1lIHJlcXVlc3Qgc2VudCBieSBjbGllbnQKKwkgKiBSZWNlaXZlIFRpbWVzdGFtcCAgICAgICBUMiAgIHRpbWUgcmVxdWVzdCByZWNlaXZlZCBieSBzZXJ2ZXIKKwkgKiBUcmFuc21pdCBUaW1lc3RhbXAgICAgICBUMyAgIHRpbWUgcmVwbHkgc2VudCBieSBzZXJ2ZXIKKwkgKiBEZXN0aW5hdGlvbiBUaW1lc3RhbXAgICBUNCAgIHRpbWUgcmVwbHkgcmVjZWl2ZWQgYnkgY2xpZW50CisJICoKKwkgKiBUaGUgcm91bmR0cmlwIGRlbGF5IGFuZCBsb2NhbCBjbG9jayBvZmZzZXQgYXJlIGRlZmluZWQgYXMKKwkgKgorCSAqIGRlbGF5ID0gKFQ0IC0gVDEpIC0gKFQzIC0gVDIpOyBvZmZzZXQgPSAoKFQyIC0gVDEpICsgKFQzIC0gVDQpKSAvIDIKKwkgKi8KKwlUMSA9IHAtPnBfeG10dGltZTsKKwlUMiA9IGxmcF90b19kKG1zZy5tX3JlY3RpbWUpOworCVQzID0gbGZwX3RvX2QobXNnLm1feG10dGltZSk7CisJVDQgPSBHLmN1cl90aW1lOworCisJcC0+bGFzdHBrdF9yZWN2X3RpbWUgPSBUNDsKKworCVZFUkI1IGJiX2Vycm9yX21zZygiJXMtPmxhc3Rwa3RfcmVjdl90aW1lPSVmIiwgcC0+cF9kb3R0ZWQsIHAtPmxhc3Rwa3RfcmVjdl90aW1lKTsKKwlwLT5kYXRhcG9pbnRfaWR4ID0gcC0+cmVhY2hhYmxlX2JpdHMgPyAocC0+ZGF0YXBvaW50X2lkeCArIDEpICUgTlVNX0RBVEFQT0lOVFMgOiAwOworCWRhdGFwb2ludCA9ICZwLT5maWx0ZXJfZGF0YXBvaW50W3AtPmRhdGFwb2ludF9pZHhdOworCWRhdGFwb2ludC0+ZF9yZWN2X3RpbWUgPSBUNDsKKwlkYXRhcG9pbnQtPmRfb2Zmc2V0ICAgID0gKChUMiAtIFQxKSArIChUMyAtIFQ0KSkgLyAyOworCS8qIFRoZSBkZWxheSBjYWxjdWxhdGlvbiBpcyBhIHNwZWNpYWwgY2FzZS4gSW4gY2FzZXMgd2hlcmUgdGhlCisJICogc2VydmVyIGFuZCBjbGllbnQgY2xvY2tzIGFyZSBydW5uaW5nIGF0IGRpZmZlcmVudCByYXRlcyBhbmQKKwkgKiB3aXRoIHZlcnkgZmFzdCBuZXR3b3JrcywgdGhlIGRlbGF5IGNhbiBhcHBlYXIgbmVnYXRpdmUuIEluCisJICogb3JkZXIgdG8gYXZvaWQgdmlvbGF0aW5nIHRoZSBQcmluY2lwbGUgb2YgTGVhc3QgQXN0b25pc2htZW50LAorCSAqIHRoZSBkZWxheSBpcyBjbGFtcGVkIG5vdCBsZXNzIHRoYW4gdGhlIHN5c3RlbSBwcmVjaXNpb24uCisJICovCisJcC0+bGFzdHBrdF9kZWxheSA9IChUNCAtIFQxKSAtIChUMyAtIFQyKTsKKwlpZiAocC0+bGFzdHBrdF9kZWxheSA8IEdfcHJlY2lzaW9uX3NlYykKKwkJcC0+bGFzdHBrdF9kZWxheSA9IEdfcHJlY2lzaW9uX3NlYzsKKwlkYXRhcG9pbnQtPmRfZGlzcGVyc2lvbiA9IExPRzJEKG1zZy5tX3ByZWNpc2lvbl9leHApICsgR19wcmVjaXNpb25fc2VjOworCWlmICghcC0+cmVhY2hhYmxlX2JpdHMpIHsKKwkJLyogMXN0IGRhdGFwb2ludCBldmVyIC0gcmVwbGljYXRlIG9mZnNldCBpbiBldmVyeSBlbGVtZW50ICovCisJCWludCBpOworCQlmb3IgKGkgPSAxOyBpIDwgTlVNX0RBVEFQT0lOVFM7IGkrKykgeworCQkJcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX29mZnNldCA9IGRhdGFwb2ludC0+ZF9vZmZzZXQ7CisJCX0KKwl9CisKKwlwLT5yZWFjaGFibGVfYml0cyB8PSAxOworCWlmICgoTUFYX1ZFUkJPU0UgJiYgRy52ZXJib3NlKSB8fCAob3B0aW9uX21hc2szMiAmIE9QVF93KSkgeworCQliYl9lcnJvcl9tc2coInJlcGx5IGZyb20gJXM6IHJlYWNoIDB4JTAyeCBvZmZzZXQgJWYgZGVsYXkgJWYgc3RhdHVzIDB4JTAyeCBzdHJhdCAlZCByZWZpZCAweCUwOHggcm9vdGRlbGF5ICVmIiwKKwkJCXAtPnBfZG90dGVkLAorCQkJcC0+cmVhY2hhYmxlX2JpdHMsCisJCQlkYXRhcG9pbnQtPmRfb2Zmc2V0LAorCQkJcC0+bGFzdHBrdF9kZWxheSwKKwkJCXAtPmxhc3Rwa3Rfc3RhdHVzLAorCQkJcC0+bGFzdHBrdF9zdHJhdHVtLAorCQkJcC0+bGFzdHBrdF9yZWZpZCwKKwkJCXAtPmxhc3Rwa3Rfcm9vdGRlbGF5CisJCQkvKiBub3Qgc2hvd246IG1fcHBvbGwsIG1fcHJlY2lzaW9uX2V4cCwgbV9yb290ZGlzcCwKKwkJCSAqIG1fcmVmdGltZSwgbV9vcmd0aW1lLCBtX3JlY3RpbWUsIG1feG10dGltZQorCQkJICovCisJCSk7CisJfQorCisJLyogTXVjayB3aXRoIHN0YXRpY3RpY3MgYW5kIHVwZGF0ZSB0aGUgY2xvY2sgKi8KKwlmaWx0ZXJfZGF0YXBvaW50cyhwKTsKKwlxID0gc2VsZWN0X2FuZF9jbHVzdGVyKCk7CisJcmMgPSAtMTsKKwlpZiAocSkgeworCQlyYyA9IDA7CisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfdykpIHsKKwkJCXJjID0gdXBkYXRlX2xvY2FsX2Nsb2NrKHEpOworCQkJLyogSWYgZHJpZnQgaXMgZGFuZ2Vyb3VzbHkgbGFyZ2UsIGltbWVkaWF0ZWx5CisJCQkgKiBkcm9wIHBvbGwgaW50ZXJ2YWwgb25lIHN0ZXAgZG93bi4KKwkJCSAqLworCQkJaWYgKGZhYnMocS0+ZmlsdGVyX29mZnNldCkgPj0gUE9MTERPV05fT0ZGU0VUKSB7CisJCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJvZmZzZXQ6JWYgPiBQT0xMRE9XTl9PRkZTRVQiLCBxLT5maWx0ZXJfb2Zmc2V0KTsKKwkJCQlnb3RvIHBvbGxfZG93bjsKKwkJCX0KKwkJfQorCX0KKwkvKiBlbHNlOiBubyBwZWVyIHNlbGVjdGVkLCByYyA9IC0xOiB3ZSB3YW50IHRvIHBvbGwgbW9yZSBvZnRlbiAqLworCisJaWYgKHJjICE9IDApIHsKKwkJLyogQWRqdXN0IHRoZSBwb2xsIGludGVydmFsIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCBvZmZzZXQKKwkJICogd2l0aCB0aGUgY2xvY2sgaml0dGVyLiBJZiB0aGUgb2Zmc2V0IGlzIGxlc3MgdGhhbgorCQkgKiB0aGUgY2xvY2sgaml0dGVyIHRpbWVzIGEgY29uc3RhbnQsIHRoZW4gdGhlIGF2ZXJhZ2luZyBpbnRlcnZhbAorCQkgKiBpcyBpbmNyZWFzZWQsIG90aGVyd2lzZSBpdCBpcyBkZWNyZWFzZWQuIEEgYml0IG9mIGh5c3RlcmVzaXMKKwkJICogaGVscHMgY2FsbSB0aGUgZGFuY2UuIFdvcmtzIGJlc3QgdXNpbmcgYnVyc3QgbW9kZS4KKwkJICovCisJCVZFUkI0IGlmIChyYyA+IDApIHsKKwkJCWJiX2Vycm9yX21zZygib2Zmc2V0OiVmIFBPTExBREpfR0FURSpkaXNjaXBsaW5lX2ppdHRlcjolZiBwb2xsOiVzIiwKKwkJCQlxLT5maWx0ZXJfb2Zmc2V0LCBQT0xMQURKX0dBVEUgKiBHLmRpc2NpcGxpbmVfaml0dGVyLAorCQkJCWZhYnMocS0+ZmlsdGVyX29mZnNldCkgPCBQT0xMQURKX0dBVEUgKiBHLmRpc2NpcGxpbmVfaml0dGVyCisJCQkJCT8gImdyb3dzIiA6ICJmYWxscyIKKwkJCSk7CisJCX0KKwkJaWYgKHJjID4gMCAmJiBmYWJzKHEtPmZpbHRlcl9vZmZzZXQpIDwgUE9MTEFESl9HQVRFICogRy5kaXNjaXBsaW5lX2ppdHRlcikgeworCQkJLyogd2FzICs9IEcucG9sbF9leHAgYnV0IGl0IGlzIGEgYml0CisJCQkgKiB0b28gb3B0aW1pc3RpYyBmb3IgbXkgdGFzdGUgYXQgaGlnaCBwb2xsX2V4cCdzICovCisJCQlHLnBvbGxhZGpfY291bnQgKz0gTUlOUE9MTDsKKwkJCWlmIChHLnBvbGxhZGpfY291bnQgPiBQT0xMQURKX0xJTUlUKSB7CisJCQkJRy5wb2xsYWRqX2NvdW50ID0gMDsKKwkJCQlpZiAoRy5wb2xsX2V4cCA8IE1BWFBPTEwpIHsKKwkJCQkJRy5wb2xsX2V4cCsrOworCQkJCQlWRVJCMyBiYl9lcnJvcl9tc2coInBvbGxhZGo6IGRpc2NpcGxpbmVfaml0dGVyOiVmICsrcG9sbF9leHA9JWQiLAorCQkJCQkJCUcuZGlzY2lwbGluZV9qaXR0ZXIsIEcucG9sbF9leHApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJwb2xsYWRqOiBpbmNyOiVkIiwgRy5wb2xsYWRqX2NvdW50KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUcucG9sbGFkal9jb3VudCAtPSBHLnBvbGxfZXhwICogMjsKKwkJCWlmIChHLnBvbGxhZGpfY291bnQgPCAtUE9MTEFESl9MSU1JVCB8fCBHLnBvbGxfZXhwID49IEJJR1BPTEwpIHsKKyBwb2xsX2Rvd246CisJCQkJRy5wb2xsYWRqX2NvdW50ID0gMDsKKwkJCQlpZiAoRy5wb2xsX2V4cCA+IE1JTlBPTEwpIHsKKwkJCQkJbGxpc3RfdCAqaXRlbTsKKworCQkJCQlHLnBvbGxfZXhwLS07CisJCQkJCS8qIENvcnJlY3QgcC0+bmV4dF9hY3Rpb25fdGltZSBpbiBlYWNoIHBlZXIKKwkJCQkJICogd2hpY2ggd2FpdHMgZm9yIHNlbmRpbmcsIHNvIHRoYXQgdGhleSBzZW5kIGVhcmxpZXIuCisJCQkJCSAqIE9sZCBwcC0+bmV4dF9hY3Rpb25fdGltZSBhcmUgb24gdGhlIG9yZGVyCisJCQkJCSAqIG9mIHQgKyAoMSA8PCBvbGRfcG9sbF9leHApICsgc21hbGxfcmFuZG9tLAorCQkJCQkgKiB3ZSBzaW1wbHkgbmVlZCB0byBzdWJ0cmFjdCB+aGFsZiBvZiB0aGF0LgorCQkJCQkgKi8KKwkJCQkJZm9yIChpdGVtID0gRy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCQkJCXBlZXJfdCAqcHAgPSAocGVlcl90ICopIGl0ZW0tPmRhdGE7CisJCQkJCQlpZiAocHAtPnBfZmQgPCAwKQorCQkJCQkJCXBwLT5uZXh0X2FjdGlvbl90aW1lIC09ICgxIDw8IEcucG9sbF9leHApOworCQkJCQl9CisJCQkJCVZFUkIzIGJiX2Vycm9yX21zZygicG9sbGFkajogZGlzY2lwbGluZV9qaXR0ZXI6JWYgLS1wb2xsX2V4cD0lZCIsCisJCQkJCQkJRy5kaXNjaXBsaW5lX2ppdHRlciwgRy5wb2xsX2V4cCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlWRVJCMyBiYl9lcnJvcl9tc2coInBvbGxhZGo6IGRlY3I6JWQiLCBHLnBvbGxhZGpfY291bnQpOworCQkJfQorCQl9CisJfQorCisJLyogRGVjaWRlIHdoZW4gdG8gc2VuZCBuZXcgcXVlcnkgZm9yIHRoaXMgcGVlciAqLworCWludGVydmFsID0gcG9sbF9pbnRlcnZhbCgwKTsKKworIHNldF9uZXh0X2FuZF9jbG9zZV9zb2NrOgorCXNldF9uZXh0KHAsIGludGVydmFsKTsKKwkvKiBXZSBkbyBub3QgZXhwZWN0IGFueSBtb3JlIHBhY2tldHMgZnJvbSB0aGlzIHBlZXIgZm9yIG5vdy4KKwkgKiBDbG9zaW5nIHRoZSBzb2NrZXQgaW5mb3JtcyBrZXJuZWwgYWJvdXQgaXQuCisJICogV2Ugb3BlbiBhIG5ldyBzb2NrZXQgd2hlbiB3ZSBzZW5kIGEgbmV3IHF1ZXJ5LgorCSAqLworCWNsb3NlKHAtPnBfZmQpOworCXAtPnBfZmQgPSAtMTsKKyBiYWlsOgorCXJldHVybjsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCitzdGF0aWMgTk9JTkxJTkUgdm9pZAorcmVjdl9hbmRfcHJvY2Vzc19jbGllbnRfcGt0KHZvaWQgLyppbnQgZmQqLykKK3sKKwlzc2l6ZV90ICAgICAgICAgIHNpemU7CisJLy91aW50OF90ICAgICAgICAgIHZlcnNpb247CisJbGVuX2FuZF9zb2NrYWRkciAqdG87CisJc3RydWN0IHNvY2thZGRyICAqZnJvbTsKKwltc2dfdCAgICAgICAgICAgIG1zZzsKKwl1aW50OF90ICAgICAgICAgIHF1ZXJ5X3N0YXR1czsKKwlsX2ZpeGVkcHRfdCAgICAgIHF1ZXJ5X3htdHRpbWU7CisKKwl0byA9IGdldF9zb2NrX2xzYShHLmxpc3Rlbl9mZCk7CisJZnJvbSA9IHh6YWxsb2ModG8tPmxlbik7CisKKwlzaXplID0gcmVjdl9mcm9tX3RvKEcubGlzdGVuX2ZkLCAmbXNnLCBzaXplb2YobXNnKSwgTVNHX0RPTlRXQUlULCBmcm9tLCAmdG8tPnUuc2EsIHRvLT5sZW4pOworCWlmIChzaXplICE9IE5UUF9NU0dTSVpFX05PQVVUSCAmJiBzaXplICE9IE5UUF9NU0dTSVpFKSB7CisJCWNoYXIgKmFkZHI7CisJCWlmIChzaXplIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVBR0FJTikKKwkJCQlnb3RvIGJhaWw7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInJlY3YiKTsKKwkJfQorCQlhZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KGZyb20pOworCQliYl9lcnJvcl9tc2coIm1hbGZvcm1lZCBwYWNrZXQgcmVjZWl2ZWQgZnJvbSAlczogc2l6ZSAldSIsIGFkZHIsIChpbnQpc2l6ZSk7CisJCWZyZWUoYWRkcik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlxdWVyeV9zdGF0dXMgPSBtc2cubV9zdGF0dXM7CisJcXVlcnlfeG10dGltZSA9IG1zZy5tX3htdHRpbWU7CisKKwkvKiBCdWlsZCBhIHJlcGx5IHBhY2tldCAqLworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLm1fc3RhdHVzID0gRy5zdHJhdHVtIDwgTUFYU1RSQVQgPyBHLm50cF9zdGF0dXMgOiBMSV9BTEFSTTsKKwltc2cubV9zdGF0dXMgfD0gKHF1ZXJ5X3N0YXR1cyAmIFZFUlNJT05fTUFTSyk7CisJbXNnLm1fc3RhdHVzIHw9ICgocXVlcnlfc3RhdHVzICYgTU9ERV9NQVNLKSA9PSBNT0RFX0NMSUVOVCkgPworCQkJIE1PREVfU0VSVkVSIDogTU9ERV9TWU1fUEFTOworCW1zZy5tX3N0cmF0dW0gPSBHLnN0cmF0dW07CisJbXNnLm1fcHBvbGwgPSBHLnBvbGxfZXhwOworCW1zZy5tX3ByZWNpc2lvbl9leHAgPSBHX3ByZWNpc2lvbl9leHA7CisJLyogdGhpcyB0aW1lIHdhcyBvYnRhaW5lZCBiZXR3ZWVuIHBvbGwoKSBhbmQgcmVjdigpICovCisJbXNnLm1fcmVjdGltZSA9IGRfdG9fbGZwKEcuY3VyX3RpbWUpOworCW1zZy5tX3htdHRpbWUgPSBkX3RvX2xmcChnZXR0aW1lMTkwMGQoKSk7IC8qIHRoaXMgaW5zdGFudCAqLworCWlmIChHLnBlZXJfY250ID09IDApIHsKKwkJLyogd2UgaGF2ZSBubyBwZWVyczogInN0cmF0dW0gMSBzZXJ2ZXIiIG1vZGUuIHJlZnRpbWUgPSBvdXIgb3duIHRpbWUgKi8KKwkJRy5yZWZ0aW1lID0gRy5jdXJfdGltZTsKKwl9CisJbXNnLm1fcmVmdGltZSA9IGRfdG9fbGZwKEcucmVmdGltZSk7CisJbXNnLm1fb3JndGltZSA9IHF1ZXJ5X3htdHRpbWU7CisJbXNnLm1fcm9vdGRlbGF5ID0gZF90b19zZnAoRy5yb290ZGVsYXkpOworLy9zaW1wbGUgY29kZSBkb2VzIG5vdCBkbyB0aGlzLCBmaXggc2ltcGxlIGNvZGUhCisJbXNnLm1fcm9vdGRpc3AgPSBkX3RvX3NmcChHLnJvb3RkaXNwKTsKKwkvL3ZlcnNpb24gPSAocXVlcnlfc3RhdHVzICYgVkVSU0lPTl9NQVNLKTsgLyogLi4uID4+IFZFUlNJT05fU0hJRlQgLSBkb25lIGJlbG93IGluc3RlYWQgKi8KKwltc2cubV9yZWZpZCA9IEcucmVmaWQ7IC8vICh2ZXJzaW9uID4gKDMgPDwgVkVSU0lPTl9TSElGVCkpID8gRy5yZWZpZCA6IEcucmVmaWQzOworCisJLyogV2UgcmVwbHkgZnJvbSB0aGUgbG9jYWwgYWRkcmVzcyBwYWNrZXQgd2FzIHNlbnQgdG8sCisJICogdGhpcyBtYWtlcyB0by9mcm9tIGxvb2sgc3dhcHBlZCBoZXJlOiAqLworCWRvX3NlbmR0byhHLmxpc3Rlbl9mZCwKKwkJLypmcm9tOiovICZ0by0+dS5zYSwgLyp0bzoqLyBmcm9tLCAvKmFkZHJsZW46Ki8gdG8tPmxlbiwKKwkJJm1zZywgc2l6ZSk7CisKKyBiYWlsOgorCWZyZWUodG8pOworCWZyZWUoZnJvbSk7Cit9CisjZW5kaWYKKworLyogVXBzdHJlYW0gbnRwZCdzIG9wdGlvbnM6CisgKgorICogLTQgICBGb3JjZSBETlMgcmVzb2x1dGlvbiBvZiBob3N0IG5hbWVzIHRvIHRoZSBJUHY0IG5hbWVzcGFjZS4KKyAqIC02ICAgRm9yY2UgRE5TIHJlc29sdXRpb24gb2YgaG9zdCBuYW1lcyB0byB0aGUgSVB2NiBuYW1lc3BhY2UuCisgKiAtYSAgIFJlcXVpcmUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiBmb3IgYnJvYWRjYXN0IGNsaWVudCwKKyAqICAgICAgbXVsdGljYXN0IGNsaWVudCBhbmQgc3ltbWV0cmljIHBhc3NpdmUgYXNzb2NpYXRpb25zLgorICogICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICogLUEgICBEbyBub3QgcmVxdWlyZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIGZvciBicm9hZGNhc3QgY2xpZW50LAorICogICAgICBtdWx0aWNhc3QgY2xpZW50IGFuZCBzeW1tZXRyaWMgcGFzc2l2ZSBhc3NvY2lhdGlvbnMuCisgKiAgICAgIFRoaXMgaXMgYWxtb3N0IG5ldmVyIGEgZ29vZCBpZGVhLgorICogLWIgICBFbmFibGUgdGhlIGNsaWVudCB0byBzeW5jaHJvbml6ZSB0byBicm9hZGNhc3Qgc2VydmVycy4KKyAqIC1jIGNvbmZmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyAqICAgICAgZGVmYXVsdCAvZXRjL250cC5jb25mCisgKiAtZCAgIFNwZWNpZnkgZGVidWdnaW5nIG1vZGUuIFRoaXMgb3B0aW9uIG1heSBvY2N1ciBtb3JlIHRoYW4gb25jZSwKKyAqICAgICAgd2l0aCBlYWNoIG9jY3VycmVuY2UgaW5kaWNhdGluZyBncmVhdGVyIGRldGFpbCBvZiBkaXNwbGF5LgorICogLUQgbGV2ZWwKKyAqICAgICAgU3BlY2lmeSBkZWJ1Z2dpbmcgbGV2ZWwgZGlyZWN0bHkuCisgKiAtZiBkcmlmdGZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgZnJlcXVlbmN5IGZpbGUuCisgKiAgICAgIFRoaXMgaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIHRoZSAiZHJpZnRmaWxlIEZJTEUiCisgKiAgICAgIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC1nICAgTm9ybWFsbHksIG50cGQgZXhpdHMgd2l0aCBhIG1lc3NhZ2UgdG8gdGhlIHN5c3RlbSBsb2cKKyAqICAgICAgaWYgdGhlIG9mZnNldCBleGNlZWRzIHRoZSBwYW5pYyB0aHJlc2hvbGQsIHdoaWNoIGlzIDEwMDAgcworICogICAgICBieSBkZWZhdWx0LiBUaGlzIG9wdGlvbiBhbGxvd3MgdGhlIHRpbWUgdG8gYmUgc2V0IHRvIGFueSB2YWx1ZQorICogICAgICB3aXRob3V0IHJlc3RyaWN0aW9uOyBob3dldmVyLCB0aGlzIGNhbiBoYXBwZW4gb25seSBvbmNlLgorICogICAgICBJZiB0aGUgdGhyZXNob2xkIGlzIGV4Y2VlZGVkIGFmdGVyIHRoYXQsIG50cGQgd2lsbCBleGl0CisgKiAgICAgIHdpdGggYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZAorICogICAgICB3aXRoIHRoZSAtcSBhbmQgLXggb3B0aW9ucy4gU2VlIHRoZSB0aW5rZXIgY29tbWFuZCBmb3Igb3RoZXIgb3B0aW9ucy4KKyAqIC1pIGphaWxkaXIKKyAqICAgICAgQ2hyb290IHRoZSBzZXJ2ZXIgdG8gdGhlIGRpcmVjdG9yeSBqYWlsZGlyLiBUaGlzIG9wdGlvbiBhbHNvIGltcGxpZXMKKyAqICAgICAgdGhhdCB0aGUgc2VydmVyIGF0dGVtcHRzIHRvIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGF0IHN0YXJ0dXAKKyAqICAgICAgKG90aGVyd2lzZSwgY2hyb290IGdpdmVzIHZlcnkgbGl0dGxlIGFkZGl0aW9uYWwgc2VjdXJpdHkpLgorICogICAgICBZb3UgbWF5IG5lZWQgdG8gYWxzbyBzcGVjaWZ5IGEgLXUgb3B0aW9uLgorICogLWsga2V5ZmlsZQorICogICAgICBTcGVjaWZ5IHRoZSBuYW1lIGFuZCBwYXRoIG9mIHRoZSBzeW1tZXRyaWMga2V5IGZpbGUsCisgKiAgICAgIGRlZmF1bHQgL2V0Yy9udHAva2V5cy4gVGhpcyBpcyB0aGUgc2FtZSBvcGVyYXRpb24KKyAqICAgICAgYXMgdGhlICJrZXlzIEZJTEUiIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC1sIGxvZ2ZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgbG9nIGZpbGUuIFRoZSBkZWZhdWx0CisgKiAgICAgIGlzIHRoZSBzeXN0ZW0gbG9nIGZpbGUuIFRoaXMgaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzCisgKiAgICAgIHRoZSAibG9nZmlsZSBGSUxFIiBjb25maWd1cmF0aW9uIGNvbW1hbmQuCisgKiAtTCAgIERvIG5vdCBsaXN0ZW4gdG8gdmlydHVhbCBJUHMuIFRoZSBkZWZhdWx0IGlzIHRvIGxpc3Rlbi4KKyAqIC1uICAgRG9uJ3QgZm9yay4KKyAqIC1OICAgVG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sCisgKiAgICAgIHJ1biB0aGUgbnRwZCBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eS4KKyAqIC1wIHBpZGZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgZmlsZSB1c2VkIHRvIHJlY29yZCB0aGUgbnRwZAorICogICAgICBwcm9jZXNzIElELiBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgInBpZGZpbGUgRklMRSIKKyAqICAgICAgY29uZmlndXJhdGlvbiBjb21tYW5kLgorICogLVAgcHJpb3JpdHkKKyAqICAgICAgVG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sCisgKiAgICAgIHJ1biB0aGUgbnRwZCBhdCB0aGUgc3BlY2lmaWVkIHByaW9yaXR5LgorICogLXEgICBFeGl0IHRoZSBudHBkIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhlIGNsb2NrIGlzIHNldC4KKyAqICAgICAgVGhpcyBiZWhhdmlvciBtaW1pY3MgdGhhdCBvZiB0aGUgbnRwZGF0ZSBwcm9ncmFtLCB3aGljaCBpcworICogICAgICB0byBiZSByZXRpcmVkLiBUaGUgLWcgYW5kIC14IG9wdGlvbnMgY2FuIGJlIHVzZWQgd2l0aCB0aGlzIG9wdGlvbi4KKyAqICAgICAgTm90ZTogVGhlIGtlcm5lbCB0aW1lIGRpc2NpcGxpbmUgaXMgZGlzYWJsZWQgd2l0aCB0aGlzIG9wdGlvbi4KKyAqIC1yIGJyb2FkY2FzdGRlbGF5CisgKiAgICAgIFNwZWNpZnkgdGhlIGRlZmF1bHQgcHJvcGFnYXRpb24gZGVsYXkgZnJvbSB0aGUgYnJvYWRjYXN0L211bHRpY2FzdAorICogICAgICBzZXJ2ZXIgdG8gdGhpcyBjbGllbnQuIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgaWYgdGhlIGRlbGF5CisgKiAgICAgIGNhbm5vdCBiZSBjb21wdXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwcm90b2NvbC4KKyAqIC1zIHN0YXRzZGlyCisgKiAgICAgIFNwZWNpZnkgdGhlIGRpcmVjdG9yeSBwYXRoIGZvciBmaWxlcyBjcmVhdGVkIGJ5IHRoZSBzdGF0aXN0aWNzCisgKiAgICAgIGZhY2lsaXR5LiBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgInN0YXRzZGlyIERJUiIKKyAqICAgICAgY29uZmlndXJhdGlvbiBjb21tYW5kLgorICogLXQga2V5CisgKiAgICAgIEFkZCBhIGtleSBudW1iZXIgdG8gdGhlIHRydXN0ZWQga2V5IGxpc3QuIFRoaXMgb3B0aW9uIGNhbiBvY2N1cgorICogICAgICBtb3JlIHRoYW4gb25jZS4KKyAqIC11IHVzZXJbOmdyb3VwXQorICogICAgICBTcGVjaWZ5IGEgdXNlciwgYW5kIG9wdGlvbmFsbHkgYSBncm91cCwgdG8gc3dpdGNoIHRvLgorICogLXYgdmFyaWFibGUKKyAqIC1WIHZhcmlhYmxlCisgKiAgICAgIEFkZCBhIHN5c3RlbSB2YXJpYWJsZSBsaXN0ZWQgYnkgZGVmYXVsdC4KKyAqIC14ICAgTm9ybWFsbHksIHRoZSB0aW1lIGlzIHNsZXdlZCBpZiB0aGUgb2Zmc2V0IGlzIGxlc3MgdGhhbiB0aGUgc3RlcAorICogICAgICB0aHJlc2hvbGQsIHdoaWNoIGlzIDEyOCBtcyBieSBkZWZhdWx0LCBhbmQgc3RlcHBlZCBpZiBhYm92ZQorICogICAgICB0aGUgdGhyZXNob2xkLiBUaGlzIG9wdGlvbiBzZXRzIHRoZSB0aHJlc2hvbGQgdG8gNjAwIHMsIHdoaWNoIGlzCisgKiAgICAgIHdlbGwgd2l0aGluIHRoZSBhY2N1cmFjeSB3aW5kb3cgdG8gc2V0IHRoZSBjbG9jayBtYW51YWxseS4KKyAqICAgICAgTm90ZTogc2luY2UgdGhlIHNsZXcgcmF0ZSBvZiB0eXBpY2FsIFVuaXgga2VybmVscyBpcyBsaW1pdGVkCisgKiAgICAgIHRvIDAuNSBtcy9zLCBlYWNoIHNlY29uZCBvZiBhZGp1c3RtZW50IHJlcXVpcmVzIGFuIGFtb3J0aXphdGlvbgorICogICAgICBpbnRlcnZhbCBvZiAyMDAwIHMuIFRodXMsIGFuIGFkanVzdG1lbnQgYXMgbXVjaCBhcyA2MDAgcworICogICAgICB3aWxsIHRha2UgYWxtb3N0IDE0IGRheXMgdG8gY29tcGxldGUuIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkCisgKiAgICAgIHdpdGggdGhlIC1nIGFuZCAtcSBvcHRpb25zLiBTZWUgdGhlIHRpbmtlciBjb21tYW5kIGZvciBvdGhlciBvcHRpb25zLgorICogICAgICBOb3RlOiBUaGUga2VybmVsIHRpbWUgZGlzY2lwbGluZSBpcyBkaXNhYmxlZCB3aXRoIHRoaXMgb3B0aW9uLgorICovCisKKy8qIEJ5IGRvaW5nIGluaXQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3ZSBkZWNyZWFzZSBzdGFjayB1c2FnZQorICogaW4gbWFpbiBsb29wLgorICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBudHBfaW5pdChjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWxsaXN0X3QgKnBlZXJzOworCisJc3JhbmRvbShnZXRwaWQoKSk7CisKKwlpZiAoZ2V0dWlkKCkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKworCS8qIFNldCBzb21lIGdsb2JhbHMgKi8KKwlHLnN0cmF0dW0gPSBNQVhTVFJBVDsKKwlpZiAoQlVSU1RQT0xMICE9IDApCisJCUcucG9sbF9leHAgPSBCVVJTVFBPTEw7IC8qIHNwZWVkcyB1cCBpbml0aWFsIHN5bmMgKi8KKwlHLmxhc3Rfc2NyaXB0X3J1biA9IEcucmVmdGltZSA9IEcubGFzdF91cGRhdGVfcmVjdl90aW1lID0gZ2V0dGltZTE5MDBkKCk7IC8qIHNldHMgRy5jdXJfdGltZSB0b28gKi8KKworCS8qIFBhcnNlIG9wdGlvbnMgKi8KKwlwZWVycyA9IE5VTEw7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZGQ6cDo6d24iOyAvKiBkOiBjb3VudGVyOyBwOiBsaXN0OyAtdyBpbXBsaWVzIC1uICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsCisJCQkibnFOeCIgLyogY29tcGF0ICovCisJCQkid3A6UzoiSUZfRkVBVFVSRV9OVFBEX1NFUlZFUigibCIpIC8qIE5PVCBjb21wYXQgKi8KKwkJCSJkIiAvKiBjb21wYXQgKi8KKwkJCSI0NmFBYmdMIiwgLyogY29tcGF0LCBpZ25vcmVkICovCisJCQkmcGVlcnMsICZHLnNjcmlwdF9uYW1lLCAmRy52ZXJib3NlKTsKKwlpZiAoIShvcHRzICYgKE9QVF9wfE9QVF9sKSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKy8vCWlmIChvcHRzICYgT1BUX3gpIC8qIGRpc2FibGUgc3RlcHBpbmcsIG9ubHkgc2xldyBpcyBhbGxvd2VkICovCisvLwkJRy50aW1lX3dhc19zdGVwcGVkID0gMTsKKwlpZiAocGVlcnMpIHsKKwkJd2hpbGUgKHBlZXJzKQorCQkJYWRkX3BlZXJzKGxsaXN0X3BvcCgmcGVlcnMpKTsKKwl9IGVsc2UgeworCQkvKiAtbCBidXQgbm8gcGVlcnM6ICJzdHJhdHVtIDEgc2VydmVyIiBtb2RlICovCisJCUcuc3RyYXR1bSA9IDE7CisJfQorCWlmICghKG9wdHMgJiBPUFRfbikpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9ERVZOVUxMX1NURElPLCBhcmd2KTsKKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIKKwlHLmxpc3Rlbl9mZCA9IC0xOworCWlmIChvcHRzICYgT1BUX2wpIHsKKwkJRy5saXN0ZW5fZmQgPSBjcmVhdGVfYW5kX2JpbmRfZGdyYW1fb3JfZGllKE5VTEwsIDEyMyk7CisJCXNvY2tldF93YW50X3BrdGluZm8oRy5saXN0ZW5fZmQpOworCQlzZXRzb2Nrb3B0KEcubGlzdGVuX2ZkLCBJUFBST1RPX0lQLCBJUF9UT1MsICZjb25zdF9JUFRPU19MT1dERUxBWSwgc2l6ZW9mKGNvbnN0X0lQVE9TX0xPV0RFTEFZKSk7CisJfQorI2VuZGlmCisJLyogSSBoZXNpdGF0ZSB0byBzZXQgLTIwIHByaW8uIC0xNSBzaG91bGQgYmUgaGlnaCBlbm91Z2ggZm9yIHRpbWVrZWVwaW5nICovCisJaWYgKG9wdHMgJiBPUFRfTikKKwkJc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCAtMTUpOworCisJLyogSWYgbmV0d29yayBpcyB1cCwgc3luY3Jvbml6YXRpb24gb2NjdXJzIGluIH4xMCBzZWNvbmRzLgorCSAqIFdlIGdpdmUgIm50cGQgLXEiIDEwIHNlY29uZHMgdG8gZ2V0IGZpcnN0IHJlcGx5LAorCSAqIHRoZW4gYW5vdGhlciA1MCBzZWNvbmRzIHRvIGZpbmlzaCBzeW5jaW5nLgorCSAqCisJICogSSB0ZXN0ZWQgbnRwZCA0LjIuNnAxIGFuZCBhcHBhcmVudGx5IGl0IG5ldmVyIGV4aXRzCisJICogKHdpbGwgdHJ5IGZvcmV2ZXIpLCBidXQgaXQgZG9lcyBub3QgZmVlbCByaWdodC4KKwkgKiBUaGUgZ29hbCBvZiAtcSBpcyB0byBhY3QgbGlrZSBudHBkYXRlOiBzZXQgdGltZQorCSAqIGFmdGVyIGEgcmVhc29uYWJseSBzbWFsbCBwZXJpb2Qgb2YgcG9sbGluZywgb3IgZmFpbC4KKwkgKi8KKwlpZiAob3B0cyAmIE9QVF9xKSB7CisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX3FxOworCQlhbGFybSgxMCk7CisJfQorCisJYmJfc2lnbmFscygwCisJCXwgKDEgPDwgU0lHVEVSTSkKKwkJfCAoMSA8PCBTSUdJTlQpCisJCXwgKDEgPDwgU0lHQUxSTSkKKwkJLCByZWNvcmRfc2lnbm8KKwkpOworCWJiX3NpZ25hbHMoMAorCQl8ICgxIDw8IFNJR1BJUEUpCisJCXwgKDEgPDwgU0lHQ0hMRCkKKwkJLCBTSUdfSUdOCisJKTsKK30KKworaW50IG50cGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBudHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKyN1bmRlZiBHCisJc3RydWN0IGdsb2JhbHMgRzsKKwlzdHJ1Y3QgcG9sbGZkICpwZmQ7CisJcGVlcl90ICoqaWR4MnBlZXI7CisJdW5zaWduZWQgY250OworCisJbWVtc2V0KCZHLCAwLCBzaXplb2YoRykpOworCVNFVF9QVFJfVE9fR0xPQkFMUygmRyk7CisKKwludHBfaW5pdChhcmd2KTsKKworCS8qIElmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSLCArIDEgZm9yIGxpc3Rlbl9mZDogKi8KKwljbnQgPSBHLnBlZXJfY250ICsgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVI7CisJaWR4MnBlZXIgPSB4emFsbG9jKHNpemVvZihpZHgycGVlclswXSkgKiBjbnQpOworCXBmZCA9IHh6YWxsb2Moc2l6ZW9mKHBmZFswXSkgKiBjbnQpOworCisJLyogQ291bnRkb3duOiB3ZSBuZXZlciBzeW5jIGJlZm9yZSB3ZSBzZW50IElOSVRJQUxfU0FNUExFUysxCisJICogcGFja2V0cyB0byBlYWNoIHBlZXIuCisJICogTkI6IGlmIHNvbWUgcGVlciBpcyBub3QgcmVzcG9uZGluZywgd2UgbWF5IGVuZCB1cCBzZW5kaW5nCisJICogZmV3ZXIgcGFja2V0cyB0byBpdCBhbmQgbW9yZSB0byBvdGhlciBwZWVycy4KKwkgKiBOQjI6IHN5bmMgdXN1YWxseSBoYXBwZW5zIHVzaW5nIElOSVRJQUxfU0FNUExFUyBwYWNrZXRzLAorCSAqIHNpbmNlIGxhc3QgcmVwbHkgZG9lcyBub3QgY29tZSBiYWNrIGluc3RhbnRhbmVvdXNseS4KKwkgKi8KKwljbnQgPSBHLnBlZXJfY250ICogKElOSVRJQUxfU0FNUExFUyArIDEpOworCisJd2hpbGUgKCFiYl9nb3Rfc2lnbmFsKSB7CisJCWxsaXN0X3QgKml0ZW07CisJCXVuc2lnbmVkIGksIGo7CisJCWludCBuZmRzLCB0aW1lb3V0OworCQlkb3VibGUgbmV4dGFjdGlvbjsKKworCQkvKiBOb3RoaW5nIGJldHdlZW4gaGVyZSBhbmQgcG9sbCgpIGJsb2NrcyBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUgKi8KKworCQluZXh0YWN0aW9uID0gRy5jdXJfdGltZSArIDM2MDA7CisKKwkJaSA9IDA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIKKwkJaWYgKEcubGlzdGVuX2ZkICE9IC0xKSB7CisJCQlwZmRbMF0uZmQgPSBHLmxpc3Rlbl9mZDsKKwkJCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJCQlpKys7CisJCX0KKyNlbmRpZgorCQkvKiBQYXNzIG92ZXIgcGVlciBsaXN0LCBzZW5kIHJlcXVlc3RzLCB0aW1lIG91dCBvbiByZWNlaXZlcyAqLworCQlmb3IgKGl0ZW0gPSBHLm50cF9wZWVyczsgaXRlbSAhPSBOVUxMOyBpdGVtID0gaXRlbS0+bGluaykgeworCQkJcGVlcl90ICpwID0gKHBlZXJfdCAqKSBpdGVtLT5kYXRhOworCisJCQlpZiAocC0+bmV4dF9hY3Rpb25fdGltZSA8PSBHLmN1cl90aW1lKSB7CisJCQkJaWYgKHAtPnBfZmQgPT0gLTEpIHsKKwkJCQkJLyogVGltZSB0byBzZW5kIG5ldyByZXEgKi8KKwkJCQkJaWYgKC0tY250ID09IDApIHsKKwkJCQkJCUcuaW5pdGlhbF9wb2xsX2NvbXBsZXRlID0gMTsKKwkJCQkJfQorCQkJCQlzZW5kX3F1ZXJ5X3RvX3BlZXIocCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlcGx5ICovCisJCQkJCWNsb3NlKHAtPnBfZmQpOworCQkJCQlwLT5wX2ZkID0gLTE7CisJCQkJCXRpbWVvdXQgPSBwb2xsX2ludGVydmFsKC0yKTsgLyogLTI6IHRyeSBhIGJpdCBzb29uZXIgKi8KKwkJCQkJYmJfZXJyb3JfbXNnKCJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgJXMsIHJlYWNoIDB4JTAyeCwgbmV4dCBxdWVyeSBpbiAldXMiLAorCQkJCQkJCXAtPnBfZG90dGVkLCBwLT5yZWFjaGFibGVfYml0cywgdGltZW91dCk7CisJCQkJCXNldF9uZXh0KHAsIHRpbWVvdXQpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHAtPm5leHRfYWN0aW9uX3RpbWUgPCBuZXh0YWN0aW9uKQorCQkJCW5leHRhY3Rpb24gPSBwLT5uZXh0X2FjdGlvbl90aW1lOworCisJCQlpZiAocC0+cF9mZCA+PSAwKSB7CisJCQkJLyogV2FpdCBmb3IgcmVwbHkgZnJvbSB0aGlzIHBlZXIgKi8KKwkJCQlwZmRbaV0uZmQgPSBwLT5wX2ZkOworCQkJCXBmZFtpXS5ldmVudHMgPSBQT0xMSU47CisJCQkJaWR4MnBlZXJbaV0gPSBwOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCisJCXRpbWVvdXQgPSBuZXh0YWN0aW9uIC0gRy5jdXJfdGltZTsKKwkJaWYgKHRpbWVvdXQgPCAwKQorCQkJdGltZW91dCA9IDA7CisJCXRpbWVvdXQrKzsgLyogKG5leHRhY3Rpb24gLSBHLmN1cl90aW1lKSByb3VuZHMgZG93biwgY29tcGVuc2F0aW5nICovCisKKwkJLyogSGVyZSB3ZSBtYXkgYmxvY2sgKi8KKwkJVkVSQjIgYmJfZXJyb3JfbXNnKCJwb2xsICV1cywgc29ja2V0czoldSwgcG9sbCBpbnRlcnZhbDoldXMiLCB0aW1lb3V0LCBpLCAxIDw8IEcucG9sbF9leHApOworCQluZmRzID0gcG9sbChwZmQsIGksIHRpbWVvdXQgKiAxMDAwKTsKKwkJZ2V0dGltZTE5MDBkKCk7IC8qIHNldHMgRy5jdXJfdGltZSAqLworCQlpZiAobmZkcyA8PSAwKSB7CisJCQlpZiAoRy5zY3JpcHRfbmFtZSAmJiBHLmN1cl90aW1lIC0gRy5sYXN0X3NjcmlwdF9ydW4gPiAxMSo2MCkgeworCQkJCS8qIFVzZWZ1bCBmb3IgdXBkYXRpbmcgYmF0dGVyeS1iYWNrZWQgUlRDIGFuZCBzdWNoICovCisJCQkJcnVuX3NjcmlwdCgicGVyaW9kaWMiLCBHLmxhc3RfdXBkYXRlX29mZnNldCk7CisJCQkJZ2V0dGltZTE5MDBkKCk7IC8qIHNldHMgRy5jdXJfdGltZSAqLworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBQcm9jZXNzIGFueSByZWNlaXZlZCBwYWNrZXRzICovCisJCWogPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCisJCWlmIChHLmxpc3Rlbl9mZCAhPSAtMSkgeworCQkJaWYgKHBmZFswXS5yZXZlbnRzIC8qICYgKFBPTExJTnxQT0xMRVJSKSovKSB7CisJCQkJbmZkcy0tOworCQkJCXJlY3ZfYW5kX3Byb2Nlc3NfY2xpZW50X3BrdCgvKkcubGlzdGVuX2ZkKi8pOworCQkJCWdldHRpbWUxOTAwZCgpOyAvKiBzZXRzIEcuY3VyX3RpbWUgKi8KKwkJCX0KKwkJCWogPSAxOworCQl9CisjZW5kaWYKKwkJZm9yICg7IG5mZHMgIT0gMCAmJiBqIDwgaTsgaisrKSB7CisJCQlpZiAocGZkW2pdLnJldmVudHMgLyogJiAoUE9MTElOfFBPTExFUlIpKi8pIHsKKwkJCQkvKgorCQkJCSAqIEF0IGluaXQsIGFsYXJtIHdhcyBzZXQgdG8gMTAgc2VjLgorCQkJCSAqIE5vdyB3ZSBkaWQgZ2V0IGEgcmVwbHkuCisJCQkJICogSW5jcmVhc2UgdGltZW91dCB0byA1MCBzZWNvbmRzIHRvIGZpbmlzaCBzeW5jaW5nLgorCQkJCSAqLworCQkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3FxKSB7CisJCQkJCW9wdGlvbl9tYXNrMzIgJj0gfk9QVF9xcTsKKwkJCQkJYWxhcm0oNTApOworCQkJCX0KKwkJCQluZmRzLS07CisJCQkJcmVjdl9hbmRfcHJvY2Vzc19wZWVyX3BrdChpZHgycGVlcltqXSk7CisJCQkJZ2V0dGltZTE5MDBkKCk7IC8qIHNldHMgRy5jdXJfdGltZSAqLworCQkJfQorCQl9CisJfSAvKiB3aGlsZSAoIWJiX2dvdF9zaWduYWwpICovCisKKwlraWxsX215c2VsZl93aXRoX3NpZyhiYl9nb3Rfc2lnbmFsKTsKK30KKworCisKKworCisKKy8qKiogb3Blbm50cGQtNC42IHVzZXMgb25seSBhZGp0aW1lLCBub3QgYWRqdGltZXggKioqLworCisvKioqIG50cC00LjIuNi9udHBkL250cF9sb29wZmlsdGVyLmMgLSBhZGp0aW1leCB1c2FnZSAqKiovCisKKyNpZiAwCitzdGF0aWMgZG91YmxlCitkaXJlY3RfZnJlcShkb3VibGUgZnBfb2Zmc2V0KQoreworI2lmZGVmIEtFUk5FTF9QTEwKKwkvKgorCSAqIElmIHRoZSBrZXJuZWwgaXMgZW5hYmxlZCwgd2UgbmVlZCB0aGUgcmVzaWR1YWwgb2Zmc2V0IHRvCisJICogY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgY29ycmVjdGlvbi4KKwkgKi8KKwlpZiAocGxsX2NvbnRyb2wgJiYga2Vybl9lbmFibGUpIHsKKwkJbWVtc2V0KCZudHYsIDAsIHNpemVvZihudHYpKTsKKwkJbnRwX2FkanRpbWUoJm50dik7CisjaWZkZWYgU1RBX05BTk8KKwkJY2xvY2tfb2Zmc2V0ID0gbnR2Lm9mZnNldCAvIDFlOTsKKyNlbHNlIC8qIFNUQV9OQU5PICovCisJCWNsb2NrX29mZnNldCA9IG50di5vZmZzZXQgLyAxZTY7CisjZW5kaWYgLyogU1RBX05BTk8gKi8KKwkJZHJpZnRfY29tcCA9IEZSRVFUT0QobnR2LmZyZXEpOworCX0KKyNlbmRpZiAvKiBLRVJORUxfUExMICovCisJc2V0X2ZyZXEoKGZwX29mZnNldCAtIGNsb2NrX29mZnNldCkgLyAoY3VycmVudF90aW1lIC0gY2xvY2tfZXBvY2gpICsgZHJpZnRfY29tcCk7CisJd2FuZGVyX3Jlc2lkID0gMDsKKwlyZXR1cm4gZHJpZnRfY29tcDsKK30KKworc3RhdGljIHZvaWQKK3NldF9mcmVxKGRvdWJsZSBmcmVxKSAvKiBmcmVxdWVuY3kgdXBkYXRlICovCit7CisJY2hhciB0YnVmWzgwXTsKKworCWRyaWZ0X2NvbXAgPSBmcmVxOworCisjaWZkZWYgS0VSTkVMX1BMTAorCS8qCisJICogSWYgdGhlIGtlcm5lbCBpcyBlbmFibGVkLCB1cGRhdGUgdGhlIGtlcm5lbCBmcmVxdWVuY3kuCisJICovCisJaWYgKHBsbF9jb250cm9sICYmIGtlcm5fZW5hYmxlKSB7CisJCW1lbXNldCgmbnR2LCAwLCBzaXplb2YobnR2KSk7CisJCW50di5tb2RlcyA9IE1PRF9GUkVRVUVOQ1k7CisJCW50di5mcmVxID0gRFRPRlJFUShkcmlmdF9jb21wKTsKKwkJbnRwX2FkanRpbWUoJm50dik7CisJCXNucHJpbnRmKHRidWYsIHNpemVvZih0YnVmKSwgImtlcm5lbCAlLjNmIFBQTSIsIGRyaWZ0X2NvbXAgKiAxZTYpOworCQlyZXBvcnRfZXZlbnQoRVZOVF9GU0VULCBOVUxMLCB0YnVmKTsKKwl9IGVsc2UgeworCQlzbnByaW50Zih0YnVmLCBzaXplb2YodGJ1ZiksICJudHBkICUuM2YgUFBNIiwgZHJpZnRfY29tcCAqIDFlNik7CisJCXJlcG9ydF9ldmVudChFVk5UX0ZTRVQsIE5VTEwsIHRidWYpOworCX0KKyNlbHNlIC8qIEtFUk5FTF9QTEwgKi8KKwlzbnByaW50Zih0YnVmLCBzaXplb2YodGJ1ZiksICJudHBkICUuM2YgUFBNIiwgZHJpZnRfY29tcCAqIDFlNik7CisJcmVwb3J0X2V2ZW50KEVWTlRfRlNFVCwgTlVMTCwgdGJ1Zik7CisjZW5kaWYgLyogS0VSTkVMX1BMTCAqLworfQorCisuLi4KKy4uLgorLi4uCisKKyNpZmRlZiBLRVJORUxfUExMCisJLyoKKwkgKiBUaGlzIGNvZGUgc2VnbWVudCB3b3JrcyB3aGVuIGNsb2NrIGFkanVzdG1lbnRzIGFyZSBtYWRlIHVzaW5nCisJICogcHJlY2lzaW9uIHRpbWUga2VybmVsIHN1cHBvcnQgYW5kIHRoZSBudHBfYWRqdGltZSgpIHN5c3RlbQorCSAqIGNhbGwuIFRoaXMgc3VwcG9ydCBpcyBhdmFpbGFibGUgaW4gU29sYXJpcyAyLjYgYW5kIGxhdGVyLAorCSAqIERpZ2l0YWwgVW5peCA0LjAgYW5kIGxhdGVyLCBGcmVlQlNELCBMaW51eCBhbmQgc3BlY2lhbGx5CisJICogbW9kaWZpZWQga2VybmVscyBmb3IgSFAtVVggOSBhbmQgVWx0cml4IDQuIEluIHRoZSBjYXNlIG9mIHRoZQorCSAqIERFQ3N0YXRpb24gNTAwMC8yNDAgYW5kIEFscGhhIEFYUCwgYWRkaXRpb25hbCBrZXJuZWwKKwkgKiBtb2RpZmljYXRpb25zIHByb3ZpZGUgYSB0cnVlIG1pY3Jvc2Vjb25kIGNsb2NrIGFuZCBuYW5vc2Vjb25kCisJICogY2xvY2ssIHJlc3BlY3RpdmVseS4KKwkgKgorCSAqIEltcG9ydGFudCBub3RlOiBUaGUga2VybmVsIGRpc2NpcGxpbmUgaXMgdXNlZCBvbmx5IGlmIHRoZQorCSAqIHN0ZXAgdGhyZXNob2xkIGlzIGxlc3MgdGhhbiAwLjUgcywgYXMgYW55dGhpbmcgaGlnaGVyIGNhbgorCSAqIGxlYWQgdG8gb3ZlcmZsb3cgcHJvYmxlbXMuIFRoaXMgbWlnaHQgb2NjdXIgaWYgc29tZSBtaXNndWlkZWQKKwkgKiBsYWQgc2V0IHRoZSBzdGVwIHRocmVzaG9sZCB0byBzb21ldGhpbmcgcmlkaWN1bG91cy4KKwkgKi8KKwlpZiAocGxsX2NvbnRyb2wgJiYga2Vybl9lbmFibGUpIHsKKworI2RlZmluZSBNT0RfQklUUyAoTU9EX09GRlNFVCB8IE1PRF9NQVhFUlJPUiB8IE1PRF9FU1RFUlJPUiB8IE1PRF9TVEFUVVMgfCBNT0RfVElNRUNPTlNUKQorCisJCS8qCisJCSAqIFdlIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSBmb3IgdGhlIG50cF9hZGp0aW1lKCkKKwkJICogc3lzdGVtIGNhbGwuIFdlIGhhdmUgdG8gY29udmVydCBldmVyeXRoaW5nIHRvCisJCSAqIG1pY3Jvc2Vjb25kcyBvciBuYW5vc2Vjb25kcyBmaXJzdC4gRG8gbm90IHVwZGF0ZSB0aGUKKwkJICogc3lzdGVtIHZhcmlhYmxlcyBpZiB0aGUgZXh0X2VuYWJsZSBmbGFnIGlzIHNldC4gSW4KKwkJICogdGhpcyBjYXNlLCB0aGUgZXh0ZXJuYWwgY2xvY2sgZHJpdmVyIHdpbGwgdXBkYXRlIHRoZQorCQkgKiB2YXJpYWJsZXMsIHdoaWNoIHdpbGwgYmUgcmVhZCBsYXRlciBieSB0aGUgbG9jYWwKKwkJICogY2xvY2sgZHJpdmVyLiBBZnRlcndhcmRzLCByZW1lbWJlciB0aGUgdGltZSBhbmQKKwkJICogZnJlcXVlbmN5IG9mZnNldHMgZm9yIGppdHRlciBhbmQgc3RhYmlsaXR5IHZhbHVlcyBhbmQKKwkJICogdG8gdXBkYXRlIHRoZSBmcmVxdWVuY3kgZmlsZS4KKwkJICovCisJCW1lbXNldCgmbnR2LCAgMCwgc2l6ZW9mKG50dikpOworCQlpZiAoZXh0X2VuYWJsZSkgeworCQkJbnR2Lm1vZGVzID0gTU9EX1NUQVRVUzsKKwkJfSBlbHNlIHsKKyNpZmRlZiBTVEFfTkFOTworCQkJbnR2Lm1vZGVzID0gTU9EX0JJVFMgfCBNT0RfTkFOTzsKKyNlbHNlIC8qIFNUQV9OQU5PICovCisJCQludHYubW9kZXMgPSBNT0RfQklUUzsKKyNlbmRpZiAvKiBTVEFfTkFOTyAqLworCQkJaWYgKGNsb2NrX29mZnNldCA8IDApCisJCQkJZHRlbXAgPSAtLjU7CisJCQllbHNlCisJCQkJZHRlbXAgPSAuNTsKKyNpZmRlZiBTVEFfTkFOTworCQkJbnR2Lm9mZnNldCA9IChpbnQzMikoY2xvY2tfb2Zmc2V0ICogMWU5ICsgZHRlbXApOworCQkJbnR2LmNvbnN0YW50ID0gc3lzX3BvbGw7CisjZWxzZSAvKiBTVEFfTkFOTyAqLworCQkJbnR2Lm9mZnNldCA9IChpbnQzMikoY2xvY2tfb2Zmc2V0ICogMWU2ICsgZHRlbXApOworCQkJbnR2LmNvbnN0YW50ID0gc3lzX3BvbGwgLSA0OworI2VuZGlmIC8qIFNUQV9OQU5PICovCisJCQludHYuZXN0ZXJyb3IgPSAodV9pbnQzMikoY2xvY2tfaml0dGVyICogMWU2KTsKKwkJCW50di5tYXhlcnJvciA9ICh1X2ludDMyKSgoc3lzX3Jvb3RkZWxheSAvIDIgKyBzeXNfcm9vdGRpc3ApICogMWU2KTsKKwkJCW50di5zdGF0dXMgPSBTVEFfUExMOworCisJCQkvKgorCQkJICogRW5hYmxlL2Rpc2FibGUgdGhlIFBQUyBpZiByZXF1ZXN0ZWQuCisJCQkgKi8KKwkJCWlmIChwcHNfZW5hYmxlKSB7CisJCQkJaWYgKCEocGxsX3N0YXR1cyAmIFNUQV9QUFNUSU1FKSkKKwkJCQkJcmVwb3J0X2V2ZW50KEVWTlRfS0VSTiwKKwkJCQkJICAgIE5VTEwsICJQUFMgZW5hYmxlZCIpOworCQkJCW50di5zdGF0dXMgfD0gU1RBX1BQU1RJTUUgfCBTVEFfUFBTRlJFUTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBsbF9zdGF0dXMgJiBTVEFfUFBTVElNRSkKKwkJCQkJcmVwb3J0X2V2ZW50KEVWTlRfS0VSTiwKKwkJCQkJICAgIE5VTEwsICJQUFMgZGlzYWJsZWQiKTsKKwkJCQludHYuc3RhdHVzICY9IH4oU1RBX1BQU1RJTUUgfAorCQkJCSAgICBTVEFfUFBTRlJFUSk7CisJCQl9CisJCQlpZiAoc3lzX2xlYXAgPT0gTEVBUF9BRERTRUNPTkQpCisJCQkJbnR2LnN0YXR1cyB8PSBTVEFfSU5TOworCQkJZWxzZSBpZiAoc3lzX2xlYXAgPT0gTEVBUF9ERUxTRUNPTkQpCisJCQkJbnR2LnN0YXR1cyB8PSBTVEFfREVMOworCQl9CisKKwkJLyoKKwkJICogUGFzcyB0aGUgc3R1ZmYgdG8gdGhlIGtlcm5lbC4gSWYgaXQgc3F1ZWFscywgdHVybiBvZmYKKwkJICogdGhlIHBwcy4gSW4gYW55IGNhc2UsIGZldGNoIHRoZSBrZXJuZWwgb2Zmc2V0LAorCQkgKiBmcmVxdWVuY3kgYW5kIGppdHRlci4KKwkJICovCisJCWlmIChudHBfYWRqdGltZSgmbnR2KSA9PSBUSU1FX0VSUk9SKSB7CisJCQlpZiAoIShudHYuc3RhdHVzICYgU1RBX1BQU1NJR05BTCkpCisJCQkJcmVwb3J0X2V2ZW50KEVWTlRfS0VSTiwgTlVMTCwKKwkJCQkgICAgIlBQUyBubyBzaWduYWwiKTsKKwkJfQorCQlwbGxfc3RhdHVzID0gbnR2LnN0YXR1czsKKyNpZmRlZiBTVEFfTkFOTworCQljbG9ja19vZmZzZXQgPSBudHYub2Zmc2V0IC8gMWU5OworI2Vsc2UgLyogU1RBX05BTk8gKi8KKwkJY2xvY2tfb2Zmc2V0ID0gbnR2Lm9mZnNldCAvIDFlNjsKKyNlbmRpZiAvKiBTVEFfTkFOTyAqLworCQljbG9ja19mcmVxdWVuY3kgPSBGUkVRVE9EKG50di5mcmVxKTsKKworCQkvKgorCQkgKiBJZiB0aGUga2VybmVsIFBQUyBpcyBsaXQsIG1vbml0b3IgaXRzIHBlcmZvcm1hbmNlLgorCQkgKi8KKwkJaWYgKG50di5zdGF0dXMgJiBTVEFfUFBTVElNRSkgeworI2lmZGVmIFNUQV9OQU5PCisJCQljbG9ja19qaXR0ZXIgPSBudHYuaml0dGVyIC8gMWU5OworI2Vsc2UgLyogU1RBX05BTk8gKi8KKwkJCWNsb2NrX2ppdHRlciA9IG50di5qaXR0ZXIgLyAxZTY7CisjZW5kaWYgLyogU1RBX05BTk8gKi8KKwkJfQorCisjaWYgZGVmaW5lZChTVEFfTkFOTykgJiYgTlRQX0FQSSA9PSA0CisJCS8qCisJCSAqIElmIHRoZSBUQUkgY2hhbmdlcywgdXBkYXRlIHRoZSBrZXJuZWwgVEFJLgorCQkgKi8KKwkJaWYgKGxvb3BfdGFpICE9IHN5c190YWkpIHsKKwkJCWxvb3BfdGFpID0gc3lzX3RhaTsKKwkJCW50di5tb2RlcyA9IE1PRF9UQUk7CisJCQludHYuY29uc3RhbnQgPSBzeXNfdGFpOworCQkJbnRwX2FkanRpbWUoJm50dik7CisJCX0KKyNlbmRpZiAvKiBTVEFfTkFOTyAqLworCX0KKyNlbmRpZiAvKiBLRVJORUxfUExMICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbnRwZF9zaW1wbGUuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvbnRwZF9zaW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ0NGU0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9udHBkX3NpbXBsZS5jCkBAIC0wLDAgKzEsMTAwNyBAQAorLyoKKyAqIE5UUCBjbGllbnQvc2VydmVyLCBiYXNlZCBvbiBPcGVuTlRQRCAzLjlwMQorICoKKyAqIEF1dGhvcjogQWRhbSBUa2FjIDx2b25zY2hAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4gLyogRm9yIElQVE9TX0xPV0RFTEFZIGRlZmluaXRpb24gKi8KKyNpZm5kZWYgSVBUT1NfTE9XREVMQVkKKyMgZGVmaW5lIElQVE9TX0xPV0RFTEFZIDB4MTAKKyNlbmRpZgorI2lmbmRlZiBJUF9QS1RJTkZPCisjIGVycm9yICJTb3JyeSwgeW91ciBrZXJuZWwgaGFzIHRvIHN1cHBvcnQgSVBfUEtUSU5GTyIKKyNlbmRpZgorCisKKy8qIFN5bmMgdG8gcGVlcnMgZXZlcnkgTiBzZWNzICovCisjZGVmaW5lIElOVEVSVkFMX1FVRVJZX05PUk1BTCAgICAzMAorI2RlZmluZSBJTlRFUlZBTF9RVUVSWV9QQVRIRVRJQyAgNjAKKyNkZWZpbmUgSU5URVJWQUxfUVVFUllfQUdSRVNTSVZFICA1CisKKy8qIEJhZCBpZiAqbGVzcyB0aGFuKiBUUlVTVExFVkVMX0JBRFBFRVIgKi8KKyNkZWZpbmUgVFJVU1RMRVZFTF9CQURQRUVSICAgICAgICA2CisjZGVmaW5lIFRSVVNUTEVWRUxfUEFUSEVUSUMgICAgICAgMgorI2RlZmluZSBUUlVTVExFVkVMX0FHUkVTU0lWRSAgICAgIDgKKyNkZWZpbmUgVFJVU1RMRVZFTF9NQVggICAgICAgICAgIDEwCisKKyNkZWZpbmUgUVNDQUxFX09GRl9NSU4gICAgICAgICAwLjA1CisjZGVmaW5lIFFTQ0FMRV9PRkZfTUFYICAgICAgICAgMC41MAorCisvKiBTaW5nbGUgcXVlcnkgbWlnaHQgdGFrZSBOIHNlY3MgbWF4ICovCisjZGVmaW5lIFFVRVJZVElNRV9NQVggICAgICAgICAgICAxNQorLyogTWluIG9mZnNldCBmb3Igc2V0dGltZSBhdCBzdGFydC4gIm1hbiBudHBkIiBzYXlzIGl0J3MgMTI4IG1zICovCisjZGVmaW5lIFNURVBUSU1FX01JTl9PRkZTRVQgICAwLjEyOAorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgaW50X3BhcnRsOworCXVpbnQzMl90IGZyYWN0aW9ubDsKK30gbF9maXhlZHB0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBpbnRfcGFydHM7CisJdWludDE2X3QgZnJhY3Rpb25zOworfSBzX2ZpeGVkcHRfdDsKKworZW51bSB7CisJTlRQX0RJR0VTVFNJWkUgICAgID0gMTYsCisJTlRQX01TR1NJWkVfTk9BVVRIID0gNDgsCisJTlRQX01TR1NJWkUgICAgICAgID0gKE5UUF9NU0dTSVpFX05PQVVUSCArIDQgKyBOVFBfRElHRVNUU0laRSksCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCAgICAgbV9zdGF0dXM7ICAgICAvKiBzdGF0dXMgb2YgbG9jYWwgY2xvY2sgYW5kIGxlYXAgaW5mbyAqLworCXVpbnQ4X3QgICAgIG1fc3RyYXR1bTsgICAgLyogc3RyYXR1bSBsZXZlbCAqLworCXVpbnQ4X3QgICAgIG1fcHBvbGw7ICAgICAgLyogcG9sbCB2YWx1ZSAqLworCWludDhfdCAgICAgIG1fcHJlY2lzaW9uX2V4cDsKKwlzX2ZpeGVkcHRfdCBtX3Jvb3RkZWxheTsKKwlzX2ZpeGVkcHRfdCBtX2Rpc3BlcnNpb247CisJdWludDMyX3QgICAgbV9yZWZpZDsKKwlsX2ZpeGVkcHRfdCBtX3JlZnRpbWU7CisJbF9maXhlZHB0X3QgbV9vcmd0aW1lOworCWxfZml4ZWRwdF90IG1fcmVjdGltZTsKKwlsX2ZpeGVkcHRfdCBtX3htdHRpbWU7CisJdWludDMyX3QgICAgbV9rZXlpZDsKKwl1aW50OF90ICAgICBtX2RpZ2VzdFtOVFBfRElHRVNUU0laRV07Cit9IG1zZ190OworCitlbnVtIHsKKwlOVFBfVkVSU0lPTiAgICAgPSA0LAorCU5UUF9NQVhTVFJBVFVNICA9IDE1LAorCisJLyogU3RhdHVzIE1hc2tzICovCisJTU9ERV9NQVNLICAgICAgID0gKDcgPDwgMCksCisJVkVSU0lPTl9NQVNLICAgID0gKDcgPDwgMyksCisJVkVSU0lPTl9TSElGVCAgID0gMywKKwlMSV9NQVNLICAgICAgICAgPSAoMyA8PCA2KSwKKworCS8qIExlYXAgU2Vjb25kIENvZGVzIChoaWdoIG9yZGVyIHR3byBiaXRzIG9mIG1fc3RhdHVzKSAqLworCUxJX05PV0FSTklORyAgICA9ICgwIDw8IDYpLCAgICAvKiBubyB3YXJuaW5nICovCisJTElfUExVU1NFQyAgICAgID0gKDEgPDwgNiksICAgIC8qIGFkZCBhIHNlY29uZCAoNjEgc2Vjb25kcykgKi8KKwlMSV9NSU5VU1NFQyAgICAgPSAoMiA8PCA2KSwgICAgLyogbWludXMgYSBzZWNvbmQgKDU5IHNlY29uZHMpICovCisJTElfQUxBUk0gICAgICAgID0gKDMgPDwgNiksICAgIC8qIGFsYXJtIGNvbmRpdGlvbiAqLworCisJLyogTW9kZSB2YWx1ZXMgKi8KKwlNT0RFX1JFUzAgICAgICAgPSAwLCAgICAvKiByZXNlcnZlZCAqLworCU1PREVfU1lNX0FDVCAgICA9IDEsICAgIC8qIHN5bW1ldHJpYyBhY3RpdmUgKi8KKwlNT0RFX1NZTV9QQVMgICAgPSAyLCAgICAvKiBzeW1tZXRyaWMgcGFzc2l2ZSAqLworCU1PREVfQ0xJRU5UICAgICA9IDMsICAgIC8qIGNsaWVudCAqLworCU1PREVfU0VSVkVSICAgICA9IDQsICAgIC8qIHNlcnZlciAqLworCU1PREVfQlJPQURDQVNUICA9IDUsICAgIC8qIGJyb2FkY2FzdCAqLworCU1PREVfUkVTMSAgICAgICA9IDYsICAgIC8qIHJlc2VydmVkIGZvciBOVFAgY29udHJvbCBtZXNzYWdlICovCisJTU9ERV9SRVMyICAgICAgID0gNywgICAgLyogcmVzZXJ2ZWQgZm9yIHByaXZhdGUgdXNlICovCit9OworCisjZGVmaW5lIE9GRlNFVF8xOTAwXzE5NzAgMjIwODk4ODgwMFVMICAvKiAxOTcwIC0gMTkwMCBpbiBzZWNvbmRzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlkb3VibGUgICBkX29mZnNldDsKKwlkb3VibGUgICBkX2RlbGF5OworCS8vVU5VU0VEOiBkb3VibGUgZF9lcnJvcjsKKwl0aW1lX3QgICBkX3Jjdl90aW1lOworCXVpbnQzMl90IGRfcmVmaWQ0OworCXVpbnQ4X3QgIGRfbGVhcDsKKwl1aW50OF90ICBkX3N0cmF0dW07CisJdWludDhfdCAgZF9nb29kOworfSBkYXRhcG9pbnRfdDsKKworI2RlZmluZSBOVU1fREFUQVBPSU5UUyAgOAordHlwZWRlZiBzdHJ1Y3QgeworCWxlbl9hbmRfc29ja2FkZHIgKnBfbHNhOworCWNoYXIgICAgICAgICAgICAgKnBfZG90dGVkOworCS8qIFdoZW4gdG8gc2VuZCBuZXcgcXVlcnkgKGlmIHBfZmQgPT0gLTEpCisJICogb3Igd2hlbiByZWNlaXZlIHRpbWVzIG91dCAoaWYgcF9mZCA+PSAwKTogKi8KKwl0aW1lX3QgICAgICAgICAgIG5leHRfYWN0aW9uX3RpbWU7CisJaW50ICAgICAgICAgICAgICBwX2ZkOworCXVpbnQ4X3QgICAgICAgICAgcF9kYXRhcG9pbnRfaWR4OworCXVpbnQ4X3QgICAgICAgICAgcF90cnVzdGxldmVsOworCWRvdWJsZSAgICAgICAgICAgcF94bXR0aW1lOworCWRhdGFwb2ludF90ICAgICAgdXBkYXRlOworCWRhdGFwb2ludF90ICAgICAgcF9kYXRhcG9pbnRbTlVNX0RBVEFQT0lOVFNdOworCW1zZ190ICAgICAgICAgICAgcF94bXRfbXNnOworfSBwZWVyX3Q7CisKK2VudW0geworCU9QVF9uID0gKDEgPDwgMCksCisJT1BUX3EgPSAoMSA8PCAxKSwKKwlPUFRfTiA9ICgxIDw8IDIpLAorCU9QVF94ID0gKDEgPDwgMyksCisJLyogSW5zZXJ0IG5ldyBvcHRpb25zIGFib3ZlIHRoaXMgbGluZS4gKi8KKwkvKiBOb24tY29tcGF0IG9wdGlvbnM6ICovCisJT1BUX3AgPSAoMSA8PCA0KSwKKwlPUFRfbCA9ICgxIDw8IDUpICogRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIsCit9OworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwkvKiB0b3RhbCByb3VuZCB0cmlwIGRlbGF5IHRvIGN1cnJlbnRseSBzZWxlY3RlZCByZWZlcmVuY2UgY2xvY2sgKi8KKwlkb3VibGUgICByb290ZGVsYXk7CisJLyogcmVmZXJlbmNlIHRpbWVzdGFtcDogdGltZSB3aGVuIHRoZSBzeXN0ZW0gY2xvY2sgd2FzIGxhc3Qgc2V0IG9yIGNvcnJlY3RlZCAqLworCWRvdWJsZSAgIHJlZnRpbWU7CisJbGxpc3RfdCAgKm50cF9wZWVyczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorCWludCAgICAgIGxpc3Rlbl9mZDsKKyNlbmRpZgorCXVuc2lnbmVkIHZlcmJvc2U7CisJdW5zaWduZWQgcGVlcl9jbnQ7CisJdW5zaWduZWQgc2NhbGU7CisJdWludDMyX3QgcmVmaWQ7CisJdWludDMyX3QgcmVmaWQ0OworCXVpbnQ4X3QgIHN5bmNlZDsKKwl1aW50OF90ICBsZWFwOworI2RlZmluZSBHX3ByZWNpc2lvbl9leHAgLTYKKy8vCWludDhfdCAgIHByZWNpc2lvbl9leHA7CisJdWludDhfdCAgc3RyYXR1bTsKKwl1aW50OF90ICB0aW1lX3dhc19zdGVwcGVkOworCXVpbnQ4X3QgIGZpcnN0X2Fkal9kb25lOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorCitzdGF0aWMgY29uc3QgaW50IGNvbnN0X0lQVE9TX0xPV0RFTEFZID0gSVBUT1NfTE9XREVMQVk7CisKKworc3RhdGljIHZvaWQKK3NldF9uZXh0KHBlZXJfdCAqcCwgdW5zaWduZWQgdCkKK3sKKwlwLT5uZXh0X2FjdGlvbl90aW1lID0gdGltZShOVUxMKSArIHQ7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfcGVlcnMoY2hhciAqcykKK3sKKwlwZWVyX3QgKnA7CisKKwlwID0geHphbGxvYyhzaXplb2YoKnApKTsKKwlwLT5wX2xzYSA9IHhob3N0MnNvY2thZGRyKHMsIDEyMyk7CisJcC0+cF9kb3R0ZWQgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoJnAtPnBfbHNhLT51LnNhKTsKKwlwLT5wX2ZkID0gLTE7CisJcC0+cF94bXRfbXNnLm1fc3RhdHVzID0gTU9ERV9DTElFTlQgfCAoTlRQX1ZFUlNJT04gPDwgMyk7CisJcC0+cF90cnVzdGxldmVsID0gVFJVU1RMRVZFTF9QQVRIRVRJQzsKKwlwLT5uZXh0X2FjdGlvbl90aW1lID0gdGltZShOVUxMKTsgLyogPSBzZXRfbmV4dChwLCAwKTsgKi8KKworCWxsaXN0X2FkZF90bygmRy5udHBfcGVlcnMsIHApOworCUcucGVlcl9jbnQrKzsKK30KKworc3RhdGljIGRvdWJsZQorZ2V0dGltZTE5MDBkKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7IC8qIG5ldmVyIGZhaWxzICovCisJcmV0dXJuICh0di50dl9zZWMgKyAxLjBlLTYgKiB0di50dl91c2VjICsgT0ZGU0VUXzE5MDBfMTk3MCk7Cit9CisKK3N0YXRpYyB2b2lkCitkX3RvX3R2KGRvdWJsZSBkLCBzdHJ1Y3QgdGltZXZhbCAqdHYpCit7CisJdHYtPnR2X3NlYyA9IChsb25nKWQ7CisJdHYtPnR2X3VzZWMgPSAoZCAtIHR2LT50dl9zZWMpICogMTAwMDAwMDsKK30KKworc3RhdGljIGRvdWJsZQorbGZwX3RvX2QobF9maXhlZHB0X3QgbGZwKQoreworCWRvdWJsZSByZXQ7CisJbGZwLmludF9wYXJ0bCA9IG50b2hsKGxmcC5pbnRfcGFydGwpOworCWxmcC5mcmFjdGlvbmwgPSBudG9obChsZnAuZnJhY3Rpb25sKTsKKwlyZXQgPSAoZG91YmxlKWxmcC5pbnRfcGFydGwgKyAoKGRvdWJsZSlsZnAuZnJhY3Rpb25sIC8gVUlOVF9NQVgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZiAwIC8vVU5VU0VECitzdGF0aWMgZG91YmxlCitzZnBfdG9fZChzX2ZpeGVkcHRfdCBzZnApCit7CisJZG91YmxlIHJldDsKKwlzZnAuaW50X3BhcnRzID0gbnRvaHMoc2ZwLmludF9wYXJ0cyk7CisJc2ZwLmZyYWN0aW9ucyA9IG50b2hzKHNmcC5mcmFjdGlvbnMpOworCXJldCA9IChkb3VibGUpc2ZwLmludF9wYXJ0cyArICgoZG91YmxlKXNmcC5mcmFjdGlvbnMgLyBVU0hSVF9NQVgpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCitzdGF0aWMgbF9maXhlZHB0X3QKK2RfdG9fbGZwKGRvdWJsZSBkKQoreworCWxfZml4ZWRwdF90IGxmcDsKKwlsZnAuaW50X3BhcnRsID0gKHVpbnQzMl90KWQ7CisJbGZwLmZyYWN0aW9ubCA9ICh1aW50MzJfdCkoKGQgLSBsZnAuaW50X3BhcnRsKSAqIFVJTlRfTUFYKTsKKwlsZnAuaW50X3BhcnRsID0gaHRvbmwobGZwLmludF9wYXJ0bCk7CisJbGZwLmZyYWN0aW9ubCA9IGh0b25sKGxmcC5mcmFjdGlvbmwpOworCXJldHVybiBsZnA7Cit9CisKK3N0YXRpYyBzX2ZpeGVkcHRfdAorZF90b19zZnAoZG91YmxlIGQpCit7CisJc19maXhlZHB0X3Qgc2ZwOworCXNmcC5pbnRfcGFydHMgPSAodWludDE2X3QpZDsKKwlzZnAuZnJhY3Rpb25zID0gKHVpbnQxNl90KSgoZCAtIHNmcC5pbnRfcGFydHMpICogVVNIUlRfTUFYKTsKKwlzZnAuaW50X3BhcnRzID0gaHRvbnMoc2ZwLmludF9wYXJ0cyk7CisJc2ZwLmZyYWN0aW9ucyA9IGh0b25zKHNmcC5mcmFjdGlvbnMpOworCXJldHVybiBzZnA7Cit9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkCitlcnJvcl9pbnRlcnZhbCh2b2lkKQoreworCXVuc2lnbmVkIGludGVydmFsLCByOworCWludGVydmFsID0gSU5URVJWQUxfUVVFUllfUEFUSEVUSUMgKiBRU0NBTEVfT0ZGX01BWCAvIFFTQ0FMRV9PRkZfTUlOOworCXIgPSAodW5zaWduZWQpcmFuZG9tKCkgJSAodW5zaWduZWQpKGludGVydmFsIC8gMTApOworCXJldHVybiAoaW50ZXJ2YWwgKyByKTsKK30KKworc3RhdGljIGludAorZG9fc2VuZHRvKGludCBmZCwKKwkJY29uc3Qgc3RydWN0IHNvY2thZGRyICpmcm9tLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBzb2NrbGVuX3QgYWRkcmxlbiwKKwkJbXNnX3QgKm1zZywgc3NpemVfdCBsZW4pCit7CisJc3NpemVfdCByZXQ7CisKKwllcnJubyA9IDA7CisJaWYgKCFmcm9tKSB7CisJCXJldCA9IHNlbmR0byhmZCwgbXNnLCBsZW4sIE1TR19ET05UV0FJVCwgdG8sIGFkZHJsZW4pOworCX0gZWxzZSB7CisJCXJldCA9IHNlbmRfdG9fZnJvbShmZCwgbXNnLCBsZW4sIE1TR19ET05UV0FJVCwgdG8sIGZyb20sIGFkZHJsZW4pOworCX0KKwlpZiAocmV0ICE9IGxlbikgeworCQliYl9wZXJyb3JfbXNnKCJzZW5kIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZW5kX3F1ZXJ5X3RvX3BlZXIocGVlcl90ICpwKQoreworCS8vIFdoeSBkbyB3ZSBuZWVkIHRvIGJpbmQoKT8KKwkvLyBTZWUgd2hhdCBoYXBwZW5zIHdoZW4gd2UgZG9uJ3QgYmluZDoKKwkvLworCS8vIHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX0lQKSA9IDMKKwkvLyBzZXRzb2Nrb3B0KDMsIFNPTF9JUCwgSVBfVE9TLCBbMTZdLCA0KSA9IDAKKwkvLyBnZXR0aW1lb2ZkYXkoezEyNTkwNzEyNjYsIDMyNzg4NX0sIE5VTEwpID0gMAorCS8vIHNlbmR0bygzLCAieHh4IiwgNDgsIE1TR19ET05UV0FJVCwge3NhX2ZhbWlseT1BRl9JTkVULCBzaW5fcG9ydD1odG9ucygxMjMpLCBzaW5fYWRkcj1pbmV0X2FkZHIoIjEwLjM0LjMyLjEyNSIpfSwgMTYpID0gNDgKKwkvLyBeXl4gd2Ugc2VudCBpdCBmcm9tIHNvbWUgc291cmNlIHBvcnQgcGlja2VkIGJ5IGtlcm5lbC4KKwkvLyB0aW1lKE5VTEwpICAgICAgICAgICAgICA9IDEyNTkwNzEyNjYKKwkvLyB3cml0ZSgyLCAibnRwZDogZW50ZXJpbmcgcG9sbCAxNSBzZWNzXG4iLCAyOCkgPSAyOAorCS8vIHBvbGwoW3tmZD0zLCBldmVudHM9UE9MTElOfV0sIDEsIDE1MDAwKSA9IDEgKFt7ZmQ9MywgcmV2ZW50cz1QT0xMSU59XSkKKwkvLyByZWN2KDMsICJ5eXkiLCA2OCwgTVNHX0RPTlRXQUlUKSA9IDQ4CisJLy8gXl5eIHRoaXMgcmVjdiB3aWxsIHJlY2VpdmUgcGFja2V0cyB0byBhbnkgbG9jYWwgcG9ydCEKKwkvLworCS8vIFVuY29tbWVudCB0aGlzIGFuZCB1c2Ugc3RyYWNlIHRvIHNlZSBpdCBpbiBhY3Rpb246CisjZGVmaW5lIFBST0JFX0xPQ0FMX0FERFIgLy8geyBsZW5fYW5kX3NvY2thZGRyIGxzYTsgbHNhLmxlbiA9IExTQV9TSVpFT0ZfU0E7IGdldHNvY2tuYW1lKHAtPnF1ZXJ5LmZkLCAmbHNhLnUuc2EsICZsc2EubGVuKTsgfQorCisJaWYgKHAtPnBfZmQgPT0gLTEpIHsKKwkJaW50IGZkLCBmYW1pbHk7CisJCWxlbl9hbmRfc29ja2FkZHIgKmxvY2FsX2xzYTsKKworCQlmYW1pbHkgPSBwLT5wX2xzYS0+dS5zYS5zYV9mYW1pbHk7CisJCXAtPnBfZmQgPSBmZCA9IHhzb2NrZXRfdHlwZSgmbG9jYWxfbHNhLCBmYW1pbHksIFNPQ0tfREdSQU0pOworCQkvKiBsb2NhbF9sc2EgaGFzICJudWxsIiBhZGRyZXNzIGFuZCBwb3J0IDAgbm93LgorCQkgKiBiaW5kKCkgZW5zdXJlcyB3ZSBoYXZlIGEgKnBhcnRpY3VsYXIgcG9ydCogc2VsZWN0ZWQgYnkga2VybmVsCisJCSAqIGFuZCByZW1lbWJlcmVkIGluIHAtPnBfZmQsIHRodXMgbGF0ZXIgcmVjdihwLT5wX2ZkKQorCQkgKiByZWNlaXZlcyBvbmx5IHBhY2tldHMgc2VudCB0byB0aGlzIHBvcnQuCisJCSAqLworCQlQUk9CRV9MT0NBTF9BRERSCisJCXhiaW5kKGZkLCAmbG9jYWxfbHNhLT51LnNhLCBsb2NhbF9sc2EtPmxlbik7CisJCVBST0JFX0xPQ0FMX0FERFIKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCWlmIChmYW1pbHkgPT0gQUZfSU5FVCkKKyNlbmRpZgorCQkJc2V0c29ja29wdChmZCwgSVBQUk9UT19JUCwgSVBfVE9TLCAmY29uc3RfSVBUT1NfTE9XREVMQVksIHNpemVvZihjb25zdF9JUFRPU19MT1dERUxBWSkpOworCQlmcmVlKGxvY2FsX2xzYSk7CisJfQorCisJLyoKKwkgKiBTZW5kIG91dCBhIHJhbmRvbSA2NC1iaXQgbnVtYmVyIGFzIG91ciB0cmFuc21pdCB0aW1lLiAgVGhlIE5UUAorCSAqIHNlcnZlciB3aWxsIGNvcHkgc2FpZCBudW1iZXIgaW50byB0aGUgb3JpZ2luYXRlIGZpZWxkIG9uIHRoZQorCSAqIHJlc3BvbnNlIHRoYXQgaXQgc2VuZHMgdXMuICBUaGlzIGlzIHRvdGFsbHkgbGVnYWwgcGVyIHRoZSBTTlRQIHNwZWMuCisJICoKKwkgKiBUaGUgaW1wYWN0IG9mIHRoaXMgaXMgdHdvIGZvbGQ6IHdlIG5vIGxvbmdlciBzZW5kIG91dCB0aGUgY3VycmVudAorCSAqIHN5c3RlbSB0aW1lIGZvciB0aGUgd29ybGQgdG8gc2VlICh3aGljaCBtYXkgYWlkIGFuIGF0dGFja2VyKSwgYW5kCisJICogaXQgZ2l2ZXMgdXMgYSAobm90IHZlcnkgc2VjdXJlKSB3YXkgb2Yga25vd2luZyB0aGF0IHdlJ3JlIG5vdAorCSAqIGdldHRpbmcgc3Bvb2ZlZCBieSBhbiBhdHRhY2tlciB0aGF0IGNhbid0IGNhcHR1cmUgb3VyIHRyYWZmaWMKKwkgKiBidXQgY2FuIHNwb29mIHBhY2tldHMgZnJvbSB0aGUgTlRQIHNlcnZlciB3ZSdyZSBjb21tdW5pY2F0aW5nIHdpdGguCisJICoKKwkgKiBTYXZlIHRoZSByZWFsIHRyYW5zbWl0IHRpbWVzdGFtcCBsb2NhbGx5LgorCSAqLworCXAtPnBfeG10X21zZy5tX3htdHRpbWUuaW50X3BhcnRsID0gcmFuZG9tKCk7CisJcC0+cF94bXRfbXNnLm1feG10dGltZS5mcmFjdGlvbmwgPSByYW5kb20oKTsKKwlwLT5wX3htdHRpbWUgPSBnZXR0aW1lMTkwMGQoKTsKKworCWlmIChkb19zZW5kdG8ocC0+cF9mZCwgLypmcm9tOiovIE5VTEwsIC8qdG86Ki8gJnAtPnBfbHNhLT51LnNhLCAvKmFkZHJsZW46Ki8gcC0+cF9sc2EtPmxlbiwKKwkJCSZwLT5wX3htdF9tc2csIE5UUF9NU0dTSVpFX05PQVVUSCkgPT0gLTEKKwkpIHsKKwkJY2xvc2UocC0+cF9mZCk7CisJCXAtPnBfZmQgPSAtMTsKKwkJc2V0X25leHQocCwgSU5URVJWQUxfUVVFUllfUEFUSEVUSUMpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKEcudmVyYm9zZSkKKwkJYmJfZXJyb3JfbXNnKCJzZW50IHF1ZXJ5IHRvICVzIiwgcC0+cF9kb3R0ZWQpOworCXNldF9uZXh0KHAsIFFVRVJZVElNRV9NQVgpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogVGltZSBpcyBzdGVwcGVkIG9ubHkgb25jZSwgd2hlbiB0aGUgZmlyc3QgcGFja2V0IGZyb20gYSBwZWVyIGlzIHJlY2VpdmVkLgorICovCitzdGF0aWMgdm9pZAorc3RlcF90aW1lX29uY2UoZG91YmxlIG9mZnNldCkKK3sKKwlkb3VibGUgZHRpbWU7CisJbGxpc3RfdCAqaXRlbTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwljaGFyIGJ1Zls4MF07CisJdGltZV90IHR2YWw7CisKKwlpZiAoRy50aW1lX3dhc19zdGVwcGVkKQorCQlnb3RvIGJhaWw7CisJRy50aW1lX3dhc19zdGVwcGVkID0gMTsKKworCS8qIGlmIHRoZSBvZmZzZXQgaXMgc21hbGwsIGRvbid0IHN0ZXAsIHNsZXcgKGxhdGVyKSAqLworCWlmIChvZmZzZXQgPCBTVEVQVElNRV9NSU5fT0ZGU0VUICYmIG9mZnNldCA+IC1TVEVQVElNRV9NSU5fT0ZGU0VUKQorCQlnb3RvIGJhaWw7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsgLyogbmV2ZXIgZmFpbHMgKi8KKwlkdGltZSA9IG9mZnNldCArIHR2LnR2X3NlYzsKKwlkdGltZSArPSAxLjBlLTYgKiB0di50dl91c2VjOworCWRfdG9fdHYoZHRpbWUsICZ0dik7CisKKwlpZiAoc2V0dGltZW9mZGF5KCZ0diwgTlVMTCkgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0dGltZW9mZGF5Iik7CisKKwl0dmFsID0gdHYudHZfc2VjOworCXN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlYSAlYiAlZSAlSDolTTolUyAlWiAlWSIsIGxvY2FsdGltZSgmdHZhbCkpOworCisJYmJfZXJyb3JfbXNnKCJzZXR0aW5nIGNsb2NrIHRvICVzIChvZmZzZXQgJWZzKSIsIGJ1Ziwgb2Zmc2V0KTsKKworCWZvciAoaXRlbSA9IEcubnRwX3BlZXJzOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5saW5rKSB7CisJCXBlZXJfdCAqcCA9IChwZWVyX3QgKikgaXRlbS0+ZGF0YTsKKwkJcC0+bmV4dF9hY3Rpb25fdGltZSAtPSAodGltZV90KW9mZnNldDsKKwl9CisKKyBiYWlsOgorCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3EpCisJCWV4aXQoMCk7Cit9CisKKworLyogVGltZSBpcyBwZXJpb2RpY2FsbHkgc2xld2VkIHdoZW4gd2UgY29sbGVjdCBlbm91Z2gKKyAqIGdvb2QgZGF0YSBwb2ludHMuCisgKi8KK3N0YXRpYyBpbnQKK2NvbXBhcmVfb2Zmc2V0cyhjb25zdCB2b2lkICphYSwgY29uc3Qgdm9pZCAqYmIpCit7CisJY29uc3QgcGVlcl90ICpjb25zdCAqYSA9IGFhOworCWNvbnN0IHBlZXJfdCAqY29uc3QgKmIgPSBiYjsKKwlpZiAoKCphKS0+dXBkYXRlLmRfb2Zmc2V0IDwgKCpiKS0+dXBkYXRlLmRfb2Zmc2V0KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuICgoKmEpLT51cGRhdGUuZF9vZmZzZXQgPiAoKmIpLT51cGRhdGUuZF9vZmZzZXQpOworfQorc3RhdGljIHVuc2lnbmVkCit1cGRhdGVkX3NjYWxlKGRvdWJsZSBvZmZzZXQpCit7CisJaWYgKG9mZnNldCA8IDApCisJCW9mZnNldCA9IC1vZmZzZXQ7CisJaWYgKG9mZnNldCA+IFFTQ0FMRV9PRkZfTUFYKQorCQlyZXR1cm4gMTsKKwlpZiAob2Zmc2V0IDwgUVNDQUxFX09GRl9NSU4pCisJCXJldHVybiBRU0NBTEVfT0ZGX01BWCAvIFFTQ0FMRV9PRkZfTUlOOworCXJldHVybiBRU0NBTEVfT0ZGX01BWCAvIG9mZnNldDsKK30KK3N0YXRpYyB2b2lkCitzbGV3X3RpbWUodm9pZCkKK3sKKwlsbGlzdF90ICppdGVtOworCWRvdWJsZSBvZmZzZXRfbWVkaWFuOworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJeworCQlwZWVyX3QgKipwZWVycyA9IHh6YWxsb2Moc2l6ZW9mKHBlZXJzWzBdKSAqIEcucGVlcl9jbnQpOworCQl1bnNpZ25lZCBnb29kcGVlcl9jbnQgPSAwOworCQl1bnNpZ25lZCBtaWRkbGU7CisKKwkJZm9yIChpdGVtID0gRy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCXBlZXJfdCAqcCA9IChwZWVyX3QgKikgaXRlbS0+ZGF0YTsKKwkJCWlmIChwLT5wX3RydXN0bGV2ZWwgPCBUUlVTVExFVkVMX0JBRFBFRVIpCisJCQkJY29udGludWU7CisJCQlpZiAoIXAtPnVwZGF0ZS5kX2dvb2QpIHsKKwkJCQlmcmVlKHBlZXJzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwZWVyc1tnb29kcGVlcl9jbnQrK10gPSBwOworCQl9CisKKwkJaWYgKGdvb2RwZWVyX2NudCA9PSAwKSB7CisJCQlmcmVlKHBlZXJzKTsKKwkJCWdvdG8gY2xlYXJfZ29vZDsKKwkJfQorCisJCXFzb3J0KHBlZXJzLCBnb29kcGVlcl9jbnQsIHNpemVvZihwZWVyc1swXSksIGNvbXBhcmVfb2Zmc2V0cyk7CisKKwkJbWlkZGxlID0gZ29vZHBlZXJfY250IC8gMjsKKwkJaWYgKG1pZGRsZSAhPSAwICYmIChnb29kcGVlcl9jbnQgJiAxKSA9PSAwKSB7CisJCQlvZmZzZXRfbWVkaWFuID0gKHBlZXJzW21pZGRsZS0xXS0+dXBkYXRlLmRfb2Zmc2V0ICsgcGVlcnNbbWlkZGxlXS0+dXBkYXRlLmRfb2Zmc2V0KSAvIDI7CisJCQlHLnJvb3RkZWxheSA9IChwZWVyc1ttaWRkbGUtMV0tPnVwZGF0ZS5kX2RlbGF5ICsgcGVlcnNbbWlkZGxlXS0+dXBkYXRlLmRfZGVsYXkpIC8gMjsKKwkJCUcuc3RyYXR1bSA9IDEgKyBNQVgocGVlcnNbbWlkZGxlLTFdLT51cGRhdGUuZF9zdHJhdHVtLCBwZWVyc1ttaWRkbGVdLT51cGRhdGUuZF9zdHJhdHVtKTsKKwkJfSBlbHNlIHsKKwkJCW9mZnNldF9tZWRpYW4gPSBwZWVyc1ttaWRkbGVdLT51cGRhdGUuZF9vZmZzZXQ7CisJCQlHLnJvb3RkZWxheSA9IHBlZXJzW21pZGRsZV0tPnVwZGF0ZS5kX2RlbGF5OworCQkJRy5zdHJhdHVtID0gMSArIHBlZXJzW21pZGRsZV0tPnVwZGF0ZS5kX3N0cmF0dW07CisJCX0KKwkJRy5sZWFwID0gcGVlcnNbbWlkZGxlXS0+dXBkYXRlLmRfbGVhcDsKKwkJRy5yZWZpZDQgPSBwZWVyc1ttaWRkbGVdLT51cGRhdGUuZF9yZWZpZDQ7CisJCUcucmVmaWQgPQorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJCXBlZXJzW21pZGRsZV0tPnBfbHNhLT51LnNhLnNhX2ZhbWlseSAhPSBBRl9JTkVUID8KKwkJCQlHLnJlZmlkNCA6CisjZW5kaWYKKwkJCQlwZWVyc1ttaWRkbGVdLT5wX2xzYS0+dS5zaW4uc2luX2FkZHIuc19hZGRyOworCQlmcmVlKHBlZXJzKTsKKwl9CisvL1RPRE86IGlmIChvZmZzZXRfbWVkaWFuID4gQklHKSBzdGVwX3RpbWUob2Zmc2V0X21lZGlhbik/CisKKwlHLnNjYWxlID0gdXBkYXRlZF9zY2FsZShvZmZzZXRfbWVkaWFuKTsKKworCWJiX2Vycm9yX21zZygiYWRqdXN0aW5nIGNsb2NrIGJ5ICVmcywgb3VyIHN0cmF0dW0gaXMgJXUsIHRpbWUgc2NhbGUgJXUiLAorCQkJb2Zmc2V0X21lZGlhbiwgRy5zdHJhdHVtLCBHLnNjYWxlKTsKKworCWVycm5vID0gMDsKKwlkX3RvX3R2KG9mZnNldF9tZWRpYW4sICZ0dik7CisJaWYgKGFkanRpbWUoJnR2LCAmdHYpID09IC0xKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImFkanRpbWUgZmFpbGVkIik7CisJaWYgKEcudmVyYm9zZSA+PSAyKQorCQliYl9lcnJvcl9tc2coIm9sZCBhZGp1c3Q6ICVkLiUwNnUiLCAoaW50KXR2LnR2X3NlYywgKHVuc2lnbmVkKXR2LnR2X3VzZWMpOworCisJaWYgKEcuZmlyc3RfYWRqX2RvbmUpIHsKKwkJdWludDhfdCBzeW5jZWQgPSAodHYudHZfc2VjID09IDAgJiYgdHYudHZfdXNlYyA9PSAwKTsKKwkJaWYgKHN5bmNlZCAhPSBHLnN5bmNlZCkgeworCQkJRy5zeW5jZWQgPSBzeW5jZWQ7CisJCQliYl9lcnJvcl9tc2coImNsb2NrIGlzICVzc3luY2VkIiwgc3luY2VkID8gIiIgOiAidW4iKTsKKwkJfQorCX0KKwlHLmZpcnN0X2Fkal9kb25lID0gMTsKKworCUcucmVmdGltZSA9IGdldHRpbWUxOTAwZCgpOworCisgY2xlYXJfZ29vZDoKKwlmb3IgKGl0ZW0gPSBHLm50cF9wZWVyczsgaXRlbSAhPSBOVUxMOyBpdGVtID0gaXRlbS0+bGluaykgeworCQlwZWVyX3QgKnAgPSAocGVlcl90ICopIGl0ZW0tPmRhdGE7CisJCXAtPnVwZGF0ZS5kX2dvb2QgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9wZWVyX2RhdGEocGVlcl90ICpwKQoreworCS8qIENsb2NrIGZpbHRlci4KKwkgKiBGaW5kIHRoZSBkYXRhcG9pbnQgd2l0aCB0aGUgbG93ZXN0IGRlbGF5LgorCSAqIFVzZSB0aGF0IGFzIHRoZSBwZWVyIHVwZGF0ZS4KKwkgKiBJbnZhbGlkYXRlIGl0IGFuZCBhbGwgb2xkZXIgb25lcy4KKwkgKi8KKwlpbnQgaTsKKwlpbnQgYmVzdCA9IC0xOworCWludCBnb29kID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fREFUQVBPSU5UUzsgaSsrKSB7CisJCWlmIChwLT5wX2RhdGFwb2ludFtpXS5kX2dvb2QpIHsKKwkJCWdvb2QrKzsKKwkJCWlmIChiZXN0IDwgMCB8fCBwLT5wX2RhdGFwb2ludFtpXS5kX2RlbGF5IDwgcC0+cF9kYXRhcG9pbnRbYmVzdF0uZF9kZWxheSkKKwkJCQliZXN0ID0gaTsKKwkJfQorCX0KKworCWlmIChnb29kIDwgOCkgLy9GSVhNRTogd2FzIGl0IG1lYW50IHRvIGJlIE5VTV9EQVRBUE9JTlRTLCBub3QgOD8KKwkJcmV0dXJuOworCisJcC0+dXBkYXRlID0gcC0+cF9kYXRhcG9pbnRbYmVzdF07IC8qIHN0cnVjdCBjb3B5ICovCisJc2xld190aW1lKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RBVEFQT0lOVFM7IGkrKykKKwkJaWYgKHAtPnBfZGF0YXBvaW50W2ldLmRfcmN2X3RpbWUgPD0gcC0+cF9kYXRhcG9pbnRbYmVzdF0uZF9yY3ZfdGltZSkKKwkJCXAtPnBfZGF0YXBvaW50W2ldLmRfZ29vZCA9IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorc2NhbGVfaW50ZXJ2YWwodW5zaWduZWQgcmVxdWVzdGVkKQoreworCXVuc2lnbmVkIGludGVydmFsLCByOworCWludGVydmFsID0gcmVxdWVzdGVkICogRy5zY2FsZTsKKwlyID0gKHVuc2lnbmVkKXJhbmRvbSgpICUgKHVuc2lnbmVkKShNQVgoNSwgaW50ZXJ2YWwgLyAxMCkpOworCXJldHVybiAoaW50ZXJ2YWwgKyByKTsKK30KK3N0YXRpYyB2b2lkCityZWN2X2FuZF9wcm9jZXNzX3BlZXJfcGt0KHBlZXJfdCAqcCkKK3sKKwlzc2l6ZV90ICAgICBzaXplOworCW1zZ190ICAgICAgIG1zZzsKKwlkb3VibGUgICAgICBUMSwgVDIsIFQzLCBUNDsKKwl1bnNpZ25lZCAgICBpbnRlcnZhbDsKKwlkYXRhcG9pbnRfdCAqZGF0YXBvaW50OworCisJLyogV2UgY2FuIHJlY3Zmcm9tIGhlcmUgYW5kIGNoZWNrIGZyb20uSVAsIGJ1dCBzb21lIG11bHRpaG9tZWQKKwkgKiBudHAgc2VydmVycyByZXBseSBmcm9tIHRoZWlyICpvdGhlciBJUCouCisJICogVE9ETzogbWF5YmUgd2Ugc2hvdWxkIGNoZWNrIGF0IGxlYXN0IHdoYXQgd2UgY2FuOiBmcm9tLnBvcnQgPT0gMTIzPworCSAqLworCXNpemUgPSByZWN2KHAtPnBfZmQsICZtc2csIHNpemVvZihtc2cpLCBNU0dfRE9OVFdBSVQpOworCWlmIChzaXplID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coInJlY3YoJXMpIGVycm9yIiwgcC0+cF9kb3R0ZWQpOworCQlpZiAoZXJybm8gPT0gRUhPU1RVTlJFQUNIIHx8IGVycm5vID09IEVIT1NURE9XTgorCQkgfHwgZXJybm8gPT0gRU5FVFVOUkVBQ0ggfHwgZXJybm8gPT0gRU5FVERPV04KKwkJIHx8IGVycm5vID09IEVDT05OUkVGVVNFRCB8fCBlcnJubyA9PSBFQUREUk5PVEFWQUlMCisJCSB8fCBlcnJubyA9PSBFQUdBSU4KKwkJKSB7CisvL1RPRE86IGFsd2F5cyBkbyB0aGlzPworCQkJc2V0X25leHQocCwgZXJyb3JfaW50ZXJ2YWwoKSk7CisJCQlnb3RvIGNsb3NlX3NvY2s7CisJCX0KKwkJeGZ1bmNfZGllKCk7CisJfQorCisJaWYgKHNpemUgIT0gTlRQX01TR1NJWkVfTk9BVVRIICYmIHNpemUgIT0gTlRQX01TR1NJWkUpIHsKKwkJYmJfZXJyb3JfbXNnKCJtYWxmb3JtZWQgcGFja2V0IHJlY2VpdmVkIGZyb20gJXMiLCBwLT5wX2RvdHRlZCk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAobXNnLm1fb3JndGltZS5pbnRfcGFydGwgIT0gcC0+cF94bXRfbXNnLm1feG10dGltZS5pbnRfcGFydGwKKwkgfHwgbXNnLm1fb3JndGltZS5mcmFjdGlvbmwgIT0gcC0+cF94bXRfbXNnLm1feG10dGltZS5mcmFjdGlvbmwKKwkpIHsKKwkJZ290byBiYWlsOworCX0KKworCWlmICgobXNnLm1fc3RhdHVzICYgTElfQUxBUk0pID09IExJX0FMQVJNCisJIHx8IG1zZy5tX3N0cmF0dW0gPT0gMAorCSB8fCBtc2cubV9zdHJhdHVtID4gTlRQX01BWFNUUkFUVU0KKwkpIHsKKy8vIFRPRE86IHN0cmF0dW0gMCByZXNwb25zZXMgbWF5IGhhdmUgY29tbWFuZHMgaW4gMzItYml0IG1fcmVmaWQgZmllbGQ6CisvLyAiREVOWSIsICJSU1RSIiAtIHBlZXIgZG9lcyBub3QgbGlrZSB1cyBhdCBhbGwKKy8vICJSQVRFIiAtIHBlZXIgaXMgb3ZlcmxvYWRlZCwgcmVkdWNlIHBvbGxpbmcgZnJlcQorCQlpbnRlcnZhbCA9IGVycm9yX2ludGVydmFsKCk7CisJCWJiX2Vycm9yX21zZygicmVwbHkgZnJvbSAlczogbm90IHN5bmNlZCwgbmV4dCBxdWVyeSBpbiAldXMiLCBwLT5wX2RvdHRlZCwgaW50ZXJ2YWwpOworCQlnb3RvIGNsb3NlX3NvY2s7CisJfQorCisJLyoKKwkgKiBGcm9tIFJGQyAyMDMwICh3aXRoIGEgY29ycmVjdGlvbiB0byB0aGUgZGVsYXkgbWF0aCk6CisJICoKKwkgKiBUaW1lc3RhbXAgTmFtZSAgICAgICAgICBJRCAgIFdoZW4gR2VuZXJhdGVkCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogT3JpZ2luYXRlIFRpbWVzdGFtcCAgICAgVDEgICB0aW1lIHJlcXVlc3Qgc2VudCBieSBjbGllbnQKKwkgKiBSZWNlaXZlIFRpbWVzdGFtcCAgICAgICBUMiAgIHRpbWUgcmVxdWVzdCByZWNlaXZlZCBieSBzZXJ2ZXIKKwkgKiBUcmFuc21pdCBUaW1lc3RhbXAgICAgICBUMyAgIHRpbWUgcmVwbHkgc2VudCBieSBzZXJ2ZXIKKwkgKiBEZXN0aW5hdGlvbiBUaW1lc3RhbXAgICBUNCAgIHRpbWUgcmVwbHkgcmVjZWl2ZWQgYnkgY2xpZW50CisJICoKKwkgKiBUaGUgcm91bmR0cmlwIGRlbGF5IGFuZCBsb2NhbCBjbG9jayBvZmZzZXQgYXJlIGRlZmluZWQgYXMKKwkgKgorCSAqIGRlbGF5ID0gKFQ0IC0gVDEpIC0gKFQzIC0gVDIpOyBvZmZzZXQgPSAoKFQyIC0gVDEpICsgKFQzIC0gVDQpKSAvIDIKKwkgKi8KKwlUMSA9IHAtPnBfeG10dGltZTsKKwlUMiA9IGxmcF90b19kKG1zZy5tX3JlY3RpbWUpOworCVQzID0gbGZwX3RvX2QobXNnLm1feG10dGltZSk7CisJVDQgPSBnZXR0aW1lMTkwMGQoKTsKKworCWRhdGFwb2ludCA9ICZwLT5wX2RhdGFwb2ludFtwLT5wX2RhdGFwb2ludF9pZHhdOworCisJZGF0YXBvaW50LT5kX29mZnNldCA9ICgoVDIgLSBUMSkgKyAoVDMgLSBUNCkpIC8gMjsKKwlkYXRhcG9pbnQtPmRfZGVsYXkgPSAoVDQgLSBUMSkgLSAoVDMgLSBUMik7CisJaWYgKGRhdGFwb2ludC0+ZF9kZWxheSA8IDApIHsKKwkJYmJfZXJyb3JfbXNnKCJyZXBseSBmcm9tICVzOiBuZWdhdGl2ZSBkZWxheSAlZiIsIHAtPnBfZG90dGVkLCBkYXRhcG9pbnQtPmRfZGVsYXkpOworCQlpbnRlcnZhbCA9IGVycm9yX2ludGVydmFsKCk7CisJCXNldF9uZXh0KHAsIGludGVydmFsKTsKKwkJZ290byBjbG9zZV9zb2NrOworCX0KKwkvL1VOVVNFRDogZGF0YXBvaW50LT5kX2Vycm9yID0gKFQyIC0gVDEpIC0gKFQzIC0gVDQpOworCWRhdGFwb2ludC0+ZF9yY3ZfdGltZSA9ICh0aW1lX3QpKFQ0IC0gT0ZGU0VUXzE5MDBfMTk3MCk7IC8qID0gdGltZShOVUxMKTsgKi8KKwlkYXRhcG9pbnQtPmRfZ29vZCA9IDE7CisKKwlkYXRhcG9pbnQtPmRfbGVhcCA9IChtc2cubV9zdGF0dXMgJiBMSV9NQVNLKTsKKwkvL1VOVVNFRDogZGF0YXBvaW50LT5vX3ByZWNpc2lvbiA9IG1zZy5tX3ByZWNpc2lvbl9leHA7CisJLy9VTlVTRUQ6IGRhdGFwb2ludC0+b19yb290ZGVsYXkgPSBzZnBfdG9fZChtc2cubV9yb290ZGVsYXkpOworCS8vVU5VU0VEOiBkYXRhcG9pbnQtPm9fcm9vdGRpc3BlcnNpb24gPSBzZnBfdG9fZChtc2cubV9kaXNwZXJzaW9uKTsKKwkvL1VOVVNFRDogZGF0YXBvaW50LT5kX3JlZmlkID0gbnRvaGwobXNnLm1fcmVmaWQpOworCWRhdGFwb2ludC0+ZF9yZWZpZDQgPSBtc2cubV94bXR0aW1lLmZyYWN0aW9ubDsKKwkvL1VOVVNFRDogZGF0YXBvaW50LT5vX3JlZnRpbWUgPSBsZnBfdG9fZChtc2cubV9yZWZ0aW1lKTsKKwkvL1VOVVNFRDogZGF0YXBvaW50LT5vX3BvbGwgPSBtc2cubV9wcG9sbDsKKwlkYXRhcG9pbnQtPmRfc3RyYXR1bSA9IG1zZy5tX3N0cmF0dW07CisKKwlpZiAocC0+cF90cnVzdGxldmVsIDwgVFJVU1RMRVZFTF9QQVRIRVRJQykKKwkJaW50ZXJ2YWwgPSBzY2FsZV9pbnRlcnZhbChJTlRFUlZBTF9RVUVSWV9QQVRIRVRJQyk7CisJZWxzZSBpZiAocC0+cF90cnVzdGxldmVsIDwgVFJVU1RMRVZFTF9BR1JFU1NJVkUpCisJCWludGVydmFsID0gc2NhbGVfaW50ZXJ2YWwoSU5URVJWQUxfUVVFUllfQUdSRVNTSVZFKTsKKwllbHNlCisJCWludGVydmFsID0gc2NhbGVfaW50ZXJ2YWwoSU5URVJWQUxfUVVFUllfTk9STUFMKTsKKworCXNldF9uZXh0KHAsIGludGVydmFsKTsKKworCS8qIEV2ZXJ5IHJlY2VpdmVkIHJlcGx5IHdoaWNoIHdlIGRvIG5vdCBkaXNjYXJkIGluY3JlYXNlcyB0cnVzdCAqLworCWlmIChwLT5wX3RydXN0bGV2ZWwgPCBUUlVTVExFVkVMX01BWCkgeworCQlwLT5wX3RydXN0bGV2ZWwrKzsKKwkJaWYgKHAtPnBfdHJ1c3RsZXZlbCA9PSBUUlVTVExFVkVMX0JBRFBFRVIpCisJCQliYl9lcnJvcl9tc2coInBlZXIgJXMgbm93IHZhbGlkIiwgcC0+cF9kb3R0ZWQpOworCX0KKworCWlmIChHLnZlcmJvc2UpCisJCWJiX2Vycm9yX21zZygicmVwbHkgZnJvbSAlczogb2Zmc2V0ICVmIGRlbGF5ICVmLCBuZXh0IHF1ZXJ5IGluICV1cyIsIHAtPnBfZG90dGVkLAorCQkJZGF0YXBvaW50LT5kX29mZnNldCwgZGF0YXBvaW50LT5kX2RlbGF5LCBpbnRlcnZhbCk7CisKKwl1cGRhdGVfcGVlcl9kYXRhKHApOworLy9UT0RPOiBkbyBpdCBhZnRlciBhbGwgcGVlcnMgaGFkIGEgY2hhbmNlIHRvIHJldHVybiBhdCBsZWFzdCBvbmUgcmVwbHk/CisJc3RlcF90aW1lX29uY2UoZGF0YXBvaW50LT5kX29mZnNldCk7CisKKwlwLT5wX2RhdGFwb2ludF9pZHgrKzsKKwlpZiAocC0+cF9kYXRhcG9pbnRfaWR4ID49IE5VTV9EQVRBUE9JTlRTKQorCQlwLT5wX2RhdGFwb2ludF9pZHggPSAwOworCisgY2xvc2Vfc29jazoKKwkvKiBXZSBkbyBub3QgZXhwZWN0IGFueSBtb3JlIHBhY2tldHMgZnJvbSB0aGlzIHBlZXIgZm9yIG5vdy4KKwkgKiBDbG9zaW5nIHRoZSBzb2NrZXQgaW5mb3JtcyBrZXJuZWwgYWJvdXQgaXQuCisJICogV2Ugb3BlbiBhIG5ldyBzb2NrZXQgd2hlbiB3ZSBzZW5kIGEgbmV3IHF1ZXJ5LgorCSAqLworCWNsb3NlKHAtPnBfZmQpOworCXAtPnBfZmQgPSAtMTsKKyBiYWlsOgorCXJldHVybjsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCitzdGF0aWMgdm9pZAorcmVjdl9hbmRfcHJvY2Vzc19jbGllbnRfcGt0KHZvaWQgLyppbnQgZmQqLykKK3sKKwlzc2l6ZV90ICAgICAgICAgIHNpemU7CisJdWludDhfdCAgICAgICAgICB2ZXJzaW9uOworCWRvdWJsZSAgICAgICAgICAgcmVjdGltZTsKKwlsZW5fYW5kX3NvY2thZGRyICp0bzsKKwlzdHJ1Y3Qgc29ja2FkZHIgICpmcm9tOworCW1zZ190ICAgICAgICAgICAgbXNnOworCXVpbnQ4X3QgICAgICAgICAgcXVlcnlfc3RhdHVzOworCXVpbnQ4X3QgICAgICAgICAgcXVlcnlfcHBvbGw7CisJbF9maXhlZHB0X3QgICAgICBxdWVyeV94bXR0aW1lOworCisJdG8gPSBnZXRfc29ja19sc2EoRy5saXN0ZW5fZmQpOworCWZyb20gPSB4emFsbG9jKHRvLT5sZW4pOworCisJc2l6ZSA9IHJlY3ZfZnJvbV90byhHLmxpc3Rlbl9mZCwgJm1zZywgc2l6ZW9mKG1zZyksIE1TR19ET05UV0FJVCwgZnJvbSwgJnRvLT51LnNhLCB0by0+bGVuKTsKKwlpZiAoc2l6ZSAhPSBOVFBfTVNHU0laRV9OT0FVVEggJiYgc2l6ZSAhPSBOVFBfTVNHU0laRSkgeworCQljaGFyICphZGRyOworCQlpZiAoc2l6ZSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQkJZ290byBiYWlsOworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJyZWN2Iik7CisJCX0KKwkJYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChmcm9tKTsKKwkJYmJfZXJyb3JfbXNnKCJtYWxmb3JtZWQgcGFja2V0IHJlY2VpdmVkIGZyb20gJXM6IHNpemUgJXUiLCBhZGRyLCAoaW50KXNpemUpOworCQlmcmVlKGFkZHIpOworCQlnb3RvIGJhaWw7CisJfQorCisJcXVlcnlfc3RhdHVzID0gbXNnLm1fc3RhdHVzOworCXF1ZXJ5X3Bwb2xsID0gbXNnLm1fcHBvbGw7CisJcXVlcnlfeG10dGltZSA9IG1zZy5tX3htdHRpbWU7CisKKwkvKiBCdWlsZCBhIHJlcGx5IHBhY2tldCAqLworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLm1fc3RhdHVzID0gRy5zeW5jZWQgPyBHLmxlYXAgOiBMSV9BTEFSTTsKKwltc2cubV9zdGF0dXMgfD0gKHF1ZXJ5X3N0YXR1cyAmIFZFUlNJT05fTUFTSyk7CisJbXNnLm1fc3RhdHVzIHw9ICgocXVlcnlfc3RhdHVzICYgTU9ERV9NQVNLKSA9PSBNT0RFX0NMSUVOVCkgPworCQkJIE1PREVfU0VSVkVSIDogTU9ERV9TWU1fUEFTOworCW1zZy5tX3N0cmF0dW0gPSBHLnN0cmF0dW07CisJbXNnLm1fcHBvbGwgPSBxdWVyeV9wcG9sbDsKKwltc2cubV9wcmVjaXNpb25fZXhwID0gR19wcmVjaXNpb25fZXhwOworCXJlY3RpbWUgPSBnZXR0aW1lMTkwMGQoKTsKKwltc2cubV94bXR0aW1lID0gbXNnLm1fcmVjdGltZSA9IGRfdG9fbGZwKHJlY3RpbWUpOworCW1zZy5tX3JlZnRpbWUgPSBkX3RvX2xmcChHLnJlZnRpbWUpOworCS8vbXNnLm1feG10dGltZSA9IGRfdG9fbGZwKGdldHRpbWUxOTAwZCgpKTsgLy8gPSBtc2cubV9yZWN0aW1lCisJbXNnLm1fb3JndGltZSA9IHF1ZXJ5X3htdHRpbWU7CisJbXNnLm1fcm9vdGRlbGF5ID0gZF90b19zZnAoRy5yb290ZGVsYXkpOworCXZlcnNpb24gPSAocXVlcnlfc3RhdHVzICYgVkVSU0lPTl9NQVNLKTsgLyogLi4uID4+IFZFUlNJT05fU0hJRlQgLSBkb25lIGJlbG93IGluc3RlYWQgKi8KKwltc2cubV9yZWZpZCA9ICh2ZXJzaW9uID4gKDMgPDwgVkVSU0lPTl9TSElGVCkpID8gRy5yZWZpZDQgOiBHLnJlZmlkOworCisJLyogV2UgcmVwbHkgZnJvbSB0aGUgbG9jYWwgYWRkcmVzcyBwYWNrZXQgd2FzIHNlbnQgdG8sCisJICogdGhpcyBtYWtlcyB0by9mcm9tIGxvb2sgc3dhcHBlZCBoZXJlOiAqLworCWRvX3NlbmR0byhHLmxpc3Rlbl9mZCwKKwkJLypmcm9tOiovICZ0by0+dS5zYSwgLyp0bzoqLyBmcm9tLCAvKmFkZHJsZW46Ki8gdG8tPmxlbiwKKwkJJm1zZywgc2l6ZSk7CisKKyBiYWlsOgorCWZyZWUodG8pOworCWZyZWUoZnJvbSk7Cit9CisjZW5kaWYKKworLyogVXBzdHJlYW0gbnRwZCdzIG9wdGlvbnM6CisgKgorICogLTQgICBGb3JjZSBETlMgcmVzb2x1dGlvbiBvZiBob3N0IG5hbWVzIHRvIHRoZSBJUHY0IG5hbWVzcGFjZS4KKyAqIC02ICAgRm9yY2UgRE5TIHJlc29sdXRpb24gb2YgaG9zdCBuYW1lcyB0byB0aGUgSVB2NiBuYW1lc3BhY2UuCisgKiAtYSAgIFJlcXVpcmUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiBmb3IgYnJvYWRjYXN0IGNsaWVudCwKKyAqICAgICAgbXVsdGljYXN0IGNsaWVudCBhbmQgc3ltbWV0cmljIHBhc3NpdmUgYXNzb2NpYXRpb25zLgorICogICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICogLUEgICBEbyBub3QgcmVxdWlyZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIGZvciBicm9hZGNhc3QgY2xpZW50LAorICogICAgICBtdWx0aWNhc3QgY2xpZW50IGFuZCBzeW1tZXRyaWMgcGFzc2l2ZSBhc3NvY2lhdGlvbnMuCisgKiAgICAgIFRoaXMgaXMgYWxtb3N0IG5ldmVyIGEgZ29vZCBpZGVhLgorICogLWIgICBFbmFibGUgdGhlIGNsaWVudCB0byBzeW5jaHJvbml6ZSB0byBicm9hZGNhc3Qgc2VydmVycy4KKyAqIC1jIGNvbmZmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyAqICAgICAgZGVmYXVsdCAvZXRjL250cC5jb25mCisgKiAtZCAgIFNwZWNpZnkgZGVidWdnaW5nIG1vZGUuIFRoaXMgb3B0aW9uIG1heSBvY2N1ciBtb3JlIHRoYW4gb25jZSwKKyAqICAgICAgd2l0aCBlYWNoIG9jY3VycmVuY2UgaW5kaWNhdGluZyBncmVhdGVyIGRldGFpbCBvZiBkaXNwbGF5LgorICogLUQgbGV2ZWwKKyAqICAgICAgU3BlY2lmeSBkZWJ1Z2dpbmcgbGV2ZWwgZGlyZWN0bHkuCisgKiAtZiBkcmlmdGZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgZnJlcXVlbmN5IGZpbGUuCisgKiAgICAgIFRoaXMgaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIHRoZSAiZHJpZnRmaWxlIEZJTEUiCisgKiAgICAgIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC1nICAgTm9ybWFsbHksIG50cGQgZXhpdHMgd2l0aCBhIG1lc3NhZ2UgdG8gdGhlIHN5c3RlbSBsb2cKKyAqICAgICAgaWYgdGhlIG9mZnNldCBleGNlZWRzIHRoZSBwYW5pYyB0aHJlc2hvbGQsIHdoaWNoIGlzIDEwMDAgcworICogICAgICBieSBkZWZhdWx0LiBUaGlzIG9wdGlvbiBhbGxvd3MgdGhlIHRpbWUgdG8gYmUgc2V0IHRvIGFueSB2YWx1ZQorICogICAgICB3aXRob3V0IHJlc3RyaWN0aW9uOyBob3dldmVyLCB0aGlzIGNhbiBoYXBwZW4gb25seSBvbmNlLgorICogICAgICBJZiB0aGUgdGhyZXNob2xkIGlzIGV4Y2VlZGVkIGFmdGVyIHRoYXQsIG50cGQgd2lsbCBleGl0CisgKiAgICAgIHdpdGggYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZAorICogICAgICB3aXRoIHRoZSAtcSBhbmQgLXggb3B0aW9ucy4gU2VlIHRoZSB0aW5rZXIgY29tbWFuZCBmb3Igb3RoZXIgb3B0aW9ucy4KKyAqIC1pIGphaWxkaXIKKyAqICAgICAgQ2hyb290IHRoZSBzZXJ2ZXIgdG8gdGhlIGRpcmVjdG9yeSBqYWlsZGlyLiBUaGlzIG9wdGlvbiBhbHNvIGltcGxpZXMKKyAqICAgICAgdGhhdCB0aGUgc2VydmVyIGF0dGVtcHRzIHRvIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGF0IHN0YXJ0dXAKKyAqICAgICAgKG90aGVyd2lzZSwgY2hyb290IGdpdmVzIHZlcnkgbGl0dGxlIGFkZGl0aW9uYWwgc2VjdXJpdHkpLgorICogICAgICBZb3UgbWF5IG5lZWQgdG8gYWxzbyBzcGVjaWZ5IGEgLXUgb3B0aW9uLgorICogLWsga2V5ZmlsZQorICogICAgICBTcGVjaWZ5IHRoZSBuYW1lIGFuZCBwYXRoIG9mIHRoZSBzeW1tZXRyaWMga2V5IGZpbGUsCisgKiAgICAgIGRlZmF1bHQgL2V0Yy9udHAva2V5cy4gVGhpcyBpcyB0aGUgc2FtZSBvcGVyYXRpb24KKyAqICAgICAgYXMgdGhlICJrZXlzIEZJTEUiIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC1sIGxvZ2ZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgbG9nIGZpbGUuIFRoZSBkZWZhdWx0CisgKiAgICAgIGlzIHRoZSBzeXN0ZW0gbG9nIGZpbGUuIFRoaXMgaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzCisgKiAgICAgIHRoZSAibG9nZmlsZSBGSUxFIiBjb25maWd1cmF0aW9uIGNvbW1hbmQuCisgKiAtTCAgIERvIG5vdCBsaXN0ZW4gdG8gdmlydHVhbCBJUHMuIFRoZSBkZWZhdWx0IGlzIHRvIGxpc3Rlbi4KKyAqIC1uICAgRG9uJ3QgZm9yay4KKyAqIC1OICAgVG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sCisgKiAgICAgIHJ1biB0aGUgbnRwZCBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eS4KKyAqIC1wIHBpZGZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgZmlsZSB1c2VkIHRvIHJlY29yZCB0aGUgbnRwZAorICogICAgICBwcm9jZXNzIElELiBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgInBpZGZpbGUgRklMRSIKKyAqICAgICAgY29uZmlndXJhdGlvbiBjb21tYW5kLgorICogLVAgcHJpb3JpdHkKKyAqICAgICAgVG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sCisgKiAgICAgIHJ1biB0aGUgbnRwZCBhdCB0aGUgc3BlY2lmaWVkIHByaW9yaXR5LgorICogLXEgICBFeGl0IHRoZSBudHBkIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhlIGNsb2NrIGlzIHNldC4KKyAqICAgICAgVGhpcyBiZWhhdmlvciBtaW1pY3MgdGhhdCBvZiB0aGUgbnRwZGF0ZSBwcm9ncmFtLCB3aGljaCBpcworICogICAgICB0byBiZSByZXRpcmVkLiBUaGUgLWcgYW5kIC14IG9wdGlvbnMgY2FuIGJlIHVzZWQgd2l0aCB0aGlzIG9wdGlvbi4KKyAqICAgICAgTm90ZTogVGhlIGtlcm5lbCB0aW1lIGRpc2NpcGxpbmUgaXMgZGlzYWJsZWQgd2l0aCB0aGlzIG9wdGlvbi4KKyAqIC1yIGJyb2FkY2FzdGRlbGF5CisgKiAgICAgIFNwZWNpZnkgdGhlIGRlZmF1bHQgcHJvcGFnYXRpb24gZGVsYXkgZnJvbSB0aGUgYnJvYWRjYXN0L211bHRpY2FzdAorICogICAgICBzZXJ2ZXIgdG8gdGhpcyBjbGllbnQuIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgaWYgdGhlIGRlbGF5CisgKiAgICAgIGNhbm5vdCBiZSBjb21wdXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwcm90b2NvbC4KKyAqIC1zIHN0YXRzZGlyCisgKiAgICAgIFNwZWNpZnkgdGhlIGRpcmVjdG9yeSBwYXRoIGZvciBmaWxlcyBjcmVhdGVkIGJ5IHRoZSBzdGF0aXN0aWNzCisgKiAgICAgIGZhY2lsaXR5LiBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgInN0YXRzZGlyIERJUiIKKyAqICAgICAgY29uZmlndXJhdGlvbiBjb21tYW5kLgorICogLXQga2V5CisgKiAgICAgIEFkZCBhIGtleSBudW1iZXIgdG8gdGhlIHRydXN0ZWQga2V5IGxpc3QuIFRoaXMgb3B0aW9uIGNhbiBvY2N1cgorICogICAgICBtb3JlIHRoYW4gb25jZS4KKyAqIC11IHVzZXJbOmdyb3VwXQorICogICAgICBTcGVjaWZ5IGEgdXNlciwgYW5kIG9wdGlvbmFsbHkgYSBncm91cCwgdG8gc3dpdGNoIHRvLgorICogLXYgdmFyaWFibGUKKyAqIC1WIHZhcmlhYmxlCisgKiAgICAgIEFkZCBhIHN5c3RlbSB2YXJpYWJsZSBsaXN0ZWQgYnkgZGVmYXVsdC4KKyAqIC14ICAgTm9ybWFsbHksIHRoZSB0aW1lIGlzIHNsZXdlZCBpZiB0aGUgb2Zmc2V0IGlzIGxlc3MgdGhhbiB0aGUgc3RlcAorICogICAgICB0aHJlc2hvbGQsIHdoaWNoIGlzIDEyOCBtcyBieSBkZWZhdWx0LCBhbmQgc3RlcHBlZCBpZiBhYm92ZQorICogICAgICB0aGUgdGhyZXNob2xkLiBUaGlzIG9wdGlvbiBzZXRzIHRoZSB0aHJlc2hvbGQgdG8gNjAwIHMsIHdoaWNoIGlzCisgKiAgICAgIHdlbGwgd2l0aGluIHRoZSBhY2N1cmFjeSB3aW5kb3cgdG8gc2V0IHRoZSBjbG9jayBtYW51YWxseS4KKyAqICAgICAgTm90ZTogc2luY2UgdGhlIHNsZXcgcmF0ZSBvZiB0eXBpY2FsIFVuaXgga2VybmVscyBpcyBsaW1pdGVkCisgKiAgICAgIHRvIDAuNSBtcy9zLCBlYWNoIHNlY29uZCBvZiBhZGp1c3RtZW50IHJlcXVpcmVzIGFuIGFtb3J0aXphdGlvbgorICogICAgICBpbnRlcnZhbCBvZiAyMDAwIHMuIFRodXMsIGFuIGFkanVzdG1lbnQgYXMgbXVjaCBhcyA2MDAgcworICogICAgICB3aWxsIHRha2UgYWxtb3N0IDE0IGRheXMgdG8gY29tcGxldGUuIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkCisgKiAgICAgIHdpdGggdGhlIC1nIGFuZCAtcSBvcHRpb25zLiBTZWUgdGhlIHRpbmtlciBjb21tYW5kIGZvciBvdGhlciBvcHRpb25zLgorICogICAgICBOb3RlOiBUaGUga2VybmVsIHRpbWUgZGlzY2lwbGluZSBpcyBkaXNhYmxlZCB3aXRoIHRoaXMgb3B0aW9uLgorICovCisKKy8qIEJ5IGRvaW5nIGluaXQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3ZSBkZWNyZWFzZSBzdGFjayB1c2FnZQorICogaW4gbWFpbiBsb29wLgorICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBudHBfaW5pdChjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWxsaXN0X3QgKnBlZXJzOworCisJc3JhbmRvbShnZXRwaWQoKSk7CisKKwlpZiAoZ2V0dWlkKCkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKworCXBlZXJzID0gTlVMTDsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJkZDpwOjoiOyAvKiBkOiBjb3VudGVyLCBwOiBsaXN0ICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsCisJCQkibnFOeCIgLyogY29tcGF0ICovCisJCQkicDoiSUZfRkVBVFVSRV9OVFBEX1NFUlZFUigibCIpIC8qIE5PVCBjb21wYXQgKi8KKwkJCSJkIiAvKiBjb21wYXQgKi8KKwkJCSI0NmFBYmdMIiwgLyogY29tcGF0LCBpZ25vcmVkICovCisJCQkmcGVlcnMsICZHLnZlcmJvc2UpOworCWlmICghKG9wdHMgJiAoT1BUX3B8T1BUX2wpKSkKKwkJYmJfc2hvd191c2FnZSgpOworCWlmIChvcHRzICYgT1BUX3gpIC8qIGRpc2FibGUgc3RlcHBpbmcsIG9ubHkgc2xldyBpcyBhbGxvd2VkICovCisJCUcudGltZV93YXNfc3RlcHBlZCA9IDE7CisJd2hpbGUgKHBlZXJzKQorCQlhZGRfcGVlcnMobGxpc3RfcG9wKCZwZWVycykpOworCWlmICghKG9wdHMgJiBPUFRfbikpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9ERVZOVUxMX1NURElPLCBhcmd2KTsKKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIKKwlHLmxpc3Rlbl9mZCA9IC0xOworCWlmIChvcHRzICYgT1BUX2wpIHsKKwkJRy5saXN0ZW5fZmQgPSBjcmVhdGVfYW5kX2JpbmRfZGdyYW1fb3JfZGllKE5VTEwsIDEyMyk7CisJCXNvY2tldF93YW50X3BrdGluZm8oRy5saXN0ZW5fZmQpOworCQlzZXRzb2Nrb3B0KEcubGlzdGVuX2ZkLCBJUFBST1RPX0lQLCBJUF9UT1MsICZjb25zdF9JUFRPU19MT1dERUxBWSwgc2l6ZW9mKGNvbnN0X0lQVE9TX0xPV0RFTEFZKSk7CisJfQorI2VuZGlmCisJLyogSSBoZXNpdGF0ZSB0byBzZXQgLTIwIHByaW8uIC0xNSBzaG91bGQgYmUgaGlnaCBlbm91Z2ggZm9yIHRpbWVrZWVwaW5nICovCisJaWYgKG9wdHMgJiBPUFRfTikKKwkJc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCAtMTUpOworCisJLyogU2V0IHNvbWUgZ2xvYmFscyAqLworI2lmIDAKKwkvKiBXaXRoIGNvbnN0YW50IGIgPSAxMDAsIEcucHJlY2lzaW9uX2V4cCBpcyBhbHNvIGNvbnN0YW50IC02LgorCSAqIFVuY29tbWVudCB0aGlzIGFuZCB5b3UnbGwgc2VlICovCisJeworCQlpbnQgcHJlYyA9IDA7CisJCWludCBiOworIyBpZiAwCisJCXN0cnVjdCB0aW1lc3BlYyB0cDsKKwkJLyogV2UgY2FuIHVzZSBzeXNfY2xvY2tfZ2V0cmVzIGJ1dCBhc3N1bWluZyAxMG1zIHRpY2sgc2hvdWxkIGJlIGZpbmUgKi8KKwkJY2xvY2tfZ2V0cmVzKENMT0NLX1JFQUxUSU1FLCAmdHApOworCQl0cC50dl9zZWMgPSAwOworCQl0cC50dl9uc2VjID0gMTAwMDAwMDA7CisJCWIgPSAxMDAwMDAwMDAwIC8gdHAudHZfbnNlYzsgIC8qIGNvbnZlcnQgdG8gSHogKi8KKyMgZWxzZQorCQliID0gMTAwOyAvKiBiID0gMTAwMDAwMDAwMC8xMDAwMDAwMCA9IDEwMCAqLworIyBlbmRpZgorCQl3aGlsZSAoYiA+IDEpCisJCQlwcmVjLS0sIGIgPj49IDE7CisJCS8vRy5wcmVjaXNpb25fZXhwID0gcHJlYzsKKwkJYmJfZXJyb3JfbXNnKCJHLnByZWNpc2lvbl9leHA6JWQiLCBwcmVjKTsgLyogLTYgKi8KKwl9CisjZW5kaWYKKwlHLnNjYWxlID0gMTsKKworCWJiX3NpZ25hbHMoKDEgPDwgU0lHVEVSTSkgfCAoMSA8PCBTSUdJTlQpLCByZWNvcmRfc2lnbm8pOworCWJiX3NpZ25hbHMoKDEgPDwgU0lHUElQRSkgfCAoMSA8PCBTSUdIVVApLCBTSUdfSUdOKTsKK30KKworaW50IG50cGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBudHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ2xvYmFscyBnOworCXN0cnVjdCBwb2xsZmQgKnBmZDsKKwlwZWVyX3QgKippZHgycGVlcjsKKworCW1lbXNldCgmZywgMCwgc2l6ZW9mKGcpKTsKKwlTRVRfUFRSX1RPX0dMT0JBTFMoJmcpOworCisJbnRwX2luaXQoYXJndik7CisKKwl7CisJCS8qIGlmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSLCArIDEgZm9yIGxpc3Rlbl9mZDogKi8KKwkJdW5zaWduZWQgY250ID0gZy5wZWVyX2NudCArIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSOworCQlpZHgycGVlciA9IHh6YWxsb2Moc2l6ZW9mKGlkeDJwZWVyWzBdKSAqIGNudCk7CisJCXBmZCA9IHh6YWxsb2Moc2l6ZW9mKHBmZFswXSkgKiBjbnQpOworCX0KKworCXdoaWxlICghYmJfZ290X3NpZ25hbCkgeworCQlsbGlzdF90ICppdGVtOworCQl1bnNpZ25lZCBpLCBqOworCQl1bnNpZ25lZCBzZW50X2NudCwgdHJpYWxfY250OworCQlpbnQgbmZkcywgdGltZW91dDsKKwkJdGltZV90IGN1cl90aW1lLCBuZXh0YWN0aW9uOworCisJCS8qIE5vdGhpbmcgYmV0d2VlbiBoZXJlIGFuZCBwb2xsKCkgYmxvY2tzIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZSAqLworCisJCWN1cl90aW1lID0gdGltZShOVUxMKTsKKwkJbmV4dGFjdGlvbiA9IGN1cl90aW1lICsgMzYwMDsKKworCQlpID0gMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorCQlpZiAoZy5saXN0ZW5fZmQgIT0gLTEpIHsKKwkJCXBmZFswXS5mZCA9IGcubGlzdGVuX2ZkOworCQkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJCWkrKzsKKwkJfQorI2VuZGlmCisJCS8qIFBhc3Mgb3ZlciBwZWVyIGxpc3QsIHNlbmQgcmVxdWVzdHMsIHRpbWUgb3V0IG9uIHJlY2VpdmVzICovCisJCXNlbnRfY250ID0gdHJpYWxfY250ID0gMDsKKwkJZm9yIChpdGVtID0gZy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCXBlZXJfdCAqcCA9IChwZWVyX3QgKikgaXRlbS0+ZGF0YTsKKworCQkJLyogT3ZlcmZsb3ctc2FmZSAiaWYgKHAtPm5leHRfYWN0aW9uX3RpbWUgPD0gY3VyX3RpbWUpIC4uLiIgKi8KKwkJCWlmICgoaW50KShjdXJfdGltZSAtIHAtPm5leHRfYWN0aW9uX3RpbWUpID49IDApIHsKKwkJCQlpZiAocC0+cF9mZCA9PSAtMSkgeworCQkJCQkvKiBUaW1lIHRvIHNlbmQgbmV3IHJlcSAqLworCQkJCQl0cmlhbF9jbnQrKzsKKwkJCQkJaWYgKHNlbmRfcXVlcnlfdG9fcGVlcihwKSA9PSAwKQorCQkJCQkJc2VudF9jbnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgcmVwbHkgKi8KKwkJCQkJY2xvc2UocC0+cF9mZCk7CisJCQkJCXAtPnBfZmQgPSAtMTsKKwkJCQkJdGltZW91dCA9IGVycm9yX2ludGVydmFsKCk7CisJCQkJCWJiX2Vycm9yX21zZygidGltZWQgb3V0IHdhaXRpbmcgZm9yICVzLCAiCisJCQkJCQkJIm5leHQgcXVlcnkgaW4gJXVzIiwgcC0+cF9kb3R0ZWQsIHRpbWVvdXQpOworCQkJCQlpZiAocC0+cF90cnVzdGxldmVsID49IFRSVVNUTEVWRUxfQkFEUEVFUikgeworCQkJCQkJcC0+cF90cnVzdGxldmVsIC89IDI7CisJCQkJCQlpZiAocC0+cF90cnVzdGxldmVsIDwgVFJVU1RMRVZFTF9CQURQRUVSKQorCQkJCQkJCWJiX2Vycm9yX21zZygicGVlciAlcyBub3cgaW52YWxpZCIsIHAtPnBfZG90dGVkKTsKKwkJCQkJfQorCQkJCQlzZXRfbmV4dChwLCB0aW1lb3V0KTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwLT5uZXh0X2FjdGlvbl90aW1lIDwgbmV4dGFjdGlvbikKKwkJCQluZXh0YWN0aW9uID0gcC0+bmV4dF9hY3Rpb25fdGltZTsKKworCQkJaWYgKHAtPnBfZmQgPj0gMCkgeworCQkJCS8qIFdhaXQgZm9yIHJlcGx5IGZyb20gdGhpcyBwZWVyICovCisJCQkJcGZkW2ldLmZkID0gcC0+cF9mZDsKKwkJCQlwZmRbaV0uZXZlbnRzID0gUE9MTElOOworCQkJCWlkeDJwZWVyW2ldID0gcDsKKwkJCQlpKys7CisJCQl9CisJCX0KKworCQlpZiAoKHRyaWFsX2NudCA+IDAgJiYgc2VudF9jbnQgPT0gMCkgfHwgZy5wZWVyX2NudCA9PSAwKQorCQkJc3RlcF90aW1lX29uY2UoMCk7IC8qIG5vIGdvb2QgcGVlcnMsIGRvbid0IHdhaXQgKi8KKworCQl0aW1lb3V0ID0gbmV4dGFjdGlvbiAtIGN1cl90aW1lOworCQlpZiAodGltZW91dCA8IDEpCisJCQl0aW1lb3V0ID0gMTsKKworCQkvKiBIZXJlIHdlIG1heSBibG9jayAqLworCQlpZiAoZy52ZXJib3NlID49IDIpCisJCQliYl9lcnJvcl9tc2coInBvbGwgJXVzLCBzb2NrZXRzOiV1IiwgdGltZW91dCwgaSk7CisJCW5mZHMgPSBwb2xsKHBmZCwgaSwgdGltZW91dCAqIDEwMDApOworCQlpZiAobmZkcyA8PSAwKQorCQkJY29udGludWU7CisKKwkJLyogUHJvY2VzcyBhbnkgcmVjZWl2ZWQgcGFja2V0cyAqLworCQlqID0gMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorCQlpZiAoZy5saXN0ZW5fZmQgIT0gLTEpIHsKKwkJCWlmIChwZmRbMF0ucmV2ZW50cyAvKiAmIChQT0xMSU58UE9MTEVSUikqLykgeworCQkJCW5mZHMtLTsKKwkJCQlyZWN2X2FuZF9wcm9jZXNzX2NsaWVudF9wa3QoLypnLmxpc3Rlbl9mZCovKTsKKwkJCX0KKwkJCWogPSAxOworCQl9CisjZW5kaWYKKwkJZm9yICg7IG5mZHMgIT0gMCAmJiBqIDwgaTsgaisrKSB7CisJCQlpZiAocGZkW2pdLnJldmVudHMgLyogJiAoUE9MTElOfFBPTExFUlIpKi8pIHsKKwkJCQluZmRzLS07CisJCQkJcmVjdl9hbmRfcHJvY2Vzc19wZWVyX3BrdChpZHgycGVlcltqXSk7CisJCQl9CisJCX0KKwl9IC8qIHdoaWxlICghYmJfZ290X3NpZ25hbCkgKi8KKworCWtpbGxfbXlzZWxmX3dpdGhfc2lnKGJiX2dvdF9zaWduYWwpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9waW5nLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3BpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ0ZjIxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9waW5nLmMKQEAgLTAsMCArMSw5NDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcGluZyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKyAqCisgKiBBZGFwdGVkIGZyb20gdGhlIHBpbmcgaW4gbmV0a2l0LWJhc2UgMC4xMDoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBNaWtlIE11dXNzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIGZyb20gcGluZzYuYzoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIHZlcnNpb24gb2YgcGluZyBpcyBhZGFwdGVkIGZyb20gdGhlIHBpbmcgaW4gbmV0a2l0LWJhc2UgMC4xMCwKKyAqIHdoaWNoIGlzOgorICoKKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKgorICogVGhpcyB2ZXJzaW9uIGlzIGFuIGFkYXB0YXRpb24gb2YgcGluZy5jIGZyb20gYnVzeWJveC4KKyAqIFRoZSBjb2RlIHdhcyBtb2RpZmllZCBieSBCYXJ0IFZpc3NjaGVyIDxtYWdpY2tAbGludXgtZmFuLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmZGVmIF9fQklPTklDX18KKy8qIHNob3VsZCBiZSBpbiBuZXRpbmV0L2lwX2ljbXAuaCAqLworIyBkZWZpbmUgSUNNUF9ERVNUX1VOUkVBQ0ggICAgMyAgLyogRGVzdGluYXRpb24gVW5yZWFjaGFibGUgICovCisjIGRlZmluZSBJQ01QX1NPVVJDRV9RVUVOQ0ggICA0ICAvKiBTb3VyY2UgUXVlbmNoICAgICovCisjIGRlZmluZSBJQ01QX1JFRElSRUNUICAgICAgICA1ICAvKiBSZWRpcmVjdCAoY2hhbmdlIHJvdXRlKSAgKi8KKyMgZGVmaW5lIElDTVBfRUNITyAgICAgICAgICAgIDggIC8qIEVjaG8gUmVxdWVzdCAgICAgICovCisjIGRlZmluZSBJQ01QX1RJTUVfRVhDRUVERUQgIDExICAvKiBUaW1lIEV4Y2VlZGVkICAgICovCisjIGRlZmluZSBJQ01QX1BBUkFNRVRFUlBST0IgIDEyICAvKiBQYXJhbWV0ZXIgUHJvYmxlbSAgICAqLworIyBkZWZpbmUgSUNNUF9USU1FU1RBTVAgICAgICAxMyAgLyogVGltZXN0YW1wIFJlcXVlc3QgICAgKi8KKyMgZGVmaW5lIElDTVBfVElNRVNUQU1QUkVQTFkgMTQgIC8qIFRpbWVzdGFtcCBSZXBseSAgICAqLworIyBkZWZpbmUgSUNNUF9JTkZPX1JFUVVFU1QgICAxNSAgLyogSW5mb3JtYXRpb24gUmVxdWVzdCAgICAqLworIyBkZWZpbmUgSUNNUF9JTkZPX1JFUExZICAgICAxNiAgLyogSW5mb3JtYXRpb24gUmVwbHkgICAgKi8KKyMgZGVmaW5lIElDTVBfQUREUkVTUyAgICAgICAgMTcgIC8qIEFkZHJlc3MgTWFzayBSZXF1ZXN0ICAgICovCisjIGRlZmluZSBJQ01QX0FERFJFU1NSRVBMWSAgIDE4ICAvKiBBZGRyZXNzIE1hc2sgUmVwbHkgICAgKi8KKyNlbmRpZgorCisvL2NvbmZpZzpjb25maWcgUElORworLy9jb25maWc6CWJvb2wgInBpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgcGluZyB1c2VzIHRoZSBJQ01QIHByb3RvY29sJ3MgbWFuZGF0b3J5IEVDSE9fUkVRVUVTVCBkYXRhZ3JhbSB0bworLy9jb25maWc6CSAgZWxpY2l0IGFuIElDTVAgRUNIT19SRVNQT05TRSBmcm9tIGEgaG9zdCBvciBnYXRld2F5LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgUElORzYKKy8vY29uZmlnOglib29sICJwaW5nNiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZFQVRVUkVfSVBWNiAmJiBQSU5HCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyB3aWxsIGdpdmUgeW91IGEgcGluZyB0aGF0IGNhbiB0YWxrIElQdjYuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZBTkNZX1BJTkcKKy8vY29uZmlnOglib29sICJFbmFibGUgZmFuY3kgcGluZyBvdXRwdXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBQSU5HCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWFrZSB0aGUgb3V0cHV0IGZyb20gdGhlIHBpbmcgYXBwbGV0IGluY2x1ZGUgc3RhdGlzdGljcywgYW5kIGF0IHRoZQorLy9jb25maWc6CSAgc2FtZSB0aW1lIHByb3ZpZGUgZnVsbCBzdXBwb3J0IGZvciBJQ01QIHBhY2tldHMuCisKKy8qIE5lZWRzIHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19JQ01QKSwgdGhlcmVmb3JlIEJCX1NVSURfTUFZQkU6ICovCisvL2FwcGxldDpJRl9QSU5HKEFQUExFVChwaW5nLCBCQl9ESVJfQklOLCBCQl9TVUlEX01BWUJFKSkKKy8vYXBwbGV0OklGX1BJTkc2KEFQUExFVChwaW5nNiwgQkJfRElSX0JJTiwgQkJfU1VJRF9NQVlCRSkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19QSU5HKSAgKz0gcGluZy5vCisvL2tidWlsZDpsaWItJChDT05GSUdfUElORzYpICs9IHBpbmcubworCisvL3VzYWdlOiNpZiAhRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfUElORworLy91c2FnZTojIGRlZmluZSBwaW5nX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJIT1NUIgorLy91c2FnZTojIGRlZmluZSBwaW5nX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBJQ01QIEVDSE9fUkVRVUVTVCBwYWNrZXRzIHRvIG5ldHdvcmsgaG9zdHMiCisvL3VzYWdlOiMgZGVmaW5lIHBpbmc2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJIT1NUIgorLy91c2FnZTojIGRlZmluZSBwaW5nNl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgSUNNUCBFQ0hPX1JFUVVFU1QgcGFja2V0cyB0byBuZXR3b3JrIGhvc3RzIgorLy91c2FnZTojZWxzZQorLy91c2FnZTojIGRlZmluZSBwaW5nX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gSE9TVCIKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgSUNNUCBFQ0hPX1JFUVVFU1QgcGFja2V0cyB0byBuZXR3b3JrIGhvc3RzXG4iCisvL3VzYWdlOiAgICAgIlxuCS00LC02CQlGb3JjZSBJUCBvciBJUHY2IG5hbWUgcmVzb2x1dGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgQ05UCQlTZW5kIG9ubHkgQ05UIHBpbmdzIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlTZW5kIFNJWkUgZGF0YSBieXRlcyBpbiBwYWNrZXRzIChkZWZhdWx0OjU2KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgVFRMCQlTZXQgVFRMIgorLy91c2FnZTogICAgICJcbgktSSBJRkFDRS9JUAlVc2UgaW50ZXJmYWNlIG9yIElQIGFkZHJlc3MgYXMgc291cmNlIgorLy91c2FnZTogICAgICJcbgktVyBTRUMJCVNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGZpcnN0IHJlc3BvbnNlIChkZWZhdWx0OjEwKSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkoYWZ0ZXIgYWxsIC1jIENOVCBwYWNrZXRzIGFyZSBzZW50KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXcgU0VDCQlTZWNvbmRzIHVudGlsIHBpbmcgZXhpdHMgKGRlZmF1bHQ6aW5maW5pdGUpIgorLy91c2FnZTogICAgICJcbgkJCShjYW4gZXhpdCBlYXJsaWVyIHdpdGggLWMgQ05UKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCVF1aWV0LCBvbmx5IGRpc3BsYXlzIG91dHB1dCBhdCBzdGFydCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlhbmQgd2hlbiBmaW5pc2hlZCIKKy8vdXNhZ2U6CisvL3VzYWdlOiMgZGVmaW5lIHBpbmc2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gSE9TVCIKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZzZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIElDTVAgRUNIT19SRVFVRVNUIHBhY2tldHMgdG8gbmV0d29yayBob3N0c1xuIgorLy91c2FnZTogICAgICJcbgktYyBDTlQJCVNlbmQgb25seSBDTlQgcGluZ3MiCisvL3VzYWdlOiAgICAgIlxuCS1zIFNJWkUJCVNlbmQgU0laRSBkYXRhIGJ5dGVzIGluIHBhY2tldHMgKGRlZmF1bHQ6NTYpIgorLy91c2FnZTogICAgICJcbgktSSBJRkFDRS9JUAlVc2UgaW50ZXJmYWNlIG9yIElQIGFkZHJlc3MgYXMgc291cmNlIgorLy91c2FnZTogICAgICJcbgktcQkJUXVpZXQsIG9ubHkgZGlzcGxheXMgb3V0cHV0IGF0IHN0YXJ0IgorLy91c2FnZTogICAgICJcbgkJCWFuZCB3aGVuIGZpbmlzaGVkIgorLy91c2FnZToKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHBpbmdfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcGluZyBsb2NhbGhvc3RcbiIKKy8vdXNhZ2U6ICAgICAgICJQSU5HIHNsYWcgKDEyNy4wLjAuMSk6IDU2IGRhdGEgYnl0ZXNcbiIKKy8vdXNhZ2U6ICAgICAgICI2NCBieXRlcyBmcm9tIDEyNy4wLjAuMTogaWNtcF9zZXE9MCB0dGw9MjU1IHRpbWU9MjAuMSBtc1xuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIi0tLSBkZWJpYW4gcGluZyBzdGF0aXN0aWNzIC0tLVxuIgorLy91c2FnZTogICAgICAgIjEgcGFja2V0cyB0cmFuc21pdHRlZCwgMSBwYWNrZXRzIHJlY2VpdmVkLCAwJSBwYWNrZXQgbG9zc1xuIgorLy91c2FnZTogICAgICAgInJvdW5kLXRyaXAgbWluL2F2Zy9tYXggPSAyMC4xLzIwLjEvMjAuMSBtc1xuIgorLy91c2FnZTojZGVmaW5lIHBpbmc2X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHBpbmc2IGlwNi1sb2NhbGhvc3RcbiIKKy8vdXNhZ2U6ICAgICAgICJQSU5HIGlwNi1sb2NhbGhvc3QgKDo6MSk6IDU2IGRhdGEgYnl0ZXNcbiIKKy8vdXNhZ2U6ICAgICAgICI2NCBieXRlcyBmcm9tIDo6MTogaWNtcDZfc2VxPTAgdHRsPTY0IHRpbWU9MjAuMSBtc1xuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIi0tLSBpcDYtbG9jYWxob3N0IHBpbmcgc3RhdGlzdGljcyAtLS1cbiIKKy8vdXNhZ2U6ICAgICAgICIxIHBhY2tldHMgdHJhbnNtaXR0ZWQsIDEgcGFja2V0cyByZWNlaXZlZCwgMCUgcGFja2V0IGxvc3NcbiIKKy8vdXNhZ2U6ICAgICAgICJyb3VuZC10cmlwIG1pbi9hdmcvbWF4ID0gMjAuMS8yMC4xLzIwLjEgbXNcbiIKKworI2lmIEVOQUJMRV9QSU5HNgorIyBpbmNsdWRlIDxuZXRpbmV0L2ljbXA2Lmg+CisvKiBJIHNlZSBSRU5VTUJFUkVEIGNvbnN0YW50cyBpbiBiaXRzL2luLmggLSAhIT8KKyAqIFdoYXQgYSBmdWNrIGlzIGdvaW5nIG9uIHdpdGggbGliYz8gSXMgaXQgYSBnbGliYyBqb2tlPyAqLworIyBpZmRlZiBJUFY2XzIyOTJIT1BMSU1JVAorIyAgdW5kZWYgSVBWNl9IT1BMSU1JVAorIyAgZGVmaW5lIElQVjZfSE9QTElNSVQgSVBWNl8yMjkySE9QTElNSVQKKyMgZW5kaWYKKyNlbmRpZgorCitlbnVtIHsKKwlERUZEQVRBTEVOID0gNTYsCisJTUFYSVBMRU4gPSA2MCwKKwlNQVhJQ01QTEVOID0gNzYsCisJTUFYX0RVUF9DSEsgPSAoOCAqIDEyOCksCisJTUFYV0FJVCA9IDEwLAorCVBJTkdJTlRFUlZBTCA9IDEsIC8qIDEgc2Vjb25kICovCit9OworCisvKiBDb21tb24gcm91dGluZXMgKi8KKworc3RhdGljIGludCBpbl9ja3N1bSh1bnNpZ25lZCBzaG9ydCAqYnVmLCBpbnQgc3opCit7CisJaW50IG5sZWZ0ID0gc3o7CisJaW50IHN1bSA9IDA7CisJdW5zaWduZWQgc2hvcnQgKncgPSBidWY7CisJdW5zaWduZWQgc2hvcnQgYW5zID0gMDsKKworCXdoaWxlIChubGVmdCA+IDEpIHsKKwkJc3VtICs9ICp3Kys7CisJCW5sZWZ0IC09IDI7CisJfQorCisJaWYgKG5sZWZ0ID09IDEpIHsKKwkJKih1bnNpZ25lZCBjaGFyICopICgmYW5zKSA9ICoodW5zaWduZWQgY2hhciAqKSB3OworCQlzdW0gKz0gYW5zOworCX0KKworCXN1bSA9IChzdW0gPj4gMTYpICsgKHN1bSAmIDB4RkZGRik7CisJc3VtICs9IChzdW0gPj4gMTYpOworCWFucyA9IH5zdW07CisJcmV0dXJuIGFuczsKK30KKworI2lmICFFTkFCTEVfRkVBVFVSRV9GQU5DWV9QSU5HCisKKy8qIFNpbXBsZSB2ZXJzaW9uICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICpob3N0bmFtZTsKKwljaGFyIHBhY2tldFtERUZEQVRBTEVOICsgTUFYSVBMRU4gKyBNQVhJQ01QTEVOXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgbm9yZXNwKGludCBpZ24gVU5VU0VEX1BBUkFNKQoreworCXByaW50ZigiTm8gcmVzcG9uc2UgZnJvbSAlc1xuIiwgRy5ob3N0bmFtZSk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitzdGF0aWMgdm9pZCBwaW5nNChsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJc3RydWN0IGljbXAgKnBrdDsKKwlpbnQgcGluZ3NvY2ssIGM7CisKKwlwaW5nc29jayA9IGNyZWF0ZV9pY21wX3NvY2tldCgpOworCisJcGt0ID0gKHN0cnVjdCBpY21wICopIEcucGFja2V0OworCW1lbXNldChwa3QsIDAsIHNpemVvZihHLnBhY2tldCkpOworCXBrdC0+aWNtcF90eXBlID0gSUNNUF9FQ0hPOworCXBrdC0+aWNtcF9ja3N1bSA9IGluX2Nrc3VtKCh1bnNpZ25lZCBzaG9ydCAqKSBwa3QsIHNpemVvZihHLnBhY2tldCkpOworCisJeHNlbmR0byhwaW5nc29jaywgRy5wYWNrZXQsIERFRkRBVEFMRU4gKyBJQ01QX01JTkxFTiwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCisJLyogbGlzdGVuIGZvciByZXBsaWVzICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIGZyb207CisJCXNvY2tsZW5fdCBmcm9tbGVuID0gc2l6ZW9mKGZyb20pOworCisJCWMgPSByZWN2ZnJvbShwaW5nc29jaywgRy5wYWNrZXQsIHNpemVvZihHLnBhY2tldCksIDAsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmZnJvbSwgJmZyb21sZW4pOworCQlpZiAoYyA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQliYl9wZXJyb3JfbXNnKCJyZWN2ZnJvbSIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPj0gNzYpIHsJCQkvKiBpcCArIGljbXAgKi8KKwkJCXN0cnVjdCBpcGhkciAqaXBoZHIgPSAoc3RydWN0IGlwaGRyICopIEcucGFja2V0OworCisJCQlwa3QgPSAoc3RydWN0IGljbXAgKikgKEcucGFja2V0ICsgKGlwaGRyLT5paGwgPDwgMikpOwkvKiBza2lwIGlwIGhkciAqLworCQkJaWYgKHBrdC0+aWNtcF90eXBlID09IElDTVBfRUNIT1JFUExZKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UocGluZ3NvY2spOworfQorCisjaWYgRU5BQkxFX1BJTkc2CitzdGF0aWMgdm9pZCBwaW5nNihsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJc3RydWN0IGljbXA2X2hkciAqcGt0OworCWludCBwaW5nc29jaywgYzsKKwlpbnQgc29ja29wdDsKKworCXBpbmdzb2NrID0gY3JlYXRlX2ljbXA2X3NvY2tldCgpOworCisJcGt0ID0gKHN0cnVjdCBpY21wNl9oZHIgKikgRy5wYWNrZXQ7CisJbWVtc2V0KHBrdCwgMCwgc2l6ZW9mKEcucGFja2V0KSk7CisJcGt0LT5pY21wNl90eXBlID0gSUNNUDZfRUNIT19SRVFVRVNUOworCisJc29ja29wdCA9IG9mZnNldG9mKHN0cnVjdCBpY21wNl9oZHIsIGljbXA2X2Nrc3VtKTsKKwlzZXRzb2Nrb3B0KHBpbmdzb2NrLCBTT0xfUkFXLCBJUFY2X0NIRUNLU1VNLCAmc29ja29wdCwgc2l6ZW9mKHNvY2tvcHQpKTsKKworCXhzZW5kdG8ocGluZ3NvY2ssIEcucGFja2V0LCBERUZEQVRBTEVOICsgc2l6ZW9mKHN0cnVjdCBpY21wNl9oZHIpLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7CisKKwkvKiBsaXN0ZW4gZm9yIHJlcGxpZXMgKi8KKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IGZyb207CisJCXNvY2tsZW5fdCBmcm9tbGVuID0gc2l6ZW9mKGZyb20pOworCisJCWMgPSByZWN2ZnJvbShwaW5nc29jaywgRy5wYWNrZXQsIHNpemVvZihHLnBhY2tldCksIDAsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmZnJvbSwgJmZyb21sZW4pOworCQlpZiAoYyA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQliYl9wZXJyb3JfbXNnKCJyZWN2ZnJvbSIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPj0gSUNNUF9NSU5MRU4pIHsJCQkvKiBpY21wNl9oZHIgKi8KKwkJCXBrdCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopIEcucGFja2V0OworCQkJaWYgKHBrdC0+aWNtcDZfdHlwZSA9PSBJQ01QNl9FQ0hPX1JFUExZKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UocGluZ3NvY2spOworfQorI2VuZGlmCisKKyNpZiAhRU5BQkxFX1BJTkc2CisjIGRlZmluZSBjb21tb25fcGluZ19tYWluKGFmLCBhcmd2KSBjb21tb25fcGluZ19tYWluKGFyZ3YpCisjZW5kaWYKK3N0YXRpYyBpbnQgY29tbW9uX3BpbmdfbWFpbihzYV9mYW1pbHlfdCBhZiwgY2hhciAqKmFyZ3YpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfUElORzYKKwl3aGlsZSAoKCsrYXJndilbMF0gJiYgYXJndlswXVswXSA9PSAnLScpIHsKKwkJaWYgKGFyZ3ZbMF1bMV0gPT0gJzQnKSB7CisJCQlhZiA9IEFGX0lORVQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXJndlswXVsxXSA9PSAnNicpIHsKKwkJCWFmID0gQUZfSU5FVDY7CisJCQljb250aW51ZTsKKwkJfQorCQliYl9zaG93X3VzYWdlKCk7CisJfQorI2Vsc2UKKwlhcmd2Kys7CisjZW5kaWYKKworCUcuaG9zdG5hbWUgPSAqYXJndjsKKwlpZiAoIUcuaG9zdG5hbWUpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworI2lmIEVOQUJMRV9QSU5HNgorCWxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihHLmhvc3RuYW1lLCAwLCBhZik7CisjZWxzZQorCWxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihHLmhvc3RuYW1lLCAwLCBBRl9JTkVUKTsKKyNlbmRpZgorCS8qIFNldCB0aW1lciBfYWZ0ZXJfIEROUyByZXNvbHV0aW9uICovCisJc2lnbmFsKFNJR0FMUk0sIG5vcmVzcCk7CisJYWxhcm0oNSk7IC8qIGdpdmUgdGhlIGhvc3QgNTAwMG1zIHRvIHJlc3BvbmQgKi8KKworI2lmIEVOQUJMRV9QSU5HNgorCWlmIChsc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlwaW5nNihsc2EpOworCWVsc2UKKyNlbmRpZgorCQlwaW5nNChsc2EpOworCXByaW50ZigiJXMgaXMgYWxpdmUhXG4iLCBHLmhvc3RuYW1lKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisKKyNlbHNlIC8qIEZFQVRVUkVfRkFOQ1lfUElORyAqLworCisKKy8qIEZ1bGwoZXIpIHZlcnNpb24gKi8KKworI2RlZmluZSBPUFRfU1RSSU5HICgicXZjOnM6dDp3Olc6STo0IiBJRl9QSU5HNigiNiIpKQorZW51bSB7CisJT1BUX1FVSUVUID0gMSA8PCAwLAorCU9QVF9WRVJCT1NFID0gMSA8PCAxLAorCU9QVF9jID0gMSA8PCAyLAorCU9QVF9zID0gMSA8PCAzLAorCU9QVF90ID0gMSA8PCA0LAorCU9QVF93ID0gMSA8PCA1LAorCU9QVF9XID0gMSA8PCA2LAorCU9QVF9JID0gMSA8PCA3LAorCU9QVF9JUFY0ID0gMSA8PCA4LAorCU9QVF9JUFY2ID0gKDEgPDwgOSkgKiBFTkFCTEVfUElORzYsCit9OworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgcGluZ3NvY2s7CisJaW50IGlmX2luZGV4OworCWNoYXIgKnN0cl9JOworCWxlbl9hbmRfc29ja2FkZHIgKnNvdXJjZV9sc2E7CisJdW5zaWduZWQgZGF0YWxlbjsKKwl1bnNpZ25lZCBwaW5nY291bnQ7IC8qIG11c3QgYmUgaW50LXNpemVkICovCisJdW5zaWduZWQgb3B0X3R0bDsKKwl1bnNpZ25lZCBsb25nIG50cmFuc21pdHRlZCwgbnJlY2VpdmVkLCBucmVwZWF0czsKKwl1aW50MTZfdCBteWlkOworCXVuc2lnbmVkIHRtaW4sIHRtYXg7IC8qIGluIHVzICovCisJdW5zaWduZWQgbG9uZyBsb25nIHRzdW07IC8qIGluIHVzLCBzdW0gb2YgYWxsIHRpbWVzICovCisJdW5zaWduZWQgZGVhZGxpbmU7CisJdW5zaWduZWQgdGltZW91dDsKKwl1bnNpZ25lZCB0b3RhbF9zZWNzOworCXVuc2lnbmVkIHNpemVvZl9yY3ZfcGFja2V0OworCWNoYXIgKnJjdl9wYWNrZXQ7IC8qIFtkYXRhbGVuICsgTUFYSVBMRU4gKyBNQVhJQ01QTEVOXSAqLworCXZvaWQgKnNuZF9wYWNrZXQ7IC8qIFtkYXRhbGVuICsgaXB2NC9pcHY2X2NvbnN0XSAqLworCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCWNvbnN0IGNoYXIgKmRvdHRlZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKyNpZiBFTkFCTEVfUElORzYKKwkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OworI2VuZGlmCisJfSBwaW5nYWRkcjsKKwljaGFyIHJjdmRfdGJsW01BWF9EVVBfQ0hLIC8gOF07Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBwaW5nc29jayAgICAgKEcucGluZ3NvY2sgICAgKQorI2RlZmluZSBpZl9pbmRleCAgICAgKEcuaWZfaW5kZXggICAgKQorI2RlZmluZSBzb3VyY2VfbHNhICAgKEcuc291cmNlX2xzYSAgKQorI2RlZmluZSBzdHJfSSAgICAgICAgKEcuc3RyX0kgICAgICAgKQorI2RlZmluZSBkYXRhbGVuICAgICAgKEcuZGF0YWxlbiAgICAgKQorI2RlZmluZSBudHJhbnNtaXR0ZWQgKEcubnRyYW5zbWl0dGVkKQorI2RlZmluZSBucmVjZWl2ZWQgICAgKEcubnJlY2VpdmVkICAgKQorI2RlZmluZSBucmVwZWF0cyAgICAgKEcubnJlcGVhdHMgICAgKQorI2RlZmluZSBwaW5nY291bnQgICAgKEcucGluZ2NvdW50ICAgKQorI2RlZmluZSBvcHRfdHRsICAgICAgKEcub3B0X3R0bCAgICAgKQorI2RlZmluZSBteWlkICAgICAgICAgKEcubXlpZCAgICAgICAgKQorI2RlZmluZSB0bWluICAgICAgICAgKEcudG1pbiAgICAgICAgKQorI2RlZmluZSB0bWF4ICAgICAgICAgKEcudG1heCAgICAgICAgKQorI2RlZmluZSB0c3VtICAgICAgICAgKEcudHN1bSAgICAgICAgKQorI2RlZmluZSBkZWFkbGluZSAgICAgKEcuZGVhZGxpbmUgICAgKQorI2RlZmluZSB0aW1lb3V0ICAgICAgKEcudGltZW91dCAgICAgKQorI2RlZmluZSB0b3RhbF9zZWNzICAgKEcudG90YWxfc2VjcyAgKQorI2RlZmluZSBob3N0bmFtZSAgICAgKEcuaG9zdG5hbWUgICAgKQorI2RlZmluZSBkb3R0ZWQgICAgICAgKEcuZG90dGVkICAgICAgKQorI2RlZmluZSBwaW5nYWRkciAgICAgKEcucGluZ2FkZHIgICAgKQorI2RlZmluZSByY3ZkX3RibCAgICAgKEcucmN2ZF90YmwgICAgKQordm9pZCBCVUdfcGluZ19nbG9iYWxzX3Rvb19iaWcodm9pZCk7CisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWlmIChzaXplb2YoRykgPiBDT01NT05fQlVGU0laRSkgXAorCQlCVUdfcGluZ19nbG9iYWxzX3Rvb19iaWcoKTsgXAorCXBpbmdzb2NrID0gLTE7IFwKKwlkYXRhbGVuID0gREVGREFUQUxFTjsgXAorCXRpbWVvdXQgPSBNQVhXQUlUOyBcCisJdG1pbiA9IFVJTlRfTUFYOyBcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgQShiaXQpCQlyY3ZkX3RibFsoYml0KT4+M10JLyogaWRlbnRpZnkgYnl0ZSBpbiBhcnJheSAqLworI2RlZmluZSBCKGJpdCkJCSgxIDw8ICgoYml0KSAmIDB4MDcpKQkvKiBpZGVudGlmeSBiaXQgaW4gYnl0ZSAqLworI2RlZmluZSBTRVQoYml0KQkoQShiaXQpIHw9IEIoYml0KSkKKyNkZWZpbmUgQ0xSKGJpdCkJKEEoYml0KSAmPSAofkIoYml0KSkpCisjZGVmaW5lIFRTVChiaXQpCShBKGJpdCkgJiBCKGJpdCkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHNfYW5kX2V4aXQoaW50IGp1bmspIE5PUkVUVVJOOworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHNfYW5kX2V4aXQoaW50IGp1bmsgVU5VU0VEX1BBUkFNKQoreworCXNpZ25hbChTSUdJTlQsIFNJR19JR04pOworCisJcHJpbnRmKCJcbi0tLSAlcyBwaW5nIHN0YXRpc3RpY3MgLS0tXG4iLCBob3N0bmFtZSk7CisJcHJpbnRmKCIlbHUgcGFja2V0cyB0cmFuc21pdHRlZCwgIiwgbnRyYW5zbWl0dGVkKTsKKwlwcmludGYoIiVsdSBwYWNrZXRzIHJlY2VpdmVkLCAiLCBucmVjZWl2ZWQpOworCWlmIChucmVwZWF0cykKKwkJcHJpbnRmKCIlbHUgZHVwbGljYXRlcywgIiwgbnJlcGVhdHMpOworCWlmIChudHJhbnNtaXR0ZWQpCisJCW50cmFuc21pdHRlZCA9IChudHJhbnNtaXR0ZWQgLSBucmVjZWl2ZWQpICogMTAwIC8gbnRyYW5zbWl0dGVkOworCXByaW50ZigiJWx1JSUgcGFja2V0IGxvc3NcbiIsIG50cmFuc21pdHRlZCk7CisJaWYgKHRtaW4gIT0gVUlOVF9NQVgpIHsKKwkJdW5zaWduZWQgdGF2ZyA9IHRzdW0gLyAobnJlY2VpdmVkICsgbnJlcGVhdHMpOworCQlwcmludGYoInJvdW5kLXRyaXAgbWluL2F2Zy9tYXggPSAldS4lMDN1LyV1LiUwM3UvJXUuJTAzdSBtc1xuIiwKKwkJCXRtaW4gLyAxMDAwLCB0bWluICUgMTAwMCwKKwkJCXRhdmcgLyAxMDAwLCB0YXZnICUgMTAwMCwKKwkJCXRtYXggLyAxMDAwLCB0bWF4ICUgMTAwMCk7CisJfQorCS8qIGlmIGNvbmRpdGlvbiBpcyB0cnVlLCBleGl0IHdpdGggMSAtLSAnZmFpbHVyZScgKi8KKwlleGl0KG5yZWNlaXZlZCA9PSAwIHx8IChkZWFkbGluZSAmJiBucmVjZWl2ZWQgPCBwaW5nY291bnQpKTsKK30KKworc3RhdGljIHZvaWQgc2VuZHBpbmdfdGFpbCh2b2lkICgqc3ApKGludCksIGludCBzaXplX3BrdCkKK3sKKwlpbnQgc3o7CisKKwlDTFIoKHVpbnQxNl90KW50cmFuc21pdHRlZCAlIE1BWF9EVVBfQ0hLKTsKKwludHJhbnNtaXR0ZWQrKzsKKworCXNpemVfcGt0ICs9IGRhdGFsZW47CisKKwkvKiBzaXplb2YocGluZ2FkZHIpIGNhbiBiZSBsYXJnZXIgdGhhbiByZWFsIHNhIHNpemUsIGJ1dCBJIHRoaW5rCisJICogaXQgZG9lc24ndCBtYXR0ZXIgKi8KKwlzeiA9IHhzZW5kdG8ocGluZ3NvY2ssIEcuc25kX3BhY2tldCwgc2l6ZV9wa3QsICZwaW5nYWRkci5zYSwgc2l6ZW9mKHBpbmdhZGRyKSk7CisJaWYgKHN6ICE9IHNpemVfcGt0KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfd3JpdGVfZXJyb3IpOworCisJaWYgKHBpbmdjb3VudCA9PSAwIHx8IGRlYWRsaW5lIHx8IG50cmFuc21pdHRlZCA8IHBpbmdjb3VudCkgeworCQkvKiBEaWRuJ3Qgc2VuZCBhbGwgcGluZ3MgeWV0IC0gc2NoZWR1bGUgbmV4dCBpbiAxcyAqLworCQlzaWduYWwoU0lHQUxSTSwgc3ApOworCQlpZiAoZGVhZGxpbmUpIHsKKwkJCXRvdGFsX3NlY3MgKz0gUElOR0lOVEVSVkFMOworCQkJaWYgKHRvdGFsX3NlY3MgPj0gZGVhZGxpbmUpCisJCQkJc2lnbmFsKFNJR0FMUk0sIHByaW50X3N0YXRzX2FuZF9leGl0KTsKKwkJfQorCQlhbGFybShQSU5HSU5URVJWQUwpOworCX0gZWxzZSB7IC8qIC1jIE5OLCBhbmQgYWxsIE5OIGFyZSBzZW50IChhbmQgbm8gZGVhZGxpbmUpICovCisJCS8qIFdhaXQgZm9yIHRoZSBsYXN0IHBpbmcgdG8gY29tZSBiYWNrLgorCQkgKiAtVyB0aW1lb3V0OiB3YWl0IGZvciBhIHJlc3BvbnNlIGluIHNlY29uZHMuCisJCSAqIEFmZmVjdHMgb25seSB0aW1lb3V0IGluIGFic2Vuc2Ugb2YgYW55IHJlc3BvbnNlcywKKwkJICogb3RoZXJ3aXNlIHBpbmcgd2FpdHMgZm9yIHR3byBSVFRzLiAqLworCQl1bnNpZ25lZCBleHBpcmUgPSB0aW1lb3V0OworCisJCWlmIChucmVjZWl2ZWQpIHsKKwkJCS8qIGFwcHJveC4gMip0bWF4LCBpbiBzZWNvbmRzICgyIFJUVCkgKi8KKwkJCWV4cGlyZSA9IHRtYXggLyAoNTEyKjEwMjQpOworCQkJaWYgKGV4cGlyZSA9PSAwKQorCQkJCWV4cGlyZSA9IDE7CisJCX0KKwkJc2lnbmFsKFNJR0FMUk0sIHByaW50X3N0YXRzX2FuZF9leGl0KTsKKwkJYWxhcm0oZXhwaXJlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRwaW5nNChpbnQganVuayBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IGljbXAgKnBrdCA9IEcuc25kX3BhY2tldDsKKworCS8vbWVtc2V0KHBrdCwgMCwgZGF0YWxlbiArIElDTVBfTUlOTEVOICsgNCk7IC0gRy5zbmRfcGFja2V0IHdhcyB4emFsbG9jZWQKKwlwa3QtPmljbXBfdHlwZSA9IElDTVBfRUNITzsKKwkvKnBrdC0+aWNtcF9jb2RlID0gMDsqLworCXBrdC0+aWNtcF9ja3N1bSA9IDA7IC8qIGNrc3VtIGlzIGNhbGN1bGF0ZWQgd2l0aCB0aGlzIGZpZWxkIHNldCB0byAwICovCisJcGt0LT5pY21wX3NlcSA9IGh0b25zKG50cmFuc21pdHRlZCk7IC8qIGRvbid0ICsrIGhlcmUsIGl0IGNhbiBiZSBhIG1hY3JvICovCisJcGt0LT5pY21wX2lkID0gbXlpZDsKKworCS8qIElmIGRhdGFsZW4gPCA0LCB3ZSBzdG9yZSB0aW1lc3RhbXAgX3Bhc3RfIHRoZSBwYWNrZXQsCisJICogYnV0IGl0J3Mgb2sgLSB3ZSBhbGxvY2F0ZWQgNCBleHRyYSBieXRlcyBpbiB4emFsbG9jKCkganVzdCBpbiBjYXNlLgorCSAqLworCS8qaWYgKGRhdGFsZW4gPj0gNCkqLworCQkvKiBObyBodG9uOiB3ZSdsbCByZWFkIGl0IGJhY2sgb24gdGhlIHNhbWUgbWFjaGluZSAqLworCQkqKHVpbnQzMl90KikmcGt0LT5pY21wX2R1biA9IG1vbm90b25pY191cygpOworCisJcGt0LT5pY21wX2Nrc3VtID0gaW5fY2tzdW0oKHVuc2lnbmVkIHNob3J0ICopIHBrdCwgZGF0YWxlbiArIElDTVBfTUlOTEVOKTsKKworCXNlbmRwaW5nX3RhaWwoc2VuZHBpbmc0LCBJQ01QX01JTkxFTik7Cit9CisjaWYgRU5BQkxFX1BJTkc2CitzdGF0aWMgdm9pZCBzZW5kcGluZzYoaW50IGp1bmsgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBpY21wNl9oZHIgKnBrdCA9IEcuc25kX3BhY2tldDsKKworCS8vbWVtc2V0KHBrdCwgMCwgZGF0YWxlbiArIHNpemVvZihzdHJ1Y3QgaWNtcDZfaGRyKSArIDQpOworCXBrdC0+aWNtcDZfdHlwZSA9IElDTVA2X0VDSE9fUkVRVUVTVDsKKwkvKnBrdC0+aWNtcDZfY29kZSA9IDA7Ki8KKwkvKnBrdC0+aWNtcDZfY2tzdW0gPSAwOyovCisJcGt0LT5pY21wNl9zZXEgPSBodG9ucyhudHJhbnNtaXR0ZWQpOyAvKiBkb24ndCArKyBoZXJlLCBpdCBjYW4gYmUgYSBtYWNybyAqLworCXBrdC0+aWNtcDZfaWQgPSBteWlkOworCisJLyppZiAoZGF0YWxlbiA+PSA0KSovCisJCSoodWludDMyX3QqKSgmcGt0LT5pY21wNl9kYXRhOFs0XSkgPSBtb25vdG9uaWNfdXMoKTsKKworCS8vVE9ETz8gcGt0LT5pY21wX2Nrc3VtID0gaW5fY2tzdW0oLi4uKTsKKworCXNlbmRwaW5nX3RhaWwoc2VuZHBpbmc2LCBzaXplb2Yoc3RydWN0IGljbXA2X2hkcikpOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICppY21wX3R5cGVfbmFtZShpbnQgaWQpCit7CisJc3dpdGNoIChpZCkgeworCWNhc2UgSUNNUF9FQ0hPUkVQTFk6ICAgICAgcmV0dXJuICJFY2hvIFJlcGx5IjsKKwljYXNlIElDTVBfREVTVF9VTlJFQUNIOiAgIHJldHVybiAiRGVzdGluYXRpb24gVW5yZWFjaGFibGUiOworCWNhc2UgSUNNUF9TT1VSQ0VfUVVFTkNIOiAgcmV0dXJuICJTb3VyY2UgUXVlbmNoIjsKKwljYXNlIElDTVBfUkVESVJFQ1Q6ICAgICAgIHJldHVybiAiUmVkaXJlY3QgKGNoYW5nZSByb3V0ZSkiOworCWNhc2UgSUNNUF9FQ0hPOiAgICAgICAgICAgcmV0dXJuICJFY2hvIFJlcXVlc3QiOworCWNhc2UgSUNNUF9USU1FX0VYQ0VFREVEOiAgcmV0dXJuICJUaW1lIEV4Y2VlZGVkIjsKKwljYXNlIElDTVBfUEFSQU1FVEVSUFJPQjogIHJldHVybiAiUGFyYW1ldGVyIFByb2JsZW0iOworCWNhc2UgSUNNUF9USU1FU1RBTVA6ICAgICAgcmV0dXJuICJUaW1lc3RhbXAgUmVxdWVzdCI7CisJY2FzZSBJQ01QX1RJTUVTVEFNUFJFUExZOiByZXR1cm4gIlRpbWVzdGFtcCBSZXBseSI7CisJY2FzZSBJQ01QX0lORk9fUkVRVUVTVDogICByZXR1cm4gIkluZm9ybWF0aW9uIFJlcXVlc3QiOworCWNhc2UgSUNNUF9JTkZPX1JFUExZOiAgICAgcmV0dXJuICJJbmZvcm1hdGlvbiBSZXBseSI7CisJY2FzZSBJQ01QX0FERFJFU1M6ICAgICAgICByZXR1cm4gIkFkZHJlc3MgTWFzayBSZXF1ZXN0IjsKKwljYXNlIElDTVBfQUREUkVTU1JFUExZOiAgIHJldHVybiAiQWRkcmVzcyBNYXNrIFJlcGx5IjsKKwlkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biBJQ01QIHR5cGUiOworCX0KK30KKyNpZiBFTkFCTEVfUElORzYKKy8qIFJGQzM1NDIgY2hhbmdlZCBzb21lIGRlZmluaXRpb25zIGZyb20gUkZDMjI5MiBmb3Igbm8gZ29vZCByZWFzb24sIHdoZWUhCisgKiB0aGUgbmV3ZXIgMzU0MiB1c2VzIGEgTUxEXyBwcmVmaXggd2hlcmUgYXMgMjI5MiB1c2VzIElDTVA2XyBwcmVmaXggKi8KKyNpZm5kZWYgTUxEX0xJU1RFTkVSX1FVRVJZCisjIGRlZmluZSBNTERfTElTVEVORVJfUVVFUlkgSUNNUDZfTUVNQkVSU0hJUF9RVUVSWQorI2VuZGlmCisjaWZuZGVmIE1MRF9MSVNURU5FUl9SRVBPUlQKKyMgZGVmaW5lIE1MRF9MSVNURU5FUl9SRVBPUlQgSUNNUDZfTUVNQkVSU0hJUF9SRVBPUlQKKyNlbmRpZgorI2lmbmRlZiBNTERfTElTVEVORVJfUkVEVUNUSU9OCisjIGRlZmluZSBNTERfTElTVEVORVJfUkVEVUNUSU9OIElDTVA2X01FTUJFUlNISVBfUkVEVUNUSU9OCisjZW5kaWYKK3N0YXRpYyBjb25zdCBjaGFyICppY21wNl90eXBlX25hbWUoaW50IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKwljYXNlIElDTVA2X0RTVF9VTlJFQUNIOiAgICAgIHJldHVybiAiRGVzdGluYXRpb24gVW5yZWFjaGFibGUiOworCWNhc2UgSUNNUDZfUEFDS0VUX1RPT19CSUc6ICAgcmV0dXJuICJQYWNrZXQgdG9vIGJpZyI7CisJY2FzZSBJQ01QNl9USU1FX0VYQ0VFREVEOiAgICByZXR1cm4gIlRpbWUgRXhjZWVkZWQiOworCWNhc2UgSUNNUDZfUEFSQU1fUFJPQjogICAgICAgcmV0dXJuICJQYXJhbWV0ZXIgUHJvYmxlbSI7CisJY2FzZSBJQ01QNl9FQ0hPX1JFUExZOiAgICAgICByZXR1cm4gIkVjaG8gUmVwbHkiOworCWNhc2UgSUNNUDZfRUNIT19SRVFVRVNUOiAgICAgcmV0dXJuICJFY2hvIFJlcXVlc3QiOworCWNhc2UgTUxEX0xJU1RFTkVSX1FVRVJZOiAgICAgcmV0dXJuICJMaXN0ZW5lciBRdWVyeSI7CisJY2FzZSBNTERfTElTVEVORVJfUkVQT1JUOiAgICByZXR1cm4gIkxpc3RlbmVyIFJlcG9ydCI7CisJY2FzZSBNTERfTElTVEVORVJfUkVEVUNUSU9OOiByZXR1cm4gIkxpc3RlbmVyIFJlZHVjdGlvbiI7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gSUNNUCB0eXBlIjsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdW5wYWNrX3RhaWwoaW50IHN6LCB1aW50MzJfdCAqdHAsCisJCWNvbnN0IGNoYXIgKmZyb21fc3RyLAorCQl1aW50MTZfdCByZWN2X3NlcSwgaW50IHR0bCkKK3sKKwljb25zdCBjaGFyICpkdXBtc2cgPSAiIChEVVAhKSI7CisJdW5zaWduZWQgdHJpcHRpbWUgPSB0cmlwdGltZTsgLyogZm9yIGdjYyAqLworCisJKytucmVjZWl2ZWQ7CisKKwlpZiAodHApIHsKKwkJLyogKGludDMyX3QpIGNhc3QgaXMgZm9yIGh5cG90aGV0aWNhbCA2NC1iaXQgdW5zaWduZWQgKi8KKwkJLyogKGRvZXNuJ3QgaHVydCAzMi1iaXQgcmVhbC13b3JsZCBhbnl3YXkpICovCisJCXRyaXB0aW1lID0gKGludDMyX3QpICgodWludDMyX3QpbW9ub3RvbmljX3VzKCkgLSAqdHApOworCQl0c3VtICs9IHRyaXB0aW1lOworCQlpZiAodHJpcHRpbWUgPCB0bWluKQorCQkJdG1pbiA9IHRyaXB0aW1lOworCQlpZiAodHJpcHRpbWUgPiB0bWF4KQorCQkJdG1heCA9IHRyaXB0aW1lOworCX0KKworCWlmIChUU1QocmVjdl9zZXEgJSBNQVhfRFVQX0NISykpIHsKKwkJKytucmVwZWF0czsKKwkJLS1ucmVjZWl2ZWQ7CisJfSBlbHNlIHsKKwkJU0VUKHJlY3Zfc2VxICUgTUFYX0RVUF9DSEspOworCQlkdXBtc2cgKz0gNzsKKwl9CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9RVUlFVCkKKwkJcmV0dXJuOworCisJcHJpbnRmKCIlZCBieXRlcyBmcm9tICVzOiBzZXE9JXUgdHRsPSVkIiwgc3osCisJCWZyb21fc3RyLCByZWN2X3NlcSwgdHRsKTsKKwlpZiAodHApCisJCXByaW50ZigiIHRpbWU9JXUuJTAzdSBtcyIsIHRyaXB0aW1lIC8gMTAwMCwgdHJpcHRpbWUgJSAxMDAwKTsKKwlwdXRzKGR1cG1zZyk7CisJZmZsdXNoX2FsbCgpOworfQorc3RhdGljIHZvaWQgdW5wYWNrNChjaGFyICpidWYsIGludCBzeiwgc3RydWN0IHNvY2thZGRyX2luICpmcm9tKQoreworCXN0cnVjdCBpY21wICppY21wcGt0OworCXN0cnVjdCBpcGhkciAqaXBoZHI7CisJaW50IGhsZW47CisKKwkvKiBkaXNjYXJkIGlmIHRvbyBzaG9ydCAqLworCWlmIChzeiA8IChkYXRhbGVuICsgSUNNUF9NSU5MRU4pKQorCQlyZXR1cm47CisKKwkvKiBjaGVjayBJUCBoZWFkZXIgKi8KKwlpcGhkciA9IChzdHJ1Y3QgaXBoZHIgKikgYnVmOworCWhsZW4gPSBpcGhkci0+aWhsIDw8IDI7CisJc3ogLT0gaGxlbjsKKwlpY21wcGt0ID0gKHN0cnVjdCBpY21wICopIChidWYgKyBobGVuKTsKKwlpZiAoaWNtcHBrdC0+aWNtcF9pZCAhPSBteWlkKQorCQlyZXR1cm47CQkJCS8qIG5vdCBvdXIgcGluZyAqLworCisJaWYgKGljbXBwa3QtPmljbXBfdHlwZSA9PSBJQ01QX0VDSE9SRVBMWSkgeworCQl1aW50MTZfdCByZWN2X3NlcSA9IG50b2hzKGljbXBwa3QtPmljbXBfc2VxKTsKKwkJdWludDMyX3QgKnRwID0gTlVMTDsKKworCQlpZiAoc3ogPj0gSUNNUF9NSU5MRU4gKyBzaXplb2YodWludDMyX3QpKQorCQkJdHAgPSAodWludDMyX3QgKikgaWNtcHBrdC0+aWNtcF9kYXRhOworCQl1bnBhY2tfdGFpbChzeiwgdHAsCisJCQlpbmV0X250b2EoKihzdHJ1Y3QgaW5fYWRkciAqKSAmZnJvbS0+c2luX2FkZHIuc19hZGRyKSwKKwkJCXJlY3Zfc2VxLCBpcGhkci0+dHRsKTsKKwl9IGVsc2UgaWYgKGljbXBwa3QtPmljbXBfdHlwZSAhPSBJQ01QX0VDSE8pIHsKKwkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBnb3QgSUNNUCAlZCAoJXMpIiwKKwkJCQlpY21wcGt0LT5pY21wX3R5cGUsCisJCQkJaWNtcF90eXBlX25hbWUoaWNtcHBrdC0+aWNtcF90eXBlKSk7CisJfQorfQorI2lmIEVOQUJMRV9QSU5HNgorc3RhdGljIHZvaWQgdW5wYWNrNihjaGFyICpwYWNrZXQsIGludCBzeiwgLypzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tLCovIGludCBob3BsaW1pdCkKK3sKKwlzdHJ1Y3QgaWNtcDZfaGRyICppY21wcGt0OworCWNoYXIgYnVmW0lORVQ2X0FERFJTVFJMRU5dOworCisJLyogZGlzY2FyZCBpZiB0b28gc2hvcnQgKi8KKwlpZiAoc3ogPCAoZGF0YWxlbiArIHNpemVvZihzdHJ1Y3QgaWNtcDZfaGRyKSkpCisJCXJldHVybjsKKworCWljbXBwa3QgPSAoc3RydWN0IGljbXA2X2hkciAqKSBwYWNrZXQ7CisJaWYgKGljbXBwa3QtPmljbXA2X2lkICE9IG15aWQpCisJCXJldHVybjsJCQkJLyogbm90IG91ciBwaW5nICovCisKKwlpZiAoaWNtcHBrdC0+aWNtcDZfdHlwZSA9PSBJQ01QNl9FQ0hPX1JFUExZKSB7CisJCXVpbnQxNl90IHJlY3Zfc2VxID0gbnRvaHMoaWNtcHBrdC0+aWNtcDZfc2VxKTsKKwkJdWludDMyX3QgKnRwID0gTlVMTDsKKworCQlpZiAoc3ogPj0gc2l6ZW9mKHN0cnVjdCBpY21wNl9oZHIpICsgc2l6ZW9mKHVpbnQzMl90KSkKKwkJCXRwID0gKHVpbnQzMl90ICopICZpY21wcGt0LT5pY21wNl9kYXRhOFs0XTsKKwkJdW5wYWNrX3RhaWwoc3osIHRwLAorCQkJaW5ldF9udG9wKEFGX0lORVQ2LCAmcGluZ2FkZHIuc2luNi5zaW42X2FkZHIsCisJCQkJCWJ1Ziwgc2l6ZW9mKGJ1ZikpLAorCQkJcmVjdl9zZXEsIGhvcGxpbWl0KTsKKwl9IGVsc2UgaWYgKGljbXBwa3QtPmljbXA2X3R5cGUgIT0gSUNNUDZfRUNIT19SRVFVRVNUKSB7CisJCWJiX2Vycm9yX21zZygid2FybmluZzogZ290IElDTVAgJWQgKCVzKSIsCisJCQkJaWNtcHBrdC0+aWNtcDZfdHlwZSwKKwkJCQlpY21wNl90eXBlX25hbWUoaWNtcHBrdC0+aWNtcDZfdHlwZSkpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwaW5nNChsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJaW50IHNvY2tvcHQ7CisKKwlwaW5nc29jayA9IGNyZWF0ZV9pY21wX3NvY2tldCgpOworCXBpbmdhZGRyLnNpbiA9IGxzYS0+dS5zaW47CisJaWYgKHNvdXJjZV9sc2EpIHsKKwkJaWYgKHNldHNvY2tvcHQocGluZ3NvY2ssIElQUFJPVE9fSVAsIElQX01VTFRJQ0FTVF9JRiwKKwkJCQkmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgbXVsdGljYXN0IHNvdXJjZSBpbnRlcmZhY2UiKTsKKwkJeGJpbmQocGluZ3NvY2ssICZzb3VyY2VfbHNhLT51LnNhLCBzb3VyY2VfbHNhLT5sZW4pOworCX0KKwlpZiAoc3RyX0kpCisJCXNldHNvY2tvcHRfYmluZHRvZGV2aWNlKHBpbmdzb2NrLCBzdHJfSSk7CisKKwkvKiBlbmFibGUgYnJvYWRjYXN0IHBpbmdzICovCisJc2V0c29ja29wdF9icm9hZGNhc3QocGluZ3NvY2spOworCisJLyogc2V0IHJlY3YgYnVmIChuZWVkZWQgaWYgd2UgY2FuIGdldCBsb3RzIG9mIHJlc3BvbnNlczogZmxvb2QgcGluZywKKwkgKiBicm9hZGNhc3QgcGluZyBldGMpICovCisJc29ja29wdCA9IChkYXRhbGVuICogMikgKyA3ICogMTAyNDsgLyogZ2l2aW5nIGl0IGEgYml0IG9mIGV4dHJhIHJvb20gKi8KKwlzZXRzb2Nrb3B0KHBpbmdzb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZzb2Nrb3B0LCBzaXplb2Yoc29ja29wdCkpOworCisJaWYgKG9wdF90dGwgIT0gMCkgeworCQlzZXRzb2Nrb3B0KHBpbmdzb2NrLCBJUFBST1RPX0lQLCBJUF9UVEwsICZvcHRfdHRsLCBzaXplb2Yob3B0X3R0bCkpOworCQkvKiBhYm92ZSBkb2VzbnQgYWZmZWN0IHBhY2tldHMgc2VudCB0byBiY2FzdCBJUCwgc28uLi4gKi8KKwkJc2V0c29ja29wdChwaW5nc29jaywgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX1RUTCwgJm9wdF90dGwsIHNpemVvZihvcHRfdHRsKSk7CisJfQorCisJc2lnbmFsKFNJR0lOVCwgcHJpbnRfc3RhdHNfYW5kX2V4aXQpOworCisJLyogc3RhcnQgdGhlIHBpbmcncyBnb2luZyAuLi4gKi8KKwlzZW5kcGluZzQoMCk7CisKKwkvKiBsaXN0ZW4gZm9yIHJlcGxpZXMgKi8KKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbTsKKwkJc29ja2xlbl90IGZyb21sZW4gPSAoc29ja2xlbl90KSBzaXplb2YoZnJvbSk7CisJCWludCBjOworCisJCWMgPSByZWN2ZnJvbShwaW5nc29jaywgRy5yY3ZfcGFja2V0LCBHLnNpemVvZl9yY3ZfcGFja2V0LCAwLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sICZmcm9tbGVuKTsKKwkJaWYgKGMgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQkJYmJfcGVycm9yX21zZygicmVjdmZyb20iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVucGFjazQoRy5yY3ZfcGFja2V0LCBjLCAmZnJvbSk7CisJCWlmIChwaW5nY291bnQgJiYgbnJlY2VpdmVkID49IHBpbmdjb3VudCkKKwkJCWJyZWFrOworCX0KK30KKyNpZiBFTkFCTEVfUElORzYKK2V4dGVybiBpbnQgQlVHX2JhZF9vZmZzZXRvZl9pY21wNl9ja3N1bSh2b2lkKTsKK3N0YXRpYyB2b2lkIHBpbmc2KGxlbl9hbmRfc29ja2FkZHIgKmxzYSkKK3sKKwlpbnQgc29ja29wdDsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IGZyb207CisJc3RydWN0IGlvdmVjIGlvdjsKKwljaGFyIGNvbnRyb2xfYnVmW0NNU0dfU1BBQ0UoMzYpXTsKKworCXBpbmdzb2NrID0gY3JlYXRlX2ljbXA2X3NvY2tldCgpOworCXBpbmdhZGRyLnNpbjYgPSBsc2EtPnUuc2luNjsKKwkvKiB1bnRlc3RlZCB3aGV0aGVyICItSSBhZGRyIiByZWFsbHkgd29ya3MgZm9yIElQdjY6ICovCisJaWYgKHNvdXJjZV9sc2EpCisJCXhiaW5kKHBpbmdzb2NrLCAmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKTsKKwlpZiAoc3RyX0kpCisJCXNldHNvY2tvcHRfYmluZHRvZGV2aWNlKHBpbmdzb2NrLCBzdHJfSSk7CisKKyNpZmRlZiBJQ01QNl9GSUxURVIKKwl7CisJCXN0cnVjdCBpY21wNl9maWx0ZXIgZmlsdDsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9WRVJCT1NFKSkgeworCQkJSUNNUDZfRklMVEVSX1NFVEJMT0NLQUxMKCZmaWx0KTsKKwkJCUlDTVA2X0ZJTFRFUl9TRVRQQVNTKElDTVA2X0VDSE9fUkVQTFksICZmaWx0KTsKKwkJfSBlbHNlIHsKKwkJCUlDTVA2X0ZJTFRFUl9TRVRQQVNTQUxMKCZmaWx0KTsKKwkJfQorCQlpZiAoc2V0c29ja29wdChwaW5nc29jaywgSVBQUk9UT19JQ01QVjYsIElDTVA2X0ZJTFRFUiwgJmZpbHQsCisJCQkJCSAgIHNpemVvZihmaWx0KSkgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNldHNvY2tvcHQoSUNNUDZfRklMVEVSKSIpOworCX0KKyNlbmRpZiAvKklDTVA2X0ZJTFRFUiovCisKKwkvKiBlbmFibGUgYnJvYWRjYXN0IHBpbmdzICovCisJc2V0c29ja29wdF9icm9hZGNhc3QocGluZ3NvY2spOworCisJLyogc2V0IHJlY3YgYnVmIChuZWVkZWQgaWYgd2UgY2FuIGdldCBsb3RzIG9mIHJlc3BvbnNlczogZmxvb2QgcGluZywKKwkgKiBicm9hZGNhc3QgcGluZyBldGMpICovCisJc29ja29wdCA9IChkYXRhbGVuICogMikgKyA3ICogMTAyNDsgLyogZ2l2aW5nIGl0IGEgYml0IG9mIGV4dHJhIHJvb20gKi8KKwlzZXRzb2Nrb3B0KHBpbmdzb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZzb2Nrb3B0LCBzaXplb2Yoc29ja29wdCkpOworCisJc29ja29wdCA9IG9mZnNldG9mKHN0cnVjdCBpY21wNl9oZHIsIGljbXA2X2Nrc3VtKTsKKwlpZiAob2Zmc2V0b2Yoc3RydWN0IGljbXA2X2hkciwgaWNtcDZfY2tzdW0pICE9IDIpCisJCUJVR19iYWRfb2Zmc2V0b2ZfaWNtcDZfY2tzdW0oKTsKKwlzZXRzb2Nrb3B0KHBpbmdzb2NrLCBTT0xfUkFXLCBJUFY2X0NIRUNLU1VNLCAmc29ja29wdCwgc2l6ZW9mKHNvY2tvcHQpKTsKKworCS8qIHJlcXVlc3QgdHRsIGluZm8gdG8gYmUgcmV0dXJuZWQgaW4gYW5jaWxsYXJ5IGRhdGEgKi8KKwlzZXRzb2Nrb3B0KHBpbmdzb2NrLCBTT0xfSVBWNiwgSVBWNl9IT1BMSU1JVCwgJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKworCWlmIChpZl9pbmRleCkKKwkJcGluZ2FkZHIuc2luNi5zaW42X3Njb3BlX2lkID0gaWZfaW5kZXg7CisKKwlzaWduYWwoU0lHSU5ULCBwcmludF9zdGF0c19hbmRfZXhpdCk7CisKKwkvKiBzdGFydCB0aGUgcGluZydzIGdvaW5nIC4uLiAqLworCXNlbmRwaW5nNigwKTsKKworCS8qIGxpc3RlbiBmb3IgcmVwbGllcyAqLworCW1zZy5tc2dfbmFtZSA9ICZmcm9tOworCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihmcm9tKTsKKwltc2cubXNnX2lvdiA9ICZpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfY29udHJvbCA9IGNvbnRyb2xfYnVmOworCWlvdi5pb3ZfYmFzZSA9IEcucmN2X3BhY2tldDsKKwlpb3YuaW92X2xlbiA9IEcuc2l6ZW9mX3Jjdl9wYWNrZXQ7CisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXN0cnVjdCBjbXNnaGRyICptcDsKKwkJaW50IGhvcGxpbWl0ID0gLTE7CisJCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjb250cm9sX2J1Zik7CisKKwkJYyA9IHJlY3Ztc2cocGluZ3NvY2ssICZtc2csIDApOworCQlpZiAoYyA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQliYl9wZXJyb3JfbXNnKCJyZWN2ZnJvbSIpOworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChtcCA9IENNU0dfRklSU1RIRFIoJm1zZyk7IG1wOyBtcCA9IENNU0dfTlhUSERSKCZtc2csIG1wKSkgeworCQkJaWYgKG1wLT5jbXNnX2xldmVsID09IFNPTF9JUFY2CisJCQkgJiYgbXAtPmNtc2dfdHlwZSA9PSBJUFY2X0hPUExJTUlUCisJCQkgLyogZG9uJ3QgY2hlY2sgbGVuIC0gd2UgdHJ1c3QgdGhlIGtlcm5lbDogKi8KKwkJCSAvKiAmJiBtcC0+Y21zZ19sZW4gPj0gQ01TR19MRU4oc2l6ZW9mKGludCkpICovCisJCQkpIHsKKwkJCQkvKmhvcGxpbWl0ID0gKihpbnQqKUNNU0dfREFUQShtcCk7IC0gdW5hbGlnbmVkIGFjY2VzcyAqLworCQkJCW1vdmVfZnJvbV91bmFsaWduZWRfaW50KGhvcGxpbWl0LCBDTVNHX0RBVEEobXApKTsKKwkJCX0KKwkJfQorCQl1bnBhY2s2KEcucmN2X3BhY2tldCwgYywgLyomZnJvbSwqLyBob3BsaW1pdCk7CisJCWlmIChwaW5nY291bnQgJiYgbnJlY2VpdmVkID49IHBpbmdjb3VudCkKKwkJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwaW5nKGxlbl9hbmRfc29ja2FkZHIgKmxzYSkKK3sKKwlwcmludGYoIlBJTkcgJXMgKCVzKSIsIGhvc3RuYW1lLCBkb3R0ZWQpOworCWlmIChzb3VyY2VfbHNhKSB7CisJCXByaW50ZigiIGZyb20gJXMiLAorCQkJeG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCZzb3VyY2VfbHNhLT51LnNhKSk7CisJfQorCXByaW50ZigiOiAlZCBkYXRhIGJ5dGVzXG4iLCBkYXRhbGVuKTsKKworCUcuc2l6ZW9mX3Jjdl9wYWNrZXQgPSBkYXRhbGVuICsgTUFYSVBMRU4gKyBNQVhJQ01QTEVOOworCUcucmN2X3BhY2tldCA9IHh6YWxsb2MoRy5zaXplb2ZfcmN2X3BhY2tldCk7CisjaWYgRU5BQkxFX1BJTkc2CisJaWYgKGxzYS0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJLyogKzQgcmVzZXJ2ZXMgYSBwbGFjZSBmb3IgdGltZXN0YW1wLCB3aGljaCBtYXkgZW5kIHVwIHNpdHRpbmcKKwkJICogX2FmdGVyXyBwYWNrZXQuIFNhdmVzIG9uZSBpZigpIC0gc2VlIHNlbmRwaW5nNC82KCkgKi8KKwkJRy5zbmRfcGFja2V0ID0geHphbGxvYyhkYXRhbGVuICsgc2l6ZW9mKHN0cnVjdCBpY21wNl9oZHIpICsgNCk7CisJCXBpbmc2KGxzYSk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCUcuc25kX3BhY2tldCA9IHh6YWxsb2MoZGF0YWxlbiArIElDTVBfTUlOTEVOICsgNCk7CisJCXBpbmc0KGxzYSk7CisJfQorfQorCitzdGF0aWMgaW50IGNvbW1vbl9waW5nX21haW4oaW50IG9wdCwgY2hhciAqKmFyZ3YpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCWNoYXIgKnN0cl9zOworCisJSU5JVF9HKCk7CisKKwkvKiBleGFjdGx5IG9uZSBhcmd1bWVudCBuZWVkZWQ7IC12IGFuZCAtcSBkb24ndCBtaXg7IC1jIE5VTSwgLXQgTlVNLCAtdyBOVU0sIC1XIE5VTSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xOnEtLXY6di0tcTpjKzp0Kzp3KzpXKyI7CisJb3B0IHw9IGdldG9wdDMyKGFyZ3YsIE9QVF9TVFJJTkcsICZwaW5nY291bnQsICZzdHJfcywgJm9wdF90dGwsICZkZWFkbGluZSwgJnRpbWVvdXQsICZzdHJfSSk7CisJaWYgKG9wdCAmIE9QVF9zKQorCQlkYXRhbGVuID0geGF0b3UxNihzdHJfcyk7IC8vIC1zCisJaWYgKG9wdCAmIE9QVF9JKSB7IC8vIC1JCisJCWlmX2luZGV4ID0gaWZfbmFtZXRvaW5kZXgoc3RyX0kpOworCQlpZiAoIWlmX2luZGV4KSB7CisJCQkvKiBUT0RPOiBJJ20gbm90IHN1cmUgaXQgdGFrZXMgSVB2NiB1bmxlc3MgaW4gW1hYOlhYLi5dIGZvcm1hdCAqLworCQkJc291cmNlX2xzYSA9IHhkb3R0ZWQyc29ja2FkZHIoc3RyX0ksIDApOworCQkJc3RyX0kgPSBOVUxMOyAvKiBkb24ndCB0cnkgdG8gYmluZCB0byBkZXZpY2UgbGF0ZXIgKi8KKwkJfQorCX0KKwlteWlkID0gKHVpbnQxNl90KSBnZXRwaWQoKTsKKwlob3N0bmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKyNpZiBFTkFCTEVfUElORzYKKwl7CisJCXNhX2ZhbWlseV90IGFmID0gQUZfVU5TUEVDOworCQlpZiAob3B0ICYgT1BUX0lQVjQpCisJCQlhZiA9IEFGX0lORVQ7CisJCWlmIChvcHQgJiBPUFRfSVBWNikKKwkJCWFmID0gQUZfSU5FVDY7CisJCWxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihob3N0bmFtZSwgMCwgYWYpOworCX0KKyNlbHNlCisJbHNhID0geGhvc3RfYW5kX2FmMnNvY2thZGRyKGhvc3RuYW1lLCAwLCBBRl9JTkVUKTsKKyNlbmRpZgorCisJaWYgKHNvdXJjZV9sc2EgJiYgc291cmNlX2xzYS0+dS5zYS5zYV9mYW1pbHkgIT0gbHNhLT51LnNhLnNhX2ZhbWlseSkKKwkJLyogbGVha2luZyBpdCBoZXJlLi4uICovCisJCXNvdXJjZV9sc2EgPSBOVUxMOworCisJZG90dGVkID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCZsc2EtPnUuc2EpOworCXBpbmcobHNhKTsKKwlwcmludF9zdGF0c19hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworCS8qcmV0dXJuIEVYSVRfU1VDQ0VTUzsqLworfQorI2VuZGlmIC8qIEZFQVRVUkVfRkFOQ1lfUElORyAqLworCisKK2ludCBwaW5nX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwaW5nX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfUElORworCXJldHVybiBjb21tb25fcGluZ19tYWluKEFGX1VOU1BFQywgYXJndik7CisjZWxzZQorCXJldHVybiBjb21tb25fcGluZ19tYWluKDAsIGFyZ3YpOworI2VuZGlmCit9CisKKyNpZiBFTkFCTEVfUElORzYKK2ludCBwaW5nNl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGluZzZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworIyBpZiAhRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfUElORworCXJldHVybiBjb21tb25fcGluZ19tYWluKEFGX0lORVQ2LCBhcmd2KTsKKyMgZWxzZQorCXJldHVybiBjb21tb25fcGluZ19tYWluKE9QVF9JUFY2LCBhcmd2KTsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisvKiBmcm9tIHBpbmc2LmM6CisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogTWlrZSBNdXVzcy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiA8QlNEIEFkdmVydGlzaW5nIENsYXVzZSBvbWl0dGVkIHBlciB0aGUgSnVseSAyMiwgMTk5OSBsaWNlbnNpbmcgY2hhbmdlCisgKgkJZnRwOi8vZnRwLmNzLmJlcmtlbGV5LmVkdS9wdWIvNGJzZC9SRUFETUUuSW1wdC5MaWNlbnNlLkNoYW5nZT4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3BzY2FuLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3BzY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwMDVhZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvcHNjYW4uYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIFBzY2FuIGlzIGEgbWluaSBwb3J0IHNjYW5uZXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcHNjYW5fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2JdIFstcCBNSU5fUE9SVF0gWy1QIE1BWF9QT1JUXSBbLXQgVElNRU9VVF0gWy1UIE1JTl9SVFRdIEhPU1QiCisvL3VzYWdlOiNkZWZpbmUgcHNjYW5fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTY2FuIGEgaG9zdCwgcHJpbnQgYWxsIG9wZW4gcG9ydHNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJU2hvdyBjbG9zZWQgcG9ydHMgdG9vIgorLy91c2FnZTogICAgICJcbgktYglTaG93IGJsb2NrZWQgcG9ydHMgdG9vIgorLy91c2FnZTogICAgICJcbgktcAlTY2FuIGZyb20gdGhpcyBwb3J0IChkZWZhdWx0IDEpIgorLy91c2FnZTogICAgICJcbgktUAlTY2FuIHVwIHRvIHRoaXMgcG9ydCAoZGVmYXVsdCAxMDI0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJVGltZW91dCAoZGVmYXVsdCA1MDAwIG1zKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVQJTWluaW11bSBydHQgKGRlZmF1bHQgNSBtcywgaW5jcmVhc2UgZm9yIGNvbmdlc3RlZCBob3N0cykiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBkZWJ1Z2dpbmcgKi8KKyNpZmRlZiBERUJVR19QU0NBTgorI2RlZmluZSBETVNHKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorI2RlZmluZSBERVJSKC4uLikgYmJfcGVycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIERNU0coLi4uKSAoKHZvaWQpMCkKKyNkZWZpbmUgREVSUiguLi4pICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpwb3J0X25hbWUodW5zaWduZWQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc2VydmVudCAqc2VydmVyOworCisJc2VydmVyID0gZ2V0c2VydmJ5cG9ydChodG9ucyhwb3J0KSwgTlVMTCk7CisJaWYgKHNlcnZlcikKKwkJcmV0dXJuIHNlcnZlci0+c19uYW1lOworCXJldHVybiAidW5rbm93biI7Cit9CisKKy8qIFdlIGRvbid0IGV4cGVjdCB0byBzZWUgMTAwMCsgc2Vjb25kcyBkZWxheSwgdW5zaWduZWQgaXMgZW5vdWdoICovCisjZGVmaW5lIE1PTk9UT05JQ19VUygpICgodW5zaWduZWQpbW9ub3RvbmljX3VzKCkpCisKK2ludCBwc2Nhbl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcHNjYW5fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKm9wdF9tYXhfcG9ydCA9ICIxMDI0IjsgICAgICAvKiAtUDogZGVmYXVsdCBtYXggcG9ydCAqLworCWNvbnN0IGNoYXIgKm9wdF9taW5fcG9ydCA9ICIxIjsgICAgICAgICAvKiAtcDogZGVmYXVsdCBtaW4gcG9ydCAqLworCWNvbnN0IGNoYXIgKm9wdF90aW1lb3V0ID0gIjUwMDAiOyAgICAgICAvKiAtdDogZGVmYXVsdCB0aW1lb3V0IGluIG1zZWMgKi8KKwkvKiBXZSBlc3RpbWF0ZSBydHQgYW5kIHdhaXQgcnR0KjQgYmVmb3JlIGNvbmNsdWRpbmcgdGhhdCBwb3J0IGlzCisJICogdG90YWxseSBibG9ja2VkLiBtaW4gcnR0IG9mIDUgbXMgbWF5IGJlIHRvbyBsb3cgaWYgeW91IGFyZQorCSAqIHNjYW5uaW5nIGFuIEludGVybmV0IGhvc3QgYmVoaW5kIHNhdHVyYXRlZC90cmFmZmljIHNoYXBlZCBsaW5rLgorCSAqIFJ1bGUgb2YgdGh1bWI6IHdpdGggbWluX3J0dCBvZiBOIG1zZWMsIHNjYW5uaW5nIDEwMDAgcG9ydHMKKwkgKiB3aWxsIHRha2UgTiBzZWNvbmRzIGF0IGFic29sdXRlIG1pbmltdW0gKi8KKwljb25zdCBjaGFyICpvcHRfbWluX3J0dCA9ICI1IjsgICAgICAgICAgLyogLVQ6IGRlZmF1bHQgbWluIHJ0dCBpbiBtc2VjICovCisJY29uc3QgY2hhciAqcmVzdWx0X3N0cjsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2FwOworCWludCBzOworCXVuc2lnbmVkIG9wdDsKKwl1bnNpZ25lZCBwb3J0LCBtYXhfcG9ydCwgbnBvcnRzOworCXVuc2lnbmVkIGNsb3NlZF9wb3J0cyA9IDA7CisJdW5zaWduZWQgb3Blbl9wb3J0cyA9IDA7CisJLyogYWxsIGluIHVzZWMgKi8KKwl1bnNpZ25lZCB0aW1lb3V0OworCXVuc2lnbmVkIG1pbl9ydHQ7CisJdW5zaWduZWQgcnR0XzQ7CisJdW5zaWduZWQgc3RhcnQsIGRpZmY7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MSI7IC8qIGV4YWN0bHkgb25lIG5vbi1vcHRpb24gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiY2JwOlA6dDpUOiIsICZvcHRfbWluX3BvcnQsICZvcHRfbWF4X3BvcnQsICZvcHRfdGltZW91dCwgJm9wdF9taW5fcnR0KTsKKwlhcmd2ICs9IG9wdGluZDsKKwltYXhfcG9ydCA9IHhhdG91X3JhbmdlKG9wdF9tYXhfcG9ydCwgMSwgNjU1MzUpOworCXBvcnQgPSB4YXRvdV9yYW5nZShvcHRfbWluX3BvcnQsIDEsIG1heF9wb3J0KTsKKwlucG9ydHMgPSBtYXhfcG9ydCAtIHBvcnQgKyAxOworCW1pbl9ydHQgPSB4YXRvdV9yYW5nZShvcHRfbWluX3J0dCwgMSwgSU5UX01BWC8xMDAwIC8gNCkgKiAxMDAwOworCXRpbWVvdXQgPSB4YXRvdV9yYW5nZShvcHRfdGltZW91dCwgMSwgSU5UX01BWC8xMDAwIC8gNCkgKiAxMDAwOworCS8qIEluaXRpYWwgcnR0IGlzIEJJRzogKi8KKwlydHRfNCA9IHRpbWVvdXQ7CisKKwlETVNHKCJtaW5fcnR0ICV1IHRpbWVvdXQgJXUiLCBtaW5fcnR0LCB0aW1lb3V0KTsKKworCWxzYXAgPSB4aG9zdDJzb2NrYWRkcigqYXJndiwgcG9ydCk7CisJcHJpbnRmKCJTY2FubmluZyAlcyBwb3J0cyAldSB0byAldVxuIFBvcnRcdFByb3RvXHRTdGF0ZVx0U2VydmljZVxuIiwKKwkJCSphcmd2LCBwb3J0LCBtYXhfcG9ydCk7CisKKwlmb3IgKDsgcG9ydCA8PSBtYXhfcG9ydDsgcG9ydCsrKSB7CisJCURNU0coInJ0dCAldSIsIHJ0dF80KTsKKworCQkvKiBUaGUgU09DS19TVFJFQU0gc29ja2V0IHR5cGUgaXMgaW1wbGVtZW50ZWQgb24gdGhlIFRDUC9JUCBwcm90b2NvbC4gKi8KKwkJc2V0X25wb3J0KCZsc2FwLT51LnNhLCBodG9ucyhwb3J0KSk7CisJCXMgPSB4c29ja2V0KGxzYXAtPnUuc2Euc2FfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCk7CisJCS8qIFdlIG5lZWQgdW5ibG9ja2luZyBzb2NrZXQgc28gd2UgZG9uJ3QgbmVlZCB0byB3YWl0IGZvciBFVElNRU9VVC4gKi8KKwkJLyogTm9uYmxvY2tpbmcgY29ubmVjdCB0eXBpY2FsbHkgImZhaWxzIiB3aXRoIGVycm5vID09IEVJTlBST0dSRVNTICovCisJCW5kZWxheV9vbihzKTsKKworCQlETVNHKCJjb25uZWN0IHRvIHBvcnQgJXUiLCBwb3J0KTsKKwkJcmVzdWx0X3N0ciA9IE5VTEw7CisJCXN0YXJ0ID0gTU9OT1RPTklDX1VTKCk7CisJCWlmIChjb25uZWN0KHMsICZsc2FwLT51LnNhLCBsc2FwLT5sZW4pID09IDApIHsKKwkJCS8qIFVubGlrZWx5LCBmb3IgbWUgZXZlbiBsb2NhbGhvc3QgZmFpbHMgOikgKi8KKwkJCURNU0coImNvbm5lY3Qgc3VjY2VlZGVkIik7CisJCQlnb3RvIG9wZW47CisJCX0KKwkJLyogQ2hlY2sgZm9yIHVudHlwaWNhbCBlcnJvcnMuLi4gKi8KKwkJaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFSU5QUk9HUkVTUworCQkgJiYgZXJybm8gIT0gRUNPTk5SRUZVU0VECisJCSkgeworCQkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwkJfQorCisJCWRpZmYgPSAwOworCQl3aGlsZSAoMSkgeworCQkJaWYgKGVycm5vID09IEVDT05OUkVGVVNFRCkgeworCQkJCWlmIChvcHQgJiAxKSAvKiAtYzogc2hvdyBjbG9zZWQgdG9vICovCisJCQkJCXJlc3VsdF9zdHIgPSAiY2xvc2VkIjsKKwkJCQljbG9zZWRfcG9ydHMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCURFUlIoInBvcnQgJXUgZXJybm8gJWQgQCV1IiwgcG9ydCwgZXJybm8sIGRpZmYpOworCisJCQlpZiAoZGlmZiA+IHJ0dF80KSB7CisJCQkJaWYgKG9wdCAmIDIpIC8qIC1iOiBzaG93IGJsb2NrZWQgdG9vICovCisJCQkJCXJlc3VsdF9zdHIgPSAiYmxvY2tlZCI7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBDYW4gc2xlZXAgKG11Y2gpIGxvbmdlciB0aGFuIHNwZWNpZmllZCBkZWxheS4KKwkJCSAqIFdlIGNoZWNrIHJ0dCBCRUZPUkUgd2UgdXNsZWVwLCBvdGhlcndpc2UKKwkJCSAqIG9uIGxvY2FsaG9zdCB3ZSdsbCBoYXZlIG5vIHdyaXRlcyBkb25lICghKQorCQkJICogYmVmb3JlIHdlIGV4Y2VlZCAocmF0aGVyIHNtYWxsKSBydHQgKi8KKwkJCXVzbGVlcChydHRfNC84KTsKKyBvcGVuOgorCQkJZGlmZiA9IE1PTk9UT05JQ19VUygpIC0gc3RhcnQ7CisJCQlETVNHKCJ3cml0ZSB0byBwb3J0ICV1IEAldSIsIHBvcnQsIGRpZmYgLSBzdGFydCk7CisJCQlpZiAod3JpdGUocywgIiAiLCAxKSA+PSAwKSB7IC8qIFdlIHdlcmUgYWJsZSB0byB3cml0ZSB0byB0aGUgc29ja2V0ICovCisJCQkJb3Blbl9wb3J0cysrOworCQkJCXJlc3VsdF9zdHIgPSAib3BlbiI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJRE1TRygib3V0IG9mIGxvb3AgQCV1IiwgZGlmZik7CisJCWlmIChyZXN1bHRfc3RyKQorCQkJcHJpbnRmKCIlNXUiICJcdCIgInRjcCIgIlx0IiAiJXMiICJcdCIgIiVzIiAiXG4iLAorCQkJCQlwb3J0LCByZXN1bHRfc3RyLCBwb3J0X25hbWUocG9ydCkpOworCisJCS8qIEVzdGltYXRlIG5ldyBydHQgLSB3ZSBkb24ndCB3YW50IHRvIHdhaXQgZW50aXJlIHRpbWVvdXQKKwkJICogZm9yIGVhY2ggcG9ydC4gKjQgYWxsb3dzIGZvciByaXNlIGluIG5ldCBkZWxheS4KKwkJICogV2UgaW5jcmVhc2UgcnR0IHF1aWNrbHkgKHJ0dF80KjQpLCBkZWNyZWFzZSBzbG93bHkKKwkJICogKGRpZmYgaXMgYXQgbGVhc3QgcnR0XzQvOCwgKjQgPT0gcnR0XzQvMikKKwkJICogYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFjY2lkZW50YWxseSBtaXNzIHBvcnRzLiAqLworCQlydHRfNCA9IGRpZmYgKiA0OworCQlpZiAocnR0XzQgPCBtaW5fcnR0KQorCQkJcnR0XzQgPSBtaW5fcnR0OworCQlpZiAocnR0XzQgPiB0aW1lb3V0KQorCQkJcnR0XzQgPSB0aW1lb3V0OworCQkvKiBDbGVhbiB1cCAqLworCQljbG9zZShzKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKGxzYXApOworCisJcHJpbnRmKCIlZCBjbG9zZWQsICVkIG9wZW4sICVkIHRpbWVkIG91dCAob3IgYmxvY2tlZCkgcG9ydHNcbiIsCisJCQkJCWNsb3NlZF9wb3J0cywKKwkJCQkJb3Blbl9wb3J0cywKKwkJCQkJbnBvcnRzIC0gKGNsb3NlZF9wb3J0cyArIG9wZW5fcG9ydHMpKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9yb3V0ZS5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9yb3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjVhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3JvdXRlLmMKQEAgLTAsMCArMSw3MTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogcm91dGUKKyAqCisgKiBTaW1pbGFyIHRvIHRoZSBzdGFuZGFyZCBVbml4IHJvdXRlLCBidXQgd2l0aCBvbmx5IHRoZSBuZWNlc3NhcnkKKyAqIHBhcnRzIGZvciBBRl9JTkVUIGFuZCBBRl9JTkVUNgorICoKKyAqIEJqb3JuIFdlc2VuLCBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKgorICogQXV0aG9yIG9mIHRoZSBvcmlnaW5hbCByb3V0ZToKKyAqICAgICAgICAgICAgICBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqICAgICAgICAgICAgICAoZGVyaXZlZCBmcm9tIEZ2SydzICdyb3V0ZS5jICAgICAxLjcwICAgIDAxLzA0Lzk0JykKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqCisgKiBkaXNwbGF5cm91dGUoKSBjb2RlIGFkZGVkIGJ5IFZsYWRpbWlyIE4uIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqIGFkanVzdG1lbnRzIGJ5IExhcnJ5IERvb2xpdHRsZSAgPExSRG9vbGl0dGxlQGxibC5nb3Y+CisgKgorICogSVBWNiBzdXBwb3J0IGFkZGVkIGJ5IEJhcnQgVmlzc2NoZXIgPG1hZ2lja0BsaW51eC1mYW4uY29tPgorICovCisKKy8qIDIwMDQvMDMvMDkgIE1hbnVlbCBOb3ZvYSBJSUkgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIFJld3JpdHRlbiB0byBmaXggc2V2ZXJhbCBidWdzLCBhZGQgYWRkaXRpb25hbCBlcnJvciBjaGVja2luZywgYW5kCisgKiByZW1vdmUgcmlkaWN1bG91cyBhbW91bnRzIG9mIGJsb2F0LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByb3V0ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW3thZGR8ZGVsfGRlbGV0ZX1dIgorLy91c2FnZTojZGVmaW5lIHJvdXRlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRWRpdCBrZXJuZWwgcm91dGluZyB0YWJsZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3QgcmVzb2x2ZSBuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJRGlzcGxheSBvdGhlci9tb3JlIGluZm9ybWF0aW9uIgorLy91c2FnZTogICAgICJcbgktQSBpbmV0IiBJRl9GRUFUVVJFX0lQVjYoIns2fSIpICIJU2VsZWN0IGFkZHJlc3MgZmFtaWx5IgorCisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisKKworI2lmbmRlZiBSVEZfVVAKKy8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggL3Vzci9zcmMvbGludXgvaW5jbHVkZS9saW51eC9yb3V0ZS5oICovCisjZGVmaW5lIFJURl9VUCAgICAgICAgICAweDAwMDEJLyogcm91dGUgdXNhYmxlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSVEZfR0FURVdBWSAgICAgMHgwMDAyCS8qIGRlc3RpbmF0aW9uIGlzIGEgZ2F0ZXdheSAgICAgKi8KKyNkZWZpbmUgUlRGX0hPU1QgICAgICAgIDB4MDAwNAkvKiBob3N0IGVudHJ5IChuZXQgb3RoZXJ3aXNlKSAgICovCisjZGVmaW5lIFJURl9SRUlOU1RBVEUgICAweDAwMDgJLyogcmVpbnN0YXRlIHJvdXRlIGFmdGVyIHRtb3V0ICAqLworI2RlZmluZSBSVEZfRFlOQU1JQyAgICAgMHgwMDEwCS8qIGNyZWF0ZWQgZHluLiAoYnkgcmVkaXJlY3QpICAgKi8KKyNkZWZpbmUgUlRGX01PRElGSUVEICAgIDB4MDAyMAkvKiBtb2RpZmllZCBkeW4uIChieSByZWRpcmVjdCkgICovCisjZGVmaW5lIFJURl9NVFUgICAgICAgICAweDAwNDAJLyogc3BlY2lmaWMgTVRVIGZvciB0aGlzIHJvdXRlICAqLworI2lmbmRlZiBSVEZfTVNTCisjZGVmaW5lIFJURl9NU1MgICAgICAgICBSVEZfTVRVCS8qIENvbXBhdGliaWxpdHkgOi0oICAgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBSVEZfV0lORE9XICAgICAgMHgwMDgwCS8qIHBlciByb3V0ZSB3aW5kb3cgY2xhbXBpbmcgICAgKi8KKyNkZWZpbmUgUlRGX0lSVFQgICAgICAgIDB4MDEwMAkvKiBJbml0aWFsIHJvdW5kIHRyaXAgdGltZSAgICAgICovCisjZGVmaW5lIFJURl9SRUpFQ1QgICAgICAweDAyMDAJLyogUmVqZWN0IHJvdXRlICAgICAgICAgICAgICAgICAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNJT0NBRERSVE9MRCkgfHwgZGVmaW5lZChSVEZfSVJUVCkJLyogcm91dGUgKi8KKyNkZWZpbmUgSEFWRV9ORVdfQUREUlQgMQorI2VuZGlmCisKKyNpZiBIQVZFX05FV19BRERSVAorI2RlZmluZSBtYXNrX2luX2FkZHIoeCkgKCgoc3RydWN0IHNvY2thZGRyX2luICopJigoeCkucnRfZ2VubWFzaykpLT5zaW5fYWRkci5zX2FkZHIpCisjZGVmaW5lIGZ1bGxfbWFzayh4KSAoeCkKKyNlbHNlCisjZGVmaW5lIG1hc2tfaW5fYWRkcih4KSAoKHgpLnJ0X2dlbm1hc2spCisjZGVmaW5lIGZ1bGxfbWFzayh4KSAoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmKHgpKS0+c2luX2FkZHIuc19hZGRyKQorI2VuZGlmCisKKy8qIFRoZSBSVEFDVElPTiBlbnRyaWVzIG11c3QgYWdyZWUgd2l0aCB0YmxfdmVyYltdIGJlbG93ISAqLworI2RlZmluZSBSVEFDVElPTl9BREQgMQorI2RlZmluZSBSVEFDVElPTl9ERUwgMgorCisvKiBGb3IgdGhlIHZhcmlvdXMgdGJsXypbXSBhcnJheXMsIHRoZSAxc3QgYnl0ZSBpcyB0aGUgb2Zmc2V0IHRvCisgKiB0aGUgbmV4dCBlbnRyeSBhbmQgdGhlIDJuZCBieXRlIGlzIHJldHVybiB2YWx1ZS4gKi8KKworI2RlZmluZSBORVRfRkxBRyAgMQorI2RlZmluZSBIT1NUX0ZMQUcgMgorCisvKiBXZSByZW1hcCAnLScgdG8gJyMnIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggZ2V0b3B0LiAqLworc3RhdGljIGNvbnN0IGNoYXIgdGJsX2hhc2hfbmV0X2hvc3RbXSBBTElHTjEgPQorCSJcMDA3XDAwMSNuZXRcMCIKKy8qCSJcMDEwXDAwMiNob3N0XDAiICovCisJIlwwMDdcMDAyI2hvc3QiCQkJCS8qIFNpbmNlIGxhc3QsIHdlIGNhbiBzYXZlIGEgYnl0ZS4gKi8KKzsKKworI2RlZmluZSBLV19UQUtFU19BUkcgICAgICAgICAgICAwMjAKKyNkZWZpbmUgS1dfU0VUU19GTEFHICAgICAgICAgICAgMDQwCisKKyNkZWZpbmUgS1dfSVBWeF9NRVRSSUMgICAgICAgICAgMDIwCisjZGVmaW5lIEtXX0lQVnhfTkVUTUFTSyAgICAgICAgIDAyMQorI2RlZmluZSBLV19JUFZ4X0dBVEVXQVkgICAgICAgICAwMjIKKyNkZWZpbmUgS1dfSVBWeF9NU1MgICAgICAgICAgICAgMDIzCisjZGVmaW5lIEtXX0lQVnhfV0lORE9XICAgICAgICAgIDAyNAorI2RlZmluZSBLV19JUFZ4X0lSVFQgICAgICAgICAgICAwMjUKKyNkZWZpbmUgS1dfSVBWeF9ERVZJQ0UgICAgICAgICAgMDI2CisKKyNkZWZpbmUgS1dfSVBWeF9GTEFHX09OTFkgICAgICAgMDQwCisjZGVmaW5lIEtXX0lQVnhfUkVKRUNUICAgICAgICAgIDA0MAorI2RlZmluZSBLV19JUFZ4X01PRCAgICAgICAgICAgICAwNDEKKyNkZWZpbmUgS1dfSVBWeF9EWU4gICAgICAgICAgICAgMDQyCisjZGVmaW5lIEtXX0lQVnhfUkVJTlNUQVRFICAgICAgIDA0MworCitzdGF0aWMgY29uc3QgY2hhciB0YmxfaXB2eFtdIEFMSUdOMSA9CisJLyogMDIwIGlzIHRoZSAidGFrZXMgYW4gYXJnIiBiaXQgKi8KKyNpZiBIQVZFX05FV19BRERSVAorCSJcMDExXDAyMG1ldHJpY1wwIgorI2VuZGlmCisJIlwwMTJcMDIxbmV0bWFza1wwIgorCSJcMDA1XDAyMmd3XDAiCisJIlwwMTJcMDIyZ2F0ZXdheVwwIgorCSJcMDA2XDAyM21zc1wwIgorCSJcMDExXDAyNHdpbmRvd1wwIgorI2lmZGVmIFJURl9JUlRUCisJIlwwMDdcMDI1aXJ0dFwwIgorI2VuZGlmCisJIlwwMDZcMDI2ZGV2XDAiCisJIlwwMTFcMDI2ZGV2aWNlXDAiCisJLyogMDQwIGlzIHRoZSAic2V0cyBhIGZsYWciIGJpdCAtIE1VU1QgbWF0Y2ggZmxhZ3NfaXB2eFtdIHZhbHVlcyBiZWxvdy4gKi8KKyNpZmRlZiBSVEZfUkVKRUNUCisJIlwwMTFcMDQwcmVqZWN0XDAiCisjZW5kaWYKKwkiXDAwNlwwNDFtb2RcMCIKKwkiXDAwNlwwNDJkeW5cMCIKKy8qCSJcMDE0XDA0M3JlaW5zdGF0ZVwwIiAqLworCSJcMDEzXDA0M3JlaW5zdGF0ZSIJCQkvKiBTaW5jZSBsYXN0LCB3ZSBjYW4gc2F2ZSBhIGJ5dGUuICovCis7CisKK3N0YXRpYyBjb25zdCBpbnQgZmxhZ3NfaXB2eFtdID0geyAvKiBNVVNUIG1hdGNoIHRibF9pcHZ4W10gdmFsdWVzIGFib3ZlLiAqLworI2lmZGVmIFJURl9SRUpFQ1QKKwlSVEZfUkVKRUNULAorI2VuZGlmCisJUlRGX01PRElGSUVELAorCVJURl9EWU5BTUlDLAorCVJURl9SRUlOU1RBVEUKK307CisKK3N0YXRpYyBpbnQga3dfbG9va3VwKGNvbnN0IGNoYXIgKmt3dGJsLCBjaGFyICoqKnBhcmdzKQoreworCWlmICgqKnBhcmdzKSB7CisJCWRvIHsKKwkJCWlmIChzdHJjbXAoa3d0YmwrMiwgKipwYXJncykgPT0gMCkgeyAvKiBGb3VuZCBhIG1hdGNoLiAqLworCQkJCSpwYXJncyArPSAxOworCQkJCWlmIChrd3RibFsxXSAmIEtXX1RBS0VTX0FSRykgeworCQkJCQlpZiAoISoqcGFyZ3MpIHsJLyogTm8gbW9yZSBhcmdzISAqLworCQkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCQl9CisJCQkJCSpwYXJncyArPSAxOyAvKiBDYWxsaW5nIHJvdXRpbmUgd2lsbCB1c2UgYXJnc1stMV0uICovCisJCQkJfQorCQkJCXJldHVybiBrd3RibFsxXTsKKwkJCX0KKwkJCWt3dGJsICs9ICprd3RibDsKKwkJfSB3aGlsZSAoKmt3dGJsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEFkZCBvciBkZWxldGUgYSByb3V0ZSwgZGVwZW5kaW5nIG9uIGFjdGlvbi4gKi8KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgSU5FVF9zZXRyb3V0ZShpbnQgYWN0aW9uLCBjaGFyICoqYXJncykKK3sKKwkvKiBjaGFyIGJ1ZmZlciBpbnN0ZWFkIG9mIGJvbmEtZmlkZSBzdHJ1Y3QgYXZvaWRzIGFsaWFzaW5nIHdhcm5pbmcgKi8KKwljaGFyIHJ0X2J1ZltzaXplb2Yoc3RydWN0IHJ0ZW50cnkpXTsKKwlzdHJ1Y3QgcnRlbnRyeSAqY29uc3QgcnQgPSAodm9pZCAqKXJ0X2J1ZjsKKworCWNvbnN0IGNoYXIgKm5ldG1hc2sgPSBOVUxMOworCWludCBza2ZkLCBpc25ldCwgeGZsYWc7CisKKwkvKiBHcmFiIHRoZSAtbmV0IG9yIC1ob3N0IG9wdGlvbnMuICBSZW1lbWJlciB0aGV5IHdlcmUgdHJhbnNmb3JtZWQuICovCisJeGZsYWcgPSBrd19sb29rdXAodGJsX2hhc2hfbmV0X2hvc3QsICZhcmdzKTsKKworCS8qIElmIHdlIGRpZCBncmFiIC1uZXQgb3IgLWhvc3QsIG1ha2Ugc3VyZSB3ZSBzdGlsbCBoYXZlIGFuIGFyZyBsZWZ0LiAqLworCWlmICgqYXJncyA9PSBOVUxMKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBDbGVhbiBvdXQgdGhlIFJUUkVRIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQocnQsIDAsIHNpemVvZigqcnQpKTsKKworCXsKKwkJY29uc3QgY2hhciAqdGFyZ2V0ID0gKmFyZ3MrKzsKKwkJY2hhciAqcHJlZml4OworCisJCS8qIHJlY29nbml6ZSB4LngueC54L21hc2sgZm9ybWF0LiAqLworCQlwcmVmaXggPSBzdHJjaHIodGFyZ2V0LCAnLycpOworCQlpZiAocHJlZml4KSB7CisJCQlpbnQgcHJlZml4X2xlbjsKKworCQkJcHJlZml4X2xlbiA9IHhhdG91bF9yYW5nZShwcmVmaXgrMSwgMCwgMzIpOworCQkJbWFza19pbl9hZGRyKCpydCkgPSBodG9ubCggfigweGZmZmZmZmZmVUwgPj4gcHJlZml4X2xlbikpOworCQkJKnByZWZpeCA9ICdcMCc7CisjaWYgSEFWRV9ORVdfQUREUlQKKwkJCXJ0LT5ydF9nZW5tYXNrLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qIERlZmF1bHQgbmV0bWFzay4gKi8KKwkJCW5ldG1hc2sgPSAiZGVmYXVsdCI7CisJCX0KKwkJLyogUHJlZmVyIGhvc3RuYW1lIGxvb2t1cCBpcyAtaG9zdCBmbGFnICh4ZmxhZz09MSkgd2FzIGdpdmVuLiAqLworCQlpc25ldCA9IElORVRfcmVzb2x2ZSh0YXJnZXQsIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnJ0LT5ydF9kc3QsCisJCQkJCQkJICh4ZmxhZyAmIEhPU1RfRkxBRykpOworCQlpZiAoaXNuZXQgPCAwKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVzb2x2aW5nICVzIiwgdGFyZ2V0KTsKKwkJfQorCQlpZiAocHJlZml4KSB7CisJCQkvKiBkbyBub3QgZGVzdHJveSBwcmVmaXggZm9yIHByb2Nlc3MgYXJncyAqLworCQkJKnByZWZpeCA9ICcvJzsKKwkJfQorCX0KKworCWlmICh4ZmxhZykgewkJLyogUmVpbml0IGlzbmV0IGlmIC1uZXQgb3IgLWhvc3Qgd2FzIHNwZWNpZmllZC4gKi8KKwkJaXNuZXQgPSAoeGZsYWcgJiBORVRfRkxBRyk7CisJfQorCisJLyogRmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzLiAqLworCXJ0LT5ydF9mbGFncyA9ICgoaXNuZXQpID8gUlRGX1VQIDogKFJURl9VUCB8IFJURl9IT1NUKSk7CisKKwl3aGlsZSAoKmFyZ3MpIHsKKwkJaW50IGsgPSBrd19sb29rdXAodGJsX2lwdngsICZhcmdzKTsKKwkJY29uc3QgY2hhciAqYXJnc19tMSA9IGFyZ3NbLTFdOworCisJCWlmIChrICYgS1dfSVBWeF9GTEFHX09OTFkpIHsKKwkJCXJ0LT5ydF9mbGFncyB8PSBmbGFnc19pcHZ4W2sgJiAzXTsKKwkJCWNvbnRpbnVlOworCQl9CisKKyNpZiBIQVZFX05FV19BRERSVAorCQlpZiAoayA9PSBLV19JUFZ4X01FVFJJQykgeworCQkJcnQtPnJ0X21ldHJpYyA9IHhhdG91bChhcmdzX20xKSArIDE7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisKKwkJaWYgKGsgPT0gS1dfSVBWeF9ORVRNQVNLKSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHIgbWFzazsKKworCQkJaWYgKG1hc2tfaW5fYWRkcigqcnQpKSB7CisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJfQorCisJCQluZXRtYXNrID0gYXJnc19tMTsKKwkJCWlzbmV0ID0gSU5FVF9yZXNvbHZlKG5ldG1hc2ssIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJm1hc2ssIDApOworCQkJaWYgKGlzbmV0IDwgMCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJyZXNvbHZpbmcgJXMiLCBuZXRtYXNrKTsKKwkJCX0KKwkJCXJ0LT5ydF9nZW5tYXNrID0gZnVsbF9tYXNrKG1hc2spOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoayA9PSBLV19JUFZ4X0dBVEVXQVkpIHsKKwkJCWlmIChydC0+cnRfZmxhZ3MgJiBSVEZfR0FURVdBWSkgeworCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCX0KKworCQkJaXNuZXQgPSBJTkVUX3Jlc29sdmUoYXJnc19tMSwKKwkJCQkJCShzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnJ0LT5ydF9nYXRld2F5LCAxKTsKKwkJCXJ0LT5ydF9mbGFncyB8PSBSVEZfR0FURVdBWTsKKworCQkJaWYgKGlzbmV0KSB7CisJCQkJaWYgKGlzbmV0IDwgMCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVzb2x2aW5nICVzIiwgYXJnc19tMSk7CisJCQkJfQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJnYXRld2F5ICVzIGlzIGEgTkVUV09SSyIsIGFyZ3NfbTEpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoayA9PSBLV19JUFZ4X01TUykgewkvKiBDaGVjayB2YWxpZCBNU1MgYm91bmRzLiAqLworCQkJcnQtPnJ0X2ZsYWdzIHw9IFJURl9NU1M7CisJCQlydC0+cnRfbXNzID0geGF0b3VsX3JhbmdlKGFyZ3NfbTEsIDY0LCAzMjc2OCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChrID09IEtXX0lQVnhfV0lORE9XKSB7CS8qIENoZWNrIHZhbGlkIHdpbmRvdyBib3VuZHMuICovCisJCQlydC0+cnRfZmxhZ3MgfD0gUlRGX1dJTkRPVzsKKwkJCXJ0LT5ydF93aW5kb3cgPSB4YXRvdWxfcmFuZ2UoYXJnc19tMSwgMTI4LCBJTlRfTUFYKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKyNpZmRlZiBSVEZfSVJUVAorCQlpZiAoayA9PSBLV19JUFZ4X0lSVFQpIHsKKwkJCXJ0LT5ydF9mbGFncyB8PSBSVEZfSVJUVDsKKwkJCXJ0LT5ydF9pcnR0ID0geGF0b3VsKGFyZ3NfbTEpOworCQkJcnQtPnJ0X2lydHQgKj0gKHN5c2NvbmYoX1NDX0NMS19UQ0spIC8gMTAwKTsJLyogRklYTUUgKi8KKyNpZiAwCQkJCQkvKiBGSVhNRTogZG8gd2UgbmVlZCB0byBjaGVjayBhbnl0aGluZyBvZiB0aGlzPyAqLworCQkJaWYgKHJ0LT5ydF9pcnR0IDwgMSB8fCBydC0+cnRfaXJ0dCA+ICgxMjAgKiBIWikpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGlydHQiKTsKKwkJCX0KKyNlbmRpZgorCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCisJCS8qIERldmljZSBpcyBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGJlIHRoZSBsYXN0IGFyZyBzcGVjaWZpZWQKKwkJICogYW5kIGRvZXNuJ3QgcmVxdXJlIHRoZSBkZXYvZGV2aWNlIGtleXdvcmQgaW4gdGhhdCBjYXNlLiAqLworCQlpZiAoIXJ0LT5ydF9kZXYgJiYgKChrID09IEtXX0lQVnhfREVWSUNFKSB8fCAoIWsgJiYgISorK2FyZ3MpKSkgeworCQkJLyogRG9uJ3QgdXNlIGFyZ3NfbTEgaGVyZSBzaW5jZSBhcmdzIG1heSBoYXZlIGNoYW5nZWQhICovCisJCQlydC0+cnRfZGV2ID0gYXJnc1stMV07CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE5vdGhpbmcgbWF0Y2hlZC4gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworI2lmZGVmIFJURl9SRUpFQ1QKKwlpZiAoKHJ0LT5ydF9mbGFncyAmIFJURl9SRUpFQ1QpICYmICFydC0+cnRfZGV2KSB7CisJCXJ0LT5ydF9kZXYgPSAoY2hhciopImxvIjsKKwl9CisjZW5kaWYKKworCS8qIHNhbml0eSBjaGVja3MuLiAqLworCWlmIChtYXNrX2luX2FkZHIoKnJ0KSkgeworCQl1aW50MzJfdCBtYXNrID0gbWFza19pbl9hZGRyKCpydCk7CisKKwkJbWFzayA9IH5udG9obChtYXNrKTsKKwkJaWYgKChydC0+cnRfZmxhZ3MgJiBSVEZfSE9TVCkgJiYgbWFzayAhPSAweGZmZmZmZmZmKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibmV0bWFzayAlLjh4IGFuZCBob3N0IHJvdXRlIGNvbmZsaWN0IiwKKwkJCQkJCQkJICh1bnNpZ25lZCBpbnQpIG1hc2spOworCQl9CisJCWlmIChtYXNrICYgKG1hc2sgKyAxKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJvZ3VzIG5ldG1hc2sgJXMiLCBuZXRtYXNrKTsKKwkJfQorCQltYXNrID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnJ0LT5ydF9kc3QpLT5zaW5fYWRkci5zX2FkZHI7CisJCWlmIChtYXNrICYgfih1aW50MzJfdCltYXNrX2luX2FkZHIoKnJ0KSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5ldG1hc2sgYW5kIHJvdXRlIGFkZHJlc3MgY29uZmxpY3QiKTsKKwkJfQorCX0KKworCS8qIEZpbGwgb3V0IG5ldG1hc2sgaWYgc3RpbGwgdW5zZXQgKi8KKwlpZiAoKGFjdGlvbiA9PSBSVEFDVElPTl9BREQpICYmIChydC0+cnRfZmxhZ3MgJiBSVEZfSE9TVCkpIHsKKwkJbWFza19pbl9hZGRyKCpydCkgPSAweGZmZmZmZmZmOworCX0KKworCS8qIENyZWF0ZSBhIHNvY2tldCB0byB0aGUgSU5FVCBrZXJuZWwuICovCisJc2tmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisKKwlpZiAoYWN0aW9uID09IFJUQUNUSU9OX0FERCkKKwkJeGlvY3RsKHNrZmQsIFNJT0NBRERSVCwgcnQpOworCWVsc2UKKwkJeGlvY3RsKHNrZmQsIFNJT0NERUxSVCwgcnQpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShza2ZkKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgSU5FVDZfc2V0cm91dGUoaW50IGFjdGlvbiwgY2hhciAqKmFyZ3MpCit7CisJc3RydWN0IHNvY2thZGRyX2luNiBzYTY7CisJc3RydWN0IGluNl9ydG1zZyBydDsKKwlpbnQgcHJlZml4X2xlbiwgc2tmZDsKKwljb25zdCBjaGFyICpkZXZuYW1lOworCisJCS8qIFdlIGtub3cgYXJncyBpc24ndCBOVUxMIGZyb20gdGhlIGNoZWNrIGluIHJvdXRlX21haW4uICovCisJCWNvbnN0IGNoYXIgKnRhcmdldCA9ICphcmdzKys7CisKKwkJaWYgKHN0cmNtcCh0YXJnZXQsICJkZWZhdWx0IikgPT0gMCkgeworCQkJcHJlZml4X2xlbiA9IDA7CisJCQltZW1zZXQoJnNhNiwgMCwgc2l6ZW9mKHNhNikpOworCQl9IGVsc2UgeworCQkJY2hhciAqY3A7CisJCQljcCA9IHN0cmNocih0YXJnZXQsICcvJyk7IC8qIFllcy4uLiBjb25zdCB0byBub24gaXMgb2suICovCisJCQlpZiAoY3ApIHsKKwkJCQkqY3AgPSAnXDAnOworCQkJCXByZWZpeF9sZW4gPSB4YXRvdWxfcmFuZ2UoY3AgKyAxLCAwLCAxMjgpOworCQkJfSBlbHNlIHsKKwkJCQlwcmVmaXhfbGVuID0gMTI4OworCQkJfQorCQkJaWYgKElORVQ2X3Jlc29sdmUodGFyZ2V0LCAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc2E2KSA8IDApIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVzb2x2aW5nICVzIiwgdGFyZ2V0KTsKKwkJCX0KKwkJfQorCisJLyogQ2xlYW4gb3V0IHRoZSBSVFJFUSBzdHJ1Y3R1cmUuICovCisJbWVtc2V0KCZydCwgMCwgc2l6ZW9mKHJ0KSk7CisKKwltZW1jcHkoJnJ0LnJ0bXNnX2RzdCwgc2E2LnNpbjZfYWRkci5zNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisKKwkvKiBGaWxsIGluIHRoZSBvdGhlciBmaWVsZHMuICovCisJcnQucnRtc2dfZHN0X2xlbiA9IHByZWZpeF9sZW47CisJcnQucnRtc2dfZmxhZ3MgPSAoKHByZWZpeF9sZW4gPT0gMTI4KSA/IChSVEZfVVB8UlRGX0hPU1QpIDogUlRGX1VQKTsKKwlydC5ydG1zZ19tZXRyaWMgPSAxOworCisJZGV2bmFtZSA9IE5VTEw7CisKKwl3aGlsZSAoKmFyZ3MpIHsKKwkJaW50IGsgPSBrd19sb29rdXAodGJsX2lwdngsICZhcmdzKTsKKwkJY29uc3QgY2hhciAqYXJnc19tMSA9IGFyZ3NbLTFdOworCisJCWlmICgoayA9PSBLV19JUFZ4X01PRCkgfHwgKGsgPT0gS1dfSVBWeF9EWU4pKSB7CisJCQlydC5ydG1zZ19mbGFncyB8PSBmbGFnc19pcHZ4W2sgJiAzXTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGsgPT0gS1dfSVBWeF9NRVRSSUMpIHsKKwkJCXJ0LnJ0bXNnX21ldHJpYyA9IHhhdG91bChhcmdzX20xKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGsgPT0gS1dfSVBWeF9HQVRFV0FZKSB7CisJCQlpZiAocnQucnRtc2dfZmxhZ3MgJiBSVEZfR0FURVdBWSkgeworCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCX0KKworCQkJaWYgKElORVQ2X3Jlc29sdmUoYXJnc19tMSwgKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgJnNhNikgPCAwKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlc29sdmluZyAlcyIsIGFyZ3NfbTEpOworCQkJfQorCQkJbWVtY3B5KCZydC5ydG1zZ19nYXRld2F5LCBzYTYuc2luNl9hZGRyLnM2X2FkZHIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJcnQucnRtc2dfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIERldmljZSBpcyBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGJlIHRoZSBsYXN0IGFyZyBzcGVjaWZpZWQKKwkJICogYW5kIGRvZXNuJ3QgcmVxdXJlIHRoZSBkZXYvZGV2aWNlIGtleXdvcmQgaW4gdGhhdCBjYXNlLiAqLworCQlpZiAoIWRldm5hbWUgJiYgKChrID09IEtXX0lQVnhfREVWSUNFKSB8fCAoIWsgJiYgISorK2FyZ3MpKSkgeworCQkJLyogRG9uJ3QgdXNlIGFyZ3NfbTEgaGVyZSBzaW5jZSBhcmdzIG1heSBoYXZlIGNoYW5nZWQhICovCisJCQlkZXZuYW1lID0gYXJnc1stMV07CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE5vdGhpbmcgbWF0Y2hlZC4gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIENyZWF0ZSBhIHNvY2tldCB0byB0aGUgSU5FVDYga2VybmVsLiAqLworCXNrZmQgPSB4c29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKworCXJ0LnJ0bXNnX2lmaW5kZXggPSAwOworCisJaWYgKGRldm5hbWUpIHsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKwkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldm5hbWUpOworCQl4aW9jdGwoc2tmZCwgU0lPR0lGSU5ERVgsICZpZnIpOworCQlydC5ydG1zZ19pZmluZGV4ID0gaWZyLmlmcl9pZmluZGV4OworCX0KKworCS8qIFRlbGwgdGhlIGtlcm5lbCB0byBhY2NlcHQgdGhpcyByb3V0ZS4gKi8KKwlpZiAoYWN0aW9uID09IFJUQUNUSU9OX0FERCkKKwkJeGlvY3RsKHNrZmQsIFNJT0NBRERSVCwgJnJ0KTsKKwllbHNlCisJCXhpb2N0bChza2ZkLCBTSU9DREVMUlQsICZydCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGNsb3NlKHNrZmQpOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBmbGFndmFsc1tdID0geyAvKiBNdXN0IGFncmVlIHdpdGggZmxhZ2NoYXJzW10uICovCisJUlRGX0dBVEVXQVksCisJUlRGX0hPU1QsCisJUlRGX1JFSU5TVEFURSwKKwlSVEZfRFlOQU1JQywKKwlSVEZfTU9ESUZJRUQsCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCVJURl9ERUZBVUxULAorCVJURl9BRERSQ09ORiwKKwlSVEZfQ0FDSEUKKyNlbmRpZgorfTsKKworI2RlZmluZSBJUFY0X01BU0sgKFJURl9HQVRFV0FZfFJURl9IT1NUfFJURl9SRUlOU1RBVEV8UlRGX0RZTkFNSUN8UlRGX01PRElGSUVEKQorI2RlZmluZSBJUFY2X01BU0sgKFJURl9HQVRFV0FZfFJURl9IT1NUfFJURl9ERUZBVUxUfFJURl9BRERSQ09ORnxSVEZfQ0FDSEUpCisKKy8qIE11c3QgYWdyZWUgd2l0aCBmbGFndmFsc1tdLiAqLworc3RhdGljIGNvbnN0IGNoYXIgZmxhZ2NoYXJzW10gQUxJR04xID0KKwkiR0hSRE0iCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCSJEQUMiCisjZW5kaWYKKzsKKworc3RhdGljIHZvaWQgc2V0X2ZsYWdzKGNoYXIgKmZsYWdzdHIsIGludCBmbGFncykKK3sKKwlpbnQgaTsKKworCSpmbGFnc3RyKysgPSAnVSc7CisKKwlmb3IgKGkgPSAwOyAoKmZsYWdzdHIgPSBmbGFnY2hhcnNbaV0pICE9IDA7IGkrKykgeworCQlpZiAoZmxhZ3MgJiBmbGFndmFsc1tpXSkgeworCQkJKytmbGFnc3RyOworCQl9CisJfQorfQorCisvKiBhbHNvIHVzZWQgaW4gbmV0c3RhdCAqLwordm9pZCBGQVNUX0ZVTkMgYmJfZGlzcGxheXJvdXRlcyhpbnQgbm9yZXNvbHZlLCBpbnQgbmV0c3RhdGZtdCkKK3sKKwljaGFyIGRldm5hbWVbNjRdLCBmbGFnc1sxNl0sICpzZGVzdCwgKnNndzsKKwl1bnNpZ25lZCBsb25nIGQsIGcsIG07CisJaW50IGZsZ3MsIHJlZiwgdXNlLCBtZXRyaWMsIG10dSwgd2luLCBpcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc19hZGRyOworCXN0cnVjdCBpbl9hZGRyIG1hc2s7CisKKwlGSUxFICpmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2MvbmV0L3JvdXRlIik7CisKKwlwcmludGYoIktlcm5lbCBJUCByb3V0aW5nIHRhYmxlXG4iCisJICAgICAgICJEZXN0aW5hdGlvbiAgICAgR2F0ZXdheSAgICAgICAgIEdlbm1hc2sgICAgICAgICBGbGFncyAlcyBJZmFjZVxuIiwKKwkJCW5ldHN0YXRmbXQgPyAiICBNU1MgV2luZG93ICBpcnR0IiA6ICJNZXRyaWMgUmVmICAgIFVzZSIpOworCisJaWYgKGZzY2FuZihmcCwgIiUqW15cbl1cbiIpIDwgMCkgeyAvKiBTa2lwIHRoZSBmaXJzdCBsaW5lLiAqLworCQlnb3RvIEVSUk9SOwkJICAgLyogRW1wdHkgb3IgbWlzc2luZyBsaW5lLCBvciByZWFkIGVycm9yLiAqLworCX0KKwl3aGlsZSAoMSkgeworCQlpbnQgcjsKKwkJciA9IGZzY2FuZihmcCwgIiU2M3MlbHglbHglWCVkJWQlZCVseCVkJWQlZFxuIiwKKwkJCQkgICBkZXZuYW1lLCAmZCwgJmcsICZmbGdzLCAmcmVmLCAmdXNlLCAmbWV0cmljLCAmbSwKKwkJCQkgICAmbXR1LCAmd2luLCAmaXIpOworCQlpZiAociAhPSAxMSkgeworCQkJaWYgKChyIDwgMCkgJiYgZmVvZihmcCkpIHsgLyogRU9GIHdpdGggbm8gKG5vbnNwYWNlKSBjaGFycyByZWFkLiAqLworCQkJCWJyZWFrOworCQkJfQorIEVSUk9SOgorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZzY2FuZiIpOworCQl9CisKKwkJaWYgKCEoZmxncyAmIFJURl9VUCkpIHsgLyogU2tpcCBpbnRlcmZhY2VzIHRoYXQgYXJlIGRvd24uICovCisJCQljb250aW51ZTsKKwkJfQorCisJCXNldF9mbGFncyhmbGFncywgKGZsZ3MgJiBJUFY0X01BU0spKTsKKyNpZmRlZiBSVEZfUkVKRUNUCisJCWlmIChmbGdzICYgUlRGX1JFSkVDVCkgeworCQkJZmxhZ3NbMF0gPSAnISc7CisJCX0KKyNlbmRpZgorCisJCW1lbXNldCgmc19hZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCXNfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc19hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGQ7CisJCXNkZXN0ID0gSU5FVF9ycmVzb2x2ZSgmc19hZGRyLCAobm9yZXNvbHZlIHwgMHg4MDAwKSwgbSk7IC8qICdkZWZhdWx0JyBpbnN0ZWFkIG9mICcqJyAqLworCQlzX2FkZHIuc2luX2FkZHIuc19hZGRyID0gZzsKKwkJc2d3ID0gSU5FVF9ycmVzb2x2ZSgmc19hZGRyLCAobm9yZXNvbHZlIHwgMHg0MDAwKSwgbSk7IC8qIEhvc3QgaW5zdGVhZCBvZiBuZXQgKi8KKwkJbWFzay5zX2FkZHIgPSBtOworCQkvKiAiJTE1LjE1cyIgdHJ1bmNhdGVzIGhvc3RuYW1lcywgZG8gd2UgcmVhbGx5IHdhbnQgdGhhdD8gKi8KKwkJcHJpbnRmKCIlLTE1LjE1cyAlLTE1LjE1cyAlLTE2cyUtNnMiLCBzZGVzdCwgc2d3LCBpbmV0X250b2EobWFzayksIGZsYWdzKTsKKwkJZnJlZShzZGVzdCk7CisJCWZyZWUoc2d3KTsKKwkJaWYgKG5ldHN0YXRmbXQpIHsKKwkJCXByaW50ZigiJTVkICUtNWQgJTZkICVzXG4iLCBtdHUsIHdpbiwgaXIsIGRldm5hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIlLTZkICUtMmQgJTdkICVzXG4iLCBtZXRyaWMsIHJlZiwgdXNlLCBkZXZuYW1lKTsKKwkJfQorCX0KKwlmY2xvc2UoZnApOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCitzdGF0aWMgdm9pZCBJTkVUNl9kaXNwbGF5cm91dGVzKHZvaWQpCit7CisJY2hhciBhZGRyNlsxMjhdLCAqbmFkZHI2OworCS8qIEluIGFkZHI2eCwgd2Ugc3RvcmUgYm90aCA0MC1ieXRlICc6Jy1kZWxpbWl0ZWQgaXB2NiBhZGRyZXNzZXMuCisJICogV2UgcmVhZCB0aGUgbm9uLWRlbGltaXRlZCBzdHJpbmdzIGludG8gdGhlIHRhaWwgb2YgdGhlIGJ1ZmZlcgorCSAqIHVzaW5nIGZzY2FuZiBhbmQgdGhlbiBtb2RpZnkgdGhlIGJ1ZmZlciBieSBzaGlmdGluZyBmb3J3YXJkCisJICogd2hpbGUgaW5zZXJ0aW5nICc6J3MgYW5kIHRoZSBudWwgdGVybWluYXRvciBmb3IgdGhlIGZpcnN0IHN0cmluZy4KKwkgKiBIZW5jZSB0aGUgc3RyaW5ncyBhcmUgYXQgYWRkcjZ4IGFuZCBhZGRyNngrNDAuICBUaGlzIGdlbmVyYXRlcworCSAqIF9tdWNoXyBsZXNzIGNvZGUgdGhhbiB0aGUgcHJldmlvdXMgKHVwc3RyZWFtKSBhcHByb2FjaC4gKi8KKwljaGFyIGFkZHI2eFs4MF07CisJY2hhciBpZmFjZVsxNl0sIGZsYWdzWzE2XTsKKwlpbnQgaWZsYWdzLCBtZXRyaWMsIHJlZmNudCwgdXNlLCBwcmVmaXhfbGVuLCBzbGVuOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc25hZGRyNjsKKworCUZJTEUgKmZwID0geGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9uZXQvaXB2Nl9yb3V0ZSIpOworCisJcHJpbnRmKCJLZXJuZWwgSVB2NiByb3V0aW5nIHRhYmxlXG4lLTQ0cyUtNDBzIgorCQkJICAiRmxhZ3MgTWV0cmljIFJlZiAgICBVc2UgSWZhY2VcbiIsCisJCQkgICJEZXN0aW5hdGlvbiIsICJOZXh0IEhvcCIpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHI7CisJCXIgPSBmc2NhbmYoZnAsICIlMzJzJXglKnMleCUzMnMleCV4JXgleCVzXG4iLAorCQkJCWFkZHI2eCsxNCwgJnByZWZpeF9sZW4sICZzbGVuLCBhZGRyNngrNDArNywKKwkJCQkmbWV0cmljLCAmdXNlLCAmcmVmY250LCAmaWZsYWdzLCBpZmFjZSk7CisJCWlmIChyICE9IDkpIHsKKwkJCWlmICgociA8IDApICYmIGZlb2YoZnApKSB7IC8qIEVPRiB3aXRoIG5vIChub25zcGFjZSkgY2hhcnMgcmVhZC4gKi8KKwkJCQlicmVhazsKKwkJCX0KKyBFUlJPUjoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmc2NhbmYiKTsKKwkJfQorCisJCS8qIERvIHRoZSBhZGRyNnggc2hpZnQtYW5kLWluc2VydCBjaGFuZ2VzIHRvICc6Jy1kZWxpbWl0IGFkZHJlc3Nlcy4KKwkJICogRm9yIG5vdywgYWx3YXlzIGRvIHRoaXMgdG8gdmFsaWRhdGUgdGhlIHByb2Mgcm91dGUgZm9ybWF0LCBldmVuCisJCSAqIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bi4gKi8KKwkJeworCQkJaW50IGkgPSAwOworCQkJY2hhciAqcCA9IGFkZHI2eCsxNDsKKworCQkJZG8geworCQkJCWlmICghKnApIHsKKwkJCQkJaWYgKGkgPT0gNDApIHsgLyogbnVsIHRlcm1pbmF0b3IgZm9yIDFzdCBhZGRyZXNzPyAqLworCQkJCQkJYWRkcjZ4WzM5XSA9IDA7CS8qIEZpeHVwLi4uIG5lZWQgMCBpbnN0ZWFkIG9mICc6Jy4gKi8KKwkJCQkJCSsrcDsJLyogU2tpcCBhbmQgY29udGludWUuICovCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKwkJCQlhZGRyNnhbaSsrXSA9ICpwKys7CisJCQkJaWYgKCEoKGkrMSkgJSA1KSkgeworCQkJCQlhZGRyNnhbaSsrXSA9ICc6JzsKKwkJCQl9CisJCQl9IHdoaWxlIChpIDwgNDArMjgrNyk7CisJCX0KKworCQlpZiAoIShpZmxhZ3MgJiBSVEZfVVApKSB7IC8qIFNraXAgaW50ZXJmYWNlcyB0aGF0IGFyZSBkb3duLiAqLworCQkJY29udGludWU7CisJCX0KKworCQlzZXRfZmxhZ3MoZmxhZ3MsIChpZmxhZ3MgJiBJUFY2X01BU0spKTsKKworCQlyID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCWluZXRfcHRvbihBRl9JTkVUNiwgYWRkcjZ4ICsgciwKKwkJCQkJICAoc3RydWN0IHNvY2thZGRyICopICZzbmFkZHI2LnNpbjZfYWRkcik7CisJCQlzbmFkZHI2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQluYWRkcjYgPSBJTkVUNl9ycmVzb2x2ZSgoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc25hZGRyNiwKKwkJCQkJCSAgIDB4MGZmZiAvKiBBcHBhcmVudGx5LCB1cHN0cmVhbSBuZXZlciByZXNvbHZlcy4gKi8KKwkJCQkJCSAgICk7CisKKwkJCWlmICghcikgewkJCS8qIDFzdCBwYXNzICovCisJCQkJc25wcmludGYoYWRkcjYsIHNpemVvZihhZGRyNiksICIlcy8lZCIsIG5hZGRyNiwgcHJlZml4X2xlbik7CisJCQkJciArPSA0MDsKKwkJCQlmcmVlKG5hZGRyNik7CisJCQl9IGVsc2UgewkJCS8qIDJuZCBwYXNzICovCisJCQkJLyogUHJpbnQgdGhlIGluZm8uICovCisJCQkJcHJpbnRmKCIlLTQzcyAlLTM5cyAlLTVzICUtNmQgJS0yZCAlN2QgJS04c1xuIiwKKwkJCQkJCWFkZHI2LCBuYWRkcjYsIGZsYWdzLCBtZXRyaWMsIHJlZmNudCwgdXNlLCBpZmFjZSk7CisJCQkJZnJlZShuYWRkcjYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWZjbG9zZShmcCk7Cit9CisKKyNlbmRpZgorCisjZGVmaW5lIFJPVVRFX09QVF9BICAgICAweDAxCisjZGVmaW5lIFJPVVRFX09QVF9uICAgICAweDAyCisjZGVmaW5lIFJPVVRFX09QVF9lICAgICAweDA0CisjZGVmaW5lIFJPVVRFX09QVF9JTkVUNiAweDA4IC8qIE5vdCBhbiBhY3R1YWwgb3B0aW9uLiBTZWUgYmVsb3cuICovCisKKy8qIDFzdCBieXRlIGlzIG9mZnNldCB0byBuZXh0IGVudHJ5IG9mZnNldC4gIDJuZCBieXRlIGlzIHJldHVybiB2YWx1ZS4gKi8KKy8qIDJuZCBieXRlIG1hdGNoZXMgUlRBQ1RJT05fKiBjb2RlICovCitzdGF0aWMgY29uc3QgY2hhciB0YmxfdmVyYltdIEFMSUdOMSA9CisJIlwwMDZcMDAxYWRkXDAiCisJIlwwMDZcMDAyZGVsXDAiCisvKgkiXDAxMVwwMDJkZWxldGVcMCIgKi8KKwkiXDAxMFwwMDJkZWxldGUiICAvKiBTaW5jZSBpdCdzIGxhc3QsIHdlIGNhbiBzYXZlIGEgYnl0ZS4gKi8KKzsKKworaW50IHJvdXRlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByb3V0ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWludCB3aGF0OworCWNoYXIgKmZhbWlseTsKKwljaGFyICoqcDsKKworCS8qIEZpcnN0LCByZW1hcCAnLW5ldCcgYW5kICctaG9zdCcgdG8gYXZvaWQgZ2V0b3B0IHByb2JsZW1zLiAqLworCXAgPSBhcmd2OworCXdoaWxlICgqKytwKSB7CisJCWlmIChzdHJjbXAoKnAsICItbmV0IikgPT0gMCB8fCBzdHJjbXAoKnAsICItaG9zdCIpID09IDApIHsKKwkJCXBbMF1bMF0gPSAnIyc7CisJCX0KKwl9CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiQTpuZSIsICZmYW1pbHkpOworCisJaWYgKChvcHQgJiBST1VURV9PUFRfQSkgJiYgc3RyY21wKGZhbWlseSwgImluZXQiKSAhPSAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlpZiAoc3RyY21wKGZhbWlseSwgImluZXQ2IikgPT0gMCkgeworCQkJb3B0IHw9IFJPVVRFX09QVF9JTkVUNjsJLyogU2V0IGZsYWcgZm9yIGlwdjYuICovCisJCX0gZWxzZQorI2VuZGlmCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIE5vIG1vcmUgYXJncyBtZWFucyBkaXNwbGF5IHRoZSByb3V0aW5nIHRhYmxlLiAqLworCWlmICghKmFyZ3YpIHsKKwkJaW50IG5vcmVzb2x2ZSA9IChvcHQgJiBST1VURV9PUFRfbikgPyAweDBmZmYgOiAwOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJaWYgKG9wdCAmIFJPVVRFX09QVF9JTkVUNikKKwkJCUlORVQ2X2Rpc3BsYXlyb3V0ZXMoKTsKKwkJZWxzZQorI2VuZGlmCisJCQliYl9kaXNwbGF5cm91dGVzKG5vcmVzb2x2ZSwgb3B0ICYgUk9VVEVfT1BUX2UpOworCisJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisKKwkvKiBDaGVjayB2ZXJiLiAgQXQgdGhlIG1vbWVudCwgbXVzdCBiZSBhZGQsIGRlbCwgb3IgZGVsZXRlLiAqLworCXdoYXQgPSBrd19sb29rdXAodGJsX3ZlcmIsICZhcmd2KTsKKwlpZiAoIXdoYXQgfHwgISphcmd2KSB7CQkvKiBVbmtub3duIHZlcmIgb3Igbm8gbW9yZSBhcmdzLiAqLworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWlmIChvcHQgJiBST1VURV9PUFRfSU5FVDYpCisJCUlORVQ2X3NldHJvdXRlKHdoYXQsIGFyZ3YpOworCWVsc2UKKyNlbmRpZgorCQlJTkVUX3NldHJvdXRlKHdoYXQsIGFyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvc2xhdHRhY2guYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvc2xhdHRhY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTAwZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy9zbGF0dGFjaC5jCkBAIC0wLDAgKzEsMjU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTdHJpcHBlZCBkb3duIHZlcnNpb24gb2YgbmV0LXRvb2xzIGZvciBidXN5Ym94LgorICoKKyAqIEF1dGhvcjogSWduYWNpbyBHYXJjaWEgUGVyZXogKGlnZ2FycGUgYXQgZ21haWwgZG90IGNvbSkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoZXJlIGFyZSBzb21lIGRpZmZlcmVuY2VzIGZyb20gdGhlIHN0YW5kYXJkIG5ldC10b29scyBzbGF0dGFjaDoKKyAqCisgKiAtIFRoZSAtbCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAqCisgKiAtIFRoZSAtRiBvcHRpb25zIGFsbG93cyBkaXNhYmxpbmcgb2YgUlRTL0NUUyBmbG93IGNvbnRyb2wuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNsYXR0YWNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNlaG1MRl0gWy1zIFNQRUVEXSBbLXAgUFJPVE9DT0xdIERFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBzbGF0dGFjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkF0dGFjaCBuZXR3b3JrIGludGVyZmFjZShzKSB0byBzZXJpYWwgbGluZShzKVxuIgorLy91c2FnZTogICAgICJcbgktcCBQUk9UCVNldCBwcm90b2NvbCAoc2xpcCwgY3NsaXAsIHNsaXA2LCBjbGlzcDYgb3IgYWRhcHRpdmUpIgorLy91c2FnZTogICAgICJcbgktcyBTUEQJU2V0IGxpbmUgc3BlZWQiCisvL3VzYWdlOiAgICAgIlxuCS1lCUV4aXQgYWZ0ZXIgaW5pdGlhbGl6aW5nIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJRXhpdCB3aGVuIHRoZSBjYXJyaWVyIGlzIGxvc3QiCisvL3VzYWdlOiAgICAgIlxuCS1jIFBST0cJUnVuIFBST0cgd2hlbiB0aGUgbGluZSBpcyBodW5nIHVwIgorLy91c2FnZTogICAgICJcbgktbQlEbyBOT1QgaW5pdGlhbGl6ZSB0aGUgbGluZSBpbiByYXcgOCBiaXRzIG1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS1MCUVuYWJsZSAzLXdpcmUgb3BlcmF0aW9uIgorLy91c2FnZTogICAgICJcbgktRglEaXNhYmxlIFJUUy9DVFMgZmxvdyBjb250cm9sIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJpcHJvdXRlL3V0aWxzLmgiIC8qIGludmFyZygpICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgaGFuZGxlOworCWludCBzYXZlZF9kaXNjOworCXN0cnVjdCB0ZXJtaW9zIHNhdmVkX3N0YXRlOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgaGFuZGxlICAgICAgIChHLmhhbmRsZSAgICAgICkKKyNkZWZpbmUgc2F2ZWRfZGlzYyAgIChHLnNhdmVkX2Rpc2MgICkKKyNkZWZpbmUgc2F2ZWRfc3RhdGUgIChHLnNhdmVkX3N0YXRlICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisKKy8qCisgKiBTYXZlIHR0eSBzdGF0ZSBhbmQgbGluZSBkaXNjaXBsaW5lCisgKgorICogSXQgaXMgZmluZSBoZXJlIHRvIGJhaWwgb3V0IG9uIGVycm9ycywgc2luY2Ugd2UgaGF2ZW4gbW9kaWZpZWQgYW55dGhpbmcgeWV0CisgKi8KK3N0YXRpYyB2b2lkIHNhdmVfc3RhdGUodm9pZCkKK3sKKwkvKiBTYXZlIGxpbmUgc3RhdHVzICovCisJaWYgKHRjZ2V0YXR0cihoYW5kbGUsICZzYXZlZF9zdGF0ZSkgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldCBzdGF0ZSIpOworCisJLyogU2F2ZSBsaW5lIGRpc2NpcGxpbmUgKi8KKwl4aW9jdGwoaGFuZGxlLCBUSU9DR0VURCwgJnNhdmVkX2Rpc2MpOworfQorCitzdGF0aWMgaW50IHNldF90ZXJtaW9zX3N0YXRlX29yX3dhcm4oc3RydWN0IHRlcm1pb3MgKnN0YXRlKQoreworCWludCByZXQ7CisKKwlyZXQgPSB0Y3NldGF0dHIoaGFuZGxlLCBUQ1NBTk9XLCBzdGF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJYmJfcGVycm9yX21zZygic2V0IHN0YXRlIik7CisJCXJldHVybiAxOyAvKiB1c2VkIGFzIGV4aXRjb2RlICovCisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmVzdG9yZSBzdGF0ZSBhbmQgbGluZSBkaXNjaXBsaW5lIGZvciBBTEwgbWFuYWdlZCB0dHlzCisgKgorICogUmVzdG9yaW5nIEFMTCBtYW5hZ2VkIHR0eXMgaXMgdGhlIG9ubHkgd2F5IHRvIGhhdmUgYSBzaW5nbGUKKyAqIGhhbmd1cCBkZWxheS4KKyAqCisgKiBHbyBvbiBhZnRlciBlcnJvcnM6IHdlIHdhbnQgdG8gcmVzdG9yZSBhcyBtYW55IGNvbnRyb2xsZWQgdHR5cworICogYXMgcG9zc2libGUuCisgKi8KK3N0YXRpYyB2b2lkIHJlc3RvcmVfc3RhdGVfYW5kX2V4aXQoaW50IGV4aXRjb2RlKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHJlc3RvcmVfc3RhdGVfYW5kX2V4aXQoaW50IGV4aXRjb2RlKQoreworCXN0cnVjdCB0ZXJtaW9zIHN0YXRlOworCisJLyogUmVzdG9yZSBsaW5lIGRpc2NpcGxpbmUgKi8KKwlpZiAoaW9jdGxfb3Jfd2FybihoYW5kbGUsIFRJT0NTRVRELCAmc2F2ZWRfZGlzYykgPCAwKSB7CisJCWV4aXRjb2RlID0gMTsKKwl9CisKKwkvKiBIYW5ndXAgKi8KKwltZW1jcHkoJnN0YXRlLCAmc2F2ZWRfc3RhdGUsIHNpemVvZihzdGF0ZSkpOworCWNmc2V0aXNwZWVkKCZzdGF0ZSwgQjApOworCWNmc2V0b3NwZWVkKCZzdGF0ZSwgQjApOworCWlmIChzZXRfdGVybWlvc19zdGF0ZV9vcl93YXJuKCZzdGF0ZSkpCisJCWV4aXRjb2RlID0gMTsKKwlzbGVlcCgxKTsKKworCS8qIFJlc3RvcmUgbGluZSBzdGF0dXMgKi8KKwlpZiAoc2V0X3Rlcm1pb3Nfc3RhdGVfb3Jfd2Fybigmc2F2ZWRfc3RhdGUpKQorCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShoYW5kbGUpOworCisJZXhpdChleGl0Y29kZSk7Cit9CisKKy8qCisgKiBTZXQgdHR5IHN0YXRlLCBsaW5lIGRpc2NpcGxpbmUgYW5kIGVuY2Fwc3VsYXRpb24KKyAqLworc3RhdGljIHZvaWQgc2V0X3N0YXRlKHN0cnVjdCB0ZXJtaW9zICpzdGF0ZSwgaW50IGVuY2FwKQoreworCWludCBkaXNjOworCisJLyogU2V0IGxpbmUgc3RhdHVzICovCisJaWYgKHNldF90ZXJtaW9zX3N0YXRlX29yX3dhcm4oc3RhdGUpKQorCQlnb3RvIGJhZDsKKwkvKiBTZXQgbGluZSBkaXNjbGlwbGUgKE5fU0xJUCBhbHdheXMpICovCisJZGlzYyA9IE5fU0xJUDsKKwlpZiAoaW9jdGxfb3Jfd2FybihoYW5kbGUsIFRJT0NTRVRELCAmZGlzYykgPCAwKSB7CisJCWdvdG8gYmFkOworCX0KKworCS8qIFNldCBlbmNhcHN1bGF0aW9uIChTTElQLCBDU0xJUCwgZXRjKSAqLworCWlmIChpb2N0bF9vcl93YXJuKGhhbmRsZSwgU0lPQ1NJRkVOQ0FQLCAmZW5jYXApIDwgMCkgeworIGJhZDoKKwkJcmVzdG9yZV9zdGF0ZV9hbmRfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KK30KKworc3RhdGljIHZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZ25vIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXN0b3JlX3N0YXRlX2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKK2ludCBzbGF0dGFjaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2xhdHRhY2hfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIExpbmUgZGlzY2lwbGluZSBjb2RlIHRhYmxlICovCisJc3RhdGljIGNvbnN0IGNoYXIgcHJvdG9fbmFtZXNbXSBBTElHTjEgPQorCQkic2xpcFwwIiAgICAgICAgLyogMCAqLworCQkiY3NsaXBcMCIgICAgICAgLyogMSAqLworCQkic2xpcDZcMCIgICAgICAgLyogMiAqLworCQkiY3NsaXA2XDAiICAgICAgLyogMyAqLworCQkiYWRhcHRpdmVcMCIgICAgLyogOCAqLworCQk7CisKKwlpbnQgaSwgZW5jYXAsIG9wdDsKKwlzdHJ1Y3QgdGVybWlvcyBzdGF0ZTsKKwljb25zdCBjaGFyICpwcm90byA9ICJjc2xpcCI7CisJY29uc3QgY2hhciAqZXh0Y21kOyAgIC8qIENvbW1hbmQgdG8gZXhlY3V0ZSBhZnRlciBoYW5ndXAgKi8KKwljb25zdCBjaGFyICpiYXVkX3N0cjsKKwlpbnQgYmF1ZF9jb2RlID0gLTE7ICAgLyogTGluZSBiYXVkIHJhdGUgKHN5c3RlbSBjb2RlKSAqLworCisJZW51bSB7CisJCU9QVF9wX3Byb3RvICA9IDEgPDwgMCwKKwkJT1BUX3NfYmF1ZCAgID0gMSA8PCAxLAorCQlPUFRfY19leHRjbWQgPSAxIDw8IDIsCisJCU9QVF9lX3F1aXQgICA9IDEgPDwgMywKKwkJT1BUX2hfd2F0Y2ggID0gMSA8PCA0LAorCQlPUFRfbV9ub25yYXcgPSAxIDw8IDUsCisJCU9QVF9MX2xvY2FsICA9IDEgPDwgNiwKKwkJT1BUX0Zfbm9mbG93ID0gMSA8PCA3CisJfTsKKworCUlOSVRfRygpOworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAicDpzOmM6ZWhtTEYiLCAmcHJvdG8sICZiYXVkX3N0ciwgJmV4dGNtZCk7CisJLyphcmdjIC09IG9wdGluZDsqLworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCisJZW5jYXAgPSBpbmRleF9pbl9zdHJpbmdzKHByb3RvX25hbWVzLCBwcm90byk7CisKKwlpZiAoZW5jYXAgPCAwKQorCQlpbnZhcmcocHJvdG8sICJwcm90b2NvbCIpOworCWlmIChlbmNhcCA+IDMpCisJCWVuY2FwID0gODsKKworCS8qIFdlIHdhbnQgdG8ga25vdyBpZiB0aGUgYmF1ZCByYXRlIGlzIHZhbGlkIGJlZm9yZSB3ZSBzdGFydCB0b3VjaGluZyB0aGUgdHR5cyAqLworCWlmIChvcHQgJiBPUFRfc19iYXVkKSB7CisJCWJhdWRfY29kZSA9IHR0eV92YWx1ZV90b19iYXVkKHhhdG9pKGJhdWRfc3RyKSk7CisJCWlmIChiYXVkX2NvZGUgPCAwKQorCQkJaW52YXJnKGJhdWRfc3RyLCAiYmF1ZCByYXRlIik7CisJfQorCisJLyogVHJhcCBzaWduYWxzIGluIG9yZGVyIHRvIHJlc3RvcmUgdHR5IHN0YXRlcyB1cG9uIGV4aXQgKi8KKwlpZiAoIShvcHQgJiBPUFRfZV9xdWl0KSkgeworCQliYl9zaWduYWxzKDAKKwkJCSsgKDEgPDwgU0lHSFVQKQorCQkJKyAoMSA8PCBTSUdJTlQpCisJCQkrICgxIDw8IFNJR1FVSVQpCisJCQkrICgxIDw8IFNJR1RFUk0pCisJCQksIHNpZ19oYW5kbGVyKTsKKwl9CisKKwkvKiBPcGVuIHR0eSAqLworCWhhbmRsZSA9IG9wZW4oKmFyZ3YsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKwlpZiAoaGFuZGxlIDwgMCkgeworCQljaGFyICpidWYgPSBjb25jYXRfcGF0aF9maWxlKCIvZGV2IiwgKmFyZ3YpOworCQloYW5kbGUgPSB4b3BlbihidWYsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKwkJLyogbWF5YmUgaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSA/PyAqLworCQlmcmVlKGJ1Zik7CisJfQorCisJLyogU2F2ZSBjdXJyZW50IHR0eSBzdGF0ZSAqLworCXNhdmVfc3RhdGUoKTsKKworCS8qIENvbmZpZ3VyZSB0dHkgKi8KKwltZW1jcHkoJnN0YXRlLCAmc2F2ZWRfc3RhdGUsIHNpemVvZihzdGF0ZSkpOworCWlmICghKG9wdCAmIE9QVF9tX25vbnJhdykpIHsgLyogcmF3IG5vdCBzdXBwcmVzc2VkICovCisJCW1lbXNldCgmc3RhdGUuY19jYywgMCwgc2l6ZW9mKHN0YXRlLmNfY2MpKTsKKwkJc3RhdGUuY19jY1tWTUlOXSA9IDE7CisJCXN0YXRlLmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVI7CisJCXN0YXRlLmNfb2ZsYWcgPSAwOworCQlzdGF0ZS5jX2xmbGFnID0gMDsKKwkJc3RhdGUuY19jZmxhZyA9IENTOCB8IEhVUENMIHwgQ1JFQUQKKwkJICAgICAgICAgICAgICB8ICgob3B0ICYgT1BUX0xfbG9jYWwpID8gQ0xPQ0FMIDogMCkKKwkJICAgICAgICAgICAgICB8ICgob3B0ICYgT1BUX0Zfbm9mbG93KSA/IDAgOiBDUlRTQ1RTKTsKKwkJY2ZzZXRpc3BlZWQoJnN0YXRlLCBjZmdldGlzcGVlZCgmc2F2ZWRfc3RhdGUpKTsKKwkJY2ZzZXRvc3BlZWQoJnN0YXRlLCBjZmdldG9zcGVlZCgmc2F2ZWRfc3RhdGUpKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX3NfYmF1ZCkgeworCQljZnNldGlzcGVlZCgmc3RhdGUsIGJhdWRfY29kZSk7CisJCWNmc2V0b3NwZWVkKCZzdGF0ZSwgYmF1ZF9jb2RlKTsKKwl9CisKKwlzZXRfc3RhdGUoJnN0YXRlLCBlbmNhcCk7CisKKwkvKiBFeGl0IG5vdyBpZiBvcHRpb24gLWUgd2FzIHBhc3NlZCAqLworCWlmIChvcHQgJiBPUFRfZV9xdWl0KQorCQlyZXR1cm4gMDsKKworCS8qIElmIHdlJ3JlIG5vdCByZXF1ZXN0ZWQgdG8gd2F0Y2gsIGp1c3Qga2VlcCBkZXNjcmlwdG9yIG9wZW4KKwkgKiB1bnRpbCB3ZSBhcmUga2lsbGVkICovCisJaWYgKCEob3B0ICYgT1BUX2hfd2F0Y2gpKQorCQl3aGlsZSAoMSkKKwkJCXNsZWVwKDI0KjYwKjYwKTsKKworCS8qIFdhdGNoIGxpbmUgZm9yIGhhbmd1cCAqLworCXdoaWxlICgxKSB7CisJCWlmIChpb2N0bChoYW5kbGUsIFRJT0NNR0VULCAmaSkgPCAwIHx8ICEoaSAmIFRJT0NNX0NBUikpCisJCQlnb3RvIG5vX2NhcnJpZXI7CisJCXNsZWVwKDE1KTsKKwl9CisKKyBub19jYXJyaWVyOgorCisJLyogRXhlY3V0ZSBjb21tYW5kIG9uIGhhbmd1cCAqLworCWlmIChvcHQgJiBPUFRfY19leHRjbWQpCisJCXN5c3RlbShleHRjbWQpOworCisJLyogUmVzdG9yZSBzdGF0ZXMgYW5kIGV4aXQgKi8KKwlyZXN0b3JlX3N0YXRlX2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3RjLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3RjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3NDM1MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGMuYwpAQCAtMCwwICsxLDU2NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIGFkanVzdGVkIGZvciBidXN5Ym94CisgKi8KKworLy91c2FnZTojZGVmaW5lIHRjX3RyaXZpYWxfdXNhZ2UKKy8qIC8vdXNhZ2U6ICJbT1BUSU9OU10gT0JKRUNUIENNRCBbZGV2IFNUUklOR10iICovCisvL3VzYWdlOgkiT0JKRUNUIENNRCBbZGV2IFNUUklOR10iCisvL3VzYWdlOiNkZWZpbmUgdGNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CSJPQkpFQ1Q6IHtxZGlzY3xjbGFzc3xmaWx0ZXJ9XG4iCisvL3VzYWdlOgkiQ01EOiB7YWRkfGRlbHxjaGFuZ2V8cmVwbGFjZXxzaG93fVxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJInFkaXNjIFsgaGFuZGxlIFFIQU5ETEUgXSBbIHJvb3QgfCJJRl9GRUFUVVJFX1RDX0lOR1JFU1MoIiBpbmdyZXNzIHwiKSIgcGFyZW50IENMQVNTSUQgXVxuIgorLyogLy91c2FnZTogIlsgZXN0aW1hdG9yIElOVEVSVkFMIFRJTUVfQ09OU1RBTlQgXVxuIiAqLworLy91c2FnZToJIglbIFsgUURJU0NfS0lORCBdIFsgaGVscCB8IE9QVElPTlMgXSBdXG4iCisvL3VzYWdlOgkiCVFESVNDX0tJTkQgOj0geyBbcHxiXWZpZm8gfCB0YmYgfCBwcmlvIHwgY2JxIHwgcmVkIHwgZXRjLiB9XG4iCisvL3VzYWdlOgkicWRpc2Mgc2hvdyBbIGRldiBTVFJJTkcgXSJJRl9GRUFUVVJFX1RDX0lOR1JFU1MoIiBbaW5ncmVzc10iKSJcbiIKKy8vdXNhZ2U6CSJjbGFzcyBbIGNsYXNzaWQgQ0xBU1NJRCBdIFsgcm9vdCB8IHBhcmVudCBDTEFTU0lEIF1cbiIKKy8vdXNhZ2U6CSIJWyBbIFFESVNDX0tJTkQgXSBbIGhlbHAgfCBPUFRJT05TIF0gXVxuIgorLy91c2FnZToJImNsYXNzIHNob3cgWyBkZXYgU1RSSU5HIF0gWyByb290IHwgcGFyZW50IENMQVNTSUQgXVxuIgorLy91c2FnZToJImZpbHRlciBbIHByZWYgUFJJTyBdIFsgcHJvdG9jb2wgUFJPVE8gXVxuIgorLyogLy91c2FnZTogIlx0WyBlc3RpbWF0b3IgSU5URVJWQUwgVElNRV9DT05TVEFOVCBdXG4iICovCisvL3VzYWdlOgkiCVsgcm9vdCB8IGNsYXNzaWQgQ0xBU1NJRCBdIFsgaGFuZGxlIEZJTFRFUklEIF1cbiIKKy8vdXNhZ2U6CSIJWyBbIEZJTFRFUl9UWVBFIF0gWyBoZWxwIHwgT1BUSU9OUyBdIF1cbiIKKy8vdXNhZ2U6CSJmaWx0ZXIgc2hvdyBbIGRldiBTVFJJTkcgXSBbIHJvb3QgfCBwYXJlbnQgQ0xBU1NJRCBdIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2luY2x1ZGUgImxpYmlwcm91dGUvdXRpbHMuaCIKKyNpbmNsdWRlICJsaWJpcHJvdXRlL2lwX2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmlwcm91dGUvcnRfbmFtZXMuaCIKKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4gLyogZm9yIHRoZSBUQ19IXyogbWFjcm9zICovCisKKyNkZWZpbmUgcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgbWF4LCBydGEpIFwKKwkocGFyc2VfcnRhdHRyKCh0YiksIChtYXgpLCBSVEFfREFUQShydGEpLCBSVEFfUEFZTE9BRChydGEpKSkKKworLyogbnVsbGlmaWVzIHRiIG9uIGVycm9yICovCisjZGVmaW5lIF9fcGFyc2VfcnRhdHRyX25lc3RlZF9jb21wYXQodGIsIG1heCwgcnRhLCBsZW4pIFwKKwkoe2lmICgoUlRBX1BBWUxPQUQocnRhKSA+PSBsZW4pICYmIFwKKwkJIChSVEFfUEFZTE9BRChydGEpID49IFJUQV9BTElHTihsZW4pICsgc2l6ZW9mKHN0cnVjdCBydGF0dHIpKSkgeyBcCisJCQlydGEgPSBSVEFfREFUQShydGEpICsgUlRBX0FMSUdOKGxlbik7IFwKKwkJCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIG1heCwgcnRhKTsgXAorCSAgfSBlbHNlIFwKKwkJCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHN0cnVjdCBydGF0dHIgKikgKiAobWF4ICsgMSkpOyBcCisJfSkKKworI2RlZmluZSBwYXJzZV9ydGF0dHJfbmVzdGVkX2NvbXBhdCh0YiwgbWF4LCBydGEsIGRhdGEsIGxlbikgXAorCSh7ZGF0YSA9IFJUQV9QQVlMT0FEKHJ0YSkgPj0gbGVuID8gUlRBX0RBVEEocnRhKSA6IE5VTEw7IFwKKwlfX3BhcnNlX3J0YXR0cl9uZXN0ZWRfY29tcGF0KHRiLCBtYXgsIHJ0YSwgbGVuKTsgfSkKKworI2RlZmluZSBzaG93X2RldGFpbHMgKDApIC8qIG5vdCBpbXBsZW1lbnRlZC4gRG9lcyBhbnlvbmUgbmVlZCBpdD8gKi8KKyNkZWZpbmUgdXNlX2llYyAoMCkgLyogbm90IGN1cnJlbnRseSBkb2N1bWVudGVkIGluIHRoZSB1cHN0cmVhbSBtYW5wYWdlICovCisKKworc3RydWN0IGdsb2JhbHMgeworCWludCBmaWx0ZXJfaWZpbmRleDsKKwl1aW50MzJfdCBmaWx0ZXJfcWRpc2M7CisJdWludDMyX3QgZmlsdGVyX3BhcmVudDsKKwl1aW50MzJfdCBmaWx0ZXJfcHJpbzsKKwl1aW50MzJfdCBmaWx0ZXJfcHJvdG87Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorc3RydWN0IEJVR19HX3Rvb19iaWcgeworICAgICAgICBjaGFyIEJVR19HX3Rvb19iaWdbc2l6ZW9mKEcpIDw9IENPTU1PTl9CVUZTSVpFID8gMSA6IC0xXTsKK307CisjZGVmaW5lIGZpbHRlcl9pZmluZGV4IChHLmZpbHRlcl9pZmluZGV4KQorI2RlZmluZSBmaWx0ZXJfcWRpc2MgKEcuZmlsdGVyX3FkaXNjKQorI2RlZmluZSBmaWx0ZXJfcGFyZW50IChHLmZpbHRlcl9wYXJlbnQpCisjZGVmaW5lIGZpbHRlcl9wcmlvIChHLmZpbHRlcl9wcmlvKQorI2RlZmluZSBmaWx0ZXJfcHJvdG8gKEcuZmlsdGVyX3Byb3RvKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKy8qIEFsbG9jYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgY2xhc3MgaWQuCisgKiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgbWVtb3J5LiAgKi8KK3N0YXRpYyBjaGFyKiBwcmludF90Y19jbGFzc2lkKHVpbnQzMl90IGNpZCkKK3sKKyNpZiAwIC8qIElNUE9TU0lCTEUgKi8KKwlpZiAoY2lkID09IFRDX0hfUk9PVCkKKwkJcmV0dXJuIHhhc3ByaW50Zigicm9vdCIpOworCWVsc2UKKyNlbmRpZgorCWlmIChjaWQgPT0gVENfSF9VTlNQRUMpCisJCXJldHVybiB4YXNwcmludGYoIm5vbmUiKTsKKwllbHNlIGlmIChUQ19IX01BSihjaWQpID09IDApCisJCXJldHVybiB4YXNwcmludGYoIjoleCIsIFRDX0hfTUlOKGNpZCkpOworCWVsc2UgaWYgKFRDX0hfTUlOKGNpZCkgPT0gMCkKKwkJcmV0dXJuIHhhc3ByaW50ZigiJXg6IiwgVENfSF9NQUooY2lkKT4+MTYpOworCWVsc2UKKwkJcmV0dXJuIHhhc3ByaW50ZigiJXg6JXgiLCBUQ19IX01BSihjaWQpPj4xNiwgVENfSF9NSU4oY2lkKSk7Cit9CisKKy8qIEdldCBhIHFkaXNjIGhhbmRsZS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsICEwIG90aGVyd2lzZS4gICovCitzdGF0aWMgaW50IGdldF9xZGlzY19oYW5kbGUodWludDMyX3QgKmgsIGNvbnN0IGNoYXIgKnN0cikgeworCXVpbnQzMl90IG1hajsKKwljaGFyICpwOworCisJbWFqID0gVENfSF9VTlNQRUM7CisJaWYgKCFzdHJjbXAoc3RyLCAibm9uZSIpKQorCQlnb3RvIG9rOworCW1haiA9IHN0cnRvdWwoc3RyLCAmcCwgMTYpOworCWlmIChwID09IHN0cikKKwkJcmV0dXJuIDE7CisJbWFqIDw8PSAxNjsKKwlpZiAoKnAgIT0gJzonICYmICpwICE9ICdcMCcpCisJCXJldHVybiAxOworIG9rOgorCSpoID0gbWFqOworCXJldHVybiAwOworfQorCisvKiBHZXQgY2xhc3MgSUQuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAhMCBvdGhlcndpc2UuICAqLworc3RhdGljIGludCBnZXRfdGNfY2xhc3NpZCh1aW50MzJfdCAqaCwgY29uc3QgY2hhciAqc3RyKSB7CisJdWludDMyX3QgbWFqLCBtaW47CisJY2hhciAqcDsKKworCW1haiA9IFRDX0hfUk9PVDsKKwlpZiAoIXN0cmNtcChzdHIsICJyb290IikpCisJCWdvdG8gb2s7CisJbWFqID0gVENfSF9VTlNQRUM7CisJaWYgKCFzdHJjbXAoc3RyLCAibm9uZSIpKQorCQlnb3RvIG9rOworCW1haiA9IHN0cnRvdWwoc3RyLCAmcCwgMTYpOworCWlmIChwID09IHN0cikgeworCQlpZiAoKnAgIT0gJzonKQorCQkJcmV0dXJuIDE7CisJCW1haiA9IDA7CisJfQorCWlmICgqcCA9PSAnOicpIHsKKwkJaWYgKG1haiA+PSAoMTw8MTYpKQorCQkJcmV0dXJuIDE7CisJCW1haiA8PD0gMTY7CisJCXN0ciA9IHAgKyAxOworCQltaW4gPSBzdHJ0b3VsKHN0ciwgJnAsIDE2KTsKKy8vRklYTUU6IGNoZWNrIGZvciAiIiB0b28/CisJCWlmICgqcCAhPSAnXDAnIHx8IG1pbiA+PSAoMTw8MTYpKQorCQkJcmV0dXJuIDE7CisJCW1haiB8PSBtaW47CisJfSBlbHNlIGlmICgqcCAhPSAwKQorCQlyZXR1cm4gMTsKKyBvazoKKwkqaCA9IG1hajsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcmF0ZShjaGFyICpidWYsIGludCBsZW4sIHVpbnQzMl90IHJhdGUpCit7CisJZG91YmxlIHRtcCA9IChkb3VibGUpcmF0ZSo4OworCisJaWYgKHVzZV9pZWMpIHsKKwkJaWYgKHRtcCA+PSAxMDAwLjAqMTAyNC4wKjEwMjQuMCkKKwkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJS4wZk1pYml0IiwgdG1wLzEwMjQuMCoxMDI0LjApOworCQllbHNlIGlmICh0bXAgPj0gMTAwMC4wKjEwMjQpCisJCQlzbnByaW50ZihidWYsIGxlbiwgIiUuMGZLaWJpdCIsIHRtcC8xMDI0KTsKKwkJZWxzZQorCQkJc25wcmludGYoYnVmLCBsZW4sICIlLjBmYml0IiwgdG1wKTsKKwl9IGVsc2UgeworCQlpZiAodG1wID49IDEwMDAuMCoxMDAwMDAwLjApCisJCQlzbnByaW50ZihidWYsIGxlbiwgIiUuMGZNYml0IiwgdG1wLzEwMDAwMDAuMCk7CisJCWVsc2UgaWYgKHRtcCA+PSAxMDAwLjAgKiAxMDAwLjApCisJCQlzbnByaW50ZihidWYsIGxlbiwgIiUuMGZLYml0IiwgdG1wLzEwMDAuMCk7CisJCWVsc2UKKwkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJS4wZmJpdCIsICB0bXApOworCX0KK30KKworLyogVGhpcyBpcyAicGZpZm9fZmFzdCIuICAqLworc3RhdGljIGludCBwcmlvX3BhcnNlX29wdChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgcHJpb19wcmludF9vcHQoc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCWludCBpOworCXN0cnVjdCB0Y19wcmlvX3FvcHQgKnFvcHQ7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1BSSU9fTUFYKzFdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlwYXJzZV9ydGF0dHJfbmVzdGVkX2NvbXBhdCh0YiwgVENBX1BSSU9fTUFYLCBvcHQsIHFvcHQsIHNpemVvZigqcW9wdCkpOworCWlmICh0YiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlwcmludGYoImJhbmRzICV1IHByaW9tYXAgIiwgcW9wdC0+YmFuZHMpOworCWZvciAoaT0wOyBpPD1UQ19QUklPX01BWDsgaSsrKQorCQlwcmludGYoIiAlZCIsIHFvcHQtPnByaW9tYXBbaV0pOworCisJaWYgKHRiW1RDQV9QUklPX01RXSkKKwkJcHJpbnRmKCIgbXVsdGlxdWV1ZTogbyVzICIsCisJCSAgICAqKHVuc2lnbmVkIGNoYXIgKilSVEFfREFUQSh0YltUQ0FfUFJJT19NUV0pID8gIm4iIDogImZmIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2xhc3MgQmFzZWQgUXVldWUgKi8KK3N0YXRpYyBpbnQgY2JxX3BhcnNlX29wdChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgY2JxX3ByaW50X29wdChzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0NCUV9NQVgrMV07CisJc3RydWN0IHRjX3JhdGVzcGVjICpyID0gTlVMTDsKKwlzdHJ1Y3QgdGNfY2JxX2xzc29wdCAqbHNzID0gTlVMTDsKKwlzdHJ1Y3QgdGNfY2JxX3dycm9wdCAqd3JyID0gTlVMTDsKKwlzdHJ1Y3QgdGNfY2JxX2ZvcHQgKmZvcHQgPSBOVUxMOworCXN0cnVjdCB0Y19jYnFfb3ZsICpvdmwgPSBOVUxMOworCWNvbnN0IGNoYXIgKmNvbnN0IGVycm9yID0gIkNCUTogdG9vIHNob3J0ICVzIG9wdCI7CisJY2hhciBidWZbNjRdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0NCUV9NQVgsIG9wdCk7CisKKwlpZiAodGJbVENBX0NCUV9SQVRFXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0NCUV9SQVRFXSkgPCBzaXplb2YoKnIpKQorCQkJYmJfZXJyb3JfbXNnKGVycm9yLCAicmF0ZSIpOworCQllbHNlCisJCQlyID0gUlRBX0RBVEEodGJbVENBX0NCUV9SQVRFXSk7CisJfQorCWlmICh0YltUQ0FfQ0JRX0xTU09QVF0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfTFNTT1BUXSkgPCBzaXplb2YoKmxzcykpCisJCQliYl9lcnJvcl9tc2coZXJyb3IsICJsc3MiKTsKKwkJZWxzZQorCQkJbHNzID0gUlRBX0RBVEEodGJbVENBX0NCUV9MU1NPUFRdKTsKKwl9CisJaWYgKHRiW1RDQV9DQlFfV1JST1BUXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0NCUV9XUlJPUFRdKSA8IHNpemVvZigqd3JyKSkKKwkJCWJiX2Vycm9yX21zZyhlcnJvciwgIndyciIpOworCQllbHNlCisJCQl3cnIgPSBSVEFfREFUQSh0YltUQ0FfQ0JRX1dSUk9QVF0pOworCX0KKwlpZiAodGJbVENBX0NCUV9GT1BUXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0NCUV9GT1BUXSkgPCBzaXplb2YoKmZvcHQpKQorCQkJYmJfZXJyb3JfbXNnKGVycm9yLCAiZm9wdCIpOworCQllbHNlCisJCQlmb3B0ID0gUlRBX0RBVEEodGJbVENBX0NCUV9GT1BUXSk7CisJfQorCWlmICh0YltUQ0FfQ0JRX09WTF9TVFJBVEVHWV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfT1ZMX1NUUkFURUdZXSkgPCBzaXplb2YoKm92bCkpCisJCQliYl9lcnJvcl9tc2coIkNCUTogdG9vIHNob3J0IG92ZXJsaW1pdCBzdHJhdGVneSAldS8ldSIsCisJCQkJKHVuc2lnbmVkKSBSVEFfUEFZTE9BRCh0YltUQ0FfQ0JRX09WTF9TVFJBVEVHWV0pLAorCQkJCSh1bnNpZ25lZCkgc2l6ZW9mKCpvdmwpKTsKKwkJZWxzZQorCQkJb3ZsID0gUlRBX0RBVEEodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ldKTsKKwl9CisKKwlpZiAocikgeworCQlwcmludF9yYXRlKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHItPnJhdGUpOworCQlwcmludGYoInJhdGUgJXMgIiwgYnVmKTsKKwkJaWYgKHNob3dfZGV0YWlscykgeworCQkJcHJpbnRmKCJjZWxsICV1YiAiLCAxPDxyLT5jZWxsX2xvZyk7CisJCQlpZiAoci0+bXB1KQorCQkJCXByaW50ZigibXB1ICV1YiAiLCByLT5tcHUpOworCQkJaWYgKHItPm92ZXJoZWFkKQorCQkJCXByaW50Zigib3ZlcmhlYWQgJXViICIsIHItPm92ZXJoZWFkKTsKKwkJfQorCX0KKwlpZiAobHNzICYmIGxzcy0+ZmxhZ3MpIHsKKwkJYm9vbCBjb21tYSA9IGZhbHNlOworCQliYl9wdXRjaGFyKCcoJyk7CisJCWlmIChsc3MtPmZsYWdzJlRDRl9DQlFfTFNTX0JPVU5ERUQpIHsKKwkJCXByaW50ZigiYm91bmRlZCIpOworCQkJY29tbWEgPSB0cnVlOworCQl9CisJCWlmIChsc3MtPmZsYWdzJlRDRl9DQlFfTFNTX0lTT0xBVEVEKSB7CisJCQlpZiAoY29tbWEpCisJCQkJYmJfcHV0Y2hhcignLCcpOworCQkJcHJpbnRmKCJpc29sYXRlZCIpOworCQl9CisJCXByaW50ZigiKSAiKTsKKwl9CisJaWYgKHdycikgeworCQlpZiAod3JyLT5wcmlvcml0eSAhPSBUQ19DQlFfTUFYUFJJTykKKwkJCXByaW50ZigicHJpbyAldSIsIHdyci0+cHJpb3JpdHkpOworCQllbHNlCisJCQlwcmludGYoInByaW8gbm8tdHJhbnNtaXQiKTsKKwkJaWYgKHNob3dfZGV0YWlscykgeworCQkJcHJpbnRmKCIvJXUgIiwgd3JyLT5jcHJpb3JpdHkpOworCQkJaWYgKHdyci0+d2VpZ2h0ICE9IDEpIHsKKwkJCQlwcmludF9yYXRlKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHdyci0+d2VpZ2h0KTsKKwkJCQlwcmludGYoIndlaWdodCAlcyAiLCBidWYpOworCQkJfQorCQkJaWYgKHdyci0+YWxsb3QpCisJCQkJcHJpbnRmKCJhbGxvdCAldWIgIiwgd3JyLT5hbGxvdCk7CisJCX0KKwl9CisgZG9uZToKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9xZGlzYyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCQkJCQlzdHJ1Y3Qgbmxtc2doZHIgKmhkciwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgdGNtc2cgKm1zZyA9IE5MTVNHX0RBVEEoaGRyKTsKKwlpbnQgbGVuID0gaGRyLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1RDQV9NQVgrMV07CisJY2hhciAqbmFtZTsKKworCWlmIChoZHItPm5sbXNnX3R5cGUgIT0gUlRNX05FV1FESVNDICYmIGhkci0+bmxtc2dfdHlwZSAhPSBSVE1fREVMUURJU0MpIHsKKwkJLyogYmJfZXJyb3JfbXNnKCJub3QgYSBxZGlzYyIpOyAqLworCQlyZXR1cm4gMDsgLyogPz8/IG1pbWljIHVwc3RyZWFtOyBzaG91bGQgcGVyaGFwcyByZXR1cm4gLTEgKi8KKwl9CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKm1zZykpOworCWlmIChsZW4gPCAwKSB7CisJCS8qIGJiX2Vycm9yX21zZygid3JvbmcgbGVuICVkIiwgbGVuKTsgKi8KKwkJcmV0dXJuIC0xOworCX0KKwkvKiBub3QgdGhlIGRlc2lyZWQgaW50ZXJmYWNlPyAqLworCWlmIChmaWx0ZXJfaWZpbmRleCAmJiBmaWx0ZXJfaWZpbmRleCAhPSBtc2ctPnRjbV9pZmluZGV4KQorCQlyZXR1cm4gMDsKKwltZW1zZXQgKHRiLCAwLCBzaXplb2YodGIpKTsKKwlwYXJzZV9ydGF0dHIodGIsIFRDQV9NQVgsIFRDQV9SVEEobXNnKSwgbGVuKTsKKwlpZiAodGJbVENBX0tJTkRdID09IE5VTEwpIHsKKwkJLyogYmJfZXJyb3JfbXNnKCIlczogTlVMTCBraW5kIiwgInFkaXNjIik7ICovCisJCXJldHVybiAtMTsKKwl9CisJaWYgKGhkci0+bmxtc2dfdHlwZSA9PSBSVE1fREVMUURJU0MpCisJCXByaW50ZigiZGVsZXRlZCAiKTsKKwluYW1lID0gKGNoYXIqKVJUQV9EQVRBKHRiW1RDQV9LSU5EXSk7CisJcHJpbnRmKCJxZGlzYyAlcyAleDogIiwgbmFtZSwgbXNnLT50Y21faGFuZGxlPj4xNik7CisJaWYgKGZpbHRlcl9pZmluZGV4ID09IDApCisJCXByaW50ZigiZGV2ICVzICIsIGxsX2luZGV4X3RvX25hbWUobXNnLT50Y21faWZpbmRleCkpOworCWlmIChtc2ctPnRjbV9wYXJlbnQgPT0gVENfSF9ST09UKQorCQlwcmludGYoInJvb3QgIik7CisJZWxzZSBpZiAobXNnLT50Y21fcGFyZW50KSB7CisJCWNoYXIgKmNsYXNzaWQgPSBwcmludF90Y19jbGFzc2lkKG1zZy0+dGNtX3BhcmVudCk7CisJCXByaW50ZigicGFyZW50ICVzICIsIGNsYXNzaWQpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGNsYXNzaWQpOworCX0KKwlpZiAobXNnLT50Y21faW5mbyAhPSAxKQorCQlwcmludGYoInJlZmNudCAlZCAiLCBtc2ctPnRjbV9pbmZvKTsKKwlpZiAodGJbVENBX09QVElPTlNdKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIF9xX1tdIEFMSUdOMSA9ICJwZmlmb19mYXN0XDAiImNicVwwIjsKKwkJaW50IHFxcSA9IGluZGV4X2luX3N0cmluZ3MoX3FfLCBuYW1lKTsKKwkJaWYgKHFxcSA9PSAwKSB7IC8qIHBmaWZvX2Zhc3QgYWthIHByaW8gKi8KKwkJCXByaW9fcHJpbnRfb3B0KHRiW1RDQV9PUFRJT05TXSk7CisJCX0gZWxzZSBpZiAocXFxID09IDEpIHsgLyogY2xhc3MgYmFzZWQgcXVldWluZyAqLworCQkJY2JxX3ByaW50X29wdCh0YltUQ0FfT1BUSU9OU10pOworCQl9IGVsc2UKKwkJCWJiX2Vycm9yX21zZygidW5rbm93biAlcyIsIG5hbWUpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X2NsYXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvIFVOVVNFRF9QQVJBTSwKKwkJCQkJCXN0cnVjdCBubG1zZ2hkciAqaGRyLCB2b2lkICphcmcgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB0Y21zZyAqbXNnID0gTkxNU0dfREFUQShoZHIpOworCWludCBsZW4gPSBoZHItPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbVENBX01BWCsxXTsKKwljaGFyICpuYW1lLCAqY2xhc3NpZDsKKworCS8qWFhYIEV2ZW50dWFsbHkgZmFjdG9yIG91dCBjb21tb24gY29kZSAqLworCisJaWYgKGhkci0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXVENMQVNTICYmIGhkci0+bmxtc2dfdHlwZSAhPSBSVE1fREVMVENMQVNTKSB7CisJCS8qIGJiX2Vycm9yX21zZygibm90IGEgY2xhc3MiKTsgKi8KKwkJcmV0dXJuIDA7IC8qID8/PyBtaW1pYyB1cHN0cmVhbTsgc2hvdWxkIHBlcmhhcHMgcmV0dXJuIC0xICovCisJfQorCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCptc2cpKTsKKwlpZiAobGVuIDwgMCkgeworCQkvKiBiYl9lcnJvcl9tc2coIndyb25nIGxlbiAlZCIsIGxlbik7ICovCisJCXJldHVybiAtMTsKKwl9CisJLyogbm90IHRoZSBkZXNpcmVkIGludGVyZmFjZT8gKi8KKwlpZiAoZmlsdGVyX3FkaXNjICYmIFRDX0hfTUFKKG1zZy0+dGNtX2hhbmRsZV5maWx0ZXJfcWRpc2MpKQorCQlyZXR1cm4gMDsKKwltZW1zZXQgKHRiLCAwLCBzaXplb2YodGIpKTsKKwlwYXJzZV9ydGF0dHIodGIsIFRDQV9NQVgsIFRDQV9SVEEobXNnKSwgbGVuKTsKKwlpZiAodGJbVENBX0tJTkRdID09IE5VTEwpIHsKKwkJLyogYmJfZXJyb3JfbXNnKCIlczogTlVMTCBraW5kIiwgImNsYXNzIik7ICovCisJCXJldHVybiAtMTsKKwl9CisJaWYgKGhkci0+bmxtc2dfdHlwZSA9PSBSVE1fREVMVENMQVNTKQorCQlwcmludGYoImRlbGV0ZWQgIik7CisKKwluYW1lID0gKGNoYXIqKVJUQV9EQVRBKHRiW1RDQV9LSU5EXSk7CisJY2xhc3NpZCA9ICFtc2ctPnRjbV9oYW5kbGUgPyBOVUxMIDogcHJpbnRfdGNfY2xhc3NpZCgKKwkJCQlmaWx0ZXJfcWRpc2MgPyBUQ19IX01JTihtc2ctPnRjbV9wYXJlbnQpIDogbXNnLT50Y21fcGFyZW50KTsKKwlwcmludGYgKCJjbGFzcyAlcyAlcyIsIG5hbWUsIGNsYXNzaWQpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShjbGFzc2lkKTsKKworCWlmIChmaWx0ZXJfaWZpbmRleCA9PSAwKQorCQlwcmludGYoImRldiAlcyAiLCBsbF9pbmRleF90b19uYW1lKG1zZy0+dGNtX2lmaW5kZXgpKTsKKwlpZiAobXNnLT50Y21fcGFyZW50ID09IFRDX0hfUk9PVCkKKwkJcHJpbnRmKCJyb290ICIpOworCWVsc2UgaWYgKG1zZy0+dGNtX3BhcmVudCkgeworCQljbGFzc2lkID0gcHJpbnRfdGNfY2xhc3NpZChmaWx0ZXJfcWRpc2MgPworCQkJCQkJCQkgICBUQ19IX01JTihtc2ctPnRjbV9wYXJlbnQpIDogbXNnLT50Y21fcGFyZW50KTsKKwkJcHJpbnRmKCJwYXJlbnQgJXMgIiwgY2xhc3NpZCk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoY2xhc3NpZCk7CisJfQorCWlmIChtc2ctPnRjbV9pbmZvKQorCQlwcmludGYoImxlYWYgJXggIiwgbXNnLT50Y21faW5mbyA+PiAxNik7CisJLyogRG8gdGhhdCBnZXRfcWRpc2Nfa2luZChSVEFfREFUQSh0YltUQ0FfS0lORF0pKS4gICovCisJaWYgKHRiW1RDQV9PUFRJT05TXSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBfcV9bXSBBTElHTjEgPSAicGZpZm9fZmFzdFwwIiJjYnFcMCI7CisJCWludCBxcXEgPSBpbmRleF9pbl9zdHJpbmdzKF9xXywgbmFtZSk7CisJCWlmIChxcXEgPT0gMCkgeyAvKiBwZmlmb19mYXN0IGFrYSBwcmlvICovCisJCQkvKiBub3RoaW5nLiAqLyAvKnByaW9fcHJpbnRfb3B0KHRiW1RDQV9PUFRJT05TXSk7Ki8KKwkJfSBlbHNlIGlmIChxcXEgPT0gMSkgeyAvKiBjbGFzcyBiYXNlZCBxdWV1aW5nICovCisJCQkvKiBjYnFfcHJpbnRfY29wdCgpIGlzIGlkZW50aWNhbCB0byBjYnFfcHJpbnRfb3B0KCkuICovCisJCQljYnFfcHJpbnRfb3B0KHRiW1RDQV9PUFRJT05TXSk7CisJCX0gZWxzZQorCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duICVzIiwgbmFtZSk7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9maWx0ZXIoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8gVU5VU0VEX1BBUkFNLAorCQkJCQkJc3RydWN0IG5sbXNnaGRyICpoZHIsIHZvaWQgKmFyZyBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHRjbXNnICptc2cgPSBOTE1TR19EQVRBKGhkcik7CisJaW50IGxlbiA9IGhkci0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKiB0YltUQ0FfTUFYKzFdOworCXJldHVybiAwOworfQorCitpbnQgdGNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRjX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBvYmplY3RzW10gQUxJR04xID0KKwkJInFkaXNjXDAiImNsYXNzXDAiImZpbHRlclwwIgorCQk7CisJZW51bSB7IE9CSl9xZGlzYyA9IDAsIE9CSl9jbGFzcywgT0JKX2ZpbHRlciB9OworCXN0YXRpYyBjb25zdCBjaGFyIGNvbW1hbmRzW10gQUxJR04xID0KKwkJImFkZFwwIiJkZWxldGVcMCIiY2hhbmdlXDAiCisJCSJsaW5rXDAiIC8qIG9ubHkgcWRpc2MgKi8KKwkJInJlcGxhY2VcMCIKKwkJInNob3dcMCIibGlzdFwwIgorCQk7CisJc3RhdGljIGNvbnN0IGNoYXIgYXJnc1tdIEFMSUdOMSA9CisJCSJkZXZcMCIgLyogcWRpc2MsIGNsYXNzLCBmaWx0ZXIgKi8KKwkJInJvb3RcMCIgLyogY2xhc3MsIGZpbHRlciAqLworCQkicGFyZW50XDAiIC8qIGNsYXNzLCBmaWx0ZXIgKi8KKwkJInFkaXNjXDAiIC8qIGNsYXNzICovCisJCSJoYW5kbGVcMCIgLyogY2hhbmdlOiBxZGlzYywgY2xhc3MoY2xhc3NpZCkgbGlzdDogZmlsdGVyICovCisJCSJjbGFzc2lkXDAiIC8qIGNoYW5nZTogZm9yIGNsYXNzIHVzZSAiaGFuZGxlIiAqLworCQkicHJlZmVyZW5jZVwwIiJwcmlvcml0eVwwIiJwcm90b2NvbFwwIiAvKiBmaWx0ZXIgKi8KKwkJOworCWVudW0geyBDTURfYWRkID0gMCwgQ01EX2RlbCwgQ01EX2NoYW5nZSwgQ01EX2xpbmssIENNRF9yZXBsYWNlLCBDTURfc2hvdyB9OworCWVudW0geyBBUkdfZGV2ID0gMCwgQVJHX3Jvb3QsIEFSR19wYXJlbnQsIEFSR19xZGlzYywKKwkJCUFSR19oYW5kbGUsIEFSR19jbGFzc2lkLCBBUkdfcHJlZiwgQVJHX3ByaW8sIEFSR19wcm90b307CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgdGNtc2cgbXNnOworCWludCByZXQsIG9iaiwgY21kLCBhcmc7CisJY2hhciAqZGV2ID0gTlVMTDsKKworCUlOSVRfRygpOworCisJaWYgKCEqKythcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisJeHJ0bmxfb3BlbigmcnRoKTsKKwlyZXQgPSBFWElUX1NVQ0NFU1M7CisKKwlvYmogPSBpbmRleF9pbl9zdWJzdHJpbmdzKG9iamVjdHMsICphcmd2KyspOworCisJaWYgKG9iaiA8IE9CSl9xZGlzYykKKwkJYmJfc2hvd191c2FnZSgpOworCWlmICghKmFyZ3YpCisJCWNtZCA9IENNRF9zaG93OyAvKiBsaXN0IGlzIHRoZSBkZWZhdWx0ICovCisJZWxzZSB7CisJCWNtZCA9IGluZGV4X2luX3N1YnN0cmluZ3MoY29tbWFuZHMsICphcmd2KTsKKwkJaWYgKGNtZCA8IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsICphcmd2LCBhcHBsZXRfbmFtZSk7CisJCWFyZ3YrKzsKKwl9CisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKKwltc2cudGNtX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwlsbF9pbml0X21hcCgmcnRoKTsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJYXJnID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhhcmdzLCAqYXJndik7CisJCWlmIChhcmcgPT0gQVJHX2RldikgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChkZXYpCisJCQkJZHVwYXJnMigiZGV2IiwgKmFyZ3YpOworCQkJZGV2ID0gKmFyZ3YrKzsKKwkJCW1zZy50Y21faWZpbmRleCA9IHhsbF9uYW1lX3RvX2luZGV4KGRldik7CisJCQlpZiAoY21kID49IENNRF9zaG93KQorCQkJCWZpbHRlcl9pZmluZGV4ID0gbXNnLnRjbV9pZmluZGV4OworCQl9IGVsc2UKKwkJaWYgKChhcmcgPT0gQVJHX3FkaXNjICYmIG9iaiA9PSBPQkpfY2xhc3MgJiYgY21kID49IENNRF9zaG93KQorCQkgfHwgKGFyZyA9PSBBUkdfaGFuZGxlICYmIG9iaiA9PSBPQkpfcWRpc2MgJiYgY21kID09IENNRF9jaGFuZ2UpCisJCSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgZHVwYXJnMigicWRpc2MgaGFuZGxlIiwqYXJndikgZm9yIG5vdyAqLworCQkJaWYgKGdldF9xZGlzY19oYW5kbGUoJmZpbHRlcl9xZGlzYywgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInFkaXNjIik7CisJCX0gZWxzZQorCQlpZiAob2JqICE9IE9CSl9xZGlzYworCQkgJiYgKGFyZyA9PSBBUkdfcm9vdAorCQkgICAgfHwgYXJnID09IEFSR19wYXJlbnQKKwkJICAgIHx8IChvYmogPT0gT0JKX2ZpbHRlciAmJiBhcmcgPj0gQVJHX3ByZWYpCisJCSAgICApCisJCSkgeworCQkJLyogbm90aGluZyAqLworCQl9IGVsc2UgeworCQkJaW52YXJnKCphcmd2LCAiY29tbWFuZCIpOworCQl9CisJCU5FWFRfQVJHKCk7CisJCWlmIChhcmcgPT0gQVJHX3Jvb3QpIHsKKwkJCWlmIChtc2cudGNtX3BhcmVudCkKKwkJCQlkdXBhcmcoInBhcmVudCIsICphcmd2KTsKKwkJCW1zZy50Y21fcGFyZW50ID0gVENfSF9ST09UOworCQkJaWYgKG9iaiA9PSBPQkpfZmlsdGVyKQorCQkJCWZpbHRlcl9wYXJlbnQgPSBUQ19IX1JPT1Q7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19wYXJlbnQpIHsKKwkJCXVpbnQzMl90IGhhbmRsZTsKKwkJCWlmIChtc2cudGNtX3BhcmVudCkKKwkJCQlkdXBhcmcoKmFyZ3YsICJwYXJlbnQiKTsKKwkJCWlmIChnZXRfdGNfY2xhc3NpZCgmaGFuZGxlLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAicGFyZW50Iik7CisJCQltc2cudGNtX3BhcmVudCA9IGhhbmRsZTsKKwkJCWlmIChvYmogPT0gT0JKX2ZpbHRlcikKKwkJCQlmaWx0ZXJfcGFyZW50ID0gaGFuZGxlOworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfaGFuZGxlKSB7IC8qIGZpbHRlcjo6bGlzdCAqLworCQkJaWYgKG1zZy50Y21faGFuZGxlKQorCQkJCWR1cGFyZygqYXJndiwgImhhbmRsZSIpOworCQkJLyogcmVqZWN0IExPTkdfTUlOIHx8IExPTkdfTUFYICovCisJCQkvKiBUT0RPOiBmb3IgZncKKwkJCSAgIGlmICgoc2xhc2ggPSBzdHJjaHIoaGFuZGxlLCAnLycpKSAhPSBOVUxMKQorCQkJCSAgICpzbGFzaCA9ICdcMCc7CisJCQkgKi8KKwkJCW1zZy50Y21faGFuZGxlID0gZ2V0X3UzMigqYXJndiwgImhhbmRsZSIpOworCQkJLyogaWYgKHNsYXNoKSB7aWYgKGdldF91MzIodWludDMyX3QgJm1hc2ssIHNsYXNoKzEsIE5VTEwpKSBpbnYgbWFzazsgYWRkYXR0cjMyKG4sIE1BWF9NU0csIFRDQV9GV19NQVNLLCBtYXNrKTsgKi8KKwkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX2NsYXNzaWQgJiYgb2JqID09IE9CSl9jbGFzcyAmJiBjbWQgPT0gQ01EX2NoYW5nZSl7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19wcmVmIHx8IGFyZyA9PSBBUkdfcHJpbykgeyAvKiBmaWx0ZXI6Omxpc3QgKi8KKwkJCWlmIChmaWx0ZXJfcHJpbykKKwkJCQlkdXBhcmcoKmFyZ3YsICJwcmlvcml0eSIpOworCQkJZmlsdGVyX3ByaW8gPSBnZXRfdTMyKCphcmd2LCAicHJpb3JpdHkiKTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX3Byb3RvKSB7IC8qIGZpbHRlcjo6bGlzdCAqLworCQkJdWludDE2X3QgdG1wOworCQkJaWYgKGZpbHRlcl9wcm90bykKKwkJCQlkdXBhcmcoKmFyZ3YsICJwcm90b2NvbCIpOworCQkJaWYgKGxsX3Byb3RvX2EybigmdG1wLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAicHJvdG9jb2wiKTsKKwkJCWZpbHRlcl9wcm90byA9IHRtcDsKKwkJfQorCX0KKwlpZiAoY21kID49IENNRF9zaG93KSB7IC8qIHNob3cgb3IgbGlzdCAqLworCQlpZiAob2JqID09IE9CSl9maWx0ZXIpCisJCQltc2cudGNtX2luZm8gPSBUQ19IX01BS0UoZmlsdGVyX3ByaW88PDE2LCBmaWx0ZXJfcHJvdG8pOworCQlpZiAocnRubF9kdW1wX3JlcXVlc3QoJnJ0aCwgb2JqID09IE9CSl9xZGlzYyA/IFJUTV9HRVRRRElTQyA6CisJCQkJCQlvYmogPT0gT0JKX2NsYXNzID8gUlRNX0dFVFRDTEFTUyA6IFJUTV9HRVRURklMVEVSLAorCQkJCQkJJm1zZywgc2l6ZW9mKG1zZykpIDwgMCkKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNlbmQgZHVtcCByZXF1ZXN0Iik7CisKKwkJeHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgb2JqID09IE9CSl9xZGlzYyA/IHByaW50X3FkaXNjIDoKKwkJCQkJCW9iaiA9PSBPQkpfY2xhc3MgPyBwcmludF9jbGFzcyA6IHByaW50X2ZpbHRlciwKKwkJCQkJCU5VTEwpOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJcnRubF9jbG9zZSgmcnRoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGNwdWRwLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3RjcHVkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjZhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3RjcHVkcC5jCkBAIC0wLDAgKzEsNjQ2IEBACisvKiBCYXNlZCBvbiBpcHN2ZCB1dGlsaXRpZXMgd3JpdHRlbiBieSBHZXJyaXQgUGFwZSA8cGFwZUBzbWFyZGVuLm9yZz4KKyAqIHdoaWNoIGFyZSByZWxlYXNlZCBpbnRvIHB1YmxpYyBkb21haW4gYnkgdGhlIGF1dGhvci4KKyAqIEhvbWVwYWdlOiBodHRwOi8vc21hcmRlbi5zdW5zaXRlLmRrL2lwc3ZkLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJhc2VkIG9uIGlwc3ZkLTAuMTIuMS4gVGhpcyB0Y3BzdmQgYWNjZXB0cyBhbGwgb3B0aW9ucworICogd2hpY2ggYXJlIHN1cHBvcnRlZCBieSBvbmUgZnJvbSBpcHN2ZC0wLjEyLjEsIGJ1dCBub3QgYWxsIGFyZQorICogZnVuY3Rpb25hbC4gU2VlIGhlbHAgdGV4dCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgZGV0YWlscy4KKyAqCisgKiBDb2RlIGluc2lkZSAiI2lmZGVmIFNTTFNWRCIgaXMgZm9yIHNzbHN2ZCBhbmQgaXMgY3VycmVudGx5IHVudXNlZC4KKyAqCisgKiBCdXN5Ym94IHZlcnNpb24gZXhwb3J0cyBUQ1BMT0NBTEFERFIgaW5zdGVhZCBvZgorICogVENQTE9DQUxJUCArIFRDUExPQ0FMUE9SVCBwYWlyLiBBRERSIG1vcmUgY2xvc2VseSBtYXRjaGVzIHJlYWxpdHkKKyAqICh3aGljaCBpcyAic3RydWN0IHNvY2thZGRyX1hYWCIuIFBvcnQgaXMgbm90IGEgc2VwYXJhdGUgZW50aXR5LAorICogaXQncyBqdXN0IGEgcGFydCBvZiAoQUZfSU5FVFs2XSkgc29ja2FkZHIhKS4KKyAqCisgKiBUQ1BPUklHRFNUQUREUiBpcyBCdXN5Ym94LXNwZWNpZmljIGFkZGl0aW9uLgorICoKKyAqIHVkcCBzZXJ2ZXIgaXMgaGFja2VkIHVwIGJ5IHJldXNpbmcgVENQIGNvZGUuIEl0IGhhcyB0aGUgZm9sbG93aW5nCisgKiBsaW1pdGF0aW9uIGluaGVyZW50IGluIFVuaXggREdSQU0gc29ja2V0cyBpbXBsZW1lbnRhdGlvbjoKKyAqIC0gbG9jYWwgSVAgYWRkcmVzcyBpcyByZXRyaWV2ZWQgKHVzaW5nIHJlY3Ztc2cgdm9vZG9vKSBidXQKKyAqICAgY2hpbGQncyBzb2NrZXQgaXMgbm90IGJvdW5kIHRvIGl0IChiaW5kIGNhbm5vdCBiZSBjYWxsZWQgb24KKyAqICAgYWxyZWFkeSBib3VuZCBzb2NrZXQpLiBUaHVzIGl0IHN0aWxsIGNhbiBlbWl0IG91dGdvaW5nIHBhY2tldHMKKyAqICAgd2l0aCB3cm9uZyBzb3VyY2UgSVAuLi4KKyAqIC0gZG9uJ3Qga25vdyBob3cgdG8gcmV0cmlldmUgT1JJR0RTVCBmb3IgdWRwLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0Y3BzdmRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstaEV2XSBbLWMgTl0gWy1DIE5bOk1TR11dIFstYiBOXSBbLXUgVVNFUl0gWy1sIE5BTUVdIElQIFBPUlQgUFJPRyIKKy8qIHdpdGggbm90LWltcGxlbWVudGVkIG9wdGlvbnM6ICovCisvKiAvL3VzYWdlOiAgICAiWy1ocEV2dl0gWy1jIE5dIFstQyBOWzpNU0ddXSBbLWIgTl0gWy11IFVTRVJdIFstbCBOQU1FXSBbLWkgRElSfC14IENEQl0gWy10IFNFQ10gSVAgUE9SVCBQUk9HIiAqLworLy91c2FnZTojZGVmaW5lIHRjcHN2ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBUQ1Agc29ja2V0LCBiaW5kIHRvIElQOlBPUlQgYW5kIGxpc3RlblxuIgorLy91c2FnZTogICAgICAgImZvciBpbmNvbWluZyBjb25uZWN0aW9uLiBSdW4gUFJPRyBmb3IgZWFjaCBjb25uZWN0aW9uLlxuIgorLy91c2FnZTogICAgICJcbglJUAkJSVAgdG8gbGlzdGVuIG9uLCAwID0gYWxsIgorLy91c2FnZTogICAgICJcbglQT1JUCQlQb3J0IHRvIGxpc3RlbiBvbiIKKy8vdXNhZ2U6ICAgICAiXG4JUFJPRyBBUkdTCVByb2dyYW0gdG8gcnVuIgorLy91c2FnZTogICAgICJcbgktbCBOQU1FCQlMb2NhbCBob3N0bmFtZSAoZWxzZSBsb29rcyB1cCBsb2NhbCBob3N0bmFtZSBpbiBETlMpIgorLy91c2FnZTogICAgICJcbgktdSBVU0VSWzpHUlBdCUNoYW5nZSB0byB1c2VyL2dyb3VwIGFmdGVyIGJpbmQiCisvL3VzYWdlOiAgICAgIlxuCS1jIE4JCUhhbmRsZSB1cCB0byBOIGNvbm5lY3Rpb25zIHNpbXVsdGFuZW91c2x5IgorLy91c2FnZTogICAgICJcbgktYiBOCQlBbGxvdyBhIGJhY2tsb2cgb2YgYXBwcm94aW1hdGVseSBOIFRDUCBTWU5zIgorLy91c2FnZTogICAgICJcbgktQyBOWzpNU0ddCUFsbG93IG9ubHkgdXAgdG8gTiBjb25uZWN0aW9ucyBmcm9tIHRoZSBzYW1lIElQIgorLy91c2FnZTogICAgICJcbgkJCU5ldyBjb25uZWN0aW9ucyBmcm9tIHRoaXMgSVAgYWRkcmVzcyBhcmUgY2xvc2VkIgorLy91c2FnZTogICAgICJcbgkJCWltbWVkaWF0ZWx5LiBNU0cgaXMgd3JpdHRlbiB0byB0aGUgcGVlciBiZWZvcmUgY2xvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1oCQlMb29rIHVwIHBlZXIncyBob3N0bmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLUUJCURvbid0IHNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMiCisvL3VzYWdlOiAgICAgIlxuCS12CQlWZXJib3NlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1ZHBzdmRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstaEV2XSBbLWMgTl0gWy11IFVTRVJdIFstbCBOQU1FXSBJUCBQT1JUIFBST0ciCisvL3VzYWdlOiNkZWZpbmUgdWRwc3ZkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIFVEUCBzb2NrZXQsIGJpbmQgdG8gSVA6UE9SVCBhbmQgd2FpdFxuIgorLy91c2FnZTogICAgICAgImZvciBpbmNvbWluZyBwYWNrZXRzLiBSdW4gUFJPRyBmb3IgZWFjaCBwYWNrZXQsXG4iCisvL3VzYWdlOiAgICAgICAicmVkaXJlY3RpbmcgYWxsIGZ1cnRoZXIgcGFja2V0cyB3aXRoIHNhbWUgcGVlciBpcDpwb3J0IHRvIGl0LlxuIgorLy91c2FnZTogICAgICJcbglJUAkJSVAgdG8gbGlzdGVuIG9uLCAwID0gYWxsIgorLy91c2FnZTogICAgICJcbglQT1JUCQlQb3J0IHRvIGxpc3RlbiBvbiIKKy8vdXNhZ2U6ICAgICAiXG4JUFJPRyBBUkdTCVByb2dyYW0gdG8gcnVuIgorLy91c2FnZTogICAgICJcbgktbCBOQU1FCQlMb2NhbCBob3N0bmFtZSAoZWxzZSBsb29rcyB1cCBsb2NhbCBob3N0bmFtZSBpbiBETlMpIgorLy91c2FnZTogICAgICJcbgktdSBVU0VSWzpHUlBdCUNoYW5nZSB0byB1c2VyL2dyb3VwIGFmdGVyIGJpbmQiCisvL3VzYWdlOiAgICAgIlxuCS1jIE4JCUhhbmRsZSB1cCB0byBOIGNvbm5lY3Rpb25zIHNpbXVsdGFuZW91c2x5IgorLy91c2FnZTogICAgICJcbgktaAkJTG9vayB1cCBwZWVyJ3MgaG9zdG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1FCQlEb24ndCBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIgorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFdhbnRzIDxsaW1pdHMuaD4gZXRjLCB0aHVzIGluY2x1ZGVkIGFmdGVyIGxpYmJiLmg6ICovCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gLyogZm9yIF9fYmUzMiBldGMgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2VuZGlmCisKKy8vIFRPRE86IG1vdmUgaW50byB0aGlzIGZpbGU6CisjaW5jbHVkZSAidGNwdWRwX3Blcmhvc3QuaCIKKworI2lmZGVmIFNTTFNWRAorI2luY2x1ZGUgIm1hdHJpeFNzbC5oIgorI2luY2x1ZGUgInNzbF9pby5oIgorI2VuZGlmCisKK3N0cnVjdCBnbG9iYWxzIHsKKwl1bnNpZ25lZCB2ZXJib3NlOworCXVuc2lnbmVkIG1heF9wZXJfaG9zdDsKKwl1bnNpZ25lZCBjdXJfcGVyX2hvc3Q7CisJdW5zaWduZWQgY251bTsKKwl1bnNpZ25lZCBjbWF4OworCWNoYXIgKiplbnZfY3VyOworCWNoYXIgKmVudl92YXJbMV07IC8qIGFjdHVhbGx5IGJpZ2dlciAqLworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgdmVyYm9zZSAgICAgIChHLnZlcmJvc2UgICAgICkKKyNkZWZpbmUgbWF4X3Blcl9ob3N0IChHLm1heF9wZXJfaG9zdCkKKyNkZWZpbmUgY3VyX3Blcl9ob3N0IChHLmN1cl9wZXJfaG9zdCkKKyNkZWZpbmUgY251bSAgICAgICAgIChHLmNudW0gICAgICAgICkKKyNkZWZpbmUgY21heCAgICAgICAgIChHLmNtYXggICAgICAgICkKKyNkZWZpbmUgZW52X2N1ciAgICAgIChHLmVudl9jdXIgICAgICkKKyNkZWZpbmUgZW52X3ZhciAgICAgIChHLmVudl92YXIgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJY21heCA9IDMwOyBcCisJZW52X2N1ciA9ICZlbnZfdmFyWzBdOyBcCit9IHdoaWxlICgwKQorCisKKy8qIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBhYm91dCBsZWFraW5nIG1lbW9yeSBpbiByZXBlYXRlZCBzZXRlbnYncyAqLworc3RhdGljIHZvaWQgeHNldGVudl9wbGFpbihjb25zdCBjaGFyICpuLCBjb25zdCBjaGFyICp2KQoreworCWNoYXIgKnZhciA9IHhhc3ByaW50ZigiJXM9JXMiLCBuLCB2KTsKKwkqZW52X2N1cisrID0gdmFyOworCXB1dGVudih2YXIpOworfQorCitzdGF0aWMgdm9pZCB4c2V0ZW52X3Byb3RvKGNvbnN0IGNoYXIgKnByb3RvLCBjb25zdCBjaGFyICpuLCBjb25zdCBjaGFyICp2KQoreworCWNoYXIgKnZhciA9IHhhc3ByaW50ZigiJXMlcz0lcyIsIHByb3RvLCBuLCB2KTsKKwkqZW52X2N1cisrID0gdmFyOworCXB1dGVudih2YXIpOworfQorCitzdGF0aWMgdm9pZCB1bmRvX3hzZXRlbnYodm9pZCkKK3sKKwljaGFyICoqcHAgPSBlbnZfY3VyID0gJmVudl92YXJbMF07CisJd2hpbGUgKCpwcCkgeworCQljaGFyICp2YXIgPSAqcHA7CisJCWJiX3Vuc2V0ZW52X2FuZF9mcmVlKHZhcik7CisJCSpwcCsrID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNpZ190ZXJtX2hhbmRsZXIoaW50IHNpZykKK3sKKwlpZiAodmVyYm9zZSkKKwkJYmJfZXJyb3JfbXNnKCJnb3Qgc2lnbmFsICV1LCBleGl0Iiwgc2lnKTsKKwlraWxsX215c2VsZl93aXRoX3NpZyhzaWcpOworfQorCisvKiBMaXR0bGUgYmxvYXRlZCwgYnV0IHRyaWVzIHRvIGdpdmUgYWNjdXJhdGUgaW5mbyBob3cgY2hpbGQgZXhpdGVkLgorICogTWFrZXMgZWFzaWVyIHRvIHNwb3Qgc2VnZmF1bHRpbmcgY2hpbGRyZW4gZXRjLi4uICovCitzdGF0aWMgdm9pZCBwcmludF93YWl0c3RhdCh1bnNpZ25lZCBwaWQsIGludCB3c3RhdCkKK3sKKwl1bnNpZ25lZCBlID0gMDsKKwljb25zdCBjaGFyICpjYXVzZSA9ICI/ZXhpdCI7CisKKwlpZiAoV0lGRVhJVEVEKHdzdGF0KSkgeworCQljYXVzZSsrOworCQllID0gV0VYSVRTVEFUVVMod3N0YXQpOworCX0gZWxzZSBpZiAoV0lGU0lHTkFMRUQod3N0YXQpKSB7CisJCWNhdXNlID0gInNpZ25hbCI7CisJCWUgPSBXVEVSTVNJRyh3c3RhdCk7CisJfQorCWJiX2Vycm9yX21zZygiZW5kICVkICVzICVkIiwgcGlkLCBjYXVzZSwgZSk7Cit9CisKKy8qIE11c3QgbWF0Y2ggZ2V0b3B0MzIgaW4gbWFpbiEgKi8KK2VudW0geworCU9QVF9jID0gKDEgPDwgMCksCisJT1BUX0MgPSAoMSA8PCAxKSwKKwlPUFRfaSA9ICgxIDw8IDIpLAorCU9QVF94ID0gKDEgPDwgMyksCisJT1BUX3UgPSAoMSA8PCA0KSwKKwlPUFRfbCA9ICgxIDw8IDUpLAorCU9QVF9FID0gKDEgPDwgNiksCisJT1BUX2IgPSAoMSA8PCA3KSwKKwlPUFRfaCA9ICgxIDw8IDgpLAorCU9QVF9wID0gKDEgPDwgOSksCisJT1BUX3QgPSAoMSA8PCAxMCksCisJT1BUX3YgPSAoMSA8PCAxMSksCisJT1BUX1YgPSAoMSA8PCAxMiksCisJT1BUX1UgPSAoMSA8PCAxMyksIC8qIGZyb20gaGVyZTogc3Nsc3ZkIG9ubHkgKi8KKwlPUFRfc2xhc2ggPSAoMSA8PCAxNCksCisJT1BUX1ogPSAoMSA8PCAxNSksCisJT1BUX0sgPSAoMSA8PCAxNiksCit9OworCitzdGF0aWMgdm9pZCBjb25uZWN0aW9uX3N0YXR1cyh2b2lkKQoreworCS8qICJvbmx5IDEgY2xpZW50IG1heCIgZGVzbid0IG5lZWQgdGhpcyAqLworCWlmIChjbWF4ID4gMSkKKwkJYmJfZXJyb3JfbXNnKCJzdGF0dXMgJXUvJXUiLCBjbnVtLCBjbWF4KTsKK30KKworc3RhdGljIHZvaWQgc2lnX2NoaWxkX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJaW50IHdzdGF0OworCXBpZF90IHBpZDsKKworCXdoaWxlICgocGlkID0gd2FpdF9hbnlfbm9oYW5nKCZ3c3RhdCkpID4gMCkgeworCQlpZiAobWF4X3Blcl9ob3N0KQorCQkJaXBzdmRfcGVyaG9zdF9yZW1vdmUocGlkKTsKKwkJaWYgKGNudW0pCisJCQljbnVtLS07CisJCWlmICh2ZXJib3NlKQorCQkJcHJpbnRfd2FpdHN0YXQocGlkLCB3c3RhdCk7CisJfQorCWlmICh2ZXJib3NlKQorCQljb25uZWN0aW9uX3N0YXR1cygpOworfQorCitpbnQgdGNwdWRwc3ZkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0Y3B1ZHBzdmRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnN0cl9DLCAqc3RyX3Q7CisJY2hhciAqdXNlcjsKKwlzdHJ1Y3QgaGNjICpoY2NwOworCWNvbnN0IGNoYXIgKmluc3RydWN0czsKKwljaGFyICptc2dfcGVyX2hvc3QgPSBOVUxMOworCXVuc2lnbmVkIGxlbl9wZXJfaG9zdCA9IGxlbl9wZXJfaG9zdDsgLyogZ2NjICovCisjaWZuZGVmIFNTTFNWRAorCXN0cnVjdCBiYl91aWRnaWRfdCB1Z2lkOworI2VuZGlmCisJYm9vbCB0Y3A7CisJdWludDE2X3QgbG9jYWxfcG9ydDsKKwljaGFyICpwcmVzZXRfbG9jYWxfaG9zdG5hbWUgPSBOVUxMOworCWNoYXIgKnJlbW90ZV9ob3N0bmFtZSA9IHJlbW90ZV9ob3N0bmFtZTsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqcmVtb3RlX2FkZHIgPSByZW1vdGVfYWRkcjsgLyogZm9yIGNvbXBpbGVyICovCisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCWxlbl9hbmRfc29ja2FkZHIgbG9jYWwsIHJlbW90ZTsKKwlzb2NrbGVuX3Qgc2FfbGVuOworCWludCBwaWQ7CisJaW50IHNvY2s7CisJaW50IGNvbm47CisJdW5zaWduZWQgYmFja2xvZyA9IDIwOworCXVuc2lnbmVkIG9wdHM7CisKKwlJTklUX0coKTsKKworCXRjcCA9IChhcHBsZXRfbmFtZVswXSA9PSAndCcpOworCisJLyogMysgYXJncywgLWkgYXQgbW9zdCBvbmNlLCAtcCBpbXBsaWVzIC1oLCAtdiBpcyBjb3VudGVyLCAtYiBOLCAtYyBOICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTM6aS0taTpwaDp2djpiKzpjKyI7CisjaWZkZWYgU1NMU1ZECisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICIrYzpDOmk6eDp1Omw6RWI6aHB0OnZVOi86WjpLOiIsCisJCSZjbWF4LCAmc3RyX0MsICZpbnN0cnVjdHMsICZpbnN0cnVjdHMsICZ1c2VyLCAmcHJlc2V0X2xvY2FsX2hvc3RuYW1lLAorCQkmYmFja2xvZywgJnN0cl90LCAmc3NsdXNlciwgJnJvb3QsICZjZXJ0LCAma2V5LCAmdmVyYm9zZQorCSk7CisjZWxzZQorCS8qICIrIjogc3RvcCBvbiBmaXJzdCBub24tb3B0aW9uICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICIrYzpDOmk6eDp1Omw6RWI6aHB0OnYiLAorCQkmY21heCwgJnN0cl9DLCAmaW5zdHJ1Y3RzLCAmaW5zdHJ1Y3RzLCAmdXNlciwgJnByZXNldF9sb2NhbF9ob3N0bmFtZSwKKwkJJmJhY2tsb2csICZzdHJfdCwgJnZlcmJvc2UKKwkpOworI2VuZGlmCisJaWYgKG9wdHMgJiBPUFRfQykgeyAvKiAtQyBuWzptZXNzYWdlXSAqLworCQltYXhfcGVyX2hvc3QgPSBiYl9zdHJ0b3Uoc3RyX0MsICZzdHJfQywgMTApOworCQlpZiAoc3RyX0NbMF0pIHsKKwkJCWlmIChzdHJfQ1swXSAhPSAnOicpCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJbXNnX3Blcl9ob3N0ID0gc3RyX0MgKyAxOworCQkJbGVuX3Blcl9ob3N0ID0gc3RybGVuKG1zZ19wZXJfaG9zdCk7CisJCX0KKwl9CisJaWYgKG1heF9wZXJfaG9zdCA+IGNtYXgpCisJCW1heF9wZXJfaG9zdCA9IGNtYXg7CisJaWYgKG9wdHMgJiBPUFRfdSkgeworCQl4Z2V0X3VpZGdpZCgmdWdpZCwgdXNlcik7CisJfQorI2lmZGVmIFNTTFNWRAorCWlmIChvcHRzICYgT1BUX1UpIHNzbHVzZXIgPSBvcHRhcmc7CisJaWYgKG9wdHMgJiBPUFRfc2xhc2gpIHJvb3QgPSBvcHRhcmc7CisJaWYgKG9wdHMgJiBPUFRfWikgY2VydCA9IG9wdGFyZzsKKwlpZiAob3B0cyAmIE9QVF9LKSBrZXkgPSBvcHRhcmc7CisjZW5kaWYKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF1bMF0gfHwgTE9ORV9DSEFSKGFyZ3ZbMF0sICcwJykpCisJCWFyZ3ZbMF0gPSAoY2hhciopIjAuMC4wLjAiOworCisJLyogUGVyLUlQIGZsb29kIHByb3RlY3Rpb24gaXMgbm90IHRob3VnaHQtb3V0IGZvciBVRFAgKi8KKwlpZiAoIXRjcCkKKwkJbWF4X3Blcl9ob3N0ID0gMDsKKworCWJiX3Nhbml0aXplX3N0ZGlvKCk7IC8qIGZkIyAwLDEsMiBtdXN0IGJlIG9wZW5lZCAqLworCisjaWZkZWYgU1NMU1ZECisJc3Nsc2VyID0gdXNlcjsKKwljbGllbnQgPSAwOworCWlmICgoZ2V0dWlkKCkgPT0gMCkgJiYgIShvcHRzICYgT1BUX3UpKSB7CisJCXhmdW5jX2V4aXRjb2RlID0gMTAwOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisJfQorCWlmIChvcHRzICYgT1BUX3UpCisJCWlmICghdWlkZ2lkX2dldCgmc3NsdWdpZCwgc3NsdXNlciwgMSkpIHsKKwkJCWlmIChlcnJubykgeworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IHVzZXIvZ3JvdXA6ICVzIiwgc3NsdXNlcik7CisJCQl9CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biB1c2VyL2dyb3VwICVzIiwgc3NsdXNlcik7CisJCX0KKwlpZiAoIWNlcnQpIGNlcnQgPSAiLi9jZXJ0LnBlbSI7CisJaWYgKCFrZXkpIGtleSA9IGNlcnQ7CisJaWYgKG1hdHJpeFNzbE9wZW4oKSA8IDApCisJCWZhdGFsKCJjYW4ndCBpbml0aWFsaXplIHNzbCIpOworCWlmIChtYXRyaXhTc2xSZWFkS2V5cygma2V5cywgY2VydCwga2V5LCAwLCBjYSkgPCAwKSB7CisJCWlmIChjbGllbnQpCisJCQlmYXRhbCgiY2FuJ3QgcmVhZCBjZXJ0LCBrZXksIG9yIGNhIGZpbGUiKTsKKwkJZmF0YWwoImNhbid0IHJlYWQgY2VydCBvciBrZXkgZmlsZSIpOworCX0KKwlpZiAobWF0cml4U3NsTmV3U2Vzc2lvbigmc3NsLCBrZXlzLCAwLCBTU0xfRkxBR1NfU0VSVkVSKSA8IDApCisJCWZhdGFsKCJjYW4ndCBjcmVhdGUgc3NsIHNlc3Npb24iKTsKKyNlbmRpZgorCisJc2lnX2Jsb2NrKFNJR0NITEQpOworCXNpZ25hbChTSUdDSExELCBzaWdfY2hpbGRfaGFuZGxlcik7CisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCBzaWdfdGVybV9oYW5kbGVyKTsKKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwlpZiAobWF4X3Blcl9ob3N0KQorCQlpcHN2ZF9wZXJob3N0X2luaXQoY21heCk7CisKKwlsb2NhbF9wb3J0ID0gYmJfbG9va3VwX3BvcnQoYXJndlsxXSwgdGNwID8gInRjcCIgOiAidWRwIiwgMCk7CisJbHNhID0geGhvc3Qyc29ja2FkZHIoYXJndlswXSwgbG9jYWxfcG9ydCk7CisJYXJndiArPSAyOworCisJc29jayA9IHhzb2NrZXQobHNhLT51LnNhLnNhX2ZhbWlseSwgdGNwID8gU09DS19TVFJFQU0gOiBTT0NLX0RHUkFNLCAwKTsKKwlzZXRzb2Nrb3B0X3JldXNlYWRkcihzb2NrKTsKKwlzYV9sZW4gPSBsc2EtPmxlbjsgLyogSSBwcmVzdW1lIHNvY2thZGRyIGxlbiBzdGF5cyB0aGUgc2FtZSAqLworCXhiaW5kKHNvY2ssICZsc2EtPnUuc2EsIHNhX2xlbik7CisJaWYgKHRjcCkgeworCQl4bGlzdGVuKHNvY2ssIGJhY2tsb2cpOworCQljbG9zZV9vbl9leGVjX29uKHNvY2spOworCX0gZWxzZSB7IC8qIHVkcDogbmVlZGVkIGZvciByZWN2X2Zyb21fdG8gdG8gd29yazogKi8KKwkJc29ja2V0X3dhbnRfcGt0aW5mbyhzb2NrKTsKKwl9CisJLyogbmRlbGF5X29mZihzb2NrKTsgLSBpdCBpcyB0aGUgZGVmYXVsdCBJIHRoaW5rPyAqLworCisjaWZuZGVmIFNTTFNWRAorCWlmIChvcHRzICYgT1BUX3UpIHsKKwkJLyogZHJvcCBwZXJtaXNzaW9ucyAqLworCQl4c2V0Z2lkKHVnaWQuZ2lkKTsKKwkJeHNldHVpZCh1Z2lkLnVpZCk7CisJfQorI2VuZGlmCisKKwlpZiAodmVyYm9zZSkgeworCQljaGFyICphZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJmxzYS0+dS5zYSk7CisJCWlmIChvcHRzICYgT1BUX3UpCisJCQliYl9lcnJvcl9tc2coImxpc3RlbmluZyBvbiAlcywgc3RhcnRpbmcsIHVpZCAldSwgZ2lkICV1IiwgYWRkciwKKwkJCQkodW5zaWduZWQpdWdpZC51aWQsICh1bnNpZ25lZCl1Z2lkLmdpZCk7CisJCWVsc2UKKwkJCWJiX2Vycm9yX21zZygibGlzdGVuaW5nIG9uICVzLCBzdGFydGluZyIsIGFkZHIpOworCQlmcmVlKGFkZHIpOworCX0KKworCS8qIE1haW4gYWNjZXB0KCkgbG9vcCAqLworCisgYWdhaW46CisJaGNjcCA9IE5VTEw7CisKKwl3aGlsZSAoY251bSA+PSBjbWF4KQorCQl3YWl0X2Zvcl9hbnlfc2lnKCk7IC8qIGV4cGVjdGluZyBTSUdDSExEICovCisKKwkvKiBBY2NlcHQgYSBjb25uZWN0aW9uIHRvIGZkICMwICovCisgYWdhaW4xOgorCWNsb3NlKDApOworIGFnYWluMjoKKwlzaWdfdW5ibG9jayhTSUdDSExEKTsKKwlsb2NhbC5sZW4gPSByZW1vdGUubGVuID0gc2FfbGVuOworCWlmICh0Y3ApIHsKKwkJY29ubiA9IGFjY2VwdChzb2NrLCAmcmVtb3RlLnUuc2EsICZyZW1vdGUubGVuKTsKKwl9IGVsc2UgeworCQkvKiBJbiBjYXNlIHJlY3ZfZnJvbV90byB3b24ndCBiZSBhYmxlIHRvIHJlY292ZXIgbG9jYWwgYWRkci4KKwkJICogQWxzbyBzZXRzIHBvcnQgLSByZWN2X2Zyb21fdG8gaXMgdW5hYmxlIHRvIGRvIGl0LiAqLworCQlsb2NhbCA9ICpsc2E7CisJCWNvbm4gPSByZWN2X2Zyb21fdG8oc29jaywgTlVMTCwgMCwgTVNHX1BFRUssCisJCQkJJnJlbW90ZS51LnNhLCAmbG9jYWwudS5zYSwgc2FfbGVuKTsKKwl9CisJc2lnX2Jsb2NrKFNJR0NITEQpOworCWlmIChjb25uIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQliYl9wZXJyb3JfbXNnKHRjcCA/ICJhY2NlcHQiIDogInJlY3YiKTsKKwkJZ290byBhZ2FpbjI7CisJfQorCXhtb3ZlX2ZkKHRjcCA/IGNvbm4gOiBzb2NrLCAwKTsKKworCWlmIChtYXhfcGVyX2hvc3QpIHsKKwkJLyogRHJvcCBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGlmIGN1cl9wZXJfaG9zdCA+IG1heF9wZXJfaG9zdAorCQkgKiAobWluaW1pemluZyBsb2FkIHVuZGVyIFNZTiBmbG9vZCkgKi8KKwkJcmVtb3RlX2FkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoJnJlbW90ZS51LnNhKTsKKwkJY3VyX3Blcl9ob3N0ID0gaXBzdmRfcGVyaG9zdF9hZGQocmVtb3RlX2FkZHIsIG1heF9wZXJfaG9zdCwgJmhjY3ApOworCQlpZiAoY3VyX3Blcl9ob3N0ID4gbWF4X3Blcl9ob3N0KSB7CisJCQkvKiBpcHN2ZF9wZXJob3N0X2FkZCBkZXRlY3RlZCB0aGF0IG1heCBpcyBleGNlZWRlZAorCQkJICogKGFuZCBkaWQgbm90IHN0b3JlIGlwIGluIGNvbm5lY3Rpb24gdGFibGUpICovCisJCQlmcmVlKHJlbW90ZV9hZGRyKTsKKwkJCWlmIChtc2dfcGVyX2hvc3QpIHsKKwkJCQkvKiBkb24ndCBibG9jayBvciB0ZXN0IGZvciBlcnJvcnMgKi8KKwkJCQlzZW5kKDAsIG1zZ19wZXJfaG9zdCwgbGVuX3Blcl9ob3N0LCBNU0dfRE9OVFdBSVQpOworCQkJfQorCQkJZ290byBhZ2FpbjE7CisJCX0KKwkJLyogTkI6IHJlbW90ZV9hZGRyIGlzIG5vdCBsZWFrZWQsIGl0IGlzIHN0b3JlZCBpbiBjb25uIHRhYmxlICovCisJfQorCisJaWYgKCF0Y3ApIHsKKwkJLyogVm9vZG9vIG1hZ2ljOiBtYWtpbmcgdWRwIHNvY2tldHMgZWFjaCByZWNlaXZlIGl0cyBvd24KKwkJICogcGFja2V0cyBpcyBub3QgdHJpdmlhbCwgYW5kIEkgc3RpbGwgbm90IHN1cmUKKwkJICogSSBkbyBpdCAxMDAlIHJpZ2h0LgorCQkgKiAxKSB3ZSBoYXZlIHRvIGRvIGl0IGJlZm9yZSBmb3JrKCkKKwkJICogMikgb3JkZXIgaXMgaW1wb3J0YW50IC0gaXMgaXQgcmlnaHQgbm93PyAqLworCisJCS8qIE9wZW4gbmV3IG5vbi1jb25uZWN0ZWQgVURQIHNvY2tldCBmb3IgZnVydGhlciBjbGllbnRzLi4uICovCisJCXNvY2sgPSB4c29ja2V0KGxzYS0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfREdSQU0sIDApOworCQlzZXRzb2Nrb3B0X3JldXNlYWRkcihzb2NrKTsKKwkJLyogTWFrZSBwbGFpbiB3cml0ZS9zZW5kIHdvcmsgZm9yIG9sZCBzb2NrZXQgYnkgc3VwcGx5aW5nIGRlZmF1bHQKKwkJICogZGVzdGluYXRpb24gYWRkcmVzcy4gVGhpcyBhbHNvIHJlc3RyaWN0cyBpbmNvbWluZyBwYWNrZXRzCisJCSAqIHRvIG9uZXMgY29taW5nIGZyb20gdGhpcyByZW1vdGUgSVAuICovCisJCXhjb25uZWN0KDAsICZyZW1vdGUudS5zYSwgc2FfbGVuKTsKKwkvKiBob2xlPyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgbm8gd2lsZGNhcmQgdWRwIHNvY2tldC4uLgorCSAqIGNhbiB0aGlzIGNhdXNlIGNsaWVudHMgdG8gZ2V0ICJwb3J0IHVucmVhY2hhYmxlIiBpY21wPworCSAqIFl1cCwgdGltZSB3aW5kb3cgaXMgdmVyeSBzbWFsbCwgYnV0IGl0IGV4aXN0cyAoaXMgaXQ/KSAqLworCQkvKiAuLi4ib3BlbiBuZXcgc29ja2V0IiwgY29udGludWVkICovCisJCXhiaW5kKHNvY2ssICZsc2EtPnUuc2EsIHNhX2xlbik7CisJCXNvY2tldF93YW50X3BrdGluZm8oc29jayk7CisKKwkJLyogRG9lc24ndCB3b3JrOgorCQkgKiB3ZSBjYW5ub3QgcmVwbGFjZSBmZCAjMCAtIHdlIHdpbGwgbG9zZSBwZW5kaW5nIHBhY2tldAorCQkgKiB3aGljaCBpcyBhbHJlYWR5IGJ1ZmZlcmVkIGZvciB1cyEgQW5kIHdlIGNhbm5vdCB1c2UgZmQgIzEKKwkJICogaW5zdGVhZCAtIGl0IHdpbGwgImludGVyY2VwdCIgYWxsIGZvbGxvd2luZyBwYWNrZXRzLCBidXQgY2hpbGQKKwkJICogZG9lcyBub3QgZXhwZWN0IGRhdGEgY29taW5nICpmcm9tIGZkICMxKiEgKi8KKyNpZiAwCisJCS8qIE1ha2UgaXQgc28gdGhhdCBsb2NhbCBhZGRyIGlzIGZpeGVkIHRvIGxvY2FscC0+dS5zYQorCQkgKiBhbmQgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IGFjY2VwdCBwYWNrZXRzIHRvIG90aGVyIGxvY2FsIElQcy4gKi8KKwkJLyogTkI6IHdlIHBvc3NpYmx5IGJpbmQgdG8gdGhlIF92ZXJ5XyBzYW1lXyBhZGRyZXNzICYgcG9ydCBhcyB0aGUgb25lCisJCSAqIGFscmVhZHkgYm91bmQgaW4gcGFyZW50ISBUaGlzIHNlZW1zIHRvIHdvcmsgaW4gTGludXguCisJCSAqIChvdGhlcndpc2Ugd2UgY2FuIG1vdmUgc29ja2V0IHRvIGZkICMwIG9ubHkgaWYgYmluZCBzdWNjZWVkcykgKi8KKwkJY2xvc2UoMCk7CisJCXNldF9ucG9ydCgmbG9jYWxwLT51LnNhLCBodG9ucyhsb2NhbF9wb3J0KSk7CisJCXhtb3ZlX2ZkKHhzb2NrZXQobG9jYWxwLT51LnNhLnNhX2ZhbWlseSwgU09DS19ER1JBTSwgMCksIDApOworCQlzZXRzb2Nrb3B0X3JldXNlYWRkcigwKTsgLyogY3J1Y2lhbCAqLworCQl4YmluZCgwLCAmbG9jYWxwLT51LnNhLCBsb2NhbHAtPmxlbik7CisjZW5kaWYKKwl9CisKKwlwaWQgPSB2Zm9yaygpOworCWlmIChwaWQgPT0gLTEpIHsKKwkJYmJfcGVycm9yX21zZygidmZvcmsiKTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAocGlkICE9IDApIHsKKwkJLyogUGFyZW50ICovCisJCWNudW0rKzsKKwkJaWYgKHZlcmJvc2UpCisJCQljb25uZWN0aW9uX3N0YXR1cygpOworCQlpZiAoaGNjcCkKKwkJCWhjY3AtPnBpZCA9IHBpZDsKKwkJLyogY2xlYW4gdXAgY2hhbmdlcyBkb25lIGJ5IHZmb3JrZWQgY2hpbGQgKi8KKwkJdW5kb194c2V0ZW52KCk7CisJCWdvdG8gYWdhaW47CisJfQorCisJLyogQ2hpbGQ6IHByZXBhcmUgZW52LCBsb2csIGFuZCBleGVjIHByb2cgKi8KKworCXsgLyogdmZvcmsgYWxlcnQhIGV2ZXJ5IHhtYWxsb2MgaW4gdGhpcyBibG9jayBzaG91bGQgYmUgZnJlZWQhICovCisJCWNoYXIgKmxvY2FsX2hvc3RuYW1lID0gbG9jYWxfaG9zdG5hbWU7IC8qIGZvciBjb21waWxlciAqLworCQljaGFyICpsb2NhbF9hZGRyID0gTlVMTDsKKwkJY2hhciAqZnJlZV9tZTAgPSBOVUxMOworCQljaGFyICpmcmVlX21lMSA9IE5VTEw7CisJCWNoYXIgKmZyZWVfbWUyID0gTlVMTDsKKworCQlpZiAodmVyYm9zZSB8fCAhKG9wdHMgJiBPUFRfRSkpIHsKKwkJCWlmICghbWF4X3Blcl9ob3N0KSAvKiByZW1vdGVfYWRkciBpcyBub3QgeWV0IGtub3duICovCisJCQkJZnJlZV9tZTAgPSByZW1vdGVfYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZyZW1vdGUudS5zYSk7CisJCQlpZiAob3B0cyAmIE9QVF9oKSB7CisJCQkJZnJlZV9tZTEgPSByZW1vdGVfaG9zdG5hbWUgPSB4bWFsbG9jX3NvY2thZGRyMmhvc3Rfbm9wb3J0KCZyZW1vdGUudS5zYSk7CisJCQkJaWYgKCFyZW1vdGVfaG9zdG5hbWUpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBsb29rIHVwIGhvc3RuYW1lIGZvciAlcyIsIHJlbW90ZV9hZGRyKTsKKwkJCQkJcmVtb3RlX2hvc3RuYW1lID0gcmVtb3RlX2FkZHI7CisJCQkJfQorCQkJfQorCQkJLyogRmluZCBvdXQgbG9jYWwgSVAgcGVlciBjb25uZWN0ZWQgdG8uCisJCQkgKiBFcnJvcnMgaWdub3JlZCAoSSdtIG5vdCBwYXJhbm9pZCBlbm91Z2ggdG8gaW1hZ2luZSBrZXJuZWwKKwkJCSAqIHdoaWNoIGRvZXNuJ3Qga25vdyBsb2NhbCBJUCkuICovCisJCQlpZiAodGNwKQorCQkJCWdldHNvY2tuYW1lKDAsICZsb2NhbC51LnNhLCAmbG9jYWwubGVuKTsKKwkJCS8qIGVsc2U6IGZvciBVRFAgaXQgaXMgZG9uZSBlYXJsaWVyIGJ5IHBhcmVudCAqLworCQkJbG9jYWxfYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZsb2NhbC51LnNhKTsKKwkJCWlmIChvcHRzICYgT1BUX2gpIHsKKwkJCQlsb2NhbF9ob3N0bmFtZSA9IHByZXNldF9sb2NhbF9ob3N0bmFtZTsKKwkJCQlpZiAoIWxvY2FsX2hvc3RuYW1lKSB7CisJCQkJCWZyZWVfbWUyID0gbG9jYWxfaG9zdG5hbWUgPSB4bWFsbG9jX3NvY2thZGRyMmhvc3Rfbm9wb3J0KCZsb2NhbC51LnNhKTsKKwkJCQkJaWYgKCFsb2NhbF9ob3N0bmFtZSkKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBsb29rIHVwIGhvc3RuYW1lIGZvciAlcyIsIGxvY2FsX2FkZHIpOworCQkJCX0KKwkJCQkvKiBlbHNlOiBsb2NhbF9ob3N0bmFtZSBpcyBub3QgTlVMTCwgYnV0IGlzIE5PVCBtYWxsb2NlZCEgKi8KKwkJCX0KKwkJfQorCQlpZiAodmVyYm9zZSkgeworCQkJcGlkID0gZ2V0cGlkKCk7CisJCQlpZiAobWF4X3Blcl9ob3N0KSB7CisJCQkJYmJfZXJyb3JfbXNnKCJjb25jdXJyZW5jeSAlcyAldS8ldSIsCisJCQkJCXJlbW90ZV9hZGRyLAorCQkJCQljdXJfcGVyX2hvc3QsIG1heF9wZXJfaG9zdCk7CisJCQl9CisJCQliYl9lcnJvcl9tc2coKG9wdHMgJiBPUFRfaCkKKwkJCQk/ICJzdGFydCAldSAlcy0lcyAoJXMtJXMpIgorCQkJCTogInN0YXJ0ICV1ICVzLSVzIiwKKwkJCQlwaWQsCisJCQkJbG9jYWxfYWRkciwgcmVtb3RlX2FkZHIsCisJCQkJbG9jYWxfaG9zdG5hbWUsIHJlbW90ZV9ob3N0bmFtZSk7CisJCX0KKworCQlpZiAoIShvcHRzICYgT1BUX0UpKSB7CisJCQkvKiBzZXR1cCB1Y3NwaSBlbnYgKi8KKwkJCWNvbnN0IGNoYXIgKnByb3RvID0gdGNwID8gIlRDUCIgOiAiVURQIjsKKworI2lmZGVmIFNPX09SSUdJTkFMX0RTVAorCQkJLyogRXh0cmFjdCAib3JpZ2luYWwiIGRlc3RpbmF0aW9uIGFkZHI6cG9ydAorCQkJICogZnJvbSBMaW51eCBmaXJld2FsbC4gVXNlZnVsIHdoZW4geW91IHJlZGlyZWN0CisJCQkgKiBhbiBvdXRib25kIGNvbm5lY3Rpb24gdG8gbG9jYWwgaGFuZGxlciwgYW5kIGl0IG5lZWRzCisJCQkgKiB0byBrbm93IHdoZXJlIGl0IG9yaWdpbmFsbHkgdHJpZWQgdG8gY29ubmVjdCAqLworCQkJaWYgKHRjcCAmJiBnZXRzb2Nrb3B0KDAsIFNPTF9JUCwgU09fT1JJR0lOQUxfRFNULCAmbG9jYWwudS5zYSwgJmxvY2FsLmxlbikgPT0gMCkgeworCQkJCWNoYXIgKmFkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmbG9jYWwudS5zYSk7CisJCQkJeHNldGVudl9wbGFpbigiVENQT1JJR0RTVEFERFIiLCBhZGRyKTsKKwkJCQlmcmVlKGFkZHIpOworCQkJfQorI2VuZGlmCisJCQl4c2V0ZW52X3BsYWluKCJQUk9UTyIsIHByb3RvKTsKKwkJCXhzZXRlbnZfcHJvdG8ocHJvdG8sICJMT0NBTEFERFIiLCBsb2NhbF9hZGRyKTsKKwkJCXhzZXRlbnZfcHJvdG8ocHJvdG8sICJSRU1PVEVBRERSIiwgcmVtb3RlX2FkZHIpOworCQkJaWYgKG9wdHMgJiBPUFRfaCkgeworCQkJCXhzZXRlbnZfcHJvdG8ocHJvdG8sICJMT0NBTEhPU1QiLCBsb2NhbF9ob3N0bmFtZSk7CisJCQkJeHNldGVudl9wcm90byhwcm90bywgIlJFTU9URUhPU1QiLCByZW1vdGVfaG9zdG5hbWUpOworCQkJfQorCQkJLy9jb21wYXQ/IHhzZXRlbnZfcHJvdG8ocHJvdG8sICJSRU1PVEVJTkZPIiwgIiIpOworCQkJLyogYWRkaXRpb25hbCAqLworCQkJaWYgKGN1cl9wZXJfaG9zdCA+IDApIC8qIGNhbiBub3QgYmUgdHJ1ZSBmb3IgdWRwICovCisJCQkJeHNldGVudl9wbGFpbigiVENQQ09OQ1VSUkVOQ1kiLCB1dG9hKGN1cl9wZXJfaG9zdCkpOworCQl9CisJCWZyZWUobG9jYWxfYWRkcik7CisJCWZyZWUoZnJlZV9tZTApOworCQlmcmVlKGZyZWVfbWUxKTsKKwkJZnJlZShmcmVlX21lMik7CisJfQorCisJeGR1cDIoMCwgMSk7CisKKwlzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7IC8qIHRoaXMgb25lIHdhcyBTSUdfSUdOZWQgKi8KKwkvKiBOb24taWdub3JlZCBzaWduYWxzIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMgYW55d2F5ICovCisJLypzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7Ki8KKwlzaWdfdW5ibG9jayhTSUdDSExEKTsKKworI2lmZGVmIFNTTFNWRAorCXN0cmNweShpZCwgdXRvYShwaWQpKTsKKwlzc2xfaW8oMCwgYXJndik7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmd2WzBdKTsKKyNlbHNlCisJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKyNlbmRpZgorfQorCisvKgordGNwc3ZkIFstaHBFdnZdIFstYyBuXSBbLUMgbjptc2ddIFstYiBuXSBbLXUgdXNlcl0gWy1sIG5hbWVdCisJWy1pIGRpcnwteCBjZGJdIFsgLXQgc2VjXSBob3N0IHBvcnQgcHJvZworCit0Y3BzdmQgY3JlYXRlcyBhIFRDUC9JUCBzb2NrZXQsIGJpbmRzIGl0IHRvIHRoZSBhZGRyZXNzIGhvc3Q6cG9ydCwKK2FuZCBsaXN0ZW5zIG9uIHRoZSBzb2NrZXQgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zLgorCitPbiBlYWNoIGluY29taW5nIGNvbm5lY3Rpb24sIHRjcHN2ZCBjb25kaXRpb25hbGx5IHJ1bnMgYSBwcm9ncmFtLAord2l0aCBzdGFuZGFyZCBpbnB1dCByZWFkaW5nIGZyb20gdGhlIHNvY2tldCwgYW5kIHN0YW5kYXJkIG91dHB1dAord3JpdGluZyB0byB0aGUgc29ja2V0LCB0byBoYW5kbGUgdGhpcyBjb25uZWN0aW9uLiB0Y3BzdmQga2VlcHMKK2xpc3RlbmluZyBvbiB0aGUgc29ja2V0IGZvciBuZXcgY29ubmVjdGlvbnMsIGFuZCBjYW4gaGFuZGxlCittdWx0aXBsZSBjb25uZWN0aW9ucyBzaW11bHRhbmVvdXNseS4KKwordGNwc3ZkIG9wdGlvbmFsbHkgY2hlY2tzIGZvciBzcGVjaWFsIGluc3RydWN0aW9ucyBkZXBlbmRpbmcKK29uIHRoZSBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lIG9mIHRoZSBjbGllbnQgdGhhdCBpbml0aWF0ZWQKK3RoZSBjb25uZWN0aW9uLCBzZWUgaXBzdmQtaW5zdHJ1Y3QoNSkuCisKK2hvc3QKKyAgICBob3N0IGVpdGhlciBpcyBhIGhvc3RuYW1lLCBvciBhIGRvdHRlZC1kZWNpbWFsIElQIGFkZHJlc3MsCisgICAgb3IgMC4gSWYgaG9zdCBpcyAwLCB0Y3BzdmQgYWNjZXB0cyBjb25uZWN0aW9ucyB0byBhbnkgbG9jYWwKKyAgICBJUCBhZGRyZXNzLgorICAgICogYnVzeWJveCBhY2NlcHRzIElQdjYgYWRkcmVzc2VzIGFuZCBob3N0OnBvcnQgcGFpcnMgdG9vCisgICAgICBJbiB0aGlzIGNhc2Ugc2Vjb25kIHBhcmFtZXRlciBpcyBpZ25vcmVkCitwb3J0CisgICAgdGNwc3ZkIGFjY2VwdHMgY29ubmVjdGlvbnMgdG8gaG9zdDpwb3J0LiBwb3J0IG1heSBiZSBhIG5hbWUKKyAgICBmcm9tIC9ldGMvc2VydmljZXMgb3IgYSBudW1iZXIuCitwcm9nCisgICAgcHJvZyBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBhcmd1bWVudHMuIEZvciBlYWNoIGNvbm5lY3Rpb24sCisgICAgdGNwc3ZkIG5vcm1hbGx5IHJ1bnMgcHJvZywgd2l0aCBmaWxlIGRlc2NyaXB0b3IgMCByZWFkaW5nIGZyb20KKyAgICB0aGUgbmV0d29yaywgYW5kIGZpbGUgZGVzY3JpcHRvciAxIHdyaXRpbmcgdG8gdGhlIG5ldHdvcmsuCisgICAgQnkgZGVmYXVsdCBpdCBhbHNvIHNldHMgdXAgVENQLXJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLAorICAgIHNlZSB0Y3AtZW52aXJvbig1KQorLWkgZGlyCisgICAgcmVhZCBpbnN0cnVjdGlvbnMgZm9yIGhhbmRsaW5nIG5ldyBjb25uZWN0aW9ucyBmcm9tIHRoZSBpbnN0cnVjdGlvbnMKKyAgICBkaXJlY3RvcnkgZGlyLiBTZWUgaXBzdmQtaW5zdHJ1Y3QoNSkgZm9yIGRldGFpbHMuCisgICAgKiBpZ25vcmVkIGJ5IGJ1c3lib3hlZCB2ZXJzaW9uCisteCBjZGIKKyAgICByZWFkIGluc3RydWN0aW9ucyBmb3IgaGFuZGxpbmcgbmV3IGNvbm5lY3Rpb25zIGZyb20gdGhlIGNvbnN0YW50IGRhdGFiYXNlCisgICAgY2RiLiBUaGUgY29uc3RhbnQgZGF0YWJhc2Ugbm9ybWFsbHkgaXMgY3JlYXRlZCBmcm9tIGFuIGluc3RydWN0aW9ucworICAgIGRpcmVjdG9yeSBieSBydW5uaW5nIGlwc3ZkLWNkYig4KS4KKyAgICAqIGlnbm9yZWQgYnkgYnVzeWJveGVkIHZlcnNpb24KKy10IHNlYworICAgIHRpbWVvdXQuIFRoaXMgb3B0aW9uIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHRoZSAtaSBvcHRpb24gaXMgZ2l2ZW4uCisgICAgV2hpbGUgY2hlY2tpbmcgdGhlIGluc3RydWN0aW9ucyBkaXJlY3RvcnksIGNoZWNrIHRoZSB0aW1lIG9mIGxhc3QgYWNjZXNzCisgICAgb2YgdGhlIGZpbGUgdGhhdCBtYXRjaGVzIHRoZSBjbGllbnRzIGFkZHJlc3Mgb3IgaG9zdG5hbWUgaWYgYW55LCBkaXNjYXJkCisgICAgYW5kIHJlbW92ZSB0aGUgZmlsZSBpZiBpdCB3YXNuJ3QgYWNjZXNzZWQgd2l0aGluIHRoZSBsYXN0IHNlYyBzZWNvbmRzOworICAgIHRjcHN2ZCBkb2VzIG5vdCBkaXNjYXJkIG9yIHJlbW92ZSBhIGZpbGUgaWYgdGhlIHVzZXIncyB3cml0ZSBwZXJtaXNzaW9uCisgICAgaXMgbm90IHNldCwgZm9yIHRob3NlIGZpbGVzIHRoZSB0aW1lb3V0IGlzIGRpc2FibGVkLiBEZWZhdWx0IGlzIDAsCisgICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdGltZW91dCBpcyBkaXNhYmxlZC4KKyAgICAqIGlnbm9yZWQgYnkgYnVzeWJveGVkIHZlcnNpb24KKy1sIG5hbWUKKyAgICBsb2NhbCBob3N0bmFtZS4gRG8gbm90IGxvb2sgdXAgdGhlIGxvY2FsIGhvc3RuYW1lIGluIEROUywgYnV0IHVzZSBuYW1lCisgICAgYXMgaG9zdG5hbWUuIFRoaXMgb3B0aW9uIG11c3QgYmUgc2V0IGlmIHRjcHN2ZCBsaXN0ZW5zIG9uIHBvcnQgNTMKKyAgICB0byBhdm9pZCBsb29wcy4KKy11IHVzZXJbOmdyb3VwXQorICAgIGRyb3AgcGVybWlzc2lvbnMuIFN3aXRjaCB1c2VyIElEIHRvIHVzZXIncyBVSUQsIGFuZCBncm91cCBJRCB0byB1c2VyJ3MKKyAgICBwcmltYXJ5IEdJRCBhZnRlciBjcmVhdGluZyBhbmQgYmluZGluZyB0byB0aGUgc29ja2V0LiBJZiB1c2VyIGlzIGZvbGxvd2VkCisgICAgYnkgYSBjb2xvbiBhbmQgYSBncm91cCBuYW1lLCB0aGUgZ3JvdXAgSUQgaXMgc3dpdGNoZWQgdG8gdGhlIEdJRCBvZiBncm91cAorICAgIGluc3RlYWQuIEFsbCBzdXBwbGVtZW50YXJ5IGdyb3VwcyBhcmUgcmVtb3ZlZC4KKy1jIG4KKyAgICBjb25jdXJyZW5jeS4gSGFuZGxlIHVwIHRvIG4gY29ubmVjdGlvbnMgc2ltdWx0YW5lb3VzbHkuIERlZmF1bHQgaXMgMzAuCisgICAgSWYgdGhlcmUgYXJlIG4gY29ubmVjdGlvbnMgYWN0aXZlLCB0Y3BzdmQgZGVmZXJzIGFjY2VwdGFuY2Ugb2YgYSBuZXcKKyAgICBjb25uZWN0aW9uIHVudGlsIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKy1DIG5bOm1zZ10KKyAgICBwZXIgaG9zdCBjb25jdXJyZW5jeS4gQWxsb3cgb25seSB1cCB0byBuIGNvbm5lY3Rpb25zIGZyb20gdGhlIHNhbWUgSVAKKyAgICBhZGRyZXNzIHNpbXVsdGFuZW91c2x5LiBJZiB0aGVyZSBhcmUgbiBhY3RpdmUgY29ubmVjdGlvbnMgZnJvbSBvbmUgSVAKKyAgICBhZGRyZXNzLCBuZXcgaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGlzIElQIGFkZHJlc3MgYXJlIGNsb3NlZAorICAgIGltbWVkaWF0ZWx5LiBJZiBuIGlzIGZvbGxvd2VkIGJ5IDptc2csIHRoZSBtZXNzYWdlIG1zZyBpcyB3cml0dGVuCisgICAgdG8gdGhlIGNsaWVudCBpZiBwb3NzaWJsZSwgYmVmb3JlIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24uIEJ5IGRlZmF1bHQKKyAgICBtc2cgaXMgZW1wdHkuIFNlZSBpcHN2ZC1pbnN0cnVjdCg1KSBmb3Igc3VwcG9ydGVkIGVzY2FwZSBzZXF1ZW5jZXMgaW4gbXNnLgorCisgICAgRm9yIGVhY2ggYWNjZXB0ZWQgY29ubmVjdGlvbiwgdGhlIGN1cnJlbnQgcGVyIGhvc3QgY29uY3VycmVuY3kgaXMKKyAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgVENQQ09OQ1VSUkVOQ1kuIG4gYW5kIG1zZworICAgIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBpcHN2ZCg3KSBpbnN0cnVjdGlvbnMsIHNlZSBpcHN2ZC1pbnN0cnVjdCg1KS4KKyAgICBCeSBkZWZhdWx0IHRjcHN2ZCBkb2Vzbid0IGtlZXAgdHJhY2sgb2YgY29ubmVjdGlvbnMuCistaAorICAgIExvb2sgdXAgdGhlIGNsaWVudCdzIGhvc3RuYW1lIGluIEROUy4KKy1wCisgICAgcGFyYW5vaWQuIEFmdGVyIGxvb2tpbmcgdXAgdGhlIGNsaWVudCdzIGhvc3RuYW1lIGluIEROUywgbG9vayB1cCB0aGUgSVAKKyAgICBhZGRyZXNzZXMgaW4gRE5TIGZvciB0aGF0IGhvc3RuYW1lLCBhbmQgZm9yZ2V0IGFib3V0IHRoZSBob3N0bmFtZQorICAgIGlmIG5vbmUgb2YgdGhlIGFkZHJlc3NlcyBtYXRjaCB0aGUgY2xpZW50J3MgSVAgYWRkcmVzcy4gWW91IHNob3VsZAorICAgIHNldCB0aGlzIG9wdGlvbiBpZiB5b3UgdXNlIGhvc3RuYW1lIGJhc2VkIGluc3RydWN0aW9ucy4gVGhlIC1wIG9wdGlvbgorICAgIGltcGxpZXMgdGhlIC1oIG9wdGlvbi4KKyAgICAqIGlnbm9yZWQgYnkgYnVzeWJveGVkIHZlcnNpb24KKy1iIG4KKyAgICBiYWNrbG9nLiBBbGxvdyBhIGJhY2tsb2cgb2YgYXBwcm94aW1hdGVseSBuIFRDUCBTWU5zLiBPbiBzb21lIHN5c3RlbXMgbgorICAgIGlzIHNpbGVudGx5IGxpbWl0ZWQuIERlZmF1bHQgaXMgMjAuCistRQorICAgIG5vIHNwZWNpYWwgZW52aXJvbm1lbnQuIERvIG5vdCBzZXQgdXAgVENQLXJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorLXYKKyAgICB2ZXJib3NlLiBQcmludCB2ZXJib3NlIG1lc3NzYWdlcyB0byBzdGFuZGFyZCBvdXRwdXQuCistdnYKKyAgICBtb3JlIHZlcmJvc2UuIFByaW50IG1vcmUgdmVyYm9zZSBtZXNzYWdlcyB0byBzdGFuZGFyZCBvdXRwdXQuCisgICAgKiBubyBkaWZmZXJlbmNlIGJldHdlZW4gLXYgYW5kIC12diBpbiBidXN5Ym94ZWQgdmVyc2lvbgorKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGNwdWRwX3Blcmhvc3QuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGNwdWRwX3Blcmhvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDU0MTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90Y3B1ZHBfcGVyaG9zdC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIEJhc2VkIG9uIGlwc3ZkIHV0aWxpdGllcyB3cml0dGVuIGJ5IEdlcnJpdCBQYXBlIDxwYXBlQHNtYXJkZW4ub3JnPgorICogd2hpY2ggYXJlIHJlbGVhc2VkIGludG8gcHVibGljIGRvbWFpbiBieSB0aGUgYXV0aG9yLgorICogSG9tZXBhZ2U6IGh0dHA6Ly9zbWFyZGVuLnN1bnNpdGUuZGsvaXBzdmQvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidGNwdWRwX3Blcmhvc3QuaCIKKworc3RhdGljIHN0cnVjdCBoY2MgKmNjOworc3RhdGljIHVuc2lnbmVkIGNjbGVuOworCisvKiB0byBiZSBvcHRpbWl6ZWQgKi8KKwordm9pZCBpcHN2ZF9wZXJob3N0X2luaXQodW5zaWduZWQgYykKK3sKKy8vCWZyZWUoY2MpOworCWNjID0geHphbGxvYyhjICogc2l6ZW9mKCpjYykpOworCWNjbGVuID0gYzsKK30KKwordW5zaWduZWQgaXBzdmRfcGVyaG9zdF9hZGQoY2hhciAqaXAsIHVuc2lnbmVkIG1heGNvbm4sIHN0cnVjdCBoY2MgKipoY2NwcCkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIGNvbm4gPSAxOworCWludCBmcmVlcG9zID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2NsZW47ICsraSkgeworCQlpZiAoIWNjW2ldLmlwKSB7CisJCQlmcmVlcG9zID0gaTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoY2NbaV0uaXAsIGlwKSA9PSAwKSB7CisJCQljb25uKys7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlpZiAoZnJlZXBvcyA9PSAtMSkgcmV0dXJuIDA7CisJaWYgKGNvbm4gPD0gbWF4Y29ubikgeworCQljY1tmcmVlcG9zXS5pcCA9IGlwOworCQkqaGNjcHAgPSAmY2NbZnJlZXBvc107CisJfQorCXJldHVybiBjb25uOworfQorCit2b2lkIGlwc3ZkX3Blcmhvc3RfcmVtb3ZlKGludCBwaWQpCit7CisJdW5zaWduZWQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgY2NsZW47ICsraSkgeworCQlpZiAoY2NbaV0ucGlkID09IHBpZCkgeworCQkJZnJlZShjY1tpXS5pcCk7CisJCQljY1tpXS5pcCA9IE5VTEw7CisJCQljY1tpXS5waWQgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisvL3ZvaWQgaXBzdmRfcGVyaG9zdF9mcmVlKHZvaWQpCisvL3sKKy8vCWZyZWUoY2MpOworLy99CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3RjcHVkcF9wZXJob3N0LmggYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3RjcHVkcF9wZXJob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1NzU3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGNwdWRwX3Blcmhvc3QuaApAQCAtMCwwICsxLDMzIEBACisvKiBCYXNlZCBvbiBpcHN2ZCB1dGlsaXRpZXMgd3JpdHRlbiBieSBHZXJyaXQgUGFwZSA8cGFwZUBzbWFyZGVuLm9yZz4KKyAqIHdoaWNoIGFyZSByZWxlYXNlZCBpbnRvIHB1YmxpYyBkb21haW4gYnkgdGhlIGF1dGhvci4KKyAqIEhvbWVwYWdlOiBodHRwOi8vc21hcmRlbi5zdW5zaXRlLmRrL2lwc3ZkLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitzdHJ1Y3QgaGNjIHsKKwljaGFyICppcDsKKwlpbnQgcGlkOworfTsKKwordm9pZCBpcHN2ZF9wZXJob3N0X2luaXQodW5zaWduZWQpOworCisvKiBSZXR1cm5zIG51bWJlciBvZiBhbHJlYWR5IG9wZW5lZCBjb25uZWN0cyB0byB0aGlzIGlwcywgaW5jbHVkaW5nIHRoaXMgb25lLgorICogaXAgc2hvdWxkIGJlIGEgbWFsbG9jJ2VkIHB0ci4KKyAqIElmIHJldHVybiB2YWx1ZSBpcyA8PSBtYXhjb25uLCBpcCBpcyBpbnNlcnRlZCBpbnRvIHRoZSB0YWJsZQorICogYW5kIHBvaW50ZXIgdG8gdGFibGUgZW50cnkgaWYgc3RvcmVkIGluICpoY2NwcAorICogKHVzZWZ1bCBmb3Igc3RvcmluZyBwaWQgbGF0ZXIpLgorICogRWxzZSBpcCBpcyBOT1QgaW5zZXJ0ZWQgKHlvdSBtdXN0IHRha2UgY2FyZSBvZiBpdCAtIGZyZWUoKSBldGMpICovCit1bnNpZ25lZCBpcHN2ZF9wZXJob3N0X2FkZChjaGFyICppcCwgdW5zaWduZWQgbWF4Y29ubiwgc3RydWN0IGhjYyAqKmhjY3BwKTsKKworLyogRmluZHMgYW5kIGZyZWVzIGVsZW1lbnQgd2l0aCBwaWQgKi8KK3ZvaWQgaXBzdmRfcGVyaG9zdF9yZW1vdmUoaW50IHBpZCk7CisKKy8vdW5zaWduZWQgaXBzdmRfcGVyaG9zdF9zZXRwaWQoaW50IHBpZCk7CisvL3ZvaWQgaXBzdmRfcGVyaG9zdF9mcmVlKHZvaWQpOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90ZWxuZXQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGVsbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlNTFkYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGVsbmV0LmMKQEAgLTAsMCArMSw2NzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHRlbG5ldCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIEF1dGhvcjogVG9taSBPbGxpbGEgPHRvb0Bpa2kuZmk+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMCBieSBUb21pIE9sbGlsYQorICoKKyAqIENyZWF0ZWQ6IFRodSBBcHIgIDcgMTM6Mjk6NDEgMTk5NCB0b28KKyAqIExhc3QgbW9kaWZpZWQ6IEZyaSBKdW4gIDkgMTQ6MzQ6MjQgMjAwMCB0b28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEhJU1RPUlkKKyAqIFJldmlzaW9uIDMuMSAgMTk5NC8wNC8xNyAgMTE6MzE6NTQgIHRvbworICogaW5pdGlhbCByZXZpc2lvbgorICogTW9kaWZpZWQgMjAwMC8wNi8xMyBmb3IgaW5jbHVzaW9uIGludG8gQnVzeUJveCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBNb2RpZmllZCAyMDAxLzA1LzA3IHRvIGFkZCBhYmlsaXR5IHRvIHBhc3MgVFRZUEUgdG8gcmVtb3RlIGhvc3QgYnkgSmltIE1jUXVpbGxhbgorICogPGphbUBsdHNwLm9yZz4KKyAqIE1vZGlmaWVkIDIwMDQvMDIvMTEgdG8gYWRkIGFiaWxpdHkgdG8gcGFzcyB0aGUgVVNFUiB2YXJpYWJsZSB0byByZW1vdGUgaG9zdAorICogYnkgRmVybmFuZG8gU2lsdmVpcmEgPHN3cmhAZ214Lm5ldD4KKyAqCisgKi8KKworLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTgorLy91c2FnZTojZGVmaW5lIHRlbG5ldF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hXSBbLWwgVVNFUl0gSE9TVCBbUE9SVF0iCisvL3VzYWdlOiNkZWZpbmUgdGVsbmV0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29ubmVjdCB0byB0ZWxuZXQgc2VydmVyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hCUF1dG9tYXRpYyBsb2dpbiB3aXRoICRVU0VSIHZhcmlhYmxlIgorLy91c2FnZTogICAgICJcbgktbCBVU0VSCUF1dG9tYXRpYyBsb2dpbiBhcyBVU0VSIgorLy91c2FnZToKKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6I2RlZmluZSB0ZWxuZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkhPU1QgW1BPUlRdIgorLy91c2FnZTojZGVmaW5lIHRlbG5ldF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbm5lY3QgdG8gdGVsbmV0IHNlcnZlciIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlIDxhcnBhL3RlbG5ldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWZkZWYgX19CSU9OSUNfXworLyogc2hvdWxkIGJlIGluIGFycGEvdGVsbmV0LmggKi8KKyMgZGVmaW5lIElBQyAgICAgICAgIDI1NSAgLyogaW50ZXJwcmV0IGFzIGNvbW1hbmQ6ICovCisjIGRlZmluZSBET05UICAgICAgICAyNTQgIC8qIHlvdSBhcmUgbm90IHRvIHVzZSBvcHRpb24gKi8KKyMgZGVmaW5lIERPICAgICAgICAgIDI1MyAgLyogcGxlYXNlLCB5b3UgdXNlIG9wdGlvbiAqLworIyBkZWZpbmUgV09OVCAgICAgICAgMjUyICAvKiBJIHdvbid0IHVzZSBvcHRpb24gKi8KKyMgZGVmaW5lIFdJTEwgICAgICAgIDI1MSAgLyogSSB3aWxsIHVzZSBvcHRpb24gKi8KKyMgZGVmaW5lIFNCICAgICAgICAgIDI1MCAgLyogaW50ZXJwcmV0IGFzIHN1Ym5lZ290aWF0aW9uICovCisjIGRlZmluZSBTRSAgICAgICAgICAyNDAgIC8qIGVuZCBzdWIgbmVnb3RpYXRpb24gKi8KKyMgZGVmaW5lIFRFTE9QVF9FQ0hPICAgMSAgLyogZWNobyAqLworIyBkZWZpbmUgVEVMT1BUX1NHQSAgICAzICAvKiBzdXBwcmVzcyBnbyBhaGVhZCAqLworIyBkZWZpbmUgVEVMT1BUX1RUWVBFIDI0ICAvKiB0ZXJtaW5hbCB0eXBlICovCisjIGRlZmluZSBURUxPUFRfTkFXUyAgMzEgIC8qIHdpbmRvdyBzaXplICovCisjZW5kaWYKKworI2lmZGVmIERPVFJBQ0UKKyMgZGVmaW5lIFRSQUNFKHgsIHkpIGRvIHsgaWYgKHgpIHByaW50ZiB5OyB9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIFRSQUNFKHgsIHkpCisjZW5kaWYKKworZW51bSB7CisJREFUQUJVRlNJWkUgPSAxMjgsCisJSUFDQlVGU0laRSAgPSAxMjgsCisKKwlDSE1fVFJZID0gMCwKKwlDSE1fT04gPSAxLAorCUNITV9PRkYgPSAyLAorCisJVUZfRUNITyA9IDB4MDEsCisJVUZfU0dBID0gMHgwMiwKKworCVRTX05PUk1BTCA9IDAsCisJVFNfQ09QWSA9IDEsCisJVFNfSUFDID0gMiwKKwlUU19PUFQgPSAzLAorCVRTX1NVQjEgPSA0LAorCVRTX1NVQjIgPSA1LAorCVRTX0NSID0gNiwKK307CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlOworCitlbnVtIHsgbmV0ZmQgPSAzIH07CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQJaWFjbGVuOyAvKiBjb3VsZCBldmVuIHVzZSBieXRlLCBidXQgaXQncyBhIGxvc3Mgb24geDg2ICovCisJYnl0ZQl0ZWxzdGF0ZTsgLyogdGVsbmV0IG5lZ290aWF0aW9uIHN0YXRlIGZyb20gbmV0d29yayBpbnB1dCAqLworCWJ5dGUJdGVsd2lzaDsgIC8qIERPLCBET05ULCBXSUxMLCBXT05UICovCisJYnl0ZSAgICBjaGFybW9kZTsKKwlieXRlICAgIHRlbGZsYWdzOworCWJ5dGUJZG9fdGVybWlvczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfVFRZUEUKKwljaGFyCSp0dHlwZTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4KKwljb25zdCBjaGFyICphdXRvbG9naW47CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgKKwl1bnNpZ25lZCB3aW5fd2lkdGgsIHdpbl9oZWlnaHQ7CisjZW5kaWYKKwkvKiBzYW1lIGJ1ZmZlciB1c2VkIGJvdGggZm9yIG5ldHdvcmsgYW5kIGNvbnNvbGUgcmVhZC93cml0ZSAqLworCWNoYXIgICAgYnVmW0RBVEFCVUZTSVpFXTsKKwkvKiBidWZmZXIgdG8gaGFuZGxlIHRlbG5ldCBuZWdvdGlhdGlvbnMgKi8KKwljaGFyICAgIGlhY2J1ZltJQUNCVUZTSVpFXTsKKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zX2RlZjsKKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zX3JhdzsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCXN0cnVjdCBHX3NpemVjaGVjayB7IFwKKwkJY2hhciBHX3NpemVjaGVja1tzaXplb2YoRykgPiBDT01NT05fQlVGU0laRSA/IC0xIDogMV07IFwKKwl9OyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyB2b2lkIHJhd21vZGUodm9pZCk7CitzdGF0aWMgdm9pZCBjb29rbW9kZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGRvX2xpbmVtb2RlKHZvaWQpOworc3RhdGljIHZvaWQgd2lsbF9jaGFybW9kZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHRlbG9wdChieXRlIGMpOworc3RhdGljIHZvaWQgc3VibmVnKGJ5dGUgYyk7CisKK3N0YXRpYyB2b2lkIGlhY19mbHVzaCh2b2lkKQoreworCXdyaXRlKG5ldGZkLCBHLmlhY2J1ZiwgRy5pYWNsZW4pOworCUcuaWFjbGVuID0gMDsKK30KKworI2RlZmluZSB3cml0ZV9zdHIoZmQsIHN0cikgd3JpdGUoZmQsIHN0ciwgc2l6ZW9mKHN0cikgLSAxKQorCitzdGF0aWMgdm9pZCBkb2V4aXQoaW50IGV2KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGRvZXhpdChpbnQgZXYpCit7CisJY29va21vZGUoKTsKKwlleGl0KGV2KTsKK30KKworc3RhdGljIHZvaWQgY29uX2VzY2FwZSh2b2lkKQoreworCWNoYXIgYjsKKworCWlmIChiYl9nb3Rfc2lnbmFsKSAvKiBjYW1lIGZyb20gbGluZSBtb2RlLi4uIGdvIHJhdyAqLworCQlyYXdtb2RlKCk7CisKKwl3cml0ZV9zdHIoMSwgIlxyXG5Db25zb2xlIGVzY2FwZS4gQ29tbWFuZHMgYXJlOlxyXG5cbiIKKwkJCSIgbAlnbyB0byBsaW5lIG1vZGVcclxuIgorCQkJIiBjCWdvIHRvIGNoYXJhY3RlciBtb2RlXHJcbiIKKwkJCSIgeglzdXNwZW5kIHRlbG5ldFxyXG4iCisJCQkiIGUJZXhpdCB0ZWxuZXRcclxuIik7CisKKwlpZiAocmVhZChTVERJTl9GSUxFTk8sICZiLCAxKSA8PSAwKQorCQlkb2V4aXQoRVhJVF9GQUlMVVJFKTsKKworCXN3aXRjaCAoYikgeworCWNhc2UgJ2wnOgorCQlpZiAoIWJiX2dvdF9zaWduYWwpIHsKKwkJCWRvX2xpbmVtb2RlKCk7CisJCQlnb3RvIHJldDsKKwkJfQorCQlicmVhazsKKwljYXNlICdjJzoKKwkJaWYgKGJiX2dvdF9zaWduYWwpIHsKKwkJCXdpbGxfY2hhcm1vZGUoKTsKKwkJCWdvdG8gcmV0OworCQl9CisJCWJyZWFrOworCWNhc2UgJ3onOgorCQljb29rbW9kZSgpOworCQlraWxsKDAsIFNJR1RTVFApOworCQlyYXdtb2RlKCk7CisJCWJyZWFrOworCWNhc2UgJ2UnOgorCQlkb2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisKKwl3cml0ZV9zdHIoMSwgImNvbnRpbnVpbmcuLi5cclxuIik7CisKKwlpZiAoYmJfZ290X3NpZ25hbCkKKwkJY29va21vZGUoKTsKKyByZXQ6CisJYmJfZ290X3NpZ25hbCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9uZXRfb3V0cHV0KGludCBsZW4pCit7CisJLyogaGVyZSB3ZSBjb3VsZCBkbyBzbWFydCB0cmlja3MgaG93IHRvIGhhbmRsZSAweEZGOnMgaW4gb3V0cHV0CisJICogc3RyZWFtIGxpa2Ugd3JpdGluZyB0d2ljZSBldmVyeSBzZXF1ZW5jZSBvZiBGRjpzICh0aHVzIGRvaW5nCisJICogbWFueSB3cml0ZSgpcy4gQnV0IEkgdGhpbmsgaW50ZXJhY3RpdmUgdGVsbmV0IGFwcGxpY2F0aW9uIGRvZXMKKwkgKiBub3QgbmVlZCB0byBiZSAxMDAlIDgtYml0IGNsZWFuLCBzbyBjaGFuZ2luZyBldmVyeSAweGZmOnMgdG8KKwkgKiAweDdmOnMKKwkgKgorCSAqIDIwMDItbWFyLTIxLCBQcnplbXlzbGF3IEN6ZXJwYWsgKGRydXp1c0Bwb2xib3guY29tKQorCSAqIEkgZG9uJ3QgYWdyZWUuCisJICogZmlyc3QgLSBJIGNhbm5vdCB1c2UgcHJvZ3JhbXMgbGlrZSBzei9yegorCSAqIHNlY29uZCAtIHRoZSAweDBEIGlzIHNlbnQgYXMgb25lIGNoYXJhY3RlciBhbmQgaWYgdGhlIG5leHQKKwkgKgljaGFyIGlzIDB4MEEgdGhlbiBpdCdzIGVhdGVuIGJ5IGEgc2VydmVyIHNpZGUuCisJICogdGhpcmQgLSB3aHkgZG8geW91IGhhdmUgdG8gbWFrZSAnbWFueSB3cml0ZSgpcyc/CisJICoJSSBkb24ndCB1bmRlcnN0YW5kLgorCSAqIFNvIEkgaW1wbGVtZW50ZWQgaXQuIEl0J3MgcmVhbGx5IHVzZWZ1bCBmb3IgbWUuIEkgaG9wZSB0aGF0CisJICogb3RoZXIgcGVvcGxlIHdpbGwgZmluZCBpdCBpbnRlcmVzdGluZyB0b28uCisJICovCisJYnl0ZSBvdXRidWZbMiAqIERBVEFCVUZTSVpFXTsKKwlieXRlICpwID0gKGJ5dGUqKUcuYnVmOworCWludCBqID0gMDsKKworCWZvciAoOyBsZW4gPiAwOyBsZW4tLSwgcCsrKSB7CisJCWJ5dGUgYyA9ICpwOworCQlpZiAoYyA9PSAweDFkKSB7CisJCQljb25fZXNjYXBlKCk7CisJCQlyZXR1cm47CisJCX0KKwkJb3V0YnVmW2orK10gPSBjOworCQlpZiAoYyA9PSBJQUMpCisJCQlvdXRidWZbaisrXSA9IGM7IC8qIElBQyAtPiBJQUMgSUFDICovCisJCWVsc2UgaWYgKGMgPT0gJ1xyJykKKwkJCW91dGJ1ZltqKytdID0gJ1wwJzsgLyogQ1IgLT4gQ1IgTlVMICovCisJfQorCWlmIChqID4gMCkKKwkJZnVsbF93cml0ZShuZXRmZCwgb3V0YnVmLCBqKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX25ldF9pbnB1dChpbnQgbGVuKQoreworCWludCBpOworCWludCBjc3RhcnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWJ5dGUgYyA9IEcuYnVmW2ldOworCisJCWlmIChHLnRlbHN0YXRlID09IFRTX05PUk1BTCkgeyAvKiBtb3N0IHR5cGljYWwgc3RhdGUgKi8KKwkJCWlmIChjID09IElBQykgeworCQkJCWNzdGFydCA9IGk7CisJCQkJRy50ZWxzdGF0ZSA9IFRTX0lBQzsKKwkJCX0KKwkJCWVsc2UgaWYgKGMgPT0gJ1xyJykgeworCQkJCWNzdGFydCA9IGkgKyAxOworCQkJCUcudGVsc3RhdGUgPSBUU19DUjsKKwkJCX0KKwkJCS8qIE5vIElBQ3Mgd2VyZSBzZWVuIHNvIGZhciwgbm8gbmVlZCB0byBjb3B5CisJCQkgKiBieXRlcyB3aXRoaW4gRy5idWY6ICovCisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoRy50ZWxzdGF0ZSkgeworCQljYXNlIFRTX0NSOgorCQkJLyogUHJldiBjaGFyIHdhcyBDUi4gSWYgY3VyIG9uZSBpcyBOVUwsIGlnbm9yZSBpdC4KKwkJCSAqIFNlZSBSRkMgMTEyMyBzZWN0aW9uIDMuMy4xIGZvciBkaXNjdXNzaW9uIG9mIHRlbG5ldCBFT0wgaGFuZGxpbmcuCisJCQkgKi8KKwkJCUcudGVsc3RhdGUgPSBUU19DT1BZOworCQkJaWYgKGMgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCS8qIGVsc2U6IGZhbGwgdGhyb3VnaCAtIG5lZWQgdG8gaGFuZGxlIENSIElBQyAuLi4gcHJvcGVybHkgKi8KKworCQljYXNlIFRTX0NPUFk6IC8qIFByZXYgY2hhciB3YXMgb3JkaW5hcnkgKi8KKwkJCS8qIFNpbWlsYXIgdG8gTk9STUFMLCBidXQgaW4gVFNfQ09QWSB3ZSBuZWVkIHRvIGNvcHkgYnl0ZXMgKi8KKwkJCWlmIChjID09IElBQykKKwkJCQlHLnRlbHN0YXRlID0gVFNfSUFDOworCQkJZWxzZQorCQkJCUcuYnVmW2NzdGFydCsrXSA9IGM7CisJCQlpZiAoYyA9PSAnXHInKQorCQkJCUcudGVsc3RhdGUgPSBUU19DUjsKKwkJCWJyZWFrOworCisJCWNhc2UgVFNfSUFDOiAvKiBQcmV2IGNoYXIgd2FzIElBQyAqLworCQkJaWYgKGMgPT0gSUFDKSB7IC8qIElBQyBJQUMgLT4gb25lIElBQyAqLworCQkJCUcuYnVmW2NzdGFydCsrXSA9IGM7CisJCQkJRy50ZWxzdGF0ZSA9IFRTX0NPUFk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBlbHNlICovCisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgU0I6CisJCQkJRy50ZWxzdGF0ZSA9IFRTX1NVQjE7CisJCQkJYnJlYWs7CisJCQljYXNlIERPOgorCQkJY2FzZSBET05UOgorCQkJY2FzZSBXSUxMOgorCQkJY2FzZSBXT05UOgorCQkJCUcudGVsd2lzaCA9IGM7CisJCQkJRy50ZWxzdGF0ZSA9IFRTX09QVDsKKwkJCQlicmVhazsKKwkJCS8qIERBVEEgTUFSSyBtdXN0IGJlIGFkZGVkIGxhdGVyICovCisJCQlkZWZhdWx0OgorCQkJCUcudGVsc3RhdGUgPSBUU19DT1BZOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBUU19PUFQ6IC8qIFByZXYgY2hhcnMgd2VyZSBJQUMgV0lMTC9XT05UL0RPL0RPTlQgKi8KKwkJCXRlbG9wdChjKTsKKwkJCUcudGVsc3RhdGUgPSBUU19DT1BZOworCQkJYnJlYWs7CisKKwkJY2FzZSBUU19TVUIxOiAvKiBTdWJuZWdvdGlhdGlvbiAqLworCQljYXNlIFRTX1NVQjI6IC8qIFN1Ym5lZ290aWF0aW9uICovCisJCQlzdWJuZWcoYyk7IC8qIGNhbiBjaGFuZ2UgRy50ZWxzdGF0ZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoRy50ZWxzdGF0ZSAhPSBUU19OT1JNQUwpIHsKKwkJLyogV2UgaGFkIHNvbWUgSUFDcywgb3IgQ1IgKi8KKwkJaWYgKEcuaWFjbGVuKQorCQkJaWFjX2ZsdXNoKCk7CisJCWlmIChHLnRlbHN0YXRlID09IFRTX0NPUFkpIC8qIHdlIGFyZW4ndCBpbiB0aGUgbWlkZGxlIG9mIElBQyAqLworCQkJRy50ZWxzdGF0ZSA9IFRTX05PUk1BTDsKKwkJbGVuID0gY3N0YXJ0OworCX0KKworCWlmIChsZW4pCisJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgRy5idWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9pYWMoaW50IGMpCit7CisJRy5pYWNidWZbRy5pYWNsZW4rK10gPSBjOworfQorCitzdGF0aWMgdm9pZCBwdXRfaWFjMihieXRlIHd3ZGQsIGJ5dGUgYykKK3sKKwlpZiAoRy5pYWNsZW4gKyAzID4gSUFDQlVGU0laRSkKKwkJaWFjX2ZsdXNoKCk7CisKKwlwdXRfaWFjKElBQyk7CisJcHV0X2lhYyh3d2RkKTsKKwlwdXRfaWFjKGMpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX1RUWVBFCitzdGF0aWMgdm9pZCBwdXRfaWFjX3N1Ym9wdChieXRlIGMsIGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cikgKyA2OyAgIC8vICggMiArIDEgKyAxICsgc3RybGVuICsgMiApCisKKwlpZiAoRy5pYWNsZW4gKyBsZW4gPiBJQUNCVUZTSVpFKQorCQlpYWNfZmx1c2goKTsKKworCXB1dF9pYWMoSUFDKTsKKwlwdXRfaWFjKFNCKTsKKwlwdXRfaWFjKGMpOworCXB1dF9pYWMoMCk7CisKKwl3aGlsZSAoKnN0cikKKwkJcHV0X2lhYygqc3RyKyspOworCisJcHV0X2lhYyhJQUMpOworCXB1dF9pYWMoU0UpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCitzdGF0aWMgdm9pZCBwdXRfaWFjX3N1Ym9wdF9hdXRvbG9naW4odm9pZCkKK3sKKwlpbnQgbGVuID0gc3RybGVuKEcuYXV0b2xvZ2luKSArIDY7CS8vICgyICsgMSArIDEgKyBzdHJsZW4gKyAyKQorCWNvbnN0IGNoYXIgKnAgPSAiVVNFUiI7CisKKwlpZiAoRy5pYWNsZW4gKyBsZW4gPiBJQUNCVUZTSVpFKQorCQlpYWNfZmx1c2goKTsKKworCXB1dF9pYWMoSUFDKTsKKwlwdXRfaWFjKFNCKTsKKwlwdXRfaWFjKFRFTE9QVF9ORVdfRU5WSVJPTik7CisJcHV0X2lhYyhURUxRVUFMX0lTKTsKKwlwdXRfaWFjKE5FV19FTlZfVkFSKTsKKworCXdoaWxlICgqcCkKKwkJcHV0X2lhYygqcCsrKTsKKworCXB1dF9pYWMoTkVXX0VOVl9WQUxVRSk7CisKKwlwID0gRy5hdXRvbG9naW47CisJd2hpbGUgKCpwKQorCQlwdXRfaWFjKCpwKyspOworCisJcHV0X2lhYyhJQUMpOworCXB1dF9pYWMoU0UpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgKK3N0YXRpYyB2b2lkIHB1dF9pYWNfbmF3cyhieXRlIGMsIGludCB4LCBpbnQgeSkKK3sKKwlpZiAoRy5pYWNsZW4gKyA5ID4gSUFDQlVGU0laRSkKKwkJaWFjX2ZsdXNoKCk7CisKKwlwdXRfaWFjKElBQyk7CisJcHV0X2lhYyhTQik7CisJcHV0X2lhYyhjKTsKKworCXB1dF9pYWMoKHggPj4gOCkgJiAweGZmKTsKKwlwdXRfaWFjKHggJiAweGZmKTsKKwlwdXRfaWFjKCh5ID4+IDgpICYgMHhmZik7CisJcHV0X2lhYyh5ICYgMHhmZik7CisKKwlwdXRfaWFjKElBQyk7CisJcHV0X2lhYyhTRSk7Cit9CisjZW5kaWYKKworc3RhdGljIGNoYXIgY29uc3QgZXNjYXBlY2hhcmlzW10gQUxJR04xID0gIlxyXG5Fc2NhcGUgY2hhcmFjdGVyIGlzICI7CisKK3N0YXRpYyB2b2lkIHNldENvbk1vZGUodm9pZCkKK3sKKwlpZiAoRy50ZWxmbGFncyAmIFVGX0VDSE8pIHsKKwkJaWYgKEcuY2hhcm1vZGUgPT0gQ0hNX1RSWSkgeworCQkJRy5jaGFybW9kZSA9IENITV9PTjsKKwkJCXByaW50ZigiXHJcbkVudGVyaW5nIGNoYXJhY3RlciBtb2RlJXMnXl0nLlxyXG4iLCBlc2NhcGVjaGFyaXMpOworCQkJcmF3bW9kZSgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKEcuY2hhcm1vZGUgIT0gQ0hNX09GRikgeworCQkJRy5jaGFybW9kZSA9IENITV9PRkY7CisJCQlwcmludGYoIlxyXG5FbnRlcmluZyBsaW5lIG1vZGUlcydeQycuXHJcbiIsIGVzY2FwZWNoYXJpcyk7CisJCQljb29rbW9kZSgpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB3aWxsX2NoYXJtb2RlKHZvaWQpCit7CisJRy5jaGFybW9kZSA9IENITV9UUlk7CisJRy50ZWxmbGFncyB8PSAoVUZfRUNITyB8IFVGX1NHQSk7CisJc2V0Q29uTW9kZSgpOworCisJcHV0X2lhYzIoRE8sIFRFTE9QVF9FQ0hPKTsKKwlwdXRfaWFjMihETywgVEVMT1BUX1NHQSk7CisJaWFjX2ZsdXNoKCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2xpbmVtb2RlKHZvaWQpCit7CisJRy5jaGFybW9kZSA9IENITV9UUlk7CisJRy50ZWxmbGFncyAmPSB+KFVGX0VDSE8gfCBVRl9TR0EpOworCXNldENvbk1vZGUoKTsKKworCXB1dF9pYWMyKERPTlQsIFRFTE9QVF9FQ0hPKTsKKwlwdXRfaWFjMihET05ULCBURUxPUFRfU0dBKTsKKwlpYWNfZmx1c2goKTsKK30KKworc3RhdGljIHZvaWQgdG9fbm90c3VwKGNoYXIgYykKK3sKKwlpZiAoRy50ZWx3aXNoID09IFdJTEwpCisJCXB1dF9pYWMyKERPTlQsIGMpOworCWVsc2UgaWYgKEcudGVsd2lzaCA9PSBETykKKwkJcHV0X2lhYzIoV09OVCwgYyk7Cit9CisKK3N0YXRpYyB2b2lkIHRvX2VjaG8odm9pZCkKK3sKKwkvKiBpZiBzZXJ2ZXIgcmVxdWVzdHMgRUNITywgZG9uJ3QgYWdyZWUgKi8KKwlpZiAoRy50ZWx3aXNoID09IERPKSB7CisJCXB1dF9pYWMyKFdPTlQsIFRFTE9QVF9FQ0hPKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoRy50ZWx3aXNoID09IERPTlQpCisJCXJldHVybjsKKworCWlmIChHLnRlbGZsYWdzICYgVUZfRUNITykgeworCQlpZiAoRy50ZWx3aXNoID09IFdJTEwpCisJCQlyZXR1cm47CisJfSBlbHNlIGlmIChHLnRlbHdpc2ggPT0gV09OVCkKKwkJcmV0dXJuOworCisJaWYgKEcuY2hhcm1vZGUgIT0gQ0hNX09GRikKKwkJRy50ZWxmbGFncyBePSBVRl9FQ0hPOworCisJaWYgKEcudGVsZmxhZ3MgJiBVRl9FQ0hPKQorCQlwdXRfaWFjMihETywgVEVMT1BUX0VDSE8pOworCWVsc2UKKwkJcHV0X2lhYzIoRE9OVCwgVEVMT1BUX0VDSE8pOworCisJc2V0Q29uTW9kZSgpOworCWZ1bGxfd3JpdGUxX3N0cigiXHJcbiIpOyAgLyogc3VkZGVuIG1vZGVjICovCit9CisKK3N0YXRpYyB2b2lkIHRvX3NnYSh2b2lkKQoreworCS8qIGRhZW1vbiBhbHdheXMgc2VuZHMgd2lsbC93b250LCBjbGllbnQgZG8vZG9udCAqLworCisJaWYgKEcudGVsZmxhZ3MgJiBVRl9TR0EpIHsKKwkJaWYgKEcudGVsd2lzaCA9PSBXSUxMKQorCQkJcmV0dXJuOworCX0gZWxzZSBpZiAoRy50ZWx3aXNoID09IFdPTlQpCisJCXJldHVybjsKKworCUcudGVsZmxhZ3MgXj0gVUZfU0dBOyAvKiB0b2dnbGUgKi8KKwlpZiAoRy50ZWxmbGFncyAmIFVGX1NHQSkKKwkJcHV0X2lhYzIoRE8sIFRFTE9QVF9TR0EpOworCWVsc2UKKwkJcHV0X2lhYzIoRE9OVCwgVEVMT1BUX1NHQSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfVFRZUEUKK3N0YXRpYyB2b2lkIHRvX3R0eXBlKHZvaWQpCit7CisJLyogVGVsbCBzZXJ2ZXIgd2Ugd2lsbCAob3Igd29uJ3QpIGRvIFRUWVBFICovCisJaWYgKEcudHR5cGUpCisJCXB1dF9pYWMyKFdJTEwsIFRFTE9QVF9UVFlQRSk7CisJZWxzZQorCQlwdXRfaWFjMihXT05ULCBURUxPUFRfVFRZUEUpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCitzdGF0aWMgdm9pZCB0b19uZXdfZW52aXJvbih2b2lkKQoreworCS8qIFRlbGwgc2VydmVyIHdlIHdpbGwgKG9yIHdpbGwgbm90KSBkbyBBVVRPTE9HSU4gKi8KKwlpZiAoRy5hdXRvbG9naW4pCisJCXB1dF9pYWMyKFdJTEwsIFRFTE9QVF9ORVdfRU5WSVJPTik7CisJZWxzZQorCQlwdXRfaWFjMihXT05ULCBURUxPUFRfTkVXX0VOVklST04pOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgKK3N0YXRpYyB2b2lkIHRvX25hd3Modm9pZCkKK3sKKwkvKiBUZWxsIHNlcnZlciB3ZSB3aWxsIGRvIE5BV1MgKi8KKwlwdXRfaWFjMihXSUxMLCBURUxPUFRfTkFXUyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdGVsb3B0KGJ5dGUgYykKK3sKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIFRFTE9QVF9FQ0hPOgorCQl0b19lY2hvKCk7IGJyZWFrOworCWNhc2UgVEVMT1BUX1NHQToKKwkJdG9fc2dhKCk7IGJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9UVFlQRQorCWNhc2UgVEVMT1BUX1RUWVBFOgorCQl0b190dHlwZSgpOyBicmVhazsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4KKwljYXNlIFRFTE9QVF9ORVdfRU5WSVJPTjoKKwkJdG9fbmV3X2Vudmlyb24oKTsgYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgKKwljYXNlIFRFTE9QVF9OQVdTOgorCQl0b19uYXdzKCk7CisJCXB1dF9pYWNfbmF3cyhjLCBHLndpbl93aWR0aCwgRy53aW5faGVpZ2h0KTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQl0b19ub3RzdXAoYyk7CisJCWJyZWFrOworCX0KK30KKworLyogc3VibmVnb3RpYXRpb24gLS0gaWdub3JlIGFsbCAoZXhjZXB0IFRUWVBFLE5BV1MpICovCitzdGF0aWMgdm9pZCBzdWJuZWcoYnl0ZSBjKQoreworCXN3aXRjaCAoRy50ZWxzdGF0ZSkgeworCWNhc2UgVFNfU1VCMToKKwkJaWYgKGMgPT0gSUFDKQorCQkJRy50ZWxzdGF0ZSA9IFRTX1NVQjI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX1RUWVBFCisJCWVsc2UKKwkJaWYgKGMgPT0gVEVMT1BUX1RUWVBFICYmIEcudHR5cGUpCisJCQlwdXRfaWFjX3N1Ym9wdChURUxPUFRfVFRZUEUsIEcudHR5cGUpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTgorCQllbHNlCisJCWlmIChjID09IFRFTE9QVF9ORVdfRU5WSVJPTiAmJiBHLmF1dG9sb2dpbikKKwkJCXB1dF9pYWNfc3Vib3B0X2F1dG9sb2dpbigpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgVFNfU1VCMjoKKwkJaWYgKGMgPT0gU0UpIHsKKwkJCUcudGVsc3RhdGUgPSBUU19DT1BZOworCQkJcmV0dXJuOworCQl9CisJCUcudGVsc3RhdGUgPSBUU19TVUIxOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJhd21vZGUodm9pZCkKK3sKKwlpZiAoRy5kb190ZXJtaW9zKQorCQl0Y3NldGF0dHIoMCwgVENTQURSQUlOLCAmRy50ZXJtaW9zX3Jhdyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvb2ttb2RlKHZvaWQpCit7CisJaWYgKEcuZG9fdGVybWlvcykKKwkJdGNzZXRhdHRyKDAsIFRDU0FEUkFJTiwgJkcudGVybWlvc19kZWYpOworfQorCitpbnQgdGVsbmV0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0ZWxuZXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmhvc3Q7CisJaW50IHBvcnQ7CisJaW50IGxlbjsKKwlzdHJ1Y3QgcG9sbGZkIHVmZHNbMl07CisKKwlJTklUX0coKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSAorCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoMCwgJkcud2luX3dpZHRoLCAmRy53aW5faGVpZ2h0KTsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX1RUWVBFCisJRy50dHlwZSA9IGdldGVudigiVEVSTSIpOworI2VuZGlmCisKKwlpZiAodGNnZXRhdHRyKDAsICZHLnRlcm1pb3NfZGVmKSA+PSAwKSB7CisJCUcuZG9fdGVybWlvcyA9IDE7CisJCUcudGVybWlvc19yYXcgPSBHLnRlcm1pb3NfZGVmOworCQljZm1ha2VyYXcoJkcudGVybWlvc19yYXcpOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4KKwlpZiAoMSAmIGdldG9wdDMyKGFyZ3YsICJhbDoiLCAmRy5hdXRvbG9naW4pKQorCQlHLmF1dG9sb2dpbiA9IGdldGVudigiVVNFUiIpOworCWFyZ3YgKz0gb3B0aW5kOworI2Vsc2UKKwlhcmd2Kys7CisjZW5kaWYKKwlpZiAoISphcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisJaG9zdCA9ICphcmd2Kys7CisJcG9ydCA9IGJiX2xvb2t1cF9wb3J0KCphcmd2ID8gKmFyZ3YrKyA6ICJ0ZWxuZXQiLCAidGNwIiwgMjMpOworCWlmICgqYXJndikgLyogZXh0cmEgcGFyYW1zPz8gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCisJeG1vdmVfZmQoY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoaG9zdCwgcG9ydCksIG5ldGZkKTsKKworCXNldHNvY2tvcHQobmV0ZmQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKworCXNpZ25hbChTSUdJTlQsIHJlY29yZF9zaWdubyk7CisKKwl1ZmRzWzBdLmZkID0gU1RESU5fRklMRU5POworCXVmZHNbMF0uZXZlbnRzID0gUE9MTElOOworCXVmZHNbMV0uZmQgPSBuZXRmZDsKKwl1ZmRzWzFdLmV2ZW50cyA9IFBPTExJTjsKKworCXdoaWxlICgxKSB7CisJCWlmIChwb2xsKHVmZHMsIDIsIC0xKSA8IDApIHsKKwkJCS8qIGVycm9yLCBpZ25vcmUgYW5kL29yIGxvZyBzb21ldGhpbmcsIGJheSBnbyB0byBsb29wICovCisJCQlpZiAoYmJfZ290X3NpZ25hbCkKKwkJCQljb25fZXNjYXBlKCk7CisJCQllbHNlCisJCQkJc2xlZXAoMSk7CisJCQljb250aW51ZTsKKwkJfQorCisvLyBGSVhNRTogcmVhZHMgY2FuIGJsb2NrLiBOZWVkIGZ1bGwgYmlkaXJlY3Rpb25hbCBidWZmZXJpbmcuCisKKwkJaWYgKHVmZHNbMF0ucmV2ZW50cykgeworCQkJbGVuID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgRy5idWYsIERBVEFCVUZTSVpFKTsKKwkJCWlmIChsZW4gPD0gMCkKKwkJCQlkb2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkJCVRSQUNFKDAsICgiUmVhZCBjb246ICVkXG4iLCBsZW4pKTsKKwkJCWhhbmRsZV9uZXRfb3V0cHV0KGxlbik7CisJCX0KKworCQlpZiAodWZkc1sxXS5yZXZlbnRzKSB7CisJCQlsZW4gPSBzYWZlX3JlYWQobmV0ZmQsIEcuYnVmLCBEQVRBQlVGU0laRSk7CisJCQlpZiAobGVuIDw9IDApIHsKKwkJCQlmdWxsX3dyaXRlMV9zdHIoIkNvbm5lY3Rpb24gY2xvc2VkIGJ5IGZvcmVpZ24gaG9zdFxyXG4iKTsKKwkJCQlkb2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCX0KKwkJCVRSQUNFKDAsICgiUmVhZCBuZXRmZCAoJWQpOiAlZFxuIiwgbmV0ZmQsIGxlbikpOworCQkJaGFuZGxlX25ldF9pbnB1dChsZW4pOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGVsbmV0ZC5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90ZWxuZXRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwMjBmMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGVsbmV0ZC5jCkBAIC0wLDAgKzEsNzQ3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTaW1wbGUgdGVsbmV0IHNlcnZlcgorICogQmpvcm4gV2VzZW4sIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIgKGJqb3Jud0BheGlzLmNvbSkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogKEMpIENvcHlyaWdodCAyMDAwLCBBeGlzIENvbW11bmljYXRpb25zIEFCLCBMVU5ELCBTV0VERU4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIHRlbG5ldGQgbWFucGFnZSBzYXlzIGl0IGFsbDoKKyAqCisgKiBUZWxuZXRkIG9wZXJhdGVzIGJ5IGFsbG9jYXRpbmcgYSBwc2V1ZG8tdGVybWluYWwgZGV2aWNlIChzZWUgcHR5KDQpKSBmb3IKKyAqIGEgY2xpZW50LCB0aGVuIGNyZWF0aW5nIGEgbG9naW4gcHJvY2VzcyB3aGljaCBoYXMgdGhlIHNsYXZlIHNpZGUgb2YgdGhlCisgKiBwc2V1ZG8tdGVybWluYWwgYXMgc3RkaW4sIHN0ZG91dCwgYW5kIHN0ZGVyci4gVGVsbmV0ZCBtYW5pcHVsYXRlcyB0aGUKKyAqIG1hc3RlciBzaWRlIG9mIHRoZSBwc2V1ZG8tdGVybWluYWwsIGltcGxlbWVudGluZyB0aGUgdGVsbmV0IHByb3RvY29sIGFuZAorICogcGFzc2luZyBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHJlbW90ZSBjbGllbnQgYW5kIHRoZSBsb2dpbiBwcm9jZXNzLgorICoKKyAqIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gMjAwMQorICogU2V0IHByb2Nlc3MgZ3JvdXAgY29ycmVjdGlvbnMsIGluaXRpYWwgYnVzeWJveCBwb3J0CisgKi8KKworLy91c2FnZTojZGVmaW5lIHRlbG5ldGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSIKKy8vdXNhZ2U6I2RlZmluZSB0ZWxuZXRkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiSGFuZGxlIGluY29taW5nIHRlbG5ldCBjb25uZWN0aW9ucyIKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSgiIHZpYSBpbmV0ZCIpICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTE9HSU4JRXhlYyBMT0dJTiBvbiBjb25uZWN0IgorLy91c2FnZTogICAgICJcbgktZiBJU1NVRV9GSUxFCURpc3BsYXkgSVNTVUVfRklMRSBpbnN0ZWFkIG9mIC9ldGMvaXNzdWUiCisvL3VzYWdlOiAgICAgIlxuCS1LCQlDbG9zZSBjb25uZWN0aW9uIGFzIHNvb24gYXMgbG9naW4gZXhpdHMiCisvL3VzYWdlOiAgICAgIlxuCQkJKG5vcm1hbGx5IHdhaXQgdW50aWwgYWxsIHByb2dyYW1zIGNsb3NlIHNsYXZlIHB0eSkiCisvL3VzYWdlOglJRl9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSgKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUE9SVAkJUG9ydCB0byBsaXN0ZW4gb24iCisvL3VzYWdlOiAgICAgIlxuCS1iIEFERFJbOlBPUlRdCUFkZHJlc3MgdG8gYmluZCB0byIKKy8vdXNhZ2U6ICAgICAiXG4JLUYJCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktaQkJSW5ldGQgbW9kZSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUKAorLy91c2FnZTogICAgICJcbgktdyBTRUMJCUluZXRkICd3YWl0JyBtb2RlLCBsaW5nZXIgdGltZSBTRUMiCisvL3VzYWdlOiAgICAgIlxuCS1TCQlMb2cgdG8gc3lzbG9nIChpbXBsaWVkIGJ5IC1pIG9yIHdpdGhvdXQgLUYgYW5kIC13KSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CSkKKworI2RlZmluZSBERUJVRyAwCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjaWYgREVCVUcKKyMgZGVmaW5lIFRFTENNRFMKKyMgZGVmaW5lIFRFTE9QVFMKKyNlbmRpZgorI2luY2x1ZGUgPGFycGEvdGVsbmV0Lmg+CisKKworc3RydWN0IHRzZXNzaW9uIHsKKwlzdHJ1Y3QgdHNlc3Npb24gKm5leHQ7CisJcGlkX3Qgc2hlbGxfcGlkOworCWludCBzb2NrZmRfcmVhZDsKKwlpbnQgc29ja2ZkX3dyaXRlOworCWludCBwdHlmZDsKKworCS8qIHR3byBjaXJjdWxhciBidWZmZXJzICovCisJLypjaGFyICpidWYxLCAqYnVmMjsqLworLyojZGVmaW5lIFRTX0JVRjEodHMpIHRzLT5idWYxKi8KKy8qI2RlZmluZSBUU19CVUYyKHRzKSBUU19CVUYyKHRzKSovCisjZGVmaW5lIFRTX0JVRjEodHMpICgodW5zaWduZWQgY2hhciopKHRzICsgMSkpCisjZGVmaW5lIFRTX0JVRjIodHMpICgoKHVuc2lnbmVkIGNoYXIqKSh0cyArIDEpKSArIEJVRlNJWkUpCisJaW50IHJkaWR4MSwgd3JpZHgxLCBzaXplMTsKKwlpbnQgcmRpZHgyLCB3cmlkeDIsIHNpemUyOworfTsKKworLyogVHdvIGJ1ZmZlcnMgYXJlIGRpcmVjdGx5IGFmdGVyIHRzZXNzaW9uIGluIG1hbGxvY2VkIG1lbW9yeS4KKyAqIE1ha2Ugd2hvbGUgdGhpbmcgZml0IGluIDRrICovCitlbnVtIHsgQlVGU0laRSA9ICg0ICogMTAyNCAtIHNpemVvZihzdHJ1Y3QgdHNlc3Npb24pKSAvIDIgfTsKKworCisvKiBHbG9iYWxzICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IHRzZXNzaW9uICpzZXNzaW9uczsKKwljb25zdCBjaGFyICpsb2dpbnBhdGg7CisJY29uc3QgY2hhciAqaXNzdWVmaWxlOworCWludCBtYXhmZDsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUcubG9naW5wYXRoID0gIi9iaW4vbG9naW4iOyBcCisJRy5pc3N1ZWZpbGUgPSAiL2V0Yy9pc3N1ZS5uZXQiOyBcCit9IHdoaWxlICgwKQorCisKKy8qCisgICBSZW1vdmUgYWxsIElBQydzIGZyb20gYnVmMSAocmVjZWl2ZWQgSUFDcyBhcmUgaWdub3JlZCBhbmQgbXVzdCBiZSByZW1vdmVkCisgICBzbyBhcyB0byBub3QgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIHRlcm1pbmFsKS4gIE1ha2UgYW4gdW5pbnRlcnJ1cHRlZAorICAgc3RyaW5nIG9mIGNoYXJhY3RlcnMgZml0IGZvciB0aGUgdGVybWluYWwuICBEbyB0aGlzIGJ5IHBhY2tpbmcKKyAgIGFsbCBjaGFyYWN0ZXJzIG1lYW50IGZvciB0aGUgdGVybWluYWwgc2VxdWVudGlhbGx5IHRvd2FyZHMgdGhlIGVuZCBvZiBidWYuCisKKyAgIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVycyBtZWFudCBmb3IgdGhlIHRlcm1pbmFsCisgICBhbmQgbWFrZSAqbnVtX3RvdHR5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZSBzZW50IHRvCisgICB0aGUgdGVybWluYWwuCisKKyAgIE5vdGUgLSBpZiBhbiBJQUMgKDMgYnl0ZSBxdWFudGl0eSkgc3RhcnRzIGJlZm9yZSAoYmYgKyBsZW4pIGJ1dCBleHRlbmRzCisgICBwYXN0IChiZiArIGxlbikgdGhlbiB0aGF0IElBQyB3aWxsIGJlIGxlZnQgdW5wcm9jZXNzZWQgYW5kICpwcm9jZXNzZWQKKyAgIHdpbGwgYmUgbGVzcyB0aGFuIGxlbi4KKworICAgQ1ItTEYgLT4ncyBDUiBtYXBwaW5nIGlzIGFsc28gZG9uZSBoZXJlLCBmb3IgY29udmVuaWVuY2UuCisKKyAgIE5COiBtYXkgZmFpbCB0byByZW1vdmUgaWFjcyB3aGljaCB3cmFwIGFyb3VuZCBidWZmZXIhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK3JlbW92ZV9pYWNzKHN0cnVjdCB0c2Vzc2lvbiAqdHMsIGludCAqcG51bV90b3R0eSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIwID0gVFNfQlVGMSh0cykgKyB0cy0+d3JpZHgxOworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IHB0cjA7CisJdW5zaWduZWQgY2hhciAqdG90dHkgPSBwdHI7CisJdW5zaWduZWQgY2hhciAqZW5kID0gcHRyICsgTUlOKEJVRlNJWkUgLSB0cy0+d3JpZHgxLCB0cy0+c2l6ZTEpOworCWludCBudW1fdG90dHk7CisKKwl3aGlsZSAocHRyIDwgZW5kKSB7CisJCWlmICgqcHRyICE9IElBQykgeworCQkJY2hhciBjID0gKnB0cjsKKworCQkJKnRvdHR5KysgPSBjOworCQkJcHRyKys7CisJCQkvKiBXZSBtYXAgXHJcbiA9PT4gXHIgZm9yIHByYWdtYXRpYyByZWFzb25zLgorCQkJICogTWFueSBjbGllbnQgaW1wbGVtZW50YXRpb25zIHNlbmQgXHJcbiB3aGVuCisJCQkgKiB0aGUgdXNlciBoaXRzIHRoZSBDYXJyaWFnZVJldHVybiBrZXkuCisJCQkgKi8KKwkJCWlmIChjID09ICdccicgJiYgcHRyIDwgZW5kICYmICgqcHRyID09ICdcbicgfHwgKnB0ciA9PSAnXDAnKSkKKwkJCQlwdHIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwdHIrMSkgPj0gZW5kKQorCQkJYnJlYWs7CisJCWlmIChwdHJbMV0gPT0gTk9QKSB7IC8qIElnbm9yZT8gKHB1dHR5IGtlZXBhbGl2ZSwgZXRjLikgKi8KKwkJCXB0ciArPSAyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHB0clsxXSA9PSBJQUMpIHsgLyogTGl0ZXJhbCBJQUM/IChlbWFjcyBNLURFTCkgKi8KKwkJCSp0b3R0eSsrID0gcHRyWzFdOworCQkJcHRyICs9IDI7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRFTE9QVF9OQVdTIHN1cHBvcnQhCisJCSAqLworCQlpZiAoKHB0cisyKSA+PSBlbmQpIHsKKwkJCS8qIE9ubHkgdGhlIGJlZ2lubmluZyBvZiB0aGUgSUFDIGlzIGluIHRoZQorCQkJYnVmZmVyIHdlIHdlcmUgYXNrZWQgdG8gcHJvY2Vzcywgd2UgY2FuJ3QKKwkJCXByb2Nlc3MgdGhpcyBjaGFyICovCisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBJQUMgLT4gU0IgLT4gVEVMT1BUX05BV1MgLT4gNC1ieXRlIC0+IElBQyAtPiBTRQorCQkgKi8KKwkJaWYgKHB0clsxXSA9PSBTQiAmJiBwdHJbMl0gPT0gVEVMT1BUX05BV1MpIHsKKwkJCXN0cnVjdCB3aW5zaXplIHdzOworCQkJaWYgKChwdHIrOCkgPj0gZW5kKQorCQkJCWJyZWFrOyAgLyogaW5jb21wbGV0ZSwgY2FuJ3QgcHJvY2VzcyAqLworCQkJd3Mud3NfY29sID0gKHB0clszXSA8PCA4KSB8IHB0cls0XTsKKwkJCXdzLndzX3JvdyA9IChwdHJbNV0gPDwgOCkgfCBwdHJbNl07CisJCQlpb2N0bCh0cy0+cHR5ZmQsIFRJT0NTV0lOU1osIChjaGFyICopJndzKTsKKwkJCXB0ciArPSA5OworCQkJY29udGludWU7CisJCX0KKwkJLyogc2tpcCAzLWJ5dGUgSUFDIG5vbi1TQiBjbWQgKi8KKyNpZiBERUJVRworCQlmcHJpbnRmKHN0ZGVyciwgIklnbm9yaW5nIElBQyAlcywlc1xuIiwKKwkJCQlURUxDTUQocHRyWzFdKSwgVEVMT1BUKHB0clsyXSkpOworI2VuZGlmCisJCXB0ciArPSAzOworCX0KKworCW51bV90b3R0eSA9IHRvdHR5IC0gcHRyMDsKKwkqcG51bV90b3R0eSA9IG51bV90b3R0eTsKKwkvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHB0ciBhbmQgdG90dHkgaXMgbnVtYmVyIG9mIGlhY3MKKwkgICB3ZSByZW1vdmVkIGZyb20gdGhlIHN0cmVhbS4gQWRqdXN0IGJ1ZjEgYWNjb3JkaW5nbHkgKi8KKwlpZiAoKHB0ciAtIHRvdHR5KSA9PSAwKSAvKiA5OS45OTklIG9mIGNhc2VzICovCisJCXJldHVybiBwdHIwOworCXRzLT53cmlkeDEgKz0gcHRyIC0gdG90dHk7CisJdHMtPnNpemUxIC09IHB0ciAtIHRvdHR5OworCS8qIE1vdmUgY2hhcnMgbWVhbnQgZm9yIHRoZSB0ZXJtaW5hbCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworCXJldHVybiBtZW1tb3ZlKHB0ciAtIG51bV90b3R0eSwgcHRyMCwgbnVtX3RvdHR5KTsKK30KKworLyoKKyAqIENvbnZlcnRpbmcgc2luZ2xlIElBQyBpbnRvIGRvdWJsZSBvbiBvdXRwdXQKKyAqLworc3RhdGljIHNpemVfdCBpYWNfc2FmZV93cml0ZShpbnQgZmQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNvbnN0IGNoYXIgKklBQ3B0cjsKKwlzaXplX3Qgd3IsIHJjLCB0b3RhbDsKKworCXRvdGFsID0gMDsKKwl3aGlsZSAoMSkgeworCQlpZiAoY291bnQgPT0gMCkKKwkJCXJldHVybiB0b3RhbDsKKwkJaWYgKCpidWYgPT0gKGNoYXIpSUFDKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBJQUNJQUNbXSBBTElHTjEgPSB7IElBQywgSUFDIH07CisJCQlyYyA9IHNhZmVfd3JpdGUoZmQsIElBQ0lBQywgMik7CisJCQlpZiAocmMgIT0gMikKKwkJCQlicmVhazsKKwkJCWJ1ZisrOworCQkJdG90YWwrKzsKKwkJCWNvdW50LS07CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBjb3VudCAhPSAwLCAqYnVmICE9IElBQyAqLworCQlJQUNwdHIgPSBtZW1jaHIoYnVmLCBJQUMsIGNvdW50KTsKKwkJd3IgPSBjb3VudDsKKwkJaWYgKElBQ3B0cikKKwkJCXdyID0gSUFDcHRyIC0gYnVmOworCQlyYyA9IHNhZmVfd3JpdGUoZmQsIGJ1Ziwgd3IpOworCQlpZiAocmMgIT0gd3IpCisJCQlicmVhazsKKwkJYnVmICs9IHJjOworCQl0b3RhbCArPSByYzsKKwkJY291bnQgLT0gcmM7CisJfQorCS8qIGhlcmU6IHJjIC0gcmVzdWx0IG9mIGxhc3Qgc2hvcnQgd3JpdGUgKi8KKwlpZiAoKHNzaXplX3QpcmMgPCAwKSB7IC8qIGVycm9yPyAqLworCQlpZiAodG90YWwgPT0gMCkKKwkJCXJldHVybiByYzsKKwkJcmMgPSAwOworCX0KKwlyZXR1cm4gdG90YWwgKyByYzsKK30KKworLyogTXVzdCBtYXRjaCBnZXRvcHQzMiBzdHJpbmcgKi8KK2VudW0geworCU9QVF9XQVRDSENISUxEID0gKDEgPDwgMiksIC8qIC1LICovCisJT1BUX0lORVREICAgICAgPSAoMSA8PCAzKSAqIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSwgLyogLWkgKi8KKwlPUFRfUE9SVCAgICAgICA9ICgxIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FLCAvKiAtcCBQT1JUICovCisJT1BUX0ZPUkVHUk9VTkQgPSAoMSA8PCA2KSAqIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSwgLyogLUYgKi8KKwlPUFRfU1lTTE9HICAgICA9ICgxIDw8IDcpICogRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlULCAvKiAtUyAqLworCU9QVF9XQUlUICAgICAgID0gKDEgPDwgOCkgKiBFTkFCTEVfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQsIC8qIC13IFNFQyAqLworfTsKKworc3RhdGljIHN0cnVjdCB0c2Vzc2lvbiAqCittYWtlX25ld19zZXNzaW9uKAorCQlJRl9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORShpbnQgc29jaykKKwkJSUZfTk9UX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FKHZvaWQpCispIHsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJZW51bSB7IHNvY2sgPSAwIH07CisjZW5kaWYKKwljb25zdCBjaGFyICpsb2dpbl9hcmd2WzJdOworCXN0cnVjdCB0ZXJtaW9zIHRlcm1idWY7CisJaW50IGZkLCBwaWQ7CisJY2hhciB0dHlfbmFtZVtHRVRQVFlfQlVGU0laRV07CisJc3RydWN0IHRzZXNzaW9uICp0cyA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0c2Vzc2lvbikgKyBCVUZTSVpFICogMik7CisKKwkvKnRzLT5idWYxID0gKGNoYXIgKikodHMgKyAxKTsqLworCS8qdHMtPmJ1ZjIgPSB0cy0+YnVmMSArIEJVRlNJWkU7Ki8KKworCS8qIEdvdCBhIG5ldyBjb25uZWN0aW9uLCBzZXQgdXAgYSB0dHkgKi8KKwlmZCA9IHhnZXRwdHkodHR5X25hbWUpOworCWlmIChmZCA+IEcubWF4ZmQpCisJCUcubWF4ZmQgPSBmZDsKKwl0cy0+cHR5ZmQgPSBmZDsKKwluZGVsYXlfb24oZmQpOworCWNsb3NlX29uX2V4ZWNfb24oZmQpOworCisJLyogU09fS0VFUEFMSVZFIGJ5IHBvcHVsYXIgZGVtYW5kICovCisJc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJdHMtPnNvY2tmZF9yZWFkID0gc29jazsKKwluZGVsYXlfb24oc29jayk7CisJaWYgKHNvY2sgPT0gMCkgeyAvKiBXZSBhcmUgY2FsbGVkIHdpdGggZmQgMCAtIHdlIGFyZSBpbiBpbmV0ZCBtb2RlICovCisJCXNvY2srKzsgLyogc28gdXNlIGZkIDEgZm9yIG91dHB1dCAqLworCQluZGVsYXlfb24oc29jayk7CisJfQorCXRzLT5zb2NrZmRfd3JpdGUgPSBzb2NrOworCWlmIChzb2NrID4gRy5tYXhmZCkKKwkJRy5tYXhmZCA9IHNvY2s7CisjZWxzZQorCS8qIHRzLT5zb2NrZmRfcmVhZCA9IDA7IC0gZG9uZSBieSB4emFsbG9jICovCisJdHMtPnNvY2tmZF93cml0ZSA9IDE7CisJbmRlbGF5X29uKDApOworCW5kZWxheV9vbigxKTsKKyNlbmRpZgorCisJLyogTWFrZSB0aGUgdGVsbmV0IGNsaWVudCB1bmRlcnN0YW5kIHdlIHdpbGwgZWNobyBjaGFyYWN0ZXJzIHNvIGl0CisJICogc2hvdWxkIG5vdCBkbyBpdCBsb2NhbGx5LiBXZSBkb24ndCB0ZWxsIHRoZSBjbGllbnQgdG8gcnVuIGxpbmVtb2RlLAorCSAqIGJlY2F1c2Ugd2Ugd2FudCB0byBoYW5kbGUgbGluZSBlZGl0aW5nIGFuZCB0YWIgY29tcGxldGlvbiBhbmQgb3RoZXIKKwkgKiBzdHVmZiB0aGF0IHJlcXVpcmVzIGNoYXItYnktY2hhciBzdXBwb3J0LiAqLworCXsKKwkJc3RhdGljIGNvbnN0IGNoYXIgaWFjc190b19zZW5kW10gQUxJR04xID0geworCQkJSUFDLCBETywgVEVMT1BUX0VDSE8sCisJCQlJQUMsIERPLCBURUxPUFRfTkFXUywKKwkJCS8qIFRoaXMgcmVxdWlyZXMgdGVsbmV0ZC5jdHJsU1EucGF0Y2ggKGluY29tcGxldGUpICovCisJCQkvKklBQywgRE8sIFRFTE9QVF9MRkxPVywqLworCQkJSUFDLCBXSUxMLCBURUxPUFRfRUNITywKKwkJCUlBQywgV0lMTCwgVEVMT1BUX1NHQQorCQl9OworCQkvKiBUaGlzIGNvbmZ1c2VzIGlhY19zYWZlX3dyaXRlKCksIGl0IHdpbGwgdHJ5IHRvIGR1cGxpY2F0ZQorCQkgKiBlYWNoIElBQy4uLiAqLworCQkvL21lbWNweShUU19CVUYyKHRzKSwgaWFjc190b19zZW5kLCBzaXplb2YoaWFjc190b19zZW5kKSk7CisJCS8vdHMtPnJkaWR4MiA9IHNpemVvZihpYWNzX3RvX3NlbmQpOworCQkvL3RzLT5zaXplMiA9IHNpemVvZihpYWNzX3RvX3NlbmQpOworCQkvKiBTbyBqdXN0IHN0dWZmIGl0IGludG8gVENQIHN0cmVhbSEgKG5vIGVycm9yIGNoZWNrLi4uKSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCQlzYWZlX3dyaXRlKHNvY2ssIGlhY3NfdG9fc2VuZCwgc2l6ZW9mKGlhY3NfdG9fc2VuZCkpOworI2Vsc2UKKwkJc2FmZV93cml0ZSgxLCBpYWNzX3RvX3NlbmQsIHNpemVvZihpYWNzX3RvX3NlbmQpKTsKKyNlbmRpZgorCQkvKnRzLT5yZGlkeDIgPSAwOyAtIHh6YWxsb2MgZGlkIGl0ICovCisJCS8qdHMtPnNpemUyID0gMDsqLworCX0KKworCWZmbHVzaF9hbGwoKTsKKwlwaWQgPSB2Zm9yaygpOyAvKiBOT01NVS1mcmllbmRseSAqLworCWlmIChwaWQgPCAwKSB7CisJCWZyZWUodHMpOworCQljbG9zZShmZCk7CisJCS8qIHNvY2sgd2lsbCBiZSBjbG9zZWQgYnkgY2FsbGVyICovCisJCWJiX3BlcnJvcl9tc2coInZmb3JrIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAocGlkID4gMCkgeworCQkvKiBQYXJlbnQgKi8KKwkJdHMtPnNoZWxsX3BpZCA9IHBpZDsKKwkJcmV0dXJuIHRzOworCX0KKworCS8qIENoaWxkICovCisJLyogQ2FyZWZ1bCAtIHdlIGFyZSBhZnRlciB2Zm9yayEgKi8KKworCS8qIFJlc3RvcmUgZGVmYXVsdCBzaWduYWwgaGFuZGxpbmcgQVNBUCAqLworCWJiX3NpZ25hbHMoKDEgPDwgU0lHQ0hMRCkgKyAoMSA8PCBTSUdQSVBFKSwgU0lHX0RGTCk7CisKKwlwaWQgPSBnZXRwaWQoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9VVE1QKSB7CisJCWxlbl9hbmRfc29ja2FkZHIgKmxzYSA9IGdldF9wZWVyX2xzYShzb2NrKTsKKwkJY2hhciAqaG9zdG5hbWUgPSBOVUxMOworCQlpZiAobHNhKSB7CisJCQlob3N0bmFtZSA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZsc2EtPnUuc2EpOworCQkJZnJlZShsc2EpOworCQl9CisJCXdyaXRlX25ld191dG1wKHBpZCwgTE9HSU5fUFJPQ0VTUywgdHR5X25hbWUsIC8qdXNlcm5hbWU6Ki8gIkxPR0lOIiwgaG9zdG5hbWUpOworCQlmcmVlKGhvc3RuYW1lKTsKKwl9CisKKwkvKiBNYWtlIG5ldyBzZXNzaW9uIGFuZCBwcm9jZXNzIGdyb3VwICovCisJc2V0c2lkKCk7CisKKwkvKiBPcGVuIHRoZSBjaGlsZCdzIHNpZGUgb2YgdGhlIHR0eSAqLworCS8qIE5COiBzZXRzaWQoKSBkaXNjb25uZWN0cyBmcm9tIGFueSBwcmV2aW91cyBjdHR5J3MuIFRoZXJlZm9yZQorCSAqIHdlIG11c3Qgb3BlbiBjaGlsZCdzIHNpZGUgb2YgdGhlIHR0eSBBRlRFUiBzZXRzaWQhICovCisJY2xvc2UoMCk7CisJeG9wZW4odHR5X25hbWUsIE9fUkRXUik7IC8qIGJlY29tZXMgb3VyIGN0dHkgKi8KKwl4ZHVwMigwLCAxKTsKKwl4ZHVwMigwLCAyKTsKKwl0Y3NldHBncnAoMCwgcGlkKTsgLyogc3dpdGNoIHRoaXMgdHR5J3MgcHJvY2VzcyBncm91cCB0byB1cyAqLworCisJLyogVGhlIHBzZXVkby10ZXJtaW5hbCBhbGxvY2F0ZWQgdG8gdGhlIGNsaWVudCBpcyBjb25maWd1cmVkIHRvIG9wZXJhdGUKKwkgKiBpbiBjb29rZWQgbW9kZSwgYW5kIHdpdGggWFRBQlMgQ1JNT0QgZW5hYmxlZCAoc2VlIHR0eSg0KSkgKi8KKwl0Y2dldGF0dHIoMCwgJnRlcm1idWYpOworCXRlcm1idWYuY19sZmxhZyB8PSBFQ0hPOyAvKiBpZiB3ZSB1c2UgcmVhZGxpbmUgd2UgZG9udCB3YW50IHRoaXMgKi8KKwl0ZXJtYnVmLmNfb2ZsYWcgfD0gT05MQ1IgfCBYVEFCUzsKKwl0ZXJtYnVmLmNfaWZsYWcgfD0gSUNSTkw7CisJdGVybWJ1Zi5jX2lmbGFnICY9IH5JWE9GRjsKKwkvKnRlcm1idWYuY19sZmxhZyAmPSB+SUNBTk9OOyovCisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnRlcm1idWYpOworCisJLyogVXNlcyBGSUxFLWJhc2VkIEkvTyB0byBzdGRvdXQsIGJ1dCBkb2VzIGZmbHVzaF9hbGwoKSwKKwkgKiBzbyBzaG91bGQgYmUgc2FmZSB3aXRoIHZmb3JrLgorCSAqIEkgZmVhciwgdGhvdWdoLCB0aGF0IHNvbWUgdXNlcnMgd2lsbCBoYXZlIHJpZGljdWxvdXNseSBiaWcKKwkgKiBpc3N1ZSBmaWxlcywgYW5kIHRoZXkgbWF5IGJsb2NrIHdyaXRpbmcgdG8gZmQgMSwKKwkgKiAocGFyZW50IGlzIHN1cHBvc2VkIHRvIHJlYWQgaXQsIGJ1dCBwYXJlbnQgd2FpdHMKKwkgKiBmb3IgdmZvcmtlZCBjaGlsZCB0byBleGVjISkgKi8KKwlwcmludF9sb2dpbl9pc3N1ZShHLmlzc3VlZmlsZSwgdHR5X25hbWUpOworCisJLyogRXhlYyBzaGVsbCAvIGxvZ2luIC8gd2hhdGV2ZXIgKi8KKwlsb2dpbl9hcmd2WzBdID0gRy5sb2dpbnBhdGg7CisJbG9naW5fYXJndlsxXSA9IE5VTEw7CisJLyogZXhlYyBidXN5Ym94IGFwcGxldCAoaWYgUFJFRkVSX0FQUExFVFM9eSksIGlmIHRoYXQgZmFpbHMsCisJICogZXhlYyBleHRlcm5hbCBwcm9ncmFtLgorCSAqIE5COiBzb2NrIGlzIGVpdGhlciAwIG9yIGhhcyBDTE9FWEVDIHNldCBvbiBpdC4KKwkgKiBmZCBoYXMgQ0xPRVhFQyBzZXQgb24gaXQgdG9vLiBUaGVzZSB0d28gZmRzIHdpbGwgYmUgY2xvc2VkIGhlcmUuCisJICovCisJQkJfRVhFQ1ZQKEcubG9naW5wYXRoLCAoY2hhciAqKilsb2dpbl9hcmd2KTsKKwkvKiBfZXhpdCBpcyBzYWZlciB3aXRoIHZmb3JrLCBhbmQgd2Ugc2hvdWxkbid0IHNlbmQgbWVzc2FnZQorCSAqIHRvIHJlbW90ZSBjbGllbnRzIGFueXdheSAqLworCV9leGl0KEVYSVRfRkFJTFVSRSk7IC8qYmJfcGVycm9yX21zZ19hbmRfZGllKCJleGVjdiAlcyIsIEcubG9naW5wYXRoKTsqLworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisKK3N0YXRpYyB2b2lkCitmcmVlX3Nlc3Npb24oc3RydWN0IHRzZXNzaW9uICp0cykKK3sKKwlzdHJ1Y3QgdHNlc3Npb24gKnQ7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9JTkVURCkKKwkJZXhpdChFWElUX1NVQ0NFU1MpOworCisJLyogVW5saW5rIHRoaXMgdGVsbmV0IHNlc3Npb24gZnJvbSB0aGUgc2Vzc2lvbiBsaXN0ICovCisJdCA9IEcuc2Vzc2lvbnM7CisJaWYgKHQgPT0gdHMpCisJCUcuc2Vzc2lvbnMgPSB0cy0+bmV4dDsKKwllbHNlIHsKKwkJd2hpbGUgKHQtPm5leHQgIT0gdHMpCisJCQl0ID0gdC0+bmV4dDsKKwkJdC0+bmV4dCA9IHRzLT5uZXh0OworCX0KKworI2lmIDAKKwkvKiBJdCB3YXMgc2FpZCB0aGF0ICJub3JtYWwiIHRlbG5ldGQganVzdCBjbG9zZXMgcHR5ZmQsCisJICogZG9lc24ndCBzZW5kIFNJR0tJTEwuIFdoZW4gd2UgY2xvc2UgcHR5ZmQsCisJICoga2VybmVsIHNlbmRzIFNJR0hVUCB0byBwcm9jZXNzZXMgaGF2aW5nIHNsYXZlIHNpZGUgb3BlbmVkLiAqLworCWtpbGwodHMtPnNoZWxsX3BpZCwgU0lHS0lMTCk7CisJd2FpdHBpZCh0cy0+c2hlbGxfcGlkLCBOVUxMLCAwKTsKKyNlbmRpZgorCWNsb3NlKHRzLT5wdHlmZCk7CisJY2xvc2UodHMtPnNvY2tmZF9yZWFkKTsKKwkvKiBXZSBkbyBub3QgbmVlZCB0byBjbG9zZSh0cy0+c29ja2ZkX3dyaXRlKSwgaXQncyB0aGUgc2FtZQorCSAqIGFzIHNvY2tmZF9yZWFkIHVubGVzcyB3ZSBhcmUgaW4gaW5ldGQgbW9kZS4gQnV0IGluIGluZXRkIG1vZGUKKwkgKiB3ZSBkbyBub3QgcmVhY2ggdGhpcyAqLworCWZyZWUodHMpOworCisJLyogU2NhbiBhbGwgc2Vzc2lvbnMgYW5kIGZpbmQgbmV3IG1heGZkICovCisJRy5tYXhmZCA9IDA7CisJdHMgPSBHLnNlc3Npb25zOworCXdoaWxlICh0cykgeworCQlpZiAoRy5tYXhmZCA8IHRzLT5wdHlmZCkKKwkJCUcubWF4ZmQgPSB0cy0+cHR5ZmQ7CisJCWlmIChHLm1heGZkIDwgdHMtPnNvY2tmZF9yZWFkKQorCQkJRy5tYXhmZCA9IHRzLT5zb2NrZmRfcmVhZDsKKyNpZiAwCisJCS8qIEFnYWluLCBzb2NrZmRfd3JpdGUgPT0gc29ja2ZkX3JlYWQgaGVyZSAqLworCQlpZiAoRy5tYXhmZCA8IHRzLT5zb2NrZmRfd3JpdGUpCisJCQlHLm1heGZkID0gdHMtPnNvY2tmZF93cml0ZTsKKyNlbmRpZgorCQl0cyA9IHRzLT5uZXh0OworCX0KK30KKworI2Vsc2UgLyogIUZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FICovCisKKy8qIFVzZWQgaW4gbWFpbigpIG9ubHksIHRodXMgInJldHVybiAwIiBhY3R1YWxseSBpcyBleGl0KEVYSVRfU1VDQ0VTUykuICovCisjZGVmaW5lIGZyZWVfc2Vzc2lvbih0cykgcmV0dXJuIDAKKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGhhbmRsZV9zaWdjaGxkKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXBpZF90IHBpZDsKKwlzdHJ1Y3QgdHNlc3Npb24gKnRzOworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisKKwkvKiBMb29waW5nOiBtb3JlIHRoYW4gb25lIGNoaWxkIG1heSBoYXZlIGV4aXRlZCAqLworCXdoaWxlICgxKSB7CisJCXBpZCA9IHdhaXRfYW55X25vaGFuZyhOVUxMKTsKKwkJaWYgKHBpZCA8PSAwKQorCQkJYnJlYWs7CisJCXRzID0gRy5zZXNzaW9uczsKKwkJd2hpbGUgKHRzKSB7CisJCQlpZiAodHMtPnNoZWxsX3BpZCA9PSBwaWQpIHsKKwkJCQl0cy0+c2hlbGxfcGlkID0gLTE7CisvLyBtYW4gdXRtcDoKKy8vIFdoZW4gaW5pdCg4KSBmaW5kcyB0aGF0IGEgcHJvY2VzcyBoYXMgZXhpdGVkLCBpdCBsb2NhdGVzIGl0cyB1dG1wIGVudHJ5CisvLyBieSB1dF9waWQsIHNldHMgdXRfdHlwZSB0byBERUFEX1BST0NFU1MsIGFuZCBjbGVhcnMgdXRfdXNlciwgdXRfaG9zdAorLy8gYW5kIHV0X3RpbWUgd2l0aCBudWxsIGJ5dGVzLgorLy8gW3NhbWUgYXBwbGllcyB0byBvdGhlciBwcm9jZXNzZXMgd2hpY2ggbWFpbnRhaW4gdXRtcCBlbnRyaWVzLCBsaWtlIHRlbG5ldGRdCisvLworLy8gV2UgZG8gbm90IGJvdGhlciBhY3R1YWxseSBjbGVhcmluZyBmaWVsZHM6CisvLyBpdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byBrbm93IHdobyB3YXMgbG9nZ2VkIGluIGFuZCBmcm9tIHdoZXJlCisJCQkJdXBkYXRlX3V0bXAocGlkLCBERUFEX1BST0NFU1MsIC8qdHR5X25hbWU6Ki8gTlVMTCwgLyp1c2VybmFtZToqLyBOVUxMLCAvKmhvc3RuYW1lOiovIE5VTEwpOworCQkJCWJyZWFrOworCQkJfQorCQkJdHMgPSB0cy0+bmV4dDsKKwkJfQorCX0KKworCWVycm5vID0gc2F2ZV9lcnJubzsKK30KKworaW50IHRlbG5ldGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRlbG5ldGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWZkX3NldCByZGZkc2V0LCB3cmZkc2V0OworCXVuc2lnbmVkIG9wdDsKKwlpbnQgY291bnQ7CisJc3RydWN0IHRzZXNzaW9uICp0czsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKyNkZWZpbmUgSVNfSU5FVEQgKG9wdCAmIE9QVF9JTkVURCkKKwlpbnQgbWFzdGVyX2ZkID0gbWFzdGVyX2ZkOyAvKiBmb3IgY29tcGlsZXIgKi8KKwlpbnQgc2VjX2xpbmdlciA9IHNlY19saW5nZXI7CisJY2hhciAqb3B0X2JpbmRhZGRyID0gTlVMTDsKKwljaGFyICpvcHRfcG9ydG5icjsKKyNlbHNlCisJZW51bSB7CisJCUlTX0lORVREID0gMSwKKwkJbWFzdGVyX2ZkID0gLTEsCisJfTsKKyNlbmRpZgorCUlOSVRfRygpOworCisJLyogLXcgTlVNLCBhbmQgaW1wbGllcyAtRi4gLXcgYW5kIC1pIGRvbid0IG1peCAqLworCUlGX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUKG9wdF9jb21wbGVtZW50YXJ5ID0gIndGOncrOmktLXc6dy0taSI7KQorCS8qIEV2ZW4gaWYgIVNUQU5EQUxPTkUsIHdlIGFjY2VwdCAoYW5kIGlnbm9yZSkgLWksIHRodXMgcGVvcGxlCisJICogZG9uJ3QgbmVlZCB0byBndWVzcyB3aGV0aGVyIGl0J3Mgb2sgdG8gcGFzcyAtaSB0byB1cyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmOmw6S2kiCisJCQlJRl9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSgicDpiOkYiKQorCQkJSUZfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQoIlN3OiIpLAorCQkJJkcuaXNzdWVmaWxlLCAmRy5sb2dpbnBhdGgKKwkJCUlGX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FKCwgJm9wdF9wb3J0bmJyLCAmb3B0X2JpbmRhZGRyKQorCQkJSUZfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQoLCAmc2VjX2xpbmdlcikKKwkpOworCWlmICghSVNfSU5FVEQgLyomJiAhcmVfZXhlY2VkKi8pIHsKKwkJLyogaW5mb3JtIHRoYXQgd2Ugc3RhcnQgaW4gc3RhbmRhbG9uZSBtb2RlPworCQkgKiBNYXkgYmUgdXNlZnVsIHdoZW4gcGVvcGxlIGZvcmdldCB0byBnaXZlIC1pICovCisJCS8qYmJfZXJyb3JfbXNnKCJsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zIik7Ki8KKwkJaWYgKCEob3B0ICYgT1BUX0ZPUkVHUk9VTkQpKSB7CisJCQkvKiBEQUVNT05fQ0hESVJfUk9PVCB3YXMgZ2l2aW5nIGluY29uc2lzdGVudAorCQkJICogYmVoYXZpb3Igd2l0aC93aXRob3V0IC1GLCAtaSAqLworCQkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAgLyp3YXMgREFFTU9OX0NIRElSX1JPT1QqLywgYXJndik7CisJCX0KKwl9CisJLyogUmVkaXJlY3QgbG9nIHRvIHN5c2xvZyBlYXJseSwgaWYgbmVlZGVkICovCisJaWYgKElTX0lORVREIHx8IChvcHQgJiBPUFRfU1lTTE9HKSB8fCAhKG9wdCAmIE9QVF9GT1JFR1JPVU5EKSkgeworCQlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKwlpZiAoSVNfSU5FVEQpIHsKKwkJRy5zZXNzaW9ucyA9IG1ha2VfbmV3X3Nlc3Npb24oMCk7CisJCWlmICghRy5zZXNzaW9ucykgLyogcHR5IG9wZW5pbmcgb3IgdmZvcmsgcHJvYmxlbSwgZXhpdCAqLworCQkJcmV0dXJuIDE7IC8qIG1ha2VfbmV3X3Nlc3Npb24gcHJpbnRlZCBlcnJvciBtZXNzYWdlICovCisJfSBlbHNlIHsKKwkJbWFzdGVyX2ZkID0gMDsKKwkJaWYgKCEob3B0ICYgT1BUX1dBSVQpKSB7CisJCQl1bnNpZ25lZCBwb3J0bmJyID0gMjM7CisJCQlpZiAob3B0ICYgT1BUX1BPUlQpCisJCQkJcG9ydG5iciA9IHhhdG91MTYob3B0X3BvcnRuYnIpOworCQkJbWFzdGVyX2ZkID0gY3JlYXRlX2FuZF9iaW5kX3N0cmVhbV9vcl9kaWUob3B0X2JpbmRhZGRyLCBwb3J0bmJyKTsKKwkJCXhsaXN0ZW4obWFzdGVyX2ZkLCAxKTsKKwkJfQorCQljbG9zZV9vbl9leGVjX29uKG1hc3Rlcl9mZCk7CisJfQorI2Vsc2UKKwlHLnNlc3Npb25zID0gbWFrZV9uZXdfc2Vzc2lvbigpOworCWlmICghRy5zZXNzaW9ucykgLyogcHR5IG9wZW5pbmcgb3IgdmZvcmsgcHJvYmxlbSwgZXhpdCAqLworCQlyZXR1cm4gMTsgLyogbWFrZV9uZXdfc2Vzc2lvbiBwcmludGVkIGVycm9yIG1lc3NhZ2UgKi8KKyNlbmRpZgorCisJLyogV2UgZG9uJ3Qgd2FudCB0byBkaWUgaWYganVzdCBvbmUgc2Vzc2lvbiBpcyBicm9rZW4gKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwlpZiAob3B0ICYgT1BUX1dBVENIQ0hJTEQpCisJCXNpZ25hbChTSUdDSExELCBoYW5kbGVfc2lnY2hsZCk7CisJZWxzZSAvKiBwcmV2ZW50IGRlYWQgY2hpbGRyZW4gZnJvbSBiZWNvbWluZyB6b21iaWVzICovCisJCXNpZ25hbChTSUdDSExELCBTSUdfSUdOKTsKKworLyoKKyAgIFRoaXMgaXMgaG93IHRoZSBidWZmZXJzIGFyZSB1c2VkLiBUaGUgYXJyb3dzIGluZGljYXRlIGRhdGEgZmxvdy4KKworICAgKy0tLS0tLS0rICAgICB3cmlkeDErKyAgICAgKy0tLS0tLSsgICAgIHJkaWR4MSsrICAgICArLS0tLS0tLS0tLSsKKyAgIHwgICAgICAgfCA8LS0tLS0tLS0tLS0tLS0gIHwgYnVmMSB8IDwtLS0tLS0tLS0tLS0tLSAgfCAgICAgICAgICB8CisgICB8ICAgICAgIHwgICAgIHNpemUxLS0gICAgICArLS0tLS0tKyAgICAgc2l6ZTErKyAgICAgIHwgICAgICAgICAgfAorICAgfCAgcHR5ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBzb2NrZXQgIHwKKyAgIHwgICAgICAgfCAgICAgcmRpZHgyKysgICAgICstLS0tLS0rICAgICB3cmlkeDIrKyAgICAgfCAgICAgICAgICB8CisgICB8ICAgICAgIHwgIC0tLS0tLS0tLS0tLS0tPiB8IGJ1ZjIgfCAgLS0tLS0tLS0tLS0tLS0+IHwgICAgICAgICAgfAorICAgKy0tLS0tLS0rICAgICBzaXplMisrICAgICAgKy0tLS0tLSsgICAgIHNpemUyLS0gICAgICArLS0tLS0tLS0tLSsKKworICAgc2l6ZTE6ICJob3cgbWFueSBieXRlcyBhcmUgYnVmZmVyZWQgZm9yIHB0eSBiZXR3ZWVuIHJkaWR4MSBhbmQgd3JpZHgxPyIKKyAgIHNpemUyOiAiaG93IG1hbnkgYnl0ZXMgYXJlIGJ1ZmZlcmVkIGZvciBzb2NrZXQgYmV0d2VlbiByZGlkeDIgYW5kIHdyaWR4Mj8iCisKKyAgIEVhY2ggc2Vzc2lvbiBoYXMgZ290IHR3byBidWZmZXJzLiBCdWZmZXJzIGFyZSBjaXJjdWxhci4gSWYgc2l6ZU4gPT0gMCwKKyAgIGJ1ZmZlciBpcyBlbXB0eS4gSWYgc2l6ZU4gPT0gQlVGU0laRSwgYnVmZmVyIGlzIGZ1bGwuIEluIGJvdGggdGhlc2UgY2FzZXMKKyAgIHJkaWR4TiA9PSB3cmlkeE4uCisqLworIGFnYWluOgorCUZEX1pFUk8oJnJkZmRzZXQpOworCUZEX1pFUk8oJndyZmRzZXQpOworCisJLyogU2VsZWN0IG9uIHRoZSBtYXN0ZXIgc29ja2V0LCBhbGwgdGVsbmV0IHNvY2tldHMgYW5kIHRoZWlyCisJICogcHR5cyBpZiB0aGVyZSBpcyByb29tIGluIHRoZWlyIHNlc3Npb24gYnVmZmVycy4KKwkgKiBOQjogc2NhbGFiaWxpdHkgcHJvYmxlbTogd2UgcmVjYWxjdWxhdGUgZW50aXJlIGJpdG1hcAorCSAqIGJlZm9yZSBlYWNoIHNlbGVjdC4gQ2FuIGJlIGEgcHJvYmxlbSB3aXRoIDUwMCsgY29ubmVjdGlvbnMuICovCisJdHMgPSBHLnNlc3Npb25zOworCXdoaWxlICh0cykgeworCQlzdHJ1Y3QgdHNlc3Npb24gKm5leHQgPSB0cy0+bmV4dDsgLyogaW4gY2FzZSB3ZSBmcmVlIHRzICovCisJCWlmICh0cy0+c2hlbGxfcGlkID09IC0xKSB7CisJCQkvKiBDaGlsZCBkaWVkIGFuZCB3ZSBkZXRlY3RlZCB0aGF0ICovCisJCQlmcmVlX3Nlc3Npb24odHMpOworCQl9IGVsc2UgeworCQkJaWYgKHRzLT5zaXplMSA+IDApICAgICAgIC8qIGNhbiB3cml0ZSB0byBwdHkgKi8KKwkJCQlGRF9TRVQodHMtPnB0eWZkLCAmd3JmZHNldCk7CisJCQlpZiAodHMtPnNpemUxIDwgQlVGU0laRSkgLyogY2FuIHJlYWQgZnJvbSBzb2NrZXQgKi8KKwkJCQlGRF9TRVQodHMtPnNvY2tmZF9yZWFkLCAmcmRmZHNldCk7CisJCQlpZiAodHMtPnNpemUyID4gMCkgICAgICAgLyogY2FuIHdyaXRlIHRvIHNvY2tldCAqLworCQkJCUZEX1NFVCh0cy0+c29ja2ZkX3dyaXRlLCAmd3JmZHNldCk7CisJCQlpZiAodHMtPnNpemUyIDwgQlVGU0laRSkgLyogY2FuIHJlYWQgZnJvbSBwdHkgKi8KKwkJCQlGRF9TRVQodHMtPnB0eWZkLCAmcmRmZHNldCk7CisJCX0KKwkJdHMgPSBuZXh0OworCX0KKwlpZiAoIUlTX0lORVREKSB7CisJCUZEX1NFVChtYXN0ZXJfZmQsICZyZGZkc2V0KTsKKwkJLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBmcmVlX3Nlc3Npb24oKSBkb2VzIG5vdAorCQkgKiB0YWtlIG1hc3Rlcl9mZCBpbnRvIGFjY291bnQgd2hlbiBpdCBmaW5kcyBuZXcKKwkJICogbWF4ZmQgYW1vbmcgcmVtYWluaW5nIGZkJ3MgKi8KKwkJaWYgKG1hc3Rlcl9mZCA+IEcubWF4ZmQpCisJCQlHLm1heGZkID0gbWFzdGVyX2ZkOworCX0KKworCXsKKwkJc3RydWN0IHRpbWV2YWwgKnR2X3B0ciA9IE5VTEw7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUCisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlpZiAoKG9wdCAmIE9QVF9XQUlUKSAmJiAhRy5zZXNzaW9ucykgeworCQkJdHYudHZfc2VjID0gc2VjX2xpbmdlcjsKKwkJCXR2LnR2X3VzZWMgPSAwOworCQkJdHZfcHRyID0gJnR2OworCQl9CisjZW5kaWYKKwkJY291bnQgPSBzZWxlY3QoRy5tYXhmZCArIDEsICZyZGZkc2V0LCAmd3JmZHNldCwgTlVMTCwgdHZfcHRyKTsKKwl9CisJaWYgKGNvdW50ID09IDApIC8qICJ0ZWxuZXRkIC13IFNFQyIgdGltZWQgb3V0ICovCisJCXJldHVybiAwOworCWlmIChjb3VudCA8IDApCisJCWdvdG8gYWdhaW47IC8qIEVJTlRSIG9yIEVOT01FTSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJLyogQ2hlY2sgZm9yIGFuZCBhY2NlcHQgbmV3IHNlc3Npb25zICovCisJaWYgKCFJU19JTkVURCAmJiBGRF9JU1NFVChtYXN0ZXJfZmQsICZyZGZkc2V0KSkgeworCQlpbnQgZmQ7CisJCXN0cnVjdCB0c2Vzc2lvbiAqbmV3X3RzOworCisJCWZkID0gYWNjZXB0KG1hc3Rlcl9mZCwgTlVMTCwgTlVMTCk7CisJCWlmIChmZCA8IDApCisJCQlnb3RvIGFnYWluOworCQljbG9zZV9vbl9leGVjX29uKGZkKTsKKworCQkvKiBDcmVhdGUgYSBuZXcgc2Vzc2lvbiBhbmQgbGluayBpdCBpbnRvIGFjdGl2ZSBsaXN0ICovCisJCW5ld190cyA9IG1ha2VfbmV3X3Nlc3Npb24oZmQpOworCQlpZiAobmV3X3RzKSB7CisJCQluZXdfdHMtPm5leHQgPSBHLnNlc3Npb25zOworCQkJRy5zZXNzaW9ucyA9IG5ld190czsKKwkJfSBlbHNlIHsKKwkJCWNsb3NlKGZkKTsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogVGhlbiBjaGVjayBmb3IgZGF0YSB0dW5uZWxpbmcgKi8KKwl0cyA9IEcuc2Vzc2lvbnM7CisJd2hpbGUgKHRzKSB7IC8qIEZvciBhbGwgc2Vzc2lvbnMuLi4gKi8KKwkJc3RydWN0IHRzZXNzaW9uICpuZXh0ID0gdHMtPm5leHQ7IC8qIGluIGNhc2Ugd2UgZnJlZSB0cyAqLworCisJCWlmICgvKnRzLT5zaXplMSAmJiovIEZEX0lTU0VUKHRzLT5wdHlmZCwgJndyZmRzZXQpKSB7CisJCQlpbnQgbnVtX3RvdHR5OworCQkJdW5zaWduZWQgY2hhciAqcHRyOworCQkJLyogV3JpdGUgdG8gcHR5IGZyb20gYnVmZmVyIDEgKi8KKwkJCXB0ciA9IHJlbW92ZV9pYWNzKHRzLCAmbnVtX3RvdHR5KTsKKwkJCWNvdW50ID0gc2FmZV93cml0ZSh0cy0+cHR5ZmQsIHB0ciwgbnVtX3RvdHR5KTsKKwkJCWlmIChjb3VudCA8IDApIHsKKwkJCQlpZiAoZXJybm8gPT0gRUFHQUlOKQorCQkJCQlnb3RvIHNraXAxOworCQkJCWdvdG8ga2lsbF9zZXNzaW9uOworCQkJfQorCQkJdHMtPnNpemUxIC09IGNvdW50OworCQkJdHMtPndyaWR4MSArPSBjb3VudDsKKwkJCWlmICh0cy0+d3JpZHgxID49IEJVRlNJWkUpIC8qIGFjdHVhbGx5ID09IEJVRlNJWkUgKi8KKwkJCQl0cy0+d3JpZHgxID0gMDsKKwkJfQorIHNraXAxOgorCQlpZiAoLyp0cy0+c2l6ZTIgJiYqLyBGRF9JU1NFVCh0cy0+c29ja2ZkX3dyaXRlLCAmd3JmZHNldCkpIHsKKwkJCS8qIFdyaXRlIHRvIHNvY2tldCBmcm9tIGJ1ZmZlciAyICovCisJCQljb3VudCA9IE1JTihCVUZTSVpFIC0gdHMtPndyaWR4MiwgdHMtPnNpemUyKTsKKwkJCWNvdW50ID0gaWFjX3NhZmVfd3JpdGUodHMtPnNvY2tmZF93cml0ZSwgKHZvaWQqKShUU19CVUYyKHRzKSArIHRzLT53cmlkeDIpLCBjb3VudCk7CisJCQlpZiAoY291bnQgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVBR0FJTikKKwkJCQkJZ290byBza2lwMjsKKwkJCQlnb3RvIGtpbGxfc2Vzc2lvbjsKKwkJCX0KKwkJCXRzLT5zaXplMiAtPSBjb3VudDsKKwkJCXRzLT53cmlkeDIgKz0gY291bnQ7CisJCQlpZiAodHMtPndyaWR4MiA+PSBCVUZTSVpFKSAvKiBhY3R1YWxseSA9PSBCVUZTSVpFICovCisJCQkJdHMtPndyaWR4MiA9IDA7CisJCX0KKyBza2lwMjoKKwkJLyogU2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dC4uLiByZW1vdmVfaWFjcyBpcyBhY3R1YWxseSBidWdneQorCQkgKiAoaXQgY2Fubm90IHByb2Nlc3MgaWFjcyB3aGljaCB3cmFwIGFyb3VuZCBidWZmZXIncyBlbmQpIQorCQkgKiBTaW5jZSBwcm9wZXJseSBmaXhpbmcgaXQgcmVxdWlyZXMgd3JpdGluZyBiaWdnZXIgY29kZSwKKwkJICogd2UgcmVseSBpbnN0ZWFkIG9uIHRoaXMgY29kZSBtYWtpbmcgaXQgdmlydHVhbGx5IGltcG9zc2libGUKKwkJICogdG8gaGF2ZSB3cmFwcGVkIGlhYyAocGVvcGxlIGRvbid0IHR5cGUgYXQgMmsvc2Vjb25kKS4KKwkJICogSXQgYWxzbyBhbGxvd3MgZm9yIGJpZ2dlciByZWFkcyBpbiBjb21tb24gY2FzZS4gKi8KKwkJaWYgKHRzLT5zaXplMSA9PSAwKSB7CisJCQl0cy0+cmRpZHgxID0gMDsKKwkJCXRzLT53cmlkeDEgPSAwOworCQl9CisJCWlmICh0cy0+c2l6ZTIgPT0gMCkgeworCQkJdHMtPnJkaWR4MiA9IDA7CisJCQl0cy0+d3JpZHgyID0gMDsKKwkJfQorCisJCWlmICgvKnRzLT5zaXplMSA8IEJVRlNJWkUgJiYqLyBGRF9JU1NFVCh0cy0+c29ja2ZkX3JlYWQsICZyZGZkc2V0KSkgeworCQkJLyogUmVhZCBmcm9tIHNvY2tldCB0byBidWZmZXIgMSAqLworCQkJY291bnQgPSBNSU4oQlVGU0laRSAtIHRzLT5yZGlkeDEsIEJVRlNJWkUgLSB0cy0+c2l6ZTEpOworCQkJY291bnQgPSBzYWZlX3JlYWQodHMtPnNvY2tmZF9yZWFkLCBUU19CVUYxKHRzKSArIHRzLT5yZGlkeDEsIGNvdW50KTsKKwkJCWlmIChjb3VudCA8PSAwKSB7CisJCQkJaWYgKGNvdW50IDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pCisJCQkJCWdvdG8gc2tpcDM7CisJCQkJZ290byBraWxsX3Nlc3Npb247CisJCQl9CisJCQkvKiBJZ25vcmUgdHJhaWxpbmcgTlVMIGlmIGl0IGlzIHRoZXJlICovCisJCQlpZiAoIVRTX0JVRjEodHMpW3RzLT5yZGlkeDEgKyBjb3VudCAtIDFdKSB7CisJCQkJLS1jb3VudDsKKwkJCX0KKwkJCXRzLT5zaXplMSArPSBjb3VudDsKKwkJCXRzLT5yZGlkeDEgKz0gY291bnQ7CisJCQlpZiAodHMtPnJkaWR4MSA+PSBCVUZTSVpFKSAvKiBhY3R1YWxseSA9PSBCVUZTSVpFICovCisJCQkJdHMtPnJkaWR4MSA9IDA7CisJCX0KKyBza2lwMzoKKwkJaWYgKC8qdHMtPnNpemUyIDwgQlVGU0laRSAmJiovIEZEX0lTU0VUKHRzLT5wdHlmZCwgJnJkZmRzZXQpKSB7CisJCQkvKiBSZWFkIGZyb20gcHR5IHRvIGJ1ZmZlciAyICovCisJCQljb3VudCA9IE1JTihCVUZTSVpFIC0gdHMtPnJkaWR4MiwgQlVGU0laRSAtIHRzLT5zaXplMik7CisJCQljb3VudCA9IHNhZmVfcmVhZCh0cy0+cHR5ZmQsIFRTX0JVRjIodHMpICsgdHMtPnJkaWR4MiwgY291bnQpOworCQkJaWYgKGNvdW50IDw9IDApIHsKKwkJCQlpZiAoY291bnQgPCAwICYmIGVycm5vID09IEVBR0FJTikKKwkJCQkJZ290byBza2lwNDsKKwkJCQlnb3RvIGtpbGxfc2Vzc2lvbjsKKwkJCX0KKwkJCXRzLT5zaXplMiArPSBjb3VudDsKKwkJCXRzLT5yZGlkeDIgKz0gY291bnQ7CisJCQlpZiAodHMtPnJkaWR4MiA+PSBCVUZTSVpFKSAvKiBhY3R1YWxseSA9PSBCVUZTSVpFICovCisJCQkJdHMtPnJkaWR4MiA9IDA7CisJCX0KKyBza2lwNDoKKwkJdHMgPSBuZXh0OworCQljb250aW51ZTsKKyBraWxsX3Nlc3Npb246CisJCWlmICh0cy0+c2hlbGxfcGlkID4gMCkKKwkJCXVwZGF0ZV91dG1wKHRzLT5zaGVsbF9waWQsIERFQURfUFJPQ0VTUywgLyp0dHlfbmFtZToqLyBOVUxMLCAvKnVzZXJuYW1lOiovIE5VTEwsIC8qaG9zdG5hbWU6Ki8gTlVMTCk7CisJCWZyZWVfc2Vzc2lvbih0cyk7CisJCXRzID0gbmV4dDsKKwl9CisKKwlnb3RvIGFnYWluOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90ZWxuZXRkLmN0cmxTUS5wYXRjaCBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGVsbmV0ZC5jdHJsU1EucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MGUxYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdGVsbmV0ZC5jdHJsU1EucGF0Y2gKQEAgLTAsMCArMSwxNzUgQEAKK0Zyb206ICJEb3VnIEdyYWhhbSIgPGRncmFoYW1Abm9ydGVsLmNvbT4KK0RhdGU6IDIwMDktMDEtMjIgMDc6MjAKKworSGVsbG8sCisKK0J1c3lib3gncyB0ZWxuZXRkIGRvZXMgbm90IGRpc2FibGUgbG9jYWwgKGNsaWVudC1zaWRlKSBmbG93IGNvbnRyb2wKK3Byb3Blcmx5LiAgSXQgZG9lcyBub3QgcHV0IHRoZSBwdHkgaW50byBwYWNrZXQgbW9kZSBhbmQgdGhlbiBub3RpZnkgdGhlCitjbGllbnQgd2hlbmV2ZXIgZmxvdyBjb250cm9sIGlzIGRpc2FibGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHJ1bm5pbmcgdW5kZXIKK2l0cyBjb250cm9sLiAgVGhlIHJlc3VsdCBpcyB0aGF0IF5TL15RIGFyZSBub3QgcGFzc2VkIHRocm91Z2ggdG8gdGhlCithcHBsaWNhdGlvbiwgd2hpY2ggaXMgcGFpbmZ1bCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBhbiBlbWFjcyB2YXJpYW50LgorCitJIHN1cHBvc2UgdGhhdCBzdXBwb3J0IGZvciB0aGlzIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYmxvYXQsIGJ1dCB0aGUKK2luY2x1ZGVkIHBhdGNoIG9ubHkgYWRkcyBhYm91dCAyMDAgYnl0ZXMgb2YgdGV4dCB0byB4ODYgYnVzeWJveCBhbmQgMzAwCitieXRlcyB0byBtaXBzZWwgYnVzeWJveC4gIFBsZWFzZSBjb25zaWRlciBhcHBseWluZy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTkI6IHRoZSBwYXRjaCBkb2Vzbid0IHdvcmsgYXMtaXMgYmVjYXVzZSB3ZSBub3cgaGF2ZSBpYWNfc2FmZV93cml0ZSgpCit3aGljaCBxdW90ZXMgSUFDcyBvbiBvdXRwdXQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEb2NzOgorCitUaGUgZm9sbG93aW5nIGlvY3RsKDIpIGNhbGxzIGFwcGx5IG9ubHkgdG8gcHNldWRvIHRlcm1pbmFsczoKKworVElPQ1NUT1AgU3RvcHMgb3V0cHV0IHRvIGEgdGVybWluYWwgKGUuZy4gbGlrZSB0eXBpbmcgXlMpLiBUYWtlcyBubyBwYXJhbWV0ZXIuCisKK1RJT0NTVEFSVCBSZXN0YXJ0cyBvdXRwdXQgKHN0b3BwZWQgYnkgVElPQ1NUT1Agb3IgYnkgdHlwaW5nIF5TKS4gVGFrZXMgbm8gcGFyYW1ldGVyLgorCitUSU9DUEtUICAgICAgICAgRW5hYmxlL2Rpc2FibGUgcGFja2V0IG1vZGUuIFdoZW4gYXBwbGllZCB0byB0aGUgbWFzdGVyIHNpZGUgb2YgYSBwc2V1ZG8gdGVybWluYWwsIGVhY2gKK3N1YnNlcXVlbnQgcmVhZCgyKSBmcm9tIHRoZSB0ZXJtaW5hbCB3aWxsIHJldHVybiBkYXRhIHdyaXR0ZW4gb24gdGhlIHNsYXZlIHBhcnQgb2YgdGhlIHBzZXVkbyB0ZXJtaW5hbCBwcmVjZWRlZCBieSBhCit6ZXJvIGJ5dGUgKHN5bWJvbGljYWxseSBkZWZpbmVkIGFzIFRJT0NQS1RfREFUQSksIG9yIGEgc2luZ2xlIGJ5dGUgcmVmbGVjdGluZyBjb250cm9sIHN0YXR1cyBpbmZvcm1hdGlvbi4KK0luIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGJ5dGUgaXMgYW4gaW5jbHVzaXZlLW9yIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUgYml0czoKKworVElPQ1BLVF9GTFVTSFJFQUQgICAgIHdoZW5ldmVyIHRoZSByZWFkIHF1ZXVlIGZvciB0aGUgdGVybWluYWwgaXMgZmx1c2hlZC4KK1RJT0NQS1RfRkxVU0hXUklURSAgICB3aGVuZXZlciB0aGUgd3JpdGUgcXVldWUgZm9yIHRoZSB0ZXJtaW5hbCBpcyBmbHVzaGVkLgorVElPQ1BLVF9TVE9QICAgIHdoZW5ldmVyIG91dHB1dCB0byB0aGUgdGVybWluYWwgaXMgc3RvcHBlZCBhIGxhIF5TLgorVElPQ1BLVF9TVEFSVCAgIHdoZW5ldmVyIG91dHB1dCB0byB0aGUgdGVybWluYWwgaXMgcmVzdGFydGVkLgorVElPQ1BLVF9ET1NUT1AgIHdoZW5ldmVyIHRfc3RvcGMgaXMgXlMgYW5kIHRfc3RhcnRjIGlzIF5RLgorVElPQ1BLVF9OT1NUT1AgIHdoZW5ldmVyIHRoZSBzdGFydCBhbmQgc3RvcCBjaGFyYWN0ZXJzIGFyZSBub3QgXlMvXlEuCisKK1doaWxlIHRoaXMgbW9kZSBpcyBpbiB1c2UsIHRoZSBwcmVzZW5jZSBvZiBjb250cm9sIHN0YXR1cyBpbmZvcm1hdGlvbiB0byBiZSByZWFkIGZyb20gdGhlIG1hc3RlciBzaWRlIG1heSBiZSBkZXRlY3RlZAorYnkgYSBzZWxlY3QoMikgZm9yIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuCisKK1RoaXMgbW9kZSBpcyB1c2VkIGJ5IHJsb2dpbigxKSBhbmQgcmxvZ2luZCg4KSB0byBpbXBsZW1lbnQgYSByZW1vdGUtZWNob2VkLCBsb2NhbGx5IF5TL15RIGZsb3ctY29udHJvbGxlZCByZW1vdGUgbG9naW4KK3dpdGggcHJvcGVyIGJhY2stZmx1c2hpbmcgb2Ygb3V0cHV0OyBpdCBjYW4gYmUgdXNlZCBieSBvdGhlciBzaW1pbGFyIHByb2dyYW1zLgorCitUSU9DVUNOVEwgICAgICAgRW5hYmxlL2Rpc2FibGUgYSBtb2RlIHRoYXQgYWxsb3dzIGEgc21hbGwgbnVtYmVyIG9mIHNpbXBsZSB1c2VyIGlvY3RsKDIpIGNvbW1hbmRzIHRvIGJlIHBhc3NlZCB0aHJvdWdoCit0aGUgcHNldWRvLXRlcm1pbmFsLCB1c2luZyBhIHByb3RvY29sIHNpbWlsYXIgdG8gdGhhdCBvZiBUSU9DUEtULiBUaGUgVElPQ1VDTlRMIGFuZCBUSU9DUEtUIG1vZGVzIGFyZSBtdXR1YWxseQorZXhjbHVzaXZlLiBUaGlzIG1vZGUgaXMgZW5hYmxlZCBmcm9tIHRoZSBtYXN0ZXIgc2lkZSBvZiBhIHBzZXVkbyB0ZXJtaW5hbC4gRWFjaCBzdWJzZXF1ZW50IHJlYWQoMikgZnJvbSB0aGUgbWFzdGVyIHNpZGUKK3dpbGwgcmV0dXJuIGRhdGEgd3JpdHRlbiBvbiB0aGUgc2xhdmUgcGFydCBvZiB0aGUgcHNldWRvIHRlcm1pbmFsIHByZWNlZGVkIGJ5IGEgemVybyBieXRlLCBvciBhIHNpbmdsZSBieXRlIHJlZmxlY3RpbmcgYQordXNlciBjb250cm9sIG9wZXJhdGlvbiBvbiB0aGUgc2xhdmUgc2lkZS4gQSB1c2VyIGNvbnRyb2wgY29tbWFuZCBjb25zaXN0cyBvZiBhIHNwZWNpYWwgaW9jdGwoMikgb3BlcmF0aW9uIHdpdGggbm8gZGF0YTsKK3RoZSBjb21tYW5kIGlzIGdpdmVuIGFzIFVJT0NDTUQgKG4pLCB3aGVyZSBuIGlzIGEgbnVtYmVyIGluIHRoZSByYW5nZSAxLTI1NS4gVGhlIG9wZXJhdGlvbiB2YWx1ZSBuIHdpbGwgYmUgcmVjZWl2ZWQgYXMKK2Egc2luZ2xlIGJ5dGUgb24gdGhlIG5leHQgcmVhZCgyKSBmcm9tIHRoZSBtYXN0ZXIgc2lkZS4gVGhlIGlvY3RsKDIpIFVJT0NDTUQgKDApIGlzIGEgbm8tb3AgdGhhdCBtYXkgYmUgdXNlZCB0byBwcm9iZQorZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyBmYWNpbGl0eS4gQXMgd2l0aCBUSU9DUEtUIG1vZGUsIGNvbW1hbmQgb3BlcmF0aW9ucyBtYXkgYmUgZGV0ZWN0ZWQgd2l0aCBhIHNlbGVjdCgyKSBmb3IKK2V4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuCisKKy0tLSBidXN5Ym94LTEuMTMuMi9uZXR3b3JraW5nL3RlbG5ldGQuYwkyMDA5LzAxLzIxIDIwOjAyOjM5CTEuMQorKysrIGJ1c3lib3gtMS4xMy4yL25ldHdvcmtpbmcvdGVsbmV0ZC5jCTIwMDkvMDEvMjIgMDA6MzU6MjgKK0BAIC0zOCw2ICszOCw5IEBACisgCWludCBzb2NrZmRfcmVhZCwgc29ja2ZkX3dyaXRlLCBwdHlmZDsKKyAJaW50IHNoZWxsX3BpZDsKKyAKKysjaWZkZWYgVElPQ1BLVAorKwlpbnQgZmxvd3N0YXRlOworKyNlbmRpZgorIAkvKiB0d28gY2lyY3VsYXIgYnVmZmVycyAqLworIAkvKmNoYXIgKmJ1ZjEsICpidWYyOyovCisgLyojZGVmaW5lIFRTX0JVRjEgdHMtPmJ1ZjEqLworQEAgLTE3MCw2ICsxNzMsOSBAQAorIAlpbnQgZmQsIHBpZDsKKyAJY2hhciB0dHlfbmFtZVtHRVRQVFlfQlVGU0laRV07CisgCXN0cnVjdCB0c2Vzc2lvbiAqdHMgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgdHNlc3Npb24pICsgQlVGU0laRSAqIDIpOworKyNpZmRlZiBUSU9DUEtUCisrCWludCBvbiA9IDE7CisrI2VuZGlmCisgCisgCS8qdHMtPmJ1ZjEgPSAoY2hhciAqKSh0cyArIDEpOyovCisgCS8qdHMtPmJ1ZjIgPSB0cy0+YnVmMSArIEJVRlNJWkU7Ki8KK0BAIC0xODAsNiArMTg2LDEwIEBACisgCQltYXhmZCA9IGZkOworIAl0cy0+cHR5ZmQgPSBmZDsKKyAJbmRlbGF5X29uKGZkKTsKKysjaWZkZWYgVElPQ1BLVAorKwlpb2N0bChmZCwgVElPQ1BLVCwgJm9uKTsKKysJdHMtPmZsb3dzdGF0ZSA9IFRJT0NQS1RfRE9TVE9QOworKyNlbmRpZgorICNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKyAJdHMtPnNvY2tmZF9yZWFkID0gc29jazsKKyAJLyogU09fS0VFUEFMSVZFIGJ5IHBvcHVsYXIgZGVtYW5kICovCitAQCAtMzg1LDYgKzM5NSwxNiBAQAorIAkJcG9ydG5iciA9IDIzLAorIAl9OworICNlbmRpZgorKyNpZmRlZiBUSU9DUEtUCisrCWludCBjb250cm9sOworKwlzdGF0aWMgY29uc3QgY2hhciBsZmxvd19vbltdID0KKysJICAgIHtJQUMsIFNCLCBURUxPUFRfTEZMT1csIExGTE9XX09OLCBJQUMsIFNFfTsKKysJc3RhdGljIGNvbnN0IGNoYXIgbGZsb3dfb2ZmW10gPQorKwkgICAge0lBQywgU0IsIFRFTE9QVF9MRkxPVywgTEZMT1dfT0ZGLCBJQUMsIFNFfTsKKysjIGRlZmluZSBSRVNFUlZFRCBzaXplb2YobGZsb3dfb24pCisrI2Vsc2UKKysjIGRlZmluZSBSRVNFUlZFRCAwCisrI2VuZGlmCisgCS8qIEV2ZW4gaWYgIVNUQU5EQUxPTkUsIHdlIGFjY2VwdCAoYW5kIGlnbm9yZSkgLWksIHRodXMgcGVvcGxlCisgCSAqIGRvbid0IG5lZWQgdG8gZ3Vlc3Mgd2hldGhlciBpdCdzIG9rIHRvIHBhc3MgLWkgdG8gdXMgKi8KKyAJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImY6bDpLaSIgSUZfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUoInA6YjpGIiksCitAQCAtNDc1LDcgKzQ5NSw3IEBACisgCQkJCUZEX1NFVCh0cy0+c29ja2ZkX3JlYWQsICZyZGZkc2V0KTsKKyAJCQlpZiAodHMtPnNpemUyID4gMCkgICAgICAgLyogY2FuIHdyaXRlIHRvIHNvY2tldCAqLworIAkJCQlGRF9TRVQodHMtPnNvY2tmZF93cml0ZSwgJndyZmRzZXQpOworLQkJCWlmICh0cy0+c2l6ZTIgPCBCVUZTSVpFKSAvKiBjYW4gcmVhZCBmcm9tIHB0eSAqLworKwkJCWlmICh0cy0+c2l6ZTIgPCAoQlVGU0laRSAtIFJFU0VSVkVEKSkgLyogY2FuIHJlYWQgZnJvbSBwdHkgKi8KKyAJCQkJRkRfU0VUKHRzLT5wdHlmZCwgJnJkZmRzZXQpOworIAkJfQorIAkJdHMgPSBuZXh0OworQEAgLTU5Myw2ICs2MTMsNTIgQEAKKyAJCQkJCWdvdG8gc2tpcDQ7CisgCQkJCWdvdG8ga2lsbF9zZXNzaW9uOworIAkJCX0KKysjaWZkZWYgVElPQ1BLVAorKwkJCWNvbnRyb2wgPSBUU19CVUYyW3RzLT5yZGlkeDJdOworKwkJCWlmICgtLWNvdW50ID4gMCAmJiBjb250cm9sID09IFRJT0NQS1RfREFUQSkgeworKwkJCQkvKgorKwkJCQkgKiBJZiB3ZSBhcmUgaW4gcGFja2V0IG1vZGUsIGFuZCB3ZSBoYXZlCisrCQkJCSAqIGp1c3QgcmVhZCBhIGNodW5rIG9mIGFjdHVhbCBkYXRhIGZyb20KKysJCQkJICogdGhlIHB0eSwgdGhlbiB0aGVyZSBpcyB0aGUgVElPQ1BLVF9EQVRBCisrCQkJCSAqIGJ5dGUgKHplcm8pIHRoYXQgd2UgaGF2ZSBnb3QgdG8gcmVtb3ZlCisrCQkJCSAqIHNvbWVob3cuICBJZiB0aGVyZSB3ZXJlIG5vIGNoYXJzIGluCisrCQkJCSAqIFRTX0JVRjIgYmVmb3JlIHdlIGRpZCB0aGlzIHJlYWQsIHRoZW4KKysJCQkJICogd2UgY2FuIG9wdGltaXplIGJ5IGp1c3QgYWR2YW5jaW5nIHdyaWR4Mi4KKysJCQkJICogT3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgbmV3IGRhdGEgZG93bgorKwkJCQkgKiB0byBjbG9zZSB0aGUgZ2FwIChDb3VsZCB1c2UgcmVhZHYoKSBpbnN0ZWFkKS4KKysJCQkJICovCisrCQkJCWlmICh0cy0+c2l6ZTIgPT0gMCkKKysJCQkJCXRzLT53cmlkeDIrKzsKKysJCQkJZWxzZSB7CisrCQkJCQltZW1tb3ZlKFRTX0JVRjIgKyB0cy0+cmRpZHgyLAorKwkJCQkJCVRTX0JVRjIgKyB0cy0+cmRpZHgyICsgMSwgY291bnQpOworKwkJCQl9CisrCQkJfQorKworKwkJCS8qCisrCQkJICogSWYgdGhlIGZsb3cgY29udHJvbCBzdGF0ZSBjaGFuZ2VkLCBub3RpZnkKKysJCQkgKiB0aGUgY2xpZW50LiAgSWYgImNvbnRyb2wiIGlzIG5vdCBUSU9DUEtUX0RBVEEsCisrCQkJICogdGhlbiB0aGVyZSBhcmUgbm8gZGF0YSBieXRlcyB0byB3b3JyeSBhYm91dC4KKysJCQkgKi8KKysJCQlpZiAoKGNvbnRyb2wgJiAoVElPQ1BLVF9ET1NUT1B8VElPQ1BLVF9OT1NUT1ApKSAhPSAwCisrCQkJICYmIHRzLT5mbG93c3RhdGUgIT0gKGNvbnRyb2wgJiBUSU9DUEtUX0RPU1RPUCkpIHsKKysJCQkJY29uc3QgY2hhciAqcCA9IHRzLT5mbG93c3RhdGUgPyBsZmxvd19vZmYgOiBsZmxvd19vbjsKKysKKysJCQkJLyoKKysJCQkJICogV2Uga25vdyB3ZSBoYXZlIGVub3VnaCBmcmVlIHNsb3RzIGF2YWlsYWJsZQorKwkJCQkgKiAoc2VlIFJFU0VSVkVEKSBidXQgdGhleSBhcmUgbm90IG5lY2Vzc2FyaWx5CisrCQkJCSAqIGNvbnRpZ3VvdXM7IHdlIG1heSBoYXZlIHRvIHdyYXAuCisrCQkJCSAqLworKwkJCQlmb3IgKGNvdW50ID0gc2l6ZW9mKGxmbG93X29uKTsgY291bnQgPiAwOyBjb3VudC0tKSB7CisrCQkJCQlUU19CVUYyW3RzLT5yZGlkeDIrK10gPSAqcCsrOworKwkJCQkJaWYgKHRzLT5yZGlkeDIgPj0gQlVGU0laRSkKKysJCQkJCQl0cy0+cmRpZHgyID0gMDsKKysJCQkJCXRzLT5zaXplMisrOworKwkJCQl9CisrCisrCQkJCXRzLT5mbG93c3RhdGUgPSBjb250cm9sICYgVElPQ1BLVF9ET1NUT1A7CisrCQkJfQorKyNlbmRpZiAvKiBUSU9DUEtUICovCisgCQkJdHMtPnNpemUyICs9IGNvdW50OworIAkJCXRzLT5yZGlkeDIgKz0gY291bnQ7CisgCQkJaWYgKHRzLT5yZGlkeDIgPj0gQlVGU0laRSkgLyogYWN0dWFsbHkgPT0gQlVGU0laRSAqLworCistLURvdWcKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitidXN5Ym94IG1haWxpbmcgbGlzdAorYnVzeWJveEBidXN5Ym94Lm5ldAoraHR0cDovL2xpc3RzLmJ1c3lib3gubmV0L21haWxtYW4vbGlzdGluZm8vYnVzeWJveApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90ZnRwLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3RmdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDNiODc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90ZnRwLmMKQEAgLTAsMCArMSw4NzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEEgc2ltcGxlIHRmdHAgY2xpZW50L3NlcnZlciBmb3IgYnVzeWJveC4KKyAqIFRyaWVzIHRvIGZvbGxvdyBSRkMxMzUwLgorICogT25seSAib2N0ZXQiIG1vZGUgc3VwcG9ydGVkLgorICogT3B0aW9uYWwgYmxvY2tzaXplIG5lZ290aWF0aW9uIChSRkMyMzQ3ICsgUkZDMjM0OCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4KKyAqCisgKiBQYXJ0cyBvZiB0aGUgY29kZSBiYXNlZCBvbjoKKyAqCisgKiBhdGZ0cDogIENvcHlyaWdodCAoQykgMjAwMCBKZWFuLVBpZXJyZSBMZWZlYnZyZSA8aGVsaXhAc3RlcC5wb2x5bXRsLmNhPgorICogICAgICAgICAgICAgICAgICAgICAgICBhbmQgUmVtaSBMZWZlYnZyZSA8cmVtaUBkZWJpYW4ub3JnPgorICoKKyAqIHV0ZnRwOiAgQ29weXJpZ2h0IChDKSAxOTk5IFV3ZSBPaHNlIDx1d2VAb2hzZS5kZT4KKyAqCisgKiB0ZnRwZCBhZGRlZCBieSBEZW55cyBWbGFzZW5rbyAmIFZsYWRpbWlyIERyb25uaWtvdgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHRmdHBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBIT1NUIFtQT1JUXSIKKy8vdXNhZ2U6I2RlZmluZSB0ZnRwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhbnNmZXIgYSBmaWxlIGZyb20vdG8gdGZ0cCBzZXJ2ZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgRklMRQlMb2NhbCBGSUxFIgorLy91c2FnZTogICAgICJcbgktciBGSUxFCVJlbW90ZSBGSUxFIgorLy91c2FnZToJSUZfRkVBVFVSRV9URlRQX0dFVCgKKy8vdXNhZ2U6ICAgICAiXG4JLWcJR2V0IGZpbGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1RGVFBfUFVUKAorLy91c2FnZTogICAgICJcbgktcAlQdXQgZmlsZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoCisvL3VzYWdlOiAgICAgIlxuCS1iIFNJWkUJVHJhbnNmZXIgYmxvY2tzIG9mIFNJWkUgb2N0ZXRzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0ZnRwZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jcl0gWy11IFVTRVJdIFtESVJdIgorLy91c2FnZTojZGVmaW5lIHRmdHBkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhbnNmZXIgYSBmaWxlIG9uIHRmdHAgY2xpZW50J3MgcmVxdWVzdFxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgInRmdHBkIHNob3VsZCBiZSB1c2VkIGFzIGFuIGluZXRkIHNlcnZpY2UuXG4iCisvL3VzYWdlOiAgICAgICAidGZ0cGQncyBsaW5lIGZvciBpbmV0ZC5jb25mOlxuIgorLy91c2FnZTogICAgICAgIgk2OSBkZ3JhbSB1ZHAgbm93YWl0IHJvb3QgdGZ0cGQgdGZ0cGQgLWwgL2ZpbGVzL3RvL3NlcnZlXG4iCisvL3VzYWdlOiAgICAgICAiSXQgYWxzbyBjYW4gYmUgcmFuIGZyb20gdWRwc3ZkOlxuIgorLy91c2FnZTogICAgICAgIgl1ZHBzdmQgLXZFIDAuMC4wLjAgNjkgdGZ0cGQgL2ZpbGVzL3RvL3NlcnZlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1yCVByb2hpYml0IHVwbG9hZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQWxsb3cgZmlsZSBjcmVhdGlvbiB2aWEgdXBsb2FkIgorLy91c2FnZTogICAgICJcbgktdQlBY2Nlc3MgZmlsZXMgYXMgVVNFUiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTG9nIHRvIHN5c2xvZyAoaW5ldGQgbW9kZSByZXF1aXJlcyB0aGlzKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0dFVCB8fCBFTkFCTEVfRkVBVFVSRV9URlRQX1BVVAorCisjZGVmaW5lIFRGVFBfQkxLU0laRV9ERUZBVUxUICAgICAgIDUxMiAgLyogYWNjb3JkaW5nIHRvIFJGQyAxMzUwLCBkb24ndCBjaGFuZ2UgKi8KKyNkZWZpbmUgVEZUUF9CTEtTSVpFX0RFRkFVTFRfU1RSICI1MTIiCisvKiBXYXMgNTAgbXMgYnV0IHVzZXJzIGFza2VkIHRvIGJ1bXAgaXQgdXAgYSBiaXQgKi8KKyNkZWZpbmUgVEZUUF9USU1FT1VUX01TICAgICAgICAgICAgMTAwCisjZGVmaW5lIFRGVFBfTUFYVElNRU9VVF9NUyAgICAgICAgMjAwMAorI2RlZmluZSBURlRQX05VTV9SRVRSSUVTICAgICAgICAgICAgMTIgIC8qIG51bWJlciBvZiBiYWNrZWQtb2ZmIHJldHJpZXMgKi8KKworLyogb3Bjb2RlcyB3ZSBzdXBwb3J0ICovCisjZGVmaW5lIFRGVFBfUlJRICAgMQorI2RlZmluZSBURlRQX1dSUSAgIDIKKyNkZWZpbmUgVEZUUF9EQVRBICAzCisjZGVmaW5lIFRGVFBfQUNLICAgNAorI2RlZmluZSBURlRQX0VSUk9SIDUKKyNkZWZpbmUgVEZUUF9PQUNLICA2CisKKy8qIGVycm9yIGNvZGVzIHNlbnQgb3ZlciBuZXR3b3JrICh3ZSB1c2Ugb25seSAwLCAxLCAzIGFuZCA4KSAqLworLyogZ2VuZXJpYyAoZXJyb3IgbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGUgcGFja2V0KSAqLworI2RlZmluZSBFUlJfVU5TUEVDICAgMAorI2RlZmluZSBFUlJfTk9GSUxFICAgMQorI2RlZmluZSBFUlJfQUNDRVNTICAgMgorLyogZGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQgKi8KKyNkZWZpbmUgRVJSX1dSSVRFICAgIDMKKyNkZWZpbmUgRVJSX09QICAgICAgIDQKKyNkZWZpbmUgRVJSX0JBRF9JRCAgIDUKKyNkZWZpbmUgRVJSX0VYSVNUICAgIDYKKyNkZWZpbmUgRVJSX0JBRF9VU0VSIDcKKyNkZWZpbmUgRVJSX0JBRF9PUFQgIDgKKworLyogbWFza3MgY29taW5nIGZyb20gZ2V0b3B0MzIgKi8KK2VudW0geworCVRGVFBfT1BUX0dFVCA9ICgxIDw8IDApLAorCVRGVFBfT1BUX1BVVCA9ICgxIDw8IDEpLAorCS8qIHBzZXVkbyBvcHRpb246IGlmIHNldCwgaXQncyB0ZnRwZCAqLworCVRGVFBEX09QVCA9ICgxIDw8IDcpICogRU5BQkxFX1RGVFBELAorCVRGVFBEX09QVF9yID0gKDEgPDwgOCkgKiBFTkFCTEVfVEZUUEQsCisJVEZUUERfT1BUX2MgPSAoMSA8PCA5KSAqIEVOQUJMRV9URlRQRCwKKwlURlRQRF9PUFRfdSA9ICgxIDw8IDEwKSAqIEVOQUJMRV9URlRQRCwKKwlURlRQRF9PUFRfbCA9ICgxIDw8IDExKSAqIEVOQUJMRV9URlRQRCwKK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0dFVCAmJiAhRU5BQkxFX0ZFQVRVUkVfVEZUUF9QVVQKKyNkZWZpbmUgSUZfR0VUUFVUKC4uLikKKyNkZWZpbmUgQ01EX0dFVChjbWQpIDEKKyNkZWZpbmUgQ01EX1BVVChjbWQpIDAKKyNlbGlmICFFTkFCTEVfRkVBVFVSRV9URlRQX0dFVCAmJiBFTkFCTEVfRkVBVFVSRV9URlRQX1BVVAorI2RlZmluZSBJRl9HRVRQVVQoLi4uKQorI2RlZmluZSBDTURfR0VUKGNtZCkgMAorI2RlZmluZSBDTURfUFVUKGNtZCkgMQorI2Vsc2UKKyNkZWZpbmUgSUZfR0VUUFVUKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ01EX0dFVChjbWQpICgoY21kKSAmIFRGVFBfT1BUX0dFVCkKKyNkZWZpbmUgQ01EX1BVVChjbWQpICgoY21kKSAmIFRGVFBfT1BUX1BVVCkKKyNlbmRpZgorLyogTkI6IGluIHRoZSBjb2RlIGJlbG93CisgKiBDTURfR0VUKGNtZCkgYW5kIENNRF9QVVQoY21kKSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCisgKi8KKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogdTE2IFRGVFBfRVJST1I7IHUxNiByZWFzb247IGJvdGggbmV0d29yay1lbmRpYW4sIHRoZW4gZXJyb3IgdGV4dDogKi8KKwl1aW50OF90IGVycm9yX3BrdFs0ICsgMzJdOworCWNoYXIgKnVzZXJfb3B0OworCS8qIHVzZWQgaW4gdGZ0cGRfbWFpbigpLCBhIGJpdCBiaWcgZm9yIHN0YWNrOiAqLworCWNoYXIgYmxvY2tfYnVmW1RGVFBfQkxLU0laRV9ERUZBVUxUXTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUgorCW9mZl90IHBvczsKKwlvZmZfdCBzaXplOworCWNvbnN0IGNoYXIgKmZpbGU7CisJYmJfcHJvZ3Jlc3NfdCBwbXQ7CisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCitzdHJ1Y3QgQlVHX0dfdG9vX2JpZyB7CisJY2hhciBCVUdfR190b29fYmlnW3NpemVvZihHKSA8PSBDT01NT05fQlVGU0laRSA/IDEgOiAtMV07Cit9OworI2RlZmluZSBibG9ja19idWYgICAgICAgIChHLmJsb2NrX2J1ZiAgICkKKyNkZWZpbmUgdXNlcl9vcHQgICAgICAgICAoRy51c2VyX29wdCAgICApCisjZGVmaW5lIGVycm9yX3BrdCAgICAgICAgKEcuZXJyb3JfcGt0ICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZXJyb3JfcGt0X3JlYXNvbiAoZXJyb3JfcGt0WzNdKQorI2RlZmluZSBlcnJvcl9wa3Rfc3RyICAgIChlcnJvcl9wa3QgKyA0KQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKK3N0YXRpYyB2b2lkIHRmdHBfcHJvZ3Jlc3NfdXBkYXRlKHZvaWQpCit7CisJYmJfcHJvZ3Jlc3NfdXBkYXRlKCZHLnBtdCwgMCwgRy5wb3MsIEcuc2l6ZSk7Cit9CitzdGF0aWMgdm9pZCB0ZnRwX3Byb2dyZXNzX2luaXQodm9pZCkKK3sKKwliYl9wcm9ncmVzc19pbml0KCZHLnBtdCwgRy5maWxlKTsKKwl0ZnRwX3Byb2dyZXNzX3VwZGF0ZSgpOworfQorc3RhdGljIHZvaWQgdGZ0cF9wcm9ncmVzc19kb25lKHZvaWQpCit7CisJaWYgKGlzX2JiX3Byb2dyZXNzX2luaXRlZCgmRy5wbXQpKSB7CisJCXRmdHBfcHJvZ3Jlc3NfdXBkYXRlKCk7CisJCWJiX3B1dGNoYXJfc3RkZXJyKCdcbicpOworCQliYl9wcm9ncmVzc19mcmVlKCZHLnBtdCk7CisJfQorfQorI2Vsc2UKKyMgZGVmaW5lIHRmdHBfcHJvZ3Jlc3NfaW5pdCgpICgodm9pZCkwKQorIyBkZWZpbmUgdGZ0cF9wcm9ncmVzc19kb25lKCkgKCh2b2lkKTApCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisKK3N0YXRpYyBpbnQgdGZ0cF9ibGtzaXplX2NoZWNrKGNvbnN0IGNoYXIgKmJsa3NpemVfc3RyLCBpbnQgbWF4c2l6ZSkKK3sKKwkvKiBDaGVjayBpZiB0aGUgYmxrc2l6ZSBpcyB2YWxpZDoKKwkgKiBSRkMyMzQ4IHNheXMgYmV0d2VlbiA4IGFuZCA2NTQ2NCwKKwkgKiBidXQgb3VyIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGltcG9zc2libGUKKwkgKiB0byB1c2UgYmxrc2l6ZXMgc21hbGxlciB0aGFuIDIyIG9jdGV0cy4gKi8KKwl1bnNpZ25lZCBibGtzaXplID0gYmJfc3RydG91KGJsa3NpemVfc3RyLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vCisJIHx8IChibGtzaXplIDwgMjQpIHx8IChibGtzaXplID4gbWF4c2l6ZSkKKwkpIHsKKwkJYmJfZXJyb3JfbXNnKCJiYWQgYmxvY2tzaXplICclcyciLCBibGtzaXplX3N0cik7CisJCXJldHVybiAtMTsKKwl9CisjIGlmIEVOQUJMRV9URlRQX0RFQlVHCisJYmJfZXJyb3JfbXNnKCJ1c2luZyBibGtzaXplICV1IiwgYmxrc2l6ZSk7CisjIGVuZGlmCisJcmV0dXJuIGJsa3NpemU7Cit9CisKK3N0YXRpYyBjaGFyICp0ZnRwX2dldF9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IG9wdF92YWwgPSAwOworCWludCBvcHRfZm91bmQgPSAwOworCWludCBrOworCisJLyogYnVmIHBvaW50cyB0bzoKKwkgKiAib3B0X25hbWU8TlVMPm9wdF92YWw8TlVMPm9wdF9uYW1lMjxOVUw+b3B0X3ZhbDI8TlVMPi4uLiIgKi8KKworCXdoaWxlIChsZW4gPiAwKSB7CisJCS8qIE1ha2Ugc3VyZSBvcHRpb25zIGFyZSB0ZXJtaW5hdGVkIGNvcnJlY3RseSAqLworCQlmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyspIHsKKwkJCWlmIChidWZba10gPT0gJ1wwJykgeworCQkJCWdvdG8gbnVsX2ZvdW5kOworCQkJfQorCQl9CisJCXJldHVybiBOVUxMOworIG51bF9mb3VuZDoKKwkJaWYgKG9wdF92YWwgPT0gMCkgeyAvKiBpdCdzICJuYW1lIiBwYXJ0ICovCisJCQlpZiAoc3RyY2FzZWNtcChidWYsIG9wdGlvbikgPT0gMCkgeworCQkJCW9wdF9mb3VuZCA9IDE7CisJCQl9CisJCX0gZWxzZSBpZiAob3B0X2ZvdW5kKSB7CisJCQlyZXR1cm4gYnVmOworCQl9CisKKwkJaysrOworCQlidWYgKz0gazsKKwkJbGVuIC09IGs7CisJCW9wdF92YWwgXj0gMTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgdGZ0cF9wcm90b2NvbCgKKwkJLyogTlVMTCBpZiB0ZnRwLCAhTlVMTCBpZiB0ZnRwZDogKi8KKwkJbGVuX2FuZF9zb2NrYWRkciAqb3VyX2xzYSwKKwkJbGVuX2FuZF9zb2NrYWRkciAqcGVlcl9sc2EsCisJCWNvbnN0IGNoYXIgKmxvY2FsX2ZpbGUKKwkJSUZfVEZUUCgsIGNvbnN0IGNoYXIgKnJlbW90ZV9maWxlKQorI2lmICFFTkFCTEVfVEZUUAorIyBkZWZpbmUgcmVtb3RlX2ZpbGUgTlVMTAorI2VuZGlmCisJCS8qIDEgZm9yIHRmdHA7IDEvMCBmb3IgdGZ0cGQgZGVwZW5kaW5nIHdoZXRoZXIgY2xpZW50IGFza2VkIGFib3V0IGl0OiAqLworCQlJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKCwgaW50IHdhbnRfdHJhbnNmZXJfc2l6ZSkKKwkJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgsIGludCBibGtzaXplKSkKK3sKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUKKwllbnVtIHsgYmxrc2l6ZSA9IFRGVFBfQkxLU0laRV9ERUZBVUxUIH07CisjZW5kaWYKKworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworI2RlZmluZSBzb2NrZXRfZmQgKHBmZFswXS5mZCkKKwlpbnQgbGVuOworCWludCBzZW5kX2xlbjsKKwlJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKHNtYWxsaW50IGV4cGVjdF9PQUNLID0gMDspCisJc21hbGxpbnQgZmluaXNoZWQgPSAwOworCXVpbnQxNl90IG9wY29kZTsKKwl1aW50MTZfdCBibG9ja19ucjsKKwl1aW50MTZfdCByZWN2X2JsazsKKwlpbnQgb3Blbl9tb2RlLCBsb2NhbF9mZDsKKwlpbnQgcmV0cmllcywgd2FpdHRpbWVfbXM7CisJaW50IGlvX2J1ZnNpemUgPSBibGtzaXplICsgNDsKKwljaGFyICpjcDsKKwkvKiBDYW4ndCB1c2UgUkVTRVJWRV9DT05GSUdfQlVGRkVSIGhlcmUgc2luY2UgdGhlIGFsbG9jYXRpb24KKwkgKiBzaXplIHZhcmllcyBtZWFuaW5nIEJVRkZFUlNfR09fT05fU1RBQ0sgd291bGQgZmFpbC4KKwkgKgorCSAqIFdlIG11c3Qga2VlcCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyBzZXBhcmF0ZQorCSAqIGluIGNhc2Ugd2UgcmN2IGEgZ2FyYmFnZSBwa3QgLSB3ZSBuZWVkIHRvIHJleG1pdCB0aGUgbGFzdCBwa3QuCisJICovCisJY2hhciAqeGJ1ZiA9IHhtYWxsb2MoaW9fYnVmc2l6ZSk7CisJY2hhciAqcmJ1ZiA9IHhtYWxsb2MoaW9fYnVmc2l6ZSk7CisKKwlzb2NrZXRfZmQgPSB4c29ja2V0KHBlZXJfbHNhLT51LnNhLnNhX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJc2V0c29ja29wdF9yZXVzZWFkZHIoc29ja2V0X2ZkKTsKKworCWlmICghRU5BQkxFX1RGVFAgfHwgb3VyX2xzYSkgeyAvKiB0ZnRwZCAqLworCQkvKiBDcmVhdGUgYSBzb2NrZXQgd2hpY2ggaXM6CisJCSAqIDEuIGJvdW5kIHRvIElQOnBvcnQgcGVlciBzZW50IDFzdCBkYXRhZ3JhbSB0bywKKwkJICogMi4gY29ubmVjdGVkIHRvIHBlZXIncyBJUDpwb3J0CisJCSAqIFRoaXMgd2F5IHdlIHdpbGwgYW5zd2VyIGZyb20gdGhlIElQOnBvcnQgcGVlcgorCQkgKiBleHBlY3RzLCB3aWxsIG5vdCBnZXQgYW55IG90aGVyIHBhY2tldHMgb24KKwkJICogdGhlIHNvY2tldCwgYW5kIGFsc28gcGxhaW4gcmVhZC93cml0ZSB3aWxsIHdvcmsuICovCisJCXhiaW5kKHNvY2tldF9mZCwgJm91cl9sc2EtPnUuc2EsIG91cl9sc2EtPmxlbik7CisJCXhjb25uZWN0KHNvY2tldF9mZCwgJnBlZXJfbHNhLT51LnNhLCBwZWVyX2xzYS0+bGVuKTsKKworCQkvKiBJcyB0aGVyZSBhbiBlcnJvciBhbHJlYWR5PyBTZW5kIHBrdCBhbmQgYmFpbCBvdXQgKi8KKwkJaWYgKGVycm9yX3BrdF9yZWFzb24gfHwgZXJyb3JfcGt0X3N0clswXSkKKwkJCWdvdG8gc2VuZF9lcnJfcGt0OworCisJCWlmICh1c2VyX29wdCkgeworCQkJc3RydWN0IHBhc3N3ZCAqcHcgPSB4Z2V0cHduYW0odXNlcl9vcHQpOworCQkJY2hhbmdlX2lkZW50aXR5KHB3KTsgLyogaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQgKi8KKwkJfQorCX0KKworCS8qIFByZXBhcmUgb3BlbiBtb2RlICovCisJaWYgKENNRF9QVVQob3B0aW9uX21hc2szMikpIHsKKwkJb3Blbl9tb2RlID0gT19SRE9OTFk7CisJfSBlbHNlIHsKKwkJb3Blbl9tb2RlID0gT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVDsKKyNpZiBFTkFCTEVfVEZUUEQKKwkJaWYgKChvcHRpb25fbWFzazMyICYgKFRGVFBEX09QVCtURlRQRF9PUFRfYykpID09IFRGVFBEX09QVCkgeworCQkJLyogdGZ0cGQgd2l0aG91dCAtYyAqLworCQkJb3Blbl9tb2RlID0gT19XUk9OTFkgfCBPX1RSVU5DOworCQl9CisjZW5kaWYKKwl9CisKKwkvKiBFeGFtcGxlcyBvZiBuZXR3b3JrIHRyYWZmaWMuCisJICogTm90ZSB0d28gY2FzZXMgd2hlbiBBQ0tzIHdpdGggYmxvY2sjIG9mIDAgYXJlIHNlbnQuCisJICoKKwkgKiBEb3dubG9hZCB3aXRob3V0IG9wdGlvbnM6CisJICogdGZ0cCAtPiAiXDBcMUZJTEVOQU1FXDBvY3RldFwwIgorCSAqICAgICAgICAgIlwwXDNcMFwxRklMRURBVEEuLi4iIDwtIHRmdHBkCisJICogdGZ0cCAtPiAiXDBcNFwwXDEiCisJICogLi4uCisJICogRG93bmxvYWQgd2l0aCBvcHRpb24gb2YgYmxrc2l6ZSAxNjM4NDoKKwkgKiB0ZnRwIC0+ICJcMFwxRklMRU5BTUVcMG9jdGV0XDBibGtzaXplXDAwMDE2Mzg0XDAiCisJICogICAgICAgICAiXDBcNmJsa3NpemVcMDAwMTYzODRcMCIgPC0gdGZ0cGQKKwkgKiB0ZnRwIC0+ICJcMFw0XDBcMCIKKwkgKiAgICAgICAgICJcMFwzXDBcMUZJTEVEQVRBLi4uIiA8LSB0ZnRwZAorCSAqIHRmdHAgLT4gIlwwXDRcMFwxIgorCSAqIC4uLgorCSAqIFVwbG9hZCB3aXRob3V0IG9wdGlvbnM6CisJICogdGZ0cCAtPiAiXDBcMkZJTEVOQU1FXDBvY3RldFwwIgorCSAqICAgICAgICAgIlwwXDRcMFwwIiA8LSB0ZnRwZAorCSAqIHRmdHAgLT4gIlwwXDNcMFwxRklMRURBVEEuLi4iCisJICogICAgICAgICAiXDBcNFwwXDEiIDwtIHRmdHBkCisJICogLi4uCisJICogVXBsb2FkIHdpdGggb3B0aW9uIG9mIGJsa3NpemUgMTYzODQ6CisJICogdGZ0cCAtPiAiXDBcMkZJTEVOQU1FXDBvY3RldFwwYmxrc2l6ZVwwMDAxNjM4NFwwIgorCSAqICAgICAgICAgIlwwXDZibGtzaXplXDAwMDE2Mzg0XDAiIDwtIHRmdHBkCisJICogdGZ0cCAtPiAiXDBcM1wwXDFGSUxFREFUQS4uLiIKKwkgKiAgICAgICAgICJcMFw0XDBcMSIgPC0gdGZ0cGQKKwkgKiAuLi4KKwkgKi8KKwlibG9ja19uciA9IDE7CisJY3AgPSB4YnVmICsgMjsKKworCWlmICghRU5BQkxFX1RGVFAgfHwgb3VyX2xzYSkgeyAvKiB0ZnRwZCAqLworCQkvKiBPcGVuIGZpbGUgKG11c3QgYmUgYWZ0ZXIgY2hhbmdpbmcgdXNlcikgKi8KKwkJbG9jYWxfZmQgPSBvcGVuKGxvY2FsX2ZpbGUsIG9wZW5fbW9kZSwgMDY2Nik7CisJCWlmIChsb2NhbF9mZCA8IDApIHsKKwkJCWVycm9yX3BrdF9yZWFzb24gPSBFUlJfTk9GSUxFOworCQkJc3RyY3B5KChjaGFyKillcnJvcl9wa3Rfc3RyLCAiY2FuJ3Qgb3BlbiBmaWxlIik7CisJCQlnb3RvIHNlbmRfZXJyX3BrdDsKKwkJfQorLyogZ2NjIDQuMy4xIHdvdWxkIE5PVCBvcHRpbWl6ZSBpdCBvdXQgYXMgaXQgc2hvdWxkISAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJCWlmIChibGtzaXplICE9IFRGVFBfQkxLU0laRV9ERUZBVUxUIHx8IHdhbnRfdHJhbnNmZXJfc2l6ZSkgeworCQkJLyogQ3JlYXRlIGFuZCBzZW5kIE9BQ0sgcGFja2V0LiAqLworCQkJLyogRm9yIHRoZSBkb3dubG9hZCBjYXNlLCBibG9ja19uciBpcyBzdGlsbCAxIC0KKwkJCSAqIHdlIGV4cGVjdCAxc3QgQUNLIGZyb20gcGVlciB0byBiZSBmb3IgKGJsb2NrX25yLTEpLAorCQkJICogdGhhdCBpcywgZm9yICJibG9jayAwIiB3aGljaCBpcyBvdXIgT0FDSyBwa3QgKi8KKwkJCW9wY29kZSA9IFRGVFBfT0FDSzsKKwkJCWdvdG8gYWRkX2Jsa3NpemVfb3B0OworCQl9CisjZW5kaWYKKwkJaWYgKENNRF9HRVQob3B0aW9uX21hc2szMikpIHsKKwkJCS8qIEl0J3MgdXBsb2FkIGFuZCB3ZSBkb24ndCBzZW5kIE9BQ0suCisJCQkgKiBXZSBtdXN0IEFDSyAxc3QgcGFja2V0ICh3aXRoIGZpbGVuYW1lKQorCQkJICogYXMgaWYgaXQgaXMgImJsb2NrIDAiICovCisJCQlibG9ja19uciA9IDA7CisJCX0KKworCX0gZWxzZSB7IC8qIHRmdHAgKi8KKwkJLyogT3BlbiBmaWxlIChtdXN0IGJlIGFmdGVyIGNoYW5naW5nIHVzZXIpICovCisJCWxvY2FsX2ZkID0gQ01EX0dFVChvcHRpb25fbWFzazMyKSA/IFNURE9VVF9GSUxFTk8gOiBTVERJTl9GSUxFTk87CisJCWlmIChOT1RfTE9ORV9EQVNIKGxvY2FsX2ZpbGUpKQorCQkJbG9jYWxfZmQgPSB4b3Blbihsb2NhbF9maWxlLCBvcGVuX21vZGUpOworLyogUmVtb3ZpbmcgI2lmLCBvciB1c2luZyBpZigpIHN0YXRlbWVudCBpbnN0ZWFkIG9mICNpZiBtYXkgbGVhZCB0bworICogIndhcm5pbmc6IG51bGwgYXJndW1lbnQgd2hlcmUgbm9uLW51bGwgcmVxdWlyZWQiOiAqLworI2lmIEVOQUJMRV9URlRQCisJCS8qIHRmdHAgKi8KKworCQkvKiBXZSBjYW4ndCAoYW5kIGRvbid0IHJlYWxseSBuZWVkIHRvKSBiaW5kIHRoZSBzb2NrZXQ6CisJCSAqIHdlIGRvbid0IGtub3cgZnJvbSB3aGljaCBsb2NhbCBJUCBkYXRhZ3JhbXMgd2lsbCBiZSBzZW50LAorCQkgKiBidXQga2VybmVsIHdpbGwgcGljayB0aGUgc2FtZSBJUCBldmVyeSB0aW1lICh1bmxlc3Mgcm91dGluZworCQkgKiB0YWJsZSBpcyBjaGFuZ2VkKSwgdGh1cyBwZWVyIHdpbGwgc2VlIGRncmFtcyBjb25zaXN0ZW50bHkKKwkJICogY29taW5nIGZyb20gdGhlIHNhbWUgSVAuCisJCSAqIFdlIHdvdWxkIGxpa2UgdG8gY29ubmVjdCB0aGUgc29ja2V0LCBidXQgc2luY2UgcGVlcidzCisJCSAqIFVEUCBjb2RlIGNhbiBiZSBsZXNzIHBlcmZlY3QgdGhhbiBvdXJzLCBfcGVlcidzXyBJUDpwb3J0CisJCSAqIGluIHJlcGxpZXMgbWF5IGRpZmZlciBmcm9tIElQOnBvcnQgd2UgdXNlZCB0byBzZW5kCisJCSAqIG91ciBmaXJzdCBwYWNrZXQuIFdlIGNhbiBjb25uZWN0KCkgb25seSB3aGVuIHdlIGdldAorCQkgKiBmaXJzdCByZXBseS4gKi8KKworCQkvKiBidWlsZCBvcGNvZGUgKi8KKwkJb3Bjb2RlID0gVEZUUF9XUlE7CisJCWlmIChDTURfR0VUKG9wdGlvbl9tYXNrMzIpKSB7CisJCQlvcGNvZGUgPSBURlRQX1JSUTsKKwkJfQorCQkvKiBhZGQgZmlsZW5hbWUgYW5kIG1vZGUgKi8KKwkJLyogZmlsbCBpbiBwYWNrZXQgaWYgdGhlIGZpbGVuYW1lIGZpdHMgaW50byB4YnVmICovCisJCWxlbiA9IHN0cmxlbihyZW1vdGVfZmlsZSkgKyAxOworCQlpZiAoMiArIGxlbiArIHNpemVvZigib2N0ZXQiKSA+PSBpb19idWZzaXplKSB7CisJCQliYl9lcnJvcl9tc2coInJlbW90ZSBmaWxlbmFtZSBpcyB0b28gbG9uZyIpOworCQkJZ290byByZXQ7CisJCX0KKwkJc3RyY3B5KGNwLCByZW1vdGVfZmlsZSk7CisJCWNwICs9IGxlbjsKKwkJLyogYWRkICJtb2RlIiBwYXJ0IG9mIHRoZSBwYWNrZXQgKi8KKwkJc3RyY3B5KGNwLCAib2N0ZXQiKTsKKwkJY3AgKz0gc2l6ZW9mKCJvY3RldCIpOworCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJCWlmIChibGtzaXplID09IFRGVFBfQkxLU0laRV9ERUZBVUxUICYmICF3YW50X3RyYW5zZmVyX3NpemUpCisJCQlnb3RvIHNlbmRfcGt0OworCisJCS8qIE5lZWQgdG8gYWRkIG9wdGlvbiB0byBwa3QgKi8KKwkJaWYgKCgmeGJ1Zltpb19idWZzaXplIC0gMV0gLSBjcCkgPCBzaXplb2YoImJsa3NpemUgTk5OTk4gdHNpemUgIikgKyBzaXplb2Yob2ZmX3QpKjMpIHsKKwkJCWJiX2Vycm9yX21zZygicmVtb3RlIGZpbGVuYW1lIGlzIHRvbyBsb25nIik7CisJCQlnb3RvIHJldDsKKwkJfQorCQlleHBlY3RfT0FDSyA9IDE7CisjIGVuZGlmCisjZW5kaWYgLyogRU5BQkxFX1RGVFAgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisgYWRkX2Jsa3NpemVfb3B0OgorCQlpZiAoYmxrc2l6ZSAhPSBURlRQX0JMS1NJWkVfREVGQVVMVCkgeworCQkJLyogYWRkICJibGtzaXplIiwgPG51bD4sIGJsa3NpemUsIDxudWw+ICovCisJCQlzdHJjcHkoY3AsICJibGtzaXplIik7CisJCQljcCArPSBzaXplb2YoImJsa3NpemUiKTsKKwkJCWNwICs9IHNucHJpbnRmKGNwLCA2LCAiJWQiLCBibGtzaXplKSArIDE7CisJCX0KKwkJaWYgKHdhbnRfdHJhbnNmZXJfc2l6ZSkgeworCQkJLyogYWRkICJ0c2l6ZSIsIDxudWw+LCBzaXplLCA8bnVsPiAoc2VlIFJGQzIzNDkpICovCisJCQkvKiBpZiB0ZnRwIGFuZCBkb3dubG9hZGluZywgd2Ugc2VuZCAiMCIgKHNpbmNlIHdlIG9wZW5lZCBsb2NhbF9mZCB3aXRoIE9fVFJVTkMpCisJCQkgKiBhbmQgdGhpcyBtYWtlcyBzZXJ2ZXIgdG8gc2VuZCAidHNpemUiIG9wdGlvbiB3aXRoIHRoZSBzaXplICovCisJCQkvKiBpZiB0ZnRwIGFuZCB1cGxvYWRpbmcsIHdlIHNlbmQgZmlsZSBzaXplIChtYXliZSBkb250LCB0byBub3QgY29uZnVzZSBvbGQgc2VydmVycz8/PykgKi8KKwkJCS8qIGlmIHRmdHBkIGFuZCBkb3dubG9hZGluZywgd2UgYXJlIGFuc3dlcmluZyB0byBjbGllbnQncyByZXF1ZXN0ICovCisJCQkvKiBpZiB0ZnRwZCBhbmQgdXBsb2FkaW5nOiAhd2FudF90cmFuc2Zlcl9zaXplLCB0aGlzIGNvZGUgaXMgbm90IGV4ZWN1dGVkICovCisJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCXN0cmNweShjcCwgInRzaXplIik7CisJCQljcCArPSBzaXplb2YoInRzaXplIik7CisJCQlzdC5zdF9zaXplID0gMDsKKwkJCWZzdGF0KGxvY2FsX2ZkLCAmc3QpOworCQkJY3AgKz0gc3ByaW50ZihjcCwgIiUiT0ZGX0ZNVCJ1IiwgKG9mZl90KXN0LnN0X3NpemUpICsgMTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwkJCS8qIFNhdmUgZm9yIHByb2dyZXNzIGJhci4gSWYgMCAodGZ0cCBkb3dubG9hZGluZyksCisJCQkgKiB3ZSBsb29rIGF0IHNlcnZlcidzIHJlcGx5IGxhdGVyICovCisJCQlHLnNpemUgPSBzdC5zdF9zaXplOworCQkJaWYgKHJlbW90ZV9maWxlICYmIHN0LnN0X3NpemUpCisJCQkJdGZ0cF9wcm9ncmVzc19pbml0KCk7CisjIGVuZGlmCisJCX0KKyNlbmRpZgorCQkvKiBGaXJzdCBwYWNrZXQgaXMgYnVpbHQsIHNvIHNraXAgcGFja2V0IGdlbmVyYXRpb24gKi8KKwkJZ290byBzZW5kX3BrdDsKKwl9CisKKwkvKiBVc2luZyBtb3N0bHkgZ290bydzIC0gY29udGludWUvYnJlYWsgd2lsbCBiZSBsZXNzIGNsZWFyCisJICogaW4gd2hlcmUgd2UgYWN0dWFsbHkganVtcCB0byAqLworCXdoaWxlICgxKSB7CisJCS8qIEJ1aWxkIEFDSyBvciBEQVRBICovCisJCWNwID0geGJ1ZiArIDI7CisJCSooKHVpbnQxNl90KiljcCkgPSBodG9ucyhibG9ja19ucik7CisJCWNwICs9IDI7CisJCWJsb2NrX25yKys7CisJCW9wY29kZSA9IFRGVFBfQUNLOworCQlpZiAoQ01EX1BVVChvcHRpb25fbWFzazMyKSkgeworCQkJb3Bjb2RlID0gVEZUUF9EQVRBOworCQkJbGVuID0gZnVsbF9yZWFkKGxvY2FsX2ZkLCBjcCwgYmxrc2l6ZSk7CisJCQlpZiAobGVuIDwgMCkgeworCQkJCWdvdG8gc2VuZF9yZWFkX2Vycl9wa3Q7CisJCQl9CisJCQlpZiAobGVuICE9IGJsa3NpemUpIHsKKwkJCQlmaW5pc2hlZCA9IDE7CisJCQl9CisJCQljcCArPSBsZW47CisJCQlJRl9GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSKEcucG9zICs9IGxlbjspCisJCX0KKyBzZW5kX3BrdDoKKwkJLyogU2VuZCBwYWNrZXQgKi8KKwkJKigodWludDE2X3QqKXhidWYpID0gaHRvbnMob3Bjb2RlKTsgLyogZmlsbCBpbiBvcGNvZGUgcGFydCAqLworCQlzZW5kX2xlbiA9IGNwIC0geGJ1ZjsKKwkJLyogTkI6IHNlbmRfbGVuIHZhbHVlIGlzIHByZXNlcnZlZCBpbiBjb2RlIGJlbG93CisJCSAqIGZvciBwb3RlbnRpYWwgcmVzZW5kICovCisKKwkJcmV0cmllcyA9IFRGVFBfTlVNX1JFVFJJRVM7ICAvKiByZS1pbml0aWFsaXplICovCisJCXdhaXR0aW1lX21zID0gVEZUUF9USU1FT1VUX01TOworCisgc2VuZF9hZ2FpbjoKKyNpZiBFTkFCTEVfVEZUUF9ERUJVRworCQlmcHJpbnRmKHN0ZGVyciwgInNlbmRpbmcgJXUgYnl0ZXNcbiIsIHNlbmRfbGVuKTsKKwkJZm9yIChjcCA9IHhidWY7IGNwIDwgJnhidWZbc2VuZF9sZW5dOyBjcCsrKQorCQkJZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsICh1bnNpZ25lZCBjaGFyKSAqY3ApOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisjZW5kaWYKKwkJeHNlbmR0byhzb2NrZXRfZmQsIHhidWYsIHNlbmRfbGVuLCAmcGVlcl9sc2EtPnUuc2EsIHBlZXJfbHNhLT5sZW4pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwkJaWYgKGlzX2JiX3Byb2dyZXNzX2luaXRlZCgmRy5wbXQpKQorCQkJdGZ0cF9wcm9ncmVzc191cGRhdGUoKTsKKyNlbmRpZgorCQkvKiBXYXMgaXQgZmluYWwgQUNLPyB0aGVuIGV4aXQgKi8KKwkJaWYgKGZpbmlzaGVkICYmIChvcGNvZGUgPT0gVEZUUF9BQ0spKQorCQkJZ290byByZXQ7CisKKyByZWN2X2FnYWluOgorCQkvKiBSZWNlaXZlIHBhY2tldCAqLworCQkvKnBmZFswXS5mZCA9IHNvY2tldF9mZDsqLworCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQlzd2l0Y2ggKHNhZmVfcG9sbChwZmQsIDEsIHdhaXR0aW1lX21zKSkgeworCQlkZWZhdWx0OgorCQkJLypiYl9wZXJyb3JfbXNnKCJwb2xsIik7IC0gZG9uZSBpbiBzYWZlX3BvbGwgKi8KKwkJCWdvdG8gcmV0OworCQljYXNlIDA6CisJCQlyZXRyaWVzLS07CisJCQlpZiAocmV0cmllcyA9PSAwKSB7CisJCQkJdGZ0cF9wcm9ncmVzc19kb25lKCk7CisJCQkJYmJfZXJyb3JfbXNnKCJ0aW1lb3V0Iik7CisJCQkJZ290byByZXQ7IC8qIG5vIGVyciBwYWNrZXQgc2VudCAqLworCQkJfQorCisJCQkvKiBleHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggbGltaXQgKi8KKwkJCXdhaXR0aW1lX21zICs9IHdhaXR0aW1lX21zLzI7CisJCQlpZiAod2FpdHRpbWVfbXMgPiBURlRQX01BWFRJTUVPVVRfTVMpIHsKKwkJCQl3YWl0dGltZV9tcyA9IFRGVFBfTUFYVElNRU9VVF9NUzsKKwkJCX0KKworCQkJZ290byBzZW5kX2FnYWluOyAvKiByZXNlbmQgbGFzdCBzZW50IHBrdCAqLworCQljYXNlIDE6CisJCQlpZiAoIW91cl9sc2EpIHsKKwkJCQkvKiB0ZnRwIChub3QgdGZ0cGQhKSByZWNlaXZpbmcgMXN0IHBhY2tldCAqLworCQkJCW91cl9sc2EgPSAoKHZvaWQqKShwdHJkaWZmX3QpLTEpOyAvKiBub3QgTlVMTCAqLworCQkJCWxlbiA9IHJlY3Zmcm9tKHNvY2tldF9mZCwgcmJ1ZiwgaW9fYnVmc2l6ZSwgMCwKKwkJCQkJCSZwZWVyX2xzYS0+dS5zYSwgJnBlZXJfbHNhLT5sZW4pOworCQkJCS8qIE91ciBmaXJzdCBkZ3JhbSB3ZW50IHRvIHBvcnQgNjkKKwkJCQkgKiBidXQgcmVwbHkgbWF5IGNvbWUgZnJvbSBkaWZmZXJlbnQgb25lLgorCQkJCSAqIFJlbWVtYmVyIGFuZCB1c2UgdGhpcyBuZXcgcG9ydCAoYW5kIElQKSAqLworCQkJCWlmIChsZW4gPj0gMCkKKwkJCQkJeGNvbm5lY3Qoc29ja2V0X2ZkLCAmcGVlcl9sc2EtPnUuc2EsIHBlZXJfbHNhLT5sZW4pOworCQkJfSBlbHNlIHsKKwkJCQkvKiB0ZnRwZCwgb3Igbm90IHRoZSB2ZXJ5IGZpcnN0IHBhY2tldDoKKwkJCQkgKiBzb2NrZXQgaXMgY29ubmVjdCgpZWQsIGNhbiBqdXN0IHJlYWQgZnJvbSBpdC4gKi8KKwkJCQkvKiBEb24ndCBmdWxsX3JlYWQoKSEKKwkJCQkgKiBUaGlzIGlzIG5vdCBUQ1AsIG9uZSByZWFkID09IG9uZSBwa3QhICovCisJCQkJbGVuID0gc2FmZV9yZWFkKHNvY2tldF9mZCwgcmJ1ZiwgaW9fYnVmc2l6ZSk7CisJCQl9CisJCQlpZiAobGVuIDwgMCkgeworCQkJCWdvdG8gc2VuZF9yZWFkX2Vycl9wa3Q7CisJCQl9CisJCQlpZiAobGVuIDwgNCkgeyAvKiB0b28gc21hbGw/ICovCisJCQkJZ290byByZWN2X2FnYWluOworCQkJfQorCQl9CisKKwkJLyogUHJvY2VzcyByZWN2J2VkIHBhY2tldCAqLworCQlvcGNvZGUgPSBudG9ocyggKCh1aW50MTZfdCopcmJ1ZilbMF0gKTsKKwkJcmVjdl9ibGsgPSBudG9ocyggKCh1aW50MTZfdCopcmJ1ZilbMV0gKTsKKyNpZiBFTkFCTEVfVEZUUF9ERUJVRworCQlmcHJpbnRmKHN0ZGVyciwgInJlY2VpdmVkICVkIGJ5dGVzOiAlMDR4ICUwNHhcbiIsIGxlbiwgb3Bjb2RlLCByZWN2X2Jsayk7CisjZW5kaWYKKwkJaWYgKG9wY29kZSA9PSBURlRQX0VSUk9SKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBlcnJjb2RlX3N0cltdIEFMSUdOMSA9CisJCQkJIlwwIgorCQkJCSJmaWxlIG5vdCBmb3VuZFwwIgorCQkJCSJhY2Nlc3MgdmlvbGF0aW9uXDAiCisJCQkJImRpc2sgZnVsbFwwIgorCQkJCSJiYWQgb3BlcmF0aW9uXDAiCisJCQkJInVua25vd24gdHJhbnNmZXIgaWRcMCIKKwkJCQkiZmlsZSBhbHJlYWR5IGV4aXN0c1wwIgorCQkJCSJubyBzdWNoIHVzZXJcMCIKKwkJCQkiYmFkIG9wdGlvbiI7CisKKwkJCWNvbnN0IGNoYXIgKm1zZyA9ICIiOworCisJCQlpZiAobGVuID4gNCAmJiByYnVmWzRdICE9ICdcMCcpIHsKKwkJCQltc2cgPSAmcmJ1Zls0XTsKKwkJCQlyYnVmW2lvX2J1ZnNpemUgLSAxXSA9ICdcMCc7IC8qIHBhcmFub2lhICovCisJCQl9IGVsc2UgaWYgKHJlY3ZfYmxrIDw9IDgpIHsKKwkJCQltc2cgPSBudGhfc3RyaW5nKGVycmNvZGVfc3RyLCByZWN2X2Jsayk7CisJCQl9CisJCQliYl9lcnJvcl9tc2coInNlcnZlciBlcnJvcjogKCV1KSAlcyIsIHJlY3ZfYmxrLCBtc2cpOworCQkJZ290byByZXQ7CisJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJCWlmIChleHBlY3RfT0FDSykgeworCQkJZXhwZWN0X09BQ0sgPSAwOworCQkJaWYgKG9wY29kZSA9PSBURlRQX09BQ0spIHsKKwkJCQkvKiBzZXJ2ZXIgc2VlbXMgdG8gc3VwcG9ydCBvcHRpb25zICovCisJCQkJY2hhciAqcmVzOworCisJCQkJcmVzID0gdGZ0cF9nZXRfb3B0aW9uKCJibGtzaXplIiwgJnJidWZbMl0sIGxlbiAtIDIpOworCQkJCWlmIChyZXMpIHsKKwkJCQkJYmxrc2l6ZSA9IHRmdHBfYmxrc2l6ZV9jaGVjayhyZXMsIGJsa3NpemUpOworCQkJCQlpZiAoYmxrc2l6ZSA8IDApIHsKKwkJCQkJCWVycm9yX3BrdF9yZWFzb24gPSBFUlJfQkFEX09QVDsKKwkJCQkJCWdvdG8gc2VuZF9lcnJfcGt0OworCQkJCQl9CisJCQkJCWlvX2J1ZnNpemUgPSBibGtzaXplICsgNDsKKwkJCQl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSCisJCQkJaWYgKHJlbW90ZV9maWxlICYmIEcuc2l6ZSA9PSAwKSB7IC8qIGlmIHdlIGRvbid0IGtub3cgaXQgeWV0ICovCisJCQkJCXJlcyA9IHRmdHBfZ2V0X29wdGlvbigidHNpemUiLCAmcmJ1ZlsyXSwgbGVuIC0gMik7CisJCQkJCWlmIChyZXMpIHsKKwkJCQkJCUcuc2l6ZSA9IGJiX3N0cnRvdWxsKHJlcywgTlVMTCwgMTApOworCQkJCQkJaWYgKEcuc2l6ZSkKKwkJCQkJCQl0ZnRwX3Byb2dyZXNzX2luaXQoKTsKKwkJCQkJfQorCQkJCX0KKyMgZW5kaWYKKwkJCQlpZiAoQ01EX0dFVChvcHRpb25fbWFzazMyKSkgeworCQkJCQkvKiBXZSdsbCBzZW5kIEFDSyBmb3IgT0FDSywKKwkJCQkJICogc3VjaCBBQ0sgaGFzICJibG9jayBubyIgb2YgMCAqLworCQkJCQlibG9ja19uciA9IDA7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogcmZjMjM0NzoKKwkJCSAqICJBbiBvcHRpb24gbm90IGFja25vd2xlZGdlZCBieSB0aGUgc2VydmVyCisJCQkgKiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIGNsaWVudCBhbmQgc2VydmVyCisJCQkgKiBhcyBpZiBpdCB3ZXJlIG5ldmVyIHJlcXVlc3RlZC4iICovCisJCQlpZiAoYmxrc2l6ZSAhPSBURlRQX0JMS1NJWkVfREVGQVVMVCkKKwkJCQliYl9lcnJvcl9tc2coImZhbGxpbmcgYmFjayB0byBibG9ja3NpemUgIlRGVFBfQkxLU0laRV9ERUZBVUxUX1NUUik7CisJCQlibGtzaXplID0gVEZUUF9CTEtTSVpFX0RFRkFVTFQ7CisJCQlpb19idWZzaXplID0gVEZUUF9CTEtTSVpFX0RFRkFVTFQgKyA0OworCQl9CisjZW5kaWYKKwkJLyogYmxvY2tfbnIgaXMgYWxyZWFkeSBhZHZhbmNlZCB0byBuZXh0IGJsb2NrIyB3ZSBleHBlY3QKKwkJICogdG8gZ2V0IC8gYmxvY2sjIHdlIGFyZSBhYm91dCB0byBzZW5kIG5leHQgdGltZSAqLworCisJCWlmIChDTURfR0VUKG9wdGlvbl9tYXNrMzIpICYmIChvcGNvZGUgPT0gVEZUUF9EQVRBKSkgeworCQkJaWYgKHJlY3ZfYmxrID09IGJsb2NrX25yKSB7CisJCQkJaW50IHN6ID0gZnVsbF93cml0ZShsb2NhbF9mZCwgJnJidWZbNF0sIGxlbiAtIDQpOworCQkJCWlmIChzeiAhPSBsZW4gLSA0KSB7CisJCQkJCXN0cmNweSgoY2hhciopZXJyb3JfcGt0X3N0ciwgYmJfbXNnX3dyaXRlX2Vycm9yKTsKKwkJCQkJZXJyb3JfcGt0X3JlYXNvbiA9IEVSUl9XUklURTsKKwkJCQkJZ290byBzZW5kX2Vycl9wa3Q7CisJCQkJfQorCQkJCWlmIChzeiAhPSBibGtzaXplKSB7CisJCQkJCWZpbmlzaGVkID0gMTsKKwkJCQl9CisJCQkJSUZfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUihHLnBvcyArPSBzejspCisJCQkJY29udGludWU7IC8qIHNlbmQgQUNLICovCisJCQl9CisvKiBEaXNhYmxlZCB0byBjb3BlIHdpdGggc2VydmVycyB3aXRoIFNvcmNlcmVyJ3MgQXBwcmVudGljZSBTeW5kcm9tZSAqLworI2lmIDAKKwkJCWlmIChyZWN2X2JsayA9PSAoYmxvY2tfbnIgLSAxKSkgeworCQkJCS8qIFNlcnZlciBsb3N0IG91ciBURlRQX0FDSy4gIFJlc2VuZCBpdCAqLworCQkJCWJsb2NrX25yID0gcmVjdl9ibGs7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWlmIChDTURfUFVUKG9wdGlvbl9tYXNrMzIpICYmIChvcGNvZGUgPT0gVEZUUF9BQ0spKSB7CisJCQkvKiBkaWQgcGVlciBBQ0sgb3VyIGxhc3QgREFUQSBwa3Q/ICovCisJCQlpZiAocmVjdl9ibGsgPT0gKHVpbnQxNl90KSAoYmxvY2tfbnIgLSAxKSkgeworCQkJCWlmIChmaW5pc2hlZCkKKwkJCQkJZ290byByZXQ7CisJCQkJY29udGludWU7IC8qIHNlbmQgbmV4dCBibG9jayAqLworCQkJfQorCQl9CisJCS8qIEF3d3cuLi4gcmVjdidkIHBhY2tldCBpcyBub3QgcmVjb2duaXplZCEgKi8KKwkJZ290byByZWN2X2FnYWluOworCQkvKiB3aHkgcmVjdl9hZ2Fpbj8gLSByZmMxMTIzIHNheXM6CisJCSAqICJUaGUgc2VuZGVyIChpLmUuLCB0aGUgc2lkZSBvcmlnaW5hdGluZyB0aGUgREFUQSBwYWNrZXRzKQorCQkgKiAgbXVzdCBuZXZlciByZXNlbmQgdGhlIGN1cnJlbnQgREFUQSBwYWNrZXQgb24gcmVjZWlwdAorCQkgKiAgb2YgYSBkdXBsaWNhdGUgQUNLIi4KKwkJICogREFUQSBwa3RzIGFyZSByZXNlbnQgT05MWSBvbiB0aW1lb3V0LgorCQkgKiBUaHVzICJnb3RvIHNlbmRfYWdhaW4iIHdpbGwgYmEgYSBiYWQgbWlzdGFrZSBhYm92ZS4KKwkJICogU2VlOgorCQkgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NvcmNlcmVyJ3NfQXBwcmVudGljZV9TeW5kcm9tZQorCQkgKi8KKwl9IC8qIGVuZCBvZiAid2hpbGUgKDEpIiAqLworIHJldDoKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UobG9jYWxfZmQpOworCQljbG9zZShzb2NrZXRfZmQpOworCQlmcmVlKHhidWYpOworCQlmcmVlKHJidWYpOworCX0KKwlyZXR1cm4gZmluaXNoZWQgPT0gMDsgLyogcmV0dXJucyAxIG9uIGZhaWx1cmUgKi8KKworIHNlbmRfcmVhZF9lcnJfcGt0OgorCXN0cmNweSgoY2hhciopZXJyb3JfcGt0X3N0ciwgYmJfbXNnX3JlYWRfZXJyb3IpOworIHNlbmRfZXJyX3BrdDoKKwlpZiAoZXJyb3JfcGt0X3N0clswXSkKKwkJYmJfZXJyb3JfbXNnKCIlcyIsIChjaGFyKillcnJvcl9wa3Rfc3RyKTsKKwllcnJvcl9wa3RbMV0gPSBURlRQX0VSUk9SOworCXhzZW5kdG8oc29ja2V0X2ZkLCBlcnJvcl9wa3QsIDQgKyAxICsgc3RybGVuKChjaGFyKillcnJvcl9wa3Rfc3RyKSwKKwkJCSZwZWVyX2xzYS0+dS5zYSwgcGVlcl9sc2EtPmxlbik7CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyN1bmRlZiByZW1vdGVfZmlsZQorfQorCisjaWYgRU5BQkxFX1RGVFAKKworaW50IHRmdHBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRmdHBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWxlbl9hbmRfc29ja2FkZHIgKnBlZXJfbHNhOworCWNvbnN0IGNoYXIgKmxvY2FsX2ZpbGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnJlbW90ZV9maWxlID0gTlVMTDsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUKKwljb25zdCBjaGFyICpibGtzaXplX3N0ciA9IFRGVFBfQkxLU0laRV9ERUZBVUxUX1NUUjsKKwlpbnQgYmxrc2l6ZTsKKyMgZW5kaWYKKwlpbnQgcmVzdWx0OworCWludCBwb3J0OworCUlGX0dFVFBVVChpbnQgb3B0OykKKworCUlOSVRfRygpOworCisJLyogLXAgb3IgLWcgaXMgbWFuZGF0b3J5LCBhbmQgdGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiIiBJRl9GRUFUVVJFX1RGVFBfR0VUKCJnOiIpIElGX0ZFQVRVUkVfVEZUUF9QVVQoInA6IikKKwkJCUlGX0dFVFBVVCgiZy0tcDpwLS1nOiIpOworCisJSUZfR0VUUFVUKG9wdCA9KSBnZXRvcHQzMihhcmd2LAorCQkJSUZfRkVBVFVSRV9URlRQX0dFVCgiZyIpIElGX0ZFQVRVUkVfVEZUUF9QVVQoInAiKQorCQkJCSJsOnI6IiBJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKCJiOiIpLAorCQkJJmxvY2FsX2ZpbGUsICZyZW1vdGVfZmlsZQorCQkJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgsICZibGtzaXplX3N0cikpOworCWFyZ3YgKz0gb3B0aW5kOworCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJLyogQ2hlY2sgaWYgdGhlIGJsa3NpemUgaXMgdmFsaWQ6CisJICogUkZDMjM0OCBzYXlzIGJldHdlZW4gOCBhbmQgNjU0NjQgKi8KKwlibGtzaXplID0gdGZ0cF9ibGtzaXplX2NoZWNrKGJsa3NpemVfc3RyLCA2NTU2NCk7CisJaWYgKGJsa3NpemUgPCAwKSB7CisJCS8vYmJfZXJyb3JfbXNnKCJiYWQgYmxvY2sgc2l6ZSIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKyMgZW5kaWYKKworCWlmIChyZW1vdGVfZmlsZSkgeworCQlpZiAoIWxvY2FsX2ZpbGUpIHsKKwkJCWNvbnN0IGNoYXIgKnNsYXNoID0gc3RycmNocihyZW1vdGVfZmlsZSwgJy8nKTsKKwkJCWxvY2FsX2ZpbGUgPSBzbGFzaCA/IHNsYXNoICsgMSA6IHJlbW90ZV9maWxlOworCQl9CisJfSBlbHNlIHsKKwkJcmVtb3RlX2ZpbGUgPSBsb2NhbF9maWxlOworCX0KKworCS8qIEVycm9yIGlmIGZpbGVuYW1lIG9yIGhvc3QgaXMgbm90IGtub3duICovCisJaWYgKCFyZW1vdGVfZmlsZSB8fCAhYXJndlswXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJcG9ydCA9IGJiX2xvb2t1cF9wb3J0KGFyZ3ZbMV0sICJ1ZHAiLCA2OSk7CisJcGVlcl9sc2EgPSB4aG9zdDJzb2NrYWRkcihhcmd2WzBdLCBwb3J0KTsKKworIyBpZiBFTkFCTEVfVEZUUF9ERUJVRworCWZwcmludGYoc3RkZXJyLCAidXNpbmcgc2VydmVyICclcycsIHJlbW90ZV9maWxlICclcycsIGxvY2FsX2ZpbGUgJyVzJ1xuIiwKKwkJCXhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZwZWVyX2xzYS0+dS5zYSksCisJCQlyZW1vdGVfZmlsZSwgbG9jYWxfZmlsZSk7CisjIGVuZGlmCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwlHLmZpbGUgPSByZW1vdGVfZmlsZTsKKyMgZW5kaWYKKwlyZXN1bHQgPSB0ZnRwX3Byb3RvY29sKAorCQlOVUxMIC8qb3VyX2xzYSovLCBwZWVyX2xzYSwKKwkJbG9jYWxfZmlsZSwgcmVtb3RlX2ZpbGUKKwkJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgsIDEgLyogd2FudF90cmFuc2Zlcl9zaXplICovKQorCQlJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKCwgYmxrc2l6ZSkKKwkpOworCXRmdHBfcHJvZ3Jlc3NfZG9uZSgpOworCisJaWYgKHJlc3VsdCAhPSBFWElUX1NVQ0NFU1MgJiYgTk9UX0xPTkVfREFTSChsb2NhbF9maWxlKSAmJiBDTURfR0VUKG9wdCkpIHsKKwkJdW5saW5rKGxvY2FsX2ZpbGUpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYgLyogRU5BQkxFX1RGVFAgKi8KKworI2lmIEVOQUJMRV9URlRQRAoraW50IHRmdHBkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0ZnRwZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqb3VyX2xzYTsKKwlsZW5fYW5kX3NvY2thZGRyICpwZWVyX2xzYTsKKwljaGFyICpsb2NhbF9maWxlLCAqbW9kZTsKKwljb25zdCBjaGFyICplcnJvcl9tc2c7CisJaW50IG9wdCwgcmVzdWx0LCBvcGNvZGU7CisJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRShpbnQgYmxrc2l6ZSA9IFRGVFBfQkxLU0laRV9ERUZBVUxUOykKKwlJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKGludCB3YW50X3RyYW5zZmVyX3NpemUgPSAwOykKKworCUlOSVRfRygpOworCisJb3VyX2xzYSA9IGdldF9zb2NrX2xzYShTVERJTl9GSUxFTk8pOworCWlmICghb3VyX2xzYSkgeworCQkvKiBUaGlzIGlzIGNvbmZ1c2luZzoKKwkJICpiYl9lcnJvcl9tc2dfYW5kX2RpZSgic3RkaW4gaXMgbm90IGEgc29ja2V0Iik7CisJCSAqIEJldHRlcjogKi8KKwkJYmJfc2hvd191c2FnZSgpOworCQkvKiBIZWxwIHRleHQgc2F5cyB0aGF0IHRmdHBkIG11c3QgYmUgdXNlZCBhcyBpbmV0ZCBzZXJ2aWNlLAorCQkgKiB3aGljaCBpcyBieSBmYXIgdGhlIG1vc3QgdXN1YWwgY2F1c2Ugb2YgZ2V0X3NvY2tfbHNhCisJCSAqIGZhaWx1cmUgKi8KKwl9CisJcGVlcl9sc2EgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIG91cl9sc2EtPmxlbik7CisJcGVlcl9sc2EtPmxlbiA9IG91cl9sc2EtPmxlbjsKKworCS8qIFNoaWZ0aW5nIHRvIG5vdCBjb2xsaWRlIHdpdGggVEZUUF9PUFRzICovCisJb3B0ID0gb3B0aW9uX21hc2szMiA9IFRGVFBEX09QVCB8IChnZXRvcHQzMihhcmd2LCAicmN1OmwiLCAmdXNlcl9vcHQpIDw8IDgpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiBURlRQRF9PUFRfbCkgeworCQlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworCX0KKwlpZiAoYXJndlswXSkKKwkJeGNoZGlyKGFyZ3ZbMF0pOworCisJcmVzdWx0ID0gcmVjdl9mcm9tX3RvKFNURElOX0ZJTEVOTywgYmxvY2tfYnVmLCBzaXplb2YoYmxvY2tfYnVmKSwKKwkJCTAgLyogZmxhZ3MgKi8sCisJCQkmcGVlcl9sc2EtPnUuc2EsICZvdXJfbHNhLT51LnNhLCBvdXJfbHNhLT5sZW4pOworCisJZXJyb3JfbXNnID0gIm1hbGZvcm1lZCBwYWNrZXQiOworCW9wY29kZSA9IG50b2hzKCoodWludDE2X3QqKWJsb2NrX2J1Zik7CisJaWYgKHJlc3VsdCA8IDQgfHwgcmVzdWx0ID49IHNpemVvZihibG9ja19idWYpCisJIHx8IGJsb2NrX2J1ZltyZXN1bHQtMV0gIT0gJ1wwJworCSB8fCAoSUZfRkVBVFVSRV9URlRQX1BVVChvcGNvZGUgIT0gVEZUUF9SUlEpIC8qIG5vdCBkb3dubG9hZCAqLworCSAgICAgSUZfR0VUUFVUKCYmKQorCSAgICAgSUZfRkVBVFVSRV9URlRQX0dFVChvcGNvZGUgIT0gVEZUUF9XUlEpIC8qIG5vdCB1cGxvYWQgKi8KKwkgICAgKQorCSkgeworCQlnb3RvIGVycjsKKwl9CisJbG9jYWxfZmlsZSA9IGJsb2NrX2J1ZiArIDI7CisJaWYgKGxvY2FsX2ZpbGVbMF0gPT0gJy4nIHx8IHN0cnN0cihsb2NhbF9maWxlLCAiLy4iKSkgeworCQllcnJvcl9tc2cgPSAiZG90IGluIGZpbGUgbmFtZSI7CisJCWdvdG8gZXJyOworCX0KKwltb2RlID0gbG9jYWxfZmlsZSArIHN0cmxlbihsb2NhbF9maWxlKSArIDE7CisJLyogUkZDIDEzNTAgc2F5cyBtb2RlIHN0cmluZyBpcyBjYXNlIGluZGVwZW5kZW50ICovCisJaWYgKG1vZGUgPj0gYmxvY2tfYnVmICsgcmVzdWx0IHx8IHN0cmNhc2VjbXAobW9kZSwgIm9jdGV0IikgIT0gMCkgeworCQlnb3RvIGVycjsKKwl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJeworCQljaGFyICpyZXM7CisJCWNoYXIgKm9wdF9zdHIgPSBtb2RlICsgc2l6ZW9mKCJvY3RldCIpOworCQlpbnQgb3B0X2xlbiA9IGJsb2NrX2J1ZiArIHJlc3VsdCAtIG9wdF9zdHI7CisJCWlmIChvcHRfbGVuID4gMCkgeworCQkJcmVzID0gdGZ0cF9nZXRfb3B0aW9uKCJibGtzaXplIiwgb3B0X3N0ciwgb3B0X2xlbik7CisJCQlpZiAocmVzKSB7CisJCQkJYmxrc2l6ZSA9IHRmdHBfYmxrc2l6ZV9jaGVjayhyZXMsIDY1NTY0KTsKKwkJCQlpZiAoYmxrc2l6ZSA8IDApIHsKKwkJCQkJZXJyb3JfcGt0X3JlYXNvbiA9IEVSUl9CQURfT1BUOworCQkJCQkvKiB3aWxsIGp1c3Qgc2VuZCBlcnJvciBwa3QgKi8KKwkJCQkJZ290byBkb19wcm90bzsKKwkJCQl9CisJCQl9CisJCQlpZiAob3Bjb2RlICE9IFRGVFBfV1JRIC8qIGRvd25sb2FkPyAqLworCQkJLyogZGlkIGNsaWVudCBhc2sgdXMgYWJvdXQgZmlsZSBzaXplPyAqLworCQkJICYmIHRmdHBfZ2V0X29wdGlvbigidHNpemUiLCBvcHRfc3RyLCBvcHRfbGVuKQorCQkJKSB7CisJCQkJd2FudF90cmFuc2Zlcl9zaXplID0gMTsKKwkJCX0KKwkJfQorCX0KKyMgZW5kaWYKKworCWlmICghRU5BQkxFX0ZFQVRVUkVfVEZUUF9QVVQgfHwgb3Bjb2RlID09IFRGVFBfV1JRKSB7CisJCWlmIChvcHQgJiBURlRQRF9PUFRfcikgeworCQkJLyogVGhpcyB3b3VsZCBtZWFuICJkaXNrIGZ1bGwiIC0gbm90IHRydWUgKi8KKwkJCS8qZXJyb3JfcGt0X3JlYXNvbiA9IEVSUl9XUklURTsqLworCQkJZXJyb3JfbXNnID0gYmJfbXNnX3dyaXRlX2Vycm9yOworCQkJZ290byBlcnI7CisJCX0KKwkJSUZfR0VUUFVUKG9wdGlvbl9tYXNrMzIgfD0gVEZUUF9PUFRfR0VUOykgLyogd2lsbCByZWNlaXZlIGZpbGUncyBkYXRhICovCisJfSBlbHNlIHsKKwkJSUZfR0VUUFVUKG9wdGlvbl9tYXNrMzIgfD0gVEZUUF9PUFRfUFVUOykgLyogd2lsbCBzZW5kIGZpbGUncyBkYXRhICovCisJfQorCisJLyogTkI6IGlmIGVycm9yX3BrdF9zdHIgb3IgZXJyb3JfcGt0X3JlYXNvbiBpcyBzZXQgdXAsCisJICogdGZ0cF9wcm90b2NvbCgpIGp1c3Qgc2VuZHMgb25lIGVycm9yIHBrdCBhbmQgcmV0dXJucyAqLworCisgZG9fcHJvdG86CisJY2xvc2UoU1RESU5fRklMRU5PKTsgLyogY2xvc2Ugb2xkLCBwb3NzaWJseSB3aWxkY2FyZCBzb2NrZXQgKi8KKwkvKiB0ZnRwX3Byb3RvY29sKCkgd2lsbCBjcmVhdGUgbmV3IG9uZSwgYm91bmQgdG8gcGFydGljdWxhciBsb2NhbCBJUCAqLworCXJlc3VsdCA9IHRmdHBfcHJvdG9jb2woCisJCW91cl9sc2EsIHBlZXJfbHNhLAorCQlsb2NhbF9maWxlIElGX1RGVFAoLCBOVUxMIC8qcmVtb3RlX2ZpbGUqLykKKwkJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgsIHdhbnRfdHJhbnNmZXJfc2l6ZSkKKwkJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgsIGJsa3NpemUpCisJKTsKKworCXJldHVybiByZXN1bHQ7CisgZXJyOgorCXN0cmNweSgoY2hhciopZXJyb3JfcGt0X3N0ciwgZXJyb3JfbXNnKTsKKwlnb3RvIGRvX3Byb3RvOworfQorCisjZW5kaWYgLyogRU5BQkxFX1RGVFBEICovCisKKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9URlRQX0dFVCB8fCBFTkFCTEVfRkVBVFVSRV9URlRQX1BVVCAqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90cmFjZXJvdXRlLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3RyYWNlcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzIxMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90cmFjZXJvdXRlLmMKQEAgLTAsMCArMSwxMjY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTEsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQnVzeWJveCBwb3J0IGJ5IFZsYWRpbWlyIE9sZXluaWsgKEMpIDIwMDUgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyoKKyAqCXRyYWNlcm91dGU2CisgKgorICogICAgICBNb2RpZmllZCBmb3IgTlJMIDQuNEJTRCBJUHY2IHJlbGVhc2UuCisgKiAgICAgIDA3LzMxLzk2IGJncAorICoKKyAqCU1vZGlmaWVkIGZvciBMaW51eCBJUHY2IGJ5IFBlZHJvIFJvcXVlIDxyb3F1ZUBkaS5mYy51bC5wdD4KKyAqCTMxLzA3LzE5OTYKKyAqCisgKglBcyBJQ01QIGVycm9yIG1lc3NhZ2VzIGZvciBJUHY2IG5vdyBpbmNsdWRlIG1vcmUgdGhhbiA4IGJ5dGVzCisgKglVRFAgZGF0YWdyYW1zIGFyZSBub3cgc2VudCB2aWEgYW4gVURQIHNvY2tldCBpbnN0ZWFkIG9mIG1hZ2ljCisgKglSQVcgc29ja2V0IHRyaWNrcy4KKyAqCisgKglDb252ZXJ0ZWQgdG8gYnVzeWJveCBhcHBsZXQgYnkgTGVvbmlkIExpc292c2tpeSA8bGx5QHNmLm5ldD4KKyAqCTIwMDktMTEtMTYKKyAqLworCisvKgorICogdHJhY2Vyb3V0ZSBob3N0ICAtIHRyYWNlIHRoZSByb3V0ZSBpcCBwYWNrZXRzIGZvbGxvdyBnb2luZyB0byAiaG9zdCIuCisgKgorICogQXR0ZW1wdCB0byB0cmFjZSB0aGUgcm91dGUgYW4gaXAgcGFja2V0IHdvdWxkIGZvbGxvdyB0byBzb21lCisgKiBpbnRlcm5ldCBob3N0LiAgV2UgZmluZCBvdXQgaW50ZXJtZWRpYXRlIGhvcHMgYnkgbGF1bmNoaW5nIHByb2JlCisgKiBwYWNrZXRzIHdpdGggYSBzbWFsbCB0dGwgKHRpbWUgdG8gbGl2ZSkgdGhlbiBsaXN0ZW5pbmcgZm9yIGFuCisgKiBpY21wICJ0aW1lIGV4Y2VlZGVkIiByZXBseSBmcm9tIGEgZ2F0ZXdheS4gIFdlIHN0YXJ0IG91ciBwcm9iZXMKKyAqIHdpdGggYSB0dGwgb2Ygb25lIGFuZCBpbmNyZWFzZSBieSBvbmUgdW50aWwgd2UgZ2V0IGFuIGljbXAgInBvcnQKKyAqIHVucmVhY2hhYmxlIiAod2hpY2ggbWVhbnMgd2UgZ290IHRvICJob3N0Iikgb3IgaGl0IGEgbWF4ICh3aGljaAorICogZGVmYXVsdHMgdG8gMzAgaG9wcyAmIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlIC1tIGZsYWcpLiAgVGhyZWUKKyAqIHByb2JlcyAoY2hhbmdlIHdpdGggLXEgZmxhZykgYXJlIHNlbnQgYXQgZWFjaCB0dGwgc2V0dGluZyBhbmQgYQorICogbGluZSBpcyBwcmludGVkIHNob3dpbmcgdGhlIHR0bCwgYWRkcmVzcyBvZiB0aGUgZ2F0ZXdheSBhbmQKKyAqIHJvdW5kIHRyaXAgdGltZSBvZiBlYWNoIHByb2JlLiAgSWYgdGhlIHByb2JlIGFuc3dlcnMgY29tZSBmcm9tCisgKiBkaWZmZXJlbnQgZ2F0ZXdheXMsIHRoZSBhZGRyZXNzIG9mIGVhY2ggcmVzcG9uZGluZyBzeXN0ZW0gd2lsbAorICogYmUgcHJpbnRlZC4gIElmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHdpdGhpbiBhIDUgc2VjLiB0aW1lb3V0CisgKiBpbnRlcnZhbCAoY2hhbmdlZCB3aXRoIHRoZSAtdyBmbGFnKSwgYSAiKiIgaXMgcHJpbnRlZCBmb3IgdGhhdAorICogcHJvYmUuCisgKgorICogUHJvYmUgcGFja2V0cyBhcmUgVURQIGZvcm1hdC4gIFdlIGRvbid0IHdhbnQgdGhlIGRlc3RpbmF0aW9uCisgKiBob3N0IHRvIHByb2Nlc3MgdGhlbSBzbyB0aGUgZGVzdGluYXRpb24gcG9ydCBpcyBzZXQgdG8gYW4KKyAqIHVubGlrZWx5IHZhbHVlIChpZiBzb21lIGNsb2Qgb24gdGhlIGRlc3RpbmF0aW9uIGlzIHVzaW5nIHRoYXQKKyAqIHZhbHVlLCBpdCBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoZSAtcCBmbGFnKS4KKyAqCisgKiBBIHNhbXBsZSB1c2UgbWlnaHQgYmU6CisgKgorICogICAgIFt5YWsgNzFdJSB0cmFjZXJvdXRlIG5pcy5uc2YubmV0LgorICogICAgIHRyYWNlcm91dGUgdG8gbmlzLm5zZi5uZXQgKDM1LjEuMS40OCksIDMwIGhvcHMgbWF4LCA1NiBieXRlIHBhY2tldAorICogICAgICAxICBoZWxpb3MuZWUubGJsLmdvdiAoMTI4LjMuMTEyLjEpICAxOSBtcyAgMTkgbXMgIDAgbXMKKyAqICAgICAgMiAgbGlsYWMtZG1jLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjIxNi4xKSAgMzkgbXMgIDM5IG1zICAxOSBtcworICogICAgICAzICBsaWxhYy1kbWMuQmVya2VsZXkuRURVICgxMjguMzIuMjE2LjEpICAzOSBtcyAgMzkgbXMgIDE5IG1zCisgKiAgICAgIDQgIGNjbmd3LW5lci1jYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4xMzYuMjMpICAzOSBtcyAgNDAgbXMgIDM5IG1zCisgKiAgICAgIDUgIGNjbi1uZXJpZjIyLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjE2OC4yMikgIDM5IG1zICAzOSBtcyAgMzkgbXMKKyAqICAgICAgNiAgMTI4LjMyLjE5Ny40ICgxMjguMzIuMTk3LjQpICA0MCBtcyAgNTkgbXMgIDU5IG1zCisgKiAgICAgIDcgIDEzMS4xMTkuMi41ICgxMzEuMTE5LjIuNSkgIDU5IG1zICA1OSBtcyAgNTkgbXMKKyAqICAgICAgOCAgMTI5LjE0MC43MC4xMyAoMTI5LjE0MC43MC4xMykgIDk5IG1zICA5OSBtcyAgODAgbXMKKyAqICAgICAgOSAgMTI5LjE0MC43MS42ICgxMjkuMTQwLjcxLjYpICAxMzkgbXMgIDIzOSBtcyAgMzE5IG1zCisgKiAgICAgMTAgIDEyOS4xNDAuODEuNyAoMTI5LjE0MC44MS43KSAgMjIwIG1zICAxOTkgbXMgIDE5OSBtcworICogICAgIDExICBuaWMubWVyaXQuZWR1ICgzNS4xLjEuNDgpICAyMzkgbXMgIDIzOSBtcyAgMjM5IG1zCisgKgorICogTm90ZSB0aGF0IGxpbmVzIDIgJiAzIGFyZSB0aGUgc2FtZS4gIFRoaXMgaXMgZHVlIHRvIGEgYnVnZ3kKKyAqIGtlcm5lbCBvbiB0aGUgMm5kIGhvcCBzeXN0ZW0gLS0gbGJsLWNzYW0uYXJwYSAtLSB0aGF0IGZvcndhcmRzCisgKiBwYWNrZXRzIHdpdGggYSB6ZXJvIHR0bC4KKyAqCisgKiBBIG1vcmUgaW50ZXJlc3RpbmcgZXhhbXBsZSBpczoKKyAqCisgKiAgICAgW3lhayA3Ml0lIHRyYWNlcm91dGUgYWxsc3BpY2UubGNzLm1pdC5lZHUuCisgKiAgICAgdHJhY2Vyb3V0ZSB0byBhbGxzcGljZS5sY3MubWl0LmVkdSAoMTguMjYuMC4xMTUpLCAzMCBob3BzIG1heAorICogICAgICAxICBoZWxpb3MuZWUubGJsLmdvdiAoMTI4LjMuMTEyLjEpICAwIG1zICAwIG1zICAwIG1zCisgKiAgICAgIDIgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDE5IG1zICAxOSBtcyAgMTkgbXMKKyAqICAgICAgMyAgbGlsYWMtZG1jLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjIxNi4xKSAgMzkgbXMgIDE5IG1zICAxOSBtcworICogICAgICA0ICBjY25ndy1uZXItY2MuQmVya2VsZXkuRURVICgxMjguMzIuMTM2LjIzKSAgMTkgbXMgIDM5IG1zICAzOSBtcworICogICAgICA1ICBjY24tbmVyaWYyMi5CZXJrZWxleS5FRFUgKDEyOC4zMi4xNjguMjIpICAyMCBtcyAgMzkgbXMgIDM5IG1zCisgKiAgICAgIDYgIDEyOC4zMi4xOTcuNCAoMTI4LjMyLjE5Ny40KSAgNTkgbXMgIDExOSBtcyAgMzkgbXMKKyAqICAgICAgNyAgMTMxLjExOS4yLjUgKDEzMS4xMTkuMi41KSAgNTkgbXMgIDU5IG1zICAzOSBtcworICogICAgICA4ICAxMjkuMTQwLjcwLjEzICgxMjkuMTQwLjcwLjEzKSAgODAgbXMgIDc5IG1zICA5OSBtcworICogICAgICA5ICAxMjkuMTQwLjcxLjYgKDEyOS4xNDAuNzEuNikgIDEzOSBtcyAgMTM5IG1zICAxNTkgbXMKKyAqICAgICAxMCAgMTI5LjE0MC44MS43ICgxMjkuMTQwLjgxLjcpICAxOTkgbXMgIDE4MCBtcyAgMzAwIG1zCisgKiAgICAgMTEgIDEyOS4xNDAuNzIuMTcgKDEyOS4xNDAuNzIuMTcpICAzMDAgbXMgIDIzOSBtcyAgMjM5IG1zCisgKiAgICAgMTIgICogKiAqCisgKiAgICAgMTMgIDEyOC4xMjEuNTQuNzIgKDEyOC4xMjEuNTQuNzIpICAyNTkgbXMgIDQ5OSBtcyAgMjc5IG1zCisgKiAgICAgMTQgICogKiAqCisgKiAgICAgMTUgICogKiAqCisgKiAgICAgMTYgICogKiAqCisgKiAgICAgMTcgICogKiAqCisgKiAgICAgMTggIEFMTFNQSUNFLkxDUy5NSVQuRURVICgxOC4yNi4wLjExNSkgIDMzOSBtcyAgMjc5IG1zICAyNzkgbXMKKyAqCisgKiAoSSBzdGFydCB0byBzZWUgd2h5IEknbSBoYXZpbmcgc28gbXVjaCB0cm91YmxlIHdpdGggbWFpbCB0bworICogTUlULikgIE5vdGUgdGhhdCB0aGUgZ2F0ZXdheXMgMTIsIDE0LCAxNSwgMTYgJiAxNyBob3BzIGF3YXkKKyAqIGVpdGhlciBkb24ndCBzZW5kIElDTVAgInRpbWUgZXhjZWVkZWQiIG1lc3NhZ2VzIG9yIHNlbmQgdGhlbQorICogd2l0aCBhIHR0bCB0b28gc21hbGwgdG8gcmVhY2ggdXMuICAxNCAtIDE3IGFyZSBydW5uaW5nIHRoZQorICogTUlUIEMgR2F0ZXdheSBjb2RlIHRoYXQgZG9lc24ndCBzZW5kICJ0aW1lIGV4Y2VlZGVkInMuICBHb2QKKyAqIG9ubHkga25vd3Mgd2hhdCdzIGdvaW5nIG9uIHdpdGggMTIuCisgKgorICogVGhlIHNpbGVudCBnYXRld2F5IDEyIGluIHRoZSBhYm92ZSBtYXkgYmUgdGhlIHJlc3VsdCBvZiBhIGJ1ZyBpbgorICogdGhlIDQuWzIzXUJTRCBuZXR3b3JrIGNvZGUgKGFuZCBpdHMgZGVyaXZhdGl2ZXMpOiAgNC54ICh4IDw9IDMpCisgKiBzZW5kcyBhbiB1bnJlYWNoYWJsZSBtZXNzYWdlIHVzaW5nIHdoYXRldmVyIHR0bCByZW1haW5zIGluIHRoZQorICogb3JpZ2luYWwgZGF0YWdyYW0uICBTaW5jZSwgZm9yIGdhdGV3YXlzLCB0aGUgcmVtYWluaW5nIHR0bCBpcworICogemVybywgdGhlIGljbXAgInRpbWUgZXhjZWVkZWQiIGlzIGd1YXJhbnRlZWQgdG8gbm90IG1ha2UgaXQgYmFjaworICogdG8gdXMuICBUaGUgYmVoYXZpb3Igb2YgdGhpcyBidWcgaXMgc2xpZ2h0bHkgbW9yZSBpbnRlcmVzdGluZworICogd2hlbiBpdCBhcHBlYXJzIG9uIHRoZSBkZXN0aW5hdGlvbiBzeXN0ZW06CisgKgorICogICAgICAxICBoZWxpb3MuZWUubGJsLmdvdiAoMTI4LjMuMTEyLjEpICAwIG1zICAwIG1zICAwIG1zCisgKiAgICAgIDIgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDM5IG1zICAxOSBtcyAgMzkgbXMKKyAqICAgICAgMyAgbGlsYWMtZG1jLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjIxNi4xKSAgMTkgbXMgIDM5IG1zICAxOSBtcworICogICAgICA0ICBjY25ndy1uZXItY2MuQmVya2VsZXkuRURVICgxMjguMzIuMTM2LjIzKSAgMzkgbXMgIDQwIG1zICAxOSBtcworICogICAgICA1ICBjY24tbmVyaWYzNS5CZXJrZWxleS5FRFUgKDEyOC4zMi4xNjguMzUpICAzOSBtcyAgMzkgbXMgIDM5IG1zCisgKiAgICAgIDYgIGNzZ3cuQmVya2VsZXkuRURVICgxMjguMzIuMTMzLjI1NCkgIDM5IG1zICA1OSBtcyAgMzkgbXMKKyAqICAgICAgNyAgKiAqICoKKyAqICAgICAgOCAgKiAqICoKKyAqICAgICAgOSAgKiAqICoKKyAqICAgICAxMCAgKiAqICoKKyAqICAgICAxMSAgKiAqICoKKyAqICAgICAxMiAgKiAqICoKKyAqICAgICAxMyAgcmlwLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjEzMS4yMikgIDU5IG1zICEgIDM5IG1zICEgIDM5IG1zICEKKyAqCisgKiBOb3RpY2UgdGhhdCB0aGVyZSBhcmUgMTIgImdhdGV3YXlzIiAoMTMgaXMgdGhlIGZpbmFsCisgKiBkZXN0aW5hdGlvbikgYW5kIGV4YWN0bHkgdGhlIGxhc3QgaGFsZiBvZiB0aGVtIGFyZSAibWlzc2luZyIuCisgKiBXaGF0J3MgcmVhbGx5IGhhcHBlbmluZyBpcyB0aGF0IHJpcCAoYSBTdW4tMyBydW5uaW5nIFN1biBPUzMuNSkKKyAqIGlzIHVzaW5nIHRoZSB0dGwgZnJvbSBvdXIgYXJyaXZpbmcgZGF0YWdyYW0gYXMgdGhlIHR0bCBpbiBpdHMKKyAqIGljbXAgcmVwbHkuICBTbywgdGhlIHJlcGx5IHdpbGwgdGltZSBvdXQgb24gdGhlIHJldHVybiBwYXRoCisgKiAod2l0aCBubyBub3RpY2Ugc2VudCB0byBhbnlvbmUgc2luY2UgaWNtcCdzIGFyZW4ndCBzZW50IGZvcgorICogaWNtcCdzKSB1bnRpbCB3ZSBwcm9iZSB3aXRoIGEgdHRsIHRoYXQncyBhdCBsZWFzdCB0d2ljZSB0aGUgcGF0aAorICogbGVuZ3RoLiAgSS5lLiwgcmlwIGlzIHJlYWxseSBvbmx5IDcgaG9wcyBhd2F5LiAgQSByZXBseSB0aGF0CisgKiByZXR1cm5zIHdpdGggYSB0dGwgb2YgMSBpcyBhIGNsdWUgdGhpcyBwcm9ibGVtIGV4aXN0cy4KKyAqIFRyYWNlcm91dGUgcHJpbnRzIGEgIiEiIGFmdGVyIHRoZSB0aW1lIGlmIHRoZSB0dGwgaXMgPD0gMS4KKyAqIFNpbmNlIHZlbmRvcnMgc2hpcCBhIGxvdCBvZiBvYnNvbGV0ZSAoREVDJ3MgVWx0cml4LCBTdW4gMy54KSBvcgorICogbm9uLXN0YW5kYXJkIChIUFVYKSBzb2Z0d2FyZSwgZXhwZWN0IHRvIHNlZSB0aGlzIHByb2JsZW0KKyAqIGZyZXF1ZW50bHkgYW5kL29yIHRha2UgY2FyZSBwaWNraW5nIHRoZSB0YXJnZXQgaG9zdCBvZiB5b3VyCisgKiBwcm9iZXMuCisgKgorICogT3RoZXIgcG9zc2libGUgYW5ub3RhdGlvbnMgYWZ0ZXIgdGhlIHRpbWUgYXJlICFILCAhTiwgIVAgKGdvdCBhIGhvc3QsCisgKiBuZXR3b3JrIG9yIHByb3RvY29sIHVucmVhY2hhYmxlLCByZXNwZWN0aXZlbHkpLCAhUyBvciAhRiAoc291cmNlCisgKiByb3V0ZSBmYWlsZWQgb3IgZnJhZ21lbnRhdGlvbiBuZWVkZWQgLS0gbmVpdGhlciBvZiB0aGVzZSBzaG91bGQKKyAqIGV2ZXIgb2NjdXIgYW5kIHRoZSBhc3NvY2lhdGVkIGdhdGV3YXkgaXMgYnVzdGVkIGlmIHlvdSBzZWUgb25lKS4gIElmCisgKiBhbG1vc3QgYWxsIHRoZSBwcm9iZXMgcmVzdWx0IGluIHNvbWUga2luZCBvZiB1bnJlYWNoYWJsZSwgdHJhY2Vyb3V0ZQorICogd2lsbCBnaXZlIHVwIGFuZCBleGl0LgorICoKKyAqIE5vdGVzCisgKiAtLS0tLQorICogVGhpcyBwcm9ncmFtIG11c3QgYmUgcnVuIGJ5IHJvb3Qgb3IgYmUgc2V0dWlkLiAgKEkgc3VnZ2VzdCB0aGF0CisgKiB5b3UgKmRvbid0KiBtYWtlIGl0IHNldHVpZCAtLSBjYXN1YWwgdXNlIGNvdWxkIHJlc3VsdCBpbiBhIGxvdAorICogb2YgdW5uZWNlc3NhcnkgdHJhZmZpYyBvbiBvdXIgcG9vciwgY29uZ2VzdGVkIG5ldHMuKQorICoKKyAqIFRoaXMgcHJvZ3JhbSByZXF1aXJlcyBhIGtlcm5lbCBtb2QgdGhhdCBkb2VzIG5vdCBhcHBlYXIgaW4gYW55CisgKiBzeXN0ZW0gYXZhaWxhYmxlIGZyb20gQmVya2VsZXk6ICBBIHJhdyBpcCBzb2NrZXQgdXNpbmcgcHJvdG8KKyAqIElQUFJPVE9fUkFXIG11c3QgaW50ZXJwcmV0IHRoZSBkYXRhIHNlbnQgYXMgYW4gaXAgZGF0YWdyYW0gKGFzCisgKiBvcHBvc2VkIHRvIGRhdGEgdG8gYmUgd3JhcHBlZCBpbiBhIGlwIGRhdGFncmFtKS4gIFNlZSB0aGUgUkVBRE1FCisgKiBmaWxlIHRoYXQgY2FtZSB3aXRoIHRoZSBzb3VyY2UgdG8gdGhpcyBwcm9ncmFtIGZvciBhIGRlc2NyaXB0aW9uCisgKiBvZiB0aGUgbW9kcyBJIG1hZGUgdG8gL3N5cy9uZXRpbmV0L3Jhd19pcC5jLiAgWW91ciBtaWxlYWdlIG1heQorICogdmFyeS4gIEJ1dCwgYWdhaW4sIEFOWSA0LnggKHggPCA0KSBCU0QgS0VSTkVMIFdJTEwgSEFWRSBUTyBCRQorICogTU9ESUZJRUQgVE8gUlVOIFRISVMgUFJPR1JBTS4KKyAqCisgKiBUaGUgdWRwIHBvcnQgdXNhZ2UgbWF5IGFwcGVhciBiaXphcnJlICh3ZWxsLCBvaywgaXQgaXMgYml6YXJyZSkuCisgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IGFuIGljbXAgbWVzc2FnZSBvbmx5IGNvbnRhaW5zIDggYnl0ZXMgb2YKKyAqIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YWdyYW0uICA4IGJ5dGVzIGlzIHRoZSBzaXplIG9mIGEgdWRwCisgKiBoZWFkZXIgc28sIGlmIHdlIHdhbnQgdG8gYXNzb2NpYXRlIHJlcGxpZXMgd2l0aCB0aGUgb3JpZ2luYWwKKyAqIGRhdGFncmFtLCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIG11c3QgYmUgZW5jb2RlZCBpbnRvIHRoZQorICogdWRwIGhlYWRlciAodGhlIGlwIGlkIGNvdWxkIGJlIHVzZWQgYnV0IHRoZXJlJ3Mgbm8gd2F5IHRvCisgKiBpbnRlcmxvY2sgd2l0aCB0aGUga2VybmVsJ3MgYXNzaWdubWVudCBvZiBpcCBpZCdzIGFuZCwgYW55d2F5LAorICogaXQgd291bGQgaGF2ZSB0YWtlbiBhIGxvdCBtb3JlIGtlcm5lbCBoYWNraW5nIHRvIGFsbG93IHRoaXMKKyAqIGNvZGUgdG8gc2V0IHRoZSBpcCBpZCkuICBTbywgdG8gYWxsb3cgdHdvIG9yIG1vcmUgdXNlcnMgdG8KKyAqIHVzZSB0cmFjZXJvdXRlIHNpbXVsdGFuZW91c2x5LCB3ZSB1c2UgdGhpcyB0YXNrJ3MgcGlkIGFzIHRoZQorICogc291cmNlIHBvcnQgKHRoZSBoaWdoIGJpdCBpcyBzZXQgdG8gbW92ZSB0aGUgcG9ydCBudW1iZXIgb3V0CisgKiBvZiB0aGUgImxpa2VseSIgcmFuZ2UpLiAgVG8ga2VlcCB0cmFjayBvZiB3aGljaCBwcm9iZSBpcyBiZWluZworICogcmVwbGllZCB0byAoc28gdGltZXMgYW5kL29yIGhvcCBjb3VudHMgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IGEKKyAqIHJlcGx5IHRoYXQgd2FzIGRlbGF5ZWQgaW4gdHJhbnNpdCksIHdlIGluY3JlbWVudCB0aGUgZGVzdGluYXRpb24KKyAqIHBvcnQgbnVtYmVyIGJlZm9yZSBlYWNoIHByb2JlLgorICoKKyAqIERvbid0IHVzZSB0aGlzIGFzIGEgY29kaW5nIGV4YW1wbGUuICBJIHdhcyB0cnlpbmcgdG8gZmluZCBhCisgKiByb3V0aW5nIHByb2JsZW0gYW5kIHRoaXMgY29kZSBzb3J0LW9mIHBvcHBlZCBvdXQgYWZ0ZXIgNDggaG91cnMKKyAqIHdpdGhvdXQgc2xlZXAuICBJIHdhcyBhbWF6ZWQgaXQgZXZlciBjb21waWxlZCwgbXVjaCBsZXNzIHJhbi4KKyAqCisgKiBJIHN0b2xlIHRoZSBpZGVhIGZvciB0aGlzIHByb2dyYW0gZnJvbSBTdGV2ZSBEZWVyaW5nLiAgU2luY2UKKyAqIHRoZSBmaXJzdCByZWxlYXNlLCBJJ3ZlIGxlYXJuZWQgdGhhdCBoYWQgSSBhdHRlbmRlZCB0aGUgcmlnaHQKKyAqIElFVEYgd29ya2luZyBncm91cCBtZWV0aW5ncywgSSBhbHNvIGNvdWxkIGhhdmUgc3RvbGVuIGl0IGZyb20gR3V5CisgKiBBbG1lcyBvciBNYXR0IE1hdGhpcy4gIEkgZG9uJ3Qga25vdyAob3IgY2FyZSkgd2hvIGNhbWUgdXAgd2l0aAorICogdGhlIGlkZWEgZmlyc3QuICBJIGVudnkgdGhlIG9yaWdpbmF0b3JzJyBwZXJzcGljYWNpdHkgYW5kIEknbQorICogZ2xhZCB0aGV5IGRpZG4ndCBrZWVwIHRoZSBpZGVhIGEgc2VjcmV0LgorICoKKyAqIFRpbSBTZWF2ZXIsIEtlbiBBZGVsbWFuIGFuZCBDLiBQaGlsaXAgV29vZCBwcm92aWRlZCBidWcgZml4ZXMgYW5kL29yCisgKiBlbmhhbmNlbWVudHMgdG8gdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBJJ3ZlIGhhY2tlZCB1cCBhIHJvdW5kLXRyaXAtcm91dGUgdmVyc2lvbiBvZiB0aGlzIHRoYXQgd29ya3MgYnkKKyAqIHNlbmRpbmcgYSBsb29zZS1zb3VyY2Utcm91dGVkIHVkcCBkYXRhZ3JhbSB0aHJvdWdoIHRoZSBkZXN0aW5hdGlvbgorICogYmFjayB0byB5b3Vyc2VsZi4gIFVuZm9ydHVuYXRlbHksIFNPIG1hbnkgZ2F0ZXdheXMgYm90Y2ggc291cmNlCisgKiByb3V0aW5nLCB0aGUgdGhpbmcgaXMgYWxtb3N0IHdvcnRobGVzcy4gIE1heWJlIG9uZSBkYXkuLi4KKyAqCisgKiAgLS0gVmFuIEphY29ic29uICh2YW5AZWUubGJsLmdvdikKKyAqICAgICBUdWUgRGVjIDIwIDAzOjUwOjEzIFBTVCAxOTg4CisgKi8KKworLy91c2FnZTojZGVmaW5lIHRyYWNlcm91dGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstIklGX1RSQUNFUk9VVEU2KCI0NiIpIkZJbGRucnZdIFstZiAxU1RfVFRMXSBbLW0gTUFYVFRMXSBbLXAgUE9SVF0gWy1xIFBST0JFU11cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy1zIFNSQ19JUF0gWy10IFRPU10gWy13IFdBSVRfU0VDXSBbLWcgR0FURVdBWV0gWy1pIElGQUNFXVxuIgorLy91c2FnZTogICAgICAgIglbLXogUEFVU0VfTVNFQ10gSE9TVCBbQllURVNdIgorLy91c2FnZTojZGVmaW5lIHRyYWNlcm91dGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJUcmFjZSB0aGUgcm91dGUgdG8gSE9TVFxuIgorLy91c2FnZToJSUZfVFJBQ0VST1VURTYoCisvL3VzYWdlOiAgICAgIlxuCS00LC02CUZvcmNlIElQIG9yIElQdjYgbmFtZSByZXNvbHV0aW9uIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktRglTZXQgdGhlIGRvbid0IGZyYWdtZW50IGJpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLUkJVXNlIElDTVAgRUNITyBpbnN0ZWFkIG9mIFVEUCBkYXRhZ3JhbXMiCisvL3VzYWdlOiAgICAgIlxuCS1sCURpc3BsYXkgdGhlIFRUTCB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgcGFja2V0IgorLy91c2FnZTogICAgICJcbgktZAlTZXQgU09fREVCVUcgb3B0aW9ucyB0byBzb2NrZXQiCisvL3VzYWdlOiAgICAgIlxuCS1uCVByaW50IG51bWVyaWMgYWRkcmVzc2VzIgorLy91c2FnZTogICAgICJcbgktcglCeXBhc3Mgcm91dGluZyB0YWJsZXMsIHNlbmQgZGlyZWN0bHkgdG8gSE9TVCIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JTWF4IHRpbWUtdG8tbGl2ZSAobWF4IG51bWJlciBvZiBob3BzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJQmFzZSBVRFAgcG9ydCBudW1iZXIgdXNlZCBpbiBwcm9iZXMiCisvL3VzYWdlOiAgICAgIlxuCQkoZGVmYXVsdCAzMzQzNCkiCisvL3VzYWdlOiAgICAgIlxuCS1xCU51bWJlciBvZiBwcm9iZXMgcGVyIFRUTCAoZGVmYXVsdCAzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJSVAgYWRkcmVzcyB0byB1c2UgYXMgdGhlIHNvdXJjZSBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbgktdAlUeXBlLW9mLXNlcnZpY2UgaW4gcHJvYmUgcGFja2V0cyAoZGVmYXVsdCAwKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJVGltZSBpbiBzZWNvbmRzIHRvIHdhaXQgZm9yIGEgcmVzcG9uc2UgKGRlZmF1bHQgMykiCisvL3VzYWdlOiAgICAgIlxuCS1nCUxvb3NlIHNvdXJjZSByb3V0ZSBnYXRld2F5ICg4IG1heCkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRyYWNlcm91dGU2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWRucnZdIFstbSBNQVhUVExdIFstcCBQT1JUXSBbLXEgUFJPQkVTXVxuIgorLy91c2FnZTogICAgICAgIglbLXMgU1JDX0lQXSBbLXQgVE9TXSBbLXcgV0FJVF9TRUNdIFstaSBJRkFDRV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJSE9TVCBbQllURVNdIgorLy91c2FnZTojZGVmaW5lIHRyYWNlcm91dGU2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhY2UgdGhlIHJvdXRlIHRvIEhPU1RcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJU2V0IFNPX0RFQlVHIG9wdGlvbnMgdG8gc29ja2V0IgorLy91c2FnZTogICAgICJcbgktbglQcmludCBudW1lcmljIGFkZHJlc3NlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJQnlwYXNzIHJvdXRpbmcgdGFibGVzLCBzZW5kIGRpcmVjdGx5IHRvIEhPU1QiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1tCU1heCB0aW1lLXRvLWxpdmUgKG1heCBudW1iZXIgb2YgaG9wcykiCisvL3VzYWdlOiAgICAgIlxuCS1wCUJhc2UgVURQIHBvcnQgbnVtYmVyIHVzZWQgaW4gcHJvYmVzIgorLy91c2FnZTogICAgICJcbgkJKGRlZmF1bHQgaXMgMzM0MzQpIgorLy91c2FnZTogICAgICJcbgktcQlOdW1iZXIgb2YgcHJvYmVzIHBlciBUVEwgKGRlZmF1bHQgMykiCisvL3VzYWdlOiAgICAgIlxuCS1zCUlQIGFkZHJlc3MgdG8gdXNlIGFzIHRoZSBzb3VyY2UgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJVHlwZS1vZi1zZXJ2aWNlIGluIHByb2JlIHBhY2tldHMgKGRlZmF1bHQgMCkiCisvL3VzYWdlOiAgICAgIlxuCS13CVRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIHJlc3BvbnNlIChkZWZhdWx0IDMpIgorCisjZGVmaW5lIFRSQUNFUk9VVEVfU09fREVCVUcgMAorCisvKiBUT0RPOiB1bmRlZnMgd2VyZSB1bmNvbW1lbnRlZCAtID8/ISB3ZSBoYXZlIGNvbmZpZyBzeXN0ZW0gZm9yIHRoYXQhICovCisvKiBwcm9iYWJseSBvayB0byByZW1vdmUgYWx0b2dldGhlciAqLworLy8jdW5kZWYgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisvLyNkZWZpbmUgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisvLyN1bmRlZiBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURQorLy8jZGVmaW5lIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFCisvLyN1bmRlZiBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QCisvLyNkZWZpbmUgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUAorCisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorIyBpbmNsdWRlIDxuZXRpbmV0L2lwNi5oPgorIyBpbmNsdWRlIDxuZXRpbmV0L2ljbXA2Lmg+CisjIGlmbmRlZiBTT0xfSVBWNgorIyAgZGVmaW5lIFNPTF9JUFY2IElQUFJPVE9fSVBWNgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisKKyNpZm5kZWYgSVBQUk9UT19JQ01QCisjIGRlZmluZSBJUFBST1RPX0lDTVAgMQorI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fSVAKKyMgZGVmaW5lIElQUFJPVE9fSVAgMAorI2VuZGlmCisKKworI2RlZmluZSBPUFRfU1RSSU5HICJGSWxucmR2eHQ6aTptOnA6cTpzOnc6ejpmOiIgXAorCQkgICAgSUZfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSgiZzoiKSBcCisJCSAgICAiNCIgSUZfVFJBQ0VST1VURTYoIjYiKQorZW51bSB7CisJT1BUX0RPTlRfRlJBR01OVCA9ICgxIDw8IDApLCAgICAvKiBGICovCisJT1BUX1VTRV9JQ01QICAgICA9ICgxIDw8IDEpICogRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCwgLyogSSAqLworCU9QVF9UVExfRkxBRyAgICAgPSAoMSA8PCAyKSwgICAgLyogbCAqLworCU9QVF9BRERSX05VTSAgICAgPSAoMSA8PCAzKSwgICAgLyogbiAqLworCU9QVF9CWVBBU1NfUk9VVEUgPSAoMSA8PCA0KSwgICAgLyogciAqLworCU9QVF9ERUJVRyAgICAgICAgPSAoMSA8PCA1KSwgICAgLyogZCAqLworCU9QVF9WRVJCT1NFICAgICAgPSAoMSA8PCA2KSAqIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRSwgLyogdiAqLworCU9QVF9JUF9DSEtTVU0gICAgPSAoMSA8PCA3KSwgICAgLyogeCAqLworCU9QVF9UT1MgICAgICAgICAgPSAoMSA8PCA4KSwgICAgLyogdCAqLworCU9QVF9ERVZJQ0UgICAgICAgPSAoMSA8PCA5KSwgICAgLyogaSAqLworCU9QVF9NQVhfVFRMICAgICAgPSAoMSA8PCAxMCksICAgLyogbSAqLworCU9QVF9QT1JUICAgICAgICAgPSAoMSA8PCAxMSksICAgLyogcCAqLworCU9QVF9OUFJPQkVTICAgICAgPSAoMSA8PCAxMiksICAgLyogcSAqLworCU9QVF9TT1VSQ0UgICAgICAgPSAoMSA8PCAxMyksICAgLyogcyAqLworCU9QVF9XQUlUVElNRSAgICAgPSAoMSA8PCAxNCksICAgLyogdyAqLworCU9QVF9QQVVTRV9NUyAgICAgPSAoMSA8PCAxNSksICAgLyogeiAqLworCU9QVF9GSVJTVF9UVEwgICAgPSAoMSA8PCAxNiksICAgLyogZiAqLworCU9QVF9TT1VSQ0VfUk9VVEUgPSAoMSA8PCAxNykgKiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSwgLyogZyAqLworCU9QVF9JUFY0ICAgICAgICAgPSAoMSA8PCAoMTcrRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUpKSwgICAvKiA0ICovCisJT1BUX0lQVjYgICAgICAgICA9ICgxIDw8ICgxOCtFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSkpICogRU5BQkxFX1RSQUNFUk9VVEU2LCAvKiA2ICovCit9OworI2RlZmluZSB2ZXJib3NlIChvcHRpb25fbWFzazMyICYgT1BUX1ZFUkJPU0UpCisKK2VudW0geworCVNJWkVPRl9JQ01QX0hEUiA9IDgsCisJcmN2c29jayA9IDMsIC8qIHJlY2VpdmUgKGljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KKwlzbmRzb2NrID0gNCwgLyogc2VuZCAodWRwL2ljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KK307CisKKy8qIERhdGEgc2VjdGlvbiBvZiB0aGUgcHJvYmUgcGFja2V0ICovCitzdHJ1Y3Qgb3V0ZGF0YV90IHsKKwl1bnNpZ25lZCBjaGFyIHNlcTsgICAgICAgICAgICAgLyogc2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgcGFja2V0ICovCisJdW5zaWduZWQgY2hhciB0dGw7ICAgICAgICAgICAgIC8qIHR0bCBwYWNrZXQgbGVmdCB3aXRoICovCisvLyBVTlVTRUQuIFJldGFpbmluZyB0byBoYXZlIHRoZSBzYW1lIHBhY2tldCBzaXplLgorCXN0cnVjdCB0aW1ldmFsIHR2X1VOVVNFRCBQQUNLRUQ7IC8qIHRpbWUgcGFja2V0IGxlZnQgKi8KK307CisKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKK3N0cnVjdCBvdXRkYXRhNl90IHsKKwl1aW50MzJfdCBpZGVudDY7CisJdWludDMyX3Qgc2VxNjsKKwlzdHJ1Y3QgdGltZXZhbCB0dl9VTlVTRUQgUEFDS0VEOyAvKiB0aW1lIHBhY2tldCBsZWZ0ICovCit9OworI2VuZGlmCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3QgaXAgKm91dGlwOworCXN0cnVjdCBvdXRkYXRhX3QgKm91dGRhdGE7CisJbGVuX2FuZF9zb2NrYWRkciAqZGVzdF9sc2E7CisJaW50IHBhY2tsZW47ICAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCBsZW5ndGggb2YgcGFja2V0ICovCisJaW50IHBtdHU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXRoIE1UVSBEaXNjb3ZlcnkgKFJGQzExOTEpICovCisJdWludDMyX3QgaWRlbnQ7CisJdWludDE2X3QgcG9ydDsgLy8gMzI3NjggKyA2NjY7ICAvKiBzdGFydCB1ZHAgZGVzdCBwb3J0ICMgZm9yIHByb2JlIHBhY2tldHMgKi8KKwlpbnQgd2FpdHRpbWU7IC8vIDU7ICAgICAgICAgICAgIC8qIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKGluIHNlY29uZHMpICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKwlpbnQgb3B0bGVuOyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBpcCBvcHRpb25zICovCisjZWxzZQorI2RlZmluZSBvcHRsZW4gMAorI2VuZGlmCisJdW5zaWduZWQgY2hhciByZWN2X3BrdFs1MTJdOyAgICAvKiBsYXN0IGluYm91bmQgKGljbXApIHBhY2tldCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFCisJLyogTWF4aW11bSBudW1iZXIgb2YgZ2F0ZXdheXMgKGluY2x1ZGUgcm9vbSBmb3Igb25lIG5vb3ApICovCisjZGVmaW5lIE5HQVRFV0FZUyAoKGludCkoKE1BWF9JUE9QVExFTiAtIElQT1BUX01JTk9GRiAtIDEpIC8gc2l6ZW9mKHVpbnQzMl90KSkpCisJLyogbG9vc2Ugc291cmNlIHJvdXRlIGdhdGV3YXkgbGlzdCAoaW5jbHVkaW5nIHJvb20gZm9yIGZpbmFsIGRlc3RpbmF0aW9uKSAqLworCXVpbnQzMl90IGd3bGlzdFtOR0FURVdBWVMgKyAxXTsKKyNlbmRpZgorfTsKKworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIG91dGlwICAgICAoRy5vdXRpcCAgICApCisjZGVmaW5lIG91dGRhdGEgICAoRy5vdXRkYXRhICApCisjZGVmaW5lIGRlc3RfbHNhICAoRy5kZXN0X2xzYSApCisjZGVmaW5lIHBhY2tsZW4gICAoRy5wYWNrbGVuICApCisjZGVmaW5lIHBtdHUgICAgICAoRy5wbXR1ICAgICApCisjZGVmaW5lIGlkZW50ICAgICAoRy5pZGVudCAgICApCisjZGVmaW5lIHBvcnQgICAgICAoRy5wb3J0ICAgICApCisjZGVmaW5lIHdhaXR0aW1lICAoRy53YWl0dGltZSApCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKyMgZGVmaW5lIG9wdGxlbiAgIChHLm9wdGxlbiAgICkKKyNlbmRpZgorI2RlZmluZSByZWN2X3BrdCAgKEcucmVjdl9wa3QgKQorI2RlZmluZSBnd2xpc3QgICAgKEcuZ3dsaXN0ICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCXBvcnQgPSAzMjc2OCArIDY2NjsgXAorCXdhaXR0aW1lID0gNTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBvdXRpY21wICgoc3RydWN0IGljbXAgKikob3V0aXAgKyAxKSkKKyNkZWZpbmUgb3V0dWRwICAoKHN0cnVjdCB1ZHBoZHIgKikob3V0aXAgKyAxKSkKKworCisvKiBsaWJiYiBjYW5kaWRhdGU/IHRmdHAgdXNlcyB0aGlzIGlkaW9tIHRvbyAqLworc3RhdGljIGxlbl9hbmRfc29ja2FkZHIqIGR1cF9zb2NrYWRkcihjb25zdCBsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqbmV3X2xzYSA9IHh6YWxsb2MoTFNBX0xFTl9TSVpFICsgbHNhLT5sZW4pOworCW1lbWNweShuZXdfbHNhLCBsc2EsIExTQV9MRU5fU0laRSArIGxzYS0+bGVuKTsKKwlyZXR1cm4gbmV3X2xzYTsKK30KKworCitzdGF0aWMgaW50Cit3YWl0X2Zvcl9yZXBseShsZW5fYW5kX3NvY2thZGRyICpmcm9tX2xzYSwgc3RydWN0IHNvY2thZGRyICp0bywgdW5zaWduZWQgKnRpbWVzdGFtcF91cywgaW50ICpsZWZ0X21zKQoreworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworCWludCByZWFkX2xlbiA9IDA7CisKKwlwZmRbMF0uZmQgPSByY3Zzb2NrOworCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJaWYgKCpsZWZ0X21zID49IDAgJiYgc2FmZV9wb2xsKHBmZCwgMSwgKmxlZnRfbXMpID4gMCkgeworCQl1bnNpZ25lZCB0OworCisJCXJlYWRfbGVuID0gcmVjdl9mcm9tX3RvKHJjdnNvY2ssCisJCQkJcmVjdl9wa3QsIHNpemVvZihyZWN2X3BrdCksCisJCQkJLypmbGFnczoqLyBNU0dfRE9OVFdBSVQsCisJCQkJJmZyb21fbHNhLT51LnNhLCB0bywgZnJvbV9sc2EtPmxlbik7CisJCXQgPSBtb25vdG9uaWNfdXMoKTsKKwkJKmxlZnRfbXMgLT0gKHQgLSAqdGltZXN0YW1wX3VzKSAvIDEwMDA7CisJCSp0aW1lc3RhbXBfdXMgPSB0OworCX0KKworCXJldHVybiByZWFkX2xlbjsKK30KKworLyoKKyAqIENoZWNrc3VtIHJvdXRpbmUgZm9yIEludGVybmV0IFByb3RvY29sIGZhbWlseSBoZWFkZXJzIChDIFZlcnNpb24pCisgKi8KK3N0YXRpYyB1aW50MTZfdAoraW5fY2tzdW0odWludDE2X3QgKmFkZHIsIGludCBsZW4pCit7CisJaW50IG5sZWZ0ID0gbGVuOworCXVpbnQxNl90ICp3ID0gYWRkcjsKKwl1aW50MTZfdCBhbnN3ZXI7CisJaW50IHN1bSA9IDA7CisKKwkvKgorCSAqIE91ciBhbGdvcml0aG0gaXMgc2ltcGxlLCB1c2luZyBhIDMyIGJpdCBhY2N1bXVsYXRvciAoc3VtKSwKKwkgKiB3ZSBhZGQgc2VxdWVudGlhbCAxNiBiaXQgd29yZHMgdG8gaXQsIGFuZCBhdCB0aGUgZW5kLCBmb2xkCisJICogYmFjayBhbGwgdGhlIGNhcnJ5IGJpdHMgZnJvbSB0aGUgdG9wIDE2IGJpdHMgaW50byB0aGUgbG93ZXIKKwkgKiAxNiBiaXRzLgorCSAqLworCXdoaWxlIChubGVmdCA+IDEpIHsKKwkJc3VtICs9ICp3Kys7CisJCW5sZWZ0IC09IDI7CisJfQorCisJLyogbW9wIHVwIGFuIG9kZCBieXRlLCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAobmxlZnQgPT0gMSkKKwkJc3VtICs9ICoodW5zaWduZWQgY2hhciAqKXc7CisKKwkvKiBhZGQgYmFjayBjYXJyeSBvdXRzIGZyb20gdG9wIDE2IGJpdHMgdG8gbG93IDE2IGJpdHMgKi8KKwlzdW0gPSAoc3VtID4+IDE2KSArIChzdW0gJiAweGZmZmYpOyAgICAgLyogYWRkIGhpIDE2IHRvIGxvdyAxNiAqLworCXN1bSArPSAoc3VtID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgY2FycnkgKi8KKwlhbnN3ZXIgPSB+c3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ1bmNhdGUgdG8gMTYgYml0cyAqLworCXJldHVybiBhbnN3ZXI7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX3Byb2JlKGludCBzZXEsIGludCB0dGwpCit7CisJaW50IGxlbiwgcmVzOworCXZvaWQgKm91dDsKKworCS8qIFBheWxvYWQgKi8KKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKKwlpZiAoZGVzdF9sc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXN0cnVjdCBvdXRkYXRhNl90ICpwa3QgPSAoc3RydWN0IG91dGRhdGE2X3QgKikgb3V0aXA7CisJCXBrdC0+aWRlbnQ2ID0gaHRvbmwoaWRlbnQpOworCQlwa3QtPnNlcTYgICA9IGh0b25sKHNlcSk7CisJCS8qZ2V0dGltZW9mZGF5KCZwa3QtPnR2LCAmdHopOyovCisJfSBlbHNlCisjZW5kaWYKKwl7CisJCW91dGRhdGEtPnNlcSA9IHNlcTsKKwkJb3V0ZGF0YS0+dHRsID0gdHRsOworLy8gVU5VU0VEOiB3YXMgc3RvcmluZyBnZXR0aW1lb2ZkYXkncyByZXN1bHQgdGhlcmUsIGJ1dCBuZXZlciBldmVyIGNoZWNrZWQgaXQKKwkJLyptZW1jcHkoJm91dGRhdGEtPnR2LCB0cCwgc2l6ZW9mKG91dGRhdGEtPnR2KSk7Ki8KKworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9VU0VfSUNNUCkgeworCQkJb3V0aWNtcC0+aWNtcF9zZXEgPSBodG9ucyhzZXEpOworCisJCQkvKiBBbHdheXMgY2FsY3VsYXRlIGNoZWNrc3VtIGZvciBpY21wIHBhY2tldHMgKi8KKwkJCW91dGljbXAtPmljbXBfY2tzdW0gPSAwOworCQkJb3V0aWNtcC0+aWNtcF9ja3N1bSA9IGluX2Nrc3VtKCh1aW50MTZfdCAqKW91dGljbXAsCisJCQkJCQlwYWNrbGVuIC0gKHNpemVvZigqb3V0aXApICsgb3B0bGVuKSk7CisJCQlpZiAob3V0aWNtcC0+aWNtcF9ja3N1bSA9PSAwKQorCQkJCW91dGljbXAtPmljbXBfY2tzdW0gPSAweGZmZmY7CisJCX0KKwl9CisKKy8vQlVHISB2ZXJib3NlIGlzICh4ICYgT1BUX1ZFUkJPU0UpLCBub3QgYSBjb3VudGVyIQorI2lmIDAgLy9FTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKwkvKiBYWFggdW5kb2N1bWVudGVkIGRlYnVnZ2luZyBoYWNrICovCisJaWYgKHZlcmJvc2UgPiAxKSB7CisJCWNvbnN0IHVpbnQxNl90ICpzcDsKKwkJaW50IG5zaG9ydHMsIGk7CisKKwkJc3AgPSAodWludDE2X3QgKilvdXRpcDsKKwkJbnNob3J0cyA9ICh1bnNpZ25lZClwYWNrbGVuIC8gc2l6ZW9mKHVpbnQxNl90KTsKKwkJaSA9IDA7CisJCXByaW50ZigiWyAlZCBieXRlcyIsIHBhY2tsZW4pOworCQl3aGlsZSAoLS1uc2hvcnRzID49IDApIHsKKwkJCWlmICgoaSsrICUgOCkgPT0gMCkKKwkJCQlwcmludGYoIlxuXHQiKTsKKwkJCXByaW50ZigiICUwNHgiLCBudG9ocygqc3ApKTsKKwkJCXNwKys7CisJCX0KKwkJaWYgKHBhY2tsZW4gJiAxKSB7CisJCQlpZiAoKGkgJSA4KSA9PSAwKQorCQkJCXByaW50ZigiXG5cdCIpOworCQkJcHJpbnRmKCIgJTAyeCIsICoodW5zaWduZWQgY2hhciAqKXNwKTsKKwkJfQorCQlwcmludGYoIl1cbiIpOworCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJaWYgKGRlc3RfbHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlyZXMgPSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9JUFY2LCBJUFY2X1VOSUNBU1RfSE9QUywgJnR0bCwgc2l6ZW9mKHR0bCkpOworCQlpZiAocmVzIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0c29ja29wdCBVTklDQVNUX0hPUFMgJWQiLCB0dGwpOworCQlvdXQgPSBvdXRpcDsKKwkJbGVuID0gcGFja2xlbjsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKyNpZiBkZWZpbmVkIElQX1RUTAorCQlyZXMgPSBzZXRzb2Nrb3B0KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX1RUTCwgJnR0bCwgc2l6ZW9mKHR0bCkpOworCQlpZiAocmVzIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0c29ja29wdCB0dGwgJWQiLCB0dGwpOworI2VuZGlmCisJCW91dCA9IG91dGljbXA7CisJCWxlbiA9IHBhY2tsZW4gLSBzaXplb2YoKm91dGlwKTsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9VU0VfSUNNUCkpIHsKKwkJCW91dCA9IG91dGRhdGE7CisJCQlsZW4gLT0gc2l6ZW9mKCpvdXR1ZHApOworCQkJc2V0X25wb3J0KCZkZXN0X2xzYS0+dS5zYSwgaHRvbnMocG9ydCArIHNlcSkpOworCQl9CisJfQorCisJcmVzID0geHNlbmR0byhzbmRzb2NrLCBvdXQsIGxlbiwgJmRlc3RfbHNhLT51LnNhLCBkZXN0X2xzYS0+bGVuKTsKKwlpZiAocmVzICE9IGxlbikKKwkJYmJfaW5mb19tc2coInNlbnQgJWQgb2N0ZXRzLCByZXQ9JWQiLCBsZW4sIHJlcyk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKy8qCisgKiBDb252ZXJ0IGFuIElDTVAgInR5cGUiIGZpZWxkIHRvIGEgcHJpbnRhYmxlIHN0cmluZy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorcHJfdHlwZSh1bnNpZ25lZCBjaGFyIHQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHR0YWJbXSA9IHsKKwkiRWNobyBSZXBseSIsICAgIklDTVAgMSIsICAgICAgICJJQ01QIDIiLCAgICAgICAiRGVzdCBVbnJlYWNoYWJsZSIsCisJIlNvdXJjZSBRdWVuY2giLCAiUmVkaXJlY3QiLCAgICAiSUNNUCA2IiwgICAgICAgIklDTVAgNyIsCisJIkVjaG8iLCAgICAgICAgICJSb3V0ZXIgQWR2ZXJ0IiwgIlJvdXRlciBTb2xpY2l0IiwgIlRpbWUgRXhjZWVkZWQiLAorCSJQYXJhbSBQcm9ibGVtIiwgIlRpbWVzdGFtcCIsICAgIlRpbWVzdGFtcCBSZXBseSIsICJJbmZvIFJlcXVlc3QiLAorCSJJbmZvIFJlcGx5IiwgICAiTWFzayBSZXF1ZXN0IiwgIk1hc2sgUmVwbHkiCisJfTsKKyMgaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHR0YWI2W10gPSB7CitbMF0JIkVycm9yIiwgIkRlc3QgVW5yZWFjaGFibGUiLCAiUGFja2V0IFRvbyBCaWciLCAiVGltZSBFeGNlZWRlZCIsCitbNF0JIlBhcmFtIFByb2JsZW0iLAorWzhdCSJFY2hvIFJlcXVlc3QiLCAiRWNobyBSZXBseSIsICJNZW1iZXJzaGlwIFF1ZXJ5IiwgIk1lbWJlcnNoaXAgUmVwb3J0IiwKK1sxMl0JIk1lbWJlcnNoaXAgUmVkdWN0aW9uIiwgIlJvdXRlciBTb2xpY2l0IiwgIlJvdXRlciBBZHZlcnQiLCAiTmVpZ2hib3IgU29saWNpdCIsCitbMTZdCSJOZWlnaGJvciBBZHZlcnQiLCAiUmVkaXJlY3QiLAorCX07CisKKwlpZiAoZGVzdF9sc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWlmICh0IDwgNSkKKwkJCXJldHVybiB0dGFiNlt0XTsKKwkJaWYgKHQgPCAxMjggfHwgdCA+IE5EX1JFRElSRUNUKQorCQkJcmV0dXJuICJPVVQtT0YtUkFOR0UiOworCQlyZXR1cm4gdHRhYjZbKHQgJiA2MykgKyA4XTsKKwl9CisjIGVuZGlmCisJaWYgKHQgPj0gQVJSQVlfU0laRSh0dGFiKSkKKwkJcmV0dXJuICJPVVQtT0YtUkFOR0UiOworCisJcmV0dXJuIHR0YWJbdF07Cit9CisjZW5kaWYKKworI2lmICFFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKyNkZWZpbmUgcGFja2V0NF9vayhyZWFkX2xlbiwgZnJvbSwgc2VxKSBcCisJcGFja2V0NF9vayhyZWFkX2xlbiwgc2VxKQorI2VuZGlmCitzdGF0aWMgaW50CitwYWNrZXQ0X29rKGludCByZWFkX2xlbiwgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpmcm9tLCBpbnQgc2VxKQoreworCWNvbnN0IHN0cnVjdCBpY21wICppY3A7CisJdW5zaWduZWQgY2hhciB0eXBlLCBjb2RlOworCWludCBobGVuOworCWNvbnN0IHN0cnVjdCBpcCAqaXA7CisKKwlpcCA9IChzdHJ1Y3QgaXAgKikgcmVjdl9wa3Q7CisJaGxlbiA9IGlwLT5pcF9obCA8PCAyOworCWlmIChyZWFkX2xlbiA8IGhsZW4gKyBJQ01QX01JTkxFTikgeworI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRQorCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ZigicGFja2V0IHRvbyBzaG9ydCAoJWQgYnl0ZXMpIGZyb20gJXNcbiIsIHJlYWRfbGVuLAorCQkJCWluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKwlyZWFkX2xlbiAtPSBobGVuOworCWljcCA9IChzdHJ1Y3QgaWNtcCAqKShyZWN2X3BrdCArIGhsZW4pOworCXR5cGUgPSBpY3AtPmljbXBfdHlwZTsKKwljb2RlID0gaWNwLT5pY21wX2NvZGU7CisJLyogUGF0aCBNVFUgRGlzY292ZXJ5IChSRkMxMTkxKSAqLworCXBtdHUgPSAwOworCWlmIChjb2RlID09IElDTVBfVU5SRUFDSF9ORUVERlJBRykKKwkJcG10dSA9IG50b2hzKGljcC0+aWNtcF9uZXh0bXR1KTsKKworCWlmICgodHlwZSA9PSBJQ01QX1RJTVhDRUVEICYmIGNvZGUgPT0gSUNNUF9USU1YQ0VFRF9JTlRSQU5TKQorCSB8fCB0eXBlID09IElDTVBfVU5SRUFDSAorCSB8fCB0eXBlID09IElDTVBfRUNIT1JFUExZCisJKSB7CisJCWNvbnN0IHN0cnVjdCBpcCAqaGlwOworCQljb25zdCBzdHJ1Y3QgdWRwaGRyICp1cDsKKworCQloaXAgPSAmaWNwLT5pY21wX2lwOworCQlobGVuID0gaGlwLT5pcF9obCA8PCAyOworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9VU0VfSUNNUCkgeworCQkJc3RydWN0IGljbXAgKmhpY21wOworCisJCQkvKiBYWFggKi8KKwkJCWlmICh0eXBlID09IElDTVBfRUNIT1JFUExZCisJCQkgJiYgaWNwLT5pY21wX2lkID09IGh0b25zKGlkZW50KQorCQkJICYmIGljcC0+aWNtcF9zZXEgPT0gaHRvbnMoc2VxKQorCQkJKSB7CisJCQkJcmV0dXJuIElDTVBfVU5SRUFDSF9QT1JUKzE7CisJCQl9CisKKwkJCWhpY21wID0gKHN0cnVjdCBpY21wICopKCh1bnNpZ25lZCBjaGFyICopaGlwICsgaGxlbik7CisJCQlpZiAoaGxlbiArIFNJWkVPRl9JQ01QX0hEUiA8PSByZWFkX2xlbgorCQkJICYmIGhpcC0+aXBfcCA9PSBJUFBST1RPX0lDTVAKKwkJCSAmJiBoaWNtcC0+aWNtcF9pZCA9PSBodG9ucyhpZGVudCkKKwkJCSAmJiBoaWNtcC0+aWNtcF9zZXEgPT0gaHRvbnMoc2VxKQorCQkJKSB7CisJCQkJcmV0dXJuICh0eXBlID09IElDTVBfVElNWENFRUQgPyAtMSA6IGNvZGUgKyAxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVwID0gKHN0cnVjdCB1ZHBoZHIgKikoKGNoYXIgKiloaXAgKyBobGVuKTsKKwkJCWlmIChobGVuICsgMTIgPD0gcmVhZF9sZW4KKwkJCSAmJiBoaXAtPmlwX3AgPT0gSVBQUk9UT19VRFAKKy8vIE9mZjogc2luY2Ugd2UgZG8gbm90IGZvcm0gdGhlIGVudGlyZSBJUCBwYWNrZXQsCisvLyBidXQgZGVmZXIgaXQgdG8ga2VybmVsLCB3ZSBjYW4ndCBzZXQgc291cmNlIHBvcnQsCisvLyBhbmQgdGh1cyBjYW4ndCBjaGVjayBpdCBoZXJlIGluIHRoZSByZXBseQorCQkJLyogJiYgdXAtPnNvdXJjZSA9PSBodG9ucyhpZGVudCkgKi8KKwkJCSAmJiB1cC0+ZGVzdCA9PSBodG9ucyhwb3J0ICsgc2VxKQorCQkJKSB7CisJCQkJcmV0dXJuICh0eXBlID09IElDTVBfVElNWENFRUQgPyAtMSA6IGNvZGUgKyAxKTsKKwkJCX0KKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKwlpZiAodmVyYm9zZSkgeworCQlpbnQgaTsKKwkJdWludDMyX3QgKmxwID0gKHVpbnQzMl90ICopJmljcC0+aWNtcF9pcDsKKworCQlwcmludGYoIlxuJWQgYnl0ZXMgZnJvbSAlcyB0byAiCisJCSAgICAgICAiJXM6IGljbXAgdHlwZSAlZCAoJXMpIGNvZGUgJWRcbiIsCisJCQlyZWFkX2xlbiwgaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSwKKwkJCWluZXRfbnRvYShpcC0+aXBfZHN0KSwKKwkJCXR5cGUsIHByX3R5cGUodHlwZSksIGljcC0+aWNtcF9jb2RlKTsKKwkJZm9yIChpID0gNDsgaSA8IHJlYWRfbGVuOyBpICs9IHNpemVvZigqbHApKQorCQkJcHJpbnRmKCIlMmQ6IHglOC44eFxuIiwgaSwgKmxwKyspOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisjIGlmICFFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKyNkZWZpbmUgcGFja2V0X29rKHJlYWRfbGVuLCBmcm9tX2xzYSwgdG8sIHNlcSkgXAorCXBhY2tldF9vayhyZWFkX2xlbiwgZnJvbV9sc2EsIHNlcSkKKyMgZW5kaWYKK3N0YXRpYyBpbnQKK3BhY2tldF9vayhpbnQgcmVhZF9sZW4sIGxlbl9hbmRfc29ja2FkZHIgKmZyb21fbHNhLAorCQkJc3RydWN0IHNvY2thZGRyICp0bywKKwkJCWludCBzZXEpCit7CisJY29uc3Qgc3RydWN0IGljbXA2X2hkciAqaWNwOworCXVuc2lnbmVkIGNoYXIgdHlwZSwgY29kZTsKKworCWlmIChmcm9tX2xzYS0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJcmV0dXJuIHBhY2tldDRfb2socmVhZF9sZW4sICZmcm9tX2xzYS0+dS5zaW4sIHNlcSk7CisKKwlpY3AgPSAoc3RydWN0IGljbXA2X2hkciAqKSByZWN2X3BrdDsKKworCXR5cGUgPSBpY3AtPmljbXA2X3R5cGU7CisJY29kZSA9IGljcC0+aWNtcDZfY29kZTsKKworCWlmICgodHlwZSA9PSBJQ01QNl9USU1FX0VYQ0VFREVEICYmIGNvZGUgPT0gSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVCkKKwkgfHwgdHlwZSA9PSBJQ01QNl9EU1RfVU5SRUFDSAorCSkgeworCQlzdHJ1Y3QgaXA2X2hkciAqaGlwOworCQlzdHJ1Y3QgdWRwaGRyICp1cDsKKwkJaW50IG5leHRoZHI7CisKKwkJaGlwID0gKHN0cnVjdCBpcDZfaGRyICopKGljcCArIDEpOworCQl1cCAgPSAoc3RydWN0IHVkcGhkciAqKSAoaGlwICsgMSk7CisJCW5leHRoZHIgPSBoaXAtPmlwNl9ueHQ7CisKKwkJaWYgKG5leHRoZHIgPT0gSVBQUk9UT19GUkFHTUVOVCkgeworCQkJbmV4dGhkciA9ICoodW5zaWduZWQgY2hhciopdXA7CisJCQl1cCsrOworCQl9CisJCWlmIChuZXh0aGRyID09IElQUFJPVE9fVURQKSB7CisJCQlzdHJ1Y3Qgb3V0ZGF0YTZfdCAqcGt0OworCisJCQlwa3QgPSAoc3RydWN0IG91dGRhdGE2X3QgKikgKHVwICsgMSk7CisKKwkJCWlmIChudG9obChwa3QtPmlkZW50NikgPT0gaWRlbnQKKwkJCSAmJiBudG9obChwa3QtPnNlcTYpID09IHNlcQorCQkJKSB7CisJCQkJcmV0dXJuICh0eXBlID09IElDTVA2X1RJTUVfRVhDRUVERUQgPyAtMSA6IChjb2RlPDw4KSsxKTsKKwkJCX0KKwkJfQorCX0KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKwlpZiAodmVyYm9zZSkgeworCQl1bnNpZ25lZCBjaGFyICpwOworCQljaGFyIHBhMVtNQVhIT1NUTkFNRUxFTl07CisJCWNoYXIgcGEyW01BWEhPU1ROQU1FTEVOXTsKKwkJaW50IGk7CisKKwkJcCA9ICh1bnNpZ25lZCBjaGFyICopIChpY3AgKyAxKTsKKworCQlwcmludGYoIlxuJWQgYnl0ZXMgZnJvbSAlcyB0byAiCisJCSAgICAgICAiJXM6IGljbXAgdHlwZSAlZCAoJXMpIGNvZGUgJWRcbiIsCisJCQlyZWFkX2xlbiwKKwkJCWluZXRfbnRvcChBRl9JTkVUNiwgJmZyb21fbHNhLT51LnNpbjYuc2luNl9hZGRyLCBwYTEsIHNpemVvZihwYTEpKSwKKwkJCWluZXRfbnRvcChBRl9JTkVUNiwgJigoc3RydWN0IHNvY2thZGRyX2luNiopdG8pLT5zaW42X2FkZHIsIHBhMiwgc2l6ZW9mKHBhMikpLAorCQkJdHlwZSwgcHJfdHlwZSh0eXBlKSwgaWNwLT5pY21wNl9jb2RlKTsKKworCQlyZWFkX2xlbiAtPSBzaXplb2Yoc3RydWN0IGljbXA2X2hkcik7CisJCWZvciAoaSA9IDA7IGkgPCByZWFkX2xlbjsgaSsrKSB7CisJCQlpZiAoaSAlIDE2ID09IDApCisJCQkJcHJpbnRmKCIlMDR4OiIsIGkpOworCQkJaWYgKGkgJSA0ID09IDApCisJCQkJYmJfcHV0Y2hhcignICcpOworCQkJcHJpbnRmKCIlMDJ4IiwgcFtpXSk7CisJCQlpZiAoKGkgJSAxNiA9PSAxNSkgJiYgKGkgKyAxIDwgcmVhZF9sZW4pKQorCQkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCX0KKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisjIGVuZGlmCisKKwlyZXR1cm4gMDsKK30KKyNlbHNlIC8qICFFTkFCTEVfVFJBQ0VST1VURTYgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludAorcGFja2V0X29rKGludCByZWFkX2xlbiwKKwkJbGVuX2FuZF9zb2NrYWRkciAqZnJvbV9sc2EgSUZfTk9UX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFKFVOVVNFRF9QQVJBTSksCisJCXN0cnVjdCBzb2NrYWRkciAqdG8gVU5VU0VEX1BBUkFNLAorCQlpbnQgc2VxKQoreworCXJldHVybiBwYWNrZXQ0X29rKHJlYWRfbGVuLCAmZnJvbV9sc2EtPnUuc2luLCBzZXEpOworfQorI2VuZGlmCisKKy8qCisgKiBDb25zdHJ1Y3QgYW4gSW50ZXJuZXQgYWRkcmVzcyByZXByZXNlbnRhdGlvbi4KKyAqIElmIHRoZSAtbiBmbGFnIGhhcyBiZWVuIHN1cHBsaWVkLCBnaXZlCisgKiBudW1lcmljIHZhbHVlLCBvdGhlcndpc2UgdHJ5IGZvciBzeW1ib2xpYyBuYW1lLgorICovCitzdGF0aWMgdm9pZAorcHJpbnRfaW5ldG5hbWUoY29uc3Qgc3RydWN0IHNvY2thZGRyICpmcm9tKQoreworCWNoYXIgKmluYSA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChmcm9tKTsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0FERFJfTlVNKSB7CisJCXByaW50ZigiICAlcyIsIGluYSk7CisJfSBlbHNlIHsKKwkJY2hhciAqbiA9IE5VTEw7CisKKwkJaWYgKGZyb20tPnNhX2ZhbWlseSAhPSBBRl9JTkVUCisJCSB8fCAoKHN0cnVjdCBzb2NrYWRkcl9pbiopZnJvbSktPnNpbl9hZGRyLnNfYWRkciAhPSBJTkFERFJfQU5ZCisJCSkgeworCQkJLyogVHJ5IHRvIHJldmVyc2UgcmVzb2x2ZSBpZiBpdCBpcyBub3QgMC4wLjAuMCAqLworCQkJbiA9IHhtYWxsb2Nfc29ja2FkZHIyaG9zdF9ub3BvcnQoKHN0cnVjdCBzb2NrYWRkciopZnJvbSk7CisJCX0KKwkJcHJpbnRmKCIgICVzICglcykiLCAobiA/IG4gOiBpbmEpLCBpbmEpOworCQlmcmVlKG4pOworCX0KKwlmcmVlKGluYSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludChpbnQgcmVhZF9sZW4sIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqZnJvbSwgY29uc3Qgc3RydWN0IHNvY2thZGRyICp0bykKK3sKKwlwcmludF9pbmV0bmFtZShmcm9tKTsKKworCWlmICh2ZXJib3NlKSB7CisJCWNoYXIgKmluYSA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCh0byk7CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJCWlmICh0by0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlyZWFkX2xlbiAtPSBzaXplb2Yoc3RydWN0IGlwNl9oZHIpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlzdHJ1Y3QgaXAgKmlwNHBhY2tldCA9IChzdHJ1Y3QgaXAqKXJlY3ZfcGt0OworCQkJcmVhZF9sZW4gLT0gaXA0cGFja2V0LT5pcF9obCA8PCAyOworCQl9CisJCXByaW50ZigiICVkIGJ5dGVzIHRvICVzIiwgcmVhZF9sZW4sIGluYSk7CisJCWZyZWUoaW5hKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9kZWx0YV9tcyh1bnNpZ25lZCB0MXAsIHVuc2lnbmVkIHQycCkKK3sKKwl1bnNpZ25lZCB0dCA9IHQycCAtIHQxcDsKKwlwcmludGYoIiAgJXUuJTAzdSBtcyIsIHR0IC8gMTAwMCwgdHQgJSAxMDAwKTsKK30KKworLyoKKyAqIFVzYWdlOiBbLWRGSWxucnZ4XSBbLWcgZ2F0ZXdheV0gWy1pIGlmYWNlXSBbLWYgZmlyc3RfdHRsXQorICogWy1tIG1heF90dGxdIFsgLXAgcG9ydF0gWy1xIG5xdWVyaWVzXSBbLXMgc3JjX2FkZHJdIFstdCB0b3NdCisgKiBbLXcgd2FpdHRpbWVdIFsteiBwYXVzZW1zZWNzXSBob3N0IFtwYWNrZXRsZW5dIgorICovCitzdGF0aWMgaW50Citjb21tb25fdHJhY2Vyb3V0ZV9tYWluKGludCBvcCwgY2hhciAqKmFyZ3YpCit7CisJaW50IG1pbnBhY2tldDsKKwlpbnQgdG9zID0gMDsKKwlpbnQgbWF4X3R0bCA9IDMwOworCWludCBucHJvYmVzID0gMzsKKwlpbnQgZmlyc3RfdHRsID0gMTsKKwl1bnNpZ25lZCBwYXVzZW1zZWNzID0gMDsKKwljaGFyICpzb3VyY2U7CisJY2hhciAqZGV2aWNlOworCWNoYXIgKnRvc19zdHI7CisJY2hhciAqbWF4X3R0bF9zdHI7CisJY2hhciAqcG9ydF9zdHI7CisJY2hhciAqbnByb2Jlc19zdHI7CisJY2hhciAqd2FpdHRpbWVfc3RyOworCWNoYXIgKnBhdXNlbXNlY3Nfc3RyOworCWNoYXIgKmZpcnN0X3R0bF9zdHI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKwlsbGlzdF90ICpzb3VyY2Vfcm91dGVfbGlzdCA9IE5VTEw7CisJaW50IGxzcnIgPSAwOworI2VuZGlmCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJc2FfZmFtaWx5X3QgYWY7CisjZWxzZQorCWVudW0geyBhZiA9IEFGX0lORVQgfTsKKyNlbmRpZgorCWludCB0dGw7CisJaW50IHNlcTsKKwlsZW5fYW5kX3NvY2thZGRyICpmcm9tX2xzYTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmxhc3RhZGRyOworCXN0cnVjdCBzb2NrYWRkciAqdG87CisKKwlJTklUX0coKTsKKworCS8qIG1pbmltdW0gMSBhcmcgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTp4LXgiIElGX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUoIjpnOjoiKTsKKwlvcCB8PSBnZXRvcHQzMihhcmd2LCBPUFRfU1RSSU5HCisJCSwgJnRvc19zdHIsICZkZXZpY2UsICZtYXhfdHRsX3N0ciwgJnBvcnRfc3RyLCAmbnByb2Jlc19zdHIKKwkJLCAmc291cmNlLCAmd2FpdHRpbWVfc3RyLCAmcGF1c2Vtc2Vjc19zdHIsICZmaXJzdF90dGxfc3RyCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKwkJLCAmc291cmNlX3JvdXRlX2xpc3QKKyNlbmRpZgorCSk7CisJYXJndiArPSBvcHRpbmQ7CisKKyNpZiAwIC8qIElHTk9SRUQgKi8KKwlpZiAob3AgJiBPUFRfSVBfQ0hLU1VNKQorCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IGlwIGNoZWNrc3VtcyBkaXNhYmxlZCIpOworI2VuZGlmCisJaWYgKG9wICYgT1BUX1RPUykKKwkJdG9zID0geGF0b3VfcmFuZ2UodG9zX3N0ciwgMCwgMjU1KTsKKwlpZiAob3AgJiBPUFRfTUFYX1RUTCkKKwkJbWF4X3R0bCA9IHhhdG91X3JhbmdlKG1heF90dGxfc3RyLCAxLCAyNTUpOworCWlmIChvcCAmIE9QVF9QT1JUKQorCQlwb3J0ID0geGF0b3UxNihwb3J0X3N0cik7CisJaWYgKG9wICYgT1BUX05QUk9CRVMpCisJCW5wcm9iZXMgPSB4YXRvdV9yYW5nZShucHJvYmVzX3N0ciwgMSwgSU5UX01BWCk7CisJaWYgKG9wICYgT1BUX1NPVVJDRSkgeworCQkvKgorCQkgKiBzZXQgdGhlIGlwIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBvdXRib3VuZAorCQkgKiBwcm9iZSAoZS5nLiwgb24gYSBtdWx0aS1ob21lZCBob3N0KS4KKwkJICovCisJCWlmIChnZXR1aWQoKSAhPSAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3QpOworCX0KKwlpZiAob3AgJiBPUFRfV0FJVFRJTUUpCisJCXdhaXR0aW1lID0geGF0b3VfcmFuZ2Uod2FpdHRpbWVfc3RyLCAxLCAyNCAqIDYwICogNjApOworCWlmIChvcCAmIE9QVF9QQVVTRV9NUykKKwkJcGF1c2Vtc2VjcyA9IHhhdG91X3JhbmdlKHBhdXNlbXNlY3Nfc3RyLCAwLCA2MCAqIDYwICogMTAwMCk7CisJaWYgKG9wICYgT1BUX0ZJUlNUX1RUTCkKKwkJZmlyc3RfdHRsID0geGF0b3VfcmFuZ2UoZmlyc3RfdHRsX3N0ciwgMSwgbWF4X3R0bCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURQorCWlmIChzb3VyY2Vfcm91dGVfbGlzdCkgeworCQl3aGlsZSAoc291cmNlX3JvdXRlX2xpc3QpIHsKKwkJCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKworCQkJaWYgKGxzcnIgPj0gTkdBVEVXQVlTKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBtb3JlIHRoYW4gJWQgZ2F0ZXdheXMiLCBOR0FURVdBWVMpOworCQkJbHNhID0geGhvc3RfYW5kX2FmMnNvY2thZGRyKGxsaXN0X3BvcCgmc291cmNlX3JvdXRlX2xpc3QpLCAwLCBBRl9JTkVUKTsKKwkJCWd3bGlzdFtsc3JyXSA9IGxzYS0+dS5zaW4uc2luX2FkZHIuc19hZGRyOworCQkJZnJlZShsc2EpOworCQkJKytsc3JyOworCQl9CisJCW9wdGxlbiA9IChsc3JyICsgMSkgKiBzaXplb2YoZ3dsaXN0WzBdKTsKKwl9CisjZW5kaWYKKworCS8qIFByb2Nlc3MgZGVzdGluYXRpb24gYW5kIG9wdGlvbmFsIHBhY2tldCBzaXplICovCisJbWlucGFja2V0ID0gc2l6ZW9mKCpvdXRpcCkgKyBTSVpFT0ZfSUNNUF9IRFIgKyBzaXplb2YoKm91dGRhdGEpICsgb3B0bGVuOworCWlmICghKG9wICYgT1BUX1VTRV9JQ01QKSkKKwkJbWlucGFja2V0ICs9IHNpemVvZigqb3V0dWRwKSAtIFNJWkVPRl9JQ01QX0hEUjsKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKKwlhZiA9IEFGX1VOU1BFQzsKKwlpZiAob3AgJiBPUFRfSVBWNCkKKwkJYWYgPSBBRl9JTkVUOworCWlmIChvcCAmIE9QVF9JUFY2KQorCQlhZiA9IEFGX0lORVQ2OworCWRlc3RfbHNhID0geGhvc3RfYW5kX2FmMnNvY2thZGRyKGFyZ3ZbMF0sIHBvcnQsIGFmKTsKKwlhZiA9IGRlc3RfbHNhLT51LnNhLnNhX2ZhbWlseTsKKwlpZiAoYWYgPT0gQUZfSU5FVDYpCisJCW1pbnBhY2tldCA9IHNpemVvZihzdHJ1Y3Qgb3V0ZGF0YTZfdCk7CisjZWxzZQorCWRlc3RfbHNhID0geGhvc3Qyc29ja2FkZHIoYXJndlswXSwgcG9ydCk7CisjZW5kaWYKKwlwYWNrbGVuID0gbWlucGFja2V0OworCWlmIChhcmd2WzFdKQorCQlwYWNrbGVuID0geGF0b3VsX3JhbmdlKGFyZ3ZbMV0sIG1pbnBhY2tldCwgMzIgKiAxMDI0KTsKKworCS8qIEVuc3VyZSB0aGUgc29ja2V0IGZkcyB3b24ndCBiZSAwLCAxIG9yIDIgKi8KKwliYl9zYW5pdGl6ZV9zdGRpbygpOworCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJaWYgKGFmID09IEFGX0lORVQ2KSB7CisJCXhtb3ZlX2ZkKHhzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVBWNiksIHJjdnNvY2spOworIyBpZmRlZiBJUFY2X1JFQ1ZQS1RJTkZPCisJCXNldHNvY2tvcHQocmN2c29jaywgU09MX0lQVjYsIElQVjZfUkVDVlBLVElORk8sCisJCQkJJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKwkJc2V0c29ja29wdChyY3Zzb2NrLCBTT0xfSVBWNiwgSVBWNl8yMjkyUEtUSU5GTywKKwkJCQkmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworIyBlbHNlCisJCXNldHNvY2tvcHQocmN2c29jaywgU09MX0lQVjYsIElQVjZfUEtUSU5GTywKKwkJCQkmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworIyBlbmRpZgorCX0gZWxzZQorI2VuZGlmCisJeworCQl4bW92ZV9mZCh4c29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVApLCByY3Zzb2NrKTsKKwl9CisKKyNpZiBUUkFDRVJPVVRFX1NPX0RFQlVHCisJaWYgKG9wICYgT1BUX0RFQlVHKQorCQlzZXRzb2Nrb3B0KHJjdnNvY2ssIFNPTF9TT0NLRVQsIFNPX0RFQlVHLAorCQkJCSZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisjZW5kaWYKKwlpZiAob3AgJiBPUFRfQllQQVNTX1JPVVRFKQorCQlzZXRzb2Nrb3B0KHJjdnNvY2ssIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwKKwkJCQkmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJaWYgKGFmID09IEFGX0lORVQ2KSB7CisJCXN0YXRpYyBjb25zdCBpbnQgdHdvID0gMjsKKwkJaWYgKHNldHNvY2tvcHQocmN2c29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwgJnR3bywgc2l6ZW9mKHR3bykpIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0c29ja29wdCBSQVdfQ0hFQ0tTVU0iKTsKKwkJeG1vdmVfZmQoeHNvY2tldChhZiwgU09DS19ER1JBTSwgMCksIHNuZHNvY2spOworCX0gZWxzZQorI2VuZGlmCisJeworCQlpZiAob3AgJiBPUFRfVVNFX0lDTVApCisJCQl4bW92ZV9mZCh4c29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVApLCBzbmRzb2NrKTsKKwkJZWxzZQorCQkJeG1vdmVfZmQoeHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSwgc25kc29jayk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgJiYgZGVmaW5lZCBJUF9PUFRJT05TCisJCWlmIChsc3JyID4gMCkgeworCQkJdW5zaWduZWQgY2hhciBvcHRsaXN0W01BWF9JUE9QVExFTl07CisJCQl1bnNpZ25lZCBzaXplOworCisJCQkvKiBmaW5hbCBob3AgKi8KKwkJCWd3bGlzdFtsc3JyXSA9IGRlc3RfbHNhLT51LnNpbi5zaW5fYWRkci5zX2FkZHI7CisJCQkrK2xzcnI7CisKKwkJCS8qIGZvcmNlIDQgYnl0ZSBhbGlnbm1lbnQgKi8KKwkJCW9wdGxpc3RbMF0gPSBJUE9QVF9OT1A7CisJCQkvKiBsb29zZSBzb3VyY2Ugcm91dGUgb3B0aW9uICovCisJCQlvcHRsaXN0WzFdID0gSVBPUFRfTFNSUjsKKwkJCXNpemUgPSBsc3JyICogc2l6ZW9mKGd3bGlzdFswXSk7CisJCQlvcHRsaXN0WzJdID0gc2l6ZSArIDM7CisJCQkvKiBwb2ludGVyIHRvIExTUlIgYWRkcmVzc2VzICovCisJCQlvcHRsaXN0WzNdID0gSVBPUFRfTUlOT0ZGOworCQkJbWVtY3B5KG9wdGxpc3QgKyA0LCBnd2xpc3QsIHNpemUpOworCisJCQlpZiAoc2V0c29ja29wdChzbmRzb2NrLCBJUFBST1RPX0lQLCBJUF9PUFRJT05TLAorCQkJCQkoY2hhciAqKW9wdGxpc3QsIHNpemUgKyBzaXplb2YoZ3dsaXN0WzBdKSkgPCAwKSB7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJJUF9PUFRJT05TIik7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKworI2lmZGVmIFNPX1NOREJVRgorCWlmIChzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJnBhY2tsZW4sIHNpemVvZihwYWNrbGVuKSkgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU09fU05EQlVGIik7CisJfQorI2VuZGlmCisjaWZkZWYgSVBfVE9TCisJaWYgKChvcCAmIE9QVF9UT1MpICYmIHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfVE9TLCAmdG9zLCBzaXplb2YodG9zKSkgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0c29ja29wdCB0b3MgJWQiLCB0b3MpOworCX0KKyNlbmRpZgorI2lmZGVmIElQX0RPTlRGUkFHCisJaWYgKG9wICYgT1BUX0RPTlRfRlJBR01OVCkKKwkJc2V0c29ja29wdChzbmRzb2NrLCBJUFBST1RPX0lQLCBJUF9ET05URlJBRywKKwkJCQkmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworI2VuZGlmCisjaWYgVFJBQ0VST1VURV9TT19ERUJVRworCWlmIChvcCAmIE9QVF9ERUJVRykKKwkJc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywKKwkJCQkmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworI2VuZGlmCisJaWYgKG9wICYgT1BUX0JZUEFTU19ST1VURSkKKwkJc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsCisJCQkJJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKworCW91dGlwID0geHphbGxvYyhwYWNrbGVuKTsKKworCWlkZW50ID0gZ2V0cGlkKCk7CisKKwlpZiAoYWYgPT0gQUZfSU5FVCkgeworCQlpZiAob3AgJiBPUFRfVVNFX0lDTVApIHsKKwkJCWlkZW50IHw9IDB4ODAwMDsKKwkJCW91dGljbXAtPmljbXBfdHlwZSA9IElDTVBfRUNITzsKKwkJCW91dGljbXAtPmljbXBfaWQgPSBodG9ucyhpZGVudCk7CisJCQlvdXRkYXRhID0gKHN0cnVjdCBvdXRkYXRhX3QgKikoKGNoYXIgKilvdXRpY21wICsgU0laRU9GX0lDTVBfSERSKTsKKwkJfSBlbHNlIHsKKwkJCW91dGRhdGEgPSAoc3RydWN0IG91dGRhdGFfdCAqKShvdXR1ZHAgKyAxKTsKKwkJfQorCX0KKworCWlmIChvcCAmIE9QVF9ERVZJQ0UpIC8qIGhtbSwgZG8gd2UgbmVlZCBlcnJvciBjaGVjaz8gKi8KKwkJc2V0c29ja29wdF9iaW5kdG9kZXZpY2Uoc25kc29jaywgZGV2aWNlKTsKKworCWlmIChvcCAmIE9QVF9TT1VSQ0UpIHsKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKKy8vIFRPRE86IG5lZWQgeGRvdHRlZF9hbmRfYWYyc29ja2FkZHI/CisJCWxlbl9hbmRfc29ja2FkZHIgKnNvdXJjZV9sc2EgPSB4aG9zdF9hbmRfYWYyc29ja2FkZHIoc291cmNlLCAwLCBhZik7CisjZWxzZQorCQlsZW5fYW5kX3NvY2thZGRyICpzb3VyY2VfbHNhID0geGRvdHRlZDJzb2NrYWRkcihzb3VyY2UsIDApOworI2VuZGlmCisJCS8qIFBpbmc0IGRvZXMgdGhpcyAod2h5PykgKi8KKwkJaWYgKGFmID09IEFGX0lORVQpCisJCQlpZiAoc2V0c29ja29wdChzbmRzb2NrLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfSUYsCisJCQkJCSZzb3VyY2VfbHNhLT51LnNhLCBzb3VyY2VfbHNhLT5sZW4pKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgbXVsdGljYXN0IHNvdXJjZSBpbnRlcmZhY2UiKTsKKy8vVE9ETzogd2UgY2FuIHF1ZXJ5IHNvdXJjZSBwb3J0IHdlIGJvdW5kIHRvLAorLy8gYW5kIGNoZWNrIGl0IGluIHJlcGxpZXMuLi4gaWYgd2UgY2FyZSBlbm91Z2gKKwkJeGJpbmQoc25kc29jaywgJnNvdXJjZV9sc2EtPnUuc2EsIHNvdXJjZV9sc2EtPmxlbik7CisJCWZyZWUoc291cmNlX2xzYSk7CisJfQorI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCWVsc2UgaWYgKGFmID09IEFGX0lORVQ2KSB7CisvL1RPRE86IHdoeSB3ZSBkb24ndCBkbyBpdCBmb3IgSVB2ND8KKwkJbGVuX2FuZF9zb2NrYWRkciAqc291cmNlX2xzYTsKKworCQlpbnQgcHJvYmVfZmQgPSB4c29ja2V0KGFmLCBTT0NLX0RHUkFNLCAwKTsKKwkJaWYgKG9wICYgT1BUX0RFVklDRSkKKwkJCXNldHNvY2tvcHRfYmluZHRvZGV2aWNlKHByb2JlX2ZkLCBkZXZpY2UpOworCQlzZXRfbnBvcnQoJmRlc3RfbHNhLT51LnNhLCBodG9ucygxMDI1KSk7CisJCS8qIGR1bW15IGNvbm5lY3QuIG1ha2VzIGtlcm5lbCBwaWNrIHNvdXJjZSBJUCAoYW5kIHBvcnQpICovCisJCXhjb25uZWN0KHByb2JlX2ZkLCAmZGVzdF9sc2EtPnUuc2EsIGRlc3RfbHNhLT5sZW4pOworCQlzZXRfbnBvcnQoJmRlc3RfbHNhLT51LnNhLCBodG9ucyhwb3J0KSk7CisKKwkJLyogcmVhZCBJUCBhbmQgcG9ydCAqLworCQlzb3VyY2VfbHNhID0gZ2V0X3NvY2tfbHNhKHByb2JlX2ZkKTsKKwkJaWYgKHNvdXJjZV9sc2EgPT0gTlVMTCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgcHJvYmUgYWRkciIpOworCisJCWNsb3NlKHByb2JlX2ZkKTsKKworCQkvKiBiaW5kIG91ciBzb2NrZXRzIHRvIHRoaXMgSVAgKGJ1dCBub3QgcG9ydCkgKi8KKwkJc2V0X25wb3J0KCZzb3VyY2VfbHNhLT51LnNhLCAwKTsKKwkJeGJpbmQoc25kc29jaywgJnNvdXJjZV9sc2EtPnUuc2EsIHNvdXJjZV9sc2EtPmxlbik7CisJCXhiaW5kKHJjdnNvY2ssICZzb3VyY2VfbHNhLT51LnNhLCBzb3VyY2VfbHNhLT5sZW4pOworCisJCWZyZWUoc291cmNlX2xzYSk7CisJfQorI2VuZGlmCisKKwkvKiBSZXZlcnQgdG8gbm9uLXByaXZpbGVnZWQgdXNlciBhZnRlciBvcGVuaW5nIHNvY2tldHMgKi8KKwl4c2V0Z2lkKGdldGdpZCgpKTsKKwl4c2V0dWlkKGdldHVpZCgpKTsKKworCXByaW50ZigidHJhY2Vyb3V0ZSB0byAlcyAoJXMpIiwgYXJndlswXSwKKwkJCXhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCgmZGVzdF9sc2EtPnUuc2EpKTsKKwlpZiAob3AgJiBPUFRfU09VUkNFKQorCQlwcmludGYoIiBmcm9tICVzIiwgc291cmNlKTsKKwlwcmludGYoIiwgJWQgaG9wcyBtYXgsICVkIGJ5dGUgcGFja2V0c1xuIiwgbWF4X3R0bCwgcGFja2xlbik7CisKKwlmcm9tX2xzYSA9IGR1cF9zb2NrYWRkcihkZXN0X2xzYSk7CisJbGFzdGFkZHIgPSB4emFsbG9jKGRlc3RfbHNhLT5sZW4pOworCXRvID0geHphbGxvYyhkZXN0X2xzYS0+bGVuKTsKKwlzZXEgPSAwOworCWZvciAodHRsID0gZmlyc3RfdHRsOyB0dGwgPD0gbWF4X3R0bDsgKyt0dGwpIHsKKwkJaW50IHByb2JlOworCQlpbnQgdW5yZWFjaGFibGUgPSAwOyAvKiBjb3VudGVyICovCisJCWludCBnb3RsYXN0YWRkciA9IDA7IC8qIGZsYWdzICovCisJCWludCBnb3RfdGhlcmUgPSAwOworCisJCXByaW50ZigiJTJkIiwgdHRsKTsKKwkJZm9yIChwcm9iZSA9IDA7IHByb2JlIDwgbnByb2JlczsgKytwcm9iZSkgeworCQkJaW50IHJlYWRfbGVuOworCQkJdW5zaWduZWQgdDE7CisJCQl1bnNpZ25lZCB0MjsKKwkJCWludCBsZWZ0X21zOworCQkJc3RydWN0IGlwICppcDsKKworCQkJZmZsdXNoX2FsbCgpOworCQkJaWYgKHByb2JlICE9IDAgJiYgcGF1c2Vtc2VjcyA+IDApCisJCQkJdXNsZWVwKHBhdXNlbXNlY3MgKiAxMDAwKTsKKworCQkJc2VuZF9wcm9iZSgrK3NlcSwgdHRsKTsKKwkJCXQyID0gdDEgPSBtb25vdG9uaWNfdXMoKTsKKworCQkJbGVmdF9tcyA9IHdhaXR0aW1lICogMTAwMDsKKwkJCXdoaWxlICgocmVhZF9sZW4gPSB3YWl0X2Zvcl9yZXBseShmcm9tX2xzYSwgdG8sICZ0MiwgJmxlZnRfbXMpKSAhPSAwKSB7CisJCQkJaW50IGljbXBfY29kZTsKKworCQkJCS8qIFJlY3YnZWQgYSBwYWNrZXQsIG9yIHJlYWQgZXJyb3IgKi8KKwkJCQkvKiB0MiA9IG1vbm90b25pY191cygpIC0gc2V0IGJ5IHdhaXRfZm9yX3JlcGx5ICovCisKKwkJCQlpZiAocmVhZF9sZW4gPCAwKQorCQkJCQljb250aW51ZTsKKwkJCQlpY21wX2NvZGUgPSBwYWNrZXRfb2socmVhZF9sZW4sIGZyb21fbHNhLCB0bywgc2VxKTsKKwkJCQkvKiBTa2lwIHNob3J0IHBhY2tldCAqLworCQkJCWlmIChpY21wX2NvZGUgPT0gMCkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoIWdvdGxhc3RhZGRyCisJCQkJIHx8IChtZW1jbXAobGFzdGFkZHIsICZmcm9tX2xzYS0+dS5zYSwgZnJvbV9sc2EtPmxlbikgIT0gMCkKKwkJCQkpIHsKKwkJCQkJcHJpbnQocmVhZF9sZW4sICZmcm9tX2xzYS0+dS5zYSwgdG8pOworCQkJCQltZW1jcHkobGFzdGFkZHIsICZmcm9tX2xzYS0+dS5zYSwgZnJvbV9sc2EtPmxlbik7CisJCQkJCWdvdGxhc3RhZGRyID0gMTsKKwkJCQl9CisKKwkJCQlwcmludF9kZWx0YV9tcyh0MSwgdDIpOworCQkJCWlwID0gKHN0cnVjdCBpcCAqKXJlY3ZfcGt0OworCisJCQkJaWYgKGZyb21fbHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorCQkJCQlpZiAob3AgJiBPUFRfVFRMX0ZMQUcpCisJCQkJCQlwcmludGYoIiAoJWQpIiwgaXAtPmlwX3R0bCk7CisKKwkJCQkvKiB0aW1lIGV4Y2VlZGVkIGluIHRyYW5zaXQgKi8KKwkJCQlpZiAoaWNtcF9jb2RlID09IC0xKQorCQkJCQlicmVhazsKKwkJCQlpY21wX2NvZGUtLTsKKwkJCQlzd2l0Y2ggKGljbXBfY29kZSkgeworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCQkJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUIDw8IDg6CisJCQkJCWdvdF90aGVyZSA9IDE7CisJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfUE9SVDoKKwkJCQkJaWYgKGlwLT5pcF90dGwgPD0gMSkKKwkJCQkJCXByaW50ZigiICEiKTsKKwkJCQkJZ290X3RoZXJlID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9ORVQ6CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2ICYmIChJQ01QNl9EU1RfVU5SRUFDSF9OT1JPVVRFICE9IElDTVBfVU5SRUFDSF9ORVQpCisJCQkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9OT1JPVVRFIDw8IDg6CisjZW5kaWYKKwkJCQkJcHJpbnRmKCIgIU4iKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfSE9TVDoKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKKwkJCQljYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FERFIgPDwgODoKKyNlbmRpZgorCQkJCQlwcmludGYoIiAhSCIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9QUk9UT0NPTDoKKwkJCQkJcHJpbnRmKCIgIVAiKTsKKwkJCQkJZ290X3RoZXJlID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfTkVFREZSQUc6CisJCQkJCXByaW50ZigiICFGLSVkIiwgcG10dSk7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX1NSQ0ZBSUw6CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJCQkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTiA8PCA4OgorI2VuZGlmCisJCQkJCXByaW50ZigiICFTIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX0ZJTFRFUl9QUk9ISUI6CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfTkVUX1BST0hJQjogICAvKiBtaXN1c2UgKi8KKwkJCQkJcHJpbnRmKCIgIUEiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfSE9TVF9QUk9ISUI6CisJCQkJCXByaW50ZigiICFDIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX0hPU1RfUFJFQ0VERU5DRToKKwkJCQkJcHJpbnRmKCIgIVYiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfUFJFQ0VERU5DRV9DVVRPRkY6CisJCQkJCXByaW50ZigiICFDIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX05FVF9VTktOT1dOOgorCQkJCWNhc2UgSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTjoKKwkJCQkJcHJpbnRmKCIgIVUiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfSVNPTEFURUQ6CisJCQkJCXByaW50ZigiICFJIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX1RPU05FVDoKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9UT1NIT1NUOgorCQkJCQlwcmludGYoIiAhVCIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGYoIiAhPCVkPiIsIGljbXBfY29kZSk7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0gLyogd2hpbGUgKHdhaXQgYW5kIHJlYWQgYSBwYWNrZXQpICovCisKKwkJCS8qIHRoZXJlIHdhcyBubyBwYWNrZXQgYXQgYWxsPyAqLworCQkJaWYgKHJlYWRfbGVuID09IDApCisJCQkJcHJpbnRmKCIgICoiKTsKKwkJfSAvKiBmb3IgKG5wcm9iZXMpICovCisKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJaWYgKGdvdF90aGVyZQorCQkgfHwgKHVucmVhY2hhYmxlID4gMCAmJiB1bnJlYWNoYWJsZSA+PSBucHJvYmVzIC0gMSkKKwkJKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgdHJhY2Vyb3V0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHJhY2Vyb3V0ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGNvbW1vbl90cmFjZXJvdXRlX21haW4oMCwgYXJndik7Cit9CisKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKK2ludCB0cmFjZXJvdXRlNl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHJhY2Vyb3V0ZTZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBjb21tb25fdHJhY2Vyb3V0ZV9tYWluKE9QVF9JUFY2LCBhcmd2KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy90dW5jdGwuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdHVuY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwODcwZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdHVuY3RsLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHR1biBkZXZpY2VzIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIE9yaWdpbmFsIGNvZGU6CisgKiAgICAgIEplZmYgRGlrZQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHR1bmN0bF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mIGRldmljZV0gKFstdCBuYW1lXSB8IC1kIG5hbWUpIiBJRl9GRUFUVVJFX1RVTkNUTF9VRygiIFstdSBvd25lcl0gWy1nIGdyb3VwXSBbLWJdIikKKy8vdXNhZ2U6I2RlZmluZSB0dW5jdGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgb3IgZGVsZXRlIHR1biBpbnRlcmZhY2VzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mIG5hbWUJCXR1biBkZXZpY2UgKC9kZXYvbmV0L3R1bikiCisvL3VzYWdlOiAgICAgIlxuCS10IG5hbWUJCUNyZWF0ZSBpZmFjZSAnbmFtZSciCisvL3VzYWdlOiAgICAgIlxuCS1kIG5hbWUJCURlbGV0ZSBpZmFjZSAnbmFtZSciCisvL3VzYWdlOglJRl9GRUFUVVJFX1RVTkNUTF9VRygKKy8vdXNhZ2U6ICAgICAiXG4JLXUgb3duZXIJU2V0IGlmYWNlIG93bmVyIgorLy91c2FnZTogICAgICJcbgktZyBncm91cAlTZXQgaWZhY2UgZ3JvdXAiCisvL3VzYWdlOiAgICAgIlxuCS1iCQlCcmllZiBvdXRwdXQiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHR1bmN0bF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIyB0dW5jdGxcbiIKKy8vdXNhZ2U6ICAgICAgICIjIHR1bmN0bCAtZCB0dW4wXG4iCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdHVuLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVFVOU0VUR1JPVVAgYXBwZWFyZWQgaW4gMi42LjIzICovCisjaWZuZGVmIFRVTlNFVEdST1VQCisjZGVmaW5lIFRVTlNFVEdST1VQIF9JT1coJ1QnLCAyMDYsIGludCkKKyNlbmRpZgorCisjZGVmaW5lIElPQ1RMKGEsIGIsIGMpIGlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGEsIGIsIGMsIE5VTEwpCisKKyNpZiAxCisKK2ludCB0dW5jdGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHR1bmN0bF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJY29uc3QgY2hhciAqb3B0X25hbWUgPSAidGFwJWQiOworCWNvbnN0IGNoYXIgKm9wdF9kZXZpY2UgPSAiL2Rldi9uZXQvdHVuIjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UVU5DVExfVUcKKwljb25zdCBjaGFyICpvcHRfdXNlciwgKm9wdF9ncm91cDsKKwlsb25nIHVzZXIgPSAtMSwgZ3JvdXAgPSAtMTsKKyNlbmRpZgorCXVuc2lnbmVkIG9wdHM7CisKKwllbnVtIHsKKwkJT1BUX2YgPSAxIDw8IDAsIC8vIGNvbnRyb2wgZGV2aWNlIG5hbWUgKC9kZXYvbmV0L3R1bikKKwkJT1BUX3QgPSAxIDw8IDEsIC8vIGNyZWF0ZSBuYW1lZCBpbnRlcmZhY2UKKwkJT1BUX2QgPSAxIDw8IDIsIC8vIGRlbGV0ZSBuYW1lZCBpbnRlcmZhY2UKKyNpZiBFTkFCTEVfRkVBVFVSRV9UVU5DVExfVUcKKwkJT1BUX3UgPSAxIDw8IDMsIC8vIHNldCBuZXcgaW50ZXJmYWNlIG93bmVyCisJCU9QVF9nID0gMSA8PCA0LCAvLyBzZXQgbmV3IGludGVyZmFjZSBncm91cAorCQlPUFRfYiA9IDEgPDwgNSwgLy8gYnJpZWYgb3V0cHV0CisjZW5kaWYKKwl9OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTA6dC0tZDpkLS10IjsgLy8gbm8gYXJndW1lbnRzOyB0IF4gZAorCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZjp0OmQ6IiBJRl9GRUFUVVJFX1RVTkNUTF9VRygidTpnOmIiKSwKKwkJCSZvcHRfZGV2aWNlLCAmb3B0X25hbWUsICZvcHRfbmFtZQorCQkJSUZfRkVBVFVSRV9UVU5DVExfVUcoLCAmb3B0X3VzZXIsICZvcHRfZ3JvdXApKTsKKworCS8vIHNlbGVjdCBkZXZpY2UKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCWlmci5pZnJfZmxhZ3MgPSBJRkZfVEFQIHwgSUZGX05PX1BJOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBvcHRfbmFtZSk7CisKKwkvLyBvcGVuIGRldmljZQorCWZkID0geG9wZW4ob3B0X2RldmljZSwgT19SRFdSKTsKKwlJT0NUTChmZCwgVFVOU0VUSUZGLCAodm9pZCAqKSZpZnIpOworCisJLy8gZGVsZXRlPworCWlmIChvcHRzICYgT1BUX2QpIHsKKwkJSU9DVEwoZmQsIFRVTlNFVFBFUlNJU1QsICh2b2lkICopKHVpbnRwdHJfdCkwKTsKKwkJYmJfaW5mb19tc2coIlNldCAnJXMnICVzcGVyc2lzdGVudCIsIGlmci5pZnJfbmFtZSwgIm5vbiIpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8vIGNyZWF0ZQorI2lmIEVOQUJMRV9GRUFUVVJFX1RVTkNUTF9VRworCWlmIChvcHRzICYgT1BUX2cpIHsKKwkJZ3JvdXAgPSB4Z3JvdXAyZ2lkKG9wdF9ncm91cCk7CisJCUlPQ1RMKGZkLCBUVU5TRVRHUk9VUCwgKHZvaWQgKikodWludHB0cl90KWdyb3VwKTsKKwl9IGVsc2UKKwkJdXNlciA9IGdldGV1aWQoKTsKKwlpZiAob3B0cyAmIE9QVF91KQorCQl1c2VyID0geHVuYW1lMnVpZChvcHRfdXNlcik7CisJSU9DVEwoZmQsIFRVTlNFVE9XTkVSLCAodm9pZCAqKSh1aW50cHRyX3QpdXNlcik7CisjZW5kaWYKKwlJT0NUTChmZCwgVFVOU0VUUEVSU0lTVCwgKHZvaWQgKikodWludHB0cl90KTEpOworCisJLy8gc2hvdyBpbmZvCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFVOQ1RMX1VHCisJaWYgKG9wdHMgJiBPUFRfYikgeworCQlwdXRzKGlmci5pZnJfbmFtZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJTZXQgJyVzJyAlc3BlcnNpc3RlbnQiLCBpZnIuaWZyX25hbWUsICIiKTsKKwkJcHJpbnRmKCIgYW5kIG93bmVkIGJ5IHVpZCAlbGQiLCB1c2VyKTsKKwkJaWYgKGdyb3VwICE9IC0xKQorCQkJcHJpbnRmKCIgZ2lkICVsZCIsIGdyb3VwKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisjZWxzZQorCXB1dHMoaWZyLmlmcl9uYW1lKTsKKyNlbmRpZgorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKyNlbHNlCisKKy8qIC0yMTAgYnl0ZXM6ICovCisKK2ludCB0dW5jdGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHR1bmN0bF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJY29uc3QgY2hhciAqb3B0X25hbWUgPSAidGFwJWQiOworCWNvbnN0IGNoYXIgKm9wdF9kZXZpY2UgPSAiL2Rldi9uZXQvdHVuIjsKKwl1bnNpZ25lZCBvcHRzOworCisJZW51bSB7CisJCU9QVF9mID0gMSA8PCAwLCAvLyBjb250cm9sIGRldmljZSBuYW1lICgvZGV2L25ldC90dW4pCisJCU9QVF90ID0gMSA8PCAxLCAvLyBjcmVhdGUgbmFtZWQgaW50ZXJmYWNlCisJCU9QVF9kID0gMSA8PCAyLCAvLyBkZWxldGUgbmFtZWQgaW50ZXJmYWNlCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0wOnQtLWQ6ZC0tdCI7IC8vIG5vIGFyZ3VtZW50czsgdCBeIGQKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImY6dDpkOnU6ZzpiIiwgLy8gdSwgZywgYiBhY2NlcHRlZCBhbmQgaWdub3JlZAorCQkJJm9wdF9kZXZpY2UsICZvcHRfbmFtZSwgJm9wdF9uYW1lLCBOVUxMLCBOVUxMKTsKKworCS8vIHNldCBpbnRlcmZhY2UgbmFtZQorCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJaWZyLmlmcl9mbGFncyA9IElGRl9UQVAgfCBJRkZfTk9fUEk7CisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIG9wdF9uYW1lKTsKKworCS8vIG9wZW4gZGV2aWNlCisJZmQgPSB4b3BlbihvcHRfZGV2aWNlLCBPX1JEV1IpOworCUlPQ1RMKGZkLCBUVU5TRVRJRkYsICh2b2lkICopJmlmcik7CisKKwkvLyBjcmVhdGUgb3IgZGVsZXRlIGludGVyZmFjZQorCUlPQ1RMKGZkLCBUVU5TRVRQRVJTSVNULCAodm9pZCAqKSh1aW50cHRyX3QpKDAgPT0gKG9wdHMgJiBPUFRfZCkpKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9Db25maWcuc3JjIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZmEzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL0NvbmZpZy5zcmMKQEAgLTAsMCArMSwxNTQgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK0lOU0VSVAorCitjb25maWcgVURIQ1BECisJYm9vbCAidWRoY3Agc2VydmVyICh1ZGhjcGQpIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIHVkaGNwZCBpcyBhIERIQ1Agc2VydmVyIGdlYXJlZCBwcmltYXJpbHkgdG93YXJkIGVtYmVkZGVkIHN5c3RlbXMsCisJICB3aGlsZSBzdHJpdmluZyB0byBiZSBmdWxseSBmdW5jdGlvbmFsIGFuZCBSRkMgY29tcGxpYW50LgorCitjb25maWcgREhDUFJFTEFZCisJYm9vbCAiZGhjcHJlbGF5IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVURIQ1BECisJaGVscAorCSAgZGhjcHJlbGF5IGxpc3RlbnMgZm9yIGRoY3AgcmVxdWVzdHMgb24gb25lIG9yIG1vcmUgaW50ZXJmYWNlcworCSAgYW5kIGZvcndhcmRzIHRoZXNlIHJlcXVlc3RzIHRvIGEgZGlmZmVyZW50IGludGVyZmFjZSBvciBkaGNwCisJICBzZXJ2ZXIuCisKK2NvbmZpZyBEVU1QTEVBU0VTCisJYm9vbCAiTGVhc2UgZGlzcGxheSB1dGlsaXR5IChkdW1wbGVhc2VzKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVESENQRAorCWhlbHAKKwkgIGR1bXBsZWFzZXMgZGlzcGxheXMgdGhlIGxlYXNlcyB3cml0dGVuIG91dCBieSB0aGUgdWRoY3BkIHNlcnZlci4KKwkgIExlYXNlIHRpbWVzIGFyZSBzdG9yZWQgaW4gdGhlIGZpbGUgYnkgdGltZSByZW1haW5pbmcgaW4gbGVhc2UsIG9yCisJICBieSB0aGUgYWJzb2x1dGUgdGltZSB0aGF0IGl0IGV4cGlyZXMgaW4gc2Vjb25kcyBmcm9tIGVwb2NoLgorCitjb25maWcgRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZCisJYm9vbCAiUmV3cml0ZSB0aGUgbGVhc2UgZmlsZSBhdCBldmVyeSBuZXcgYWNrbm93bGVkZ2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEQKKwloZWxwCisJICBJZiBzZWxlY3RlZCwgdWRoY3BkIHdpbGwgd3JpdGUgYSBuZXcgZmlsZSB3aXRoIGxlYXNlcyBldmVyeQorCSAgdGltZSBhIG5ldyBsZWFzZSBoYXMgYmVlbiBhY2NlcHRlZCwgdGh1cyBlbGltaW5hdGluZyB0aGUgbmVlZAorCSAgdG8gc2VuZCBTSUdVU1IxIGZvciB0aGUgaW5pdGlhbCB3cml0aW5nIG9yIHVwZGF0aW5nLiBBbnkgdGltZWQKKwkgIHJld3JpdGluZyByZW1haW5zIHVuZGlzdHVyYmVkLgorCitjb25maWcgRkVBVFVSRV9VREhDUERfQkFTRV9JUF9PTl9NQUMKKwlib29sICJTZWxlY3QgSVAgYWRkcmVzcyBiYXNlZCBvbiBjbGllbnQgTUFDIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVURIQ1BECisJaGVscAorCSAgSWYgc2VsZWN0ZWQsIHVkaGNwZCB3aWxsIGJhc2UgaXRzIHNlbGVjdGlvbiBvZiBJUCBhZGRyZXNzIHRvIG9mZmVyCisJICBvbiB0aGUgY2xpZW50J3MgaGFyZHdhcmUgYWRkcmVzcy4gT3RoZXJ3aXNlIHVkaGNwZCB1c2VzIHRoZSBuZXh0CisJICBjb25zZWN1dGl2ZSBmcmVlIGFkZHJlc3MuCisKKwkgIFRoaXMgcmVkdWNlcyB0aGUgZnJlcXVlbmN5IG9mIElQIGFkZHJlc3MgY2hhbmdlcyBmb3IgY2xpZW50cworCSAgd2hpY2ggbGV0IHRoZWlyIGxlYXNlIGV4cGlyZSwgYW5kIG1ha2VzIGNvbnNlY3V0aXZlIERIQ1BPRkZFUlMKKwkgIGZvciB0aGUgc2FtZSBjbGllbnQgdG8gKGFsbW9zdCBhbHdheXMpIGNvbnRhaW4gdGhlIHNhbWUKKwkgIElQIGFkZHJlc3MuCisKK2NvbmZpZyBESENQRF9MRUFTRVNfRklMRQorCXN0cmluZyAiQWJzb2x1dGUgcGF0aCB0byBsZWFzZSBmaWxlIgorCWRlZmF1bHQgIi92YXIvbGliL21pc2MvdWRoY3BkLmxlYXNlcyIKKwlkZXBlbmRzIG9uIFVESENQRAorCWhlbHAKKwkgIHVkaGNwZCBzdG9yZXMgYWRkcmVzc2VzIGluIGEgbGVhc2UgZmlsZS4gVGhpcyBpcyB0aGUgYWJzb2x1dGUgcGF0aAorCSAgb2YgdGhlIGZpbGUuIE5vcm1hbGx5IGl0IGlzIHNhZmUgdG8gbGVhdmUgaXQgdW50b3VjaGVkLgorCitjb25maWcgVURIQ1BDCisJYm9vbCAidWRoY3AgY2xpZW50ICh1ZGhjcGMpIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIHVkaGNwYyBpcyBhIERIQ1AgY2xpZW50IGdlYXJlZCBwcmltYXJpbHkgdG93YXJkIGVtYmVkZGVkIHN5c3RlbXMsCisJICB3aGlsZSBzdHJpdmluZyB0byBiZSBmdWxseSBmdW5jdGlvbmFsIGFuZCBSRkMgY29tcGxpYW50LgorCisJICBUaGUgdWRoY3AgY2xpZW50IG5lZ290aWF0ZXMgYSBsZWFzZSB3aXRoIHRoZSBESENQIHNlcnZlciBhbmQKKwkgIHJ1bnMgYSBzY3JpcHQgd2hlbiBhIGxlYXNlIGlzIG9idGFpbmVkIG9yIGxvc3QuCisKK2NvbmZpZyBGRUFUVVJFX1VESENQQ19BUlBJTkcKKwlib29sICJWZXJpZnkgdGhhdCB0aGUgb2ZmZXJlZCBhZGRyZXNzIGlzIGZyZWUsIHVzaW5nIEFSUCBwaW5nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVURIQ1BDCisJaGVscAorCSAgSWYgc2VsZWN0ZWQsIHVkaGNwYyB3aWxsIHNlbmQgQVJQIHByb2JlcyBhbmQgbWFrZSBzdXJlCisJICB0aGUgb2ZmZXJlZCBhZGRyZXNzIGlzIHJlYWxseSBub3QgaW4gdXNlIGJ5IGFueW9uZS4gVGhlIGNsaWVudAorCSAgd2lsbCBESENQREVDTElORSB0aGUgb2ZmZXIgaWYgdGhlIGFkZHJlc3MgaXMgaW4gdXNlLAorCSAgYW5kIHJlc3RhcnQgdGhlIGRpc2NvdmVyIHByb2Nlc3MuCisKK2NvbmZpZyBGRUFUVVJFX1VESENQX1BPUlQKKwlib29sICJFbmFibGUgJy1QIHBvcnQnIG9wdGlvbiBmb3IgdWRoY3BkIGFuZCB1ZGhjcGMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVREhDUEQgfHwgVURIQ1BDCisJaGVscAorCSAgQXQgdGhlIGNvc3Qgb2YgfjMwMCBieXRlcywgZW5hYmxlcyAtUCBwb3J0IG9wdGlvbi4KKwkgIFRoaXMgZmVhdHVyZSBpcyB0eXBpY2FsbHkgbm90IG5lZWRlZC4KKworY29uZmlnIFVESENQX0RFQlVHCisJaW50ICJNYXhpbXVtIHZlcmJvc2l0eSBsZXZlbCBmb3IgdWRoY3AgYXBwbGV0cyAoMC4uOSkiCisJZGVmYXVsdCA5CisJcmFuZ2UgMCA5CisJZGVwZW5kcyBvbiBVREhDUEQgfHwgVURIQ1BDIHx8IERIQ1BSRUxBWQorCWhlbHAKKwkgIFZlcmJvc2l0eSBjYW4gYmUgaW5jcmVhc2VkIHdpdGggbXVsdGlwbGUgLXYgb3B0aW9ucy4KKwkgIFRoaXMgb3B0aW9uIGNvbnRyb2xzIGhvdyBoaWdoIGl0IGNhbiBiZSBjcmFua2VkIHVwLgorCisJICBCaWdnZXIgdmFsdWVzIHJlc3VsdCBpbiBiaWdnZXIgY29kZS4gTGV2ZWxzIGFib3ZlIDEKKwkgIGFyZSB2ZXJ5IHZlcmJvc2UgYW5kIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG9ubHkuCisKK2NvbmZpZyBGRUFUVVJFX1VESENQX1JGQzMzOTcKKwlib29sICJTdXBwb3J0IGZvciBSRkMzMzk3IGRvbWFpbiBzZWFyY2ggKGV4cGVyaW1lbnRhbCkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEQgfHwgVURIQ1BDCisJaGVscAorCSAgSWYgc2VsZWN0ZWQsIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgd2lsbCBzdXBwb3J0IHBhc3Npbmcgb2YgZG9tYWluCisJICBzZWFyY2ggbGlzdHMgdmlhIG9wdGlvbiAxMTksIHNwZWNpZmllZCBpbiBSRkMgMzM5NywKKwkgIGFuZCBTSVAgc2VydmVycyBvcHRpb24gMTIwLCBzcGVjaWZpZWQgaW4gUkZDIDMzNjEuCisKK2NvbmZpZyBGRUFUVVJFX1VESENQXzgwMjFRCisJYm9vbCAiU3VwcG9ydCBmb3IgODAyLjFRIFZMQU4gcGFyYW1ldGVycyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVESENQRCB8fCBVREhDUEMKKwloZWxwCisJICBJZiBzZWxlY3RlZCwgYm90aCBjbGllbnQgYW5kIHNlcnZlciB3aWxsIHN1cHBvcnQgcGFzc2luZyBvZiBWTEFOCisJICBJRCBhbmQgcHJpb3JpdHkgdmlhIG9wdGlvbnMgMTMyIGFuZCAxMzMgYXMgcGVyIDgwMi4xUS4KKworY29uZmlnIFVESENQQ19ERUZBVUxUX1NDUklQVAorCXN0cmluZyAiQWJzb2x1dGUgcGF0aCB0byBjb25maWcgc2NyaXB0IgorCWRlZmF1bHQgIi91c3Ivc2hhcmUvdWRoY3BjL2RlZmF1bHQuc2NyaXB0IgorCWRlcGVuZHMgb24gVURIQ1BDCisJaGVscAorCSAgVGhpcyBzY3JpcHQgaXMgY2FsbGVkIGFmdGVyIHVkaGNwYyByZWNlaXZlcyBhbiBhbnN3ZXIuIFNlZQorCSAgZXhhbXBsZXMvdWRoY3AgZm9yIGEgd29ya2luZyBleGFtcGxlLiBOb3JtYWxseSBpdCBpcyBzYWZlCisJICB0byBsZWF2ZSB0aGlzIHVudG91Y2hlZC4KKworY29uZmlnIFVESENQQ19TTEFDS19GT1JfQlVHR1lfU0VSVkVSUworCWludCAiREhDUCBvcHRpb25zIHNsYWNrIGJ1ZmZlciBzaXplIgorCWRlZmF1bHQgODAKKwlyYW5nZSAwIDkyNAorCWRlcGVuZHMgb24gVURIQ1BEIHx8IFVESENQQworCWhlbHAKKwkgIFNvbWUgYnVnZ3kgREhDUCBzZXJ2ZXJzIHNlbmQgREhDUCBvZmZlciBwYWNrZXRzIHdpdGggb3B0aW9uCisJICBmaWVsZCBsYXJnZXIgdGhhbiB3ZSBleHBlY3QgKHdoaWNoIG1pZ2h0IGFsc28gYmUgY29uc2lkZXJlZCBhCisJICBidWZmZXIgb3ZlcmZsb3cgYXR0ZW1wdCkuIFRoZXNlIHBhY2tldHMgYXJlIG5vcm1hbGx5IGRpc2NhcmRlZC4KKwkgIElmIGNpcmN1bXN0YW5jZXMgYmV5b25kIHlvdXIgY29udHJvbCBmb3JjZSB5b3UgdG8gc3VwcG9ydCBzdWNoCisJICBzZXJ2ZXJzLCB0aGlzIG1heSBoZWxwLiBUaGUgdXBwZXIgbGltaXQgKDkyNCkgbWFrZXMgZGhjcGMgYWNjZXB0CisJICBldmVuIDE1MDAgYnl0ZSBwYWNrZXRzIChtYXhpbXVtLXNpemVkIGV0aGVybmV0IHBhY2tldHMpLgorCisJICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBtYWtlIGRoY3BbY2RdIGVtaXQgbm9uLXN0YW5kYXJkCisJICBzaXplZCBwYWNrZXRzLgorCisJICBLbm93biBidWdneSBESENQIHNlcnZlcnM6CisJICAzQ29tIE9mZmljZUNvbm5lY3QgUmVtb3RlIDgxMiBBRFNMIFJvdXRlcjoKKwkgICAgc2VlbXMgdG8gY29uZnVzZSBtYXhpbXVtIGFsbG93ZWQgVURQIHBhY2tldCBzaXplIHdpdGgKKwkgICAgbWF4aW11bSBzaXplIG9mIGVudGlyZSBJUCBwYWNrZXQsIGFuZCBzZW5kcyBwYWNrZXRzIHdoaWNoIGFyZQorCSAgICAyOCBieXRlcyB0b28gbGFyZ2UuCisJICBTZWVkbmV0IChJU1ApIFZEU0w6IHNlbmRzIHBhY2tldHMgMiBieXRlcyB0b28gbGFyZ2UuCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3NjdiYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDIxIEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyMKKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoQ09ORklHX1VESENQQykgICAgICs9IGNvbW1vbi5vIHBhY2tldC5vIHNpZ25hbHBpcGUubyBzb2NrZXQubworbGliLSQoQ09ORklHX1VESENQRCkgICAgICs9IGNvbW1vbi5vIHBhY2tldC5vIHNpZ25hbHBpcGUubyBzb2NrZXQubworCitsaWItJChDT05GSUdfVURIQ1BDKSAgICAgKz0gZGhjcGMubworbGliLSQoQ09ORklHX1VESENQRCkgICAgICs9IGRoY3BkLm8gYXJwcGluZy5vIGZpbGVzLm8gbGVhc2VzLm8gc3RhdGljX2xlYXNlcy5vCitsaWItJChDT05GSUdfRFVNUExFQVNFUykgKz0gZHVtcGxlYXNlcy5vCitsaWItJChDT05GSUdfREhDUFJFTEFZKSAgKz0gZGhjcHJlbGF5Lm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfVURIQ1BDX0FSUElORykgKz0gYXJwcGluZy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9VREhDUF9SRkMzMzk3KSArPSBkb21haW5fY29kZWMubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9hcnBwaW5nLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2FycHBpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjYzNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9hcnBwaW5nLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1vc3RseSBzdG9sZW4gZnJvbTogZGhjcGNkIC0gREhDUCBjbGllbnQgZGFlbW9uCisgKiBieSBZb2ljaGkgSGFyaWd1Y2hpIDx5b2ljaGlAZm9yZS5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkaGNwZC5oIgorCitzdHJ1Y3QgYXJwTXNnIHsKKwkvKiBFdGhlcm5ldCBoZWFkZXIgKi8KKwl1aW50OF90ICBoX2Rlc3RbNl07ICAgICAvKiAwMCBkZXN0aW5hdGlvbiBldGhlciBhZGRyICovCisJdWludDhfdCAgaF9zb3VyY2VbNl07ICAgLyogMDYgc291cmNlIGV0aGVyIGFkZHIgKi8KKwl1aW50MTZfdCBoX3Byb3RvOyAgICAgICAvKiAwYyBwYWNrZXQgdHlwZSBJRCBmaWVsZCAqLworCisJLyogQVJQIHBhY2tldCAqLworCXVpbnQxNl90IGh0eXBlOyAgICAgICAgIC8qIDBlIGhhcmR3YXJlIHR5cGUgKG11c3QgYmUgQVJQSFJEX0VUSEVSKSAqLworCXVpbnQxNl90IHB0eXBlOyAgICAgICAgIC8qIDEwIHByb3RvY29sIHR5cGUgKG11c3QgYmUgRVRIX1BfSVApICovCisJdWludDhfdCAgaGxlbjsgICAgICAgICAgLyogMTIgaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKG11c3QgYmUgNikgKi8KKwl1aW50OF90ICBwbGVuOyAgICAgICAgICAvKiAxMyBwcm90b2NvbCBhZGRyZXNzIGxlbmd0aCAobXVzdCBiZSA0KSAqLworCXVpbnQxNl90IG9wZXJhdGlvbjsgICAgIC8qIDE0IEFSUCBvcGNvZGUgKi8KKwl1aW50OF90ICBzSGFkZHJbNl07ICAgICAvKiAxNiBzZW5kZXIncyBoYXJkd2FyZSBhZGRyZXNzICovCisJdWludDhfdCAgc0luYWRkcls0XTsgICAgLyogMWMgc2VuZGVyJ3MgSVAgYWRkcmVzcyAqLworCXVpbnQ4X3QgIHRIYWRkcls2XTsgICAgIC8qIDIwIHRhcmdldCdzIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwl1aW50OF90ICB0SW5hZGRyWzRdOyAgICAvKiAyNiB0YXJnZXQncyBJUCBhZGRyZXNzICovCisJdWludDhfdCAgcGFkWzE4XTsgICAgICAgLyogMmEgcGFkIGZvciBtaW4uIGV0aGVybmV0IHBheWxvYWQgKDYwIGJ5dGVzKSAqLworfSBQQUNLRUQ7CisKK2VudW0geworCUFSUF9NU0dfU0laRSA9IDB4MmEKK307CisKKy8qIFJldHVybnMgMSBpZiBubyByZXBseSByZWNlaXZlZCAqLworaW50IEZBU1RfRlVOQyBhcnBwaW5nKHVpbnQzMl90IHRlc3RfbmlwLAorCQljb25zdCB1aW50OF90ICpzYWZlX21hYywKKwkJdWludDMyX3QgZnJvbV9pcCwKKwkJdWludDhfdCAqZnJvbV9tYWMsCisJCWNvbnN0IGNoYXIgKmludGVyZmFjZSkKK3sKKwlpbnQgdGltZW91dF9tczsKKwlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKyNkZWZpbmUgcyAocGZkWzBdLmZkKSAgICAgICAgICAgLyogc29ja2V0ICovCisJaW50IHJ2ID0gMTsgICAgICAgICAgICAgLyogIm5vIHJlcGx5IHJlY2VpdmVkIiB5ZXQgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsgICAvKiBmb3IgaW50ZXJmYWNlIG5hbWUgKi8KKwlzdHJ1Y3QgYXJwTXNnIGFycDsKKworCXMgPSBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX1BBQ0tFVCwgaHRvbnMoRVRIX1BfQVJQKSk7CisJaWYgKHMgPT0gLTEpIHsKKwkJYmJfcGVycm9yX21zZyhiYl9tc2dfY2FuX25vdF9jcmVhdGVfcmF3X3NvY2tldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2V0c29ja29wdF9icm9hZGNhc3QocykgPT0gLTEpIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgZW5hYmxlIGJjYXN0IG9uIHJhdyBzb2NrZXQiKTsKKwkJZ290byByZXQ7CisJfQorCisJLyogc2VuZCBhcnAgcmVxdWVzdCAqLworCW1lbXNldCgmYXJwLCAwLCBzaXplb2YoYXJwKSk7CisJbWVtc2V0KGFycC5oX2Rlc3QsIDB4ZmYsIDYpOyAgICAgICAgICAgICAgICAgICAgLyogTUFDIERBICovCisJbWVtY3B5KGFycC5oX3NvdXJjZSwgZnJvbV9tYWMsIDYpOyAgICAgICAgICAgICAgLyogTUFDIFNBICovCisJYXJwLmhfcHJvdG8gPSBodG9ucyhFVEhfUF9BUlApOyAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgdHlwZSAoRXRoZXJuZXQpICovCisJYXJwLmh0eXBlID0gaHRvbnMoQVJQSFJEX0VUSEVSKTsgICAgICAgICAgICAgICAgLyogaGFyZHdhcmUgdHlwZSAqLworCWFycC5wdHlwZSA9IGh0b25zKEVUSF9QX0lQKTsgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sIHR5cGUgKEFSUCBtZXNzYWdlKSAqLworCWFycC5obGVuID0gNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisJYXJwLnBsZW4gPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgYWRkcmVzcyBsZW5ndGggKi8KKwlhcnAub3BlcmF0aW9uID0gaHRvbnMoQVJQT1BfUkVRVUVTVCk7ICAgICAgICAgICAvKiBBUlAgb3AgY29kZSAqLworCW1lbWNweShhcnAuc0hhZGRyLCBmcm9tX21hYywgNik7ICAgICAgICAgICAgICAgIC8qIHNvdXJjZSBoYXJkd2FyZSBhZGRyZXNzICovCisJbWVtY3B5KGFycC5zSW5hZGRyLCAmZnJvbV9pcCwgc2l6ZW9mKGZyb21faXApKTsgLyogc291cmNlIElQIGFkZHJlc3MgKi8KKwkvKiB0SGFkZHIgaXMgemVyby1maWxsZWQgKi8gICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgaGFyZHdhcmUgYWRkcmVzcyAqLworCW1lbWNweShhcnAudEluYWRkciwgJnRlc3RfbmlwLCBzaXplb2YodGVzdF9uaXApKTsvKiB0YXJnZXQgSVAgYWRkcmVzcyAqLworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCXNhZmVfc3RybmNweShhZGRyLnNhX2RhdGEsIGludGVyZmFjZSwgc2l6ZW9mKGFkZHIuc2FfZGF0YSkpOworCWlmIChzZW5kdG8ocywgJmFycCwgc2l6ZW9mKGFycCksIDAsICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgeworCQkvLyBUT0RPOiBlcnJvciBtZXNzYWdlPyBjYWxsZXIgZGlkbid0IGV4cGVjdCB1cyB0byBmYWlsLAorCQkvLyBqdXN0IHJldHVybmluZyAxICJubyByZXBseSByZWNlaXZlZCIgbWlzbGVhZHMgaXQuCisJCWdvdG8gcmV0OworCX0KKworCS8qIHdhaXQgZm9yIGFycCByZXBseSwgYW5kIGNoZWNrIGl0ICovCisJdGltZW91dF9tcyA9IDIwMDA7CisJZG8geworCQl0eXBlZGVmIHVpbnQzMl90IGFsaWFzZWRfdWludDMyX3QgRklYX0FMSUFTSU5HOworCQlpbnQgcjsKKwkJdW5zaWduZWQgcHJldlRpbWUgPSBtb25vdG9uaWNfbXMoKTsKKworCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQlyID0gc2FmZV9wb2xsKHBmZCwgMSwgdGltZW91dF9tcyk7CisJCWlmIChyIDwgMCkKKwkJCWJyZWFrOworCQlpZiAocikgeworCQkJciA9IHNhZmVfcmVhZChzLCAmYXJwLCBzaXplb2YoYXJwKSk7CisJCQlpZiAociA8IDApCisJCQkJYnJlYWs7CisKKwkJCS8vbG9nMygic0hhZGRyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCS8vCWFycC5zSGFkZHJbMF0sIGFycC5zSGFkZHJbMV0sIGFycC5zSGFkZHJbMl0sCisJCQkvLwlhcnAuc0hhZGRyWzNdLCBhcnAuc0hhZGRyWzRdLCBhcnAuc0hhZGRyWzVdKTsKKworCQkJaWYgKHIgPj0gQVJQX01TR19TSVpFCisJCQkgJiYgYXJwLm9wZXJhdGlvbiA9PSBodG9ucyhBUlBPUF9SRVBMWSkKKwkJCSAvKiBkb24ndCBjaGVjayBpdDogTGludXggZG9lc24ndCByZXR1cm4gcHJvcGVyIHRIYWRkciAoZml4ZWQgaW4gMi42LjI0PykgKi8KKwkJCSAvKiAmJiBtZW1jbXAoYXJwLnRIYWRkciwgZnJvbV9tYWMsIDYpID09IDAgKi8KKwkJCSAmJiAqKGFsaWFzZWRfdWludDMyX3QqKWFycC5zSW5hZGRyID09IHRlc3RfbmlwCisJCQkpIHsKKwkJCQkvKiBpZiBBUlAgc291cmNlIE1BQyBtYXRjaGVzIHNhZmVfbWFjCisJCQkJICogKHdoaWNoIGlzIGNsaWVudCdzIE1BQyksIHRoZW4gaXQncyBub3QgYSBjb25mbGljdAorCQkJCSAqIChjbGllbnQgc2ltcGx5IGFscmVhZHkgaGFzIHRoaXMgSVAgYW5kIHJlcGxpZXMgdG8gQVJQcyEpCisJCQkJICovCisJCQkJaWYgKCFzYWZlX21hYyB8fCBtZW1jbXAoc2FmZV9tYWMsIGFycC5zSGFkZHIsIDYpICE9IDApCisJCQkJCXJ2ID0gMDsKKwkJCQkvL2Vsc2UgbG9nMigic0hhZGRyID09IHNhZmVfbWFjIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJdGltZW91dF9tcyAtPSAodW5zaWduZWQpbW9ub3RvbmljX21zKCkgLSBwcmV2VGltZTsKKwl9IHdoaWxlICh0aW1lb3V0X21zID4gMCk7CisKKyByZXQ6CisJY2xvc2Uocyk7CisJbG9nMSgiJXNycCByZXBseSByZWNlaXZlZCBmb3IgdGhpcyBhZGRyZXNzIiwgcnYgPyAiTm8gYSIgOiAiQSIpOworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvY29tbW9uLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTM0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2NvbW1vbi5jCkBAIC0wLDAgKzEsNTM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBSZXdyaXRlIGJ5IFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IEp1bHkgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCit1bnNpZ25lZCBkaGNwX3ZlcmJvc2U7CisjZW5kaWYKKworY29uc3QgdWludDhfdCBNQUNfQkNBU1RfQUREUls2XSBBTElHTjIgPSB7CisJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorfTsKKworLyogU3VwcG9ydGVkIG9wdGlvbnMgYXJlIGVhc2lseSBhZGRlZCBoZXJlLgorICogU2VlIFJGQzIxMzIgZm9yIG1vcmUgb3B0aW9ucy4KKyAqIE9QVElPTl9SRVE6IHRoZXNlIG9wdGlvbnMgYXJlIHJlcXVlc3RlZCBieSB1ZGhjcGMgKHVubGVzcyAtbykuCisgKi8KK2NvbnN0IHN0cnVjdCBkaGNwX29wdGZsYWcgZGhjcF9vcHRmbGFnc1tdID0geworCS8qIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAqLworCXsgT1BUSU9OX0lQICAgICAgICAgICAgICAgICAgIHwgT1BUSU9OX1JFUSwgMHgwMSB9LCAvKiBESENQX1NVQk5FVCAgICAgICAgKi8KKwl7IE9QVElPTl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MDIgfSwgLyogREhDUF9USU1FX09GRlNFVCAgICovCisJeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgfCBPUFRJT05fUkVRLCAweDAzIH0sIC8qIERIQ1BfUk9VVEVSICAgICAgICAqLworLy8JeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgICAgICAgICAgICAgLCAweDA0IH0sIC8qIERIQ1BfVElNRV9TRVJWRVIgICAqLworLy8JeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgICAgICAgICAgICAgLCAweDA1IH0sIC8qIERIQ1BfTkFNRV9TRVJWRVIgICAqLworCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgIHwgT1BUSU9OX1JFUSwgMHgwNiB9LCAvKiBESENQX0ROU19TRVJWRVIgICAgKi8KKy8vCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgwNyB9LCAvKiBESENQX0xPR19TRVJWRVIgICAgKi8KKy8vCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgwOCB9LCAvKiBESENQX0NPT0tJRV9TRVJWRVIgKi8KKwl7IE9QVElPTl9JUCB8IE9QVElPTl9MSVNUICAgICAgICAgICAgICAgICAsIDB4MDkgfSwgLyogREhDUF9MUFJfU0VSVkVSICAgICovCisJeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgfCBPUFRJT05fUkVRLCAweDBjIH0sIC8qIERIQ1BfSE9TVF9OQU1FICAgICAqLworCXsgT1BUSU9OX1UxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgwZCB9LCAvKiBESENQX0JPT1RfU0laRSAgICAgKi8KKwl7IE9QVElPTl9TVFJJTkcgICAgICAgICAgICAgICB8IE9QVElPTl9SRVEsIDB4MGYgfSwgLyogREhDUF9ET01BSU5fTkFNRSAgICovCisJeyBPUFRJT05fSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDEwIH0sIC8qIERIQ1BfU1dBUF9TRVJWRVIgICAqLworCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgxMSB9LCAvKiBESENQX1JPT1RfUEFUSCAgICAgKi8KKwl7IE9QVElPTl9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MTcgfSwgLyogREhDUF9JUF9UVEwgICAgICAgICovCisJeyBPUFRJT05fVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDFhIH0sIC8qIERIQ1BfTVRVICAgICAgICAgICAqLworCXsgT1BUSU9OX0lQICAgICAgICAgICAgICAgICAgIHwgT1BUSU9OX1JFUSwgMHgxYyB9LCAvKiBESENQX0JST0FEQ0FTVCAgICAgKi8KKwl7IE9QVElPTl9JUF9QQUlSIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAsIDB4MjEgfSwgLyogREhDUF9ST1VURVMgICAgICAgICovCisJeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDI4IH0sIC8qIERIQ1BfTklTX0RPTUFJTiAgICAqLworCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgyOSB9LCAvKiBESENQX05JU19TRVJWRVIgICAgKi8KKwl7IE9QVElPTl9JUCB8IE9QVElPTl9MSVNUICAgICB8IE9QVElPTl9SRVEsIDB4MmEgfSwgLyogREhDUF9OVFBfU0VSVkVSICAgICovCisJeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgICAgICAgICAgICAgLCAweDJjIH0sIC8qIERIQ1BfV0lOU19TRVJWRVIgICAqLworCXsgT1BUSU9OX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzMyB9LCAvKiBESENQX0xFQVNFX1RJTUUgICAgKi8KKwl7IE9QVElPTl9JUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MzYgfSwgLyogREhDUF9TRVJWRVJfSUQgICAgICovCisJeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDM4IH0sIC8qIERIQ1BfRVJSX01FU1NBR0UgICAqLworLy9UT0RPOiBtdXN0IGJlIGNvbWJpbmVkIHdpdGggJ3NuYW1lJyBhbmQgJ2ZpbGUnIGhhbmRsaW5nOgorCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg0MiB9LCAvKiBESENQX1RGVFBfU0VSVkVSX05BTUUgKi8KKwl7IE9QVElPTl9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4NDMgfSwgLyogREhDUF9CT09UX0ZJTEUgICAgICovCisvL1RPRE86IG5vdCBhIHN0cmluZywgYnV0IGEgc2V0IG9mIExBU0NJSSBzdHJpbmdzOgorLy8JeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDREIH0sIC8qIERIQ1BfVVNFUl9DTEFTUyAgICAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwl7IE9QVElPTl9ETlNfU1RSSU5HIHwgT1BUSU9OX0xJU1QgICAgICAgICAsIDB4NzcgfSwgLyogREhDUF9ET01BSU5fU0VBUkNIICovCisJeyBPUFRJT05fU0lQX1NFUlZFUlMgICAgICAgICAgICAgICAgICAgICAgLCAweDc4IH0sIC8qIERIQ1BfU0lQX1NFUlZFUlMgICAqLworI2VuZGlmCisJeyBPUFRJT05fU1RBVElDX1JPVVRFUyAgICAgICAgICAgICAgICAgICAgLCAweDc5IH0sIC8qIERIQ1BfU1RBVElDX1JPVVRFUyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQXzgwMjFRCisJeyBPUFRJT05fVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDg0IH0sIC8qIERIQ1BfVkxBTl9JRCAgICAgICAqLworCXsgT1BUSU9OX1U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg4NSB9LCAvKiBESENQX1ZMQU5fUFJJT1JJVFkgKi8KKyNlbmRpZgorCXsgT1BUSU9OX1NUQVRJQ19ST1VURVMgICAgICAgICAgICAgICAgICAgICwgMHhmOSB9LCAvKiBESENQX01TX1NUQVRJQ19ST1VURVMgKi8KKwl7IE9QVElPTl9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4ZmMgfSwgLyogREhDUF9XUEFEICAgICAgICAgICovCisKKwkvKiBPcHRpb25zIGJlbG93IGhhdmUgbm8gbWF0Y2ggaW4gZGhjcF9vcHRpb25fc3RyaW5nc1tdLAorCSAqIGFyZSBub3QgcGFzc2VkIHRvIGRoY3BjIHNjcmlwdHMsIGFuZCBjYW5ub3QgYmUgc3BlY2lmaWVkCisJICogd2l0aCAib3B0aW9uIFhYWCBZWVkiIHN5bnRheCBpbiBkaGNwZCBjb25maWcgZmlsZS4KKwkgKiBUaGVzZSBlbnRyaWVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieSB1ZGhjcFtjZF0KKwkgKiB0byBjb3JyZWN0bHkgZW5jb2RlIG9wdGlvbnMgaW50byBwYWNrZXRzLgorCSAqLworCisJeyBPUFRJT05fSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDMyIH0sIC8qIERIQ1BfUkVRVUVTVEVEX0lQICAqLworCXsgT1BUSU9OX1U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzNSB9LCAvKiBESENQX01FU1NBR0VfVFlQRSAgKi8KKwl7IE9QVElPTl9VMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MzkgfSwgLyogREhDUF9NQVhfU0laRSAgICAgICovCisvL2xvb2tzIGxpa2UgdGhlc2Ugb3B0cyB3aWxsIHdvcmsganVzdCBmaW5lIGV2ZW4gd2l0aG91dCB0aGVzZSBkZWZzOgorLy8JeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDNjIH0sIC8qIERIQ1BfVkVORE9SICAgICAgICAqLworLy8JLyogbm90IHJlYWxseSBhIHN0cmluZzogKi8KKy8vCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzZCB9LCAvKiBESENQX0NMSUVOVF9JRCAgICAgKi8KKwl7IDAsIDAgfSAvKiB6ZXJvZWQgdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKKy8qIFVzZWQgZm9yIGNvbnZlcnRpbmcgb3B0aW9ucyBmcm9tIGluY29taW5nIHBhY2tldHMgdG8gZW52IHZhcmlhYmxlcworICogZm9yIHVkaGNwYyBzdHJpcHQsIGFuZCBmb3Igc2V0dGluZyBvcHRpb25zIGZvciB1ZGhjcGQgdmlhCisgKiAib3B0IE9QVElPTl9OQU1FIE9QVElPTl9WQUxVRSIgZGlyZWN0aXZlcyBpbiB1ZGhjcGQuY29uZiBmaWxlLgorICovCisvKiBNdXN0IG1hdGNoIGRoY3Bfb3B0ZmxhZ3NbXSBvcmRlciAqLworY29uc3QgY2hhciBkaGNwX29wdGlvbl9zdHJpbmdzW10gQUxJR04xID0KKwkic3VibmV0IiAiXDAiICAgICAgLyogREhDUF9TVUJORVQgICAgICAgICAqLworCSJ0aW1lem9uZSIgIlwwIiAgICAvKiBESENQX1RJTUVfT0ZGU0VUICAgICovCisJInJvdXRlciIgIlwwIiAgICAgIC8qIERIQ1BfUk9VVEVSICAgICAgICAgKi8KKy8vCSJ0aW1lc3J2IiAiXDAiICAgICAvKiBESENQX1RJTUVfU0VSVkVSICAgICovCisvLwkibmFtZXNydiIgIlwwIiAgICAgLyogREhDUF9OQU1FX1NFUlZFUiAgICAqLworCSJkbnMiICJcMCIgICAgICAgICAvKiBESENQX0ROU19TRVJWRVIgICAgICovCisvLwkibG9nc3J2IiAiXDAiICAgICAgLyogREhDUF9MT0dfU0VSVkVSICAgICAqLworLy8JImNvb2tpZXNydiIgIlwwIiAgIC8qIERIQ1BfQ09PS0lFX1NFUlZFUiAgKi8KKwkibHByc3J2IiAiXDAiICAgICAgLyogREhDUF9MUFJfU0VSVkVSICAgICAqLworCSJob3N0bmFtZSIgIlwwIiAgICAvKiBESENQX0hPU1RfTkFNRSAgICAgICovCisJImJvb3RzaXplIiAiXDAiICAgIC8qIERIQ1BfQk9PVF9TSVpFICAgICAgKi8KKwkiZG9tYWluIiAiXDAiICAgICAgLyogREhDUF9ET01BSU5fTkFNRSAgICAqLworCSJzd2Fwc3J2IiAiXDAiICAgICAvKiBESENQX1NXQVBfU0VSVkVSICAgICovCisJInJvb3RwYXRoIiAiXDAiICAgIC8qIERIQ1BfUk9PVF9QQVRIICAgICAgKi8KKwkiaXB0dGwiICJcMCIgICAgICAgLyogREhDUF9JUF9UVEwgICAgICAgICAqLworCSJtdHUiICJcMCIgICAgICAgICAvKiBESENQX01UVSAgICAgICAgICAgICovCisJImJyb2FkY2FzdCIgIlwwIiAgIC8qIERIQ1BfQlJPQURDQVNUICAgICAgKi8KKwkicm91dGVzIiAiXDAiICAgICAgLyogREhDUF9ST1VURVMgICAgICAgICAqLworCSJuaXNkb21haW4iICJcMCIgICAvKiBESENQX05JU19ET01BSU4gICAgICovCisJIm5pc3NydiIgIlwwIiAgICAgIC8qIERIQ1BfTklTX1NFUlZFUiAgICAgKi8KKwkibnRwc3J2IiAiXDAiICAgICAgLyogREhDUF9OVFBfU0VSVkVSICAgICAqLworCSJ3aW5zIiAiXDAiICAgICAgICAvKiBESENQX1dJTlNfU0VSVkVSICAgICovCisJImxlYXNlIiAiXDAiICAgICAgIC8qIERIQ1BfTEVBU0VfVElNRSAgICAgKi8KKwkic2VydmVyaWQiICJcMCIgICAgLyogREhDUF9TRVJWRVJfSUQgICAgICAqLworCSJtZXNzYWdlIiAiXDAiICAgICAvKiBESENQX0VSUl9NRVNTQUdFICAgICovCisJInRmdHAiICJcMCIgICAgICAgIC8qIERIQ1BfVEZUUF9TRVJWRVJfTkFNRSAqLworCSJib290ZmlsZSIgIlwwIiAgICAvKiBESENQX0JPT1RfRklMRSAgICAgICovCisvLwkidXNlcmNsYXNzIiAiXDAiICAgLyogREhDUF9VU0VSX0NMQVNTICAgICAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwkic2VhcmNoIiAiXDAiICAgICAgLyogREhDUF9ET01BSU5fU0VBUkNIICAqLworLy8gZG9lc24ndCB3b3JrIGluIHVkaGNwZC5jb25mIHNpbmNlIE9QVElPTl9TSVBfU0VSVkVSUworLy8gaXMgbm90IGhhbmRsZWQgeWV0IGJ5ICJzdHJpbmctPm9wdGlvbiIgY29udmVyc2lvbiBjb2RlOgorCSJzaXBzcnYiICJcMCIgICAgICAvKiBESENQX1NJUF9TRVJWRVJTICAgICovCisjZW5kaWYKKy8vIGRvZXNuJ3Qgd29yayBpbiB1ZGhjcGQuY29uZiBzaW5jZSBPUFRJT05fU1RBVElDX1JPVVRFUworLy8gaXMgbm90IGhhbmRsZWQgeWV0IGJ5ICJzdHJpbmctPm9wdGlvbiIgY29udmVyc2lvbiBjb2RlOgorCSJzdGF0aWNyb3V0ZXMiICJcMCIvKiBESENQX1NUQVRJQ19ST1VURVMgICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfODAyMVEKKwkidmxhbmlkIiAiXDAiICAgICAgLyogREhDUF9WTEFOX0lEICAgICAgICAqLworCSJ2bGFucHJpb3JpdHkiICJcMCIvKiBESENQX1ZMQU5fUFJJT1JJVFkgICovCisjZW5kaWYKKwkibXNzdGF0aWNyb3V0ZXMiIlwwIi8qIERIQ1BfTVNfU1RBVElDX1JPVVRFUyAqLworCSJ3cGFkIiAiXDAiICAgICAgICAvKiBESENQX1dQQUQgICAgICAgICAgICovCisJOworCisvKiBMZW5ndGhzIG9mIHRoZSBvcHRpb24gdHlwZXMgaW4gYmluYXJ5IGZvcm0uCisgKiBVc2VkIGJ5OgorICogdWRoY3Bfc3RyMm9wdHNldDogdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRvIGFsbG9jYXRlLgorICogeG1hbGxvY19vcHRuYW1lX29wdHZhbDogdG8gZXN0aW1hdGUgc3RyaW5nIGxlbmd0aAorICogZnJvbSBiaW5hcnkgb3B0aW9uIGxlbmd0aDogKG9wdGlvbltMRU5dIC8gZGhjcF9vcHRpb25fbGVuZ3Roc1tvcHRfdHlwZV0pCisgKiBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLCBtdWx0aXBseSBpbiBieSBvbmUgZWxlbWVudCdzIHN0cmluZyB3aWR0aAorICogKGxlbl9vZl9vcHRpb25fYXNfc3RyaW5nW29wdF90eXBlXSkgYW5kIHlvdSBrbm93IGhvdyB3aWRlIHN0cmluZyB5b3UgbmVlZC4KKyAqLworY29uc3QgdWludDhfdCBkaGNwX29wdGlvbl9sZW5ndGhzW10gQUxJR04xID0geworCVtPUFRJT05fSVBdID0gICAgICA0LAorCVtPUFRJT05fSVBfUEFJUl0gPSA4LAorLy8JW09QVElPTl9CT09MRUFOXSA9IDEsCisJW09QVElPTl9TVFJJTkddID0gIDEsICAvKiBpZ25vcmVkIGJ5IHVkaGNwX3N0cjJvcHRzZXQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJW09QVElPTl9ETlNfU1RSSU5HXSA9IDEsICAvKiBpZ25vcmVkIGJ5IGJvdGggdWRoY3Bfc3RyMm9wdHNldCBhbmQgeG1hbGxvY19vcHRuYW1lX29wdHZhbCAqLworCVtPUFRJT05fU0lQX1NFUlZFUlNdID0gMSwKKyNlbmRpZgorCVtPUFRJT05fVThdID0gICAgICAxLAorCVtPUFRJT05fVTE2XSA9ICAgICAyLAorLy8JW09QVElPTl9TMTZdID0gICAgIDIsCisJW09QVElPTl9VMzJdID0gICAgIDQsCisJW09QVElPTl9TMzJdID0gICAgIDQsCisJLyogSnVzdCBsaWtlIE9QVElPTl9TVFJJTkcsIHdlIHVzZSBtaW5pbXVtIGxlbmd0aCBoZXJlICovCisJW09QVElPTl9TVEFUSUNfUk9VVEVTXSA9IDUsCit9OworCisKKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMgorc3RhdGljIHZvaWQgbG9nX29wdGlvbihjb25zdCBjaGFyICpwZngsIGNvbnN0IHVpbnQ4X3QgKm9wdCkKK3sKKwlpZiAoZGhjcF92ZXJib3NlID49IDIpIHsKKwkJY2hhciBidWZbMjU2ICogMiArIDJdOworCQkqYmluMmhleChidWYsICh2b2lkKikgKG9wdCArIE9QVF9EQVRBKSwgb3B0W09QVF9MRU5dKSA9ICdcMCc7CisJCWJiX2luZm9fbXNnKCIlczogMHglMDJ4ICVzIiwgcGZ4LCBvcHRbT1BUX0NPREVdLCBidWYpOworCX0KK30KKyNlbHNlCisjIGRlZmluZSBsb2dfb3B0aW9uKHBmeCwgb3B0KSAoKHZvaWQpMCkKKyNlbmRpZgorCit1bnNpZ25lZCBGQVNUX0ZVTkMgdWRoY3Bfb3B0aW9uX2lkeChjb25zdCBjaGFyICpuYW1lKQoreworCWludCBuID0gaW5kZXhfaW5fc3RyaW5ncyhkaGNwX29wdGlvbl9zdHJpbmdzLCBuYW1lKTsKKwlpZiAobiA+PSAwKQorCQlyZXR1cm4gbjsKKworCXsKKwkJY2hhciBidWZbc2l6ZW9mKGRoY3Bfb3B0aW9uX3N0cmluZ3MpXTsKKwkJY2hhciAqZCA9IGJ1ZjsKKwkJY29uc3QgY2hhciAqcyA9IGRoY3Bfb3B0aW9uX3N0cmluZ3M7CisJCXdoaWxlIChzIDwgZGhjcF9vcHRpb25fc3RyaW5ncyArIHNpemVvZihkaGNwX29wdGlvbl9zdHJpbmdzKSAtIDIpIHsKKwkJCSpkKysgPSAoKnMgPT0gJ1wwJyA/ICcgJyA6ICpzKTsKKwkJCXMrKzsKKwkJfQorCQkqZCA9ICdcMCc7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIG9wdGlvbiAnJXMnLCBrbm93biBvcHRpb25zOiAlcyIsIG5hbWUsIGJ1Zik7CisJfQorfQorCisvKiBHZXQgYW4gb3B0aW9uIHdpdGggYm91bmRzIGNoZWNraW5nICh3YXJuaW5nLCByZXN1bHQgaXMgbm90IGFsaWduZWQpICovCit1aW50OF90KiBGQVNUX0ZVTkMgdWRoY3BfZ2V0X29wdGlvbihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgaW50IGNvZGUpCit7CisJdWludDhfdCAqb3B0aW9ucHRyOworCWludCBsZW47CisJaW50IHJlbTsKKwlpbnQgb3ZlcmxvYWQgPSAwOworCWVudW0geworCQlGSUxFX0ZJRUxEMTAxICA9IEZJTEVfRklFTEQgICogMHgxMDEsCisJCVNOQU1FX0ZJRUxEMTAxID0gU05BTUVfRklFTEQgKiAweDEwMSwKKwl9OworCisJLyogb3B0aW9uIGJ5dGVzOiBbY29kZV1bbGVuXVtkYXRhMV1bZGF0YTJdLi5bZGF0YUxFTl0gKi8KKwlvcHRpb25wdHIgPSBwYWNrZXQtPm9wdGlvbnM7CisJcmVtID0gc2l6ZW9mKHBhY2tldC0+b3B0aW9ucyk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHJlbSA8PSAwKSB7CisJCQliYl9lcnJvcl9tc2coImJhZCBwYWNrZXQsIG1hbGZvcm1lZCBvcHRpb24gZmllbGQiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChvcHRpb25wdHJbT1BUX0NPREVdID09IERIQ1BfUEFERElORykgeworCQkJcmVtLS07CisJCQlvcHRpb25wdHIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvcHRpb25wdHJbT1BUX0NPREVdID09IERIQ1BfRU5EKSB7CisJCQlpZiAoKG92ZXJsb2FkICYgRklMRV9GSUVMRDEwMSkgPT0gRklMRV9GSUVMRCkgeworCQkJCS8qIGNhbiB1c2UgcGFja2V0LT5maWxlLCBhbmQgZGlkbid0IGxvb2sgYXQgaXQgeWV0ICovCisJCQkJb3ZlcmxvYWQgfD0gRklMRV9GSUVMRDEwMTsgLyogIndlIGxvb2tlZCBhdCBpdCIgKi8KKwkJCQlvcHRpb25wdHIgPSBwYWNrZXQtPmZpbGU7CisJCQkJcmVtID0gc2l6ZW9mKHBhY2tldC0+ZmlsZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoKG92ZXJsb2FkICYgU05BTUVfRklFTEQxMDEpID09IFNOQU1FX0ZJRUxEKSB7CisJCQkJLyogY2FuIHVzZSBwYWNrZXQtPnNuYW1lLCBhbmQgZGlkbid0IGxvb2sgYXQgaXQgeWV0ICovCisJCQkJb3ZlcmxvYWQgfD0gU05BTUVfRklFTEQxMDE7IC8qICJ3ZSBsb29rZWQgYXQgaXQiICovCisJCQkJb3B0aW9ucHRyID0gcGFja2V0LT5zbmFtZTsKKwkJCQlyZW0gPSBzaXplb2YocGFja2V0LT5zbmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlsZW4gPSAyICsgb3B0aW9ucHRyW09QVF9MRU5dOworCQlyZW0gLT0gbGVuOworCQlpZiAocmVtIDwgMCkKKwkJCWNvbnRpbnVlOyAvKiBjb21wbGFpbiBhbmQgcmV0dXJuIE5VTEwgKi8KKworCQlpZiAob3B0aW9ucHRyW09QVF9DT0RFXSA9PSBjb2RlKSB7CisJCQlsb2dfb3B0aW9uKCJPcHRpb24gZm91bmQiLCBvcHRpb25wdHIpOworCQkJcmV0dXJuIG9wdGlvbnB0ciArIE9QVF9EQVRBOworCQl9CisKKwkJaWYgKG9wdGlvbnB0cltPUFRfQ09ERV0gPT0gREhDUF9PUFRJT05fT1ZFUkxPQUQpIHsKKwkJCW92ZXJsb2FkIHw9IG9wdGlvbnB0cltPUFRfREFUQV07CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJfQorCQlvcHRpb25wdHIgKz0gbGVuOworCX0KKworCS8qIGxvZzMgYmVjYXVzZSB1ZGhjcGMgdXNlcyBpdCBhIGxvdCAtIHZlcnkgbm9pc3kgKi8KKwlsb2czKCJPcHRpb24gMHglMDJ4IG5vdCBmb3VuZCIsIGNvZGUpOworCXJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSAnZW5kJyBvcHRpb24gKG5vIGJvdW5kcyBjaGVja2luZykgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3BfZW5kX29wdGlvbih1aW50OF90ICpvcHRpb25wdHIpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKG9wdGlvbnB0cltpXSAhPSBESENQX0VORCkgeworCQlpZiAob3B0aW9ucHRyW2ldICE9IERIQ1BfUEFERElORykKKwkJCWkgKz0gb3B0aW9ucHRyW2kgKyBPUFRfTEVOXSArIE9QVF9EQVRBLTE7CisJCWkrKzsKKwl9CisJcmV0dXJuIGk7Cit9CisKKy8qIEFkZCBhbiBvcHRpb24gKHN1cHBsaWVkIGluIGJpbmFyeSBmb3JtKSB0byB0aGUgb3B0aW9ucy4KKyAqIE9wdGlvbiBmb3JtYXQ6IFtjb2RlXVtsZW5dW2RhdGExXVtkYXRhMl0uLltkYXRhTEVOXQorICovCit2b2lkIEZBU1RfRlVOQyB1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgdWludDhfdCAqYWRkb3B0KQoreworCXVuc2lnbmVkIGxlbjsKKwl1aW50OF90ICpvcHRpb25wdHIgPSBwYWNrZXQtPm9wdGlvbnM7CisJdW5zaWduZWQgZW5kID0gdWRoY3BfZW5kX29wdGlvbihvcHRpb25wdHIpOworCisJbGVuID0gT1BUX0RBVEEgKyBhZGRvcHRbT1BUX0xFTl07CisJLyogZW5kIHBvc2l0aW9uICsgKG9wdGlvbiBjb2RlL2xlbmd0aCArIGFkZG9wdCBsZW5ndGgpICsgZW5kIG9wdGlvbiAqLworCWlmIChlbmQgKyBsZW4gKyAxID49IERIQ1BfT1BUSU9OU19CVUZTSVpFKSB7CisvL1RPRE86IGxlYXJuIGhvdyB0byB1c2Ugb3ZlcmZsb3cgb3B0aW9uIGlmIHdlIGV4aGF1c3QgcGFja2V0LT5vcHRpb25zW10KKwkJYmJfZXJyb3JfbXNnKCJvcHRpb24gMHglMDJ4IGRpZCBub3QgZml0IGludG8gdGhlIHBhY2tldCIsCisJCQkJYWRkb3B0W09QVF9DT0RFXSk7CisJCXJldHVybjsKKwl9CisJbG9nX29wdGlvbigiQWRkaW5nIG9wdGlvbiIsIGFkZG9wdCk7CisJbWVtY3B5KG9wdGlvbnB0ciArIGVuZCwgYWRkb3B0LCBsZW4pOworCW9wdGlvbnB0cltlbmQgKyBsZW5dID0gREhDUF9FTkQ7Cit9CisKKy8qIEFkZCBhbiBvbmUgdG8gZm91ciBieXRlIG9wdGlvbiB0byBhIHBhY2tldCAqLwordm9pZCBGQVNUX0ZVTkMgdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIHVpbnQ4X3QgY29kZSwgdWludDMyX3QgZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgZGhjcF9vcHRmbGFnICpkaDsKKworCWZvciAoZGggPSBkaGNwX29wdGZsYWdzOyBkaC0+Y29kZTsgZGgrKykgeworCQlpZiAoZGgtPmNvZGUgPT0gY29kZSkgeworCQkJdWludDhfdCBvcHRpb25bNl0sIGxlbjsKKworCQkJb3B0aW9uW09QVF9DT0RFXSA9IGNvZGU7CisJCQlsZW4gPSBkaGNwX29wdGlvbl9sZW5ndGhzW2RoLT5mbGFncyAmIE9QVElPTl9UWVBFX01BU0tdOworCQkJb3B0aW9uW09QVF9MRU5dID0gbGVuOworCQkJaWYgKEJCX0JJR19FTkRJQU4pCisJCQkJZGF0YSA8PD0gOCAqICg0IC0gbGVuKTsKKwkJCS8qIEFzc2lnbm1lbnQgaXMgdW5hbGlnbmVkISAqLworCQkJbW92ZV90b191bmFsaWduZWQzMigmb3B0aW9uW09QVF9EQVRBXSwgZGF0YSk7CisJCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIG9wdGlvbik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwliYl9lcnJvcl9tc2coImNhbid0IGFkZCBvcHRpb24gMHglMDJ4IiwgY29kZSk7Cit9CisKKy8qIEZpbmQgb3B0aW9uICdjb2RlJyBpbiBvcHRfbGlzdCAqLworc3RydWN0IG9wdGlvbl9zZXQqIEZBU1RfRlVOQyB1ZGhjcF9maW5kX29wdGlvbihzdHJ1Y3Qgb3B0aW9uX3NldCAqb3B0X2xpc3QsIHVpbnQ4X3QgY29kZSkKK3sKKwl3aGlsZSAob3B0X2xpc3QgJiYgb3B0X2xpc3QtPmRhdGFbT1BUX0NPREVdIDwgY29kZSkKKwkJb3B0X2xpc3QgPSBvcHRfbGlzdC0+bmV4dDsKKworCWlmIChvcHRfbGlzdCAmJiBvcHRfbGlzdC0+ZGF0YVtPUFRfQ09ERV0gPT0gY29kZSkKKwkJcmV0dXJuIG9wdF9saXN0OworCXJldHVybiBOVUxMOworfQorCisvKiBQYXJzZSBzdHJpbmcgdG8gSVAgaW4gbmV0d29yayBvcmRlciAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9zdHIybmlwKGNvbnN0IGNoYXIgKnN0ciwgdm9pZCAqYXJnKQoreworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKworCWxzYSA9IGhvc3RfYW5kX2FmMnNvY2thZGRyKHN0ciwgMCwgQUZfSU5FVCk7CisJaWYgKCFsc2EpCisJCXJldHVybiAwOworCSoodWludDMyX3QqKWFyZyA9IGxzYS0+dS5zaW4uc2luX2FkZHIuc19hZGRyOworCWZyZWUobHNhKTsKKwlyZXR1cm4gMTsKK30KKworLyogdWRoY3Bfc3RyMm9wdHNldDoKKyAqIFBhcnNlIHN0cmluZyBvcHRpb24gcmVwcmVzZW50YXRpb24gdG8gYmluYXJ5IGZvcm0gYW5kIGFkZCBpdCB0byBvcHRfbGlzdC4KKyAqIENhbGxlZCB0byBwYXJzZSAidWRoY3BjIC14IE9QVE5BTUU6T1BUVkFMIgorICogYW5kIHRvIHBhcnNlIHVkaGNwZC5jb25mJ3MgIm9wdCBPUFROQU1FIE9QVFZBTCIgZGlyZWN0aXZlcy4KKyAqLworLyogaGVscGVyIGZvciB0aGUgaGVscGVyICovCitzdGF0aWMgY2hhciAqYWxsb2NhdGVfdGVtcG9wdF9pZl9uZWVkZWQoCisJCWNvbnN0IHN0cnVjdCBkaGNwX29wdGZsYWcgKm9wdGZsYWcsCisJCWNoYXIgKmJ1ZmZlciwKKwkJaW50ICpsZW5ndGhfcCkKK3sKKwljaGFyICphbGxvY2F0ZWQgPSBOVUxMOworCWlmICgob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLKSA9PSBPUFRJT05fQklOKSB7CisJCWNvbnN0IGNoYXIgKmVuZDsKKwkJYWxsb2NhdGVkID0geHN0cmR1cChidWZmZXIpOyAvKiBtb3JlIHRoYW4gZW5vdWdoICovCisJCWVuZCA9IGhleDJiaW4oYWxsb2NhdGVkLCBidWZmZXIsIDI1NSk7CisJCWlmIChlcnJubykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtYWxmb3JtZWQgaGV4IHN0cmluZyAnJXMnIiwgYnVmZmVyKTsKKwkJKmxlbmd0aF9wID0gZW5kIC0gYWxsb2NhdGVkOworCX0KKwlyZXR1cm4gYWxsb2NhdGVkOworfQorLyogaGVscGVyOiBhZGQgYW4gb3B0aW9uIHRvIHRoZSBvcHRfbGlzdCAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgYXR0YWNoX29wdGlvbigKKwkJc3RydWN0IG9wdGlvbl9zZXQgKipvcHRfbGlzdCwKKwkJY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyAqb3B0ZmxhZywKKwkJY2hhciAqYnVmZmVyLAorCQlpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBvcHRpb25fc2V0ICpleGlzdGluZywgKm5ldywgKipjdXJyOworCWNoYXIgKmFsbG9jYXRlZCA9IE5VTEw7CisKKwlleGlzdGluZyA9IHVkaGNwX2ZpbmRfb3B0aW9uKCpvcHRfbGlzdCwgb3B0ZmxhZy0+Y29kZSk7CisJaWYgKCFleGlzdGluZykgeworCQlsb2cyKCJBdHRhY2hpbmcgb3B0aW9uICUwMnggdG8gbGlzdCIsIG9wdGZsYWctPmNvZGUpOworCQlhbGxvY2F0ZWQgPSBhbGxvY2F0ZV90ZW1wb3B0X2lmX25lZWRlZChvcHRmbGFnLCBidWZmZXIsICZsZW5ndGgpOworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwkJaWYgKChvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9UWVBFX01BU0spID09IE9QVElPTl9ETlNfU1RSSU5HKSB7CisJCQkvKiByZXVzZSBidWZmZXIgYW5kIGxlbmd0aCBmb3IgUkZDMTAzNS1mb3JtYXR0ZWQgc3RyaW5nICovCisJCQlhbGxvY2F0ZWQgPSBidWZmZXIgPSAoY2hhciAqKWRuYW1lX2VuYyhOVUxMLCAwLCBidWZmZXIsICZsZW5ndGgpOworCQl9CisjZW5kaWYKKwkJLyogbWFrZSBhIG5ldyBvcHRpb24gKi8KKwkJbmV3ID0geG1hbGxvYyhzaXplb2YoKm5ldykpOworCQluZXctPmRhdGEgPSB4bWFsbG9jKGxlbmd0aCArIE9QVF9EQVRBKTsKKwkJbmV3LT5kYXRhW09QVF9DT0RFXSA9IG9wdGZsYWctPmNvZGU7CisJCW5ldy0+ZGF0YVtPUFRfTEVOXSA9IGxlbmd0aDsKKwkJbWVtY3B5KG5ldy0+ZGF0YSArIE9QVF9EQVRBLCAoYWxsb2NhdGVkID8gYWxsb2NhdGVkIDogYnVmZmVyKSwgbGVuZ3RoKTsKKworCQljdXJyID0gb3B0X2xpc3Q7CisJCXdoaWxlICgqY3VyciAmJiAoKmN1cnIpLT5kYXRhW09QVF9DT0RFXSA8IG9wdGZsYWctPmNvZGUpCisJCQljdXJyID0gJigqY3VyciktPm5leHQ7CisKKwkJbmV3LT5uZXh0ID0gKmN1cnI7CisJCSpjdXJyID0gbmV3OworCQlnb3RvIHJldDsKKwl9CisKKwlpZiAob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fTElTVCkgeworCQl1bnNpZ25lZCBvbGRfbGVuOworCisJCS8qIGFkZCBpdCB0byBhbiBleGlzdGluZyBvcHRpb24gKi8KKwkJbG9nMigiQXR0YWNoaW5nIG9wdGlvbiAlMDJ4IHRvIGV4aXN0aW5nIG1lbWJlciBvZiBsaXN0Iiwgb3B0ZmxhZy0+Y29kZSk7CisJCWFsbG9jYXRlZCA9IGFsbG9jYXRlX3RlbXBvcHRfaWZfbmVlZGVkKG9wdGZsYWcsIGJ1ZmZlciwgJmxlbmd0aCk7CisJCW9sZF9sZW4gPSBleGlzdGluZy0+ZGF0YVtPUFRfTEVOXTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJCWlmICgob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLKSA9PSBPUFRJT05fRE5TX1NUUklORykgeworCQkJLyogcmV1c2UgYnVmZmVyIGFuZCBsZW5ndGggZm9yIFJGQzEwMzUtZm9ybWF0dGVkIHN0cmluZyAqLworCQkJYWxsb2NhdGVkID0gYnVmZmVyID0gKGNoYXIgKilkbmFtZV9lbmMoZXhpc3RpbmctPmRhdGEgKyBPUFRfREFUQSwgb2xkX2xlbiwgYnVmZmVyLCAmbGVuZ3RoKTsKKwkJfQorI2VuZGlmCisJCWlmIChvbGRfbGVuICsgbGVuZ3RoIDwgMjU1KSB7CisJCQkvKiBhY3R1YWxseSAyNTUgaXMgb2sgdG9vLCBidXQgYWRkaW5nIGEgc3BhY2UgY2FuIG92ZXJsb3cgaXQgKi8KKworCQkJZXhpc3RpbmctPmRhdGEgPSB4cmVhbGxvYyhleGlzdGluZy0+ZGF0YSwgT1BUX0RBVEEgKyAxICsgb2xkX2xlbiArIGxlbmd0aCk7CisJCQlpZiAoKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX1RZUEVfTUFTSykgPT0gT1BUSU9OX1NUUklORykgeworCQkJCS8qIGFkZCBzcGFjZSBzZXBhcmF0b3IgYmV0d2VlbiBTVFJJTkcgb3B0aW9ucyBpbiBhIGxpc3QgKi8KKwkJCQlleGlzdGluZy0+ZGF0YVtPUFRfREFUQSArIG9sZF9sZW5dID0gJyAnOworCQkJCW9sZF9sZW4rKzsKKwkJCX0KKwkJCW1lbWNweShleGlzdGluZy0+ZGF0YSArIE9QVF9EQVRBICsgb2xkX2xlbiwgYnVmZmVyLCBsZW5ndGgpOworCQkJZXhpc3RpbmctPmRhdGFbT1BUX0xFTl0gPSBvbGRfbGVuICsgbGVuZ3RoOworCQl9IC8qIGVsc2UsIGlnbm9yZSB0aGUgZGF0YSwgd2UgY291bGQgcHV0IHRoaXMgaW4gYSBzZWNvbmQgb3B0aW9uIGluIHRoZSBmdXR1cmUgKi8KKwl9IC8qIGVsc2UsIGlnbm9yZSB0aGUgbmV3IGRhdGEgKi8KKworIHJldDoKKwlmcmVlKGFsbG9jYXRlZCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3RyMm9wdHNldChjb25zdCBjaGFyICpjb25zdF9zdHIsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqKm9wdF9saXN0ID0gYXJnOworCWNoYXIgKm9wdCwgKnZhbCwgKmVuZHB0cjsKKwljaGFyICpzdHI7CisJY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyAqb3B0ZmxhZzsKKwlzdHJ1Y3QgZGhjcF9vcHRmbGFnIGJpbl9vcHRmbGFnOworCXVuc2lnbmVkIG9wdGNvZGU7CisJaW50IHJldHZhbCwgbGVuZ3RoOworCWNoYXIgYnVmZmVyWzhdIEFMSUdORUQoNCk7CisJdWludDE2X3QgKnJlc3VsdF91MTYgPSAodWludDE2X3QgKikgYnVmZmVyOworCXVpbnQzMl90ICpyZXN1bHRfdTMyID0gKHVpbnQzMl90ICopIGJ1ZmZlcjsKKworCS8qIENoZWF0LCB0aGUgb25seSAqY29uc3QqIHN0ciBwb3NzaWJsZSBpcyAiIiAqLworCXN0ciA9IChjaGFyICopIGNvbnN0X3N0cjsKKwlvcHQgPSBzdHJ0b2soc3RyLCAiIFx0PSIpOworCWlmICghb3B0KQorCQlyZXR1cm4gMDsKKworCW9wdGNvZGUgPSBiYl9zdHJ0b3Uob3B0LCBOVUxMLCAwKTsKKwlpZiAoIWVycm5vICYmIG9wdGNvZGUgPCAyNTUpIHsKKwkJLyogUmF3IChudW1lcmljKSBvcHRpb24gY29kZSAqLworCQliaW5fb3B0ZmxhZy5mbGFncyA9IE9QVElPTl9CSU47CisJCWJpbl9vcHRmbGFnLmNvZGUgPSBvcHRjb2RlOworCQlvcHRmbGFnID0gJmJpbl9vcHRmbGFnOworCX0gZWxzZSB7CisJCW9wdGZsYWcgPSAmZGhjcF9vcHRmbGFnc1t1ZGhjcF9vcHRpb25faWR4KG9wdCldOworCX0KKworCXJldHZhbCA9IDA7CisJZG8geworCQl2YWwgPSBzdHJ0b2soTlVMTCwgIiwgXHQiKTsKKwkJaWYgKCF2YWwpCisJCQlicmVhazsKKwkJbGVuZ3RoID0gZGhjcF9vcHRpb25fbGVuZ3Roc1tvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9UWVBFX01BU0tdOworCQlyZXR2YWwgPSAwOworCQlvcHQgPSBidWZmZXI7IC8qIG5ldyBtZWFuaW5nIGZvciB2YXJpYWJsZSBvcHQgKi8KKwkJc3dpdGNoIChvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9UWVBFX01BU0spIHsKKwkJY2FzZSBPUFRJT05fSVA6CisJCQlyZXR2YWwgPSB1ZGhjcF9zdHIybmlwKHZhbCwgYnVmZmVyKTsKKwkJCWJyZWFrOworCQljYXNlIE9QVElPTl9JUF9QQUlSOgorCQkJcmV0dmFsID0gdWRoY3Bfc3RyMm5pcCh2YWwsIGJ1ZmZlcik7CisJCQl2YWwgPSBzdHJ0b2soTlVMTCwgIiwgXHQvLSIpOworCQkJaWYgKCF2YWwpCisJCQkJcmV0dmFsID0gMDsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dmFsID0gdWRoY3Bfc3RyMm5pcCh2YWwsIGJ1ZmZlciArIDQpOworCQkJYnJlYWs7CisJCWNhc2UgT1BUSU9OX1NUUklORzoKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJCWNhc2UgT1BUSU9OX0ROU19TVFJJTkc6CisjZW5kaWYKKwkJCWxlbmd0aCA9IHN0cm5sZW4odmFsLCAyNTQpOworCQkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCQlvcHQgPSB2YWw7CisJCQkJcmV0dmFsID0gMTsKKwkJCX0KKwkJCWJyZWFrOworLy8JCWNhc2UgT1BUSU9OX0JPT0xFQU46IHsKKy8vCQkJc3RhdGljIGNvbnN0IGNoYXIgbm9feWVzW10gQUxJR04xID0gIm5vXDB5ZXNcMCI7CisvLwkJCWJ1ZmZlclswXSA9IHJldHZhbCA9IGluZGV4X2luX3N0cmluZ3Mobm9feWVzLCB2YWwpOworLy8JCQlyZXR2YWwrKzsgLyogMCAtIGJhZDsgMTogIm5vIiAyOiAieWVzIiAqLworLy8JCQlicmVhazsKKy8vCQl9CisJCWNhc2UgT1BUSU9OX1U4OgorCQkJYnVmZmVyWzBdID0gc3RydG91bCh2YWwsICZlbmRwdHIsIDApOworCQkJcmV0dmFsID0gKGVuZHB0clswXSA9PSAnXDAnKTsKKwkJCWJyZWFrOworCQkvKiBodG9uWCBhcmUgbWFjcm9zIGluIG9sZGVyIGxpYmMncywgdXNpbmcgdGVtcCB2YXIKKwkJICogaW4gY29kZSBiZWxvdyBmb3Igc2FmZXR5ICovCisJCS8qIFRPRE86IHVzZSBiYl9zdHJ0b1g/ICovCisJCWNhc2UgT1BUSU9OX1UxNjogeworCQkJdW5zaWduZWQgbG9uZyB0bXAgPSBzdHJ0b3VsKHZhbCwgJmVuZHB0ciwgMCk7CisJCQkqcmVzdWx0X3UxNiA9IGh0b25zKHRtcCk7CisJCQlyZXR2YWwgPSAoZW5kcHRyWzBdID09ICdcMCcgLyomJiB0bXAgPCAweDEwMDAwKi8pOworCQkJYnJlYWs7CisJCX0KKy8vCQljYXNlIE9QVElPTl9TMTY6IHsKKy8vCQkJbG9uZyB0bXAgPSBzdHJ0b2wodmFsLCAmZW5kcHRyLCAwKTsKKy8vCQkJKnJlc3VsdF91MTYgPSBodG9ucyh0bXApOworLy8JCQlyZXR2YWwgPSAoZW5kcHRyWzBdID09ICdcMCcpOworLy8JCQlicmVhazsKKy8vCQl9CisJCWNhc2UgT1BUSU9OX1UzMjogeworCQkJdW5zaWduZWQgbG9uZyB0bXAgPSBzdHJ0b3VsKHZhbCwgJmVuZHB0ciwgMCk7CisJCQkqcmVzdWx0X3UzMiA9IGh0b25sKHRtcCk7CisJCQlyZXR2YWwgPSAoZW5kcHRyWzBdID09ICdcMCcpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBPUFRJT05fUzMyOiB7CisJCQlsb25nIHRtcCA9IHN0cnRvbCh2YWwsICZlbmRwdHIsIDApOworCQkJKnJlc3VsdF91MzIgPSBodG9ubCh0bXApOworCQkJcmV0dmFsID0gKGVuZHB0clswXSA9PSAnXDAnKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT1BUSU9OX0JJTjogLyogaGFuZGxlZCBpbiBhdHRhY2hfb3B0aW9uKCkgKi8KKwkJCW9wdCA9IHZhbDsKKwkJCXJldHZhbCA9IDE7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlpZiAocmV0dmFsKQorCQkJYXR0YWNoX29wdGlvbihvcHRfbGlzdCwgb3B0ZmxhZywgb3B0LCBsZW5ndGgpOworCX0gd2hpbGUgKHJldHZhbCAmJiBvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9MSVNUKTsKKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2NvbW1vbi5oIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY5OTFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9jb21tb24uaApAQCAtMCwwICsxLDMxMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4gU2VwdGVtYmVyIDIwMDEKKyAqIFJld3JpdHRlbiBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IChDKSAyMDAzCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBVREhDUF9DT01NT05fSAorI2RlZmluZSBVREhDUF9DT01NT05fSCAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgTUFDX0JDQVNUX0FERFJbNl07IC8qIHNpeCBhbGwtb25lcyAqLworCisKKy8qKiogREhDUCBwYWNrZXQgKioqLworCisvKiBESENQIHByb3RvY29sLiBTZWUgUkZDIDIxMzEgKi8KKyNkZWZpbmUgREhDUF9NQUdJQyAgICAgICAgICAgICAgMHg2MzgyNTM2MworI2RlZmluZSBESENQX09QVElPTlNfQlVGU0laRSAgICAzMDgKKyNkZWZpbmUgQk9PVFJFUVVFU1QgICAgICAgICAgICAgMQorI2RlZmluZSBCT09UUkVQTFkgICAgICAgICAgICAgICAyCisKKy8vVE9ETzogcmVuYW1lIGNpYWRkci95aWFkZHIvY2hhZGRyCitzdHJ1Y3QgZGhjcF9wYWNrZXQgeworCXVpbnQ4X3Qgb3A7ICAgICAgLyogQk9PVFJFUVVFU1Qgb3IgQk9PVFJFUExZICovCisJdWludDhfdCBodHlwZTsgICAvKiBoYXJkd2FyZSBhZGRyZXNzIHR5cGUuIDEgPSAxMG1iIGV0aGVybmV0ICovCisJdWludDhfdCBobGVuOyAgICAvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCXVpbnQ4X3QgaG9wczsgICAgLyogdXNlZCBieSByZWxheSBhZ2VudHMgb25seSAqLworCXVpbnQzMl90IHhpZDsgICAgLyogdW5pcXVlIGlkICovCisJdWludDE2X3Qgc2VjczsgICAvKiBlbGFwc2VkIHNpbmNlIGNsaWVudCBiZWdhbiBhY3F1aXNpdGlvbi9yZW5ld2FsICovCisJdWludDE2X3QgZmxhZ3M7ICAvKiBvbmx5IG9uZSBmbGFnIHNvIGZhcjogKi8KKyNkZWZpbmUgQlJPQURDQVNUX0ZMQUcgMHg4MDAwIC8qICJJIG5lZWQgYnJvYWRjYXN0IHJlcGxpZXMiICovCisJdWludDMyX3QgY2lhZGRyOyAvKiBjbGllbnQgSVAgKGlmIGNsaWVudCBpcyBpbiBCT1VORCwgUkVORVcgb3IgUkVCSU5ESU5HIHN0YXRlKSAqLworCXVpbnQzMl90IHlpYWRkcjsgLyogJ3lvdXInIChjbGllbnQpIElQIGFkZHJlc3MgKi8KKwkvKiBJUCBhZGRyZXNzIG9mIG5leHQgc2VydmVyIHRvIHVzZSBpbiBib290c3RyYXAsIHJldHVybmVkIGluIERIQ1BPRkZFUiwgREhDUEFDSyBieSBzZXJ2ZXIgKi8KKwl1aW50MzJfdCBzaWFkZHJfbmlwOworCXVpbnQzMl90IGdhdGV3YXlfbmlwOyAvKiByZWxheSBhZ2VudCBJUCBhZGRyZXNzICovCisJdWludDhfdCBjaGFkZHJbMTZdOyAgIC8qIGxpbmstbGF5ZXIgY2xpZW50IGhhcmR3YXJlIGFkZHJlc3MgKE1BQykgKi8KKwl1aW50OF90IHNuYW1lWzY0XTsgICAgLyogc2VydmVyIGhvc3QgbmFtZSAoQVNDSVopICovCisJdWludDhfdCBmaWxlWzEyOF07ICAgIC8qIGJvb3QgZmlsZSBuYW1lIChBU0NJWikgKi8KKwl1aW50MzJfdCBjb29raWU7ICAgICAgLyogZml4ZWQgZmlyc3QgZm91ciBvcHRpb24gYnl0ZXMgKDk5LDEzMCw4Myw5OSBkZWMpICovCisJdWludDhfdCBvcHRpb25zW0RIQ1BfT1BUSU9OU19CVUZTSVpFICsgQ09ORklHX1VESENQQ19TTEFDS19GT1JfQlVHR1lfU0VSVkVSU107Cit9IFBBQ0tFRDsKKyNkZWZpbmUgREhDUF9QS1RfU05BTUVfTEVOICAgICAgNjQKKyNkZWZpbmUgREhDUF9QS1RfRklMRV9MRU4gICAgICAxMjgKKyNkZWZpbmUgREhDUF9QS1RfU05BTUVfTEVOX1NUUiAiNjQiCisjZGVmaW5lIERIQ1BfUEtUX0ZJTEVfTEVOX1NUUiAiMTI4IgorCitzdHJ1Y3QgaXBfdWRwX2RoY3BfcGFja2V0IHsKKwlzdHJ1Y3QgaXBoZHIgaXA7CisJc3RydWN0IHVkcGhkciB1ZHA7CisJc3RydWN0IGRoY3BfcGFja2V0IGRhdGE7Cit9IFBBQ0tFRDsKKworc3RydWN0IHVkcF9kaGNwX3BhY2tldCB7CisJc3RydWN0IHVkcGhkciB1ZHA7CisJc3RydWN0IGRoY3BfcGFja2V0IGRhdGE7Cit9IFBBQ0tFRDsKKworZW51bSB7CisJSVBfVURQX0RIQ1BfU0laRSA9IHNpemVvZihzdHJ1Y3QgaXBfdWRwX2RoY3BfcGFja2V0KSAtIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMsCisJVURQX0RIQ1BfU0laRSAgICA9IHNpemVvZihzdHJ1Y3QgdWRwX2RoY3BfcGFja2V0KSAtIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMsCisJREhDUF9TSVpFICAgICAgICA9IHNpemVvZihzdHJ1Y3QgZGhjcF9wYWNrZXQpIC0gQ09ORklHX1VESENQQ19TTEFDS19GT1JfQlVHR1lfU0VSVkVSUywKK307CisKKy8qIExldCdzIHNlZSB3aGV0aGVyIGNvbXBpbGVyIHVuZGVyc3Rvb2QgdXMgcmlnaHQgKi8KK3N0cnVjdCBCVUdfYmFkX3NpemVvZl9zdHJ1Y3RfaXBfdWRwX2RoY3BfcGFja2V0IHsKKwljaGFyIGNbSVBfVURQX0RIQ1BfU0laRSA9PSA1NzYgPyAxIDogLTFdOworfTsKKworCisvKioqIE9wdGlvbnMgKioqLworCitlbnVtIHsKKwlPUFRJT05fSVAgPSAxLAorCU9QVElPTl9JUF9QQUlSLAorCU9QVElPTl9TVFJJTkcsCisvLwlPUFRJT05fQk9PTEVBTiwKKwlPUFRJT05fVTgsCisJT1BUSU9OX1UxNiwKKy8vCU9QVElPTl9TMTYsCisJT1BUSU9OX1UzMiwKKwlPUFRJT05fUzMyLAorCU9QVElPTl9CSU4sCisJT1BUSU9OX1NUQVRJQ19ST1VURVMsCisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NworCU9QVElPTl9ETlNfU1RSSU5HLCAgLyogUkZDMTAzNSBjb21wcmVzc2VkIGRvbWFpbiBuYW1lIGxpc3QgKi8KKwlPUFRJT05fU0lQX1NFUlZFUlMsCisjZW5kaWYKKworCU9QVElPTl9UWVBFX01BU0sgPSAweDBmLAorCS8qIENsaWVudCByZXF1ZXN0cyB0aGlzIG9wdGlvbiBieSBkZWZhdWx0ICovCisJT1BUSU9OX1JFUSAgPSAweDEwLAorCS8qIFRoZXJlIGNhbiBiZSBhIGxpc3Qgb2YgMSBvciBtb3JlIG9mIHRoZXNlICovCisJT1BUSU9OX0xJU1QgPSAweDIwLAorfTsKKworLyogREhDUCBvcHRpb24gY29kZXMgKHBhcnRpYWwgbGlzdCkuIFNlZSBSRkMgMjEzMiBhbmQKKyAqIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvYm9vdHAtZGhjcC1wYXJhbWV0ZXJzLworICogQ29tbWVudGVkIG91dCBvcHRpb25zIGFyZSBoYW5kbGVkIGJ5IGNvbW1vbiBvcHRpb24gbWFjaGluZXJ5LAorICogdW5jb21tZW50ZWQgb25lcyBoYXZlIHNwYWNpYWwgY2FzZXMgKGdyZXAgZm9yIHRoZW0gdG8gc2VlKS4KKyAqLworI2RlZmluZSBESENQX1BBRERJTkcgICAgICAgICAgICAweDAwCisjZGVmaW5lIERIQ1BfU1VCTkVUICAgICAgICAgICAgIDB4MDEKKy8vI2RlZmluZSBESENQX1RJTUVfT0ZGU0VUICAgICAgMHgwMiAvKiAobG9jYWx0aW1lIC0gVVRDX3RpbWUpIGluIHNlY29uZHMuIHNpZ25lZCAqLworLy8jZGVmaW5lIERIQ1BfUk9VVEVSICAgICAgICAgICAweDAzCisvLyNkZWZpbmUgREhDUF9USU1FX1NFUlZFUiAgICAgIDB4MDQgLyogUkZDIDg2OCB0aW1lIHNlcnZlciAoMzItYml0LCAwID0gMS4xLjE5MDApICovCisvLyNkZWZpbmUgREhDUF9OQU1FX1NFUlZFUiAgICAgIDB4MDUgLyogSUVOIDExNiBfcmVhbGx5XyBhbmNpZW50IGtpbmQgb2YgTlMgKi8KKy8vI2RlZmluZSBESENQX0ROU19TRVJWRVIgICAgICAgMHgwNgorLy8jZGVmaW5lIERIQ1BfTE9HX1NFUlZFUiAgICAgICAweDA3IC8qIHBvcnQgNzA0IFVEUCBsb2cgKG5vdCBzeXNsb2cpCisvLyNkZWZpbmUgREhDUF9DT09LSUVfU0VSVkVSICAgIDB4MDggLyogInF1b3RlIG9mIHRoZSBkYXkiIHNlcnZlciAqLworLy8jZGVmaW5lIERIQ1BfTFBSX1NFUlZFUiAgICAgICAweDA5CisjZGVmaW5lIERIQ1BfSE9TVF9OQU1FICAgICAgICAgIDB4MGMgLyogZWl0aGVyIGNsaWVudCBpbmZvcm1zIHNlcnZlciBvciBzZXJ2ZXIgZ2l2ZXMgbmFtZSB0byBjbGllbnQgKi8KKy8vI2RlZmluZSBESENQX0JPT1RfU0laRSAgICAgICAgMHgwZAorLy8jZGVmaW5lIERIQ1BfRE9NQUlOX05BTUUgICAgICAweDBmIC8qIHNlcnZlciBnaXZlcyBkb21haW4gc3VmZml4ICovCisvLyNkZWZpbmUgREhDUF9TV0FQX1NFUlZFUiAgICAgIDB4MTAKKy8vI2RlZmluZSBESENQX1JPT1RfUEFUSCAgICAgICAgMHgxMQorLy8jZGVmaW5lIERIQ1BfSVBfVFRMICAgICAgICAgICAweDE3CisvLyNkZWZpbmUgREhDUF9NVFUgICAgICAgICAgICAgIDB4MWEKKy8vI2RlZmluZSBESENQX0JST0FEQ0FTVCAgICAgICAgMHgxYworLy8jZGVmaW5lIERIQ1BfUk9VVEVTICAgICAgICAgICAweDIxCisvLyNkZWZpbmUgREhDUF9OSVNfRE9NQUlOICAgICAgIDB4MjgKKy8vI2RlZmluZSBESENQX05JU19TRVJWRVIgICAgICAgMHgyOQorLy8jZGVmaW5lIERIQ1BfTlRQX1NFUlZFUiAgICAgICAweDJhCisvLyNkZWZpbmUgREhDUF9XSU5TX1NFUlZFUiAgICAgIDB4MmMKKyNkZWZpbmUgREhDUF9SRVFVRVNURURfSVAgICAgICAgMHgzMiAvKiBzZW50IGJ5IGNsaWVudCBpZiBzcGVjaWZpYyBJUCBpcyB3YW50ZWQgKi8KKyNkZWZpbmUgREhDUF9MRUFTRV9USU1FICAgICAgICAgMHgzMworI2RlZmluZSBESENQX09QVElPTl9PVkVSTE9BRCAgICAweDM0CisjZGVmaW5lIERIQ1BfTUVTU0FHRV9UWVBFICAgICAgIDB4MzUKKyNkZWZpbmUgREhDUF9TRVJWRVJfSUQgICAgICAgICAgMHgzNiAvKiBieSBkZWZhdWx0IHNlcnZlcidzIElQICovCisjZGVmaW5lIERIQ1BfUEFSQU1fUkVRICAgICAgICAgIDB4MzcgLyogbGlzdCBvZiBvcHRpb25zIGNsaWVudCB3YW50cyAqLworLy8jZGVmaW5lIERIQ1BfRVJSX01FU1NBR0UgICAgICAweDM4IC8qIGVycm9yIG1lc3NhZ2Ugd2hlbiBzZW5kaW5nIE5BSyBldGMgKi8KKyNkZWZpbmUgREhDUF9NQVhfU0laRSAgICAgICAgICAgMHgzOQorI2RlZmluZSBESENQX1ZFTkRPUiAgICAgICAgICAgICAweDNjIC8qIGNsaWVudCdzIHZlbmRvciAoYSBzdHJpbmcpICovCisjZGVmaW5lIERIQ1BfQ0xJRU5UX0lEICAgICAgICAgIDB4M2QgLyogYnkgZGVmYXVsdCBjbGllbnQncyBNQUMgYWRkciwgYnV0IG1heSBiZSBhcmJpdHJhcmlseSBsb25nICovCisvLyNkZWZpbmUgREhDUF9URlRQX1NFUlZFUl9OQU1FIDB4NDIgLyogc2FtZSBhcyAnc25hbWUnIGZpZWxkICovCisvLyNkZWZpbmUgREhDUF9CT09UX0ZJTEUgICAgICAgIDB4NDMgLyogc2FtZSBhcyAnZmlsZScgZmllbGQgKi8KKy8vI2RlZmluZSBESENQX1VTRVJfQ0xBU1MgICAgICAgMHg0ZCAvKiBSRkMgMzAwNC4gc2V0IG9mIExBU0NJSSBzdHJpbmdzLiAiSSBhbSBhIHByaW50ZXIiIGV0YyAqLworI2RlZmluZSBESENQX0ZRRE4gICAgICAgICAgICAgICAweDUxIC8qIGNsaWVudCBhc2tzIHRvIHVwZGF0ZSBETlMgdG8gbWFwIGl0cyBGUUROIHRvIGl0cyBuZXcgSVAgKi8KKy8vI2RlZmluZSBESENQX0RPTUFJTl9TRUFSQ0ggICAgMHg3NyAvKiBSRkMgMzM5Ny4gc2V0IG9mIEFTQ0laIHN0cmluZywgRE5TLXN0eWxlIGNvbXByZXNzZWQgKi8KKy8vI2RlZmluZSBESENQX1NJUF9TRVJWRVJTICAgICAgMHg3OCAvKiBSRkMgMzM2MS4gZmxhZyBieXRlLCB0aGVuOiAwOiBkb21haW4gbmFtZXMsIDE6IElQIGFkZHJzICovCisvLyNkZWZpbmUgREhDUF9TVEFUSUNfUk9VVEVTICAgIDB4NzkgLyogUkZDIDM0NDIuIChtYXNrLGlwLHJvdXRlcikgdHVwbGVzICovCisjZGVmaW5lIERIQ1BfVkxBTl9JRCAgICAgICAgICAgIDB4ODQgLyogODAyLjFQIFZMQU4gSUQgKi8KKyNkZWZpbmUgREhDUF9WTEFOX1BSSU9SSVRZICAgICAgMHg4NSAvKiA4MDIuMVEgVkxBTiBwcmlvcml0eSAqLworLy8jZGVmaW5lIERIQ1BfTVNfU1RBVElDX1JPVVRFUyAweGY5IC8qIE1pY3Jvc29mdCdzIHByZS1SRkMgMzQ0MiBjb2RlIGZvciAweDc5PyAqLworLy8jZGVmaW5lIERIQ1BfV1BBRCAgICAgICAgICAgICAweGZjIC8qIE1TSUUncyBXZWIgUHJveHkgQXV0b2Rpc2NvdmVyeSBQcm90b2NvbCAqLworI2RlZmluZSBESENQX0VORCAgICAgICAgICAgICAgICAweGZmCisKKy8qIE9mZnNldHMgaW4gb3B0aW9uIGJ5dGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgT1BUX0NPREUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBPUFRfTEVOICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE9QVF9EQVRBICAgICAgICAgICAgICAgIDIKKy8qIEJpdHMgaW4gIm92ZXJsb2FkIiBvcHRpb24gKi8KKyNkZWZpbmUgT1BUSU9OX0ZJRUxEICAgICAgICAgICAgMAorI2RlZmluZSBGSUxFX0ZJRUxEICAgICAgICAgICAgICAxCisjZGVmaW5lIFNOQU1FX0ZJRUxEICAgICAgICAgICAgIDIKKworLyogREhDUF9NRVNTQUdFX1RZUEUgdmFsdWVzICovCisjZGVmaW5lIERIQ1BESVNDT1ZFUiAgICAgICAgICAgIDEgLyogY2xpZW50IC0+IHNlcnZlciAqLworI2RlZmluZSBESENQT0ZGRVIgICAgICAgICAgICAgICAyIC8qIGNsaWVudCA8LSBzZXJ2ZXIgKi8KKyNkZWZpbmUgREhDUFJFUVVFU1QgICAgICAgICAgICAgMyAvKiBjbGllbnQgLT4gc2VydmVyICovCisjZGVmaW5lIERIQ1BERUNMSU5FICAgICAgICAgICAgIDQgLyogY2xpZW50IC0+IHNlcnZlciAqLworI2RlZmluZSBESENQQUNLICAgICAgICAgICAgICAgICA1IC8qIGNsaWVudCA8LSBzZXJ2ZXIgKi8KKyNkZWZpbmUgREhDUE5BSyAgICAgICAgICAgICAgICAgNiAvKiBjbGllbnQgPC0gc2VydmVyICovCisjZGVmaW5lIERIQ1BSRUxFQVNFICAgICAgICAgICAgIDcgLyogY2xpZW50IC0+IHNlcnZlciAqLworI2RlZmluZSBESENQSU5GT1JNICAgICAgICAgICAgICA4IC8qIGNsaWVudCAtPiBzZXJ2ZXIgKi8KKyNkZWZpbmUgREhDUF9NSU5UWVBFIERIQ1BESVNDT1ZFUgorI2RlZmluZSBESENQX01BWFRZUEUgREhDUElORk9STQorCitzdHJ1Y3QgZGhjcF9vcHRmbGFnIHsKKwl1aW50OF90IGZsYWdzOworCXVpbnQ4X3QgY29kZTsKK307CisKK3N0cnVjdCBvcHRpb25fc2V0IHsKKwl1aW50OF90ICpkYXRhOworCXN0cnVjdCBvcHRpb25fc2V0ICpuZXh0OworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkaGNwX29wdGZsYWcgZGhjcF9vcHRmbGFnc1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgZGhjcF9vcHRpb25fc3RyaW5nc1tdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZGhjcF9vcHRpb25fbGVuZ3Roc1tdOworCit1bnNpZ25lZCBGQVNUX0ZVTkMgdWRoY3Bfb3B0aW9uX2lkeChjb25zdCBjaGFyICpuYW1lKTsKKwordWludDhfdCAqdWRoY3BfZ2V0X29wdGlvbihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgaW50IGNvZGUpIEZBU1RfRlVOQzsKK2ludCB1ZGhjcF9lbmRfb3B0aW9uKHVpbnQ4X3QgKm9wdGlvbnB0cikgRkFTVF9GVU5DOwordm9pZCB1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgdWludDhfdCAqYWRkb3B0KSBGQVNUX0ZVTkM7Cit2b2lkIHVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCB1aW50OF90IGNvZGUsIHVpbnQzMl90IGRhdGEpIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CitjaGFyICpkbmFtZV9kZWMoY29uc3QgdWludDhfdCAqY3N0ciwgaW50IGNsZW4sIGNvbnN0IGNoYXIgKnByZSkgRkFTVF9GVU5DOwordWludDhfdCAqZG5hbWVfZW5jKGNvbnN0IHVpbnQ4X3QgKmNzdHIsIGludCBjbGVuLCBjb25zdCBjaGFyICpzcmMsIGludCAqcmV0bGVuKSBGQVNUX0ZVTkM7CisjZW5kaWYKK3N0cnVjdCBvcHRpb25fc2V0ICp1ZGhjcF9maW5kX29wdGlvbihzdHJ1Y3Qgb3B0aW9uX3NldCAqb3B0X2xpc3QsIHVpbnQ4X3QgY29kZSkgRkFTVF9GVU5DOworCisKKy8vIFJGQyAyMTMxICBUYWJsZSA1OiBGaWVsZHMgYW5kIG9wdGlvbnMgdXNlZCBieSBESENQIGNsaWVudHMKKy8vCisvLyBGaWVsZHMgJ2hvcHMnLCAneWlhZGRyJywgJ3NpYWRkcicsICdnaWFkZHInIGFyZSBhbHdheXMgemVybworLy8KKy8vIEZpZWxkICAgICAgREhDUERJU0NPVkVSICAgICAgICAgIERIQ1BJTkZPUk0gICAgICAgICAgICBESENQUkVRVUVTVCAgICAgICAgICAgREhDUERFQ0xJTkUgICAgICAgICBESENQUkVMRUFTRQorLy8gLS0tLS0gICAgICAtLS0tLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tICAgICAgICAgICAtLS0tLS0tLS0tLSAgICAgICAgIC0tLS0tLS0tLS0tCisvLyAneGlkJyAgICAgIHNlbGVjdGVkIGJ5IGNsaWVudCAgICBzZWxlY3RlZCBieSBjbGllbnQgICAgJ3hpZCcgZnJvbSBzZXJ2ZXIgICAgIHNlbGVjdGVkIGJ5IGNsaWVudCAgc2VsZWN0ZWQgYnkgY2xpZW50CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREhDUE9GRkVSIG1lc3NhZ2UKKy8vICdzZWNzJyAgICAgMCBvciBzZWNvbmRzIHNpbmNlICAgIDAgb3Igc2Vjb25kcyBzaW5jZSAgICAwIG9yIHNlY29uZHMgc2luY2UgICAgMCAgICAgICAgICAgICAgICAgICAwCisvLyAgICAgICAgICAgIERIQ1AgcHJvY2VzcyBzdGFydGVkICBESENQIHByb2Nlc3Mgc3RhcnRlZCAgREhDUCBwcm9jZXNzIHN0YXJ0ZWQKKy8vICdmbGFncycgICAgU2V0ICdCUk9BRENBU1QnICAgICAgIFNldCAnQlJPQURDQVNUJyAgICAgICBTZXQgJ0JST0FEQ0FTVCcgICAgICAgMCAgICAgICAgICAgICAgICAgICAwCisvLyAgICAgICAgICAgIGZsYWcgaWYgY2xpZW50ICAgICAgICBmbGFnIGlmIGNsaWVudCAgICAgICAgZmxhZyBpZiBjbGllbnQKKy8vICAgICAgICAgICAgcmVxdWlyZXMgYnJvYWRjYXN0ICAgIHJlcXVpcmVzIGJyb2FkY2FzdCAgICByZXF1aXJlcyBicm9hZGNhc3QKKy8vICAgICAgICAgICAgcmVwbHkgICAgICAgICAgICAgICAgIHJlcGx5ICAgICAgICAgICAgICAgICByZXBseQorLy8gJ2NpYWRkcicgICAwICAgICAgICAgICAgICAgICAgICAgY2xpZW50J3MgSVAgICAgICAgICAgIDAgb3IgY2xpZW50J3MgSVAgICAgICAwICAgICAgICAgICAgICAgICAgIGNsaWVudCdzIElQCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJPVU5EL1JFTkVXL1JFQklORCkKKy8vICdjaGFkZHInICAgY2xpZW50J3MgTUFDICAgICAgICAgIGNsaWVudCdzIE1BQyAgICAgICAgICBjbGllbnQncyBNQUMgICAgICAgICAgY2xpZW50J3MgTUFDICAgICAgICBjbGllbnQncyBNQUMKKy8vICdzbmFtZScgICAgb3B0aW9ucyBvciBzbmFtZSAgICAgIG9wdGlvbnMgb3Igc25hbWUgICAgICBvcHRpb25zIG9yIHNuYW1lICAgICAgKHVudXNlZCkgICAgICAgICAgICAodW51c2VkKQorLy8gJ2ZpbGUnICAgICBvcHRpb25zIG9yIGZpbGUgICAgICAgb3B0aW9ucyBvciBmaWxlICAgICAgIG9wdGlvbnMgb3IgZmlsZSAgICAgICAodW51c2VkKSAgICAgICAgICAgICh1bnVzZWQpCisvLyAnb3B0aW9ucycgIG9wdGlvbnMgICAgICAgICAgICAgICBvcHRpb25zICAgICAgICAgICAgICAgb3B0aW9ucyAgICAgICAgICAgICAgIG1lc3NhZ2UgdHlwZSBvcHQgICAgbWVzc2FnZSB0eXBlIG9wdAorLy8KKy8vIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgIERIQ1BESVNDT1ZFUiAgREhDUElORk9STSAgREhDUFJFUVVFU1QgICAgICBESENQREVDTElORSAgREhDUFJFTEVBU0UKKy8vIC0tLS0tLSAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0KKy8vIFJlcXVlc3RlZCBJUCBhZGRyZXNzICAgICAgIE1BWSAgICAgICAgICAgTVVTVCBOT1QgICAgTVVTVCAoaW4gICAgICAgICBNVVNUICAgICAgICAgTVVTVCBOT1QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUSU5HIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVQtUkVCT09UKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVNUIE5PVCAoaW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9VTkQgb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVORVdJTkcpCisvLyBJUCBhZGRyZXNzIGxlYXNlIHRpbWUgICAgICBNQVkgICAgICAgICAgIE1VU1QgTk9UICAgIE1BWSAgICAgICAgICAgICAgTVVTVCBOT1QgICAgIE1VU1QgTk9UCisvLyBVc2UgJ2ZpbGUnLydzbmFtZScgZmllbGRzICBNQVkgICAgICAgICAgIE1BWSAgICAgICAgIE1BWSAgICAgICAgICAgICAgTUFZICAgICAgICAgIE1BWQorLy8gQ2xpZW50IGlkZW50aWZpZXIgICAgICAgICAgTUFZICAgICAgICAgICBNQVkgICAgICAgICBNQVkgICAgICAgICAgICAgIE1BWSAgICAgICAgICBNQVkKKy8vIFZlbmRvciBjbGFzcyBpZGVudGlmaWVyICAgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKy8vIFNlcnZlciBpZGVudGlmaWVyICAgICAgICAgIE1VU1QgTk9UICAgICAgTVVTVCBOT1QgICAgTVVTVCAoYWZ0ZXIgICAgICBNVVNUICAgICAgICAgTVVTVAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RJTkcpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VU1QgTk9UIChhZnRlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklULVJFQk9PVCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9VTkQsIFJFTkVXSU5HCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFJFQklORElORykKKy8vIFBhcmFtZXRlciByZXF1ZXN0IGxpc3QgICAgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKy8vIE1heGltdW0gbWVzc2FnZSBzaXplICAgICAgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKy8vIE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgIFNIT1VMRCBOT1QgICAgU0hPVUxEIE5PVCAgU0hPVUxEIE5PVCAgICAgICBTSE9VTEQgICAgICAgU0hPVUxECisvLyBTaXRlLXNwZWNpZmljICAgICAgICAgICAgICBNQVkgICAgICAgICAgIE1BWSAgICAgICAgIE1BWSAgICAgICAgICAgICAgTVVTVCBOT1QgICAgIE1VU1QgTk9UCisvLyBBbGwgb3RoZXJzICAgICAgICAgICAgICAgICBNQVkgICAgICAgICAgIE1BWSAgICAgICAgIE1BWSAgICAgICAgICAgICAgTVVTVCBOT1QgICAgIE1VU1QgTk9UCisKKworLyoqKiBMb2dnaW5nICoqKi8KKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCitleHRlcm4gdW5zaWduZWQgZGhjcF92ZXJib3NlOworIyBkZWZpbmUgbG9nMSguLi4pIGRvIHsgaWYgKGRoY3BfdmVyYm9zZSA+PSAxKSBiYl9pbmZvX21zZyhfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjIGlmIENPTkZJR19VREhDUF9ERUJVRyA+PSAyCit2b2lkIHVkaGNwX2R1bXBfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KSBGQVNUX0ZVTkM7CisjICBkZWZpbmUgbG9nMiguLi4pIGRvIHsgaWYgKGRoY3BfdmVyYm9zZSA+PSAyKSBiYl9pbmZvX21zZyhfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjIGVsc2UKKyMgIGRlZmluZSB1ZGhjcF9kdW1wX3BhY2tldCguLi4pICgodm9pZCkwKQorIyAgZGVmaW5lIGxvZzIoLi4uKSAoKHZvaWQpMCkKKyMgZW5kaWYKKyMgaWYgQ09ORklHX1VESENQX0RFQlVHID49IDMKKyMgIGRlZmluZSBsb2czKC4uLikgZG8geyBpZiAoZGhjcF92ZXJib3NlID49IDMpIGJiX2luZm9fbXNnKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyAgZGVmaW5lIGxvZzMoLi4uKSAoKHZvaWQpMCkKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSB1ZGhjcF9kdW1wX3BhY2tldCguLi4pICgodm9pZCkwKQorIyBkZWZpbmUgbG9nMSguLi4pICgodm9pZCkwKQorIyBkZWZpbmUgbG9nMiguLi4pICgodm9pZCkwKQorIyBkZWZpbmUgbG9nMyguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKworLyoqKiBPdGhlciBzaGFyZWQgZnVuY3Rpb25zICoqKi8KKworLyogMm5kIHBhcmFtIGlzICJ1aW50MzJfdCoiICovCitpbnQgRkFTVF9GVU5DIHVkaGNwX3N0cjJuaXAoY29uc3QgY2hhciAqc3RyLCB2b2lkICphcmcpOworLyogMm5kIHBhcmFtIGlzICJzdHJ1Y3Qgb3B0aW9uX3NldCoqIiAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9zdHIyb3B0c2V0KGNvbnN0IGNoYXIgKnN0ciwgdm9pZCAqYXJnKTsKKwordWludDE2X3QgdWRoY3BfY2hlY2tzdW0odm9pZCAqYWRkciwgaW50IGNvdW50KSBGQVNUX0ZVTkM7CisKK3ZvaWQgdWRoY3BfaW5pdF9oZWFkZXIoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIGNoYXIgdHlwZSkgRkFTVF9GVU5DOworCitpbnQgdWRoY3BfcmVjdl9rZXJuZWxfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBpbnQgZmQpIEZBU1RfRlVOQzsKKworaW50IHVkaGNwX3NlbmRfcmF3X3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LAorCQl1aW50MzJfdCBzb3VyY2VfbmlwLCBpbnQgc291cmNlX3BvcnQsCisJCXVpbnQzMl90IGRlc3RfbmlwLCBpbnQgZGVzdF9wb3J0LCBjb25zdCB1aW50OF90ICpkZXN0X2FycCwKKwkJaW50IGlmaW5kZXgpIEZBU1RfRlVOQzsKKworaW50IHVkaGNwX3NlbmRfa2VybmVsX3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LAorCQl1aW50MzJfdCBzb3VyY2VfbmlwLCBpbnQgc291cmNlX3BvcnQsCisJCXVpbnQzMl90IGRlc3RfbmlwLCBpbnQgZGVzdF9wb3J0KSBGQVNUX0ZVTkM7CisKK3ZvaWQgdWRoY3Bfc3Bfc2V0dXAodm9pZCkgRkFTVF9GVU5DOworaW50IHVkaGNwX3NwX2ZkX3NldChmZF9zZXQgKnJmZHMsIGludCBleHRyYV9mZCkgRkFTVF9GVU5DOworaW50IHVkaGNwX3NwX3JlYWQoY29uc3QgZmRfc2V0ICpyZmRzKSBGQVNUX0ZVTkM7CisKK2ludCB1ZGhjcF9yZWFkX2ludGVyZmFjZShjb25zdCBjaGFyICppbnRlcmZhY2UsIGludCAqaWZpbmRleCwgdWludDMyX3QgKm5pcCwgdWludDhfdCAqbWFjKSBGQVNUX0ZVTkM7CisKK2ludCB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qdWludDMyX3QgaXAsKi8gaW50IHBvcnQsIGNvbnN0IGNoYXIgKmluZikgRkFTVF9GVU5DOworCisvKiBSZXR1cm5zIDEgaWYgbm8gcmVwbHkgcmVjZWl2ZWQgKi8KK2ludCBhcnBwaW5nKHVpbnQzMl90IHRlc3RfbmlwLAorCQljb25zdCB1aW50OF90ICpzYWZlX21hYywKKwkJdWludDMyX3QgZnJvbV9pcCwKKwkJdWludDhfdCAqZnJvbV9tYWMsCisJCWNvbnN0IGNoYXIgKmludGVyZmFjZSkgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc1NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5jCkBAIC0wLDAgKzEsMTU2MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdWRoY3AgY2xpZW50CisgKgorICogUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4gSnVseSAyMDAxCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKy8qIE92ZXJyaWRlIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUgLSBpZnVwZG93biBuZWVkcyBvdXIgcGlkZmlsZSB0byBhbHdheXMgZXhpc3QgKi8KKyNkZWZpbmUgV0FOVF9QSURGSUxFIDEKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkaGNwZC5oIgorI2luY2x1ZGUgImRoY3BjLmgiCisKKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorCisvKiBzdHJ1Y3QgY2xpZW50X2NvbmZpZ190IGNsaWVudF9jb25maWcgaXMgaW4gYmJfY29tbW9uX2J1ZnNpejEgKi8KKworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworc3RhdGljIGNvbnN0IGNoYXIgdWRoY3BjX2xvbmdvcHRzW10gQUxJR04xID0KKwkiY2xpZW50aWQtbm9uZVwwIiAgTm9fYXJndW1lbnQgICAgICAgIkMiCisJInZlbmRvcmNsYXNzXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJWIgorCSJob3N0bmFtZVwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiSCIKKwkiZnFkblwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkYiCisJImludGVyZmFjZVwwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJpIgorCSJub3dcMCIgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAibiIKKwkicGlkZmlsZVwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInAiCisJInF1aXRcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJxIgorCSJyZWxlYXNlXDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAiUiIKKwkicmVxdWVzdFwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInIiCisJInNjcmlwdFwwIiAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJzIgorCSJ0aW1lb3V0XDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiVCIKKwkidmVyc2lvblwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJInJldHJpZXNcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCSJ0cnlhZ2FpblwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiQSIKKwkic3lzbG9nXDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlMiCisJInJlcXVlc3Qtb3B0aW9uXDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJPIgorCSJuby1kZWZhdWx0LW9wdGlvbnNcMCIgTm9fYXJndW1lbnQgICAibyIKKwkiZm9yZWdyb3VuZFwwIiAgICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJImJhY2tncm91bmRcMCIgICAgIE5vX2FyZ3VtZW50ICAgICAgICJiIgorCSJicm9hZGNhc3RcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiQiIKKwlJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoImFycGluZ1wwIglOb19hcmd1bWVudCAgICAgICAiYSIpCisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKCJjbGllbnQtcG9ydFwwIglSZXF1aXJlZF9hcmd1bWVudCAiUCIpCisJOworI2VuZGlmCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIG9wdGlvbiBzdHJpbmcgb3JkZXIgKi8KK2VudW0geworCU9QVF9DID0gMSA8PCAwLAorCU9QVF9WID0gMSA8PCAxLAorCU9QVF9IID0gMSA8PCAyLAorCU9QVF9oID0gMSA8PCAzLAorCU9QVF9GID0gMSA8PCA0LAorCU9QVF9pID0gMSA8PCA1LAorCU9QVF9uID0gMSA8PCA2LAorCU9QVF9wID0gMSA8PCA3LAorCU9QVF9xID0gMSA8PCA4LAorCU9QVF9SID0gMSA8PCA5LAorCU9QVF9yID0gMSA8PCAxMCwKKwlPUFRfcyA9IDEgPDwgMTEsCisJT1BUX1QgPSAxIDw8IDEyLAorCU9QVF90ID0gMSA8PCAxMywKKwlPUFRfUyA9IDEgPDwgMTQsCisJT1BUX0EgPSAxIDw8IDE1LAorCU9QVF9PID0gMSA8PCAxNiwKKwlPUFRfbyA9IDEgPDwgMTcsCisJT1BUX3ggPSAxIDw8IDE4LAorCU9QVF9mID0gMSA8PCAxOSwKKwlPUFRfQiA9IDEgPDwgMjAsCisvKiBUaGUgcmVzdCBoYXMgdmFyaWFibGUgYml0IHBvc2l0aW9ucywgbmVlZCB0byBiZSBjbGV2ZXIgKi8KKwlPUFRCSVRfQiA9IDIwLAorCVVTRV9GT1JfTU1VKCAgICAgICAgICAgICBPUFRCSVRfYiwpCisJSUZfRkVBVFVSRV9VREhDUENfQVJQSU5HKE9QVEJJVF9hLCkKKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoICAgT1BUQklUX1AsKQorCVVTRV9GT1JfTU1VKCAgICAgICAgICAgICBPUFRfYiA9IDEgPDwgT1BUQklUX2IsKQorCUlGX0ZFQVRVUkVfVURIQ1BDX0FSUElORyhPUFRfYSA9IDEgPDwgT1BUQklUX2EsKQorCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCggICBPUFRfUCA9IDEgPDwgT1BUQklUX1AsKQorfTsKKworCisvKioqIFNjcmlwdCBleGVjdXRpb24gY29kZSAqKiovCisKKy8qIGdldCBhIHJvdWdoIGlkZWEgb2YgaG93IGxvbmcgYW4gb3B0aW9uIHdpbGwgYmUgKHJvdW5kaW5nIHVwLi4uKSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbGVuX29mX29wdGlvbl9hc19zdHJpbmdbXSA9IHsKKwlbT1BUSU9OX0lQICAgICAgICAgICAgICBdID0gc2l6ZW9mKCIyNTUuMjU1LjI1NS4yNTUgIiksCisJW09QVElPTl9JUF9QQUlSICAgICAgICAgXSA9IHNpemVvZigiMjU1LjI1NS4yNTUuMjU1ICIpICogMiwKKwlbT1BUSU9OX1NUQVRJQ19ST1VURVMgICBdID0gc2l6ZW9mKCIyNTUuMjU1LjI1NS4yNTUvMzIgMjU1LjI1NS4yNTUuMjU1ICIpLAorCVtPUFRJT05fU1RSSU5HICAgICAgICAgIF0gPSAxLAorI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwlbT1BUSU9OX0ROU19TVFJJTkcgICAgICBdID0gMSwgLyogdW51c2VkICovCisJLyogSG1tbSwgdGhpcyBzZXZlcmVseSBvdmVyZXN0aW1hdGVzIHNpemUgaWYgU0lQX1NFUlZFUlMgb3B0aW9uCisJICogaXMgaW4gZG9tYWluIG5hbWUgZm9ybTogTi1ieXRlIG9wdGlvbiBpbiBiaW5hcnkgZm9ybQorCSAqIG1hbGxvY3MgfjE2Kk4gYnl0ZXMuIEJ1dCBpdCBpcyBmcmVlZCBhbG1vc3QgYXQgb25jZS4KKwkgKi8KKwlbT1BUSU9OX1NJUF9TRVJWRVJTICAgICBdID0gc2l6ZW9mKCIyNTUuMjU1LjI1NS4yNTUgIiksCisjZW5kaWYKKy8vCVtPUFRJT05fQk9PTEVBTiAgICAgICAgIF0gPSBzaXplb2YoInllcyAiKSwKKwlbT1BUSU9OX1U4ICAgICAgICAgICAgICBdID0gc2l6ZW9mKCIyNTUgIiksCisJW09QVElPTl9VMTYgICAgICAgICAgICAgXSA9IHNpemVvZigiNjU1MzUgIiksCisvLwlbT1BUSU9OX1MxNiAgICAgICAgICAgICBdID0gc2l6ZW9mKCItMzI3NjggIiksCisJW09QVElPTl9VMzIgICAgICAgICAgICAgXSA9IHNpemVvZigiNDI5NDk2NzI5NSAiKSwKKwlbT1BUSU9OX1MzMiAgICAgICAgICAgICBdID0gc2l6ZW9mKCItMjE0NzQ4MzY4NCAiKSwKK307CisKKy8qIG5vdGU6IGlwIGlzIGEgcG9pbnRlciB0byBhbiBJUCBpbiBuZXR3b3JrIG9yZGVyLCBwb3NzaWJseSBtaXNhbGlnZWQgKi8KK3N0YXRpYyBpbnQgc3ByaW50X25pcChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpwcmUsIGNvbnN0IHVpbnQ4X3QgKmlwKQoreworCXJldHVybiBzcHJpbnRmKGRlc3QsICIlcyV1LiV1LiV1LiV1IiwgcHJlLCBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7Cit9CisKKy8qIHJlYWxseSBzaW1wbGUgaW1wbGVtZW50YXRpb24sIGp1c3QgY291bnQgdGhlIGJpdHMgKi8KK3N0YXRpYyBpbnQgbXRvbih1aW50MzJfdCBtYXNrKQoreworCWludCBpID0gMDsKKwltYXNrID0gbnRvaGwobWFzayk7IC8qIDExMTExMDAwMC1saWtlIGJpdCBwYXR0ZXJuICovCisJd2hpbGUgKG1hc2spIHsKKwkJaSsrOworCQltYXNrIDw8PSAxOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogQ3JlYXRlICJvcHRfbmFtZT1vcHRfdmFsdWUiIHN0cmluZyAqLworc3RhdGljIE5PSU5MSU5FIGNoYXIgKnhtYWxsb2Nfb3B0bmFtZV9vcHR2YWwodWludDhfdCAqb3B0aW9uLCBjb25zdCBzdHJ1Y3QgZGhjcF9vcHRmbGFnICpvcHRmbGFnLCBjb25zdCBjaGFyICpvcHRfbmFtZSkKK3sKKwl1bnNpZ25lZCB1cHBlcl9sZW5ndGg7CisJaW50IGxlbiwgdHlwZSwgb3B0bGVuOworCWNoYXIgKmRlc3QsICpyZXQ7CisKKwkvKiBvcHRpb24gcG9pbnRzIHRvIE9QVF9EQVRBLCBuZWVkIHRvIGdvIGJhY2sgYW5kIGdldCBPUFRfTEVOICovCisJbGVuID0gb3B0aW9uW09QVF9MRU4gLSBPUFRfREFUQV07CisKKwl0eXBlID0gb3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLOworCW9wdGxlbiA9IGRoY3Bfb3B0aW9uX2xlbmd0aHNbdHlwZV07CisJdXBwZXJfbGVuZ3RoID0gbGVuX29mX29wdGlvbl9hc19zdHJpbmdbdHlwZV0gKiAoKHVuc2lnbmVkKWxlbiAvICh1bnNpZ25lZClvcHRsZW4pOworCisJZGVzdCA9IHJldCA9IHhtYWxsb2ModXBwZXJfbGVuZ3RoICsgc3RybGVuKG9wdF9uYW1lKSArIDIpOworCWRlc3QgKz0gc3ByaW50ZihyZXQsICIlcz0iLCBvcHRfbmFtZSk7CisKKwl3aGlsZSAobGVuID49IG9wdGxlbikgeworCQl1bnNpZ25lZCBpcF9vZnMgPSAwOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE9QVElPTl9JUF9QQUlSOgorCQkJZGVzdCArPSBzcHJpbnRfbmlwKGRlc3QsICIiLCBvcHRpb24pOworCQkJKmRlc3QrKyA9ICcvJzsKKwkJCWlwX29mcyA9IDQ7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBPUFRJT05fSVA6CisJCQlkZXN0ICs9IHNwcmludF9uaXAoZGVzdCwgIiIsIG9wdGlvbiArIGlwX29mcyk7CisJCQlicmVhazsKKy8vCQljYXNlIE9QVElPTl9CT09MRUFOOgorLy8JCQlkZXN0ICs9IHNwcmludGYoZGVzdCwgKm9wdGlvbiA/ICJ5ZXMiIDogIm5vIik7CisvLwkJCWJyZWFrOworCQljYXNlIE9QVElPTl9VODoKKwkJCWRlc3QgKz0gc3ByaW50ZihkZXN0LCAiJXUiLCAqb3B0aW9uKTsKKwkJCWJyZWFrOworLy8JCWNhc2UgT1BUSU9OX1MxNjoKKwkJY2FzZSBPUFRJT05fVTE2OiB7CisJCQl1aW50MTZfdCB2YWxfdTE2OworCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDE2KHZhbF91MTYsIG9wdGlvbik7CisJCQlkZXN0ICs9IHNwcmludGYoZGVzdCwgIiV1IiwgbnRvaHModmFsX3UxNikpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBPUFRJT05fUzMyOgorCQljYXNlIE9QVElPTl9VMzI6IHsKKwkJCXVpbnQzMl90IHZhbF91MzI7CisJCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIodmFsX3UzMiwgb3B0aW9uKTsKKwkJCWRlc3QgKz0gc3ByaW50ZihkZXN0LCB0eXBlID09IE9QVElPTl9VMzIgPyAiJWx1IiA6ICIlbGQiLCAodW5zaWduZWQgbG9uZykgbnRvaGwodmFsX3UzMikpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBPUFRJT05fU1RSSU5HOgorCQkJbWVtY3B5KGRlc3QsIG9wdGlvbiwgbGVuKTsKKwkJCWRlc3RbbGVuXSA9ICdcMCc7CisJCQlyZXR1cm4gcmV0OwkgLyogU2hvcnQgY2lyY3VpdCB0aGlzIGNhc2UgKi8KKwkJY2FzZSBPUFRJT05fU1RBVElDX1JPVVRFUzogeworCQkJLyogT3B0aW9uIGJpbmFyeSBmb3JtYXQ6CisJCQkgKiBtYXNrIFtvbmUgYnl0ZSwgMC4uMzJdCisJCQkgKiBpcCBbYmlnIGVuZGlhbiwgMC4uNCBieXRlcyBkZXBlbmRpbmcgb24gbWFza10KKwkJCSAqIHJvdXRlciBbYmlnIGVuZGlhbiwgNCBieXRlc10KKwkJCSAqIG1heSBiZSByZXBlYXRlZAorCQkJICoKKwkJCSAqIFdlIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcgIklQL01BU0sgUk9VVEVSIElQMi9NQVNLMiBST1VURVIyIgorCQkJICovCisJCQljb25zdCBjaGFyICpwZnggPSAiIjsKKworCQkJd2hpbGUgKGxlbiA+PSAxICsgNCkgeyAvKiBtYXNrICsgMC1ieXRlIGlwICsgcm91dGVyICovCisJCQkJdWludDMyX3QgbmlwOworCQkJCXVpbnQ4X3QgKnA7CisJCQkJdW5zaWduZWQgbWFzazsKKwkJCQlpbnQgYnl0ZXM7CisKKwkJCQltYXNrID0gKm9wdGlvbisrOworCQkJCWlmIChtYXNrID4gMzIpCisJCQkJCWJyZWFrOworCQkJCWxlbi0tOworCisJCQkJbmlwID0gMDsKKwkJCQlwID0gKHZvaWQqKSAmbmlwOworCQkJCWJ5dGVzID0gKG1hc2sgKyA3KSAvIDg7IC8qIDAgLT4gMCwgMS4uOCAtPiAxLCA5Li4xNiAtPiAyIGV0YyAqLworCQkJCXdoaWxlICgtLWJ5dGVzID49IDApIHsKKwkJCQkJKnArKyA9ICpvcHRpb24rKzsKKwkJCQkJbGVuLS07CisJCQkJfQorCQkJCWlmIChsZW4gPCA0KQorCQkJCQlicmVhazsKKworCQkJCS8qIHByaW50IGlwL21hc2sgKi8KKwkJCQlkZXN0ICs9IHNwcmludF9uaXAoZGVzdCwgcGZ4LCAodm9pZCopICZuaXApOworCQkJCXBmeCA9ICIgIjsKKwkJCQlkZXN0ICs9IHNwcmludGYoZGVzdCwgIi8ldSAiLCBtYXNrKTsKKwkJCQkvKiBwcmludCByb3V0ZXIgKi8KKwkJCQlkZXN0ICs9IHNwcmludF9uaXAoZGVzdCwgIiIsIG9wdGlvbik7CisJCQkJb3B0aW9uICs9IDQ7CisJCQkJbGVuIC09IDQ7CisJCQl9CisKKwkJCXJldHVybiByZXQ7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJCWNhc2UgT1BUSU9OX0ROU19TVFJJTkc6CisJCQkvKiB1bnBhY2sgb3B0aW9uIGludG8gZGVzdDsgdXNlIHJldCBmb3IgcHJlZml4IChpLmUuLCAib3B0bmFtZT0iKSAqLworCQkJZGVzdCA9IGRuYW1lX2RlYyhvcHRpb24sIGxlbiwgcmV0KTsKKwkJCWlmIChkZXN0KSB7CisJCQkJZnJlZShyZXQpOworCQkJCXJldHVybiBkZXN0OworCQkJfQorCQkJLyogZXJyb3IuIHJldHVybiAib3B0bmFtZT0iIHN0cmluZyAqLworCQkJcmV0dXJuIHJldDsKKwkJY2FzZSBPUFRJT05fU0lQX1NFUlZFUlM6CisJCQkvKiBPcHRpb24gYmluYXJ5IGZvcm1hdDoKKwkJCSAqIHR5cGU6IGJ5dGUKKwkJCSAqIHR5cGU9MDogZG9tYWluIG5hbWVzLCBkbnMtY29tcHJlc3NlZAorCQkJICogdHlwZT0xOiBJUCBhZGRycworCQkJICovCisJCQlvcHRpb24rKzsKKwkJCWxlbi0tOworCQkJaWYgKG9wdGlvblstMV0gPT0gMCkgeworCQkJCWRlc3QgPSBkbmFtZV9kZWMob3B0aW9uLCBsZW4sIHJldCk7CisJCQkJaWYgKGRlc3QpIHsKKwkJCQkJZnJlZShyZXQpOworCQkJCQlyZXR1cm4gZGVzdDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCWlmIChvcHRpb25bLTFdID09IDEpIHsKKwkJCQljb25zdCBjaGFyICpwZnggPSAiIjsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQlsZW4gLT0gNDsKKwkJCQkJaWYgKGxlbiA8IDApCisJCQkJCQlicmVhazsKKwkJCQkJZGVzdCArPSBzcHJpbnRfbmlwKGRlc3QsIHBmeCwgb3B0aW9uKTsKKwkJCQkJcGZ4ID0gIiAiOworCQkJCQlvcHRpb24gKz0gNDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmV0OworI2VuZGlmCisJCX0gLyogc3dpdGNoICovCisJCW9wdGlvbiArPSBvcHRsZW47CisJCWxlbiAtPSBvcHRsZW47CisvLyBUT0RPOiBpdCBjYW4gYmUgYSBsaXN0IG9ubHkgaWYgKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX0xJU1QpLgorLy8gU2hvdWxkIHdlIGJhaWwgb3V0L3dhcm4gaWYgd2Ugc2VlIG11bHRpLWlwIG9wdGlvbiB3aGljaCBpcworLy8gbm90IGFsbG93ZWQgdG8gYmUgc3VjaCAoZm9yIGV4YW1wbGUsIERIQ1BfQlJPQURDQVNUKT8gLQorCQlpZiAobGVuIDw9IDAgLyogfHwgIShvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9MSVNUKSAqLykKKwkJCWJyZWFrOworCQkqZGVzdCsrID0gJyAnOworCQkqZGVzdCA9ICdcMCc7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIHB1dCBhbGwgdGhlIHBhcmFtZXRlcnMgaW50byB0aGUgZW52aXJvbm1lbnQgKi8KK3N0YXRpYyBjaGFyICoqZmlsbF9lbnZwKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KQoreworCWludCBlbnZjOworCWludCBpOworCWNoYXIgKiplbnZwLCAqKmN1cnI7CisJY29uc3QgY2hhciAqb3B0X25hbWU7CisJdWludDhfdCAqdGVtcDsKKwl1aW50OF90IG92ZXJsb2FkID0gMDsKKworI2RlZmluZSBCSVRNQVAgdW5zaWduZWQKKyNkZWZpbmUgQkJJVFMgKHNpemVvZihCSVRNQVApICogOCkKKyNkZWZpbmUgQk1BU0soaSkgKDEgPDwgKGkgJiAoc2l6ZW9mKEJJVE1BUCkgKiA4IC0gMSkpKQorI2RlZmluZSBGT1VORF9PUFRTKGkpIChmb3VuZF9vcHRzWyh1bnNpZ25lZClpIC8gQkJJVFNdKQorCUJJVE1BUCBmb3VuZF9vcHRzWzI1NiAvIEJCSVRTXTsKKworCW1lbXNldChmb3VuZF9vcHRzLCAwLCBzaXplb2YoZm91bmRfb3B0cykpOworCisJLyogV2UgbmVlZCA2IGVsZW1lbnRzIGZvcjoKKwkgKiAiaW50ZXJmYWNlPUlGQUNFIgorCSAqICJpcD1OLk4uTi5OIiBmcm9tIHBhY2tldC0+eWlhZGRyCisJICogInNpYWRkcj1JUCIgZnJvbSBwYWNrZXQtPnNpYWRkcl9uaXAgKHVubGVzcyAwKQorCSAqICJib290X2ZpbGU9RklMRSIgZnJvbSBwYWNrZXQtPmZpbGUgKHVubGVzcyBvdmVybG9hZGVkKQorCSAqICJzbmFtZT1TRVJWRVJfSE9TVE5BTUUiIGZyb20gcGFja2V0LT5zbmFtZSAodW5sZXNzIG92ZXJsb2FkZWQpCisJICogdGVybWluYXRpbmcgTlVMTAorCSAqLworCWVudmMgPSA2OworCS8qICsxIGVsZW1lbnQgZm9yIGVhY2ggb3B0aW9uLCArMiBmb3Igc3VibmV0IG9wdGlvbjogKi8KKwlpZiAocGFja2V0KSB7CisJCS8qIG5vdGU6IGRvIG5vdCBzZWFyY2ggZm9yICJwYWQiICgwKSBhbmQgImVuZCIgKDI1NSkgb3B0aW9ucyAqLworCQlmb3IgKGkgPSAxOyBpIDwgMjU1OyBpKyspIHsKKwkJCXRlbXAgPSB1ZGhjcF9nZXRfb3B0aW9uKHBhY2tldCwgaSk7CisJCQlpZiAodGVtcCkgeworCQkJCWlmIChpID09IERIQ1BfT1BUSU9OX09WRVJMT0FEKQorCQkJCQlvdmVybG9hZCA9ICp0ZW1wOworCQkJCWVsc2UgaWYgKGkgPT0gREhDUF9TVUJORVQpCisJCQkJCWVudmMrKzsgLyogZm9yIG10b24gKi8KKwkJCQllbnZjKys7CisJCQkJLyppZiAoaSAhPSBESENQX01FU1NBR0VfVFlQRSkqLworCQkJCUZPVU5EX09QVFMoaSkgfD0gQk1BU0soaSk7CisJCQl9CisJCX0KKwl9CisJY3VyciA9IGVudnAgPSB4emFsbG9jKHNpemVvZihlbnZwWzBdKSAqIGVudmMpOworCisJKmN1cnIgPSB4YXNwcmludGYoImludGVyZmFjZT0lcyIsIGNsaWVudF9jb25maWcuaW50ZXJmYWNlKTsKKwlwdXRlbnYoKmN1cnIrKyk7CisKKwlpZiAoIXBhY2tldCkKKwkJcmV0dXJuIGVudnA7CisKKwkqY3VyciA9IHhtYWxsb2Moc2l6ZW9mKCJpcD0yNTUuMjU1LjI1NS4yNTUiKSk7CisJc3ByaW50X25pcCgqY3VyciwgImlwPSIsICh1aW50OF90ICopICZwYWNrZXQtPnlpYWRkcik7CisJcHV0ZW52KCpjdXJyKyspOworCisJb3B0X25hbWUgPSBkaGNwX29wdGlvbl9zdHJpbmdzOworCWkgPSAwOworCXdoaWxlICgqb3B0X25hbWUpIHsKKwkJdWludDhfdCBjb2RlID0gZGhjcF9vcHRmbGFnc1tpXS5jb2RlOworCQlCSVRNQVAgKmZvdW5kX3B0ciA9ICZGT1VORF9PUFRTKGNvZGUpOworCQlCSVRNQVAgZm91bmRfbWFzayA9IEJNQVNLKGNvZGUpOworCQlpZiAoISgqZm91bmRfcHRyICYgZm91bmRfbWFzaykpCisJCQlnb3RvIG5leHQ7CisJCSpmb3VuZF9wdHIgJj0gfmZvdW5kX21hc2s7IC8qIGxlYXZlIG9ubHkgdW5rbm93biBvcHRpb25zICovCisJCXRlbXAgPSB1ZGhjcF9nZXRfb3B0aW9uKHBhY2tldCwgY29kZSk7CisJCSpjdXJyID0geG1hbGxvY19vcHRuYW1lX29wdHZhbCh0ZW1wLCAmZGhjcF9vcHRmbGFnc1tpXSwgb3B0X25hbWUpOworCQlwdXRlbnYoKmN1cnIrKyk7CisJCWlmIChjb2RlID09IERIQ1BfU1VCTkVUKSB7CisJCQkvKiBTdWJuZXQgb3B0aW9uOiBtYWtlIHRoaW5ncyBsaWtlICIkaXAvJG1hc2siIHBvc3NpYmxlICovCisJCQl1aW50MzJfdCBzdWJuZXQ7CisJCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIoc3VibmV0LCB0ZW1wKTsKKwkJCSpjdXJyID0geGFzcHJpbnRmKCJtYXNrPSVkIiwgbXRvbihzdWJuZXQpKTsKKwkJCXB1dGVudigqY3VycisrKTsKKwkJfQorIG5leHQ6CisJCW9wdF9uYW1lICs9IHN0cmxlbihvcHRfbmFtZSkgKyAxOworCQlpKys7CisJfQorCWlmIChwYWNrZXQtPnNpYWRkcl9uaXApIHsKKwkJKmN1cnIgPSB4bWFsbG9jKHNpemVvZigic2lhZGRyPTI1NS4yNTUuMjU1LjI1NSIpKTsKKwkJc3ByaW50X25pcCgqY3VyciwgInNpYWRkcj0iLCAodWludDhfdCAqKSAmcGFja2V0LT5zaWFkZHJfbmlwKTsKKwkJcHV0ZW52KCpjdXJyKyspOworCX0KKwlpZiAoIShvdmVybG9hZCAmIEZJTEVfRklFTEQpICYmIHBhY2tldC0+ZmlsZVswXSkgeworCQkvKiB3YXRjaCBvdXQgZm9yIGludmFsaWQgcGFja2V0cyAqLworCQkqY3VyciA9IHhhc3ByaW50ZigiYm9vdF9maWxlPSUuIkRIQ1BfUEtUX0ZJTEVfTEVOX1NUUiJzIiwgcGFja2V0LT5maWxlKTsKKwkJcHV0ZW52KCpjdXJyKyspOworCX0KKwlpZiAoIShvdmVybG9hZCAmIFNOQU1FX0ZJRUxEKSAmJiBwYWNrZXQtPnNuYW1lWzBdKSB7CisJCS8qIHdhdGNoIG91dCBmb3IgaW52YWxpZCBwYWNrZXRzICovCisJCSpjdXJyID0geGFzcHJpbnRmKCJzbmFtZT0lLiJESENQX1BLVF9TTkFNRV9MRU5fU1RSInMiLCBwYWNrZXQtPnNuYW1lKTsKKwkJcHV0ZW52KCpjdXJyKyspOworCX0KKwkvKiBIYW5kbGUgdW5rbm93biBvcHRpb25zICovCisJZm9yIChpID0gMDsgaSA8IDI1NjspIHsKKwkJQklUTUFQIGJpdG1hcCA9IEZPVU5EX09QVFMoaSk7CisJCWlmICghYml0bWFwKSB7CisJCQlpICs9IEJCSVRTOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGJpdG1hcCAmIEJNQVNLKGkpKSB7CisJCQl1bnNpZ25lZCBsZW4sIG9mczsKKworCQkJdGVtcCA9IHVkaGNwX2dldF9vcHRpb24ocGFja2V0LCBpKTsKKwkJCS8qIHVkaGNwX2dldF9vcHRpb24gcmV0dXJucyBwdHIgdG8gZGF0YSBwb3J0aW9uLAorCQkJICogbmVlZCB0byBnbyBiYWNrIHRvIGdldCBsZW4KKwkJCSAqLworCQkJbGVuID0gdGVtcFstT1BUX0RBVEEgKyBPUFRfTEVOXTsKKwkJCSpjdXJyID0geG1hbGxvYyhzaXplb2YoIm9wdE5OTj0iKSArIDEgKyBsZW4qMik7CisJCQlvZnMgPSBzcHJpbnRmKCpjdXJyLCAib3B0JXU9IiwgaSk7CisJCQliaW4yaGV4KCpjdXJyICsgb2ZzLCAodm9pZCopIHRlbXAsIGxlbilbMF0gPSAnXDAnOworCQkJcHV0ZW52KCpjdXJyKyspOworCQl9CisJCWkrKzsKKwl9CisJcmV0dXJuIGVudnA7Cit9CisKKy8qIENhbGwgYSBzY3JpcHQgd2l0aCBhIHBhciBmaWxlIGFuZCBlbnYgdmFycyAqLworc3RhdGljIHZvaWQgdWRoY3BfcnVuX3NjcmlwdChzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICoqZW52cCwgKipjdXJyOworCWNoYXIgKmFyZ3ZbM107CisKKwlpZiAoY2xpZW50X2NvbmZpZy5zY3JpcHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZW52cCA9IGZpbGxfZW52cChwYWNrZXQpOworCisJLyogY2FsbCBzY3JpcHQgKi8KKwlsb2cxKCJFeGVjdXRpbmcgJXMgJXMiLCBjbGllbnRfY29uZmlnLnNjcmlwdCwgbmFtZSk7CisJYXJndlswXSA9IChjaGFyKikgY2xpZW50X2NvbmZpZy5zY3JpcHQ7CisJYXJndlsxXSA9IChjaGFyKikgbmFtZTsKKwlhcmd2WzJdID0gTlVMTDsKKwlzcGF3bl9hbmRfd2FpdChhcmd2KTsKKworCWZvciAoY3VyciA9IGVudnA7ICpjdXJyOyBjdXJyKyspIHsKKwkJbG9nMigiICVzIiwgKmN1cnIpOworCQliYl91bnNldGVudl9hbmRfZnJlZSgqY3Vycik7CisJfQorCWZyZWUoZW52cCk7Cit9CisKKworLyoqKiBTZW5kaW5nL3JlY2VpdmluZyBwYWNrZXRzICoqKi8KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdWludDMyX3QgcmFuZG9tX3hpZCh2b2lkKQoreworCXJldHVybiByYW5kKCk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIHBhY2tldCB3aXRoIHRoZSBwcm9wZXIgZGVmYXVsdHMgKi8KK3N0YXRpYyB2b2lkIGluaXRfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBjaGFyIHR5cGUpCit7CisJdWludDE2X3Qgc2VjczsKKworCS8qIEZpbGwgaW46IG9wLCBodHlwZSwgaGxlbiwgY29va2llIGZpZWxkczsgbWVzc2FnZSB0eXBlIG9wdGlvbjogKi8KKwl1ZGhjcF9pbml0X2hlYWRlcihwYWNrZXQsIHR5cGUpOworCisJcGFja2V0LT54aWQgPSByYW5kb21feGlkKCk7CisKKwljbGllbnRfY29uZmlnLmxhc3Rfc2VjcyA9IG1vbm90b25pY19zZWMoKTsKKwlpZiAoY2xpZW50X2NvbmZpZy5maXJzdF9zZWNzID09IDApCisJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IGNsaWVudF9jb25maWcubGFzdF9zZWNzOworCXNlY3MgPSBjbGllbnRfY29uZmlnLmxhc3Rfc2VjcyAtIGNsaWVudF9jb25maWcuZmlyc3Rfc2VjczsKKwlwYWNrZXQtPnNlY3MgPSBodG9ucyhzZWNzKTsKKworCW1lbWNweShwYWNrZXQtPmNoYWRkciwgY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjLCA2KTsKKwlpZiAoY2xpZW50X2NvbmZpZy5jbGllbnRpZCkKKwkJdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24ocGFja2V0LCBjbGllbnRfY29uZmlnLmNsaWVudGlkKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2NsaWVudF9vcHRpb25zKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KQoreworCXVpbnQ4X3QgYzsKKwlpbnQgaSwgZW5kLCBsZW47CisKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbihwYWNrZXQsIERIQ1BfTUFYX1NJWkUsIGh0b25zKElQX1VEUF9ESENQX1NJWkUpKTsKKworCS8qIEFkZCBhICJwYXJhbSByZXEiIG9wdGlvbiB3aXRoIHRoZSBsaXN0IG9mIG9wdGlvbnMgd2UnZCBsaWtlIHRvIGhhdmUKKwkgKiBmcm9tIHN0dWJib3JuIERIQ1Agc2VydmVycy4gUHVsbCB0aGUgZGF0YSBmcm9tIHRoZSBzdHJ1Y3QgaW4gY29tbW9uLmMuCisJICogTm8gYm91bmRzIGNoZWNraW5nIGJlY2F1c2UgaXQgZ29lcyB0b3dhcmRzIHRoZSBoZWFkIG9mIHRoZSBwYWNrZXQuICovCisJZW5kID0gdWRoY3BfZW5kX29wdGlvbihwYWNrZXQtPm9wdGlvbnMpOworCWxlbiA9IDA7CisJZm9yIChpID0gMDsgKGMgPSBkaGNwX29wdGZsYWdzW2ldLmNvZGUpICE9IDA7IGkrKykgeworCQlpZiAoKCAgIChkaGNwX29wdGZsYWdzW2ldLmZsYWdzICYgT1BUSU9OX1JFUSkKKwkJICAgICAmJiAhY2xpZW50X2NvbmZpZy5ub19kZWZhdWx0X29wdGlvbnMKKwkJICAgICkKKwkJIHx8IChjbGllbnRfY29uZmlnLm9wdF9tYXNrW2MgPj4gM10gJiAoMSA8PCAoYyAmIDcpKSkKKwkJKSB7CisJCQlwYWNrZXQtPm9wdGlvbnNbZW5kICsgT1BUX0RBVEEgKyBsZW5dID0gYzsKKwkJCWxlbisrOworCQl9CisJfQorCWlmIChsZW4pIHsKKwkJcGFja2V0LT5vcHRpb25zW2VuZCArIE9QVF9DT0RFXSA9IERIQ1BfUEFSQU1fUkVROworCQlwYWNrZXQtPm9wdGlvbnNbZW5kICsgT1BUX0xFTl0gPSBsZW47CisJCXBhY2tldC0+b3B0aW9uc1tlbmQgKyBPUFRfREFUQSArIGxlbl0gPSBESENQX0VORDsKKwl9CisKKwlpZiAoY2xpZW50X2NvbmZpZy52ZW5kb3JjbGFzcykKKwkJdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24ocGFja2V0LCBjbGllbnRfY29uZmlnLnZlbmRvcmNsYXNzKTsKKwlpZiAoY2xpZW50X2NvbmZpZy5ob3N0bmFtZSkKKwkJdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24ocGFja2V0LCBjbGllbnRfY29uZmlnLmhvc3RuYW1lKTsKKwlpZiAoY2xpZW50X2NvbmZpZy5mcWRuKQorCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIGNsaWVudF9jb25maWcuZnFkbik7CisKKwkvKiBSZXF1ZXN0IGJyb2FkY2FzdCByZXBsaWVzIGlmIHdlIGhhdmUgbm8gSVAgYWRkciAqLworCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9CKSAmJiBwYWNrZXQtPmNpYWRkciA9PSAwKQorCQlwYWNrZXQtPmZsYWdzIHw9IGh0b25zKEJST0FEQ0FTVF9GTEFHKTsKKworCS8qIEFkZCAteCBvcHRpb25zIGlmIGFueSAqLworCXsKKwkJc3RydWN0IG9wdGlvbl9zZXQgKmN1cnIgPSBjbGllbnRfY29uZmlnLm9wdGlvbnM7CisJCXdoaWxlIChjdXJyKSB7CisJCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIGN1cnItPmRhdGEpOworCQkJY3VyciA9IGN1cnItPm5leHQ7CisJCX0KKy8vCQlpZiAoY2xpZW50X2NvbmZpZy5zbmFtZSkKKy8vCQkJc3RybmNweSgoY2hhciopcGFja2V0LT5zbmFtZSwgY2xpZW50X2NvbmZpZy5zbmFtZSwgc2l6ZW9mKHBhY2tldC0+c25hbWUpIC0gMSk7CisvLwkJaWYgKGNsaWVudF9jb25maWcuYm9vdF9maWxlKQorLy8JCQlzdHJuY3B5KChjaGFyKilwYWNrZXQtPmZpbGUsIGNsaWVudF9jb25maWcuYm9vdF9maWxlLCBzaXplb2YocGFja2V0LT5maWxlKSAtIDEpOworCX0KK30KKworLyogUkZDIDIxMzEKKyAqIDQuNC40IFVzZSBvZiBicm9hZGNhc3QgYW5kIHVuaWNhc3QKKyAqCisgKiBUaGUgREhDUCBjbGllbnQgYnJvYWRjYXN0cyBESENQRElTQ09WRVIsIERIQ1BSRVFVRVNUIGFuZCBESENQSU5GT1JNCisgKiBtZXNzYWdlcywgdW5sZXNzIHRoZSBjbGllbnQga25vd3MgdGhlIGFkZHJlc3Mgb2YgYSBESENQIHNlcnZlci4KKyAqIFRoZSBjbGllbnQgdW5pY2FzdHMgREhDUFJFTEVBU0UgbWVzc2FnZXMgdG8gdGhlIHNlcnZlci4gQmVjYXVzZQorICogdGhlIGNsaWVudCBpcyBkZWNsaW5pbmcgdGhlIHVzZSBvZiB0aGUgSVAgYWRkcmVzcyBzdXBwbGllZCBieSB0aGUgc2VydmVyLAorICogdGhlIGNsaWVudCBicm9hZGNhc3RzIERIQ1BERUNMSU5FIG1lc3NhZ2VzLgorICoKKyAqIFdoZW4gdGhlIERIQ1AgY2xpZW50IGtub3dzIHRoZSBhZGRyZXNzIG9mIGEgREhDUCBzZXJ2ZXIsIGluIGVpdGhlcgorICogSU5JVCBvciBSRUJPT1RJTkcgc3RhdGUsIHRoZSBjbGllbnQgbWF5IHVzZSB0aGF0IGFkZHJlc3MKKyAqIGluIHRoZSBESENQRElTQ09WRVIgb3IgREhDUFJFUVVFU1QgcmF0aGVyIHRoYW4gdGhlIElQIGJyb2FkY2FzdCBhZGRyZXNzLgorICogVGhlIGNsaWVudCBtYXkgYWxzbyB1c2UgdW5pY2FzdCB0byBzZW5kIERIQ1BJTkZPUk0gbWVzc2FnZXMKKyAqIHRvIGEga25vd24gREhDUCBzZXJ2ZXIuIElmIHRoZSBjbGllbnQgcmVjZWl2ZXMgbm8gcmVzcG9uc2UgdG8gREhDUAorICogbWVzc2FnZXMgc2VudCB0byB0aGUgSVAgYWRkcmVzcyBvZiBhIGtub3duIERIQ1Agc2VydmVyLCB0aGUgREhDUAorICogY2xpZW50IHJldmVydHMgdG8gdXNpbmcgdGhlIElQIGJyb2FkY2FzdCBhZGRyZXNzLgorICovCisKK3N0YXRpYyBpbnQgcmF3X2JjYXN0X2Zyb21fY2xpZW50X2NvbmZpZ19pZmluZGV4KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KQoreworCXJldHVybiB1ZGhjcF9zZW5kX3Jhd19wYWNrZXQocGFja2V0LAorCQkvKnNyYyovIElOQUREUl9BTlksIENMSUVOVF9QT1JULAorCQkvKmRzdCovIElOQUREUl9CUk9BRENBU1QsIFNFUlZFUl9QT1JULCBNQUNfQkNBU1RfQUREUiwKKwkJY2xpZW50X2NvbmZpZy5pZmluZGV4KTsKK30KKworLyogQnJvYWRjYXN0IGEgREhDUCBkaXNjb3ZlciBwYWNrZXQgdG8gdGhlIG5ldHdvcmssIHdpdGggYW4gb3B0aW9uYWxseSByZXF1ZXN0ZWQgSVAgKi8KKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgc2VuZF9kaXNjb3Zlcih1aW50MzJfdCB4aWQsIHVpbnQzMl90IHJlcXVlc3RlZCkKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCisJLyogRmlsbCBpbjogb3AsIGh0eXBlLCBobGVuLCBjb29raWUsIGNoYWRkciBmaWVsZHMsCisJICogcmFuZG9tIHhpZCBmaWVsZCAod2Ugb3ZlcnJpZGUgaXQgYmVsb3cpLAorCSAqIGNsaWVudC1pZCBvcHRpb24gKHVubGVzcyAtQyksIG1lc3NhZ2UgdHlwZSBvcHRpb246CisJICovCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgREhDUERJU0NPVkVSKTsKKworCXBhY2tldC54aWQgPSB4aWQ7CisJaWYgKHJlcXVlc3RlZCkKKwkJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9SRVFVRVNURURfSVAsIHJlcXVlc3RlZCk7CisKKwkvKiBBZGQgb3B0aW9uczogbWF4c2l6ZSwKKwkgKiBvcHRpb25hbGx5OiBob3N0bmFtZSwgZnFkbiwgdmVuZG9yY2xhc3MsCisJICogInBhcmFtIHJlcSIgb3B0aW9uIGFjY29yZGluZyB0byAtTywgb3B0aW9ucyBzcGVjaWZpZWQgd2l0aCAteAorCSAqLworCWFkZF9jbGllbnRfb3B0aW9ucygmcGFja2V0KTsKKworCWJiX2luZm9fbXNnKCJTZW5kaW5nIGRpc2NvdmVyLi4uIik7CisJcmV0dXJuIHJhd19iY2FzdF9mcm9tX2NsaWVudF9jb25maWdfaWZpbmRleCgmcGFja2V0KTsKK30KKworLyogQnJvYWRjYXN0IGEgREhDUCByZXF1ZXN0IG1lc3NhZ2UgKi8KKy8qIFJGQyAyMTMxIDMuMSBwYXJhZ3JhcGggMzoKKyAqICJUaGUgY2xpZW50IF9icm9hZGNhc3RzXyBhIERIQ1BSRVFVRVNUIG1lc3NhZ2UuLi4iCisgKi8KKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgc2VuZF9zZWxlY3QodWludDMyX3QgeGlkLCB1aW50MzJfdCBzZXJ2ZXIsIHVpbnQzMl90IHJlcXVlc3RlZCkKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisKKy8qCisgKiBSRkMgMjEzMSA0LjMuMiBESENQUkVRVUVTVCBtZXNzYWdlCisgKiAuLi4KKyAqIElmIHRoZSBESENQUkVRVUVTVCBtZXNzYWdlIGNvbnRhaW5zIGEgJ3NlcnZlciBpZGVudGlmaWVyJworICogb3B0aW9uLCB0aGUgbWVzc2FnZSBpcyBpbiByZXNwb25zZSB0byBhIERIQ1BPRkZFUiBtZXNzYWdlLgorICogT3RoZXJ3aXNlLCB0aGUgbWVzc2FnZSBpcyBhIHJlcXVlc3QgdG8gdmVyaWZ5IG9yIGV4dGVuZCBhbgorICogZXhpc3RpbmcgbGVhc2UuIElmIHRoZSBjbGllbnQgdXNlcyBhICdjbGllbnQgaWRlbnRpZmllcicKKyAqIGluIGEgREhDUFJFUVVFU1QgbWVzc2FnZSwgaXQgTVVTVCB1c2UgdGhhdCBzYW1lICdjbGllbnQgaWRlbnRpZmllcicKKyAqIGluIGFsbCBzdWJzZXF1ZW50IG1lc3NhZ2VzLiBJZiB0aGUgY2xpZW50IGluY2x1ZGVkIGEgbGlzdAorICogb2YgcmVxdWVzdGVkIHBhcmFtZXRlcnMgaW4gYSBESENQRElTQ09WRVIgbWVzc2FnZSwgaXQgTVVTVAorICogaW5jbHVkZSB0aGF0IGxpc3QgaW4gYWxsIHN1YnNlcXVlbnQgbWVzc2FnZXMuCisgKi8KKwkvKiBGaWxsIGluOiBvcCwgaHR5cGUsIGhsZW4sIGNvb2tpZSwgY2hhZGRyIGZpZWxkcywKKwkgKiByYW5kb20geGlkIGZpZWxkICh3ZSBvdmVycmlkZSBpdCBiZWxvdyksCisJICogY2xpZW50LWlkIG9wdGlvbiAodW5sZXNzIC1DKSwgbWVzc2FnZSB0eXBlIG9wdGlvbjoKKwkgKi8KKwlpbml0X3BhY2tldCgmcGFja2V0LCBESENQUkVRVUVTVCk7CisKKwlwYWNrZXQueGlkID0geGlkOworCXVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKCZwYWNrZXQsIERIQ1BfUkVRVUVTVEVEX0lQLCByZXF1ZXN0ZWQpOworCisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9TRVJWRVJfSUQsIHNlcnZlcik7CisKKwkvKiBBZGQgb3B0aW9uczogbWF4c2l6ZSwKKwkgKiBvcHRpb25hbGx5OiBob3N0bmFtZSwgZnFkbiwgdmVuZG9yY2xhc3MsCisJICogInBhcmFtIHJlcSIgb3B0aW9uIGFjY29yZGluZyB0byAtTywgYW5kIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggLXgKKwkgKi8KKwlhZGRfY2xpZW50X29wdGlvbnMoJnBhY2tldCk7CisKKwlhZGRyLnNfYWRkciA9IHJlcXVlc3RlZDsKKwliYl9pbmZvX21zZygiU2VuZGluZyBzZWxlY3QgZm9yICVzLi4uIiwgaW5ldF9udG9hKGFkZHIpKTsKKwlyZXR1cm4gcmF3X2JjYXN0X2Zyb21fY2xpZW50X2NvbmZpZ19pZmluZGV4KCZwYWNrZXQpOworfQorCisvKiBVbmljYXN0IG9yIGJyb2FkY2FzdCBhIERIQ1AgcmVuZXcgbWVzc2FnZSAqLworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIGludCBzZW5kX3JlbmV3KHVpbnQzMl90IHhpZCwgdWludDMyX3Qgc2VydmVyLCB1aW50MzJfdCBjaWFkZHIpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKworLyoKKyAqIFJGQyAyMTMxIDQuMy4yIERIQ1BSRVFVRVNUIG1lc3NhZ2UKKyAqIC4uLgorICogREhDUFJFUVVFU1QgZ2VuZXJhdGVkIGR1cmluZyBSRU5FV0lORyBzdGF0ZToKKyAqCisgKiAnc2VydmVyIGlkZW50aWZpZXInIE1VU1QgTk9UIGJlIGZpbGxlZCBpbiwgJ3JlcXVlc3RlZCBJUCBhZGRyZXNzJworICogb3B0aW9uIE1VU1QgTk9UIGJlIGZpbGxlZCBpbiwgJ2NpYWRkcicgTVVTVCBiZSBmaWxsZWQgaW4gd2l0aAorICogY2xpZW50J3MgSVAgYWRkcmVzcy4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBjbGllbnQgaXMgY29tcGxldGVseQorICogY29uZmlndXJlZCwgYW5kIGlzIHRyeWluZyB0byBleHRlbmQgaXRzIGxlYXNlLiBUaGlzIG1lc3NhZ2Ugd2lsbAorICogYmUgdW5pY2FzdCwgc28gbm8gcmVsYXkgYWdlbnRzIHdpbGwgYmUgaW52b2x2ZWQgaW4gaXRzCisgKiB0cmFuc21pc3Npb24uICBCZWNhdXNlICdnaWFkZHInIGlzIHRoZXJlZm9yZSBub3QgZmlsbGVkIGluLCB0aGUKKyAqIERIQ1Agc2VydmVyIHdpbGwgdHJ1c3QgdGhlIHZhbHVlIGluICdjaWFkZHInLCBhbmQgdXNlIGl0IHdoZW4KKyAqIHJlcGx5aW5nIHRvIHRoZSBjbGllbnQuCisgKi8KKwkvKiBGaWxsIGluOiBvcCwgaHR5cGUsIGhsZW4sIGNvb2tpZSwgY2hhZGRyIGZpZWxkcywKKwkgKiByYW5kb20geGlkIGZpZWxkICh3ZSBvdmVycmlkZSBpdCBiZWxvdyksCisJICogY2xpZW50LWlkIG9wdGlvbiAodW5sZXNzIC1DKSwgbWVzc2FnZSB0eXBlIG9wdGlvbjoKKwkgKi8KKwlpbml0X3BhY2tldCgmcGFja2V0LCBESENQUkVRVUVTVCk7CisKKwlwYWNrZXQueGlkID0geGlkOworCXBhY2tldC5jaWFkZHIgPSBjaWFkZHI7CisKKwkvKiBBZGQgb3B0aW9uczogbWF4c2l6ZSwKKwkgKiBvcHRpb25hbGx5OiBob3N0bmFtZSwgZnFkbiwgdmVuZG9yY2xhc3MsCisJICogInBhcmFtIHJlcSIgb3B0aW9uIGFjY29yZGluZyB0byAtTywgYW5kIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggLXgKKwkgKi8KKwlhZGRfY2xpZW50X29wdGlvbnMoJnBhY2tldCk7CisKKwliYl9pbmZvX21zZygiU2VuZGluZyByZW5ldy4uLiIpOworCWlmIChzZXJ2ZXIpCisJCXJldHVybiB1ZGhjcF9zZW5kX2tlcm5lbF9wYWNrZXQoJnBhY2tldCwKKwkJCWNpYWRkciwgQ0xJRU5UX1BPUlQsCisJCQlzZXJ2ZXIsIFNFUlZFUl9QT1JUKTsKKwlyZXR1cm4gcmF3X2JjYXN0X2Zyb21fY2xpZW50X2NvbmZpZ19pZmluZGV4KCZwYWNrZXQpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BDX0FSUElORworLyogQnJvYWRjYXN0IGEgREhDUCBkZWNsaW5lIG1lc3NhZ2UgKi8KKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgc2VuZF9kZWNsaW5lKHVpbnQzMl90IHhpZCwgdWludDMyX3Qgc2VydmVyLCB1aW50MzJfdCByZXF1ZXN0ZWQpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKworCS8qIEZpbGwgaW46IG9wLCBodHlwZSwgaGxlbiwgY29va2llLCBjaGFkZHIsIHJhbmRvbSB4aWQgZmllbGRzLAorCSAqIGNsaWVudC1pZCBvcHRpb24gKHVubGVzcyAtQyksIG1lc3NhZ2UgdHlwZSBvcHRpb246CisJICovCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgREhDUERFQ0xJTkUpOworCisJLyogUkZDIDIxMzEgc2F5cyBESENQREVDTElORSdzIHhpZCBpcyByYW5kb21seSBzZWxlY3RlZCBieSBjbGllbnQsCisJICogYnV0IGluIGNhc2UgdGhlIHNlcnZlciBpcyBidWdneSBhbmQgd2FudHMgREhDUERFQ0xJTkUncyB4aWQKKwkgKiB0byBtYXRjaCB0aGUgeGlkIHdoaWNoIHN0YXJ0ZWQgZW50aXJlIGhhbmRzaGFrZSwKKwkgKiB3ZSB1c2UgdGhlIHNhbWUgeGlkIHdlIHVzZWQgaW4gaW5pdGlhbCBESENQRElTQ09WRVI6CisJICovCisJcGFja2V0LnhpZCA9IHhpZDsKKwkvKiBESENQREVDTElORSB1c2VzICJyZXF1ZXN0ZWQgaXAiLCBub3QgY2lhZGRyLCB0byBzdG9yZSBvZmZlcmVkIElQICovCisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9SRVFVRVNURURfSVAsIHJlcXVlc3RlZCk7CisKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbigmcGFja2V0LCBESENQX1NFUlZFUl9JRCwgc2VydmVyKTsKKworCWJiX2luZm9fbXNnKCJTZW5kaW5nIGRlY2xpbmUuLi4iKTsKKwlyZXR1cm4gcmF3X2JjYXN0X2Zyb21fY2xpZW50X2NvbmZpZ19pZmluZGV4KCZwYWNrZXQpOworfQorI2VuZGlmCisKKy8qIFVuaWNhc3QgYSBESENQIHJlbGVhc2UgbWVzc2FnZSAqLworc3RhdGljIGludCBzZW5kX3JlbGVhc2UodWludDMyX3Qgc2VydmVyLCB1aW50MzJfdCBjaWFkZHIpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKworCS8qIEZpbGwgaW46IG9wLCBodHlwZSwgaGxlbiwgY29va2llLCBjaGFkZHIsIHJhbmRvbSB4aWQgZmllbGRzLAorCSAqIGNsaWVudC1pZCBvcHRpb24gKHVubGVzcyAtQyksIG1lc3NhZ2UgdHlwZSBvcHRpb246CisJICovCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgREhDUFJFTEVBU0UpOworCisJLyogREhDUFJFTEVBU0UgdXNlcyBjaWFkZHIsIG5vdCAicmVxdWVzdGVkIGlwIiwgdG8gc3RvcmUgSVAgYmVpbmcgcmVsZWFzZWQgKi8KKwlwYWNrZXQuY2lhZGRyID0gY2lhZGRyOworCisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9TRVJWRVJfSUQsIHNlcnZlcik7CisKKwliYl9pbmZvX21zZygiU2VuZGluZyByZWxlYXNlLi4uIik7CisJcmV0dXJuIHVkaGNwX3NlbmRfa2VybmVsX3BhY2tldCgmcGFja2V0LCBjaWFkZHIsIENMSUVOVF9QT1JULCBzZXJ2ZXIsIFNFUlZFUl9QT1JUKTsKK30KKworLyogUmV0dXJucyAtMSBvbiBlcnJvcnMgdGhhdCBhcmUgZmF0YWwgZm9yIHRoZSBzb2NrZXQsIC0yIGZvciB0aG9zZSB0aGF0IGFyZW4ndCAqLworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIGludCB1ZGhjcF9yZWN2X3Jhd19wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwX3BrdCwgaW50IGZkKQoreworCWludCBieXRlczsKKwlzdHJ1Y3QgaXBfdWRwX2RoY3BfcGFja2V0IHBhY2tldDsKKwl1aW50MTZfdCBjaGVjazsKKworCW1lbXNldCgmcGFja2V0LCAwLCBzaXplb2YocGFja2V0KSk7CisJYnl0ZXMgPSBzYWZlX3JlYWQoZmQsICZwYWNrZXQsIHNpemVvZihwYWNrZXQpKTsKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCWxvZzEoIlBhY2tldCByZWFkIGVycm9yLCBpZ25vcmluZyIpOworCQkvKiBOQjogcG9zc2libGUgZG93biBpbnRlcmZhY2UsIGV0Yy4gQ2FsbGVyIHNob3VsZCBwYXVzZS4gKi8KKwkJcmV0dXJuIGJ5dGVzOyAvKiByZXR1cm5zIC0xICovCisJfQorCisJaWYgKGJ5dGVzIDwgKGludCkgKHNpemVvZihwYWNrZXQuaXApICsgc2l6ZW9mKHBhY2tldC51ZHApKSkgeworCQlsb2cxKCJQYWNrZXQgaXMgdG9vIHNob3J0LCBpZ25vcmluZyIpOworCQlyZXR1cm4gLTI7CisJfQorCisJaWYgKGJ5dGVzIDwgbnRvaHMocGFja2V0LmlwLnRvdF9sZW4pKSB7CisJCS8qIHBhY2tldCBpcyBiaWdnZXIgdGhhbiBzaXplb2YocGFja2V0KSwgd2UgZGlkIHBhcnRpYWwgcmVhZCAqLworCQlsb2cxKCJPdmVyc2l6ZWQgcGFja2V0LCBpZ25vcmluZyIpOworCQlyZXR1cm4gLTI7CisJfQorCisJLyogaWdub3JlIGFueSBleHRyYSBnYXJiYWdlIGJ5dGVzICovCisJYnl0ZXMgPSBudG9ocyhwYWNrZXQuaXAudG90X2xlbik7CisKKwkvKiBtYWtlIHN1cmUgaXRzIHRoZSByaWdodCBwYWNrZXQgZm9yIHVzLCBhbmQgdGhhdCBpdCBwYXNzZXMgc2FuaXR5IGNoZWNrcyAqLworCWlmIChwYWNrZXQuaXAucHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgfHwgcGFja2V0LmlwLnZlcnNpb24gIT0gSVBWRVJTSU9OCisJIHx8IHBhY2tldC5pcC5paGwgIT0gKHNpemVvZihwYWNrZXQuaXApID4+IDIpCisJIHx8IHBhY2tldC51ZHAuZGVzdCAhPSBodG9ucyhDTElFTlRfUE9SVCkKKwkvKiB8fCBieXRlcyA+IChpbnQpIHNpemVvZihwYWNrZXQpIC0gY2FuJ3QgaGFwcGVuICovCisJIHx8IG50b2hzKHBhY2tldC51ZHAubGVuKSAhPSAodWludDE2X3QpKGJ5dGVzIC0gc2l6ZW9mKHBhY2tldC5pcCkpCisJKSB7CisJCWxvZzEoIlVucmVsYXRlZC9ib2d1cyBwYWNrZXQsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisKKwkvKiB2ZXJpZnkgSVAgY2hlY2tzdW0gKi8KKwljaGVjayA9IHBhY2tldC5pcC5jaGVjazsKKwlwYWNrZXQuaXAuY2hlY2sgPSAwOworCWlmIChjaGVjayAhPSB1ZGhjcF9jaGVja3N1bSgmcGFja2V0LmlwLCBzaXplb2YocGFja2V0LmlwKSkpIHsKKwkJbG9nMSgiQmFkIElQIGhlYWRlciBjaGVja3N1bSwgaWdub3JpbmciKTsKKwkJcmV0dXJuIC0yOworCX0KKworCS8qIHZlcmlmeSBVRFAgY2hlY2tzdW0uIElQIGhlYWRlciBoYXMgdG8gYmUgbW9kaWZpZWQgZm9yIHRoaXMgKi8KKwltZW1zZXQoJnBhY2tldC5pcCwgMCwgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLCBwcm90b2NvbCkpOworCS8qIGlwLnh4IGZpZWxkcyB3aGljaCBhcmUgbm90IG1lbXNldDogcHJvdG9jb2wsIGNoZWNrLCBzYWRkciwgZGFkZHIgKi8KKwlwYWNrZXQuaXAudG90X2xlbiA9IHBhY2tldC51ZHAubGVuOyAvKiB5ZXMsIHRoaXMgaXMgbmVlZGVkICovCisJY2hlY2sgPSBwYWNrZXQudWRwLmNoZWNrOworCXBhY2tldC51ZHAuY2hlY2sgPSAwOworCWlmIChjaGVjayAmJiBjaGVjayAhPSB1ZGhjcF9jaGVja3N1bSgmcGFja2V0LCBieXRlcykpIHsKKwkJbG9nMSgiUGFja2V0IHdpdGggYmFkIFVEUCBjaGVja3N1bSByZWNlaXZlZCwgaWdub3JpbmciKTsKKwkJcmV0dXJuIC0yOworCX0KKworCW1lbWNweShkaGNwX3BrdCwgJnBhY2tldC5kYXRhLCBieXRlcyAtIChzaXplb2YocGFja2V0LmlwKSArIHNpemVvZihwYWNrZXQudWRwKSkpOworCisJaWYgKGRoY3BfcGt0LT5jb29raWUgIT0gaHRvbmwoREhDUF9NQUdJQykpIHsKKwkJYmJfaW5mb19tc2coIlBhY2tldCB3aXRoIGJhZCBtYWdpYywgaWdub3JpbmciKTsKKwkJcmV0dXJuIC0yOworCX0KKwlsb2cxKCJHb3QgdmFsaWQgREhDUCBwYWNrZXQiKTsKKwl1ZGhjcF9kdW1wX3BhY2tldChkaGNwX3BrdCk7CisJcmV0dXJuIGJ5dGVzIC0gKHNpemVvZihwYWNrZXQuaXApICsgc2l6ZW9mKHBhY2tldC51ZHApKTsKK30KKworCisvKioqIE1haW4gKioqLworCitzdGF0aWMgaW50IHNvY2tmZCA9IC0xOworCisjZGVmaW5lIExJU1RFTl9OT05FICAgMAorI2RlZmluZSBMSVNURU5fS0VSTkVMIDEKKyNkZWZpbmUgTElTVEVOX1JBVyAgICAyCitzdGF0aWMgc21hbGxpbnQgbGlzdGVuX21vZGU7CisKKy8qIGluaXRpYWwgc3RhdGU6IChyZSlzdGFydCBESENQIG5lZ290aWF0aW9uICovCisjZGVmaW5lIElOSVRfU0VMRUNUSU5HICAwCisvKiBkaXNjb3ZlciB3YXMgc2VudCwgREhDUE9GRkVSIHJlcGx5IHJlY2VpdmVkICovCisjZGVmaW5lIFJFUVVFU1RJTkcgICAgICAxCisvKiBzZWxlY3QvcmVuZXcgd2FzIHNlbnQsIERIQ1BBQ0sgcmVwbHkgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgQk9VTkQgICAgICAgICAgIDIKKy8qIGhhbGYgb2YgbGVhc2UgcGFzc2VkLCB3YW50IHRvIHJlbmV3IGl0IGJ5IHNlbmRpbmcgdW5pY2FzdCByZW5ldyByZXF1ZXN0cyAqLworI2RlZmluZSBSRU5FV0lORyAgICAgICAgMworLyogcmVuZXcgcmVxdWVzdHMgd2VyZSBub3QgYW5zd2VyZWQsIGxlYXNlIGlzIGFsbW9zdCBvdmVyLCBzZW5kIGJyb2FkY2FzdCByZW5ldyAqLworI2RlZmluZSBSRUJJTkRJTkcgICAgICAgNAorLyogbWFudWFsbHkgcmVxdWVzdGVkIHJlbmV3IChTSUdVU1IxKSAqLworI2RlZmluZSBSRU5FV19SRVFVRVNURUQgNQorLyogcmVsZWFzZSwgcG9zc2libHkgbWFudWFsbHkgcmVxdWVzdGVkIChTSUdVU1IyKSAqLworI2RlZmluZSBSRUxFQVNFRCAgICAgICAgNgorc3RhdGljIHNtYWxsaW50IHN0YXRlOworCitzdGF0aWMgaW50IHVkaGNwX3Jhd19zb2NrZXQoaW50IGlmaW5kZXgpCit7CisJaW50IGZkOworCXN0cnVjdCBzb2NrYWRkcl9sbCBzb2NrOworCisJLyoKKwkgKiBDb21tZW50OgorCSAqCisJICoJSSd2ZSBzZWxlY3RlZCBub3QgdG8gc2VlIExMIGhlYWRlciwgc28gQlBGIGRvZXNuJ3Qgc2VlIGl0LCB0b28uCisJICoJVGhlIGZpbHRlciBtYXkgYWxzbyBwYXNzIG5vbi1JUCBhbmQgbm9uLUFSUCBwYWNrZXRzLCBidXQgd2UgZG8KKwkgKglhIG1vcmUgY29tcGxldGUgY2hlY2sgd2hlbiByZWNlaXZpbmcgdGhlIG1lc3NhZ2UgaW4gdXNlcnNwYWNlLgorCSAqCisJICogYW5kIGZpbHRlciBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbToKKwkgKgorCSAqCWh0dHA6Ly93d3cuZmxhbWV3YXJtYXN0ZXIuZGUvc29mdHdhcmUvZGhjcGNsaWVudC8KKwkgKgorCSAqIFRoZXJlIGFyZSBhIGZldyBvdGhlciBpbnRlcmVzdGluZyBpZGVhcyBvbiB0aGF0IHBhZ2UgKGxvb2sgdW5kZXIKKwkgKiAiTW90aXZhdGlvbiIpLiAgVXNlIG9mIG5ldGxpbmsgZXZlbnRzIGlzIG1vc3QgaW50ZXJlc3RpbmcuICBUaGluaworCSAqIG9mIHZhcmlvdXMgbmV0d29yayBzZXJ2ZXJzIGxpc3RlbmluZyBmb3IgZXZlbnRzIGFuZCByZWNvbmZpZ3VyaW5nLgorCSAqIFRoYXQgd291bGQgb2Jzb2xldGUgc2VuZGluZyBIVVAgc2lnbmFscyBhbmQvb3IgbWFrZSB1c2Ugb2YgcmVzdGFydHMuCisJICoKKwkgKiBDb3B5cmlnaHQ6IDIwMDYsIDIwMDcgU3RlZmFuIFJvbXBmIDxzdXhAbG9wbG9mLmRlPi4KKwkgKiBMaWNlbnNlOiBHUEwgdjIuCisJICoKKwkgKiBUT0RPOiBtYWtlIGNvbmRpdGlvbmFsPworCSAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29ja19maWx0ZXIgZmlsdGVyX2luc3RyW10gPSB7CisJCS8qIGxvYWQgOXRoIGJ5dGUgKHByb3RvY29sKSAqLworCQlCUEZfU1RNVChCUEZfTER8QlBGX0J8QlBGX0FCUywgOSksCisJCS8qIGp1bXAgdG8gTDEgaWYgaXQgaXMgSVBQUk9UT19VRFAsIGVsc2UgdG8gTDQgKi8KKwkJQlBGX0pVTVAoQlBGX0pNUHxCUEZfSkVRfEJQRl9LLCBJUFBST1RPX1VEUCwgMCwgNiksCisJCS8qIEwxOiBsb2FkIGhhbGZ3b3JkIGZyb20gb2Zmc2V0IDYgKGZsYWdzIGFuZCBmcmFnIG9mZnNldCkgKi8KKwkJQlBGX1NUTVQoQlBGX0xEfEJQRl9IfEJQRl9BQlMsIDYpLAorCQkvKiBqdW1wIHRvIEw0IGlmIGFueSBiaXRzIGluIGZyYWcgb2Zmc2V0IGZpZWxkIGFyZSBzZXQsIGVsc2UgdG8gTDIgKi8KKwkJQlBGX0pVTVAoQlBGX0pNUHxCUEZfSlNFVHxCUEZfSywgMHgxZmZmLCA0LCAwKSwKKwkJLyogTDI6IHNraXAgSVAgaGVhZGVyIChsb2FkIGluZGV4IHJlZyB3aXRoIGhlYWRlciBsZW4pICovCisJCUJQRl9TVE1UKEJQRl9MRFh8QlBGX0J8QlBGX01TSCwgMCksCisJCS8qIGxvYWQgdWRwIGRlc3RpbmF0aW9uIHBvcnQgZnJvbSBoYWxmd29yZFtoZWFkZXJfbGVuICsgMl0gKi8KKwkJQlBGX1NUTVQoQlBGX0xEfEJQRl9IfEJQRl9JTkQsIDIpLAorCQkvKiBqdW1wIHRvIEwzIGlmIHVkcCBkcG9ydCBpcyBDTElFTlRfUE9SVCwgZWxzZSB0byBMNCAqLworCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KRVF8QlBGX0ssIDY4LCAwLCAxKSwKKwkJLyogTDM6IGFjY2VwdCBwYWNrZXQgKi8KKwkJQlBGX1NUTVQoQlBGX1JFVHxCUEZfSywgMHhmZmZmZmZmZiksCisJCS8qIEw0OiBkaXNjYXJkIHBhY2tldCAqLworCQlCUEZfU1RNVChCUEZfUkVUfEJQRl9LLCAwKSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29ja19mcHJvZyBmaWx0ZXJfcHJvZyA9IHsKKwkJLmxlbiA9IHNpemVvZihmaWx0ZXJfaW5zdHIpIC8gc2l6ZW9mKGZpbHRlcl9pbnN0clswXSksCisJCS8qIGNhc3RpbmcgY29uc3QgYXdheTogKi8KKwkJLmZpbHRlciA9IChzdHJ1Y3Qgc29ja19maWx0ZXIgKikgZmlsdGVyX2luc3RyLAorCX07CisKKwlsb2cxKCJPcGVuaW5nIHJhdyBzb2NrZXQgb24gaWZpbmRleCAlZCIsIGlmaW5kZXgpOyAvL2xvZzI/CisKKwlmZCA9IHhzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCBodG9ucyhFVEhfUF9JUCkpOworCWxvZzEoIkdvdCByYXcgc29ja2V0IGZkICVkIiwgZmQpOyAvL2xvZzI/CisKKwlzb2NrLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJc29jay5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJc29jay5zbGxfaWZpbmRleCA9IGlmaW5kZXg7CisJeGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2ssIHNpemVvZihzb2NrKSk7CisKKwlpZiAoQ0xJRU5UX1BPUlQgPT0gNjgpIHsKKwkJLyogVXNlIG9ubHkgaWYgc3RhbmRhcmQgcG9ydCBpcyBpbiB1c2UgKi8KKwkJLyogSWdub3JpbmcgZXJyb3IgKGtlcm5lbCBtYXkgbGFjayBzdXBwb3J0IGZvciB0aGlzKSAqLworCQlpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwgJmZpbHRlcl9wcm9nLAorCQkJCXNpemVvZihmaWx0ZXJfcHJvZykpID49IDApCisJCQlsb2cxKCJBdHRhY2hlZCBmaWx0ZXIgdG8gcmF3IHNvY2tldCBmZCAlZCIsIGZkKTsgLy8gbG9nPworCX0KKworCWxvZzEoIkNyZWF0ZWQgcmF3IHNvY2tldCIpOworCisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfbGlzdGVuX21vZGUoaW50IG5ld19tb2RlKQoreworCWxvZzEoIkVudGVyaW5nIGxpc3RlbiBtb2RlOiAlcyIsCisJCW5ld19tb2RlICE9IExJU1RFTl9OT05FCisJCQk/IChuZXdfbW9kZSA9PSBMSVNURU5fS0VSTkVMID8gImtlcm5lbCIgOiAicmF3IikKKwkJCTogIm5vbmUiCisJKTsKKworCWxpc3Rlbl9tb2RlID0gbmV3X21vZGU7CisJaWYgKHNvY2tmZCA+PSAwKSB7CisJCWNsb3NlKHNvY2tmZCk7CisJCXNvY2tmZCA9IC0xOworCX0KKwlpZiAobmV3X21vZGUgPT0gTElTVEVOX0tFUk5FTCkKKwkJc29ja2ZkID0gdWRoY3BfbGlzdGVuX3NvY2tldCgvKklOQUREUl9BTlksKi8gQ0xJRU5UX1BPUlQsIGNsaWVudF9jb25maWcuaW50ZXJmYWNlKTsKKwllbHNlIGlmIChuZXdfbW9kZSAhPSBMSVNURU5fTk9ORSkKKwkJc29ja2ZkID0gdWRoY3BfcmF3X3NvY2tldChjbGllbnRfY29uZmlnLmlmaW5kZXgpOworCS8qIGVsc2UgTElTVEVOX05PTkU6IHNvY2tmZCBzdGF5cyBjbG9zZWQgKi8KK30KKworLyogQ2FsbGVkIG9ubHkgb24gU0lHVVNSMSAqLworc3RhdGljIHZvaWQgcGVyZm9ybV9yZW5ldyh2b2lkKQoreworCWJiX2luZm9fbXNnKCJQZXJmb3JtaW5nIGEgREhDUCByZW5ldyIpOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJPVU5EOgorCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX0tFUk5FTCk7CisJY2FzZSBSRU5FV0lORzoKKwljYXNlIFJFQklORElORzoKKwkJc3RhdGUgPSBSRU5FV19SRVFVRVNURUQ7CisJCWJyZWFrOworCWNhc2UgUkVORVdfUkVRVUVTVEVEOiAvKiBpbXBhdGllbnQgYXJlIHdlPyBmaW5lLCBzcXVhcmUgMSAqLworCQl1ZGhjcF9ydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworCWNhc2UgUkVRVUVTVElORzoKKwljYXNlIFJFTEVBU0VEOgorCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCXN0YXRlID0gSU5JVF9TRUxFQ1RJTkc7CisJCWJyZWFrOworCWNhc2UgSU5JVF9TRUxFQ1RJTkc6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcGVyZm9ybV9yZWxlYXNlKHVpbnQzMl90IHJlcXVlc3RlZF9pcCwgdWludDMyX3Qgc2VydmVyX2FkZHIpCit7CisJY2hhciBidWZmZXJbc2l6ZW9mKCIyNTUuMjU1LjI1NS4yNTUiKV07CisJc3RydWN0IGluX2FkZHIgdGVtcF9hZGRyOworCisJLyogc2VuZCByZWxlYXNlIHBhY2tldCAqLworCWlmIChzdGF0ZSA9PSBCT1VORCB8fCBzdGF0ZSA9PSBSRU5FV0lORyB8fCBzdGF0ZSA9PSBSRUJJTkRJTkcpIHsKKwkJdGVtcF9hZGRyLnNfYWRkciA9IHNlcnZlcl9hZGRyOworCQlzdHJjcHkoYnVmZmVyLCBpbmV0X250b2EodGVtcF9hZGRyKSk7CisJCXRlbXBfYWRkci5zX2FkZHIgPSByZXF1ZXN0ZWRfaXA7CisJCWJiX2luZm9fbXNnKCJVbmljYXN0aW5nIGEgcmVsZWFzZSBvZiAlcyB0byAlcyIsCisJCQkJaW5ldF9udG9hKHRlbXBfYWRkciksIGJ1ZmZlcik7CisJCXNlbmRfcmVsZWFzZShzZXJ2ZXJfYWRkciwgcmVxdWVzdGVkX2lwKTsgLyogdW5pY2FzdCAqLworCQl1ZGhjcF9ydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworCX0KKwliYl9pbmZvX21zZygiRW50ZXJpbmcgcmVsZWFzZWQgc3RhdGUiKTsKKworCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fTk9ORSk7CisJc3RhdGUgPSBSRUxFQVNFRDsKK30KKworc3RhdGljIHVpbnQ4X3QqIGFsbG9jX2RoY3Bfb3B0aW9uKGludCBjb2RlLCBjb25zdCBjaGFyICpzdHIsIGludCBleHRyYSkKK3sKKwl1aW50OF90ICpzdG9yYWdlOworCWludCBsZW4gPSBzdHJubGVuKHN0ciwgMjU1KTsKKwlzdG9yYWdlID0geHphbGxvYyhsZW4gKyBleHRyYSArIE9QVF9EQVRBKTsKKwlzdG9yYWdlW09QVF9DT0RFXSA9IGNvZGU7CisJc3RvcmFnZVtPUFRfTEVOXSA9IGxlbiArIGV4dHJhOworCW1lbWNweShzdG9yYWdlICsgZXh0cmEgKyBPUFRfREFUQSwgc3RyLCBsZW4pOworCXJldHVybiBzdG9yYWdlOworfQorCisjaWYgQkJfTU1VCitzdGF0aWMgdm9pZCBjbGllbnRfYmFja2dyb3VuZCh2b2lkKQoreworCWJiX2RhZW1vbml6ZSgwKTsKKwlsb2dtb2RlICY9IH5MT0dNT0RFX1NURElPOworCS8qIHJld3JpdGUgcGlkZmlsZSwgYXMgb3VyIHBpZCBpcyBkaWZmZXJlbnQgbm93ICovCisJd3JpdGVfcGlkZmlsZShjbGllbnRfY29uZmlnLnBpZGZpbGUpOworfQorI2VuZGlmCisKKy8vdXNhZ2U6I2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCisvL3VzYWdlOiMgZGVmaW5lIElGX1VESENQX1ZFUkJPU0UoLi4uKSBfX1ZBX0FSR1NfXworLy91c2FnZTojZWxzZQorLy91c2FnZTojIGRlZmluZSBJRl9VREhDUF9WRVJCT1NFKC4uLikKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOiNkZWZpbmUgdWRoY3BjX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWZibnEiSUZfVURIQ1BfVkVSQk9TRSgidiIpIm9DUkJdIFstaSBJRkFDRV0gWy1yIElQXSBbLXMgUFJPR10gWy1wIFBJREZJTEVdXG4iCisvL3VzYWdlOiAgICAgICAiCVstSCBIT1NUTkFNRV0gWy1WIFZFTkRPUl0gWy14IE9QVDpWQUxdLi4uIFstTyBPUFRdLi4uIiBJRl9GRUFUVVJFX1VESENQX1BPUlQoIiBbLVAgTl0iKQorLy91c2FnZTojZGVmaW5lIHVkaGNwY19mdWxsX3VzYWdlICJcbiIKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWksLS1pbnRlcmZhY2UgSUZBQ0UJSW50ZXJmYWNlIHRvIHVzZSAoZGVmYXVsdCBldGgwKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAsLS1waWRmaWxlIEZJTEUJQ3JlYXRlIHBpZGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS1zLC0tc2NyaXB0IFBST0cJUnVuIFBST0cgYXQgREhDUCBldmVudHMgKGRlZmF1bHQgIkNPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQiKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUIsLS1icm9hZGNhc3QJCVJlcXVlc3QgYnJvYWRjYXN0IHJlcGxpZXMiCisvL3VzYWdlOiAgICAgIlxuCS10LC0tcmV0cmllcyBOCQlTZW5kIHVwIHRvIE4gZGlzY292ZXIgcGFja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLVQsLS10aW1lb3V0IE4JCVBhdXNlIGJldHdlZW4gcGFja2V0cyAoZGVmYXVsdCAzIHNlY29uZHMpIgorLy91c2FnZTogICAgICJcbgktQSwtLXRyeWFnYWluIE4JCVdhaXQgTiBzZWNvbmRzIGFmdGVyIGZhaWx1cmUgKGRlZmF1bHQgMjApIgorLy91c2FnZTogICAgICJcbgktZiwtLWZvcmVncm91bmQJCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZToJVVNFX0ZPUl9NTVUoCisvL3VzYWdlOiAgICAgIlxuCS1iLC0tYmFja2dyb3VuZAkJQmFja2dyb3VuZCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1uLC0tbm93CQlFeGl0IGlmIGxlYXNlIGlzIG5vdCBvYnRhaW5lZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXEsLS1xdWl0CQlFeGl0IGFmdGVyIG9idGFpbmluZyBsZWFzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVIsLS1yZWxlYXNlCQlSZWxlYXNlIElQIG9uIGV4aXQiCisvL3VzYWdlOiAgICAgIlxuCS1TLC0tc3lzbG9nCQlMb2cgdG8gc3lzbG9nIHRvbyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgKKy8vdXNhZ2U6ICAgICAiXG4JLVAsLS1jbGllbnQtcG9ydCBOCVVzZSBwb3J0IE4gKGRlZmF1bHQgNjgpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9VREhDUENfQVJQSU5HKAorLy91c2FnZTogICAgICJcbgktYSwtLWFycGluZwkJVXNlIGFycGluZyB0byB2YWxpZGF0ZSBvZmZlcmVkIGFkZHJlc3MiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1PLC0tcmVxdWVzdC1vcHRpb24gT1BUCVJlcXVlc3Qgb3B0aW9uIE9QVCBmcm9tIHNlcnZlciAoY3VtdWxhdGl2ZSkiCisvL3VzYWdlOiAgICAgIlxuCS1vLC0tbm8tZGVmYXVsdC1vcHRpb25zCURvbid0IHJlcXVlc3QgYW55IG9wdGlvbnMgKHVubGVzcyAtTyBpcyBnaXZlbikiCisvL3VzYWdlOiAgICAgIlxuCS1yLC0tcmVxdWVzdCBJUAkJUmVxdWVzdCB0aGlzIElQIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS14IE9QVDpWQUwJCUluY2x1ZGUgb3B0aW9uIE9QVCBpbiBzZW50IHBhY2tldHMgKGN1bXVsYXRpdmUpIgorLy91c2FnZTogICAgICJcbgkJCQlFeGFtcGxlcyBvZiBzdHJpbmcsIG51bWVyaWMsIGFuZCBoZXggYnl0ZSBvcHRzOiIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJLXggaG9zdG5hbWU6YmJveCAtIG9wdGlvbiAxMiIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJLXggbGVhc2U6MzYwMCAtIG9wdGlvbiA1MSAobGVhc2UgdGltZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJCS14IDB4M2Q6MDEwMEJFRUZDMEZGRUUgLSBvcHRpb24gNjEgKGNsaWVudCBpZCkiCisvL3VzYWdlOiAgICAgIlxuCS1GLC0tZnFkbiBOQU1FCQlBc2sgc2VydmVyIHRvIHVwZGF0ZSBETlMgbWFwcGluZyBmb3IgTkFNRSIKKy8vdXNhZ2U6ICAgICAiXG4JLUgsLWgsLS1ob3N0bmFtZSBOQU1FCVNlbmQgTkFNRSBhcyBjbGllbnQgaG9zdG5hbWUgKGRlZmF1bHQgbm9uZSkiCisvL3VzYWdlOiAgICAgIlxuCS1WLC0tdmVuZG9yY2xhc3MgVkVORE9SCVZlbmRvciBpZGVudGlmaWVyIChkZWZhdWx0ICd1ZGhjcCBWRVJTSU9OJykiCisvL3VzYWdlOiAgICAgIlxuCS1DLC0tY2xpZW50aWQtbm9uZQlEb24ndCBzZW5kIE1BQyBhcyBjbGllbnQgaWRlbnRpZmllciIKKy8vdXNhZ2U6CUlGX1VESENQX1ZFUkJPU0UoCisvL3VzYWdlOiAgICAgIlxuCS12CQkJVmVyYm9zZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1pIElGQUNFCUludGVyZmFjZSB0byB1c2UgKGRlZmF1bHQgZXRoMCkiCisvL3VzYWdlOiAgICAgIlxuCS1wIEZJTEUJCUNyZWF0ZSBwaWRmaWxlIgorLy91c2FnZTogICAgICJcbgktcyBQUk9HCQlSdW4gUFJPRyBhdCBESENQIGV2ZW50cyAoZGVmYXVsdCAiQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVCIpIgorLy91c2FnZTogICAgICJcbgktQgkJUmVxdWVzdCBicm9hZGNhc3QgcmVwbGllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgTgkJU2VuZCB1cCB0byBOIGRpc2NvdmVyIHBhY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCS1UIE4JCVBhdXNlIGJldHdlZW4gcGFja2V0cyAoZGVmYXVsdCAzIHNlY29uZHMpIgorLy91c2FnZTogICAgICJcbgktQSBOCQlXYWl0IE4gc2Vjb25kcyAoZGVmYXVsdCAyMCkgYWZ0ZXIgZmFpbHVyZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZToJVVNFX0ZPUl9NTVUoCisvL3VzYWdlOiAgICAgIlxuCS1iCQlCYWNrZ3JvdW5kIGlmIGxlYXNlIGlzIG5vdCBvYnRhaW5lZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCUV4aXQgaWYgbGVhc2UgaXMgbm90IG9idGFpbmVkIgorLy91c2FnZTogICAgICJcbgktcQkJRXhpdCBhZnRlciBvYnRhaW5pbmcgbGVhc2UiCisvL3VzYWdlOiAgICAgIlxuCS1SCQlSZWxlYXNlIElQIG9uIGV4aXQiCisvL3VzYWdlOiAgICAgIlxuCS1TCQlMb2cgdG8gc3lzbG9nIHRvbyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgKKy8vdXNhZ2U6ICAgICAiXG4JLVAgTgkJVXNlIHBvcnQgTiAoZGVmYXVsdCA2OCkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoCisvL3VzYWdlOiAgICAgIlxuCS1hCQlVc2UgYXJwaW5nIHRvIHZhbGlkYXRlIG9mZmVyZWQgYWRkcmVzcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLU8gT1BUCQlSZXF1ZXN0IG9wdGlvbiBPUFQgZnJvbSBzZXJ2ZXIgKGN1bXVsYXRpdmUpIgorLy91c2FnZTogICAgICJcbgktbwkJRG9uJ3QgcmVxdWVzdCBhbnkgb3B0aW9ucyAodW5sZXNzIC1PIGlzIGdpdmVuKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgSVAJCVJlcXVlc3QgdGhpcyBJUCBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbgkteCBPUFQ6VkFMCUluY2x1ZGUgb3B0aW9uIE9QVCBpbiBzZW50IHBhY2tldHMgKGN1bXVsYXRpdmUpIgorLy91c2FnZTogICAgICJcbgkJCUV4YW1wbGVzIG9mIHN0cmluZywgbnVtZXJpYywgYW5kIGhleCBieXRlIG9wdHM6IgorLy91c2FnZTogICAgICJcbgkJCS14IGhvc3RuYW1lOmJib3ggLSBvcHRpb24gMTIiCisvL3VzYWdlOiAgICAgIlxuCQkJLXggbGVhc2U6MzYwMCAtIG9wdGlvbiA1MSAobGVhc2UgdGltZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJLXggMHgzZDowMTAwQkVFRkMwRkZFRSAtIG9wdGlvbiA2MSAoY2xpZW50IGlkKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUYgTkFNRQkJQXNrIHNlcnZlciB0byB1cGRhdGUgRE5TIG1hcHBpbmcgZm9yIE5BTUUiCisvL3VzYWdlOiAgICAgIlxuCS1ILC1oIE5BTUUJU2VuZCBOQU1FIGFzIGNsaWVudCBob3N0bmFtZSAoZGVmYXVsdCBub25lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVYgVkVORE9SCVZlbmRvciBpZGVudGlmaWVyIChkZWZhdWx0ICd1ZGhjcCBWRVJTSU9OJykiCisvL3VzYWdlOiAgICAgIlxuCS1DCQlEb24ndCBzZW5kIE1BQyBhcyBjbGllbnQgaWRlbnRpZmllciIKKy8vdXNhZ2U6CUlGX1VESENQX1ZFUkJPU0UoCisvL3VzYWdlOiAgICAgIlxuCS12CQlWZXJib3NlIgorLy91c2FnZToJKQorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcblNpZ25hbHM6IgorLy91c2FnZTogICAgICJcbglVU1IxCVJlbmV3IGN1cnJlbnQgbGVhc2UiCisvL3VzYWdlOiAgICAgIlxuCVVTUjIJUmVsZWFzZSBjdXJyZW50IGxlYXNlIgorCisKK2ludCB1ZGhjcGNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVkaGNwY19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdWludDhfdCAqdGVtcCwgKm1lc3NhZ2U7CisJY29uc3QgY2hhciAqc3RyX1YsICpzdHJfaCwgKnN0cl9GLCAqc3RyX3I7CisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKGNoYXIgKnN0cl9QOykKKwl2b2lkICpjbGllbnRpZF9tYWNfcHRyOworCWxsaXN0X3QgKmxpc3RfTyA9IE5VTEw7CisJbGxpc3RfdCAqbGlzdF94ID0gTlVMTDsKKwlpbnQgdHJ5YWdhaW5fdGltZW91dCA9IDIwOworCWludCBkaXNjb3Zlcl90aW1lb3V0ID0gMzsKKwlpbnQgZGlzY292ZXJfcmV0cmllcyA9IDM7CisJdWludDMyX3Qgc2VydmVyX2FkZHIgPSBzZXJ2ZXJfYWRkcjsgLyogZm9yIGNvbXBpbGVyICovCisJdWludDMyX3QgcmVxdWVzdGVkX2lwID0gMDsKKwl1aW50MzJfdCB4aWQgPSAwOworCXVpbnQzMl90IGxlYXNlX3NlY29uZHMgPSAwOyAvKiBjYW4gYmUgZ2l2ZW4gYXMgMzItYml0IHF1YW50aXR5ICovCisJaW50IHBhY2tldF9udW07CisJaW50IHRpbWVvdXQ7IC8qIG11c3QgYmUgc2lnbmVkICovCisJdW5zaWduZWQgYWxyZWFkeV93YWl0ZWRfc2VjOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgbWF4X2ZkOworCWludCByZXR2YWw7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKwlmZF9zZXQgcmZkczsKKworCS8qIERlZmF1bHQgb3B0aW9ucyAqLworCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVChTRVJWRVJfUE9SVCA9IDY3OykKKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoQ0xJRU5UX1BPUlQgPSA2ODspCisJY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UgPSAiZXRoMCI7CisJY2xpZW50X2NvbmZpZy5zY3JpcHQgPSBDT05GSUdfVURIQ1BDX0RFRkFVTFRfU0NSSVBUOworCXN0cl9WID0gInVkaGNwICJCQl9WRVI7CisKKwkvKiBQYXJzZSBjb21tYW5kIGxpbmUgKi8KKwkvKiBPLHg6IGxpc3Q7IC1ULC10LC1BIHRha2UgbnVtZXJpYyBwYXJhbSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIk86Ong6OlQrOnQrOkErIgorI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCisJCSI6dnYiCisjZW5kaWYKKwkJOworCUlGX0xPTkdfT1BUUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gdWRoY3BjX2xvbmdvcHRzOykKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiQ1Y6SDpoOkY6aTpucDpxUnI6czpUOnQ6U0E6TzpveDpmQiIKKwkJVVNFX0ZPUl9NTVUoImIiKQorCQlJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoImEiKQorCQlJRl9GRUFUVVJFX1VESENQX1BPUlQoIlA6IikKKwkJInYiCisJCSwgJnN0cl9WLCAmc3RyX2gsICZzdHJfaCwgJnN0cl9GCisJCSwgJmNsaWVudF9jb25maWcuaW50ZXJmYWNlLCAmY2xpZW50X2NvbmZpZy5waWRmaWxlLCAmc3RyX3IgLyogaSxwICovCisJCSwgJmNsaWVudF9jb25maWcuc2NyaXB0IC8qIHMgKi8KKwkJLCAmZGlzY292ZXJfdGltZW91dCwgJmRpc2NvdmVyX3JldHJpZXMsICZ0cnlhZ2Fpbl90aW1lb3V0IC8qIFQsdCxBICovCisJCSwgJmxpc3RfTworCQksICZsaXN0X3gKKwkJSUZfRkVBVFVSRV9VREhDUF9QT1JUKCwgJnN0cl9QKQorI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCisJCSwgJmRoY3BfdmVyYm9zZQorI2VuZGlmCisJCSk7CisJaWYgKG9wdCAmIChPUFRfaHxPUFRfSCkpCisJCWNsaWVudF9jb25maWcuaG9zdG5hbWUgPSBhbGxvY19kaGNwX29wdGlvbihESENQX0hPU1RfTkFNRSwgc3RyX2gsIDApOworCWlmIChvcHQgJiBPUFRfRikgeworCQkvKiBGUUROIG9wdGlvbiBmb3JtYXQ6IFsweDUxXVtsZW5dW2ZsYWdzXVswXVswXTxmcWRuPiAqLworCQljbGllbnRfY29uZmlnLmZxZG4gPSBhbGxvY19kaGNwX29wdGlvbihESENQX0ZRRE4sIHN0cl9GLCAzKTsKKwkJLyogRmxhZyBiaXRzOiAwMDAwTkVPUworCQkgKiBTOiAxID0gQ2xpZW50IHJlcXVlc3RzIHNlcnZlciB0byB1cGRhdGUgQSBSUiBpbiBETlMgYXMgd2VsbCBhcyBQVFIKKwkJICogTzogMSA9IFNlcnZlciBpbmRpY2F0ZXMgdG8gY2xpZW50IHRoYXQgRE5TIGhhcyBiZWVuIHVwZGF0ZWQgcmVnYXJkbGVzcworCQkgKiBFOiAxID0gTmFtZSBpcyBpbiBETlMgZm9ybWF0LCBpLmUuIDw0Pmhvc3Q8Nj5kb21haW48Mz5jb208MD4sCisJCSAqICAgIG5vdCAiaG9zdC5kb21haW4uY29tIi4gRm9ybWF0IDAgaXMgb2Jzb2xldGUuCisJCSAqIE46IDEgPSBDbGllbnQgcmVxdWVzdHMgc2VydmVyIHRvIG5vdCB1cGRhdGUgRE5TIChTIG11c3QgYmUgMCB0aGVuKQorCQkgKiBUd28gWzBdIGJ5dGVzIHdoaWNoIGZvbGxvdyBhcmUgZGVwcmVjYXRlZCBhbmQgbXVzdCBiZSAwLgorCQkgKi8KKwkJY2xpZW50X2NvbmZpZy5mcWRuW09QVF9EQVRBICsgMF0gPSAweDE7CisJCS8qY2xpZW50X2NvbmZpZy5mcWRuW09QVF9EQVRBICsgMV0gPSAwOyAtIHh6YWxsb2MgZGlkIGl0ICovCisJCS8qY2xpZW50X2NvbmZpZy5mcWRuW09QVF9EQVRBICsgMl0gPSAwOyAqLworCX0KKwlpZiAob3B0ICYgT1BUX3IpCisJCXJlcXVlc3RlZF9pcCA9IGluZXRfYWRkcihzdHJfcik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUE9SVAorCWlmIChvcHQgJiBPUFRfUCkgeworCQlDTElFTlRfUE9SVCA9IHhhdG91MTYoc3RyX1ApOworCQlTRVJWRVJfUE9SVCA9IENMSUVOVF9QT1JUIC0gMTsKKwl9CisjZW5kaWYKKwlpZiAob3B0ICYgT1BUX28pCisJCWNsaWVudF9jb25maWcubm9fZGVmYXVsdF9vcHRpb25zID0gMTsKKwl3aGlsZSAobGlzdF9PKSB7CisJCWNoYXIgKm9wdHN0ciA9IGxsaXN0X3BvcCgmbGlzdF9PKTsKKwkJdW5zaWduZWQgbiA9IGJiX3N0cnRvdShvcHRzdHIsIE5VTEwsIDApOworCQlpZiAoZXJybm8gfHwgbiA+IDI1NCkgeworCQkJbiA9IHVkaGNwX29wdGlvbl9pZHgob3B0c3RyKTsKKwkJCW4gPSBkaGNwX29wdGZsYWdzW25dLmNvZGU7CisJCX0KKwkJY2xpZW50X2NvbmZpZy5vcHRfbWFza1tuID4+IDNdIHw9IDEgPDwgKG4gJiA3KTsKKwl9CisJd2hpbGUgKGxpc3RfeCkgeworCQljaGFyICpvcHRzdHIgPSBsbGlzdF9wb3AoJmxpc3RfeCk7CisJCWNoYXIgKmNvbG9uID0gc3RyY2hyKG9wdHN0ciwgJzonKTsKKwkJaWYgKGNvbG9uKQorCQkJKmNvbG9uID0gJyAnOworCQkvKiBub3cgaXQgbG9va3Mgc2ltaWxhciB0byB1ZGhjcGQncyBjb25maWcgZmlsZSBsaW5lOgorCQkgKiAib3B0bmFtZSBvcHR2YWwiLCB1c2luZyB0aGUgY29tbW9uIHJvdXRpbmU6ICovCisJCXVkaGNwX3N0cjJvcHRzZXQob3B0c3RyLCAmY2xpZW50X2NvbmZpZy5vcHRpb25zKTsKKwl9CisKKwlpZiAodWRoY3BfcmVhZF9pbnRlcmZhY2UoY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UsCisJCQkmY2xpZW50X2NvbmZpZy5pZmluZGV4LAorCQkJTlVMTCwKKwkJCWNsaWVudF9jb25maWcuY2xpZW50X21hYykKKwkpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJY2xpZW50aWRfbWFjX3B0ciA9IE5VTEw7CisJaWYgKCEob3B0ICYgT1BUX0MpICYmICF1ZGhjcF9maW5kX29wdGlvbihjbGllbnRfY29uZmlnLm9wdGlvbnMsIERIQ1BfQ0xJRU5UX0lEKSkgeworCQkvKiBub3Qgc3VwcHJlc3NlZCBhbmQgbm90IHNldCwgc2V0IHRoZSBkZWZhdWx0IGNsaWVudCBJRCAqLworCQljbGllbnRfY29uZmlnLmNsaWVudGlkID0gYWxsb2NfZGhjcF9vcHRpb24oREhDUF9DTElFTlRfSUQsICIiLCA3KTsKKwkJY2xpZW50X2NvbmZpZy5jbGllbnRpZFtPUFRfREFUQV0gPSAxOyAvKiB0eXBlOiBldGhlcm5ldCAqLworCQljbGllbnRpZF9tYWNfcHRyID0gY2xpZW50X2NvbmZpZy5jbGllbnRpZCArIE9QVF9EQVRBKzE7CisJCW1lbWNweShjbGllbnRpZF9tYWNfcHRyLCBjbGllbnRfY29uZmlnLmNsaWVudF9tYWMsIDYpOworCX0KKwlpZiAoc3RyX1ZbMF0gIT0gJ1wwJykKKwkJY2xpZW50X2NvbmZpZy52ZW5kb3JjbGFzcyA9IGFsbG9jX2RoY3Bfb3B0aW9uKERIQ1BfVkVORE9SLCBzdHJfViwgMCk7CisjaWYgIUJCX01NVQorCS8qIG9uIE5PTU1VIHJlZXhlYyAoaS5lLiwgYmFja2dyb3VuZCkgZWFybHkgKi8KKwlpZiAoIShvcHQgJiBPUFRfZikpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAgLyogZmxhZ3MgKi8sIGFyZ3YpOworCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOworCX0KKyNlbmRpZgorCWlmIChvcHQgJiBPUFRfUykgeworCQlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKKwl9CisKKwkvKiBNYWtlIHN1cmUgZmQgMCwxLDIgYXJlIG9wZW4gKi8KKwliYl9zYW5pdGl6ZV9zdGRpbygpOworCS8qIEVxdWl2YWxlbnQgb2YgZG9pbmcgYSBmZmx1c2ggYWZ0ZXIgZXZlcnkgXG4gKi8KKwlzZXRsaW5lYnVmKHN0ZG91dCk7CisJLyogQ3JlYXRlIHBpZGZpbGUgKi8KKwl3cml0ZV9waWRmaWxlKGNsaWVudF9jb25maWcucGlkZmlsZSk7CisJLyogR29lcyB0byBzdGRvdXQgKHVubGVzcyBOT01NVSkgYW5kIHBvc3NpYmx5IHN5c2xvZyAqLworCWJiX2luZm9fbXNnKCIlcyAodiJCQl9WRVIiKSBzdGFydGVkIiwgYXBwbGV0X25hbWUpOworCS8qIFNldCB1cCB0aGUgc2lnbmFsIHBpcGUgKi8KKwl1ZGhjcF9zcF9zZXR1cCgpOworCS8qIFdlIHdhbnQgcmFuZG9tX3hpZCB0byBiZSByYW5kb20uLi4gKi8KKwlzcmFuZChtb25vdG9uaWNfdXMoKSk7CisKKwlzdGF0ZSA9IElOSVRfU0VMRUNUSU5HOworCXVkaGNwX3J1bl9zY3JpcHQoTlVMTCwgImRlY29uZmlnIik7CisJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9SQVcpOworCXBhY2tldF9udW0gPSAwOworCXRpbWVvdXQgPSAwOworCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisKKwkvKiBNYWluIGV2ZW50IGxvb3AuIHNlbGVjdCgpIHdhaXRzIG9uIHNpZ25hbCBwaXBlIGFuZCBwb3NzaWJseQorCSAqIG9uIHNvY2tmZC4KKwkgKiAiY29udGludWUiIHN0YXRlbWVudHMgaW4gY29kZSBiZWxvdyBqdW1wIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AuCisJICovCisJZm9yICg7OykgeworCQkvKiBzaWxlbmNlICJ1bmluaXRpYWxpemVkISIgd2FybmluZyAqLworCQl1bnNpZ25lZCB0aW1lc3RhbXBfYmVmb3JlX3dhaXQgPSB0aW1lc3RhbXBfYmVmb3JlX3dhaXQ7CisKKwkJLy9iYl9lcnJvcl9tc2coInNvY2tmZDolZCwgbGlzdGVuX21vZGU6JWQiLCBzb2NrZmQsIGxpc3Rlbl9tb2RlKTsKKworCQkvKiBXYXMgb3BlbmluZyByYXcgb3IgdWRwIHNvY2tldCBoZXJlCisJCSAqIGlmIChsaXN0ZW5fbW9kZSAhPSBMSVNURU5fTk9ORSAmJiBzb2NrZmQgPCAwKSwKKwkJICogYnV0IG9uIGZhc3QgbmV0d29yayByZW5ldyByZXNwb25zZXMgcmV0dXJuIGZhc3RlcgorCQkgKiB0aGFuIHdlIG9wZW4gc29ja2V0cy4gVGh1cyB0aGlzIGNvZGUgaXMgbW92ZWQKKwkJICogdG8gY2hhbmdlX2xpc3Rlbl9tb2RlKCkuIFRodXMgd2Ugb3BlbiBsaXN0ZW4gc29ja2V0CisJCSAqIEJFRk9SRSB3ZSBzZW5kIHJlbmV3IHJlcXVlc3QgKHNlZSAiY2FzZSBCT1VORDoiKS4gKi8KKworCQltYXhfZmQgPSB1ZGhjcF9zcF9mZF9zZXQoJnJmZHMsIHNvY2tmZCk7CisKKwkJdHYudHZfc2VjID0gdGltZW91dCAtIGFscmVhZHlfd2FpdGVkX3NlYzsKKwkJdHYudHZfdXNlYyA9IDA7CisJCXJldHZhbCA9IDA7CisJCS8qIElmIHdlIGFscmVhZHkgdGltZWQgb3V0LCBmYWxsIHRocm91Z2ggd2l0aCByZXR2YWwgPSAwLCBlbHNlLi4uICovCisJCWlmICgoaW50KXR2LnR2X3NlYyA+IDApIHsKKwkJCXRpbWVzdGFtcF9iZWZvcmVfd2FpdCA9ICh1bnNpZ25lZCltb25vdG9uaWNfc2VjKCk7CisJCQlsb2cxKCJXYWl0aW5nIG9uIHNlbGVjdC4uLiIpOworCQkJcmV0dmFsID0gc2VsZWN0KG1heF9mZCArIDEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQkvKiBFSU5UUj8gQSBzaWduYWwgd2FzIGNhdWdodCwgZG9uJ3QgcGFuaWMgKi8KKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIpIHsKKwkJCQkJYWxyZWFkeV93YWl0ZWRfc2VjICs9ICh1bnNpZ25lZCltb25vdG9uaWNfc2VjKCkgLSB0aW1lc3RhbXBfYmVmb3JlX3dhaXQ7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBFbHNlOiBhbiBlcnJvciBvY2N1cmVkLCBwYW5pYyEgKi8KKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNlbGVjdCIpOworCQkJfQorCQl9CisKKwkJLyogSWYgdGltZW91dCBkcm9wcGVkIHRvIHplcm8sIHRpbWUgdG8gYmVjb21lIGFjdGl2ZToKKwkJICogcmVzZW5kIGRpc2NvdmVyL3JlbmV3L3doYXRldmVyCisJCSAqLworCQlpZiAocmV0dmFsID09IDApIHsKKwkJCS8qIFdoZW4gcnVubmluZyBvbiBhIGJyaWRnZSwgdGhlIGlmaW5kZXggbWF5IGhhdmUgY2hhbmdlZAorCQkJICogKGUuZy4gaWYgbWVtYmVyIGludGVyZmFjZXMgd2VyZSBhZGRlZC9yZW1vdmVkCisJCQkgKiBvciBpZiB0aGUgc3RhdHVzIG9mIHRoZSBicmlkZ2UgY2hhbmdlZCkuCisJCQkgKiBSZWZyZXNoIGlmaW5kZXggYW5kIGNsaWVudF9tYWM6CisJCQkgKi8KKwkJCWlmICh1ZGhjcF9yZWFkX2ludGVyZmFjZShjbGllbnRfY29uZmlnLmludGVyZmFjZSwKKwkJCQkJJmNsaWVudF9jb25maWcuaWZpbmRleCwKKwkJCQkJTlVMTCwKKwkJCQkJY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjKQorCQkJKSB7CisJCQkJcmV0dXJuIDE7IC8qIGlmYWNlIGlzIGdvbmU/ICovCisJCQl9CisJCQlpZiAoY2xpZW50aWRfbWFjX3B0cikKKwkJCQltZW1jcHkoY2xpZW50aWRfbWFjX3B0ciwgY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjLCA2KTsKKworCQkJLyogV2Ugd2lsbCByZXN0YXJ0IHRoZSB3YWl0IGluIGFueSBjYXNlICovCisJCQlhbHJlYWR5X3dhaXRlZF9zZWMgPSAwOworCisJCQlzd2l0Y2ggKHN0YXRlKSB7CisJCQljYXNlIElOSVRfU0VMRUNUSU5HOgorCQkJCWlmIChwYWNrZXRfbnVtIDwgZGlzY292ZXJfcmV0cmllcykgeworCQkJCQlpZiAocGFja2V0X251bSA9PSAwKQorCQkJCQkJeGlkID0gcmFuZG9tX3hpZCgpOworCQkJCQkvKiBicm9hZGNhc3QgKi8KKwkJCQkJc2VuZF9kaXNjb3Zlcih4aWQsIHJlcXVlc3RlZF9pcCk7CisJCQkJCXRpbWVvdXQgPSBkaXNjb3Zlcl90aW1lb3V0OworCQkJCQlwYWNrZXRfbnVtKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyBsZWFzZWZhaWw6CisJCQkJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAibGVhc2VmYWlsIik7CisjaWYgQkJfTU1VIC8qIC1iIGlzIG5vdCBzdXBwb3J0ZWQgb24gTk9NTVUgKi8KKwkJCQlpZiAob3B0ICYgT1BUX2IpIHsgLyogYmFja2dyb3VuZCBpZiBubyBsZWFzZSAqLworCQkJCQliYl9pbmZvX21zZygiTm8gbGVhc2UsIGZvcmtpbmcgdG8gYmFja2dyb3VuZCIpOworCQkJCQljbGllbnRfYmFja2dyb3VuZCgpOworCQkJCQkvKiBkbyBub3QgYmFja2dyb3VuZCBhZ2FpbiEgKi8KKwkJCQkJb3B0ID0gKChvcHQgJiB+T1BUX2IpIHwgT1BUX2YpOworCQkJCX0gZWxzZQorI2VuZGlmCisJCQkJaWYgKG9wdCAmIE9QVF9uKSB7IC8qIGFib3J0IGlmIG5vIGxlYXNlICovCisJCQkJCWJiX2luZm9fbXNnKCJObyBsZWFzZSwgZmFpbGluZyIpOworCQkJCQlyZXR2YWwgPSAxOworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQkJLyogd2FpdCBiZWZvcmUgdHJ5aW5nIGFnYWluICovCisJCQkJdGltZW91dCA9IHRyeWFnYWluX3RpbWVvdXQ7CisJCQkJcGFja2V0X251bSA9IDA7CisJCQkJY29udGludWU7CisJCQljYXNlIFJFUVVFU1RJTkc6CisJCQkJaWYgKHBhY2tldF9udW0gPCBkaXNjb3Zlcl9yZXRyaWVzKSB7CisJCQkJCS8qIHNlbmQgYnJvYWRjYXN0IHNlbGVjdCBwYWNrZXQgKi8KKwkJCQkJc2VuZF9zZWxlY3QoeGlkLCBzZXJ2ZXJfYWRkciwgcmVxdWVzdGVkX2lwKTsKKwkJCQkJdGltZW91dCA9IGRpc2NvdmVyX3RpbWVvdXQ7CisJCQkJCXBhY2tldF9udW0rKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIFRpbWVkIG91dCwgZ28gYmFjayB0byBpbml0IHN0YXRlLgorCQkJCSAqICJkaXNjb3Zlci4uLnNlbGVjdC4uLmRpc2NvdmVyLi4uIiBsb29wcworCQkJCSAqIHdlcmUgc2VlbiBpbiB0aGUgd2lsZC4gVHJlYXQgdGhlbSBzaW1pbGFybHkKKwkJCQkgKiB0byAibm8gcmVzcG9uc2UgdG8gZGlzY292ZXIiIGNhc2UgKi8KKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCQkJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwkJCQlnb3RvIGxlYXNlZmFpbDsKKwkJCWNhc2UgQk9VTkQ6CisJCQkJLyogMS8yIGxlYXNlIHBhc3NlZCwgZW50ZXIgcmVuZXdpbmcgc3RhdGUgKi8KKwkJCQlzdGF0ZSA9IFJFTkVXSU5HOworCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX0tFUk5FTCk7CisJCQkJbG9nMSgiRW50ZXJpbmcgcmVuZXcgc3RhdGUiKTsKKwkJCQkvKiBmYWxsIHJpZ2h0IHRocm91Z2ggKi8KKwkJCWNhc2UgUkVORVdfUkVRVUVTVEVEOiAvKiBtYW51YWwgKFNJR1VTUjEpIHJlbmV3ICovCisJCQljYXNlX1JFTkVXX1JFUVVFU1RFRDoKKwkJCWNhc2UgUkVORVdJTkc6CisJCQkJaWYgKHRpbWVvdXQgPiA2MCkgeworCQkJCQkvKiBzZW5kIGFuIHVuaWNhc3QgcmVuZXcgcmVxdWVzdCAqLworCQkJLyogU29tZXRpbWVzIG9ic2VydmVkIHRvIGZhaWwgKEVBRERSTk9UQVZBSUwpIHRvIGJpbmQKKwkJCSAqIGEgbmV3IFVEUCBzb2NrZXQgZm9yIHNlbmRpbmcgaW5zaWRlIHNlbmRfcmVuZXcuCisJCQkgKiBJIGhhemFyZCB0byBndWVzcyBleGlzdGluZyBsaXN0ZW5pbmcgc29ja2V0CisJCQkgKiBpcyBzb21laG93IGNvbmZsaWN0aW5nIHdpdGggaXQsIGJ1dCB3aHkgaXMgaXQKKwkJCSAqIG5vdCBkZXRlcm1pbmlzdGljIHRoZW4/ISBTdHJhbmdlLgorCQkJICogQW55d2F5LCBpdCBkb2VzIHJlY292ZXIgYnkgZXZlbnR1YWxseSBmYWlsaW5nIHRocm91Z2gKKwkJCSAqIGludG8gSU5JVF9TRUxFQ1RJTkcgc3RhdGUuCisJCQkgKi8KKwkJCQkJc2VuZF9yZW5ldyh4aWQsIHNlcnZlcl9hZGRyLCByZXF1ZXN0ZWRfaXApOworCQkJCQl0aW1lb3V0ID4+PSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogVGltZWQgb3V0LCBlbnRlciByZWJpbmRpbmcgc3RhdGUgKi8KKwkJCQlsb2cxKCJFbnRlcmluZyByZWJpbmRpbmcgc3RhdGUiKTsKKwkJCQlzdGF0ZSA9IFJFQklORElORzsKKwkJCQkvKiBmYWxsIHJpZ2h0IHRocm91Z2ggKi8KKwkJCWNhc2UgUkVCSU5ESU5HOgorCQkJCS8qIFN3aXRjaCB0byBiY2FzdCByZWNlaXZlICovCisJCQkJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9SQVcpOworCQkJCS8qIExlYXNlIGlzICpyZWFsbHkqIGFib3V0IHRvIHJ1biBvdXQsCisJCQkJICogdHJ5IHRvIGZpbmQgREhDUCBzZXJ2ZXIgdXNpbmcgYnJvYWRjYXN0ICovCisJCQkJaWYgKHRpbWVvdXQgPiAwKSB7CisJCQkJCS8qIHNlbmQgYSBicm9hZGNhc3QgcmVuZXcgcmVxdWVzdCAqLworCQkJCQlzZW5kX3JlbmV3KHhpZCwgMCAvKklOQUREUl9BTlkqLywgcmVxdWVzdGVkX2lwKTsKKwkJCQkJdGltZW91dCA+Pj0gMTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIFRpbWVkIG91dCwgZW50ZXIgaW5pdCBzdGF0ZSAqLworCQkJCWJiX2luZm9fbXNnKCJMZWFzZSBsb3N0LCBlbnRlcmluZyBpbml0IHN0YXRlIik7CisJCQkJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKwkJCQlzdGF0ZSA9IElOSVRfU0VMRUNUSU5HOworCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQkvKnRpbWVvdXQgPSAwOyAtIGFscmVhZHkgaXMgKi8KKwkJCQlwYWNrZXRfbnVtID0gMDsKKwkJCQljb250aW51ZTsKKwkJCS8qIGNhc2UgUkVMRUFTRUQ6ICovCisJCQl9CisJCQkvKiB5YWgsIEkga25vdywgKnlvdSogc2F5IGl0IHdvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJdGltZW91dCA9IElOVF9NQVg7CisJCQljb250aW51ZTsgLyogYmFjayB0byBtYWluIGxvb3AgKi8KKwkJfSAvKiBpZiBzZWxlY3QgdGltZWQgb3V0ICovCisKKwkJLyogc2VsZWN0KCkgZGlkbid0IHRpbWVvdXQsIHNvbWV0aGluZyBoYXBwZW5lZCAqLworCisJCS8qIElzIGl0IGEgc2lnbmFsPyAqLworCQkvKiBub3RlOiB1ZGhjcF9zcF9yZWFkIGNoZWNrcyBGRF9JU1NFVCBiZWZvcmUgcmVhZGluZyAqLworCQlzd2l0Y2ggKHVkaGNwX3NwX3JlYWQoJnJmZHMpKSB7CisJCWNhc2UgU0lHVVNSMToKKwkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCXBlcmZvcm1fcmVuZXcoKTsKKwkJCWlmIChzdGF0ZSA9PSBSRU5FV19SRVFVRVNURUQpCisJCQkJZ290byBjYXNlX1JFTkVXX1JFUVVFU1RFRDsKKwkJCS8qIFN0YXJ0IHRoaW5ncyBvdmVyICovCisJCQlwYWNrZXRfbnVtID0gMDsKKwkJCS8qIEtpbGwgYW55IHRpbWVvdXRzLCB1c2VyIHdhbnRzIHRoaXMgdG8gaHVycnkgYWxvbmcgKi8KKwkJCXRpbWVvdXQgPSAwOworCQkJY29udGludWU7CisJCWNhc2UgU0lHVVNSMjoKKwkJCXBlcmZvcm1fcmVsZWFzZShyZXF1ZXN0ZWRfaXAsIHNlcnZlcl9hZGRyKTsKKwkJCXRpbWVvdXQgPSBJTlRfTUFYOworCQkJY29udGludWU7CisJCWNhc2UgU0lHVEVSTToKKwkJCWJiX2luZm9fbXNnKCJSZWNlaXZlZCBTSUdURVJNIik7CisJCQlpZiAob3B0ICYgT1BUX1IpIC8qIHJlbGVhc2Ugb24gcXVpdCAqLworCQkJCXBlcmZvcm1fcmVsZWFzZShyZXF1ZXN0ZWRfaXAsIHNlcnZlcl9hZGRyKTsKKwkJCWdvdG8gcmV0MDsKKwkJfQorCisJCS8qIElzIGl0IGEgcGFja2V0PyAqLworCQlpZiAobGlzdGVuX21vZGUgPT0gTElTVEVOX05PTkUgfHwgIUZEX0lTU0VUKHNvY2tmZCwgJnJmZHMpKQorCQkJY29udGludWU7IC8qIG5vICovCisKKwkJeworCQkJaW50IGxlbjsKKworCQkJLyogQSBwYWNrZXQgaXMgcmVhZHksIHJlYWQgaXQgKi8KKwkJCWlmIChsaXN0ZW5fbW9kZSA9PSBMSVNURU5fS0VSTkVMKQorCQkJCWxlbiA9IHVkaGNwX3JlY3Zfa2VybmVsX3BhY2tldCgmcGFja2V0LCBzb2NrZmQpOworCQkJZWxzZQorCQkJCWxlbiA9IHVkaGNwX3JlY3ZfcmF3X3BhY2tldCgmcGFja2V0LCBzb2NrZmQpOworCQkJaWYgKGxlbiA9PSAtMSkgeworCQkJCS8qIEVycm9yIGlzIHNldmVyZSwgcmVvcGVuIHNvY2tldCAqLworCQkJCWJiX2luZm9fbXNnKCJSZWFkIGVycm9yOiAlcywgcmVvcGVuaW5nIHNvY2tldCIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJc2xlZXAoZGlzY292ZXJfdGltZW91dCk7IC8qIDMgc2Vjb25kcyBieSBkZWZhdWx0ICovCisJCQkJY2hhbmdlX2xpc3Rlbl9tb2RlKGxpc3Rlbl9tb2RlKTsgLyoganVzdCBjbG9zZSBhbmQgcmVvcGVuICovCisJCQl9CisJCQkvKiBJZiB0aGlzIHBhY2tldCB3aWxsIHR1cm4gb3V0IHRvIGJlIHVucmVsYXRlZC9ib2d1cywKKwkJCSAqIHdlIHdpbGwgZ28gYmFjayBhbmQgd2FpdCBmb3IgbmV4dCBvbmUuCisJCQkgKiBCZSBzdXJlIHRpbWVvdXQgaXMgcHJvcGVybHkgZGVjcmVhc2VkLiAqLworCQkJYWxyZWFkeV93YWl0ZWRfc2VjICs9ICh1bnNpZ25lZCltb25vdG9uaWNfc2VjKCkgLSB0aW1lc3RhbXBfYmVmb3JlX3dhaXQ7CisJCQlpZiAobGVuIDwgMCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwYWNrZXQueGlkICE9IHhpZCkgeworCQkJbG9nMSgieGlkICV4IChvdXIgaXMgJXgpLCBpZ25vcmluZyBwYWNrZXQiLAorCQkJCSh1bnNpZ25lZClwYWNrZXQueGlkLCAodW5zaWduZWQpeGlkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogSWdub3JlIHBhY2tldHMgdGhhdCBhcmVuJ3QgZm9yIHVzICovCisJCWlmIChwYWNrZXQuaGxlbiAhPSA2CisJCSB8fCBtZW1jbXAocGFja2V0LmNoYWRkciwgY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjLCA2KSAhPSAwCisJCSkgeworLy9GSVhNRTogbmVlZCB0byBhbHNvIGNoZWNrIHRoYXQgbGFzdCAxMCBieXRlcyBhcmUgemVybworCQkJbG9nMSgiY2hhZGRyIGRvZXMgbm90IG1hdGNoLCBpZ25vcmluZyBwYWNrZXQiKTsgLy8gbG9nMj8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWVzc2FnZSA9IHVkaGNwX2dldF9vcHRpb24oJnBhY2tldCwgREhDUF9NRVNTQUdFX1RZUEUpOworCQlpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisJCQliYl9lcnJvcl9tc2coIm5vIG1lc3NhZ2UgdHlwZSBvcHRpb24sIGlnbm9yaW5nIHBhY2tldCIpOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgSU5JVF9TRUxFQ1RJTkc6CisJCQkvKiBNdXN0IGJlIGEgREhDUE9GRkVSIHRvIG9uZSBvZiBvdXIgeGlkJ3MgKi8KKwkJCWlmICgqbWVzc2FnZSA9PSBESENQT0ZGRVIpIHsKKwkJLyogVE9ETzogd2h5IHdlIGRvbid0IGp1c3QgZmV0Y2ggc2VydmVyJ3MgSVAgZnJvbSBJUCBoZWFkZXI/ICovCisJCQkJdGVtcCA9IHVkaGNwX2dldF9vcHRpb24oJnBhY2tldCwgREhDUF9TRVJWRVJfSUQpOworCQkJCWlmICghdGVtcCkgeworCQkJCQliYl9lcnJvcl9tc2coIm5vIHNlcnZlciBJRCwgaWdub3JpbmcgcGFja2V0Iik7CisJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBzdGlsbCBzZWxlY3RpbmcgLSB0aGlzIHNlcnZlciBsb29rcyBiYWQgKi8KKwkJCQl9CisJCQkJLyogaXQgSVMgdW5hbGlnbmVkIHNvbWV0aW1lcywgZG9uJ3QgIm9wdGltaXplIiAqLworCQkJCW1vdmVfZnJvbV91bmFsaWduZWQzMihzZXJ2ZXJfYWRkciwgdGVtcCk7CisJCQkJLyp4aWQgPSBwYWNrZXQueGlkOyAtIGFscmVhZHkgaXMgKi8KKwkJCQlyZXF1ZXN0ZWRfaXAgPSBwYWNrZXQueWlhZGRyOworCisJCQkJLyogZW50ZXIgcmVxdWVzdGluZyBzdGF0ZSAqLworCQkJCXN0YXRlID0gUkVRVUVTVElORzsKKwkJCQl0aW1lb3V0ID0gMDsKKwkJCQlwYWNrZXRfbnVtID0gMDsKKwkJCQlhbHJlYWR5X3dhaXRlZF9zZWMgPSAwOworCQkJfQorCQkJY29udGludWU7CisJCWNhc2UgUkVRVUVTVElORzoKKwkJY2FzZSBSRU5FV0lORzoKKwkJY2FzZSBSRU5FV19SRVFVRVNURUQ6CisJCWNhc2UgUkVCSU5ESU5HOgorCQkJaWYgKCptZXNzYWdlID09IERIQ1BBQ0spIHsKKwkJCQl0ZW1wID0gdWRoY3BfZ2V0X29wdGlvbigmcGFja2V0LCBESENQX0xFQVNFX1RJTUUpOworCQkJCWlmICghdGVtcCkgeworCQkJCQliYl9lcnJvcl9tc2coIm5vIGxlYXNlIHRpbWUgd2l0aCBBQ0ssIHVzaW5nIDEgaG91ciBsZWFzZSIpOworCQkJCQlsZWFzZV9zZWNvbmRzID0gNjAgKiA2MDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBpdCBJUyB1bmFsaWduZWQgc29tZXRpbWVzLCBkb24ndCAib3B0aW1pemUiICovCisJCQkJCW1vdmVfZnJvbV91bmFsaWduZWQzMihsZWFzZV9zZWNvbmRzLCB0ZW1wKTsKKwkJCQkJbGVhc2Vfc2Vjb25kcyA9IG50b2hsKGxlYXNlX3NlY29uZHMpOworCQkJCQlsZWFzZV9zZWNvbmRzICY9IDB4MGZmZmZmZmY7IC8qIHBhcmFub2lhOiBtdXN0IG5vdCBiZSBwcm9uZSB0byBvdmVyZmxvd3MgKi8KKwkJCQkJaWYgKGxlYXNlX3NlY29uZHMgPCAxMCkgLyogYW5kIG5vdCB0b28gc21hbGwgKi8KKwkJCQkJCWxlYXNlX3NlY29uZHMgPSAxMDsKKwkJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BDX0FSUElORworCQkJCWlmIChvcHQgJiBPUFRfYSkgeworLyogUkZDIDIxMzEgMy4xIHBhcmFncmFwaCA1OgorICogIlRoZSBjbGllbnQgcmVjZWl2ZXMgdGhlIERIQ1BBQ0sgbWVzc2FnZSB3aXRoIGNvbmZpZ3VyYXRpb24KKyAqIHBhcmFtZXRlcnMuIFRoZSBjbGllbnQgU0hPVUxEIHBlcmZvcm0gYSBmaW5hbCBjaGVjayBvbiB0aGUKKyAqIHBhcmFtZXRlcnMgKGUuZy4sIEFSUCBmb3IgYWxsb2NhdGVkIG5ldHdvcmsgYWRkcmVzcyksIGFuZCBub3RlcworICogdGhlIGR1cmF0aW9uIG9mIHRoZSBsZWFzZSBzcGVjaWZpZWQgaW4gdGhlIERIQ1BBQ0sgbWVzc2FnZS4gQXQgdGhpcworICogcG9pbnQsIHRoZSBjbGllbnQgaXMgY29uZmlndXJlZC4gSWYgdGhlIGNsaWVudCBkZXRlY3RzIHRoYXQgdGhlCisgKiBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlIChlLmcuLCB0aHJvdWdoIHRoZSB1c2Ugb2YgQVJQKSwKKyAqIHRoZSBjbGllbnQgTVVTVCBzZW5kIGEgREhDUERFQ0xJTkUgbWVzc2FnZSB0byB0aGUgc2VydmVyIGFuZCByZXN0YXJ0cworICogdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4uLiIgKi8KKwkJCQkJaWYgKCFhcnBwaW5nKHBhY2tldC55aWFkZHIsCisJCQkJCQkJTlVMTCwKKwkJCQkJCQkodWludDMyX3QpIDAsCisJCQkJCQkJY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjLAorCQkJCQkJCWNsaWVudF9jb25maWcuaW50ZXJmYWNlKQorCQkJCQkpIHsKKwkJCQkJCWJiX2luZm9fbXNnKCJPZmZlcmVkIGFkZHJlc3MgaXMgaW4gdXNlICIKKwkJCQkJCQkiKGdvdCBBUlAgcmVwbHkpLCBkZWNsaW5pbmciKTsKKwkJCQkJCXNlbmRfZGVjbGluZSh4aWQsIHNlcnZlcl9hZGRyLCBwYWNrZXQueWlhZGRyKTsKKworCQkJCQkJaWYgKHN0YXRlICE9IFJFUVVFU1RJTkcpCisJCQkJCQkJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKwkJCQkJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fUkFXKTsKKwkJCQkJCXN0YXRlID0gSU5JVF9TRUxFQ1RJTkc7CisJCQkJCQljbGllbnRfY29uZmlnLmZpcnN0X3NlY3MgPSAwOyAvKiBtYWtlIHNlY3MgZmllbGQgY291bnQgZnJvbSAwICovCisJCQkJCQlyZXF1ZXN0ZWRfaXAgPSAwOworCQkJCQkJdGltZW91dCA9IHRyeWFnYWluX3RpbWVvdXQ7CisJCQkJCQlwYWNrZXRfbnVtID0gMDsKKwkJCQkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisJCQkJCQljb250aW51ZTsgLyogYmFjayB0byBtYWluIGxvb3AgKi8KKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJCS8qIGVudGVyIGJvdW5kIHN0YXRlICovCisJCQkJdGltZW91dCA9IGxlYXNlX3NlY29uZHMgLyAyOworCQkJCXsKKwkJCQkJc3RydWN0IGluX2FkZHIgdGVtcF9hZGRyOworCQkJCQl0ZW1wX2FkZHIuc19hZGRyID0gcGFja2V0LnlpYWRkcjsKKwkJCQkJYmJfaW5mb19tc2coIkxlYXNlIG9mICVzIG9idGFpbmVkLCBsZWFzZSB0aW1lICV1IiwKKwkJCQkJCWluZXRfbnRvYSh0ZW1wX2FkZHIpLCAodW5zaWduZWQpbGVhc2Vfc2Vjb25kcyk7CisJCQkJfQorCQkJCXJlcXVlc3RlZF9pcCA9IHBhY2tldC55aWFkZHI7CisJCQkJdWRoY3BfcnVuX3NjcmlwdCgmcGFja2V0LCBzdGF0ZSA9PSBSRVFVRVNUSU5HID8gImJvdW5kIiA6ICJyZW5ldyIpOworCisJCQkJc3RhdGUgPSBCT1VORDsKKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX05PTkUpOworCQkJCWlmIChvcHQgJiBPUFRfcSkgeyAvKiBxdWl0IGFmdGVyIGxlYXNlICovCisJCQkJCWlmIChvcHQgJiBPUFRfUikgLyogcmVsZWFzZSBvbiBxdWl0ICovCisJCQkJCQlwZXJmb3JtX3JlbGVhc2UocmVxdWVzdGVkX2lwLCBzZXJ2ZXJfYWRkcik7CisJCQkJCWdvdG8gcmV0MDsKKwkJCQl9CisJCQkJLyogZnV0dXJlIHJlbmV3IGZhaWx1cmVzIHNob3VsZCBub3QgZXhpdCAoSk0pICovCisJCQkJb3B0ICY9IH5PUFRfbjsKKyNpZiBCQl9NTVUgLyogTk9NTVUgY2FzZSBiYWNrZ3JvdW5kZWQgZWFybGllciAqLworCQkJCWlmICghKG9wdCAmIE9QVF9mKSkgeworCQkJCQljbGllbnRfYmFja2dyb3VuZCgpOworCQkJCQkvKiBkbyBub3QgYmFja2dyb3VuZCBhZ2FpbiEgKi8KKwkJCQkJb3B0ID0gKChvcHQgJiB+T1BUX2IpIHwgT1BUX2YpOworCQkJCX0KKyNlbmRpZgorCQkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisJCQkJY29udGludWU7IC8qIGJhY2sgdG8gbWFpbiBsb29wICovCisJCQl9CisJCQlpZiAoKm1lc3NhZ2UgPT0gREhDUE5BSykgeworCQkJCS8qIHJldHVybiB0byBpbml0IHN0YXRlICovCisJCQkJYmJfaW5mb19tc2coIlJlY2VpdmVkIERIQ1AgTkFLIik7CisJCQkJdWRoY3BfcnVuX3NjcmlwdCgmcGFja2V0LCAibmFrIik7CisJCQkJaWYgKHN0YXRlICE9IFJFUVVFU1RJTkcpCisJCQkJCXVkaGNwX3J1bl9zY3JpcHQoTlVMTCwgImRlY29uZmlnIik7CisJCQkJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9SQVcpOworCQkJCXNsZWVwKDMpOyAvKiBhdm9pZCBleGNlc3NpdmUgbmV0d29yayB0cmFmZmljICovCisJCQkJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwkJCQljbGllbnRfY29uZmlnLmZpcnN0X3NlY3MgPSAwOyAvKiBtYWtlIHNlY3MgZmllbGQgY291bnQgZnJvbSAwICovCisJCQkJcmVxdWVzdGVkX2lwID0gMDsKKwkJCQl0aW1lb3V0ID0gMDsKKwkJCQlwYWNrZXRfbnVtID0gMDsKKwkJCQlhbHJlYWR5X3dhaXRlZF9zZWMgPSAwOworCQkJfQorCQkJY29udGludWU7CisJCS8qIGNhc2UgQk9VTkQ6IC0gaWdub3JlIGFsbCBwYWNrZXRzICovCisJCS8qIGNhc2UgUkVMRUFTRUQ6IC0gaWdub3JlIGFsbCBwYWNrZXRzICovCisJCX0KKwkJLyogYmFjayB0byBtYWluIGxvb3AgKi8KKwl9IC8qIGZvciAoOzspIC0gbWFpbiBsb29wIGVuZHMgKi8KKworIHJldDA6CisJcmV0dmFsID0gMDsKKyByZXQ6CisJLyppZiAoY2xpZW50X2NvbmZpZy5waWRmaWxlKSAtIHJlbW92ZV9waWRmaWxlIGhhcyBpdHMgb3duIGNoZWNrICovCisJCXJlbW92ZV9waWRmaWxlKGNsaWVudF9jb25maWcucGlkZmlsZSk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuaCBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM1OTkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgVURIQ1BfREhDUENfSAorI2RlZmluZSBVREhDUF9ESENQQ19IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK3N0cnVjdCBjbGllbnRfY29uZmlnX3QgeworCXVpbnQ4X3QgY2xpZW50X21hY1s2XTsgICAgICAgICAgLyogT3VyIG1hYyBhZGRyZXNzICovCisJY2hhciBub19kZWZhdWx0X29wdGlvbnM7ICAgICAgICAvKiBEbyBub3QgaW5jbHVkZSBkZWZhdWx0IG9wdGlvbnMgaW4gcmVxdWVzdCAqLworCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCh1aW50MTZfdCBwb3J0OykKKwlpbnQgaWZpbmRleDsgICAgICAgICAgICAgICAgICAgIC8qIEluZGV4IG51bWJlciBvZiB0aGUgaW50ZXJmYWNlIHRvIHVzZSAqLworCXVpbnQ4X3Qgb3B0X21hc2tbMjU2IC8gOF07ICAgICAgLyogQml0bWFzayBvZiBvcHRpb25zIHRvIHNlbmQgKC1PIG9wdGlvbikgKi8KKwljb25zdCBjaGFyICppbnRlcmZhY2U7ICAgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdG8gdXNlICovCisJY2hhciAqcGlkZmlsZTsgICAgICAgICAgICAgICAgICAvKiBPcHRpb25hbGx5IHN0b3JlIHRoZSBwcm9jZXNzIElEICovCisJY29uc3QgY2hhciAqc2NyaXB0OyAgICAgICAgICAgICAvKiBVc2VyIHNjcmlwdCB0byBydW4gYXQgZGhjcCBldmVudHMgKi8KKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqb3B0aW9uczsgICAgIC8qIGxpc3Qgb2YgREhDUCBvcHRpb25zIHRvIHNlbmQgdG8gc2VydmVyICovCisJdWludDhfdCAqY2xpZW50aWQ7ICAgICAgICAgICAgICAvKiBPcHRpb25hbCBjbGllbnQgaWQgdG8gdXNlICovCisJdWludDhfdCAqdmVuZG9yY2xhc3M7ICAgICAgICAgICAvKiBPcHRpb25hbCB2ZW5kb3IgY2xhc3MtaWQgdG8gdXNlICovCisJdWludDhfdCAqaG9zdG5hbWU7ICAgICAgICAgICAgICAvKiBPcHRpb25hbCBob3N0bmFtZSB0byB1c2UgKi8KKwl1aW50OF90ICpmcWRuOyAgICAgICAgICAgICAgICAgIC8qIE9wdGlvbmFsIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSB0byB1c2UgKi8KKworCXVpbnQxNl90IGZpcnN0X3NlY3M7CisJdWludDE2X3QgbGFzdF9zZWNzOworfSBGSVhfQUxJQVNJTkc7CisKKy8qIHNlcnZlcl9jb25maWcgc2l0cyBpbiAxc3QgaGFsZiBvZiBiYl9jb21tb25fYnVmc2l6MSAqLworI2RlZmluZSBjbGllbnRfY29uZmlnICgqKHN0cnVjdCBjbGllbnRfY29uZmlnX3QqKSgmYmJfY29tbW9uX2J1ZnNpejFbQ09NTU9OX0JVRlNJWkUgLyAyXSkpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9QT1JUCisjZGVmaW5lIENMSUVOVF9QT1JUIChjbGllbnRfY29uZmlnLnBvcnQpCisjZWxzZQorI2RlZmluZSBDTElFTlRfUE9SVCA2OAorI2VuZGlmCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9kaGNwZC5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9kaGNwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzQ3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2RoY3BkLmMKQEAgLTAsMCArMSw2NjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHVkaGNwIHNlcnZlcgorICogQ29weXJpZ2h0IChDKSAxOTk5IE1hdHRoZXcgUmFtc2F5IDxtYXR0aGV3ckBtb3JldG9uLmNvbS5hdT4KKyAqCQkJQ2hyaXMgVHJldyA8Y3RyZXdAbW9yZXRvbi5jb20uYXU+CisgKgorICogUmV3cml0ZSBieSBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PiBKdWx5IDIwMDEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdWRoY3BkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWZTXSIgSUZfRkVBVFVSRV9VREhDUF9QT1JUKCIgWy1QIE5dIikgIiBbQ09ORkZJTEVdIgorLy91c2FnZTojZGVmaW5lIHVkaGNwZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRIQ1Agc2VydmVyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktUwlMb2cgdG8gc3lzbG9nIHRvbyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgKKy8vdXNhZ2U6ICAgICAiXG4JLVAgTglVc2UgcG9ydCBOIChkZWZhdWx0IDY3KSIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BjLmgiCisjaW5jbHVkZSAiZGhjcGQuaCIKKworCisvKiBTZW5kIGEgcGFja2V0IHRvIGEgc3BlY2lmaWMgbWFjIGFkZHJlc3MgYW5kIGlwIGFkZHJlc3MgYnkgY3JlYXRpbmcgb3VyIG93biBpcCBwYWNrZXQgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0X3RvX2NsaWVudChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LCBpbnQgZm9yY2VfYnJvYWRjYXN0KQoreworCWNvbnN0IHVpbnQ4X3QgKmNoYWRkcjsKKwl1aW50MzJfdCBjaWFkZHI7CisKKwkvLyBXYXM6CisJLy9pZiAoZm9yY2VfYnJvYWRjYXN0KSB7IC8qIGJyb2FkY2FzdCAqLyB9CisJLy9lbHNlIGlmIChkaGNwX3BrdC0+Y2lhZGRyKSB7IC8qIHVuaWNhc3QgdG8gZGhjcF9wa3QtPmNpYWRkciAqLyB9CisJLy9lbHNlIGlmIChkaGNwX3BrdC0+ZmxhZ3MgJiBodG9ucyhCUk9BRENBU1RfRkxBRykpIHsgLyogYnJvYWRjYXN0ICovIH0KKwkvL2Vsc2UgeyAvKiB1bmljYXN0IHRvIGRoY3BfcGt0LT55aWFkZHIgKi8gfQorCS8vIEJ1dCB0aGlzIGlzIHdyb25nOiB5aWFkZHIgaXMgX291cl8gaWRlYSB3aGF0IGNsaWVudCdzIElQIGlzCisJLy8gKGZvciBleGFtcGxlLCBmcm9tIGxlYXNlIGZpbGUpLiBDbGllbnQgbWF5IG5vdCBrbm93IHRoYXQsCisJLy8gYW5kIG1heSBub3QgaGF2ZSBVRFAgc29ja2V0IGxpc3RlbmluZyBvbiB0aGF0IElQIQorCS8vIFdlIHNob3VsZCBuZXZlciB1bmljYXN0IHRvIGRoY3BfcGt0LT55aWFkZHIhCisJLy8gZGhjcF9wa3QtPmNpYWRkciwgT1RPSCwgY29tZXMgZnJvbSBjbGllbnQncyByZXF1ZXN0IHBhY2tldCwKKwkvLyBhbmQgY2FuIGJlIHVzZWQuCisKKwlpZiAoZm9yY2VfYnJvYWRjYXN0CisJIHx8IChkaGNwX3BrdC0+ZmxhZ3MgJiBodG9ucyhCUk9BRENBU1RfRkxBRykpCisJIHx8IGRoY3BfcGt0LT5jaWFkZHIgPT0gMAorCSkgeworCQlsb2cxKCJCcm9hZGNhc3RpbmcgcGFja2V0IHRvIGNsaWVudCIpOworCQljaWFkZHIgPSBJTkFERFJfQlJPQURDQVNUOworCQljaGFkZHIgPSBNQUNfQkNBU1RfQUREUjsKKwl9IGVsc2UgeworCQlsb2cxKCJVbmljYXN0aW5nIHBhY2tldCB0byBjbGllbnQgY2lhZGRyIik7CisJCWNpYWRkciA9IGRoY3BfcGt0LT5jaWFkZHI7CisJCWNoYWRkciA9IGRoY3BfcGt0LT5jaGFkZHI7CisJfQorCisJdWRoY3Bfc2VuZF9yYXdfcGFja2V0KGRoY3BfcGt0LAorCQkvKnNyYyovIHNlcnZlcl9jb25maWcuc2VydmVyX25pcCwgU0VSVkVSX1BPUlQsCisJCS8qZHN0Ki8gY2lhZGRyLCBDTElFTlRfUE9SVCwgY2hhZGRyLAorCQlzZXJ2ZXJfY29uZmlnLmlmaW5kZXgpOworfQorCisvKiBTZW5kIGEgcGFja2V0IHRvIGdhdGV3YXlfbmlwIHVzaW5nIHRoZSBrZXJuZWwgaXAgc3RhY2sgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0X3RvX3JlbGF5KHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcF9wa3QpCit7CisJbG9nMSgiRm9yd2FyZGluZyBwYWNrZXQgdG8gcmVsYXkiKTsKKworCXVkaGNwX3NlbmRfa2VybmVsX3BhY2tldChkaGNwX3BrdCwKKwkJCXNlcnZlcl9jb25maWcuc2VydmVyX25pcCwgU0VSVkVSX1BPUlQsCisJCQlkaGNwX3BrdC0+Z2F0ZXdheV9uaXAsIFNFUlZFUl9QT1JUKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwX3BrdCwgaW50IGZvcmNlX2Jyb2FkY2FzdCkKK3sKKwlpZiAoZGhjcF9wa3QtPmdhdGV3YXlfbmlwKQorCQlzZW5kX3BhY2tldF90b19yZWxheShkaGNwX3BrdCk7CisJZWxzZQorCQlzZW5kX3BhY2tldF90b19jbGllbnQoZGhjcF9wa3QsIGZvcmNlX2Jyb2FkY2FzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBzdHJ1Y3QgZGhjcF9wYWNrZXQgKm9sZHBhY2tldCwgY2hhciB0eXBlKQoreworCS8qIFNldHMgb3AsIGh0eXBlLCBobGVuLCBjb29raWUgZmllbGRzCisJICogYW5kIGFkZHMgREhDUF9NRVNTQUdFX1RZUEUgb3B0aW9uICovCisJdWRoY3BfaW5pdF9oZWFkZXIocGFja2V0LCB0eXBlKTsKKworCXBhY2tldC0+eGlkID0gb2xkcGFja2V0LT54aWQ7CisJbWVtY3B5KHBhY2tldC0+Y2hhZGRyLCBvbGRwYWNrZXQtPmNoYWRkciwgc2l6ZW9mKG9sZHBhY2tldC0+Y2hhZGRyKSk7CisJcGFja2V0LT5mbGFncyA9IG9sZHBhY2tldC0+ZmxhZ3M7CisJcGFja2V0LT5nYXRld2F5X25pcCA9IG9sZHBhY2tldC0+Z2F0ZXdheV9uaXA7CisJcGFja2V0LT5jaWFkZHIgPSBvbGRwYWNrZXQtPmNpYWRkcjsKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbihwYWNrZXQsIERIQ1BfU0VSVkVSX0lELCBzZXJ2ZXJfY29uZmlnLnNlcnZlcl9uaXApOworfQorCisvKiBGaWxsIG9wdGlvbnMgZmllbGQsIHNpYWRkcl9uaXAsIGFuZCBzbmFtZSBhbmQgYm9vdF9maWxlIGZpZWxkcy4KKyAqIFRPRE86IHRlYWNoIHRoaXMgY29kZSB0byB1c2Ugb3ZlcmxvYWQgb3B0aW9uLgorICovCitzdGF0aWMgdm9pZCBhZGRfc2VydmVyX29wdGlvbnMoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQpCit7CisJc3RydWN0IG9wdGlvbl9zZXQgKmN1cnIgPSBzZXJ2ZXJfY29uZmlnLm9wdGlvbnM7CisKKwl3aGlsZSAoY3VycikgeworCQlpZiAoY3Vyci0+ZGF0YVtPUFRfQ09ERV0gIT0gREhDUF9MRUFTRV9USU1FKQorCQkJdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24ocGFja2V0LCBjdXJyLT5kYXRhKTsKKwkJY3VyciA9IGN1cnItPm5leHQ7CisJfQorCisJcGFja2V0LT5zaWFkZHJfbmlwID0gc2VydmVyX2NvbmZpZy5zaWFkZHJfbmlwOworCisJaWYgKHNlcnZlcl9jb25maWcuc25hbWUpCisJCXN0cm5jcHkoKGNoYXIqKXBhY2tldC0+c25hbWUsIHNlcnZlcl9jb25maWcuc25hbWUsIHNpemVvZihwYWNrZXQtPnNuYW1lKSAtIDEpOworCWlmIChzZXJ2ZXJfY29uZmlnLmJvb3RfZmlsZSkKKwkJc3RybmNweSgoY2hhciopcGFja2V0LT5maWxlLCBzZXJ2ZXJfY29uZmlnLmJvb3RfZmlsZSwgc2l6ZW9mKHBhY2tldC0+ZmlsZSkgLSAxKTsKK30KKworc3RhdGljIHVpbnQzMl90IHNlbGVjdF9sZWFzZV90aW1lKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KQoreworCXVpbnQzMl90IGxlYXNlX3RpbWVfc2VjID0gc2VydmVyX2NvbmZpZy5tYXhfbGVhc2Vfc2VjOworCXVpbnQ4X3QgKmxlYXNlX3RpbWVfb3B0ID0gdWRoY3BfZ2V0X29wdGlvbihwYWNrZXQsIERIQ1BfTEVBU0VfVElNRSk7CisJaWYgKGxlYXNlX3RpbWVfb3B0KSB7CisJCW1vdmVfZnJvbV91bmFsaWduZWQzMihsZWFzZV90aW1lX3NlYywgbGVhc2VfdGltZV9vcHQpOworCQlsZWFzZV90aW1lX3NlYyA9IG50b2hsKGxlYXNlX3RpbWVfc2VjKTsKKwkJaWYgKGxlYXNlX3RpbWVfc2VjID4gc2VydmVyX2NvbmZpZy5tYXhfbGVhc2Vfc2VjKQorCQkJbGVhc2VfdGltZV9zZWMgPSBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZV9zZWM7CisJCWlmIChsZWFzZV90aW1lX3NlYyA8IHNlcnZlcl9jb25maWcubWluX2xlYXNlX3NlYykKKwkJCWxlYXNlX3RpbWVfc2VjID0gc2VydmVyX2NvbmZpZy5taW5fbGVhc2Vfc2VjOworCX0KKwlyZXR1cm4gbGVhc2VfdGltZV9zZWM7Cit9CisKKy8qIFdlIGdvdCBhIERIQ1AgRElTQ09WRVIuIFNlbmQgYW4gT0ZGRVIuICovCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBzZW5kX29mZmVyKHN0cnVjdCBkaGNwX3BhY2tldCAqb2xkcGFja2V0LAorCQl1aW50MzJfdCBzdGF0aWNfbGVhc2VfbmlwLAorCQlzdHJ1Y3QgZHluX2xlYXNlICpsZWFzZSwKKwkJdWludDhfdCAqcmVxdWVzdGVkX2lwX29wdCkKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCXVpbnQzMl90IGxlYXNlX3RpbWVfc2VjOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisKKwlpbml0X3BhY2tldCgmcGFja2V0LCBvbGRwYWNrZXQsIERIQ1BPRkZFUik7CisKKwkvKiBJZiBpdCBpcyBhIHN0YXRpYyBsZWFzZSwgdXNlIGl0cyBJUCAqLworCXBhY2tldC55aWFkZHIgPSBzdGF0aWNfbGVhc2VfbmlwOworCS8qIEVsc2U6ICovCisJaWYgKCFzdGF0aWNfbGVhc2VfbmlwKSB7CisJCS8qIFdlIGhhdmUgbm8gc3RhdGljIGxlYXNlIGZvciBjbGllbnQncyBjaGFkZHIgKi8KKwkJdWludDMyX3QgcmVxX25pcDsKKwkJY29uc3QgY2hhciAqcF9ob3N0X25hbWU7CisKKwkJaWYgKGxlYXNlKSB7CisJCQkvKiBXZSBoYXZlIGEgZHluYW1pYyBsZWFzZSBmb3IgY2xpZW50J3MgY2hhZGRyLgorCQkJICogUmV1c2UgaXRzIElQIChldmVuIGlmIGxlYXNlIGlzIGV4cGlyZWQpLgorCQkJICogTm90ZSB0aGF0IHdlIGlnbm9yZSByZXF1ZXN0ZWQgSVAgaW4gdGhpcyBjYXNlLgorCQkJICovCisJCQlwYWNrZXQueWlhZGRyID0gbGVhc2UtPmxlYXNlX25pcDsKKwkJfQorCQkvKiBPcjogaWYgY2xpZW50IGhhcyByZXF1ZXN0ZWQgYW4gSVAgKi8KKwkJZWxzZSBpZiAocmVxdWVzdGVkX2lwX29wdCAhPSBOVUxMCisJCSAvKiAocmVhZCBJUCkgKi8KKwkJICYmIChtb3ZlX2Zyb21fdW5hbGlnbmVkMzIocmVxX25pcCwgcmVxdWVzdGVkX2lwX29wdCksIDEpCisJCSAvKiBhbmQgdGhlIElQIGlzIGluIHRoZSBsZWFzZSByYW5nZSAqLworCQkgJiYgbnRvaGwocmVxX25pcCkgPj0gc2VydmVyX2NvbmZpZy5zdGFydF9pcAorCQkgJiYgbnRvaGwocmVxX25pcCkgPD0gc2VydmVyX2NvbmZpZy5lbmRfaXAKKwkJIC8qIGFuZCAqLworCQkgJiYgKCAgIShsZWFzZSA9IGZpbmRfbGVhc2VfYnlfbmlwKHJlcV9uaXApKSAvKiBpcyBub3QgYWxyZWFkeSB0YWtlbiAqLworCQkgICAgfHwgaXNfZXhwaXJlZF9sZWFzZShsZWFzZSkgLyogb3IgaXMgdGFrZW4sIGJ1dCBleHBpcmVkICovCisJCSAgICApCisJCSkgeworCQkJcGFja2V0LnlpYWRkciA9IHJlcV9uaXA7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBPdGhlcndpc2UsIGZpbmQgYSBmcmVlIElQICovCisJCQlwYWNrZXQueWlhZGRyID0gZmluZF9mcmVlX29yX2V4cGlyZWRfbmlwKG9sZHBhY2tldC0+Y2hhZGRyKTsKKwkJfQorCisJCWlmICghcGFja2V0LnlpYWRkcikgeworCQkJYmJfZXJyb3JfbXNnKCJubyBmcmVlIElQIGFkZHJlc3Nlcy4gT0ZGRVIgYWJhbmRvbmVkIik7CisJCQlyZXR1cm47CisJCX0KKwkJLyogUmVzZXJ2ZSB0aGUgSVAgZm9yIGEgc2hvcnQgdGltZSBob3BpbmcgdG8gZ2V0IERIQ1BSRVFVRVNUIHNvb24gKi8KKwkJcF9ob3N0X25hbWUgPSAoY29uc3QgY2hhciopIHVkaGNwX2dldF9vcHRpb24ob2xkcGFja2V0LCBESENQX0hPU1RfTkFNRSk7CisJCWxlYXNlID0gYWRkX2xlYXNlKHBhY2tldC5jaGFkZHIsIHBhY2tldC55aWFkZHIsCisJCQkJc2VydmVyX2NvbmZpZy5vZmZlcl90aW1lLAorCQkJCXBfaG9zdF9uYW1lLAorCQkJCXBfaG9zdF9uYW1lID8gKHVuc2lnbmVkIGNoYXIpcF9ob3N0X25hbWVbT1BUX0xFTiAtIE9QVF9EQVRBXSA6IDAKKwkJKTsKKwkJaWYgKCFsZWFzZSkgeworCQkJYmJfZXJyb3JfbXNnKCJubyBmcmVlIElQIGFkZHJlc3Nlcy4gT0ZGRVIgYWJhbmRvbmVkIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlsZWFzZV90aW1lX3NlYyA9IHNlbGVjdF9sZWFzZV90aW1lKG9sZHBhY2tldCk7CisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9MRUFTRV9USU1FLCBodG9ubChsZWFzZV90aW1lX3NlYykpOworCWFkZF9zZXJ2ZXJfb3B0aW9ucygmcGFja2V0KTsKKworCWFkZHIuc19hZGRyID0gcGFja2V0LnlpYWRkcjsKKwliYl9pbmZvX21zZygiU2VuZGluZyBPRkZFUiBvZiAlcyIsIGluZXRfbnRvYShhZGRyKSk7CisJLyogc2VuZF9wYWNrZXQgZW1pdHMgZXJyb3IgbWVzc2FnZSBpdHNlbGYgaWYgaXQgZGV0ZWN0cyBmYWlsdXJlICovCisJc2VuZF9wYWNrZXQoJnBhY2tldCwgLypmb3JjZV9iY2FzdDoqLyAwKTsKK30KKworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2VuZF9OQUsoc3RydWN0IGRoY3BfcGFja2V0ICpvbGRwYWNrZXQpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKworCWluaXRfcGFja2V0KCZwYWNrZXQsIG9sZHBhY2tldCwgREhDUE5BSyk7CisKKwlsb2cxKCJTZW5kaW5nIE5BSyIpOworCXNlbmRfcGFja2V0KCZwYWNrZXQsIC8qZm9yY2VfYmNhc3Q6Ki8gMSk7Cit9CisKKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSB2b2lkIHNlbmRfQUNLKHN0cnVjdCBkaGNwX3BhY2tldCAqb2xkcGFja2V0LCB1aW50MzJfdCB5aWFkZHIpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKwl1aW50MzJfdCBsZWFzZV90aW1lX3NlYzsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOworCWNvbnN0IGNoYXIgKnBfaG9zdF9uYW1lOworCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgb2xkcGFja2V0LCBESENQQUNLKTsKKwlwYWNrZXQueWlhZGRyID0geWlhZGRyOworCisJbGVhc2VfdGltZV9zZWMgPSBzZWxlY3RfbGVhc2VfdGltZShvbGRwYWNrZXQpOworCXVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKCZwYWNrZXQsIERIQ1BfTEVBU0VfVElNRSwgaHRvbmwobGVhc2VfdGltZV9zZWMpKTsKKworCWFkZF9zZXJ2ZXJfb3B0aW9ucygmcGFja2V0KTsKKworCWFkZHIuc19hZGRyID0geWlhZGRyOworCWJiX2luZm9fbXNnKCJTZW5kaW5nIEFDSyB0byAlcyIsIGluZXRfbnRvYShhZGRyKSk7CisJc2VuZF9wYWNrZXQoJnBhY2tldCwgLypmb3JjZV9iY2FzdDoqLyAwKTsKKworCXBfaG9zdF9uYW1lID0gKGNvbnN0IGNoYXIqKSB1ZGhjcF9nZXRfb3B0aW9uKG9sZHBhY2tldCwgREhDUF9IT1NUX05BTUUpOworCWFkZF9sZWFzZShwYWNrZXQuY2hhZGRyLCBwYWNrZXQueWlhZGRyLAorCQlsZWFzZV90aW1lX3NlYywKKwkJcF9ob3N0X25hbWUsCisJCXBfaG9zdF9uYW1lID8gKHVuc2lnbmVkIGNoYXIpcF9ob3N0X25hbWVbT1BUX0xFTiAtIE9QVF9EQVRBXSA6IDAKKwkpOworCWlmIChFTkFCTEVfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZKSB7CisJCS8qIHJld3JpdGUgdGhlIGZpbGUgd2l0aCBsZWFzZXMgYXQgZXZlcnkgbmV3IGFjY2VwdGFuY2UgKi8KKwkJd3JpdGVfbGVhc2VzKCk7CisJfQorfQorCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBzZW5kX2luZm9ybShzdHJ1Y3QgZGhjcF9wYWNrZXQgKm9sZHBhY2tldCkKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCisJLyogIklmIGEgY2xpZW50IGhhcyBvYnRhaW5lZCBhIG5ldHdvcmsgYWRkcmVzcyB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMKKwkgKiAoZS5nLiwgbWFudWFsIGNvbmZpZ3VyYXRpb24pLCBpdCBtYXkgdXNlIGEgREhDUElORk9STSByZXF1ZXN0IG1lc3NhZ2UKKwkgKiB0byBvYnRhaW4gb3RoZXIgbG9jYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAgU2VydmVycyByZWNlaXZpbmcgYQorCSAqIERIQ1BJTkZPUk0gbWVzc2FnZSBjb25zdHJ1Y3QgYSBESENQQUNLIG1lc3NhZ2Ugd2l0aCBhbnkgbG9jYWwKKwkgKiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjbGllbnQgd2l0aG91dDoKKwkgKiBhbGxvY2F0aW5nIGEgbmV3IGFkZHJlc3MsIGNoZWNraW5nIGZvciBhbiBleGlzdGluZyBiaW5kaW5nLCBmaWxsaW5nCisJICogaW4gJ3lpYWRkcicgb3IgaW5jbHVkaW5nIGxlYXNlIHRpbWUgcGFyYW1ldGVycy4gIFRoZSBzZXJ2ZXJzIFNIT1VMRAorCSAqIHVuaWNhc3QgdGhlIERIQ1BBQ0sgcmVwbHkgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlICdjaWFkZHInIGZpZWxkCisJICogb2YgdGhlIERIQ1BJTkZPUk0gbWVzc2FnZS4KKwkgKiAuLi4KKwkgKiBUaGUgc2VydmVyIHJlc3BvbmRzIHRvIGEgREhDUElORk9STSBtZXNzYWdlIGJ5IHNlbmRpbmcgYSBESENQQUNLCisJICogbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUgJ2NpYWRkcicgZmllbGQKKwkgKiBvZiB0aGUgREhDUElORk9STSBtZXNzYWdlLiAgVGhlIHNlcnZlciBNVVNUIE5PVCBzZW5kIGEgbGVhc2UKKwkgKiBleHBpcmF0aW9uIHRpbWUgdG8gdGhlIGNsaWVudCBhbmQgU0hPVUxEIE5PVCBmaWxsIGluICd5aWFkZHInLiIKKwkgKi8KKy8vVE9ETzogZG8gYSBmZXcgc2FuaXR5IGNoZWNrczogaXMgY2lhZGRyIHNldD8KKy8vQmV0dGVyIHlldDogaXMgY2lhZGRyID09IElQIHNvdXJjZSBhZGRyPworCWluaXRfcGFja2V0KCZwYWNrZXQsIG9sZHBhY2tldCwgREhDUEFDSyk7CisJYWRkX3NlcnZlcl9vcHRpb25zKCZwYWNrZXQpOworCisJc2VuZF9wYWNrZXQoJnBhY2tldCwgLypmb3JjZV9iY2FzdDoqLyAwKTsKK30KKworCisvKiBnbG9iYWxzICovCitzdHJ1Y3QgZHluX2xlYXNlICpnX2xlYXNlczsKKy8qIHN0cnVjdCBzZXJ2ZXJfY29uZmlnX3Qgc2VydmVyX2NvbmZpZyBpcyBpbiBiYl9jb21tb25fYnVmc2l6MSAqLworCisKK2ludCB1ZGhjcGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVkaGNwZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHNlcnZlcl9zb2NrZXQgPSAtMSwgcmV0dmFsLCBtYXhfc29jazsKKwl1aW50OF90ICpzdGF0ZTsKKwl1bnNpZ25lZCB0aW1lb3V0X2VuZDsKKwl1bnNpZ25lZCBudW1faXBzOworCXVuc2lnbmVkIG9wdDsKKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqb3B0aW9uOworCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVChjaGFyICpzdHJfUDspCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9QT1JUCisJU0VSVkVSX1BPUlQgPSA2NzsKKwlDTElFTlRfUE9SVCA9IDY4OworI2VuZGlmCisKKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMQorCW9wdF9jb21wbGVtZW50YXJ5ID0gInZ2IjsKKyNlbmRpZgorCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmU3YiCisJCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgiUDoiLCAmc3RyX1ApCisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDEKKwkJLCAmZGhjcF92ZXJib3NlCisjZW5kaWYKKwkJKTsKKwlpZiAoIShvcHQgJiAxKSkgeyAvKiBubyAtZiAqLworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoMCwgYXJndik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJfQorCS8qIHVwZGF0ZSBhcmd2IGFmdGVyIHRoZSBwb3NzaWJsZSB2Zm9yaytleGVjIGluIGRhZW1vbml6ZSAqLworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiAyKSB7IC8qIC1TICovCisJCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQsIExPR19EQUVNT04pOworCQlsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9QT1JUCisJaWYgKG9wdCAmIDgpIHsgLyogLVAgKi8KKwkJU0VSVkVSX1BPUlQgPSB4YXRvdTE2KHN0cl9QKTsKKwkJQ0xJRU5UX1BPUlQgPSBTRVJWRVJfUE9SVCArIDE7CisJfQorI2VuZGlmCisJLyogV291bGQgcmF0aGVyIG5vdCBkbyByZWFkX2NvbmZpZyBiZWZvcmUgZGFlbW9uaXphdGlvbiAtCisJICogb3RoZXJ3aXNlIE5PTU1VIG1hY2hpbmVzIHdpbGwgcGFyc2UgY29uZmlnIHR3aWNlICovCisJcmVhZF9jb25maWcoYXJndlswXSA/IGFyZ3ZbMF0gOiBESENQRF9DT05GX0ZJTEUpOworCisJLyogTWFrZSBzdXJlIGZkIDAsMSwyIGFyZSBvcGVuICovCisJYmJfc2FuaXRpemVfc3RkaW8oKTsKKwkvKiBFcXVpdmFsZW50IG9mIGRvaW5nIGEgZmZsdXNoIGFmdGVyIGV2ZXJ5IFxuICovCisJc2V0bGluZWJ1ZihzdGRvdXQpOworCisJLyogQ3JlYXRlIHBpZGZpbGUgKi8KKwl3cml0ZV9waWRmaWxlKHNlcnZlcl9jb25maWcucGlkZmlsZSk7CisJLyogaWYgKCEuLikgYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlIHBpZGZpbGUgJXMiLCBwaWRmaWxlKTsgKi8KKworCWJiX2luZm9fbXNnKCIlcyAodiJCQl9WRVIiKSBzdGFydGVkIiwgYXBwbGV0X25hbWUpOworCisJb3B0aW9uID0gdWRoY3BfZmluZF9vcHRpb24oc2VydmVyX2NvbmZpZy5vcHRpb25zLCBESENQX0xFQVNFX1RJTUUpOworCXNlcnZlcl9jb25maWcubWF4X2xlYXNlX3NlYyA9IERFRkFVTFRfTEVBU0VfVElNRTsKKwlpZiAob3B0aW9uKSB7CisJCW1vdmVfZnJvbV91bmFsaWduZWQzMihzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZV9zZWMsIG9wdGlvbi0+ZGF0YSArIE9QVF9EQVRBKTsKKwkJc2VydmVyX2NvbmZpZy5tYXhfbGVhc2Vfc2VjID0gbnRvaGwoc2VydmVyX2NvbmZpZy5tYXhfbGVhc2Vfc2VjKTsKKwl9CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwludW1faXBzID0gc2VydmVyX2NvbmZpZy5lbmRfaXAgLSBzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwICsgMTsKKwlpZiAoc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzID4gbnVtX2lwcykgeworCQliYl9lcnJvcl9tc2coIm1heF9sZWFzZXM9JXUgaXMgdG9vIGJpZywgc2V0dGluZyB0byAldSIsCisJCQkodW5zaWduZWQpc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzLCBudW1faXBzKTsKKwkJc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzID0gbnVtX2lwczsKKwl9CisKKwlnX2xlYXNlcyA9IHh6YWxsb2Moc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzICogc2l6ZW9mKGdfbGVhc2VzWzBdKSk7CisJcmVhZF9sZWFzZXMoc2VydmVyX2NvbmZpZy5sZWFzZV9maWxlKTsKKworCWlmICh1ZGhjcF9yZWFkX2ludGVyZmFjZShzZXJ2ZXJfY29uZmlnLmludGVyZmFjZSwKKwkJCSZzZXJ2ZXJfY29uZmlnLmlmaW5kZXgsCisJCQkmc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbmlwLAorCQkJc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbWFjKQorCSkgeworCQlyZXR2YWwgPSAxOworCQlnb3RvIHJldDsKKwl9CisKKwkvKiBTZXR1cCB0aGUgc2lnbmFsIHBpcGUgKi8KKwl1ZGhjcF9zcF9zZXR1cCgpOworCisJdGltZW91dF9lbmQgPSBtb25vdG9uaWNfc2VjKCkgKyBzZXJ2ZXJfY29uZmlnLmF1dG9fdGltZTsKKwl3aGlsZSAoMSkgeyAvKiBsb29wIHVudGlsIHVuaXZlcnNlIGNvbGxhcHNlcyAqLworCQlmZF9zZXQgcmZkczsKKwkJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKwkJaW50IGJ5dGVzOworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJdWludDhfdCAqc2VydmVyX2lkX29wdDsKKwkJdWludDhfdCAqcmVxdWVzdGVkX2lwX29wdDsKKwkJdWludDMyX3QgcmVxdWVzdGVkX25pcCA9IHJlcXVlc3RlZF9uaXA7IC8qIGZvciBjb21waWxlciAqLworCQl1aW50MzJfdCBzdGF0aWNfbGVhc2VfbmlwOworCQlzdHJ1Y3QgZHluX2xlYXNlICpsZWFzZSwgZmFrZV9sZWFzZTsKKworCQlpZiAoc2VydmVyX3NvY2tldCA8IDApIHsKKwkJCXNlcnZlcl9zb2NrZXQgPSB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qSU5BRERSX0FOWSwqLyBTRVJWRVJfUE9SVCwKKwkJCQkJc2VydmVyX2NvbmZpZy5pbnRlcmZhY2UpOworCQl9CisKKwkJbWF4X3NvY2sgPSB1ZGhjcF9zcF9mZF9zZXQoJnJmZHMsIHNlcnZlcl9zb2NrZXQpOworCQlpZiAoc2VydmVyX2NvbmZpZy5hdXRvX3RpbWUpIHsKKwkJCXR2LnR2X3NlYyA9IHRpbWVvdXRfZW5kIC0gbW9ub3RvbmljX3NlYygpOworCQkJdHYudHZfdXNlYyA9IDA7CisJCX0KKwkJcmV0dmFsID0gMDsKKwkJaWYgKCFzZXJ2ZXJfY29uZmlnLmF1dG9fdGltZSB8fCB0di50dl9zZWMgPiAwKSB7CisJCQlyZXR2YWwgPSBzZWxlY3QobWF4X3NvY2sgKyAxLCAmcmZkcywgTlVMTCwgTlVMTCwKKwkJCQkJc2VydmVyX2NvbmZpZy5hdXRvX3RpbWUgPyAmdHYgOiBOVUxMKTsKKwkJfQorCQlpZiAocmV0dmFsID09IDApIHsKKwkJCXdyaXRlX2xlYXNlcygpOworCQkJdGltZW91dF9lbmQgPSBtb25vdG9uaWNfc2VjKCkgKyBzZXJ2ZXJfY29uZmlnLmF1dG9fdGltZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyZXR2YWwgPCAwICYmIGVycm5vICE9IEVJTlRSKSB7CisJCQlsb2cxKCJFcnJvciBvbiBzZWxlY3QiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoICh1ZGhjcF9zcF9yZWFkKCZyZmRzKSkgeworCQljYXNlIFNJR1VTUjE6CisJCQliYl9pbmZvX21zZygiUmVjZWl2ZWQgU0lHVVNSMSIpOworCQkJd3JpdGVfbGVhc2VzKCk7CisJCQkvKiB3aHkgbm90IGp1c3QgcmVzZXQgdGhlIHRpbWVvdXQsIGVoICovCisJCQl0aW1lb3V0X2VuZCA9IG1vbm90b25pY19zZWMoKSArIHNlcnZlcl9jb25maWcuYXV0b190aW1lOworCQkJY29udGludWU7CisJCWNhc2UgU0lHVEVSTToKKwkJCWJiX2luZm9fbXNnKCJSZWNlaXZlZCBTSUdURVJNIik7CisJCQlnb3RvIHJldDA7CisJCWNhc2UgMDogLyogbm8gc2lnbmFsOiByZWFkIGEgcGFja2V0ICovCisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogc2lnbmFsIG9yIGVycm9yIChwcm9iYWJseSBFSU5UUik6IGJhY2sgdG8gc2VsZWN0ICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWJ5dGVzID0gdWRoY3BfcmVjdl9rZXJuZWxfcGFja2V0KCZwYWNrZXQsIHNlcnZlcl9zb2NrZXQpOworCQlpZiAoYnl0ZXMgPCAwKSB7CisJCQkvKiBieXRlcyBjYW4gYWxzbyBiZSAtMiAoImJhZCBwYWNrZXQgZGF0YSIpICovCisJCQlpZiAoYnl0ZXMgPT0gLTEgJiYgZXJybm8gIT0gRUlOVFIpIHsKKwkJCQlsb2cxKCJSZWFkIGVycm9yOiAlcywgcmVvcGVuaW5nIHNvY2tldCIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJY2xvc2Uoc2VydmVyX3NvY2tldCk7CisJCQkJc2VydmVyX3NvY2tldCA9IC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBhY2tldC5obGVuICE9IDYpIHsKKwkJCWJiX2Vycm9yX21zZygiTUFDIGxlbmd0aCAhPSA2LCBpZ25vcmluZyBwYWNrZXQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwYWNrZXQub3AgIT0gQk9PVFJFUVVFU1QpIHsKKwkJCWJiX2Vycm9yX21zZygibm90IGEgUkVRVUVTVCwgaWdub3JpbmcgcGFja2V0Iik7CisJCQljb250aW51ZTsKKwkJfQorCQlzdGF0ZSA9IHVkaGNwX2dldF9vcHRpb24oJnBhY2tldCwgREhDUF9NRVNTQUdFX1RZUEUpOworCQlpZiAoc3RhdGUgPT0gTlVMTCB8fCBzdGF0ZVswXSA8IERIQ1BfTUlOVFlQRSB8fCBzdGF0ZVswXSA+IERIQ1BfTUFYVFlQRSkgeworCQkJYmJfZXJyb3JfbXNnKCJubyBvciBiYWQgbWVzc2FnZSB0eXBlIG9wdGlvbiwgaWdub3JpbmcgcGFja2V0Iik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEdldCBTRVJWRVJfSUQgaWYgcHJlc2VudCAqLworCQlzZXJ2ZXJfaWRfb3B0ID0gdWRoY3BfZ2V0X29wdGlvbigmcGFja2V0LCBESENQX1NFUlZFUl9JRCk7CisJCWlmIChzZXJ2ZXJfaWRfb3B0KSB7CisJCQl1aW50MzJfdCBzZXJ2ZXJfaWRfbmV0d29ya19vcmRlcjsKKwkJCW1vdmVfZnJvbV91bmFsaWduZWQzMihzZXJ2ZXJfaWRfbmV0d29ya19vcmRlciwgc2VydmVyX2lkX29wdCk7CisJCQlpZiAoc2VydmVyX2lkX25ldHdvcmtfb3JkZXIgIT0gc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbmlwKSB7CisJCQkJLyogY2xpZW50IHRhbGtzIHRvIHNvbWVib2R5IGVsc2UgKi8KKwkJCQlsb2cxKCJzZXJ2ZXIgSUQgZG9lc24ndCBtYXRjaCwgaWdub3JpbmciKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIExvb2sgZm9yIGEgc3RhdGljL2R5bmFtaWMgbGVhc2UgKi8KKwkJc3RhdGljX2xlYXNlX25pcCA9IGdldF9zdGF0aWNfbmlwX2J5X21hYyhzZXJ2ZXJfY29uZmlnLnN0YXRpY19sZWFzZXMsICZwYWNrZXQuY2hhZGRyKTsKKwkJaWYgKHN0YXRpY19sZWFzZV9uaXApIHsKKwkJCWJiX2luZm9fbXNnKCJGb3VuZCBzdGF0aWMgbGVhc2U6ICV4Iiwgc3RhdGljX2xlYXNlX25pcCk7CisJCQltZW1jcHkoJmZha2VfbGVhc2UubGVhc2VfbWFjLCAmcGFja2V0LmNoYWRkciwgNik7CisJCQlmYWtlX2xlYXNlLmxlYXNlX25pcCA9IHN0YXRpY19sZWFzZV9uaXA7CisJCQlmYWtlX2xlYXNlLmV4cGlyZXMgPSAwOworCQkJbGVhc2UgPSAmZmFrZV9sZWFzZTsKKwkJfSBlbHNlIHsKKwkJCWxlYXNlID0gZmluZF9sZWFzZV9ieV9tYWMocGFja2V0LmNoYWRkcik7CisJCX0KKworCQkvKiBHZXQgUkVRVUVTVEVEX0lQIGlmIHByZXNlbnQgKi8KKwkJcmVxdWVzdGVkX2lwX29wdCA9IHVkaGNwX2dldF9vcHRpb24oJnBhY2tldCwgREhDUF9SRVFVRVNURURfSVApOworCQlpZiAocmVxdWVzdGVkX2lwX29wdCkgeworCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHJlcXVlc3RlZF9uaXAsIHJlcXVlc3RlZF9pcF9vcHQpOworCQl9CisKKwkJc3dpdGNoIChzdGF0ZVswXSkgeworCisJCWNhc2UgREhDUERJU0NPVkVSOgorCQkJbG9nMSgiUmVjZWl2ZWQgRElTQ09WRVIiKTsKKworCQkJc2VuZF9vZmZlcigmcGFja2V0LCBzdGF0aWNfbGVhc2VfbmlwLCBsZWFzZSwgcmVxdWVzdGVkX2lwX29wdCk7CisJCQlicmVhazsKKworCQljYXNlIERIQ1BSRVFVRVNUOgorCQkJbG9nMSgiUmVjZWl2ZWQgUkVRVUVTVCIpOworLyogUkZDIDIxMzE6CisKK28gREhDUFJFUVVFU1QgZ2VuZXJhdGVkIGR1cmluZyBTRUxFQ1RJTkcgc3RhdGU6CisKKyAgIENsaWVudCBpbnNlcnRzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWxlY3RlZCBzZXJ2ZXIgaW4gJ3NlcnZlcgorICAgaWRlbnRpZmllcicsICdjaWFkZHInIE1VU1QgYmUgemVybywgJ3JlcXVlc3RlZCBJUCBhZGRyZXNzJyBNVVNUIGJlCisgICBmaWxsZWQgaW4gd2l0aCB0aGUgeWlhZGRyIHZhbHVlIGZyb20gdGhlIGNob3NlbiBESENQT0ZGRVIuCisKKyAgIE5vdGUgdGhhdCB0aGUgY2xpZW50IG1heSBjaG9vc2UgdG8gY29sbGVjdCBzZXZlcmFsIERIQ1BPRkZFUgorICAgbWVzc2FnZXMgYW5kIHNlbGVjdCB0aGUgImJlc3QiIG9mZmVyLiAgVGhlIGNsaWVudCBpbmRpY2F0ZXMgaXRzCisgICBzZWxlY3Rpb24gYnkgaWRlbnRpZnlpbmcgdGhlIG9mZmVyaW5nIHNlcnZlciBpbiB0aGUgREhDUFJFUVVFU1QKKyAgIG1lc3NhZ2UuICBJZiB0aGUgY2xpZW50IHJlY2VpdmVzIG5vIGFjY2VwdGFibGUgb2ZmZXJzLCB0aGUgY2xpZW50CisgICBtYXkgY2hvb3NlIHRvIHRyeSBhbm90aGVyIERIQ1BESVNDT1ZFUiBtZXNzYWdlLiAgVGhlcmVmb3JlLCB0aGUKKyAgIHNlcnZlcnMgbWF5IG5vdCByZWNlaXZlIGEgc3BlY2lmaWMgREhDUFJFUVVFU1QgZnJvbSB3aGljaCB0aGV5IGNhbgorICAgZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRoZSBjbGllbnQgaGFzIGFjY2VwdGVkIHRoZSBvZmZlci4KKworbyBESENQUkVRVUVTVCBnZW5lcmF0ZWQgZHVyaW5nIElOSVQtUkVCT09UIHN0YXRlOgorCisgICAnc2VydmVyIGlkZW50aWZpZXInIE1VU1QgTk9UIGJlIGZpbGxlZCBpbiwgJ3JlcXVlc3RlZCBJUCBhZGRyZXNzJworICAgb3B0aW9uIE1VU1QgYmUgZmlsbGVkIGluIHdpdGggY2xpZW50J3Mgbm90aW9uIG9mIGl0cyBwcmV2aW91c2x5CisgICBhc3NpZ25lZCBhZGRyZXNzLiAnY2lhZGRyJyBNVVNUIGJlIHplcm8uIFRoZSBjbGllbnQgaXMgc2Vla2luZyB0bworICAgdmVyaWZ5IGEgcHJldmlvdXNseSBhbGxvY2F0ZWQsIGNhY2hlZCBjb25maWd1cmF0aW9uLiBTZXJ2ZXIgU0hPVUxECisgICBzZW5kIGEgREhDUE5BSyBtZXNzYWdlIHRvIHRoZSBjbGllbnQgaWYgdGhlICdyZXF1ZXN0ZWQgSVAgYWRkcmVzcycKKyAgIGlzIGluY29ycmVjdCwgb3IgaXMgb24gdGhlIHdyb25nIG5ldHdvcmsuCisKKyAgIERldGVybWluaW5nIHdoZXRoZXIgYSBjbGllbnQgaW4gdGhlIElOSVQtUkVCT09UIHN0YXRlIGlzIG9uIHRoZQorICAgY29ycmVjdCBuZXR3b3JrIGlzIGRvbmUgYnkgZXhhbWluaW5nIHRoZSBjb250ZW50cyBvZiAnZ2lhZGRyJywgdGhlCisgICAncmVxdWVzdGVkIElQIGFkZHJlc3MnIG9wdGlvbiwgYW5kIGEgZGF0YWJhc2UgbG9va3VwLiBJZiB0aGUgREhDUAorICAgc2VydmVyIGRldGVjdHMgdGhhdCB0aGUgY2xpZW50IGlzIG9uIHRoZSB3cm9uZyBuZXQgKGkuZS4sIHRoZQorICAgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBsb2NhbCBzdWJuZXQgbWFzayBvciByZW1vdGUgc3VibmV0IG1hc2sgKGlmCisgICAnZ2lhZGRyJyBpcyBub3QgemVybykgdG8gJ3JlcXVlc3RlZCBJUCBhZGRyZXNzJyBvcHRpb24gdmFsdWUKKyAgIGRvZXNuJ3QgbWF0Y2ggcmVhbGl0eSksIHRoZW4gdGhlIHNlcnZlciBTSE9VTEQgc2VuZCBhIERIQ1BOQUsKKyAgIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4KKworICAgSWYgdGhlIG5ldHdvcmsgaXMgY29ycmVjdCwgdGhlbiB0aGUgREhDUCBzZXJ2ZXIgc2hvdWxkIGNoZWNrIGlmCisgICB0aGUgY2xpZW50J3Mgbm90aW9uIG9mIGl0cyBJUCBhZGRyZXNzIGlzIGNvcnJlY3QuIElmIG5vdCwgdGhlbiB0aGUKKyAgIHNlcnZlciBTSE9VTEQgc2VuZCBhIERIQ1BOQUsgbWVzc2FnZSB0byB0aGUgY2xpZW50LiBJZiB0aGUgREhDUAorICAgc2VydmVyIGhhcyBubyByZWNvcmQgb2YgdGhpcyBjbGllbnQsIHRoZW4gaXQgTVVTVCByZW1haW4gc2lsZW50LAorICAgYW5kIE1BWSBvdXRwdXQgYSB3YXJuaW5nIHRvIHRoZSBuZXR3b3JrIGFkbWluaXN0cmF0b3IuIFRoaXMKKyAgIGJlaGF2aW9yIGlzIG5lY2Vzc2FyeSBmb3IgcGVhY2VmdWwgY29leGlzdGVuY2Ugb2Ygbm9uLQorICAgY29tbXVuaWNhdGluZyBESENQIHNlcnZlcnMgb24gdGhlIHNhbWUgd2lyZS4KKworICAgSWYgJ2dpYWRkcicgaXMgMHgwIGluIHRoZSBESENQUkVRVUVTVCBtZXNzYWdlLCB0aGUgY2xpZW50IGlzIG9uCisgICB0aGUgc2FtZSBzdWJuZXQgYXMgdGhlIHNlcnZlci4gIFRoZSBzZXJ2ZXIgTVVTVCBicm9hZGNhc3QgdGhlCisgICBESENQTkFLIG1lc3NhZ2UgdG8gdGhlIDB4ZmZmZmZmZmYgYnJvYWRjYXN0IGFkZHJlc3MgYmVjYXVzZSB0aGUKKyAgIGNsaWVudCBtYXkgbm90IGhhdmUgYSBjb3JyZWN0IG5ldHdvcmsgYWRkcmVzcyBvciBzdWJuZXQgbWFzaywgYW5kCisgICB0aGUgY2xpZW50IG1heSBub3QgYmUgYW5zd2VyaW5nIEFSUCByZXF1ZXN0cy4KKworICAgSWYgJ2dpYWRkcicgaXMgc2V0IGluIHRoZSBESENQUkVRVUVTVCBtZXNzYWdlLCB0aGUgY2xpZW50IGlzIG9uIGEKKyAgIGRpZmZlcmVudCBzdWJuZXQuICBUaGUgc2VydmVyIE1VU1Qgc2V0IHRoZSBicm9hZGNhc3QgYml0IGluIHRoZQorICAgREhDUE5BSywgc28gdGhhdCB0aGUgcmVsYXkgYWdlbnQgd2lsbCBicm9hZGNhc3QgdGhlIERIQ1BOQUsgdG8gdGhlCisgICBjbGllbnQsIGJlY2F1c2UgdGhlIGNsaWVudCBtYXkgbm90IGhhdmUgYSBjb3JyZWN0IG5ldHdvcmsgYWRkcmVzcworICAgb3Igc3VibmV0IG1hc2ssIGFuZCB0aGUgY2xpZW50IG1heSBub3QgYmUgYW5zd2VyaW5nIEFSUCByZXF1ZXN0cy4KKworbyBESENQUkVRVUVTVCBnZW5lcmF0ZWQgZHVyaW5nIFJFTkVXSU5HIHN0YXRlOgorCisgICAnc2VydmVyIGlkZW50aWZpZXInIE1VU1QgTk9UIGJlIGZpbGxlZCBpbiwgJ3JlcXVlc3RlZCBJUCBhZGRyZXNzJworICAgb3B0aW9uIE1VU1QgTk9UIGJlIGZpbGxlZCBpbiwgJ2NpYWRkcicgTVVTVCBiZSBmaWxsZWQgaW4gd2l0aAorICAgY2xpZW50J3MgSVAgYWRkcmVzcy4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBjbGllbnQgaXMgY29tcGxldGVseQorICAgY29uZmlndXJlZCwgYW5kIGlzIHRyeWluZyB0byBleHRlbmQgaXRzIGxlYXNlLiBUaGlzIG1lc3NhZ2Ugd2lsbAorICAgYmUgdW5pY2FzdCwgc28gbm8gcmVsYXkgYWdlbnRzIHdpbGwgYmUgaW52b2x2ZWQgaW4gaXRzCisgICB0cmFuc21pc3Npb24uICBCZWNhdXNlICdnaWFkZHInIGlzIHRoZXJlZm9yZSBub3QgZmlsbGVkIGluLCB0aGUKKyAgIERIQ1Agc2VydmVyIHdpbGwgdHJ1c3QgdGhlIHZhbHVlIGluICdjaWFkZHInLCBhbmQgdXNlIGl0IHdoZW4KKyAgIHJlcGx5aW5nIHRvIHRoZSBjbGllbnQuCisKKyAgIEEgY2xpZW50IE1BWSBjaG9vc2UgdG8gcmVuZXcgb3IgZXh0ZW5kIGl0cyBsZWFzZSBwcmlvciB0byBUMS4gIFRoZQorICAgc2VydmVyIG1heSBjaG9vc2Ugbm90IHRvIGV4dGVuZCB0aGUgbGVhc2UgKGFzIGEgcG9saWN5IGRlY2lzaW9uIGJ5CisgICB0aGUgbmV0d29yayBhZG1pbmlzdHJhdG9yKSwgYnV0IHNob3VsZCByZXR1cm4gYSBESENQQUNLIG1lc3NhZ2UKKyAgIHJlZ2FyZGxlc3MuCisKK28gREhDUFJFUVVFU1QgZ2VuZXJhdGVkIGR1cmluZyBSRUJJTkRJTkcgc3RhdGU6CisKKyAgICdzZXJ2ZXIgaWRlbnRpZmllcicgTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAncmVxdWVzdGVkIElQIGFkZHJlc3MnCisgICBvcHRpb24gTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAnY2lhZGRyJyBNVVNUIGJlIGZpbGxlZCBpbiB3aXRoCisgICBjbGllbnQncyBJUCBhZGRyZXNzLiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIGNsaWVudCBpcyBjb21wbGV0ZWx5CisgICBjb25maWd1cmVkLCBhbmQgaXMgdHJ5aW5nIHRvIGV4dGVuZCBpdHMgbGVhc2UuIFRoaXMgbWVzc2FnZSBNVVNUCisgICBiZSBicm9hZGNhc3QgdG8gdGhlIDB4ZmZmZmZmZmYgSVAgYnJvYWRjYXN0IGFkZHJlc3MuICBUaGUgREhDUAorICAgc2VydmVyIFNIT1VMRCBjaGVjayAnY2lhZGRyJyBmb3IgY29ycmVjdG5lc3MgYmVmb3JlIHJlcGx5aW5nIHRvCisgICB0aGUgREhDUFJFUVVFU1QuCisKKyAgIFRoZSBESENQUkVRVUVTVCBmcm9tIGEgUkVCSU5ESU5HIGNsaWVudCBpcyBpbnRlbmRlZCB0byBhY2NvbW1vZGF0ZQorICAgc2l0ZXMgdGhhdCBoYXZlIG11bHRpcGxlIERIQ1Agc2VydmVycyBhbmQgYSBtZWNoYW5pc20gZm9yCisgICBtYWludGFpbmluZyBjb25zaXN0ZW5jeSBhbW9uZyBsZWFzZXMgbWFuYWdlZCBieSBtdWx0aXBsZSBzZXJ2ZXJzLgorICAgQSBESENQIHNlcnZlciBNQVkgZXh0ZW5kIGEgY2xpZW50J3MgbGVhc2Ugb25seSBpZiBpdCBoYXMgbG9jYWwKKyAgIGFkbWluaXN0cmF0aXZlIGF1dGhvcml0eSB0byBkbyBzby4KKyovCisJCQlpZiAoIXJlcXVlc3RlZF9pcF9vcHQpIHsKKwkJCQlyZXF1ZXN0ZWRfbmlwID0gcGFja2V0LmNpYWRkcjsKKwkJCQlpZiAocmVxdWVzdGVkX25pcCA9PSAwKSB7CisJCQkJCWxvZzEoIm5vIHJlcXVlc3RlZCBJUCBhbmQgbm8gY2lhZGRyLCBpZ25vcmluZyIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAobGVhc2UgJiYgcmVxdWVzdGVkX25pcCA9PSBsZWFzZS0+bGVhc2VfbmlwKSB7CisJCQkJLyogY2xpZW50IHJlcXVlc3RlZCBvciBjb25maWd1cmVkIElQIG1hdGNoZXMgdGhlIGxlYXNlLgorCQkJCSAqIEFDSyBpdCwgYW5kIGJ1bXAgbGVhc2UgZXhwaXJhdGlvbiB0aW1lLiAqLworCQkJCXNlbmRfQUNLKCZwYWNrZXQsIGxlYXNlLT5sZWFzZV9uaXApOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogTm8gbGVhc2UgZm9yIHRoaXMgTUFDLCBvciBsZWFzZSBJUCAhPSByZXF1ZXN0ZWQgSVAgKi8KKworCQkJaWYgKHNlcnZlcl9pZF9vcHQgICAgLyogY2xpZW50IGlzIGluIFNFTEVDVElORyBzdGF0ZSAqLworCQkJIHx8IHJlcXVlc3RlZF9pcF9vcHQgLyogY2xpZW50IGlzIGluIElOSVQtUkVCT09UIHN0YXRlICovCisJCQkpIHsKKwkJCQkvKiAiTm8sIHdlIGRvbid0IGhhdmUgdGhpcyBJUCBmb3IgeW91IiAqLworCQkJCXNlbmRfTkFLKCZwYWNrZXQpOworCQkJfSAvKiBlbHNlOiBjbGllbnQgaXMgaW4gUkVORVdJTkcgb3IgUkVCSU5ESU5HLCBkbyBub3QgYW5zd2VyICovCisKKwkJCWJyZWFrOworCisJCWNhc2UgREhDUERFQ0xJTkU6CisJCQkvKiBSRkMgMjEzMToKKwkJCSAqICJJZiB0aGUgc2VydmVyIHJlY2VpdmVzIGEgREhDUERFQ0xJTkUgbWVzc2FnZSwKKwkJCSAqIHRoZSBjbGllbnQgaGFzIGRpc2NvdmVyZWQgdGhyb3VnaCBzb21lIG90aGVyIG1lYW5zCisJCQkgKiB0aGF0IHRoZSBzdWdnZXN0ZWQgbmV0d29yayBhZGRyZXNzIGlzIGFscmVhZHkKKwkJCSAqIGluIHVzZS4gVGhlIHNlcnZlciBNVVNUIG1hcmsgdGhlIG5ldHdvcmsgYWRkcmVzcworCQkJICogYXMgbm90IGF2YWlsYWJsZSBhbmQgU0hPVUxEIG5vdGlmeSB0aGUgbG9jYWwKKwkJCSAqIHN5c2FkbWluIG9mIGEgcG9zc2libGUgY29uZmlndXJhdGlvbiBwcm9ibGVtLiIKKwkJCSAqCisJCQkgKiBTRVJWRVJfSUQgbXVzdCBiZSBwcmVzZW50LAorCQkJICogUkVRVUVTVEVEX0lQIG11c3QgYmUgcHJlc2VudCwKKwkJCSAqIGNoYWRkciBtdXN0IGJlIGZpbGxlZCBpbiwKKwkJCSAqIGNpYWRkciBtdXN0IGJlIDAgKHdlIGRvIG5vdCBjaGVjayB0aGlzKQorCQkJICovCisJCQlsb2cxKCJSZWNlaXZlZCBERUNMSU5FIik7CisJCQlpZiAoc2VydmVyX2lkX29wdAorCQkJICYmIHJlcXVlc3RlZF9pcF9vcHQKKwkJCSAmJiBsZWFzZSAgLyogY2hhZGRyIG1hdGNoZXMgdGhpcyBsZWFzZSAqLworCQkJICYmIHJlcXVlc3RlZF9uaXAgPT0gbGVhc2UtPmxlYXNlX25pcAorCQkJKSB7CisJCQkJbWVtc2V0KGxlYXNlLT5sZWFzZV9tYWMsIDAsIHNpemVvZihsZWFzZS0+bGVhc2VfbWFjKSk7CisJCQkJbGVhc2UtPmV4cGlyZXMgPSB0aW1lKE5VTEwpICsgc2VydmVyX2NvbmZpZy5kZWNsaW5lX3RpbWU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIERIQ1BSRUxFQVNFOgorCQkJLyogIlVwb24gcmVjZWlwdCBvZiBhIERIQ1BSRUxFQVNFIG1lc3NhZ2UsIHRoZSBzZXJ2ZXIKKwkJCSAqIG1hcmtzIHRoZSBuZXR3b3JrIGFkZHJlc3MgYXMgbm90IGFsbG9jYXRlZC4iCisJCQkgKgorCQkJICogU0VSVkVSX0lEIG11c3QgYmUgcHJlc2VudCwKKwkJCSAqIFJFUVVFU1RFRF9JUCBtdXN0IG5vdCBiZSBwcmVzZW50ICh3ZSBkbyBub3QgY2hlY2sgdGhpcyksCisJCQkgKiBjaGFkZHIgbXVzdCBiZSBmaWxsZWQgaW4sCisJCQkgKiBjaWFkZHIgbXVzdCBiZSBmaWxsZWQgaW4KKwkJCSAqLworCQkJbG9nMSgiUmVjZWl2ZWQgUkVMRUFTRSIpOworCQkJaWYgKHNlcnZlcl9pZF9vcHQKKwkJCSAmJiBsZWFzZSAgLyogY2hhZGRyIG1hdGNoZXMgdGhpcyBsZWFzZSAqLworCQkJICYmIHBhY2tldC5jaWFkZHIgPT0gbGVhc2UtPmxlYXNlX25pcAorCQkJKSB7CisJCQkJbGVhc2UtPmV4cGlyZXMgPSB0aW1lKE5VTEwpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBESENQSU5GT1JNOgorCQkJbG9nMSgiUmVjZWl2ZWQgSU5GT1JNIik7CisJCQlzZW5kX2luZm9ybSgmcGFja2V0KTsKKwkJCWJyZWFrOworCQl9CisJfQorIHJldDA6CisJcmV0dmFsID0gMDsKKyByZXQ6CisJLyppZiAoc2VydmVyX2NvbmZpZy5waWRmaWxlKSAtIHNlcnZlcl9jb25maWcucGlkZmlsZSBpcyBuZXZlciBOVUxMICovCisJCXJlbW92ZV9waWRmaWxlKHNlcnZlcl9jb25maWcucGlkZmlsZSk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZGhjcGQuaCBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZGhjcGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzgwMWJmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9kaGNwZC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIFVESENQX0RIQ1BEX0gKKyNkZWZpbmUgVURIQ1BfREhDUERfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBEZWZhdWx0cyB5b3UgbWF5IHdhbnQgdG8gdHdlYWsgKi8KKy8qIERlZmF1bHQgbWF4X2xlYXNlX3NlYyAqLworI2RlZmluZSBERUZBVUxUX0xFQVNFX1RJTUUgICAgICAoNjAqNjAqMjQgKiAxMCkKKyNkZWZpbmUgTEVBU0VTX0ZJTEUgICAgICAgICAgICAgQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFCisvKiBXaGVyZSB0byBmaW5kIHRoZSBESENQIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUgKi8KKyNkZWZpbmUgREhDUERfQ09ORl9GSUxFICAgICAgICAgIi9ldGMvdWRoY3BkLmNvbmYiCisKKworc3RydWN0IHN0YXRpY19sZWFzZSB7CisJc3RydWN0IHN0YXRpY19sZWFzZSAqbmV4dDsKKwl1aW50MzJfdCBuaXA7CisJdWludDhfdCBtYWNbNl07Cit9OworCitzdHJ1Y3Qgc2VydmVyX2NvbmZpZ190IHsKKwljaGFyICppbnRlcmZhY2U7ICAgICAgICAgICAgICAgIC8qIGludGVyZmFjZSB0byB1c2UgKi8KKy8vVE9ETzogaWZpbmRleCwgc2VydmVyX25pcCwgc2VydmVyX21hYworLy8gYXJlIG9idGFpbmVkIGZyb20gaW50ZXJmYWNlIG5hbWUuCisvLyBJbnN0ZWFkIG9mIHF1ZXJ5aW5nIHRoZW0gKm9uY2UqLCBjcmVhdGUgdXBkYXRlX3NlcnZlcl9uZXR3b3JrX2RhdGFfY2FjaGUoKQorLy8gYW5kIGNhbGwgaXQgYmVmb3JlIGFueSB1c2FnZSBvZiB0aGVzZSBmaWVsZHMuCisvLyB1cGRhdGVfc2VydmVyX25ldHdvcmtfZGF0YV9jYWNoZSgpIG11c3QgcmUtcXVlcnkgZGF0YQorLy8gaWYgbW9yZSB0aGFuIE4gc2Vjb25kcyBoYXZlIHBhc3NlZCBhZnRlciBsYXN0IHVzZS4KKwlpbnQgaWZpbmRleDsKKwl1aW50MzJfdCBzZXJ2ZXJfbmlwOworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1BPUlQKKwl1aW50MTZfdCBwb3J0OworI2VuZGlmCisJdWludDhfdCBzZXJ2ZXJfbWFjWzZdOyAgICAgICAgICAvKiBvdXIgTUFDIGFkZHJlc3MgKHVzZWQgb25seSBmb3IgQVJQIHByb2JpbmcpICovCisJc3RydWN0IG9wdGlvbl9zZXQgKm9wdGlvbnM7ICAgICAvKiBsaXN0IG9mIERIQ1Agb3B0aW9ucyBsb2FkZWQgZnJvbSB0aGUgY29uZmlnIGZpbGUgKi8KKwkvKiBzdGFydCxlbmQgYXJlIGluIGhvc3Qgb3JkZXI6IHdlIG5lZWQgdG8gY29tcGFyZSBzdGFydCA8PSBpcCA8PSBlbmQgKi8KKwl1aW50MzJfdCBzdGFydF9pcDsgICAgICAgICAgICAgIC8qIHN0YXJ0IGFkZHJlc3Mgb2YgbGVhc2VzLCBpbiBob3N0IG9yZGVyICovCisJdWludDMyX3QgZW5kX2lwOyAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbGVhc2VzLCBpbiBob3N0IG9yZGVyICovCisJdWludDMyX3QgbWF4X2xlYXNlX3NlYzsgICAgICAgICAvKiBtYXhpbXVtIGxlYXNlIHRpbWUgKGhvc3Qgb3JkZXIpICovCisJdWludDMyX3QgbWluX2xlYXNlX3NlYzsgICAgICAgICAvKiBtaW5pbXVtIGxlYXNlIHRpbWUgYSBjbGllbnQgY2FuIHJlcXVlc3QgKi8KKwl1aW50MzJfdCBtYXhfbGVhc2VzOyAgICAgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGxlYXNlcyAoaW5jbHVkaW5nIHJlc2VydmVkIGFkZHJlc3NlcykgKi8KKwl1aW50MzJfdCBhdXRvX3RpbWU7ICAgICAgICAgICAgIC8qIGhvdyBsb25nIHNob3VsZCB1ZGhjcGQgd2FpdCBiZWZvcmUgd3JpdGluZyBhIGNvbmZpZyBmaWxlLgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgdGhpcyBpcyB6ZXJvLCBpdCB3aWxsIG9ubHkgd3JpdGUgb25lIG9uIFNJR1VTUjEgKi8KKwl1aW50MzJfdCBkZWNsaW5lX3RpbWU7ICAgICAgICAgIC8qIGhvdyBsb25nIGFuIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgaWYgYSBjbGllbnQgcmV0dXJucyBhCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZWNsaW5lIG1lc3NhZ2UgKi8KKwl1aW50MzJfdCBjb25mbGljdF90aW1lOyAgICAgICAgIC8qIGhvdyBsb25nIGFuIGFycCBjb25mbGljdCBvZmZlbmRlciBpcyBsZWFzZWQgZm9yICovCisJdWludDMyX3Qgb2ZmZXJfdGltZTsgICAgICAgICAgICAvKiBob3cgbG9uZyBhbiBvZmZlcmVkIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgKi8KKwl1aW50MzJfdCBzaWFkZHJfbmlwOyAgICAgICAgICAgIC8qICJuZXh0IHNlcnZlciIgYm9vdHAgb3B0aW9uICovCisJY2hhciAqbGVhc2VfZmlsZTsKKwljaGFyICpwaWRmaWxlOworCWNoYXIgKm5vdGlmeV9maWxlOyAgICAgICAgICAgICAgLyogd2hhdCB0byBydW4gd2hlbmV2ZXIgbGVhc2VzIGFyZSB3cml0dGVuICovCisJY2hhciAqc25hbWU7ICAgICAgICAgICAgICAgICAgICAvKiBib290cCBzZXJ2ZXIgbmFtZSAqLworCWNoYXIgKmJvb3RfZmlsZTsgICAgICAgICAgICAgICAgLyogYm9vdHAgYm9vdCBmaWxlIG9wdGlvbiAqLworCXN0cnVjdCBzdGF0aWNfbGVhc2UgKnN0YXRpY19sZWFzZXM7IC8qIExpc3Qgb2YgaXAvbWFjIHBhaXJzIHRvIGFzc2lnbiBzdGF0aWMgbGVhc2VzICovCit9IEZJWF9BTElBU0lORzsKKworI2RlZmluZSBzZXJ2ZXJfY29uZmlnICgqKHN0cnVjdCBzZXJ2ZXJfY29uZmlnX3QqKSZiYl9jb21tb25fYnVmc2l6MSkKKy8qIGNsaWVudF9jb25maWcgc2l0cyBpbiAybmQgaGFsZiBvZiBiYl9jb21tb25fYnVmc2l6MSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUE9SVAorI2RlZmluZSBTRVJWRVJfUE9SVCAoc2VydmVyX2NvbmZpZy5wb3J0KQorI2Vsc2UKKyNkZWZpbmUgU0VSVkVSX1BPUlQgNjcKKyNlbmRpZgorCisKK3R5cGVkZWYgdWludDMyX3QgbGVhc2V0aW1lX3Q7Cit0eXBlZGVmIGludDMyX3Qgc2lnbmVkX2xlYXNldGltZV90OworCitzdHJ1Y3QgZHluX2xlYXNlIHsKKwkvKiBVbml4IHRpbWUgd2hlbiBsZWFzZSBleHBpcmVzLiBLZXB0IGluIG1lbW9yeSBpbiBob3N0IG9yZGVyLgorCSAqIFdoZW4gd3JpdHRlbiB0byBmaWxlLCBjb252ZXJ0ZWQgdG8gbmV0d29yayBvcmRlcgorCSAqIGFuZCBhZGp1c3RlZCAoY3VycmVudCB0aW1lIHN1YnRyYWN0ZWQpICovCisJbGVhc2V0aW1lX3QgZXhwaXJlczsKKwkvKiAibmlwIjogSVAgaW4gbmV0d29yayBvcmRlciAqLworCXVpbnQzMl90IGxlYXNlX25pcDsKKwkvKiBXZSB1c2UgbGVhc2VfbWFjWzZdLCBzaW5jZSBlLmcuIEFSUCBwcm9iaW5nIHVzZXMKKwkgKiBvbmx5IDYgZmlyc3QgYnl0ZXMgYW55d2F5LiBXZSBjaGVjayByZWNlaXZlZCBkaGNwIHBhY2tldHMKKwkgKiB0aGF0IHRoZWlyIGhsZW4gPT0gNiBhbmQgdGh1cyBjaGFkZHIgaGFzIG9ubHkgNiBzaWduaWZpY2FudCBieXRlcworCSAqIChkaGNwIHBhY2tldCBoYXMgY2hhZGRyWzE2XSwgbm90IFs2XSkKKwkgKi8KKwl1aW50OF90IGxlYXNlX21hY1s2XTsKKwljaGFyIGhvc3RuYW1lWzIwXTsKKwl1aW50OF90IHBhZFsyXTsKKwkvKiB0b3RhbCBzaXplIGlzIGEgbXVsdGlwbHkgb2YgNCAqLworfSBQQUNLRUQ7CisKK2V4dGVybiBzdHJ1Y3QgZHluX2xlYXNlICpnX2xlYXNlczsKKworc3RydWN0IGR5bl9sZWFzZSAqYWRkX2xlYXNlKAorCQljb25zdCB1aW50OF90ICpjaGFkZHIsIHVpbnQzMl90IHlpYWRkciwKKwkJbGVhc2V0aW1lX3QgbGVhc2V0aW1lLAorCQljb25zdCBjaGFyICpob3N0bmFtZSwgaW50IGhvc3RuYW1lX2xlbgorCQkpIEZBU1RfRlVOQzsKK2ludCBpc19leHBpcmVkX2xlYXNlKHN0cnVjdCBkeW5fbGVhc2UgKmxlYXNlKSBGQVNUX0ZVTkM7CitzdHJ1Y3QgZHluX2xlYXNlICpmaW5kX2xlYXNlX2J5X21hYyhjb25zdCB1aW50OF90ICptYWMpIEZBU1RfRlVOQzsKK3N0cnVjdCBkeW5fbGVhc2UgKmZpbmRfbGVhc2VfYnlfbmlwKHVpbnQzMl90IG5pcCkgRkFTVF9GVU5DOwordWludDMyX3QgZmluZF9mcmVlX29yX2V4cGlyZWRfbmlwKGNvbnN0IHVpbnQ4X3QgKnNhZmVfbWFjKSBGQVNUX0ZVTkM7CisKKworLyogQ29uZmlnIGZpbGUgcGFyc2VyIHdpbGwgcGFzcyBzdGF0aWMgbGVhc2UgaW5mbyB0byB0aGlzIGZ1bmN0aW9uCisgKiB3aGljaCB3aWxsIGFkZCBpdCB0byBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY2FuIGJlIHNlYXJjaGVkIGxhdGVyICovCit2b2lkIGFkZF9zdGF0aWNfbGVhc2Uoc3RydWN0IHN0YXRpY19sZWFzZSAqKnN0X2xlYXNlX3BwLCB1aW50OF90ICptYWMsIHVpbnQzMl90IG5pcCkgRkFTVF9GVU5DOworLyogRmluZCBzdGF0aWMgbGVhc2UgSVAgYnkgbWFjICovCit1aW50MzJfdCBnZXRfc3RhdGljX25pcF9ieV9tYWMoc3RydWN0IHN0YXRpY19sZWFzZSAqc3RfbGVhc2UsIHZvaWQgKmFyZykgRkFTVF9GVU5DOworLyogQ2hlY2sgdG8gc2VlIGlmIGFuIElQIGlzIHJlc2VydmVkIGFzIGEgc3RhdGljIElQICovCitpbnQgaXNfbmlwX3Jlc2VydmVkKHN0cnVjdCBzdGF0aWNfbGVhc2UgKnN0X2xlYXNlLCB1aW50MzJfdCBuaXApIEZBU1RfRlVOQzsKKy8qIFByaW50IG91dCBzdGF0aWMgbGVhc2VzIGp1c3QgdG8gY2hlY2sgd2hhdCdzIGdvaW5nIG9uIChkZWJ1ZyBjb2RlKSAqLworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAyCit2b2lkIGxvZ19zdGF0aWNfbGVhc2VzKHN0cnVjdCBzdGF0aWNfbGVhc2UgKipzdF9sZWFzZV9wcCkgRkFTVF9GVU5DOworI2Vsc2UKKyMgZGVmaW5lIGxvZ19zdGF0aWNfbGVhc2VzKHN0X2xlYXNlX3BwKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKK3ZvaWQgcmVhZF9jb25maWcoY29uc3QgY2hhciAqZmlsZSkgRkFTVF9GVU5DOwordm9pZCB3cml0ZV9sZWFzZXModm9pZCkgRkFTVF9GVU5DOwordm9pZCByZWFkX2xlYXNlcyhjb25zdCBjaGFyICpmaWxlKSBGQVNUX0ZVTkM7CisKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2RoY3ByZWxheS5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9kaGNwcmVsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJhYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9kaGNwcmVsYXkuYwpAQCAtMCwwICsxLDM3MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBQb3J0IHRvIEJ1c3lib3ggQ29weXJpZ2h0IChDKSAyMDA2IEplc3NlIER1dHRvbiA8amVzc2VkdXR0b25AZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogREhDUCBSZWxheSBmb3IgJ0RIQ1B2NCBDb25maWd1cmF0aW9uIG9mIElQU2VjIFR1bm5lbCBNb2RlJyBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTWFyaW8gU3RyYXNzZXIgPG1hc3RAZ214Lm5ldD4sCisgKiAgICAgICAgICAgICAgICAgICBadWVyY2hlciBIb2Noc2NodWxlIFdpbnRlcnRodXIsCisgKiAgICAgICAgICAgICAgICAgICBOZXRiZWF0IEFHCisgKiBVcHN0cmVhbSBoYXMgR1BMIHYyIG9yIGxhdGVyCisgKi8KKworLy91c2FnZTojZGVmaW5lIGRoY3ByZWxheV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiQ0xJRU5UX0lGQUNFWyxDTElFTlRfSUZBQ0UyXS4uLiBTRVJWRVJfSUZBQ0UgW1NFUlZFUl9JUF0iCisvL3VzYWdlOiNkZWZpbmUgZGhjcHJlbGF5X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVsYXkgREhDUCByZXF1ZXN0cyBiZXR3ZWVuIGNsaWVudHMgYW5kIHNlcnZlciIKKworI2luY2x1ZGUgImNvbW1vbi5oIgorCisjZGVmaW5lIFNFUlZFUl9QT1JUICAgIDY3CisKKy8qIGxpZmV0aW1lIG9mIGFuIHhpZCBlbnRyeSBpbiBzZWMuICovCisjZGVmaW5lIE1BWF9MSUZFVElNRSAgIDIqNjAKKy8qIHNlbGVjdCB0aW1lb3V0IGluIHNlYy4gKi8KKyNkZWZpbmUgU0VMRUNUX1RJTUVPVVQgKE1BWF9MSUZFVElNRSAvIDgpCisKKy8qIFRoaXMgbGlzdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBjbGllbnRzLiBUaGUgeGlkXyogZnVuY3Rpb25zIG1hbmlwdWxhdGUgdGhpcyBsaXN0LiAqLworc3RydWN0IHhpZF9pdGVtIHsKKwl1bnNpZ25lZCB0aW1lc3RhbXA7CisJaW50IGNsaWVudDsKKwl1aW50MzJfdCB4aWQ7CisJc3RydWN0IHNvY2thZGRyX2luIGlwOworCXN0cnVjdCB4aWRfaXRlbSAqbmV4dDsKK30gRklYX0FMSUFTSU5HOworCisjZGVmaW5lIGRoY3ByZWxheV94aWRfbGlzdCAoKihzdHJ1Y3QgeGlkX2l0ZW0qKSZiYl9jb21tb25fYnVmc2l6MSkKKworc3RhdGljIHN0cnVjdCB4aWRfaXRlbSAqeGlkX2FkZCh1aW50MzJfdCB4aWQsIHN0cnVjdCBzb2NrYWRkcl9pbiAqaXAsIGludCBjbGllbnQpCit7CisJc3RydWN0IHhpZF9pdGVtICppdGVtOworCisJLyogY3JlYXRlIG5ldyB4aWQgZW50cnkgKi8KKwlpdGVtID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHhpZF9pdGVtKSk7CisKKwkvKiBhZGQgeGlkIGVudHJ5ICovCisJaXRlbS0+aXAgPSAqaXA7CisJaXRlbS0+eGlkID0geGlkOworCWl0ZW0tPmNsaWVudCA9IGNsaWVudDsKKwlpdGVtLT50aW1lc3RhbXAgPSBtb25vdG9uaWNfc2VjKCk7CisJaXRlbS0+bmV4dCA9IGRoY3ByZWxheV94aWRfbGlzdC5uZXh0OworCWRoY3ByZWxheV94aWRfbGlzdC5uZXh0ID0gaXRlbTsKKworCXJldHVybiBpdGVtOworfQorCitzdGF0aWMgdm9pZCB4aWRfZXhwaXJlKHZvaWQpCit7CisJc3RydWN0IHhpZF9pdGVtICppdGVtID0gZGhjcHJlbGF5X3hpZF9saXN0Lm5leHQ7CisJc3RydWN0IHhpZF9pdGVtICpsYXN0ID0gJmRoY3ByZWxheV94aWRfbGlzdDsKKwl1bnNpZ25lZCBjdXJyZW50X3RpbWUgPSBtb25vdG9uaWNfc2VjKCk7CisKKwl3aGlsZSAoaXRlbSAhPSBOVUxMKSB7CisJCWlmICgoY3VycmVudF90aW1lIC0gaXRlbS0+dGltZXN0YW1wKSA+IE1BWF9MSUZFVElNRSkgeworCQkJbGFzdC0+bmV4dCA9IGl0ZW0tPm5leHQ7CisJCQlmcmVlKGl0ZW0pOworCQkJaXRlbSA9IGxhc3QtPm5leHQ7CisJCX0gZWxzZSB7CisJCQlsYXN0ID0gaXRlbTsKKwkJCWl0ZW0gPSBpdGVtLT5uZXh0OworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHhpZF9pdGVtICp4aWRfZmluZCh1aW50MzJfdCB4aWQpCit7CisJc3RydWN0IHhpZF9pdGVtICppdGVtID0gZGhjcHJlbGF5X3hpZF9saXN0Lm5leHQ7CisJd2hpbGUgKGl0ZW0gIT0gTlVMTCkgeworCQlpZiAoaXRlbS0+eGlkID09IHhpZCkgeworCQkJYnJlYWs7CisJCX0KKwkJaXRlbSA9IGl0ZW0tPm5leHQ7CisJfQorCXJldHVybiBpdGVtOworfQorCitzdGF0aWMgdm9pZCB4aWRfZGVsKHVpbnQzMl90IHhpZCkKK3sKKwlzdHJ1Y3QgeGlkX2l0ZW0gKml0ZW0gPSBkaGNwcmVsYXlfeGlkX2xpc3QubmV4dDsKKwlzdHJ1Y3QgeGlkX2l0ZW0gKmxhc3QgPSAmZGhjcHJlbGF5X3hpZF9saXN0OworCXdoaWxlIChpdGVtICE9IE5VTEwpIHsKKwkJaWYgKGl0ZW0tPnhpZCA9PSB4aWQpIHsKKwkJCWxhc3QtPm5leHQgPSBpdGVtLT5uZXh0OworCQkJZnJlZShpdGVtKTsKKwkJCWl0ZW0gPSBsYXN0LT5uZXh0OworCQl9IGVsc2UgeworCQkJbGFzdCA9IGl0ZW07CisJCQlpdGVtID0gaXRlbS0+bmV4dDsKKwkJfQorCX0KK30KKworLyoqCisgKiBnZXRfZGhjcF9wYWNrZXRfdHlwZSAtIGdldHMgdGhlIG1lc3NhZ2UgdHlwZSBvZiBhIGRoY3AgcGFja2V0CisgKiBwIC0gcG9pbnRlciB0byB0aGUgZGhjcCBwYWNrZXQKKyAqIHJldHVybnMgdGhlIG1lc3NhZ2UgdHlwZSBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBnZXRfZGhjcF9wYWNrZXRfdHlwZShzdHJ1Y3QgZGhjcF9wYWNrZXQgKnApCit7CisJdWludDhfdCAqb3A7CisKKwkvKiBpdCBtdXN0IGJlIGVpdGhlciBhIEJPT1RSRVFVRVNUIG9yIGEgQk9PVFJFUExZICovCisJaWYgKHAtPm9wICE9IEJPT1RSRVFVRVNUICYmIHAtPm9wICE9IEJPT1RSRVBMWSkKKwkJcmV0dXJuIC0xOworCS8qIGdldCBtZXNzYWdlIHR5cGUgb3B0aW9uICovCisJb3AgPSB1ZGhjcF9nZXRfb3B0aW9uKHAsIERIQ1BfTUVTU0FHRV9UWVBFKTsKKwlpZiAob3AgIT0gTlVMTCkKKwkJcmV0dXJuIG9wWzBdOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBtYWtlX2lmYWNlX2xpc3QgLSBwYXJzZXMgY2xpZW50L3NlcnZlciBpbnRlcmZhY2UgbmFtZXMKKyAqIHJldHVybnMgYXJyYXkKKyAqLworc3RhdGljIGNoYXIgKiptYWtlX2lmYWNlX2xpc3QoY2hhciAqKmNsaWVudF9hbmRfc2VydmVyX2lmYWNlcywgaW50ICpjbGllbnRfbnVtYmVyKQoreworCWNoYXIgKnMsICoqaWZhY2VfbGlzdDsKKwlpbnQgaSwgY247CisKKwkvKiBnZXQgbnVtYmVyIG9mIGl0ZW1zICovCisJY24gPSAyOyAvKiAxIHNlcnZlciBpZmFjZSArIGF0IGxlYXN0IDEgY2xpZW50IG9uZSAqLworCXMgPSBjbGllbnRfYW5kX3NlcnZlcl9pZmFjZXNbMF07IC8qIGxpc3Qgb2YgY2xpZW50IGlmYWNlcyAqLworCXdoaWxlICgqcykgeworCQlpZiAoKnMgPT0gJywnKQorCQkJY24rKzsKKwkJcysrOworCX0KKwkqY2xpZW50X251bWJlciA9IGNuOworCisJLyogY3JlYXRlIHZlY3RvciBvZiBwb2ludGVycyAqLworCWlmYWNlX2xpc3QgPSB4emFsbG9jKGNuICogc2l6ZW9mKGlmYWNlX2xpc3RbMF0pKTsKKworCWlmYWNlX2xpc3RbMF0gPSBjbGllbnRfYW5kX3NlcnZlcl9pZmFjZXNbMV07IC8qIHNlcnZlciBpZmFjZSAqLworCisJaSA9IDE7CisJcyA9IHhzdHJkdXAoY2xpZW50X2FuZF9zZXJ2ZXJfaWZhY2VzWzBdKTsgLyogbGlzdCBvZiBjbGllbnQgaWZhY2VzICovCisJZ290byBzdG9yZV9jbGllbnRfaWZhY2VfbmFtZTsKKworCXdoaWxlIChpIDwgY24pIHsKKwkJaWYgKCpzKysgPT0gJywnKSB7CisJCQlzWy0xXSA9ICdcMCc7Cisgc3RvcmVfY2xpZW50X2lmYWNlX25hbWU6CisJCQlpZmFjZV9saXN0W2krK10gPSBzOworCQl9CisJfQorCisJcmV0dXJuIGlmYWNlX2xpc3Q7Cit9CisKKy8qIENyZWF0ZXMgbGlzdGVuIHNvY2tldHMgKGluIGZkcykgYm91bmQgdG8gY2xpZW50IGFuZCBzZXJ2ZXIgaWZhY2VzLAorICogYW5kIHJldHVybnMgbnVtZXJpY2FsbHkgbWF4IGZkLgorICovCitzdGF0aWMgaW50IGluaXRfc29ja2V0cyhjaGFyICoqaWZhY2VfbGlzdCwgaW50IG51bV9jbGllbnRzLCBpbnQgKmZkcykKK3sKKwlpbnQgaSwgbjsKKworCW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fY2xpZW50czsgaSsrKSB7CisJCWZkc1tpXSA9IHVkaGNwX2xpc3Rlbl9zb2NrZXQoLypJTkFERFJfQU5ZLCovIFNFUlZFUl9QT1JULCBpZmFjZV9saXN0W2ldKTsKKwkJaWYgKG4gPCBmZHNbaV0pCisJCQluID0gZmRzW2ldOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBzZW5kdG9faXA0KGludCBzb2NrLCBjb25zdCB2b2lkICptc2csIGludCBtc2dfbGVuLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnRvKQoreworCWludCBlcnI7CisKKwllcnJubyA9IDA7CisJZXJyID0gc2VuZHRvKHNvY2ssIG1zZywgbXNnX2xlbiwgMCwgKHN0cnVjdCBzb2NrYWRkciopIHRvLCBzaXplb2YoKnRvKSk7CisJZXJyIC09IG1zZ19sZW47CisJaWYgKGVycikKKwkJYmJfcGVycm9yX21zZygic2VuZHRvIik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBwYXNzX3RvX3NlcnZlcigpIC0gZm9yd2FyZHMgZGhjcCBwYWNrZXRzIGZyb20gY2xpZW50IHRvIHNlcnZlcgorICogcCAtIHBhY2tldCB0byBzZW5kCisgKiBjbGllbnQgLSBudW1iZXIgb2YgdGhlIGNsaWVudAorICovCitzdGF0aWMgdm9pZCBwYXNzX3RvX3NlcnZlcihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnAsIGludCBwYWNrZXRfbGVuLCBpbnQgY2xpZW50LCBpbnQgKmZkcywKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqY2xpZW50X2FkZHIsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2VydmVyX2FkZHIpCit7CisJaW50IHR5cGU7CisKKwkvKiBjaGVjayBwYWNrZXRfdHlwZSAqLworCXR5cGUgPSBnZXRfZGhjcF9wYWNrZXRfdHlwZShwKTsKKwlpZiAodHlwZSAhPSBESENQRElTQ09WRVIgJiYgdHlwZSAhPSBESENQUkVRVUVTVAorCSAmJiB0eXBlICE9IERIQ1BERUNMSU5FICYmIHR5cGUgIT0gREhDUFJFTEVBU0UKKwkgJiYgdHlwZSAhPSBESENQSU5GT1JNCisJKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBjcmVhdGUgbmV3IHhpZCBlbnRyeSAqLworCXhpZF9hZGQocC0+eGlkLCBjbGllbnRfYWRkciwgY2xpZW50KTsKKworCS8qIGZvcndhcmQgcmVxdWVzdCB0byBzZXJ2ZXIgKi8KKwkvKiBub3RlIHRoYXQgd2Ugc2VuZCBmcm9tIGZkc1swXSB3aGljaCBpcyBib3VuZCB0byBTRVJWRVJfUE9SVCAoNjcpLgorCSAqIElPVzogd2Ugc2VuZCBfZnJvbV8gU0VSVkVSX1BPUlQhIEFsdGhvdWdoIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSwKKwkgKiBSRkMgMTU0MiBub3Qgb25seSBhbGxvd3MsIGJ1dCBwcmVzY3JpYmVzIHRoaXMgZm9yIEJPT1RQIHJlbGF5cy4KKwkgKi8KKwlzZW5kdG9faXA0KGZkc1swXSwgcCwgcGFja2V0X2xlbiwgc2VydmVyX2FkZHIpOworfQorCisvKioKKyAqIHBhc3NfdG9fY2xpZW50KCkgLSBmb3J3YXJkcyBkaGNwIHBhY2tldHMgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50CisgKiBwIC0gcGFja2V0IHRvIHNlbmQKKyAqLworc3RhdGljIHZvaWQgcGFzc190b19jbGllbnQoc3RydWN0IGRoY3BfcGFja2V0ICpwLCBpbnQgcGFja2V0X2xlbiwgaW50ICpmZHMpCit7CisJaW50IHR5cGU7CisJc3RydWN0IHhpZF9pdGVtICppdGVtOworCisJLyogY2hlY2sgeGlkICovCisJaXRlbSA9IHhpZF9maW5kKHAtPnhpZCk7CisJaWYgKCFpdGVtKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBjaGVjayBwYWNrZXQgdHlwZSAqLworCXR5cGUgPSBnZXRfZGhjcF9wYWNrZXRfdHlwZShwKTsKKwlpZiAodHlwZSAhPSBESENQT0ZGRVIgJiYgdHlwZSAhPSBESENQQUNLICYmIHR5cGUgIT0gREhDUE5BSykgeworCQlyZXR1cm47CisJfQorCisvL1RPRE86IGFsc28gZG8gaXQgaWYgKHAtPmZsYWdzICYgaHRvbnMoQlJPQURDQVNUX0ZMQUcpKSBpcyBzZXQhCisJaWYgKGl0ZW0tPmlwLnNpbl9hZGRyLnNfYWRkciA9PSBodG9ubChJTkFERFJfQU5ZKSkKKwkJaXRlbS0+aXAuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0JST0FEQ0FTVCk7CisKKwlpZiAoc2VuZHRvX2lwNChmZHNbaXRlbS0+Y2xpZW50XSwgcCwgcGFja2V0X2xlbiwgJml0ZW0tPmlwKSAhPSAwKSB7CisJCXJldHVybjsgLyogc2VuZCBlcnJvciBvY2N1cnJlZCAqLworCX0KKworCS8qIHJlbW92ZSB4aWQgZW50cnkgKi8KKwl4aWRfZGVsKHAtPnhpZCk7Cit9CisKK2ludCBkaGNwcmVsYXlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRoY3ByZWxheV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7CisJY2hhciAqKmlmYWNlX2xpc3Q7CisJaW50ICpmZHM7CisJaW50IG51bV9zb2NrZXRzLCBtYXhfc29ja2V0OworCXVpbnQzMl90IG91cl9uaXA7CisKKwlzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzZXJ2ZXJfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQlJPQURDQVNUKTsKKwlzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKFNFUlZFUl9QT1JUKTsKKworCS8qIGRoY3ByZWxheSBDTElFTlRfSUZBQ0UxWyxDTElFTlRfSUZBQ0UyLi4uXSBTRVJWRVJfSUZBQ0UgW1NFUlZFUl9JUF0gKi8KKwlpZiAoYXJnYyA9PSA0KSB7CisJCWlmICghaW5ldF9hdG9uKGFyZ3ZbM10sICZzZXJ2ZXJfYWRkci5zaW5fYWRkcikpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBzZXJ2ZXIgSVAiKTsKKwl9IGVsc2UgaWYgKGFyZ2MgIT0gMykgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWZhY2VfbGlzdCA9IG1ha2VfaWZhY2VfbGlzdChhcmd2ICsgMSwgJm51bV9zb2NrZXRzKTsKKworCWZkcyA9IHhtYWxsb2MobnVtX3NvY2tldHMgKiBzaXplb2YoZmRzWzBdKSk7CisKKwkvKiBDcmVhdGUgc29ja2V0cyBhbmQgYmluZCBvbmUgdG8gZXZlcnkgaWZhY2UgKi8KKwltYXhfc29ja2V0ID0gaW5pdF9zb2NrZXRzKGlmYWNlX2xpc3QsIG51bV9zb2NrZXRzLCBmZHMpOworCisJLyogR2V0IG91ciBJUCBvbiBzZXJ2ZXJfaWZhY2UgKi8KKwlpZiAodWRoY3BfcmVhZF9pbnRlcmZhY2UoYXJndlsyXSwgTlVMTCwgJm91cl9uaXAsIE5VTEwpKQorCQlyZXR1cm4gMTsKKworCS8qIE1haW4gbG9vcCAqLworCXdoaWxlICgxKSB7CisvLyByZWluaXQgc3R1ZmYgZnJvbSB0aW1lIHRvIHRpbWU/IGdvIGJhY2sgdG8gbWFrZV9pZmFjZV9saXN0CisvLyBldmVyeSBOIG1pbnV0ZXM/CisJCWZkX3NldCByZmRzOworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJaW50IGk7CisKKwkJRkRfWkVSTygmcmZkcyk7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fc29ja2V0czsgaSsrKQorCQkJRkRfU0VUKGZkc1tpXSwgJnJmZHMpOworCQl0di50dl9zZWMgPSBTRUxFQ1RfVElNRU9VVDsKKwkJdHYudHZfdXNlYyA9IDA7CisJCWlmIChzZWxlY3QobWF4X3NvY2tldCArIDEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpID4gMCkgeworCQkJaW50IHBhY2tsZW47CisJCQlzdHJ1Y3QgZGhjcF9wYWNrZXQgZGhjcF9tc2c7CisKKwkJCS8qIHNlcnZlciAqLworCQkJaWYgKEZEX0lTU0VUKGZkc1swXSwgJnJmZHMpKSB7CisJCQkJcGFja2xlbiA9IHVkaGNwX3JlY3Zfa2VybmVsX3BhY2tldCgmZGhjcF9tc2csIGZkc1swXSk7CisJCQkJaWYgKHBhY2tsZW4gPiAwKSB7CisJCQkJCXBhc3NfdG9fY2xpZW50KCZkaGNwX21zZywgcGFja2xlbiwgZmRzKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIGNsaWVudHMgKi8KKwkJCWZvciAoaSA9IDE7IGkgPCBudW1fc29ja2V0czsgaSsrKSB7CisJCQkJc3RydWN0IHNvY2thZGRyX2luIGNsaWVudF9hZGRyOworCQkJCXNvY2tsZW5fdCBhZGRyX3NpemU7CisKKwkJCQlpZiAoIUZEX0lTU0VUKGZkc1tpXSwgJnJmZHMpKQorCQkJCQljb250aW51ZTsKKworCQkJCWFkZHJfc2l6ZSA9IHNpemVvZihjbGllbnRfYWRkcik7CisJCQkJcGFja2xlbiA9IHJlY3Zmcm9tKGZkc1tpXSwgJmRoY3BfbXNnLCBzaXplb2YoZGhjcF9tc2cpLCAwLAorCQkJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSgmY2xpZW50X2FkZHIpLCAmYWRkcl9zaXplKTsKKwkJCQlpZiAocGFja2xlbiA8PSAwKQorCQkJCQljb250aW51ZTsKKworCQkJCS8qIEdldCBvdXIgSVAgb24gY29ycmVzcG9uZGluZyBjbGllbnRfaWZhY2UgKi8KKy8vIFJGQyAxNTQyCisvLyA0LjEgR2VuZXJhbCBCT09UUCBQcm9jZXNzaW5nIGZvciBSZWxheSBBZ2VudHMKKy8vIDQuMS4xIEJPT1RSRVFVRVNUIE1lc3NhZ2VzCisvLyAgIElmIHRoZSByZWxheSBhZ2VudCBkb2VzIGRlY2lkZSB0byByZWxheSB0aGUgcmVxdWVzdCwgaXQgTVVTVCBleGFtaW5lCisvLyAgIHRoZSAnZ2lhZGRyJyAoImdhdGV3YXkiIElQIGFkZHJlc3MpIGZpZWxkLiAgSWYgdGhpcyBmaWVsZCBpcyB6ZXJvLAorLy8gICB0aGUgcmVsYXkgYWdlbnQgTVVTVCBmaWxsIHRoaXMgZmllbGQgd2l0aCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUKKy8vICAgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZC4gIElmIHRoZSBpbnRlcmZhY2UgaGFzCisvLyAgIG1vcmUgdGhhbiBvbmUgSVAgYWRkcmVzcyBsb2dpY2FsbHkgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGUgcmVsYXkKKy8vICAgYWdlbnQgU0hPVUxEIGNob29zZSBvbmUgSVAgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBpbnRlcmZhY2UgYW5kCisvLyAgIHVzZSBpdCBjb25zaXN0ZW50bHkgZm9yIGFsbCBCT09UUCBtZXNzYWdlcyBpdCByZWxheXMuICBJZiB0aGUKKy8vICAgJ2dpYWRkcicgZmllbGQgY29udGFpbnMgc29tZSBub24temVybyB2YWx1ZSwgdGhlICdnaWFkZHInIGZpZWxkIE1VU1QKKy8vICAgTk9UIGJlIG1vZGlmaWVkLiAgVGhlIHJlbGF5IGFnZW50IE1VU1QgTk9ULCB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcywKKy8vICAgZmlsbCB0aGUgJ2dpYWRkcicgZmllbGQgd2l0aCBhIGJyb2FkY2FzdCBhZGRyZXNzIGFzIGlzIHN1Z2dlc3RlZCBpbgorLy8gICBbMV0gKFNlY3Rpb24gOCwgc2l4dGggcGFyYWdyYXBoKS4KKworLy8gYnV0IHdoeT8gd2hhdCBpZiBzZXJ2ZXIgY2FuJ3Qgcm91dGUgc3VjaCBJUD8gQ2xpZW50IGlmYWNlcyBtYXkgYmUsIHNheSwgTkFUZWQhCisKKy8vIDQuMS4yIEJPT1RSRVBMWSBNZXNzYWdlcworLy8gICBCT09UUCByZWxheSBhZ2VudHMgcmVsYXkgQk9PVFJFUExZIG1lc3NhZ2VzIG9ubHkgdG8gQk9PVFAgY2xpZW50cy4KKy8vICAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIEJPT1RQIHNlcnZlcnMgdG8gc2VuZCBCT09UUkVQTFkgbWVzc2FnZXMKKy8vICAgZGlyZWN0bHkgdG8gdGhlIHJlbGF5IGFnZW50IGlkZW50aWZpZWQgaW4gdGhlICdnaWFkZHInIGZpZWxkLgorLy8gKHllYWggcmlnaHQsIHVubGVzcyBpdCBpcyBpbXBvc3NpYmxlLi4uIHNlZSBjb21tZW50IGFib3ZlKQorLy8gICBUaGVyZWZvcmUsIGEgcmVsYXkgYWdlbnQgbWF5IGFzc3VtZSB0aGF0IGFsbCBCT09UUkVQTFkgbWVzc2FnZXMgaXQKKy8vICAgcmVjZWl2ZXMgYXJlIGludGVuZGVkIGZvciBCT09UUCBjbGllbnRzIG9uIGl0cyBkaXJlY3RseS1jb25uZWN0ZWQKKy8vICAgbmV0d29ya3MuCisvLworLy8gICBXaGVuIGEgcmVsYXkgYWdlbnQgcmVjZWl2ZXMgYSBCT09UUkVQTFkgbWVzc2FnZSwgaXQgc2hvdWxkIGV4YW1pbmUKKy8vICAgdGhlIEJPT1RQICdnaWFkZHInLCAneWlhZGRyJywgJ2NoYWRkcicsICdodHlwZScsIGFuZCAnaGxlbicgZmllbGRzLgorLy8gICBUaGVzZSBmaWVsZHMgc2hvdWxkIHByb3ZpZGUgYWRlcXVhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSByZWxheSBhZ2VudAorLy8gICB0byBkZWxpdmVyIHRoZSBCT09UUkVQTFkgbWVzc2FnZSB0byB0aGUgY2xpZW50LgorLy8KKy8vICAgVGhlICdnaWFkZHInIGZpZWxkIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBsb2dpY2FsIGludGVyZmFjZSBmcm9tCisvLyAgIHdoaWNoIHRoZSByZXBseSBtdXN0IGJlIHNlbnQgKGkuZS4sIHRoZSBob3N0IG9yIHJvdXRlciBpbnRlcmZhY2UKKy8vICAgY29ubmVjdGVkIHRvIHRoZSBzYW1lIG5ldHdvcmsgYXMgdGhlIEJPT1RQIGNsaWVudCkuICBJZiB0aGUgY29udGVudAorLy8gICBvZiB0aGUgJ2dpYWRkcicgZmllbGQgZG9lcyBub3QgbWF0Y2ggb25lIG9mIHRoZSByZWxheSBhZ2VudCdzCisvLyAgIGRpcmVjdGx5LWNvbm5lY3RlZCBsb2dpY2FsIGludGVyZmFjZXMsIHRoZSBCT09UUkVQTFkgbWVzc3NhZ2UgTVVTVCBiZQorLy8gICBzaWxlbnRseSBkaXNjYXJkZWQuCisJCQkJaWYgKHVkaGNwX3JlYWRfaW50ZXJmYWNlKGlmYWNlX2xpc3RbaV0sIE5VTEwsICZkaGNwX21zZy5nYXRld2F5X25pcCwgTlVMTCkpIHsKKwkJCQkJLyogRmFsbCBiYWNrIHRvIG91ciBJUCBvbiBzZXJ2ZXIgaWZhY2UgKi8KKy8vIHRoaXMgbWFrZXMgbW9yZSBzZW5zZSEKKwkJCQkJZGhjcF9tc2cuZ2F0ZXdheV9uaXAgPSBvdXJfbmlwOworCQkJCX0KKy8vIG1heWJlIGRoY3BfbXNnLmhvcHMrKz8gZHJvcCBwYWNrZXRzIHdpdGggdG9vIG1hbnkgaG9wcyAoUkZDIDE1NDIgc2F5cyA0IG9yIDE2KT8KKwkJCQlwYXNzX3RvX3NlcnZlcigmZGhjcF9tc2csIHBhY2tsZW4sIGksIGZkcywgJmNsaWVudF9hZGRyLCAmc2VydmVyX2FkZHIpOworCQkJfQorCQl9CisJCXhpZF9leHBpcmUoKTsKKwl9IC8qIHdoaWxlICgxKSAqLworCisJLyogcmV0dXJuIDA7IC0gbm90IHJlYWNoZWQgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZG9tYWluX2NvZGVjLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2RvbWFpbl9jb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzI1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2RvbWFpbl9jb2RlYy5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKworLyogUkZDMTAzNSBkb21haW4gY29tcHJlc3Npb24gcm91dGluZXMgKEMpIDIwMDcgR2FicmllbCBTb21sbyA8c29tbG8gYXQgY211LmVkdT4KKyAqCisgKiBMb29zZWx5IGJhc2VkIG9uIHRoZSBpc2MtZGhjcGQgaW1wbGVtZW50YXRpb24gYnkgZGhhbmtpbnNAaXNjLm9yZworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZmRlZiBETlNfQ09NUFJfVEVTVElORworIyBkZWZpbmUgRkFTVF9GVU5DIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIHhtYWxsb2MgbWFsbG9jCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjZWxzZQorIyBpbmNsdWRlICJjb21tb24uaCIKKyNlbmRpZgorCisjZGVmaW5lIE5TX01BWEROQU1FICAxMDI1CS8qIG1heCBkb21haW4gbmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgTlNfTUFYQ0ROQU1FICAyNTUJLyogbWF4IGNvbXByZXNzZWQgZG9tYWluIG5hbWUgbGVuZ3RoICovCisjZGVmaW5lIE5TX01BWExBQkVMICAgIDYzCS8qIG1heCBsYWJlbCBsZW5ndGggKi8KKyNkZWZpbmUgTlNfTUFYRE5TUkNIICAgIDYJLyogbWF4IGRvbWFpbnMgaW4gc2VhcmNoIHBhdGggKi8KKyNkZWZpbmUgTlNfQ01QUlNGTEdTIDB4YzAJLyogbmFtZSBjb21wcmVzc2lvbiBwb2ludGVyIGZsYWcgKi8KKworCisvKiBFeHBhbmQgYSBSRkMxMDM1LWNvbXByZXNzZWQgbGlzdCBvZiBkb21haW4gbmFtZXMgImNzdHIiLCBvZiBsZW5ndGggImNsZW4iOworICogcmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgc3BhY2Utc2VwYXJhdGVkIGRvbWFpbnMsCisgKiBwcmVmaXhlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBzdHJpbmcgcHJlLCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAqLworY2hhciogRkFTVF9GVU5DIGRuYW1lX2RlYyhjb25zdCB1aW50OF90ICpjc3RyLCBpbnQgY2xlbiwgY29uc3QgY2hhciAqcHJlKQoreworCWNoYXIgKnJldCA9IHJldDsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqZHN0ID0gTlVMTDsKKworCS8qIFdlIG1ha2UgdHdvIHBhc3NlcyBvdmVyIHRoZSBjc3RyIHN0cmluZy4gRmlyc3QsIHdlIGNvbXB1dGUKKwkgKiBob3cgbG9uZyB0aGUgcmVzdWx0aW5nIHN0cmluZyB3b3VsZCBiZS4gVGhlbiB3ZSBhbGxvY2F0ZSBhCisJICogbmV3IGJ1ZmZlciBvZiB0aGUgcmVxdWlyZWQgbGVuZ3RoLCBhbmQgZmlsbCBpdCBpbiB3aXRoIHRoZQorCSAqIGV4cGFuZGVkIGNvbnRlbnQuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBhcHByb2FjaCBpcyBub3QKKwkgKiBoYXZpbmcgdG8gZGVhbCB3aXRoIHJlcXVpcmluZyBjYWxsZXJzIHRvIHN1cHBseSB0aGVpciBvd24KKwkgKiBidWZmZXIsIHRoZW4gaGF2aW5nIHRvIGNoZWNrIGlmIGl0J3Mgc3VmZmljaWVudGx5IGxhcmdlLCBldGMuCisJICovCisJd2hpbGUgKDEpIHsKKwkJLyogbm90ZTogInJldHVybiBOVUxMIiBiZWxvdyBhcmUgbGVhay1zYWZlIHNpbmNlCisJCSAqIGRzdCBpc24ndCB5ZXQgYWxsb2NhdGVkICovCisJCWNvbnN0IHVpbnQ4X3QgKmM7CisJCXVuc2lnbmVkIGNydHBvcywgcmV0cG9zLCBkZXB0aCwgbGVuOworCisJCWNydHBvcyA9IHJldHBvcyA9IGRlcHRoID0gbGVuID0gMDsKKwkJd2hpbGUgKGNydHBvcyA8IGNsZW4pIHsKKwkJCWMgPSBjc3RyICsgY3J0cG9zOworCisJCQlpZiAoKCpjICYgTlNfQ01QUlNGTEdTKSA9PSBOU19DTVBSU0ZMR1MpIHsKKwkJCQkvKiBwb2ludGVyICovCisJCQkJaWYgKGNydHBvcyArIDIgPiBjbGVuKSAvKiBubyBvZmZzZXQgdG8ganVtcCB0bz8gYWJvcnQgKi8KKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJaWYgKHJldHBvcyA9PSAwKSAvKiB0b3BsZXZlbD8gc2F2ZSByZXR1cm4gc3BvdCAqLworCQkJCQlyZXRwb3MgPSBjcnRwb3MgKyAyOworCQkJCWRlcHRoKys7CisJCQkJY3J0cG9zID0gKChjWzBdICYgMHgzZikgPDwgOCkgfCBjWzFdOyAvKiBqdW1wICovCisJCQl9IGVsc2UgaWYgKCpjKSB7CisJCQkJLyogbGFiZWwgKi8KKwkJCQlpZiAoY3J0cG9zICsgKmMgKyAxID4gY2xlbikgLyogbGFiZWwgdG9vIGxvbmc/IGFib3J0ICovCisJCQkJCXJldHVybiBOVUxMOworCQkJCWlmIChkc3QpCisJCQkJCW1lbWNweShkc3QgKyBsZW4sIGMgKyAxLCAqYyk7CisJCQkJbGVuICs9ICpjICsgMTsKKwkJCQljcnRwb3MgKz0gKmMgKyAxOworCQkJCWlmIChkc3QpCisJCQkJCWRzdFtsZW4gLSAxXSA9ICcuJzsKKwkJCX0gZWxzZSB7CisJCQkJLyogTlVMOiBlbmQgb2YgY3VycmVudCBkb21haW4gbmFtZSAqLworCQkJCWlmIChyZXRwb3MgPT0gMCkgeworCQkJCQkvKiB0b3BsZXZlbD8ga2VlcCBnb2luZyAqLworCQkJCQljcnRwb3MrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiByZXR1cm4gdG8gdG9wbGV2ZWwgc2F2ZWQgc3BvdCAqLworCQkJCQljcnRwb3MgPSByZXRwb3M7CisJCQkJCXJldHBvcyA9IGRlcHRoID0gMDsKKwkJCQl9CisJCQkJaWYgKGRzdCkKKwkJCQkJZHN0W2xlbiAtIDFdID0gJyAnOworCQkJfQorCisJCQlpZiAoZGVwdGggPiBOU19NQVhETlNSQ0ggLyogdG9vIG1hbnkganVtcHM/IGFib3J0LCBpdCdzIGEgbG9vcCAqLworCQkJIHx8IGxlbiA+IE5TX01BWEROQU1FICogTlNfTUFYRE5TUkNIIC8qIHJlc3VsdCB0b28gbG9uZz8gYWJvcnQgKi8KKwkJCSkgeworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkJaWYgKCFsZW4pIC8qIGV4cGFuZGVkIHN0cmluZyBoYXMgMCBsZW5ndGg/IGFib3J0ICovCisJCQlyZXR1cm4gTlVMTDsKKworCQlpZiAoIWRzdCkgeyAvKiBmaXJzdCBwYXNzPyAqLworCQkJLyogYWxsb2NhdGUgZHN0IGJ1ZmZlciBhbmQgY29weSBwcmUgKi8KKwkJCXVuc2lnbmVkIHBsZW4gPSBzdHJsZW4ocHJlKTsKKwkJCXJldCA9IGRzdCA9IHhtYWxsb2MocGxlbiArIGxlbik7CisJCQltZW1jcHkoZHN0LCBwcmUsIHBsZW4pOworCQkJZHN0ICs9IHBsZW47CisJCX0gZWxzZSB7CisJCQlkc3RbbGVuIC0gMV0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDb252ZXJ0IGEgZG9tYWluIG5hbWUgKHNyYykgZnJvbSBodW1hbi1yZWFkYWJsZSAiZm9vLmJsYWguY29tIiBmb3JtYXQgaW50bworICogUkZDMTAzNSBlbmNvZGluZyAiXDAwM2Zvb1wwMDRibGFoXDAwM2NvbVwwMDAiLiBSZXR1cm4gYWxsb2NhdGVkIHN0cmluZywgb3IKKyAqIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJzLgorICovCitzdGF0aWMgdWludDhfdCAqY29udmVydF9kbmFtZShjb25zdCBjaGFyICpzcmMpCit7CisJdWludDhfdCBjLCAqcmVzLCAqbGVucHRyLCAqZHN0OworCWludCBsZW47CisKKwlyZXMgPSB4bWFsbG9jKHN0cmxlbihzcmMpICsgMik7CisJZHN0ID0gbGVucHRyID0gcmVzOworCWRzdCsrOworCisJZm9yICg7OykgeworCQljID0gKHVpbnQ4X3QpKnNyYysrOworCQlpZiAoYyA9PSAnLicgfHwgYyA9PSAnXDAnKSB7ICAvKiBlbmQgb2YgbGFiZWwgKi8KKwkJCWxlbiA9IGRzdCAtIGxlbnB0ciAtIDE7CisJCQkvKiBsYWJlbCB0b28gbG9uZywgdG9vIHNob3J0LCBvciB0d28gJy4ncyBpbiBhIHJvdz8gYWJvcnQgKi8KKwkJCWlmIChsZW4gPiBOU19NQVhMQUJFTCB8fCBsZW4gPT0gMCB8fCAoYyA9PSAnLicgJiYgKnNyYyA9PSAnLicpKSB7CisJCQkJZnJlZShyZXMpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJKmxlbnB0ciA9IGxlbjsKKwkJCWlmIChjID09ICdcMCcgfHwgKnNyYyA9PSAnXDAnKQkvKiAiIiBvciAiLiI6IGVuZCBvZiBzcmMgKi8KKwkJCQlicmVhazsKKwkJCWxlbnB0ciA9IGRzdCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSAgLyogdXBwZXJjYXNlPyBjb252ZXJ0IHRvIGxvd2VyICovCisJCQljICs9ICgnYScgLSAnQScpOworCQkqZHN0KysgPSBjOworCX0KKworCWlmIChkc3QgLSByZXMgPj0gTlNfTUFYQ0ROQU1FKSB7ICAvKiBkbmFtZSB0b28gbG9uZz8gYWJvcnQgKi8KKwkJZnJlZShyZXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqZHN0ID0gMDsKKwlyZXR1cm4gcmVzOworfQorCisvKiBSZXR1cm5zIHRoZSBvZmZzZXQgd2l0aGluIGNzdHIgYXQgd2hpY2ggZG5hbWUgY2FuIGJlIGZvdW5kLCBvciAtMSAqLworc3RhdGljIGludCBmaW5kX29mZnNldChjb25zdCB1aW50OF90ICpjc3RyLCBpbnQgY2xlbiwgY29uc3QgdWludDhfdCAqZG5hbWUpCit7CisJY29uc3QgdWludDhfdCAqYywgKmQ7CisJaW50IG9mZjsKKworCS8qIGZpbmQgYWxsIGxhYmVscyBpbiBjc3RyICovCisJb2ZmID0gMDsKKwl3aGlsZSAob2ZmIDwgY2xlbikgeworCQljID0gY3N0ciArIG9mZjsKKworCQlpZiAoKCpjICYgTlNfQ01QUlNGTEdTKSA9PSBOU19DTVBSU0ZMR1MpIHsgIC8qIHBvaW50ZXIsIHNraXAgKi8KKwkJCW9mZiArPSAyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpjKSB7ICAvKiBsYWJlbCwgdHJ5IG1hdGNoaW5nIGRuYW1lICovCisJCQlkID0gZG5hbWU7CisJCQl3aGlsZSAoMSkgeworCQkJCXVuc2lnbmVkIGxlbjEgPSAqYyArIDE7CisJCQkJaWYgKG1lbWNtcChjLCBkLCBsZW4xKSAhPSAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAobGVuMSA9PSAxKSAgLyogYXQgdGVybWluYXRpbmcgTlVMIC0gbWF0Y2gsIHJldHVybiBvZmZzZXQgKi8KKwkJCQkJcmV0dXJuIG9mZjsKKwkJCQlkICs9IGxlbjE7CisJCQkJYyArPSBsZW4xOworCQkJCWlmICgoKmMgJiBOU19DTVBSU0ZMR1MpID09IE5TX0NNUFJTRkxHUykgIC8qIHBvaW50ZXIsIGp1bXAgKi8KKwkJCQkJYyA9IGNzdHIgKyAoKChjWzBdICYgMHgzZikgPDwgOCkgfCBjWzFdKTsKKwkJCX0KKwkJCW9mZiArPSBjc3RyW29mZl0gKyAxOworCQkJY29udGludWU7CisJCX0KKwkJLyogTlVMLCBza2lwICovCisJCW9mZisrOworCX0KKworCXJldHVybiAtMTsKK30KKworLyogQ29tcHV0ZXMgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvIGNzdHIgc28gdGhhdCBzcmMgd291bGQgYmUgYWRkZWQgdG8KKyAqIHRoZSBjb21wcmVzc2lvbiAoYmVzdCBjYXNlLCBpdCdzIGEgMi1ieXRlIHBvaW50ZXIgdG8gc29tZSBvZmZzZXQgd2l0aGluCisgKiBjc3RyOyB3b3JzdCBjYXNlLCBpdCdzIGFsbCBvZiBzcmMsIGNvbnZlcnRlZCB0byA8ND5ob3N0PDM+Y29tPDA+IGZvcm1hdCkuCisgKiBUaGUgY29tcHV0ZWQgc3RyaW5nIGlzIHJldHVybmVkIGRpcmVjdGx5OyBpdHMgbGVuZ3RoIGlzIHJldHVybmVkIHZpYSByZXRsZW47CisgKiBOVUxMIGFuZCAwLCByZXNwZWN0aXZlbHksIGFyZSByZXR1cm5lZCBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK3VpbnQ4X3QqIEZBU1RfRlVOQyBkbmFtZV9lbmMoY29uc3QgdWludDhfdCAqY3N0ciwgaW50IGNsZW4sIGNvbnN0IGNoYXIgKnNyYywgaW50ICpyZXRsZW4pCit7CisJdWludDhfdCAqZCwgKmRuYW1lOworCWludCBvZmY7CisKKwlkbmFtZSA9IGNvbnZlcnRfZG5hbWUoc3JjKTsKKwlpZiAoZG5hbWUgPT0gTlVMTCkgeworCQkqcmV0bGVuID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZCA9IGRuYW1lOworCXdoaWxlICgqZCkgeworCQlpZiAoY3N0cikgeworCQkJb2ZmID0gZmluZF9vZmZzZXQoY3N0ciwgY2xlbiwgZCk7CisJCQlpZiAob2ZmID49IDApIHsJLyogZm91bmQgYSBtYXRjaCwgYWRkIHBvaW50ZXIgYW5kIHJldHVybiAqLworCQkJCSpkKysgPSBOU19DTVBSU0ZMR1MgfCAob2ZmID4+IDgpOworCQkJCSpkID0gb2ZmOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWQgKz0gKmQgKyAxOworCX0KKworCSpyZXRsZW4gPSBkIC0gZG5hbWUgKyAxOworCXJldHVybiBkbmFtZTsKK30KKworI2lmZGVmIEROU19DT01QUl9URVNUSU5HCisvKiBnY2MgLVdhbGwgLURETlNfQ09NUFJfVEVTVElORyBkb21haW5fY29kZWMuYyAtbyBkb21haW5fY29kZWMgJiYgLi9kb21haW5fY29kZWMgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbGVuOworCXVpbnQ4X3QgKmVuY29kZWQ7CisKKyNkZWZpbmUgRE5BTUVfREVDKGVuY29kZWQscHJlKSBkbmFtZV9kZWMoKHVpbnQ4X3QqKShlbmNvZGVkKSwgc2l6ZW9mKGVuY29kZWQpLCAocHJlKSkKKwlwcmludGYoIiclcydcbiIsICAgICAgIEROQU1FX0RFQygiXDRob3N0XDNjb21cMCIsICJ0ZXN0MToiKSk7CisJcHJpbnRmKCJ0ZXN0MjonJXMnXG4iLCBETkFNRV9ERUMoIlw0aG9zdFwzY29tXDBcNGhvc3RcM2NvbVwwIiwgIiIpKTsKKwlwcmludGYoInRlc3QzOiclcydcbiIsIEROQU1FX0RFQygiXDRob3N0XDNjb21cMFx4QzBcMCIsICIiKSk7CisJcHJpbnRmKCJ0ZXN0NDonJXMnXG4iLCBETkFNRV9ERUMoIlw0aG9zdFwzY29tXDBceEMwXDUiLCAiIikpOworCXByaW50ZigidGVzdDU6JyVzJ1xuIiwgRE5BTUVfREVDKCJcNGhvc3RcM2NvbVwwXHhDMFw1XDF6XHhDMFx4QSIsICIiKSk7CisKKyNkZWZpbmUgRE5BTUVfRU5DKGNhY2hlLHNvdXJjZSxsZW5wKSBkbmFtZV9lbmMoKHVpbnQ4X3QqKShjYWNoZSksIHNpemVvZihjYWNoZSksIChzb3VyY2UpLCAobGVucCkpCisJZW5jb2RlZCA9IGRuYW1lX2VuYyhOVUxMLCAwLCAidGVzdC5uZXQiLCAmbGVuKTsKKwlwcmludGYoInRlc3Q2OiclcycgbGVuOiVkXG4iLCBkbmFtZV9kZWMoZW5jb2RlZCwgbGVuLCAiIiksIGxlbik7CisJZW5jb2RlZCA9IEROQU1FX0VOQygiXDNuZXRcMCIsICJ0ZXN0Lm5ldCIsICZsZW4pOworCXByaW50ZigidGVzdDc6JyVzJyBsZW46JWRcbiIsIGRuYW1lX2RlYyhlbmNvZGVkLCBsZW4sICIiKSwgbGVuKTsKKwllbmNvZGVkID0gRE5BTUVfRU5DKCJcNHRlc3RcM25ldFwwIiwgInRlc3QubmV0IiwgJmxlbik7CisJcHJpbnRmKCJ0ZXN0ODonJXMnIGxlbjolZFxuIiwgZG5hbWVfZGVjKGVuY29kZWQsIGxlbiwgIiIpLCBsZW4pOworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2R1bXBsZWFzZXMuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZHVtcGxlYXNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2Q3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2R1bXBsZWFzZXMuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZHVtcGxlYXNlc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1yfC1hXSBbLWYgTEVBU0VGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBkdW1wbGVhc2VzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSBESENQIGxlYXNlcyBncmFudGVkIGJ5IHVkaGNwZFxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktZiwtLWZpbGU9RklMRQlMZWFzZSBmaWxlIgorLy91c2FnZTogICAgICJcbgktciwtLXJlbWFpbmluZwlTaG93IHJlbWFpbmluZyB0aW1lIgorLy91c2FnZTogICAgICJcbgktYSwtLWFic29sdXRlCVNob3cgZXhwaXJhdGlvbiB0aW1lIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWYgRklMRQlMZWFzZSBmaWxlIgorLy91c2FnZTogICAgICJcbgktcglTaG93IHJlbWFpbmluZyB0aW1lIgorLy91c2FnZTogICAgICJcbgktYQlTaG93IGV4cGlyYXRpb24gdGltZSIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCitpbnQgZHVtcGxlYXNlc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZHVtcGxlYXNlc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCWludCBpOworCXVuc2lnbmVkIG9wdDsKKwlpbnQ2NF90IHdyaXR0ZW5fYXQsIGN1cnIsIGV4cGlyZXNfYWJzOworCWNvbnN0IGNoYXIgKmZpbGUgPSBMRUFTRVNfRklMRTsKKwlzdHJ1Y3QgZHluX2xlYXNlIGxlYXNlOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisKKwllbnVtIHsKKwkJT1BUX2EgPSAweDEsIC8vIC1hCisJCU9QVF9yID0gMHgyLCAvLyAtcgorCQlPUFRfZiA9IDB4NCwgLy8gLWYKKwl9OworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBkdW1wbGVhc2VzX2xvbmdvcHRzW10gQUxJR04xID0KKwkJImFic29sdXRlXDAiICBOb19hcmd1bWVudCAgICAgICAiYSIKKwkJInJlbWFpbmluZ1wwIiBOb19hcmd1bWVudCAgICAgICAiciIKKwkJImZpbGVcMCIgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiZiIKKwkJOworCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGR1bXBsZWFzZXNfbG9uZ29wdHM7CisjZW5kaWYKKwlpbml0X3VuaWNvZGUoKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0wOmEtLXI6ci0tYSI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImFyZjoiLCAmZmlsZSk7CisKKwlmZCA9IHhvcGVuKGZpbGUsIE9fUkRPTkxZKTsKKworCXByaW50ZigiTWFjIEFkZHJlc3MgICAgICAgSVAgQWRkcmVzcyAgICAgIEhvc3QgTmFtZSAgICAgICAgICAgRXhwaXJlcyAlc1xuIiwgKG9wdCAmIE9QVF9hKSA/ICJhdCIgOiAiaW4iKTsKKwkvKiAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIDI1NS4yNTUuMjU1LjI1NSBBQkNERUZHSElKS0xNTk9QUVJTIFdlZCBKdW4gMzAgMjE6NDk6MDggMTk5MyIgKi8KKwkvKiAgICAgIjEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgKi8KKworCXhyZWFkKGZkLCAmd3JpdHRlbl9hdCwgc2l6ZW9mKHdyaXR0ZW5fYXQpKTsKKwl3cml0dGVuX2F0ID0gU1dBUF9CRTY0KHdyaXR0ZW5fYXQpOworCWN1cnIgPSB0aW1lKE5VTEwpOworCWlmIChjdXJyIDwgd3JpdHRlbl9hdCkKKwkJd3JpdHRlbl9hdCA9IGN1cnI7IC8qIGxlYXNlIGZpbGUgZnJvbSBmdXR1cmUhIDopICovCisKKwl3aGlsZSAoZnVsbF9yZWFkKGZkLCAmbGVhc2UsIHNpemVvZihsZWFzZSkpID09IHNpemVvZihsZWFzZSkpIHsKKwkJY29uc3QgY2hhciAqZm10ID0gIjolMDJ4IiArIDE7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXByaW50ZihmbXQsIGxlYXNlLmxlYXNlX21hY1tpXSk7CisJCQlmbXQgPSAiOiUwMngiOworCQl9CisJCWFkZHIuc19hZGRyID0gbGVhc2UubGVhc2VfbmlwOworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJeworCQkJY2hhciAqdW5pX25hbWUgPSB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlX2ZpeGVkd2lkdGgoLypOVUxMLCovIGxlYXNlLmhvc3RuYW1lLCAxOSk7CisJCQlwcmludGYoIiAlLTE2cyVzICIsIGluZXRfbnRvYShhZGRyKSwgdW5pX25hbWUpOworCQkJZnJlZSh1bmlfbmFtZSk7CisJCX0KKyNlbHNlCisJCS8qIGFjdHVhbGx5LCAxNSsxIGFuZCAxOSsxLCArMSBpcyBhIHNwYWNlIGJldHdlZW4gY29sdW1ucyAqLworCQkvKiBsZWFzZS5ob3N0bmFtZSBpcyBjaGFyWzIwXSBhbmQgaXMgYWx3YXlzIE5VTCB0ZXJtaW5hdGVkICovCisJCXByaW50ZigiICUtMTZzJS0yMHMiLCBpbmV0X250b2EoYWRkciksIGxlYXNlLmhvc3RuYW1lKTsKKyNlbmRpZgorCQlleHBpcmVzX2FicyA9IG50b2hsKGxlYXNlLmV4cGlyZXMpICsgd3JpdHRlbl9hdDsKKwkJaWYgKGV4cGlyZXNfYWJzIDw9IGN1cnIpIHsKKwkJCXB1dHMoImV4cGlyZWQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghKG9wdCAmIE9QVF9hKSkgeyAvKiBubyAtYSAqLworCQkJdW5zaWduZWQgZCwgaCwgbTsKKwkJCXVuc2lnbmVkIGV4cGlyZXMgPSBleHBpcmVzX2FicyAtIGN1cnI7CisJCQlkID0gZXhwaXJlcyAvICgyNCo2MCo2MCk7IGV4cGlyZXMgJT0gKDI0KjYwKjYwKTsKKwkJCWggPSBleHBpcmVzIC8gKDYwKjYwKTsgZXhwaXJlcyAlPSAoNjAqNjApOworCQkJbSA9IGV4cGlyZXMgLyA2MDsgZXhwaXJlcyAlPSA2MDsKKwkJCWlmIChkKQorCQkJCXByaW50ZigiJXUgZGF5cyAiLCBkKTsKKwkJCXByaW50ZigiJTAydTolMDJ1OiUwMnVcbiIsIGgsIG0sICh1bnNpZ25lZClleHBpcmVzKTsKKwkJfSBlbHNlIHsgLyogLWEgKi8KKwkJCXRpbWVfdCB0ID0gZXhwaXJlc19hYnM7CisJCQlmcHV0cyhjdGltZSgmdCksIHN0ZG91dCk7CisJCX0KKwl9CisJLyogY2xvc2UoZmQpOyAqLworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2ZpbGVzLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL2ZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0MGYzYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvZmlsZXMuYwpAQCAtMCwwICsxLDIxNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogREhDUCBzZXJ2ZXIgY29uZmlnIGFuZCBsZWFzZSBmaWxlIG1hbmlwdWxhdGlvbgorICoKKyAqIFJld3JpdGUgYnkgUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4gSnVseSAyMDAxCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisKKy8qIG9uIHRoZXNlIGZ1bmN0aW9ucywgbWFrZSBzdXJlIHlvdXIgZGF0YXR5cGUgbWF0Y2hlcyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgcmVhZF9zdHIoY29uc3QgY2hhciAqbGluZSwgdm9pZCAqYXJnKQoreworCWNoYXIgKipkZXN0ID0gYXJnOworCisJZnJlZSgqZGVzdCk7CisJKmRlc3QgPSB4c3RyZHVwKGxpbmUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyByZWFkX3UzMihjb25zdCBjaGFyICpsaW5lLCB2b2lkICphcmcpCit7CisJKih1aW50MzJfdCopYXJnID0gYmJfc3RydG91MzIobGluZSwgTlVMTCwgMTApOworCXJldHVybiBlcnJubyA9PSAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyByZWFkX3N0YXRpY2xlYXNlKGNvbnN0IGNoYXIgKmNvbnN0X2xpbmUsIHZvaWQgKmFyZykKK3sKKwljaGFyICpsaW5lOworCWNoYXIgKm1hY19zdHJpbmc7CisJY2hhciAqaXBfc3RyaW5nOworCXN0cnVjdCBldGhlcl9hZGRyIG1hY19ieXRlczsgLyogaXQncyAic3RydWN0IHsgdWludDhfdCBtYWNbNl07IH0iICovCisJdWludDMyX3QgbmlwOworCisJLyogUmVhZCBtYWMgKi8KKwlsaW5lID0gKGNoYXIgKikgY29uc3RfbGluZTsKKwltYWNfc3RyaW5nID0gc3RydG9rX3IobGluZSwgIiBcdCIsICZsaW5lKTsKKwlpZiAoIW1hY19zdHJpbmcgfHwgIWV0aGVyX2F0b25fcihtYWNfc3RyaW5nLCAmbWFjX2J5dGVzKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZWFkIGlwICovCisJaXBfc3RyaW5nID0gc3RydG9rX3IoTlVMTCwgIiBcdCIsICZsaW5lKTsKKwlpZiAoIWlwX3N0cmluZyB8fCAhdWRoY3Bfc3RyMm5pcChpcF9zdHJpbmcsICZuaXApKQorCQlyZXR1cm4gMDsKKworCWFkZF9zdGF0aWNfbGVhc2UoYXJnLCAodWludDhfdCopICZtYWNfYnl0ZXMsIG5pcCk7CisKKwlsb2dfc3RhdGljX2xlYXNlcyhhcmcpOworCisJcmV0dXJuIDE7Cit9CisKKworc3RydWN0IGNvbmZpZ19rZXl3b3JkIHsKKwljb25zdCBjaGFyICprZXl3b3JkOworCWludCAoKmhhbmRsZXIpKGNvbnN0IGNoYXIgKmxpbmUsIHZvaWQgKnZhcikgRkFTVF9GVU5DOworCXZvaWQgKnZhcjsKKwljb25zdCBjaGFyICpkZWY7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbmZpZ19rZXl3b3JkIGtleXdvcmRzW10gPSB7CisJLyoga2V5d29yZCAgICAgICAgaGFuZGxlciAgICAgICAgICAgdmFyaWFibGUgYWRkcmVzcyAgICAgICAgICAgICAgIGRlZmF1bHQgKi8KKwl7InN0YXJ0IiAgICAgICAgLCB1ZGhjcF9zdHIybmlwICAgLCAmc2VydmVyX2NvbmZpZy5zdGFydF9pcCAgICAgLCAiMTkyLjE2OC4wLjIwIn0sCisJeyJlbmQiICAgICAgICAgICwgdWRoY3Bfc3RyMm5pcCAgICwgJnNlcnZlcl9jb25maWcuZW5kX2lwICAgICAgICwgIjE5Mi4xNjguMC4yNTQifSwKKwl7ImludGVyZmFjZSIgICAgLCByZWFkX3N0ciAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5pbnRlcmZhY2UgICAgLCAiZXRoMCJ9LAorCS8qIEF2b2lkICJtYXhfbGVhc2VzIHZhbHVlIG5vdCBzYW5lIiB3YXJuaW5nIGJ5IHNldHRpbmcgZGVmYXVsdAorCSAqIHRvIGRlZmF1bHRfZW5kX2lwIC0gZGVmYXVsdF9zdGFydF9pcCArIDE6ICovCisJeyJtYXhfbGVhc2VzIiAgICwgcmVhZF91MzIgICAgICAgICwgJnNlcnZlcl9jb25maWcubWF4X2xlYXNlcyAgICwgIjIzNSJ9LAorCXsiYXV0b190aW1lIiAgICAsIHJlYWRfdTMyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLmF1dG9fdGltZSAgICAsICI3MjAwIn0sCisJeyJkZWNsaW5lX3RpbWUiICwgcmVhZF91MzIgICAgICAgICwgJnNlcnZlcl9jb25maWcuZGVjbGluZV90aW1lICwgIjM2MDAifSwKKwl7ImNvbmZsaWN0X3RpbWUiLCByZWFkX3UzMiAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5jb25mbGljdF90aW1lLCAiMzYwMCJ9LAorCXsib2ZmZXJfdGltZSIgICAsIHJlYWRfdTMyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLm9mZmVyX3RpbWUgICAsICI2MCJ9LAorCXsibWluX2xlYXNlIiAgICAsIHJlYWRfdTMyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLm1pbl9sZWFzZV9zZWMsICI2MCJ9LAorCXsibGVhc2VfZmlsZSIgICAsIHJlYWRfc3RyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLmxlYXNlX2ZpbGUgICAsIExFQVNFU19GSUxFfSwKKwl7InBpZGZpbGUiICAgICAgLCByZWFkX3N0ciAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5waWRmaWxlICAgICAgLCAiL3Zhci9ydW4vdWRoY3BkLnBpZCJ9LAorCXsic2lhZGRyIiAgICAgICAsIHVkaGNwX3N0cjJuaXAgICAsICZzZXJ2ZXJfY29uZmlnLnNpYWRkcl9uaXAgICAsICIwLjAuMC4wIn0sCisJLyoga2V5d29yZHMgd2l0aCBubyBkZWZhdWx0cyBtdXN0IGJlIGxhc3QhICovCisJeyJvcHRpb24iICAgICAgICwgdWRoY3Bfc3RyMm9wdHNldCwgJnNlcnZlcl9jb25maWcub3B0aW9ucyAgICAgICwgIiJ9LAorCXsib3B0IiAgICAgICAgICAsIHVkaGNwX3N0cjJvcHRzZXQsICZzZXJ2ZXJfY29uZmlnLm9wdGlvbnMgICAgICAsICIifSwKKwl7Im5vdGlmeV9maWxlIiAgLCByZWFkX3N0ciAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5ub3RpZnlfZmlsZSAgLCBOVUxMfSwKKwl7InNuYW1lIiAgICAgICAgLCByZWFkX3N0ciAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5zbmFtZSAgICAgICAgLCBOVUxMfSwKKwl7ImJvb3RfZmlsZSIgICAgLCByZWFkX3N0ciAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5ib290X2ZpbGUgICAgLCBOVUxMfSwKKwl7InN0YXRpY19sZWFzZSIgLCByZWFkX3N0YXRpY2xlYXNlLCAmc2VydmVyX2NvbmZpZy5zdGF0aWNfbGVhc2VzLCAiIn0sCit9OworZW51bSB7IEtXU19XSVRIX0RFRkFVTFRTID0gQVJSQVlfU0laRShrZXl3b3JkcykgLSA2IH07CisKK3ZvaWQgRkFTVF9GVU5DIHJlYWRfY29uZmlnKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljb25zdCBzdHJ1Y3QgY29uZmlnX2tleXdvcmQgKms7CisJdW5zaWduZWQgaTsKKwljaGFyICp0b2tlblsyXTsKKworCWZvciAoaSA9IDA7IGkgPCBLV1NfV0lUSF9ERUZBVUxUUzsgaSsrKQorCQlrZXl3b3Jkc1tpXS5oYW5kbGVyKGtleXdvcmRzW2ldLmRlZiwga2V5d29yZHNbaV0udmFyKTsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuKGZpbGUpOworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJZm9yIChrID0ga2V5d29yZHMsIGkgPSAwOyBpIDwgQVJSQVlfU0laRShrZXl3b3Jkcyk7IGsrKywgaSsrKSB7CisJCQlpZiAoc3RyY2FzZWNtcCh0b2tlblswXSwgay0+a2V5d29yZCkgPT0gMCkgeworCQkJCWlmICghay0+aGFuZGxlcih0b2tlblsxXSwgay0+dmFyKSkgeworCQkJCQliYl9lcnJvcl9tc2coImNhbid0IHBhcnNlIGxpbmUgJXUgaW4gJXMiLAorCQkJCQkJCXBhcnNlci0+bGluZW5vLCBmaWxlKTsKKwkJCQkJLyogcmVzZXQgYmFjayB0byB0aGUgZGVmYXVsdCB2YWx1ZSAqLworCQkJCQlrLT5oYW5kbGVyKGstPmRlZiwgay0+dmFyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKwlzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwID0gbnRvaGwoc2VydmVyX2NvbmZpZy5zdGFydF9pcCk7CisJc2VydmVyX2NvbmZpZy5lbmRfaXAgPSBudG9obChzZXJ2ZXJfY29uZmlnLmVuZF9pcCk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHdyaXRlX2xlYXNlcyh2b2lkKQoreworCWludCBmZDsKKwl1bnNpZ25lZCBpOworCWxlYXNldGltZV90IGN1cnI7CisJaW50NjRfdCB3cml0dGVuX2F0OworCisJZmQgPSBvcGVuX29yX3dhcm4oc2VydmVyX2NvbmZpZy5sZWFzZV9maWxlLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMpOworCWlmIChmZCA8IDApCisJCXJldHVybjsKKworCWN1cnIgPSB3cml0dGVuX2F0ID0gdGltZShOVUxMKTsKKworCXdyaXR0ZW5fYXQgPSBTV0FQX0JFNjQod3JpdHRlbl9hdCk7CisJZnVsbF93cml0ZShmZCwgJndyaXR0ZW5fYXQsIHNpemVvZih3cml0dGVuX2F0KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzOyBpKyspIHsKKwkJbGVhc2V0aW1lX3QgdG1wX3RpbWU7CisKKwkJaWYgKGdfbGVhc2VzW2ldLmxlYXNlX25pcCA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogU2NyZXcgd2l0aCB0aGUgdGltZSBpbiB0aGUgc3RydWN0LCBmb3IgZWFzaWVyIHdyaXRpbmcgKi8KKwkJdG1wX3RpbWUgPSBnX2xlYXNlc1tpXS5leHBpcmVzOworCisJCWdfbGVhc2VzW2ldLmV4cGlyZXMgLT0gY3VycjsKKwkJaWYgKChzaWduZWRfbGVhc2V0aW1lX3QpIGdfbGVhc2VzW2ldLmV4cGlyZXMgPCAwKQorCQkJZ19sZWFzZXNbaV0uZXhwaXJlcyA9IDA7CisJCWdfbGVhc2VzW2ldLmV4cGlyZXMgPSBodG9ubChnX2xlYXNlc1tpXS5leHBpcmVzKTsKKworCQkvKiBObyBlcnJvciBjaGVjay4gSWYgdGhlIGZpbGUgZ2V0cyB0cnVuY2F0ZWQsCisJCSAqIHdlIGxvc2Ugc29tZSBsZWFzZXMgb24gcmVzdGFydC4gT2ggd2VsbC4gKi8KKwkJZnVsbF93cml0ZShmZCwgJmdfbGVhc2VzW2ldLCBzaXplb2YoZ19sZWFzZXNbaV0pKTsKKworCQkvKiBUaGVuIHJlc3RvcmUgaXQgd2hlbiBkb25lICovCisJCWdfbGVhc2VzW2ldLmV4cGlyZXMgPSB0bXBfdGltZTsKKwl9CisJY2xvc2UoZmQpOworCisJaWYgKHNlcnZlcl9jb25maWcubm90aWZ5X2ZpbGUpIHsKKwkJY2hhciAqYXJndlszXTsKKwkJYXJndlswXSA9IHNlcnZlcl9jb25maWcubm90aWZ5X2ZpbGU7CisJCWFyZ3ZbMV0gPSBzZXJ2ZXJfY29uZmlnLmxlYXNlX2ZpbGU7CisJCWFyZ3ZbMl0gPSBOVUxMOworCQlzcGF3bl9hbmRfd2FpdChhcmd2KTsKKwl9Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHJlYWRfbGVhc2VzKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJc3RydWN0IGR5bl9sZWFzZSBsZWFzZTsKKwlpbnQ2NF90IHdyaXR0ZW5fYXQsIHRpbWVfcGFzc2VkOworCWludCBmZDsKKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMQorCXVuc2lnbmVkIGkgPSAwOworI2VuZGlmCisKKwlmZCA9IG9wZW5fb3Jfd2FybihmaWxlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGZ1bGxfcmVhZChmZCwgJndyaXR0ZW5fYXQsIHNpemVvZih3cml0dGVuX2F0KSkgIT0gc2l6ZW9mKHdyaXR0ZW5fYXQpKQorCQlnb3RvIHJldDsKKwl3cml0dGVuX2F0ID0gU1dBUF9CRTY0KHdyaXR0ZW5fYXQpOworCisJdGltZV9wYXNzZWQgPSB0aW1lKE5VTEwpIC0gd3JpdHRlbl9hdDsKKwkvKiBTdHJhbmdlIHdyaXR0ZW5fYXQsIG9yIGxlYXNlIGZpbGUgZnJvbSBvbGQgdmVyc2lvbiBvZiB1ZGhjcGQKKwkgKiB3aGljaCBoYWQgbm8gIndyaXR0ZW5fYXQiIGZpZWxkPyAqLworCWlmICgodWludDY0X3QpdGltZV9wYXNzZWQgPiAxMiAqIDYwICogNjApCisJCWdvdG8gcmV0OworCisJd2hpbGUgKGZ1bGxfcmVhZChmZCwgJmxlYXNlLCBzaXplb2YobGVhc2UpKSA9PSBzaXplb2YobGVhc2UpKSB7CisvL0ZJWE1FOiB3aGF0IGlmIGl0IG1hdGNoZXMgc29tZSBzdGF0aWMgbGVhc2U/CisJCXVpbnQzMl90IHkgPSBudG9obChsZWFzZS5sZWFzZV9uaXApOworCQlpZiAoeSA+PSBzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwICYmIHkgPD0gc2VydmVyX2NvbmZpZy5lbmRfaXApIHsKKwkJCXNpZ25lZF9sZWFzZXRpbWVfdCBleHBpcmVzID0gbnRvaGwobGVhc2UuZXhwaXJlcykgLSAoc2lnbmVkX2xlYXNldGltZV90KXRpbWVfcGFzc2VkOworCQkJaWYgKGV4cGlyZXMgPD0gMCkKKwkJCQljb250aW51ZTsKKwkJCS8qIE5COiBhZGRfbGVhc2UgdGFrZXMgInJlbGF0aXZlIHRpbWUiLCBJT1csCisJCQkgKiBsZWFzZSBkdXJhdGlvbiwgbm90IGxlYXNlIGRlYWRsaW5lLiAqLworCQkJaWYgKGFkZF9sZWFzZShsZWFzZS5sZWFzZV9tYWMsIGxlYXNlLmxlYXNlX25pcCwKKwkJCQkJZXhwaXJlcywKKwkJCQkJbGVhc2UuaG9zdG5hbWUsIHNpemVvZihsZWFzZS5ob3N0bmFtZSkKKwkJCQkpID09IDAKKwkJCSkgeworCQkJCWJiX2Vycm9yX21zZygidG9vIG1hbnkgbGVhc2VzIHdoaWxlIGxvYWRpbmcgJXMiLCBmaWxlKTsKKwkJCQlicmVhazsKKwkJCX0KKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMQorCQkJaSsrOworI2VuZGlmCisJCX0KKwl9CisJbG9nMSgiUmVhZCAlZCBsZWFzZXMiLCBpKTsKKyByZXQ6CisJY2xvc2UoZmQpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9sZWFzZXMuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvbGVhc2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViNjBiMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvbGVhc2VzLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IEp1bHkgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkaGNwZC5oIgorCisvKiBGaW5kIHRoZSBvbGRlc3QgZXhwaXJlZCBsZWFzZSwgTlVMTCBpZiB0aGVyZSBhcmUgbm8gZXhwaXJlZCBsZWFzZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZHluX2xlYXNlICpvbGRlc3RfZXhwaXJlZF9sZWFzZSh2b2lkKQoreworCXN0cnVjdCBkeW5fbGVhc2UgKm9sZGVzdF9sZWFzZSA9IE5VTEw7CisJbGVhc2V0aW1lX3Qgb2xkZXN0X3RpbWUgPSB0aW1lKE5VTEwpOworCXVuc2lnbmVkIGk7CisKKwkvKiBVbmV4cGlyZWQgbGVhc2VzIGhhdmUgZ19sZWFzZXNbaV0uZXhwaXJlcyA+PSBjdXJyZW50IHRpbWUKKwkgKiBhbmQgdGhlcmVmb3JlIGNhbid0IGV2ZXIgbWF0Y2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzOyBpKyspIHsKKwkJaWYgKGdfbGVhc2VzW2ldLmV4cGlyZXMgPCBvbGRlc3RfdGltZSkgeworCQkJb2xkZXN0X3RpbWUgPSBnX2xlYXNlc1tpXS5leHBpcmVzOworCQkJb2xkZXN0X2xlYXNlID0gJmdfbGVhc2VzW2ldOworCQl9CisJfQorCXJldHVybiBvbGRlc3RfbGVhc2U7Cit9CisKKy8qIENsZWFyIG91dCBhbGwgbGVhc2VzIHdpdGggbWF0Y2hpbmcgbm9uemVybyBjaGFkZHIgT1IgeWlhZGRyLgorICogSWYgY2hhZGRyID09IE5VTEwsIHRoaXMgaXMgYSBjb25mbGljdCBsZWFzZS4KKyAqLworc3RhdGljIHZvaWQgY2xlYXJfbGVhc2VzKGNvbnN0IHVpbnQ4X3QgKmNoYWRkciwgdWludDMyX3QgeWlhZGRyKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzOyBpKyspIHsKKwkJaWYgKChjaGFkZHIgJiYgbWVtY21wKGdfbGVhc2VzW2ldLmxlYXNlX21hYywgY2hhZGRyLCA2KSA9PSAwKQorCQkgfHwgKHlpYWRkciAmJiBnX2xlYXNlc1tpXS5sZWFzZV9uaXAgPT0geWlhZGRyKQorCQkpIHsKKwkJCW1lbXNldCgmZ19sZWFzZXNbaV0sIDAsIHNpemVvZihnX2xlYXNlc1tpXSkpOworCQl9CisJfQorfQorCisvKiBBZGQgYSBsZWFzZSBpbnRvIHRoZSB0YWJsZSwgY2xlYXJpbmcgb3V0IGFueSBvbGQgb25lcy4KKyAqIElmIGNoYWRkciA9PSBOVUxMLCB0aGlzIGlzIGEgY29uZmxpY3QgbGVhc2UuCisgKi8KK3N0cnVjdCBkeW5fbGVhc2UqIEZBU1RfRlVOQyBhZGRfbGVhc2UoCisJCWNvbnN0IHVpbnQ4X3QgKmNoYWRkciwgdWludDMyX3QgeWlhZGRyLAorCQlsZWFzZXRpbWVfdCBsZWFzZXRpbWUsCisJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLCBpbnQgaG9zdG5hbWVfbGVuKQoreworCXN0cnVjdCBkeW5fbGVhc2UgKm9sZGVzdDsKKworCS8qIGNsZWFuIG91dCBhbnkgb2xkIG9uZXMgKi8KKwljbGVhcl9sZWFzZXMoY2hhZGRyLCB5aWFkZHIpOworCisJb2xkZXN0ID0gb2xkZXN0X2V4cGlyZWRfbGVhc2UoKTsKKworCWlmIChvbGRlc3QpIHsKKwkJbWVtc2V0KG9sZGVzdCwgMCwgc2l6ZW9mKCpvbGRlc3QpKTsKKwkJaWYgKGhvc3RuYW1lKSB7CisJCQljaGFyICpwOworCisJCQlob3N0bmFtZV9sZW4rKzsgLyogaW5jbHVkZSBOVUwgKi8KKwkJCWlmIChob3N0bmFtZV9sZW4gPiBzaXplb2Yob2xkZXN0LT5ob3N0bmFtZSkpCisJCQkJaG9zdG5hbWVfbGVuID0gc2l6ZW9mKG9sZGVzdC0+aG9zdG5hbWUpOworCQkJcCA9IHNhZmVfc3RybmNweShvbGRlc3QtPmhvc3RuYW1lLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKTsKKwkJCS8qIHNhbml0aXphdGlvbiAocy9ub24tQVNDSUkvXi9nKSAqLworCQkJd2hpbGUgKCpwKSB7CisJCQkJaWYgKCpwIDwgJyAnIHx8ICpwID4gMTI2KQorCQkJCQkqcCA9ICdeJzsKKwkJCQlwKys7CisJCQl9CisJCX0KKwkJaWYgKGNoYWRkcikKKwkJCW1lbWNweShvbGRlc3QtPmxlYXNlX21hYywgY2hhZGRyLCA2KTsKKwkJb2xkZXN0LT5sZWFzZV9uaXAgPSB5aWFkZHI7CisJCW9sZGVzdC0+ZXhwaXJlcyA9IHRpbWUoTlVMTCkgKyBsZWFzZXRpbWU7CisJfQorCisJcmV0dXJuIG9sZGVzdDsKK30KKworLyogVHJ1ZSBpZiBhIGxlYXNlIGhhcyBleHBpcmVkICovCitpbnQgRkFTVF9GVU5DIGlzX2V4cGlyZWRfbGVhc2Uoc3RydWN0IGR5bl9sZWFzZSAqbGVhc2UpCit7CisJcmV0dXJuIChsZWFzZS0+ZXhwaXJlcyA8IChsZWFzZXRpbWVfdCkgdGltZShOVUxMKSk7Cit9CisKKy8qIEZpbmQgdGhlIGZpcnN0IGxlYXNlIHRoYXQgbWF0Y2hlcyBNQUMsIE5VTEwgaWYgbm8gbWF0Y2ggKi8KK3N0cnVjdCBkeW5fbGVhc2UqIEZBU1RfRlVOQyBmaW5kX2xlYXNlX2J5X21hYyhjb25zdCB1aW50OF90ICptYWMpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXM7IGkrKykKKwkJaWYgKG1lbWNtcChnX2xlYXNlc1tpXS5sZWFzZV9tYWMsIG1hYywgNikgPT0gMCkKKwkJCXJldHVybiAmZ19sZWFzZXNbaV07CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmluZCB0aGUgZmlyc3QgbGVhc2UgdGhhdCBtYXRjaGVzIElQLCBOVUxMIGlzIG5vIG1hdGNoICovCitzdHJ1Y3QgZHluX2xlYXNlKiBGQVNUX0ZVTkMgZmluZF9sZWFzZV9ieV9uaXAodWludDMyX3QgbmlwKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzOyBpKyspCisJCWlmIChnX2xlYXNlc1tpXS5sZWFzZV9uaXAgPT0gbmlwKQorCQkJcmV0dXJuICZnX2xlYXNlc1tpXTsKKworCXJldHVybiBOVUxMOworfQorCisvKiBDaGVjayBpZiB0aGUgSVAgaXMgdGFrZW47IGlmIGl0IGlzLCBhZGQgaXQgdG8gdGhlIGxlYXNlIHRhYmxlICovCitzdGF0aWMgaW50IG5vYm9keV9yZXNwb25kc190b19hcnAodWludDMyX3QgbmlwLCBjb25zdCB1aW50OF90ICpzYWZlX21hYykKK3sKKwlzdHJ1Y3QgaW5fYWRkciB0ZW1wOworCWludCByOworCisJciA9IGFycHBpbmcobmlwLCBzYWZlX21hYywKKwkJCXNlcnZlcl9jb25maWcuc2VydmVyX25pcCwKKwkJCXNlcnZlcl9jb25maWcuc2VydmVyX21hYywKKwkJCXNlcnZlcl9jb25maWcuaW50ZXJmYWNlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwl0ZW1wLnNfYWRkciA9IG5pcDsKKwliYl9pbmZvX21zZygiJXMgYmVsb25ncyB0byBzb21lb25lLCByZXNlcnZpbmcgaXQgZm9yICV1IHNlY29uZHMiLAorCQlpbmV0X250b2EodGVtcCksICh1bnNpZ25lZClzZXJ2ZXJfY29uZmlnLmNvbmZsaWN0X3RpbWUpOworCWFkZF9sZWFzZShOVUxMLCBuaXAsIHNlcnZlcl9jb25maWcuY29uZmxpY3RfdGltZSwgTlVMTCwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgYSBuZXcgdXNhYmxlICh3ZSB0aGluaykgYWRkcmVzcyAqLwordWludDMyX3QgRkFTVF9GVU5DIGZpbmRfZnJlZV9vcl9leHBpcmVkX25pcChjb25zdCB1aW50OF90ICpzYWZlX21hYykKK3sKKwl1aW50MzJfdCBhZGRyOworCXN0cnVjdCBkeW5fbGVhc2UgKm9sZGVzdF9sZWFzZSA9IE5VTEw7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUERfQkFTRV9JUF9PTl9NQUMKKwl1aW50MzJfdCBzdG9wOworCXVuc2lnbmVkIGksIGhhc2g7CisKKwkvKiBoYXNoIGh3YWRkcjogdXNlIHRoZSBTREJNIGhhc2hpbmcgYWxnb3JpdGhtLiAgU2VlbXMgdG8gZ2l2ZSBnb29kCisJICogZGlzcGVyc2FsIGV2ZW4gd2l0aCBzaW1pbGFybHktdmFsdWVkICJzdHJpbmdzIi4KKwkgKi8KKwloYXNoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQloYXNoICs9IHNhZmVfbWFjW2ldICsgKGhhc2ggPDwgNikgKyAoaGFzaCA8PCAxNikgLSBoYXNoOworCisJLyogcGljayBhIHNlZWQgYmFzZWQgb24gaHdhZGRyIHRoZW4gaXRlcmF0ZSB1bnRpbCB3ZSBmaW5kIGEgZnJlZSBhZGRyZXNzLiAqLworCWFkZHIgPSBzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwCisJCSsgKGhhc2ggJSAoMSArIHNlcnZlcl9jb25maWcuZW5kX2lwIC0gc2VydmVyX2NvbmZpZy5zdGFydF9pcCkpOworCXN0b3AgPSBhZGRyOworI2Vsc2UKKwlhZGRyID0gc2VydmVyX2NvbmZpZy5zdGFydF9pcDsKKyNkZWZpbmUgc3RvcCAoc2VydmVyX2NvbmZpZy5lbmRfaXAgKyAxKQorI2VuZGlmCisJZG8geworCQl1aW50MzJfdCBuaXA7CisJCXN0cnVjdCBkeW5fbGVhc2UgKmxlYXNlOworCisJCS8qIGllLCAxOTIuMTY4LjU1LjAgKi8KKwkJaWYgKChhZGRyICYgMHhmZikgPT0gMCkKKwkJCWdvdG8gbmV4dF9hZGRyOworCQkvKiBpZSwgMTkyLjE2OC41NS4yNTUgKi8KKwkJaWYgKChhZGRyICYgMHhmZikgPT0gMHhmZikKKwkJCWdvdG8gbmV4dF9hZGRyOworCQluaXAgPSBodG9ubChhZGRyKTsKKwkJLyogc2tpcCBvdXIgb3duIGFkZHJlc3MgKi8KKwkJaWYgKG5pcCA9PSBzZXJ2ZXJfY29uZmlnLnNlcnZlcl9uaXApCisJCQlnb3RvIG5leHRfYWRkcjsKKwkJLyogaXMgdGhpcyBhIHN0YXRpYyBsZWFzZSBhZGRyPyAqLworCQlpZiAoaXNfbmlwX3Jlc2VydmVkKHNlcnZlcl9jb25maWcuc3RhdGljX2xlYXNlcywgbmlwKSkKKwkJCWdvdG8gbmV4dF9hZGRyOworCisJCWxlYXNlID0gZmluZF9sZWFzZV9ieV9uaXAobmlwKTsKKwkJaWYgKCFsZWFzZSkgeworLy9UT0RPOiBESENQIHNlcnZlcnMgZG8gbm90IGFsd2F5cyBzaXQgb24gdGhlIHNhbWUgc3VibmV0IGFzIGNsaWVudHM6IHNob3VsZCAqcGluZyosIG5vdCBhcnAtcGluZyEKKwkJCWlmIChub2JvZHlfcmVzcG9uZHNfdG9fYXJwKG5pcCwgc2FmZV9tYWMpKQorCQkJCXJldHVybiBuaXA7CisJCX0gZWxzZSB7CisJCQlpZiAoIW9sZGVzdF9sZWFzZSB8fCBsZWFzZS0+ZXhwaXJlcyA8IG9sZGVzdF9sZWFzZS0+ZXhwaXJlcykKKwkJCQlvbGRlc3RfbGVhc2UgPSBsZWFzZTsKKwkJfQorCisgbmV4dF9hZGRyOgorCQlhZGRyKys7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDCisJCWlmIChhZGRyID4gc2VydmVyX2NvbmZpZy5lbmRfaXApCisJCQlhZGRyID0gc2VydmVyX2NvbmZpZy5zdGFydF9pcDsKKyNlbmRpZgorCX0gd2hpbGUgKGFkZHIgIT0gc3RvcCk7CisKKwlpZiAob2xkZXN0X2xlYXNlCisJICYmIGlzX2V4cGlyZWRfbGVhc2Uob2xkZXN0X2xlYXNlKQorCSAmJiBub2JvZHlfcmVzcG9uZHNfdG9fYXJwKG9sZGVzdF9sZWFzZS0+bGVhc2VfbmlwLCBzYWZlX21hYykKKwkpIHsKKwkJcmV0dXJuIG9sZGVzdF9sZWFzZS0+bGVhc2VfbmlwOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9wYWNrZXQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvcGFja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiNDJjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3AvcGFja2V0LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFBhY2tldCBvcHMKKyAqCisgKiBSZXdyaXRlIGJ5IFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IEp1bHkgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkaGNwZC5oIgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorCit2b2lkIEZBU1RfRlVOQyB1ZGhjcF9pbml0X2hlYWRlcihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgY2hhciB0eXBlKQoreworCW1lbXNldChwYWNrZXQsIDAsIHNpemVvZigqcGFja2V0KSk7CisJcGFja2V0LT5vcCA9IEJPT1RSRVFVRVNUOyAvKiBpZiBjbGllbnQgdG8gYSBzZXJ2ZXIgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIERIQ1BPRkZFUjoKKwljYXNlIERIQ1BBQ0s6CisJY2FzZSBESENQTkFLOgorCQlwYWNrZXQtPm9wID0gQk9PVFJFUExZOyAvKiBpZiBzZXJ2ZXIgdG8gY2xpZW50ICovCisJfQorCXBhY2tldC0+aHR5cGUgPSAxOyAvKiBldGhlcm5ldCAqLworCXBhY2tldC0+aGxlbiA9IDY7CisJcGFja2V0LT5jb29raWUgPSBodG9ubChESENQX01BR0lDKTsKKwlpZiAoREhDUF9FTkQgIT0gMCkKKwkJcGFja2V0LT5vcHRpb25zWzBdID0gREhDUF9FTkQ7CisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24ocGFja2V0LCBESENQX01FU1NBR0VfVFlQRSwgdHlwZSk7Cit9CisKKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMgordm9pZCBGQVNUX0ZVTkMgdWRoY3BfZHVtcF9wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQpCit7CisJY2hhciBidWZbc2l6ZW9mKHBhY2tldC0+Y2hhZGRyKSoyICsgMV07CisKKwlpZiAoZGhjcF92ZXJib3NlIDwgMikKKwkJcmV0dXJuOworCisJYmJfaW5mb19tc2coCisJCS8vIiBvcCAleCIKKwkJLy8iIGh0eXBlICV4IgorCQkiIGhsZW4gJXgiCisJCS8vIiBob3BzICV4IgorCQkiIHhpZCAleCIKKwkJLy8iIHNlY3MgJXgiCisJCS8vIiBmbGFncyAleCIKKwkJIiBjaWFkZHIgJXgiCisJCSIgeWlhZGRyICV4IgorCQkiIHNpYWRkciAleCIKKwkJIiBnaWFkZHIgJXgiCisJCS8vIiBjaGFkZHIgJXMiCisJCS8vIiBzbmFtZSAlcyIKKwkJLy8iIGZpbGUgJXMiCisJCS8vIiBjb29raWUgJXgiCisJCS8vIiBvcHRpb25zICVzIgorCQkvLywgcGFja2V0LT5vcAorCQkvLywgcGFja2V0LT5odHlwZQorCQksIHBhY2tldC0+aGxlbgorCQkvLywgcGFja2V0LT5ob3BzCisJCSwgcGFja2V0LT54aWQKKwkJLy8sIHBhY2tldC0+c2VjcworCQkvLywgcGFja2V0LT5mbGFncworCQksIHBhY2tldC0+Y2lhZGRyCisJCSwgcGFja2V0LT55aWFkZHIKKwkJLCBwYWNrZXQtPnNpYWRkcl9uaXAKKwkJLCBwYWNrZXQtPmdhdGV3YXlfbmlwCisJCS8vLCBwYWNrZXQtPmNoYWRkclsxNl0KKwkJLy8sIHBhY2tldC0+c25hbWVbNjRdCisJCS8vLCBwYWNrZXQtPmZpbGVbMTI4XQorCQkvLywgcGFja2V0LT5jb29raWUKKwkJLy8sIHBhY2tldC0+b3B0aW9uc1tdCisJKTsKKwkqYmluMmhleChidWYsICh2b2lkICopIHBhY2tldC0+Y2hhZGRyLCBzaXplb2YocGFja2V0LT5jaGFkZHIpKSA9ICdcMCc7CisJYmJfaW5mb19tc2coIiBjaGFkZHIgJXMiLCBidWYpOworfQorI2VuZGlmCisKKy8qIFJlYWQgYSBwYWNrZXQgZnJvbSBzb2NrZXQgZmQsIHJldHVybiAtMSBvbiByZWFkIGVycm9yLCAtMiBvbiBwYWNrZXQgZXJyb3IgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3BfcmVjdl9rZXJuZWxfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBpbnQgZmQpCit7CisJaW50IGJ5dGVzOworCXVuc2lnbmVkIGNoYXIgKnZlbmRvcjsKKworCW1lbXNldChwYWNrZXQsIDAsIHNpemVvZigqcGFja2V0KSk7CisJYnl0ZXMgPSBzYWZlX3JlYWQoZmQsIHBhY2tldCwgc2l6ZW9mKCpwYWNrZXQpKTsKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCWxvZzEoIlBhY2tldCByZWFkIGVycm9yLCBpZ25vcmluZyIpOworCQlyZXR1cm4gYnl0ZXM7IC8qIHJldHVybnMgLTEgKi8KKwl9CisKKwlpZiAocGFja2V0LT5jb29raWUgIT0gaHRvbmwoREhDUF9NQUdJQykpIHsKKwkJYmJfaW5mb19tc2coIlBhY2tldCB3aXRoIGJhZCBtYWdpYywgaWdub3JpbmciKTsKKwkJcmV0dXJuIC0yOworCX0KKwlsb2cxKCJSZWNlaXZlZCBhIHBhY2tldCIpOworCXVkaGNwX2R1bXBfcGFja2V0KHBhY2tldCk7CisKKwlpZiAocGFja2V0LT5vcCA9PSBCT09UUkVRVUVTVCkgeworCQl2ZW5kb3IgPSB1ZGhjcF9nZXRfb3B0aW9uKHBhY2tldCwgREhDUF9WRU5ET1IpOworCQlpZiAodmVuZG9yKSB7CisjaWYgMAorCQkJc3RhdGljIGNvbnN0IGNoYXIgYnJva2VuX3ZlbmRvcnNbXVs4XSA9IHsKKwkJCQkiTVNGVCA5OCIsCisJCQkJIiIKKwkJCX07CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGJyb2tlbl92ZW5kb3JzW2ldWzBdOyBpKyspIHsKKwkJCQlpZiAodmVuZG9yW09QVF9MRU4gLSBPUFRfREFUQV0gPT0gKHVpbnQ4X3Qpc3RybGVuKGJyb2tlbl92ZW5kb3JzW2ldKQorCQkJCSAmJiBzdHJuY21wKChjaGFyKil2ZW5kb3IsIGJyb2tlbl92ZW5kb3JzW2ldLCB2ZW5kb3JbT1BUX0xFTiAtIE9QVF9EQVRBXSkgPT0gMAorCQkJCSkgeworCQkJCQlsb2cxKCJCcm9rZW4gY2xpZW50ICglcyksIGZvcmNpbmcgYnJvYWRjYXN0IHJlcGxpZXMiLAorCQkJCQkJYnJva2VuX3ZlbmRvcnNbaV0pOworCQkJCQlwYWNrZXQtPmZsYWdzIHw9IGh0b25zKEJST0FEQ0FTVF9GTEFHKTsKKwkJCQl9CisJCQl9CisjZWxzZQorCQkJaWYgKHZlbmRvcltPUFRfTEVOIC0gT1BUX0RBVEFdID09ICh1aW50OF90KShzaXplb2YoIk1TRlQgOTgiKS0xKQorCQkJICYmIG1lbWNtcCh2ZW5kb3IsICJNU0ZUIDk4Iiwgc2l6ZW9mKCJNU0ZUIDk4IiktMSkgPT0gMAorCQkJKSB7CisJCQkJbG9nMSgiQnJva2VuIGNsaWVudCAoJXMpLCBmb3JjaW5nIGJyb2FkY2FzdCByZXBsaWVzIiwgIk1TRlQgOTgiKTsKKwkJCQlwYWNrZXQtPmZsYWdzIHw9IGh0b25zKEJST0FEQ0FTVF9GTEFHKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCisJcmV0dXJuIGJ5dGVzOworfQorCit1aW50MTZfdCBGQVNUX0ZVTkMgdWRoY3BfY2hlY2tzdW0odm9pZCAqYWRkciwgaW50IGNvdW50KQoreworCS8qIENvbXB1dGUgSW50ZXJuZXQgQ2hlY2tzdW0gZm9yICJjb3VudCIgYnl0ZXMKKwkgKiBiZWdpbm5pbmcgYXQgbG9jYXRpb24gImFkZHIiLgorCSAqLworCWludDMyX3Qgc3VtID0gMDsKKwl1aW50MTZfdCAqc291cmNlID0gKHVpbnQxNl90ICopIGFkZHI7CisKKwl3aGlsZSAoY291bnQgPiAxKSAgeworCQkvKiAgVGhpcyBpcyB0aGUgaW5uZXIgbG9vcCAqLworCQlzdW0gKz0gKnNvdXJjZSsrOworCQljb3VudCAtPSAyOworCX0KKworCS8qICBBZGQgbGVmdC1vdmVyIGJ5dGUsIGlmIGFueSAqLworCWlmIChjb3VudCA+IDApIHsKKwkJLyogTWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQtb3ZlciBieXRlIGlzIGFkZGVkIGNvcnJlY3RseSBib3RoCisJCSAqIHdpdGggbGl0dGxlIGFuZCBiaWcgZW5kaWFuIGhvc3RzICovCisJCXVpbnQxNl90IHRtcCA9IDA7CisJCSoodWludDhfdCopJnRtcCA9ICoodWludDhfdCopc291cmNlOworCQlzdW0gKz0gdG1wOworCX0KKwkvKiAgRm9sZCAzMi1iaXQgc3VtIHRvIDE2IGJpdHMgKi8KKwl3aGlsZSAoc3VtID4+IDE2KQorCQlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOworCisJcmV0dXJuIH5zdW07Cit9CisKKy8qIENvbnN0cnVjdCBhIGlwL3VkcCBoZWFkZXIgZm9yIGEgcGFja2V0LCBzZW5kIHBhY2tldCAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9zZW5kX3Jhd19wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwX3BrdCwKKwkJdWludDMyX3Qgc291cmNlX25pcCwgaW50IHNvdXJjZV9wb3J0LAorCQl1aW50MzJfdCBkZXN0X25pcCwgaW50IGRlc3RfcG9ydCwgY29uc3QgdWludDhfdCAqZGVzdF9hcnAsCisJCWludCBpZmluZGV4KQoreworCXN0cnVjdCBzb2NrYWRkcl9sbCBkZXN0X3NsbDsKKwlzdHJ1Y3QgaXBfdWRwX2RoY3BfcGFja2V0IHBhY2tldDsKKwl1bnNpZ25lZCBwYWRkaW5nOworCWludCBmZDsKKwlpbnQgcmVzdWx0ID0gLTE7CisJY29uc3QgY2hhciAqbXNnOworCisJZmQgPSBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCBodG9ucyhFVEhfUF9JUCkpOworCWlmIChmZCA8IDApIHsKKwkJbXNnID0gInNvY2tldCglcykiOworCQlnb3RvIHJldF9tc2c7CisJfQorCisJbWVtc2V0KCZkZXN0X3NsbCwgMCwgc2l6ZW9mKGRlc3Rfc2xsKSk7CisJbWVtc2V0KCZwYWNrZXQsIDAsIG9mZnNldG9mKHN0cnVjdCBpcF91ZHBfZGhjcF9wYWNrZXQsIGRhdGEpKTsKKwlwYWNrZXQuZGF0YSA9ICpkaGNwX3BrdDsgLyogc3RydWN0IGNvcHkgKi8KKworCWRlc3Rfc2xsLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJZGVzdF9zbGwuc2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCWRlc3Rfc2xsLnNsbF9pZmluZGV4ID0gaWZpbmRleDsKKwlkZXN0X3NsbC5zbGxfaGFsZW4gPSA2OworCW1lbWNweShkZXN0X3NsbC5zbGxfYWRkciwgZGVzdF9hcnAsIDYpOworCisJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmZGVzdF9zbGwsIHNpemVvZihkZXN0X3NsbCkpIDwgMCkgeworCQltc2cgPSAiYmluZCglcykiOworCQlnb3RvIHJldF9jbG9zZTsKKwl9CisKKwkvKiBXZSB3ZXJlIHNlbmRpbmcgZnVsbC1zaXplZCBESENQIHBhY2tldHMgKHplcm8gcGFkZGVkKSwKKwkgKiBidXQgc29tZSBiYWRseSBjb25maWd1cmVkIHNlcnZlcnMgd2VyZSBzZWVuIGRyb3BwaW5nIHRoZW0uCisJICogQXBwYXJlbnRseSB0aGV5IGRyb3AgYWxsIERIQ1AgcGFja2V0cyA+NTc2ICpldGhlcm5ldCogb2N0ZXRzIGJpZywKKwkgKiB3aGVyZWFzIHRoZXkgbWF5IG9ubHkgZHJvcCBwYWNrZXRzID41NzYgKklQKiBvY3RldHMgYmlnCisJICogKHdoaWNoIGZvciB0eXBpY2FsIEV0aGVybmV0IElJIG1lYW5zIDU5MCBvY3RldHM6IDYrNisyICsgNTc2KS4KKwkgKgorCSAqIEluIG9yZGVyIHRvIHdvcmsgd2l0aCB0aG9zZSBidWdneSBzZXJ2ZXJzLAorCSAqIHdlIHRydW5jYXRlIHBhY2tldHMgYWZ0ZXIgZW5kIG9wdGlvbiBieXRlLgorCSAqLworCXBhZGRpbmcgPSBESENQX09QVElPTlNfQlVGU0laRSAtIDEgLSB1ZGhjcF9lbmRfb3B0aW9uKHBhY2tldC5kYXRhLm9wdGlvbnMpOworCisJcGFja2V0LmlwLnByb3RvY29sID0gSVBQUk9UT19VRFA7CisJcGFja2V0LmlwLnNhZGRyID0gc291cmNlX25pcDsKKwlwYWNrZXQuaXAuZGFkZHIgPSBkZXN0X25pcDsKKwlwYWNrZXQudWRwLnNvdXJjZSA9IGh0b25zKHNvdXJjZV9wb3J0KTsKKwlwYWNrZXQudWRwLmRlc3QgPSBodG9ucyhkZXN0X3BvcnQpOworCS8qIHNpemUsIGV4Y2x1ZGluZyBJUCBoZWFkZXI6ICovCisJcGFja2V0LnVkcC5sZW4gPSBodG9ucyhVRFBfREhDUF9TSVpFIC0gcGFkZGluZyk7CisJLyogZm9yIFVEUCBjaGVja3N1bW1pbmcsIGlwLmxlbiBpcyBzZXQgdG8gVURQIHBhY2tldCBsZW4gKi8KKwlwYWNrZXQuaXAudG90X2xlbiA9IHBhY2tldC51ZHAubGVuOworCXBhY2tldC51ZHAuY2hlY2sgPSB1ZGhjcF9jaGVja3N1bSgmcGFja2V0LCBJUF9VRFBfREhDUF9TSVpFIC0gcGFkZGluZyk7CisJLyogYnV0IGZvciBzZW5kaW5nLCBpdCBpcyBzZXQgdG8gSVAgcGFja2V0IGxlbiAqLworCXBhY2tldC5pcC50b3RfbGVuID0gaHRvbnMoSVBfVURQX0RIQ1BfU0laRSAtIHBhZGRpbmcpOworCXBhY2tldC5pcC5paGwgPSBzaXplb2YocGFja2V0LmlwKSA+PiAyOworCXBhY2tldC5pcC52ZXJzaW9uID0gSVBWRVJTSU9OOworCXBhY2tldC5pcC50dGwgPSBJUERFRlRUTDsKKwlwYWNrZXQuaXAuY2hlY2sgPSB1ZGhjcF9jaGVja3N1bSgmcGFja2V0LmlwLCBzaXplb2YocGFja2V0LmlwKSk7CisKKwl1ZGhjcF9kdW1wX3BhY2tldChkaGNwX3BrdCk7CisJcmVzdWx0ID0gc2VuZHRvKGZkLCAmcGFja2V0LCBJUF9VRFBfREhDUF9TSVpFIC0gcGFkZGluZywgLypmbGFnczoqLyAwLAorCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmZGVzdF9zbGwsIHNpemVvZihkZXN0X3NsbCkpOworCW1zZyA9ICJzZW5kdG8iOworIHJldF9jbG9zZToKKwljbG9zZShmZCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKyByZXRfbXNnOgorCQliYl9wZXJyb3JfbXNnKG1zZywgIlBBQ0tFVCIpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBMZXQgdGhlIGtlcm5lbCBkbyBhbGwgdGhlIHdvcmsgZm9yIHBhY2tldCBnZW5lcmF0aW9uICovCitpbnQgRkFTVF9GVU5DIHVkaGNwX3NlbmRfa2VybmVsX3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LAorCQl1aW50MzJfdCBzb3VyY2VfbmlwLCBpbnQgc291cmNlX3BvcnQsCisJCXVpbnQzMl90IGRlc3RfbmlwLCBpbnQgZGVzdF9wb3J0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBjbGllbnQ7CisJdW5zaWduZWQgcGFkZGluZzsKKwlpbnQgZmQ7CisJaW50IHJlc3VsdCA9IC0xOworCWNvbnN0IGNoYXIgKm1zZzsKKworCWZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAoZmQgPCAwKSB7CisJCW1zZyA9ICJzb2NrZXQoJXMpIjsKKwkJZ290byByZXRfbXNnOworCX0KKwlzZXRzb2Nrb3B0X3JldXNlYWRkcihmZCk7CisKKwltZW1zZXQoJmNsaWVudCwgMCwgc2l6ZW9mKGNsaWVudCkpOworCWNsaWVudC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwljbGllbnQuc2luX3BvcnQgPSBodG9ucyhzb3VyY2VfcG9ydCk7CisJY2xpZW50LnNpbl9hZGRyLnNfYWRkciA9IHNvdXJjZV9uaXA7CisJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xpZW50LCBzaXplb2YoY2xpZW50KSkgPT0gLTEpIHsKKwkJbXNnID0gImJpbmQoJXMpIjsKKwkJZ290byByZXRfY2xvc2U7CisJfQorCisJbWVtc2V0KCZjbGllbnQsIDAsIHNpemVvZihjbGllbnQpKTsKKwljbGllbnQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJY2xpZW50LnNpbl9wb3J0ID0gaHRvbnMoZGVzdF9wb3J0KTsKKwljbGllbnQuc2luX2FkZHIuc19hZGRyID0gZGVzdF9uaXA7CisJaWYgKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xpZW50LCBzaXplb2YoY2xpZW50KSkgPT0gLTEpIHsKKwkJbXNnID0gImNvbm5lY3QiOworCQlnb3RvIHJldF9jbG9zZTsKKwl9CisKKwl1ZGhjcF9kdW1wX3BhY2tldChkaGNwX3BrdCk7CisKKwlwYWRkaW5nID0gREhDUF9PUFRJT05TX0JVRlNJWkUgLSAxIC0gdWRoY3BfZW5kX29wdGlvbihkaGNwX3BrdC0+b3B0aW9ucyk7CisJcmVzdWx0ID0gc2FmZV93cml0ZShmZCwgZGhjcF9wa3QsIERIQ1BfU0laRSAtIHBhZGRpbmcpOworCW1zZyA9ICJ3cml0ZSI7CisgcmV0X2Nsb3NlOgorCWNsb3NlKGZkKTsKKwlpZiAocmVzdWx0IDwgMCkgeworIHJldF9tc2c6CisJCWJiX3BlcnJvcl9tc2cobXNnLCAiVURQIik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL3NpZ25hbHBpcGUuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3Avc2lnbmFscGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTVjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL3NpZ25hbHBpcGUuYwpAQCAtMCwwICsxLDc3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTaWduYWwgcGlwZSBpbmZyYXN0cnVjdHVyZS4gQSByZWxpYWJsZSB3YXkgb2YgZGVsaXZlcmluZyBzaWduYWxzLgorICoKKyAqIFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IERlY2VtYmVyIDIwMDMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorCisvKiBHbG9iYWwgdmFyaWFibGU6IHdlIGFjY2VzcyBpdCBmcm9tIHNpZ25hbCBoYW5kbGVyICovCitzdGF0aWMgc3RydWN0IGZkX3BhaXIgc2lnbmFsX3BpcGU7CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpCit7CisJdW5zaWduZWQgY2hhciBjaCA9IHNpZzsgLyogdXNlIGNoYXIsIGF2b2lkIGRlYWxpbmcgd2l0aCBwYXJ0aWFsIHdyaXRlcyAqLworCWlmICh3cml0ZShzaWduYWxfcGlwZS53ciwgJmNoLCAxKSAhPSAxKQorCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzZW5kIHNpZ25hbCIpOworfQorCisvKiBDYWxsIHRoaXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuIFNldHMgdXAgdGhlIHNvY2tldCBwYWlyCisgKiBhbmQgaW5zdGFsbHMgdGhlIHNpZ25hbCBoYW5kbGVyICovCit2b2lkIEZBU1RfRlVOQyB1ZGhjcF9zcF9zZXR1cCh2b2lkKQoreworCS8qIHdhcyBzb2NrZXRwYWlyLCBidXQgaXQgbmVlZHMgQUZfVU5JWCBpbiBrZXJuZWwgKi8KKwl4cGlwZWRfcGFpcihzaWduYWxfcGlwZSk7CisJY2xvc2Vfb25fZXhlY19vbihzaWduYWxfcGlwZS5yZCk7CisJY2xvc2Vfb25fZXhlY19vbihzaWduYWxfcGlwZS53cik7CisJbmRlbGF5X29uKHNpZ25hbF9waXBlLndyKTsKKwliYl9zaWduYWxzKDAKKwkJKyAoMSA8PCBTSUdVU1IxKQorCQkrICgxIDw8IFNJR1VTUjIpCisJCSsgKDEgPDwgU0lHVEVSTSkKKwkJLCBzaWduYWxfaGFuZGxlcik7Cit9CisKKy8qIFF1aWNrIGxpdHRsZSBmdW5jdGlvbiB0byBzZXR1cCB0aGUgcmZkcy4gV2lsbCByZXR1cm4gdGhlCisgKiBtYXhfZmQgZm9yIHVzZSB3aXRoIHNlbGVjdC4gTGltaXRlZCBpbiB0aGF0IHlvdSBjYW4gb25seSBwYXNzCisgKiBvbmUgZXh0cmEgZmQgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3BfZmRfc2V0KGZkX3NldCAqcmZkcywgaW50IGV4dHJhX2ZkKQoreworCUZEX1pFUk8ocmZkcyk7CisJRkRfU0VUKHNpZ25hbF9waXBlLnJkLCByZmRzKTsKKwlpZiAoZXh0cmFfZmQgPj0gMCkgeworCQljbG9zZV9vbl9leGVjX29uKGV4dHJhX2ZkKTsKKwkJRkRfU0VUKGV4dHJhX2ZkLCByZmRzKTsKKwl9CisJcmV0dXJuIHNpZ25hbF9waXBlLnJkID4gZXh0cmFfZmQgPyBzaWduYWxfcGlwZS5yZCA6IGV4dHJhX2ZkOworfQorCisvKiBSZWFkIGEgc2lnbmFsIGZyb20gdGhlIHNpZ25hbCBwaXBlLiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMKKyAqIG5vIHNpZ25hbCwgLTEgb24gZXJyb3IgKGFuZCBzZXRzIGVycm5vIGFwcHJvcHJpYXRlbHkpLCBhbmQKKyAqIHlvdXIgc2lnbmFsIG9uIHN1Y2Nlc3MgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3BfcmVhZChjb25zdCBmZF9zZXQgKnJmZHMpCit7CisJdW5zaWduZWQgY2hhciBzaWc7CisKKwlpZiAoIUZEX0lTU0VUKHNpZ25hbF9waXBlLnJkLCByZmRzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2FmZV9yZWFkKHNpZ25hbF9waXBlLnJkLCAmc2lnLCAxKSAhPSAxKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gc2lnOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy91ZGhjcC9zb2NrZXQuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3Avc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyMjBiYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3Avc29ja2V0LmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIERIQ1Agc2VydmVyIGNsaWVudC9zZXJ2ZXIgc29ja2V0IGNyZWF0aW9uCisgKgorICogdWRoY3AgY2xpZW50L3NlcnZlcgorICogQ29weXJpZ2h0IChDKSAxOTk5IE1hdHRoZXcgUmFtc2F5IDxtYXR0aGV3ckBtb3JldG9uLmNvbS5hdT4KKyAqCQkJQ2hyaXMgVHJldyA8Y3RyZXdAbW9yZXRvbi5jb20uYXU+CisgKgorICogUmV3cml0ZSBieSBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PiBKdWx5IDIwMDEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPG5ldC9pZi5oPgorCitpbnQgRkFTVF9GVU5DIHVkaGNwX3JlYWRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmludGVyZmFjZSwgaW50ICppZmluZGV4LCB1aW50MzJfdCAqbmlwLCB1aW50OF90ICptYWMpCit7CisJLyogY2hhciBidWZmZXIgaW5zdGVhZCBvZiBib25hLWZpZGUgc3RydWN0IGF2b2lkcyBhbGlhc2luZyB3YXJuaW5nICovCisJY2hhciBpZnJfYnVmW3NpemVvZihzdHJ1Y3QgaWZyZXEpXTsKKwlzdHJ1Y3QgaWZyZXEgKmNvbnN0IGlmciA9ICh2b2lkICopaWZyX2J1ZjsKKworCWludCBmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKm91cl9pcDsKKworCW1lbXNldChpZnIsIDAsIHNpemVvZigqaWZyKSk7CisJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1JBVyk7CisKKwlpZnItPmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJc3RybmNweV9JRk5BTVNJWihpZnItPmlmcl9uYW1lLCBpbnRlcmZhY2UpOworCWlmIChuaXApIHsKKwkJaWYgKGlvY3RsX29yX3BlcnJvcihmZCwgU0lPQ0dJRkFERFIsIGlmciwKKwkJCSJpcyBpbnRlcmZhY2UgJXMgdXAgYW5kIGNvbmZpZ3VyZWQ/IiwgaW50ZXJmYWNlKQorCQkpIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlvdXJfaXAgPSAoc3RydWN0IHNvY2thZGRyX2luICopICZpZnItPmlmcl9hZGRyOworCQkqbmlwID0gb3VyX2lwLT5zaW5fYWRkci5zX2FkZHI7CisJCWxvZzEoIklQICVzIiwgaW5ldF9udG9hKG91cl9pcC0+c2luX2FkZHIpKTsKKwl9CisKKwlpZiAoaWZpbmRleCkgeworCQlpZiAoaW9jdGxfb3Jfd2FybihmZCwgU0lPQ0dJRklOREVYLCBpZnIpICE9IDApIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlsb2cxKCJBZGFwdGVyIGluZGV4ICVkIiwgaWZyLT5pZnJfaWZpbmRleCk7CisJCSppZmluZGV4ID0gaWZyLT5pZnJfaWZpbmRleDsKKwl9CisKKwlpZiAobWFjKSB7CisJCWlmIChpb2N0bF9vcl93YXJuKGZkLCBTSU9DR0lGSFdBRERSLCBpZnIpICE9IDApIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1jcHkobWFjLCBpZnItPmlmcl9od2FkZHIuc2FfZGF0YSwgNik7CisJCWxvZzEoIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKwl9CisKKwljbG9zZShmZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIDEuIE5vbmUgb2YgdGhlIGNhbGxlcnMgZXhwZWN0cyBpdCB0byBldmVyIGZhaWwgKi8KKy8qIDIuIGlwIHdhcyBhbHdheXMgSU5BRERSX0FOWSAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qdWludDMyX3QgaXAsKi8gaW50IHBvcnQsIGNvbnN0IGNoYXIgKmluZikKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisKKwlsb2cxKCJPcGVuaW5nIGxpc3RlbiBzb2NrZXQgb24gKjolZCAlcyIsIHBvcnQsIGluZik7CisJZmQgPSB4c29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKworCXNldHNvY2tvcHRfcmV1c2VhZGRyKGZkKTsKKwlpZiAoc2V0c29ja29wdF9icm9hZGNhc3QoZmQpID09IC0xKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlNPX0JST0FEQ0FTVCIpOworCisJLyogTkI6IGJ1ZyAxMDMyIHNheXMgdGhpcyBkb2Vzbid0IHdvcmsgb24gZXRoZXJuZXQgYWxpYXNlcyAoZXRoTjpNKSAqLworCWlmIChzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShmZCwgaW5mKSkKKwkJeGZ1bmNfZGllKCk7IC8qIHdhcm5pbmcgaXMgYWxyZWFkeSBwcmludGVkICovCisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJLyogYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpcDsgLSBhbGwtemVyb3MgaXMgSU5BRERSX0FOWSAqLworCXhiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CisKKwlyZXR1cm4gZmQ7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL3N0YXRpY19sZWFzZXMuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdWRoY3Avc3RhdGljX2xlYXNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTI0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3VkaGNwL3N0YXRpY19sZWFzZXMuYwpAQCAtMCwwICsxLDc3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTdG9yaW5nIGFuZCByZXRyaWV2aW5nIGRhdGEgZm9yIHN0YXRpYyBsZWFzZXMKKyAqCisgKiBXYWRlIEJlcnJpZXIgPHdiZXJyaWVyQG15cmVhbGJveC5jb20+IFNlcHRlbWJlciAyMDA0CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisKKy8qIFRha2VzIHRoZSBhZGRyZXNzIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBzdGF0aWNfbGVhc2VzIGxpbmtlZCBsaXN0LAorICogYWRkcmVzcyB0byBhIDYgYnl0ZSBtYWMgYWRkcmVzcywKKyAqIDQgYnl0ZSBJUCBhZGRyZXNzICovCit2b2lkIEZBU1RfRlVOQyBhZGRfc3RhdGljX2xlYXNlKHN0cnVjdCBzdGF0aWNfbGVhc2UgKipzdF9sZWFzZV9wcCwKKwkJdWludDhfdCAqbWFjLAorCQl1aW50MzJfdCBuaXApCit7CisJc3RydWN0IHN0YXRpY19sZWFzZSAqc3RfbGVhc2U7CisKKwkvKiBGaW5kIHRoZSB0YWlsIG9mIHRoZSBsaXN0ICovCisJd2hpbGUgKChzdF9sZWFzZSA9ICpzdF9sZWFzZV9wcCkgIT0gTlVMTCkgeworCQlzdF9sZWFzZV9wcCA9ICZzdF9sZWFzZS0+bmV4dDsKKwl9CisKKwkvKiBBZGQgbmV3IG5vZGUgKi8KKwkqc3RfbGVhc2VfcHAgPSBzdF9sZWFzZSA9IHh6YWxsb2Moc2l6ZW9mKCpzdF9sZWFzZSkpOworCW1lbWNweShzdF9sZWFzZS0+bWFjLCBtYWMsIDYpOworCXN0X2xlYXNlLT5uaXAgPSBuaXA7CisJLypzdF9sZWFzZS0+bmV4dCA9IE5VTEw7Ki8KK30KKworLyogRmluZCBzdGF0aWMgbGVhc2UgSVAgYnkgbWFjICovCit1aW50MzJfdCBGQVNUX0ZVTkMgZ2V0X3N0YXRpY19uaXBfYnlfbWFjKHN0cnVjdCBzdGF0aWNfbGVhc2UgKnN0X2xlYXNlLCB2b2lkICptYWMpCit7CisJd2hpbGUgKHN0X2xlYXNlKSB7CisJCWlmIChtZW1jbXAoc3RfbGVhc2UtPm1hYywgbWFjLCA2KSA9PSAwKQorCQkJcmV0dXJuIHN0X2xlYXNlLT5uaXA7CisJCXN0X2xlYXNlID0gc3RfbGVhc2UtPm5leHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIHRvIHNlZSBpZiBhbiBJUCBpcyByZXNlcnZlZCBhcyBhIHN0YXRpYyBJUCAqLworaW50IEZBU1RfRlVOQyBpc19uaXBfcmVzZXJ2ZWQoc3RydWN0IHN0YXRpY19sZWFzZSAqc3RfbGVhc2UsIHVpbnQzMl90IG5pcCkKK3sKKwl3aGlsZSAoc3RfbGVhc2UpIHsKKwkJaWYgKHN0X2xlYXNlLT5uaXAgPT0gbmlwKQorCQkJcmV0dXJuIDE7CisJCXN0X2xlYXNlID0gc3RfbGVhc2UtPm5leHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMgorLyogUHJpbnQgb3V0IHN0YXRpYyBsZWFzZXMganVzdCB0byBjaGVjayB3aGF0J3MgZ29pbmcgb24gKi8KKy8qIFRha2VzIHRoZSBhZGRyZXNzIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBzdGF0aWNfbGVhc2VzIGxpbmtlZCBsaXN0ICovCit2b2lkIEZBU1RfRlVOQyBsb2dfc3RhdGljX2xlYXNlcyhzdHJ1Y3Qgc3RhdGljX2xlYXNlICoqc3RfbGVhc2VfcHApCit7CisJc3RydWN0IHN0YXRpY19sZWFzZSAqY3VyOworCisJaWYgKGRoY3BfdmVyYm9zZSA8IDIpCisJCXJldHVybjsKKworCWN1ciA9ICpzdF9sZWFzZV9wcDsKKwl3aGlsZSAoY3VyKSB7CisJCWJiX2luZm9fbXNnKCJzdGF0aWMgbGVhc2U6IG1hYzolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBuaXA6JXgiLAorCQkJY3VyLT5tYWNbMF0sIGN1ci0+bWFjWzFdLCBjdXItPm1hY1syXSwKKwkJCWN1ci0+bWFjWzNdLCBjdXItPm1hY1s0XSwgY3VyLT5tYWNbNV0sCisJCQljdXItPm5pcAorCQkpOworCQljdXIgPSBjdXItPm5leHQ7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3Zjb25maWcuYyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvdmNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YjQ1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3Zjb25maWcuYwpAQCAtMCwwICsxLDE3MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdmNvbmZpZyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BICovCisKKy8vdXNhZ2U6I2RlZmluZSB2Y29uZmlnX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJDT01NQU5EIFtPUFRJT05TXSIKKy8vdXNhZ2U6I2RlZmluZSB2Y29uZmlnX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIGFuZCByZW1vdmUgdmlydHVhbCBldGhlcm5ldCBkZXZpY2VzXG4iCisvL3VzYWdlOiAgICAgIlxuCWFkZAkJW2ludGVyZmFjZS1uYW1lXSBbdmxhbl9pZF0iCisvL3VzYWdlOiAgICAgIlxuCXJlbQkJW3ZsYW4tbmFtZV0iCisvL3VzYWdlOiAgICAgIlxuCXNldF9mbGFnCVtpbnRlcmZhY2UtbmFtZV0gW2ZsYWctbnVtXSBbMCB8IDFdIgorLy91c2FnZTogICAgICJcbglzZXRfZWdyZXNzX21hcAlbdmxhbi1uYW1lXSBbc2tiX3ByaW9yaXR5XSBbdmxhbl9xb3NdIgorLy91c2FnZTogICAgICJcbglzZXRfaW5ncmVzc19tYXAJW3ZsYW4tbmFtZV0gW3NrYl9wcmlvcml0eV0gW3ZsYW5fcW9zXSIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0X25hbWVfdHlwZQlbbmFtZS10eXBlXSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKy8qIFN0dWZmIGZyb20gbGludXgvaWZfdmxhbi5oLCBrZXJuZWwgdmVyc2lvbiAyLjQuMjMgKi8KK2VudW0gdmxhbl9pb2N0bF9jbWRzIHsKKwlBRERfVkxBTl9DTUQsCisJREVMX1ZMQU5fQ01ELAorCVNFVF9WTEFOX0lOR1JFU1NfUFJJT1JJVFlfQ01ELAorCVNFVF9WTEFOX0VHUkVTU19QUklPUklUWV9DTUQsCisJR0VUX1ZMQU5fSU5HUkVTU19QUklPUklUWV9DTUQsCisJR0VUX1ZMQU5fRUdSRVNTX1BSSU9SSVRZX0NNRCwKKwlTRVRfVkxBTl9OQU1FX1RZUEVfQ01ELAorCVNFVF9WTEFOX0ZMQUdfQ01ECit9OworZW51bSB2bGFuX25hbWVfdHlwZXMgeworCVZMQU5fTkFNRV9UWVBFX1BMVVNfVklELCAvKiBOYW1lIHdpbGwgbG9vayBsaWtlOiAgdmxhbjAwMDUgKi8KKwlWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSUQsIC8qIG5hbWUgd2lsbCBsb29rIGxpa2U6ICBldGgxLjAwMDUgKi8KKwlWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRF9OT19QQUQsIC8qIE5hbWUgd2lsbCBsb29rIGxpa2U6ICB2bGFuNSAqLworCVZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRF9OT19QQUQsIC8qIE5hbWUgd2lsbCBsb29rIGxpa2U6ICBldGgwLjUgKi8KKwlWTEFOX05BTUVfVFlQRV9ISUdIRVNUCit9OworCitzdHJ1Y3Qgdmxhbl9pb2N0bF9hcmdzIHsKKwlpbnQgY21kOyAvKiBTaG91bGQgYmUgb25lIG9mIHRoZSB2bGFuX2lvY3RsX2NtZHMgZW51bSBhYm92ZS4gKi8KKwljaGFyIGRldmljZTFbMjRdOworCisJdW5pb24geworCQljaGFyIGRldmljZTJbMjRdOworCQlpbnQgVklEOworCQl1bnNpZ25lZCBpbnQgc2tiX3ByaW9yaXR5OworCQl1bnNpZ25lZCBpbnQgbmFtZV90eXBlOworCQl1bnNpZ25lZCBpbnQgYmluZF90eXBlOworCQl1bnNpZ25lZCBpbnQgZmxhZzsgLyogTWF0Y2hlcyB2bGFuX2Rldl9pbmZvIGZsYWdzICovCisJfSB1OworCisJc2hvcnQgdmxhbl9xb3M7Cit9OworCisjZGVmaW5lIFZMQU5fR1JPVVBfQVJSQVlfTEVOICA0MDk2CisjZGVmaW5lIFNJT0NTSUZWTEFOICAgICAgICAgICAweDg5ODMgIC8qIFNldCA4MDIuMVEgVkxBTiBvcHRpb25zICovCisKKy8qIE9uIGVudHJ5LCB0YWJsZSBwb2ludHMgdG8gdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBzdHJpbmcKKyAqIHBsdXMgTlVMIHRlcm1pbmF0b3IgcGx1cyBkYXRhIGxlbmd0aCBmb3IgdGhlIHN1YnNlcXVlbnQgZW50cnkuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsYXN0IGRhdGEgZW50cnkgZm9yIHRoZSBtYXRjaGluZyBzdHJpbmcuICovCitzdGF0aWMgY29uc3QgY2hhciAqeGZpbmRfc3RyKGNvbnN0IGNoYXIgKnRhYmxlLCBjb25zdCBjaGFyICpzdHIpCit7CisJd2hpbGUgKHN0cmNhc2VjbXAoc3RyLCB0YWJsZSsxKSAhPSAwKSB7CisJCXRhYmxlICs9IHRhYmxlWzBdOworCQlpZiAoISp0YWJsZSkgeworCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCXJldHVybiB0YWJsZSAtIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNtZHNbXSBBTElHTjEgPSB7CisJNCwgQUREX1ZMQU5fQ01ELCA3LAorCSdhJywgJ2QnLCAnZCcsIDAsCisJMywgREVMX1ZMQU5fQ01ELCA3LAorCSdyJywgJ2UnLCAnbScsIDAsCisJMywgU0VUX1ZMQU5fTkFNRV9UWVBFX0NNRCwgMTcsCisJJ3MnLCAnZScsICd0JywgJ18nLAorCSduJywgJ2EnLCAnbScsICdlJywgJ18nLAorCSd0JywgJ3knLCAncCcsICdlJywgMCwKKwk1LCBTRVRfVkxBTl9GTEFHX0NNRCwgMTIsCisJJ3MnLCAnZScsICd0JywgJ18nLAorCSdmJywgJ2wnLCAnYScsICdnJywgMCwKKwk1LCBTRVRfVkxBTl9FR1JFU1NfUFJJT1JJVFlfQ01ELCAxOCwKKwkncycsICdlJywgJ3QnLCAnXycsCisJJ2UnLCAnZycsICdyJywgJ2UnLCAncycsICdzJywgJ18nLAorCSdtJywgJ2EnLCAncCcsIDAsCisJNSwgU0VUX1ZMQU5fSU5HUkVTU19QUklPUklUWV9DTUQsIDE2LAorCSdzJywgJ2UnLCAndCcsICdfJywKKwknaScsICduJywgJ2cnLCAncicsICdlJywgJ3MnLCAncycsICdfJywKKwknbScsICdhJywgJ3AnLCAwLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgbmFtZV90eXBlc1tdIEFMSUdOMSA9IHsKKwlWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRCwgMTYsCisJJ1YnLCAnTCcsICdBJywgJ04nLAorCSdfJywgJ1AnLCAnTCcsICdVJywgJ1MnLCAnXycsICdWJywgJ0knLCAnRCcsCisJMCwKKwlWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRF9OT19QQUQsIDIyLAorCSdWJywgJ0wnLCAnQScsICdOJywKKwknXycsICdQJywgJ0wnLCAnVScsICdTJywgJ18nLCAnVicsICdJJywgJ0QnLAorCSdfJywgJ04nLCAnTycsICdfJywgJ1AnLCAnQScsICdEJywgMCwKKwlWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSUQsIDE1LAorCSdEJywgJ0UnLCAnVicsCisJJ18nLCAnUCcsICdMJywgJ1UnLCAnUycsICdfJywgJ1YnLCAnSScsICdEJywKKwkwLAorCVZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRF9OT19QQUQsIDIwLAorCSdEJywgJ0UnLCAnVicsCisJJ18nLCAnUCcsICdMJywgJ1UnLCAnUycsICdfJywgJ1YnLCAnSScsICdEJywKKwknXycsICdOJywgJ08nLCAnXycsICdQJywgJ0EnLCAnRCcsIDAsCit9OworCitzdGF0aWMgY29uc3QgY2hhciBjb25mX2ZpbGVfbmFtZVtdIEFMSUdOMSA9ICIvcHJvYy9uZXQvdmxhbi9jb25maWciOworCitpbnQgdmNvbmZpZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdmNvbmZpZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgdmxhbl9pb2N0bF9hcmdzIGlmcjsKKwljb25zdCBjaGFyICpwOworCWludCBmZDsKKworCWlmIChhcmdjIDwgMykgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLyogRG9uJ3QgYm90aGVyIGNsb3NpbmcgdGhlIGZpbGVkZXMuICBJdCB3aWxsIGJlIGNsb3NlZCBvbiBjbGVhbnVwLiAqLworCS8qIFdpbGwgZGllIGlmIDgwMi4xcSBpcyBub3QgcHJlc2VudCAqLworCXhvcGVuKGNvbmZfZmlsZV9uYW1lLCBPX1JET05MWSk7CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCisJKythcmd2OworCXAgPSB4ZmluZF9zdHIoY21kcysyLCAqYXJndik7CisJaWZyLmNtZCA9ICpwOworCWlmIChhcmdjICE9IHBbLTFdKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZiAoaWZyLmNtZCA9PSBTRVRfVkxBTl9OQU1FX1RZUEVfQ01EKSB7IC8qIHNldF9uYW1lX3R5cGUgKi8KKwkJaWZyLnUubmFtZV90eXBlID0gKnhmaW5kX3N0cihuYW1lX3R5cGVzKzEsIGFyZ3ZbMV0pOworCX0gZWxzZSB7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmRldmljZTEsIGFyZ3ZbMV0pOworCQlwID0gYXJndlsyXTsKKworCQkvKiBJIHN1cHBvc2Ugb25lIGNvdWxkIHRyeSB0byBjb21iaW5lIHNvbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGxzIGJlbG93LAorCQkgKiBzaW5jZSBpZnIudS5mbGFnLCBpZnIudS5WSUQsIGFuZCBpZnIudS5za2JfcHJpb3JpdHkgYXJlIGFsbCBzYW1lLXNpemVkCisJCSAqICh1bnNpZ25lZCkgaW50IG1lbWJlcnMgb2YgYSB1bmlvbnMuICBCdXQgYmVjYXVzZSBvZiB0aGUgcmFuZ2UgY2hlY2tpbmcsCisJCSAqIGRvaW5nIHNvIHdvdWxkbid0IHNhdmUgdGhhdCBtdWNoIHNwYWNlIGFuZCB3b3VsZCBhbHNvIG1ha2UgbWFpbnRhaW5lbmNlCisJCSAqIG1vcmUgb2YgYSBwYWluLiAqLworCQlpZiAoaWZyLmNtZCA9PSBTRVRfVkxBTl9GTEFHX0NNRCkgeyAvKiBzZXRfZmxhZyAqLworCQkJaWZyLnUuZmxhZyA9IHhhdG91bF9yYW5nZShwLCAwLCAxKTsKKwkJCS8qIERNOiBpbiBvcmRlciB0byBzZXQgcmVvcmRlciBoZWFkZXIsIHFvcyBtdXN0IGJlIHNldCAqLworCQkJaWZyLnZsYW5fcW9zID0geGF0b3VsX3JhbmdlKGFyZ3ZbM10sIDAsIDcpOworCQl9IGVsc2UgaWYgKGlmci5jbWQgPT0gQUREX1ZMQU5fQ01EKSB7IC8qIGFkZCAqLworCQkJaWZyLnUuVklEID0geGF0b3VsX3JhbmdlKHAsIDAsIFZMQU5fR1JPVVBfQVJSQVlfTEVOLTEpOworCQl9IGVsc2UgaWYgKGlmci5jbWQgIT0gREVMX1ZMQU5fQ01EKSB7IC8qIHNldF97ZWdyZXNzfGluZ3Jlc3N9X21hcCAqLworCQkJaWZyLnUuc2tiX3ByaW9yaXR5ID0geGF0b3UocCk7CisJCQlpZnIudmxhbl9xb3MgPSB4YXRvdWxfcmFuZ2UoYXJndlszXSwgMCwgNyk7CisJCX0KKwl9CisKKwlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGZkLCBTSU9DU0lGVkxBTiwgJmlmciwKKwkJCQkJCSJpb2N0bCBlcnJvciBmb3IgJXMiLCAqYXJndik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvd2dldC5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy93Z2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0MzcwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvd2dldC5jCkBAIC0wLDAgKzEsOTQxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB3Z2V0IC0gcmV0cmlldmUgYSBmaWxlIHVzaW5nIEhUVFAgb3IgRlRQCisgKgorICogQ2hpcCBSb3NlbnRoYWwgQ292YWQgQ29tbXVuaWNhdGlvbnMgPGNoaXBAbGFzZXJsaW5rLm5ldD4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEJyYWRsZXkgTS4gS3VobiA8Ymt1aG5AZWJiLm9yZz4KKyAqIEt1aG4ncyBjb3B5cmlnaHRzIGFyZSBsaWNlbnNlZCBHUEx2Mi1vci1sYXRlci4gIEZpbGUgYXMgYSB3aG9sZSByZW1haW5zIEdQTHYyLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB3Z2V0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgICAiWy1jfC0tY29udGludWVdIFstc3wtLXNwaWRlcl0gWy1xfC0tcXVpZXRdIFstT3wtLW91dHB1dC1kb2N1bWVudCBGSUxFXVxuIgorLy91c2FnZTogICAgICAgIglbLS1oZWFkZXIgJ2hlYWRlcjogdmFsdWUnXSBbLVl8LS1wcm94eSBvbi9vZmZdIFstUCBESVJdXG4iCisvL3VzYWdlOiAgICAgICAiCVstLW5vLWNoZWNrLWNlcnRpZmljYXRlXSBbLVV8LS11c2VyLWFnZW50IEFHRU5UXSIKKy8vdXNhZ2U6CQkJSUZfRkVBVFVSRV9XR0VUX1RJTUVPVVQoIiBbLVQgU0VDXSIpICIgVVJMLi4uIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgICAiWy1jc3FdIFstTyBGSUxFXSBbLVkgb24vb2ZmXSBbLVAgRElSXSBbLVUgQUdFTlRdIgorLy91c2FnZToJCQlJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgiIFstVCBTRUNdIikgIiBVUkwuLi4iCisvL3VzYWdlOgkpCisvL3VzYWdlOiNkZWZpbmUgd2dldF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJldHJpZXZlIGZpbGVzIHZpYSBIVFRQIG9yIEZUUFxuIgorLy91c2FnZTogICAgICJcbgktcwlTcGlkZXIgbW9kZSAtIG9ubHkgY2hlY2sgZmlsZSBleGlzdGVuY2UiCisvL3VzYWdlOiAgICAgIlxuCS1jCUNvbnRpbnVlIHJldHJpZXZhbCBvZiBhYm9ydGVkIHRyYW5zZmVyIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLVAgRElSCVNhdmUgdG8gRElSIChkZWZhdWx0IC4pIgorLy91c2FnZToJSUZfRkVBVFVSRV9XR0VUX1RJTUVPVVQoCisvL3VzYWdlOiAgICAgIlxuCS1UIFNFQwlOZXR3b3JrIHJlYWQgdGltZW91dCBpcyBTRUMgc2Vjb25kcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLU8gRklMRQlTYXZlIHRvIEZJTEUgKCctJyBmb3Igc3Rkb3V0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVUgU1RSCVVzZSBTVFIgZm9yIFVzZXItQWdlbnQgaGVhZGVyIgorLy91c2FnZTogICAgICJcbgktWQlVc2UgcHJveHkgKCdvbicgb3IgJ29mZicpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLy8jZGVmaW5lIGxvZ19pbyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgbG9nX2lvKC4uLikgKCh2b2lkKTApCisKKworc3RydWN0IGhvc3RfaW5mbyB7CisJY2hhciAqYWxsb2NhdGVkOworCWNvbnN0IGNoYXIgKnBhdGg7CisJY29uc3QgY2hhciAqdXNlcjsKKwljaGFyICAgICAgICpob3N0OworCWludCAgICAgICAgIHBvcnQ7CisJc21hbGxpbnQgICAgaXNfZnRwOworfTsKKworCisvKiBHbG9iYWxzICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJb2ZmX3QgY29udGVudF9sZW47ICAgICAgICAvKiBDb250ZW50LWxlbmd0aCBvZiB0aGUgZmlsZSAqLworCW9mZl90IGJlZ19yYW5nZTsgICAgICAgICAgLyogUmFuZ2UgYXQgd2hpY2ggY29udGludWUgYmVnaW5zICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIKKwlvZmZfdCB0cmFuc2ZlcnJlZDsgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIgKi8KKwljb25zdCBjaGFyICpjdXJmaWxlOyAgICAgIC8qIE5hbWUgb2YgY3VycmVudCBmaWxlIGJlaW5nIHRyYW5zZmVycmVkICovCisJYmJfcHJvZ3Jlc3NfdCBwbXQ7CisjZW5kaWYKKyAgICAgICAgY2hhciAqZGlyX3ByZWZpeDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUworICAgICAgICBjaGFyICpwb3N0X2RhdGE7CisgICAgICAgIGNoYXIgKmV4dHJhX2hlYWRlcnM7CisjZW5kaWYKKyAgICAgICAgY2hhciAqZm5hbWVfb3V0OyAgICAgICAgLyogd2hlcmUgdG8gZGlyZWN0IG91dHB1dCAoLU8pICovCisgICAgICAgIGNvbnN0IGNoYXIgKnByb3h5X2ZsYWc7IC8qIFVzZSBwcm94aWVzIGlmIGVudiB2YXJzIGFyZSBzZXQgKi8KKyAgICAgICAgY29uc3QgY2hhciAqdXNlcl9hZ2VudDsgLyogIlVzZXItQWdlbnQiIGhlYWRlciBmaWVsZCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCXVuc2lnbmVkIHRpbWVvdXRfc2Vjb25kczsKKyNlbmRpZgorCWludCBvdXRwdXRfZmQ7CisJaW50IG9fZmxhZ3M7CisJc21hbGxpbnQgY2h1bmtlZDsgICAgICAgICAvKiBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nICovCisJc21hbGxpbnQgZ290X2NsZW47ICAgICAgICAvKiBnb3QgY29udGVudC1sZW5ndGg6IGZyb20gc2VydmVyICAqLworCS8qIExvY2FsIGRvd25sb2FkcyBkbyBiZW5lZml0IGZyb20gYmlnIGJ1ZmZlci4KKwkgKiBXaXRoIDUxMiBieXRlIGJ1ZmZlciwgaXQgd2FzIG1lYXN1cmVkIHRvIGJlCisJICogYW4gb3JkZXIgb2YgbWFnbml0dWRlIHNsb3dlciB0aGFuIHdpdGggYmlnIG9uZS4KKwkgKi8KKwl1aW50NjRfdCBqdXN0X3RvX2FsaWduX25leHRfbWVtYmVyOworCWNoYXIgd2dldF9idWZbQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQioxMDI0XTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorICAgICAgICBTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCUlGX0ZFQVRVUkVfV0dFVF9USU1FT1VUKEcudGltZW91dF9zZWNvbmRzID0gOTAwOykgXAorfSB3aGlsZSAoMCkKKworCisvKiBNdXN0IG1hdGNoIG9wdGlvbiBzdHJpbmchICovCitlbnVtIHsKKwlXR0VUX09QVF9DT05USU5VRSAgID0gKDEgPDwgMCksCisJV0dFVF9PUFRfU1BJREVSICAgICA9ICgxIDw8IDEpLAorCVdHRVRfT1BUX1FVSUVUICAgICAgPSAoMSA8PCAyKSwKKwlXR0VUX09QVF9PVVROQU1FICAgID0gKDEgPDwgMyksCisJV0dFVF9PUFRfUFJFRklYICAgICA9ICgxIDw8IDQpLAorCVdHRVRfT1BUX1BST1hZICAgICAgPSAoMSA8PCA1KSwKKwlXR0VUX09QVF9VU0VSX0FHRU5UID0gKDEgPDwgNiksCisJV0dFVF9PUFRfTkVUV09SS19SRUFEX1RJTUVPVVQgPSAoMSA8PCA3KSwKKwlXR0VUX09QVF9SRVRSSUVTICAgID0gKDEgPDwgOCksCisJV0dFVF9PUFRfUEFTU0lWRSAgICA9ICgxIDw8IDkpLAorCVdHRVRfT1BUX0hFQURFUiAgICAgPSAoMSA8PCAxMCkgKiBFTkFCTEVfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUywKKwlXR0VUX09QVF9QT1NUX0RBVEEgID0gKDEgPDwgMTEpICogRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMsCit9OworCitlbnVtIHsKKwlQUk9HUkVTU19TVEFSVCA9IC0xLAorCVBST0dSRVNTX0VORCAgID0gMCwKKwlQUk9HUkVTU19CVU1QICA9IDEsCit9OworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSCitzdGF0aWMgdm9pZCBwcm9ncmVzc19tZXRlcihpbnQgZmxhZykKK3sKKwlpZiAob3B0aW9uX21hc2szMiAmIFdHRVRfT1BUX1FVSUVUKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZyA9PSBQUk9HUkVTU19TVEFSVCkKKwkJYmJfcHJvZ3Jlc3NfaW5pdCgmRy5wbXQsIEcuY3VyZmlsZSk7CisKKwliYl9wcm9ncmVzc191cGRhdGUoJkcucG10LAorCQkJRy5iZWdfcmFuZ2UsCisJCQlHLnRyYW5zZmVycmVkLAorCQkJKEcuY2h1bmtlZCB8fCAhRy5nb3RfY2xlbikgPyAwIDogRy5iZWdfcmFuZ2UgKyBHLnRyYW5zZmVycmVkICsgRy5jb250ZW50X2xlbgorCSk7CisKKwlpZiAoZmxhZyA9PSBQUk9HUkVTU19FTkQpIHsKKwkJYmJfcHJvZ3Jlc3NfZnJlZSgmRy5wbXQpOworCQliYl9wdXRjaGFyX3N0ZGVycignXG4nKTsKKwkJRy50cmFuc2ZlcnJlZCA9IDA7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgcHJvZ3Jlc3NfbWV0ZXIoaW50IGZsYWcgVU5VU0VEX1BBUkFNKSB7IH0KKyNlbmRpZgorCisKKy8qIElQdjYga25vd3Mgc2NvcGVkIGFkZHJlc3MgdHlwZXMgaS5lLiBsaW5rIGFuZCBzaXRlIGxvY2FsIGFkZHJlc3Nlcy4gTGluaworICogbG9jYWwgYWRkcmVzc2VzIGNhbiBoYXZlIGEgc2NvcGUgaWRlbnRpZmllciB0byBzcGVjaWZ5IHRoZQorICogaW50ZXJmYWNlL2xpbmsgYW4gYWRkcmVzcyBpcyB2YWxpZCBvbiAoZS5nLiBmZTgwOjoxJWV0aDApLiBUaGlzIHNjb3BlCisgKiBpZGVudGlmaWVyIGlzIG9ubHkgdmFsaWQgb24gYSBzaW5nbGUgbm9kZS4KKyAqCisgKiBSRkMgNDAwNyBzYXlzIHRoYXQgdGhlIHNjb3BlIGlkZW50aWZpZXIgTVVTVCBOT1QgYmUgc2VudCBhY3Jvc3MgdGhlIHdpcmUsCisgKiB1bmxlc3MgYWxsIG5vZGVzIGFncmVlIG9uIHRoZSBzZW1hbnRpYy4gQXBhY2hlIGUuZy4gcmVnYXJkcyB6b25lIGlkZW50aWZpZXJzCisgKiBpbiB0aGUgSG9zdCBoZWFkZXIgYXMgaW52YWxpZCByZXF1ZXN0cywgc2VlCisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNTEyMgorICovCitzdGF0aWMgdm9pZCBzdHJpcF9pcHY2X3Njb3BlX2lkKGNoYXIgKmhvc3QpCit7CisJY2hhciAqc2NvcGUsICpjcDsKKworCS8qIGJib3ggd2dldCBhY3R1YWxseSBoYW5kbGVzIElQdjYgYWRkcmVzc2VzIHdpdGhvdXQgW10sIGxpa2UKKwkgKiB3Z2V0ICJodHRwOi8vOjoxL3h4eCIsIGJ1dCB0aGlzIGlzIG5vdCBzdGFuZGFyZC4KKwkgKiBUbyBzYXZlIGNvZGUsIF9oZXJlXyB3ZSBkbyBub3Qgc3VwcG9ydCBpdC4gKi8KKworCWlmIChob3N0WzBdICE9ICdbJykKKwkJcmV0dXJuOyAvKiBub3QgSVB2NiAqLworCisJc2NvcGUgPSBzdHJjaHIoaG9zdCwgJyUnKTsKKwlpZiAoIXNjb3BlKQorCQlyZXR1cm47CisKKwkvKiBSZW1vdmUgdGhlIElQdjYgem9uZSBpZGVudGlmaWVyIGZyb20gdGhlIGhvc3QgYWRkcmVzcyAqLworCWNwID0gc3RyY2hyKGhvc3QsICddJyk7CisJaWYgKCFjcCB8fCAoY3BbMV0gIT0gJzonICYmIGNwWzFdICE9ICdcMCcpKSB7CisJCS8qIG1hbGZvcm1lZCBhZGRyZXNzIChub3QgIlt4eF06bm4iIG9yICJbeHhdIikgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIGNwIHBvaW50cyB0byAiXS4uLiIsIHNjb3BlIHBvaW50cyB0byAiJWV0aDBdLi4uIiAqLworCW92ZXJsYXBwaW5nX3N0cmNweShzY29wZSwgY3ApOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTgorLyogQmFzZTY0LWVuY29kZSBjaGFyYWN0ZXIgc3RyaW5nLiAqLworc3RhdGljIGNoYXIgKmJhc2U2NGVuYyhjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKHN0cik7CisJaWYgKGxlbiA+IHNpemVvZihHLndnZXRfYnVmKS80KjMgLSAxMCkgLyogcGFyYW5vaWEgKi8KKwkJbGVuID0gc2l6ZW9mKEcud2dldF9idWYpLzQqMyAtIDEwOworCWJiX3V1ZW5jb2RlKEcud2dldF9idWYsIHN0ciwgbGVuLCBiYl91dWVuY190YmxfYmFzZTY0KTsKKwlyZXR1cm4gRy53Z2V0X2J1ZjsKK30KKyNlbmRpZgorCitzdGF0aWMgY2hhciogc2FuaXRpemVfc3RyaW5nKGNoYXIgKnMpCit7CisJdW5zaWduZWQgY2hhciAqcCA9ICh2b2lkICopIHM7CisJd2hpbGUgKCpwID49ICcgJykKKwkJcCsrOworCSpwID0gJ1wwJzsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIEZJTEUgKm9wZW5fc29ja2V0KGxlbl9hbmRfc29ja2FkZHIgKmxzYSkKK3sKKwlGSUxFICpmcDsKKworCS8qIGdsaWJjIDIuNCBzZWVtcyB0byB0cnkgc2Vla2luZyBvbiBpdCAtID8/ISAqLworCS8qIGhvcGVmdWxseSBpdCB1bmRlcnN0YW5kcyB3aGF0IEVTUElQRSBtZWFucy4uLiAqLworCWZwID0gZmRvcGVuKHhjb25uZWN0X3N0cmVhbShsc2EpLCAicisiKTsKKwlpZiAoZnAgPT0gTlVMTCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKworCXJldHVybiBmcDsKK30KKworLyogUmV0dXJucyAnXG4nIGlmIGl0IHdhcyBzZWVuLCBlbHNlICdcMCcuIFRyaW1zIGF0IGZpcnN0ICdccicgb3IgJ1xuJyAqLworc3RhdGljIGNoYXIgZmdldHNfYW5kX3RyaW0oRklMRSAqZnApCit7CisJY2hhciBjOworCWNoYXIgKmJ1Zl9wdHI7CisKKwlpZiAoZmdldHMoRy53Z2V0X2J1Ziwgc2l6ZW9mKEcud2dldF9idWYpIC0gMSwgZnApID09IE5VTEwpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgZ2V0dGluZyByZXNwb25zZSIpOworCisJYnVmX3B0ciA9IHN0cmNocm51bChHLndnZXRfYnVmLCAnXG4nKTsKKwljID0gKmJ1Zl9wdHI7CisJKmJ1Zl9wdHIgPSAnXDAnOworCWJ1Zl9wdHIgPSBzdHJjaHJudWwoRy53Z2V0X2J1ZiwgJ1xyJyk7CisJKmJ1Zl9wdHIgPSAnXDAnOworCisJbG9nX2lvKCI8ICVzIiwgRy53Z2V0X2J1Zik7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGludCBmdHBjbWQoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBGSUxFICpmcCkKK3sKKwlpbnQgcmVzdWx0OworCWlmIChzMSkgeworCQlpZiAoIXMyKQorCQkJczIgPSAiIjsKKwkJZnByaW50ZihmcCwgIiVzJXNcclxuIiwgczEsIHMyKTsKKwkJZmZsdXNoKGZwKTsKKwkJbG9nX2lvKCI+ICVzJXMiLCBzMSwgczIpOworCX0KKworCWRvIHsKKwkJZmdldHNfYW5kX3RyaW0oZnApOworCX0gd2hpbGUgKCFpc2RpZ2l0KEcud2dldF9idWZbMF0pIHx8IEcud2dldF9idWZbM10gIT0gJyAnKTsKKworCUcud2dldF9idWZbM10gPSAnXDAnOworCXJlc3VsdCA9IHhhdG9pX3Bvc2l0aXZlKEcud2dldF9idWYpOworCUcud2dldF9idWZbM10gPSAnICc7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfdXJsKGNvbnN0IGNoYXIgKnNyY191cmwsIHN0cnVjdCBob3N0X2luZm8gKmgpCit7CisJY2hhciAqdXJsLCAqcCwgKnNwOworCisJZnJlZShoLT5hbGxvY2F0ZWQpOworCWgtPmFsbG9jYXRlZCA9IHVybCA9IHhzdHJkdXAoc3JjX3VybCk7CisKKwlpZiAoc3RybmNtcCh1cmwsICJodHRwOi8vIiwgNykgPT0gMCkgeworCQloLT5wb3J0ID0gYmJfbG9va3VwX3BvcnQoImh0dHAiLCAidGNwIiwgODApOworCQloLT5ob3N0ID0gdXJsICsgNzsKKwkJaC0+aXNfZnRwID0gMDsKKwl9IGVsc2UgaWYgKHN0cm5jbXAodXJsLCAiZnRwOi8vIiwgNikgPT0gMCkgeworCQloLT5wb3J0ID0gYmJfbG9va3VwX3BvcnQoImZ0cCIsICJ0Y3AiLCAyMSk7CisJCWgtPmhvc3QgPSB1cmwgKyA2OworCQloLT5pc19mdHAgPSAxOworCX0gZWxzZQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGFuIGh0dHAgb3IgZnRwIHVybDogJXMiLCBzYW5pdGl6ZV9zdHJpbmcodXJsKSk7CisKKwkvLyBGWUk6CisJLy8gIlJlYWwiIHdnZXQgJ2h0dHA6Ly9idXN5Ym94Lm5ldD92YXI9YS9iJyBzZW5kcyB0aGlzIHJlcXVlc3Q6CisJLy8gICAnR0VUIC8/dmFyPWEvYiBIVFRQIDEuMCcKKwkvLyAgIGFuZCBzYXZlcyAnaW5kZXguaHRtbD92YXI9YSUyRmInICh3ZSBzYXZlICdiJykKKwkvLyB3Z2V0ICdodHRwOi8vYnVzeWJveC5uZXQ/bG9naW49am9obkBkb2UnOgorCS8vICAgcmVxdWVzdDogJ0dFVCAvP2xvZ2luPWpvaG5AZG9lIEhUVFAvMS4wJworCS8vICAgc2F2ZXM6ICdpbmRleC5odG1sP2xvZ2luPWpvaG5AZG9lJyAod2Ugc2F2ZSAnP2xvZ2luPWpvaG5AZG9lJykKKwkvLyB3Z2V0ICdodHRwOi8vYnVzeWJveC5uZXQjdGVzdC90ZXN0JzoKKwkvLyAgIHJlcXVlc3Q6ICdHRVQgLyBIVFRQLzEuMCcKKwkvLyAgIHNhdmVzOiAnaW5kZXguaHRtbCcgKHdlIHNhdmUgJ3Rlc3QnKQorCS8vCisJLy8gV2UgYWxzbyBkb24ndCBhZGQgdW5pcXVlIC5OIHN1ZmZpeCBpZiBmaWxlIGV4aXN0cy4uLgorCXNwID0gc3RyY2hyKGgtPmhvc3QsICcvJyk7CisJcCA9IHN0cmNocihoLT5ob3N0LCAnPycpOyBpZiAoIXNwIHx8IChwICYmIHNwID4gcCkpIHNwID0gcDsKKwlwID0gc3RyY2hyKGgtPmhvc3QsICcjJyk7IGlmICghc3AgfHwgKHAgJiYgc3AgPiBwKSkgc3AgPSBwOworCWlmICghc3ApIHsKKwkJaC0+cGF0aCA9ICIiOworCX0gZWxzZSBpZiAoKnNwID09ICcvJykgeworCQkqc3AgPSAnXDAnOworCQloLT5wYXRoID0gc3AgKyAxOworCX0gZWxzZSB7IC8vICcjJyBvciAnPycKKwkJLy8gaHR0cDovL2J1c3lib3gubmV0P2xvZ2luPWpvaG5AZG9lIGlzIGEgdmFsaWQgVVJMCisJCS8vIG1lbW1vdmUgY29udmVydHMgdG86CisJCS8vIGh0dHA6L2J1c3lib3gubmV0dD9sb2dpbj1qb2huQGRvZS4uLgorCQltZW1tb3ZlKGgtPmhvc3QgLSAxLCBoLT5ob3N0LCBzcCAtIGgtPmhvc3QpOworCQloLT5ob3N0LS07CisJCXNwWy0xXSA9ICdcMCc7CisJCWgtPnBhdGggPSBzcDsKKwl9CisKKwkvLyBXZSB1c2VkIHRvIHNldCBoLT51c2VyIHRvIE5VTEwgaGVyZSwgYnV0IHRoaXMgaW50ZXJmZXJlcworCS8vIHdpdGggaGFuZGxpbmcgb2YgY29kZSAzMDIgKCJvYmplY3Qgd2FzIG1vdmVkIikKKworCXNwID0gc3RycmNocihoLT5ob3N0LCAnQCcpOworCWlmIChzcCAhPSBOVUxMKSB7CisJCWgtPnVzZXIgPSBoLT5ob3N0OworCQkqc3AgPSAnXDAnOworCQloLT5ob3N0ID0gc3AgKyAxOworCX0KKworCXNwID0gaC0+aG9zdDsKK30KKworc3RhdGljIGNoYXIgKmdldGhkcihGSUxFICpmcCkKK3sKKwljaGFyICpzLCAqaGRydmFsOworCWludCBjOworCisJLyogKmlzdHJ1bmMgPSAwOyAqLworCisJLyogcmV0cmlldmUgaGVhZGVyIGxpbmUgKi8KKwljID0gZmdldHNfYW5kX3RyaW0oZnApOworCisJLyogZW5kIG9mIHRoZSBoZWFkZXJzPyAqLworCWlmIChHLndnZXRfYnVmWzBdID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCisJLyogY29udmVydCB0aGUgaGVhZGVyIG5hbWUgdG8gbG93ZXIgY2FzZSAqLworCWZvciAocyA9IEcud2dldF9idWY7IGlzYWxudW0oKnMpIHx8ICpzID09ICctJyB8fCAqcyA9PSAnLic7ICsrcykgeworCQkvKiB0b2xvd2VyIGZvciAiQS1aIiwgbm8tb3AgZm9yICIwLTlhLXotLiIgKi8KKwkJKnMgfD0gMHgyMDsKKwl9CisKKwkvKiB2ZXJpZnkgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciBuYW1lICovCisJaWYgKCpzICE9ICc6JykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBoZWFkZXIgbGluZTogJXMiLCBzYW5pdGl6ZV9zdHJpbmcoRy53Z2V0X2J1ZikpOworCisJLyogbG9jYXRlIHRoZSBzdGFydCBvZiB0aGUgaGVhZGVyIHZhbHVlICovCisJKnMrKyA9ICdcMCc7CisJaGRydmFsID0gc2tpcF93aGl0ZXNwYWNlKHMpOworCisJaWYgKGMgIT0gJ1xuJykgeworCQkvKiBSYXRzISBUaGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlIGhlYWRlciB2YWx1ZSAqLworCQl3aGlsZSAoYyA9IGdldGMoZnApLCBjICE9IEVPRiAmJiBjICE9ICdcbicpCisJCQljb250aW51ZTsKKwl9CisKKwlyZXR1cm4gaGRydmFsOworfQorCitzdGF0aWMgRklMRSogcHJlcGFyZV9mdHBfc2Vzc2lvbihGSUxFICoqZGZwcCwgc3RydWN0IGhvc3RfaW5mbyAqdGFyZ2V0LCBsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJRklMRSAqc2ZwOworCWNoYXIgKnN0cjsKKwlpbnQgcG9ydDsKKworCWlmICghdGFyZ2V0LT51c2VyKQorCQl0YXJnZXQtPnVzZXIgPSB4c3RyZHVwKCJhbm9ueW1vdXM6YnVzeWJveEAiKTsKKworCXNmcCA9IG9wZW5fc29ja2V0KGxzYSk7CisJaWYgKGZ0cGNtZChOVUxMLCBOVUxMLCBzZnApICE9IDIyMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgc2FuaXRpemVfc3RyaW5nKEcud2dldF9idWYgKyA0KSk7CisKKwkvKgorCSAqIFNwbGl0dGluZyB1c2VybmFtZTpwYXNzd29yZCBwYWlyLAorCSAqIHRyeWluZyB0byBsb2cgaW4KKwkgKi8KKwlzdHIgPSBzdHJjaHIodGFyZ2V0LT51c2VyLCAnOicpOworCWlmIChzdHIpCisJCSpzdHIrKyA9ICdcMCc7CisJc3dpdGNoIChmdHBjbWQoIlVTRVIgIiwgdGFyZ2V0LT51c2VyLCBzZnApKSB7CisJY2FzZSAyMzA6CisJCWJyZWFrOworCWNhc2UgMzMxOgorCQlpZiAoZnRwY21kKCJQQVNTICIsIHN0ciwgc2ZwKSA9PSAyMzApCisJCQlicmVhazsKKwkJLyogZmFsbCB0aHJvdWdoIChmYWlsZWQgbG9naW4pICovCisJZGVmYXVsdDoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZ0cCBsb2dpbjogJXMiLCBzYW5pdGl6ZV9zdHJpbmcoRy53Z2V0X2J1ZiArIDQpKTsKKwl9CisKKwlmdHBjbWQoIlRZUEUgSSIsIE5VTEwsIHNmcCk7CisKKwkvKgorCSAqIFF1ZXJ5aW5nIGZpbGUgc2l6ZQorCSAqLworCWlmIChmdHBjbWQoIlNJWkUgIiwgdGFyZ2V0LT5wYXRoLCBzZnApID09IDIxMykgeworCQlHLmNvbnRlbnRfbGVuID0gQkJfU1RSVE9PRkYoRy53Z2V0X2J1ZiArIDQsIE5VTEwsIDEwKTsKKwkJaWYgKEcuY29udGVudF9sZW4gPCAwIHx8IGVycm5vKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiU0laRSB2YWx1ZSBpcyBnYXJiYWdlIik7CisJCX0KKwkJRy5nb3RfY2xlbiA9IDE7CisJfQorCisJLyoKKwkgKiBFbnRlcmluZyBwYXNzaXZlIG1vZGUKKwkgKi8KKwlpZiAoZnRwY21kKCJQQVNWIiwgTlVMTCwgc2ZwKSAhPSAyMjcpIHsKKyBwYXN2X2Vycm9yOgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIHJlc3BvbnNlIHRvICVzOiAlcyIsICJQQVNWIiwgc2FuaXRpemVfc3RyaW5nKEcud2dldF9idWYpKTsKKwl9CisJLy8gUmVzcG9uc2UgaXMgIjIyNyBnYXJiYWdlTjEsTjIsTjMsTjQsUDEsUDJbKWdhcmJhZ2VdCisJLy8gU2VydmVyJ3MgSVAgaXMgTjEuTjIuTjMuTjQgKHdlIGlnbm9yZSBpdCkKKwkvLyBTZXJ2ZXIncyBwb3J0IGZvciBkYXRhIGNvbm5lY3Rpb24gaXMgUDEqMjU2K1AyCisJc3RyID0gc3RycmNocihHLndnZXRfYnVmLCAnKScpOworCWlmIChzdHIpIHN0clswXSA9ICdcMCc7CisJc3RyID0gc3RycmNocihHLndnZXRfYnVmLCAnLCcpOworCWlmICghc3RyKSBnb3RvIHBhc3ZfZXJyb3I7CisJcG9ydCA9IHhhdG91X3JhbmdlKHN0cisxLCAwLCAyNTUpOworCSpzdHIgPSAnXDAnOworCXN0ciA9IHN0cnJjaHIoRy53Z2V0X2J1ZiwgJywnKTsKKwlpZiAoIXN0cikgZ290byBwYXN2X2Vycm9yOworCXBvcnQgKz0geGF0b3VfcmFuZ2Uoc3RyKzEsIDAsIDI1NSkgKiAyNTY7CisJc2V0X25wb3J0KCZsc2EtPnUuc2EsIGh0b25zKHBvcnQpKTsKKworCSpkZnBwID0gb3Blbl9zb2NrZXQobHNhKTsKKworCWlmIChHLmJlZ19yYW5nZSkgeworCQlzcHJpbnRmKEcud2dldF9idWYsICJSRVNUICUiT0ZGX0ZNVCJ1IiwgRy5iZWdfcmFuZ2UpOworCQlpZiAoZnRwY21kKEcud2dldF9idWYsIE5VTEwsIHNmcCkgPT0gMzUwKQorCQkJRy5jb250ZW50X2xlbiAtPSBHLmJlZ19yYW5nZTsKKwl9CisKKwlpZiAoZnRwY21kKCJSRVRSICIsIHRhcmdldC0+cGF0aCwgc2ZwKSA+IDE1MCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByZXNwb25zZSB0byAlczogJXMiLCAiUkVUUiIsIHNhbml0aXplX3N0cmluZyhHLndnZXRfYnVmKSk7CisKKwlyZXR1cm4gc2ZwOworfQorCitzdGF0aWMgdm9pZCBOT0lOTElORSByZXRyaWV2ZV9maWxlX2RhdGEoRklMRSAqZGZwKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIHx8IEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorIyBpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1RJTUVPVVQKKwl1bnNpZ25lZCBzZWNvbmRfY250OworIyBlbmRpZgorCXN0cnVjdCBwb2xsZmQgcG9sbGRhdGE7CisKKwlwb2xsZGF0YS5mZCA9IGZpbGVubyhkZnApOworCXBvbGxkYXRhLmV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkk7CisjZW5kaWYKKwlwcm9ncmVzc19tZXRlcihQUk9HUkVTU19TVEFSVCk7CisKKwlpZiAoRy5jaHVua2VkKQorCQlnb3RvIGdldF9jbGVuOworCisJLyogTG9vcHMgb25seSBpZiBjaHVua2VkICovCisJd2hpbGUgKDEpIHsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIHx8IEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCQkvKiBNdXN0IHVzZSBub25ibG9ja2luZyBJL08sIG90aGVyd2lzZSBmcmVhZCB3aWxsIGxvb3AKKwkJICogYW5kICpibG9jayogdW50aWwgaXQgcmVhZHMgZnVsbCBidWZmZXIsCisJCSAqIHdoaWNoIG1lc3NlcyB1cCBwcm9ncmVzcyBiYXIgYW5kL29yIHRpbWVvdXQgbG9naWMuCisJCSAqIEJlY2F1c2Ugb2Ygbm9uYmxvY2tpbmcgSS9PLCB3ZSBuZWVkIHRvIGRhbmNlCisJCSAqIHZlcnkgY2FyZWZ1bGx5IGFyb3VuZCBFQUdBSU4uIFNlZSBleHBsYW5hdGlvbiBhdAorCQkgKiBjbGVhcmVycigpIGNhbGwuCisJCSAqLworCQluZGVsYXlfb24ocG9sbGRhdGEuZmQpOworI2VuZGlmCisJCXdoaWxlICgxKSB7CisJCQlpbnQgbjsKKwkJCXVuc2lnbmVkIHJkc3o7CisKKwkJCXJkc3ogPSBzaXplb2YoRy53Z2V0X2J1Zik7CisJCQlpZiAoRy5nb3RfY2xlbikgeworCQkJCWlmIChHLmNvbnRlbnRfbGVuIDwgKG9mZl90KXNpemVvZihHLndnZXRfYnVmKSkgeworCQkJCQlpZiAoKGludClHLmNvbnRlbnRfbGVuIDw9IDApCisJCQkJCQlicmVhazsKKwkJCQkJcmRzeiA9ICh1bnNpZ25lZClHLmNvbnRlbnRfbGVuOworCQkJCX0KKwkJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIHx8IEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorIyBpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1RJTUVPVVQKKwkJCXNlY29uZF9jbnQgPSBHLnRpbWVvdXRfc2Vjb25kczsKKyMgZW5kaWYKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKHNhZmVfcG9sbCgmcG9sbGRhdGEsIDEsIDEwMDApICE9IDApCisJCQkJCWJyZWFrOyAvKiBlcnJvciwgRU9GLCBvciBkYXRhIGlzIGF2YWlsYWJsZSAqLworIyBpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1RJTUVPVVQKKwkJCQlpZiAoc2Vjb25kX2NudCAhPSAwICYmIC0tc2Vjb25kX2NudCA9PSAwKSB7CisJCQkJCXByb2dyZXNzX21ldGVyKFBST0dSRVNTX0VORCk7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkb3dubG9hZCB0aW1lZCBvdXQiKTsKKwkJCQl9CisjIGVuZGlmCisJCQkJLyogTmVlZGVkIGZvciAic3RhbGxlZCIgaW5kaWNhdG9yICovCisJCQkJcHJvZ3Jlc3NfbWV0ZXIoUFJPR1JFU1NfQlVNUCk7CisJCQl9CisKKwkJCS8qIGZyZWFkIGludGVybmFsbHkgdXNlcyByZWFkIGxvb3AsIHdoaWNoIGluIG91ciBjYXNlCisJCQkgKiBpcyB1c3VhbGx5IGV4aXRlZCB3aGVuIHdlIGdldCBFQUdBSU4uCisJCQkgKiBJbiB0aGlzIGNhc2UsIGxpYmMgc2V0cyBlcnJvciBtYXJrZXIgb24gdGhlIHN0cmVhbS4KKwkJCSAqIE5lZWQgdG8gY2xlYXIgaXQgYmVmb3JlIG5leHQgZnJlYWQgdG8gYXZvaWQgcG9zc2libGUKKwkJCSAqIHJhcmUgZmFsc2UgcG9zaXRpdmUgZmVycm9yIGJlbG93LiBSYXJlIGJlY2F1c2UgdXN1YWxseQorCQkJICogZnJlYWQgZ2V0cyBtb3JlIHRoYW4gemVybyBieXRlcywgYW5kIHdlIGRvbid0IGZhbGwKKwkJCSAqIGludG8gaWYgKG4gPD0gMCkgLi4uCisJCQkgKi8KKwkJCWNsZWFyZXJyKGRmcCk7CisJCQllcnJubyA9IDA7CisjZW5kaWYKKwkJCW4gPSBmcmVhZChHLndnZXRfYnVmLCAxLCByZHN6LCBkZnApOworCQkJLyogbWFuIGZyZWFkOgorCQkJICogSWYgZXJyb3Igb2NjdXJzLCBvciBFT0YgaXMgcmVhY2hlZCwgdGhlIHJldHVybiB2YWx1ZQorCQkJICogaXMgYSBzaG9ydCBpdGVtIGNvdW50IChvciB6ZXJvKS4KKwkJCSAqIGZyZWFkIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gRU9GIGFuZCBlcnJvci4KKwkJCSAqLworCQkJaWYgKG4gPD0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIHx8IEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCQkJCWlmIChlcnJubyA9PSBFQUdBSU4pIC8qIHBvbGwgbGllZCwgdGhlcmUgaXMgbm8gZGF0YT8gKi8KKwkJCQkJY29udGludWU7IC8qIHllcyAqLworI2VuZGlmCisJCQkJaWYgKGZlcnJvcihkZnApKQorCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJCWJyZWFrOyAvKiBFT0YsIG5vdCBlcnJvciAqLworCQkJfQorCisJCQl4d3JpdGUoRy5vdXRwdXRfZmQsIEcud2dldF9idWYsIG4pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIKKwkJCUcudHJhbnNmZXJyZWQgKz0gbjsKKwkJCXByb2dyZXNzX21ldGVyKFBST0dSRVNTX0JVTVApOworI2VuZGlmCisJCQlpZiAoRy5nb3RfY2xlbikgeworCQkJCUcuY29udGVudF9sZW4gLT0gbjsKKwkJCQlpZiAoRy5jb250ZW50X2xlbiA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIHx8IEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCQljbGVhcmVycihkZnApOworCQluZGVsYXlfb2ZmKHBvbGxkYXRhLmZkKTsgLyogZWxzZSBmZ2V0cyBjYW4gZ2V0IHZlcnkgdW5oYXBweSAqLworI2VuZGlmCisJCWlmICghRy5jaHVua2VkKQorCQkJYnJlYWs7CisKKwkJZmdldHNfYW5kX3RyaW0oZGZwKTsgLyogRWF0IGVtcHR5IGxpbmUgKi8KKyBnZXRfY2xlbjoKKwkJZmdldHNfYW5kX3RyaW0oZGZwKTsKKwkJRy5jb250ZW50X2xlbiA9IFNUUlRPT0ZGKEcud2dldF9idWYsIE5VTEwsIDE2KTsKKwkJLyogRklYTUU6IGVycm9yIGNoZWNrPyAqLworCQlpZiAoRy5jb250ZW50X2xlbiA9PSAwKQorCQkJYnJlYWs7IC8qIGFsbCBkb25lISAqLworCQlHLmdvdF9jbGVuID0gMTsKKwl9CisKKwkvKiBEcmF3IGZ1bGwgYmFyIGFuZCBmcmVlIGl0cyByZXNvdXJjZXMgKi8KKwlHLmNodW5rZWQgPSAwOyAgLyogbWFrZXMgaXQgc2hvdyAxMDAlIGV2ZW4gZm9yIGNodW5rZWQgZG93bmxvYWQgKi8KKwlHLmdvdF9jbGVuID0gMTsgLyogbWFrZXMgaXQgc2hvdyAxMDAlIGV2ZW4gZm9yIGRvd25sb2FkIG9mIChmb3JtZXJseSkgdW5rbm93biBzaXplICovCisJcHJvZ3Jlc3NfbWV0ZXIoUFJPR1JFU1NfRU5EKTsKK30KKworc3RhdGljIHZvaWQgZG93bmxvYWRfb25lX3VybChjb25zdCBjaGFyICp1cmwpCit7CisJYm9vbCB1c2VfcHJveHk7ICAgICAgICAgICAgICAgICAvKiBVc2UgcHJveGllcyBpZiBlbnYgdmFycyBhcmUgc2V0ICAqLworCWludCByZWRpcl9saW1pdDsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJRklMRSAqc2ZwOyAgICAgICAgICAgICAgICAgICAgICAvKiBzb2NrZXQgdG8gd2ViL2Z0cCBzZXJ2ZXIgICAgICAgICAqLworCUZJTEUgKmRmcDsgICAgICAgICAgICAgICAgICAgICAgLyogc29ja2V0IHRvIGZ0cCBzZXJ2ZXIgKGRhdGEpICAgICAgKi8KKwljaGFyICpwcm94eSA9IE5VTEw7CisJY2hhciAqZm5hbWVfb3V0X2FsbG9jOworCXN0cnVjdCBob3N0X2luZm8gc2VydmVyOworCXN0cnVjdCBob3N0X2luZm8gdGFyZ2V0OworCisJc2VydmVyLmFsbG9jYXRlZCA9IE5VTEw7CisJdGFyZ2V0LmFsbG9jYXRlZCA9IE5VTEw7CisJc2VydmVyLnVzZXIgPSBOVUxMOworCXRhcmdldC51c2VyID0gTlVMTDsKKworCXBhcnNlX3VybCh1cmwsICZ0YXJnZXQpOworCisJLyogVXNlIHRoZSBwcm94eSBpZiBuZWNlc3NhcnkgKi8KKwl1c2VfcHJveHkgPSAoc3RyY21wKEcucHJveHlfZmxhZywgIm9mZiIpICE9IDApOworCWlmICh1c2VfcHJveHkpIHsKKwkJcHJveHkgPSBnZXRlbnYodGFyZ2V0LmlzX2Z0cCA/ICJmdHBfcHJveHkiIDogImh0dHBfcHJveHkiKTsKKwkJdXNlX3Byb3h5ID0gKHByb3h5ICYmIHByb3h5WzBdKTsKKwkJaWYgKHVzZV9wcm94eSkKKwkJCXBhcnNlX3VybChwcm94eSwgJnNlcnZlcik7CisJfQorCWlmICghdXNlX3Byb3h5KSB7CisJCXNlcnZlci5wb3J0ID0gdGFyZ2V0LnBvcnQ7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9JUFY2KSB7CisJCQkvL2ZyZWUoc2VydmVyLmFsbG9jYXRlZCk7IC0gY2FuJ3QgYmUgbm9uLU5VTEwKKwkJCXNlcnZlci5ob3N0ID0gc2VydmVyLmFsbG9jYXRlZCA9IHhzdHJkdXAodGFyZ2V0Lmhvc3QpOworCQl9IGVsc2UgeworCQkJc2VydmVyLmhvc3QgPSB0YXJnZXQuaG9zdDsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9JUFY2KQorCQlzdHJpcF9pcHY2X3Njb3BlX2lkKHRhcmdldC5ob3N0KTsKKworCS8qIElmIHRoZXJlIHdhcyBubyAtTyBGSUxFLCBndWVzcyBvdXRwdXQgZmlsZW5hbWUgKi8KKwlmbmFtZV9vdXRfYWxsb2MgPSBOVUxMOworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBXR0VUX09QVF9PVVROQU1FKSkgeworCQlHLmZuYW1lX291dCA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAodGFyZ2V0LnBhdGgpOworCQkvKiBoYW5kbGUgIndnZXQgaHR0cDovL2tlcm5lbC5vcmcvLyIgKi8KKwkJaWYgKEcuZm5hbWVfb3V0WzBdID09ICcvJyB8fCAhRy5mbmFtZV9vdXRbMF0pCisJCQlHLmZuYW1lX291dCA9IChjaGFyKikiaW5kZXguaHRtbCI7CisJCS8qIC1QIERJUiBpcyBjb25zaWRlcmVkIG9ubHkgaWYgdGhlcmUgd2FzIG5vIC1PIEZJTEUgKi8KKwkJZWxzZSB7CisJCQlpZiAoRy5kaXJfcHJlZml4KQorCQkJCUcuZm5hbWVfb3V0ID0gZm5hbWVfb3V0X2FsbG9jID0gY29uY2F0X3BhdGhfZmlsZShHLmRpcl9wcmVmaXgsIEcuZm5hbWVfb3V0KTsKKwkJCWVsc2UgeworCQkJCS8qIHJlZGlyZWN0cyBtYXkgZnJlZSB0YXJnZXQucGF0aCBsYXRlciwgbmVlZCB0byBtYWtlIGEgY29weSAqLworCQkJCUcuZm5hbWVfb3V0ID0gZm5hbWVfb3V0X2FsbG9jID0geHN0cmR1cChHLmZuYW1lX291dCk7CisJCQl9CisJCX0KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIKKwlHLmN1cmZpbGUgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKEcuZm5hbWVfb3V0KTsKKyNlbmRpZgorCisJLyogRGV0ZXJtaW5lIHdoZXJlIHRvIHN0YXJ0IHRyYW5zZmVyICovCisJRy5iZWdfcmFuZ2UgPSAwOworCWlmIChvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfQ09OVElOVUUpIHsKKwkJRy5vdXRwdXRfZmQgPSBvcGVuKEcuZm5hbWVfb3V0LCBPX1dST05MWSk7CisJCWlmIChHLm91dHB1dF9mZCA+PSAwKSB7CisJCQlHLmJlZ19yYW5nZSA9IHhsc2VlayhHLm91dHB1dF9mZCwgMCwgU0VFS19FTkQpOworCQl9CisJCS8qIEZpbGUgZG9lc24ndCBleGlzdC4gV2UgZG8gbm90IGNyZWF0ZSBmaWxlIGhlcmUgeWV0LgorCQkgKiBXZSBhcmUgbm90IHN1cmUgaXQgZXhpc3RzIG9uIHJlbW90ZSBzaWRlICovCisJfQorCisJcmVkaXJfbGltaXQgPSA1OworIHJlc29sdmVfbHNhOgorCWxzYSA9IHhob3N0MnNvY2thZGRyKHNlcnZlci5ob3N0LCBzZXJ2ZXIucG9ydCk7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIFdHRVRfT1BUX1FVSUVUKSkgeworCQljaGFyICpzID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJmxzYS0+dS5zYSk7CisJCWZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGluZyB0byAlcyAoJXMpXG4iLCBzZXJ2ZXIuaG9zdCwgcyk7CisJCWZyZWUocyk7CisJfQorIGVzdGFibGlzaF9zZXNzaW9uOgorCS8qRy5jb250ZW50X2xlbiA9IDA7IC0gcmVkdW5kYW50LCBnb3RfY2xlbiA9IDAgaXMgZW5vdWdoICovCisJRy5nb3RfY2xlbiA9IDA7CisJRy5jaHVua2VkID0gMDsKKwlpZiAodXNlX3Byb3h5IHx8ICF0YXJnZXQuaXNfZnRwKSB7CisJCS8qCisJCSAqICBIVFRQIHNlc3Npb24KKwkJICovCisJCWNoYXIgKnN0cjsKKwkJaW50IHN0YXR1czsKKworCisJCS8qIE9wZW4gc29ja2V0IHRvIGh0dHAgc2VydmVyICovCisJCXNmcCA9IG9wZW5fc29ja2V0KGxzYSk7CisKKwkJLyogU2VuZCBIVFRQIHJlcXVlc3QgKi8KKwkJaWYgKHVzZV9wcm94eSkgeworCQkJZnByaW50ZihzZnAsICJHRVQgJXN0cDovLyVzLyVzIEhUVFAvMS4xXHJcbiIsCisJCQkJdGFyZ2V0LmlzX2Z0cCA/ICJmIiA6ICJodCIsIHRhcmdldC5ob3N0LAorCQkJCXRhcmdldC5wYXRoKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfUE9TVF9EQVRBKQorCQkJCWZwcmludGYoc2ZwLCAiUE9TVCAvJXMgSFRUUC8xLjFcclxuIiwgdGFyZ2V0LnBhdGgpOworCQkJZWxzZQorCQkJCWZwcmludGYoc2ZwLCAiR0VUIC8lcyBIVFRQLzEuMVxyXG4iLCB0YXJnZXQucGF0aCk7CisJCX0KKworCQlmcHJpbnRmKHNmcCwgIkhvc3Q6ICVzXHJcblVzZXItQWdlbnQ6ICVzXHJcbiIsCisJCQl0YXJnZXQuaG9zdCwgRy51c2VyX2FnZW50KTsKKworCQkvKiBBc2sgc2VydmVyIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFzIHNvb24gYXMgd2UgYXJlIGRvbmUKKwkJICogKElPVzogd2UgZG8gbm90IGludGVuZCB0byBzZW5kIG1vcmUgcmVxdWVzdHMpCisJCSAqLworCQlmcHJpbnRmKHNmcCwgIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTgorCQlpZiAodGFyZ2V0LnVzZXIpIHsKKy8vVE9ETzogVVJMLWRlY29kZSAidXNlcjpwYXNzd29yZCIgc3RyaW5nIGJlZm9yZSBiYXNlNjQtZW5jb2Rpbmc6CisvL3dnZXQgaHR0cDovL3Rlc3Q6bXklMjBwYXNzQGV4YW1wbGUuY29tIHNob3VsZCBzZW5kCisvLyBBdXRob3JpemF0aW9uOiBCYXNpYyBkR1Z6ZERwdGVTQndZWE56CisvL3doaWNoIGRlY29kZXMgdG8gInRlc3Q6bXkgcGFzcyIsIGluc3RlYWQgb2Ygd2hhdCB3ZSBzZW5kIG5vdzoKKy8vIEF1dGhvcml6YXRpb246IEJhc2ljIGRHVnpkRHB0ZVNVeU1IQmhjM009CisvL0NhbiByZXVzZSBkZWNvZGVTdHJpbmcoKSBmcm9tIGh0dHBkLmMKKwkJCWZwcmludGYoc2ZwLCAiUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgJXNcclxuIis2LAorCQkJCWJhc2U2NGVuYyh0YXJnZXQudXNlcikpOworCQl9CisJCWlmICh1c2VfcHJveHkgJiYgc2VydmVyLnVzZXIpIHsKKwkJCWZwcmludGYoc2ZwLCAiUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgJXNcclxuIiwKKwkJCQliYXNlNjRlbmMoc2VydmVyLnVzZXIpKTsKKwkJfQorI2VuZGlmCisKKwkJaWYgKEcuYmVnX3JhbmdlKQorCQkJZnByaW50ZihzZnAsICJSYW5nZTogYnl0ZXM9JSJPRkZfRk1UInUtXHJcbiIsIEcuYmVnX3JhbmdlKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisJCWlmIChHLmV4dHJhX2hlYWRlcnMpCisJCQlmcHV0cyhHLmV4dHJhX2hlYWRlcnMsIHNmcCk7CisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBXR0VUX09QVF9QT1NUX0RBVEEpIHsKKwkJCWZwcmludGYoc2ZwLAorCQkJCSJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxyXG4iCisJCQkJIkNvbnRlbnQtTGVuZ3RoOiAldVxyXG4iCisJCQkJIlxyXG4iCisJCQkJIiVzIiwKKwkJCQkoaW50KSBzdHJsZW4oRy5wb3N0X2RhdGEpLCBHLnBvc3RfZGF0YQorCQkJKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJZnByaW50ZihzZnAsICJcclxuIik7CisJCX0KKworCQlmZmx1c2goc2ZwKTsKKworCQkvKgorCQkgKiBSZXRyaWV2ZSBIVFRQIHJlc3BvbnNlIGxpbmUgYW5kIGNoZWNrIGZvciAiMjAwIiBzdGF0dXMgY29kZS4KKwkJICovCisgcmVhZF9yZXNwb25zZToKKwkJZmdldHNfYW5kX3RyaW0oc2ZwKTsKKworCQlzdHIgPSBHLndnZXRfYnVmOworCQlzdHIgPSBza2lwX25vbl93aGl0ZXNwYWNlKHN0cik7CisJCXN0ciA9IHNraXBfd2hpdGVzcGFjZShzdHIpOworCQkvLyBGSVhNRTogbm8gZXJyb3IgY2hlY2sKKwkJLy8geGF0b3Ugd291bGRuJ3Qgd29yazogIjIwMCBPSyIKKwkJc3RhdHVzID0gYXRvaShzdHIpOworCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIDA6CisJCWNhc2UgMTAwOgorCQkJd2hpbGUgKGdldGhkcihzZnApICE9IE5VTEwpCisJCQkJLyogZWF0IGFsbCByZW1haW5pbmcgaGVhZGVycyAqLzsKKwkJCWdvdG8gcmVhZF9yZXNwb25zZTsKKwkJY2FzZSAyMDA6CisvKgorUmVzcG9uc2UgMjA0IGRvZXNuJ3Qgc2F5ICJudWxsIGZpbGUiLCBpdCBzYXlzICJtZXRhZGF0YQoraGFzIGNoYW5nZWQgYnV0IGRhdGEgZGlkbid0IjoKKworIjEwLjIuNSAyMDQgTm8gQ29udGVudAorVGhlIHNlcnZlciBoYXMgZnVsZmlsbGVkIHRoZSByZXF1ZXN0IGJ1dCBkb2VzIG5vdCBuZWVkIHRvIHJldHVybgorYW4gZW50aXR5LWJvZHksIGFuZCBtaWdodCB3YW50IHRvIHJldHVybiB1cGRhdGVkIG1ldGFpbmZvcm1hdGlvbi4KK1RoZSByZXNwb25zZSBNQVkgaW5jbHVkZSBuZXcgb3IgdXBkYXRlZCBtZXRhaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0KK29mIGVudGl0eS1oZWFkZXJzLCB3aGljaCBpZiBwcmVzZW50IFNIT1VMRCBiZSBhc3NvY2lhdGVkIHdpdGgKK3RoZSByZXF1ZXN0ZWQgdmFyaWFudC4KKworSWYgdGhlIGNsaWVudCBpcyBhIHVzZXIgYWdlbnQsIGl0IFNIT1VMRCBOT1QgY2hhbmdlIGl0cyBkb2N1bWVudAordmlldyBmcm9tIHRoYXQgd2hpY2ggY2F1c2VkIHRoZSByZXF1ZXN0IHRvIGJlIHNlbnQuIFRoaXMgcmVzcG9uc2UKK2lzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhbGxvdyBpbnB1dCBmb3IgYWN0aW9ucyB0byB0YWtlIHBsYWNlCit3aXRob3V0IGNhdXNpbmcgYSBjaGFuZ2UgdG8gdGhlIHVzZXIgYWdlbnQncyBhY3RpdmUgZG9jdW1lbnQgdmlldywKK2FsdGhvdWdoIGFueSBuZXcgb3IgdXBkYXRlZCBtZXRhaW5mb3JtYXRpb24gU0hPVUxEIGJlIGFwcGxpZWQKK3RvIHRoZSBkb2N1bWVudCBjdXJyZW50bHkgaW4gdGhlIHVzZXIgYWdlbnQncyBhY3RpdmUgdmlldy4KKworVGhlIDIwNCByZXNwb25zZSBNVVNUIE5PVCBpbmNsdWRlIGEgbWVzc2FnZS1ib2R5LCBhbmQgdGh1cworaXMgYWx3YXlzIHRlcm1pbmF0ZWQgYnkgdGhlIGZpcnN0IGVtcHR5IGxpbmUgYWZ0ZXIgdGhlIGhlYWRlciBmaWVsZHMuIgorCitIb3dldmVyLCBpbiByZWFsIHdvcmxkIGl0IHdhcyBvYnNlcnZlZCB0aGF0IHNvbWUgd2ViIHNlcnZlcnMKKyhlLmcuIEJvYS8wLjk0LjE0cmMyMSkgc2ltcGx5IHVzZSBjb2RlIDIwNCB3aGVuIGZpbGUgc2l6ZSBpcyB6ZXJvLgorKi8KKwkJY2FzZSAyMDQ6CisJCQlicmVhazsKKwkJY2FzZSAzMDA6ICAvKiByZWRpcmVjdGlvbiAqLworCQljYXNlIDMwMToKKwkJY2FzZSAzMDI6CisJCWNhc2UgMzAzOgorCQkJYnJlYWs7CisJCWNhc2UgMjA2OgorCQkJaWYgKEcuYmVnX3JhbmdlKQorCQkJCWJyZWFrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2VydmVyIHJldHVybmVkIGVycm9yOiAlcyIsIHNhbml0aXplX3N0cmluZyhHLndnZXRfYnVmKSk7CisJCX0KKworCQkvKgorCQkgKiBSZXRyaWV2ZSBIVFRQIGhlYWRlcnMuCisJCSAqLworCQl3aGlsZSAoKHN0ciA9IGdldGhkcihzZnApKSAhPSBOVUxMKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCQkJImNvbnRlbnQtbGVuZ3RoXDAiInRyYW5zZmVyLWVuY29kaW5nXDAiImxvY2F0aW9uXDAiOworCQkJZW51bSB7CisJCQkJS0VZX2NvbnRlbnRfbGVuZ3RoID0gMSwgS0VZX3RyYW5zZmVyX2VuY29kaW5nLCBLRVlfbG9jYXRpb24KKwkJCX07CisJCQlzbWFsbHVpbnQga2V5OworCisJCQkvKiBnZXRoZHIgY29udmVydGVkICJGT086IiBzdHJpbmcgdG8gbG93ZXJjYXNlICovCisKKwkJCS8qIHN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKwkJCWNoYXIgKnMgPSBzdHJjaHJudWwoc3RyLCAnXDAnKSAtIDE7CisJCQl3aGlsZSAocyA+PSBzdHIgJiYgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSkgeworCQkJCSpzID0gJ1wwJzsKKwkJCQlzLS07CisJCQl9CisJCQlrZXkgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCBHLndnZXRfYnVmKSArIDE7CisJCQlpZiAoa2V5ID09IEtFWV9jb250ZW50X2xlbmd0aCkgeworCQkJCUcuY29udGVudF9sZW4gPSBCQl9TVFJUT09GRihzdHIsIE5VTEwsIDEwKTsKKwkJCQlpZiAoRy5jb250ZW50X2xlbiA8IDAgfHwgZXJybm8pIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvbnRlbnQtbGVuZ3RoICVzIGlzIGdhcmJhZ2UiLCBzYW5pdGl6ZV9zdHJpbmcoc3RyKSk7CisJCQkJfQorCQkJCUcuZ290X2NsZW4gPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGtleSA9PSBLRVlfdHJhbnNmZXJfZW5jb2RpbmcpIHsKKwkJCQlpZiAoc3RyY21wKHN0cl90b2xvd2VyKHN0ciksICJjaHVua2VkIikgIT0gMCkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRyYW5zZmVyIGVuY29kaW5nICclcycgaXMgbm90IHN1cHBvcnRlZCIsIHNhbml0aXplX3N0cmluZyhzdHIpKTsKKwkJCQlHLmNodW5rZWQgPSAxOworCQkJfQorCQkJaWYgKGtleSA9PSBLRVlfbG9jYXRpb24gJiYgc3RhdHVzID49IDMwMCkgeworCQkJCWlmICgtLXJlZGlyX2xpbWl0ID09IDApCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSByZWRpcmVjdGlvbnMiKTsKKwkJCQlmY2xvc2Uoc2ZwKTsKKwkJCQlpZiAoc3RyWzBdID09ICcvJykgeworCQkJCQlmcmVlKHRhcmdldC5hbGxvY2F0ZWQpOworCQkJCQl0YXJnZXQucGF0aCA9IHRhcmdldC5hbGxvY2F0ZWQgPSB4c3RyZHVwKHN0cisxKTsKKwkJCQkJLyogbHNhIHN0YXlzIHRoZSBzYW1lOiBpdCdzIG9uIHRoZSBzYW1lIHNlcnZlciAqLworCQkJCX0gZWxzZSB7CisJCQkJCXBhcnNlX3VybChzdHIsICZ0YXJnZXQpOworCQkJCQlpZiAoIXVzZV9wcm94eSkgeworCQkJCQkJZnJlZShzZXJ2ZXIuYWxsb2NhdGVkKTsKKwkJCQkJCXNlcnZlci5hbGxvY2F0ZWQgPSBOVUxMOworCQkJCQkJc2VydmVyLmhvc3QgPSB0YXJnZXQuaG9zdDsKKwkJCQkJCS8qIHN0cmlwX2lwdjZfc2NvcGVfaWQodGFyZ2V0Lmhvc3QpOyAtIG5vISAqLworCQkJCQkJLyogd2UgYXNzdW1lIHJlbW90ZSBuZXZlciBnaXZlcyB1cyBJUHY2IGFkZHIgd2l0aCBzY29wZSBpZCAqLworCQkJCQkJc2VydmVyLnBvcnQgPSB0YXJnZXQucG9ydDsKKwkJCQkJCWZyZWUobHNhKTsKKwkJCQkJCWdvdG8gcmVzb2x2ZV9sc2E7CisJCQkJCX0gLyogZWxzZTogbHNhIHN0YXlzIHRoZSBzYW1lOiB3ZSB1c2UgcHJveHkgKi8KKwkJCQl9CisJCQkJZ290byBlc3RhYmxpc2hfc2Vzc2lvbjsKKwkJCX0KKwkJfQorLy8JCWlmIChzdGF0dXMgPj0gMzAwKQorLy8JCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIHJlZGlyZWN0aW9uIChubyBMb2NhdGlvbjogaGVhZGVyIGZyb20gc2VydmVyKSIpOworCisJCS8qIEZvciBIVFRQLCBkYXRhIGlzIHB1bXBlZCBvdmVyIHRoZSBzYW1lIGNvbm5lY3Rpb24gKi8KKwkJZGZwID0gc2ZwOworCisJfSBlbHNlIHsKKwkJLyoKKwkJICogIEZUUCBzZXNzaW9uCisJCSAqLworCQlzZnAgPSBwcmVwYXJlX2Z0cF9zZXNzaW9uKCZkZnAsICZ0YXJnZXQsIGxzYSk7CisJfQorCisJZnJlZShsc2EpOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIFdHRVRfT1BUX1NQSURFUikpIHsKKwkJaWYgKEcub3V0cHV0X2ZkIDwgMCkKKwkJCUcub3V0cHV0X2ZkID0geG9wZW4oRy5mbmFtZV9vdXQsIEcub19mbGFncyk7CisJCXJldHJpZXZlX2ZpbGVfZGF0YShkZnApOworCQlpZiAoIShvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfT1VUTkFNRSkpIHsKKwkJCXhjbG9zZShHLm91dHB1dF9mZCk7CisJCQlHLm91dHB1dF9mZCA9IC0xOworCQl9CisJfQorCisJaWYgKGRmcCAhPSBzZnApIHsKKwkJLyogSXQncyBmdHAuIENsb3NlIGRhdGEgY29ubmVjdGlvbiBwcm9wZXJseSAqLworCQlmY2xvc2UoZGZwKTsKKwkJaWYgKGZ0cGNtZChOVUxMLCBOVUxMLCBzZnApICE9IDIyNikKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmdHAgZXJyb3I6ICVzIiwgc2FuaXRpemVfc3RyaW5nKEcud2dldF9idWYgKyA0KSk7CisJCS8qIGZ0cGNtZCgiUVVJVCIsIE5VTEwsIHNmcCk7IC0gd2h5IGJvdGhlcj8gKi8KKwl9CisJZmNsb3NlKHNmcCk7CisKKwlmcmVlKHNlcnZlci5hbGxvY2F0ZWQpOworCWZyZWUodGFyZ2V0LmFsbG9jYXRlZCk7CisJZnJlZShmbmFtZV9vdXRfYWxsb2MpOworfQorCitpbnQgd2dldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2dldF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciB3Z2V0X2xvbmdvcHRzW10gQUxJR04xID0KKwkJLyogbmFtZSwgaGFzX2FyZywgdmFsICovCisJCSJjb250aW51ZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJjIgorLy9GSVhNRTogLXMgaXNuJ3QgLS1zcGlkZXIsIGl0J3MgLS1zYXZlLWhlYWRlcnMhCisJCSJzcGlkZXJcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCQkicXVpZXRcMCIgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkJIm91dHB1dC1kb2N1bWVudFwwIiAgUmVxdWlyZWRfYXJndW1lbnQgIk8iCisJCSJkaXJlY3RvcnktcHJlZml4XDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJQIgorCQkicHJveHlcMCIgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiWSIKKwkJInVzZXItYWdlbnRcMCIgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlUiCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJCSJ0aW1lb3V0XDAiICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJUIgorI2VuZGlmCisJCS8qIElnbm9yZWQ6ICovCisJCS8vICJ0cmllc1wwIiAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCQkvKiBJZ25vcmVkICh3ZSBhbHdheXMgdXNlIFBBU1YpOiAqLworCQkicGFzc2l2ZS1mdHBcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZiIKKwkJImhlYWRlclwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlx4ZmUiCisJCSJwb3N0LWRhdGFcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJceGZkIgorCQkvKiBJZ25vcmVkICh3ZSBkb24ndCBkbyBzc2wpICovCisJCSJuby1jaGVjay1jZXJ0aWZpY2F0ZVwwIiBOb19hcmd1bWVudCAgICJceGZjIgorCQk7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisJbGxpc3RfdCAqaGVhZGVyc19sbGlzdCA9IE5VTEw7CisjZW5kaWYKKworCUlOSVRfRygpOworCisJSUZfRkVBVFVSRV9XR0VUX1RJTUVPVVQoRy50aW1lb3V0X3NlY29uZHMgPSA5MDA7KQorCUcucHJveHlfZmxhZyA9ICJvbiI7ICAgLyogdXNlIHByb3hpZXMgaWYgZW52IHZhcnMgYXJlIHNldCAqLworCUcudXNlcl9hZ2VudCA9ICJXZ2V0IjsgLyogIlVzZXItQWdlbnQiIGhlYWRlciBmaWVsZCAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gd2dldF9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIiBJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgiOlQrIikgSUZfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUygiOlx4ZmU6OiIpOworCWdldG9wdDMyKGFyZ3YsICJjc3FPOlA6WTpVOlQ6IiAvKmlnbm9yZWQ6Ki8gInQ6IiwKKwkJJkcuZm5hbWVfb3V0LCAmRy5kaXJfcHJlZml4LAorCQkmRy5wcm94eV9mbGFnLCAmRy51c2VyX2FnZW50LAorCQlJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgmRy50aW1lb3V0X3NlY29uZHMpIElGX05PVF9GRUFUVVJFX1dHRVRfVElNRU9VVChOVUxMKSwKKwkJTlVMTCAvKiAtdCBSRVRSSUVTICovCisJCUlGX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMoLCAmaGVhZGVyc19sbGlzdCkKKwkJSUZfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUygsICZHLnBvc3RfZGF0YSkKKwkpOworCWFyZ3YgKz0gb3B0aW5kOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwlpZiAoaGVhZGVyc19sbGlzdCkgeworCQlpbnQgc2l6ZSA9IDE7CisJCWNoYXIgKmNwOworCQlsbGlzdF90ICpsbCA9IGhlYWRlcnNfbGxpc3Q7CisJCXdoaWxlIChsbCkgeworCQkJc2l6ZSArPSBzdHJsZW4obGwtPmRhdGEpICsgMjsKKwkJCWxsID0gbGwtPmxpbms7CisJCX0KKwkJRy5leHRyYV9oZWFkZXJzID0gY3AgPSB4bWFsbG9jKHNpemUpOworCQl3aGlsZSAoaGVhZGVyc19sbGlzdCkgeworCQkJY3AgKz0gc3ByaW50ZihjcCwgIiVzXHJcbiIsIChjaGFyKilsbGlzdF9wb3AoJmhlYWRlcnNfbGxpc3QpKTsKKwkJfQorCX0KKyNlbmRpZgorCisJRy5vdXRwdXRfZmQgPSAtMTsKKwlHLm9fZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19FWENMOworCWlmIChHLmZuYW1lX291dCkgeyAvKiAtTyBGSUxFID8gKi8KKwkJaWYgKExPTkVfREFTSChHLmZuYW1lX291dCkpIHsgLyogLU8gLSA/ICovCisJCQlHLm91dHB1dF9mZCA9IDE7CisJCQlvcHRpb25fbWFzazMyICY9IH5XR0VUX09QVF9DT05USU5VRTsKKwkJfQorCQkvKiBjb21wYXQgd2l0aCB3Z2V0OiAtTyBGSUxFIGNhbiBvdmVyd3JpdGUgKi8KKwkJRy5vX2ZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKwl9CisKKwl3aGlsZSAoKmFyZ3YpCisJCWRvd25sb2FkX29uZV91cmwoKmFyZ3YrKyk7CisKKwlpZiAoRy5vdXRwdXRfZmQgPj0gMCkKKwkJeGNsb3NlKEcub3V0cHV0X2ZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3dob2lzLmMgYi9idXN5Ym94LTEuMTkuMy9uZXR3b3JraW5nL3dob2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzMzAzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvd2hvaXMuYwpAQCAtMCwwICsxLDY1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB3aG9pcyAtIHRpbnkgY2xpZW50IGZvciB0aGUgd2hvaXMgZGlyZWN0b3J5IHNlcnZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGVyZSBPcmdhIDxnb3RydW5rc0BnbWFpbC5jb20+CisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBUT0RPCisgKiBBZGQgaXB2NiBzdXBwb3J0CisgKiBBZGQgcHJveHkgc3VwcG9ydAorICovCisKKy8vY29uZmlnOmNvbmZpZyBXSE9JUworLy9jb25maWc6CWJvb2wgIndob2lzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHdob2lzIGlzIGEgY2xpZW50IGZvciB0aGUgd2hvaXMgZGlyZWN0b3J5IHNlcnZpY2UKKworLy9hcHBsZXQ6SUZfV0hPSVMoQVBQTEVUKHdob2lzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1dIT0lTKSArPSB3aG9pcy5vCisKKy8vdXNhZ2U6I2RlZmluZSB3aG9pc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1oIFNFUlZFUl0gWy1wIFBPUlRdIE5BTUUuLi4iCisvL3VzYWdlOiNkZWZpbmUgd2hvaXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJRdWVyeSBXSE9JUyBpbmZvIGFib3V0IE5BTUVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWgsLXAJU2VydmVyIHRvIHF1ZXJ5IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIHZvaWQgcGlwZV9vdXQoaW50IGZkKQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmWzEwMjRdOworCisJZnAgPSB4ZmRvcGVuX2Zvcl9yZWFkKGZkKTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWNoYXIgKnAgPSBzdHJwYnJrKGJ1ZiwgIlxyXG4iKTsKKwkJaWYgKHApCisJCQkqcCA9ICdcMCc7CisJCXB1dHMoYnVmKTsKKwl9CisKKwlmY2xvc2UoZnApOyAvKiBjbG9zZXMgZmQgdG9vICovCit9CisKK2ludCB3aG9pc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2hvaXNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBwb3J0ID0gNDM7CisJY29uc3QgY2hhciAqaG9zdCA9ICJ3aG9pcy1zZXJ2ZXJzLm5ldCI7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpwKyI7CisJZ2V0b3B0MzIoYXJndiwgImg6cDoiLCAmaG9zdCwgJnBvcnQpOworCisJYXJndiArPSBvcHRpbmQ7CisJZG8geworCQlpbnQgZmQgPSBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShob3N0LCBwb3J0KTsKKwkJZmRwcmludGYoZmQsICIlc1xyXG4iLCAqYXJndik7CisJCXBpcGVfb3V0KGZkKTsKKwl9CisJd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvemNpcC5jIGIvYnVzeWJveC0xLjE5LjMvbmV0d29ya2luZy96Y2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzNWVjYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL25ldHdvcmtpbmcvemNpcC5jCkBAIC0wLDAgKzEsNTc2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBSRkMzOTI3IFplcm9Db25mIElQdjQgTGluay1Mb2NhbCBhZGRyZXNzaW5nCisgKiAoc2VlIDxodHRwOi8vd3d3Lnplcm9jb25mLm9yZy8+KQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBBcnRodXIgdmFuIEhvZmYgKGF2aEBzdHJhbmdlYmVycnkuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IERhdmlkIEJyb3duZWxsCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogWkNJUCBqdXN0IG1hbmFnZXMgdGhlIDE2OS4yNTQuKi4qIGFkZHJlc3Nlcy4gIFRoYXQgbmV0d29yayBpcyBub3QKKyAqIHJvdXRlZCBhdCB0aGUgSVAgbGV2ZWwsIHRob3VnaCB2YXJpb3VzIHByb3hpZXMgb3IgYnJpZGdlcyBjYW4KKyAqIGNlcnRhaW5seSBiZSB1c2VkLiAgSXRzIG5hbWluZyBpcyBidWlsdCBvdmVyIG11bHRpY2FzdCBETlMuCisgKi8KKworLy8jZGVmaW5lIERFQlVHCisKKy8vIFRPRE86CisvLyAtIG1vcmUgcmVhbC13b3JsZCB1c2FnZS90ZXN0aW5nLCBlc3BlY2lhbGx5IGRhZW1vbiBtb2RlCisvLyAtIGtlcm5lbCBwYWNrZXQgZmlsdGVycyB0byByZWR1Y2Ugc2NoZWR1bGluZyBub2lzZQorLy8gLSBhdm9pZCBzaWxlbnQgc2NyaXB0IGZhaWx1cmVzLCBlc3BlY2lhbGx5IHVuZGVyIGxvYWQuLi4KKy8vIC0gbGluayBzdGF0dXMgbW9uaXRvcmluZyAocmVzdGFydCBvbiBsaW5rLXVwOyBzdG9wIG9uIGxpbmstZG93bikKKworLy91c2FnZTojZGVmaW5lIHpjaXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBJRkFDRSBTQ1JJUFQiCisvL3VzYWdlOiNkZWZpbmUgemNpcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1hbmFnZSBhIFplcm9Db25mIElQdjQgbGluay1sb2NhbCBhZGRyZXNzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCQlSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCVF1aXQgYWZ0ZXIgb2J0YWluaW5nIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1yIDE2OS4yNTQueC54CVJlcXVlc3QgdGhpcyBhZGRyZXNzIGZpcnN0IgorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuV2l0aCBubyAtcSwgcnVucyBjb250aW51b3VzbHkgbW9uaXRvcmluZyBmb3IgQVJQIGNvbmZsaWN0cywiCisvL3VzYWdlOiAgICAgIlxuZXhpdHMgb25seSBvbiBJL08gZXJyb3JzIChsaW5rIGRvd24gZXRjKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworLyogV2UgZG9uJ3QgbmVlZCBtb3JlIHRoYW4gMzIgYml0cyBvZiB0aGUgY291bnRlciAqLworI2RlZmluZSBNT05PVE9OSUNfVVMoKSAoKHVuc2lnbmVkKW1vbm90b25pY191cygpKQorCitzdHJ1Y3QgYXJwX3BhY2tldCB7CisJc3RydWN0IGV0aGVyX2hlYWRlciBldGg7CisJc3RydWN0IGV0aGVyX2FycCBhcnA7Cit9IFBBQ0tFRDsKKworZW51bSB7CisvKiAxNjkuMjU0LjAuMCAqLworCUxJTktMT0NBTF9BRERSID0gMHhhOWZlMDAwMCwKKworLyogcHJvdG9jb2wgdGltZW91dCBwYXJhbWV0ZXJzLCBzcGVjaWZpZWQgaW4gc2Vjb25kcyAqLworCVBST0JFX1dBSVQgPSAxLAorCVBST0JFX01JTiA9IDEsCisJUFJPQkVfTUFYID0gMiwKKwlQUk9CRV9OVU0gPSAzLAorCU1BWF9DT05GTElDVFMgPSAxMCwKKwlSQVRFX0xJTUlUX0lOVEVSVkFMID0gNjAsCisJQU5OT1VOQ0VfV0FJVCA9IDIsCisJQU5OT1VOQ0VfTlVNID0gMiwKKwlBTk5PVU5DRV9JTlRFUlZBTCA9IDIsCisJREVGRU5EX0lOVEVSVkFMID0gMTAKK307CisKKy8qIFN0YXRlcyBkdXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gKi8KK2VudW0geworCVBST0JFID0gMCwKKwlSQVRFX0xJTUlUX1BST0JFLAorCUFOTk9VTkNFLAorCU1PTklUT1IsCisJREVGRU5ECit9OworCisjZGVmaW5lIFZEQkcoLi4uKSBkbyB7IH0gd2hpbGUgKDApCisKKworZW51bSB7CisJc29ja19mZCA9IDMKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3Qgc29ja2FkZHIgc2FkZHI7CisJc3RydWN0IGV0aGVyX2FkZHIgZXRoX2FkZHI7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBzYWRkciAgICAoRy5zYWRkciAgICkKKyNkZWZpbmUgZXRoX2FkZHIgKEcuZXRoX2FkZHIpCisKKworLyoqCisgKiBQaWNrIGEgcmFuZG9tIGxpbmsgbG9jYWwgSVAgYWRkcmVzcyBvbiAxNjkuMjU0LzE2LCBleGNlcHQgdGhhdAorICogdGhlIGZpcnN0IGFuZCBsYXN0IDI1NiBhZGRyZXNzZXMgYXJlIHJlc2VydmVkLgorICovCitzdGF0aWMgdWludDMyX3QgcGljayh2b2lkKQoreworCXVuc2lnbmVkIHRtcDsKKworCWRvIHsKKwkJdG1wID0gcmFuZCgpICYgSU5fQ0xBU1NCX0hPU1Q7CisJfSB3aGlsZSAodG1wID4gKElOX0NMQVNTQl9IT1NUIC0gMHgwMjAwKSk7CisJcmV0dXJuIGh0b25sKChMSU5LTE9DQUxfQUREUiArIDB4MDEwMCkgKyB0bXApOworfQorCisvKioKKyAqIEJyb2FkY2FzdCBhbiBBUlAgcGFja2V0LgorICovCitzdGF0aWMgdm9pZCBhcnAoCisJLyogaW50IG9wLCAtIGFsd2F5cyBBUlBPUF9SRVFVRVNUICovCisJLyogY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKnNvdXJjZV9ldGgsIC0gYWx3YXlzICZldGhfYWRkciAqLworCQkJCQlzdHJ1Y3QgaW5fYWRkciBzb3VyY2VfaXAsCisJY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKnRhcmdldF9ldGgsIHN0cnVjdCBpbl9hZGRyIHRhcmdldF9pcCkKK3sKKwllbnVtIHsgb3AgPSBBUlBPUF9SRVFVRVNUIH07CisjZGVmaW5lIHNvdXJjZV9ldGggKCZldGhfYWRkcikKKworCXN0cnVjdCBhcnBfcGFja2V0IHA7CisJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOworCisJLy8gZXRoZXIgaGVhZGVyCisJcC5ldGguZXRoZXJfdHlwZSA9IGh0b25zKEVUSEVSVFlQRV9BUlApOworCW1lbWNweShwLmV0aC5ldGhlcl9zaG9zdCwgc291cmNlX2V0aCwgRVRIX0FMRU4pOworCW1lbXNldChwLmV0aC5ldGhlcl9kaG9zdCwgMHhmZiwgRVRIX0FMRU4pOworCisJLy8gYXJwIHJlcXVlc3QKKwlwLmFycC5hcnBfaHJkID0gaHRvbnMoQVJQSFJEX0VUSEVSKTsKKwlwLmFycC5hcnBfcHJvID0gaHRvbnMoRVRIRVJUWVBFX0lQKTsKKwlwLmFycC5hcnBfaGxuID0gRVRIX0FMRU47CisJcC5hcnAuYXJwX3BsbiA9IDQ7CisJcC5hcnAuYXJwX29wID0gaHRvbnMob3ApOworCW1lbWNweSgmcC5hcnAuYXJwX3NoYSwgc291cmNlX2V0aCwgRVRIX0FMRU4pOworCW1lbWNweSgmcC5hcnAuYXJwX3NwYSwgJnNvdXJjZV9pcCwgc2l6ZW9mKHAuYXJwLmFycF9zcGEpKTsKKwltZW1jcHkoJnAuYXJwLmFycF90aGEsIHRhcmdldF9ldGgsIEVUSF9BTEVOKTsKKwltZW1jcHkoJnAuYXJwLmFycF90cGEsICZ0YXJnZXRfaXAsIHNpemVvZihwLmFycC5hcnBfdHBhKSk7CisKKwkvLyBzZW5kIGl0CisJLy8gRXZlbiB0aG91Z2ggc29ja19mZCBpcyBhbHJlYWR5IGJvdW5kIHRvIHNhZGRyLCBqdXN0IHNlbmQoKQorCS8vIHdvbid0IHdvcmssIGJlY2F1c2UgInNvY2tldCBpcyBub3QgY29ubmVjdGVkIgorCS8vIChhbmQgY29ubmVjdCgpIHdvbid0IGZpeCB0aGF0LCAib3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiKS4KKwkvLyBUaHVzIHdlIHNlbmR0bygpIHRvIHNhZGRyLiBJIHdvbmRlciB3aGljaCBzb2NrYWRkcgorCS8vIChmcm9tIGJpbmQoKSBvciBmcm9tIHNlbmR0bygpPykga2VybmVsIGFjdHVhbGx5IHVzZXMKKwkvLyB0byBkZXRlcm1pbmUgaWZhY2UgdG8gZW1pdCB0aGUgcGFja2V0IGZyb20uLi4KKwl4c2VuZHRvKHNvY2tfZmQsICZwLCBzaXplb2YocCksICZzYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisjdW5kZWYgc291cmNlX2V0aAorfQorCisvKioKKyAqIFJ1biBhIHNjcmlwdC4KKyAqIGFyZ3ZbMF06aW50ZiBhcmd2WzFdOnNjcmlwdF9uYW1lIGFyZ3ZbMl06anVuayBhcmd2WzNdOk5VTEwKKyAqLworc3RhdGljIGludCBydW4oY2hhciAqYXJndlszXSwgY29uc3QgY2hhciAqcGFyYW0sIHN0cnVjdCBpbl9hZGRyICppcCkKK3sKKwlpbnQgc3RhdHVzOworCWNoYXIgKmFkZHIgPSBhZGRyOyAvKiBmb3IgZ2NjICovCisJY29uc3QgY2hhciAqZm10ID0gIiVzICVzICVzIiArIDM7CisKKwlhcmd2WzJdID0gKGNoYXIqKXBhcmFtOworCisJVkRCRygiJXMgcnVuICVzICVzXG4iLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCWlmIChpcCkgeworCQlhZGRyID0gaW5ldF9udG9hKCppcCk7CisJCXhzZXRlbnYoImlwIiwgYWRkcik7CisJCWZtdCAtPSAzOworCX0KKwliYl9pbmZvX21zZyhmbXQsIGFyZ3ZbMl0sIGFyZ3ZbMF0sIGFkZHIpOworCisJc3RhdHVzID0gc3Bhd25fYW5kX3dhaXQoYXJndiArIDEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIiVzICVzICVzIiArIDMsIGFyZ3ZbMl0sIGFyZ3ZbMF0pOworCQlyZXR1cm4gLWVycm5vOworCX0KKwlpZiAoc3RhdHVzICE9IDApCisJCWJiX2Vycm9yX21zZygic2NyaXB0ICVzICVzIGZhaWxlZCwgZXhpdGNvZGU9JWQiLCBhcmd2WzFdLCBhcmd2WzJdLCBzdGF0dXMgJiAweGZmKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFJldHVybiBtaWxsaXNlY29uZHMgb2YgcmFuZG9tIGRlbGF5LCB1cCB0byAic2VjcyIgc2Vjb25kcy4KKyAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgcmFuZG9tX2RlbGF5X21zKHVuc2lnbmVkIHNlY3MpCit7CisJcmV0dXJuIHJhbmQoKSAlIChzZWNzICogMTAwMCk7Cit9CisKKy8qKgorICogbWFpbiBwcm9ncmFtCisgKi8KK2ludCB6Y2lwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB6Y2lwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3RhdGU7CisJY2hhciAqcl9vcHQ7CisJdW5zaWduZWQgb3B0czsKKworCS8vIHVnbHkgdHJpY2ssIGJ1dCBJIHdhbnQgdGhlc2UgemVyb2VkIGluIG9uZSBnbworCXN0cnVjdCB7CisJCWNvbnN0IHN0cnVjdCBpbl9hZGRyIG51bGxfaXA7CisJCWNvbnN0IHN0cnVjdCBldGhlcl9hZGRyIG51bGxfYWRkcjsKKwkJc3RydWN0IGluX2FkZHIgaXA7CisJCXN0cnVjdCBpZnJlcSBpZnI7CisJCWludCB0aW1lb3V0X21zOyAvKiBtdXN0IGJlIHNpZ25lZCAqLworCQl1bnNpZ25lZCBjb25mbGljdHM7CisJCXVuc2lnbmVkIG5wcm9iZXM7CisJCXVuc2lnbmVkIG5jbGFpbXM7CisJCWludCByZWFkeTsKKwkJaW50IHZlcmJvc2U7CisJfSBMOworI2RlZmluZSBudWxsX2lwICAgIChMLm51bGxfaXAgICApCisjZGVmaW5lIG51bGxfYWRkciAgKEwubnVsbF9hZGRyICkKKyNkZWZpbmUgaXAgICAgICAgICAoTC5pcCAgICAgICAgKQorI2RlZmluZSBpZnIgICAgICAgIChMLmlmciAgICAgICApCisjZGVmaW5lIHRpbWVvdXRfbXMgKEwudGltZW91dF9tcykKKyNkZWZpbmUgY29uZmxpY3RzICAoTC5jb25mbGljdHMgKQorI2RlZmluZSBucHJvYmVzICAgIChMLm5wcm9iZXMgICApCisjZGVmaW5lIG5jbGFpbXMgICAgKEwubmNsYWltcyAgICkKKyNkZWZpbmUgcmVhZHkgICAgICAoTC5yZWFkeSAgICAgKQorI2RlZmluZSB2ZXJib3NlICAgIChMLnZlcmJvc2UgICApCisKKwltZW1zZXQoJkwsIDAsIHNpemVvZihMKSk7CisKKyNkZWZpbmUgRk9SRUdST1VORCAob3B0cyAmIDEpCisjZGVmaW5lIFFVSVQgICAgICAgKG9wdHMgJiAyKQorCS8vIHBhcnNlIGNvbW1hbmRsaW5lOiBwcm9nIFtvcHRpb25zXSBpZm5hbWUgc2NyaXB0CisJLy8gZXhhY3RseSAyIGFyZ3M7IC12IGFjY3VtdWxhdGVzIGFuZCBpbXBsaWVzIC1mCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTI6dnY6dmYiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZnFyOnYiLCAmcl9vcHQsICZ2ZXJib3NlKTsKKyNpZiAhQkJfTU1VCisJLy8gb24gTk9NTVUgcmVleGVjIGVhcmx5IChvciBlbHNlIHdlIHdpbGwgcmVydW4gdGhpbmdzIHR3aWNlKQorCWlmICghRk9SRUdST1VORCkKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAgLyp3YXM6IERBRU1PTl9DSERJUl9ST09UKi8sIGFyZ3YpOworI2VuZGlmCisJLy8gb3BlbiBhbiBBUlAgc29ja2V0CisJLy8gKG5lZWQgdG8gZG8gaXQgYmVmb3JlIG9wZW5sb2cgdG8gcHJldmVudCBvcGVubG9nIGZyb20gdGFraW5nCisJLy8gZmQgMyAoc29ja19mZD09MykpCisJeG1vdmVfZmQoeHNvY2tldChBRl9QQUNLRVQsIFNPQ0tfUEFDS0VULCBodG9ucyhFVEhfUF9BUlApKSwgc29ja19mZCk7CisJaWYgKCFGT1JFR1JPVU5EKSB7CisJCS8vIGRvIGl0IGJlZm9yZSBhbGwgYmJfeHhfbXNnIGNhbGxzCisJCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19EQUVNT04pOworCQlsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworCX0KKwlpZiAob3B0cyAmIDQpIHsgLy8gLXIgbi5uLm4ubgorCQlpZiAoaW5ldF9hdG9uKHJfb3B0LCAmaXApID09IDAKKwkJIHx8IChudG9obChpcC5zX2FkZHIpICYgSU5fQ0xBU1NCX05FVCkgIT0gTElOS0xPQ0FMX0FERFIKKwkJKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBsaW5rIGFkZHJlc3MiKTsKKwkJfQorCX0KKwlhcmd2ICs9IG9wdGluZCAtIDE7CisKKwkvKiBOb3c6IGFyZ3ZbMF06anVuayBhcmd2WzFdOmludGYgYXJndlsyXTpzY3JpcHQgYXJndlszXTpOVUxMICovCisJLyogV2UgbmVlZCB0byBtYWtlIHNwYWNlIGZvciBzY3JpcHQgYXJndW1lbnQ6ICovCisJYXJndlswXSA9IGFyZ3ZbMV07CisJYXJndlsxXSA9IGFyZ3ZbMl07CisJLyogTm93OiBhcmd2WzBdOmludGYgYXJndlsxXTpzY3JpcHQgYXJndlsyXTpqdW5rIGFyZ3ZbM106TlVMTCAqLworI2RlZmluZSBhcmd2X2ludGYgKGFyZ3ZbMF0pCisKKwl4c2V0ZW52KCJpbnRlcmZhY2UiLCBhcmd2X2ludGYpOworCisJLy8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlIChtb2Rwcm9iZSwgaWZ1cCwgZXRjKQorCWlmIChydW4oYXJndiwgImluaXQiLCBOVUxMKSkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworCS8vIGluaXRpYWxpemUgc2FkZHIKKwkvLyBzYWRkciBpczogeyB1MTYgc2FfZmFtaWx5OyB1OCBzYV9kYXRhWzE0XTsgfQorCS8vbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7CisJLy9UT0RPOiBhcmUgd2UgbGVhdmluZyBzYV9mYW1pbHkgPT0gMCAoQUZfVU5TUEVDKT8hCisJc2FmZV9zdHJuY3B5KHNhZGRyLnNhX2RhdGEsIGFyZ3ZfaW50Ziwgc2l6ZW9mKHNhZGRyLnNhX2RhdGEpKTsKKworCS8vIGJpbmQgdG8gdGhlIGludGVyZmFjZSdzIEFSUCBzb2NrZXQKKwl4YmluZChzb2NrX2ZkLCAmc2FkZHIsIHNpemVvZihzYWRkcikpOworCisJLy8gZ2V0IHRoZSBpbnRlcmZhY2UncyBldGhlcm5ldCBhZGRyZXNzCisJLy9tZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBhcmd2X2ludGYpOworCXhpb2N0bChzb2NrX2ZkLCBTSU9DR0lGSFdBRERSLCAmaWZyKTsKKwltZW1jcHkoJmV0aF9hZGRyLCAmaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOworCisJLy8gc3RhcnQgd2l0aCBzb21lIHN0YWJsZSBpcCBhZGRyZXNzLCBlaXRoZXIgYSBmdW5jdGlvbiBvZgorCS8vIHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9yIGVsc2UgdGhlIGxhc3QgYWRkcmVzcyB3ZSB1c2VkLgorCS8vIHdlIGFyZSB0YWtpbmcgbG93LW9yZGVyIGZvdXIgYnl0ZXMsIGFzIHRvcC1vcmRlciBvbmVzCisJLy8gYXJlbid0IHJhbmRvbSBlbm91Z2guCisJLy8gTk9URTogdGhlIHNlcXVlbmNlIG9mIGFkZHJlc3NlcyB3ZSB0cnkgY2hhbmdlcyBvbmx5CisJLy8gZGVwZW5kaW5nIG9uIHdoZW4gd2UgZGV0ZWN0IGNvbmZsaWN0cy4KKwl7CisJCXVpbnQzMl90IHQ7CisJCW1vdmVfZnJvbV91bmFsaWduZWQzMih0LCAoKGNoYXIgKikmZXRoX2FkZHIgKyAyKSk7CisJCXNyYW5kKHQpOworCX0KKwlpZiAoaXAuc19hZGRyID09IDApCisJCWlwLnNfYWRkciA9IHBpY2soKTsKKworCS8vIEZJWE1FIGNhc2VzIHRvIGhhbmRsZToKKwkvLyAgLSB6Y2lwIGFscmVhZHkgcnVubmluZyEKKwkvLyAgLSBsaW5rIGFscmVhZHkgaGFzIGxvY2FsIGFkZHJlc3MuLi4ganVzdCBkZWZlbmQvdXBkYXRlCisKKwkvLyBkYWVtb25pemUgbm93OyBkb24ndCBkZWxheSBzeXN0ZW0gc3RhcnR1cAorCWlmICghRk9SRUdST1VORCkgeworI2lmIEJCX01NVQorCQliYl9kYWVtb25pemUoMCAvKndhczogREFFTU9OX0NIRElSX1JPT1QqLyk7CisjZW5kaWYKKwkJYmJfaW5mb19tc2coInN0YXJ0LCBpbnRlcmZhY2UgJXMiLCBhcmd2X2ludGYpOworCX0KKworCS8vIHJ1biB0aGUgZHluYW1pYyBhZGRyZXNzIG5lZ290aWF0aW9uIHByb3RvY29sLAorCS8vIHJlc3RhcnRpbmcgYWZ0ZXIgYWRkcmVzcyBjb25mbGljdHM6CisJLy8gIC0gc3RhcnQgd2l0aCBzb21lIGFkZHJlc3Mgd2Ugd2FudCB0byB0cnkKKwkvLyAgLSBzaG9ydCByYW5kb20gZGVsYXkKKwkvLyAgLSBhcnAgcHJvYmVzIHRvIHNlZSBpZiBhbm90aGVyIGhvc3QgdXNlcyBpdAorCS8vICAtIGFycCBhbm5vdW5jZW1lbnRzIHRoYXQgd2UncmUgY2xhaW1pbmcgaXQKKwkvLyAgLSB1c2UgaXQKKwkvLyAgLSBkZWZlbmQgaXQsIHdpdGhpbiBsaW1pdHMKKwkvLyBleGl0IGlmOgorCS8vIC0gYWRkcmVzcyBpcyBzdWNjZXNzZnVsbHkgb2J0YWluZWQgYW5kIC1xIHdhcyBnaXZlbjoKKwkvLyAgIHJ1biAiPHNjcmlwdD4gY29uZmlnIiwgdGhlbiBleGl0IHdpdGggZXhpdGNvZGUgMAorCS8vIC0gcG9sbCBlcnJvciAod2hlbiBkb2VzIHRoaXMgaGFwcGVuPykKKwkvLyAtIHJlYWQgZXJyb3IgKHdoZW4gZG9lcyB0aGlzIGhhcHBlbj8pCisJLy8gLSBzZW5kdG8gZXJyb3IgKGluIGFycCgpKSAod2hlbiBkb2VzIHRoaXMgaGFwcGVuPykKKwkvLyAtIHJldmVudHMgJiBQT0xMRVJSIChsaW5rIGRvd24pLiBydW4gIjxzY3JpcHQ+IGRlY29uZmlnIiBmaXJzdAorCXN0YXRlID0gUFJPQkU7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHBvbGxmZCBmZHNbMV07CisJCXVuc2lnbmVkIGRlYWRsaW5lX3VzOworCQlzdHJ1Y3QgYXJwX3BhY2tldCBwOworCQlpbnQgc291cmNlX2lwX2NvbmZsaWN0OworCQlpbnQgdGFyZ2V0X2lwX2NvbmZsaWN0OworCisJCWZkc1swXS5mZCA9IHNvY2tfZmQ7CisJCWZkc1swXS5ldmVudHMgPSBQT0xMSU47CisJCWZkc1swXS5yZXZlbnRzID0gMDsKKworCQkvLyBwb2xsLCBiZWluZyByZWFkeSB0byBhZGp1c3QgY3VycmVudCB0aW1lb3V0CisJCWlmICghdGltZW91dF9tcykgeworCQkJdGltZW91dF9tcyA9IHJhbmRvbV9kZWxheV9tcyhQUk9CRV9XQUlUKTsKKwkJCS8vIEZJWE1FIHNldHNvY2tvcHQoc29ja19mZCwgU09fQVRUQUNIX0ZJTFRFUiwgLi4uKSB0bworCQkJLy8gbWFrZSB0aGUga2VybmVsIGZpbHRlciBvdXQgYWxsIHBhY2tldHMgZXhjZXB0CisJCQkvLyBvbmVzIHdlJ2QgY2FyZSBhYm91dC4KKwkJfQorCQkvLyBzZXQgZGVhZGxpbmVfdXMgdG8gdGhlIHBvaW50IGluIHRpbWUgd2hlbiB3ZSB0aW1lb3V0CisJCWRlYWRsaW5lX3VzID0gTU9OT1RPTklDX1VTKCkgKyB0aW1lb3V0X21zICogMTAwMDsKKworCQlWREJHKCIuLi53YWl0ICVkICVzIG5wcm9iZXM9JXUsIG5jbGFpbXM9JXVcbiIsCisJCQkJdGltZW91dF9tcywgYXJndl9pbnRmLCBucHJvYmVzLCBuY2xhaW1zKTsKKworCQlzd2l0Y2ggKHNhZmVfcG9sbChmZHMsIDEsIHRpbWVvdXRfbXMpKSB7CisKKwkJZGVmYXVsdDoKKwkJCS8vYmJfcGVycm9yX21zZygicG9sbCIpOyAtIGRvbmUgaW4gc2FmZV9wb2xsCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJCS8vIHRpbWVvdXQKKwkJY2FzZSAwOgorCQkJVkRCRygic3RhdGUgPSAlZFxuIiwgc3RhdGUpOworCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJY2FzZSBQUk9CRToKKwkJCQkvLyB0aW1lb3V0cyBpbiB0aGUgUFJPQkUgc3RhdGUgbWVhbiBubyBjb25mbGljdGluZyBBUlAgcGFja2V0cworCQkJCS8vIGhhdmUgYmVlbiByZWNlaXZlZCwgc28gd2UgY2FuIHByb2dyZXNzIHRocm91Z2ggdGhlIHN0YXRlcworCQkJCWlmIChucHJvYmVzIDwgUFJPQkVfTlVNKSB7CisJCQkJCW5wcm9iZXMrKzsKKwkJCQkJVkRCRygicHJvYmUvJXUgJXNAJXNcbiIsCisJCQkJCQkJbnByb2JlcywgYXJndl9pbnRmLCBpbmV0X250b2EoaXApKTsKKwkJCQkJYXJwKC8qIEFSUE9QX1JFUVVFU1QsICovCisJCQkJCQkJLyogJmV0aF9hZGRyLCAqLyBudWxsX2lwLAorCQkJCQkJCSZudWxsX2FkZHIsIGlwKTsKKwkJCQkJdGltZW91dF9tcyA9IFBST0JFX01JTiAqIDEwMDA7CisJCQkJCXRpbWVvdXRfbXMgKz0gcmFuZG9tX2RlbGF5X21zKFBST0JFX01BWCAtIFBST0JFX01JTik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvLyBTd2l0Y2ggdG8gYW5ub3VuY2Ugc3RhdGUuCisJCQkJCXN0YXRlID0gQU5OT1VOQ0U7CisJCQkJCW5jbGFpbXMgPSAwOworCQkJCQlWREJHKCJhbm5vdW5jZS8ldSAlc0Alc1xuIiwKKwkJCQkJCQluY2xhaW1zLCBhcmd2X2ludGYsIGluZXRfbnRvYShpcCkpOworCQkJCQlhcnAoLyogQVJQT1BfUkVRVUVTVCwgKi8KKwkJCQkJCQkvKiAmZXRoX2FkZHIsICovIGlwLAorCQkJCQkJCSZldGhfYWRkciwgaXApOworCQkJCQl0aW1lb3V0X21zID0gQU5OT1VOQ0VfSU5URVJWQUwgKiAxMDAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUkFURV9MSU1JVF9QUk9CRToKKwkJCQkvLyB0aW1lb3V0cyBpbiB0aGUgUkFURV9MSU1JVF9QUk9CRSBzdGF0ZSBtZWFuIG5vIGNvbmZsaWN0aW5nIEFSUCBwYWNrZXRzCisJCQkJLy8gaGF2ZSBiZWVuIHJlY2VpdmVkLCBzbyB3ZSBjYW4gbW92ZSBpbW1lZGlhdGVseSB0byB0aGUgYW5ub3VuY2Ugc3RhdGUKKwkJCQlzdGF0ZSA9IEFOTk9VTkNFOworCQkJCW5jbGFpbXMgPSAwOworCQkJCVZEQkcoImFubm91bmNlLyV1ICVzQCVzXG4iLAorCQkJCQkJbmNsYWltcywgYXJndl9pbnRmLCBpbmV0X250b2EoaXApKTsKKwkJCQlhcnAoLyogQVJQT1BfUkVRVUVTVCwgKi8KKwkJCQkJCS8qICZldGhfYWRkciwgKi8gaXAsCisJCQkJCQkmZXRoX2FkZHIsIGlwKTsKKwkJCQl0aW1lb3V0X21zID0gQU5OT1VOQ0VfSU5URVJWQUwgKiAxMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBBTk5PVU5DRToKKwkJCQkvLyB0aW1lb3V0cyBpbiB0aGUgQU5OT1VOQ0Ugc3RhdGUgbWVhbiBubyBjb25mbGljdGluZyBBUlAgcGFja2V0cworCQkJCS8vIGhhdmUgYmVlbiByZWNlaXZlZCwgc28gd2UgY2FuIHByb2dyZXNzIHRocm91Z2ggdGhlIHN0YXRlcworCQkJCWlmIChuY2xhaW1zIDwgQU5OT1VOQ0VfTlVNKSB7CisJCQkJCW5jbGFpbXMrKzsKKwkJCQkJVkRCRygiYW5ub3VuY2UvJXUgJXNAJXNcbiIsCisJCQkJCQkJbmNsYWltcywgYXJndl9pbnRmLCBpbmV0X250b2EoaXApKTsKKwkJCQkJYXJwKC8qIEFSUE9QX1JFUVVFU1QsICovCisJCQkJCQkJLyogJmV0aF9hZGRyLCAqLyBpcCwKKwkJCQkJCQkmZXRoX2FkZHIsIGlwKTsKKwkJCQkJdGltZW91dF9tcyA9IEFOTk9VTkNFX0lOVEVSVkFMICogMTAwMDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8vIFN3aXRjaCB0byBtb25pdG9yIHN0YXRlLgorCQkJCQlzdGF0ZSA9IE1PTklUT1I7CisJCQkJCS8vIGxpbmsgaXMgb2sgdG8gdXNlIGVhcmxpZXIKKwkJCQkJLy8gRklYTUUgdXBkYXRlIGZpbHRlcnMKKwkJCQkJcnVuKGFyZ3YsICJjb25maWciLCAmaXApOworCQkJCQlyZWFkeSA9IDE7CisJCQkJCWNvbmZsaWN0cyA9IDA7CisJCQkJCXRpbWVvdXRfbXMgPSAtMTsgLy8gTmV2ZXIgdGltZW91dCBpbiB0aGUgbW9uaXRvciBzdGF0ZS4KKworCQkJCQkvLyBOT1RFOiBhbGwgb3RoZXIgZXhpdCBwYXRocworCQkJCQkvLyBzaG91bGQgZGVjb25maWcgLi4uCisJCQkJCWlmIChRVUlUKQorCQkJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERFRkVORDoKKwkJCQkvLyBXZSB3b24hICBObyBBUlAgcmVwbGllcywgc28ganVzdCBnbyBiYWNrIHRvIG1vbml0b3IuCisJCQkJc3RhdGUgPSBNT05JVE9SOworCQkJCXRpbWVvdXRfbXMgPSAtMTsKKwkJCQljb25mbGljdHMgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvLyBJbnZhbGlkLCBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgUmVzdGFydCB0aGUgd2hvbGUgcHJvdG9jb2wuCisJCQkJc3RhdGUgPSBQUk9CRTsKKwkJCQlpcC5zX2FkZHIgPSBwaWNrKCk7CisJCQkJdGltZW91dF9tcyA9IDA7CisJCQkJbnByb2JlcyA9IDA7CisJCQkJbmNsYWltcyA9IDA7CisJCQkJYnJlYWs7CisJCQl9IC8vIHN3aXRjaCAoc3RhdGUpCisJCQlicmVhazsgLy8gY2FzZSAwICh0aW1lb3V0KQorCisJCS8vIHBhY2tldHMgYXJyaXZpbmcsIG9yIGxpbmsgd2VudCBkb3duCisJCWNhc2UgMToKKwkJCS8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSB0aW1lb3V0IGluIGNhc2Ugd2UgZGlkbid0IHJlY2VpdmUKKwkJCS8vIGEgY29uZmxpY3RpbmcgcGFja2V0LgorCQkJaWYgKHRpbWVvdXRfbXMgPiAwKSB7CisJCQkJdW5zaWduZWQgZGlmZiA9IGRlYWRsaW5lX3VzIC0gTU9OT1RPTklDX1VTKCk7CisJCQkJaWYgKChpbnQpKGRpZmYpIDwgMCkgeworCQkJCQkvLyBDdXJyZW50IHRpbWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBleHBlY3RlZCB0aW1lb3V0IHRpbWUuCisJCQkJCS8vIFNob3VsZCBuZXZlciBoYXBwZW4uCisJCQkJCVZEQkcoIm1pc3NlZCBhbiBleHBlY3RlZCB0aW1lb3V0XG4iKTsKKwkJCQkJdGltZW91dF9tcyA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJVkRCRygiYWRqdXN0aW5nIHRpbWVvdXRcbiIpOworCQkJCQl0aW1lb3V0X21zID0gKGRpZmYgLyAxMDAwKSB8IDE7IC8qIG5ldmVyIDAgKi8KKwkJCQl9CisJCQl9CisKKwkJCWlmICgoZmRzWzBdLnJldmVudHMgJiBQT0xMSU4pID09IDApIHsKKwkJCQlpZiAoZmRzWzBdLnJldmVudHMgJiBQT0xMRVJSKSB7CisJCQkJCS8vIEZJWE1FOiBsaW5rcyByb3V0aW5lbHkgZ28gZG93bjsKKwkJCQkJLy8gdGhpcyBzaG91bGRuJ3QgbmVjZXNzYXJpbHkgZXhpdC4KKwkJCQkJYmJfZXJyb3JfbXNnKCJpZmFjZSAlcyBpcyBkb3duIiwgYXJndl9pbnRmKTsKKwkJCQkJaWYgKHJlYWR5KSB7CisJCQkJCQlydW4oYXJndiwgImRlY29uZmlnIiwgJmlwKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gcmVhZCBBUlAgcGFja2V0CisJCQlpZiAoc2FmZV9yZWFkKHNvY2tfZmQsICZwLCBzaXplb2YocCkpIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQl9CisJCQlpZiAocC5ldGguZXRoZXJfdHlwZSAhPSBodG9ucyhFVEhFUlRZUEVfQVJQKSkKKwkJCQljb250aW51ZTsKKyNpZmRlZiBERUJVRworCQkJeworCQkJCXN0cnVjdCBldGhlcl9hZGRyICpzaGEgPSAoc3RydWN0IGV0aGVyX2FkZHIgKikgcC5hcnAuYXJwX3NoYTsKKwkJCQlzdHJ1Y3QgZXRoZXJfYWRkciAqdGhhID0gKHN0cnVjdCBldGhlcl9hZGRyICopIHAuYXJwLmFycF90aGE7CisJCQkJc3RydWN0IGluX2FkZHIgKnNwYSA9IChzdHJ1Y3QgaW5fYWRkciAqKSBwLmFycC5hcnBfc3BhOworCQkJCXN0cnVjdCBpbl9hZGRyICp0cGEgPSAoc3RydWN0IGluX2FkZHIgKikgcC5hcnAuYXJwX3RwYTsKKwkJCQlWREJHKCIlcyByZWN2IGFycCB0eXBlPSVkLCBvcD0lZCxcbiIsCisJCQkJCWFyZ3ZfaW50ZiwgbnRvaHMocC5ldGguZXRoZXJfdHlwZSksCisJCQkJCW50b2hzKHAuYXJwLmFycF9vcCkpOworCQkJCVZEQkcoIlx0c291cmNlPSVzICVzXG4iLAorCQkJCQlldGhlcl9udG9hKHNoYSksCisJCQkJCWluZXRfbnRvYSgqc3BhKSk7CisJCQkJVkRCRygiXHR0YXJnZXQ9JXMgJXNcbiIsCisJCQkJCWV0aGVyX250b2EodGhhKSwKKwkJCQkJaW5ldF9udG9hKCp0cGEpKTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHAuYXJwLmFycF9vcCAhPSBodG9ucyhBUlBPUF9SRVFVRVNUKQorCQkJICYmIHAuYXJwLmFycF9vcCAhPSBodG9ucyhBUlBPUF9SRVBMWSkpCisJCQkJY29udGludWU7CisKKwkJCXNvdXJjZV9pcF9jb25mbGljdCA9IDA7CisJCQl0YXJnZXRfaXBfY29uZmxpY3QgPSAwOworCisJCQlpZiAobWVtY21wKHAuYXJwLmFycF9zcGEsICZpcC5zX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpID09IDAKKwkJCSAmJiBtZW1jbXAoJnAuYXJwLmFycF9zaGEsICZldGhfYWRkciwgRVRIX0FMRU4pICE9IDAKKwkJCSkgeworCQkJCXNvdXJjZV9pcF9jb25mbGljdCA9IDE7CisJCQl9CisJCQlpZiAocC5hcnAuYXJwX29wID09IGh0b25zKEFSUE9QX1JFUVVFU1QpCisJCQkgJiYgbWVtY21wKHAuYXJwLmFycF90cGEsICZpcC5zX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpID09IDAKKwkJCSAmJiBtZW1jbXAoJnAuYXJwLmFycF90aGEsICZldGhfYWRkciwgRVRIX0FMRU4pICE9IDAKKwkJCSkgeworCQkJCXRhcmdldF9pcF9jb25mbGljdCA9IDE7CisJCQl9CisKKwkJCVZEQkcoInN0YXRlID0gJWQsIHNvdXJjZSBpcCBjb25mbGljdCA9ICVkLCB0YXJnZXQgaXAgY29uZmxpY3QgPSAlZFxuIiwKKwkJCQlzdGF0ZSwgc291cmNlX2lwX2NvbmZsaWN0LCB0YXJnZXRfaXBfY29uZmxpY3QpOworCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJY2FzZSBQUk9CRToKKwkJCWNhc2UgQU5OT1VOQ0U6CisJCQkJLy8gV2hlbiBwcm9iaW5nIG9yIGFubm91bmNpbmcsIGNoZWNrIGZvciBzb3VyY2UgSVAgY29uZmxpY3RzCisJCQkJLy8gYW5kIG90aGVyIGhvc3RzIGRvaW5nIEFSUCBwcm9iZXMgKHRhcmdldCBJUCBjb25mbGljdHMpLgorCQkJCWlmIChzb3VyY2VfaXBfY29uZmxpY3QgfHwgdGFyZ2V0X2lwX2NvbmZsaWN0KSB7CisJCQkJCWNvbmZsaWN0cysrOworCQkJCQlpZiAoY29uZmxpY3RzID49IE1BWF9DT05GTElDVFMpIHsKKwkJCQkJCVZEQkcoIiVzIHJhdGVsaW1pdFxuIiwgYXJndl9pbnRmKTsKKwkJCQkJCXRpbWVvdXRfbXMgPSBSQVRFX0xJTUlUX0lOVEVSVkFMICogMTAwMDsKKwkJCQkJCXN0YXRlID0gUkFURV9MSU1JVF9QUk9CRTsKKwkJCQkJfQorCisJCQkJCS8vIHJlc3RhcnQgdGhlIHdob2xlIHByb3RvY29sCisJCQkJCWlwLnNfYWRkciA9IHBpY2soKTsKKwkJCQkJdGltZW91dF9tcyA9IDA7CisJCQkJCW5wcm9iZXMgPSAwOworCQkJCQluY2xhaW1zID0gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIE1PTklUT1I6CisJCQkJLy8gSWYgYSBjb25mbGljdCwgd2UgdHJ5IHRvIGRlZmVuZCB3aXRoIGEgc2luZ2xlIEFSUCBwcm9iZS4KKwkJCQlpZiAoc291cmNlX2lwX2NvbmZsaWN0KSB7CisJCQkJCVZEQkcoIm1vbml0b3IgY29uZmxpY3QgLS0gZGVmZW5kaW5nXG4iKTsKKwkJCQkJc3RhdGUgPSBERUZFTkQ7CisJCQkJCXRpbWVvdXRfbXMgPSBERUZFTkRfSU5URVJWQUwgKiAxMDAwOworCQkJCQlhcnAoLyogQVJQT1BfUkVRVUVTVCwgKi8KKwkJCQkJCS8qICZldGhfYWRkciwgKi8gaXAsCisJCQkJCQkmZXRoX2FkZHIsIGlwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERFRkVORDoKKwkJCQkvLyBXZWxsLCB3ZSB0cmllZC4gIFN0YXJ0IG92ZXIgKG9uIGNvbmZsaWN0KS4KKwkJCQlpZiAoc291cmNlX2lwX2NvbmZsaWN0KSB7CisJCQkJCXN0YXRlID0gUFJPQkU7CisJCQkJCVZEQkcoImRlZmVuZCBjb25mbGljdCAtLSBzdGFydGluZyBvdmVyXG4iKTsKKwkJCQkJcmVhZHkgPSAwOworCQkJCQlydW4oYXJndiwgImRlY29uZmlnIiwgJmlwKTsKKworCQkJCQkvLyByZXN0YXJ0IHRoZSB3aG9sZSBwcm90b2NvbAorCQkJCQlpcC5zX2FkZHIgPSBwaWNrKCk7CisJCQkJCXRpbWVvdXRfbXMgPSAwOworCQkJCQlucHJvYmVzID0gMDsKKwkJCQkJbmNsYWltcyA9IDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvLyBJbnZhbGlkLCBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgUmVzdGFydCB0aGUgd2hvbGUgcHJvdG9jb2wuCisJCQkJVkRCRygiaW52YWxpZCBzdGF0ZSAtLSBzdGFydGluZyBvdmVyXG4iKTsKKwkJCQlzdGF0ZSA9IFBST0JFOworCQkJCWlwLnNfYWRkciA9IHBpY2soKTsKKwkJCQl0aW1lb3V0X21zID0gMDsKKwkJCQlucHJvYmVzID0gMDsKKwkJCQluY2xhaW1zID0gMDsKKwkJCQlicmVhazsKKwkJCX0gLy8gc3dpdGNoIHN0YXRlCisJCQlicmVhazsgLy8gY2FzZSAxIChwYWNrZXRzIGFycml2aW5nKQorCQl9IC8vIHN3aXRjaCBwb2xsCisJfSAvLyB3aGlsZSAoMSkKKyN1bmRlZiBhcmd2X2ludGYKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3ByaW50dXRpbHMvQ29uZmlnLnNyYyBiL2J1c3lib3gtMS4xOS4zL3ByaW50dXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRhYjhkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvcHJpbnR1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIlByaW50IFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBMUEQKKwlib29sICJscGQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbHBkIGlzIGEgcHJpbnQgc3Bvb2xpbmcgZGFlbW9uLgorCitjb25maWcgTFBSCisJYm9vbCAibHByIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxwciBzZW5kcyBmaWxlcyAob3Igc3RhbmRhcmQgaW5wdXQpIHRvIGEgcHJpbnQgc3Bvb2xpbmcgZGFlbW9uLgorCitjb25maWcgTFBRCisJYm9vbCAibHBxIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxwcSBpcyBhIHByaW50IHNwb29sIHF1ZXVlIGV4YW1pbmF0aW9uIGFuZCBtYW5pcHVsYXRpb24gcHJvZ3JhbS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcHJpbnR1dGlscy9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvcHJpbnR1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NGZlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcmludHV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15IDo9CisKK2xpYi0kKENPTkZJR19MUEQpICs9IGxwZC5vCitsaWItJChDT05GSUdfTFBSKSArPSBscHIubworbGliLSQoQ09ORklHX0xQUSkgKz0gbHByLm8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3ByaW50dXRpbHMvbHBkLmMgYi9idXN5Ym94LTEuMTkuMy9wcmludHV0aWxzL2xwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MmU4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcmludHV0aWxzL2xwZC5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtaWNybyBscGQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIEEgdHlwaWNhbCB1c2FnZSBvZiBCQiBscGQgbG9va3MgYXMgZm9sbG93czoKKyAqICMgdGNwc3ZkIC1FIDAgNTE1IGxwZCBbU1BPT0xESVJdIFtIRUxQRVItUFJPRyBbQVJHUy4uLl1dCisgKgorICogVGhpcyBzdGFydHMgVENQIGxpc3RlbmVyIG9uIHBvcnQgNTE1IChkZWZhdWx0IGZvciBMUCBwcm90b2NvbCkuCisgKiBXaGVuIGEgY2xpZW50IGNvbm5lY3Rpb24gaXMgbWFkZSAodmlhIGxwcikgbHBkIGZpcnN0IGNoYW5nZXMgaXRzCisgKiB3b3JraW5nIGRpcmVjdG9yeSB0byBTUE9PTERJUiAoY3VycmVudCBkaXIgaXMgdGhlIGRlZmF1bHQpLgorICoKKyAqIFNQT09MRElSIGlzIHRoZSBzcG9vbCBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgcHJpbnRpbmcgcXVldWVzCisgKiBhbmQgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgKgorICogU1BPT0xESVIvCisgKiAgICAgIDxxdWV1ZTE+CisgKiAgICAgIC4uLgorICogICAgICA8cXVldWVOPgorICoKKyAqIDxxdWV1ZVg+IGNhbiBiZSBvZiB0d28gdHlwZXM6CisgKiAgICAgIEEuIGEgcHJpbnRlciBjaGFyYWN0ZXIgZGV2aWNlLCBhbiBvcmRpbmFyeSBmaWxlIG9yIGEgbGluayB0byBzdWNoOworICogICAgICBCLiBhIGRpcmVjdG9yeS4KKyAqCisgKiBJbiBjYXNlIEEgbHBkIGp1c3QgZHVtcHMgdGhlIGRhdGEgaXQgcmVjZWl2ZXMgZnJvbSBjbGllbnQgKGxwcikgdG8gdGhlCisgKiBlbmQgb2YgcXVldWUgZmlsZS9kZXZpY2UuIFRoaXMgaXMgbm9uLXNwb29saW5nIG1vZGUuCisgKgorICogSW4gY2FzZSBCIGxwZCBlbnRlcnMgc3Bvb2xpbmcgbW9kZS4gSXQgcmVsaWFibHkgc2F2ZXMgY2xpZW50IGRhdGEgYWxvbmcKKyAqIHdpdGggY29udHJvbCBpbmZvIGluIHR3byB1bmlxdWUgZmlsZXMgdW5kZXIgdGhlIHF1ZXVlIGRpcmVjdG9yeS4gVGhlc2UKKyAqIGZpbGVzIGFyZSBuYW1lZCBkZkFYWFhISEhIIGFuZCBjZkFYWFhISEhILCB3aGVyZSBYWFggaXMgdGhlIGpvYiBudW1iZXIKKyAqIGFuZCBISEhIIGlzIHRoZSBjbGllbnQgaG9zdG5hbWUuIFVubGVzcyBhIHByaW50aW5nIGhlbHBlciBhcHBsaWNhdGlvbgorICogaXMgc3BlY2lmaWVkIGxwZCBpcyBkb25lIGF0IHRoaXMgcG9pbnQuCisgKgorICogTkI6IGZpbGUgbmFtZXMgYXJlIHByb2R1Y2VkIGJ5IHBlZXIhIFRoZXkgYWN0dWFsbHkgbWF5IGJlIGFueXRoaW5nIGF0IGFsbC4KKyAqIGxwZCBvbmx5IHNhbml0aXplcyB0aGVtIChieSByZW1vdmluZyBtb3N0IG5vbi1hbHBoYW51bWVyaWNzKS4KKyAqCisgKiBJZiBIRUxQRVItUFJPRyAod2l0aCBvcHRpb25hbCBhcmd1bWVudHMpIGlzIHNwZWNpZmllZCB0aGVuIGxwZCBjb250aW51ZXMKKyAqIHRvIHByb2Nlc3MgY2xpZW50IGRhdGE6CisgKiAgICAgIDEuIGl0IHJlYWRzIGFuZCBwYXJzZXMgY29udHJvbCBmaWxlIChjZkEuLi4pLiBUaGUgcGFyc2UgcHJvY2VzcworICogICAgICByZXN1bHRzIGluIHNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdob3NlIHZhbHVlcyB3ZXJlIHBhc3NlZAorICogICAgICBpbiBjb250cm9sIGZpbGU7IHdoZW4gcGFyc2luZyBpcyBjb21wbGV0ZSwgbHBkIGRlbGV0ZXMgY29udHJvbCBmaWxlLgorICogICAgICAyLiBpdCBzcGF3bnMgc3BlY2lmaWVkIGhlbHBlciBhcHBsaWNhdGlvbi4gSXQgaXMgdGhlbgorICogICAgICB0aGUgaGVscGVyIGFwcGxpY2F0aW9uIHdobyBpcyByZXNwb25zaWJsZSBmb3IgYm90aCBhY3R1YWwgcHJpbnRpbmcKKyAqICAgICAgYW5kIGRlbGV0aW5nIG9mIHByb2Nlc3NlZCBkYXRhIGZpbGUuCisgKgorICogQSBnb29kIGxwciBwYXNzZXMgY29udHJvbCBmaWxlcyB3aGljaCB3aGVuIHBhcnNlZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCisgKiB2YXJpYWJsZXM6CisgKiAkSCA9IGhvc3Qgd2hpY2ggaXNzdWVzIHRoZSBqb2IKKyAqICRQID0gdXNlciB3aG8gcHJpbnRzCisgKiAkQyA9IGNsYXNzIG9mIHByaW50aW5nICh3aGF0IGlzIHByaW50ZWQgb24gYmFubmVyIHBhZ2UpCisgKiAkSiA9IHRoZSBuYW1lIG9mIHRoZSBqb2IKKyAqICRMID0gcHJpbnQgYmFubmVyIHBhZ2UKKyAqICRNID0gdGhlIHVzZXIgdG8gd2hvbSBhIG1haWwgc2hvdWxkIGJlIHNlbnQgaWYgYSBwcm9ibGVtIG9jY3VycworICoKKyAqIFdlIHNwZWNpZmljYWxseSBmaWx0ZXIgb3V0IGFuZCBOT1QgcHJvdmlkZToKKyAqICRsID0gbmFtZSBvZiBkYXRhZmlsZSAoImRmQXh4eCIpIC0gZmlsZSB3aG9zZSBjb250ZW50IGFyZSB0byBiZSBwcmludGVkCisgKgorICogbHBkIHByb3ZpZGVzICREQVRBRklMRSBpbnN0ZWFkIC0gdGhlIEFDVFVBTCBuYW1lCisgKiBvZiB0aGUgZGF0YWZpbGUgdW5kZXIgd2hpY2ggaXQgd2FzIHNhdmVkLgorICogJGwgd291bGQgYmUgbm90IHJlbGlhYmxlICh5b3Ugd291bGQgYmUgYXQgbWVyY3kgb2YgcmVtb3RlIHBlZXIpLgorICoKKyAqIFRodXMsIGEgdHlwaWNhbCBoZWxwZXIgY2FuIGJlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKiAjIS9iaW4vc2gKKyAqIGNhdCAuLyIkREFUQUZJTEUiID4vZGV2L2xwMAorICogbXYgLWYgLi8iJERBVEFGSUxFIiBzYXZlLworICovCisKKy8vdXNhZ2U6I2RlZmluZSBscGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlNQT09MRElSIFtIRUxQRVIgW0FSR1NdXSIKKy8vdXNhZ2U6I2RlZmluZSBscGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTUE9PTERJUiBtdXN0IGNvbnRhaW4gKHN5bWxpbmtzIHRvKSBkZXZpY2Ugbm9kZXMgb3IgZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxud2l0aCBuYW1lcyBtYXRjaGluZyBwcmludCBxdWV1ZSBuYW1lcy4gSW4gdGhlIGZpcnN0IGNhc2UsIGpvYnMgYXJlIgorLy91c2FnZTogICAgICJcbnNlbnQgZGlyZWN0bHkgdG8gdGhlIGRldmljZS4gT3RoZXJ3aXNlIGVhY2ggam9iIGlzIHN0b3JlZCBpbiBxdWV1ZSIKKy8vdXNhZ2U6ICAgICAiXG5kaXJlY3RvcnkgYW5kIEhFTFBFUiBwcm9ncmFtIGlzIGNhbGxlZC4gTmFtZSBvZiBmaWxlIHRvIHByaW50IgorLy91c2FnZTogICAgICJcbmlzIHBhc3NlZCBpbiAkREFUQUZJTEUgdmFyaWFibGUuIgorLy91c2FnZTogICAgICJcbkV4YW1wbGU6IgorLy91c2FnZTogICAgICJcbgl0Y3BzdmQgLUUgMCA1MTUgc29mdGxpbWl0IC1tIDk5OTk5OSBscGQgL3Zhci9zcG9vbCAuL3ByaW50IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLy8gc3RyaXAgYXJndW1lbnQgb2YgYmFkIGNoYXJzCitzdGF0aWMgY2hhciAqc2FuZShjaGFyICpzdHIpCit7CisJY2hhciAqcyA9IHN0cjsKKwljaGFyICpwID0gczsKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKGlzYWxudW0oKnMpIHx8ICctJyA9PSAqcyB8fCAnXycgPT0gKnMpIHsKKwkJCSpwKysgPSAqczsKKwkJfQorCQlzKys7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgY2hhciAqeG1hbGxvY19yZWFkX3N0ZGluKHZvaWQpCit7CisJLy8gU0VDVVJJVFk6CisJc2l6ZV90IG1heCA9IDQgKiAxMDI0OyAvLyBtb3JlIHRoYW4gZW5vdWdoIGZvciBjb21tYW5kcyEKKwlyZXR1cm4geG1hbGxvY19yZWFkcyhTVERJTl9GSUxFTk8sICZtYXgpOworfQorCitpbnQgbHBkX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICphcmd2W10pCit7CisJaW50IHNwb29saW5nID0gc3Bvb2xpbmc7IC8vIGZvciBjb21waWxlcgorCWNoYXIgKnMsICpxdWV1ZTsKKwljaGFyICpmaWxlbmFtZXNbMl07CisKKwkvLyBnb3RvIHNwb29sIGRpcmVjdG9yeQorCWlmICgqKythcmd2KQorCQl4Y2hkaXIoKmFyZ3YrKyk7CisKKwkvLyBlcnJvciBtZXNzYWdlcyBvZiB4ZnVuY3Mgd2lsbCBiZSBzZW50IG92ZXIgbmV0d29yaworCXhkdXAyKFNURE9VVF9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCisJLy8gbnVsbGlmeSBjdHJsL2RhdGEgZmlsZW5hbWVzCisJbWVtc2V0KGZpbGVuYW1lcywgMCwgc2l6ZW9mKGZpbGVuYW1lcykpOworCisJLy8gcmVhZCBjb21tYW5kCisJcyA9IHF1ZXVlID0geG1hbGxvY19yZWFkX3N0ZGluKCk7CisJLy8gd2UgdW5kZXJzdGFuZCBvbmx5ICJyZWNlaXZlIGpvYiIgY29tbWFuZAorCWlmICgyICE9ICpxdWV1ZSkgeworIHVuc3VwcG9ydGVkX2NtZDoKKwkJcHJpbnRmKCJDb21tYW5kICUwMnggJXNcbiIsCisJCQkodW5zaWduZWQgY2hhcilzWzBdLCAiaXMgbm90IHN1cHBvcnRlZCIpOworCQlnb3RvIGVycl9leGl0OworCX0KKworCS8vIHBhcnNlIGNvbW1hbmQ6ICIyIHwgUVVFVUVfTkFNRSB8ICdcbiciCisJcXVldWUrKzsKKwkvLyBwcm90ZWN0IGFnYWluc3QgIi8uLi8iIGF0dGFja3MKKwkvLyAqc3RyY2hybnVsKHF1ZXVlLCAnXG4nKSA9ICdcMCc7IC0gcmVkdW5kYW50LCBzYW5lKCkgd2lsbCBkbworCWlmICghKnNhbmUocXVldWUpKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJLy8gcXVldWUgaXMgYSBkaXJlY3RvcnkgLT4gY2hkaXIgdG8gaXQgYW5kIGVudGVyIHNwb29saW5nIG1vZGUKKwlzcG9vbGluZyA9IGNoZGlyKHF1ZXVlKSArIDE7IC8vIDA6IGNhbm5vdCBjaGRpciwgMTogZG9uZQorCS8vIHdlIGRvbid0IGZyZWUocyksIHdlIG1pZ2h0IG5lZWQgInF1ZXVlIiB2YXIgbGF0ZXIKKworCXdoaWxlICgxKSB7CisJCWNoYXIgKmZuYW1lOworCQlpbnQgZmQ7CisJCS8vIGludCBpcyBlYXNpZXIgdGhhbiBzc2l6ZV90OiBjYW4gdXNlIHhhdG9pX3Bvc2l0aXZlLAorCQkvLyBhbmQgY2FuIGNvcnJlY3RseSBkaXNwbGF5IGVycm9yIHJldHVybnMgKC0xKQorCQlpbnQgZXhwZWN0ZWRfbGVuLCByZWFsX2xlbjsKKworCQkvLyBzaWduYWwgT0sKKwkJc2FmZV93cml0ZShTVERPVVRfRklMRU5PLCAiIiwgMSk7CisKKwkJLy8gZ2V0IHN1YmNvbW1hbmQKKwkJLy8gdmFsaWQgcyBtdXN0IGJlIG9mIGZvcm06ICJTVUJDTUQgfCBMRU4gfCBzcGFjZSB8IEZOQU1FIgorCQkvLyBOLkIuIHdlIGJhaWwgb3V0IG9uIGFueSBlcnJvcgorCQlzID0geG1hbGxvY19yZWFkX3N0ZGluKCk7CisJCWlmICghcykgeyAvLyAocHJvYmFibHkpIEVPRgorCQkJY2hhciAqcCwgKnEsIHZhclsyXTsKKworCQkJLy8gbm9uLXNwb29saW5nIG1vZGUgb3Igbm8gc3Bvb2wgaGVscGVyIHNwZWNpZmllZAorCQkJaWYgKCFzcG9vbGluZyB8fCAhKmFyZ3YpCisJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLy8gdGhlIG9ubHkgbm9uLWVycm9yIGV4aXQKKwkJCS8vIHNwb29saW5nIG1vZGUgYnV0IHdlIGRpZG4ndCBzZWUgYm90aCBjdHJsZmlsZSAmIGRhdGFmaWxlCisJCQlpZiAoc3Bvb2xpbmcgIT0gNykKKwkJCQlnb3RvIGVycl9leGl0OyAvLyByZWplY3Qgam9iCisKKwkJCS8vIHNwb29saW5nIG1vZGUgYW5kIHNwb29sIGhlbHBlciBzcGVjaWZpZWQgLT4gZXhlYyBzcG9vbCBoZWxwZXIKKwkJCS8vICh3ZSBleGl0IDEyNyBpZiBoZWxwZXIgY2Fubm90IGJlIGV4ZWN1dGVkKQorCQkJdmFyWzFdID0gJ1wwJzsKKwkJCS8vIHJlYWQgYW5kIGRlbGV0ZSBjdHJsZmlsZQorCQkJcSA9IHhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShmaWxlbmFtZXNbMF0sIE5VTEwpOworCQkJdW5saW5rKGZpbGVuYW1lc1swXSk7CisJCQkvLyBwcm92aWRlIGRhdGFmaWxlIG5hbWUKKwkJCS8vIHdlIGNhbiB1c2UgbGVha3kgc2V0ZW52IHNpbmNlIHdlIGFyZSBhYm91dCB0byBleGVjIG9yIGV4aXQKKwkJCXhzZXRlbnYoIkRBVEFGSUxFIiwgZmlsZW5hbWVzWzFdKTsKKwkJCS8vIHBhcnNlIGNvbnRyb2wgZmlsZSBieSAiXG4iCisJCQl3aGlsZSAoKHAgPSBzdHJjaHIocSwgJ1xuJykpICE9IE5VTEwgJiYgaXNhbHBoYSgqcSkpIHsKKwkJCQkqcCsrID0gJ1wwJzsKKwkJCQkvLyBxIGlzIGEgbGluZSBvZiA8U1lNPjxWQUxVRT4sCisJCQkJLy8gd2UgYXJlIHNldHRpbmcgZW52aXJvbm1lbnQgc3RyaW5nIDxTWU0+PTxWQUxVRT4uCisJCQkJLy8gSWdub3JpbmcgImw8ZGF0YWZpbGU+IiwgZXhwb3J0aW5nIG90aGVyczoKKwkJCQlpZiAoKnEgIT0gJ2wnKSB7CisJCQkJCXZhclswXSA9ICpxKys7CisJCQkJCXhzZXRlbnYodmFyLCBxKTsKKwkJCQl9CisJCQkJcSA9IHA7IC8vIG5leHQgbGluZQorCQkJfQorCQkJLy8gaGVscGVyIHNob3VsZCBub3QgdGFsayBvdmVyIG5ldHdvcmsuCisJCQkvLyB0aGlzIGNhbGwgcmVvcGVucyBzdGRpbyBmZHMgdG8gIi9kZXYvbnVsbCIKKwkJCS8vIChubyBkYWVtb25pemF0aW9uIGlzIGRvbmUpCisJCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0RFVk5VTExfU1RESU8gfCBEQUVNT05fT05MWV9TQU5JVElaRSwgTlVMTCk7CisJCQlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworCQl9CisKKwkJLy8gdmFsaWRhdGUgaW5wdXQuCisJCS8vIHdlIHVuZGVyc3RhbmQgb25seSAiY29udHJvbCBmaWxlIiBvciAiZGF0YSBmaWxlIiBjbWRzCisJCWlmICgyICE9IHNbMF0gJiYgMyAhPSBzWzBdKQorCQkJZ290byB1bnN1cHBvcnRlZF9jbWQ7CisJCWlmIChzcG9vbGluZyAmICgxIDw8IChzWzBdLTEpKSkgeworCQkJcHJpbnRmKCJEdXBsaWNhdGVkIHN1YmNvbW1hbmRcbiIpOworCQkJZ290byBlcnJfZXhpdDsKKwkJfQorCQkvLyBnZXQgZmlsZW5hbWUKKwkJKnN0cmNocm51bChzLCAnXG4nKSA9ICdcMCc7CisJCWZuYW1lID0gc3RyY2hyKHMsICcgJyk7CisJCWlmICghZm5hbWUpIHsKKy8vIGJhZF9mbmFtZToKKwkJCXByaW50ZigiTm8gb3IgYmFkIGZpbGVuYW1lXG4iKTsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJKmZuYW1lKysgPSAnXDAnOworLy8JCS8vIHNbMF09PTI6IGN0cmxmaWxlLCBtdXN0IHN0YXJ0IHdpdGggJ2MnCisvLwkJLy8gc1swXT09MzogZGF0YWZpbGUsIG11c3Qgc3RhcnQgd2l0aCAnZCcKKy8vCQlpZiAoZm5hbWVbMF0gIT0gc1swXSArICgnYyctMikpCisvLwkJCWdvdG8gYmFkX2ZuYW1lOworCQkvLyBnZXQgbGVuZ3RoCisJCWV4cGVjdGVkX2xlbiA9IGJiX3N0cnRvdShzICsgMSwgTlVMTCwgMTApOworCQlpZiAoZXJybm8gfHwgZXhwZWN0ZWRfbGVuIDwgMCkgeworCQkJcHJpbnRmKCJCYWQgbGVuZ3RoXG4iKTsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJaWYgKDIgPT0gc1swXSAmJiBleHBlY3RlZF9sZW4gPiAxNiAqIDEwMjQpIHsKKwkJCS8vIFNFQ1VSSVRZOgorCQkJLy8gY3RybGZpbGUgY2FuJ3QgYmUgYmlnICh3ZSB3YW50IHRvIHJlYWQgaXQgYmFjayBsYXRlciEpCisJCQlwcmludGYoIkZpbGUgaXMgdG9vIGJpZ1xuIik7CisJCQlnb3RvIGVycl9leGl0OworCQl9CisKKwkJLy8gb3BlbiB0aGUgZmlsZQorCQlpZiAoc3Bvb2xpbmcpIHsKKwkJCS8vIHNwb29saW5nIG1vZGU6IGR1bXAgYm90aCBmaWxlcworCQkJLy8gam9iIGluIGZsaWdodCBoYXMgbW9kZSAwMjAwICJvbmx5IHdyaXRhYmxlIgorCQkJc2FuZShmbmFtZSk7CisJCQlmZCA9IG9wZW4zX29yX3dhcm4oZm5hbWUsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0VYQ0wsIDAyMDApOworCQkJaWYgKGZkIDwgMCkKKwkJCQlnb3RvIGVycl9leGl0OworCQkJZmlsZW5hbWVzW3NbMF0gLSAyXSA9IHhzdHJkdXAoZm5hbWUpOworCQl9IGVsc2UgeworCQkJLy8gbm9uLXNwb29saW5nIG1vZGU6CisJCQkvLyAyOiBjb250cm9sIGZpbGUgKGlnbm9yaW5nKSwgMzogZGF0YSBmaWxlCisJCQlmZCA9IC0xOworCQkJaWYgKDMgPT0gc1swXSkKKwkJCQlmZCA9IHhvcGVuKHF1ZXVlLCBPX1JEV1IgfCBPX0FQUEVORCk7CisJCX0KKworCQkvLyBzaWduYWwgT0sKKwkJc2FmZV93cml0ZShTVERPVVRfRklMRU5PLCAiIiwgMSk7CisKKwkJLy8gY29weSB0aGUgZmlsZQorCQlyZWFsX2xlbiA9IGJiX2NvcHlmZF9zaXplKFNURElOX0ZJTEVOTywgZmQsIGV4cGVjdGVkX2xlbik7CisJCWlmIChyZWFsX2xlbiAhPSBleHBlY3RlZF9sZW4pIHsKKwkJCXByaW50ZigiRXhwZWN0ZWQgJWQgYnV0IGdvdCAlZCBieXRlc1xuIiwKKwkJCQlleHBlY3RlZF9sZW4sIHJlYWxfbGVuKTsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJLy8gZ2V0IEVPRiBpbmRpY2F0b3IsIHNlZSB3aGV0aGVyIGl0IGlzIE5VTCAob2spCisJCS8vIChhbmQgZG9uJ3QgdHJhc2ggc1swXSEpCisJCWlmIChzYWZlX3JlYWQoU1RESU5fRklMRU5PLCAmc1sxXSwgMSkgIT0gMSB8fCBzWzFdICE9IDApIHsKKwkJCS8vIGRvbid0IHNlbmQgZXJyb3IgbXNnIHRvIHBlZXIgLSBpdCBvYnZpb3VzbHkKKwkJCS8vIGRvZXNuJ3QgZm9sbG93IHRoZSBwcm90b2NvbCwgc28gcHJvYmFibHkKKwkJCS8vIGl0IGNhbid0IHVuZGVyc3RhbmQgdXMgZWl0aGVyCisJCQlnb3RvIGVycl9leGl0OworCQl9CisKKwkJaWYgKHNwb29saW5nKSB7CisJCQkvLyBjaG1vZCBjb21wbGV0ZWx5IGRvd25sb2FkZWQgZmlsZSBhcyAicmVhZGFibGUrd3JpdGFibGUiCisJCQlmY2htb2QoZmQsIDA2MDApOworCQkJLy8gYWNjdW11bGF0ZSBkdW1wIHN0YXRlCisJCQkvLyBOLkIuIGFmdGVyIGFsbCBmaWxlcyBhcmUgZHVtcGVkIHNwb29saW5nIHNob3VsZCBiZSAxKzIrND09NworCQkJc3Bvb2xpbmcgfD0gKDEgPDwgKHNbMF0tMSkpOyAvLyBiaXQgMTogY3RybGZpbGU7IGJpdCAyOiBkYXRhZmlsZQorCQl9CisKKwkJZnJlZShzKTsKKwkJY2xvc2UoZmQpOyAvLyBOQjogY2FuIGRvIGNsb3NlKC0xKS4gV2hvIGNhcmVzPworCisJCS8vIE5COiBkb24ndCBkbyAic2lnbmFsIE9LIiB3cml0ZSBoZXJlLCBpdCB3aWxsIGJlIGRvbmUKKwkJLy8gYXQgdGhlIHRvcCBvZiB0aGUgbG9vcAorCX0gLy8gd2hpbGUgKDEpCisKKyBlcnJfZXhpdDoKKwkvLyBkb24ndCBrZWVwIGNvcnJ1cHRlZCBmaWxlcworCWlmIChzcG9vbGluZykgeworI2RlZmluZSBpIHNwb29saW5nCisJCWZvciAoaSA9IDI7IC0taSA+PSAwOyApCisJCQlpZiAoZmlsZW5hbWVzW2ldKQorCQkJCXVubGluayhmaWxlbmFtZXNbaV0pOworCX0KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcHJpbnR1dGlscy9scHIuYyBiL2J1c3lib3gtMS4xOS4zL3ByaW50dXRpbHMvbHByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2YmNhOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3ByaW50dXRpbHMvbHByLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJhcmUgYm9uZXMgdmVyc2lvbiBvZiBscHIgJiBscHE6IEJTRCBwcmludGluZyB1dGlsaXRpZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIE9yaWdpbmFsIGlkZWEgYW5kIGNvZGU6CisgKiAgICAgIFdhbHRlciBIYXJtcyA8V0hhcm1zQGJmcy5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFNlZSBSRkMgMTE3OSBmb3IgcHJvdG9jb2wgZGVzY3JpcHRpb24uCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxwcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLVAgcXVldWVbQGhvc3RbOnBvcnRdXSAtVSBVU0VSTkFNRSAtSiBUSVRMRSAtVm1oIFtGSUxFXS4uLiIKKy8qIC1DIENMQVNTIGV4aXN0cyB0b28sIG5vdCBzaG93bi4KKyAqIENMQVNTIGlzIHN1cHBvc2VkIHRvIGJlIHByaW50ZWQgb24gYmFubmVyIHBhZ2UsIGlmIG9uZSBpcyByZXF1ZXN0ZWQgKi8KKy8vdXNhZ2U6I2RlZmluZSBscHJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLVAJbHAgc2VydmljZSB0byBjb25uZWN0IHRvIChlbHNlIHVzZXMgJFBSSU5URVIpIgorLy91c2FnZTogICAgICJcbgktbQlTZW5kIG1haWwgb24gY29tcGxldGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJUHJpbnQgYmFubmVyIHBhZ2UgdG9vIgorLy91c2FnZTogICAgICJcbgktVglWZXJib3NlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBscHFfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUCBxdWV1ZVtAaG9zdFs6cG9ydF1dXSBbLVUgVVNFUk5BTUVdIFstZCBKT0JJRF0uLi4gWy1mc10iCisvL3VzYWdlOiNkZWZpbmUgbHBxX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1QCWxwIHNlcnZpY2UgdG8gY29ubmVjdCB0byAoZWxzZSB1c2VzICRQUklOVEVSKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVsZXRlIGpvYnMiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIGFueSB3YWl0aW5nIGpvYiB0byBiZSBwcmludGVkIgorLy91c2FnZTogICAgICJcbgktcwlTaG9ydCBkaXNwbGF5IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIExQRCByZXR1cm5zIGJpbmFyeSAwIG9uIHN1Y2Nlc3MuCisgKiBPdGhlcndpc2UgaXQgcmV0dXJucyBlcnJvciBtZXNzYWdlLgorICovCitzdGF0aWMgdm9pZCBnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoaW50IGZkLCBjb25zdCBjaGFyICplcnJtc2cpCit7CisJc3NpemVfdCBzejsKKwljaGFyIGJ1ZlsxMjhdOworCisJYnVmWzBdID0gJyAnOworCXN6ID0gc2FmZV9yZWFkKGZkLCBidWYsIDEpOworCWlmICgnXDAnICE9IGJ1ZlswXSkgeworCQkvLyByZXF1ZXN0IGhhcyBmYWlsZWQKKwkJLy8gdHJ5IHRvIG1ha2Ugc3VyZSBsYXN0IGNoYXIgaXMgJ1xuJywgYnV0IGRvIG5vdCBhZGQKKwkJLy8gc3VwZXJmbHVvdXMgb25lCisJCXN6ID0gZnVsbF9yZWFkKGZkLCBidWYgKyAxLCAxMjYpOworCQliYl9lcnJvcl9tc2coImVycm9yIHdoaWxlICVzJXMiLCBlcnJtc2csCisJCQkJKHN6ID4gMCA/ICIuIFNlcnZlciBzYWlkOiIgOiAiIikpOworCQlpZiAoc3ogPiAwKSB7CisJCQkvLyBzeiA9IChieXRlcyBpbiBidWYpIC0gMQorCQkJaWYgKGJ1Zltzel0gIT0gJ1xuJykKKwkJCQlidWZbKytzel0gPSAnXG4nOworCQkJc2FmZV93cml0ZShTVERFUlJfRklMRU5PLCBidWYsIHN6ICsgMSk7CisJCX0KKwkJeGZ1bmNfZGllKCk7CisJfQorfQorCitpbnQgbHBxcl9tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxwcXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKmFyZ3ZbXSkKK3sKKwllbnVtIHsKKwkJT1BUX1AgICAgICAgICAgID0gMSA8PCAwLCAvLyAtUCBxdWV1ZVtAaG9zdFs6cG9ydF1dLiBJZiBubyAtUCBpcyBnaXZlbiB1c2UgJFBSSU5URVIsIHRoZW4gImxwQGxvY2FsaG9zdDo1MTUiCisJCU9QVF9VICAgICAgICAgICA9IDEgPDwgMSwgLy8gLVUgdXNlcm5hbWUKKworCQlMUFJfViAgICAgICAgICAgPSAxIDw8IDIsIC8vIC1WOiBiZSB2ZXJib3NlCisJCUxQUl9oICAgICAgICAgICA9IDEgPDwgMywgLy8gLWg6IHdhbnQgYmFubmVyIHByaW50ZWQKKwkJTFBSX0MgICAgICAgICAgID0gMSA8PCA0LCAvLyAtQyBjbGFzczogam9iICJjbGFzcyIgKD8gc3VwcG9zZWRseSBwcmludGVkIG9uIGJhbm5lcikKKwkJTFBSX0ogICAgICAgICAgID0gMSA8PCA1LCAvLyAtSiB0aXRsZTogdGhlIGpvYiB0aXRsZSBmb3IgdGhlIGJhbm5lciBwYWdlCisJCUxQUl9tICAgICAgICAgICA9IDEgPDwgNiwgLy8gLW06IHNlbmQgbWFpbCBiYWNrIHRvIHVzZXIKKworCQlMUFFfU0hPUlRfRk1UICAgPSAxIDw8IDIsIC8vIC1zOiBzaG9ydCBsaXN0aW5nIGZvcm1hdAorCQlMUFFfREVMRVRFICAgICAgPSAxIDw8IDMsIC8vIC1kOiBkZWxldGUgam9iKHMpCisJCUxQUV9GT1JDRSAgICAgICA9IDEgPDwgNCwgLy8gLWY6IGZvcmNlIHdhaXRpbmcgam9iKHMpIHRvIGJlIHByaW50ZWQKKwl9OworCWNoYXIgdGVtcGZpbGVbc2l6ZW9mKCIvdG1wL2xwclhYWFhYWCIpXTsKKwljb25zdCBjaGFyICpqb2JfdGl0bGU7CisJY29uc3QgY2hhciAqcHJpbnRlcl9jbGFzcyA9ICIiOyAgIC8vIHByaW50ZXIgY2xhc3MsIG1heCAzMiBjaGFyCisJY29uc3QgY2hhciAqcXVldWU7ICAgICAgICAgICAgICAgIC8vIG5hbWUgb2YgcHJpbnRlciBxdWV1ZQorCWNvbnN0IGNoYXIgKnNlcnZlciA9ICJsb2NhbGhvc3QiOyAvLyBzZXJ2ZXJbOnBvcnRdIG9mIHByaW50ZXIgcXVldWUKKwljaGFyICpob3N0bmFtZTsKKwkvLyBOLkIuIElNSE8gZ2V0ZW52KCJVU0VSIikgY2FuIGJlIHdheSBlYXNpbHkgc3Bvb2ZlZCEKKwljb25zdCBjaGFyICp1c2VyID0geHVpZDJ1bmFtZShnZXR1aWQoKSk7CisJdW5zaWduZWQgam9iOworCXVuc2lnbmVkIG9wdHM7CisJaW50IGZkOworCisJLy8gcGFyc2Ugb3B0aW9ucworCS8vIFRPRE86IHNldCBvcHRfY29tcGxlbWVudGFyeTogcyxkLGYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorCW9wdHMgPSBnZXRvcHQzMihhcmd2LAorCQkoLypscCovJ3InID09IGFwcGxldF9uYW1lWzJdKSA/ICJQOlU6VmhDOko6bSIgOiAiUDpVOnNkZiIKKwkJLCAmcXVldWUsICZ1c2VyCisJCSwgJnByaW50ZXJfY2xhc3MsICZqb2JfdGl0bGUKKwkpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLy8gaWYgcXVldWUgaXMgbm90IHNwZWNpZmllZCAtPiB1c2UgJFBSSU5URVIKKwlpZiAoIShvcHRzICYgT1BUX1ApKQorCQlxdWV1ZSA9IGdldGVudigiUFJJTlRFUiIpOworCS8vIGlmIHF1ZXVlIGlzIHN0aWxsIG5vdCBzcGVjaWZpZWQgLT4KKwlpZiAoIXF1ZXVlKSB7CisJCS8vIC4uLiBxdWV1ZSBkZWZhdWx0cyB0byAibHAiCisJCS8vIHNlcnZlciBkZWZhdWx0cyB0byAibG9jYWxob3N0IgorCQlxdWV1ZSA9ICJscCI7CisJLy8gaWYgcXVldWUgaXMgc3BlY2lmaWVkIC0+CisJfSBlbHNlIHsKKwkJLy8gcXVldWUgbmFtZSBpcyB0byB0aGUgbGVmdCBvZiAnQCcKKwkJY2hhciAqcyA9IHN0cmNocihxdWV1ZSwgJ0AnKTsKKwkJaWYgKHMpIHsKKwkJCS8vIHNlcnZlciBuYW1lIGlzIHRvIHRoZSByaWdodCBvZiAnQCcKKwkJCSpzID0gJ1wwJzsKKwkJCXNlcnZlciA9IHMgKyAxOworCQl9CisJfQorCisJLy8gZG8gY29ubmVjdAorCWZkID0gY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoc2VydmVyLCA1MTUpOworCisJLy8KKwkvLyBMUFEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8KKwlpZiAoLypscCovJ3EnID09IGFwcGxldF9uYW1lWzJdKSB7CisJCWNoYXIgY21kOworCQkvLyBmb3JjZSBwcmludGluZyBvZiBldmVyeSBqb2Igc3RpbGwgaW4gcXVldWUKKwkJaWYgKG9wdHMgJiBMUFFfRk9SQ0UpIHsKKwkJCWNtZCA9IDE7CisJCQlnb3RvIGNvbW1hbmQ7CisJCS8vIGRlbGV0ZSBqb2IocykKKwkJfSBlbHNlIGlmIChvcHRzICYgTFBRX0RFTEVURSkgeworCQkJZmRwcmludGYoZmQsICJceDUiICIlcyAlcyIsIHF1ZXVlLCB1c2VyKTsKKwkJCXdoaWxlICgqYXJndikgeworCQkJCWZkcHJpbnRmKGZkLCAiICVzIiwgKmFyZ3YrKyk7CisJCQl9CisJCQliYl9wdXRjaGFyKCdcbicpOworCQkvLyBkdW1wIGN1cnJlbnQgam9icyBzdGF0dXMKKwkJLy8gTi5CLiBwZXJpb2RpY2FsIHBvbGxpbmcgc2hvdWxkIGJlIGFjaGlldmVkCisJCS8vIHZpYSAid2F0Y2ggLW4gZGVsYXkgbHBxIgorCQkvLyBUaGV5IHNheSBpdCdzIHRoZSBVTklYLXdheSA6KQorCQl9IGVsc2UgeworCQkJY21kID0gKG9wdHMgJiBMUFFfU0hPUlRfRk1UKSA/IDMgOiA0OworIGNvbW1hbmQ6CisJCQlmZHByaW50ZihmZCwgIiVjIiAiJXNcbiIsIGNtZCwgcXVldWUpOworCQkJYmJfY29weWZkX2VvZihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCX0KKworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8vCisJLy8gTFBSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vCisJaWYgKG9wdHMgJiBMUFJfVikKKwkJYmJfZXJyb3JfbXNnKCJjb25uZWN0ZWQgdG8gc2VydmVyIik7CisKKwlqb2IgPSBnZXRwaWQoKSAlIDEwMDA7CisJaG9zdG5hbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisKKwkvLyBubyBmaWxlcyBnaXZlbiBvbiBjb21tYW5kIGxpbmU/IC0+IHVzZSBzdGRpbgorCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciAqKSItIjsKKworCWZkcHJpbnRmKGZkLCAiXHgyIiAiJXNcbiIsIHF1ZXVlKTsKKwlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZXR0aW5nIHF1ZXVlIik7CisKKwkvLyBwcm9jZXNzIGZpbGVzCisJZG8geworCQl1bnNpZ25lZCBjZmxlbjsKKwkJaW50IGRmZDsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIgKmM7CisJCWNoYXIgKnJlbW90ZV9maWxlbmFtZTsKKwkJY2hhciAqY29udHJvbGZpbGU7CisKKwkJLy8gaWYgZGF0YSBmaWxlIGlzIHN0ZGluLCB3ZSBuZWVkIHRvIGR1bXAgaXQgZmlyc3QKKwkJaWYgKExPTkVfREFTSCgqYXJndikpIHsKKwkJCXN0cmNweSh0ZW1wZmlsZSwgIi90bXAvbHByWFhYWFhYIik7CisJCQlkZmQgPSB4bWtzdGVtcCh0ZW1wZmlsZSk7CisJCQliYl9jb3B5ZmRfZW9mKFNURElOX0ZJTEVOTywgZGZkKTsKKwkJCXhsc2VlayhkZmQsIDAsIFNFRUtfU0VUKTsKKwkJCSphcmd2ID0gKGNoYXIqKWJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwkJfSBlbHNlIHsKKwkJCWRmZCA9IHhvcGVuKCphcmd2LCBPX1JET05MWSk7CisJCX0KKworCQkvKiAiVGhlIG5hbWUgLi4uIHNob3VsZCBzdGFydCB3aXRoIEFTQ0lJICJjZkEiLAorCQkgKiBmb2xsb3dlZCBieSBhIHRocmVlIGRpZ2l0IGpvYiBudW1iZXIsIGZvbGxvd2VkCisJCSAqIGJ5IHRoZSBob3N0IG5hbWUgd2hpY2ggaGFzIGNvbnN0cnVjdGVkIHRoZSBmaWxlLiIKKwkJICogV2Ugc3VwcGx5ICdjJyBvciAnZCcgYXMgbmVlZGVkIGZvciBjb250cm9sL2RhdGEgZmlsZS4gKi8KKwkJcmVtb3RlX2ZpbGVuYW1lID0geGFzcHJpbnRmKCJmQSUwM3UlcyIsIGpvYiwgaG9zdG5hbWUpOworCisJCS8vIGNyZWF0ZSBjb250cm9sIGZpbGUKKwkJLy8gVE9ETzogYWxsIGxpbmVzIGJ1dCAyIGxhc3QgYXJlIGNvbnN0YW50cyEgSG93IHdlIGNhbiB1c2UgdGhpcyBmYWN0PworCQljb250cm9sZmlsZSA9IHhhc3ByaW50ZigKKwkJCSJIIiAiJS4zMnNcbiIgIlAiICIlLjMyc1xuIiAvKiBIIEhPU1QsIFAgVVNFUiAqLworCQkJIkMiICIlLjMyc1xuIiAvKiBDIENMQVNTIC0gcHJpbnRlZCBvbiBiYW5uZXIgcGFnZSAoaWYgTCBjbWQgaXMgYWxzbyBnaXZlbikgKi8KKwkJCSJKIiAiJS45OXNcbiIgLyogSiBKT0JOQU1FICovCisJCQkvKiAiY2xhc3MgbmFtZSBmb3IgYmFubmVyIHBhZ2UgYW5kIGpvYiBuYW1lCisJCQkgKiBmb3IgYmFubmVyIHBhZ2UgY29tbWFuZHMgbXVzdCBwcmVjZWRlIEwgY29tbWFuZCIgKi8KKwkJCSJMIiAiJS4zMnNcbiIgLyogTCBVU0VSIC0gcHJpbnQgYmFubmVyIHBhZ2UsIHdpdGggZ2l2ZW4gdXNlcidzIG5hbWUgKi8KKwkJCSJNIiAiJS4zMnNcbiIgLyogTSBXSE9NX1RPX01BSUwgKi8KKwkJCSJsIiAiZCUuMzFzXG4iIC8qIGwgREFUQV9GSUxFX05BTUUgKCJkZkF4eHgiKSAqLworCQkJLCBob3N0bmFtZSwgdXNlcgorCQkJLCBwcmludGVyX2NsYXNzIC8qIGNhbiBiZSAiIiAqLworCQkJLCAoKG9wdHMgJiBMUFJfSikgPyBqb2JfdGl0bGUgOiAqYXJndikKKwkJCSwgKG9wdHMgJiBMUFJfaCkgPyB1c2VyIDogIiIKKwkJCSwgKG9wdHMgJiBMUFJfbSkgPyB1c2VyIDogIiIKKwkJCSwgcmVtb3RlX2ZpbGVuYW1lCisJCSk7CisJCS8vIGRlbGV0ZSBwb3NzaWJsZSAiXG5YXG4iIHBhdHRlcm5zCisJCWMgPSBjb250cm9sZmlsZTsKKwkJY2ZsZW4gPSAodW5zaWduZWQpc3RybGVuKGNvbnRyb2xmaWxlKTsKKwkJd2hpbGUgKChjID0gc3RyY2hyKGMsICdcbicpKSAhPSBOVUxMKSB7CisJCQlpZiAoY1sxXSAmJiBjWzJdID09ICdcbicpIHsKKwkJCQkvKiBjYW4ndCB1c2Ugc3RyY3B5LCByZXN1bHRzIGFyZSB1bmRlZmluZWQgKi8KKwkJCQltZW1tb3ZlKGMsIGMrMiwgY2ZsZW4gLSAoYy1jb250cm9sZmlsZSkgLSAxKTsKKwkJCQljZmxlbiAtPSAyOworCQkJfSBlbHNlIHsKKwkJCQljKys7CisJCQl9CisJCX0KKworCQkvLyBzZW5kIGNvbnRyb2wgZmlsZQorCQlpZiAob3B0cyAmIExQUl9WKQorCQkJYmJfZXJyb3JfbXNnKCJzZW5kaW5nIGNvbnRyb2wgZmlsZSIpOworCQkvKiAiQWNrbm93bGVkZ2VtZW50IHByb2Nlc3NpbmcgbXVzdCBvY2N1ciBhcyB1c3VhbAorCQkgKiBhZnRlciB0aGUgY29tbWFuZCBpcyBzZW50LiIgKi8KKwkJZmRwcmludGYoZmQsICJceDIiICIldSBjJXNcbiIsIGNmbGVuLCByZW1vdGVfZmlsZW5hbWUpOworCQlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZW5kaW5nIGNvbnRyb2wgZmlsZSIpOworCQkvKiAiT25jZSBhbGwgb2YgdGhlIGNvbnRlbnRzIGhhdmUKKwkJICogYmVlbiBkZWxpdmVyZWQsIGFuIG9jdGV0IG9mIHplcm8gYml0cyBpcyBzZW50IGFzCisJCSAqIGFuIGluZGljYXRpb24gdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGlzIGNvbXBsZXRlLgorCQkgKiBBIHNlY29uZCBsZXZlbCBvZiBhY2tub3dsZWRnZW1lbnQgcHJvY2Vzc2luZworCQkgKiBtdXN0IG9jY3VyIGF0IHRoaXMgcG9pbnQuIiAqLworCQlmdWxsX3dyaXRlKGZkLCBjb250cm9sZmlsZSwgY2ZsZW4gKyAxKTsgLyogd3JpdGVzIE5VTCBieXRlIHRvbyAqLworCQlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZW5kaW5nIGNvbnRyb2wgZmlsZSIpOworCisJCS8vIHNlbmQgZGF0YSBmaWxlLCB3aXRoIG5hbWUgImRmYVhYWCIKKwkJaWYgKG9wdHMgJiBMUFJfVikKKwkJCWJiX2Vycm9yX21zZygic2VuZGluZyBkYXRhIGZpbGUiKTsKKwkJc3Quc3Rfc2l6ZSA9IDA7IC8qIHBhcmFub2lhOiBmc3RhdCBtYXkgdGhlb3JldGljYWxseSBmYWlsICovCisJCWZzdGF0KGRmZCwgJnN0KTsKKwkJZmRwcmludGYoZmQsICJceDMiICIlIk9GRl9GTVQidSBkJXNcbiIsIHN0LnN0X3NpemUsIHJlbW90ZV9maWxlbmFtZSk7CisJCWdldF9yZXNwb25zZV9vcl9zYXlfYW5kX2RpZShmZCwgInNlbmRpbmcgZGF0YSBmaWxlIik7CisJCWlmIChiYl9jb3B5ZmRfc2l6ZShkZmQsIGZkLCBzdC5zdF9zaXplKSAhPSBzdC5zdF9zaXplKSB7CisJCQkvLyBXZSdyZSBzY3Jld2VkLiBXZSBzZW50IGxlc3MgYnl0ZXMgdGhhbiB3ZSBhZHZlcnRpc2VkLgorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImxvY2FsIGZpbGUgY2hhbmdlZCBzaXplPyEiKTsKKwkJfQorCQl3cml0ZShmZCwgIiIsIDEpOyAvLyBzZW5kIEFDSworCQlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZW5kaW5nIGRhdGEgZmlsZSIpOworCisJCS8vIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZSBpZiB3ZSBkdW1wZWQgc3RkaW4KKwkJaWYgKCphcmd2ID09IChjaGFyKiliYl9tc2dfc3RhbmRhcmRfaW5wdXQpCisJCQl1bmxpbmsodGVtcGZpbGUpOworCisJCS8vIGNsZWFudXAKKwkJY2xvc2UoZmQpOworCQlmcmVlKHJlbW90ZV9maWxlbmFtZSk7CisJCWZyZWUoY29udHJvbGZpbGUpOworCisJCS8vIHNheSBqb2IgYWNjZXB0ZWQKKwkJaWYgKG9wdHMgJiBMUFJfVikKKwkJCWJiX2Vycm9yX21zZygiam9iIGFjY2VwdGVkIik7CisKKwkJLy8gbmV4dCwgcGxlYXNlIQorCQlqb2IgPSAoam9iICsgMSkgJSAxMDAwOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9Db25maWcuc3JjIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwYjAyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMjA0IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJQcm9jZXNzIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBGUkVFCisJYm9vbCAiZnJlZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVggI3N5c2luZm8oKQorCWhlbHAKKwkgIGZyZWUgZGlzcGxheXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmcmVlIGFuZCB1c2VkIHBoeXNpY2FsIGFuZCBzd2FwCisJICBtZW1vcnkgaW4gdGhlIHN5c3RlbSwgYXMgd2VsbCBhcyB0aGUgYnVmZmVycyB1c2VkIGJ5IHRoZSBrZXJuZWwuCisJICBUaGUgc2hhcmVkIG1lbW9yeSBjb2x1bW4gc2hvdWxkIGJlIGlnbm9yZWQ7IGl0IGlzIG9ic29sZXRlLgorCitjb25maWcgRlVTRVIKKwlib29sICJmdXNlciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBmdXNlciBsaXN0cyBhbGwgUElEcyAoUHJvY2VzcyBJRHMpIHRoYXQgY3VycmVudGx5IGhhdmUgYSBnaXZlbgorCSAgZmlsZSBvcGVuLiBmdXNlciBjYW4gYWxzbyBsaXN0IGFsbCBQSURzIHRoYXQgaGF2ZSBhIGdpdmVuIG5ldHdvcmsKKwkgIChUQ1Agb3IgVURQKSBwb3J0IG9wZW4uCisKK2NvbmZpZyBLSUxMCisJYm9vbCAia2lsbCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgY29tbWFuZCBraWxsIHNlbmRzIHRoZSBzcGVjaWZpZWQgc2lnbmFsIHRvIHRoZSBzcGVjaWZpZWQKKwkgIHByb2Nlc3Mgb3IgcHJvY2VzcyBncm91cC4gSWYgbm8gc2lnbmFsIGlzIHNwZWNpZmllZCwgdGhlIFRFUk0KKwkgIHNpZ25hbCBpcyBzZW50LgorCitjb25maWcgS0lMTEFMTAorCWJvb2wgImtpbGxhbGwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBLSUxMCisJaGVscAorCSAga2lsbGFsbCBzZW5kcyBhIHNpZ25hbCB0byBhbGwgcHJvY2Vzc2VzIHJ1bm5pbmcgYW55IG9mIHRoZQorCSAgc3BlY2lmaWVkIGNvbW1hbmRzLiBJZiBubyBzaWduYWwgbmFtZSBpcyBzcGVjaWZpZWQsIFNJR1RFUk0gaXMKKwkgIHNlbnQuCisKK2NvbmZpZyBLSUxMQUxMNQorCWJvb2wgImtpbGxhbGw1IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gS0lMTAorCitjb25maWcgUEdSRVAKKwlib29sICJwZ3JlcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBMb29rIGZvciBwcm9jZXNzZXMgYnkgbmFtZS4KKworY29uZmlnIFBJRE9GCisJYm9vbCAicGlkb2YiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUGlkb2YgZmluZHMgdGhlIHByb2Nlc3MgaWQncyAocGlkcykgb2YgdGhlIG5hbWVkIHByb2dyYW1zLiBJdCBwcmludHMKKwkgIHRob3NlIGlkJ3Mgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KKworY29uZmlnIEZFQVRVUkVfUElET0ZfU0lOR0xFCisJYm9vbCAiRW5hYmxlIGFyZ3VtZW50IGZvciBzaW5nbGUgc2hvdCAoLXMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUElET0YKKwloZWxwCisJICBTdXBwb3J0IGFyZ3VtZW50ICctcycgZm9yIHJldHVybmluZyBvbmx5IHRoZSBmaXJzdCBwaWQgZm91bmQuCisKK2NvbmZpZyBGRUFUVVJFX1BJRE9GX09NSVQKKwlib29sICJFbmFibGUgYXJndW1lbnQgZm9yIG9taXR0aW5nIHBpZHMgKC1vKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBJRE9GCisJaGVscAorCSAgU3VwcG9ydCBhcmd1bWVudCAnLW8nIGZvciBvbWl0dGluZyB0aGUgZ2l2ZW4gcGlkcyBpbiBvdXRwdXQuCisJICBUaGUgc3BlY2lhbCBwaWQgJVBQSUQgY2FuIGJlIHVzZWQgdG8gbmFtZSB0aGUgcGFyZW50IHByb2Nlc3MKKwkgIG9mIHRoZSBwaWRvZiwgaW4gb3RoZXIgd29yZHMgdGhlIGNhbGxpbmcgc2hlbGwgb3Igc2hlbGwgc2NyaXB0LgorCitjb25maWcgUEtJTEwKKwlib29sICJwa2lsbCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZW5kIHNpZ25hbHMgdG8gcHJvY2Vzc2VzIGJ5IG5hbWUuCisKK2NvbmZpZyBQUworCWJvb2wgInBzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHBzIGdpdmVzIGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzc2VzLgorCitjb25maWcgRkVBVFVSRV9QU19XSURFCisJYm9vbCAiRW5hYmxlIHdpZGUgb3V0cHV0IG9wdGlvbiAoLXcpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUFMKKwloZWxwCisJICBTdXBwb3J0IGFyZ3VtZW50ICd3JyBmb3Igd2lkZSBvdXRwdXQuCisJICBJZiBnaXZlbiBvbmNlLCAxMzIgY2hhcnMgYXJlIHByaW50ZWQsIGFuZCBpZiBnaXZlbiBtb3JlCisJICB0aGFuIG9uY2UsIHRoZSBsZW5ndGggaXMgdW5saW1pdGVkLgorCitjb25maWcgRkVBVFVSRV9QU19USU1FCisJYm9vbCAiRW5hYmxlIHRpbWUgYW5kIGVsYXBzZWQgdGltZSBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQUyAmJiBERVNLVE9QCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU3VwcG9ydCAtbyB0aW1lIGFuZCAtbyBldGltZSBvdXRwdXQgc3BlY2lmaWVycy4KKworY29uZmlnIEZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TCisJYm9vbCAiRW5hYmxlIGFkZGl0aW9uYWwgcHMgY29sdW1ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBTICYmIERFU0tUT1AKKwloZWxwCisJICBTdXBwb3J0IC1vIHJncm91cCwgLW8gcnVzZXIsIC1vIG5pY2Ugb3V0cHV0IHNwZWNpZmllcnMuCisKK2NvbmZpZyBGRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUworCWJvb2wgIlN1cHBvcnQgTGludXggcHJpb3IgdG8gMi40LjAgYW5kIG5vbi1FTEYgc3lzdGVtcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfUFNfVElNRQorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgbWVhc3VyaW5nIEhaIG9uIG9sZCBrZXJuZWxzIGFuZCBub24tRUxGIHN5c3RlbXMKKwkgIChpZiB5b3UgYXJlIG9uIExpbnV4IDIuNC4wKyBhbmQgdXNlIEVMRiwgeW91IGRvbid0IG5lZWQgdGhpcykKKworY29uZmlnIFJFTklDRQorCWJvb2wgInJlbmljZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBSZW5pY2UgYWx0ZXJzIHRoZSBzY2hlZHVsaW5nIHByaW9yaXR5IG9mIG9uZSBvciBtb3JlIHJ1bm5pbmcKKwkgIHByb2Nlc3Nlcy4KKworY29uZmlnIEJCX1NZU0NUTAorCWJvb2wgInN5c2N0bCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDb25maWd1cmUga2VybmVsIHBhcmFtZXRlcnMgYXQgcnVudGltZS4KKworY29uZmlnIFRPUAorCWJvb2wgInRvcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgdG9wIHByb2dyYW0gcHJvdmlkZXMgYSBkeW5hbWljIHJlYWwtdGltZSB2aWV3IG9mIGEgcnVubmluZworCSAgc3lzdGVtLgorCitjb25maWcgRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwlib29sICJTaG93IENQVSBwZXItcHJvY2VzcyB1c2FnZSBwZXJjZW50YWdlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVE9QCisJaGVscAorCSAgTWFrZSB0b3AgZGlzcGxheSBDUFUgdXNhZ2UgZm9yIGVhY2ggcHJvY2Vzcy4KKwkgIFRoaXMgYWRkcyBhYm91dCAyay4KKworY29uZmlnIEZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMKKwlib29sICJTaG93IENQVSBnbG9iYWwgdXNhZ2UgcGVyY2VudGFnZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJaGVscAorCSAgTWFrZXMgdG9wIGRpc3BsYXkgIkNQVTogTk4lIHVzciBOTiUgc3lzLi4uIiBsaW5lLgorCSAgVGhpcyBhZGRzIGFib3V0IDAuNWsuCisKK2NvbmZpZyBGRUFUVVJFX1RPUF9TTVBfQ1BVCisJYm9vbCAiU01QIENQVSB1c2FnZSBkaXNwbGF5ICgnYycga2V5KSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMKKwloZWxwCisJICBBbGxvdyAnYycga2V5IHRvIHN3aXRjaCBiZXR3ZWVuIGluZGl2aWR1YWwvY3VtdWxhdGl2ZSBDUFUgc3RhdHMKKwkgIFRoaXMgYWRkcyBhYm91dCAwLjVrLgorCitjb25maWcgRkVBVFVSRV9UT1BfREVDSU1BTFMKKwlib29sICJTaG93IDEvMTB0aCBvZiBhIHBlcmNlbnQgaW4gQ1BVL21lbSBzdGF0aXN0aWNzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwloZWxwCisJICBTaG93IDEvMTB0aCBvZiBhIHBlcmNlbnQgaW4gQ1BVL21lbSBzdGF0aXN0aWNzLgorCSAgVGhpcyBhZGRzIGFib3V0IDAuM2suCisKK2NvbmZpZyBGRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworCWJvb2wgIlNob3cgQ1BVIHByb2Nlc3MgcnVucyBvbiAoJ2onIGZpZWxkKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRPUAorCWhlbHAKKwkgIFNob3cgQ1BVIHdoZXJlIHByb2Nlc3Mgd2FzIGxhc3QgZm91bmQgcnVubmluZyBvbi4KKwkgIFRoaXMgaXMgdGhlICdqJyBmaWVsZC4KKworY29uZmlnIEZFQVRVUkVfVE9QTUVNCisJYm9vbCAiVG9wbWVtIGNvbW1hbmQgKCdzJyBrZXkpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVE9QCisJaGVscAorCSAgRW5hYmxlICdzJyBpbiB0b3AgKGdpdmVzIGxvdHMgb2YgbWVtb3J5IGluZm8pLgorCitjb25maWcgRkVBVFVSRV9TSE9XX1RIUkVBRFMKKwlib29sICJTdXBwb3J0IGZvciBzaG93aW5nIHRocmVhZHMgaW4gcHMvcHN0cmVlL3RvcCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBTIHx8IFRPUCB8fCBQU1RSRUUKKwloZWxwCisJICBFbmFibGVzIHRoZSBwcyAtVCBvcHRpb24sIHNob3dpbmcgb2YgdGhyZWFkcyBpbiBwc3RyZWUsCisJICBhbmQgJ2gnIGNvbW1hbmQgaW4gdG9wLgorCitjb25maWcgV0FUQ0gKKwlib29sICJ3YXRjaCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3YXRjaCBpcyB1c2VkIHRvIGV4ZWN1dGUgYSBwcm9ncmFtIHBlcmlvZGljYWxseSwgc2hvd2luZworCSAgb3V0cHV0IHRvIHRoZSBzY3JlZW4uCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliMWNjMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMjIgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0ZSRUUpCSs9IGZyZWUubworbGliLSQoQ09ORklHX0ZVU0VSKQkrPSBmdXNlci5vCitsaWItJChDT05GSUdfS0lMTCkJKz0ga2lsbC5vCitsaWItJChDT05GSUdfQVNIKQkrPSBraWxsLm8gICMgdXNlZCBmb3IgYnVpbHQtaW4ga2lsbCBieSBhc2gKK2xpYi0kKENPTkZJR19QR1JFUCkJKz0gcGdyZXAubworbGliLSQoQ09ORklHX1BLSUxMKQkrPSBwZ3JlcC5vCitsaWItJChDT05GSUdfUElET0YpCSs9IHBpZG9mLm8KK2xpYi0kKENPTkZJR19QUykJKz0gcHMubworbGliLSQoQ09ORklHX1JFTklDRSkJKz0gcmVuaWNlLm8KK2xpYi0kKENPTkZJR19CQl9TWVNDVEwpCSs9IHN5c2N0bC5vCitsaWItJChDT05GSUdfVE9QKQkrPSB0b3AubworbGliLSQoQ09ORklHX1VQVElNRSkJKz0gdXB0aW1lLm8KK2xpYi0kKENPTkZJR19XQVRDSCkgICAgICs9IHdhdGNoLm8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9mcmVlLmMgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvZnJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjJmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvZnJlZS5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGZyZWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBnZXRvcHQgbm90IG5lZWRlZCAqLworCisvL3VzYWdlOiNkZWZpbmUgZnJlZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIiBJRl9ERVNLVE9QKCJbLWIvay9tL2ddIikKKy8vdXNhZ2U6I2RlZmluZSBmcmVlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSB0aGUgYW1vdW50IG9mIGZyZWUgYW5kIHVzZWQgc3lzdGVtIG1lbW9yeSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZnJlZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBmcmVlXG4iCisvL3VzYWdlOiAgICAgICAiICAgICAgICAgICAgICB0b3RhbCAgICAgICAgIHVzZWQgICAgICAgICBmcmVlICAgICAgIHNoYXJlZCAgICAgIGJ1ZmZlcnNcbiIKKy8vdXNhZ2U6ICAgICAgICIgIE1lbTogICAgICAgMjU3NjI4ICAgICAgIDI0ODcyNCAgICAgICAgIDg5MDQgICAgICAgIDU5NjQ0ICAgICAgICA5MzEyNFxuIgorLy91c2FnZTogICAgICAgIiBTd2FwOiAgICAgICAxMjg1MTYgICAgICAgICA4NDA0ICAgICAgIDEyMDExMlxuIgorLy91c2FnZTogICAgICAgIlRvdGFsOiAgICAgICAzODYxNDQgICAgICAgMjU3MTI4ICAgICAgIDEyOTAxNlxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZmRlZiBfX2xpbnV4X18KKyMgaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4KKyNlbmRpZgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgbWVtX3VuaXQ7CisjaWYgRU5BQkxFX0RFU0tUT1AKKwl1bnNpZ25lZCB1bml0X3N0ZXBzOworIyBkZWZpbmUgR191bml0X3N0ZXBzIEcudW5pdF9zdGVwcworI2Vsc2UKKyMgZGVmaW5lIEdfdW5pdF9zdGVwcyAxMAorI2VuZGlmCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2FsZSh1bnNpZ25lZCBsb25nIGQpCit7CisJcmV0dXJuICgodW5zaWduZWQgbG9uZyBsb25nKWQgKiBHLm1lbV91bml0KSA+PiBHX3VuaXRfc3RlcHM7Cit9CisKKworaW50IGZyZWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZyZWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IElGX05PVF9ERVNLVE9QKFVOVVNFRF9QQVJBTSkpCit7CisJc3RydWN0IHN5c2luZm8gaW5mbzsKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0RFU0tUT1AKKwlHLnVuaXRfc3RlcHMgPSAxMDsKKwlpZiAoYXJndlsxXSAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQlzd2l0Y2ggKGFyZ3ZbMV1bMV0pIHsKKwkJY2FzZSAnYic6CisJCQlHLnVuaXRfc3RlcHMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2snOiAvKiAyXjEwICovCisJCQkvKiBHLnVuaXRfc3RlcHMgPSAxMDsgLSBhbHJlYWR5IGlzICovCisJCQlicmVhazsKKwkJY2FzZSAnbSc6IC8qIDJeKDIqMTApICovCisJCQlHLnVuaXRfc3RlcHMgPSAyMDsKKwkJCWJyZWFrOworCQljYXNlICdnJzogLyogMl4oMyoxMCkgKi8KKwkJCUcudW5pdF9zdGVwcyA9IDMwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisjZW5kaWYKKworCXN5c2luZm8oJmluZm8pOworCisJLyogS2VybmVscyBwcmlvciB0byAyLjQueCB3aWxsIHJldHVybiBpbmZvLm1lbV91bml0PT0wLCBzbyBjb3BlLi4uICovCisJRy5tZW1fdW5pdCA9IChpbmZvLm1lbV91bml0ID8gaW5mby5tZW1fdW5pdCA6IDEpOworCisJcHJpbnRmKCIgICAgICUxM3MlMTNzJTEzcyUxM3MlMTNzXG4iLAorCQkidG90YWwiLAorCQkidXNlZCIsCisJCSJmcmVlIiwKKwkJInNoYXJlZCIsICJidWZmZXJzIiAvKiBzd2FwIGFuZCB0b3RhbCBkb24ndCBoYXZlIHRoZXNlIGNvbHVtbnMgKi8KKwkJLyogcHJvY3BzIHZlcnNpb24gMy4yLjggYWxzbyBzaG93cyAiY2FjaGVkIiBjb2x1bW4sIGJ1dAorCQkgKiBzeXNpbmZvKCkgZG9lcyBub3QgcHJvdmlkZSB0aGlzIHZhbHVlLCBuZWVkIHRvIHBhcnNlCisJCSAqIC9wcm9jL21lbWluZm8gaW5zdGVhZCBhbmQgZ2V0ICJDYWNoZWQ6IE5OTiBrQiIgZnJvbSB0aGVyZS4KKwkJICovCisJKTsKKworI2RlZmluZSBGSUVMRFNfNSAiJTEzbGx1JTEzbGx1JTEzbGx1JTEzbGx1JTEzbGx1XG4iCisjZGVmaW5lIEZJRUxEU18zIChGSUVMRFNfNSArIDIqNikKKyNkZWZpbmUgRklFTERTXzIgKEZJRUxEU181ICsgMyo2KQorCisJcHJpbnRmKCJNZW06ICIpOworCXByaW50ZihGSUVMRFNfNSwKKwkJc2NhbGUoaW5mby50b3RhbHJhbSksCisJCXNjYWxlKGluZm8udG90YWxyYW0gLSBpbmZvLmZyZWVyYW0pLAorCQlzY2FsZShpbmZvLmZyZWVyYW0pLAorCQlzY2FsZShpbmZvLnNoYXJlZHJhbSksCisJCXNjYWxlKGluZm8uYnVmZmVycmFtKQorCSk7CisJLyogU2hvdyBhbHRlcm5hdGUsIG1vcmUgbWVhbmluZ2Z1bCBidXN5L2ZyZWUgbnVtYmVycyBieSBjb3VudGluZworCSAqIGJ1ZmZlciBjYWNoZSBhcyBmcmVlIG1lbW9yeSAobWFrZSBpdCAiLS8rIGJ1ZmZlcnMvY2FjaGUiCisJICogaWYvd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3IgImNhY2hlZCIgY29sdW1uKTogKi8KKwlwcmludGYoIi0vKyBidWZmZXJzOiAgICAgICIpOworCXByaW50ZihGSUVMRFNfMiwKKwkJc2NhbGUoaW5mby50b3RhbHJhbSAtIGluZm8uZnJlZXJhbSAtIGluZm8uYnVmZmVycmFtKSwKKwkJc2NhbGUoaW5mby5mcmVlcmFtICsgaW5mby5idWZmZXJyYW0pCisJKTsKKyNpZiBCQl9NTVUKKwlwcmludGYoIlN3YXA6Iik7CisJcHJpbnRmKEZJRUxEU18zLAorCQlzY2FsZShpbmZvLnRvdGFsc3dhcCksCisJCXNjYWxlKGluZm8udG90YWxzd2FwIC0gaW5mby5mcmVlc3dhcCksCisJCXNjYWxlKGluZm8uZnJlZXN3YXApCisJKTsKKyNlbmRpZgorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9wcm9jcHMvZnVzZXIuYyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9mdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjUyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvZnVzZXIuYwpAQCAtMCwwICsxLDMyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGlueSBmdXNlciBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAyMDA0IFRvbnkgSi4gV2hpdGUKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmdXNlcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEZJTEUgb3IgUE9SVC9QUk9UTyIKKy8vdXNhZ2U6I2RlZmluZSBmdXNlcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZpbmQgcHJvY2Vzc2VzIHdoaWNoIHVzZSBGSUxFcyBvciBQT1JUc1xuIgorLy91c2FnZTogICAgICJcbgktbQlGaW5kIHByb2Nlc3NlcyB3aGljaCB1c2Ugc2FtZSBmcyBhcyBGSUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLTQsLTYJU2VhcmNoIG9ubHkgSVB2NC9JUHY2IHNwYWNlIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBkaXNwbGF5IFBJRHMiCisvL3VzYWdlOiAgICAgIlxuCS1rCUtpbGwgZm91bmQgcHJvY2Vzc2VzIgorLy91c2FnZTogICAgICJcbgktU0lHTkFMCVNpZ25hbCB0byBzZW5kIChkZWZhdWx0OiBLSUxMKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgTUFYX0xJTkUgMjU1CisKKyNkZWZpbmUgT1BUSU9OX1NUUklORyAibWtzNjQiCitlbnVtIHsKKwlPUFRfTU9VTlQgID0gKDEgPDwgMCksCisJT1BUX0tJTEwgICA9ICgxIDw8IDEpLAorCU9QVF9TSUxFTlQgPSAoMSA8PCAyKSwKKwlPUFRfSVA2ICAgID0gKDEgPDwgMyksCisJT1BUX0lQNCAgICA9ICgxIDw8IDQpLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgaW5vZGVfbGlzdCB7CisJc3RydWN0IGlub2RlX2xpc3QgKm5leHQ7CisJaW5vX3QgaW5vZGU7CisJZGV2X3QgZGV2OworfSBpbm9kZV9saXN0OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IHJlY3Vyc2lvbl9kZXB0aDsKKwlwaWRfdCBteXBpZDsKKwlpbm9kZV9saXN0ICppbm9kZV9saXN0X2hlYWQ7CisJc21hbGxpbnQga2lsbF9mYWlsZWQ7CisJaW50IGtpbGxzaWc7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlHLm15cGlkID0gZ2V0cGlkKCk7IFwKKwlHLmtpbGxzaWcgPSBTSUdLSUxMOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBhZGRfaW5vZGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0KQoreworCWlub2RlX2xpc3QgKipjdXJyID0gJkcuaW5vZGVfbGlzdF9oZWFkOworCisJd2hpbGUgKCpjdXJyKSB7CisJCWlmICgoKmN1cnIpLT5kZXYgPT0gc3QtPnN0X2RldgorCQkgJiYgKCpjdXJyKS0+aW5vZGUgPT0gc3QtPnN0X2lubworCQkpIHsKKwkJCXJldHVybjsKKwkJfQorCQljdXJyID0gJigqY3VyciktPm5leHQ7CisJfQorCisJKmN1cnIgPSB4emFsbG9jKHNpemVvZihpbm9kZV9saXN0KSk7CisJKCpjdXJyKS0+ZGV2ID0gc3QtPnN0X2RldjsKKwkoKmN1cnIpLT5pbm9kZSA9IHN0LT5zdF9pbm87Cit9CisKK3N0YXRpYyBzbWFsbGludCBzZWFyY2hfZGV2X2lub2RlKGNvbnN0IHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlpbm9kZV9saXN0ICppbGlzdCA9IEcuaW5vZGVfbGlzdF9oZWFkOworCisJd2hpbGUgKGlsaXN0KSB7CisJCWlmIChpbGlzdC0+ZGV2ID09IHN0LT5zdF9kZXYpIHsKKwkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX01PVU5UKQorCQkJCXJldHVybiAxOworCQkJaWYgKGlsaXN0LT5pbm9kZSA9PSBzdC0+c3RfaW5vKQorCQkJCXJldHVybiAxOworCQl9CisJCWlsaXN0ID0gaWxpc3QtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCitlbnVtIHsKKwlQUk9DX05FVCA9IDAsCisJUFJPQ19ESVIsCisJUFJPQ19ESVJfTElOS1MsCisJUFJPQ19TVUJESVJfTElOS1MsCit9OworCitzdGF0aWMgc21hbGxpbnQgc2Nhbl9wcm9jX25ldF9vcl9tYXBzKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIHBvcnQpCit7CisJRklMRSAqZjsKKwljaGFyIGxpbmVbTUFYX0xJTkUgKyAxXSwgYWRkcls2OF07CisJaW50IG1ham9yLCBtaW5vciwgcjsKKwlsb25nIGxvbmcgdWludDY0X2lub2RlOworCXVuc2lnbmVkIHRtcF9wb3J0OworCXNtYWxsaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWNvbnN0IGNoYXIgKmZtdDsKKwl2b2lkICpmYWcsICpzYWc7CisKKwlmID0gZm9wZW5fZm9yX3JlYWQocGF0aCk7CisJaWYgKCFmKQorCQlyZXR1cm4gMDsKKworCWlmIChHLnJlY3Vyc2lvbl9kZXB0aCA9PSBQUk9DX05FVCkgeworCQlpbnQgZmQ7CisKKwkJLyogZmluZCBzb2NrZXQgZGV2ICovCisJCXN0YXRidWYuc3RfZGV2ID0gMDsKKwkJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlmc3RhdChmZCwgJnN0YXRidWYpOworCQkJY2xvc2UoZmQpOworCQl9CisKKwkJZm10ID0gIiUqZDogJTY0WzAtOUEtRmEtZl06JXggJSp4OiUqeCAlKnggIgorCQkJIiUqeDolKnggJSp4OiUqeCAlKnggJSpkICUqZCAlbGx1IjsKKwkJZmFnID0gYWRkcjsKKwkJc2FnID0gJnRtcF9wb3J0OworCX0gZWxzZSB7CisJCWZtdCA9ICIlKnMgJSpzICUqcyAleDoleCAlbGx1IjsKKwkJZmFnID0gJm1ham9yOworCQlzYWcgPSAmbWlub3I7CisJfQorCisJcmV0dmFsID0gMDsKKwl3aGlsZSAoZmdldHMobGluZSwgTUFYX0xJTkUsIGYpKSB7CisJCXIgPSBzc2NhbmYobGluZSwgZm10LCBmYWcsIHNhZywgJnVpbnQ2NF9pbm9kZSk7CisJCWlmIChyICE9IDMpCisJCQljb250aW51ZTsKKworCQlzdGF0YnVmLnN0X2lubyA9IHVpbnQ2NF9pbm9kZTsKKwkJaWYgKEcucmVjdXJzaW9uX2RlcHRoID09IFBST0NfTkVUKSB7CisJCQlyID0gc3RybGVuKGFkZHIpOworCQkJaWYgKHIgPT0gOCAmJiAob3B0aW9uX21hc2szMiAmIE9QVF9JUDYpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHIgPiA4ICYmIChvcHRpb25fbWFzazMyICYgT1BUX0lQNCkpCisJCQkJY29udGludWU7CisJCQlpZiAodG1wX3BvcnQgPT0gcG9ydCkKKwkJCQlhZGRfaW5vZGUoJnN0YXRidWYpOworCQl9IGVsc2UgeworCQkJaWYgKG1ham9yICE9IDAgJiYgbWlub3IgIT0gMCAmJiBzdGF0YnVmLnN0X2lubyAhPSAwKSB7CisJCQkJc3RhdGJ1Zi5zdF9kZXYgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJCQkJcmV0dmFsID0gc2VhcmNoX2Rldl9pbm9kZSgmc3RhdGJ1Zik7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHNtYWxsaW50IHNjYW5fcmVjdXJzaXZlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkOworCXN0cnVjdCBkaXJlbnQgKmRfZW50OworCXNtYWxsaW50IHN0b3Bfc2NhbjsKKwlzbWFsbGludCByZXR2YWw7CisKKwlkID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCUcucmVjdXJzaW9uX2RlcHRoKys7CisJcmV0dmFsID0gMDsKKwlzdG9wX3NjYW4gPSAwOworCXdoaWxlICghc3RvcF9zY2FuICYmIChkX2VudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwkJcGlkX3QgcGlkOworCQljaGFyICpzdWJwYXRoOworCisJCXN1YnBhdGggPSBjb25jYXRfc3VicGF0aF9maWxlKHBhdGgsIGRfZW50LT5kX25hbWUpOworCQlpZiAoc3VicGF0aCA9PSBOVUxMKQorCQkJY29udGludWU7IC8qIC4gb3IgLi4gKi8KKworCQlzd2l0Y2ggKEcucmVjdXJzaW9uX2RlcHRoKSB7CisJCWNhc2UgUFJPQ19ESVI6CisJCQlwaWQgPSAocGlkX3QpYmJfc3RydG91KGRfZW50LT5kX25hbWUsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubyAhPSAwCisJCQkgfHwgcGlkID09IEcubXlwaWQKKwkJCS8qICJ0aGlzIFBJRCBkb2Vzbid0IHVzZSBzcGVjaWZpZWQgRklMRXMgb3IgUE9SVC9QUk9UTyI6ICovCisJCQkgfHwgc2Nhbl9yZWN1cnNpdmUoc3VicGF0aCkgPT0gMAorCQkJKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9LSUxMKSB7CisJCQkJaWYgKGtpbGwocGlkLCBHLmtpbGxzaWcpICE9IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZygia2lsbCBwaWQgJXMiLCBkX2VudC0+ZF9uYW1lKTsKKwkJCQkJRy5raWxsX2ZhaWxlZCA9IDE7CisJCQkJfQorCQkJfQorCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9TSUxFTlQpKQorCQkJCXByaW50ZigiJXMgIiwgZF9lbnQtPmRfbmFtZSk7CisJCQlyZXR2YWwgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBQUk9DX0RJUl9MSU5LUzoKKwkJCXN3aXRjaCAoCisJCQkJaW5kZXhfaW5fc3Vic3RyaW5ncygKKwkJCQkJImN3ZCIgICJcMCIgImV4ZSIgICJcMCIKKwkJCQkJInJvb3QiICJcMCIgImZkIiAgICJcMCIKKwkJCQkJImxpYiIgICJcMCIgIm1tYXAiICJcMCIKKwkJCQkJIm1hcHMiICJcMCIsCisJCQkJCWRfZW50LT5kX25hbWUKKwkJCQkpCisJCQkpIHsKKwkJCWVudW0geworCQkJCUNXRF9MSU5LLAorCQkJCUVYRV9MSU5LLAorCQkJCVJPT1RfTElOSywKKwkJCQlGRF9ESVJfTElOS1MsCisJCQkJTElCX0RJUl9MSU5LUywKKwkJCQlNTUFQX0RJUl9MSU5LUywKKwkJCQlNQVBTLAorCQkJfTsKKwkJCWNhc2UgQ1dEX0xJTks6CisJCQljYXNlIEVYRV9MSU5LOgorCQkJY2FzZSBST09UX0xJTks6CisJCQkJZ290byBzY2FuX2xpbms7CisJCQljYXNlIEZEX0RJUl9MSU5LUzoKKwkJCWNhc2UgTElCX0RJUl9MSU5LUzoKKwkJCWNhc2UgTU1BUF9ESVJfTElOS1M6CisJCQkJc3RvcF9zY2FuID0gc2Nhbl9yZWN1cnNpdmUoc3VicGF0aCk7CisJCQkJaWYgKHN0b3Bfc2NhbikKKwkJCQkJcmV0dmFsID0gc3RvcF9zY2FuOworCQkJCWJyZWFrOworCQkJY2FzZSBNQVBTOgorCQkJCXN0b3Bfc2NhbiA9IHNjYW5fcHJvY19uZXRfb3JfbWFwcyhzdWJwYXRoLCAwKTsKKwkJCQlpZiAoc3RvcF9zY2FuKQorCQkJCQlyZXR2YWwgPSBzdG9wX3NjYW47CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19TVUJESVJfTElOS1M6CisgIHNjYW5fbGluazoKKwkJCWlmIChzdGF0KHN1YnBhdGgsICZzdGF0YnVmKSA8IDApCisJCQkJYnJlYWs7CisJCQlzdG9wX3NjYW4gPSBzZWFyY2hfZGV2X2lub2RlKCZzdGF0YnVmKTsKKwkJCWlmIChzdG9wX3NjYW4pCisJCQkJcmV0dmFsID0gc3RvcF9zY2FuOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJZnJlZShzdWJwYXRoKTsKKwl9CisJY2xvc2VkaXIoZCk7CisJRy5yZWN1cnNpb25fZGVwdGgtLTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgZnVzZXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZ1c2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqcHA7CisKKwlJTklUX0coKTsKKworCS8qIEhhbmRsZSAtU0lHTkFMLiBPaCBteS4uLiAqLworCXBwID0gYXJndjsKKwl3aGlsZSAoKisrcHApIHsKKwkJaW50IHNpZzsKKwkJY2hhciAqYXJnID0gKnBwOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJY29udGludWU7CisJCWlmIChhcmdbMV0gPT0gJy0nICYmIGFyZ1syXSA9PSAnXDAnKSAvKiAiLS0iICovCisJCQlicmVhazsKKwkJaWYgKChhcmdbMV0gPT0gJzQnIHx8IGFyZ1sxXSA9PSAnNicpICYmIGFyZ1syXSA9PSAnXDAnKQorCQkJY29udGludWU7IC8qIGl0J3MgIi00IiBvciAiLTYiICovCisJCXNpZyA9IGdldF9zaWdudW0oJmFyZ1sxXSk7CisJCWlmIChzaWcgPCAwKQorCQkJY29udGludWU7CisJCS8qICItU0lHTkFMIiBvcHRpb24gZm91bmQuIFJlbW92ZSBpdCBhbmQgYmFpbCBvdXQgKi8KKwkJRy5raWxsc2lnID0gc2lnOworCQlkbyB7CisJCQlwcFswXSA9IGFyZyA9IHBwWzFdOworCQkJcHArKzsKKwkJfSB3aGlsZSAoYXJnKTsKKwkJYnJlYWs7CisJfQorCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBhdCBsZWFzdCBvbmUgcGFyYW0gKi8KKwlnZXRvcHQzMihhcmd2LCBPUFRJT05fU1RSSU5HKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXBwID0gYXJndjsKKwl3aGlsZSAoKnBwKSB7CisJCS8qIHBhcnNlIG5ldCBhcmcgKi8KKwkJdW5zaWduZWQgcG9ydDsKKwkJY2hhciBwYXRoW3NpemVvZigiL3Byb2MvbmV0L1RDUDYiKV07CisKKwkJc3RyY3B5KHBhdGgsICIvcHJvYy9uZXQvIik7CisJCWlmIChzc2NhbmYoKnBwLCAiJXUvJTRzIiwgJnBvcnQsIHBhdGggKyBzaXplb2YoIi9wcm9jL25ldC8iKS0xKSA9PSAyCisJCSAmJiBhY2Nlc3MocGF0aCwgUl9PSykgPT0gMAorCQkpIHsKKwkJCS8qIFBPUlQvUFJPVE8gKi8KKwkJCXNjYW5fcHJvY19uZXRfb3JfbWFwcyhwYXRoLCBwb3J0KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZJTEUgKi8KKwkJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJCQl4c3RhdCgqcHAsICZzdGF0YnVmKTsKKwkJCWFkZF9pbm9kZSgmc3RhdGJ1Zik7CisJCX0KKwkJcHArKzsKKwl9CisKKwlpZiAoc2Nhbl9yZWN1cnNpdmUoIi9wcm9jIikpIHsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9TSUxFTlQpKQorCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJcmV0dXJuIEcua2lsbF9mYWlsZWQ7CisJfQorCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9pb3N0YXQuYyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9pb3N0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzhkMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL2lvc3RhdC5jCkBAIC0wLDAgKzEsNTM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBSZXBvcnQgQ1BVIGFuZCBJL08gc3RhdHMsIGJhc2VkIG9uIHN5c3N0YXQgdmVyc2lvbiA5LjEuMiBieSBTZWJhc3RpZW4gR29kYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hcmVrIFBvbGFjZWsgPG1tcG9sYWNla0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgSU9TVEFUCisvL2NvbmZpZzoJYm9vbCAiaW9zdGF0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJlcG9ydCBDUFUgYW5kIEkvTyBzdGF0aXN0aWNzCisKKy8vYXBwbGV0OklGX0lPU1RBVChBUFBMRVQoaW9zdGF0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfSU9TVEFUKSArPSBpb3N0YXQubworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAgLyogc3RydWN0IHV0c25hbWUgKi8KKworLy8jZGVmaW5lIGRlYnVnKGZtdCwgLi4uKSBmcHJpbnRmKHN0ZGVyciwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZGVidWcoZm10LCAuLi4pICgodm9pZCkwKQorCisjZGVmaW5lIE1BWF9ERVZJQ0VfTkFNRSAxMgorI2RlZmluZSBNQVhfREVWSUNFX05BTUVfU1RSICIxMiIKKworI2lmIDEKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGNwdXRpbWVfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGljcHV0aW1lX3Q7CisjIGRlZmluZSBGTVRfREFUQSAibGwiCisjIGRlZmluZSBDUFVUSU1FX01BWCAofjBVTEwpCisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNwdXRpbWVfdDsKK3R5cGVkZWYgbG9uZyBpY3B1dGltZV90OworIyBkZWZpbmUgRk1UX0RBVEEgImwiCisjIGRlZmluZSBDUFVUSU1FX01BWCAofjBVTCkKKyNlbmRpZgorCitlbnVtIHsKKwlTVEFUU19DUFVfVVNFUiwKKwlTVEFUU19DUFVfTklDRSwKKwlTVEFUU19DUFVfU1lTVEVNLAorCVNUQVRTX0NQVV9JRExFLAorCVNUQVRTX0NQVV9JT1dBSVQsCisJU1RBVFNfQ1BVX0lSUSwKKwlTVEFUU19DUFVfU09GVElSUSwKKwlTVEFUU19DUFVfU1RFQUwsCisJU1RBVFNfQ1BVX0dVRVNULAorCisJR0xPQkFMX1VQVElNRSwKKwlTTVBfVVBUSU1FLAorCisJTl9TVEFUU19DUFUsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJY3B1dGltZV90IHZlY3RvcltOX1NUQVRTX0NQVV07Cit9IHN0YXRzX2NwdV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RhdHNfY3B1X3QgKnByZXY7CisJc3RhdHNfY3B1X3QgKmN1cnI7CisJY3B1dGltZV90IGl0djsKK30gc3RhdHNfY3B1X3BhaXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbG9uZyByZF9zZWN0b3JzOworCXVuc2lnbmVkIGxvbmcgbG9uZyB3cl9zZWN0b3JzOworCXVuc2lnbmVkIGxvbmcgcmRfb3BzOworCXVuc2lnbmVkIGxvbmcgd3Jfb3BzOworfSBzdGF0c19kZXZfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCBzdGF0c19kZXYgeworCXN0cnVjdCBzdGF0c19kZXYgKm5leHQ7CisJY2hhciBkbmFtZVtNQVhfREVWSUNFX05BTUUgKyAxXTsKKwlzdGF0c19kZXZfZGF0YV90IHByZXZfZGF0YTsKKwlzdGF0c19kZXZfZGF0YV90IGN1cnJfZGF0YTsKK30gc3RhdHNfZGV2X3Q7CisKKy8qIEdsb2JhbHMuIFNvcnQgYnkgc2l6ZSBhbmQgYWNjZXNzIGZyZXF1ZW5jeS4gKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwlzbWFsbGludCBzaG93X2FsbDsKKwl1bnNpZ25lZCB0b3RhbF9jcHVzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBDUFVzICovCisJdW5zaWduZWQgY2xrX3RjazsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2xvY2sgdGlja3MgcGVyIHNlY29uZCAqLworCWxsaXN0X3QgKmRldl9uYW1lX2xpc3Q7ICAgICAgICAgLyogTGlzdCBvZiBkZXZpY2VzIGVudGVyZWQgb24gdGhlIGNvbW1hbmQgbGluZSAqLworCXN0YXRzX2Rldl90ICpzdGF0c19kZXZfbGlzdDsKKwlzdHJ1Y3QgdG0gdG10aW1lOworCXN0cnVjdCB7CisJCWNvbnN0IGNoYXIgKnN0cjsKKwkJdW5zaWduZWQgZGl2OworCX0gdW5pdDsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlHLnVuaXQuc3RyID0gIkJsayI7IFwKKwlHLnVuaXQuZGl2ID0gMTsgXAorfSB3aGlsZSAoMCkKKworLyogTXVzdCBtYXRjaCBvcHRpb24gc3RyaW5nISAqLworZW51bSB7CisJT1BUX2MgPSAxIDw8IDAsCisJT1BUX2QgPSAxIDw8IDEsCisJT1BUX3QgPSAxIDw8IDIsCisJT1BUX3ogPSAxIDw8IDMsCisJT1BUX2sgPSAxIDw8IDQsCisJT1BUX20gPSAxIDw8IDUsCit9OworCitzdGF0aWMgQUxXQVlTX0lOTElORSB1bnNpZ25lZCBnZXRfdXNlcl9oeih2b2lkKQoreworCXJldHVybiBzeXNjb25mKF9TQ19DTEtfVENLKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IHRoaXNfaXNfc21wKHZvaWQpCit7CisJcmV0dXJuIChHLnRvdGFsX2NwdXMgPiAxKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVhZGVyKHZvaWQpCit7CisJY2hhciBidWZbMzJdOworCXN0cnVjdCB1dHNuYW1lIHV0czsKKworCXVuYW1lKCZ1dHMpOyAvKiBuZXZlciBmYWlscyAqLworCisJLyogRGF0ZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlICovCisJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiV4IiwgJkcudG10aW1lKTsKKworCXByaW50ZigiJXMgJXMgKCVzKSBcdCVzIFx0XyVzX1x0KCV1IENQVSlcblxuIiwKKwkJCXV0cy5zeXNuYW1lLCB1dHMucmVsZWFzZSwgdXRzLm5vZGVuYW1lLAorCQkJYnVmLCB1dHMubWFjaGluZSwgRy50b3RhbF9jcHVzKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2xvY2FsdGltZShzdHJ1Y3QgdG0gKnB0bSkKK3sKKwl0aW1lX3QgdGltZXI7CisJdGltZSgmdGltZXIpOworCWxvY2FsdGltZV9yKCZ0aW1lciwgcHRtKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdGltZXN0YW1wKHZvaWQpCit7CisJY2hhciBidWZbNjRdOworCS8qICV4OiBkYXRlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUgKi8KKwkvKiAlWDogdGltZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlICovCisJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiV4ICVYIiwgJkcudG10aW1lKTsKKwlwcmludGYoIiVzXG4iLCBidWYpOworfQorCitzdGF0aWMgY3B1dGltZV90IGdldF9zbXBfdXB0aW1lKHZvaWQpCit7CisJRklMRSAqZnA7CisJdW5zaWduZWQgbG9uZyBzZWMsIGRlYzsKKworCWZwID0geGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy91cHRpbWUiKTsKKworCWlmIChmc2NhbmYoZnAsICIlbHUuJWx1IiwgJnNlYywgJmRlYykgIT0gMikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJyVzJyIsICIvcHJvYy91cHRpbWUiKTsKKworCWZjbG9zZShmcCk7CisKKwlyZXR1cm4gKGNwdXRpbWVfdClzZWMgKiBHLmNsa190Y2sgKyBkZWMgKiBHLmNsa190Y2sgLyAxMDA7Cit9CisKKy8qIEZldGNoIENQVSBzdGF0aXN0aWNzIGZyb20gL3Byb2Mvc3RhdCAqLworc3RhdGljIHZvaWQgZ2V0X2NwdV9zdGF0aXN0aWNzKHN0YXRzX2NwdV90ICpzYykKK3sKKwlGSUxFICpmcDsKKwljaGFyIGJ1ZlsxMDI0XTsKKworCWZwID0geGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9zdGF0Iik7CisKKwltZW1zZXQoc2MsIDAsIHNpemVvZigqc2MpKTsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJaW50IGk7CisJCWNoYXIgKmlidWY7CisKKwkJLyogRG9lcyB0aGUgbGluZSBzdGFydCB3aXRoICJjcHUgIj8gKi8KKwkJaWYgKCFzdGFydHNfd2l0aF9jcHUoYnVmKSB8fCBidWZbM10gIT0gJyAnKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpYnVmID0gYnVmICsgNDsKKwkJZm9yIChpID0gU1RBVFNfQ1BVX1VTRVI7IGkgPD0gU1RBVFNfQ1BVX0dVRVNUOyBpKyspIHsKKwkJCWlidWYgPSBza2lwX3doaXRlc3BhY2UoaWJ1Zik7CisJCQlzc2NhbmYoaWJ1ZiwgIiUiRk1UX0RBVEEidSIsICZzYy0+dmVjdG9yW2ldKTsKKwkJCWlmIChpICE9IFNUQVRTX0NQVV9HVUVTVCkgeworCQkJCXNjLT52ZWN0b3JbR0xPQkFMX1VQVElNRV0gKz0gc2MtPnZlY3RvcltpXTsKKwkJCX0KKwkJCWlidWYgPSBza2lwX25vbl93aGl0ZXNwYWNlKGlidWYpOworCQl9CisJCWJyZWFrOworCX0KKworCWlmICh0aGlzX2lzX3NtcCgpKSB7CisJCXNjLT52ZWN0b3JbU01QX1VQVElNRV0gPSBnZXRfc21wX3VwdGltZSgpOworCX0KKworCWZjbG9zZShmcCk7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGNwdXRpbWVfdCBnZXRfaW50ZXJ2YWwoY3B1dGltZV90IG9sZCwgY3B1dGltZV90IG5ldykKK3sKKwljcHV0aW1lX3QgaXR2ID0gbmV3IC0gb2xkOworCisJcmV0dXJuIChpdHYgPT0gMCkgPyAxIDogaXR2OworfQorCisjaWYgQ1BVVElNRV9NQVggPiAweGZmZmZmZmZmCisvKgorICogSGFuZGxlIG92ZXJmbG93IGNvbmRpdGlvbnMgcHJvcGVybHkgZm9yIGNvdW50ZXJzIHdoaWNoIGNhbiBoYXZlCisgKiBsZXNzIGJpdHMgdGhhbiBjcHV0aW1lX3QsIGRlcGVuZGluZyBvbiB0aGUga2VybmVsIHZlcnNpb24uCisgKi8KKy8qIFN1cnByaXNpbmdseSwgb24gMzJiaXQgaW5saW5pbmcgaXMgYSBzaXplIHdpbiAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgY3B1dGltZV90IG92ZXJmbG93X3NhZmVfc3ViKGNwdXRpbWVfdCBwcmV2LCBjcHV0aW1lX3QgY3VycikKK3sKKwljcHV0aW1lX3QgdiA9IGN1cnIgLSBwcmV2OworCisJaWYgKChpY3B1dGltZV90KXYgPCAwICAgICAvKiBjdXJyIDwgcHJldiAtIGNvdW50ZXIgb3ZlcmZsb3c/ICovCisJICYmIHByZXYgPD0gMHhmZmZmZmZmZiAvKiBrZXJuZWwgdXNlcyAzMmJpdCB2YWx1ZSBmb3IgdGhlIGNvdW50ZXI/ICovCisJKSB7CisJCS8qIEFkZCAzM3RoIGJpdCBzZXQgdG8gMSB0byBjdXJyLCBjb21wZW5zYXRpbmcgZm9yIHRoZSBvdmVyZmxvdyAqLworCQkvKiBkb3VibGUgc2hpZnQgZGVmZWF0cyAid2FybmluZzogbGVmdCBzaGlmdCBjb3VudCA+PSB3aWR0aCBvZiB0eXBlIiAqLworCQl2ICs9ICgoY3B1dGltZV90KTEgPDwgMTYpIDw8IDE2OworCX0KKwlyZXR1cm4gdjsKK30KKyNlbHNlCitzdGF0aWMgQUxXQVlTX0lOTElORSBjcHV0aW1lX3Qgb3ZlcmZsb3dfc2FmZV9zdWIoY3B1dGltZV90IHByZXYsIGNwdXRpbWVfdCBjdXJyKQoreworCXJldHVybiBjdXJyIC0gcHJldjsKK30KKyNlbmRpZgorCitzdGF0aWMgZG91YmxlIHBlcmNlbnRfdmFsdWUoY3B1dGltZV90IHByZXYsIGNwdXRpbWVfdCBjdXJyLCBjcHV0aW1lX3QgaXR2KQoreworCXJldHVybiAoKGRvdWJsZSlvdmVyZmxvd19zYWZlX3N1YihwcmV2LCBjdXJyKSkgLyBpdHYgKiAxMDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRzX2NwdV9zdHJ1Y3Qoc3RhdHNfY3B1X3BhaXJfdCAqc3RhdHMpCit7CisJY3B1dGltZV90ICpwID0gc3RhdHMtPnByZXYtPnZlY3RvcjsKKwljcHV0aW1lX3QgKmMgPSBzdGF0cy0+Y3Vyci0+dmVjdG9yOworCXByaW50ZigiICAgICAgICAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZlxuIiwKKwkJcGVyY2VudF92YWx1ZShwW1NUQVRTX0NQVV9VU0VSXSAgLCBjW1NUQVRTX0NQVV9VU0VSXSAgLCBzdGF0cy0+aXR2KSwKKwkJcGVyY2VudF92YWx1ZShwW1NUQVRTX0NQVV9OSUNFXSAgLCBjW1NUQVRTX0NQVV9OSUNFXSAgLCBzdGF0cy0+aXR2KSwKKwkJcGVyY2VudF92YWx1ZShwW1NUQVRTX0NQVV9TWVNURU1dICsgcFtTVEFUU19DUFVfU09GVElSUV0gKyBwW1NUQVRTX0NQVV9JUlFdLAorCQkJY1tTVEFUU19DUFVfU1lTVEVNXSArIGNbU1RBVFNfQ1BVX1NPRlRJUlFdICsgY1tTVEFUU19DUFVfSVJRXSwgc3RhdHMtPml0diksCisJCXBlcmNlbnRfdmFsdWUocFtTVEFUU19DUFVfSU9XQUlUXSwgY1tTVEFUU19DUFVfSU9XQUlUXSwgc3RhdHMtPml0diksCisJCXBlcmNlbnRfdmFsdWUocFtTVEFUU19DUFVfU1RFQUxdICwgY1tTVEFUU19DUFVfU1RFQUxdICwgc3RhdHMtPml0diksCisJCXBlcmNlbnRfdmFsdWUocFtTVEFUU19DUFVfSURMRV0gICwgY1tTVEFUU19DUFVfSURMRV0gICwgc3RhdHMtPml0dikKKwkpOworfQorCitzdGF0aWMgdm9pZCBjcHVfcmVwb3J0KHN0YXRzX2NwdV9wYWlyX3QgKnN0YXRzKQoreworCS8qIEFsd2F5cyBwcmludCBhIGhlYWRlciAqLworCXB1dHMoImF2Zy1jcHU6ICAldXNlciAgICVuaWNlICVzeXN0ZW0gJWlvd2FpdCAgJXN0ZWFsICAgJWlkbGUiKTsKKworCS8qIFByaW50IGN1cnJlbnQgc3RhdGlzdGljcyAqLworCXByaW50X3N0YXRzX2NwdV9zdHJ1Y3Qoc3RhdHMpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0c19kZXZfc3RydWN0KHN0YXRzX2Rldl90ICpzdGF0c19kZXYsIGNwdXRpbWVfdCBpdHYpCit7CisJc3RhdHNfZGV2X2RhdGFfdCAqcCA9ICZzdGF0c19kZXYtPnByZXZfZGF0YTsKKwlzdGF0c19kZXZfZGF0YV90ICpjID0gJnN0YXRzX2Rldi0+Y3Vycl9kYXRhOworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3opCisJCWlmIChwLT5yZF9vcHMgPT0gYy0+cmRfb3BzICYmIHAtPndyX29wcyA9PSBjLT53cl9vcHMpCisJCQlyZXR1cm47CisKKwlwcmludGYoIiUtMTNzICU4LjJmICUxMi4yZiAlMTIuMmYgJTEwbGx1ICUxMGxsdVxuIiwKKwkJc3RhdHNfZGV2LT5kbmFtZSwKKwkJcGVyY2VudF92YWx1ZShwLT5yZF9vcHMgKyBwLT53cl9vcHMsIGMtPnJkX29wcyArIGMtPndyX29wcywgaXR2KSwKKwkJcGVyY2VudF92YWx1ZShwLT5yZF9zZWN0b3JzLCBjLT5yZF9zZWN0b3JzLCBpdHYpIC8gRy51bml0LmRpdiwKKwkJcGVyY2VudF92YWx1ZShwLT53cl9zZWN0b3JzLCBjLT53cl9zZWN0b3JzLCBpdHYpIC8gRy51bml0LmRpdiwKKwkJKGMtPnJkX3NlY3RvcnMgLSBwLT5yZF9zZWN0b3JzKSAvIEcudW5pdC5kaXYsCisJCShjLT53cl9zZWN0b3JzIC0gcC0+d3Jfc2VjdG9ycykgLyBHLnVuaXQuZGl2CisJKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZGV2c3RhdF9oZWFkZXIodm9pZCkKK3sKKwlwcmludGYoIkRldmljZTolMTVzJTZzJXMvcyU2cyVzL3MlNnMlcyU2cyVzXG4iLAorCQkidHBzIiwKKwkJRy51bml0LnN0ciwgIl9yZWFkIiwgRy51bml0LnN0ciwgIl93cnRuIiwKKwkJRy51bml0LnN0ciwgIl9yZWFkIiwgRy51bml0LnN0ciwgIl93cnRuIgorCSk7Cit9CisKKy8qCisgKiBJcyBpbnB1dCBwYXJ0aXRpb24gb2YgZm9ybWF0IFtzZGFOXT8KKyAqLworc3RhdGljIGludCBpc19wYXJ0aXRpb24oY29uc3QgY2hhciAqZGV2KQoreworCS8qIE9rLCB0aGlzIGlzIG5haXZlLi4uICovCisJcmV0dXJuICgoZGV2WzBdIC0gJ3MnKSB8IChkZXZbMV0gLSAnZCcpIHwgKGRldlsyXSAtICdhJykpID09IDAgJiYgaXNkaWdpdChkZXZbM10pOworfQorCitzdGF0aWMgc3RhdHNfZGV2X3QgKnN0YXRzX2Rldl9maW5kX29yX25ldyhjb25zdCBjaGFyICpkZXZfbmFtZSkKK3sKKwlzdGF0c19kZXZfdCAqKmN1cnIgPSAmRy5zdGF0c19kZXZfbGlzdDsKKworCXdoaWxlICgqY3VyciAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoKCpjdXJyKS0+ZG5hbWUsIGRldl9uYW1lKSA9PSAwKQorCQkJcmV0dXJuICpjdXJyOworCQljdXJyID0gJigqY3VyciktPm5leHQ7CisJfQorCisJKmN1cnIgPSB4emFsbG9jKHNpemVvZihzdGF0c19kZXZfdCkpOworCXN0cm5jcHkoKCpjdXJyKS0+ZG5hbWUsIGRldl9uYW1lLCBNQVhfREVWSUNFX05BTUUpOworCXJldHVybiAqY3VycjsKK30KKworc3RhdGljIHZvaWQgc3RhdHNfZGV2X2ZyZWUoc3RhdHNfZGV2X3QgKnN0YXRzX2RldikKK3sKKwlpZiAoc3RhdHNfZGV2KSB7CisJCXN0YXRzX2Rldl9mcmVlKHN0YXRzX2Rldi0+bmV4dCk7CisJCWZyZWUoc3RhdHNfZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2Rpc2tfc3RhdGlzdGljcyhjcHV0aW1lX3QgaXR2KQoreworCWNoYXIgYnVmWzEyOF07CisJY2hhciBkZXZfbmFtZVtNQVhfREVWSUNFX05BTUUgKyAxXTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmRfc2VjX29yX2R1bW15OworCXVuc2lnbmVkIGxvbmcgbG9uZyB3cl9zZWNfb3JfZHVtbXk7CisJc3RhdHNfZGV2X2RhdGFfdCAqY3Vycl9kYXRhOworCXN0YXRzX2Rldl90ICpzdGF0c19kZXY7CisJRklMRSAqZnA7CisJaW50IHJjOworCisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL2Rpc2tzdGF0cyIpOworCS8qIFJlYWQgYW5kIHBvc3NpYmx5IHByaW50IHN0YXRzIGZyb20gL3Byb2MvZGlza3N0YXRzICovCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQlzc2NhbmYoYnVmLCAiJSpzICUqcyAlIk1BWF9ERVZJQ0VfTkFNRV9TVFIicyIsIGRldl9uYW1lKTsKKwkJaWYgKEcuZGV2X25hbWVfbGlzdCkgeworCQkJLyogSXMgZGV2aWNlIG5hbWUgaW4gbGlzdD8gKi8KKwkJCWlmICghbGxpc3RfZmluZF9zdHIoRy5kZXZfbmFtZV9saXN0LCBkZXZfbmFtZSkpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoaXNfcGFydGl0aW9uKGRldl9uYW1lKSkgeworCQkJY29udGludWU7CisJCX0KKworCQlzdGF0c19kZXYgPSBzdGF0c19kZXZfZmluZF9vcl9uZXcoZGV2X25hbWUpOworCQljdXJyX2RhdGEgPSAmc3RhdHNfZGV2LT5jdXJyX2RhdGE7CisKKwkJcmMgPSBzc2NhbmYoYnVmLCAiJSpzICUqcyAlKnMgJWx1ICVsbHUgJWxsdSAlbGx1ICVsdSAlKnMgJWxsdSIsCisJCQkmY3Vycl9kYXRhLT5yZF9vcHMsCisJCQkmcmRfc2VjX29yX2R1bW15LAorCQkJJmN1cnJfZGF0YS0+cmRfc2VjdG9ycywKKwkJCSZ3cl9zZWNfb3JfZHVtbXksCisJCQkmY3Vycl9kYXRhLT53cl9vcHMsCisJCQkmY3Vycl9kYXRhLT53cl9zZWN0b3JzKTsKKwkJaWYgKHJjICE9IDYpIHsKKwkJCWN1cnJfZGF0YS0+cmRfc2VjdG9ycyA9IHJkX3NlY19vcl9kdW1teTsKKwkJCWN1cnJfZGF0YS0+d3Jfc2VjdG9ycyA9IHdyX3NlY19vcl9kdW1teTsKKwkJCS8vY3Vycl9kYXRhLT5yZF9vcHMgPSA7CisJCQljdXJyX2RhdGEtPndyX29wcyA9ICh1bnNpZ25lZCBsb25nKWN1cnJfZGF0YS0+cmRfc2VjdG9yczsKKwkJfQorCisJCWlmICghRy5kZXZfbmFtZV9saXN0IC8qIFVzZXIgZGlkbid0IHNwZWNpZnkgZGV2aWNlICovCisJCSAmJiAhRy5zaG93X2FsbAorCQkgJiYgY3Vycl9kYXRhLT5yZF9vcHMgPT0gMAorCQkgJiYgY3Vycl9kYXRhLT53cl9vcHMgPT0gMAorCQkpIHsKKwkJCS8qIERvbid0IHByaW50IHVudXNlZCBkZXZpY2UgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUHJpbnQgY3VycmVudCBzdGF0aXN0aWNzICovCisJCXByaW50X3N0YXRzX2Rldl9zdHJ1Y3Qoc3RhdHNfZGV2LCBpdHYpOworCQlzdGF0c19kZXYtPnByZXZfZGF0YSA9ICpjdXJyX2RhdGE7CisJfQorCisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQgZGV2X3JlcG9ydChjcHV0aW1lX3QgaXR2KQoreworCS8qIEFsd2F5cyBwcmludCBhIGhlYWRlciAqLworCXByaW50X2RldnN0YXRfaGVhZGVyKCk7CisKKwkvKiBGZXRjaCBjdXJyZW50IGRpc2sgc3RhdGlzdGljcyAqLworCWRvX2Rpc2tfc3RhdGlzdGljcyhpdHYpOworfQorCisvL3VzYWdlOiNkZWZpbmUgaW9zdGF0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNdIFstZF0gWy10XSBbLXpdIFsta3wtbV0gW0FMTHxCTE9DS0RFVi4uLl0gW0lOVEVSVkFMIFtDT1VOVF1dIgorLy91c2FnZTojZGVmaW5lIGlvc3RhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlcG9ydCBDUFUgYW5kIEkvTyBzdGF0aXN0aWNzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVNob3cgQ1BVIHV0aWxpemF0aW9uIgorLy91c2FnZTogICAgICJcbgktZAlTaG93IGRldmljZSB1dGlsaXphdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJUHJpbnQgY3VycmVudCB0aW1lIgorLy91c2FnZTogICAgICJcbgkteglPbWl0IGRldmljZXMgd2l0aCBubyBhY3Rpdml0eSIKKy8vdXNhZ2U6ICAgICAiXG4JLWsJVXNlIGtiL3MiCisvL3VzYWdlOiAgICAgIlxuCS1tCVVzZSBNYi9zIgorCitpbnQgaW9zdGF0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpb3N0YXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBvcHQ7CisJdW5zaWduZWQgaW50ZXJ2YWw7CisJaW50IGNvdW50OworCXN0YXRzX2NwdV90IHN0YXRzX2RhdGFbMl07CisJc21hbGxpbnQgY3VycmVudF9zdGF0czsKKworCUlOSVRfRygpOworCisJbWVtc2V0KCZzdGF0c19kYXRhLCAwLCBzaXplb2Yoc3RhdHNfZGF0YSkpOworCisJLyogR2V0IG51bWJlciBvZiBjbG9jayB0aWNrcyBwZXIgc2VjICovCisJRy5jbGtfdGNrID0gZ2V0X3VzZXJfaHooKTsKKworCS8qIERldGVybWluZSBudW1iZXIgb2YgQ1BVcyAqLworCUcudG90YWxfY3B1cyA9IGdldF9jcHVfY291bnQoKTsKKwlpZiAoRy50b3RhbF9jcHVzID09IDApCisJCUcudG90YWxfY3B1cyA9IDE7CisKKwkvKiBQYXJzZSBhbmQgcHJvY2VzcyBhcmd1bWVudHMgKi8KKwkvKiAtayBhbmQgLW0gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gImstLW06bS0tayI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNkdHprbSIpOworCWlmICghKG9wdCAmIChPUFRfYyArIE9QVF9kKSkpCisJCS8qIERlZmF1bHQgaXMgLWNkICovCisJCW9wdCB8PSBPUFRfYyArIE9QVF9kOworCisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBTdG9yZSBkZXZpY2UgbmFtZXMgaW50byBkZXZpY2UgbGlzdCAqLworCXdoaWxlICgqYXJndiAmJiAhaXNkaWdpdCgqYXJndlswXSkpIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgIkFMTCIpICE9IDApIHsKKwkJCS8qIElmIG5vdCBBTEwsIHNhdmUgZGV2aWNlIG5hbWUgKi8KKwkJCWNoYXIgKmRldl9uYW1lID0gc2tpcF9kZXZfcGZ4KCphcmd2KTsKKwkJCWlmICghbGxpc3RfZmluZF9zdHIoRy5kZXZfbmFtZV9saXN0LCBkZXZfbmFtZSkpIHsKKwkJCQlsbGlzdF9hZGRfdG8oJkcuZGV2X25hbWVfbGlzdCwgZGV2X25hbWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJRy5zaG93X2FsbCA9IDE7CisJCX0KKwkJYXJndisrOworCX0KKworCWludGVydmFsID0gMDsKKwljb3VudCA9IDE7CisJaWYgKCphcmd2KSB7CisJCS8qIEdldCBpbnRlcnZhbCAqLworCQlpbnRlcnZhbCA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwkJY291bnQgPSAoaW50ZXJ2YWwgIT0gMCA/IC0xIDogMSk7CisJCWFyZ3YrKzsKKwkJaWYgKCphcmd2KQorCQkJLyogR2V0IGNvdW50IHZhbHVlICovCisJCQljb3VudCA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX20pIHsKKwkJRy51bml0LnN0ciA9ICIgTUIiOworCQlHLnVuaXQuZGl2ID0gMjA0ODsKKwl9CisKKwlpZiAob3B0ICYgT1BUX2spIHsKKwkJRy51bml0LnN0ciA9ICIga0IiOworCQlHLnVuaXQuZGl2ID0gMjsKKwl9CisKKwlnZXRfbG9jYWx0aW1lKCZHLnRtdGltZSk7CisKKwkvKiBEaXNwbGF5IGhlYWRlciAqLworCXByaW50X2hlYWRlcigpOworCisJY3VycmVudF9zdGF0cyA9IDA7CisJLyogTWFpbiBsb29wICovCisJZm9yICg7OykgeworCQlzdGF0c19jcHVfcGFpcl90IHN0YXRzOworCisJCXN0YXRzLnByZXYgPSAmc3RhdHNfZGF0YVtjdXJyZW50X3N0YXRzIF4gMV07CisJCXN0YXRzLmN1cnIgPSAmc3RhdHNfZGF0YVtjdXJyZW50X3N0YXRzXTsKKworCQkvKiBGaWxsIHRoZSB0aW1lIHN0cnVjdHVyZSAqLworCQlnZXRfbG9jYWx0aW1lKCZHLnRtdGltZSk7CisKKwkJLyogRmV0Y2ggY3VycmVudCBDUFUgc3RhdGlzdGljcyAqLworCQlnZXRfY3B1X3N0YXRpc3RpY3Moc3RhdHMuY3Vycik7CisKKwkJLyogR2V0IGludGVydmFsICovCisJCXN0YXRzLml0diA9IGdldF9pbnRlcnZhbCgKKwkJCXN0YXRzLnByZXYtPnZlY3RvcltHTE9CQUxfVVBUSU1FXSwKKwkJCXN0YXRzLmN1cnItPnZlY3RvcltHTE9CQUxfVVBUSU1FXQorCQkpOworCisJCWlmIChvcHQgJiBPUFRfdCkKKwkJCXByaW50X3RpbWVzdGFtcCgpOworCisJCWlmIChvcHQgJiBPUFRfYykgeworCQkJY3B1X3JlcG9ydCgmc3RhdHMpOworCQkJaWYgKG9wdCAmIE9QVF9kKQorCQkJCS8qIFNlcGFyYXRlIG91dHB1dHMgYnkgYSBuZXdsaW5lICovCisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCisJCWlmIChvcHQgJiBPUFRfZCkgeworCQkJaWYgKHRoaXNfaXNfc21wKCkpIHsKKwkJCQlzdGF0cy5pdHYgPSBnZXRfaW50ZXJ2YWwoCisJCQkJCXN0YXRzLnByZXYtPnZlY3RvcltTTVBfVVBUSU1FXSwKKwkJCQkJc3RhdHMuY3Vyci0+dmVjdG9yW1NNUF9VUFRJTUVdCisJCQkJKTsKKwkJCX0KKwkJCWRldl9yZXBvcnQoc3RhdHMuaXR2KTsKKwkJfQorCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJaWYgKC0tY291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIFN3YXAgc3RhdHMgKi8KKwkJY3VycmVudF9zdGF0cyBePSAxOworCisJCXNsZWVwKGludGVydmFsKTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJbGxpc3RfZnJlZShHLmRldl9uYW1lX2xpc3QsIE5VTEwpOworCQlzdGF0c19kZXZfZnJlZShHLnN0YXRzX2Rldl9saXN0KTsKKwkJZnJlZSgmRyk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9raWxsLmMgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMva2lsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGU1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMva2lsbC5jCkBAIC0wLDAgKzEsMjc5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGtpbGwva2lsbGFsbFs1XSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUga2lsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1sXSBbLVNJR10gUElELi4uIgorLy91c2FnZTojZGVmaW5lIGtpbGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIGEgc2lnbmFsIChkZWZhdWx0OiBURVJNKSB0byBnaXZlbiBQSURzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgYWxsIHNpZ25hbCBuYW1lcyBhbmQgbnVtYmVycyIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMgU0lHCVlldCBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIFNJRyIgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUga2lsbF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwcyB8IGdyZXAgYXBhY2hlXG4iCisvL3VzYWdlOiAgICAgICAiMjUyIHJvb3QgICAgIHJvb3QgICAgIFMgW2FwYWNoZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIyNjMgd3d3LWRhdGEgd3d3LWRhdGEgUyBbYXBhY2hlXVxuIgorLy91c2FnZTogICAgICAgIjI2NCB3d3ctZGF0YSB3d3ctZGF0YSBTIFthcGFjaGVdXG4iCisvL3VzYWdlOiAgICAgICAiMjY1IHd3dy1kYXRhIHd3dy1kYXRhIFMgW2FwYWNoZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIyNjYgd3d3LWRhdGEgd3d3LWRhdGEgUyBbYXBhY2hlXVxuIgorLy91c2FnZTogICAgICAgIjI2NyB3d3ctZGF0YSB3d3ctZGF0YSBTIFthcGFjaGVdXG4iCisvL3VzYWdlOiAgICAgICAiJCBraWxsIDI1MlxuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBraWxsYWxsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxdIFstcV0gWy1TSUddIFBST0NFU1NfTkFNRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBraWxsYWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBhIHNpZ25hbCAoZGVmYXVsdDogVEVSTSkgdG8gZ2l2ZW4gcHJvY2Vzc2VzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgYWxsIHNpZ25hbCBuYW1lcyBhbmQgbnVtYmVycyIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMgU0lHCVlldCBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIFNJRyIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLXEJRG9uJ3QgY29tcGxhaW4gaWYgbm8gcHJvY2Vzc2VzIHdlcmUga2lsbGVkIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBraWxsYWxsX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGtpbGxhbGwgYXBhY2hlXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGtpbGxhbGw1X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxdIFstU0lHXSBbLW8gUElEXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBraWxsYWxsNV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgYSBzaWduYWwgKGRlZmF1bHQ6IFRFUk0pIHRvIGFsbCBwcm9jZXNzZXMgb3V0c2lkZSBjdXJyZW50IHNlc3Npb25cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBhbGwgc2lnbmFsIG5hbWVzIGFuZCBudW1iZXJzIgorLy91c2FnZTogICAgICJcbgktbyBQSUQJRG9uJ3Qgc2lnbmFsIHRoaXMgUElEIgorLyogLy91c2FnZTogICJcbgktcyBTSUcJWWV0IGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgU0lHIiAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogTm90ZToga2lsbF9tYWluIGlzIGRpcmVjdGx5IGNhbGxlZCBmcm9tIHNoZWxsIGluIG9yZGVyIHRvIGltcGxlbWVudAorICoga2lsbCBidWlsdC1pbi4gU2hlbGwgc3Vic3RpdHV0ZXMgam9iIGlkcyB3aXRoIHByb2Nlc3MgZ3JvdXBzIGZpcnN0LgorICoKKyAqIFRoaXMgYnJpbmdzIHNvbWUgY29tcGxpY2F0aW9uczoKKyAqCisgKiArIHdlIGNhbid0IHVzZSB4ZnVuYyBoZXJlCisgKiArIHdlIGNhbid0IHVzZSBhcHBsZXRfbmFtZQorICogKyB3ZSBjYW4ndCB1c2UgYmJfc2hvd191c2FnZQorICogKEFib3ZlIGRvZXNuJ3QgYXBwbHkgZm9yIGtpbGxhbGxbNV0gY2FzZXMpCisgKgorICoga2lsbCAlbiBnZXRzIHRyYW5zbGF0ZWQgaW50byBraWxsICcgLTxwcm9jZXNzIGdyb3VwPicgYnkgc2hlbGwgKG5vdGUgc3BhY2UhKQorICogVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGgga2lsbCAtOSAuLi4gc3ludGF4CisgKi8KKworaW50IGtpbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYXJnOworCXBpZF90IHBpZDsKKwlpbnQgc2lnbm8gPSBTSUdURVJNLCBlcnJvcnMgPSAwLCBxdWlldCA9IDA7CisjaWYgIUVOQUJMRV9LSUxMQUxMICYmICFFTkFCTEVfS0lMTEFMTDUKKyNkZWZpbmUga2lsbGFsbCAwCisjZGVmaW5lIGtpbGxhbGw1IDAKKyNlbHNlCisvKiBIb3cgdG8gZGV0ZXJtaW5lIHdobyB3ZSBhcmU/IGZpbmQgM3JkIGNoYXIgZnJvbSB0aGUgZW5kOgorICoga2lsbCwga2lsbGFsbCwga2lsbGFsbDUKKyAqICBeaSAgICAgICBeYSAgICAgICAgXmwgIC0gaXQncyB1bmlxdWUKKyAqIChjaGVja2luZyBmcm9tIHRoZSBzdGFydCBpcyBjb21wbGljYXRlZCBieSAvYmluL2tpbGwuLi4gY2FzZSkgKi8KKwljb25zdCBjaGFyIGNoYXIzID0gYXJndlswXVtzdHJsZW4oYXJndlswXSkgLSAzXTsKKyNkZWZpbmUga2lsbGFsbCAoRU5BQkxFX0tJTExBTEwgJiYgY2hhcjMgPT0gJ2EnKQorI2RlZmluZSBraWxsYWxsNSAoRU5BQkxFX0tJTExBTEw1ICYmIGNoYXIzID09ICdsJykKKyNlbmRpZgorCisJLyogUGFyc2UgYW55IG9wdGlvbnMgKi8KKwlhcmdjLS07CisJYXJnID0gKisrYXJndjsKKworCWlmIChhcmdjIDwgMSB8fCBhcmdbMF0gIT0gJy0nKSB7CisJCWdvdG8gZG9faXRfbm93OworCX0KKworCS8qIFRoZSAtbCBvcHRpb24sIHdoaWNoIHByaW50cyBvdXQgc2lnbmFsIG5hbWVzLgorCSAqIEludGVuZGVkIHVzYWdlIGluIHNoZWxsOgorCSAqIGVjaG8gIkRpZWQgb2YgU0lHYGtpbGwgLWwgJD9gIgorCSAqIFdlIHRyeSB0byBtaW1pYyB3aGF0IGtpbGwgZnJvbSBjb3JldXRpbHMtNi44IGRvZXMgKi8KKwlpZiAoYXJnWzFdID09ICdsJyAmJiBhcmdbMl0gPT0gJ1wwJykgeworCQlpZiAoYXJnYyA9PSAxKSB7CisJCQkvKiBQcmludCB0aGUgd2hvbGUgc2lnbmFsIGxpc3QgKi8KKwkJCXByaW50X3NpZ25hbWVzKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiAtbCA8c2lnIGxpc3Q+ICovCisJCXdoaWxlICgoYXJnID0gKisrYXJndikpIHsKKwkJCWlmIChpc2RpZ2l0KGFyZ1swXSkpIHsKKwkJCQlzaWdubyA9IGJiX3N0cnRvdShhcmcsIE5VTEwsIDEwKTsKKwkJCQlpZiAoZXJybm8pIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIHNpZ25hbCAnJXMnIiwgYXJnKTsKKwkJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQkJLyogRXhpdGNvZGVzID49IDB4ODAgYXJlIHRvIGJlIHRyZWF0ZWQKKwkJCQkgKiBhcyAia2lsbGVkIGJ5IHNpZ25hbCAoZXhpdGNvZGUgJiAweDdmKSIgKi8KKwkJCQlwdXRzKGdldF9zaWduYW1lKHNpZ25vICYgMHg3ZikpOworCQkJCS8qIFRPRE86ICdiYWQnIHNpZ25hbCMgLSBjb3JldXRpbHMgc2F5czoKKwkJCQkgKiBraWxsOiAxMjc6IGludmFsaWQgc2lnbmFsCisJCQkJICogd2UganVzdCBwcmludCAiMTI3IiBpbnN0ZWFkICovCisJCQl9IGVsc2UgeworCQkJCXNpZ25vID0gZ2V0X3NpZ251bShhcmcpOworCQkJCWlmIChzaWdubyA8IDApIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIHNpZ25hbCAnJXMnIiwgYXJnKTsKKwkJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQkJcHJpbnRmKCIlZFxuIiwgc2lnbm8pOworCQkJfQorCQl9CisJCS8qIElmIHRoZXkgc3BlY2lmaWVkIC1sLCB3ZSBhcmUgYWxsIGRvbmUgKi8KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBUaGUgLXEgcXVpZXQgb3B0aW9uICovCisJaWYgKGtpbGxhbGwgJiYgYXJnWzFdID09ICdxJyAmJiBhcmdbMl0gPT0gJ1wwJykgeworCQlxdWlldCA9IDE7CisJCWFyZyA9ICorK2FyZ3Y7CisJCWFyZ2MtLTsKKwkJaWYgKGFyZ2MgPCAxKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWdvdG8gZG9faXRfbm93OworCX0KKworCWFyZysrOyAvKiBza2lwICctJyAqLworCisJLyogLW8gUElEPyAoaWYgcHJlc2VudCwgaXQgYWx3YXlzIGlzIGF0IHRoZSBlbmQgb2YgY29tbWFuZCBsaW5lKSAqLworCWlmIChraWxsYWxsNSAmJiBhcmdbMF0gPT0gJ28nKQorCQlnb3RvIGRvX2l0X25vdzsKKworCWlmIChhcmdjID4gMSAmJiBhcmdbMF0gPT0gJ3MnICYmIGFyZ1sxXSA9PSAnXDAnKSB7IC8qIC1zIFNJRz8gKi8KKwkJYXJnYy0tOworCQlhcmcgPSAqKythcmd2OworCX0gLyogZWxzZSBpdCBtdXN0IGJlIC1TSUcgKi8KKwlzaWdubyA9IGdldF9zaWdudW0oYXJnKTsKKwlpZiAoc2lnbm8gPCAwKSB7IC8qIHx8IHNpZ25vID4gTUFYX1NJR05VTSA/ICovCisJCWJiX2Vycm9yX21zZygiYmFkIHNpZ25hbCBuYW1lICclcyciLCBhcmcpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKwlhcmcgPSAqKythcmd2OworCWFyZ2MtLTsKKworIGRvX2l0X25vdzoKKwlwaWQgPSBnZXRwaWQoKTsKKworCWlmIChraWxsYWxsNSkgeworCQlwaWRfdCBzaWQ7CisJCXByb2Nwc19zdGF0dXNfdCogcCA9IE5VTEw7CisJCWludCByZXQgPSAwOworCisJCS8qIEZpbmQgb3V0IG91ciBzZXNzaW9uIGlkICovCisJCXNpZCA9IGdldHNpZChwaWQpOworCQkvKiBTdG9wIGFsbCBwcm9jZXNzZXMgKi8KKwkJa2lsbCgtMSwgU0lHU1RPUCk7CisJCS8qIFNpZ25hbCBhbGwgcHJvY2Vzc2VzIGV4Y2VwdCB0aG9zZSBpbiBvdXIgc2Vzc2lvbiAqLworCQl3aGlsZSAoKHAgPSBwcm9jcHNfc2NhbihwLCBQU1NDQU5fUElEfFBTU0NBTl9TSUQpKSkgeworCQkJaW50IGk7CisKKwkJCWlmIChwLT5zaWQgPT0gKHVuc2lnbmVkKXNpZAorCQkJIHx8IHAtPnBpZCA9PSAodW5zaWduZWQpcGlkCisJCQkgfHwgcC0+cGlkID09IDEpCisJCQkJY29udGludWU7CisKKwkJCS8qIEFsbCByZW1haW5pbmcgYXJncyBtdXN0IGJlIC1vIFBJRCBvcHRpb25zLgorCQkJICogQ2hlY2sgcC0+cGlkIGFnYWluc3QgdGhlbS4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkJCQlwaWRfdCBvbWl0OworCisJCQkJYXJnID0gYXJndltpXTsKKwkJCQlpZiAoYXJnWzBdICE9ICctJyB8fCBhcmdbMV0gIT0gJ28nKSB7CisJCQkJCWJiX2Vycm9yX21zZygiYmFkIG9wdGlvbiAnJXMnIiwgYXJnKTsKKwkJCQkJcmV0ID0gMTsKKwkJCQkJZ290byByZXN1bWU7CisJCQkJfQorCQkJCWFyZyArPSAyOworCQkJCWlmICghYXJnWzBdICYmIGFyZ3ZbKytpXSkKKwkJCQkJYXJnID0gYXJndltpXTsKKwkJCQlvbWl0ID0gYmJfc3RydG9pKGFyZywgTlVMTCwgMTApOworCQkJCWlmIChlcnJubykgeworCQkJCQliYl9lcnJvcl9tc2coImludmFsaWQgbnVtYmVyICclcyciLCBhcmcpOworCQkJCQlyZXQgPSAxOworCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQl9CisJCQkJaWYgKHAtPnBpZCA9PSBvbWl0KQorCQkJCQlnb3RvIGRvbnRfa2lsbDsKKwkJCX0KKwkJCWtpbGwocC0+cGlkLCBzaWdubyk7CisgZG9udF9raWxsOiA7CisJCX0KKyByZXN1bWU6CisJCS8qIEFuZCBsZXQgdGhlbSBjb250aW51ZSAqLworCQlraWxsKC0xLCBTSUdDT05UKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBQaWQgb3IgbmFtZSBpcyByZXF1aXJlZCBmb3Iga2lsbC9raWxsYWxsICovCisJaWYgKGFyZ2MgPCAxKSB7CisJCWJiX2Vycm9yX21zZygieW91IG5lZWQgdG8gc3BlY2lmeSB3aG9tIHRvIGtpbGwiKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwlpZiAoa2lsbGFsbCkgeworCQkvKiBMb29rcyBsaWtlIHRoZXkgd2FudCB0byBkbyBhIGtpbGxhbGwuICBEbyB0aGF0ICovCisJCXdoaWxlIChhcmcpIHsKKwkJCXBpZF90KiBwaWRMaXN0OworCisJCQlwaWRMaXN0ID0gZmluZF9waWRfYnlfbmFtZShhcmcpOworCQkJaWYgKCpwaWRMaXN0ID09IDApIHsKKwkJCQllcnJvcnMrKzsKKwkJCQlpZiAoIXF1aWV0KQorCQkJCQliYl9lcnJvcl9tc2coIiVzOiBubyBwcm9jZXNzIGtpbGxlZCIsIGFyZyk7CisJCQl9IGVsc2UgeworCQkJCXBpZF90ICpwbDsKKworCQkJCWZvciAocGwgPSBwaWRMaXN0OyAqcGw7IHBsKyspIHsKKwkJCQkJaWYgKCpwbCA9PSBwaWQpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKGtpbGwoKnBsLCBzaWdubykgPT0gMCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQllcnJvcnMrKzsKKwkJCQkJaWYgKCFxdWlldCkKKwkJCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGtpbGwgcGlkICVkIiwgKGludCkqcGwpOworCQkJCX0KKwkJCX0KKwkJCWZyZWUocGlkTGlzdCk7CisJCQlhcmcgPSAqKythcmd2OworCQl9CisJCXJldHVybiBlcnJvcnM7CisJfQorCisJLyogTG9va3MgbGlrZSB0aGV5IHdhbnQgdG8gZG8gYSBraWxsLiBEbyB0aGF0ICovCisJd2hpbGUgKGFyZykgeworI2lmIEVOQUJMRV9BU0ggfHwgRU5BQkxFX0hVU0gKKwkJLyoKKwkJICogV2UgbmVlZCB0byBzdXBwb3J0IHNoZWxsJ3MgImhhY2sgZm9ybWF0cyIgb2YKKwkJICogIiAtUFJHUF9JRCIgKHllcywgd2l0aCBhIGxlYWRpbmcgc3BhY2UpCisJCSAqIGFuZCAiIFBJRDEgUElEMiBQSUQzIiAod2l0aCBkZWdlbmVyYXRlIGNhc2UgIiIpCisJCSAqLworCQl3aGlsZSAoKmFyZyAhPSAnXDAnKSB7CisJCQljaGFyICplbmQ7CisJCQlpZiAoKmFyZyA9PSAnICcpCisJCQkJYXJnKys7CisJCQlwaWQgPSBiYl9zdHJ0b2koYXJnLCAmZW5kLCAxMCk7CisJCQlpZiAoZXJybm8gJiYgKGVycm5vICE9IEVJTlZBTCB8fCAqZW5kICE9ICcgJykpIHsKKwkJCQliYl9lcnJvcl9tc2coImludmFsaWQgbnVtYmVyICclcyciLCBhcmcpOworCQkJCSplbmQgPSAnXDAnOworCQkJCWVycm9ycysrOworCQkJfSBlbHNlIGlmIChraWxsKHBpZCwgc2lnbm8pICE9IDApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBraWxsIHBpZCAlZCIsIChpbnQpcGlkKTsKKwkJCQllcnJvcnMrKzsKKwkJCX0KKwkJCWFyZyA9IGVuZDsgLyogY2FuIG9ubHkgcG9pbnQgdG8gJyAnIG9yICdcMCcgbm93ICovCisJCX0KKyNlbHNlCisJCXBpZCA9IGJiX3N0cnRvaShhcmcsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKSB7CisJCQliYl9lcnJvcl9tc2coImludmFsaWQgbnVtYmVyICclcyciLCBhcmcpOworCQkJZXJyb3JzKys7CisJCX0gZWxzZSBpZiAoa2lsbChwaWQsIHNpZ25vKSAhPSAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBraWxsIHBpZCAlZCIsIChpbnQpcGlkKTsKKwkJCWVycm9ycysrOworCQl9CisjZW5kaWYKKwkJYXJnID0gKisrYXJndjsKKwl9CisJcmV0dXJuIGVycm9yczsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9tcHN0YXQuYyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9tcHN0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTVhNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL21wc3RhdC5jCkBAIC0wLDAgKzEsOTc3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBQZXItcHJvY2Vzc29yIHN0YXRpc3RpY3MsIGJhc2VkIG9uIHN5c3N0YXQgdmVyc2lvbiA5LjEuMiBieSBTZWJhc3RpZW4gR29kYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hcmVrIFBvbGFjZWsgPG1tcG9sYWNla0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2FwcGxldDpJRl9NUFNUQVQoQVBQTEVUKG1wc3RhdCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX01QU1RBVCkgKz0gbXBzdGF0Lm8KKworLy9jb25maWc6Y29uZmlnIE1QU1RBVAorLy9jb25maWc6CWJvb2wgIm1wc3RhdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBQZXItcHJvY2Vzc29yIHN0YXRpc3RpY3MKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4gIC8qIHN0cnVjdCB1dHNuYW1lICovCisKKy8vI2RlZmluZSBkZWJ1ZyhmbXQsIC4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIGRlYnVnKGZtdCwgLi4uKSAoKHZvaWQpMCkKKworLyogU2l6ZSBvZiAvcHJvYy9pbnRlcnJ1cHRzIGxpbmUsIENQVSBkYXRhIGV4Y2x1ZGVkICovCisjZGVmaW5lIElOVEVSUlVQVFNfTElORSAgICA2NAorLyogTWF4aW11bSBudW1iZXIgb2YgaW50ZXJydXB0cyAqLworI2RlZmluZSBOUl9JUlFTICAgICAgICAgICAgMjU2CisjZGVmaW5lIE5SX0lSUUNQVV9QUkVBTExPQyAzCisjZGVmaW5lIE1BWF9JUlFOQU1FX0xFTiAgICAxNgorI2RlZmluZSBNQVhfUEZfTkFNRSAgICAgICAgNTEyCisvKiBzeXNzdGF0IDkuMC42IHVzZXMgd2lkdGggOCwgYnV0IG5ld2VyIGNvZGUgd2hpY2ggYWxzbyBwcmludHMgL3Byb2Mvc29mdGlycXMKKyAqIGRhdGEgbmVlZHMgbW9yZTogImludGVycnVwdHMiIGluIC9wcm9jL3NvZnRpcnFzIGhhdmUgbG9uZ2VyIG5hbWVzLAorICogbW9zdCBhcmUgdXAgdG8gOCBjaGFycywgb25lIChCTE9DS19JT1BPTEwpIGlzIGV2ZW4gbG9uZ2VyLgorICogV2UgYXJlIHByaW50aW5nIGhlYWRlcnMgaW4gdGhlICIgSVJRTkFNRS9zIiBmb3JtLCBleHBlcmltZW50YWxseQorICogYW55dGhpbmcgc21hbGxlciB0aGFuIDEwIGNoYXJzIGxvb2tzIHVnbHkgZm9yIC9wcm9jL3NvZnRpcnFzIHN0YXRzLgorICovCisjZGVmaW5lIElOVFJBVEVfU0NSV0lEVEggICAgICAxMAorI2RlZmluZSBJTlRSQVRFX1NDUldJRFRIX1NUUiAiMTAiCisKKy8qIFN5c3RlbSBmaWxlcyAqLworI2RlZmluZSBQUk9DRlNfU1RBVCAgICAgICAiL3Byb2Mvc3RhdCIKKyNkZWZpbmUgUFJPQ0ZTX0lOVEVSUlVQVFMgIi9wcm9jL2ludGVycnVwdHMiCisjZGVmaW5lIFBST0NGU19TT0ZUSVJRUyAgICIvcHJvYy9zb2Z0aXJxcyIKKyNkZWZpbmUgUFJPQ0ZTX1VQVElNRSAgICAgIi9wcm9jL3VwdGltZSIKKworCisjaWYgMQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZGF0YV90OwordHlwZWRlZiBsb25nIGxvbmcgaWRhdGFfdDsKKyNkZWZpbmUgRk1UX0RBVEEgImxsIgorI2RlZmluZSBEQVRBX01BWCBVTExPTkdfTUFYCisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRhdGFfdDsKK3R5cGVkZWYgbG9uZyBpZGF0YV90OworI2RlZmluZSBGTVRfREFUQSAibCIKKyNkZWZpbmUgREFUQV9NQVggVUxPTkdfTUFYCisjZW5kaWYKKworCitzdHJ1Y3Qgc3RhdHNfaXJxY3B1IHsKKwl1bnNpZ25lZCBpbnRlcnJ1cHRzOworCWNoYXIgaXJxX25hbWVbTUFYX0lSUU5BTUVfTEVOXTsKK307CisKK3N0cnVjdCBzdGF0c19jcHUgeworCWRhdGFfdCBjcHVfdXNlcjsKKwlkYXRhX3QgY3B1X25pY2U7CisJZGF0YV90IGNwdV9zeXN0ZW07CisJZGF0YV90IGNwdV9pZGxlOworCWRhdGFfdCBjcHVfaW93YWl0OworCWRhdGFfdCBjcHVfc3RlYWw7CisJZGF0YV90IGNwdV9pcnE7CisJZGF0YV90IGNwdV9zb2Z0aXJxOworCWRhdGFfdCBjcHVfZ3Vlc3Q7Cit9OworCitzdHJ1Y3Qgc3RhdHNfaXJxIHsKKwlkYXRhX3QgaXJxX25yOworfTsKKworCisvKiBHbG9iYWxzLiBTb3J0IGJ5IHNpemUgYW5kIGFjY2VzcyBmcmVxdWVuY3kuICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IGludGVydmFsOworCWludCBjb3VudDsKKwl1bnNpZ25lZCBjcHVfbnI7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBDUFVzICovCisJdW5zaWduZWQgaXJxY3B1X25yOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW50ZXJydXB0cyBwZXIgQ1BVICovCisJdW5zaWduZWQgc29mdGlycWNwdV9ucjsgICAgICAgICAvKiBOdW1iZXIgb2Ygc29mdCBpbnRlcnJ1cHRzIHBlciBDUFUgKi8KKwl1bnNpZ25lZCBvcHRpb25zOworCXVuc2lnbmVkIGh6OworCXVuc2lnbmVkIGNwdV9iaXRtYXBfbGVuOworCXNtYWxsaW50IHBfb3B0aW9uOworCS8vIDkuMC42IGRvZXMgbm90IGRvIGl0LiBUcnkgIm1wc3RhdCAtQSAxIDIiIC0gaGVhZGVycyBhcmUgcmVwZWF0ZWQhCisJLy9zbWFsbGludCBoZWFkZXJfZG9uZTsKKwkvL3NtYWxsaW50IGF2Z19oZWFkZXJfZG9uZTsKKwl1bnNpZ25lZCBjaGFyICpjcHVfYml0bWFwOyAgICAgIC8qIEJpdCAwOiBnbG9iYWwsIGJpdCAxOiAxc3QgcHJvYy4uLiAqLworCWRhdGFfdCBnbG9iYWxfdXB0aW1lWzNdOworCWRhdGFfdCBwZXJfY3B1X3VwdGltZVszXTsKKwlzdHJ1Y3Qgc3RhdHNfY3B1ICpzdF9jcHVbM107CisJc3RydWN0IHN0YXRzX2lycSAqc3RfaXJxWzNdOworCXN0cnVjdCBzdGF0c19pcnFjcHUgKnN0X2lycWNwdVszXTsKKwlzdHJ1Y3Qgc3RhdHNfaXJxY3B1ICpzdF9zb2Z0aXJxY3B1WzNdOworCXN0cnVjdCB0bSB0aW1lc3RhbXBbM107Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisvKiBUaGUgc2VsZWN0ZWQgaW50ZXJydXB0cyBzdGF0aXN0aWNzIChiaXRzIGluIEcub3B0aW9ucykgKi8KK2VudW0geworCURfQ1BVICAgICAgPSAxIDw8IDAsCisJRF9JUlFfU1VNICA9IDEgPDwgMSwKKwlEX0lSUV9DUFUgID0gMSA8PCAyLAorCURfU09GVElSUVMgPSAxIDw8IDMsCit9OworCisKKy8qIElzIG9wdGlvbiBvbj8gKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludCBkaXNwbGF5X29wdChpbnQgb3B0KQoreworCXJldHVybiAob3B0ICYgRy5vcHRpb25zKTsKK30KKworI2lmIERBVEFfTUFYID4gMHhmZmZmZmZmZgorLyoKKyAqIEhhbmRsZSBvdmVyZmxvdyBjb25kaXRpb25zIHByb3Blcmx5IGZvciBjb3VudGVycyB3aGljaCBjYW4gaGF2ZQorICogbGVzcyBiaXRzIHRoYW4gZGF0YV90LCBkZXBlbmRpbmcgb24gdGhlIGtlcm5lbCB2ZXJzaW9uLgorICovCisvKiBTdXJwcmlzaW5nbHksIG9uIDMyYml0IGlubGluaW5nIGlzIGEgc2l6ZSB3aW4gKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGRhdGFfdCBvdmVyZmxvd19zYWZlX3N1YihkYXRhX3QgcHJldiwgZGF0YV90IGN1cnIpCit7CisJZGF0YV90IHYgPSBjdXJyIC0gcHJldjsKKworCWlmICgoaWRhdGFfdCl2IDwgMCAgICAgLyogY3VyciA8IHByZXYgLSBjb3VudGVyIG92ZXJmbG93PyAqLworCSAmJiBwcmV2IDw9IDB4ZmZmZmZmZmYgLyoga2VybmVsIHVzZXMgMzJiaXQgdmFsdWUgZm9yIHRoZSBjb3VudGVyPyAqLworCSkgeworCQkvKiBBZGQgMzN0aCBiaXQgc2V0IHRvIDEgdG8gY3VyciwgY29tcGVuc2F0aW5nIGZvciB0aGUgb3ZlcmZsb3cgKi8KKwkJLyogZG91YmxlIHNoaWZ0IGRlZmVhdHMgIndhcm5pbmc6IGxlZnQgc2hpZnQgY291bnQgPj0gd2lkdGggb2YgdHlwZSIgKi8KKwkJdiArPSAoKGRhdGFfdCkxIDw8IDE2KSA8PCAxNjsKKwl9CisJcmV0dXJuIHY7Cit9CisjZWxzZQorc3RhdGljIEFMV0FZU19JTkxJTkUgZGF0YV90IG92ZXJmbG93X3NhZmVfc3ViKGRhdGFfdCBwcmV2LCBkYXRhX3QgY3VycikKK3sKKwlyZXR1cm4gY3VyciAtIHByZXY7Cit9CisjZW5kaWYKKworc3RhdGljIGRvdWJsZSBwZXJjZW50X3ZhbHVlKGRhdGFfdCBwcmV2LCBkYXRhX3QgY3VyciwgZGF0YV90IGl0dikKK3sKKwlyZXR1cm4gKChkb3VibGUpb3ZlcmZsb3dfc2FmZV9zdWIocHJldiwgY3VycikpIC8gaXR2ICogMTAwOworfQorCitzdGF0aWMgZG91YmxlIGh6X3ZhbHVlKGRhdGFfdCBwcmV2LCBkYXRhX3QgY3VyciwgZGF0YV90IGl0dikKK3sKKwkvL2JiX2Vycm9yX21zZygiY3VycjolbGxkIHByZXY6JWxsZCBHLmh6OiV1IiwgY3VyciwgcHJldiwgRy5oeik7CisJcmV0dXJuICgoZG91YmxlKW92ZXJmbG93X3NhZmVfc3ViKHByZXYsIGN1cnIpKSAvIGl0diAqIEcuaHo7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGRhdGFfdCBqaWZmaWVzX2RpZmYoZGF0YV90IG9sZCwgZGF0YV90IG5ldykKK3sKKwlkYXRhX3QgZGlmZiA9IG5ldyAtIG9sZDsKKwlyZXR1cm4gKGRpZmYgPT0gMCkgPyAxIDogZGlmZjsKK30KKworc3RhdGljIGludCBpc19jcHVfaW5fYml0bWFwKHVuc2lnbmVkIGNwdSkKK3sKKwlyZXR1cm4gRy5jcHVfYml0bWFwW2NwdSA+PiAzXSAmICgxIDw8IChjcHUgJiA3KSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2lycWNwdV9zdGF0cyhzdHJ1Y3Qgc3RhdHNfaXJxY3B1ICpwZXJfY3B1X3N0YXRzW10sCisJCWludCB0b3RhbF9pcnFzLAorCQlkYXRhX3QgaXR2LAorCQlpbnQgcHJldiwgaW50IGN1cnJlbnQsCisJCWNvbnN0IGNoYXIgKnByZXZfc3RyLCBjb25zdCBjaGFyICpjdXJyZW50X3N0cikKK3sKKwlpbnQgajsKKwlpbnQgb2Zmc2V0LCBjcHU7CisJc3RydWN0IHN0YXRzX2lycWNwdSAqcDAsICpxMDsKKworCS8qIENoZWNrIGlmIG51bWJlciBvZiBJUlFzIGhhcyBjaGFuZ2VkICovCisJaWYgKEcuaW50ZXJ2YWwgIT0gMCkgeworCQlmb3IgKGogPSAwOyBqIDw9IHRvdGFsX2lycXM7IGorKykgeworCQkJcDAgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVtqXTsKKwkJCWlmIChwMC0+aXJxX25hbWVbMF0gIT0gJ1wwJykgeworCQkJCXEwID0gJnBlcl9jcHVfc3RhdHNbcHJldl1bal07CisJCQkJaWYgKHN0cmNtcChwMC0+aXJxX25hbWUsIHEwLT5pcnFfbmFtZSkgIT0gMCkgeworCQkJCQkvKiBTdHJpbmdzIGFyZSBkaWZmZXJlbnQgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogUHJpbnQgaGVhZGVyICovCisJcHJpbnRmKCJcbiUtMTFzICBDUFUiLCBwcmV2X3N0cik7CisJeworCQkvKiBBIGJpdCBjb21wbGV4IGNvZGUgdG8gImJ1eSBiYWNrIiBzcGFjZSBpZiBvbmUgaGVhZGVyIGlzIHRvbyB3aWRlLgorCQkgKiBIZXJlJ3MgaG93IGl0IGxvb2tzIGxpa2UuIEJMT0NLX0lPUE9MTCBlYXRzIHRvbyBtdWNoIHNwYWNlLAorCQkgKiBhbmQgbGF0dGVyIGhlYWRlcnMgdXNlIHNtYWxsZXIgd2lkdGggdG8gY29tcGVuc2F0ZToKKwkJICogLi4uQkxPQ0svcyBCTE9DS19JT1BPTEwvcyBUQVNLTEVUL3MgU0NIRUQvcyBIUlRJTUVSL3MgIFJDVS9zCisJCSAqIC4uLiAgIDIuMzIgICAgICAwLjAwICAgICAgMC4wMSAgICAgMTcuNTggICAgICAwLjE0ICAgIDE0MS45NgorCQkgKi8KKwkJaW50IGV4cGVjdGVkX2xlbiA9IDA7CisJCWludCBwcmludGVkX2xlbiA9IDA7CisJCWZvciAoaiA9IDA7IGogPCB0b3RhbF9pcnFzOyBqKyspIHsKKwkJCXAwID0gJnBlcl9jcHVfc3RhdHNbY3VycmVudF1bal07CisJCQlpZiAocDAtPmlycV9uYW1lWzBdICE9ICdcMCcpIHsKKwkJCQlpbnQgbiA9IChJTlRSQVRFX1NDUldJRFRILTMpIC0gKHByaW50ZWRfbGVuIC0gZXhwZWN0ZWRfbGVuKTsKKwkJCQlwcmludGVkX2xlbiArPSBwcmludGYoIiAlKnMvcyIsIG4gPiAwID8gbiA6IDAsIHNraXBfd2hpdGVzcGFjZShwMC0+aXJxX25hbWUpKTsKKwkJCQlleHBlY3RlZF9sZW4gKz0gSU5UUkFURV9TQ1JXSURUSDsKKwkJCX0KKwkJfQorCX0KKwliYl9wdXRjaGFyKCdcbicpOworCisJZm9yIChjcHUgPSAxOyBjcHUgPD0gRy5jcHVfbnI7IGNwdSsrKSB7CisJCS8qIENoZWNrIGlmIHdlIHdhbnQgc3RhdHMgYWJvdXQgdGhpcyBDUFUgKi8KKwkJaWYgKCFpc19jcHVfaW5fYml0bWFwKGNwdSkgJiYgRy5wX29wdGlvbikgeworCQkJY29udGludWU7CisJCX0KKworCQlwcmludGYoIiUtMTFzICU0dSIsIGN1cnJlbnRfc3RyLCBjcHUgLSAxKTsKKworCQlmb3IgKGogPSAwOyBqIDwgdG90YWxfaXJxczsgaisrKSB7CisJCQkvKiBJUlEgZmllbGQgc2V0IG9ubHkgZm9yIHByb2MgMCAqLworCQkJcDAgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVtqXTsKKworCQkJLyoKKwkJCSAqIEFuIGVtcHR5IHN0cmluZyBmb3IgaXJxIG5hbWUgbWVhbnMgdGhhdAorCQkJICogaW50ZXJydXB0IGlzIG5vIGxvbmdlciB1c2VkLgorCQkJICovCisJCQlpZiAocDAtPmlycV9uYW1lWzBdICE9ICdcMCcpIHsKKwkJCQlvZmZzZXQgPSBqOworCQkJCXEwID0gJnBlcl9jcHVfc3RhdHNbcHJldl1bb2Zmc2V0XTsKKworCQkJCS8qCisJCQkJICogSWYgd2Ugd2FudCBzdGF0cyBmb3IgdGhlIHRpbWUgc2luY2UgYm9vdAorCQkJCSAqIHdlIGhhdmUgcDAtPmlycSAhPSBxMC0+aXJxLgorCQkJCSAqLworCQkJCWlmIChzdHJjbXAocDAtPmlycV9uYW1lLCBxMC0+aXJxX25hbWUpICE9IDAKKwkJCQkgJiYgRy5pbnRlcnZhbCAhPSAwCisJCQkJKSB7CisJCQkJCWlmIChqKSB7CisJCQkJCQlvZmZzZXQgPSBqIC0gMTsKKwkJCQkJCXEwID0gJnBlcl9jcHVfc3RhdHNbcHJldl1bb2Zmc2V0XTsKKwkJCQkJfQorCQkJCQlpZiAoc3RyY21wKHAwLT5pcnFfbmFtZSwgcTAtPmlycV9uYW1lKSAhPSAwCisJCQkJCSAmJiAoaiArIDEgPCB0b3RhbF9pcnFzKQorCQkJCQkpIHsKKwkJCQkJCW9mZnNldCA9IGogKyAxOworCQkJCQkJcTAgPSAmcGVyX2NwdV9zdGF0c1twcmV2XVtvZmZzZXRdOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHN0cmNtcChwMC0+aXJxX25hbWUsIHEwLT5pcnFfbmFtZSkgPT0gMAorCQkJCSB8fCBHLmludGVydmFsID09IDAKKwkJCQkpIHsKKwkJCQkJc3RydWN0IHN0YXRzX2lycWNwdSAqcCwgKnE7CisJCQkJCXAgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVsoY3B1IC0gMSkgKiB0b3RhbF9pcnFzICsgal07CisJCQkJCXEgPSAmcGVyX2NwdV9zdGF0c1twcmV2XVsoY3B1IC0gMSkgKiB0b3RhbF9pcnFzICsgb2Zmc2V0XTsKKwkJCQkJcHJpbnRmKCIlIklOVFJBVEVfU0NSV0lEVEhfU1RSIi4yZiIsCisJCQkJCQkoZG91YmxlKShwLT5pbnRlcnJ1cHRzIC0gcS0+aW50ZXJydXB0cykgLyBpdHYgKiBHLmh6KTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYoIiAgICAgICAgTi9BIik7CisJCQkJfQorCQkJfQorCQl9CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorfQorCitzdGF0aWMgZGF0YV90IGdldF9wZXJfY3B1X2ludGVydmFsKGNvbnN0IHN0cnVjdCBzdGF0c19jcHUgKnNjYywKKwkJY29uc3Qgc3RydWN0IHN0YXRzX2NwdSAqc2NwKQoreworCXJldHVybiAoKHNjYy0+Y3B1X3VzZXIgKyBzY2MtPmNwdV9uaWNlICsKKwkJIHNjYy0+Y3B1X3N5c3RlbSArIHNjYy0+Y3B1X2lvd2FpdCArCisJCSBzY2MtPmNwdV9pZGxlICsgc2NjLT5jcHVfc3RlYWwgKworCQkgc2NjLT5jcHVfaXJxICsgc2NjLT5jcHVfc29mdGlycSkgLQorCQkoc2NwLT5jcHVfdXNlciArIHNjcC0+Y3B1X25pY2UgKworCQkgc2NwLT5jcHVfc3lzdGVtICsgc2NwLT5jcHVfaW93YWl0ICsKKwkJIHNjcC0+Y3B1X2lkbGUgKyBzY3AtPmNwdV9zdGVhbCArCisJCSBzY3AtPmNwdV9pcnEgKyBzY3AtPmNwdV9zb2Z0aXJxKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRzX2NwdV9zdHJ1Y3QoY29uc3Qgc3RydWN0IHN0YXRzX2NwdSAqcCwKKwkJY29uc3Qgc3RydWN0IHN0YXRzX2NwdSAqYywKKwkJZGF0YV90IGl0dikKK3sKKwlwcmludGYoIiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZlxuIiwKKwkJcGVyY2VudF92YWx1ZShwLT5jcHVfdXNlciAtIHAtPmNwdV9ndWVzdCwKKwkJLyoqLyAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y3B1X3VzZXIgLSBjLT5jcHVfZ3Vlc3QsIGl0diksCisJCXBlcmNlbnRfdmFsdWUocC0+Y3B1X25pY2UgICAsIGMtPmNwdV9uaWNlICAgLCBpdHYpLAorCQlwZXJjZW50X3ZhbHVlKHAtPmNwdV9zeXN0ZW0gLCBjLT5jcHVfc3lzdGVtICwgaXR2KSwKKwkJcGVyY2VudF92YWx1ZShwLT5jcHVfaW93YWl0ICwgYy0+Y3B1X2lvd2FpdCAsIGl0diksCisJCXBlcmNlbnRfdmFsdWUocC0+Y3B1X2lycSAgICAsIGMtPmNwdV9pcnEgICAgLCBpdHYpLAorCQlwZXJjZW50X3ZhbHVlKHAtPmNwdV9zb2Z0aXJxLCBjLT5jcHVfc29mdGlycSwgaXR2KSwKKwkJcGVyY2VudF92YWx1ZShwLT5jcHVfc3RlYWwgICwgYy0+Y3B1X3N0ZWFsICAsIGl0diksCisJCXBlcmNlbnRfdmFsdWUocC0+Y3B1X2d1ZXN0ICAsIGMtPmNwdV9ndWVzdCAgLCBpdHYpLAorCQlwZXJjZW50X3ZhbHVlKHAtPmNwdV9pZGxlICAgLCBjLT5jcHVfaWRsZSAgICwgaXR2KQorCSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXRzX2NvcmUoaW50IHByZXYsIGludCBjdXJyZW50LAorCQljb25zdCBjaGFyICpwcmV2X3N0ciwgY29uc3QgY2hhciAqY3VycmVudF9zdHIpCit7CisJc3RydWN0IHN0YXRzX2NwdSAqc2NjLCAqc2NwOworCWRhdGFfdCBpdHYsIGdsb2JhbF9pdHY7CisJaW50IGNwdTsKKworCS8qIENvbXB1dGUgdGltZSBpbnRlcnZhbCAqLworCWl0diA9IGdsb2JhbF9pdHYgPSBqaWZmaWVzX2RpZmYoRy5nbG9iYWxfdXB0aW1lW3ByZXZdLCBHLmdsb2JhbF91cHRpbWVbY3VycmVudF0pOworCisJLyogUmVkdWNlIGludGVydmFsIHRvIG9uZSBDUFUgKi8KKwlpZiAoRy5jcHVfbnIgPiAxKQorCQlpdHYgPSBqaWZmaWVzX2RpZmYoRy5wZXJfY3B1X3VwdGltZVtwcmV2XSwgRy5wZXJfY3B1X3VwdGltZVtjdXJyZW50XSk7CisKKwkvKiBQcmludCBDUFUgc3RhdHMgKi8KKwlpZiAoZGlzcGxheV9vcHQoRF9DUFUpKSB7CisKKwkJLy8vKiBUaGlzIGlzIGRvbmUgZXhhY3RseSBvbmNlICovCisJCS8vaWYgKCFHLmhlYWRlcl9kb25lKSB7CisJCQlwcmludGYoIlxuJS0xMXMgIENQVSAgICAlJXVzciAgICUlbmljZSAgICAlJXN5cyAlJWlvd2FpdCAgICAlJWlycSAgICUlc29mdCAgJSVzdGVhbCAgJSVndWVzdCAgICUlaWRsZVxuIiwKKwkJCQlwcmV2X3N0cgorCQkJKTsKKwkJLy8JRy5oZWFkZXJfZG9uZSA9IDE7CisJCS8vfQorCisJCWZvciAoY3B1ID0gMDsgY3B1IDw9IEcuY3B1X25yOyBjcHUrKykgeworCQkJZGF0YV90IHBlcl9jcHVfaXR2OworCisJCQkvKiBQcmludCBzdGF0cyBhYm91dCB0aGlzIHBhcnRpY3VsYXIgQ1BVPyAqLworCQkJaWYgKCFpc19jcHVfaW5fYml0bWFwKGNwdSkpCisJCQkJY29udGludWU7CisKKwkJCXNjYyA9ICZHLnN0X2NwdVtjdXJyZW50XVtjcHVdOworCQkJc2NwID0gJkcuc3RfY3B1W3ByZXZdW2NwdV07CisJCQlwZXJfY3B1X2l0diA9IGdsb2JhbF9pdHY7CisKKwkJCXByaW50ZigoY3B1ID8gIiUtMTFzICU0dSIgOiAiJS0xMXMgIGFsbCIpLCBjdXJyZW50X3N0ciwgY3B1IC0gMSk7CisJCQlpZiAoY3B1KSB7CisJCQkJZG91YmxlIGlkbGU7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgQ1BVIGlzIG9mZmxpbmUsIHRoZW4gaXQgaXNuJ3QgaW4gL3Byb2Mvc3RhdCwKKwkJCQkgKiBzbyBhbGwgdmFsdWVzIGFyZSAwLgorCQkJCSAqIE5COiBHdWVzdCB0aW1lIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdXNlciB0aW1lLgorCQkJCSAqLworCQkJCWlmICgoc2NjLT5jcHVfdXNlciB8IHNjYy0+Y3B1X25pY2UgfCBzY2MtPmNwdV9zeXN0ZW0gfAorCQkJCSAgICAgc2NjLT5jcHVfaW93YWl0IHwgc2NjLT5jcHVfaWRsZSB8IHNjYy0+Y3B1X3N0ZWFsIHwKKwkJCQkgICAgIHNjYy0+Y3B1X2lycSB8IHNjYy0+Y3B1X3NvZnRpcnEpID09IDAKKwkJCQkpIHsKKwkJCQkJLyoKKwkJCQkJICogU2V0IGN1cnJlbnQgc3RydWN0IGZpZWxkcyB0byB2YWx1ZXMgZnJvbSBwcmV2LgorCQkJCQkgKiBpdGVyYXRpb24uIFRoZW4gdGhlaXIgdmFsdWVzIHdvbid0IGp1bXAgZnJvbQorCQkJCQkgKiB6ZXJvLCB3aGVuIHRoZSBDUFUgY29tZXMgYmFjayBvbmxpbmUuCisJCQkJCSAqLworCQkJCQkqc2NjID0gKnNjcDsKKwkJCQkJaWRsZSA9IDAuMDsKKwkJCQkJZ290byBwcmludF96ZXJvczsKKwkJCQl9CisJCQkJLyogQ29tcHV0ZSBpbnRlcnZhbCBhZ2FpbiBmb3IgY3VycmVudCBwcm9jICovCisJCQkJcGVyX2NwdV9pdHYgPSBnZXRfcGVyX2NwdV9pbnRlcnZhbChzY2MsIHNjcCk7CisJCQkJaWYgKHBlcl9jcHVfaXR2ID09IDApIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgdGhlIENQVSBpcyB0aWNrbGVzcyB0aGVuIHRoZXJlIGlzIG5vIGNoYW5nZSBpbiBDUFUgdmFsdWVzCisJCQkJCSAqIGJ1dCB0aGUgc3VtIG9mIHZhbHVlcyBpcyBub3QgemVyby4KKwkJCQkJICovCisJCQkJCWlkbGUgPSAxMDAuMDsKKyBwcmludF96ZXJvczoKKwkJCQkJcHJpbnRmKCIgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmZcbiIsCisJCQkJCQkwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgaWRsZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXByaW50X3N0YXRzX2NwdV9zdHJ1Y3Qoc2NwLCBzY2MsIHBlcl9jcHVfaXR2KTsKKwkJfQorCX0KKworCS8qIFByaW50IHRvdGFsIG51bWJlciBvZiBJUlFzIHBlciBDUFUgKi8KKwlpZiAoZGlzcGxheV9vcHQoRF9JUlFfU1VNKSkgeworCisJCS8vLyogUHJpbnQgYXZlcmFnZSBoZWFkZXIsIHRoaXMgaXMgZG9uZSBleGFjdGx5IG9uY2UgKi8KKwkJLy9pZiAoIUcuYXZnX2hlYWRlcl9kb25lKSB7CisJCQlwcmludGYoIlxuJS0xMXMgIENQVSAgICBpbnRyL3NcbiIsIHByZXZfc3RyKTsKKwkJLy8JRy5hdmdfaGVhZGVyX2RvbmUgPSAxOworCQkvL30KKworCQlmb3IgKGNwdSA9IDA7IGNwdSA8PSBHLmNwdV9ucjsgY3B1KyspIHsKKwkJCWRhdGFfdCBwZXJfY3B1X2l0djsKKworCQkJLyogUHJpbnQgc3RhdHMgYWJvdXQgdGhpcyBDUFU/ICovCisJCQlpZiAoIWlzX2NwdV9pbl9iaXRtYXAoY3B1KSkKKwkJCQljb250aW51ZTsKKworCQkJcGVyX2NwdV9pdHYgPSBpdHY7CisJCQlwcmludGYoKGNwdSA/ICIlLTExcyAlNHUiIDogIiUtMTFzICBhbGwiKSwgY3VycmVudF9zdHIsIGNwdSAtIDEpOworCQkJaWYgKGNwdSkgeworCQkJCXNjYyA9ICZHLnN0X2NwdVtjdXJyZW50XVtjcHVdOworCQkJCXNjcCA9ICZHLnN0X2NwdVtwcmV2XVtjcHVdOworCQkJCS8qIENvbXB1dGUgaW50ZXJ2YWwgYWdhaW4gZm9yIGN1cnJlbnQgcHJvYyAqLworCQkJCXBlcl9jcHVfaXR2ID0gZ2V0X3Blcl9jcHVfaW50ZXJ2YWwoc2NjLCBzY3ApOworCQkJCWlmIChwZXJfY3B1X2l0diA9PSAwKSB7CisJCQkJCXByaW50ZigiICU5LjJmXG4iLCAwLjApOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkvL2JiX2Vycm9yX21zZygiRy5zdF9pcnFbJXVdWyV1XS5pcnFfbnI6JWxsZCAtIEcuc3RfaXJxWyV1XVsldV0uaXJxX25yOiVsbGQiLAorCQkJLy8gY3VycmVudCwgY3B1LCBHLnN0X2lycVtwcmV2XVtjcHVdLmlycV9uciwgcHJldiwgY3B1LCBHLnN0X2lycVtjdXJyZW50XVtjcHVdLmlycV9ucik7CisJCQlwcmludGYoIiAlOS4yZlxuIiwgaHpfdmFsdWUoRy5zdF9pcnFbcHJldl1bY3B1XS5pcnFfbnIsIEcuc3RfaXJxW2N1cnJlbnRdW2NwdV0uaXJxX25yLCBwZXJfY3B1X2l0dikpOworCQl9CisJfQorCisJaWYgKGRpc3BsYXlfb3B0KERfSVJRX0NQVSkpIHsKKwkJd3JpdGVfaXJxY3B1X3N0YXRzKEcuc3RfaXJxY3B1LCBHLmlycWNwdV9uciwKKwkJCQlpdHYsCisJCQkJcHJldiwgY3VycmVudCwKKwkJCQlwcmV2X3N0ciwgY3VycmVudF9zdHIKKwkJKTsKKwl9CisKKwlpZiAoZGlzcGxheV9vcHQoRF9TT0ZUSVJRUykpIHsKKwkJd3JpdGVfaXJxY3B1X3N0YXRzKEcuc3Rfc29mdGlycWNwdSwgRy5zb2Z0aXJxY3B1X25yLAorCQkJCWl0diwKKwkJCQlwcmV2LCBjdXJyZW50LAorCQkJCXByZXZfc3RyLCBjdXJyZW50X3N0cgorCQkpOworCX0KK30KKworLyoKKyAqIFByaW50IHRoZSBzdGF0aXN0aWNzCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXRzKGludCBjdXJyZW50KQoreworCWNoYXIgcHJldl90aW1lWzE2XTsKKwljaGFyIGN1cnJfdGltZVsxNl07CisKKwlzdHJmdGltZShwcmV2X3RpbWUsIHNpemVvZihwcmV2X3RpbWUpLCAiJVgiLCAmRy50aW1lc3RhbXBbIWN1cnJlbnRdKTsKKwlzdHJmdGltZShjdXJyX3RpbWUsIHNpemVvZihjdXJyX3RpbWUpLCAiJVgiLCAmRy50aW1lc3RhbXBbY3VycmVudF0pOworCisJd3JpdGVfc3RhdHNfY29yZSghY3VycmVudCwgY3VycmVudCwgcHJldl90aW1lLCBjdXJyX3RpbWUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9zdGF0c19hdmcoaW50IGN1cnJlbnQpCit7CisJd3JpdGVfc3RhdHNfY29yZSgyLCBjdXJyZW50LCAiQXZlcmFnZToiLCAiQXZlcmFnZToiKTsKK30KKworLyoKKyAqIFJlYWQgQ1BVIHN0YXRpc3RpY3MKKyAqLworc3RhdGljIHZvaWQgZ2V0X2NwdV9zdGF0aXN0aWNzKHN0cnVjdCBzdGF0c19jcHUgKmNwdSwgZGF0YV90ICp1cCwgZGF0YV90ICp1cDApCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbMTAyNF07CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZChQUk9DRlNfU1RBVCk7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWRhdGFfdCBzdW07CisJCXVuc2lnbmVkIGNwdV9udW1iZXI7CisJCXN0cnVjdCBzdGF0c19jcHUgKmNwOworCisJCWlmICghc3RhcnRzX3dpdGhfY3B1KGJ1ZikpCisJCQljb250aW51ZTsgLyogbm90ICJjcHUiICovCisKKwkJY3AgPSBjcHU7IC8qIGZvciAiY3B1ICIgY2FzZSAqLworCQlpZiAoYnVmWzNdICE9ICcgJykgeworCQkJLyogImNwdU4gIiAqLworCQkJaWYgKEcuY3B1X25yID09IDAKKwkJCSB8fCBzc2NhbmYoYnVmICsgMywgIiV1ICIsICZjcHVfbnVtYmVyKSAhPSAxCisJCQkgfHwgY3B1X251bWJlciA+PSBHLmNwdV9ucgorCQkJKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQljcCA9ICZjcHVbY3B1X251bWJlciArIDFdOworCQl9CisKKwkJLyogUmVhZCB0aGUgY291bnRlcnMsIHNhdmUgdGhlbSAqLworCQkvKiBOb3QgYWxsIGZpZWxkcyBoYXZlIHRvIGJlIHByZXNlbnQgKi8KKwkJbWVtc2V0KGNwLCAwLCBzaXplb2YoKmNwKSk7CisJCXNzY2FuZihidWYsICIlKnMiCisJCQkiICUiRk1UX0RBVEEidSAlIkZNVF9EQVRBInUgJSJGTVRfREFUQSJ1IgorCQkJIiAlIkZNVF9EQVRBInUgJSJGTVRfREFUQSJ1ICUiRk1UX0RBVEEidSIKKwkJCSIgJSJGTVRfREFUQSJ1ICUiRk1UX0RBVEEidSAlIkZNVF9EQVRBInUiLAorCQkJJmNwLT5jcHVfdXNlciwgJmNwLT5jcHVfbmljZSwgJmNwLT5jcHVfc3lzdGVtLAorCQkJJmNwLT5jcHVfaWRsZSwgJmNwLT5jcHVfaW93YWl0LCAmY3AtPmNwdV9pcnEsCisJCQkmY3AtPmNwdV9zb2Z0aXJxLCAmY3AtPmNwdV9zdGVhbCwgJmNwLT5jcHVfZ3Vlc3QKKwkJKTsKKwkJLyoKKwkJICogQ29tcHV0ZSB1cHRpbWUgaW4gamlmZmllcyAoMS9IWiksIGl0J2xsIGJlIHRoZSBzdW0gb2YKKwkJICogaW5kaXZpZHVhbCBDUFUncyB1cHRpbWVzLgorCQkgKiBOQjogV2UgaGF2ZSB0byBvbWl0IGNwdV9ndWVzdCwgYmVjYXVzZSBjcHVfdXNlciBpbmNsdWRlcyBpdC4KKwkJICovCisJCXN1bSA9IGNwLT5jcHVfdXNlciArIGNwLT5jcHVfbmljZSArIGNwLT5jcHVfc3lzdGVtICsKKwkJCWNwLT5jcHVfaWRsZSArIGNwLT5jcHVfaW93YWl0ICsgY3AtPmNwdV9pcnEgKworCQkJY3AtPmNwdV9zb2Z0aXJxICsgY3AtPmNwdV9zdGVhbDsKKworCQlpZiAoYnVmWzNdID09ICcgJykgeworCQkJLyogImNwdSAiICovCisJCQkqdXAgPSBzdW07CisJCX0gZWxzZSB7CisJCQkvKiAiY3B1TiAiICovCisJCQlpZiAoY3B1X251bWJlciA9PSAwICYmICp1cDAgIT0gMCkgeworCQkJCS8qIENvbXB1dGUgdXB0aW1lIG9mIHNpbmdsZSBDUFUgKi8KKwkJCQkqdXAwID0gc3VtOworCQkJfQorCQl9CisJfQorCWZjbG9zZShmcCk7Cit9CisKKy8qCisgKiBSZWFkIElSUXMgZnJvbSAvcHJvYy9zdGF0CisgKi8KK3N0YXRpYyB2b2lkIGdldF9pcnFzX2Zyb21fc3RhdChzdHJ1Y3Qgc3RhdHNfaXJxICppcnEpCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbMTAyNF07CisKKwlmcCA9IGZvcGVuX2Zvcl9yZWFkKFBST0NGU19TVEFUKTsKKwlpZiAoIWZwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCS8vYmJfZXJyb3JfbXNnKCIvcHJvYy9zdGF0OiclcyciLCBidWYpOworCQlpZiAoc3RybmNtcChidWYsICJpbnRyICIsIDUpID09IDApIHsKKwkJCS8qIFJlYWQgdG90YWwgbnVtYmVyIG9mIElSUXMgc2luY2Ugc3lzdGVtIGJvb3QgKi8KKwkJCXNzY2FuZihidWYgKyA1LCAiJSJGTVRfREFUQSJ1IiwgJmlycS0+aXJxX25yKTsKKwkJfQorCX0KKworCWZjbG9zZShmcCk7Cit9CisKKy8qCisgKiBSZWFkIHN0YXRzIGZyb20gL3Byb2MvaW50ZXJydXB0cyBvciAvcHJvYy9zb2Z0aXJxcworICovCitzdGF0aWMgdm9pZCBnZXRfaXJxc19mcm9tX2ludGVycnVwdHMoY29uc3QgY2hhciAqZm5hbWUsCisJCXN0cnVjdCBzdGF0c19pcnFjcHUgKnBlcl9jcHVfc3RhdHNbXSwKKwkJaW50IGlycXNfcGVyX2NwdSwgaW50IGN1cnJlbnQpCit7CisJRklMRSAqZnA7CisJc3RydWN0IHN0YXRzX2lycSAqaXJxX2k7CisJc3RydWN0IHN0YXRzX2lycWNwdSAqaWM7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGJ1ZmxlbjsKKwl1bnNpZ25lZCBjcHU7CisJdW5zaWduZWQgaXJxOworCWludCBjcHVfaW5kZXhbRy5jcHVfbnJdOworCWludCBpaW5kZXg7CisKKy8vIE1vdmVkIHRvIGNhbGxlci4KKy8vIE90aGVyd2lzZSByZWFkaW5nIG9mIC9wcm9jL3NvZnRpcnFzCisvLyB3YXMgcmVzZXR0aW5nIGNvdW50cyB0byAwIGFmdGVyIHdlIHBhaW5zdGFraW5nbHkgY29sbGVjdGVkIHRoZW0gZnJvbQorLy8gL3Byb2MvaW50ZXJydXB0cy4gV2hpY2ggcmVzdWx0ZWQgaW46CisvLyAwMTozMjo0NyBQTSAgQ1BVICAgIGludHIvcworLy8gMDE6MzI6NDcgUE0gIGFsbCAgICA1OTEuNDcKKy8vIDAxOjMyOjQ3IFBNICAgIDAgICAgICAwLjAwIDw9ID8/PworLy8gMDE6MzI6NDcgUE0gICAgMSAgICAgIDAuMDAgPD0gPz8/CisvLwlmb3IgKGNwdSA9IDE7IGNwdSA8PSBHLmNwdV9ucjsgY3B1KyspIHsKKy8vCQlHLnN0X2lycVtjdXJyZW50XVtjcHVdLmlycV9uciA9IDA7CisvLwkJLy9iYl9lcnJvcl9tc2coIkcuc3RfaXJxWyV1XVsldV0uaXJxX25yPTAiLCBjdXJyZW50LCBjcHUpOworLy8JfQorCisJZnAgPSBmb3Blbl9mb3JfcmVhZChmbmFtZSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuOworCisJYnVmbGVuID0gSU5URVJSVVBUU19MSU5FICsgMTYgKiBHLmNwdV9ucjsKKwlidWYgPSB4bWFsbG9jKGJ1Zmxlbik7CisKKwkvKiBQYXJzZSBoZWFkZXIgYW5kIGRldGVybWluZSwgd2hpY2ggQ1BVcyBhcmUgb25saW5lICovCisJaWluZGV4ID0gMDsKKwl3aGlsZSAoZmdldHMoYnVmLCBidWZsZW4sIGZwKSkgeworCQljaGFyICpjcCwgKm5leHQ7CisJCW5leHQgPSBidWY7CisJCXdoaWxlICgoY3AgPSBzdHJzdHIobmV4dCwgIkNQVSIpKSAhPSBOVUxMCisJCSAmJiBpaW5kZXggPCBHLmNwdV9ucgorCQkpIHsKKwkJCWNwdSA9IHN0cnRvdWwoY3AgKyAzLCAmbmV4dCwgMTApOworCQkJY3B1X2luZGV4W2lpbmRleCsrXSA9IGNwdTsKKwkJfQorCQlpZiAoaWluZGV4KSAvKiBXZSBmb3VuZCBoZWFkZXIgKi8KKwkJCWJyZWFrOworCX0KKworCWlycSA9IDA7CisJd2hpbGUgKGZnZXRzKGJ1ZiwgYnVmbGVuLCBmcCkKKwkgJiYgaXJxIDwgaXJxc19wZXJfY3B1CisJKSB7CisJCWludCBsZW47CisJCWNoYXIgbGFzdF9jaGFyOworCQljaGFyICpjcDsKKworCQkvKiBTa2lwIG92ZXIgIklSUU5BTUU6IiAqLworCQljcCA9IHN0cmNocihidWYsICc6Jyk7CisJCWlmICghY3ApCisJCQljb250aW51ZTsKKwkJbGFzdF9jaGFyID0gY3BbLTFdOworCisJCWljID0gJnBlcl9jcHVfc3RhdHNbY3VycmVudF1baXJxXTsKKwkJbGVuID0gY3AgLSBidWY7CisJCWlmIChsZW4gPj0gc2l6ZW9mKGljLT5pcnFfbmFtZSkpIHsKKwkJCWxlbiA9IHNpemVvZihpYy0+aXJxX25hbWUpIC0gMTsKKwkJfQorCQlzYWZlX3N0cm5jcHkoaWMtPmlycV9uYW1lLCBidWYsIGxlbiArIDEpOworCQkvL2JiX2Vycm9yX21zZygiJXM6IGlycSVkOiclcycgYnVmOiclcyciLCBmbmFtZSwgaXJxLCBpYy0+aXJxX25hbWUsIGJ1Zik7CisJCWNwKys7CisKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBpaW5kZXg7IGNwdSsrKSB7CisJCQljaGFyICpuZXh0OworCQkJaWMgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVtjcHVfaW5kZXhbY3B1XSAqIGlycXNfcGVyX2NwdSArIGlycV07CisJCQlpcnFfaSA9ICZHLnN0X2lycVtjdXJyZW50XVtjcHVfaW5kZXhbY3B1XSArIDFdOworCQkJaWMtPmludGVycnVwdHMgPSBzdHJ0b3VsKGNwLCAmbmV4dCwgMTApOworCQkJLyogQ291bnQgb25seSBudW1lcmljYWwgSVJRcyAqLworCQkJaWYgKGlzZGlnaXQobGFzdF9jaGFyKSkgeworCQkJCWlycV9pLT5pcnFfbnIgKz0gaWMtPmludGVycnVwdHM7CisJCQkJLy9iYl9lcnJvcl9tc2coIkcuc3RfaXJxWyV1XVsldV0uaXJxX25yICsgJXUgPSAlbGxkIiwKKwkJCQkvLyBjdXJyZW50LCBjcHVfaW5kZXhbY3B1XSArIDEsIGljLT5pbnRlcnJ1cHRzLCBpcnFfaS0+aXJxX25yKTsKKwkJCX0KKwkJCWNwID0gbmV4dDsKKwkJfQorCQlpcnErKzsKKwl9CisJZmNsb3NlKGZwKTsKKwlmcmVlKGJ1Zik7CisKKwl3aGlsZSAoaXJxIDwgaXJxc19wZXJfY3B1KSB7CisJCS8qIE51bWJlciBvZiBpbnRlcnJ1cHRzIHBlciBDUFUgaGFzIGNoYW5nZWQgKi8KKwkJaWMgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVtpcnFdOworCQlpYy0+aXJxX25hbWVbMF0gPSAnXDAnOyAvKiBGYWxzZSBpbnRlcnJ1cHQgKi8KKwkJaXJxKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfdXB0aW1lKGRhdGFfdCAqdXB0aW1lKQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmW3NpemVvZihsb25nKSozICogMiArIDRdOyAvKiBlbm91Z2ggZm9yIGxvbmcubG9uZyAqLworCXVuc2lnbmVkIGxvbmcgdXB0aW1lX3NlYywgZGVjaW1hbDsKKworCWZwID0gZm9wZW5fZm9yX3JlYWQoUFJPQ0ZTX1VQVElNRSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuOworCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJaWYgKHNzY2FuZihidWYsICIlbHUuJWx1IiwgJnVwdGltZV9zZWMsICZkZWNpbWFsKSA9PSAyKSB7CisJCQkqdXB0aW1lID0gKGRhdGFfdCl1cHRpbWVfc2VjICogRy5oeiArIGRlY2ltYWwgKiBHLmh6IC8gMTAwOworCQl9CisJfQorCisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2xvY2FsdGltZShzdHJ1Y3QgdG0gKnRtKQoreworCXRpbWVfdCB0aW1lcjsKKwl0aW1lKCZ0aW1lcik7CisJbG9jYWx0aW1lX3IoJnRpbWVyLCB0bSk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc2lnbmFsKFNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpOworCWFsYXJtKEcuaW50ZXJ2YWwpOworfQorCitzdGF0aWMgdm9pZCBtYWluX2xvb3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBjdXJyZW50OworCXVuc2lnbmVkIGNwdXM7CisKKwkvKiBSZWFkIHRoZSBzdGF0cyAqLworCWlmIChHLmNwdV9uciA+IDEpIHsKKwkJRy5wZXJfY3B1X3VwdGltZVswXSA9IDA7CisJCWdldF91cHRpbWUoJkcucGVyX2NwdV91cHRpbWVbMF0pOworCX0KKworCWdldF9jcHVfc3RhdGlzdGljcyhHLnN0X2NwdVswXSwgJkcuZ2xvYmFsX3VwdGltZVswXSwgJkcucGVyX2NwdV91cHRpbWVbMF0pOworCisJaWYgKGRpc3BsYXlfb3B0KERfSVJRX1NVTSkpCisJCWdldF9pcnFzX2Zyb21fc3RhdChHLnN0X2lycVswXSk7CisKKwlpZiAoZGlzcGxheV9vcHQoRF9JUlFfU1VNIHwgRF9JUlFfQ1BVKSkKKwkJZ2V0X2lycXNfZnJvbV9pbnRlcnJ1cHRzKFBST0NGU19JTlRFUlJVUFRTLCBHLnN0X2lycWNwdSwKKwkJCQkJRy5pcnFjcHVfbnIsIDApOworCisJaWYgKGRpc3BsYXlfb3B0KERfU09GVElSUVMpKQorCQlnZXRfaXJxc19mcm9tX2ludGVycnVwdHMoUFJPQ0ZTX1NPRlRJUlFTLCBHLnN0X3NvZnRpcnFjcHUsCisJCQkJCUcuc29mdGlycWNwdV9uciwgMCk7CisKKwlpZiAoRy5pbnRlcnZhbCA9PSAwKSB7CisJCS8qIERpc3BsYXkgc2luY2UgYm9vdCB0aW1lICovCisJCWNwdXMgPSBHLmNwdV9uciArIDE7CisJCUcudGltZXN0YW1wWzFdID0gRy50aW1lc3RhbXBbMF07CisJCW1lbXNldChHLnN0X2NwdVsxXSwgMCwgc2l6ZW9mKEcuc3RfY3B1WzFdWzBdKSAqIGNwdXMpOworCQltZW1zZXQoRy5zdF9pcnFbMV0sIDAsIHNpemVvZihHLnN0X2lycVsxXVswXSkgKiBjcHVzKTsKKwkJbWVtc2V0KEcuc3RfaXJxY3B1WzFdLCAwLCBzaXplb2YoRy5zdF9pcnFjcHVbMV1bMF0pICogY3B1cyAqIEcuaXJxY3B1X25yKTsKKwkJbWVtc2V0KEcuc3Rfc29mdGlycWNwdVsxXSwgMCwgc2l6ZW9mKEcuc3Rfc29mdGlycWNwdVsxXVswXSkgKiBjcHVzICogRy5zb2Z0aXJxY3B1X25yKTsKKworCQl3cml0ZV9zdGF0cygwKTsKKworCQkvKiBBbmQgd2UncmUgZG9uZSAqLworCQlyZXR1cm47CisJfQorCisJLyogU2V0IGEgaGFuZGxlciBmb3IgU0lHQUxSTSAqLworCWFsYXJtX2hhbmRsZXIoMCk7CisKKwkvKiBTYXZlIHRoZSBzdGF0cyB3ZSBhbHJlYWR5IGhhdmUuIFdlIG5lZWQgdGhlbSB0byBjb21wdXRlIHRoZSBhdmVyYWdlICovCisJRy50aW1lc3RhbXBbMl0gPSBHLnRpbWVzdGFtcFswXTsKKwlHLmdsb2JhbF91cHRpbWVbMl0gPSBHLmdsb2JhbF91cHRpbWVbMF07CisJRy5wZXJfY3B1X3VwdGltZVsyXSA9IEcucGVyX2NwdV91cHRpbWVbMF07CisJY3B1cyA9IEcuY3B1X25yICsgMTsKKwltZW1jcHkoRy5zdF9jcHVbMl0sIEcuc3RfY3B1WzBdLCBzaXplb2YoRy5zdF9jcHVbMF1bMF0pICogY3B1cyk7CisJbWVtY3B5KEcuc3RfaXJxWzJdLCBHLnN0X2lycVswXSwgc2l6ZW9mKEcuc3RfaXJxWzBdWzBdKSAqIGNwdXMpOworCW1lbWNweShHLnN0X2lycWNwdVsyXSwgRy5zdF9pcnFjcHVbMF0sIHNpemVvZihHLnN0X2lycWNwdVswXVswXSkgKiBjcHVzICogRy5pcnFjcHVfbnIpOworCWlmIChkaXNwbGF5X29wdChEX1NPRlRJUlFTKSkgeworCQltZW1jcHkoRy5zdF9zb2Z0aXJxY3B1WzJdLCBHLnN0X3NvZnRpcnFjcHVbMF0sCisJCQlzaXplb2YoRy5zdF9zb2Z0aXJxY3B1WzBdWzBdKSAqIGNwdXMgKiBHLnNvZnRpcnFjcHVfbnIpOworCX0KKworCWN1cnJlbnQgPSAxOworCXdoaWxlICgxKSB7CisJCS8qIFN1c3BlbmQgdW50aWwgYSBzaWduYWwgaXMgcmVjZWl2ZWQgKi8KKwkJcGF1c2UoKTsKKworCQkvKiBTZXQgc3RydWN0dXJlcyB0byAwIHRvIGRpc3Rpbmd1aXNoIG9mZi9vbmxpbmUgQ1BVcyAqLworCQltZW1zZXQoJkcuc3RfY3B1W2N1cnJlbnRdWy8qY3B1OiovIDFdLCAwLCBzaXplb2YoRy5zdF9jcHVbMF1bMF0pICogRy5jcHVfbnIpOworCisJCWdldF9sb2NhbHRpbWUoJkcudGltZXN0YW1wW2N1cnJlbnRdKTsKKworCQkvKiBSZWFkIHN0YXRzICovCisJCWlmIChHLmNwdV9uciA+IDEpIHsKKwkJCUcucGVyX2NwdV91cHRpbWVbY3VycmVudF0gPSAwOworCQkJZ2V0X3VwdGltZSgmRy5wZXJfY3B1X3VwdGltZVtjdXJyZW50XSk7CisJCX0KKwkJZ2V0X2NwdV9zdGF0aXN0aWNzKEcuc3RfY3B1W2N1cnJlbnRdLCAmRy5nbG9iYWxfdXB0aW1lW2N1cnJlbnRdLCAmRy5wZXJfY3B1X3VwdGltZVtjdXJyZW50XSk7CisKKwkJaWYgKGRpc3BsYXlfb3B0KERfSVJRX1NVTSkpCisJCQlnZXRfaXJxc19mcm9tX3N0YXQoRy5zdF9pcnFbY3VycmVudF0pOworCisJCWlmIChkaXNwbGF5X29wdChEX0lSUV9TVU0gfCBEX0lSUV9DUFUpKSB7CisJCQlpbnQgY3B1OworCQkJZm9yIChjcHUgPSAxOyBjcHUgPD0gRy5jcHVfbnI7IGNwdSsrKSB7CisJCQkJRy5zdF9pcnFbY3VycmVudF1bY3B1XS5pcnFfbnIgPSAwOworCQkJfQorCQkJLyogYWNjdW11bGF0ZXMgLmlycV9uciAqLworCQkJZ2V0X2lycXNfZnJvbV9pbnRlcnJ1cHRzKFBST0NGU19JTlRFUlJVUFRTLCBHLnN0X2lycWNwdSwKKwkJCQkJRy5pcnFjcHVfbnIsIGN1cnJlbnQpOworCQl9CisKKwkJaWYgKGRpc3BsYXlfb3B0KERfU09GVElSUVMpKQorCQkJZ2V0X2lycXNfZnJvbV9pbnRlcnJ1cHRzKFBST0NGU19TT0ZUSVJRUywKKwkJCQkJRy5zdF9zb2Z0aXJxY3B1LAorCQkJCQlHLnNvZnRpcnFjcHVfbnIsIGN1cnJlbnQpOworCisJCXdyaXRlX3N0YXRzKGN1cnJlbnQpOworCisJCWlmIChHLmNvdW50ID4gMCkgeworCQkJaWYgKC0tRy5jb3VudCA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJY3VycmVudCBePSAxOworCX0KKworCS8qIFByaW50IGF2ZXJhZ2Ugc3RhdGlzdGljcyAqLworCXdyaXRlX3N0YXRzX2F2ZyhjdXJyZW50KTsKK30KKworLyogSW5pdGlhbGl6YXRpb24gKi8KKworLyogR2V0IG51bWJlciBvZiBjbG9jayB0aWNrcyBwZXIgc2VjICovCitzdGF0aWMgQUxXQVlTX0lOTElORSB1bnNpZ25lZCBnZXRfaHoodm9pZCkKK3sKKwlyZXR1cm4gc3lzY29uZihfU0NfQ0xLX1RDSyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jX3N0cnVjdChpbnQgY3B1cykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCUcuc3RfY3B1W2ldID0geHphbGxvYyhzaXplb2YoRy5zdF9jcHVbaV1bMF0pICogY3B1cyk7CisJCUcuc3RfaXJxW2ldID0geHphbGxvYyhzaXplb2YoRy5zdF9pcnFbaV1bMF0pICogY3B1cyk7CisJCUcuc3RfaXJxY3B1W2ldID0geHphbGxvYyhzaXplb2YoRy5zdF9pcnFjcHVbaV1bMF0pICogY3B1cyAqIEcuaXJxY3B1X25yKTsKKwkJRy5zdF9zb2Z0aXJxY3B1W2ldID0geHphbGxvYyhzaXplb2YoRy5zdF9zb2Z0aXJxY3B1W2ldWzBdKSAqIGNwdXMgKiBHLnNvZnRpcnFjcHVfbnIpOworCX0KKwlHLmNwdV9iaXRtYXBfbGVuID0gKGNwdXMgPj4gMykgKyAxOworCUcuY3B1X2JpdG1hcCA9IHh6YWxsb2MoRy5jcHVfYml0bWFwX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlYWRlcihzdHJ1Y3QgdG0gKnQpCit7CisJY2hhciBjdXJfZGF0ZVsxNl07CisJc3RydWN0IHV0c25hbWUgdXRzOworCisJLyogR2V0IHN5c3RlbSBuYW1lLCByZWxlYXNlIG51bWJlciBhbmQgaG9zdG5hbWUgKi8KKwl1bmFtZSgmdXRzKTsKKworCXN0cmZ0aW1lKGN1cl9kYXRlLCBzaXplb2YoY3VyX2RhdGUpLCAiJXgiLCB0KTsKKworCXByaW50ZigiJXMgJXMgKCVzKVx0JXNcdF8lc19cdCgldSBDUFUpXG4iLAorCQl1dHMuc3lzbmFtZSwgdXRzLnJlbGVhc2UsIHV0cy5ub2RlbmFtZSwgY3VyX2RhdGUsIHV0cy5tYWNoaW5lLCBHLmNwdV9ucik7Cit9CisKKy8qCisgKiBHZXQgbnVtYmVyIG9mIGludGVycnVwdHMgYXZhaWxhYmxlIHBlciBwcm9jZXNzb3IKKyAqLworc3RhdGljIGludCBnZXRfaXJxY3B1X25yKGNvbnN0IGNoYXIgKmYsIGludCBtYXhfaXJxcykKK3sKKwlGSUxFICpmcDsKKwljaGFyICpsaW5lOworCXVuc2lnbmVkIGxpbmVsZW47CisJdW5zaWduZWQgaXJxOworCisJZnAgPSBmb3Blbl9mb3JfcmVhZChmKTsKKwlpZiAoIWZwKSAgLyogTm8gaW50ZXJydXB0cyBmaWxlICovCisJCXJldHVybiAwOworCisJbGluZWxlbiA9IElOVEVSUlVQVFNfTElORSArIDE2ICogRy5jcHVfbnI7CisJbGluZSA9IHhtYWxsb2MobGluZWxlbik7CisKKwlpcnEgPSAwOworCXdoaWxlIChmZ2V0cyhsaW5lLCBsaW5lbGVuLCBmcCkKKwkgJiYgaXJxIDwgbWF4X2lycXMKKwkpIHsKKwkJaW50IHAgPSBzdHJjc3BuKGxpbmUsICI6Iik7CisJCWlmICgocCA+IDApICYmIChwIDwgMTYpKQorCQkJaXJxKys7CisJfQorCisJZmNsb3NlKGZwKTsKKwlmcmVlKGxpbmUpOworCisJcmV0dXJuIGlycTsKK30KKworLy91c2FnZTojZGVmaW5lIG1wc3RhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1BXSBbLUkgU1VNfENQVXxBTEx8U0NQVV0gWy11XSBbLVAgbnVtfEFMTF0gW0lOVEVSVkFMIFtDT1VOVF1dIgorLy91c2FnZTojZGVmaW5lIG1wc3RhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBlci1wcm9jZXNzb3Igc3RhdGlzdGljc1xuIgorLy91c2FnZTogICAgICJcbgktQQkJCVNhbWUgYXMgLUkgQUxMIC11IC1QIEFMTCIKKy8vdXNhZ2U6ICAgICAiXG4JLUkgU1VNfENQVXxBTEx8U0NQVQlSZXBvcnQgaW50ZXJydXB0IHN0YXRpc3RpY3MiCisvL3VzYWdlOiAgICAgIlxuCS1QIG51bXxBTEwJCVByb2Nlc3NvciB0byBtb25pdG9yIgorLy91c2FnZTogICAgICJcbgktdQkJCVJlcG9ydCBDUFUgdXRpbGl6YXRpb24iCisKK2ludCBtcHN0YXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1wc3RhdF9tYWluKGludCBVTlVTRURfUEFSQU0gYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqb3B0X2lycV9mbXQ7CisJY2hhciAqb3B0X3NldF9jcHU7CisJaW50IGksIG9wdDsKKwllbnVtIHsKKwkJT1BUX0FMTCAgICA9IDEgPDwgMCwgLyogLUEgKi8KKwkJT1BUX0lOVFMgICA9IDEgPDwgMSwgLyogLUkgKi8KKwkJT1BUX1NFVENQVSA9IDEgPDwgMiwgLyogLVAgKi8KKwkJT1BUX1VUSUwgICA9IDEgPDwgMywgLyogLXUgKi8KKwl9OworCisJLyogRG9udCBidWZmZXIgZGF0YSBpZiByZWRpcmVjdGVkIHRvIGEgcGlwZSAqLworCXNldGJ1ZihzdGRvdXQsIE5VTEwpOworCisJSU5JVF9HKCk7CisKKwlHLmludGVydmFsID0gLTE7CisKKwkvKiBHZXQgbnVtYmVyIG9mIHByb2Nlc3NvcnMgKi8KKwlHLmNwdV9uciA9IGdldF9jcHVfY291bnQoKTsKKworCS8qIEdldCBudW1iZXIgb2YgY2xvY2sgdGlja3MgcGVyIHNlYyAqLworCUcuaHogPSBnZXRfaHooKTsKKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgaW50ZXJydXB0cyBwZXIgcHJvY2Vzc29yICovCisJRy5pcnFjcHVfbnIgPSBnZXRfaXJxY3B1X25yKFBST0NGU19JTlRFUlJVUFRTLCBOUl9JUlFTKSArIE5SX0lSUUNQVV9QUkVBTExPQzsKKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2Ygc29mdCBpbnRlcnJ1cHRzIHBlciBwcm9jZXNzb3IgKi8KKwlHLnNvZnRpcnFjcHVfbnIgPSBnZXRfaXJxY3B1X25yKFBST0NGU19TT0ZUSVJRUywgTlJfSVJRUykgKyBOUl9JUlFDUFVfUFJFQUxMT0M7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc3RydWN0dXJlcy4gKyAxIGZvciBnbG9iYWwgc3RydWN0dXJlLiAqLworCWFsbG9jX3N0cnVjdChHLmNwdV9uciArIDEpOworCisJLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIkFJOlA6dSIsICZvcHRfaXJxX2ZtdCwgJm9wdF9zZXRfY3B1KTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICgqYXJndikgeworCQkvKiBHZXQgaW50ZXJ2YWwgKi8KKwkJRy5pbnRlcnZhbCA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwkJRy5jb3VudCA9IC0xOworCQlhcmd2Kys7CisJCWlmICgqYXJndikgeworCQkJLyogR2V0IGNvdW50IHZhbHVlICovCisJCQlpZiAoRy5pbnRlcnZhbCA9PSAwKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCUcuY291bnQgPSB4YXRvaV9wb3NpdGl2ZSgqYXJndik7CisJCQkvL2lmICgqKythcmd2KQorCQkJLy8JYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCWlmIChHLmludGVydmFsIDwgMCkKKwkJRy5pbnRlcnZhbCA9IDA7CisKKwlpZiAob3B0ICYgT1BUX0FMTCkgeworCQlHLnBfb3B0aW9uID0gMTsKKwkJRy5vcHRpb25zIHw9IERfQ1BVICsgRF9JUlFfU1VNICsgRF9JUlFfQ1BVICsgRF9TT0ZUSVJRUzsKKwkJLyogU2VsZWN0IGV2ZXJ5IENQVSAqLworCQltZW1zZXQoRy5jcHVfYml0bWFwLCAweGZmLCBHLmNwdV9iaXRtYXBfbGVuKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX0lOVFMpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgdltdID0geworCQkJRF9JUlFfQ1BVLCBEX0lSUV9TVU0sIERfU09GVElSUVMsCisJCQlEX0lSUV9TVU0gKyBEX0lSUV9DUFUgKyBEX1NPRlRJUlFTCisJCX07CisJCWkgPSBpbmRleF9pbl9zdHJpbmdzKCJDUFVcMFNVTVwwU0NQVVwwQUxMXDAiLCBvcHRfaXJxX2ZtdCk7CisJCWlmIChpID09IC0xKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlHLm9wdGlvbnMgfD0gdltpXTsKKwl9CisKKwlpZiAoKG9wdCAmIE9QVF9VVElMKSAvKiAtdT8gKi8KKwkgfHwgRy5vcHRpb25zID09IDAgIC8qIG5vdGhpbmc/ICh1c2UgZGVmYXVsdCB0aGVuKSAqLworCSkgeworCQlHLm9wdGlvbnMgfD0gRF9DUFU7CisJfQorCisJaWYgKG9wdCAmIE9QVF9TRVRDUFUpIHsKKwkJY2hhciAqdDsKKwkJRy5wX29wdGlvbiA9IDE7CisKKwkJZm9yICh0ID0gc3RydG9rKG9wdF9zZXRfY3B1LCAiLCIpOyB0OyB0ID0gc3RydG9rKE5VTEwsICIsIikpIHsKKwkJCWlmIChzdHJjbXAodCwgIkFMTCIpID09IDApIHsKKwkJCQkvKiBTZWxlY3QgZXZlcnkgQ1BVICovCisJCQkJbWVtc2V0KEcuY3B1X2JpdG1hcCwgMHhmZiwgRy5jcHVfYml0bWFwX2xlbik7CisJCQl9IGVsc2UgeworCQkJCS8qIEdldCBDUFUgbnVtYmVyICovCisJCQkJdW5zaWduZWQgbiA9IHhhdG9pX3Bvc2l0aXZlKHQpOworCQkJCWlmIChuID49IEcuY3B1X25yKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IHRoYXQgbWFueSBwcm9jZXNzb3JzIik7CisJCQkJbisrOworCQkJCUcuY3B1X2JpdG1hcFtuID4+IDNdIHw9IDEgPDwgKG4gJiA3KTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghRy5wX29wdGlvbikKKwkJLyogRGlzcGxheSBnbG9iYWwgc3RhdHMgKi8KKwkJRy5jcHVfYml0bWFwWzBdID0gMTsKKworCS8qIEdldCB0aW1lICovCisJZ2V0X2xvY2FsdGltZSgmRy50aW1lc3RhbXBbMF0pOworCisJLyogRGlzcGxheSBoZWFkZXIgKi8KKwlwcmludF9oZWFkZXIoJkcudGltZXN0YW1wWzBdKTsKKworCS8qIFRoZSBtYWluIGxvb3AgKi8KKwltYWluX2xvb3AoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQkvKiBDbGVhbiB1cCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlmcmVlKEcuc3RfY3B1W2ldKTsKKwkJCWZyZWUoRy5zdF9pcnFbaV0pOworCQkJZnJlZShHLnN0X2lycWNwdVtpXSk7CisJCQlmcmVlKEcuc3Rfc29mdGlycWNwdVtpXSk7CisJCX0KKwkJZnJlZShHLmNwdV9iaXRtYXApOworCQlmcmVlKCZHKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcHJvY3BzL25tZXRlci5jIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL25tZXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTk1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvbm1ldGVyLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEJhc2VkIG9uIG5hbm90b3AuYyBmcm9tIGZsb3BweWZ3IHByb2plY3QKKyAqCisgKiBDb250YWN0IG1lOiB2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20KKyAqLworCisvL2NvbmZpZzpjb25maWcgTk1FVEVSCisvL2NvbmZpZzoJYm9vbCAibm1ldGVyIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFByaW50cyBzZWxlY3RlZCBzeXN0ZW0gc3RhdHMgY29udGludW91c2x5LCBvbmUgbGluZSBwZXIgdXBkYXRlLgorCisvL2FwcGxldDpJRl9OTUVURVIoQVBQTEVUKG5tZXRlciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19OTUVURVIpICs9IG5tZXRlci5vCisKKy8vdXNhZ2U6I2RlZmluZSBubWV0ZXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZCBNU0VDXSBGT1JNQVRfU1RSSU5HIgorLy91c2FnZTojZGVmaW5lIG5tZXRlcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1vbml0b3Igc3lzdGVtIGluIHJlYWwgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuIC1kIE1TRUMJTWlsbGlzZWNvbmRzIGJldHdlZW4gdXBkYXRlcyAoZGVmYXVsdDoxMDAwKSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuRm9ybWF0IHNwZWNpZmllcnM6IgorLy91c2FnZTogICAgICJcbiAlTmMgb3IgJVtjTl0JQ1BVLiBOIC0gYmFyIHNpemUgKGRlZmF1bHQ6MTApIgorLy91c2FnZTogICAgICJcbgkJKGRpc3BsYXlzOiBTOnN5c3RlbSBVOnVzZXIgTjpuaWNlZCBEOmlvd2FpdCBJOmlycSBpOnNvZnRpcnEpIgorLy91c2FnZTogICAgICJcbiAlW25JTlRFUkZBQ0VdCU5ldHdvcmsgSU5URVJGQUNFIgorLy91c2FnZTogICAgICJcbiAlbQkJQWxsb2NhdGVkIG1lbW9yeSIKKy8vdXNhZ2U6ICAgICAiXG4gJVttZl0JCUZyZWUgbWVtb3J5IgorLy91c2FnZTogICAgICJcbiAlW210XQkJVG90YWwgbWVtb3J5IgorLy91c2FnZTogICAgICJcbiAlcwkJQWxsb2NhdGVkIHN3YXAiCisvL3VzYWdlOiAgICAgIlxuICVmCQlOdW1iZXIgb2YgdXNlZCBmaWxlIGRlc2NyaXB0b3JzIgorLy91c2FnZTogICAgICJcbiAlTmkJCVRvdGFsL3NwZWNpZmljIElSUSByYXRlIgorLy91c2FnZTogICAgICJcbiAleAkJQ29udGV4dCBzd2l0Y2ggcmF0ZSIKKy8vdXNhZ2U6ICAgICAiXG4gJXAJCUZvcmtzIgorLy91c2FnZTogICAgICJcbiAlW3BuXQkJIyBvZiBwcm9jZXNzZXMiCisvL3VzYWdlOiAgICAgIlxuICViCQlCbG9jayBpbyIKKy8vdXNhZ2U6ICAgICAiXG4gJU50CQlUaW1lICh3aXRoIE4gZGVjaW1hbCBwb2ludHMpIgorLy91c2FnZTogICAgICJcbiAlcgkJUHJpbnQgPGNyPiBpbnN0ZWFkIG9mIDxsZj4gYXQgRU9MIgorCisvL1RPRE86CisvLyBzaW1wbGlmeSBjb2RlCisvLyAvcHJvYy9sb2NrcworLy8gL3Byb2Mvc3RhdDoKKy8vIGRpc2tfaW86ICgzLDApOigyMjI3MiwxNzg5Nyw0MTA3MDIsNDM3NSw1NDc1MCkKKy8vIGJ0aW1lIDEwNTk0MDE5NjIKKy8vVE9ETzogdXNlIHN5c2luZm8gbGliYyBjYWxsL3N5c2NhbGwsIGlmIGFwcHJvcHJpYXRlCisvLyAoZmFzdGVyIHRoYW4gb3Blbi9yZWFkL2Nsb3NlKToKKy8vIHN5c2luZm8oe3VwdGltZT0xNTAxNywgbG9hZHM9WzU3MjgsIDE1MDQwLCAxNjQ4MF0KKy8vICB0b3RhbHJhbT0yMTA3NDE2NTc2LCBmcmVlcmFtPTIxMTUyNTYzMiwgc2hhcmVkcmFtPTAsIGJ1ZmZlcnJhbT0xNTcyMDQ0ODB9CisvLyAgdG90YWxzd2FwPTEzNDIwOTUzNiwgZnJlZXN3YXA9MTM0MjA5NTM2LCBwcm9jcz0xNTd9KQorCisjaW5jbHVkZSAibGliYmIuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsb25nOworCitlbnVtIHsgIC8qIFByZWZlcmFibHkgdXNlIHBvd2VycyBvZiAyICovCisJUFJPQ19NSU5fRklMRV9TSVpFID0gMjU2LAorCVBST0NfTUFYX0ZJTEVfU0laRSA9IDE2ICogMTAyNCwKK307CisKK3R5cGVkZWYgc3RydWN0IHByb2NfZmlsZSB7CisJY2hhciAqZmlsZTsKKwlpbnQgZmlsZV9zejsKKwlzbWFsbGludCBsYXN0X2dlbjsKK30gcHJvY19maWxlOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHJvY19uYW1lW10gPSB7CisJInN0YXQiLAkJLy8gTXVzdCBtYXRjaCB0aGUgb3JkZXIgb2YgcHJvY19maWxlJ3MhCisJImxvYWRhdmciLAorCSJuZXQvZGV2IiwKKwkibWVtaW5mbyIsCisJImRpc2tzdGF0cyIsCisJInN5cy9mcy9maWxlLW5yIgorfTsKKworc3RydWN0IGdsb2JhbHMgeworCS8vIFNhbXBsZSBnZW5lcmF0aW9uIGZsaXAtZmxvcAorCXNtYWxsaW50IGdlbjsKKwkvLyBMaW51eCAyLjY/IChvdGhlcndpc2UgYXNzdW1lcyAyLjQpCisJc21hbGxpbnQgaXMyNjsKKwkvLyAxIGlmIHNhbXBsZSBkZWxheSBpcyBub3QgYW4gaW50ZWdlciBmcmFjdGlvbiBvZiBhIHNlY29uZAorCXNtYWxsaW50IG5lZWRfc2Vjb25kczsKKwljaGFyICpjdXJfb3V0YnVmOworCWNvbnN0IGNoYXIgKmZpbmFsX3N0cjsKKwlpbnQgZGVsdGE7CisJaW50IGRlbHRhbno7CisJc3RydWN0IHRpbWV2YWwgdHY7CisjZGVmaW5lIGZpcnN0X3Byb2NfZmlsZSBwcm9jX3N0YXQKKwlwcm9jX2ZpbGUgcHJvY19zdGF0OwkvLyBNdXN0IG1hdGNoIHRoZSBvcmRlciBvZiBwcm9jX25hbWUncyEKKwlwcm9jX2ZpbGUgcHJvY19sb2FkYXZnOworCXByb2NfZmlsZSBwcm9jX25ldF9kZXY7CisJcHJvY19maWxlIHByb2NfbWVtaW5mbzsKKwlwcm9jX2ZpbGUgcHJvY19kaXNrc3RhdHM7CisJcHJvY19maWxlIHByb2Nfc3lzX2ZzX2ZpbGVucjsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgZ2VuICAgICAgICAgICAgICAgIChHLmdlbiAgICAgICAgICAgICAgICkKKyNkZWZpbmUgaXMyNiAgICAgICAgICAgICAgIChHLmlzMjYgICAgICAgICAgICAgICkKKyNkZWZpbmUgbmVlZF9zZWNvbmRzICAgICAgIChHLm5lZWRfc2Vjb25kcyAgICAgICkKKyNkZWZpbmUgY3VyX291dGJ1ZiAgICAgICAgIChHLmN1cl9vdXRidWYgICAgICAgICkKKyNkZWZpbmUgZmluYWxfc3RyICAgICAgICAgIChHLmZpbmFsX3N0ciAgICAgICAgICkKKyNkZWZpbmUgZGVsdGEgICAgICAgICAgICAgIChHLmRlbHRhICAgICAgICAgICAgICkKKyNkZWZpbmUgZGVsdGFueiAgICAgICAgICAgIChHLmRlbHRhbnogICAgICAgICAgICkKKyNkZWZpbmUgdHYgICAgICAgICAgICAgICAgIChHLnR2ICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgcHJvY19zdGF0ICAgICAgICAgIChHLnByb2Nfc3RhdCAgICAgICAgICkKKyNkZWZpbmUgcHJvY19sb2FkYXZnICAgICAgIChHLnByb2NfbG9hZGF2ZyAgICAgICkKKyNkZWZpbmUgcHJvY19uZXRfZGV2ICAgICAgIChHLnByb2NfbmV0X2RldiAgICAgICkKKyNkZWZpbmUgcHJvY19tZW1pbmZvICAgICAgIChHLnByb2NfbWVtaW5mbyAgICAgICkKKyNkZWZpbmUgcHJvY19kaXNrc3RhdHMgICAgIChHLnByb2NfZGlza3N0YXRzICAgICkKKyNkZWZpbmUgcHJvY19zeXNfZnNfZmlsZW5yIChHLnByb2Nfc3lzX2ZzX2ZpbGVucikKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwljdXJfb3V0YnVmID0gb3V0YnVmOyBcCisJZmluYWxfc3RyID0gIlxuIjsgXAorCWRlbHRhbnogPSBkZWx0YSA9IDEwMDAwMDA7IFwKK30gd2hpbGUgKDApCisKKy8vIFdlIGRlcGVuZCBvbiB0aGlzIGJlaW5nIGEgY2hhcltdLCBub3QgY2hhciogLSB3ZSB0YWtlIHNpemVvZigpIG9mIGl0CisjZGVmaW5lIG91dGJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfb3V0YnVmKHZvaWQpCit7CisJY3VyX291dGJ1ZiA9IG91dGJ1ZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgb3V0YnVmX2NvdW50KHZvaWQpCit7CisJcmV0dXJuIGN1cl9vdXRidWYgLSBvdXRidWY7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X291dGJ1Zih2b2lkKQoreworCWludCBzeiA9IGN1cl9vdXRidWYgLSBvdXRidWY7CisJaWYgKHN6ID4gMCkgeworCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgb3V0YnVmLCBzeik7CisJCWN1cl9vdXRidWYgPSBvdXRidWY7CisJfQorfQorCitzdGF0aWMgdm9pZCBwdXQoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgc3ogPSBzdHJsZW4ocyk7CisJaWYgKHN6ID4gb3V0YnVmICsgc2l6ZW9mKG91dGJ1ZikgLSBjdXJfb3V0YnVmKQorCQlzeiA9IG91dGJ1ZiArIHNpemVvZihvdXRidWYpIC0gY3VyX291dGJ1ZjsKKwltZW1jcHkoY3VyX291dGJ1Ziwgcywgc3opOworCWN1cl9vdXRidWYgKz0gc3o7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9jKGNoYXIgYykKK3sKKwlpZiAoY3VyX291dGJ1ZiA8IG91dGJ1ZiArIHNpemVvZihvdXRidWYpKQorCQkqY3VyX291dGJ1ZisrID0gYzsKK30KKworc3RhdGljIHZvaWQgcHV0X3F1ZXN0aW9uX21hcmtzKGludCBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQtLSkKKwkJcHV0X2MoJz8nKTsKK30KKworc3RhdGljIHZvaWQgcmVhZGZpbGVfeihwcm9jX2ZpbGUgKnBmLCBjb25zdCBjaGFyKiBmbmFtZSkKK3sKKy8vIG9wZW5fcmVhZF9jbG9zZSgpIHdpbGwgZG8gdHdvIHJlYWRzIGluIG9yZGVyIHRvIGJlIHN1cmUgd2UgYXJlIGF0IEVPRiwKKy8vIGFuZCB3ZSBkb24ndCBuZWVkL3dhbnQgdGhhdC4KKwlpbnQgZmQ7CisJaW50IHN6LCByZHN6OworCWNoYXIgKmJ1ZjsKKworCXN6ID0gcGYtPmZpbGVfc3o7CisJYnVmID0gcGYtPmZpbGU7CisJaWYgKCFidWYpIHsKKwkJYnVmID0geG1hbGxvYyhQUk9DX01JTl9GSUxFX1NJWkUpOworCQlzeiA9IFBST0NfTUlOX0ZJTEVfU0laRTsKKwl9CisgYWdhaW46CisJZmQgPSB4b3BlbihmbmFtZSwgT19SRE9OTFkpOworCWJ1ZlswXSA9ICdcMCc7CisJcmRzeiA9IHJlYWQoZmQsIGJ1Ziwgc3otMSk7CisJY2xvc2UoZmQpOworCWlmIChyZHN6ID4gMCkgeworCQlpZiAocmRzeiA9PSBzei0xICYmIHN6IDwgUFJPQ19NQVhfRklMRV9TSVpFKSB7CisJCQlzeiAqPSAyOworCQkJYnVmID0geHJlYWxsb2MoYnVmLCBzeik7CisJCQlnb3RvIGFnYWluOworCQl9CisJCWJ1ZltyZHN6XSA9ICdcMCc7CisJfQorCXBmLT5maWxlX3N6ID0gc3o7CisJcGYtPmZpbGUgPSBidWY7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBnZXRfZmlsZShwcm9jX2ZpbGUgKnBmKQoreworCWlmIChwZi0+bGFzdF9nZW4gIT0gZ2VuKSB7CisJCXBmLT5sYXN0X2dlbiA9IGdlbjsKKwkJcmVhZGZpbGVfeihwZiwgcHJvY19uYW1lW3BmIC0gJmZpcnN0X3Byb2NfZmlsZV0pOworCX0KKwlyZXR1cm4gcGYtPmZpbGU7Cit9CisKK3N0YXRpYyB1bGxvbmcgcmVhZF9hZnRlcl9zbGFzaChjb25zdCBjaGFyICpwKQoreworCXAgPSBzdHJjaHIocCwgJy8nKTsKKwlpZiAoIXApIHJldHVybiAwOworCXJldHVybiBzdHJ0b3VsbChwKzEsIE5VTEwsIDEwKTsKK30KKworZW51bSBjb252X3R5cGUgeyBjb252X2RlY2ltYWwsIGNvbnZfc2xhc2ggfTsKKworLy8gUmVhZHMgZGVjaW1hbCB2YWx1ZXMgZnJvbSBsaW5lLiBWYWx1ZXMgc3RhcnQgYWZ0ZXIga2V5LCBmb3IgZXhhbXBsZToKKy8vICJjcHUgIDY0OTM2OSAwIDM0MTI5NyA0MzM2NzY5Li4uIiAtIGtleSBpcyAiY3B1IiBoZXJlLgorLy8gVmFsdWVzIGFyZSBzdG9yZWQgaW4gdmVjW10uIGFyZ19wdHIgaGFzIGxpc3Qgb2YgcG9zaXRpb25zCisvLyB3ZSBhcmUgaW50ZXJlc3RlZCBpbjogZm9yIGV4YW1wbGU6IDEsMiw1IC0gd2Ugd2FudCAxc3QsIDJuZCBhbmQgNXRoIHZhbHVlLgorc3RhdGljIGludCB2cmR2YWwoY29uc3QgY2hhciogcCwgY29uc3QgY2hhcioga2V5LAorCWVudW0gY29udl90eXBlIGNvbnYsIHVsbG9uZyAqdmVjLCB2YV9saXN0IGFyZ19wdHIpCit7CisJaW50IGluZGV4bGluZTsKKwlpbnQgaW5kZXhuZXh0OworCisJcCA9IHN0cnN0cihwLCBrZXkpOworCWlmICghcCkgcmV0dXJuIDE7CisKKwlwICs9IHN0cmxlbihrZXkpOworCWluZGV4bGluZSA9IDE7CisJaW5kZXhuZXh0ID0gdmFfYXJnKGFyZ19wdHIsIGludCk7CisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisJCWlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdcMCcpIGJyZWFrOworCisJCWlmIChpbmRleGxpbmUgPT0gaW5kZXhuZXh0KSB7IC8vIHJlYWQgdGhpcyB2YWx1ZQorCQkJKnZlYysrID0gY29udj09Y29udl9kZWNpbWFsID8KKwkJCQlzdHJ0b3VsbChwLCBOVUxMLCAxMCkgOgorCQkJCXJlYWRfYWZ0ZXJfc2xhc2gocCk7CisJCQlpbmRleG5leHQgPSB2YV9hcmcoYXJnX3B0ciwgaW50KTsKKwkJfQorCQl3aGlsZSAoKnAgPiAnICcpIHArKzsgLy8gc2tpcCBvdmVyIHZhbHVlCisJCWluZGV4bGluZSsrOworCX0KKwlyZXR1cm4gMDsKK30KKworLy8gUGFyc2VzIGZpbGVzIHdpdGggbGluZXMgbGlrZSAiY3B1MCAyMTcyNyAwIDE1NzE4IDE4MTM4NTYgOTQ2MSAxMDQ4NSAwIDAiOgorLy8gcmR2YWwoZmlsZV9jb250ZW50cywgInN0cmluZ190b19maW5kIiwgcmVzdWx0X3ZlY3RvciwgdmFsdWUjLCB2YWx1ZSMuLi4pCisvLyB2YWx1ZSMgc3RhcnQgd2l0aCAxCitzdGF0aWMgaW50IHJkdmFsKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGtleSwgdWxsb25nICp2ZWMsIC4uLikKK3sKKwl2YV9saXN0IGFyZ19wdHI7CisJaW50IHJlc3VsdDsKKworCXZhX3N0YXJ0KGFyZ19wdHIsIHZlYyk7CisJcmVzdWx0ID0gdnJkdmFsKHAsIGtleSwgY29udl9kZWNpbWFsLCB2ZWMsIGFyZ19wdHIpOworCXZhX2VuZChhcmdfcHRyKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8vIFBhcnNlcyBmaWxlcyB3aXRoIGxpbmVzIGxpa2UgIi4uLiAuLi4gLi4uIDMvMTQ4IC4uLi4iCitzdGF0aWMgaW50IHJkdmFsX2xvYWRhdmcoY29uc3QgY2hhciogcCwgdWxsb25nICp2ZWMsIC4uLikKK3sKKwl2YV9saXN0IGFyZ19wdHI7CisJaW50IHJlc3VsdDsKKworCXZhX3N0YXJ0KGFyZ19wdHIsIHZlYyk7CisJcmVzdWx0ID0gdnJkdmFsKHAsICIiLCBjb252X3NsYXNoLCB2ZWMsIGFyZ19wdHIpOworCXZhX2VuZChhcmdfcHRyKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8vIFBhcnNlcyAvcHJvYy9kaXNrc3RhdHMKKy8vICAgMSAgMiAzICAgNAkgNSAgICAgICAgNihyZCkgIDcgICAgICA4ICAgICA5ICAgICAxMCh3cikgMTEgICAgIDEyIDEzICAgICAxNAorLy8gICAzICAwIGhkYSA1MTI5MiAxNDQ0MSA4NDE3ODMgOTI2MDUyIDI1NzE3IDc5NjUwIDg0MzI1NiAzMDI5ODA0IDAgMTQ4NDU5IDM5NTY5MzMKKy8vICAgMyAgMSBoZGExIDAgMCAwIDAgPC0gaWdub3JlIGlmIG9ubHkgNCBmaWVsZHMKK3N0YXRpYyBpbnQgcmR2YWxfZGlza3N0YXRzKGNvbnN0IGNoYXIqIHAsIHVsbG9uZyAqdmVjKQoreworCXVsbG9uZyByZCA9IHJkOyAvLyBmb3IgY29tcGlsZXIKKwlpbnQgaW5kZXhsaW5lID0gMDsKKwl2ZWNbMF0gPSAwOworCXZlY1sxXSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW5kZXhsaW5lKys7CisJCXdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykgcCsrOworCQlpZiAoKnAgPT0gJ1wwJykgYnJlYWs7CisJCWlmICgqcCA9PSAnXG4nKSB7CisJCQlpbmRleGxpbmUgPSAwOworCQkJcCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGluZGV4bGluZSA9PSA2KSB7CisJCQlyZCA9IHN0cnRvdWxsKHAsIE5VTEwsIDEwKTsKKwkJfSBlbHNlIGlmIChpbmRleGxpbmUgPT0gMTApIHsKKwkJCXZlY1swXSArPSByZDsgIC8vIFRPRE86ICpzZWN0b3JzaXplIChkb24ndCBrbm93IGhvdyB0byBmaW5kIG91dCBzZWN0b3JzaXplKQorCQkJdmVjWzFdICs9IHN0cnRvdWxsKHAsIE5VTEwsIDEwKTsKKwkJCXdoaWxlICgqcCAhPSAnXG4nICYmICpwICE9ICdcMCcpIHArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdoaWxlICgqcCA+ICcgJykgcCsrOyAvLyBza2lwIG92ZXIgdmFsdWUKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjYWxlKHVsbG9uZyB1bCkKK3sKKwljaGFyIGJ1Zls1XTsKKworCS8qIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RlcmEgKi8KKwlzbWFydF91bGx0b2E0KHVsLCBidWYsICIga21ndHBlenkiKTsKKwlidWZbNF0gPSAnXDAnOworCXB1dChidWYpOworfQorCisKKyNkZWZpbmUgU19TVEFUKGEpIFwKK3R5cGVkZWYgc3RydWN0IGEgeyBcCisJc3RydWN0IHNfc3RhdCAqbmV4dDsgXAorCXZvaWQgKCpjb2xsZWN0KShzdHJ1Y3QgYSAqcykgRkFTVF9GVU5DOyBcCisJY29uc3QgY2hhciAqbGFiZWw7CisjZGVmaW5lIFNfU1RBVF9FTkQoYSkgfSBhOworCitTX1NUQVQoc19zdGF0KQorU19TVEFUX0VORChzX3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2xpdGVyYWwoc19zdGF0ICpzIFVOVVNFRF9QQVJBTSkKK3sKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9saXRlcmFsKHZvaWQpCit7CisJc19zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9saXRlcmFsOworCXJldHVybiAoc19zdGF0KilzOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2RlbGF5KGNvbnN0IGNoYXIgKnBhcmFtKQoreworCWRlbHRhID0gc3RydG91bChwYXJhbSwgTlVMTCwgMCkgKiAxMDAwOyAvKiBwYXJhbSBjYW4gYmUgIiIgKi8KKwlkZWx0YW56ID0gZGVsdGEgPiAwID8gZGVsdGEgOiAxOworCW5lZWRfc2Vjb25kcyA9ICgxMDAwMDAwJWRlbHRhbnopICE9IDA7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfY3IoY29uc3QgY2hhciAqcGFyYW0gVU5VU0VEX1BBUkFNKQoreworCWZpbmFsX3N0ciA9ICJcciI7CisJcmV0dXJuIChzX3N0YXQqKTA7Cit9CisKKworLy8gICAgIHVzZXIgbmljZSBzeXN0ZW0gaWRsZSAgaW93YWl0IGlycSAgc29mdGlycSAobGFzdCAzIG9ubHkgaW4gMi42KQorLy9jcHUgIDY0OTM2OSAwIDM0MTI5NyA0MzM2NzY5IDExNjQwIDcxMjIgMTE4MworLy9jcHVOIDY0OTM2OSAwIDM0MTI5NyA0MzM2NzY5IDExNjQwIDcxMjIgMTE4MworZW51bSB7IENQVV9GSUVMRENOVCA9IDcgfTsKK1NfU1RBVChjcHVfc3RhdCkKKwl1bGxvbmcgb2xkW0NQVV9GSUVMRENOVF07CisJaW50IGJhcl9zejsKKwljaGFyICpiYXI7CitTX1NUQVRfRU5EKGNwdV9zdGF0KQorCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2NwdShjcHVfc3RhdCAqcykKK3sKKwl1bGxvbmcgZGF0YVtDUFVfRklFTERDTlRdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisJdW5zaWduZWQgZnJhY1tDUFVfRklFTERDTlRdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisJdWxsb25nIGFsbCA9IDA7CisJaW50IG5vcm1fYWxsID0gMDsKKwlpbnQgYmFyX3N6ID0gcy0+YmFyX3N6OworCWNoYXIgKmJhciA9IHMtPmJhcjsKKwlpbnQgaTsKKworCWlmIChyZHZhbChnZXRfZmlsZSgmcHJvY19zdGF0KSwgImNwdSAiLCBkYXRhLCAxLCAyLCAzLCA0LCA1LCA2LCA3KSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoYmFyX3N6KTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBDUFVfRklFTERDTlQ7IGkrKykgeworCQl1bGxvbmcgb2xkID0gcy0+b2xkW2ldOworCQlpZiAoZGF0YVtpXSA8IG9sZCkgb2xkID0gZGF0YVtpXTsJCS8vc2FuaXRpemUKKwkJcy0+b2xkW2ldID0gZGF0YVtpXTsKKwkJYWxsICs9IChkYXRhW2ldIC09IG9sZCk7CisJfQorCisJaWYgKGFsbCkgeworCQlmb3IgKGkgPSAwOyBpIDwgQ1BVX0ZJRUxEQ05UOyBpKyspIHsKKwkJCXVsbG9uZyB0ID0gYmFyX3N6ICogZGF0YVtpXTsKKwkJCW5vcm1fYWxsICs9IGRhdGFbaV0gPSB0IC8gYWxsOworCQkJZnJhY1tpXSA9IHQgJSBhbGw7CisJCX0KKworCQl3aGlsZSAobm9ybV9hbGwgPCBiYXJfc3opIHsKKwkJCXVuc2lnbmVkIG1heCA9IGZyYWNbMF07CisJCQlpbnQgcG9zID0gMDsKKwkJCWZvciAoaSA9IDE7IGkgPCBDUFVfRklFTERDTlQ7IGkrKykgeworCQkJCWlmIChmcmFjW2ldID4gbWF4KSBtYXggPSBmcmFjW2ldLCBwb3MgPSBpOworCQkJfQorCQkJZnJhY1twb3NdID0gMDsJLy9hdm9pZCBidW1waW5nIHVwIHNhbWUgdmFsdWUgdHdpY2UKKwkJCWRhdGFbcG9zXSsrOworCQkJbm9ybV9hbGwrKzsKKwkJfQorCisJCW1lbXNldChiYXIsICcuJywgYmFyX3N6KTsKKwkJbWVtc2V0KGJhciwgJ1MnLCBkYXRhWzJdKTsgYmFyICs9IGRhdGFbMl07IC8vc3lzCisJCW1lbXNldChiYXIsICdVJywgZGF0YVswXSk7IGJhciArPSBkYXRhWzBdOyAvL3VzcgorCQltZW1zZXQoYmFyLCAnTicsIGRhdGFbMV0pOyBiYXIgKz0gZGF0YVsxXTsgLy9uaWNlCisJCW1lbXNldChiYXIsICdEJywgZGF0YVs0XSk7IGJhciArPSBkYXRhWzRdOyAvL2lvd2FpdAorCQltZW1zZXQoYmFyLCAnSScsIGRhdGFbNV0pOyBiYXIgKz0gZGF0YVs1XTsgLy9pcnEKKwkJbWVtc2V0KGJhciwgJ2knLCBkYXRhWzZdKTsgYmFyICs9IGRhdGFbNl07IC8vc29mdGlycQorCX0gZWxzZSB7CisJCW1lbXNldChiYXIsICc/JywgYmFyX3N6KTsKKwl9CisJcHV0KHMtPmJhcik7Cit9CisKKworc3RhdGljIHNfc3RhdCogaW5pdF9jcHUoY29uc3QgY2hhciAqcGFyYW0pCit7CisJaW50IHN6OworCWNwdV9zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9jcHU7CisJc3ogPSBzdHJ0b3VsKHBhcmFtLCBOVUxMLCAwKTsgLyogcGFyYW0gY2FuIGJlICIiICovCisJaWYgKHN6IDwgMTApIHN6ID0gMTA7CisJaWYgKHN6ID4gMTAwMCkgc3ogPSAxMDAwOworCXMtPmJhciA9IHh6YWxsb2Moc3orMSk7CisJLypzLT5iYXJbc3pdID0gJ1wwJzsgLSB4emFsbG9jIGRpZCBpdCAqLworCXMtPmJhcl9zeiA9IHN6OworCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVChpbnRfc3RhdCkKKwl1bGxvbmcgb2xkOworCWludCBubzsKK1NfU1RBVF9FTkQoaW50X3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2ludChpbnRfc3RhdCAqcykKK3sKKwl1bGxvbmcgZGF0YVsxXTsKKwl1bGxvbmcgb2xkOworCisJaWYgKHJkdmFsKGdldF9maWxlKCZwcm9jX3N0YXQpLCAiaW50ciIsIGRhdGEsIHMtPm5vKSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoNCk7CisJCXJldHVybjsKKwl9CisKKwlvbGQgPSBzLT5vbGQ7CisJaWYgKGRhdGFbMF0gPCBvbGQpIG9sZCA9IGRhdGFbMF07CQkvL3Nhbml0aXplCisJcy0+b2xkID0gZGF0YVswXTsKKwlzY2FsZShkYXRhWzBdIC0gb2xkKTsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9pbnQoY29uc3QgY2hhciAqcGFyYW0pCit7CisJaW50X3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X2ludDsKKwlpZiAocGFyYW1bMF0gPT0gJ1wwJykgeworCQlzLT5ubyA9IDE7CisJfSBlbHNlIHsKKwkJaW50IG4gPSB4YXRvaV9wb3NpdGl2ZShwYXJhbSk7CisJCXMtPm5vID0gbiArIDI7CisJfQorCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVChjdHhfc3RhdCkKKwl1bGxvbmcgb2xkOworU19TVEFUX0VORChjdHhfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfY3R4KGN0eF9zdGF0ICpzKQoreworCXVsbG9uZyBkYXRhWzFdOworCXVsbG9uZyBvbGQ7CisKKwlpZiAocmR2YWwoZ2V0X2ZpbGUoJnByb2Nfc3RhdCksICJjdHh0IiwgZGF0YSwgMSkpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDQpOworCQlyZXR1cm47CisJfQorCisJb2xkID0gcy0+b2xkOworCWlmIChkYXRhWzBdIDwgb2xkKSBvbGQgPSBkYXRhWzBdOwkJLy9zYW5pdGl6ZQorCXMtPm9sZCA9IGRhdGFbMF07CisJc2NhbGUoZGF0YVswXSAtIG9sZCk7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfY3R4KGNvbnN0IGNoYXIgKnBhcmFtIFVOVVNFRF9QQVJBTSkKK3sKKwljdHhfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfY3R4OworCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVChibGtfc3RhdCkKKwljb25zdCBjaGFyKiBsb29rZm9yOworCXVsbG9uZyBvbGRbMl07CitTX1NUQVRfRU5EKGJsa19zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9ibGsoYmxrX3N0YXQgKnMpCit7CisJdWxsb25nIGRhdGFbMl07CisJaW50IGk7CisKKwlpZiAoaXMyNikgeworCQlpID0gcmR2YWxfZGlza3N0YXRzKGdldF9maWxlKCZwcm9jX2Rpc2tzdGF0cyksIGRhdGEpOworCX0gZWxzZSB7CisJCWkgPSByZHZhbChnZXRfZmlsZSgmcHJvY19zdGF0KSwgcy0+bG9va2ZvciwgZGF0YSwgMSwgMik7CisJCS8vIExpbnV4IDIuNCByZXBvcnRzIGJpbyBpbiBLYnl0ZXMsIGNvbnZlcnQgdG8gc2VjdG9yczoKKwkJZGF0YVswXSAqPSAyOworCQlkYXRhWzFdICo9IDI7CisJfQorCWlmIChpKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg5KTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaT0wOyBpPDI7IGkrKykgeworCQl1bGxvbmcgb2xkID0gcy0+b2xkW2ldOworCQlpZiAoZGF0YVtpXSA8IG9sZCkgb2xkID0gZGF0YVtpXTsJCS8vc2FuaXRpemUKKwkJcy0+b2xkW2ldID0gZGF0YVtpXTsKKwkJZGF0YVtpXSAtPSBvbGQ7CisJfQorCXNjYWxlKGRhdGFbMF0qNTEyKTsgLy8gVE9ETzogKnNlY3RvcnNpemUKKwlwdXRfYygnICcpOworCXNjYWxlKGRhdGFbMV0qNTEyKTsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9ibGsoY29uc3QgY2hhciAqcGFyYW0gVU5VU0VEX1BBUkFNKQoreworCWJsa19zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9ibGs7CisJcy0+bG9va2ZvciA9ICJwYWdlIjsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQoZm9ya19zdGF0KQorCXVsbG9uZyBvbGQ7CitTX1NUQVRfRU5EKGZvcmtfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfdGhyZWFkX25yKGZvcmtfc3RhdCAqcyBVTlVTRURfUEFSQU0pCit7CisJdWxsb25nIGRhdGFbMV07CisKKwlpZiAocmR2YWxfbG9hZGF2ZyhnZXRfZmlsZSgmcHJvY19sb2FkYXZnKSwgZGF0YSwgNCkpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDQpOworCQlyZXR1cm47CisJfQorCXNjYWxlKGRhdGFbMF0pOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9mb3JrKGZvcmtfc3RhdCAqcykKK3sKKwl1bGxvbmcgZGF0YVsxXTsKKwl1bGxvbmcgb2xkOworCisJaWYgKHJkdmFsKGdldF9maWxlKCZwcm9jX3N0YXQpLCAicHJvY2Vzc2VzIiwgZGF0YSwgMSkpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDQpOworCQlyZXR1cm47CisJfQorCisJb2xkID0gcy0+b2xkOworCWlmIChkYXRhWzBdIDwgb2xkKSBvbGQgPSBkYXRhWzBdOwkvL3Nhbml0aXplCisJcy0+b2xkID0gZGF0YVswXTsKKwlzY2FsZShkYXRhWzBdIC0gb2xkKTsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9mb3JrKGNvbnN0IGNoYXIgKnBhcmFtKQoreworCWZvcmtfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJaWYgKCpwYXJhbSA9PSAnbicpIHsKKwkJcy0+Y29sbGVjdCA9IGNvbGxlY3RfdGhyZWFkX25yOworCX0gZWxzZSB7CisJCXMtPmNvbGxlY3QgPSBjb2xsZWN0X2Zvcms7CisJfQorCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVChpZl9zdGF0KQorCXVsbG9uZyBvbGRbNF07CisJY29uc3QgY2hhciAqZGV2aWNlOworCWNoYXIgKmRldmljZV9jb2xvbjsKK1NfU1RBVF9FTkQoaWZfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfaWYoaWZfc3RhdCAqcykKK3sKKwl1bGxvbmcgZGF0YVs0XTsKKwlpbnQgaTsKKworCWlmIChyZHZhbChnZXRfZmlsZSgmcHJvY19uZXRfZGV2KSwgcy0+ZGV2aWNlX2NvbG9uLCBkYXRhLCAxLCAzLCA5LCAxMSkpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDEwKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQl1bGxvbmcgb2xkID0gcy0+b2xkW2ldOworCQlpZiAoZGF0YVtpXSA8IG9sZCkgb2xkID0gZGF0YVtpXTsJCS8vc2FuaXRpemUKKwkJcy0+b2xkW2ldID0gZGF0YVtpXTsKKwkJZGF0YVtpXSAtPSBvbGQ7CisJfQorCXB1dF9jKGRhdGFbMV0gPyAnKicgOiAnICcpOworCXNjYWxlKGRhdGFbMF0pOworCXB1dF9jKGRhdGFbM10gPyAnKicgOiAnICcpOworCXNjYWxlKGRhdGFbMl0pOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2lmKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwlpZl9zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKworCWlmICghZGV2aWNlIHx8ICFkZXZpY2VbMF0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9pZjsKKworCXMtPmRldmljZSA9IGRldmljZTsKKwlzLT5kZXZpY2VfY29sb24gPSB4YXNwcmludGYoIiVzOiIsIGRldmljZSk7CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKG1lbV9zdGF0KQorCWNoYXIgb3B0OworU19TVEFUX0VORChtZW1fc3RhdCkKKworLy8gIk1lbW9yeSIgdmFsdWUgc2hvdWxkIG5vdCBpbmNsdWRlIGFueSBjYWNoZXMuCisvLyBJT1c6IG5laXRoZXIgImxzIC1sYVIgLyIgbm9yIGhlYXZ5IHJlYWQvd3JpdGUgYWN0aXZpdHkKKy8vICAgICAgc2hvdWxkIGFmZmVjdCBpdC4gV2UnZCBsaWtlIHRvIGFsc28gaW5jbHVkZSBhbnkKKy8vICAgICAgbG9uZy10ZXJtIGFsbG9jYXRlZCBrZXJuZWwtc2lkZSBtZW0sIGJ1dCBpdCBpcyBoYXJkCisvLyAgICAgIHRvIGZpZ3VyZSBvdXQuIEZvciBub3csIGJ1ZnMsIGNhY2hlZCAmIHNsYWIgYXJlCisvLyAgICAgIGNvdW50ZWQgYXMgImZyZWUiIG1lbW9yeQorLy8yLjYuMTY6CisvL01lbVRvdGFsOiAgICAgICA3NzMyODAga0IKKy8vTWVtRnJlZTogICAgICAgICAyNTkxMiBrQiAtIGdlbnVpbmVseSBmcmVlCisvL0J1ZmZlcnM6ICAgICAgICAzMjA2NzIga0IgLSBjYWNoZQorLy9DYWNoZWQ6ICAgICAgICAgMTQ2Mzk2IGtCIC0gY2FjaGUKKy8vU3dhcENhY2hlZDogICAgICAgICAgMCBrQgorLy9BY3RpdmU6ICAgICAgICAgMTgzMDY0IGtCCisvL0luYWN0aXZlOiAgICAgICAzNTY4OTIga0IKKy8vSGlnaFRvdGFsOiAgICAgICAgICAgMCBrQgorLy9IaWdoRnJlZTogICAgICAgICAgICAwIGtCCisvL0xvd1RvdGFsOiAgICAgICA3NzMyODAga0IKKy8vTG93RnJlZTogICAgICAgICAyNTkxMiBrQgorLy9Td2FwVG90YWw6ICAgICAgMTMxMDY0IGtCCisvL1N3YXBGcmVlOiAgICAgICAxMzEwNjQga0IKKy8vRGlydHk6ICAgICAgICAgICAgICA0OCBrQgorLy9Xcml0ZWJhY2s6ICAgICAgICAgICAwIGtCCisvL01hcHBlZDogICAgICAgICAgOTY2MjAga0IKKy8vU2xhYjogICAgICAgICAgIDIwMDY2OCBrQiAtIHRha2VzIDcgTWIgb24gbXkgYm94IGZyZXNoIGFmdGVyIGJvb3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaW5jbHVkZXMgZGVudHJpZXMgYW5kIGlub2RlcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgKD09IGNhbiB0YWtlIGFyYml0cmFyeSBhbW91bnQgb2YgbWVtKQorLy9Db21taXRMaW1pdDogICAgNTE3NzA0IGtCCisvL0NvbW1pdHRlZF9BUzogICAyMzY3NzYga0IKKy8vUGFnZVRhYmxlczogICAgICAgMTI0OCBrQgorLy9WbWFsbG9jVG90YWw6ICAgNTE2MDUyIGtCCisvL1ZtYWxsb2NVc2VkOiAgICAgIDM4NTIga0IKKy8vVm1hbGxvY0NodW5rOiAgIDUxMjA5NiBrQgorLy9IdWdlUGFnZXNfVG90YWw6ICAgICAwCisvL0h1Z2VQYWdlc19GcmVlOiAgICAgIDAKKy8vSHVnZXBhZ2VzaXplOiAgICAgNDA5NiBrQgorc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfbWVtKG1lbV9zdGF0ICpzKQoreworCXVsbG9uZyBtX3RvdGFsID0gMDsKKwl1bGxvbmcgbV9mcmVlID0gMDsKKwl1bGxvbmcgbV9idWZzID0gMDsKKwl1bGxvbmcgbV9jYWNoZWQgPSAwOworCXVsbG9uZyBtX3NsYWIgPSAwOworCisJaWYgKHJkdmFsKGdldF9maWxlKCZwcm9jX21lbWluZm8pLCAiTWVtVG90YWw6IiwgJm1fdG90YWwsIDEpKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg0KTsKKwkJcmV0dXJuOworCX0KKwlpZiAocy0+b3B0ID09ICd0JykgeworCQlzY2FsZShtX3RvdGFsIDw8IDEwKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZHZhbChwcm9jX21lbWluZm8uZmlsZSwgIk1lbUZyZWU6IiwgJm1fZnJlZSAgLCAxKQorCSB8fCByZHZhbChwcm9jX21lbWluZm8uZmlsZSwgIkJ1ZmZlcnM6IiwgJm1fYnVmcyAgLCAxKQorCSB8fCByZHZhbChwcm9jX21lbWluZm8uZmlsZSwgIkNhY2hlZDoiLCAgJm1fY2FjaGVkLCAxKQorCSB8fCByZHZhbChwcm9jX21lbWluZm8uZmlsZSwgIlNsYWI6IiwgICAgJm1fc2xhYiAgLCAxKQorCSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoNCk7CisJCXJldHVybjsKKwl9CisKKwltX2ZyZWUgKz0gbV9idWZzICsgbV9jYWNoZWQgKyBtX3NsYWI7CisJc3dpdGNoIChzLT5vcHQpIHsKKwljYXNlICdmJzoKKwkJc2NhbGUobV9mcmVlIDw8IDEwKTsgYnJlYWs7CisJZGVmYXVsdDoKKwkJc2NhbGUoKG1fdG90YWwgLSBtX2ZyZWUpIDw8IDEwKTsgYnJlYWs7CisJfQorfQorCitzdGF0aWMgc19zdGF0KiBpbml0X21lbShjb25zdCBjaGFyICpwYXJhbSkKK3sKKwltZW1fc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfbWVtOworCXMtPm9wdCA9IHBhcmFtWzBdOworCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVChzd3Bfc3RhdCkKK1NfU1RBVF9FTkQoc3dwX3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X3N3cChzd3Bfc3RhdCAqcyBVTlVTRURfUEFSQU0pCit7CisJdWxsb25nIHNfdG90YWxbMV07CisJdWxsb25nIHNfZnJlZVsxXTsKKwlpZiAocmR2YWwoZ2V0X2ZpbGUoJnByb2NfbWVtaW5mbyksICJTd2FwVG90YWw6Iiwgc190b3RhbCwgMSkKKwkgfHwgcmR2YWwocHJvY19tZW1pbmZvLmZpbGUsICAgICAgICJTd2FwRnJlZToiICwgc19mcmVlLCAgMSkKKwkpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDQpOworCQlyZXR1cm47CisJfQorCXNjYWxlKChzX3RvdGFsWzBdLXNfZnJlZVswXSkgPDwgMTApOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X3N3cChjb25zdCBjaGFyICpwYXJhbSBVTlVTRURfUEFSQU0pCit7CisJc3dwX3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X3N3cDsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQoZmRfc3RhdCkKK1NfU1RBVF9FTkQoZmRfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfZmQoZmRfc3RhdCAqcyBVTlVTRURfUEFSQU0pCit7CisJdWxsb25nIGRhdGFbMl07CisKKwlpZiAocmR2YWwoZ2V0X2ZpbGUoJnByb2Nfc3lzX2ZzX2ZpbGVuciksICIiLCBkYXRhLCAxLCAyKSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoNCk7CisJCXJldHVybjsKKwl9CisKKwlzY2FsZShkYXRhWzBdIC0gZGF0YVsxXSk7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfZmQoY29uc3QgY2hhciAqcGFyYW0gVU5VU0VEX1BBUkFNKQoreworCWZkX3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X2ZkOworCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVCh0aW1lX3N0YXQpCisJaW50IHByZWM7CisJaW50IHNjYWxlOworU19TVEFUX0VORCh0aW1lX3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X3RpbWUodGltZV9zdGF0ICpzKQoreworCWNoYXIgYnVmW3NpemVvZigiMTI6MzQ6NTYuMTIzNDU2IildOworCXN0cnVjdCB0bSogdG07CisJaW50IHVzID0gdHYudHZfdXNlYyArIHMtPnNjYWxlLzI7CisJdGltZV90IHQgPSB0di50dl9zZWM7CisKKwlpZiAodXMgPj0gMTAwMDAwMCkgeworCQl0Kys7CisJCXVzIC09IDEwMDAwMDA7CisJfQorCXRtID0gbG9jYWx0aW1lKCZ0KTsKKworCXNwcmludGYoYnVmLCAiJTAyZDolMDJkOiUwMmQiLCB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisJaWYgKHMtPnByZWMpCisJCXNwcmludGYoYnVmKzgsICIuJTAqZCIsIHMtPnByZWMsIHVzIC8gcy0+c2NhbGUpOworCXB1dChidWYpOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X3RpbWUoY29uc3QgY2hhciAqcGFyYW0pCit7CisJaW50IHByZWM7CisJdGltZV9zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X3RpbWU7CisJcHJlYyA9IHBhcmFtWzBdIC0gJzAnOworCWlmIChwcmVjIDwgMCkgcHJlYyA9IDA7CisJZWxzZSBpZiAocHJlYyA+IDYpIHByZWMgPSA2OworCXMtPnByZWMgPSBwcmVjOworCXMtPnNjYWxlID0gMTsKKwl3aGlsZSAocHJlYysrIDwgNikKKwkJcy0+c2NhbGUgKj0gMTA7CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2luZm8oc19zdGF0ICpzKQoreworCWdlbiBePSAxOworCXdoaWxlIChzKSB7CisJCXB1dChzLT5sYWJlbCk7CisJCXMtPmNvbGxlY3Qocyk7CisJCXMgPSBzLT5uZXh0OworCX0KK30KKworCit0eXBlZGVmIHNfc3RhdCogaW5pdF9mdW5jKGNvbnN0IGNoYXIgKnBhcmFtKTsKKworLy8gRGVwcmVjYXRlZCAlTk5OZCBpcyB0byBiZSByZW1vdmVkLCAtZCBNU0VDIHN1cGVyc2VkZXMgaXQKK3N0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPSAibmNtc2ZpeHB0YmRyIjsKK3N0YXRpYyBpbml0X2Z1bmMgKmNvbnN0IGluaXRfZnVuY3Rpb25zW10gPSB7CisJaW5pdF9pZiwKKwlpbml0X2NwdSwKKwlpbml0X21lbSwKKwlpbml0X3N3cCwKKwlpbml0X2ZkLAorCWluaXRfaW50LAorCWluaXRfY3R4LAorCWluaXRfZm9yaywKKwlpbml0X3RpbWUsCisJaW5pdF9ibGssCisJaW5pdF9kZWxheSwKKwlpbml0X2NyCit9OworCitpbnQgbm1ldGVyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBubWV0ZXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgYnVmWzMyXTsKKwlzX3N0YXQgKmZpcnN0ID0gTlVMTDsKKwlzX3N0YXQgKmxhc3QgPSBOVUxMOworCXNfc3RhdCAqczsKKwljaGFyICpvcHRfZDsKKwljaGFyICpjdXIsICpwcmV2OworCisJSU5JVF9HKCk7CisKKwl4Y2hkaXIoIi9wcm9jIik7CisKKwlpZiAob3Blbl9yZWFkX2Nsb3NlKCJ2ZXJzaW9uIiwgYnVmLCBzaXplb2YoYnVmKS0xKSA+IDApIHsKKwkJYnVmW3NpemVvZihidWYpLTFdID0gJ1wwJzsKKwkJaXMyNiA9IChzdHJzdHIoYnVmLCAiIDIuNC4iKSA9PSBOVUxMKTsKKwl9CisKKwlpZiAoZ2V0b3B0MzIoYXJndiwgImQ6IiwgJm9wdF9kKSkKKwkJaW5pdF9kZWxheShvcHRfZCk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoIWFyZ3ZbMF0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8vIENhbiB1c2UgYXJndlswXSBkaXJlY3RseSwgYnV0IHRoaXMgd2lsbCBtZXNzIHVwCisJLy8gcGFyYW1ldGVycyBhcyBzZWVuIGJ5IGUuZy4gcHMuIE1ha2luZyBhIGNvcHkuLi4KKwljdXIgPSB4c3RyZHVwKGFyZ3ZbMF0pOworCXdoaWxlICgxKSB7CisJCWNoYXIgKnBhcmFtLCAqcDsKKwkJcHJldiA9IGN1cjsKKyBhZ2FpbjoKKwkJY3VyID0gc3RyY2hyKGN1ciwgJyUnKTsKKwkJaWYgKCFjdXIpCisJCQlicmVhazsKKwkJaWYgKGN1clsxXSA9PSAnJScpIHsJLy8gJSUKKwkJCW92ZXJsYXBwaW5nX3N0cmNweShjdXIsIGN1ciArIDEpOworCQkJY3VyKys7CisJCQlnb3RvIGFnYWluOworCQl9CisJCSpjdXIrKyA9ICdcMCc7CQkvLyBvdmVyd3JpdGUgJQorCQlpZiAoY3VyWzBdID09ICdbJykgeworCQkJLy8gZm9ybWF0OiAlW2ZvcHRzdHJpbmddCisJCQljdXIrKzsKKwkJCXAgPSBzdHJjaHIob3B0aW9ucywgY3VyWzBdKTsKKwkJCXBhcmFtID0gY3VyKzE7CisJCQl3aGlsZSAoY3VyWzBdICE9ICddJykgeworCQkJCWlmICghY3VyWzBdKQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJY3VyKys7CisJCQl9CisJCQkqY3VyKysgPSAnXDAnOwkvLyBvdmVyd3JpdGUgWworCQl9IGVsc2UgeworCQkJLy8gZm9ybWF0OiAlTk5OTk5OZgorCQkJcGFyYW0gPSBjdXI7CisJCQl3aGlsZSAoY3VyWzBdID49ICcwJyAmJiBjdXJbMF0gPD0gJzknKQorCQkJCWN1cisrOworCQkJaWYgKCFjdXJbMF0pCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJcCA9IHN0cmNocihvcHRpb25zLCBjdXJbMF0pOworCQkJKmN1cisrID0gJ1wwJzsJLy8gb3ZlcndyaXRlIGZvcm1hdCBjaGFyCisJCX0KKwkJaWYgKCFwKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlzID0gaW5pdF9mdW5jdGlvbnNbcC1vcHRpb25zXShwYXJhbSk7CisJCWlmIChzKSB7CisJCQlzLT5sYWJlbCA9IHByZXY7CisJCQkvKnMtPm5leHQgPSBOVUxMOyAtIGFsbCBpbml0WFhYIGZ1bmNzIHVzZSB4emFsbG9jICovCisJCQlpZiAoIWZpcnN0KQorCQkJCWZpcnN0ID0gczsKKwkJCWVsc2UKKwkJCQlsYXN0LT5uZXh0ID0gczsKKwkJCWxhc3QgPSBzOworCQl9IGVsc2UgeworCQkJLy8gJU5OTk5kIG9yICVyIG9wdGlvbi4gcmVtb3ZlIGl0IGZyb20gc3RyaW5nCisJCQlzdHJjcHkocHJldiArIHN0cmxlbihwcmV2KSwgY3VyKTsKKwkJCWN1ciA9IHByZXY7CisJCX0KKwl9CisJaWYgKHByZXZbMF0pIHsKKwkJcyA9IGluaXRfbGl0ZXJhbCgpOworCQlzLT5sYWJlbCA9IHByZXY7CisJCS8qcy0+bmV4dCA9IE5VTEw7IC0gYWxsIGluaXRYWFggZnVuY3MgdXNlIHh6YWxsb2MgKi8KKwkJaWYgKCFmaXJzdCkKKwkJCWZpcnN0ID0gczsKKwkJZWxzZQorCQkJbGFzdC0+bmV4dCA9IHM7CisJCWxhc3QgPSBzOworCX0KKworCS8vIEdlbmVyYXRlIGZpcnN0IHNhbXBsZXMgYnV0IGRvIG5vdCBwcmludCB0aGVtLCB0aGV5J3JlIGJvZ3VzCisJY29sbGVjdF9pbmZvKGZpcnN0KTsKKwlyZXNldF9vdXRidWYoKTsKKwlpZiAoZGVsdGEgPj0gMCkgeworCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkJdXNsZWVwKGRlbHRhID4gMTAwMDAwMCA/IDEwMDAwMDAgOiBkZWx0YSAtIHR2LnR2X3VzZWMlZGVsdGFueik7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCWNvbGxlY3RfaW5mbyhmaXJzdCk7CisJCXB1dChmaW5hbF9zdHIpOworCQlwcmludF9vdXRidWYoKTsKKworCQkvLyBOZWdhdGl2ZSBkZWx0YSAtPiBubyB1c2xlZXAgYXQgYWxsCisJCS8vIFRoaXMgd2lsbCBob2cgdGhlIENQVSBidXQgeW91IGNhbiBoYXZlIFJFQUxMWSBHT09ECisJCS8vIHRpbWUgcmVzb2x1dGlvbiA7KQorCQkvLyBUT0RPOiBkZXRlY3QgYW5kIGF2b2lkIHVzZWxlc3MgdXBkYXRlcworCQkvLyAobGlrZTogbm90aGluZyBoYXBwZW5zIGV4Y2VwdCB0aW1lKQorCQlpZiAoZGVsdGEgPj0gMCkgeworCQkJaW50IHJlbTsKKwkJCS8vIGNhbiBiZSBjb21tZW50ZWQgb3V0LCB3aWxsIHNhY3JpZmljZSBzbGVlcCB0aW1lIHByZWNpc2lvbiBhIGJpdAorCQkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCQlpZiAobmVlZF9zZWNvbmRzKQorCQkJCXJlbSA9IGRlbHRhIC0gKCh1bGxvbmcpdHYudHZfc2VjKjEwMDAwMDAgKyB0di50dl91c2VjKSAlIGRlbHRhbno7CisJCQllbHNlCisJCQkJcmVtID0gZGVsdGEgLSB0di50dl91c2VjJWRlbHRhbno7CisJCQkvLyBTb21ldGltZXMga2VybmVsIHdha2VzIHVzIHVwIGp1c3QgYSB0aW55IGJpdCBlYXJsaWVyIHRoYW4gYXNrZWQKKwkJCS8vIERvIG5vdCBnbyB0byB2ZXJ5IHNob3J0IHNsZWVwIGluIHRoaXMgY2FzZQorCQkJaWYgKHJlbSA8IGRlbHRhLzEyOCkgeworCQkJCXJlbSArPSBkZWx0YTsKKwkJCX0KKwkJCXVzbGVlcChyZW0pOworCQl9CisJfQorCisJLypyZXR1cm4gMDsqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3BncmVwLmMgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvcGdyZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzdmZmZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3BncmVwLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcGdyZXAvcGtpbGwgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTG9pYyBHcmVuaWUgPGxvaWMuZ3JlbmllQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBwZ3JlcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mbG5vdnhdIFstcyBTSUR8LVAgUFBJRHxQQVRURVJOXSIKKy8vdXNhZ2U6I2RlZmluZSBwZ3JlcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgcHJvY2Vzcyhlcykgc2VsZWN0ZWQgYnkgcmVnZXggUEFUVEVSTlxuIgorLy91c2FnZTogICAgICJcbgktbAlTaG93IGNvbW1hbmQgbmFtZSB0b28iCisvL3VzYWdlOiAgICAgIlxuCS1mCU1hdGNoIGFnYWluc3QgZW50aXJlIGNvbW1hbmQgbGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JU2hvdyB0aGUgbmV3ZXN0IHByb2Nlc3Mgb25seSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JU2hvdyB0aGUgb2xkZXN0IHByb2Nlc3Mgb25seSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJTmVnYXRlIHRoZSBtYXRjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJTWF0Y2ggd2hvbGUgbmFtZSAobm90IHN1YnN0cmluZykiCisvL3VzYWdlOiAgICAgIlxuCS1zCU1hdGNoIHNlc3Npb24gSUQgKDAgZm9yIGN1cnJlbnQpIgorLy91c2FnZTogICAgICJcbgktUAlNYXRjaCBwYXJlbnQgcHJvY2VzcyBJRCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcGtpbGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbHwtU0lHTkFMXSBbLWZub3Z4XSBbLXMgU0lEfC1QIFBQSUR8UEFUVEVSTl0iCisvL3VzYWdlOiNkZWZpbmUgcGtpbGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIGEgc2lnbmFsIHRvIHByb2Nlc3MoZXMpIHNlbGVjdGVkIGJ5IHJlZ2V4IFBBVFRFUk5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBhbGwgc2lnbmFscyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJTWF0Y2ggYWdhaW5zdCBlbnRpcmUgY29tbWFuZCBsaW5lIgorLy91c2FnZTogICAgICJcbgktbglTaWduYWwgdGhlIG5ld2VzdCBwcm9jZXNzIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS1vCVNpZ25hbCB0aGUgb2xkZXN0IHByb2Nlc3Mgb25seSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJTmVnYXRlIHRoZSBtYXRjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJTWF0Y2ggd2hvbGUgbmFtZSAobm90IHN1YnN0cmluZykiCisvL3VzYWdlOiAgICAgIlxuCS1zCU1hdGNoIHNlc3Npb24gSUQgKDAgZm9yIGN1cnJlbnQpIgorLy91c2FnZTogICAgICJcbgktUAlNYXRjaCBwYXJlbnQgcHJvY2VzcyBJRCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAieHJlZ2V4LmgiCisKKy8qIElkZWEgdGFrZW4gZnJvbSBraWxsLmMgKi8KKyNkZWZpbmUgcGdyZXAgKEVOQUJMRV9QR1JFUCAmJiBhcHBsZXRfbmFtZVsxXSA9PSAnZycpCisjZGVmaW5lIHBraWxsIChFTkFCTEVfUEtJTEwgJiYgYXBwbGV0X25hbWVbMV0gPT0gJ2snKQorCitlbnVtIHsKKwkvKiAidmxmeG9uczpQOiIgKi8KKwlPUFRCSVRfViA9IDAsIC8qIG11c3QgYmUgZmlyc3QsIHdlIG5lZWQgT1BUX0lOVkVSVCA9IDAvMSAqLworCU9QVEJJVF9MLAorCU9QVEJJVF9GLAorCU9QVEJJVF9YLAorCU9QVEJJVF9PLAorCU9QVEJJVF9OLAorCU9QVEJJVF9TLAorCU9QVEJJVF9QLAorfTsKKworI2RlZmluZSBPUFRfSU5WRVJUCShvcHQgJiAoMSA8PCBPUFRCSVRfVikpCisjZGVmaW5lIE9QVF9MSVNUCShvcHQgJiAoMSA8PCBPUFRCSVRfTCkpCisjZGVmaW5lIE9QVF9GVUxMCShvcHQgJiAoMSA8PCBPUFRCSVRfRikpCisjZGVmaW5lIE9QVF9BTkNIT1IJKG9wdCAmICgxIDw8IE9QVEJJVF9YKSkKKyNkZWZpbmUgT1BUX0ZJUlNUCShvcHQgJiAoMSA8PCBPUFRCSVRfTykpCisjZGVmaW5lIE9QVF9MQVNUCShvcHQgJiAoMSA8PCBPUFRCSVRfTikpCisjZGVmaW5lIE9QVF9TSUQJCShvcHQgJiAoMSA8PCBPUFRCSVRfUykpCisjZGVmaW5lIE9QVF9QUElECShvcHQgJiAoMSA8PCBPUFRCSVRfUCkpCisKK3N0YXRpYyB2b2lkIGFjdCh1bnNpZ25lZCBwaWQsIGNoYXIgKmNtZCwgaW50IHNpZ25vKQoreworCWlmIChwZ3JlcCkgeworCQlpZiAob3B0aW9uX21hc2szMiAmICgxIDw8IE9QVEJJVF9MKSkgLyogT1BUX0xJU1QgKi8KKwkJCXByaW50ZigiJWQgJXNcbiIsIHBpZCwgY21kKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlZFxuIiwgcGlkKTsKKwl9IGVsc2UKKwkJa2lsbChwaWQsIHNpZ25vKTsKK30KKworaW50IHBncmVwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwZ3JlcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgcGlkOworCWludCBzaWdubzsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IHNjYW5fbWFzazsKKwlpbnQgbWF0Y2hlZF9waWQ7CisJaW50IHNpZDJtYXRjaCwgcHBpZDJtYXRjaDsKKwljaGFyICpjbWRfbGFzdDsKKwlwcm9jcHNfc3RhdHVzX3QgKnByb2M7CisJLyogVGhlc2UgYXJlIGluaXRpYWxpemVkIHRvIDAgKi8KKwlzdHJ1Y3QgeworCQlyZWdleF90IHJlX2J1ZmZlcjsKKwkJcmVnbWF0Y2hfdCByZV9tYXRjaFsxXTsKKwl9IFo7CisjZGVmaW5lIHJlX2J1ZmZlciAoWi5yZV9idWZmZXIpCisjZGVmaW5lIHJlX21hdGNoICAoWi5yZV9tYXRjaCApCisKKwltZW1zZXQoJlosIDAsIHNpemVvZihaKSk7CisKKwkvKiBQYXJzZSAtU0lHTkFMIGZvciBwa2lsbC4gTXVzdCBiZSBmaXJzdCBvcHRpb24sIGlmIHByZXNlbnQgKi8KKwlzaWdubyA9IFNJR1RFUk07CisJaWYgKHBraWxsICYmIGFyZ3ZbMV0gJiYgYXJndlsxXVswXSA9PSAnLScpIHsKKwkJaW50IHRlbXAgPSBnZXRfc2lnbnVtKGFyZ3ZbMV0rMSk7CisJCWlmICh0ZW1wICE9IC0xKSB7CisJCQlzaWdubyA9IHRlbXA7CisJCQlhcmd2Kys7CisJCX0KKwl9CisKKwkvKiBQYXJzZSByZW1haW5pbmcgb3B0aW9ucyAqLworCXBwaWQybWF0Y2ggPSAtMTsKKwlzaWQybWF0Y2ggPSAtMTsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJzKzpQKyI7IC8qIG51bWVyaWMgb3B0cyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJ2bGZ4b25zOlA6IiwgJnNpZDJtYXRjaCwgJnBwaWQybWF0Y2gpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKHBraWxsICYmIE9QVF9MSVNUKSB7IC8qIC1sOiBwcmludCB0aGUgd2hvbGUgc2lnbmFsIGxpc3QgKi8KKwkJcHJpbnRfc2lnbmFtZXMoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGlkID0gZ2V0cGlkKCk7CisJaWYgKHNpZDJtYXRjaCA9PSAwKQorCQlzaWQybWF0Y2ggPSBnZXRzaWQocGlkKTsKKworCXNjYW5fbWFzayA9IFBTU0NBTl9DT01NIHwgUFNTQ0FOX0FSR1YwOworCWlmIChPUFRfRlVMTCkKKwkJc2Nhbl9tYXNrIHw9IFBTU0NBTl9BUkdWTjsKKworCS8qIE9uZSBwYXR0ZXJuIGlzIHJlcXVpcmVkLCBpZiBubyAtcyBhbmQgbm8gLVAgKi8KKwlpZiAoKHNpZDJtYXRjaCAmIHBwaWQybWF0Y2gpIDwgMCAmJiAoIWFyZ3ZbMF0gfHwgYXJndlsxXSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWlmIChhcmd2WzBdKQorCQl4cmVnY29tcCgmcmVfYnVmZmVyLCBhcmd2WzBdLCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOworCisJbWF0Y2hlZF9waWQgPSAwOworCWNtZF9sYXN0ID0gTlVMTDsKKwlwcm9jID0gTlVMTDsKKwl3aGlsZSAoKHByb2MgPSBwcm9jcHNfc2Nhbihwcm9jLCBzY2FuX21hc2spKSAhPSBOVUxMKSB7CisJCWNoYXIgKmNtZDsKKworCQlpZiAocHJvYy0+cGlkID09IHBpZCkKKwkJCWNvbnRpbnVlOworCisJCWNtZCA9IHByb2MtPmFyZ3YwOworCQlpZiAoIWNtZCkgeworCQkJY21kID0gcHJvYy0+Y29tbTsKKwkJfSBlbHNlIHsKKwkJCWludCBpID0gcHJvYy0+YXJndl9sZW47CisJCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpY21kW2ldIDwgJyAnKQorCQkJCQljbWRbaV0gPSAnICc7CisJCQl9CisJCX0KKworCQlpZiAocHBpZDJtYXRjaCA+PSAwICYmIHBwaWQybWF0Y2ggIT0gcHJvYy0+cHBpZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc2lkMm1hdGNoID49IDAgICYmIHNpZDJtYXRjaCAhPSBwcm9jLT5zaWQpCisJCQljb250aW51ZTsKKworCQkvKiBOQjogT1BUX0lOVkVSVCBpcyBhbHdheXMgMCBvciAxICovCisJCWlmICghYXJndlswXQorCQkgfHwgKHJlZ2V4ZWMoJnJlX2J1ZmZlciwgY21kLCAxLCByZV9tYXRjaCwgMCkgPT0gMCAvKiBtYXRjaCBmb3VuZCAqLworCQkgICAgJiYgKCFPUFRfQU5DSE9SIHx8IChyZV9tYXRjaFswXS5ybV9zbyA9PSAwICYmIHJlX21hdGNoWzBdLnJtX2VvID09IChyZWdvZmZfdClzdHJsZW4oY21kKSkpCisJCSAgICApIF4gT1BUX0lOVkVSVAorCQkpIHsKKwkJCW1hdGNoZWRfcGlkID0gcHJvYy0+cGlkOworCQkJaWYgKE9QVF9MQVNUKSB7CisJCQkJZnJlZShjbWRfbGFzdCk7CisJCQkJY21kX2xhc3QgPSB4c3RyZHVwKGNtZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlhY3QocHJvYy0+cGlkLCBjbWQsIHNpZ25vKTsKKwkJCWlmIChPUFRfRklSU1QpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY21kX2xhc3QpIHsKKwkJYWN0KG1hdGNoZWRfcGlkLCBjbWRfbGFzdCwgc2lnbm8pOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGNtZF9sYXN0KTsKKwl9CisJcmV0dXJuIG1hdGNoZWRfcGlkID09IDA7IC8qIHJldHVybiAxIGlmIG5vIHByb2Nlc3NlcyBsaXN0ZWQvc2lnbmFsZWQgKi8KK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9waWRvZi5jIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3BpZG9mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3YjU5MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9waWRvZi5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwaWRvZiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2lmIChFTkFCTEVfRkVBVFVSRV9QSURPRl9TSU5HTEUgfHwgRU5BQkxFX0ZFQVRVUkVfUElET0ZfT01JVCkKKy8vdXNhZ2U6I2RlZmluZSBwaWRvZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtOQU1FXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBVU0FHRV9QSURPRiAiXG4iCisvL3VzYWdlOiNlbHNlCisvL3VzYWdlOiNkZWZpbmUgcGlkb2ZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltOQU1FXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBVU0FHRV9QSURPRiAvKiBub25lICovCisvL3VzYWdlOiNlbmRpZgorLy91c2FnZTojZGVmaW5lIHBpZG9mX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdCBQSURzIG9mIGFsbCBwcm9jZXNzZXMgd2l0aCBuYW1lcyB0aGF0IG1hdGNoIE5BTUVzIgorLy91c2FnZToJVVNBR0VfUElET0YKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUElET0ZfU0lOR0xFKAorLy91c2FnZTogICAgICJcbgktcwlTaG93IG9ubHkgb25lIFBJRCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUElET0ZfT01JVCgKKy8vdXNhZ2U6ICAgICAiXG4JLW8gUElECU9taXQgZ2l2ZW4gcGlkIgorLy91c2FnZTogICAgICJcbgkJVXNlICVQUElEIHRvIG9taXQgcGlkIG9mIHBpZG9mJ3MgcGFyZW50IgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwaWRvZl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwaWRvZiBpbml0XG4iCisvL3VzYWdlOiAgICAgICAiMVxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9QSURPRl9PTUlUKAorLy91c2FnZTogICAgICAgIiQgcGlkb2YgL2Jpbi9zaFxuMjAzNTEgNTk3MyA1OTUwXG4iKQorLy91c2FnZToJSUZfRkVBVFVSRV9QSURPRl9PTUlUKAorLy91c2FnZTogICAgICAgIiQgcGlkb2YgL2Jpbi9zaCAtbyAlUFBJRFxuMjAzNTEgNTk1MCIpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitlbnVtIHsKKwlJRl9GRUFUVVJFX1BJRE9GX1NJTkdMRShPUFRCSVRfU0lOR0xFLCkKKwlJRl9GRUFUVVJFX1BJRE9GX09NSVQoICBPUFRCSVRfT01JVCAgLCkKKwlPUFRfU0lOR0xFID0gSUZfRkVBVFVSRV9QSURPRl9TSU5HTEUoKDE8PE9QVEJJVF9TSU5HTEUpKSArIDAsCisJT1BUX09NSVQgICA9IElGX0ZFQVRVUkVfUElET0ZfT01JVCggICgxPDxPUFRCSVRfT01JVCAgKSkgKyAwLAorfTsKKworaW50IHBpZG9mX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwaWRvZl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgZmlyc3QgPSAxOworCXVuc2lnbmVkIG9wdDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURPRl9PTUlUCisJbGxpc3RfdCAqb21pdHMgPSBOVUxMOyAvKiBsaXN0IG9mIHBpZHMgdG8gb21pdCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm86OiI7CisjZW5kaWYKKworCS8qIGRvIHVuY29uZGl0aW9uYWwgb3B0aW9uIHBhcnNpbmcgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiIgorCQkJSUZfRkVBVFVSRV9QSURPRl9TSU5HTEUgKCJzIikKKwkJCUlGX0ZFQVRVUkVfUElET0ZfT01JVCgibzoiLCAmb21pdHMpKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1BJRE9GX09NSVQKKwkvKiBmaWxsIG9taXQgbGlzdC4gICovCisJeworCQlsbGlzdF90ICpvbWl0c19wID0gb21pdHM7CisJCXdoaWxlICgxKSB7CisJCQlvbWl0c19wID0gbGxpc3RfZmluZF9zdHIob21pdHNfcCwgIiVQUElEIik7CisJCQlpZiAoIW9taXRzX3ApCisJCQkJYnJlYWs7CisJCQkvKiBhcmUgd2UgYXNrZWQgdG8gZXhjbHVkZSB0aGUgcGFyZW50J3MgcHJvY2VzcyBJRD8gICovCisJCQlvbWl0c19wLT5kYXRhID0gdXRvYSgodW5zaWduZWQpZ2V0cHBpZCgpKTsKKwkJfQorCX0KKyNlbmRpZgorCS8qIExvb2tzIGxpa2UgZXZlcnl0aGluZyBpcyBzZXQgdG8gZ28uICAqLworCWFyZ3YgKz0gb3B0aW5kOworCXdoaWxlICgqYXJndikgeworCQlwaWRfdCAqcGlkTGlzdDsKKwkJcGlkX3QgKnBsOworCisJCS8qIHJldmVyc2UgdGhlIHBpZGxpc3QgbGlrZSBHTlUgcGlkb2YgZG9lcy4gICovCisJCXBpZExpc3QgPSBwaWRsaXN0X3JldmVyc2UoZmluZF9waWRfYnlfbmFtZSgqYXJndikpOworCQlmb3IgKHBsID0gcGlkTGlzdDsgKnBsOyBwbCsrKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUElET0ZfT01JVAorCQkJaWYgKG9wdCAmIE9QVF9PTUlUKSB7CisJCQkJbGxpc3RfdCAqb21pdHNfcCA9IG9taXRzOworCQkJCXdoaWxlIChvbWl0c19wKSB7CisJCQkJCWlmICh4YXRvdWwob21pdHNfcC0+ZGF0YSkgPT0gKHVuc2lnbmVkIGxvbmcpKCpwbCkpIHsKKwkJCQkJCWdvdG8gb21pdHRpbmc7CisJCQkJCX0KKwkJCQkJb21pdHNfcCA9IG9taXRzX3AtPmxpbms7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlwcmludGYoIiAldSIgKyBmaXJzdCwgKHVuc2lnbmVkKSpwbCk7CisJCQlmaXJzdCA9IDA7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfUElET0ZfU0lOR0xFICYmIChvcHQgJiBPUFRfU0lOR0xFKSkKKwkJCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURPRl9PTUlUCisgb21pdHRpbmc6IDsKKyNlbmRpZgorCQl9CisJCWZyZWUocGlkTGlzdCk7CisJCWFyZ3YrKzsKKwl9CisJaWYgKCFmaXJzdCkKKwkJYmJfcHV0Y2hhcignXG4nKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1BJRE9GX09NSVQKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWxsaXN0X2ZyZWUob21pdHMsIE5VTEwpOworI2VuZGlmCisJcmV0dXJuIGZpcnN0OyAvKiAxIChmYWlsdXJlKSAtIG5vIHByb2Nlc3NlcyBmb3VuZCAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3BtYXAuYyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5OTVhNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wbWFwLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBwbWFwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV3JpdHRlbiBieSBBbGV4YW5kZXIgU2hpc2hraW4gPHZpcnR1b3NvQHNsaW5kLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhpcyBzb3VyY2UgdHJlZQorICogZm9yIGRldGFpbHMuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFBNQVAKKy8vY29uZmlnOiAgICAgICBib29sICJwbWFwIgorLy9jb25maWc6ICAgICAgIGRlZmF1bHQgeQorLy9jb25maWc6ICAgICAgIGhlbHAKKy8vY29uZmlnOiAgICAgICAgIERpc3BsYXkgcHJvY2Vzc2VzJyBtZW1vcnkgbWFwcGluZ3MuCisKKy8vYXBwbGV0OklGX1BNQVAoQVBQTEVUKHBtYXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLy9rYnVpbGQ6bGliLSQoQ09ORklHX1BNQVApICs9IHBtYXAubworCisvL3VzYWdlOiNkZWZpbmUgcG1hcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy14cV0gUElEIgorLy91c2FnZTojZGVmaW5lIHBtYXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IGRldGFpbGVkIHByb2Nlc3MgbWVtb3J5IHVzYWdlIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJU2hvdyBkZXRhaWxzIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBVTE9OR19NQVggPT0gMHhmZmZmZmZmZgorIyBkZWZpbmUgVEFCUyAiXHQiCisjIGRlZmluZSBBRk1UICI4IgorIyBkZWZpbmUgREFTSEVTICIiCisjZWxzZQorIyBkZWZpbmUgVEFCUyAiXHRcdCIKKyMgZGVmaW5lIEFGTVQgIjE2IgorIyBkZWZpbmUgREFTSEVTICItLS0tLS0tLSIKKyNlbmRpZgorCitlbnVtIHsKKwlPUFRfeCA9IDEgPDwgMCwKKwlPUFRfcSA9IDEgPDwgMSwKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3NtYXByZWMoc3RydWN0IHNtYXByZWMgKmN1cnJlYywgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBvcHQgPSAodWludHB0cl90KWRhdGE7CisKKwlwcmludGYoIiUwIiBBRk1UICJseCAiLCBjdXJyZWMtPnNtYXBfc3RhcnQpOworCisJaWYgKG9wdCAmIE9QVF94KQorCQlwcmludGYoIiU3bHUgJTdsdSAlN2x1ICU3bHUgIiwKKwkJCWN1cnJlYy0+c21hcF9zaXplLAorCQkJY3VycmVjLT5zbWFwX3BzcywKKwkJCWN1cnJlYy0+cHJpdmF0ZV9kaXJ0eSwKKwkJCWN1cnJlYy0+c21hcF9zd2FwKTsKKwllbHNlCisJCXByaW50ZigiJTdsdUsiLCBjdXJyZWMtPnNtYXBfc2l6ZSk7CisKKwlwcmludGYoIiAlLjRzICAlc1xuIiwgY3VycmVjLT5zbWFwX21vZGUsIGN1cnJlYy0+c21hcF9uYW1lKTsKK30KKworc3RhdGljIGludCBwcm9jcHNfZ2V0X21hcHMocGlkX3QgcGlkLCB1bnNpZ25lZCBvcHQpCit7CisJc3RydWN0IHNtYXByZWMgdG90YWw7CisJaW50IHJldDsKKwljaGFyIGJ1ZlsyNTZdOworCisJcmVhZF9jbWRsaW5lKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHBpZCwgIm5vIHN1Y2ggcHJvY2VzcyIpOworCXByaW50ZigiJXU6ICVzXG4iLCAoaW50KXBpZCwgYnVmKTsKKworCWlmICghKG9wdCAmIE9QVF9xKSAmJiAob3B0ICYgT1BUX3gpKQorCQlwdXRzKCJBZGRyZXNzIiBUQUJTICIgIEtieXRlcyAgICAgUFNTICAgRGlydHkgICAgU3dhcCAgTW9kZSAgTWFwcGluZyIpOworCisJbWVtc2V0KCZ0b3RhbCwgMCwgc2l6ZW9mKHRvdGFsKSk7CisKKwlyZXQgPSBwcm9jcHNfcmVhZF9zbWFwcyhwaWQsICZ0b3RhbCwgcHJpbnRfc21hcHJlYywgKHZvaWQqKSh1aW50cHRyX3Qpb3B0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCEob3B0ICYgT1BUX3EpKSB7CisJCWlmIChvcHQgJiBPUFRfeCkKKwkJCXByaW50ZigiLS0tLS0tLS0iIERBU0hFUyAiICAtLS0tLS0gIC0tLS0tLSAgLS0tLS0tICAtLS0tLS1cbiIKKwkJCQkidG90YWwiIFRBQlMgIiAlN2x1ICU3bHUgJTdsdSAlN2x1XG4iLAorCQkJCXRvdGFsLnNtYXBfc2l6ZSwgdG90YWwuc21hcF9wc3MsIHRvdGFsLnByaXZhdGVfZGlydHksIHRvdGFsLnNtYXBfc3dhcCk7CisJCWVsc2UKKwkJCXByaW50ZigibWFwcGVkOiAlbHVLXG4iLCB0b3RhbC5zbWFwX3NpemUpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcG1hcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcG1hcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwlpbnQgcmV0OworCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJ4cSIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJcmV0ID0gMDsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJcGlkX3QgcGlkID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YrKyk7CisJCS8qIEdOVSBwbWFwIHJldHVybnMgNDIgaWYgYW55IG9mIHRoZSBwaWRzIGZhaWxlZCAqLworCQlpZiAocHJvY3BzX2dldF9tYXBzKHBpZCwgb3B0cykgIT0gMCkKKwkJCXJldCA9IDQyOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9wcm9jcHMvcG93ZXJ0b3AuYyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wb3dlcnRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGNkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvcG93ZXJ0b3AuYwpAQCAtMCwwICsxLDg1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQSBtaW5pICdwb3dlcnRvcCcgdXRpbGl0eToKKyAqICAgQW5hbHl6ZSBwb3dlciBjb25zdW1wdGlvbiBvbiBJbnRlbC1iYXNlZCBsYXB0b3BzLgorICogQmFzZWQgb24gcG93ZXJ0b3AgMS4xMS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFyZWsgUG9sYWNlayA8bW1wb2xhY2VrQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX1BPV0VSVE9QKEFQUExFVChwb3dlcnRvcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1BPV0VSVE9QKSArPSBwb3dlcnRvcC5vCisKKy8vY29uZmlnOmNvbmZpZyBQT1dFUlRPUAorLy9jb25maWc6CWJvb2wgInBvd2VydG9wIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEFuYWx5emUgcG93ZXIgY29uc3VtcHRpb24gb24gSW50ZWwtYmFzZWQgbGFwdG9wcworCisvLyBYWFggVGhpcyBzaG91bGQgYmUgY29uZmlndXJhYmxlCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEgMQorCisjaW5jbHVkZSAibGliYmIuaCIKKworCisvLyNkZWZpbmUgZGVidWcoZm10LCAuLi4pIGZwcmludGYoc3RkZXJyLCBmbXQsICMjIF9fVkFfQVJHU19fKQorI2RlZmluZSBkZWJ1ZyhmbXQsIC4uLikgKCh2b2lkKTApCisKKworI2RlZmluZSBCTE9BVFlfSFBFVF9JUlFfTlVNX0RFVEVDVElPTiAwCisjZGVmaW5lIE1BWF9DU1RBVEVfQ09VTlQgICA4CisjZGVmaW5lIElSUUNPVU5UICAgICAgICAgICA0MAorCisKKyNkZWZpbmUgREVGQVVMVF9TTEVFUCAgICAgIDEwCisjZGVmaW5lIERFRkFVTFRfU0xFRVBfU1RSICIxMCIKKworLyogRnJlcXVlbmN5IG9mIHRoZSBBQ1BJIHRpbWVyICovCisjZGVmaW5lIEZSRVFfQUNQSSAgICAgICAgICAzNTc5LjU0NQorI2RlZmluZSBGUkVRX0FDUElfMTAwMCAgICAgMzU3OTU0NQorCisvKiBNYXggZmlsZW5hbWUgbGVuZ3RoIG9mIGVudHJ5IGluIC9zeXMvZGV2aWNlcyBzdWJzeXN0ZW0gKi8KKyNkZWZpbmUgQklHX1NZU05BTUVfTEVOICAgIDE2CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsbG9uZzsKKworc3RydWN0IGxpbmUgeworCWNoYXIgKnN0cmluZzsKKwlpbnQgY291bnQ7CisJLyppbnQgZGlza19jb3VudDsqLworfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEKK3N0cnVjdCBpcnFkYXRhIHsKKwlzbWFsbGludCBhY3RpdmU7CisJaW50IG51bWJlcjsKKwl1bGxvbmcgY291bnQ7CisJY2hhciBpcnFfZGVzY1szMl07Cit9OworI2VuZGlmCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3QgbGluZSAqbGluZXM7IC8qIHRoZSBtb3N0IG9mdGVuIHVzZWQgbWVtYmVyICovCisJaW50IGxpbmVzX2NudDsKKwlpbnQgbGluZXNfY3VtdWxhdGl2ZV9jb3VudDsKKwlpbnQgbWF4Y3N0YXRlOworCXVuc2lnbmVkIHRvdGFsX2NwdXM7CisJc21hbGxpbnQgY2FudF9lbmFibGVfdGltZXJfc3RhdHM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9XRVJUT1BfUFJPQ0lSUQorIyBpZiBCTE9BVFlfSFBFVF9JUlFfTlVNX0RFVEVDVElPTgorCXNtYWxsaW50IHNjYW5uZWRfdGltZXJfbGlzdDsKKwlpbnQgcGVyY3B1X2hwZXRfc3RhcnQ7CisJaW50IHBlcmNwdV9ocGV0X2VuZDsKKyMgZW5kaWYKKwlpbnQgaW50ZXJydXB0XzA7CisJaW50IHRvdGFsX2ludGVycnVwdDsKKwlzdHJ1Y3QgaXJxZGF0YSBpbnRlcnJ1cHRzW0lSUUNPVU5UXTsKKyNlbmRpZgorCXVsbG9uZyBzdGFydF91c2FnZVtNQVhfQ1NUQVRFX0NPVU5UXTsKKwl1bGxvbmcgbGFzdF91c2FnZVtNQVhfQ1NUQVRFX0NPVU5UXTsKKwl1bGxvbmcgc3RhcnRfZHVyYXRpb25bTUFYX0NTVEFURV9DT1VOVF07CisJdWxsb25nIGxhc3RfZHVyYXRpb25bTUFYX0NTVEFURV9DT1VOVF07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwlzdHJ1Y3QgdGVybWlvcyBpbml0X3NldHRpbmdzOworI2VuZGlmCit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKK3N0YXRpYyB2b2lkIHJlc2V0X3Rlcm0odm9pZCkKK3sKKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmRy5pbml0X3NldHRpbmdzKTsKK30KKworc3RhdGljIHZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZ25vIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXNldF90ZXJtKCk7CisJX2V4aXQoRVhJVF9GQUlMVVJFKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHdyaXRlX3N0cl90b19maWxlKGNvbnN0IGNoYXIgKmZuYW1lLCBjb25zdCBjaGFyICpzdHIpCit7CisJRklMRSAqZnAgPSBmb3Blbl9mb3Jfd3JpdGUoZm5hbWUpOworCWlmICghZnApCisJCXJldHVybiAxOworCWZwdXRzKHN0ciwgZnApOworCWZjbG9zZShmcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE1ha2UgaXQgbW9yZSByZWFkYWJsZSAqLworI2RlZmluZSBzdGFydF90aW1lcigpIHdyaXRlX3N0cl90b19maWxlKCIvcHJvYy90aW1lcl9zdGF0cyIsICIxXG4iKQorI2RlZmluZSBzdG9wX3RpbWVyKCkgIHdyaXRlX3N0cl90b19maWxlKCIvcHJvYy90aW1lcl9zdGF0cyIsICIwXG4iKQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBjbGVhcl9saW5lcyh2b2lkKQoreworCWludCBpOworCWlmIChHLmxpbmVzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBHLmxpbmVzX2NudDsgaSsrKQorCQkJZnJlZShHLmxpbmVzW2ldLnN0cmluZyk7CisJCWZyZWUoRy5saW5lcyk7CisJCUcubGluZXNfY250ID0gMDsKKwkJRy5saW5lcyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfbGluZXNfY3VtdWxhdGl2ZV9jb3VudCh2b2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBHLmxpbmVzX2NudDsgaSsrKQorCQlHLmxpbmVzX2N1bXVsYXRpdmVfY291bnQgKz0gRy5saW5lc1tpXS5jb3VudDsKK30KKworc3RhdGljIGludCBsaW5lX2NvbXBhcmUoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworCWNvbnN0IHN0cnVjdCBsaW5lICphID0gcDE7CisJY29uc3Qgc3RydWN0IGxpbmUgKmIgPSBwMjsKKwlyZXR1cm4gKGItPmNvdW50IC8qKyA1MCAqIGItPmRpc2tfY291bnQqLykgLSAoYS0+Y291bnQgLyorIDUwICogYS0+ZGlza19jb3VudCovKTsKK30KKworc3RhdGljIHZvaWQgc29ydF9saW5lcyh2b2lkKQoreworCXFzb3J0KEcubGluZXMsIEcubGluZXNfY250LCBzaXplb2YoRy5saW5lc1swXSksIGxpbmVfY29tcGFyZSk7Cit9CisKKy8qIFNhdmUgQy1zdGF0ZSB1c2FnZSBhbmQgZHVyYXRpb24uIEFsc28gdXBkYXRlIG1heGNzdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIHJlYWRfY3N0YXRlX2NvdW50cyh1bGxvbmcgKnVzYWdlLCB1bGxvbmcgKmR1cmF0aW9uKQoreworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmQ7CisKKwlkaXIgPSBvcGVuZGlyKCIvcHJvYy9hY3BpL3Byb2Nlc3NvciIpOworCWlmICghZGlyKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKGQgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJRklMRSAqZnA7CisJCWNoYXIgYnVmWzE5Ml07CisJCWludCBsZXZlbDsKKwkJaW50IGxlbjsKKworCQlsZW4gPSBzdHJsZW4oZC0+ZF9uYW1lKTsgLyogIkNQVW5uIiAqLworCQlpZiAobGVuIDwgMyB8fCBsZW4gPiBCSUdfU1lTTkFNRV9MRU4pCisJCQljb250aW51ZTsKKworCQlzcHJpbnRmKGJ1ZiwgIiVzLyVzL3Bvd2VyIiwgIi9wcm9jL2FjcGkvcHJvY2Vzc29yIiwgZC0+ZF9uYW1lKTsKKwkJZnAgPSBmb3Blbl9mb3JfcmVhZChidWYpOworCQlpZiAoIWZwKQorCQkJY29udGludWU7CisKKy8vIEV4YW1wbGUgZmlsZSBjb250ZW50czoKKy8vIGFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBDMAorLy8gbWF4X2NzdGF0ZTogICAgICAgICAgICAgIEM4CisvLyBtYXhpbXVtIGFsbG93ZWQgbGF0ZW5jeTogMjAwMDAwMDAwMCB1c2VjCisvLyBzdGF0ZXM6CisvLyAgICAgQzE6ICAgICAgICAgICAgICAgICAgdHlwZVtDMV0gcHJvbW90aW9uWy0tXSBkZW1vdGlvblstLV0gbGF0ZW5jeVswMDFdIHVzYWdlWzAwMDA2MTczXSBkdXJhdGlvblswMDAwMDAwMDAwMDAwMDAwMDAwMF0KKy8vICAgICBDMjogICAgICAgICAgICAgICAgICB0eXBlW0MyXSBwcm9tb3Rpb25bLS1dIGRlbW90aW9uWy0tXSBsYXRlbmN5WzAwMV0gdXNhZ2VbMDAwODUxOTFdIGR1cmF0aW9uWzAwMDAwMDAwMDAwMDgzMDI0OTA3XQorLy8gICAgIEMzOiAgICAgICAgICAgICAgICAgIHR5cGVbQzNdIHByb21vdGlvblstLV0gZGVtb3Rpb25bLS1dIGxhdGVuY3lbMDE3XSB1c2FnZVswMTAxNzYyMl0gZHVyYXRpb25bMDAwMDAwMDAwMTc5MjEzMjcxODJdCisJCWxldmVsID0gMDsKKwkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQkJY2hhciAqcCA9IHN0cnN0cihidWYsICJhZ2VbIik7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQlwICs9IDQ7CisJCQl1c2FnZVtsZXZlbF0gKz0gYmJfc3RydG91bGwocCwgTlVMTCwgMTApICsgMTsKKwkJCXAgPSBzdHJzdHIoYnVmLCAiYXRpb25bIik7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQlwICs9IDY7CisJCQlkdXJhdGlvbltsZXZlbF0gKz0gYmJfc3RydG91bGwocCwgTlVMTCwgMTApOworCisJCQlpZiAobGV2ZWwgPj0gTUFYX0NTVEFURV9DT1VOVC0xKQorCQkJCWJyZWFrOworCQkJbGV2ZWwrKzsKKwkJCWlmIChsZXZlbCA+IEcubWF4Y3N0YXRlKSAgLyogdXBkYXRlIG1heGNzdGF0ZSAqLworCQkJCUcubWF4Y3N0YXRlID0gbGV2ZWw7CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworLyogQWRkIGxpbmUgYW5kL29yIHVwZGF0ZSBjb3VudCAqLworc3RhdGljIHZvaWQgc2F2ZV9saW5lKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGNvdW50KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBHLmxpbmVzX2NudDsgaSsrKSB7CisJCWlmIChzdHJjbXAoc3RyaW5nLCBHLmxpbmVzW2ldLnN0cmluZykgPT0gMCkgeworCQkJLyogSXQncyBhbHJlYWR5IHRoZXJlLCBvbmx5IHVwZGF0ZSBjb3VudCAqLworCQkJRy5saW5lc1tpXS5jb3VudCArPSBjb3VudDsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIEFkZCBuZXcgbGluZSAqLworCUcubGluZXMgPSB4cmVhbGxvY192ZWN0b3IoRy5saW5lcywgNCwgRy5saW5lc19jbnQpOworCUcubGluZXNbRy5saW5lc19jbnRdLnN0cmluZyA9IHhzdHJkdXAoc3RyaW5nKTsKKwlHLmxpbmVzW0cubGluZXNfY250XS5jb3VudCA9IGNvdW50OworCS8qRy5saW5lc1tHLmxpbmVzX2NudF0uZGlza19jb3VudCA9IDA7Ki8KKwlHLmxpbmVzX2NudCsrOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9XRVJUT1BfUFJPQ0lSUQorc3RhdGljIGludCBpc19ocGV0X2lycShjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKnA7CisjIGlmIEJMT0FUWV9IUEVUX0lSUV9OVU1fREVURUNUSU9OCisJbG9uZyBocGV0X2NoYW47CisKKwkvKiBMZWFybiB0aGUgcmFuZ2Ugb2YgZXhpc3RpbmcgaHBldCB0aW1lcnMuIFRoaXMgaXMgZG9uZSBvbmNlICovCisJaWYgKCFHLnNjYW5uZWRfdGltZXJfbGlzdCkgeworCQlGSUxFICpmcDsKKwkJY2hhciBidWZbODBdOworCisJCUcuc2Nhbm5lZF90aW1lcl9saXN0ID0gdHJ1ZTsKKwkJZnAgPSBmb3Blbl9mb3JfcmVhZCgiL3Byb2MvdGltZXJfbGlzdCIpOworCQlpZiAoIWZwKQorCQkJcmV0dXJuIDA7CisKKwkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQkJcCA9IHN0cnN0cihidWYsICJDbG9jayBFdmVudCBEZXZpY2U6IGhwZXQiKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCXAgKz0gc2l6ZW9mKCJDbG9jayBFdmVudCBEZXZpY2U6IGhwZXQiKS0xOworCQkJaWYgKCFpc2RpZ2l0KCpwKSkKKwkJCQljb250aW51ZTsKKwkJCWhwZXRfY2hhbiA9IHhhdG9pX3Bvc2l0aXZlKHApOworCQkJaWYgKGhwZXRfY2hhbiA8IEcucGVyY3B1X2hwZXRfc3RhcnQpCisJCQkJRy5wZXJjcHVfaHBldF9zdGFydCA9IGhwZXRfY2hhbjsKKwkJCWlmIChocGV0X2NoYW4gPiBHLnBlcmNwdV9ocGV0X2VuZCkKKwkJCQlHLnBlcmNwdV9ocGV0X2VuZCA9IGhwZXRfY2hhbjsKKwkJfQorCQlmY2xvc2UoZnApOworCX0KKyMgZW5kaWYKKy8vVE9ETzogb3B0aW1pemUKKwlwID0gc3Ryc3RyKG5hbWUsICJocGV0Iik7CisJaWYgKCFwKQorCQlyZXR1cm4gMDsKKwlwICs9IDQ7CisJaWYgKCFpc2RpZ2l0KCpwKSkKKwkJcmV0dXJuIDA7CisjIGlmIEJMT0FUWV9IUEVUX0lSUV9OVU1fREVURUNUSU9OCisJaHBldF9jaGFuID0geGF0b2lfcG9zaXRpdmUocCk7CisJaWYgKGhwZXRfY2hhbiA8IEcucGVyY3B1X2hwZXRfc3RhcnQgfHwgaHBldF9jaGFuID4gRy5wZXJjcHVfaHBldF9lbmQpCisJCXJldHVybiAwOworIyBlbmRpZgorCXJldHVybiAxOworfQorCisvKiBTYXZlIG5ldyBJUlEgY291bnQsIHJldHVybiBkZWx0YSBmcm9tIG9sZCBvbmUgKi8KK3N0YXRpYyBpbnQgc2F2ZV9pcnFfY291bnQoaW50IGlycSwgdWxsb25nIGNvdW50KQoreworCWludCB1bnVzZWQgPSBJUlFDT1VOVDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgSVJRQ09VTlQ7IGkrKykgeworCQlpZiAoRy5pbnRlcnJ1cHRzW2ldLmFjdGl2ZSAmJiBHLmludGVycnVwdHNbaV0ubnVtYmVyID09IGlycSkgeworCQkJdWxsb25nIG9sZCA9IEcuaW50ZXJydXB0c1tpXS5jb3VudDsKKwkJCUcuaW50ZXJydXB0c1tpXS5jb3VudCA9IGNvdW50OworCQkJcmV0dXJuIGNvdW50IC0gb2xkOworCQl9CisJCWlmICghRy5pbnRlcnJ1cHRzW2ldLmFjdGl2ZSAmJiB1bnVzZWQgPiBpKQorCQkJdW51c2VkID0gaTsKKwl9CisJaWYgKHVudXNlZCA8IElSUUNPVU5UKSB7CisJCUcuaW50ZXJydXB0c1t1bnVzZWRdLmFjdGl2ZSA9IDE7CisJCUcuaW50ZXJydXB0c1t1bnVzZWRdLmNvdW50ID0gY291bnQ7CisJCUcuaW50ZXJydXB0c1t1bnVzZWRdLm51bWJlciA9IGlycTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisvKiBSZWFkIC9wcm9jL2ludGVycnVwdHMsIHNhdmUgSVJRIGNvdW50cyBhbmQgSVJRIGRlc2NyaXB0aW9uICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2lycV9jb3VudHModm9pZCkKK3sKKwlGSUxFICpmcDsKKwljaGFyIGJ1ZlsxMjhdOworCisJLyogUmVzZXQgdmFsdWVzICovCisJRy5pbnRlcnJ1cHRfMCA9IDA7CisJRy50b3RhbF9pbnRlcnJ1cHQgPSAwOworCisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL2ludGVycnVwdHMiKTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWNoYXIgaXJxX2Rlc2Nbc2l6ZW9mKCIgICA8a2VybmVsIElQST4gOiAiKSArIHNpemVvZihidWYpXTsKKwkJY2hhciAqcDsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJaW50IG5yOworCQl1bGxvbmcgY291bnQ7CisJCXVsbG9uZyBkZWx0YTsKKworCQlwID0gc3RyY2hyKGJ1ZiwgJzonKTsKKwkJaWYgKCFwKQorCQkJY29udGludWU7CisJCS8qICAwOiAgMTQzNjQ2MDQ1ICAxNTM5MDEwMDcgICBJTy1BUElDLWVkZ2UgICAgICB0aW1lcgorCQkgKiAgIF4KKwkJICovCisJCSpwID0gJ1wwJzsKKwkJLyogRGVhbCB3aXRoIG5vbi1tYXNrYWJsZSBpbnRlcnJ1cHRzIC0tIG1ha2UgdXAgZmFrZSBudW1iZXJzICovCisJCW5yID0gaW5kZXhfaW5fc3RyaW5ncygiTk1JXDBSRVNcMENBTFwwVExCXDBUUk1cMFRIUlwwU1BVXDAiLCBidWYpOworCQlpZiAobnIgPj0gMCkgeworCQkJbnIgKz0gMjAwMDA7CisJCX0gZWxzZSB7CisJCQkvKiBiYl9zdHJ0b3UgZG9lc24ndCBlYXQgbGVhZGluZyBzcGFjZXMsIHVzaW5nIHN0cnRvdWwgKi8KKwkJCWVycm5vID0gMDsKKwkJCW5yID0gc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubykKKwkJCQljb250aW51ZTsKKwkJfQorCQlwKys7CisJCS8qICAwOiAgMTQzNjQ2MDQ1ICAxNTM5MDEwMDcgICBJTy1BUElDLWVkZ2UgICAgICB0aW1lcgorCQkgKiAgICBeCisJCSAqLworCQkvKiBTdW0gY291bnRzIGZvciB0aGlzIElSUSAqLworCQljb3VudCA9IDA7CisJCXdoaWxlICgxKSB7CisJCQljaGFyICp0bXA7CisJCQlwID0gc2tpcF93aGl0ZXNwYWNlKHApOworCQkJaWYgKCFpc2RpZ2l0KCpwKSkKKwkJCQlicmVhazsKKwkJCWNvdW50ICs9IGJiX3N0cnRvdWxsKHAsICZ0bXAsIDEwKTsKKwkJCXAgPSB0bXA7CisJCX0KKwkJLyogICAwOiAgMTQzNjQ2MDQ1ICAxNTM5MDEwMDcgICBJTy1BUElDLWVkZ2UgICAgICB0aW1lcgorCQkgKiBOTUk6ICAgICAgICAgIDEgICAgICAgICAgMiAgIE5vbi1tYXNrYWJsZSBpbnRlcnJ1cHRzCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorCQkgKi8KKwkJaWYgKG5yIDwgMjAwMDApIHsKKwkJCS8qIFNraXAgdG8gdGhlIGludGVycnVwdCBuYW1lLCBlLmcuICd0aW1lcicgKi8KKwkJCXAgPSBzdHJjaHIocCwgJyAnKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCXAgPSBza2lwX3doaXRlc3BhY2UocCk7CisJCX0KKworCQluYW1lID0gcDsKKwkJc3RyY2hybnVsKG5hbWUsICdcbicpWzBdID0gJ1wwJzsKKwkJLyogU2F2ZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW50ZXJydXB0ICovCisJCWlmIChuciA+PSAyMDAwMCkKKwkJCXNwcmludGYoaXJxX2Rlc2MsICIgICA8a2VybmVsIElQST4gOiAlcyIsIG5hbWUpOworCQllbHNlCisJCQlzcHJpbnRmKGlycV9kZXNjLCAiICAgIDxpbnRlcnJ1cHQ+IDogJXMiLCBuYW1lKTsKKworCQlkZWx0YSA9IHNhdmVfaXJxX2NvdW50KG5yLCBjb3VudCk7CisKKwkJLyogU2tpcCBwZXIgQ1BVIHRpbWVyIGludGVycnVwdHMgKi8KKwkJaWYgKGlzX2hwZXRfaXJxKG5hbWUpKQorCQkJY29udGludWU7CisKKwkJaWYgKG5yICE9IDAgJiYgZGVsdGEgIT0gMCkKKwkJCXNhdmVfbGluZShpcnFfZGVzYywgZGVsdGEpOworCisJCWlmIChuciA9PSAwKQorCQkJRy5pbnRlcnJ1cHRfMCA9IGRlbHRhOworCQllbHNlCisJCQlHLnRvdGFsX2ludGVycnVwdCArPSBkZWx0YTsKKwl9CisKKwlmY2xvc2UoZnApOworfQorI2Vsc2UgLyogIUVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEgKi8KKyMgZGVmaW5lIHByb2Nlc3NfaXJxX2NvdW50cygpICAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgTk9JTkxJTkUgaW50IHByb2Nlc3NfdGltZXJfc3RhdHModm9pZCkKK3sKKwljaGFyIGJ1ZlsxMjhdOworCWNoYXIgbGluZVsxNSArIDMgKyAxMjhdOworCWludCBuOworCUZJTEUgKmZwOworCisJYnVmWzBdID0gJ1wwJzsKKworCW4gPSAwOworCWZwID0gTlVMTDsKKwlpZiAoIUcuY2FudF9lbmFibGVfdGltZXJfc3RhdHMpCisJCWZwID0gZm9wZW5fZm9yX3JlYWQoIi9wcm9jL3RpbWVyX3N0YXRzIik7CisJaWYgKGZwKSB7CisvLyBFeGFtcGxlIGZpbGUgY29udGVudHM6CisvLyBUaW1lciBTdGF0cyBWZXJzaW9uOiB2MC4yCisvLyBTYW1wbGUgcGVyaW9kOiAxLjMyOSBzCisvLyAgICA3NiwgICAgIDAgc3dhcHBlciAgICAgICAgICBocnRpbWVyX3N0YXJ0X3JhbmdlX25zICh0aWNrX3NjaGVkX3RpbWVyKQorLy8gICAgODgsICAgICAwIHN3YXBwZXIgICAgICAgICAgaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAodGlja19zY2hlZF90aW1lcikKKy8vICAgIDI0LCAgMzc4NyBmaXJlZm94ICAgICAgICAgIGhydGltZXJfc3RhcnRfcmFuZ2VfbnMgKGhydGltZXJfd2FrZXVwKQorLy8gICA0NkQsICAxMTM2IGtvbmRlbWFuZC8xICAgICAgZG9fZGJzX3RpbWVyIChkZWxheWVkX3dvcmtfdGltZXJfZm4pCisvLyAuLi4KKy8vICAgICAxLCAgMTY1NiBYb3JnICAgICAgICAgICAgIGhydGltZXJfc3RhcnRfcmFuZ2VfbnMgKGhydGltZXJfd2FrZXVwKQorLy8gICAgIDEsICAyMTU5IHVkaXNrcy1kYWVtb24gICAgaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAoaHJ0aW1lcl93YWtldXApCisvLyAzMzEgdG90YWwgZXZlbnRzLCAyNDkuMDU5IGV2ZW50cy9zZWMKKwkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQkJY29uc3QgY2hhciAqY291bnQsICpwcm9jZXNzLCAqZnVuYzsKKwkJCWNoYXIgKnA7CisJCQlpbnQgaWR4OworCQkJdW5zaWduZWQgY250OworCisJCQljb3VudCA9IHNraXBfd2hpdGVzcGFjZShidWYpOworCQkJcCA9IHN0cmNocihjb3VudCwgJywnKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCSpwKysgPSAnXDAnOworCQkJY250ID0gYmJfc3RydG91KGNvdW50LCBOVUxMLCAxMCk7CisJCQlpZiAoc3RyY21wKHNraXBfbm9uX3doaXRlc3BhY2UoY291bnQpLCAiIHRvdGFsIGV2ZW50cyIpID09IDApIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1dFUlRPUF9QUk9DSVJRCisJCQkJbiA9IGNudCAvIEcudG90YWxfY3B1czsKKwkJCQlpZiAobiA+IDAgJiYgbiA8IEcuaW50ZXJydXB0XzApIHsKKwkJCQkJc3ByaW50ZihsaW5lLCAiICAgIDxpbnRlcnJ1cHQ+IDogJXMiLCAiZXh0cmEgdGltZXIgaW50ZXJydXB0Iik7CisJCQkJCXNhdmVfbGluZShsaW5lLCBHLmludGVycnVwdF8wIC0gbik7CisJCQkJfQorI2VuZGlmCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RyY2hyKGNvdW50LCAnRCcpKQorCQkJCWNvbnRpbnVlOyAvKiBkZWZlcnJlZCAqLworCQkJcCA9IHNraXBfd2hpdGVzcGFjZShwKTsgLyogcG9pbnRzIHRvIHBpZCBub3cgKi8KKwkJCXByb2Nlc3MgPSBOVUxMOworIGdldF9mdW5jX25hbWU6CisJCQlwID0gc3RyY2hyKHAsICcgJyk7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQkqcCsrID0gJ1wwJzsKKwkJCXAgPSBza2lwX3doaXRlc3BhY2UocCk7CisJCQlpZiAocHJvY2VzcyA9PSBOVUxMKSB7CisJCQkJcHJvY2VzcyA9IHA7CisJCQkJZ290byBnZXRfZnVuY19uYW1lOworCQkJfQorCQkJZnVuYyA9IHA7CisKKwkJCS8vaWYgKHN0cmNtcChwcm9jZXNzLCAic3dhcHBlciIpID09IDAKKwkJCS8vICYmIHN0cmNtcChmdW5jLCAiaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAodGlja19zY2hlZF90aW1lcilcbiIpID09IDAKKwkJCS8vKSB7CisJCQkvLwlwcm9jZXNzID0gIltrZXJuZWwgc2NoZWR1bGVyXSI7CisJCQkvLwlmdW5jID0gIkxvYWQgYmFsYW5jaW5nIHRpY2siOworCQkJLy99CisKKwkJCWlmIChzdHJuY21wKGZ1bmMsICJ0aWNrX25vaHpfIiwgMTApID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAoc3RybmNtcChmdW5jLCAidGlja19zZXR1cF9zY2hlZF90aW1lciIsIDIwKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJLy9pZiAoc3RyY21wKHByb2Nlc3MsICJwb3dlcnRvcCIpID09IDApCisJCQkvLwljb250aW51ZTsKKworCQkJaWR4ID0gaW5kZXhfaW5fc3RyaW5ncygiaW5zbW9kXDBtb2Rwcm9iZVwwc3dhcHBlclwwIiwgcHJvY2Vzcyk7CisJCQlpZiAoaWR4ICE9IC0xKSB7CisJCQkJcHJvY2VzcyA9IGlkeCA8IDIgPyAiW2tlcm5lbCBtb2R1bGVdIiA6ICI8a2VybmVsIGNvcmU+IjsKKwkJCX0KKworCQkJc3RyY2hybnVsKHAsICdcbicpWzBdID0gJ1wwJzsKKworCQkJLy8gNDZEXDAxMTM2XDBrb25kZW1hbmQvMVwwZG9fZGJzX3RpbWVyIChkZWxheWVkX3dvcmtfdGltZXJfZm4pCisJCQkvLyBeICAgICAgICAgIF4gICAgICAgICAgICBeCisJCQkvLyBjb3VudCAgICAgIHByb2Nlc3MgICAgICBmdW5jCisKKwkJCS8vaWYgKHN0cmNocihwcm9jZXNzLCAnWycpKQorCQkJCXNwcmludGYobGluZSwgIiUxNS4xNXMgOiAlcyIsIHByb2Nlc3MsIGZ1bmMpOworCQkJLy9lbHNlCisJCQkvLwlzcHJpbnRmKGxpbmUsICIlcyIsIHByb2Nlc3MpOworCQkJc2F2ZV9saW5lKGxpbmUsIGNudCk7CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworI2lmZGVmIF9faTM4Nl9fCisvKgorICogR2V0IGluZm9ybWF0aW9uIGFib3V0IENQVSB1c2luZyBDUFVJRCBvcGNvZGUuCisgKi8KK3N0YXRpYyB2b2lkIGNwdWlkKHVuc2lnbmVkIGludCAqZWF4LCB1bnNpZ25lZCBpbnQgKmVieCwgdW5zaWduZWQgaW50ICplY3gsCisJCQkJICB1bnNpZ25lZCBpbnQgKmVkeCkKK3sKKwkvKiBFQVggdmFsdWUgc3BlY2lmaWVzIHdoYXQgaW5mb3JtYXRpb24gdG8gcmV0dXJuICovCisJX19hc21fXygKKwkJIglwdXNobCAlJWVieFxuIiAgICAgLyogU2F2ZSBFQlggKi8KKwkJIgljcHVpZFxuIgorCQkiCW1vdmwgJSVlYngsICUxXG4iICAvKiBTYXZlIGNvbnRlbnQgb2YgRUJYICovCisJCSIJcG9wbCAlJWVieFxuIiAgICAgIC8qIFJlc3RvcmUgRUJYICovCisJCTogIj1hIigqZWF4KSwgLyogT3V0cHV0ICovCisJCSAgIj1yIigqZWJ4KSwKKwkJICAiPWMiKCplY3gpLAorCQkgICI9ZCIoKmVkeCkKKwkJOiAiMCIoKmVheCksICAvKiBJbnB1dCAqLworCQkgICIxIigqZWJ4KSwKKwkJICAiMiIoKmVjeCksCisJCSAgIjMiKCplZHgpCisJCS8qIE5vIGNsb2JiZXJlZCByZWdpc3RlcnMgKi8KKwkpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2kzODZfXworc3RhdGljIE5PSU5MSU5FIHZvaWQgcHJpbnRfaW50ZWxfY3N0YXRlcyh2b2lkKQoreworCWludCBiaW9zX3RhYmxlWzhdID0geyAwIH07CisJaW50IG5iaW9zID0gMDsKKwlESVIgKmNwdWRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkOworCWludCBpOworCXVuc2lnbmVkIGVheCwgZWJ4LCBlY3gsIGVkeDsKKworCWNwdWRpciA9IG9wZW5kaXIoIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1Iik7CisJaWYgKCFjcHVkaXIpCisJCXJldHVybjsKKworCS8qIExvb3Agb3ZlciBjcHVOIGVudHJpZXMgKi8KKwl3aGlsZSAoKGQgPSByZWFkZGlyKGNwdWRpcikpICE9IE5VTEwpIHsKKwkJRElSICpkaXI7CisJCWludCBsZW47CisJCWNoYXIgZm5hbWVbc2l6ZW9mKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS8vY3B1aWRsZS8vZGVzYyIpICsgMipCSUdfU1lTTkFNRV9MRU5dOworCisJCWxlbiA9IHN0cmxlbihkLT5kX25hbWUpOworCQlpZiAobGVuIDwgMyB8fCBsZW4gPiBCSUdfU1lTTkFNRV9MRU4pCisJCQljb250aW51ZTsKKworCQlpZiAoIWlzZGlnaXQoZC0+ZF9uYW1lWzNdKSkKKwkJCWNvbnRpbnVlOworCisJCWxlbiA9IHNwcmludGYoZm5hbWUsICIlcy8lcy9jcHVpZGxlIiwgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1IiwgZC0+ZF9uYW1lKTsKKwkJZGlyID0gb3BlbmRpcihmbmFtZSk7CisJCWlmICghZGlyKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogRXZlcnkgQy1zdGF0ZSBoYXMgaXRzIG93biBzdGF0ZU4gZGlyZWN0b3J5LCB0aGF0CisJCSAqIGNvbnRhaW5zIGEgJ3RpbWUnIGFuZCBhICd1c2FnZScgZmlsZS4KKwkJICovCisJCXdoaWxlICgoZCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJRklMRSAqZnA7CisJCQljaGFyIGJ1Zls2NF07CisJCQlpbnQgbjsKKworCQkJbiA9IHN0cmxlbihkLT5kX25hbWUpOworCQkJaWYgKG4gPCAzIHx8IG4gPiBCSUdfU1lTTkFNRV9MRU4pCisJCQkJY29udGludWU7CisKKwkJCXNwcmludGYoZm5hbWUgKyBsZW4sICIvJXMvZGVzYyIsIGQtPmRfbmFtZSk7CisJCQlmcCA9IGZvcGVuX2Zvcl9yZWFkKGZuYW1lKTsKKwkJCWlmIChmcCkgeworCQkJCWNoYXIgKnAgPSBmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCk7CisJCQkJZmNsb3NlKGZwKTsKKwkJCQlpZiAoIXApCisJCQkJCWJyZWFrOworCQkJCXAgPSBzdHJzdHIocCwgIk1XQUlUICIpOworCQkJCWlmIChwKSB7CisJCQkJCWludCBwb3M7CisJCQkJCXAgKz0gc2l6ZW9mKCJNV0FJVCAiKSAtIDE7CisJCQkJCXBvcyA9IChiYl9zdHJ0b3VsbChwLCBOVUxMLCAxNikgPj4gNCkgKyAxOworCQkJCQlpZiAocG9zID49IEFSUkFZX1NJWkUoYmlvc190YWJsZSkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJYmlvc190YWJsZVtwb3NdKys7CisJCQkJCW5iaW9zKys7CisJCQkJfQorCQkJfQorCQl9CisJCWNsb3NlZGlyKGRpcik7CisJfQorCWNsb3NlZGlyKGNwdWRpcik7CisKKwlpZiAoIW5iaW9zKQorCQlyZXR1cm47CisKKwllYXggPSA1OworCWVieCA9IGVjeCA9IGVkeCA9IDA7CisJY3B1aWQoJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJaWYgKCFlZHggfHwgIShlY3ggJiAxKSkKKwkJcmV0dXJuOworCisJcHJpbnRmKCJZb3VyIENQVSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIEMtc3RhdGVzOiAiKTsKKwlpID0gMDsKKwl3aGlsZSAoZWR4KSB7CisJCWlmIChlZHggJiA3KQorCQkJcHJpbnRmKCJDJXUgIiwgaSk7CisJCWVkeCA+Pj0gNDsKKwkJaSsrOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCisJLyogUHJpbnQgQklPUyBDLVN0YXRlcyAqLworCXByaW50ZigiWW91ciBCSU9TIHJlcG9ydHMgdGhlIGZvbGxvd2luZyBDLXN0YXRlczogIik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmlvc190YWJsZSk7IGkrKykKKwkJaWYgKGJpb3NfdGFibGVbaV0pCisJCQlwcmludGYoIkMldSAiLCBpKTsKKworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisjZWxzZQorIyBkZWZpbmUgcHJpbnRfaW50ZWxfY3N0YXRlcygpICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNob3dfdGltZXJzdGF0cyh2b2lkKQoreworCXVuc2lnbmVkIGxpbmVzOworCisJLyogR2V0IHRlcm1pbmFsIGhlaWdodCAqLworCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoU1RET1VUX0ZJTEVOTywgTlVMTCwgJmxpbmVzKTsKKworCS8qIFdlIGRvbid0IGhhdmUgd2hvbGUgdGVybWluYWwganVzdCBmb3IgdGltZXJzdGF0cyAqLworCWxpbmVzIC09IDEyOworCisJaWYgKCFHLmNhbnRfZW5hYmxlX3RpbWVyX3N0YXRzKSB7CisJCWludCBpLCBuID0gMDsKKwkJY2hhciBzdHJidWY2WzZdOworCisJCXN0cmJ1ZjZbNV0gPSAnXDAnOworCQlwdXRzKCJcblRvcCBjYXVzZXMgZm9yIHdha2V1cHM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBHLmxpbmVzX2NudDsgaSsrKSB7CisJCQlpZiAoKEcubGluZXNbaV0uY291bnQgPiAwIC8qfHwgRy5saW5lc1tpXS5kaXNrX2NvdW50ID4gMCovKQorCQkJICYmIG4rKyA8IGxpbmVzCisJCQkpIHsKKwkJCQkvKiBOQjogdXBzdHJlYW0gcG93ZXJ0b3AgcHJpbnRzICIod2FrZXVwcy9zZWMpIiwKKwkJCQkgKiB3ZSBwcmludCBqdXN0ICIod2FrZXVwIGNvdW50cykiLgorCQkJCSAqLworCQkJCS8qY2hhciBjID0gJyAnOworCQkJCWlmIChHLmxpbmVzW2ldLmRpc2tfY291bnQpCisJCQkJCWMgPSAnRCc7Ki8KKwkJCQlzbWFydF91bGx0b2E1KEcubGluZXNbaV0uY291bnQsIHN0cmJ1ZjYsICIgS01HVFBFWlkiKTsKKwkJCQlwcmludGYoLyoiICU1LjFmJSUgKCVzKSVjICAlc1xuIiovCisJCQkJCSIgJTUuMWYlJSAoJXMpICAgJXNcbiIsCisJCQkJCUcubGluZXNbaV0uY291bnQgKiAxMDAuMCAvIEcubGluZXNfY3VtdWxhdGl2ZV9jb3VudCwKKwkJCQkJc3RyYnVmNiwgLypjLCovCisJCQkJCUcubGluZXNbaV0uc3RyaW5nKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCWJiX2Vycm9yX21zZygibm8gc3RhdHMgYXZhaWxhYmxlOyBydW4gYXMgcm9vdCBvciIKKwkJCQkiIGVuYWJsZSB0aGUgY3B1ZnJlcV9zdGF0cyBtb2R1bGUiKTsKKwl9Cit9CisKKy8vIEV4YW1wbGUgZGlzcGxheSBmcm9tIHBvd2VydG9wIHZlcnNpb24gMS4xMQorLy8gQ24gICAgICAgICAgICAgICAgQXZnIHJlc2lkZW5jeSAgICAgICBQLXN0YXRlcyAoZnJlcXVlbmNpZXMpCisvLyBDMCAoY3B1IHJ1bm5pbmcpICAgICAgICAoIDAuNSUpICAgICAgICAgMi4wMCBHaHogICAgIDAuMCUKKy8vIHBvbGxpbmcgICAgICAgICAgIDAuMG1zICggMC4wJSkgICAgICAgICAxLjY3IEdoeiAgICAgMC4wJQorLy8gQzEgbXdhaXQgICAgICAgICAgMC4wbXMgKCAwLjAlKSAgICAgICAgIDEzMzMgTWh6ICAgICAwLjElCisvLyBDMiBtd2FpdCAgICAgICAgICAwLjFtcyAoIDAuMSUpICAgICAgICAgMTAwMCBNaHogICAgOTkuOSUKKy8vIEMzIG13YWl0ICAgICAgICAgMTIuMW1zICg5OS40JSkKKy8vCisvLyBXYWtldXBzLWZyb20taWRsZSBwZXIgc2Vjb25kIDogOTMuNiAgICAgaW50ZXJ2YWw6IDE1LjBzCisvLyBubyBBQ1BJIHBvd2VyIHVzYWdlIGVzdGltYXRlIGF2YWlsYWJsZQorLy8KKy8vIFRvcCBjYXVzZXMgZm9yIHdha2V1cHM6CisvLyAgIDMyLjQlICggMjYuNykgICAgICAgPGludGVycnVwdD4gOiBleHRyYSB0aW1lciBpbnRlcnJ1cHQKKy8vICAgMjkuMCUgKCAyMy45KSAgICAgPGtlcm5lbCBjb3JlPiA6IGhydGltZXJfc3RhcnRfcmFuZ2VfbnMgKHRpY2tfc2NoZWRfdGltZXIpCisvLyAgICA5LjAlICggIDcuNSkgICAgIDxrZXJuZWwgY29yZT4gOiBocnRpbWVyX3N0YXJ0ICh0aWNrX3NjaGVkX3RpbWVyKQorLy8gICAgNi41JSAoICA1LjMpICAgICAgIDxpbnRlcnJ1cHQ+IDogYXRhX3BpaXgKKy8vICAgIDUuMCUgKCAgNC4xKSAgICAgICAgICAgICBpbmV0ZCA6IGhydGltZXJfc3RhcnRfcmFuZ2VfbnMgKGhydGltZXJfd2FrZXVwKQorCisvL3VzYWdlOiNkZWZpbmUgcG93ZXJ0b3BfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBwb3dlcnRvcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkFuYWx5emUgcG93ZXIgY29uc3VtcHRpb24gb24gSW50ZWwtYmFzZWQgbGFwdG9wc1xuIgorCitpbnQgcG93ZXJ0b3BfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBvd2VydG9wX21haW4oaW50IFVOVVNFRF9QQVJBTSBhcmdjLCBjaGFyIFVOVVNFRF9QQVJBTSAqKmFyZ3YpCit7CisJdWxsb25nIGN1cl91c2FnZVtNQVhfQ1NUQVRFX0NPVU5UXTsKKwl1bGxvbmcgY3VyX2R1cmF0aW9uW01BWF9DU1RBVEVfQ09VTlRdOworCWNoYXIgY3N0YXRlX2xpbmVzW01BWF9DU1RBVEVfQ09VTlQgKyAyXVs2NF07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwlzdHJ1Y3QgdGVybWlvcyBuZXdfc2V0dGluZ3M7CisJc3RydWN0IHBvbGxmZCBwZmRbMV07CisKKwlwZmRbMF0uZmQgPSAwOworCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisjZW5kaWYKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9XRVJUT1BfUFJPQ0lSUSAmJiBCTE9BVFlfSFBFVF9JUlFfTlVNX0RFVEVDVElPTgorCUcucGVyY3B1X2hwZXRfc3RhcnQgPSBJTlRfTUFYOworCUcucGVyY3B1X2hwZXRfZW5kID0gSU5UX01JTjsKKyNlbmRpZgorCisJLyogUHJpbnQgd2FybmluZyB3aGVuIHdlIGRvbid0IGhhdmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMgKi8KKwlpZiAoZ2V0ZXVpZCgpICE9IDApCisJCWJiX2Vycm9yX21zZygicnVuIGFzIHJvb3QgdG8gY29sbGVjdCBlbm91Z2ggaW5mb3JtYXRpb24iKTsKKworCS8qIEdldCBudW1iZXIgb2YgQ1BVcyAqLworCUcudG90YWxfY3B1cyA9IGdldF9jcHVfY291bnQoKTsKKworCXByaW50ZigiQ29sbGVjdGluZyBkYXRhIGZvciAiREVGQVVMVF9TTEVFUF9TVFIiIHNlY29uZHNcbiIpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwl0Y2dldGF0dHIoMCwgKHZvaWQgKikmRy5pbml0X3NldHRpbmdzKTsKKwltZW1jcHkoJm5ld19zZXR0aW5ncywgJkcuaW5pdF9zZXR0aW5ncywgc2l6ZW9mKG5ld19zZXR0aW5ncykpOworCS8qIFR1cm4gb24gdW5idWZmZXJlZCBpbnB1dCwgdHVybiBvZmYgZWNob2luZyAqLworCW5ld19zZXR0aW5ncy5jX2xmbGFnICY9IH4oSVNJRyB8IElDQU5PTiB8IEVDSE8gfCBFQ0hPTkwpOworCS8qIFNvIHdlIGRvbid0IGZvcmdldCB0byByZXNldCB0ZXJtIHNldHRpbmdzICovCisJYXRleGl0KHJlc2V0X3Rlcm0pOworCWJiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgc2lnX2hhbmRsZXIpOworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZuZXdfc2V0dGluZ3MpOworI2VuZGlmCisKKwkvKiBDb2xsZWN0IGluaXRpYWwgZGF0YSAqLworCXByb2Nlc3NfaXJxX2NvdW50cygpOworCisJLyogUmVhZCBpbml0aWFsIHVzYWdlIGFuZCBkdXJhdGlvbiAqLworCXJlYWRfY3N0YXRlX2NvdW50cyhHLnN0YXJ0X3VzYWdlLCBHLnN0YXJ0X2R1cmF0aW9uKTsKKworCS8qIENvcHkgdGhlbSB0byAibGFzdCIgKi8KKwltZW1jcHkoRy5sYXN0X3VzYWdlLCBHLnN0YXJ0X3VzYWdlLCBzaXplb2YoRy5sYXN0X3VzYWdlKSk7CisJbWVtY3B5KEcubGFzdF9kdXJhdGlvbiwgRy5zdGFydF9kdXJhdGlvbiwgc2l6ZW9mKEcubGFzdF9kdXJhdGlvbikpOworCisJLyogRGlzcGxheSBDLXN0YXRlcyAqLworCXByaW50X2ludGVsX2NzdGF0ZXMoKTsKKworCUcuY2FudF9lbmFibGVfdGltZXJfc3RhdHMgfD0gc3RvcF90aW1lcigpOyAvKiAxIG9uIGVycm9yICovCisKKwkvKiBUaGUgbWFpbiBsb29wICovCisJZm9yICg7OykgeworCQkvL2RvdWJsZSBtYXhzbGVlcCA9IDAuMDsKKwkJdWxsb25nIHRvdGFsdGlja3MsIHRvdGFsZXZlbnRzOworCQlpbnQgaTsKKworCQlHLmNhbnRfZW5hYmxlX3RpbWVyX3N0YXRzIHw9IHN0YXJ0X3RpbWVyKCk7IC8qIDEgb24gZXJyb3IgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwkJc2xlZXAoREVGQVVMVF9TTEVFUCk7CisjZWxzZQorCQlpZiAoc2FmZV9wb2xsKHBmZCwgMSwgREVGQVVMVF9TTEVFUCAqIDEwMDApID4gMCkgeworCQkJdW5zaWduZWQgY2hhciBjOworCQkJaWYgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSAhPSAxKQorCQkJCWJyZWFrOyAvKiBFT0YvZXJyb3IgKi8KKwkJCWlmIChjID09IEcuaW5pdF9zZXR0aW5ncy5jX2NjW1ZJTlRSXSkKKwkJCQlicmVhazsgLyogXkMgKi8KKwkJCWlmICgoYyB8IDB4MjApID09ICdxJykKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCUcuY2FudF9lbmFibGVfdGltZXJfc3RhdHMgfD0gc3RvcF90aW1lcigpOyAvKiAxIG9uIGVycm9yICovCisKKwkJY2xlYXJfbGluZXMoKTsKKwkJcHJvY2Vzc19pcnFfY291bnRzKCk7CisKKwkJLyogQ2xlYXIgdGhlIHN0YXRzICovCisJCW1lbXNldChjdXJfZHVyYXRpb24sIDAsIHNpemVvZihjdXJfZHVyYXRpb24pKTsKKwkJbWVtc2V0KGN1cl91c2FnZSwgMCwgc2l6ZW9mKGN1cl91c2FnZSkpOworCisJCS8qIFJlYWQgdGhlbSAqLworCQlyZWFkX2NzdGF0ZV9jb3VudHMoY3VyX3VzYWdlLCBjdXJfZHVyYXRpb24pOworCisJCS8qIENvdW50IHRvdGFsdGlja3MgYW5kIHRvdGFsZXZlbnRzICovCisJCXRvdGFsdGlja3MgPSB0b3RhbGV2ZW50cyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1NUQVRFX0NPVU5UOyBpKyspIHsKKwkJCWlmIChjdXJfdXNhZ2VbaV0gIT0gMCkgeworCQkJCXRvdGFsdGlja3MgKz0gY3VyX2R1cmF0aW9uW2ldIC0gRy5sYXN0X2R1cmF0aW9uW2ldOworCQkJCXRvdGFsZXZlbnRzICs9IGN1cl91c2FnZVtpXSAtIEcubGFzdF91c2FnZVtpXTsKKwkJCX0KKwkJfQorCisJCS8qIENsZWFyIHRoZSBzY3JlZW4gKi8KKwkJcHJpbnRmKCJcMDMzW0hcMDMzW0oiKTsKKworCQkvKiBDbGVhciBDLXN0YXRlIGxpbmVzICovCisJCW1lbXNldCgmY3N0YXRlX2xpbmVzLCAwLCBzaXplb2YoY3N0YXRlX2xpbmVzKSk7CisKKwkJaWYgKHRvdGFsZXZlbnRzID09IDAgJiYgRy5tYXhjc3RhdGUgPD0gMSkgeworCQkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJc3RyY3B5KGNzdGF0ZV9saW5lc1swXSwgIkMtc3RhdGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZVxuIik7CisJCX0gZWxzZSB7CisJCQlkb3VibGUgcGVyY2VudGFnZTsKKwkJCXVuc2lnbmVkIG5ld3RpY2tzOworCisJCQluZXd0aWNrcyA9IEcudG90YWxfY3B1cyAqIERFRkFVTFRfU0xFRVAgKiBGUkVRX0FDUElfMTAwMCAtIHRvdGFsdGlja3M7CisJCQkvKiBIYW5kbGUgcm91bmRpbmcgZXJyb3JzOiBkbyBub3QgZGlzcGxheSBuZWdhdGl2ZSB2YWx1ZXMgKi8KKwkJCWlmICgoaW50KW5ld3RpY2tzIDwgMCkKKwkJCQluZXd0aWNrcyA9IDA7CisKKwkJCXNwcmludGYoY3N0YXRlX2xpbmVzWzBdLCAiQ25cdFx0ICBBdmcgcmVzaWRlbmN5XG4iKTsKKwkJCXBlcmNlbnRhZ2UgPSBuZXd0aWNrcyAqIDEwMC4wIC8gKEcudG90YWxfY3B1cyAqIERFRkFVTFRfU0xFRVAgKiBGUkVRX0FDUElfMTAwMCk7CisJCQlzcHJpbnRmKGNzdGF0ZV9saW5lc1sxXSwgIkMwIChjcHUgcnVubmluZykgICAgICAgICglNC4xZiUlKVxuIiwgcGVyY2VudGFnZSk7CisKKwkJCS8qIENvbXB1dGUgdmFsdWVzIGZvciBpbmRpdmlkdWFsIEMtc3RhdGVzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NTVEFURV9DT1VOVDsgaSsrKSB7CisJCQkJaWYgKGN1cl91c2FnZVtpXSAhPSAwKSB7CisJCQkJCWRvdWJsZSBzbGVwdDsKKwkJCQkJc2xlcHQgPSAoY3VyX2R1cmF0aW9uW2ldIC0gRy5sYXN0X2R1cmF0aW9uW2ldKQorCQkJCQkJLyAoY3VyX3VzYWdlW2ldIC0gRy5sYXN0X3VzYWdlW2ldICsgMC4xKSAvIEZSRVFfQUNQSTsKKwkJCQkJcGVyY2VudGFnZSA9IChjdXJfZHVyYXRpb25baV0gLSBHLmxhc3RfZHVyYXRpb25baV0pICogMTAwCisJCQkJCQkvIChHLnRvdGFsX2NwdXMgKiBERUZBVUxUX1NMRUVQICogRlJFUV9BQ1BJXzEwMDApOworCQkJCQlzcHJpbnRmKGNzdGF0ZV9saW5lc1tpICsgMl0sICJDJXVcdFx0JTUuMWZtcyAoJTQuMWYlJSlcbiIsCisJCQkJCQlpICsgMSwgc2xlcHQsIHBlcmNlbnRhZ2UpOworCQkJCQkvL2lmIChtYXhzbGVlcCA8IHNsZXB0KQorCQkJCQkvLwltYXhzbGVlcCA9IHNsZXB0OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1NUQVRFX0NPVU5UICsgMjsgaSsrKQorCQkJaWYgKGNzdGF0ZV9saW5lc1tpXVswXSkKKwkJCQlmcHV0cyhjc3RhdGVfbGluZXNbaV0sIHN0ZG91dCk7CisKKwkJaSA9IHByb2Nlc3NfdGltZXJfc3RhdHMoKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1dFUlRPUF9QUk9DSVJRCisJCWlmICh0b3RhbGV2ZW50cyA9PSAwKSB7CisJCQkvKiBObyBDLXN0YXRlIGluZm8gYXZhaWxhYmxlLCB1c2UgdGltZXJzdGF0cyAqLworCQkJdG90YWxldmVudHMgPSBpICogRy50b3RhbF9jcHVzICsgRy50b3RhbF9pbnRlcnJ1cHQ7CisJCQlpZiAoaSA8IDApCisJCQkJdG90YWxldmVudHMgKz0gRy5pbnRlcnJ1cHRfMCAtIGk7CisJCX0KKyNlbmRpZgorCQkvKiBVcHN0cmVhbSBwb3dlcnRvcCBwcmludHMgd2FrZXVwcyBwZXIgc2VjIHBlciBDUFUsCisJCSAqIHdlIHByaW50IGp1c3QgcmF3IHdha2V1cCBjb3VudHMuCisJCSAqLworLy9UT0RPOiBzaG93IHJlYWwgc2Vjb25kcyAodGhpbmsgYWJvdXQgbWFudWFsIHJlZnJlc2gpCisJCXByaW50ZigiXG5XYWtldXBzLWZyb20taWRsZSBpbiAldSBzZWNvbmRzOiAlbGx1XG4iLAorCQkJREVGQVVMVF9TTEVFUCwKKwkJCXRvdGFsZXZlbnRzCisJCSk7CisKKwkJdXBkYXRlX2xpbmVzX2N1bXVsYXRpdmVfY291bnQoKTsKKwkJc29ydF9saW5lcygpOworCQlzaG93X3RpbWVyc3RhdHMoKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisKKwkJLyogQ2xlYXIgdGhlIHN0YXRzICovCisJCW1lbXNldChjdXJfZHVyYXRpb24sIDAsIHNpemVvZihjdXJfZHVyYXRpb24pKTsKKwkJbWVtc2V0KGN1cl91c2FnZSwgMCwgc2l6ZW9mKGN1cl91c2FnZSkpOworCisJCS8qIEdldCBuZXcgdmFsdWVzICovCisJCXJlYWRfY3N0YXRlX2NvdW50cyhjdXJfdXNhZ2UsIGN1cl9kdXJhdGlvbik7CisKKwkJLyogU2F2ZSB0aGVtICovCisJCW1lbWNweShHLmxhc3RfdXNhZ2UsIGN1cl91c2FnZSwgc2l6ZW9mKEcubGFzdF91c2FnZSkpOworCQltZW1jcHkoRy5sYXN0X2R1cmF0aW9uLCBjdXJfZHVyYXRpb24sIHNpemVvZihHLmxhc3RfZHVyYXRpb24pKTsKKwl9IC8qIGZvciAoOzspICovCisKKwliYl9wdXRjaGFyKCdcbicpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wcy5jIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjMGY3YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wcy5jCkBAIC0wLDAgKzEsNzA3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHBzIGltcGxlbWVudGF0aW9uKHMpIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogRml4IGZvciBTRUxpbnV4IFN1cHBvcnQ6KGMpMjAwNyBIaXJvc2hpIFNoaW5qaSA8c2hpcm9zaGlAbXkuZW1haWwubmUuanA+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAoYykyMDA3IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojaWYgRU5BQkxFX0RFU0tUT1AKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcHNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbyBDT0wxLENPTDI9SEVBREVSXSIgSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFMoIiBbLVRdIikKKy8vdXNhZ2U6I2RlZmluZSBwc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgbGlzdCBvZiBwcm9jZXNzZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW8gQ09MMSxDT0wyPUhFQURFUglTZWxlY3QgY29sdW1ucyBmb3IgZGlzcGxheSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0hPV19USFJFQURTKAorLy91c2FnZTogICAgICJcbgktVAkJCVNob3cgdGhyZWFkcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNlbHNlIC8qICFFTkFCTEVfREVTS1RPUCAqLworLy91c2FnZToKKy8vdXNhZ2U6I2lmICFFTkFCTEVfU0VMSU5VWCAmJiAhRU5BQkxFX0ZFQVRVUkVfUFNfV0lERQorLy91c2FnZTojZGVmaW5lIFVTQUdFX1BTICJcblRoaXMgdmVyc2lvbiBvZiBwcyBhY2NlcHRzIG5vIG9wdGlvbnMiCisvL3VzYWdlOiNlbHNlCisvL3VzYWdlOiNkZWZpbmUgVVNBR0VfUFMgIiIKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHBzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgcHNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGxpc3Qgb2YgcHJvY2Vzc2VzXG4iCisvL3VzYWdlOglVU0FHRV9QUworLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLVoJU2hvdyBzZWxpbnV4IGNvbnRleHQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1BTX1dJREUoCisvL3VzYWdlOiAgICAgIlxuCXcJV2lkZSBvdXRwdXQiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZW5kaWYgLyogRU5BQkxFX0RFU0tUT1AgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcHNfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcHNcbiIKKy8vdXNhZ2U6ICAgICAgICIgIFBJRCAgVWlkICAgICAgR2lkIFN0YXRlIENvbW1hbmRcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgMSByb290ICAgICByb290ICAgICBTIGluaXRcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgMiByb290ICAgICByb290ICAgICBTIFtrZmx1c2hkXVxuIgorLy91c2FnZTogICAgICAgIiAgICAzIHJvb3QgICAgIHJvb3QgICAgIFMgW2t1cGRhdGVdXG4iCisvL3VzYWdlOiAgICAgICAiICAgIDQgcm9vdCAgICAgcm9vdCAgICAgUyBba3Bpb2RdXG4iCisvL3VzYWdlOiAgICAgICAiICAgIDUgcm9vdCAgICAgcm9vdCAgICAgUyBba3N3YXBkXVxuIgorLy91c2FnZTogICAgICAgIiAgNzQyIGFuZGVyc2VuIGFuZGVyc2VuIFMgW2Jhc2hdXG4iCisvL3VzYWdlOiAgICAgICAiICA3NDMgYW5kZXJzZW4gYW5kZXJzZW4gUyAtYmFzaFxuIgorLy91c2FnZTogICAgICAgIiAgNzQ1IHJvb3QgICAgIHJvb3QgICAgIFMgW2dldHR5XVxuIgorLy91c2FnZTogICAgICAgIiAyOTkwIGFuZGVyc2VuIGFuZGVyc2VuIFIgcHNcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEFic29sdXRlIG1heGltdW0gb24gb3V0cHV0IGxpbmUgbGVuZ3RoICovCitlbnVtIHsgTUFYX1dJRFRIID0gMioxMDI0IH07CisKKyNpZiBFTkFCTEVfREVTS1RPUAorCisjaWZkZWYgX19saW51eF9fCisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4gLyogZm9yIHRpbWVzKCkgKi8KKyNpZm5kZWYgQVRfQ0xLVENLCisjIGRlZmluZSBBVF9DTEtUQ0sgMTcKKyNlbmRpZgorCisvKiBUT0RPOgorICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3BzLmh0bWwKKyAqIHNwZWNpZmllcyAoZm9yIFhTSS1jb25mb3JtYW50IHN5c3RlbXMpIGZvbGxvd2luZyBkZWZhdWx0IGNvbHVtbnMKKyAqIChsIGFuZCBmIG1hcmsgY29sdW1ucyBzaG93biB3aXRoIC1sIGFuZCAtZiByZXNwZWN0aXZlbHkpOgorICogRiAgICAgbCAgIEZsYWdzIChvY3RhbCBhbmQgYWRkaXRpdmUpIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2VzcyAoPz8pCisgKiBTICAgICBsICAgVGhlIHN0YXRlIG9mIHRoZSBwcm9jZXNzCisgKiBVSUQgICBmLGwgVGhlIHVzZXIgSUQ7IHRoZSBsb2dpbiBuYW1lIGlzIHByaW50ZWQgd2l0aCAtZgorICogUElEICAgICAgIFRoZSBwcm9jZXNzIElECisgKiBQUElEICBmLGwgVGhlIHBhcmVudCBwcm9jZXNzCisgKiBDICAgICBmLGwgUHJvY2Vzc29yIHV0aWxpemF0aW9uCisgKiBQUkkgICBsICAgVGhlIHByaW9yaXR5IG9mIHRoZSBwcm9jZXNzOyBoaWdoZXIgbnVtYmVycyBtZWFuIGxvd2VyIHByaW9yaXR5CisgKiBOSSAgICBsICAgTmljZSB2YWx1ZQorICogQUREUiAgbCAgIFRoZSBhZGRyZXNzIG9mIHRoZSBwcm9jZXNzCisgKiBTWiAgICBsICAgVGhlIHNpemUgaW4gYmxvY2tzIG9mIHRoZSBjb3JlIGltYWdlIG9mIHRoZSBwcm9jZXNzCisgKiBXQ0hBTiBsICAgVGhlIGV2ZW50IGZvciB3aGljaCB0aGUgcHJvY2VzcyBpcyB3YWl0aW5nIG9yIHNsZWVwaW5nCisgKiBTVElNRSBmICAgU3RhcnRpbmcgdGltZSBvZiB0aGUgcHJvY2VzcworICogVFRZICAgICAgIFRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBmb3IgdGhlIHByb2Nlc3MKKyAqIFRJTUUgICAgICBUaGUgY3VtdWxhdGl2ZSBleGVjdXRpb24gdGltZSBmb3IgdGhlIHByb2Nlc3MKKyAqIENNRCAgICAgICBUaGUgY29tbWFuZCBuYW1lOyB0aGUgZnVsbCBjb21tYW5kIGxpbmUgaXMgc2hvd24gd2l0aCAtZgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3Qgd2lkdGg7CisJY2hhciBuYW1lNls2XTsKKwljb25zdCBjaGFyICpoZWFkZXI7CisJdm9pZCAoKmYpKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpOworCWludCBwc19mbGFnczsKK30gcHNfb3V0X3Q7CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlwc19vdXRfdCogb3V0OworCWludCBvdXRfY250OworCWludCBwcmludF9oZWFkZXI7CisJaW50IG5lZWRfZmxhZ3M7CisJY2hhciAqYnVmZmVyOworCXVuc2lnbmVkIHRlcm1pbmFsX3dpZHRoOworI2lmIEVOQUJMRV9GRUFUVVJFX1BTX1RJTUUKKwl1bnNpZ25lZCBrZXJuZWxfSFo7CisJdW5zaWduZWQgbG9uZyBsb25nIHNlY29uZHNfc2luY2VfYm9vdDsKKyNlbmRpZgorfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgb3V0ICAgICAgICAgICAgICAgIChHLm91dCAgICAgICAgICAgICAgICkKKyNkZWZpbmUgb3V0X2NudCAgICAgICAgICAgIChHLm91dF9jbnQgICAgICAgICAgICkKKyNkZWZpbmUgcHJpbnRfaGVhZGVyICAgICAgIChHLnByaW50X2hlYWRlciAgICAgICkKKyNkZWZpbmUgbmVlZF9mbGFncyAgICAgICAgIChHLm5lZWRfZmxhZ3MgICAgICAgICkKKyNkZWZpbmUgYnVmZmVyICAgICAgICAgICAgIChHLmJ1ZmZlciAgICAgICAgICAgICkKKyNkZWZpbmUgdGVybWluYWxfd2lkdGggICAgIChHLnRlcm1pbmFsX3dpZHRoICAgICkKKyNkZWZpbmUga2VybmVsX0haICAgICAgICAgIChHLmtlcm5lbF9IWiAgICAgICAgICkKKyNkZWZpbmUgc2Vjb25kc19zaW5jZV9ib290IChHLnNlY29uZHNfc2luY2VfYm9vdCkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVElNRQorLyogZm9yIEVMRiBleGVjdXRhYmxlcywgbm90ZXMgYXJlIHB1c2hlZCBiZWZvcmUgZW52aXJvbm1lbnQgYW5kIGFyZ3MgKi8KK3N0YXRpYyBwdHJkaWZmX3QgZmluZF9lbGZfbm90ZShwdHJkaWZmX3QgZmluZG1lKQoreworCXB0cmRpZmZfdCAqZXAgPSAocHRyZGlmZl90ICopIGVudmlyb247CisKKwl3aGlsZSAoKmVwKyspCisJCWNvbnRpbnVlOworCXdoaWxlICgqZXApIHsKKwkJaWYgKGVwWzBdID09IGZpbmRtZSkgeworCQkJcmV0dXJuIGVwWzFdOworCQl9CisJCWVwICs9IDI7CisJfQorCXJldHVybiAtMTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUworc3RhdGljIHVuc2lnbmVkIGdldF9IWl9ieV93YWl0aW5nKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHYxLCB0djI7CisJdW5zaWduZWQgdDEsIHQyLCByLCBoejsKKwl1bnNpZ25lZCBjbnQgPSBjbnQ7IC8qIGZvciBjb21waWxlciAqLworCWludCBkaWZmOworCisJciA9IDA7CisKKwkvKiBXYWl0IGZvciB0aW1lcygpIHRvIHJlYWNoIG5ldyB0aWNrICovCisJdDEgPSB0aW1lcyhOVUxMKTsKKwlkbyB7CisJCXQyID0gdGltZXMoTlVMTCk7CisJfSB3aGlsZSAodDIgPT0gdDEpOworCWdldHRpbWVvZmRheSgmdHYyLCBOVUxMKTsKKworCWRvIHsKKwkJdDEgPSB0MjsKKwkJdHYxLnR2X3VzZWMgPSB0djIudHZfdXNlYzsKKworCQkvKiBXYWl0IGV4YWN0bHkgb25lIHRpbWVzKCkgdGljayAqLworCQlkbyB7CisJCQl0MiA9IHRpbWVzKE5VTEwpOworCQl9IHdoaWxlICh0MiA9PSB0MSk7CisJCWdldHRpbWVvZmRheSgmdHYyLCBOVUxMKTsKKworCQkvKiBDYWxjdWxhdGUgdGlja3MgcGVyIHNlYywgcm91bmRpbmcgdXAgdG8gZXZlbiAqLworCQlkaWZmID0gdHYyLnR2X3VzZWMgLSB0djEudHZfdXNlYzsKKwkJaWYgKGRpZmYgPD0gMCkgZGlmZiArPSAxMDAwMDAwOworCQloeiA9IDEwMDAwMDB1IC8gKHVuc2lnbmVkKWRpZmY7CisJCWh6ID0gKGh6KzEpICYgfjE7CisKKwkJLyogQ291bnQgaG93IG1hbnkgc2FtZSBoeiB2YWx1ZXMgd2Ugc2F3ICovCisJCWlmIChyICE9IGh6KSB7CisJCQlyID0gaHo7CisJCQljbnQgPSAwOworCQl9CisJCWNudCsrOworCX0gd2hpbGUgKGNudCA8IDMpOyAvKiBleGl0IGlmIHNhdyAzIHNhbWUgdmFsdWVzICovCisKKwlyZXR1cm4gcjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9IWl9ieV93YWl0aW5nKHZvaWQpCit7CisJLyogQmV0dGVyIG1ldGhvZD8gKi8KKwlyZXR1cm4gMTAwOworfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBnZXRfa2VybmVsX0haKHZvaWQpCit7CisJLy9jaGFyIGJ1Zls2NF07CisJc3RydWN0IHN5c2luZm8gaW5mbzsKKworCWlmIChrZXJuZWxfSFopCisJCXJldHVybiBrZXJuZWxfSFo7CisKKwkvKiBXb3JrcyBmb3IgRUxGIG9ubHksIExpbnV4IDIuNC4wKyAqLworCWtlcm5lbF9IWiA9IGZpbmRfZWxmX25vdGUoQVRfQ0xLVENLKTsKKwlpZiAoa2VybmVsX0haID09ICh1bnNpZ25lZCktMSkKKwkJa2VybmVsX0haID0gZ2V0X0haX2J5X3dhaXRpbmcoKTsKKworCS8vaWYgKG9wZW5fcmVhZF9jbG9zZSgiL3Byb2MvdXB0aW1lIiwgYnVmLCBzaXplb2YoYnVmKSkgPD0gMCkKKwkvLwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJXMiLCAiL3Byb2MvdXB0aW1lIik7CisJLy9idWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOworCS8vL3NzY2FuZihidWYsICIlbGx1IiwgJnNlY29uZHNfc2luY2VfYm9vdCk7CisJc3lzaW5mbygmaW5mbyk7CisJc2Vjb25kc19zaW5jZV9ib290ID0gaW5mby51cHRpbWU7CisKKwlyZXR1cm4ga2VybmVsX0haOworfQorI2VuZGlmCisKKy8qIFByaW50IHZhbHVlIHRvIGJ1ZiwgbWF4IHNpemUrMSBjaGFycyAoaW5jbHVkaW5nIHRyYWlsaW5nICdcMCcpICovCisKK3N0YXRpYyB2b2lkIGZ1bmNfdXNlcihjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworI2lmIDEKKwlzYWZlX3N0cm5jcHkoYnVmLCBnZXRfY2FjaGVkX3VzZXJuYW1lKHBzLT51aWQpLCBzaXplKzEpOworI2Vsc2UKKwkvKiAiY29tcGF0aWJsZSIgdmVyc2lvbiwgYnV0IGl0J3MgbGFyZ2VyICovCisJLyogcHJvY3BzIDIuMTggc2hvd3MgbnVtZXJpYyBVSUQgaWYgbmFtZSBvdmVyZmxvd3MgdGhlIGZpZWxkICovCisJLyogVE9ETzogZ2V0X2NhY2hlZF91c2VybmFtZSgpIHJldHVybnMgbnVtZXJpYyBzdHJpbmcgaWYKKwkgKiB1c2VyIGhhcyBubyBwYXNzd2QgcmVjb3JkLCB3ZSB3aWxsIGRpc3BsYXkgaXQKKwkgKiBsZWZ0LWp1c3RpZmllZCBoZXJlOyB0b28gbG9uZyB1c2VybmFtZXMgYXJlIHNob3duCisJICogYXMgX3JpZ2h0LWp1c3RpZmllZF8gSURzLiBJcyBpdCB3b3J0aCBmaXhpbmc/ICovCisJY29uc3QgY2hhciAqdXNlciA9IGdldF9jYWNoZWRfdXNlcm5hbWUocHMtPnVpZCk7CisJaWYgKHN0cmxlbih1c2VyKSA8PSBzaXplKQorCQlzYWZlX3N0cm5jcHkoYnVmLCB1c2VyLCBzaXplKzEpOworCWVsc2UKKwkJc3ByaW50ZihidWYsICIlKnUiLCBzaXplLCAodW5zaWduZWQpcHMtPnVpZCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnVuY19ncm91cChjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNhZmVfc3RybmNweShidWYsIGdldF9jYWNoZWRfZ3JvdXBuYW1lKHBzLT5naWQpLCBzaXplKzEpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX2NvbW0oY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzYWZlX3N0cm5jcHkoYnVmLCBwcy0+Y29tbSwgc2l6ZSsxKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19zdGF0ZShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNhZmVfc3RybmNweShidWYsIHBzLT5zdGF0ZSwgc2l6ZSsxKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19hcmdzKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJcmVhZF9jbWRsaW5lKGJ1Ziwgc2l6ZSsxLCBwcy0+cGlkLCBwcy0+Y29tbSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfcGlkKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc3ByaW50ZihidWYsICIlKnUiLCBzaXplLCBwcy0+cGlkKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19wcGlkKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc3ByaW50ZihidWYsICIlKnUiLCBzaXplLCBwcy0+cHBpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfcGdpZChjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNwcmludGYoYnVmLCAiJSp1Iiwgc2l6ZSwgcHMtPnBnaWQpOworfQorCitzdGF0aWMgdm9pZCBwdXRfbHUoY2hhciAqYnVmLCBpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyB1KQoreworCWNoYXIgYnVmNFs1XTsKKworCS8qIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RlcmEgKi8KKwlzbWFydF91bGx0b2E0KHUsIGJ1ZjQsICIgbWd0cGV6eSIpOworCWJ1ZjRbNF0gPSAnXDAnOworCXNwcmludGYoYnVmLCAiJS4qcyIsIHNpemUsIGJ1ZjQpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3ZzeihjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXB1dF9sdShidWYsIHNpemUsIHBzLT52c3opOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3JzcyhjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXB1dF9sdShidWYsIHNpemUsIHBzLT5yc3MpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3R0eShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCWJ1ZlswXSA9ICc/JzsKKwlidWZbMV0gPSAnXDAnOworCWlmIChwcy0+dHR5X21ham9yKSAvKiB0dHkgZmllbGQgb2YgIjAiIG1lYW5zICJubyB0dHkiICovCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZSsxLCAiJXUsJXUiLCBwcy0+dHR5X21ham9yLCBwcy0+dHR5X21pbm9yKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUworCitzdGF0aWMgdm9pZCBmdW5jX3Jncm91cChjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNhZmVfc3RybmNweShidWYsIGdldF9jYWNoZWRfZ3JvdXBuYW1lKHBzLT5yZ2lkKSwgc2l6ZSsxKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19ydXNlcihjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNhZmVfc3RybmNweShidWYsIGdldF9jYWNoZWRfdXNlcm5hbWUocHMtPnJ1aWQpLCBzaXplKzEpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX25pY2UoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzcHJpbnRmKGJ1ZiwgIiUqZCIsIHNpemUsIHBzLT5uaWNlbmVzcyk7Cit9CisKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVElNRQorCitzdGF0aWMgdm9pZCBmdW5jX2V0aW1lKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJLyogZWxhcHNlZCB0aW1lIFtbZGQtXWhoOl1tbTpzczsgaGVyZSBvbmx5IG1tOnNzICovCisJdW5zaWduZWQgbG9uZyBtbTsKKwl1bnNpZ25lZCBzczsKKworCW1tID0gcHMtPnN0YXJ0X3RpbWUgLyBnZXRfa2VybmVsX0haKCk7CisJLyogbXVzdCBiZSBhZnRlciBnZXRfa2VybmVsX0haKCkhICovCisJbW0gPSBzZWNvbmRzX3NpbmNlX2Jvb3QgLSBtbTsKKwlzcyA9IG1tICUgNjA7CisJbW0gLz0gNjA7CisJc25wcmludGYoYnVmLCBzaXplKzEsICIlM2x1OiUwMnUiLCBtbSwgc3MpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3RpbWUoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwkvKiBjdW11bGF0aXZlIHRpbWUgW1tkZC1daGg6XW1tOnNzOyBoZXJlIG9ubHkgbW06c3MgKi8KKwl1bnNpZ25lZCBsb25nIG1tOworCXVuc2lnbmVkIHNzOworCisJbW0gPSAocHMtPnV0aW1lICsgcHMtPnN0aW1lKSAvIGdldF9rZXJuZWxfSFooKTsKKwlzcyA9IG1tICUgNjA7CisJbW0gLz0gNjA7CisJc25wcmludGYoYnVmLCBzaXplKzEsICIlM2x1OiUwMnUiLCBtbSwgc3MpOworfQorCisjZW5kaWYKKworI2lmIEVOQUJMRV9TRUxJTlVYCitzdGF0aWMgdm9pZCBmdW5jX2xhYmVsKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc2FmZV9zdHJuY3B5KGJ1ZiwgcHMtPmNvbnRleHQgPyBwcy0+Y29udGV4dCA6ICJ1bmtub3duIiwgc2l6ZSsxKTsKK30KKyNlbmRpZgorCisvKgorc3RhdGljIHZvaWQgZnVuY19uaWNlKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJcHMtPj8/PworfQorCitzdGF0aWMgdm9pZCBmdW5jX3BjcHUoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKK30KKyovCisKK3N0YXRpYyBjb25zdCBwc19vdXRfdCBvdXRfc3BlY1tdID0geworLyogTWFuZGF0ZWQgYnkgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3BzLmh0bWw6ICovCisJeyA4ICAgICAgICAgICAgICAgICAgLCAidXNlciIgICwiVVNFUiIgICAsZnVuY191c2VyICAsUFNTQ0FOX1VJREdJRCAgfSwKKwl7IDggICAgICAgICAgICAgICAgICAsICJncm91cCIgLCJHUk9VUCIgICxmdW5jX2dyb3VwICxQU1NDQU5fVUlER0lEICB9LAorCXsgMTYgICAgICAgICAgICAgICAgICwgImNvbW0iICAsIkNPTU1BTkQiLGZ1bmNfY29tbSAgLFBTU0NBTl9DT01NICAgIH0sCisJeyBNQVhfV0lEVEggICAgICAgICAgLCAiYXJncyIgICwiQ09NTUFORCIsZnVuY19hcmdzICAsUFNTQ0FOX0NPTU0gICAgfSwKKwl7IDUgICAgICAgICAgICAgICAgICAsICJwaWQiICAgLCJQSUQiICAgICxmdW5jX3BpZCAgICxQU1NDQU5fUElEICAgICB9LAorCXsgNSAgICAgICAgICAgICAgICAgICwgInBwaWQiICAsIlBQSUQiICAgLGZ1bmNfcHBpZCAgLFBTU0NBTl9QUElEICAgIH0sCisJeyA1ICAgICAgICAgICAgICAgICAgLCAicGdpZCIgICwiUEdJRCIgICAsZnVuY19wZ2lkICAsUFNTQ0FOX1BHSUQgICAgfSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19USU1FCisJeyBzaXplb2YoIkVMQVBTRUQiKS0xLCAiZXRpbWUiICwiRUxBUFNFRCIsZnVuY19ldGltZSAsUFNTQ0FOX1NUQVJUX1RJTUUgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUworCXsgNSAgICAgICAgICAgICAgICAgICwgIm5pY2UiICAsIk5JIiAgICAgLGZ1bmNfbmljZSAgLFBTU0NBTl9OSUNFICAgIH0sCisJeyA4ICAgICAgICAgICAgICAgICAgLCAicmdyb3VwIiwiUkdST1VQIiAsZnVuY19yZ3JvdXAsUFNTQ0FOX1JVSURHSUQgfSwKKwl7IDggICAgICAgICAgICAgICAgICAsICJydXNlciIgLCJSVVNFUiIgICxmdW5jX3J1c2VyICxQU1NDQU5fUlVJREdJRCB9LAorLy8JeyA1ICAgICAgICAgICAgICAgICAgLCAicGNwdSIgICwiJUNQVSIgICAsZnVuY19wY3B1ICAsUFNTQ0FOXyAgICAgICAgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1BTX1RJTUUKKwl7IDYgICAgICAgICAgICAgICAgICAsICJ0aW1lIiAgLCJUSU1FIiAgICxmdW5jX3RpbWUgICxQU1NDQU5fU1RJTUUgfCBQU1NDQU5fVVRJTUUgfSwKKyNlbmRpZgorCXsgNiAgICAgICAgICAgICAgICAgICwgInR0eSIgICAsIlRUIiAgICAgLGZ1bmNfdHR5ICAgLFBTU0NBTl9UVFkgICAgIH0sCisJeyA0ICAgICAgICAgICAgICAgICAgLCAidnN6IiAgICwiVlNaIiAgICAsZnVuY192c3ogICAsUFNTQ0FOX1ZTWiAgICAgfSwKKy8qIE5vdCBtYW5kYXRlZCwgYnV0IHVzZWZ1bDogKi8KKwl7IDQgICAgICAgICAgICAgICAgICAsICJzdGF0IiAgLCJTVEFUIiAgICxmdW5jX3N0YXRlICxQU1NDQU5fU1RBVEUgICB9LAorCXsgNCAgICAgICAgICAgICAgICAgICwgInJzcyIgICAsIlJTUyIgICAgLGZ1bmNfcnNzICAgLFBTU0NBTl9SU1MgICAgIH0sCisjaWYgRU5BQkxFX1NFTElOVVgKKwl7IDM1ICAgICAgICAgICAgICAgICAsICJsYWJlbCIgLCJMQUJFTCIgICxmdW5jX2xhYmVsICxQU1NDQU5fQ09OVEVYVCB9LAorI2VuZGlmCit9OworCitzdGF0aWMgcHNfb3V0X3QqIG5ld19vdXRfdCh2b2lkKQoreworCW91dCA9IHhyZWFsbG9jX3ZlY3RvcihvdXQsIDIsIG91dF9jbnQpOworCXJldHVybiAmb3V0W291dF9jbnQrK107Cit9CisKK3N0YXRpYyBjb25zdCBwc19vdXRfdCogZmluZF9vdXRfc3BlYyhjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGk7CisJY2hhciBidWZbQVJSQVlfU0laRShvdXRfc3BlYykqNyArIDFdOworCWNoYXIgKnAgPSBidWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvdXRfc3BlYyk7IGkrKykgeworCQlpZiAoc3RybmNtcChuYW1lLCBvdXRfc3BlY1tpXS5uYW1lNiwgNikgPT0gMCkKKwkJCXJldHVybiAmb3V0X3NwZWNbaV07CisJCXAgKz0gc3ByaW50ZihwLCAiJS42cywiLCBvdXRfc3BlY1tpXS5uYW1lNik7CisJfQorCXBbLTFdID0gJ1wwJzsKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIC1vIGFyZ3VtZW50ICclcycsIHN1cHBvcnRlZCBhcmd1bWVudHM6ICVzIiwgbmFtZSwgYnVmKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfbyhjaGFyKiBvcHQpCit7CisJcHNfb3V0X3QqIG5ldzsKKwkvLyBQT1NJWDogIi1vIGlzIGJsYW5rLSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCIgKEZJWE1FKQorCWNoYXIgKmNvbW1hLCAqZXF1YWw7CisJd2hpbGUgKDEpIHsKKwkJY29tbWEgPSBzdHJjaHIob3B0LCAnLCcpOworCQllcXVhbCA9IHN0cmNocihvcHQsICc9Jyk7CisJCWlmIChjb21tYSAmJiAoIWVxdWFsIHx8IGVxdWFsID4gY29tbWEpKSB7CisJCQkqY29tbWEgPSAnXDAnOworCQkJKm5ld19vdXRfdCgpID0gKmZpbmRfb3V0X3NwZWMob3B0KTsKKwkJCSpjb21tYSA9ICcsJzsKKwkJCW9wdCA9IGNvbW1hICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwkvLyBvcHQgcG9pbnRzIHRvIGxhc3Qgc3BlYyBpbiBjb21tYSBzZXBhcmF0ZWQgbGlzdC4KKwkvLyBUaGlzIG9uZSBjYW4gaGF2ZSA9SEVBREVSIHBhcnQuCisJbmV3ID0gbmV3X291dF90KCk7CisJaWYgKGVxdWFsKQorCQkqZXF1YWwgPSAnXDAnOworCSpuZXcgPSAqZmluZF9vdXRfc3BlYyhvcHQpOworCWlmIChlcXVhbCkgeworCQkqZXF1YWwgPSAnPSc7CisJCW5ldy0+aGVhZGVyID0gZXF1YWwgKyAxOworCQkvLyBQT1NJWDogdGhlIGZpZWxkIHdpZHRocyBzaGFsbCBiZSAuLi4gYXQgbGVhc3QgYXMgd2lkZSBhcworCQkvLyB0aGUgaGVhZGVyIHRleHQgKGRlZmF1bHQgb3Igb3ZlcnJpZGRlbiB2YWx1ZSkuCisJCS8vIElmIHRoZSBoZWFkZXIgdGV4dCBpcyBudWxsLCBzdWNoIGFzIC1vIHVzZXI9LAorCQkvLyB0aGUgZmllbGQgd2lkdGggc2hhbGwgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyB0aGUKKwkJLy8gZGVmYXVsdCBoZWFkZXIgdGV4dAorCQlpZiAobmV3LT5oZWFkZXJbMF0pIHsKKwkJCW5ldy0+d2lkdGggPSBzdHJsZW4obmV3LT5oZWFkZXIpOworCQkJcHJpbnRfaGVhZGVyID0gMTsKKwkJfQorCX0gZWxzZQorCQlwcmludF9oZWFkZXIgPSAxOworfQorCitzdGF0aWMgdm9pZCBhbGxvY19saW5lX2J1ZmZlcih2b2lkKQoreworCWludCBpOworCWludCB3aWR0aCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG91dF9jbnQ7IGkrKykgeworCQluZWVkX2ZsYWdzIHw9IG91dFtpXS5wc19mbGFnczsKKwkJaWYgKG91dFtpXS5oZWFkZXJbMF0pIHsKKwkJCXByaW50X2hlYWRlciA9IDE7CisJCX0KKwkJd2lkdGggKz0gb3V0W2ldLndpZHRoICsgMTsgLyogIkZJRUxEICIgKi8KKwkJaWYgKChpbnQpKHdpZHRoIC0gdGVybWluYWxfd2lkdGgpID4gMCkgeworCQkJLyogVGhlIHJlc3QgZG9lcyBub3QgZml0IG9uIHRoZSBzY3JlZW4gKi8KKwkJCS8vb3V0W2ldLndpZHRoIC09ICh3aWR0aCAtIHRlcm1pbmFsX3dpZHRoIC0gMSk7CisJCQlvdXRfY250ID0gaSArIDE7CisJCQlicmVhazsKKwkJfQorCX0KKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmICghaXNfc2VsaW51eF9lbmFibGVkKCkpCisJCW5lZWRfZmxhZ3MgJj0gflBTU0NBTl9DT05URVhUOworI2VuZGlmCisJYnVmZmVyID0geG1hbGxvYyh3aWR0aCArIDEpOyAvKiBmb3IgdHJhaWxpbmcgXDAgKi8KK30KKworc3RhdGljIHZvaWQgZm9ybWF0X2hlYWRlcih2b2lkKQoreworCWludCBpOworCXBzX291dF90KiBvcDsKKwljaGFyICpwOworCisJaWYgKCFwcmludF9oZWFkZXIpCisJCXJldHVybjsKKwlwID0gYnVmZmVyOworCWkgPSAwOworCWlmIChvdXRfY250KSB7CisJCXdoaWxlICgxKSB7CisJCQlvcCA9ICZvdXRbaV07CisJCQlpZiAoKytpID09IG91dF9jbnQpIC8qIGRvIG5vdCBwYWQgbGFzdCBmaWVsZCAqLworCQkJCWJyZWFrOworCQkJcCArPSBzcHJpbnRmKHAsICIlLSpzICIsIG9wLT53aWR0aCwgb3AtPmhlYWRlcik7CisJCX0KKwkJc3RyY3B5KHAsIG9wLT5oZWFkZXIpOworCX0KKwlwcmludGYoIiUuKnNcbiIsIHRlcm1pbmFsX3dpZHRoLCBidWZmZXIpOworfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfcHJvY2Vzcyhjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCWludCBpLCBsZW47CisJY2hhciAqcCA9IGJ1ZmZlcjsKKwlpID0gMDsKKwlpZiAob3V0X2NudCkgd2hpbGUgKDEpIHsKKwkJb3V0W2ldLmYocCwgb3V0W2ldLndpZHRoLCBwcyk7CisJCS8vIFBPU0lYOiBBbnkgZmllbGQgbmVlZCBub3QgYmUgbWVhbmluZ2Z1bCBpbiBhbGwKKwkJLy8gaW1wbGVtZW50YXRpb25zLiBJbiBzdWNoIGEgY2FzZSBhIGh5cGhlbiAoICctJyApCisJCS8vIHNob3VsZCBiZSBvdXRwdXQgaW4gcGxhY2Ugb2YgdGhlIGZpZWxkIHZhbHVlLgorCQlpZiAoIXBbMF0pIHsKKwkJCXBbMF0gPSAnLSc7CisJCQlwWzFdID0gJ1wwJzsKKwkJfQorCQlsZW4gPSBzdHJsZW4ocCk7CisJCXAgKz0gbGVuOworCQlsZW4gPSBvdXRbaV0ud2lkdGggLSBsZW4gKyAxOworCQlpZiAoKytpID09IG91dF9jbnQpIC8qIGRvIG5vdCBwYWQgbGFzdCBmaWVsZCAqLworCQkJYnJlYWs7CisJCXAgKz0gc3ByaW50ZihwLCAiJSpzIiwgbGVuLCAiIik7CisJfQorCXByaW50ZigiJS4qc1xuIiwgdGVybWluYWxfd2lkdGgsIGJ1ZmZlcik7Cit9CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorIyBkZWZpbmUgU0VMSU5VWF9PX1BSRUZJWCAibGFiZWwsIgorIyBkZWZpbmUgREVGQVVMVF9PX1NUUiAgICAoU0VMSU5VWF9PX1BSRUZJWCAicGlkLHVzZXIiIElGX0ZFQVRVUkVfUFNfVElNRSgiLHRpbWUiKSAiLGFyZ3MiKQorI2Vsc2UKKyMgZGVmaW5lIERFRkFVTFRfT19TVFIgICAgKCJwaWQsdXNlciIgSUZfRkVBVFVSRV9QU19USU1FKCIsdGltZSIpICIsYXJncyIpCisjZW5kaWYKKworaW50IHBzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcHJvY3BzX3N0YXR1c190ICpwOworCWxsaXN0X3QqIG9wdF9vID0gTlVMTDsKKwljaGFyIGRlZmF1bHRfb1tzaXplb2YoREVGQVVMVF9PX1NUUildOworCWludCBvcHQ7CisJZW51bSB7CisJCU9QVF9aID0gKDEgPDwgMCksCisJCU9QVF9vID0gKDEgPDwgMSksCisJCU9QVF9hID0gKDEgPDwgMiksCisJCU9QVF9BID0gKDEgPDwgMyksCisJCU9QVF9kID0gKDEgPDwgNCksCisJCU9QVF9lID0gKDEgPDwgNSksCisJCU9QVF9mID0gKDEgPDwgNiksCisJCU9QVF9sID0gKDEgPDwgNyksCisJCU9QVF9UID0gKDEgPDwgOCkgKiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMsCisJfTsKKworCUlOSVRfRygpOworCisJLy8gUE9TSVg6CisJLy8gLWEgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzIGFzc29jaWF0ZWQgd2l0aCB0ZXJtaW5hbHMKKwkvLyAgICAgSW1wbGVtZW50YXRpb25zIG1heSBvbWl0IHNlc3Npb24gbGVhZGVycyBmcm9tIHRoaXMgbGlzdAorCS8vIC1BICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgYWxsIHByb2Nlc3NlcworCS8vIC1kICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgYWxsIHByb2Nlc3NlcywgZXhjZXB0IHNlc3Npb24gbGVhZGVycworCS8vIC1lICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgYWxsIHByb2Nlc3NlcyAoZXF1aXZhbGVudCB0byAtQSkKKwkvLyAtZiAgR2VuZXJhdGUgYSBmdWxsIGxpc3RpbmcKKwkvLyAtbCAgR2VuZXJhdGUgYSBsb25nIGxpc3RpbmcKKwkvLyAtbyBjb2wxLGNvbDIsY29sMz1oZWFkZXIKKwkvLyAgICAgU2VsZWN0IHdoaWNoIGNvbHVtbnMgdG8gZGlzcGxheQorCS8qIFdlIGFsbG93IChhbmQgaWdub3JlKSBtb3N0IG9mIHRoZSBhYm92ZS4gRklYTUUuCisJICogLVQgaXMgcGlja2VkIGZvciB0aHJlYWRzIChQT1NJWCBoYXNuJ3QgaXQgc3RhbmRhcmRpemVkKS4KKwkgKiBwcm9jcHMgdjMuMi43IHN1cHBvcnRzIC1UIGFuZCBzaG93cyB0aWRzIGFzIFNQSUQgY29sdW1uLAorCSAqIGl0IGFsc28gc3VwcG9ydHMgLUwgd2hlcmUgaXQgc2hvd3MgdGlkcyBhcyBMV1AgY29sdW1uLgorCSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm86OiI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIlpvOmFBZGVmbCJJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUygiVCIpLCAmb3B0X28pOworCWlmIChvcHRfbykgeworCQlkbyB7CisJCQlwYXJzZV9vKGxsaXN0X3BvcCgmb3B0X28pKTsKKwkJfSB3aGlsZSAob3B0X28pOworCX0gZWxzZSB7CisJCS8qIEJlbG93OiBwYXJzZV9vKCkgbmVlZHMgY2hhciosIE5PVCBjb25zdCBjaGFyKiwgY2FuJ3QgZ2l2ZSBpdCBkZWZhdWx0X28gKi8KKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAoIShvcHQgJiBPUFRfWikgfHwgIWlzX3NlbGludXhfZW5hYmxlZCgpKSB7CisJCQkvKiBubyAtWiBvciBubyBTRUxpbnV4OiBkbyBub3Qgc2hvdyBMQUJFTCAqLworCQkJc3RyY3B5KGRlZmF1bHRfbywgREVGQVVMVF9PX1NUUiArIHNpemVvZihTRUxJTlVYX09fUFJFRklYKS0xKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJc3RyY3B5KGRlZmF1bHRfbywgREVGQVVMVF9PX1NUUik7CisJCX0KKwkJcGFyc2VfbyhkZWZhdWx0X28pOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMKKwlpZiAob3B0ICYgT1BUX1QpCisJCW5lZWRfZmxhZ3MgfD0gUFNTQ0FOX1RBU0tTOworI2VuZGlmCisKKwkvKiBXYXMgSU5UX01BWCwgYnV0IHNvbWUgbGliYydzIGdvIGJlbGx5IHVwIHdpdGggcHJpbnRmKCIlLipzIikKKwkgKiBhbmQgc3VjaCBsYXJnZSB3aWR0aHMgKi8KKwl0ZXJtaW5hbF93aWR0aCA9IE1BWF9XSURUSDsKKwlpZiAoaXNhdHR5KDEpKSB7CisJCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoMCwgJnRlcm1pbmFsX3dpZHRoLCBOVUxMKTsKKwkJaWYgKC0tdGVybWluYWxfd2lkdGggPiBNQVhfV0lEVEgpCisJCQl0ZXJtaW5hbF93aWR0aCA9IE1BWF9XSURUSDsKKwl9CisJYWxsb2NfbGluZV9idWZmZXIoKTsKKwlmb3JtYXRfaGVhZGVyKCk7CisKKwlwID0gTlVMTDsKKwl3aGlsZSAoKHAgPSBwcm9jcHNfc2NhbihwLCBuZWVkX2ZsYWdzKSkgIT0gTlVMTCkgeworCQlmb3JtYXRfcHJvY2VzcyhwKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisKKyNlbHNlIC8qICFFTkFCTEVfREVTS1RPUCAqLworCisKK2ludCBwc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcHNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlwcm9jcHNfc3RhdHVzX3QgKnA7CisJaW50IHBzc2Nhbl9mbGFncyA9IFBTU0NBTl9QSUQgfCBQU1NDQU5fVUlER0lECisJCQl8IFBTU0NBTl9TVEFURSB8IFBTU0NBTl9WU1ogfCBQU1NDQU5fQ09NTTsKKwl1bnNpZ25lZCB0ZXJtaW5hbF93aWR0aCBJRl9OT1RfRkVBVFVSRV9QU19XSURFKD0gNzkpOworCWVudW0geworCQlPUFRfWiA9ICgxIDw8IDApICogRU5BQkxFX1NFTElOVVgsCisJCU9QVF9UID0gKDEgPDwgRU5BQkxFX1NFTElOVVgpICogRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTLAorCX07CisJaW50IG9wdHMgPSAwOworCS8qIElmIHdlIHN1cHBvcnQgYW55IG9wdGlvbnMsIHBhcnNlIGFyZ3YgKi8KKyNpZiBFTkFCTEVfU0VMSU5VWCB8fCBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMgfHwgRU5BQkxFX0ZFQVRVUkVfUFNfV0lERQorIyBpZiBFTkFCTEVfRkVBVFVSRV9QU19XSURFCisJLyogLXcgaXMgYSBiaXQgY29tcGxpY2F0ZWQgKi8KKwlpbnQgd19jb3VudCA9IDA7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTp3dyI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIElGX1NFTElOVVgoIloiKUlGX0ZFQVRVUkVfU0hPV19USFJFQURTKCJUIikidyIsICZ3X2NvdW50KTsKKwkvKiBpZiB3IGlzIGdpdmVuIG9uY2UsIEdOVSBwcyBzZXRzIHRoZSB3aWR0aCB0byAxMzIsCisJICogaWYgdyBpcyBnaXZlbiBtb3JlIHRoYW4gb25jZSwgaXQgaXMgInVubGltaXRlZCIKKwkgKi8KKwlpZiAod19jb3VudCkgeworCQl0ZXJtaW5hbF93aWR0aCA9ICh3X2NvdW50ID09IDEpID8gMTMyIDogTUFYX1dJRFRIOworCX0gZWxzZSB7CisJCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoMCwgJnRlcm1pbmFsX3dpZHRoLCBOVUxMKTsKKwkJLyogR28gb25lIGxlc3MuLi4gKi8KKwkJaWYgKC0tdGVybWluYWxfd2lkdGggPiBNQVhfV0lEVEgpCisJCQl0ZXJtaW5hbF93aWR0aCA9IE1BWF9XSURUSDsKKwl9CisjIGVsc2UKKwkvKiAtdyBpcyBub3Qgc3VwcG9ydGVkLCBvbmx5IC1aIGFuZC9vciAtVCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0iOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCBJRl9TRUxJTlVYKCJaIilJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUygiVCIpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAoKG9wdHMgJiBPUFRfWikgJiYgaXNfc2VsaW51eF9lbmFibGVkKCkpIHsKKwkJcHNzY2FuX2ZsYWdzID0gUFNTQ0FOX1BJRCB8IFBTU0NBTl9DT05URVhUCisJCQkJfCBQU1NDQU5fU1RBVEUgfCBQU1NDQU5fQ09NTTsKKwkJcHV0cygiICBQSUQgQ09OVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVCBDT01NQU5EIik7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXB1dHMoIiAgUElEIFVTRVIgICAgICAgVlNaIFNUQVQgQ09NTUFORCIpOworCX0KKwlpZiAob3B0cyAmIE9QVF9UKSB7CisJCXBzc2Nhbl9mbGFncyB8PSBQU1NDQU5fVEFTS1M7CisJfQorCisJcCA9IE5VTEw7CisJd2hpbGUgKChwID0gcHJvY3BzX3NjYW4ocCwgcHNzY2FuX2ZsYWdzKSkgIT0gTlVMTCkgeworCQlpbnQgbGVuOworI2lmIEVOQUJMRV9TRUxJTlVYCisJCWlmIChwc3NjYW5fZmxhZ3MgJiBQU1NDQU5fQ09OVEVYVCkgeworCQkJbGVuID0gcHJpbnRmKCIlNXUgJS0zMi4zMnMgJXMgICIsCisJCQkJCXAtPnBpZCwKKwkJCQkJcC0+Y29udGV4dCA/IHAtPmNvbnRleHQgOiAidW5rbm93biIsCisJCQkJCXAtPnN0YXRlKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJY29uc3QgY2hhciAqdXNlciA9IGdldF9jYWNoZWRfdXNlcm5hbWUocC0+dWlkKTsKKwkJCS8vaWYgKHAtPnZzeiA9PSAwKQorCQkJLy8JbGVuID0gcHJpbnRmKCIlNXUgJS04LjhzICAgICAgICAlcyAiLAorCQkJLy8JCXAtPnBpZCwgdXNlciwgcC0+c3RhdGUpOworCQkJLy9lbHNlCisJCQl7CisJCQkJY2hhciBidWY2WzZdOworCQkJCXNtYXJ0X3VsbHRvYTUocC0+dnN6LCBidWY2LCAiIG1ndHBlenkiKTsKKwkJCQlidWY2WzVdID0gJ1wwJzsKKwkJCQlsZW4gPSBwcmludGYoIiU1dSAlLTguOHMgJXMgJXMgICIsCisJCQkJCXAtPnBpZCwgdXNlciwgYnVmNiwgcC0+c3RhdGUpOworCQkJfQorCQl9CisKKwkJeworCQkJaW50IHN6ID0gdGVybWluYWxfd2lkdGggLSBsZW47CisJCQljaGFyIGJ1ZltzeiArIDFdOworCQkJcmVhZF9jbWRsaW5lKGJ1Ziwgc3osIHAtPnBpZCwgcC0+Y29tbSk7CisJCQlwdXRzKGJ1Zik7CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbGVhcl91c2VybmFtZV9jYWNoZSgpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKiAhRU5BQkxFX0RFU0tUT1AgKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wcy5wb3NpeCBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wcy5wb3NpeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Y0ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3BzLnBvc2l4CkBAIC0wLDAgKzEsMTc1IEBACitUaGlzIGlzIHdoYXQgUE9TSVggMjAwMyBzYXlzIGFib3V0IHBzOgorCitCeSBkZWZhdWx0LCBwcyBzaGFsbCBzZWxlY3QgIGFsbCBwcm9jZXNzZXMgd2l0aCB0aGUgc2FtZSBlZmZlY3RpdmUgdXNlcgorSUQgYXMgdGhlIGN1cnJlbnQgdXNlciBhbmQgdGhlIHNhbWUgY29udHJvbGxpbmcgdGVybWluYWwgYXMgdGhlIGludm9rZXIKKworcHMgWy1hQV1bLWRlZmxdWy1HIGdyb3VwbGlzdF1bLW8gZm9ybWF0XS4uLlstcCBwcm9jbGlzdF1bLXQgdGVybWxpc3RdCitbLVUgdXNlcmxpc3RdWy1nIGdyb3VwbGlzdF1bLW4gbmFtZWxpc3RdWy11IHVzZXJsaXN0XQorCistYSAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBwcm9jZXNzZXMgYXNzb2NpYXRlZCAgd2l0aCAgdGVybWluYWxzLgorICAgICAgIEltcGxlbWVudGF0aW9ucyBtYXkgb21pdCBzZXNzaW9uIGxlYWRlcnMgZnJvbSB0aGlzIGxpc3QuCisKKy1BICAgICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgYWxsIHByb2Nlc3Nlcy4KKworLWQgICAgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzLCBleGNlcHQgc2Vzc2lvbiBsZWFkZXJzLgorCistZSAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBwcm9jZXNzZXMuICAoRXF1aXZhbGVudCB0byAtQS4pCisKKy1mICAgICBHZW5lcmF0ZSAgYSAgZnVsbCAgbGlzdGluZy4gKFNlZSB0aGUgU1RET1VUIHNlY3Rpb24gZm9yIHRoZSBjb24tCisgICAgICAgdGVudHMgb2YgYSBmdWxsIGxpc3RpbmcuKQorCistZyAgZ3JvdXBsaXN0CisgICAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIHByb2Nlc3NlcyB3aG9zZSBzZXNzaW9uIGxlYWRlcnMgYXJlICBnaXZlbgorICAgICAgIGluIGdyb3VwbGlzdC4gVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGVuc3VyZSB0aGF0IHRoZSBncm91cGxpc3QgaXMKKyAgICAgICBhIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSBvZiBhICA8Ymxhbms+ICBvciAgY29tbWEtc2VwYXJhdGVkCisgICAgICAgbGlzdC4KKworLUcgIGdyb3VwbGlzdAorICAgICAgIFdyaXRlICBpbmZvcm1hdGlvbiBmb3IgcHJvY2Vzc2VzIHdob3NlIHJlYWwgZ3JvdXAgSUQgbnVtYmVycyBhcmUKKyAgICAgICBnaXZlbiBpbiBncm91cGxpc3QuIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBlbnN1cmUgdGhhdCB0aGUgIGdyb3UtCisgICAgICAgcGxpc3QgIGlzICBhICBzaW5nbGUgYXJndW1lbnQgaW4gdGhlIGZvcm0gb2YgYSA8Ymxhbms+IG9yIGNvbW1hLQorICAgICAgIHNlcGFyYXRlZCBsaXN0LgorCistbCAgICAgR2VuZXJhdGUgYSBsb25nIGxpc3RpbmcuIChTZWUgU1RET1VUIGZvciB0aGUgY29udGVudHMgb2YgYSAgbG9uZworICAgICAgIGxpc3RpbmcuKQorCistbiAgbmFtZWxpc3QKKyAgICAgICBTcGVjaWZ5IHRoZSBuYW1lIG9mIGFuIGFsdGVybmF0aXZlIHN5c3RlbSBuYW1lbGlzdCBmaWxlIGluIHBsYWNlCisgICAgICAgb2YgdGhlIGRlZmF1bHQuIFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGZpbGUgYW5kIHRoZSBmb3JtYXQgb2YgYQorICAgICAgIG5hbWVsaXN0IGZpbGUgYXJlIHVuc3BlY2lmaWVkLgorCistbyAgZm9ybWF0CisgICAgICAgV3JpdGUgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBnaXZlbiBpbgorICAgICAgIGZvcm1hdC4gIE11bHRpcGxlIC1vIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZDsgdGhlIGZvcm1hdCBzcGVjaS0KKyAgICAgICBmaWNhdGlvbiBzaGFsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgIDxzcGFjZT4tc2VwYXJhdGVkIGNvbmNhdGUtCisgICAgICAgbmF0aW9uIG9mIGFsbCB0aGUgZm9ybWF0IG9wdGlvbi1hcmd1bWVudHMuCisKKy1wICBwcm9jbGlzdAorICAgICAgIFdyaXRlICBpbmZvcm1hdGlvbiAgZm9yICBwcm9jZXNzZXMgIHdob3NlIHByb2Nlc3MgSUQgbnVtYmVycyBhcmUKKyAgICAgICBnaXZlbiBpbiBwcm9jbGlzdC4gVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGVuc3VyZSAgdGhhdCAgdGhlICBwcm8tCisgICAgICAgY2xpc3QgIGlzICBhICBzaW5nbGUgYXJndW1lbnQgaW4gdGhlIGZvcm0gb2YgYSA8Ymxhbms+IG9yIGNvbW1hLQorICAgICAgIHNlcGFyYXRlZCBsaXN0LgorCistdCAgdGVybWxpc3QKKyAgICAgICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgcHJvY2Vzc2VzIGFzc29jaWF0ZWQgd2l0aCB0ZXJtaW5hbHMgIGdpdmVuCisgICAgICAgaW4gdGVybWxpc3QuIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBlbnN1cmUgdGhhdCB0aGUgdGVybWxpc3QgaXMgYQorICAgICAgIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSAgb2YgIGEgIDxibGFuaz4gIG9yICBjb21tYS1zZXBhcmF0ZWQKKyAgICAgICBsaXN0LiAgVGVybWluYWwgaWRlbnRpZmllcnMgc2hhbGwgYmUgZ2l2ZW4gaW4gYW4gaW1wbGVtZW50YXRpb24tCisgICAgICAgZGVmaW5lZCBmb3JtYXQuICAgIE9uICBYU0ktY29uZm9ybWFudCAgc3lzdGVtcywgIHRoZXkgIHNoYWxsICBiZQorICAgICAgIGdpdmVuICBpbiAgb25lIG9mIHR3byBmb3JtczogdGhlIGRldmljZSdzIGZpbGVuYW1lIChmb3IgZXhhbXBsZSwKKyAgICAgICB0dHkwNCkgb3IsIGlmIHRoZSBkZXZpY2UncyBmaWxlbmFtZSBzdGFydHMgd2l0aCAgdHR5LCAganVzdCAgdGhlCisgICAgICAgaWRlbnRpZmllciBmb2xsb3dpbmcgdGhlIGNoYXJhY3RlcnMgdHR5IChmb3IgZXhhbXBsZSwgIjA0IiApLgorCistdSAgdXNlcmxpc3QKKyAgICAgICBXcml0ZSAgaW5mb3JtYXRpb24gIGZvciBwcm9jZXNzZXMgd2hvc2UgdXNlciBJRCBudW1iZXJzIG9yIGxvZ2luCisgICAgICAgbmFtZXMgYXJlIGdpdmVuIGluIHVzZXJsaXN0LiBUaGUgYXBwbGljYXRpb24gc2hhbGwgIGVuc3VyZSAgdGhhdAorICAgICAgIHRoZSAgdXNlcmxpc3QgIGlzICBhIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSBvZiBhIDxibGFuaz4gb3IKKyAgICAgICBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gSW4gdGhlICBsaXN0aW5nLCAgdGhlICBudW1lcmljYWwgIHVzZXIgIElECisgICAgICAgc2hhbGwgYmUgd3JpdHRlbiB1bmxlc3MgdGhlIC1mIG9wdGlvbiBpcyB1c2VkLCBpbiB3aGljaCBjYXNlIHRoZQorICAgICAgIGxvZ2luIG5hbWUgc2hhbGwgYmUgd3JpdHRlbi4KKworLVUgIHVzZXJsaXN0CisgICAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIHByb2Nlc3NlcyB3aG9zZSByZWFsIHVzZXIgIElEICBudW1iZXJzICBvcgorICAgICAgIGxvZ2luICBuYW1lcyBhcmUgZ2l2ZW4gaW4gdXNlcmxpc3QuIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBlbnN1cmUKKyAgICAgICB0aGF0IHRoZSB1c2VybGlzdCBpcyBhIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSBvZiBhICA8Ymxhbms+CisgICAgICAgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3QuCisKK1dpdGggIHRoZSAgZXhjZXB0aW9uIG9mIC1vIGZvcm1hdCwgYWxsIG9mIHRoZSBvcHRpb25zIHNob3duIGFyZSB1c2VkIHRvCitzZWxlY3QgcHJvY2Vzc2VzLiBJZiBhbnkgYXJlICBzcGVjaWZpZWQsICB0aGUgIGRlZmF1bHQgIGxpc3QgIHNoYWxsICBiZQoraWdub3JlZCAgYW5kIHBzIHNoYWxsIHNlbGVjdCB0aGUgcHJvY2Vzc2VzIHJlcHJlc2VudGVkIGJ5IHRoZSBpbmNsdXNpdmUKK09SIG9mIGFsbCB0aGUgc2VsZWN0aW9uLWNyaXRlcmlhIG9wdGlvbnMuCisKK1RoZSAgLW8gb3B0aW9uIGFsbG93cyB0aGUgb3V0cHV0IGZvcm1hdCB0byBiZSBzcGVjaWZpZWQgdW5kZXIgdXNlciBjb24tCit0cm9sLgorCitUaGUgYXBwbGljYXRpb24gc2hhbGwgZW5zdXJlIHRoYXQgdGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIGEgbGlzdCBvZgorbmFtZXMgIHByZXNlbnRlZCBhcyBhIHNpbmdsZSBhcmd1bWVudCwgPGJsYW5rPiBvciBjb21tYS1zZXBhcmF0ZWQuIEVhY2gKK3ZhcmlhYmxlIGhhcyBhIGRlZmF1bHQgaGVhZGVyLiBUaGUgZGVmYXVsdCBoZWFkZXIgY2FuIGJlIG92ZXJyaWRkZW4gIGJ5CithcHBlbmRpbmcgIGFuICBlcXVhbHMgIHNpZ24gYW5kIHRoZSBuZXcgdGV4dCBvZiB0aGUgaGVhZGVyLiBUaGUgcmVzdCBvZgordGhlIGNoYXJhY3RlcnMgaW4gdGhlIGFyZ3VtZW50IHNoYWxsIGJlIHVzZWQgYXMgdGhlICBoZWFkZXIgIHRleHQuICBUaGUKK2ZpZWxkcyBzcGVjaWZpZWQgc2hhbGwgYmUgd3JpdHRlbiBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kCitsaW5lLCBhbmQgc2hvdWxkIGJlIGFycmFuZ2VkIGluIGNvbHVtbnMgaW4gdGhlIG91dHB1dC4gVGhlIGZpZWxkIHdpZHRocworc2hhbGwgIGJlICBzZWxlY3RlZCAgYnkgdGhlIHN5c3RlbSB0byBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIHRoZSBoZWFkZXIKK3RleHQgKGRlZmF1bHQgb3Igb3ZlcnJpZGRlbiB2YWx1ZSkuIElmIHRoZSBoZWFkZXIgdGV4dCBpcyBudWxsLCBzdWNoIGFzCistbyAgdXNlcj0sICB0aGUgIGZpZWxkICB3aWR0aCAgc2hhbGwgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyB0aGUgZGVmYXVsdAoraGVhZGVyIHRleHQuIElmIGFsbCBoZWFkZXIgdGV4dCBmaWVsZHMgYXJlIG51bGwsIG5vIGhlYWRlciAgbGluZSAgc2hhbGwKK2JlIHdyaXR0ZW4uCisKK3J1c2VyICBUaGUgIHJlYWwgdXNlciBJRCBvZiB0aGUgcHJvY2Vzcy4gVGhpcyBzaGFsbCBiZSB0aGUgdGV4dHVhbCB1c2VyCisgICAgICAgSUQsIGlmIGl0IGNhbiBiZSBvYnRhaW5lZCBhbmQgdGhlIGZpZWxkIHdpZHRoIHBlcm1pdHMsIG9yIGEgZGVjLQorICAgICAgIGltYWwgcmVwcmVzZW50YXRpb24gb3RoZXJ3aXNlLgorCit1c2VyICAgVGhlICBlZmZlY3RpdmUgdXNlciBJRCBvZiB0aGUgcHJvY2Vzcy4gVGhpcyBzaGFsbCBiZSB0aGUgdGV4dHVhbAorICAgICAgIHVzZXIgSUQsIGlmIGl0IGNhbiBiZSBvYnRhaW5lZCBhbmQgdGhlIGZpZWxkIHdpZHRoIHBlcm1pdHMsIG9yIGEKKyAgICAgICBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG90aGVyd2lzZS4KKworcmdyb3VwIFRoZSAgcmVhbCAgZ3JvdXAgIElEICBvZiAgdGhlIHByb2Nlc3MuIFRoaXMgc2hhbGwgYmUgdGhlIHRleHR1YWwKKyAgICAgICBncm91cCBJRCwgaWYgaXQgY2FuIGJlIG9idGFpbmVkIGFuZCB0aGUgZmllbGQgd2lkdGggcGVybWl0cywgIG9yCisgICAgICAgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG90aGVyd2lzZS4KKworZ3JvdXAgIFRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgb2YgdGhlIHByb2Nlc3MuIFRoaXMgc2hhbGwgYmUgdGhlIHRleHR1YWwKKyAgICAgICBncm91cCBJRCwgaWYgaXQgY2FuIGJlIG9idGFpbmVkIGFuZCB0aGUgZmllbGQgd2lkdGggcGVybWl0cywgIG9yCisgICAgICAgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG90aGVyd2lzZS4KKworcGlkICAgIFRoZSBkZWNpbWFsIHZhbHVlIG9mIHRoZSBwcm9jZXNzIElELgorCitwcGlkICAgVGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHBhcmVudCBwcm9jZXNzIElELgorCitwZ2lkICAgVGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHByb2Nlc3MgZ3JvdXAgSUQuCisKK3BjcHUgICBUaGUgcmF0aW8gb2YgQ1BVIHRpbWUgdXNlZCByZWNlbnRseSB0byBDUFUgdGltZSBhdmFpbGFibGUgaW4gdGhlCisgICAgICAgc2FtZSAgcGVyaW9kLCAgZXhwcmVzc2VkICBhcyAgYSAgcGVyY2VudGFnZS4gIFRoZSAgIG1lYW5pbmcgICBvZgorICAgICAgICJyZWNlbnRseSIgIGluICB0aGlzIGNvbnRleHQgaXMgdW5zcGVjaWZpZWQuIFRoZSBDUFUgdGltZSBhdmFpbC0KKyAgICAgICBhYmxlIGlzIGRldGVybWluZWQgaW4gYW4gdW5zcGVjaWZpZWQgbWFubmVyLgorCit2c3ogICAgVGhlIHNpemUgb2YgdGhlIHByb2Nlc3MgaW4gKHZpcnR1YWwpIG1lbW9yeSBpbiAxMDI0ICBieXRlICB1bml0cworICAgICAgIGFzIGEgZGVjaW1hbCBpbnRlZ2VyLgorCituaWNlICAgVGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIG5pY2UgdmFsdWUgb2YgdGhlIHByb2Nlc3M7IHNlZSBuaWNlKCkgLgorCitldGltZSAgSW4gdGhlIFBPU0lYIGxvY2FsZSwgdGhlIGVsYXBzZWQgIHRpbWUgIHNpbmNlICB0aGUgIHByb2Nlc3MgIHdhcworICAgICAgIHN0YXJ0ZWQsIGluIHRoZSBmb3JtOiBbW2RkLV1oaDpdbW06c3MKKwordGltZSAgIEluIHRoZSBQT1NJWCBsb2NhbGUsIHRoZSBjdW11bGF0aXZlIENQVSB0aW1lIG9mIHRoZSAgcHJvY2VzcyAgaW4KKyAgICAgICB0aGUgZm9ybTogW2RkLV1oaDptbTpzcworCit0dHkgICAgVGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIG9mIHRoZSBwcm9jZXNzIChpZiBhbnkpICBpbgorICAgICAgIHRoZSBzYW1lIGZvcm1hdCB1c2VkIGJ5IHRoZSB3aG8gdXRpbGl0eS4KKworY29tbSAgIFRoZSAgbmFtZSAgb2YgIHRoZSAgY29tbWFuZCBiZWluZyBleGVjdXRlZCAoIGFyZ3ZbMF0gdmFsdWUpIGFzIGEKKyAgICAgICBzdHJpbmcuCisKK2FyZ3MgICBUaGUgY29tbWFuZCB3aXRoIGFsbCBpdHMgYXJndW1lbnRzIGFzIGEgc3RyaW5nLiBUaGUgIGltcGxlbWVudGEtCisgICAgICAgdGlvbiBtYXkgdHJ1bmNhdGUgdGhpcyB2YWx1ZSB0byB0aGUgZmllbGQgd2lkdGg7IGl0IGlzIGltcGxlbWVuLQorICAgICAgIHRhdGlvbi1kZWZpbmVkIHdoZXRoZXIgYW55ICBmdXJ0aGVyICB0cnVuY2F0aW9uICBvY2N1cnMuICBJdCAgaXMKKyAgICAgICB1bnNwZWNpZmllZCAgd2hldGhlciAgdGhlIHN0cmluZyByZXByZXNlbnRlZCBpcyBhIHZlcnNpb24gb2YgdGhlCisgICAgICAgYXJndW1lbnQgbGlzdCBhcyBpdCB3YXMgcGFzc2VkIHRvIHRoZSBjb21tYW5kIHdoZW4gIGl0ICBzdGFydGVkLAorICAgICAgIG9yICBpcyBhIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50cyBhcyB0aGV5IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQKKyAgICAgICBieSB0aGUgYXBwbGljYXRpb24uIEFwcGxpY2F0aW9ucyBjYW5ub3QgZGVwZW5kIG9uIGJlaW5nIGFibGUgIHRvCisgICAgICAgbW9kaWZ5ICB0aGVpciAgYXJndW1lbnQgIGxpc3QgIGFuZCAgaGF2aW5nICB0aGF0IG1vZGlmaWNhdGlvbiBiZQorICAgICAgIHJlZmxlY3RlZCBpbiB0aGUgb3V0cHV0IG9mIHBzLgorCitBbnkgZmllbGQgbmVlZCBub3QgYmUgbWVhbmluZ2Z1bCBpbiBhbGwgaW1wbGVtZW50YXRpb25zLiBJbiBzdWNoIGEgY2FzZQorYSBoeXBoZW4gKCAnLScgKSBzaG91bGQgYmUgb3V0cHV0IGluIHBsYWNlIG9mIHRoZSBmaWVsZCB2YWx1ZS4KKworT25seSAgY29tbSAgYW5kICBhcmdzICBzaGFsbCBiZSBhbGxvd2VkIHRvIGNvbnRhaW4gPGJsYW5rPnM7IGFsbCBvdGhlcnMKK3NoYWxsIG5vdC4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgaGVhZGVyICB0byAgYmUgIHVzZWQgIGluICB0aGUKK1BPU0lYIGxvY2FsZSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZm9ybWF0IHNwZWNpZmllci4KKworICAgIEZvcm1hdCBTcGVjaWZpZXIgRGVmYXVsdCBIZWFkZXIgRm9ybWF0IFNwZWNpZmllciBEZWZhdWx0IEhlYWRlcgorICAgIGFyZ3MgICAgICAgICAgICAgQ09NTUFORCAgICAgICAgcHBpZCAgICAgICAgICAgICBQUElECisgICAgY29tbSAgICAgICAgICAgICBDT01NQU5EICAgICAgICByZ3JvdXAgICAgICAgICAgIFJHUk9VUAorICAgIGV0aW1lICAgICAgICAgICAgRUxBUFNFRCAgICAgICAgcnVzZXIgICAgICAgICAgICBSVVNFUgorICAgIGdyb3VwICAgICAgICAgICAgR1JPVVAgICAgICAgICAgdGltZSAgICAgICAgICAgICBUSU1FCisgICAgbmljZSAgICAgICAgICAgICBOSSAgICAgICAgICAgICB0dHkgICAgICAgICAgICAgIFRUCisgICAgcGNwdSAgICAgICAgICAgICAlQ1BVICAgICAgICAgICB1c2VyICAgICAgICAgICAgIFVTRVIKKyAgICBwZ2lkICAgICAgICAgICAgIFBHSUQgICAgICAgICAgIHZzeiAgICAgICAgICAgICAgVlNaCisgICAgcGlkICAgICAgICAgICAgICBQSUQKKworVGhlcmUgIGlzIG5vIHNwZWNpYWwgcXVvdGluZyBtZWNoYW5pc20gZm9yIGhlYWRlciB0ZXh0LiBUaGUgaGVhZGVyIHRleHQKK2lzIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudC4gSWYgbXVsdGlwbGUgIGhlYWRlciAgY2hhbmdlcyAgYXJlICBuZWVkZWQsCittdWx0aXBsZSAtbyBvcHRpb25zIGNhbiBiZSB1c2VkLCBzdWNoIGFzOgorCisgICAgICAgIHBzIC1vICJ1c2VyPVVzZXIgTmFtZSIgLW8gcGlkPVByb2Nlc3NcIElECmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9wcm9jcHMvcHN0cmVlLmMgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvcHN0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhMzA3OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wc3RyZWUuYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIHBzdHJlZS5jIC0gZGlzcGxheSBwcm9jZXNzIHRyZWUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMtMjAwMiBXZXJuZXIgQWxtZXNiZXJnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA5IENyYWlnIFNtYWxsCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTGF1cmkgS2FzYW5lbgorICoKKyAqIEJhc2VkIG9uIHBzdHJlZSAoUFNtaXNjKSAyMi4xMy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBQU1RSRUUKKy8vY29uZmlnOglib29sICJwc3RyZWUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRGlzcGxheSBhIHRyZWUgb2YgcHJvY2Vzc2VzLgorCisvL2FwcGxldDpJRl9QU1RSRUUoQVBQTEVUKHBzdHJlZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19QU1RSRUUpICs9IHBzdHJlZS5vCisKKy8vdXNhZ2U6I2RlZmluZSBwc3RyZWVfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstcF0gW1BJRHxVU0VSXSIKKy8vdXNhZ2U6I2RlZmluZSBwc3RyZWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHByb2Nlc3MgdHJlZSwgb3B0aW9uYWxseSBzdGFydCBmcm9tIFVTRVIgb3IgUElEXG4iCisvL3VzYWdlOiAgICAgIlxuCS1wCVNob3cgcGlkcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgUFJPQ19CQVNFICIvcHJvYyIKKworI2RlZmluZSBPUFRfUElEICAoMSA8PCAwKQorCitzdHJ1Y3QgY2hpbGQ7CisKK3R5cGVkZWYgc3RydWN0IHByb2MgeworCWNoYXIgY29tbVtDT01NX0xFTiArIDFdOworLy8JY2hhciBmbGFnczsgLSB1bnVzZWQsIGRlbGV0ZT8KKwlwaWRfdCBwaWQ7CisJdWlkX3QgdWlkOworCXN0cnVjdCBjaGlsZCAqY2hpbGRyZW47CisJc3RydWN0IHByb2MgKnBhcmVudDsKKwlzdHJ1Y3QgcHJvYyAqbmV4dDsKK30gUFJPQzsKKworLyogRm9yIGZsYWdzIGFib3ZlICovCisvLyNkZWZpbmUgUEZMQUdfVEhSRUFEICAweDAxCisKK3R5cGVkZWYgc3RydWN0IGNoaWxkIHsKKwlQUk9DICpjaGlsZDsKKwlzdHJ1Y3QgY2hpbGQgKm5leHQ7Cit9IENISUxEOworCisjZGVmaW5lIGVtcHR5XzIgICIgICIKKyNkZWZpbmUgYnJhbmNoXzIgInwtIgorI2RlZmluZSB2ZXJ0XzIgICAifCAiCisjZGVmaW5lIGxhc3RfMiAgICJgLSIKKyNkZWZpbmUgc2luZ2xlXzMgIi0tLSIKKyNkZWZpbmUgZmlyc3RfMyAgIi0rLSIKKworc3RydWN0IGdsb2JhbHMgeworCS8qIDAtYmFzZWQuIElPVzogdGhlIG51bWJlciBvZiBjaGFycyB3ZSBwcmludGVkIG9uIGN1cnJlbnQgbGluZSAqLworCXVuc2lnbmVkIGN1cl94OworCXVuc2lnbmVkIG91dHB1dF93aWR0aDsKKworCS8qIFRoZSBidWZmZXJzIHdpbGwgYmUgZHluYW1pY2FsbHkgaW5jcmVhc2VkIGluIHNpemUgYXMgbmVlZGVkICovCisJdW5zaWduZWQgY2FwYWNpdHk7CisJdW5zaWduZWQgKndpZHRoOworCXVpbnQ4X3QgKm1vcmU7CisKKwlQUk9DICpsaXN0OworCisJc21hbGxpbnQgZHVtcGVkOyAvKiB1c2VkIGJ5IGR1bXBfYnlfdXNlciAqLworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworCisvKgorICogQWxsb2NhdGVzIGFkZGl0aW9uYWwgYnVmZmVyIHNwYWNlIGZvciB3aWR0aCBhbmQgbW9yZSBhcyBuZWVkZWQuCisgKiBUaGUgZmlyc3QgY2FsbCB3aWxsIGFsbG9jYXRlIHRoZSBmaXJzdCBidWZmZXIuCisgKgorICogYnVmaW5kZXggIHRoZSBpbmRleCB0aGF0IHdpbGwgYmUgdXNlZCBhZnRlciB0aGUgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBlbnN1cmVfYnVmZmVyX2NhcGFjaXR5KGludCBidWZpbmRleCkKK3sKKwlpZiAoYnVmaW5kZXggPj0gRy5jYXBhY2l0eSkgeworCQlHLmNhcGFjaXR5ICs9IDB4MTAwOworCQlHLndpZHRoID0geHJlYWxsb2MoRy53aWR0aCwgRy5jYXBhY2l0eSAqIHNpemVvZihHLndpZHRoWzBdKSk7CisJCUcubW9yZSA9IHhyZWFsbG9jKEcubW9yZSwgRy5jYXBhY2l0eSAqIHNpemVvZihHLm1vcmVbMF0pKTsKKwl9Cit9CisKKy8qIE5COiB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCB3aXRoICJiYWQiIGNoYXJzCisgKiAoY29udHJvbCBjaGFycyBvciBjaGFycyA+PSAweDdmKQorICovCitzdGF0aWMgdm9pZCBvdXRfY2hhcihjaGFyIGMpCit7CisJRy5jdXJfeCsrOworCWlmIChHLmN1cl94ID4gRy5vdXRwdXRfd2lkdGgpCisJCXJldHVybjsKKwlpZiAoRy5jdXJfeCA9PSBHLm91dHB1dF93aWR0aCkKKwkJYyA9ICcrJzsKKwlwdXRjaGFyKGMpOworfQorCisvKiBOQjogdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgd2l0aCAiYmFkIiBjaGFycworICogKGNvbnRyb2wgY2hhcnMgb3IgY2hhcnMgPj0gMHg3ZikKKyAqLworc3RhdGljIHZvaWQgb3V0X3N0cmluZyhjb25zdCBjaGFyICpzdHIpCit7CisJd2hpbGUgKCpzdHIpCisJCW91dF9jaGFyKCpzdHIrKyk7Cit9CisKK3N0YXRpYyB2b2lkIG91dF9uZXdsaW5lKHZvaWQpCit7CisJcHV0Y2hhcignXG4nKTsKKwlHLmN1cl94ID0gMDsKK30KKworc3RhdGljIFBST0MgKmZpbmRfcHJvYyhwaWRfdCBwaWQpCit7CisJUFJPQyAqd2FsazsKKworCWZvciAod2FsayA9IEcubGlzdDsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpCisJCWlmICh3YWxrLT5waWQgPT0gcGlkKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gd2FsazsKK30KKworc3RhdGljIFBST0MgKm5ld19wcm9jKGNvbnN0IGNoYXIgKmNvbW0sIHBpZF90IHBpZCwgdWlkX3QgdWlkKQoreworCVBST0MgKm5ldyA9IHh6YWxsb2Moc2l6ZW9mKCpuZXcpKTsKKworCXN0cmNweShuZXctPmNvbW0sIGNvbW0pOworCW5ldy0+cGlkID0gcGlkOworCW5ldy0+dWlkID0gdWlkOworCW5ldy0+bmV4dCA9IEcubGlzdDsKKworCUcubGlzdCA9IG5ldzsKKwlyZXR1cm4gRy5saXN0OworfQorCitzdGF0aWMgdm9pZCBhZGRfY2hpbGQoUFJPQyAqcGFyZW50LCBQUk9DICpjaGlsZCkKK3sKKwlDSElMRCAqbmV3LCAqKndhbGs7CisJaW50IGNtcDsKKworCW5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKworCW5ldy0+Y2hpbGQgPSBjaGlsZDsKKwlmb3IgKHdhbGsgPSAmcGFyZW50LT5jaGlsZHJlbjsgKndhbGs7IHdhbGsgPSAmKCp3YWxrKS0+bmV4dCkgeworCQljbXAgPSBzdHJjbXAoKCp3YWxrKS0+Y2hpbGQtPmNvbW0sIGNoaWxkLT5jb21tKTsKKwkJaWYgKGNtcCA+IDApCisJCQlicmVhazsKKwkJaWYgKGNtcCA9PSAwICYmICgqd2FsayktPmNoaWxkLT51aWQgPiBjaGlsZC0+dWlkKQorCQkJYnJlYWs7CisJfQorCW5ldy0+bmV4dCA9ICp3YWxrOworCSp3YWxrID0gbmV3OworfQorCitzdGF0aWMgdm9pZCBhZGRfcHJvYyhjb25zdCBjaGFyICpjb21tLCBwaWRfdCBwaWQsIHBpZF90IHBwaWQsCisJCQl1aWRfdCB1aWQgLyosIGNoYXIgaXN0aHJlYWQqLykKK3sKKwlQUk9DICp0aGlzLCAqcGFyZW50OworCisJdGhpcyA9IGZpbmRfcHJvYyhwaWQpOworCWlmICghdGhpcykKKwkJdGhpcyA9IG5ld19wcm9jKGNvbW0sIHBpZCwgdWlkKTsKKwllbHNlIHsKKwkJc3RyY3B5KHRoaXMtPmNvbW0sIGNvbW0pOworCQl0aGlzLT51aWQgPSB1aWQ7CisJfQorCisJaWYgKHBpZCA9PSBwcGlkKQorCQlwcGlkID0gMDsKKy8vCWlmIChpc3RocmVhZCkKKy8vCQl0aGlzLT5mbGFncyB8PSBQRkxBR19USFJFQUQ7CisKKwlwYXJlbnQgPSBmaW5kX3Byb2MocHBpZCk7CisJaWYgKCFwYXJlbnQpCisJCXBhcmVudCA9IG5ld19wcm9jKCI/IiwgcHBpZCwgMCk7CisKKwlhZGRfY2hpbGQocGFyZW50LCB0aGlzKTsKKwl0aGlzLT5wYXJlbnQgPSBwYXJlbnQ7Cit9CisKK3N0YXRpYyBpbnQgdHJlZV9lcXVhbChjb25zdCBQUk9DICphLCBjb25zdCBQUk9DICpiKQoreworCWNvbnN0IENISUxEICp3YWxrX2EsICp3YWxrX2I7CisKKwlpZiAoc3RyY21wKGEtPmNvbW0sIGItPmNvbW0pICE9IDApCisJCXJldHVybiAwOworCWlmICgob3B0aW9uX21hc2szMiAvKiYgT1BUX1BJRCovKSAmJiBhLT5waWQgIT0gYi0+cGlkKQorCQlyZXR1cm4gMDsKKworCWZvciAod2Fsa19hID0gYS0+Y2hpbGRyZW4sIHdhbGtfYiA9IGItPmNoaWxkcmVuOworCSAgd2Fsa19hICYmIHdhbGtfYjsKKwkgIHdhbGtfYSA9IHdhbGtfYS0+bmV4dCwgd2Fsa19iID0gd2Fsa19iLT5uZXh0CisJKSB7CisJCWlmICghdHJlZV9lcXVhbCh3YWxrX2EtPmNoaWxkLCB3YWxrX2ItPmNoaWxkKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAhKHdhbGtfYSB8fCB3YWxrX2IpOworfQorCitzdGF0aWMgaW50IG91dF9hcmdzKGNvbnN0IGNoYXIgKm15c3RyKQoreworCWNvbnN0IGNoYXIgKmhlcmU7CisJaW50IHN0cmNvdW50ID0gMDsKKwljaGFyIHRtcHN0cls1XTsKKworCWZvciAoaGVyZSA9IG15c3RyOyAqaGVyZTsgaGVyZSsrKSB7CisJCWlmICgqaGVyZSA9PSAnXFwnKSB7CisJCQlvdXRfc3RyaW5nKCJcXFxcIik7CisJCQlzdHJjb3VudCArPSAyOworCQl9IGVsc2UgaWYgKCpoZXJlID49ICcgJyAmJiAqaGVyZSA8IDB4N2YpIHsKKwkJCW91dF9jaGFyKCpoZXJlKTsKKwkJCXN0cmNvdW50Kys7CisJCX0gZWxzZSB7CisJCQlzcHJpbnRmKHRtcHN0ciwgIlxcJTAzbyIsICh1bnNpZ25lZCBjaGFyKSAqaGVyZSk7CisJCQlvdXRfc3RyaW5nKHRtcHN0cik7CisJCQlzdHJjb3VudCArPSA0OworCQl9CisJfQorCisJcmV0dXJuIHN0cmNvdW50OworfQorCitzdGF0aWMgdm9pZAorZHVtcF90cmVlKFBST0MgKmN1cnJlbnQsIGludCBsZXZlbCwgaW50IHJlcCwgaW50IGxlYWYsIGludCBsYXN0LCBpbnQgY2xvc2luZykKK3sKKwlDSElMRCAqd2FsaywgKm5leHQsICoqc2NhbjsKKwlpbnQgbHZsLCBpLCBhZGQsIG9mZnNldCwgY291bnQsIGNvbW1fbGVuLCBmaXJzdDsKKwljaGFyIHRtcFtzaXplb2YoaW50KSozICsgNF07CisKKwlpZiAoIWN1cnJlbnQpCisJCXJldHVybjsKKworCWlmICghbGVhZikgeworCQlmb3IgKGx2bCA9IDA7IGx2bCA8IGxldmVsOyBsdmwrKykgeworCQkJaSA9IEcud2lkdGhbbHZsXSArIDE7CisJCQl3aGlsZSAoLS1pID49IDApCisJCQkJb3V0X2NoYXIoJyAnKTsKKworCQkJaWYgKGx2bCA9PSBsZXZlbCAtIDEpIHsKKwkJCQlpZiAobGFzdCkgeworCQkJCQlvdXRfc3RyaW5nKGxhc3RfMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJb3V0X3N0cmluZyhicmFuY2hfMik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoRy5tb3JlW2x2bCArIDFdKSB7CisJCQkJCW91dF9zdHJpbmcodmVydF8yKTsKKwkJCQl9IGVsc2UgeworCQkJCQlvdXRfc3RyaW5nKGVtcHR5XzIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWFkZCA9IDA7CisJaWYgKHJlcCA+IDEpIHsKKwkJYWRkICs9IHNwcmludGYodG1wLCAiJWQqWyIsIHJlcCk7CisJCW91dF9zdHJpbmcodG1wKTsKKwl9CisJY29tbV9sZW4gPSBvdXRfYXJncyhjdXJyZW50LT5jb21tKTsKKwlpZiAob3B0aW9uX21hc2szMiAvKiYgT1BUX1BJRCovKSB7CisJCWNvbW1fbGVuICs9IHNwcmludGYodG1wLCAiKCVkKSIsIChpbnQpY3VycmVudC0+cGlkKTsKKwkJb3V0X3N0cmluZyh0bXApOworCX0KKwlvZmZzZXQgPSBHLmN1cl94OworCisJaWYgKCFjdXJyZW50LT5jaGlsZHJlbikJeworCQl3aGlsZSAoY2xvc2luZy0tKQorCQkJb3V0X2NoYXIoJ10nKTsKKwkJb3V0X25ld2xpbmUoKTsKKwl9CisJZW5zdXJlX2J1ZmZlcl9jYXBhY2l0eShsZXZlbCk7CisJRy5tb3JlW2xldmVsXSA9ICFsYXN0OworCisJRy53aWR0aFtsZXZlbF0gPSBjb21tX2xlbiArIEcuY3VyX3ggLSBvZmZzZXQgKyBhZGQ7CisJaWYgKEcuY3VyX3ggPj0gRy5vdXRwdXRfd2lkdGgpIHsKKwkJLy9vdXRfc3RyaW5nKGZpcnN0XzMpOyAtIHdoeT8gaXQgd29uJ3QgcHJpbnQgYW55dGhpbmcKKwkJLy9vdXRfY2hhcignKycpOworCQlvdXRfbmV3bGluZSgpOworCQlyZXR1cm47CisJfQorCisJZmlyc3QgPSAxOworCWZvciAod2FsayA9IGN1cnJlbnQtPmNoaWxkcmVuOyB3YWxrOyB3YWxrID0gbmV4dCkgeworCQljb3VudCA9IDA7CisJCW5leHQgPSB3YWxrLT5uZXh0OworCQlzY2FuID0gJndhbGstPm5leHQ7CisJCXdoaWxlICgqc2NhbikgeworCQkJaWYgKCF0cmVlX2VxdWFsKHdhbGstPmNoaWxkLCAoKnNjYW4pLT5jaGlsZCkpCisJCQkJc2NhbiA9ICYoKnNjYW4pLT5uZXh0OworCQkJZWxzZSB7CisJCQkJaWYgKG5leHQgPT0gKnNjYW4pCisJCQkJCW5leHQgPSAoKnNjYW4pLT5uZXh0OworCQkJCWNvdW50Kys7CisJCQkJKnNjYW4gPSAoKnNjYW4pLT5uZXh0OworCQkJfQorCQl9CisJCWlmIChmaXJzdCkgeworCQkJb3V0X3N0cmluZyhuZXh0ID8gZmlyc3RfMyA6IHNpbmdsZV8zKTsKKwkJCWZpcnN0ID0gMDsKKwkJfQorCisJCWR1bXBfdHJlZSh3YWxrLT5jaGlsZCwgbGV2ZWwgKyAxLCBjb3VudCArIDEsCisJCQkJd2FsayA9PSBjdXJyZW50LT5jaGlsZHJlbiwgIW5leHQsCisJCQkJY2xvc2luZyArIChjb3VudCA/IDEgOiAwKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX2J5X3VzZXIoUFJPQyAqY3VycmVudCwgdWlkX3QgdWlkKQoreworCWNvbnN0IENISUxEICp3YWxrOworCisJaWYgKCFjdXJyZW50KQorCQlyZXR1cm47CisKKwlpZiAoY3VycmVudC0+dWlkID09IHVpZCkgeworCQlpZiAoRy5kdW1wZWQpCisJCQlwdXRjaGFyKCdcbicpOworCQlkdW1wX3RyZWUoY3VycmVudCwgMCwgMSwgMSwgMSwgMCk7CisJCUcuZHVtcGVkID0gMTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKHdhbGsgPSBjdXJyZW50LT5jaGlsZHJlbjsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpCisJCWR1bXBfYnlfdXNlcih3YWxrLT5jaGlsZCwgdWlkKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworc3RhdGljIHZvaWQgaGFuZGxlX3RocmVhZChjb25zdCBjaGFyICpjb21tLCBwaWRfdCBwaWQsIHBpZF90IHBwaWQsIHVpZF90IHVpZCkKK3sKKwljaGFyIHRocmVhZG5hbWVbQ09NTV9MRU4gKyAyXTsKKwlzcHJpbnRmKHRocmVhZG5hbWUsICJ7JS4qc30iLCBDT01NX0xFTiAtIDIsIGNvbW0pOworCWFkZF9wcm9jKHRocmVhZG5hbWUsIHBpZCwgcHBpZCwgdWlkLyosIDEqLyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbXJlYWRfcHJvYyh2b2lkKQoreworCXByb2Nwc19zdGF0dXNfdCAqcCA9IE5VTEw7CisJcGlkX3QgcGFyZW50ID0gMDsKKwlpbnQgZmxhZ3MgPSBQU1NDQU5fQ09NTSB8IFBTU0NBTl9QSUQgfCBQU1NDQU5fUFBJRCB8IFBTU0NBTl9VSURHSUQgfCBQU1NDQU5fVEFTS1M7CisKKwl3aGlsZSAoKHAgPSBwcm9jcHNfc2NhbihwLCBmbGFncykpICE9IE5VTEwpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMKKwkJaWYgKHAtPnBpZCAhPSBwLT5tYWluX3RocmVhZF9waWQpCisJCQloYW5kbGVfdGhyZWFkKHAtPmNvbW0sIHAtPnBpZCwgcGFyZW50LCBwLT51aWQpOworCQllbHNlCisjZW5kaWYKKwkJeworCQkJYWRkX3Byb2MocC0+Y29tbSwgcC0+cGlkLCBwLT5wcGlkLCBwLT51aWQvKiwgMCovKTsKKwkJCXBhcmVudCA9IHAtPnBpZDsKKwkJfQorCX0KK30KKworaW50IHBzdHJlZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcHN0cmVlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlwaWRfdCBwaWQgPSAxOworCWxvbmcgdWlkID0gMDsKKworCUlOSVRfRygpOworCisJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodCgwLCAmRy5vdXRwdXRfd2lkdGgsIE5VTEwpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzEiOworCWdldG9wdDMyKGFyZ3YsICJwIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoYXJndlswXSkgeworCQlpZiAoYXJndlswXVswXSA+PSAnMCcgJiYgYXJndlswXVswXSA8PSAnOScpIHsKKwkJCXBpZCA9IHhhdG9pKGFyZ3ZbMF0pOworCQl9IGVsc2UgeworCQkJdWlkID0geHVuYW1lMnVpZChhcmd2WzBdKTsKKwkJfQorCX0KKworCW1yZWFkX3Byb2MoKTsKKworCWlmICghdWlkKQorCQlkdW1wX3RyZWUoZmluZF9wcm9jKHBpZCksIDAsIDEsIDEsIDEsIDApOworCWVsc2UgeworCQlkdW1wX2J5X3VzZXIoZmluZF9wcm9jKDEpLCB1aWQpOworCQlpZiAoIUcuZHVtcGVkKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gcHJvY2Vzc2VzIGZvdW5kIik7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShHLndpZHRoKTsKKwkJZnJlZShHLm1vcmUpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9wd2R4LmMgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvcHdkeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MTgxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvcHdkeC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHB3ZHggaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTmljaG9sYXMgTWllbGwKKyAqIHBvcnRlZCBmcm9tIHByb2NwcyBieSBQZXJlIE9yZ2EgPGdvdHJ1bmtzQGdtYWlsLmNvbT4gMjAxMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFBXRFgKKy8vY29uZmlnOglib29sICJwd2R4IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJlcG9ydCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9mIGEgcHJvY2VzcworCisvL2FwcGxldDpJRl9QV0RYKEFQUExFVChwd2R4LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1BXRFgpICs9IHB3ZHgubworCisvL3VzYWdlOiNkZWZpbmUgcHdkeF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiUElELi4uIgorLy91c2FnZTojZGVmaW5lIHB3ZHhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGN1cnJlbnQgZGlyZWN0b3J5IGZvciBQSURzXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgcHdkeF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcHdkeF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCWdldG9wdDMyKGFyZ3YsICIiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWRvIHsKKwkJY2hhciBidWZbc2l6ZW9mKCIvcHJvYy8ldS9jd2QiKSArIHNpemVvZihpbnQpKjNdOworCQl1bnNpZ25lZCBwaWQ7CisJCWNoYXIgKnM7CisJCWNoYXIgKmFyZyA9ICphcmd2OworCisJCS8vIEFsbG93ZWQgb24gdGhlIGNvbW1hbmQgbGluZToKKwkJLy8gL3Byb2MvTlVNCisJCS8vIE5VTQorCQlpZiAoc3RybmNtcChhcmcsICIvcHJvYy8iLCA2KSA9PSAwKQorCQkJYXJnICs9IDY7CisKKwkJcGlkID0gYmJfc3RydG91KGFyZywgTlVMTCwgMTApOworCQlpZiAoZXJybm8pCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBwcm9jZXNzIGlkOiAnJXMnIiwgYXJnKTsKKworCQlzcHJpbnRmKGJ1ZiwgIi9wcm9jLyV1L2N3ZCIsIHBpZCk7CisKKwkJcyA9IHhtYWxsb2NfcmVhZGxpbmsoYnVmKTsKKwkJLy8gInB3ZHggL3Byb2MvMSIgc2F5cyAiL3Byb2MvMTogRElSIiwgbm90ICIxOiBESVIiCisJCXByaW50ZigiJXM6ICVzXG4iLCAqYXJndiwgcyA/IHMgOiBzdHJlcnJvcihlcnJubyA9PSBFTk9FTlQgPyBFU1JDSCA6IGVycm5vKSk7CisJCWZyZWUocyk7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3JlbmljZS5jIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3JlbmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjQwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvcmVuaWNlLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJlbmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogTm90ZXM6CisgKiAgIFNldHRpbmcgYW4gYWJzb2x1dGUgcHJpb3JpdHkgd2FzIG9ic29sZXRlZCBpbiBTVVN2MiBhbmQgcmVtb3ZlZAorICogICBpbiBTVVN2My4gIEhvd2V2ZXIsIHRoZSBjb21tb24gbGludXggdmVyc2lvbiBvZiByZW5pY2UgZG9lcworICogICBhYnNvbHV0ZSBhbmQgbm90IHJlbGF0aXZlLiAgU28gd2UnbGwgY29udGludWUgc3VwcG9ydGluZyBhYnNvbHV0ZSwKKyAqICAgYWx0aG91Z2ggdGhlIHN0ZG91dCBsb2dnaW5nIGhhcyBiZWVuIHJlbW92ZWQgc2luY2UgYm90aCBTVVN2MiBhbmQKKyAqICAgU1VTdjMgc3BlY2lmeSB0aGF0IHN0ZG91dCBpc24ndCB1c2VkLgorICoKKyAqICAgVGhpcyB2ZXJzaW9uIGlzIGxlbmllbnQgaW4gdGhhdCBpdCBkb2Vzbid0IHJlcXVpcmUgYW55IElEcy4gIFRoZQorICogICBvcHRpb25zIC1wLCAtZywgYW5kIC11IGFyZSB0cmVhdGVkIGFzIG1vZGUgc3dpdGNoZXMgZm9yIHRoZQorICogICBmb2xsb3dpbmcgSURzIChpZiBhbnkpLiAgTXVsdGlwbGUgc3dpdGNoZXMgYXJlIGFsbG93ZWQuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJlbmljZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAie3stbiBJTkNSRU1FTlR9IHwgUFJJT1JJVFl9IFtbLXAgfCAtZyB8IC11XSBJRC4uLl0iCisvL3VzYWdlOiNkZWZpbmUgcmVuaWNlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIHNjaGVkdWxpbmcgcHJpb3JpdHkgZm9yIGEgcnVubmluZyBwcm9jZXNzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCUFkanVzdCBjdXJyZW50IG5pY2UgdmFsdWUgKHNtYWxsZXIgaXMgZmFzdGVyKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUHJvY2VzcyBpZChzKSAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1nCVByb2Nlc3MgZ3JvdXAgaWQocykiCisvL3VzYWdlOiAgICAgIlxuCS11CVByb2Nlc3MgdXNlciBuYW1lKHMpIGFuZC9vciBpZChzKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKK3ZvaWQgQlVHX2JhZF9QUklPX1BST0NFU1Modm9pZCk7Cit2b2lkIEJVR19iYWRfUFJJT19QR1JQKHZvaWQpOwordm9pZCBCVUdfYmFkX1BSSU9fVVNFUih2b2lkKTsKKworaW50IHJlbmljZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmVuaWNlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBYZXRwcmlvcml0eV9tc2dbXSBBTElHTjEgPSAiJWNldHByaW9yaXR5IjsKKworCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisJaW50IHdoaWNoID0gUFJJT19QUk9DRVNTOyAgLyogRGVmYXVsdCAnd2hpY2gnIHZhbHVlLiAqLworCWludCB1c2VfcmVsYXRpdmUgPSAwOworCWludCBhZGp1c3RtZW50LCBuZXdfcHJpb3JpdHk7CisJdW5zaWduZWQgd2hvOworCWNoYXIgKmFyZzsKKworCS8qIFllcywgdGhleSBhcmUgbm90ICNkZWZpbmVzIGluIGdsaWJjIDIuNCEgI2lmIHdvbid0IHdvcmsgKi8KKwlpZiAoUFJJT19QUk9DRVNTIDwgQ0hBUl9NSU4gfHwgUFJJT19QUk9DRVNTID4gQ0hBUl9NQVgpCisJCUJVR19iYWRfUFJJT19QUk9DRVNTKCk7CisJaWYgKFBSSU9fUEdSUCA8IENIQVJfTUlOIHx8IFBSSU9fUEdSUCA+IENIQVJfTUFYKQorCQlCVUdfYmFkX1BSSU9fUEdSUCgpOworCWlmIChQUklPX1VTRVIgPCBDSEFSX01JTiB8fCBQUklPX1VTRVIgPiBDSEFSX01BWCkKKwkJQlVHX2JhZF9QUklPX1VTRVIoKTsKKworCWFyZyA9ICorK2FyZ3Y7CisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgdXNpbmcgYSByZWxhdGl2ZSBhZGp1c3RtZW50LiAqLworCWlmIChhcmcgJiYgYXJnWzBdID09ICctJyAmJiBhcmdbMV0gPT0gJ24nKSB7CisJCXVzZV9yZWxhdGl2ZSA9IDE7CisJCWlmICghYXJnWzJdKQorCQkJYXJnID0gKisrYXJndjsKKwkJZWxzZQorCQkJYXJnICs9IDI7CisJfQorCisJaWYgKCFhcmcpIHsgIC8qIE5vIGFyZ3M/ICBUaGVuIHNob3cgdXNhZ2UuICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBHZXQgdGhlIHByaW9yaXR5IGFkanVzdG1lbnQgKGFic29sdXRlIG9yIHJlbGF0aXZlKS4gKi8KKwlhZGp1c3RtZW50ID0geGF0b2lfcmFuZ2UoYXJnLCBJTlRfTUlOLzIsIElOVF9NQVgvMik7CisKKwl3aGlsZSAoKGFyZyA9ICorK2FyZ3YpICE9IE5VTEwpIHsKKwkJLyogQ2hlY2sgZm9yIGEgbW9kZSBzd2l0Y2guICovCisJCWlmIChhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSkgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgb3B0c1tdIEFMSUdOMSA9IHsKKwkJCQkncCcsICdnJywgJ3UnLCAwLCBQUklPX1BST0NFU1MsIFBSSU9fUEdSUCwgUFJJT19VU0VSCisJCQl9OworCQkJY29uc3QgY2hhciAqcCA9IHN0cmNocihvcHRzLCBhcmdbMV0pOworCQkJaWYgKHApIHsKKwkJCQl3aGljaCA9IHBbNF07CisJCQkJaWYgKCFhcmdbMl0pCisJCQkJCWNvbnRpbnVlOworCQkJCWFyZyArPSAyOworCQkJfQorCQl9CisKKwkJLyogUHJvY2VzcyBhbiBJRCBhcmcuICovCisJCWlmICh3aGljaCA9PSBQUklPX1VTRVIpIHsKKwkJCXN0cnVjdCBwYXNzd2QgKnA7CisJCQlwID0gZ2V0cHduYW0oYXJnKTsKKwkJCWlmICghcCkgeworCQkJCWJiX2Vycm9yX21zZygidW5rbm93biB1c2VyICVzIiwgYXJnKTsKKwkJCQlnb3RvIEhBRF9FUlJPUjsKKwkJCX0KKwkJCXdobyA9IHAtPnB3X3VpZDsKKwkJfSBlbHNlIHsKKwkJCXdobyA9IGJiX3N0cnRvdShhcmcsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubykgeworCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBudW1iZXIgJyVzJyIsIGFyZyk7CisJCQkJZ290byBIQURfRVJST1I7CisJCQl9CisJCX0KKworCQkvKiBHZXQgcHJpb3JpdHkgdG8gdXNlLCBhbmQgc2V0IGl0LiAqLworCQlpZiAodXNlX3JlbGF0aXZlKSB7CisJCQlpbnQgb2xkX3ByaW9yaXR5OworCisJCQllcnJubyA9IDA7ICAvKiBOZWVkZWQgZm9yIGdldHByaW9yaXR5IGVycm9yIGRldGVjdGlvbi4gKi8KKwkJCW9sZF9wcmlvcml0eSA9IGdldHByaW9yaXR5KHdoaWNoLCB3aG8pOworCQkJaWYgKGVycm5vKSB7CisJCQkJYmJfcGVycm9yX21zZyhYZXRwcmlvcml0eV9tc2csICdnJyk7CisJCQkJZ290byBIQURfRVJST1I7CisJCQl9CisKKwkJCW5ld19wcmlvcml0eSA9IG9sZF9wcmlvcml0eSArIGFkanVzdG1lbnQ7CisJCX0gZWxzZSB7CisJCQluZXdfcHJpb3JpdHkgPSBhZGp1c3RtZW50OworCQl9CisKKwkJaWYgKHNldHByaW9yaXR5KHdoaWNoLCB3aG8sIG5ld19wcmlvcml0eSkgPT0gMCkgeworCQkJY29udGludWU7CisJCX0KKworCQliYl9wZXJyb3JfbXNnKFhldHByaW9yaXR5X21zZywgJ3MnKTsKKyBIQURfRVJST1I6CisJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwl9CisKKwkvKiBObyBuZWVkIHRvIGNoZWNrIGZvciBlcnJvcnMgb3V0cHV0aW5nIHRvIHN0ZGVyciBzaW5jZSwgaWYgaXQKKwkgKiB3YXMgdXNlZCwgdGhlIEhBRF9FUlJPUiBsYWJlbCB3YXMgcmVhY2hlZCBhbmQgcmV0dmFsIHdhcyBzZXQuICovCisKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3NtZW1jYXAuYyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9zbWVtY2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwOGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy9zbWVtY2FwLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgc21lbWNhcCAtIGEgdG9vbCBmb3IgbWVhbmluZ2Z1bCBtZW1vcnkgcmVwb3J0aW5nCisKKyBDb3B5cmlnaHQgMjAwOC0yMDA5IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPgorCisgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IgbGF0ZXIsIGluY29ycG9yYXRlZAorIGhlcmVpbiBieSByZWZlcmVuY2UuCisqLworCisvL2FwcGxldDpJRl9TTUVNQ0FQKEFQUExFVChzbWVtY2FwLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1NNRU1DQVApICs9IHNtZW1jYXAubworCisvL2NvbmZpZzpjb25maWcgU01FTUNBUAorLy9jb25maWc6CWJvb2wgInNtZW1jYXAiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgc21lbWNhcCBpcyBhIHRvb2wgZm9yIGNhcHR1cmluZyBwcm9jZXNzIGRhdGEgZm9yIHNtZW0sCisvL2NvbmZpZzoJICBhIG1lbW9yeSB1c2FnZSBzdGF0aXN0aWMgdG9vbC4KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCitzdHJ1Y3QgZmlsZWJsb2NrIHsKKwlzdHJ1Y3QgZmlsZWJsb2NrICpuZXh0OworCWNoYXIgZGF0YVtUQVJfQkxPQ0tfU0laRV07Cit9OworCitzdGF0aWMgdm9pZCB3cml0ZWhlYWRlcihjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCB0YXJfaGVhZGVyX3QgaGVhZGVyOworCWludCBpLCBzdW07CisKKwltZW1zZXQoJmhlYWRlciwgMCwgVEFSX0JMT0NLX1NJWkUpOworCXN0cmNweShoZWFkZXIubmFtZSwgcGF0aCk7CisJc3ByaW50ZihoZWFkZXIubW9kZSwgIiVvIiwgc2ItPnN0X21vZGUgJiAwNzc3KTsKKwkvKiBjYXJlZnVsIHRvIG5vdCBvdmVyZmxvdyBmaWVsZHMhICovCisJc3ByaW50ZihoZWFkZXIudWlkLCAiJW8iLCBzYi0+c3RfdWlkICYgMDc3Nzc3NzcpOworCXNwcmludGYoaGVhZGVyLmdpZCwgIiVvIiwgc2ItPnN0X2dpZCAmIDA3Nzc3Nzc3KTsKKwlzcHJpbnRmKGhlYWRlci5zaXplLCAiJW8iLCAodW5zaWduZWQpc2ItPnN0X3NpemUpOworCXNwcmludGYoaGVhZGVyLm10aW1lLCAiJWxsbyIsIHNiLT5zdF9tdGltZSAmIDA3Nzc3Nzc3Nzc3N0xMKTsKKwloZWFkZXIudHlwZWZsYWcgPSB0eXBlOworCXN0cmNweShoZWFkZXIubWFnaWMsICJ1c3RhciAgIik7IC8qIGxpa2UgR05VIHRhciAqLworCisJLyogQ2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgY2hlY2tzdW0gKHRoZSBzdW0gb2YgYWxsIG9mIHRoZSBieXRlcyBvZgorCSAqIHRoZSBoZWFkZXIpLiBUaGUgY2hlY2tzdW0gZmllbGQgbXVzdCBiZSBmaWxsZWQgd2l0aCBibGFua3MgZm9yIHRoZQorCSAqIGNhbGN1bGF0aW9uLiBUaGUgY2hlY2tzdW0gZmllbGQgaXMgZm9ybWF0dGVkIGRpZmZlcmVudGx5IGZyb20gdGhlCisJICogb3RoZXIgZmllbGRzOiBpdCBoYXMgNiBkaWdpdHMsIGEgTlVMLCB0aGVuIGEgc3BhY2UgLS0gcmF0aGVyIHRoYW4KKwkgKiBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgTlVMIGxpa2UgdGhlIG90aGVyIGZpZWxkcy4uLiAqLworCWhlYWRlci5jaGtzdW1bN10gPSAnICc7CisJc3VtID0gJyAnICogNzsKKwlmb3IgKGkgPSAwOyBpIDwgVEFSX0JMT0NLX1NJWkU7IGkrKykKKwkJc3VtICs9ICgodW5zaWduZWQgY2hhciopJmhlYWRlcilbaV07CisJc3ByaW50ZihoZWFkZXIuY2hrc3VtLCAiJTA2byIsIHN1bSk7CisKKwl4d3JpdGUoU1RET1VUX0ZJTEVOTywgJmhlYWRlciwgVEFSX0JMT0NLX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBhcmNoaXZlZmlsZShjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBmaWxlYmxvY2sgKnN0YXJ0LCAqY3VyOworCXN0cnVjdCBmaWxlYmxvY2sgKipwcmV2ID0gJnN0YXJ0OworCWludCBmZCwgcjsKKwl1bnNpZ25lZCBzaXplID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzOworCisJLyogYnVmZmVyIHRoZSBmaWxlICovCisJZmQgPSB4b3BlbihwYXRoLCBPX1JET05MWSk7CisJZG8geworCQljdXIgPSB4emFsbG9jKHNpemVvZigqY3VyKSk7CisJCSpwcmV2ID0gY3VyOworCQlwcmV2ID0gJmN1ci0+bmV4dDsKKwkJciA9IGZ1bGxfcmVhZChmZCwgY3VyLT5kYXRhLCBUQVJfQkxPQ0tfU0laRSk7CisJCWlmIChyID4gMCkKKwkJCXNpemUgKz0gcjsKKwl9IHdoaWxlIChyID09IFRBUl9CTE9DS19TSVpFKTsKKworCS8qIHdyaXRlIGFyY2hpdmUgaGVhZGVyICovCisJZnN0YXQoZmQsICZzKTsKKwljbG9zZShmZCk7CisJcy5zdF9zaXplID0gc2l6ZTsKKwl3cml0ZWhlYWRlcihwYXRoLCAmcywgJzAnKTsKKworCS8qIGR1bXAgZmlsZSBjb250ZW50cyAqLworCWZvciAoY3VyID0gc3RhcnQ7IChpbnQpc2l6ZSA+IDA7IHNpemUgLT0gVEFSX0JMT0NLX1NJWkUpIHsKKwkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGN1ci0+ZGF0YSwgVEFSX0JMT0NLX1NJWkUpOworCQlzdGFydCA9IGN1cjsKKwkJY3VyID0gY3VyLT5uZXh0OworCQlmcmVlKHN0YXJ0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFyY2hpdmVqb2luKGNvbnN0IGNoYXIgKnN1YiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyIHBhdGhbc2l6ZW9mKGxvbmcgbG9uZykqMyArIHNpemVvZigiL2NtZGxpbmUiKV07CisJc3ByaW50ZihwYXRoLCAiJXMvJXMiLCBzdWIsIG5hbWUpOworCWFyY2hpdmVmaWxlKHBhdGgpOworfQorCisvL3VzYWdlOiNkZWZpbmUgc21lbWNhcF90cml2aWFsX3VzYWdlICI+U01FTURBVEEuVEFSIgorLy91c2FnZTojZGVmaW5lIHNtZW1jYXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb2xsZWN0IG1lbW9yeSB1c2FnZSBkYXRhIGluIC9wcm9jIGFuZCB3cml0ZSBpdCB0byBzdGRvdXQiCisKK2ludCBzbWVtY2FwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzbWVtY2FwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJRElSICpkOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJeGNoZGlyKCIvcHJvYyIpOworCWQgPSB4b3BlbmRpcigiLiIpOworCisJYXJjaGl2ZWZpbGUoIm1lbWluZm8iKTsKKwlhcmNoaXZlZmlsZSgidmVyc2lvbiIpOworCXdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisJCWlmIChpc2RpZ2l0KGRlLT5kX25hbWVbMF0pKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzOworCQkJbWVtc2V0KCZzLCAwLCBzaXplb2YocykpOworCQkJcy5zdF9tb2RlID0gMDU1NTsKKwkJCXdyaXRlaGVhZGVyKGRlLT5kX25hbWUsICZzLCAnNScpOworCQkJYXJjaGl2ZWpvaW4oZGUtPmRfbmFtZSwgInNtYXBzIik7CisJCQlhcmNoaXZlam9pbihkZS0+ZF9uYW1lLCAiY21kbGluZSIpOworCQkJYXJjaGl2ZWpvaW4oZGUtPmRfbmFtZSwgInN0YXQiKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2VkaXIoZCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3N5c2N0bC5jIGIvYnVzeWJveC0xLjE5LjMvcHJvY3BzL3N5c2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2I2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvc3lzY3RsLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFN5c2N0bCAxLjAxIC0gQSB1dGlsaXR5IHRvIHJlYWQgYW5kIG1hbmlwdWxhdGUgdGhlIHN5c2N0bCBwYXJhbWV0ZXJzCisgKgorICogQ29weXJpZ2h0IDE5OTkgR2VvcmdlIFN0YWlrb3MKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIENoYW5nZWxvZzoKKyAqIHYxLjAxICAgLSBhZGRlZCAtcCA8cHJlbG9hZD4gdG8gcHJlbG9hZCB2YWx1ZXMgZnJvbSBhIGZpbGUKKyAqIHYxLjAxLjEgLSBidXN5Ym94IGFwcGxldCBhd2FyZSBieSA8c29sYXJAZ2VudG9vLm9yZz4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3lzY3RsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW1ZBTFVFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzeXNjdGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb25maWd1cmUga2VybmVsIHBhcmFtZXRlcnMgYXQgcnVudGltZVxuIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBwcmludCBrZXkgbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1lCURvbid0IHdhcm4gYWJvdXQgdW5rbm93biBrZXlzIgorLy91c2FnZTogICAgICJcbgktdwlDaGFuZ2Ugc3lzY3RsIHNldHRpbmciCisvL3VzYWdlOiAgICAgIlxuCS1wIEZJTEUJTG9hZCBzeXNjdGwgc2V0dGluZ3MgZnJvbSBGSUxFIChkZWZhdWx0IC9ldGMvc3lzY3RsLmNvbmYpIgorLy91c2FnZTogICAgICJcbgktYQlEaXNwbGF5IGFsbCB2YWx1ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1BCURpc3BsYXkgYWxsIHZhbHVlcyBpbiB0YWJsZSBmb3JtIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzeXNjdGxfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgInN5c2N0bCBbLW5dIFstZV0gdmFyaWFibGUuLi5cbiIKKy8vdXNhZ2U6ICAgICAgICJzeXNjdGwgWy1uXSBbLWVdIC13IHZhcmlhYmxlPXZhbHVlLi4uXG4iCisvL3VzYWdlOiAgICAgICAic3lzY3RsIFstbl0gWy1lXSAtYVxuIgorLy91c2FnZTogICAgICAgInN5c2N0bCBbLW5dIFstZV0gLXAgZmlsZQkoZGVmYXVsdCAvZXRjL3N5c2N0bC5jb25mKVxuIgorLy91c2FnZTogICAgICAgInN5c2N0bCBbLW5dIFstZV0gLUFcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCUZMQUdfU0hPV19LRVlTICAgICAgID0gMSA8PCAwLAorCUZMQUdfU0hPV19LRVlfRVJST1JTID0gMSA8PCAxLAorCUZMQUdfVEFCTEVfRk9STUFUICAgID0gMSA8PCAyLCAvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwlGTEFHX1NIT1dfQUxMICAgICAgICA9IDEgPDwgMywKKwlGTEFHX1BSRUxPQURfRklMRSAgICA9IDEgPDwgNCwKKwlGTEFHX1dSSVRFICAgICAgICAgICA9IDEgPDwgNSwKK307CisjZGVmaW5lIE9QVElPTl9TVFIgIm5lQWFwdyIKKworc3RhdGljIHZvaWQgc3lzY3RsX2RvdHNfdG9fc2xhc2hlcyhjaGFyICpuYW1lKQoreworCWNoYXIgKmNwdHIsICpsYXN0X2dvb2QsICplbmQ7CisKKwkvKiBDb252ZXJ0IG1pbmltdW0gbnVtYmVyIG9mICcuJyB0byAnLycgc28gdGhhdAorCSAqIHdlIGVuZCB1cCB3aXRoIGV4aXN0aW5nIGZpbGUncyBuYW1lLgorCSAqCisJICogRXhhbXBsZSBmcm9tIGJ1ZyAzODk0OgorCSAqIG5ldC5pcHY0LmNvbmYuZXRoMC4xMDAubWNfZm9yd2FyZGluZyAtPgorCSAqIG5ldC9pcHY0L2NvbmYvZXRoMC4xMDAvbWNfZm9yd2FyZGluZworCSAqIE5COiBuZXQvaXB2NC9jb25mL2V0aDAvbWNfZm9yd2FyZGluZyAqYWxzbyBleGlzdHMqLAorCSAqIHRoZXJlZm9yZSB3ZSBtdXN0IHN0YXJ0IGZyb20gdGhlIGVuZCwgYW5kIGlmCisJICogd2UgcmVwbGFjZWQgZXZlbiBvbmUgLiAtPiAvLCBzdGFydCBvdmVyIGFnYWluLAorCSAqIGJ1dCBuZXZlciByZXBsYWNlIGRvdHMgYmVmb3JlIHRoZSBwb3NpdGlvbgorCSAqIHdoZXJlIGxhc3QgcmVwbGFjZW1lbnQgb2NjdXJyZWQuCisJICoKKwkgKiBBbm90aGVyIGJ1ZyB3ZSBsYXRlciBoYWQgaXMgdGhhdAorCSAqIG5ldC5pcHY0LmNvbmYuZXRoMC4xMDAKKwkgKiAod2l0aG91dCAubWNfZm9yd2FyZGluZykgd2FzIG1pc2hhbmRsZWQuCisJICoKKwkgKiBUbyBzZXQgdXAgdGVzdGluZzogbW9kcHJvYmUgODAyMXE7IHZjb25maWcgYWRkIGV0aDAgMTAwCisJICovCisJZW5kID0gbmFtZSArIHN0cmxlbihuYW1lKTsKKwlsYXN0X2dvb2QgPSBuYW1lIC0gMTsKKwkqZW5kID0gJy4nOyAvKiB0cmljayB0aGUgbG9vcCBpbnRvIHRyeWluZyBmdWxsIG5hbWUgdG9vICovCisKKyBhZ2FpbjoKKwljcHRyID0gZW5kOworCXdoaWxlIChjcHRyID4gbGFzdF9nb29kKSB7CisJCWlmICgqY3B0ciA9PSAnLicpIHsKKwkJCSpjcHRyID0gJ1wwJzsKKwkJCS8vYmJfZXJyb3JfbXNnKCJ0cnlpbmc6JyVzJyIsIG5hbWUpOworCQkJaWYgKGFjY2VzcyhuYW1lLCBGX09LKSA9PSAwKSB7CisJCQkJKmNwdHIgPSAnLyc7CisJCQkJLy9iYl9lcnJvcl9tc2coInJlcGxhY2VkOiclcyciLCBuYW1lKTsKKwkJCQlsYXN0X2dvb2QgPSBjcHRyOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCQkqY3B0ciA9ICcuJzsKKwkJfQorCQljcHRyLS07CisJfQorCSplbmQgPSAnXDAnOworfQorCitzdGF0aWMgaW50IHN5c2N0bF9hY3Rfb25fc2V0dGluZyhjaGFyICpzZXR0aW5nKQoreworCWludCBmZCwgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCWNoYXIgKmNwdHIsICpvdXRuYW1lOworCWNoYXIgKnZhbHVlID0gdmFsdWU7IC8qIGZvciBjb21waWxlciAqLworCisJb3V0bmFtZSA9IHhzdHJkdXAoc2V0dGluZyk7CisKKwljcHRyID0gb3V0bmFtZTsKKwl3aGlsZSAoKmNwdHIpIHsKKwkJaWYgKCpjcHRyID09ICcvJykKKwkJCSpjcHRyID0gJy4nOworCQljcHRyKys7CisJfQorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1dSSVRFKSB7CisJCWNwdHIgPSBzdHJjaHIoc2V0dGluZywgJz0nKTsKKwkJaWYgKGNwdHIgPT0gTlVMTCkgeworCQkJYmJfZXJyb3JfbXNnKCJlcnJvcjogJyVzJyBtdXN0IGJlIG9mIHRoZSBmb3JtIG5hbWU9dmFsdWUiLAorCQkJCW91dG5hbWUpOworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJZ290byBlbmQ7CisJCX0KKwkJdmFsdWUgPSBjcHRyICsgMTsgIC8qIHBvaW50IHRvIHRoZSB2YWx1ZSBpbiBuYW1lPXZhbHVlICovCisJCWlmIChzZXR0aW5nID09IGNwdHIgfHwgISp2YWx1ZSkgeworCQkJYmJfZXJyb3JfbXNnKCJlcnJvcjogbWFsZm9ybWVkIHNldHRpbmcgJyVzJyIsIG91dG5hbWUpOworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJZ290byBlbmQ7CisJCX0KKwkJKmNwdHIgPSAnXDAnOworCQlvdXRuYW1lW2NwdHIgLSBzZXR0aW5nXSA9ICdcMCc7CisJCS8qIHByb2NwcyAzLjIuNyBhY3R1YWxseSB1c2VzIHRoZXNlIGZsYWdzICovCisJCWZkID0gb3BlbihzZXR0aW5nLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIDA2NjYpOworCX0gZWxzZSB7CisJCWZkID0gb3BlbihzZXR0aW5nLCBPX1JET05MWSk7CisJfQorCisJaWYgKGZkIDwgMCkgeworCQlzd2l0Y2ggKGVycm5vKSB7CisJCWNhc2UgRU5PRU5UOgorCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1NIT1dfS0VZX0VSUk9SUykKKwkJCQliYl9lcnJvcl9tc2coImVycm9yOiAnJXMnIGlzIGFuIHVua25vd24ga2V5Iiwgb3V0bmFtZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX3BlcnJvcl9tc2coImVycm9yICVzaW5nIGtleSAnJXMnIiwKKwkJCQkJb3B0aW9uX21hc2szMiAmIEZMQUdfV1JJVEUgPworCQkJCQkJInNldHQiIDogInJlYWQiLAorCQkJCQlvdXRuYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1dSSVRFKSB7CisvL1RPRE86IHByb2NwcyAzLjIuNyB3cml0ZXMgInZhbHVlXG4iLCBub3RlIHRyYWlsaW5nICJcbiIKKwkJeHdyaXRlX3N0cihmZCwgdmFsdWUpOworCQljbG9zZShmZCk7CisJCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19TSE9XX0tFWVMpCisJCQlwcmludGYoIiVzID0gIiwgb3V0bmFtZSk7CisJCXB1dHModmFsdWUpOworCX0gZWxzZSB7CisJCWNoYXIgYzsKKworCQl2YWx1ZSA9IGNwdHIgPSB4bWFsbG9jX3JlYWQoZmQsIE5VTEwpOworCQljbG9zZShmZCk7CisJCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCQliYl9wZXJyb3JfbXNnKCJlcnJvciByZWFkaW5nIGtleSAnJXMnIiwgb3V0bmFtZSk7CisJCQlnb3RvIGVuZDsKKwkJfQorCisJCS8qIGRldi5jZHJvbS5pbmZvIGFuZCBzdW5ycGMudHJhbnNwb3J0cywgZm9yIGV4YW1wbGUsCisJCSAqIGFyZSBtdWx0aS1saW5lLiBUcnkgInN5c2N0bCBzdW5ycGMudHJhbnNwb3J0cyIKKwkJICovCisJCXdoaWxlICgoYyA9ICpjcHRyKSAhPSAnXDAnKSB7CisJCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfU0hPV19LRVlTKQorCQkJCXByaW50ZigiJXMgPSAiLCBvdXRuYW1lKTsKKwkJCXdoaWxlICgxKSB7CisJCQkJZnB1dGMoYywgc3Rkb3V0KTsKKwkJCQljcHRyKys7CisJCQkJaWYgKGMgPT0gJ1xuJykKKwkJCQkJYnJlYWs7CisJCQkJYyA9ICpjcHRyOworCQkJCWlmIChjID09ICdcMCcpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZyZWUodmFsdWUpOworCX0KKyBlbmQ6CisJZnJlZShvdXRuYW1lKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHN5c2N0bF9hY3RfcmVjdXJzaXZlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkaXJwOworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwljaGFyICpuZXh0OworCWludCByZXR2YWwgPSAwOworCisJc3RhdChwYXRoLCAmYnVmKTsKKwlpZiAoU19JU0RJUihidWYuc3RfbW9kZSkgJiYgIShvcHRpb25fbWFzazMyICYgRkxBR19XUklURSkpIHsKKwkJZGlycCA9IG9wZW5kaXIocGF0aCk7CisJCWlmIChkaXJwID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7CisJCQluZXh0ID0gY29uY2F0X3N1YnBhdGhfZmlsZShwYXRoLCBlbnRyeS0+ZF9uYW1lKTsKKwkJCWlmIChuZXh0ID09IE5VTEwpCisJCQkJY29udGludWU7IC8qIGRfbmFtZSBpcyAiLiIgb3IgIi4uIiAqLworCQkJLyogaWYgcGF0aCB3YXMgIi4iLCBkcm9wICIuLyIgcHJlZml4OiAqLworCQkJcmV0dmFsIHw9IHN5c2N0bF9hY3RfcmVjdXJzaXZlKChuZXh0WzBdID09ICcuJyAmJiBuZXh0WzFdID09ICcvJykgPworCQkJCQkgICAgbmV4dCArIDIgOiBuZXh0KTsKKwkJCWZyZWUobmV4dCk7CisJCX0KKwkJY2xvc2VkaXIoZGlycCk7CisJfSBlbHNlIHsKKwkJY2hhciAqbmFtZSA9IHhzdHJkdXAocGF0aCk7CisJCXJldHZhbCB8PSBzeXNjdGxfYWN0X29uX3NldHRpbmcobmFtZSk7CisJCWZyZWUobmFtZSk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogU2V0IHN5c2N0bCdzIGZyb20gYSBjb25mIGZpbGUuIEZvcm1hdCBleGFtcGxlOgorICogIyBDb250cm9scyBJUCBwYWNrZXQgZm9yd2FyZGluZworICogbmV0LmlwdjQuaXBfZm9yd2FyZCA9IDAKKyAqLworc3RhdGljIGludCBzeXNjdGxfaGFuZGxlX3ByZWxvYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICp0b2tlblsyXTsKKwlwYXJzZXJfdCAqcGFyc2VyOworCisJcGFyc2VyID0gY29uZmlnX29wZW4oZmlsZW5hbWUpOworCS8qIE11c3QgZG8gaXQgX2FmdGVyXyBjb25maWdfb3BlbigpOiAqLworCXhjaGRpcigiL3Byb2Mvc3lzIik7CisJLyogeGNocm9vdCgiLiIpIC0gaWYgeW91IGFyZSBwYXJhbm9pZCAqLworCisvL1RPRE86ICc7JyBpcyBjb21tZW50IGNoYXIgdG9vCisvL1RPRE86IGNvbW1lbnQgbWF5IGJlIG9ubHkgYXQgbGluZSBzdGFydC4gInZhcj0xICNhYmMiIC0gIjEgI2FiYyIgaXMgdGhlIHZhbHVlCisvLyAoYnV0IF93aGl0ZXNwYWNlXyBmcm9tIGVuZHMgc2hvdWxkIGJlIHRyaW1tZWQgZmlyc3QgKGFuZCB3ZSBkbyBpdCByaWdodCkpCisvL1RPRE86ICJ2YXI9PTEiIGlzIG1pc2hhbmRsZWQgKG11c3QgdXNlICI9MSIgYXMgYSB2YWx1ZSwgYnV0IHVzZXMgIjEiKQorLy8gY2FuIGl0IGJlIGZpeGVkIGJ5IHJlbW92aW5nIFBBUlNFX0NPTExBUFNFIGJpdD8KKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIiMgXHQ9IiwgUEFSU0VfTk9STUFMKSkgeworCQljaGFyICp0cDsKKwkJc3lzY3RsX2RvdHNfdG9fc2xhc2hlcyh0b2tlblswXSk7CisJCXRwID0geGFzcHJpbnRmKCIlcz0lcyIsIHRva2VuWzBdLCB0b2tlblsxXSk7CisJCXN5c2N0bF9hY3RfcmVjdXJzaXZlKHRwKTsKKwkJZnJlZSh0cCk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzeXNjdGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN5c2N0bF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbDsKKwlpbnQgb3B0OworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIisiIE9QVElPTl9TVFIpOyAvKiAnKycgLSBzdG9wIG9uIGZpcnN0IG5vbi1vcHRpb24gKi8KKwlhcmd2ICs9IG9wdGluZDsKKwlvcHQgXj0gKEZMQUdfU0hPV19LRVlTIHwgRkxBR19TSE9XX0tFWV9FUlJPUlMpOworCW9wdGlvbl9tYXNrMzIgPSBvcHQ7CisKKwlpZiAob3B0ICYgRkxBR19QUkVMT0FEX0ZJTEUpIHsKKwkJb3B0aW9uX21hc2szMiB8PSBGTEFHX1dSSVRFOworCQkvKiB4Y2hkaXIoIi9wcm9jL3N5cyIpIGlzIGluc2lkZSAqLworCQlyZXR1cm4gc3lzY3RsX2hhbmRsZV9wcmVsb2FkX2ZpbGUoKmFyZ3YgPyAqYXJndiA6ICIvZXRjL3N5c2N0bC5jb25mIik7CisJfQorCXhjaGRpcigiL3Byb2Mvc3lzIik7CisJLyogeGNocm9vdCgiLiIpIC0gaWYgeW91IGFyZSBwYXJhbm9pZCAqLworCWlmIChvcHQgJiAoRkxBR19UQUJMRV9GT1JNQVQgfCBGTEFHX1NIT1dfQUxMKSkgeworCQlyZXR1cm4gc3lzY3RsX2FjdF9yZWN1cnNpdmUoIi4iKTsKKwl9CisKKwlyZXR2YWwgPSAwOworCXdoaWxlICgqYXJndikgeworCQlzeXNjdGxfZG90c190b19zbGFzaGVzKCphcmd2KTsKKwkJcmV0dmFsIHw9IHN5c2N0bF9hY3RfcmVjdXJzaXZlKCphcmd2KTsKKwkJYXJndisrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9wcm9jcHMvdG9wLmMgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExYmJmMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy90b3AuYwpAQCAtMCwwICsxLDExOTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEEgdGlueSAndG9wJyB1dGlsaXR5LgorICoKKyAqIFRoaXMgaXMgd3JpdHRlbiBzcGVjaWZpY2FsbHkgZm9yIHRoZSBsaW51eCAvcHJvYy88UElEPi9zdGF0KG0pCisgKiBmaWxlcyBmb3JtYXQuCisgKgorICogVGhpcyByZWFkcyB0aGUgUElEcyBvZiBhbGwgcHJvY2Vzc2VzIGFuZCB0aGVpciBzdGF0dXMgYW5kIHNob3dzCisgKiB0aGUgc3RhdHVzIG9mIHByb2Nlc3NlcyAoZmlyc3Qgb25lcyB0aGF0IGZpdCB0byBzY3JlZW4pIGF0IGdpdmVuCisgKiBpbnRlcnZhbHMuCisgKgorICogTk9URVM6CisgKiAtIEF0IHN0YXJ0dXAgdGhpcyBjaGFuZ2VzIHRvIC9wcm9jLCBhbGwgdGhlIHJlYWRzIGFyZSB0aGVuCisgKiAgIHJlbGF0aXZlIHRvIHRoYXQuCisgKgorICogKEMpIEVlcm8gVGFtbWluZW4gPG9hayBhdCB3ZWxobyBkb3QgY29tPgorICoKKyAqIFJld3JpdHRlbiBieSBWbGFkaW1pciBPbGV5bmlrIChDKSAyMDAyIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogU2VwdCAyMDA4OiBWaW5lZXQgR3VwdGEgPHZpbmVldC5ndXB0YUBhcmMuY29tPgorICogQWRkZWQgU3VwcG9ydCBmb3IgcmVwb3J0aW5nIFNNUCBJbmZvcm1hdGlvbgorICogLSBDUFUgd2hlcmUgcHJvY2VzcyB3YXMgbGFzdCBzZWVuIHJ1bm5pbmcKKyAqICAgKHRvIHNlZSBlZmZlY3Qgb2Ygc2NoZWRfc2V0YWZmaW5pdHkoKSBldGMpCisgKiAtIENQVSB0aW1lIHNwbGl0IChpZGxlL0lPL3dhaXQgZXRjKSBwZXIgQ1BVCisgKgorICogQ29weXJpZ2h0IChjKSAxOTkyIEJyYW5rbyBMYW5rZXN0ZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MiBSb2dlciBCaW5ucworICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQ2hhcmxlcyBMLiBCbGFrZS4KKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk4IE1pY2hhZWwgSy4gSm9obnNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIEhvdyB0byBzbmFwc2hvdCAvcHJvYyBmb3IgZGVidWdnaW5nIHRvcCBwcm9ibGVtczoKKyAqIGZvciBmIGluIC9wcm9jL1swLTldKiIiL3N0YXQ7IGRvCisgKiAgICAgICAgIG49JHtmIy9wcm9jL30KKyAqICAgICAgICAgbj0ke24lL3N0YXR9X3N0YXQKKyAqICAgICAgICAgY3AgJGYgJG4KKyAqIGRvbmUKKyAqIGNwIC9wcm9jL3N0YXQgL3Byb2MvbWVtaW5mbyAvcHJvYy9sb2FkYXZnIC4KKyAqIHRvcCAtYm4xID50b3Aub3V0CisgKgorICogLi4uYW5kIGhvdyB0byBydW4gdG9wIG9uIGl0IG9uIGFub3RoZXIgbWFjaGluZToKKyAqIHJtIC1yZiBwcm9jOyBta2RpciBwcm9jCisgKiBmb3IgZiBpbiBbMC05XSpfc3RhdDsgZG8KKyAqICAgICAgICAgcD0ke2YlX3N0YXR9CisgKiAgICAgICAgIG1rZGlyIC1wIHByb2MvJHAKKyAqICAgICAgICAgY3AgJGYgcHJvYy8kcC9zdGF0CisgKiBkb25lCisgKiBjcCBzdGF0IG1lbWluZm8gbG9hZGF2ZyBwcm9jCisgKiBjaHJvb3QgLiAuL3RvcCAtYm4xID50b3AxLm91dAorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisKK3R5cGVkZWYgc3RydWN0IHRvcF9zdGF0dXNfdCB7CisJdW5zaWduZWQgbG9uZyB2c3o7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJdW5zaWduZWQgbG9uZyB0aWNrczsKKwl1bnNpZ25lZCBwY3B1OyAvKiBkZWx0YSBvZiB0aWNrcyAqLworI2VuZGlmCisJdW5zaWduZWQgcGlkLCBwcGlkOworCXVuc2lnbmVkIHVpZDsKKwljaGFyIHN0YXRlWzRdOworCWNoYXIgY29tbVtDT01NX0xFTl07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTCisJaW50IGxhc3Rfc2Vlbl9vbl9jcHU7CisjZW5kaWYKK30gdG9wX3N0YXR1c190OworCit0eXBlZGVmIHN0cnVjdCBqaWZmeV9jb3VudHNfdCB7CisJLyogTGludXggMi40LnggaGFzIG9ubHkgZmlyc3QgZm91ciAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyB1c3IsIG5pYywgc3lzLCBpZGxlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpb3dhaXQsIGlycSwgc29mdGlycSwgc3RlYWw7CisJdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsOworCXVuc2lnbmVkIGxvbmcgbG9uZyBidXN5OworfSBqaWZmeV9jb3VudHNfdDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHNvbWUgY3JpdGljYWwgaW5mb3JtYXRpb24gZnJvbSBvbmUgZnJhbWUgdG8KKyAgIHRoZSBuZXh0LiBVc2VkIGZvciBmaW5kaW5nIGRlbHRhcy4gKi8KK3R5cGVkZWYgc3RydWN0IHNhdmVfaGlzdCB7CisJdW5zaWduZWQgbG9uZyB0aWNrczsKKwlwaWRfdCBwaWQ7Cit9IHNhdmVfaGlzdDsKKwordHlwZWRlZiBpbnQgKCpjbXBfZnVuY3ApKHRvcF9zdGF0dXNfdCAqUCwgdG9wX3N0YXR1c190ICpRKTsKKworCitlbnVtIHsgU09SVF9ERVBUSCA9IDMgfTsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJdG9wX3N0YXR1c190ICp0b3A7CisJaW50IG50b3A7CisJc21hbGxpbnQgaW52ZXJ0ZWQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNCisJc21hbGxpbnQgc29ydF9maWVsZDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJc21hbGxpbnQgc21wX2NwdV9pbmZvOyAvKiBvbmUvbWFueSBjcHUgaW5mbyBsaW5lcz8gKi8KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TCisJc3RydWN0IHRlcm1pb3MgaW5pdGlhbF9zZXR0aW5nczsKKyNlbmRpZgorI2lmICFFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwljbXBfZnVuY3Agc29ydF9mdW5jdGlvblsxXTsKKyNlbHNlCisJY21wX2Z1bmNwIHNvcnRfZnVuY3Rpb25bU09SVF9ERVBUSF07CisJc3RydWN0IHNhdmVfaGlzdCAqcHJldl9oaXN0OworCWludCBwcmV2X2hpc3RfY291bnQ7CisJamlmZnlfY291bnRzX3QgY3VyX2ppZiwgcHJldl9qaWY7CisJLyogaW50IGhpc3RfaXRlcmF0aW9uczsgKi8KKwl1bnNpZ25lZCB0b3RhbF9wY3B1OworCS8qIHVuc2lnbmVkIGxvbmcgdG90YWxfdnN6OyAqLworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKwkvKiBQZXIgQ1BVIHNhbXBsZXM6IGN1cnJlbnQgYW5kIGxhc3QgKi8KKwlqaWZmeV9jb3VudHNfdCAqY3B1X2ppZiwgKmNwdV9wcmV2X2ppZjsKKwlpbnQgbnVtX2NwdXM7CisjZW5kaWYKKwljaGFyIGxpbmVfYnVmWzgwXTsKK307IC8vRklYX0FMSUFTSU5HOyAtIGxhcmdlIGNvZGUgZ3Jvd3RoCitlbnVtIHsgTElORV9CVUZfU0laRSA9IENPTU1PTl9CVUZTSVpFIC0gb2Zmc2V0b2Yoc3RydWN0IGdsb2JhbHMsIGxpbmVfYnVmKSB9OworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCitzdHJ1Y3QgQlVHX2JhZF9zaXplIHsKKwljaGFyIEJVR19HX3Rvb19iaWdbc2l6ZW9mKEcpIDw9IENPTU1PTl9CVUZTSVpFID8gMSA6IC0xXTsKKwljaGFyIEJVR19saW5lX2J1Zl90b29fc21hbGxbTElORV9CVUZfU0laRSA+IDgwID8gMSA6IC0xXTsKK307CisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdG9wICAgICAgICAgICAgICAoRy50b3AgICAgICAgICAgICAgICApCisjZGVmaW5lIG50b3AgICAgICAgICAgICAgKEcubnRvcCAgICAgICAgICAgICAgKQorI2RlZmluZSBzb3J0X2ZpZWxkICAgICAgIChHLnNvcnRfZmllbGQgICAgICAgICkKKyNkZWZpbmUgaW52ZXJ0ZWQgICAgICAgICAoRy5pbnZlcnRlZCAgICAgICAgICApCisjZGVmaW5lIHNtcF9jcHVfaW5mbyAgICAgKEcuc21wX2NwdV9pbmZvICAgICAgKQorI2RlZmluZSBpbml0aWFsX3NldHRpbmdzIChHLmluaXRpYWxfc2V0dGluZ3MgICkKKyNkZWZpbmUgc29ydF9mdW5jdGlvbiAgICAoRy5zb3J0X2Z1bmN0aW9uICAgICApCisjZGVmaW5lIHByZXZfaGlzdCAgICAgICAgKEcucHJldl9oaXN0ICAgICAgICAgKQorI2RlZmluZSBwcmV2X2hpc3RfY291bnQgIChHLnByZXZfaGlzdF9jb3VudCAgICkKKyNkZWZpbmUgY3VyX2ppZiAgICAgICAgICAoRy5jdXJfamlmICAgICAgICAgICApCisjZGVmaW5lIHByZXZfamlmICAgICAgICAgKEcucHJldl9qaWYgICAgICAgICAgKQorI2RlZmluZSBjcHVfamlmICAgICAgICAgIChHLmNwdV9qaWYgICAgICAgICAgICkKKyNkZWZpbmUgY3B1X3ByZXZfamlmICAgICAoRy5jcHVfcHJldl9qaWYgICAgICApCisjZGVmaW5lIG51bV9jcHVzICAgICAgICAgKEcubnVtX2NwdXMgICAgICAgICAgKQorI2RlZmluZSB0b3RhbF9wY3B1ICAgICAgIChHLnRvdGFsX3BjcHUgICAgICAgICkKKyNkZWZpbmUgbGluZV9idWYgICAgICAgICAoRy5saW5lX2J1ZiAgICAgICAgICApCisKK2VudW0geworCU9QVF9kID0gKDEgPDwgMCksCisJT1BUX24gPSAoMSA8PCAxKSwKKwlPUFRfYiA9ICgxIDw8IDIpLAorCU9QVF9tID0gKDEgPDwgMyksCisJT1BUX0VPRiA9ICgxIDw8IDQpLCAvKiBwc2V1ZG86ICJ3ZSBzYXcgRU9GIGluIHN0ZGluIiAqLworfTsKKyNkZWZpbmUgT1BUX0JBVENIX01PREUgKG9wdGlvbl9tYXNrMzIgJiBPUFRfYikKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKK3N0YXRpYyBpbnQgcGlkX3NvcnQodG9wX3N0YXR1c190ICpQLCB0b3Bfc3RhdHVzX3QgKlEpCit7CisJLyogQnVnZ3kgd3J0IHBpZHMgd2l0aCBoaWdoIGJpdCBzZXQgKi8KKwkvKiAobGludXggcGlkcyBhcmUgaW4gWzEuLjJeMTUtMV0pICovCisJcmV0dXJuIChRLT5waWQgLSBQLT5waWQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbWVtX3NvcnQodG9wX3N0YXR1c190ICpQLCB0b3Bfc3RhdHVzX3QgKlEpCit7CisJLyogV2Ugd2FudCB0byBhdm9pZCB1bnNpZ25lZC0+c2lnbmVkIGFuZCB0cnVuY2F0aW9uIGVycm9ycyAqLworCWlmIChRLT52c3ogPCBQLT52c3opIHJldHVybiAtMTsKKwlyZXR1cm4gUS0+dnN6ICE9IFAtPnZzejsgLyogMCBpZiA9PSwgMSBpZiA+ICovCit9CisKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCitzdGF0aWMgaW50IHBjcHVfc29ydCh0b3Bfc3RhdHVzX3QgKlAsIHRvcF9zdGF0dXNfdCAqUSkKK3sKKwkvKiBCdWdneSB3cnQgdGlja3Mgd2l0aCBoaWdoIGJpdCBzZXQgKi8KKwkvKiBBZmZlY3RzIG9ubHkgcHJvY2Vzc2VzIGZvciB3aGljaCB0aWNrcyBvdmVyZmxvdyAqLworCXJldHVybiAoaW50KVEtPnBjcHUgLSAoaW50KVAtPnBjcHU7Cit9CisKK3N0YXRpYyBpbnQgdGltZV9zb3J0KHRvcF9zdGF0dXNfdCAqUCwgdG9wX3N0YXR1c190ICpRKQoreworCS8qIFdlIHdhbnQgdG8gYXZvaWQgdW5zaWduZWQtPnNpZ25lZCBhbmQgdHJ1bmNhdGlvbiBlcnJvcnMgKi8KKwlpZiAoUS0+dGlja3MgPCBQLT50aWNrcykgcmV0dXJuIC0xOworCXJldHVybiBRLT50aWNrcyAhPSBQLT50aWNrczsgLyogMCBpZiA9PSwgMSBpZiA+ICovCit9CisKK3N0YXRpYyBpbnQgbXVsdF9sdmxfY21wKHZvaWQqIGEsIHZvaWQqIGIpCit7CisJaW50IGksIGNtcF92YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgU09SVF9ERVBUSDsgaSsrKSB7CisJCWNtcF92YWwgPSAoKnNvcnRfZnVuY3Rpb25baV0pKGEsIGIpOworCQlpZiAoY21wX3ZhbCAhPSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpbnZlcnRlZCA/IC1jbXBfdmFsIDogY21wX3ZhbDsKK30KKworc3RhdGljIE5PSU5MSU5FIGludCByZWFkX2NwdV9qaWZmeShGSUxFICpmcCwgamlmZnlfY291bnRzX3QgKnBfamlmKQoreworI2lmICFFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gImNwdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUiOworI2Vsc2UKKwlzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJjcCUqcyAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUiOworI2VuZGlmCisJaW50IHJldDsKKworCWlmICghZmdldHMobGluZV9idWYsIExJTkVfQlVGX1NJWkUsIGZwKSB8fCBsaW5lX2J1ZlswXSAhPSAnYycgLyogbm90ICJjcHUiICovKQorCQlyZXR1cm4gMDsKKwlyZXQgPSBzc2NhbmYobGluZV9idWYsIGZtdCwKKwkJCSZwX2ppZi0+dXNyLCAmcF9qaWYtPm5pYywgJnBfamlmLT5zeXMsICZwX2ppZi0+aWRsZSwKKwkJCSZwX2ppZi0+aW93YWl0LCAmcF9qaWYtPmlycSwgJnBfamlmLT5zb2Z0aXJxLAorCQkJJnBfamlmLT5zdGVhbCk7CisJaWYgKHJldCA+PSA0KSB7CisJCXBfamlmLT50b3RhbCA9IHBfamlmLT51c3IgKyBwX2ppZi0+bmljICsgcF9qaWYtPnN5cyArIHBfamlmLT5pZGxlCisJCQkrIHBfamlmLT5pb3dhaXQgKyBwX2ppZi0+aXJxICsgcF9qaWYtPnNvZnRpcnEgKyBwX2ppZi0+c3RlYWw7CisJCS8qIHByb2NwcyAyLnggZG9lcyBub3QgY291bnQgaW93YWl0IGFzIGJ1c3kgdGltZSAqLworCQlwX2ppZi0+YnVzeSA9IHBfamlmLT50b3RhbCAtIHBfamlmLT5pZGxlIC0gcF9qaWYtPmlvd2FpdDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnZXRfamlmZnlfY291bnRzKHZvaWQpCit7CisJRklMRSogZnAgPSB4Zm9wZW5fZm9yX3JlYWQoInN0YXQiKTsKKworCS8qIFdlIG5lZWQgdG8gcGFyc2UgY3VtdWxhdGl2ZSBjb3VudHMgZXZlbiBpZiBTTVAgQ1BVIGRpc3BsYXkgaXMgb24sCisJICogdGhleSBhcmUgdXNlZCB0byBjYWxjdWxhdGUgcGVyIHByb2Nlc3MgQ1BVJSAqLworCXByZXZfamlmID0gY3VyX2ppZjsKKwlpZiAocmVhZF9jcHVfamlmZnkoZnAsICZjdXJfamlmKSA8IDQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZWFkIC9wcm9jL3N0YXQiKTsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorCWZjbG9zZShmcCk7CisJcmV0dXJuOworI2Vsc2UKKwlpZiAoIXNtcF9jcHVfaW5mbykgeworCQlmY2xvc2UoZnApOworCQlyZXR1cm47CisJfQorCisJaWYgKCFudW1fY3B1cykgeworCQkvKiBGaXJzdCB0aW1lIGhlcmUuIEhvdyBtYW55IENQVXM/CisJCSAqIFRoZXJlIHdpbGwgYmUgYXQgbGVhc3QgMSAvcHJvYy9zdGF0IGxpbmUgd2l0aCBjcHUlZAorCQkgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCWNwdV9qaWYgPSB4cmVhbGxvY192ZWN0b3IoY3B1X2ppZiwgMSwgbnVtX2NwdXMpOworCQkJaWYgKHJlYWRfY3B1X2ppZmZ5KGZwLCAmY3B1X2ppZltudW1fY3B1c10pIDw9IDQpCisJCQkJYnJlYWs7CisJCQludW1fY3B1cysrOworCQl9CisJCWlmIChudW1fY3B1cyA9PSAwKSAvKiAvcHJvYy9zdGF0IHdpdGggb25seSAiY3B1IC4uLiIgbGluZT8hICovCisJCQlzbXBfY3B1X2luZm8gPSAwOworCisJCWNwdV9wcmV2X2ppZiA9IHh6YWxsb2Moc2l6ZW9mKGNwdV9wcmV2X2ppZlswXSkgKiBudW1fY3B1cyk7CisKKwkJLyogT3RoZXJ3aXNlIHRoZSBmaXJzdCBwZXIgY3B1IGRpc3BsYXkgc2hvd3MgYWxsIDEwMCUgaWRsZXMgKi8KKwkJdXNsZWVwKDUwMDAwKTsKKwl9IGVsc2UgeyAvKiBOb24gZmlyc3QgdGltZSBpbnZvY2F0aW9uICovCisJCWppZmZ5X2NvdW50c190ICp0bXA7CisJCWludCBpOworCisJCS8qIEZpcnN0IHN3aXRjaCB0aGUgc2FtcGxlIHBvaW50ZXJzOiBubyBuZWVkIHRvIGNvcHkgKi8KKwkJdG1wID0gY3B1X3ByZXZfamlmOworCQljcHVfcHJldl9qaWYgPSBjcHVfamlmOworCQljcHVfamlmID0gdG1wOworCisJCS8qIEdldCB0aGUgbmV3IHNhbXBsZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9jcHVzOyBpKyspCisJCQlyZWFkX2NwdV9qaWZmeShmcCwgJmNwdV9qaWZbaV0pOworCX0KKyNlbmRpZgorCWZjbG9zZShmcCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3N0YXRzKHZvaWQpCit7CisJdG9wX3N0YXR1c190ICpjdXI7CisJcGlkX3QgcGlkOworCWludCBpLCBsYXN0X2ksIG47CisJc3RydWN0IHNhdmVfaGlzdCAqbmV3X2hpc3Q7CisKKwlnZXRfamlmZnlfY291bnRzKCk7CisJdG90YWxfcGNwdSA9IDA7CisJLyogdG90YWxfdnN6ID0gMDsgKi8KKwluZXdfaGlzdCA9IHhtYWxsb2Moc2l6ZW9mKG5ld19oaXN0WzBdKSAqIG50b3ApOworCS8qCisJICogTWFrZSBhIHBhc3MgdGhyb3VnaCB0aGUgZGF0YSB0byBnZXQgc3RhdHMuCisJICovCisJLyogaGlzdF9pdGVyYXRpb25zID0gMDsgKi8KKwlpID0gMDsKKwlmb3IgKG4gPSAwOyBuIDwgbnRvcDsgbisrKSB7CisJCWN1ciA9IHRvcCArIG47CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRpbWUgaW4gY3VyIHByb2Nlc3MuICBUaW1lIGlzIHN1bSBvZiB1c2VyIHRpbWUKKwkJICogYW5kIHN5c3RlbSB0aW1lCisJCSAqLworCQlwaWQgPSBjdXItPnBpZDsKKwkJbmV3X2hpc3Rbbl0udGlja3MgPSBjdXItPnRpY2tzOworCQluZXdfaGlzdFtuXS5waWQgPSBwaWQ7CisKKwkJLyogZmluZCBtYXRjaGluZyBlbnRyeSBmcm9tIHByZXZpb3VzIHBhc3MgKi8KKwkJY3VyLT5wY3B1ID0gMDsKKwkJLyogZG8gbm90IHN0YXJ0IGF0IGluZGV4IDAsIGNvbnRpbnVlIGF0IGxhc3QgdXNlZCBvbmUKKwkJICogKGJyb3VnaHQgaGlzdF9pdGVyYXRpb25zIGZyb20gfjE0MDAwIGRvd24gdG8gMTcyKSAqLworCQlsYXN0X2kgPSBpOworCQlpZiAocHJldl9oaXN0X2NvdW50KSBkbyB7CisJCQlpZiAocHJldl9oaXN0W2ldLnBpZCA9PSBwaWQpIHsKKwkJCQljdXItPnBjcHUgPSBjdXItPnRpY2tzIC0gcHJldl9oaXN0W2ldLnRpY2tzOworCQkJCXRvdGFsX3BjcHUgKz0gY3VyLT5wY3B1OworCQkJCWJyZWFrOworCQkJfQorCQkJaSA9IChpKzEpICUgcHJldl9oaXN0X2NvdW50OworCQkJLyogaGlzdF9pdGVyYXRpb25zKys7ICovCisJCX0gd2hpbGUgKGkgIT0gbGFzdF9pKTsKKwkJLyogdG90YWxfdnN6ICs9IGN1ci0+dnN6OyAqLworCX0KKworCS8qCisJICogU2F2ZSBjdXIgZnJhbWUncyBpbmZvcm1hdGlvbi4KKwkgKi8KKwlmcmVlKHByZXZfaGlzdCk7CisJcHJldl9oaXN0ID0gbmV3X2hpc3Q7CisJcHJldl9oaXN0X2NvdW50ID0gbnRvcDsKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUyAmJiBFTkFCTEVfRkVBVFVSRV9UT1BfREVDSU1BTFMKKy8qIGZvcm1hdHMgNyBjaGFyIHN0cmluZyAoOCB3aXRoIHRlcm1pbmF0aW5nIE5VTCkgKi8KK3N0YXRpYyBjaGFyICpmbXRfMTAwcGVyY2VudF84KGNoYXIgcGJ1Zls4XSwgdW5zaWduZWQgdmFsdWUsIHVuc2lnbmVkIHRvdGFsKQoreworCXVuc2lnbmVkIHQ7CisJaWYgKHZhbHVlID49IHRvdGFsKSB7IC8qIDEwMCUgPyAqLworCQlzdHJjcHkocGJ1ZiwgIiAgMTAwJSAiKTsKKwkJcmV0dXJuIHBidWY7CisJfQorCS8qIGVsc2UgZ2VuZXJhdGUgIiBbTi9zcGFjZV1OLk4lICIgc3RyaW5nICovCisJdmFsdWUgPSAxMDAwICogdmFsdWUgLyB0b3RhbDsKKwl0ID0gdmFsdWUgLyAxMDA7CisJdmFsdWUgPSB2YWx1ZSAlIDEwMDsKKwlwYnVmWzBdID0gJyAnOworCXBidWZbMV0gPSB0ID8gdCArICcwJyA6ICcgJzsKKwlwYnVmWzJdID0gJzAnICsgKHZhbHVlIC8gMTApOworCXBidWZbM10gPSAnLic7CisJcGJ1Zls0XSA9ICcwJyArICh2YWx1ZSAlIDEwKTsKKwlwYnVmWzVdID0gJyUnOworCXBidWZbNl0gPSAnICc7CisJcGJ1Zls3XSA9ICdcMCc7CisJcmV0dXJuIHBidWY7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTCitzdGF0aWMgdm9pZCBkaXNwbGF5X2NwdXMoaW50IHNjcl93aWR0aCwgY2hhciAqc2NyYnVmLCBpbnQgKmxpbmVzX3JlbV9wKQoreworCS8qCisJICogeHh4JSA9IChjdXJfamlmLnh4eCAtIHByZXZfamlmLnh4eCkgLyAoY3VyX2ppZi50b3RhbCAtIHByZXZfamlmLnRvdGFsKSAqIDEwMCUKKwkgKi8KKwl1bnNpZ25lZCB0b3RhbF9kaWZmOworCWppZmZ5X2NvdW50c190ICpwX2ppZiwgKnBfcHJldl9qaWY7CisJaW50IGk7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJaW50IG5fY3B1X2xpbmVzOworIyBlbmRpZgorCisJLyogdXNpbmcgKHVuc2lnbmVkKSBjYXN0cyB0byBtYWtlIG9wZXJhdGlvbnMgY2hlYXBlciAqLworIyBkZWZpbmUgIENBTENfVE9UQUxfRElGRiBkbyB7IFwKKwl0b3RhbF9kaWZmID0gKHVuc2lnbmVkKShwX2ppZi0+dG90YWwgLSBwX3ByZXZfamlmLT50b3RhbCk7IFwKKwlpZiAodG90YWxfZGlmZiA9PSAwKSB0b3RhbF9kaWZmID0gMTsgXAorfSB3aGlsZSAoMCkKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfREVDSU1BTFMKKyMgIGRlZmluZSBDQUxDX1NUQVQoeHh4KSBjaGFyIHh4eFs4XQorIyAgZGVmaW5lIFNIT1dfU1RBVCh4eHgpIGZtdF8xMDBwZXJjZW50XzgoeHh4LCAodW5zaWduZWQpKHBfamlmLT54eHggLSBwX3ByZXZfamlmLT54eHgpLCB0b3RhbF9kaWZmKQorIyAgZGVmaW5lIEZNVCAiJXMiCisjIGVsc2UKKyMgIGRlZmluZSBDQUxDX1NUQVQoeHh4KSB1bnNpZ25lZCB4eHggPSAxMDAgKiAodW5zaWduZWQpKHBfamlmLT54eHggLSBwX3ByZXZfamlmLT54eHgpIC8gdG90YWxfZGlmZgorIyAgZGVmaW5lIFNIT1dfU1RBVCh4eHgpIHh4eAorIyAgZGVmaW5lIEZNVCAiJTR1JSUgIgorIyBlbmRpZgorCisjIGlmICFFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorCXsKKwkJaSA9IDE7CisJCXBfamlmID0gJmN1cl9qaWY7CisJCXBfcHJldl9qaWYgPSAmcHJldl9qaWY7CisjIGVsc2UKKwkvKiBMb29wIHRocnUgQ1BVKHMpICovCisJbl9jcHVfbGluZXMgPSBzbXBfY3B1X2luZm8gPyBudW1fY3B1cyA6IDE7CisJaWYgKG5fY3B1X2xpbmVzID4gKmxpbmVzX3JlbV9wKQorCQluX2NwdV9saW5lcyA9ICpsaW5lc19yZW1fcDsKKworCWZvciAoaSA9IDA7IGkgPCBuX2NwdV9saW5lczsgaSsrKSB7CisJCXBfamlmID0gJmNwdV9qaWZbaV07CisJCXBfcHJldl9qaWYgPSAmY3B1X3ByZXZfamlmW2ldOworIyBlbmRpZgorCQlDQUxDX1RPVEFMX0RJRkY7CisKKwkJeyAvKiBOZWVkIGEgYmxvY2s6IENBTENfU1RBVCBhcmUgZGVjbGFyYXRpb25zICovCisJCQlDQUxDX1NUQVQodXNyKTsKKwkJCUNBTENfU1RBVChzeXMpOworCQkJQ0FMQ19TVEFUKG5pYyk7CisJCQlDQUxDX1NUQVQoaWRsZSk7CisJCQlDQUxDX1NUQVQoaW93YWl0KTsKKwkJCUNBTENfU1RBVChpcnEpOworCQkJQ0FMQ19TVEFUKHNvZnRpcnEpOworCQkJLypDQUxDX1NUQVQoc3RlYWwpOyovCisKKwkJCXNucHJpbnRmKHNjcmJ1Ziwgc2NyX3dpZHRoLAorCQkJCS8qIEJhcmVseSBmaXRzIGluIDc5IGNoYXJzIHdoZW4gaW4gImRlY2ltYWxzIiBtb2RlLiAqLworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorCQkJCSJDUFUlczoiRk1UInVzciJGTVQic3lzIkZNVCJuaWMiRk1UImlkbGUiRk1UImlvIkZNVCJpcnEiRk1UInNpcnEiLAorCQkJCShzbXBfY3B1X2luZm8gPyB1dG9hKGkpIDogIiIpLAorIyBlbHNlCisJCQkJIkNQVToiRk1UInVzciJGTVQic3lzIkZNVCJuaWMiRk1UImlkbGUiRk1UImlvIkZNVCJpcnEiRk1UInNpcnEiLAorIyBlbmRpZgorCQkJCVNIT1dfU1RBVCh1c3IpLCBTSE9XX1NUQVQoc3lzKSwgU0hPV19TVEFUKG5pYyksIFNIT1dfU1RBVChpZGxlKSwKKwkJCQlTSE9XX1NUQVQoaW93YWl0KSwgU0hPV19TVEFUKGlycSksIFNIT1dfU1RBVChzb2Z0aXJxKQorCQkJCS8qLCBTSE9XX1NUQVQoc3RlYWwpIC0gd2hhdCBpcyB0aGlzICdzdGVhbCcgdGhpbmc/ICovCisJCQkJLyogSSBkb3VidCBhbnlvbmUgd2FudHMgdG8ga25vdyBpdCAqLworCQkJKTsKKwkJCXB1dHMoc2NyYnVmKTsKKwkJfQorCX0KKyMgdW5kZWYgU0hPV19TVEFUCisjIHVuZGVmIENBTENfU1RBVAorIyB1bmRlZiBGTVQKKwkqbGluZXNfcmVtX3AgLT0gaTsKK30KKyNlbHNlICAvKiAhRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMgKi8KKyMgZGVmaW5lIGRpc3BsYXlfY3B1cyhzY3Jfd2lkdGgsIHNjcmJ1ZiwgbGluZXNfcmVtKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXNwbGF5X2hlYWRlcihpbnQgc2NyX3dpZHRoLCBpbnQgKmxpbmVzX3JlbV9wKQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmWzgwXTsKKwljaGFyIHNjcmJ1Zls4MF07CisJdW5zaWduZWQgbG9uZyB0b3RhbCwgdXNlZCwgbWZyZWUsIHNoYXJlZCwgYnVmZmVycywgY2FjaGVkOworCisJLyogcmVhZCBtZW1vcnkgaW5mbyAqLworCWZwID0geGZvcGVuX2Zvcl9yZWFkKCJtZW1pbmZvIik7CisKKwkvKgorCSAqIE9sZCBrZXJuZWxzIChzdWNoIGFzIDIuNC54KSBoYWQgYSBuaWNlIHN1bW1hcnkgb2YgbWVtb3J5IGluZm8gdGhhdAorCSAqIHdlIGNvdWxkIHBhcnNlLCBob3dldmVyIHRoaXMgaXMgZ29uZSBlbnRpcmVseSBpbiAyLjYuIFRyeSBwYXJzaW5nCisJICogdGhlIG9sZCB3YXkgZmlyc3QsIGFuZCBpZiB0aGF0IGZhaWxzLCBwYXJzZSBlYWNoIGZpZWxkIG1hbnVhbGx5LgorCSAqCisJICogRmlyc3QsIHdlIHJlYWQgaW4gdGhlIGZpcnN0IGxpbmUuIE9sZCBrZXJuZWxzIHdpbGwgaGF2ZSBib2d1cworCSAqIHN0cmluZ3Mgd2UgZG9uJ3QgY2FyZSBhYm91dCwgd2hlcmVhcyBuZXcga2VybmVscyB3aWxsIHN0YXJ0IHJpZ2h0CisJICogb3V0IHdpdGggTWVtVG90YWw6CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBQRk0uCisJICovCisJaWYgKGZzY2FuZihmcCwgIk1lbVRvdGFsOiAlbHUgJXNcbiIsICZ0b3RhbCwgYnVmKSAhPSAyKSB7CisJCWZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKTsgICAgLyogc2tpcCBmaXJzdCBsaW5lICovCisKKwkJZnNjYW5mKGZwLCAiTWVtOiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSIsCisJCQkmdG90YWwsICZ1c2VkLCAmbWZyZWUsICZzaGFyZWQsICZidWZmZXJzLCAmY2FjaGVkKTsKKwkJLyogY29udmVydCB0byBraWxvYnl0ZXMgKi8KKwkJdXNlZCAvPSAxMDI0OworCQltZnJlZSAvPSAxMDI0OworCQlzaGFyZWQgLz0gMTAyNDsKKwkJYnVmZmVycyAvPSAxMDI0OworCQljYWNoZWQgLz0gMTAyNDsKKwkJdG90YWwgLz0gMTAyNDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBSZXZlcnQgdG8gbWFudWFsIHBhcnNpbmcsIHdoaWNoIGluY2lkZW50YWxseSBhbHJlYWR5IGhhcyB0aGUKKwkJICogc2l6ZXMgaW4ga2lsb2J5dGVzLiBUaGlzIHNob3VsZCBiZSBzYWZlIGZvciBib3RoIDIuNCBhbmQKKwkJICogMi42LgorCQkgKi8KKwkJZnNjYW5mKGZwLCAiTWVtRnJlZTogJWx1ICVzXG4iLCAmbWZyZWUsIGJ1Zik7CisKKwkJLyoKKwkJICogTWVtU2hhcmVkOiBpcyBubyBsb25nZXIgcHJlc2VudCBpbiAyLjYuIFJlcG9ydCB0aGlzIGFzIDAsCisJCSAqIHRvIG1haW50YWluIGNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCBub3JtYWwgcHJvY3BzLgorCQkgKi8KKwkJaWYgKGZzY2FuZihmcCwgIk1lbVNoYXJlZDogJWx1ICVzXG4iLCAmc2hhcmVkLCBidWYpICE9IDIpCisJCQlzaGFyZWQgPSAwOworCisJCWZzY2FuZihmcCwgIkJ1ZmZlcnM6ICVsdSAlc1xuIiwgJmJ1ZmZlcnMsIGJ1Zik7CisJCWZzY2FuZihmcCwgIkNhY2hlZDogJWx1ICVzXG4iLCAmY2FjaGVkLCBidWYpOworCisJCXVzZWQgPSB0b3RhbCAtIG1mcmVlOworCX0KKwlmY2xvc2UoZnApOworCisJLyogb3V0cHV0IG1lbW9yeSBpbmZvICovCisJaWYgKHNjcl93aWR0aCA+IChpbnQpc2l6ZW9mKHNjcmJ1ZikpCisJCXNjcl93aWR0aCA9IHNpemVvZihzY3JidWYpOworCXNucHJpbnRmKHNjcmJ1Ziwgc2NyX3dpZHRoLAorCQkiTWVtOiAlbHVLIHVzZWQsICVsdUsgZnJlZSwgJWx1SyBzaHJkLCAlbHVLIGJ1ZmYsICVsdUsgY2FjaGVkIiwKKwkJdXNlZCwgbWZyZWUsIHNoYXJlZCwgYnVmZmVycywgY2FjaGVkKTsKKwkvKiBnbyB0byB0b3AgJiBjbGVhciB0byB0aGUgZW5kIG9mIHNjcmVlbiAqLworCXByaW50ZihPUFRfQkFUQ0hfTU9ERSA/ICIlc1xuIiA6ICJcMDMzW0hcMDMzW0olc1xuIiwgc2NyYnVmKTsKKwkoKmxpbmVzX3JlbV9wKS0tOworCisJLyogRGlzcGxheSBDUFUgdGltZSBzcGxpdCBhcyBwZXJjZW50YWdlIG9mIHRvdGFsIHRpbWUKKwkgKiBUaGlzIGRpc3BsYXlzIGVpdGhlciBhIGN1bXVsYXRpdmUgbGluZSBvciBvbmUgbGluZSBwZXIgQ1BVCisJICovCisJZGlzcGxheV9jcHVzKHNjcl93aWR0aCwgc2NyYnVmLCBsaW5lc19yZW1fcCk7CisKKwkvKiByZWFkIGxvYWQgYXZlcmFnZSBhcyBhIHN0cmluZyAqLworCWJ1ZlswXSA9ICdcMCc7CisJb3Blbl9yZWFkX2Nsb3NlKCJsb2FkYXZnIiwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOworCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1xuJzsKKwkqc3RyY2hyKGJ1ZiwgJ1xuJykgPSAnXDAnOworCXNucHJpbnRmKHNjcmJ1Ziwgc2NyX3dpZHRoLCAiTG9hZCBhdmVyYWdlOiAlcyIsIGJ1Zik7CisJcHV0cyhzY3JidWYpOworCSgqbGluZXNfcmVtX3ApLS07CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyBOT0lOTElORSB2b2lkIGRpc3BsYXlfcHJvY2Vzc19saXN0KGludCBsaW5lc19yZW0sIGludCBzY3Jfd2lkdGgpCit7CisJZW51bSB7CisJCUJJVFNfUEVSX0lOVCA9IHNpemVvZihpbnQpICogOAorCX07CisKKwl0b3Bfc3RhdHVzX3QgKnM7CisJY2hhciB2c3pfc3RyX2J1Zls4XTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX21lbW9yeSA9IGRpc3BsYXlfaGVhZGVyKHNjcl93aWR0aCwgJmxpbmVzX3JlbSk7IC8qIG9yIHVzZSB0b3RhbF92c3o/ICovCisJLyogeHh4X3NoaWZ0IGFuZCB4eHhfc2NhbGUgdmFyaWFibGVzIGFsbG93IHVzIHRvIHJlcGxhY2UKKwkgKiBleHBlbnNpdmUgZGl2aWRlcyB3aXRoIG11bHRpcGx5IGFuZCBzaGlmdCAqLworCXVuc2lnbmVkIHBtZW1fc2hpZnQsIHBtZW1fc2NhbGUsIHBtZW1faGFsZjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwl1bnNpZ25lZCB0bXBfdW5zaWduZWQ7CisJdW5zaWduZWQgcGNwdV9zaGlmdCwgcGNwdV9zY2FsZSwgcGNwdV9oYWxmOworCXVuc2lnbmVkIGJ1c3lfamlmczsKKyNlbmRpZgorCisJLyogd2hhdCBpbmZvIG9mIHRoZSBwcm9jZXNzZXMgaXMgc2hvd24gKi8KKwlwcmludGYoT1BUX0JBVENIX01PREUgPyAiJS4qcyIgOiAiXDAzM1s3bSUuKnNcMDMzWzBtIiwgc2NyX3dpZHRoLAorCQkiICBQSUQgIFBQSUQgVVNFUiAgICAgU1RBVCAgIFZTWiAlVlNaIgorCQlJRl9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUygiIENQVSIpCisJCUlGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKCIgJUNQVSIpCisJCSIgQ09NTUFORCIpOworCWxpbmVzX3JlbS0tOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTCisjIGRlZmluZSBVUFNDQUxFIDEwMDAKKyMgZGVmaW5lIENBTENfU1RBVChuYW1lLCB2YWwpIGRpdl90IG5hbWUgPSBkaXYoKHZhbCksIDEwKQorIyBkZWZpbmUgU0hPV19TVEFUKG5hbWUpIG5hbWUucXVvdCwgJzAnK25hbWUucmVtCisjIGRlZmluZSBGTVQgIiUzdS4lYyIKKyNlbHNlCisjIGRlZmluZSBVUFNDQUxFIDEwMAorIyBkZWZpbmUgQ0FMQ19TVEFUKG5hbWUsIHZhbCkgdW5zaWduZWQgbmFtZSA9ICh2YWwpCisjIGRlZmluZSBTSE9XX1NUQVQobmFtZSkgbmFtZQorIyBkZWZpbmUgRk1UICIlNHUlJSIKKyNlbmRpZgorCS8qCisJICogJVZTWiA9IHMtPnZzei9NZW1Ub3RhbAorCSAqLworCXBtZW1fc2hpZnQgPSBCSVRTX1BFUl9JTlQtMTE7CisJcG1lbV9zY2FsZSA9IFVQU0NBTEUqKDFVPDwoQklUU19QRVJfSU5ULTExKSkgLyB0b3RhbF9tZW1vcnk7CisJLyogcy0+dnN6IGlzIGluIGtiLiB3ZSB3YW50IChzLT52c3ogKiBwbWVtX3NjYWxlKSB0byBuZXZlciBvdmVyZmxvdyAqLworCXdoaWxlIChwbWVtX3NjYWxlID49IDUxMikgeworCQlwbWVtX3NjYWxlIC89IDQ7CisJCXBtZW1fc2hpZnQgLT0gMjsKKwl9CisJcG1lbV9oYWxmID0gKDFVIDw8IHBtZW1fc2hpZnQpIC8gKEVOQUJMRV9GRUFUVVJFX1RPUF9ERUNJTUFMUyA/IDIwIDogMik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJYnVzeV9qaWZzID0gY3VyX2ppZi5idXN5IC0gcHJldl9qaWYuYnVzeTsKKwkvKiBUaGlzIGhhcHBlbnMgaWYgdGhlcmUgd2VyZSBsb3RzIG9mIHNob3J0LWxpdmVkIHByb2Nlc3NlcworCSAqIGJldHdlZW4gdHdvIHRvcCB1cGRhdGVzIChlLmcuIGNvbXBpbGF0aW9uKSAqLworCWlmICh0b3RhbF9wY3B1IDwgYnVzeV9qaWZzKSB0b3RhbF9wY3B1ID0gYnVzeV9qaWZzOworCisJLyoKKwkgKiBDUFUlID0gcy0+cGNwdS9zdW0ocy0+cGNwdSkgKiBidXN5X2NwdV90aWNrcy90b3RhbF9jcHVfdGlja3MKKwkgKiAocGNwdSBpcyBkZWx0YSBvZiBzeXMrdXNlciB0aW1lIGJldHdlZW4gc2FtcGxlcykKKwkgKi8KKwkvKiAoY3VyX2ppZi54eHggLSBwcmV2X2ppZi54eHgpIGFuZCBzLT5wY3B1IGFyZQorCSAqIGluIDAuLn42NDAwMCByYW5nZSAoSFoqdXBkYXRlX2ludGVydmFsKS4KKwkgKiB3ZSBhc3N1bWUgdGhhdCB1bnNpZ25lZCBpcyBhdCBsZWFzdCAzMi1iaXQuCisJICovCisJcGNwdV9zaGlmdCA9IDY7CisJcGNwdV9zY2FsZSA9IFVQU0NBTEUqNjQgKiAodWludDE2X3QpYnVzeV9qaWZzOworCWlmIChwY3B1X3NjYWxlID09IDApCisJCXBjcHVfc2NhbGUgPSAxOworCXdoaWxlIChwY3B1X3NjYWxlIDwgKDFVIDw8IChCSVRTX1BFUl9JTlQtMikpKSB7CisJCXBjcHVfc2NhbGUgKj0gNDsKKwkJcGNwdV9zaGlmdCArPSAyOworCX0KKwl0bXBfdW5zaWduZWQgPSAodWludDE2X3QpKGN1cl9qaWYudG90YWwgLSBwcmV2X2ppZi50b3RhbCkgKiB0b3RhbF9wY3B1OworCWlmICh0bXBfdW5zaWduZWQgIT0gMCkKKwkJcGNwdV9zY2FsZSAvPSB0bXBfdW5zaWduZWQ7CisJLyogd2Ugd2FudCAocy0+cGNwdSAqIHBjcHVfc2NhbGUpIHRvIG5ldmVyIG92ZXJmbG93ICovCisJd2hpbGUgKHBjcHVfc2NhbGUgPj0gMTAyNCkgeworCQlwY3B1X3NjYWxlIC89IDQ7CisJCXBjcHVfc2hpZnQgLT0gMjsKKwl9CisJcGNwdV9oYWxmID0gKDFVIDw8IHBjcHVfc2hpZnQpIC8gKEVOQUJMRV9GRUFUVVJFX1RPUF9ERUNJTUFMUyA/IDIwIDogMik7CisJLyogcHJpbnRmKCIgcG1lbV9zY2FsZT0ldSBwY3B1X3NjYWxlPSV1ICIsIHBtZW1fc2NhbGUsIHBjcHVfc2NhbGUpOyAqLworI2VuZGlmCisKKwkvKiBPaywgYWxsIHByZWxpbWluYXJ5IGRhdGEgaXMgcmVhZHksIGdvIHRocm91Z2ggdGhlIGxpc3QgKi8KKwlzY3Jfd2lkdGggKz0gMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyAnXG4nIGFuZCB0cmFpbGluZyBOVUwgKi8KKwlpZiAobGluZXNfcmVtID4gbnRvcCkKKwkJbGluZXNfcmVtID0gbnRvcDsKKwlzID0gdG9wOworCXdoaWxlICgtLWxpbmVzX3JlbSA+PSAwKSB7CisJCXVuc2lnbmVkIGNvbDsKKwkJQ0FMQ19TVEFUKHBtZW0sIChzLT52c3oqcG1lbV9zY2FsZSArIHBtZW1faGFsZikgPj4gcG1lbV9zaGlmdCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJCUNBTENfU1RBVChwY3B1LCAocy0+cGNwdSpwY3B1X3NjYWxlICsgcGNwdV9oYWxmKSA+PiBwY3B1X3NoaWZ0KTsKKyNlbmRpZgorCisJCWlmIChzLT52c3ogPj0gMTAwMDAwKQorCQkJc3ByaW50Zih2c3pfc3RyX2J1ZiwgIiU2bGRtIiwgcy0+dnN6LzEwMjQpOworCQllbHNlCisJCQlzcHJpbnRmKHZzel9zdHJfYnVmLCAiJTdsZCIsIHMtPnZzeik7CisJCS8qIFBJRCBQUElEIFVTRVIgU1RBVCBWU1ogJVZTWiBbJUNQVV0gQ09NTUFORCAqLworCQljb2wgPSBzbnByaW50ZihsaW5lX2J1Ziwgc2NyX3dpZHRoLAorCQkJCSJcbiIgIiU1dSU2dSAlLTguOHMgJXMlcyIgRk1UCisJCQkJSUZfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MoIiAlM2QiKQorCQkJCUlGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKEZNVCkKKwkJCQkiICIsCisJCQkJcy0+cGlkLCBzLT5wcGlkLCBnZXRfY2FjaGVkX3VzZXJuYW1lKHMtPnVpZCksCisJCQkJcy0+c3RhdGUsIHZzel9zdHJfYnVmLAorCQkJCVNIT1dfU1RBVChwbWVtKQorCQkJCUlGX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTKCwgcy0+bGFzdF9zZWVuX29uX2NwdSkKKwkJCQlJRl9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSgsIFNIT1dfU1RBVChwY3B1KSkKKwkJKTsKKwkJaWYgKChpbnQpKGNvbCArIDEpIDwgc2NyX3dpZHRoKQorCQkJcmVhZF9jbWRsaW5lKGxpbmVfYnVmICsgY29sLCBzY3Jfd2lkdGggLSBjb2wsIHMtPnBpZCwgcy0+Y29tbSk7CisJCWZwdXRzKGxpbmVfYnVmLCBzdGRvdXQpOworCQkvKiBwcmludGYoIiAlZC8lZCAlbGxkLyVsbGQiLCBzLT5wY3B1LCB0b3RhbF9wY3B1LAorCQkJY3VyX2ppZi5idXN5IC0gcHJldl9qaWYuYnVzeSwgY3VyX2ppZi50b3RhbCAtIHByZXZfamlmLnRvdGFsKTsgKi8KKwkJcysrOworCX0KKwkvKiBwcmludGYoIiAlZCIsIGhpc3RfaXRlcmF0aW9ucyk7ICovCisJYmJfcHV0Y2hhcihPUFRfQkFUQ0hfTU9ERSA/ICdcbicgOiAnXHInKTsKKwlmZmx1c2hfYWxsKCk7Cit9CisjdW5kZWYgVVBTQ0FMRQorI3VuZGVmIFNIT1dfU1RBVAorI3VuZGVmIENBTENfU1RBVAorI3VuZGVmIEZNVAorCitzdGF0aWMgdm9pZCBjbGVhcm1lbXModm9pZCkKK3sKKwljbGVhcl91c2VybmFtZV9jYWNoZSgpOworCWZyZWUodG9wKTsKKwl0b3AgPSBOVUxMOworCW50b3AgPSAwOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKworc3RhdGljIHZvaWQgcmVzZXRfdGVybSh2b2lkKQoreworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZpbml0aWFsX3NldHRpbmdzKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xlYXJtZW1zKCk7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCQlmcmVlKHByZXZfaGlzdCk7CisjIGVuZGlmCisJfQorfQorCitzdGF0aWMgdm9pZCBzaWdfY2F0Y2hlcihpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXNldF90ZXJtKCk7CisJX2V4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfVVNFX1RFUk1JT1MgKi8KKworLyoKKyAqIFRPUE1FTSBzdXBwb3J0CisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG1lbV90OworCit0eXBlZGVmIHN0cnVjdCB0b3BtZW1fc3RhdHVzX3QgeworCXVuc2lnbmVkIHBpZDsKKwljaGFyIGNvbW1bQ09NTV9MRU5dOworCS8qIHZzeiBkb2Vzbid0IGNvdW50IC9kZXYveHh4IG1hcHBpbmdzIGV4Y2VwdCAvZGV2L3plcm8gKi8KKwltZW1fdCB2c3ogICAgIDsKKwltZW1fdCB2c3pydyAgIDsKKwltZW1fdCByc3MgICAgIDsKKwltZW1fdCByc3Nfc2ggIDsKKwltZW1fdCBkaXJ0eSAgIDsKKwltZW1fdCBkaXJ0eV9zaDsKKwltZW1fdCBzdGFjayAgIDsKK30gdG9wbWVtX3N0YXR1c190OworCitlbnVtIHsgTlVNX1NPUlRfRklFTEQgPSA3IH07CisKKyNkZWZpbmUgdG9wbWVtICgodG9wbWVtX3N0YXR1c190Kil0b3ApCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKworc3RhdGljIGludCB0b3BtZW1fc29ydChjaGFyICphLCBjaGFyICpiKQoreworCWludCBuOworCW1lbV90IGwsIHI7CisKKwluID0gb2Zmc2V0b2YodG9wbWVtX3N0YXR1c190LCB2c3opICsgKHNvcnRfZmllbGQgKiBzaXplb2YobWVtX3QpKTsKKwlsID0gKihtZW1fdCopKGEgKyBuKTsKKwlyID0gKihtZW1fdCopKGIgKyBuKTsKKwlpZiAobCA9PSByKSB7CisJCWwgPSAoKHRvcG1lbV9zdGF0dXNfdCopYSktPmRpcnR5OworCQlyID0gKCh0b3BtZW1fc3RhdHVzX3QqKWIpLT5kaXJ0eTsKKwl9CisJLyogV2Ugd2FudCB0byBhdm9pZCB1bnNpZ25lZC0+c2lnbmVkIGFuZCB0cnVuY2F0aW9uIGVycm9ycyAqLworCS8qIGw+cjogLTEsIGw9cjogMCwgbDxyOiAxICovCisJbiA9IChsID4gcikgPyAtMSA6IChsICE9IHIpOworCXJldHVybiBpbnZlcnRlZCA/IC1uIDogbjsKK30KKworLyogZGlzcGxheSBoZWFkZXIgaW5mbyAobWVtaW5mbyAvIGxvYWRhdmcpICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X3RvcG1lbV9oZWFkZXIoaW50IHNjcl93aWR0aCwgaW50ICpsaW5lc19yZW1fcCkKK3sKKwllbnVtIHsKKwkJVE9UQUwgPSAwLCBNRlJFRSwgQlVGLCBDQUNIRSwKKwkJU1dBUFRPVEFMLCBTV0FQRlJFRSwgRElSVFksCisJCU1XUklURSwgQU5PTiwgTUFQLCBTTEFCLAorCQlOVU1fRklFTERTCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciBtYXRjaFtOVU1fRklFTERTXVsxMl0gPSB7CisJCSJceDA5IiAiTWVtVG90YWw6IiwgIC8vIFRPVEFMCisJCSJceDA4IiAiTWVtRnJlZToiLCAgIC8vIE1GUkVFCisJCSJceDA4IiAiQnVmZmVyczoiLCAgIC8vIEJVRgorCQkiXHgwNyIgIkNhY2hlZDoiLCAgICAvLyBDQUNIRQorCQkiXHgwYSIgIlN3YXBUb3RhbDoiLCAvLyBTV0FQVE9UQUwKKwkJIlx4MDkiICJTd2FwRnJlZToiLCAgLy8gU1dBUEZSRUUKKwkJIlx4MDYiICJEaXJ0eToiLCAgICAgLy8gRElSVFkKKwkJIlx4MGEiICJXcml0ZWJhY2s6IiwgLy8gTVdSSVRFCisJCSJceDBhIiAiQW5vblBhZ2VzOiIsIC8vIEFOT04KKwkJIlx4MDciICJNYXBwZWQ6IiwgICAgLy8gTUFQCisJCSJceDA1IiAiU2xhYjoiLCAgICAgIC8vIFNMQUIKKwl9OworCWNoYXIgbWVtaW5mb19idWZbNCAqIDEwMjRdOworCWNvbnN0IGNoYXIgKlpbTlVNX0ZJRUxEU107CisJdW5zaWduZWQgaTsKKwlpbnQgc3o7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZJRUxEUzsgaSsrKQorCQlaW2ldID0gIj8iOworCisJLyogcmVhZCBtZW1vcnkgaW5mbyAqLworCXN6ID0gb3Blbl9yZWFkX2Nsb3NlKCJtZW1pbmZvIiwgbWVtaW5mb19idWYsIHNpemVvZihtZW1pbmZvX2J1ZikgLSAxKTsKKwlpZiAoc3ogPj0gMCkgeworCQljaGFyICpwID0gbWVtaW5mb19idWY7CisJCW1lbWluZm9fYnVmW3N6XSA9ICdcMCc7CisJCS8qIE5vdGUgdGhhdCBmaWVsZHMgYWx3YXlzIGFwcGVhciBpbiB0aGUgbWF0Y2hbXSBvcmRlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZJRUxEUzsgaSsrKSB7CisJCQljaGFyICpmb3VuZCA9IHN0cnN0cihwLCBtYXRjaFtpXSArIDEpOworCQkJaWYgKGZvdW5kKSB7CisJCQkJLyogQ3V0ICJOTk5OIiBvdXQgb2YgIiAgICBOTk5OIGtiIiAqLworCQkJCWNoYXIgKnMgPSBza2lwX3doaXRlc3BhY2UoZm91bmQgKyBtYXRjaFtpXVswXSk7CisJCQkJcCA9IHNraXBfbm9uX3doaXRlc3BhY2Uocyk7CisJCQkJKnArKyA9ICdcMCc7CisJCQkJWltpXSA9IHM7CisJCQl9CisJCX0KKwl9CisKKwlzbnByaW50ZihsaW5lX2J1ZiwgTElORV9CVUZfU0laRSwKKwkJIk1lbSB0b3RhbDolcyBhbm9uOiVzIG1hcDolcyBmcmVlOiVzIiwKKwkJWltUT1RBTF0sIFpbQU5PTl0sIFpbTUFQXSwgWltNRlJFRV0pOworCXByaW50ZihPUFRfQkFUQ0hfTU9ERSA/ICIlLipzXG4iIDogIlwwMzNbSFwwMzNbSiUuKnNcbiIsIHNjcl93aWR0aCwgbGluZV9idWYpOworCisJc25wcmludGYobGluZV9idWYsIExJTkVfQlVGX1NJWkUsCisJCSIgc2xhYjolcyBidWY6JXMgY2FjaGU6JXMgZGlydHk6JXMgd3JpdGU6JXMiLAorCQlaW1NMQUJdLCBaW0JVRl0sIFpbQ0FDSEVdLCBaW0RJUlRZXSwgWltNV1JJVEVdKTsKKwlwcmludGYoIiUuKnNcbiIsIHNjcl93aWR0aCwgbGluZV9idWYpOworCisJc25wcmludGYobGluZV9idWYsIExJTkVfQlVGX1NJWkUsCisJCSJTd2FwIHRvdGFsOiVzIGZyZWU6JXMiLCAvLyBUT0RPOiAlIHVzZWQ/CisJCVpbU1dBUFRPVEFMXSwgWltTV0FQRlJFRV0pOworCXByaW50ZigiJS4qc1xuIiwgc2NyX3dpZHRoLCBsaW5lX2J1Zik7CisKKwkoKmxpbmVzX3JlbV9wKSAtPSAzOworfQorCitzdGF0aWMgdm9pZCB1bGx0b2E2X2FuZF9zcGFjZSh1bnNpZ25lZCBsb25nIGxvbmcgdWwsIGNoYXIgYnVmWzZdKQoreworCS8qIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RlcmEgKi8KKwlzbWFydF91bGx0b2E1KHVsLCBidWYsICIgbWd0cGV6eSIpOworCWJ1Zls1XSA9ICcgJzsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZGlzcGxheV90b3BtZW1fcHJvY2Vzc19saXN0KGludCBsaW5lc19yZW0sIGludCBzY3Jfd2lkdGgpCit7CisjZGVmaW5lIEhEUl9TVFIgIiAgUElEICAgVlNaIFZTWlJXICAgUlNTIChTSFIpIERJUlRZIChTSFIpIFNUQUNLIgorI2RlZmluZSBNSU5fV0lEVEggc2l6ZW9mKEhEUl9TVFIpCisJY29uc3QgdG9wbWVtX3N0YXR1c190ICpzID0gdG9wbWVtOworCisJZGlzcGxheV90b3BtZW1faGVhZGVyKHNjcl93aWR0aCwgJmxpbmVzX3JlbSk7CisJc3RyY3B5KGxpbmVfYnVmLCBIRFJfU1RSICIgQ09NTUFORCIpOworCWxpbmVfYnVmWzExICsgc29ydF9maWVsZCAqIDZdID0gIl5fIltpbnZlcnRlZF07CisJcHJpbnRmKE9QVF9CQVRDSF9NT0RFID8gIiUuKnMiIDogIlxlWzdtJS4qc1xlWzBtIiwgc2NyX3dpZHRoLCBsaW5lX2J1Zik7CisJbGluZXNfcmVtLS07CisKKwlpZiAobGluZXNfcmVtID4gbnRvcCkKKwkJbGluZXNfcmVtID0gbnRvcDsKKwl3aGlsZSAoLS1saW5lc19yZW0gPj0gMCkgeworCQkvKiBQSUQgVlNaIFZTWlJXIFJTUyAoU0hSKSBESVJUWSAoU0hSKSBDT01NQU5EICovCisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnBpZCAgICAgLCAmbGluZV9idWZbMCo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnZzeiAgICAgLCAmbGluZV9idWZbMSo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnZzenJ3ICAgLCAmbGluZV9idWZbMio2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnJzcyAgICAgLCAmbGluZV9idWZbMyo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnJzc19zaCAgLCAmbGluZV9idWZbNCo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPmRpcnR5ICAgLCAmbGluZV9idWZbNSo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPmRpcnR5X3NoLCAmbGluZV9idWZbNio2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnN0YWNrICAgLCAmbGluZV9idWZbNyo2XSk7CisJCWxpbmVfYnVmWzgqNl0gPSAnXDAnOworCQlpZiAoc2NyX3dpZHRoID4gKGludClNSU5fV0lEVEgpIHsKKwkJCXJlYWRfY21kbGluZSgmbGluZV9idWZbOCo2XSwgc2NyX3dpZHRoIC0gTUlOX1dJRFRILCBzLT5waWQsIHMtPmNvbW0pOworCQl9CisJCXByaW50ZigiXG4iIiUuKnMiLCBzY3Jfd2lkdGgsIGxpbmVfYnVmKTsKKwkJcysrOworCX0KKwliYl9wdXRjaGFyKE9QVF9CQVRDSF9NT0RFID8gJ1xuJyA6ICdccicpOworCWZmbHVzaF9hbGwoKTsKKyN1bmRlZiBIRFJfU1RSCisjdW5kZWYgTUlOX1dJRFRICit9CisKKyNlbHNlCit2b2lkIGRpc3BsYXlfdG9wbWVtX3Byb2Nlc3NfbGlzdChpbnQgbGluZXNfcmVtLCBpbnQgc2NyX3dpZHRoKTsKK2ludCB0b3BtZW1fc29ydChjaGFyICphLCBjaGFyICpiKTsKKyNlbmRpZiAvKiBUT1BNRU0gKi8KKworLyoKKyAqIGVuZCBUT1BNRU0gc3VwcG9ydAorICovCisKK2VudW0geworCVRPUF9NQVNLID0gMAorCQl8IFBTU0NBTl9QSUQKKwkJfCBQU1NDQU5fUFBJRAorCQl8IFBTU0NBTl9WU1oKKwkJfCBQU1NDQU5fU1RJTUUKKwkJfCBQU1NDQU5fVVRJTUUKKwkJfCBQU1NDQU5fU1RBVEUKKwkJfCBQU1NDQU5fQ09NTQorCQl8IFBTU0NBTl9DUFUKKwkJfCBQU1NDQU5fVUlER0lELAorCVRPUE1FTV9NQVNLID0gMAorCQl8IFBTU0NBTl9QSUQKKwkJfCBQU1NDQU5fU01BUFMKKwkJfCBQU1NDQU5fQ09NTSwKKwlFWElUX01BU0sgPSAodW5zaWduZWQpLTEsCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKK3N0YXRpYyB1bnNpZ25lZCBoYW5kbGVfaW5wdXQodW5zaWduZWQgc2Nhbl9tYXNrLCB1bnNpZ25lZCBpbnRlcnZhbCkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJc3RydWN0IHBvbGxmZCBwZmRbMV07CisKKwlwZmRbMF0uZmQgPSAwOworCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisKKwl3aGlsZSAoMSkgeworCQlpZiAoc2FmZV9wb2xsKHBmZCwgMSwgaW50ZXJ2YWwgKiAxMDAwKSA8PSAwKQorCQkJcmV0dXJuIHNjYW5fbWFzazsKKwkJaW50ZXJ2YWwgPSAwOworCisJCWlmIChzYWZlX3JlYWQoU1RESU5fRklMRU5PLCAmYywgMSkgIT0gMSkgeyAvKiBlcnJvci9FT0Y/ICovCisJCQlvcHRpb25fbWFzazMyIHw9IE9QVF9FT0Y7CisJCQlyZXR1cm4gc2Nhbl9tYXNrOworCQl9CisKKwkJaWYgKGMgPT0gaW5pdGlhbF9zZXR0aW5ncy5jX2NjW1ZJTlRSXSkKKwkJCXJldHVybiBFWElUX01BU0s7CisJCWlmIChjID09IGluaXRpYWxfc2V0dGluZ3MuY19jY1tWRU9GXSkKKwkJCXJldHVybiBFWElUX01BU0s7CisJCWMgfD0gMHgyMDsgLyogbG93ZXJjYXNlICovCisJCWlmIChjID09ICdxJykKKwkJCXJldHVybiBFWElUX01BU0s7CisKKwkJaWYgKGMgPT0gJ24nKSB7CisJCQlJRl9GRUFUVVJFX1RPUE1FTShzY2FuX21hc2sgPSBUT1BfTUFTSzspCisJCQlzb3J0X2Z1bmN0aW9uWzBdID0gcGlkX3NvcnQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnbScpIHsKKwkJCUlGX0ZFQVRVUkVfVE9QTUVNKHNjYW5fbWFzayA9IFRPUF9NQVNLOykKKwkJCXNvcnRfZnVuY3Rpb25bMF0gPSBtZW1fc29ydDsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJCQlzb3J0X2Z1bmN0aW9uWzFdID0gcGNwdV9zb3J0OworCQkJc29ydF9mdW5jdGlvblsyXSA9IHRpbWVfc29ydDsKKyMgZW5kaWYKKwkJCWNvbnRpbnVlOworCQl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworCQlpZiAoYyA9PSAnaCcKKwkJIElGX0ZFQVRVUkVfVE9QTUVNKCYmIHNjYW5fbWFzayAhPSBUT1BNRU1fTUFTSykKKwkJKSB7CisJCQlzY2FuX21hc2sgXj0gUFNTQ0FOX1RBU0tTOworCQkJY29udGludWU7CisJCX0KKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJCWlmIChjID09ICdwJykgeworCQkJSUZfRkVBVFVSRV9UT1BNRU0oc2Nhbl9tYXNrID0gVE9QX01BU0s7KQorCQkJc29ydF9mdW5jdGlvblswXSA9IHBjcHVfc29ydDsKKwkJCXNvcnRfZnVuY3Rpb25bMV0gPSBtZW1fc29ydDsKKwkJCXNvcnRfZnVuY3Rpb25bMl0gPSB0aW1lX3NvcnQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAndCcpIHsKKwkJCUlGX0ZFQVRVUkVfVE9QTUVNKHNjYW5fbWFzayA9IFRPUF9NQVNLOykKKwkJCXNvcnRfZnVuY3Rpb25bMF0gPSB0aW1lX3NvcnQ7CisJCQlzb3J0X2Z1bmN0aW9uWzFdID0gbWVtX3NvcnQ7CisJCQlzb3J0X2Z1bmN0aW9uWzJdID0gcGNwdV9zb3J0OworCQkJY29udGludWU7CisJCX0KKyMgIGlmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCQlpZiAoYyA9PSAncycpIHsKKwkJCXNjYW5fbWFzayA9IFRPUE1FTV9NQVNLOworCQkJZnJlZShwcmV2X2hpc3QpOworCQkJcHJldl9oaXN0ID0gTlVMTDsKKwkJCXByZXZfaGlzdF9jb3VudCA9IDA7CisJCQlzb3J0X2ZpZWxkID0gKHNvcnRfZmllbGQgKyAxKSAlIE5VTV9TT1JUX0ZJRUxEOworCQkJY29udGludWU7CisJCX0KKyMgIGVuZGlmCisJCWlmIChjID09ICdyJykgeworCQkJaW52ZXJ0ZWQgXj0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisjICBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorCQkvKiBwcm9jcHMtMi4wLjE4IHVzZXMgJ0MnLCAzLjIuNyB1c2VzICcxJyAqLworCQlpZiAoYyA9PSAnYycgfHwgYyA9PSAnMScpIHsKKwkJCS8qIFVzZXIgd2FudHMgdG8gdG9nZ2xlIHBlciBjcHUgPD4gYWdncmVnYXRlICovCisJCQlpZiAoc21wX2NwdV9pbmZvKSB7CisJCQkJZnJlZShjcHVfcHJldl9qaWYpOworCQkJCWZyZWUoY3B1X2ppZik7CisJCQkJY3B1X2ppZiA9ICZjdXJfamlmOworCQkJCWNwdV9wcmV2X2ppZiA9ICZwcmV2X2ppZjsKKwkJCX0gZWxzZSB7CisJCQkJLyogUHJlcGFyZSBmb3IgeHJlYWxsb2MoKSAqLworCQkJCWNwdV9qaWYgPSBjcHVfcHJldl9qaWYgPSBOVUxMOworCQkJfQorCQkJbnVtX2NwdXMgPSAwOworCQkJc21wX2NwdV9pbmZvID0gIXNtcF9jcHVfaW5mbzsKKwkJCWdldF9qaWZmeV9jb3VudHMoKTsKKwkJCWNvbnRpbnVlOworCQl9CisjICBlbmRpZgorIyBlbmRpZgorCQlicmVhazsgLyogdW5rbm93biBrZXkgLT4gZm9yY2UgcmVmcmVzaCAqLworCX0KKworCXJldHVybiBzY2FuX21hc2s7Cit9CisjZW5kaWYKKworLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTIHx8IEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisvL3VzYWdlOiMgZGVmaW5lIElGX1NIT1dfVEhSRUFEU19PUl9UT1BfU01QKC4uLikgX19WQV9BUkdTX18KKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6IyBkZWZpbmUgSUZfU0hPV19USFJFQURTX09SX1RPUF9TTVAoLi4uKQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6I2RlZmluZSB0b3BfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYl0gWy1uQ09VTlRdIFstZFNFQ09ORFNdIiBJRl9GRUFUVVJFX1RPUE1FTSgiIFstbV0iKQorLy91c2FnZTojZGVmaW5lIHRvcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByb3ZpZGUgYSB2aWV3IG9mIHByb2Nlc3MgYWN0aXZpdHkgaW4gcmVhbCB0aW1lLiIKKy8vdXNhZ2U6ICAgIlxuIiJSZWFkIHRoZSBzdGF0dXMgb2YgYWxsIHByb2Nlc3NlcyBmcm9tIC9wcm9jIGVhY2ggU0VDT05EUyIKKy8vdXNhZ2U6ICAgIlxuIiJhbmQgZGlzcGxheSBhIHNjcmVlbmZ1bCBvZiB0aGVtLiIKKy8vdXNhZ2U6ICAgIlxuIiJLZXlzOiIKKy8vdXNhZ2U6ICAgIlxuIiIJTi9NIgorLy91c2FnZTogICAgICAgICAgICAgICAgSUZfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UoIi9QIikKKy8vdXNhZ2U6ICAgICAgICAgICAgICAgIElGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKCIvVCIpCisvL3VzYWdlOiAgICAgICAgICAgIjogIiBJRl9GRUFUVVJFX1RPUE1FTSgic2hvdyBDUFUgdXNhZ2UsICIpICJzb3J0IGJ5IHBpZC9tZW0iCisvL3VzYWdlOiAgICAgICAgICAgICAgICBJRl9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSgiL2NwdSIpCisvL3VzYWdlOiAgICAgICAgICAgICAgICBJRl9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSgiL3RpbWUiKQorLy91c2FnZToJSUZfRkVBVFVSRV9UT1BNRU0oCisvL3VzYWdlOiAgICJcbiIiCVM6IHNob3cgbWVtb3J5IgorLy91c2FnZToJKQorLy91c2FnZTogICAiXG4iIglSOiByZXZlcnNlIHNvcnQiCisvL3VzYWdlOglJRl9TSE9XX1RIUkVBRFNfT1JfVE9QX1NNUCgKKy8vdXNhZ2U6ICAgIlxuIiIJIgorLy91c2FnZTogICAgICAgICAgICAgICAgSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFMoIkg6IHRvZ2dsZSB0aHJlYWRzIikKKy8vdXNhZ2U6ICAgICAgICAgICAgICAgIElGX0ZFQVRVUkVfU0hPV19USFJFQURTKElGX0ZFQVRVUkVfVE9QX1NNUF9DUFUoIiwgIikpCisvL3VzYWdlOiAgICAgICAgICAgICAgICBJRl9GRUFUVVJFX1RPUF9TTVBfQ1BVKCIxOiB0b2dnbGUgU01QIikKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgIlxuIiIJUSxeQzogZXhpdCIKKy8vdXNhZ2U6ICAgIlxuIgorLy91c2FnZTogICAiXG4iIk9wdGlvbnM6IgorLy91c2FnZTogICAiXG4iIgktYglCYXRjaCBtb2RlIgorLy91c2FnZTogICAiXG4iIgktbiBOCUV4aXQgYWZ0ZXIgTiBpdGVyYXRpb25zIgorLy91c2FnZTogICAiXG4iIgktZCBOCURlbGF5IGJldHdlZW4gdXBkYXRlcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVE9QTUVNKAorLy91c2FnZTogICAiXG4iIgktbQlTYW1lIGFzICdzJyBrZXkiCisvL3VzYWdlOgkpCisKKy8qIEludGVyYWN0aXZlIHRlc3Rpbmc6CisgKiBlY2hvIHNzcyB8IC4vYnVzeWJveCB0b3AKKyAqIC0gc2hvd3MgbWVtb3J5IHNjcmVlbgorICogZWNobyBzc3MgfCAuL2J1c3lib3ggdG9wIC1ibjEgPm1lbQorICogLSBzYXZlcyBtZW1vcnkgc2NyZWVuIC0gdGhlICp3aG9sZSogbGlzdCwgbm90IGZpcnN0IE5ST1dTIHByb2Nlc3NlcyEKKyAqIGVjaG8gLm0ucy5zLnMucy5zLnMucSB8IC4vYnVzeWJveCB0b3AgLWIgPnoKKyAqIC0gc2F2ZXMgc2V2ZXJhbCBkaWZmZXJlbnQgc2NyZWVucywgYW5kIGV4aXRzCisgKgorICogVE9ETzogLWkgU1RSSU5HIHBhcmFtIGFzIGEgYmV0dGVyIGFsdGVybmF0aXZlPworICovCisKK2ludCB0b3BfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRvcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGl0ZXJhdGlvbnM7CisJdW5zaWduZWQgbGluZXMsIGNvbDsKKwl1bnNpZ25lZCBpbnRlcnZhbDsKKwljaGFyICpzdHJfaW50ZXJ2YWwsICpzdHJfaXRlcmF0aW9uczsKKwl1bnNpZ25lZCBzY2FuX21hc2sgPSBUT1BfTUFTSzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXN0cnVjdCB0ZXJtaW9zIG5ld19zZXR0aW5nczsKKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKwlpbnRlcnZhbCA9IDU7IC8qIGRlZmF1bHQgdXBkYXRlIGludGVydmFsIGlzIDUgc2Vjb25kcyAqLworCWl0ZXJhdGlvbnMgPSAwOyAvKiBpbmZpbml0ZSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJLypudW1fY3B1cyA9IDA7Ki8KKwkvKnNtcF9jcHVfaW5mbyA9IDA7Ki8gIC8qIHRvIHN0YXJ0IHdpdGggc2hvdyBhZ2dyZWdhdGUgKi8KKwljcHVfamlmID0gJmN1cl9qaWY7CisJY3B1X3ByZXZfamlmID0gJnByZXZfamlmOworI2VuZGlmCisKKwkvKiBhbGwgYXJncyBhcmUgb3B0aW9uczsgLW4gTlVNICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLSI7IC8qIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCB3L28gZGFzaCAqLworCWNvbCA9IGdldG9wdDMyKGFyZ3YsICJkOm46YiJJRl9GRUFUVVJFX1RPUE1FTSgibSIpLCAmc3RyX2ludGVydmFsLCAmc3RyX2l0ZXJhdGlvbnMpOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCWlmIChjb2wgJiBPUFRfbSkgLyogLW0gKGJ1c3lib3ggc3BlY2lmaWMpICovCisJCXNjYW5fbWFzayA9IFRPUE1FTV9NQVNLOworI2VuZGlmCisJaWYgKGNvbCAmIE9QVF9kKSB7CisJCS8qIHdvcmsgYXJvdW5kIGZvciAiLWQgMSIgLT4gIi1kIC0xIiBkb25lIGJ5IGdldG9wdDMyCisJCSAqIChvcHRfY29tcGxlbWVudGFyeSA9PSAiLSIgZG9lcyB0aGlzKSAqLworCQlpZiAoc3RyX2ludGVydmFsWzBdID09ICctJykKKwkJCXN0cl9pbnRlcnZhbCsrOworCQkvKiBOZWVkIHRvIGxpbWl0IGl0IHRvIG5vdCBvdmVyZmxvdyBwb2xsIHRpbWVvdXQgKi8KKwkJaW50ZXJ2YWwgPSB4YXRvdTE2KHN0cl9pbnRlcnZhbCk7CisJfQorCWlmIChjb2wgJiBPUFRfbikgeworCQlpZiAoc3RyX2l0ZXJhdGlvbnNbMF0gPT0gJy0nKQorCQkJc3RyX2l0ZXJhdGlvbnMrKzsKKwkJaXRlcmF0aW9ucyA9IHhhdG91KHN0cl9pdGVyYXRpb25zKTsKKwl9CisKKwkvKiBjaGFuZ2UgdG8gL3Byb2MgKi8KKwl4Y2hkaXIoIi9wcm9jIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwlzb3J0X2Z1bmN0aW9uWzBdID0gcGNwdV9zb3J0OworCXNvcnRfZnVuY3Rpb25bMV0gPSBtZW1fc29ydDsKKwlzb3J0X2Z1bmN0aW9uWzJdID0gdGltZV9zb3J0OworI2Vsc2UKKwlzb3J0X2Z1bmN0aW9uWzBdID0gbWVtX3NvcnQ7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TCisJdGNnZXRhdHRyKDAsICh2b2lkICopICZpbml0aWFsX3NldHRpbmdzKTsKKwltZW1jcHkoJm5ld19zZXR0aW5ncywgJmluaXRpYWxfc2V0dGluZ3MsIHNpemVvZihuZXdfc2V0dGluZ3MpKTsKKwlpZiAoIU9QVF9CQVRDSF9NT0RFKSB7CisJCS8qIHVuYnVmZmVyZWQgaW5wdXQsIHR1cm4gb2ZmIGVjaG8gKi8KKwkJbmV3X3NldHRpbmdzLmNfbGZsYWcgJj0gfihJU0lHIHwgSUNBTk9OIHwgRUNITyB8IEVDSE9OTCk7CisJCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZuZXdfc2V0dGluZ3MpOworCX0KKworCWJiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgc2lnX2NhdGNoZXIpOworCisJLyogRWF0IGluaXRpYWwgaW5wdXQsIGlmIGFueSAqLworCXNjYW5fbWFzayA9IGhhbmRsZV9pbnB1dChzY2FuX21hc2ssIDApOworI2VuZGlmCisKKwl3aGlsZSAoc2Nhbl9tYXNrICE9IEVYSVRfTUFTSykgeworCQlwcm9jcHNfc3RhdHVzX3QgKnAgPSBOVUxMOworCisJCWlmIChPUFRfQkFUQ0hfTU9ERSkgeworCQkJbGluZXMgPSBJTlRfTUFYOworCQkJY29sID0gTElORV9CVUZfU0laRSAtIDI7IC8qICsyIGJ5dGVzIGZvciAnXG4nLCBOVUwgKi8KKwkJfSBlbHNlIHsKKwkJCWxpbmVzID0gMjQ7IC8qIGRlZmF1bHQgKi8KKwkJCWNvbCA9IDc5OworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TCisJCQkvKiBXZSBvdXRwdXQgdG8gc3Rkb3V0LCB3ZSBuZWVkIHNpemUgb2Ygc3Rkb3V0IChub3Qgc3RkaW4pISAqLworCQkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChTVERPVVRfRklMRU5PLCAmY29sLCAmbGluZXMpOworCQkJaWYgKGxpbmVzIDwgNSB8fCBjb2wgPCAxMCkgeworCQkJCXNsZWVwKGludGVydmFsKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGNvbCA+IExJTkVfQlVGX1NJWkUgLSAyKQorCQkJCWNvbCA9IExJTkVfQlVGX1NJWkUgLSAyOworCQl9CisKKwkJLyogcmVhZCBwcm9jZXNzIElEcyAmIHN0YXR1cyBmb3IgYWxsIHRoZSBwcm9jZXNzZXMgKi8KKwkJd2hpbGUgKChwID0gcHJvY3BzX3NjYW4ocCwgc2Nhbl9tYXNrKSkgIT0gTlVMTCkgeworCQkJaW50IG47CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNCisJCQlpZiAoc2Nhbl9tYXNrICE9IFRPUE1FTV9NQVNLKQorI2VuZGlmCisJCQl7CisJCQkJbiA9IG50b3A7CisJCQkJdG9wID0geHJlYWxsb2NfdmVjdG9yKHRvcCwgNiwgbnRvcCsrKTsKKwkJCQl0b3Bbbl0ucGlkID0gcC0+cGlkOworCQkJCXRvcFtuXS5wcGlkID0gcC0+cHBpZDsKKwkJCQl0b3Bbbl0udnN6ID0gcC0+dnN6OworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCQkJCXRvcFtuXS50aWNrcyA9IHAtPnN0aW1lICsgcC0+dXRpbWU7CisjZW5kaWYKKwkJCQl0b3Bbbl0udWlkID0gcC0+dWlkOworCQkJCXN0cmNweSh0b3Bbbl0uc3RhdGUsIHAtPnN0YXRlKTsKKwkJCQlzdHJjcHkodG9wW25dLmNvbW0sIHAtPmNvbW0pOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworCQkJCXRvcFtuXS5sYXN0X3NlZW5fb25fY3B1ID0gcC0+bGFzdF9zZWVuX29uX2NwdTsKKyNlbmRpZgorCQkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCQkJZWxzZSB7IC8qIFRPUE1FTSAqLworCQkJCWlmICghKHAtPnNtYXBzLm1hcHBlZF9ybyB8IHAtPnNtYXBzLm1hcHBlZF9ydykpCisJCQkJCWNvbnRpbnVlOyAvKiBrZXJuZWwgdGhyZWFkcyBhcmUgaWdub3JlZCAqLworCQkJCW4gPSBudG9wOworCQkJCS8qIE5vIGJ1ZyBoZXJlIC0gdG9wIGFuZCB0b3BtZW0gYXJlIHRoZSBzYW1lICovCisJCQkJdG9wID0geHJlYWxsb2NfdmVjdG9yKHRvcG1lbSwgNiwgbnRvcCsrKTsKKwkJCQlzdHJjcHkodG9wbWVtW25dLmNvbW0sIHAtPmNvbW0pOworCQkJCXRvcG1lbVtuXS5waWQgICAgICA9IHAtPnBpZDsKKwkJCQl0b3BtZW1bbl0udnN6ICAgICAgPSBwLT5zbWFwcy5tYXBwZWRfcncgKyBwLT5zbWFwcy5tYXBwZWRfcm87CisJCQkJdG9wbWVtW25dLnZzenJ3ICAgID0gcC0+c21hcHMubWFwcGVkX3J3OworCQkJCXRvcG1lbVtuXS5yc3Nfc2ggICA9IHAtPnNtYXBzLnNoYXJlZF9jbGVhbiArIHAtPnNtYXBzLnNoYXJlZF9kaXJ0eTsKKwkJCQl0b3BtZW1bbl0ucnNzICAgICAgPSBwLT5zbWFwcy5wcml2YXRlX2NsZWFuICsgcC0+c21hcHMucHJpdmF0ZV9kaXJ0eSArIHRvcG1lbVtuXS5yc3Nfc2g7CisJCQkJdG9wbWVtW25dLmRpcnR5ICAgID0gcC0+c21hcHMucHJpdmF0ZV9kaXJ0eSArIHAtPnNtYXBzLnNoYXJlZF9kaXJ0eTsKKwkJCQl0b3BtZW1bbl0uZGlydHlfc2ggPSBwLT5zbWFwcy5zaGFyZWRfZGlydHk7CisJCQkJdG9wbWVtW25dLnN0YWNrICAgID0gcC0+c21hcHMuc3RhY2s7CisJCQl9CisjZW5kaWYKKwkJfSAvKiBlbmQgb2YgIndoaWxlIHdlIHJlYWQgL3Byb2MiICovCisJCWlmIChudG9wID09IDApIHsKKwkJCWJiX2Vycm9yX21zZygibm8gcHJvY2VzcyBpbmZvIGluIC9wcm9jIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzY2FuX21hc2sgIT0gVE9QTUVNX01BU0spIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwkJCWlmICghcHJldl9oaXN0X2NvdW50KSB7CisJCQkJZG9fc3RhdHMoKTsKKwkJCQl1c2xlZXAoMTAwMDAwKTsKKwkJCQljbGVhcm1lbXMoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRvX3N0YXRzKCk7CisJCQkvKiBUT0RPOiB3ZSBkb24ndCBuZWVkIHRvIHNvcnQgYWxsIDEwMDAwIHByb2Nlc3Nlcywgd2UgbmVlZCB0byBmaW5kIHRvcCAyNCEgKi8KKwkJCXFzb3J0KHRvcCwgbnRvcCwgc2l6ZW9mKHRvcF9zdGF0dXNfdCksICh2b2lkKiltdWx0X2x2bF9jbXApOworI2Vsc2UKKwkJCXFzb3J0KHRvcCwgbnRvcCwgc2l6ZW9mKHRvcF9zdGF0dXNfdCksICh2b2lkKikoc29ydF9mdW5jdGlvblswXSkpOworI2VuZGlmCisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKwkJZWxzZSB7IC8qIFRPUE1FTSAqLworCQkJcXNvcnQodG9wbWVtLCBudG9wLCBzaXplb2YodG9wbWVtX3N0YXR1c190KSwgKHZvaWQqKXRvcG1lbV9zb3J0KTsKKwkJfQorI2VuZGlmCisJCWlmIChzY2FuX21hc2sgIT0gVE9QTUVNX01BU0spCisJCQlkaXNwbGF5X3Byb2Nlc3NfbGlzdChsaW5lcywgY29sKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKwkJZWxzZQorCQkJZGlzcGxheV90b3BtZW1fcHJvY2Vzc19saXN0KGxpbmVzLCBjb2wpOworI2VuZGlmCisJCWNsZWFybWVtcygpOworCQlpZiAoaXRlcmF0aW9ucyA+PSAwICYmICEtLWl0ZXJhdGlvbnMpCisJCQlicmVhazsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwkJc2xlZXAoaW50ZXJ2YWwpOworI2Vsc2UKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfRU9GKQorCQkJLyogRU9GIG9uIHN0ZGluICgidG9wIDwvZGV2L251bGwiKSAqLworCQkJc2xlZXAoaW50ZXJ2YWwpOworCQllbHNlCisJCQlzY2FuX21hc2sgPSBoYW5kbGVfaW5wdXQoc2Nhbl9tYXNrLCBpbnRlcnZhbCk7CisjZW5kaWYgLyogRkVBVFVSRV9VU0VfVEVSTUlPUyAqLworCX0gLyogZW5kIG9mICJ3aGlsZSAobm90IFEpIiAqLworCisJYmJfcHV0Y2hhcignXG4nKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXJlc2V0X3Rlcm0oKTsKKyNlbmRpZgorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9wcm9jcHMvdXB0aW1lLmMgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvdXB0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4ODEyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy91cHRpbWUuYwpAQCAtMCwwICsxLDEwMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB1cHRpbWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiAyMDExCQlQZXJlIE9yZ2EgPGdvdHJ1bmtzQGdtYWlsLmNvbT4KKyAqCisgKiBBZGRlZCBGRUFUVVJFX1VQVElNRV9VVE1QX1NVUFBPUlQgZmxhZy4KKyAqLworCisvKiBnZXRvcHQgbm90IG5lZWRlZCAqLworCisvL2NvbmZpZzpjb25maWcgVVBUSU1FCisvL2NvbmZpZzoJYm9vbCAidXB0aW1lIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWCAjc3lzaW5mbygpCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdXB0aW1lIGdpdmVzIGEgb25lIGxpbmUgZGlzcGxheSBvZiB0aGUgY3VycmVudCB0aW1lLCBob3cgbG9uZworLy9jb25maWc6CSAgdGhlIHN5c3RlbSBoYXMgYmVlbiBydW5uaW5nLCBob3cgbWFueSB1c2VycyBhcmUgY3VycmVudGx5IGxvZ2dlZAorLy9jb25maWc6CSAgb24sIGFuZCB0aGUgc3lzdGVtIGxvYWQgYXZlcmFnZXMgZm9yIHRoZSBwYXN0IDEsIDUsIGFuZCAxNSBtaW51dGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9VUFRJTUVfVVRNUF9TVVBQT1JUCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3Igc2hvd2luZyB0aGUgbnVtYmVyIG9mIHVzZXJzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVVBUSU1FICYmIEZFQVRVUkVfVVRNUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1ha2VzIHVwdGltZSBkaXNwbGF5IHRoZSBudW1iZXIgb2YgdXNlcnMgY3VycmVudGx5IGxvZ2dlZCBvbi4KKworLy91c2FnZTojZGVmaW5lIHVwdGltZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHVwdGltZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgdGhlIHRpbWUgc2luY2UgdGhlIGxhc3QgYm9vdCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdXB0aW1lX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHVwdGltZVxuIgorLy91c2FnZTogICAgICAgIiAgMTo1NXBtICB1cCAgMjozMCwgbG9hZCBhdmVyYWdlOiAwLjA5LCAwLjA0LCAwLjAwXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmZGVmIF9fbGludXhfXworIyBpbmNsdWRlIDxzeXMvc3lzaW5mby5oPgorI2VuZGlmCisKKworI2lmbmRlZiBGU0hJRlQKKyMgZGVmaW5lIEZTSElGVCAxNiAgICAgICAgICAgICAgLyogbnIgb2YgYml0cyBvZiBwcmVjaXNpb24gKi8KKyNlbmRpZgorI2RlZmluZSBGSVhFRF8xICAgICAgKDEgPDwgRlNISUZUKSAgICAgLyogMS4wIGFzIGZpeGVkLXBvaW50ICovCisjZGVmaW5lIExPQURfSU5UKHgpICAodW5zaWduZWQpKCh4KSA+PiBGU0hJRlQpCisjZGVmaW5lIExPQURfRlJBQyh4KSBMT0FEX0lOVCgoKHgpICYgKEZJWEVEXzEgLSAxKSkgKiAxMDApCisKKworaW50IHVwdGltZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdXB0aW1lX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJdW5zaWduZWQgdXBkYXlzLCB1cGhvdXJzLCB1cG1pbnV0ZXM7CisJc3RydWN0IHN5c2luZm8gaW5mbzsKKwlzdHJ1Y3QgdG0gKmN1cnJlbnRfdGltZTsKKwl0aW1lX3QgY3VycmVudF9zZWNzOworCisJdGltZSgmY3VycmVudF9zZWNzKTsKKwljdXJyZW50X3RpbWUgPSBsb2NhbHRpbWUoJmN1cnJlbnRfc2Vjcyk7CisKKwlzeXNpbmZvKCZpbmZvKTsKKworCXByaW50ZigiICUwMnU6JTAydTolMDJ1IHVwICIsCisJCQljdXJyZW50X3RpbWUtPnRtX2hvdXIsIGN1cnJlbnRfdGltZS0+dG1fbWluLCBjdXJyZW50X3RpbWUtPnRtX3NlYyk7CisJdXBkYXlzID0gKHVuc2lnbmVkKSBpbmZvLnVwdGltZSAvICh1bnNpZ25lZCkoNjAqNjAqMjQpOworCWlmICh1cGRheXMpCisJCXByaW50ZigiJXUgZGF5JXMsICIsIHVwZGF5cywgKHVwZGF5cyAhPSAxKSA/ICJzIiA6ICIiKTsKKwl1cG1pbnV0ZXMgPSAodW5zaWduZWQpIGluZm8udXB0aW1lIC8gKHVuc2lnbmVkKTYwOworCXVwaG91cnMgPSAodXBtaW51dGVzIC8gKHVuc2lnbmVkKTYwKSAlICh1bnNpZ25lZCkyNDsKKwl1cG1pbnV0ZXMgJT0gNjA7CisJaWYgKHVwaG91cnMpCisJCXByaW50ZigiJTJ1OiUwMnUiLCB1cGhvdXJzLCB1cG1pbnV0ZXMpOworCWVsc2UKKwkJcHJpbnRmKCIldSBtaW4iLCB1cG1pbnV0ZXMpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVBUSU1FX1VUTVBfU1VQUE9SVAorCXsKKwkJc3RydWN0IHV0bXAgKnV0OworCQl1bnNpZ25lZCB1c2VycyA9IDA7CisJCXdoaWxlICgodXQgPSBnZXR1dGVudCgpKSAhPSBOVUxMKSB7CisJCQlpZiAoKHV0LT51dF90eXBlID09IFVTRVJfUFJPQ0VTUykgJiYgKHV0LT51dF9uYW1lWzBdICE9ICdcMCcpKQorCQkJCXVzZXJzKys7CisJCX0KKwkJcHJpbnRmKCIsICAldSB1c2VycyIsIHVzZXJzKTsKKwl9CisjZW5kaWYKKworCXByaW50ZigiLCAgbG9hZCBhdmVyYWdlOiAldS4lMDJ1LCAldS4lMDJ1LCAldS4lMDJ1XG4iLAorCQkJTE9BRF9JTlQoaW5mby5sb2Fkc1swXSksIExPQURfRlJBQyhpbmZvLmxvYWRzWzBdKSwKKwkJCUxPQURfSU5UKGluZm8ubG9hZHNbMV0pLCBMT0FEX0ZSQUMoaW5mby5sb2Fkc1sxXSksCisJCQlMT0FEX0lOVChpbmZvLmxvYWRzWzJdKSwgTE9BRF9GUkFDKGluZm8ubG9hZHNbMl0pKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9wcm9jcHMvd2F0Y2guYyBiL2J1c3lib3gtMS4xOS4zL3Byb2Nwcy93YXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWYxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9wcm9jcHMvd2F0Y2guYwpAQCAtMCwwICsxLDk4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHdhdGNoIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IE1pY2hhZWwgSGFiZXJtYW5uIDxtaGFiZXJtYW5uQGdteC5kZT4KKyAqIENvcHlyaWdqdCAoQykgTWFyIDE2LCAyMDAzIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgKi8KKy8qIEJCX0FVRElUIEdOVSBkZWZlY3RzIC0tIG9ubHkgb3B0aW9uIC1uIGlzIHN1cHBvcnRlZC4gKi8KKworLy91c2FnZTojZGVmaW5lIHdhdGNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW4gU0VDXSBbLXRdIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSB3YXRjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBQUk9HIHBlcmlvZGljYWxseVxuIgorLy91c2FnZTogICAgICJcbgktbglMb29wIHBlcmlvZCBpbiBzZWNvbmRzIChkZWZhdWx0IDIpIgorLy91c2FnZTogICAgICJcbgktdAlEb24ndCBwcmludCBoZWFkZXIiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHdhdGNoX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHdhdGNoIGRhdGVcbiIKKy8vdXNhZ2U6ICAgICAgICJNb24gRGVjIDE3IDEwOjMxOjQwIEdNVCAyMDAwXG4iCisvL3VzYWdlOiAgICAgICAiTW9uIERlYyAxNyAxMDozMTo0MiBHTVQgMjAwMFxuIgorLy91c2FnZTogICAgICAgIk1vbiBEZWMgMTcgMTA6MzE6NDQgR01UIDIwMDAiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvLyBwcm9jcHMgMi4wLjE4OgorLy8gd2F0Y2ggWy1kXSBbLW4gc2Vjb25kc10KKy8vICAgWy0tZGlmZmVyZW5jZXNbPWN1bXVsYXRpdmVdXSBbLS1pbnRlcnZhbD1zZWNvbmRzXSBjb21tYW5kCisvLworLy8gcHJvY3BzLTMuMi4zOgorLy8gd2F0Y2ggWy1kdF0gWy1uIHNlY29uZHNdCisvLyAgIFstLWRpZmZlcmVuY2VzWz1jdW11bGF0aXZlXV0gWy0taW50ZXJ2YWw9c2Vjb25kc10gWy0tbm8tdGl0bGVdIGNvbW1hbmQKKy8vCisvLyAocHJvY3BzIDMueCBhbmQgcHJvY3BzIDIueCBhcmUgZm9ya3MsIG5vdCBuZXdlci9vbGRlciB2ZXJzaW9ucyBvZiB0aGUgc2FtZSkKKworaW50IHdhdGNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3YXRjaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCXVuc2lnbmVkIHBlcmlvZCA9IDI7CisJdW5zaWduZWQgd2lkdGgsIG5ld193aWR0aDsKKwljaGFyICpoZWFkZXI7CisJY2hhciAqY21kOworCisjaWYgMCAvLyBtYXliZSBFTkFCTEVfREVTS1RPUD8KKwkvLyBwcm9jcHMzIGNvbXBhdCAtICJlY2hvIFRFU1QgfCB3YXRjaCBjYXQiIGRvZXNuJ3Qgc2hvdyBURVNUOgorCWNsb3NlKFNURElOX0ZJTEVOTyk7CisJeG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRPTkxZKTsKKyNlbmRpZgorCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6bisiOyAvLyBhdCBsZWFzdCBvbmUgcGFyYW07IC1uIE5VTQorCS8vICIrIjogc3RvcCBhdCBmaXJzdCBub24tb3B0aW9uIChwcm9jcHMgMy54IG9ubHkpCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIitkdG46IiwgJnBlcmlvZCk7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvLyB3YXRjaCBmcm9tIGJvdGggcHJvY3BzIDIueCBhbmQgMy54IGRvZXMgY29uY2F0ZW5hdGlvbi4gRXhhbXBsZToKKwkvLyB3YXRjaCBscyAtbCAiYSAvdG1wIiAiMj4mMSIgLSBscyB3b24ndCBzZWUgImEgL3RtcCIgYXMgb25lIHBhcmFtCisJY21kID0gKmFyZ3Y7CisJd2hpbGUgKCorK2FyZ3YpCisJCWNtZCA9IHhhc3ByaW50ZigiJXMgJXMiLCBjbWQsICphcmd2KTsgLy8gbGVha3MgY21kCisKKwl3aWR0aCA9ICh1bnNpZ25lZCktMTsgLy8gbWFrZSBzdXJlIGZpcnN0IHRpbWUgbmV3X3dpZHRoICE9IHdpZHRoCisJaGVhZGVyID0gTlVMTDsKKwl3aGlsZSAoMSkgeworCQkvKiBob21lOyBjbGVhciB0byB0aGUgZW5kIG9mIHNjcmVlbiAqLworCQlwcmludGYoIlwwMzNbSCIiXDAzM1tKIik7CisJCWlmICghKG9wdCAmIDB4MikpIHsgLy8gbm8gLXQKKwkJCWNvbnN0IHVuc2lnbmVkIHRpbWVfbGVuID0gc2l6ZW9mKCIxMjM0LTY3LTkwIDIzOjU2Ojg5Iik7CisJCQl0aW1lX3QgdDsKKworCQkJLy8gU1RERVJSX0ZJTEVOTyBpcyBwcm9jcHMzIGNvbXBhdDoKKwkJCS8vICJ3YXRjaCBscyAyPi9kZXYvbnVsbCIgZG9lcyBub3QgZGV0ZWN0IHR0eSBzaXplCisJCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNUREVSUl9GSUxFTk8sICZuZXdfd2lkdGgsIE5VTEwpOworCQkJaWYgKG5ld193aWR0aCAhPSB3aWR0aCkgeworCQkJCXdpZHRoID0gbmV3X3dpZHRoOworCQkJCWZyZWUoaGVhZGVyKTsKKwkJCQloZWFkZXIgPSB4YXNwcmludGYoIkV2ZXJ5ICV1czogJS0qcyIsIHBlcmlvZCwgKGludCl3aWR0aCwgY21kKTsKKwkJCX0KKwkJCXRpbWUoJnQpOworCQkJaWYgKHRpbWVfbGVuIDwgd2lkdGgpCisJCQkJc3RyZnRpbWUoaGVhZGVyICsgd2lkdGggLSB0aW1lX2xlbiwgdGltZV9sZW4sCisJCQkJCSIlWS0lbS0lZCAlSDolTTolUyIsIGxvY2FsdGltZSgmdCkpOworCisJCQkvLyBjb21wYXQ6IGVtcHR5IGxpbmUgYmV0d2VlbiBoZWFkZXIgYW5kIGNtZCBvdXRwdXQKKwkJCXByaW50ZigiJXNcblxuIiwgaGVhZGVyKTsKKwkJfQorCQlmZmx1c2hfYWxsKCk7CisJCS8vIFRPRE86ICdyZWFsJyB3YXRjaCBwaXBlcyBjbWQncyBvdXRwdXQgdG8gaXRzZWxmCisJCS8vIGFuZCBkb2VzIG5vdCBhbGxvdyBpdCB0byBvdmVyZmxvdyB0aGUgc2NyZWVuCisJCS8vICh0YWtpbmcgaW50byBhY2NvdW50IGxpbmV3cmFwISkKKwkJc3lzdGVtKGNtZCk7CisJCXNsZWVwKHBlcmlvZCk7CisJfQorCXJldHVybiAwOyAvLyBnY2MgdGhpbmtzIHdlIGNhbiByZWFjaCB0aGlzIDopCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9ydW5pdC9Db25maWcuc3JjIGIvYnVzeWJveC0xLjE5LjMvcnVuaXQvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI5NzQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvcnVuaXQvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDg5IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJSdW5pdCBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgUlVOU1YKKwlib29sICJydW5zdiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBydW5zdiBzdGFydHMgYW5kIG1vbml0b3JzIGEgc2VydmljZSBhbmQgb3B0aW9uYWxseSBhbiBhcHBlbmRhbnQgbG9nCisJICBzZXJ2aWNlLgorCitjb25maWcgUlVOU1ZESVIKKwlib29sICJydW5zdmRpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBydW5zdmRpciBzdGFydHMgYSBydW5zdiBwcm9jZXNzIGZvciBlYWNoIHN1YmRpcmVjdG9yeSwgb3Igc3ltbGluayB0bworCSAgYSBkaXJlY3RvcnksIGluIHRoZSBzZXJ2aWNlcyBkaXJlY3RvcnkgZGlyLCB1cCB0byBhIGxpbWl0IG9mIDEwMDAKKwkgIHN1YmRpcmVjdG9yaWVzLCBhbmQgcmVzdGFydHMgYSBydW5zdiBwcm9jZXNzIGlmIGl0IHRlcm1pbmF0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX1JVTlNWRElSX0xPRworCWJvb2wgIkVuYWJsZSBzY3JvbGxpbmcgYXJndW1lbnQgbG9nIgorCWRlcGVuZHMgb24gUlVOU1ZESVIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgZmVhdHVyZSB3aGVyZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHJ1bnN2ZGlyIGhvbGRzIGxhc3QgZXJyb3IKKwkgIG1lc3NhZ2UgKHZpZXdhYmxlIHZpYSB0b3AvcHMpLiBPdGhlcndpc2UgKGZlYXR1cmUgaXMgb2ZmCisJICBvciBubyBwYXJhbWV0ZXIpLCBlcnJvciBtZXNzYWdlcyBnbyB0byBzdGRlcnIgb25seS4KKworY29uZmlnIFNWCisJYm9vbCAic3YiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc3YgcmVwb3J0cyB0aGUgY3VycmVudCBzdGF0dXMgYW5kIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBzZXJ2aWNlcworCSAgbW9uaXRvcmVkIGJ5IHRoZSBydW5zdiBzdXBlcnZpc29yLgorCitjb25maWcgU1ZfREVGQVVMVF9TRVJWSUNFX0RJUgorCXN0cmluZyAiRGVmYXVsdCBkaXJlY3RvcnkgZm9yIHNlcnZpY2VzIgorCWRlZmF1bHQgIi92YXIvc2VydmljZSIKKwlkZXBlbmRzIG9uIFNWCisJaGVscAorCSAgRGVmYXVsdCBkaXJlY3RvcnkgZm9yIHNlcnZpY2VzLgorCSAgRGVmYXVsdHMgdG8gIi92YXIvc2VydmljZSIKKworY29uZmlnIFNWTE9HRAorCWJvb2wgInN2bG9nZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzdmxvZ2QgY29udGludW91c2x5IHJlYWRzIGxvZyBkYXRhIGZyb20gaXRzIHN0YW5kYXJkIGlucHV0LCBvcHRpb25hbGx5CisJICBmaWx0ZXJzIGxvZyBtZXNzYWdlcywgYW5kIHdyaXRlcyB0aGUgZGF0YSB0byBvbmUgb3IgbW9yZSBhdXRvbWF0aWNhbGx5CisJICByb3RhdGVkIGxvZ3MuCisKK2NvbmZpZyBDSFBTVAorCWJvb2wgImNocHN0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNocHN0IGNoYW5nZXMgdGhlIHByb2Nlc3Mgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBvcHRpb25zLCBhbmQKKwkgIGV4ZWNzIHNwZWNpZmllZCBwcm9ncmFtLgorCitjb25maWcgU0VUVUlER0lECisJYm9vbCAic2V0dWlkZ2lkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNldHMgc29mdCByZXNvdXJjZSBsaW1pdHMgYXMgc3BlY2lmaWVkIGJ5IG9wdGlvbnMKKworY29uZmlnIEVOVlVJREdJRAorCWJvb2wgImVudnVpZGdpZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXRzICRVSUQgdG8gYWNjb3VudCdzIHVpZCBhbmQgJEdJRCB0byBhY2NvdW50J3MgZ2lkCisKK2NvbmZpZyBFTlZESVIKKwlib29sICJlbnZkaXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2V0cyB2YXJpb3VzIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgYnkgZmlsZXMKKwkgIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkKKworY29uZmlnIFNPRlRMSU1JVAorCWJvb2wgInNvZnRsaW1pdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXRzIHNvZnQgcmVzb3VyY2UgbGltaXRzIGFzIHNwZWNpZmllZCBieSBvcHRpb25zCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3J1bml0L0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy9ydW5pdC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmY2U5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9ydW5pdC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMjAgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorCitsaWItJChDT05GSUdfUlVOU1YpICs9IHJ1bnN2Lm8KK2xpYi0kKENPTkZJR19SVU5TVkRJUikgKz0gcnVuc3ZkaXIubworbGliLSQoQ09ORklHX1NWKSArPSBzdi5vCitsaWItJChDT05GSUdfU1ZMT0dEKSArPSBzdmxvZ2QubworbGliLSQoQ09ORklHX0NIUFNUKSArPSBjaHBzdC5vCisKK2xpYi0kKENPTkZJR19FTlZESVIpICs9IGNocHN0Lm8KK2xpYi0kKENPTkZJR19FTlZVSURHSUQpICs9IGNocHN0Lm8KK2xpYi0kKENPTkZJR19TRVRVSURHSUQpICs9IGNocHN0Lm8KK2xpYi0kKENPTkZJR19TT0ZUTElNSVQpICs9IGNocHN0Lm8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3J1bml0L2NocHN0LmMgYi9idXN5Ym94LTEuMTkuMy9ydW5pdC9jaHBzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NTcwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9ydW5pdC9jaHBzdC5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEdlcnJpdCBQYXBlCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KK0VWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiBCdXN5Ym94ZWQgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4gKi8KKy8qIERlcGVuZGVuY2llcyBvbiBydW5pdF9saWIuYyByZW1vdmVkICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaHBzdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12UDAxMl0gWy11IFVTRVJbOkdSUF1dIFstVSBVU0VSWzpHUlBdXSBbLWUgRElSXVxuIgorLy91c2FnZTogICAgICAgIglbLS8gRElSXSBbLW4gTklDRV0gWy1tIEJZVEVTXSBbLWQgQllURVNdIFstbyBOXVxuIgorLy91c2FnZTogICAgICAgIglbLXAgTl0gWy1mIEJZVEVTXSBbLWMgQllURVNdIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBjaHBzdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgcHJvY2VzcyBzdGF0ZSwgcnVuIFBST0dcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUls6R1JQXQlTZXQgdWlkIGFuZCBnaWQiCisvL3VzYWdlOiAgICAgIlxuCS1VIFVTRVJbOkdSUF0JU2V0ICRVSUQgYW5kICRHSUQgaW4gZW52aXJvbm1lbnQiCisvL3VzYWdlOiAgICAgIlxuCS1lIERJUgkJU2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgYnkgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCQkJaW4gRElSOiBmaWxlPTFzdF9saW5lX29mX2ZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS0vIERJUgkJQ2hyb290IHRvIERJUiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTklDRQkJQWRkIE5JQ0UgdG8gbmljZSB2YWx1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gQllURVMJU2FtZSBhcyAtZCBCWVRFUyAtcyBCWVRFUyAtbCBCWVRFUyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgQllURVMJTGltaXQgZGF0YSBzZWdtZW50IgorLy91c2FnZTogICAgICJcbgktbyBOCQlMaW1pdCBudW1iZXIgb2Ygb3BlbiBmaWxlcyBwZXIgcHJvY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgTgkJTGltaXQgbnVtYmVyIG9mIHByb2Nlc3NlcyBwZXIgdWlkIgorLy91c2FnZTogICAgICJcbgktZiBCWVRFUwlMaW1pdCBvdXRwdXQgZmlsZSBzaXplcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgQllURVMJTGltaXQgY29yZSBmaWxlIHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS12CQlWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktUAkJQ3JlYXRlIG5ldyBwcm9jZXNzIGdyb3VwIgorLy91c2FnZTogICAgICJcbgktMAkJQ2xvc2Ugc3RkaW4iCisvL3VzYWdlOiAgICAgIlxuCS0xCQlDbG9zZSBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS0yCQlDbG9zZSBzdGRlcnIiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGVudmRpcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRElSIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBlbnZkaXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZXQgdmFyaW91cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc3BlY2lmaWVkIGJ5IGZpbGVzXG4iCisvL3VzYWdlOiAgICAgICAiaW4gdGhlIGRpcmVjdG9yeSBESVIsIHJ1biBQUk9HIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBlbnZ1aWRnaWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlVTRVIgUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIGVudnVpZGdpZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNldCAkVUlEIHRvIFVTRVIncyB1aWQgYW5kICRHSUQgdG8gVVNFUidzIGdpZCwgcnVuIFBST0ciCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNldHVpZGdpZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiVVNFUiBQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgc2V0dWlkZ2lkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2V0IHVpZCBhbmQgZ2lkIHRvIFVTRVIncyB1aWQgYW5kIGdpZCwgZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwIGlkcyxcbiIKKy8vdXNhZ2U6ICAgICAgICJydW4gUFJPRyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc29mdGxpbWl0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWEgQllURVNdIFstbSBCWVRFU10gWy1kIEJZVEVTXSBbLXMgQllURVNdIFstbCBCWVRFU11cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy1mIEJZVEVTXSBbLWMgQllURVNdIFstciBCWVRFU10gWy1vIE5dIFstcCBOXSBbLXQgTl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIHNvZnRsaW1pdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNldCBzb2Z0IHJlc291cmNlIGxpbWl0cywgdGhlbiBydW4gUFJPR1xuIgorLy91c2FnZTogICAgICJcbgktYSBCWVRFUwlMaW1pdCB0b3RhbCBzaXplIG9mIGFsbCBzZWdtZW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gQllURVMJU2FtZSBhcyAtZCBCWVRFUyAtcyBCWVRFUyAtbCBCWVRFUyAtYSBCWVRFUyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgQllURVMJTGltaXQgZGF0YSBzZWdtZW50IgorLy91c2FnZTogICAgICJcbgktcyBCWVRFUwlMaW1pdCBzdGFjayBzZWdtZW50IgorLy91c2FnZTogICAgICJcbgktbCBCWVRFUwlMaW1pdCBsb2NrZWQgbWVtb3J5IHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS1vIE4JCUxpbWl0IG51bWJlciBvZiBvcGVuIGZpbGVzIHBlciBwcm9jZXNzIgorLy91c2FnZTogICAgICJcbgktcCBOCQlMaW1pdCBudW1iZXIgb2YgcHJvY2Vzc2VzIHBlciB1aWQiCisvL3VzYWdlOiAgICAgIlxuT3B0aW9ucyBjb250cm9sbGluZyBmaWxlIHNpemVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgQllURVMJTGltaXQgb3V0cHV0IGZpbGUgc2l6ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1jIEJZVEVTCUxpbWl0IGNvcmUgZmlsZSBzaXplIgorLy91c2FnZTogICAgICJcbkVmZmljaWVuY3kgb3B0czoiCisvL3VzYWdlOiAgICAgIlxuCS1yIEJZVEVTCUxpbWl0IHJlc2lkZW50IHNldCBzaXplIgorLy91c2FnZTogICAgICJcbgktdCBOCQlMaW1pdCBDUFUgdGltZSwgcHJvY2VzcyByZWNlaXZlcyIKKy8vdXNhZ2U6ICAgICAiXG4JCQlhIFNJR1hDUFUgYWZ0ZXIgTiBzZWNvbmRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKK0ZpdmUgYXBwbGV0cyBoZXJlOiBjaHBzdCwgZW52ZGlyLCBlbnZ1aWRnaWQsIHNldHVpZGdpZCwgc29mdGxpbWl0LgorCitPbmx5IHNvZnRsaW1pdCBhbmQgY2hwc3QgYXJlIHRha2luZyBvcHRpb25zOgorCisjIGNvbW1vbgorLW8gTiAgICAgICAgICAgIExpbWl0IG51bWJlciBvZiBvcGVuIGZpbGVzIHBlciBwcm9jZXNzCistcCBOICAgICAgICAgICAgTGltaXQgbnVtYmVyIG9mIHByb2Nlc3NlcyBwZXIgdWlkCistbSBCWVRFUyAgICAgICAgU2FtZSBhcyAtZCBCWVRFUyAtcyBCWVRFUyAtbCBCWVRFUyBbLWEgQllURVNdCistZCBCWVRFUyAgICAgICAgTGltaXQgZGF0YSBzZWdtZW50CistZiBCWVRFUyAgICAgICAgTGltaXQgb3V0cHV0IGZpbGUgc2l6ZXMKKy1jIEJZVEVTICAgICAgICBMaW1pdCBjb3JlIGZpbGUgc2l6ZQorIyBzb2Z0bGltaXQKKy1hIEJZVEVTICAgICAgICBMaW1pdCB0b3RhbCBzaXplIG9mIGFsbCBzZWdtZW50cworLXMgQllURVMgICAgICAgIExpbWl0IHN0YWNrIHNlZ21lbnQKKy1sIEJZVEVTICAgICAgICBMaW1pdCBsb2NrZWQgbWVtb3J5IHNpemUKKy1yIEJZVEVTICAgICAgICBMaW1pdCByZXNpZGVudCBzZXQgc2l6ZQorLXQgTiAgICAgICAgICAgIExpbWl0IENQVSB0aW1lCisjIGNocHN0CistdSBVU0VSWzpHUlBdICAgU2V0IHVpZCBhbmQgZ2lkCistVSBVU0VSWzpHUlBdICAgU2V0ICRVSUQgYW5kICRHSUQgaW4gZW52aXJvbm1lbnQKKy1lIERJUiAgICAgICAgICBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNwZWNpZmllZCBieSBmaWxlcyBpbiBESVIKKy0vIERJUiAgICAgICAgICBDaHJvb3QgdG8gRElSCistbiBOSUNFICAgICAgICAgQWRkIE5JQ0UgdG8gbmljZSB2YWx1ZQorLXYgICAgICAgICAgICAgIFZlcmJvc2UKKy1QICAgICAgICAgICAgICBDcmVhdGUgbmV3IHByb2Nlc3MgZ3JvdXAKKy0wIC0xIC0yICAgICAgICBDbG9zZSBmZCAwLDEsMgorCitFdmVuIHRob3VnaCB3ZSBhY2NlcHQgYWxsIHRoZXNlIG9wdGlvbnMgZm9yIGJvdGggc29mdGxpbWl0IGFuZCBjaHBzdCwKK3RoZXkgYXJlIG5vdCB0byBiZSBhZHZlcnRpc2VkIG9uIHRoZWlyIGhlbHAgdGV4dHMuCitXZSBoYXZlIGVub3VnaCBwcm9ibGVtcyB3aXRoIGZlYXR1cmUgY3JlZXAgaW4gb3RoZXIgcGVvcGxlJ3MKK3NvZnR3YXJlLCBkb24ndCB3YW50IHRvIGFkZCBvdXIgb3duLgorCitlbnZkaXIsIGVudnVpZGdpZCwgc2V0dWlkZ2lkIHRha2Ugbm8gb3B0aW9ucywgYnV0IHRoZXkgcmV1c2UgY29kZSB3aGljaAoraGFuZGxlcyAtZSwgLVUgYW5kIC11LgorKi8KKworZW51bSB7CisJT1BUX2EgPSAoMSA8PCAwKSAqIEVOQUJMRV9TT0ZUTElNSVQsCisJT1BUX2MgPSAoMSA8PCAxKSAqIChFTkFCTEVfU09GVExJTUlUIHx8IEVOQUJMRV9DSFBTVCksCisJT1BUX2QgPSAoMSA8PCAyKSAqIChFTkFCTEVfU09GVExJTUlUIHx8IEVOQUJMRV9DSFBTVCksCisJT1BUX2YgPSAoMSA8PCAzKSAqIChFTkFCTEVfU09GVExJTUlUIHx8IEVOQUJMRV9DSFBTVCksCisJT1BUX2wgPSAoMSA8PCA0KSAqIEVOQUJMRV9TT0ZUTElNSVQsCisJT1BUX20gPSAoMSA8PCA1KSAqIChFTkFCTEVfU09GVExJTUlUIHx8IEVOQUJMRV9DSFBTVCksCisJT1BUX28gPSAoMSA8PCA2KSAqIChFTkFCTEVfU09GVExJTUlUIHx8IEVOQUJMRV9DSFBTVCksCisJT1BUX3AgPSAoMSA8PCA3KSAqIChFTkFCTEVfU09GVExJTUlUIHx8IEVOQUJMRV9DSFBTVCksCisJT1BUX3IgPSAoMSA8PCA4KSAqIEVOQUJMRV9TT0ZUTElNSVQsCisJT1BUX3MgPSAoMSA8PCA5KSAqIEVOQUJMRV9TT0ZUTElNSVQsCisJT1BUX3QgPSAoMSA8PCAxMCkgKiBFTkFCTEVfU09GVExJTUlULAorCU9QVF91ID0gKDEgPDwgMTEpICogKEVOQUJMRV9DSFBTVCB8fCBFTkFCTEVfU0VUVUlER0lEKSwKKwlPUFRfVSA9ICgxIDw8IDEyKSAqIChFTkFCTEVfQ0hQU1QgfHwgRU5BQkxFX0VOVlVJREdJRCksCisJT1BUX2UgPSAoMSA8PCAxMykgKiAoRU5BQkxFX0NIUFNUIHx8IEVOQUJMRV9FTlZESVIpLAorCU9QVF9yb290ID0gKDEgPDwgMTQpICogRU5BQkxFX0NIUFNULAorCU9QVF9uID0gKDEgPDwgMTUpICogRU5BQkxFX0NIUFNULAorCU9QVF92ID0gKDEgPDwgMTYpICogRU5BQkxFX0NIUFNULAorCU9QVF9QID0gKDEgPDwgMTcpICogRU5BQkxFX0NIUFNULAorCU9QVF8wID0gKDEgPDwgMTgpICogRU5BQkxFX0NIUFNULAorCU9QVF8xID0gKDEgPDwgMTkpICogRU5BQkxFX0NIUFNULAorCU9QVF8yID0gKDEgPDwgMjApICogRU5BQkxFX0NIUFNULAorfTsKKworLyogVE9ETzogdXNlIHJlY3Vyc2l2ZV9hY3Rpb24/ICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBlZGlyKGNvbnN0IGNoYXIgKmRpcmVjdG9yeV9uYW1lKQoreworCWludCB3ZGlyOworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmQ7CisJaW50IGZkOworCisJd2RpciA9IHhvcGVuKCIuIiwgT19SRE9OTFkgfCBPX05ERUxBWSk7CisJeGNoZGlyKGRpcmVjdG9yeV9uYW1lKTsKKwlkaXIgPSB4b3BlbmRpcigiLiIpOworCWZvciAoOzspIHsKKwkJY2hhciBidWZbMjU2XTsKKwkJY2hhciAqdGFpbDsKKwkJaW50IHNpemU7CisKKwkJZXJybm8gPSAwOworCQlkID0gcmVhZGRpcihkaXIpOworCQlpZiAoIWQpIHsKKwkJCWlmIChlcnJubykKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInJlYWRkaXIgJXMiLAorCQkJCQkJZGlyZWN0b3J5X25hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGQtPmRfbmFtZVswXSA9PSAnLicpCisJCQljb250aW51ZTsKKwkJZmQgPSBvcGVuKGQtPmRfbmFtZSwgT19SRE9OTFkgfCBPX05ERUxBWSk7CisJCWlmIChmZCA8IDApIHsKKwkJCWlmICgoZXJybm8gPT0gRUlTRElSKSAmJiBkaXJlY3RvcnlfbmFtZSkgeworCQkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3YpCisJCQkJCWJiX3BlcnJvcl9tc2coIndhcm5pbmc6ICVzLyVzIGlzIGEgZGlyZWN0b3J5IiwKKwkJCQkJCWRpcmVjdG9yeV9uYW1lLCBkLT5kX25hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJvcGVuICVzLyVzIiwKKwkJCQkJCWRpcmVjdG9yeV9uYW1lLCBkLT5kX25hbWUpOworCQl9CisJCXNpemUgPSBmdWxsX3JlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiktMSk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKHNpemUgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJyZWFkICVzLyVzIiwKKwkJCQkJZGlyZWN0b3J5X25hbWUsIGQtPmRfbmFtZSk7CisJCWlmIChzaXplID09IDApIHsKKwkJCXVuc2V0ZW52KGQtPmRfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlidWZbc2l6ZV0gPSAnXG4nOworCQl0YWlsID0gc3RyY2hyKGJ1ZiwgJ1xuJyk7CisJCS8qIHNraXAgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCQl3aGlsZSAoMSkgeworCQkJKnRhaWwgPSAnXDAnOworCQkJdGFpbC0tOworCQkJaWYgKHRhaWwgPCBidWYgfHwgIWlzc3BhY2UoKnRhaWwpKQorCQkJCWJyZWFrOworCQl9CisJCXhzZXRlbnYoZC0+ZF9uYW1lLCBidWYpOworCX0KKwljbG9zZWRpcihkaXIpOworCWlmIChmY2hkaXIod2RpcikgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZmNoZGlyIik7CisJY2xvc2Uod2Rpcik7Cit9CisKK3N0YXRpYyB2b2lkIGxpbWl0KGludCB3aGF0LCBsb25nIGwpCit7CisJc3RydWN0IHJsaW1pdCByOworCisJLyogTmV2ZXIgZmFpbHMgdW5kZXIgTGludXggKGV4Y2VwdCBpZiB5b3UgcGFzcyBpdCBiYWQgYXJndW1lbnRzKSAqLworCWdldHJsaW1pdCh3aGF0LCAmcik7CisJaWYgKChsIDwgMCkgfHwgKGwgPiByLnJsaW1fbWF4KSkKKwkJci5ybGltX2N1ciA9IHIucmxpbV9tYXg7CisJZWxzZQorCQlyLnJsaW1fY3VyID0gbDsKKwlpZiAoc2V0cmxpbWl0KHdoYXQsICZyKSA9PSAtMSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRybGltaXQiKTsKK30KKworaW50IGNocHN0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaHBzdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGJiX3VpZGdpZF90IHVnaWQ7CisJY2hhciAqc2V0X3VzZXIgPSBzZXRfdXNlcjsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqZW52X3VzZXIgPSBlbnZfdXNlcjsKKwljaGFyICplbnZfZGlyID0gZW52X2RpcjsKKwljaGFyICpyb290OworCWNoYXIgKm5pY2VzdHI7CisJdW5zaWduZWQgbGltaXRhOworCXVuc2lnbmVkIGxpbWl0YzsKKwl1bnNpZ25lZCBsaW1pdGQ7CisJdW5zaWduZWQgbGltaXRmOworCXVuc2lnbmVkIGxpbWl0bDsKKwl1bnNpZ25lZCBsaW1pdG07CisJdW5zaWduZWQgbGltaXRvOworCXVuc2lnbmVkIGxpbWl0cDsKKwl1bnNpZ25lZCBsaW1pdHI7CisJdW5zaWduZWQgbGltaXRzOworCXVuc2lnbmVkIGxpbWl0dDsKKwl1bnNpZ25lZCBvcHQ7CisKKwlpZiAoKEVOQUJMRV9DSFBTVCAmJiBhcHBsZXRfbmFtZVswXSA9PSAnYycpCisJIHx8IChFTkFCTEVfU09GVExJTUlUICYmIGFwcGxldF9uYW1lWzFdID09ICdvJykKKwkpIHsKKwkJLy8gRklYTUU6IGNhbiB3ZSBsaXZlIHdpdGggaW50LXNpemVkIGxpbWl0cz8KKwkJLy8gY2FuIHdlIGxpdmUgd2l0aCA0MDAwMCBkYXlzPworCQkvLyBpZiB5ZXMgLT4gZ2V0b3B0IGNvbnZlcnRzIHN0cmluZ3MgdG8gbnVtYmVycyBmb3IgdXMKKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6YSs6Yys6ZCs6Zis6bCs6bSs6bys6cCs6cis6cys6dCsiOworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK2E6YzpkOmY6bDptOm86cDpyOnM6dDp1OlU6ZToiCisJCQlJRl9DSFBTVCgiLzpuOnZQMDEyIiksCisJCQkmbGltaXRhLCAmbGltaXRjLCAmbGltaXRkLCAmbGltaXRmLCAmbGltaXRsLAorCQkJJmxpbWl0bSwgJmxpbWl0bywgJmxpbWl0cCwgJmxpbWl0ciwgJmxpbWl0cywgJmxpbWl0dCwKKwkJCSZzZXRfdXNlciwgJmVudl91c2VyLCAmZW52X2RpcgorCQkJSUZfQ0hQU1QoLCAmcm9vdCwgJm5pY2VzdHIpKTsKKwkJYXJndiArPSBvcHRpbmQ7CisJCWlmIChvcHQgJiBPUFRfbSkgeyAvLyAtbSBtZWFucyAtYXNsZAorCQkJbGltaXRhID0gbGltaXRzID0gbGltaXRsID0gbGltaXRkID0gbGltaXRtOworCQkJb3B0IHw9IChPUFRfcyB8IE9QVF9sIHwgT1BUX2EgfCBPUFRfZCk7CisJCX0KKwl9IGVsc2UgeworCQlvcHRpb25fbWFzazMyID0gb3B0ID0gMDsKKwkJYXJndisrOworCQlpZiAoISphcmd2KQorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8vIGVudmRpcj8KKwlpZiAoRU5BQkxFX0VOVkRJUiAmJiBhcHBsZXRfbmFtZVszXSA9PSAnZCcpIHsKKwkJZW52X2RpciA9ICphcmd2Kys7CisJCW9wdCB8PSBPUFRfZTsKKwl9CisKKwkvLyBzZXR1aWRnaWQ/CisJaWYgKEVOQUJMRV9TRVRVSURHSUQgJiYgYXBwbGV0X25hbWVbMV0gPT0gJ2UnKSB7CisJCXNldF91c2VyID0gKmFyZ3YrKzsKKwkJb3B0IHw9IE9QVF91OworCX0KKworCS8vIGVudnVpZGdpZD8KKwlpZiAoRU5BQkxFX0VOVlVJREdJRCAmJiBhcHBsZXRfbmFtZVswXSA9PSAnZScgJiYgYXBwbGV0X25hbWVbM10gPT0gJ3UnKSB7CisJCWVudl91c2VyID0gKmFyZ3YrKzsKKwkJb3B0IHw9IE9QVF9VOworCX0KKworCS8vIHdlIG11c3QgaGF2ZSBQUk9HIFtBUkdTXQorCWlmICghKmFyZ3YpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8vIHNldCBsaW1pdHMKKwlpZiAob3B0ICYgT1BUX2QpIHsKKyNpZmRlZiBSTElNSVRfREFUQQorCQlsaW1pdChSTElNSVRfREFUQSwgbGltaXRkKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiREFUQSIpOworI2VuZGlmCisJfQorCWlmIChvcHQgJiBPUFRfcykgeworI2lmZGVmIFJMSU1JVF9TVEFDSworCQlsaW1pdChSTElNSVRfU1RBQ0ssIGxpbWl0cyk7CisjZWxzZQorCQlpZiAob3B0ICYgT1BUX3YpCisJCQliYl9lcnJvcl9tc2coInN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFJMSU1JVF8lcyIsCisJCQkJIlNUQUNLIik7CisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9sKSB7CisjaWZkZWYgUkxJTUlUX01FTUxPQ0sKKwkJbGltaXQoUkxJTUlUX01FTUxPQ0ssIGxpbWl0bCk7CisjZWxzZQorCQlpZiAob3B0ICYgT1BUX3YpCisJCQliYl9lcnJvcl9tc2coInN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFJMSU1JVF8lcyIsCisJCQkJIk1FTUxPQ0siKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX2EpIHsKKyNpZmRlZiBSTElNSVRfVk1FTQorCQlsaW1pdChSTElNSVRfVk1FTSwgbGltaXRhKTsKKyNlbHNlCisjaWZkZWYgUkxJTUlUX0FTCisJCWxpbWl0KFJMSU1JVF9BUywgbGltaXRhKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiVk1FTSIpOworI2VuZGlmCisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9vKSB7CisjaWZkZWYgUkxJTUlUX05PRklMRQorCQlsaW1pdChSTElNSVRfTk9GSUxFLCBsaW1pdG8pOworI2Vsc2UKKyNpZmRlZiBSTElNSVRfT0ZJTEUKKwkJbGltaXQoUkxJTUlUX09GSUxFLCBsaW1pdG8pOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJOT0ZJTEUiKTsKKyNlbmRpZgorI2VuZGlmCisJfQorCWlmIChvcHQgJiBPUFRfcCkgeworI2lmZGVmIFJMSU1JVF9OUFJPQworCQlsaW1pdChSTElNSVRfTlBST0MsIGxpbWl0cCk7CisjZWxzZQorCQlpZiAob3B0ICYgT1BUX3YpCisJCQliYl9lcnJvcl9tc2coInN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFJMSU1JVF8lcyIsCisJCQkJIk5QUk9DIik7CisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9mKSB7CisjaWZkZWYgUkxJTUlUX0ZTSVpFCisJCWxpbWl0KFJMSU1JVF9GU0laRSwgbGltaXRmKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiRlNJWkUiKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX2MpIHsKKyNpZmRlZiBSTElNSVRfQ09SRQorCQlsaW1pdChSTElNSVRfQ09SRSwgbGltaXRjKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiQ09SRSIpOworI2VuZGlmCisJfQorCWlmIChvcHQgJiBPUFRfcikgeworI2lmZGVmIFJMSU1JVF9SU1MKKwkJbGltaXQoUkxJTUlUX1JTUywgbGltaXRyKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiUlNTIik7CisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF90KSB7CisjaWZkZWYgUkxJTUlUX0NQVQorCQlsaW1pdChSTElNSVRfQ1BVLCBsaW1pdHQpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJDUFUiKTsKKyNlbmRpZgorCX0KKworCWlmIChvcHQgJiBPUFRfUCkKKwkJc2V0c2lkKCk7CisKKwlpZiAob3B0ICYgT1BUX2UpCisJCWVkaXIoZW52X2Rpcik7CisKKwkvLyBGSVhNRTogY2hyb290ZWQgamFpbCBtdXN0IGhhdmUgL2V0Yy9wYXNzd2QgaWYgd2UgbW92ZSB0aGlzIGFmdGVyIGNocm9vdCEKKwkvLyBPVE9IIGNocm9vdCBmYWlscyBmb3Igbm9uLXJvb3RzIQorCS8vIFNPTFVUSU9OOiBjYWNoZSB1aWQvZ2lkIGJlZm9yZSBjaHJvb3QsIGFwcGx5IHVpZC9naWQgYWZ0ZXIKKwlpZiAob3B0ICYgT1BUX1UpIHsKKwkJeGdldF91aWRnaWQoJnVnaWQsIGVudl91c2VyKTsKKwkJeHNldGVudigiR0lEIiwgdXRvYSh1Z2lkLmdpZCkpOworCQl4c2V0ZW52KCJVSUQiLCB1dG9hKHVnaWQudWlkKSk7CisJfQorCisJaWYgKG9wdCAmIE9QVF91KSB7CisJCXhnZXRfdWlkZ2lkKCZ1Z2lkLCBzZXRfdXNlcik7CisJfQorCisJaWYgKG9wdCAmIE9QVF9yb290KSB7CisJCXhjaGRpcihyb290KTsKKwkJeGNocm9vdCgiLiIpOworCX0KKworCWlmIChvcHQgJiBPUFRfdSkgeworCQlpZiAoc2V0Z3JvdXBzKDEsICZ1Z2lkLmdpZCkgPT0gLTEpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldGdyb3VwcyIpOworCQl4c2V0Z2lkKHVnaWQuZ2lkKTsKKwkJeHNldHVpZCh1Z2lkLnVpZCk7CisJfQorCisJaWYgKG9wdCAmIE9QVF9uKSB7CisJCWVycm5vID0gMDsKKwkJaWYgKG5pY2UoeGF0b2kobmljZXN0cikpID09IC0xKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJuaWNlIik7CisJfQorCisJaWYgKG9wdCAmIE9QVF8wKQorCQljbG9zZShTVERJTl9GSUxFTk8pOworCWlmIChvcHQgJiBPUFRfMSkKKwkJY2xvc2UoU1RET1VUX0ZJTEVOTyk7CisJaWYgKG9wdCAmIE9QVF8yKQorCQljbG9zZShTVERFUlJfRklMRU5PKTsKKworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9ydW5pdC9ydW5pdF9saWIuaCBiL2J1c3lib3gtMS4xOS4zL3J1bml0L3J1bml0X2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNmVhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9ydW5pdC9ydW5pdF9saWIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEdlcnJpdCBQYXBlCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KK0VWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyoKKyAqIHJ1bnN2IC8gc3VwZXJ2aXNlIC8gc3Ygc3R1ZmYKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3ZzdGF0dXNfdCB7CisJdWludDY0X3QgdGltZV9iZTY0IFBBQ0tFRDsKKwl1aW50MzJfdCB0aW1lX25zZWNfYmUzMiBQQUNLRUQ7CisJdWludDMyX3QgcGlkX2xlMzIgUEFDS0VEOworCXVpbnQ4X3QgIHBhdXNlZDsKKwl1aW50OF90ICB3YW50OyAvKiAndScgb3IgJ2QnICovCisJdWludDhfdCAgZ290X3Rlcm07CisJdWludDhfdCAgcnVuX29yX2ZpbmlzaDsKK30gc3ZzdGF0dXNfdDsKK3N0cnVjdCBFUlJfc3ZzdGF0dXNfbXVzdF9iZV8yMF9ieXRlcyB7CisJY2hhciBFUlJfc3ZzdGF0dXNfbXVzdF9iZV8yMF9ieXRlc1tzaXplb2Yoc3ZzdGF0dXNfdCkgPT0gMjAgPyAxIDogLTFdOworfTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3J1bml0L3J1bnN2LmMgYi9idXN5Ym94LTEuMTkuMy9ydW5pdC9ydW5zdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOGQ4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9ydW5pdC9ydW5zdi5jCkBAIC0wLDAgKzEsNjcxIEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEdlcnJpdCBQYXBlCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KK0VWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiBCdXN5Ym94ZWQgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4gKi8KKy8qIFRPRE86IGRlcGVuZHMgb24gcnVuaXRfbGliLmMgLSByZXZpZXcgYW5kIHJlZHVjZS9lbGltaW5hdGUgKi8KKworLy91c2FnZTojZGVmaW5lIHJ1bnN2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJESVIiCisvL3VzYWdlOiNkZWZpbmUgcnVuc3ZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdGFydCBhbmQgbW9uaXRvciBhIHNlcnZpY2UgYW5kIG9wdGlvbmFsbHkgYW4gYXBwZW5kYW50IGxvZyBzZXJ2aWNlIgorCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnVuaXRfbGliLmgiCisKKyNpZiBFTkFCTEVfTU9OT1RPTklDX1NZU0NBTEwKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisvKiBsaWJjIGhhcyBpbmNyZWRpYmx5IG1lc3N5IHdheSBvZiBkb2luZyB0aGlzLAorICogdHlwaWNhbGx5IHJlcXVpcmluZyAtbHJ0LiBXZSBqdXN0IHNraXAgYWxsIHRoaXMgbWVzcyAqLworc3RhdGljIHZvaWQgZ2V0dGltZW9mZGF5X25zKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJc3lzY2FsbChfX05SX2Nsb2NrX2dldHRpbWUsIENMT0NLX1JFQUxUSU1FLCB0cyk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgZ2V0dGltZW9mZGF5X25zKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJaWYgKHNpemVvZihzdHJ1Y3QgdGltZXZhbCkgPT0gc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykKKwkgJiYgc2l6ZW9mKCgoc3RydWN0IHRpbWV2YWwqKXRzKS0+dHZfdXNlYykgPT0gc2l6ZW9mKHRzLT50dl9uc2VjKQorCSkgeworCQkvKiBDaGVhdCAqLworCQlnZXR0aW1lb2ZkYXkoKHZvaWQqKXRzLCBOVUxMKTsKKwkJdHMtPnR2X25zZWMgKj0gMTAwMDsKKwl9IGVsc2UgeworCQlleHRlcm4gdm9pZCBCVUdfbmVlZF90b19pbXBsZW1lbnRfZ2V0dGltZW9mZGF5X25zKHZvaWQpOworCQlCVUdfbmVlZF90b19pbXBsZW1lbnRfZ2V0dGltZW9mZGF5X25zKCk7CisJfQorfQorI2VuZGlmCisKKy8qIENvbXBhcmUgcG9zc2libHkgb3ZlcmZsb3dpbmcgdW5zaWduZWQgY291bnRlcnMgKi8KKyNkZWZpbmUgTEVTUyhhLGIpICgoaW50KSgodW5zaWduZWQpKGIpIC0gKHVuc2lnbmVkKShhKSkgPiAwKQorCisvKiBzdGF0ZSAqLworI2RlZmluZSBTX0RPV04gMAorI2RlZmluZSBTX1JVTiAxCisjZGVmaW5lIFNfRklOSVNIIDIKKy8qIGN0cmwgKi8KKyNkZWZpbmUgQ19OT09QIDAKKyNkZWZpbmUgQ19URVJNIDEKKyNkZWZpbmUgQ19QQVVTRSAyCisvKiB3YW50ICovCisjZGVmaW5lIFdfVVAgMAorI2RlZmluZSBXX0RPV04gMQorI2RlZmluZSBXX0VYSVQgMgorCitzdHJ1Y3Qgc3ZkaXIgeworCWludCBwaWQ7CisJc21hbGxpbnQgc3RhdGU7CisJc21hbGxpbnQgY3RybDsKKwlzbWFsbGludCBzZF93YW50OworCXNtYWxsaW50IGlzbG9nOworCXN0cnVjdCB0aW1lc3BlYyBzdGFydDsKKwlpbnQgZmRsb2NrOworCWludCBmZGNvbnRyb2w7CisJaW50IGZkY29udHJvbHdyaXRlOworCWludCB3c3RhdDsKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzbWFsbGludCBoYXNsb2c7CisJc21hbGxpbnQgc2lndGVybTsKKwlzbWFsbGludCBwaWRjaGFuZ2VkOworCXN0cnVjdCBmZF9wYWlyIHNlbGZwaXBlOworCXN0cnVjdCBmZF9wYWlyIGxvZ3BpcGU7CisJY2hhciAqZGlyOworCXN0cnVjdCBzdmRpciBzdmRbMl07Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBoYXNsb2cgICAgICAgKEcuaGFzbG9nICAgICAgKQorI2RlZmluZSBzaWd0ZXJtICAgICAgKEcuc2lndGVybSAgICAgKQorI2RlZmluZSBwaWRjaGFuZ2VkICAgKEcucGlkY2hhbmdlZCAgKQorI2RlZmluZSBzZWxmcGlwZSAgICAgKEcuc2VsZnBpcGUgICAgKQorI2RlZmluZSBsb2dwaXBlICAgICAgKEcubG9ncGlwZSAgICAgKQorI2RlZmluZSBkaXIgICAgICAgICAgKEcuZGlyICAgICAgICAgKQorI2RlZmluZSBzdmQgICAgICAgICAgKEcuc3ZkICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlwaWRjaGFuZ2VkID0gMTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZmF0YWwyX2Nhbm5vdChjb25zdCBjaGFyICptMSwgY29uc3QgY2hhciAqbTIpCit7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCIlczogZmF0YWw6IGNhbm5vdCAlcyVzIiwgZGlyLCBtMSwgbTIpOworCS8qIHdhcyBleGl0aW5nIDExMSAqLworfQorc3RhdGljIHZvaWQgZmF0YWxfY2Fubm90KGNvbnN0IGNoYXIgKm0pCit7CisJZmF0YWwyX2Nhbm5vdChtLCAiIik7CisJLyogd2FzIGV4aXRpbmcgMTExICovCit9CitzdGF0aWMgdm9pZCBmYXRhbDJ4X2Nhbm5vdChjb25zdCBjaGFyICptMSwgY29uc3QgY2hhciAqbTIpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBmYXRhbDogY2Fubm90ICVzJXMiLCBkaXIsIG0xLCBtMik7CisJLyogd2FzIGV4aXRpbmcgMTExICovCit9CitzdGF0aWMgdm9pZCB3YXJuX2Nhbm5vdChjb25zdCBjaGFyICptKQoreworCWJiX3BlcnJvcl9tc2coIiVzOiB3YXJuaW5nOiBjYW5ub3QgJXMiLCBkaXIsIG0pOworfQorCitzdGF0aWMgdm9pZCBzX2NoaWxkKGludCBzaWdfbm8gVU5VU0VEX1BBUkFNKQoreworCXdyaXRlKHNlbGZwaXBlLndyLCAiIiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNfdGVybShpbnQgc2lnX25vIFVOVVNFRF9QQVJBTSkKK3sKKwlzaWd0ZXJtID0gMTsKKwl3cml0ZShzZWxmcGlwZS53ciwgIiIsIDEpOyAvKiBYWFggKi8KK30KKworc3RhdGljIGludCBvcGVuX3RydW5jX29yX3dhcm4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBXaHkgT19OREVMQVk/ICovCisJaW50IGZkID0gb3BlbihuYW1lLCBPX1dST05MWSB8IE9fTkRFTEFZIHwgT19UUlVOQyB8IE9fQ1JFQVQsIDA2NDQpOworCWlmIChmZCA8IDApCisJCWJiX3BlcnJvcl9tc2coIiVzOiB3YXJuaW5nOiBjYW5ub3Qgb3BlbiAlcyIsCisJCQkJZGlyLCBuYW1lKTsKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0dXMoc3RydWN0IHN2ZGlyICpzKQoreworCXNzaXplX3Qgc3o7CisJaW50IGZkOworCXN2c3RhdHVzX3Qgc3RhdHVzOworCisJLyogcGlkICovCisJaWYgKHBpZGNoYW5nZWQpIHsKKwkJZmQgPSBvcGVuX3RydW5jX29yX3dhcm4oInN1cGVydmlzZS9waWQubmV3Iik7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm47CisJCWlmIChzLT5waWQpIHsKKwkJCWNoYXIgc3BpZFtzaXplb2YoaW50KSozICsgMl07CisJCQlpbnQgc2l6ZSA9IHNwcmludGYoc3BpZCwgIiV1XG4iLCAodW5zaWduZWQpcy0+cGlkKTsKKwkJCXdyaXRlKGZkLCBzcGlkLCBzaXplKTsKKwkJfQorCQljbG9zZShmZCk7CisJCWlmIChyZW5hbWVfb3Jfd2Fybigic3VwZXJ2aXNlL3BpZC5uZXciLAorCQkgICAgcy0+aXNsb2cgPyAibG9nL3N1cGVydmlzZS9waWQiIDogImxvZy9zdXBlcnZpc2UvcGlkIis0KSkKKwkJCXJldHVybjsKKwkJcGlkY2hhbmdlZCA9IDA7CisJfQorCisJLyogc3RhdCAqLworCWZkID0gb3Blbl90cnVuY19vcl93YXJuKCJzdXBlcnZpc2Uvc3RhdC5uZXciKTsKKwlpZiAoZmQgPCAtMSkKKwkJcmV0dXJuOworCisJeworCQljaGFyIHN0YXRfYnVmW3NpemVvZigiZmluaXNoLCBwYXVzZWQsIGdvdCBURVJNLCB3YW50IGRvd25cbiIpXTsKKwkJY2hhciAqcCA9IHN0YXRfYnVmOworCQlzd2l0Y2ggKHMtPnN0YXRlKSB7CisJCWNhc2UgU19ET1dOOgorCQkJcCA9IHN0cGNweShwLCAiZG93biIpOworCQkJYnJlYWs7CisJCWNhc2UgU19SVU46CisJCQlwID0gc3RwY3B5KHAsICJydW4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNfRklOSVNIOgorCQkJcCA9IHN0cGNweShwLCAiZmluaXNoIik7CisJCQlicmVhazsKKwkJfQorCQlpZiAocy0+Y3RybCAmIENfUEFVU0UpCisJCQlwID0gc3RwY3B5KHAsICIsIHBhdXNlZCIpOworCQlpZiAocy0+Y3RybCAmIENfVEVSTSkKKwkJCXAgPSBzdHBjcHkocCwgIiwgZ290IFRFUk0iKTsKKwkJaWYgKHMtPnN0YXRlICE9IFNfRE9XTikKKwkJCXN3aXRjaCAocy0+c2Rfd2FudCkgeworCQkJY2FzZSBXX0RPV046CisJCQkJcCA9IHN0cGNweShwLCAiLCB3YW50IGRvd24iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV19FWElUOgorCQkJCXAgPSBzdHBjcHkocCwgIiwgd2FudCBleGl0Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCSpwKysgPSAnXG4nOworCQl3cml0ZShmZCwgc3RhdF9idWYsIHAgLSBzdGF0X2J1Zik7CisJCWNsb3NlKGZkKTsKKwl9CisKKwlyZW5hbWVfb3Jfd2Fybigic3VwZXJ2aXNlL3N0YXQubmV3IiwKKwkJcy0+aXNsb2cgPyAibG9nL3N1cGVydmlzZS9zdGF0IiA6ICJsb2cvc3VwZXJ2aXNlL3N0YXQiKzQpOworCisJLyogc3VwZXJ2aXNlIGNvbXBhdGliaWxpdHkgKi8KKwltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOworCXN0YXR1cy50aW1lX2JlNjQgPSBTV0FQX0JFNjQocy0+c3RhcnQudHZfc2VjICsgMHg0MDAwMDAwMDAwMDAwMDBhVUxMKTsKKwlzdGF0dXMudGltZV9uc2VjX2JlMzIgPSBTV0FQX0JFMzIocy0+c3RhcnQudHZfbnNlYyk7CisJc3RhdHVzLnBpZF9sZTMyID0gU1dBUF9MRTMyKHMtPnBpZCk7CisJaWYgKHMtPmN0cmwgJiBDX1BBVVNFKQorCQlzdGF0dXMucGF1c2VkID0gMTsKKwlpZiAocy0+c2Rfd2FudCA9PSBXX1VQKQorCQlzdGF0dXMud2FudCA9ICd1JzsKKwllbHNlCisJCXN0YXR1cy53YW50ID0gJ2QnOworCWlmIChzLT5jdHJsICYgQ19URVJNKQorCQlzdGF0dXMuZ290X3Rlcm0gPSAxOworCXN0YXR1cy5ydW5fb3JfZmluaXNoID0gcy0+c3RhdGU7CisJZmQgPSBvcGVuX3RydW5jX29yX3dhcm4oInN1cGVydmlzZS9zdGF0dXMubmV3Iik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCXN6ID0gd3JpdGUoZmQsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKwljbG9zZShmZCk7CisJaWYgKHN6ICE9IHNpemVvZihzdGF0dXMpKSB7CisJCXdhcm5fY2Fubm90KCJ3cml0ZSBzdXBlcnZpc2Uvc3RhdHVzLm5ldyIpOworCQl1bmxpbmsoInN1cGVydmlzZS9zdGF0dXMubmV3Iik7CisJCXJldHVybjsKKwl9CisJcmVuYW1lX29yX3dhcm4oInN1cGVydmlzZS9zdGF0dXMubmV3IiwKKwkJcy0+aXNsb2cgPyAibG9nL3N1cGVydmlzZS9zdGF0dXMiIDogImxvZy9zdXBlcnZpc2Uvc3RhdHVzIis0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGN1c3RvbShzdHJ1Y3Qgc3ZkaXIgKnMsIGNoYXIgYykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHc7CisJY2hhciBhWzEwXTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzLT5pc2xvZykKKwkJcmV0dXJuIDA7CisJc3RyY3B5KGEsICJjb250cm9sLz8iKTsKKwlhWzhdID0gYzsgLyogcmVwbGFjZSAnPycgKi8KKwlpZiAoc3RhdChhLCAmc3QpID09IDApIHsKKwkJaWYgKHN0LnN0X21vZGUgJiBTX0lYVVNSKSB7CisJCQlwaWQgPSB2Zm9yaygpOworCQkJaWYgKHBpZCA9PSAtMSkgeworCQkJCXdhcm5fY2Fubm90KCJ2Zm9yayBmb3IgY29udHJvbC8/Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAocGlkID09IDApIHsKKwkJCQkvKiBjaGlsZCAqLworCQkJCWlmIChoYXNsb2cgJiYgZHVwMihsb2dwaXBlLndyLCAxKSA9PSAtMSkKKwkJCQkJd2Fybl9jYW5ub3QoInNldHVwIHN0ZG91dCBmb3IgY29udHJvbC8/Iik7CisJCQkJZXhlY2woYSwgYSwgKGNoYXIgKikgTlVMTCk7CisJCQkJZmF0YWxfY2Fubm90KCJydW4gY29udHJvbC8/Iik7CisJCQl9CisJCQkvKiBwYXJlbnQgKi8KKwkJCWlmIChzYWZlX3dhaXRwaWQocGlkLCAmdywgMCkgPT0gLTEpIHsKKwkJCQl3YXJuX2Nhbm5vdCgid2FpdCBmb3IgY2hpbGQgY29udHJvbC8/Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZXR1cm4gV0VYSVRTVEFUVVModykgPT0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQl3YXJuX2Nhbm5vdCgic3RhdCBjb250cm9sLz8iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BzZXJ2aWNlKHN0cnVjdCBzdmRpciAqcykKK3sKKwlpZiAocy0+cGlkICYmICFjdXN0b20ocywgJ3QnKSkgeworCQlraWxsKHMtPnBpZCwgU0lHVEVSTSk7CisJCXMtPmN0cmwgfD0gQ19URVJNOworCQl1cGRhdGVfc3RhdHVzKHMpOworCX0KKwlpZiAocy0+c2Rfd2FudCA9PSBXX0RPV04pIHsKKwkJa2lsbChzLT5waWQsIFNJR0NPTlQpOworCQljdXN0b20ocywgJ2QnKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocy0+c2Rfd2FudCA9PSBXX0VYSVQpIHsKKwkJa2lsbChzLT5waWQsIFNJR0NPTlQpOworCQljdXN0b20ocywgJ3gnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0c2VydmljZShzdHJ1Y3Qgc3ZkaXIgKnMpCit7CisJaW50IHA7CisJY29uc3QgY2hhciAqYXJnWzRdOworCWNoYXIgZXhpdGNvZGVbc2l6ZW9mKGludCkqMyArIDJdOworCisJaWYgKHMtPnN0YXRlID09IFNfRklOSVNIKSB7CisvKiBUd28gYXJndW1lbnRzIGFyZSBnaXZlbiB0byAuL2ZpbmlzaC4gVGhlIGZpcnN0IG9uZSBpcyAuL3J1biBleGl0IGNvZGUsCisgKiBvciAtMSBpZiAuL3J1biBkaWRudCBleGl0IG5vcm1hbGx5LiBUaGUgc2Vjb25kIG9uZSBpcworICogdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgdGhlIGV4aXQgc3RhdHVzIGFzIGRldGVybWluZWQgYnkgd2FpdHBpZDsKKyAqIGZvciBpbnN0YW5jZSBpdCBpcyAwIGlmIC4vcnVuIGV4aXRlZCBub3JtYWxseSwgYW5kIHRoZSBzaWduYWwgbnVtYmVyCisgKiBpZiAuL3J1biB3YXMgdGVybWluYXRlZCBieSBhIHNpZ25hbC4gSWYgcnVuc3YgY2Fubm90IHN0YXJ0IC4vcnVuCisgKiBmb3Igc29tZSByZWFzb24sIHRoZSBleGl0IGNvZGUgaXMgMTExIGFuZCB0aGUgc3RhdHVzIGlzIDAuCisgKi8KKwkJYXJnWzBdID0gIi4vZmluaXNoIjsKKwkJYXJnWzFdID0gIi0xIjsKKwkJaWYgKFdJRkVYSVRFRChzLT53c3RhdCkpIHsKKwkJCSp1dG9hX3RvX2J1ZihXRVhJVFNUQVRVUyhzLT53c3RhdCksIGV4aXRjb2RlLCBzaXplb2YoZXhpdGNvZGUpKSA9ICdcMCc7CisJCQlhcmdbMV0gPSBleGl0Y29kZTsKKwkJfQorCQkvL2FyZ1syXSA9ICIwIjsKKwkJLy9pZiAoV0lGU0lHTkFMRUQocy0+d3N0YXQpKSB7CisJCQlhcmdbMl0gPSB1dG9hKFdURVJNU0lHKHMtPndzdGF0KSk7CisJCS8vfQorCQlhcmdbM10gPSBOVUxMOworCX0gZWxzZSB7CisJCWFyZ1swXSA9ICIuL3J1biI7CisJCWFyZ1sxXSA9IE5VTEw7CisJCWN1c3RvbShzLCAndScpOworCX0KKworCWlmIChzLT5waWQgIT0gMCkKKwkJc3RvcHNlcnZpY2Uocyk7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwl3aGlsZSAoKHAgPSB2Zm9yaygpKSA9PSAtMSkgeworCQl3YXJuX2Nhbm5vdCgidmZvcmssIHNsZWVwaW5nIik7CisJCXNsZWVwKDUpOworCX0KKwlpZiAocCA9PSAwKSB7CisJCS8qIGNoaWxkICovCisJCWlmIChoYXNsb2cpIHsKKwkJCS8qIE5COiBidWcgYWxlcnQhIHJpZ2h0IG9yZGVyIGlzIGNsb3NlLCB0aGVuIGR1cDIgKi8KKwkJCWlmIChzLT5pc2xvZykgeworCQkJCXhjaGRpcigiLi9sb2ciKTsKKwkJCQljbG9zZShsb2dwaXBlLndyKTsKKwkJCQl4ZHVwMihsb2dwaXBlLnJkLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xvc2UobG9ncGlwZS5yZCk7CisJCQkJeGR1cDIobG9ncGlwZS53ciwgMSk7CisJCQl9CisJCX0KKwkJLyogTm9uLWlnbm9yZWQgc2lnbmFscyByZXZlcnQgdG8gU0lHX0RGTCBvbiBleGVjIGFueXdheSAqLworCQkvKmJiX3NpZ25hbHMoMAorCQkJKyAoMSA8PCBTSUdDSExEKQorCQkJKyAoMSA8PCBTSUdURVJNKQorCQkJLCBTSUdfREZMKTsqLworCQlzaWdfdW5ibG9jayhTSUdDSExEKTsKKwkJc2lnX3VuYmxvY2soU0lHVEVSTSk7CisJCWV4ZWN2KGFyZ1swXSwgKGNoYXIqKikgYXJnKTsKKwkJZmF0YWwyX2Nhbm5vdChzLT5pc2xvZyA/ICJzdGFydCBsb2cvIiA6ICJzdGFydCAiLCBhcmdbMF0pOworCX0KKwkvKiBwYXJlbnQgKi8KKwlpZiAocy0+c3RhdGUgIT0gU19GSU5JU0gpIHsKKwkJZ2V0dGltZW9mZGF5X25zKCZzLT5zdGFydCk7CisJCXMtPnN0YXRlID0gU19SVU47CisJfQorCXMtPnBpZCA9IHA7CisJcGlkY2hhbmdlZCA9IDE7CisJcy0+Y3RybCA9IENfTk9PUDsKKwl1cGRhdGVfc3RhdHVzKHMpOworfQorCitzdGF0aWMgaW50IGN0cmwoc3RydWN0IHN2ZGlyICpzLCBjaGFyIGMpCit7CisJaW50IHNpZzsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJ2QnOiAvKiBkb3duICovCisJCXMtPnNkX3dhbnQgPSBXX0RPV047CisJCXVwZGF0ZV9zdGF0dXMocyk7CisJCWlmIChzLT5waWQgJiYgcy0+c3RhdGUgIT0gU19GSU5JU0gpCisJCQlzdG9wc2VydmljZShzKTsKKwkJYnJlYWs7CisJY2FzZSAndSc6IC8qIHVwICovCisJCXMtPnNkX3dhbnQgPSBXX1VQOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQlpZiAocy0+cGlkID09IDApCisJCQlzdGFydHNlcnZpY2Uocyk7CisJCWJyZWFrOworCWNhc2UgJ3gnOiAvKiBleGl0ICovCisJCWlmIChzLT5pc2xvZykKKwkJCWJyZWFrOworCQlzLT5zZF93YW50ID0gV19FWElUOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgJ3QnOiAvKiBzaWcgdGVybSAqLworCQlpZiAocy0+cGlkICYmIHMtPnN0YXRlICE9IFNfRklOSVNIKQorCQkJc3RvcHNlcnZpY2Uocyk7CisJCWJyZWFrOworCWNhc2UgJ2snOiAvKiBzaWcga2lsbCAqLworCQlpZiAocy0+cGlkICYmICFjdXN0b20ocywgYykpCisJCQlraWxsKHMtPnBpZCwgU0lHS0lMTCk7CisJCXMtPnN0YXRlID0gU19ET1dOOworCQlicmVhazsKKwljYXNlICdwJzogLyogc2lnIHBhdXNlICovCisJCWlmIChzLT5waWQgJiYgIWN1c3RvbShzLCBjKSkKKwkJCWtpbGwocy0+cGlkLCBTSUdTVE9QKTsKKwkJcy0+Y3RybCB8PSBDX1BBVVNFOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQlicmVhazsKKwljYXNlICdjJzogLyogc2lnIGNvbnQgKi8KKwkJaWYgKHMtPnBpZCAmJiAhY3VzdG9tKHMsIGMpKQorCQkJa2lsbChzLT5waWQsIFNJR0NPTlQpOworCQlzLT5jdHJsICY9IH5DX1BBVVNFOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQlicmVhazsKKwljYXNlICdvJzogLyogb25jZSAqLworCQlzLT5zZF93YW50ID0gV19ET1dOOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQlpZiAoIXMtPnBpZCkKKwkJCXN0YXJ0c2VydmljZShzKTsKKwkJYnJlYWs7CisJY2FzZSAnYSc6IC8qIHNpZyBhbGFybSAqLworCQlzaWcgPSBTSUdBTFJNOworCQlnb3RvIHNlbmRzaWc7CisJY2FzZSAnaCc6IC8qIHNpZyBodXAgKi8KKwkJc2lnID0gU0lHSFVQOworCQlnb3RvIHNlbmRzaWc7CisJY2FzZSAnaSc6IC8qIHNpZyBpbnQgKi8KKwkJc2lnID0gU0lHSU5UOworCQlnb3RvIHNlbmRzaWc7CisJY2FzZSAncSc6IC8qIHNpZyBxdWl0ICovCisJCXNpZyA9IFNJR1FVSVQ7CisJCWdvdG8gc2VuZHNpZzsKKwljYXNlICcxJzogLyogc2lnIHVzcjEgKi8KKwkJc2lnID0gU0lHVVNSMTsKKwkJZ290byBzZW5kc2lnOworCWNhc2UgJzInOiAvKiBzaWcgdXNyMiAqLworCQlzaWcgPSBTSUdVU1IyOworCQlnb3RvIHNlbmRzaWc7CisJfQorCXJldHVybiAxOworIHNlbmRzaWc6CisJaWYgKHMtPnBpZCAmJiAhY3VzdG9tKHMsIGMpKQorCQlraWxsKHMtPnBpZCwgc2lnKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHJ1bnN2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBydW5zdl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgczsKKwlpbnQgZmQ7CisJaW50IHI7CisJY2hhciBidWZbMjU2XTsKKworCUlOSVRfRygpOworCisJZGlyID0gc2luZ2xlX2FyZ3YoYXJndik7CisKKwl4cGlwZWRfcGFpcihzZWxmcGlwZSk7CisJY2xvc2Vfb25fZXhlY19vbihzZWxmcGlwZS5yZCk7CisJY2xvc2Vfb25fZXhlY19vbihzZWxmcGlwZS53cik7CisJbmRlbGF5X29uKHNlbGZwaXBlLnJkKTsKKwluZGVsYXlfb24oc2VsZnBpcGUud3IpOworCisJc2lnX2Jsb2NrKFNJR0NITEQpOworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgxIDw8IFNJR0NITEQsIHNfY2hpbGQpOworCXNpZ19ibG9jayhTSUdURVJNKTsKKwliYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoMSA8PCBTSUdURVJNLCBzX3Rlcm0pOworCisJeGNoZGlyKGRpcik7CisJLyogYnNzOiBzdmRbMF0ucGlkID0gMDsgKi8KKwlpZiAoU19ET1dOKSBzdmRbMF0uc3RhdGUgPSBTX0RPV047IC8qIG90aGVyd2lzZSBhbHJlYWR5IDAgKGJzcykgKi8KKwlpZiAoQ19OT09QKSBzdmRbMF0uY3RybCA9IENfTk9PUDsKKwlpZiAoV19VUCkgc3ZkWzBdLnNkX3dhbnQgPSBXX1VQOworCS8qIGJzczogc3ZkWzBdLmlzbG9nID0gMDsgKi8KKwkvKiBic3M6IHN2ZFsxXS5waWQgPSAwOyAqLworCWdldHRpbWVvZmRheV9ucygmc3ZkWzBdLnN0YXJ0KTsKKwlpZiAoc3RhdCgiZG93biIsICZzKSAhPSAtMSkKKwkJc3ZkWzBdLnNkX3dhbnQgPSBXX0RPV047CisKKwlpZiAoc3RhdCgibG9nIiwgJnMpID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQl3YXJuX2Nhbm5vdCgic3RhdCAuL2xvZyIpOworCX0gZWxzZSB7CisJCWlmICghU19JU0RJUihzLnN0X21vZGUpKSB7CisJCQllcnJubyA9IDA7CisJCQl3YXJuX2Nhbm5vdCgic3RhdCBsb2cvZG93bjogbG9nIGlzIG5vdCBhIGRpcmVjdG9yeSIpOworCQl9IGVsc2UgeworCQkJaGFzbG9nID0gMTsKKwkJCXN2ZFsxXS5zdGF0ZSA9IFNfRE9XTjsKKwkJCXN2ZFsxXS5jdHJsID0gQ19OT09QOworCQkJc3ZkWzFdLnNkX3dhbnQgPSBXX1VQOworCQkJc3ZkWzFdLmlzbG9nID0gMTsKKwkJCWdldHRpbWVvZmRheV9ucygmc3ZkWzFdLnN0YXJ0KTsKKwkJCWlmIChzdGF0KCJsb2cvZG93biIsICZzKSAhPSAtMSkKKwkJCQlzdmRbMV0uc2Rfd2FudCA9IFdfRE9XTjsKKwkJCXhwaXBlZF9wYWlyKGxvZ3BpcGUpOworCQkJY2xvc2Vfb25fZXhlY19vbihsb2dwaXBlLnJkKTsKKwkJCWNsb3NlX29uX2V4ZWNfb24obG9ncGlwZS53cik7CisJCX0KKwl9CisKKwlpZiAobWtkaXIoInN1cGVydmlzZSIsIDA3MDApID09IC0xKSB7CisJCXIgPSByZWFkbGluaygic3VwZXJ2aXNlIiwgYnVmLCBzaXplb2YoYnVmKSk7CisJCWlmIChyICE9IC0xKSB7CisJCQlpZiAociA9PSBzaXplb2YoYnVmKSkKKwkJCQlmYXRhbDJ4X2Nhbm5vdCgicmVhZGxpbmsgLi9zdXBlcnZpc2UiLCAiOiBuYW1lIHRvbyBsb25nIik7CisJCQlidWZbcl0gPSAwOworCQkJbWtkaXIoYnVmLCAwNzAwKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoZXJybm8gIT0gRU5PRU5UKSAmJiAoZXJybm8gIT0gRUlOVkFMKSkKKwkJCQlmYXRhbF9jYW5ub3QoInJlYWRsaW5rIC4vc3VwZXJ2aXNlIik7CisJCX0KKwl9CisJc3ZkWzBdLmZkbG9jayA9IHhvcGVuMygibG9nL3N1cGVydmlzZS9sb2NrIis0LAorCQkJT19XUk9OTFl8T19OREVMQVl8T19BUFBFTkR8T19DUkVBVCwgMDYwMCk7CisJaWYgKGZsb2NrKHN2ZFswXS5mZGxvY2ssIExPQ0tfRVggfCBMT0NLX05CKSA9PSAtMSkKKwkJZmF0YWxfY2Fubm90KCJsb2NrIHN1cGVydmlzZS9sb2NrIik7CisJY2xvc2Vfb25fZXhlY19vbihzdmRbMF0uZmRsb2NrKTsKKwlpZiAoaGFzbG9nKSB7CisJCWlmIChta2RpcigibG9nL3N1cGVydmlzZSIsIDA3MDApID09IC0xKSB7CisJCQlyID0gcmVhZGxpbmsoImxvZy9zdXBlcnZpc2UiLCBidWYsIDI1Nik7CisJCQlpZiAociAhPSAtMSkgeworCQkJCWlmIChyID09IDI1NikKKwkJCQkJZmF0YWwyeF9jYW5ub3QoInJlYWRsaW5rIC4vbG9nL3N1cGVydmlzZSIsICI6IG5hbWUgdG9vIGxvbmciKTsKKwkJCQlidWZbcl0gPSAwOworCQkJCWZkID0geG9wZW4oIi4iLCBPX1JET05MWXxPX05ERUxBWSk7CisJCQkJeGNoZGlyKCIuL2xvZyIpOworCQkJCW1rZGlyKGJ1ZiwgMDcwMCk7CisJCQkJaWYgKGZjaGRpcihmZCkgPT0gLTEpCisJCQkJCWZhdGFsX2Nhbm5vdCgiY2hhbmdlIGJhY2sgdG8gc2VydmljZSBkaXJlY3RvcnkiKTsKKwkJCQljbG9zZShmZCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoKGVycm5vICE9IEVOT0VOVCkgJiYgKGVycm5vICE9IEVJTlZBTCkpCisJCQkJCWZhdGFsX2Nhbm5vdCgicmVhZGxpbmsgLi9sb2cvc3VwZXJ2aXNlIik7CisJCQl9CisJCX0KKwkJc3ZkWzFdLmZkbG9jayA9IHhvcGVuMygibG9nL3N1cGVydmlzZS9sb2NrIiwKKwkJCQlPX1dST05MWXxPX05ERUxBWXxPX0FQUEVORHxPX0NSRUFULCAwNjAwKTsKKwkJaWYgKGZsb2NrKHN2ZFsxXS5mZGxvY2ssIExPQ0tfRVgpID09IC0xKQorCQkJZmF0YWxfY2Fubm90KCJsb2NrIGxvZy9zdXBlcnZpc2UvbG9jayIpOworCQljbG9zZV9vbl9leGVjX29uKHN2ZFsxXS5mZGxvY2spOworCX0KKworCW1rZmlmbygibG9nL3N1cGVydmlzZS9jb250cm9sIis0LCAwNjAwKTsKKwlzdmRbMF0uZmRjb250cm9sID0geG9wZW4oImxvZy9zdXBlcnZpc2UvY29udHJvbCIrNCwgT19SRE9OTFl8T19OREVMQVkpOworCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzBdLmZkY29udHJvbCk7CisJc3ZkWzBdLmZkY29udHJvbHdyaXRlID0geG9wZW4oImxvZy9zdXBlcnZpc2UvY29udHJvbCIrNCwgT19XUk9OTFl8T19OREVMQVkpOworCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzBdLmZkY29udHJvbHdyaXRlKTsKKwl1cGRhdGVfc3RhdHVzKCZzdmRbMF0pOworCWlmIChoYXNsb2cpIHsKKwkJbWtmaWZvKCJsb2cvc3VwZXJ2aXNlL2NvbnRyb2wiLCAwNjAwKTsKKwkJc3ZkWzFdLmZkY29udHJvbCA9IHhvcGVuKCJsb2cvc3VwZXJ2aXNlL2NvbnRyb2wiLCBPX1JET05MWXxPX05ERUxBWSk7CisJCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzFdLmZkY29udHJvbCk7CisJCXN2ZFsxXS5mZGNvbnRyb2x3cml0ZSA9IHhvcGVuKCJsb2cvc3VwZXJ2aXNlL2NvbnRyb2wiLCBPX1dST05MWXxPX05ERUxBWSk7CisJCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzFdLmZkY29udHJvbHdyaXRlKTsKKwkJdXBkYXRlX3N0YXR1cygmc3ZkWzFdKTsKKwl9CisJbWtmaWZvKCJsb2cvc3VwZXJ2aXNlL29rIis0LCAwNjAwKTsKKwlmZCA9IHhvcGVuKCJsb2cvc3VwZXJ2aXNlL29rIis0LCBPX1JET05MWXxPX05ERUxBWSk7CisJY2xvc2Vfb25fZXhlY19vbihmZCk7CisJaWYgKGhhc2xvZykgeworCQlta2ZpZm8oImxvZy9zdXBlcnZpc2Uvb2siLCAwNjAwKTsKKwkJZmQgPSB4b3BlbigibG9nL3N1cGVydmlzZS9vayIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwkJY2xvc2Vfb25fZXhlY19vbihmZCk7CisJfQorCWZvciAoOzspIHsKKwkJc3RydWN0IHBvbGxmZCB4WzNdOworCQl1bnNpZ25lZCBkZWFkbGluZTsKKwkJY2hhciBjaDsKKworCQlpZiAoaGFzbG9nKQorCQkJaWYgKCFzdmRbMV0ucGlkICYmIHN2ZFsxXS5zZF93YW50ID09IFdfVVApCisJCQkJc3RhcnRzZXJ2aWNlKCZzdmRbMV0pOworCQlpZiAoIXN2ZFswXS5waWQpCisJCQlpZiAoc3ZkWzBdLnNkX3dhbnQgPT0gV19VUCB8fCBzdmRbMF0uc3RhdGUgPT0gU19GSU5JU0gpCisJCQkJc3RhcnRzZXJ2aWNlKCZzdmRbMF0pOworCisJCXhbMF0uZmQgPSBzZWxmcGlwZS5yZDsKKwkJeFswXS5ldmVudHMgPSBQT0xMSU47CisJCXhbMV0uZmQgPSBzdmRbMF0uZmRjb250cm9sOworCQl4WzFdLmV2ZW50cyA9IFBPTExJTjsKKwkJLyogeFsyXSBpcyB1c2VkIG9ubHkgaWYgaGFzbG9nID09IDEgKi8KKwkJeFsyXS5mZCA9IHN2ZFsxXS5mZGNvbnRyb2w7CisJCXhbMl0uZXZlbnRzID0gUE9MTElOOworCQlzaWdfdW5ibG9jayhTSUdURVJNKTsKKwkJc2lnX3VuYmxvY2soU0lHQ0hMRCk7CisJCXBvbGwoeCwgMiArIGhhc2xvZywgMzYwMCoxMDAwKTsKKwkJc2lnX2Jsb2NrKFNJR1RFUk0pOworCQlzaWdfYmxvY2soU0lHQ0hMRCk7CisKKwkJd2hpbGUgKHJlYWQoc2VsZnBpcGUucmQsICZjaCwgMSkgPT0gMSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoOzspIHsKKwkJCXBpZF90IGNoaWxkOworCQkJaW50IHdzdGF0OworCisJCQljaGlsZCA9IHdhaXRfYW55X25vaGFuZygmd3N0YXQpOworCQkJaWYgKCFjaGlsZCkKKwkJCQlicmVhazsKKwkJCWlmICgoY2hpbGQgPT0gLTEpICYmIChlcnJubyAhPSBFSU5UUikpCisJCQkJYnJlYWs7CisJCQlpZiAoY2hpbGQgPT0gc3ZkWzBdLnBpZCkgeworCQkJCXN2ZFswXS53c3RhdCA9IHdzdGF0OworCQkJCXN2ZFswXS5waWQgPSAwOworCQkJCXBpZGNoYW5nZWQgPSAxOworCQkJCXN2ZFswXS5jdHJsICY9IH5DX1RFUk07CisJCQkJaWYgKHN2ZFswXS5zdGF0ZSAhPSBTX0ZJTklTSCkgeworCQkJCQlmZCA9IG9wZW4oImZpbmlzaCIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwkJCQkJaWYgKGZkICE9IC0xKSB7CisJCQkJCQljbG9zZShmZCk7CisJCQkJCQlzdmRbMF0uc3RhdGUgPSBTX0ZJTklTSDsKKwkJCQkJCXVwZGF0ZV9zdGF0dXMoJnN2ZFswXSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlzdmRbMF0uc3RhdGUgPSBTX0RPV047CisJCQkJZGVhZGxpbmUgPSBzdmRbMF0uc3RhcnQudHZfc2VjICsgMTsKKwkJCQlnZXR0aW1lb2ZkYXlfbnMoJnN2ZFswXS5zdGFydCk7CisJCQkJdXBkYXRlX3N0YXR1cygmc3ZkWzBdKTsKKwkJCQlpZiAoTEVTUyhzdmRbMF0uc3RhcnQudHZfc2VjLCBkZWFkbGluZSkpCisJCQkJCXNsZWVwKDEpOworCQkJfQorCQkJaWYgKGhhc2xvZykgeworCQkJCWlmIChjaGlsZCA9PSBzdmRbMV0ucGlkKSB7CisJCQkJCXN2ZFswXS53c3RhdCA9IHdzdGF0OworCQkJCQlzdmRbMV0ucGlkID0gMDsKKwkJCQkJcGlkY2hhbmdlZCA9IDE7CisJCQkJCXN2ZFsxXS5zdGF0ZSA9IFNfRE9XTjsKKwkJCQkJc3ZkWzFdLmN0cmwgJj0gfkNfVEVSTTsKKwkJCQkJZGVhZGxpbmUgPSBzdmRbMV0uc3RhcnQudHZfc2VjICsgMTsKKwkJCQkJZ2V0dGltZW9mZGF5X25zKCZzdmRbMV0uc3RhcnQpOworCQkJCQl1cGRhdGVfc3RhdHVzKCZzdmRbMV0pOworCQkJCQlpZiAoTEVTUyhzdmRbMV0uc3RhcnQudHZfc2VjLCBkZWFkbGluZSkpCisJCQkJCQlzbGVlcCgxKTsKKwkJCQl9CisJCQl9CisJCX0gLyogZm9yICg7OykgKi8KKwkJaWYgKHJlYWQoc3ZkWzBdLmZkY29udHJvbCwgJmNoLCAxKSA9PSAxKQorCQkJY3RybCgmc3ZkWzBdLCBjaCk7CisJCWlmIChoYXNsb2cpCisJCQlpZiAocmVhZChzdmRbMV0uZmRjb250cm9sLCAmY2gsIDEpID09IDEpCisJCQkJY3RybCgmc3ZkWzFdLCBjaCk7CisKKwkJaWYgKHNpZ3Rlcm0pIHsKKwkJCWN0cmwoJnN2ZFswXSwgJ3gnKTsKKwkJCXNpZ3Rlcm0gPSAwOworCQl9CisKKwkJaWYgKHN2ZFswXS5zZF93YW50ID09IFdfRVhJVCAmJiBzdmRbMF0uc3RhdGUgPT0gU19ET1dOKSB7CisJCQlpZiAoc3ZkWzFdLnBpZCA9PSAwKQorCQkJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCQlpZiAoc3ZkWzFdLnNkX3dhbnQgIT0gV19FWElUKSB7CisJCQkJc3ZkWzFdLnNkX3dhbnQgPSBXX0VYSVQ7CisJCQkJLyogc3RvcHNlcnZpY2UoJnN2ZFsxXSk7ICovCisJCQkJdXBkYXRlX3N0YXR1cygmc3ZkWzFdKTsKKwkJCQljbG9zZShsb2dwaXBlLndyKTsKKwkJCQljbG9zZShsb2dwaXBlLnJkKTsKKwkJCX0KKwkJfQorCX0gLyogZm9yICg7OykgKi8KKwkvKiBub3QgcmVhY2hlZCAqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcnVuaXQvcnVuc3ZkaXIuYyBiL2J1c3lib3gtMS4xOS4zL3J1bml0L3J1bnN2ZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NWEyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3J1bml0L3J1bnN2ZGlyLmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgR2Vycml0IFBhcGUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CitPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCitBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qIEJ1c3lib3hlZCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPiAqLworLyogVE9ETzogZGVwZW5kcyBvbiBydW5pdF9saWIuYyAtIHJldmlldyBhbmQgcmVkdWNlL2VsaW1pbmF0ZSAqLworCisvL3VzYWdlOiNkZWZpbmUgcnVuc3ZkaXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUF0gWy1zIFNDUklQVF0gRElSIgorLy91c2FnZTojZGVmaW5lIHJ1bnN2ZGlyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3RhcnQgYSBydW5zdiBwcm9jZXNzIGZvciBlYWNoIHN1YmRpcmVjdG9yeS4gSWYgaXQgZXhpdHMsIHJlc3RhcnQgaXQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1QCQlQdXQgZWFjaCBydW5zdiBpbiBhIG5ldyBzZXNzaW9uIgorLy91c2FnZTogICAgICJcbgktcyBTQ1JJUFQJUnVuIFNDUklQVCA8c2lnbm8+IGFmdGVyIHNpZ25hbCBpcyBwcm9jZXNzZWQiCisKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJydW5pdF9saWIuaCIKKworI2RlZmluZSBNQVhTRVJWSUNFUyAxMDAwCisKKy8qIFNob3VsZCBiZSBub3QgbmVlZGVkIC0gYWxsIGRpcnMgYXJlIG9uIHNhbWUgRlMsIHJpZ2h0PyAqLworI2RlZmluZSBDSEVDS19ERVZOT19UT08gMAorCitzdHJ1Y3Qgc2VydmljZSB7CisjaWYgQ0hFQ0tfREVWTk9fVE9PCisJZGV2X3QgZGV2OworI2VuZGlmCisJaW5vX3QgaW5vOworCXBpZF90IHBpZDsKKwlzbWFsbGludCBpc2dvbmU7Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IHNlcnZpY2UgKnN2OworCWNoYXIgKnN2ZGlyOworCWludCBzdm51bTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5TVkRJUl9MT0cKKwljaGFyICpycGxvZzsKKwlpbnQgcnBsb2dsZW47CisJc3RydWN0IGZkX3BhaXIgbG9ncGlwZTsKKwlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKwl1bnNpZ25lZCBzdGFtcGxvZzsKKyNlbmRpZgorfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgc3YgICAgICAgICAgKEcuc3YgICAgICAgICAgKQorI2RlZmluZSBzdmRpciAgICAgICAoRy5zdmRpciAgICAgICApCisjZGVmaW5lIHN2bnVtICAgICAgIChHLnN2bnVtICAgICAgICkKKyNkZWZpbmUgcnBsb2cgICAgICAgKEcucnBsb2cgICAgICAgKQorI2RlZmluZSBycGxvZ2xlbiAgICAoRy5ycGxvZ2xlbiAgICApCisjZGVmaW5lIGxvZ3BpcGUgICAgIChHLmxvZ3BpcGUgICAgICkKKyNkZWZpbmUgcGZkICAgICAgICAgKEcucGZkICAgICAgICAgKQorI2RlZmluZSBzdGFtcGxvZyAgICAoRy5zdGFtcGxvZyAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZmF0YWwyX2Nhbm5vdChjb25zdCBjaGFyICptMSwgY29uc3QgY2hhciAqbTIpCit7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCIlczogZmF0YWw6IGNhbid0ICVzJXMiLCBzdmRpciwgbTEsIG0yKTsKKwkvKiB3YXMgZXhpdGluZyAxMDAgKi8KK30KK3N0YXRpYyB2b2lkIHdhcm4zeChjb25zdCBjaGFyICptMSwgY29uc3QgY2hhciAqbTIsIGNvbnN0IGNoYXIgKm0zKQoreworCWJiX2Vycm9yX21zZygiJXM6IHdhcm5pbmc6ICVzJXMlcyIsIHN2ZGlyLCBtMSwgbTIsIG0zKTsKK30KK3N0YXRpYyB2b2lkIHdhcm4yX2Nhbm5vdChjb25zdCBjaGFyICptMSwgY29uc3QgY2hhciAqbTIpCit7CisJd2FybjN4KCJjYW4ndCAiLCBtMSwgbTIpOworfQorI2lmIEVOQUJMRV9GRUFUVVJFX1JVTlNWRElSX0xPRworc3RhdGljIHZvaWQgd2FybngoY29uc3QgY2hhciAqbTEpCit7CisJd2FybjN4KG0xLCAiIiwgIiIpOworfQorI2VuZGlmCisKKy8qIGlubGluaW5nICsgdmZvcmsgLT4gYmlnZ2VyIGNvZGUgKi8KK3N0YXRpYyBOT0lOTElORSBwaWRfdCBydW5zdihjb25zdCBjaGFyICpuYW1lKQoreworCXBpZF90IHBpZDsKKworCS8qIElmIHdlIGdvdCBzaWduYWxlZCwgc3RvcCBzcGF3bmluZyBjaGlsZHJlbiBhdCBvbmNlISAqLworCWlmIChiYl9nb3Rfc2lnbmFsKQorCQlyZXR1cm4gMDsKKworCXBpZCA9IHZmb3JrKCk7CisJaWYgKHBpZCA9PSAtMSkgeworCQl3YXJuMl9jYW5ub3QoInZmb3JrIiwgIiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIGNoaWxkICovCisJCWlmIChvcHRpb25fbWFzazMyICYgMSkgLyogLVAgb3B0aW9uPyAqLworCQkJc2V0c2lkKCk7CisvKiBtYW4gZXhlY3Y6CisgKiAiU2lnbmFscyBzZXQgdG8gYmUgY2F1Z2h0IGJ5IHRoZSBjYWxsaW5nIHByb2Nlc3MgaW1hZ2UKKyAqICBzaGFsbCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQgYWN0aW9uIGluIHRoZSBuZXcgcHJvY2VzcyBpbWFnZS4iCisgKiBUaGVyZWZvcmUsIHdlIGRvIG5vdCBuZWVkIHRoaXM6ICovCisjaWYgMAorCQliYl9zaWduYWxzKDAKKwkJCXwgKDEgPDwgU0lHSFVQKQorCQkJfCAoMSA8PCBTSUdURVJNKQorCQkJLCBTSUdfREZMKTsKKyNlbmRpZgorCQlleGVjbHAoInJ1bnN2IiwgInJ1bnN2IiwgbmFtZSwgKGNoYXIgKikgTlVMTCk7CisJCWZhdGFsMl9jYW5ub3QoInN0YXJ0IHJ1bnN2ICIsIG5hbWUpOworCX0KKwlyZXR1cm4gcGlkOworfQorCisvKiBnY2MgNC4zLjAgZG9lcyBiZXR0ZXIgd2l0aCBOT0lOTElORSAqLworc3RhdGljIE5PSU5MSU5FIGludCBkb19yZXNjYW4odm9pZCkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkOworCWludCBpOworCXN0cnVjdCBzdGF0IHM7CisJaW50IG5lZWRfcmVzY2FuID0gMDsKKworCWRpciA9IG9wZW5kaXIoIi4iKTsKKwlpZiAoIWRpcikgeworCQl3YXJuMl9jYW5ub3QoIm9wZW4gZGlyZWN0b3J5ICIsIHN2ZGlyKTsKKwkJcmV0dXJuIDE7IC8qIG5lZWQgdG8gcmVzY2FuIGFnYWluIHNvb24gKi8KKwl9CisJZm9yIChpID0gMDsgaSA8IHN2bnVtOyBpKyspCisJCXN2W2ldLmlzZ29uZSA9IDE7CisKKwl3aGlsZSAoMSkgeworCQllcnJubyA9IDA7CisJCWQgPSByZWFkZGlyKGRpcik7CisJCWlmICghZCkKKwkJCWJyZWFrOworCQlpZiAoZC0+ZF9uYW1lWzBdID09ICcuJykKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RhdChkLT5kX25hbWUsICZzKSA9PSAtMSkgeworCQkJd2FybjJfY2Fubm90KCJzdGF0ICIsIGQtPmRfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIVNfSVNESVIocy5zdF9tb2RlKSkKKwkJCWNvbnRpbnVlOworCQkvKiBEbyB3ZSBoYXZlIHRoaXMgc2VydmljZSBsaXN0ZWQgYWxyZWFkeT8gKi8KKwkJZm9yIChpID0gMDsgaSA8IHN2bnVtOyBpKyspIHsKKwkJCWlmICgoc3ZbaV0uaW5vID09IHMuc3RfaW5vKQorI2lmIENIRUNLX0RFVk5PX1RPTworCQkJICYmIChzdltpXS5kZXYgPT0gcy5zdF9kZXYpCisjZW5kaWYKKwkJCSkgeworCQkJCWlmIChzdltpXS5waWQgPT0gMCkgLyogcmVzdGFydCBpZiBpdCBoYXMgZGllZCAqLworCQkJCQlnb3RvIHJ1bl9pdGhfc3Y7CisJCQkJc3ZbaV0uaXNnb25lID0gMDsgLyogIndlIHN0aWxsIHNlZSB5b3UiICovCisJCQkJZ290byBuZXh0X2RlbnRyeTsKKwkJCX0KKwkJfQorCQl7IC8qIE5vdCBmb3VuZCwgbWFrZSBuZXcgc2VydmljZSAqLworCQkJc3RydWN0IHNlcnZpY2UgKnN2bmV3ID0gcmVhbGxvYyhzdiwgKGkrMSkgKiBzaXplb2YoKnN2KSk7CisJCQlpZiAoIXN2bmV3KSB7CisJCQkJd2FybjJfY2Fubm90KCJzdGFydCBydW5zdiAiLCBkLT5kX25hbWUpOworCQkJCW5lZWRfcmVzY2FuID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXN2ID0gc3ZuZXc7CisJCQlzdm51bSsrOworI2lmIENIRUNLX0RFVk5PX1RPTworCQkJc3ZbaV0uZGV2ID0gcy5zdF9kZXY7CisjZW5kaWYKKwkJCXN2W2ldLmlubyA9IHMuc3RfaW5vOworIHJ1bl9pdGhfc3Y6CisJCQlzdltpXS5waWQgPSBydW5zdihkLT5kX25hbWUpOworCQkJc3ZbaV0uaXNnb25lID0gMDsKKwkJfQorIG5leHRfZGVudHJ5OiA7CisJfQorCWkgPSBlcnJubzsKKwljbG9zZWRpcihkaXIpOworCWlmIChpKSB7IC8qIHJlYWRkaXIgZmFpbGVkICovCisJCXdhcm4yX2Nhbm5vdCgicmVhZCBkaXJlY3RvcnkgIiwgc3ZkaXIpOworCQlyZXR1cm4gMTsgLyogbmVlZCB0byByZXNjYW4gYWdhaW4gc29vbiAqLworCX0KKworCS8qIFNlbmQgU0lHVEVSTSB0byBydW5zdiB3aG9zZSBkaXJlY3RvcmllcworCSAqIHdlcmUgbm8gbG9uZ2VyIGZvdW5kICgtPiBtdXN0IGhhdmUgYmVlbiByZW1vdmVkKSAqLworCWZvciAoaSA9IDA7IGkgPCBzdm51bTsgaSsrKSB7CisJCWlmICghc3ZbaV0uaXNnb25lKQorCQkJY29udGludWU7CisJCWlmIChzdltpXS5waWQpCisJCQlraWxsKHN2W2ldLnBpZCwgU0lHVEVSTSk7CisJCXN2bnVtLS07CisJCXN2W2ldID0gc3Zbc3ZudW1dOworCQlpLS07IC8qIHNvIHRoYXQgd2UgZG9uJ3Qgc2tpcCBuZXcgc3ZbaV0gKGJ1ZyB3YXMgaGVyZSEpICovCisJfQorCXJldHVybiBuZWVkX3Jlc2NhbjsKK30KKworaW50IHJ1bnN2ZGlyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBydW5zdmRpcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgczsKKwlkZXZfdCBsYXN0X2RldiA9IGxhc3RfZGV2OyAvKiBmb3IgZ2NjICovCisJaW5vX3QgbGFzdF9pbm8gPSBsYXN0X2lubzsgLyogZm9yIGdjYyAqLworCXRpbWVfdCBsYXN0X210aW1lID0gMDsKKwlpbnQgd3N0YXQ7CisJaW50IGN1cmRpcjsKKwlwaWRfdCBwaWQ7CisJdW5zaWduZWQgZGVhZGxpbmU7CisJdW5zaWduZWQgbm93OworCXVuc2lnbmVkIHN0YW1wY2hlY2s7CisJaW50IGk7CisJaW50IG5lZWRfcmVzY2FuID0gMTsKKwljaGFyICpvcHRfc19hcmd2WzNdOworCisJSU5JVF9HKCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7CisJb3B0X3NfYXJndlswXSA9IE5VTEw7CisJb3B0X3NfYXJndlsyXSA9IE5VTEw7CisJZ2V0b3B0MzIoYXJndiwgIlBzOiIsICZvcHRfc19hcmd2WzBdKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWJiX3NpZ25hbHMoMAorCQl8ICgxIDw8IFNJR1RFUk0pCisJCXwgKDEgPDwgU0lHSFVQKQorCQkvKiBGb3IgYnVzeWJveCdzIGluaXQsIFNJR1RFUk0gPT0gcmVib290LAorCQkgKiBTSUdVU1IxID09IGhhbHQKKwkJICogU0lHVVNSMiA9PSBwb3dlcm9mZgorCQkgKiBzbyB3ZSBuZWVkIHRvIGludGVyY2VwdCBTSUdVU1JuIHRvby4KKwkJICogTm90ZSB0aGF0IHdlIGRvIG5vdCBpbXBsZW1lbnQgYWN0dWFsIHJlYm9vdAorCQkgKiAoa2lsbGFsbChURVJNKSArIHVtb3VudCwgZXRjKSwgd2UganVzdCBwYXVzZQorCQkgKiByZXNwYXdpbmcgYW5kIGF2b2lkIGV4aXRpbmcgKC0+IG1ha2luZyBrZXJuZWwgb29wcykuCisJCSAqIFRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmVzdC4gKi8KKwkJfCAoZ2V0cGlkKCkgPT0gMSA/ICgoMSA8PCBTSUdVU1IxKSB8ICgxIDw8IFNJR1VTUjIpKSA6IDApCisJCSwgcmVjb3JkX3NpZ25vKTsKKwlzdmRpciA9ICphcmd2Kys7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5TVkRJUl9MT0cKKwkvKiBzZXR1cCBsb2cgKi8KKwlpZiAoKmFyZ3YpIHsKKwkJcnBsb2cgPSAqYXJndjsKKwkJcnBsb2dsZW4gPSBzdHJsZW4ocnBsb2cpOworCQlpZiAocnBsb2dsZW4gPCA3KSB7CisJCQl3YXJueCgibG9nIG11c3QgaGF2ZSBhdCBsZWFzdCBzZXZlbiBjaGFyYWN0ZXJzIik7CisJCX0gZWxzZSBpZiAocGlwZWRfcGFpcihsb2dwaXBlKSkgeworCQkJd2FybngoImNhbid0IGNyZWF0ZSBwaXBlIGZvciBsb2ciKTsKKwkJfSBlbHNlIHsKKwkJCWNsb3NlX29uX2V4ZWNfb24obG9ncGlwZS5yZCk7CisJCQljbG9zZV9vbl9leGVjX29uKGxvZ3BpcGUud3IpOworCQkJbmRlbGF5X29uKGxvZ3BpcGUucmQpOworCQkJbmRlbGF5X29uKGxvZ3BpcGUud3IpOworCQkJaWYgKGR1cDIobG9ncGlwZS53ciwgMikgPT0gLTEpIHsKKwkJCQl3YXJueCgiY2FuJ3Qgc2V0IGZpbGVkZXNjcmlwdG9yIGZvciBsb2ciKTsKKwkJCX0gZWxzZSB7CisJCQkJcGZkWzBdLmZkID0gbG9ncGlwZS5yZDsKKwkJCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQkJCXN0YW1wbG9nID0gbW9ub3RvbmljX3NlYygpOworCQkJCWdvdG8gcnVuOworCQkJfQorCQl9CisJCXJwbG9nID0gTlVMTDsKKwkJd2FybngoImxvZyBzZXJ2aWNlIGRpc2FibGVkIik7CisJfQorIHJ1bjoKKyNlbmRpZgorCWN1cmRpciA9IG9wZW4oIi4iLCBPX1JET05MWXxPX05ERUxBWSk7CisJaWYgKGN1cmRpciA9PSAtMSkKKwkJZmF0YWwyX2Nhbm5vdCgib3BlbiBjdXJyZW50IGRpcmVjdG9yeSIsICIiKTsKKwljbG9zZV9vbl9leGVjX29uKGN1cmRpcik7CisKKwlzdGFtcGNoZWNrID0gbW9ub3RvbmljX3NlYygpOworCisJZm9yICg7OykgeworCQkvKiBjb2xsZWN0IGNoaWxkcmVuICovCisJCWZvciAoOzspIHsKKwkJCXBpZCA9IHdhaXRfYW55X25vaGFuZygmd3N0YXQpOworCQkJaWYgKHBpZCA8PSAwKQorCQkJCWJyZWFrOworCQkJZm9yIChpID0gMDsgaSA8IHN2bnVtOyBpKyspIHsKKwkJCQlpZiAocGlkID09IHN2W2ldLnBpZCkgeworCQkJCQkvKiBydW5zdiBoYXMgZGllZCAqLworCQkJCQlzdltpXS5waWQgPSAwOworCQkJCQluZWVkX3Jlc2NhbiA9IDE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJbm93ID0gbW9ub3RvbmljX3NlYygpOworCQlpZiAoKGludCkobm93IC0gc3RhbXBjaGVjaykgPj0gMCkgeworCQkJLyogd2FpdCBhdCBsZWFzdCBhIHNlY29uZCAqLworCQkJc3RhbXBjaGVjayA9IG5vdyArIDE7CisKKwkJCWlmIChzdGF0KHN2ZGlyLCAmcykgIT0gLTEpIHsKKwkJCQlpZiAobmVlZF9yZXNjYW4gfHwgcy5zdF9tdGltZSAhPSBsYXN0X210aW1lCisJCQkJIHx8IHMuc3RfaW5vICE9IGxhc3RfaW5vIHx8IHMuc3RfZGV2ICE9IGxhc3RfZGV2CisJCQkJKSB7CisJCQkJCS8qIHN2ZGlyIG1vZGlmaWVkICovCisJCQkJCWlmIChjaGRpcihzdmRpcikgIT0gLTEpIHsKKwkJCQkJCWxhc3RfbXRpbWUgPSBzLnN0X210aW1lOworCQkJCQkJbGFzdF9kZXYgPSBzLnN0X2RldjsKKwkJCQkJCWxhc3RfaW5vID0gcy5zdF9pbm87CisJCQkJCQkvKiBpZiB0aGUgc3ZkaXIgY2hhbmdlZCB0aGlzIHZlcnkgc2Vjb25kLCB3YWl0IHVudGlsIHRoZQorCQkJCQkJICogbmV4dCBzZWNvbmQsIGJlY2F1c2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byBkZXRlY3QgbW9yZQorCQkJCQkJICogY2hhbmdlcyB3aXRoaW4gdGhpcyBzZWNvbmQgKi8KKwkJCQkJCXdoaWxlICh0aW1lKE5VTEwpID09IGxhc3RfbXRpbWUpCisJCQkJCQkJdXNsZWVwKDEwMDAwMCk7CisJCQkJCQluZWVkX3Jlc2NhbiA9IGRvX3Jlc2NhbigpOworCQkJCQkJd2hpbGUgKGZjaGRpcihjdXJkaXIpID09IC0xKSB7CisJCQkJCQkJd2FybjJfY2Fubm90KCJjaGFuZ2UgZGlyZWN0b3J5LCBwYXVzaW5nIiwgIiIpOworCQkJCQkJCXNsZWVwKDUpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJd2FybjJfY2Fubm90KCJjaGFuZ2UgZGlyZWN0b3J5IHRvICIsIHN2ZGlyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJd2FybjJfY2Fubm90KCJzdGF0ICIsIHN2ZGlyKTsKKwkJCX0KKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOU1ZESVJfTE9HCisJCWlmIChycGxvZykgeworCQkJaWYgKChpbnQpKG5vdyAtIHN0YW1wbG9nKSA+PSAwKSB7CisJCQkJd3JpdGUobG9ncGlwZS53ciwgIi4iLCAxKTsKKwkJCQlzdGFtcGxvZyA9IG5vdyArIDkwMDsKKwkJCX0KKwkJfQorCQlwZmRbMF0ucmV2ZW50cyA9IDA7CisjZW5kaWYKKwkJZGVhZGxpbmUgPSAobmVlZF9yZXNjYW4gPyAxIDogNSk7CisJCXNpZ19ibG9jayhTSUdDSExEKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5TVkRJUl9MT0cKKwkJaWYgKHJwbG9nKQorCQkJcG9sbChwZmQsIDEsIGRlYWRsaW5lKjEwMDApOworCQllbHNlCisjZW5kaWYKKwkJCXNsZWVwKGRlYWRsaW5lKTsKKwkJc2lnX3VuYmxvY2soU0lHQ0hMRCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5TVkRJUl9MT0cKKwkJaWYgKHBmZFswXS5yZXZlbnRzICYgUE9MTElOKSB7CisJCQljaGFyIGNoOworCQkJd2hpbGUgKHJlYWQobG9ncGlwZS5yZCwgJmNoLCAxKSA+IDApIHsKKwkJCQlpZiAoY2ggPCAnICcpCisJCQkJCWNoID0gJyAnOworCQkJCWZvciAoaSA9IDY7IGkgPCBycGxvZ2xlbjsgaSsrKQorCQkJCQlycGxvZ1tpLTFdID0gcnBsb2dbaV07CisJCQkJcnBsb2dbcnBsb2dsZW4tMV0gPSBjaDsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWlmICghYmJfZ290X3NpZ25hbCkKKwkJCWNvbnRpbnVlOworCisJCS8qIC1zIFNDUklQVDogdXNlZnVsIGlmIHdlIGFyZSBpbml0LgorCQkgKiBJbiB0aGlzIGNhc2UgdHlwaWNhbGx5IHNjcmlwdCBuZXZlciByZXR1cm5zLAorCQkgKiBpdCBoYWx0cy9wb3dlcnMgb2ZmL3JlYm9vdHMgdGhlIHN5c3RlbS4gKi8KKwkJaWYgKG9wdF9zX2FyZ3ZbMF0pIHsKKwkJCS8qIFNpbmdsZSBwYXJhbWV0ZXI6IHNpZ25hbCMgKi8KKwkJCW9wdF9zX2FyZ3ZbMV0gPSB1dG9hKGJiX2dvdF9zaWduYWwpOworCQkJcGlkID0gc3Bhd24ob3B0X3NfYXJndik7CisJCQlpZiAocGlkID4gMCkgeworCQkJCS8qIFJlbWVtYmVyaW5nIHRvIHdhaXQgZm9yIF9hbnlfIGNoaWxkcmVuLAorCQkJCSAqIG5vdCBqdXN0IHBpZCAqLworCQkJCXdoaWxlICh3YWl0KE5VTEwpICE9IHBpZCkKKwkJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAoYmJfZ290X3NpZ25hbCA9PSBTSUdIVVApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzdm51bTsgaSsrKQorCQkJCWlmIChzdltpXS5waWQpCisJCQkJCWtpbGwoc3ZbaV0ucGlkLCBTSUdURVJNKTsKKwkJfQorCQkvKiBTSUdIVVAgb3IgU0lHVEVSTSAob3IgU0lHVVNSbiBpZiB3ZSBhcmUgaW5pdCkgKi8KKwkJLyogRXhpdCB1bmxlc3Mgd2UgYXJlIGluaXQgKi8KKwkJaWYgKGdldHBpZCgpICE9IDEpCisJCQlyZXR1cm4gKFNJR0hVUCA9PSBiYl9nb3Rfc2lnbmFsKSA/IDExMSA6IEVYSVRfU1VDQ0VTUzsKKworCQkvKiBpbml0IGNvbnRpbnVlcyB0byBtb25pdG9yIHNlcnZpY2VzIGZvcmV2ZXIgKi8KKwkJYmJfZ290X3NpZ25hbCA9IDA7CisJfSAvKiBmb3IgKDs7KSAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvcnVuaXQvc3YuYyBiL2J1c3lib3gtMS4xOS4zL3J1bml0L3N2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwMWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3J1bml0L3N2LmMKQEAgLTAsMCArMSw2MTggQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgR2Vycml0IFBhcGUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CitPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCitBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qIFRha2VuIGZyb20gaHR0cDovL3NtYXJkZW4uc3Vuc2l0ZS5kay9ydW5pdC9zdi44Lmh0bWw6CisKK3N2IC0gY29udHJvbCBhbmQgbWFuYWdlIHNlcnZpY2VzIG1vbml0b3JlZCBieSBydW5zdgorCitzdiBbLXZdIFstdyBzZWNdIGNvbW1hbmQgc2VydmljZXMKKy9ldGMvaW5pdC5kL3NlcnZpY2UgWy13IHNlY10gY29tbWFuZAorCitUaGUgc3YgcHJvZ3JhbSByZXBvcnRzIHRoZSBjdXJyZW50IHN0YXR1cyBhbmQgY29udHJvbHMgdGhlIHN0YXRlIG9mIHNlcnZpY2VzCittb25pdG9yZWQgYnkgdGhlIHJ1bnN2KDgpIHN1cGVydmlzb3IuCisKK3NlcnZpY2VzIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIGFyZ3VtZW50cywgZWFjaCBhcmd1bWVudCBuYW1pbmcgYSBkaXJlY3RvcnkKK3NlcnZpY2UgdXNlZCBieSBydW5zdig4KS4gSWYgc2VydmljZSBkb2Vzbid0IHN0YXJ0IHdpdGggYSBkb3Qgb3Igc2xhc2gsCitpdCBpcyBzZWFyY2hlZCBpbiB0aGUgZGVmYXVsdCBzZXJ2aWNlcyBkaXJlY3RvcnkgL3Zhci9zZXJ2aWNlLywgb3RoZXJ3aXNlCityZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKK2NvbW1hbmQgaXMgb25lIG9mIHVwLCBkb3duLCBzdGF0dXMsIG9uY2UsIHBhdXNlLCBjb250LCBodXAsIGFsYXJtLCBpbnRlcnJ1cHQsCisxLCAyLCB0ZXJtLCBraWxsLCBvciBleGl0LCBvciBzdGFydCwgc3RvcCwgcmVzdGFydCwgc2h1dGRvd24sIGZvcmNlLXN0b3AsCitmb3JjZS1yZWxvYWQsIGZvcmNlLXJlc3RhcnQsIGZvcmNlLXNodXRkb3duLgorCitUaGUgc3YgcHJvZ3JhbSBjYW4gYmUgc3ltLWxpbmtlZCB0byAvZXRjL2luaXQuZC8gdG8gcHJvdmlkZSBhbiBMU0IgaW5pdAorc2NyaXB0IGludGVyZmFjZS4gVGhlIHNlcnZpY2UgdG8gYmUgY29udHJvbGxlZCB0aGVuIGlzIHNwZWNpZmllZCBieSB0aGUKK2Jhc2UgbmFtZSBvZiB0aGUgImluaXQgc2NyaXB0Ii4KKworc3RhdHVzCisgICAgUmVwb3J0IHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgc2VydmljZSwgYW5kIHRoZSBhcHBlbmRhbnQgbG9nIHNlcnZpY2UKKyAgICBpZiBhdmFpbGFibGUsIHRvIHN0YW5kYXJkIG91dHB1dC4KK3VwCisgICAgSWYgdGhlIHNlcnZpY2UgaXMgbm90IHJ1bm5pbmcsIHN0YXJ0IGl0LiBJZiB0aGUgc2VydmljZSBzdG9wcywgcmVzdGFydCBpdC4KK2Rvd24KKyAgICBJZiB0aGUgc2VydmljZSBpcyBydW5uaW5nLCBzZW5kIGl0IHRoZSBURVJNIHNpZ25hbCwgYW5kIHRoZSBDT05UIHNpZ25hbC4KKyAgICBJZiAuL3J1biBleGl0cywgc3RhcnQgLi9maW5pc2ggaWYgaXQgZXhpc3RzLiBBZnRlciBpdCBzdG9wcywgZG8gbm90CisgICAgcmVzdGFydCBzZXJ2aWNlLgorb25jZQorICAgIElmIHRoZSBzZXJ2aWNlIGlzIG5vdCBydW5uaW5nLCBzdGFydCBpdC4gRG8gbm90IHJlc3RhcnQgaXQgaWYgaXQgc3RvcHMuCitwYXVzZSBjb250IGh1cCBhbGFybSBpbnRlcnJ1cHQgcXVpdCAxIDIgdGVybSBraWxsCisgICAgSWYgdGhlIHNlcnZpY2UgaXMgcnVubmluZywgc2VuZCBpdCB0aGUgU1RPUCwgQ09OVCwgSFVQLCBBTFJNLCBJTlQsIFFVSVQsCisgICAgVVNSMSwgVVNSMiwgVEVSTSwgb3IgS0lMTCBzaWduYWwgcmVzcGVjdGl2ZWx5LgorZXhpdAorICAgIElmIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcsIHNlbmQgaXQgdGhlIFRFUk0gc2lnbmFsLCBhbmQgdGhlIENPTlQgc2lnbmFsLgorICAgIERvIG5vdCByZXN0YXJ0IHRoZSBzZXJ2aWNlLiBJZiB0aGUgc2VydmljZSBpcyBkb3duLCBhbmQgbm8gbG9nIHNlcnZpY2UKKyAgICBleGlzdHMsIHJ1bnN2KDgpIGV4aXRzLiBJZiB0aGUgc2VydmljZSBpcyBkb3duIGFuZCBhIGxvZyBzZXJ2aWNlIGV4aXN0cywKKyAgICBzZW5kIHRoZSBURVJNIHNpZ25hbCB0byB0aGUgbG9nIHNlcnZpY2UuIElmIHRoZSBsb2cgc2VydmljZSBpcyBkb3duLAorICAgIHJ1bnN2KDgpIGV4aXRzLiBUaGlzIGNvbW1hbmQgaXMgaWdub3JlZCBpZiBpdCBpcyBnaXZlbiB0byBhbiBhcHBlbmRhbnQKKyAgICBsb2cgc2VydmljZS4KKworc3YgYWN0dWFsbHkgbG9va3Mgb25seSBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGFib3ZlIGNvbW1hbmRzLgorCitDb21tYW5kcyBjb21wYXRpYmxlIHRvIExTQiBpbml0IHNjcmlwdCBhY3Rpb25zOgorCitzdGF0dXMKKyAgICBTYW1lIGFzIHN0YXR1cy4KK3N0YXJ0CisgICAgU2FtZSBhcyB1cCwgYnV0IHdhaXQgdXAgdG8gNyBzZWNvbmRzIGZvciB0aGUgY29tbWFuZCB0byB0YWtlIGVmZmVjdC4KKyAgICBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzIG9yIHRpbWVvdXQuIElmIHRoZSBzY3JpcHQgLi9jaGVjayBleGlzdHMgaW4KKyAgICB0aGUgc2VydmljZSBkaXJlY3RvcnksIHN2IHJ1bnMgdGhpcyBzY3JpcHQgdG8gY2hlY2sgd2hldGhlciB0aGUgc2VydmljZQorICAgIGlzIHVwIGFuZCBhdmFpbGFibGU7IGl0J3MgY29uc2lkZXJlZCB0byBiZSBhdmFpbGFibGUgaWYgLi9jaGVjayBleGl0cworICAgIHdpdGggMC4KK3N0b3AKKyAgICBTYW1lIGFzIGRvd24sIGJ1dCB3YWl0IHVwIHRvIDcgc2Vjb25kcyBmb3IgdGhlIHNlcnZpY2UgdG8gYmVjb21lIGRvd24uCisgICAgVGhlbiByZXBvcnQgdGhlIHN0YXR1cyBvciB0aW1lb3V0LgorcmVzdGFydAorICAgIFNlbmQgdGhlIGNvbW1hbmRzIHRlcm0sIGNvbnQsIGFuZCB1cCB0byB0aGUgc2VydmljZSwgYW5kIHdhaXQgdXAgdG8KKyAgICA3IHNlY29uZHMgZm9yIHRoZSBzZXJ2aWNlIHRvIHJlc3RhcnQuIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMgb3IgdGltZW91dC4KKyAgICBJZiB0aGUgc2NyaXB0IC4vY2hlY2sgZXhpc3RzIGluIHRoZSBzZXJ2aWNlIGRpcmVjdG9yeSwgc3YgcnVucyB0aGlzIHNjcmlwdAorICAgIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNlcnZpY2UgaXMgdXAgYW5kIGF2YWlsYWJsZSBhZ2FpbjsgaXQncyBjb25zaWRlcmVkCisgICAgdG8gYmUgYXZhaWxhYmxlIGlmIC4vY2hlY2sgZXhpdHMgd2l0aCAwLgorc2h1dGRvd24KKyAgICBTYW1lIGFzIGV4aXQsIGJ1dCB3YWl0IHVwIHRvIDcgc2Vjb25kcyBmb3IgdGhlIHJ1bnN2KDgpIHByb2Nlc3MKKyAgICB0byB0ZXJtaW5hdGUuIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMgb3IgdGltZW91dC4KK2ZvcmNlLXN0b3AKKyAgICBTYW1lIGFzIGRvd24sIGJ1dCB3YWl0IHVwIHRvIDcgc2Vjb25kcyBmb3IgdGhlIHNlcnZpY2UgdG8gYmVjb21lIGRvd24uCisgICAgVGhlbiByZXBvcnQgdGhlIHN0YXR1cywgYW5kIG9uIHRpbWVvdXQgc2VuZCB0aGUgc2VydmljZSB0aGUga2lsbCBjb21tYW5kLgorZm9yY2UtcmVsb2FkCisgICAgU2VuZCB0aGUgc2VydmljZSB0aGUgdGVybSBhbmQgY29udCBjb21tYW5kcywgYW5kIHdhaXQgdXAgdG8KKyAgICA3IHNlY29uZHMgZm9yIHRoZSBzZXJ2aWNlIHRvIHJlc3RhcnQuIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMsCisgICAgYW5kIG9uIHRpbWVvdXQgc2VuZCB0aGUgc2VydmljZSB0aGUga2lsbCBjb21tYW5kLgorZm9yY2UtcmVzdGFydAorICAgIFNlbmQgdGhlIHNlcnZpY2UgdGhlIHRlcm0sIGNvbnQgYW5kIHVwIGNvbW1hbmRzLCBhbmQgd2FpdCB1cCB0bworICAgIDcgc2Vjb25kcyBmb3IgdGhlIHNlcnZpY2UgdG8gcmVzdGFydC4gVGhlbiByZXBvcnQgdGhlIHN0YXR1cywgYW5kCisgICAgb24gdGltZW91dCBzZW5kIHRoZSBzZXJ2aWNlIHRoZSBraWxsIGNvbW1hbmQuIElmIHRoZSBzY3JpcHQgLi9jaGVjaworICAgIGV4aXN0cyBpbiB0aGUgc2VydmljZSBkaXJlY3RvcnksIHN2IHJ1bnMgdGhpcyBzY3JpcHQgdG8gY2hlY2sgd2hldGhlcgorICAgIHRoZSBzZXJ2aWNlIGlzIHVwIGFuZCBhdmFpbGFibGUgYWdhaW47IGl0J3MgY29uc2lkZXJlZCB0byBiZSBhdmFpbGFibGUKKyAgICBpZiAuL2NoZWNrIGV4aXRzIHdpdGggMC4KK2ZvcmNlLXNodXRkb3duCisgICAgU2FtZSBhcyBleGl0LCBidXQgd2FpdCB1cCB0byA3IHNlY29uZHMgZm9yIHRoZSBydW5zdig4KSBwcm9jZXNzIHRvCisgICAgdGVybWluYXRlLiBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzLCBhbmQgb24gdGltZW91dCBzZW5kIHRoZSBzZXJ2aWNlCisgICAgdGhlIGtpbGwgY29tbWFuZC4KKworQWRkaXRpb25hbCBDb21tYW5kcworCitjaGVjaworICAgIENoZWNrIGZvciB0aGUgc2VydmljZSB0byBiZSBpbiB0aGUgc3RhdGUgdGhhdCdzIGJlZW4gcmVxdWVzdGVkLiBXYWl0IHVwIHRvCisgICAgNyBzZWNvbmRzIGZvciB0aGUgc2VydmljZSB0byByZWFjaCB0aGUgcmVxdWVzdGVkIHN0YXRlLCB0aGVuIHJlcG9ydAorICAgIHRoZSBzdGF0dXMgb3IgdGltZW91dC4gSWYgdGhlIHJlcXVlc3RlZCBzdGF0ZSBvZiB0aGUgc2VydmljZSBpcyB1cCwKKyAgICBhbmQgdGhlIHNjcmlwdCAuL2NoZWNrIGV4aXN0cyBpbiB0aGUgc2VydmljZSBkaXJlY3RvcnksIHN2IHJ1bnMKKyAgICB0aGlzIHNjcmlwdCB0byBjaGVjayB3aGV0aGVyIHRoZSBzZXJ2aWNlIGlzIHVwIGFuZCBydW5uaW5nOworICAgIGl0J3MgY29uc2lkZXJlZCB0byBiZSB1cCBpZiAuL2NoZWNrIGV4aXRzIHdpdGggMC4KKworT3B0aW9ucworCistdgorICAgIHdhaXQgdXAgdG8gNyBzZWNvbmRzIGZvciB0aGUgY29tbWFuZCB0byB0YWtlIGVmZmVjdC4KKyAgICBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzIG9yIHRpbWVvdXQuCistdyBzZWMKKyAgICBPdmVycmlkZSB0aGUgZGVmYXVsdCB0aW1lb3V0IG9mIDcgc2Vjb25kcyB3aXRoIHNlYyBzZWNvbmRzLiBJbXBsaWVzIC12LgorCitFbnZpcm9ubWVudAorCitTVkRJUgorICAgIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkU1ZESVIgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNlcnZpY2VzIGRpcmVjdG9yeQorICAgIC92YXIvc2VydmljZS4KK1NWV0FJVAorICAgIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkU1ZXQUlUIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCA3IHNlY29uZHMgdG8gd2FpdAorICAgIGZvciBhIGNvbW1hbmQgdG8gdGFrZSBlZmZlY3QuIEl0IGlzIG92ZXJyaWRkZW4gYnkgdGhlIC13IG9wdGlvbi4KKworRXhpdCBDb2RlcworICAgIHN2IGV4aXRzIDAsIGlmIHRoZSBjb21tYW5kIHdhcyBzdWNjZXNzZnVsbHkgc2VudCB0byBhbGwgc2VydmljZXMsIGFuZCwKKyAgICBpZiBpdCB3YXMgdG9sZCB0byB3YWl0LCB0aGUgY29tbWFuZCBoYXMgdGFrZW4gZWZmZWN0IHRvIGFsbCBzZXJ2aWNlcy4KKworICAgIEZvciBlYWNoIHNlcnZpY2UgdGhhdCBjYXVzZWQgYW4gZXJyb3IgKGUuZy4gdGhlIGRpcmVjdG9yeSBpcyBub3QKKyAgICBjb250cm9sbGVkIGJ5IGEgcnVuc3YoOCkgcHJvY2Vzcywgb3Igc3YgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcpLAorICAgIHN2IGluY3JlYXNlcyB0aGUgZXhpdCBjb2RlIGJ5IG9uZSBhbmQgZXhpdHMgbm9uIHplcm8uIFRoZSBtYXhpbXVtCisgICAgaXMgOTkuIHN2IGV4aXRzIDEwMCBvbiBlcnJvci4KKyovCisKKy8qIEJ1c3lib3hlZCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPiAqLworLyogVE9ETzogZGVwZW5kcyBvbiBydW5pdF9saWIuYyAtIHJldmlldyBhbmQgcmVkdWNlL2VsaW1pbmF0ZSAqLworCisvL3VzYWdlOiNkZWZpbmUgc3ZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdl0gWy13IFNFQ10gQ01EIFNFUlZJQ0VfRElSLi4uIgorLy91c2FnZTojZGVmaW5lIHN2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29udHJvbCBzZXJ2aWNlcyBtb25pdG9yZWQgYnkgcnVuc3Ygc3VwZXJ2aXNvci5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21tYW5kcyAob25seSBmaXJzdCBjaGFyYWN0ZXIgaXMgZW5vdWdoKTpcbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJzdGF0dXM6IHF1ZXJ5IHNlcnZpY2Ugc3RhdHVzXG4iCisvL3VzYWdlOiAgICAgICAidXA6IGlmIHNlcnZpY2UgaXNuJ3QgcnVubmluZywgc3RhcnQgaXQuIElmIHNlcnZpY2Ugc3RvcHMsIHJlc3RhcnQgaXRcbiIKKy8vdXNhZ2U6ICAgICAgICJvbmNlOiBsaWtlICd1cCcsIGJ1dCBpZiBzZXJ2aWNlIHN0b3BzLCBkb24ndCByZXN0YXJ0IGl0XG4iCisvL3VzYWdlOiAgICAgICAiZG93bjogc2VuZCBURVJNIGFuZCBDT05UIHNpZ25hbHMuIElmIC4vcnVuIGV4aXRzLCBzdGFydCAuL2ZpbmlzaFxuIgorLy91c2FnZTogICAgICAgIglpZiBpdCBleGlzdHMuIEFmdGVyIGl0IHN0b3BzLCBkb24ndCByZXN0YXJ0IHNlcnZpY2VcbiIKKy8vdXNhZ2U6ICAgICAgICJleGl0OiBzZW5kIFRFUk0gYW5kIENPTlQgc2lnbmFscyB0byBzZXJ2aWNlIGFuZCBsb2cgc2VydmljZS4gSWYgdGhleSBleGl0LFxuIgorLy91c2FnZTogICAgICAgIglydW5zdiBleGl0cyB0b29cbiIKKy8vdXNhZ2U6ICAgICAgICJwYXVzZSwgY29udCwgaHVwLCBhbGFybSwgaW50ZXJydXB0LCBxdWl0LCAxLCAyLCB0ZXJtLCBraWxsOiBzZW5kXG4iCisvL3VzYWdlOiAgICAgICAiU1RPUCwgQ09OVCwgSFVQLCBBTFJNLCBJTlQsIFFVSVQsIFVTUjEsIFVTUjIsIFRFUk0sIEtJTEwgc2lnbmFsIHRvIHNlcnZpY2UiCisKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJydW5pdF9saWIuaCIKKworc3RydWN0IGdsb2JhbHMgeworCWNvbnN0IGNoYXIgKmFjdHM7CisJY2hhciAqKnNlcnZpY2U7CisJdW5zaWduZWQgcmM7CisvKiAiQmVybnN0ZWluIiB0aW1lIGZvcm1hdDogdW5peCArIDB4NDAwMDAwMDAwMDAwMDAwYVVMTCAqLworCXVpbnQ2NF90IHRzdGFydCwgdG5vdzsKKwlzdnN0YXR1c190IHN2c3RhdHVzOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgYWN0cyAgICAgICAgIChHLmFjdHMgICAgICAgICkKKyNkZWZpbmUgc2VydmljZSAgICAgIChHLnNlcnZpY2UgICAgICkKKyNkZWZpbmUgcmMgICAgICAgICAgIChHLnJjICAgICAgICAgICkKKyNkZWZpbmUgdHN0YXJ0ICAgICAgIChHLnRzdGFydCAgICAgICkKKyNkZWZpbmUgdG5vdyAgICAgICAgIChHLnRub3cgICAgICAgICkKKyNkZWZpbmUgc3ZzdGF0dXMgICAgIChHLnN2c3RhdHVzICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgc3RyX2VxdWFsKHMsdCkgKCFzdHJjbXAoKHMpLCAodCkpKQorCisKK3N0YXRpYyB2b2lkIGZhdGFsX2Nhbm5vdChjb25zdCBjaGFyICptMSkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBmYXRhbF9jYW5ub3QoY29uc3QgY2hhciAqbTEpCit7CisJYmJfcGVycm9yX21zZygiZmF0YWw6IGNhbid0ICVzIiwgbTEpOworCV9leGl0KDE1MSk7Cit9CisKK3N0YXRpYyB2b2lkIG91dChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICptMSkKK3sKKwlwcmludGYoIiVzJXM6ICVzIiwgcCwgKnNlcnZpY2UsIG0xKTsKKwlpZiAoZXJybm8pIHsKKwkJcHJpbnRmKCI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsgLyogd2lsbCBhbHNvIGZsdXNoIHRoZSBvdXRwdXQgKi8KK30KKworI2RlZmluZSBXQVJOICAgICJ3YXJuaW5nOiAiCisjZGVmaW5lIE9LICAgICAgIm9rOiAiCisKK3N0YXRpYyB2b2lkIGZhaWwoY29uc3QgY2hhciAqbTEpCit7CisJKytyYzsKKwlvdXQoImZhaWw6ICIsIG0xKTsKK30KK3N0YXRpYyB2b2lkIGZhaWx4KGNvbnN0IGNoYXIgKm0xKQoreworCWVycm5vID0gMDsKKwlmYWlsKG0xKTsKK30KK3N0YXRpYyB2b2lkIHdhcm4oY29uc3QgY2hhciAqbTEpCit7CisJKytyYzsKKwkvKiAid2FybmluZzogPHNlcnZpY2U+OiA8bTE+XG4iICovCisJb3V0KCJ3YXJuaW5nOiAiLCBtMSk7Cit9CitzdGF0aWMgdm9pZCBvayhjb25zdCBjaGFyICptMSkKK3sKKwllcnJubyA9IDA7CisJb3V0KE9LLCBtMSk7Cit9CisKK3N0YXRpYyBpbnQgc3ZzdGF0dXNfZ2V0KHZvaWQpCit7CisJaW50IGZkLCByOworCisJZmQgPSBvcGVuKCJzdXBlcnZpc2Uvb2siLCBPX1dST05MWXxPX05ERUxBWSk7CisJaWYgKGZkID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFTk9ERVYpIHsKKwkJCSphY3RzID09ICd4JyA/IG9rKCJydW5zdiBub3QgcnVubmluZyIpCisJCQkgICAgICAgICAgICAgOiBmYWlseCgicnVuc3Ygbm90IHJ1bm5pbmciKTsKKwkJCXJldHVybiAwOworCQl9CisJCXdhcm4oImNhbid0IG9wZW4gc3VwZXJ2aXNlL29rIik7CisJCXJldHVybiAtMTsKKwl9CisJY2xvc2UoZmQpOworCWZkID0gb3Blbigic3VwZXJ2aXNlL3N0YXR1cyIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJd2FybigiY2FuJ3Qgb3BlbiBzdXBlcnZpc2Uvc3RhdHVzIik7CisJCXJldHVybiAtMTsKKwl9CisJciA9IHJlYWQoZmQsICZzdnN0YXR1cywgMjApOworCWNsb3NlKGZkKTsKKwlzd2l0Y2ggKHIpIHsKKwljYXNlIDIwOgorCQlicmVhazsKKwljYXNlIC0xOgorCQl3YXJuKCJjYW4ndCByZWFkIHN1cGVydmlzZS9zdGF0dXMiKTsKKwkJcmV0dXJuIC0xOworCWRlZmF1bHQ6CisJCWVycm5vID0gMDsKKwkJd2FybigiY2FuJ3QgcmVhZCBzdXBlcnZpc2Uvc3RhdHVzOiBiYWQgZm9ybWF0Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzdnN0YXR1c19wcmludChjb25zdCBjaGFyICptKQoreworCWludCBkaWZmOworCWludCBwaWQ7CisJaW50IG5vcm1hbGx5dXAgPSAwOworCXN0cnVjdCBzdGF0IHM7CisJdWludDY0X3QgdGltZXN0YW1wOworCisJaWYgKHN0YXQoImRvd24iLCAmcykgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJYmJfcGVycm9yX21zZyhXQVJOImNhbid0IHN0YXQgJXMvZG93biIsICpzZXJ2aWNlKTsKKwkJCXJldHVybiAwOworCQl9CisJCW5vcm1hbGx5dXAgPSAxOworCX0KKwlwaWQgPSBTV0FQX0xFMzIoc3ZzdGF0dXMucGlkX2xlMzIpOworCXRpbWVzdGFtcCA9IFNXQVBfQkU2NChzdnN0YXR1cy50aW1lX2JlNjQpOworCWlmIChwaWQpIHsKKwkJc3dpdGNoIChzdnN0YXR1cy5ydW5fb3JfZmluaXNoKSB7CisJCWNhc2UgMTogcHJpbnRmKCJydW46ICIpOyBicmVhazsKKwkJY2FzZSAyOiBwcmludGYoImZpbmlzaDogIik7IGJyZWFrOworCQl9CisJCXByaW50ZigiJXM6IChwaWQgJWQpICIsIG0sIHBpZCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJkb3duOiAlczogIiwgbSk7CisJfQorCWRpZmYgPSB0bm93IC0gdGltZXN0YW1wOworCXByaW50ZigiJXVzIiwgKGRpZmYgPCAwID8gMCA6IGRpZmYpKTsKKwlpZiAocGlkKSB7CisJCWlmICghbm9ybWFsbHl1cCkgcHJpbnRmKCIsIG5vcm1hbGx5IGRvd24iKTsKKwkJaWYgKHN2c3RhdHVzLnBhdXNlZCkgcHJpbnRmKCIsIHBhdXNlZCIpOworCQlpZiAoc3ZzdGF0dXMud2FudCA9PSAnZCcpIHByaW50ZigiLCB3YW50IGRvd24iKTsKKwkJaWYgKHN2c3RhdHVzLmdvdF90ZXJtKSBwcmludGYoIiwgZ290IFRFUk0iKTsKKwl9IGVsc2UgeworCQlpZiAobm9ybWFsbHl1cCkgcHJpbnRmKCIsIG5vcm1hbGx5IHVwIik7CisJCWlmIChzdnN0YXR1cy53YW50ID09ICd1JykgcHJpbnRmKCIsIHdhbnQgdXAiKTsKKwl9CisJcmV0dXJuIHBpZCA/IDEgOiAyOworfQorCitzdGF0aWMgaW50IHN0YXR1cyhjb25zdCBjaGFyICp1bnVzZWQgVU5VU0VEX1BBUkFNKQoreworCWludCByOworCisJaWYgKHN2c3RhdHVzX2dldCgpIDw9IDApCisJCXJldHVybiAwOworCisJciA9IHN2c3RhdHVzX3ByaW50KCpzZXJ2aWNlKTsKKwlpZiAoY2hkaXIoImxvZyIpID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCXByaW50ZigiOyBsb2c6ICJXQVJOImNhbid0IGNoYW5nZSB0byBsb2cgc2VydmljZSBkaXJlY3Rvcnk6ICVzIiwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0gZWxzZSBpZiAoc3ZzdGF0dXNfZ2V0KCkpIHsKKwkJcHJpbnRmKCI7ICIpOworCQlzdnN0YXR1c19wcmludCgibG9nIik7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7IC8qIHdpbGwgYWxzbyBmbHVzaCB0aGUgb3V0cHV0ICovCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tzY3JpcHQodm9pZCkKK3sKKwljaGFyICpwcm9nWzJdOworCXN0cnVjdCBzdGF0IHM7CisJaW50IHBpZCwgdzsKKworCWlmIChzdGF0KCJjaGVjayIsICZzKSA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRU5PRU5UKSByZXR1cm4gMTsKKwkJYmJfcGVycm9yX21zZyhXQVJOImNhbid0IHN0YXQgJXMvY2hlY2siLCAqc2VydmljZSk7CisJCXJldHVybiAwOworCX0KKwkvKiBpZiAoIShzLnN0X21vZGUgJiBTX0lYVVNSKSkgcmV0dXJuIDE7ICovCisJcHJvZ1swXSA9IChjaGFyKikiLi9jaGVjayI7CisJcHJvZ1sxXSA9IE5VTEw7CisJcGlkID0gc3Bhd24ocHJvZyk7CisJaWYgKHBpZCA8PSAwKSB7CisJCWJiX3BlcnJvcl9tc2coV0FSTiJjYW4ndCAlcyBjaGlsZCAlcy9jaGVjayIsICJydW4iLCAqc2VydmljZSk7CisJCXJldHVybiAwOworCX0KKwl3aGlsZSAoc2FmZV93YWl0cGlkKHBpZCwgJncsIDApID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coV0FSTiJjYW4ndCAlcyBjaGlsZCAlcy9jaGVjayIsICJ3YWl0IGZvciIsICpzZXJ2aWNlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBXRVhJVFNUQVRVUyh3KSA9PSAwOworfQorCitzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKmEpCit7CisJaW50IHI7CisJdW5zaWduZWQgcGlkX2xlMzI7CisJdWludDY0X3QgdGltZXN0YW1wOworCisJciA9IHN2c3RhdHVzX2dldCgpOworCWlmIChyID09IC0xKQorCQlyZXR1cm4gLTE7CisJaWYgKHIgPT0gMCkgeworCQlpZiAoKmEgPT0gJ3gnKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAtMTsKKwl9CisJcGlkX2xlMzIgPSBzdnN0YXR1cy5waWRfbGUzMjsKKwlzd2l0Y2ggKCphKSB7CisJY2FzZSAneCc6CisJCXJldHVybiAwOworCWNhc2UgJ3UnOgorCQlpZiAoIXBpZF9sZTMyIHx8IHN2c3RhdHVzLnJ1bl9vcl9maW5pc2ggIT0gMSkgcmV0dXJuIDA7CisJCWlmICghY2hlY2tzY3JpcHQoKSkgcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgJ2QnOgorCQlpZiAocGlkX2xlMzIpIHJldHVybiAwOworCQlicmVhazsKKwljYXNlICdjJzoKKwkJaWYgKHBpZF9sZTMyICYmICFjaGVja3NjcmlwdCgpKSByZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSAndCc6CisJCWlmICghcGlkX2xlMzIgJiYgc3ZzdGF0dXMud2FudCA9PSAnZCcpIGJyZWFrOworCQl0aW1lc3RhbXAgPSBTV0FQX0JFNjQoc3ZzdGF0dXMudGltZV9iZTY0KTsKKwkJaWYgKCh0c3RhcnQgPiB0aW1lc3RhbXApIHx8ICFwaWRfbGUzMiB8fCBzdnN0YXR1cy5nb3RfdGVybSB8fCAhY2hlY2tzY3JpcHQoKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlICdvJzoKKwkJdGltZXN0YW1wID0gU1dBUF9CRTY0KHN2c3RhdHVzLnRpbWVfYmU2NCk7CisJCWlmICgoIXBpZF9sZTMyICYmIHRzdGFydCA+IHRpbWVzdGFtcCkgfHwgKHBpZF9sZTMyICYmIHN2c3RhdHVzLndhbnQgIT0gJ2QnKSkKKwkJCXJldHVybiAwOworCX0KKwlwcmludGYoT0spOworCXN2c3RhdHVzX3ByaW50KCpzZXJ2aWNlKTsKKwliYl9wdXRjaGFyKCdcbicpOyAvKiB3aWxsIGFsc28gZmx1c2ggdGhlIG91dHB1dCAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNvbnRyb2woY29uc3QgY2hhciAqYSkKK3sKKwlpbnQgZmQsIHIsIGw7CisKKy8qIElzIGl0IGFuIG9wdGltaXphdGlvbj8KKyAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoICJzdiBvIFNSVjsgLi4uOyBzdiBkIFNSViIKKyAgICgnZCcgaXMgbm90IHBhc3NlZCB0byBTUlYgYmVjYXVzZSBpdHMgLndhbnQgPT0gJ2QnKToKKwlpZiAoc3ZzdGF0dXNfZ2V0KCkgPD0gMCkKKwkJcmV0dXJuIC0xOworCWlmIChzdnN0YXR1cy53YW50ID09ICphKQorCQlyZXR1cm4gMDsKKyovCisJZmQgPSBvcGVuKCJzdXBlcnZpc2UvY29udHJvbCIsIE9fV1JPTkxZfE9fTkRFTEFZKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0RFVikKKwkJCXdhcm4oImNhbid0IG9wZW4gc3VwZXJ2aXNlL2NvbnRyb2wiKTsKKwkJZWxzZQorCQkJKmEgPT0gJ3gnID8gb2soInJ1bnN2IG5vdCBydW5uaW5nIikgOiBmYWlseCgicnVuc3Ygbm90IHJ1bm5pbmciKTsKKwkJcmV0dXJuIC0xOworCX0KKwlsID0gc3RybGVuKGEpOworCXIgPSB3cml0ZShmZCwgYSwgbCk7CisJY2xvc2UoZmQpOworCWlmIChyICE9IGwpIHsKKwkJd2FybigiY2FuJ3Qgd3JpdGUgdG8gc3VwZXJ2aXNlL2NvbnRyb2wiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IHN2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqeDsKKwljaGFyICphY3Rpb247CisJY29uc3QgY2hhciAqdmFyc2VydmljZSA9IENPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSOworCXVuc2lnbmVkIHdhaXRzZWMgPSA3OworCXNtYWxsaW50IGtsbCA9IDA7CisJaW50IHZlcmJvc2UgPSAwOworCWludCAoKmFjdCkoY29uc3QgY2hhciopOworCWludCAoKmNiaykoY29uc3QgY2hhciopOworCWludCBjdXJkaXI7CisKKwlJTklUX0coKTsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDEwMDsKKworCXggPSBnZXRlbnYoIlNWRElSIik7CisJaWYgKHgpIHZhcnNlcnZpY2UgPSB4OworCXggPSBnZXRlbnYoIlNWV0FJVCIpOworCWlmICh4KSB3YWl0c2VjID0geGF0b3UoeCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ3Kzp2diI7IC8qIC13IE4sIC12IGlzIGEgY291bnRlciAqLworCWdldG9wdDMyKGFyZ3YsICJ3OnYiLCAmd2FpdHNlYywgJnZlcmJvc2UpOworCWFyZ3YgKz0gb3B0aW5kOworCWFjdGlvbiA9ICphcmd2Kys7CisJaWYgKCFhY3Rpb24gfHwgISphcmd2KSBiYl9zaG93X3VzYWdlKCk7CisKKwl0bm93ID0gdGltZShOVUxMKSArIDB4NDAwMDAwMDAwMDAwMDAwYVVMTDsKKwl0c3RhcnQgPSB0bm93OworCWN1cmRpciA9IG9wZW4oIi4iLCBPX1JET05MWXxPX05ERUxBWSk7CisJaWYgKGN1cmRpciA9PSAtMSkKKwkJZmF0YWxfY2Fubm90KCJvcGVuIGN1cnJlbnQgZGlyZWN0b3J5Iik7CisKKwlhY3QgPSAmY29udHJvbDsKKwlhY3RzID0gInMiOworCWNiayA9ICZjaGVjazsKKworCXN3aXRjaCAoKmFjdGlvbikgeworCWNhc2UgJ3gnOgorCWNhc2UgJ2UnOgorCQlhY3RzID0gIngiOworCQlpZiAoIXZlcmJvc2UpIGNiayA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgJ1gnOgorCWNhc2UgJ0UnOgorCQlhY3RzID0gIngiOworCQlrbGwgPSAxOworCQlicmVhazsKKwljYXNlICdEJzoKKwkJYWN0cyA9ICJkIjsKKwkJa2xsID0gMTsKKwkJYnJlYWs7CisJY2FzZSAnVCc6CisJCWFjdHMgPSAidGMiOworCQlrbGwgPSAxOworCQlicmVhazsKKwljYXNlICdjJzoKKwkJaWYgKHN0cl9lcXVhbChhY3Rpb24sICJjaGVjayIpKSB7CisJCQlhY3QgPSBOVUxMOworCQkJYWN0cyA9ICJjIjsKKwkJCWJyZWFrOworCQl9CisJY2FzZSAndSc6IGNhc2UgJ2QnOiBjYXNlICdvJzogY2FzZSAndCc6IGNhc2UgJ3AnOiBjYXNlICdoJzoKKwljYXNlICdhJzogY2FzZSAnaSc6IGNhc2UgJ2snOiBjYXNlICdxJzogY2FzZSAnMSc6IGNhc2UgJzInOgorCQlhY3Rpb25bMV0gPSAnXDAnOworCQlhY3RzID0gYWN0aW9uOworCQlpZiAoIXZlcmJvc2UpIGNiayA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgJ3MnOgorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgInNodXRkb3duIikpIHsKKwkJCWFjdHMgPSAieCI7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgInN0YXJ0IikpIHsKKwkJCWFjdHMgPSAidSI7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgInN0b3AiKSkgeworCQkJYWN0cyA9ICJkIjsKKwkJCWJyZWFrOworCQl9CisJCS8qICJzdGF0dXMiICovCisJCWFjdCA9ICZzdGF0dXM7CisJCWNiayA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgJ3InOgorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgInJlc3RhcnQiKSkgeworCQkJYWN0cyA9ICJ0Y3UiOworCQkJYnJlYWs7CisJCX0KKwkJYmJfc2hvd191c2FnZSgpOworCWNhc2UgJ2YnOgorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgImZvcmNlLXJlbG9hZCIpKSB7CisJCQlhY3RzID0gInRjIjsKKwkJCWtsbCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgImZvcmNlLXJlc3RhcnQiKSkgeworCQkJYWN0cyA9ICJ0Y3UiOworCQkJa2xsID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAiZm9yY2Utc2h1dGRvd24iKSkgeworCQkJYWN0cyA9ICJ4IjsKKwkJCWtsbCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgImZvcmNlLXN0b3AiKSkgeworCQkJYWN0cyA9ICJkIjsKKwkJCWtsbCA9IDE7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlzZXJ2aWNlID0gYXJndjsKKwl3aGlsZSAoKHggPSAqc2VydmljZSkgIT0gTlVMTCkgeworCQlpZiAoeFswXSAhPSAnLycgJiYgeFswXSAhPSAnLicpIHsKKwkJCWlmIChjaGRpcih2YXJzZXJ2aWNlKSA9PSAtMSkKKwkJCQlnb3RvIGNoZGlyX2ZhaWxlZF8wOworCQl9CisJCWlmIChjaGRpcih4KSA9PSAtMSkgeworIGNoZGlyX2ZhaWxlZF8wOgorCQkJZmFpbCgiY2FuJ3QgY2hhbmdlIHRvIHNlcnZpY2UgZGlyZWN0b3J5Iik7CisJCQlnb3RvIG51bGxpZnlfc2VydmljZV8wOworCQl9CisJCWlmIChhY3QgJiYgKGFjdChhY3RzKSA9PSAtMSkpIHsKKyBudWxsaWZ5X3NlcnZpY2VfMDoKKwkJCSpzZXJ2aWNlID0gKGNoYXIqKSAtMUw7IC8qICJkZWFkIiAqLworCQl9CisJCWlmIChmY2hkaXIoY3VyZGlyKSA9PSAtMSkKKwkJCWZhdGFsX2Nhbm5vdCgiY2hhbmdlIHRvIG9yaWdpbmFsIGRpcmVjdG9yeSIpOworCQlzZXJ2aWNlKys7CisJfQorCisJaWYgKGNiaykgd2hpbGUgKDEpIHsKKwkJaW50IHdhbnRfZXhpdDsKKwkJaW50IGRpZmY7CisKKwkJZGlmZiA9IHRub3cgLSB0c3RhcnQ7CisJCXNlcnZpY2UgPSBhcmd2OworCQl3YW50X2V4aXQgPSAxOworCQl3aGlsZSAoKHggPSAqc2VydmljZSkgIT0gTlVMTCkgeworCQkJaWYgKHggPT0gKGNoYXIqKSAtMUwpIC8qICJkZWFkIiAqLworCQkJCWdvdG8gbmV4dDsKKwkJCWlmICh4WzBdICE9ICcvJyAmJiB4WzBdICE9ICcuJykgeworCQkJCWlmIChjaGRpcih2YXJzZXJ2aWNlKSA9PSAtMSkKKwkJCQkJZ290byBjaGRpcl9mYWlsZWQ7CisJCQl9CisJCQlpZiAoY2hkaXIoeCkgPT0gLTEpIHsKKyBjaGRpcl9mYWlsZWQ6CisJCQkJZmFpbCgiY2FuJ3QgY2hhbmdlIHRvIHNlcnZpY2UgZGlyZWN0b3J5Iik7CisJCQkJZ290byBudWxsaWZ5X3NlcnZpY2U7CisJCQl9CisJCQlpZiAoY2JrKGFjdHMpICE9IDApCisJCQkJZ290byBudWxsaWZ5X3NlcnZpY2U7CisJCQl3YW50X2V4aXQgPSAwOworCQkJaWYgKGRpZmYgPj0gd2FpdHNlYykgeworCQkJCXByaW50ZihrbGwgPyAia2lsbDogIiA6ICJ0aW1lb3V0OiAiKTsKKwkJCQlpZiAoc3ZzdGF0dXNfZ2V0KCkgPiAwKSB7CisJCQkJCXN2c3RhdHVzX3ByaW50KHgpOworCQkJCQkrK3JjOworCQkJCX0KKwkJCQliYl9wdXRjaGFyKCdcbicpOyAvKiB3aWxsIGFsc28gZmx1c2ggdGhlIG91dHB1dCAqLworCQkJCWlmIChrbGwpCisJCQkJCWNvbnRyb2woImsiKTsKKyBudWxsaWZ5X3NlcnZpY2U6CisJCQkJKnNlcnZpY2UgPSAoY2hhciopIC0xTDsgLyogImRlYWQiICovCisJCQl9CisJCQlpZiAoZmNoZGlyKGN1cmRpcikgPT0gLTEpCisJCQkJZmF0YWxfY2Fubm90KCJjaGFuZ2UgdG8gb3JpZ2luYWwgZGlyZWN0b3J5Iik7CisgbmV4dDoKKwkJCXNlcnZpY2UrKzsKKwkJfQorCQlpZiAod2FudF9leGl0KSBicmVhazsKKwkJdXNsZWVwKDQyMDAwMCk7CisJCXRub3cgPSB0aW1lKE5VTEwpICsgMHg0MDAwMDAwMDAwMDAwMDBhVUxMOworCX0KKwlyZXR1cm4gcmMgPiA5OSA/IDk5IDogcmM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9ydW5pdC9zdmxvZ2QuYyBiL2J1c3lib3gtMS4xOS4zL3J1bml0L3N2bG9nZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYmEyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9ydW5pdC9zdmxvZ2QuYwpAQCAtMCwwICsxLDEyMzIgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgR2Vycml0IFBhcGUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CitPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCitBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qIEJ1c3lib3hlZCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPiAqLworLyogVE9ETzogZGVwZW5kcyBvbiBydW5pdF9saWIuYyAtIHJldmlldyBhbmQgcmVkdWNlL2VsaW1pbmF0ZSAqLworCisvKgorQ29uZmlnIGZpbGVzCisKK09uIHN0YXJ0dXAsIGFuZCBhZnRlciByZWNlaXZpbmcgYSBIVVAgc2lnbmFsLCBzdmxvZ2QgY2hlY2tzIGZvciBlYWNoCitsb2cgZGlyZWN0b3J5IGxvZyBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGxvZy9jb25maWcgZXhpc3RzLAorYW5kIGlmIHNvLCByZWFkcyB0aGUgZmlsZSBsaW5lIGJ5IGxpbmUgYW5kIGFkanVzdHMgY29uZmlndXJhdGlvbgorZm9yIGxvZyBhcyBmb2xsb3dzOgorCitJZiB0aGUgbGluZSBpcyBlbXB0eSwgb3Igc3RhcnRzIHdpdGggYSAjLCBpdCBpcyBpZ25vcmVkLiBBIGxpbmUKK29mIHRoZSBmb3JtCisKK3NzaXplCisgICAgc2V0cyB0aGUgbWF4aW11bSBmaWxlIHNpemUgb2YgY3VycmVudCB3aGVuIHN2bG9nZCBzaG91bGQgcm90YXRlCisgICAgdGhlIGN1cnJlbnQgbG9nIGZpbGUgdG8gc2l6ZSBieXRlcy4gRGVmYXVsdCBpcyAxMDAwMDAwLgorICAgIElmIHNpemUgaXMgemVybywgc3Zsb2dkIGRvZXNudCByb3RhdGUgbG9nIGZpbGVzCisgICAgWW91IHNob3VsZCBzZXQgc2l6ZSB0byBhdCBsZWFzdCAoMiAqIGxlbikuCitubnVtCisgICAgc2V0cyB0aGUgbnVtYmVyIG9mIG9sZCBsb2cgZmlsZXMgc3Zsb2dkIHNob3VsZCBtYWludGFpbiB0byBudW0uCisgICAgSWYgc3Zsb2dkIHNlZXMgbW9yZSB0aGF0IG51bSBvbGQgbG9nIGZpbGVzIGluIGxvZyBhZnRlciBsb2cgZmlsZQorICAgIHJvdGF0aW9uLCBpdCBkZWxldGVzIHRoZSBvbGRlc3Qgb25lLiBEZWZhdWx0IGlzIDEwLgorICAgIElmIG51bSBpcyB6ZXJvLCBzdmxvZ2QgZG9lc250IHJlbW92ZSBvbGQgbG9nIGZpbGVzLgorTm1pbgorICAgIHNldHMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIG9sZCBsb2cgZmlsZXMgc3Zsb2dkIHNob3VsZCBtYWludGFpbgorICAgIHRvIG1pbi4gbWluIG11c3QgYmUgbGVzcyB0aGFuIG51bS4gSWYgbWluIGlzIHNldCwgYW5kIHN2bG9nZAorICAgIGNhbm5vdCB3cml0ZSB0byBjdXJyZW50IGJlY2F1c2UgdGhlIGZpbGVzeXN0ZW0gaXMgZnVsbCwKKyAgICBhbmQgaXQgc2VlcyBtb3JlIHRoYW4gbWluIG9sZCBsb2cgZmlsZXMsIGl0IGRlbGV0ZXMgdGhlIG9sZGVzdCBvbmUuCit0dGltZW91dAorICAgIHNldHMgdGhlIG1heGltdW0gYWdlIG9mIHRoZSBjdXJyZW50IGxvZyBmaWxlIHdoZW4gc3Zsb2dkIHNob3VsZAorICAgIHJvdGF0ZSB0aGUgY3VycmVudCBsb2cgZmlsZSB0byB0aW1lb3V0IHNlY29uZHMuIElmIGN1cnJlbnQKKyAgICBpcyB0aW1lb3V0IHNlY29uZHMgb2xkLCBhbmQgaXMgbm90IGVtcHR5LCBzdmxvZ2QgZm9yY2VzIGxvZyBmaWxlIHJvdGF0aW9uLgorIXByb2Nlc3NvcgorICAgIHRlbGxzIHN2bG9nZCB0byBmZWVkIGVhY2ggcmVjZW50IGxvZyBmaWxlIHRocm91Z2ggcHJvY2Vzc29yCisgICAgKHNlZSBhYm92ZSkgb24gbG9nIGZpbGUgcm90YXRpb24uIEJ5IGRlZmF1bHQgbG9nIGZpbGVzIGFyZSBub3QgcHJvY2Vzc2VkLgordWEuYi5jLmRbOnBvcnRdCisgICAgdGVsbHMgc3Zsb2dkIHRvIHRyYW5zbWl0IHRoZSBmaXJzdCBsZW4gY2hhcmFjdGVycyBvZiBzZWxlY3RlZAorICAgIGxvZyBtZXNzYWdlcyB0byB0aGUgSVAgYWRkcmVzcyBhLmIuYy5kLCBwb3J0IG51bWJlciBwb3J0LgorICAgIElmIHBvcnQgaXNudCBzZXQsIHRoZSBkZWZhdWx0IHBvcnQgZm9yIHN5c2xvZyBpcyB1c2VkICg1MTQpLgorICAgIGxlbiBjYW4gYmUgc2V0IHRocm91Z2ggdGhlIC1sIG9wdGlvbiwgc2VlIGJlbG93LiBJZiBzdmxvZ2QKKyAgICBoYXMgdHJvdWJsZSBzZW5kaW5nIHVkcCBwYWNrZXRzLCBpdCB3cml0ZXMgZXJyb3IgbWVzc2FnZXMKKyAgICB0byB0aGUgbG9nIGRpcmVjdG9yeS4gQXR0ZW50aW9uOiBsb2dnaW5nIHRocm91Z2ggdWRwIGlzIHVucmVsaWFibGUsCisgICAgYW5kIHNob3VsZCBiZSB1c2VkIGluIHByaXZhdGUgbmV0d29ya3Mgb25seS4KK1VhLmIuYy5kWzpwb3J0XQorICAgIGlzIHRoZSBzYW1lIGFzIHRoZSB1IGxpbmUgYWJvdmUsIGJ1dCB0aGUgbG9nIG1lc3NhZ2VzIGFyZSBubyBsb25nZXIKKyAgICB3cml0dGVuIHRvIHRoZSBsb2cgZGlyZWN0b3J5LCBidXQgdHJhbnNtaXR0ZWQgdGhyb3VnaCB1ZHAgb25seS4KKyAgICBFcnJvciBtZXNzYWdlcyBmcm9tIHN2bG9nZCBjb25jZXJuaW5nIHNlbmRpbmcgdWRwIHBhY2thZ2VzIHN0aWxsIGdvCisgICAgdG8gdGhlIGxvZyBkaXJlY3RvcnkuCitwcHJlZml4CisgICAgdGVsbHMgc3Zsb2dkIHRvIHByZWZpeCBlYWNoIGxpbmUgdG8gYmUgd3JpdHRlbiB0byB0aGUgbG9nIGRpcmVjdG9yeSwKKyAgICB0byBzdGFuZGFyZCBlcnJvciwgb3IgdGhyb3VnaCBVRFAsIHdpdGggcHJlZml4LgorCitJZiBhIGxpbmUgc3RhcnRzIHdpdGggYSAtLCArLCBlLCBvciBFLCBzdmxvZ2QgbWF0Y2hlcyB0aGUgZmlyc3QgbGVuIGNoYXJhY3RlcnMKK29mIGVhY2ggbG9nIG1lc3NhZ2UgYWdhaW5zdCBwYXR0ZXJuIGFuZCBhY3RzIGFjY29yZGluZ2x5OgorCistcGF0dGVybgorICAgIHRoZSBsb2cgbWVzc2FnZSBpcyBkZXNlbGVjdGVkLgorK3BhdHRlcm4KKyAgICB0aGUgbG9nIG1lc3NhZ2UgaXMgc2VsZWN0ZWQuCitlcGF0dGVybgorICAgIHRoZSBsb2cgbWVzc2FnZSBpcyBzZWxlY3RlZCB0byBiZSBwcmludGVkIHRvIHN0YW5kYXJkIGVycm9yLgorRXBhdHRlcm4KKyAgICB0aGUgbG9nIG1lc3NhZ2UgaXMgZGVzZWxlY3RlZCB0byBiZSBwcmludGVkIHRvIHN0YW5kYXJkIGVycm9yLgorCitJbml0aWFsbHkgZWFjaCBsaW5lIGlzIHNlbGVjdGVkIHRvIGJlIHdyaXR0ZW4gdG8gbG9nL2N1cnJlbnQuIERlc2VsZWN0ZWQKK2xvZyBtZXNzYWdlcyBhcmUgZGlzY2FyZGVkIGZyb20gbG9nLiBJbml0aWFsbHkgZWFjaCBsaW5lIGlzIGRlc2VsZWN0ZWQKK3RvIGJlIHdyaXR0ZW4gdG8gc3RhbmRhcmQgZXJyLiBMb2cgbWVzc2FnZXMgc2VsZWN0ZWQgZm9yIHN0YW5kYXJkIGVycm9yCithcmUgd3JpdHRlbiB0byBzdGFuZGFyZCBlcnJvci4KKworUGF0dGVybiBNYXRjaGluZworCitzdmxvZ2QgbWF0Y2hlcyBhIGxvZyBtZXNzYWdlIGFnYWluc3QgdGhlIHN0cmluZyBwYXR0ZXJuIGFzIGZvbGxvd3M6CisKK3BhdHRlcm4gaXMgYXBwbGllZCB0byB0aGUgbG9nIG1lc3NhZ2Ugb25lIGNoYXJhY3RlciBieSBvbmUsIHN0YXJ0aW5nCit3aXRoIHRoZSBmaXJzdC4gQSBjaGFyYWN0ZXIgbm90IGEgc3RhciAoKikgYW5kIG5vdCBhIHBsdXMgKCspIG1hdGNoZXMgaXRzZWxmLgorQSBwbHVzIG1hdGNoZXMgdGhlIG5leHQgY2hhcmFjdGVyIGluIHBhdHRlcm4gaW4gdGhlIGxvZyBtZXNzYWdlIG9uZQorb3IgbW9yZSB0aW1lcy4gQSBzdGFyIGJlZm9yZSB0aGUgZW5kIG9mIHBhdHRlcm4gbWF0Y2hlcyBhbnkgc3RyaW5nCitpbiB0aGUgbG9nIG1lc3NhZ2UgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuZXh0IGNoYXJhY3RlciBpbiBwYXR0ZXJuLgorQSBzdGFyIGF0IHRoZSBlbmQgb2YgcGF0dGVybiBtYXRjaGVzIGFueSBzdHJpbmcuCisKK1RpbWVzdGFtcHMgb3B0aW9uYWxseSBhZGRlZCBieSBzdmxvZ2QgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQKK29mIHRoZSBsb2cgbWVzc2FnZS4KKworQW4gc3Zsb2dkIHBhdHRlcm4gaXMgbm90IGEgcmVndWxhciBleHByZXNzaW9uLiBGb3IgZXhhbXBsZSBjb25zaWRlcgorYSBsb2cgbWVzc2FnZSBsaWtlIHRoaXMKKworMjAwNS0xMi0xOF8wOToxMzo1MC45NzYxOCB0Y3BzdmQ6IGluZm86IHBpZCAxOTc3IGZyb20gMTAuNC4xLjE0CisKK1RoZSBmb2xsb3dpbmcgcGF0dGVybiBkb2VzbnQgbWF0Y2gKKworLSpwaWQqCisKK2JlY2F1c2UgdGhlIGZpcnN0IHN0YXIgbWF0Y2hlcyB1cCB0byB0aGUgZmlyc3QgcCBpbiB0Y3BzdmQsCithbmQgdGhlbiB0aGUgbWF0Y2ggZmFpbHMgYmVjYXVzZSBpIGlzIG5vdCBzLiBUbyBtYXRjaCB0aGlzCitsb2cgbWVzc2FnZSwgeW91IGNhbiB1c2UgYSBwYXR0ZXJuIGxpa2UgdGhpcyBpbnN0ZWFkCisKKy0qOiAqOiBwaWQgKgorKi8KKworLy91c2FnZTojZGVmaW5lIHN2bG9nZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy10dHZdIFstciBDXSBbLVIgQ0hBUlNdIFstbCBNQVRDSExFTl0gWy1iIEJVRkxFTl0gRElSLi4uIgorLy91c2FnZTojZGVmaW5lIHN2bG9nZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnRpbnVvdXNseSByZWFkIGxvZyBkYXRhIGZyb20gc3RkaW4gYW5kIHdyaXRlIHRvIHJvdGF0ZWQgbG9nIGZpbGVzIGluIERJUnMiCisvL3VzYWdlOiAgICJcbiIKKy8vdXNhZ2U6ICAgIlxuIiJESVIvY29uZmlnIGZpbGUgbW9kaWZpZXMgYmVoYXZpb3I6IgorLy91c2FnZTogICAiXG4iInNTSVpFIC0gd2hlbiB0byByb3RhdGUgbG9ncyIKKy8vdXNhZ2U6ICAgIlxuIiJuTlVNIC0gbnVtYmVyIG9mIGZpbGVzIHRvIHJldGFpbiIKKy8qdXNhZ2U6ICAgIlxuIiJOTlVNIC0gbWluIG51bWJlciBmaWxlcyB0byByZXRhaW4iIC0gY29uZnVzaW5nICovCisvKnVzYWdlOiAgICJcbiIidFNFQyAtIHJvdGF0ZSBmaWxlIGlmIGl0IGdldCBTRUMgc2Vjb25kcyBvbGQiIC0gY29uZnVzaW5nICovCisvL3VzYWdlOiAgICJcbiIiIVBST0cgLSBwcm9jZXNzIHJvdGF0ZWQgbG9nIHdpdGggUFJPRyIKKy8qdXNhZ2U6ICAgIlxuIiJ1SVBBRERSIC0gc2VuZCBsb2cgb3ZlciBVRFAiIC0gdW5zdXBwb3J0ZWQgKi8KKy8qdXNhZ2U6ICAgIlxuIiJVSVBBRERSIC0gc2VuZCBsb2cgb3ZlciBVRFAgYW5kIERPTlQgbG9nIiAtIHVuc3VwcG9ydGVkICovCisvKnVzYWdlOiAgICJcbiIicFBGWCAtIHByZWZpeCBlYWNoIGxpbmUgd2l0aCBQRlgiIC0gdW5zdXBwb3J0ZWQgKi8KKy8vdXNhZ2U6ICAgIlxuIiIrLC1QQVRURVJOIC0gKGRlKXNlbGVjdCBsaW5lIGZvciBsb2dnaW5nIgorLy91c2FnZTogICAiXG4iIkUsZVBBVFRFUk4gLSAoZGUpc2VsZWN0IGxpbmUgZm9yIHN0ZGVyciIKKworI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ1bml0X2xpYi5oIgorCisjZGVmaW5lIExFU1MoYSxiKSAoKGludCkoKHVuc2lnbmVkKShiKSAtICh1bnNpZ25lZCkoYSkpID4gMCkKKworI2RlZmluZSBGTVRfUFRJTUUgMzAKKworc3RydWN0IGxvZ2RpciB7CisJLy8vL2NoYXIgKmJ0bXA7CisJLyogcGF0dGVybiBsaXN0IHRvIG1hdGNoLCBpbiAiYWFcMGJiXDBcY2NcMFwwIiBmb3JtICovCisJY2hhciAqaW5zdDsKKwljaGFyICpwcm9jZXNzb3I7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBzaXplOworCXVuc2lnbmVkIHNpemVtYXg7CisJdW5zaWduZWQgbm1heDsKKwl1bnNpZ25lZCBubWluOworCXVuc2lnbmVkIHJvdGF0ZV9wZXJpb2Q7CisJaW50IHBwaWQ7CisJaW50IGZkZGlyOworCWludCBmZGN1cjsKKwlGSUxFKiBmaWxlY3VyOyAvLy8vCisJaW50IGZkbG9jazsKKwl1bnNpZ25lZCBuZXh0X3JvdGF0ZTsKKwljaGFyIGZuc2F2ZVtGTVRfUFRJTUVdOworCWNoYXIgbWF0Y2g7CisJY2hhciBtYXRjaGVycjsKK307CisKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCBsb2dkaXIgKmRpcjsKKwl1bnNpZ25lZCB2ZXJib3NlOworCWludCBsaW5lbWF4OworCS8vLy9pbnQgYnVmbGVuOworCWludCBsaW5lbGVuOworCisJaW50IGZkd2RpcjsKKwljaGFyICoqZm5kaXI7CisJaW50IHdzdGF0OworCXVuc2lnbmVkIG5lYXJlc3Rfcm90YXRlOworCisJdm9pZCogKCptZW1SY2hyKShjb25zdCB2b2lkICosIGludCwgc2l6ZV90KTsKKwljaGFyICpzaGVsbDsKKworCXNtYWxsaW50IGV4aXRhc2FwOworCXNtYWxsaW50IHJvdGF0ZWFzYXA7CisJc21hbGxpbnQgcmVvcGVuYXNhcDsKKwlzbWFsbGludCBsaW5lY29tcGxldGU7CisJc21hbGxpbnQgdG1heGZsYWc7CisKKwljaGFyIHJlcGw7CisJY29uc3QgY2hhciAqcmVwbGFjZTsKKwlpbnQgZmxfZmxhZ18wOworCXVuc2lnbmVkIGRpcm47CisKKwlzaWdzZXRfdCBibG9ja2VkX3NpZ3NldDsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgZGlyICAgICAgICAgICAgKEcuZGlyICAgICAgICAgICApCisjZGVmaW5lIHZlcmJvc2UgICAgICAgIChHLnZlcmJvc2UgICAgICAgKQorI2RlZmluZSBsaW5lbWF4ICAgICAgICAoRy5saW5lbWF4ICAgICAgICkKKyNkZWZpbmUgYnVmbGVuICAgICAgICAgKEcuYnVmbGVuICAgICAgICApCisjZGVmaW5lIGxpbmVsZW4gICAgICAgIChHLmxpbmVsZW4gICAgICAgKQorI2RlZmluZSBmbmRpciAgICAgICAgICAoRy5mbmRpciAgICAgICAgICkKKyNkZWZpbmUgZmR3ZGlyICAgICAgICAgKEcuZmR3ZGlyICAgICAgICApCisjZGVmaW5lIHdzdGF0ICAgICAgICAgIChHLndzdGF0ICAgICAgICAgKQorI2RlZmluZSBtZW1SY2hyICAgICAgICAoRy5tZW1SY2hyICAgICAgICkKKyNkZWZpbmUgbmVhcmVzdF9yb3RhdGUgKEcubmVhcmVzdF9yb3RhdGUpCisjZGVmaW5lIGV4aXRhc2FwICAgICAgIChHLmV4aXRhc2FwICAgICAgKQorI2RlZmluZSByb3RhdGVhc2FwICAgICAoRy5yb3RhdGVhc2FwICAgICkKKyNkZWZpbmUgcmVvcGVuYXNhcCAgICAgKEcucmVvcGVuYXNhcCAgICApCisjZGVmaW5lIGxpbmVjb21wbGV0ZSAgIChHLmxpbmVjb21wbGV0ZSAgKQorI2RlZmluZSB0bWF4ZmxhZyAgICAgICAoRy50bWF4ZmxhZyAgICAgICkKKyNkZWZpbmUgcmVwbCAgICAgICAgICAgKEcucmVwbCAgICAgICAgICApCisjZGVmaW5lIHJlcGxhY2UgICAgICAgIChHLnJlcGxhY2UgICAgICAgKQorI2RlZmluZSBibG9ja2VkX3NpZ3NldCAoRy5ibG9ja2VkX3NpZ3NldCkKKyNkZWZpbmUgZmxfZmxhZ18wICAgICAgKEcuZmxfZmxhZ18wICAgICApCisjZGVmaW5lIGRpcm4gICAgICAgICAgIChHLmRpcm4gICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCWxpbmVtYXggPSAxMDAwOyBcCisJLypidWZsZW4gPSAxMDI0OyovIFwKKwlsaW5lY29tcGxldGUgPSAxOyBcCisJcmVwbGFjZSA9ICIiOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGxpbmUgYmJfY29tbW9uX2J1ZnNpejEKKworCisjZGVmaW5lIEZBVEFMICJmYXRhbDogIgorI2RlZmluZSBXQVJOSU5HICJ3YXJuaW5nOiAiCisjZGVmaW5lIFBBVVNFICJwYXVzaW5nOiAiCisjZGVmaW5lIElORk8gImluZm86ICIKKworc3RhdGljIHZvaWQgZmF0YWx4KGNvbnN0IGNoYXIgKm0wKQoreworCWJiX2Vycm9yX21zZ19hbmRfZGllKEZBVEFMIiVzIiwgbTApOworfQorc3RhdGljIHZvaWQgd2Fybihjb25zdCBjaGFyICptMCkKK3sKKwliYl9wZXJyb3JfbXNnKFdBUk5JTkciJXMiLCBtMCk7Cit9CitzdGF0aWMgdm9pZCB3YXJuMihjb25zdCBjaGFyICptMCwgY29uc3QgY2hhciAqbTEpCit7CisJYmJfcGVycm9yX21zZyhXQVJOSU5HIiVzOiAlcyIsIG0wLCBtMSk7Cit9CitzdGF0aWMgdm9pZCB3YXJueChjb25zdCBjaGFyICptMCwgY29uc3QgY2hhciAqbTEpCit7CisJYmJfZXJyb3JfbXNnKFdBUk5JTkciJXM6ICVzIiwgbTAsIG0xKTsKK30KK3N0YXRpYyB2b2lkIHBhdXNlX25vbWVtKHZvaWQpCit7CisJYmJfZXJyb3JfbXNnKFBBVVNFIm91dCBvZiBtZW1vcnkiKTsKKwlzbGVlcCgzKTsKK30KK3N0YXRpYyB2b2lkIHBhdXNlMWNhbm5vdChjb25zdCBjaGFyICptMCkKK3sKKwliYl9wZXJyb3JfbXNnKFBBVVNFImNhbid0ICVzIiwgbTApOworCXNsZWVwKDMpOworfQorc3RhdGljIHZvaWQgcGF1c2UyY2Fubm90KGNvbnN0IGNoYXIgKm0wLCBjb25zdCBjaGFyICptMSkKK3sKKwliYl9wZXJyb3JfbXNnKFBBVVNFImNhbid0ICVzICVzIiwgbTAsIG0xKTsKKwlzbGVlcCgzKTsKK30KKworc3RhdGljIGNoYXIqIHdzdHJkdXAoY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKnM7CisJd2hpbGUgKCEocyA9IHN0cmR1cChzdHIpKSkKKwkJcGF1c2Vfbm9tZW0oKTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHVuc2lnbmVkIHBtYXRjaChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsZW4pCit7CisJZm9yICg7OykgeworCQljaGFyIGMgPSAqcCsrOworCQlpZiAoIWMpIHJldHVybiAhbGVuOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnKic6CisJCQljID0gKnA7CisJCQlpZiAoIWMpIHJldHVybiAxOworCQkJZm9yICg7OykgeworCQkJCWlmICghbGVuKSByZXR1cm4gMDsKKwkJCQlpZiAoKnMgPT0gYykgYnJlYWs7CisJCQkJKytzOworCQkJCS0tbGVuOworCQkJfQorCQkJY29udGludWU7CisJCWNhc2UgJysnOgorCQkJYyA9ICpwKys7CisJCQlpZiAoYyAhPSAqcykgcmV0dXJuIDA7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCFsZW4pIHJldHVybiAxOworCQkJCWlmICgqcyAhPSBjKSBicmVhazsKKwkJCQkrK3M7CisJCQkJLS1sZW47CisJCQl9CisJCQljb250aW51ZTsKKwkJCS8qCisJCWNhc2UgJz8nOgorCQkJaWYgKCpwID09ICc/JykgeworCQkJCWlmICgqcyAhPSAnPycpIHJldHVybiAwOworCQkJCSsrcDsKKwkJCX0KKwkJCSsrczsgLS1sZW47CisJCQljb250aW51ZTsKKwkJCSovCisJCWRlZmF1bHQ6CisJCQlpZiAoIWxlbikgcmV0dXJuIDA7CisJCQlpZiAoKnMgIT0gYykgcmV0dXJuIDA7CisJCQkrK3M7CisJCQktLWxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioqIGV4IGZtdF9wdGltZS5bY2hdICoqKi8KKworLyogTlVMIHRlcm1pbmF0ZWQgKi8KK3N0YXRpYyB2b2lkIGZtdF90aW1lX2h1bWFuXzMwbnVsKGNoYXIgKnMpCit7CisJc3RydWN0IHRtICpwdG07CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlwdG0gPSBnbXRpbWUoJnR2LnR2X3NlYyk7CisJc3ByaW50ZihzLCAiJTA0dS0lMDJ1LSUwMnVfJTAydTolMDJ1OiUwMnUuJTA2dTAwMCIsCisJCSh1bnNpZ25lZCkoMTkwMCArIHB0bS0+dG1feWVhciksCisJCSh1bnNpZ25lZCkocHRtLT50bV9tb24gKyAxKSwKKwkJKHVuc2lnbmVkKShwdG0tPnRtX21kYXkpLAorCQkodW5zaWduZWQpKHB0bS0+dG1faG91ciksCisJCSh1bnNpZ25lZCkocHRtLT50bV9taW4pLAorCQkodW5zaWduZWQpKHB0bS0+dG1fc2VjKSwKKwkJKHVuc2lnbmVkKSh0di50dl91c2VjKQorCSk7CisJLyogNCsxICsgMisxICsgMisxICsgMisxICsgMisxICsgMisxICsgOSA9ICovCisJLyogNSAgICsgMyAgICsgMyAgICsgMyAgICsgMyAgICsgMyAgICsgOSA9ICovCisJLyogMjAgKHVwIHRvICcuJyBpbmNsdXNpdmUpICsgOSAobm90IGluY2x1ZGluZyAnXDAnKSAqLworfQorCisvKiBOT1QgdGVybWluYXRlZCEgKi8KK3N0YXRpYyB2b2lkIGZtdF90aW1lX2Jlcm5zdGVpbl8yNShjaGFyICpzKQoreworCXVpbnQzMl90IHBhY2tbM107CisJc3RydWN0IHRpbWV2YWwgdHY7CisJdW5zaWduZWQgc2VjX2hpOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJc2VjX2hpID0gKDB4NDAwMDAwMDAwMDAwMDAwYVVMTCArIHR2LnR2X3NlYykgPj4gMzI7CisJdHYudHZfc2VjID0gKHRpbWVfdCkoMHg0MDAwMDAwMDAwMDAwMDBhVUxMKSArIHR2LnR2X3NlYzsKKwl0di50dl91c2VjICo9IDEwMDA7CisJLyogTmV0d29yayBvcmRlciBpcyBiaWctZW5kaWFuOiBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuCisJICogVGhpcyBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudCBoZXJlICovCisJcGFja1swXSA9IGh0b25sKHNlY19oaSk7CisJcGFja1sxXSA9IGh0b25sKHR2LnR2X3NlYyk7CisJcGFja1syXSA9IGh0b25sKHR2LnR2X3VzZWMpOworCSpzKysgPSAnQCc7CisJYmluMmhleChzLCAoY2hhciopcGFjaywgMTIpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzb3JzdGFydChzdHJ1Y3QgbG9nZGlyICpsZCkKK3sKKwljaGFyIHN2X2NoOworCWludCBwaWQ7CisKKwlpZiAoIWxkLT5wcm9jZXNzb3IpIHJldHVybjsKKwlpZiAobGQtPnBwaWQpIHsKKwkJd2FybngoInByb2Nlc3NvciBhbHJlYWR5IHJ1bm5pbmciLCBsZC0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiB2Zm9yaydlZCBjaGlsZCB0cmFzaGVzIHRoaXMgYnl0ZSwgc2F2ZS4uLiAqLworCXN2X2NoID0gbGQtPmZuc2F2ZVsyNl07CisKKwlpZiAoIUcuc2hlbGwpCisJCUcuc2hlbGwgPSB4c3RyZHVwKGdldF9zaGVsbF9uYW1lKCkpOworCisJd2hpbGUgKChwaWQgPSB2Zm9yaygpKSA9PSAtMSkKKwkJcGF1c2UyY2Fubm90KCJ2Zm9yayBmb3IgcHJvY2Vzc29yIiwgbGQtPm5hbWUpOworCWlmICghcGlkKSB7CisJCWludCBmZDsKKworCQkvKiBjaGlsZCAqLworCQkvKiBOb24taWdub3JlZCBzaWduYWxzIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMgYW55d2F5ICovCisJCS8qYmJfc2lnbmFscygwCisJCQkrICgxIDw8IFNJR1RFUk0pCisJCQkrICgxIDw8IFNJR0FMUk0pCisJCQkrICgxIDw8IFNJR0hVUCkKKwkJCSwgU0lHX0RGTCk7Ki8KKwkJc2lnX3VuYmxvY2soU0lHVEVSTSk7CisJCXNpZ191bmJsb2NrKFNJR0FMUk0pOworCQlzaWdfdW5ibG9jayhTSUdIVVApOworCisJCWlmICh2ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKElORk8icHJvY2Vzc2luZzogJXMvJXMiLCBsZC0+bmFtZSwgbGQtPmZuc2F2ZSk7CisJCWZkID0geG9wZW4obGQtPmZuc2F2ZSwgT19SRE9OTFl8T19OREVMQVkpOworCQl4bW92ZV9mZChmZCwgMCk7CisJCWxkLT5mbnNhdmVbMjZdID0gJ3QnOyAvKiA8LSB0aGF0J3Mgd2h5IHdlIG5lZWQgc3ZfY2ghICovCisJCWZkID0geG9wZW4obGQtPmZuc2F2ZSwgT19XUk9OTFl8T19OREVMQVl8T19UUlVOQ3xPX0NSRUFUKTsKKwkJeG1vdmVfZmQoZmQsIDEpOworCQlmZCA9IG9wZW4oInN0YXRlIiwgT19SRE9OTFl8T19OREVMQVkpOworCQlpZiAoZmQgPT0gLTEpIHsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKEZBVEFMImNhbid0ICVzIHByb2Nlc3NvciAlcyIsICJvcGVuIHN0YXRlIGZvciIsIGxkLT5uYW1lKTsKKwkJCWNsb3NlKHhvcGVuKCJzdGF0ZSIsIE9fV1JPTkxZfE9fTkRFTEFZfE9fVFJVTkN8T19DUkVBVCkpOworCQkJZmQgPSB4b3Blbigic3RhdGUiLCBPX1JET05MWXxPX05ERUxBWSk7CisJCX0KKwkJeG1vdmVfZmQoZmQsIDQpOworCQlmZCA9IHhvcGVuKCJuZXdzdGF0ZSIsIE9fV1JPTkxZfE9fTkRFTEFZfE9fVFJVTkN8T19DUkVBVCk7CisJCXhtb3ZlX2ZkKGZkLCA1KTsKKworCQlleGVjbChHLnNoZWxsLCBHLnNoZWxsLCAiLWMiLCBsZC0+cHJvY2Vzc29yLCAoY2hhciopIE5VTEwpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoRkFUQUwiY2FuJ3QgJXMgcHJvY2Vzc29yICVzIiwgInJ1biIsIGxkLT5uYW1lKTsKKwl9CisJbGQtPmZuc2F2ZVsyNl0gPSBzdl9jaDsgLyogLi4ucmVzdG9yZSAqLworCWxkLT5wcGlkID0gcGlkOworfQorCitzdGF0aWMgdW5zaWduZWQgcHJvY2Vzc29yc3RvcChzdHJ1Y3QgbG9nZGlyICpsZCkKK3sKKwljaGFyIGZbMjhdOworCisJaWYgKGxkLT5wcGlkKSB7CisJCXNpZ191bmJsb2NrKFNJR0hVUCk7CisJCXdoaWxlIChzYWZlX3dhaXRwaWQobGQtPnBwaWQsICZ3c3RhdCwgMCkgPT0gLTEpCisJCQlwYXVzZTJjYW5ub3QoIndhaXQgZm9yIHByb2Nlc3NvciIsIGxkLT5uYW1lKTsKKwkJc2lnX2Jsb2NrKFNJR0hVUCk7CisJCWxkLT5wcGlkID0gMDsKKwl9CisJaWYgKGxkLT5mZGRpciA9PSAtMSkKKwkJcmV0dXJuIDE7CisJd2hpbGUgKGZjaGRpcihsZC0+ZmRkaXIpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoImNoYW5nZSBkaXJlY3RvcnksIHdhbnQgcHJvY2Vzc29yIiwgbGQtPm5hbWUpOworCWlmIChXRVhJVFNUQVRVUyh3c3RhdCkgIT0gMCkgeworCQl3YXJueCgicHJvY2Vzc29yIGZhaWxlZCwgcmVzdGFydCIsIGxkLT5uYW1lKTsKKwkJbGQtPmZuc2F2ZVsyNl0gPSAndCc7CisJCXVubGluayhsZC0+Zm5zYXZlKTsKKwkJbGQtPmZuc2F2ZVsyNl0gPSAndSc7CisJCXByb2Nlc3NvcnN0YXJ0KGxkKTsKKwkJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQkJcGF1c2UxY2Fubm90KCJjaGFuZ2UgdG8gaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIpOworCQlyZXR1cm4gbGQtPnByb2Nlc3NvciA/IDAgOiAxOworCX0KKwlsZC0+Zm5zYXZlWzI2XSA9ICd0JzsKKwltZW1jcHkoZiwgbGQtPmZuc2F2ZSwgMjYpOworCWZbMjZdID0gJ3MnOworCWZbMjddID0gJ1wwJzsKKwl3aGlsZSAocmVuYW1lKGxkLT5mbnNhdmUsIGYpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoInJlbmFtZSBwcm9jZXNzZWQiLCBsZC0+bmFtZSk7CisJd2hpbGUgKGNobW9kKGYsIDA3NDQpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoInNldCBtb2RlIG9mIHByb2Nlc3NlZCIsIGxkLT5uYW1lKTsKKwlsZC0+Zm5zYXZlWzI2XSA9ICd1JzsKKwlpZiAodW5saW5rKGxkLT5mbnNhdmUpID09IC0xKQorCQliYl9lcnJvcl9tc2coV0FSTklORyJjYW4ndCB1bmxpbms6ICVzLyVzIiwgbGQtPm5hbWUsIGxkLT5mbnNhdmUpOworCXdoaWxlIChyZW5hbWUoIm5ld3N0YXRlIiwgInN0YXRlIikgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgicmVuYW1lIHN0YXRlIiwgbGQtPm5hbWUpOworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coSU5GTyJwcm9jZXNzZWQ6ICVzLyVzIiwgbGQtPm5hbWUsIGYpOworCXdoaWxlIChmY2hkaXIoZmR3ZGlyKSA9PSAtMSkKKwkJcGF1c2UxY2Fubm90KCJjaGFuZ2UgdG8gaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBybW9sZGVzdChzdHJ1Y3QgbG9nZGlyICpsZCkKK3sKKwlESVIgKmQ7CisJc3RydWN0IGRpcmVudCAqZjsKKwljaGFyIG9sZGVzdFtGTVRfUFRJTUVdOworCWludCBuID0gMDsKKworCW9sZGVzdFswXSA9ICdBJzsgb2xkZXN0WzFdID0gb2xkZXN0WzI3XSA9IDA7CisJd2hpbGUgKCEoZCA9IG9wZW5kaXIoIi4iKSkpCisJCXBhdXNlMmNhbm5vdCgib3BlbiBkaXJlY3RvcnksIHdhbnQgcm90YXRlIiwgbGQtPm5hbWUpOworCWVycm5vID0gMDsKKwl3aGlsZSAoKGYgPSByZWFkZGlyKGQpKSkgeworCQlpZiAoKGYtPmRfbmFtZVswXSA9PSAnQCcpICYmIChzdHJsZW4oZi0+ZF9uYW1lKSA9PSAyNykpIHsKKwkJCWlmIChmLT5kX25hbWVbMjZdID09ICd0JykgeworCQkJCWlmICh1bmxpbmsoZi0+ZF9uYW1lKSA9PSAtMSkKKwkJCQkJd2FybjIoImNhbid0IHVubGluayBwcm9jZXNzb3IgbGVmdG92ZXIiLCBmLT5kX25hbWUpOworCQkJfSBlbHNlIHsKKwkJCQkrK247CisJCQkJaWYgKHN0cmNtcChmLT5kX25hbWUsIG9sZGVzdCkgPCAwKQorCQkJCQltZW1jcHkob2xkZXN0LCBmLT5kX25hbWUsIDI3KTsKKwkJCX0KKwkJCWVycm5vID0gMDsKKwkJfQorCX0KKwlpZiAoZXJybm8pCisJCXdhcm4yKCJjYW4ndCByZWFkIGRpcmVjdG9yeSIsIGxkLT5uYW1lKTsKKwljbG9zZWRpcihkKTsKKworCWlmIChsZC0+bm1heCAmJiAobiA+IGxkLT5ubWF4KSkgeworCQlpZiAodmVyYm9zZSkKKwkJCWJiX2Vycm9yX21zZyhJTkZPImRlbGV0ZTogJXMvJXMiLCBsZC0+bmFtZSwgb2xkZXN0KTsKKwkJaWYgKCgqb2xkZXN0ID09ICdAJykgJiYgKHVubGluayhvbGRlc3QpID09IC0xKSkKKwkJCXdhcm4yKCJjYW4ndCB1bmxpbmsgb2xkZXN0IGxvZ2ZpbGUiLCBsZC0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgcm90YXRlKHN0cnVjdCBsb2dkaXIgKmxkKQoreworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIG5vdzsKKworCWlmIChsZC0+ZmRkaXIgPT0gLTEpIHsKKwkJbGQtPnJvdGF0ZV9wZXJpb2QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxkLT5wcGlkKQorCQl3aGlsZSAoIXByb2Nlc3NvcnN0b3AobGQpKQorCQkJY29udGludWU7CisKKwl3aGlsZSAoZmNoZGlyKGxkLT5mZGRpcikgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgiY2hhbmdlIGRpcmVjdG9yeSwgd2FudCByb3RhdGUiLCBsZC0+bmFtZSk7CisKKwkvKiBjcmVhdGUgbmV3IGZpbGVuYW1lICovCisJbGQtPmZuc2F2ZVsyNV0gPSAnLic7CisJbGQtPmZuc2F2ZVsyNl0gPSAncyc7CisJaWYgKGxkLT5wcm9jZXNzb3IpCisJCWxkLT5mbnNhdmVbMjZdID0gJ3UnOworCWxkLT5mbnNhdmVbMjddID0gJ1wwJzsKKwlkbyB7CisJCWZtdF90aW1lX2Jlcm5zdGVpbl8yNShsZC0+Zm5zYXZlKTsKKwkJZXJybm8gPSAwOworCQlzdGF0KGxkLT5mbnNhdmUsICZzdCk7CisJfSB3aGlsZSAoZXJybm8gIT0gRU5PRU5UKTsKKworCW5vdyA9IG1vbm90b25pY19zZWMoKTsKKwlpZiAobGQtPnJvdGF0ZV9wZXJpb2QgJiYgTEVTUyhsZC0+bmV4dF9yb3RhdGUsIG5vdykpIHsKKwkJbGQtPm5leHRfcm90YXRlID0gbm93ICsgbGQtPnJvdGF0ZV9wZXJpb2Q7CisJCWlmIChMRVNTKGxkLT5uZXh0X3JvdGF0ZSwgbmVhcmVzdF9yb3RhdGUpKQorCQkJbmVhcmVzdF9yb3RhdGUgPSBsZC0+bmV4dF9yb3RhdGU7CisJfQorCisJaWYgKGxkLT5zaXplID4gMCkgeworCQl3aGlsZSAoZmZsdXNoKGxkLT5maWxlY3VyKSB8fCBmc3luYyhsZC0+ZmRjdXIpID09IC0xKQorCQkJcGF1c2UyY2Fubm90KCJmc3luYyBjdXJyZW50IGxvZ2ZpbGUiLCBsZC0+bmFtZSk7CisJCXdoaWxlIChmY2htb2QobGQtPmZkY3VyLCAwNzQ0KSA9PSAtMSkKKwkJCXBhdXNlMmNhbm5vdCgic2V0IG1vZGUgb2YgY3VycmVudCIsIGxkLT5uYW1lKTsKKwkJLy8vL2Nsb3NlKGxkLT5mZGN1cik7CisJCWZjbG9zZShsZC0+ZmlsZWN1cik7CisKKwkJaWYgKHZlcmJvc2UpIHsKKwkJCWJiX2Vycm9yX21zZyhJTkZPInJlbmFtZTogJXMvY3VycmVudCAlcyAldSIsIGxkLT5uYW1lLAorCQkJCQlsZC0+Zm5zYXZlLCBsZC0+c2l6ZSk7CisJCX0KKwkJd2hpbGUgKHJlbmFtZSgiY3VycmVudCIsIGxkLT5mbnNhdmUpID09IC0xKQorCQkJcGF1c2UyY2Fubm90KCJyZW5hbWUgY3VycmVudCIsIGxkLT5uYW1lKTsKKwkJd2hpbGUgKChsZC0+ZmRjdXIgPSBvcGVuKCJjdXJyZW50IiwgT19XUk9OTFl8T19OREVMQVl8T19BUFBFTkR8T19DUkVBVCwgMDYwMCkpID09IC0xKQorCQkJcGF1c2UyY2Fubm90KCJjcmVhdGUgbmV3IGN1cnJlbnQiLCBsZC0+bmFtZSk7CisJCXdoaWxlICgobGQtPmZpbGVjdXIgPSBmZG9wZW4obGQtPmZkY3VyLCAiYSIpKSA9PSBOVUxMKSAvLy8vCisJCQlwYXVzZTJjYW5ub3QoImNyZWF0ZSBuZXcgY3VycmVudCIsIGxkLT5uYW1lKTsgLyogdmVyeSB1bmxpa2VseSAqLworCQlzZXR2YnVmKGxkLT5maWxlY3VyLCBOVUxMLCBfSU9GQkYsIGxpbmVsZW4pOyAvLy8vCisJCWNsb3NlX29uX2V4ZWNfb24obGQtPmZkY3VyKTsKKwkJbGQtPnNpemUgPSAwOworCQl3aGlsZSAoZmNobW9kKGxkLT5mZGN1ciwgMDY0NCkgPT0gLTEpCisJCQlwYXVzZTJjYW5ub3QoInNldCBtb2RlIG9mIGN1cnJlbnQiLCBsZC0+bmFtZSk7CisKKwkJcm1vbGRlc3QobGQpOworCQlwcm9jZXNzb3JzdGFydChsZCk7CisJfQorCisJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQlwYXVzZTFjYW5ub3QoImNoYW5nZSB0byBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX3B3cml0ZShpbnQgbiwgY2hhciAqcywgdW5zaWduZWQgbGVuKQoreworCWludCBpOworCXN0cnVjdCBsb2dkaXIgKmxkID0gJmRpcltuXTsKKworCWlmIChsZC0+c2l6ZW1heCkgeworCQlpZiAobGQtPnNpemUgPj0gbGQtPnNpemVtYXgpCisJCQlyb3RhdGUobGQpOworCQlpZiAobGVuID4gKGxkLT5zaXplbWF4IC0gbGQtPnNpemUpKQorCQkJbGVuID0gbGQtPnNpemVtYXggLSBsZC0+c2l6ZTsKKwl9CisJd2hpbGUgKDEpIHsKKwkJLy8vL2kgPSBmdWxsX3dyaXRlKGxkLT5mZGN1ciwgcywgbGVuKTsKKwkJLy8vL2lmIChpICE9IC0xKSBicmVhazsKKwkJaSA9IGZ3cml0ZShzLCAxLCBsZW4sIGxkLT5maWxlY3VyKTsKKwkJaWYgKGkgPT0gbGVuKSBicmVhazsKKworCQlpZiAoKGVycm5vID09IEVOT1NQQykgJiYgKGxkLT5ubWluIDwgbGQtPm5tYXgpKSB7CisJCQlESVIgKmQ7CisJCQlzdHJ1Y3QgZGlyZW50ICpmOworCQkJY2hhciBvbGRlc3RbRk1UX1BUSU1FXTsKKwkJCWludCBqID0gMDsKKworCQkJd2hpbGUgKGZjaGRpcihsZC0+ZmRkaXIpID09IC0xKQorCQkJCXBhdXNlMmNhbm5vdCgiY2hhbmdlIGRpcmVjdG9yeSwgd2FudCByZW1vdmUgb2xkIGxvZ2ZpbGUiLAorCQkJCQkJCSBsZC0+bmFtZSk7CisJCQlvbGRlc3RbMF0gPSAnQSc7CisJCQlvbGRlc3RbMV0gPSBvbGRlc3RbMjddID0gJ1wwJzsKKwkJCXdoaWxlICghKGQgPSBvcGVuZGlyKCIuIikpKQorCQkJCXBhdXNlMmNhbm5vdCgib3BlbiBkaXJlY3RvcnksIHdhbnQgcmVtb3ZlIG9sZCBsb2dmaWxlIiwKKwkJCQkJCQkgbGQtPm5hbWUpOworCQkJZXJybm8gPSAwOworCQkJd2hpbGUgKChmID0gcmVhZGRpcihkKSkpCisJCQkJaWYgKChmLT5kX25hbWVbMF0gPT0gJ0AnKSAmJiAoc3RybGVuKGYtPmRfbmFtZSkgPT0gMjcpKSB7CisJCQkJCSsrajsKKwkJCQkJaWYgKHN0cmNtcChmLT5kX25hbWUsIG9sZGVzdCkgPCAwKQorCQkJCQkJbWVtY3B5KG9sZGVzdCwgZi0+ZF9uYW1lLCAyNyk7CisJCQkJfQorCQkJaWYgKGVycm5vKSB3YXJuMigiY2FuJ3QgcmVhZCBkaXJlY3RvcnksIHdhbnQgcmVtb3ZlIG9sZCBsb2dmaWxlIiwKKwkJCQkJbGQtPm5hbWUpOworCQkJY2xvc2VkaXIoZCk7CisJCQllcnJubyA9IEVOT1NQQzsKKwkJCWlmIChqID4gbGQtPm5taW4pIHsKKwkJCQlpZiAoKm9sZGVzdCA9PSAnQCcpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKFdBUk5JTkcib3V0IG9mIGRpc2sgc3BhY2UsIGRlbGV0ZTogJXMvJXMiLAorCQkJCQkJCWxkLT5uYW1lLCBvbGRlc3QpOworCQkJCQllcnJubyA9IDA7CisJCQkJCWlmICh1bmxpbmsob2xkZXN0KSA9PSAtMSkgeworCQkJCQkJd2FybjIoImNhbid0IHVubGluayBvbGRlc3QgbG9nZmlsZSIsIGxkLT5uYW1lKTsKKwkJCQkJCWVycm5vID0gRU5PU1BDOworCQkJCQl9CisJCQkJCXdoaWxlIChmY2hkaXIoZmR3ZGlyKSA9PSAtMSkKKwkJCQkJCXBhdXNlMWNhbm5vdCgiY2hhbmdlIHRvIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGVycm5vKQorCQkJcGF1c2UyY2Fubm90KCJ3cml0ZSB0byBjdXJyZW50IiwgbGQtPm5hbWUpOworCX0KKworCWxkLT5zaXplICs9IGk7CisJaWYgKGxkLT5zaXplbWF4KQorCQlpZiAoc1tpLTFdID09ICdcbicpCisJCQlpZiAobGQtPnNpemUgPj0gKGxkLT5zaXplbWF4IC0gbGluZW1heCkpCisJCQkJcm90YXRlKGxkKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgbG9nZGlyX2Nsb3NlKHN0cnVjdCBsb2dkaXIgKmxkKQoreworCWlmIChsZC0+ZmRkaXIgPT0gLTEpCisJCXJldHVybjsKKwlpZiAodmVyYm9zZSkKKwkJYmJfZXJyb3JfbXNnKElORk8iY2xvc2U6ICVzIiwgbGQtPm5hbWUpOworCWNsb3NlKGxkLT5mZGRpcik7CisJbGQtPmZkZGlyID0gLTE7CisJaWYgKGxkLT5mZGN1ciA9PSAtMSkKKwkJcmV0dXJuOyAvKiBpbXBvc3NpYmxlICovCisJd2hpbGUgKGZmbHVzaChsZC0+ZmlsZWN1cikgfHwgZnN5bmMobGQtPmZkY3VyKSA9PSAtMSkKKwkJcGF1c2UyY2Fubm90KCJmc3luYyBjdXJyZW50IGxvZ2ZpbGUiLCBsZC0+bmFtZSk7CisJd2hpbGUgKGZjaG1vZChsZC0+ZmRjdXIsIDA3NDQpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoInNldCBtb2RlIG9mIGN1cnJlbnQiLCBsZC0+bmFtZSk7CisJLy8vL2Nsb3NlKGxkLT5mZGN1cik7CisJZmNsb3NlKGxkLT5maWxlY3VyKTsKKwlsZC0+ZmRjdXIgPSAtMTsKKwlpZiAobGQtPmZkbG9jayA9PSAtMSkKKwkJcmV0dXJuOyAvKiBpbXBvc3NpYmxlICovCisJY2xvc2UobGQtPmZkbG9jayk7CisJbGQtPmZkbG9jayA9IC0xOworCWZyZWUobGQtPnByb2Nlc3Nvcik7CisJbGQtPnByb2Nlc3NvciA9IE5VTEw7Cit9CisKK3N0YXRpYyBOT0lOTElORSB1bnNpZ25lZCBsb2dkaXJfb3BlbihzdHJ1Y3QgbG9nZGlyICpsZCwgY29uc3QgY2hhciAqZm4pCit7CisJY2hhciBidWZbMTI4XTsKKwl1bnNpZ25lZCBub3c7CisJY2hhciAqbmV3LCAqcywgKm5wOworCWludCBpOworCXN0cnVjdCBzdGF0IHN0OworCisJbm93ID0gbW9ub3RvbmljX3NlYygpOworCisJbGQtPmZkZGlyID0gb3BlbihmbiwgT19SRE9OTFl8T19OREVMQVkpOworCWlmIChsZC0+ZmRkaXIgPT0gLTEpIHsKKwkJd2FybjIoImNhbid0IG9wZW4gbG9nIGRpcmVjdG9yeSIsIChjaGFyKilmbik7CisJCXJldHVybiAwOworCX0KKwljbG9zZV9vbl9leGVjX29uKGxkLT5mZGRpcik7CisJaWYgKGZjaGRpcihsZC0+ZmRkaXIpID09IC0xKSB7CisJCWxvZ2Rpcl9jbG9zZShsZCk7CisJCXdhcm4yKCJjYW4ndCBjaGFuZ2UgZGlyZWN0b3J5IiwgKGNoYXIqKWZuKTsKKwkJcmV0dXJuIDA7CisJfQorCWxkLT5mZGxvY2sgPSBvcGVuKCJsb2NrIiwgT19XUk9OTFl8T19OREVMQVl8T19BUFBFTkR8T19DUkVBVCwgMDYwMCk7CisJaWYgKChsZC0+ZmRsb2NrID09IC0xKQorCSB8fCAoZmxvY2sobGQtPmZkbG9jaywgTE9DS19FWCB8IExPQ0tfTkIpID09IC0xKQorCSkgeworCQlsb2dkaXJfY2xvc2UobGQpOworCQl3YXJuMigiY2FuJ3QgbG9jayBkaXJlY3RvcnkiLCAoY2hhciopZm4pOworCQl3aGlsZSAoZmNoZGlyKGZkd2RpcikgPT0gLTEpCisJCQlwYXVzZTFjYW5ub3QoImNoYW5nZSB0byBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCXJldHVybiAwOworCX0KKwljbG9zZV9vbl9leGVjX29uKGxkLT5mZGxvY2spOworCisJbGQtPnNpemUgPSAwOworCWxkLT5zaXplbWF4ID0gMTAwMDAwMDsKKwlsZC0+bm1heCA9IGxkLT5ubWluID0gMTA7CisJbGQtPnJvdGF0ZV9wZXJpb2QgPSAwOworCWxkLT5uYW1lID0gKGNoYXIqKWZuOworCWxkLT5wcGlkID0gMDsKKwlsZC0+bWF0Y2ggPSAnKyc7CisJZnJlZShsZC0+aW5zdCk7IGxkLT5pbnN0ID0gTlVMTDsKKwlmcmVlKGxkLT5wcm9jZXNzb3IpOyBsZC0+cHJvY2Vzc29yID0gTlVMTDsKKworCS8qIHJlYWQgY29uZmlnICovCisJaSA9IG9wZW5fcmVhZF9jbG9zZSgiY29uZmlnIiwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChpIDwgMCAmJiBlcnJubyAhPSBFTk9FTlQpCisJCWJiX3BlcnJvcl9tc2coV0FSTklORyIlcy9jb25maWciLCBsZC0+bmFtZSk7CisJaWYgKGkgPiAwKSB7CisJCWJ1ZltpXSA9ICdcMCc7CisJCWlmICh2ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKElORk8icmVhZDogJXMvY29uZmlnIiwgbGQtPm5hbWUpOworCQlzID0gYnVmOworCQl3aGlsZSAocykgeworCQkJbnAgPSBzdHJjaHIocywgJ1xuJyk7CisJCQlpZiAobnApCisJCQkJKm5wKysgPSAnXDAnOworCQkJc3dpdGNoIChzWzBdKSB7CisJCQljYXNlICcrJzoKKwkJCWNhc2UgJy0nOgorCQkJY2FzZSAnZSc6CisJCQljYXNlICdFJzoKKwkJCQkvKiBGaWx0ZXJpbmcgcmVxdWlyZXMgb25lLWxpbmUgYnVmZmVyaW5nLAorCQkJCSAqIHJlc2V0dGluZyB0aGUgImZpbmQgbmV3bGluZSIgZnVuY3Rpb24KKwkJCQkgKiBhY2NvcmRpbmdseSAqLworCQkJCW1lbVJjaHIgPSBtZW1jaHI7CisJCQkJLyogQWRkICdcbictdGVybWluYXRlZCBsaW5lIHRvIGxkLT5pbnN0ICovCisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJaW50IGwgPSBhc3ByaW50ZigmbmV3LCAiJXMlc1xuIiwgbGQtPmluc3QgPyBsZC0+aW5zdCA6ICIiLCBzKTsKKwkJCQkJaWYgKGwgPj0gMCAmJiBuZXcpCisJCQkJCQlicmVhazsKKwkJCQkJcGF1c2Vfbm9tZW0oKTsKKwkJCQl9CisJCQkJZnJlZShsZC0+aW5zdCk7CisJCQkJbGQtPmluc3QgPSBuZXc7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzogeworCQkJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQga21fc3VmZml4ZXNbXSA9IHsKKwkJCQkJeyAiayIsIDEwMjQgfSwKKwkJCQkJeyAibSIsIDEwMjQqMTAyNCB9LAorCQkJCQl7ICIiLCAwIH0KKwkJCQl9OworCQkJCWxkLT5zaXplbWF4ID0geGF0b3Vfc2Z4KCZzWzFdLCBrbV9zdWZmaXhlcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlICduJzoKKwkJCQlsZC0+bm1heCA9IHhhdG9pX3Bvc2l0aXZlKCZzWzFdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ04nOgorCQkJCWxkLT5ubWluID0geGF0b2lfcG9zaXRpdmUoJnNbMV0pOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6IHsKKwkJCQlzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IG1oX3N1ZmZpeGVzW10gPSB7CisJCQkJCXsgIm0iLCA2MCB9LAorCQkJCQl7ICJoIiwgNjAqNjAgfSwKKwkJCQkJLyp7ICJkIiwgMjQqNjAqNjAgfSwqLworCQkJCQl7ICIiLCAwIH0KKwkJCQl9OworCQkJCWxkLT5yb3RhdGVfcGVyaW9kID0geGF0b3Vfc2Z4KCZzWzFdLCBtaF9zdWZmaXhlcyk7CisJCQkJaWYgKGxkLT5yb3RhdGVfcGVyaW9kKSB7CisJCQkJCWxkLT5uZXh0X3JvdGF0ZSA9IG5vdyArIGxkLT5yb3RhdGVfcGVyaW9kOworCQkJCQlpZiAoIXRtYXhmbGFnIHx8IExFU1MobGQtPm5leHRfcm90YXRlLCBuZWFyZXN0X3JvdGF0ZSkpCisJCQkJCQluZWFyZXN0X3JvdGF0ZSA9IGxkLT5uZXh0X3JvdGF0ZTsKKwkJCQkJdG1heGZsYWcgPSAxOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJyEnOgorCQkJCWlmIChzWzFdKSB7CisJCQkJCWZyZWUobGQtPnByb2Nlc3Nvcik7CisJCQkJCWxkLT5wcm9jZXNzb3IgPSB3c3RyZHVwKHMpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCXMgPSBucDsKKwkJfQorCQkvKiBDb252ZXJ0ICJhYVxuYmJcbmNjXG5cMCIgdG8gImFhXDBiYlwwY2NcMFwwIiAqLworCQlzID0gbGQtPmluc3Q7CisJCXdoaWxlIChzKSB7CisJCQlucCA9IHN0cmNocihzLCAnXG4nKTsKKwkJCWlmIChucCkKKwkJCQkqbnArKyA9ICdcMCc7CisJCQlzID0gbnA7CisJCX0KKwl9CisKKwkvKiBvcGVuIGN1cnJlbnQgKi8KKwlpID0gc3RhdCgiY3VycmVudCIsICZzdCk7CisJaWYgKGkgIT0gLTEpIHsKKwkJaWYgKHN0LnN0X3NpemUgJiYgIShzdC5zdF9tb2RlICYgU19JWFVTUikpIHsKKwkJCWxkLT5mbnNhdmVbMjVdID0gJy4nOworCQkJbGQtPmZuc2F2ZVsyNl0gPSAndSc7CisJCQlsZC0+Zm5zYXZlWzI3XSA9ICdcMCc7CisJCQlkbyB7CisJCQkJZm10X3RpbWVfYmVybnN0ZWluXzI1KGxkLT5mbnNhdmUpOworCQkJCWVycm5vID0gMDsKKwkJCQlzdGF0KGxkLT5mbnNhdmUsICZzdCk7CisJCQl9IHdoaWxlIChlcnJubyAhPSBFTk9FTlQpOworCQkJd2hpbGUgKHJlbmFtZSgiY3VycmVudCIsIGxkLT5mbnNhdmUpID09IC0xKQorCQkJCXBhdXNlMmNhbm5vdCgicmVuYW1lIGN1cnJlbnQiLCBsZC0+bmFtZSk7CisJCQlybW9sZGVzdChsZCk7CisJCQlpID0gLTE7CisJCX0gZWxzZSB7CisJCQkvKiBzdC5zdF9zaXplIGNhbiBiZSBub3QganVzdCBiaWdnZXIsIGJ1dCBXSURFUiEKKwkJCSAqIFRoaXMgY29kZSBpcyBzYWZlOiBpZiBzdC5zdF9zaXplID4gNEdCLCB3ZSBzZWxlY3QKKwkJCSAqIGxkLT5zaXplbWF4IChiZWNhdXNlIGl0J3MgInVuc2lnbmVkIikgKi8KKwkJCWxkLT5zaXplID0gKHN0LnN0X3NpemUgPiBsZC0+c2l6ZW1heCkgPyBsZC0+c2l6ZW1heCA6IHN0LnN0X3NpemU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQlsb2dkaXJfY2xvc2UobGQpOworCQkJd2FybjIoImNhbid0IHN0YXQgY3VycmVudCIsIGxkLT5uYW1lKTsKKwkJCXdoaWxlIChmY2hkaXIoZmR3ZGlyKSA9PSAtMSkKKwkJCQlwYXVzZTFjYW5ub3QoImNoYW5nZSB0byBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl3aGlsZSAoKGxkLT5mZGN1ciA9IG9wZW4oImN1cnJlbnQiLCBPX1dST05MWXxPX05ERUxBWXxPX0FQUEVORHxPX0NSRUFULCAwNjAwKSkgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgib3BlbiBjdXJyZW50IiwgbGQtPm5hbWUpOworCXdoaWxlICgobGQtPmZpbGVjdXIgPSBmZG9wZW4obGQtPmZkY3VyLCAiYSIpKSA9PSBOVUxMKQorCQlwYXVzZTJjYW5ub3QoIm9wZW4gY3VycmVudCIsIGxkLT5uYW1lKTsgLy8vLworCXNldHZidWYobGQtPmZpbGVjdXIsIE5VTEwsIF9JT0ZCRiwgbGluZWxlbik7IC8vLy8KKworCWNsb3NlX29uX2V4ZWNfb24obGQtPmZkY3VyKTsKKwl3aGlsZSAoZmNobW9kKGxkLT5mZGN1ciwgMDY0NCkgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgic2V0IG1vZGUgb2YgY3VycmVudCIsIGxkLT5uYW1lKTsKKworCWlmICh2ZXJib3NlKSB7CisJCWlmIChpID09IDApIGJiX2Vycm9yX21zZyhJTkZPImFwcGVuZDogJXMvY3VycmVudCIsIGxkLT5uYW1lKTsKKwkJZWxzZSBiYl9lcnJvcl9tc2coSU5GTyJuZXc6ICVzL2N1cnJlbnQiLCBsZC0+bmFtZSk7CisJfQorCisJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQlwYXVzZTFjYW5ub3QoImNoYW5nZSB0byBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ2RpcnNfcmVvcGVuKHZvaWQpCit7CisJaW50IGw7CisJaW50IG9rID0gMDsKKworCXRtYXhmbGFnID0gMDsKKwlmb3IgKGwgPSAwOyBsIDwgZGlybjsgKytsKSB7CisJCWxvZ2Rpcl9jbG9zZSgmZGlyW2xdKTsKKwkJaWYgKGxvZ2Rpcl9vcGVuKCZkaXJbbF0sIGZuZGlyW2xdKSkKKwkJCW9rID0gMTsKKwl9CisJaWYgKCFvaykKKwkJZmF0YWx4KCJubyBmdW5jdGlvbmFsIGxvZyBkaXJlY3RvcmllcyIpOworfQorCisvKiBXaWxsIGxvb2sgZ29vZCBpbiBsaWJiYiBvbmUgZGF5ICovCitzdGF0aWMgc3NpemVfdCBuZGVsYXlfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmICghKGZsX2ZsYWdfMCAmIE9fTk9OQkxPQ0spKQorCQlmY250bChmZCwgRl9TRVRGTCwgZmxfZmxhZ18wIHwgT19OT05CTE9DSyk7CisJY291bnQgPSBzYWZlX3JlYWQoZmQsIGJ1ZiwgY291bnQpOworCWlmICghKGZsX2ZsYWdfMCAmIE9fTk9OQkxPQ0spKQorCQlmY250bChmZCwgRl9TRVRGTCwgZmxfZmxhZ18wKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIFVzZWQgZm9yIHJlYWRpbmcgc3RkaW4gKi8KK3N0YXRpYyBpbnQgYnVmZmVyX3ByZWFkKC8qaW50IGZkLCAqL2NoYXIgKnMsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBub3c7CisJc3RydWN0IHBvbGxmZCBpbnB1dDsKKwlpbnQgaTsKKworCWlucHV0LmZkID0gU1RESU5fRklMRU5POworCWlucHV0LmV2ZW50cyA9IFBPTExJTjsKKworCWRvIHsKKwkJaWYgKHJvdGF0ZWFzYXApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBkaXJuOyArK2kpCisJCQkJcm90YXRlKGRpciArIGkpOworCQkJcm90YXRlYXNhcCA9IDA7CisJCX0KKwkJaWYgKGV4aXRhc2FwKSB7CisJCQlpZiAobGluZWNvbXBsZXRlKQorCQkJCXJldHVybiAwOworCQkJbGVuID0gMTsKKwkJfQorCQlpZiAocmVvcGVuYXNhcCkgeworCQkJbG9nZGlyc19yZW9wZW4oKTsKKwkJCXJlb3BlbmFzYXAgPSAwOworCQl9CisJCW5vdyA9IG1vbm90b25pY19zZWMoKTsKKwkJbmVhcmVzdF9yb3RhdGUgPSBub3cgKyAoNDUgKiA2MCArIDQ1KTsKKwkJZm9yIChpID0gMDsgaSA8IGRpcm47ICsraSkgeworCQkJaWYgKGRpcltpXS5yb3RhdGVfcGVyaW9kKSB7CisJCQkJaWYgKExFU1MoZGlyW2ldLm5leHRfcm90YXRlLCBub3cpKQorCQkJCQlyb3RhdGUoZGlyICsgaSk7CisJCQkJaWYgKExFU1MoZGlyW2ldLm5leHRfcm90YXRlLCBuZWFyZXN0X3JvdGF0ZSkpCisJCQkJCW5lYXJlc3Rfcm90YXRlID0gZGlyW2ldLm5leHRfcm90YXRlOworCQkJfQorCQl9CisKKwkJc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZibG9ja2VkX3NpZ3NldCwgTlVMTCk7CisJCWkgPSBuZWFyZXN0X3JvdGF0ZSAtIG5vdzsKKwkJaWYgKGkgPiAxMDAwMDAwKQorCQkJaSA9IDEwMDAwMDA7CisJCWlmIChpIDw9IDApCisJCQlpID0gMTsKKwkJcG9sbCgmaW5wdXQsIDEsIGkgKiAxMDAwKTsKKwkJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmYmxvY2tlZF9zaWdzZXQsIE5VTEwpOworCisJCWkgPSBuZGVsYXlfcmVhZChTVERJTl9GSUxFTk8sIHMsIGxlbik7CisJCWlmIChpID49IDApCisJCQlicmVhazsKKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisJCWlmIChlcnJubyAhPSBFQUdBSU4pIHsKKwkJCXdhcm4oImNhbid0IHJlYWQgc3RhbmRhcmQgaW5wdXQiKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGVsc2U6IEVBR0FJTiAtIG5vcm1hbCwgcmVwZWF0IHNpbGVudGx5ICovCisJfSB3aGlsZSAoIWV4aXRhc2FwKTsKKworCWlmIChpID4gMCkgeworCQlpbnQgY250OworCQlsaW5lY29tcGxldGUgPSAoc1tpLTFdID09ICdcbicpOworCQlpZiAoIXJlcGwpCisJCQlyZXR1cm4gaTsKKworCQljbnQgPSBpOworCQl3aGlsZSAoLS1jbnQgPj0gMCkgeworCQkJY2hhciBjaCA9ICpzOworCQkJaWYgKGNoICE9ICdcbicpIHsKKwkJCQlpZiAoY2ggPCAzMiB8fCBjaCA+IDEyNikKKwkJCQkJKnMgPSByZXBsOworCQkJCWVsc2UgeworCQkJCQlpbnQgajsKKwkJCQkJZm9yIChqID0gMDsgcmVwbGFjZVtqXTsgKytqKSB7CisJCQkJCQlpZiAoY2ggPT0gcmVwbGFjZVtqXSkgeworCQkJCQkJCSpzID0gcmVwbDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXMrKzsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgc2lnX3Rlcm1faGFuZGxlcihpbnQgc2lnX25vIFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAodmVyYm9zZSkKKwkJYmJfZXJyb3JfbXNnKElORk8ic2lnJXMgcmVjZWl2ZWQiLCAidGVybSIpOworCWV4aXRhc2FwID0gMTsKK30KKworc3RhdGljIHZvaWQgc2lnX2NoaWxkX2hhbmRsZXIoaW50IHNpZ19ubyBVTlVTRURfUEFSQU0pCit7CisJcGlkX3QgcGlkOworCWludCBsOworCisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZyhJTkZPInNpZyVzIHJlY2VpdmVkIiwgImNoaWxkIik7CisJd2hpbGUgKChwaWQgPSB3YWl0X2FueV9ub2hhbmcoJndzdGF0KSkgPiAwKSB7CisJCWZvciAobCA9IDA7IGwgPCBkaXJuOyArK2wpIHsKKwkJCWlmIChkaXJbbF0ucHBpZCA9PSBwaWQpIHsKKwkJCQlkaXJbbF0ucHBpZCA9IDA7CisJCQkJcHJvY2Vzc29yc3RvcCgmZGlyW2xdKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2lnX2FsYXJtX2hhbmRsZXIoaW50IHNpZ19ubyBVTlVTRURfUEFSQU0pCit7CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZyhJTkZPInNpZyVzIHJlY2VpdmVkIiwgImFsYXJtIik7CisJcm90YXRlYXNhcCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19oYW5ndXBfaGFuZGxlcihpbnQgc2lnX25vIFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAodmVyYm9zZSkKKwkJYmJfZXJyb3JfbXNnKElORk8ic2lnJXMgcmVjZWl2ZWQiLCAiaGFuZ3VwIik7CisJcmVvcGVuYXNhcCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ21hdGNoKHN0cnVjdCBsb2dkaXIgKmxkKQoreworCWNoYXIgKnM7CisKKwlsZC0+bWF0Y2ggPSAnKyc7CisJbGQtPm1hdGNoZXJyID0gJ0UnOworCXMgPSBsZC0+aW5zdDsKKwl3aGlsZSAocyAmJiBzWzBdKSB7CisJCXN3aXRjaCAoc1swXSkgeworCQljYXNlICcrJzoKKwkJY2FzZSAnLSc6CisJCQlpZiAocG1hdGNoKHMrMSwgbGluZSwgbGluZWxlbikpCisJCQkJbGQtPm1hdGNoID0gc1swXTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJY2FzZSAnRSc6CisJCQlpZiAocG1hdGNoKHMrMSwgbGluZSwgbGluZWxlbikpCisJCQkJbGQtPm1hdGNoZXJyID0gc1swXTsKKwkJCWJyZWFrOworCQl9CisJCXMgKz0gc3RybGVuKHMpICsgMTsKKwl9Cit9CisKK2ludCBzdmxvZ2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN2bG9nZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpyLCAqbCwgKmI7CisJc3NpemVfdCBzdGRpbl9jbnQgPSAwOworCWludCBpOworCXVuc2lnbmVkIG9wdDsKKwl1bnNpZ25lZCB0aW1lc3RhbXAgPSAwOworCisJSU5JVF9HKCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ0dDp2diI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgInI6UjpsOmI6dHYiLAorCQkJJnIsICZyZXBsYWNlLCAmbCwgJmIsICZ0aW1lc3RhbXAsICZ2ZXJib3NlKTsKKwlpZiAob3B0ICYgMSkgeyAvLyAtcgorCQlyZXBsID0gclswXTsKKwkJaWYgKCFyZXBsIHx8IHJbMV0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCWlmIChvcHQgJiAyKSBpZiAoIXJlcGwpIHJlcGwgPSAnXyc7IC8vIC1SCisJaWYgKG9wdCAmIDQpIHsgLy8gLWwKKwkJbGluZW1heCA9IHhhdG91X3JhbmdlKGwsIDAsIEJVRlNJWi0yNik7CisJCWlmIChsaW5lbWF4ID09IDApCisJCQlsaW5lbWF4ID0gQlVGU0laLTI2OworCQlpZiAobGluZW1heCA8IDI1NikKKwkJCWxpbmVtYXggPSAyNTY7CisJfQorCS8vLy9pZiAob3B0ICYgOCkgeyAvLyAtYgorCS8vLy8JYnVmbGVuID0geGF0b2lfcG9zaXRpdmUoYik7CisJLy8vLwlpZiAoYnVmbGVuID09IDApIGJ1ZmxlbiA9IDEwMjQ7CisJLy8vL30KKwkvL2lmIChvcHQgJiAweDEwKSB0aW1lc3RhbXArKzsgLy8gLXQKKwkvL2lmIChvcHQgJiAweDIwKSB2ZXJib3NlKys7IC8vIC12CisJLy9pZiAodGltZXN0YW1wID4gMikgdGltZXN0YW1wID0gMjsKKwlhcmd2ICs9IG9wdGluZDsKKwlhcmdjIC09IG9wdGluZDsKKworCWRpcm4gPSBhcmdjOworCWlmIChkaXJuIDw9IDApCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwkvLy8vaWYgKGJ1ZmxlbiA8PSBsaW5lbWF4KSBiYl9zaG93X3VzYWdlKCk7CisJZmR3ZGlyID0geG9wZW4oIi4iLCBPX1JET05MWXxPX05ERUxBWSk7CisJY2xvc2Vfb25fZXhlY19vbihmZHdkaXIpOworCWRpciA9IHh6YWxsb2MoZGlybiAqIHNpemVvZihkaXJbMF0pKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlybjsgKytpKSB7CisJCWRpcltpXS5mZGRpciA9IC0xOworCQlkaXJbaV0uZmRjdXIgPSAtMTsKKwkJLy8vL2RpcltpXS5idG1wID0geG1hbGxvYyhidWZsZW4pOworCQkvKmRpcltpXS5wcGlkID0gMDsqLworCX0KKwkvKiBsaW5lID0geG1hbGxvYyhsaW5lbWF4ICsgKHRpbWVzdGFtcCA/IDI2IDogMCkpOyAqLworCWZuZGlyID0gYXJndjsKKwkvKiBXZSBjYW5ub3Qgc2V0IE5PTkJMT0NLIG9uIGZkICMwIHBlcm1hbmVudGx5IC0gdGhpcyBzZXR0aW5nCisJICogX2lzbid0XyBwZXItcHJvY2VzcyEgSXQgaXMgc2hhcmVkIGFtb25nIGFsbCBvdGhlciBwcm9jZXNzZXMKKwkgKiB3aXRoIHRoZSBzYW1lIHN0ZGluICovCisJZmxfZmxhZ18wID0gZmNudGwoMCwgRl9HRVRGTCk7CisKKwlzaWdlbXB0eXNldCgmYmxvY2tlZF9zaWdzZXQpOworCXNpZ2FkZHNldCgmYmxvY2tlZF9zaWdzZXQsIFNJR1RFUk0pOworCXNpZ2FkZHNldCgmYmxvY2tlZF9zaWdzZXQsIFNJR0NITEQpOworCXNpZ2FkZHNldCgmYmxvY2tlZF9zaWdzZXQsIFNJR0FMUk0pOworCXNpZ2FkZHNldCgmYmxvY2tlZF9zaWdzZXQsIFNJR0hVUCk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmYmxvY2tlZF9zaWdzZXQsIE5VTEwpOworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgxIDw8IFNJR1RFUk0sIHNpZ190ZXJtX2hhbmRsZXIpOworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgxIDw8IFNJR0NITEQsIHNpZ19jaGlsZF9oYW5kbGVyKTsKKwliYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoMSA8PCBTSUdBTFJNLCBzaWdfYWxhcm1faGFuZGxlcik7CisJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KDEgPDwgU0lHSFVQLCBzaWdfaGFuZ3VwX2hhbmRsZXIpOworCisJLyogV2l0aG91dCB0aW1lc3RhbXBzLCB3ZSBkb24ndCBoYXZlIHRvIHByaW50IGVhY2ggbGluZQorCSAqIHNlcGFyYXRlbHksIHNvIHdlIGNhbiBsb29rIGZvciBfbGFzdF8gbmV3bGluZSwgbm90IGZpcnN0LAorCSAqIHRodXMgYmF0Y2hpbmcgd3JpdGVzLiBJZiBmaWx0ZXJpbmcgaXMgZW5hYmxlZCBpbiBjb25maWcsCisJICogbG9nZGlyc19yZW9wZW4gcmVzZXRzIGl0IHRvIG1lbWNoci4KKwkgKi8KKwltZW1SY2hyID0gKHRpbWVzdGFtcCA/IG1lbWNociA6IG1lbXJjaHIpOworCisJbG9nZGlyc19yZW9wZW4oKTsKKworCXNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9GQkYsIGxpbmVsZW4pOworCisJLyogRWFjaCBpdGVyYXRpb24gcHJvY2Vzc2VzIG9uZSBvciBtb3JlIGxpbmVzICovCisJd2hpbGUgKDEpIHsKKwkJY2hhciBzdGFtcFtGTVRfUFRJTUVdOworCQljaGFyICpsaW5lcHRyOworCQljaGFyICpwcmludHB0cjsKKwkJY2hhciAqbnA7CisJCWludCBwcmludGxlbjsKKwkJY2hhciBjaDsKKworCQlsaW5lcHRyID0gbGluZTsKKwkJaWYgKHRpbWVzdGFtcCkKKwkJCWxpbmVwdHIgKz0gMjY7CisKKwkJLyogbGluZXB0clswLi5saW5lbWF4LTFdIC0gYnVmZmVyIGZvciBzdGRpbiAqLworCQkvKiAocG9zc2libHkgaGFzIHNvbWUgdW5wcm9jZXNzZWQgZGF0YSBmcm9tIHByZXYgbG9vcCkgKi8KKworCQkvKiBSZWZpbGwgdGhlIGJ1ZmZlciBpZiBuZWVkZWQgKi8KKwkJbnAgPSBtZW1SY2hyKGxpbmVwdHIsICdcbicsIHN0ZGluX2NudCk7CisJCWlmICghbnAgJiYgIWV4aXRhc2FwKSB7CisJCQlpID0gbGluZW1heCAtIHN0ZGluX2NudDsgLyogYXZhaWwuIGJ5dGVzIGF0IHRhaWwgKi8KKwkJCWlmIChpID49IDEyOCkgeworCQkJCWkgPSBidWZmZXJfcHJlYWQoLyowLCAqL2xpbmVwdHIgKyBzdGRpbl9jbnQsIGkpOworCQkJCWlmIChpIDw9IDApIC8qIEVPRiBvciBlcnJvciBvbiBzdGRpbiAqLworCQkJCQlleGl0YXNhcCA9IDE7CisJCQkJZWxzZSB7CisJCQkJCW5wID0gbWVtUmNocihsaW5lcHRyICsgc3RkaW5fY250LCAnXG4nLCBpKTsKKwkJCQkJc3RkaW5fY250ICs9IGk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzdGRpbl9jbnQgPD0gMCAmJiBleGl0YXNhcCkKKwkJCWJyZWFrOworCisJCS8qIFNlYXJjaCBmb3IgJ1xuJyAoaW4gZmFjdCwgbnAgYWxyZWFkeSBob2xkcyB0aGUgcmVzdWx0KSAqLworCQlsaW5lbGVuID0gc3RkaW5fY250OworCQlpZiAobnApIHsKKyBwcmludF90b19ubDoKKwkJCS8qIE5COiBzdGFydGluZyBmcm9tIGhlcmUgbGluZXB0ciBtYXkgcG9pbnQKKwkJCSAqIGZhcnRoZXIgb3V0IGludG8gbGluZVtdICovCisJCQlsaW5lbGVuID0gbnAgLSBsaW5lcHRyICsgMTsKKwkJfQorCQkvKiBsaW5lbGVuID09IG5vIG9mIGNoYXJzIGluY2wuICdcbicgKG9yID09IHN0ZGluX2NudCkgKi8KKwkJY2ggPSBsaW5lcHRyW2xpbmVsZW4tMV07CisKKwkJLyogQmlnZ2VzdCBwZXJmb3JtYW5jZSBoaXQgd2FzIGNvbWluZyBmcm9tIHRoZSBmYWN0CisJCSAqIHRoYXQgd2UgZGlkIG5vdCBidWZmZXIgd3JpdGVzLiBXZSB3ZXJlIHJlYWRpbmcgbWFueSBsaW5lcworCQkgKiBpbiBvbmUgcmVhZCgpIGFib3ZlLCBidXQgd3JvdGUgb25lIGxpbmUgcGVyIHdyaXRlKCkuCisJCSAqIFdlIGFyZSB1c2luZyBzdGRpbyB0byBmaXggdGhhdCAqLworCisJCS8qIHdyaXRlIG91dCBsaW5lcHRyWzAuLmxpbmVsZW4tMV0gdG8gZWFjaCBsb2cgZGVzdGluYXRpb24KKwkJICogKG9yIGxpbmVwdHJbLTI2Li5saW5lbGVuLTFdIGlmIHRpbWVzdGFtcGluZykgKi8KKwkJcHJpbnRsZW4gPSBsaW5lbGVuOworCQlwcmludHB0ciA9IGxpbmVwdHI7CisJCWlmICh0aW1lc3RhbXApIHsKKwkJCWlmICh0aW1lc3RhbXAgPT0gMSkKKwkJCQlmbXRfdGltZV9iZXJuc3RlaW5fMjUoc3RhbXApOworCQkJZWxzZSAvKiAyOiAqLworCQkJCWZtdF90aW1lX2h1bWFuXzMwbnVsKHN0YW1wKTsKKwkJCXByaW50bGVuICs9IDI2OworCQkJcHJpbnRwdHIgLT0gMjY7CisJCQltZW1jcHkocHJpbnRwdHIsIHN0YW1wLCAyNSk7CisJCQlwcmludHB0clsyNV0gPSAnICc7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGRpcm47ICsraSkgeworCQkJc3RydWN0IGxvZ2RpciAqbGQgPSAmZGlyW2ldOworCQkJaWYgKGxkLT5mZGRpciA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZC0+aW5zdCkKKwkJCQlsb2dtYXRjaChsZCk7CisJCQlpZiAobGQtPm1hdGNoZXJyID09ICdlJykgeworCQkJCS8qIHJ1bml0LTEuOC4wIGNvbXBhdDogaWYgdGltZXN0YW1waW5nLCBkbyBpdCBvbiBzdGRlcnIgdG9vICovCisJCQkJLy8vL2Z1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgcHJpbnRwdHIsIHByaW50bGVuKTsKKwkJCQlmd3JpdGUocHJpbnRwdHIsIDEsIHByaW50bGVuLCBzdGRlcnIpOworCQkJfQorCQkJaWYgKGxkLT5tYXRjaCAhPSAnKycpCisJCQkJY29udGludWU7CisJCQlidWZmZXJfcHdyaXRlKGksIHByaW50cHRyLCBwcmludGxlbik7CisJCX0KKworCQkvKiBJZiB3ZSBkaWRuJ3Qgc2VlICdcbicgKGxvbmcgaW5wdXQgbGluZSksICovCisJCS8qIHJlYWQvd3JpdGUgcmVwZWF0ZWRseSB1bnRpbCB3ZSBzZWUgaXQgKi8KKwkJd2hpbGUgKGNoICE9ICdcbicpIHsKKwkJCS8qIGxpbmVwdHIgaXMgZW1wdGllZCBub3csIHNhZmUgdG8gdXNlIGFzIGJ1ZmZlciAqLworCQkJc3RkaW5fY250ID0gZXhpdGFzYXAgPyAtMSA6IGJ1ZmZlcl9wcmVhZCgvKjAsICovbGluZXB0ciwgbGluZW1heCk7CisJCQlpZiAoc3RkaW5fY250IDw9IDApIHsgLyogRU9GIG9yIGVycm9yIG9uIHN0ZGluICovCisJCQkJZXhpdGFzYXAgPSAxOworCQkJCWxpbmVwdHJbMF0gPSBjaCA9ICdcbic7CisJCQkJbGluZWxlbiA9IDE7CisJCQkJc3RkaW5fY250ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJbGluZWxlbiA9IHN0ZGluX2NudDsKKwkJCQlucCA9IG1lbVJjaHIobGluZXB0ciwgJ1xuJywgc3RkaW5fY250KTsKKwkJCQlpZiAobnApCisJCQkJCWxpbmVsZW4gPSBucCAtIGxpbmVwdHIgKyAxOworCQkJCWNoID0gbGluZXB0cltsaW5lbGVuLTFdOworCQkJfQorCQkJLyogbGluZWxlbiA9PSBubyBvZiBjaGFycyBpbmNsLiAnXG4nIChvciA9PSBzdGRpbl9jbnQpICovCisJCQlmb3IgKGkgPSAwOyBpIDwgZGlybjsgKytpKSB7CisJCQkJaWYgKGRpcltpXS5mZGRpciA9PSAtMSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGRpcltpXS5tYXRjaGVyciA9PSAnZScpIHsKKwkJCQkJLy8vL2Z1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgbGluZXB0ciwgbGluZWxlbik7CisJCQkJCWZ3cml0ZShsaW5lcHRyLCAxLCBsaW5lbGVuLCBzdGRlcnIpOworCQkJCX0KKwkJCQlpZiAoZGlyW2ldLm1hdGNoICE9ICcrJykKKwkJCQkJY29udGludWU7CisJCQkJYnVmZmVyX3B3cml0ZShpLCBsaW5lcHRyLCBsaW5lbGVuKTsKKwkJCX0KKwkJfQorCisJCXN0ZGluX2NudCAtPSBsaW5lbGVuOworCQlpZiAoc3RkaW5fY250ID4gMCkgeworCQkJbGluZXB0ciArPSBsaW5lbGVuOworCQkJLyogSWYgd2Ugc2VlIGFub3RoZXIgJ1xuJywgd2UgZG9uJ3QgbmVlZCB0byByZWFkCisJCQkgKiBuZXh0IHBpZWNlIG9mIGlucHV0OiBjYW4gcHJpbnQgd2hhdCB3ZSBoYXZlICovCisJCQlucCA9IG1lbVJjaHIobGluZXB0ciwgJ1xuJywgc3RkaW5fY250KTsKKwkJCWlmIChucCkKKwkJCQlnb3RvIHByaW50X3RvX25sOworCQkJLyogTW92ZSB1bnByb2Nlc3NlZCBkYXRhIHRvIHRoZSBmcm9udCBvZiBsaW5lICovCisJCQltZW1tb3ZlKCh0aW1lc3RhbXAgPyBsaW5lKzI2IDogbGluZSksIGxpbmVwdHIsIHN0ZGluX2NudCk7CisJCX0KKwkJZmZsdXNoX2FsbCgpOy8vLy8KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlybjsgKytpKSB7CisJCWlmIChkaXJbaV0ucHBpZCkKKwkJCXdoaWxlICghcHJvY2Vzc29yc3RvcCgmZGlyW2ldKSkKKwkJCQljb250aW51ZTsKKwkJbG9nZGlyX2Nsb3NlKCZkaXJbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzE4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCkBAIC0wLDAgKzEsMTU0IEBACisjIyMjCisjIGtidWlsZDogR2VuZXJpYyBkZWZpbml0aW9ucworCisjIENvbnZpbmllbnQgdmFyaWFibGVzCitjb21tYSAgIDo9ICwKK3NxdW90ZSAgOj0gJworZW1wdHkgICA6PQorc3BhY2UgICA6PSAkKGVtcHR5KSAkKGVtcHR5KQorCisjIyMKKyMgVGhlIHRlbXBvcmFyeSBmaWxlIHRvIHNhdmUgZ2NjIC1NRCBnZW5lcmF0ZWQgZGVwZW5kZW5jaWVzIG11c3Qgbm90CisjIGNvbnRhaW4gYSBjb21tYQorZGVwZmlsZSA9ICQoc3Vic3QgJChjb21tYSksXywkKEBEKS8uJChARikuZCkKKworIyMjCisjIEVzY2FwZSBzaW5nbGUgcXVvdGUgZm9yIHVzZSBpbiBlY2hvIHN0YXRlbWVudHMKK2VzY3NxID0gJChzdWJzdCAkKHNxdW90ZSksJ1wkKHNxdW90ZSknLCQxKQorCisjIyMKKyMgZmlsZWNoayBpcyB1c2VkIHRvIGNoZWNrIGlmIHRoZSBjb250ZW50IG9mIGEgZ2VuZXJhdGVkIGZpbGUgaXMgdXBkYXRlZC4KKyMgU2FtcGxlIHVzYWdlOgorIyBkZWZpbmUgZmlsZWNoa19zYW1wbGUKKyMJZWNobyAkS0VSTkVMUkVMRUFTRQorIyBlbmRlZgorIyB2ZXJzaW9uLmggOiBNYWtlZmlsZQorIwkkKGNhbGwgZmlsZWNoayxzYW1wbGUpCisjIFRoZSBydWxlIGRlZmluZWQgc2hhbGwgd3JpdGUgdG8gc3Rkb3V0IHRoZSBjb250ZW50IG9mIHRoZSBuZXcgZmlsZS4KKyMgVGhlIGV4aXN0aW5nIGZpbGUgd2lsbCBiZSBjb21wYXJlZCB3aXRoIHRoZSBuZXcgb25lLgorIyAtIElmIG5vIGZpbGUgZXhpc3QgaXQgaXMgY3JlYXRlZAorIyAtIElmIHRoZSBjb250ZW50IGRpZmZlciB0aGUgbmV3IGZpbGUgaXMgdXNlZAorIyAtIElmIHRoZXkgYXJlIGVxdWFsIG5vIGNoYW5nZSwgYW5kIG5vIHRpbWVzdGFtcCB1cGRhdGUKKyMgLSBzdGRpbiBpcyBwaXBlZCBpbiBmcm9tIHRoZSBmaXJzdCBwcmVyZXF1aXNpdGUgKCQ8KSBzbyBvbmUgaGFzCisjICAgdG8gc3BlY2lmeSBhIHZhbGlkIGZpbGUgYXMgZmlyc3QgcHJlcmVxdWlzaXRlIChvZnRlbiB0aGUga2J1aWxkIGZpbGUpCitkZWZpbmUgZmlsZWNoaworCSQoUSlzZXQgLWU7CQkJCVwKKwllY2hvICcgIENISyAgICAgJEAnOwkJCVwKKwlta2RpciAtcCAkKGRpciAkQCk7CQkJXAorCSQoZmlsZWNoa18kKDEpKSA8ICQ8ID4gJEAudG1wOwkJXAorCWlmIFsgLXIgJEAgXSAmJiBjbXAgLXMgJEAgJEAudG1wOyB0aGVuCVwKKwkJcm0gLWYgJEAudG1wOwkJCVwKKwllbHNlCQkJCQlcCisJCWVjaG8gJyAgVVBEICAgICAkQCc7CQlcCisJCW12IC1mICRALnRtcCAkQDsJCVwKKwlmaQorZW5kZWYKKworIyMjIyMjCisjIGdjYyBzdXBwb3J0IGZ1bmN0aW9ucworIyBTZWUgZG9jdW1lbnRhdGlvbiBpbiBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisKKyMgYXMtb3B0aW9uCisjIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgYXMtb3B0aW9uLCAtV2EkKGNvbW1hKS1pc2E9Zm9vLCkKKworYXMtb3B0aW9uID0gJChzaGVsbCBpZiAkKENDKSAkKENGTEFHUykgJCgxKSAtV2EsLVogLWMgLW8gL2Rldi9udWxsIFwKKwkgICAgIC14YXNzZW1ibGVyIC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBcCisJICAgICBlbHNlIGVjaG8gIiQoMikiOyBmaSA7KQorCisjIGNjLW9wdGlvbgorIyBVc2FnZTogY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwgLW1hcmNoPXdpbmNoaXAtYzYsIC1tYXJjaD1pNTg2KQorCitjYy1vcHRpb24gPSAkKHNoZWxsIGlmICQoQ0MpICQoQ0ZMQUdTKSAkKDEpIC1TIC1vIC9kZXYvbnVsbCAteGMgL2Rldi9udWxsIFwKKyAgICAgICAgICAgICA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBlbHNlIGVjaG8gIiQoMikiOyBmaSA7KQorCisjIGhvc3RjYy1vcHRpb24KKyMgVXNhZ2U6IGhvc3RjZmxhZ3MteSArPSAkKGNhbGwgaG9zdGNjLW9wdGlvbiwgLW1hcmNoPXdpbmNoaXAtYzYsIC1tYXJjaD1pNTg2KQorCitob3N0Y2Mtb3B0aW9uID0gJChzaGVsbCBpZiAkKEhPU1RDQykgJChIT1NUQ0ZMQUdTKSAkKDEpIC1TIC1vIC9kZXYvbnVsbCAteGMgL2Rldi9udWxsIFwKKyAgICAgICAgICAgICA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBlbHNlIGVjaG8gIiQoMikiOyBmaSA7KQorCisjIGNjLW9wdGlvbi15bgorIyBVc2FnZTogZmxhZyA6PSAkKGNhbGwgY2Mtb3B0aW9uLXluLCAtbWFyY2g9d2luY2hpcC1jNikKK2NjLW9wdGlvbi15biA9ICQoc2hlbGwgaWYgJChDQykgJChDRkxBR1MpICQoMSkgLVMgLW8gL2Rldi9udWxsIC14YyAvZGV2L251bGwgXAorICAgICAgICAgICAgICAgID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAieSI7IGVsc2UgZWNobyAibiI7IGZpOykKKworIyBjYy1vcHRpb24tYWxpZ24KKyMgUHJlZml4IGFsaWduIHdpdGggZWl0aGVyIC1mYWxpZ24gb3IgLW1hbGlnbgorY2Mtb3B0aW9uLWFsaWduID0gJChzdWJzdCAtZnVuY3Rpb25zPTAsLFwKKwkkKGNhbGwgY2Mtb3B0aW9uLC1mYWxpZ24tZnVuY3Rpb25zPTAsLW1hbGlnbi1mdW5jdGlvbnM9MCkpCisKKyMgY2MtdmVyc2lvbgorIyBVc2FnZSBnY2MtdmVyIDo9ICQoY2FsbCBjYy12ZXJzaW9uLCAkKENDKSkKK2NjLXZlcnNpb24gPSAkKHNoZWxsIFBBVEg9IiQoUEFUSCkiICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggXAorICAgICAgICAgICAgICAkKGlmICQoMSksICQoMSksICQoQ0MpKSkKKworIyBjYy1pZnZlcnNpb24KKyMgVXNhZ2U6ICBFWFRSQV9DRkxBR1MgKz0gJChjYWxsIGNjLWlmdmVyc2lvbiwgLWx0LCAwNDAyLCAtTzEpCitjYy1pZnZlcnNpb24gPSAkKHNoZWxsIGlmIFsgJChjYWxsIGNjLXZlcnNpb24sICQoQ0MpKSAkKDEpICQoMikgXTsgdGhlbiBcCisgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJCgzKTsgZmk7KQorCisjIyMKKyMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSAtZiBzY3JpcHRzL01ha2VmaWxlLmJ1aWxkIG9iaj0KKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoYnVpbGQpPWRpcgorYnVpbGQgOj0gLWYgJChpZiAkKEtCVUlMRF9TUkMpLCQoc3JjdHJlZSkvKXNjcmlwdHMvTWFrZWZpbGUuYnVpbGQgb2JqCisKKyMgUHJlZml4IC1JIHdpdGggJChzcmN0cmVlKSBpZiBpdCBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aAorYWRkdHJlZSA9ICQoaWYgJChmaWx0ZXItb3V0IC1JLyUsJCgxKSksJChwYXRzdWJzdCAtSSUsLUkkKHNyY3RyZWUpLyUsJCgxKSkpICQoMSkKKyMgRmluZCBhbGwgLUkgb3B0aW9ucyBhbmQgY2FsbCBhZGR0cmVlCitmbGFncyA9ICQoZm9yZWFjaCBvLCQoJCgxKSksJChpZiAkKGZpbHRlciAtSSUsJChvKSksJChjYWxsIGFkZHRyZWUsJChvKSksJChvKSkpCisKKyMgSWYgcXVpZXQgaXMgc2V0LCBvbmx5IHByaW50IHNob3J0IHZlcnNpb24gb2YgY29tbWFuZAorY21kID0gQCQoZWNoby1jbWQpICQoY21kXyQoMSkpCisKKyMgQWRkICQob2JqKS8gZm9yIHBhdGhzIHRoYXQgaXMgbm90IGFic29sdXRlCitvYmplY3RpZnkgPSAkKGZvcmVhY2ggbywkKDEpLCQoaWYgJChmaWx0ZXIgLyUsJChvKSksJChvKSwkKG9iaikvJChvKSkpCisKKyMjIworIyBpZl9jaGFuZ2VkICAgICAgLSBleGVjdXRlIGNvbW1hbmQgaWYgYW55IHByZXJlcXVpc2l0ZSBpcyBuZXdlciB0aGFuCisjICAgICAgICAgICAgICAgICAgIHRhcmdldCwgb3IgY29tbWFuZCBsaW5lIGhhcyBjaGFuZ2VkCisjIGlmX2NoYW5nZWRfZGVwICAtIGFzIGlmX2NoYW5nZWQsIGJ1dCB1c2VzIGZpeGRlcCB0byByZXZlYWwgZGVwZW5kZW5jaWVzCisjICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB1c2VkIGNvbmZpZyBzeW1ib2xzCisjIGlmX2NoYW5nZWRfcnVsZSAtIGFzIGlmX2NoYW5nZWQgYnV0IGV4ZWN1dGUgcnVsZSBpbnN0ZWFkCisjIFNlZSBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGZvciBtb3JlIGluZm8KKworaWZuZXEgKCQoS0JVSUxEX05PQ01EREVQKSwxKQorIyBDaGVjayBpZiBib3RoIGFyZ3VtZW50cyBoYXMgc2FtZSBhcmd1bWVudHMuIFJlc3VsdCBpbiBlbXB0eSBzdHJpbmcgaWYgZXF1YWwKKyMgVXNlciBtYXkgb3ZlcnJpZGUgdGhpcyBjaGVjayB1c2luZyBtYWtlIEtCVUlMRF9OT0NNRERFUD0xCithcmctY2hlY2sgPSAkKHN0cmlwICQoZmlsdGVyLW91dCAkKDEpLCAkKDIpKSAkKGZpbHRlci1vdXQgJCgyKSwgJCgxKSkgKQorZW5kaWYKKworIyBlY2hvIGNvbW1hbmQuIFNob3J0IHZlcnNpb24gaXMgJChxdWlldCkgZXF1YWxzIHF1aWV0LCBvdGhlcndpc2UgZnVsbCBjb21tYW5kCitlY2hvLWNtZCA9ICQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSwgXAorCWVjaG8gJyAgJChjYWxsIGVzY3NxLCQoJChxdWlldCljbWRfJCgxKSkpJzspCisKK21ha2UtY21kID0gJChzdWJzdCBcIyxcXFwjLCQoc3Vic3QgJCQsJCQkJCwkKGNhbGwgZXNjc3EsJChjbWRfJCgxKSkpKSkKKworIyBmdW5jdGlvbiB0byBvbmx5IGV4ZWN1dGUgdGhlIHBhc3NlZCBjb21tYW5kIGlmIG5lY2Vzc2FyeQorIyA+Jzwgc3Vic3RpdHV0aW9uIGlzIGZvciBlY2hvIHRvIHdvcmssID4kPCBzdWJzdGl0dXRpb24gdG8gcHJlc2VydmUgJCB3aGVuIHJlbG9hZGluZyAuY21kIGZpbGUKKyMgbm90ZTogd2hlbiB1c2luZyBpbmxpbmUgcGVybCBzY3JpcHRzIFtwZXJsIC1lICcuLi4kJHQ9MTsuLi4nXSBpbiAkKGNtZF94eHgpIGRvdWJsZSAkJCB5b3VyIHBlcmwgdmFycworIworaWZfY2hhbmdlZCA9ICQoaWYgJChzdHJpcCAkKGZpbHRlci1vdXQgJChQSE9OWSksJD8pICAgICAgICAgIFwKKwkJJChjYWxsIGFyZy1jaGVjaywgJChjbWRfJCgxKSksICQoY21kXyRAKSkgKSwgXAorCUBzZXQgLWU7IFwKKwkkKGVjaG8tY21kKSAkKGNtZF8kKDEpKTsgXAorCWVjaG8gJ2NtZF8kQCA6PSAkKG1ha2UtY21kKScgPiAkKEBEKS8uJChARikuY21kKQorCisjIGV4ZWN1dGUgdGhlIGNvbW1hbmQgYW5kIGFsc28gcG9zdHByb2Nlc3MgZ2VuZXJhdGVkIC5kIGRlcGVuZGVuY2llcworIyBmaWxlCitpZl9jaGFuZ2VkX2RlcCA9ICQoaWYgJChzdHJpcCAkKGZpbHRlci1vdXQgJChQSE9OWSksJD8pICBcCisJCSQoZmlsdGVyLW91dCBGT1JDRSAkKHdpbGRjYXJkICReKSwkXikgICAgXAorCSQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksICAgICBcCisJQHNldCAtZTsgXAorCSQoZWNoby1jbWQpICQoY21kXyQoMSkpOyBcCisJc2NyaXB0cy9iYXNpYy9maXhkZXAgJChkZXBmaWxlKSAkQCAnJChtYWtlLWNtZCknID4gJChARCkvLiQoQEYpLnRtcDsgXAorCXJtIC1mICQoZGVwZmlsZSk7IFwKKwltdiAtZiAkKEBEKS8uJChARikudG1wICQoQEQpLy4kKEBGKS5jbWQpCisKKyMgVXNhZ2U6ICQoY2FsbCBpZl9jaGFuZ2VkX3J1bGUsZm9vKQorIyB3aWxsIGNoZWNrIGlmICQoY21kX2ZvbykgY2hhbmdlZCwgb3IgYW55IG9mIHRoZSBwcmVxdWlzaXRlcyBjaGFuZ2VkLAorIyBhbmQgaWYgc28gd2lsbCBleGVjdXRlICQocnVsZV9mb28pCitpZl9jaGFuZ2VkX3J1bGUgPSAkKGlmICQoc3RyaXAgJChmaWx0ZXItb3V0ICQoUEhPTlkpLCQ/KSAgICAgICAgICAgIFwKKwkJCSQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksXAorCQkJQHNldCAtZTsgXAorCQkJJChydWxlXyQoMSkpKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjQyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw3IEBACisjIyMKKyMgc2NyaXB0cyBjb250YWlucyBzb3VyY2VzIGZvciB2YXJpb3VzIGhlbHBlciBwcm9ncmFtcyB1c2VkIHRocm91Z2hvdXQKKyMgdGhlIGtlcm5lbCBmb3IgdGhlIGJ1aWxkIHByb2Nlc3MuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIExldCBjbGVhbiBkZXNjZW5kIGludG8gc3ViZGlycworc3ViZGlyLSArPSBiYXNpYyBrY29uZmlnCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL01ha2VmaWxlLklNQSBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvTWFrZWZpbGUuSU1BCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlY2VkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL01ha2VmaWxlLklNQQpAQCAtMCwwICsxLDIwOCBAQAorIyBUaGlzIGlzIGNvbXBsZXRlbHkgdW5zdXBwb3J0ZWQuCisjCisjIFVhc2dlOiBtYWtlIC1mIHNjcmlwdHMvTWFrZWZpbGUuSU1BCisjCisjIEZpeCBDT01CSU5FRF9DT01QSUxFIHVwc3RyZWFtIChpbiB0aGUgS2J1aWxkKSBhbmQgcHJvcGFnYXRlCisjIHRoZSBjaGFuZ2VzIGJhY2sKK3NyY3RyZWUJCTo9ICQoaWYgJChLQlVJTERfU1JDKSwkKEtCVUlMRF9TUkMpLCQoQ1VSRElSKSkKK29ianRyZWUJCTo9ICQoQ1VSRElSKQorc3JjCQk6PSAkKHNyY3RyZWUpCitvYmoJCTo9ICQob2JqdHJlZSkKKworIyBNYWtlIGdlbmVyYXRlZCBmaWxlcworRFVNTVkgOj0gJChzaGVsbCAkKFEpJChzcmN0cmVlKS9zY3JpcHRzL2dlbl9idWlsZF9maWxlcy5zaCAkKHNyY3RyZWUpICQob2JqdHJlZSkgPiYyKQorCisjIExvb2sgZm9yIG1ha2UgaW5jbHVkZSBmaWxlcyByZWxhdGl2ZSB0byByb290IG9mIHNyYworTUFLRUZMQUdTICs9IC0taW5jbHVkZS1kaXI9JChzcmN0cmVlKQorCitkZWZhdWx0OiBidXN5Ym94CisKK2luY2x1ZGUgLmNvbmZpZworCisjIENyb3NzIGNvbXBpbGluZyBhbmQgc2VsZWN0aW5nIGRpZmZlcmVudCBzZXQgb2YgZ2NjL2Jpbi11dGlscworaWZlcSAoJChDUk9TU19DT01QSUxFKSwpCitDUk9TU19DT01QSUxFIDo9ICQoc3Vic3QgIiwsJChDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYKSkKK2VuZGlmCisKK2lmbmVxICgkKENST1NTX0NPTVBJTEUpLCkKK1NVQkFSQ0ggOj0gJChzaGVsbCBlY2hvICQoQ1JPU1NfQ09NUElMRSkgfCBjdXQgLWQtIC1mMSkKK2Vsc2UKK1NVQkFSQ0ggOj0gJChzaGVsbCB1bmFtZSAtbSkKK2VuZGlmCitTVUJBUkNIIDo9ICQoc2hlbGwgZWNobyAkKFNVQkFSQ0gpIHwgc2VkIC1lIHMvaS44Ni9pMzg2LyAtZSBzL3N1bjR1L3NwYXJjNjQvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWUgcy9hcm0uKi9hcm0vIC1lIHMvc2ExMTAvYXJtLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lIHMvczM5MHgvczM5MC8gLWUgcy9wYXJpc2M2NC9wYXJpc2MvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWUgcy9wcGMuKi9wb3dlcnBjLyAtZSBzL21pcHMuKi9taXBzLyApCitBUkNIID89ICQoU1VCQVJDSCkKKworaWZuZGVmIEhPU1RDQworSE9TVENDID0gY2MKK2VuZGlmCitBUyAgICAgICAgICAgICAgPSAkKENST1NTX0NPTVBJTEUpYXMKK0NDICAgICAgICAgICAgICA9ICQoQ1JPU1NfQ09NUElMRSlnY2MKK0xEICAgICAgICAgICAgICA9ICQoQ0MpIC1ub3N0ZGxpYgorQ1BQICAgICAgICAgICAgID0gJChDQykgLUUKK0FSICAgICAgICAgICAgICA9ICQoQ1JPU1NfQ09NUElMRSlhcgorTk0gICAgICAgICAgICAgID0gJChDUk9TU19DT01QSUxFKW5tCitTVFJJUCAgICAgICAgICAgPSAkKENST1NTX0NPTVBJTEUpc3RyaXAKK09CSkNPUFkgICAgICAgICA9ICQoQ1JPU1NfQ09NUElMRSlvYmpjb3B5CitPQkpEVU1QICAgICAgICAgPSAkKENST1NTX0NPTVBJTEUpb2JqZHVtcAorCitDRkxBR1MgICA6PSAkKENGTEFHUykKK0NQUEZMQUdTICs9IC1EIktCVUlMRF9TVFIocyk9XCNzIiAjLVEKKworIyBXZSBuZWVkIHNvbWUgZ2VuZXJpYyBkZWZpbml0aW9ucworaW5jbHVkZSAkKHNyY3RyZWUpL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKworaW5jbHVkZSBNYWtlZmlsZS5mbGFncworCistaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gvJChBUkNIKS9NYWtlZmlsZQoraWZkZWYgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UKK3VzYWdlX3N0dWZmID0gaW5jbHVkZS91c2FnZV9jb21wcmVzc2VkLmgKK2VuZGlmCisKK2lmbmRlZiBCQl9WRVIKK0JCX1ZFUjo9IiIKK2VuZGlmCisKK1dIT0xFX1BST0dSQU06PSQoY2FsbCBjYy1vcHRpb24sLWZ3aG9sZS1wcm9ncmFtLCkKKworIyBwdWxsIGluIHRoZSBjb25maWcgc3R1ZmYKK2xpYi1hbGwteSA6PSBhcHBsZXRzL2FwcGxldHMubworbGliLXk6PQoraW5jbHVkZSBwcm9jcHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHByb2Nwcy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIG5ldHdvcmtpbmcvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLG5ldHdvcmtpbmcvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBuZXR3b3JraW5nL3VkaGNwL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxuZXR3b3JraW5nL3VkaGNwLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbmV0d29ya2luZy9saWJpcHJvdXRlL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxuZXR3b3JraW5nL2xpYmlwcm91dGUvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBsb2dpbnV0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxsb2dpbnV0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgYXJjaGl2YWwvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGFyY2hpdmFsLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgYXJjaGl2YWwvbGliYXJjaGl2ZS9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsYXJjaGl2YWwvbGliYXJjaGl2ZS8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGFwcGxldHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGFwcGxldHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBlMmZzcHJvZ3MvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGUyZnNwcm9ncy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CisjaW5jbHVkZSBlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9LYnVpbGQKKyNsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzLyUsJChzb3J0ICQobGliLXkpKSkKKyNsaWIteTo9CisjaW5jbHVkZSBlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvS2J1aWxkCisjbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvJSwkKHNvcnQgJChsaWIteSkpKQorI2xpYi15Oj0KKyNpbmNsdWRlIGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL0tidWlsZAorI2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvJSwkKHNvcnQgJChsaWIteSkpKQorI2xpYi15Oj0KKyNpbmNsdWRlIGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvS2J1aWxkCisjbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkLyUsJChzb3J0ICQobGliLXkpKSkKKyNsaWIteTo9CisjaW5jbHVkZSBlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvS2J1aWxkCisjbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvJSwkKHNvcnQgJChsaWIteSkpKQorI2xpYi15Oj0KK2luY2x1ZGUgZGViaWFudXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGRlYmlhbnV0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgcnVuaXQvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHJ1bml0LyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbW9kdXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLG1vZHV0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbWlzY3V0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxtaXNjdXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBtYWlsdXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLG1haWx1dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGNvcmV1dGlscy9saWJjb3JldXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGNvcmV1dGlscy9saWJjb3JldXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBjb3JldXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGNvcmV1dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIHN5c2tsb2dkL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxzeXNrbG9nZC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIHNoZWxsL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxzaGVsbC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGNvbnNvbGUtdG9vbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGNvbnNvbGUtdG9vbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBmaW5kdXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGZpbmR1dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIHV0aWwtbGludXgvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHV0aWwtbGludXgvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSB1dGlsLWxpbnV4L3ZvbHVtZV9pZC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsdXRpbC1saW51eC92b2x1bWVfaWQvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBpbml0L0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxpbml0LyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbGlicHdkZ3JwL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxsaWJwd2RncnAvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBlZGl0b3JzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxlZGl0b3JzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgcHJpbnR1dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUscHJpbnR1dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIHNlbGludXgvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHNlbGludXgvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBzY3JpcHRzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxzY3JpcHRzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbGliYmIvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGxpYmJiLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KKworY29tbWE6PSwKK2J1c3lib3hfdW5zdHJpcHBlZC5vOiAkKHVzYWdlX3N0dWZmKSBpbmNsdWRlL2FwcGxldF90YWJsZXMuaCBpbmNsdWRlL05VTV9BUFBMRVRTLmggaW5jbHVkZS9hdXRvY29uZi5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoRVhUUkFfQ0ZMQUdTKSBcCisJCSQocGF0c3Vic3QgJSwtV2wkKGNvbW1hKSUsJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpKSBcCisJCS1ER0NDX0NPTUJJTkU9MSBcCisJCS0tY29tYmluZSAkKFdIT0xFX1BST0dSQU0pIFwKKwkJLWZ1bml0LWF0LWEtdGltZSAtV25vLWVycm9yIC1zdGQ9Z251OTkgIFwKKwkJLWMgLW8gYnVzeWJveF91bnN0cmlwcGVkLm8gXAorCQkkKGxpYi1hbGwteToubz0uYykKKworYnVzeWJveDogYnVzeWJveF91bnN0cmlwcGVkLm8KKwkkKHNyY3RyZWUpL3NjcmlwdHMvdHJ5bGluayBcCisJCWJ1c3lib3hfdW5zdHJpcHBlZCBcCisJCSIkKENDKSAkKENGTEFHU19idXN5Ym94KSIgXAorCQkiJChDRkxBR1MpIiBcCisJCSIkKExERkxBR1MpIiBcCisJCSJidXN5Ym94X3Vuc3RyaXBwZWQubyIgXAorCQkiIiBcCisJCSJjcnlwdCBtIgorCWNwIC1mICQoQClfdW5zdHJpcHBlZCAkQAorCS0kKFNUUklQKSAtcyAtUiAubm90ZSAtUiAuY29tbWVudCAtUiAudmVyc2lvbiAkQAorCisjIElmIC5jb25maWcgaXMgbmV3ZXIgdGhhbiBpbmNsdWRlL2F1dG9jb25mLmgsIHNvbWVvbmUgdGlua2VyZWQKKyMgd2l0aCBpdCBhbmQgZm9yZ290IHRvIHJ1biBtYWtlIG9sZGNvbmZpZy4KK2luY2x1ZGUvYXV0b2NvbmYuaDogLmNvbmZpZworCSQoTUFLRSkgLWYgJChzcmN0cmVlKS9NYWtlZmlsZSBzaWxlbnRvbGRjb25maWcKKworIyBPdmVycmlkZSBydWxlcyBmb3IgaG9zdCBjb21waWxlCithcHBsZXRzL3VzYWdlOiBpbmNsdWRlL2F1dG9jb25mLmgKKwkkKEhPU1RDQykgLVdhbGwgLU8yIC1JJChzcmN0cmVlKS9pbmNsdWRlIC1vIGFwcGxldHMvdXNhZ2UgYXBwbGV0cy91c2FnZS5jCisKK2FwcGxldHMvYXBwbGV0X3RhYmxlczogaW5jbHVkZS9hdXRvY29uZi5oCisJJChIT1NUQ0MpIC1XYWxsIC1PMiAtSSQoc3JjdHJlZSkvaW5jbHVkZSAtbyBhcHBsZXRzL2FwcGxldF90YWJsZXMgYXBwbGV0cy9hcHBsZXRfdGFibGVzLmMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODViNWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCkBAIC0wLDAgKzEsMzQzIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEJ1aWxkaW5nCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3NyYyA6PSAkKG9iaikKKworUEhPTlkgOj0gX19idWlsZAorX19idWlsZDoKKworIyBSZWFkIC5jb25maWcgaWYgaXQgZXhpc3QsIG90aGVyd2lzZSBpZ25vcmUKKy1pbmNsdWRlIC5jb25maWcKKworaW5jbHVkZSBzY3JpcHRzL0tidWlsZC5pbmNsdWRlCisKKyMgVGhlIGZpbGVuYW1lIEtidWlsZCBoYXMgcHJlY2VkZW5jZSBvdmVyIE1ha2VmaWxlCisjIGJib3g6IHdlIGFsc28gdHJ5IHRvIGluY2x1ZGUgS2J1aWxkIGZpbGUgaW4gb2JqIHRyZWUgZmlyc3QKK2tidWlsZC1kaXIgOj0gJChpZiAkKGZpbHRlciAvJSwkKHNyYykpLCQoc3JjKSwkKHNyY3RyZWUpLyQoc3JjKSkKK2luY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQoc3JjKS9LYnVpbGQpLCAkKHNyYykvS2J1aWxkLCBcCisJCSQoaWYgJCh3aWxkY2FyZCAkKGtidWlsZC1kaXIpL0tidWlsZCksICQoa2J1aWxkLWRpcikvS2J1aWxkLCBcCisJCQkkKGtidWlsZC1kaXIpL01ha2VmaWxlIFwKKwkJKSBcCisJKQorCitpbmNsdWRlIHNjcmlwdHMvTWFrZWZpbGUubGliCisKK2lmZGVmIGhvc3QtcHJvZ3MKK2lmbmVxICgkKGhvc3Rwcm9ncy15KSwkKGhvc3QtcHJvZ3MpKQorJCh3YXJuaW5nIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gVXNhZ2Ugb2YgaG9zdC1wcm9ncyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcmVwbGFjZSB3aXRoIGhvc3Rwcm9ncy15ISkKK2hvc3Rwcm9ncy15ICs9ICQoaG9zdC1wcm9ncykKK2VuZGlmCitlbmRpZgorCisjIERvIG5vdCBpbmNsdWRlIGhvc3QgcnVsZXMgdW5sZXMgbmVlZGVkCitpZm5lcSAoJChob3N0cHJvZ3MteSkkKGhvc3Rwcm9ncy1tKSwpCitpbmNsdWRlIHNjcmlwdHMvTWFrZWZpbGUuaG9zdAorZW5kaWYKKworaWZuZXEgKCQoS0JVSUxEX1NSQyksKQorIyBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBpZiBub3QgYWxyZWFkeSBwcmVzZW50CitfZHVtbXkgOj0gJChzaGVsbCBbIC1kICQob2JqKSBdIHx8IG1rZGlyIC1wICQob2JqKSkKKworIyBDcmVhdGUgZGlyZWN0b3JpZXMgZm9yIG9iamVjdCBmaWxlcyBpZiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKKyMgTmVlZGVkIHdoZW4gb2JqLXkgOj0gZGlyL2ZpbGUubyBzeW50YXggaXMgdXNlZAorX2R1bW15IDo9ICQoZm9yZWFjaCBkLCQob2JqLWRpcnMpLCAkKHNoZWxsIFsgLWQgJChkKSBdIHx8IG1rZGlyIC1wICQoZCkpKQorZW5kaWYKKworCitpZmRlZiBFWFRSQV9UQVJHRVRTCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBFWFRSQV9UQVJHRVRTIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZmRlZiBidWlsZC10YXJnZXRzCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBidWlsZC10YXJnZXRzIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZmRlZiBleHBvcnQtb2JqcworJCh3YXJuaW5nIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gVXNhZ2Ugb2YgZXhwb3J0LW9ianMgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIE9fVEFSR0VUCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBPX1RBUkdFVCA6PSAkKE9fVEFSR0VUKSBpcyBvYnNvbGV0ZSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgTF9UQVJHRVQKKyQoZXJyb3Iga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2Ugb2YgTF9UQVJHRVQgaXMgcmVwbGFjZWQgYnkgbGliLXkgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIGxpc3QtbXVsdGkKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIGxpc3QtbXVsdGkgOj0gJChsaXN0LW11bHRpKSBpcyBvYnNvbGV0ZSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZuZGVmIG9iagorJCh3YXJuaW5nIGtidWlsZDogTWFrZWZpbGUuYnVpbGQgaXMgaW5jbHVkZWQgaW1wcm9wZXJseSkKK2VuZGlmCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lmbmVxICgkKHN0cmlwICQobGliLXkpICQobGliLW0pICQobGliLW4pICQobGliLSkpLCkKK2xpYi10YXJnZXQgOj0gJChvYmopL2xpYi5hCitlbmRpZgorCitpZm5lcSAoJChzdHJpcCAkKG9iai15KSAkKG9iai1tKSAkKG9iai1uKSAkKG9iai0pICQobGliLXRhcmdldCkpLCkKK2J1aWx0aW4tdGFyZ2V0IDo9ICQob2JqKS9idWlsdC1pbi5vCitlbmRpZgorCisjIFdlIGtlZXAgYSBsaXN0IG9mIGFsbCBtb2R1bGVzIGluICQoTU9EVkVSRElSKQorCitfX2J1aWxkOiAkKGlmICQoS0JVSUxEX0JVSUxUSU4pLCQoYnVpbHRpbi10YXJnZXQpICQobGliLXRhcmdldCkgJChleHRyYS15KSkgXAorCSAkKGlmICQoS0JVSUxEX01PRFVMRVMpLCQob2JqLW0pKSBcCisJICQoc3ViZGlyLXltKSAkKGFsd2F5cykKKwlAOgorCisjIExpbnVzJyBrZXJuZWwgc2FuaXR5IGNoZWNraW5nIHRvb2wKK2lmbmVxICgkKEtCVUlMRF9DSEVDS1NSQyksMCkKKyAgaWZlcSAoJChLQlVJTERfQ0hFQ0tTUkMpLDIpCisgICAgcXVpZXRfY21kX2ZvcmNlX2NoZWNrc3JjID0gQ0hFQ0sgICAkPAorICAgICAgICAgIGNtZF9mb3JjZV9jaGVja3NyYyA9ICQoQ0hFQ0spICQoQ0hFQ0tGTEFHUykgJChjX2ZsYWdzKSAkPCA7CisgIGVsc2UKKyAgICAgIHF1aWV0X2NtZF9jaGVja3NyYyAgICAgPSBDSEVDSyAgICQ8CisgICAgICAgICAgICBjbWRfY2hlY2tzcmMgICAgID0gJChDSEVDSykgJChDSEVDS0ZMQUdTKSAkKGNfZmxhZ3MpICQ8IDsKKyAgZW5kaWYKK2VuZGlmCisKKworIyBDb21waWxlIEMgc291cmNlcyAoLmMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIERlZmF1bHQgaXMgYnVpbHQtaW4sIHVubGVzcyB3ZSBrbm93IG90aGVyd2lzZQorbW9ka2Vybl9jZmxhZ3MgOj0gJChDRkxBR1NfS0VSTkVMKQorcXVpZXRfbW9kdGFnIDo9ICQoZW1wdHkpICAgJChlbXB0eSkKKworJChyZWFsLW9ianMtbSkgICAgICAgIDogbW9ka2Vybl9jZmxhZ3MgOj0gJChDRkxBR1NfTU9EVUxFKQorJChyZWFsLW9ianMtbToubz0uaSkgIDogbW9ka2Vybl9jZmxhZ3MgOj0gJChDRkxBR1NfTU9EVUxFKQorJChyZWFsLW9ianMtbToubz0ucykgIDogbW9ka2Vybl9jZmxhZ3MgOj0gJChDRkxBR1NfTU9EVUxFKQorJChyZWFsLW9ianMtbToubz0ubHN0KTogbW9ka2Vybl9jZmxhZ3MgOj0gJChDRkxBR1NfTU9EVUxFKQorCiskKHJlYWwtb2Jqcy1tKSAgICAgICAgOiBxdWlldF9tb2R0YWcgOj0gW01dCiskKHJlYWwtb2Jqcy1tOi5vPS5pKSAgOiBxdWlldF9tb2R0YWcgOj0gW01dCiskKHJlYWwtb2Jqcy1tOi5vPS5zKSAgOiBxdWlldF9tb2R0YWcgOj0gW01dCiskKHJlYWwtb2Jqcy1tOi5vPS5sc3QpOiBxdWlldF9tb2R0YWcgOj0gW01dCisKKyQob2JqLW0pICAgICAgICAgICAgICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKworIyBEZWZhdWx0IGZvciBub3QgbXVsdGktcGFydCBtb2R1bGVzCittb2RuYW1lID0gJCgqRikKKworJChtdWx0aS1vYmpzLW0pICAgICAgICAgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQorJChtdWx0aS1vYmpzLW06Lm89LmkpICAgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQorJChtdWx0aS1vYmpzLW06Lm89LnMpICAgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQorJChtdWx0aS1vYmpzLW06Lm89LmxzdCkgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQorJChtdWx0aS1vYmpzLXkpICAgICAgICAgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQorJChtdWx0aS1vYmpzLXk6Lm89LmkpICAgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQorJChtdWx0aS1vYmpzLXk6Lm89LnMpICAgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQorJChtdWx0aS1vYmpzLXk6Lm89LmxzdCkgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQorCitxdWlldF9jbWRfY2Nfc19jID0gQ0MgJChxdWlldF9tb2R0YWcpICAkQAorY21kX2NjX3NfYyAgICAgICA9ICQoQ0MpICQoY19mbGFncykgLWZ2ZXJib3NlLWFzbSAtUyAtbyAkQCAkPAorCislLnM6ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19zX2MpCisKK3F1aWV0X2NtZF9jY19pX2MgPSBDUFAgJChxdWlldF9tb2R0YWcpICRACitjbWRfY2NfaV9jICAgICAgID0gJChDUFApICQoY19mbGFncykgICAtbyAkQCAkPAorCislLmk6ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19pX2MpCisKKyMgQyAoLmMpIGZpbGVzCisjIFRoZSBDIGZpbGUgaXMgY29tcGlsZWQgYW5kIHVwZGF0ZWQgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpcyBnZW5lcmF0ZWQuCisjIChTZWUgY21kX2NjX29fYyArIHJlbGV2YW50IHBhcnQgb2YgcnVsZV9jY19vX2MpCisKK3F1aWV0X2NtZF9jY19vX2MgPSBDQyAkKHF1aWV0X21vZHRhZykgICRACisKK2lmbmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKK2NtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpIC1jIC1vICRAICQ8CisKK2Vsc2UKKyMgV2hlbiBtb2R1bGUgdmVyc2lvbmluZyBpcyBlbmFibGVkIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIGV4ZWN1dGVkOgorIyBvIGNvbXBpbGUgYSAudG1wXzxmaWxlPi5vIGZyb20gPGZpbGU+LmMKKyMgbyBpZiAudG1wXzxmaWxlPi5vIGRvZXNuJ3QgY29udGFpbiBhIF9fa3N5bXRhYiB2ZXJzaW9uLCBpLmUuIGRvZXMKKyMgICBub3QgZXhwb3J0IHN5bWJvbHMsIHdlIGp1c3QgcmVuYW1lIC50bXBfPGZpbGU+Lm8gdG8gPGZpbGU+Lm8gYW5kCisjICAgYXJlIGRvbmUuCisjIG8gb3RoZXJ3aXNlLCB3ZSBjYWxjdWxhdGUgc3ltYm9sIHZlcnNpb25zIHVzaW5nIHRoZSBnb29kIG9sZAorIyAgIGdlbmtzeW1zIG9uIHRoZSBwcmVwcm9jZXNzZWQgc291cmNlIGFuZCBwb3N0cHJvY2VzcyB0aGVtIGluIGEgd2F5CisjICAgdGhhdCB0aGV5IGFyZSB1c2FibGUgYXMgYSBsaW5rZXIgc2NyaXB0CisjIG8gZ2VuZXJhdGUgPGZpbGU+Lm8gZnJvbSAudG1wXzxmaWxlPi5vIHVzaW5nIHRoZSBsaW5rZXIgdG8KKyMgICByZXBsYWNlIHRoZSB1bnJlc29sdmVkIHN5bWJvbHMgX19jcmNfZXhwb3J0ZWRfc3ltYm9sIHdpdGgKKyMgICB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBjaGVja3N1bSBnZW5lcmF0ZWQgYnkgZ2Vua3N5bXMKKworY21kX2NjX29fYyA9ICQoQ0MpICQoY19mbGFncykgLWMgLW8gJChARCkvLnRtcF8kKEBGKSAkPAorY21kX21vZHZlcnNpb25zID0JCQkJCQkJXAorCWlmICQoT0JKRFVNUCkgLWggJChARCkvLnRtcF8kKEBGKSB8IGdyZXAgLXEgX19rc3ltdGFiOyB0aGVuCVwKKwkJJChDUFApIC1EX19HRU5LU1lNU19fICQoY19mbGFncykgJDwJCQlcCisJCXwgJChHRU5LU1lNUykgLWEgJChBUkNIKQkJCQlcCisJCT4gJChARCkvLnRtcF8kKEBGOi5vPS52ZXIpOwkJCQlcCisJCQkJCQkJCQlcCisJCSQoTEQpICQoTERGTEFHUykgLXIgLW8gJEAgJChARCkvLnRtcF8kKEBGKSAJCVwKKwkJCS1UICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJCQlcCisJCXJtIC1mICQoQEQpLy50bXBfJChARikgJChARCkvLnRtcF8kKEBGOi5vPS52ZXIpOwlcCisJZWxzZQkJCQkJCQkJXAorCQltdiAtZiAkKEBEKS8udG1wXyQoQEYpICRAOwkJCQlcCisJZmk7CitlbmRpZgorCitkZWZpbmUgcnVsZV9jY19vX2MKKwkkKGNhbGwgZWNoby1jbWQsY2hlY2tzcmMpICQoY21kX2NoZWNrc3JjKQkJCSAgXAorCSQoY2FsbCBlY2hvLWNtZCxjY19vX2MpICQoY21kX2NjX29fYyk7CQkJCSAgXAorCSQoY21kX21vZHZlcnNpb25zKQkJCQkJCSAgXAorCXNjcmlwdHMvYmFzaWMvZml4ZGVwICQoZGVwZmlsZSkgJEAgJyQoY2FsbCBtYWtlLWNtZCxjY19vX2MpJyA+ICQoQEQpLy4kKEBGKS50bXA7ICBcCisJcm0gLWYgJChkZXBmaWxlKTsJCQkJCQkgIFwKKwltdiAtZiAkKEBEKS8uJChARikudG1wICQoQEQpLy4kKEBGKS5jbWQKK2VuZGVmCisKKyMgQnVpbHQtaW4gYW5kIGNvbXBvc2l0ZSBtb2R1bGUgcGFydHMKKworJS5vOiAlLmMgRk9SQ0UKKwkkKGNhbGwgY21kLGZvcmNlX2NoZWNrc3JjKQorCSQoY2FsbCBpZl9jaGFuZ2VkX3J1bGUsY2Nfb19jKQorCisjIFNpbmdsZS1wYXJ0IG1vZHVsZXMgYXJlIHNwZWNpYWwgc2luY2Ugd2UgbmVlZCB0byBtYXJrIHRoZW0gaW4gJChNT0RWRVJESVIpCisKKyQoc2luZ2xlLXVzZWQtbSk6ICUubzogJS5jIEZPUkNFCisJJChjYWxsIGNtZCxmb3JjZV9jaGVja3NyYykKKwkkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGNjX29fYykKKwlAeyBlY2hvICQoQDoubz0ua28pOyBlY2hvICRAOyB9ID4gJChNT0RWRVJESVIpLyQoQEY6Lm89Lm1vZCkKKworcXVpZXRfY21kX2NjX2xzdF9jID0gTUtMU1QgICAkQAorICAgICAgY21kX2NjX2xzdF9jID0gJChDQykgJChjX2ZsYWdzKSAtZyAtYyAtbyAkKi5vICQ8ICYmIFwKKwkJICAgICAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL21ha2Vsc3QgJCoubyBcCisJCQkJICAgICBTeXN0ZW0ubWFwICQoT0JKRFVNUCkgPiAkQAorCislLmxzdDogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX2xzdF9jKQorCisjIENvbXBpbGUgYXNzZW1ibGVyIHNvdXJjZXMgKC5TKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbW9ka2Vybl9hZmxhZ3MgOj0gJChBRkxBR1NfS0VSTkVMKQorCiskKHJlYWwtb2Jqcy1tKSAgICAgIDogbW9ka2Vybl9hZmxhZ3MgOj0gJChBRkxBR1NfTU9EVUxFKQorJChyZWFsLW9ianMtbToubz0ucyk6IG1vZGtlcm5fYWZsYWdzIDo9ICQoQUZMQUdTX01PRFVMRSkKKworcXVpZXRfY21kX2FzX3NfUyA9IENQUCAkKHF1aWV0X21vZHRhZykgJEAKK2NtZF9hc19zX1MgICAgICAgPSAkKENQUCkgJChhX2ZsYWdzKSAgIC1vICRAICQ8CisKKyUuczogJS5TIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGFzX3NfUykKKworcXVpZXRfY21kX2FzX29fUyA9IEFTICQocXVpZXRfbW9kdGFnKSAgJEAKK2NtZF9hc19vX1MgICAgICAgPSAkKENDKSAkKGFfZmxhZ3MpIC1jIC1vICRAICQ8CisKKyUubzogJS5TIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGFzX29fUykKKwordGFyZ2V0cyArPSAkKHJlYWwtb2Jqcy15KSAkKHJlYWwtb2Jqcy1tKSAkKGxpYi15KQordGFyZ2V0cyArPSAkKGV4dHJhLXkpICQoTUFLRUNNREdPQUxTKSAkKGFsd2F5cykKKworIyBMaW5rZXIgc2NyaXB0cyBwcmVwcm9jZXNzb3IgKC5sZHMuUyAtPiAubGRzKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3F1aWV0X2NtZF9jcHBfbGRzX1MgPSBMRFMgICAgICRACisgICAgICBjbWRfY3BwX2xkc19TID0gJChDUFApICQoY3BwX2ZsYWdzKSAtRF9fQVNTRU1CTFlfXyAtbyAkQCAkPAorCislLmxkczogJS5sZHMuUyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjcHBfbGRzX1MpCisKKyMgQnVpbGQgdGhlIGNvbXBpbGVkLWluIHRhcmdldHMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVG8gYnVpbGQgb2JqZWN0cyBpbiBzdWJkaXJzLCB3ZSBuZWVkIHRvIGRlc2NlbmQgaW50byB0aGUgZGlyZWN0b3JpZXMKKyQoc29ydCAkKHN1YmRpci1vYmoteSkpOiAkKHN1YmRpci15bSkgOworCisjCisjIFJ1bGUgdG8gY29tcGlsZSBhIHNldCBvZiAubyBmaWxlcyBpbnRvIG9uZSAubyBmaWxlCisjCitpZmRlZiBidWlsdGluLXRhcmdldAorcXVpZXRfY21kX2xpbmtfb190YXJnZXQgPSBMRCAgICAgICRACisjIElmIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gbGluayBpcyBlbXB0eSwganVzdCBjcmVhdGUgYW4gZW1wdHkgYnVpbHQtaW4ubworY21kX2xpbmtfb190YXJnZXQgPSAkKGlmICQoc3RyaXAgJChvYmoteSkpLFwKKwkJJChMRCkgJChsZF9mbGFncykgLXIgLW8gJEAgJChmaWx0ZXIgJChvYmoteSksICReKSxcCisJCXJtIC1mICRAOyAkKEFSKSByY3MgJEApCisKKyQoYnVpbHRpbi10YXJnZXQpOiAkKG9iai15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfb190YXJnZXQpCisKK3RhcmdldHMgKz0gJChidWlsdGluLXRhcmdldCkKK2VuZGlmICMgYnVpbHRpbi10YXJnZXQKKworIworIyBSdWxlIHRvIGNvbXBpbGUgYSBzZXQgb2YgLm8gZmlsZXMgaW50byBvbmUgLmEgZmlsZQorIworaWZkZWYgbGliLXRhcmdldAorcXVpZXRfY21kX2xpbmtfbF90YXJnZXQgPSBBUiAgICAgICRACitjbWRfbGlua19sX3RhcmdldCA9IHJtIC1mICRAOyAkKEFSKSAkKEVYVFJBX0FSRkxBR1MpIHJjcyAkQCAkKGxpYi15KQorCiskKGxpYi10YXJnZXQpOiAkKGxpYi15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfbF90YXJnZXQpCisKK3RhcmdldHMgKz0gJChsaWItdGFyZ2V0KQorZW5kaWYKKworIworIyBSdWxlIHRvIGxpbmsgY29tcG9zaXRlIG9iamVjdHMKKyMKKyMgIENvbXBvc2l0ZSBvYmplY3RzIGFyZSBzcGVjaWZpZWQgaW4ga2J1aWxkIG1ha2VmaWxlIGFzIGZvbGxvd3M6CisjICAgIDxjb21wb3NpdGUtb2JqZWN0Pi1vYmpzIDo9IDxsaXN0IG9mIC5vIGZpbGVzPgorIyAgb3IKKyMgICAgPGNvbXBvc2l0ZS1vYmplY3Q+LXkgICAgOj0gPGxpc3Qgb2YgLm8gZmlsZXM+CitsaW5rX211bHRpX2RlcHMgPSAgICAgICAgICAgICAgICAgICAgIFwKKyQoZmlsdGVyICQoYWRkcHJlZml4ICQob2JqKS8sICAgICAgICAgXAorJCgkKHN1YnN0ICQob2JqKS8sLCQoQDoubz0tb2JqcykpKSAgICBcCiskKCQoc3Vic3QgJChvYmopLywsJChAOi5vPS15KSkpKSwgJF4pCisKK3F1aWV0X2NtZF9saW5rX211bHRpLXkgPSBMRCAgICAgICRACitjbWRfbGlua19tdWx0aS15ID0gJChMRCkgJChsZF9mbGFncykgLXIgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCisKK3F1aWV0X2NtZF9saW5rX211bHRpLW0gPSBMRCBbTV0gICRACitjbWRfbGlua19tdWx0aS1tID0gJChMRCkgJChsZF9mbGFncykgJChMREZMQUdTX01PRFVMRSkgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCisKKyMgV2Ugd291bGQgcmF0aGVyIGhhdmUgYSBsaXN0IG9mIHJ1bGVzIGxpa2UKKyMgCWZvby5vOiAkKGZvby1vYmpzKQorIyBidXQgdGhhdCdzIG5vdCBzbyBlYXN5LCBzbyB3ZSByYXRoZXIgbWFrZSBhbGwgY29tcG9zaXRlIG9iamVjdHMgZGVwZW5kCisjIG9uIHRoZSBzZXQgb2YgYWxsIHRoZWlyIHBhcnRzCiskKG11bHRpLXVzZWQteSkgOiAlLm86ICQobXVsdGktb2Jqcy15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfbXVsdGkteSkKKworJChtdWx0aS11c2VkLW0pIDogJS5vOiAkKG11bHRpLW9ianMtbSkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsaW5rX211bHRpLW0pCisJQHsgZWNobyAkKEA6Lm89LmtvKTsgZWNobyAkKGxpbmtfbXVsdGlfZGVwcyk7IH0gPiAkKE1PRFZFUkRJUikvJChARjoubz0ubW9kKQorCit0YXJnZXRzICs9ICQobXVsdGktdXNlZC15KSAkKG11bHRpLXVzZWQtbSkKKworCisjIERlc2NlbmRpbmcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BIT05ZICs9ICQoc3ViZGlyLXltKQorJChzdWJkaXIteW0pOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSRACisKKyMgQWRkIEZPUkNFIHRvIHRoZSBwcmVxdWlzaXRlcyBvZiBhIHRhcmdldCB0byBmb3JjZSBpdCB0byBiZSBhbHdheXMgcmVidWlsdC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BIT05ZICs9IEZPUkNFCisKK0ZPUkNFOgorCisjIFJlYWQgYWxsIHNhdmVkIGNvbW1hbmQgbGluZXMgYW5kIGRlcGVuZGVuY2llcyBmb3IgdGhlICQodGFyZ2V0cykgd2UKKyMgbWF5IGJlIGJ1aWxkaW5nIGFib3ZlLCB1c2luZyAkKGlmX2NoYW5nZWR7LF9kZXB9KS4gQXMgYW4KKyMgb3B0aW1pemF0aW9uLCB3ZSBkb24ndCBuZWVkIHRvIHJlYWQgdGhlbSBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90CisjIGV4aXN0LCB3ZSB3aWxsIHJlYnVpbGQgYW55d2F5IGluIHRoYXQgY2FzZS4KKwordGFyZ2V0cyA6PSAkKHdpbGRjYXJkICQoc29ydCAkKHRhcmdldHMpKSkKK2NtZF9maWxlcyA6PSAkKHdpbGRjYXJkICQoZm9yZWFjaCBmLCQodGFyZ2V0cyksJChkaXIgJChmKSkuJChub3RkaXIgJChmKSkuY21kKSkKKworaWZuZXEgKCQoY21kX2ZpbGVzKSwpCisgIGluY2x1ZGUgJChjbWRfZmlsZXMpCitlbmRpZgorCisKKyMgRGVjbGFyZSB0aGUgY29udGVudHMgb2YgdGhlIC5QSE9OWSB2YXJpYWJsZSBhcyBwaG9ueS4gIFdlIGtlZXAgdGhhdAorIyBpbmZvcm1hdGlvbiBpbiBhIHZhcmlhYmxlIHNlIHdlIGNhbiB1c2UgaXQgaW4gaWZfY2hhbmdlZCBhbmQgZnJpZW5kcy4KKworLlBIT05ZOiAkKFBIT05ZKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9NYWtlZmlsZS5jbGVhbiBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlMzk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4KQEAgLTAsMCArMSwxMDIgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ2xlYW5pbmcgdXAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3JjIDo9ICQob2JqKQorCitQSE9OWSA6PSBfX2NsZWFuCitfX2NsZWFuOgorCisjIFNob3J0aGFuZCBmb3IgJChRKSQoTUFLRSkgc2NyaXB0cy9NYWtlZmlsZS5jbGVhbiBvYmo9ZGlyCisjIFVzYWdlOgorIyAkKFEpJChNQUtFKSAkKGNsZWFuKT1kaXIKK2NsZWFuIDo9IC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iagorCisjIFRoZSBmaWxlbmFtZSBLYnVpbGQgaGFzIHByZWNlZGVuY2Ugb3ZlciBNYWtlZmlsZQora2J1aWxkLWRpciA6PSAkKGlmICQoZmlsdGVyIC8lLCQoc3JjKSksJChzcmMpLCQoc3JjdHJlZSkvJChzcmMpKQorLWluY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQoa2J1aWxkLWRpcikvS2J1aWxkKSwgJChrYnVpbGQtZGlyKS9LYnVpbGQsICQoa2J1aWxkLWRpcikvTWFrZWZpbGUpCisKKyMgRmlndXJlIG91dCB3aGF0IHdlIG5lZWQgdG8gYnVpbGQgZnJvbSB0aGUgdmFyaW91cyB2YXJpYWJsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworX19zdWJkaXIteQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLXkpKSkKK3N1YmRpci15CSs9ICQoX19zdWJkaXIteSkKK19fc3ViZGlyLW0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1tKSkpCitzdWJkaXItbQkrPSAkKF9fc3ViZGlyLW0pCitfX3N1YmRpci1uCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotbikpKQorc3ViZGlyLW4JKz0gJChfX3N1YmRpci1uKQorX19zdWJkaXItCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotKSkpCitzdWJkaXItCQkrPSAkKF9fc3ViZGlyLSkKKworIyBTdWJkaXJlY3RvcmllcyB3ZSBuZWVkIHRvIGRlc2NlbmQgaW50bworCitzdWJkaXIteW0JOj0gJChzb3J0ICQoc3ViZGlyLXkpICQoc3ViZGlyLW0pKQorc3ViZGlyLXltbiAgICAgIDo9ICQoc29ydCAkKHN1YmRpci15bSkgJChzdWJkaXItbikgJChzdWJkaXItKSkKKworIyBBZGQgc3ViZGlyIHBhdGgKKworc3ViZGlyLXltbgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXltbikpCisKKyMgYnVpbGQgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgdXN1YWxseSByZWxlYXRpdmUgdG8gdGhlIGN1cnJlbnQKKyMgZGlyZWN0b3J5CisKK19fY2xlYW4tZmlsZXMJOj0gJChleHRyYS15KSAkKEVYVFJBX1RBUkdFVFMpICQoYWx3YXlzKSBcCisJCSAgICQodGFyZ2V0cykgJChjbGVhbi1maWxlcykgICAgICAgICAgICAgXAorCQkgICAkKGhvc3QtcHJvZ3MpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgJChob3N0cHJvZ3MteSkgJChob3N0cHJvZ3MtbSkgJChob3N0cHJvZ3MtKQorCisjIGFzIGNsZWFuLWZpbGVzIGlzIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhpcyBhZGRzCisjIGEgJChvYmopIHByZWZpeCwgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocworCitfX2NsZWFuLWZpbGVzICAgOj0gJCh3aWxkY2FyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4ICQob2JqKS8sICQoZmlsdGVyLW91dCAvJSwgJChfX2NsZWFuLWZpbGVzKSkpIFwKKwkJICAgJChmaWx0ZXIgLyUsICQoX19jbGVhbi1maWxlcykpKQorCisjIGFzIGNsZWFuLWRpcnMgaXMgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGlzIGFkZHMKKyMgYSAkKG9iaikgcHJlZml4LCBleGNlcHQgZm9yIGFic29sdXRlIHBhdGhzCisKK19fY2xlYW4tZGlycyAgICA6PSAkKHdpbGRjYXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChvYmopLywgJChmaWx0ZXItb3V0IC8lLCAkKGNsZWFuLWRpcnMpKSkgICAgXAorCQkgICAkKGZpbHRlciAvJSwgJChjbGVhbi1kaXJzKSkpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcXVpZXRfY21kX2NsZWFuICAgID0gQ0xFQU4gICAkKG9iaikKKyAgICAgIGNtZF9jbGVhbiAgICA9IHJtIC1mICQoX19jbGVhbi1maWxlcykKK3F1aWV0X2NtZF9jbGVhbmRpciA9IENMRUFOICAgJChfX2NsZWFuLWRpcnMpCisgICAgICBjbWRfY2xlYW5kaXIgPSBybSAtcmYgJChfX2NsZWFuLWRpcnMpCisKKworX19jbGVhbjogJChzdWJkaXIteW1uKQoraWZuZXEgKCQoc3RyaXAgJChfX2NsZWFuLWZpbGVzKSksKQorCSskKGNhbGwgY21kLGNsZWFuKQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoX19jbGVhbi1kaXJzKSksKQorCSskKGNhbGwgY21kLGNsZWFuZGlyKQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoY2xlYW4tcnVsZSkpLCkKKwkrJChjbGVhbi1ydWxlKQorZW5kaWYKKwlAOgorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEdlbmVyaWMgc3R1ZmYKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgRGVzY2VuZGluZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUEhPTlkgKz0gJChzdWJkaXIteW1uKQorJChzdWJkaXIteW1uKToKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT0kQAorCisjIElmIHF1aWV0IGlzIHNldCwgb25seSBwcmludCBzaG9ydCB2ZXJzaW9uIG9mIGNvbW1hbmQKKworY21kID0gQCQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxlY2hvICcgICQoJChxdWlldCljbWRfJCgxKSknICYmKSAkKGNtZF8kKDEpKQorCisKKyMgRGVjbGFyZSB0aGUgY29udGVudHMgb2YgdGhlIC5QSE9OWSB2YXJpYWJsZSBhcyBwaG9ueS4gIFdlIGtlZXAgdGhhdAorIyBpbmZvcm1hdGlvbiBpbiBhIHZhcmlhYmxlIHNlIHdlIGNhbiB1c2UgaXQgaW4gaWZfY2hhbmdlZCBhbmQgZnJpZW5kcy4KKworLlBIT05ZOiAkKFBIT05ZKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9NYWtlZmlsZS5ob3N0IGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9NYWtlZmlsZS5ob3N0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjI4NTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL01ha2VmaWxlLmhvc3QKQEAgLTAsMCArMSwxNTUgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGRpbmcgYmluYXJpZXMgb24gdGhlIGhvc3Qgc3lzdGVtCisjIEJpbmFyaWVzIGFyZSB1c2VkIGR1cmluZyB0aGUgY29tcGlsYXRpb24gb2YgdGhlIGtlcm5lbCwgZm9yIGV4YW1wbGUKKyMgdG8gcHJlcHJvY2VzcyBhIGRhdGEgZmlsZS4KKyMKKyMgQm90aCBDIGFuZCBDKysgaXMgc3VwcG9ydGVkLCBidXQgcHJlZmVycmVkIGxhbmd1YWdlIGlzIEMgZm9yIHN1Y2ggdXRpbGl0aWVzLgorIworIyBTYW1sZSBzeW50YXggKHNlZSBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZS50eHQgZm9yIHJlZmVyZW5jZSkKKyMgaG9zdHByb2dzLXkgOj0gYmluMmhleAorIyBXaWxsIGNvbXBpbGUgYmluMmhleC5jIGFuZCBjcmVhdGUgYW4gZXhlY3V0YWJsZSBuYW1lZCBiaW4yaGV4CisjCisjIGhvc3Rwcm9ncy15ICAgIDo9IGx4ZGlhbG9nCisjIGx4ZGlhbG9nLW9ianMgOj0gY2hlY2tsaXN0Lm8gbHhkaWFsb2cubworIyBXaWxsIGNvbXBpbGUgbHhkaWFsb2cuYyBhbmQgY2hlY2tsaXN0LmMsIGFuZCB0aGVuIGxpbmsgdGhlIGV4ZWN1dGFibGUKKyMgbHhkaWFsb2csIGJhc2VkIG9uIGNoZWNrbGlzdC5vIGFuZCBseGRpYWxvZy5vCisjCisjIGhvc3Rwcm9ncy15ICAgICAgOj0gcWNvbmYKKyMgcWNvbmYtY3h4b2JqcyAgIDo9IHFjb25mLm8KKyMgcWNvbmYtb2JqcyAgICAgIDo9IG1lbnUubworIyBXaWxsIGNvbXBpbGUgcWNvbmYgYXMgYSBDKysgcHJvZ3JhbSwgYW5kIG1lbnUgYXMgYSBDIHByb2dyYW0uCisjIFRoZXkgYXJlIGxpbmtlZCBhcyBDKysgY29kZSB0byB0aGUgZXhlY3V0YWJsZSBxY29uZgorCisjIGhvc3Rwcm9ncy15IDo9IGNvbmYKKyMgY29uZi1vYmpzICA6PSBjb25mLm8gbGlia2NvbmZpZy5zbworIyBsaWJrY29uZmlnLW9ianMgOj0gZXhwci5vIHR5cGUubworIyBXaWxsIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IG5hbWVkIGxpYmtjb25maWcuc28gdGhhdCBjb25zaXN0IG9mCisjIGV4cHIubyBhbmQgdHlwZS5vICh0aGV5IGFyZSBib3RoIGNvbXBpbGVkIGFzIEMgY29kZSBhbmQgdGhlIG9iamVjdCBmaWxlCisjIGFyZSBtYWRlIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUpLgorIyBjb25mLmMgaXMgY29tcGlsZWQgYXMgYSBjIHByb2dyYW0sIGFuZCBjb25mLm8gaXMgbGlua2VkIHRvZ2V0aGVyIHdpdGgKKyMgbGlia2NvbmZpZy5zbyBhcyB0aGUgZXhlY3V0YWJsZSBjb25mLgorIyBOb3RlOiBTaGFyZWQgbGlicmFyaWVzIGNvbnNpc3Rpbmcgb2YgQysrIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkCisKK19faG9zdHByb2dzIDo9ICQoc29ydCAkKGhvc3Rwcm9ncy15KSQoaG9zdHByb2dzLW0pKQorCisjIGhvc3Rwcm9ncy15IDo9IHRvb2xzL2J1aWxkIG1heSBoYXZlIGJlZW4gc3BlY2lmaWVkLiBSZXRyZWl2ZSBkaXJlY3RvcnkKK29iai1kaXJzICs9ICQoZm9yZWFjaCBmLCQoX19ob3N0cHJvZ3MpLCAkKGlmICQoZGlyICQoZikpLCQoZGlyICQoZikpKSkKK29iai1kaXJzIDo9ICQoc3RyaXAgJChzb3J0ICQoZmlsdGVyLW91dCAuLywkKG9iai1kaXJzKSkpKQorCisKKyMgQyBjb2RlCisjIEV4ZWN1dGFibGVzIGNvbXBpbGVkIGZyb20gYSBzaW5nbGUgLmMgZmlsZQoraG9zdC1jc2luZ2xlCTo9ICQoZm9yZWFjaCBtLCQoX19ob3N0cHJvZ3MpLCQoaWYgJCgkKG0pLW9ianMpLCwkKG0pKSkKKworIyBDIGV4ZWN1dGFibGVzIGxpbmtlZCBiYXNlZCBvbiBzZXZlcmFsIC5vIGZpbGVzCitob3N0LWNtdWx0aQk6PSAkKGZvcmVhY2ggbSwkKF9faG9zdHByb2dzKSxcCisJCSAgICQoaWYgJCgkKG0pLWN4eG9ianMpLCwkKGlmICQoJChtKS1vYmpzKSwkKG0pKSkpCisKKyMgT2JqZWN0ICgubykgZmlsZXMgY29tcGlsZWQgZnJvbSAuYyBmaWxlcworaG9zdC1jb2Jqcwk6PSAkKHNvcnQgJChmb3JlYWNoIG0sJChfX2hvc3Rwcm9ncyksJCgkKG0pLW9ianMpKSkKKworIyBDKysgY29kZQorIyBDKysgZXhlY3V0YWJsZXMgY29tcGlsZWQgZnJvbSBhdCBsZWFzdCBvbiAuY2MgZmlsZQorIyBhbmQgemVybyBvciBtb3JlIC5jIGZpbGVzCitob3N0LWN4eG11bHRpCTo9ICQoZm9yZWFjaCBtLCQoX19ob3N0cHJvZ3MpLCQoaWYgJCgkKG0pLWN4eG9ianMpLCQobSkpKQorCisjIEMrKyBPYmplY3QgKC5vKSBmaWxlcyBjb21waWxlZCBmcm9tIC5jYyBmaWxlcworaG9zdC1jeHhvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKGhvc3QtY3h4bXVsdGkpLCQoJChtKS1jeHhvYmpzKSkpCisKKyMgU2hhcmVkIGxpYmFyaWVzIChvbmx5IC5jIHN1cHBvcnRlZCkKKyMgU2hhcmVkIGxpYnJhcmllcyAoLnNvKSAtIGFsbCAuc28gZmlsZXMgcmVmZXJlbmNlZCBpbiAieHh4LW9ianMiCitob3N0LWNzaGxpYgk6PSAkKHNvcnQgJChmaWx0ZXIgJS5zbywgJChob3N0LWNvYmpzKSkpCisjIFJlbW92ZSAuc28gZmlsZXMgZnJvbSAieHh4LW9ianMiCitob3N0LWNvYmpzCTo9ICQoZmlsdGVyLW91dCAlLnNvLCQoaG9zdC1jb2JqcykpCisKKyNPYmplY3QgKC5vKSBmaWxlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgbGliYXJpZXMKK2hvc3QtY3Nob2Jqcwk6PSAkKHNvcnQgJChmb3JlYWNoIG0sJChob3N0LWNzaGxpYiksJCgkKG06LnNvPS1vYmpzKSkpKQorCitfX2hvc3Rwcm9ncyAgICAgOj0gJChhZGRwcmVmaXggJChvYmopLywkKF9faG9zdHByb2dzKSkKK2hvc3QtY3NpbmdsZQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jc2luZ2xlKSkKK2hvc3QtY211bHRpCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNtdWx0aSkpCitob3N0LWNvYmpzCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNvYmpzKSkKK2hvc3QtY3h4bXVsdGkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY3h4bXVsdGkpKQoraG9zdC1jeHhvYmpzCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWN4eG9ianMpKQoraG9zdC1jc2hsaWIJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY3NobGliKSkKK2hvc3QtY3Nob2Jqcwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jc2hvYmpzKSkKK29iai1kaXJzICAgICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLWRpcnMpKQorCisjIyMjIworIyBIYW5kbGUgb3B0aW9ucyB0byBnY2MuIFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBzZXBhcmF0ZSBvdXRwdXQgZGlyZWN0b3J5CisKK19ob3N0Y19mbGFncyAgID0gJChIT1NUQ0ZMQUdTKSAgICQoSE9TVF9FWFRSQUNGTEFHUykgICAkKEhPU1RDRkxBR1NfJCgqRikubykKK19ob3N0Y3h4X2ZsYWdzID0gJChIT1NUQ1hYRkxBR1MpICQoSE9TVF9FWFRSQUNYWEZMQUdTKSAkKEhPU1RDWFhGTEFHU18kKCpGKS5vKQorCitpZmVxICgkKEtCVUlMRF9TUkMpLCkKK19faG9zdGNfZmxhZ3MJPSAkKF9ob3N0Y19mbGFncykKK19faG9zdGN4eF9mbGFncwk9ICQoX2hvc3RjeHhfZmxhZ3MpCitlbHNlCitfX2hvc3RjX2ZsYWdzCT0gLUkkKG9iaikgJChjYWxsIGZsYWdzLF9ob3N0Y19mbGFncykKK19faG9zdGN4eF9mbGFncwk9IC1JJChvYmopICQoY2FsbCBmbGFncyxfaG9zdGN4eF9mbGFncykKK2VuZGlmCisKK2hvc3RjX2ZsYWdzICAgID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoX19ob3N0Y19mbGFncykKK2hvc3RjeHhfZmxhZ3MgID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoX19ob3N0Y3h4X2ZsYWdzKQorCisjIyMjIworIyBDb21waWxlIHByb2dyYW1zIG9uIHRoZSBob3N0CisKKyMgQ3JlYXRlIGV4ZWN1dGFibGUgZnJvbSBhIHNpbmdsZSAuYyBmaWxlCisjIGhvc3QtY3NpbmdsZSAtPiBFeGVjdXRhYmxlCitxdWlldF9jbWRfaG9zdC1jc2luZ2xlIAk9IEhPU1RDQyAgJEAKKyAgICAgIGNtZF9ob3N0LWNzaW5nbGUJPSAkKEhPU1RDQykgJChob3N0Y19mbGFncykgLW8gJEAgJDwgXAorCQkJICAkKEhPU1RfTE9BRExJQkVTKSAkKEhPU1RMT0FETElCRVNfJChARikpCiskKGhvc3QtY3NpbmdsZSk6ICU6ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxob3N0LWNzaW5nbGUpCisKKyMgTGluayBhbiBleGVjdXRhYmxlIGJhc2VkIG9uIGxpc3Qgb2YgLm8gZmlsZXMsIGFsbCBwbGFpbiBjCisjIGhvc3QtY211bHRpIC0+IGV4ZWN1dGFibGUKK3F1aWV0X2NtZF9ob3N0LWNtdWx0aQk9IEhPU1RMRCAgJEAKKyAgICAgIGNtZF9ob3N0LWNtdWx0aQk9ICQoSE9TVENDKSAkKEhPU1RMREZMQUdTKSAtbyAkQCBcCisJCQkgICQoYWRkcHJlZml4ICQob2JqKS8sJCgkKEBGKS1vYmpzKSkgXAorCQkJICAkKEhPU1RfTE9BRExJQkVTKSAkKEhPU1RMT0FETElCRVNfJChARikpCiskKGhvc3QtY211bHRpKTogJTogJChob3N0LWNvYmpzKSAkKGhvc3QtY3NobGliKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGhvc3QtY211bHRpKQorCisjIENyZWF0ZSAubyBmaWxlIGZyb20gYSBzaW5nbGUgLmMgZmlsZQorIyBob3N0LWNvYmpzIC0+IC5vCitxdWlldF9jbWRfaG9zdC1jb2Jqcwk9IEhPU1RDQyAgJEAKKyAgICAgIGNtZF9ob3N0LWNvYmpzCT0gJChIT1NUQ0MpICQoaG9zdGNfZmxhZ3MpIC1jIC1vICRAICQ8CiskKGhvc3QtY29ianMpOiAlLm86ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxob3N0LWNvYmpzKQorCisjIExpbmsgYW4gZXhlY3V0YWJsZSBiYXNlZCBvbiBsaXN0IG9mIC5vIGZpbGVzLCBhIG1peHR1cmUgb2YgLmMgYW5kIC5jYworIyBob3N0LWN4eG11bHRpIC0+IGV4ZWN1dGFibGUKK3F1aWV0X2NtZF9ob3N0LWN4eG11bHRpCT0gSE9TVExEICAkQAorICAgICAgY21kX2hvc3QtY3h4bXVsdGkJPSAkKEhPU1RDWFgpICQoSE9TVExERkxBR1MpIC1vICRAIFwKKwkJCSAgJChmb3JlYWNoIG8sb2JqcyBjeHhvYmpzLFwKKwkJCSAgJChhZGRwcmVmaXggJChvYmopLywkKCQoQEYpLSQobykpKSkgXAorCQkJICAkKEhPU1RfTE9BRExJQkVTKSAkKEhPU1RMT0FETElCRVNfJChARikpCiskKGhvc3QtY3h4bXVsdGkpOiAlOiAkKGhvc3QtY29ianMpICQoaG9zdC1jeHhvYmpzKSAkKGhvc3QtY3NobGliKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGhvc3QtY3h4bXVsdGkpCisKKyMgQ3JlYXRlIC5vIGZpbGUgZnJvbSBhIHNpbmdsZSAuY2MgKEMrKykgZmlsZQorcXVpZXRfY21kX2hvc3QtY3h4b2Jqcwk9IEhPU1RDWFggJEAKKyAgICAgIGNtZF9ob3N0LWN4eG9ianMJPSAkKEhPU1RDWFgpICQoaG9zdGN4eF9mbGFncykgLWMgLW8gJEAgJDwKKyQoaG9zdC1jeHhvYmpzKTogJS5vOiAlLmNjIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGhvc3QtY3h4b2JqcykKKworIyBDb21waWxlIC5jIGZpbGUsIGNyZWF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCAubyBmaWxlCisjIGhvc3QtY3Nob2JqcyAtPiAubworcXVpZXRfY21kX2hvc3QtY3Nob2Jqcwk9IEhPU1RDQyAgLWZQSUMgJEAKKyAgICAgIGNtZF9ob3N0LWNzaG9ianMJPSAkKEhPU1RDQykgJChob3N0Y19mbGFncykgLWZQSUMgLWMgLW8gJEAgJDwKKyQoaG9zdC1jc2hvYmpzKTogJS5vOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsaG9zdC1jc2hvYmpzKQorCisjIExpbmsgYSBzaGFyZWQgbGlicmFyeSwgYmFzZWQgb24gcG9zaXRpb24gaW5kZXBlbmRlbnQgLm8gZmlsZXMKKyMgKi5vIC0+IC5zbyBzaGFyZWQgbGlicmFyeSAoaG9zdC1jc2hsaWIpCitxdWlldF9jbWRfaG9zdC1jc2hsaWIJPSBIT1NUTExEIC1zaGFyZWQgJEAKKyAgICAgIGNtZF9ob3N0LWNzaGxpYgk9ICQoSE9TVENDKSAkKEhPU1RMREZMQUdTKSAtc2hhcmVkIC1vICRAIFwKKwkJCSAgJChhZGRwcmVmaXggJChvYmopLywkKCQoQEY6LnNvPS1vYmpzKSkpIFwKKwkJCSAgJChIT1NUX0xPQURMSUJFUykgJChIT1NUTE9BRExJQkVTXyQoQEYpKQorJChob3N0LWNzaGxpYik6ICU6ICQoaG9zdC1jc2hvYmpzKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGhvc3QtY3NobGliKQorCit0YXJnZXRzICs9ICQoaG9zdC1jc2luZ2xlKSAgJChob3N0LWNtdWx0aSkgJChob3N0LWNvYmpzKVwKKwkgICAkKGhvc3QtY3h4bXVsdGkpICQoaG9zdC1jeHhvYmpzKSAkKGhvc3QtY3NobGliKSAkKGhvc3QtY3Nob2JqcykKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9NYWtlZmlsZS5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1NGVhNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvTWFrZWZpbGUubGliCkBAIC0wLDAgKzEsMTcwIEBACisjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLSB0byBiZSByZW1vdmVkLi4uCitleHRyYS15CSs9ICQoRVhUUkFfVEFSR0VUUykKKyMgRmlndXJlIG91dCB3aGF0IHdlIG5lZWQgdG8gYnVpbGQgZnJvbSB0aGUgdmFyaW91cyB2YXJpYWJsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgV2hlbiBhbiBvYmplY3QgaXMgbGlzdGVkIHRvIGJlIGJ1aWx0IGNvbXBpbGVkLWluIGFuZCBtb2R1bGFyLAorIyBvbmx5IGJ1aWxkIHRoZSBjb21waWxlZC1pbiB2ZXJzaW9uCisKK29iai1tIDo9ICQoZmlsdGVyLW91dCAkKG9iai15KSwkKG9iai1tKSkKKworIyBMaWJyYXJpZXMgYXJlIGFsd2F5cyBjb2xsZWN0ZWQgaW4gb25lIGxpYiBmaWxlLgorIyBGaWx0ZXIgb3V0IG9iamVjdHMgYWxyZWFkeSBidWlsdC1pbgorCitsaWIteSA6PSAkKGZpbHRlci1vdXQgJChvYmoteSksICQoc29ydCAkKGxpYi15KSAkKGxpYi1tKSkpCisKKworIyBIYW5kbGUgb2JqZWN0cyBpbiBzdWJkaXJzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBvIGlmIHdlIGVuY291bnRlciBmb28vIGluICQob2JqLXkpLCByZXBsYWNlIGl0IGJ5IGZvby9idWlsdC1pbi5vCisjICAgYW5kIGFkZCB0aGUgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcnMgdG8gZGVzY2VuZCBpbnRvOiAkKHN1YmRpci15KQorIyBvIGlmIHdlIGVuY291bnRlciBmb28vIGluICQob2JqLW0pLCByZW1vdmUgaXQgZnJvbSAkKG9iai1tKQorIyAgIGFuZCBhZGQgdGhlIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJzIHRvIGRlc2NlbmQgaW50bzogJChzdWJkaXItbSkKKworX19zdWJkaXIteQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLXkpKSkKK3N1YmRpci15CSs9ICQoX19zdWJkaXIteSkKK19fc3ViZGlyLW0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1tKSkpCitzdWJkaXItbQkrPSAkKF9fc3ViZGlyLW0pCitvYmoteQkJOj0gJChwYXRzdWJzdCAlLywgJS9idWlsdC1pbi5vLCAkKG9iai15KSkKK29iai1tCQk6PSAkKGZpbHRlci1vdXQgJS8sICQob2JqLW0pKQorCisjIFN1YmRpcmVjdG9yaWVzIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvCisKK3N1YmRpci15bQk6PSAkKHNvcnQgJChzdWJkaXIteSkgJChzdWJkaXItbSkpCisKKyMgaWYgJChmb28tb2JqcykgZXhpc3RzLCBmb28ubyBpcyBhIGNvbXBvc2l0ZSBvYmplY3QKK211bHRpLXVzZWQteSA6PSAkKHNvcnQgJChmb3JlYWNoIG0sJChvYmoteSksICQoaWYgJChzdHJpcCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpLCAkKG0pKSkpCittdWx0aS11c2VkLW0gOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQob2JqLW0pLCAkKGlmICQoc3RyaXAgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwgJChtKSkpKQorbXVsdGktdXNlZCAgIDo9ICQobXVsdGktdXNlZC15KSAkKG11bHRpLXVzZWQtbSkKK3NpbmdsZS11c2VkLW0gOj0gJChzb3J0ICQoZmlsdGVyLW91dCAkKG11bHRpLXVzZWQtbSksJChvYmotbSkpKQorCisjIEJ1aWxkIGxpc3Qgb2YgdGhlIHBhcnRzIG9mIG91ciBjb21wb3NpdGUgb2JqZWN0cywgb3VyIGNvbXBvc2l0ZQorIyBvYmplY3RzIGRlcGVuZCBvbiB0aG9zZSAob2J2aW91c2x5KQorbXVsdGktb2Jqcy15IDo9ICQoZm9yZWFjaCBtLCAkKG11bHRpLXVzZWQteSksICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSkKK211bHRpLW9ianMtbSA6PSAkKGZvcmVhY2ggbSwgJChtdWx0aS11c2VkLW0pLCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpCittdWx0aS1vYmpzICAgOj0gJChtdWx0aS1vYmpzLXkpICQobXVsdGktb2Jqcy1tKQorCisjICQoc3ViZGlyLW9iai15KSBpcyB0aGUgbGlzdCBvZiBvYmplY3RzIGluICQob2JqLXkpIHdoaWNoIGRvIG5vdCBsaXZlCisjIGluIHRoZSBsb2NhbCBkaXJlY3RvcnkKK3N1YmRpci1vYmoteSA6PSAkKGZvcmVhY2ggbywkKG9iai15KSwkKGlmICQoZmlsdGVyLW91dCAkKG8pLCQobm90ZGlyICQobykpKSwkKG8pKSkKKworIyAkKG9iai1kaXJzKSBpcyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIG9iamVjdCBmaWxlcworb2JqLWRpcnMgOj0gJChkaXIgJChtdWx0aS1vYmpzKSAkKHN1YmRpci1vYmoteSkpCisKKyMgUmVwbGFjZSBtdWx0aS1wYXJ0IG9iamVjdHMgYnkgdGhlaXIgaW5kaXZpZHVhbCBwYXJ0cywgbG9vayBhdCBsb2NhbCBkaXIgb25seQorcmVhbC1vYmpzLXkgOj0gJChmb3JlYWNoIG0sICQoZmlsdGVyLW91dCAkKHN1YmRpci1vYmoteSksICQob2JqLXkpKSwgJChpZiAkKHN0cmlwICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpLCQobSkpKSAkKGV4dHJhLXkpCityZWFsLW9ianMtbSA6PSAkKGZvcmVhY2ggbSwgJChvYmotbSksICQoaWYgJChzdHJpcCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpLCQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSwkKG0pKSkKKworIyBBZGQgc3ViZGlyIHBhdGgKKworZXh0cmEteQkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGV4dHJhLXkpKQorYWx3YXlzCQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoYWx3YXlzKSkKK3RhcmdldHMJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJCh0YXJnZXRzKSkKK29iai15CQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLXkpKQorb2JqLW0JCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChvYmotbSkpCitsaWIteQkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGxpYi15KSkKK3N1YmRpci1vYmoteQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLW9iai15KSkKK3JlYWwtb2Jqcy15CTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChyZWFsLW9ianMteSkpCityZWFsLW9ianMtbQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQocmVhbC1vYmpzLW0pKQorc2luZ2xlLXVzZWQtbQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc2luZ2xlLXVzZWQtbSkpCittdWx0aS11c2VkLXkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG11bHRpLXVzZWQteSkpCittdWx0aS11c2VkLW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKG11bHRpLXVzZWQtbSkpCittdWx0aS1vYmpzLXkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG11bHRpLW9ianMteSkpCittdWx0aS1vYmpzLW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKG11bHRpLW9ianMtbSkpCitzdWJkaXIteW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKHN1YmRpci15bSkpCitvYmotZGlycwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLWRpcnMpKQorCisjIFRoZXNlIGZsYWdzIGFyZSBuZWVkZWQgZm9yIG1vZHZlcnNpb25zIGFuZCBjb21waWxpbmcsIHNvIHdlIGRlZmluZSB0aGVtIGhlcmUKKyMgYWxyZWFkeQorIyAkKG1vZG5hbWVfZmxhZ3MpICNkZWZpbmVzIEtCVUlMRF9NT0ROQU1FIGFzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXQgd2lsbAorIyBlbmQgdXAgaW4gKG9yIHdvdWxkLCBpZiBpdCBnZXRzIGNvbXBpbGVkIGluKQorIyBOb3RlOiBJdCdzIHBvc3NpYmxlIHRoYXQgb25lIG9iamVjdCBnZXRzIHBvdGVudGlhbGx5IGxpbmtlZCBpbnRvIG1vcmUKKyMgICAgICAgdGhhbiBvbmUgbW9kdWxlLiBJbiB0aGF0IGNhc2UgS0JVSUxEX01PRE5BTUUgd2lsbCBiZSBzZXQgdG8gZm9vX2JhciwKKyMgICAgICAgd2hlcmUgZm9vIGFuZCBiYXIgYXJlIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGVzLgorbmFtZS1maXggPSAkKHN1YnN0ICQoY29tbWEpLF8sJChzdWJzdCAtLF8sJDEpKQorYmFzZW5hbWVfZmxhZ3MgPSAtRCJLQlVJTERfQkFTRU5BTUU9S0JVSUxEX1NUUigkKGNhbGwgbmFtZS1maXgsJCgqRikpKSIKK21vZG5hbWVfZmxhZ3MgID0gJChpZiAkKGZpbHRlciAxLCQod29yZHMgJChtb2RuYW1lKSkpLFwKKyAgICAgICAgICAgICAgICAgLUQiS0JVSUxEX01PRE5BTUU9S0JVSUxEX1NUUigkKGNhbGwgbmFtZS1maXgsJChtb2RuYW1lKSkpIikKKworX2NfZmxhZ3MgICAgICAgPSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICQoQ0ZMQUdTXyQoKkYpLm8pCitfYV9mbGFncyAgICAgICA9ICQoQUZMQUdTKSAkKEVYVFJBX0FGTEFHUykgJChBRkxBR1NfJCgqRikubykKK19jcHBfZmxhZ3MgICAgID0gJChDUFBGTEFHUykgJChFWFRSQV9DUFBGTEFHUykgJChDUFBGTEFHU18kKEBGKSkKKworIyBJZiBidWlsZGluZyB0aGUga2VybmVsIGluIGEgc2VwYXJhdGUgb2JqdHJlZSBleHBhbmQgYWxsIG9jY3VycmVuY2VzCisjIG9mIC1JZGlyIHRvIC1JJChzcmN0cmVlKS9kaXIgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocyAoc3RhcnRpbmcgd2l0aCAnLycpLgorCitpZmVxICgkKEtCVUlMRF9TUkMpLCkKK19fY19mbGFncwk9ICQoX2NfZmxhZ3MpCitfX2FfZmxhZ3MJPSAkKF9hX2ZsYWdzKQorX19jcHBfZmxhZ3MgICAgID0gJChfY3BwX2ZsYWdzKQorZWxzZQorCisjIC1JJChvYmopIGxvY2F0ZXMgZ2VuZXJhdGVkIC5oIGZpbGVzCisjICQoY2FsbCBhZGR0cmVlLC1JJChvYmopKSBsb2NhdGVzIC5oIGZpbGVzIGluIHNyY3RyZWUsIGZyb20gZ2VuZXJhdGVkIC5jIGZpbGVzCisjICAgYW5kIGxvY2F0ZXMgZ2VuZXJhdGVkIC5oIGZpbGVzCisjIEZJWE1FOiBSZXBsYWNlIGJvdGggd2l0aCBzcGVjaWZpYyBDRkxBR1MqIHN0YXRlbWVudHMgaW4gdGhlIG1ha2VmaWxlcworX19jX2ZsYWdzCT0gJChjYWxsIGFkZHRyZWUsLUkkKG9iaikpICQoY2FsbCBmbGFncyxfY19mbGFncykKK19fYV9mbGFncwk9ICAgICAgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgZmxhZ3MsX2FfZmxhZ3MpCitfX2NwcF9mbGFncyAgICAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgJChjYWxsIGZsYWdzLF9jcHBfZmxhZ3MpCitlbmRpZgorCitjX2ZsYWdzICAgICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSBcCisJCSAkKF9fY19mbGFncykgJChtb2RrZXJuX2NmbGFncykgXAorCQkgLUQiS0JVSUxEX1NUUihzKT1cI3MiICQoYmFzZW5hbWVfZmxhZ3MpICQobW9kbmFtZV9mbGFncykKKworYV9mbGFncyAgICAgICAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChOT1NURElOQ19GTEFHUykgJChDUFBGTEFHUykgXAorCQkgJChfX2FfZmxhZ3MpICQobW9ka2Vybl9hZmxhZ3MpCisKK2NwcF9mbGFncyAgICAgID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoTk9TVERJTkNfRkxBR1MpICQoX19jcHBfZmxhZ3MpCisKKyMgU2VlbXMgdG8gYmUgYSB3cm9uZyB0aGluZyB0byBkby4gTERGTEFHUyBjb250YWlucyBnY2MncyBmbGFncywKKyMgeWV0IGxkX2ZsYWdzIGlzIGZlZCB0byBsZC4KKyNsZF9mbGFncyAgICAgICA9ICQoTERGTEFHUykgJChFWFRSQV9MREZMQUdTKQorIyBSZW1vdmUgdGhlIC1XbCwgcHJlZml4IGZyb20gbGlua2VyIG9wdGlvbnMgbm9ybWFsbHkgcGFzc2VkIHRocm91Z2ggZ2NjCitsZF9mbGFncyAgICAgICA9ICQoZmlsdGVyLW91dCAtV2wkKGNvbW1hKSUsJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpKQorCisKKyMgRmluZHMgdGhlIG11bHRpLXBhcnQgb2JqZWN0IHRoZSBjdXJyZW50IG9iamVjdCB3aWxsIGJlIGxpbmtlZCBpbnRvCittb2RuYW1lLW11bHRpID0gJChzb3J0ICQoZm9yZWFjaCBtLCQobXVsdGktdXNlZCksXAorCQkkKGlmICQoZmlsdGVyICQoc3Vic3QgJChvYmopLywsJCoubyksICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksJChtOi5vPSkpKSkKKworIyBTaGlwcGVkIGZpbGVzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitxdWlldF9jbWRfc2hpcHBlZCA9IFNISVBQRUQgJEAKK2NtZF9zaGlwcGVkID0gY2F0ICQ8ID4gJEAKKworJChvYmopLyU6OiAkKHNyYykvJV9zaGlwcGVkCisJJChjYWxsIGNtZCxzaGlwcGVkKQorCisjIENvbW1hbmRzIHVzZWZ1bCBmb3IgYnVpbGRpbmcgYSBib290IGltYWdlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIwlVc2UgYXMgZm9sbG93aW5nOgorIworIwl0YXJnZXQ6IHNvdXJjZShzKSBGT1JDRQorIwkJJChpZl9jaGFuZ2VkLGxkL29iamNvcHkvZ3ppcCkKKyMKKyMJYW5kIGFkZCB0YXJnZXQgdG8gRVhUUkFfVEFSR0VUUyBzbyB0aGF0IHdlIGtub3cgd2UgaGF2ZSB0bworIwlyZWFkIGluIHRoZSBzYXZlZCBjb21tYW5kIGxpbmUKKworIyBMaW5raW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRPRE86IExERkxBR1MgdXN1YWxseSBpcyBzdXBwb3NlZCB0byBjb250YWluIGdjYydzIGZsYWdzLCBub3QgbGQncy4KKyMgYnV0IGhlcmUgd2UgZmVlZCB0aGVtIHRvIGxkIQorcXVpZXRfY21kX2xkID0gTEQgICAgICAkQAorY21kX2xkID0gJChMRCkgJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpICQoTERGTEFHU18kKEBGKSkgXAorCSAgICAgICAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIC1vICRACisKKyMgT2JqY29weQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcXVpZXRfY21kX29iamNvcHkgPSBPQkpDT1BZICRACitjbWRfb2JqY29weSA9ICQoT0JKQ09QWSkgJChPQkpDT1BZRkxBR1MpICQoT0JKQ09QWUZMQUdTXyQoQEYpKSAkPCAkQAorCisjIEd6aXAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3F1aWV0X2NtZF9nemlwID0gR1pJUCAgICAkQAorY21kX2d6aXAgPSBnemlwIC1mIC05IDwgJDwgPiAkQApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9iYXNpYy9NYWtlZmlsZSBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvYmFzaWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5ZjA3OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvYmFzaWMvTWFrZWZpbGUKQEAgLTAsMCArMSwxOCBAQAorIyMjCisjIE1ha2VmaWxlLmJhc2ljIGxpc3QgdGhlIG1vc3QgYmFzaWMgcHJvZ3JhbXMgdXNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuCisjIFRoZSBwcm9ncmFtcyBsaXN0ZWQgaGVyZWluIGlzIHdoYXQgaXMgbmVlZGVkIHRvIGRvIHRoZSBiYXNpYyBzdHVmZiwKKyMgc3VjaCBhcyBzcGxpdHRpbmcgLmNvbmZpZyBhbmQgZml4IGRlcGVuZGVuY3kgZmlsZS4KKyMgVGhpcyBpbml0aWFsIHN0ZXAgaXMgbmVlZGVkIHRvIGF2b2lkIGZpbGVzIHRvIGJlIHJlY29tcGlsZWQKKyMgd2hlbiBidXN5Ym94IGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAod2hpY2ggaXMgd2hhdCBoYXBwZW5zIHdoZW4KKyMgLmNvbmZpZyBpcyBpbmNsdWRlZCBieSBtYWluIE1ha2VmaWxlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZml4ZGVwOiAJIFVzZWQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBkdXJpbmcgYnVpbGQgcHJvY2VzcworIyBzcGxpdC1pbmNsdWRlOiBEaXZpZGUgYWxsIGNvbmZpZyBzeW1ib2xzIHVwIGluIGEgbnVtYmVyIG9mIGZpbGVzIGluCisjICAgICAgICAgICAgICAgIGluY2x1ZGUvY29uZmlnLy4uLgorIyBkb2Nwcm9jOgkgVXNlZCBpbiBEb2N1bWVudGF0aW9uL2RvY2Jvb2sKKworaG9zdHByb2dzLXkJOj0gZml4ZGVwIHNwbGl0LWluY2x1ZGUgZG9jcHJvYworYWx3YXlzCQk6PSAkKGhvc3Rwcm9ncy15KQorCisjIGZpeGRlcCBpcyBuZWVkZWQgdG8gY29tcGlsZSBvdGhlciBob3N0IHByb2dyYW1zCiskKGFkZHByZWZpeCAkKG9iaikvLCQoZmlsdGVyLW91dCBmaXhkZXAsJChhbHdheXMpKSk6ICQob2JqKS9maXhkZXAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4NGU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICoJZG9jcHJvYyBpcyBhIHNpbXBsZSBwcmVwcm9jZXNzb3IgZm9yIHRoZSB0ZW1wbGF0ZSBmaWxlcworICogICAgICB1c2VkIGFzIHBsYWNlaG9sZGVycyBmb3IgdGhlIGtlcm5lbCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorICoJZG9jcHJvYyBpcyB1c2VkIGZvciBkb2N1bWVudGF0aW9uLWZyb250ZW5kIGFuZAorICogICAgICBkZXBlbmRlbmN5LWdlbmVyYXRvci4KKyAqCVRoZSB0d28gdXNhZ2VzIGhhdmUgaW4gY29tbW9uIHRoYXQgdGhleSByZXF1aXJlCisgKglzb21lIGtub3dsZWRnZSBvZiB0aGUgLnRtcGwgc3ludGF4LCB0aGVyZWZvcmUgdGhleQorICoJYXJlIGtlcHQgdG9nZXRoZXIuCisgKgorICoJZG9jdW1lbnRhdGlvbi1mcm9udGVuZAorICoJCVNjYW5zIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBjYWxsIGtlcm5lbC1kb2MgZm9yCisgKgkJYWxsIG9jY3VycmVuY2VzIG9mICFbRUlGXWZpbGUKKyAqCQlCZWZvcmVoYW5kIGVhY2ggcmVmZXJlbmNlZCBmaWxlIGFyZSBzY2FubmVkIGZvcgorICoJCWFueSBleHBvcnRlZCBzeW1wb2xzICJFWFBPUlRfU1lNQk9MKCkiIHN0YXRlbWVudHMuCisgKgkJVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBwcm9wZXIgLWZ1bmN0aW9uIGFuZAorICoJCS1ub2Z1bmN0aW9uIGFyZ3VtZW50cyBpbiBjYWxscyB0byBrZXJuZWwtZG9jLgorICoJCVVzYWdlOiBkb2Nwcm9jIGRvYyBmaWxlLnRtcGwKKyAqCisgKglkZXBlbmRlbmN5LWdlbmVyYXRvcjoKKyAqCQlTY2FucyB0aGUgdGVtcGxhdGUgZmlsZSBhbmQgbGlzdCBhbGwgZmlsZXMKKyAqCQlyZWZlcmVuY2VkIGluIGEgZm9ybWF0IHJlY29nbml6ZWQgYnkgbWFrZS4KKyAqCQlVc2FnZToJZG9jcHJvYyBkZXBlbmQgZmlsZS50bXBsCisgKgkJV3JpdGVzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gc3Rkb3V0CisgKgkJaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgkJZmlsZS50bXBsIHNyYy5jCXNyYzIuYworICoJCVRoZSBmaWxlbmFtZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzOgorICoJCSFFZmlsZW5hbWUKKyAqCQkhSWZpbGVuYW1lCisgKgkJIURmaWxlbmFtZQorICoJCSFGZmlsZW5hbWUKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisvKiBleGl0c3RhdHVzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhbnkgZmFpbGluZyBjYWxscyB0byBrZXJuZWwtZG9jLAorICogYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMuICovCitpbnQgZXhpdHN0YXR1cyA9IDA7CisKK3R5cGVkZWYgdm9pZCBERkwoY2hhciAqKTsKK0RGTCAqZGVmYXVsdGxpbmU7CisKK3R5cGVkZWYgdm9pZCBGSUxFT05MWShjaGFyICogZmlsZSk7CitGSUxFT05MWSAqaW50ZXJuYWxmdW5jdGlvbnM7CitGSUxFT05MWSAqZXh0ZXJuYWxmdW5jdGlvbnM7CitGSUxFT05MWSAqc3ltYm9sc29ubHk7CisKK3R5cGVkZWYgdm9pZCBGSUxFTElORShjaGFyICogZmlsZSwgY2hhciAqIGxpbmUpOworRklMRUxJTkUgKiBzaW5nbGVmdW5jdGlvbnM7CitGSUxFTElORSAqIGVudGl0eV9zeXN0ZW07CisKKyNkZWZpbmUgTUFYTElORVNaICAgICAyMDQ4CisjZGVmaW5lIE1BWEZJTEVTICAgICAgMjUwCisjZGVmaW5lIEtFUk5FTERPQ1BBVEggInNjcmlwdHMvIgorI2RlZmluZSBLRVJORUxET0MgICAgICJrZXJuZWwtZG9jIgorI2RlZmluZSBET0NCT09LICAgICAgICItZG9jYm9vayIKKyNkZWZpbmUgRlVOQ1RJT04gICAgICAiLWZ1bmN0aW9uIgorI2RlZmluZSBOT0ZVTkNUSU9OICAgICItbm9mdW5jdGlvbiIKKwordm9pZCB1c2FnZSAodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBkb2Nwcm9jIHtkb2N8ZGVwZW5kfSBmaWxlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIklucHV0IGlzIHJlYWQgZnJvbSBmaWxlLnRtcGwuIE91dHB1dCBpcyBzZW50IHRvIHN0ZG91dFxuIik7CisJZnByaW50ZihzdGRlcnIsICJkb2M6IGZyb250ZW5kIHdoZW4gZ2VuZXJhdGluZyBrZXJuZWwgZG9jdW1lbnRhdGlvblxuIik7CisJZnByaW50ZihzdGRlcnIsICJkZXBlbmQ6IGdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgcmVmZXJlbmNlZCB3aXRoaW4gZmlsZVxuIik7Cit9CisKKy8qCisgKiBFeGVjdXRlIGtlcm5lbC1kb2Mgd2l0aCBwYXJhbWV0ZXJzIGdpdmluIGluIHN2ZWMKKyAqLwordm9pZCBleGVjX2tlcm5lbF9kb2MoY2hhciAqKnN2ZWMpCit7CisJcGlkX3QgcGlkOworCWludCByZXQ7CisJY2hhciAqcmVhbF9maWxlbmFtZTsKKwlpbnQgcmZsZW47CisKKwkvKiBNYWtlIHN1cmUgb3V0cHV0IGdlbmVyYXRlZCBzbyBmYXIgYXJlIGZsdXNoZWQgKi8KKwlmZmx1c2goc3Rkb3V0KTsKKwlzd2l0Y2gocGlkPWZvcmsoKSkgeworCQljYXNlIC0xOgorCQkJcGVycm9yKCJ2Zm9yayIrMSk7CisJCQlleGl0KDEpOworCQljYXNlICAwOgorCQkJcmZsZW4gID0gc3RybGVuKGdldGVudigiU1JDVFJFRSIpKTsKKwkJCXJmbGVuICs9IHN0cmxlbihLRVJORUxET0NQQVRIIEtFUk5FTERPQyk7CisJCQlyZWFsX2ZpbGVuYW1lID0gYWxsb2NhKHJmbGVuICsgMSk7CisJCQlzdHJjcHkocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIikpOworCQkJc3RyY2F0KHJlYWxfZmlsZW5hbWUsIEtFUk5FTERPQ1BBVEggS0VSTkVMRE9DKTsKKwkJCWV4ZWN2cChyZWFsX2ZpbGVuYW1lLCBzdmVjKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiZXhlYyAiKTsKKwkJCXBlcnJvcihyZWFsX2ZpbGVuYW1lKTsKKwkJCWV4aXQoMSk7CisJCWRlZmF1bHQ6CisJCQl3YWl0cGlkKHBpZCwgJnJldCAsMCk7CisJfQorCWlmIChXSUZFWElURUQocmV0KSkKKwkJZXhpdHN0YXR1cyB8PSBXRVhJVFNUQVRVUyhyZXQpOworCWVsc2UKKwkJZXhpdHN0YXR1cyA9IDB4ZmY7Cit9CisKKy8qIFR5cGVzIHVzZWQgdG8gY3JlYXRlIGxpc3Qgb2YgYWxsIGV4cG9ydGVkIHN5bWJvbHMgaW4gYSBudW1iZXIgb2YgZmlsZXMgKi8KK3N0cnVjdCBzeW1ib2xzCit7CisJY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBzeW1maWxlCit7CisJY2hhciAqZmlsZW5hbWU7CisJc3RydWN0IHN5bWJvbHMgKnN5bWJvbGxpc3Q7CisJaW50IHN5bWJvbGNudDsKK307CisKK3N0cnVjdCBzeW1maWxlIHN5bWZpbGVsaXN0W01BWEZJTEVTXTsKK2ludCBzeW1maWxlY250ID0gMDsKKwordm9pZCBhZGRfbmV3X3N5bWJvbChzdHJ1Y3Qgc3ltZmlsZSAqc3ltLCBjaGFyICogc3ltbmFtZSkKK3sKKwlzeW0tPnN5bWJvbGxpc3QgPQorCSAgcmVhbGxvYyhzeW0tPnN5bWJvbGxpc3QsIChzeW0tPnN5bWJvbGNudCArIDEpICogc2l6ZW9mKGNoYXIgKikpOworCXN5bS0+c3ltYm9sbGlzdFtzeW0tPnN5bWJvbGNudCsrXS5uYW1lID0gc3RyZHVwKHN5bW5hbWUpOworfQorCisvKiBBZGQgYSBmaWxlbmFtZSB0byB0aGUgbGlzdCAqLworc3RydWN0IHN5bWZpbGUgKiBhZGRfbmV3X2ZpbGUoY2hhciAqIGZpbGVuYW1lKQoreworCXN5bWZpbGVsaXN0W3N5bWZpbGVjbnQrK10uZmlsZW5hbWUgPSBzdHJkdXAoZmlsZW5hbWUpOworCXJldHVybiAmc3ltZmlsZWxpc3Rbc3ltZmlsZWNudCAtIDFdOworfQorLyogQ2hlY2sgaWYgZmlsZSBhbHJlYWR5IGFyZSBwcmVzZW50IGluIHRoZSBsaXN0ICovCitzdHJ1Y3Qgc3ltZmlsZSAqIGZpbGVuYW1lX2V4aXN0KGNoYXIgKiBmaWxlbmFtZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaSA8IHN5bWZpbGVjbnQ7IGkrKykKKwkJaWYgKHN0cmNtcChzeW1maWxlbGlzdFtpXS5maWxlbmFtZSwgZmlsZW5hbWUpID09IDApCisJCQlyZXR1cm4gJnN5bWZpbGVsaXN0W2ldOworCXJldHVybiBOVUxMOworfQorCisvKgorICogTGlzdCBhbGwgZmlsZXMgcmVmZXJlbmNlZCB3aXRoaW4gdGhlIHRlbXBsYXRlIGZpbGUuCisgKiBGaWxlcyBhcmUgc2VwYXJhdGVkIGJ5IHRhYnMuCisgKi8KK3ZvaWQgYWRkZGVwKGNoYXIgKiBmaWxlKQkJICAgeyBwcmludGYoIlx0JXMiLCBmaWxlKTsgfQordm9pZCBhZGRkZXAyKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSkgICAgIHsgbGluZSA9IGxpbmU7IGFkZGRlcChmaWxlKTsgfQordm9pZCBub2FjdGlvbihjaGFyICogbGluZSkJCSAgIHsgbGluZSA9IGxpbmU7IH0KK3ZvaWQgbm9hY3Rpb24yKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSkgICB7IGZpbGUgPSBmaWxlOyBsaW5lID0gbGluZTsgfQorCisvKiBFY2hvIHRoZSBsaW5lIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gKi8KK3ZvaWQgcHJpbnRsaW5lKGNoYXIgKiBsaW5lKSAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlcyIsIGxpbmUpOyB9CisKKy8qCisgKiBGaW5kIGFsbCBzeW1ib2xzIGV4cG9ydGVkIHdpdGggRVhQT1JUX1NZTUJPTCBhbmQgRVhQT1JUX1NZTUJPTF9HUEwKKyAqIGluIGZpbGVuYW1lLgorICogQWxsIHN5bWJvbHMgbG9jYXRlZCBhcmUgc3RvcmVkIGluIHN5bWZpbGVsaXN0LgorICovCit2b2lkIGZpbmRfZXhwb3J0X3N5bWJvbHMoY2hhciAqIGZpbGVuYW1lKQoreworCUZJTEUgKiBmcDsKKwlzdHJ1Y3Qgc3ltZmlsZSAqc3ltOworCWNoYXIgbGluZVtNQVhMSU5FU1pdOworCWlmIChmaWxlbmFtZV9leGlzdChmaWxlbmFtZSkgPT0gTlVMTCkgeworCQlpbnQgcmZsZW4gPSBzdHJsZW4oZ2V0ZW52KCJTUkNUUkVFIikpICsgc3RybGVuKGZpbGVuYW1lKTsKKwkJY2hhciAqcmVhbF9maWxlbmFtZSA9IGFsbG9jYShyZmxlbiArIDEpOworCQlzdHJjcHkocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIikpOworCQlzdHJjYXQocmVhbF9maWxlbmFtZSwgZmlsZW5hbWUpOworCQlzeW0gPSBhZGRfbmV3X2ZpbGUoZmlsZW5hbWUpOworCQlmcCA9IGZvcGVuKHJlYWxfZmlsZW5hbWUsICJyIik7CisJCWlmIChmcCA9PSBOVUxMKQorCQl7CisJCQlmcHJpbnRmKHN0ZGVyciwgImRvY3Byb2M6ICIpOworCQkJcGVycm9yKHJlYWxfZmlsZW5hbWUpOworCQl9CisJCXdoaWxlIChmZ2V0cyhsaW5lLCBNQVhMSU5FU1osIGZwKSkgeworCQkJY2hhciAqcDsKKwkJCWNoYXIgKmU7CisJCQlpZiAoKChwID0gc3Ryc3RyKGxpbmUsICJFWFBPUlRfU1lNQk9MX0dQTCIpKSAhPSAwKSB8fAorCQkJICAgICgocCA9IHN0cnN0cihsaW5lLCAiRVhQT1JUX1NZTUJPTCIpKSAhPSAwKSkgeworCQkJCS8qIFNraXAgRVhQT1JUX1NZTUJPTHtfR1BMfSAqLworCQkJCXdoaWxlIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpCisJCQkJCXArKzsKKwkJCQkvKiBSZW1vdmUgcGFyYW50ZXNlcyBhbmQgYWRkaXRpb25hbCB3cyAqLworCQkJCXdoaWxlIChpc3NwYWNlKCpwKSkKKwkJCQkJcCsrOworCQkJCWlmICgqcCAhPSAnKCcpCisJCQkJCWNvbnRpbnVlOyAvKiBTeW50YXggZXJyb3I/ICovCisJCQkJZWxzZQorCQkJCQlwKys7CisJCQkJd2hpbGUgKGlzc3BhY2UoKnApKQorCQkJCQlwKys7CisJCQkJZSA9IHA7CisJCQkJd2hpbGUgKGlzYWxudW0oKmUpIHx8ICplID09ICdfJykKKwkJCQkJZSsrOworCQkJCSplID0gJ1wwJzsKKwkJCQlhZGRfbmV3X3N5bWJvbChzeW0sIHApOworCQkJfQorCQl9CisJCWZjbG9zZShmcCk7CisJfQorfQorCisvKgorICogRG9jdW1lbnQgYWxsIGV4dGVybmFsIG9yIGludGVybmFsIGZ1bmN0aW9ucyBpbiBhIGZpbGUuCisgKiBDYWxsIGtlcm5lbC1kb2Mgd2l0aCBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAqIGtlcm5lbC1kb2MgLWRvY2Jvb2sgLW5vZnVuY3Rpb24gZnVuY3Rpb25fbmFtZTEgZmlsZW5hbWUKKyAqIGZ1bmN0aW9uIG5hbWVzIGFyZSBvYnRhaW5lZCBmcm9tIGFsbCB0aGUgc3JjIGZpbGVzCisgKiBieSBmaW5kX2V4cG9ydF9zeW1ib2xzLgorICogaW50ZnVuYyB1c2VzIC1ub2Z1bmN0aW9uCisgKiBleHRmdW5jIHVzZXMgLWZ1bmN0aW9uCisgKi8KK3ZvaWQgZG9jZnVuY3Rpb25zKGNoYXIgKiBmaWxlbmFtZSwgY2hhciAqIHR5cGUpCit7CisJaW50IGksajsKKwlpbnQgc3ltY250ID0gMDsKKwlpbnQgaWR4ID0gMDsKKwljaGFyICoqdmVjOworCisJZm9yIChpPTA7IGkgPD0gc3ltZmlsZWNudDsgaSsrKQorCQlzeW1jbnQgKz0gc3ltZmlsZWxpc3RbaV0uc3ltYm9sY250OworCXZlYyA9IG1hbGxvYygoMiArIDIgKiBzeW1jbnQgKyAyKSAqIHNpemVvZihjaGFyKikpOworCWlmICh2ZWMgPT0gTlVMTCkgeworCQlwZXJyb3IoImRvY3Byb2M6ICIpOworCQlleGl0KDEpOworCX0KKwl2ZWNbaWR4KytdID0gS0VSTkVMRE9DOworCXZlY1tpZHgrK10gPSBET0NCT09LOworCWZvciAoaT0wOyBpIDwgc3ltZmlsZWNudDsgaSsrKSB7CisJCXN0cnVjdCBzeW1maWxlICogc3ltID0gJnN5bWZpbGVsaXN0W2ldOworCQlmb3IgKGo9MDsgaiA8IHN5bS0+c3ltYm9sY250OyBqKyspIHsKKwkJCXZlY1tpZHgrK10gICAgID0gdHlwZTsKKwkJCXZlY1tpZHgrK10gPSBzeW0tPnN5bWJvbGxpc3Rbal0ubmFtZTsKKwkJfQorCX0KKwl2ZWNbaWR4KytdICAgICA9IGZpbGVuYW1lOworCXZlY1tpZHhdID0gTlVMTDsKKwlwcmludGYoIjwhLS0gJXMgLS0+XG4iLCBmaWxlbmFtZSk7CisJZXhlY19rZXJuZWxfZG9jKHZlYyk7CisJZmZsdXNoKHN0ZG91dCk7CisJZnJlZSh2ZWMpOworfQordm9pZCBpbnRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgewlkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIE5PRlVOQ1RJT04pOyB9Cit2b2lkIGV4dGZ1bmMoY2hhciAqIGZpbGVuYW1lKSB7IGRvY2Z1bmN0aW9ucyhmaWxlbmFtZSwgRlVOQ1RJT04pOyAgIH0KKworLyoKKyAqIERvY3VtZW50IHNwZWNpZmljIGZ1bmN0aW9uKHMpIGluIGEgZmlsZS4KKyAqIENhbGwga2VybmVsLWRvYyB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAqIGtlcm5lbC1kb2MgLWRvY2Jvb2sgLWZ1bmN0aW9uIGZ1bmN0aW9uMSBbLWZ1bmN0aW9uIGZ1bmN0aW9uMl0KKyAqLwordm9pZCBzaW5nZnVuYyhjaGFyICogZmlsZW5hbWUsIGNoYXIgKiBsaW5lKQoreworCWNoYXIgKnZlY1syMDBdOyAvKiBFbm91Z2ggZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworCWludCBpLCBpZHggPSAwOworCWludCBzdGFydG9mc3ltID0gMTsKKwl2ZWNbaWR4KytdID0gS0VSTkVMRE9DOworCXZlY1tpZHgrK10gPSBET0NCT09LOworCisJLyogU3BsaXQgbGluZSB1cCBpbiBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgcHJlY2VlZGVkIGJ5IEZVTkNUSU9OICovCisJZm9yIChpPTA7IGxpbmVbaV07IGkrKykgeworCQlpZiAoaXNzcGFjZShsaW5lW2ldKSkgeworCQkJbGluZVtpXSA9ICdcMCc7CisJCQlzdGFydG9mc3ltID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdGFydG9mc3ltKSB7CisJCQlzdGFydG9mc3ltID0gMDsKKwkJCXZlY1tpZHgrK10gPSBGVU5DVElPTjsKKwkJCXZlY1tpZHgrK10gPSAmbGluZVtpXTsKKwkJfQorCX0KKwl2ZWNbaWR4KytdID0gZmlsZW5hbWU7CisJdmVjW2lkeF0gPSBOVUxMOworCWV4ZWNfa2VybmVsX2RvYyh2ZWMpOworfQorCisvKgorICogUGFyc2UgZmlsZSwgY2FsbGluZyBhY3Rpb24gc3BlY2lmaWMgZnVuY3Rpb25zIGZvcjoKKyAqIDEpIExpbmVzIGNvbnRhaW5pbmcgIUUKKyAqIDIpIExpbmVzIGNvbnRhaW5pbmcgIUkKKyAqIDMpIExpbmVzIGNvbnRhaW5pbmcgIUQKKyAqIDQpIExpbmVzIGNvbnRhaW5pbmcgIUYKKyAqIDUpIERlZmF1bHQgbGluZXMgLSBsaW5lcyBub3QgbWF0Y2hpbmcgdGhlIGFib3ZlCisgKi8KK3ZvaWQgcGFyc2VfZmlsZShGSUxFICppbmZpbGUpCit7CisJY2hhciBsaW5lW01BWExJTkVTWl07CisJY2hhciAqIHM7CisJd2hpbGUgKGZnZXRzKGxpbmUsIE1BWExJTkVTWiwgaW5maWxlKSkgeworCQlpZiAobGluZVswXSA9PSAnIScpIHsKKwkJCXMgPSBsaW5lICsgMjsKKwkJCXN3aXRjaCAobGluZVsxXSkgeworCQkJCWNhc2UgJ0UnOgorCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CisJCQkJCSpzID0gJ1wwJzsKKwkJCQkJZXh0ZXJuYWxmdW5jdGlvbnMobGluZSsyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnSSc6CisJCQkJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpIHMrKzsKKwkJCQkJKnMgPSAnXDAnOworCQkJCQlpbnRlcm5hbGZ1bmN0aW9ucyhsaW5lKzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdEJzoKKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcyA9ICdcMCc7CisJCQkJCXN5bWJvbHNvbmx5KGxpbmUrMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0YnOgorCQkJCQkvKiBmaWxlbmFtZSAqLworCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CisJCQkJCSpzKysgPSAnXDAnOworCQkJCQkvKiBmdW5jdGlvbiBuYW1lcyAqLworCQkJCQl3aGlsZSAoaXNzcGFjZSgqcykpCisJCQkJCQlzKys7CisJCQkJCXNpbmdsZWZ1bmN0aW9ucyhsaW5lICsyLCBzKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZGVmYXVsdGxpbmUobGluZSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlkZWZhdWx0bGluZShsaW5lKTsKKwkJfQorCX0KKwlmZmx1c2goc3Rkb3V0KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJRklMRSAqIGluZmlsZTsKKwlpZiAoYXJnYyAhPSAzKSB7CisJCXVzYWdlKCk7CisJCWV4aXQoMSk7CisJfQorCS8qIE9wZW4gZmlsZSwgZXhpdCBvbiBlcnJvciAqLworCWluZmlsZSA9IGZvcGVuKGFyZ3ZbMl0sICJyIik7CisJaWYgKGluZmlsZSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZG9jcHJvYzogIik7CisJCXBlcnJvcihhcmd2WzJdKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlpZiAoc3RyY21wKCJkb2MiLCBhcmd2WzFdKSA9PSAwKQorCXsKKwkJLyogTmVlZCB0byBkbyB0aGlzIGluIHR3byBwYXNzZXMuCisJCSAqIEZpcnN0IHBhc3MgaXMgdXNlZCB0byBjb2xsZWN0IGFsbCBzeW1ib2xzIGV4cG9ydGVkCisJCSAqIGluIHRoZSB2YXJpb3VzIGZpbGVzLgorCQkgKiBTZWNvbmQgcGFzcyBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKwkJICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGZ1bmN0aW9uIGFyZSBkZWNsYXJlZAorCQkgKiBhbmQgZXhwb3J0ZWQgaW4gZGlmZmVyZW50IGZpbGVzIDotKCgKKwkJICovCisJCS8qIENvbGxlY3Qgc3ltYm9scyAqLworCQlkZWZhdWx0bGluZSAgICAgICA9IG5vYWN0aW9uOworCQlpbnRlcm5hbGZ1bmN0aW9ucyA9IGZpbmRfZXhwb3J0X3N5bWJvbHM7CisJCWV4dGVybmFsZnVuY3Rpb25zID0gZmluZF9leHBvcnRfc3ltYm9sczsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBmaW5kX2V4cG9ydF9zeW1ib2xzOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IG5vYWN0aW9uMjsKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCisJCS8qIFJld2luZCB0byBzdGFydCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIGFnYWluICovCisJCWZzZWVrKGluZmlsZSwgMCwgU0VFS19TRVQpOworCQlkZWZhdWx0bGluZSAgICAgICA9IHByaW50bGluZTsKKwkJaW50ZXJuYWxmdW5jdGlvbnMgPSBpbnRmdW5jOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGV4dGZ1bmM7CisJCXN5bWJvbHNvbmx5ICAgICAgID0gcHJpbnRsaW5lOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IHNpbmdmdW5jOworCisJCXBhcnNlX2ZpbGUoaW5maWxlKTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKCJkZXBlbmQiLCBhcmd2WzFdKSA9PSAwKQorCXsKKwkJLyogQ3JlYXRlIGZpcnN0IHBhcnQgb2YgZGVwZW5kZW5jeSBjaGFpbgorCQkgKiBmaWxlLnRtcGwgKi8KKwkJcHJpbnRmKCIlc1x0IiwgYXJndlsyXSk7CisJCWRlZmF1bHRsaW5lICAgICAgID0gbm9hY3Rpb247CisJCWludGVybmFsZnVuY3Rpb25zID0gYWRkZGVwOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGFkZGRlcDsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBhZGRkZXA7CisJCXNpbmdsZWZ1bmN0aW9ucyAgID0gYWRkZGVwMjsKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCQlwcmludGYoIlxuIik7CisJfQorCWVsc2UKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246ICVzXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisJZmNsb3NlKGluZmlsZSk7CisJZmZsdXNoKHN0ZG91dCk7CisJcmV0dXJuIGV4aXRzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9iYXNpYy9maXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdhMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9iYXNpYy9maXhkZXAuYwpAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqICJPcHRpbWl6ZSIgYSBsaXN0IG9mIGRlcGVuZGVuY2llcyBhcyBzcGl0IG91dCBieSBnY2MgLU1ECisgKiBmb3IgdGhlIGtlcm5lbCBidWlsZAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogQXV0aG9yICAgICAgIEthaSBHZXJtYXNjaGV3c2tpCisgKiBDb3B5cmlnaHQgICAgMjAwMiBieSBLYWkgR2VybWFzY2hld3NraSAgPGthaS5nZXJtYXNjaGV3c2tpQGdteC5kZT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqCisgKiBJbnRyb2R1Y3Rpb246CisgKgorICogZ2NjIHByb2R1Y2VzIGEgdmVyeSBuaWNlIGFuZCBjb3JyZWN0IGxpc3Qgb2YgZGVwZW5kZW5jaWVzIHdoaWNoCisgKiB0ZWxscyBtYWtlIHdoZW4gdG8gcmVtYWtlIGEgZmlsZS4KKyAqCisgKiBUbyB1c2UgdGhpcyBsaXN0IGFzLWlzIGhvd2V2ZXIgaGFzIHRoZSBkcmF3YmFjayB0aGF0IHZpcnR1YWxseQorICogZXZlcnkgZmlsZSBpbiB0aGUga2VybmVsIGluY2x1ZGVzIDxsaW51eC9jb25maWcuaD4gd2hpY2ggdGhlbiBhZ2FpbgorICogaW5jbHVkZXMgPGxpbnV4L2F1dG9jb25mLmg+CisgKgorICogSWYgdGhlIHVzZXIgcmUtcnVucyBtYWtlICpjb25maWcsIGxpbnV4L2F1dG9jb25mLmggd2lsbCBiZQorICogcmVnZW5lcmF0ZWQuICBtYWtlIG5vdGljZXMgdGhhdCBhbmQgd2lsbCByZWJ1aWxkIGV2ZXJ5IGZpbGUgd2hpY2gKKyAqIGluY2x1ZGVzIGF1dG9jb25mLmgsIGkuZS4gYmFzaWNhbGx5IGFsbCBmaWxlcy4gVGhpcyBpcyBleHRyZW1lbHkKKyAqIGFubm95aW5nIGlmIHRoZSB1c2VyIGp1c3QgY2hhbmdlZCBDT05GSUdfSElTX0RSSVZFUiBmcm9tIG4gdG8gbS4KKyAqCisgKiBTbyB3ZSBwbGF5IHRoZSBzYW1lIHRyaWNrIHRoYXQgIm1rZGVwIiBwbGF5ZWQgYmVmb3JlLiBXZSByZXBsYWNlCisgKiB0aGUgZGVwZW5kZW5jeSBvbiBsaW51eC9hdXRvY29uZi5oIGJ5IGEgZGVwZW5kZW5jeSBvbiBldmVyeSBjb25maWcKKyAqIG9wdGlvbiB3aGljaCBpcyBtZW50aW9uZWQgaW4gYW55IG9mIHRoZSBsaXN0ZWQgcHJlcXVpc2l0ZXMuCisgKgorICogVG8gYmUgZXhhY3QsIHNwbGl0LWluY2x1ZGUgcG9wdWxhdGVzIGEgdHJlZSBpbiBpbmNsdWRlL2NvbmZpZy8sCisgKiBlLmcuIGluY2x1ZGUvY29uZmlnL2hpcy9kcml2ZXIuaCwgd2hpY2ggY29udGFpbnMgdGhlICNkZWZpbmUvI3VuZGVmCisgKiBmb3IgdGhlIENPTkZJR19ISVNfRFJJVkVSIG9wdGlvbi4KKyAqCisgKiBTbyBpZiB0aGUgdXNlciBjaGFuZ2VzIGhpcyBDT05GSUdfSElTX0RSSVZFUiBvcHRpb24sIG9ubHkgdGhlIG9iamVjdHMKKyAqIHdoaWNoIGRlcGVuZCBvbiAiaW5jbHVkZS9saW51eC9jb25maWcvaGlzL2RyaXZlci5oIiB3aWxsIGJlIHJlYnVpbHQsCisgKiBzbyBtb3N0IGxpa2VseSBvbmx5IGhpcyBkcml2ZXIgOy0pCisgKgorICogVGhlIGlkZWEgYWJvdmUgZGF0ZXMsIGJ5IHRoZSB3YXksIGJhY2sgdG8gTWljaGFlbCBFIENoYXN0YWluLCBBRkFJSy4KKyAqCisgKiBTbyB0byBnZXQgZGVwZW5kZW5jaWVzIHJpZ2h0LCB0aGVyZSBhcmUgdHdvIGlzc3VlczoKKyAqIG8gaWYgYW55IG9mIHRoZSBmaWxlcyB0aGUgY29tcGlsZXIgcmVhZCBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJlYnVpbGQKKyAqIG8gaWYgdGhlIGNvbW1hbmQgbGluZSBnaXZlbiB0byB0aGUgY29tcGlsZSB0aGUgZmlsZSBjaGFuZ2VkLCB3ZQorICogICBiZXR0ZXIgcmVidWlsZCBhcyB3ZWxsLgorICoKKyAqIFRoZSBmb3JtZXIgaXMgaGFuZGxlZCBieSB1c2luZyB0aGUgLU1EIG91dHB1dCwgdGhlIGxhdGVyIGJ5IHNhdmluZworICogdGhlIGNvbW1hbmQgbGluZSB1c2VkIHRvIGNvbXBpbGUgdGhlIG9sZCBvYmplY3QgYW5kIGNvbXBhcmluZyBpdAorICogdG8gdGhlIG9uZSB3ZSB3b3VsZCBub3cgdXNlLgorICoKKyAqIEFnYWluLCBhbHNvIHRoaXMgaWRlYSBpcyBwcmV0dHkgb2xkIGFuZCBoYXMgYmVlbiBkaXNjdXNzZWQgb24KKyAqIGtidWlsZC1kZXZlbCBhIGxvbmcgdGltZSBhZ28uIEkgZG9uJ3QgaGF2ZSBhIHNlbnNpYmx5IHdvcmtpbmcKKyAqIGludGVybmV0IGNvbm5lY3Rpb24gcmlnaHQgbm93LCBzbyBJIHJhdGhlciBkb24ndCBtZW50aW9uIG5hbWVzCisgKiB3aXRob3V0IGRvdWJsZSBjaGVja2luZy4KKyAqCisgKiBUaGlzIGNvZGUgaGVyZSBoYXMgYmVlbiBiYXNlZCBwYXJ0aWFsbHkgYmFzZWQgb24gbWtkZXAuYywgd2hpY2gKKyAqIHNheXMgdGhlIGZvbGxvd2luZyBhYm91dCBpdHMgaGlzdG9yeToKKyAqCisgKiAgIENvcHlyaWdodCBhYmFuZG9uZWQsIE1pY2hhZWwgQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4uCisgKiAgIFRoaXMgaXMgYSBDIHZlcnNpb24gb2Ygc3luY2RlcC5wbCBieSBXZXJuZXIgQWxtZXNiZXJnZXIuCisgKgorICoKKyAqIEl0IGlzIGludm9rZWQgYXMKKyAqCisgKiAgIGZpeGRlcCA8ZGVwZmlsZT4gPHRhcmdldD4gPGNtZGxpbmU+CisgKgorICogYW5kIHdpbGwgcmVhZCB0aGUgZGVwZW5kZW5jeSBmaWxlIDxkZXBmaWxlPgorICoKKyAqIFRoZSB0cmFuc2Zvcm1lZCBkZXBlbmRlbmN5IHNuaXBwZWQgaXMgd3JpdHRlbiB0byBzdGRvdXQuCisgKgorICogSXQgZmlyc3QgZ2VuZXJhdGVzIGEgbGluZQorICoKKyAqICAgY21kXzx0YXJnZXQ+ID0gPGNtZGxpbmU+CisgKgorICogYW5kIHRoZW4gYmFzaWNhbGx5IGNvcGllcyB0aGUgLjx0YXJnZXQ+LmQgZmlsZSB0byBzdGRvdXQsIGluIHRoZQorICogcHJvY2VzcyBmaWx0ZXJpbmcgb3V0IHRoZSBkZXBlbmRlbmN5IG9uIGxpbnV4L2F1dG9jb25mLmggYW5kIGFkZGluZworICogZGVwZW5kZW5jaWVzIG9uIGluY2x1ZGUvY29uZmlnL215L29wdGlvbi5oIGZvciBldmVyeQorICogQ09ORklHX01ZX09QVElPTiBlbmNvdW50ZXJlZCBpbiBhbnkgb2YgdGhlIHByZXF1aXNpdGVzLgorICoKKyAqIEl0IHdpbGwgYWxzbyBmaWx0ZXIgb3V0IGFsbCB0aGUgZGVwZW5kZW5jaWVzIG9uICoudmVyLiBXZSBuZWVkCisgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZ2VuZXJhdGVkIHZlcnNpb24gY2hlY2tzdW0gYXJlIGdsb2JhbGx5IHVwCisgKiB0byBkYXRlIGJlZm9yZSBldmVuIHN0YXJ0aW5nIHRoZSByZWN1cnNpdmUgYnVpbGQsIHNvIGl0J3MgdG9vIGxhdGUKKyAqIGF0IHRoaXMgcG9pbnQgYW55d2F5LgorICoKKyAqIFRoZSBhbGdvcml0aG0gdG8gZ3JlcCBmb3IgIkNPTkZJR18uLi4iIGlzIGJpdCB1bnVzdWFsLCBidXQgc2hvdWxkCisgKiBiZSBmYXN0IDstKSBXZSBkb24ndCBldmVuIHRyeSB0byByZWFsbHkgcGFyc2UgdGhlIGhlYWRlciBmaWxlcywgYnV0CisgKiBtZXJlbHkgZ3JlcCwgaS5lLiBpZiBDT05GSUdfRk9PIGlzIG1lbnRpb25lZCBpbiBhIGNvbW1lbnQsIGl0IHdpbGwKKyAqIGJlIHBpY2tlZCB1cCBhcyB3ZWxsLiBJdCdzIG5vdCBhIHByb2JsZW0gd2l0aCByZXNwZWN0IHRvCisgKiBjb3JyZWN0bmVzcywgc2luY2UgdGhhdCBjYW4gb25seSBnaXZlIHRvbyBtYW55IGRlcGVuZGVuY2llcywgdGh1cworICogd2UgY2Fubm90IG1pc3MgYSByZWJ1aWxkLiBTaW5jZSBwZW9wbGUgdGVuZCB0byBub3QgbWVudGlvbiB0b3RhbGx5CisgKiB1bnJlbGF0ZWQgQ09ORklHXyBvcHRpb25zIGFsbCBvdmVyIHRoZSBwbGFjZSwgaXQncyBub3QgYW4KKyAqIGVmZmljaWVuY3kgcHJvYmxlbSBlaXRoZXIuCisgKgorICogKE5vdGU6IGl0J2QgYmUgZWFzeSB0byBwb3J0IG92ZXIgdGhlIGNvbXBsZXRlIG1rZGVwIHN0YXRlIG1hY2hpbmUsCisgKiAgYnV0IEkgZG9uJ3QgdGhpbmsgdGhlIGFkZGVkIGNvbXBsZXhpdHkgaXMgd29ydGggaXQpCisgKi8KKy8qCisgKiBOb3RlIDI6IGlmIHNvbWVib2R5IHdyaXRlcyBIRUxMT19DT05GSUdfQk9PTSBpbiBhIGZpbGUsIGl0IHdpbGwgZGVwZW5kIG9udG8KKyAqIENPTkZJR19CT09NLiBUaGlzIGNvdWxkIHNlZW0gYSBidWcgKG5vdCB0b28gaGFyZCB0byBmaXgpLCBidXQgcGxlYXNlIGRvIG5vdAorICogZml4IGl0ISBTb21lIFVzZXJNb2RlTGludXggZmlsZXMgKGxvb2sgYXQgYXJjaC91bS8pIGNhbGwgQ09ORklHX0JPT00gYXMKKyAqIFVNTF9DT05GSUdfQk9PTSwgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggL3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9jb25mLmgsCisgKiB0aHJvdWdoIGFyY2gvdW0vaW5jbHVkZS91bWwtY29uZmlnLmg7IHRoaXMgZml4ZGVwICJidWciIG1ha2VzIHN1cmUgdGhhdAorICogdGhvc2UgZmlsZXMgd2lsbCBoYXZlIGNvcnJlY3QgZGVwZW5kZW5jaWVzLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKy8qIGJib3g6IG5vdCBuZWVkZWQKKyNkZWZpbmUgSU5UX0NPTkYgbnRvaGwoMHg0MzRmNGU0NikKKyNkZWZpbmUgSU5UX09ORkkgbnRvaGwoMHg0ZjRlNDY0OSkKKyNkZWZpbmUgSU5UX05GSUcgbnRvaGwoMHg0ZTQ2NDk0NykKKyNkZWZpbmUgSU5UX0ZJR18gbnRvaGwoMHg0NjQ5NDc1ZikKKyovCisKK2NoYXIgKnRhcmdldDsKK2NoYXIgKmRlcGZpbGU7CitjaGFyICpjbWRsaW5lOworCit2b2lkIHVzYWdlKHZvaWQpCisKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBmaXhkZXAgPGRlcGZpbGU+IDx0YXJnZXQ+IDxjbWRsaW5lPlxuIik7CisJZXhpdCgxKTsKK30KKworLyoKKyAqIFByaW50IG91dCB0aGUgY29tbWFuZGxpbmUgcHJlZml4ZWQgd2l0aCBjbWRfPHRhcmdldCBmaWxlbmFtZT4gOj0KKyAqLwordm9pZCBwcmludF9jbWRsaW5lKHZvaWQpCit7CisJcHJpbnRmKCJjbWRfJXMgOj0gJXNcblxuIiwgdGFyZ2V0LCBjbWRsaW5lKTsKK30KKworY2hhciAqIHN0cl9jb25maWcgID0gTlVMTDsKK2ludCAgICBzaXplX2NvbmZpZyA9IDA7CitpbnQgICAgbGVuX2NvbmZpZyAgPSAwOworCisvKgorICogR3JvdyB0aGUgY29uZmlndXJhdGlvbiBzdHJpbmcgdG8gYSBkZXNpcmVkIGxlbmd0aC4KKyAqIFVzdWFsbHkgdGhlIGZpcnN0IGdyb3d0aCBpcyBwbGVudHkuCisgKi8KK3ZvaWQgZ3Jvd19jb25maWcoaW50IGxlbikKK3sKKwl3aGlsZSAobGVuX2NvbmZpZyArIGxlbiA+IHNpemVfY29uZmlnKSB7CisJCWlmIChzaXplX2NvbmZpZyA9PSAwKQorCQkJc2l6ZV9jb25maWcgPSAyMDQ4OworCQlzdHJfY29uZmlnID0gcmVhbGxvYyhzdHJfY29uZmlnLCBzaXplX2NvbmZpZyAqPSAyKTsKKwkJaWYgKHN0cl9jb25maWcgPT0gTlVMTCkKKwkJCXsgcGVycm9yKCJmaXhkZXA6bWFsbG9jIik7IGV4aXQoMSk7IH0KKwl9Cit9CisKKworCisvKgorICogTG9va3VwIGEgdmFsdWUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgorICovCitpbnQgaXNfZGVmaW5lZF9jb25maWcoY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqIHBjb25maWc7CisJY29uc3QgY2hhciAqIHBsYXN0ID0gc3RyX2NvbmZpZyArIGxlbl9jb25maWcgLSBsZW47CisJZm9yICggcGNvbmZpZyA9IHN0cl9jb25maWcgKyAxOyBwY29uZmlnIDwgcGxhc3Q7IHBjb25maWcrKyApIHsKKwkJaWYgKHBjb25maWdbIC0xXSA9PSAnXG4nCisJCSYmICBwY29uZmlnW2xlbl0gPT0gJ1xuJworCQkmJiAgIW1lbWNtcChwY29uZmlnLCBuYW1lLCBsZW4pKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQWRkIGEgbmV3IHZhbHVlIHRvIHRoZSBjb25maWd1cmF0aW9uIHN0cmluZy4KKyAqLwordm9pZCBkZWZpbmVfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQoreworCWdyb3dfY29uZmlnKGxlbiArIDEpOworCisJbWVtY3B5KHN0cl9jb25maWcrbGVuX2NvbmZpZywgbmFtZSwgbGVuKTsKKwlsZW5fY29uZmlnICs9IGxlbjsKKwlzdHJfY29uZmlnW2xlbl9jb25maWcrK10gPSAnXG4nOworfQorCisvKgorICogQ2xlYXIgdGhlIHNldCBvZiBjb25maWd1cmF0aW9uIHN0cmluZ3MuCisgKi8KK3ZvaWQgY2xlYXJfY29uZmlnKHZvaWQpCit7CisJbGVuX2NvbmZpZyA9IDA7CisJZGVmaW5lX2NvbmZpZygiIiwgMCk7Cit9CisKKy8qCisgKiBSZWNvcmQgdGhlIHVzZSBvZiBhIENPTkZJR18qIHdvcmQuCisgKi8KK3ZvaWQgdXNlX2NvbmZpZyhjaGFyICptLCBpbnQgc2xlbikKK3sKKwljaGFyICpzID0gYWxsb2NhKHNsZW4rMSk7CisJY2hhciAqcDsKKworCWlmIChpc19kZWZpbmVkX2NvbmZpZyhtLCBzbGVuKSkKKwkgICAgcmV0dXJuOworCisJZGVmaW5lX2NvbmZpZyhtLCBzbGVuKTsKKworCW1lbWNweShzLCBtLCBzbGVuKTsgc1tzbGVuXSA9IDA7CisKKwlmb3IgKHAgPSBzOyBwIDwgcyArIHNsZW47IHArKykgeworCQlpZiAoKnAgPT0gJ18nKQorCQkJKnAgPSAnLyc7CisJCWVsc2UKKwkJCSpwID0gdG9sb3dlcigoaW50KSpwKTsKKwl9CisJcHJpbnRmKCIgICAgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy8lcy5oKSBcXFxuIiwgcyk7Cit9CisKK3ZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoY2hhciAqbWFwLCBzaXplX3QgbGVuKQoreworCS8qIG1vZGlmaWVkIGZvciBiYm94ICovCisJY2hhciAqZW5kXzMgPSBtYXAgKyBsZW4gLSAzOyAvKiAzID09IGxlbmd0aCBvZiAiSUZfIiAqLworCWNoYXIgKmVuZF83ID0gbWFwICsgbGVuIC0gNzsKKwljaGFyICpwID0gbWFwOworCWNoYXIgKnE7CisJaW50IG9mZjsKKworCWZvciAoOyBwIDw9IGVuZF8zOyBwKyspIHsKKwkJLyogRmluZCBuZXh0IGlkZW50aWZpZXIncyBiZWdpbm5pbmcgKi8KKwkJaWYgKCEoaXNhbG51bSgqcCkgfHwgKnAgPT0gJ18nKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIGl0ICovCisJCWlmIChwIDwgZW5kXzcgJiYgcFs2XSA9PSAnXycpIHsKKwkJCWlmICghbWVtY21wKHAsICJDT05GSUciLCA2KSkgZ290byBjb25mNzsKKwkJCWlmICghbWVtY21wKHAsICJFTkFCTEUiLCA2KSkgZ290byBjb25mNzsKKwkJCWlmICghbWVtY21wKHAsICJJRl9OT1QiLCA2KSkgZ290byBjb25mNzsKKwkJfQorCQkvKiB3ZSBoYXZlIGF0IGxlYXN0IDMgY2hhcnMgYmVjYXVzZSBvZiBwIDw9IGVuZF8zICovCisJCS8qaWYgKCFtZW1jbXAocCwgIklGXyIsIDMpKSAuLi4qLworCQlpZiAocFswXSA9PSAnSScgJiYgcFsxXSA9PSAnRicgJiYgcFsyXSA9PSAnXycpIHsKKwkJCW9mZiA9IDM7CisJCQlnb3RvIGNvbmY7CisJCX0KKworCQkvKiBUaGlzIGlkZW50aWZpZXIgaXMgbm90IGludGVyZXN0aW5nLCBza2lwIGl0ICovCisJCXdoaWxlIChwIDw9IGVuZF8zICYmIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpKQorCQkJcCsrOworCQljb250aW51ZTsKKworCWNvbmY3OglvZmYgPSA3OworCWNvbmY6CisJCXAgKz0gb2ZmOworCQlmb3IgKHEgPSBwOyBxIDwgZW5kXzMrMzsgcSsrKSB7CisJCQlpZiAoIShpc2FsbnVtKCpxKSB8fCAqcSA9PSAnXycpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChxICE9IHApIHsKKwkJCXVzZV9jb25maWcocCwgcS1wKTsKKwkJfQorCX0KK30KKworLyogdGVzdCBpcyBzIGVuZHMgaW4gc3ViICovCitpbnQgc3RycmNtcChjaGFyICpzLCBjaGFyICpzdWIpCit7CisJaW50IHNsZW4gPSBzdHJsZW4ocyk7CisJaW50IHN1YmxlbiA9IHN0cmxlbihzdWIpOworCisJaWYgKHN1YmxlbiA+IHNsZW4pCisJCXJldHVybiAxOworCisJcmV0dXJuIG1lbWNtcChzICsgc2xlbiAtIHN1Ymxlbiwgc3ViLCBzdWJsZW4pOworfQorCit2b2lkIGRvX2NvbmZpZ19maWxlKGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKwl2b2lkICptYXA7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiAiKTsKKwkJcGVycm9yKGZpbGVuYW1lKTsKKwkJZXhpdCgyKTsKKwl9CisJZnN0YXQoZmQsICZzdCk7CisJaWYgKHN0LnN0X3NpemUgPT0gMCkgeworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisJbWFwID0gbW1hcChOVUxMLCBzdC5zdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJaWYgKChsb25nKSBtYXAgPT0gLTEpIHsKKwkJcGVycm9yKCJmaXhkZXA6IG1tYXAiKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm47CisJfQorCisJcGFyc2VfY29uZmlnX2ZpbGUobWFwLCBzdC5zdF9zaXplKTsKKworCW11bm1hcChtYXAsIHN0LnN0X3NpemUpOworCisJY2xvc2UoZmQpOworfQorCit2b2lkIHBhcnNlX2RlcF9maWxlKHZvaWQgKm1hcCwgc2l6ZV90IGxlbikKK3sKKwljaGFyICptID0gbWFwOworCWNoYXIgKmVuZCA9IG0gKyBsZW47CisJY2hhciAqcDsKKwljaGFyICpzID0gYWxsb2NhKGxlbik7CisKKwlwID0gbWVtY2hyKG0sICc6JywgbGVuKTsKKwlpZiAoIXApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6IHBhcnNlIGVycm9yXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJbWVtY3B5KHMsIG0sIHAtbSk7IHNbcC1tXSA9IDA7CisJcHJpbnRmKCJkZXBzXyVzIDo9IFxcXG4iLCB0YXJnZXQpOworCW0gPSBwKzE7CisKKwljbGVhcl9jb25maWcoKTsKKworCXdoaWxlIChtIDwgZW5kKSB7CisJCXdoaWxlIChtIDwgZW5kICYmICgqbSA9PSAnICcgfHwgKm0gPT0gJ1xcJyB8fCAqbSA9PSAnXG4nIHx8ICptID09ICdccicpKQorCQkJbSsrOworCQlwID0gbTsKKwkJd2hpbGUgKHAgPCBlbmQgJiYgKnAgIT0gJyAnKSBwKys7CisJCWlmIChwID09IGVuZCkgeworCQkJZG8gcC0tOyB3aGlsZSAoIWlzYWxudW0oKnApKTsKKwkJCXArKzsKKwkJfQorCQltZW1jcHkocywgbSwgcC1tKTsgc1twLW1dID0gMDsKKwkJaWYgKHN0cnJjbXAocywgImluY2x1ZGUvYXV0b2NvbmYuaCIpICYmCisJCSAgICBzdHJyY21wKHMsICJhcmNoL3VtL2luY2x1ZGUvdW1sLWNvbmZpZy5oIikgJiYKKwkJICAgIHN0cnJjbXAocywgIi52ZXIiKSkgeworCQkJcHJpbnRmKCIgICVzIFxcXG4iLCBzKTsKKwkJCWRvX2NvbmZpZ19maWxlKHMpOworCQl9CisJCW0gPSBwICsgMTsKKwl9CisJcHJpbnRmKCJcbiVzOiAkKGRlcHNfJXMpXG5cbiIsIHRhcmdldCwgdGFyZ2V0KTsKKwlwcmludGYoIiQoZGVwc18lcyk6XG4iLCB0YXJnZXQpOworfQorCit2b2lkIHByaW50X2RlcHModm9pZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgZmQ7CisJdm9pZCAqbWFwOworCisJZmQgPSBvcGVuKGRlcGZpbGUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiAiKTsKKwkJcGVycm9yKGRlcGZpbGUpOworCQlleGl0KDIpOworCX0KKwlmc3RhdChmZCwgJnN0KTsKKwlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJmaXhkZXA6ICVzIGlzIGVtcHR5XG4iLGRlcGZpbGUpOworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisJbWFwID0gbW1hcChOVUxMLCBzdC5zdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJaWYgKChsb25nKSBtYXAgPT0gLTEpIHsKKwkJcGVycm9yKCJmaXhkZXA6IG1tYXAiKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm47CisJfQorCisJcGFyc2VfZGVwX2ZpbGUobWFwLCBzdC5zdF9zaXplKTsKKworCW11bm1hcChtYXAsIHN0LnN0X3NpemUpOworCisJY2xvc2UoZmQpOworfQorCit2b2lkIHRyYXBzKHZvaWQpCit7CisvKiBiYm94OiBub3QgbmVlZGVkCisJc3RhdGljIGNoYXIgdGVzdFtdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGludCkpKSkgPSAiQ09ORiI7CisKKwlpZiAoKihpbnQgKil0ZXN0ICE9IElOVF9DT05GKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBzaXplb2YoaW50KSAhPSA0IG9yIHdyb25nIGVuZGlhbmVzcz8gJSN4XG4iLAorCQkJKihpbnQgKil0ZXN0KTsKKwkJZXhpdCgyKTsKKwl9CisqLworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdHJhcHMoKTsKKworCWlmIChhcmdjICE9IDQpCisJCXVzYWdlKCk7CisKKwlkZXBmaWxlID0gYXJndlsxXTsKKwl0YXJnZXQgPSBhcmd2WzJdOworCWNtZGxpbmUgPSBhcmd2WzNdOworCisJcHJpbnRfY21kbGluZSgpOworCXByaW50X2RlcHMoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlLmMgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI4Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBzcGxpdC1pbmNsdWRlLmMKKyAqCisgKiBDb3B5cmlnaHQgYWJhbmRvbmVkLCBNaWNoYWVsIENoYXN0YWluLCA8bWFpbHRvOm1lY0BzaG91dC5uZXQ+LgorICogVGhpcyBpcyBhIEMgdmVyc2lvbiBvZiBzeW5jZGVwLnBsIGJ5IFdlcm5lciBBbG1lc2Jlcmdlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gdGFrZXMgYXV0b2NvbmYuaCBhcyBpbnB1dCBhbmQgb3V0cHV0cyBhIGRpcmVjdG9yeSBmdWxsCisgKiBvZiBvbmUtbGluZSBpbmNsdWRlIGZpbGVzLCBtZXJnaW5nIG9udG8gdGhlIG9sZCB2YWx1ZXMuCisgKgorICogVGhpbmsgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcyBrZXktdmFsdWUgcGFpcnMuICBUaGVuIHRoZXJlCisgKiBhcmUgZml2ZSBjYXNlczoKKyAqCisgKiAgICBrZXkgICAgICBvbGQgdmFsdWUgICBuZXcgdmFsdWUgICBhY3Rpb24KKyAqCisgKiAgICBLRVktMSAgICBWQUxVRS0xICAgICBWQUxVRS0xICAgICBsZWF2ZSBmaWxlIGFsb25lCisgKiAgICBLRVktMiAgICBWQUxVRS0yQSAgICBWQUxVRS0yQiAgICB3cml0ZSBWQUxVRS0yQiBpbnRvIGZpbGUKKyAqICAgIEtFWS0zICAgIC0gICAgICAgICAgIFZBTFVFLTMgICAgIHdyaXRlIFZBTFVFLTMgIGludG8gZmlsZQorICogICAgS0VZLTQgICAgVkFMVUUtNCAgICAgLSAgICAgICAgICAgd3JpdGUgYW4gZW1wdHkgZmlsZQorICogICAgS0VZLTUgICAgKGVtcHR5KSAgICAgLSAgICAgICAgICAgbGVhdmUgb2xkIGVtcHR5IGZpbGUgYWxvbmUKKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgRVJST1JfRVhJVChzdHJFeGl0KQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorCWNvbnN0IGludCBlcnJub1NhdmUgPSBlcnJubzsJCQkJCVwKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBzdHJfbXlfbmFtZSk7CQkJCVwKKwllcnJubyA9IGVycm5vU2F2ZTsJCQkJCQlcCisJcGVycm9yKChzdHJFeGl0KSk7CQkJCQkJXAorCWV4aXQoMSk7CQkJCQkJCVwKKyAgICB9CisKKworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3YgW10pCit7CisgICAgY29uc3QgY2hhciAqIHN0cl9teV9uYW1lOworICAgIGNvbnN0IGNoYXIgKiBzdHJfZmlsZV9hdXRvY29uZjsKKyAgICBjb25zdCBjaGFyICogc3RyX2Rpcl9jb25maWc7CisKKyAgICBGSUxFICogZnBfY29uZmlnOworICAgIEZJTEUgKiBmcF90YXJnZXQ7CisgICAgRklMRSAqIGZwX2ZpbmQ7CisKKyAgICBpbnQgYnVmZmVyX3NpemU7CisKKyAgICBjaGFyICogbGluZTsKKyAgICBjaGFyICogb2xkX2xpbmU7CisgICAgY2hhciAqIGxpc3RfdGFyZ2V0OworICAgIGNoYXIgKiBwdGFyZ2V0OworCisgICAgc3RydWN0IHN0YXQgc3RhdF9idWY7CisKKyAgICAvKiBDaGVjayBhcmcgY291bnQuICovCisgICAgaWYgKGFyZ2MgIT0gMykKKyAgICB7CisJZnByaW50ZihzdGRlcnIsICIlczogd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy5cbiIsIGFyZ3ZbMF0pOworCWV4aXQoMSk7CisgICAgfQorCisgICAgc3RyX215X25hbWUgICAgICAgPSBhcmd2WzBdOworICAgIHN0cl9maWxlX2F1dG9jb25mID0gYXJndlsxXTsKKyAgICBzdHJfZGlyX2NvbmZpZyAgICA9IGFyZ3ZbMl07CisKKyAgICAvKiBGaW5kIGEgYnVmZmVyIHNpemUuICovCisgICAgaWYgKHN0YXQoc3RyX2ZpbGVfYXV0b2NvbmYsICZzdGF0X2J1ZikgIT0gMCkKKwlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKKyAgICBidWZmZXJfc2l6ZSA9IDIgKiBzdGF0X2J1Zi5zdF9zaXplICsgNDA5NjsKKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlcnMuICovCisgICAgaWYgKCAobGluZSAgICAgICAgPSBtYWxsb2MoYnVmZmVyX3NpemUpKSA9PSBOVUxMCisgICAgfHwgICAob2xkX2xpbmUgICAgPSBtYWxsb2MoYnVmZmVyX3NpemUpKSA9PSBOVUxMCisgICAgfHwgICAobGlzdF90YXJnZXQgPSBtYWxsb2MoYnVmZmVyX3NpemUpKSA9PSBOVUxMICkKKwlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKKworICAgIC8qIE9wZW4gYXV0b2NvbmZpZyBmaWxlLiAqLworICAgIGlmICgoZnBfY29uZmlnID0gZm9wZW4oc3RyX2ZpbGVfYXV0b2NvbmYsICJyIikpID09IE5VTEwpCisJRVJST1JfRVhJVChzdHJfZmlsZV9hdXRvY29uZik7CisKKyAgICAvKiBNYWtlIG91dHB1dCBkaXJlY3RvcnkgaWYgbmVlZGVkLiAqLworICAgIGlmIChzdGF0KHN0cl9kaXJfY29uZmlnLCAmc3RhdF9idWYpICE9IDApCisgICAgeworCWlmIChta2RpcihzdHJfZGlyX2NvbmZpZywgMDc1NSkgIT0gMCkKKwkgICAgRVJST1JfRVhJVChzdHJfZGlyX2NvbmZpZyk7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHRvIG91dHB1dCBkaXJlY3RvcnkuICovCisgICAgaWYgKGNoZGlyKHN0cl9kaXJfY29uZmlnKSAhPSAwKQorCUVSUk9SX0VYSVQoc3RyX2Rpcl9jb25maWcpOworCisgICAgLyogUHV0IGluaXRpYWwgc2VwYXJhdG9yIGludG8gdGFyZ2V0IGxpc3QuICovCisgICAgcHRhcmdldCA9IGxpc3RfdGFyZ2V0OworICAgICpwdGFyZ2V0KysgPSAnXG4nOworCisgICAgLyogUmVhZCBjb25maWcgbGluZXMuICovCisgICAgd2hpbGUgKGZnZXRzKGxpbmUsIGJ1ZmZlcl9zaXplLCBmcF9jb25maWcpKQorICAgIHsKKwljb25zdCBjaGFyICogc3RyX2NvbmZpZzsKKwlpbnQgaXNfc2FtZTsKKwlpbnQgaXRhcmdldDsKKworCWlmIChsaW5lWzBdICE9ICcjJykKKwkgICAgY29udGludWU7CisJaWYgKChzdHJfY29uZmlnID0gc3Ryc3RyKGxpbmUsICIgQ09ORklHXyIpKSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKworCS8qIFdlIGZvdW5kICNkZWZpbmUgQ09ORklHX2ZvbyBvciAjdW5kZWYgQ09ORklHX2Zvby4KKwkgKiBNYWtlIHRoZSBvdXRwdXQgZmlsZSBuYW1lLiAqLworCXN0cl9jb25maWcgKz0gc2l6ZW9mKCIgQ09ORklHXyIpIC0gMTsKKwlmb3IgKGl0YXJnZXQgPSAwOyAhaXNzcGFjZShzdHJfY29uZmlnW2l0YXJnZXRdKTsgaXRhcmdldCsrKQorCXsKKwkgICAgaW50IGMgPSAodW5zaWduZWQgY2hhcikgc3RyX2NvbmZpZ1tpdGFyZ2V0XTsKKwkgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworCSAgICBpZiAoYyA9PSAnXycpICAgYyA9ICcvJzsKKwkgICAgcHRhcmdldFtpdGFyZ2V0XSA9IGM7CisJfQorCXB0YXJnZXRbaXRhcmdldCsrXSA9ICcuJzsKKwlwdGFyZ2V0W2l0YXJnZXQrK10gPSAnaCc7CisJcHRhcmdldFtpdGFyZ2V0KytdID0gJ1wwJzsKKworCS8qIENoZWNrIGZvciBleGlzdGluZyBmaWxlLiAqLworCWlzX3NhbWUgPSAwOworCWlmICgoZnBfdGFyZ2V0ID0gZm9wZW4ocHRhcmdldCwgInIiKSkgIT0gTlVMTCkKKwl7CisJICAgIGZnZXRzKG9sZF9saW5lLCBidWZmZXJfc2l6ZSwgZnBfdGFyZ2V0KTsKKwkgICAgaWYgKGZjbG9zZShmcF90YXJnZXQpICE9IDApCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJICAgIGlmICghc3RyY21wKGxpbmUsIG9sZF9saW5lKSkKKwkJaXNfc2FtZSA9IDE7CisJfQorCisJaWYgKCFpc19zYW1lKQorCXsKKwkgICAgLyogQXV0by1jcmVhdGUgZGlyZWN0b3JpZXMuICovCisJICAgIGludCBpc2xhc2g7CisJICAgIGZvciAoaXNsYXNoID0gMDsgaXNsYXNoIDwgaXRhcmdldDsgaXNsYXNoKyspCisJICAgIHsKKwkJaWYgKHB0YXJnZXRbaXNsYXNoXSA9PSAnLycpCisJCXsKKwkJICAgIHB0YXJnZXRbaXNsYXNoXSA9ICdcMCc7CisJCSAgICBpZiAoc3RhdChwdGFyZ2V0LCAmc3RhdF9idWYpICE9IDAKKwkJICAgICYmICBta2RpcihwdGFyZ2V0LCAwNzU1KSAgICAgIT0gMCkKKwkJCUVSUk9SX0VYSVQoIHB0YXJnZXQgKTsKKwkJICAgIHB0YXJnZXRbaXNsYXNoXSA9ICcvJzsKKwkJfQorCSAgICB9CisKKwkgICAgLyogV3JpdGUgdGhlIGZpbGUuICovCisJICAgIGlmICgoZnBfdGFyZ2V0ID0gZm9wZW4ocHRhcmdldCwgICJ3IikpID09IE5VTEwpCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJICAgIGZwdXRzKGxpbmUsIGZwX3RhcmdldCk7CisJICAgIGlmIChmZXJyb3IoZnBfdGFyZ2V0KSB8fCBmY2xvc2UoZnBfdGFyZ2V0KSAhPSAwKQorCQlFUlJPUl9FWElUKHB0YXJnZXQpOworCX0KKworCS8qIFVwZGF0ZSB0YXJnZXQgbGlzdCAqLworCXB0YXJnZXQgKz0gaXRhcmdldDsKKwkqKHB0YXJnZXQtMSkgPSAnXG4nOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xvc2UgYXV0b2NvbmZpZyBmaWxlLgorICAgICAqIFRlcm1pbmF0ZSB0aGUgdGFyZ2V0IGxpc3QuCisgICAgICovCisgICAgaWYgKGZjbG9zZShmcF9jb25maWcpICE9IDApCisJRVJST1JfRVhJVChzdHJfZmlsZV9hdXRvY29uZik7CisgICAgKnB0YXJnZXQgPSAnXDAnOworCisgICAgLyoKKyAgICAgKiBGaXggdXAgZXhpc3RpbmcgZmlsZXMgd2hpY2ggaGF2ZSBubyBuZXcgdmFsdWUuCisgICAgICogVGhpcyBpcyBDYXNlIDQgYW5kIENhc2UgNS4KKyAgICAgKgorICAgICAqIEkgcmUtcmVhZCB0aGUgdHJlZSBhbmQgZmlsdGVyIGl0IGFnYWluc3QgbGlzdF90YXJnZXQuCisgICAgICogVGhpcyBpcyBjcnVkZS4gIEJ1dCBpdCBhdm9pZHMgZGF0YSBjb3BpZXMuICBBbHNvLCBsaXN0X3RhcmdldAorICAgICAqIGlzIGNvbXBhY3QgYW5kIGNvbnRpZ3VvdXMsIHNvIGl0IGVhc2lseSBmaXRzIGludG8gY2FjaGUuCisgICAgICoKKyAgICAgKiBOb3RpY2UgdGhhdCBsaXN0X3RhcmdldCBjb250YWlucyBzdHJpbmdzIHNlcGFyYXRlZCBieSBcbiwKKyAgICAgKiB3aXRoIGEgXG4gYmVmb3JlIHRoZSBmaXJzdCBzdHJpbmcgYW5kIGFmdGVyIHRoZSBsYXN0LgorICAgICAqIGZnZXRzIGdpdmVzIHRoZSBpbmNvbWluZyBuYW1lcyBhIHRlcm1pbmF0aW5nIFxuLgorICAgICAqIFNvIGJ5IGhhdmluZyBhbiBpbml0aWFsIFxuLCBzdHJzdHIgd2lsbCBmaW5kIGV4YWN0IG1hdGNoZXMuCisgICAgICovCisKKyAgICBmcF9maW5kID0gcG9wZW4oImZpbmQgKiAtdHlwZSBmIC1uYW1lIFwiKi5oXCIgLXByaW50IiwgInIiKTsKKyAgICBpZiAoZnBfZmluZCA9PSAwKQorCUVSUk9SX0VYSVQoICJmaW5kIiApOworCisgICAgbGluZVswXSA9ICdcbic7CisgICAgd2hpbGUgKGZnZXRzKGxpbmUrMSwgYnVmZmVyX3NpemUsIGZwX2ZpbmQpKQorICAgIHsKKwlpZiAoc3Ryc3RyKGxpc3RfdGFyZ2V0LCBsaW5lKSA9PSBOVUxMKQorCXsKKwkgICAgLyoKKwkgICAgICogVGhpcyBpcyBhbiBvbGQgZmlsZSB3aXRoIG5vIENPTkZJR18qIGZsYWcgaW4gYXV0b2NvbmYuaC4KKwkgICAgICovCisKKwkgICAgLyogRmlyc3Qgc3RyaXAgdGhlIFxuLiAqLworCSAgICBsaW5lW3N0cmxlbihsaW5lKS0xXSA9ICdcMCc7CisKKwkgICAgLyogR3JhYiBzaXplLiAqLworCSAgICBpZiAoc3RhdChsaW5lKzEsICZzdGF0X2J1ZikgIT0gMCkKKwkJRVJST1JfRVhJVChsaW5lKTsKKworCSAgICAvKiBJZiBmaWxlIGlzIG5vdCBlbXB0eSwgbWFrZSBpdCBlbXB0eSBhbmQgZ2l2ZSBpdCBhIGZyZXNoIGRhdGUuICovCisJICAgIGlmIChzdGF0X2J1Zi5zdF9zaXplICE9IDApCisJICAgIHsKKwkJaWYgKChmcF90YXJnZXQgPSBmb3BlbihsaW5lKzEsICJ3IikpID09IE5VTEwpCisJCSAgICBFUlJPUl9FWElUKGxpbmUpOworCQlpZiAoZmNsb3NlKGZwX3RhcmdldCkgIT0gMCkKKwkJICAgIEVSUk9SX0VYSVQobGluZSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKHBjbG9zZShmcF9maW5kKSAhPSAwKQorCUVSUk9SX0VYSVQoImZpbmQiKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9iYl9yZWxlYXNlIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9iYl9yZWxlYXNlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhhYTM4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2JiX3JlbGVhc2UKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisKKyMgQ3JlYXRlIHNpZ25lZCByZWxlYXNlIHRhcmJhbGxzIGFuZCBzaWduYXR1cmUgZmlsZXMgZnJvbSBjdXJyZW50IHN2bi4KKyMgU2luY2UgeW91IGRvbid0IGhhdmUgbXkgZ3BnIGtleSwgdGhpcyBkb2Vzbid0IGRvIHlvdSBtdWNoIGdvb2QsCisjIGJ1dCBpZiBJIGdldCBoaXQgYnkgYSBidXMgdGhlIG5leHQgbWFpbnRhaW5lciBtaWdodCBmaW5kIHRoaXMgdXNlZnVsLgorIyBSdW4gdGhpcyBpbiBhbiBlbXB0eSBkaXJlY3RvcnkuICBUaGUgVkVSU0lPTj0gbGluZSBjYW4gZ2V0IGNvbmZ1c2VkCisjIG90aGVyd2lzZS4KKworI3N2biBjbyBzdm46Ly9idXN5Ym94Lm5ldC90cnVuay9idXN5Ym94CitjZCBidXN5Ym94IHx8IHsgZWNobyAiY2QgYnVzeWJveCBmYWlsZWQiOyBleGl0IDE7IH0KK21ha2UgcmVsZWFzZSB8fCB7IGVjaG8gIm1ha2UgcmVsZWFzZSBmYWlsZWQiOyBleGl0IDE7IH0KK2NkIC4uCisKK1ZFUlNJT049YGxzIGJ1c3lib3gtKi50YXIuZ3ogfCBzZWQgJ3MvYnVzeWJveC1cKC4qXClcLnRhclwuZ3ovXDEvJ2AKKworemNhdCBidXN5Ym94LSRWRVJTSU9OLnRhci5neiB8IGJ6aXAyID4gYnVzeWJveC0kVkVSU0lPTi50YXIuYnoyCisKK3Rlc3QgLWYgYnVzeWJveC0kVkVSU0lPTi50YXIuZ3ogfHwgeyBlY2hvICJubyBidXN5Ym94LSRWRVJTSU9OLnRhci5neiI7IGV4aXQgMTsgfQordGVzdCAtZiBidXN5Ym94LSRWRVJTSU9OLnRhci5iejIgfHwgeyBlY2hvICJubyBidXN5Ym94LSRWRVJTSU9OLnRhci5iejIiOyBleGl0IDE7IH0KKworc2lnbml0KCkKK3sKK2VjaG8gIiQxIHJlbGVhc2VkIGBkYXRlIC1yICQxIC1SYAorCitNRDU6ICBgbWQ1c3VtICQxYAorU0hBMTogYHNoYTFzdW0gJDFgCisKK1RvIHZlcmlmeSB0aGlzIHNpZ25hdHVyZSwgeW91IGNhbiBvYnRhaW4gbXkgcHVibGljIGtleQorZnJvbSBodHRwOi8vYnVzeWJveC5uZXQvfnZkYS92ZGFfcHVia2V5LmdwZworIiB8IGdwZyAtLWNsZWFyc2lnbiA+ICIkMS5zaWduIgorfQorCitzaWduaXQgYnVzeWJveC0kVkVSU0lPTi50YXIuZ3oKK3NpZ25pdCBidXN5Ym94LSRWRVJTSU9OLnRhci5iejIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvYmxvYXQtby1tZXRlciBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvYmxvYXQtby1tZXRlcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZDNmZjdmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9ibG9hdC1vLW1ldGVyCkBAIC0wLDAgKzEsMTM5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDQgTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+CisjCisjIEluc3BpcmVkIGJ5IHBlcmwgQmxvYXQtTy1NZXRlciAoYykgMTk5NyBieSBBbmRpIEtsZWVuCisjCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworaW1wb3J0IHN5cywgb3MjLCByZQorCitkZWYgdXNhZ2UoKToKKyAgICBzeXMuc3RkZXJyLndyaXRlKCJ1c2FnZTogJXMgWy10XSBmaWxlMSBmaWxlMlxuIiAlIHN5cy5hcmd2WzBdKQorICAgIHN5cy5leGl0KC0xKQorCitmMSwgZjIgPSAoTm9uZSwgTm9uZSkKK2ZsYWdfdGltaW5nLCBkYXNoZXMgPSAoRmFsc2UsIEZhbHNlKQorCitmb3IgZiBpbiBzeXMuYXJndlsxOl06CisgICAgaWYgZi5zdGFydHN3aXRoKCItIik6CisgICAgICAgIGlmIGYgPT0gIi0tIjogIyBzeW1fYXJncworICAgICAgICAgICAgZGFzaGVzID0gVHJ1ZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZiA9PSAiLXQiOiAjIHRpbWluZ3MKKyAgICAgICAgICAgIGZsYWdfdGltaW5nID0gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmKToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkVycm9yOiBmaWxlICclcycgZG9lcyBub3QgZXhpc3RcbiIgJSBmKQorICAgICAgICAgICAgdXNhZ2UoKQorICAgICAgICBpZiBmMSBpcyBOb25lOgorICAgICAgICAgICAgZjEgPSBmCisgICAgICAgIGVsaWYgZjIgaXMgTm9uZToKKyAgICAgICAgICAgIGYyID0gZgoraWYgZmxhZ190aW1pbmc6CisgICAgaW1wb3J0IHRpbWUKK2lmIGYxIGlzIE5vbmUgb3IgZjIgaXMgTm9uZToKKyAgICB1c2FnZSgpCisKK3N5bV9hcmdzID0gIiAiLmpvaW4oc3lzLmFyZ3ZbMyArIGZsYWdfdGltaW5nICsgZGFzaGVzOl0pCitkZWYgZ2V0c2l6ZXMoZmlsZSk6CisgICAgc3ltLCBhbGlhcywgbHV0ID0ge30sIHt9LCB7fQorICAgICNkeW5zeW1fZmlsdGVyID0gcmUuY29tcGlsZSgiXlxkKzpccytbXGRBLUZhLWZdK1xzK1xkK1xzK1x3K1xzK1x3K1xzK1x3K1xzK1x3K1xzK1x3KyQiKQorICAgIGZvciBsIGluIG9zLnBvcGVuKCJyZWFkZWxmIC1XIC1zICVzICVzIiAlIChzeW1fYXJncywgZmlsZSkpLnJlYWRsaW5lcygpOgorICAgICAgICBpZiBUcnVlOgorICAgICAgICAgICAgbCA9IGwuc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IChsZW4obCkgYW5kIGxbMF0uaXNkaWdpdCgpIGFuZCBsZW4obC5zcGxpdCgpKSA9PSA4KToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbnVtLCB2YWx1ZSwgc2l6ZSwgdHlwLCBiaW5kLCB2aXMsIG5keCwgbmFtZSA9IGwuc3BsaXQoKQorICAgICAgICAgICAgaWYgbmR4ID09ICJVTkQiOiBjb250aW51ZSAjIHNraXAgdW5kZWZpbmVkCisgICAgICAgICAgICBpZiB0eXAgaW4gWyJTRUNUSU9OIiwgIkZJTEVTIl06IGNvbnRpbnVlICMgc2tpcCBzZWN0aW9ucyBhbmQgZmlsZXMKKyAgICAgICAgI2Vsc2U6CisgICAgICAgICMgICAgbCA9IGwuc3RyaXAoKQorICAgICAgICAjICAgIG1hdGNoID0gZHluc3ltX2ZpbHRlci5tYXRjaChsKQorICAgICAgICAjICAgIGlmIG5vdCBtYXRjaDogY29udGludWUKKyAgICAgICAgIyAgICB4LCB2YWx1ZSwgc2l6ZSwgdHlwLCBiaW5kLCB4LCBuZHgsIG5hbWUgPSBsLnNwbGl0KCkKKyAgICAgICAgIyAgICBpZiBuZHggPT0gIlVORCI6IGNvbnRpbnVlICMgc2tpcCB1bmRlZmluZWQKKyAgICAgICAgIyAgICBpZiB0eXAgaW4gWyJTRUNUSU9OIiwgIkZJTEVTIl06IGNvbnRpbnVlICMgc2tpcCBzZWN0aW9ucyBhbmQgZmlsZXMKKyAgICAgICAgaWYgIi4iIGluIG5hbWU6IG5hbWUgPSAic3RhdGljLiIgKyBuYW1lLnNwbGl0KCIuIilbMF0KKyAgICAgICAgdmFsdWUgPSBpbnQodmFsdWUsIDE2KQorICAgICAgICBzaXplID0gaW50KHNpemUpCisgICAgICAgIGlmIHZpcyAhPSAiREVGQVVMVCIgYW5kIGJpbmQgIT0gIkdMT0JBTCI6ICMgc2VlIGlmIGl0IGlzIGFuIGFsaWFzCisgICAgICAgICAgICBhbGlhc1sodmFsdWUsIHNpemUpXSA9IHsibmFtZSIgOiBuYW1lfQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3ltW25hbWVdID0geyJhZGRyIiA6IHZhbHVlLCAic2l6ZSI6ICBzaXplfQorICAgICAgICAgICAgbHV0Wyh2YWx1ZSwgc2l6ZSldID0gMAorICAgIGZvciBhZGRyLCBzeiBpbiBpdGVyKGFsaWFzLmtleXMoKSk6CisgICAgICAgICMgSWYgdGhlIG5vbi1HTE9CQUwgc3ltIGhhcyBhbiBpbXBsZW1lbnRhdGlvbiBlbHNld2hlcmUgdGhlbgorICAgICAgICAjIGl0J3MgYW4gYWxpYXMsIGRpc3JlZ2FyZCBpdC4KKyAgICAgICAgaWYgbm90IChhZGRyLCBzeikgaW4gbHV0OgorICAgICAgICAgICAgIyBJZiB0aGlzIG5vbi1HTE9CQUwgc3ltIGRvZXMgbm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gYXQKKyAgICAgICAgICAgICMgYW5vdGhlciBhZGRyZXNzLCB0aGVuIHRyZWF0IGl0IGFzIGEgbm9ybWFsIHN5bWJvbC4KKyAgICAgICAgICAgIHN5bVthbGlhc1soYWRkciwgc3opXVsibmFtZSJdXSA9IHsiYWRkciIgOiBhZGRyLCAic2l6ZSI6IHN6fQorICAgIGZvciBsIGluIG9zLnBvcGVuKCJyZWFkZWxmIC1XIC1TICIgKyBmaWxlKS5yZWFkbGluZXMoKToKKyAgICAgICAgeCA9IGwuc3BsaXQoKQorICAgICAgICBpZiBsZW4oeCk8NjogY29udGludWUKKyAgICAgICAgIyBTaG91bGQgdGFrZSB0aGVzZSBpbnRvIGFjY291bnQgdG9vIQorICAgICAgICAjaWYgeFsxXSBub3QgaW4gWyIudGV4dCIsICIucm9kYXRhIiwgIi5zeW10YWIiLCAiLnN0cnRhYiJdOiBjb250aW51ZQorICAgICAgICBpZiB4WzFdIG5vdCBpbiBbIi5yb2RhdGEiXTogY29udGludWUKKyAgICAgICAgc3ltW3hbMV1dID0geyJhZGRyIiA6IGludCh4WzNdLCAxNiksICJzaXplIiA6IGludCh4WzVdLCAxNil9CisgICAgcmV0dXJuIHN5bQorCitpZiBmbGFnX3RpbWluZzoKKyAgICBzdGFydF90MSA9IGludCh0aW1lLnRpbWUoKSAqIDFlOSkKK29sZCA9IGdldHNpemVzKGYxKQoraWYgZmxhZ190aW1pbmc6CisgICAgZW5kX3QxID0gaW50KHRpbWUudGltZSgpICogMWU5KQorICAgIHN0YXJ0X3QyID0gaW50KHRpbWUudGltZSgpICogMWU5KQorbmV3ID0gZ2V0c2l6ZXMoZjIpCitpZiBmbGFnX3RpbWluZzoKKyAgICBlbmRfdDIgPSBpbnQodGltZS50aW1lKCkgKiAxZTkpCisgICAgc3RhcnRfdDMgPSBpbnQodGltZS50aW1lKCkgKiAxZTkpCitncm93LCBzaHJpbmssIGFkZCwgcmVtb3ZlLCB1cCwgZG93biA9IDAsIDAsIDAsIDAsIDAsIDAKK2RlbHRhLCBjb21tb24gPSBbXSwge30KKworZm9yIG5hbWUgaW4gaXRlcihvbGQua2V5cygpKToKKyAgICBpZiBuYW1lIGluIG5ldzoKKyAgICAgICAgY29tbW9uW25hbWVdID0gMQorCitmb3IgbmFtZSBpbiBvbGQ6CisgICAgaWYgbmFtZSBub3QgaW4gY29tbW9uOgorICAgICAgICByZW1vdmUgKz0gMQorICAgICAgICBzeiA9IG9sZFtuYW1lXVsic2l6ZSJdCisgICAgICAgIGRvd24gKz0gc3oKKyAgICAgICAgZGVsdGEuYXBwZW5kKCgtc3osIG5hbWUpKQorCitmb3IgbmFtZSBpbiBuZXc6CisgICAgaWYgbmFtZSBub3QgaW4gY29tbW9uOgorICAgICAgICBhZGQgKz0gMQorICAgICAgICBzeiA9IG5ld1tuYW1lXVsic2l6ZSJdCisgICAgICAgIHVwICs9IHN6CisgICAgICAgIGRlbHRhLmFwcGVuZCgoc3osIG5hbWUpKQorCitmb3IgbmFtZSBpbiBjb21tb246CisgICAgICAgIGQgPSBuZXdbbmFtZV0uZ2V0KCJzaXplIiwgMCkgLSBvbGRbbmFtZV0uZ2V0KCJzaXplIiwgMCkKKyAgICAgICAgaWYgZD4wOiBncm93LCB1cCA9IGdyb3crMSwgdXArZAorICAgICAgICBlbGlmIGQ8MDogc2hyaW5rLCBkb3duID0gc2hyaW5rKzEsIGRvd24tZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZGVsdGEuYXBwZW5kKChkLCBuYW1lKSkKKworZGVsdGEuc29ydCgpCitkZWx0YS5yZXZlcnNlKCkKK2lmIGZsYWdfdGltaW5nOgorICAgIGVuZF90MyA9IGludCh0aW1lLnRpbWUoKSAqIDFlOSkKKworcHJpbnQoIiUtNDhzICU3cyAlN3MgJSs3cyIgJSAoImZ1bmN0aW9uIiwgIm9sZCIsICJuZXciLCAiZGVsdGEiKSkKK2ZvciBkLCBuIGluIGRlbHRhOgorICAgIGlmIGQ6CisgICAgICAgIG9sZF9zeiA9IG9sZC5nZXQobiwge30pLmdldCgic2l6ZSIsICItIikKKyAgICAgICAgbmV3X3N6ID0gbmV3LmdldChuLCB7fSkuZ2V0KCJzaXplIiwgIi0iKQorICAgICAgICBwcmludCgiJS00OHMgJTdzICU3cyAlKzdkIiAlIChuLCBvbGRfc3osIG5ld19zeiwgZCkpCitwcmludCgiLSIqNzgpCit0b3RhbD0iKGFkZC9yZW1vdmU6ICVzLyVzIGdyb3cvc2hyaW5rOiAlcy8lcyB1cC9kb3duOiAlcy8lcyklJXNUb3RhbDogJXMgYnl0ZXMiXAorICAgICUgKGFkZCwgcmVtb3ZlLCBncm93LCBzaHJpbmssIHVwLCAtZG93biwgdXAtZG93bikKK3ByaW50KHRvdGFsICUgKCIgIiooODAtbGVuKHRvdGFsKSkpKQoraWYgZmxhZ190aW1pbmc6CisgICAgcHJpbnQoIlxuJWQvJWQ7ICVkIFBhcnNlIG9yaWdpbi9uZXc7IHByb2Nlc3NpbmcgbnNlY3MiICUKKyAgICAgICAgKGVuZF90MS1zdGFydF90MSwgZW5kX3QyLXN0YXJ0X3QyLCBlbmRfdDMtc3RhcnRfdDMpKQorICAgIHByaW50KCJ0b3RhbCBuc2VjczogJWQiICUgKGVuZF90My1zdGFydF90MSkpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2NoZWNraGVscC5hd2sgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2NoZWNraGVscC5hd2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQ4NDNkNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvY2hlY2toZWxwLmF3awpAQCAtMCwwICsxLDQwIEBACisjIS91c3IvYmluL2F3ayAtZgorIyBBV0sgc2NyaXB0IHRvIGNoZWNrIGZvciBtaXNzaW5nIGhlbHAgZW50cmllcyBmb3IgY29uZmlnIG9wdGlvbnMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorIyBNSVQvWCBwdWJsaWMgbGljZW5zZXMuIFNlZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UuaHRtbAorIyBhbmQgbm90aWNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlLWxpc3QuaHRtbCNYMTFMaWNlbnNlCisKKworL15jaG9pY2UvIHsgaXNfY2hvaWNlID0gMTsgfQorL15lbmRjaG9pY2UvIHsgaXNfY2hvaWNlID0gMDsgfQorL15jb25maWcvIHsKKwlwb3MrKzsKKwljb25mW3Bvc10gPSAkMjsKKwlmaWxlW3Bvc10gPSBGSUxFTkFNRTsKKwlpZiAoaXNfY2hvaWNlKSB7CisJCWhlbHBbcG9zXSA9IDE7ICMgZG8gbm90IHdhcm4gYWJvdXQgJ2Nob2ljZScgY29uZmlnIGVudHJpZXMuCisJfSBlbHNlIHsKKwkJaGVscFtwb3NdID0gMDsKKwl9Cit9CisvXlsgXHRdKmhlbHBbIFx0XSokLyB7CisJaGVscFtwb3NdID0gMTsKK30KKy9eWyBcdF0qYm9vbFsgXHRdKiQvIHsKKwloZWxwW3Bvc10gPSAxOyAjIGlnbm9yZSBvcHRpb25zIHdoaWNoIGFyZSBub3Qgc2VsZWN0YWJsZQorfQorQkVHSU4geworCXBvcyA9IC0xOworCWlzX2Nob2ljZSA9IDA7Cit9CitFTkQgeworCWZvciAoaSA9IDA7IGkgPD0gcG9zOyBpKyspIHsKKyMJcHJpbnRmKCIlczogaGVscCBmb3IgIyVpICclcycgPT0gJWlcbiIsIGZpbGVbaV0sIGksIGNvbmZbaV0sIGhlbHBbaV0pOworCQlpZiAoaGVscFtpXSA9PSAwKSB7CisJCQlwcmludGYoIiVzOiBObyBoZWxwdGV4dCBmb3IgJyVzJ1xuIiwgZmlsZVtpXSwgY29uZltpXSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2NoZWNrc3RhY2sucGwgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2NoZWNrc3RhY2sucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTVjZGQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvY2hlY2tzdGFjay5wbApAQCAtMCwwICsxLDE0MSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMgU3RvbGVuIGZyb20gTGludXgga2VybmVsIDopCisKKyMJQ2hlY2sgdGhlIHN0YWNrIHVzYWdlIG9mIGZ1bmN0aW9ucworIworIwlDb3B5cmlnaHQgSm9lcm4gRW5nZWwgPGpvZXJuQHdoLmZoLXdlZGVsLmRlPgorIwlJbnNwaXJlZCBieSBMaW51cyBUb3J2YWxkcworIwlPcmlnaW5hbCBpZGVhIG1heWJlIGZyb20gS2VpdGggT3dlbnMKKyMJczM5MCBwb3J0IGFuZCBiaWcgc3BlZWR1cCBieSBBcm5kIEJlcmdtYW5uIDxhcm5kQGJlcmdtYW5uLWRhbGxkb3JmLmRlPgorIwlNaXBzIHBvcnQgYnkgSnVhbiBRdWludGVsYSA8cXVpbnRlbGFAbWFuZHJha2Vzb2Z0LmNvbT4KKyMJSUE2NCBwb3J0IHZpYSBBbmRyZWFzIERpbGdlcgorIwlBcm0gcG9ydCBieSBIb2xnZXIgU2NodXJpZworIwlzaDY0IHBvcnQgYnkgUGF1bCBNdW5kdAorIwlSYW5kb20gYml0cyBieSBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4KKyMJTTY4ayBwb3J0IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiBhbmQgQW5kcmVhcyBTY2h3YWIKKyMKKyMJVXNhZ2U6CisjCW9iamR1bXAgLWQgdm1saW51eCB8IGNoZWNrc3RhY2sucGwgW2FyY2hdCisjCisjCVRPRE8gOglQb3J0IHRvIGFsbCBhcmNoaXRlY3R1cmVzIChvbmUgcmVnZXggcGVyIGFyY2gpCisKKyMgY2hlY2sgZm9yIGFyY2gKKyMKKyMgJHJlIGlzIHVzZWQgZm9yIHR3byBtYXRjaGVzOgorIyAkJiAod2hvbGUgcmUpIG1hdGNoZXMgdGhlIGNvbXBsZXRlIG9iamR1bXAgbGluZSB3aXRoIHRoZSBzdGFjayBncm93dGgKKyMgJDEgKGZpcnN0IGJyYWNrZXQpIG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrIGdyb3d0aAorIworIyB1c2UgYW55dGhpbmcgZWxzZSBhbmQgZmVlbCB0aGUgcGFpbiA7KQorbXkgKEBzdGFjaywgJHJlLCAkeCwgJHhzKTsKK3sKKwlteSAkYXJjaCA9IHNoaWZ0OworCWlmICgkYXJjaCBlcSAiIikgeworCQkkYXJjaCA9IGB1bmFtZSAtbWA7CisJfQorCisJJHgJPSAiWzAtOWEtZl0iOwkjIGhleCBjaGFyYWN0ZXIKKwkkeHMJPSAiWzAtOWEtZiBdIjsJIyBoZXggY2hhcmFjdGVyIG9yIHNwYWNlCisJaWYgKCRhcmNoIGVxICdhcm0nKSB7CisJCSNjMDAwOGZmYzoJZTI0ZGQwNjQJc3ViCXNwLCBzcCwgIzEwMAk7IDB4NjQKKwkJJHJlID0gcXIvLipzdWIuKnNwLCBzcCwgIygoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ2JsYWNrZmluJykgeworCQkjICAgICAgNTI6ICAgICAgIDAwIGU4IDAzIDAwICAgICBMSU5LIDB4YzsKKwkJJHJlID0gcXIvLipMSU5LICgweCR4ezEsNX0pOyQvbzsKKwl9IGVsc2lmICgkYXJjaCA9fiAvXmlbMzQ1Nl04NiQvKSB7CisJCSNjMDEwNTIzNDogICAgICAgODEgZWMgYWMgMDUgMDAgMDAgICAgICAgc3ViICAgICQweDVhYywlZXNwCisJCSRyZSA9IHFyL14uKlthc11bZHVdW2RiXSAgICBcJCgweCR4ezEsOH0pLFwlZXNwJC9vOworCX0gZWxzaWYgKCRhcmNoIGVxICd4ODZfNjQnKSB7CisJCSMgICAgMmY2MDoJNDggODEgZWMgZTggMDUgMDAgMDAgCXN1YiAgICAkMHg1ZTgsJXJzcAorCQkkcmUgPSBxci9eLipbYXNdW2R1XVtkYl0gICAgXCQoMHgkeHsxLDh9KSxcJXJzcCQvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnaWE2NCcpIHsKKwkJI2UwMDAwMDAwMDQ0MDExZmM6ICAgICAgIDAxIDBmIGZjIDhjICAgICBhZGRzIHIxMj0tMzg0LHIxMgorCQkkcmUgPSBxci8uKmFkZHMuKnIxMj0tKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkscjEyL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ202OGsnKSB7CisJCSMgICAgMmI2YzogICAgICAgNGU1NiBmYjcwICAgICAgIGxpbmt3ICVmcCwjLTExNjgKKwkJIyAgMWRmNzcwOiAgICAgICBkZWZjIGZmZTQgICAgICAgYWRkYXcgIy0yOCwlc3AKKwkJJHJlID0gcXIvLiooPzpsaW5rdyAlZnAsfGFkZGF3ICkjLShbMC05XXsxLDR9KSg/Oiwlc3ApPyQvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnbWlwczY0JykgeworCQkjODgwMDQwMmM6ICAgICAgIDY3YmRmZmYwICAgICAgICBkYWRkaXUgIHNwLHNwLC0xNgorCQkkcmUgPSBxci8uKmRhZGRpdS4qc3Asc3AsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ21pcHMnKSB7CisJCSM4ODAwMzI1NDogICAgICAgMjdiZGZmZTAgICAgICAgIGFkZGl1ICAgc3Asc3AsLTMyCisJCSRyZSA9IHFyLy4qYWRkaXUuKnNwLHNwLC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KS9vOworCX0gZWxzaWYgKCRhcmNoIGVxICdwcGMnKSB7CisJCSNjMDAwMjlmNDogICAgICAgOTQgMjEgZmYgMzAgICAgIHN0d3UgICAgcjEsLTIwOChyMSkKKwkJJHJlID0gcXIvLipzdHd1LipyMSwtKCR4ezEsOH0pXChyMVwpL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ3BwYzY0JykgeworCQkjWFhYCisJCSRyZSA9IHFyLy4qc3RkdS4qcjEsLSgkeHsxLDh9KVwocjFcKS9vOworCX0gZWxzaWYgKCRhcmNoIGVxICdwb3dlcnBjJykgeworCQkkcmUgPSBxci8uKnN0W2R3XXUuKnIxLC0oJHh7MSw4fSlcKHIxXCkvbzsKKwl9IGVsc2lmICgkYXJjaCA9fiAvXnMzOTB4PyQvKSB7CisJCSMgICAxMTE2MDogICAgICAgYTcgZmIgZmYgNjAgICAgICAgICAgICAgYWdoaSAgICVyMTUsLTE2MAorCQkkcmUgPSBxci8uKmFnP2hpLipcJXIxNSwtKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkvbzsKKwl9IGVsc2lmICgkYXJjaCA9fiAvXnNoNjQkLykgeworCQkjWFhYOiB3ZSBvbmx5IGNoZWNrIGZvciB0aGUgaW1tZWRpYXRlIGNhc2UgcHJlc2VudGx5LAorCQkjICAgICB0aG91Z2ggd2Ugd2lsbCB3YW50IHRvIGNoZWNrIGZvciB0aGUgbW92aS9zdWIKKwkJIyAgICAgcGFpciBmb3IgbGFyZ2VyIHVzZXJzLiAtLSBQRk0uCisJCSNhMDAwNDhlMDogICAgICAgZDRmYzQwZjAgICAgICAgIGFkZGkubCAgcjE1LC0yNDAscjE1CisJCSRyZSA9IHFyLy4qYWRkaVwubC4qcjE1LC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KSxyMTUvbzsKKwl9IGVsc2UgeworCQlwcmludCgid3Jvbmcgb3IgdW5rbm93biBhcmNoaXRlY3R1cmVcbiIpOworCQlleGl0CisJfQorfQorCitzdWIgYnlzaXplKCQpIHsKKwlteSAoJGFzaXplLCAkYnNpemUpOworCSgkYXNpemUgPSAkYSkgPX4gcy8uKjoJKiguKikkLyQxLzsKKwkoJGJzaXplID0gJGIpID1+IHMvLio6CSooLiopJC8kMS87CisJJGJzaXplIDw9PiAkYXNpemUKK30KKworIworIyBtYWluKCkKKyMKK215ICRmdW5jcmUgPSBxci9eJHgqIDwoLiopPjokLzsKK215ICRmdW5jOworbXkgJGZpbGUsICRsYXN0c2xhc2g7CisKK3doaWxlIChteSAkbGluZSA9IDxTVERJTj4pIHsKKwlpZiAoJGxpbmUgPX4gbS8kZnVuY3JlLykgeworCQkkZnVuYyA9ICQxOworCX0KKwllbHNpZiAoJGxpbmUgPX4gbS8oLiopOlxzKmZpbGUgZm9ybWF0LykgeworCQkkZmlsZSA9ICQxOworCQkkZmlsZSA9fiBzL1wua28vLzsKKwkJJGxhc3RzbGFzaCA9IHJpbmRleCgkZmlsZSwgIi8iKTsKKwkJaWYgKCRsYXN0c2xhc2ggIT0gLTEpIHsKKwkJCSRmaWxlID0gc3Vic3RyKCRmaWxlLCAkbGFzdHNsYXNoICsgMSk7CisJCX0KKwl9CisJZWxzaWYgKCRsaW5lID1+IG0vJHJlLykgeworCQlteSAkc2l6ZSA9ICQxOworCQkkc2l6ZSA9IGhleCgkc2l6ZSkgaWYgKCRzaXplID1+IC9eMHgvKTsKKworCQlpZiAoJHNpemUgPiAweGYwMDAwMDAwKSB7CisJCQkkc2l6ZSA9IC0gJHNpemU7CisJCQkkc2l6ZSArPSAweDgwMDAwMDAwOworCQkJJHNpemUgKz0gMHg4MDAwMDAwMDsKKwkJfQorCQluZXh0IGlmICgkc2l6ZSA+IDB4MTAwMDAwMDApOworCisJCW5leHQgaWYgJGxpbmUgIX4gbS9eKCR4cyopLzsKKwkJbXkgJGFkZHIgPSAkMTsKKwkJJGFkZHIgPX4gcy8gLzAvZzsKKwkJJGFkZHIgPSAiMHgkYWRkciI7CisKKwkJIyBiYm94OiB3YXM6IG15ICRpbnRybyA9ICIkYWRkciAkZnVuYyBbJGZpbGVdOiI7CisJCW15ICRpbnRybyA9ICIkZnVuYyBbJGZpbGVdOiI7CisJCW15ICRwYWRsZW4gPSA1NiAtIGxlbmd0aCgkaW50cm8pOworCQl3aGlsZSAoJHBhZGxlbiA+IDApIHsKKwkJCSRpbnRybyAuPSAnCSc7CisJCQkkcGFkbGVuIC09IDg7CisJCX0KKwkJbmV4dCBpZiAoJHNpemUgPCAxMDApOworCQlwdXNoIEBzdGFjaywgIiRpbnRybyRzaXplXG4iOworCX0KK30KKworcHJpbnQgc29ydCBieXNpemUgQHN0YWNrOwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9jbGVhbnVwX3ByaW50ZjJwdXRzIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9jbGVhbnVwX3ByaW50ZjJwdXRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwMTkzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2NsZWFudXBfcHJpbnRmMnB1dHMKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKKworIyBQcm9jZXNzZXMgY3VycmVudCBkaXJlY3RvcnkgcmVjdXJzaXZlbHk6CisjIHByaW50ZigiYWJjXG4iKSAtPiBwdXRzKCJhYmMiKS4gQmV3YXJlIG9mIGZwcmludGYgZXRjLi4uCisKKyMgQlRXLCBnY2MgNC4xLjIgYWxyZWFkeSBkb2VzIHRoZSBzYW1lISBDYW4ndCBiZWxpZXZlIGl0Li4uCisKK2dyZXAgLWxyICdwcmludGZcKFteJSVdKlxcbiJcKScgLiB8IGdyZXAgJy5bY2hdJCcgfCB4YXJncyAtbjEgXAorICAgIHNlZCAtZSAncy9cKFteQS1aYS16MC05X11cKXByaW50ZihcKCAqIlteJV0qXClcXG4iKS9cMXB1dHMoXDIiKS8nIC1pCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2VjaG8uYyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjA3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2VjaG8uYwpAQCAtMCwwICsxLDIzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZWNobyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveCAtIHVzZWQgYXMgYSBoZWxwZXIgZm9yIHRlc3RzdWl0ZS8qCisgKiBvbiBzeXN0ZW1zIGxhY2tpbmcgImVjaG8gLWVuIgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAtLSB1bmxlc3MgY29uZmlndXJlZCBhcyBmYW5jeSBlY2hvLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9lY2hvLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBCZWNhdXNlIG9mIGJlaGF2aW9yYWwgZGlmZmVyZW5jZXMsIGltcGxlbWVudGVkIGNvbmZpZ3VyYWJsZSBTVVN2MworICogb3IgJ2ZhbmN5JyBnbnUtaXNoIGJlaGF2aW9ycy4gIEFsc28sIHJlZHVjZWQgc2l6ZSBhbmQgZml4ZWQgYnVncy4KKyAqIDEpIEluIGhhbmRsaW5nICdcYycgZXNjYXBlLCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvbmx5IHN1cHByZXNzZWQgdGhlCisgKiAgICAgdHJhaWxpbmcgbmV3bGluZS4gIFNVU3YzIHNwZWNpZmllcyBfbm9fIG91dHB1dCBhZnRlciAnXGMnLgorICogMikgU1VTdjMgc3BlY2lmaWVzIHRoYXQgb2N0YWwgZXNjYXBlcyBhcmUgb2YgdGhlIGZvcm0gXDB7I3sjeyN9fX0uCisgKiAgICBUaGUgcHJldmlvdXMgdmVyc2lvbiBkaWQgbm90IGFsbG93IDQtZGlnaXQgb2N0YWxzLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIFdBTlRfSEVYX0VTQ0FQRVMgMQorCisvKiBVc3VhbCAidGhpcyBvbmx5IHdvcmtzIGZvciBhc2NpaSBjb21wYXRpYmxlIGVuY29kaW5ncyIgZGlzY2xhaW1lci4gKi8KKyN1bmRlZiBfdG9sb3dlcgorI2RlZmluZSBfdG9sb3dlcihYKSAoKFgpfCgoY2hhcikgMHgyMCkpCisKK3N0YXRpYyBjaGFyIGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKGNvbnN0IGNoYXIgKipwdHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgY2hhcm1hcFtdID0geworCQknYScsICAnYicsICAnZicsICAnbicsICAncicsICAndCcsICAndicsICAnXFwnLCAwLAorCQknXGEnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLCAnXHYnLCAnXFwnLCAnXFwnIH07CisKKwljb25zdCBjaGFyICpwOworCWNvbnN0IGNoYXIgKnE7CisJdW5zaWduZWQgaW50IG51bV9kaWdpdHM7CisJdW5zaWduZWQgaW50IHI7CisJdW5zaWduZWQgaW50IG47CisJdW5zaWduZWQgaW50IGQ7CisJdW5zaWduZWQgaW50IGJhc2U7CisKKwludW1fZGlnaXRzID0gbiA9IDA7CisJYmFzZSA9IDg7CisJcSA9ICpwdHI7CisKKyNpZmRlZiBXQU5UX0hFWF9FU0NBUEVTCisJaWYgKCpxID09ICd4JykgeworCQkrK3E7CisJCWJhc2UgPSAxNjsKKwkJKytudW1fZGlnaXRzOworCX0KKyNlbmRpZgorCisJZG8geworCQlkID0gKHVuc2lnbmVkIGNoYXIpKCpxKSAtICcwJzsKKyNpZmRlZiBXQU5UX0hFWF9FU0NBUEVTCisJCWlmIChkID49IDEwKSB7CisJCQlkID0gKHVuc2lnbmVkIGNoYXIpKF90b2xvd2VyKCpxKSkgLSAnYScgKyAxMDsKKwkJfQorI2VuZGlmCisKKwkJaWYgKGQgPj0gYmFzZSkgeworI2lmZGVmIFdBTlRfSEVYX0VTQ0FQRVMKKwkJCWlmICgoYmFzZSA9PSAxNikgJiYgKCEtLW51bV9kaWdpdHMpKSB7CisvKgkJCQlyZXR1cm4gJ1xcJzsgKi8KKwkJCQktLXE7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJciA9IG4gKiBiYXNlICsgZDsKKwkJaWYgKHIgPiBVQ0hBUl9NQVgpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJbiA9IHI7CisJCSsrcTsKKwl9IHdoaWxlICgrK251bV9kaWdpdHMgPCAzKTsKKworCWlmIChudW1fZGlnaXRzID09IDApIHsJLyogbW5lbW9uaWMgZXNjYXBlIHNlcXVlbmNlPyAqLworCQlwID0gY2hhcm1hcDsKKwkJZG8geworCQkJaWYgKCpwID09ICpxKSB7CisJCQkJcSsrOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlICgqKytwKTsKKwkJbiA9ICoocCArIChzaXplb2YoY2hhcm1hcCkvMikpOworCX0KKworCSpwdHIgPSBxOworCisJcmV0dXJuIChjaGFyKSBuOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICphcmc7CisJY29uc3QgY2hhciAqcDsKKwljaGFyIG5mbGFnID0gMTsKKwljaGFyIGVmbGFnID0gMDsKKworCS8qIFdlIG11c3QgY2hlY2sgdGhhdCBzdGRvdXQgaXMgbm90IGNsb3NlZC4gKi8KKwlpZiAoZHVwMigxLCAxKSAhPSAxKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoMSkgeworCQlhcmcgPSAqKythcmd2OworCQlpZiAoIWFyZykKKwkJCWdvdG8gbmV3bGluZV9yZXQ7CisJCWlmICgqYXJnICE9ICctJykKKwkJCWJyZWFrOworCisJCS8qIElmIGl0IGFwcGVhcnMgdGhhdCB3ZSBhcmUgaGFuZGxpbmcgb3B0aW9ucywgdGhlbiBtYWtlIHN1cmUKKwkJICogdGhhdCBhbGwgb2YgdGhlIG9wdGlvbnMgc3BlY2lmaWVkIGFyZSBhY3R1YWxseSB2YWxpZC4KKwkJICogT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIHNob3VsZCBqdXN0IGJlIGVjaG9lZC4KKwkJICovCisJCXAgPSBhcmcgKyAxOworCQlpZiAoISpwKQkvKiBBIHNpbmdsZSAnLScsIHNvIGVjaG8gaXQuICovCisJCQlnb3RvIGp1c3RfZWNobzsKKworCQlkbyB7CisJCQlpZiAoIXN0cnJjaHIoIm5lRSIsICpwKSkKKwkJCQlnb3RvIGp1c3RfZWNobzsKKwkJfSB3aGlsZSAoKisrcCk7CisKKwkJLyogQWxsIG9mIHRoZSBvcHRpb25zIGluIHRoaXMgYXJnIGFyZSB2YWxpZCwgc28gaGFuZGxlIHRoZW0uICovCisJCXAgPSBhcmcgKyAxOworCQlkbyB7CisJCQlpZiAoKnAgPT0gJ24nKQorCQkJCW5mbGFnID0gMDsKKwkJCWlmICgqcCA9PSAnZScpCisJCQkJZWZsYWcgPSAnXFwnOworCQl9IHdoaWxlICgqKytwKTsKKwl9CisganVzdF9lY2hvOgorCXdoaWxlICgxKSB7CisJCS8qIGFyZyBpcyBhbHJlYWR5ID09ICphcmd2IGFuZCBpc24ndCBOVUxMICovCisJCWludCBjOworCisJCWlmICghZWZsYWcpIHsKKwkJCS8qIG9wdGltaXphdGlvbiBmb3IgdmVyeSBjb21tb24gY2FzZSAqLworCQkJZnB1dHMoYXJnLCBzdGRvdXQpOworCQl9IGVsc2Ugd2hpbGUgKChjID0gKmFyZysrKSkgeworCQkJaWYgKGMgPT0gZWZsYWcpIHsJLyogQ2hlY2sgZm9yIGVzY2FwZSBzZXEuICovCisJCQkJaWYgKCphcmcgPT0gJ2MnKSB7CisJCQkJCS8qICdcYycgbWVhbnMgY2FuY2VsIG5ld2xpbmUgYW5kCisJCQkJCSAqIGlnbm9yZSBhbGwgc3Vic2VxdWVudCBjaGFycy4gKi8KKwkJCQkJZ290byByZXQ7CisJCQkJfQorCQkJCXsKKwkJCQkJLyogU2luY2UgU1VTdjMgbWFuZGF0ZXMgYSBmaXJzdCBkaWdpdCBvZiAwLCA0LWRpZ2l0IG9jdGFscworCQkJCQkqIG9mIHRoZSBmb3JtIFwwIyMjIGFyZSBhY2NlcHRlZC4gKi8KKwkJCQkJaWYgKCphcmcgPT0gJzAnKSB7CisJCQkJCQkvKiBOQjogZG9uJ3QgdHVybiAiLi4uXDAiIGludG8gIi4uLlwiICovCisJCQkJCQlpZiAoYXJnWzFdICYmICgodW5zaWduZWQgY2hhcikoYXJnWzFdKSAtICcwJykgPCA4KSB7CisJCQkJCQkJYXJnKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLyogYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UgaGFuZGxlcyBOVUwgY29ycmVjdGx5CisJCQkJCSAqICgiLi4uXCIgY2FzZS4gKi8KKwkJCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZhcmcpOworCQkJCX0KKwkJCX0KKwkJCXB1dGNoYXIoYyk7CisJCX0KKworCQlhcmcgPSAqKythcmd2OworCQlpZiAoIWFyZykKKwkJCWJyZWFrOworCQlwdXRjaGFyKCcgJyk7CisJfQorCisgbmV3bGluZV9yZXQ6CisJaWYgKG5mbGFnKSB7CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorIHJldDoKKwlyZXR1cm4gZmZsdXNoKE5VTEwpOworfQorCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIDxCU0QgQWR2ZXJ0aXNpbmcgQ2xhdXNlIG9taXR0ZWQgcGVyIHRoZSBKdWx5IDIyLCAxOTk5IGxpY2Vuc2luZyBjaGFuZ2UKKyAqICAgICAgICAgICAgICBmdHA6Ly9mdHAuY3MuYmVya2VsZXkuZWR1L3B1Yi80YnNkL1JFQURNRS5JbXB0LkxpY2Vuc2UuQ2hhbmdlPgorICoKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICAgICAgQCgjKWVjaG8uYyAgICAgIDguMSAoQmVya2VsZXkpIDUvMzEvOTMKKyAqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9maW5kX2JhZF9jb21tb25fYnVmc2l6IGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9maW5kX2JhZF9jb21tb25fYnVmc2l6Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4MGNmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2ZpbmRfYmFkX2NvbW1vbl9idWZzaXoKQEAgLTAsMCArMSwxMyBAQAorIyEvYmluL3NoCisKKyMgVGhpcyBzY3JpcHQgZmluZHMgYXBwbGV0cyB3aXRoIG11bHRpcGxlIHVzZXMgb2YgYmJfY29tbW9uX2J1ZnNpejEKKyMgKD09IHBvc3NpYmxlIGJ1Z3MpLgorIyBDdXJyZW50bHkgKDIwMDctMDYtMDQpIHJlcG9ydHMgMyBmYWxzZSBwb3NpdGl2ZXM6CisjIC4vY29yZXV0aWxzL2RpZmYuYzo3CisjIC4vbG9naW51dGlscy9nZXR0eS5jOjIKKyMgLi91dGlsLWxpbnV4L21vdW50LmM6NQorCitmaW5kIC1uYW1lICcqLmMnIFwKK3wgd2hpbGUgcmVhZCBuYW1lOyBkbworICAgIGdyZXAgLUhjIGJiX2NvbW1vbl9idWZzaXoxICIkbmFtZSIKK2RvbmUgfCBncmVwIC12ICc6WzAxXSQnCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2ZpbmRfc3RyYXlfY29tbW9uX3ZhcnMgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2ZpbmRfc3RyYXlfY29tbW9uX3ZhcnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2EyNWQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZmluZF9zdHJheV9jb21tb25fdmFycwpAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vc2gKKworIyBDb21tb24gdmFyaWFibGVzIGFyZSBlbHVzaXZlLCB0aGV5IGRvbid0IHNob3cgdXAgaW4gc2l6ZSBvdXRwdXQhCisjIFRoaXMgc2NyaXB0IHdpbGwgc2hvdyBhbGwgY29tbW9ucyBpbiAqLm8sIHNvcnRlZCBieSBzaXplCisKK2ZpbmQgISAtcGF0aCAnLi9zY3JpcHRzLyonIC1hICEgLW5hbWUgYnVpbHQtaW4ubyAtYSAtbmFtZSAnKi5vJyBcCit8IHdoaWxlIHJlYWQgbmFtZTsgZG8KKyAgICBiPWBiYXNlbmFtZSAiJG5hbWUiYAorICAgIG5tICIkbmFtZSIgfCBzZWQgInMvXi8kYjogLyIKK2RvbmUgfCBncmVwIC1pICcgYyAnIHwgc29ydCAtazIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZmluZF9zdHJheV9lbXB0eV9saW5lcyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZmluZF9zdHJheV9lbXB0eV9saW5lcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYWUxOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9maW5kX3N0cmF5X2VtcHR5X2xpbmVzCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorCitncmVwIC1uIC1CMSAtciAkJ15cdCp9JCcgLiB8IGdyZXAgLUExICcuW2NoXS1bMC05XSotJCcKK2dyZXAgLW4gLUExIC1yICQnXlx0KnskJyAuIHwgZ3JlcCAtQjEgJy5bY2hdLVswLTldKi0kJworIyBvciAobGVzcyBzdXJlZmlyZSBvbmVzKToKK2dyZXAgLW4gLUIxIC1yICQnXlx0Kn0nIC4gfCBncmVwIC1BMSAnLltjaF0tWzAtOV0qLSQnCitncmVwIC1uIC1BMSAtciAkJ15cdCp7JyAuIHwgZ3JlcCAtQjEgJy5bY2hdLVswLTldKi0kJworCisjIGZpbmQgdHJhaWxpbmcgZW1wdHkgbGluZXMKK2ZpbmQgLXR5cGUgZiB8IHdoaWxlIHJlYWQgZmlsZTsgZG8KKyAgICAgICAgdGVzdCB4IiRmaWxlIiA9IHgiIiAmJiBjb250aW51ZQorICAgICAgICB0YWlsIC1uMSAkZmlsZSB8IHdoaWxlIHJlYWQgbGFzdGxpbmUKKyAgICAgICAgZG8KKyAgICAgICAgICAjZWNobyAifCRmaWxlfCRsYXN0bGluZSIKKyAgICAgICAgICBpZiB0ZXN0IHgiJGxhc3RsaW5lIiA9IHgiIjsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIiRmaWxlIgorICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKK2RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZml4X3dzLnNoIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9maXhfd3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTdjZjUyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZml4X3dzLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9iYXNoCisjIFdoaXRlc3BhY2UgZml4ZXIKKyMgVXNhZ2U6IGZpeF93cyBbZGlyXS4uLgorCit0ZW1wPSIvdG1wL2ZpeF93cy4kJC4kUkFORE9NIgorCisjIFVzaW5nICQneHh4JyBiYXNoaXNtCitiZWdpbjhzcF90YWI9JCdzL14gICAgICAgIC9cdC8nCitiZWdpbmNoYXI3c3BfY2hhcnRhYj0kJ3MvXlxcKFteIFx0XVxcKSAgICAgICAvXFwxXHQvJwordGFiOHNwX3RhYnRhYj0kJ3MvXHQgICAgICAgIC9cdFx0L2cnCit0YWI4c3B0YWJfdGFidGFidGFiPSQncy9cdCAgICAgICAgXHQvXHRcdFx0L2cnCitiZWdpbjE3c3B0YWJfdGFiPSQncy9eIFxcezEsN1xcfVx0L1x0LycKK3RhYjE3c3B0YWJfdGFidGFiPSQncy9cdCBcXHsxLDdcXH1cdC9cdFx0L2cnCit0cmFpbGluZ3dzXz0kJ3MvWyBcdF0qJC8vJworCisjPmZpeF93cy5kaWZmCisKK2ZpbmQgIiRAIiAtdHlwZSBmIFwKK3wgd2hpbGUgcmVhZCBuYW1lOyBkbworICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyouYnoyL1lFU30iICYmIGNvbnRpbnVlCisgICAgdGVzdCAiWUVTIiA9ICIke25hbWUvKi5nei9ZRVN9IiAmJiBjb250aW51ZQorICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyoucG5nL1lFU30iICYmIGNvbnRpbnVlCisgICAgdGVzdCAiWUVTIiA9ICIke25hbWUvKi5naWYvWUVTfSIgJiYgY29udGludWUKKyAgICB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qLmpwZy9ZRVN9IiAmJiBjb250aW51ZQorICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyouZGlmZi9ZRVN9IiAmJiBjb250aW51ZQorICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyoucGF0Y2gvWUVTfSIgJiYgY29udGludWUKKyAgICAjIHNoZWxsIHRlc3RzdWl0ZSBlbnRyaWVzIGFyZSBub3QgdG8gYmUgdG91Y2hlZCB0b28KKyAgICB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qLnJpZ2h0L1lFU30iICYmIGNvbnRpbnVlCisKKyAgICBpZiB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qLltjaHNTXS9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLyouc2gvWUVTfSIgXAorCS1vICJZRVMiID0gIiR7bmFtZS8qLnR4dC9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLyouaHRtbC9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLyouaHRtL1lFU30iIFwKKwktbyAiWUVTIiA9ICIke25hbWUvKkNvbmZpZy5pbiovWUVTfSIgXAorICAgIDsgdGhlbgorICAgICMgTW9yZSBhZ2dyZXNzaXZlIHdoaXRlc3BhY2UgZml4ZXMgZm9yIGtub3duIGZpbGUgdHlwZXMKKwllY2hvICJGb3JtYXR0aW5nOiAkbmFtZSIgPiYyCisJY2F0ICIkbmFtZSIgXAorCXwgc2VkIC1lICIkdGFiOHNwdGFiX3RhYnRhYnRhYiIgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiBcCisJICAgICAgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiAtZSAiJHRhYjhzcHRhYl90YWJ0YWJ0YWIiIFwKKwl8IHNlZCAiJGJlZ2luMTdzcHRhYl90YWIiIFwKKwl8IHNlZCAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiBcCisJICAgICAgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgXAorCSAgICAgIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIFwKKwl8IHNlZCAiJHRyYWlsaW5nd3NfIgorICAgIGVsaWYgdGVzdCAiWUVTIiA9ICIke25hbWUvKk1ha2VmaWxlKi9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLypLYnVpbGQqL1lFU30iIFwKKyAgICA7IHRoZW4KKyAgICAjIEZvciBNYWtlZmlsZXMsIG5ldmVyIGNvbnZlcnQgIjEtN3NwYWNlcyt0YWIiIGludG8gInRhYnRhYiIKKwllY2hvICJNYWtlZmlsZTogJG5hbWUiID4mMgorCWNhdCAiJG5hbWUiIFwKKwl8IHNlZCAtZSAiJHRhYjhzcHRhYl90YWJ0YWJ0YWIiIC1lICIkdGFiOHNwdGFiX3RhYnRhYnRhYiIgXAorCSAgICAgIC1lICIkdGFiOHNwdGFiX3RhYnRhYnRhYiIgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiBcCisJfCBzZWQgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgXAorCSAgICAgIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIFwKKwkgICAgICAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiBcCisJfCBzZWQgIiR0cmFpbGluZ3dzXyIKKyAgICBlbHNlCisgICAgIyBPbmx5IHJlbW92ZSB0cmFpbGluZyBXUyBmb3IgdGhlIHJlc3QKKwllY2hvICJSZW1vdmluZyB0cmFpbGluZyB3aGl0ZXNwYWNlOiAkbmFtZSIgPiYyCisJY2F0ICIkbmFtZSIgXAorCXwgc2VkICIkdHJhaWxpbmd3c18iCisgICAgZmkgPiIkdGVtcCIKKworIyAgICBkaWZmIC11ICIkdGVtcCIgIiRuYW1lIiA+PmZpeF93cy5kaWZmCisKKyAgICAjIENvbnNlcnZlIG1vZGUvc3ltbGluazoKKyAgICBjYXQgIiR0ZW1wIiA+IiRuYW1lIgorZG9uZQorcm0gIiR0ZW1wIiAyPi9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaCBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzQ1MTA4MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL3NoCisjCisjIGdjYy12ZXJzaW9uIGdjYy1jb21tYW5kCisjCisjIFByaW50cyB0aGUgZ2NjIHZlcnNpb24gb2YgYGdjYy1jb21tYW5kJyBpbiBhIGNhbm9uaWNhbCA0LWRpZ2l0IGZvcm0KKyMgc3VjaCBhcyBgMDI5NScgZm9yIGdjYy0yLjk1LCBgMDMwMycgZm9yIGdjYy0zLjMsIGV0Yy4KKyMKKworY29tcGlsZXI9IiQqIgorCitNQUpfTUlOPSQoZWNobyBfX0dOVUNfXyBfX0dOVUNfTUlOT1JfXyB8ICRjb21waWxlciAtRSAteGMgLSB8IHRhaWwgLW4gMSkKK3ByaW50ZiAnJTAyZCUwMmRcbicgJE1BSl9NSU4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZ2VuX2J1aWxkX2ZpbGVzLnNoIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9nZW5fYnVpbGRfZmlsZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTUxOGE5MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvZ2VuX2J1aWxkX2ZpbGVzLnNoCkBAIC0wLDAgKzEsOTkgQEAKKyMhL2Jpbi9zaAorCisjIE5vdGU6IHdhcyB1c2luZyBzZWQgT1BUUyBDTUQgLS0gRklMRVMKKyMgYnV0IHVzZXJzIGNvbXBsYWluIHRoYXQgbWFueSBzZWQgaW1wbGVtZW50YXRpb25zCisjIGFyZSBtaXNpbnRlcnByZXRpbmcgLS0uCisKK3Rlc3QgJCMgLWdlIDIgfHwgeyBlY2hvICJTeW50YXg6ICQwIFNSQ1RSRUUgT0JKVFJFRSI7IGV4aXQgMTsgfQorCisjIGNkIHRvIG9ianRyZWUKK2NkIC0tICIkMiIgfHwgeyBlY2hvICJTeW50YXg6ICQwIFNSQ1RSRUUgT0JKVFJFRSI7IGV4aXQgMTsgfQorIyBJbiBzZXBhcmF0ZSBvYmp0cmVlIGJ1aWxkLCBpbmNsdWRlLyBtaWdodCBub3QgZXhpc3QgeWV0Citta2RpciBpbmNsdWRlIDI+L2Rldi9udWxsCisKK3NyY3RyZWU9IiQxIgorCitzdGF0dXMoKSB7IHByaW50ZiAnICAlLThzJXNcbicgIiQxIiAiJDIiOyB9CitnZW4oKSB7IHN0YXR1cyAiR0VOIiAiJEAiOyB9CitjaGsoKSB7IHN0YXR1cyAiQ0hLIiAiJEAiOyB9CisKK2dlbmVyYXRlKCkKK3sKKwlsb2NhbCBzcmM9IiQxIiBkc3Q9IiQyIiBoZWFkZXI9IiQzIiBpbnNlcnQ9IiQ0IgorCSNjaGsgIiR7ZHN0fSIKKwkoCisJCSMgTmVlZCB0byB1c2UgcHJpbnRmOiBkaWZmZXJlbnQgc2hlbGxzIGhhdmUgaW5jb25zaXN0ZW50CisJCSMgcnVsZXMgcmUgaGFuZGxpbmcgb2YgIlxuIiBpbiBlY2hvIHBhcmFtcywKKwkJIyBhbmQgJHtpbnNlcnR9IGRlZmluaXRlbHkgY29udGFpbnMgIlxuIi4KKwkJIyBUaGVyZWZvcmUsIGVjaG8gIiR7aGVhZGVyfSIgd291bGQgbm90IHdvcms6CisJCXByaW50ZiAiJXNcbiIgIiR7aGVhZGVyfSIKKwkJaWYgZ3JlcCAtcXMgJ15JTlNFUlQkJyAiJHtzcmN9IjsgdGhlbgorCQkJc2VkIC1uICcxLC9eSU5TRVJUJC9wJyAiJHtzcmN9IgorCQkJcHJpbnRmICIlc1xuIiAiJHtpbnNlcnR9IgorCQkJc2VkIC1uICcvXklOU0VSVCQvLCRwJyAiJHtzcmN9IgorCQllbHNlCisJCQlpZiBbIC1uICIke2luc2VydH0iIF07IHRoZW4KKwkJCQlwcmludGYgIiVzXG4iICJFUlJPUjogSU5TRVJUIGxpbmUgbWlzc2luZyBpbjogJHtzcmN9IiAxPiYyCisJCQlmaQorCQkJY2F0ICIke3NyY30iCisJCWZpCisJKSB8IHNlZCAnL15JTlNFUlQkL2QnID4gIiR7ZHN0fS50bXAiCisJaWYgISBjbXAgLXMgIiR7ZHN0fSIgIiR7ZHN0fS50bXAiOyB0aGVuCisJCWdlbiAiJHtkc3R9IgorCQltdiAiJHtkc3R9LnRtcCIgIiR7ZHN0fSIKKwllbHNlCisJCXJtIC1mICIke2RzdH0udG1wIgorCWZpCit9CisKKyMgKFJlKWdlbmVyYXRlIGluY2x1ZGUvYXBwbGV0cy5oCitzPWBzZWQgLW4gJ3NAXi8vYXBwbGV0OkBAcCcgIiRzcmN0cmVlIi8qLyouYyAiJHNyY3RyZWUiLyovKi8qLmNgCitnZW5lcmF0ZSBcCisJIiRzcmN0cmVlL2luY2x1ZGUvYXBwbGV0cy5zcmMuaCIgXAorCSJpbmNsdWRlL2FwcGxldHMuaCIgXAorCSIvKiBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGFwcGxldHMuc3JjLmggKi8iIFwKKwkiJHtzfSIKKworIyAoUmUpZ2VuZXJhdGUgaW5jbHVkZS91c2FnZS5oCisjIFdlIGFkZCBsaW5lIGNvbnRpbnVhdGlvbiBiYWNrc2xhc2ggYWZ0ZXIgZWFjaCBsaW5lLAorIyBhbmQgaW5zZXJ0IGVtcHR5IGxpbmUgYmVmb3JlIGVhY2ggbGluZSB3aGljaCBkb2Vzbid0IHN0YXJ0CisjIHdpdGggc3BhY2Ugb3IgdGFiCisjIChub3RlOiB3ZSBuZWVkIHRvIHVzZSBcXFxcIGJlY2F1c2Ugb2YgYGApCitzPWBzZWQgLW4gLWUgJ3NAXi8vdXNhZ2U6XChbIFx0XS4qXCkkQFwxIFxcXFxAcCcgLWUgJ3NAXi8vdXNhZ2U6XChbXiBcdF0uKlwpJEBcblwxIFxcXFxAcCcgIiRzcmN0cmVlIi8qLyouYyAiJHNyY3RyZWUiLyovKi8qLmNgCitnZW5lcmF0ZSBcCisJIiRzcmN0cmVlL2luY2x1ZGUvdXNhZ2Uuc3JjLmgiIFwKKwkiaW5jbHVkZS91c2FnZS5oIiBcCisJIi8qIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gdXNhZ2Uuc3JjLmggKi8iIFwKKwkiJHtzfSIKKworIyAoUmUpZ2VuZXJhdGUgKi9LYnVpbGQgYW5kICovQ29uZmlnLmluCit7IGNkIC0tICIkc3JjdHJlZSIgJiYgZmluZCAuIC10eXBlIGQ7IH0gfCB3aGlsZSByZWFkIC1yIGQ7IGRvCisJZD0iJHtkIy4vfSIKKworCXNyYz0iJHNyY3RyZWUvJGQvS2J1aWxkLnNyYyIKKwlkc3Q9IiRkL0tidWlsZCIKKwlpZiB0ZXN0IC1mICIkc3JjIjsgdGhlbgorCQlta2RpciAtcCAtLSAiJGQiIDI+L2Rldi9udWxsCisKKwkJcz1gc2VkIC1uICdzQF4vL2tidWlsZDpAQHAnICIkc3JjdHJlZS8kZCIvKi5jYAorCQlnZW5lcmF0ZSBcCisJCQkiJHtzcmN9IiAiJHtkc3R9IiBcCisJCQkiIyBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIEtidWlsZC5zcmMiIFwKKwkJCSIke3N9IgorCWZpCisKKwlzcmM9IiRzcmN0cmVlLyRkL0NvbmZpZy5zcmMiCisJZHN0PSIkZC9Db25maWcuaW4iCisJaWYgdGVzdCAtZiAiJHNyYyI7IHRoZW4KKwkJbWtkaXIgLXAgLS0gIiRkIiAyPi9kZXYvbnVsbAorCisJCXM9YHNlZCAtbiAnc0BeLy9jb25maWc6QEBwJyAiJHNyY3RyZWUvJGQiLyouY2AKKwkJZ2VuZXJhdGUgXAorCQkJIiR7c3JjfSIgIiR7ZHN0fSIgXAorCQkJIiMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjIiBcCisJCQkiJHtzfSIKKwlmaQorZG9uZQorCisjIExhc3QgcmVhZCBmYWlsZWQuIFRoaXMgaXMgbm9ybWFsLiBEb24ndCBleGl0IHdpdGggaXRzIGVycm9yIGNvZGU6CitleGl0IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZSBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTcwOGUyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCkBAIC0wLDAgKzEsMjcxIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBLZXJuZWwgY29uZmlndXJhdGlvbiB0YXJnZXRzCisjIFRoZXNlIHRhcmdldHMgYXJlIHVzZWQgZnJvbSB0b3AtbGV2ZWwgbWFrZWZpbGUKKworUEhPTlkgKz0gb2xkY29uZmlnIHhjb25maWcgZ2NvbmZpZyBtZW51Y29uZmlnIGNvbmZpZyBzaWxlbnRvbGRjb25maWcgdXBkYXRlLXBvLWNvbmZpZworCit4Y29uZmlnOiAkKG9iaikvcWNvbmYKKwkkPCBDb25maWcuaW4KKworZ2NvbmZpZzogJChvYmopL2djb25mCisJJDwgQ29uZmlnLmluCisKK21lbnVjb25maWc6ICQob2JqKS9tY29uZgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMva2NvbmZpZy9seGRpYWxvZworCSQ8IENvbmZpZy5pbgorCitjb25maWc6ICQob2JqKS9jb25mCisJJDwgQ29uZmlnLmluCisKKyMgTXRpbWUgZ3JhbnVsYXJpdHkgcHJvYmxlbS4KKyMgSXQgd2FzIG9ic2VydmVkIHRoYXQgdGhlc2UgY29tbWFuZHM6CisjIG1ha2UgYWxsbm9jb25maWc7IHNlZCAtaSAtZSAnL0NPTkZJR19UUlVFL3MvLiovQ09ORklHX1RSVUU9eS8nIC5jb25maWc7IG1ha2UKKyMgc29tZXRpbWVzIHByb2R1Y2UgYnVzeWJveCB3aXRoICJ0cnVlIiBhcHBsZXQgc3RpbGwgZGlzYWJsZWQuCisjIFRoaXMgaXMgY2F1c2VkIGJ5IC5jb25maWcgdXBkYXRlZCBieSBzZWQgaGF2aW5nIG10aW1lIHdoaWNoIGlzIHN0aWxsCisjIGVxdWFsIHRvIChub3QgYmlnZ2VyIHRoYW4pIGluY2x1ZGUvYXV0b2NvbmYuaCdzIG10aW1lLAorIyBhbmQgdGh1cyAybmQgbWFrZSBkb2VzIG5vdCByZWdlbmVyYXRlIGluY2x1ZGUvYXV0b2NvbmYuaC4KKyMgV2FpdGluZyBmb3IgMSBzZWNvbmQgYWZ0ZXIgbm9uLWludGVyYWN0aXZlICJtYWtlIFhYWFhjb25maWciCisjIHByZXZlbnRzIHRoaXMgZnJvbSBoYXBwZW5pbmcuCisjCisjIFdlJ2QgbGlrZSB0byBkZXRlY3Qgd2hldGhlciBmaWxlc3lzdGVtIHdlIGFyZSBvbiBoYXMgY29hcnNlIG10aW1lcywKKyMgYnV0IGNhbid0IGRvIGl0IHlldCwgYmJveCBscyBoYXNuJ3QgZ290IC0tZnVsbC10aW1lLgorI01USU1FX0lTX0NPQVJTRTo9QGxzIC0tZnVsbC10aW1lIC1sZCB8IGdyZXAgLUYgLjAwMCA+L2Rldi9udWxsCitNVElNRV9JU19DT0FSU0U6PUB0cnVlCisKK29sZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtbyBDb25maWcuaW4KKwkkKE1USU1FX0lTX0NPQVJTRSkgJiYgc2xlZXAgMQorCitzaWxlbnRvbGRjb25maWc6ICQob2JqKS9jb25mCisJJDwgLXMgQ29uZmlnLmluCisJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKwordXBkYXRlLXBvLWNvbmZpZzogJChvYmopL2t4Z2V0dGV4dAorCXhnZXR0ZXh0IC0tZGVmYXVsdC1kb21haW49bGludXggXAorICAgICAgICAgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCisgICAgICAgICAgLS1maWxlcy1mcm9tPXNjcmlwdHMva2NvbmZpZy9QT1RGSUxFUy5pbiBcCisgICAgICAgICAgLS1vdXRwdXQgc2NyaXB0cy9rY29uZmlnL2NvbmZpZy5wb3QKKwkkKFEpbG4gLWZzIEtjb25maWdfaTM4NiBhcmNoL3VtL0tjb25maWdfYXJjaAorCSQoUSlmb3IgaSBpbiBgbHMgYXJjaC9gOyBcCisJZG8gXAorCSAgc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dCBhcmNoLyQkaS9LY29uZmlnIFwKKwkgICAgfCBtc2d1bmlxIC1vIHNjcmlwdHMva2NvbmZpZy9saW51eF8kJHtpfS5wb3Q7IFwKKwlkb25lCisJJChRKW1zZ2NhdCBzY3JpcHRzL2tjb25maWcvY29uZmlnLnBvdCBcCisJICBgZmluZCBzY3JpcHRzL2tjb25maWcvIC10eXBlIGYgLW5hbWUgbGludXhfKi5wb3RgIFwKKwkgIC0tb3V0cHV0IHNjcmlwdHMva2NvbmZpZy9saW51eF9yYXcucG90CisJJChRKW1zZ3VuaXEgLS1zb3J0LWJ5LWZpbGUgc2NyaXB0cy9rY29uZmlnL2xpbnV4X3Jhdy5wb3QgXAorCSAgICAtLW91dHB1dCBzY3JpcHRzL2tjb25maWcvbGludXgucG90CisJJChRKXJtIC1mIGFyY2gvdW0vS2NvbmZpZ19hcmNoCisJJChRKXJtIC1mIHNjcmlwdHMva2NvbmZpZy9saW51eF8qLnBvdCBzY3JpcHRzL2tjb25maWcvY29uZmlnLnBvdAorCitQSE9OWSArPSByYW5kY29uZmlnIGFsbHllc2NvbmZpZyBhbGxub2NvbmZpZyBhbGxtb2Rjb25maWcgZGVmY29uZmlnCisKK3JhbmRjb25maWc6ICQob2JqKS9jb25mCisJJDwgLXIgQ29uZmlnLmluCisJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKworYWxseWVzY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC15IENvbmZpZy5pbgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKK2FsbG5vY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1uIENvbmZpZy5pbgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKK2FsbG1vZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtbSBDb25maWcuaW4KKwkkKE1USU1FX0lTX0NPQVJTRSkgJiYgc2xlZXAgMQorCitkZWZjb25maWc6ICQob2JqKS9jb25mCitpZmVxICgkKEtCVUlMRF9ERUZDT05GSUcpLCkKKwkkPCAtZCBDb25maWcuaW4KK2Vsc2UKKwlAZWNobyAqKiogRGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uICckKEtCVUlMRF9ERUZDT05GSUcpJworCSQoUSkkPCAtRCAkKEtCVUlMRF9ERUZDT05GSUcpIENvbmZpZy5pbgorZW5kaWYKKwkkKE1USU1FX0lTX0NPQVJTRSkgJiYgc2xlZXAgMQorCislX2RlZmNvbmZpZzogJChvYmopL2NvbmYKKwkkKFEpJDwgLUQgJEAgQ29uZmlnLmluCisJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKworIyBIZWxwIHRleHQgdXNlZCBieSBtYWtlIGhlbHAKK2hlbHA6CisJQGVjaG8gICcgIGNvbmZpZwkgIC0gVXBkYXRlIGN1cnJlbnQgY29uZmlnIHV0aWxpc2luZyBhIGxpbmUtb3JpZW50ZWQgcHJvZ3JhbScKKwlAZWNobyAgJyAgbWVudWNvbmZpZwkgIC0gVXBkYXRlIGN1cnJlbnQgY29uZmlnIHV0aWxpc2luZyBhIG1lbnUgYmFzZWQgcHJvZ3JhbScKKwlAZWNobyAgJyAgeGNvbmZpZwkgIC0gVXBkYXRlIGN1cnJlbnQgY29uZmlnIHV0aWxpc2luZyBhIFFUIGJhc2VkIGZyb250LWVuZCcKKwlAZWNobyAgJyAgZ2NvbmZpZwkgIC0gVXBkYXRlIGN1cnJlbnQgY29uZmlnIHV0aWxpc2luZyBhIEdUSyBiYXNlZCBmcm9udC1lbmQnCisJQGVjaG8gICcgIG9sZGNvbmZpZwkgIC0gVXBkYXRlIGN1cnJlbnQgY29uZmlnIHV0aWxpc2luZyBhIHByb3ZpZGVkIC5jb25maWcgYXMgYmFzZScKKwlAZWNobyAgJyAgcmFuZGNvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aXRoIHJhbmRvbSBhbnN3ZXIgdG8gYWxsIG9wdGlvbnMnCisJQGVjaG8gICcgIGRlZmNvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aXRoIGRlZmF1bHQgYW5zd2VyIHRvIGFsbCBvcHRpb25zJworCUBlY2hvICAnICBhbGxtb2Rjb25maWcJICAtIE5ldyBjb25maWcgc2VsZWN0aW5nIG1vZHVsZXMgd2hlbiBwb3NzaWJsZScKKwlAZWNobyAgJyAgYWxseWVzY29uZmlnCSAgLSBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhY2NlcHRlZCB3aXRoIHllcycKKwlAZWNobyAgJyAgYWxsbm9jb25maWcJICAtIE5ldyBjb25maWcgd2hlcmUgYWxsIG9wdGlvbnMgYXJlIGFuc3dlcmVkIHdpdGggbm8nCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFNoYXJlZCBNYWtlZmlsZSBmb3IgdGhlIHZhcmlvdXMga2NvbmZpZyBleGVjdXRhYmxlczoKKyMgY29uZjoJICBVc2VkIGZvciBkZWZjb25maWcsIG9sZGNvbmZpZyBhbmQgcmVsYXRlZCB0YXJnZXRzCisjIG1jb25mOiAgVXNlZCBmb3IgdGhlIG1jb25maWcgdGFyZ2V0LgorIyAgICAgICAgIFV0aWxpemVzIHRoZSBseGRpYWxvZyBwYWNrYWdlCisjIHFjb25mOiAgVXNlZCBmb3IgdGhlIHhjb25maWcgdGFyZ2V0CisjICAgICAgICAgQmFzZWQgb24gUVQgd2hpY2ggbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHRvIGNvbXBpbGUgaXQKKyMgZ2NvbmY6ICBVc2VkIGZvciB0aGUgZ2NvbmZpZyB0YXJnZXQKKyMgICAgICAgICBCYXNlZCBvbiBHVEsgd2hpY2ggbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHRvIGNvbXBpbGUgaXQKKyMgb2JqZWN0IGZpbGVzIHVzZWQgYnkgYWxsIGtjb25maWcgZmxhdm91cnMKKworaG9zdHByb2dzLXkJOj0gY29uZiBtY29uZiBxY29uZiBnY29uZiBreGdldHRleHQKK2NvbmYtb2Jqcwk6PSBjb25mLm8gIHpjb25mLnRhYi5vCittY29uZi1vYmpzCTo9IG1jb25mLm8gemNvbmYudGFiLm8KK2t4Z2V0dGV4dC1vYmpzCTo9IGt4Z2V0dGV4dC5vIHpjb25mLnRhYi5vCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSx4Y29uZmlnKQorCXFjb25mLXRhcmdldCA6PSAxCitlbmRpZgoraWZlcSAoJChNQUtFQ01ER09BTFMpLGdjb25maWcpCisJZ2NvbmYtdGFyZ2V0IDo9IDEKK2VuZGlmCisKKworaWZlcSAoJChxY29uZi10YXJnZXQpLDEpCitxY29uZi1jeHhvYmpzCTo9IHFjb25mLm8KK3Fjb25mLW9ianMJOj0ga2NvbmZpZ19sb2FkLm8gemNvbmYudGFiLm8KK2VuZGlmCisKK2lmZXEgKCQoZ2NvbmYtdGFyZ2V0KSwxKQorZ2NvbmYtb2Jqcwk6PSBnY29uZi5vIGtjb25maWdfbG9hZC5vIHpjb25mLnRhYi5vCitlbmRpZgorCitjbGVhbi1maWxlcwk6PSBsa2NfZGVmcy5oIHFjb25mLm1vYyAudG1wX3F0Y2hlY2sgXAorCQkgICAudG1wX2d0a2NoZWNrIHpjb25mLnRhYi5jIGxleC56Y29uZi5jIHpjb25mLmhhc2guYworc3ViZGlyLSArPSBseGRpYWxvZworCisjIEFkZCBlbnZpcm9ubWVudCBzcGVjaWZpYyBmbGFncworSE9TVF9FWFRSQUNGTEFHUyArPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpLyQoc3JjKS9jaGVjay5zaCAkKEhPU1RDQykgJChIT1NUQ0ZMQUdTKSkKKworIyBnZW5lcmF0ZWQgZmlsZXMgc2VlbSB0byBuZWVkIHRoaXMgdG8gZmluZCBsb2NhbCBpbmNsdWRlIGZpbGVzCitIT1NUQ0ZMQUdTX2xleC56Y29uZi5vCTo9IC1JJChzcmMpCitIT1NUQ0ZMQUdTX3pjb25mLnRhYi5vCTo9IC1JJChzcmMpCisKK0hPU1RMT0FETElCRVNfcWNvbmYJPSAkKEtDX1FUX0xJQlMpIC1sZGwKK0hPU1RDWFhGTEFHU19xY29uZi5vCT0gJChLQ19RVF9DRkxBR1MpIC1EIExLQ19ESVJFQ1RfTElOSworCitIT1NUTE9BRExJQkVTX2djb25mCT0gYHBrZy1jb25maWcgLS1saWJzIGd0aystMi4wIGdtb2R1bGUtMi4wIGxpYmdsYWRlLTIuMGAKK0hPU1RDRkxBR1NfZ2NvbmYubwk9IGBwa2ctY29uZmlnIC0tY2ZsYWdzIGd0aystMi4wIGdtb2R1bGUtMi4wIGxpYmdsYWRlLTIuMGAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAtRCBMS0NfRElSRUNUX0xJTksKKworJChvYmopL3Fjb25mLm86ICQob2JqKS8udG1wX3F0Y2hlY2sKKworaWZlcSAoJChxY29uZi10YXJnZXQpLDEpCiskKG9iaikvLnRtcF9xdGNoZWNrOiAkKHNyYykvTWFrZWZpbGUKKy1pbmNsdWRlICQob2JqKS8udG1wX3F0Y2hlY2sKKworIyBRVCBuZWVkcyBzb21lIGV4dHJhIGVmZm9ydC4uLgorJChvYmopLy50bXBfcXRjaGVjazoKKwlAc2V0IC1lOyBlY2hvICIgIENIRUNLICAgcXQiOyBkaXI9IiI7IHBrZz0iIjsgXAorCXBrZy1jb25maWcgLS1leGlzdHMgcXQgMj4gL2Rldi9udWxsICYmIHBrZz1xdDsgXAorCXBrZy1jb25maWcgLS1leGlzdHMgcXQtbXQgMj4gL2Rldi9udWxsICYmIHBrZz1xdC1tdDsgXAorCWlmIFsgLW4gIiQkcGtnIiBdOyB0aGVuIFwKKwkgIGNmbGFncz0iXCQkKHNoZWxsIHBrZy1jb25maWcgJCRwa2cgLS1jZmxhZ3MpIjsgXAorCSAgbGlicz0iXCQkKHNoZWxsIHBrZy1jb25maWcgJCRwa2cgLS1saWJzKSI7IFwKKwkgIG1vYz0iXCQkKHNoZWxsIHBrZy1jb25maWcgJCRwa2cgLS12YXJpYWJsZT1wcmVmaXgpL2Jpbi9tb2MiOyBcCisJICBkaXI9IiQkKHBrZy1jb25maWcgJCRwa2cgLS12YXJpYWJsZT1wcmVmaXgpIjsgXAorCWVsc2UgXAorCSAgZm9yIGQgaW4gJCRRVERJUiAvdXNyL3NoYXJlL3F0KiAvdXNyL2xpYi9xdCo7IGRvIFwKKwkgICAgaWYgWyAtZiAkJGQvaW5jbHVkZS9xY29uZmlnLmggXTsgdGhlbiBkaXI9JCRkOyBicmVhazsgZmk7IFwKKwkgIGRvbmU7IFwKKwkgIGlmIFsgLXogIiQkZGlyIiBdOyB0aGVuIFwKKwkgICAgZWNobyAiKiI7IFwKKwkgICAgZWNobyAiKiBVbmFibGUgdG8gZmluZCB0aGUgUVQgaW5zdGFsbGF0aW9uLiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQiOyBcCisJICAgIGVjaG8gIiogdGhlIFFUIGRldmVsb3BtZW50IHBhY2thZ2UgaXMgY29ycmVjdGx5IGluc3RhbGxlZCBhbmQiOyBcCisJICAgIGVjaG8gIiogZWl0aGVyIGluc3RhbGwgcGtnLWNvbmZpZyBvciBzZXQgdGhlIFFURElSIGVudmlyb25tZW50IjsgXAorCSAgICBlY2hvICIqIHZhcmlhYmxlIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiI7IFwKKwkgICAgZWNobyAiKiI7IFwKKwkgICAgZmFsc2U7IFwKKwkgIGZpOyBcCisJICBsaWJwYXRoPSQkZGlyL2xpYjsgbGliPXF0OyBvc2Rpcj0iIjsgXAorCSAgJChIT1NUQ1hYKSAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5ID4gL2Rldi9udWxsIDI+JjEgJiYgXAorCSAgICBvc2Rpcj14JCQoJChIT1NUQ1hYKSAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5KTsgXAorCSAgdGVzdCAtZCAkJGxpYnBhdGgvJCRvc2RpciAmJiBsaWJwYXRoPSQkbGlicGF0aC8kJG9zZGlyOyBcCisJICB0ZXN0IC1mICQkbGlicGF0aC9saWJxdC1tdC5zbyAmJiBsaWI9cXQtbXQ7IFwKKwkgIGNmbGFncz0iLUkkJGRpci9pbmNsdWRlIjsgXAorCSAgbGlicz0iLUwkJGxpYnBhdGggLVdsLC1ycGF0aCwkJGxpYnBhdGggLWwkJGxpYiI7IFwKKwkgIG1vYz0iJCRkaXIvYmluL21vYyI7IFwKKwlmaTsgXAorCWlmIFsgISAteCAkJGRpci9iaW4vbW9jIC1hIC14IC91c3IvYmluL21vYyBdOyB0aGVuIFwKKwkgIGVjaG8gIioiOyBcCisJICBlY2hvICIqIFVuYWJsZSB0byBmaW5kICQkZGlyL2Jpbi9tb2MsIHVzaW5nIC91c3IvYmluL21vYyBpbnN0ZWFkLiI7IFwKKwkgIGVjaG8gIioiOyBcCisJICBtb2M9Ii91c3IvYmluL21vYyI7IFwKKwlmaTsgXAorCWVjaG8gIktDX1FUX0NGTEFHUz0kJGNmbGFncyIgPiAkQDsgXAorCWVjaG8gIktDX1FUX0xJQlM9JCRsaWJzIiA+PiAkQDsgXAorCWVjaG8gIktDX1FUX01PQz0kJG1vYyIgPj4gJEAKK2VuZGlmCisKKyQob2JqKS9nY29uZi5vOiAkKG9iaikvLnRtcF9ndGtjaGVjaworCitpZmVxICgkKGdjb25mLXRhcmdldCksMSkKKy1pbmNsdWRlICQob2JqKS8udG1wX2d0a2NoZWNrCisKKyMgR1RLIG5lZWRzIHNvbWUgZXh0cmEgZWZmb3J0LCB0b28uLi4KKyQob2JqKS8udG1wX2d0a2NoZWNrOgorCUBpZiBgcGtnLWNvbmZpZyAtLWV4aXN0cyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgOyB0aGVuCQlcCisJCWlmIGBwa2ctY29uZmlnIC0tYXRsZWFzdC12ZXJzaW9uPTIuMC4wIGd0aystMi4wYDsgdGhlbgkJCVwKKwkJCXRvdWNoICRAOwkJCQkJCQkJXAorCQllbHNlCQkJCQkJCQkJXAorCQkJZWNobyAiKiI7IAkJCQkJCQlcCisJCQllY2hvICIqIEdUSysgaXMgcHJlc2VudCBidXQgdmVyc2lvbiA+PSAyLjAuMCBpcyByZXF1aXJlZC4iOwlcCisJCQllY2hvICIqIjsJCQkJCQkJXAorCQkJZmFsc2U7CQkJCQkJCQlcCisJCWZpCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJXAorCQllY2hvICIqIjsgCQkJCQkJCQlcCisJCWVjaG8gIiogVW5hYmxlIHRvIGZpbmQgdGhlIEdUSysgaW5zdGFsbGF0aW9uLiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQiOyAJXAorCQllY2hvICIqIHRoZSBHVEsrIDIuMCBkZXZlbG9wbWVudCBwYWNrYWdlIGlzIGNvcnJlY3RseSBpbnN0YWxsZWQuLi4iOyAJXAorCQllY2hvICIqIFlvdSBuZWVkIGd0aystMi4wLCBnbGliLTIuMCBhbmQgbGliZ2xhZGUtMi4wLiI7IAkJXAorCQllY2hvICIqIjsgCQkJCQkJCQlcCisJCWZhbHNlOwkJCQkJCQkJCVwKKwlmaQorZW5kaWYKKworJChvYmopL3pjb25mLnRhYi5vOiAkKG9iaikvbGV4Lnpjb25mLmMgJChvYmopL3pjb25mLmhhc2guYworCiskKG9iaikva2NvbmZpZ19sb2FkLm86ICQob2JqKS9sa2NfZGVmcy5oCisKKyQob2JqKS9xY29uZi5vOiAkKG9iaikvcWNvbmYubW9jICQob2JqKS9sa2NfZGVmcy5oCisKKyQob2JqKS9nY29uZi5vOiAkKG9iaikvbGtjX2RlZnMuaAorCiskKG9iaikvJS5tb2M6ICQoc3JjKS8lLmgKKwkkKEtDX1FUX01PQykgLWkgJDwgLW8gJEAKKworJChvYmopL2xrY19kZWZzLmg6ICQoc3JjKS9sa2NfcHJvdG8uaAorCXNlZCA8ICQ8ID4gJEAgJ3MvUChcKFteLF0qXCksLiovI2RlZmluZSBcMSAoXCpcMV9wKS8nCisKKworIyMjCisjIFRoZSBmb2xsb3dpbmcgcmVxdWlyZXMgZmxleC9iaXNvbi9ncGVyZgorIyBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgX3NoaXBwZWQgdmVyc2lvbnMsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYKKyMgeW91IGFyZSBtb2RpZnlpbmcgdGhlIGZsZXgvYmlzb24gc3JjLgorIyBMS0NfR0VOUEFSU0VSIDo9IDEKKworaWZkZWYgTEtDX0dFTlBBUlNFUgorCiskKG9iaikvemNvbmYudGFiLmM6ICQoc3JjKS96Y29uZi55CiskKG9iaikvbGV4Lnpjb25mLmM6ICQoc3JjKS96Y29uZi5sCiskKG9iaikvemNvbmYuaGFzaC5jOiAkKHNyYykvemNvbmYuZ3BlcmYKKworJS50YWIuYzogJS55CisJYmlzb24gLWwgLWIgJCogLXAgJChub3RkaXIgJCopICQ8CisJY3AgJEAgJEBfc2hpcHBlZAorCitsZXguJS5jOiAlLmwKKwlmbGV4IC1MIC1QJChub3RkaXIgJCopIC1vJEAgJDwKKwljcCAkQCAkQF9zaGlwcGVkCisKKyUuaGFzaC5jOiAlLmdwZXJmCisJZ3BlcmYgPCAkPCA+ICRACisJY3AgJEAgJEBfc2hpcHBlZAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL1BPVEZJTEVTLmluIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL1BPVEZJTEVTLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTRlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvUE9URklMRVMuaW4KQEAgLTAsMCArMSw1IEBACitzY3JpcHRzL2tjb25maWcvbWNvbmYuYworc2NyaXB0cy9rY29uZmlnL2NvbmYuYworc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKK3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCitzY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9jaGVjay5zaCBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9jaGVjay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNWZjMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2NoZWNrLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorIyBOZWVkZWQgZm9yIHN5c3RlbXMgd2l0aG91dCBnZXR0ZXh0CiskKiAteGMgLW8gL2Rldi9udWxsIC0gPiAvZGV2L251bGwgMj4mMSA8PCBFT0YKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpCit7CisJZ2V0dGV4dCgiIik7CisJcmV0dXJuIDA7Cit9CitFT0YKK2lmIFsgISAiJD8iIC1lcSAiMCIgIF07IHRoZW4KKwllY2hvIC1ES0JVSUxEX05PX05MUzsKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvY29uZi5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI0NDZhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA3MDAKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KTsKKworZW51bSB7CisJYXNrX2FsbCwKKwlhc2tfbmV3LAorCWFza19zaWxlbnQsCisJc2V0X2RlZmF1bHQsCisJc2V0X3llcywKKwlzZXRfbW9kLAorCXNldF9ubywKKwlzZXRfcmFuZG9tCit9IGlucHV0X21vZGUgPSBhc2tfYWxsOworY2hhciAqZGVmY29uZmlnX2ZpbGU7CisKK3N0YXRpYyBpbnQgaW5kZW50ID0gMTsKK3N0YXRpYyBpbnQgdmFsaWRfc3RkaW4gPSAxOworc3RhdGljIGludCBjb25mX2NudDsKK3N0YXRpYyBjaGFyIGxpbmVbMTI4XTsKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqcm9vdEVudHJ5OworCitzdGF0aWMgY2hhciBub2hlbHBfdGV4dFtdID0gTl8oIlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LlxuIik7CisKK3N0YXRpYyB2b2lkIHN0cmlwKGNoYXIgKnN0cikKK3sKKwljaGFyICpwID0gc3RyOworCWludCBsOworCisJd2hpbGUgKChpc3NwYWNlKCpwKSkpCisJCXArKzsKKwlsID0gc3RybGVuKHApOworCWlmIChwICE9IHN0cikKKwkJbWVtbW92ZShzdHIsIHAsIGwgKyAxKTsKKwlpZiAoIWwpCisJCXJldHVybjsKKwlwID0gc3RyICsgbCAtIDE7CisJd2hpbGUgKChpc3NwYWNlKCpwKSkpCisJCSpwLS0gPSAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19zdGRpbih2b2lkKQoreworCWlmICghdmFsaWRfc3RkaW4gJiYgaW5wdXRfbW9kZSA9PSBhc2tfc2lsZW50KSB7CisJCXByaW50ZihfKCJhYm9ydGVkIVxuXG4iKSk7CisJCXByaW50ZihfKCJDb25zb2xlIGlucHV0L291dHB1dCBpcyByZWRpcmVjdGVkLiAiKSk7CisJCXByaW50ZihfKCJSdW4gJ21ha2Ugb2xkY29uZmlnJyB0byB1cGRhdGUgY29uZmlndXJhdGlvbi5cblxuIikpOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9hc2t2YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKmRlZikKK3sKKwllbnVtIHN5bWJvbF90eXBlIHR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwl0cmlzdGF0ZSB2YWw7CisKKwlpZiAoIXN5bV9oYXNfdmFsdWUoc3ltKSkKKwkJcHJpbnRmKCIoTkVXKSAiKTsKKworCWxpbmVbMF0gPSAnXG4nOworCWxpbmVbMV0gPSAwOworCisJaWYgKCFzeW1faXNfY2hhbmdhYmxlKHN5bSkpIHsKKwkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJbGluZVswXSA9ICdcbic7CisJCWxpbmVbMV0gPSAwOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJY2FzZSBzZXRfbm86CisJY2FzZSBzZXRfbW9kOgorCWNhc2Ugc2V0X3llczoKKwljYXNlIHNldF9yYW5kb206CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJCXByaW50ZigiJXNcbiIsIGRlZik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBhc2tfbmV3OgorCWNhc2UgYXNrX3NpbGVudDoKKwkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJCXJldHVybjsKKwkJfQorCQljaGVja19zdGRpbigpOworCWNhc2UgYXNrX2FsbDoKKwkJZmZsdXNoKHN0ZG91dCk7CisJCWZnZXRzKGxpbmUsIDEyOCwgc3RkaW4pOworCQlyZXR1cm47CisJY2FzZSBzZXRfZGVmYXVsdDoKKwkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJOworCX0KKwlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwljYXNlIHNldF95ZXM6CisJCWlmIChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKSkgeworCQkJbGluZVswXSA9ICd5JzsKKwkJCWxpbmVbMV0gPSAnXG4nOworCQkJbGluZVsyXSA9IDA7CisJCQlicmVhazsKKwkJfQorCWNhc2Ugc2V0X21vZDoKKwkJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgeworCQkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBtb2QpKSB7CisJCQkJbGluZVswXSA9ICdtJzsKKwkJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCQlsaW5lWzJdID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKSkgeworCQkJCWxpbmVbMF0gPSAneSc7CisJCQkJbGluZVsxXSA9ICdcbic7CisJCQkJbGluZVsyXSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwljYXNlIHNldF9ubzoKKwkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubykpIHsKKwkJCWxpbmVbMF0gPSAnbic7CisJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCWxpbmVbMl0gPSAwOworCQkJYnJlYWs7CisJCX0KKwljYXNlIHNldF9yYW5kb206CisJCWRvIHsKKwkJCXZhbCA9ICh0cmlzdGF0ZSkocmFuZG9tKCkgJSAzKTsKKwkJfSB3aGlsZSAoIXN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB2YWwpKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzogbGluZVswXSA9ICduJzsgYnJlYWs7CisJCWNhc2UgbW9kOiBsaW5lWzBdID0gJ20nOyBicmVhazsKKwkJY2FzZSB5ZXM6IGxpbmVbMF0gPSAneSc7IGJyZWFrOworCQl9CisJCWxpbmVbMV0gPSAnXG4nOworCQlsaW5lWzJdID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXByaW50ZigiJXMiLCBsaW5lKTsKK30KKworaW50IGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwljb25zdCBjaGFyICpkZWY7CisKKwl3aGlsZSAoMSkgeworCQlwcmludGYoIiUqcyVzICIsIGluZGVudCAtIDEsICIiLCBtZW51LT5wcm9tcHQtPnRleHQpOworCQlwcmludGYoIiglcykgIiwgc3ltLT5uYW1lKTsKKwkJZGVmID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJaWYgKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpCisJCQlwcmludGYoIlslc10gIiwgZGVmKTsKKwkJY29uZl9hc2t2YWx1ZShzeW0sIGRlZik7CisJCXN3aXRjaCAobGluZVswXSkgeworCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQkvKiBwcmludCBoZWxwICovCisJCQlpZiAobGluZVsxXSA9PSAnXG4nKSB7CisJCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHAgPyBtZW51LT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQkJZGVmID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWxpbmVbc3RybGVuKGxpbmUpLTFdID0gMDsKKwkJCWRlZiA9IGxpbmU7CisJCX0KKwkJaWYgKGRlZiAmJiBzeW1fc2V0X3N0cmluZ192YWx1ZShzeW0sIGRlZikpCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29uZl9zeW0oc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCXRyaXN0YXRlIG9sZHZhbCwgbmV3dmFsOworCWNvbnN0IGNoYXIgKmhlbHA7CisKKwl3aGlsZSAoMSkgeworCQlwcmludGYoIiUqcyVzICIsIGluZGVudCAtIDEsICIiLCBtZW51LT5wcm9tcHQtPnRleHQpOworCQlpZiAoc3ltLT5uYW1lKQorCQkJcHJpbnRmKCIoJXMpICIsIHN5bS0+bmFtZSk7CisJCXB1dGNoYXIoJ1snKTsKKwkJb2xkdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlzd2l0Y2ggKG9sZHZhbCkgeworCQljYXNlIG5vOgorCQkJcHV0Y2hhcignTicpOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJcHV0Y2hhcignTScpOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJcHV0Y2hhcignWScpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG9sZHZhbCAhPSBubyAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pKQorCQkJcHJpbnRmKCIvbiIpOworCQlpZiAob2xkdmFsICE9IG1vZCAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKSkKKwkJCXByaW50ZigiL20iKTsKKwkJaWYgKG9sZHZhbCAhPSB5ZXMgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpCisJCQlwcmludGYoIi95Iik7CisJCWlmIChzeW0tPmhlbHApCisJCQlwcmludGYoIi8/Iik7CisJCXByaW50ZigiXSAiKTsKKwkJY29uZl9hc2t2YWx1ZShzeW0sIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQlzdHJpcChsaW5lKTsKKworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnbic6CisJCWNhc2UgJ04nOgorCQkJbmV3dmFsID0gbm87CisJCQlpZiAoIWxpbmVbMV0gfHwgIXN0cmNtcCgmbGluZVsxXSwgIm8iKSkKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlICdtJzoKKwkJY2FzZSAnTSc6CisJCQluZXd2YWwgPSBtb2Q7CisJCQlpZiAoIWxpbmVbMV0pCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSAneSc6CisJCWNhc2UgJ1knOgorCQkJbmV3dmFsID0geWVzOworCQkJaWYgKCFsaW5lWzFdIHx8ICFzdHJjbXAoJmxpbmVbMV0sICJlcyIpKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCWNhc2UgMDoKKwkJCW5ld3ZhbCA9IG9sZHZhbDsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWdvdG8gaGVscDsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKSkKKwkJCXJldHVybiAwOworaGVscDoKKwkJaGVscCA9IG5vaGVscF90ZXh0OworCQlpZiAoc3ltLT5oZWxwKQorCQkJaGVscCA9IHN5bS0+aGVscDsKKwkJcHJpbnRmKCJcbiVzXG4iLCBoZWxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29uZl9jaG9pY2Uoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltLCAqZGVmX3N5bTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJYm9vbCBpc19uZXc7CisKKwlzeW0gPSBtZW51LT5zeW07CisJaXNfbmV3ID0gIXN5bV9oYXNfdmFsdWUoc3ltKTsKKwlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pKSB7CisJCWNvbmZfc3ltKG1lbnUpOworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgeworCQljYXNlIG5vOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgbW9kOgorCQkJcmV0dXJuIDA7CisJCWNhc2UgeWVzOgorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgeworCQljYXNlIG5vOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgbW9kOgorCQkJcHJpbnRmKCIlKnMlc1xuIiwgaW5kZW50IC0gMSwgIiIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSB5ZXM6CisJCQlicmVhazsKKwkJfQorCX0KKworCXdoaWxlICgxKSB7CisJCWludCBjbnQsIGRlZjsKKworCQlwcmludGYoIiUqcyVzXG4iLCBpbmRlbnQgLSAxLCAiIiwgbWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKwkJZGVmX3N5bSA9IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKHN5bSk7CisJCWNudCA9IGRlZiA9IDA7CisJCWxpbmVbMF0gPSAwOworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmICghbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghY2hpbGQtPnN5bSkgeworCQkJCXByaW50ZigiJSpjICVzXG4iLCBpbmRlbnQsICcqJywgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQljbnQrKzsKKwkJCWlmIChjaGlsZC0+c3ltID09IGRlZl9zeW0pIHsKKwkJCQlkZWYgPSBjbnQ7CisJCQkJcHJpbnRmKCIlKmMiLCBpbmRlbnQsICc+Jyk7CisJCQl9IGVsc2UKKwkJCQlwcmludGYoIiUqYyIsIGluZGVudCwgJyAnKTsKKwkJCXByaW50ZigiICVkLiAlcyIsIGNudCwgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCQlpZiAoY2hpbGQtPnN5bS0+bmFtZSkKKwkJCQlwcmludGYoIiAoJXMpIiwgY2hpbGQtPnN5bS0+bmFtZSk7CisJCQlpZiAoIXN5bV9oYXNfdmFsdWUoY2hpbGQtPnN5bSkpCisJCQkJcHJpbnRmKCIgKE5FVykiKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCQlwcmludGYoIiUqc2Nob2ljZSIsIGluZGVudCAtIDEsICIiKTsKKwkJaWYgKGNudCA9PSAxKSB7CisJCQlwcmludGYoIlsxXTogMVxuIik7CisJCQlnb3RvIGNvbmZfY2hpbGRzOworCQl9CisJCXByaW50ZigiWzEtJWQiLCBjbnQpOworCQlpZiAoc3ltLT5oZWxwKQorCQkJcHJpbnRmKCI/Iik7CisJCXByaW50ZigiXTogIik7CisJCXN3aXRjaCAoaW5wdXRfbW9kZSkgeworCQljYXNlIGFza19uZXc6CisJCWNhc2UgYXNrX3NpbGVudDoKKwkJCWlmICghaXNfbmV3KSB7CisJCQkJY250ID0gZGVmOworCQkJCXByaW50ZigiJWRcbiIsIGNudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljaGVja19zdGRpbigpOworCQljYXNlIGFza19hbGw6CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCWZnZXRzKGxpbmUsIDEyOCwgc3RkaW4pOworCQkJc3RyaXAobGluZSk7CisJCQlpZiAobGluZVswXSA9PSAnPycpIHsKKwkJCQlwcmludGYoIlxuJXNcbiIsIG1lbnUtPnN5bS0+aGVscCA/CisJCQkJCW1lbnUtPnN5bS0+aGVscCA6IG5vaGVscF90ZXh0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghbGluZVswXSkKKwkJCQljbnQgPSBkZWY7CisJCQllbHNlIGlmIChpc2RpZ2l0KGxpbmVbMF0pKQorCQkJCWNudCA9IGF0b2kobGluZSk7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSBzZXRfcmFuZG9tOgorCQkJZGVmID0gKHJhbmRvbSgpICUgY250KSArIDE7CisJCWNhc2Ugc2V0X2RlZmF1bHQ6CisJCWNhc2Ugc2V0X3llczoKKwkJY2FzZSBzZXRfbW9kOgorCQljYXNlIHNldF9ubzoKKwkJCWNudCA9IGRlZjsKKwkJCXByaW50ZigiJWRcbiIsIGNudCk7CisJCQlicmVhazsKKwkJfQorCisJY29uZl9jaGlsZHM6CisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKCFjaGlsZC0+c3ltIHx8ICFtZW51X2lzX3Zpc2libGUoY2hpbGQpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEtLWNudCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIWNoaWxkKQorCQkJY29udGludWU7CisJCWlmIChzdHJsZW4obGluZSkgPiAwICYmIGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPT0gJz8nKSB7CisJCQlwcmludGYoIlxuJXNcbiIsIGNoaWxkLT5zeW0tPmhlbHAgPworCQkJCWNoaWxkLT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzeW1fc2V0X2Nob2ljZV92YWx1ZShzeW0sIGNoaWxkLT5zeW0pOworCQlpZiAoY2hpbGQtPmxpc3QpIHsKKwkJCWluZGVudCArPSAyOworCQkJY29uZihjaGlsZC0+bGlzdCk7CisJCQlpbmRlbnQgLT0gMjsKKwkJfQorCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmYoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisKKwlpZiAoIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcmV0dXJuOworCisJc3ltID0gbWVudS0+c3ltOworCXByb3AgPSBtZW51LT5wcm9tcHQ7CisJaWYgKHByb3ApIHsKKwkJY29uc3QgY2hhciAqcHJvbXB0OworCisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfTUVOVToKKwkJCWlmIChpbnB1dF9tb2RlID09IGFza19zaWxlbnQgJiYgcm9vdEVudHJ5ICE9IG1lbnUpIHsKKwkJCQljaGVja19jb25mKG1lbnUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJY2FzZSBQX0NPTU1FTlQ6CisJCQlwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJCQlpZiAocHJvbXB0KQorCQkJCXByaW50ZigiJSpjXG4lKmMgJXNcbiUqY1xuIiwKKwkJCQkJaW5kZW50LCAnKicsCisJCQkJCWluZGVudCwgJyonLCBwcm9tcHQsCisJCQkJCWluZGVudCwgJyonKTsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCX0KKworCWlmICghc3ltKQorCQlnb3RvIGNvbmZfY2hpbGRzOworCisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQljb25mX2Nob2ljZShtZW51KTsKKwkJaWYgKHN5bS0+Y3Vyci50cmkgIT0gbW9kKQorCQkJcmV0dXJuOworCQlnb3RvIGNvbmZfY2hpbGRzOworCX0KKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCWNvbmZfc3RyaW5nKG1lbnUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb25mX3N5bShtZW51KTsKKwkJYnJlYWs7CisJfQorCitjb25mX2NoaWxkczoKKwlpZiAoc3ltKQorCQlpbmRlbnQgKz0gMjsKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWNvbmYoY2hpbGQpOworCWlmIChzeW0pCisJCWluZGVudCAtPSAyOworfQorCitzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisKKwlpZiAoIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcmV0dXJuOworCisJc3ltID0gbWVudS0+c3ltOworCWlmIChzeW0gJiYgIXN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pIHx8CisJCSAgICAoc3ltX2lzX2Nob2ljZShzeW0pICYmIHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSA9PSB5ZXMpKSB7CisJCQlpZiAoIWNvbmZfY250KyspCisJCQkJcHJpbnRmKF8oIipcbiogUmVzdGFydCBjb25maWcuLi5cbipcbiIpKTsKKwkJCXJvb3RFbnRyeSA9IG1lbnVfZ2V0X3BhcmVudF9tZW51KG1lbnUpOworCQkJY29uZihyb290RW50cnkpOworCQl9CisJfQorCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQljaGVja19jb25mKGNoaWxkKTsKK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJaW50IGkgPSAxOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHN0YXQgdG1wc3RhdDsKKworCWlmIChhYyA+IGkgJiYgYXZbaV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXZbaSsrXVsxXSkgeworCQljYXNlICdvJzoKKwkJCWlucHV0X21vZGUgPSBhc2tfbmV3OworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7CisJCQl2YWxpZF9zdGRpbiA9IGlzYXR0eSgwKTsgLy9iYm94OiAmJiBpc2F0dHkoMSkgJiYgaXNhdHR5KDIpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJaW5wdXRfbW9kZSA9IHNldF9kZWZhdWx0OworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJaW5wdXRfbW9kZSA9IHNldF9kZWZhdWx0OworCQkJZGVmY29uZmlnX2ZpbGUgPSBhdltpKytdOworCQkJaWYgKCFkZWZjb25maWdfZmlsZSkgeworCQkJCXByaW50ZihfKCIlczogTm8gZGVmYXVsdCBjb25maWcgZmlsZSBzcGVjaWZpZWRcbiIpLAorCQkJCQlhdlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfbm87CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpbnB1dF9tb2RlID0gc2V0X21vZDsKKwkJCWJyZWFrOworCQljYXNlICd5JzoKKwkJCWlucHV0X21vZGUgPSBzZXRfeWVzOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJaW5wdXRfbW9kZSA9IHNldF9yYW5kb207CisJCQlzcmFuZG9tKHRpbWUoTlVMTCkpOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJCWZwcmludGYoc3RkZXJyLCAiU2VlIFJFQURNRSBmb3IgdXNhZ2UgaW5mb1xuIik7CisJCQlleGl0KDApOworCQl9CisJfQorCW5hbWUgPSBhdltpXTsKKwlpZiAoIW5hbWUpIHsKKwkJcHJpbnRmKF8oIiVzOiBLY29uZmlnIGZpbGUgbWlzc2luZ1xuIiksIGF2WzBdKTsKKwl9CisJY29uZl9wYXJzZShuYW1lKTsKKwkvL3pjb25mZHVtcChzdGRvdXQpOworCXN3aXRjaCAoaW5wdXRfbW9kZSkgeworCWNhc2Ugc2V0X2RlZmF1bHQ6CisJCWlmICghZGVmY29uZmlnX2ZpbGUpCisJCQlkZWZjb25maWdfZmlsZSA9IGNvbmZfZ2V0X2RlZmF1bHRfY29uZm5hbWUoKTsKKwkJaWYgKGNvbmZfcmVhZChkZWZjb25maWdfZmlsZSkpIHsKKwkJCXByaW50ZigiKioqXG4iCisJCQkJIioqKiBDYW4ndCBmaW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbiBcIiVzXCIhXG4iCisJCQkJIioqKlxuIiwgZGVmY29uZmlnX2ZpbGUpOworCQkJZXhpdCgxKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGFza19zaWxlbnQ6CisJCWlmIChzdGF0KCIuY29uZmlnIiwgJnRtcHN0YXQpKSB7CisJCQlwcmludGYoXygiKioqXG4iCisJCQkJIioqKiBZb3UgaGF2ZSBub3QgeWV0IGNvbmZpZ3VyZWQgYnVzeWJveCFcbiIKKwkJCQkiKioqXG4iCisJCQkJIioqKiBQbGVhc2UgcnVuIHNvbWUgY29uZmlndXJhdG9yIChlLmcuIFwibWFrZSBvbGRjb25maWdcIiBvclxuIgorCQkJCSIqKiogXCJtYWtlIG1lbnVjb25maWdcIiBvciBcIm1ha2UgZGVmY29uZmlnXCIpLlxuIgorCQkJCSIqKipcbiIpKTsKKwkJCWV4aXQoMSk7CisJCX0KKwljYXNlIGFza19hbGw6CisJY2FzZSBhc2tfbmV3OgorCQljb25mX3JlYWQoTlVMTCk7CisJCWJyZWFrOworCWNhc2Ugc2V0X25vOgorCWNhc2Ugc2V0X21vZDoKKwljYXNlIHNldF95ZXM6CisJY2FzZSBzZXRfcmFuZG9tOgorCQluYW1lID0gZ2V0ZW52KCJLQ09ORklHX0FMTENPTkZJRyIpOworCQlpZiAobmFtZSAmJiAhc3RhdChuYW1lLCAmdG1wc3RhdCkpIHsKKwkJCWNvbmZfcmVhZF9zaW1wbGUobmFtZSk7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwkJY2FzZSBzZXRfbm86CSBuYW1lID0gImFsbG5vLmNvbmZpZyI7IGJyZWFrOworCQljYXNlIHNldF9tb2Q6CSBuYW1lID0gImFsbG1vZC5jb25maWciOyBicmVhazsKKwkJY2FzZSBzZXRfeWVzOgkgbmFtZSA9ICJhbGx5ZXMuY29uZmlnIjsgYnJlYWs7CisJCWNhc2Ugc2V0X3JhbmRvbTogbmFtZSA9ICJhbGxyYW5kb20uY29uZmlnIjsgYnJlYWs7CisJCWRlZmF1bHQ6IGJyZWFrOworCQl9CisJCWlmICghc3RhdChuYW1lLCAmdG1wc3RhdCkpCisJCQljb25mX3JlYWRfc2ltcGxlKG5hbWUpOworCQllbHNlIGlmICghc3RhdCgiYWxsLmNvbmZpZyIsICZ0bXBzdGF0KSkKKwkJCWNvbmZfcmVhZF9zaW1wbGUoImFsbC5jb25maWciKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGlucHV0X21vZGUgIT0gYXNrX3NpbGVudCkgeworCQlyb290RW50cnkgPSAmcm9vdG1lbnU7CisJCWNvbmYoJnJvb3RtZW51KTsKKwkJaWYgKGlucHV0X21vZGUgPT0gYXNrX2FsbCkgeworCQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7CisJCQl2YWxpZF9zdGRpbiA9IDE7CisJCX0KKwl9CisJZG8geworCQljb25mX2NudCA9IDA7CisJCWNoZWNrX2NvbmYoJnJvb3RtZW51KTsKKwl9IHdoaWxlIChjb25mX2NudCk7CisJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEVycm9yIGR1cmluZyB3cml0aW5nIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyZDcwZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC0wLDAgKzEsNTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIHZvaWQgY29uZl93YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbmZfZmlsZW5hbWU7CitzdGF0aWMgaW50IGNvbmZfbGluZW5vLCBjb25mX3dhcm5pbmdzLCBjb25mX3Vuc2F2ZWQ7CisKK2NvbnN0IGNoYXIgY29uZl9kZWZfZmlsZW5hbWVbXSA9ICIuY29uZmlnIjsKKworY29uc3QgY2hhciBjb25mX2RlZm5hbWVbXSA9ICIvZGV2L251bGwiOyAvL2Jib3gKKworY29uc3QgY2hhciAqY29uZl9jb25mbmFtZXNbXSA9IHsKKwljb25mX2RlZl9maWxlbmFtZSwKKwljb25mX2RlZm5hbWUsCisJTlVMTCwKK307CisKK3N0YXRpYyB2b2lkIGNvbmZfd2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6d2FybmluZzogIiwgY29uZl9maWxlbmFtZSwgY29uZl9saW5lbm8pOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCXZhX2VuZChhcCk7CisJY29uZl93YXJuaW5ncysrOworfQorCitzdGF0aWMgY2hhciAqY29uZl9leHBhbmRfdmFsdWUoY29uc3QgY2hhciAqaW4pCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWNvbnN0IGNoYXIgKnNyYzsKKwlzdGF0aWMgY2hhciByZXNfdmFsdWVbU1lNQk9MX01BWExFTkdUSF07CisJY2hhciAqZHN0LCBuYW1lW1NZTUJPTF9NQVhMRU5HVEhdOworCisJcmVzX3ZhbHVlWzBdID0gMDsKKwlkc3QgPSBuYW1lOworCXdoaWxlICgoc3JjID0gc3RyY2hyKGluLCAnJCcpKSkgeworCQlzdHJuY2F0KHJlc192YWx1ZSwgaW4sIHNyYyAtIGluKTsKKwkJc3JjKys7CisJCWRzdCA9IG5hbWU7CisJCXdoaWxlIChpc2FsbnVtKCpzcmMpIHx8ICpzcmMgPT0gJ18nKQorCQkJKmRzdCsrID0gKnNyYysrOworCQkqZHN0ID0gMDsKKwkJc3ltID0gc3ltX2xvb2t1cChuYW1lLCAwKTsKKwkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJc3RyY2F0KHJlc192YWx1ZSwgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisJCWluID0gc3JjOworCX0KKwlzdHJjYXQocmVzX3ZhbHVlLCBpbik7CisKKwlyZXR1cm4gcmVzX3ZhbHVlOworfQorCitjaGFyICpjb25mX2dldF9kZWZhdWx0X2NvbmZuYW1lKHZvaWQpCit7CisJc3RydWN0IHN0YXQgYnVmOworCXN0YXRpYyBjaGFyICpmdWxsbmFtZSA9IE5VTEw7CisJY2hhciAqZW52LCAqbmFtZTsKKworCW5hbWUgPSBjb25mX2V4cGFuZF92YWx1ZShjb25mX2RlZm5hbWUpOworCWVudiA9IGdldGVudihTUkNUUkVFKTsKKwlpZiAoZW52KSB7CisJCWZ1bGxuYW1lID0gcmVhbGxvYyhmdWxsbmFtZSwgc3RybGVuKGVudikgKyBzdHJsZW4obmFtZSkgKyAyKTsKKwkJc3ByaW50ZihmdWxsbmFtZSwgIiVzLyVzIiwgZW52LCBuYW1lKTsKKwkJaWYgKCFzdGF0KGZ1bGxuYW1lLCAmYnVmKSkKKwkJCXJldHVybiBmdWxsbmFtZTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK2ludCBjb25mX3JlYWRfc2ltcGxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRklMRSAqaW4gPSBOVUxMOworCWNoYXIgbGluZVsxMDI0XTsKKwljaGFyICpwLCAqcDI7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJaWYgKG5hbWUpIHsKKwkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwl9IGVsc2UgeworCQljb25zdCBjaGFyICoqbmFtZXMgPSBjb25mX2NvbmZuYW1lczsKKwkJd2hpbGUgKChuYW1lID0gKm5hbWVzKyspKSB7CisJCQluYW1lID0gY29uZl9leHBhbmRfdmFsdWUobmFtZSk7CisJCQlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCQkJaWYgKGluKSB7CisJCQkJcHJpbnRmKF8oIiNcbiIKKwkJCQkgICAgICAgICAiIyB1c2luZyBkZWZhdWx0cyBmb3VuZCBpbiAlc1xuIgorCQkJCSAgICAgICAgICIjXG4iKSwgbmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKCFpbikKKwkJcmV0dXJuIDE7CisKKwljb25mX2ZpbGVuYW1lID0gbmFtZTsKKwljb25mX2xpbmVubyA9IDA7CisJY29uZl93YXJuaW5ncyA9IDA7CisJY29uZl91bnNhdmVkID0gMDsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJc3ltLT5mbGFncyB8PSBTWU1CT0xfTkVXIHwgU1lNQk9MX0NIQU5HRUQ7CisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCisJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfVkFMSUQ7CisJCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJCWNhc2UgU19JTlQ6CisJCWNhc2UgU19IRVg6CisJCWNhc2UgU19TVFJJTkc6CisJCQlpZiAoc3ltLT51c2VyLnZhbCkKKwkJCQlmcmVlKHN5bS0+dXNlci52YWwpOworCQlkZWZhdWx0OgorCQkJc3ltLT51c2VyLnZhbCA9IE5VTEw7CisJCQlzeW0tPnVzZXIudHJpID0gbm87CisJCX0KKwl9CisKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikpIHsKKwkJY29uZl9saW5lbm8rKzsKKwkJc3ltID0gTlVMTDsKKwkJc3dpdGNoIChsaW5lWzBdKSB7CisJCWNhc2UgJyMnOgorCQkJaWYgKG1lbWNtcChsaW5lICsgMiwgIkNPTkZJR18iLCA3KSkKKwkJCQljb250aW51ZTsKKwkJCXAgPSBzdHJjaHIobGluZSArIDksICcgJyk7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQkqcCsrID0gMDsKKwkJCWlmIChzdHJuY21wKHAsICJpcyBub3Qgc2V0IiwgMTApKQorCQkJCWNvbnRpbnVlOworCQkJc3ltID0gc3ltX2ZpbmQobGluZSArIDkpOworCQkJaWYgKCFzeW0pIHsKKwkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzIiwgbGluZSArIDkpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSkgeworCQkJCWNvbmZfd2FybmluZygidHJ5aW5nIHRvIHJlYXNzaWduIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJc3ltLT51c2VyLnRyaSA9IG5vOworCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdDJzoKKwkJCWlmIChtZW1jbXAobGluZSwgIkNPTkZJR18iLCA3KSkgeworCQkJCWNvbmZfd2FybmluZygidW5leHBlY3RlZCBkYXRhIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwID0gc3RyY2hyKGxpbmUgKyA3LCAnPScpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJKnArKyA9IDA7CisJCQlwMiA9IHN0cmNocihwLCAnXG4nKTsKKwkJCWlmIChwMikKKwkJCQkqcDIgPSAwOworCQkJc3ltID0gc3ltX2ZpbmQobGluZSArIDcpOworCQkJaWYgKCFzeW0pIHsKKwkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzIiwgbGluZSArIDcpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSkgeworCQkJCWNvbmZfd2FybmluZygidHJ5aW5nIHRvIHJlYXNzaWduIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCWlmIChwWzBdID09ICdtJykgeworCQkJCQlzeW0tPnVzZXIudHJpID0gbW9kOworCQkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQkJCQlicmVhazsKKwkJCQl9CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCQlpZiAocFswXSA9PSAneScpIHsKKwkJCQkJc3ltLT51c2VyLnRyaSA9IHllczsKKwkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChwWzBdID09ICduJykgeworCQkJCQlzeW0tPnVzZXIudHJpID0gbm87CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU19TVFJJTkc6CisJCQkJaWYgKCpwKysgIT0gJyInKQorCQkJCQlicmVhazsKKwkJCQlmb3IgKHAyID0gcDsgKHAyID0gc3RycGJyayhwMiwgIlwiXFwiKSk7IHAyKyspIHsKKwkJCQkJaWYgKCpwMiA9PSAnIicpIHsKKwkJCQkJCSpwMiA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQltZW1tb3ZlKHAyLCBwMiArIDEsIHN0cmxlbihwMikpOworCQkJCX0KKwkJCQlpZiAoIXAyKSB7CisJCQkJCWNvbmZfd2FybmluZygiaW52YWxpZCBzdHJpbmcgZm91bmQiKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJY2FzZSBTX0lOVDoKKwkJCWNhc2UgU19IRVg6CisJCQkJaWYgKHN5bV9zdHJpbmdfdmFsaWQoc3ltLCBwKSkgeworCQkJCQlzeW0tPnVzZXIudmFsID0gc3RyZHVwKHApOworCQkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChwWzBdKSAvKiBiYm94ICovCisJCQkJCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb25mX3dhcm5pbmcoInVuZXhwZWN0ZWQgZGF0YSIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN5bSAmJiBzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpIHsKKwkJCXN0cnVjdCBzeW1ib2wgKmNzID0gcHJvcF9nZXRfc3ltYm9sKHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKSk7CisJCQlzd2l0Y2ggKHN5bS0+dXNlci50cmkpIHsKKwkJCWNhc2Ugbm86CisJCQkJYnJlYWs7CisJCQljYXNlIG1vZDoKKwkJCQlpZiAoY3MtPnVzZXIudHJpID09IHllcykgeworCQkJCQljb25mX3dhcm5pbmcoIiVzIGNyZWF0ZXMgaW5jb25zaXN0ZW50IGNob2ljZSBzdGF0ZSIsIHN5bS0+bmFtZSk7CisJCQkJCWNzLT5mbGFncyB8PSBTWU1CT0xfTkVXOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgeWVzOgorCQkJCWlmIChjcy0+dXNlci50cmkgIT0gbm8pIHsKKwkJCQkJY29uZl93YXJuaW5nKCIlcyBjcmVhdGVzIGluY29uc2lzdGVudCBjaG9pY2Ugc3RhdGUiLCBzeW0tPm5hbWUpOworCQkJCQljcy0+ZmxhZ3MgfD0gU1lNQk9MX05FVzsKKwkJCQl9IGVsc2UKKwkJCQkJY3MtPnVzZXIudmFsID0gc3ltOworCQkJCWJyZWFrOworCQkJfQorCQkJY3MtPnVzZXIudHJpID0gRV9PUihjcy0+dXNlci50cmksIHN5bS0+dXNlci50cmkpOworCQl9CisJfQorCWZjbG9zZShpbik7CisKKwlpZiAobW9kdWxlc19zeW0pCisJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbmZfcmVhZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisJaW50IGk7CisKKwlpZiAoY29uZl9yZWFkX3NpbXBsZShuYW1lKSkKKwkJcmV0dXJuIDE7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgfHwgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQVVUTykpCisJCQlnb3RvIHN5bV9vazsKKwkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSAmJiAoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpIHsKKwkJCS8qIGNoZWNrIHRoYXQgY2FsY3VsYXRlZCB2YWx1ZSBhZ3JlZXMgd2l0aCBzYXZlZCB2YWx1ZSAqLworCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCWlmIChzeW0tPnVzZXIudHJpICE9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCFzeW1faXNfY2hvaWNlKHN5bSkpCisJCQkJCWdvdG8gc3ltX29rOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoIXN0cmNtcChzeW0tPmN1cnIudmFsLCBzeW0tPnVzZXIudmFsKSkKKwkJCQkJZ290byBzeW1fb2s7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN5bV9oYXNfdmFsdWUoc3ltKSAmJiAhKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpKQorCQkJLyogbm8gcHJldmlvdXMgdmFsdWUgYW5kIG5vdCBzYXZlZCAqLworCQkJZ290byBzeW1fb2s7CisJCWNvbmZfdW5zYXZlZCsrOworCQkvKiBtYXliZSBwcmludCB2YWx1ZSBpbiB2ZXJib3NlIG1vZGUuLi4gKi8KKwlzeW1fb2s6CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkgJiYgIXN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkgeworCQkJaWYgKHN5bS0+dmlzaWJsZSA9PSBubykKKwkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ORVc7CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX1NUUklORzoKKwkJCWNhc2UgU19JTlQ6CisJCQljYXNlIFNfSEVYOgorCQkJCWlmICghc3ltX3N0cmluZ193aXRoaW5fcmFuZ2Uoc3ltLCBzeW0tPnVzZXIudmFsKSkgeworCQkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ORVc7CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9WQUxJRDsKKwkJCQl9CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJY29udGludWU7CisJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJCWZvciAoZSA9IHByb3AtPmV4cHI7IGU7IGUgPSBlLT5sZWZ0LmV4cHIpCisJCQlpZiAoZS0+cmlnaHQuc3ltLT52aXNpYmxlICE9IG5vKQorCQkJCXN5bS0+ZmxhZ3MgfD0gZS0+cmlnaHQuc3ltLT5mbGFncyAmIFNZTUJPTF9ORVc7CisJfQorCisJc3ltX2NoYW5nZV9jb3VudCA9IGNvbmZfd2FybmluZ3MgfHwgY29uZl91bnNhdmVkOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25mX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRklMRSAqb3V0LCAqb3V0X2g7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICptZW51OworCWNvbnN0IGNoYXIgKmJhc2VuYW1lOworCWNoYXIgZGlybmFtZVsxMjhdLCB0bXBuYW1lWzEyOF0sIG5ld25hbWVbMTI4XTsKKwlpbnQgdHlwZSwgbDsKKwljb25zdCBjaGFyICpzdHI7CisJdGltZV90IG5vdzsKKwlpbnQgdXNlX3RpbWVzdGFtcCA9IDE7CisJY2hhciAqZW52OworCisJZGlybmFtZVswXSA9IDA7CisJaWYgKG5hbWUgJiYgbmFtZVswXSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqc2xhc2g7CisKKwkJaWYgKCFzdGF0KG5hbWUsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJc3RyY3B5KGRpcm5hbWUsIG5hbWUpOworCQkJc3RyY2F0KGRpcm5hbWUsICIvIik7CisJCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQl9IGVsc2UgaWYgKChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpIHsKKwkJCWludCBzaXplID0gc2xhc2ggLSBuYW1lICsgMTsKKwkJCW1lbWNweShkaXJuYW1lLCBuYW1lLCBzaXplKTsKKwkJCWRpcm5hbWVbc2l6ZV0gPSAwOworCQkJaWYgKHNsYXNoWzFdKQorCQkJCWJhc2VuYW1lID0gc2xhc2ggKyAxOworCQkJZWxzZQorCQkJCWJhc2VuYW1lID0gY29uZl9kZWZfZmlsZW5hbWU7CisJCX0gZWxzZQorCQkJYmFzZW5hbWUgPSBuYW1lOworCX0gZWxzZQorCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCisJc3ByaW50ZihuZXduYW1lLCAiJXMudG1wY29uZmlnLiVkIiwgZGlybmFtZSwgKGludClnZXRwaWQoKSk7CisJb3V0ID0gZm9wZW4obmV3bmFtZSwgInciKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisJb3V0X2ggPSBOVUxMOworCWlmICghbmFtZSkgeworCQlvdXRfaCA9IGZvcGVuKCIudG1wY29uZmlnLmgiLCAidyIpOworCQlpZiAoIW91dF9oKQorCQkJcmV0dXJuIDE7CisJCWZpbGVfd3JpdGVfZGVwKE5VTEwpOworCX0KKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxWRVJTSU9OIiwgMCk7CisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwl0aW1lKCZub3cpOworCWVudiA9IGdldGVudigiS0NPTkZJR19OT1RJTUVTVEFNUCIpOworCWlmIChlbnYgJiYgKmVudikKKwkJdXNlX3RpbWVzdGFtcCA9IDA7CisKKwlmcHJpbnRmKG91dCwgXygiI1xuIgorCQkgICAgICAgIiMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXRcbiIKKwkJICAgICAgICIjIEJ1c3lib3ggdmVyc2lvbjogJXNcbiIKKwkJICAgICAgICIlcyVzIgorCQkgICAgICAgIiNcbiIpLAorCQkgICAgIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksCisJCSAgICAgdXNlX3RpbWVzdGFtcCA/ICIjICIgOiAiIiwKKwkJICAgICB1c2VfdGltZXN0YW1wID8gY3RpbWUoJm5vdykgOiAiIik7CisJaWYgKG91dF9oKSB7CisJCWNoYXIgYnVmW3NpemVvZigiI2RlZmluZSBBVVRPQ09ORl9USU1FU1RBTVAgIgorCQkJCSJcIllZWVktTU0tREQgSEg6TU06U1Mgc29tZV90aW1lem9uZVwiXG4iKV07CisJCWJ1ZlswXSA9ICdcMCc7CisJCWlmICh1c2VfdGltZXN0YW1wKSB7CisJCQlzaXplX3QgcmV0ID0gXAorCQkJCXN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIjZGVmaW5lIEFVVE9DT05GX1RJTUVTVEFNUCAiCisJCQkJCSJcIiVZLSVtLSVkICVIOiVNOiVTICVaXCJcbiIsIGxvY2FsdGltZSgmbm93KSk7CisJCQkvKiBpZiB1c2VyIGhhcyBGYWN0b3J5IHRpbWV6b25lIG9yIHNvbWUgb3RoZXIgb2RkIGluc3RhbGwsIHRoZQorCQkJICogJVogYWJvdmUgd2lsbCBvdmVyZmxvdyB0aGUgc3RyaW5nIGxlYXZpbmcgdXMgd2l0aCB1bmRlZmluZWQKKwkJCSAqIHJlc3VsdHMgLi4uIHNvIGxldCdzIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSB0aW1lem9uZS4KKwkJCSAqLworCQkJaWYgKHJldCA9PSAwKQorCQkJCXN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIjZGVmaW5lIEFVVE9DT05GX1RJTUVTVEFNUCAiCisJCQkJCSJcIiVZLSVtLSVkICVIOiVNOiVTXCJcbiIsIGxvY2FsdGltZSgmbm93KSk7CisJCX0gZWxzZSB7IC8qIGJib3ggKi8KKwkJCXN0cmNweShidWYsICIjZGVmaW5lIEFVVE9DT05GX1RJTUVTVEFNUCBcIlwiXG4iKTsKKwkJfQorCQlmcHJpbnRmKG91dF9oLCAiLypcbiIKKwkJCSAgICAgICAiICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgQyBjb25maWc6IGRvbid0IGVkaXRcbiIKKwkJCSAgICAgICAiICogQnVzeWJveCB2ZXJzaW9uOiAlc1xuIgorCQkJICAgICAgICIgKi9cbiIKKwkJCSAgICAgICAiJXMiCisJCQkgICAgICAgIlxuIiwKKwkJCSAgICAgICBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pLAorCQkJICAgICAgIGJ1Zik7CisJfQorCWlmICghc3ltX2NoYW5nZV9jb3VudCkKKwkJc3ltX2NsZWFyX2FsbF92YWxpZCgpOworCisJbWVudSA9IHJvb3RtZW51Lmxpc3Q7CisJd2hpbGUgKG1lbnUpIHsKKwkJc3ltID0gbWVudS0+c3ltOworCQlpZiAoIXN5bSkgeworCQkJaWYgKCFtZW51X2lzX3Zpc2libGUobWVudSkpCisJCQkJZ290byBuZXh0OworCQkJc3RyID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCQkJZnByaW50ZihvdXQsICJcbiIKKwkJCQkgICAgICIjXG4iCisJCQkJICAgICAiIyAlc1xuIgorCQkJCSAgICAgIiNcbiIsIHN0cik7CisJCQlpZiAob3V0X2gpCisJCQkJZnByaW50ZihvdXRfaCwgIlxuIgorCQkJCQkgICAgICAgIi8qXG4iCisJCQkJCSAgICAgICAiICogJXNcbiIKKwkJCQkJICAgICAgICIgKi9cbiIsIHN0cik7CisJCX0gZWxzZSBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRSkpIHsKKwkJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisvKiBiYm94OiB3ZSB3YW50IHRvIHNlZSBhbGwgc3ltcworCQkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpCisJCQkJZ290byBuZXh0OworKi8KKwkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9XUklURTsKKwkJCXR5cGUgPSBzeW0tPnR5cGU7CisJCQlpZiAodHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCQkJc3ltX2NhbGNfdmFsdWUobW9kdWxlc19zeW0pOworCQkJCWlmIChtb2R1bGVzX3N5bS0+Y3Vyci50cmkgPT0gbm8pCisJCQkJCXR5cGUgPSBTX0JPT0xFQU47CisJCQl9CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCXN3aXRjaCAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pKSB7CisJCQkJY2FzZSBubzoKKwkJCQkJZnByaW50ZihvdXQsICIjIENPTkZJR18lcyBpcyBub3Qgc2V0XG4iLCBzeW0tPm5hbWUpOworCQkJCQlpZiAob3V0X2gpIHsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjdW5kZWYgQ09ORklHXyVzXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJLyogYmJveCAqLworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgRU5BQkxFXyVzIDBcbiIsIHN5bS0+bmFtZSk7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl8lcyguLi4pXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfTk9UXyVzKC4uLikgX19WQV9BUkdTX19cbiIsIHN5bS0+bmFtZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBtb2Q6CisJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPW1cbiIsIHN5bS0+bmFtZSk7CisJCQkJCWlmIChvdXRfaCkKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lc19NT0RVTEUgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSB5ZXM6CisJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPXlcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWlmIChvdXRfaCkgeworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJCQkvKiBiYm94ICovCisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBFTkFCTEVfJXMgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIElGXyVzKC4uLikgX19WQV9BUkdTX19cbiIsIHN5bS0+bmFtZSk7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl9OT1RfJXMoLi4uKVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNfU1RSSU5HOgorCQkJCS8vIGZpeCBtZQorCQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9XCIiLCBzeW0tPm5hbWUpOworCQkJCWlmIChvdXRfaCkKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIFwiIiwgc3ltLT5uYW1lKTsKKwkJCQlkbyB7CisJCQkJCWwgPSBzdHJjc3BuKHN0ciwgIlwiXFwiKTsKKwkJCQkJaWYgKGwpIHsKKwkJCQkJCWZ3cml0ZShzdHIsIGwsIDEsIG91dCk7CisJCQkJCQlpZiAob3V0X2gpCisJCQkJCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0X2gpOworCQkJCQl9CisJCQkJCXN0ciArPSBsOworCQkJCQl3aGlsZSAoKnN0ciA9PSAnXFwnIHx8ICpzdHIgPT0gJyInKSB7CisJCQkJCQlmcHJpbnRmKG91dCwgIlxcJWMiLCAqc3RyKTsKKwkJCQkJCWlmIChvdXRfaCkKKwkJCQkJCQlmcHJpbnRmKG91dF9oLCAiXFwlYyIsICpzdHIpOworCQkJCQkJc3RyKys7CisJCQkJCX0KKwkJCQl9IHdoaWxlICgqc3RyKTsKKwkJCQlmcHV0cygiXCJcbiIsIG91dCk7CisJCQkJaWYgKG91dF9oKSB7CisJCQkJCWZwdXRzKCJcIlxuIiwgb3V0X2gpOworCQkJCQkvKiBiYm94ICovCisJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIEVOQUJMRV8lcyAxXG4iLCBzeW0tPm5hbWUpOworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl8lcyguLi4pIF9fVkFfQVJHU19fXG4iLCBzeW0tPm5hbWUpOworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl9OT1RfJXMoLi4uKVxuIiwgc3ltLT5uYW1lKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNfSEVYOgorCQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCQkJaWYgKHN0clswXSAhPSAnMCcgfHwgKHN0clsxXSAhPSAneCcgJiYgc3RyWzFdICE9ICdYJykpIHsKKwkJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJCQkJaWYgKG91dF9oKSB7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgMHglc1xuIiwgc3ltLT5uYW1lLCBzdHIpOworCQkJCQkJLyogYmJveCAqLworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgRU5BQkxFXyVzIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl8lcyguLi4pIF9fVkFfQVJHU19fXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfTk9UXyVzKC4uLilcbiIsIHN5bS0+bmFtZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJY2FzZSBTX0lOVDoKKwkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQkJCWlmICghc3RyWzBdKQorCQkJCQlzdHIgPSAiMCI7CisJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJCQlpZiAob3V0X2gpIHsKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzICVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJCS8qIGJib3ggKi8KKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgRU5BQkxFXyVzIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIElGXyVzKC4uLikgX19WQV9BUkdTX19cbiIsIHN5bS0+bmFtZSk7CisJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIElGX05PVF8lcyguLi4pXG4iLCBzeW0tPm5hbWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJbmV4dDoKKwkJaWYgKG1lbnUtPmxpc3QpIHsKKwkJCW1lbnUgPSBtZW51LT5saXN0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1lbnUtPm5leHQpCisJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJZWxzZSB3aGlsZSAoKG1lbnUgPSBtZW51LT5wYXJlbnQpKSB7CisJCQlpZiAobWVudS0+bmV4dCkgeworCQkJCW1lbnUgPSBtZW51LT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWZjbG9zZShvdXQpOworCWlmIChvdXRfaCkgeworCQlmY2xvc2Uob3V0X2gpOworCQlyZW5hbWUoIi50bXBjb25maWcuaCIsICJpbmNsdWRlL2F1dG9jb25mLmgiKTsKKwl9CisJaWYgKCFuYW1lIHx8IGJhc2VuYW1lICE9IGNvbmZfZGVmX2ZpbGVuYW1lKSB7CisJCWlmICghbmFtZSkKKwkJCW5hbWUgPSBjb25mX2RlZl9maWxlbmFtZTsKKwkJc3ByaW50Zih0bXBuYW1lLCAiJXMub2xkIiwgbmFtZSk7CisJCXJlbmFtZShuYW1lLCB0bXBuYW1lKTsKKwl9CisJc3ByaW50Zih0bXBuYW1lLCAiJXMlcyIsIGRpcm5hbWUsIGJhc2VuYW1lKTsKKwlpZiAocmVuYW1lKG5ld25hbWUsIHRtcG5hbWUpKQorCQlyZXR1cm4gMTsKKworCXN5bV9jaGFuZ2VfY291bnQgPSAwOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvZXhwci5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjM5ZTdhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwpAQCAtMCwwICsxLDEwOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBERUJVR19FWFBSCTAKKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgZXhwciAqZSA9IG1hbGxvYyhzaXplb2YoKmUpKTsKKwltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CisJZS0+dHlwZSA9IEVfU1lNQk9MOworCWUtPmxlZnQuc3ltID0gc3ltOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19vbmUoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmNlKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gdHlwZTsKKwllLT5sZWZ0LmV4cHIgPSBjZTsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfdHdvKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gdHlwZTsKKwllLT5sZWZ0LmV4cHIgPSBlMTsKKwllLT5yaWdodC5leHByID0gZTI7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX2NvbXAoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqczEsIHN0cnVjdCBzeW1ib2wgKnMyKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gdHlwZTsKKwllLT5sZWZ0LnN5bSA9IHMxOworCWUtPnJpZ2h0LnN5bSA9IHMyOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19hbmQoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJaWYgKCFlMSkKKwkJcmV0dXJuIGUyOworCXJldHVybiBlMiA/IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCBlMSwgZTIpIDogZTE7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCWlmICghZTEpCisJCXJldHVybiBlMjsKKwlyZXR1cm4gZTIgPyBleHByX2FsbG9jX3R3byhFX09SLCBlMSwgZTIpIDogZTE7Cit9CisKK3N0cnVjdCBleHByICpleHByX2NvcHkoc3RydWN0IGV4cHIgKm9yZykKK3sKKwlzdHJ1Y3QgZXhwciAqZTsKKworCWlmICghb3JnKQorCQlyZXR1cm4gTlVMTDsKKworCWUgPSBtYWxsb2Moc2l6ZW9mKCpvcmcpKTsKKwltZW1jcHkoZSwgb3JnLCBzaXplb2YoKm9yZykpOworCXN3aXRjaCAob3JnLT50eXBlKSB7CisJY2FzZSBFX1NZTUJPTDoKKwkJZS0+bGVmdCA9IG9yZy0+bGVmdDsKKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gZXhwcl9jb3B5KG9yZy0+bGVmdC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQllLT5sZWZ0LnN5bSA9IG9yZy0+bGVmdC5zeW07CisJCWUtPnJpZ2h0LnN5bSA9IG9yZy0+cmlnaHQuc3ltOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCWNhc2UgRV9PUjoKKwljYXNlIEVfQ0hPSUNFOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2NvcHkob3JnLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl9jb3B5KG9yZy0+cmlnaHQuZXhwcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiY2FuJ3QgY29weSB0eXBlICVkXG4iLCBlLT50eXBlKTsKKwkJZnJlZShlKTsKKwkJZSA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlOworfQorCit2b2lkIGV4cHJfZnJlZShzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybjsKKworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQlyZXR1cm47CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlicmVhazsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJob3cgdG8gZnJlZSB0eXBlICVkP1xuIiwgZS0+dHlwZSk7CisJCWJyZWFrOworCX0KKwlmcmVlKGUpOworfQorCitzdGF0aWMgaW50IHRyYW5zX2NvdW50OworCisjZGVmaW5lIGUxICgqZXAxKQorI2RlZmluZSBlMiAoKmVwMikKKworc3RhdGljIHZvaWQgX19leHByX2VsaW1pbmF0ZV9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJX19leHByX2VsaW1pbmF0ZV9lcSh0eXBlLCAmZTEtPmxlZnQuZXhwciwgJmUyKTsKKwkJX19leHByX2VsaW1pbmF0ZV9lcSh0eXBlLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJX19leHByX2VsaW1pbmF0ZV9lcSh0eXBlLCAmZTEsICZlMi0+bGVmdC5leHByKTsKKwkJX19leHByX2VsaW1pbmF0ZV9lcSh0eXBlLCAmZTEsICZlMi0+cmlnaHQuZXhwcik7CisJCXJldHVybjsKKwl9CisJaWYgKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfU1lNQk9MICYmCisJICAgIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW0gJiYgKGUxLT5sZWZ0LnN5bS0+ZmxhZ3MgJiAoU1lNQk9MX1lFU3xTWU1CT0xfTk8pKSkKKwkJcmV0dXJuOworCWlmICghZXhwcl9lcShlMSwgZTIpKQorCQlyZXR1cm47CisJdHJhbnNfY291bnQrKzsKKwlleHByX2ZyZWUoZTEpOyBleHByX2ZyZWUoZTIpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRV9PUjoKKwkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJZTIgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJYnJlYWs7CisJY2FzZSBFX0FORDoKKwkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCWUyID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorfQorCit2b2lkIGV4cHJfZWxpbWluYXRlX2VxKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKwlpZiAoIWUxIHx8ICFlMikKKwkJcmV0dXJuOworCXN3aXRjaCAoZTEtPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJX19leHByX2VsaW1pbmF0ZV9lcShlMS0+dHlwZSwgZXAxLCBlcDIpOworCWRlZmF1bHQ6CisJCTsKKwl9CisJaWYgKGUxLT50eXBlICE9IGUyLT50eXBlKSBzd2l0Y2ggKGUyLT50eXBlKSB7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCV9fZXhwcl9lbGltaW5hdGVfZXEoZTItPnR5cGUsIGVwMSwgZXAyKTsKKwlkZWZhdWx0OgorCQk7CisJfQorCWUxID0gZXhwcl9lbGltaW5hdGVfeW4oZTEpOworCWUyID0gZXhwcl9lbGltaW5hdGVfeW4oZTIpOworfQorCisjdW5kZWYgZTEKKyN1bmRlZiBlMgorCitpbnQgZXhwcl9lcShzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlpbnQgcmVzLCBvbGRfY291bnQ7CisKKwlpZiAoZTEtPnR5cGUgIT0gZTItPnR5cGUpCisJCXJldHVybiAwOworCXN3aXRjaCAoZTEtPnR5cGUpIHsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCXJldHVybiBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltICYmIGUxLT5yaWdodC5zeW0gPT0gZTItPnJpZ2h0LnN5bTsKKwljYXNlIEVfU1lNQk9MOgorCQlyZXR1cm4gZTEtPmxlZnQuc3ltID09IGUyLT5sZWZ0LnN5bTsKKwljYXNlIEVfTk9UOgorCQlyZXR1cm4gZXhwcl9lcShlMS0+bGVmdC5leHByLCBlMi0+bGVmdC5leHByKTsKKwljYXNlIEVfQU5EOgorCWNhc2UgRV9PUjoKKwkJZTEgPSBleHByX2NvcHkoZTEpOworCQllMiA9IGV4cHJfY29weShlMik7CisJCW9sZF9jb3VudCA9IHRyYW5zX2NvdW50OworCQlleHByX2VsaW1pbmF0ZV9lcSgmZTEsICZlMik7CisJCXJlcyA9IChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJgorCQkgICAgICAgZTEtPmxlZnQuc3ltID09IGUyLT5sZWZ0LnN5bSk7CisJCWV4cHJfZnJlZShlMSk7CisJCWV4cHJfZnJlZShlMik7CisJCXRyYW5zX2NvdW50ID0gb2xkX2NvdW50OworCQlyZXR1cm4gcmVzOworCWNhc2UgRV9DSE9JQ0U6CisJY2FzZSBFX1JBTkdFOgorCWNhc2UgRV9OT05FOgorCQkvKiBwYW5pYyAqLzsKKwl9CisKKwlpZiAoREVCVUdfRVhQUikgeworCQlleHByX2ZwcmludChlMSwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIgPSAiKTsKKwkJZXhwcl9mcHJpbnQoZTIsIHN0ZG91dCk7CisJCXByaW50ZigiID9cbiIpOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfeW4oc3RydWN0IGV4cHIgKmUpCit7CisJc3RydWN0IGV4cHIgKnRtcDsKKworCWlmIChlKSBzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl9lbGltaW5hdGVfeW4oZS0+cmlnaHQuZXhwcik7CisJCWlmIChlLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wpIHsKKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9ubzsKKwkJCQllLT5yaWdodC5leHByID0gTlVMTDsKKwkJCQlyZXR1cm4gZTsKKwkJCX0gZWxzZSBpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJCWZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQl0bXAgPSBlLT5yaWdodC5leHByOworCQkJCSplID0gKihlLT5yaWdodC5leHByKTsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJaWYgKGUtPnJpZ2h0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wpIHsKKwkJCWlmIChlLT5yaWdodC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbm87CisJCQkJZS0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQkJcmV0dXJuIGU7CisJCQl9IGVsc2UgaWYgKGUtPnJpZ2h0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJKmUgPSAqKGUtPmxlZnQuZXhwcik7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBlOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwkJZS0+bGVmdC5leHByID0gZXhwcl9lbGltaW5hdGVfeW4oZS0+bGVmdC5leHByKTsKKwkJZS0+cmlnaHQuZXhwciA9IGV4cHJfZWxpbWluYXRlX3luKGUtPnJpZ2h0LmV4cHIpOworCQlpZiAoZS0+bGVmdC5leHByLT50eXBlID09IEVfU1lNQk9MKSB7CisJCQlpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCXRtcCA9IGUtPnJpZ2h0LmV4cHI7CisJCQkJKmUgPSAqKGUtPnJpZ2h0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0gZWxzZSBpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX3llczsKKwkJCQllLT5yaWdodC5leHByID0gTlVMTDsKKwkJCQlyZXR1cm4gZTsKKwkJCX0KKwkJfQorCQlpZiAoZS0+cmlnaHQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPnJpZ2h0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQlmcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQkqZSA9ICooZS0+bGVmdC5leHByKTsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIGU7CisJCQl9IGVsc2UgaWYgKGUtPnJpZ2h0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfeWVzOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIGU7Cit9CisKKy8qCisgKiBib29sIEZPTyE9biA9PiBGT08KKyAqLworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfYm9vbChzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybiBOVUxMOworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCWNhc2UgRV9OT1Q6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfdHJhbnNfYm9vbChlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl90cmFuc19ib29sKGUtPnJpZ2h0LmV4cHIpOworCQlicmVhazsKKwljYXNlIEVfVU5FUVVBTDoKKwkJLy8gRk9PIT1uIC0+IEZPTworCQlpZiAoZS0+bGVmdC5zeW0tPnR5cGUgPT0gU19UUklTVEFURSkgeworCQkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gZTsKK30KKworLyoKKyAqIGUxIHx8IGUyIC0+ID8KKyAqLworc3RydWN0IGV4cHIgKmV4cHJfam9pbl9vcihzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wOworCXN0cnVjdCBzeW1ib2wgKnN5bTEsICpzeW0yOworCisJaWYgKGV4cHJfZXEoZTEsIGUyKSkKKwkJcmV0dXJuIGV4cHJfY29weShlMSk7CisJaWYgKGUxLT50eXBlICE9IEVfRVFVQUwgJiYgZTEtPnR5cGUgIT0gRV9VTkVRVUFMICYmIGUxLT50eXBlICE9IEVfU1lNQk9MICYmIGUxLT50eXBlICE9IEVfTk9UKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZTItPnR5cGUgIT0gRV9FUVVBTCAmJiBlMi0+dHlwZSAhPSBFX1VORVFVQUwgJiYgZTItPnR5cGUgIT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgIT0gRV9OT1QpCisJCXJldHVybiBOVUxMOworCWlmIChlMS0+dHlwZSA9PSBFX05PVCkgeworCQl0bXAgPSBlMS0+bGVmdC5leHByOworCQlpZiAodG1wLT50eXBlICE9IEVfRVFVQUwgJiYgdG1wLT50eXBlICE9IEVfVU5FUVVBTCAmJiB0bXAtPnR5cGUgIT0gRV9TWU1CT0wpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3ltMSA9IHRtcC0+bGVmdC5zeW07CisJfSBlbHNlCisJCXN5bTEgPSBlMS0+bGVmdC5zeW07CisJaWYgKGUyLT50eXBlID09IEVfTk9UKSB7CisJCWlmIChlMi0+bGVmdC5leHByLT50eXBlICE9IEVfU1lNQk9MKQorCQkJcmV0dXJuIE5VTEw7CisJCXN5bTIgPSBlMi0+bGVmdC5leHByLT5sZWZ0LnN5bTsKKwl9IGVsc2UKKwkJc3ltMiA9IGUyLT5sZWZ0LnN5bTsKKwlpZiAoc3ltMSAhPSBzeW0yKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc3ltMS0+dHlwZSAhPSBTX0JPT0xFQU4gJiYgc3ltMS0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc3ltMS0+dHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCWlmIChlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYKKwkJICAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCQkgICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKSkgeworCQkJLy8gKGE9J3knKSB8fCAoYT0nbScpIC0+IChhIT0nbicpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgc3ltMSwgJnN5bWJvbF9ubyk7CisJCX0KKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJgorCQkgICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgfHwKKwkJICAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKSkgeworCQkJLy8gKGE9J3knKSB8fCAoYT0nbicpIC0+IChhIT0nbScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgc3ltMSwgJnN5bWJvbF9tb2QpOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYKKwkJICAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJCSAgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSkpIHsKKwkJCS8vIChhPSdtJykgfHwgKGE9J24nKSAtPiAoYSE9J3knKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX1VORVFVQUwsIHN5bTEsICZzeW1ib2xfeWVzKTsKKwkJfQorCX0KKwlpZiAoc3ltMS0+dHlwZSA9PSBTX0JPT0xFQU4gJiYgc3ltMSA9PSBzeW0yKSB7CisJCWlmICgoZTEtPnR5cGUgPT0gRV9OT1QgJiYgZTEtPmxlZnQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1NZTUJPTCkgfHwKKwkJICAgIChlMi0+dHlwZSA9PSBFX05PVCAmJiBlMi0+bGVmdC5leHByLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfU1lNQk9MKSkKKwkJCXJldHVybiBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJfQorCisJaWYgKERFQlVHX0VYUFIpIHsKKwkJcHJpbnRmKCJvcHRpbWl6ZSAoIik7CisJCWV4cHJfZnByaW50KGUxLCBzdGRvdXQpOworCQlwcmludGYoIikgfHwgKCIpOworCQlleHByX2ZwcmludChlMiwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIpP1xuIik7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9qb2luX2FuZChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wOworCXN0cnVjdCBzeW1ib2wgKnN5bTEsICpzeW0yOworCisJaWYgKGV4cHJfZXEoZTEsIGUyKSkKKwkJcmV0dXJuIGV4cHJfY29weShlMSk7CisJaWYgKGUxLT50eXBlICE9IEVfRVFVQUwgJiYgZTEtPnR5cGUgIT0gRV9VTkVRVUFMICYmIGUxLT50eXBlICE9IEVfU1lNQk9MICYmIGUxLT50eXBlICE9IEVfTk9UKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZTItPnR5cGUgIT0gRV9FUVVBTCAmJiBlMi0+dHlwZSAhPSBFX1VORVFVQUwgJiYgZTItPnR5cGUgIT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgIT0gRV9OT1QpCisJCXJldHVybiBOVUxMOworCWlmIChlMS0+dHlwZSA9PSBFX05PVCkgeworCQl0bXAgPSBlMS0+bGVmdC5leHByOworCQlpZiAodG1wLT50eXBlICE9IEVfRVFVQUwgJiYgdG1wLT50eXBlICE9IEVfVU5FUVVBTCAmJiB0bXAtPnR5cGUgIT0gRV9TWU1CT0wpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3ltMSA9IHRtcC0+bGVmdC5zeW07CisJfSBlbHNlCisJCXN5bTEgPSBlMS0+bGVmdC5zeW07CisJaWYgKGUyLT50eXBlID09IEVfTk9UKSB7CisJCWlmIChlMi0+bGVmdC5leHByLT50eXBlICE9IEVfU1lNQk9MKQorCQkJcmV0dXJuIE5VTEw7CisJCXN5bTIgPSBlMi0+bGVmdC5leHByLT5sZWZ0LnN5bTsKKwl9IGVsc2UKKwkJc3ltMiA9IGUyLT5sZWZ0LnN5bTsKKwlpZiAoc3ltMSAhPSBzeW0yKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc3ltMS0+dHlwZSAhPSBTX0JPT0xFQU4gJiYgc3ltMS0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSB8fAorCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkKKwkJLy8gKGEpICYmIChhPSd5JykgLT4gKGE9J3knKQorCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfeWVzKTsKKworCWlmICgoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgfHwKKwkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pKQorCQkvLyAoYSkgJiYgKGEhPSduJykgLT4gKGEpCisJCXJldHVybiBleHByX2FsbG9jX3N5bWJvbChzeW0xKTsKKworCWlmICgoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkpCisJCS8vIChhKSAmJiAoYSE9J20nKSAtPiAoYT0neScpCisJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCisJaWYgKHN5bTEtPnR5cGUgPT0gU19UUklTVEFURSkgeworCQlpZiAoZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwpIHsKKwkJCS8vIChhPSdiJykgJiYgKGEhPSdjJykgLT4gJ2InPSdjJyA/ICduJyA6IGE9J2InCisJCQlzeW0yID0gZTEtPnJpZ2h0LnN5bTsKKwkJCWlmICgoZTItPnJpZ2h0LnN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpICYmIChzeW0yLT5mbGFncyAmIFNZTUJPTF9DT05TVCkpCisJCQkJcmV0dXJuIHN5bTIgIT0gZTItPnJpZ2h0LnN5bSA/IGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCBzeW0yKQorCQkJCQkJCSAgICAgOiBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJfQorCQlpZiAoZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT50eXBlID09IEVfRVFVQUwpIHsKKwkJCS8vIChhPSdiJykgJiYgKGEhPSdjJykgLT4gJ2InPSdjJyA/ICduJyA6IGE9J2InCisJCQlzeW0yID0gZTItPnJpZ2h0LnN5bTsKKwkJCWlmICgoZTEtPnJpZ2h0LnN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpICYmIChzeW0yLT5mbGFncyAmIFNZTUJPTF9DT05TVCkpCisJCQkJcmV0dXJuIHN5bTIgIT0gZTEtPnJpZ2h0LnN5bSA/IGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCBzeW0yKQorCQkJCQkJCSAgICAgOiBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJfQorCQlpZiAoZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJgorCQkJICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgfHwKKwkJCSAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKSkKKwkJCS8vIChhIT0neScpICYmIChhIT0nbicpIC0+IChhPSdtJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF9tb2QpOworCisJCWlmIChlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmCisJCQkgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkJCSAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkpCisJCQkvLyAoYSE9J3knKSAmJiAoYSE9J20nKSAtPiAoYT0nbicpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfbm8pOworCisJCWlmIChlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmCisJCQkgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkJICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkpKQorCQkJLy8gKGEhPSdtJykgJiYgKGEhPSduJykgLT4gKGE9J20nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX3llcyk7CisKKwkJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCQkgICAgKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSB8fAorCQkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChERUJVR19FWFBSKSB7CisJCXByaW50Zigib3B0aW1pemUgKCIpOworCQlleHByX2ZwcmludChlMSwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIpICYmICgiKTsKKwkJZXhwcl9mcHJpbnQoZTIsIHN0ZG91dCk7CisJCXByaW50ZigiKT9cbiIpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZXhwcl9lbGltaW5hdGVfZHVwczEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworI2RlZmluZSBlMSAoKmVwMSkKKyNkZWZpbmUgZTIgKCplcDIpCisJc3RydWN0IGV4cHIgKnRtcDsKKworCWlmIChlMS0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMxKHR5cGUsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlleHByX2VsaW1pbmF0ZV9kdXBzMSh0eXBlLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLCAmZTItPmxlZnQuZXhwcik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMxKHR5cGUsICZlMSwgJmUyLT5yaWdodC5leHByKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTEgPT0gZTIpCisJCXJldHVybjsKKworCXN3aXRjaCAoZTEtPnR5cGUpIHsKKwljYXNlIEVfT1I6IGNhc2UgRV9BTkQ6CisJCWV4cHJfZWxpbWluYXRlX2R1cHMxKGUxLT50eXBlLCAmZTEsICZlMSk7CisJZGVmYXVsdDoKKwkJOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRV9PUjoKKwkJdG1wID0gZXhwcl9qb2luX29yKGUxLCBlMik7CisJCWlmICh0bXApIHsKKwkJCWV4cHJfZnJlZShlMSk7IGV4cHJfZnJlZShlMik7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQkJZTIgPSB0bXA7CisJCQl0cmFuc19jb3VudCsrOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJCXRtcCA9IGV4cHJfam9pbl9hbmQoZTEsIGUyKTsKKwkJaWYgKHRtcCkgeworCQkJZXhwcl9mcmVlKGUxKTsgZXhwcl9mcmVlKGUyKTsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQkJZTIgPSB0bXA7CisJCQl0cmFuc19jb3VudCsrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisjdW5kZWYgZTEKKyN1bmRlZiBlMgorfQorCitzdGF0aWMgdm9pZCBleHByX2VsaW1pbmF0ZV9kdXBzMihlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisjZGVmaW5lIGUxICgqZXAxKQorI2RlZmluZSBlMiAoKmVwMikKKwlzdHJ1Y3QgZXhwciAqdG1wLCAqdG1wMSwgKnRtcDI7CisKKwlpZiAoZTEtPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2VsaW1pbmF0ZV9kdXBzMih0eXBlLCAmZTEtPmxlZnQuZXhwciwgJmUyKTsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIodHlwZSwgJmUxLT5yaWdodC5leHByLCAmZTIpOworCQlyZXR1cm47CisJfQorCWlmIChlMi0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMSwgJmUyLT5sZWZ0LmV4cHIpOworCQlleHByX2VsaW1pbmF0ZV9kdXBzMih0eXBlLCAmZTEsICZlMi0+cmlnaHQuZXhwcik7CisJfQorCWlmIChlMSA9PSBlMikKKwkJcmV0dXJuOworCisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9PUjoKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIoZTEtPnR5cGUsICZlMSwgJmUxKTsKKwkJLy8gKEZPTyB8fCBCQVIpICYmICghRk9PICYmICFCQVIpIC0+IG4KKwkJdG1wMSA9IGV4cHJfdHJhbnNmb3JtKGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBleHByX2NvcHkoZTEpKSk7CisJCXRtcDIgPSBleHByX2NvcHkoZTIpOworCQl0bXAgPSBleHByX2V4dHJhY3RfZXFfYW5kKCZ0bXAxLCAmdG1wMik7CisJCWlmIChleHByX2lzX3llcyh0bXAxKSkgeworCQkJZXhwcl9mcmVlKGUxKTsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQl0cmFuc19jb3VudCsrOworCQl9CisJCWV4cHJfZnJlZSh0bXAyKTsKKwkJZXhwcl9mcmVlKHRtcDEpOworCQlleHByX2ZyZWUodG1wKTsKKwkJYnJlYWs7CisJY2FzZSBFX0FORDoKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIoZTEtPnR5cGUsICZlMSwgJmUxKTsKKwkJLy8gKEZPTyAmJiBCQVIpIHx8ICghRk9PIHx8ICFCQVIpIC0+IHkKKwkJdG1wMSA9IGV4cHJfdHJhbnNmb3JtKGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBleHByX2NvcHkoZTEpKSk7CisJCXRtcDIgPSBleHByX2NvcHkoZTIpOworCQl0bXAgPSBleHByX2V4dHJhY3RfZXFfb3IoJnRtcDEsICZ0bXAyKTsKKwkJaWYgKGV4cHJfaXNfbm8odG1wMSkpIHsKKwkJCWV4cHJfZnJlZShlMSk7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJZXhwcl9mcmVlKHRtcDIpOworCQlleHByX2ZyZWUodG1wMSk7CisJCWV4cHJfZnJlZSh0bXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorI3VuZGVmIGUxCisjdW5kZWYgZTIKK30KKworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX2R1cHMoc3RydWN0IGV4cHIgKmUpCit7CisJaW50IG9sZGNvdW50OworCWlmICghZSkKKwkJcmV0dXJuIGU7CisKKwlvbGRjb3VudCA9IHRyYW5zX2NvdW50OworCXdoaWxlICgxKSB7CisJCXRyYW5zX2NvdW50ID0gMDsKKwkJc3dpdGNoIChlLT50eXBlKSB7CisJCWNhc2UgRV9PUjogY2FzZSBFX0FORDoKKwkJCWV4cHJfZWxpbWluYXRlX2R1cHMxKGUtPnR5cGUsICZlLCAmZSk7CisJCQlleHByX2VsaW1pbmF0ZV9kdXBzMihlLT50eXBlLCAmZSwgJmUpOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJCWlmICghdHJhbnNfY291bnQpCisJCQlicmVhazsKKwkJZSA9IGV4cHJfZWxpbWluYXRlX3luKGUpOworCX0KKwl0cmFuc19jb3VudCA9IG9sZGNvdW50OworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc2Zvcm0oc3RydWN0IGV4cHIgKmUpCit7CisJc3RydWN0IGV4cHIgKnRtcDsKKworCWlmICghZSkKKwkJcmV0dXJuIE5VTEw7CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCWNhc2UgRV9TWU1CT0w6CisJY2FzZSBFX0NIT0lDRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZS0+bGVmdC5leHByID0gZXhwcl90cmFuc2Zvcm0oZS0+bGVmdC5leHByKTsKKwkJZS0+cmlnaHQuZXhwciA9IGV4cHJfdHJhbnNmb3JtKGUtPnJpZ2h0LmV4cHIpOworCX0KKworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9FUVVBTDoKKwkJaWYgKGUtPmxlZnQuc3ltLT50eXBlICE9IFNfQk9PTEVBTikKKwkJCWJyZWFrOworCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCWUtPnR5cGUgPSBFX05PVDsKKwkJCWUtPmxlZnQuZXhwciA9IGV4cHJfYWxsb2Nfc3ltYm9sKGUtPmxlZnQuc3ltKTsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB7CisJCQlwcmludGYoImJvb2xlYW4gc3ltYm9sICVzIHRlc3RlZCBmb3IgJ20nPyB0ZXN0IGZvcmNlZCB0byAnbidcbiIsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9ubzsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX1VORVFVQUw6CisJCWlmIChlLT5sZWZ0LnN5bS0+dHlwZSAhPSBTX0JPT0xFQU4pCisJCQlicmVhazsKKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgeworCQkJcHJpbnRmKCJib29sZWFuIHN5bWJvbCAlcyB0ZXN0ZWQgZm9yICdtJz8gdGVzdCBmb3JjZWQgdG8gJ3knXG4iLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CisJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfeWVzOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCWUtPnR5cGUgPSBFX05PVDsKKwkJCWUtPmxlZnQuZXhwciA9IGV4cHJfYWxsb2Nfc3ltYm9sKGUtPmxlZnQuc3ltKTsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfTk9UOgorCQlzd2l0Y2ggKGUtPmxlZnQuZXhwci0+dHlwZSkgeworCQljYXNlIEVfTk9UOgorCQkJLy8gISFhIC0+IGEKKwkJCXRtcCA9IGUtPmxlZnQuZXhwci0+bGVmdC5leHByOworCQkJZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJZnJlZShlKTsKKwkJCWUgPSB0bXA7CisJCQllID0gZXhwcl90cmFuc2Zvcm0oZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX0VRVUFMOgorCQljYXNlIEVfVU5FUVVBTDoKKwkJCS8vICFhPSd4JyAtPiBhIT0neCcKKwkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCWZyZWUoZSk7CisJCQllID0gdG1wOworCQkJZS0+dHlwZSA9IGUtPnR5cGUgPT0gRV9FUVVBTCA/IEVfVU5FUVVBTCA6IEVfRVFVQUw7CisJCQlicmVhazsKKwkJY2FzZSBFX09SOgorCQkJLy8gIShhIHx8IGIpIC0+ICFhICYmICFiCisJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQllLT50eXBlID0gRV9BTkQ7CisJCQllLT5yaWdodC5leHByID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIHRtcC0+cmlnaHQuZXhwcik7CisJCQl0bXAtPnR5cGUgPSBFX05PVDsKKwkJCXRtcC0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQllID0gZXhwcl90cmFuc2Zvcm0oZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX0FORDoKKwkJCS8vICEoYSAmJiBiKSAtPiAhYSB8fCAhYgorCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJZS0+dHlwZSA9IEVfT1I7CisJCQllLT5yaWdodC5leHByID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIHRtcC0+cmlnaHQuZXhwcik7CisJCQl0bXAtPnR5cGUgPSBFX05PVDsKKwkJCXRtcC0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQllID0gZXhwcl90cmFuc2Zvcm0oZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX1NZTUJPTDoKKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJLy8gISd5JyAtPiAnbicKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJZnJlZShlKTsKKwkJCQllID0gdG1wOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbm87CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX21vZCkgeworCQkJCS8vICEnbScgLT4gJ20nCisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCWZyZWUoZSk7CisJCQkJZSA9IHRtcDsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX21vZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQkvLyAhJ24nIC0+ICd5JworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQlmcmVlKGUpOworCQkJCWUgPSB0bXA7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiBlOworfQorCitpbnQgZXhwcl9jb250YWluc19zeW1ib2woc3RydWN0IGV4cHIgKmRlcCwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCWlmICghZGVwKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZGVwLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwljYXNlIEVfT1I6CisJCXJldHVybiBleHByX2NvbnRhaW5zX3N5bWJvbChkZXAtPmxlZnQuZXhwciwgc3ltKSB8fAorCQkgICAgICAgZXhwcl9jb250YWluc19zeW1ib2woZGVwLT5yaWdodC5leHByLCBzeW0pOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBkZXAtPmxlZnQuc3ltID09IHN5bTsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCXJldHVybiBkZXAtPmxlZnQuc3ltID09IHN5bSB8fAorCQkgICAgICAgZGVwLT5yaWdodC5zeW0gPT0gc3ltOworCWNhc2UgRV9OT1Q6CisJCXJldHVybiBleHByX2NvbnRhaW5zX3N5bWJvbChkZXAtPmxlZnQuZXhwciwgc3ltKTsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiAwOworfQorCitib29sIGV4cHJfZGVwZW5kc19zeW1ib2woc3RydWN0IGV4cHIgKmRlcCwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCWlmICghZGVwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzd2l0Y2ggKGRlcC0+dHlwZSkgeworCWNhc2UgRV9BTkQ6CisJCXJldHVybiBleHByX2RlcGVuZHNfc3ltYm9sKGRlcC0+bGVmdC5leHByLCBzeW0pIHx8CisJCSAgICAgICBleHByX2RlcGVuZHNfc3ltYm9sKGRlcC0+cmlnaHQuZXhwciwgc3ltKTsKKwljYXNlIEVfU1lNQk9MOgorCQlyZXR1cm4gZGVwLT5sZWZ0LnN5bSA9PSBzeW07CisJY2FzZSBFX0VRVUFMOgorCQlpZiAoZGVwLT5sZWZ0LnN5bSA9PSBzeW0pIHsKKwkJCWlmIChkZXAtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyB8fCBkZXAtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfVU5FUVVBTDoKKwkJaWYgKGRlcC0+bGVmdC5zeW0gPT0gc3ltKSB7CisJCQlpZiAoZGVwLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9hbmQoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCXN0cnVjdCBleHByICp0bXAgPSBOVUxMOworCWV4cHJfZXh0cmFjdF9lcShFX0FORCwgJnRtcCwgZXAxLCBlcDIpOworCWlmICh0bXApIHsKKwkJKmVwMSA9IGV4cHJfZWxpbWluYXRlX3luKCplcDEpOworCQkqZXAyID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMik7CisJfQorCXJldHVybiB0bXA7Cit9CisKK3N0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfb3Ioc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCXN0cnVjdCBleHByICp0bXAgPSBOVUxMOworCWV4cHJfZXh0cmFjdF9lcShFX09SLCAmdG1wLCBlcDEsIGVwMik7CisJaWYgKHRtcCkgeworCQkqZXAxID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMSk7CisJCSplcDIgPSBleHByX2VsaW1pbmF0ZV95bigqZXAyKTsKKwl9CisJcmV0dXJuIHRtcDsKK30KKwordm9pZCBleHByX2V4dHJhY3RfZXEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcCwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworI2RlZmluZSBlMSAoKmVwMSkKKyNkZWZpbmUgZTIgKCplcDIpCisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCAmZTEtPmxlZnQuZXhwciwgJmUyKTsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCBlcDEsICZlMi0+bGVmdC5leHByKTsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCBlcDEsICZlMi0+cmlnaHQuZXhwcik7CisJCXJldHVybjsKKwl9CisJaWYgKGV4cHJfZXEoZTEsIGUyKSkgeworCQkqZXAgPSAqZXAgPyBleHByX2FsbG9jX3R3byh0eXBlLCAqZXAsIGUxKSA6IGUxOworCQlleHByX2ZyZWUoZTIpOworCQlpZiAodHlwZSA9PSBFX0FORCkgeworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJfSBlbHNlIGlmICh0eXBlID09IEVfT1IpIHsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJfQorI3VuZGVmIGUxCisjdW5kZWYgZTIKK30KKworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfY29tcGFyZShzdHJ1Y3QgZXhwciAqZSwgZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBleHByICplMSwgKmUyOworCisJaWYgKCFlKSB7CisJCWUgPSBleHByX2FsbG9jX3N5bWJvbChzeW0pOworCQlpZiAodHlwZSA9PSBFX1VORVFVQUwpCisJCQllID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGUpOworCQlyZXR1cm4gZTsKKwl9CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwkJZTEgPSBleHByX3RyYW5zX2NvbXBhcmUoZS0+bGVmdC5leHByLCBFX0VRVUFMLCBzeW0pOworCQllMiA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5yaWdodC5leHByLCBFX0VRVUFMLCBzeW0pOworCQlpZiAoc3ltID09ICZzeW1ib2xfeWVzKQorCQkJZSA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCBlMSwgZTIpOworCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQllID0gZXhwcl9hbGxvY190d28oRV9PUiwgZTEsIGUyKTsKKwkJaWYgKHR5cGUgPT0gRV9VTkVRVUFMKQorCQkJZSA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBlKTsKKwkJcmV0dXJuIGU7CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5sZWZ0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWUyID0gZXhwcl90cmFuc19jb21wYXJlKGUtPnJpZ2h0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQllID0gZXhwcl9hbGxvY190d28oRV9PUiwgZTEsIGUyKTsKKwkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJZSA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCBlMSwgZTIpOworCQlpZiAodHlwZSA9PSBFX1VORVFVQUwpCisJCQllID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGUpOworCQlyZXR1cm4gZTsKKwljYXNlIEVfTk9UOgorCQlyZXR1cm4gZXhwcl90cmFuc19jb21wYXJlKGUtPmxlZnQuZXhwciwgdHlwZSA9PSBFX0VRVUFMID8gRV9VTkVRVUFMIDogRV9FUVVBTCwgc3ltKTsKKwljYXNlIEVfVU5FUVVBTDoKKwljYXNlIEVfRVFVQUw6CisJCWlmICh0eXBlID09IEVfRVFVQUwpIHsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQkJcmV0dXJuIGV4cHJfY29weShlKTsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF9tb2QpCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiBleHByX2FsbG9jX29uZShFX05PVCwgZXhwcl9jb3B5KGUpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBleHByX2NvcHkoZSkpOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiBleHByX2NvcHkoZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcCh0eXBlLCBlLT5sZWZ0LnN5bSwgc3ltKTsKKwljYXNlIEVfQ0hPSUNFOgorCWNhc2UgRV9SQU5HRToKKwljYXNlIEVfTk9ORToKKwkJLyogcGFuaWMgKi87CisJfQorCXJldHVybiBOVUxMOworfQorCit0cmlzdGF0ZSBleHByX2NhbGNfdmFsdWUoc3RydWN0IGV4cHIgKmUpCit7CisJdHJpc3RhdGUgdmFsMSwgdmFsMjsKKwljb25zdCBjaGFyICpzdHIxLCAqc3RyMjsKKworCWlmICghZSkKKwkJcmV0dXJuIHllczsKKworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCXN5bV9jYWxjX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJcmV0dXJuIGUtPmxlZnQuc3ltLT5jdXJyLnRyaTsKKwljYXNlIEVfQU5EOgorCQl2YWwxID0gZXhwcl9jYWxjX3ZhbHVlKGUtPmxlZnQuZXhwcik7CisJCXZhbDIgPSBleHByX2NhbGNfdmFsdWUoZS0+cmlnaHQuZXhwcik7CisJCXJldHVybiBFX0FORCh2YWwxLCB2YWwyKTsKKwljYXNlIEVfT1I6CisJCXZhbDEgPSBleHByX2NhbGNfdmFsdWUoZS0+bGVmdC5leHByKTsKKwkJdmFsMiA9IGV4cHJfY2FsY192YWx1ZShlLT5yaWdodC5leHByKTsKKwkJcmV0dXJuIEVfT1IodmFsMSwgdmFsMik7CisJY2FzZSBFX05PVDoKKwkJdmFsMSA9IGV4cHJfY2FsY192YWx1ZShlLT5sZWZ0LmV4cHIpOworCQlyZXR1cm4gRV9OT1QodmFsMSk7CisJY2FzZSBFX0VRVUFMOgorCQlzeW1fY2FsY192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN5bV9jYWxjX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXN0cjEgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN0cjIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5yaWdodC5zeW0pOworCQlyZXR1cm4gIXN0cmNtcChzdHIxLCBzdHIyKSA/IHllcyA6IG5vOworCWNhc2UgRV9VTkVRVUFMOgorCQlzeW1fY2FsY192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN5bV9jYWxjX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXN0cjEgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN0cjIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5yaWdodC5zeW0pOworCQlyZXR1cm4gIXN0cmNtcChzdHIxLCBzdHIyKSA/IG5vIDogeWVzOworCWRlZmF1bHQ6CisJCXByaW50ZigiZXhwcl9jYWxjX3ZhbHVlOiAlZD9cbiIsIGUtPnR5cGUpOworCQlyZXR1cm4gbm87CisJfQorfQorCitpbnQgZXhwcl9jb21wYXJlX3R5cGUoZW51bSBleHByX3R5cGUgdDEsIGVudW0gZXhwcl90eXBlIHQyKQoreworI2lmIDAKKwlyZXR1cm4gMTsKKyNlbHNlCisJaWYgKHQxID09IHQyKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKHQxKSB7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlpZiAodDIgPT0gRV9OT1QpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfTk9UOgorCQlpZiAodDIgPT0gRV9BTkQpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfQU5EOgorCQlpZiAodDIgPT0gRV9PUikKKwkJCXJldHVybiAxOworCWNhc2UgRV9PUjoKKwkJaWYgKHQyID09IEVfQ0hPSUNFKQorCQkJcmV0dXJuIDE7CisJY2FzZSBFX0NIT0lDRToKKwkJaWYgKHQyID09IDApCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCXByaW50ZigiWyVkZ3QlZD9dIiwgdDEsIHQyKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCit2b2lkIGV4cHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHZvaWQgKCpmbikodm9pZCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKQoreworCWlmICghZSkgeworCQlmbihkYXRhLCAieSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV4cHJfY29tcGFyZV90eXBlKHByZXZ0b2tlbiwgZS0+dHlwZSkgPiAwKQorCQlmbihkYXRhLCAiKCIpOworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCWlmIChlLT5sZWZ0LnN5bS0+bmFtZSkKKwkJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZWxzZQorCQkJZm4oZGF0YSwgIjxjaG9pY2U+Iik7CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCWZuKGRhdGEsICIhIik7CisJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9OT1QpOworCQlicmVhazsKKwljYXNlIEVfRVFVQUw6CisJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgIj0iKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBFX1VORVFVQUw6CisJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgIiE9Iik7CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bS0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX09SKTsKKwkJZm4oZGF0YSwgIiB8fCAiKTsKKwkJZXhwcl9wcmludChlLT5yaWdodC5leHByLCBmbiwgZGF0YSwgRV9PUik7CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9BTkQpOworCQlmbihkYXRhLCAiICYmICIpOworCQlleHByX3ByaW50KGUtPnJpZ2h0LmV4cHIsIGZuLCBkYXRhLCBFX0FORCk7CisJCWJyZWFrOworCWNhc2UgRV9DSE9JQ0U6CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bS0+bmFtZSk7CisJCWlmIChlLT5sZWZ0LmV4cHIpIHsKKwkJCWZuKGRhdGEsICIgXiAiKTsKKwkJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9DSE9JQ0UpOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9SQU5HRToKKwkJZm4oZGF0YSwgIlsiKTsKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCAiICIpOworCQlmbihkYXRhLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCAiXSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCSAgeworCQljaGFyIGJ1ZlszMl07CisJCXNwcmludGYoYnVmLCAiPHVua25vd24gdHlwZSAlZD4iLCBlLT50eXBlKTsKKwkJZm4oZGF0YSwgYnVmKTsKKwkJYnJlYWs7CisJICB9CisJfQorCWlmIChleHByX2NvbXBhcmVfdHlwZShwcmV2dG9rZW4sIGUtPnR5cGUpID4gMCkKKwkJZm4oZGF0YSwgIikiKTsKK30KKworc3RhdGljIHZvaWQgZXhwcl9wcmludF9maWxlX2hlbHBlcih2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzdHIpCit7CisJZndyaXRlKHN0ciwgc3RybGVuKHN0ciksIDEsIGRhdGEpOworfQorCit2b2lkIGV4cHJfZnByaW50KHN0cnVjdCBleHByICplLCBGSUxFICpvdXQpCit7CisJZXhwcl9wcmludChlLCBleHByX3ByaW50X2ZpbGVfaGVscGVyLCBvdXQsIEVfTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cHJfcHJpbnRfZ3N0cl9oZWxwZXIodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQoreworCXN0cl9hcHBlbmQoKHN0cnVjdCBnc3RyKilkYXRhLCBzdHIpOworfQorCit2b2lkIGV4cHJfZ3N0cl9wcmludChzdHJ1Y3QgZXhwciAqZSwgc3RydWN0IGdzdHIgKmdzKQoreworCWV4cHJfcHJpbnQoZSwgZXhwcl9wcmludF9nc3RyX2hlbHBlciwgZ3MsIEVfTk9ORSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvZXhwci5oIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpZm5kZWYgRVhQUl9ICisjZGVmaW5lIEVYUFJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorCitzdHJ1Y3QgZmlsZSB7CisJc3RydWN0IGZpbGUgKm5leHQ7CisJc3RydWN0IGZpbGUgKnBhcmVudDsKKwljaGFyICpuYW1lOworCWludCBsaW5lbm87CisJaW50IGZsYWdzOworfTsKKworI2RlZmluZSBGSUxFX0JVU1kJCTB4MDAwMQorI2RlZmluZSBGSUxFX1NDQU5ORUQJCTB4MDAwMgorI2RlZmluZSBGSUxFX1BSSU5URUQJCTB4MDAwNAorCit0eXBlZGVmIGVudW0gdHJpc3RhdGUgeworCW5vLCBtb2QsIHllcworfSB0cmlzdGF0ZTsKKworZW51bSBleHByX3R5cGUgeworCUVfTk9ORSwgRV9PUiwgRV9BTkQsIEVfTk9ULCBFX0VRVUFMLCBFX1VORVFVQUwsIEVfQ0hPSUNFLCBFX1NZTUJPTCwgRV9SQU5HRQorfTsKKwordW5pb24gZXhwcl9kYXRhIHsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07Cit9OworCitzdHJ1Y3QgZXhwciB7CisJZW51bSBleHByX3R5cGUgdHlwZTsKKwl1bmlvbiBleHByX2RhdGEgbGVmdCwgcmlnaHQ7Cit9OworCisjZGVmaW5lIEVfT1IoZGVwMSwgZGVwMikJKCgoZGVwMSk+KGRlcDIpKT8oZGVwMSk6KGRlcDIpKQorI2RlZmluZSBFX0FORChkZXAxLCBkZXAyKQkoKChkZXAxKTwoZGVwMikpPyhkZXAxKTooZGVwMikpCisjZGVmaW5lIEVfTk9UKGRlcCkJCSgyLShkZXApKQorCitzdHJ1Y3QgZXhwcl92YWx1ZSB7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJdHJpc3RhdGUgdHJpOworfTsKKworc3RydWN0IHN5bWJvbF92YWx1ZSB7CisJdm9pZCAqdmFsOworCXRyaXN0YXRlIHRyaTsKK307CisKK2VudW0gc3ltYm9sX3R5cGUgeworCVNfVU5LTk9XTiwgU19CT09MRUFOLCBTX1RSSVNUQVRFLCBTX0lOVCwgU19IRVgsIFNfU1RSSU5HLCBTX09USEVSCit9OworCitzdHJ1Y3Qgc3ltYm9sIHsKKwlzdHJ1Y3Qgc3ltYm9sICpuZXh0OworCWNoYXIgKm5hbWU7CisJY2hhciAqaGVscDsKKwllbnVtIHN5bWJvbF90eXBlIHR5cGU7CisJc3RydWN0IHN5bWJvbF92YWx1ZSBjdXJyLCB1c2VyOworCXRyaXN0YXRlIHZpc2libGU7CisJaW50IGZsYWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqZGVwLCAqZGVwMjsKKwlzdHJ1Y3QgZXhwcl92YWx1ZSByZXZfZGVwOworfTsKKworI2RlZmluZSBmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSBmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspIGZvciAoc3ltID0gc3ltYm9sX2hhc2hbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KSBpZiAoc3ltLT50eXBlICE9IFNfT1RIRVIpCisKKyNkZWZpbmUgU1lNQk9MX1lFUwkJMHgwMDAxCisjZGVmaW5lIFNZTUJPTF9NT0QJCTB4MDAwMgorI2RlZmluZSBTWU1CT0xfTk8JCTB4MDAwNAorI2RlZmluZSBTWU1CT0xfQ09OU1QJCTB4MDAwNworI2RlZmluZSBTWU1CT0xfQ0hFQ0sJCTB4MDAwOAorI2RlZmluZSBTWU1CT0xfQ0hPSUNFCQkweDAwMTAKKyNkZWZpbmUgU1lNQk9MX0NIT0lDRVZBTAkweDAwMjAKKyNkZWZpbmUgU1lNQk9MX1BSSU5URUQJCTB4MDA0MAorI2RlZmluZSBTWU1CT0xfVkFMSUQJCTB4MDA4MAorI2RlZmluZSBTWU1CT0xfT1BUSU9OQUwJCTB4MDEwMAorI2RlZmluZSBTWU1CT0xfV1JJVEUJCTB4MDIwMAorI2RlZmluZSBTWU1CT0xfQ0hBTkdFRAkJMHgwNDAwCisjZGVmaW5lIFNZTUJPTF9ORVcJCTB4MDgwMAorI2RlZmluZSBTWU1CT0xfQVVUTwkJMHgxMDAwCisjZGVmaW5lIFNZTUJPTF9DSEVDS0VECQkweDIwMDAKKyNkZWZpbmUgU1lNQk9MX1dBUk5FRAkJMHg4MDAwCisKKyNkZWZpbmUgU1lNQk9MX01BWExFTkdUSAkyNTYKKyNkZWZpbmUgU1lNQk9MX0hBU0hTSVpFCQkyNTcKKyNkZWZpbmUgU1lNQk9MX0hBU0hNQVNLCQkweGZmCisKK2VudW0gcHJvcF90eXBlIHsKKwlQX1VOS05PV04sIFBfUFJPTVBULCBQX0NPTU1FTlQsIFBfTUVOVSwgUF9ERUZBVUxULCBQX0NIT0lDRSwgUF9TRUxFQ1QsIFBfUkFOR0UKK307CisKK3N0cnVjdCBwcm9wZXJ0eSB7CisJc3RydWN0IHByb3BlcnR5ICpuZXh0OworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCWNvbnN0IGNoYXIgKnRleHQ7CisJc3RydWN0IGV4cHJfdmFsdWUgdmlzaWJsZTsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgbGluZW5vOworfTsKKworI2RlZmluZSBmb3JfYWxsX3Byb3BlcnRpZXMoc3ltLCBzdCwgdG9rKSBcCisJZm9yIChzdCA9IHN5bS0+cHJvcDsgc3Q7IHN0ID0gc3QtPm5leHQpIFwKKwkJaWYgKHN0LT50eXBlID09ICh0b2spKQorI2RlZmluZSBmb3JfYWxsX2RlZmF1bHRzKHN5bSwgc3QpIGZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHN0LCBQX0RFRkFVTFQpCisjZGVmaW5lIGZvcl9hbGxfY2hvaWNlcyhzeW0sIHN0KSBmb3JfYWxsX3Byb3BlcnRpZXMoc3ltLCBzdCwgUF9DSE9JQ0UpCisjZGVmaW5lIGZvcl9hbGxfcHJvbXB0cyhzeW0sIHN0KSBcCisJZm9yIChzdCA9IHN5bS0+cHJvcDsgc3Q7IHN0ID0gc3QtPm5leHQpIFwKKwkJaWYgKHN0LT50ZXh0KQorCitzdHJ1Y3QgbWVudSB7CisJc3RydWN0IG1lbnUgKm5leHQ7CisJc3RydWN0IG1lbnUgKnBhcmVudDsKKwlzdHJ1Y3QgbWVudSAqbGlzdDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9tcHQ7CisJc3RydWN0IGV4cHIgKmRlcDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJLy9jaGFyICpoZWxwOworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCBsaW5lbm87CisJdm9pZCAqZGF0YTsKK307CisKKyNkZWZpbmUgTUVOVV9DSEFOR0VECQkweDAwMDEKKyNkZWZpbmUgTUVOVV9ST09UCQkweDAwMDIKKworI2lmbmRlZiBTV0lHCisKK2V4dGVybiBzdHJ1Y3QgZmlsZSAqZmlsZV9saXN0OworZXh0ZXJuIHN0cnVjdCBmaWxlICpjdXJyZW50X2ZpbGU7CitzdHJ1Y3QgZmlsZSAqbG9va3VwX2ZpbGUoY29uc3QgY2hhciAqbmFtZSk7CisKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sIHN5bWJvbF95ZXMsIHN5bWJvbF9ubywgc3ltYm9sX21vZDsKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICptb2R1bGVzX3N5bTsKK2V4dGVybiBpbnQgY2RlYnVnOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19vbmUoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmNlKTsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX3R3byhlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19jb21wKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnMxLCBzdHJ1Y3Qgc3ltYm9sICpzMik7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19hbmQoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOworc3RydWN0IGV4cHIgKmV4cHJfY29weShzdHJ1Y3QgZXhwciAqb3JnKTsKK3ZvaWQgZXhwcl9mcmVlKHN0cnVjdCBleHByICplKTsKK2ludCBleHByX2VxKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3ZvaWQgZXhwcl9lbGltaW5hdGVfZXEoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKK3RyaXN0YXRlIGV4cHJfY2FsY192YWx1ZShzdHJ1Y3QgZXhwciAqZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfeW4oc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfYm9vbChzdHJ1Y3QgZXhwciAqZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfZHVwcyhzdHJ1Y3QgZXhwciAqZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc2Zvcm0oc3RydWN0IGV4cHIgKmUpOworaW50IGV4cHJfY29udGFpbnNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSk7Citib29sIGV4cHJfZGVwZW5kc19zeW1ib2woc3RydWN0IGV4cHIgKmRlcCwgc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfYW5kKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7CitzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX29yKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7Cit2b2lkIGV4cHJfZXh0cmFjdF9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfY29tcGFyZShzdHJ1Y3QgZXhwciAqZSwgZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKTsKKwordm9pZCBleHByX2ZwcmludChzdHJ1Y3QgZXhwciAqZSwgRklMRSAqb3V0KTsKK3N0cnVjdCBnc3RyOyAvKiBmb3J3YXJkICovCit2b2lkIGV4cHJfZ3N0cl9wcmludChzdHJ1Y3QgZXhwciAqZSwgc3RydWN0IGdzdHIgKmdzKTsKKworc3RhdGljIGlubGluZSBpbnQgZXhwcl9pc195ZXMoc3RydWN0IGV4cHIgKmUpCit7CisJcmV0dXJuICFlIHx8IChlLT50eXBlID09IEVfU1lNQk9MICYmIGUtPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXhwcl9pc19ubyhzdHJ1Y3QgZXhwciAqZSkKK3sKKwlyZXR1cm4gZSAmJiAoZS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKTsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogRVhQUl9IICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWIxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwpAQCAtMCwwICsxLDE2NDQgQEAKKy8qIEhleSBFTUFDUyAtKi0gbGludXgtYyAtKi0gKi8KKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgUm9tYWluIExpZXZpbiA8cm9tc0B0aWxwLmluZm8+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsa2MuaCIKKyNpbmNsdWRlICJpbWFnZXMuYyIKKworI2luY2x1ZGUgPGdsYWRlL2dsYWRlLmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnZGsvZ2Rra2V5c3ltcy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vI2RlZmluZSBERUJVRworCitlbnVtIHsKKwlTSU5HTEVfVklFVywgU1BMSVRfVklFVywgRlVMTF9WSUVXCit9OworCitzdGF0aWMgZ2ludCB2aWV3X21vZGUgPSBGVUxMX1ZJRVc7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd19uYW1lID0gVFJVRTsKK3N0YXRpYyBnYm9vbGVhbiBzaG93X3JhbmdlID0gVFJVRTsKK3N0YXRpYyBnYm9vbGVhbiBzaG93X3ZhbHVlID0gVFJVRTsKK3N0YXRpYyBnYm9vbGVhbiBzaG93X2FsbCA9IEZBTFNFOworc3RhdGljIGdib29sZWFuIHNob3dfZGVidWcgPSBGQUxTRTsKK3N0YXRpYyBnYm9vbGVhbiByZXNpemVhYmxlID0gRkFMU0U7CisKK3N0YXRpYyBnYm9vbGVhbiBjb25maWdfY2hhbmdlZCA9IEZBTFNFOworCitzdGF0aWMgY2hhciBub2hlbHBfdGV4dFtdID0KKyAgICBOXygiU29ycnksIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbiB5ZXQuXG4iKTsKKworR3RrV2lkZ2V0ICptYWluX3duZCA9IE5VTEw7CitHdGtXaWRnZXQgKnRyZWUxX3cgPSBOVUxMOwkvLyBsZWZ0ICBmcmFtZQorR3RrV2lkZ2V0ICp0cmVlMl93ID0gTlVMTDsJLy8gcmlnaHQgZnJhbWUKK0d0a1dpZGdldCAqdGV4dF93ID0gTlVMTDsKK0d0a1dpZGdldCAqaHBhbmVkID0gTlVMTDsKK0d0a1dpZGdldCAqdnBhbmVkID0gTlVMTDsKK0d0a1dpZGdldCAqYmFja19idG4gPSBOVUxMOworCitHdGtUZXh0VGFnICp0YWcxLCAqdGFnMjsKK0dka0NvbG9yIGNvbG9yOworCitHdGtUcmVlU3RvcmUgKnRyZWUxLCAqdHJlZTIsICp0cmVlOworR3RrVHJlZU1vZGVsICptb2RlbDEsICptb2RlbDI7CitzdGF0aWMgR3RrVHJlZUl0ZXIgKnBhcmVudHNbMjU2XTsKK3N0YXRpYyBnaW50IGluZGVudDsKKworc3RhdGljIHN0cnVjdCBtZW51ICpjdXJyZW50OyAvLyBjdXJyZW50IG5vZGUgZm9yIFNJTkdMRSB2aWV3CitzdGF0aWMgc3RydWN0IG1lbnUgKmJyb3dzZWQ7IC8vIGJyb3dzZWQgbm9kZSBmb3IgU1BMSVQgdmlldworCitlbnVtIHsKKwlDT0xfT1BUSU9OLCBDT0xfTkFNRSwgQ09MX05PLCBDT0xfTU9ELCBDT0xfWUVTLCBDT0xfVkFMVUUsCisJQ09MX01FTlUsIENPTF9DT0xPUiwgQ09MX0VESVQsIENPTF9QSVhCVUYsCisJQ09MX1BJWFZJUywgQ09MX0JUTlZJUywgQ09MX0JUTkFDVCwgQ09MX0JUTklOQywgQ09MX0JUTlJBRCwKKwlDT0xfTlVNQkVSCit9OworCitzdGF0aWMgdm9pZCBkaXNwbGF5X2xpc3Qodm9pZCk7CitzdGF0aWMgdm9pZCBkaXNwbGF5X3RyZWUoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgZGlzcGxheV90cmVlX3BhcnQodm9pZCk7CitzdGF0aWMgdm9pZCB1cGRhdGVfdHJlZShzdHJ1Y3QgbWVudSAqc3JjLCBHdGtUcmVlSXRlciAqIGRzdCk7CitzdGF0aWMgdm9pZCBzZXRfbm9kZShHdGtUcmVlSXRlciAqIG5vZGUsIHN0cnVjdCBtZW51ICptZW51LCBnY2hhciAqKiByb3cpOworc3RhdGljIGdjaGFyICoqZmlsbF9yb3coc3RydWN0IG1lbnUgKm1lbnUpOworCisKKy8qIEhlbHBpbmcvRGVidWdnaW5nIEZ1bmN0aW9ucyAqLworCisKK2NvbnN0IGNoYXIgKmRiZ19wcmludF9zdHlwZShpbnQgdmFsKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdOworCisJbWVtc2V0KGJ1ZiwgMCwgMjU2KTsKKworCWlmICh2YWwgPT0gU19VTktOT1dOKQorCQlzdHJjcHkoYnVmLCAidW5rbm93biIpOworCWlmICh2YWwgPT0gU19CT09MRUFOKQorCQlzdHJjcHkoYnVmLCAiYm9vbGVhbiIpOworCWlmICh2YWwgPT0gU19UUklTVEFURSkKKwkJc3RyY3B5KGJ1ZiwgInRyaXN0YXRlIik7CisJaWYgKHZhbCA9PSBTX0lOVCkKKwkJc3RyY3B5KGJ1ZiwgImludCIpOworCWlmICh2YWwgPT0gU19IRVgpCisJCXN0cmNweShidWYsICJoZXgiKTsKKwlpZiAodmFsID09IFNfU1RSSU5HKQorCQlzdHJjcHkoYnVmLCAic3RyaW5nIik7CisJaWYgKHZhbCA9PSBTX09USEVSKQorCQlzdHJjcHkoYnVmLCAib3RoZXIiKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmKCIlcyIsIGJ1Zik7CisjZW5kaWYKKworCXJldHVybiBidWY7Cit9CisKK2NvbnN0IGNoYXIgKmRiZ19wcmludF9mbGFncyhpbnQgdmFsKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdOworCisJbWVtc2V0KGJ1ZiwgMCwgMjU2KTsKKworCWlmICh2YWwgJiBTWU1CT0xfWUVTKQorCQlzdHJjYXQoYnVmLCAieWVzLyIpOworCWlmICh2YWwgJiBTWU1CT0xfTU9EKQorCQlzdHJjYXQoYnVmLCAibW9kLyIpOworCWlmICh2YWwgJiBTWU1CT0xfTk8pCisJCXN0cmNhdChidWYsICJuby8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NPTlNUKQorCQlzdHJjYXQoYnVmLCAiY29uc3QvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9DSEVDSykKKwkJc3RyY2F0KGJ1ZiwgImNoZWNrLyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ0hPSUNFKQorCQlzdHJjYXQoYnVmLCAiY2hvaWNlLyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ0hPSUNFVkFMKQorCQlzdHJjYXQoYnVmLCAiY2hvaWNldmFsLyIpOworCWlmICh2YWwgJiBTWU1CT0xfUFJJTlRFRCkKKwkJc3RyY2F0KGJ1ZiwgInByaW50ZWQvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9WQUxJRCkKKwkJc3RyY2F0KGJ1ZiwgInZhbGlkLyIpOworCWlmICh2YWwgJiBTWU1CT0xfT1BUSU9OQUwpCisJCXN0cmNhdChidWYsICJvcHRpb25hbC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX1dSSVRFKQorCQlzdHJjYXQoYnVmLCAid3JpdGUvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9DSEFOR0VEKQorCQlzdHJjYXQoYnVmLCAiY2hhbmdlZC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX05FVykKKwkJc3RyY2F0KGJ1ZiwgIm5ldy8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0FVVE8pCisJCXN0cmNhdChidWYsICJhdXRvLyIpOworCisJYnVmW3N0cmxlbihidWYpIC0gMV0gPSAnXDAnOworI2lmZGVmIERFQlVHCisJcHJpbnRmKCIlcyIsIGJ1Zik7CisjZW5kaWYKKworCXJldHVybiBidWY7Cit9CisKK2NvbnN0IGNoYXIgKmRiZ19wcmludF9wdHlwZShpbnQgdmFsKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdOworCisJbWVtc2V0KGJ1ZiwgMCwgMjU2KTsKKworCWlmICh2YWwgPT0gUF9VTktOT1dOKQorCQlzdHJjcHkoYnVmLCAidW5rbm93biIpOworCWlmICh2YWwgPT0gUF9QUk9NUFQpCisJCXN0cmNweShidWYsICJwcm9tcHQiKTsKKwlpZiAodmFsID09IFBfQ09NTUVOVCkKKwkJc3RyY3B5KGJ1ZiwgImNvbW1lbnQiKTsKKwlpZiAodmFsID09IFBfTUVOVSkKKwkJc3RyY3B5KGJ1ZiwgIm1lbnUiKTsKKwlpZiAodmFsID09IFBfREVGQVVMVCkKKwkJc3RyY3B5KGJ1ZiwgImRlZmF1bHQiKTsKKwlpZiAodmFsID09IFBfQ0hPSUNFKQorCQlzdHJjcHkoYnVmLCAiY2hvaWNlIik7CisKKyNpZmRlZiBERUJVRworCXByaW50ZigiJXMiLCBidWYpOworI2VuZGlmCisKKwlyZXR1cm4gYnVmOworfQorCisKK3ZvaWQgcmVwbGFjZV9idXR0b25faWNvbihHbGFkZVhNTCAqIHhtbCwgR2RrRHJhd2FibGUgKiB3aW5kb3csCisJCQkgR3RrU3R5bGUgKiBzdHlsZSwgZ2NoYXIgKiBidG5fbmFtZSwgZ2NoYXIgKiogeHBtKQoreworCUdka1BpeG1hcCAqcGl4bWFwOworCUdka0JpdG1hcCAqbWFzazsKKwlHdGtUb29sQnV0dG9uICpidXR0b247CisJR3RrV2lkZ2V0ICppbWFnZTsKKworCXBpeG1hcCA9IGdka19waXhtYXBfY3JlYXRlX2Zyb21feHBtX2Qod2luZG93LCAmbWFzaywKKwkJCQkJICAgICAgJnN0eWxlLT5iZ1tHVEtfU1RBVEVfTk9STUFMXSwKKwkJCQkJICAgICAgeHBtKTsKKworCWJ1dHRvbiA9IEdUS19UT09MX0JVVFRPTihnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsIGJ0bl9uYW1lKSk7CisJaW1hZ2UgPSBndGtfaW1hZ2VfbmV3X2Zyb21fcGl4bWFwKHBpeG1hcCwgbWFzayk7CisJZ3RrX3dpZGdldF9zaG93KGltYWdlKTsKKwlndGtfdG9vbF9idXR0b25fc2V0X2ljb25fd2lkZ2V0KGJ1dHRvbiwgaW1hZ2UpOworfQorCisvKiBNYWluIFdpbmRvdyBJbml0aWFsaXphdGlvbiAqLwordm9pZCBpbml0X21haW5fd2luZG93KGNvbnN0IGdjaGFyICogZ2xhZGVfZmlsZSkKK3sKKwlHbGFkZVhNTCAqeG1sOworCUd0a1dpZGdldCAqd2lkZ2V0OworCUd0a1RleHRCdWZmZXIgKnR4dGJ1ZjsKKwljaGFyIHRpdGxlWzI1Nl07CisJR3RrU3R5bGUgKnN0eWxlOworCisJeG1sID0gZ2xhZGVfeG1sX25ldyhnbGFkZV9maWxlLCAid2luZG93MSIsIE5VTEwpOworCWlmICgheG1sKQorCQlnX2Vycm9yKF8oIkdVSSBsb2FkaW5nIGZhaWxlZCAhXG4iKSk7CisJZ2xhZGVfeG1sX3NpZ25hbF9hdXRvY29ubmVjdCh4bWwpOworCisJbWFpbl93bmQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ3aW5kb3cxIik7CisJaHBhbmVkID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiaHBhbmVkMSIpOworCXZwYW5lZCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInZwYW5lZDEiKTsKKwl0cmVlMV93ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAidHJlZXZpZXcxIik7CisJdHJlZTJfdyA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInRyZWV2aWV3MiIpOworCXRleHRfdyA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInRleHR2aWV3MyIpOworCisJYmFja19idG4gPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJidXR0b24xIik7CisJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBGQUxTRSk7CisKKwl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJzaG93X25hbWUxIik7CisJZ3RrX2NoZWNrX21lbnVfaXRlbV9zZXRfYWN0aXZlKChHdGtDaGVja01lbnVJdGVtICopIHdpZGdldCwKKwkJCQkgICAgICAgc2hvd19uYW1lKTsKKworCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInNob3dfcmFuZ2UxIik7CisJZ3RrX2NoZWNrX21lbnVfaXRlbV9zZXRfYWN0aXZlKChHdGtDaGVja01lbnVJdGVtICopIHdpZGdldCwKKwkJCQkgICAgICAgc2hvd19yYW5nZSk7CisKKwl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJzaG93X2RhdGExIik7CisJZ3RrX2NoZWNrX21lbnVfaXRlbV9zZXRfYWN0aXZlKChHdGtDaGVja01lbnVJdGVtICopIHdpZGdldCwKKwkJCQkgICAgICAgc2hvd192YWx1ZSk7CisKKwlzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKG1haW5fd25kKTsKKwl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0b29sYmFyMSIpOworCisjaWYgMAkvKiBVc2Ugc3RvY2sgR3RrIGljb25zIGluc3RlYWQgKi8KKwlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCisJCQkgICAgImJ1dHRvbjEiLCAoZ2NoYXIgKiopIHhwbV9iYWNrKTsKKwlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCisJCQkgICAgImJ1dHRvbjIiLCAoZ2NoYXIgKiopIHhwbV9sb2FkKTsKKwlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCisJCQkgICAgImJ1dHRvbjMiLCAoZ2NoYXIgKiopIHhwbV9zYXZlKTsKKyNlbmRpZgorCXJlcGxhY2VfYnV0dG9uX2ljb24oeG1sLCBtYWluX3duZC0+d2luZG93LCBzdHlsZSwKKwkJCSAgICAiYnV0dG9uNCIsIChnY2hhciAqKikgeHBtX3NpbmdsZV92aWV3KTsKKwlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCisJCQkgICAgImJ1dHRvbjUiLCAoZ2NoYXIgKiopIHhwbV9zcGxpdF92aWV3KTsKKwlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCisJCQkgICAgImJ1dHRvbjYiLCAoZ2NoYXIgKiopIHhwbV90cmVlX3ZpZXcpOworCisjaWYgMAorCXN3aXRjaCAodmlld19tb2RlKSB7CisJY2FzZSBTSU5HTEVfVklFVzoKKwkJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiYnV0dG9uNCIpOworCQlnX3NpZ25hbF9lbWl0X2J5X25hbWUod2lkZ2V0LCAiY2xpY2tlZCIpOworCQlicmVhazsKKwljYXNlIFNQTElUX1ZJRVc6CisJCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjUiKTsKKwkJZ19zaWduYWxfZW1pdF9ieV9uYW1lKHdpZGdldCwgImNsaWNrZWQiKTsKKwkJYnJlYWs7CisJY2FzZSBGVUxMX1ZJRVc6CisJCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjYiKTsKKwkJZ19zaWduYWxfZW1pdF9ieV9uYW1lKHdpZGdldCwgImNsaWNrZWQiKTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJdHh0YnVmID0gZ3RrX3RleHRfdmlld19nZXRfYnVmZmVyKEdUS19URVhUX1ZJRVcodGV4dF93KSk7CisJdGFnMSA9IGd0a190ZXh0X2J1ZmZlcl9jcmVhdGVfdGFnKHR4dGJ1ZiwgIm15dGFnMSIsCisJCQkJCSAgImZvcmVncm91bmQiLCAicmVkIiwKKwkJCQkJICAid2VpZ2h0IiwgUEFOR09fV0VJR0hUX0JPTEQsCisJCQkJCSAgTlVMTCk7CisJdGFnMiA9IGd0a190ZXh0X2J1ZmZlcl9jcmVhdGVfdGFnKHR4dGJ1ZiwgIm15dGFnMiIsCisJCQkJCSAgLyoic3R5bGUiLCBQQU5HT19TVFlMRV9PQkxJUVVFLCAqLworCQkJCQkgIE5VTEwpOworCisJc3ByaW50Zih0aXRsZSwgXygiQnVzeUJveCAlcyBDb25maWd1cmF0aW9uIiksCisJCWdldGVudigiS0VSTkVMVkVSU0lPTiIpKTsKKwlndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKG1haW5fd25kKSwgdGl0bGUpOworCisJZ3RrX3dpZGdldF9zaG93KG1haW5fd25kKTsKK30KKwordm9pZCBpbml0X3RyZWVfbW9kZWwodm9pZCkKK3sKKwlnaW50IGk7CisKKwl0cmVlID0gdHJlZTIgPSBndGtfdHJlZV9zdG9yZV9uZXcoQ09MX05VTUJFUiwKKwkJCQkJICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCQkgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJCSAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkJICBHX1RZUEVfUE9JTlRFUiwgR0RLX1RZUEVfQ09MT1IsCisJCQkJCSAgR19UWVBFX0JPT0xFQU4sIEdES19UWVBFX1BJWEJVRiwKKwkJCQkJICBHX1RZUEVfQk9PTEVBTiwgR19UWVBFX0JPT0xFQU4sCisJCQkJCSAgR19UWVBFX0JPT0xFQU4sIEdfVFlQRV9CT09MRUFOLAorCQkJCQkgIEdfVFlQRV9CT09MRUFOKTsKKwltb2RlbDIgPSBHVEtfVFJFRV9NT0RFTCh0cmVlMik7CisKKwlmb3IgKHBhcmVudHNbMF0gPSBOVUxMLCBpID0gMTsgaSA8IDI1NjsgaSsrKQorCQlwYXJlbnRzW2ldID0gKEd0a1RyZWVJdGVyICopIGdfbWFsbG9jKHNpemVvZihHdGtUcmVlSXRlcikpOworCisJdHJlZTEgPSBndGtfdHJlZV9zdG9yZV9uZXcoQ09MX05VTUJFUiwKKwkJCQkgICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCSAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJICAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkgICBHX1RZUEVfUE9JTlRFUiwgR0RLX1RZUEVfQ09MT1IsCisJCQkJICAgR19UWVBFX0JPT0xFQU4sIEdES19UWVBFX1BJWEJVRiwKKwkJCQkgICBHX1RZUEVfQk9PTEVBTiwgR19UWVBFX0JPT0xFQU4sCisJCQkJICAgR19UWVBFX0JPT0xFQU4sIEdfVFlQRV9CT09MRUFOLAorCQkJCSAgIEdfVFlQRV9CT09MRUFOKTsKKwltb2RlbDEgPSBHVEtfVFJFRV9NT0RFTCh0cmVlMSk7Cit9CisKK3ZvaWQgaW5pdF9sZWZ0X3RyZWUodm9pZCkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcodHJlZTFfdyk7CisJR3RrQ2VsbFJlbmRlcmVyICpyZW5kZXJlcjsKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWw7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKworCWd0a190cmVlX3ZpZXdfc2V0X21vZGVsKHZpZXcsIG1vZGVsMSk7CisJZ3RrX3RyZWVfdmlld19zZXRfaGVhZGVyc192aXNpYmxlKHZpZXcsIFRSVUUpOworCWd0a190cmVlX3ZpZXdfc2V0X3J1bGVzX2hpbnQodmlldywgRkFMU0UpOworCisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19jb2x1bW5fbmV3KCk7CisJZ3RrX3RyZWVfdmlld19hcHBlbmRfY29sdW1uKHZpZXcsIGNvbHVtbik7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3RpdGxlKGNvbHVtbiwgXygiT3B0aW9ucyIpKTsKKworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdG9nZ2xlX25ldygpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAiYWN0aXZlIiwgQ09MX0JUTkFDVCwKKwkJCQkJICAgICJpbmNvbnNpc3RlbnQiLCBDT0xfQlROSU5DLAorCQkJCQkgICAgInZpc2libGUiLCBDT0xfQlROVklTLAorCQkJCQkgICAgInJhZGlvIiwgQ09MX0JUTlJBRCwgTlVMTCk7CisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAidGV4dCIsIENPTF9PUFRJT04sCisJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKworCXNlbCA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbih2aWV3KTsKKwlndGtfdHJlZV9zZWxlY3Rpb25fc2V0X21vZGUoc2VsLCBHVEtfU0VMRUNUSU9OX1NJTkdMRSk7CisJZ3RrX3dpZGdldF9yZWFsaXplKHRyZWUxX3cpOworfQorCitzdGF0aWMgdm9pZCByZW5kZXJlcl9lZGl0ZWQoR3RrQ2VsbFJlbmRlcmVyVGV4dCAqIGNlbGwsCisJCQkgICAgY29uc3QgZ2NoYXIgKiBwYXRoX3N0cmluZywKKwkJCSAgICBjb25zdCBnY2hhciAqIG5ld190ZXh0LCBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIHZvaWQgcmVuZGVyZXJfdG9nZ2xlZChHdGtDZWxsUmVuZGVyZXJUb2dnbGUgKiBjZWxscmVuZGVyZXJ0b2dnbGUsCisJCQkgICAgIGdjaGFyICogYXJnMSwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKwordm9pZCBpbml0X3JpZ2h0X3RyZWUodm9pZCkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcodHJlZTJfdyk7CisJR3RrQ2VsbFJlbmRlcmVyICpyZW5kZXJlcjsKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWw7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlnaW50IGk7CisKKwlndGtfdHJlZV92aWV3X3NldF9tb2RlbCh2aWV3LCBtb2RlbDIpOworCWd0a190cmVlX3ZpZXdfc2V0X2hlYWRlcnNfdmlzaWJsZSh2aWV3LCBUUlVFKTsKKwlndGtfdHJlZV92aWV3X3NldF9ydWxlc19oaW50KHZpZXcsIEZBTFNFKTsKKworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfY29sdW1uX25ldygpOworCWd0a190cmVlX3ZpZXdfYXBwZW5kX2NvbHVtbih2aWV3LCBjb2x1bW4pOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZShjb2x1bW4sIF8oIk9wdGlvbnMiKSk7CisKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3BpeGJ1Zl9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgInBpeGJ1ZiIsIENPTF9QSVhCVUYsCisJCQkJCSAgICAidmlzaWJsZSIsIENPTF9QSVhWSVMsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdG9nZ2xlX25ldygpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAiYWN0aXZlIiwgQ09MX0JUTkFDVCwKKwkJCQkJICAgICJpbmNvbnNpc3RlbnQiLCBDT0xfQlROSU5DLAorCQkJCQkgICAgInZpc2libGUiLCBDT0xfQlROVklTLAorCQkJCQkgICAgInJhZGlvIiwgQ09MX0JUTlJBRCwgTlVMTCk7CisJLypnX3NpZ25hbF9jb25uZWN0KEdfT0JKRUNUKHJlbmRlcmVyKSwgInRvZ2dsZWQiLAorCSAgIEdfQ0FMTEJBQ0socmVuZGVyZXJfdG9nZ2xlZCksIE5VTEwpOyAqLworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgInRleHQiLCBDT0xfT1BUSU9OLAorCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICBfKCJOYW1lIiksIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX05BTUUsCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fd2l0aF9hdHRyaWJ1dGVzKHZpZXcsIC0xLAorCQkJCQkJICAgICJOIiwgcmVuZGVyZXIsCisJCQkJCQkgICAgInRleHQiLCBDT0xfTk8sCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fd2l0aF9hdHRyaWJ1dGVzKHZpZXcsIC0xLAorCQkJCQkJICAgICJNIiwgcmVuZGVyZXIsCisJCQkJCQkgICAgInRleHQiLCBDT0xfTU9ELAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICAiWSIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX1lFUywKKwkJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgXygiVmFsdWUiKSwgcmVuZGVyZXIsCisJCQkJCQkgICAgInRleHQiLCBDT0xfVkFMVUUsCisJCQkJCQkgICAgImVkaXRhYmxlIiwKKwkJCQkJCSAgICBDT0xfRURJVCwKKwkJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisJZ19zaWduYWxfY29ubmVjdChHX09CSkVDVChyZW5kZXJlciksICJlZGl0ZWQiLAorCQkJIEdfQ0FMTEJBQ0socmVuZGVyZXJfZWRpdGVkKSwgTlVMTCk7CisKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX05BTUUpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbHVtbiwgc2hvd19uYW1lKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX05PKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfcmFuZ2UpOworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbih2aWV3LCBDT0xfTU9EKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfcmFuZ2UpOworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbih2aWV3LCBDT0xfWUVTKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfcmFuZ2UpOworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbih2aWV3LCBDT0xfVkFMVUUpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbHVtbiwgc2hvd192YWx1ZSk7CisKKwlpZiAocmVzaXplYWJsZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQ09MX1ZBTFVFOyBpKyspIHsKKwkJCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbih2aWV3LCBpKTsKKwkJCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF9yZXNpemFibGUoY29sdW1uLCBUUlVFKTsKKwkJfQorCX0KKworCXNlbCA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbih2aWV3KTsKKwlndGtfdHJlZV9zZWxlY3Rpb25fc2V0X21vZGUoc2VsLCBHVEtfU0VMRUNUSU9OX1NJTkdMRSk7Cit9CisKKworLyogVXRpbGl0eSBGdW5jdGlvbnMgKi8KKworCitzdGF0aWMgdm9pZCB0ZXh0X2luc2VydF9oZWxwKHN0cnVjdCBtZW51ICptZW51KQoreworCUd0a1RleHRCdWZmZXIgKmJ1ZmZlcjsKKwlHdGtUZXh0SXRlciBzdGFydCwgZW5kOworCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwlnY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpoZWxwID0gXyhub2hlbHBfdGV4dCk7CisKKwlpZiAoIW1lbnUtPnN5bSkKKwkJaGVscCA9ICIiOworCWVsc2UgaWYgKG1lbnUtPnN5bS0+aGVscCkKKwkJaGVscCA9IF8obWVudS0+c3ltLT5oZWxwKTsKKworCWlmIChtZW51LT5zeW0gJiYgbWVudS0+c3ltLT5uYW1lKQorCQluYW1lID0gZ19zdHJkdXBfcHJpbnRmKF8obWVudS0+c3ltLT5uYW1lKSk7CisJZWxzZQorCQluYW1lID0gZ19zdHJkdXAoIiIpOworCisJYnVmZmVyID0gZ3RrX3RleHRfdmlld19nZXRfYnVmZmVyKEdUS19URVhUX1ZJRVcodGV4dF93KSk7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHMoYnVmZmVyLCAmc3RhcnQsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9kZWxldGUoYnVmZmVyLCAmc3RhcnQsICZlbmQpOworCWd0a190ZXh0X3ZpZXdfc2V0X2xlZnRfbWFyZ2luKEdUS19URVhUX1ZJRVcodGV4dF93KSwgMTUpOworCisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgcHJvbXB0LCAtMSwgdGFnMSwKKwkJCQkJIE5VTEwpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfYXRfY3Vyc29yKGJ1ZmZlciwgIiAiLCAxKTsKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCBuYW1lLCAtMSwgdGFnMSwKKwkJCQkJIE5VTEwpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfYXRfY3Vyc29yKGJ1ZmZlciwgIlxuXG4iLCAyKTsKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCBoZWxwLCAtMSwgdGFnMiwKKwkJCQkJIE5VTEwpOworfQorCisKK3N0YXRpYyB2b2lkIHRleHRfaW5zZXJ0X21zZyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwlHdGtUZXh0QnVmZmVyICpidWZmZXI7CisJR3RrVGV4dEl0ZXIgc3RhcnQsIGVuZDsKKwljb25zdCBjaGFyICptc2cgPSBtZXNzYWdlOworCisJYnVmZmVyID0gZ3RrX3RleHRfdmlld19nZXRfYnVmZmVyKEdUS19URVhUX1ZJRVcodGV4dF93KSk7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHMoYnVmZmVyLCAmc3RhcnQsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9kZWxldGUoYnVmZmVyLCAmc3RhcnQsICZlbmQpOworCWd0a190ZXh0X3ZpZXdfc2V0X2xlZnRfbWFyZ2luKEdUS19URVhUX1ZJRVcodGV4dF93KSwgMTUpOworCisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgdGl0bGUsIC0xLCB0YWcxLAorCQkJCQkgTlVMTCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF9hdF9jdXJzb3IoYnVmZmVyLCAiXG5cbiIsIDIpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIG1zZywgLTEsIHRhZzIsCisJCQkJCSBOVUxMKTsKK30KKworCisvKiBNYWluIFdpbmRvd3MgQ2FsbGJhY2tzICovCisKK3ZvaWQgb25fc2F2ZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK2dib29sZWFuIG9uX3dpbmRvdzFfZGVsZXRlX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwgR2RrRXZlbnQgKiBldmVudCwKKwkJCQkgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZGlhbG9nLCAqbGFiZWw7CisJZ2ludCByZXN1bHQ7CisKKwlpZiAoY29uZmlnX2NoYW5nZWQgPT0gRkFMU0UpCisJCXJldHVybiBGQUxTRTsKKworCWRpYWxvZyA9IGd0a19kaWFsb2dfbmV3X3dpdGhfYnV0dG9ucyhfKCJXYXJuaW5nICEiKSwKKwkJCQkJICAgICBHVEtfV0lORE9XKG1haW5fd25kKSwKKwkJCQkJICAgICAoR3RrRGlhbG9nRmxhZ3MpCisJCQkJCSAgICAgKEdUS19ESUFMT0dfTU9EQUwgfAorCQkJCQkgICAgICBHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQpLAorCQkJCQkgICAgIEdUS19TVE9DS19PSywKKwkJCQkJICAgICBHVEtfUkVTUE9OU0VfWUVTLAorCQkJCQkgICAgIEdUS19TVE9DS19OTywKKwkJCQkJICAgICBHVEtfUkVTUE9OU0VfTk8sCisJCQkJCSAgICAgR1RLX1NUT0NLX0NBTkNFTCwKKwkJCQkJICAgICBHVEtfUkVTUE9OU0VfQ0FOQ0VMLCBOVUxMKTsKKwlndGtfZGlhbG9nX3NldF9kZWZhdWx0X3Jlc3BvbnNlKEdUS19ESUFMT0coZGlhbG9nKSwKKwkJCQkJR1RLX1JFU1BPTlNFX0NBTkNFTCk7CisKKwlsYWJlbCA9IGd0a19sYWJlbF9uZXcoXygiXG5TYXZlIGNvbmZpZ3VyYXRpb24gP1xuIikpOworCWd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoR1RLX0RJQUxPRyhkaWFsb2cpLT52Ym94KSwgbGFiZWwpOworCWd0a193aWRnZXRfc2hvdyhsYWJlbCk7CisKKwlyZXN1bHQgPSBndGtfZGlhbG9nX3J1bihHVEtfRElBTE9HKGRpYWxvZykpOworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSBHVEtfUkVTUE9OU0VfWUVTOgorCQlvbl9zYXZlMV9hY3RpdmF0ZShOVUxMLCBOVUxMKTsKKwkJcmV0dXJuIEZBTFNFOworCWNhc2UgR1RLX1JFU1BPTlNFX05POgorCQlyZXR1cm4gRkFMU0U7CisJY2FzZSBHVEtfUkVTUE9OU0VfQ0FOQ0VMOgorCWNhc2UgR1RLX1JFU1BPTlNFX0RFTEVURV9FVkVOVDoKKwlkZWZhdWx0OgorCQlndGtfd2lkZ2V0X2Rlc3Ryb3koZGlhbG9nKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisKK3ZvaWQgb25fd2luZG93MV9kZXN0cm95KEd0a09iamVjdCAqIG9iamVjdCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWd0a19tYWluX3F1aXQoKTsKK30KKworCit2b2lkCitvbl93aW5kb3cxX3NpemVfcmVxdWVzdChHdGtXaWRnZXQgKiB3aWRnZXQsCisJCQlHdGtSZXF1aXNpdGlvbiAqIHJlcXVpc2l0aW9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJc3RhdGljIGdpbnQgb2xkX2g7CisJZ2ludCB3LCBoOworCisJaWYgKHdpZGdldC0+d2luZG93ID09IE5VTEwpCisJCWd0a193aW5kb3dfZ2V0X2RlZmF1bHRfc2l6ZShHVEtfV0lORE9XKG1haW5fd25kKSwgJncsICZoKTsKKwllbHNlCisJCWdka193aW5kb3dfZ2V0X3NpemUod2lkZ2V0LT53aW5kb3csICZ3LCAmaCk7CisKKwlpZiAoaCA9PSBvbGRfaCkKKwkJcmV0dXJuOworCW9sZF9oID0gaDsKKworCWd0a19wYW5lZF9zZXRfcG9zaXRpb24oR1RLX1BBTkVEKHZwYW5lZCksIDIgKiBoIC8gMyk7Cit9CisKKworLyogTWVudSAmIFRvb2xiYXIgQ2FsbGJhY2tzICovCisKKworc3RhdGljIHZvaWQKK2xvYWRfZmlsZW5hbWUoR3RrRmlsZVNlbGVjdGlvbiAqIGZpbGVfc2VsZWN0b3IsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwljb25zdCBnY2hhciAqZm47CisKKwlmbiA9IGd0a19maWxlX3NlbGVjdGlvbl9nZXRfZmlsZW5hbWUoR1RLX0ZJTEVfU0VMRUNUSU9OCisJCQkJCSAgICAgKHVzZXJfZGF0YSkpOworCisJaWYgKGNvbmZfcmVhZChmbikpCisJCXRleHRfaW5zZXJ0X21zZyhfKCJFcnJvciIpLCBfKCJVbmFibGUgdG8gbG9hZCBjb25maWd1cmF0aW9uICEiKSk7CisJZWxzZQorCQlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsKK30KKwordm9pZCBvbl9sb2FkMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpmczsKKworCWZzID0gZ3RrX2ZpbGVfc2VsZWN0aW9uX25ldyhfKCJMb2FkIGZpbGUuLi4iKSk7CisJZ19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKEdUS19GSUxFX1NFTEVDVElPTihmcyktPm9rX2J1dHRvbiksCisJCQkgImNsaWNrZWQiLAorCQkJIEdfQ0FMTEJBQ0sobG9hZF9maWxlbmFtZSksIChncG9pbnRlcikgZnMpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUCisJCQkJIChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5va19idXR0b24pLAorCQkJCSAiY2xpY2tlZCIsIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgKGdwb2ludGVyKSBmcyk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QKKwkJCQkgKEdUS19GSUxFX1NFTEVDVElPTihmcyktPmNhbmNlbF9idXR0b24pLAorCQkJCSAiY2xpY2tlZCIsIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgKGdwb2ludGVyKSBmcyk7CisJZ3RrX3dpZGdldF9zaG93KGZzKTsKK30KKworCit2b2lkIG9uX3NhdmUxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlpZiAoY29uZl93cml0ZShOVUxMKSkKKwkJdGV4dF9pbnNlcnRfbXNnKF8oIkVycm9yIiksIF8oIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24gISIpKTsKKworCWNvbmZpZ19jaGFuZ2VkID0gRkFMU0U7Cit9CisKKworc3RhdGljIHZvaWQKK3N0b3JlX2ZpbGVuYW1lKEd0a0ZpbGVTZWxlY3Rpb24gKiBmaWxlX3NlbGVjdG9yLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJY29uc3QgZ2NoYXIgKmZuOworCisJZm4gPSBndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X2ZpbGVuYW1lKEdUS19GSUxFX1NFTEVDVElPTgorCQkJCQkgICAgICh1c2VyX2RhdGEpKTsKKworCWlmIChjb25mX3dyaXRlKGZuKSkKKwkJdGV4dF9pbnNlcnRfbXNnKF8oIkVycm9yIiksIF8oIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24gISIpKTsKKworCWd0a193aWRnZXRfZGVzdHJveShHVEtfV0lER0VUKHVzZXJfZGF0YSkpOworfQorCit2b2lkIG9uX3NhdmVfYXMxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtXaWRnZXQgKmZzOworCisJZnMgPSBndGtfZmlsZV9zZWxlY3Rpb25fbmV3KF8oIlNhdmUgZmlsZSBhcy4uLiIpKTsKKwlnX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+b2tfYnV0dG9uKSwKKwkJCSAiY2xpY2tlZCIsCisJCQkgR19DQUxMQkFDSyhzdG9yZV9maWxlbmFtZSksIChncG9pbnRlcikgZnMpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUCisJCQkJIChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5va19idXR0b24pLAorCQkJCSAiY2xpY2tlZCIsIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgKGdwb2ludGVyKSBmcyk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QKKwkJCQkgKEdUS19GSUxFX1NFTEVDVElPTihmcyktPmNhbmNlbF9idXR0b24pLAorCQkJCSAiY2xpY2tlZCIsIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgKGdwb2ludGVyKSBmcyk7CisJZ3RrX3dpZGdldF9zaG93KGZzKTsKK30KKworCit2b2lkIG9uX3F1aXQxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlpZiAoIW9uX3dpbmRvdzFfZGVsZXRlX2V2ZW50KE5VTEwsIE5VTEwsIE5VTEwpKQorCQlndGtfd2lkZ2V0X2Rlc3Ryb3koR1RLX1dJREdFVChtYWluX3duZCkpOworfQorCisKK3ZvaWQgb25fc2hvd19uYW1lMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbDsKKworCXNob3dfbmFtZSA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIENPTF9OQU1FKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfbmFtZSk7Cit9CisKKwordm9pZCBvbl9zaG93X3JhbmdlMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbDsKKworCXNob3dfcmFuZ2UgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfTk8pOworCWlmIChjb2wpCisJCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbCwgc2hvd19yYW5nZSk7CisJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIENPTF9NT0QpOworCWlmIChjb2wpCisJCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbCwgc2hvd19yYW5nZSk7CisJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIENPTF9ZRVMpOworCWlmIChjb2wpCisJCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbCwgc2hvd19yYW5nZSk7CisKK30KKworCit2b2lkIG9uX3Nob3dfZGF0YTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwlzaG93X3ZhbHVlID0gR1RLX0NIRUNLX01FTlVfSVRFTShtZW51aXRlbSktPmFjdGl2ZTsKKwljb2wgPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4oR1RLX1RSRUVfVklFVyh0cmVlMl93KSwgQ09MX1ZBTFVFKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfdmFsdWUpOworfQorCisKK3ZvaWQKK29uX3Nob3dfYWxsX29wdGlvbnMxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlzaG93X2FsbCA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisKKwlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMik7CisJZGlzcGxheV90cmVlKCZyb290bWVudSk7CS8vIGluc3RlYWQgb2YgdXBkYXRlX3RyZWUgdG8gc3BlZWQtdXAKK30KKworCit2b2lkCitvbl9zaG93X2RlYnVnX2luZm8xX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlzaG93X2RlYnVnID0gR1RLX0NIRUNLX01FTlVfSVRFTShtZW51aXRlbSktPmFjdGl2ZTsKKwl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOworfQorCisKK3ZvaWQgb25faW50cm9kdWN0aW9uMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpkaWFsb2c7CisJY29uc3QgZ2NoYXIgKmludHJvX3RleHQgPSBfKAorCSAgICAiV2VsY29tZSB0byBna2MsIHRoZSBHVEsrIGdyYXBoaWNhbCBjb25maWd1cmF0aW9uIHRvb2wuXG4iCisJICAgICJGb3IgZWFjaCBvcHRpb24sIGEgYmxhbmsgYm94IGluZGljYXRlcyB0aGUgZmVhdHVyZSBpcyBkaXNhYmxlZCwgYVxuIgorCSAgICAiY2hlY2sgaW5kaWNhdGVzIGl0IGlzIGVuYWJsZWQsIGFuZCBhIGRvdCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyB0b1xuIgorCSAgICAiYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUuICBDbGlja2luZyBvbiB0aGUgYm94IHdpbGwgY3ljbGUgdGhyb3VnaCB0aGUgdGhyZWUgc3RhdGVzLlxuIgorCSAgICAiXG4iCisJICAgICJJZiB5b3UgZG8gbm90IHNlZSBhbiBvcHRpb24gKGUuZy4sIGEgZGV2aWNlIGRyaXZlcikgdGhhdCB5b3VcbiIKKwkgICAgImJlbGlldmUgc2hvdWxkIGJlIHByZXNlbnQsIHRyeSB0dXJuaW5nIG9uIFNob3cgQWxsIE9wdGlvbnNcbiIKKwkgICAgInVuZGVyIHRoZSBPcHRpb25zIG1lbnUuXG4iCisJICAgICJBbHRob3VnaCB0aGVyZSBpcyBubyBjcm9zcyByZWZlcmVuY2UgeWV0IHRvIGhlbHAgeW91IGZpZ3VyZSBvdXRcbiIKKwkgICAgIndoYXQgb3RoZXIgb3B0aW9ucyBtdXN0IGJlIGVuYWJsZWQgdG8gc3VwcG9ydCB0aGUgb3B0aW9uIHlvdVxuIgorCSAgICAiYXJlIGludGVyZXN0ZWQgaW4sIHlvdSBjYW4gc3RpbGwgdmlldyB0aGUgaGVscCBvZiBhIGdyYXllZC1vdXRcbiIKKwkgICAgIm9wdGlvbi5cbiIKKwkgICAgIlxuIgorCSAgICAiVG9nZ2xpbmcgU2hvdyBEZWJ1ZyBJbmZvIHVuZGVyIHRoZSBPcHRpb25zIG1lbnUgd2lsbCBzaG93XG4iCisJICAgICJ0aGUgZGVwZW5kZW5jaWVzLCB3aGljaCB5b3UgY2FuIHRoZW4gbWF0Y2ggYnkgZXhhbWluaW5nIG90aGVyIG9wdGlvbnMuIik7CisKKwlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KEdUS19XSU5ET1cobWFpbl93bmQpLAorCQkJCQlHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisJCQkJCUdUS19NRVNTQUdFX0lORk8sCisJCQkJCUdUS19CVVRUT05TX0NMT1NFLCBpbnRyb190ZXh0KTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVChkaWFsb2cpLCAicmVzcG9uc2UiLAorCQkJCSBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIEdUS19PQkpFQ1QoZGlhbG9nKSk7CisJZ3RrX3dpZGdldF9zaG93X2FsbChkaWFsb2cpOworfQorCisKK3ZvaWQgb25fYWJvdXQxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtXaWRnZXQgKmRpYWxvZzsKKwljb25zdCBnY2hhciAqYWJvdXRfdGV4dCA9CisJICAgIF8oImdrYyBpcyBjb3B5cmlnaHQgKGMpIDIwMDIgUm9tYWluIExpZXZpbiA8cm9tc0BscGcudGljYWxjLm9yZz4uXG4iCisJICAgICAgIkJhc2VkIG9uIHRoZSBzb3VyY2UgY29kZSBmcm9tIFJvbWFuIFppcHBlbC5cbiIpOworCisJZGlhbG9nID0gZ3RrX21lc3NhZ2VfZGlhbG9nX25ldyhHVEtfV0lORE9XKG1haW5fd25kKSwKKwkJCQkJR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5ULAorCQkJCQlHVEtfTUVTU0FHRV9JTkZPLAorCQkJCQlHVEtfQlVUVE9OU19DTE9TRSwgYWJvdXRfdGV4dCk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QoZGlhbG9nKSwgInJlc3BvbnNlIiwKKwkJCQkgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSBHVEtfT0JKRUNUKGRpYWxvZykpOworCWd0a193aWRnZXRfc2hvd19hbGwoZGlhbG9nKTsKK30KKworCit2b2lkIG9uX2xpY2Vuc2UxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtXaWRnZXQgKmRpYWxvZzsKKwljb25zdCBnY2hhciAqbGljZW5zZV90ZXh0ID0KKwkgICAgXygiZ2tjIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi5cbiIKKwkgICAgICAiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIHNvdXJjZSBjb2RlIG9yXG4iCisJICAgICAgInZpc2l0IGh0dHA6Ly93d3cuZnNmLm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sXG4iKTsKKworCWRpYWxvZyA9IGd0a19tZXNzYWdlX2RpYWxvZ19uZXcoR1RLX1dJTkRPVyhtYWluX3duZCksCisJCQkJCUdUS19ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCwKKwkJCQkJR1RLX01FU1NBR0VfSU5GTywKKwkJCQkJR1RLX0JVVFRPTlNfQ0xPU0UsIGxpY2Vuc2VfdGV4dCk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QoZGlhbG9nKSwgInJlc3BvbnNlIiwKKwkJCQkgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSBHVEtfT0JKRUNUKGRpYWxvZykpOworCWd0a193aWRnZXRfc2hvd19hbGwoZGlhbG9nKTsKK30KKworCit2b2lkIG9uX2JhY2tfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwllbnVtIHByb3BfdHlwZSBwdHlwZTsKKworCWN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7CisJcHR5cGUgPSBjdXJyZW50LT5wcm9tcHQgPyBjdXJyZW50LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJaWYgKHB0eXBlICE9IFBfTUVOVSkKKwkJY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKKwlkaXNwbGF5X3RyZWVfcGFydCgpOworCisJaWYgKGN1cnJlbnQgPT0gJnJvb3RtZW51KQorCQlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUoYmFja19idG4sIEZBTFNFKTsKK30KKworCit2b2lkIG9uX2xvYWRfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlvbl9sb2FkMV9hY3RpdmF0ZShOVUxMLCB1c2VyX2RhdGEpOworfQorCisKK3ZvaWQgb25fc2F2ZV9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCW9uX3NhdmUxX2FjdGl2YXRlKE5VTEwsIHVzZXJfZGF0YSk7Cit9CisKKwordm9pZCBvbl9zaW5nbGVfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwl2aWV3X21vZGUgPSBTSU5HTEVfVklFVzsKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRChocGFuZWQpLCAwKTsKKwlndGtfd2lkZ2V0X2hpZGUodHJlZTFfdyk7CisJY3VycmVudCA9ICZyb290bWVudTsKKwlkaXNwbGF5X3RyZWVfcGFydCgpOworfQorCisKK3ZvaWQgb25fc3BsaXRfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlnaW50IHcsIGg7CisJdmlld19tb2RlID0gU1BMSVRfVklFVzsKKwlndGtfd2lkZ2V0X3Nob3codHJlZTFfdyk7CisJZ3RrX3dpbmRvd19nZXRfZGVmYXVsdF9zaXplKEdUS19XSU5ET1cobWFpbl93bmQpLCAmdywgJmgpOworCWd0a19wYW5lZF9zZXRfcG9zaXRpb24oR1RLX1BBTkVEKGhwYW5lZCksIHcgLyAyKTsKKwlpZiAodHJlZTIpCisJCWd0a190cmVlX3N0b3JlX2NsZWFyKHRyZWUyKTsKKwlkaXNwbGF5X2xpc3QoKTsKKworCS8qIERpc2FibGUgYmFjayBidG4sIGxpa2UgaW4gZnVsbCBtb2RlLiAqLworCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShiYWNrX2J0biwgRkFMU0UpOworfQorCisKK3ZvaWQgb25fZnVsbF9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXZpZXdfbW9kZSA9IEZVTExfVklFVzsKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRChocGFuZWQpLCAwKTsKKwlndGtfd2lkZ2V0X2hpZGUodHJlZTFfdyk7CisJaWYgKHRyZWUyKQorCQlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMik7CisJZGlzcGxheV90cmVlKCZyb290bWVudSk7CisJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBGQUxTRSk7Cit9CisKKwordm9pZCBvbl9jb2xsYXBzZV9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWd0a190cmVlX3ZpZXdfY29sbGFwc2VfYWxsKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworfQorCisKK3ZvaWQgb25fZXhwYW5kX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZ3RrX3RyZWVfdmlld19leHBhbmRfYWxsKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworfQorCisKKy8qIENUcmVlIENhbGxiYWNrcyAqLworCisvKiBDaGFuZ2UgaGV4L2ludC9zdHJpbmcgdmFsdWUgaW4gdGhlIGNlbGwgKi8KK3N0YXRpYyB2b2lkIHJlbmRlcmVyX2VkaXRlZChHdGtDZWxsUmVuZGVyZXJUZXh0ICogY2VsbCwKKwkJCSAgICBjb25zdCBnY2hhciAqIHBhdGhfc3RyaW5nLAorCQkJICAgIGNvbnN0IGdjaGFyICogbmV3X3RleHQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlUGF0aCAqcGF0aCA9IGd0a190cmVlX3BhdGhfbmV3X2Zyb21fc3RyaW5nKHBhdGhfc3RyaW5nKTsKKwlHdGtUcmVlSXRlciBpdGVyOworCWNvbnN0IGNoYXIgKm9sZF9kZWYsICpuZXdfZGVmOworCXN0cnVjdCBtZW51ICptZW51OworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKworCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCisJCXJldHVybjsKKworCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsICZpdGVyLCBDT0xfTUVOVSwgJm1lbnUsIC0xKTsKKwlzeW0gPSBtZW51LT5zeW07CisKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX1ZBTFVFLCAmb2xkX2RlZiwgLTEpOworCW5ld19kZWYgPSBuZXdfdGV4dDsKKworCXN5bV9zZXRfc3RyaW5nX3ZhbHVlKHN5bSwgbmV3X2RlZik7CisKKwljb25maWdfY2hhbmdlZCA9IFRSVUU7CisJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKKworCWd0a190cmVlX3BhdGhfZnJlZShwYXRoKTsKK30KKworLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBhbmQgdXBkYXRlIHRoZSB0cmVlICovCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3ltX3ZhbHVlKHN0cnVjdCBtZW51ICptZW51LCBnaW50IGNvbCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJdHJpc3RhdGUgb2xkdmFsLCBuZXd2YWw7CisKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJaWYgKGNvbCA9PSBDT0xfTk8pCisJCW5ld3ZhbCA9IG5vOworCWVsc2UgaWYgKGNvbCA9PSBDT0xfTU9EKQorCQluZXd2YWwgPSBtb2Q7CisJZWxzZSBpZiAoY29sID09IENPTF9ZRVMpCisJCW5ld3ZhbCA9IHllczsKKwllbHNlCisJCXJldHVybjsKKworCXN3aXRjaCAoc3ltX2dldF90eXBlKHN5bSkpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW9sZHZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJaWYgKCFzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbmV3dmFsKSkKKwkJCW5ld3ZhbCA9IHllczsKKwkJc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5ld3ZhbCk7CisJCWNvbmZpZ19jaGFuZ2VkID0gVFJVRTsKKwkJaWYgKHZpZXdfbW9kZSA9PSBGVUxMX1ZJRVcpCisJCQl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOworCQllbHNlIGlmICh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykgeworCQkJdXBkYXRlX3RyZWUoYnJvd3NlZCwgTlVMTCk7CisJCQlkaXNwbGF5X2xpc3QoKTsKKwkJfQorCQllbHNlIGlmICh2aWV3X21vZGUgPT0gU0lOR0xFX1ZJRVcpCisJCQlkaXNwbGF5X3RyZWVfcGFydCgpOwkvL2ZpeG1lOiBrZWVwIGV4cC9jb2xsCisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX3N5bV92YWx1ZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlpZiAoIW1lbnUtPnN5bSkKKwkJcmV0dXJuOworCisJc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShtZW51LT5zeW0pOworCWlmICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKQorCQl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOworCWVsc2UgaWYgKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKSB7CisJCXVwZGF0ZV90cmVlKGJyb3dzZWQsIE5VTEwpOworCQlkaXNwbGF5X2xpc3QoKTsKKwl9CisJZWxzZSBpZiAodmlld19tb2RlID09IFNJTkdMRV9WSUVXKQorCQlkaXNwbGF5X3RyZWVfcGFydCgpOwkvL2ZpeG1lOiBrZWVwIGV4cC9jb2xsCit9CisKK3N0YXRpYyB2b2lkIHJlbmRlcmVyX3RvZ2dsZWQoR3RrQ2VsbFJlbmRlcmVyVG9nZ2xlICogY2VsbCwKKwkJCSAgICAgZ2NoYXIgKiBwYXRoX3N0cmluZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVQYXRoICpwYXRoLCAqc2VsX3BhdGggPSBOVUxMOworCUd0a1RyZWVJdGVyIGl0ZXIsIHNlbF9pdGVyOworCUd0a1RyZWVTZWxlY3Rpb24gKnNlbDsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCXBhdGggPSBndGtfdHJlZV9wYXRoX25ld19mcm9tX3N0cmluZyhwYXRoX3N0cmluZyk7CisJaWYgKCFndGtfdHJlZV9tb2RlbF9nZXRfaXRlcihtb2RlbDIsICZpdGVyLCBwYXRoKSkKKwkJcmV0dXJuOworCisJc2VsID0gZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworCWlmIChndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkKHNlbCwgTlVMTCwgJnNlbF9pdGVyKSkKKwkJc2VsX3BhdGggPSBndGtfdHJlZV9tb2RlbF9nZXRfcGF0aChtb2RlbDIsICZzZWxfaXRlcik7CisJaWYgKCFzZWxfcGF0aCkKKwkJZ290byBvdXQxOworCWlmIChndGtfdHJlZV9wYXRoX2NvbXBhcmUocGF0aCwgc2VsX3BhdGgpKQorCQlnb3RvIG91dDI7CisKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisJdG9nZ2xlX3N5bV92YWx1ZShtZW51KTsKKworICAgICAgb3V0MjoKKwlndGtfdHJlZV9wYXRoX2ZyZWUoc2VsX3BhdGgpOworICAgICAgb3V0MToKKwlndGtfdHJlZV9wYXRoX2ZyZWUocGF0aCk7Cit9CisKK3N0YXRpYyBnaW50IGNvbHVtbjJpbmRleChHdGtUcmVlVmlld0NvbHVtbiAqIGNvbHVtbikKK3sKKwlnaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09MX05VTUJFUjsgaSsrKSB7CisJCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwkJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIGkpOworCQlpZiAoY29sID09IGNvbHVtbikKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKworCisvKiBVc2VyIGNsaWNrOiB1cGRhdGUgY2hvaWNlIChmdWxsKSBvciBnb2VzIGRvd24gKHNpbmdsZSkgKi8KK2dib29sZWFuCitvbl90cmVldmlldzJfYnV0dG9uX3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCQlHZGtFdmVudEJ1dHRvbiAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHdpZGdldCk7CisJR3RrVHJlZVBhdGggKnBhdGg7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlHdGtUcmVlSXRlciBpdGVyOworCXN0cnVjdCBtZW51ICptZW51OworCWdpbnQgY29sOworCisjaWYgR1RLX0NIRUNLX1ZFUlNJT04oMiwxLDQpIC8vIGJ1ZyBpbiBjdHJlZSB3aXRoIGVhcmxpZXIgdmVyc2lvbiBvZiBHVEsKKwlnaW50IHR4ID0gKGdpbnQpIGV2ZW50LT54OworCWdpbnQgdHkgPSAoZ2ludCkgZXZlbnQtPnk7CisJZ2ludCBjeCwgY3k7CisKKwlndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvcyh2aWV3LCB0eCwgdHksICZwYXRoLCAmY29sdW1uLCAmY3gsCisJCQkJICAgICAgJmN5KTsKKyNlbHNlCisJZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yKHZpZXcsICZwYXRoLCAmY29sdW1uKTsKKyNlbmRpZgorCWlmIChwYXRoID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKworCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCisJCXJldHVybiBGQUxTRTsKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisKKwljb2wgPSBjb2x1bW4yaW5kZXgoY29sdW1uKTsKKwlpZiAoZXZlbnQtPnR5cGUgPT0gR0RLXzJCVVRUT05fUFJFU1MpIHsKKwkJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisJCXB0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCisJCWlmIChwdHlwZSA9PSBQX01FTlUgJiYgdmlld19tb2RlICE9IEZVTExfVklFVyAmJiBjb2wgPT0gQ09MX09QVElPTikgeworCQkJLy8gZ29lcyBkb3duIGludG8gbWVudQorCQkJY3VycmVudCA9IG1lbnU7CisJCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCQkJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBUUlVFKTsKKwkJfSBlbHNlIGlmICgoY29sID09IENPTF9PUFRJT04pKSB7CisJCQl0b2dnbGVfc3ltX3ZhbHVlKG1lbnUpOworCQkJZ3RrX3RyZWVfdmlld19leHBhbmRfcm93KHZpZXcsIHBhdGgsIFRSVUUpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvbCA9PSBDT0xfVkFMVUUpIHsKKwkJCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7CisJCQlndGtfdHJlZV92aWV3X2V4cGFuZF9yb3codmlldywgcGF0aCwgVFJVRSk7CisJCX0gZWxzZSBpZiAoY29sID09IENPTF9OTyB8fCBjb2wgPT0gQ09MX01PRAorCQkJICAgfHwgY29sID09IENPTF9ZRVMpIHsKKwkJCWNoYW5nZV9zeW1fdmFsdWUobWVudSwgY29sKTsKKwkJCWd0a190cmVlX3ZpZXdfZXhwYW5kX3Jvdyh2aWV3LCBwYXRoLCBUUlVFKTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyogS2V5IHByZXNzZWQ6IHVwZGF0ZSBjaG9pY2UgKi8KK2dib29sZWFuCitvbl90cmVldmlldzJfa2V5X3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCSAgICAgR2RrRXZlbnRLZXkgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3ICp2aWV3ID0gR1RLX1RSRUVfVklFVyh3aWRnZXQpOworCUd0a1RyZWVQYXRoICpwYXRoOworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2x1bW47CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlnaW50IGNvbDsKKworCWd0a190cmVlX3ZpZXdfZ2V0X2N1cnNvcih2aWV3LCAmcGF0aCwgJmNvbHVtbik7CisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKGV2ZW50LT5rZXl2YWwgPT0gR0RLX3NwYWNlKSB7CisJCWlmIChndGtfdHJlZV92aWV3X3Jvd19leHBhbmRlZCh2aWV3LCBwYXRoKSkKKwkJCWd0a190cmVlX3ZpZXdfY29sbGFwc2Vfcm93KHZpZXcsIHBhdGgpOworCQllbHNlCisJCQlndGtfdHJlZV92aWV3X2V4cGFuZF9yb3codmlldywgcGF0aCwgRkFMU0UpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJaWYgKGV2ZW50LT5rZXl2YWwgPT0gR0RLX0tQX0VudGVyKSB7CisJfQorCWlmICh3aWRnZXQgPT0gdHJlZTFfdykKKwkJcmV0dXJuIEZBTFNFOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCk7CisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCisJaWYgKCFzdHJjYXNlY21wKGV2ZW50LT5zdHJpbmcsICJuIikpCisJCWNvbCA9IENPTF9OTzsKKwllbHNlIGlmICghc3RyY2FzZWNtcChldmVudC0+c3RyaW5nLCAibSIpKQorCQljb2wgPSBDT0xfTU9EOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKGV2ZW50LT5zdHJpbmcsICJ5IikpCisJCWNvbCA9IENPTF9ZRVM7CisJZWxzZQorCQljb2wgPSAtMTsKKwljaGFuZ2Vfc3ltX3ZhbHVlKG1lbnUsIGNvbCk7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyogUm93IHNlbGVjdGlvbiBjaGFuZ2VkOiB1cGRhdGUgaGVscCAqLwordm9pZAorb25fdHJlZXZpZXcyX2N1cnNvcl9jaGFuZ2VkKEd0a1RyZWVWaWV3ICogdHJlZXZpZXcsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWxlY3Rpb247CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCXNlbGVjdGlvbiA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbih0cmVldmlldyk7CisJaWYgKGd0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWQoc2VsZWN0aW9uLCAmbW9kZWwyLCAmaXRlcikpIHsKKwkJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCQl0ZXh0X2luc2VydF9oZWxwKG1lbnUpOworCX0KK30KKworCisvKiBVc2VyIGNsaWNrOiBkaXNwbGF5IHN1Yi10cmVlIGluIHRoZSByaWdodCBmcmFtZS4gKi8KK2dib29sZWFuCitvbl90cmVldmlldzFfYnV0dG9uX3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCQlHZGtFdmVudEJ1dHRvbiAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHdpZGdldCk7CisJR3RrVHJlZVBhdGggKnBhdGg7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlHdGtUcmVlSXRlciBpdGVyOworCXN0cnVjdCBtZW51ICptZW51OworCisJZ2ludCB0eCA9IChnaW50KSBldmVudC0+eDsKKwlnaW50IHR5ID0gKGdpbnQpIGV2ZW50LT55OworCWdpbnQgY3gsIGN5OworCisJZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3ModmlldywgdHgsIHR5LCAmcGF0aCwgJmNvbHVtbiwgJmN4LAorCQkJCSAgICAgICZjeSk7CisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwxLCAmaXRlciwgcGF0aCk7CisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMSwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCisJaWYgKGV2ZW50LT50eXBlID09IEdES18yQlVUVE9OX1BSRVNTKSB7CisJCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7CisJCWN1cnJlbnQgPSBtZW51OworCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCX0gZWxzZSB7CisJCWJyb3dzZWQgPSBtZW51OworCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCX0KKworCWd0a193aWRnZXRfcmVhbGl6ZSh0cmVlMl93KTsKKwlndGtfdHJlZV92aWV3X3NldF9jdXJzb3IodmlldywgcGF0aCwgTlVMTCwgRkFMU0UpOworCWd0a193aWRnZXRfZ3JhYl9mb2N1cyh0cmVlMl93KTsKKworCXJldHVybiBGQUxTRTsKK30KKworCisvKiBGaWxsIGEgcm93IG9mIHN0cmluZ3MgKi8KK3N0YXRpYyBnY2hhciAqKmZpbGxfcm93KHN0cnVjdCBtZW51ICptZW51KQoreworCXN0YXRpYyBnY2hhciAqcm93W0NPTF9OVU1CRVJdOworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwljb25zdCBjaGFyICpkZWY7CisJaW50IHN0eXBlOworCXRyaXN0YXRlIHZhbDsKKwllbnVtIHByb3BfdHlwZSBwdHlwZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IENPTF9PUFRJT047IGkgPD0gQ09MX0NPTE9SOyBpKyspCisJCWdfZnJlZShyb3dbaV0pOworCW1lbXNldChyb3csIDAsIHNpemVvZihyb3cpKTsKKworCXJvd1tDT0xfT1BUSU9OXSA9CisJICAgIGdfc3RyZHVwX3ByaW50ZigiJXMgJXMiLCBtZW51X2dldF9wcm9tcHQobWVudSksCisJCQkgICAgc3ltID8gKHN5bS0+CisJCQkJICAgZmxhZ3MgJiBTWU1CT0xfTkVXID8gIihORVcpIiA6ICIiKSA6CisJCQkgICAgIiIpOworCisJaWYgKHNob3dfYWxsICYmICFtZW51X2lzX3Zpc2libGUobWVudSkpCisJCXJvd1tDT0xfQ09MT1JdID0gZ19zdHJkdXAoIkRhcmtHcmF5Iik7CisJZWxzZQorCQlyb3dbQ09MX0NPTE9SXSA9IGdfc3RyZHVwKCJCbGFjayIpOworCisJcHR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJc3dpdGNoIChwdHlwZSkgeworCWNhc2UgUF9NRU5VOgorCQlyb3dbQ09MX1BJWEJVRl0gPSAoZ2NoYXIgKikgeHBtX21lbnU7CisJCWlmICh2aWV3X21vZGUgPT0gU0lOR0xFX1ZJRVcpCisJCQlyb3dbQ09MX1BJWFZJU10gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCXJvd1tDT0xfQlROVklTXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCWJyZWFrOworCWNhc2UgUF9DT01NRU5UOgorCQlyb3dbQ09MX1BJWEJVRl0gPSAoZ2NoYXIgKikgeHBtX3ZvaWQ7CisJCXJvd1tDT0xfUElYVklTXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCXJvd1tDT0xfQlROVklTXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJvd1tDT0xfUElYQlVGXSA9IChnY2hhciAqKSB4cG1fdm9pZDsKKwkJcm93W0NPTF9QSVhWSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCQlicmVhazsKKwl9CisKKwlpZiAoIXN5bSkKKwkJcmV0dXJuIHJvdzsKKwlyb3dbQ09MX05BTUVdID0gZ19zdHJkdXAoc3ltLT5uYW1lKTsKKworCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJc3ltLT5mbGFncyAmPSB+U1lNQk9MX0NIQU5HRUQ7CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CS8vIHBhcnNlIGNoaWxkcyBmb3IgZ2V0dGluZyBmaW5hbCB2YWx1ZQorCQlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJCXN0cnVjdCBzeW1ib2wgKmRlZl9zeW0gPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShzeW0pOworCQlzdHJ1Y3QgbWVudSAqZGVmX21lbnUgPSBOVUxMOworCisJCXJvd1tDT0xfQlROVklTXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisKKwkJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCQlpZiAobWVudV9pc192aXNpYmxlKGNoaWxkKQorCQkJICAgICYmIGNoaWxkLT5zeW0gPT0gZGVmX3N5bSkKKwkJCQlkZWZfbWVudSA9IGNoaWxkOworCQl9CisKKwkJaWYgKGRlZl9tZW51KQorCQkJcm93W0NPTF9WQUxVRV0gPQorCQkJICAgIGdfc3RyZHVwKG1lbnVfZ2V0X3Byb21wdChkZWZfbWVudSkpOworCX0KKwlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9DSE9JQ0VWQUwpCisJCXJvd1tDT0xfQlROUkFEXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKworCXN0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJc3dpdGNoIChzdHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCQlpZiAoR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfUElYVklTXSkgPT0gRkFMU0UpCisJCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCisJCQlicmVhazsKKwljYXNlIFNfVFJJU1RBVEU6CisJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzoKKwkJCXJvd1tDT0xfTk9dID0gZ19zdHJkdXAoIk4iKTsKKwkJCXJvd1tDT0xfVkFMVUVdID0gZ19zdHJkdXAoIk4iKTsKKwkJCXJvd1tDT0xfQlROQUNUXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCQlyb3dbQ09MX0JUTklOQ10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJcm93W0NPTF9NT0RdID0gZ19zdHJkdXAoIk0iKTsKKwkJCXJvd1tDT0xfVkFMVUVdID0gZ19zdHJkdXAoIk0iKTsKKwkJCXJvd1tDT0xfQlROSU5DXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJCWJyZWFrOworCQljYXNlIHllczoKKwkJCXJvd1tDT0xfWUVTXSA9IGdfc3RyZHVwKCJZIik7CisJCQlyb3dbQ09MX1ZBTFVFXSA9IGdfc3RyZHVwKCJZIik7CisJCQlyb3dbQ09MX0JUTkFDVF0gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCQlyb3dbQ09MX0JUTklOQ10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodmFsICE9IG5vICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubykpCisJCQlyb3dbQ09MX05PXSA9IGdfc3RyZHVwKCJfIik7CisJCWlmICh2YWwgIT0gbW9kICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBtb2QpKQorCQkJcm93W0NPTF9NT0RdID0gZ19zdHJkdXAoIl8iKTsKKwkJaWYgKHZhbCAhPSB5ZXMgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpCisJCQlyb3dbQ09MX1lFU10gPSBnX3N0cmR1cCgiXyIpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwkJZGVmID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJcm93W0NPTF9WQUxVRV0gPSBnX3N0cmR1cChkZWYpOworCQlyb3dbQ09MX0VESVRdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcm93OworfQorCisKKy8qIFNldCB0aGUgbm9kZSBjb250ZW50IHdpdGggYSByb3cgb2Ygc3RyaW5ncyAqLworc3RhdGljIHZvaWQgc2V0X25vZGUoR3RrVHJlZUl0ZXIgKiBub2RlLCBzdHJ1Y3QgbWVudSAqbWVudSwgZ2NoYXIgKiogcm93KQoreworCUdka0NvbG9yIGNvbG9yOworCWdib29sZWFuIHN1Y2Nlc3M7CisJR2RrUGl4YnVmICpwaXg7CisKKwlwaXggPSBnZGtfcGl4YnVmX25ld19mcm9tX3hwbV9kYXRhKChjb25zdCBjaGFyICoqKQorCQkJCQkgICByb3dbQ09MX1BJWEJVRl0pOworCisJZ2RrX2NvbG9yX3BhcnNlKHJvd1tDT0xfQ09MT1JdLCAmY29sb3IpOworCWdka19jb2xvcm1hcF9hbGxvY19jb2xvcnMoZ2RrX2NvbG9ybWFwX2dldF9zeXN0ZW0oKSwgJmNvbG9yLCAxLAorCQkJCSAgRkFMU0UsIEZBTFNFLCAmc3VjY2Vzcyk7CisKKwlndGtfdHJlZV9zdG9yZV9zZXQodHJlZSwgbm9kZSwKKwkJCSAgIENPTF9PUFRJT04sIHJvd1tDT0xfT1BUSU9OXSwKKwkJCSAgIENPTF9OQU1FLCByb3dbQ09MX05BTUVdLAorCQkJICAgQ09MX05PLCByb3dbQ09MX05PXSwKKwkJCSAgIENPTF9NT0QsIHJvd1tDT0xfTU9EXSwKKwkJCSAgIENPTF9ZRVMsIHJvd1tDT0xfWUVTXSwKKwkJCSAgIENPTF9WQUxVRSwgcm93W0NPTF9WQUxVRV0sCisJCQkgICBDT0xfTUVOVSwgKGdwb2ludGVyKSBtZW51LAorCQkJICAgQ09MX0NPTE9SLCAmY29sb3IsCisJCQkgICBDT0xfRURJVCwgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfRURJVF0pLAorCQkJICAgQ09MX1BJWEJVRiwgcGl4LAorCQkJICAgQ09MX1BJWFZJUywgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfUElYVklTXSksCisJCQkgICBDT0xfQlROVklTLCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9CVE5WSVNdKSwKKwkJCSAgIENPTF9CVE5BQ1QsIEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX0JUTkFDVF0pLAorCQkJICAgQ09MX0JUTklOQywgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfQlROSU5DXSksCisJCQkgICBDT0xfQlROUkFELCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9CVE5SQURdKSwKKwkJCSAgIC0xKTsKKworCWdfb2JqZWN0X3VucmVmKHBpeCk7Cit9CisKKworLyogQWRkIGEgbm9kZSB0byB0aGUgdHJlZSAqLworc3RhdGljIHZvaWQgcGxhY2Vfbm9kZShzdHJ1Y3QgbWVudSAqbWVudSwgY2hhciAqKnJvdykKK3sKKwlHdGtUcmVlSXRlciAqcGFyZW50ID0gcGFyZW50c1tpbmRlbnQgLSAxXTsKKwlHdGtUcmVlSXRlciAqbm9kZSA9IHBhcmVudHNbaW5kZW50XTsKKworCWd0a190cmVlX3N0b3JlX2FwcGVuZCh0cmVlLCBub2RlLCBwYXJlbnQpOworCXNldF9ub2RlKG5vZGUsIG1lbnUsIHJvdyk7Cit9CisKKworLyogRmluZCBhIG5vZGUgaW4gdGhlIEdUSysgdHJlZSAqLworc3RhdGljIEd0a1RyZWVJdGVyIGZvdW5kOworCisvKgorICogRmluZCBhIG1lbnUgaW4gdGhlIEd0a1RyZWUgc3RhcnRpbmcgYXQgcGFyZW50LgorICovCitHdGtUcmVlSXRlciAqZ3RrdHJlZV9pdGVyX2ZpbmRfbm9kZShHdGtUcmVlSXRlciAqIHBhcmVudCwKKwkJCQkgICAgc3RydWN0IG1lbnUgKnRvZmluZCkKK3sKKwlHdGtUcmVlSXRlciBpdGVyOworCUd0a1RyZWVJdGVyICpjaGlsZCA9ICZpdGVyOworCWdib29sZWFuIHZhbGlkOworCUd0a1RyZWVJdGVyICpyZXQ7CisKKwl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW4obW9kZWwyLCBjaGlsZCwgcGFyZW50KTsKKwl3aGlsZSAodmFsaWQpIHsKKwkJc3RydWN0IG1lbnUgKm1lbnU7CisKKwkJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgY2hpbGQsIDYsICZtZW51LCAtMSk7CisKKwkJaWYgKG1lbnUgPT0gdG9maW5kKSB7CisJCQltZW1jcHkoJmZvdW5kLCBjaGlsZCwgc2l6ZW9mKEd0a1RyZWVJdGVyKSk7CisJCQlyZXR1cm4gJmZvdW5kOworCQl9CisKKwkJcmV0ID0gZ3RrdHJlZV9pdGVyX2ZpbmRfbm9kZShjaGlsZCwgdG9maW5kKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQobW9kZWwyLCBjaGlsZCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIFVwZGF0ZSB0aGUgdHJlZSBieSBhZGRpbmcvcmVtb3ZpbmcgZW50cmllcworICogRG9lcyBub3QgY2hhbmdlIG90aGVyIG5vZGVzCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV90cmVlKHN0cnVjdCBtZW51ICpzcmMsIEd0a1RyZWVJdGVyICogZHN0KQoreworCXN0cnVjdCBtZW51ICpjaGlsZDE7CisJR3RrVHJlZUl0ZXIgaXRlciwgdG1wOworCUd0a1RyZWVJdGVyICpjaGlsZDIgPSAmaXRlcjsKKwlnYm9vbGVhbiB2YWxpZDsKKwlHdGtUcmVlSXRlciAqc2libGluZzsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBtZW51ICptZW51MSwgKm1lbnUyOworCisJaWYgKHNyYyA9PSAmcm9vdG1lbnUpCisJCWluZGVudCA9IDE7CisKKwl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW4obW9kZWwyLCBjaGlsZDIsIGRzdCk7CisJZm9yIChjaGlsZDEgPSBzcmMtPmxpc3Q7IGNoaWxkMTsgY2hpbGQxID0gY2hpbGQxLT5uZXh0KSB7CisKKwkJcHJvcCA9IGNoaWxkMS0+cHJvbXB0OworCQlzeW0gPSBjaGlsZDEtPnN5bTsKKworCSAgICAgIHJlcGFyc2U6CisJCW1lbnUxID0gY2hpbGQxOworCQlpZiAodmFsaWQpCisJCQlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCBjaGlsZDIsIENPTF9NRU5VLAorCQkJCQkgICAmbWVudTIsIC0xKTsKKwkJZWxzZQorCQkJbWVudTIgPSBOVUxMOwkvLyBmb3JjZSBhZGRpbmcgb2YgYSBmaXJzdCBjaGlsZAorCisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCIlKmMlcyB8ICVzXG4iLCBpbmRlbnQsICcgJywKKwkJICAgICAgIG1lbnUxID8gbWVudV9nZXRfcHJvbXB0KG1lbnUxKSA6ICJuaWwiLAorCQkgICAgICAgbWVudTIgPyBtZW51X2dldF9wcm9tcHQobWVudTIpIDogIm5pbCIpOworI2VuZGlmCisKKwkJaWYgKCFtZW51X2lzX3Zpc2libGUoY2hpbGQxKSAmJiAhc2hvd19hbGwpIHsJLy8gcmVtb3ZlIG5vZGUKKwkJCWlmIChndGt0cmVlX2l0ZXJfZmluZF9ub2RlKGRzdCwgbWVudTEpICE9IE5VTEwpIHsKKwkJCQltZW1jcHkoJnRtcCwgY2hpbGQyLCBzaXplb2YoR3RrVHJlZUl0ZXIpKTsKKwkJCQl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChtb2RlbDIsCisJCQkJCQkJCSBjaGlsZDIpOworCQkJCWd0a190cmVlX3N0b3JlX3JlbW92ZSh0cmVlMiwgJnRtcCk7CisJCQkJaWYgKCF2YWxpZCkKKwkJCQkJcmV0dXJuOwkvLyBuZXh0IHBhcmVudAorCQkJCWVsc2UKKwkJCQkJZ290byByZXBhcnNlOwkvLyBuZXh0IGNoaWxkCisJCQl9IGVsc2UKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtZW51MSAhPSBtZW51MikgeworCQkJaWYgKGd0a3RyZWVfaXRlcl9maW5kX25vZGUoZHN0LCBtZW51MSkgPT0gTlVMTCkgewkvLyBhZGQgbm9kZQorCQkJCWlmICghdmFsaWQgJiYgIW1lbnUyKQorCQkJCQlzaWJsaW5nID0gTlVMTDsKKwkJCQllbHNlCisJCQkJCXNpYmxpbmcgPSBjaGlsZDI7CisJCQkJZ3RrX3RyZWVfc3RvcmVfaW5zZXJ0X2JlZm9yZSh0cmVlMiwKKwkJCQkJCQkgICAgIGNoaWxkMiwKKwkJCQkJCQkgICAgIGRzdCwgc2libGluZyk7CisJCQkJc2V0X25vZGUoY2hpbGQyLCBtZW51MSwgZmlsbF9yb3cobWVudTEpKTsKKwkJCQlpZiAobWVudTIgPT0gTlVMTCkKKwkJCQkJdmFsaWQgPSBUUlVFOworCQkJfSBlbHNlIHsJLy8gcmVtb3ZlIG5vZGUKKwkJCQltZW1jcHkoJnRtcCwgY2hpbGQyLCBzaXplb2YoR3RrVHJlZUl0ZXIpKTsKKwkJCQl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChtb2RlbDIsCisJCQkJCQkJCSBjaGlsZDIpOworCQkJCWd0a190cmVlX3N0b3JlX3JlbW92ZSh0cmVlMiwgJnRtcCk7CisJCQkJaWYgKCF2YWxpZCkKKwkJCQkJcmV0dXJuOwkvLyBuZXh0IHBhcmVudAorCQkJCWVsc2UKKwkJCQkJZ290byByZXBhcnNlOwkvLyBuZXh0IGNoaWxkCisJCQl9CisJCX0gZWxzZSBpZiAoc3ltICYmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NIQU5HRUQpKSB7CisJCQlzZXRfbm9kZShjaGlsZDIsIG1lbnUxLCBmaWxsX3JvdyhtZW51MSkpOworCQl9CisKKwkJaW5kZW50Kys7CisJCXVwZGF0ZV90cmVlKGNoaWxkMSwgY2hpbGQyKTsKKwkJaW5kZW50LS07CisKKwkJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQobW9kZWwyLCBjaGlsZDIpOworCX0KK30KKworCisvKiBEaXNwbGF5IHRoZSB3aG9sZSB0cmVlIChzaW5nbGUvc3BsaXQvZnVsbCB2aWV3KSAqLworc3RhdGljIHZvaWQgZGlzcGxheV90cmVlKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCWVudW0gcHJvcF90eXBlIHB0eXBlOworCisJaWYgKG1lbnUgPT0gJnJvb3RtZW51KSB7CisJCWluZGVudCA9IDE7CisJCWN1cnJlbnQgPSAmcm9vdG1lbnU7CisJfQorCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCXByb3AgPSBjaGlsZC0+cHJvbXB0OworCQlzeW0gPSBjaGlsZC0+c3ltOworCQlwdHlwZSA9IHByb3AgPyBwcm9wLT50eXBlIDogUF9VTktOT1dOOworCisJCWlmIChzeW0pCisJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfQ0hBTkdFRDsKKworCQlpZiAoKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKQorCQkgICAgJiYgIShjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QpICYmICh0cmVlID09IHRyZWUxKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgodmlld19tb2RlID09IFNQTElUX1ZJRVcpICYmIChjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QpCisJCSAgICAmJiAodHJlZSA9PSB0cmVlMikpCisJCQljb250aW51ZTsKKworCQlpZiAobWVudV9pc192aXNpYmxlKGNoaWxkKSB8fCBzaG93X2FsbCkKKwkJCXBsYWNlX25vZGUoY2hpbGQsIGZpbGxfcm93KGNoaWxkKSk7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCIlKmMlczogIiwgaW5kZW50LCAnICcsIG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpOworCQlwcmludGYoIiVzIiwgY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UID8gInJvb3RtZW51IHwgIiA6ICIiKTsKKwkJZGJnX3ByaW50X3B0eXBlKHB0eXBlKTsKKwkJcHJpbnRmKCIgfCAiKTsKKwkJaWYgKHN5bSkgeworCQkJZGJnX3ByaW50X3N0eXBlKHN5bS0+dHlwZSk7CisJCQlwcmludGYoIiB8ICIpOworCQkJZGJnX3ByaW50X2ZsYWdzKHN5bS0+ZmxhZ3MpOworCQkJcHJpbnRmKCJcbiIpOworCQl9IGVsc2UKKwkJCXByaW50ZigiXG4iKTsKKyNlbmRpZgorCQlpZiAoKHZpZXdfbW9kZSAhPSBGVUxMX1ZJRVcpICYmIChwdHlwZSA9PSBQX01FTlUpCisJCSAgICAmJiAodHJlZSA9PSB0cmVlMikpCisJCQljb250aW51ZTsKKy8qCisJCWlmICgoKG1lbnUgIT0gJnJvb3RtZW51KSAmJiAhKG1lbnUtPmZsYWdzICYgTUVOVV9ST09UKSkKKwkJICAgIHx8ICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKQorCQkgICAgfHwgKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKSkqLworCQlpZiAoKCh2aWV3X21vZGUgPT0gU0lOR0xFX1ZJRVcpICYmIChtZW51LT5mbGFncyAmIE1FTlVfUk9PVCkpCisJCSAgICB8fCAodmlld19tb2RlID09IEZVTExfVklFVykKKwkJICAgIHx8ICh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykpIHsKKwkJCWluZGVudCsrOworCQkJZGlzcGxheV90cmVlKGNoaWxkKTsKKwkJCWluZGVudC0tOworCQl9CisJfQorfQorCisvKiBEaXNwbGF5IGEgcGFydCBvZiB0aGUgdHJlZSBzdGFydGluZyBhdCBjdXJyZW50IG5vZGUgKHNpbmdsZS9zcGxpdCB2aWV3KSAqLworc3RhdGljIHZvaWQgZGlzcGxheV90cmVlX3BhcnQodm9pZCkKK3sKKwlpZiAodHJlZTIpCisJCWd0a190cmVlX3N0b3JlX2NsZWFyKHRyZWUyKTsKKwlpZiAodmlld19tb2RlID09IFNJTkdMRV9WSUVXKQorCQlkaXNwbGF5X3RyZWUoY3VycmVudCk7CisJZWxzZSBpZiAodmlld19tb2RlID09IFNQTElUX1ZJRVcpCisJCWRpc3BsYXlfdHJlZShicm93c2VkKTsKKwlndGtfdHJlZV92aWV3X2V4cGFuZF9hbGwoR1RLX1RSRUVfVklFVyh0cmVlMl93KSk7Cit9CisKKy8qIERpc3BsYXkgdGhlIGxpc3QgaW4gdGhlIGxlZnQgZnJhbWUgKHNwbGl0IHZpZXcpICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X2xpc3Qodm9pZCkKK3sKKwlpZiAodHJlZTEpCisJCWd0a190cmVlX3N0b3JlX2NsZWFyKHRyZWUxKTsKKworCXRyZWUgPSB0cmVlMTsKKwlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsKKwlndGtfdHJlZV92aWV3X2V4cGFuZF9hbGwoR1RLX1RSRUVfVklFVyh0cmVlMV93KSk7CisJdHJlZSA9IHRyZWUyOworfQorCit2b2lkIGZpeHVwX3Jvb3RtZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBtZW51ICpjaGlsZDsKKwlzdGF0aWMgaW50IG1lbnVfY250ID0gMDsKKworCW1lbnUtPmZsYWdzIHw9IE1FTlVfUk9PVDsKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJaWYgKGNoaWxkLT5wcm9tcHQgJiYgY2hpbGQtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpIHsKKwkJCW1lbnVfY250Kys7CisJCQlmaXh1cF9yb290bWVudShjaGlsZCk7CisJCQltZW51X2NudC0tOworCQl9IGVsc2UgaWYgKCFtZW51X2NudCkKKwkJCWZpeHVwX3Jvb3RtZW51KGNoaWxkKTsKKwl9Cit9CisKKworLyogTWFpbiAqLworaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJY2hhciAqZW52OworCWdjaGFyICpnbGFkZV9maWxlOworCisjaWZuZGVmIExLQ19ESVJFQ1RfTElOSworCWtjb25maWdfbG9hZCgpOworI2VuZGlmCisKKwliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOworCWJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KFBBQ0tBR0UsICJVVEYtOCIpOworCXRleHRkb21haW4oUEFDS0FHRSk7CisKKwkvKiBHVEsgc3R1ZmZzICovCisJZ3RrX3NldF9sb2NhbGUoKTsKKwlndGtfaW5pdCgmYWMsICZhdik7CisJZ2xhZGVfaW5pdCgpOworCisJLy9hZGRfcGl4bWFwX2RpcmVjdG9yeSAoUEFDS0FHRV9EQVRBX0RJUiAiLyIgUEFDS0FHRSAiL3BpeG1hcHMiKTsKKwkvL2FkZF9waXhtYXBfZGlyZWN0b3J5IChQQUNLQUdFX1NPVVJDRV9ESVIgIi9waXhtYXBzIik7CisKKwkvKiBEZXRlcm1pbmUgR1VJIHBhdGggKi8KKwllbnYgPSBnZXRlbnYoU1JDVFJFRSk7CisJaWYgKGVudikKKwkJZ2xhZGVfZmlsZSA9IGdfc3RyY29uY2F0KGVudiwgIi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUiLCBOVUxMKTsKKwllbHNlIGlmIChhdlswXVswXSA9PSAnLycpCisJCWdsYWRlX2ZpbGUgPSBnX3N0cmNvbmNhdChhdlswXSwgIi5nbGFkZSIsIE5VTEwpOworCWVsc2UKKwkJZ2xhZGVfZmlsZSA9IGdfc3RyY29uY2F0KGdfZ2V0X2N1cnJlbnRfZGlyKCksICIvIiwgYXZbMF0sICIuZ2xhZGUiLCBOVUxMKTsKKworCS8qIExvYWQgdGhlIGludGVyZmFjZSBhbmQgY29ubmVjdCBzaWduYWxzICovCisJaW5pdF9tYWluX3dpbmRvdyhnbGFkZV9maWxlKTsKKwlpbml0X3RyZWVfbW9kZWwoKTsKKwlpbml0X2xlZnRfdHJlZSgpOworCWluaXRfcmlnaHRfdHJlZSgpOworCisJLyogQ29uZiBzdHVmZnMgKi8KKwlpZiAoYWMgPiAxICYmIGF2WzFdWzBdID09ICctJykgeworCQlzd2l0Y2ggKGF2WzFdWzFdKSB7CisJCWNhc2UgJ2EnOgorCQkJLy9zaG93QWxsID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQlwcmludGYoIiVzIDxjb25maWc+XG4iLCBhdlswXSk7CisJCQlleGl0KDApOworCQl9CisJCW5hbWUgPSBhdlsyXTsKKwl9IGVsc2UKKwkJbmFtZSA9IGF2WzFdOworCisJY29uZl9wYXJzZShuYW1lKTsKKwlmaXh1cF9yb290bWVudSgmcm9vdG1lbnUpOworCWNvbmZfcmVhZChOVUxMKTsKKworCXN3aXRjaCAodmlld19tb2RlKSB7CisJY2FzZSBTSU5HTEVfVklFVzoKKwkJZGlzcGxheV90cmVlX3BhcnQoKTsKKwkJYnJlYWs7CisJY2FzZSBTUExJVF9WSUVXOgorCQlkaXNwbGF5X2xpc3QoKTsKKwkJYnJlYWs7CisJY2FzZSBGVUxMX1ZJRVc6CisJCWRpc3BsYXlfdHJlZSgmcm9vdG1lbnUpOworCQlicmVhazsKKwl9CisKKwlndGtfbWFpbigpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3NDRlZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9nY29uZi5nbGFkZQpAQCAtMCwwICsxLDY0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PiA8IS0tKi0gbW9kZTogeG1sIC0qLS0+Cis8IURPQ1RZUEUgZ2xhZGUtaW50ZXJmYWNlIFNZU1RFTSAiaHR0cDovL2dsYWRlLmdub21lLm9yZy9nbGFkZS0yLjAuZHRkIj4KKworPGdsYWRlLWludGVyZmFjZT4KKworPHdpZGdldCBjbGFzcz0iR3RrV2luZG93IiBpZD0id2luZG93MSI+CisgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiB0cmFuc2xhdGFibGU9InllcyI+R3RrIEtlcm5lbCBDb25maWd1cmF0b3I8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0idHlwZSI+R1RLX1dJTkRPV19UT1BMRVZFTDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dfcG9zaXRpb24iPkdUS19XSU5fUE9TX05PTkU8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0ibW9kYWwiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHRfd2lkdGgiPjY0MDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0X2hlaWdodCI+NDgwPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9InJlc2l6YWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZXN0cm95X3dpdGhfcGFyZW50Ij5GYWxzZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZWNvcmF0ZWQiPlRydWU8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0ic2tpcF90YXNrYmFyX2hpbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9InNraXBfcGFnZXJfaGludCI+RmFsc2U8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0idHlwZV9oaW50Ij5HREtfV0lORE9XX1RZUEVfSElOVF9OT1JNQUw8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZ3Jhdml0eSI+R0RLX0dSQVZJVFlfTk9SVEhfV0VTVDwvcHJvcGVydHk+CisgIDxzaWduYWwgbmFtZT0iZGVzdHJveSIgaGFuZGxlcj0ib25fd2luZG93MV9kZXN0cm95IiBvYmplY3Q9IndpbmRvdzEiLz4KKyAgPHNpZ25hbCBuYW1lPSJzaXplX3JlcXVlc3QiIGhhbmRsZXI9Im9uX3dpbmRvdzFfc2l6ZV9yZXF1ZXN0IiBvYmplY3Q9InZwYW5lZDEiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IkZyaSwgMTEgSmFuIDIwMDIgMTY6MTc6MTEgR01UIi8+CisgIDxzaWduYWwgbmFtZT0iZGVsZXRlX2V2ZW50IiBoYW5kbGVyPSJvbl93aW5kb3cxX2RlbGV0ZV9ldmVudCIgb2JqZWN0PSJ3aW5kb3cxIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDA5IE1hciAyMDAzIDE5OjQyOjQ2IEdNVCIvPgorCisgIDxjaGlsZD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJHdGtWQm94IiBpZD0idmJveDEiPgorICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5GYWxzZTwvcHJvcGVydHk+CisgICAgICA8cHJvcGVydHkgbmFtZT0ic3BhY2luZyI+MDwvcHJvcGVydHk+CisKKyAgICAgIDxjaGlsZD4KKwk8d2lkZ2V0IGNsYXNzPSJHdGtNZW51QmFyIiBpZD0ibWVudWJhcjEiPgorCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCisJICA8Y2hpbGQ+CisJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a01lbnVJdGVtIiBpZD0iZmlsZTEiPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fRmlsZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtNZW51IiBpZD0iZmlsZTFfbWVudSI+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZU1lbnVJdGVtIiBpZD0ibG9hZDEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+TG9hZCBhIGNvbmZpZyBmaWxlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0xvYWQ8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX2xvYWQxX2FjdGl2YXRlIi8+CisJCSAgICAgIDxhY2NlbGVyYXRvciBrZXk9IkwiIG1vZGlmaWVycz0iR0RLX0NPTlRST0xfTUFTSyIgc2lnbmFsPSJhY3RpdmF0ZSIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTM5Ij4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1vcGVuPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9InNhdmUxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNhdmUgdGhlIGNvbmZpZyBpbiAuY29uZmlnPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X1NhdmU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3NhdmUxX2FjdGl2YXRlIi8+CisJCSAgICAgIDxhY2NlbGVyYXRvciBrZXk9IlMiIG1vZGlmaWVycz0iR0RLX0NPTlRST0xfTUFTSyIgc2lnbmFsPSJhY3RpdmF0ZSIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTQwIj4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1zYXZlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9InNhdmVfYXMxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNhdmUgdGhlIGNvbmZpZyBpbiBhIGZpbGU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIF9hczwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2F2ZV9hczFfYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2U0MSI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstc2F2ZS1hczwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1NlcGFyYXRvck1lbnVJdGVtIiBpZD0ic2VwYXJhdG9yMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZU1lbnVJdGVtIiBpZD0icXVpdDEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9RdWl0PC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9xdWl0MV9hY3RpdmF0ZSIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJRIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2U0MiI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstcXVpdDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICA8L2NoaWxkPgorCisJICA8Y2hpbGQ+CisJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a01lbnVJdGVtIiBpZD0ib3B0aW9uczEiPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fT3B0aW9uczwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtNZW51IiBpZD0ib3B0aW9uczFfbWVudSI+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDaGVja01lbnVJdGVtIiBpZD0ic2hvd19uYW1lMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IG5hbWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IF9uYW1lPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3Nob3dfbmFtZTFfYWN0aXZhdGUiLz4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDaGVja01lbnVJdGVtIiBpZD0ic2hvd19yYW5nZTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyByYW5nZSAoWS9NL04pPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfcmFuZ2U8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2hvd19yYW5nZTFfYWN0aXZhdGUiLz4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDaGVja01lbnVJdGVtIiBpZD0ic2hvd19kYXRhMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IHZhbHVlIG9mIHRoZSBvcHRpb248L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IF9kYXRhPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3Nob3dfZGF0YTFfYWN0aXZhdGUiLz4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtTZXBhcmF0b3JNZW51SXRlbSIgaWQ9InNlcGFyYXRvcjIiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfYWxsX29wdGlvbnMxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgYWxsIG9wdGlvbnM8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IGFsbCBfb3B0aW9uczwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X2FsbF9vcHRpb25zMV9hY3RpdmF0ZSIvPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NoZWNrTWVudUl0ZW0iIGlkPSJzaG93X2RlYnVnX2luZm8xIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgbWFza2VkIG9wdGlvbnM8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IF9kZWJ1ZyBpbmZvPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3Nob3dfZGVidWdfaW5mbzFfYWN0aXZhdGUiLz4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgPC9jaGlsZD4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9ImhlbHAxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0hlbHA8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrTWVudSIgaWQ9ImhlbHAxX21lbnUiPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImludHJvZHVjdGlvbjEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9JbnRyb2R1Y3Rpb248L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX2ludHJvZHVjdGlvbjFfYWN0aXZhdGUiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IkZyaSwgMTUgTm92IDIwMDIgMjA6MjY6MzAgR01UIi8+CisJCSAgICAgIDxhY2NlbGVyYXRvciBrZXk9IkkiIG1vZGlmaWVycz0iR0RLX0NPTlRST0xfTUFTSyIgc2lnbmFsPSJhY3RpdmF0ZSIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTQzIj4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1kaWFsb2ctcXVlc3Rpb248L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZU1lbnVJdGVtIiBpZD0iYWJvdXQxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fQWJvdXQ8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX2Fib3V0MV9hY3RpdmF0ZSIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iRnJpLCAxNSBOb3YgMjAwMiAyMDoyNjozMCBHTVQiLz4KKwkJICAgICAgPGFjY2VsZXJhdG9yIGtleT0iQSIgbW9kaWZpZXJzPSJHREtfQ09OVFJPTF9NQVNLIiBzaWduYWw9ImFjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlNDQiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLXByb3BlcnRpZXM8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZU1lbnVJdGVtIiBpZD0ibGljZW5zZTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9MaWNlbnNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9saWNlbnNlMV9hY3RpdmF0ZSIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iRnJpLCAxNSBOb3YgMjAwMiAyMDoyNjozMCBHTVQiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2U0NSI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstanVzdGlmeS1maWxsPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgIDwvY2hpbGQ+CisJPC93aWRnZXQ+CisJPHBhY2tpbmc+CisJICA8cHJvcGVydHkgbmFtZT0icGFkZGluZyI+MDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iZmlsbCI+RmFsc2U8L3Byb3BlcnR5PgorCTwvcGFja2luZz4KKyAgICAgIDwvY2hpbGQ+CisKKyAgICAgIDxjaGlsZD4KKwk8d2lkZ2V0IGNsYXNzPSJHdGtIYW5kbGVCb3giIGlkPSJoYW5kbGVib3gxIj4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJzaGFkb3dfdHlwZSI+R1RLX1NIQURPV19PVVQ8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImhhbmRsZV9wb3NpdGlvbiI+R1RLX1BPU19MRUZUPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJzbmFwX2VkZ2UiPkdUS19QT1NfVE9QPC9wcm9wZXJ0eT4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUb29sYmFyIiBpZD0idG9vbGJhcjEiPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ib3JpZW50YXRpb24iPkdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbGJhcl9zdHlsZSI+R1RLX1RPT0xCQVJfQk9USDwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXBzIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ic2hvd19hcnJvdyI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xCdXR0b24iIGlkPSJidXR0b24xIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5Hb2VzIHVwIG9mIG9uZSBsZXZlbCAoc2luZ2xlIHZpZXcpPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5CYWNrPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrX2lkIj5ndGstdW5kbzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImNsaWNrZWQiIGhhbmRsZXI9Im9uX2JhY2tfY2xpY2tlZCIvPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sSXRlbSIgaWQ9InRvb2xpdGVtMSI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtWU2VwYXJhdG9yIiBpZD0idnNlcGFyYXRvcjEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+RmFsc2U8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9ImJ1dHRvbjIiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkxvYWQgYSBjb25maWcgZmlsZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+TG9hZDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLW9wZW48L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9sb2FkX2NsaWNrZWQiLz4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9ImJ1dHRvbjMiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNhdmUgYSBjb25maWcgZmlsZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2F2ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLXNhdmU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9zYXZlX2NsaWNrZWQiLz4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEl0ZW0iIGlkPSJ0b29saXRlbTIiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrVlNlcGFyYXRvciIgaWQ9InZzZXBhcmF0b3IyIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xCdXR0b24iIGlkPSJidXR0b240Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaW5nbGUgdmlldzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2luZ2xlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrX2lkIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImNsaWNrZWQiIGhhbmRsZXI9Im9uX3NpbmdsZV9jbGlja2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE0OjI4OjM5IEdNVCIvPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0iYnV0dG9uNSI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U3BsaXQgdmlldzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U3BsaXQ8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay1taXNzaW5nLWltYWdlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fc3BsaXRfY2xpY2tlZCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNDoyODo0NSBHTVQiLz4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9ImJ1dHRvbjYiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkZ1bGwgdmlldzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+RnVsbDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLW1pc3NpbmctaW1hZ2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9mdWxsX2NsaWNrZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTQ6Mjg6NTAgR01UIi8+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xJdGVtIiBpZD0idG9vbGl0ZW0zIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1ZTZXBhcmF0b3IiIGlkPSJ2c2VwYXJhdG9yMyI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5GYWxzZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0iYnV0dG9uNyI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+Q29sbGFwc2UgdGhlIHdob2xlIHRyZWUgaW4gdGhlIHJpZ2h0IGZyYW1lPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5Db2xsYXBzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLXJlbW92ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImNsaWNrZWQiIGhhbmRsZXI9Im9uX2NvbGxhcHNlX2NsaWNrZWQiLz4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9ImJ1dHRvbjgiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkV4cGFuZCB0aGUgd2hvbGUgdHJlZSBpbiB0aGUgcmlnaHQgZnJhbWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkV4cGFuZDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLWFkZDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImNsaWNrZWQiIGhhbmRsZXI9Im9uX2V4cGFuZF9jbGlja2VkIi8+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgPC9jaGlsZD4KKwk8L3dpZGdldD4KKwk8cGFja2luZz4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nIj4wPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJmaWxsIj5GYWxzZTwvcHJvcGVydHk+CisJPC9wYWNraW5nPgorICAgICAgPC9jaGlsZD4KKworICAgICAgPGNoaWxkPgorCTx3aWRnZXQgY2xhc3M9Ikd0a0hQYW5lZCIgaWQ9ImhwYW5lZDEiPgorCSAgPHByb3BlcnR5IG5hbWU9IndpZHRoX3JlcXVlc3QiPjE8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iPjA8L3Byb3BlcnR5PgorCisJICA8Y2hpbGQ+CisJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0ic2Nyb2xsZWR3aW5kb3cxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImhzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FVVE9NQVRJQzwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FVVE9NQVRJQzwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InNoYWRvd190eXBlIj5HVEtfU0hBRE9XX0lOPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0id2luZG93X3BsYWNlbWVudCI+R1RLX0NPUk5FUl9UT1BfTEVGVDwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1RyZWVWaWV3IiBpZD0idHJlZXZpZXcxIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnNfdmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InJ1bGVzX2hpbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0icmVvcmRlcmFibGUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iZW5hYmxlX3NlYXJjaCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjdXJzb3JfY2hhbmdlZCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2N1cnNvcl9jaGFuZ2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE1OjU4OjIyIEdNVCIvPgorCQkgIDxzaWduYWwgbmFtZT0iYnV0dG9uX3ByZXNzX2V2ZW50IiBoYW5kbGVyPSJvbl90cmVldmlldzFfYnV0dG9uX3ByZXNzX2V2ZW50IiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE2OjAzOjUyIEdNVCIvPgorCQkgIDxzaWduYWwgbmFtZT0ia2V5X3ByZXNzX2V2ZW50IiBoYW5kbGVyPSJvbl90cmVldmlldzJfa2V5X3ByZXNzX2V2ZW50IiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE2OjExOjQ0IEdNVCIvPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgICAgPHBhY2tpbmc+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+RmFsc2U8L3Byb3BlcnR5PgorCSAgICA8L3BhY2tpbmc+CisJICA8L2NoaWxkPgorCisJICA8Y2hpbGQ+CisJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1ZQYW5lZCIgaWQ9InZwYW5lZDEiPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iPjA8L3Byb3BlcnR5PgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtTY3JvbGxlZFdpbmRvdyIgaWQ9InNjcm9sbGVkd2luZG93MiI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJoc2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzaGFkb3dfdHlwZSI+R1RLX1NIQURPV19JTjwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9IndpbmRvd19wbGFjZW1lbnQiPkdUS19DT1JORVJfVE9QX0xFRlQ8L3Byb3BlcnR5PgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrVHJlZVZpZXciIGlkPSJ0cmVldmlldzIiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iaGFzX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnNfdmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJydWxlc19oaW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZW9yZGVyYWJsZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iZW5hYmxlX3NlYXJjaCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iY3Vyc29yX2NoYW5nZWQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9jdXJzb3JfY2hhbmdlZCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNTo1Nzo1NSBHTVQiLz4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJidXR0b25fcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9idXR0b25fcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTc6NTggR01UIi8+CisJCSAgICAgIDxzaWduYWwgbmFtZT0ia2V5X3ByZXNzX2V2ZW50IiBoYW5kbGVyPSJvbl90cmVldmlldzJfa2V5X3ByZXNzX2V2ZW50IiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE1OjU4OjAxIEdNVCIvPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzaHJpbmsiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0ic2Nyb2xsZWR3aW5kb3czIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX05FVkVSPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idnNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic2hhZG93X3R5cGUiPkdUS19TSEFET1dfSU48L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dfcGxhY2VtZW50Ij5HVEtfQ09STkVSX1RPUF9MRUZUPC9wcm9wZXJ0eT4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1RleHRWaWV3IiBpZD0idGV4dHZpZXczIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImVkaXRhYmxlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdmVyd3JpdGUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjY2VwdHNfdGFiIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9Imp1c3RpZmljYXRpb24iPkdUS19KVVNUSUZZX0xFRlQ8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0id3JhcF9tb2RlIj5HVEtfV1JBUF9XT1JEPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImN1cnNvcl92aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InBpeGVsc19hYm92ZV9saW5lcyI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaXhlbHNfYmVsb3dfbGluZXMiPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0icGl4ZWxzX2luc2lkZV93cmFwIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfbWFyZ2luIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X21hcmdpbiI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmRlbnQiPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LjwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgICAgPHBhY2tpbmc+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgIDwvcGFja2luZz4KKwkgIDwvY2hpbGQ+CisJPC93aWRnZXQ+CisJPHBhY2tpbmc+CisJICA8cHJvcGVydHkgbmFtZT0icGFkZGluZyI+MDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5UcnVlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJmaWxsIj5UcnVlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorICAgIDwvd2lkZ2V0PgorICA8L2NoaWxkPgorPC93aWRnZXQ+CisKKzwvZ2xhZGUtaW50ZXJmYWNlPgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2ltYWdlcy5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2ltYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Zjg0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvaW1hZ2VzLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2xvYWRbXSA9IHsKKyIyMiAyMiA1IDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiYyBjICM4MzgxMDAiLAorImEgYyAjZmZmZjAwIiwKKyJiIGMgI2ZmZmZmZiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uIyMjIy4uLi4jLiIsCisiLi4uLi4uLi4uLi4jLi4uLiMjLiMjLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uIyMjLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4jIyMjLiIsCisiLiMjIyMuLi4uLi4uLi4uLiMjIyMjLiIsCisiI2FiYWIjIyMjIyMjIyMjLi4uLi4uLiIsCisiI2JhYmFiYWJhYmFiYWIjLi4uLi4uLiIsCisiI2FiYWJhYmFiYWJhYmEjLi4uLi4uLiIsCisiI2JhYmFiYWJhYmFiYWIjLi4uLi4uLiIsCisiI2FiYWJhYiMjIyMjIyMjIyMjIyMjIyIsCisiI2JhYmFiIyNjY2NjY2NjY2NjY2MjIyIsCisiI2FiYWIjI2NjY2NjY2NjY2NjYyMjLiIsCisiI2JhYiMjY2NjY2NjY2NjY2NjIyMuLiIsCisiI2FiIyNjY2NjY2NjY2NjY2MjIy4uLiIsCisiI2IjI2NjY2NjY2NjY2NjYyMjLi4uLiIsCisiIyMjY2NjY2NjY2NjY2NjIyMuLi4uLiIsCisiIyNjY2NjY2NjY2NjY2MjIy4uLi4uLiIsCisiIyMjIyMjIyMjIyMjIyMjLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3NhdmVbXSA9IHsKKyIyMiAyMiA1IDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiYSBjICM4MzgxMDAiLAorImIgYyAjYzVjMmM1IiwKKyJjIGMgI2NkYjZkNSIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLiMjIyMjIyMjIyMjIyMjIyMjIyMjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYmIjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYmIjLiIsCisiLiNhYSNiYmJiYmJiYmJjYmIjIyMjLiIsCisiLiNhYSNiYmJjY2JiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJjY2JiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyMjIyNhYWEjLiIsCisiLiNhYWFhYWFhYWFhYWFhYWFhYWEjLiIsCisiLiNhYWFhYWFhYWFhYWFhYWFhYWEjLiIsCisiLiNhYWEjIyMjIyMjIyMjIyMjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLi4jIyMjIyMjIyMjIyMjIyMjIyMuLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2JhY2tbXSA9IHsKKyIyMiAyMiAzIDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDA4MyIsCisiYSBjICM4MzgxODMiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uIyMjIyMjYS4uLi4iLAorIi4uIy4uLi4uLiMjIyMjIyMjIyMuLi4iLAorIi4uIyMuLi4jIyMjLi4uLi4uIyNhLi4iLAorIi4uIyMjLiMjIy4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMuLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjIy4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjIyMuLi4uLi4uIyNhLi4iLAorIi4uLi4uLi4uLi4uLi4uLmEjIyMuLi4iLAorIi4uLi4uLi4uLi4uLi4uLiMjIy4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV90cmVlX3ZpZXdbXSA9IHsKKyIyMiAyMiAyIDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3NpbmdsZV92aWV3W10gPSB7CisiMjIgMjIgMiAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zcGxpdF92aWV3W10gPSB7CisiMjIgMjIgMiAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zeW1ib2xfbm9bXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fc3ltYm9sX21vZFtdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAuLiAgIC4gIiwKKyIgLiAgLi4uLiAgLiAiLAorIiAuICAuLi4uICAuICIsCisiIC4gICAuLiAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zeW1ib2xfeWVzW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgIC4gLiAiLAorIiAuICAgICAuLiAuICIsCisiIC4gLiAgLi4gIC4gIiwKKyIgLiAuLi4uICAgLiAiLAorIiAuICAuLiAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2Nob2ljZV9ub1tdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiICAgIC4uLi4gICAgIiwKKyIgIC4uICAgIC4uICAiLAorIiAgLiAgICAgIC4gICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgIC4gICAgICAuICAiLAorIiAgLi4gICAgLi4gICIsCisiICAgIC4uLi4gICAgIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9jaG9pY2VfeWVzW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgICAgLi4uLiAgICAiLAorIiAgLi4gICAgLi4gICIsCisiICAuICAgICAgLiAgIiwKKyIgLiAgIC4uICAgLiAiLAorIiAuICAuLi4uICAuICIsCisiIC4gIC4uLi4gIC4gIiwKKyIgLiAgIC4uICAgLiAiLAorIiAgLiAgICAgIC4gICIsCisiICAuLiAgICAuLiAgIiwKKyIgICAgLi4uLiAgICAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX21lbnVbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAuLiAgICAgLiAiLAorIiAuIC4uLi4gICAuICIsCisiIC4gLi4uLi4uIC4gIiwKKyIgLiAuLi4uLi4gLiAiLAorIiAuIC4uLi4gICAuICIsCisiIC4gLi4gICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fbWVudV9pbnZbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLi4gIC4uLi4uLiAiLAorIiAuLiAgICAuLi4uICIsCisiIC4uICAgICAgLi4gIiwKKyIgLi4gICAgICAuLiAiLAorIiAuLiAgICAuLi4uICIsCisiIC4uICAuLi4uLi4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fbWVudWJhY2tbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgLi4gLiAiLAorIiAuICAgLi4uLiAuICIsCisiIC4gLi4uLi4uIC4gIiwKKyIgLiAuLi4uLi4gLiAiLAorIiAuICAgLi4uLiAuICIsCisiIC4gICAgIC4uIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fdm9pZFtdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg3ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jCkBAIC0wLDAgKzEsMzUgQEAKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCXR5cGUgKCpuYW1lICMjIF9wKSBhcmcKKyNpbmNsdWRlICJsa2NfcHJvdG8uaCIKKyN1bmRlZiBQCisKK3ZvaWQga2NvbmZpZ19sb2FkKHZvaWQpCit7CisJdm9pZCAqaGFuZGxlOworCWNoYXIgKmVycm9yOworCisJaGFuZGxlID0gZGxvcGVuKCIuL2xpYmtjb25maWcuc28iLCBSVExEX0xBWlkpOworCWlmICghaGFuZGxlKSB7CisJCWhhbmRsZSA9IGRsb3BlbigiLi9zY3JpcHRzL2tjb25maWcvbGlia2NvbmZpZy5zbyIsIFJUTERfTEFaWSk7CisJCWlmICghaGFuZGxlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBkbGVycm9yKCkpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCQkJXAorewkJCQkJCVwKKwluYW1lICMjIF9wID0gZGxzeW0oaGFuZGxlLCAjbmFtZSk7CVwKKwlpZiAoKGVycm9yID0gZGxlcnJvcigpKSkgIHsJCVwKKwkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZXJyb3IpOwlcCisJCWV4aXQoMSk7CQkJXAorCX0JCQkJCVwKK30KKyNpbmNsdWRlICJsa2NfcHJvdG8uaCIKKyN1bmRlZiBQCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlZTU1YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiwgMjAwNQorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCitzdGF0aWMgY2hhciAqZXNjYXBlKGNvbnN0IGNoYXIqIHRleHQsIGNoYXIgKmJmLCBpbnQgbGVuKQoreworCWNoYXIgKmJmcCA9IGJmOworCWludCBtdWx0aWxpbmUgPSBzdHJjaHIodGV4dCwgJ1xuJykgIT0gTlVMTDsKKwlpbnQgZW9sID0gMDsKKwlpbnQgdGV4dGxlbiA9IHN0cmxlbih0ZXh0KTsKKworCWlmICgodGV4dGxlbiA+IDApICYmICh0ZXh0W3RleHRsZW4tMV0gPT0gJ1xuJykpCisJCWVvbCA9IDE7CisKKwkqYmZwKysgPSAnIic7CisJLS1sZW47CisKKwlpZiAobXVsdGlsaW5lKSB7CisJCSpiZnArKyA9ICciJzsKKwkJKmJmcCsrID0gJ1xuJzsKKwkJKmJmcCsrID0gJyInOworCQlsZW4gLT0gMzsKKwl9CisKKwl3aGlsZSAoKnRleHQgIT0gJ1wwJyAmJiBsZW4gPiAxKSB7CisJCWlmICgqdGV4dCA9PSAnIicpCisJCQkqYmZwKysgPSAnXFwnOworCQllbHNlIGlmICgqdGV4dCA9PSAnXG4nKSB7CisJCQkqYmZwKysgPSAnXFwnOworCQkJKmJmcCsrID0gJ24nOworCQkJKmJmcCsrID0gJyInOworCQkJKmJmcCsrID0gJ1xuJzsKKwkJCSpiZnArKyA9ICciJzsKKwkJCWxlbiAtPSA1OworCQkJKyt0ZXh0OworCQkJZ290byBuZXh0OworCQl9CisJCSpiZnArKyA9ICp0ZXh0Kys7CituZXh0OgorCQktLWxlbjsKKwl9CisKKwlpZiAobXVsdGlsaW5lICYmIGVvbCkKKwkJYmZwIC09IDM7CisKKwkqYmZwKysgPSAnIic7CisJKmJmcCA9ICdcMCc7CisKKwlyZXR1cm4gYmY7Cit9CisKK3N0cnVjdCBmaWxlX2xpbmUgeworCXN0cnVjdCBmaWxlX2xpbmUgKm5leHQ7CisJY2hhcioJCSBmaWxlOworCWludAkJIGxpbmVubzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9saW5lICpmaWxlX2xpbmVfX25ldyhjaGFyICpmaWxlLCBpbnQgbGluZW5vKQoreworCXN0cnVjdCBmaWxlX2xpbmUgKnNlbGYgPSBtYWxsb2Moc2l6ZW9mKCpzZWxmKSk7CisKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXNlbGYtPmZpbGUgICA9IGZpbGU7CisJc2VsZi0+bGluZW5vID0gbGluZW5vOworCXNlbGYtPm5leHQgICA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIHNlbGY7Cit9CisKK3N0cnVjdCBtZXNzYWdlIHsKKwljb25zdCBjaGFyCSAqbXNnOworCWNvbnN0IGNoYXIJICpvcHRpb247CisJc3RydWN0IG1lc3NhZ2UJICpuZXh0OworCXN0cnVjdCBmaWxlX2xpbmUgKmZpbGVzOworfTsKKworc3RhdGljIHN0cnVjdCBtZXNzYWdlICptZXNzYWdlX19saXN0OworCitzdGF0aWMgc3RydWN0IG1lc3NhZ2UgKm1lc3NhZ2VfX25ldyhjb25zdCBjaGFyICptc2csIGNoYXIgKm9wdGlvbiwgY2hhciAqZmlsZSwgaW50IGxpbmVubykKK3sKKwlzdHJ1Y3QgbWVzc2FnZSAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKKworCWlmIChzZWxmID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2VsZi0+ZmlsZXMgPSBmaWxlX2xpbmVfX25ldyhmaWxlLCBsaW5lbm8pOworCWlmIChzZWxmLT5maWxlcyA9PSBOVUxMKQorCQlnb3RvIG91dF9mYWlsOworCisJc2VsZi0+bXNnID0gc3RyZHVwKG1zZyk7CisJaWYgKHNlbGYtPm1zZyA9PSBOVUxMKQorCQlnb3RvIG91dF9mYWlsX21zZzsKKworCXNlbGYtPm9wdGlvbiA9IG9wdGlvbjsKKwlzZWxmLT5uZXh0ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gc2VsZjsKK291dF9mYWlsX21zZzoKKwlmcmVlKHNlbGYtPmZpbGVzKTsKK291dF9mYWlsOgorCWZyZWUoc2VsZik7CisJc2VsZiA9IE5VTEw7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVzc2FnZSAqbWVzYWdlX19maW5kKGNvbnN0IGNoYXIgKm1zZykKK3sKKwlzdHJ1Y3QgbWVzc2FnZSAqbSA9IG1lc3NhZ2VfX2xpc3Q7CisKKwl3aGlsZSAobSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAobS0+bXNnLCBtc2cpID09IDApCisJCQlicmVhazsKKwkJbSA9IG0tPm5leHQ7CisJfQorCisJcmV0dXJuIG07Cit9CisKK3N0YXRpYyBpbnQgbWVzc2FnZV9fYWRkX2ZpbGVfbGluZShzdHJ1Y3QgbWVzc2FnZSAqc2VsZiwgY2hhciAqZmlsZSwgaW50IGxpbmVubykKK3sKKwlpbnQgcmMgPSAtMTsKKwlzdHJ1Y3QgZmlsZV9saW5lICpmbCA9IGZpbGVfbGluZV9fbmV3KGZpbGUsIGxpbmVubyk7CisKKwlpZiAoZmwgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlmbC0+bmV4dCAgICA9IHNlbGYtPmZpbGVzOworCXNlbGYtPmZpbGVzID0gZmw7CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtZXNzYWdlX19hZGQoY29uc3QgY2hhciAqbXNnLCBjaGFyICpvcHRpb24sIGNoYXIgKmZpbGUsIGludCBsaW5lbm8pCit7CisJaW50IHJjID0gMDsKKwljaGFyIGJmWzE2Mzg0XTsKKwljaGFyICplc2NhcGVkID0gZXNjYXBlKG1zZywgYmYsIHNpemVvZihiZikpOworCXN0cnVjdCBtZXNzYWdlICptID0gbWVzYWdlX19maW5kKGVzY2FwZWQpOworCisJaWYgKG0gIT0gTlVMTCkKKwkJcmMgPSBtZXNzYWdlX19hZGRfZmlsZV9saW5lKG0sIGZpbGUsIGxpbmVubyk7CisJZWxzZSB7CisJCW0gPSBtZXNzYWdlX19uZXcoZXNjYXBlZCwgb3B0aW9uLCBmaWxlLCBsaW5lbm8pOworCisJCWlmIChtICE9IE5VTEwpIHsKKwkJCW0tPm5leHQJICAgICAgPSBtZXNzYWdlX19saXN0OworCQkJbWVzc2FnZV9fbGlzdCA9IG07CisJCX0gZWxzZQorCQkJcmMgPSAtMTsKKwl9CisJcmV0dXJuIHJjOworfQorCit2b2lkIG1lbnVfYnVpbGRfbWVzc2FnZV9saXN0KHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBtZW51ICpjaGlsZDsKKworCW1lc3NhZ2VfX2FkZChtZW51X2dldF9wcm9tcHQobWVudSksIE5VTEwsCisJCSAgICAgbWVudS0+ZmlsZSA9PSBOVUxMID8gIlJvb3QgTWVudSIgOiBtZW51LT5maWxlLT5uYW1lLAorCQkgICAgIG1lbnUtPmxpbmVubyk7CisKKwlpZiAobWVudS0+c3ltICE9IE5VTEwgJiYgbWVudS0+c3ltLT5oZWxwICE9IE5VTEwpCisJCW1lc3NhZ2VfX2FkZChtZW51LT5zeW0tPmhlbHAsIG1lbnUtPnN5bS0+bmFtZSwKKwkJCSAgICAgbWVudS0+ZmlsZSA9PSBOVUxMID8gIlJvb3QgTWVudSIgOiBtZW51LT5maWxlLT5uYW1lLAorCQkJICAgICBtZW51LT5saW5lbm8pOworCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWlmIChjaGlsZC0+cHJvbXB0ICE9IE5VTEwpCisJCQltZW51X2J1aWxkX21lc3NhZ2VfbGlzdChjaGlsZCk7Cit9CisKK3N0YXRpYyB2b2lkIG1lc3NhZ2VfX3ByaW50X2ZpbGVfbGluZW5vKHN0cnVjdCBtZXNzYWdlICpzZWxmKQoreworCXN0cnVjdCBmaWxlX2xpbmUgKmZsID0gc2VsZi0+ZmlsZXM7CisKKwlwdXRjaGFyKCdcbicpOworCWlmIChzZWxmLT5vcHRpb24gIT0gTlVMTCkKKwkJcHJpbnRmKCIjICVzOjAwMDAwXG4iLCBzZWxmLT5vcHRpb24pOworCisJcHJpbnRmKCIjOiAlczolZCIsIGZsLT5maWxlLCBmbC0+bGluZW5vKTsKKwlmbCA9IGZsLT5uZXh0OworCisJd2hpbGUgKGZsICE9IE5VTEwpIHsKKwkJcHJpbnRmKCIsICVzOiVkIiwgZmwtPmZpbGUsIGZsLT5saW5lbm8pOworCQlmbCA9IGZsLT5uZXh0OworCX0KKworCXB1dGNoYXIoJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIG1lc3NhZ2VfX3ByaW50X2dldHRleHRfbXNnaWRfbXNnc3RyKHN0cnVjdCBtZXNzYWdlICpzZWxmKQoreworCW1lc3NhZ2VfX3ByaW50X2ZpbGVfbGluZW5vKHNlbGYpOworCisJcHJpbnRmKCJtc2dpZCAlc1xuIgorCSAgICAgICAibXNnc3RyIFwiXCJcbiIsIHNlbGYtPm1zZyk7Cit9CisKK3ZvaWQgbWVudV9feGdldHRleHQodm9pZCkKK3sKKwlzdHJ1Y3QgbWVzc2FnZSAqbSA9IG1lc3NhZ2VfX2xpc3Q7CisKKwl3aGlsZSAobSAhPSBOVUxMKSB7CisJCW1lc3NhZ2VfX3ByaW50X2dldHRleHRfbXNnaWRfbXNnc3RyKG0pOworCQltID0gbS0+bmV4dDsKKwl9Cit9CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWNvbmZfcGFyc2UoYXZbMV0pOworCisJbWVudV9idWlsZF9tZXNzYWdlX2xpc3QobWVudV9nZXRfcm9vdF9tZW51KE5VTEwpKTsKKwltZW51X194Z2V0dGV4dCgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbGV4Lnpjb25mLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWYxNWUxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQKQEAgLTAsMCArMSwyMzI1IEBACisKKyNsaW5lIDMgInNjcmlwdHMva2NvbmZpZy9sZXguemNvbmYuYyIKKworI2RlZmluZSAgWVlfSU5UX0FMSUdORUQgc2hvcnQgaW50CisKKy8qIEEgbGV4aWNhbCBzY2FubmVyIGdlbmVyYXRlZCBieSBmbGV4ICovCisKKyNkZWZpbmUgRkxFWF9TQ0FOTkVSCisjZGVmaW5lIFlZX0ZMRVhfTUFKT1JfVkVSU0lPTiAyCisjZGVmaW5lIFlZX0ZMRVhfTUlOT1JfVkVSU0lPTiA1CisjZGVmaW5lIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiAzMQorI2lmIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiA+IDAKKyNkZWZpbmUgRkxFWF9CRVRBCisjZW5kaWYKKworLyogRmlyc3QsIHdlIGRlYWwgd2l0aCAgcGxhdGZvcm0tc3BlY2lmaWMgb3IgY29tcGlsZXItc3BlY2lmaWMgaXNzdWVzLiAqLworCisvKiBiZWdpbiBzdGFuZGFyZCBDIGhlYWRlcnMuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBlbmQgc3RhbmRhcmQgQyBoZWFkZXJzLiAqLworCisvKiBmbGV4IGludGVnZXIgdHlwZSBkZWZpbml0aW9ucyAqLworCisjaWZuZGVmIEZMRVhJTlRfSAorI2RlZmluZSBGTEVYSU5UX0gKKworLyogQzk5IHN5c3RlbXMgaGF2ZSA8aW50dHlwZXMuaD4uIE5vbi1DOTkgc3lzdGVtcyBtYXkgb3IgbWF5IG5vdC4gKi8KKworI2lmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgordHlwZWRlZiBpbnQ4X3QgZmxleF9pbnQ4X3Q7Cit0eXBlZGVmIHVpbnQ4X3QgZmxleF91aW50OF90OwordHlwZWRlZiBpbnQxNl90IGZsZXhfaW50MTZfdDsKK3R5cGVkZWYgdWludDE2X3QgZmxleF91aW50MTZfdDsKK3R5cGVkZWYgaW50MzJfdCBmbGV4X2ludDMyX3Q7Cit0eXBlZGVmIHVpbnQzMl90IGZsZXhfdWludDMyX3Q7CisjZWxzZQordHlwZWRlZiBzaWduZWQgY2hhciBmbGV4X2ludDhfdDsKK3R5cGVkZWYgc2hvcnQgaW50IGZsZXhfaW50MTZfdDsKK3R5cGVkZWYgaW50IGZsZXhfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBmbGV4X3VpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBmbGV4X3VpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxleF91aW50MzJfdDsKKyNlbmRpZiAvKiAhIEM5OSAqLworCisvKiBMaW1pdHMgb2YgaW50ZWdyYWwgdHlwZXMuICovCisjaWZuZGVmIElOVDhfTUlOCisjZGVmaW5lIElOVDhfTUlOICAgICAgICAgICAgICAgKC0xMjgpCisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfTUlOCisjZGVmaW5lIElOVDE2X01JTiAgICAgICAgICAgICAgKC0zMjc2Ny0xKQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01JTgorI2RlZmluZSBJTlQzMl9NSU4gICAgICAgICAgICAgICgtMjE0NzQ4MzY0Ny0xKQorI2VuZGlmCisjaWZuZGVmIElOVDhfTUFYCisjZGVmaW5lIElOVDhfTUFYICAgICAgICAgICAgICAgKDEyNykKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NQVgKKyNkZWZpbmUgSU5UMTZfTUFYICAgICAgICAgICAgICAoMzI3NjcpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAgICAgICAgICAgICAgKDIxNDc0ODM2NDcpCisjZW5kaWYKKyNpZm5kZWYgVUlOVDhfTUFYCisjZGVmaW5lIFVJTlQ4X01BWCAgICAgICAgICAgICAgKDI1NVUpCisjZW5kaWYKKyNpZm5kZWYgVUlOVDE2X01BWAorI2RlZmluZSBVSU5UMTZfTUFYICAgICAgICAgICAgICg2NTUzNVUpCisjZW5kaWYKKyNpZm5kZWYgVUlOVDMyX01BWAorI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VSkKKyNlbmRpZgorCisjZW5kaWYgLyogISBGTEVYSU5UX0ggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qIFRoZSAiY29uc3QiIHN0b3JhZ2UtY2xhc3MtbW9kaWZpZXIgaXMgdmFsaWQuICovCisjZGVmaW5lIFlZX1VTRV9DT05TVAorCisjZWxzZQkvKiAhIF9fY3BsdXNwbHVzICovCisKKyNpZiBfX1NURENfXworCisjZGVmaW5lIFlZX1VTRV9DT05TVAorCisjZW5kaWYJLyogX19TVERDX18gKi8KKyNlbmRpZgkvKiAhIF9fY3BsdXNwbHVzICovCisKKyNpZmRlZiBZWV9VU0VfQ09OU1QKKyNkZWZpbmUgeXljb25zdCBjb25zdAorI2Vsc2UKKyNkZWZpbmUgeXljb25zdAorI2VuZGlmCisKKy8qIFJldHVybmVkIHVwb24gZW5kLW9mLWZpbGUuICovCisjZGVmaW5lIFlZX05VTEwgMAorCisvKiBQcm9tb3RlcyBhIHBvc3NpYmx5IG5lZ2F0aXZlLCBwb3NzaWJseSBzaWduZWQgY2hhciB0byBhbiB1bnNpZ25lZAorICogaW50ZWdlciBmb3IgdXNlIGFzIGFuIGFycmF5IGluZGV4LiAgSWYgdGhlIHNpZ25lZCBjaGFyIGlzIG5lZ2F0aXZlLAorICogd2Ugd2FudCB0byBpbnN0ZWFkIHRyZWF0IGl0IGFzIGFuIDgtYml0IHVuc2lnbmVkIGNoYXIsIGhlbmNlIHRoZQorICogZG91YmxlIGNhc3QuCisgKi8KKyNkZWZpbmUgWVlfU0NfVE9fVUkoYykgKCh1bnNpZ25lZCBpbnQpICh1bnNpZ25lZCBjaGFyKSBjKQorCisvKiBFbnRlciBhIHN0YXJ0IGNvbmRpdGlvbi4gIFRoaXMgbWFjcm8gcmVhbGx5IG91Z2h0IHRvIHRha2UgYSBwYXJhbWV0ZXIsCisgKiBidXQgd2UgZG8gaXQgdGhlIGRpc2d1c3RpbmcgY3J1ZnR5IHdheSBmb3JjZWQgb24gdXMgYnkgdGhlICgpLWxlc3MKKyAqIGRlZmluaXRpb24gb2YgQkVHSU4uCisgKi8KKyNkZWZpbmUgQkVHSU4gKHl5X3N0YXJ0KSA9IDEgKyAyICoKKworLyogVHJhbnNsYXRlIHRoZSBjdXJyZW50IHN0YXJ0IHN0YXRlIGludG8gYSB2YWx1ZSB0aGF0IGNhbiBiZSBsYXRlciBoYW5kZWQKKyAqIHRvIEJFR0lOIHRvIHJldHVybiB0byB0aGUgc3RhdGUuICBUaGUgWVlTVEFURSBhbGlhcyBpcyBmb3IgbGV4CisgKiBjb21wYXRpYmlsaXR5LgorICovCisjZGVmaW5lIFlZX1NUQVJUICgoKHl5X3N0YXJ0KSAtIDEpIC8gMikKKyNkZWZpbmUgWVlTVEFURSBZWV9TVEFSVAorCisvKiBBY3Rpb24gbnVtYmVyIGZvciBFT0YgcnVsZSBvZiBhIGdpdmVuIHN0YXJ0IHN0YXRlLiAqLworI2RlZmluZSBZWV9TVEFURV9FT0Yoc3RhdGUpIChZWV9FTkRfT0ZfQlVGRkVSICsgc3RhdGUgKyAxKQorCisvKiBTcGVjaWFsIGFjdGlvbiBtZWFuaW5nICJzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGZpbGUiLiAqLworI2RlZmluZSBZWV9ORVdfRklMRSB6Y29uZnJlc3RhcnQoemNvbmZpbiAgKQorCisjZGVmaW5lIFlZX0VORF9PRl9CVUZGRVJfQ0hBUiAwCisKKy8qIFNpemUgb2YgZGVmYXVsdCBpbnB1dCBidWZmZXIuICovCisjaWZuZGVmIFlZX0JVRl9TSVpFCisjZGVmaW5lIFlZX0JVRl9TSVpFIDE2Mzg0CisjZW5kaWYKKworI2lmbmRlZiBZWV9UWVBFREVGX1lZX0JVRkZFUl9TVEFURQorI2RlZmluZSBZWV9UWVBFREVGX1lZX0JVRkZFUl9TVEFURQordHlwZWRlZiBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICpZWV9CVUZGRVJfU1RBVEU7CisjZW5kaWYKKworZXh0ZXJuIGludCB6Y29uZmxlbmc7CisKK2V4dGVybiBGSUxFICp6Y29uZmluLCAqemNvbmZvdXQ7CisKKyNkZWZpbmUgRU9CX0FDVF9DT05USU5VRV9TQ0FOIDAKKyNkZWZpbmUgRU9CX0FDVF9FTkRfT0ZfRklMRSAxCisjZGVmaW5lIEVPQl9BQ1RfTEFTVF9NQVRDSCAyCisKKyAgICAjZGVmaW5lIFlZX0xFU1NfTElORU5PKG4pCisKKy8qIFJldHVybiBhbGwgYnV0IHRoZSBmaXJzdCAibiIgbWF0Y2hlZCBjaGFyYWN0ZXJzIGJhY2sgdG8gdGhlIGlucHV0IHN0cmVhbS4gKi8KKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQuICovIFwKKyAgICAgICAgaW50IHl5bGVzc19tYWNyb19hcmcgPSAobik7IFwKKyAgICAgICAgWVlfTEVTU19MSU5FTk8oeXlsZXNzX21hY3JvX2FyZyk7XAorCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgXAorCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUIFwKKwkJKHl5X2NfYnVmX3ApID0geXlfY3AgPSB5eV9icCArIHl5bGVzc19tYWNyb19hcmcgLSBZWV9NT1JFX0FESjsgXAorCQlZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovIFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworI2RlZmluZSB1bnB1dChjKSB5eXVucHV0KCBjLCAoeXl0ZXh0X3B0cikgICkKKworLyogVGhlIGZvbGxvd2luZyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBwb3J0YWJseSBnZXQgb3VyIGhhbmRzIG9uIHNpemVfdAorICogKHdpdGhvdXQgYXV0b2NvbmYncyBoZWxwLCB3aGljaCBpc24ndCBhdmFpbGFibGUgYmVjYXVzZSB3ZSB3YW50CisgKiBmbGV4LWdlbmVyYXRlZCBzY2FubmVycyB0byBjb21waWxlIG9uIHRoZWlyIG93bikuCisgKi8KKworI2lmbmRlZiBZWV9UWVBFREVGX1lZX1NJWkVfVAorI2RlZmluZSBZWV9UWVBFREVGX1lZX1NJWkVfVAordHlwZWRlZiB1bnNpZ25lZCBpbnQgeXlfc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQorI2RlZmluZSBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCitzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlCisJeworCUZJTEUgKnl5X2lucHV0X2ZpbGU7CisKKwljaGFyICp5eV9jaF9idWY7CQkvKiBpbnB1dCBidWZmZXIgKi8KKwljaGFyICp5eV9idWZfcG9zOwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBpbnB1dCBidWZmZXIgKi8KKworCS8qIFNpemUgb2YgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIHJvb20gZm9yIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJeXlfc2l6ZV90IHl5X2J1Zl9zaXplOworCisJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1Ziwgbm90IGluY2x1ZGluZyBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCWludCB5eV9uX2NoYXJzOworCisJLyogV2hldGhlciB3ZSAib3duIiB0aGUgYnVmZmVyIC0gaS5lLiwgd2Uga25vdyB3ZSBjcmVhdGVkIGl0LAorCSAqIGFuZCBjYW4gcmVhbGxvYygpIGl0IHRvIGdyb3cgaXQsIGFuZCBzaG91bGQgZnJlZSgpIGl0IHRvCisJICogZGVsZXRlIGl0LgorCSAqLworCWludCB5eV9pc19vdXJfYnVmZmVyOworCisJLyogV2hldGhlciB0aGlzIGlzIGFuICJpbnRlcmFjdGl2ZSIgaW5wdXQgc291cmNlOyBpZiBzbywgYW5kCisJICogaWYgd2UncmUgdXNpbmcgc3RkaW8gZm9yIGlucHV0LCB0aGVuIHdlIHdhbnQgdG8gdXNlIGdldGMoKQorCSAqIGluc3RlYWQgb2YgZnJlYWQoKSwgdG8gbWFrZSBzdXJlIHdlIHN0b3AgZmV0Y2hpbmcgaW5wdXQgYWZ0ZXIKKwkgKiBlYWNoIG5ld2xpbmUuCisJICovCisJaW50IHl5X2lzX2ludGVyYWN0aXZlOworCisJLyogV2hldGhlciB3ZSdyZSBjb25zaWRlcmVkIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgorCSAqIElmIHNvLCAnXicgcnVsZXMgd2lsbCBiZSBhY3RpdmUgb24gdGhlIG5leHQgbWF0Y2gsIG90aGVyd2lzZQorCSAqIG5vdC4KKwkgKi8KKwlpbnQgeXlfYXRfYm9sOworCisgICAgaW50IHl5X2JzX2xpbmVubzsgLyoqPCBUaGUgbGluZSBjb3VudC4gKi8KKyAgICBpbnQgeXlfYnNfY29sdW1uOyAvKio8IFRoZSBjb2x1bW4gY291bnQuICovCisKKwkvKiBXaGV0aGVyIHRvIHRyeSB0byBmaWxsIHRoZSBpbnB1dCBidWZmZXIgd2hlbiB3ZSByZWFjaCB0aGUKKwkgKiBlbmQgb2YgaXQuCisJICovCisJaW50IHl5X2ZpbGxfYnVmZmVyOworCisJaW50IHl5X2J1ZmZlcl9zdGF0dXM7CisKKyNkZWZpbmUgWVlfQlVGRkVSX05FVyAwCisjZGVmaW5lIFlZX0JVRkZFUl9OT1JNQUwgMQorCS8qIFdoZW4gYW4gRU9GJ3MgYmVlbiBzZWVuIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgdGV4dCB0byBwcm9jZXNzCisJICogdGhlbiB3ZSBtYXJrIHRoZSBidWZmZXIgYXMgWVlfRU9GX1BFTkRJTkcsIHRvIGluZGljYXRlIHRoYXQgd2UKKwkgKiBzaG91bGRuJ3QgdHJ5IHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc291cmNlIGFueSBtb3JlLiAgV2UgbWlnaHQKKwkgKiBzdGlsbCBoYXZlIGEgYnVuY2ggb2YgdG9rZW5zIHRvIG1hdGNoLCB0aG91Z2gsIGJlY2F1c2Ugb2YKKwkgKiBwb3NzaWJsZSBiYWNraW5nLXVwLgorCSAqCisJICogV2hlbiB3ZSBhY3R1YWxseSBzZWUgdGhlIEVPRiwgd2UgY2hhbmdlIHRoZSBzdGF0dXMgdG8gIm5ldyIKKwkgKiAodmlhIHpjb25mcmVzdGFydCgpKSwgc28gdGhhdCB0aGUgdXNlciBjYW4gY29udGludWUgc2Nhbm5pbmcgYnkKKwkgKiBqdXN0IHBvaW50aW5nIHpjb25maW4gYXQgYSBuZXcgaW5wdXQgZmlsZS4KKwkgKi8KKyNkZWZpbmUgWVlfQlVGRkVSX0VPRl9QRU5ESU5HIDIKKworCX07CisjZW5kaWYgLyogIVlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUgKi8KKworLyogU3RhY2sgb2YgaW5wdXQgYnVmZmVycy4gKi8KK3N0YXRpYyBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX3RvcCA9IDA7IC8qKjwgaW5kZXggb2YgdG9wIG9mIHN0YWNrLiAqLworc3RhdGljIHNpemVfdCB5eV9idWZmZXJfc3RhY2tfbWF4ID0gMDsgLyoqPCBjYXBhY2l0eSBvZiBzdGFjay4gKi8KK3N0YXRpYyBZWV9CVUZGRVJfU1RBVEUgKiB5eV9idWZmZXJfc3RhY2sgPSAwOyAvKio8IFN0YWNrIGFzIGFuIGFycmF5LiAqLworCisvKiBXZSBwcm92aWRlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGJ1ZmZlciBzdGF0ZXMgaW4gY2FzZSBpbiB0aGUKKyAqIGZ1dHVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgYnVmZmVyIHN0YXRlcyBpbiBhIG1vcmUgZ2VuZXJhbAorICogInNjYW5uZXIgc3RhdGUiLgorICoKKyAqIFJldHVybnMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG9yIE5VTEwuCisgKi8KKyNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVIgKCAoeXlfYnVmZmVyX3N0YWNrKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHl5X2J1ZmZlcl9zdGFjaylbKHl5X2J1ZmZlcl9zdGFja190b3ApXSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCkKKworLyogU2FtZSBhcyBwcmV2aW91cyBtYWNybywgYnV0IHVzZWZ1bCB3aGVuIHdlIGtub3cgdGhhdCB0aGUgYnVmZmVyIHN0YWNrIGlzIG5vdAorICogTlVMTCBvciB3aGVuIHdlIG5lZWQgYW4gbHZhbHVlLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgKi8KKyNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFICh5eV9idWZmZXJfc3RhY2spWyh5eV9idWZmZXJfc3RhY2tfdG9wKV0KKworLyogeXlfaG9sZF9jaGFyIGhvbGRzIHRoZSBjaGFyYWN0ZXIgbG9zdCB3aGVuIHpjb25mdGV4dCBpcyBmb3JtZWQuICovCitzdGF0aWMgY2hhciB5eV9ob2xkX2NoYXI7CitzdGF0aWMgaW50IHl5X25fY2hhcnM7CQkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8geXlfY2hfYnVmICovCitpbnQgemNvbmZsZW5nOworCisvKiBQb2ludHMgdG8gY3VycmVudCBjaGFyYWN0ZXIgaW4gYnVmZmVyLiAqLworc3RhdGljIGNoYXIgKnl5X2NfYnVmX3AgPSAoY2hhciAqKSAwOworc3RhdGljIGludCB5eV9pbml0ID0gMTsJCS8qIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplICovCitzdGF0aWMgaW50IHl5X3N0YXJ0ID0gMDsJLyogc3RhcnQgc3RhdGUgbnVtYmVyICovCisKKy8qIEZsYWcgd2hpY2ggaXMgdXNlZCB0byBhbGxvdyB6Y29uZndyYXAoKSdzIHRvIGRvIGJ1ZmZlciBzd2l0Y2hlcworICogaW5zdGVhZCBvZiBzZXR0aW5nIHVwIGEgZnJlc2ggemNvbmZpbi4gIEEgYml0IG9mIGEgaGFjayAuLi4KKyAqLworc3RhdGljIGludCB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2Y7CisKK3ZvaWQgemNvbmZyZXN0YXJ0IChGSUxFICppbnB1dF9maWxlICApOwordm9pZCB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAgKTsKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9jcmVhdGVfYnVmZmVyIChGSUxFICpmaWxlLGludCBzaXplICApOwordm9pZCB6Y29uZl9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAgKTsKK3ZvaWQgemNvbmZfZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAgKTsKK3ZvaWQgemNvbmZwdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgICk7Cit2b2lkIHpjb25mcG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCApOworCitzdGF0aWMgdm9pZCB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQgKTsKK3N0YXRpYyB2b2lkIHpjb25mX2xvYWRfYnVmZmVyX3N0YXRlICh2b2lkICk7CitzdGF0aWMgdm9pZCB6Y29uZl9pbml0X2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIsRklMRSAqZmlsZSAgKTsKKworI2RlZmluZSBZWV9GTFVTSF9CVUZGRVIgemNvbmZfZmx1c2hfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICkKKworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnVmZmVyIChjaGFyICpiYXNlLHl5X3NpemVfdCBzaXplICApOworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKnl5X3N0ciAgKTsKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX2J5dGVzICh5eWNvbnN0IGNoYXIgKmJ5dGVzLGludCBsZW4gICk7CisKK3ZvaWQgKnpjb25mYWxsb2MgKHl5X3NpemVfdCAgKTsKK3ZvaWQgKnpjb25mcmVhbGxvYyAodm9pZCAqLHl5X3NpemVfdCAgKTsKK3ZvaWQgemNvbmZmcmVlICh2b2lkICogICk7CisKKyNkZWZpbmUgeXlfbmV3X2J1ZmZlciB6Y29uZl9jcmVhdGVfYnVmZmVyCisKKyNkZWZpbmUgeXlfc2V0X2ludGVyYWN0aXZlKGlzX2ludGVyYWN0aXZlKSBcCisJeyBcCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7IFwKKyAgICAgICAgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOyBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKKyAgICAgICAgICAgIHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOyBcCisJfSBcCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pc19pbnRlcmFjdGl2ZSA9IGlzX2ludGVyYWN0aXZlOyBcCisJfQorCisjZGVmaW5lIHl5X3NldF9ib2woYXRfYm9sKSBcCisJeyBcCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7XAorICAgICAgICB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7IFwKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAorICAgICAgICAgICAgemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7IFwKKwl9IFwKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2F0X2JvbCA9IGF0X2JvbDsgXAorCX0KKworI2RlZmluZSBZWV9BVF9CT0woKSAoWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wpCisKKy8qIEJlZ2luIHVzZXIgc2VjdDMgKi8KKworI2RlZmluZSB6Y29uZndyYXAoKSAxCisjZGVmaW5lIFlZX1NLSVBfWVlXUkFQCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBZWV9DSEFSOworCitGSUxFICp6Y29uZmluID0gKEZJTEUgKikgMCwgKnpjb25mb3V0ID0gKEZJTEUgKikgMDsKKwordHlwZWRlZiBpbnQgeXlfc3RhdGVfdHlwZTsKKworZXh0ZXJuIGludCB6Y29uZmxpbmVubzsKKworaW50IHpjb25mbGluZW5vID0gMTsKKworZXh0ZXJuIGNoYXIgKnpjb25mdGV4dDsKKyNkZWZpbmUgeXl0ZXh0X3B0ciB6Y29uZnRleHQKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ueHRbXVsxN10gPQorICAgIHsKKyAgICB7CisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDEyLCAgIDEyLCAgIDE1LCAgIDEyLCAgIDEyLCAgIDEyLAorICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxMiwgICAxMiwgICAxNSwgICAxMiwgICAxMiwgICAxMiwKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTYsICAgMTYsICAgMTcsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsCisgICAgICAgMTYsICAgMTYsICAgMTYsICAgMTgsICAgMTYsICAgMTYsICAgMTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDE2LCAgIDE2LCAgIDE3LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LAorICAgICAgIDE2LCAgIDE2LCAgIDE2LCAgIDE4LCAgIDE2LCAgIDE2LCAgIDE2CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDE5LCAgIDIwLCAgIDIxLCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LAorICAgICAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxOSwgICAyMCwgICAyMSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwKKyAgICAgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMjIsICAgMjIsICAgMjMsICAgMjIsICAgMjQsICAgMjIsICAgMjIsICAgMjQsICAgMjIsCisgICAgICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjUsICAgMjIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDIyLCAgIDIyLCAgIDIzLCAgIDIyLCAgIDI0LCAgIDIyLCAgIDIyLCAgIDI0LCAgIDIyLAorICAgICAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDI1LCAgIDIyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAyNiwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAyOSwgICAzMiwKKyAgICAgICAzMywgICAzNCwgICAzNSwgICAzNSwgICAzNiwgICAzNywgICAzOAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAyNiwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAyOSwgICAzMiwKKyAgICAgICAzMywgICAzNCwgICAzNSwgICAzNSwgICAzNiwgICAzNywgICAzOAorICAgIH0sCisKKyAgICB7CisgICAgICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsCisgICAgICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLAorICAgICAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xMywgICAzOSwgICA0MCwgIC0xMywgIC0xMywgICA0MSwgIC0xMywgIC0xMywgIC0xMywKKyAgICAgIC0xMywgIC0xMywgIC0xMywgIC0xMywgIC0xMywgIC0xMywgIC0xMworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsCisgICAgICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDIsICAgNDIsICAgNDMsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LAorICAgICAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywKKyAgICAgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsCisgICAgICAtMTgsICAtMTgsICAtMTgsICAgNDQsICAtMTgsICAtMTgsICAtMTgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ1LCAgIDQ1LCAgLTE5LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LAorICAgICAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTIwLCAgIDQ2LCAgIDQ3LCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLAorICAgICAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0OCwgIC0yMSwgIC0yMSwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwKKyAgICAgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDksICAgNDksICAgNTAsICAgNDksICAtMjIsICAgNDksICAgNDksICAtMjIsICAgNDksCisgICAgICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAtMjIsICAgNDkKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLAorICAgICAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwKKyAgICAgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA1MSwgICA1MSwgICA1MiwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwKKyAgICAgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsCisgICAgICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LAorICAgICAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwKKyAgICAgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgICA1MywgIC0yOCwgIC0yOAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksCisgICAgICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjkKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNTQsICAgNTQsICAtMzAsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsCisgICAgICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgIDU1LCAgLTMxLCAgLTMxLAorICAgICAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwKKyAgICAgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsCisgICAgICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LAorICAgICAgLTM0LCAgIDU2LCAgIDU3LCAgIDU3LCAgLTM0LCAgLTM0LCAgLTM0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LAorICAgICAgLTM1LCAgIDU3LCAgIDU3LCAgIDU3LCAgLTM1LCAgLTM1LCAgLTM1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwKKyAgICAgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzcsICAtMzcsICAgNTgsICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcsCisgICAgICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LAorICAgICAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgIDU5CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zOSwgICAzOSwgICA0MCwgIC0zOSwgIC0zOSwgICA0MSwgIC0zOSwgIC0zOSwgIC0zOSwKKyAgICAgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwKKyAgICAgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDIsICAgNDIsICAgNDMsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQyLCAgIDQyLCAgIDQzLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLAorICAgICAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywKKyAgICAgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsCisgICAgICAtNDQsICAtNDQsICAtNDQsICAgNDQsICAtNDQsICAtNDQsICAtNDQKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDUsICAgNDUsICAtNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsCisgICAgICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQ2LCAgIDQ2LCAgIDQ3LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LAorICAgICAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0OCwgIC00NywgIC00NywgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwKKyAgICAgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsCisgICAgICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ5LCAgIDQ5LCAgIDUwLCAgIDQ5LCAgLTQ5LCAgIDQ5LCAgIDQ5LCAgLTQ5LCAgIDQ5LAorICAgICAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgLTQ5LCAgIDQ5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLAorICAgICAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01MSwgIC01MSwgICA1MiwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwKKyAgICAgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsCisgICAgICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLAorICAgICAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA1NCwgICA1NCwgIC01NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwKKyAgICAgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwKKyAgICAgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsCisgICAgICAtNTYsICAgNjAsICAgNTcsICAgNTcsICAtNTYsICAtNTYsICAtNTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LAorICAgICAgLTU3LCAgIDU3LCAgIDU3LCAgIDU3LCAgLTU3LCAgLTU3LCAgLTU3CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwKKyAgICAgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksCisgICAgICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTkKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsCisgICAgICAtNjAsICAgNTcsICAgNTcsICAgNTcsICAtNjAsICAtNjAsICAtNjAKKyAgICB9LAorCisgICAgfSA7CisKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAodm9pZCApOworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAoeXlfc3RhdGVfdHlwZSBjdXJyZW50X3N0YXRlICApOworc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHZvaWQgKTsKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIgbXNnW10gICk7CisKKy8qIERvbmUgYWZ0ZXIgdGhlIGN1cnJlbnQgcGF0dGVybiBoYXMgYmVlbiBtYXRjaGVkIGFuZCBiZWZvcmUgdGhlCisgKiBjb3JyZXNwb25kaW5nIGFjdGlvbiAtIHNldHMgdXAgemNvbmZ0ZXh0LgorICovCisjZGVmaW5lIFlZX0RPX0JFRk9SRV9BQ1RJT04gXAorCSh5eXRleHRfcHRyKSA9IHl5X2JwOyBcCisJemNvbmZsZW5nID0gKHNpemVfdCkgKHl5X2NwIC0geXlfYnApOyBcCisJKHl5X2hvbGRfY2hhcikgPSAqeXlfY3A7IFwKKwkqeXlfY3AgPSAnXDAnOyBcCisJKHl5X2NfYnVmX3ApID0geXlfY3A7CisKKyNkZWZpbmUgWVlfTlVNX1JVTEVTIDMzCisjZGVmaW5lIFlZX0VORF9PRl9CVUZGRVIgMzQKKy8qIFRoaXMgc3RydWN0IGlzIG5vdCB1c2VkIGluIHRoaXMgc2Nhbm5lciwKKyAgIGJ1dCBpdHMgcHJlc2VuY2UgaXMgbmVjZXNzYXJ5LiAqLworc3RydWN0IHl5X3RyYW5zX2luZm8KKwl7CisJZmxleF9pbnQzMl90IHl5X3ZlcmlmeTsKKwlmbGV4X2ludDMyX3QgeXlfbnh0OworCX07CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYWNjZXB0WzYxXSA9CisgICAgeyAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgMzQsICAgIDUsICAgIDQsICAgIDIsICAgIDMsICAgIDcsICAgIDgsICAgIDYsICAgMzIsICAgMjksCisgICAgICAgMzEsICAgMjQsICAgMjgsICAgMjcsICAgMjYsICAgMjIsICAgMTcsICAgMTMsICAgMTYsICAgMjAsCisgICAgICAgMjIsICAgMTEsICAgMTIsICAgMTksICAgMTksICAgMTQsICAgMjIsICAgMjIsICAgIDQsICAgIDIsCisgICAgICAgIDMsICAgIDMsICAgIDEsICAgIDYsICAgMzIsICAgMjksICAgMzEsICAgMzAsICAgMjQsICAgMjMsCisgICAgICAgMjYsICAgMjUsICAgMTUsICAgMjAsICAgIDksICAgMTksICAgMTksICAgMjEsICAgMTAsICAgMTgKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAyLCAgICA0LCAgICA1LCAgICA2LCAgICAxLCAgICAxLCAgICA3LCAgICA4LCAgICA5LAorICAgICAgIDEwLCAgICAxLCAgICAxLCAgICAxLCAgIDExLCAgIDEyLCAgIDEyLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgIDE0LCAgICAxLCAgICAxLCAgICAxLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgICAxLCAgIDE1LCAgICAxLCAgICAxLCAgIDEzLCAgICAxLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgIDEsICAgMTYsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQorICAgIH0gOworCitleHRlcm4gaW50IHpjb25mX2ZsZXhfZGVidWc7CitpbnQgemNvbmZfZmxleF9kZWJ1ZyA9IDA7CisKKy8qIFRoZSBpbnRlbnQgYmVoaW5kIHRoaXMgZGVmaW5pdGlvbiBpcyB0aGF0IGl0J2xsIGNhdGNoCisgKiBhbnkgdXNlcyBvZiBSRUpFQ1Qgd2hpY2ggZmxleCBtaXNzZWQuCisgKi8KKyNkZWZpbmUgUkVKRUNUIHJlamVjdF91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKKyNkZWZpbmUgeXltb3JlKCkgeXltb3JlX3VzZWRfYnV0X25vdF9kZXRlY3RlZAorI2RlZmluZSBZWV9NT1JFX0FESiAwCisjZGVmaW5lIFlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKK2NoYXIgKnpjb25mdGV4dDsKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCisjZGVmaW5lIFNUQVJUX1NUUlNJWkUJMTYKKworc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGxpbmVubzsKK30gY3VycmVudF9wb3M7CisKK3N0YXRpYyBjaGFyICp0ZXh0Oworc3RhdGljIGludCB0ZXh0X3NpemUsIHRleHRfYXNpemU7CisKK3N0cnVjdCBidWZmZXIgeworICAgICAgICBzdHJ1Y3QgYnVmZmVyICpwYXJlbnQ7CisgICAgICAgIFlZX0JVRkZFUl9TVEFURSBzdGF0ZTsKK307CisKK3N0cnVjdCBidWZmZXIgKmN1cnJlbnRfYnVmOworCitzdGF0aWMgaW50IGxhc3RfdHMsIGZpcnN0X3RzOworCitzdGF0aWMgdm9pZCB6Y29uZl9lbmRoZWxwKHZvaWQpOworc3RhdGljIHZvaWQgemNvbmZfZW5kZmlsZSh2b2lkKTsKKwordm9pZCBuZXdfc3RyaW5nKHZvaWQpCit7CisJdGV4dCA9IG1hbGxvYyhTVEFSVF9TVFJTSVpFKTsKKwl0ZXh0X2FzaXplID0gU1RBUlRfU1RSU0laRTsKKwl0ZXh0X3NpemUgPSAwOworCSp0ZXh0ID0gMDsKK30KKwordm9pZCBhcHBlbmRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJaW50IG5ld19zaXplID0gdGV4dF9zaXplICsgc2l6ZSArIDE7CisJaWYgKHNpemUgPiA3MCkgeworCQlmcHJpbnRmIChzdGRlcnIsICIlczolZCBlcnJvcjogT3ZlcmxvbmcgbGluZVxuIiwKKwkJY3VycmVudF9maWxlLT5uYW1lLCBjdXJyZW50X2ZpbGUtPmxpbmVubyk7CisJfQorCisJaWYgKG5ld19zaXplID4gdGV4dF9hc2l6ZSkgeworCQluZXdfc2l6ZSArPSBTVEFSVF9TVFJTSVpFIC0gMTsKKwkJbmV3X3NpemUgJj0gLVNUQVJUX1NUUlNJWkU7CisJCXRleHQgPSByZWFsbG9jKHRleHQsIG5ld19zaXplKTsKKwkJdGV4dF9hc2l6ZSA9IG5ld19zaXplOworCX0KKwltZW1jcHkodGV4dCArIHRleHRfc2l6ZSwgc3RyLCBzaXplKTsKKwl0ZXh0X3NpemUgKz0gc2l6ZTsKKwl0ZXh0W3RleHRfc2l6ZV0gPSAwOworfQorCit2b2lkIGFsbG9jX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzaXplKQoreworCXRleHQgPSBtYWxsb2Moc2l6ZSArIDEpOworCW1lbWNweSh0ZXh0LCBzdHIsIHNpemUpOworCXRleHRbc2l6ZV0gPSAwOworfQorCisjZGVmaW5lIElOSVRJQUwgMAorI2RlZmluZSBDT01NQU5EIDEKKyNkZWZpbmUgSEVMUCAyCisjZGVmaW5lIFNUUklORyAzCisjZGVmaW5lIFBBUkFNIDQKKworI2lmbmRlZiBZWV9OT19VTklTVERfSAorLyogU3BlY2lhbCBjYXNlIGZvciAidW5pc3RkLmgiLCBzaW5jZSBpdCBpcyBub24tQU5TSS4gV2UgaW5jbHVkZSBpdCB3YXkKKyAqIGRvd24gaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhlIHVzZXIncyBzZWN0aW9uIDEgdG8gaGF2ZSBiZWVuIHNjYW5uZWQgZmlyc3QuCisgKiBUaGUgdXNlciBoYXMgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgaXQgd2l0aCBhbiBvcHRpb24uCisgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZuZGVmIFlZX0VYVFJBX1RZUEUKKyNkZWZpbmUgWVlfRVhUUkFfVFlQRSB2b2lkICoKKyNlbmRpZgorCisvKiBNYWNyb3MgYWZ0ZXIgdGhpcyBwb2ludCBjYW4gYWxsIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBkZWZpbml0aW9ucyBpbgorICogc2VjdGlvbiAxLgorICovCisKKyNpZm5kZWYgWVlfU0tJUF9ZWVdSQVAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBpbnQgemNvbmZ3cmFwICh2b2lkICk7CisjZWxzZQorZXh0ZXJuIGludCB6Y29uZndyYXAgKHZvaWQgKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYyxjaGFyICpidWZfcHRyICApOworCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciAqLHl5Y29uc3QgY2hhciAqLGludCApOworI2VuZGlmCisKKyNpZmRlZiBZWV9ORUVEX1NUUkxFTgorc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogKTsKKyNlbmRpZgorCisvL2Jib3g6IHN1cHByZXNzaW5nICJkZWZpbmVkIGJ1dCBub3QgdXNlZCIgd2FybmluZworI2RlZmluZSBZWV9OT19JTlBVVCAxCisKKyNpZm5kZWYgWVlfTk9fSU5QVVQKKworI2lmZGVmIF9fY3BsdXNwbHVzCitzdGF0aWMgaW50IHl5aW5wdXQgKHZvaWQgKTsKKyNlbHNlCitzdGF0aWMgaW50IGlucHV0ICh2b2lkICk7CisjZW5kaWYKKworI2VuZGlmCisKKy8qIEFtb3VudCBvZiBzdHVmZiB0byBzbHVycCB1cCB3aXRoIGVhY2ggcmVhZC4gKi8KKyNpZm5kZWYgWVlfUkVBRF9CVUZfU0laRQorI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDgxOTIKKyNlbmRpZgorCisvKiBDb3B5IHdoYXRldmVyIHRoZSBsYXN0IHJ1bGUgbWF0Y2hlZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAqLworI2lmbmRlZiBFQ0hPCisvKiBUaGlzIHVzZWQgdG8gYmUgYW4gZnB1dHMoKSwgYnV0IHNpbmNlIHRoZSBzdHJpbmcgbWlnaHQgY29udGFpbiBOVUwncywKKyAqIHdlIG5vdyB1c2UgZndyaXRlKCkuCisgKi8KKyNkZWZpbmUgRUNITyAodm9pZCkgZndyaXRlKCB6Y29uZnRleHQsIHpjb25mbGVuZywgMSwgemNvbmZvdXQgKQorI2VuZGlmCisKKy8qIEdldHMgaW5wdXQgYW5kIHN0dWZmcyBpdCBpbnRvICJidWYiLiAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgWVlfTlVMTCwKKyAqIGlzIHJldHVybmVkIGluICJyZXN1bHQiLgorICovCisjaWZuZGVmIFlZX0lOUFVUCisjZGVmaW5lIFlZX0lOUFVUKGJ1ZixyZXN1bHQsbWF4X3NpemUpIFwKKwllcnJubz0wOyBcCisJd2hpbGUgKCAocmVzdWx0ID0gcmVhZCggZmlsZW5vKHpjb25maW4pLCAoY2hhciAqKSBidWYsIG1heF9zaXplICkpIDwgMCApIFwKKwl7IFwKKwkJaWYoIGVycm5vICE9IEVJTlRSKSBcCisJCXsgXAorCQkJWVlfRkFUQUxfRVJST1IoICJpbnB1dCBpbiBmbGV4IHNjYW5uZXIgZmFpbGVkIiApOyBcCisJCQlicmVhazsgXAorCQl9IFwKKwkJZXJybm89MDsgXAorCQljbGVhcmVycih6Y29uZmluKTsgXAorCX1cCitcCisKKyNlbmRpZgorCisvKiBObyBzZW1pLWNvbG9uIGFmdGVyIHJldHVybjsgY29ycmVjdCB1c2FnZSBpcyB0byB3cml0ZSAieXl0ZXJtaW5hdGUoKTsiIC0KKyAqIHdlIGRvbid0IHdhbnQgYW4gZXh0cmEgJzsnIGFmdGVyIHRoZSAicmV0dXJuIiBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZQorICogc29tZSBjb21waWxlcnMgdG8gY29tcGxhaW4gYWJvdXQgdW5yZWFjaGFibGUgc3RhdGVtZW50cy4KKyAqLworI2lmbmRlZiB5eXRlcm1pbmF0ZQorI2RlZmluZSB5eXRlcm1pbmF0ZSgpIHJldHVybiBZWV9OVUxMCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGVudHJpZXMgYnkgd2hpY2ggc3RhcnQtY29uZGl0aW9uIHN0YWNrIGdyb3dzLiAqLworI2lmbmRlZiBZWV9TVEFSVF9TVEFDS19JTkNSCisjZGVmaW5lIFlZX1NUQVJUX1NUQUNLX0lOQ1IgMjUKKyNlbmRpZgorCisvKiBSZXBvcnQgYSBmYXRhbCBlcnJvci4gKi8KKyNpZm5kZWYgWVlfRkFUQUxfRVJST1IKKyNkZWZpbmUgWVlfRkFUQUxfRVJST1IobXNnKSB5eV9mYXRhbF9lcnJvciggbXNnICkKKyNlbmRpZgorCisvKiBlbmQgdGFibGVzIHNlcmlhbGl6YXRpb24gc3RydWN0dXJlcyBhbmQgcHJvdG90eXBlcyAqLworCisvKiBEZWZhdWx0IGRlY2xhcmF0aW9uIG9mIGdlbmVyYXRlZCBzY2FubmVyIC0gYSBkZWZpbmUgc28gdGhlIHVzZXIgY2FuCisgKiBlYXNpbHkgYWRkIHBhcmFtZXRlcnMuCisgKi8KKyNpZm5kZWYgWVlfREVDTAorI2RlZmluZSBZWV9ERUNMX0lTX09VUlMgMQorCitleHRlcm4gaW50IHpjb25mbGV4ICh2b2lkKTsKKworI2RlZmluZSBZWV9ERUNMIGludCB6Y29uZmxleCAodm9pZCkKKyNlbmRpZiAvKiAhWVlfREVDTCAqLworCisvKiBDb2RlIGV4ZWN1dGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBydWxlLCBhZnRlciB6Y29uZnRleHQgYW5kIHpjb25mbGVuZworICogaGF2ZSBiZWVuIHNldCB1cC4KKyAqLworI2lmbmRlZiBZWV9VU0VSX0FDVElPTgorI2RlZmluZSBZWV9VU0VSX0FDVElPTgorI2VuZGlmCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHJ1bGUuICovCisjaWZuZGVmIFlZX0JSRUFLCisjZGVmaW5lIFlZX0JSRUFLIGJyZWFrOworI2VuZGlmCisKKyNkZWZpbmUgWVlfUlVMRV9TRVRVUCBcCisJWVlfVVNFUl9BQ1RJT04KKworLyoqIFRoZSBtYWluIHNjYW5uZXIgZnVuY3Rpb24gd2hpY2ggZG9lcyBhbGwgdGhlIHdvcmsuCisgKi8KK1lZX0RFQ0wKK3sKKwlyZWdpc3RlciB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGU7CisJcmVnaXN0ZXIgY2hhciAqeXlfY3AsICp5eV9icDsKKwlyZWdpc3RlciBpbnQgeXlfYWN0OworCisJaW50IHN0ciA9IDA7CisJaW50IHRzLCBpOworCisJaWYgKCAoeXlfaW5pdCkgKQorCQl7CisJCSh5eV9pbml0KSA9IDA7CisKKyNpZmRlZiBZWV9VU0VSX0lOSVQKKwkJWVlfVVNFUl9JTklUOworI2VuZGlmCisKKwkJaWYgKCAhICh5eV9zdGFydCkgKQorCQkJKHl5X3N0YXJ0KSA9IDE7CS8qIGZpcnN0IHN0YXJ0IHN0YXRlICovCisKKwkJaWYgKCAhIHpjb25maW4gKQorCQkJemNvbmZpbiA9IHN0ZGluOworCisJCWlmICggISB6Y29uZm91dCApCisJCQl6Y29uZm91dCA9IHN0ZG91dDsKKworCQlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKSB7CisJCQl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQorCQkJCXpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOworCQl9CisKKwkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisJCX0KKworCXdoaWxlICggMSApCQkvKiBsb29wcyB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkICovCisJCXsKKwkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisKKwkJLyogU3VwcG9ydCBvZiB6Y29uZnRleHQuICovCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCisJCS8qIHl5X2JwIHBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4geXlfY2hfYnVmIG9mIHRoZSBzdGFydCBvZgorCQkgKiB0aGUgY3VycmVudCBydW4uCisJCSAqLworCQl5eV9icCA9IHl5X2NwOworCisJCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOworeXlfbWF0Y2g6CisJCXdoaWxlICggKHl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bIHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldICBdKSA+IDAgKQorCQkJKyt5eV9jcDsKKworCQl5eV9jdXJyZW50X3N0YXRlID0gLXl5X2N1cnJlbnRfc3RhdGU7CisKK3l5X2ZpbmRfYWN0aW9uOgorCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07CisKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsKKworZG9fYWN0aW9uOgkvKiBUaGlzIGxhYmVsIGlzIHVzZWQgb25seSB0byBhY2Nlc3MgRU9GIGFjdGlvbnMuICovCisKKwkJc3dpdGNoICggeXlfYWN0ICkKKwl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCitjYXNlIDE6CisvKiBydWxlIDEgY2FuIG1hdGNoIGVvbCAqLworY2FzZSAyOgorLyogcnVsZSAyIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCXJldHVybiBUX0VPTDsKK30KKwlZWV9CUkVBSworY2FzZSAzOgorWVlfUlVMRV9TRVRVUAorCisJWVlfQlJFQUsKK2Nhc2UgNDoKK1lZX1JVTEVfU0VUVVAKK3sKKwlCRUdJTihDT01NQU5EKTsKK30KKwlZWV9CUkVBSworY2FzZSA1OgorWVlfUlVMRV9TRVRVUAoreworCXVucHV0KHpjb25mdGV4dFswXSk7CisJQkVHSU4oQ09NTUFORCk7Cit9CisJWVlfQlJFQUsKKworY2FzZSA2OgorWVlfUlVMRV9TRVRVUAoreworCQlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJQkVHSU4oUEFSQU0pOworCQljdXJyZW50X3Bvcy5maWxlID0gY3VycmVudF9maWxlOworCQljdXJyZW50X3Bvcy5saW5lbm8gPSBjdXJyZW50X2ZpbGUtPmxpbmVubzsKKwkJaWYgKGlkICYmIGlkLT5mbGFncyAmIFRGX0NPTU1BTkQpIHsKKwkJCXpjb25mbHZhbC5pZCA9IGlkOworCQkJcmV0dXJuIGlkLT50b2tlbjsKKwkJfQorCQlhbGxvY19zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNzoKK1lZX1JVTEVfU0VUVVAKKworCVlZX0JSRUFLCitjYXNlIDg6CisvKiBydWxlIDggY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAoreworCQlCRUdJTihJTklUSUFMKTsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJcmV0dXJuIFRfRU9MOworCX0KKwlZWV9CUkVBSworCitjYXNlIDk6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9BTkQ7CisJWVlfQlJFQUsKK2Nhc2UgMTA6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9PUjsKKwlZWV9CUkVBSworY2FzZSAxMToKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX09QRU5fUEFSRU47CisJWVlfQlJFQUsKK2Nhc2UgMTI6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9DTE9TRV9QQVJFTjsKKwlZWV9CUkVBSworY2FzZSAxMzoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX05PVDsKKwlZWV9CUkVBSworY2FzZSAxNDoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX0VRVUFMOworCVlZX0JSRUFLCitjYXNlIDE1OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfVU5FUVVBTDsKKwlZWV9CUkVBSworY2FzZSAxNjoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJc3RyID0gemNvbmZ0ZXh0WzBdOworCQluZXdfc3RyaW5nKCk7CisJCUJFR0lOKFNUUklORyk7CisJfQorCVlZX0JSRUFLCitjYXNlIDE3OgorLyogcnVsZSAxNyBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCitCRUdJTihJTklUSUFMKTsgY3VycmVudF9maWxlLT5saW5lbm8rKzsgcmV0dXJuIFRfRU9MOworCVlZX0JSRUFLCitjYXNlIDE4OgorWVlfUlVMRV9TRVRVUAorLyogaWdub3JlICovCisJWVlfQlJFQUsKK2Nhc2UgMTk6CitZWV9SVUxFX1NFVFVQCit7CisJCXN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQlpZiAoaWQgJiYgaWQtPmZsYWdzICYgVEZfUEFSQU0pIHsKKwkJCXpjb25mbHZhbC5pZCA9IGlkOworCQkJcmV0dXJuIGlkLT50b2tlbjsKKwkJfQorCQlhbGxvY19zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjA6CitZWV9SVUxFX1NFVFVQCisvKiBjb21tZW50ICovCisJWVlfQlJFQUsKK2Nhc2UgMjE6CisvKiBydWxlIDIxIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK2N1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJWVlfQlJFQUsKK2Nhc2UgMjI6CitZWV9SVUxFX1NFVFVQCisKKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoUEFSQU0pOgoreworCQlCRUdJTihJTklUSUFMKTsKKwl9CisJWVlfQlJFQUsKKworY2FzZSAyMzoKKy8qIHJ1bGUgMjMgY2FuIG1hdGNoIGVvbCAqLworKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKK1lZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCX0KKwlZWV9CUkVBSworY2FzZSAyNDoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJfQorCVlZX0JSRUFLCitjYXNlIDI1OgorLyogcnVsZSAyNSBjYW4gbWF0Y2ggZW9sICovCisqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisoeXlfY19idWZfcCkgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCArIDEsIHpjb25mbGVuZyAtIDEpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjY6CitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0ICsgMSwgemNvbmZsZW5nIC0gMSk7CisJfQorCVlZX0JSRUFLCitjYXNlIDI3OgorWVlfUlVMRV9TRVRVUAoreworCQlpZiAoc3RyID09IHpjb25mdGV4dFswXSkgeworCQkJQkVHSU4oUEFSQU0pOworCQkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCQl9IGVsc2UKKwkJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCAxKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjg6CisvKiBydWxlIDI4IGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJcHJpbnRmKCIlczolZDp3YXJuaW5nOiBtdWx0aS1saW5lIHN0cmluZ3Mgbm90IHN1cHBvcnRlZFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCUJFR0lOKElOSVRJQUwpOworCQlyZXR1cm4gVF9FT0w7CisJfQorCVlZX0JSRUFLCitjYXNlIFlZX1NUQVRFX0VPRihTVFJJTkcpOgoreworCQlCRUdJTihJTklUSUFMKTsKKwl9CisJWVlfQlJFQUsKKworY2FzZSAyOToKK1lZX1JVTEVfU0VUVVAKK3sKKwkJdHMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgemNvbmZsZW5nOyBpKyspIHsKKwkJCWlmICh6Y29uZnRleHRbaV0gPT0gJ1x0JykKKwkJCQl0cyA9ICh0cyAmIH43KSArIDg7CisJCQllbHNlCisJCQkJdHMrKzsKKwkJfQorCQlsYXN0X3RzID0gdHM7CisJCWlmIChmaXJzdF90cykgeworCQkJaWYgKHRzIDwgZmlyc3RfdHMpIHsKKwkJCQl6Y29uZl9lbmRoZWxwKCk7CisJCQkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJCQl9CisJCQl0cyAtPSBmaXJzdF90czsKKwkJCXdoaWxlICh0cyA+IDgpIHsKKwkJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIDgpOworCQkJCXRzIC09IDg7CisJCQl9CisJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIHRzKTsKKwkJfQorCX0KKwlZWV9CUkVBSworY2FzZSAzMDoKKy8qIHJ1bGUgMzAgY2FuIG1hdGNoIGVvbCAqLworKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKK1lZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJemNvbmZfZW5kaGVscCgpOworCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMzE6CisvKiBydWxlIDMxIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJYXBwZW5kX3N0cmluZygiXG4iLCAxKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMzI6CitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQlpZiAoIWZpcnN0X3RzKQorCQkJZmlyc3RfdHMgPSBsYXN0X3RzOworCX0KKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoSEVMUCk6Cit7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgorY2FzZSBZWV9TVEFURV9FT0YoQ09NTUFORCk6Cit7CisJaWYgKGN1cnJlbnRfZmlsZSkgeworCQl6Y29uZl9lbmRmaWxlKCk7CisJCXJldHVybiBUX0VPTDsKKwl9CisJZmNsb3NlKHpjb25maW4pOworCXl5dGVybWluYXRlKCk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMzM6CitZWV9SVUxFX1NFVFVQCitZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBqYW1tZWQiICk7CisJWVlfQlJFQUsKKworCWNhc2UgWVlfRU5EX09GX0JVRkZFUjoKKwkJeworCQkvKiBBbW91bnQgb2YgdGV4dCBtYXRjaGVkIG5vdCBpbmNsdWRpbmcgdGhlIEVPQiBjaGFyLiAqLworCQlpbnQgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dCA9IChpbnQpICh5eV9jcCAtICh5eXRleHRfcHRyKSkgLSAxOworCisJCS8qIFVuZG8gdGhlIGVmZmVjdHMgb2YgWVlfRE9fQkVGT1JFX0FDVElPTi4gKi8KKwkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7CisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKKworCQlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfTkVXICkKKwkJCXsKKwkJCS8qIFdlJ3JlIHNjYW5uaW5nIGEgbmV3IGZpbGUgb3IgaW5wdXQgc291cmNlLiAgSXQncworCQkJICogcG9zc2libGUgdGhhdCB0aGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHVzZXIKKwkJCSAqIGp1c3QgcG9pbnRlZCB6Y29uZmluIGF0IGEgbmV3IHNvdXJjZSBhbmQgY2FsbGVkCisJCQkgKiB6Y29uZmxleCgpLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBhc3N1cmUKKwkJCSAqIGNvbnNpc3RlbmN5IGJldHdlZW4gWVlfQ1VSUkVOVF9CVUZGRVIgYW5kIG91cgorCQkJICogZ2xvYmFscy4gIEhlcmUgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGRvIHNvLCBiZWNhdXNlCisJCQkgKiB0aGlzIGlzIHRoZSBmaXJzdCBhY3Rpb24gKG90aGVyIHRoYW4gcG9zc2libHkgYQorCQkJICogYmFjay11cCkgdGhhdCB3aWxsIG1hdGNoIGZvciB0aGUgbmV3IGlucHV0IHNvdXJjZS4KKwkJCSAqLworCQkJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlID0gemNvbmZpbjsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9OT1JNQUw7CisJCQl9CisKKwkJLyogTm90ZSB0aGF0IGhlcmUgd2UgdGVzdCBmb3IgeXlfY19idWZfcCAiPD0iIHRvIHRoZSBwb3NpdGlvbgorCQkgKiBvZiB0aGUgZmlyc3QgRU9CIGluIHRoZSBidWZmZXIsIHNpbmNlIHl5X2NfYnVmX3Agd2lsbAorCQkgKiBhbHJlYWR5IGhhdmUgYmVlbiBpbmNyZW1lbnRlZCBwYXN0IHRoZSBOVUwgY2hhcmFjdGVyCisJCSAqIChzaW5jZSBhbGwgc3RhdGVzIG1ha2UgdHJhbnNpdGlvbnMgb24gRU9CIHRvIHRoZQorCQkgKiBlbmQtb2YtYnVmZmVyIHN0YXRlKS4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUgdGVzdAorCQkgKiBpbiBpbnB1dCgpLgorCQkgKi8KKwkJaWYgKCAoeXlfY19idWZfcCkgPD0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gKQorCQkJeyAvKiBUaGlzIHdhcyByZWFsbHkgYSBOVUwuICovCisJCQl5eV9zdGF0ZV90eXBlIHl5X25leHRfc3RhdGU7CisKKwkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7CisKKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkvKiBPa2F5LCB3ZSdyZSBub3cgcG9zaXRpb25lZCB0byBtYWtlIHRoZSBOVUwKKwkJCSAqIHRyYW5zaXRpb24uICBXZSBjb3VsZG4ndCBoYXZlCisJCQkgKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKSBnbyBhaGVhZCBhbmQgZG8gaXQKKwkJCSAqIGZvciB1cyBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgdG8gZGVhbAorCQkJICogd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgamFtbWluZyAoYW5kIHdlIGRvbid0CisJCQkgKiB3YW50IHRvIGJ1aWxkIGphbW1pbmcgaW50byBpdCBiZWNhdXNlIHRoZW4gaXQKKwkJCSAqIHdpbGwgcnVuIG1vcmUgc2xvd2x5KS4KKwkJCSAqLworCisJCQl5eV9uZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggeXlfY3VycmVudF9zdGF0ZSApOworCisJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCisJCQlpZiAoIHl5X25leHRfc3RhdGUgKQorCQkJCXsKKwkJCQkvKiBDb25zdW1lIHRoZSBOVUwuICovCisJCQkJeXlfY3AgPSArKyh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbmV4dF9zdGF0ZTsKKwkJCQlnb3RvIHl5X21hdGNoOworCQkJCX0KKworCQkJZWxzZQorCQkJCXsKKwkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJCX0KKwkJCX0KKworCQllbHNlIHN3aXRjaCAoIHl5X2dldF9uZXh0X2J1ZmZlciggICkgKQorCQkJeworCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCXsKKwkJCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDA7CisKKwkJCQlpZiAoIHpjb25md3JhcCggKSApCisJCQkJCXsKKwkJCQkJLyogTm90ZTogYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIGluCisJCQkJCSAqIHl5X2dldF9uZXh0X2J1ZmZlcigpIHRvIGhhdmUgc2V0IHVwCisJCQkJCSAqIHpjb25mdGV4dCwgd2UgY2FuIG5vdyBzZXQgdXAKKwkJCQkJICogeXlfY19idWZfcCBzbyB0aGF0IGlmIHNvbWUgdG90YWwKKwkJCQkJICogaG9zZXIgKGxpa2UgZmxleCBpdHNlbGYpIHdhbnRzIHRvCisJCQkJCSAqIGNhbGwgdGhlIHNjYW5uZXIgYWZ0ZXIgd2UgcmV0dXJuIHRoZQorCQkJCQkgKiBZWV9OVUxMLCBpdCdsbCBzdGlsbCB3b3JrIC0gYW5vdGhlcgorCQkJCQkgKiBZWV9OVUxMIHdpbGwgZ2V0IHJldHVybmVkLgorCQkJCQkgKi8KKwkJCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisKKwkJCQkJeXlfYWN0ID0gWVlfU1RBVEVfRU9GKFlZX1NUQVJUKTsKKwkJCQkJZ290byBkb19hY3Rpb247CisJCQkJCX0KKworCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoICEgKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCSh5eV9jX2J1Zl9wKSA9CisJCQkJCSh5eXRleHRfcHRyKSArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7CisKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCAgKTsKKworCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisJCQkJZ290byB5eV9tYXRjaDsKKworCQkJY2FzZSBFT0JfQUNUX0xBU1RfTUFUQ0g6CisJCQkJKHl5X2NfYnVmX3ApID0KKwkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXTsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJfQorCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJWVlfRkFUQUxfRVJST1IoCisJCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1ubyBhY3Rpb24gZm91bmQiICk7CisJfSAvKiBlbmQgb2YgYWN0aW9uIHN3aXRjaCAqLworCQl9IC8qIGVuZCBvZiBzY2FubmluZyBvbmUgdG9rZW4gKi8KK30gLyogZW5kIG9mIHpjb25mbGV4ICovCisKKy8qIHl5X2dldF9uZXh0X2J1ZmZlciAtIHRyeSB0byByZWFkIGluIGEgbmV3IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgYSBjb2RlIHJlcHJlc2VudGluZyBhbiBhY3Rpb246CisgKglFT0JfQUNUX0xBU1RfTUFUQ0ggLQorICoJRU9CX0FDVF9DT05USU5VRV9TQ0FOIC0gY29udGludWUgc2Nhbm5pbmcgZnJvbSBjdXJyZW50IHBvc2l0aW9uCisgKglFT0JfQUNUX0VORF9PRl9GSUxFIC0gZW5kIG9mIGZpbGUKKyAqLworc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHZvaWQpCit7CisgICAgCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZjsKKwlyZWdpc3RlciBjaGFyICpzb3VyY2UgPSAoeXl0ZXh0X3B0cik7CisJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlLCBpOworCWludCByZXRfdmFsOworCisJaWYgKCAoeXlfY19idWZfcCkgPiAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpICsgMV0gKQorCQlZWV9GQVRBTF9FUlJPUigKKwkJImZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tZW5kIG9mIGJ1ZmZlciBtaXNzZWQiICk7CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfZmlsbF9idWZmZXIgPT0gMCApCisJCXsgLyogRG9uJ3QgdHJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciwgc28gdGhpcyBpcyBhbiBFT0YuICovCisJCWlmICggKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpIC0gWVlfTU9SRV9BREogPT0gMSApCisJCQl7CisJCQkvKiBXZSBtYXRjaGVkIGEgc2luZ2xlIGNoYXJhY3RlciwgdGhlIEVPQiwgc28KKwkJCSAqIHRyZWF0IHRoaXMgYXMgYSBmaW5hbCBFT0YuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0VORF9PRl9GSUxFOworCQkJfQorCisJCWVsc2UKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgc29tZSB0ZXh0IHByaW9yIHRvIHRoZSBFT0IsIGZpcnN0CisJCQkgKiBwcm9jZXNzIGl0LgorCQkJICovCisJCQlyZXR1cm4gRU9CX0FDVF9MQVNUX01BVENIOworCQkJfQorCQl9CisKKwkvKiBUcnkgdG8gcmVhZCBtb3JlIGRhdGEuICovCisKKwkvKiBGaXJzdCBtb3ZlIGxhc3QgY2hhcnMgdG8gc3RhcnQgb2YgYnVmZmVyLiAqLworCW51bWJlcl90b19tb3ZlID0gKGludCkgKCh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKSkgLSAxOworCisJZm9yICggaSA9IDA7IGkgPCBudW1iZXJfdG9fbW92ZTsgKytpICkKKwkJKihkZXN0KyspID0gKihzb3VyY2UrKyk7CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgKQorCQkvKiBkb24ndCBkbyB0aGUgcmVhZCwgaXQncyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYW4gRU9GLAorCQkgKiBqdXN0IGZvcmNlIGFuIEVPRgorCQkgKi8KKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpID0gMDsKKworCWVsc2UKKwkJeworCQkJc2l6ZV90IG51bV90b19yZWFkID0KKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLSBudW1iZXJfdG9fbW92ZSAtIDE7CisKKwkJd2hpbGUgKCBudW1fdG9fcmVhZCA8PSAwICkKKwkJCXsgLyogTm90IGVub3VnaCByb29tIGluIHRoZSBidWZmZXIgLSBncm93IGl0LiAqLworCisJCQkvKiBqdXN0IGEgc2hvcnRlciBuYW1lIGZvciB0aGUgY3VycmVudCBidWZmZXIgKi8KKwkJCVlZX0JVRkZFUl9TVEFURSBiID0gWVlfQ1VSUkVOVF9CVUZGRVI7CisKKwkJCWludCB5eV9jX2J1Zl9wX29mZnNldCA9CisJCQkJKGludCkgKCh5eV9jX2J1Zl9wKSAtIGItPnl5X2NoX2J1Zik7CisKKwkJCWlmICggYi0+eXlfaXNfb3VyX2J1ZmZlciApCisJCQkJeworCQkJCWludCBuZXdfc2l6ZSA9IGItPnl5X2J1Zl9zaXplICogMjsKKworCQkJCWlmICggbmV3X3NpemUgPD0gMCApCisJCQkJCWItPnl5X2J1Zl9zaXplICs9IGItPnl5X2J1Zl9zaXplIC8gODsKKwkJCQllbHNlCisJCQkJCWItPnl5X2J1Zl9zaXplICo9IDI7CisKKwkJCQliLT55eV9jaF9idWYgPSAoY2hhciAqKQorCQkJCQkvKiBJbmNsdWRlIHJvb20gaW4gZm9yIDIgRU9CIGNoYXJzLiAqLworCQkJCQl6Y29uZnJlYWxsb2MoKHZvaWQgKikgYi0+eXlfY2hfYnVmLGItPnl5X2J1Zl9zaXplICsgMiAgKTsKKwkJCQl9CisJCQllbHNlCisJCQkJLyogQ2FuJ3QgZ3JvdyBpdCwgd2UgZG9uJ3Qgb3duIGl0LiAqLworCQkJCWItPnl5X2NoX2J1ZiA9IDA7CisKKwkJCWlmICggISBiLT55eV9jaF9idWYgKQorCQkJCVlZX0ZBVEFMX0VSUk9SKAorCQkJCSJmYXRhbCBlcnJvciAtIHNjYW5uZXIgaW5wdXQgYnVmZmVyIG92ZXJmbG93IiApOworCisJCQkoeXlfY19idWZfcCkgPSAmYi0+eXlfY2hfYnVmW3l5X2NfYnVmX3Bfb2Zmc2V0XTsKKworCQkJbnVtX3RvX3JlYWQgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplIC0KKwkJCQkJCW51bWJlcl90b19tb3ZlIC0gMTsKKworCQkJfQorCisJCWlmICggbnVtX3RvX3JlYWQgPiBZWV9SRUFEX0JVRl9TSVpFICkKKwkJCW51bV90b19yZWFkID0gWVlfUkVBRF9CVUZfU0laRTsKKworCQkvKiBSZWFkIGluIG1vcmUgZGF0YS4gKi8KKwkJWVlfSU5QVVQoICgmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdKSwKKwkJCSh5eV9uX2NoYXJzKSwgbnVtX3RvX3JlYWQgKTsKKworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7CisJCX0KKworCWlmICggKHl5X25fY2hhcnMpID09IDAgKQorCQl7CisJCWlmICggbnVtYmVyX3RvX21vdmUgPT0gWVlfTU9SRV9BREogKQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl6Y29uZnJlc3RhcnQoemNvbmZpbiAgKTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9MQVNUX01BVENIOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID0KKwkJCQlZWV9CVUZGRVJfRU9GX1BFTkRJTkc7CisJCQl9CisJCX0KKworCWVsc2UKKwkJcmV0X3ZhbCA9IEVPQl9BQ1RfQ09OVElOVUVfU0NBTjsKKworCSh5eV9uX2NoYXJzKSArPSBudW1iZXJfdG9fbW92ZTsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKSArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJKHl5dGV4dF9wdHIpID0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWzBdOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qIHl5X2dldF9wcmV2aW91c19zdGF0ZSAtIGdldCB0aGUgc3RhdGUganVzdCBiZWZvcmUgdGhlIEVPQiBjaGFyIHdhcyByZWFjaGVkICovCisKKyAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgKHZvaWQpCit7CisJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwOworCisJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9zdGFydCk7CisKKwlmb3IgKCB5eV9jcCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOyB5eV9jcCA8ICh5eV9jX2J1Zl9wKTsgKyt5eV9jcCApCisJCXsKKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9jdXJyZW50X3N0YXRlXVsoKnl5X2NwID8geXlfZWNbWVlfU0NfVE9fVUkoKnl5X2NwKV0gOiAxKV07CisJCX0KKworCXJldHVybiB5eV9jdXJyZW50X3N0YXRlOworfQorCisvKiB5eV90cnlfTlVMX3RyYW5zIC0gdHJ5IHRvIG1ha2UgYSB0cmFuc2l0aW9uIG9uIHRoZSBOVUwgY2hhcmFjdGVyCisgKgorICogc3lub3BzaXMKKyAqCW5leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCBjdXJyZW50X3N0YXRlICk7CisgKi8KKyAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICAoeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlICkKK3sKKwlyZWdpc3RlciBpbnQgeXlfaXNfamFtOworCisJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9jdXJyZW50X3N0YXRlXVsxXTsKKwl5eV9pc19qYW0gPSAoeXlfY3VycmVudF9zdGF0ZSA8PSAwKTsKKworCXJldHVybiB5eV9pc19qYW0gPyAwIDogeXlfY3VycmVudF9zdGF0ZTsKK30KKworICAgIHN0YXRpYyB2b2lkIHl5dW5wdXQgKGludCBjLCByZWdpc3RlciBjaGFyICogeXlfYnAgKQoreworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwOworCisgICAgeXlfY3AgPSAoeXlfY19idWZfcCk7CisKKwkvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQgKi8KKwkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKKworCWlmICggeXlfY3AgPCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiArIDIgKQorCQl7IC8qIG5lZWQgdG8gc2hpZnQgdGhpbmdzIHVwIHRvIG1ha2Ugcm9vbSAqLworCQkvKiArMiBmb3IgRU9CIGNoYXJzLiAqLworCQlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUgPSAoeXlfbl9jaGFycykgKyAyOworCQlyZWdpc3RlciBjaGFyICpkZXN0ID0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWworCQkJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplICsgMl07CisJCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9CisJCQkJJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXTsKKworCQl3aGlsZSAoIHNvdXJjZSA+IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICkKKwkJCSotLWRlc3QgPSAqLS1zb3VyY2U7CisKKwkJeXlfY3AgKz0gKGludCkgKGRlc3QgLSBzb3VyY2UpOworCQl5eV9icCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9CisJCQkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplOworCisJCWlmICggeXlfY3AgPCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiArIDIgKQorCQkJWVlfRkFUQUxfRVJST1IoICJmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93IiApOworCQl9CisKKwkqLS15eV9jcCA9IChjaGFyKSBjOworCisJKHl5dGV4dF9wdHIpID0geXlfYnA7CisJKHl5X2hvbGRfY2hhcikgPSAqeXlfY3A7CisJKHl5X2NfYnVmX3ApID0geXlfY3A7Cit9CisKKyNpZm5kZWYgWVlfTk9fSU5QVVQKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIHN0YXRpYyBpbnQgeXlpbnB1dCAodm9pZCkKKyNlbHNlCisgICAgc3RhdGljIGludCBpbnB1dCAgKHZvaWQpCisjZW5kaWYKKworeworCWludCBjOworCisJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCisJaWYgKCAqKHl5X2NfYnVmX3ApID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCXsKKwkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCisJCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKKwkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICggKHl5X2NfYnVmX3ApIDwgJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gKQorCQkJLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CisKKwkJZWxzZQorCQkJeyAvKiBuZWVkIG1vcmUgaW5wdXQgKi8KKwkJCWludCBvZmZzZXQgPSAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cik7CisJCQkrKyh5eV9jX2J1Zl9wKTsKKworCQkJc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCisJCQkJeworCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCisJCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCisJCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KKwkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKKwkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKKwkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KKwkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICisJCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCisJCQkJCSAqLworCisJCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCisJCQkJCXpjb25mcmVzdGFydCh6Y29uZmluICk7CisKKwkJCQkJLypGQUxMVEhST1VHSCovCisKKwkJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CisJCQkJCXsKKwkJCQkJaWYgKCB6Y29uZndyYXAoICkgKQorCQkJCQkJcmV0dXJuIEVPRjsKKworCQkJCQlpZiAoICEgKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisjaWZkZWYgX19jcGx1c3BsdXMKKwkJCQkJcmV0dXJuIHl5aW5wdXQoKTsKKyNlbHNlCisJCQkJCXJldHVybiBpbnB1dCgpOworI2VuZGlmCisJCQkJCX0KKworCQkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBvZmZzZXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJYyA9ICoodW5zaWduZWQgY2hhciAqKSAoeXlfY19idWZfcCk7CS8qIGNhc3QgZm9yIDgtYml0IGNoYXIncyAqLworCSooeXlfY19idWZfcCkgPSAnXDAnOwkvKiBwcmVzZXJ2ZSB6Y29uZnRleHQgKi8KKwkoeXlfaG9sZF9jaGFyKSA9ICorKyh5eV9jX2J1Zl9wKTsKKworCXJldHVybiBjOworfQorI2VuZGlmCS8qIGlmbmRlZiBZWV9OT19JTlBVVCAqLworCisvKiogSW1tZWRpYXRlbHkgc3dpdGNoIHRvIGEgZGlmZmVyZW50IGlucHV0IHN0cmVhbS4KKyAqIEBwYXJhbSBpbnB1dF9maWxlIEEgcmVhZGFibGUgc3RyZWFtLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVzZXQgdGhlIHN0YXJ0IGNvbmRpdGlvbiB0byBAYyBJTklUSUFMIC4KKyAqLworICAgIHZvaWQgemNvbmZyZXN0YXJ0ICAoRklMRSAqIGlucHV0X2ZpbGUgKQoreworCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7CisgICAgICAgIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KKyAgICAgICAgICAgIHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOworCX0KKworCXpjb25mX2luaXRfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSLGlucHV0X2ZpbGUgKTsKKwl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKK30KKworLyoqIFN3aXRjaCB0byBhIGRpZmZlcmVudCBpbnB1dCBidWZmZXIuCisgKiBAcGFyYW0gbmV3X2J1ZmZlciBUaGUgbmV3IGlucHV0IGJ1ZmZlci4KKyAqCisgKi8KKyAgICB2b2lkIHpjb25mX3N3aXRjaF90b19idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIG5ld19idWZmZXIgKQoreworCisJLyogVE9ETy4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGlzIGVudGlyZSBmdW5jdGlvbiBib2R5CisJICogd2l0aAorCSAqCQl6Y29uZnBvcF9idWZmZXJfc3RhdGUoKTsKKwkgKgkJemNvbmZwdXNoX2J1ZmZlcl9zdGF0ZShuZXdfYnVmZmVyKTsKKyAgICAgKi8KKwl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiA9PSBuZXdfYnVmZmVyICkKKwkJcmV0dXJuOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOworCQl9CisKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOworCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCisJLyogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIHdlIGRpZCB0aGlzIHN3aXRjaCBkdXJpbmcKKwkgKiBFT0YgKHpjb25md3JhcCgpKSBwcm9jZXNzaW5nLCBidXQgdGhlIG9ubHkgdGltZSB0aGlzIGZsYWcKKwkgKiBpcyBsb29rZWQgYXQgaXMgYWZ0ZXIgemNvbmZ3cmFwKCkgaXMgY2FsbGVkLCBzbyBpdCdzIHNhZmUKKwkgKiB0byBnbyBhaGVhZCBhbmQgYWx3YXlzIHNldCBpdC4KKwkgKi8KKwkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2xvYWRfYnVmZmVyX3N0YXRlICAodm9pZCkKK3sKKyAgICAJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOworCSh5eXRleHRfcHRyKSA9ICh5eV9jX2J1Zl9wKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvczsKKwl6Y29uZmluID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlOworCSh5eV9ob2xkX2NoYXIpID0gKih5eV9jX2J1Zl9wKTsKK30KKworLyoqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGlucHV0IGJ1ZmZlciBzdGF0ZS4KKyAqIEBwYXJhbSBmaWxlIEEgcmVhZGFibGUgc3RyZWFtLgorICogQHBhcmFtIHNpemUgVGhlIGNoYXJhY3RlciBidWZmZXIgc2l6ZSBpbiBieXRlcy4gV2hlbiBpbiBkb3VidCwgdXNlIEBjIFlZX0JVRl9TSVpFLgorICoKKyAqIEByZXR1cm4gdGhlIGFsbG9jYXRlZCBidWZmZXIgc3RhdGUuCisgKi8KKyAgICBZWV9CVUZGRVJfU1RBVEUgemNvbmZfY3JlYXRlX2J1ZmZlciAgKEZJTEUgKiBmaWxlLCBpbnQgIHNpemUgKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHpjb25mYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9jcmVhdGVfYnVmZmVyKCkiICk7CisKKwliLT55eV9idWZfc2l6ZSA9IHNpemU7CisKKwkvKiB5eV9jaF9idWYgaGFzIHRvIGJlIDIgY2hhcmFjdGVycyBsb25nZXIgdGhhbiB0aGUgc2l6ZSBnaXZlbiBiZWNhdXNlCisJICogd2UgbmVlZCB0byBwdXQgaW4gMiBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuCisJICovCisJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikgemNvbmZhbGxvYyhiLT55eV9idWZfc2l6ZSArIDIgICk7CisJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX2NyZWF0ZV9idWZmZXIoKSIgKTsKKworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJemNvbmZfaW5pdF9idWZmZXIoYixmaWxlICk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqIERlc3Ryb3kgdGhlIGJ1ZmZlci4KKyAqIEBwYXJhbSBiIGEgYnVmZmVyIGNyZWF0ZWQgd2l0aCB6Y29uZl9jcmVhdGVfYnVmZmVyKCkKKyAqCisgKi8KKyAgICB2b2lkIHpjb25mX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiApCit7CisKKwlpZiAoICEgYiApCisJCXJldHVybjsKKworCWlmICggYiA9PSBZWV9DVVJSRU5UX0JVRkZFUiApIC8qIE5vdCBzdXJlIGlmIHdlIHNob3VsZCBwb3AgaGVyZS4gKi8KKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gKFlZX0JVRkZFUl9TVEFURSkgMDsKKworCWlmICggYi0+eXlfaXNfb3VyX2J1ZmZlciApCisJCXpjb25mZnJlZSgodm9pZCAqKSBiLT55eV9jaF9idWYgICk7CisKKwl6Y29uZmZyZWUoKHZvaWQgKikgYiAgKTsKK30KKworLyogSW5pdGlhbGl6ZXMgb3IgcmVpbml0aWFsaXplcyBhIGJ1ZmZlci4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgc29tZXRpbWVzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBidWZmZXIsCisgKiBzdWNoIGFzIGR1cmluZyBhIHpjb25mcmVzdGFydCgpIG9yIGF0IEVPRi4KKyAqLworICAgIHN0YXRpYyB2b2lkIHpjb25mX2luaXRfYnVmZmVyICAoWVlfQlVGRkVSX1NUQVRFICBiLCBGSUxFICogZmlsZSApCisKK3sKKwlpbnQgb2Vycm5vID0gZXJybm87CisKKwl6Y29uZl9mbHVzaF9idWZmZXIoYiApOworCisJYi0+eXlfaW5wdXRfZmlsZSA9IGZpbGU7CisJYi0+eXlfZmlsbF9idWZmZXIgPSAxOworCisgICAgLyogSWYgYiBpcyB0aGUgY3VycmVudCBidWZmZXIsIHRoZW4gemNvbmZfaW5pdF9idWZmZXIgd2FzIF9wcm9iYWJseV8KKyAgICAgKiBjYWxsZWQgZnJvbSB6Y29uZnJlc3RhcnQoKSBvciB0aHJvdWdoIHl5X2dldF9uZXh0X2J1ZmZlci4KKyAgICAgKiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIGxpbmVubyBvciBjb2x1bW4uCisgICAgICovCisgICAgaWYgKGIgIT0gWVlfQ1VSUkVOVF9CVUZGRVIpeworICAgICAgICBiLT55eV9ic19saW5lbm8gPSAxOworICAgICAgICBiLT55eV9ic19jb2x1bW4gPSAwOworICAgIH0KKworICAgICAgICBiLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7CisKKwllcnJubyA9IG9lcnJubzsKK30KKworLyoqIERpc2NhcmQgYWxsIGJ1ZmZlcmVkIGNoYXJhY3RlcnMuIE9uIHRoZSBuZXh0IHNjYW4sIFlZX0lOUFVUIHdpbGwgYmUgY2FsbGVkLgorICogQHBhcmFtIGIgdGhlIGJ1ZmZlciBzdGF0ZSB0byBiZSBmbHVzaGVkLCB1c3VhbGx5IEBjIFlZX0NVUlJFTlRfQlVGRkVSLgorICoKKyAqLworICAgIHZvaWQgemNvbmZfZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgKQoreworICAgIAlpZiAoICEgYiApCisJCXJldHVybjsKKworCWItPnl5X25fY2hhcnMgPSAwOworCisJLyogV2UgYWx3YXlzIG5lZWQgdHdvIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4gIFRoZSBmaXJzdCBjYXVzZXMKKwkgKiBhIHRyYW5zaXRpb24gdG8gdGhlIGVuZC1vZi1idWZmZXIgc3RhdGUuICBUaGUgc2Vjb25kIGNhdXNlcworCSAqIGEgamFtIGluIHRoYXQgc3RhdGUuCisJICovCisJYi0+eXlfY2hfYnVmWzBdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCWItPnl5X2NoX2J1ZlsxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCWItPnl5X2J1Zl9wb3MgPSAmYi0+eXlfY2hfYnVmWzBdOworCisJYi0+eXlfYXRfYm9sID0gMTsKKwliLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKKworCWlmICggYiA9PSBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworfQorCisvKiogUHVzaGVzIHRoZSBuZXcgc3RhdGUgb250byB0aGUgc3RhY2suIFRoZSBuZXcgc3RhdGUgYmVjb21lcworICogIHRoZSBjdXJyZW50IHN0YXRlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlIHN0YWNrCisgKiAgaWYgbmVjZXNzYXJ5LgorICogIEBwYXJhbSBuZXdfYnVmZmVyIFRoZSBuZXcgc3RhdGUuCisgKgorICovCit2b2lkIHpjb25mcHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICkKK3sKKyAgICAJaWYgKG5ld19idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrKCk7CisKKwkvKiBUaGlzIGJsb2NrIGlzIGNvcGllZCBmcm9tIHpjb25mX3N3aXRjaF90b19idWZmZXIuICovCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOworCQl9CisKKwkvKiBPbmx5IHB1c2ggaWYgdG9wIGV4aXN0cy4gT3RoZXJ3aXNlLCByZXBsYWNlIHRvcC4gKi8KKwlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpCisJCSh5eV9idWZmZXJfc3RhY2tfdG9wKSsrOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7CisKKwkvKiBjb3BpZWQgZnJvbSB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyLiAqLworCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKK30KKworLyoqIFJlbW92ZXMgYW5kIGRlbGV0ZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGlmIHByZXNlbnQuCisgKiAgVGhlIG5leHQgZWxlbWVudCBiZWNvbWVzIHRoZSBuZXcgdG9wLgorICoKKyAqLwordm9pZCB6Y29uZnBvcF9idWZmZXJfc3RhdGUgKHZvaWQpCit7CisgICAgCWlmICghWVlfQ1VSUkVOVF9CVUZGRVIpCisJCXJldHVybjsKKworCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgKTsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBOVUxMOworCWlmICgoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPiAwKQorCQktLSh5eV9idWZmZXJfc3RhY2tfdG9wKTsKKworCWlmIChZWV9DVVJSRU5UX0JVRkZFUikgeworCQl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworCX0KK30KKworLyogQWxsb2NhdGVzIHRoZSBzdGFjayBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAqICBHdWFyYW50ZWVzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgcHVzaC4KKyAqLworc3RhdGljIHZvaWQgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICh2b2lkKQoreworCWludCBudW1fdG9fYWxsb2M7CisKKwlpZiAoISh5eV9idWZmZXJfc3RhY2spKSB7CisKKwkJLyogRmlyc3QgYWxsb2NhdGlvbiBpcyBqdXN0IGZvciAyIGVsZW1lbnRzLCBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMKKwkJICogc2Nhbm5lciB3aWxsIGV2ZW4gbmVlZCBhIHN0YWNrLiBXZSB1c2UgMiBpbnN0ZWFkIG9mIDEgdG8gYXZvaWQgYW4KKwkJICogaW1tZWRpYXRlIHJlYWxsb2Mgb24gdGhlIG5leHQgY2FsbC4KKyAgICAgICAgICovCisJCW51bV90b19hbGxvYyA9IDE7CisJCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil6Y29uZmFsbG9jCisJCQkJCQkJCShudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCisJCQkJCQkJCSk7CisKKwkJbWVtc2V0KCh5eV9idWZmZXJfc3RhY2spLCAwLCBudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKKworCQkoeXlfYnVmZmVyX3N0YWNrX21heCkgPSBudW1fdG9fYWxsb2M7CisJCSh5eV9idWZmZXJfc3RhY2tfdG9wKSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHl5X2J1ZmZlcl9zdGFja190b3ApID49ICgoeXlfYnVmZmVyX3N0YWNrX21heCkpIC0gMSl7CisKKwkJLyogSW5jcmVhc2UgdGhlIGJ1ZmZlciB0byBwcmVwYXJlIGZvciBhIHBvc3NpYmxlIHB1c2guICovCisJCWludCBncm93X3NpemUgPSA4IC8qIGFyYml0cmFyeSBncm93IHNpemUgKi87CisKKwkJbnVtX3RvX2FsbG9jID0gKHl5X2J1ZmZlcl9zdGFja19tYXgpICsgZ3Jvd19zaXplOworCQkoeXlfYnVmZmVyX3N0YWNrKSA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopemNvbmZyZWFsbG9jCisJCQkJCQkJCSgoeXlfYnVmZmVyX3N0YWNrKSwKKwkJCQkJCQkJbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQorCQkJCQkJCQkpOworCisJCS8qIHplcm8gb25seSB0aGUgbmV3IHNsb3RzLiovCisJCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSArICh5eV9idWZmZXJfc3RhY2tfbWF4KSwgMCwgZ3Jvd19zaXplICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisJCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKKwl9Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gZGlyZWN0bHkgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNoYXJhY3RlciBidWZmZXIuCisgKiBAcGFyYW0gYmFzZSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgorICogQHBhcmFtIHNpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNoYXJhY3RlciBidWZmZXIKKyAqCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnVmZmVyICAoY2hhciAqIGJhc2UsIHl5X3NpemVfdCAgc2l6ZSApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisKKwlpZiAoIHNpemUgPCAyIHx8CisJICAgICBiYXNlW3NpemUtMl0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSIHx8CisJICAgICBiYXNlW3NpemUtMV0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKKwkJLyogVGhleSBmb3Jnb3QgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIEVPQidzLiAqLworCQlyZXR1cm4gMDsKKworCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB6Y29uZmFsbG9jKHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfc2Nhbl9idWZmZXIoKSIgKTsKKworCWItPnl5X2J1Zl9zaXplID0gc2l6ZSAtIDI7CS8qICItIDIiIHRvIHRha2UgY2FyZSBvZiBFT0IncyAqLworCWItPnl5X2J1Zl9wb3MgPSBiLT55eV9jaF9idWYgPSBiYXNlOworCWItPnl5X2lzX291cl9idWZmZXIgPSAwOworCWItPnl5X2lucHV0X2ZpbGUgPSAwOworCWItPnl5X25fY2hhcnMgPSBiLT55eV9idWZfc2l6ZTsKKwliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7CisJYi0+eXlfYXRfYm9sID0gMTsKKwliLT55eV9maWxsX2J1ZmZlciA9IDA7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKGIgICk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiBhIHN0cmluZy4gVGhlIG5leHQgY2FsbCB0byB6Y29uZmxleCgpIHdpbGwKKyAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgc3RyLgorICogQHBhcmFtIHl5X3N0ciBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byBzY2FuCisgKgorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCisgKiBAbm90ZSBJZiB5b3Ugd2FudCB0byBzY2FuIGJ5dGVzIHRoYXQgbWF5IGNvbnRhaW4gTlVMIHZhbHVlcywgdGhlbiB1c2UKKyAqICAgICAgIHpjb25mX3NjYW5fYnl0ZXMoKSBpbnN0ZWFkLgorICovCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9zdHJpbmcgKHl5Y29uc3QgY2hhciAqIHl5X3N0ciApCit7CisKKwlyZXR1cm4gemNvbmZfc2Nhbl9ieXRlcyh5eV9zdHIsc3RybGVuKHl5X3N0cikgKTsKK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiB0aGUgZ2l2ZW4gYnl0ZXMuIFRoZSBuZXh0IGNhbGwgdG8gemNvbmZsZXgoKSB3aWxsCisgKiBzY2FuIGZyb20gYSBAZSBjb3B5IG9mIEBhIGJ5dGVzLgorICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlIGJ1ZmZlciB0byBzY2FuCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBhIGJ5dGVzLgorICoKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICovCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9ieXRlcyAgKHl5Y29uc3QgY2hhciAqIGJ5dGVzLCBpbnQgIGxlbiApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisJY2hhciAqYnVmOworCXl5X3NpemVfdCBuOworCWludCBpOworCisJLyogR2V0IG1lbW9yeSBmb3IgZnVsbCBidWZmZXIsIGluY2x1ZGluZyBzcGFjZSBmb3IgdHJhaWxpbmcgRU9CJ3MuICovCisJbiA9IGxlbiArIDI7CisJYnVmID0gKGNoYXIgKikgemNvbmZhbGxvYyhuICApOworCWlmICggISBidWYgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9zY2FuX2J5dGVzKCkiICk7CisKKwlmb3IgKCBpID0gMDsgaSA8IGxlbjsgKytpICkKKwkJYnVmW2ldID0gYnl0ZXNbaV07CisKKwlidWZbbGVuXSA9IGJ1ZltsZW4rMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliID0gemNvbmZfc2Nhbl9idWZmZXIoYnVmLG4gKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAiYmFkIGJ1ZmZlciBpbiB6Y29uZl9zY2FuX2J5dGVzKCkiICk7CisKKwkvKiBJdCdzIG9rYXkgdG8gZ3JvdyBldGMuIHRoaXMgYnVmZmVyLCBhbmQgd2Ugc2hvdWxkIHRocm93IGl0CisJICogYXdheSB3aGVuIHdlJ3JlIGRvbmUuCisJICovCisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CisKKwlyZXR1cm4gYjsKK30KKworI2lmbmRlZiBZWV9FWElUX0ZBSUxVUkUKKyNkZWZpbmUgWVlfRVhJVF9GQUlMVVJFIDIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB5eV9mYXRhbF9lcnJvciAoeXljb25zdCBjaGFyKiBtc2cgKQoreworICAgIAkodm9pZCkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZyApOworCWV4aXQoIFlZX0VYSVRfRkFJTFVSRSApOworfQorCisvKiBSZWRlZmluZSB5eWxlc3MoKSBzbyBpdCB3b3JrcyBpbiBzZWN0aW9uIDMgY29kZS4gKi8KKworI3VuZGVmIHl5bGVzcworI2RlZmluZSB5eWxlc3MobikgXAorCWRvIFwKKwkJeyBcCisJCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dC4gKi8gXAorICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAorICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCisJCXpjb25mdGV4dFt6Y29uZmxlbmddID0gKHl5X2hvbGRfY2hhcik7IFwKKwkJKHl5X2NfYnVmX3ApID0gemNvbmZ0ZXh0ICsgeXlsZXNzX21hY3JvX2FyZzsgXAorCQkoeXlfaG9sZF9jaGFyKSA9ICooeXlfY19idWZfcCk7IFwKKwkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7IFwKKwkJemNvbmZsZW5nID0geXlsZXNzX21hY3JvX2FyZzsgXAorCQl9IFwKKwl3aGlsZSAoIDAgKQorCisvKiBBY2Nlc3NvciAgbWV0aG9kcyAoZ2V0L3NldCBmdW5jdGlvbnMpIHRvIHN0cnVjdCBtZW1iZXJzLiAqLworCisvKiogR2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICoKKyAqLworaW50IHpjb25mZ2V0X2xpbmVubyAgKHZvaWQpCit7CisKKyAgICByZXR1cm4gemNvbmZsaW5lbm87Cit9CisKKy8qKiBHZXQgdGhlIGlucHV0IHN0cmVhbS4KKyAqCisgKi8KK0ZJTEUgKnpjb25mZ2V0X2luICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25maW47Cit9CisKKy8qKiBHZXQgdGhlIG91dHB1dCBzdHJlYW0uCisgKgorICovCitGSUxFICp6Y29uZmdldF9vdXQgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZvdXQ7Cit9CisKKy8qKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCB0b2tlbi4KKyAqCisgKi8KK2ludCB6Y29uZmdldF9sZW5nICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mbGVuZzsKK30KKworLyoqIEdldCB0aGUgY3VycmVudCB0b2tlbi4KKyAqCisgKi8KKworY2hhciAqemNvbmZnZXRfdGV4dCAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZnRleHQ7Cit9CisKKy8qKiBTZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiBAcGFyYW0gbGluZV9udW1iZXIKKyAqCisgKi8KK3ZvaWQgemNvbmZzZXRfbGluZW5vIChpbnQgIGxpbmVfbnVtYmVyICkKK3sKKworICAgIHpjb25mbGluZW5vID0gbGluZV9udW1iZXI7Cit9CisKKy8qKiBTZXQgdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBkb2VzIG5vdCBkaXNjYXJkIHRoZSBjdXJyZW50CisgKiBpbnB1dCBidWZmZXIuCisgKiBAcGFyYW0gaW5fc3RyIEEgcmVhZGFibGUgc3RyZWFtLgorICoKKyAqIEBzZWUgemNvbmZfc3dpdGNoX3RvX2J1ZmZlcgorICovCit2b2lkIHpjb25mc2V0X2luIChGSUxFICogIGluX3N0ciApCit7CisgICAgICAgIHpjb25maW4gPSBpbl9zdHIgOworfQorCit2b2lkIHpjb25mc2V0X291dCAoRklMRSAqICBvdXRfc3RyICkKK3sKKyAgICAgICAgemNvbmZvdXQgPSBvdXRfc3RyIDsKK30KKworaW50IHpjb25mZ2V0X2RlYnVnICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mX2ZsZXhfZGVidWc7Cit9CisKK3ZvaWQgemNvbmZzZXRfZGVidWcgKGludCAgYmRlYnVnICkKK3sKKyAgICAgICAgemNvbmZfZmxleF9kZWJ1ZyA9IGJkZWJ1ZyA7Cit9CisKKy8qIHpjb25mbGV4X2Rlc3Ryb3kgaXMgZm9yIGJvdGggcmVlbnRyYW50IGFuZCBub24tcmVlbnRyYW50IHNjYW5uZXJzLiAqLworaW50IHpjb25mbGV4X2Rlc3Ryb3kgICh2b2lkKQoreworCisgICAgLyogUG9wIHRoZSBidWZmZXIgc3RhY2ssIGRlc3Ryb3lpbmcgZWFjaCBlbGVtZW50LiAqLworCXdoaWxlKFlZX0NVUlJFTlRfQlVGRkVSKXsKKwkJemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiAgKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKKwkJemNvbmZwb3BfYnVmZmVyX3N0YXRlKCk7CisJfQorCisJLyogRGVzdHJveSB0aGUgc3RhY2sgaXRzZWxmLiAqLworCXpjb25mZnJlZSgoeXlfYnVmZmVyX3N0YWNrKSApOworCSh5eV9idWZmZXJfc3RhY2spID0gTlVMTDsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogSW50ZXJuYWwgdXRpbGl0eSByb3V0aW5lcy4KKyAqLworCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciogczEsIHl5Y29uc3QgY2hhciAqIHMyLCBpbnQgbiApCit7CisJcmVnaXN0ZXIgaW50IGk7CisgICAgCWZvciAoIGkgPSAwOyBpIDwgbjsgKytpICkKKwkJczFbaV0gPSBzMltpXTsKK30KKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqIHMgKQoreworCXJlZ2lzdGVyIGludCBuOworICAgIAlmb3IgKCBuID0gMDsgc1tuXTsgKytuICkKKwkJOworCisJcmV0dXJuIG47Cit9CisjZW5kaWYKKwordm9pZCAqemNvbmZhbGxvYyAoeXlfc2l6ZV90ICBzaXplICkKK3sKKwlyZXR1cm4gKHZvaWQgKikgbWFsbG9jKCBzaXplICk7Cit9CisKK3ZvaWQgKnpjb25mcmVhbGxvYyAgKHZvaWQgKiBwdHIsIHl5X3NpemVfdCAgc2l6ZSApCit7CisJLyogVGhlIGNhc3QgdG8gKGNoYXIgKikgaW4gdGhlIGZvbGxvd2luZyBhY2NvbW1vZGF0ZXMgYm90aAorCSAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSBjaGFyKiBnZW5lcmljIHBvaW50ZXJzLCBhbmQgdGhvc2UKKwkgKiB0aGF0IHVzZSB2b2lkKiBnZW5lcmljIHBvaW50ZXJzLiAgSXQgd29ya3Mgd2l0aCB0aGUgbGF0dGVyCisJICogYmVjYXVzZSBib3RoIEFOU0kgQyBhbmQgQysrIGFsbG93IGNhc3RsZXNzIGFzc2lnbm1lbnQgZnJvbQorCSAqIGFueSBwb2ludGVyIHR5cGUgdG8gdm9pZCosIGFuZCBkZWFsIHdpdGggYXJndW1lbnQgY29udmVyc2lvbnMKKwkgKiBhcyB0aG91Z2ggZG9pbmcgYW4gYXNzaWdubWVudC4KKwkgKi8KKwlyZXR1cm4gKHZvaWQgKikgcmVhbGxvYyggKGNoYXIgKikgcHRyLCBzaXplICk7Cit9CisKK3ZvaWQgemNvbmZmcmVlICh2b2lkICogcHRyICkKK3sKKwlmcmVlKCAoY2hhciAqKSBwdHIgKTsJLyogc2VlIHpjb25mcmVhbGxvYygpIGZvciAoY2hhciAqKSBjYXN0ICovCit9CisKKyNkZWZpbmUgWVlUQUJMRVNfTkFNRSAieXl0YWJsZXMiCisKKyN1bmRlZiBZWV9ORVdfRklMRQorI3VuZGVmIFlZX0ZMVVNIX0JVRkZFUgorI3VuZGVmIHl5X3NldF9ib2wKKyN1bmRlZiB5eV9uZXdfYnVmZmVyCisjdW5kZWYgeXlfc2V0X2ludGVyYWN0aXZlCisjdW5kZWYgeXl0ZXh0X3B0cgorI3VuZGVmIFlZX0RPX0JFRk9SRV9BQ1RJT04KKworI2lmZGVmIFlZX0RFQ0xfSVNfT1VSUworI3VuZGVmIFlZX0RFQ0xfSVNfT1VSUworI3VuZGVmIFlZX0RFQ0wKKyNlbmRpZgorCit2b2lkIHpjb25mX3N0YXJ0aGVscCh2b2lkKQoreworCW5ld19zdHJpbmcoKTsKKwlsYXN0X3RzID0gZmlyc3RfdHMgPSAwOworCUJFR0lOKEhFTFApOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9lbmRoZWxwKHZvaWQpCit7CisJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJQkVHSU4oSU5JVElBTCk7Cit9CisKKy8qCisgKiBUcnkgdG8gb3BlbiBzcGVjaWZpZWQgZmlsZSB3aXRoIGZvbGxvd2luZyBuYW1lczoKKyAqIC4vbmFtZQorICogJChzcmN0cmVlKS9uYW1lCisgKiBUaGUgbGF0dGVyIGlzIHVzZWQgd2hlbiBzcmN0cmVlIGlzIHNlcGFyYXRlIGZyb20gb2JqdHJlZQorICogd2hlbiBjb21waWxpbmcgdGhlIGtlcm5lbC4KKyAqIFJldHVybiBOVUxMIGlmIGZpbGUgaXMgbm90IGZvdW5kLgorICovCitGSUxFICp6Y29uZl9mb3Blbihjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmVudjsKKwlGSUxFICpmOworCisJZiA9IGZvcGVuKG5hbWUsICJyIik7CisJaWYgKCFmICYmIG5hbWVbMF0gIT0gJy8nKSB7CisJCWVudiA9IGdldGVudihTUkNUUkVFKTsKKwkJaWYgKGVudikgeworCQkJY2hhciAqZnVsbG5hbWUgPSBhbGxvY2Eoc3RybGVuKGVudikgKyBzdHJsZW4obmFtZSkgKyAyKTsKKwkJCXNwcmludGYoZnVsbG5hbWUsICIlcy8lcyIsIGVudiwgbmFtZSk7CisJCQlmID0gZm9wZW4oZnVsbG5hbWUsICJyIik7CisJCX0KKwl9CisJcmV0dXJuIGY7Cit9CisKK3ZvaWQgemNvbmZfaW5pdHNjYW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwl6Y29uZmluID0gemNvbmZfZm9wZW4obmFtZSk7CisJaWYgKCF6Y29uZmluKSB7CisJCXByaW50ZigiY2FuJ3QgZmluZCBmaWxlICVzXG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwljdXJyZW50X2J1ZiA9IG1hbGxvYyhzaXplb2YoKmN1cnJlbnRfYnVmKSk7CisJbWVtc2V0KGN1cnJlbnRfYnVmLCAwLCBzaXplb2YoKmN1cnJlbnRfYnVmKSk7CisKKwljdXJyZW50X2ZpbGUgPSBmaWxlX2xvb2t1cChuYW1lKTsKKwljdXJyZW50X2ZpbGUtPmxpbmVubyA9IDE7CisJY3VycmVudF9maWxlLT5mbGFncyA9IEZJTEVfQlVTWTsKK30KKwordm9pZCB6Y29uZl9uZXh0ZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJc3RydWN0IGJ1ZmZlciAqYnVmID0gbWFsbG9jKHNpemVvZigqYnVmKSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKworCWN1cnJlbnRfYnVmLT5zdGF0ZSA9IFlZX0NVUlJFTlRfQlVGRkVSOworCXpjb25maW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwlpZiAoIXpjb25maW4pIHsKKwkJcHJpbnRmKCIlczolZDogY2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCXpjb25mX3N3aXRjaF90b19idWZmZXIoemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFKSk7CisJYnVmLT5wYXJlbnQgPSBjdXJyZW50X2J1ZjsKKwljdXJyZW50X2J1ZiA9IGJ1ZjsKKworCWlmIChmaWxlLT5mbGFncyAmIEZJTEVfQlVTWSkgeworCQlwcmludGYoInJlY3Vyc2l2ZSBzY2FuICglcyk/XG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKGZpbGUtPmZsYWdzICYgRklMRV9TQ0FOTkVEKSB7CisJCXByaW50ZigiZmlsZSAlcyBhbHJlYWR5IHNjYW5uZWQ/XG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJZmlsZS0+ZmxhZ3MgfD0gRklMRV9CVVNZOworCWZpbGUtPmxpbmVubyA9IDE7CisJZmlsZS0+cGFyZW50ID0gY3VycmVudF9maWxlOworCWN1cnJlbnRfZmlsZSA9IGZpbGU7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGZpbGUodm9pZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpwYXJlbnQ7CisKKwljdXJyZW50X2ZpbGUtPmZsYWdzIHw9IEZJTEVfU0NBTk5FRDsKKwljdXJyZW50X2ZpbGUtPmZsYWdzICY9IH5GSUxFX0JVU1k7CisJY3VycmVudF9maWxlID0gY3VycmVudF9maWxlLT5wYXJlbnQ7CisKKwlwYXJlbnQgPSBjdXJyZW50X2J1Zi0+cGFyZW50OworCWlmIChwYXJlbnQpIHsKKwkJZmNsb3NlKHpjb25maW4pOworCQl6Y29uZl9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSKTsKKwkJemNvbmZfc3dpdGNoX3RvX2J1ZmZlcihwYXJlbnQtPnN0YXRlKTsKKwl9CisJZnJlZShjdXJyZW50X2J1Zik7CisJY3VycmVudF9idWYgPSBwYXJlbnQ7Cit9CisKK2ludCB6Y29uZl9saW5lbm8odm9pZCkKK3sKKwlyZXR1cm4gY3VycmVudF9wb3MubGluZW5vOworfQorCitjaGFyICp6Y29uZl9jdXJuYW1lKHZvaWQpCit7CisJcmV0dXJuIGN1cnJlbnRfcG9zLmZpbGUgPyBjdXJyZW50X3Bvcy5maWxlLT5uYW1lIDogIjxub25lPiI7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbGtjLmggYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbGtjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3ZjYwYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9sa2MuaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpZm5kZWYgTEtDX0gKKyNkZWZpbmUgTEtDX0gKKworI2luY2x1ZGUgImV4cHIuaCIKKworI2lmbmRlZiBLQlVJTERfTk9fTkxTCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoKGNvbnN0IGNoYXIgKikgKE1zZ2lkKSkKKyMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgKChjb25zdCBjaGFyICopIChEb21haW5uYW1lKSkKKyMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpICgoY29uc3QgY2hhciAqKSAoRGlybmFtZSkpCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgTEtDX0RJUkVDVF9MSU5LCisjZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJZXh0ZXJuIHR5cGUgbmFtZSBhcmcKKyNlbHNlCisjaW5jbHVkZSAibGtjX2RlZnMuaCIKKyNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQlleHRlcm4gdHlwZSAoKm5hbWUgIyMgX3ApIGFyZworI2VuZGlmCisjaW5jbHVkZSAibGtjX3Byb3RvLmgiCisjdW5kZWYgUAorCisjZGVmaW5lIFNSQ1RSRUUgInNyY3RyZWUiCisKKyNkZWZpbmUgUEFDS0FHRSAibGludXgiCisjZGVmaW5lIExPQ0FMRURJUiAiL3Vzci9zaGFyZS9sb2NhbGUiCisKKyNkZWZpbmUgXyh0ZXh0KSBnZXR0ZXh0KHRleHQpCisjZGVmaW5lIE5fKHRleHQpICh0ZXh0KQorCisKKyNkZWZpbmUgVEZfQ09NTUFORAkweDAwMDEKKyNkZWZpbmUgVEZfUEFSQU0JMHgwMDAyCisKK3N0cnVjdCBrY29uZl9pZCB7CisJaW50IG5hbWU7CisJaW50IHRva2VuOworCXVuc2lnbmVkIGludCBmbGFnczsKKwllbnVtIHN5bWJvbF90eXBlIHN0eXBlOworfTsKKworaW50IHpjb25mcGFyc2Uodm9pZCk7Cit2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpOworCitleHRlcm4gaW50IHpjb25mZGVidWc7Cit2b2lkIHpjb25mX3N0YXJ0aGVscCh2b2lkKTsKK0ZJTEUgKnpjb25mX2ZvcGVuKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCB6Y29uZl9pbml0c2Nhbihjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgemNvbmZfbmV4dGZpbGUoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgemNvbmZfbGluZW5vKHZvaWQpOworY2hhciAqemNvbmZfY3VybmFtZSh2b2lkKTsKKworLyogY29uZmRhdGEuYyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgY29uZl9kZWZfZmlsZW5hbWVbXTsKKworY2hhciAqY29uZl9nZXRfZGVmYXVsdF9jb25mbmFtZSh2b2lkKTsKKworLyoga2NvbmZpZ19sb2FkLmMgKi8KK3ZvaWQga2NvbmZpZ19sb2FkKHZvaWQpOworCisvKiBtZW51LmMgKi8KK3ZvaWQgbWVudV9pbml0KHZvaWQpOworc3RydWN0IG1lbnUgKm1lbnVfYWRkX21lbnUodm9pZCk7Cit2b2lkIG1lbnVfZW5kX21lbnUodm9pZCk7Cit2b2lkIG1lbnVfYWRkX2VudHJ5KHN0cnVjdCBzeW1ib2wgKnN5bSk7Cit2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpOwordm9pZCBtZW51X2FkZF9kZXAoc3RydWN0IGV4cHIgKmRlcCk7CitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb3AoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCk7CitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApOwordm9pZCBtZW51X2FkZF9leHByKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKTsKK3ZvaWQgbWVudV9hZGRfc3ltYm9sKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IGV4cHIgKmRlcCk7Cit2b2lkIG1lbnVfZmluYWxpemUoc3RydWN0IG1lbnUgKnBhcmVudCk7Cit2b2lkIG1lbnVfc2V0X3R5cGUoaW50IHR5cGUpOworCisvKiB1dGlsLmMgKi8KK3N0cnVjdCBmaWxlICpmaWxlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBmaWxlX3dyaXRlX2RlcChjb25zdCBjaGFyICpuYW1lKTsKKworc3RydWN0IGdzdHIgeworCXNpemVfdCBsZW47CisJY2hhciAgKnM7Cit9Oworc3RydWN0IGdzdHIgc3RyX25ldyh2b2lkKTsKK3N0cnVjdCBnc3RyIHN0cl9hc3NpZ24oY29uc3QgY2hhciAqcyk7Cit2b2lkIHN0cl9mcmVlKHN0cnVjdCBnc3RyICpncyk7Cit2b2lkIHN0cl9hcHBlbmQoc3RydWN0IGdzdHIgKmdzLCBjb25zdCBjaGFyICpzKTsKK3ZvaWQgc3RyX3ByaW50ZihzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2NvbnN0IGNoYXIgKnN0cl9nZXQoc3RydWN0IGdzdHIgKmdzKTsKKworLyogc3ltYm9sLmMgKi8KK3ZvaWQgc3ltX2luaXQodm9pZCk7Cit2b2lkIHN5bV9jbGVhcl9hbGxfdmFsaWQodm9pZCk7Cit2b2lkIHN5bV9zZXRfY2hhbmdlZChzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBwcm9wZXJ0eSAqcHJvcF9hbGxvYyhlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHN5bWJvbCAqcHJvcF9nZXRfc3ltYm9sKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCk7CisKK3N0YXRpYyBpbmxpbmUgdHJpc3RhdGUgc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+Y3Vyci50cmk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3ltYm9sICpzeW1fZ2V0X2Nob2ljZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIChzdHJ1Y3Qgc3ltYm9sICopc3ltLT5jdXJyLnZhbDsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9zZXRfY2hvaWNlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKmNoLCBzdHJ1Y3Qgc3ltYm9sICpjaHZhbCkKK3sKKwlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShjaHZhbCwgeWVzKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19jaG9pY2Uoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19jaG9pY2VfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRVZBTCA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19vcHRpb25hbChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfT1BUSU9OQUwgPyB0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzeW1faGFzX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5mbGFncyAmIFNZTUJPTF9ORVcgPyBmYWxzZSA6IHRydWU7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMS0NfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTM4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKQEAgLTAsMCArMSw0MSBAQAorCisvKiBjb25mZGF0YS5jICovCitQKGNvbmZfcGFyc2Usdm9pZCwoY29uc3QgY2hhciAqbmFtZSkpOworUChjb25mX3JlYWQsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CitQKGNvbmZfcmVhZF9zaW1wbGUsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CitQKGNvbmZfd3JpdGUsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CisKKy8qIG1lbnUuYyAqLworUChyb290bWVudSxzdHJ1Y3QgbWVudSwpOworCitQKG1lbnVfaXNfdmlzaWJsZSxib29sLChzdHJ1Y3QgbWVudSAqbWVudSkpOworUChtZW51X2dldF9wcm9tcHQsY29uc3QgY2hhciAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOworUChtZW51X2dldF9yb290X21lbnUsc3RydWN0IG1lbnUgKiwoc3RydWN0IG1lbnUgKm1lbnUpKTsKK1AobWVudV9nZXRfcGFyZW50X21lbnUsc3RydWN0IG1lbnUgKiwoc3RydWN0IG1lbnUgKm1lbnUpKTsKKworLyogc3ltYm9sLmMgKi8KK1Aoc3ltYm9sX2hhc2gsc3RydWN0IHN5bWJvbCAqLFtTWU1CT0xfSEFTSFNJWkVdKTsKK1Aoc3ltX2NoYW5nZV9jb3VudCxpbnQsKTsKKworUChzeW1fbG9va3VwLHN0cnVjdCBzeW1ib2wgKiwoY29uc3QgY2hhciAqbmFtZSwgaW50IGlzY29uc3QpKTsKK1Aoc3ltX2ZpbmQsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lKSk7CitQKHN5bV9yZV9zZWFyY2gsc3RydWN0IHN5bWJvbCAqKiwoY29uc3QgY2hhciAqcGF0dGVybikpOworUChzeW1fdHlwZV9uYW1lLGNvbnN0IGNoYXIgKiwoZW51bSBzeW1ib2xfdHlwZSB0eXBlKSk7CitQKHN5bV9jYWxjX3ZhbHVlLHZvaWQsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fZ2V0X3R5cGUsZW51bSBzeW1ib2xfdHlwZSwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2UsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLHRyaXN0YXRlIHRyaSkpOworUChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSx0cmlzdGF0ZSB0cmkpKTsKK1Aoc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZSx0cmlzdGF0ZSwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9zdHJpbmdfdmFsaWQsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpuZXd2YWwpKTsKK1Aoc3ltX3N0cmluZ193aXRoaW5fcmFuZ2UsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpKTsKK1Aoc3ltX3NldF9zdHJpbmdfdmFsdWUsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpuZXd2YWwpKTsKK1Aoc3ltX2lzX2NoYW5nYWJsZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX2dldF9jaG9pY2VfcHJvcCxzdHJ1Y3QgcHJvcGVydHkgKiwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9nZXRfZGVmYXVsdF9wcm9wLHN0cnVjdCBwcm9wZXJ0eSAqLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX2dldF9zdHJpbmdfdmFsdWUsY29uc3QgY2hhciAqLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKKworUChwcm9wX2dldF90eXBlX25hbWUsY29uc3QgY2hhciAqLChlbnVtIHByb3BfdHlwZSB0eXBlKSk7CisKKy8qIGV4cHIuYyAqLworUChleHByX2NvbXBhcmVfdHlwZSxpbnQsKGVudW0gZXhwcl90eXBlIHQxLCBlbnVtIGV4cHJfdHlwZSB0MikpOworUChleHByX3ByaW50LHZvaWQsKHN0cnVjdCBleHByICplLCB2b2lkICgqZm4pKHZvaWQgKiwgY29uc3QgY2hhciAqKSwgdm9pZCAqZGF0YSwgaW50IHByZXZ0b2tlbikpOwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL0JJRy5GQVQuV0FSTklORyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9CSUcuRkFULldBUk5JTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhZGI4MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9CSUcuRkFULldBUk5JTkcKQEAgLTAsMCArMSw0IEBACitUaGlzIGlzIE5PVCB0aGUgb2ZmaWNpYWwgdmVyc2lvbiBvZiBkaWFsb2cuICBUaGlzIHZlcnNpb24gaGFzIGJlZW4KK3NpZ25pZmljYW50bHkgbW9kaWZpZWQgZnJvbSB0aGUgb3JpZ2luYWwuICBJdCB3YXMgdXNlZCBieSB0aGUgTGludXgKK2tlcm5lbCBjb25maWd1cmF0aW9uIHNjcmlwdCwgYW5kIHN1YnNlcXVlbnRseSBhZGFwdGVkIGZvciBidXN5Ym94LgorUGxlYXNlIGRvIG5vdCBib3RoZXIgU2F2aW8gTGFtIHdpdGggcXVlc3Rpb25zIGFib3V0IHRoaXMgcHJvZ3JhbS4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9NYWtlZmlsZSBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzlkYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMgTWFrZWZpbGUgdG8gYnVpbGQgbHhkaWFsb2cgcGFja2FnZQorIworCitjaGVjay1seGRpYWxvZyAgOj0gJChzcmN0cmVlKS8kKHNyYykvY2hlY2stbHhkaWFsb2cuc2gKKworIyBVc2UgcmV1cnNpdmVseSBleHBhbmRlZCB2YXJpYWJsZXMgc28gd2UgZG8gbm90IGNhbGwgZ2NjIHVubGVzcworIyB3ZSByZWFsbHkgbmVlZCB0byBkbyBzby4gKERvIG5vdCBjYWxsIGdjYyBhcyBwYXJ0IG9mIG1ha2UgbXJwcm9wZXIpCitIT1NUX0VYVFJBQ0ZMQUdTID0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChjaGVjay1seGRpYWxvZykgLWNjZmxhZ3MpCitIT1NUX0xPQURMSUJFUyAgID0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChjaGVjay1seGRpYWxvZykgLWxkZmxhZ3MgJChIT1NUQ0MpKQorCitIT1NUX0VYVFJBQ0ZMQUdTICs9IC1ETE9DQUxFCisKK1BIT05ZICs9IGRvY2hlY2tseGRpYWxvZworJChvYmopL2RvY2hlY2tseGRpYWxvZzoKKwkkKFEpJChDT05GSUdfU0hFTEwpICQoY2hlY2stbHhkaWFsb2cpIC1jaGVjayAkKEhPU1RDQykgJChIT1NUX0VYVFJBQ0ZMQUdTKSAkKEhPU1RfTE9BRExJQkVTKQorCitob3N0cHJvZ3MteQk6PSBseGRpYWxvZworYWx3YXlzCQk6PSAkKGhvc3Rwcm9ncy15KSBkb2NoZWNrbHhkaWFsb2cKKworbHhkaWFsb2ctb2JqcyA6PSBjaGVja2xpc3QubyBtZW51Ym94Lm8gdGV4dGJveC5vIHllc25vLm8gaW5wdXRib3gubyBcCisJCSB1dGlsLm8gbHhkaWFsb2cubyBtc2dib3gubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrLWx4ZGlhbG9nLnNoIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrLWx4ZGlhbG9nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGRmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2stbHhkaWFsb2cuc2gKQEAgLTAsMCArMSw4NiBAQAorIyEvYmluL3NoCisjIENoZWNrIG5jdXJzZXMgY29tcGF0aWJpbGl0eQorCisjIFdoYXQgbGlicmFyeSB0byBsaW5rCitsZGZsYWdzKCkKK3sKKwlmb3IgZXh0IGluIHNvIGEgZHlsaWIgOyBkbworCQlmb3IgbGliIGluIG5jdXJzZXN3IG5jdXJzZXMgY3Vyc2VzIDsgZG8KKwkJCSRjYyAtcHJpbnQtZmlsZS1uYW1lPWxpYiR7bGlifS4ke2V4dH0gfCBncmVwIC1xIC8KKwkJCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQkJCWVjaG8gIi1sJHtsaWJ9IgorCQkJCWV4aXQKKwkJCWZpCisJCWRvbmUKKwlkb25lCisJZXhpdCAxCit9CisKKyMgV2hlcmUgaXMgbmN1cnNlcy5oPworY2NmbGFncygpCit7CisJaWYgWyAtZiAvdXNyL2luY2x1ZGUvbmN1cnNlc3cvbmN1cnNlcy5oIF07IHRoZW4KKwkJZWNobyAnLUkvdXNyL2luY2x1ZGUvbmN1cnNlc3cgLURDVVJTRVNfTE9DPSI8bmN1cnNlcy5oPiInCisJZWxpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2Vzdy9jdXJzZXMuaCBdOyB0aGVuCisJCWVjaG8gJy1JL3Vzci9pbmNsdWRlL25jdXJzZXN3IC1EQ1VSU0VTX0xPQz0iPG5jdXJzZXN3L2N1cnNlcy5oPiInCisJZWxpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzL25jdXJzZXMuaCBdOyB0aGVuCisJCWVjaG8gJy1JL3Vzci9pbmNsdWRlL25jdXJzZXMgLURDVVJTRVNfTE9DPSI8bmN1cnNlcy5oPiInCisJZWxpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzL2N1cnNlcy5oIF07IHRoZW4KKwkJZWNobyAnLUkvdXNyL2luY2x1ZGUvbmN1cnNlcyAtRENVUlNFU19MT0M9IjxuY3Vyc2VzL2N1cnNlcy5oPiInCisJZWxpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzLmggXTsgdGhlbgorCQllY2hvICctRENVUlNFU19MT0M9IjxuY3Vyc2VzLmg+IicKKwllbHNlCisJCWVjaG8gJy1EQ1VSU0VTX0xPQz0iPGN1cnNlcy5oPiInCisJZmkKK30KKworIyBUZW1wIGZpbGUsIHRyeSB0byBjbGVhbiB1cCBhZnRlciB1cwordG1wPS5seGRpYWxvZy50bXAKK3RyYXAgInJtIC1mICR0bXAiIDAgMSAyIDMgMTUKKworIyBDaGVjayBpZiB3ZSBjYW4gbGluayB0byBuY3Vyc2VzCitjaGVjaygpIHsKKyAgICAgICAgJGNjIC14YyAtIC1vICR0bXAgMj4vZGV2L251bGwgPDwnRU9GJworI2luY2x1ZGUgQ1VSU0VTX0xPQworbWFpbigpIHt9CitFT0YKKwlpZiBbICQ/ICE9IDAgXTsgdGhlbgorCSAgICBlY2hvICIgKioqIFVuYWJsZSB0byBmaW5kIHRoZSBuY3Vyc2VzIGxpYnJhcmllcyBvciB0aGUiICAgICAgIDE+JjIKKwkgICAgZWNobyAiICoqKiByZXF1aXJlZCBoZWFkZXIgZmlsZXMuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPiYyCisJICAgIGVjaG8gIiAqKiogJ21ha2UgbWVudWNvbmZpZycgcmVxdWlyZXMgdGhlIG5jdXJzZXMgbGlicmFyaWVzLiIgMT4mMgorCSAgICBlY2hvICIgKioqICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+JjIKKwkgICAgZWNobyAiICoqKiBJbnN0YWxsIG5jdXJzZXMgKG5jdXJzZXMtZGV2ZWwpIGFuZCB0cnkgYWdhaW4uIiAgICAxPiYyCisJICAgIGVjaG8gIiAqKiogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT4mMgorCSAgICBleGl0IDEKKwlmaQorfQorCit1c2FnZSgpIHsKKwlwcmludGYgIlVzYWdlOiAkMCBbLWNoZWNrIGNvbXBpbGVyIG9wdGlvbnN8LWNjZmxhZ3N8LWxkZmxhZ3MgY29tcGlsZXIgb3B0aW9uc11cbiIKK30KKworaWYgWyAkIyAtZXEgMCBdOyB0aGVuCisJdXNhZ2UKKwlleGl0IDEKK2ZpCisKK2NjPSIiCitjYXNlICIkMSIgaW4KKwkiLWNoZWNrIikKKwkJc2hpZnQKKwkJY2M9IiRAIgorCQljaGVjaworCQk7OworCSItY2NmbGFncyIpCisJCWNjZmxhZ3MKKwkJOzsKKwkiLWxkZmxhZ3MiKQorCQlzaGlmdAorCQljYz0iJEAiCisJCWxkZmxhZ3MKKwkJOzsKKwkiKiIpCisJCXVzYWdlCisJCWV4aXQgMQorCQk7OworZXNhYwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrbGlzdC5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMDIwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2tsaXN0LmMKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiAgY2hlY2tsaXN0LmMgLS0gaW1wbGVtZW50cyB0aGUgY2hlY2tsaXN0IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgICAgU3R1YXJ0IEhlcmJlcnQgLSBTLkhlcmJlcnRAc2hlZmZpZWxkLmFjLnVrOiByYWRpb2xpc3QgZXh0ZW5zaW9uCisgKiAgICAgQWxlc3NhbmRybyBSdWJpbmkgLSBydWJpbmlAaXB2dmlzLnVuaXB2Lml0OiBtZXJnZWQgdGhlIHR3bworICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworc3RhdGljIGludCBsaXN0X3dpZHRoLCBjaGVja194LCBpdGVtX3g7CisKKy8qCisgKiBQcmludCBsaXN0IGl0ZW0KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfaXRlbShXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKml0ZW0sIGludCBzdGF0dXMsIGludCBjaG9pY2UsCisJCSAgICAgICBpbnQgc2VsZWN0ZWQpCit7CisJaW50IGk7CisKKwkvKiBDbGVhciAncmVzaWR1ZScgb2YgbGFzdCBpdGVtICovCisJd2F0dHJzZXQod2luLCBtZW51Ym94X2F0dHIpOworCXdtb3ZlKHdpbiwgY2hvaWNlLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdF93aWR0aDsgaSsrKQorCQl3YWRkY2god2luLCAnICcpOworCisJd21vdmUod2luLCBjaG9pY2UsIGNoZWNrX3gpOworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBjaGVja19zZWxlY3RlZF9hdHRyIDogY2hlY2tfYXR0cik7CisJd3ByaW50dyh3aW4sICIoJWMpIiwgc3RhdHVzID8gJ1gnIDogJyAnKTsKKworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyB0YWdfc2VsZWN0ZWRfYXR0ciA6IHRhZ19hdHRyKTsKKwltdndhZGRjaCh3aW4sIGNob2ljZSwgaXRlbV94LCBpdGVtWzBdKTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gaXRlbV9zZWxlY3RlZF9hdHRyIDogaXRlbV9hdHRyKTsKKwl3YWRkc3RyKHdpbiwgKGNoYXIgKilpdGVtICsgMSk7CisJaWYgKHNlbGVjdGVkKSB7CisJCXdtb3ZlKHdpbiwgY2hvaWNlLCBjaGVja194ICsgMSk7CisJCXdyZWZyZXNoKHdpbik7CisJfQorfQorCisvKgorICogUHJpbnQgdGhlIHNjcm9sbCBpbmRpY2F0b3JzLgorICovCitzdGF0aWMgdm9pZCBwcmludF9hcnJvd3MoV0lORE9XICogd2luLCBpbnQgY2hvaWNlLCBpbnQgaXRlbV9ubywgaW50IHNjcm9sbCwKKwkgICAgIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCkKK3sKKwl3bW92ZSh3aW4sIHksIHgpOworCisJaWYgKHNjcm9sbCA+IDApIHsKKwkJd2F0dHJzZXQod2luLCB1YXJyb3dfYXR0cik7CisJCXdhZGRjaCh3aW4sIEFDU19VQVJST1cpOworCQl3YWRkc3RyKHdpbiwgIigtKSIpOworCX0gZWxzZSB7CisJCXdhdHRyc2V0KHdpbiwgbWVudWJveF9hdHRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwl9CisKKwl5ID0geSArIGhlaWdodCArIDE7CisJd21vdmUod2luLCB5LCB4KTsKKworCWlmICgoaGVpZ2h0IDwgaXRlbV9ubykgJiYgKHNjcm9sbCArIGNob2ljZSA8IGl0ZW1fbm8gLSAxKSkgeworCQl3YXR0cnNldCh3aW4sIGRhcnJvd19hdHRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0RBUlJPVyk7CisJCXdhZGRzdHIod2luLCAiKCspIik7CisJfSBlbHNlIHsKKwkJd2F0dHJzZXQod2luLCBtZW51Ym94X2JvcmRlcl9hdHRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwl9Cit9CisKKy8qCisgKiAgRGlzcGxheSB0aGUgdGVybWluYXRpb24gYnV0dG9ucworICovCitzdGF0aWMgdm9pZCBwcmludF9idXR0b25zKFdJTkRPVyAqIGRpYWxvZywgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisJaW50IHggPSB3aWR0aCAvIDIgLSAxMTsKKwlpbnQgeSA9IGhlaWdodCAtIDI7CisKKwlwcmludF9idXR0b24oZGlhbG9nLCAiU2VsZWN0IiwgeSwgeCwgc2VsZWN0ZWQgPT0gMCk7CisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiBIZWxwICIsIHksIHggKyAxNCwgc2VsZWN0ZWQgPT0gMSk7CisKKwl3bW92ZShkaWFsb2csIHksIHggKyAxICsgMTQgKiBzZWxlY3RlZCk7CisJd3JlZnJlc2goZGlhbG9nKTsKK30KKworLyoKKyAqIERpc3BsYXkgYSBkaWFsb2cgYm94IHdpdGggYSBsaXN0IG9mIG9wdGlvbnMgdGhhdCBjYW4gYmUgdHVybmVkIG9uIG9yIG9mZgorICogaW4gdGhlIHN0eWxlIG9mIHJhZGlvbGlzdCAob25seSBvbmUgb3B0aW9uIHR1cm5lZCBvbiBhdCBhIHRpbWUpLgorICovCitpbnQgZGlhbG9nX2NoZWNrbGlzdChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQkgICAgIGludCB3aWR0aCwgaW50IGxpc3RfaGVpZ2h0LCBpbnQgaXRlbV9ubywKKwkJICAgICBjb25zdCBjaGFyICpjb25zdCAqaXRlbXMpCit7CisJaW50IGksIHgsIHksIGJveF94LCBib3hfeTsKKwlpbnQga2V5ID0gMCwgYnV0dG9uID0gMCwgY2hvaWNlID0gMCwgc2Nyb2xsID0gMCwgbWF4X2Nob2ljZSwgKnN0YXR1czsKKwlXSU5ET1cgKmRpYWxvZywgKmxpc3Q7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc3RvcmluZyBpdGVtIG9uL29mZiBzdGF0dXMgKi8KKwlpZiAoKHN0YXR1cyA9IG1hbGxvYyhzaXplb2YoaW50KSAqIGl0ZW1fbm8pKSA9PSBOVUxMKSB7CisJCWVuZHdpbigpOworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJcbkNhbid0IGFsbG9jYXRlIG1lbW9yeSBpbiBkaWFsb2dfY2hlY2tsaXN0KCkuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJLyogSW5pdGlhbGl6ZXMgc3RhdHVzICovCisJZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykgeworCQlzdGF0dXNbaV0gPSAhc3RyY2FzZWNtcChpdGVtc1tpICogMyArIDJdLCAib24iKTsKKwkJaWYgKCghY2hvaWNlICYmIHN0YXR1c1tpXSkKKwkJICAgIHx8ICFzdHJjYXNlY21wKGl0ZW1zW2kgKiAzICsgMl0sICJzZWxlY3RlZCIpKQorCQkJY2hvaWNlID0gaSArIDE7CisJfQorCWlmIChjaG9pY2UpCisJCWNob2ljZS0tOworCisJbWF4X2Nob2ljZSA9IE1JTihsaXN0X2hlaWdodCwgaXRlbV9ubyk7CisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwlkcmF3X2JveChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisJd2F0dHJzZXQoZGlhbG9nLCBib3JkZXJfYXR0cik7CisJbXZ3YWRkY2goZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCQl3YWRkY2goZGlhbG9nLCBBQ1NfSExJTkUpOworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXdhZGRjaChkaWFsb2csIEFDU19SVEVFKTsKKworCXByaW50X3RpdGxlKGRpYWxvZywgdGl0bGUsIHdpZHRoKTsKKworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXByaW50X2F1dG93cmFwKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisJbGlzdF93aWR0aCA9IHdpZHRoIC0gNjsKKwlib3hfeSA9IGhlaWdodCAtIGxpc3RfaGVpZ2h0IC0gNTsKKwlib3hfeCA9ICh3aWR0aCAtIGxpc3Rfd2lkdGgpIC8gMiAtIDE7CisKKwkvKiBjcmVhdGUgbmV3IHdpbmRvdyBmb3IgdGhlIGxpc3QgKi8KKwlsaXN0ID0gc3Vid2luKGRpYWxvZywgbGlzdF9oZWlnaHQsIGxpc3Rfd2lkdGgsIHkgKyBib3hfeSArIDEsCisJICAgICAgICAgICAgICB4ICsgYm94X3ggKyAxKTsKKworCWtleXBhZChsaXN0LCBUUlVFKTsKKworCS8qIGRyYXcgYSBib3ggYXJvdW5kIHRoZSBsaXN0IGl0ZW1zICovCisJZHJhd19ib3goZGlhbG9nLCBib3hfeSwgYm94X3gsIGxpc3RfaGVpZ2h0ICsgMiwgbGlzdF93aWR0aCArIDIsCisJICAgICAgICAgbWVudWJveF9ib3JkZXJfYXR0ciwgbWVudWJveF9hdHRyKTsKKworCS8qIEZpbmQgbGVuZ3RoIG9mIGxvbmdlc3QgaXRlbSBpbiBvcmRlciB0byBjZW50ZXIgY2hlY2tsaXN0ICovCisJY2hlY2tfeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykKKwkJY2hlY2tfeCA9IE1BWChjaGVja194LCArc3RybGVuKGl0ZW1zW2kgKiAzICsgMV0pICsgNCk7CisKKwljaGVja194ID0gKGxpc3Rfd2lkdGggLSBjaGVja194KSAvIDI7CisJaXRlbV94ID0gY2hlY2tfeCArIDQ7CisKKwlpZiAoY2hvaWNlID49IGxpc3RfaGVpZ2h0KSB7CisJCXNjcm9sbCA9IGNob2ljZSAtIGxpc3RfaGVpZ2h0ICsgMTsKKwkJY2hvaWNlIC09IHNjcm9sbDsKKwl9CisKKwkvKiBQcmludCB0aGUgbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBtYXhfY2hvaWNlOyBpKyspIHsKKwkJcHJpbnRfaXRlbShsaXN0LCBpdGVtc1soc2Nyb2xsICsgaSkgKiAzICsgMV0sCisJCQkgICBzdGF0dXNbaSArIHNjcm9sbF0sIGksIGkgPT0gY2hvaWNlKTsKKwl9CisKKwlwcmludF9hcnJvd3MoZGlhbG9nLCBjaG9pY2UsIGl0ZW1fbm8sIHNjcm9sbCwKKwkJICAgICBib3hfeSwgYm94X3ggKyBjaGVja194ICsgNSwgbGlzdF9oZWlnaHQpOworCisJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCisJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJd25vdXRyZWZyZXNoKGxpc3QpOworCWRvdXBkYXRlKCk7CisKKwl3aGlsZSAoa2V5ICE9IEVTQykgeworCQlrZXkgPSB3Z2V0Y2goZGlhbG9nKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKQorCQkJaWYgKHRvdXBwZXIoa2V5KSA9PQorCQkJICAgIHRvdXBwZXIoaXRlbXNbKHNjcm9sbCArIGkpICogMyArIDFdWzBdKSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA8IG1heF9jaG9pY2UgfHwga2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gS0VZX0RPV04gfHwKKwkJICAgIGtleSA9PSAnKycgfHwga2V5ID09ICctJykgeworCQkJaWYgKGtleSA9PSBLRVlfVVAgfHwga2V5ID09ICctJykgeworCQkJCWlmICghY2hvaWNlKSB7CisJCQkJCWlmICghc2Nyb2xsKQorCQkJCQkJY29udGludWU7CisJCQkJCS8qIFNjcm9sbCBsaXN0IGRvd24gKi8KKwkJCQkJaWYgKGxpc3RfaGVpZ2h0ID4gMSkgeworCQkJCQkJLyogRGUtaGlnaGxpZ2h0IGN1cnJlbnQgZmlyc3QgaXRlbSAqLworCQkJCQkJcHJpbnRfaXRlbShsaXN0LCBpdGVtc1tzY3JvbGwgKiAzICsgMV0sCisJCQkJCQkJICAgc3RhdHVzW3Njcm9sbF0sIDAsIEZBTFNFKTsKKwkJCQkJCXNjcm9sbG9rKGxpc3QsIFRSVUUpOworCQkJCQkJd3NjcmwobGlzdCwgLTEpOworCQkJCQkJc2Nyb2xsb2sobGlzdCwgRkFMU0UpOworCQkJCQl9CisJCQkJCXNjcm9sbC0tOworCQkJCQlwcmludF9pdGVtKGxpc3QsIGl0ZW1zW3Njcm9sbCAqIDMgKyAxXSwgc3RhdHVzW3Njcm9sbF0sIDAsIFRSVUUpOworCQkJCQlwcmludF9hcnJvd3MoZGlhbG9nLCBjaG9pY2UsIGl0ZW1fbm8sCisJCQkJCQkgICAgIHNjcm9sbCwgYm94X3ksIGJveF94ICsgY2hlY2tfeCArIDUsIGxpc3RfaGVpZ2h0KTsKKworCQkJCQl3bm91dHJlZnJlc2goZGlhbG9nKTsKKwkJCQkJd3JlZnJlc2gobGlzdCk7CisKKwkJCQkJY29udGludWU7CS8qIHdhaXQgZm9yIGFub3RoZXIga2V5IHByZXNzICovCisJCQkJfSBlbHNlCisJCQkJCWkgPSBjaG9pY2UgLSAxOworCQkJfSBlbHNlIGlmIChrZXkgPT0gS0VZX0RPV04gfHwga2V5ID09ICcrJykgeworCQkJCWlmIChjaG9pY2UgPT0gbWF4X2Nob2ljZSAtIDEpIHsKKwkJCQkJaWYgKHNjcm9sbCArIGNob2ljZSA+PSBpdGVtX25vIC0gMSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBTY3JvbGwgbGlzdCB1cCAqLworCQkJCQlpZiAobGlzdF9oZWlnaHQgPiAxKSB7CisJCQkJCQkvKiBEZS1oaWdobGlnaHQgY3VycmVudCBsYXN0IGl0ZW0gYmVmb3JlIHNjcm9sbGluZyB1cCAqLworCQkJCQkJcHJpbnRfaXRlbShsaXN0LCBpdGVtc1soc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDEpICogMyArIDFdLAorCQkJCQkJCSAgIHN0YXR1c1tzY3JvbGwgKyBtYXhfY2hvaWNlIC0gMV0sCisJCQkJCQkJICAgbWF4X2Nob2ljZSAtIDEsIEZBTFNFKTsKKwkJCQkJCXNjcm9sbG9rKGxpc3QsIFRSVUUpOworCQkJCQkJd3NjcmwobGlzdCwgMSk7CisJCQkJCQlzY3JvbGxvayhsaXN0LCBGQUxTRSk7CisJCQkJCX0KKwkJCQkJc2Nyb2xsKys7CisJCQkJCXByaW50X2l0ZW0obGlzdCwgaXRlbXNbKHNjcm9sbCArIG1heF9jaG9pY2UgLSAxKSAqIDMgKyAxXSwKKwkJCQkJCSAgIHN0YXR1c1tzY3JvbGwgKyBtYXhfY2hvaWNlIC0gMV0sIG1heF9jaG9pY2UgLSAxLCBUUlVFKTsKKworCQkJCQlwcmludF9hcnJvd3MoZGlhbG9nLCBjaG9pY2UsIGl0ZW1fbm8sCisJCQkJCQkgICAgIHNjcm9sbCwgYm94X3ksIGJveF94ICsgY2hlY2tfeCArIDUsIGxpc3RfaGVpZ2h0KTsKKworCQkJCQl3bm91dHJlZnJlc2goZGlhbG9nKTsKKwkJCQkJd3JlZnJlc2gobGlzdCk7CisKKwkJCQkJY29udGludWU7CS8qIHdhaXQgZm9yIGFub3RoZXIga2V5IHByZXNzICovCisJCQkJfSBlbHNlCisJCQkJCWkgPSBjaG9pY2UgKyAxOworCQkJfQorCQkJaWYgKGkgIT0gY2hvaWNlKSB7CisJCQkJLyogRGUtaGlnaGxpZ2h0IGN1cnJlbnQgaXRlbSAqLworCQkJCXByaW50X2l0ZW0obGlzdCwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAzICsgMV0sCisJCQkJCSAgIHN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdLCBjaG9pY2UsIEZBTFNFKTsKKwkJCQkvKiBIaWdobGlnaHQgbmV3IGl0ZW0gKi8KKwkJCQljaG9pY2UgPSBpOworCQkJCXByaW50X2l0ZW0obGlzdCwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAzICsgMV0sCisJCQkJCSAgIHN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdLCBjaG9pY2UsIFRSVUUpOworCQkJCXdub3V0cmVmcmVzaChkaWFsb2cpOworCQkJCXdyZWZyZXNoKGxpc3QpOworCQkJfQorCQkJY29udGludWU7CS8qIHdhaXQgZm9yIGFub3RoZXIga2V5IHByZXNzICovCisJCX0KKwkJc3dpdGNoIChrZXkpIHsKKwkJY2FzZSAnSCc6CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDNdKTsKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJZnJlZShzdGF0dXMpOworCQkJcmV0dXJuIDE7CisJCWNhc2UgVEFCOgorCQljYXNlIEtFWV9MRUZUOgorCQljYXNlIEtFWV9SSUdIVDoKKwkJCWJ1dHRvbiA9ICgoa2V5ID09IEtFWV9MRUZUID8gLS1idXR0b24gOiArK2J1dHRvbikgPCAwKQorCQkJICAgID8gMSA6IChidXR0b24gPiAxID8gMCA6IGJ1dHRvbik7CisKKwkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCBidXR0b24pOworCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJY2FzZSAncyc6CisJCWNhc2UgJyAnOgorCQljYXNlICdcbic6CisJCQlpZiAoIWJ1dHRvbikgeworCQkJCWlmICghc3RhdHVzW3Njcm9sbCArIGNob2ljZV0pIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykKKwkJCQkJCXN0YXR1c1tpXSA9IDA7CisJCQkJCXN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdID0gMTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykKKwkJCQkJCXByaW50X2l0ZW0obGlzdCwgaXRlbXNbKHNjcm9sbCArIGkpICogMyArIDFdLAorCQkJCQkJCSAgIHN0YXR1c1tzY3JvbGwgKyBpXSwgaSwgaSA9PSBjaG9pY2UpOworCQkJCX0KKwkJCQl3bm91dHJlZnJlc2goZGlhbG9nKTsKKwkJCQl3cmVmcmVzaChsaXN0KTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBpdGVtX25vOyBpKyspCisJCQkJCWlmIChzdGF0dXNbaV0pCisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlbXNbaSAqIDNdKTsKKwkJCX0gZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDNdKTsKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJZnJlZShzdGF0dXMpOworCQkJcmV0dXJuIGJ1dHRvbjsKKwkJY2FzZSAnWCc6CisJCWNhc2UgJ3gnOgorCQkJa2V5ID0gRVNDOworCQljYXNlIEVTQzoKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTm93LCB1cGRhdGUgZXZlcnl0aGluZy4uLiAqLworCQlkb3VwZGF0ZSgpOworCX0KKworCWRlbHdpbihkaWFsb2cpOworCWZyZWUoc3RhdHVzKTsKKwlyZXR1cm4gLTE7CQkvKiBFU0MgcHJlc3NlZCAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NvbG9ycy5oIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NvbG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDcxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY29sb3JzLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiAgY29sb3JzLmggLS0gY29sb3IgYXR0cmlidXRlIGRlZmluaXRpb25zCisgKgorICogIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiAgIERlZmF1bHQgY29sb3IgZGVmaW5pdGlvbnMKKyAqCisgKiAgICpfRkcgPSBmb3JlZ3JvdW5kCisgKiAgICpfQkcgPSBiYWNrZ3JvdW5kCisgKiAgICpfSEwgPSBoaWdobGlnaHQ/CisgKi8KKyNkZWZpbmUgU0NSRUVOX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9DWUFOCisjZGVmaW5lIFNDUkVFTl9CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBTQ1JFRU5fSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBTSEFET1dfRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIFNIQURPV19CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgU0hBRE9XX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgRElBTE9HX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBESUFMT0dfQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIERJQUxPR19ITCAgICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBUSVRMRV9GRyAgICAgICAgICAgICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBUSVRMRV9CRyAgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFRJVExFX0hMICAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIEJPUkRFUl9GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQk9SREVSX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCT1JERVJfSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBCVVRUT05fQUNUSVZFX0ZHICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9BQ1RJVkVfQkcgICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBCVVRUT05fQUNUSVZFX0hMICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBCVVRUT05fSU5BQ1RJVkVfRkcgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIEJVVFRPTl9JTkFDVElWRV9CRyAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0lOQUNUSVZFX0hMICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIEJVVFRPTl9LRVlfQUNUSVZFX0ZHICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0tFWV9BQ1RJVkVfQkcgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIEJVVFRPTl9LRVlfQUNUSVZFX0hMICAgICAgICAgVFJVRQorCisjZGVmaW5lIEJVVFRPTl9LRVlfSU5BQ1RJVkVfRkcgICAgICAgQ09MT1JfUkVECisjZGVmaW5lIEJVVFRPTl9LRVlfSU5BQ1RJVkVfQkcgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0tFWV9JTkFDVElWRV9ITCAgICAgICBGQUxTRQorCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9BQ1RJVkVfRkcgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9BQ1RJVkVfQkcgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBCVVRUT05fTEFCRUxfQUNUSVZFX0hMICAgICAgIFRSVUUKKworI2RlZmluZSBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfRkcgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9JTkFDVElWRV9CRyAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0lOQUNUSVZFX0hMICAgICBUUlVFCisKKyNkZWZpbmUgSU5QVVRCT1hfRkcgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBJTlBVVEJPWF9CRyAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIElOUFVUQk9YX0hMICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBJTlBVVEJPWF9CT1JERVJfRkcgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIElOUFVUQk9YX0JPUkRFUl9CRyAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgSU5QVVRCT1hfQk9SREVSX0hMICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIFNFQVJDSEJPWF9GRyAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgU0VBUkNIQk9YX0JHICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBTRUFSQ0hCT1hfSEwgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgU0VBUkNIQk9YX1RJVExFX0ZHICAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgU0VBUkNIQk9YX1RJVExFX0JHICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBTRUFSQ0hCT1hfVElUTEVfSEwgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBTRUFSQ0hCT1hfQk9SREVSX0ZHICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFNFQVJDSEJPWF9CT1JERVJfQkcgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgU0VBUkNIQk9YX0JPUkRFUl9ITCAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgUE9TSVRJT05fSU5ESUNBVE9SX0ZHICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgUE9TSVRJT05fSU5ESUNBVE9SX0JHICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBQT1NJVElPTl9JTkRJQ0FUT1JfSEwgICAgICAgIFRSVUUKKworI2RlZmluZSBNRU5VQk9YX0ZHICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIE1FTlVCT1hfQkcgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgTUVOVUJPWF9ITCAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIE1FTlVCT1hfQk9SREVSX0ZHICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgTUVOVUJPWF9CT1JERVJfQkcgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBNRU5VQk9YX0JPUkRFUl9ITCAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBJVEVNX0ZHICAgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIElURU1fQkcgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgSVRFTV9ITCAgICAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIElURU1fU0VMRUNURURfRkcgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgSVRFTV9TRUxFQ1RFRF9CRyAgICAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIElURU1fU0VMRUNURURfSEwgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFRBR19GRyAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRBR19CRyAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgVEFHX0hMICAgICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgVEFHX1NFTEVDVEVEX0ZHICAgICAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgVEFHX1NFTEVDVEVEX0JHICAgICAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIFRBR19TRUxFQ1RFRF9ITCAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFRBR19LRVlfRkcgICAgICAgICAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRBR19LRVlfQkcgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgVEFHX0tFWV9ITCAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgVEFHX0tFWV9TRUxFQ1RFRF9GRyAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgVEFHX0tFWV9TRUxFQ1RFRF9CRyAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIFRBR19LRVlfU0VMRUNURURfSEwgICAgICAgICAgVFJVRQorCisjZGVmaW5lIENIRUNLX0ZHICAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgQ0hFQ0tfQkcgICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBDSEVDS19ITCAgICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgQ0hFQ0tfU0VMRUNURURfRkcgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBDSEVDS19TRUxFQ1RFRF9CRyAgICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgQ0hFQ0tfU0VMRUNURURfSEwgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgVUFSUk9XX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9HUkVFTgorI2RlZmluZSBVQVJST1dfQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFVBUlJPV19ITCAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIERBUlJPV19GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfR1JFRU4KKyNkZWZpbmUgREFSUk9XX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBEQVJST1dfSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworLyogRW5kIG9mIGRlZmF1bHQgY29sb3IgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBDX0FUVFIoeCx5KSAgICAgICAgICAgICAgICAgICgoeCA/IEFfQk9MRCA6IDApIHwgQ09MT1JfUEFJUigoeSkpKQorI2RlZmluZSBDT0xPUl9OQU1FX0xFTiAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIENPTE9SX0NPVU5UICAgICAgICAgICAgICAgICAgOAorCisvKgorICogR2xvYmFsIHZhcmlhYmxlcworICovCisKK2V4dGVybiBpbnQgY29sb3JfdGFibGVbXVszXTsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9kaWFsb2cuaCBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9kaWFsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNjZjcxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2RpYWxvZy5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogIGRpYWxvZy5oIC0tIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIGFsbCBkaWFsb2cgbW9kdWxlcworICoKKyAqICBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX19zdW5fXworI2RlZmluZSBDVVJTX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSBDVVJTRVNfTE9DCisKKy8qCisgKiBDb2xvcnMgaW4gbmN1cnNlcyAxLjkuOWUgZG8gbm90IHdvcmsgcHJvcGVybHkgc2luY2UgZm9yZWdyb3VuZCBhbmQKKyAqIGJhY2tncm91bmQgY29sb3JzIGFyZSBPUidkIHJhdGhlciB0aGFuIHNlcGFyYXRlbHkgbWFza2VkLiAgVGhpcyB2ZXJzaW9uCisgKiBvZiBkaWFsb2cgd2FzIGhhY2tlZCB0byB3b3JrIHdpdGggbmN1cnNlcyAxLjkuOWUsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUKKyAqIHdpdGggc3RhbmRhcmQgY3Vyc2VzLiAgVGhlIHNpbXBsZXN0IGZpeCAodG8gbWFrZSB0aGlzIHdvcmsgd2l0aCBzdGFuZGFyZAorICogY3Vyc2VzKSB1c2VzIHRoZSB3YmtnZHNldCgpIGZ1bmN0aW9uLCBub3QgdXNlZCBpbiB0aGUgb3JpZ2luYWwgaGFjay4KKyAqIFR1cm4gaXQgb2ZmIGlmIHdlJ3JlIGJ1aWxkaW5nIHdpdGggMS45LjllLCBzaW5jZSBpdCBqdXN0IGNvbmZ1c2VzIHRoaW5ncy4KKyAqLworI2lmIGRlZmluZWQoTkNVUlNFU19WRVJTSU9OKSAmJiBkZWZpbmVkKF9ORUVEX1dSQVApICYmICFkZWZpbmVkKEdDQ19QUklOVEZMSUtFKQorI2RlZmluZSBPTERfTkNVUlNFUyAxCisjdW5kZWYgIHdia2dkc2V0CisjZGVmaW5lIHdia2dkc2V0KHcscCkJCS8qbm90aGluZyAqLworI2Vsc2UKKyNkZWZpbmUgT0xEX05DVVJTRVMgMAorI2VuZGlmCisKKyNkZWZpbmUgVFIocGFyYW1zKSBfdHJhY2VmIHBhcmFtcworCisjZGVmaW5lIEVTQyAyNworI2RlZmluZSBUQUIgOQorI2RlZmluZSBNQVhfTEVOIDIwNDgKKyNkZWZpbmUgQlVGX1NJWkUgKDEwKjEwMjQpCisjZGVmaW5lIE1JTih4LHkpICh4IDwgeSA/IHggOiB5KQorI2RlZmluZSBNQVgoeCx5KSAoeCA+IHkgPyB4IDogeSkKKworI2lmbmRlZiBBQ1NfVUxDT1JORVIKKyNkZWZpbmUgQUNTX1VMQ09STkVSICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19MTENPUk5FUgorI2RlZmluZSBBQ1NfTExDT1JORVIgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX1VSQ09STkVSCisjZGVmaW5lIEFDU19VUkNPUk5FUiAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfTFJDT1JORVIKKyNkZWZpbmUgQUNTX0xSQ09STkVSICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19ITElORQorI2RlZmluZSBBQ1NfSExJTkUgJy0nCisjZW5kaWYKKyNpZm5kZWYgQUNTX1ZMSU5FCisjZGVmaW5lIEFDU19WTElORSAnfCcKKyNlbmRpZgorI2lmbmRlZiBBQ1NfTFRFRQorI2RlZmluZSBBQ1NfTFRFRSAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfUlRFRQorI2RlZmluZSBBQ1NfUlRFRSAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfVUFSUk9XCisjZGVmaW5lIEFDU19VQVJST1cgJ14nCisjZW5kaWYKKyNpZm5kZWYgQUNTX0RBUlJPVworI2RlZmluZSBBQ1NfREFSUk9XICd2JworI2VuZGlmCisKKy8qCisgKiBBdHRyaWJ1dGUgbmFtZXMKKyAqLworI2RlZmluZSBzY3JlZW5fYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzBdCisjZGVmaW5lIHNoYWRvd19hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMV0KKyNkZWZpbmUgZGlhbG9nX2F0dHIgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1syXQorI2RlZmluZSB0aXRsZV9hdHRyICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzNdCisjZGVmaW5lIGJvcmRlcl9hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbNF0KKyNkZWZpbmUgYnV0dG9uX2FjdGl2ZV9hdHRyICAgICAgICAgICAgYXR0cmlidXRlc1s1XQorI2RlZmluZSBidXR0b25faW5hY3RpdmVfYXR0ciAgICAgICAgICBhdHRyaWJ1dGVzWzZdCisjZGVmaW5lIGJ1dHRvbl9rZXlfYWN0aXZlX2F0dHIgICAgICAgIGF0dHJpYnV0ZXNbN10KKyNkZWZpbmUgYnV0dG9uX2tleV9pbmFjdGl2ZV9hdHRyICAgICAgYXR0cmlidXRlc1s4XQorI2RlZmluZSBidXR0b25fbGFiZWxfYWN0aXZlX2F0dHIgICAgICBhdHRyaWJ1dGVzWzldCisjZGVmaW5lIGJ1dHRvbl9sYWJlbF9pbmFjdGl2ZV9hdHRyICAgIGF0dHJpYnV0ZXNbMTBdCisjZGVmaW5lIGlucHV0Ym94X2F0dHIgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMTFdCisjZGVmaW5lIGlucHV0Ym94X2JvcmRlcl9hdHRyICAgICAgICAgIGF0dHJpYnV0ZXNbMTJdCisjZGVmaW5lIHNlYXJjaGJveF9hdHRyICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMTNdCisjZGVmaW5lIHNlYXJjaGJveF90aXRsZV9hdHRyICAgICAgICAgIGF0dHJpYnV0ZXNbMTRdCisjZGVmaW5lIHNlYXJjaGJveF9ib3JkZXJfYXR0ciAgICAgICAgIGF0dHJpYnV0ZXNbMTVdCisjZGVmaW5lIHBvc2l0aW9uX2luZGljYXRvcl9hdHRyICAgICAgIGF0dHJpYnV0ZXNbMTZdCisjZGVmaW5lIG1lbnVib3hfYXR0ciAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMTddCisjZGVmaW5lIG1lbnVib3hfYm9yZGVyX2F0dHIgICAgICAgICAgIGF0dHJpYnV0ZXNbMThdCisjZGVmaW5lIGl0ZW1fYXR0ciAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMTldCisjZGVmaW5lIGl0ZW1fc2VsZWN0ZWRfYXR0ciAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjBdCisjZGVmaW5lIHRhZ19hdHRyICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjFdCisjZGVmaW5lIHRhZ19zZWxlY3RlZF9hdHRyICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjJdCisjZGVmaW5lIHRhZ19rZXlfYXR0ciAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjNdCisjZGVmaW5lIHRhZ19rZXlfc2VsZWN0ZWRfYXR0ciAgICAgICAgIGF0dHJpYnV0ZXNbMjRdCisjZGVmaW5lIGNoZWNrX2F0dHIgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjVdCisjZGVmaW5lIGNoZWNrX3NlbGVjdGVkX2F0dHIgICAgICAgICAgIGF0dHJpYnV0ZXNbMjZdCisjZGVmaW5lIHVhcnJvd19hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjddCisjZGVmaW5lIGRhcnJvd19hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjhdCisKKy8qIG51bWJlciBvZiBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEFUVFJJQlVURV9DT1VOVCAgICAgICAgICAgICAgIDI5CisKKy8qCisgKiBHbG9iYWwgdmFyaWFibGVzCisgKi8KK2V4dGVybiBib29sIHVzZV9jb2xvcnM7CitleHRlcm4gYm9vbCB1c2Vfc2hhZG93OworCitleHRlcm4gY2h0eXBlIGF0dHJpYnV0ZXNbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmJhY2t0aXRsZTsKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworZXh0ZXJuIHZvaWQgY3JlYXRlX3JjKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK2V4dGVybiBpbnQgcGFyc2VfcmModm9pZCk7CisKK3ZvaWQgaW5pdF9kaWFsb2codm9pZCk7Cit2b2lkIGVuZF9kaWFsb2codm9pZCk7Cit2b2lkIGF0dHJfY2xlYXIoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGNodHlwZSBhdHRyKTsKK3ZvaWQgZGlhbG9nX2NsZWFyKHZvaWQpOwordm9pZCBjb2xvcl9zZXR1cCh2b2lkKTsKK3ZvaWQgcHJpbnRfYXV0b3dyYXAoV0lORE9XICogd2luLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCB3aWR0aCwgaW50IHksIGludCB4KTsKK3ZvaWQgcHJpbnRfYnV0dG9uKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqbGFiZWwsIGludCB5LCBpbnQgeCwgaW50IHNlbGVjdGVkKTsKK3ZvaWQgcHJpbnRfdGl0bGUoV0lORE9XICpkaWFsb2csIGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgd2lkdGgpOwordm9pZCBkcmF3X2JveChXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBjaHR5cGUgYm94LAorCSAgICAgIGNodHlwZSBib3JkZXIpOwordm9pZCBkcmF3X3NoYWRvdyhXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKKworaW50IGZpcnN0X2FscGhhKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZXhlbXB0KTsKK2ludCBkaWFsb2dfeWVzbm8oY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKK2ludCBkaWFsb2dfbXNnYm94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCSAgaW50IHdpZHRoLCBpbnQgcGF1c2UpOworaW50IGRpYWxvZ190ZXh0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworaW50IGRpYWxvZ19tZW51KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKwkJaW50IG1lbnVfaGVpZ2h0LCBjb25zdCBjaGFyICpjaG9pY2UsIGludCBpdGVtX25vLAorCQljb25zdCBjaGFyICpjb25zdCAqaXRlbXMpOworaW50IGRpYWxvZ19jaGVja2xpc3QoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwKKwkJICAgICBpbnQgd2lkdGgsIGludCBsaXN0X2hlaWdodCwgaW50IGl0ZW1fbm8sCisJCSAgICAgY29uc3QgY2hhciAqY29uc3QgKml0ZW1zKTsKK2V4dGVybiBjaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbXTsKK2ludCBkaWFsb2dfaW5wdXRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwKKwkJICAgIGludCB3aWR0aCwgY29uc3QgY2hhciAqaW5pdCk7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBiYXNlIGZvciBmaWN0aXRpb3VzIGtleXMsIHdoaWNoIGFjdGl2YXRlCisgKiB0aGUgYnV0dG9ucy4KKyAqCisgKiBNb3VzZS1nZW5lcmF0ZWQga2V5cyBhcmUgdGhlIGZvbGxvd2luZzoKKyAqICAgLS0gdGhlIGZpcnN0IDMyIGFyZSB1c2VkIGFzIG51bWJlcnMsIGluIGFkZGl0aW9uIHRvICcwJy0nOScKKyAqICAgLS0gdGhlIGxvd2VyY2FzZSBhcmUgdXNlZCB0byBzaWduYWwgbW91c2UtZW50ZXIgZXZlbnRzIChNX0VWRU5UICsgJ28nKQorICogICAtLSB1cHBlcmNhc2UgY2hhcnMgYXJlIHVzZWQgdG8gaW52b2tlIHRoZSBidXR0b24gKE1fRVZFTlQgKyAnTycpCisgKi8KKyNkZWZpbmUgTV9FVkVOVCAoS0VZX01BWCsxKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2lucHV0Ym94LmMgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvaW5wdXRib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk1MDM3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2lucHV0Ym94LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiAgaW5wdXRib3guYyAtLSBpbXBsZW1lbnRzIHRoZSBpbnB1dCBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworY2hhciBkaWFsb2dfaW5wdXRfcmVzdWx0W01BWF9MRU4gKyAxXTsKKworLyoKKyAqICBQcmludCB0aGUgdGVybWluYXRpb24gYnV0dG9ucworICovCitzdGF0aWMgdm9pZCBwcmludF9idXR0b25zKFdJTkRPVyAqIGRpYWxvZywgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisJaW50IHggPSB3aWR0aCAvIDIgLSAxMTsKKwlpbnQgeSA9IGhlaWdodCAtIDI7CisKKwlwcmludF9idXR0b24oZGlhbG9nLCAiICBPayAgIiwgeSwgeCwgc2VsZWN0ZWQgPT0gMCk7CisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiBIZWxwICIsIHksIHggKyAxNCwgc2VsZWN0ZWQgPT0gMSk7CisKKwl3bW92ZShkaWFsb2csIHksIHggKyAxICsgMTQgKiBzZWxlY3RlZCk7CisJd3JlZnJlc2goZGlhbG9nKTsKK30KKworLyoKKyAqIERpc3BsYXkgYSBkaWFsb2cgYm94IGZvciBpbnB1dGluZyBhIHN0cmluZworICovCitpbnQgZGlhbG9nX2lucHV0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5pdCkKK3sKKwlpbnQgaSwgeCwgeSwgYm94X3ksIGJveF94LCBib3hfd2lkdGg7CisJaW50IGlucHV0X3ggPSAwLCBzY3JvbGwgPSAwLCBrZXkgPSAwLCBidXR0b24gPSAtMTsKKwljaGFyICppbnN0ciA9IGRpYWxvZ19pbnB1dF9yZXN1bHQ7CisJV0lORE9XICpkaWFsb2c7CisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwlkcmF3X2JveChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisJd2F0dHJzZXQoZGlhbG9nLCBib3JkZXJfYXR0cik7CisJbXZ3YWRkY2goZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCQl3YWRkY2goZGlhbG9nLCBBQ1NfSExJTkUpOworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXdhZGRjaChkaWFsb2csIEFDU19SVEVFKTsKKworCXByaW50X3RpdGxlKGRpYWxvZywgdGl0bGUsIHdpZHRoKTsKKworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXByaW50X2F1dG93cmFwKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisJLyogRHJhdyB0aGUgaW5wdXQgZmllbGQgYm94ICovCisJYm94X3dpZHRoID0gd2lkdGggLSA2OworCWdldHl4KGRpYWxvZywgeSwgeCk7CisJYm94X3kgPSB5ICsgMjsKKwlib3hfeCA9ICh3aWR0aCAtIGJveF93aWR0aCkgLyAyOworCWRyYXdfYm94KGRpYWxvZywgeSArIDEsIGJveF94IC0gMSwgMywgYm94X3dpZHRoICsgMiwgYm9yZGVyX2F0dHIsIGRpYWxvZ19hdHRyKTsKKworCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKworCS8qIFNldCB1cCB0aGUgaW5pdGlhbCB2YWx1ZSAqLworCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94KTsKKwl3YXR0cnNldChkaWFsb2csIGlucHV0Ym94X2F0dHIpOworCisJaWYgKCFpbml0KQorCQlpbnN0clswXSA9ICdcMCc7CisJZWxzZQorCQlzdHJjcHkoaW5zdHIsIGluaXQpOworCisJaW5wdXRfeCA9IHN0cmxlbihpbnN0cik7CisKKwlpZiAoaW5wdXRfeCA+PSBib3hfd2lkdGgpIHsKKwkJc2Nyb2xsID0gaW5wdXRfeCAtIGJveF93aWR0aCArIDE7CisJCWlucHV0X3ggPSBib3hfd2lkdGggLSAxOworCQlmb3IgKGkgPSAwOyBpIDwgYm94X3dpZHRoIC0gMTsgaSsrKQorCQkJd2FkZGNoKGRpYWxvZywgaW5zdHJbc2Nyb2xsICsgaV0pOworCX0gZWxzZSB7CisJCXdhZGRzdHIoZGlhbG9nLCBpbnN0cik7CisJfQorCisJd21vdmUoZGlhbG9nLCBib3hfeSwgYm94X3ggKyBpbnB1dF94KTsKKworCXdyZWZyZXNoKGRpYWxvZyk7CisKKwl3aGlsZSAoa2V5ICE9IEVTQykgeworCQlrZXkgPSB3Z2V0Y2goZGlhbG9nKTsKKworCQlpZiAoYnV0dG9uID09IC0xKSB7CS8qIElucHV0IGJveCBzZWxlY3RlZCAqLworCQkJc3dpdGNoIChrZXkpIHsKKwkJCWNhc2UgVEFCOgorCQkJY2FzZSBLRVlfVVA6CisJCQljYXNlIEtFWV9ET1dOOgorCQkJCWJyZWFrOworCQkJY2FzZSBLRVlfTEVGVDoKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgS0VZX1JJR0hUOgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBLRVlfQkFDS1NQQUNFOgorCQkJY2FzZSAxMjc6CisJCQkJaWYgKGlucHV0X3ggfHwgc2Nyb2xsKSB7CisJCQkJCXdhdHRyc2V0KGRpYWxvZywgaW5wdXRib3hfYXR0cik7CisJCQkJCWlmICghaW5wdXRfeCkgeworCQkJCQkJc2Nyb2xsID0gc2Nyb2xsIDwgYm94X3dpZHRoIC0gMSA/IDAgOiBzY3JvbGwgLSAoYm94X3dpZHRoIC0gMSk7CisJCQkJCQl3bW92ZShkaWFsb2csIGJveF95LCBib3hfeCk7CisJCQkJCQlmb3IgKGkgPSAwOyBpIDwgYm94X3dpZHRoOyBpKyspCisJCQkJCQkJd2FkZGNoKGRpYWxvZywKKwkJCQkJCQkgICAgICAgaW5zdHJbc2Nyb2xsICsgaW5wdXRfeCArIGldID8KKwkJCQkJCQkgICAgICAgaW5zdHJbc2Nyb2xsICsgaW5wdXRfeCArIGldIDogJyAnKTsKKwkJCQkJCWlucHV0X3ggPSBzdHJsZW4oaW5zdHIpIC0gc2Nyb2xsOworCQkJCQl9IGVsc2UKKwkJCQkJCWlucHV0X3gtLTsKKwkJCQkJaW5zdHJbc2Nyb2xsICsgaW5wdXRfeF0gPSAnXDAnOworCQkJCQltdndhZGRjaChkaWFsb2csIGJveF95LCBpbnB1dF94ICsgYm94X3gsICcgJyk7CisJCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGlucHV0X3ggKyBib3hfeCk7CisJCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoa2V5IDwgMHgxMDAgJiYgaXNwcmludChrZXkpKSB7CisJCQkJCWlmIChzY3JvbGwgKyBpbnB1dF94IDwgTUFYX0xFTikgeworCQkJCQkJd2F0dHJzZXQoZGlhbG9nLCBpbnB1dGJveF9hdHRyKTsKKwkJCQkJCWluc3RyW3Njcm9sbCArIGlucHV0X3hdID0ga2V5OworCQkJCQkJaW5zdHJbc2Nyb2xsICsgaW5wdXRfeCArIDFdID0gJ1wwJzsKKwkJCQkJCWlmIChpbnB1dF94ID09IGJveF93aWR0aCAtIDEpIHsKKwkJCQkJCQlzY3JvbGwrKzsKKwkJCQkJCQl3bW92ZShkaWFsb2csIGJveF95LCBib3hfeCk7CisJCQkJCQkJZm9yIChpID0gMDsgaSA8IGJveF93aWR0aCAtIDE7IGkrKykKKwkJCQkJCQkJd2FkZGNoKGRpYWxvZywgaW5zdHIgW3Njcm9sbCArIGldKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJd21vdmUoZGlhbG9nLCBib3hfeSwgaW5wdXRfeCsrICsgYm94X3gpOworCQkJCQkJCXdhZGRjaChkaWFsb2csIGtleSk7CisJCQkJCQl9CisJCQkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJCQl9IGVsc2UKKwkJCQkJCWZsYXNoKCk7CS8qIEFsYXJtIHVzZXIgYWJvdXQgb3ZlcmZsb3cgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgJ08nOgorCQljYXNlICdvJzoKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ0gnOgorCQljYXNlICdoJzoKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJcmV0dXJuIDE7CisJCWNhc2UgS0VZX1VQOgorCQljYXNlIEtFWV9MRUZUOgorCQkJc3dpdGNoIChidXR0b24pIHsKKwkJCWNhc2UgLTE6CisJCQkJYnV0dG9uID0gMTsJLyogSW5kaWNhdGVzICJDYW5jZWwiIGJ1dHRvbiBpcyBzZWxlY3RlZCAqLworCQkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCQlidXR0b24gPSAtMTsJLyogSW5kaWNhdGVzIGlucHV0IGJveCBpcyBzZWxlY3RlZCAqLworCQkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwkJCQl3bW92ZShkaWFsb2csIGJveF95LCBib3hfeCArIGlucHV0X3gpOworCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJYnV0dG9uID0gMDsJLyogSW5kaWNhdGVzICJPSyIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVEFCOgorCQljYXNlIEtFWV9ET1dOOgorCQljYXNlIEtFWV9SSUdIVDoKKwkJCXN3aXRjaCAoYnV0dG9uKSB7CisJCQljYXNlIC0xOgorCQkJCWJ1dHRvbiA9IDA7CS8qIEluZGljYXRlcyAiT0siIGJ1dHRvbiBpcyBzZWxlY3RlZCAqLworCQkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCQlidXR0b24gPSAxOwkvKiBJbmRpY2F0ZXMgIkNhbmNlbCIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWJ1dHRvbiA9IC0xOwkvKiBJbmRpY2F0ZXMgaW5wdXQgYm94IGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94ICsgaW5wdXRfeCk7CisJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICcgJzoKKwkJY2FzZSAnXG4nOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gKGJ1dHRvbiA9PSAtMSA/IDAgOiBidXR0b24pOworCQljYXNlICdYJzoKKwkJY2FzZSAneCc6CisJCQlrZXkgPSBFU0M7CisJCWNhc2UgRVNDOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZWx3aW4oZGlhbG9nKTsKKwlyZXR1cm4gLTE7CQkvKiBFU0MgcHJlc3NlZCAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2x4ZGlhbG9nLmMgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbHhkaWFsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWY2YzVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2x4ZGlhbG9nLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiAgZGlhbG9nIC0gRGlzcGxheSBzaW1wbGUgZGlhbG9nIGJveGVzIGZyb20gc2hlbGwgc2NyaXB0cworICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgdm9pZCBVc2FnZShjb25zdCBjaGFyICpuYW1lKTsKKwordHlwZWRlZiBpbnQgKGp1bXBlckZuKSAoY29uc3QgY2hhciAqdGl0bGUsIGludCBhcmdjLCBjb25zdCBjaGFyICpjb25zdCAqYXJndik7CisKK3N0cnVjdCBNb2RlIHsKKwljaGFyICpuYW1lOworCWludCBhcmdtaW4sIGFyZ21heCwgYXJnbW9kOworCWp1bXBlckZuICpqdW1wZXI7Cit9OworCitqdW1wZXJGbiBqX21lbnUsIGpfcmFkaW9saXN0LCBqX3llc25vLCBqX3RleHRib3gsIGpfaW5wdXRib3g7CitqdW1wZXJGbiBqX21zZ2JveCwgal9pbmZvYm94OworCitzdGF0aWMgc3RydWN0IE1vZGUgbW9kZXNbXSA9IHsKKwl7Ii0tbWVudSIsIDksIDAsIDMsIGpfbWVudX0sCisJeyItLXJhZGlvbGlzdCIsIDksIDAsIDMsIGpfcmFkaW9saXN0fSwKKwl7Ii0teWVzbm8iLCA1LCA1LCAxLCBqX3llc25vfSwKKwl7Ii0tdGV4dGJveCIsIDUsIDUsIDEsIGpfdGV4dGJveH0sCisJeyItLWlucHV0Ym94IiwgNSwgNiwgMSwgal9pbnB1dGJveH0sCisJeyItLW1zZ2JveCIsIDUsIDUsIDEsIGpfbXNnYm94fSwKKwl7Ii0taW5mb2JveCIsIDUsIDUsIDEsIGpfaW5mb2JveH0sCisJe05VTEwsIDAsIDAsIDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IE1vZGUgKm1vZGVQdHI7CisKKyNpZmRlZiBMT0NBTEUKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqY29uc3QgKmFyZ3YpCit7CisJaW50IG9mZnNldCA9IDAsIG9wdF9jbGVhciA9IDAsIGVuZF9jb21tb25fb3B0cyA9IDAsIHJldHZhbDsKKwljb25zdCBjaGFyICp0aXRsZSA9IE5VTEw7CisKKyNpZmRlZiBMT0NBTEUKKwkodm9pZClzZXRsb2NhbGUoTENfQUxMLCAiIik7CisjZW5kaWYKKworI2lmZGVmIFRSQUNFCisJdHJhY2UoVFJBQ0VfQ0FMTFMgfCBUUkFDRV9VUERBVEUpOworI2VuZGlmCisJaWYgKGFyZ2MgPCAyKSB7CisJCVVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KC0xKTsKKwl9CisKKwl3aGlsZSAob2Zmc2V0IDwgYXJnYyAtIDEgJiYgIWVuZF9jb21tb25fb3B0cykgewkvKiBDb21tb24gb3B0aW9ucyAqLworCQlpZiAoIXN0cmNtcChhcmd2W29mZnNldCArIDFdLCAiLS10aXRsZSIpKSB7CisJCQlpZiAoYXJnYyAtIG9mZnNldCA8IDMgfHwgdGl0bGUgIT0gTlVMTCkgeworCQkJCVVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoLTEpOworCQkJfSBlbHNlIHsKKwkJCQl0aXRsZSA9IGFyZ3Zbb2Zmc2V0ICsgMl07CisJCQkJb2Zmc2V0ICs9IDI7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W29mZnNldCArIDFdLCAiLS1iYWNrdGl0bGUiKSkgeworCQkJaWYgKGJhY2t0aXRsZSAhPSBOVUxMKSB7CisJCQkJVXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgtMSk7CisJCQl9IGVsc2UgeworCQkJCWJhY2t0aXRsZSA9IGFyZ3Zbb2Zmc2V0ICsgMl07CisJCQkJb2Zmc2V0ICs9IDI7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W29mZnNldCArIDFdLCAiLS1jbGVhciIpKSB7CisJCQlpZiAob3B0X2NsZWFyKSB7CS8qIEhleSwgIi0tY2xlYXIiIGNhbid0IGFwcGVhciB0d2ljZSEgKi8KKwkJCQlVc2FnZShhcmd2WzBdKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0gZWxzZSBpZiAoYXJnYyA9PSAyKSB7CS8qIHdlIG9ubHkgd2FudCB0byBjbGVhciB0aGUgc2NyZWVuICovCisJCQkJaW5pdF9kaWFsb2coKTsKKwkJCQlyZWZyZXNoKCk7CS8qIGluaXRfZGlhbG9nKCkgd2lsbCBjbGVhciB0aGUgc2NyZWVuIGZvciB1cyAqLworCQkJCWVuZF9kaWFsb2coKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJb3B0X2NsZWFyID0gMTsKKwkJCQlvZmZzZXQrKzsKKwkJCX0KKwkJfSBlbHNlCQkvKiBubyBtb3JlIGNvbW1vbiBvcHRpb25zICovCisJCQllbmRfY29tbW9uX29wdHMgPSAxOworCX0KKworCWlmIChhcmdjIC0gMSA9PSBvZmZzZXQpIHsJLyogbm8gbW9yZSBvcHRpb25zICovCisJCVVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KC0xKTsKKwl9CisJLyogdXNlIGEgdGFibGUgdG8gbG9vayBmb3IgdGhlIHJlcXVlc3RlZCBtb2RlLCB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uICovCisKKwlmb3IgKG1vZGVQdHIgPSBtb2RlczsgbW9kZVB0ci0+bmFtZTsgbW9kZVB0cisrKQkvKiBsb29rIGZvciB0aGUgbW9kZSAqLworCQlpZiAoIXN0cmNtcChhcmd2W29mZnNldCArIDFdLCBtb2RlUHRyLT5uYW1lKSkKKwkJCWJyZWFrOworCisJaWYgKCFtb2RlUHRyLT5uYW1lKQorCQlVc2FnZShhcmd2WzBdKTsKKwlpZiAoYXJnYyAtIG9mZnNldCA8IG1vZGVQdHItPmFyZ21pbikKKwkJVXNhZ2UoYXJndlswXSk7CisJaWYgKG1vZGVQdHItPmFyZ21heCAmJiBhcmdjIC0gb2Zmc2V0ID4gbW9kZVB0ci0+YXJnbWF4KQorCQlVc2FnZShhcmd2WzBdKTsKKworCWluaXRfZGlhbG9nKCk7CisJcmV0dmFsID0gKCoobW9kZVB0ci0+anVtcGVyKSkgKHRpdGxlLCBhcmdjIC0gb2Zmc2V0LCBhcmd2ICsgb2Zmc2V0KTsKKworCWlmIChvcHRfY2xlYXIpIHsJLyogY2xlYXIgc2NyZWVuIGJlZm9yZSBleGl0ICovCisJCWF0dHJfY2xlYXIoc3Rkc2NyLCBMSU5FUywgQ09MUywgc2NyZWVuX2F0dHIpOworCQlyZWZyZXNoKCk7CisJfQorCWVuZF9kaWFsb2coKTsKKworCWV4aXQocmV0dmFsKTsKK30KKworLyoKKyAqIFByaW50IHByb2dyYW0gdXNhZ2UKKyAqLworc3RhdGljIHZvaWQgVXNhZ2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlwKK1xuZGlhbG9nLCBieSBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKS5cCitcbiAgcGF0Y2hlZCBieSBTdHVhcnQgSGVyYmVydCAoUy5IZXJiZXJ0QHNoZWYuYWMudWspXAorXG4gIG1vZGlmaWVkL2d1dHRlZCBmb3IgdXNlIGFzIGEgTGludXgga2VybmVsIGNvbmZpZyB0b29sIGJ5IFwKK1xuICBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXB3QGNmdy5jb20pXAorXG5cCitcbiogRGlzcGxheSBkaWFsb2cgYm94ZXMgZnJvbSBzaGVsbCBzY3JpcHRzICpcCitcblwKK1xuVXNhZ2U6ICVzIC0tY2xlYXJcCitcbiAgICAgICAlcyBbLS10aXRsZSA8dGl0bGU+XSBbLS1iYWNrdGl0bGUgPGJhY2t0aXRsZT5dIC0tY2xlYXIgPEJveCBvcHRpb25zPlwKK1xuXAorXG5Cb3ggb3B0aW9uczpcCitcblwKK1xuICAtLW1lbnUgICAgICA8dGV4dD4gPGhlaWdodD4gPHdpZHRoPiA8bWVudSBoZWlnaHQ+IDx0YWcxPiA8aXRlbTE+Li4uXAorXG4gIC0tcmFkaW9saXN0IDx0ZXh0PiA8aGVpZ2h0PiA8d2lkdGg+IDxsaXN0IGhlaWdodD4gPHRhZzE+IDxpdGVtMT4gPHN0YXR1czE+Li4uXAorXG4gIC0tdGV4dGJveCAgIDxmaWxlPiA8aGVpZ2h0PiA8d2lkdGg+XAorXG4gIC0taW5wdXRib3ggIDx0ZXh0PiA8aGVpZ2h0PiA8d2lkdGg+IFs8aW5pdD5dXAorXG4gIC0teWVzbm8gICAgIDx0ZXh0PiA8aGVpZ2h0PiA8d2lkdGg+XAorXG4iLCBuYW1lLCBuYW1lKTsKKwlleGl0KC0xKTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHJvZ3JhbSBqdW1wZXJzCisgKi8KKworaW50IGpfbWVudShjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKmNvbnN0ICphdikKK3sKKwlyZXR1cm4gZGlhbG9nX21lbnUodCwgYXZbMl0sIGF0b2koYXZbM10pLCBhdG9pKGF2WzRdKSwKKwkJCSAgIGF0b2koYXZbNV0pLCBhdls2XSwgKGFjIC0gNikgLyAyLCBhdiArIDcpOworfQorCitpbnQgal9yYWRpb2xpc3QoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICpjb25zdCAqYXYpCit7CisJcmV0dXJuIGRpYWxvZ19jaGVja2xpc3QodCwgYXZbMl0sIGF0b2koYXZbM10pLCBhdG9pKGF2WzRdKSwKKwkJCQlhdG9pKGF2WzVdKSwgKGFjIC0gNikgLyAzLCBhdiArIDYpOworfQorCitpbnQgal90ZXh0Ym94KGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqY29uc3QgKmF2KQoreworCXJldHVybiBkaWFsb2dfdGV4dGJveCh0LCBhdlsyXSwgYXRvaShhdlszXSksIGF0b2koYXZbNF0pKTsKK30KKworaW50IGpfeWVzbm8oY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICpjb25zdCAqYXYpCit7CisJcmV0dXJuIGRpYWxvZ195ZXNubyh0LCBhdlsyXSwgYXRvaShhdlszXSksIGF0b2koYXZbNF0pKTsKK30KKworaW50IGpfaW5wdXRib3goY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICpjb25zdCAqYXYpCit7CisJaW50IHJldCA9IGRpYWxvZ19pbnB1dGJveCh0LCBhdlsyXSwgYXRvaShhdlszXSksIGF0b2koYXZbNF0pLAorCQkJCSAgYWMgPT0gNiA/IGF2WzVdIDogKGNoYXIgKilOVUxMKTsKKwlpZiAocmV0ID09IDApCisJCWZwcmludGYoc3RkZXJyLCBkaWFsb2dfaW5wdXRfcmVzdWx0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgal9tc2dib3goY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICpjb25zdCAqYXYpCit7CisJcmV0dXJuIGRpYWxvZ19tc2dib3godCwgYXZbMl0sIGF0b2koYXZbM10pLCBhdG9pKGF2WzRdKSwgMSk7Cit9CisKK2ludCBqX2luZm9ib3goY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICpjb25zdCAqYXYpCit7CisJcmV0dXJuIGRpYWxvZ19tc2dib3godCwgYXZbMl0sIGF0b2koYXZbM10pLCBhdG9pKGF2WzRdKSwgMCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbWVudWJveC5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL21lbnVib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ1MDFiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL21lbnVib3guYwpAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqICBtZW51Ym94LmMgLS0gaW1wbGVtZW50cyB0aGUgbWVudSBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXB3QGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogIENoYW5nZXMgYnkgQ2xpZmZvcmQgV29sZiAoZ29kQGNsaWZmb3JkLmF0KQorICoKKyAqICBbIDE5OTgtMDYtMTMgXQorICoKKyAqICAgICopICBBIGJ1Z2ZpeCBmb3IgdGhlIFBhZ2UtRG93biBwcm9ibGVtCisgKgorICogICAgKikgIEZvcm1lcmx5IHdoZW4gSSB1c2VkIFBhZ2UgRG93biBhbmQgUGFnZSBVcCwgdGhlIGN1cnNvciB3b3VsZCBiZSBzZXQKKyAqICAgICAgICB0byB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIG1lbnUgYm94LiAgTm93IGx4ZGlhbG9nIGlzIGEgYml0CisgKiAgICAgICAgc21hcnRlciBhbmQgd29ya3MgbW9yZSBsaWtlIG90aGVyIG1lbnUgc3lzdGVtcyAoanVzdCBoYXZlIGEgbG9vayBhdAorICogICAgICAgIGl0KS4KKyAqCisgKiAgICAqKSAgRm9ybWVybHkgaWYgSSBzZWxlY3RlZCBzb21ldGhpbmcgbXkgc2Nyb2xsaW5nIHdvdWxkIGJlIGJyb2tlbiBiZWNhdXNlCisgKiAgICAgICAgbHhkaWFsb2cgaXMgcmUtaW52b2tlZCBieSB0aGUgTWVudWNvbmZpZyBzaGVsbCBzY3JpcHQsIGNhbid0CisgKiAgICAgICAgcmVtZW1iZXIgdGhlIGxhc3Qgc2Nyb2xsaW5nIHBvc2l0aW9uLCBhbmQganVzdCBzZXRzIGl0IHNvIHRoYXQgdGhlCisgKiAgICAgICAgY3Vyc29yIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIGJveC4gIE5vdyBpdCB3cml0ZXMgdGhlIHRlbXBvcmFyeSBmaWxlCisgKiAgICAgICAgbHhkaWFsb2cuc2NybHRtcCB3aGljaCBjb250YWlucyB0aGlzIGluZm9ybWF0aW9uLiBUaGUgZmlsZSBpcworICogICAgICAgIGRlbGV0ZWQgYnkgbHhkaWFsb2cgaWYgdGhlIHVzZXIgbGVhdmVzIGEgc3VibWVudSBvciBlbnRlcnMgYSBuZXcKKyAqICAgICAgICBvbmUsIGJ1dCBpdCB3b3VsZCBiZSBuaWNlIGlmIE1lbnVjb25maWcgY291bGQgbWFrZSBhbm90aGVyICJybSAtZiIKKyAqICAgICAgICBqdXN0IHRvIGJlIHN1cmUuICBKdXN0IHRyeSBpdCBvdXQgLSB5b3Ugd2lsbCByZWNvZ25pc2UgYSBkaWZmZXJlbmNlIQorICoKKyAqICBbIDE5OTgtMDYtMTQgXQorICoKKyAqICAgICopICBOb3cgbHhkaWFsb2cgaXMgY3Jhc2gtc2FmZSBhZ2FpbnN0IGJyb2tlbiAibHhkaWFsb2cuc2NybHRtcCIgZmlsZXMKKyAqICAgICAgICBhbmQgbWVudXMgY2hhbmdlIHRoZWlyIHNpemUgb24gdGhlIGZseS4KKyAqCisgKiAgICAqKSAgSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBsYXN0IHNjcm9sbGluZyBwb3NpdGlvbiBpcyBub3Qgc2F2ZWQgYnkKKyAqICAgICAgICBseGRpYWxvZywgaXQgc2V0cyB0aGUgc2Nyb2xsaW5nIHNvIHRoYXQgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgaW4gdGhlCisgKiAgICAgICAgbWlkZGxlIG9mIHRoZSBtZW51IGJveCwgbm90IGF0IHRoZSBib3R0b20uCisgKgorICogMDIgSmFudWFyeSAxOTk5LCBNaWNoYWVsIEVsaXphYmV0aCBDaGFzdGFpbiAobWVjQHNob3V0Lm5ldCkKKyAqIFJlc2V0ICdzY3JvbGwnIHRvIDAgaWYgdGhlIHZhbHVlIGZyb20gbHhkaWFsb2cuc2NybHRtcCBpcyBib2d1cy4KKyAqIFRoaXMgZml4ZXMgYSBidWcgaW4gTWVudWNvbmZpZyB3aGVyZSB1c2luZyAnICcgdG8gZGVzY2VuZCBpbnRvIG1lbnVzCisgKiB3b3VsZCBsZWF2ZSBtaXMtc3luY2hyb25pemVkIGx4ZGlhbG9nLnNjcmx0bXAgZmlsZXMgbHlpbmcgYXJvdW5kLAorICogZnNjYW5mIHdvdWxkIHJlYWQgaW4gJ3Njcm9sbCcsIGFuZCBldmVudHVhbGx5IHRoYXQgdmFsdWUgd291bGQgZ2V0IHVzZWQuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgaW50IG1lbnVfd2lkdGgsIGl0ZW1feDsKKworLyoKKyAqIFByaW50IG1lbnUgaXRlbQorICovCitzdGF0aWMgdm9pZCBkb19wcmludF9pdGVtKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqaXRlbSwgaW50IGNob2ljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbGVjdGVkLCBpbnQgaG90a2V5KQoreworCWludCBqOworCWNoYXIgKm1lbnVfaXRlbSA9IG1hbGxvYyhtZW51X3dpZHRoICsgMSk7CisKKwlzdHJuY3B5KG1lbnVfaXRlbSwgaXRlbSwgbWVudV93aWR0aCAtIGl0ZW1feCk7CisJbWVudV9pdGVtW21lbnVfd2lkdGhdID0gMDsKKwlqID0gZmlyc3RfYWxwaGEobWVudV9pdGVtLCAiWXlObk1tSGgiKTsKKworCS8qIENsZWFyICdyZXNpZHVlJyBvZiBsYXN0IGl0ZW0gKi8KKwl3YXR0cnNldCh3aW4sIG1lbnVib3hfYXR0cik7CisJd21vdmUod2luLCBjaG9pY2UsIDApOworI2lmIE9MRF9OQ1VSU0VTCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IG1lbnVfd2lkdGg7IGkrKykKKwkJCXdhZGRjaCh3aW4sICcgJyk7CisJfQorI2Vsc2UKKwl3Y2xydG9lb2wod2luKTsKKyNlbmRpZgorCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBpdGVtX3NlbGVjdGVkX2F0dHIgOiBpdGVtX2F0dHIpOworCW12d2FkZHN0cih3aW4sIGNob2ljZSwgaXRlbV94LCBtZW51X2l0ZW0pOworCWlmIChob3RrZXkpIHsKKwkJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IHRhZ19rZXlfc2VsZWN0ZWRfYXR0ciA6IHRhZ19rZXlfYXR0cik7CisJCW12d2FkZGNoKHdpbiwgY2hvaWNlLCBpdGVtX3ggKyBqLCBtZW51X2l0ZW1bal0pOworCX0KKwlpZiAoc2VsZWN0ZWQpIHsKKwkJd21vdmUod2luLCBjaG9pY2UsIGl0ZW1feCArIDEpOworCX0KKwlmcmVlKG1lbnVfaXRlbSk7CisJd3JlZnJlc2god2luKTsKK30KKworI2RlZmluZSBwcmludF9pdGVtKGluZGV4LCBjaG9pY2UsIHNlbGVjdGVkKSBcCitkbyB7XAorCWludCBob3RrZXkgPSAoaXRlbXNbKGluZGV4KSAqIDJdWzBdICE9ICc6Jyk7IFwKKwlkb19wcmludF9pdGVtKG1lbnUsIGl0ZW1zWyhpbmRleCkgKiAyICsgMV0sIGNob2ljZSwgc2VsZWN0ZWQsIGhvdGtleSk7IFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBQcmludCB0aGUgc2Nyb2xsIGluZGljYXRvcnMuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2Fycm93cyhXSU5ET1cgKiB3aW4sIGludCBpdGVtX25vLCBpbnQgc2Nyb2xsLCBpbnQgeSwgaW50IHgsCisJCQkgaW50IGhlaWdodCkKK3sKKwlpbnQgY3VyX3ksIGN1cl94OworCisJZ2V0eXgod2luLCBjdXJfeSwgY3VyX3gpOworCisJd21vdmUod2luLCB5LCB4KTsKKworCWlmIChzY3JvbGwgPiAwKSB7CisJCXdhdHRyc2V0KHdpbiwgdWFycm93X2F0dHIpOworCQl3YWRkY2god2luLCBBQ1NfVUFSUk9XKTsKKwkJd2FkZHN0cih3aW4sICIoLSkiKTsKKwl9IGVsc2UgeworCQl3YXR0cnNldCh3aW4sIG1lbnVib3hfYXR0cik7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJfQorCisJeSA9IHkgKyBoZWlnaHQgKyAxOworCXdtb3ZlKHdpbiwgeSwgeCk7CisJd3JlZnJlc2god2luKTsKKworCWlmICgoaGVpZ2h0IDwgaXRlbV9ubykgJiYgKHNjcm9sbCArIGhlaWdodCA8IGl0ZW1fbm8pKSB7CisJCXdhdHRyc2V0KHdpbiwgZGFycm93X2F0dHIpOworCQl3YWRkY2god2luLCBBQ1NfREFSUk9XKTsKKwkJd2FkZHN0cih3aW4sICIoKykiKTsKKwl9IGVsc2UgeworCQl3YXR0cnNldCh3aW4sIG1lbnVib3hfYm9yZGVyX2F0dHIpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCX0KKworCXdtb3ZlKHdpbiwgY3VyX3ksIGN1cl94KTsKKwl3cmVmcmVzaCh3aW4pOworfQorCisvKgorICogRGlzcGxheSB0aGUgdGVybWluYXRpb24gYnV0dG9ucy4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYnV0dG9ucyhXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IHNlbGVjdGVkKQoreworCWludCB4ID0gd2lkdGggLyAyIC0gMTY7CisJaW50IHkgPSBoZWlnaHQgLSAyOworCisJcHJpbnRfYnV0dG9uKHdpbiwgIlNlbGVjdCIsIHksIHgsIHNlbGVjdGVkID09IDApOworCXByaW50X2J1dHRvbih3aW4sICIgRXhpdCAiLCB5LCB4ICsgMTIsIHNlbGVjdGVkID09IDEpOworCXByaW50X2J1dHRvbih3aW4sICIgSGVscCAiLCB5LCB4ICsgMjQsIHNlbGVjdGVkID09IDIpOworCisJd21vdmUod2luLCB5LCB4ICsgMSArIDEyICogc2VsZWN0ZWQpOworCXdyZWZyZXNoKHdpbik7Cit9CisKKy8qIHNjcm9sbCB1cCBuIGxpbmVzIChuIG1heSBiZSBuZWdhdGl2ZSkgKi8KK3N0YXRpYyB2b2lkIGRvX3Njcm9sbChXSU5ET1cgKndpbiwgaW50ICpzY3JvbGwsIGludCBuKQoreworCS8qIFNjcm9sbCBtZW51IHVwICovCisJc2Nyb2xsb2sod2luLCBUUlVFKTsKKwl3c2NybCh3aW4sIG4pOworCXNjcm9sbG9rKHdpbiwgRkFMU0UpOworCSpzY3JvbGwgPSAqc2Nyb2xsICsgbjsKKwl3cmVmcmVzaCh3aW4pOworfQorCisvKgorICogRGlzcGxheSBhIG1lbnUgZm9yIGNob29zaW5nIGFtb25nIGEgbnVtYmVyIG9mIG9wdGlvbnMKKyAqLworaW50IGRpYWxvZ19tZW51KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKwkJaW50IG1lbnVfaGVpZ2h0LCBjb25zdCBjaGFyICpjdXJyZW50LCBpbnQgaXRlbV9ubywKKwkJY29uc3QgY2hhciAqY29uc3QgKml0ZW1zKQoreworCWludCBpLCBqLCB4LCB5LCBib3hfeCwgYm94X3k7CisJaW50IGtleSA9IDAsIGJ1dHRvbiA9IDAsIHNjcm9sbCA9IDAsIGNob2ljZSA9IDA7CisJaW50IGZpcnN0X2l0ZW0gPSAgMCwgbWF4X2Nob2ljZTsKKwlXSU5ET1cgKmRpYWxvZywgKm1lbnU7CisJRklMRSAqZjsKKworCW1heF9jaG9pY2UgPSBNSU4obWVudV9oZWlnaHQsIGl0ZW1fbm8pOworCisJLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisJeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKwl5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKwlkcmF3X3NoYWRvdyhzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisJZGlhbG9nID0gbmV3d2luKGhlaWdodCwgd2lkdGgsIHksIHgpOworCWtleXBhZChkaWFsb2csIFRSVUUpOworCisJZHJhd19ib3goZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworCXdhdHRyc2V0KGRpYWxvZywgYm9yZGVyX2F0dHIpOworCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwl3YmtnZHNldChkaWFsb2csIGRpYWxvZ19hdHRyICYgQV9DT0xPUik7CisJd2FkZGNoKGRpYWxvZywgQUNTX1JURUUpOworCisJcHJpbnRfdGl0bGUoZGlhbG9nLCB0aXRsZSwgd2lkdGgpOworCisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJcHJpbnRfYXV0b3dyYXAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMyk7CisKKwltZW51X3dpZHRoID0gd2lkdGggLSA2OworCWJveF95ID0gaGVpZ2h0IC0gbWVudV9oZWlnaHQgLSA1OworCWJveF94ID0gKHdpZHRoIC0gbWVudV93aWR0aCkgLyAyIC0gMTsKKworCS8qIGNyZWF0ZSBuZXcgd2luZG93IGZvciB0aGUgbWVudSAqLworCW1lbnUgPSBzdWJ3aW4oZGlhbG9nLCBtZW51X2hlaWdodCwgbWVudV93aWR0aCwKKwkJICAgICAgeSArIGJveF95ICsgMSwgeCArIGJveF94ICsgMSk7CisJa2V5cGFkKG1lbnUsIFRSVUUpOworCisJLyogZHJhdyBhIGJveCBhcm91bmQgdGhlIG1lbnUgaXRlbXMgKi8KKwlkcmF3X2JveChkaWFsb2csIGJveF95LCBib3hfeCwgbWVudV9oZWlnaHQgKyAyLCBtZW51X3dpZHRoICsgMiwKKwkJIG1lbnVib3hfYm9yZGVyX2F0dHIsIG1lbnVib3hfYXR0cik7CisKKwlpdGVtX3ggPSAobWVudV93aWR0aCAtIDcwKSAvIDI7CisKKwkvKiBTZXQgY2hvaWNlIHRvIGRlZmF1bHQgaXRlbSAqLworCWZvciAoaSA9IDA7IGkgPCBpdGVtX25vOyBpKyspCisJCWlmIChzdHJjbXAoY3VycmVudCwgaXRlbXNbaSAqIDJdKSA9PSAwKQorCQkJY2hvaWNlID0gaTsKKworCS8qIGdldCB0aGUgc2Nyb2xsIGluZm8gZnJvbSB0aGUgdGVtcCBmaWxlICovCisJaWYgKChmID0gZm9wZW4oImx4ZGlhbG9nLnNjcmx0bXAiLCAiciIpKSAhPSBOVUxMKSB7CisJCWlmICgoZnNjYW5mKGYsICIlZFxuIiwgJnNjcm9sbCkgPT0gMSkgJiYgKHNjcm9sbCA8PSBjaG9pY2UpICYmCisJCSAgICAoc2Nyb2xsICsgbWF4X2Nob2ljZSA+IGNob2ljZSkgJiYgKHNjcm9sbCA+PSAwKSAmJgorCQkgICAgKHNjcm9sbCArIG1heF9jaG9pY2UgPD0gaXRlbV9ubykpIHsKKwkJCWZpcnN0X2l0ZW0gPSBzY3JvbGw7CisJCQljaG9pY2UgPSBjaG9pY2UgLSBzY3JvbGw7CisJCQlmY2xvc2UoZik7CisJCX0gZWxzZSB7CisJCQlzY3JvbGwgPSAwOworCQkJcmVtb3ZlKCJseGRpYWxvZy5zY3JsdG1wIik7CisJCQlmY2xvc2UoZik7CisJCQlmID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoKGNob2ljZSA+PSBtYXhfY2hvaWNlKSB8fCAoZiA9PSBOVUxMICYmIGNob2ljZSA+PSBtYXhfY2hvaWNlIC8gMikpIHsKKwkJaWYgKGNob2ljZSA+PSBpdGVtX25vIC0gbWF4X2Nob2ljZSAvIDIpCisJCQlzY3JvbGwgPSBmaXJzdF9pdGVtID0gaXRlbV9ubyAtIG1heF9jaG9pY2U7CisJCWVsc2UKKwkJCXNjcm9sbCA9IGZpcnN0X2l0ZW0gPSBjaG9pY2UgLSBtYXhfY2hvaWNlIC8gMjsKKwkJY2hvaWNlID0gY2hvaWNlIC0gc2Nyb2xsOworCX0KKworCS8qIFByaW50IHRoZSBtZW51ICovCisJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQlwcmludF9pdGVtKGZpcnN0X2l0ZW0gKyBpLCBpLCBpID09IGNob2ljZSk7CisJfQorCisJd25vdXRyZWZyZXNoKG1lbnUpOworCisJcHJpbnRfYXJyb3dzKGRpYWxvZywgaXRlbV9ubywgc2Nyb2xsLAorCQkgICAgIGJveF95LCBib3hfeCArIGl0ZW1feCArIDEsIG1lbnVfaGVpZ2h0KTsKKworCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwl3bW92ZShtZW51LCBjaG9pY2UsIGl0ZW1feCArIDEpOworCXdyZWZyZXNoKG1lbnUpOworCisJd2hpbGUgKGtleSAhPSBFU0MpIHsKKwkJa2V5ID0gd2dldGNoKG1lbnUpOworCisJCWlmIChrZXkgPCAyNTYgJiYgaXNhbHBoYShrZXkpKQorCQkJa2V5ID0gdG9sb3dlcihrZXkpOworCisJCWlmIChzdHJjaHIoInlubWgiLCBrZXkpKQorCQkJaSA9IG1heF9jaG9pY2U7CisJCWVsc2UgeworCQkJZm9yIChpID0gY2hvaWNlICsgMTsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQkJCWogPSBmaXJzdF9hbHBoYShpdGVtc1soc2Nyb2xsICsgaSkgKiAyICsgMV0sICJZeU5uTW1IaCIpOworCQkJCWlmIChrZXkgPT0gdG9sb3dlcihpdGVtc1soc2Nyb2xsICsgaSkgKiAyICsgMV1bal0pKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpID09IG1heF9jaG9pY2UpCisJCQkJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQkJCQlqID0gZmlyc3RfYWxwaGEoaXRlbXMgWyhzY3JvbGwgKyBpKSAqIDIgKyAxXSwgIll5Tm5NbUhoIik7CisJCQkJCWlmIChrZXkgPT0gdG9sb3dlcihpdGVtc1soc2Nyb2xsICsgaSkgKiAyICsgMV1bal0pKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQl9CisKKwkJaWYgKGkgPCBtYXhfY2hvaWNlIHx8CisJCSAgICBrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSBLRVlfRE9XTiB8fAorCQkgICAga2V5ID09ICctJyB8fCBrZXkgPT0gJysnIHx8CisJCSAgICBrZXkgPT0gS0VZX1BQQUdFIHx8IGtleSA9PSBLRVlfTlBBR0UpIHsKKwkJCS8qIFJlbW92ZSBoaWdobGlndCBvZiBjdXJyZW50IGl0ZW0gKi8KKwkJCXByaW50X2l0ZW0oc2Nyb2xsICsgY2hvaWNlLCBjaG9pY2UsIEZBTFNFKTsKKworCQkJaWYgKGtleSA9PSBLRVlfVVAgfHwga2V5ID09ICctJykgeworCQkJCWlmIChjaG9pY2UgPCAyICYmIHNjcm9sbCkgeworCQkJCQkvKiBTY3JvbGwgbWVudSBkb3duICovCisJCQkJCWRvX3Njcm9sbChtZW51LCAmc2Nyb2xsLCAtMSk7CisKKwkJCQkJcHJpbnRfaXRlbShzY3JvbGwsIDAsIEZBTFNFKTsKKwkJCQl9IGVsc2UKKwkJCQkJY2hvaWNlID0gTUFYKGNob2ljZSAtIDEsIDApOworCisJCQl9IGVsc2UgaWYgKGtleSA9PSBLRVlfRE9XTiB8fCBrZXkgPT0gJysnKSB7CisJCQkJcHJpbnRfaXRlbShzY3JvbGwrY2hvaWNlLCBjaG9pY2UsIEZBTFNFKTsKKworCQkJCWlmICgoY2hvaWNlID4gbWF4X2Nob2ljZSAtIDMpICYmCisJCQkJICAgIChzY3JvbGwgKyBtYXhfY2hvaWNlIDwgaXRlbV9ubykpIHsKKwkJCQkJLyogU2Nyb2xsIG1lbnUgdXAgKi8KKwkJCQkJZG9fc2Nyb2xsKG1lbnUsICZzY3JvbGwsIDEpOworCisJCQkJCXByaW50X2l0ZW0oc2Nyb2xsK21heF9jaG9pY2UgLSAxLAorCQkJCQkJICAgbWF4X2Nob2ljZSAtIDEsIEZBTFNFKTsKKwkJCQl9IGVsc2UKKwkJCQkJY2hvaWNlID0gTUlOKGNob2ljZSArIDEsIG1heF9jaG9pY2UgLSAxKTsKKworCQkJfSBlbHNlIGlmIChrZXkgPT0gS0VZX1BQQUdFKSB7CisJCQkJc2Nyb2xsb2sobWVudSwgVFJVRSk7CisJCQkJZm9yIChpID0gMDsgKGkgPCBtYXhfY2hvaWNlKTsgaSsrKSB7CisJCQkJCWlmIChzY3JvbGwgPiAwKSB7CisJCQkJCQlkb19zY3JvbGwobWVudSwgJnNjcm9sbCwgLTEpOworCQkJCQkJcHJpbnRfaXRlbShzY3JvbGwsIDAsIEZBTFNFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChjaG9pY2UgPiAwKQorCQkJCQkJCWNob2ljZS0tOworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKGtleSA9PSBLRVlfTlBBR0UpIHsKKwkJCQlmb3IgKGkgPSAwOyAoaSA8IG1heF9jaG9pY2UpOyBpKyspIHsKKwkJCQkJaWYgKHNjcm9sbCArIG1heF9jaG9pY2UgPCBpdGVtX25vKSB7CisJCQkJCQlkb19zY3JvbGwobWVudSwgJnNjcm9sbCwgMSk7CisJCQkJCQlwcmludF9pdGVtKHNjcm9sbCttYXhfY2hvaWNlLTEsCisJCQkJCQkJICAgbWF4X2Nob2ljZSAtIDEsIEZBTFNFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChjaG9pY2UgKyAxIDwgbWF4X2Nob2ljZSkKKwkJCQkJCQljaG9pY2UrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZQorCQkJCWNob2ljZSA9IGk7CisKKwkJCXByaW50X2l0ZW0oc2Nyb2xsICsgY2hvaWNlLCBjaG9pY2UsIFRSVUUpOworCisJCQlwcmludF9hcnJvd3MoZGlhbG9nLCBpdGVtX25vLCBzY3JvbGwsCisJCQkJICAgICBib3hfeSwgYm94X3ggKyBpdGVtX3ggKyAxLCBtZW51X2hlaWdodCk7CisKKwkJCXdub3V0cmVmcmVzaChkaWFsb2cpOworCQkJd3JlZnJlc2gobWVudSk7CisKKwkJCWNvbnRpbnVlOwkvKiB3YWl0IGZvciBhbm90aGVyIGtleSBwcmVzcyAqLworCQl9CisKKwkJc3dpdGNoIChrZXkpIHsKKwkJY2FzZSBLRVlfTEVGVDoKKwkJY2FzZSBUQUI6CisJCWNhc2UgS0VZX1JJR0hUOgorCQkJYnV0dG9uID0gKChrZXkgPT0gS0VZX0xFRlQgPyAtLWJ1dHRvbiA6ICsrYnV0dG9uKSA8IDApCisJCQkgICAgPyAyIDogKGJ1dHRvbiA+IDIgPyAwIDogYnV0dG9uKTsKKworCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIGJ1dHRvbik7CisJCQl3cmVmcmVzaChtZW51KTsKKwkJCWJyZWFrOworCQljYXNlICcgJzoKKwkJY2FzZSAncyc6CisJCWNhc2UgJ3knOgorCQljYXNlICduJzoKKwkJY2FzZSAnbSc6CisJCWNhc2UgJy8nOgorCQkJLyogc2F2ZSBzY3JvbGwgaW5mbyAqLworCQkJaWYgKChmID0gZm9wZW4oImx4ZGlhbG9nLnNjcmx0bXAiLCAidyIpKSAhPSBOVUxMKSB7CisJCQkJZnByaW50ZihmLCAiJWRcbiIsIHNjcm9sbCk7CisJCQkJZmNsb3NlKGYpOworCQkJfQorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDJdKTsKKwkJCXN3aXRjaCAoa2V5KSB7CisJCQljYXNlICdzJzoKKwkJCQlyZXR1cm4gMzsKKwkJCWNhc2UgJ3knOgorCQkJCXJldHVybiAzOworCQkJY2FzZSAnbic6CisJCQkJcmV0dXJuIDQ7CisJCQljYXNlICdtJzoKKwkJCQlyZXR1cm4gNTsKKwkJCWNhc2UgJyAnOgorCQkJCXJldHVybiA2OworCQkJY2FzZSAnLyc6CisJCQkJcmV0dXJuIDc7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQkJYnV0dG9uID0gMjsKKwkJY2FzZSAnXG4nOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlpZiAoYnV0dG9uID09IDIpCisJCQkJZnByaW50ZihzdGRlcnIsICIlcyBcIiVzXCJcbiIsCisJCQkJCWl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMl0sCisJCQkJCWl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMiArIDFdICsKKwkJCQkJZmlyc3RfYWxwaGEoaXRlbXMgWyhzY3JvbGwgKyBjaG9pY2UpICogMiArIDFdLCAiIikpOworCQkJZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsCisJCQkJCWl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMl0pOworCisJCQlyZW1vdmUoImx4ZGlhbG9nLnNjcmx0bXAiKTsKKwkJCXJldHVybiBidXR0b247CisJCWNhc2UgJ2UnOgorCQljYXNlICd4JzoKKwkJCWtleSA9IEVTQzsKKwkJY2FzZSBFU0M6CisJCQlicmVhazsKKwkJfQorCX0KKworCWRlbHdpbihkaWFsb2cpOworCXJlbW92ZSgibHhkaWFsb2cuc2NybHRtcCIpOworCXJldHVybiAtMTsJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbXNnYm94LmMgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbXNnYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyM2Y1NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9tc2dib3guYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogIG1zZ2JveC5jIC0tIGltcGxlbWVudHMgdGhlIG1lc3NhZ2UgYm94IGFuZCBpbmZvIGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcHdAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworLyoKKyAqIERpc3BsYXkgYSBtZXNzYWdlIGJveC4gUHJvZ3JhbSB3aWxsIHBhdXNlIGFuZCBkaXNwbGF5IGFuICJPSyIgYnV0dG9uCisgKiBpZiB0aGUgcGFyYW1ldGVyICdwYXVzZScgaXMgbm9uLXplcm8uCisgKi8KK2ludCBkaWFsb2dfbXNnYm94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIGludCBwYXVzZSkKK3sKKwlpbnQgaSwgeCwgeSwga2V5ID0gMDsKKwlXSU5ET1cgKmRpYWxvZzsKKworCS8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworCXggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisJeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisJZHJhd19zaGFkb3coc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworCWRpYWxvZyA9IG5ld3dpbihoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKwlrZXlwYWQoZGlhbG9nLCBUUlVFKTsKKworCWRyYXdfYm94KGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwgZGlhbG9nX2F0dHIsIGJvcmRlcl9hdHRyKTsKKworCXByaW50X3RpdGxlKGRpYWxvZywgdGl0bGUsIHdpZHRoKTsKKworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXByaW50X2F1dG93cmFwKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDIpOworCisJaWYgKHBhdXNlKSB7CisJCXdhdHRyc2V0KGRpYWxvZywgYm9yZGVyX2F0dHIpOworCQltdndhZGRjaChkaWFsb2csIGhlaWdodCAtIDMsIDAsIEFDU19MVEVFKTsKKwkJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCQkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwkJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJCXdhZGRjaChkaWFsb2csIEFDU19SVEVFKTsKKworCQlwcmludF9idXR0b24oZGlhbG9nLCAiICBPayAgIiwgaGVpZ2h0IC0gMiwgd2lkdGggLyAyIC0gNCwgVFJVRSk7CisKKwkJd3JlZnJlc2goZGlhbG9nKTsKKwkJd2hpbGUgKGtleSAhPSBFU0MgJiYga2V5ICE9ICdcbicgJiYga2V5ICE9ICcgJyAmJgorCQkgICAgICAga2V5ICE9ICdPJyAmJiBrZXkgIT0gJ28nICYmIGtleSAhPSAnWCcgJiYga2V5ICE9ICd4JykKKwkJCWtleSA9IHdnZXRjaChkaWFsb2cpOworCX0gZWxzZSB7CisJCWtleSA9ICdcbic7CisJCXdyZWZyZXNoKGRpYWxvZyk7CisJfQorCisJZGVsd2luKGRpYWxvZyk7CisJcmV0dXJuIGtleSA9PSBFU0MgPyAtMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdGV4dGJveC5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3RleHRib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRhZTQxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3RleHRib3guYwpAQCAtMCwwICsxLDUzMSBAQAorLyoKKyAqICB0ZXh0Ym94LmMgLS0gaW1wbGVtZW50cyB0aGUgdGV4dCBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworc3RhdGljIHZvaWQgYmFja19saW5lcyhpbnQgbik7CitzdGF0aWMgdm9pZCBwcmludF9wYWdlKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKK3N0YXRpYyB2b2lkIHByaW50X2xpbmUoV0lORE9XICogd2luLCBpbnQgcm93LCBpbnQgd2lkdGgpOworc3RhdGljIGNoYXIgKmdldF9saW5lKHZvaWQpOworc3RhdGljIHZvaWQgcHJpbnRfcG9zaXRpb24oV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworCitzdGF0aWMgaW50IGhzY3JvbGwsIGZkLCBmaWxlX3NpemUsIGJ5dGVzX3JlYWQ7CitzdGF0aWMgaW50IGJlZ2luX3JlYWNoZWQgPSAxLCBlbmRfcmVhY2hlZCwgcGFnZV9sZW5ndGg7CitzdGF0aWMgY2hhciAqYnVmLCAqcGFnZTsKKworLyoKKyAqIERpc3BsYXkgdGV4dCBmcm9tIGEgZmlsZSBpbiBhIGRpYWxvZyBib3guCisgKi8KK2ludCBkaWFsb2dfdGV4dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworCWludCBpLCB4LCB5LCBjdXJfeCwgY3VyX3ksIGZwb3MsIGtleSA9IDA7CisJaW50IHBhc3NlZF9lbmQ7CisJV0lORE9XICpkaWFsb2csICp0ZXh0OworCisJLyogT3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nICovCisJaWYgKChmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpKSA9PSAtMSkgeworCQllbmR3aW4oKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbkNhbid0IG9wZW4gaW5wdXQgZmlsZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCWV4aXQoLTEpOworCX0KKwkvKiBHZXQgZmlsZSBzaXplLiBBY3R1YWxseSwgJ2ZpbGVfc2l6ZScgaXMgdGhlIHJlYWwgZmlsZSBzaXplIC0gMSwKKwkgICBzaW5jZSBpdCdzIG9ubHkgdGhlIGxhc3QgYnl0ZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nICovCisJaWYgKChmaWxlX3NpemUgPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpKSA9PSAtMSkgeworCQllbmR3aW4oKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIGdldHRpbmcgZmlsZSBzaXplIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCS8qIFJlc3RvcmUgZmlsZSBwb2ludGVyIHRvIGJlZ2lubmluZyBvZiBmaWxlIGFmdGVyIGdldHRpbmcgZmlsZSBzaXplICovCisJaWYgKGxzZWVrKGZkLCAwLCBTRUVLX1NFVCkgPT0gLTEpIHsKKwkJZW5kd2luKCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCS8qIEFsbG9jYXRlIHNwYWNlIGZvciByZWFkIGJ1ZmZlciAqLworCWlmICgoYnVmID0gbWFsbG9jKEJVRl9TSVpFICsgMSkpID09IE5VTEwpIHsKKwkJZW5kd2luKCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG5DYW4ndCBhbGxvY2F0ZSBtZW1vcnkgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQlleGl0KC0xKTsKKwl9CisJaWYgKChieXRlc19yZWFkID0gcmVhZChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCWVuZHdpbigpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CS8qIG1hcmsgZW5kIG9mIHZhbGlkIGRhdGEgKi8KKwlwYWdlID0gYnVmOwkJLyogcGFnZSBpcyBwb2ludGVyIHRvIHN0YXJ0IG9mIHBhZ2UgdG8gYmUgZGlzcGxheWVkICovCisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwkvKiBDcmVhdGUgd2luZG93IGZvciB0ZXh0IHJlZ2lvbiwgdXNlZCBmb3Igc2Nyb2xsaW5nIHRleHQgKi8KKwl0ZXh0ID0gc3Vid2luKGRpYWxvZywgaGVpZ2h0IC0gNCwgd2lkdGggLSAyLCB5ICsgMSwgeCArIDEpOworCXdhdHRyc2V0KHRleHQsIGRpYWxvZ19hdHRyKTsKKwl3YmtnZHNldCh0ZXh0LCBkaWFsb2dfYXR0ciAmIEFfQ09MT1IpOworCisJa2V5cGFkKHRleHQsIFRSVUUpOworCisJLyogcmVnaXN0ZXIgdGhlIG5ldyB3aW5kb3csIGFsb25nIHdpdGggaXRzIGJvcmRlcnMgKi8KKwlkcmF3X2JveChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisKKwl3YXR0cnNldChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKwltdndhZGRjaChkaWFsb2csIGhlaWdodCAtIDMsIDAsIEFDU19MVEVFKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAyOyBpKyspCisJCXdhZGRjaChkaWFsb2csIEFDU19ITElORSk7CisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJd2JrZ2RzZXQoZGlhbG9nLCBkaWFsb2dfYXR0ciAmIEFfQ09MT1IpOworCXdhZGRjaChkaWFsb2csIEFDU19SVEVFKTsKKworCXByaW50X3RpdGxlKGRpYWxvZywgdGl0bGUsIHdpZHRoKTsKKworCXByaW50X2J1dHRvbihkaWFsb2csICIgRXhpdCAiLCBoZWlnaHQgLSAyLCB3aWR0aCAvIDIgLSA0LCBUUlVFKTsKKwl3bm91dHJlZnJlc2goZGlhbG9nKTsKKwlnZXR5eChkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFNhdmUgY3Vyc29yIHBvc2l0aW9uICovCisKKwkvKiBQcmludCBmaXJzdCBwYWdlIG9mIHRleHQgKi8KKwlhdHRyX2NsZWFyKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMiwgZGlhbG9nX2F0dHIpOworCXByaW50X3BhZ2UodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwlwcmludF9wb3NpdGlvbihkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwl3cmVmcmVzaChkaWFsb2cpOworCisJd2hpbGUgKChrZXkgIT0gRVNDKSAmJiAoa2V5ICE9ICdcbicpKSB7CisJCWtleSA9IHdnZXRjaChkaWFsb2cpOworCQlzd2l0Y2ggKGtleSkgeworCQljYXNlICdFJzoJLyogRXhpdCAqLworCQljYXNlICdlJzoKKwkJY2FzZSAnWCc6CisJCWNhc2UgJ3gnOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlmcmVlKGJ1Zik7CisJCQljbG9zZShmZCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnZyc6CS8qIEZpcnN0IHBhZ2UgKi8KKwkJY2FzZSBLRVlfSE9NRToKKwkJCWlmICghYmVnaW5fcmVhY2hlZCkgeworCQkJCWJlZ2luX3JlYWNoZWQgPSAxOworCQkJCS8qIEZpcnN0IHBhZ2Ugbm90IGluIGJ1ZmZlcj8gKi8KKwkJCQlpZiAoKGZwb3MgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQkJCQllbmR3aW4oKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJaWYgKGZwb3MgPiBieXRlc19yZWFkKSB7CS8qIFllcywgd2UgaGF2ZSB0byByZWFkIGl0IGluICovCisJCQkJCWlmIChsc2VlayhmZCwgMCwgU0VFS19TRVQpID09IC0xKSB7CisJCQkJCQllbmR3aW4oKTsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluICIKKwkJCQkJCQkgICAgICAgICJkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCQkJCQlleGl0KC0xKTsKKwkJCQkJfQorCQkJCQlpZiAoKGJ5dGVzX3JlYWQgPQorCQkJCQkgICAgIHJlYWQoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkJCQkJZW5kd2luKCk7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJCQkJCWV4aXQoLTEpOworCQkJCQl9CisJCQkJCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJCQkJfQorCQkJCXBhZ2UgPSBidWY7CisJCQkJcHJpbnRfcGFnZSh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCQkJCXByaW50X3Bvc2l0aW9uKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnRyc6CS8qIExhc3QgcGFnZSAqLworCQljYXNlIEtFWV9FTkQ6CisKKwkJCWVuZF9yZWFjaGVkID0gMTsKKwkJCS8qIExhc3QgcGFnZSBub3QgaW4gYnVmZmVyPyAqLworCQkJaWYgKChmcG9zID0gbHNlZWsoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJCQllbmR3aW4oKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCQlpZiAoZnBvcyA8IGZpbGVfc2l6ZSkgewkvKiBZZXMsIHdlIGhhdmUgdG8gcmVhZCBpdCBpbiAqLworCQkJCWlmIChsc2VlayhmZCwgLUJVRl9TSVpFLCBTRUVLX0VORCkgPT0gLTEpIHsKKwkJCQkJZW5kd2luKCk7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCWlmICgoYnl0ZXNfcmVhZCA9CisJCQkJICAgICByZWFkKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJCQkJZW5kd2luKCk7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJYnVmW2J5dGVzX3JlYWRdID0gJ1wwJzsKKwkJCX0KKwkJCXBhZ2UgPSBidWYgKyBieXRlc19yZWFkOworCQkJYmFja19saW5lcyhoZWlnaHQgLSA0KTsKKwkJCXByaW50X3BhZ2UodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkJCXByaW50X3Bvc2l0aW9uKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCQl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgJ0snOgkvKiBQcmV2aW91cyBsaW5lICovCisJCWNhc2UgJ2snOgorCQljYXNlIEtFWV9VUDoKKwkJCWlmICghYmVnaW5fcmVhY2hlZCkgeworCQkJCWJhY2tfbGluZXMocGFnZV9sZW5ndGggKyAxKTsKKworCQkJCS8qIFdlIGRvbid0IGNhbGwgcHJpbnRfcGFnZSgpIGhlcmUgYnV0IHVzZSBzY3JvbGxpbmcgdG8gZW5zdXJlCisJCQkJICAgZmFzdGVyIHNjcmVlbiB1cGRhdGUuIEhvd2V2ZXIsICdlbmRfcmVhY2hlZCcgYW5kCisJCQkJICAgJ3BhZ2VfbGVuZ3RoJyBzaG91bGQgc3RpbGwgYmUgdXBkYXRlZCwgYW5kICdwYWdlJyBzaG91bGQKKwkJCQkgICBwb2ludCB0byBzdGFydCBvZiBuZXh0IHBhZ2UuIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCisJCQkJICAgZ2V0X2xpbmUoKSBpbiB0aGUgZm9sbG93aW5nICdmb3InIGxvb3AuICovCisJCQkJc2Nyb2xsb2sodGV4dCwgVFJVRSk7CisJCQkJd3NjcmwodGV4dCwgLTEpOwkvKiBTY3JvbGwgdGV4dCByZWdpb24gZG93biBvbmUgbGluZSAqLworCQkJCXNjcm9sbG9rKHRleHQsIEZBTFNFKTsKKwkJCQlwYWdlX2xlbmd0aCA9IDA7CisJCQkJcGFzc2VkX2VuZCA9IDA7CisJCQkJZm9yIChpID0gMDsgaSA8IGhlaWdodCAtIDQ7IGkrKykgeworCQkJCQlpZiAoIWkpIHsKKwkJCQkJCS8qIHByaW50IGZpcnN0IGxpbmUgb2YgcGFnZSAqLworCQkJCQkJcHJpbnRfbGluZSh0ZXh0LCAwLCB3aWR0aCAtIDIpOworCQkJCQkJd25vdXRyZWZyZXNoKHRleHQpOworCQkJCQl9IGVsc2UKKwkJCQkJCS8qIENhbGxlZCB0byB1cGRhdGUgJ2VuZF9yZWFjaGVkJyBhbmQgJ3BhZ2UnICovCisJCQkJCQlnZXRfbGluZSgpOworCQkJCQlpZiAoIXBhc3NlZF9lbmQpCisJCQkJCQlwYWdlX2xlbmd0aCsrOworCQkJCQlpZiAoZW5kX3JlYWNoZWQgJiYgIXBhc3NlZF9lbmQpCisJCQkJCQlwYXNzZWRfZW5kID0gMTsKKwkJCQl9CisKKwkJCQlwcmludF9wb3NpdGlvbihkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCQkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ0InOgkvKiBQcmV2aW91cyBwYWdlICovCisJCWNhc2UgJ2InOgorCQljYXNlIEtFWV9QUEFHRToKKwkJCWlmIChiZWdpbl9yZWFjaGVkKQorCQkJCWJyZWFrOworCQkJYmFja19saW5lcyhwYWdlX2xlbmd0aCArIGhlaWdodCAtIDQpOworCQkJcHJpbnRfcGFnZSh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCQkJcHJpbnRfcG9zaXRpb24oZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsKKwkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSAnSic6CS8qIE5leHQgbGluZSAqLworCQljYXNlICdqJzoKKwkJY2FzZSBLRVlfRE9XTjoKKwkJCWlmICghZW5kX3JlYWNoZWQpIHsKKwkJCQliZWdpbl9yZWFjaGVkID0gMDsKKwkJCQlzY3JvbGxvayh0ZXh0LCBUUlVFKTsKKwkJCQlzY3JvbGwodGV4dCk7CS8qIFNjcm9sbCB0ZXh0IHJlZ2lvbiB1cCBvbmUgbGluZSAqLworCQkJCXNjcm9sbG9rKHRleHQsIEZBTFNFKTsKKwkJCQlwcmludF9saW5lKHRleHQsIGhlaWdodCAtIDUsIHdpZHRoIC0gMik7CisJCQkJd25vdXRyZWZyZXNoKHRleHQpOworCQkJCXByaW50X3Bvc2l0aW9uKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBLRVlfTlBBR0U6CS8qIE5leHQgcGFnZSAqLworCQljYXNlICcgJzoKKwkJCWlmIChlbmRfcmVhY2hlZCkKKwkJCQlicmVhazsKKworCQkJYmVnaW5fcmVhY2hlZCA9IDA7CisJCQlwcmludF9wYWdlKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJCQlwcmludF9wb3NpdGlvbihkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOworCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCWJyZWFrOworCQljYXNlICcwJzoJLyogQmVnaW5uaW5nIG9mIGxpbmUgKi8KKwkJY2FzZSAnSCc6CS8qIFNjcm9sbCBsZWZ0ICovCisJCWNhc2UgJ2gnOgorCQljYXNlIEtFWV9MRUZUOgorCQkJaWYgKGhzY3JvbGwgPD0gMCkKKwkJCQlicmVhazsKKworCQkJaWYgKGtleSA9PSAnMCcpCisJCQkJaHNjcm9sbCA9IDA7CisJCQllbHNlCisJCQkJaHNjcm9sbC0tOworCQkJLyogUmVwcmludCBjdXJyZW50IHBhZ2UgdG8gc2Nyb2xsIGhvcml6b250YWxseSAqLworCQkJYmFja19saW5lcyhwYWdlX2xlbmd0aCk7CisJCQlwcmludF9wYWdlKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJCQl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CisJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgJ0wnOgkvKiBTY3JvbGwgcmlnaHQgKi8KKwkJY2FzZSAnbCc6CisJCWNhc2UgS0VZX1JJR0hUOgorCQkJaWYgKGhzY3JvbGwgPj0gTUFYX0xFTikKKwkJCQlicmVhazsKKwkJCWhzY3JvbGwrKzsKKwkJCS8qIFJlcHJpbnQgY3VycmVudCBwYWdlIHRvIHNjcm9sbCBob3Jpem9udGFsbHkgKi8KKwkJCWJhY2tfbGluZXMocGFnZV9sZW5ndGgpOworCQkJcHJpbnRfcGFnZSh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOworCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCWJyZWFrOworCQljYXNlIEVTQzoKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGVsd2luKGRpYWxvZyk7CisJZnJlZShidWYpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gLTE7CQkvKiBFU0MgcHJlc3NlZCAqLworfQorCisvKgorICogR28gYmFjayAnbicgbGluZXMgaW4gdGV4dCBmaWxlLiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKS4KKyAqICdwYWdlJyB3aWxsIGJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGRlc2lyZWQgbGluZSBpbiAnYnVmJy4KKyAqLworc3RhdGljIHZvaWQgYmFja19saW5lcyhpbnQgbikKK3sKKwlpbnQgaSwgZnBvczsKKworCWJlZ2luX3JlYWNoZWQgPSAwOworCS8qIFdlIGhhdmUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBlbmRfcmVhY2hlZCBhbmQgIWVuZF9yZWFjaGVkCisJICAgc2luY2UgYXQgZW5kIG9mIGZpbGUsIHRoZSBsaW5lIGlzIG5vdCBlbmRlZCBieSBhICdcbicuCisJICAgVGhlIGNvZGUgaW5zaWRlICdpZicgYmFzaWNhbGx5IGRvZXMgYSAnLS1wYWdlJyB0byBtb3ZlIG9uZQorCSAgIGNoYXJhY3RlciBiYWNrd2FyZCBzbyBhcyB0byBza2lwICdcbicgb2YgdGhlIHByZXZpb3VzIGxpbmUgKi8KKwlpZiAoIWVuZF9yZWFjaGVkKSB7CisJCS8qIEVpdGhlciBiZWdpbm5pbmcgb2YgYnVmZmVyIG9yIGJlZ2lubmluZyBvZiBmaWxlIHJlYWNoZWQ/ICovCisJCWlmIChwYWdlID09IGJ1ZikgeworCQkJaWYgKChmcG9zID0gbHNlZWsoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJCQllbmR3aW4oKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiAiCisJCQkJCSAgICAgICAgImJhY2tfbGluZXMoKS5cbiIpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQkJaWYgKGZwb3MgPiBieXRlc19yZWFkKSB7CS8qIE5vdCBiZWdpbm5pbmcgb2YgZmlsZSB5ZXQgKi8KKwkJCQkvKiBXZSd2ZSByZWFjaGVkIGJlZ2lubmluZyBvZiBidWZmZXIsIGJ1dCBub3QgYmVnaW5uaW5nIG9mCisJCQkJICAgZmlsZSB5ZXQsIHNvIHJlYWQgcHJldmlvdXMgcGFydCBvZiBmaWxlIGludG8gYnVmZmVyLgorCQkJCSAgIE5vdGUgdGhhdCB3ZSBvbmx5IG1vdmUgYmFja3dhcmQgZm9yIEJVRl9TSVpFLzIgYnl0ZXMsCisJCQkJICAgYnV0IG5vdCBCVUZfU0laRSBieXRlcyB0byBhdm9pZCByZS1yZWFkaW5nIGFnYWluIGluCisJCQkJICAgcHJpbnRfcGFnZSgpIGxhdGVyICovCisJCQkJLyogUmVhbGx5IHBvc3NpYmxlIHRvIG1vdmUgYmFja3dhcmQgQlVGX1NJWkUvMiBieXRlcz8gKi8KKwkJCQlpZiAoZnBvcyA8IEJVRl9TSVpFIC8gMiArIGJ5dGVzX3JlYWQpIHsKKwkJCQkJLyogTm8sIG1vdmUgbGVzcyB0aGVuICovCisJCQkJCWlmIChsc2VlayhmZCwgMCwgU0VFS19TRVQpID09IC0xKSB7CisJCQkJCQllbmR3aW4oKTsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluICIKKwkJCQkJCSAgICAgICAgICAgICAgICAiYmFja19saW5lcygpLlxuIik7CisJCQkJCQlleGl0KC0xKTsKKwkJCQkJfQorCQkJCQlwYWdlID0gYnVmICsgZnBvcyAtIGJ5dGVzX3JlYWQ7CisJCQkJfSBlbHNlIHsJLyogTW92ZSBiYWNrd2FyZCBCVUZfU0laRS8yIGJ5dGVzICovCisJCQkJCWlmIChsc2VlayAoZmQsIC0oQlVGX1NJWkUgLyAyICsgYnl0ZXNfcmVhZCksIFNFRUtfQ1VSKSA9PSAtMSkgeworCQkJCQkJZW5kd2luKCk7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciAiCisJCQkJCQkgICAgICAgICAgICAgICAgImluIGJhY2tfbGluZXMoKS5cbiIpOworCQkJCQkJZXhpdCgtMSk7CisJCQkJCX0KKwkJCQkJcGFnZSA9IGJ1ZiArIEJVRl9TSVpFIC8gMjsKKwkJCQl9CisJCQkJaWYgKChieXRlc19yZWFkID0KKwkJCQkgICAgIHJlYWQoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkJCQllbmR3aW4oKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJCQl9IGVsc2UgewkvKiBCZWdpbm5pbmcgb2YgZmlsZSByZWFjaGVkICovCisJCQkJYmVnaW5fcmVhY2hlZCA9IDE7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmICgqKC0tcGFnZSkgIT0gJ1xuJykgewkvKiAnLS1wYWdlJyBoZXJlICovCisJCQkvKiBTb21ldGhpbmcncyB3cm9uZy4uLiAqLworCQkJZW5kd2luKCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuSW50ZXJuYWwgZXJyb3IgaW4gYmFja19saW5lcygpLlxuIik7CisJCQlleGl0KC0xKTsKKwkJfQorCX0KKwkvKiBHbyBiYWNrICduJyBsaW5lcyAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWRvIHsKKwkJCWlmIChwYWdlID09IGJ1ZikgeworCQkJCWlmICgoZnBvcyA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJCQkJCWVuZHdpbigpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCWlmIChmcG9zID4gYnl0ZXNfcmVhZCkgeworCQkJCQkvKiBSZWFsbHkgcG9zc2libGUgdG8gbW92ZSBiYWNrd2FyZCBCVUZfU0laRS8yIGJ5dGVzPyAqLworCQkJCQlpZiAoZnBvcyA8IEJVRl9TSVpFIC8gMiArIGJ5dGVzX3JlYWQpIHsKKwkJCQkJCS8qIE5vLCBtb3ZlIGxlc3MgdGhlbiAqLworCQkJCQkJaWYgKGxzZWVrKGZkLCAwLCBTRUVLX1NFVCkgPT0gLTEpIHsKKwkJCQkJCQllbmR3aW4oKTsKKwkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciAiCisJCQkJCQkJICAgICAgICAgICAgICAgICJpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCQkJCQlleGl0KC0xKTsKKwkJCQkJCX0KKwkJCQkJCXBhZ2UgPSBidWYgKyBmcG9zIC0gYnl0ZXNfcmVhZDsKKwkJCQkJfSBlbHNlIHsJLyogTW92ZSBiYWNrd2FyZCBCVUZfU0laRS8yIGJ5dGVzICovCisJCQkJCQlpZiAobHNlZWsgKGZkLCAtKEJVRl9TSVpFIC8gMiArIGJ5dGVzX3JlYWQpLCBTRUVLX0NVUikgPT0gLTEpIHsKKwkJCQkJCQllbmR3aW4oKTsKKwkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciIKKwkJCQkJCQkgICAgICAgICAgICAgICAgIiBpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCQkJCQlleGl0KC0xKTsKKwkJCQkJCX0KKwkJCQkJCXBhZ2UgPSBidWYgKyBCVUZfU0laRSAvIDI7CisJCQkJCX0KKwkJCQkJaWYgKChieXRlc19yZWFkID0KKwkJCQkJICAgICByZWFkKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJCQkJCWVuZHdpbigpOworCQkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiAiCisJCQkJCQkgICAgICAgICAgICAgICAgImJhY2tfbGluZXMoKS5cbiIpOworCQkJCQkJZXhpdCgtMSk7CisJCQkJCX0KKwkJCQkJYnVmW2J5dGVzX3JlYWRdID0gJ1wwJzsKKwkJCQl9IGVsc2UgewkvKiBCZWdpbm5pbmcgb2YgZmlsZSByZWFjaGVkICovCisJCQkJCWJlZ2luX3JlYWNoZWQgPSAxOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9IHdoaWxlICgqKC0tcGFnZSkgIT0gJ1xuJyk7CisJcGFnZSsrOworfQorCisvKgorICogUHJpbnQgYSBuZXcgcGFnZSBvZiB0ZXh0LiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKS4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfcGFnZShXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgaSwgcGFzc2VkX2VuZCA9IDA7CisKKwlwYWdlX2xlbmd0aCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisJCXByaW50X2xpbmUod2luLCBpLCB3aWR0aCk7CisJCWlmICghcGFzc2VkX2VuZCkKKwkJCXBhZ2VfbGVuZ3RoKys7CisJCWlmIChlbmRfcmVhY2hlZCAmJiAhcGFzc2VkX2VuZCkKKwkJCXBhc3NlZF9lbmQgPSAxOworCX0KKwl3bm91dHJlZnJlc2god2luKTsKK30KKworLyoKKyAqIFByaW50IGEgbmV3IGxpbmUgb2YgdGV4dC4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkgYW5kIHByaW50X3BhZ2UoKS4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfbGluZShXSU5ET1cgKiB3aW4sIGludCByb3csIGludCB3aWR0aCkKK3sKKwljaGFyICpsaW5lOworCisJbGluZSA9IGdldF9saW5lKCk7CisJbGluZSArPSBNSU4oc3RybGVuKGxpbmUpLCBoc2Nyb2xsKTsJLyogU2Nyb2xsIGhvcml6b250YWxseSAqLworCXdtb3ZlKHdpbiwgcm93LCAwKTsJLyogbW92ZSBjdXJzb3IgdG8gY29ycmVjdCBsaW5lICovCisJd2FkZGNoKHdpbiwgJyAnKTsKKwl3YWRkbnN0cih3aW4sIGxpbmUsIE1JTihzdHJsZW4obGluZSksIHdpZHRoIC0gMikpOworCisJLyogQ2xlYXIgJ3Jlc2lkdWUnIG9mIHByZXZpb3VzIGxpbmUgKi8KKyNpZiBPTERfTkNVUlNFUworCXsKKwkJaW50IGk7CisJCWludCB5LCB4OworCisJCWdldHl4KHdpbiwgeSwgeCk7CisJCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIHg7IGkrKykKKwkJCXdhZGRjaCh3aW4sICcgJyk7CisJfQorI2Vsc2UKKwl3Y2xydG9lb2wod2luKTsKKyNlbmRpZgorfQorCisvKgorICogUmV0dXJuIGN1cnJlbnQgbGluZSBvZiB0ZXh0LiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKSBhbmQgcHJpbnRfbGluZSgpLgorICogJ3BhZ2UnIHNob3VsZCBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IGxpbmUgYmVmb3JlIGNhbGxpbmcsIGFuZCB3aWxsIGJlCisgKiB1cGRhdGVkIHRvIHBvaW50IHRvIHN0YXJ0IG9mIG5leHQgbGluZS4KKyAqLworc3RhdGljIGNoYXIgKmdldF9saW5lKHZvaWQpCit7CisJaW50IGkgPSAwLCBmcG9zOworCXN0YXRpYyBjaGFyIGxpbmVbTUFYX0xFTiArIDFdOworCisJZW5kX3JlYWNoZWQgPSAwOworCXdoaWxlICgqcGFnZSAhPSAnXG4nKSB7CisJCWlmICgqcGFnZSA9PSAnXDAnKSB7CisJCQkvKiBFaXRoZXIgZW5kIG9mIGZpbGUgb3IgZW5kIG9mIGJ1ZmZlciByZWFjaGVkICovCisJCQlpZiAoKGZwb3MgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQkJCWVuZHdpbigpOworCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluICIKKwkJCQkgICAgICAgICAgICAgICAgImdldF9saW5lKCkuXG4iKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJCWlmIChmcG9zIDwgZmlsZV9zaXplKSB7CS8qIE5vdCBlbmQgb2YgZmlsZSB5ZXQgKi8KKwkJCQkvKiBXZSd2ZSByZWFjaGVkIGVuZCBvZiBidWZmZXIsIGJ1dCBub3QgZW5kIG9mIGZpbGUgeWV0LAorCQkJCSAgIHNvIHJlYWQgbmV4dCBwYXJ0IG9mIGZpbGUgaW50byBidWZmZXIgKi8KKwkJCQlpZiAoKGJ5dGVzX3JlYWQgPQorCQkJCSAgICAgcmVhZChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCQkJCWVuZHdpbigpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGdldF9saW5lKCkuXG4iKTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJCQkJcGFnZSA9IGJ1ZjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFlbmRfcmVhY2hlZCkKKwkJCQkJZW5kX3JlYWNoZWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGkgPCBNQVhfTEVOKQorCQkJbGluZVtpKytdID0gKihwYWdlKyspOworCQllbHNlIHsKKwkJCS8qIFRydW5jYXRlIGxpbmVzIGxvbmdlciB0aGFuIE1BWF9MRU4gY2hhcmFjdGVycyAqLworCQkJaWYgKGkgPT0gTUFYX0xFTikKKwkJCQlsaW5lW2krK10gPSAnXDAnOworCQkJcGFnZSsrOworCQl9CisJfQorCWlmIChpIDw9IE1BWF9MRU4pCisJCWxpbmVbaV0gPSAnXDAnOworCWlmICghZW5kX3JlYWNoZWQpCisJCXBhZ2UrKzsJCS8qIG1vdmUgcGFzcyAnXG4nICovCisKKwlyZXR1cm4gbGluZTsKK30KKworLyoKKyAqIFByaW50IGN1cnJlbnQgcG9zaXRpb24KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfcG9zaXRpb24oV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisJaW50IGZwb3MsIHBlcmNlbnQ7CisKKwlpZiAoKGZwb3MgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQllbmR3aW4oKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gcHJpbnRfcG9zaXRpb24oKS5cbiIpOworCQlleGl0KC0xKTsKKwl9CisJd2F0dHJzZXQod2luLCBwb3NpdGlvbl9pbmRpY2F0b3JfYXR0cik7CisJd2JrZ2RzZXQod2luLCBwb3NpdGlvbl9pbmRpY2F0b3JfYXR0ciAmIEFfQ09MT1IpOworCXBlcmNlbnQgPSAhZmlsZV9zaXplID8KKwkgICAgMTAwIDogKChmcG9zIC0gYnl0ZXNfcmVhZCArIHBhZ2UgLSBidWYpICogMTAwKSAvIGZpbGVfc2l6ZTsKKwl3bW92ZSh3aW4sIGhlaWdodCAtIDMsIHdpZHRoIC0gOSk7CisJd3ByaW50dyh3aW4sICIoJTNkJSUpIiwgcGVyY2VudCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdXRpbC5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJkM2VlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3V0aWwuYwpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqICB1dGlsLmMKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworLyogdXNlIGNvbG9ycyBieSBkZWZhdWx0PyAqLworYm9vbCB1c2VfY29sb3JzID0gMTsKKworY29uc3QgY2hhciAqYmFja3RpdGxlID0gTlVMTDsKKworLyoKKyAqIEF0dHJpYnV0ZSB2YWx1ZXMsIGRlZmF1bHQgaXMgZm9yIG1vbm8gZGlzcGxheQorICovCitjaHR5cGUgYXR0cmlidXRlc1tdID0geworCUFfTk9STUFMLAkJLyogc2NyZWVuX2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIHNoYWRvd19hdHRyICovCisJQV9OT1JNQUwsCQkvKiBkaWFsb2dfYXR0ciAqLworCUFfQk9MRCwJCQkvKiB0aXRsZV9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBib3JkZXJfYXR0ciAqLworCUFfUkVWRVJTRSwJCS8qIGJ1dHRvbl9hY3RpdmVfYXR0ciAqLworCUFfRElNLAkJCS8qIGJ1dHRvbl9pbmFjdGl2ZV9hdHRyICovCisJQV9SRVZFUlNFLAkJLyogYnV0dG9uX2tleV9hY3RpdmVfYXR0ciAqLworCUFfQk9MRCwJCQkvKiBidXR0b25fa2V5X2luYWN0aXZlX2F0dHIgKi8KKwlBX1JFVkVSU0UsCQkvKiBidXR0b25fbGFiZWxfYWN0aXZlX2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIGJ1dHRvbl9sYWJlbF9pbmFjdGl2ZV9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBpbnB1dGJveF9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBpbnB1dGJveF9ib3JkZXJfYXR0ciAqLworCUFfTk9STUFMLAkJLyogc2VhcmNoYm94X2F0dHIgKi8KKwlBX0JPTEQsCQkJLyogc2VhcmNoYm94X3RpdGxlX2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIHNlYXJjaGJveF9ib3JkZXJfYXR0ciAqLworCUFfQk9MRCwJCQkvKiBwb3NpdGlvbl9pbmRpY2F0b3JfYXR0ciAqLworCUFfTk9STUFMLAkJLyogbWVudWJveF9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBtZW51Ym94X2JvcmRlcl9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBpdGVtX2F0dHIgKi8KKwlBX1JFVkVSU0UsCQkvKiBpdGVtX3NlbGVjdGVkX2F0dHIgKi8KKwlBX0JPTEQsCQkJLyogdGFnX2F0dHIgKi8KKwlBX1JFVkVSU0UsCQkvKiB0YWdfc2VsZWN0ZWRfYXR0ciAqLworCUFfQk9MRCwJCQkvKiB0YWdfa2V5X2F0dHIgKi8KKwlBX1JFVkVSU0UsCQkvKiB0YWdfa2V5X3NlbGVjdGVkX2F0dHIgKi8KKwlBX0JPTEQsCQkJLyogY2hlY2tfYXR0ciAqLworCUFfUkVWRVJTRSwJCS8qIGNoZWNrX3NlbGVjdGVkX2F0dHIgKi8KKwlBX0JPTEQsCQkJLyogdWFycm93X2F0dHIgKi8KKwlBX0JPTEQJCQkvKiBkYXJyb3dfYXR0ciAqLworfTsKKworI2luY2x1ZGUgImNvbG9ycy5oIgorCisvKgorICogVGFibGUgb2YgY29sb3IgdmFsdWVzCisgKi8KK2ludCBjb2xvcl90YWJsZVtdWzNdID0geworCXtTQ1JFRU5fRkcsIFNDUkVFTl9CRywgU0NSRUVOX0hMfSwKKwl7U0hBRE9XX0ZHLCBTSEFET1dfQkcsIFNIQURPV19ITH0sCisJe0RJQUxPR19GRywgRElBTE9HX0JHLCBESUFMT0dfSEx9LAorCXtUSVRMRV9GRywgVElUTEVfQkcsIFRJVExFX0hMfSwKKwl7Qk9SREVSX0ZHLCBCT1JERVJfQkcsIEJPUkRFUl9ITH0sCisJe0JVVFRPTl9BQ1RJVkVfRkcsIEJVVFRPTl9BQ1RJVkVfQkcsIEJVVFRPTl9BQ1RJVkVfSEx9LAorCXtCVVRUT05fSU5BQ1RJVkVfRkcsIEJVVFRPTl9JTkFDVElWRV9CRywgQlVUVE9OX0lOQUNUSVZFX0hMfSwKKwl7QlVUVE9OX0tFWV9BQ1RJVkVfRkcsIEJVVFRPTl9LRVlfQUNUSVZFX0JHLCBCVVRUT05fS0VZX0FDVElWRV9ITH0sCisJe0JVVFRPTl9LRVlfSU5BQ1RJVkVfRkcsIEJVVFRPTl9LRVlfSU5BQ1RJVkVfQkcsCisJIEJVVFRPTl9LRVlfSU5BQ1RJVkVfSEx9LAorCXtCVVRUT05fTEFCRUxfQUNUSVZFX0ZHLCBCVVRUT05fTEFCRUxfQUNUSVZFX0JHLAorCSBCVVRUT05fTEFCRUxfQUNUSVZFX0hMfSwKKwl7QlVUVE9OX0xBQkVMX0lOQUNUSVZFX0ZHLCBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfQkcsCisJIEJVVFRPTl9MQUJFTF9JTkFDVElWRV9ITH0sCisJe0lOUFVUQk9YX0ZHLCBJTlBVVEJPWF9CRywgSU5QVVRCT1hfSEx9LAorCXtJTlBVVEJPWF9CT1JERVJfRkcsIElOUFVUQk9YX0JPUkRFUl9CRywgSU5QVVRCT1hfQk9SREVSX0hMfSwKKwl7U0VBUkNIQk9YX0ZHLCBTRUFSQ0hCT1hfQkcsIFNFQVJDSEJPWF9ITH0sCisJe1NFQVJDSEJPWF9USVRMRV9GRywgU0VBUkNIQk9YX1RJVExFX0JHLCBTRUFSQ0hCT1hfVElUTEVfSEx9LAorCXtTRUFSQ0hCT1hfQk9SREVSX0ZHLCBTRUFSQ0hCT1hfQk9SREVSX0JHLCBTRUFSQ0hCT1hfQk9SREVSX0hMfSwKKwl7UE9TSVRJT05fSU5ESUNBVE9SX0ZHLCBQT1NJVElPTl9JTkRJQ0FUT1JfQkcsIFBPU0lUSU9OX0lORElDQVRPUl9ITH0sCisJe01FTlVCT1hfRkcsIE1FTlVCT1hfQkcsIE1FTlVCT1hfSEx9LAorCXtNRU5VQk9YX0JPUkRFUl9GRywgTUVOVUJPWF9CT1JERVJfQkcsIE1FTlVCT1hfQk9SREVSX0hMfSwKKwl7SVRFTV9GRywgSVRFTV9CRywgSVRFTV9ITH0sCisJe0lURU1fU0VMRUNURURfRkcsIElURU1fU0VMRUNURURfQkcsIElURU1fU0VMRUNURURfSEx9LAorCXtUQUdfRkcsIFRBR19CRywgVEFHX0hMfSwKKwl7VEFHX1NFTEVDVEVEX0ZHLCBUQUdfU0VMRUNURURfQkcsIFRBR19TRUxFQ1RFRF9ITH0sCisJe1RBR19LRVlfRkcsIFRBR19LRVlfQkcsIFRBR19LRVlfSEx9LAorCXtUQUdfS0VZX1NFTEVDVEVEX0ZHLCBUQUdfS0VZX1NFTEVDVEVEX0JHLCBUQUdfS0VZX1NFTEVDVEVEX0hMfSwKKwl7Q0hFQ0tfRkcsIENIRUNLX0JHLCBDSEVDS19ITH0sCisJe0NIRUNLX1NFTEVDVEVEX0ZHLCBDSEVDS19TRUxFQ1RFRF9CRywgQ0hFQ0tfU0VMRUNURURfSEx9LAorCXtVQVJST1dfRkcsIFVBUlJPV19CRywgVUFSUk9XX0hMfSwKKwl7REFSUk9XX0ZHLCBEQVJST1dfQkcsIERBUlJPV19ITH0sCit9OwkJCQkvKiBjb2xvcl90YWJsZSAqLworCisvKgorICogU2V0IHdpbmRvdyB0byBhdHRyaWJ1dGUgJ2F0dHInCisgKi8KK3ZvaWQgYXR0cl9jbGVhcihXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCwgY2h0eXBlIGF0dHIpCit7CisJaW50IGksIGo7CisKKwl3YXR0cnNldCh3aW4sIGF0dHIpOworCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworCQl3bW92ZSh3aW4sIGksIDApOworCQlmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKwkJCXdhZGRjaCh3aW4sICcgJyk7CisJfQorCXRvdWNod2luKHdpbik7Cit9CisKK3ZvaWQgZGlhbG9nX2NsZWFyKHZvaWQpCit7CisJYXR0cl9jbGVhcihzdGRzY3IsIExJTkVTLCBDT0xTLCBzY3JlZW5fYXR0cik7CisJLyogRGlzcGxheSBiYWNrZ3JvdW5kIHRpdGxlIGlmIGl0IGV4aXN0cyAuLi4gLSBTTEggKi8KKwlpZiAoYmFja3RpdGxlICE9IE5VTEwpIHsKKwkJaW50IGk7CisKKwkJd2F0dHJzZXQoc3Rkc2NyLCBzY3JlZW5fYXR0cik7CisJCW12d2FkZHN0cihzdGRzY3IsIDAsIDEsIChjaGFyICopYmFja3RpdGxlKTsKKwkJd21vdmUoc3Rkc2NyLCAxLCAxKTsKKwkJZm9yIChpID0gMTsgaSA8IENPTFMgLSAxOyBpKyspCisJCQl3YWRkY2goc3Rkc2NyLCBBQ1NfSExJTkUpOworCX0KKwl3bm91dHJlZnJlc2goc3Rkc2NyKTsKK30KKworLyoKKyAqIERvIHNvbWUgaW5pdGlhbGl6YXRpb24gZm9yIGRpYWxvZworICovCit2b2lkIGluaXRfZGlhbG9nKHZvaWQpCit7CisJaW5pdHNjcigpOwkJLyogSW5pdCBjdXJzZXMgKi8KKwlrZXlwYWQoc3Rkc2NyLCBUUlVFKTsKKwljYnJlYWsoKTsKKwlub2VjaG8oKTsKKworCWlmICh1c2VfY29sb3JzKQkJLyogU2V0IHVwIGNvbG9ycyAqLworCQljb2xvcl9zZXR1cCgpOworCisJZGlhbG9nX2NsZWFyKCk7Cit9CisKKy8qCisgKiBTZXR1cCBmb3IgY29sb3IgZGlzcGxheQorICovCit2b2lkIGNvbG9yX3NldHVwKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoaGFzX2NvbG9ycygpKSB7CS8qIFRlcm1pbmFsIHN1cHBvcnRzIGNvbG9yPyAqLworCQlzdGFydF9jb2xvcigpOworCisJCS8qIEluaXRpYWxpemUgY29sb3IgcGFpcnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFUVFJJQlVURV9DT1VOVDsgaSsrKQorCQkJaW5pdF9wYWlyKGkgKyAxLCBjb2xvcl90YWJsZVtpXVswXSwgY29sb3JfdGFibGVbaV1bMV0pOworCisJCS8qIFNldHVwIGNvbG9yIGF0dHJpYnV0ZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFUVFJJQlVURV9DT1VOVDsgaSsrKQorCQkJYXR0cmlidXRlc1tpXSA9IENfQVRUUihjb2xvcl90YWJsZVtpXVsyXSwgaSArIDEpOworCX0KK30KKworLyoKKyAqIEVuZCB1c2luZyBkaWFsb2cgZnVuY3Rpb25zLgorICovCit2b2lkIGVuZF9kaWFsb2codm9pZCkKK3sKKwllbmR3aW4oKTsKK30KKworLyogUHJpbnQgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuIENlbnRlciB0aGUgdGl0bGUgYW5kIHRydW5jYXRlCisgKiB0aWxlIGlmIHdpZGVyIHRoYW4gZGlhbG9nICgtIDIgY2hhcnMpLgorICoqLwordm9pZCBwcmludF90aXRsZShXSU5ET1cgKmRpYWxvZywgY29uc3QgY2hhciAqdGl0bGUsIGludCB3aWR0aCkKK3sKKwlpZiAodGl0bGUpIHsKKwkJaW50IHRsZW4gPSBNSU4od2lkdGggLSAyLCBzdHJsZW4odGl0bGUpKTsKKwkJd2F0dHJzZXQoZGlhbG9nLCB0aXRsZV9hdHRyKTsKKwkJbXZ3YWRkY2goZGlhbG9nLCAwLCAod2lkdGggLSB0bGVuKSAvIDIgLSAxLCAnICcpOworCQltdndhZGRuc3RyKGRpYWxvZywgMCwgKHdpZHRoIC0gdGxlbikvMiwgdGl0bGUsIHRsZW4pOworCQl3YWRkY2goZGlhbG9nLCAnICcpOworCX0KK30KKworLyoKKyAqIFByaW50IGEgc3RyaW5nIG9mIHRleHQgaW4gYSB3aW5kb3csIGF1dG9tYXRpY2FsbHkgd3JhcCBhcm91bmQgdG8gdGhlCisgKiBuZXh0IGxpbmUgaWYgdGhlIHN0cmluZyBpcyB0b28gbG9uZyB0byBmaXQgb24gb25lIGxpbmUuIE5ld2xpbmUKKyAqIGNoYXJhY3RlcnMgJ1xuJyBhcmUgcmVwbGFjZWQgYnkgc3BhY2VzLiAgV2Ugc3RhcnQgb24gYSBuZXcgbGluZQorICogaWYgdGhlcmUgaXMgbm8gcm9vbSBmb3IgYXQgbGVhc3QgNCBub25ibGFua3MgZm9sbG93aW5nIGEgZG91YmxlLXNwYWNlLgorICovCit2b2lkIHByaW50X2F1dG93cmFwKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgd2lkdGgsIGludCB5LCBpbnQgeCkKK3sKKwlpbnQgbmV3bCwgY3VyX3gsIGN1cl95OworCWludCBpLCBwcm9tcHRfbGVuLCByb29tLCB3bGVuOworCWNoYXIgdGVtcHN0cltNQVhfTEVOICsgMV0sICp3b3JkLCAqc3AsICpzcDI7CisKKwlzdHJjcHkodGVtcHN0ciwgcHJvbXB0KTsKKworCXByb21wdF9sZW4gPSBzdHJsZW4odGVtcHN0cik7CisKKwkvKgorCSAqIFJlbW92ZSBuZXdsaW5lcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBwcm9tcHRfbGVuOyBpKyspIHsKKwkJaWYgKHRlbXBzdHJbaV0gPT0gJ1xuJykKKwkJCXRlbXBzdHJbaV0gPSAnICc7CisJfQorCisJaWYgKHByb21wdF9sZW4gPD0gd2lkdGggLSB4ICogMikgewkvKiBJZiBwcm9tcHQgaXMgc2hvcnQgKi8KKwkJd21vdmUod2luLCB5LCAod2lkdGggLSBwcm9tcHRfbGVuKSAvIDIpOworCQl3YWRkc3RyKHdpbiwgdGVtcHN0cik7CisJfSBlbHNlIHsKKwkJY3VyX3ggPSB4OworCQljdXJfeSA9IHk7CisJCW5ld2wgPSAxOworCQl3b3JkID0gdGVtcHN0cjsKKwkJd2hpbGUgKHdvcmQgJiYgKndvcmQpIHsKKwkJCXNwID0gc3RyY2hyKHdvcmQsICcgJyk7CisJCQlpZiAoc3ApCisJCQkJKnNwKysgPSAwOworCisJCQkvKiBXcmFwIHRvIG5leHQgbGluZSBpZiBlaXRoZXIgdGhlIHdvcmQgZG9lcyBub3QgZml0LAorCQkJICAgb3IgaXQgaXMgdGhlIGZpcnN0IHdvcmQgb2YgYSBuZXcgc2VudGVuY2UsIGFuZCBpdCBpcworCQkJICAgc2hvcnQsIGFuZCB0aGUgbmV4dCB3b3JkIGRvZXMgbm90IGZpdC4gKi8KKwkJCXJvb20gPSB3aWR0aCAtIGN1cl94OworCQkJd2xlbiA9IHN0cmxlbih3b3JkKTsKKwkJCWlmICh3bGVuID4gcm9vbSB8fAorCQkJICAgIChuZXdsICYmIHdsZW4gPCA0ICYmIHNwCisJCQkgICAgICYmIHdsZW4gKyAxICsgc3RybGVuKHNwKSA+IHJvb20KKwkJCSAgICAgJiYgKCEoc3AyID0gc3RyY2hyKHNwLCAnICcpKQorCQkJCSB8fCB3bGVuICsgMSArIChzcDIgLSBzcCkgPiByb29tKSkpIHsKKwkJCQljdXJfeSsrOworCQkJCWN1cl94ID0geDsKKwkJCX0KKwkJCXdtb3ZlKHdpbiwgY3VyX3ksIGN1cl94KTsKKwkJCXdhZGRzdHIod2luLCB3b3JkKTsKKwkJCWdldHl4KHdpbiwgY3VyX3ksIGN1cl94KTsKKwkJCWN1cl94Kys7CisJCQlpZiAoc3AgJiYgKnNwID09ICcgJykgeworCQkJCWN1cl94Kys7CS8qIGRvdWJsZSBzcGFjZSAqLworCQkJCXdoaWxlICgqKytzcCA9PSAnICcpIDsKKwkJCQluZXdsID0gMTsKKwkJCX0gZWxzZQorCQkJCW5ld2wgPSAwOworCQkJd29yZCA9IHNwOworCQl9CisJfQorfQorCisvKgorICogUHJpbnQgYSBidXR0b24KKyAqLwordm9pZCBwcmludF9idXR0b24oV0lORE9XICogd2luLCBjb25zdCBjaGFyICpsYWJlbCwgaW50IHksIGludCB4LCBpbnQgc2VsZWN0ZWQpCit7CisJaW50IGksIHRlbXA7CisKKwl3bW92ZSh3aW4sIHksIHgpOworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBidXR0b25fYWN0aXZlX2F0dHIgOiBidXR0b25faW5hY3RpdmVfYXR0cik7CisJd2FkZHN0cih3aW4sICI8Iik7CisJdGVtcCA9IHN0cnNwbihsYWJlbCwgIiAiKTsKKwlsYWJlbCArPSB0ZW1wOworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBidXR0b25fbGFiZWxfYWN0aXZlX2F0dHIKKwkJIDogYnV0dG9uX2xhYmVsX2luYWN0aXZlX2F0dHIpOworCWZvciAoaSA9IDA7IGkgPCB0ZW1wOyBpKyspCisJCXdhZGRjaCh3aW4sICcgJyk7CisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGJ1dHRvbl9rZXlfYWN0aXZlX2F0dHIKKwkJIDogYnV0dG9uX2tleV9pbmFjdGl2ZV9hdHRyKTsKKwl3YWRkY2god2luLCBsYWJlbFswXSk7CisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGJ1dHRvbl9sYWJlbF9hY3RpdmVfYXR0cgorCQkgOiBidXR0b25fbGFiZWxfaW5hY3RpdmVfYXR0cik7CisJd2FkZHN0cih3aW4sIChjaGFyICopbGFiZWwgKyAxKTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2FjdGl2ZV9hdHRyIDogYnV0dG9uX2luYWN0aXZlX2F0dHIpOworCXdhZGRzdHIod2luLCAiPiIpOworCXdtb3ZlKHdpbiwgeSwgeCArIHRlbXAgKyAxKTsKK30KKworLyoKKyAqIERyYXcgYSByZWN0YW5ndWxhciBib3ggd2l0aCBsaW5lIGRyYXdpbmcgY2hhcmFjdGVycworICovCit2b2lkCitkcmF3X2JveChXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorCSBjaHR5cGUgYm94LCBjaHR5cGUgYm9yZGVyKQoreworCWludCBpLCBqOworCisJd2F0dHJzZXQod2luLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKwkJd21vdmUod2luLCB5ICsgaSwgeCk7CisJCWZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorCQkJaWYgKCFpICYmICFqKQorCQkJCXdhZGRjaCh3aW4sIGJvcmRlciB8IEFDU19VTENPUk5FUik7CisJCQllbHNlIGlmIChpID09IGhlaWdodCAtIDEgJiYgIWopCisJCQkJd2FkZGNoKHdpbiwgYm9yZGVyIHwgQUNTX0xMQ09STkVSKTsKKwkJCWVsc2UgaWYgKCFpICYmIGogPT0gd2lkdGggLSAxKQorCQkJCXdhZGRjaCh3aW4sIGJveCB8IEFDU19VUkNPUk5FUik7CisJCQllbHNlIGlmIChpID09IGhlaWdodCAtIDEgJiYgaiA9PSB3aWR0aCAtIDEpCisJCQkJd2FkZGNoKHdpbiwgYm94IHwgQUNTX0xSQ09STkVSKTsKKwkJCWVsc2UgaWYgKCFpKQorCQkJCXdhZGRjaCh3aW4sIGJvcmRlciB8IEFDU19ITElORSk7CisJCQllbHNlIGlmIChpID09IGhlaWdodCAtIDEpCisJCQkJd2FkZGNoKHdpbiwgYm94IHwgQUNTX0hMSU5FKTsKKwkJCWVsc2UgaWYgKCFqKQorCQkJCXdhZGRjaCh3aW4sIGJvcmRlciB8IEFDU19WTElORSk7CisJCQllbHNlIGlmIChqID09IHdpZHRoIC0gMSkKKwkJCQl3YWRkY2god2luLCBib3ggfCBBQ1NfVkxJTkUpOworCQkJZWxzZQorCQkJCXdhZGRjaCh3aW4sIGJveCB8ICcgJyk7CisJfQorfQorCisvKgorICogRHJhdyBzaGFkb3dzIGFsb25nIHRoZSByaWdodCBhbmQgYm90dG9tIGVkZ2UgdG8gZ2l2ZSBhIG1vcmUgM0QgbG9vaworICogdG8gdGhlIGJveGVzCisgKi8KK3ZvaWQgZHJhd19zaGFkb3coV0lORE9XICogd2luLCBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgaTsKKworCWlmIChoYXNfY29sb3JzKCkpIHsJLyogV2hldGhlciB0ZXJtaW5hbCBzdXBwb3J0cyBjb2xvcj8gKi8KKwkJd2F0dHJzZXQod2luLCBzaGFkb3dfYXR0cik7CisJCXdtb3ZlKHdpbiwgeSArIGhlaWdodCwgeCArIDIpOworCQlmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCXdhZGRjaCh3aW4sIHdpbmNoKHdpbikgJiBBX0NIQVJURVhUKTsKKwkJZm9yIChpID0geSArIDE7IGkgPCB5ICsgaGVpZ2h0ICsgMTsgaSsrKSB7CisJCQl3bW92ZSh3aW4sIGksIHggKyB3aWR0aCk7CisJCQl3YWRkY2god2luLCB3aW5jaCh3aW4pICYgQV9DSEFSVEVYVCk7CisJCQl3YWRkY2god2luLCB3aW5jaCh3aW4pICYgQV9DSEFSVEVYVCk7CisJCX0KKwkJd25vdXRyZWZyZXNoKHdpbik7CisJfQorfQorCisvKgorICogIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGFscGhhYmV0aWMgY2hhcmFjdGVyIGluIGEgc3RyaW5nLgorICovCitpbnQgZmlyc3RfYWxwaGEoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpleGVtcHQpCit7CisJaW50IGksIGluX3BhcmVuID0gMCwgYzsKKworCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oc3RyaW5nKTsgaSsrKSB7CisJCWMgPSB0b2xvd2VyKHN0cmluZ1tpXSk7CisKKwkJaWYgKHN0cmNocigiPFsoIiwgYykpCisJCQkrK2luX3BhcmVuOworCQlpZiAoc3RyY2hyKCI+XSkiLCBjKSAmJiBpbl9wYXJlbiA+IDApCisJCQktLWluX3BhcmVuOworCisJCWlmICgoIWluX3BhcmVuKSAmJiBpc2FscGhhKGMpICYmIHN0cmNocihleGVtcHQsIGMpID09IDApCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy95ZXNuby5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3llc25vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyNTY4YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy95ZXNuby5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogIHllc25vLmMgLS0gaW1wbGVtZW50cyB0aGUgeWVzL25vIGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCisvKgorICogRGlzcGxheSB0ZXJtaW5hdGlvbiBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2J1dHRvbnMoV0lORE9XICogZGlhbG9nLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKwlpbnQgeCA9IHdpZHRoIC8gMiAtIDEwOworCWludCB5ID0gaGVpZ2h0IC0gMjsKKworCXByaW50X2J1dHRvbihkaWFsb2csICIgWWVzICIsIHksIHgsIHNlbGVjdGVkID09IDApOworCXByaW50X2J1dHRvbihkaWFsb2csICIgIE5vICAiLCB5LCB4ICsgMTMsIHNlbGVjdGVkID09IDEpOworCisJd21vdmUoZGlhbG9nLCB5LCB4ICsgMSArIDEzICogc2VsZWN0ZWQpOworCXdyZWZyZXNoKGRpYWxvZyk7Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgZGlhbG9nIGJveCB3aXRoIHR3byBidXR0b25zIC0gWWVzIGFuZCBObworICovCitpbnQgZGlhbG9nX3llc25vKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgaSwgeCwgeSwga2V5ID0gMCwgYnV0dG9uID0gMDsKKwlXSU5ET1cgKmRpYWxvZzsKKworCS8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworCXggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisJeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisJZHJhd19zaGFkb3coc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworCWRpYWxvZyA9IG5ld3dpbihoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKwlrZXlwYWQoZGlhbG9nLCBUUlVFKTsKKworCWRyYXdfYm94KGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwgZGlhbG9nX2F0dHIsIGJvcmRlcl9hdHRyKTsKKwl3YXR0cnNldChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKwltdndhZGRjaChkaWFsb2csIGhlaWdodCAtIDMsIDAsIEFDU19MVEVFKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAyOyBpKyspCisJCXdhZGRjaChkaWFsb2csIEFDU19ITElORSk7CisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJd2FkZGNoKGRpYWxvZywgQUNTX1JURUUpOworCisJcHJpbnRfdGl0bGUoZGlhbG9nLCB0aXRsZSwgd2lkdGgpOworCisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJcHJpbnRfYXV0b3dyYXAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMyk7CisKKwlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisKKwl3aGlsZSAoa2V5ICE9IEVTQykgeworCQlrZXkgPSB3Z2V0Y2goZGlhbG9nKTsKKwkJc3dpdGNoIChrZXkpIHsKKwkJY2FzZSAnWSc6CisJCWNhc2UgJ3knOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnTic6CisJCWNhc2UgJ24nOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gMTsKKworCQljYXNlIFRBQjoKKwkJY2FzZSBLRVlfTEVGVDoKKwkJY2FzZSBLRVlfUklHSFQ6CisJCQlidXR0b24gPSAoKGtleSA9PSBLRVlfTEVGVCA/IC0tYnV0dG9uIDogKytidXR0b24pIDwgMCkgPyAxIDogKGJ1dHRvbiA+IDEgPyAwIDogYnV0dG9uKTsKKworCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIGJ1dHRvbik7CisJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQljYXNlICdcbic6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCXJldHVybiBidXR0b247CisJCWNhc2UgRVNDOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZWx3aW4oZGlhbG9nKTsKKwlyZXR1cm4gLTE7CQkvKiBFU0MgcHJlc3NlZCAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL21jb25mLmMgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y2OWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKQEAgLTAsMCArMSwxMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKgorICogSW50cm9kdWNlZCBzaW5nbGUgbWVudSBtb2RlIChzaG93IGFsbCBzdWItbWVudXMgaW4gb25lIGxhcmdlIHRyZWUpLgorICogMjAwMi0xMS0wNiBQZXRyIEJhdWRpcyA8cGFza3lAdWN3LmN6PgorICoKKyAqIGkxOG4sIDIwMDUsIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICovCisKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA3MDAKKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPiAvKiBmb3Igc3RyY2FzZWNtcCAqLworI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIGNoYXIgbWVudV9iYWNrdGl0bGVbMTI4XTsKK3N0YXRpYyBjb25zdCBjaGFyIG1jb25mX3JlYWRtZVtdID0gTl8oCisiT3ZlcnZpZXdcbiIKKyItLS0tLS0tLVxuIgorIlNvbWUgZmVhdHVyZXMgbWF5IGJlIGJ1aWx0IGRpcmVjdGx5IGludG8gYnVzeWJveC5cbiIKKyJTb21lIG1heSBiZSBtYWRlIGludG8gc3RhbmRhbG9uZSBhcHBsZXRzLiAgU29tZSBmZWF0dXJlc1xuIgorIm1heSBiZSBjb21wbGV0ZWx5IHJlbW92ZWQgYWx0b2dldGhlci4gIFRoZXJlIGFyZSBhbHNvIGNlcnRhaW5cbiIKKyJwYXJhbWV0ZXJzIHdoaWNoIGFyZSBub3QgcmVhbGx5IGZlYXR1cmVzLCBidXQgbXVzdCBiZVxuIgorImVudGVyZWQgaW4gYXMgZGVjaW1hbCBvciBoZXhhZGVjaW1hbCBudW1iZXJzIG9yIHBvc3NpYmx5IHRleHQuXG4iCisiXG4iCisiTWVudSBpdGVtcyBiZWdpbm5pbmcgd2l0aCBbKl0sIDxNPiBvciBbIF0gcmVwcmVzZW50IGZlYXR1cmVzXG4iCisiY29uZmlndXJlZCB0byBiZSBidWlsdCBpbiwgbW9kdWxhcml6ZWQgb3IgcmVtb3ZlZCByZXNwZWN0aXZlbHkuXG4iCisiUG9pbnRlZCBicmFja2V0cyA8PiByZXByZXNlbnQgbW9kdWxlIGNhcGFibGUgZmVhdHVyZXMuXG4iCisiXG4iCisiVG8gY2hhbmdlIGFueSBvZiB0aGVzZSBmZWF0dXJlcywgaGlnaGxpZ2h0IGl0IHdpdGggdGhlIGN1cnNvclxuIgorImtleXMgYW5kIHByZXNzIDxZPiB0byBidWlsZCBpdCBpbiwgPE0+IHRvIG1ha2UgaXQgYSBtb2R1bGUgb3JcbiIKKyI8Tj4gdG8gcmVtb3ZlZCBpdC4gIFlvdSBtYXkgYWxzbyBwcmVzcyB0aGUgPFNwYWNlIEJhcj4gdG8gY3ljbGVcbiIKKyJ0aHJvdWdoIHRoZSBhdmFpbGFibGUgb3B0aW9ucyAoaWUuIFktPk4tPk0tPlkpLlxuIgorIlxuIgorIlNvbWUgYWRkaXRpb25hbCBrZXlib2FyZCBoaW50czpcbiIKKyJcbiIKKyJNZW51c1xuIgorIi0tLS0tLS0tLS1cbiIKKyJvICBVc2UgdGhlIFVwL0Rvd24gYXJyb3cga2V5cyAoY3Vyc29yIGtleXMpIHRvIGhpZ2hsaWdodCB0aGUgaXRlbVxuIgorIiAgIHlvdSB3aXNoIHRvIGNoYW5nZSBvciBzdWJtZW51IHdpc2ggdG8gc2VsZWN0IGFuZCBwcmVzcyA8RW50ZXI+LlxuIgorIiAgIFN1Ym1lbnVzIGFyZSBkZXNpZ25hdGVkIGJ5IFwiLS0tPlwiLlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyB0aGUgb3B0aW9uJ3MgaGlnaGxpZ2h0ZWQgbGV0dGVyIChob3RrZXkpLlxuIgorIiAgICAgICAgICAgICBQcmVzc2luZyBhIGhvdGtleSBtb3JlIHRoYW4gb25jZSB3aWxsIHNlcXVlbmNlXG4iCisiICAgICAgICAgICAgIHRocm91Z2ggYWxsIHZpc2libGUgaXRlbXMgd2hpY2ggdXNlIHRoYXQgaG90a2V5LlxuIgorIlxuIgorIiAgIFlvdSBtYXkgYWxzbyB1c2UgdGhlIDxQQUdFIFVQPiBhbmQgPFBBR0UgRE9XTj4ga2V5cyB0byBzY3JvbGxcbiIKKyIgICB1bnNlZW4gb3B0aW9ucyBpbnRvIHZpZXcuXG4iCisiXG4iCisibyAgVG8gZXhpdCBhIG1lbnUgdXNlIHRoZSBjdXJzb3Iga2V5cyB0byBoaWdobGlnaHQgdGhlIDxFeGl0PiBidXR0b25cbiIKKyIgICBhbmQgcHJlc3MgPEVOVEVSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgPEVTQz48RVNDPiBvciA8RT4gb3IgPFg+IGlmIHRoZXJlIGlzIG5vIGhvdGtleVxuIgorIiAgICAgICAgICAgICB1c2luZyB0aG9zZSBsZXR0ZXJzLiAgWW91IG1heSBwcmVzcyBhIHNpbmdsZSA8RVNDPiwgYnV0XG4iCisiICAgICAgICAgICAgIHRoZXJlIGlzIGEgZGVsYXllZCByZXNwb25zZSB3aGljaCB5b3UgbWF5IGZpbmQgYW5ub3lpbmcuXG4iCisiXG4iCisiICAgQWxzbywgdGhlIDxUQUI+IGFuZCBjdXJzb3Iga2V5cyB3aWxsIGN5Y2xlIGJldHdlZW4gPFNlbGVjdD4sXG4iCisiICAgPEV4aXQ+IGFuZCA8SGVscD5cbiIKKyJcbiIKKyJvICBUbyBnZXQgaGVscCB3aXRoIGFuIGl0ZW0sIHVzZSB0aGUgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0IDxIZWxwPlxuIgorIiAgIGFuZCBQcmVzcyA8RU5URVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyA8SD4gb3IgPD8+LlxuIgorIlxuIgorIlxuIgorIlJhZGlvbGlzdHMgIChDaG9pY2UgbGlzdHMpXG4iCisiLS0tLS0tLS0tLS1cbiIKKyJvICBVc2UgdGhlIGN1cnNvciBrZXlzIHRvIHNlbGVjdCB0aGUgb3B0aW9uIHlvdSB3aXNoIHRvIHNldCBhbmQgcHJlc3NcbiIKKyIgICA8Uz4gb3IgdGhlIDxTUEFDRSBCQVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBvcHRpb24geW91IHdpc2ggdG8gc2V0IHRoZW5cbiIKKyIgICAgICAgICAgICAgcHJlc3MgPFM+IG9yIDxTUEFDRSBCQVI+LlxuIgorIlxuIgorIm8gIFRvIHNlZSBhdmFpbGFibGUgaGVscCBmb3IgdGhlIGl0ZW0sIHVzZSB0aGUgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0XG4iCisiICAgPEhlbHA+IGFuZCBQcmVzcyA8RU5URVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyA8SD4gb3IgPD8+LlxuIgorIlxuIgorIiAgIEFsc28sIHRoZSA8VEFCPiBhbmQgY3Vyc29yIGtleXMgd2lsbCBjeWNsZSBiZXR3ZWVuIDxTZWxlY3Q+IGFuZFxuIgorIiAgIDxIZWxwPlxuIgorIlxuIgorIlxuIgorIkRhdGEgRW50cnlcbiIKKyItLS0tLS0tLS0tLVxuIgorIm8gIEVudGVyIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24gYW5kIHByZXNzIDxFTlRFUj5cbiIKKyIgICBJZiB5b3UgYXJlIGVudGVyaW5nIGhleGFkZWNpbWFsIHZhbHVlcywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0b1xuIgorIiAgIGFkZCB0aGUgJzB4JyBwcmVmaXggdG8gdGhlIGVudHJ5LlxuIgorIlxuIgorIm8gIEZvciBoZWxwLCB1c2UgdGhlIDxUQUI+IG9yIGN1cnNvciBrZXlzIHRvIGhpZ2hsaWdodCB0aGUgaGVscCBvcHRpb25cbiIKKyIgICBhbmQgcHJlc3MgPEVOVEVSPi4gIFlvdSBjYW4gdHJ5IDxUQUI+PEg+IGFzIHdlbGwuXG4iCisiXG4iCisiXG4iCisiVGV4dCBCb3ggICAgKEhlbHAgV2luZG93KVxuIgorIi0tLS0tLS0tXG4iCisibyAgVXNlIHRoZSBjdXJzb3Iga2V5cyB0byBzY3JvbGwgdXAvZG93bi9sZWZ0L3JpZ2h0LiAgVGhlIFZJIGVkaXRvclxuIgorIiAgIGtleXMgaCxqLGssbCBmdW5jdGlvbiBoZXJlIGFzIGRvIDxTUEFDRSBCQVI+IGFuZCA8Qj4gZm9yIHRob3NlXG4iCisiICAgd2hvIGFyZSBmYW1pbGlhciB3aXRoIGxlc3MgYW5kIGx5bnguXG4iCisiXG4iCisibyAgUHJlc3MgPEU+LCA8WD4sIDxFbnRlcj4gb3IgPEVzYz48RXNjPiB0byBleGl0LlxuIgorIlxuIgorIlxuIgorIkFsdGVybmF0ZSBDb25maWd1cmF0aW9uIEZpbGVzXG4iCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyJNZW51Y29uZmlnIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYWx0ZXJuYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yXG4iCisidGhvc2Ugd2hvLCBmb3IgdmFyaW91cyByZWFzb25zLCBmaW5kIGl0IG5lY2Vzc2FyeSB0byBzd2l0Y2hcbiIKKyJiZXR3ZWVuIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy5cbiIKKyJcbiIKKyJBdCB0aGUgZW5kIG9mIHRoZSBtYWluIG1lbnUgeW91IHdpbGwgZmluZCB0d28gb3B0aW9ucy4gIE9uZSBpc1xuIgorImZvciBzYXZpbmcgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byBhIGZpbGUgb2YgeW91ciBjaG9vc2luZy5cbiIKKyJUaGUgb3RoZXIgb3B0aW9uIGlzIGZvciBsb2FkaW5nIGEgcHJldmlvdXNseSBzYXZlZCBhbHRlcm5hdGVcbiIKKyJjb25maWd1cmF0aW9uLlxuIgorIlxuIgorIkV2ZW4gaWYgeW91IGRvbid0IHVzZSBhbHRlcm5hdGUgY29uZmlndXJhdGlvbiBmaWxlcywgYnV0IHlvdVxuIgorImZpbmQgZHVyaW5nIGEgTWVudWNvbmZpZyBzZXNzaW9uIHRoYXQgeW91IGhhdmUgY29tcGxldGVseSBtZXNzZWRcbiIKKyJ1cCB5b3VyIHNldHRpbmdzLCB5b3UgbWF5IHVzZSB0aGUgXCJMb2FkIEFsdGVybmF0ZS4uLlwiIG9wdGlvbiB0b1xuIgorInJlc3RvcmUgeW91ciBwcmV2aW91c2x5IHNhdmVkIHNldHRpbmdzIGZyb20gXCIuY29uZmlnXCIgd2l0aG91dFxuIgorInJlc3RhcnRpbmcgTWVudWNvbmZpZy5cbiIKKyJcbiIKKyJPdGhlciBpbmZvcm1hdGlvblxuIgorIi0tLS0tLS0tLS0tLS0tLS0tXG4iCisiSWYgeW91IHVzZSBNZW51Y29uZmlnIGluIGFuIFhURVJNIHdpbmRvdyBtYWtlIHN1cmUgeW91IGhhdmUgeW91clxuIgorIiRURVJNIHZhcmlhYmxlIHNldCB0byBwb2ludCB0byBhIHh0ZXJtIGRlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgY29sb3IuXG4iCisiT3RoZXJ3aXNlLCBNZW51Y29uZmlnIHdpbGwgbG9vayByYXRoZXIgYmFkLiAgTWVudWNvbmZpZyB3aWxsIG5vdFxuIgorImRpc3BsYXkgY29ycmVjdGx5IGluIGEgUlhWVCB3aW5kb3cgYmVjYXVzZSByeHZ0IGRpc3BsYXlzIG9ubHkgb25lXG4iCisiaW50ZW5zaXR5IG9mIGNvbG9yLCBicmlnaHQuXG4iCisiXG4iCisiTWVudWNvbmZpZyB3aWxsIGRpc3BsYXkgbGFyZ2VyIG1lbnVzIG9uIHNjcmVlbnMgb3IgeHRlcm1zIHdoaWNoIGFyZVxuIgorInNldCB0byBkaXNwbGF5IG1vcmUgdGhhbiB0aGUgc3RhbmRhcmQgMjUgcm93IGJ5IDgwIGNvbHVtbiBnZW9tZXRyeS5cbiIKKyJJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrLCB0aGUgXCJzdHR5IHNpemVcIiBjb21tYW5kIG11c3QgYmUgYWJsZSB0b1xuIgorImRpc3BsYXkgdGhlIHNjcmVlbidzIGN1cnJlbnQgcm93IGFuZCBjb2x1bW4gZ2VvbWV0cnkuICBJIFNUUk9OR0xZXG4iCisiUkVDT01NRU5EIHRoYXQgeW91IG1ha2Ugc3VyZSB5b3UgZG8gTk9UIGhhdmUgdGhlIHNoZWxsIHZhcmlhYmxlc1xuIgorIkxJTkVTIGFuZCBDT0xVTU5TIGV4cG9ydGVkIGludG8geW91ciBlbnZpcm9ubWVudC4gIFNvbWUgZGlzdHJpYnV0aW9uc1xuIgorImV4cG9ydCB0aG9zZSB2YXJpYWJsZXMgdmlhIC9ldGMvcHJvZmlsZS4gIFNvbWUgbmN1cnNlcyBwcm9ncmFtcyBjYW5cbiIKKyJiZWNvbWUgY29uZnVzZWQgd2hlbiB0aG9zZSB2YXJpYWJsZXMgKExJTkVTICYgQ09MVU1OUykgZG9uJ3QgcmVmbGVjdFxuIgorInRoZSB0cnVlIHNjcmVlbiBzaXplLlxuIgorIlxuIgorIk9wdGlvbmFsIHBlcnNvbmFsaXR5IGF2YWlsYWJsZVxuIgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorIklmIHlvdSBwcmVmZXIgdG8gaGF2ZSBhbGwgb2YgdGhlIG9wdGlvbnMgbGlzdGVkIGluIGEgc2luZ2xlXG4iCisibWVudSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgbXVsdGltZW51IGhpZXJhcmNoeSwgcnVuIHRoZSBtZW51Y29uZmlnXG4iCisid2l0aCBNRU5VQ09ORklHX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IHRvIHNpbmdsZV9tZW51LiBFeGFtcGxlOlxuIgorIlxuIgorIm1ha2UgTUVOVUNPTkZJR19NT0RFPXNpbmdsZV9tZW51IG1lbnVjb25maWdcbiIKKyJcbiIKKyI8RW50ZXI+IHdpbGwgdGhlbiB1bnJvbGwgdGhlIGFwcHJvcHJpYXRlIGNhdGVnb3J5LCBvciBlbmZvbGQgaXQgaWYgaXRcbiIKKyJpcyBhbHJlYWR5IHVucm9sbGVkLlxuIgorIlxuIgorIk5vdGUgdGhhdCB0aGlzIG1vZGUgY2FuIGV2ZW50dWFsbHkgYmUgYSBsaXR0bGUgbW9yZSBDUFUgZXhwZW5zaXZlXG4iCisiKGVzcGVjaWFsbHkgd2l0aCBhIGxhcmdlciBudW1iZXIgb2YgdW5yb2xsZWQgY2F0ZWdvcmllcykgdGhhbiB0aGVcbiIKKyJkZWZhdWx0IG1vZGUuXG4iKSwKK21lbnVfaW5zdHJ1Y3Rpb25zW10gPSBOXygKKwkiQXJyb3cga2V5cyBuYXZpZ2F0ZSB0aGUgbWVudS4gICIKKwkiPEVudGVyPiBzZWxlY3RzIHN1Ym1lbnVzIC0tLT4uICAiCisJIkhpZ2hsaWdodGVkIGxldHRlcnMgYXJlIGhvdGtleXMuICAiCisJIlByZXNzaW5nIDxZPiBpbmNsdWRlcywgPE4+IGV4Y2x1ZGVzLCA8TT4gbW9kdWxhcml6ZXMgZmVhdHVyZXMuICAiCisJIlByZXNzIDxFc2M+PEVzYz4gdG8gZXhpdCwgPD8+IGZvciBIZWxwLCA8Lz4gZm9yIFNlYXJjaC4gICIKKwkiTGVnZW5kOiBbKl0gYnVpbHQtaW4gIFsgXSBleGNsdWRlZCAgPE0+IG1vZHVsZSAgPCA+IG1vZHVsZSBjYXBhYmxlIiksCityYWRpb2xpc3RfaW5zdHJ1Y3Rpb25zW10gPSBOXygKKwkiVXNlIHRoZSBhcnJvdyBrZXlzIHRvIG5hdmlnYXRlIHRoaXMgd2luZG93IG9yICIKKwkicHJlc3MgdGhlIGhvdGtleSBvZiB0aGUgaXRlbSB5b3Ugd2lzaCB0byBzZWxlY3QgIgorCSJmb2xsb3dlZCBieSB0aGUgPFNQQUNFIEJBUj4uICIKKwkiUHJlc3MgPD8+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiIpLAoraW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2ludFtdID0gTl8oCisJIlBsZWFzZSBlbnRlciBhIGRlY2ltYWwgdmFsdWUuICIKKwkiRnJhY3Rpb25zIHdpbGwgbm90IGJlIGFjY2VwdGVkLiAgIgorCSJVc2UgdGhlIDxUQUI+IGtleSB0byBtb3ZlIGZyb20gdGhlIGlucHV0IGZpZWxkIHRvIHRoZSBidXR0b25zIGJlbG93IGl0LiIpLAoraW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2hleFtdID0gTl8oCisJIlBsZWFzZSBlbnRlciBhIGhleGFkZWNpbWFsIHZhbHVlLiAiCisJIlVzZSB0aGUgPFRBQj4ga2V5IHRvIG1vdmUgZnJvbSB0aGUgaW5wdXQgZmllbGQgdG8gdGhlIGJ1dHRvbnMgYmVsb3cgaXQuIiksCitpbnB1dGJveF9pbnN0cnVjdGlvbnNfc3RyaW5nW10gPSBOXygKKwkiUGxlYXNlIGVudGVyIGEgc3RyaW5nIHZhbHVlLiAiCisJIlVzZSB0aGUgPFRBQj4ga2V5IHRvIG1vdmUgZnJvbSB0aGUgaW5wdXQgZmllbGQgdG8gdGhlIGJ1dHRvbnMgYmVsb3cgaXQuIiksCitzZXRtb2RfdGV4dFtdID0gTl8oCisJIlRoaXMgZmVhdHVyZSBkZXBlbmRzIG9uIGFub3RoZXIgd2hpY2ggaGFzIGJlZW4gY29uZmlndXJlZCBhcyBhIG1vZHVsZS5cbiIKKwkiQXMgYSByZXN1bHQsIHRoaXMgZmVhdHVyZSB3aWxsIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiIpLAorbm9oZWxwX3RleHRbXSA9IE5fKAorCSJUaGVyZSBpcyBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24uXG4iKSwKK2xvYWRfY29uZmlnX3RleHRbXSA9IE5fKAorCSJFbnRlciB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHlvdSB3aXNoIHRvIGxvYWQuICAiCisJIkFjY2VwdCB0aGUgbmFtZSBzaG93biB0byByZXN0b3JlIHRoZSBjb25maWd1cmF0aW9uIHlvdSAiCisJImxhc3QgcmV0cmlldmVkLiAgTGVhdmUgYmxhbmsgdG8gYWJvcnQuIiksCitsb2FkX2NvbmZpZ19oZWxwW10gPSBOXygKKwkiXG4iCisJIkZvciB2YXJpb3VzIHJlYXNvbnMsIG9uZSBtYXkgd2lzaCB0byBrZWVwIHNldmVyYWwgZGlmZmVyZW50XG4iCisJImNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBvbiBhIHNpbmdsZSBtYWNoaW5lLlxuIgorCSJcbiIKKwkiSWYgeW91IGhhdmUgc2F2ZWQgYSBwcmV2aW91cyBjb25maWd1cmF0aW9uIGluIGEgZmlsZSBvdGhlciB0aGFuXG4iCisJImRlZmF1bHQsIGVudGVyaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGhlcmUgd2lsbCBhbGxvdyB5b3VcbiIKKwkidG8gbW9kaWZ5IHRoYXQgY29uZmlndXJhdGlvbi5cbiIKKwkiXG4iCisJIklmIHlvdSBhcmUgdW5jZXJ0YWluLCB0aGVuIHlvdSBoYXZlIHByb2JhYmx5IG5ldmVyIHVzZWQgYWx0ZXJuYXRlXG4iCisJImNvbmZpZ3VyYXRpb24gZmlsZXMuICBZb3Ugc2hvdWxkIHRoZXJlZm9yIGxlYXZlIHRoaXMgYmxhbmsgdG8gYWJvcnQuXG4iKSwKK3NhdmVfY29uZmlnX3RleHRbXSA9IE5fKAorCSJFbnRlciBhIGZpbGVuYW1lIHRvIHdoaWNoIHRoaXMgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgc2F2ZWQgIgorCSJhcyBhbiBhbHRlcm5hdGUuICBMZWF2ZSBibGFuayB0byBhYm9ydC4iKSwKK3NhdmVfY29uZmlnX2hlbHBbXSA9IE5fKAorCSJcbiIKKwkiRm9yIHZhcmlvdXMgcmVhc29ucywgb25lIG1heSB3aXNoIHRvIGtlZXAgZGlmZmVyZW50XG4iCisJImNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBvbiBhIHNpbmdsZSBtYWNoaW5lLlxuIgorCSJcbiIKKwkiRW50ZXJpbmcgYSBmaWxlIG5hbWUgaGVyZSB3aWxsIGFsbG93IHlvdSB0byBsYXRlciByZXRyaWV2ZSwgbW9kaWZ5XG4iCisJImFuZCB1c2UgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhcyBhbiBhbHRlcm5hdGUgdG8gd2hhdGV2ZXJcbiIKKwkiY29uZmlndXJhdGlvbiBvcHRpb25zIHlvdSBoYXZlIHNlbGVjdGVkIGF0IHRoYXQgdGltZS5cbiIKKwkiXG4iCisJIklmIHlvdSBhcmUgdW5jZXJ0YWluIHdoYXQgYWxsIHRoaXMgbWVhbnMgdGhlbiB5b3Ugc2hvdWxkIHByb2JhYmx5XG4iCisJImxlYXZlIHRoaXMgYmxhbmsuXG4iKSwKK3NlYXJjaF9oZWxwW10gPSBOXygKKwkiXG4iCisJIlNlYXJjaCBmb3IgQ09ORklHXyBzeW1ib2xzIGFuZCBkaXNwbGF5IHRoZWlyIHJlbGF0aW9ucy5cbiIKKwkiUmVndWxhciBleHByZXNzaW9ucyBhcmUgYWxsb3dlZC5cbiIKKwkiRXhhbXBsZTogc2VhcmNoIGZvciBcIl5GT09cIlxuIgorCSJSZXN1bHQ6XG4iCisJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJIlN5bWJvbDogRk9PIFs9bV1cbiIKKwkiUHJvbXB0OiBGb28gYnVzIGlzIHVzZWQgdG8gZHJpdmUgdGhlIGJhciBIV1xuIgorCSJEZWZpbmVkIGF0IGRyaXZlcnMvcGNpL0tjb25maWc6NDdcbiIKKwkiRGVwZW5kcyBvbjogWDg2X0xPQ0FMX0FQSUMgJiYgWDg2X0lPX0FQSUMgfHwgSUE2NFxuIgorCSJMb2NhdGlvbjpcbiIKKwkiICAtPiBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKVxuIgorCSIgICAgLT4gUENJIHN1cHBvcnQgKFBDSSBbPXldKVxuIgorCSIgICAgICAtPiBQQ0kgYWNjZXNzIG1vZGUgKDxjaG9pY2U+IFs9eV0pXG4iCisJIlNlbGVjdHM6IExJQkNSQzMyXG4iCisJIlNlbGVjdGVkIGJ5OiBCQVJcbiIKKwkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkibyBUaGUgbGluZSAnUHJvbXB0Oicgc2hvd3MgdGhlIHRleHQgdXNlZCBpbiB0aGUgbWVudSBzdHJ1Y3R1cmUgZm9yXG4iCisJIiAgdGhpcyBDT05GSUdfIHN5bWJvbFxuIgorCSJvIFRoZSAnRGVmaW5lZCBhdCcgbGluZSB0ZWxsIGF0IHdoYXQgZmlsZSAvIGxpbmUgbnVtYmVyIHRoZSBzeW1ib2xcbiIKKwkiICBpcyBkZWZpbmVkXG4iCisJIm8gVGhlICdEZXBlbmRzIG9uOicgbGluZSB0ZWxsIHdoYXQgc3ltYm9scyBuZWVkcyB0byBiZSBkZWZpbmVkIGZvclxuIgorCSIgIHRoaXMgc3ltYm9sIHRvIGJlIHZpc2libGUgaW4gdGhlIG1lbnUgKHNlbGVjdGFibGUpXG4iCisJIm8gVGhlICdMb2NhdGlvbjonIGxpbmVzIHRlbGwgd2hlcmUgaW4gdGhlIG1lbnUgc3RydWN0dXJlIHRoaXMgc3ltYm9sXG4iCisJIiAgaXMgbG9jYXRlZFxuIgorCSIgICAgQSBsb2NhdGlvbiBmb2xsb3dlZCBieSBhIFs9eV0gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGEgc2VsZWN0YWJsZVxuIgorCSIgICAgbWVudSBpdGVtIC0gYW5kIGN1cnJlbnQgdmFsdWUgaXMgZGlzcGxheWVkIGluc2lkZSBicmFja2V0cy5cbiIKKwkibyBUaGUgJ1NlbGVjdHM6JyBsaW5lIHRlbGwgd2hhdCBzeW1ib2wgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4iCisJIiAgc2VsZWN0ZWQgaWYgdGhpcyBzeW1ib2wgaXMgc2VsZWN0ZWQgKHkgb3IgbSlcbiIKKwkibyBUaGUgJ1NlbGVjdGVkIGJ5JyBsaW5lIHRlbGwgd2hhdCBzeW1ib2wgaGFzIHNlbGVjdGVkIHRoaXMgc3ltYm9sXG4iCisJIlxuIgorCSJPbmx5IHJlbGV2YW50IGxpbmVzIGFyZSBzaG93bi5cbiIKKwkiXG5cbiIKKwkiU2VhcmNoIGV4YW1wbGVzOlxuIgorCSJFeGFtcGxlczogVVNCCT0+IGZpbmQgYWxsIENPTkZJR18gc3ltYm9scyBjb250YWluaW5nIFVTQlxuIgorCSIgICAgICAgICAgXlVTQiA9PiBmaW5kIGFsbCBDT05GSUdfIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBVU0JcbiIKKwkiICAgICAgICAgIFVTQiQgPT4gZmluZCBhbGwgQ09ORklHXyBzeW1ib2xzIGVuZGluZyB3aXRoIFVTQlxuIgorCSJcbiIpOworCitzdGF0aWMgY2hhciBidWZbNDA5NioxMF0sICpidWZwdHIgPSBidWY7CitzdGF0aWMgY2hhciBpbnB1dF9idWZbNDA5Nl07CitzdGF0aWMgY29uc3QgY2hhciBmaWxlbmFtZVtdID0gIi5jb25maWciOworc3RhdGljIGNoYXIgKmFyZ3NbMTAyNF0sICoqYXJncHRyID0gYXJnczsKK3N0YXRpYyBpbnQgaW5kZW50Oworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIGlvc19vcmc7CitzdGF0aWMgaW50IHJvd3MgPSAwLCBjb2xzID0gMDsKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY3VycmVudF9tZW51Oworc3RhdGljIGludCBjaGlsZF9jb3VudDsKK3N0YXRpYyBpbnQgZG9fcmVzaXplOworc3RhdGljIGludCBzaW5nbGVfbWVudV9tb2RlOworCitzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfbG9hZCh2b2lkKTsKK3N0YXRpYyB2b2lkIGNvbmZfc2F2ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHNob3dfdGV4dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwgaW50IHIsIGludCBjKTsKK3N0YXRpYyB2b2lkIHNob3dfaGVscHRleHQoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQpOworc3RhdGljIHZvaWQgc2hvd19oZWxwKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIHNob3dfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqdGl0bGUsIGludCByLCBpbnQgYyk7CisKK3N0YXRpYyB2b2lkIGNwcmludF9pbml0KHZvaWQpOworc3RhdGljIGludCBjcHJpbnQxKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyB2b2lkIGNwcmludF9kb25lKHZvaWQpOworc3RhdGljIGludCBjcHJpbnQoY29uc3QgY2hhciAqZm10LCAuLi4pOworCitzdGF0aWMgdm9pZCBpbml0X3dzaXplKHZvaWQpCit7CisJc3RydWN0IHdpbnNpemUgd3M7CisJY2hhciAqZW52OworCisJaWYgKCFpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NHV0lOU1osICZ3cykpIHsKKwkJcm93cyA9IHdzLndzX3JvdzsKKwkJY29scyA9IHdzLndzX2NvbDsKKwl9CisKKwlpZiAoIXJvd3MpIHsKKwkJZW52ID0gZ2V0ZW52KCJMSU5FUyIpOworCQlpZiAoZW52KQorCQkJcm93cyA9IGF0b2koZW52KTsKKwkJaWYgKCFyb3dzKQorCQkJcm93cyA9IDI0OworCX0KKwlpZiAoIWNvbHMpIHsKKwkJZW52ID0gZ2V0ZW52KCJDT0xVTU5TIik7CisJCWlmIChlbnYpCisJCQljb2xzID0gYXRvaShlbnYpOworCQlpZiAoIWNvbHMpCisJCQljb2xzID0gODA7CisJfQorCisJaWYgKHJvd3MgPCAxOSB8fCBjb2xzIDwgODApIHsKKwkJZnByaW50ZihzdGRlcnIsIE5fKCJZb3VyIGRpc3BsYXkgaXMgdG9vIHNtYWxsIHRvIHJ1biBNZW51Y29uZmlnIVxuIikpOworCQlmcHJpbnRmKHN0ZGVyciwgTl8oIkl0IG11c3QgYmUgYXQgbGVhc3QgMTkgbGluZXMgYnkgODAgY29sdW1ucy5cbiIpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyb3dzIC09IDQ7CisJY29scyAtPSA1OworfQorCitzdGF0aWMgdm9pZCBjcHJpbnRfaW5pdCh2b2lkKQoreworCWJ1ZnB0ciA9IGJ1ZjsKKwlhcmdwdHIgPSBhcmdzOworCW1lbXNldChhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWluZGVudCA9IDA7CisJY2hpbGRfY291bnQgPSAwOworCWNwcmludCgiLi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbHhkaWFsb2ciKTsKKwljcHJpbnQoIi0tYmFja3RpdGxlIik7CisJY3ByaW50KG1lbnVfYmFja3RpdGxlKTsKK30KKworc3RhdGljIGludCBjcHJpbnQxKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJlczsKKworCWlmICghKmFyZ3B0cikKKwkJKmFyZ3B0ciA9IGJ1ZnB0cjsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyZXMgPSB2c3ByaW50ZihidWZwdHIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJYnVmcHRyICs9IHJlczsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGNwcmludF9kb25lKHZvaWQpCit7CisJKmJ1ZnB0cisrID0gMDsKKwlhcmdwdHIrKzsKK30KKworc3RhdGljIGludCBjcHJpbnQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcmVzOworCisJKmFyZ3B0cisrID0gYnVmcHRyOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXJlcyA9IHZzcHJpbnRmKGJ1ZnB0ciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlidWZwdHIgKz0gcmVzOworCSpidWZwdHIrKyA9IDA7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBnZXRfcHJvbXB0X3N0cihzdHJ1Y3QgZ3N0ciAqciwgc3RydWN0IHByb3BlcnR5ICpwcm9wKQoreworCWludCBpLCBqOworCXN0cnVjdCBtZW51ICpzdWJtZW51WzhdLCAqbWVudTsKKworCXN0cl9wcmludGYociwgIlByb21wdDogJXNcbiIsIHByb3AtPnRleHQpOworCXN0cl9wcmludGYociwgIiAgRGVmaW5lZCBhdCAlczolZFxuIiwgcHJvcC0+bWVudS0+ZmlsZS0+bmFtZSwKKwkJcHJvcC0+bWVudS0+bGluZW5vKTsKKwlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJc3RyX2FwcGVuZChyLCAiICBEZXBlbmRzIG9uOiAiKTsKKwkJZXhwcl9nc3RyX3ByaW50KHByb3AtPnZpc2libGUuZXhwciwgcik7CisJCXN0cl9hcHBlbmQociwgIlxuIik7CisJfQorCW1lbnUgPSBwcm9wLT5tZW51LT5wYXJlbnQ7CisJZm9yIChpID0gMDsgbWVudSAhPSAmcm9vdG1lbnUgJiYgaSA8IDg7IG1lbnUgPSBtZW51LT5wYXJlbnQpCisJCXN1Ym1lbnVbaSsrXSA9IG1lbnU7CisJaWYgKGkgPiAwKSB7CisJCXN0cl9wcmludGYociwgIiAgTG9jYXRpb246XG4iKTsKKwkJZm9yIChqID0gNDsgLS1pID49IDA7IGogKz0gMikgeworCQkJbWVudSA9IHN1Ym1lbnVbaV07CisJCQlzdHJfcHJpbnRmKHIsICIlKmMtPiAlcyIsIGosICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKwkJCWlmIChtZW51LT5zeW0pIHsKKwkJCQlzdHJfcHJpbnRmKHIsICIgKCVzIFs9JXNdKSIsIG1lbnUtPnN5bS0+bmFtZSA/CisJCQkJCW1lbnUtPnN5bS0+bmFtZSA6ICI8Y2hvaWNlPiIsCisJCQkJCXN5bV9nZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSkpOworCQkJfQorCQkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X3N5bWJvbF9zdHIoc3RydWN0IGdzdHIgKnIsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlib29sIGhpdDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzdHJfcHJpbnRmKHIsICJTeW1ib2w6ICVzIFs9JXNdXG4iLCBzeW0tPm5hbWUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCWZvcl9hbGxfcHJvbXB0cyhzeW0sIHByb3ApCisJCWdldF9wcm9tcHRfc3RyKHIsIHByb3ApOworCWhpdCA9IGZhbHNlOworCWZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHByb3AsIFBfU0VMRUNUKSB7CisJCWlmICghaGl0KSB7CisJCQlzdHJfYXBwZW5kKHIsICIgIFNlbGVjdHM6ICIpOworCQkJaGl0ID0gdHJ1ZTsKKwkJfSBlbHNlCisJCQlzdHJfcHJpbnRmKHIsICIgJiYgIik7CisJCWV4cHJfZ3N0cl9wcmludChwcm9wLT5leHByLCByKTsKKwl9CisJaWYgKGhpdCkKKwkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwlpZiAoc3ltLT5yZXZfZGVwLmV4cHIpIHsKKwkJc3RyX2FwcGVuZChyLCAiICBTZWxlY3RlZCBieTogIik7CisJCWV4cHJfZ3N0cl9wcmludChzeW0tPnJldl9kZXAuZXhwciwgcik7CisJCXN0cl9hcHBlbmQociwgIlxuIik7CisJfQorCXN0cl9hcHBlbmQociwgIlxuXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBnc3RyIGdldF9yZWxhdGlvbnNfc3RyKHN0cnVjdCBzeW1ib2wgKipzeW1fYXJyKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgZ3N0ciByZXMgPSBzdHJfbmV3KCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBzeW1fYXJyICYmIChzeW0gPSBzeW1fYXJyW2ldKTsgaSsrKQorCQlnZXRfc3ltYm9sX3N0cigmcmVzLCBzeW0pOworCWlmICghaSkKKwkJc3RyX2FwcGVuZCgmcmVzLCAiTm8gbWF0Y2hlcyBmb3VuZC5cbiIpOworCXJldHVybiByZXM7Cit9CisKK3BpZF90IHBpZDsKKworc3RhdGljIHZvaWQgd2luY2hfaGFuZGxlcihpbnQgc2lnKQoreworCWlmICghZG9fcmVzaXplKSB7CisJCWtpbGwocGlkLCBTSUdJTlQpOworCQlkb19yZXNpemUgPSAxOworCX0KK30KKworc3RhdGljIGludCBleGVjX2NvbmYodm9pZCkKK3sKKwlpbnQgcGlwZWZkWzJdLCBzdGF0LCBzaXplOworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisJc2lnc2V0X3Qgc3NldCwgb3NzZXQ7CisKKwlzaWdlbXB0eXNldCgmc3NldCk7CisJc2lnYWRkc2V0KCZzc2V0LCBTSUdJTlQpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNzZXQsICZvc3NldCk7CisKKwlzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKworCXNhLnNhX2hhbmRsZXIgPSB3aW5jaF9oYW5kbGVyOworCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKKwlzYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7CisJc2lnYWN0aW9uKFNJR1dJTkNILCAmc2EsIE5VTEwpOworCisJKmFyZ3B0cisrID0gTlVMTDsKKworCXBpcGUocGlwZWZkKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NzZXQsIE5VTEwpOworCQlkdXAyKHBpcGVmZFsxXSwgMik7CisJCWNsb3NlKHBpcGVmZFswXSk7CisJCWNsb3NlKHBpcGVmZFsxXSk7CisJCWV4ZWN2KGFyZ3NbMF0sIGFyZ3MpOworCQlfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWNsb3NlKHBpcGVmZFsxXSk7CisJYnVmcHRyID0gaW5wdXRfYnVmOworCXdoaWxlICgxKSB7CisJCXNpemUgPSBpbnB1dF9idWYgKyBzaXplb2YoaW5wdXRfYnVmKSAtIGJ1ZnB0cjsKKwkJc2l6ZSA9IHJlYWQocGlwZWZkWzBdLCBidWZwdHIsIHNpemUpOworCQlpZiAoc2l6ZSA8PSAwKSB7CisJCQlpZiAoc2l6ZSA8IDApIHsKKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKQorCQkJCQljb250aW51ZTsKKwkJCQlwZXJyb3IoInJlYWQiKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJ1ZnB0ciArPSBzaXplOworCX0KKwkqYnVmcHRyKysgPSAwOworCWNsb3NlKHBpcGVmZFswXSk7CisJd2FpdHBpZChwaWQsICZzdGF0LCAwKTsKKworCWlmIChkb19yZXNpemUpIHsKKwkJaW5pdF93c2l6ZSgpOworCQlkb19yZXNpemUgPSAwOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9zc2V0LCBOVUxMKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoV0lGU0lHTkFMRUQoc3RhdCkpIHsKKwkJcHJpbnRmKCJcZmludGVycnVwdGVkKCVkKVxuIiwgV1RFUk1TSUcoc3RhdCkpOworCQlleGl0KDEpOworCX0KKyNpZiAwCisJcHJpbnRmKCJcZmV4aXQgc3RhdGU6ICVkXG5leGl0IGRhdGE6ICclcydcbiIsIFdFWElUU1RBVFVTKHN0YXQpLCBpbnB1dF9idWYpOworCXNsZWVwKDEpOworI2VuZGlmCisJc2lncGVuZGluZygmc3NldCk7CisJaWYgKHNpZ2lzbWVtYmVyKCZzc2V0LCBTSUdJTlQpKSB7CisJCXByaW50ZigiXGZpbnRlcnJ1cHRlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NzZXQsIE5VTEwpOworCisJcmV0dXJuIFdFWElUU1RBVFVTKHN0YXQpOworfQorCitzdGF0aWMgdm9pZCBzZWFyY2hfY29uZih2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKipzeW1fYXJyOworCWludCBzdGF0OworCXN0cnVjdCBnc3RyIHJlczsKKworYWdhaW46CisJY3ByaW50X2luaXQoKTsKKwljcHJpbnQoIi0tdGl0bGUiKTsKKwljcHJpbnQoXygiU2VhcmNoIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIikpOworCWNwcmludCgiLS1pbnB1dGJveCIpOworCWNwcmludChfKCJFbnRlciBDT05GSUdfIChzdWIpc3RyaW5nIHRvIHNlYXJjaCBmb3IgKG9taXQgQ09ORklHXykiKSk7CisJY3ByaW50KCIxMCIpOworCWNwcmludCgiNzUiKTsKKwljcHJpbnQoIiIpOworCXN0YXQgPSBleGVjX2NvbmYoKTsKKwlpZiAoc3RhdCA8IDApCisJCWdvdG8gYWdhaW47CisJc3dpdGNoIChzdGF0KSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCXNob3dfaGVscHRleHQoXygiU2VhcmNoIENvbmZpZ3VyYXRpb24iKSwgc2VhcmNoX2hlbHApOworCQlnb3RvIGFnYWluOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlzeW1fYXJyID0gc3ltX3JlX3NlYXJjaChpbnB1dF9idWYpOworCXJlcyA9IGdldF9yZWxhdGlvbnNfc3RyKHN5bV9hcnIpOworCWZyZWUoc3ltX2Fycik7CisJc2hvd190ZXh0Ym94KF8oIlNlYXJjaCBSZXN1bHRzIiksIHN0cl9nZXQoJnJlcyksIDAsIDApOworCXN0cl9mcmVlKCZyZXMpOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9jb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCWludCB0eXBlLCB0bXAsIGRvaW50ID0gMjsKKwl0cmlzdGF0ZSB2YWw7CisJY2hhciBjaDsKKworCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyZXR1cm47CisKKwlzeW0gPSBtZW51LT5zeW07CisJcHJvcCA9IG1lbnUtPnByb21wdDsKKwlpZiAoIXN5bSkgeworCQlpZiAocHJvcCAmJiBtZW51ICE9IGN1cnJlbnRfbWVudSkgeworCQkJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCQkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCQljYXNlIFBfTUVOVToKKwkJCQljaGlsZF9jb3VudCsrOworCQkJCWNwcmludCgibSVwIiwgbWVudSk7CisKKwkJCQlpZiAoc2luZ2xlX21lbnVfbW9kZSkgeworCQkJCQljcHJpbnQxKCIlcyUqYyVzIiwKKwkJCQkJCW1lbnUtPmRhdGEgPyAiLS0+IiA6ICIrKz4iLAorCQkJCQkJaW5kZW50ICsgMSwgJyAnLCBwcm9tcHQpOworCQkJCX0gZWxzZQorCQkJCQljcHJpbnQxKCIgICAlKmMlcyAgLS0tPiIsIGluZGVudCArIDEsICcgJywgcHJvbXB0KTsKKworCQkJCWNwcmludF9kb25lKCk7CisJCQkJaWYgKHNpbmdsZV9tZW51X21vZGUgJiYgbWVudS0+ZGF0YSkKKwkJCQkJZ290byBjb25mX2NoaWxkczsKKwkJCQlyZXR1cm47CisJCQlkZWZhdWx0OgorCQkJCWlmIChwcm9tcHQpIHsKKwkJCQkJY2hpbGRfY291bnQrKzsKKwkJCQkJY3ByaW50KCI6JXAiLCBtZW51KTsKKwkJCQkJY3ByaW50KCItLS0lKmMlcyIsIGluZGVudCArIDEsICcgJywgcHJvbXB0KTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJZG9pbnQgPSAwOworCQlnb3RvIGNvbmZfY2hpbGRzOworCX0KKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCXN0cnVjdCBzeW1ib2wgKmRlZl9zeW0gPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShzeW0pOworCQlzdHJ1Y3QgbWVudSAqZGVmX21lbnUgPSBOVUxMOworCisJCWNoaWxkX2NvdW50Kys7CisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKG1lbnVfaXNfdmlzaWJsZShjaGlsZCkgJiYgY2hpbGQtPnN5bSA9PSBkZWZfc3ltKQorCQkJCWRlZl9tZW51ID0gY2hpbGQ7CisJCX0KKworCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpIHsKKwkJCWNwcmludCgidCVwIiwgbWVudSk7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJCWNwcmludDEoIlslY10iLCB2YWwgPT0gbm8gPyAnICcgOiAnKicpOworCQkJCWJyZWFrOworCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCXN3aXRjaCAodmFsKSB7CisJCQkJY2FzZSB5ZXM6IGNoID0gJyonOyBicmVhazsKKwkJCQljYXNlIG1vZDogY2ggPSAnTSc7IGJyZWFrOworCQkJCWRlZmF1bHQ6ICBjaCA9ICcgJzsgYnJlYWs7CisJCQkJfQorCQkJCWNwcmludDEoIjwlYz4iLCBjaCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQljcHJpbnQoIiVjJXAiLCBkZWZfbWVudSA/ICd0JyA6ICc6JywgbWVudSk7CisJCQljcHJpbnQxKCIgICAiKTsKKwkJfQorCisJCWNwcmludDEoIiUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQlpZiAodmFsID09IHllcykgeworCQkJaWYgKGRlZl9tZW51KSB7CisJCQkJY3ByaW50MSgiICglcykiLCBtZW51X2dldF9wcm9tcHQoZGVmX21lbnUpKTsKKwkJCQljcHJpbnQxKCIgIC0tLT4iKTsKKwkJCQljcHJpbnRfZG9uZSgpOworCQkJCWlmIChkZWZfbWVudS0+bGlzdCkgeworCQkJCQlpbmRlbnQgKz0gMjsKKwkJCQkJYnVpbGRfY29uZihkZWZfbWVudSk7CisJCQkJCWluZGVudCAtPSAyOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWNwcmludF9kb25lKCk7CisJCQlyZXR1cm47CisJCX0KKwkJY3ByaW50X2RvbmUoKTsKKwl9IGVsc2UgeworCQlpZiAobWVudSA9PSBjdXJyZW50X21lbnUpIHsKKwkJCWNwcmludCgiOiVwIiwgbWVudSk7CisJCQljcHJpbnQoIi0tLSUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQkJZ290byBjb25mX2NoaWxkczsKKwkJfQorCQljaGlsZF9jb3VudCsrOworCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdmFsID09IHllcykgeworCQkJY3ByaW50KCI6JXAiLCBtZW51KTsKKwkJCWNwcmludDEoIiAgICIpOworCQl9IGVsc2UgeworCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCQljcHJpbnQoInQlcCIsIG1lbnUpOworCQkJCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpCisJCQkJCWNwcmludDEoIlslY10iLCB2YWwgPT0gbm8gPyAnICcgOiAnKicpOworCQkJCWVsc2UKKwkJCQkJY3ByaW50MSgiLS0tIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJY3ByaW50KCJ0JXAiLCBtZW51KTsKKwkJCQlzd2l0Y2ggKHZhbCkgeworCQkJCWNhc2UgeWVzOiBjaCA9ICcqJzsgYnJlYWs7CisJCQkJY2FzZSBtb2Q6IGNoID0gJ00nOyBicmVhazsKKwkJCQlkZWZhdWx0OiAgY2ggPSAnICc7IGJyZWFrOworCQkJCX0KKwkJCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pKQorCQkJCQljcHJpbnQxKCI8JWM+IiwgY2gpOworCQkJCWVsc2UKKwkJCQkJY3ByaW50MSgiLS0tIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNwcmludCgicyVwIiwgbWVudSk7CisJCQkJdG1wID0gY3ByaW50MSgiKCVzKSIsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQkJCXRtcCA9IGluZGVudCAtIHRtcCArIDQ7CisJCQkJaWYgKHRtcCA8IDApCisJCQkJCXRtcCA9IDA7CisJCQkJY3ByaW50MSgiJSpjJXMlcyIsIHRtcCwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSksCisJCQkJCShzeW1faGFzX3ZhbHVlKHN5bSkgfHwgIXN5bV9pc19jaGFuZ2FibGUoc3ltKSkgPworCQkJCQkiIiA6ICIgKE5FVykiKTsKKwkJCQljcHJpbnRfZG9uZSgpOworCQkJCWdvdG8gY29uZl9jaGlsZHM7CisJCQl9CisJCX0KKwkJY3ByaW50MSgiJSpjJXMlcyIsIGluZGVudCArIDEsICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpLAorCQkJKHN5bV9oYXNfdmFsdWUoc3ltKSB8fCAhc3ltX2lzX2NoYW5nYWJsZShzeW0pKSA/CisJCQkiIiA6ICIgKE5FVykiKTsKKwkJaWYgKG1lbnUtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpIHsKKwkJCWNwcmludDEoIiAgLS0tPiIpOworCQkJY3ByaW50X2RvbmUoKTsKKwkJCXJldHVybjsKKwkJfQorCQljcHJpbnRfZG9uZSgpOworCX0KKworY29uZl9jaGlsZHM6CisJaW5kZW50ICs9IGRvaW50OworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJYnVpbGRfY29uZihjaGlsZCk7CisJaW5kZW50IC09IGRvaW50OworfQorCitzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBtZW51ICpzdWJtZW51OworCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY2hhciBhY3RpdmVfZW50cnlbNDBdOworCWludCBzdGF0LCB0eXBlLCBpOworCisJdW5saW5rKCJseGRpYWxvZy5zY3JsdG1wIik7CisJYWN0aXZlX2VudHJ5WzBdID0gMDsKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJY3ByaW50KCIlcyIsIHByb21wdCA/IHByb21wdCA6IF8oIk1haW4gTWVudSIpKTsKKwkJY3ByaW50KCItLW1lbnUiKTsKKwkJY3ByaW50KF8obWVudV9pbnN0cnVjdGlvbnMpKTsKKwkJY3ByaW50KCIlZCIsIHJvd3MpOworCQljcHJpbnQoIiVkIiwgY29scyk7CisJCWNwcmludCgiJWQiLCByb3dzIC0gMTApOworCQljcHJpbnQoIiVzIiwgYWN0aXZlX2VudHJ5KTsKKwkJY3VycmVudF9tZW51ID0gbWVudTsKKwkJYnVpbGRfY29uZihtZW51KTsKKwkJaWYgKCFjaGlsZF9jb3VudCkKKwkJCWJyZWFrOworCQlpZiAobWVudSA9PSAmcm9vdG1lbnUpIHsKKwkJCWNwcmludCgiOiIpOworCQkJY3ByaW50KCItLS0gIik7CisJCQljcHJpbnQoIkwiKTsKKwkJCWNwcmludChfKCIgICAgTG9hZCBhbiBBbHRlcm5hdGUgQ29uZmlndXJhdGlvbiBGaWxlIikpOworCQkJY3ByaW50KCJTIik7CisJCQljcHJpbnQoXygiICAgIFNhdmUgQ29uZmlndXJhdGlvbiB0byBhbiBBbHRlcm5hdGUgRmlsZSIpKTsKKwkJfQorCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCWlmIChzdGF0IDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdGF0ID09IDEgfHwgc3RhdCA9PSAyNTUpCisJCQlicmVhazsKKworCQl0eXBlID0gaW5wdXRfYnVmWzBdOworCQlpZiAoIXR5cGUpCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpbnB1dF9idWZbaV0gJiYgIWlzc3BhY2UoaW5wdXRfYnVmW2ldKTsgaSsrKQorCQkJOworCQlpZiAoaSA+PSBzaXplb2YoYWN0aXZlX2VudHJ5KSkKKwkJCWkgPSBzaXplb2YoYWN0aXZlX2VudHJ5KSAtIDE7CisJCWlucHV0X2J1ZltpXSA9IDA7CisJCXN0cmNweShhY3RpdmVfZW50cnksIGlucHV0X2J1Zik7CisKKwkJc3ltID0gTlVMTDsKKwkJc3VibWVudSA9IE5VTEw7CisJCWlmIChzc2NhbmYoaW5wdXRfYnVmICsgMSwgIiVwIiwgJnN1Ym1lbnUpID09IDEpCisJCQlzeW0gPSBzdWJtZW51LT5zeW07CisKKwkJc3dpdGNoIChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSAnbSc6CisJCQkJaWYgKHNpbmdsZV9tZW51X21vZGUpCisJCQkJCXN1Ym1lbnUtPmRhdGEgPSAodm9pZCAqKSAobG9uZykgIXN1Ym1lbnUtPmRhdGE7CisJCQkJZWxzZQorCQkJCQljb25mKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkgPT0geWVzKQorCQkJCQljb25mX2Nob2ljZShzdWJtZW51KTsKKwkJCQllbHNlIGlmIChzdWJtZW51LT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKQorCQkJCQljb25mKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJY29uZl9zdHJpbmcoc3VibWVudSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdMJzoKKwkJCQljb25mX2xvYWQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgorCQkJCWNvbmZfc2F2ZSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmIChzeW0pCisJCQkJc2hvd19oZWxwKHN1Ym1lbnUpOworCQkJZWxzZQorCQkJCXNob3dfaGVscHRleHQoIlJFQURNRSIsIF8obWNvbmZfcmVhZG1lKSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJaWYgKHR5cGUgPT0gJ3QnKSB7CisJCQkJaWYgKHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCB5ZXMpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG1vZCkpCisJCQkJCXNob3dfdGV4dGJveChOVUxMLCBzZXRtb2RfdGV4dCwgNiwgNzQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmICh0eXBlID09ICd0JykKKwkJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbm8pOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWlmICh0eXBlID09ICd0JykKKwkJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlpZiAodHlwZSA9PSAndCcpCisJCQkJc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShzeW0pOworCQkJZWxzZSBpZiAodHlwZSA9PSAnbScpCisJCQkJY29uZihzdWJtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQlzZWFyY2hfY29uZigpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfdGV4dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwgaW50IHIsIGludCBjKQoreworCWludCBmZDsKKworCWZkID0gY3JlYXQoIi5oZWxwLnRtcCIsIDA3NzcpOworCXdyaXRlKGZkLCB0ZXh0LCBzdHJsZW4odGV4dCkpOworCWNsb3NlKGZkKTsKKwlzaG93X2ZpbGUoIi5oZWxwLnRtcCIsIHRpdGxlLCByLCBjKTsKKwl1bmxpbmsoIi5oZWxwLnRtcCIpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2hlbHB0ZXh0KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0KQoreworCXNob3dfdGV4dGJveCh0aXRsZSwgdGV4dCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgZ3N0ciBoZWxwID0gc3RyX25ldygpOworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKworCWlmIChzeW0tPmhlbHApCisJeworCQlpZiAoc3ltLT5uYW1lKSB7CisJCQlzdHJfcHJpbnRmKCZoZWxwLCAiQ09ORklHXyVzOlxuXG4iLCBzeW0tPm5hbWUpOworCQkJc3RyX2FwcGVuZCgmaGVscCwgXyhzeW0tPmhlbHApKTsKKwkJCXN0cl9hcHBlbmQoJmhlbHAsICJcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJc3RyX2FwcGVuZCgmaGVscCwgbm9oZWxwX3RleHQpOworCX0KKwlnZXRfc3ltYm9sX3N0cigmaGVscCwgc3ltKTsKKwlzaG93X2hlbHB0ZXh0KG1lbnVfZ2V0X3Byb21wdChtZW51KSwgc3RyX2dldCgmaGVscCkpOworCXN0cl9mcmVlKCZoZWxwKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICp0aXRsZSwgaW50IHIsIGludCBjKQoreworCWRvIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJaWYgKHRpdGxlKSB7CisJCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJCWNwcmludCgiJXMiLCB0aXRsZSk7CisJCX0KKwkJY3ByaW50KCItLXRleHRib3giKTsKKwkJY3ByaW50KCIlcyIsIGZpbGVuYW1lKTsKKwkJY3ByaW50KCIlZCIsIHIgPyByIDogcm93cyk7CisJCWNwcmludCgiJWQiLCBjID8gYyA6IGNvbHMpOworCX0gd2hpbGUgKGV4ZWNfY29uZigpIDwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KQoreworCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RydWN0IHN5bWJvbCAqYWN0aXZlOworCWludCBzdGF0OworCisJYWN0aXZlID0gc3ltX2dldF9jaG9pY2VfdmFsdWUobWVudS0+c3ltKTsKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJY3ByaW50KCIlcyIsIHByb21wdCA/IHByb21wdCA6IF8oIk1haW4gTWVudSIpKTsKKwkJY3ByaW50KCItLXJhZGlvbGlzdCIpOworCQljcHJpbnQoXyhyYWRpb2xpc3RfaW5zdHJ1Y3Rpb25zKSk7CisJCWNwcmludCgiMTUiKTsKKwkJY3ByaW50KCI3MCIpOworCQljcHJpbnQoIjYiKTsKKworCQljdXJyZW50X21lbnUgPSBtZW51OworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmICghbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCQljb250aW51ZTsKKwkJCWNwcmludCgiJXAiLCBjaGlsZCk7CisJCQljcHJpbnQoIiVzIiwgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCQlpZiAoY2hpbGQtPnN5bSA9PSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShtZW51LT5zeW0pKQorCQkJCWNwcmludCgiT04iKTsKKwkJCWVsc2UgaWYgKGNoaWxkLT5zeW0gPT0gYWN0aXZlKQorCQkJCWNwcmludCgiU0VMRUNURUQiKTsKKwkJCWVsc2UKKwkJCQljcHJpbnQoIk9GRiIpOworCQl9CisKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlzd2l0Y2ggKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHNzY2FuZihpbnB1dF9idWYsICIlcCIsICZjaGlsZCkgIT0gMSkKKwkJCQlicmVhazsKKwkJCXN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoY2hpbGQtPnN5bSwgeWVzKTsKKwkJCXJldHVybjsKKwkJY2FzZSAxOgorCQkJaWYgKHNzY2FuZihpbnB1dF9idWYsICIlcCIsICZjaGlsZCkgPT0gMSkgeworCQkJCXNob3dfaGVscChjaGlsZCk7CisJCQkJYWN0aXZlID0gY2hpbGQtPnN5bTsKKwkJCX0gZWxzZQorCQkJCXNob3dfaGVscChtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIDI1NToKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCWludCBzdGF0OworCisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLXRpdGxlIik7CisJCWNwcmludCgiJXMiLCBwcm9tcHQgPyBwcm9tcHQgOiBfKCJNYWluIE1lbnUiKSk7CisJCWNwcmludCgiLS1pbnB1dGJveCIpOworCQlzd2l0Y2ggKHN5bV9nZXRfdHlwZShtZW51LT5zeW0pKSB7CisJCWNhc2UgU19JTlQ6CisJCQljcHJpbnQoXyhpbnB1dGJveF9pbnN0cnVjdGlvbnNfaW50KSk7CisJCQlicmVhazsKKwkJY2FzZSBTX0hFWDoKKwkJCWNwcmludChfKGlucHV0Ym94X2luc3RydWN0aW9uc19oZXgpKTsKKwkJCWJyZWFrOworCQljYXNlIFNfU1RSSU5HOgorCQkJY3ByaW50KF8oaW5wdXRib3hfaW5zdHJ1Y3Rpb25zX3N0cmluZykpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBwYW5pYz8gKi87CisJCX0KKwkJY3ByaW50KCIxMCIpOworCQljcHJpbnQoIjc1Iik7CisJCWNwcmludCgiJXMiLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pKTsKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlzd2l0Y2ggKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHN5bV9zZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSwgaW5wdXRfYnVmKSkKKwkJCQlyZXR1cm47CisJCQlzaG93X3RleHRib3goTlVMTCwgXygiWW91IGhhdmUgbWFkZSBhbiBpbnZhbGlkIGVudHJ5LiIpLCA1LCA0Myk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc2hvd19oZWxwKG1lbnUpOworCQkJYnJlYWs7CisJCWNhc2UgMjU1OgorCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX2xvYWQodm9pZCkKK3sKKwlpbnQgc3RhdDsKKworCXdoaWxlICgxKSB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS1pbnB1dGJveCIpOworCQljcHJpbnQobG9hZF9jb25maWdfdGV4dCk7CisJCWNwcmludCgiMTEiKTsKKwkJY3ByaW50KCI1NSIpOworCQljcHJpbnQoIiVzIiwgZmlsZW5hbWUpOworCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCXN3aXRjaChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCWlmICghaW5wdXRfYnVmWzBdKQorCQkJCXJldHVybjsKKwkJCWlmICghY29uZl9yZWFkKGlucHV0X2J1ZikpCisJCQkJcmV0dXJuOworCQkJc2hvd190ZXh0Ym94KE5VTEwsIF8oIkZpbGUgZG9lcyBub3QgZXhpc3QhIiksIDUsIDM4KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaG93X2hlbHB0ZXh0KF8oIkxvYWQgQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24iKSwgbG9hZF9jb25maWdfaGVscCk7CisJCQlicmVhazsKKwkJY2FzZSAyNTU6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfc2F2ZSh2b2lkKQoreworCWludCBzdGF0OworCisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLWlucHV0Ym94Iik7CisJCWNwcmludChzYXZlX2NvbmZpZ190ZXh0KTsKKwkJY3ByaW50KCIxMSIpOworCQljcHJpbnQoIjU1Iik7CisJCWNwcmludCgiJXMiLCBmaWxlbmFtZSk7CisJCXN0YXQgPSBleGVjX2NvbmYoKTsKKwkJc3dpdGNoKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKCFpbnB1dF9idWZbMF0pCisJCQkJcmV0dXJuOworCQkJaWYgKCFjb25mX3dyaXRlKGlucHV0X2J1ZikpCisJCQkJcmV0dXJuOworCQkJc2hvd190ZXh0Ym94KE5VTEwsIF8oIkNhbid0IGNyZWF0ZSBmaWxlISAgUHJvYmFibHkgYSBub25leGlzdGVudCBkaXJlY3RvcnkuIiksIDUsIDYwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaG93X2hlbHB0ZXh0KF8oIlNhdmUgQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24iKSwgc2F2ZV9jb25maWdfaGVscCk7CisJCQlicmVhazsKKwkJY2FzZSAyNTU6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfY2xlYW51cCh2b2lkKQoreworCXRjc2V0YXR0cigxLCBUQ1NBRkxVU0gsICZpb3Nfb3JnKTsKKwl1bmxpbmsoIi5oZWxwLnRtcCIpOworCXVubGluaygibHhkaWFsb2cuc2NybHRtcCIpOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY2hhciAqbW9kZTsKKwlpbnQgc3RhdDsKKworCXNldGxvY2FsZShMQ19BTEwsICIiKTsKKwliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOworCXRleHRkb21haW4oUEFDS0FHRSk7CisKKwljb25mX3BhcnNlKGF2WzFdKTsKKwljb25mX3JlYWQoTlVMTCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxWRVJTSU9OIiwgMCk7CisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwlzcHJpbnRmKG1lbnVfYmFja3RpdGxlLCBfKCJCdXN5Qm94ICVzIENvbmZpZ3VyYXRpb24iKSwKKwkJc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisKKwltb2RlID0gZ2V0ZW52KCJNRU5VQ09ORklHX01PREUiKTsKKwlpZiAobW9kZSkgeworCQlpZiAoIXN0cmNhc2VjbXAobW9kZSwgInNpbmdsZV9tZW51IikpCisJCQlzaW5nbGVfbWVudV9tb2RlID0gMTsKKwl9CisKKwl0Y2dldGF0dHIoMSwgJmlvc19vcmcpOworCWF0ZXhpdChjb25mX2NsZWFudXApOworCWluaXRfd3NpemUoKTsKKwljb25mKCZyb290bWVudSk7CisKKwlkbyB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS15ZXNubyIpOworCQljcHJpbnQoXygiRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyIG5ldyBjb25maWd1cmF0aW9uPyIpKTsKKwkJY3ByaW50KCI1Iik7CisJCWNwcmludCgiNjAiKTsKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCX0gd2hpbGUgKHN0YXQgPCAwKTsKKworCWlmIChzdGF0ID09IDApIHsKKwkJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgorCQkJCSJFcnJvciBkdXJpbmcgd3JpdGluZyBvZiB0aGUgY29uZmlndXJhdGlvbi5cbiIKKwkJCQkiWW91ciBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2VyZSBOT1Qgc2F2ZWQuIgorCQkJCSJcblxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcHJpbnRmKF8oIlxuXG4iCisJCQkiKioqIEVuZCBvZiBjb25maWd1cmF0aW9uLlxuIgorCQkJIioqKiBFeGVjdXRlICdtYWtlJyB0byBidWlsZCB0aGUgcHJvamVjdCBvciB0cnkgJ21ha2UgaGVscCcuIgorCQkJIlxuXG4iKSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIlxuXG4iCisJCQkiWW91ciBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2VyZSBOT1Qgc2F2ZWQuIgorCQkJIlxuXG4iKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvbWVudS5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNmMmVhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RydWN0IG1lbnUgcm9vdG1lbnU7CitzdGF0aWMgc3RydWN0IG1lbnUgKipsYXN0X2VudHJ5X3B0cjsKKworc3RydWN0IGZpbGUgKmZpbGVfbGlzdDsKK3N0cnVjdCBmaWxlICpjdXJyZW50X2ZpbGU7CisKK3N0YXRpYyB2b2lkIG1lbnVfd2FybihzdHJ1Y3QgbWVudSAqbWVudSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIG1lbnUtPmZpbGUtPm5hbWUsIG1lbnUtPmxpbmVubyk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJdmFfZW5kKGFwKTsKK30KKworc3RhdGljIHZvaWQgcHJvcF93YXJuKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIHByb3AtPmZpbGUtPm5hbWUsIHByb3AtPmxpbmVubyk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZCBtZW51X2luaXQodm9pZCkKK3sKKwljdXJyZW50X2VudHJ5ID0gY3VycmVudF9tZW51ID0gJnJvb3RtZW51OworCWxhc3RfZW50cnlfcHRyID0gJnJvb3RtZW51Lmxpc3Q7Cit9CisKK3ZvaWQgbWVudV9hZGRfZW50cnkoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBtZW51ICptZW51OworCisJbWVudSA9IG1hbGxvYyhzaXplb2YoKm1lbnUpKTsKKwltZW1zZXQobWVudSwgMCwgc2l6ZW9mKCptZW51KSk7CisJbWVudS0+c3ltID0gc3ltOworCW1lbnUtPnBhcmVudCA9IGN1cnJlbnRfbWVudTsKKwltZW51LT5maWxlID0gY3VycmVudF9maWxlOworCW1lbnUtPmxpbmVubyA9IHpjb25mX2xpbmVubygpOworCisJKmxhc3RfZW50cnlfcHRyID0gbWVudTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZtZW51LT5uZXh0OworCWN1cnJlbnRfZW50cnkgPSBtZW51OworfQorCit2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpCit7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2FkZF9tZW51KHZvaWQpCit7CisJbWVudV9lbmRfZW50cnkoKTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZjdXJyZW50X2VudHJ5LT5saXN0OworCXJldHVybiBjdXJyZW50X21lbnUgPSBjdXJyZW50X2VudHJ5OworfQorCit2b2lkIG1lbnVfZW5kX21lbnUodm9pZCkKK3sKKwlsYXN0X2VudHJ5X3B0ciA9ICZjdXJyZW50X21lbnUtPm5leHQ7CisJY3VycmVudF9tZW51ID0gY3VycmVudF9tZW51LT5wYXJlbnQ7Cit9CisKK3N0cnVjdCBleHByICptZW51X2NoZWNrX2RlcChzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybiBlOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gbWVudV9jaGVja19kZXAoZS0+bGVmdC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCWUtPmxlZnQuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBtZW51X2NoZWNrX2RlcChlLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX1NZTUJPTDoKKwkJLyogY2hhbmdlICdtJyBpbnRvICdtJyAmJiBNT0RVTEVTICovCisJCWlmIChlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCXJldHVybiBleHByX2FsbG9jX2FuZChlLCBleHByX2FsbG9jX3N5bWJvbChtb2R1bGVzX3N5bSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIGU7Cit9CisKK3ZvaWQgbWVudV9hZGRfZGVwKHN0cnVjdCBleHByICpkZXApCit7CisJY3VycmVudF9lbnRyeS0+ZGVwID0gZXhwcl9hbGxvY19hbmQoY3VycmVudF9lbnRyeS0+ZGVwLCBtZW51X2NoZWNrX2RlcChkZXApKTsKK30KKwordm9pZCBtZW51X3NldF90eXBlKGludCB0eXBlKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IGN1cnJlbnRfZW50cnktPnN5bTsKKworCWlmIChzeW0tPnR5cGUgPT0gdHlwZSkKKwkJcmV0dXJuOworCWlmIChzeW0tPnR5cGUgPT0gU19VTktOT1dOKSB7CisJCXN5bS0+dHlwZSA9IHR5cGU7CisJCXJldHVybjsKKwl9CisJbWVudV93YXJuKGN1cnJlbnRfZW50cnksICJ0eXBlIG9mICclcycgcmVkZWZpbmVkIGZyb20gJyVzJyB0byAnJXMnXG4iLAorCSAgICBzeW0tPm5hbWUgPyBzeW0tPm5hbWUgOiAiPGNob2ljZT4iLAorCSAgICBzeW1fdHlwZV9uYW1lKHN5bS0+dHlwZSksIHN5bV90eXBlX25hbWUodHlwZSkpOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb3AoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBwcm9wX2FsbG9jKHR5cGUsIGN1cnJlbnRfZW50cnktPnN5bSk7CisKKwlwcm9wLT5tZW51ID0gY3VycmVudF9lbnRyeTsKKwlwcm9wLT50ZXh0ID0gcHJvbXB0OworCXByb3AtPmV4cHIgPSBleHByOworCXByb3AtPnZpc2libGUuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGRlcCk7CisKKwlpZiAocHJvbXB0KSB7CisJCWlmIChjdXJyZW50X2VudHJ5LT5wcm9tcHQpCisJCQltZW51X3dhcm4oY3VycmVudF9lbnRyeSwgInByb21wdCByZWRlZmluZWRcbiIpOworCQljdXJyZW50X2VudHJ5LT5wcm9tcHQgPSBwcm9wOworCX0KKworCXJldHVybiBwcm9wOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApCit7CisJcmV0dXJuIG1lbnVfYWRkX3Byb3AodHlwZSwgcHJvbXB0LCBOVUxMLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX2V4cHIoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX3N5bWJvbChlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByX2FsbG9jX3N5bWJvbChzeW0pLCBkZXApOworfQorCitzdGF0aWMgaW50IG1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IHN5bWJvbCAqc3ltMikKK3sKKwlyZXR1cm4gc3ltMi0+dHlwZSA9PSBTX0lOVCB8fCBzeW0yLT50eXBlID09IFNfSEVYIHx8CisJICAgICAgIChzeW0yLT50eXBlID09IFNfVU5LTk9XTiAmJiBzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3ltMi0+bmFtZSkpOworfQorCit2b2lkIHN5bV9jaGVja19wcm9wKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHN5bWJvbCAqc3ltMjsKKwlmb3IgKHByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfREVGQVVMVDoKKwkJCWlmICgoc3ltLT50eXBlID09IFNfU1RSSU5HIHx8IHN5bS0+dHlwZSA9PSBTX0lOVCB8fCBzeW0tPnR5cGUgPT0gU19IRVgpICYmCisJCQkgICAgcHJvcC0+ZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkgICAgImRlZmF1bHQgZm9yIGNvbmZpZyBzeW1ib2wgJyUnIgorCQkJCSAgICAiIG11c3QgYmUgYSBzaW5nbGUgc3ltYm9sIiwgc3ltLT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIFBfU0VMRUNUOgorCQkJc3ltMiA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJCWlmIChzeW0tPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiY29uZmlnIHN5bWJvbCAnJXMnIHVzZXMgc2VsZWN0LCBidXQgaXMgIgorCQkJCSAgICAibm90IGJvb2xlYW4gb3IgdHJpc3RhdGUiLCBzeW0tPm5hbWUpOworCQkJZWxzZSBpZiAoc3ltMi0+dHlwZSA9PSBTX1VOS05PV04pCisJCQkJcHJvcF93YXJuKHByb3AsCisJCQkJICAgICInc2VsZWN0JyB1c2VkIGJ5IGNvbmZpZyBzeW1ib2wgJyVzJyAiCisJCQkJICAgICJyZWZlciB0byB1bmRlZmluZWQgc3ltYm9sICclcyciLAorCQkJCSAgICBzeW0tPm5hbWUsIHN5bTItPm5hbWUpOworCQkJZWxzZSBpZiAoc3ltMi0+dHlwZSAhPSBTX0JPT0xFQU4gJiYgc3ltMi0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiJyVzJyBoYXMgd3JvbmcgdHlwZS4gJ3NlbGVjdCcgb25seSAiCisJCQkJICAgICJhY2NlcHQgYXJndW1lbnRzIG9mIGJvb2xlYW4gYW5kICIKKwkJCQkgICAgInRyaXN0YXRlIHR5cGUiLCBzeW0yLT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIFBfUkFOR0U6CisJCQlpZiAoc3ltLT50eXBlICE9IFNfSU5UICYmIHN5bS0+dHlwZSAhPSBTX0hFWCkKKwkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIG9ubHkgYWxsb3dlZCAiCisJCQkJICAgICAgICAgICAgICAgICJmb3IgaW50IG9yIGhleCBzeW1ib2xzIik7CisJCQlpZiAoIW1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN5bSwgcHJvcC0+ZXhwci0+bGVmdC5zeW0pIHx8CisJCQkgICAgIW1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN5bSwgcHJvcC0+ZXhwci0+cmlnaHQuc3ltKSkKKwkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIGludmFsaWQiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJfQorfQorCit2b2lkIG1lbnVfZmluYWxpemUoc3RydWN0IG1lbnUgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgbWVudSAqbWVudSwgKmxhc3RfbWVudTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICpwYXJlbnRkZXAsICpiYXNlZGVwLCAqZGVwLCAqZGVwMiwgKiplcDsKKworCXN5bSA9IHBhcmVudC0+c3ltOworCWlmIChwYXJlbnQtPmxpc3QpIHsKKwkJaWYgKHN5bSAmJiBzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCS8qIGZpbmQgdGhlIGZpcnN0IGNob2ljZSB2YWx1ZSBhbmQgZmluZCBvdXQgY2hvaWNlIHR5cGUgKi8KKwkJCWZvciAobWVudSA9IHBhcmVudC0+bGlzdDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCQlpZiAobWVudS0+c3ltKSB7CisJCQkJCWN1cnJlbnRfZW50cnkgPSBwYXJlbnQ7CisJCQkJCW1lbnVfc2V0X3R5cGUobWVudS0+c3ltLT50eXBlKTsKKwkJCQkJY3VycmVudF9lbnRyeSA9IG1lbnU7CisJCQkJCW1lbnVfc2V0X3R5cGUoc3ltLT50eXBlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcGFyZW50ZGVwID0gZXhwcl9hbGxvY19zeW1ib2woc3ltKTsKKwkJfSBlbHNlIGlmIChwYXJlbnQtPnByb21wdCkKKwkJCXBhcmVudGRlcCA9IHBhcmVudC0+cHJvbXB0LT52aXNpYmxlLmV4cHI7CisJCWVsc2UKKwkJCXBhcmVudGRlcCA9IHBhcmVudC0+ZGVwOworCisJCWZvciAobWVudSA9IHBhcmVudC0+bGlzdDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCWJhc2VkZXAgPSBleHByX3RyYW5zZm9ybShtZW51LT5kZXApOworCQkJYmFzZWRlcCA9IGV4cHJfYWxsb2NfYW5kKGV4cHJfY29weShwYXJlbnRkZXApLCBiYXNlZGVwKTsKKwkJCWJhc2VkZXAgPSBleHByX2VsaW1pbmF0ZV9kdXBzKGJhc2VkZXApOworCQkJbWVudS0+ZGVwID0gYmFzZWRlcDsKKwkJCWlmIChtZW51LT5zeW0pCisJCQkJcHJvcCA9IG1lbnUtPnN5bS0+cHJvcDsKKwkJCWVsc2UKKwkJCQlwcm9wID0gbWVudS0+cHJvbXB0OworCQkJZm9yICg7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCQkJaWYgKHByb3AtPm1lbnUgIT0gbWVudSkKKwkJCQkJY29udGludWU7CisJCQkJZGVwID0gZXhwcl90cmFuc2Zvcm0ocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJCQlkZXAgPSBleHByX2FsbG9jX2FuZChleHByX2NvcHkoYmFzZWRlcCksIGRlcCk7CisJCQkJZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhkZXApOworCQkJCWlmIChtZW51LT5zeW0gJiYgbWVudS0+c3ltLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCQkJCWRlcCA9IGV4cHJfdHJhbnNfYm9vbChkZXApOworCQkJCXByb3AtPnZpc2libGUuZXhwciA9IGRlcDsKKwkJCQlpZiAocHJvcC0+dHlwZSA9PSBQX1NFTEVDVCkgeworCQkJCQlzdHJ1Y3Qgc3ltYm9sICplcyA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJCQkJZXMtPnJldl9kZXAuZXhwciA9IGV4cHJfYWxsb2Nfb3IoZXMtPnJldl9kZXAuZXhwciwKKwkJCQkJCQlleHByX2FsbG9jX2FuZChleHByX2FsbG9jX3N5bWJvbChtZW51LT5zeW0pLCBleHByX2NvcHkoZGVwKSkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KQorCQkJbWVudV9maW5hbGl6ZShtZW51KTsKKwl9IGVsc2UgaWYgKHN5bSkgeworCQliYXNlZGVwID0gcGFyZW50LT5wcm9tcHQgPyBwYXJlbnQtPnByb21wdC0+dmlzaWJsZS5leHByIDogTlVMTDsKKwkJYmFzZWRlcCA9IGV4cHJfdHJhbnNfY29tcGFyZShiYXNlZGVwLCBFX1VORVFVQUwsICZzeW1ib2xfbm8pOworCQliYXNlZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhleHByX3RyYW5zZm9ybShiYXNlZGVwKSk7CisJCWxhc3RfbWVudSA9IE5VTEw7CisJCWZvciAobWVudSA9IHBhcmVudC0+bmV4dDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCWRlcCA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dmlzaWJsZS5leHByIDogbWVudS0+ZGVwOworCQkJaWYgKCFleHByX2NvbnRhaW5zX3N5bWJvbChkZXAsIHN5bSkpCisJCQkJYnJlYWs7CisJCQlpZiAoZXhwcl9kZXBlbmRzX3N5bWJvbChkZXAsIHN5bSkpCisJCQkJZ290byBuZXh0OworCQkJZGVwID0gZXhwcl90cmFuc19jb21wYXJlKGRlcCwgRV9VTkVRVUFMLCAmc3ltYm9sX25vKTsKKwkJCWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZXhwcl90cmFuc2Zvcm0oZGVwKSk7CisJCQlkZXAyID0gZXhwcl9jb3B5KGJhc2VkZXApOworCQkJZXhwcl9lbGltaW5hdGVfZXEoJmRlcCwgJmRlcDIpOworCQkJZXhwcl9mcmVlKGRlcCk7CisJCQlpZiAoIWV4cHJfaXNfeWVzKGRlcDIpKSB7CisJCQkJZXhwcl9mcmVlKGRlcDIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZXhwcl9mcmVlKGRlcDIpOworCQluZXh0OgorCQkJbWVudV9maW5hbGl6ZShtZW51KTsKKwkJCW1lbnUtPnBhcmVudCA9IHBhcmVudDsKKwkJCWxhc3RfbWVudSA9IG1lbnU7CisJCX0KKwkJaWYgKGxhc3RfbWVudSkgeworCQkJcGFyZW50LT5saXN0ID0gcGFyZW50LT5uZXh0OworCQkJcGFyZW50LT5uZXh0ID0gbGFzdF9tZW51LT5uZXh0OworCQkJbGFzdF9tZW51LT5uZXh0ID0gTlVMTDsKKwkJfQorCX0KKwlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZShzeW0pICYmIG1lbnUtPnN5bSkgeworCQkJbWVudS0+c3ltLT5mbGFncyB8PSBTWU1CT0xfQ0hPSUNFVkFMOworCQkJaWYgKCFtZW51LT5wcm9tcHQpCisJCQkJbWVudV93YXJuKG1lbnUsICJjaG9pY2UgdmFsdWUgbXVzdCBoYXZlIGEgcHJvbXB0Iik7CisJCQlmb3IgKHByb3AgPSBtZW51LT5zeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCQkJaWYgKHByb3AtPnR5cGUgPT0gUF9QUk9NUFQgJiYgcHJvcC0+bWVudSAhPSBtZW51KSB7CisJCQkJCXByb3Bfd2Fybihwcm9wLCAiY2hvaWNlIHZhbHVlcyAiCisJCQkJCSAgICAiY3VycmVudGx5IG9ubHkgc3VwcG9ydCBhICIKKwkJCQkJICAgICJzaW5nbGUgcHJvbXB0Iik7CisJCQkJfQorCQkJCWlmIChwcm9wLT50eXBlID09IFBfREVGQVVMVCkKKwkJCQkJcHJvcF93YXJuKHByb3AsICJkZWZhdWx0cyBmb3IgY2hvaWNlICIKKwkJCQkJICAgICJ2YWx1ZXMgbm90IHN1cHBvcnRlZCIpOworCQkJfQorCQkJY3VycmVudF9lbnRyeSA9IG1lbnU7CisJCQltZW51X3NldF90eXBlKHN5bS0+dHlwZSk7CisJCQltZW51X2FkZF9zeW1ib2woUF9DSE9JQ0UsIHN5bSwgTlVMTCk7CisJCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQkJZm9yIChlcCA9ICZwcm9wLT5leHByOyAqZXA7IGVwID0gJigqZXApLT5sZWZ0LmV4cHIpCisJCQkJOworCQkJKmVwID0gZXhwcl9hbGxvY19vbmUoRV9DSE9JQ0UsIE5VTEwpOworCQkJKCplcCktPnJpZ2h0LnN5bSA9IG1lbnUtPnN5bTsKKwkJfQorCQlpZiAobWVudS0+bGlzdCAmJiAoIW1lbnUtPnByb21wdCB8fCAhbWVudS0+cHJvbXB0LT50ZXh0KSkgeworCQkJZm9yIChsYXN0X21lbnUgPSBtZW51LT5saXN0OyA7IGxhc3RfbWVudSA9IGxhc3RfbWVudS0+bmV4dCkgeworCQkJCWxhc3RfbWVudS0+cGFyZW50ID0gcGFyZW50OworCQkJCWlmICghbGFzdF9tZW51LT5uZXh0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWxhc3RfbWVudS0+bmV4dCA9IG1lbnUtPm5leHQ7CisJCQltZW51LT5uZXh0ID0gbWVudS0+bGlzdDsKKwkJCW1lbnUtPmxpc3QgPSBOVUxMOworCQl9CisJfQorCisJaWYgKHN5bSAmJiAhKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV0FSTkVEKSkgeworCQlpZiAoc3ltLT50eXBlID09IFNfVU5LTk9XTikKKwkJCW1lbnVfd2FybihwYXJlbnQsICJjb25maWcgc3ltYm9sIGRlZmluZWQgIgorCQkJICAgICJ3aXRob3V0IHR5cGVcbiIpOworCisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgJiYgIXBhcmVudC0+cHJvbXB0KQorCQkJbWVudV93YXJuKHBhcmVudCwgImNob2ljZSBtdXN0IGhhdmUgYSBwcm9tcHRcbiIpOworCisJCS8qIENoZWNrIHByb3BlcnRpZXMgY29ubmVjdGVkIHRvIHRoaXMgc3ltYm9sICovCisJCXN5bV9jaGVja19wcm9wKHN5bSk7CisJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dBUk5FRDsKKwl9CisKKwlpZiAoc3ltICYmICFzeW1faXNfb3B0aW9uYWwoc3ltKSAmJiBwYXJlbnQtPnByb21wdCkgeworCQlzeW0tPnJldl9kZXAuZXhwciA9IGV4cHJfYWxsb2Nfb3Ioc3ltLT5yZXZfZGVwLmV4cHIsCisJCQkJZXhwcl9hbGxvY19hbmQocGFyZW50LT5wcm9tcHQtPnZpc2libGUuZXhwciwKKwkJCQkJZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9tb2QpKSk7CisJfQorfQorCitib29sIG1lbnVfaXNfdmlzaWJsZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXRyaXN0YXRlIHZpc2libGU7CisKKwlpZiAoIW1lbnUtPnByb21wdCkKKwkJcmV0dXJuIGZhbHNlOworCXN5bSA9IG1lbnUtPnN5bTsKKwlpZiAoc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCXZpc2libGUgPSBtZW51LT5wcm9tcHQtPnZpc2libGUudHJpOworCX0gZWxzZQorCQl2aXNpYmxlID0gbWVudS0+cHJvbXB0LT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwcik7CisKKwlpZiAodmlzaWJsZSAhPSBubykKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFzeW0gfHwgc3ltX2dldF90cmlzdGF0ZV92YWx1ZShtZW51LT5zeW0pID09IG5vKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBjaGFyICptZW51X2dldF9wcm9tcHQoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJaWYgKG1lbnUtPnByb21wdCkKKwkJcmV0dXJuIF8obWVudS0+cHJvbXB0LT50ZXh0KTsKKwllbHNlIGlmIChtZW51LT5zeW0pCisJCXJldHVybiBfKG1lbnUtPnN5bS0+bmFtZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2dldF9yb290X21lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJcmV0dXJuICZyb290bWVudTsKK30KKworc3RydWN0IG1lbnUgKm1lbnVfZ2V0X3BhcmVudF9tZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlmb3IgKDsgbWVudSAhPSAmcm9vdG1lbnU7IG1lbnUgPSBtZW51LT5wYXJlbnQpIHsKKwkJdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IDA7CisJCWlmICh0eXBlID09IFBfTUVOVSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbWVudTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTE4OWMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCkBAIC0wLDAgKzEsMTQyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxxYXBwbGljYXRpb24uaD4KKyNpbmNsdWRlIDxxbWFpbndpbmRvdy5oPgorI2luY2x1ZGUgPHF0b29sYmFyLmg+CisjaW5jbHVkZSA8cXZib3guaD4KKyNpbmNsdWRlIDxxc3BsaXR0ZXIuaD4KKyNpbmNsdWRlIDxxbGlzdHZpZXcuaD4KKyNpbmNsdWRlIDxxdGV4dHZpZXcuaD4KKyNpbmNsdWRlIDxxbGluZWVkaXQuaD4KKyNpbmNsdWRlIDxxbWVudWJhci5oPgorI2luY2x1ZGUgPHFtZXNzYWdlYm94Lmg+CisjaW5jbHVkZSA8cWFjdGlvbi5oPgorI2luY2x1ZGUgPHFoZWFkZXIuaD4KKyNpbmNsdWRlIDxxZmlsZWRpYWxvZy5oPgorI2luY2x1ZGUgPHFyZWdleHAuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGtjLmgiCisjaW5jbHVkZSAicWNvbmYuaCIKKworI2luY2x1ZGUgInFjb25mLm1vYyIKKyNpbmNsdWRlICJpbWFnZXMuYyIKKworI2lmZGVmIF8KKyMgdW5kZWYgXworIyBkZWZpbmUgXyBxZ2V0dGV4dAorI2VuZGlmCisKK3N0YXRpYyBRQXBwbGljYXRpb24gKmNvbmZpZ0FwcDsKKworc3RhdGljIGlubGluZSBRU3RyaW5nIHFnZXR0ZXh0KGNvbnN0IGNoYXIqIHN0cikKK3sKKyAgcmV0dXJuIFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoZ2V0dGV4dChzdHIpKTsKK30KKworc3RhdGljIGlubGluZSBRU3RyaW5nIHFnZXR0ZXh0KGNvbnN0IFFTdHJpbmcmIHN0cikKK3sKKyAgcmV0dXJuIFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoZ2V0dGV4dChzdHIubGF0aW4xKCkpKTsKK30KKworQ29uZmlnU2V0dGluZ3M6OkNvbmZpZ1NldHRpbmdzKCkKKwk6IHNob3dBbGwoZmFsc2UpLCBzaG93TmFtZShmYWxzZSksIHNob3dSYW5nZShmYWxzZSksIHNob3dEYXRhKGZhbHNlKQoreworfQorCisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKy8qKgorICogUmVhZHMgdGhlIGxpc3QgY29sdW1uIHNldHRpbmdzIGZyb20gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgorICovCit2b2lkIENvbmZpZ1NldHRpbmdzOjpyZWFkTGlzdFNldHRpbmdzKCkKK3sKKwlzaG93QWxsID0gcmVhZEJvb2xFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0FsbCIsIGZhbHNlKTsKKwlzaG93TmFtZSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dOYW1lIiwgZmFsc2UpOworCXNob3dSYW5nZSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dSYW5nZSIsIGZhbHNlKTsKKwlzaG93RGF0YSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEYXRhIiwgZmFsc2UpOworfQorCisvKioKKyAqIFJlYWRzIGEgbGlzdCBvZiBpbnRlZ2VyIHZhbHVlcyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncy4KKyAqLworUVZhbHVlTGlzdDxpbnQ+IENvbmZpZ1NldHRpbmdzOjpyZWFkU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBib29sICpvaykKK3sKKwlRVmFsdWVMaXN0PGludD4gcmVzdWx0OworCVFTdHJpbmdMaXN0IGVudHJ5TGlzdCA9IHJlYWRMaXN0RW50cnkoa2V5LCBvayk7CisJaWYgKG9rKSB7CisJCVFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdDsKKwkJZm9yIChpdCA9IGVudHJ5TGlzdC5iZWdpbigpOyBpdCAhPSBlbnRyeUxpc3QuZW5kKCk7ICsraXQpCisJCQlyZXN1bHQucHVzaF9iYWNrKCgqaXQpLnRvSW50KCkpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogV3JpdGVzIGEgbGlzdCBvZiBpbnRlZ2VyIHZhbHVlcyB0byB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MuCisgKi8KK2Jvb2wgQ29uZmlnU2V0dGluZ3M6OndyaXRlU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBjb25zdCBRVmFsdWVMaXN0PGludD4mIHZhbHVlKQoreworCVFTdHJpbmdMaXN0IHN0cmluZ0xpc3Q7CisJUVZhbHVlTGlzdDxpbnQ+OjpDb25zdEl0ZXJhdG9yIGl0OworCisJZm9yIChpdCA9IHZhbHVlLmJlZ2luKCk7IGl0ICE9IHZhbHVlLmVuZCgpOyArK2l0KQorCQlzdHJpbmdMaXN0LnB1c2hfYmFjayhRU3RyaW5nOjpudW1iZXIoKml0KSk7CisJcmV0dXJuIHdyaXRlRW50cnkoa2V5LCBzdHJpbmdMaXN0KTsKK30KKyNlbmRpZgorCisKKy8qCisgKiB1cGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiBhIG1lbnUgZW50cnkKKyAqICAgcmVtb3Zlcy9hZGRzIHRoZSBlbnRyaWVzIGZyb20gdGhlIHBhcmVudCB3aWRnZXQgYXMgbmVjZXNzYXJ5CisgKgorICogcGFyZW50OiBlaXRoZXIgdGhlIG1lbnUgbGlzdCB3aWRnZXQgb3IgYSBtZW51IGVudHJ5IHdpZGdldAorICogbWVudTogZW50cnkgdG8gYmUgdXBkYXRlZAorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUD4KK3ZvaWQgQ29uZmlnTGlzdDo6dXBkYXRlTWVudUxpc3QoUCogcGFyZW50LCBzdHJ1Y3QgbWVudSogbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSogY2hpbGQ7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlDb25maWdJdGVtKiBsYXN0OworCWJvb2wgdmlzaWJsZTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJaWYgKCFtZW51KSB7CisJCXdoaWxlICgoaXRlbSA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpKSkKKwkJCWRlbGV0ZSBpdGVtOworCQlyZXR1cm47CisJfQorCisJbGFzdCA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworCWlmIChsYXN0ICYmICFsYXN0LT5nb1BhcmVudCkKKwkJbGFzdCA9IDA7CisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCWl0ZW0gPSBsYXN0ID8gbGFzdC0+bmV4dFNpYmxpbmcoKSA6IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworCQl0eXBlID0gY2hpbGQtPnByb21wdCA/IGNoaWxkLT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgbWVudU1vZGU6CisJCQlpZiAoIShjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QpKQorCQkJCWdvdG8gaGlkZTsKKwkJCWJyZWFrOworCQljYXNlIHN5bWJvbE1vZGU6CisJCQlpZiAoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKQorCQkJCWdvdG8gaGlkZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQl2aXNpYmxlID0gbWVudV9pc192aXNpYmxlKGNoaWxkKTsKKwkJaWYgKHNob3dBbGwgfHwgdmlzaWJsZSkgeworCQkJaWYgKCFpdGVtIHx8IGl0ZW0tPm1lbnUgIT0gY2hpbGQpCisJCQkJaXRlbSA9IG5ldyBDb25maWdJdGVtKHBhcmVudCwgbGFzdCwgY2hpbGQsIHZpc2libGUpOworCQkJZWxzZQorCQkJCWl0ZW0tPnRlc3RVcGRhdGVNZW51KHZpc2libGUpOworCisJCQlpZiAobW9kZSA9PSBmdWxsTW9kZSB8fCBtb2RlID09IG1lbnVNb2RlIHx8IHR5cGUgIT0gUF9NRU5VKQorCQkJCXVwZGF0ZU1lbnVMaXN0KGl0ZW0sIGNoaWxkKTsKKwkJCWVsc2UKKwkJCQl1cGRhdGVNZW51TGlzdChpdGVtLCAwKTsKKwkJCWxhc3QgPSBpdGVtOworCQkJY29udGludWU7CisJCX0KKwloaWRlOgorCQlpZiAoaXRlbSAmJiBpdGVtLT5tZW51ID09IGNoaWxkKSB7CisJCQlsYXN0ID0gcGFyZW50LT5maXJzdENoaWxkKCk7CisJCQlpZiAobGFzdCA9PSBpdGVtKQorCQkJCWxhc3QgPSAwOworCQkJZWxzZSB3aGlsZSAobGFzdC0+bmV4dFNpYmxpbmcoKSAhPSBpdGVtKQorCQkJCWxhc3QgPSBsYXN0LT5uZXh0U2libGluZygpOworCQkJZGVsZXRlIGl0ZW07CisJCX0KKwl9Cit9CisKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorLyoKKyAqIHNldCB0aGUgbmV3IGRhdGEKKyAqIFRPRE8gY2hlY2sgdGhlIHZhbHVlCisgKi8KK3ZvaWQgQ29uZmlnSXRlbTo6b2tSZW5hbWUoaW50IGNvbCkKK3sKKwlQYXJlbnQ6Om9rUmVuYW1lKGNvbCk7CisJc3ltX3NldF9zdHJpbmdfdmFsdWUobWVudS0+c3ltLCB0ZXh0KGRhdGFDb2xJZHgpLmxhdGluMSgpKTsKK30KKyNlbmRpZgorCisvKgorICogdXBkYXRlIHRoZSBkaXNwbGF5ZWQgb2YgYSBtZW51IGVudHJ5CisgKi8KK3ZvaWQgQ29uZmlnSXRlbTo6dXBkYXRlTWVudSh2b2lkKQoreworCUNvbmZpZ0xpc3QqIGxpc3Q7CisJc3RydWN0IHN5bWJvbCogc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlRU3RyaW5nIHByb21wdDsKKwlpbnQgdHlwZTsKKwl0cmlzdGF0ZSBleHByOworCisJbGlzdCA9IGxpc3RWaWV3KCk7CisJaWYgKGdvUGFyZW50KSB7CisJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPm1lbnVCYWNrUGl4KTsKKwkJcHJvbXB0ID0gIi4uIjsKKwkJZ290byBzZXRfcHJvbXB0OworCX0KKworCXN5bSA9IG1lbnUtPnN5bTsKKwlwcm9wID0gbWVudS0+cHJvbXB0OworCXByb21wdCA9IFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQobWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKworCWlmIChwcm9wKSBzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwljYXNlIFBfTUVOVToKKwkJaWYgKGxpc3QtPm1vZGUgPT0gc2luZ2xlTW9kZSB8fCBsaXN0LT5tb2RlID09IHN5bWJvbE1vZGUpIHsKKwkJCS8qIGEgbWVudWNvbmZpZyBlbnRyeSBpcyBkaXNwbGF5ZWQgZGlmZmVyZW50bHkKKwkJCSAqIGRlcGVuZGluZyB3aGV0aGVyIGl0J3MgYXQgdGhlIHZpZXcgcm9vdCBvciBhIGNoaWxkLgorCQkJICovCisJCQlpZiAoc3ltICYmIGxpc3QtPnJvb3RFbnRyeSA9PSBtZW51KQorCQkJCWJyZWFrOworCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+bWVudVBpeCk7CisJCX0gZWxzZSB7CisJCQlpZiAoc3ltKQorCQkJCWJyZWFrOworCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgMCk7CisJCX0KKwkJZ290byBzZXRfcHJvbXB0OworCWNhc2UgUF9DT01NRU5UOgorCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCAwKTsKKwkJZ290byBzZXRfcHJvbXB0OworCWRlZmF1bHQ6CisJCTsKKwl9CisJaWYgKCFzeW0pCisJCWdvdG8gc2V0X3Byb21wdDsKKworCXNldFRleHQobmFtZUNvbElkeCwgUVN0cmluZzo6ZnJvbUxvY2FsOEJpdChzeW0tPm5hbWUpKTsKKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCWNoYXIgY2g7CisKKwkJaWYgKCFzeW1faXNfY2hhbmdhYmxlKHN5bSkgJiYgIWxpc3QtPnNob3dBbGwpIHsKKwkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIDApOworCQkJc2V0VGV4dChub0NvbElkeCwgUVN0cmluZzo6bnVsbCk7CisJCQlzZXRUZXh0KG1vZENvbElkeCwgUVN0cmluZzo6bnVsbCk7CisJCQlzZXRUZXh0KHllc0NvbElkeCwgUVN0cmluZzo6bnVsbCk7CisJCQlicmVhazsKKwkJfQorCQlleHByID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlzd2l0Y2ggKGV4cHIpIHsKKwkJY2FzZSB5ZXM6CisJCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHR5cGUgPT0gU19CT09MRUFOKQorCQkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPmNob2ljZVllc1BpeCk7CisJCQllbHNlCisJCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+c3ltYm9sWWVzUGl4KTsKKwkJCXNldFRleHQoeWVzQ29sSWR4LCAiWSIpOworCQkJY2ggPSAnWSc7CisJCQlicmVhazsKKwkJY2FzZSBtb2Q6CisJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5zeW1ib2xNb2RQaXgpOworCQkJc2V0VGV4dChtb2RDb2xJZHgsICJNIik7CisJCQljaCA9ICdNJzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiB0eXBlID09IFNfQk9PTEVBTikKKwkJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5jaG9pY2VOb1BpeCk7CisJCQllbHNlCisJCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+c3ltYm9sTm9QaXgpOworCQkJc2V0VGV4dChub0NvbElkeCwgIk4iKTsKKwkJCWNoID0gJ04nOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGV4cHIgIT0gbm8pCisJCQlzZXRUZXh0KG5vQ29sSWR4LCBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pID8gIl8iIDogMCk7CisJCWlmIChleHByICE9IG1vZCkKKwkJCXNldFRleHQobW9kQ29sSWR4LCBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKSA/ICJfIiA6IDApOworCQlpZiAoZXhwciAhPSB5ZXMpCisJCQlzZXRUZXh0KHllc0NvbElkeCwgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykgPyAiXyIgOiAwKTsKKworCQlzZXRUZXh0KGRhdGFDb2xJZHgsIFFDaGFyKGNoKSk7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQljb25zdCBjaGFyKiBkYXRhOworCisJCWRhdGEgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwkJaW50IGkgPSBsaXN0LT5tYXBJZHgoZGF0YUNvbElkeCk7CisJCWlmIChpID49IDApCisJCQlzZXRSZW5hbWVFbmFibGVkKGksIFRSVUUpOworI2VuZGlmCisJCXNldFRleHQoZGF0YUNvbElkeCwgZGF0YSk7CisJCWlmICh0eXBlID09IFNfU1RSSU5HKQorCQkJcHJvbXB0ID0gUVN0cmluZygiJTE6ICUyIikuYXJnKHByb21wdCkuYXJnKGRhdGEpOworCQllbHNlCisJCQlwcm9tcHQgPSBRU3RyaW5nKCIoJTIpICUxIikuYXJnKHByb21wdCkuYXJnKGRhdGEpOworCQlicmVhazsKKwl9CisJaWYgKCFzeW1faGFzX3ZhbHVlKHN5bSkgJiYgdmlzaWJsZSkKKwkJcHJvbXB0ICs9ICIgKE5FVykiOworc2V0X3Byb21wdDoKKwlzZXRUZXh0KHByb21wdENvbElkeCwgcHJvbXB0KTsKK30KKwordm9pZCBDb25maWdJdGVtOjp0ZXN0VXBkYXRlTWVudShib29sIHYpCit7CisJQ29uZmlnSXRlbSogaTsKKworCXZpc2libGUgPSB2OworCWlmICghbWVudSkKKwkJcmV0dXJuOworCisJc3ltX2NhbGNfdmFsdWUobWVudS0+c3ltKTsKKwlpZiAobWVudS0+ZmxhZ3MgJiBNRU5VX0NIQU5HRUQpIHsKKwkJLyogdGhlIG1lbnUgZW50cnkgY2hhbmdlZCwgc28gdXBkYXRlIGFsbCBsaXN0IGl0ZW1zICovCisJCW1lbnUtPmZsYWdzICY9IH5NRU5VX0NIQU5HRUQ7CisJCWZvciAoaSA9IChDb25maWdJdGVtKiltZW51LT5kYXRhOyBpOyBpID0gaS0+bmV4dEl0ZW0pCisJCQlpLT51cGRhdGVNZW51KCk7CisJfSBlbHNlIGlmIChsaXN0VmlldygpLT51cGRhdGVBbGwpCisJCXVwZGF0ZU1lbnUoKTsKK30KKwordm9pZCBDb25maWdJdGVtOjpwYWludENlbGwoUVBhaW50ZXIqIHAsIGNvbnN0IFFDb2xvckdyb3VwJiBjZywgaW50IGNvbHVtbiwgaW50IHdpZHRoLCBpbnQgYWxpZ24pCit7CisJQ29uZmlnTGlzdCogbGlzdCA9IGxpc3RWaWV3KCk7CisKKwlpZiAodmlzaWJsZSkgeworCQlpZiAoaXNTZWxlY3RlZCgpICYmICFsaXN0LT5oYXNGb2N1cygpICYmIGxpc3QtPm1vZGUgPT0gbWVudU1vZGUpCisJCQlQYXJlbnQ6OnBhaW50Q2VsbChwLCBsaXN0LT5pbmFjdGl2ZWRDb2xvckdyb3VwLCBjb2x1bW4sIHdpZHRoLCBhbGlnbik7CisJCWVsc2UKKwkJCVBhcmVudDo6cGFpbnRDZWxsKHAsIGNnLCBjb2x1bW4sIHdpZHRoLCBhbGlnbik7CisJfSBlbHNlCisJCVBhcmVudDo6cGFpbnRDZWxsKHAsIGxpc3QtPmRpc2FibGVkQ29sb3JHcm91cCwgY29sdW1uLCB3aWR0aCwgYWxpZ24pOworfQorCisvKgorICogY29uc3RydWN0IGEgbWVudSBlbnRyeQorICovCit2b2lkIENvbmZpZ0l0ZW06OmluaXQodm9pZCkKK3sKKwlpZiAobWVudSkgeworCQlDb25maWdMaXN0KiBsaXN0ID0gbGlzdFZpZXcoKTsKKwkJbmV4dEl0ZW0gPSAoQ29uZmlnSXRlbSopbWVudS0+ZGF0YTsKKwkJbWVudS0+ZGF0YSA9IHRoaXM7CisKKwkJaWYgKGxpc3QtPm1vZGUgIT0gZnVsbE1vZGUpCisJCQlzZXRPcGVuKFRSVUUpOworCQlzeW1fY2FsY192YWx1ZShtZW51LT5zeW0pOworCX0KKwl1cGRhdGVNZW51KCk7Cit9CisKKy8qCisgKiBkZXN0cnVjdCBhIG1lbnUgZW50cnkKKyAqLworQ29uZmlnSXRlbTo6fkNvbmZpZ0l0ZW0odm9pZCkKK3sKKwlpZiAobWVudSkgeworCQlDb25maWdJdGVtKiogaXAgPSAoQ29uZmlnSXRlbSoqKSZtZW51LT5kYXRhOworCQlmb3IgKDsgKmlwOyBpcCA9ICYoKmlwKS0+bmV4dEl0ZW0pIHsKKwkJCWlmICgqaXAgPT0gdGhpcykgeworCQkJCSppcCA9IG5leHRJdGVtOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIENvbmZpZ0xpbmVFZGl0OjpzaG93KENvbmZpZ0l0ZW0qIGkpCit7CisJaXRlbSA9IGk7CisJaWYgKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGl0ZW0tPm1lbnUtPnN5bSkpCisJCXNldFRleHQoUVN0cmluZzo6ZnJvbUxvY2FsOEJpdChzeW1fZ2V0X3N0cmluZ192YWx1ZShpdGVtLT5tZW51LT5zeW0pKSk7CisJZWxzZQorCQlzZXRUZXh0KFFTdHJpbmc6Om51bGwpOworCVBhcmVudDo6c2hvdygpOworCXNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTGluZUVkaXQ6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBlKQoreworCXN3aXRjaCAoZS0+a2V5KCkpIHsKKwljYXNlIEtleV9Fc2NhcGU6CisJCWJyZWFrOworCWNhc2UgS2V5X1JldHVybjoKKwljYXNlIEtleV9FbnRlcjoKKwkJc3ltX3NldF9zdHJpbmdfdmFsdWUoaXRlbS0+bWVudS0+c3ltLCB0ZXh0KCkubGF0aW4xKCkpOworCQlwYXJlbnQoKS0+dXBkYXRlTGlzdChpdGVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUGFyZW50OjprZXlQcmVzc0V2ZW50KGUpOworCQlyZXR1cm47CisJfQorCWUtPmFjY2VwdCgpOworCXBhcmVudCgpLT5saXN0LT5zZXRGb2N1cygpOworCWhpZGUoKTsKK30KKworQ29uZmlnTGlzdDo6Q29uZmlnTGlzdChDb25maWdWaWV3KiBwLCBDb25maWdNYWluV2luZG93KiBjdiwgQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzKQorCTogUGFyZW50KHApLCBjdmlldyhjdiksCisJICB1cGRhdGVBbGwoZmFsc2UpLAorCSAgc3ltYm9sWWVzUGl4KHhwbV9zeW1ib2xfeWVzKSwgc3ltYm9sTW9kUGl4KHhwbV9zeW1ib2xfbW9kKSwgc3ltYm9sTm9QaXgoeHBtX3N5bWJvbF9ubyksCisJICBjaG9pY2VZZXNQaXgoeHBtX2Nob2ljZV95ZXMpLCBjaG9pY2VOb1BpeCh4cG1fY2hvaWNlX25vKSwKKwkgIG1lbnVQaXgoeHBtX21lbnUpLCBtZW51SW52UGl4KHhwbV9tZW51X2ludiksIG1lbnVCYWNrUGl4KHhwbV9tZW51YmFjayksIHZvaWRQaXgoeHBtX3ZvaWQpLAorCSAgc2hvd0FsbChmYWxzZSksIHNob3dOYW1lKGZhbHNlKSwgc2hvd1JhbmdlKGZhbHNlKSwgc2hvd0RhdGEoZmFsc2UpLAorCSAgcm9vdEVudHJ5KDApCit7CisJaW50IGk7CisKKwlzZXRTb3J0aW5nKC0xKTsKKwlzZXRSb290SXNEZWNvcmF0ZWQoVFJVRSk7CisJZGlzYWJsZWRDb2xvckdyb3VwID0gcGFsZXR0ZSgpLmFjdGl2ZSgpOworCWRpc2FibGVkQ29sb3JHcm91cC5zZXRDb2xvcihRQ29sb3JHcm91cDo6VGV4dCwgcGFsZXR0ZSgpLmRpc2FibGVkKCkudGV4dCgpKTsKKwlpbmFjdGl2ZWRDb2xvckdyb3VwID0gcGFsZXR0ZSgpLmFjdGl2ZSgpOworCWluYWN0aXZlZENvbG9yR3JvdXAuc2V0Q29sb3IoUUNvbG9yR3JvdXA6OkhpZ2hsaWdodCwgcGFsZXR0ZSgpLmRpc2FibGVkKCkuaGlnaGxpZ2h0KCkpOworCisJY29ubmVjdCh0aGlzLCBTSUdOQUwoc2VsZWN0aW9uQ2hhbmdlZCh2b2lkKSksCisJCVNMT1QodXBkYXRlU2VsZWN0aW9uKHZvaWQpKSk7CisKKwlpZiAoY29uZmlnU2V0dGluZ3MpIHsKKwkJc2hvd0FsbCA9IGNvbmZpZ1NldHRpbmdzLT5zaG93QWxsOworCQlzaG93TmFtZSA9IGNvbmZpZ1NldHRpbmdzLT5zaG93TmFtZTsKKwkJc2hvd1JhbmdlID0gY29uZmlnU2V0dGluZ3MtPnNob3dSYW5nZTsKKwkJc2hvd0RhdGEgPSBjb25maWdTZXR0aW5ncy0+c2hvd0RhdGE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvbE5yOyBpKyspCisJCWNvbE1hcFtpXSA9IGNvbFJldk1hcFtpXSA9IC0xOworCWFkZENvbHVtbihwcm9tcHRDb2xJZHgsICJPcHRpb24iKTsKKworCXJlaW5pdCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnJlaW5pdCh2b2lkKQoreworCXJlbW92ZUNvbHVtbihkYXRhQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4oeWVzQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4obW9kQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4obm9Db2xJZHgpOworCXJlbW92ZUNvbHVtbihuYW1lQ29sSWR4KTsKKworCWlmIChzaG93TmFtZSkKKwkJYWRkQ29sdW1uKG5hbWVDb2xJZHgsICJOYW1lIik7CisJaWYgKHNob3dSYW5nZSkgeworCQlhZGRDb2x1bW4obm9Db2xJZHgsICJOIik7CisJCWFkZENvbHVtbihtb2RDb2xJZHgsICJNIik7CisJCWFkZENvbHVtbih5ZXNDb2xJZHgsICJZIik7CisJfQorCWlmIChzaG93RGF0YSkKKwkJYWRkQ29sdW1uKGRhdGFDb2xJZHgsICJWYWx1ZSIpOworCisJdXBkYXRlTGlzdEFsbCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnVwZGF0ZVNlbGVjdGlvbih2b2lkKQoreworCXN0cnVjdCBtZW51ICptZW51OworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlDb25maWdJdGVtKiBpdGVtID0gKENvbmZpZ0l0ZW0qKXNlbGVjdGVkSXRlbSgpOworCWlmICghaXRlbSkKKwkJcmV0dXJuOworCisJY3ZpZXctPnNldEhlbHAoaXRlbSk7CisKKwltZW51ID0gaXRlbS0+bWVudTsKKwlpZiAoIW1lbnUpCisJCXJldHVybjsKKwl0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCWlmIChtb2RlID09IG1lbnVNb2RlICYmIHR5cGUgPT0gUF9NRU5VKQorCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKK30KKwordm9pZCBDb25maWdMaXN0Ojp1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pCit7CisJQ29uZmlnSXRlbSogbGFzdCA9IDA7CisKKwlpZiAoIXJvb3RFbnRyeSkKKwkJZ290byB1cGRhdGU7CisKKwlpZiAocm9vdEVudHJ5ICE9ICZyb290bWVudSAmJiAobW9kZSA9PSBzaW5nbGVNb2RlIHx8CisJICAgIChtb2RlID09IHN5bWJvbE1vZGUgJiYgcm9vdEVudHJ5LT5wYXJlbnQgIT0gJnJvb3RtZW51KSkpIHsKKwkJaXRlbSA9IGZpcnN0Q2hpbGQoKTsKKwkJaWYgKCFpdGVtKQorCQkJaXRlbSA9IG5ldyBDb25maWdJdGVtKHRoaXMsIDAsIHRydWUpOworCQlsYXN0ID0gaXRlbTsKKwl9CisJaWYgKChtb2RlID09IHNpbmdsZU1vZGUgfHwgKG1vZGUgPT0gc3ltYm9sTW9kZSAmJiAhKHJvb3RFbnRyeS0+ZmxhZ3MgJiBNRU5VX1JPT1QpKSkgJiYKKwkgICAgcm9vdEVudHJ5LT5zeW0gJiYgcm9vdEVudHJ5LT5wcm9tcHQpIHsKKwkJaXRlbSA9IGxhc3QgPyBsYXN0LT5uZXh0U2libGluZygpIDogZmlyc3RDaGlsZCgpOworCQlpZiAoIWl0ZW0pCisJCQlpdGVtID0gbmV3IENvbmZpZ0l0ZW0odGhpcywgbGFzdCwgcm9vdEVudHJ5LCB0cnVlKTsKKwkJZWxzZQorCQkJaXRlbS0+dGVzdFVwZGF0ZU1lbnUodHJ1ZSk7CisKKwkJdXBkYXRlTWVudUxpc3QoaXRlbSwgcm9vdEVudHJ5KTsKKwkJdHJpZ2dlclVwZGF0ZSgpOworCQlyZXR1cm47CisJfQordXBkYXRlOgorCXVwZGF0ZU1lbnVMaXN0KHRoaXMsIHJvb3RFbnRyeSk7CisJdHJpZ2dlclVwZGF0ZSgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnNldEFsbE9wZW4oYm9vbCBvcGVuKQoreworCVFMaXN0Vmlld0l0ZW1JdGVyYXRvciBpdCh0aGlzKTsKKworCWZvciAoOyBpdC5jdXJyZW50KCk7IGl0KyspCisJCWl0LmN1cnJlbnQoKS0+c2V0T3BlbihvcGVuKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpzZXRWYWx1ZShDb25maWdJdGVtKiBpdGVtLCB0cmlzdGF0ZSB2YWwpCit7CisJc3RydWN0IHN5bWJvbCogc3ltOworCWludCB0eXBlOworCXRyaXN0YXRlIG9sZHZhbDsKKworCXN5bSA9IGl0ZW0tPm1lbnUgPyBpdGVtLT5tZW51LT5zeW0gOiAwOworCWlmICghc3ltKQorCQlyZXR1cm47CisKKwl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlvbGR2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisKKwkJaWYgKCFzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgdmFsKSkKKwkJCXJldHVybjsKKwkJaWYgKG9sZHZhbCA9PSBubyAmJiBpdGVtLT5tZW51LT5saXN0KQorCQkJaXRlbS0+c2V0T3BlbihUUlVFKTsKKwkJcGFyZW50KCktPnVwZGF0ZUxpc3QoaXRlbSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBDb25maWdMaXN0OjpjaGFuZ2VWYWx1ZShDb25maWdJdGVtKiBpdGVtKQoreworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlzdHJ1Y3QgbWVudSogbWVudTsKKwlpbnQgdHlwZSwgb2xkZXhwciwgbmV3ZXhwcjsKKworCW1lbnUgPSBpdGVtLT5tZW51OworCWlmICghbWVudSkKKwkJcmV0dXJuOworCXN5bSA9IG1lbnUtPnN5bTsKKwlpZiAoIXN5bSkgeworCQlpZiAoaXRlbS0+bWVudS0+bGlzdCkKKwkJCWl0ZW0tPnNldE9wZW4oIWl0ZW0tPmlzT3BlbigpKTsKKwkJcmV0dXJuOworCX0KKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW9sZGV4cHIgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCW5ld2V4cHIgPSBzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChpdGVtLT5tZW51LT5saXN0KSB7CisJCQlpZiAob2xkZXhwciA9PSBuZXdleHByKQorCQkJCWl0ZW0tPnNldE9wZW4oIWl0ZW0tPmlzT3BlbigpKTsKKwkJCWVsc2UgaWYgKG9sZGV4cHIgPT0gbm8pCisJCQkJaXRlbS0+c2V0T3BlbihUUlVFKTsKKwkJfQorCQlpZiAob2xkZXhwciAhPSBuZXdleHByKQorCQkJcGFyZW50KCktPnVwZGF0ZUxpc3QoaXRlbSk7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJCWlmIChjb2xNYXBbZGF0YUNvbElkeF0gPj0gMCkKKwkJCWl0ZW0tPnN0YXJ0UmVuYW1lKGNvbE1hcFtkYXRhQ29sSWR4XSk7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFyZW50KCktPmxpbmVFZGl0LT5zaG93KGl0ZW0pOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6c2V0Um9vdE1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKworCWlmIChyb290RW50cnkgPT0gbWVudSkKKwkJcmV0dXJuOworCXR5cGUgPSBtZW51ICYmIG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAodHlwZSAhPSBQX01FTlUpCisJCXJldHVybjsKKwl1cGRhdGVNZW51TGlzdCh0aGlzLCAwKTsKKwlyb290RW50cnkgPSBtZW51OworCXVwZGF0ZUxpc3RBbGwoKTsKKwlzZXRTZWxlY3RlZChjdXJyZW50SXRlbSgpLCBoYXNGb2N1cygpKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpzZXRQYXJlbnRNZW51KHZvaWQpCit7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlzdHJ1Y3QgbWVudSAqb2xkcm9vdDsKKworCW9sZHJvb3QgPSByb290RW50cnk7CisJaWYgKHJvb3RFbnRyeSA9PSAmcm9vdG1lbnUpCisJCXJldHVybjsKKwlzZXRSb290TWVudShtZW51X2dldF9wYXJlbnRfbWVudShyb290RW50cnktPnBhcmVudCkpOworCisJUUxpc3RWaWV3SXRlbUl0ZXJhdG9yIGl0KHRoaXMpOworCWZvciAoOyAoaXRlbSA9IChDb25maWdJdGVtKilpdC5jdXJyZW50KCkpOyBpdCsrKSB7CisJCWlmIChpdGVtLT5tZW51ID09IG9sZHJvb3QpIHsKKwkJCXNldEN1cnJlbnRJdGVtKGl0ZW0pOworCQkJZW5zdXJlSXRlbVZpc2libGUoaXRlbSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBDb25maWdMaXN0OjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCogZXYpCit7CisJUUxpc3RWaWV3SXRlbSogaSA9IGN1cnJlbnRJdGVtKCk7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJaWYgKGV2LT5rZXkoKSA9PSBLZXlfRXNjYXBlICYmIG1vZGUgIT0gZnVsbE1vZGUpIHsKKwkJZW1pdCBwYXJlbnRTZWxlY3RlZCgpOworCQlldi0+YWNjZXB0KCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWkpIHsKKwkJUGFyZW50OjprZXlQcmVzc0V2ZW50KGV2KTsKKwkJcmV0dXJuOworCX0KKwlpdGVtID0gKENvbmZpZ0l0ZW0qKWk7CisKKwlzd2l0Y2ggKGV2LT5rZXkoKSkgeworCWNhc2UgS2V5X1JldHVybjoKKwljYXNlIEtleV9FbnRlcjoKKwkJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCQllbWl0IHBhcmVudFNlbGVjdGVkKCk7CisJCQlicmVhazsKKwkJfQorCQltZW51ID0gaXRlbS0+bWVudTsKKwkJaWYgKCFtZW51KQorCQkJYnJlYWs7CisJCXR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJCWlmICh0eXBlID09IFBfTUVOVSAmJiByb290RW50cnkgIT0gbWVudSAmJgorCQkgICAgbW9kZSAhPSBmdWxsTW9kZSAmJiBtb2RlICE9IG1lbnVNb2RlKSB7CisJCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBLZXlfU3BhY2U6CisJCWNoYW5nZVZhbHVlKGl0ZW0pOworCQlicmVhazsKKwljYXNlIEtleV9OOgorCQlzZXRWYWx1ZShpdGVtLCBubyk7CisJCWJyZWFrOworCWNhc2UgS2V5X006CisJCXNldFZhbHVlKGl0ZW0sIG1vZCk7CisJCWJyZWFrOworCWNhc2UgS2V5X1k6CisJCXNldFZhbHVlKGl0ZW0sIHllcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBhcmVudDo6a2V5UHJlc3NFdmVudChldik7CisJCXJldHVybjsKKwl9CisJZXYtPmFjY2VwdCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCS8vUVBvaW50IHAoY29udGVudHNUb1ZpZXdwb3J0KGUtPnBvcygpKSk7CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VQcmVzc0V2ZW50OiAlZCwlZFxuIiwgcC54KCksIHAueSgpKTsKKwlQYXJlbnQ6OmNvbnRlbnRzTW91c2VQcmVzc0V2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGUpCit7CisJUVBvaW50IHAoY29udGVudHNUb1ZpZXdwb3J0KGUtPnBvcygpKSk7CisJQ29uZmlnSXRlbSogaXRlbSA9IChDb25maWdJdGVtKilpdGVtQXQocCk7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisJY29uc3QgUVBpeG1hcCogcG07CisJaW50IGlkeCwgeDsKKworCWlmICghaXRlbSkKKwkJZ290byBza2lwOworCisJbWVudSA9IGl0ZW0tPm1lbnU7CisJeCA9IGhlYWRlcigpLT5vZmZzZXQoKSArIHAueCgpOworCWlkeCA9IGNvbFJldk1hcFtoZWFkZXIoKS0+c2VjdGlvbkF0KHgpXTsKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgcHJvbXB0Q29sSWR4OgorCQlwbSA9IGl0ZW0tPnBpeG1hcChwcm9tcHRDb2xJZHgpOworCQlpZiAocG0pIHsKKwkJCWludCBvZmYgPSBoZWFkZXIoKS0+c2VjdGlvblBvcygwKSArIGl0ZW1NYXJnaW4oKSArCisJCQkJdHJlZVN0ZXBTaXplKCkgKiAoaXRlbS0+ZGVwdGgoKSArIChyb290SXNEZWNvcmF0ZWQoKSA/IDEgOiAwKSk7CisJCQlpZiAoeCA+PSBvZmYgJiYgeCA8IG9mZiArIHBtLT53aWR0aCgpKSB7CisJCQkJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCQkJCWVtaXQgcGFyZW50U2VsZWN0ZWQoKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmICghbWVudSkKKwkJCQkJYnJlYWs7CisJCQkJcHR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJCQkJaWYgKHB0eXBlID09IFBfTUVOVSAmJiByb290RW50cnkgIT0gbWVudSAmJgorCQkJCSAgICBtb2RlICE9IGZ1bGxNb2RlICYmIG1vZGUgIT0gbWVudU1vZGUpCisJCQkJCWVtaXQgbWVudVNlbGVjdGVkKG1lbnUpOworCQkJCWVsc2UKKwkJCQkJY2hhbmdlVmFsdWUoaXRlbSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBub0NvbElkeDoKKwkJc2V0VmFsdWUoaXRlbSwgbm8pOworCQlicmVhazsKKwljYXNlIG1vZENvbElkeDoKKwkJc2V0VmFsdWUoaXRlbSwgbW9kKTsKKwkJYnJlYWs7CisJY2FzZSB5ZXNDb2xJZHg6CisJCXNldFZhbHVlKGl0ZW0sIHllcyk7CisJCWJyZWFrOworCWNhc2UgZGF0YUNvbElkeDoKKwkJY2hhbmdlVmFsdWUoaXRlbSk7CisJCWJyZWFrOworCX0KKworc2tpcDoKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZVJlbGVhc2VFdmVudDogJWQsJWRcbiIsIHAueCgpLCBwLnkoKSk7CisJUGFyZW50Ojpjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGUpCit7CisJLy9RUG9pbnQgcChjb250ZW50c1RvVmlld3BvcnQoZS0+cG9zKCkpKTsKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZU1vdmVFdmVudDogJWQsJWRcbiIsIHAueCgpLCBwLnkoKSk7CisJUGFyZW50Ojpjb250ZW50c01vdXNlTW92ZUV2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCVFQb2ludCBwKGNvbnRlbnRzVG9WaWV3cG9ydChlLT5wb3MoKSkpOworCUNvbmZpZ0l0ZW0qIGl0ZW0gPSAoQ29uZmlnSXRlbSopaXRlbUF0KHApOworCXN0cnVjdCBtZW51ICptZW51OworCWVudW0gcHJvcF90eXBlIHB0eXBlOworCisJaWYgKCFpdGVtKQorCQlnb3RvIHNraXA7CisJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCWVtaXQgcGFyZW50U2VsZWN0ZWQoKTsKKwkJZ290byBza2lwOworCX0KKwltZW51ID0gaXRlbS0+bWVudTsKKwlpZiAoIW1lbnUpCisJCWdvdG8gc2tpcDsKKwlwdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAocHR5cGUgPT0gUF9NRU5VICYmIChtb2RlID09IHNpbmdsZU1vZGUgfHwgbW9kZSA9PSBzeW1ib2xNb2RlKSkKKwkJZW1pdCBtZW51U2VsZWN0ZWQobWVudSk7CisJZWxzZSBpZiAobWVudS0+c3ltKQorCQljaGFuZ2VWYWx1ZShpdGVtKTsKKworc2tpcDoKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQ6ICVkLCVkXG4iLCBwLngoKSwgcC55KCkpOworCVBhcmVudDo6Y29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQoZSk7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6Zm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50ICplKQoreworCVBhcmVudDo6Zm9jdXNJbkV2ZW50KGUpOworCisJUUxpc3RWaWV3SXRlbSogaXRlbSA9IGN1cnJlbnRJdGVtKCk7CisJaWYgKCFpdGVtKQorCQlyZXR1cm47CisKKwlzZXRTZWxlY3RlZChpdGVtLCBUUlVFKTsKKwllbWl0IGdvdEZvY3VzKCk7Cit9CisKK0NvbmZpZ1ZpZXcqIENvbmZpZ1ZpZXc6OnZpZXdMaXN0OworCitDb25maWdWaWV3OjpDb25maWdWaWV3KFFXaWRnZXQqIHBhcmVudCwgQ29uZmlnTWFpbldpbmRvdyogY3ZpZXcsCisJCSAgICAgICBDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3MpCisJOiBQYXJlbnQocGFyZW50KQoreworCWxpc3QgPSBuZXcgQ29uZmlnTGlzdCh0aGlzLCBjdmlldywgY29uZmlnU2V0dGluZ3MpOworCWxpbmVFZGl0ID0gbmV3IENvbmZpZ0xpbmVFZGl0KHRoaXMpOworCWxpbmVFZGl0LT5oaWRlKCk7CisKKwl0aGlzLT5uZXh0VmlldyA9IHZpZXdMaXN0OworCXZpZXdMaXN0ID0gdGhpczsKK30KKworQ29uZmlnVmlldzo6fkNvbmZpZ1ZpZXcodm9pZCkKK3sKKwlDb25maWdWaWV3KiogdnA7CisKKwlmb3IgKHZwID0gJnZpZXdMaXN0OyAqdnA7IHZwID0gJigqdnApLT5uZXh0VmlldykgeworCQlpZiAoKnZwID09IHRoaXMpIHsKKwkJCSp2cCA9IG5leHRWaWV3OworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgQ29uZmlnVmlldzo6dXBkYXRlTGlzdChDb25maWdJdGVtKiBpdGVtKQoreworCUNvbmZpZ1ZpZXcqIHY7CisKKwlmb3IgKHYgPSB2aWV3TGlzdDsgdjsgdiA9IHYtPm5leHRWaWV3KQorCQl2LT5saXN0LT51cGRhdGVMaXN0KGl0ZW0pOworfQorCit2b2lkIENvbmZpZ1ZpZXc6OnVwZGF0ZUxpc3RBbGwodm9pZCkKK3sKKwlDb25maWdWaWV3KiB2OworCisJZm9yICh2ID0gdmlld0xpc3Q7IHY7IHYgPSB2LT5uZXh0VmlldykKKwkJdi0+bGlzdC0+dXBkYXRlTGlzdEFsbCgpOworfQorCisvKgorICogQ29uc3RydWN0IHRoZSBjb21wbGV0ZSBjb25maWcgd2lkZ2V0CisgKi8KK0NvbmZpZ01haW5XaW5kb3c6OkNvbmZpZ01haW5XaW5kb3codm9pZCkKK3sKKwlRTWVudUJhciogbWVudTsKKwlib29sIG9rOworCWludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworCisJUVdpZGdldCAqZCA9IGNvbmZpZ0FwcC0+ZGVza3RvcCgpOworCisJQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzID0gbmV3IENvbmZpZ1NldHRpbmdzKCk7CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwl3aWR0aCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB3aWR0aCIsIGQtPndpZHRoKCkgLSA2NCk7CisJaGVpZ2h0ID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IGhlaWdodCIsIGQtPmhlaWdodCgpIC0gNjQpOworCXJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwl4ID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHgiLCAwLCAmb2spOworCWlmIChvaykKKwkJeSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB5IiwgMCwgJm9rKTsKKwlpZiAob2spCisJCW1vdmUoeCwgeSk7CisJc2hvd0RlYnVnID0gY29uZmlnU2V0dGluZ3MtPnJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEZWJ1ZyIsIGZhbHNlKTsKKworCS8vIHJlYWQgbGlzdCBzZXR0aW5ncyBpbnRvIGNvbmZpZ1NldHRpbmdzLCB3aWxsIGJlIHVzZWQgbGF0ZXIgZm9yIENvbmZpZ0xpc3Qgc2V0dXAKKwljb25maWdTZXR0aW5ncy0+cmVhZExpc3RTZXR0aW5ncygpOworI2Vsc2UKKwl3aWR0aCA9IGQtPndpZHRoKCkgLSA2NDsKKwloZWlnaHQgPSBkLT5oZWlnaHQoKSAtIDY0OworCXJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwlzaG93RGVidWcgPSBmYWxzZTsKKyNlbmRpZgorCisJc3BsaXQxID0gbmV3IFFTcGxpdHRlcih0aGlzKTsKKwlzcGxpdDEtPnNldE9yaWVudGF0aW9uKFFTcGxpdHRlcjo6SG9yaXpvbnRhbCk7CisJc2V0Q2VudHJhbFdpZGdldChzcGxpdDEpOworCisJbWVudVZpZXcgPSBuZXcgQ29uZmlnVmlldyhzcGxpdDEsIHRoaXMsIGNvbmZpZ1NldHRpbmdzKTsKKwltZW51TGlzdCA9IG1lbnVWaWV3LT5saXN0OworCisJc3BsaXQyID0gbmV3IFFTcGxpdHRlcihzcGxpdDEpOworCXNwbGl0Mi0+c2V0T3JpZW50YXRpb24oUVNwbGl0dGVyOjpWZXJ0aWNhbCk7CisKKwkvLyBjcmVhdGUgY29uZmlnIHRyZWUKKwljb25maWdWaWV3ID0gbmV3IENvbmZpZ1ZpZXcoc3BsaXQyLCB0aGlzLCBjb25maWdTZXR0aW5ncyk7CisJY29uZmlnTGlzdCA9IGNvbmZpZ1ZpZXctPmxpc3Q7CisKKwloZWxwVGV4dCA9IG5ldyBRVGV4dFZpZXcoc3BsaXQyKTsKKwloZWxwVGV4dC0+c2V0VGV4dEZvcm1hdChRdDo6UmljaFRleHQpOworCisJc2V0VGFiT3JkZXIoY29uZmlnTGlzdCwgaGVscFRleHQpOworCWNvbmZpZ0xpc3QtPnNldEZvY3VzKCk7CisKKwltZW51ID0gbWVudUJhcigpOworCXRvb2xCYXIgPSBuZXcgUVRvb2xCYXIoIlRvb2xzIiwgdGhpcyk7CisKKwliYWNrQWN0aW9uID0gbmV3IFFBY3Rpb24oIkJhY2siLCBRUGl4bWFwKHhwbV9iYWNrKSwgIkJhY2siLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3QoYmFja0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChnb0JhY2soKSkpOworCSAgYmFja0FjdGlvbi0+c2V0RW5hYmxlZChGQUxTRSk7CisJUUFjdGlvbiAqcXVpdEFjdGlvbiA9IG5ldyBRQWN0aW9uKCJRdWl0IiwgIiZRdWl0IiwgQ1RSTCtLZXlfUSwgdGhpcyk7CisJICBjb25uZWN0KHF1aXRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QoY2xvc2UoKSkpOworCVFBY3Rpb24gKmxvYWRBY3Rpb24gPSBuZXcgUUFjdGlvbigiTG9hZCIsIFFQaXhtYXAoeHBtX2xvYWQpLCAiJkxvYWQiLCBDVFJMK0tleV9MLCB0aGlzKTsKKwkgIGNvbm5lY3QobG9hZEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChsb2FkQ29uZmlnKCkpKTsKKwlRQWN0aW9uICpzYXZlQWN0aW9uID0gbmV3IFFBY3Rpb24oIlNhdmUiLCBRUGl4bWFwKHhwbV9zYXZlKSwgIiZTYXZlIiwgQ1RSTCtLZXlfUywgdGhpcyk7CisJICBjb25uZWN0KHNhdmVBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2F2ZUNvbmZpZygpKSk7CisJUUFjdGlvbiAqc2F2ZUFzQWN0aW9uID0gbmV3IFFBY3Rpb24oIlNhdmUgQXMuLi4iLCAiU2F2ZSAmQXMuLi4iLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2F2ZUFzQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNhdmVDb25maWdBcygpKSk7CisJUUFjdGlvbiAqc2luZ2xlVmlld0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaW5nbGUgVmlldyIsIFFQaXhtYXAoeHBtX3NpbmdsZV92aWV3KSwgIlNwbGl0IFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2luZ2xlVmlld0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93U2luZ2xlVmlldygpKSk7CisJUUFjdGlvbiAqc3BsaXRWaWV3QWN0aW9uID0gbmV3IFFBY3Rpb24oIlNwbGl0IFZpZXciLCBRUGl4bWFwKHhwbV9zcGxpdF92aWV3KSwgIlNwbGl0IFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc3BsaXRWaWV3QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dTcGxpdFZpZXcoKSkpOworCVFBY3Rpb24gKmZ1bGxWaWV3QWN0aW9uID0gbmV3IFFBY3Rpb24oIkZ1bGwgVmlldyIsIFFQaXhtYXAoeHBtX3RyZWVfdmlldyksICJGdWxsIFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3QoZnVsbFZpZXdBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd0Z1bGxWaWV3KCkpKTsKKworCVFBY3Rpb24gKnNob3dOYW1lQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgTmFtZSIsIDAsIHRoaXMpOworCSAgc2hvd05hbWVBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dOYW1lQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93TmFtZSk7CisJICBjb25uZWN0KHNob3dOYW1lQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd05hbWUoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93UmFuZ2VBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBSYW5nZSIsIDAsIHRoaXMpOworCSAgc2hvd1JhbmdlQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93UmFuZ2VBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dSYW5nZSk7CisJICBjb25uZWN0KHNob3dSYW5nZUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dSYW5nZShib29sKSkpOworCVFBY3Rpb24gKnNob3dEYXRhQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgRGF0YSIsIDAsIHRoaXMpOworCSAgc2hvd0RhdGFBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dEYXRhQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93RGF0YSk7CisJICBjb25uZWN0KHNob3dEYXRhQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0RhdGEoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93QWxsQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgQWxsIE9wdGlvbnMiLCAwLCB0aGlzKTsKKwkgIHNob3dBbGxBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dBbGxBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dBbGwpOworCSAgY29ubmVjdChzaG93QWxsQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0FsbChib29sKSkpOworCVFBY3Rpb24gKnNob3dEZWJ1Z0FjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IERlYnVnIEluZm8iLCAwLCB0aGlzKTsKKwkgIHNob3dEZWJ1Z0FjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOworCSAgc2hvd0RlYnVnQWN0aW9uLT5zZXRPbihzaG93RGVidWcpOworCSAgY29ubmVjdChzaG93RGVidWdBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRTaG93RGVidWcoYm9vbCkpKTsKKworCVFBY3Rpb24gKnNob3dJbnRyb0FjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJJbnRyb2R1Y3Rpb24iLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2hvd0ludHJvQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dJbnRybygpKSk7CisJUUFjdGlvbiAqc2hvd0Fib3V0QWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIkFib3V0IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNob3dBYm91dEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93QWJvdXQoKSkpOworCisJLy8gaW5pdCB0b29sIGJhcgorCWJhY2tBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXRvb2xCYXItPmFkZFNlcGFyYXRvcigpOworCWxvYWRBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXNhdmVBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXRvb2xCYXItPmFkZFNlcGFyYXRvcigpOworCXNpbmdsZVZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXNwbGl0Vmlld0FjdGlvbi0+YWRkVG8odG9vbEJhcik7CisJZnVsbFZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCisJLy8gY3JlYXRlIGNvbmZpZyBtZW51CisJUVBvcHVwTWVudSogY29uZmlnID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7CisJbWVudS0+aW5zZXJ0SXRlbSgiJkZpbGUiLCBjb25maWcpOworCWxvYWRBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJc2F2ZUFjdGlvbi0+YWRkVG8oY29uZmlnKTsKKwlzYXZlQXNBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJY29uZmlnLT5pbnNlcnRTZXBhcmF0b3IoKTsKKwlxdWl0QWN0aW9uLT5hZGRUbyhjb25maWcpOworCisJLy8gY3JlYXRlIG9wdGlvbnMgbWVudQorCVFQb3B1cE1lbnUqIG9wdGlvbk1lbnUgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwltZW51LT5pbnNlcnRJdGVtKCImT3B0aW9uIiwgb3B0aW9uTWVudSk7CisJc2hvd05hbWVBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dSYW5nZUFjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7CisJc2hvd0RhdGFBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCW9wdGlvbk1lbnUtPmluc2VydFNlcGFyYXRvcigpOworCXNob3dBbGxBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dEZWJ1Z0FjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7CisKKwkvLyBjcmVhdGUgaGVscCBtZW51CisJUVBvcHVwTWVudSogaGVscE1lbnUgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwltZW51LT5pbnNlcnRTZXBhcmF0b3IoKTsKKwltZW51LT5pbnNlcnRJdGVtKCImSGVscCIsIGhlbHBNZW51KTsKKwlzaG93SW50cm9BY3Rpb24tPmFkZFRvKGhlbHBNZW51KTsKKwlzaG93QWJvdXRBY3Rpb24tPmFkZFRvKGhlbHBNZW51KTsKKworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKG1lbnVTZWxlY3RlZChzdHJ1Y3QgbWVudSAqKSksCisJCVNMT1QoY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKSkpOworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKHBhcmVudFNlbGVjdGVkKCkpLAorCQlTTE9UKGdvQmFjaygpKSk7CisJY29ubmVjdChtZW51TGlzdCwgU0lHTkFMKG1lbnVTZWxlY3RlZChzdHJ1Y3QgbWVudSAqKSksCisJCVNMT1QoY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKSkpOworCisJY29ubmVjdChjb25maWdMaXN0LCBTSUdOQUwoZ290Rm9jdXModm9pZCkpLAorCQlTTE9UKGxpc3RGb2N1c0NoYW5nZWQodm9pZCkpKTsKKwljb25uZWN0KG1lbnVMaXN0LCBTSUdOQUwoZ290Rm9jdXModm9pZCkpLAorCQlTTE9UKGxpc3RGb2N1c0NoYW5nZWQodm9pZCkpKTsKKworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJUVN0cmluZyBsaXN0TW9kZSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkRW50cnkoIi9rY29uZmlnL3Fjb25mL2xpc3RNb2RlIiwgInN5bWJvbCIpOworCWlmIChsaXN0TW9kZSA9PSAic2luZ2xlIikKKwkJc2hvd1NpbmdsZVZpZXcoKTsKKwllbHNlIGlmIChsaXN0TW9kZSA9PSAiZnVsbCIpCisJCXNob3dGdWxsVmlldygpOworCWVsc2UgLyppZiAobGlzdE1vZGUgPT0gInNwbGl0IikqLworCQlzaG93U3BsaXRWaWV3KCk7CisKKwkvLyBVSSBzZXR1cCBkb25lLCByZXN0b3JlIHNwbGl0dGVyIHBvc2l0aW9ucworCVFWYWx1ZUxpc3Q8aW50PiBzaXplcyA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MSIsICZvayk7CisJaWYgKG9rKQorCQlzcGxpdDEtPnNldFNpemVzKHNpemVzKTsKKworCXNpemVzID0gY29uZmlnU2V0dGluZ3MtPnJlYWRTaXplcygiL2tjb25maWcvcWNvbmYvc3BsaXQyIiwgJm9rKTsKKwlpZiAob2spCisJCXNwbGl0Mi0+c2V0U2l6ZXMoc2l6ZXMpOworI2Vsc2UKKwlzaG93U3BsaXRWaWV3KCk7CisjZW5kaWYKKwlkZWxldGUgY29uZmlnU2V0dGluZ3M7Cit9CisKK3N0YXRpYyBRU3RyaW5nIHByaW50X2ZpbHRlcihjb25zdCBRU3RyaW5nICZzdHIpCit7CisJUVJlZ0V4cCByZSgiWzw+JlwiXFxuXSIpOworCVFTdHJpbmcgcmVzID0gc3RyOworCWZvciAoaW50IGkgPSAwOyAoaSA9IHJlcy5maW5kKHJlLCBpKSkgPj0gMDspIHsKKwkJc3dpdGNoIChyZXNbaV0ubGF0aW4xKCkpIHsKKwkJY2FzZSAnPCc6CisJCQlyZXMucmVwbGFjZShpLCAxLCAiJmx0OyIpOworCQkJaSArPSA0OworCQkJYnJlYWs7CisJCWNhc2UgJz4nOgorCQkJcmVzLnJlcGxhY2UoaSwgMSwgIiZndDsiKTsKKwkJCWkgKz0gNDsKKwkJCWJyZWFrOworCQljYXNlICcmJzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICImYW1wOyIpOworCQkJaSArPSA1OworCQkJYnJlYWs7CisJCWNhc2UgJyInOgorCQkJcmVzLnJlcGxhY2UoaSwgMSwgIiZxdW90OyIpOworCQkJaSArPSA2OworCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICI8YnI+Iik7CisJCQlpICs9IDQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBleHByX3ByaW50X2hlbHAodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQoreworCXJlaW50ZXJwcmV0X2Nhc3Q8UVN0cmluZyo+KGRhdGEpLT5hcHBlbmQocHJpbnRfZmlsdGVyKHN0cikpOworfQorCisvKgorICogZGlzcGxheSBhIG5ldyBoZWxwIGVudHJ5IGFzIHNvb24gYXMgYSBuZXcgbWVudSBlbnRyeSBpcyBzZWxlY3RlZAorICovCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldEhlbHAoUUxpc3RWaWV3SXRlbSogaXRlbSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sKiBzeW07CisJc3RydWN0IG1lbnUqIG1lbnUgPSAwOworCisJY29uZmlnTGlzdC0+cGFyZW50KCktPmxpbmVFZGl0LT5oaWRlKCk7CisJaWYgKGl0ZW0pCisJCW1lbnUgPSAoKENvbmZpZ0l0ZW0qKWl0ZW0pLT5tZW51OworCWlmICghbWVudSkgeworCQloZWxwVGV4dC0+c2V0VGV4dChRU3RyaW5nOjpudWxsKTsKKwkJcmV0dXJuOworCX0KKworCVFTdHJpbmcgaGVhZCwgZGVidWcsIGhlbHA7CisJbWVudSA9ICgoQ29uZmlnSXRlbSopaXRlbSktPm1lbnU7CisJc3ltID0gbWVudS0+c3ltOworCWlmIChzeW0pIHsKKwkJaWYgKG1lbnUtPnByb21wdCkgeworCQkJaGVhZCArPSAiPGJpZz48Yj4iOworCQkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhtZW51LT5wcm9tcHQtPnRleHQpKTsKKwkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOworCQkJaWYgKHN5bS0+bmFtZSkgeworCQkJCWhlYWQgKz0gIiAoIjsKKwkJCQloZWFkICs9IHByaW50X2ZpbHRlcihfKHN5bS0+bmFtZSkpOworCQkJCWhlYWQgKz0gIikiOworCQkJfQorCQl9IGVsc2UgaWYgKHN5bS0+bmFtZSkgeworCQkJaGVhZCArPSAiPGJpZz48Yj4iOworCQkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhzeW0tPm5hbWUpKTsKKwkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOworCQl9CisJCWhlYWQgKz0gIjxicj48YnI+IjsKKworCQlpZiAoc2hvd0RlYnVnKSB7CisJCQlkZWJ1ZyArPSAidHlwZTogIjsKKwkJCWRlYnVnICs9IHByaW50X2ZpbHRlcihzeW1fdHlwZV9uYW1lKHN5bS0+dHlwZSkpOworCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCQlkZWJ1ZyArPSAiIChjaG9pY2UpIjsKKwkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCWlmIChzeW0tPnJldl9kZXAuZXhwcikgeworCQkJCWRlYnVnICs9ICJyZXZlcnNlIGRlcDogIjsKKwkJCQlleHByX3ByaW50KHN5bS0+cmV2X2RlcC5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQl9CisJCQlmb3IgKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJCQljYXNlIFBfUFJPTVBUOgorCQkJCWNhc2UgUF9NRU5VOgorCQkJCQlkZWJ1ZyArPSAicHJvbXB0OiAiOworCQkJCQlkZWJ1ZyArPSBwcmludF9maWx0ZXIoXyhwcm9wLT50ZXh0KSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQX0RFRkFVTFQ6CisJCQkJCWRlYnVnICs9ICJkZWZhdWx0OiAiOworCQkJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUF9DSE9JQ0U6CisJCQkJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCQkJCWRlYnVnICs9ICJjaG9pY2U6ICI7CisJCQkJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUF9TRUxFQ1Q6CisJCQkJCWRlYnVnICs9ICJzZWxlY3Q6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQX1JBTkdFOgorCQkJCQlkZWJ1ZyArPSAicmFuZ2U6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZGVidWcgKz0gInVua25vd24gcHJvcGVydHk6ICI7CisJCQkJCWRlYnVnICs9IHByb3BfZ2V0X3R5cGVfbmFtZShwcm9wLT50eXBlKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCX0KKwkJCQlpZiAocHJvcC0+dmlzaWJsZS5leHByKSB7CisJCQkJCWRlYnVnICs9ICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkZXA6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCX0KKwkJCX0KKwkJCWRlYnVnICs9ICI8YnI+IjsKKwkJfQorCisJCWhlbHAgPSBwcmludF9maWx0ZXIoXyhzeW0tPmhlbHApKTsKKwl9IGVsc2UgaWYgKG1lbnUtPnByb21wdCkgeworCQloZWFkICs9ICI8YmlnPjxiPiI7CisJCWhlYWQgKz0gcHJpbnRfZmlsdGVyKF8obWVudS0+cHJvbXB0LT50ZXh0KSk7CisJCWhlYWQgKz0gIjwvYj48L2JpZz48YnI+PGJyPiI7CisJCWlmIChzaG93RGVidWcpIHsKKwkJCWlmIChtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwcikgeworCQkJCWRlYnVnICs9ICImbmJzcDsmbmJzcDtkZXA6ICI7CisJCQkJZXhwcl9wcmludChtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJZGVidWcgKz0gIjxicj48YnI+IjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoc2hvd0RlYnVnKQorCQlkZWJ1ZyArPSBRU3RyaW5nKCkuc3ByaW50ZigiZGVmaW5lZCBhdCAlczolZDxicj48YnI+IiwgbWVudS0+ZmlsZS0+bmFtZSwgbWVudS0+bGluZW5vKTsKKwloZWxwVGV4dC0+c2V0VGV4dChoZWFkICsgZGVidWcgKyBoZWxwKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93Ojpsb2FkQ29uZmlnKHZvaWQpCit7CisJUVN0cmluZyBzID0gUUZpbGVEaWFsb2c6OmdldE9wZW5GaWxlTmFtZSgiLmNvbmZpZyIsIE5VTEwsIHRoaXMpOworCWlmIChzLmlzTnVsbCgpKQorCQlyZXR1cm47CisJaWYgKGNvbmZfcmVhZChRRmlsZTo6ZW5jb2RlTmFtZShzKSkpCisJCVFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCAicWNvbmYiLCAiVW5hYmxlIHRvIGxvYWQgY29uZmlndXJhdGlvbiEiKTsKKwlDb25maWdWaWV3Ojp1cGRhdGVMaXN0QWxsKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2F2ZUNvbmZpZyh2b2lkKQoreworCWlmIChjb25mX3dyaXRlKE5VTEwpKQorCQlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24hIik7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2F2ZUNvbmZpZ0FzKHZvaWQpCit7CisJUVN0cmluZyBzID0gUUZpbGVEaWFsb2c6OmdldFNhdmVGaWxlTmFtZSgiLmNvbmZpZyIsIE5VTEwsIHRoaXMpOworCWlmIChzLmlzTnVsbCgpKQorCQlyZXR1cm47CisJaWYgKGNvbmZfd3JpdGUoUUZpbGU6OmVuY29kZU5hbWUocykpKQorCQlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24hIik7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6Y2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwljb25maWdMaXN0LT5zZXRSb290TWVudShtZW51KTsKKwliYWNrQWN0aW9uLT5zZXRFbmFibGVkKFRSVUUpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6Omxpc3RGb2N1c0NoYW5nZWQodm9pZCkKK3sKKwlpZiAobWVudUxpc3QtPmhhc0ZvY3VzKCkpIHsKKwkJaWYgKG1lbnVMaXN0LT5tb2RlID09IG1lbnVNb2RlKQorCQkJY29uZmlnTGlzdC0+Y2xlYXJTZWxlY3Rpb24oKTsKKwkJc2V0SGVscChtZW51TGlzdC0+c2VsZWN0ZWRJdGVtKCkpOworCX0gZWxzZSBpZiAoY29uZmlnTGlzdC0+aGFzRm9jdXMoKSkgeworCQlzZXRIZWxwKGNvbmZpZ0xpc3QtPnNlbGVjdGVkSXRlbSgpKTsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6Z29CYWNrKHZvaWQpCit7CisJQ29uZmlnSXRlbSogaXRlbTsKKworCWNvbmZpZ0xpc3QtPnNldFBhcmVudE1lbnUoKTsKKwlpZiAoY29uZmlnTGlzdC0+cm9vdEVudHJ5ID09ICZyb290bWVudSkKKwkJYmFja0FjdGlvbi0+c2V0RW5hYmxlZChGQUxTRSk7CisJaXRlbSA9IChDb25maWdJdGVtKiltZW51TGlzdC0+c2VsZWN0ZWRJdGVtKCk7CisJd2hpbGUgKGl0ZW0pIHsKKwkJaWYgKGl0ZW0tPm1lbnUgPT0gY29uZmlnTGlzdC0+cm9vdEVudHJ5KSB7CisJCQltZW51TGlzdC0+c2V0U2VsZWN0ZWQoaXRlbSwgVFJVRSk7CisJCQlicmVhazsKKwkJfQorCQlpdGVtID0gKENvbmZpZ0l0ZW0qKWl0ZW0tPnBhcmVudCgpOworCX0KK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93U2luZ2xlVmlldyh2b2lkKQoreworCW1lbnVWaWV3LT5oaWRlKCk7CisJbWVudUxpc3QtPnNldFJvb3RNZW51KDApOworCWNvbmZpZ0xpc3QtPm1vZGUgPSBzaW5nbGVNb2RlOworCWlmIChjb25maWdMaXN0LT5yb290RW50cnkgPT0gJnJvb3RtZW51KQorCQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJZWxzZQorCQljb25maWdMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCWNvbmZpZ0xpc3QtPnNldEFsbE9wZW4oVFJVRSk7CisJY29uZmlnTGlzdC0+c2V0Rm9jdXMoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93U3BsaXRWaWV3KHZvaWQpCit7CisJY29uZmlnTGlzdC0+bW9kZSA9IHN5bWJvbE1vZGU7CisJaWYgKGNvbmZpZ0xpc3QtPnJvb3RFbnRyeSA9PSAmcm9vdG1lbnUpCisJCWNvbmZpZ0xpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKKwllbHNlCisJCWNvbmZpZ0xpc3QtPnNldFJvb3RNZW51KCZyb290bWVudSk7CisJY29uZmlnTGlzdC0+c2V0QWxsT3BlbihUUlVFKTsKKwljb25maWdBcHAtPnByb2Nlc3NFdmVudHMoKTsKKwltZW51TGlzdC0+bW9kZSA9IG1lbnVNb2RlOworCW1lbnVMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCW1lbnVMaXN0LT5zZXRBbGxPcGVuKFRSVUUpOworCW1lbnVWaWV3LT5zaG93KCk7CisJbWVudUxpc3QtPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2hvd0Z1bGxWaWV3KHZvaWQpCit7CisJbWVudVZpZXctPmhpZGUoKTsKKwltZW51TGlzdC0+c2V0Um9vdE1lbnUoMCk7CisJY29uZmlnTGlzdC0+bW9kZSA9IGZ1bGxNb2RlOworCWlmIChjb25maWdMaXN0LT5yb290RW50cnkgPT0gJnJvb3RtZW51KQorCQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJZWxzZQorCQljb25maWdMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCWNvbmZpZ0xpc3QtPnNldEFsbE9wZW4oRkFMU0UpOworCWNvbmZpZ0xpc3QtPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0FsbChib29sIGIpCit7CisJaWYgKGNvbmZpZ0xpc3QtPnNob3dBbGwgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dBbGwgPSBiOworCWNvbmZpZ0xpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKKwltZW51TGlzdC0+c2hvd0FsbCA9IGI7CisJbWVudUxpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzZXRTaG93RGVidWcoYm9vbCBiKQoreworCWlmIChzaG93RGVidWcgPT0gYikKKwkJcmV0dXJuOworCXNob3dEZWJ1ZyA9IGI7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd05hbWUoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93TmFtZSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd05hbWUgPSBiOworCWNvbmZpZ0xpc3QtPnJlaW5pdCgpOworCW1lbnVMaXN0LT5zaG93TmFtZSA9IGI7CisJbWVudUxpc3QtPnJlaW5pdCgpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dSYW5nZShib29sIGIpCit7CisJaWYgKGNvbmZpZ0xpc3QtPnNob3dSYW5nZSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd1JhbmdlID0gYjsKKwljb25maWdMaXN0LT5yZWluaXQoKTsKKwltZW51TGlzdC0+c2hvd1JhbmdlID0gYjsKKwltZW51TGlzdC0+cmVpbml0KCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0RhdGEoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93RGF0YSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd0RhdGEgPSBiOworCWNvbmZpZ0xpc3QtPnJlaW5pdCgpOworCW1lbnVMaXN0LT5zaG93RGF0YSA9IGI7CisJbWVudUxpc3QtPnJlaW5pdCgpOworfQorCisvKgorICogYXNrIGZvciBzYXZpbmcgY29uZmlndXJhdGlvbiBiZWZvcmUgcXVpdHRpbmcKKyAqIFRPRE8gYXNrIG9ubHkgd2hlbiBzb21ldGhpbmcgY2hhbmdlZAorICovCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OmNsb3NlRXZlbnQoUUNsb3NlRXZlbnQqIGUpCit7CisJaWYgKCFzeW1fY2hhbmdlX2NvdW50KSB7CisJCWUtPmFjY2VwdCgpOworCQlyZXR1cm47CisJfQorCVFNZXNzYWdlQm94IG1iKCJxY29uZiIsICJTYXZlIGNvbmZpZ3VyYXRpb24/IiwgUU1lc3NhZ2VCb3g6Oldhcm5pbmcsCisJCQlRTWVzc2FnZUJveDo6WWVzIHwgUU1lc3NhZ2VCb3g6OkRlZmF1bHQsIFFNZXNzYWdlQm94OjpObywgUU1lc3NhZ2VCb3g6OkNhbmNlbCB8IFFNZXNzYWdlQm94OjpFc2NhcGUpOworCW1iLnNldEJ1dHRvblRleHQoUU1lc3NhZ2VCb3g6OlllcywgIiZTYXZlIENoYW5nZXMiKTsKKwltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpObywgIiZEaXNjYXJkIENoYW5nZXMiKTsKKwltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpDYW5jZWwsICJDYW5jZWwgRXhpdCIpOworCXN3aXRjaCAobWIuZXhlYygpKSB7CisJY2FzZSBRTWVzc2FnZUJveDo6WWVzOgorCQljb25mX3dyaXRlKE5VTEwpOworCWNhc2UgUU1lc3NhZ2VCb3g6Ok5vOgorCQllLT5hY2NlcHQoKTsKKwkJYnJlYWs7CisJY2FzZSBRTWVzc2FnZUJveDo6Q2FuY2VsOgorCQllLT5pZ25vcmUoKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNob3dJbnRybyh2b2lkKQoreworCXN0YXRpYyBjaGFyIHN0cltdID0gIldlbGNvbWUgdG8gdGhlIHFjb25mIGdyYXBoaWNhbCBjb25maWd1cmF0aW9uIHRvb2wuXG5cbiIKKwkJIkZvciBlYWNoIG9wdGlvbiwgYSBibGFuayBib3ggaW5kaWNhdGVzIHRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLCBhIGNoZWNrXG4iCisJCSJpbmRpY2F0ZXMgaXQgaXMgZW5hYmxlZCwgYW5kIGEgZG90IGluZGljYXRlcyB0aGF0IGl0IGlzIHRvIGJlIGNvbXBpbGVkXG4iCisJCSJhcyBhIG1vZHVsZS4gIENsaWNraW5nIG9uIHRoZSBib3ggd2lsbCBjeWNsZSB0aHJvdWdoIHRoZSB0aHJlZSBzdGF0ZXMuXG5cbiIKKwkJIklmIHlvdSBkbyBub3Qgc2VlIGFuIG9wdGlvbiAoZS5nLiwgYSBkZXZpY2UgZHJpdmVyKSB0aGF0IHlvdSBiZWxpZXZlXG4iCisJCSJzaG91bGQgYmUgcHJlc2VudCwgdHJ5IHR1cm5pbmcgb24gU2hvdyBBbGwgT3B0aW9ucyB1bmRlciB0aGUgT3B0aW9ucyBtZW51LlxuIgorCQkiQWx0aG91Z2ggdGhlcmUgaXMgbm8gY3Jvc3MgcmVmZXJlbmNlIHlldCB0byBoZWxwIHlvdSBmaWd1cmUgb3V0IHdoYXQgb3RoZXJcbiIKKwkJIm9wdGlvbnMgbXVzdCBiZSBlbmFibGVkIHRvIHN1cHBvcnQgdGhlIG9wdGlvbiB5b3UgYXJlIGludGVyZXN0ZWQgaW4sIHlvdSBjYW5cbiIKKwkJInN0aWxsIHZpZXcgdGhlIGhlbHAgb2YgYSBncmF5ZWQtb3V0IG9wdGlvbi5cblxuIgorCQkiVG9nZ2xpbmcgU2hvdyBEZWJ1ZyBJbmZvIHVuZGVyIHRoZSBPcHRpb25zIG1lbnUgd2lsbCBzaG93IHRoZSBkZXBlbmRlbmNpZXMsXG4iCisJCSJ3aGljaCB5b3UgY2FuIHRoZW4gbWF0Y2ggYnkgZXhhbWluaW5nIG90aGVyIG9wdGlvbnMuXG5cbiI7CisKKwlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgc3RyKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93QWJvdXQodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBzdHJbXSA9ICJxY29uZiBpcyBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+LlxuIjsKKworCVFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCAicWNvbmYiLCBzdHIpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNhdmVTZXR0aW5ncyh2b2lkKQoreworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJQ29uZmlnU2V0dGluZ3MgKmNvbmZpZ1NldHRpbmdzID0gbmV3IENvbmZpZ1NldHRpbmdzOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgeCIsIHBvcygpLngoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB5IiwgcG9zKCkueSgpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHdpZHRoIiwgc2l6ZSgpLndpZHRoKCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgaGVpZ2h0Iiwgc2l6ZSgpLmhlaWdodCgpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd05hbWUiLCBjb25maWdMaXN0LT5zaG93TmFtZSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dSYW5nZSIsIGNvbmZpZ0xpc3QtPnNob3dSYW5nZSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEYXRhIiwgY29uZmlnTGlzdC0+c2hvd0RhdGEpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93QWxsIiwgY29uZmlnTGlzdC0+c2hvd0FsbCk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEZWJ1ZyIsIHNob3dEZWJ1Zyk7CisKKwlRU3RyaW5nIGVudHJ5OworCXN3aXRjaChjb25maWdMaXN0LT5tb2RlKSB7CisJY2FzZSBzaW5nbGVNb2RlIDoKKwkJZW50cnkgPSAic2luZ2xlIjsKKwkJYnJlYWs7CisKKwljYXNlIHN5bWJvbE1vZGUgOgorCQllbnRyeSA9ICJzcGxpdCI7CisJCWJyZWFrOworCisJY2FzZSBmdWxsTW9kZSA6CisJCWVudHJ5ID0gImZ1bGwiOworCQlicmVhazsKKwl9CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL2xpc3RNb2RlIiwgZW50cnkpOworCisJY29uZmlnU2V0dGluZ3MtPndyaXRlU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MSIsIHNwbGl0MS0+c2l6ZXMoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MiIsIHNwbGl0Mi0+c2l6ZXMoKSk7CisKKwlkZWxldGUgY29uZmlnU2V0dGluZ3M7CisjZW5kaWYKK30KKwordm9pZCBmaXh1cF9yb290bWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RhdGljIGludCBtZW51X2NudCA9IDA7CisKKwltZW51LT5mbGFncyB8PSBNRU5VX1JPT1Q7CisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCWlmIChjaGlsZC0+cHJvbXB0ICYmIGNoaWxkLT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKSB7CisJCQltZW51X2NudCsrOworCQkJZml4dXBfcm9vdG1lbnUoY2hpbGQpOworCQkJbWVudV9jbnQtLTsKKwkJfSBlbHNlIGlmICghbWVudV9jbnQpCisJCQlmaXh1cF9yb290bWVudShjaGlsZCk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJvZ25hbWU7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRmKCIlcyA8Y29uZmlnPlxuIiwgcHJvZ25hbWUpOworCWV4aXQoMCk7Cit9CisKK2ludCBtYWluKGludCBhYywgY2hhcioqIGF2KQoreworCUNvbmZpZ01haW5XaW5kb3cqIHY7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7CisJdGV4dGRvbWFpbihQQUNLQUdFKTsKKworI2lmbmRlZiBMS0NfRElSRUNUX0xJTksKKwlrY29uZmlnX2xvYWQoKTsKKyNlbmRpZgorCisJcHJvZ25hbWUgPSBhdlswXTsKKwljb25maWdBcHAgPSBuZXcgUUFwcGxpY2F0aW9uKGFjLCBhdik7CisJaWYgKGFjID4gMSAmJiBhdlsxXVswXSA9PSAnLScpIHsKKwkJc3dpdGNoIChhdlsxXVsxXSkgeworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQl1c2FnZSgpOworCQl9CisJCW5hbWUgPSBhdlsyXTsKKwl9IGVsc2UKKwkJbmFtZSA9IGF2WzFdOworCWlmICghbmFtZSkKKwkJdXNhZ2UoKTsKKworCWNvbmZfcGFyc2UobmFtZSk7CisJZml4dXBfcm9vdG1lbnUoJnJvb3RtZW51KTsKKwljb25mX3JlYWQoTlVMTCk7CisJLy96Y29uZmR1bXAoc3Rkb3V0KTsKKworCXYgPSBuZXcgQ29uZmlnTWFpbldpbmRvdygpOworCisJLy96Y29uZmR1bXAoc3Rkb3V0KTsKKwl2LT5zaG93KCk7CisJY29uZmlnQXBwLT5jb25uZWN0KGNvbmZpZ0FwcCwgU0lHTkFMKGxhc3RXaW5kb3dDbG9zZWQoKSksIFNMT1QocXVpdCgpKSk7CisJY29uZmlnQXBwLT5jb25uZWN0KGNvbmZpZ0FwcCwgU0lHTkFMKGFib3V0VG9RdWl0KCkpLCB2LCBTTE9UKHNhdmVTZXR0aW5ncygpKSk7CisJY29uZmlnQXBwLT5leGVjKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyZjNlOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHFsaXN0dmlldy5oPgorI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisjaW5jbHVkZSA8cXNldHRpbmdzLmg+CisjZWxzZQorY2xhc3MgUVNldHRpbmdzIHsgfTsKKyNlbmRpZgorCitjbGFzcyBDb25maWdMaXN0OworY2xhc3MgQ29uZmlnSXRlbTsKK2NsYXNzIENvbmZpZ0xpbmVFZGl0OworY2xhc3MgQ29uZmlnTWFpbldpbmRvdzsKKworCitjbGFzcyBDb25maWdTZXR0aW5ncyA6IHB1YmxpYyBRU2V0dGluZ3MgeworcHVibGljOgorCUNvbmZpZ1NldHRpbmdzKCk7CisKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCXZvaWQgcmVhZExpc3RTZXR0aW5ncygpOworCVFWYWx1ZUxpc3Q8aW50PiByZWFkU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBib29sICpvayk7CisJYm9vbCB3cml0ZVNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgY29uc3QgUVZhbHVlTGlzdDxpbnQ+JiB2YWx1ZSk7CisjZW5kaWYKKworCWJvb2wgc2hvd0FsbDsKKwlib29sIHNob3dOYW1lOworCWJvb2wgc2hvd1JhbmdlOworCWJvb2wgc2hvd0RhdGE7Cit9OworCitjbGFzcyBDb25maWdWaWV3IDogcHVibGljIFFWQm94IHsKKwlRX09CSkVDVAorCXR5cGVkZWYgY2xhc3MgUVZCb3ggUGFyZW50OworcHVibGljOgorCUNvbmZpZ1ZpZXcoUVdpZGdldCogcGFyZW50LCBDb25maWdNYWluV2luZG93KiBjdmlldywgQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzKTsKKwl+Q29uZmlnVmlldyh2b2lkKTsKKwlzdGF0aWMgdm9pZCB1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pOworCXN0YXRpYyB2b2lkIHVwZGF0ZUxpc3RBbGwodm9pZCk7CisKK3B1YmxpYzoKKwlDb25maWdMaXN0KiBsaXN0OworCUNvbmZpZ0xpbmVFZGl0KiBsaW5lRWRpdDsKKworCXN0YXRpYyBDb25maWdWaWV3KiB2aWV3TGlzdDsKKwlDb25maWdWaWV3KiBuZXh0VmlldzsKK307CisKK2VudW0gY29sSWR4IHsKKwlwcm9tcHRDb2xJZHgsIG5hbWVDb2xJZHgsIG5vQ29sSWR4LCBtb2RDb2xJZHgsIHllc0NvbElkeCwgZGF0YUNvbElkeCwgY29sTnIKK307CitlbnVtIGxpc3RNb2RlIHsKKwlzaW5nbGVNb2RlLCBtZW51TW9kZSwgc3ltYm9sTW9kZSwgZnVsbE1vZGUKK307CisKK2NsYXNzIENvbmZpZ0xpc3QgOiBwdWJsaWMgUUxpc3RWaWV3IHsKKwlRX09CSkVDVAorCXR5cGVkZWYgY2xhc3MgUUxpc3RWaWV3IFBhcmVudDsKK3B1YmxpYzoKKwlDb25maWdMaXN0KENvbmZpZ1ZpZXcqIHAsIENvbmZpZ01haW5XaW5kb3cqIGN2aWV3LCBDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3MpOworCXZvaWQgcmVpbml0KHZvaWQpOworCUNvbmZpZ1ZpZXcqIHBhcmVudCh2b2lkKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdWaWV3KilQYXJlbnQ6OnBhcmVudCgpOworCX0KKworcHJvdGVjdGVkOgorCUNvbmZpZ01haW5XaW5kb3cqIGN2aWV3OworCisJdm9pZCBrZXlQcmVzc0V2ZW50KFFLZXlFdmVudCAqZSk7CisJdm9pZCBjb250ZW50c01vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCAqZSk7CisJdm9pZCBjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKKwl2b2lkIGNvbnRlbnRzTW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworCXZvaWQgY29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworCXZvaWQgZm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50ICplKTsKK3B1YmxpYyBzbG90czoKKwl2b2lkIHNldFJvb3RNZW51KHN0cnVjdCBtZW51ICptZW51KTsKKworCXZvaWQgdXBkYXRlTGlzdChDb25maWdJdGVtICppdGVtKTsKKwl2b2lkIHNldFZhbHVlKENvbmZpZ0l0ZW0qIGl0ZW0sIHRyaXN0YXRlIHZhbCk7CisJdm9pZCBjaGFuZ2VWYWx1ZShDb25maWdJdGVtKiBpdGVtKTsKKwl2b2lkIHVwZGF0ZVNlbGVjdGlvbih2b2lkKTsKK3NpZ25hbHM6CisJdm9pZCBtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKm1lbnUpOworCXZvaWQgcGFyZW50U2VsZWN0ZWQodm9pZCk7CisJdm9pZCBnb3RGb2N1cyh2b2lkKTsKKworcHVibGljOgorCXZvaWQgdXBkYXRlTGlzdEFsbCh2b2lkKQorCXsKKwkJdXBkYXRlQWxsID0gdHJ1ZTsKKwkJdXBkYXRlTGlzdChOVUxMKTsKKwkJdXBkYXRlQWxsID0gZmFsc2U7CisJfQorCUNvbmZpZ0xpc3QqIGxpc3RWaWV3KCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKwlDb25maWdJdGVtKiBmaXJzdENoaWxkKCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnSXRlbSAqKVBhcmVudDo6Zmlyc3RDaGlsZCgpOworCX0KKwlpbnQgbWFwSWR4KGNvbElkeCBpZHgpCisJeworCQlyZXR1cm4gY29sTWFwW2lkeF07CisJfQorCXZvaWQgYWRkQ29sdW1uKGNvbElkeCBpZHgsIGNvbnN0IFFTdHJpbmcmIGxhYmVsKQorCXsKKwkJY29sTWFwW2lkeF0gPSBQYXJlbnQ6OmFkZENvbHVtbihsYWJlbCk7CisJCWNvbFJldk1hcFtjb2xNYXBbaWR4XV0gPSBpZHg7CisJfQorCXZvaWQgcmVtb3ZlQ29sdW1uKGNvbElkeCBpZHgpCisJeworCQlpbnQgY29sID0gY29sTWFwW2lkeF07CisJCWlmIChjb2wgPj0gMCkgeworCQkJUGFyZW50OjpyZW1vdmVDb2x1bW4oY29sKTsKKwkJCWNvbFJldk1hcFtjb2xdID0gY29sTWFwW2lkeF0gPSAtMTsKKwkJfQorCX0KKwl2b2lkIHNldEFsbE9wZW4oYm9vbCBvcGVuKTsKKwl2b2lkIHNldFBhcmVudE1lbnUodm9pZCk7CisKKwl0ZW1wbGF0ZSA8Y2xhc3MgUD4KKwl2b2lkIHVwZGF0ZU1lbnVMaXN0KFAqLCBzdHJ1Y3QgbWVudSopOworCisJYm9vbCB1cGRhdGVBbGw7CisKKwlRUGl4bWFwIHN5bWJvbFllc1BpeCwgc3ltYm9sTW9kUGl4LCBzeW1ib2xOb1BpeDsKKwlRUGl4bWFwIGNob2ljZVllc1BpeCwgY2hvaWNlTm9QaXg7CisJUVBpeG1hcCBtZW51UGl4LCBtZW51SW52UGl4LCBtZW51QmFja1BpeCwgdm9pZFBpeDsKKworCWJvb2wgc2hvd0FsbCwgc2hvd05hbWUsIHNob3dSYW5nZSwgc2hvd0RhdGE7CisJZW51bSBsaXN0TW9kZSBtb2RlOworCXN0cnVjdCBtZW51ICpyb290RW50cnk7CisJUUNvbG9yR3JvdXAgZGlzYWJsZWRDb2xvckdyb3VwOworCVFDb2xvckdyb3VwIGluYWN0aXZlZENvbG9yR3JvdXA7CisKK3ByaXZhdGU6CisJaW50IGNvbE1hcFtjb2xOcl07CisJaW50IGNvbFJldk1hcFtjb2xOcl07Cit9OworCitjbGFzcyBDb25maWdJdGVtIDogcHVibGljIFFMaXN0Vmlld0l0ZW0geworCXR5cGVkZWYgY2xhc3MgUUxpc3RWaWV3SXRlbSBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnSXRlbShRTGlzdFZpZXcgKnBhcmVudCwgQ29uZmlnSXRlbSAqYWZ0ZXIsIHN0cnVjdCBtZW51ICptLCBib29sIHYpCisJOiBQYXJlbnQocGFyZW50LCBhZnRlciksIG1lbnUobSksIHZpc2libGUodiksIGdvUGFyZW50KGZhbHNlKQorCXsKKwkJaW5pdCgpOworCX0KKwlDb25maWdJdGVtKENvbmZpZ0l0ZW0gKnBhcmVudCwgQ29uZmlnSXRlbSAqYWZ0ZXIsIHN0cnVjdCBtZW51ICptLCBib29sIHYpCisJOiBQYXJlbnQocGFyZW50LCBhZnRlciksIG1lbnUobSksIHZpc2libGUodiksIGdvUGFyZW50KGZhbHNlKQorCXsKKwkJaW5pdCgpOworCX0KKwlDb25maWdJdGVtKFFMaXN0VmlldyAqcGFyZW50LCBDb25maWdJdGVtICphZnRlciwgYm9vbCB2KQorCTogUGFyZW50KHBhcmVudCwgYWZ0ZXIpLCBtZW51KDApLCB2aXNpYmxlKHYpLCBnb1BhcmVudCh0cnVlKQorCXsKKwkJaW5pdCgpOworCX0KKwl+Q29uZmlnSXRlbSh2b2lkKTsKKwl2b2lkIGluaXQodm9pZCk7CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwl2b2lkIG9rUmVuYW1lKGludCBjb2wpOworI2VuZGlmCisJdm9pZCB1cGRhdGVNZW51KHZvaWQpOworCXZvaWQgdGVzdFVwZGF0ZU1lbnUoYm9vbCB2KTsKKwlDb25maWdMaXN0KiBsaXN0VmlldygpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ0xpc3QqKVBhcmVudDo6bGlzdFZpZXcoKTsKKwl9CisJQ29uZmlnSXRlbSogZmlyc3RDaGlsZCgpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ0l0ZW0gKilQYXJlbnQ6OmZpcnN0Q2hpbGQoKTsKKwl9CisJQ29uZmlnSXRlbSogbmV4dFNpYmxpbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdJdGVtICopUGFyZW50OjpuZXh0U2libGluZygpOworCX0KKwl2b2lkIHNldFRleHQoY29sSWR4IGlkeCwgY29uc3QgUVN0cmluZyYgdGV4dCkKKwl7CisJCVBhcmVudDo6c2V0VGV4dChsaXN0VmlldygpLT5tYXBJZHgoaWR4KSwgdGV4dCk7CisJfQorCVFTdHJpbmcgdGV4dChjb2xJZHggaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuIFBhcmVudDo6dGV4dChsaXN0VmlldygpLT5tYXBJZHgoaWR4KSk7CisJfQorCXZvaWQgc2V0UGl4bWFwKGNvbElkeCBpZHgsIGNvbnN0IFFQaXhtYXAmIHBtKQorCXsKKwkJUGFyZW50OjpzZXRQaXhtYXAobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCksIHBtKTsKKwl9CisJY29uc3QgUVBpeG1hcCogcGl4bWFwKGNvbElkeCBpZHgpIGNvbnN0CisJeworCQlyZXR1cm4gUGFyZW50OjpwaXhtYXAobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCkpOworCX0KKwl2b2lkIHBhaW50Q2VsbChRUGFpbnRlciogcCwgY29uc3QgUUNvbG9yR3JvdXAmIGNnLCBpbnQgY29sdW1uLCBpbnQgd2lkdGgsIGludCBhbGlnbik7CisKKwlDb25maWdJdGVtKiBuZXh0SXRlbTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlib29sIHZpc2libGU7CisJYm9vbCBnb1BhcmVudDsKK307CisKK2NsYXNzIENvbmZpZ0xpbmVFZGl0IDogcHVibGljIFFMaW5lRWRpdCB7CisJUV9PQkpFQ1QKKwl0eXBlZGVmIGNsYXNzIFFMaW5lRWRpdCBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnTGluZUVkaXQoQ29uZmlnVmlldyogcGFyZW50KQorCTogUGFyZW50KHBhcmVudCkKKwl7IH0KKwlDb25maWdWaWV3KiBwYXJlbnQodm9pZCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnVmlldyopUGFyZW50OjpwYXJlbnQoKTsKKwl9CisJdm9pZCBzaG93KENvbmZpZ0l0ZW0gKmkpOworCXZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmUpOworCitwdWJsaWM6CisJQ29uZmlnSXRlbSAqaXRlbTsKK307CisKK2NsYXNzIENvbmZpZ01haW5XaW5kb3cgOiBwdWJsaWMgUU1haW5XaW5kb3cgeworCVFfT0JKRUNUCitwdWJsaWM6CisJQ29uZmlnTWFpbldpbmRvdyh2b2lkKTsKK3B1YmxpYyBzbG90czoKKwl2b2lkIHNldEhlbHAoUUxpc3RWaWV3SXRlbSogaXRlbSk7CisJdm9pZCBjaGFuZ2VNZW51KHN0cnVjdCBtZW51ICopOworCXZvaWQgbGlzdEZvY3VzQ2hhbmdlZCh2b2lkKTsKKwl2b2lkIGdvQmFjayh2b2lkKTsKKwl2b2lkIGxvYWRDb25maWcodm9pZCk7CisJdm9pZCBzYXZlQ29uZmlnKHZvaWQpOworCXZvaWQgc2F2ZUNvbmZpZ0FzKHZvaWQpOworCXZvaWQgc2hvd1NpbmdsZVZpZXcodm9pZCk7CisJdm9pZCBzaG93U3BsaXRWaWV3KHZvaWQpOworCXZvaWQgc2hvd0Z1bGxWaWV3KHZvaWQpOworCXZvaWQgc2V0U2hvd0FsbChib29sKTsKKwl2b2lkIHNldFNob3dEZWJ1Zyhib29sKTsKKwl2b2lkIHNldFNob3dSYW5nZShib29sKTsKKwl2b2lkIHNldFNob3dOYW1lKGJvb2wpOworCXZvaWQgc2V0U2hvd0RhdGEoYm9vbCk7CisJdm9pZCBzaG93SW50cm8odm9pZCk7CisJdm9pZCBzaG93QWJvdXQodm9pZCk7CisJdm9pZCBzYXZlU2V0dGluZ3Modm9pZCk7CisKK3Byb3RlY3RlZDoKKwl2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQgKmUpOworCisJQ29uZmlnVmlldyAqbWVudVZpZXc7CisJQ29uZmlnTGlzdCAqbWVudUxpc3Q7CisJQ29uZmlnVmlldyAqY29uZmlnVmlldzsKKwlDb25maWdMaXN0ICpjb25maWdMaXN0OworCVFUZXh0VmlldyAqaGVscFRleHQ7CisJUVRvb2xCYXIgKnRvb2xCYXI7CisJUUFjdGlvbiAqYmFja0FjdGlvbjsKKwlRU3BsaXR0ZXIqIHNwbGl0MTsKKwlRU3BsaXR0ZXIqIHNwbGl0MjsKKworCWJvb2wgc2hvd0RlYnVnOworfTsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDc4NzdhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCkBAIC0wLDAgKzEsODgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCitzdHJ1Y3Qgc3ltYm9sIHN5bWJvbF95ZXMgPSB7CisJLm5hbWUgPSAieSIsCisJLmN1cnIgPSB7ICJ5IiwgeWVzIH0sCisJLmZsYWdzID0gU1lNQk9MX1lFU3xTWU1CT0xfVkFMSUQsCit9LCBzeW1ib2xfbW9kID0geworCS5uYW1lID0gIm0iLAorCS5jdXJyID0geyAibSIsIG1vZCB9LAorCS5mbGFncyA9IFNZTUJPTF9NT0R8U1lNQk9MX1ZBTElELAorfSwgc3ltYm9sX25vID0geworCS5uYW1lID0gIm4iLAorCS5jdXJyID0geyAibiIsIG5vIH0sCisJLmZsYWdzID0gU1lNQk9MX05PfFNZTUJPTF9WQUxJRCwKK30sIHN5bWJvbF9lbXB0eSA9IHsKKwkubmFtZSA9ICIiLAorCS5jdXJyID0geyAiIiwgbm8gfSwKKwkuZmxhZ3MgPSBTWU1CT0xfVkFMSUQsCit9OworCitpbnQgc3ltX2NoYW5nZV9jb3VudDsKK3N0cnVjdCBzeW1ib2wgKm1vZHVsZXNfc3ltOwordHJpc3RhdGUgbW9kdWxlc192YWw7CisKK3ZvaWQgc3ltX2FkZF9kZWZhdWx0KHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqZGVmKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IHByb3BfYWxsb2MoUF9ERUZBVUxULCBzeW0pOworCisJcHJvcC0+ZXhwciA9IGV4cHJfYWxsb2Nfc3ltYm9sKHN5bV9sb29rdXAoZGVmLCAxKSk7Cit9CisKK3ZvaWQgc3ltX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHV0c25hbWUgdXRzOworCWNoYXIgKnA7CisJc3RhdGljIGJvb2wgaW5pdGVkID0gZmFsc2U7CisKKwlpZiAoaW5pdGVkKQorCQlyZXR1cm47CisJaW5pdGVkID0gdHJ1ZTsKKworCXVuYW1lKCZ1dHMpOworCisJc3ltID0gc3ltX2xvb2t1cCgiQVJDSCIsIDApOworCXN5bS0+dHlwZSA9IFNfU1RSSU5HOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0FVVE87CisJcCA9IGdldGVudigiQVJDSCIpOworCWlmIChwKQorCQlzeW1fYWRkX2RlZmF1bHQoc3ltLCBwKTsKKworCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFZFUlNJT04iLCAwKTsKKwlzeW0tPnR5cGUgPSBTX1NUUklORzsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOworCXAgPSBnZXRlbnYoIktFUk5FTFZFUlNJT04iKTsKKwlpZiAocCkKKwkJc3ltX2FkZF9kZWZhdWx0KHN5bSwgcCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJVTkFNRV9SRUxFQVNFIiwgMCk7CisJc3ltLT50eXBlID0gU19TVFJJTkc7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQVVUTzsKKwlzeW1fYWRkX2RlZmF1bHQoc3ltLCB1dHMucmVsZWFzZSk7Cit9CisKK2VudW0gc3ltYm9sX3R5cGUgc3ltX2dldF90eXBlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwllbnVtIHN5bWJvbF90eXBlIHR5cGUgPSBzeW0tPnR5cGU7CisKKwlpZiAodHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykKKwkJCXR5cGUgPSBTX0JPT0xFQU47CisJCWVsc2UgaWYgKG1vZHVsZXNfdmFsID09IG5vKQorCQkJdHlwZSA9IFNfQk9PTEVBTjsKKwl9CisJcmV0dXJuIHR5cGU7Cit9CisKK2NvbnN0IGNoYXIgKnN5bV90eXBlX25hbWUoZW51bSBzeW1ib2xfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCQlyZXR1cm4gImJvb2xlYW4iOworCWNhc2UgU19UUklTVEFURToKKwkJcmV0dXJuICJ0cmlzdGF0ZSI7CisJY2FzZSBTX0lOVDoKKwkJcmV0dXJuICJpbnRlZ2VyIjsKKwljYXNlIFNfSEVYOgorCQlyZXR1cm4gImhleCI7CisJY2FzZSBTX1NUUklORzoKKwkJcmV0dXJuICJzdHJpbmciOworCWNhc2UgU19VTktOT1dOOgorCQlyZXR1cm4gInVua25vd24iOworCWNhc2UgU19PVEhFUjoKKwkJYnJlYWs7CisJfQorCXJldHVybiAiPz8/IjsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X2Nob2ljZV9wcm9wKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlmb3JfYWxsX2Nob2ljZXMoc3ltLCBwcm9wKQorCQlyZXR1cm4gcHJvcDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X2RlZmF1bHRfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9kZWZhdWx0cyhzeW0sIHByb3ApIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJaWYgKHByb3AtPnZpc2libGUudHJpICE9IG5vKQorCQkJcmV0dXJuIHByb3A7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKnN5bV9nZXRfcmFuZ2VfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgcHJvcCwgUF9SQU5HRSkgeworCQlwcm9wLT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpOworCQlpZiAocHJvcC0+dmlzaWJsZS50cmkgIT0gbm8pCisJCQlyZXR1cm4gcHJvcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc3ltX2dldF9yYW5nZV92YWwoc3RydWN0IHN5bWJvbCAqc3ltLCBpbnQgYmFzZSkKK3sKKwlzeW1fY2FsY192YWx1ZShzeW0pOworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwkJYmFzZSA9IDEwOworCQlicmVhazsKKwljYXNlIFNfSEVYOgorCQliYXNlID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RydG9sKHN5bS0+Y3Vyci52YWwsIE5VTEwsIGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBzeW1fdmFsaWRhdGVfcmFuZ2Uoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgYmFzZSwgdmFsLCB2YWwyOworCWNoYXIgc3RyWzY0XTsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwkJYmFzZSA9IDEwOworCQlicmVhazsKKwljYXNlIFNfSEVYOgorCQliYXNlID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJcHJvcCA9IHN5bV9nZXRfcmFuZ2VfcHJvcChzeW0pOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCXZhbCA9IHN0cnRvbChzeW0tPmN1cnIudmFsLCBOVUxMLCBiYXNlKTsKKwl2YWwyID0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+bGVmdC5zeW0sIGJhc2UpOworCWlmICh2YWwgPj0gdmFsMikgeworCQl2YWwyID0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+cmlnaHQuc3ltLCBiYXNlKTsKKwkJaWYgKHZhbCA8PSB2YWwyKQorCQkJcmV0dXJuOworCX0KKwlpZiAoc3ltLT50eXBlID09IFNfSU5UKQorCQlzcHJpbnRmKHN0ciwgIiVkIiwgdmFsMik7CisJZWxzZQorCQlzcHJpbnRmKHN0ciwgIjB4JXgiLCB2YWwyKTsKKwlzeW0tPmN1cnIudmFsID0gc3RyZHVwKHN0cik7Cit9CisKK3N0YXRpYyB2b2lkIHN5bV9jYWxjX3Zpc2liaWxpdHkoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwl0cmlzdGF0ZSB0cmk7CisKKwkvKiBhbnkgcHJvbXB0IHZpc2libGU/ICovCisJdHJpID0gbm87CisJZm9yX2FsbF9wcm9tcHRzKHN5bSwgcHJvcCkgeworCQlwcm9wLT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpOworCQl0cmkgPSBFX09SKHRyaSwgcHJvcC0+dmlzaWJsZS50cmkpOworCX0KKwlpZiAodHJpID09IG1vZCAmJiAoc3ltLT50eXBlICE9IFNfVFJJU1RBVEUgfHwgbW9kdWxlc192YWwgPT0gbm8pKQorCQl0cmkgPSB5ZXM7CisJaWYgKHN5bS0+dmlzaWJsZSAhPSB0cmkpIHsKKwkJc3ltLT52aXNpYmxlID0gdHJpOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CisJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkKKwkJcmV0dXJuOworCXRyaSA9IG5vOworCWlmIChzeW0tPnJldl9kZXAuZXhwcikKKwkJdHJpID0gZXhwcl9jYWxjX3ZhbHVlKHN5bS0+cmV2X2RlcC5leHByKTsKKwlpZiAodHJpID09IG1vZCAmJiBzeW1fZ2V0X3R5cGUoc3ltKSA9PSBTX0JPT0xFQU4pCisJCXRyaSA9IHllczsKKwlpZiAoc3ltLT5yZXZfZGVwLnRyaSAhPSB0cmkpIHsKKwkJc3ltLT5yZXZfZGVwLnRyaSA9IHRyaTsKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltX2NhbGNfY2hvaWNlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpkZWZfc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqZTsKKworCS8qIGlzIHRoZSB1c2VyIGNob2ljZSB2aXNpYmxlPyAqLworCWRlZl9zeW0gPSBzeW0tPnVzZXIudmFsOworCWlmIChkZWZfc3ltKSB7CisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQorCQkJcmV0dXJuIGRlZl9zeW07CisJfQorCisJLyogYW55IG9mIHRoZSBkZWZhdWx0cyB2aXNpYmxlPyAqLworCWZvcl9hbGxfZGVmYXVsdHMoc3ltLCBwcm9wKSB7CisJCXByb3AtPnZpc2libGUudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPnZpc2libGUuZXhwcik7CisJCWlmIChwcm9wLT52aXNpYmxlLnRyaSA9PSBubykKKwkJCWNvbnRpbnVlOworCQlkZWZfc3ltID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOworCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKKwkJCXJldHVybiBkZWZfc3ltOworCX0KKworCS8qIGp1c3QgZ2V0IHRoZSBmaXJzdCB2aXNpYmxlIHZhbHVlICovCisJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCWRlZl9zeW0gPSBlLT5yaWdodC5zeW07CisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQorCQkJcmV0dXJuIGRlZl9zeW07CisJfQorCisJLyogbm8gY2hvaWNlPyByZXNldCB0cmlzdGF0ZSB2YWx1ZSAqLworCXN5bS0+Y3Vyci50cmkgPSBubzsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzeW1fY2FsY192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbF92YWx1ZSBuZXd2YWwsIG9sZHZhbDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfVkFMSUQpCisJCXJldHVybjsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9WQUxJRDsKKworCW9sZHZhbCA9IHN5bS0+Y3VycjsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCW5ld3ZhbCA9IHN5bWJvbF9lbXB0eS5jdXJyOworCQlicmVhazsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW5ld3ZhbCA9IHN5bWJvbF9uby5jdXJyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzeW0tPmN1cnIudmFsID0gc3ltLT5uYW1lOworCQlzeW0tPmN1cnIudHJpID0gbm87CisJCXJldHVybjsKKwl9CisJaWYgKCFzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpCisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9XUklURTsKKworCXN5bV9jYWxjX3Zpc2liaWxpdHkoc3ltKTsKKworCS8qIHNldCBkZWZhdWx0IGlmIHJlY3Vyc2l2ZWx5IGNhbGxlZCAqLworCXN5bS0+Y3VyciA9IG5ld3ZhbDsKKworCXN3aXRjaCAoc3ltX2dldF90eXBlKHN5bSkpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykgeworCQkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwkJCW5ld3ZhbC50cmkgPSAocHJvcF9nZXRfc3ltYm9sKHByb3ApLT5jdXJyLnZhbCA9PSBzeW0pID8geWVzIDogbm87CisJCX0gZWxzZSBpZiAoRV9PUihzeW0tPnZpc2libGUsIHN5bS0+cmV2X2RlcC50cmkpICE9IG5vKSB7CisJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpCisJCQkJbmV3dmFsLnRyaSA9IHN5bS0+dXNlci50cmk7CisJCQllbHNlIGlmICghc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQkJcHJvcCA9IHN5bV9nZXRfZGVmYXVsdF9wcm9wKHN5bSk7CisJCQkJaWYgKHByb3ApCisJCQkJCW5ld3ZhbC50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+ZXhwcik7CisJCQl9CisJCQluZXd2YWwudHJpID0gRV9PUihFX0FORChuZXd2YWwudHJpLCBzeW0tPnZpc2libGUpLCBzeW0tPnJldl9kZXAudHJpKTsKKwkJfSBlbHNlIGlmICghc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQlwcm9wID0gc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3ltKTsKKwkJCWlmIChwcm9wKSB7CisJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQkJbmV3dmFsLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT5leHByKTsKKwkJCX0KKwkJfQorCQlpZiAobmV3dmFsLnRyaSA9PSBtb2QgJiYgc3ltX2dldF90eXBlKHN5bSkgPT0gU19CT09MRUFOKQorCQkJbmV3dmFsLnRyaSA9IHllczsKKwkJYnJlYWs7CisJY2FzZSBTX1NUUklORzoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19JTlQ6CisJCWlmIChzeW0tPnZpc2libGUgIT0gbm8pIHsKKwkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dSSVRFOworCQkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQkJCW5ld3ZhbC52YWwgPSBzeW0tPnVzZXIudmFsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXByb3AgPSBzeW1fZ2V0X2RlZmF1bHRfcHJvcChzeW0pOworCQlpZiAocHJvcCkgeworCQkJc3RydWN0IHN5bWJvbCAqZHMgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQlpZiAoZHMpIHsKKwkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCQlzeW1fY2FsY192YWx1ZShkcyk7CisJCQkJbmV3dmFsLnZhbCA9IGRzLT5jdXJyLnZhbDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCisJc3ltLT5jdXJyID0gbmV3dmFsOworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgJiYgbmV3dmFsLnRyaSA9PSB5ZXMpCisJCXN5bS0+Y3Vyci52YWwgPSBzeW1fY2FsY19jaG9pY2Uoc3ltKTsKKwlzeW1fdmFsaWRhdGVfcmFuZ2Uoc3ltKTsKKworCWlmIChtZW1jbXAoJm9sZHZhbCwgJnN5bS0+Y3Vyciwgc2l6ZW9mKG9sZHZhbCkpKQorCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwlpZiAobW9kdWxlc19zeW0gPT0gc3ltKQorCQltb2R1bGVzX3ZhbCA9IG1vZHVsZXNfc3ltLT5jdXJyLnRyaTsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJaW50IGZsYWdzID0gc3ltLT5mbGFncyAmIChTWU1CT0xfQ0hBTkdFRCB8IFNZTUJPTF9XUklURSk7CisJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJCWZvciAoZSA9IHByb3AtPmV4cHI7IGU7IGUgPSBlLT5sZWZ0LmV4cHIpIHsKKwkJCWUtPnJpZ2h0LnN5bS0+ZmxhZ3MgfD0gZmxhZ3M7CisJCQlpZiAoZmxhZ3MgJiBTWU1CT0xfQ0hBTkdFRCkKKwkJCQlzeW1fc2V0X2NoYW5nZWQoZS0+cmlnaHQuc3ltKTsKKwkJfQorCX0KK30KKwordm9pZCBzeW1fY2xlYXJfYWxsX3ZhbGlkKHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkKKwkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1ZBTElEOworCXN5bV9jaGFuZ2VfY291bnQrKzsKKwlpZiAobW9kdWxlc19zeW0pCisJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKK30KKwordm9pZCBzeW1fc2V0X2NoYW5nZWQoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIQU5HRUQ7CisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlpZiAocHJvcC0+bWVudSkKKwkJCXByb3AtPm1lbnUtPmZsYWdzIHw9IE1FTlVfQ0hBTkdFRDsKKwl9Cit9CisKK3ZvaWQgc3ltX3NldF9hbGxfY2hhbmdlZCh2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pCisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworfQorCitib29sIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3RydWN0IHN5bWJvbCAqc3ltLCB0cmlzdGF0ZSB2YWwpCit7CisJaW50IHR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKworCWlmIChzeW0tPnZpc2libGUgPT0gbm8pCisJCXJldHVybiBmYWxzZTsKKworCWlmICh0eXBlICE9IFNfQk9PTEVBTiAmJiB0eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh0eXBlID09IFNfQk9PTEVBTiAmJiB2YWwgPT0gbW9kKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHN5bS0+dmlzaWJsZSA8PSBzeW0tPnJldl9kZXAudHJpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiBzeW0tPnZpc2libGUgPT0geWVzKQorCQlyZXR1cm4gdmFsID09IHllczsKKwlyZXR1cm4gdmFsID49IHN5bS0+cmV2X2RlcC50cmkgJiYgdmFsIDw9IHN5bS0+dmlzaWJsZTsKK30KKworYm9vbCBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSwgdHJpc3RhdGUgdmFsKQoreworCXRyaXN0YXRlIG9sZHZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKworCWlmIChvbGR2YWwgIT0gdmFsICYmICFzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgdmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSB7CisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KKwkvKgorCSAqIHNldHRpbmcgYSBjaG9pY2UgdmFsdWUgYWxzbyByZXNldHMgdGhlIG5ldyBmbGFnIG9mIHRoZSBjaG9pY2UKKwkgKiBzeW1ib2wgYW5kIGFsbCBvdGhlciBjaG9pY2UgdmFsdWVzLgorCSAqLworCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdmFsID09IHllcykgeworCQlzdHJ1Y3Qgc3ltYm9sICpjcyA9IHByb3BfZ2V0X3N5bWJvbChzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSkpOworCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJCXN0cnVjdCBleHByICplOworCisJCWNzLT51c2VyLnZhbCA9IHN5bTsKKwkJY3MtPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChjcyk7CisJCWZvciAoZSA9IHByb3AtPmV4cHI7IGU7IGUgPSBlLT5sZWZ0LmV4cHIpIHsKKwkJCWlmIChlLT5yaWdodC5zeW0tPnZpc2libGUgIT0gbm8pCisJCQkJZS0+cmlnaHQuc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJfQorCX0KKworCXN5bS0+dXNlci50cmkgPSB2YWw7CisJaWYgKG9sZHZhbCAhPSB2YWwpIHsKKwkJc3ltX2NsZWFyX2FsbF92YWxpZCgpOworCQlpZiAoc3ltID09IG1vZHVsZXNfc3ltKQorCQkJc3ltX3NldF9hbGxfY2hhbmdlZCgpOworCX0KKworCXJldHVybiB0cnVlOworfQorCit0cmlzdGF0ZSBzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwl0cmlzdGF0ZSBvbGR2YWwsIG5ld3ZhbDsKKworCW9sZHZhbCA9IG5ld3ZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwlkbyB7CisJCXN3aXRjaCAobmV3dmFsKSB7CisJCWNhc2Ugbm86CisJCQluZXd2YWwgPSBtb2Q7CisJCQlicmVhazsKKwkJY2FzZSBtb2Q6CisJCQluZXd2YWwgPSB5ZXM7CisJCQlicmVhazsKKwkJY2FzZSB5ZXM6CisJCQluZXd2YWwgPSBubzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKG9sZHZhbCAhPSBuZXd2YWwpOworCXJldHVybiBuZXd2YWw7Cit9CisKK2Jvb2wgc3ltX3N0cmluZ192YWxpZChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzaWduZWQgY2hhciBjaDsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX1NUUklORzoKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBTX0lOVDoKKwkJY2ggPSAqc3RyKys7CisJCWlmIChjaCA9PSAnLScpCisJCQljaCA9ICpzdHIrKzsKKwkJaWYgKCFpc2RpZ2l0KGNoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGNoID09ICcwJyAmJiAqc3RyICE9IDApCisJCQlyZXR1cm4gZmFsc2U7CisJCXdoaWxlICgoY2ggPSAqc3RyKyspKSB7CisJCQlpZiAoIWlzZGlnaXQoY2gpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFNfSEVYOgorCQlpZiAoc3RyWzBdID09ICcwJyAmJiAoc3RyWzFdID09ICd4JyB8fCBzdHJbMV0gPT0gJ1gnKSkKKwkJCXN0ciArPSAyOworCQljaCA9ICpzdHIrKzsKKwkJZG8geworCQkJaWYgKCFpc3hkaWdpdChjaCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IHdoaWxlICgoY2ggPSAqc3RyKyspKTsKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKHN0clswXSkgeworCQljYXNlICd5JzogY2FzZSAnWSc6CisJCWNhc2UgJ20nOiBjYXNlICdNJzoKKwkJY2FzZSAnbic6IGNhc2UgJ04nOgorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK2Jvb2wgc3ltX3N0cmluZ193aXRoaW5fcmFuZ2Uoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCWludCB2YWw7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19TVFJJTkc6CisJCXJldHVybiBzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3RyKTsKKwljYXNlIFNfSU5UOgorCQlpZiAoIXN5bV9zdHJpbmdfdmFsaWQoc3ltLCBzdHIpKQorCQkJcmV0dXJuIGZhbHNlOworCQlwcm9wID0gc3ltX2dldF9yYW5nZV9wcm9wKHN5bSk7CisJCWlmICghcHJvcCkKKwkJCXJldHVybiB0cnVlOworCQl2YWwgPSBzdHJ0b2woc3RyLCBOVUxMLCAxMCk7CisJCXJldHVybiB2YWwgPj0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+bGVmdC5zeW0sIDEwKSAmJgorCQkgICAgICAgdmFsIDw9IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPnJpZ2h0LnN5bSwgMTApOworCWNhc2UgU19IRVg6CisJCWlmICghc3ltX3N0cmluZ192YWxpZChzeW0sIHN0cikpCisJCQlyZXR1cm4gZmFsc2U7CisJCXByb3AgPSBzeW1fZ2V0X3JhbmdlX3Byb3Aoc3ltKTsKKwkJaWYgKCFwcm9wKQorCQkJcmV0dXJuIHRydWU7CisJCXZhbCA9IHN0cnRvbChzdHIsIE5VTEwsIDE2KTsKKwkJcmV0dXJuIHZhbCA+PSBzeW1fZ2V0X3JhbmdlX3ZhbChwcm9wLT5leHByLT5sZWZ0LnN5bSwgMTYpICYmCisJCSAgICAgICB2YWwgPD0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+cmlnaHQuc3ltLCAxNik7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKHN0clswXSkgeworCQljYXNlICd5JzogY2FzZSAnWSc6CisJCQlyZXR1cm4gc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcyk7CisJCWNhc2UgJ20nOiBjYXNlICdNJzoKKwkJCXJldHVybiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKTsKKwkJY2FzZSAnbic6IGNhc2UgJ04nOgorCQkJcmV0dXJuIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK2Jvb2wgc3ltX3NldF9zdHJpbmdfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpuZXd2YWwpCit7CisJY29uc3QgY2hhciAqb2xkdmFsOworCWNoYXIgKnZhbDsKKwlpbnQgc2l6ZTsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKG5ld3ZhbFswXSkgeworCQljYXNlICd5JzogY2FzZSAnWSc6CisJCQlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIHllcyk7CisJCWNhc2UgJ20nOiBjYXNlICdNJzoKKwkJCXJldHVybiBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKTsKKwkJY2FzZSAnbic6IGNhc2UgJ04nOgorCQkJcmV0dXJuIHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBubyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCTsKKwl9CisKKwlpZiAoIXN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN5bSwgbmV3dmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSB7CisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KKworCW9sZHZhbCA9IHN5bS0+dXNlci52YWw7CisJc2l6ZSA9IHN0cmxlbihuZXd2YWwpICsgMTsKKwlpZiAoc3ltLT50eXBlID09IFNfSEVYICYmIChuZXd2YWxbMF0gIT0gJzAnIHx8IChuZXd2YWxbMV0gIT0gJ3gnICYmIG5ld3ZhbFsxXSAhPSAnWCcpKSkgeworCQlzaXplICs9IDI7CisJCXN5bS0+dXNlci52YWwgPSB2YWwgPSBtYWxsb2Moc2l6ZSk7CisJCSp2YWwrKyA9ICcwJzsKKwkJKnZhbCsrID0gJ3gnOworCX0gZWxzZSBpZiAoIW9sZHZhbCB8fCBzdHJjbXAob2xkdmFsLCBuZXd2YWwpKQorCQlzeW0tPnVzZXIudmFsID0gdmFsID0gbWFsbG9jKHNpemUpOworCWVsc2UKKwkJcmV0dXJuIHRydWU7CisKKwlzdHJjcHkodmFsLCBuZXd2YWwpOworCWZyZWUoKHZvaWQgKilvbGR2YWwpOworCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKworCXJldHVybiB0cnVlOworfQorCitjb25zdCBjaGFyICpzeW1fZ2V0X3N0cmluZ192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJdHJpc3RhdGUgdmFsOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAibiI7CisJCWNhc2UgbW9kOgorCQkJcmV0dXJuICJtIjsKKwkJY2FzZSB5ZXM6CisJCQlyZXR1cm4gInkiOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIChjb25zdCBjaGFyICopc3ltLT5jdXJyLnZhbDsKK30KKworYm9vbCBzeW1faXNfY2hhbmdhYmxlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT52aXNpYmxlID4gc3ltLT5yZXZfZGVwLnRyaTsKK30KKworc3RydWN0IHN5bWJvbCAqc3ltX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCBpbnQgaXNjb25zdCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisJY29uc3QgY2hhciAqcHRyOworCWNoYXIgKm5ld19uYW1lOworCWludCBoYXNoID0gMDsKKworCWlmIChuYW1lKSB7CisJCWlmIChuYW1lWzBdICYmICFuYW1lWzFdKSB7CisJCQlzd2l0Y2ggKG5hbWVbMF0pIHsKKwkJCWNhc2UgJ3knOiByZXR1cm4gJnN5bWJvbF95ZXM7CisJCQljYXNlICdtJzogcmV0dXJuICZzeW1ib2xfbW9kOworCQkJY2FzZSAnbic6IHJldHVybiAmc3ltYm9sX25vOworCQkJfQorCQl9CisJCWZvciAocHRyID0gbmFtZTsgKnB0cjsgcHRyKyspCisJCQloYXNoICs9ICpwdHI7CisJCWhhc2ggJj0gMHhmZjsKKworCQlmb3IgKHN5bWJvbCA9IHN5bWJvbF9oYXNoW2hhc2hdOyBzeW1ib2w7IHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkgeworCQkJaWYgKCFzdHJjbXAoc3ltYm9sLT5uYW1lLCBuYW1lKSkgeworCQkJCWlmICgoaXNjb25zdCAmJiBzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSB8fAorCQkJCSAgICAoIWlzY29uc3QgJiYgIShzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkpCisJCQkJCXJldHVybiBzeW1ib2w7CisJCQl9CisJCX0KKwkJbmV3X25hbWUgPSBzdHJkdXAobmFtZSk7CisJfSBlbHNlIHsKKwkJbmV3X25hbWUgPSBOVUxMOworCQloYXNoID0gMjU2OworCX0KKworCXN5bWJvbCA9IG1hbGxvYyhzaXplb2YoKnN5bWJvbCkpOworCW1lbXNldChzeW1ib2wsIDAsIHNpemVvZigqc3ltYm9sKSk7CisJc3ltYm9sLT5uYW1lID0gbmV3X25hbWU7CisJc3ltYm9sLT50eXBlID0gU19VTktOT1dOOworCXN5bWJvbC0+ZmxhZ3MgPSBTWU1CT0xfTkVXOworCWlmIChpc2NvbnN0KQorCQlzeW1ib2wtPmZsYWdzIHw9IFNZTUJPTF9DT05TVDsKKworCXN5bWJvbC0+bmV4dCA9IHN5bWJvbF9oYXNoW2hhc2hdOworCXN5bWJvbF9oYXNoW2hhc2hdID0gc3ltYm9sOworCisJcmV0dXJuIHN5bWJvbDsKK30KKworc3RydWN0IHN5bWJvbCAqc3ltX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2wgPSBOVUxMOworCWNvbnN0IGNoYXIgKnB0cjsKKwlpbnQgaGFzaCA9IDA7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOworCisJaWYgKG5hbWVbMF0gJiYgIW5hbWVbMV0pIHsKKwkJc3dpdGNoIChuYW1lWzBdKSB7CisJCWNhc2UgJ3knOiByZXR1cm4gJnN5bWJvbF95ZXM7CisJCWNhc2UgJ20nOiByZXR1cm4gJnN5bWJvbF9tb2Q7CisJCWNhc2UgJ24nOiByZXR1cm4gJnN5bWJvbF9ubzsKKwkJfQorCX0KKwlmb3IgKHB0ciA9IG5hbWU7ICpwdHI7IHB0cisrKQorCQloYXNoICs9ICpwdHI7CisJaGFzaCAmPSAweGZmOworCisJZm9yIChzeW1ib2wgPSBzeW1ib2xfaGFzaFtoYXNoXTsgc3ltYm9sOyBzeW1ib2wgPSBzeW1ib2wtPm5leHQpIHsKKwkJaWYgKCFzdHJjbXAoc3ltYm9sLT5uYW1lLCBuYW1lKSAmJgorCQkgICAgIShzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3ltYm9sOworfQorCitzdHJ1Y3Qgc3ltYm9sICoqc3ltX3JlX3NlYXJjaChjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSwgKipzeW1fYXJyID0gTlVMTDsKKwlpbnQgaSwgY250LCBzaXplOworCXJlZ2V4X3QgcmU7CisKKwljbnQgPSBzaXplID0gMDsKKwkvKiBTa2lwIGlmIGVtcHR5ICovCisJaWYgKHN0cmxlbihwYXR0ZXJuKSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAocmVnY29tcCgmcmUsIHBhdHRlcm4sIFJFR19FWFRFTkRFRHxSRUdfTk9TVUJ8UkVHX0lDQVNFKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NPTlNUIHx8ICFzeW0tPm5hbWUpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZ2V4ZWMoJnJlLCBzeW0tPm5hbWUsIDAsIE5VTEwsIDApKQorCQkJY29udGludWU7CisJCWlmIChjbnQgKyAxID49IHNpemUpIHsKKwkJCXZvaWQgKnRtcCA9IHN5bV9hcnI7CisJCQlzaXplICs9IDE2OworCQkJc3ltX2FyciA9IHJlYWxsb2Moc3ltX2Fyciwgc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc3ltYm9sICopKTsKKwkJCWlmICghc3ltX2FycikgeworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlzeW1fYXJyW2NudCsrXSA9IHN5bTsKKwl9CisJaWYgKHN5bV9hcnIpCisJCXN5bV9hcnJbY250XSA9IE5VTEw7CisJcmVnZnJlZSgmcmUpOworCisJcmV0dXJuIHN5bV9hcnI7Cit9CisKKworc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19leHByX2RlcHMoc3RydWN0IGV4cHIgKmUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJc3ltID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhlLT5sZWZ0LmV4cHIpOworCQlpZiAoc3ltKQorCQkJcmV0dXJuIHN5bTsKKwkJcmV0dXJuIHN5bV9jaGVja19leHByX2RlcHMoZS0+cmlnaHQuZXhwcik7CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIHN5bV9jaGVja19leHByX2RlcHMoZS0+bGVmdC5leHByKTsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCXN5bSA9IHN5bV9jaGVja19kZXBzKGUtPmxlZnQuc3ltKTsKKwkJaWYgKHN5bSkKKwkJCXJldHVybiBzeW07CisJCXJldHVybiBzeW1fY2hlY2tfZGVwcyhlLT5yaWdodC5zeW0pOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBzeW1fY2hlY2tfZGVwcyhlLT5sZWZ0LnN5bSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXByaW50ZigiT29wcyEgSG93IHRvIGNoZWNrICVkP1xuIiwgZS0+dHlwZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19kZXBzKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0yOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NIRUNLKSB7CisJCXByaW50ZigiV2FybmluZyEgRm91bmQgcmVjdXJzaXZlIGRlcGVuZGVuY3k6ICVzIiwgc3ltLT5uYW1lKTsKKwkJcmV0dXJuIHN5bTsKKwl9CisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hFQ0tFRCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzeW0tPmZsYWdzIHw9IChTWU1CT0xfQ0hFQ0sgfCBTWU1CT0xfQ0hFQ0tFRCk7CisJc3ltMiA9IHN5bV9jaGVja19leHByX2RlcHMoc3ltLT5yZXZfZGVwLmV4cHIpOworCWlmIChzeW0yKQorCQlnb3RvIG91dDsKKworCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPnR5cGUgPT0gUF9DSE9JQ0UgfHwgcHJvcC0+dHlwZSA9PSBQX1NFTEVDVCkKKwkJCWNvbnRpbnVlOworCQlzeW0yID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhwcm9wLT52aXNpYmxlLmV4cHIpOworCQlpZiAoc3ltMikKKwkJCWdvdG8gb3V0OworCQlpZiAocHJvcC0+dHlwZSAhPSBQX0RFRkFVTFQgfHwgc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJY29udGludWU7CisJCXN5bTIgPSBzeW1fY2hlY2tfZXhwcl9kZXBzKHByb3AtPmV4cHIpOworCQlpZiAoc3ltMikKKwkJCWdvdG8gb3V0OworCX0KK291dDoKKwlpZiAoc3ltMikgeworCQlwcmludGYoIiAlcyIsIHN5bS0+bmFtZSk7CisJCWlmIChzeW0yID09IHN5bSkgeworCQkJcHJpbnRmKCJcbiIpOworCQkJc3ltMiA9IE5VTEw7CisJCX0KKwl9CisJc3ltLT5mbGFncyAmPSB+U1lNQk9MX0NIRUNLOworCXJldHVybiBzeW0yOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKnByb3BfYWxsb2MoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgcHJvcGVydHkgKipwcm9wcDsKKworCXByb3AgPSBtYWxsb2Moc2l6ZW9mKCpwcm9wKSk7CisJbWVtc2V0KHByb3AsIDAsIHNpemVvZigqcHJvcCkpOworCXByb3AtPnR5cGUgPSB0eXBlOworCXByb3AtPnN5bSA9IHN5bTsKKwlwcm9wLT5maWxlID0gY3VycmVudF9maWxlOworCXByb3AtPmxpbmVubyA9IHpjb25mX2xpbmVubygpOworCisJLyogYXBwZW5kIHByb3BlcnR5IHRvIHRoZSBwcm9wIGxpc3Qgb2Ygc3ltYm9sICovCisJaWYgKHN5bSkgeworCQlmb3IgKHByb3BwID0gJnN5bS0+cHJvcDsgKnByb3BwOyBwcm9wcCA9ICYoKnByb3BwKS0+bmV4dCkKKwkJCTsKKwkJKnByb3BwID0gcHJvcDsKKwl9CisKKwlyZXR1cm4gcHJvcDsKK30KKworc3RydWN0IHN5bWJvbCAqcHJvcF9nZXRfc3ltYm9sKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlpZiAocHJvcC0+ZXhwciAmJiAocHJvcC0+ZXhwci0+dHlwZSA9PSBFX1NZTUJPTCB8fAorCQkJICAgcHJvcC0+ZXhwci0+dHlwZSA9PSBFX0NIT0lDRSkpCisJCXJldHVybiBwcm9wLT5leHByLT5sZWZ0LnN5bTsKKwlyZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqcHJvcF9nZXRfdHlwZV9uYW1lKGVudW0gcHJvcF90eXBlIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBQX1BST01QVDoKKwkJcmV0dXJuICJwcm9tcHQiOworCWNhc2UgUF9DT01NRU5UOgorCQlyZXR1cm4gImNvbW1lbnQiOworCWNhc2UgUF9NRU5VOgorCQlyZXR1cm4gIm1lbnUiOworCWNhc2UgUF9ERUZBVUxUOgorCQlyZXR1cm4gImRlZmF1bHQiOworCWNhc2UgUF9DSE9JQ0U6CisJCXJldHVybiAiY2hvaWNlIjsKKwljYXNlIFBfU0VMRUNUOgorCQlyZXR1cm4gInNlbGVjdCI7CisJY2FzZSBQX1JBTkdFOgorCQlyZXR1cm4gInJhbmdlIjsKKwljYXNlIFBfVU5LTk9XTjoKKwkJYnJlYWs7CisJfQorCXJldHVybiAidW5rbm93biI7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvdXRpbC5jIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjMwOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgU2FtIFJhdm5ib3JnIDxzYW1AcmF2bmJvcmcub3JnPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsa2MuaCIKKworLyogZmlsZSBhbHJlYWR5IHByZXNlbnQgaW4gbGlzdD8gSWYgbm90IGFkZCBpdCAqLworc3RydWN0IGZpbGUgKmZpbGVfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwlmb3IgKGZpbGUgPSBmaWxlX2xpc3Q7IGZpbGU7IGZpbGUgPSBmaWxlLT5uZXh0KSB7CisJCWlmICghc3RyY21wKG5hbWUsIGZpbGUtPm5hbWUpKQorCQkJcmV0dXJuIGZpbGU7CisJfQorCisJZmlsZSA9IG1hbGxvYyhzaXplb2YoKmZpbGUpKTsKKwltZW1zZXQoZmlsZSwgMCwgc2l6ZW9mKCpmaWxlKSk7CisJZmlsZS0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKwlmaWxlLT5uZXh0ID0gZmlsZV9saXN0OworCWZpbGVfbGlzdCA9IGZpbGU7CisJcmV0dXJuIGZpbGU7Cit9CisKKy8qIHdyaXRlIGEgZGVwZW5kZW5jeSBmaWxlIGFzIHVzZWQgYnkga2J1aWxkIHRvIHRyYWNrIGRlcGVuZGVuY2llcyAqLworaW50IGZpbGVfd3JpdGVfZGVwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJRklMRSAqb3V0OworCisJaWYgKCFuYW1lKQorCQluYW1lID0gIi5rY29uZmlnLmQiOworCW91dCA9IGZvcGVuKCIuLmNvbmZpZy50bXAiLCAidyIpOworCWlmICghb3V0KQorCQlyZXR1cm4gMTsKKwlmcHJpbnRmKG91dCwgImRlcHNfY29uZmlnIDo9IFxcXG4iKTsKKwlmb3IgKGZpbGUgPSBmaWxlX2xpc3Q7IGZpbGU7IGZpbGUgPSBmaWxlLT5uZXh0KSB7CisJCWlmIChmaWxlLT5uZXh0KQorCQkJZnByaW50ZihvdXQsICJcdCVzIFxcXG4iLCBmaWxlLT5uYW1lKTsKKwkJZWxzZQorCQkJZnByaW50ZihvdXQsICJcdCVzXG4iLCBmaWxlLT5uYW1lKTsKKwl9CisJZnByaW50ZihvdXQsCisJCSJcbiIKKwkJIi5jb25maWcgaW5jbHVkZS9hdXRvY29uZi5oOiAkKGRlcHNfY29uZmlnKVxuIgorCQkiXG4iCisJCSJpbmNsdWRlL2F1dG9jb25mLmg6IC5jb25maWdcbiIgLyogYmJveCAqLworCQkiXG4iCisJCSIkKGRlcHNfY29uZmlnKTpcbiIpOworCWZjbG9zZShvdXQpOworCXJlbmFtZSgiLi5jb25maWcudG1wIiwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogQWxsb2NhdGUgaW5pdGlhbCBncm93YWJsZSBzdHJpbmcgKi8KK3N0cnVjdCBnc3RyIHN0cl9uZXcodm9pZCkKK3sKKwlzdHJ1Y3QgZ3N0ciBnczsKKwlncy5zID0gbWFsbG9jKHNpemVvZihjaGFyKSAqIDY0KTsKKwlncy5sZW4gPSAxNjsKKwlzdHJjcHkoZ3MucywgIlwwIik7CisJcmV0dXJuIGdzOworfQorCisvKiBBbGxvY2F0ZSBhbmQgYXNzaWduIGdyb3dhYmxlIHN0cmluZyAqLworc3RydWN0IGdzdHIgc3RyX2Fzc2lnbihjb25zdCBjaGFyICpzKQoreworCXN0cnVjdCBnc3RyIGdzOworCWdzLnMgPSBzdHJkdXAocyk7CisJZ3MubGVuID0gc3RybGVuKHMpICsgMTsKKwlyZXR1cm4gZ3M7Cit9CisKKy8qIEZyZWUgc3RvcmFnZSBmb3IgZ3Jvd2FibGUgc3RyaW5nICovCit2b2lkIHN0cl9mcmVlKHN0cnVjdCBnc3RyICpncykKK3sKKwlpZiAoZ3MtPnMpCisJCWZyZWUoZ3MtPnMpOworCWdzLT5zID0gTlVMTDsKKwlncy0+bGVuID0gMDsKK30KKworLyogQXBwZW5kIHRvIGdyb3dhYmxlIHN0cmluZyAqLwordm9pZCBzdHJfYXBwZW5kKHN0cnVjdCBnc3RyICpncywgY29uc3QgY2hhciAqcykKK3sKKwlzaXplX3QgbCA9IHN0cmxlbihncy0+cykgKyBzdHJsZW4ocykgKyAxOworCWlmIChsID4gZ3MtPmxlbikgeworCQlncy0+cyAgID0gcmVhbGxvYyhncy0+cywgbCk7CisJCWdzLT5sZW4gPSBsOworCX0KKwlzdHJjYXQoZ3MtPnMsIHMpOworfQorCisvKiBBcHBlbmQgcHJpbnRmIGZvcm1hdHRlZCBzdHJpbmcgdG8gZ3Jvd2FibGUgc3RyaW5nICovCit2b2lkIHN0cl9wcmludGYoc3RydWN0IGdzdHIgKmdzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWNoYXIgc1sxMDAwMF07IC8qIGJpZyBlbm91Z2guLi4gKi8KKwl2YV9zdGFydChhcCwgZm10KTsKKwl2c25wcmludGYocywgc2l6ZW9mKHMpLCBmbXQsIGFwKTsKKwlzdHJfYXBwZW5kKGdzLCBzKTsKKwl2YV9lbmQoYXApOworfQorCisvKiBSZXRyaWV2ZSB2YWx1ZSBvZiBncm93YWJsZSBzdHJpbmcgKi8KK2NvbnN0IGNoYXIgKnN0cl9nZXQoc3RydWN0IGdzdHIgKmdzKQoreworCXJldHVybiBncy0+czsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMyMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmCkBAIC0wLDAgKzEsNDMgQEAKKyVsYW5ndWFnZT1BTlNJLUMKKyVkZWZpbmUgaGFzaC1mdW5jdGlvbi1uYW1lIGtjb25mX2lkX2hhc2gKKyVkZWZpbmUgbG9va3VwLWZ1bmN0aW9uLW5hbWUga2NvbmZfaWRfbG9va3VwCislZGVmaW5lIHN0cmluZy1wb29sLW5hbWUga2NvbmZfaWRfc3RyaW5ncworJWNvbXBhcmUtc3RybmNtcAorJWVudW0KKyVwaWMKKyVzdHJ1Y3QtdHlwZQorCitzdHJ1Y3Qga2NvbmZfaWQ7CisKKyUlCittYWlubWVudSwJVF9NQUlOTUVOVSwJVEZfQ09NTUFORAorbWVudSwJCVRfTUVOVSwJCVRGX0NPTU1BTkQKK2VuZG1lbnUsCVRfRU5ETUVOVSwJVEZfQ09NTUFORAorc291cmNlLAkJVF9TT1VSQ0UsCVRGX0NPTU1BTkQKK2Nob2ljZSwJCVRfQ0hPSUNFLAlURl9DT01NQU5ECitlbmRjaG9pY2UsCVRfRU5EQ0hPSUNFLAlURl9DT01NQU5ECitjb21tZW50LAlUX0NPTU1FTlQsCVRGX0NPTU1BTkQKK2NvbmZpZywJCVRfQ09ORklHLAlURl9DT01NQU5ECittZW51Y29uZmlnLAlUX01FTlVDT05GSUcsCVRGX0NPTU1BTkQKK2hlbHAsCQlUX0hFTFAsCQlURl9DT01NQU5ECitpZiwJCVRfSUYsCQlURl9DT01NQU5EfFRGX1BBUkFNCitlbmRpZiwJCVRfRU5ESUYsCVRGX0NPTU1BTkQKK2RlcGVuZHMsCVRfREVQRU5EUywJVEZfQ09NTUFORAorcmVxdWlyZXMsCVRfUkVRVUlSRVMsCVRGX0NPTU1BTkQKK29wdGlvbmFsLAlUX09QVElPTkFMLAlURl9DT01NQU5ECitkZWZhdWx0LAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfVU5LTk9XTgorcHJvbXB0LAkJVF9QUk9NUFQsCVRGX0NPTU1BTkQKK3RyaXN0YXRlLAlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1RSSVNUQVRFCitkZWZfdHJpc3RhdGUsCVRfREVGQVVMVCwJVEZfQ09NTUFORCwgU19UUklTVEFURQorYm9vbCwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfQk9PTEVBTgorYm9vbGVhbiwJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19CT09MRUFOCitkZWZfYm9vbCwJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX0JPT0xFQU4KK2RlZl9ib29sZWFuLAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfQk9PTEVBTgoraW50LAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19JTlQKK2hleCwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfSEVYCitzdHJpbmcsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1NUUklORworc2VsZWN0LAkJVF9TRUxFQ1QsCVRGX0NPTU1BTkQKK2VuYWJsZSwJCVRfU0VMRUNULAlURl9DT01NQU5ECityYW5nZSwJCVRfUkFOR0UsCVRGX0NPTU1BTkQKK29uLAkJVF9PTiwJCVRGX1BBUkFNCislJQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3pjb25mLmhhc2guY19zaGlwcGVkIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3pjb25mLmhhc2guY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOWNmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvemNvbmYuaGFzaC5jX3NoaXBwZWQKQEAgLTAsMCArMSwyMzAgQEAKKy8qIEFOU0ktQyBjb2RlIHByb2R1Y2VkIGJ5IGdwZXJmIHZlcnNpb24gMy4wLjEgKi8KKy8qIENvbW1hbmQtbGluZTogZ3BlcmYgICovCisvKiBDb21wdXRlZCBwb3NpdGlvbnM6IC1rJzEsMycgKi8KKworI2lmICEoKCcgJyA9PSAzMikgJiYgKCchJyA9PSAzMykgJiYgKCciJyA9PSAzNCkgJiYgKCcjJyA9PSAzNSkgXAorICAgICAgJiYgKCclJyA9PSAzNykgJiYgKCcmJyA9PSAzOCkgJiYgKCdcJycgPT0gMzkpICYmICgnKCcgPT0gNDApIFwKKyAgICAgICYmICgnKScgPT0gNDEpICYmICgnKicgPT0gNDIpICYmICgnKycgPT0gNDMpICYmICgnLCcgPT0gNDQpIFwKKyAgICAgICYmICgnLScgPT0gNDUpICYmICgnLicgPT0gNDYpICYmICgnLycgPT0gNDcpICYmICgnMCcgPT0gNDgpIFwKKyAgICAgICYmICgnMScgPT0gNDkpICYmICgnMicgPT0gNTApICYmICgnMycgPT0gNTEpICYmICgnNCcgPT0gNTIpIFwKKyAgICAgICYmICgnNScgPT0gNTMpICYmICgnNicgPT0gNTQpICYmICgnNycgPT0gNTUpICYmICgnOCcgPT0gNTYpIFwKKyAgICAgICYmICgnOScgPT0gNTcpICYmICgnOicgPT0gNTgpICYmICgnOycgPT0gNTkpICYmICgnPCcgPT0gNjApIFwKKyAgICAgICYmICgnPScgPT0gNjEpICYmICgnPicgPT0gNjIpICYmICgnPycgPT0gNjMpICYmICgnQScgPT0gNjUpIFwKKyAgICAgICYmICgnQicgPT0gNjYpICYmICgnQycgPT0gNjcpICYmICgnRCcgPT0gNjgpICYmICgnRScgPT0gNjkpIFwKKyAgICAgICYmICgnRicgPT0gNzApICYmICgnRycgPT0gNzEpICYmICgnSCcgPT0gNzIpICYmICgnSScgPT0gNzMpIFwKKyAgICAgICYmICgnSicgPT0gNzQpICYmICgnSycgPT0gNzUpICYmICgnTCcgPT0gNzYpICYmICgnTScgPT0gNzcpIFwKKyAgICAgICYmICgnTicgPT0gNzgpICYmICgnTycgPT0gNzkpICYmICgnUCcgPT0gODApICYmICgnUScgPT0gODEpIFwKKyAgICAgICYmICgnUicgPT0gODIpICYmICgnUycgPT0gODMpICYmICgnVCcgPT0gODQpICYmICgnVScgPT0gODUpIFwKKyAgICAgICYmICgnVicgPT0gODYpICYmICgnVycgPT0gODcpICYmICgnWCcgPT0gODgpICYmICgnWScgPT0gODkpIFwKKyAgICAgICYmICgnWicgPT0gOTApICYmICgnWycgPT0gOTEpICYmICgnXFwnID09IDkyKSAmJiAoJ10nID09IDkzKSBcCisgICAgICAmJiAoJ14nID09IDk0KSAmJiAoJ18nID09IDk1KSAmJiAoJ2EnID09IDk3KSAmJiAoJ2InID09IDk4KSBcCisgICAgICAmJiAoJ2MnID09IDk5KSAmJiAoJ2QnID09IDEwMCkgJiYgKCdlJyA9PSAxMDEpICYmICgnZicgPT0gMTAyKSBcCisgICAgICAmJiAoJ2cnID09IDEwMykgJiYgKCdoJyA9PSAxMDQpICYmICgnaScgPT0gMTA1KSAmJiAoJ2onID09IDEwNikgXAorICAgICAgJiYgKCdrJyA9PSAxMDcpICYmICgnbCcgPT0gMTA4KSAmJiAoJ20nID09IDEwOSkgJiYgKCduJyA9PSAxMTApIFwKKyAgICAgICYmICgnbycgPT0gMTExKSAmJiAoJ3AnID09IDExMikgJiYgKCdxJyA9PSAxMTMpICYmICgncicgPT0gMTE0KSBcCisgICAgICAmJiAoJ3MnID09IDExNSkgJiYgKCd0JyA9PSAxMTYpICYmICgndScgPT0gMTE3KSAmJiAoJ3YnID09IDExOCkgXAorICAgICAgJiYgKCd3JyA9PSAxMTkpICYmICgneCcgPT0gMTIwKSAmJiAoJ3knID09IDEyMSkgJiYgKCd6JyA9PSAxMjIpIFwKKyAgICAgICYmICgneycgPT0gMTIzKSAmJiAoJ3wnID09IDEyNCkgJiYgKCd9JyA9PSAxMjUpICYmICgnficgPT0gMTI2KSkKKy8qIFRoZSBjaGFyYWN0ZXIgc2V0IGlzIG5vdCBiYXNlZCBvbiBJU08tNjQ2LiAgKi8KKyNlcnJvciAiZ3BlcmYgZ2VuZXJhdGVkIHRhYmxlcyBkb24ndCB3b3JrIHdpdGggdGhpcyBleGVjdXRpb24gY2hhcmFjdGVyIHNldC4gUGxlYXNlIHJlcG9ydCBhIGJ1ZyB0byA8YnVnLWdudS1ncGVyZkBnbnUub3JnPi4iCisjZW5kaWYKKworc3RydWN0IGtjb25mX2lkOworLyogbWF4aW11bSBrZXkgcmFuZ2UgPSA0NSwgZHVwbGljYXRlcyA9IDAgKi8KKworI2lmZGVmIF9fR05VQ19fCitfX2lubGluZQorI2Vsc2UKKyNpZmRlZiBfX2NwbHVzcGx1cworaW5saW5lCisjZW5kaWYKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludAora2NvbmZfaWRfaGFzaCAocmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuKQoreworICBzdGF0aWMgdW5zaWduZWQgY2hhciBhc3NvX3ZhbHVlc1tdID0KKyAgICB7CisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgMjUsIDEwLCAxNSwKKyAgICAgICAwLCAgMCwgIDUsIDQ3LCAgMCwgIDAsIDQ3LCA0NywgIDAsIDEwLAorICAgICAgIDAsIDIwLCAyMCwgMjAsICA1LCAgMCwgIDAsIDIwLCA0NywgNDcsCisgICAgICAyMCwgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcKKyAgICB9OworICByZWdpc3RlciBpbnQgaHZhbCA9IGxlbjsKKworICBzd2l0Y2ggKGh2YWwpCisgICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaHZhbCArPSBhc3NvX3ZhbHVlc1sodW5zaWduZWQgY2hhcilzdHJbMl1dOworICAgICAgLypGQUxMVEhST1VHSCovCisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDE6CisgICAgICAgIGh2YWwgKz0gYXNzb192YWx1ZXNbKHVuc2lnbmVkIGNoYXIpc3RyWzBdXTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gaHZhbDsKK30KKworc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdAorICB7CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjJbc2l6ZW9mKCJpZiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyM1tzaXplb2YoImludCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNFtzaXplb2YoImhlbHAiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjVbc2l6ZW9mKCJlbmRpZiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNltzaXplb2YoInNlbGVjdCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyN1tzaXplb2YoImVuZG1lbnUiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjhbc2l6ZW9mKCJ0cmlzdGF0ZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyOVtzaXplb2YoImVuZGNob2ljZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTBbc2l6ZW9mKCJyYW5nZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTFbc2l6ZW9mKCJzdHJpbmciKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjEyW3NpemVvZigiZGVmYXVsdCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTNbc2l6ZW9mKCJkZWZfYm9vbCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTRbc2l6ZW9mKCJtZW51IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxNltzaXplb2YoImRlZl9ib29sZWFuIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxN1tzaXplb2YoImRlZl90cmlzdGF0ZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMThbc2l6ZW9mKCJtYWlubWVudSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjBbc2l6ZW9mKCJtZW51Y29uZmlnIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyMVtzaXplb2YoImNvbmZpZyIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjJbc2l6ZW9mKCJvbiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjNbc2l6ZW9mKCJoZXgiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjI2W3NpemVvZigic291cmNlIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyN1tzaXplb2YoImRlcGVuZHMiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjI4W3NpemVvZigib3B0aW9uYWwiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjMxW3NpemVvZigiZW5hYmxlIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzMltzaXplb2YoImNvbW1lbnQiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjMzW3NpemVvZigicmVxdWlyZXMiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjM0W3NpemVvZigiYm9vbCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzdbc2l6ZW9mKCJib29sZWFuIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI0MVtzaXplb2YoImNob2ljZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDZbc2l6ZW9mKCJwcm9tcHQiKV07CisgIH07CitzdGF0aWMgc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCBrY29uZl9pZF9zdHJpbmdzX2NvbnRlbnRzID0KKyAgeworICAgICJpZiIsCisgICAgImludCIsCisgICAgImhlbHAiLAorICAgICJlbmRpZiIsCisgICAgInNlbGVjdCIsCisgICAgImVuZG1lbnUiLAorICAgICJ0cmlzdGF0ZSIsCisgICAgImVuZGNob2ljZSIsCisgICAgInJhbmdlIiwKKyAgICAic3RyaW5nIiwKKyAgICAiZGVmYXVsdCIsCisgICAgImRlZl9ib29sIiwKKyAgICAibWVudSIsCisgICAgImRlZl9ib29sZWFuIiwKKyAgICAiZGVmX3RyaXN0YXRlIiwKKyAgICAibWFpbm1lbnUiLAorICAgICJtZW51Y29uZmlnIiwKKyAgICAiY29uZmlnIiwKKyAgICAib24iLAorICAgICJoZXgiLAorICAgICJzb3VyY2UiLAorICAgICJkZXBlbmRzIiwKKyAgICAib3B0aW9uYWwiLAorICAgICJlbmFibGUiLAorICAgICJjb21tZW50IiwKKyAgICAicmVxdWlyZXMiLAorICAgICJib29sIiwKKyAgICAiYm9vbGVhbiIsCisgICAgImNob2ljZSIsCisgICAgInByb21wdCIKKyAgfTsKKyNkZWZpbmUga2NvbmZfaWRfc3RyaW5ncyAoKGNvbnN0IGNoYXIgKikgJmtjb25mX2lkX3N0cmluZ3NfY29udGVudHMpCisjaWZkZWYgX19HTlVDX18KK19faW5saW5lCisjZW5kaWYKK3N0cnVjdCBrY29uZl9pZCAqCitrY29uZl9pZF9sb29rdXAgKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgZW51bQorICAgIHsKKyAgICAgIFRPVEFMX0tFWVdPUkRTID0gMzAsCisgICAgICBNSU5fV09SRF9MRU5HVEggPSAyLAorICAgICAgTUFYX1dPUkRfTEVOR1RIID0gMTIsCisgICAgICBNSU5fSEFTSF9WQUxVRSA9IDIsCisgICAgICBNQVhfSEFTSF9WQUxVRSA9IDQ2CisgICAgfTsKKworICBzdGF0aWMgc3RydWN0IGtjb25mX2lkIHdvcmRsaXN0W10gPQorICAgIHsKKyAgICAgIHstMX0sIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMiwJCVRfSUYsCQlURl9DT01NQU5EfFRGX1BBUkFNfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzLAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19JTlR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQsCQlUX0hFTFAsCQlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI1LAkJVF9FTkRJRiwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNiwJCVRfU0VMRUNULAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI3LAlUX0VORE1FTlUsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjgsCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfVFJJU1RBVEV9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjksCVRfRU5EQ0hPSUNFLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxMCwJCVRfUkFOR0UsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjExLAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19TVFJJTkd9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjEyLAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfVU5LTk9XTn0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTMsCVRfREVGQVVMVCwJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxNCwJCVRfTUVOVSwJCVRGX0NPTU1BTkR9LAorICAgICAgey0xfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxNiwJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX0JPT0xFQU59LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE3LAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfVFJJU1RBVEV9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE4LAlUX01BSU5NRU5VLAlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjAsCVRfTUVOVUNPTkZJRywJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjEsCQlUX0NPTkZJRywJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjIsCQlUX09OLAkJVEZfUEFSQU19LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIzLAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19IRVh9LAorICAgICAgey0xfSwgey0xfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyNiwJCVRfU09VUkNFLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyNywJVF9ERVBFTkRTLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyOCwJVF9PUFRJT05BTCwJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LCB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMxLAkJVF9TRUxFQ1QsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMyLAlUX0NPTU1FTlQsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMzLAlUX1JFUVVJUkVTLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNCwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfQk9PTEVBTn0sCisgICAgICB7LTF9LCB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjM3LAlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0JPT0xFQU59LAorICAgICAgey0xfSwgey0xfSwgey0xfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI0MSwJCVRfQ0hPSUNFLAlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sIHstMX0sIHstMX0sIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDYsCQlUX1BST01QVCwJVEZfQ09NTUFORH0KKyAgICB9OworCisgIGlmIChsZW4gPD0gTUFYX1dPUkRfTEVOR1RIICYmIGxlbiA+PSBNSU5fV09SRF9MRU5HVEgpCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGtleSA9IGtjb25mX2lkX2hhc2ggKHN0ciwgbGVuKTsKKworICAgICAgaWYgKGtleSA8PSBNQVhfSEFTSF9WQUxVRSAmJiBrZXkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJlZ2lzdGVyIGludCBvID0gd29yZGxpc3Rba2V5XS5uYW1lOworICAgICAgICAgIGlmIChvID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBvICsga2NvbmZfaWRfc3RyaW5nczsKKworICAgICAgICAgICAgICBpZiAoKnN0ciA9PSAqcyAmJiAhc3RybmNtcCAoc3RyICsgMSwgcyArIDEsIGxlbiAtIDEpICYmIHNbbGVuXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIHJldHVybiAmd29yZGxpc3Rba2V5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvemNvbmYubCBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNThiODAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvemNvbmYubApAQCAtMCwwICsxLDM1NSBAQAorJW9wdGlvbiBiYWNrdXAgbm9zdGRpbml0IG5veXl3cmFwIG5ldmVyLWludGVyYWN0aXZlIGZ1bGwgZWNzCislb3B0aW9uIDhiaXQgYmFja3VwIG5vZGVmYXVsdCBwZXJmLXJlcG9ydCBwZXJmLXJlcG9ydAorJXggQ09NTUFORCBIRUxQIFNUUklORyBQQVJBTQorJXsKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBTVEFSVF9TVFJTSVpFCTE2CisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCBsaW5lbm87Cit9IGN1cnJlbnRfcG9zOworCitzdGF0aWMgY2hhciAqdGV4dDsKK3N0YXRpYyBpbnQgdGV4dF9zaXplLCB0ZXh0X2FzaXplOworCitzdHJ1Y3QgYnVmZmVyIHsKKyAgICAgICAgc3RydWN0IGJ1ZmZlciAqcGFyZW50OworICAgICAgICBZWV9CVUZGRVJfU1RBVEUgc3RhdGU7Cit9OworCitzdHJ1Y3QgYnVmZmVyICpjdXJyZW50X2J1ZjsKKworc3RhdGljIGludCBsYXN0X3RzLCBmaXJzdF90czsKKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKTsKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGZpbGUodm9pZCk7CisKK3ZvaWQgbmV3X3N0cmluZyh2b2lkKQoreworCXRleHQgPSBtYWxsb2MoU1RBUlRfU1RSU0laRSk7CisJdGV4dF9hc2l6ZSA9IFNUQVJUX1NUUlNJWkU7CisJdGV4dF9zaXplID0gMDsKKwkqdGV4dCA9IDA7Cit9CisKK3ZvaWQgYXBwZW5kX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzaXplKQoreworCWludCBuZXdfc2l6ZSA9IHRleHRfc2l6ZSArIHNpemUgKyAxOworCWlmIChzaXplID4gNzApIHsKKwkgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkIGVycm9yOiBPdmVybG9uZyBsaW5lXG4iLAorCQkJIGN1cnJlbnRfZmlsZS0+bmFtZSwgY3VycmVudF9maWxlLT5saW5lbm8pOworCX0KKwlpZiAobmV3X3NpemUgPiB0ZXh0X2FzaXplKSB7CisJCW5ld19zaXplICs9IFNUQVJUX1NUUlNJWkUgLSAxOworCQluZXdfc2l6ZSAmPSAtU1RBUlRfU1RSU0laRTsKKwkJdGV4dCA9IHJlYWxsb2ModGV4dCwgbmV3X3NpemUpOworCQl0ZXh0X2FzaXplID0gbmV3X3NpemU7CisJfQorCW1lbWNweSh0ZXh0ICsgdGV4dF9zaXplLCBzdHIsIHNpemUpOworCXRleHRfc2l6ZSArPSBzaXplOworCXRleHRbdGV4dF9zaXplXSA9IDA7Cit9CisKK3ZvaWQgYWxsb2Nfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJdGV4dCA9IG1hbGxvYyhzaXplICsgMSk7CisJbWVtY3B5KHRleHQsIHN0ciwgc2l6ZSk7CisJdGV4dFtzaXplXSA9IDA7Cit9CislfQorCit3cwlbIFxuXHRdCituCVtBLVphLXowLTlfXQorCislJQorCWludCBzdHIgPSAwOworCWludCB0cywgaTsKKworWyBcdF0qIy4qXG4JfAorWyBcdF0qXG4JeworCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJcmV0dXJuIFRfRU9MOworfQorWyBcdF0qIy4qCisKKworWyBcdF0rCXsKKwlCRUdJTihDT01NQU5EKTsKK30KKworLgl7CisJdW5wdXQoeXl0ZXh0WzBdKTsKKwlCRUdJTihDT01NQU5EKTsKK30KKworCis8Q09NTUFORD57CisJe259Kwl7CisJCXN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoeXl0ZXh0LCB5eWxlbmcpOworCQlCRUdJTihQQVJBTSk7CisJCWN1cnJlbnRfcG9zLmZpbGUgPSBjdXJyZW50X2ZpbGU7CisJCWN1cnJlbnRfcG9zLmxpbmVubyA9IGN1cnJlbnRfZmlsZS0+bGluZW5vOworCQlpZiAoaWQgJiYgaWQtPmZsYWdzICYgVEZfQ09NTUFORCkgeworCQkJemNvbmZsdmFsLmlkID0gaWQ7CisJCQlyZXR1cm4gaWQtPnRva2VuOworCQl9CisJCWFsbG9jX3N0cmluZyh5eXRleHQsIHl5bGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEOworCX0KKwkuCisJXG4JeworCQlCRUdJTihJTklUSUFMKTsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJcmV0dXJuIFRfRU9MOworCX0KK30KKworPFBBUkFNPnsKKwkiJiYiCXJldHVybiBUX0FORDsKKwkifHwiCXJldHVybiBUX09SOworCSIoIglyZXR1cm4gVF9PUEVOX1BBUkVOOworCSIpIglyZXR1cm4gVF9DTE9TRV9QQVJFTjsKKwkiISIJcmV0dXJuIFRfTk9UOworCSI9IglyZXR1cm4gVF9FUVVBTDsKKwkiIT0iCXJldHVybiBUX1VORVFVQUw7CisJXCJ8XCcJeworCQlzdHIgPSB5eXRleHRbMF07CisJCW5ld19zdHJpbmcoKTsKKwkJQkVHSU4oU1RSSU5HKTsKKwl9CisJXG4JQkVHSU4oSU5JVElBTCk7IGN1cnJlbnRfZmlsZS0+bGluZW5vKys7IHJldHVybiBUX0VPTDsKKwktLS0JLyogaWdub3JlICovCisJKHtufXxbLS8uXSkrCXsKKwkJc3RydWN0IGtjb25mX2lkICppZCA9IGtjb25mX2lkX2xvb2t1cCh5eXRleHQsIHl5bGVuZyk7CisJCWlmIChpZCAmJiBpZC0+ZmxhZ3MgJiBURl9QQVJBTSkgeworCQkJemNvbmZsdmFsLmlkID0gaWQ7CisJCQlyZXR1cm4gaWQtPnRva2VuOworCQl9CisJCWFsbG9jX3N0cmluZyh5eXRleHQsIHl5bGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEOworCX0KKwkjLioJLyogY29tbWVudCAqLworCVxcXG4JY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkuCisJPDxFT0Y+PiB7CisJCUJFR0lOKElOSVRJQUwpOworCX0KK30KKworPFNUUklORz57CisJW14nIlxcXG5dKy9cbgl7CisJCWFwcGVuZF9zdHJpbmcoeXl0ZXh0LCB5eWxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwl9CisJW14nIlxcXG5dKwl7CisJCWFwcGVuZF9zdHJpbmcoeXl0ZXh0LCB5eWxlbmcpOworCX0KKwlcXC4/L1xuCXsKKwkJYXBwZW5kX3N0cmluZyh5eXRleHQgKyAxLCB5eWxlbmcgLSAxKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJfQorCVxcLj8JeworCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCArIDEsIHl5bGVuZyAtIDEpOworCX0KKwlcJ3xcIgl7CisJCWlmIChzdHIgPT0geXl0ZXh0WzBdKSB7CisJCQlCRUdJTihQQVJBTSk7CisJCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJCX0gZWxzZQorCQkJYXBwZW5kX3N0cmluZyh5eXRleHQsIDEpOworCX0KKwlcbgl7CisJCXByaW50ZigiJXM6JWQ6d2FybmluZzogbXVsdGktbGluZSBzdHJpbmdzIG5vdCBzdXBwb3J0ZWRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQlCRUdJTihJTklUSUFMKTsKKwkJcmV0dXJuIFRfRU9MOworCX0KKwk8PEVPRj4+CXsKKwkJQkVHSU4oSU5JVElBTCk7CisJfQorfQorCis8SEVMUD57CisJWyBcdF0rCXsKKwkJdHMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgeXlsZW5nOyBpKyspIHsKKwkJCWlmICh5eXRleHRbaV0gPT0gJ1x0JykKKwkJCQl0cyA9ICh0cyAmIH43KSArIDg7CisJCQllbHNlCisJCQkJdHMrKzsKKwkJfQorCQlsYXN0X3RzID0gdHM7CisJCWlmIChmaXJzdF90cykgeworCQkJaWYgKHRzIDwgZmlyc3RfdHMpIHsKKwkJCQl6Y29uZl9lbmRoZWxwKCk7CisJCQkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJCQl9CisJCQl0cyAtPSBmaXJzdF90czsKKwkJCXdoaWxlICh0cyA+IDgpIHsKKwkJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIDgpOworCQkJCXRzIC09IDg7CisJCQl9CisJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIHRzKTsKKwkJfQorCX0KKwlbIFx0XSpcbi9bXiBcdFxuXSB7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorCVsgXHRdKlxuCXsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJYXBwZW5kX3N0cmluZygiXG4iLCAxKTsKKwl9CisJW14gXHRcbl0uKiB7CisJCWFwcGVuZF9zdHJpbmcoeXl0ZXh0LCB5eWxlbmcpOworCQlpZiAoIWZpcnN0X3RzKQorCQkJZmlyc3RfdHMgPSBsYXN0X3RzOworCX0KKwk8PEVPRj4+CXsKKwkJemNvbmZfZW5kaGVscCgpOworCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwl9Cit9CisKKzw8RU9GPj4JeworCWlmIChjdXJyZW50X2ZpbGUpIHsKKwkJemNvbmZfZW5kZmlsZSgpOworCQlyZXR1cm4gVF9FT0w7CisJfQorCWZjbG9zZSh5eWluKTsKKwl5eXRlcm1pbmF0ZSgpOworfQorCislJQordm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCkKK3sKKwluZXdfc3RyaW5nKCk7CisJbGFzdF90cyA9IGZpcnN0X3RzID0gMDsKKwlCRUdJTihIRUxQKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKQoreworCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCUJFR0lOKElOSVRJQUwpOworfQorCisKKy8qCisgKiBUcnkgdG8gb3BlbiBzcGVjaWZpZWQgZmlsZSB3aXRoIGZvbGxvd2luZyBuYW1lczoKKyAqIC4vbmFtZQorICogJChzcmN0cmVlKS9uYW1lCisgKiBUaGUgbGF0dGVyIGlzIHVzZWQgd2hlbiBzcmN0cmVlIGlzIHNlcGFyYXRlIGZyb20gb2JqdHJlZQorICogd2hlbiBjb21waWxpbmcgdGhlIGtlcm5lbC4KKyAqIFJldHVybiBOVUxMIGlmIGZpbGUgaXMgbm90IGZvdW5kLgorICovCitGSUxFICp6Y29uZl9mb3Blbihjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmVudjsKKwlGSUxFICpmOworCisJZiA9IGZvcGVuKG5hbWUsICJyIik7CisJaWYgKCFmICYmIG5hbWVbMF0gIT0gJy8nKSB7CisJCWVudiA9IGdldGVudihTUkNUUkVFKTsKKwkJaWYgKGVudikgeworCQkJY2hhciAqZnVsbG5hbWUgPSBhbGxvY2Eoc3RybGVuKGVudikgKyBzdHJsZW4obmFtZSkgKyAyKTsKKwkJCXNwcmludGYoZnVsbG5hbWUsICIlcy8lcyIsIGVudiwgbmFtZSk7CisJCQlmID0gZm9wZW4oZnVsbG5hbWUsICJyIik7CisJCX0KKwl9CisJcmV0dXJuIGY7Cit9CisKK3ZvaWQgemNvbmZfaW5pdHNjYW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwl5eWluID0gemNvbmZfZm9wZW4obmFtZSk7CisJaWYgKCF5eWluKSB7CisJCXByaW50ZigiY2FuJ3QgZmluZCBmaWxlICVzXG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwljdXJyZW50X2J1ZiA9IG1hbGxvYyhzaXplb2YoKmN1cnJlbnRfYnVmKSk7CisJbWVtc2V0KGN1cnJlbnRfYnVmLCAwLCBzaXplb2YoKmN1cnJlbnRfYnVmKSk7CisKKwljdXJyZW50X2ZpbGUgPSBmaWxlX2xvb2t1cChuYW1lKTsKKwljdXJyZW50X2ZpbGUtPmxpbmVubyA9IDE7CisJY3VycmVudF9maWxlLT5mbGFncyA9IEZJTEVfQlVTWTsKK30KKwordm9pZCB6Y29uZl9uZXh0ZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJc3RydWN0IGJ1ZmZlciAqYnVmID0gbWFsbG9jKHNpemVvZigqYnVmKSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKworCWN1cnJlbnRfYnVmLT5zdGF0ZSA9IFlZX0NVUlJFTlRfQlVGRkVSOworCXl5aW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwlpZiAoIXl5aW4pIHsKKwkJcHJpbnRmKCIlczolZDogY2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCXl5X3N3aXRjaF90b19idWZmZXIoeXlfY3JlYXRlX2J1ZmZlcih5eWluLCBZWV9CVUZfU0laRSkpOworCWJ1Zi0+cGFyZW50ID0gY3VycmVudF9idWY7CisJY3VycmVudF9idWYgPSBidWY7CisKKwlpZiAoZmlsZS0+ZmxhZ3MgJiBGSUxFX0JVU1kpIHsKKwkJcHJpbnRmKCJyZWN1cnNpdmUgc2NhbiAoJXMpP1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChmaWxlLT5mbGFncyAmIEZJTEVfU0NBTk5FRCkgeworCQlwcmludGYoImZpbGUgJXMgYWxyZWFkeSBzY2FubmVkP1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWZpbGUtPmZsYWdzIHw9IEZJTEVfQlVTWTsKKwlmaWxlLT5saW5lbm8gPSAxOworCWZpbGUtPnBhcmVudCA9IGN1cnJlbnRfZmlsZTsKKwljdXJyZW50X2ZpbGUgPSBmaWxlOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9lbmRmaWxlKHZvaWQpCit7CisJc3RydWN0IGJ1ZmZlciAqcGFyZW50OworCisJY3VycmVudF9maWxlLT5mbGFncyB8PSBGSUxFX1NDQU5ORUQ7CisJY3VycmVudF9maWxlLT5mbGFncyAmPSB+RklMRV9CVVNZOworCWN1cnJlbnRfZmlsZSA9IGN1cnJlbnRfZmlsZS0+cGFyZW50OworCisJcGFyZW50ID0gY3VycmVudF9idWYtPnBhcmVudDsKKwlpZiAocGFyZW50KSB7CisJCWZjbG9zZSh5eWluKTsKKwkJeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUik7CisJCXl5X3N3aXRjaF90b19idWZmZXIocGFyZW50LT5zdGF0ZSk7CisJfQorCWZyZWUoY3VycmVudF9idWYpOworCWN1cnJlbnRfYnVmID0gcGFyZW50OworfQorCitpbnQgemNvbmZfbGluZW5vKHZvaWQpCit7CisJcmV0dXJuIGN1cnJlbnRfcG9zLmxpbmVubzsKK30KKworY2hhciAqemNvbmZfY3VybmFtZSh2b2lkKQoreworCXJldHVybiBjdXJyZW50X3Bvcy5maWxlID8gY3VycmVudF9wb3MuZmlsZS0+bmFtZSA6ICI8bm9uZT4iOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjdkMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKQEAgLTAsMCArMSwyMTcxIEBACisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi4wLiAgKi8KKworLyogU2tlbGV0b24gcGFyc2VyIGZvciBZYWNjLWxpa2UgcGFyc2luZyB3aXRoIEJpc29uLAorICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQorICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KKyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCisKKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgb3JpZ2luYWwgc28gY2FsbGVkCisgICBgYHNlbWFudGljJycgcGFyc2VyLiAgKi8KKworLyogQWxsIHN5bWJvbHMgZGVmaW5lZCBiZWxvdyBzaG91bGQgYmVnaW4gd2l0aCB5eSBvciBZWSwgdG8gYXZvaWQKKyAgIGluZnJpbmdpbmcgb24gdXNlciBuYW1lIHNwYWNlLiAgVGhpcyBzaG91bGQgYmUgZG9uZSBldmVuIGZvciBsb2NhbAorICAgdmFyaWFibGVzLCBhcyB0aGV5IG1pZ2h0IG90aGVyd2lzZSBiZSBleHBhbmRlZCBieSB1c2VyIG1hY3Jvcy4KKyAgIFRoZXJlIGFyZSBzb21lIHVuYXZvaWRhYmxlIGV4Y2VwdGlvbnMgd2l0aGluIGluY2x1ZGUgZmlsZXMgdG8KKyAgIGRlZmluZSBuZWNlc3NhcnkgbGlicmFyeSBzeW1ib2xzOyB0aGV5IGFyZSBub3RlZCAiSU5GUklOR0VTIE9OCisgICBVU0VSIE5BTUUgU1BBQ0UiIGJlbG93LiAgKi8KKworLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KKyNkZWZpbmUgWVlCSVNPTiAxCisKKy8qIFNrZWxldG9uIG5hbWUuICAqLworI2RlZmluZSBZWVNLRUxFVE9OX05BTUUgInlhY2MuYyIKKworLyogUHVyZSBwYXJzZXJzLiAgKi8KKyNkZWZpbmUgWVlQVVJFIDAKKworLyogVXNpbmcgbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgWVlMU1BfTkVFREVEIDAKKworLyogU3Vic3RpdHV0ZSB0aGUgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIG5hbWVzLiAgKi8KKyNkZWZpbmUgeXlwYXJzZSB6Y29uZnBhcnNlCisjZGVmaW5lIHl5bGV4ICAgemNvbmZsZXgKKyNkZWZpbmUgeXllcnJvciB6Y29uZmVycm9yCisjZGVmaW5lIHl5bHZhbCAgemNvbmZsdmFsCisjZGVmaW5lIHl5Y2hhciAgemNvbmZjaGFyCisjZGVmaW5lIHl5ZGVidWcgemNvbmZkZWJ1ZworI2RlZmluZSB5eW5lcnJzIHpjb25mbmVycnMKKworCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBUX01BSU5NRU5VID0gMjU4LAorICAgICBUX01FTlUgPSAyNTksCisgICAgIFRfRU5ETUVOVSA9IDI2MCwKKyAgICAgVF9TT1VSQ0UgPSAyNjEsCisgICAgIFRfQ0hPSUNFID0gMjYyLAorICAgICBUX0VORENIT0lDRSA9IDI2MywKKyAgICAgVF9DT01NRU5UID0gMjY0LAorICAgICBUX0NPTkZJRyA9IDI2NSwKKyAgICAgVF9NRU5VQ09ORklHID0gMjY2LAorICAgICBUX0hFTFAgPSAyNjcsCisgICAgIFRfSEVMUFRFWFQgPSAyNjgsCisgICAgIFRfSUYgPSAyNjksCisgICAgIFRfRU5ESUYgPSAyNzAsCisgICAgIFRfREVQRU5EUyA9IDI3MSwKKyAgICAgVF9SRVFVSVJFUyA9IDI3MiwKKyAgICAgVF9PUFRJT05BTCA9IDI3MywKKyAgICAgVF9QUk9NUFQgPSAyNzQsCisgICAgIFRfVFlQRSA9IDI3NSwKKyAgICAgVF9ERUZBVUxUID0gMjc2LAorICAgICBUX1NFTEVDVCA9IDI3NywKKyAgICAgVF9SQU5HRSA9IDI3OCwKKyAgICAgVF9PTiA9IDI3OSwKKyAgICAgVF9XT1JEID0gMjgwLAorICAgICBUX1dPUkRfUVVPVEUgPSAyODEsCisgICAgIFRfVU5FUVVBTCA9IDI4MiwKKyAgICAgVF9DTE9TRV9QQVJFTiA9IDI4MywKKyAgICAgVF9PUEVOX1BBUkVOID0gMjg0LAorICAgICBUX0VPTCA9IDI4NSwKKyAgICAgVF9PUiA9IDI4NiwKKyAgICAgVF9BTkQgPSAyODcsCisgICAgIFRfRVFVQUwgPSAyODgsCisgICAgIFRfTk9UID0gMjg5CisgICB9OworI2VuZGlmCisjZGVmaW5lIFRfTUFJTk1FTlUgMjU4CisjZGVmaW5lIFRfTUVOVSAyNTkKKyNkZWZpbmUgVF9FTkRNRU5VIDI2MAorI2RlZmluZSBUX1NPVVJDRSAyNjEKKyNkZWZpbmUgVF9DSE9JQ0UgMjYyCisjZGVmaW5lIFRfRU5EQ0hPSUNFIDI2MworI2RlZmluZSBUX0NPTU1FTlQgMjY0CisjZGVmaW5lIFRfQ09ORklHIDI2NQorI2RlZmluZSBUX01FTlVDT05GSUcgMjY2CisjZGVmaW5lIFRfSEVMUCAyNjcKKyNkZWZpbmUgVF9IRUxQVEVYVCAyNjgKKyNkZWZpbmUgVF9JRiAyNjkKKyNkZWZpbmUgVF9FTkRJRiAyNzAKKyNkZWZpbmUgVF9ERVBFTkRTIDI3MQorI2RlZmluZSBUX1JFUVVJUkVTIDI3MgorI2RlZmluZSBUX09QVElPTkFMIDI3MworI2RlZmluZSBUX1BST01QVCAyNzQKKyNkZWZpbmUgVF9UWVBFIDI3NQorI2RlZmluZSBUX0RFRkFVTFQgMjc2CisjZGVmaW5lIFRfU0VMRUNUIDI3NworI2RlZmluZSBUX1JBTkdFIDI3OAorI2RlZmluZSBUX09OIDI3OQorI2RlZmluZSBUX1dPUkQgMjgwCisjZGVmaW5lIFRfV09SRF9RVU9URSAyODEKKyNkZWZpbmUgVF9VTkVRVUFMIDI4MgorI2RlZmluZSBUX0NMT1NFX1BBUkVOIDI4MworI2RlZmluZSBUX09QRU5fUEFSRU4gMjg0CisjZGVmaW5lIFRfRU9MIDI4NQorI2RlZmluZSBUX09SIDI4NgorI2RlZmluZSBUX0FORCAyODcKKyNkZWZpbmUgVF9FUVVBTCAyODgKKyNkZWZpbmUgVF9OT1QgMjg5CisKKworCisKKy8qIENvcHkgdGhlIGZpcnN0IHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLworCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworI2luY2x1ZGUgInpjb25mLmhhc2guYyIKKworI2RlZmluZSBwcmludGQobWFzaywgZm10Li4uKSBpZiAoY2RlYnVnICYgKG1hc2spKSBwcmludGYoZm10KQorCisjZGVmaW5lIFBSSU5URAkJMHgwMDAxCisjZGVmaW5lIERFQlVHX1BBUlNFCTB4MDAwMgorCitpbnQgY2RlYnVnID0gUFJJTlREOworCitleHRlcm4gaW50IHpjb25mbGV4KHZvaWQpOworc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLik7CitzdGF0aWMgdm9pZCB6Y29uZl9lcnJvcihjb25zdCBjaGFyICplcnIsIC4uLik7CitzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycik7CitzdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihzdHJ1Y3Qga2NvbmZfaWQgKmlkLCBpbnQgc3RhcnR0b2tlbiwgaW50IGVuZHRva2VuKTsKKworc3RydWN0IHN5bWJvbCAqc3ltYm9sX2hhc2hbMjU3XTsKKworc3RhdGljIHN0cnVjdCBtZW51ICpjdXJyZW50X21lbnUsICpjdXJyZW50X2VudHJ5OworCisjZGVmaW5lIFlZREVCVUcgMAorI2lmIFlZREVCVUcKKyNkZWZpbmUgWVlFUlJPUl9WRVJCT1NFCisjZW5kaWYKKworCisvKiBFbmFibGluZyB0cmFjZXMuICAqLworI2lmbmRlZiBZWURFQlVHCisjIGRlZmluZSBZWURFQlVHIDAKKyNlbmRpZgorCisvKiBFbmFibGluZyB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzLiAgKi8KKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyMgdW5kZWYgWVlFUlJPUl9WRVJCT1NFCisjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMQorI2Vsc2UKKyMgZGVmaW5lIFlZRVJST1JfVkVSQk9TRSAwCisjZW5kaWYKKworI2lmICEgZGVmaW5lZCAoWVlTVFlQRSkgJiYgISBkZWZpbmVkIChZWVNUWVBFX0lTX0RFQ0xBUkVEKQorCit0eXBlZGVmIHVuaW9uIFlZU1RZUEUgeworCWNoYXIgKnN0cmluZzsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJc3RydWN0IGtjb25mX2lkICppZDsKK30gWVlTVFlQRTsKKy8qIExpbmUgMTkwIG9mIHlhY2MuYy4gICovCisKKyMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KKyMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQorIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKKyNlbmRpZgorCisKKworLyogQ29weSB0aGUgc2Vjb25kIHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLworCisKKy8qIExpbmUgMjEzIG9mIHlhY2MuYy4gICovCisKKworI2lmICEgZGVmaW5lZCAoeXlvdmVyZmxvdykgfHwgWVlFUlJPUl9WRVJCT1NFCisKKyMgaWZuZGVmIFlZRlJFRQorIyAgZGVmaW5lIFlZRlJFRSBmcmVlCisjIGVuZGlmCisjIGlmbmRlZiBZWU1BTExPQworIyAgZGVmaW5lIFlZTUFMTE9DIG1hbGxvYworIyBlbmRpZgorCisvKiBUaGUgcGFyc2VyIGludm9rZXMgYWxsb2NhIG9yIG1hbGxvYzsgZGVmaW5lIHRoZSBuZWNlc3Nhcnkgc3ltYm9scy4gICovCisKKyMgaWZkZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICBpZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyMgICBpZmRlZiBfX0dOVUNfXworIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2J1aWx0aW5fYWxsb2NhCisjICAgZWxzZQorIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBhbGxvY2EKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBZWVNUQUNLX0FMTE9DCisgICAvKiBQYWNpZnkgR0NDJ3MgYGVtcHR5IGlmLWJvZHknIHdhcm5pbmcuICovCisjICBkZWZpbmUgWVlTVEFDS19GUkVFKFB0cikgZG8geyAvKiBlbXB0eSAqLzsgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorIyAgZW5kaWYKKyMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIFlZTUFMTE9DCisjICBkZWZpbmUgWVlTVEFDS19GUkVFIFlZRlJFRQorIyBlbmRpZgorI2VuZGlmIC8qICEgZGVmaW5lZCAoeXlvdmVyZmxvdykgfHwgWVlFUlJPUl9WRVJCT1NFICovCisKKworI2lmICghIGRlZmluZWQgKHl5b3ZlcmZsb3cpIFwKKyAgICAgJiYgKCEgZGVmaW5lZCAoX19jcGx1c3BsdXMpIFwKKwkgfHwgKGRlZmluZWQgKFlZU1RZUEVfSVNfVFJJVklBTCkgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisKKy8qIEEgdHlwZSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGFueSBzdGFjayBtZW1iZXIuICAqLwordW5pb24geXlhbGxvYworeworICBzaG9ydCBpbnQgeXlzczsKKyAgWVlTVFlQRSB5eXZzOworICB9OworCisvKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLworIyBkZWZpbmUgWVlTVEFDS19HQVBfTUFYSU1VTSAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCisKKy8qIFRoZSBzaXplIG9mIGFuIGFycmF5IGxhcmdlIHRvIGVub3VnaCB0byBob2xkIGFsbCBzdGFja3MsIGVhY2ggd2l0aAorICAgTiBlbGVtZW50cy4gICovCisjIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKKyAgICAgKChOKSAqIChzaXplb2YgKHNob3J0IGludCkgKyBzaXplb2YgKFlZU1RZUEUpKQkJCVwKKyAgICAgICsgWVlTVEFDS19HQVBfTUFYSU1VTSkKKworLyogQ29weSBDT1VOVCBvYmplY3RzIGZyb20gRlJPTSB0byBUTy4gIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvCisgICBub3Qgb3ZlcmxhcC4gICovCisjIGlmbmRlZiBZWUNPUFkKKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAxIDwgX19HTlVDX18KKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAorICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAorICAgICAgZG8JCQkJCVwKKwl7CQkJCQlcCisJICByZWdpc3RlciBZWVNJWkVfVCB5eWk7CQlcCisJICBmb3IgKHl5aSA9IDA7IHl5aSA8IChDb3VudCk7IHl5aSsrKQlcCisJICAgIChUbylbeXlpXSA9IChGcm9tKVt5eWldOwkJXAorCX0JCQkJCVwKKyAgICAgIHdoaWxlICgwKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogUmVsb2NhdGUgU1RBQ0sgZnJvbSBpdHMgb2xkIGxvY2F0aW9uIHRvIHRoZSBuZXcgb25lLiAgVGhlCisgICBsb2NhbCB2YXJpYWJsZXMgWVlTSVpFIGFuZCBZWVNUQUNLU0laRSBnaXZlIHRoZSBvbGQgYW5kIG5ldyBudW1iZXIgb2YKKyAgIGVsZW1lbnRzIGluIHRoZSBzdGFjaywgYW5kIFlZUFRSIGdpdmVzIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlCisgICBzdGFjay4gIEFkdmFuY2UgWVlQVFIgdG8gYSBwcm9wZXJseSBhbGlnbmVkIGxvY2F0aW9uIGZvciB0aGUgbmV4dAorICAgc3RhY2suICAqLworIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFjaykJCQkJCVwKKyAgICBkbwkJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCisJWVlDT1BZICgmeXlwdHItPlN0YWNrLCBTdGFjaywgeXlzaXplKTsJCQkJXAorCVN0YWNrID0gJnl5cHRyLT5TdGFjazsJCQkJCQlcCisJeXluZXdieXRlcyA9IHl5c3RhY2tzaXplICogc2l6ZW9mICgqU3RhY2spICsgWVlTVEFDS19HQVBfTUFYSU1VTTsgXAorCXl5cHRyICs9IHl5bmV3Ynl0ZXMgLyBzaXplb2YgKCp5eXB0cik7CQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgd2hpbGUgKDApCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorICAgdHlwZWRlZiBzaWduZWQgY2hhciB5eXNpZ25lZF9jaGFyOworI2Vsc2UKKyAgIHR5cGVkZWYgc2hvcnQgaW50IHl5c2lnbmVkX2NoYXI7CisjZW5kaWYKKworLyogWVlGSU5BTCAtLSBTdGF0ZSBudW1iZXIgb2YgdGhlIHRlcm1pbmF0aW9uIHN0YXRlLiAqLworI2RlZmluZSBZWUZJTkFMICAzCisvKiBZWUxBU1QgLS0gTGFzdCBpbmRleCBpbiBZWVRBQkxFLiAgKi8KKyNkZWZpbmUgWVlMQVNUICAgMjY0CisKKy8qIFlZTlRPS0VOUyAtLSBOdW1iZXIgb2YgdGVybWluYWxzLiAqLworI2RlZmluZSBZWU5UT0tFTlMgIDM1CisvKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gKi8KKyNkZWZpbmUgWVlOTlRTICA0MgorLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHJ1bGVzLiAqLworI2RlZmluZSBZWU5SVUxFUyAgMTA0CisvKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2Ygc3RhdGVzLiAqLworI2RlZmluZSBZWU5TVEFURVMgIDE3NQorCisvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KKyNkZWZpbmUgWVlVTkRFRlRPSyAgMgorI2RlZmluZSBZWU1BWFVUT0sgICAyODkKKworI2RlZmluZSBZWVRSQU5TTEFURShZWVgpIAkJCQkJCVwKKyAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQorCisvKiBZWVRSQU5TTEFURVtZWUxFWF0gLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5dHJhbnNsYXRlW10gPQoreworICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwKKyAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsCisgICAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNAorfTsKKworI2lmIFlZREVCVUcKKy8qIFlZUFJIU1tZWU5dIC0tIEluZGV4IG9mIHRoZSBmaXJzdCBSSFMgc3ltYm9sIG9mIHJ1bGUgbnVtYmVyIFlZTiBpbgorICAgWVlSSFMuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCB5eXByaHNbXSA9Cit7CisgICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgNSwgICAgIDYsICAgICA5LCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAyMywKKyAgICAgIDI4LCAgICAzMywgICAgMzcsICAgIDM5LCAgICA0MSwgICAgNDMsICAgIDQ1LCAgICA0NywgICAgNDksICAgIDUxLAorICAgICAgNTMsICAgIDU1LCAgICA1NywgICAgNTksICAgIDYxLCAgICA2MywgICAgNjcsICAgIDcwLCAgICA3NCwgICAgNzcsCisgICAgICA4MSwgICAgODQsICAgIDg1LCAgICA4OCwgICAgOTEsICAgIDk0LCAgICA5NywgICAxMDAsICAgMTA0LCAgIDEwOSwKKyAgICAgMTE0LCAgIDExOSwgICAxMjUsICAgMTI4LCAgIDEzMSwgICAxMzMsICAgMTM3LCAgIDEzOCwgICAxNDEsICAgMTQ0LAorICAgICAxNDcsICAgMTUwLCAgIDE1MywgICAxNTgsICAgMTYyLCAgIDE2NSwgICAxNzAsICAgMTcxLCAgIDE3NCwgICAxNzgsCisgICAgIDE4MCwgICAxODQsICAgMTg1LCAgIDE4OCwgICAxOTEsICAgMTk0LCAgIDE5OCwgICAyMDEsICAgMjAzLCAgIDIwNywKKyAgICAgMjA4LCAgIDIxMSwgICAyMTQsICAgMjE3LCAgIDIyMSwgICAyMjUsICAgMjI4LCAgIDIzMSwgICAyMzQsICAgMjM1LAorICAgICAyMzgsICAgMjQxLCAgIDI0NCwgICAyNDksICAgMjUzLCAgIDI1NywgICAyNTgsICAgMjYxLCAgIDI2MywgICAyNjUsCisgICAgIDI2OCwgICAyNzEsICAgMjc0LCAgIDI3NiwgICAyNzksICAgMjgwLCAgIDI4MywgICAyODUsICAgMjg5LCAgIDI5MywKKyAgICAgMjk3LCAgIDMwMCwgICAzMDQsICAgMzA4LCAgIDMxMAorfTsKKworLyogWVlSSFMgLS0gQSBgLTEnLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBydWxlcycgUkhTLiAqLworc3RhdGljIGNvbnN0IHl5c2lnbmVkX2NoYXIgeXlyaHNbXSA9Cit7CisgICAgICAzNiwgICAgIDAsICAgIC0xLCAgICAzNywgICAgLTEsICAgIC0xLCAgICAzNywgICAgMzksICAgIC0xLCAgICAzNywKKyAgICAgIDUwLCAgICAtMSwgICAgMzcsICAgIDYxLCAgICAtMSwgICAgMzcsICAgICAzLCAgICA3MSwgICAgNzMsICAgIC0xLAorICAgICAgMzcsICAgIDcyLCAgICAtMSwgICAgMzcsICAgIDI1LCAgICAgMSwgICAgMzAsICAgIC0xLCAgICAzNywgICAgMzgsCisgICAgICAgMSwgICAgMzAsICAgIC0xLCAgICAzNywgICAgIDEsICAgIDMwLCAgICAtMSwgICAgMTYsICAgIC0xLCAgICAxOSwKKyAgICAgIC0xLCAgICAyMCwgICAgLTEsICAgIDIyLCAgICAtMSwgICAgMTgsICAgIC0xLCAgICAyMywgICAgLTEsICAgIDIxLAorICAgICAgLTEsICAgIDMwLCAgICAtMSwgICAgNTYsICAgIC0xLCAgICA2NSwgICAgLTEsICAgIDQyLCAgICAtMSwgICAgNDQsCisgICAgICAtMSwgICAgNjMsICAgIC0xLCAgICAyNSwgICAgIDEsICAgIDMwLCAgICAtMSwgICAgIDEsICAgIDMwLCAgICAtMSwKKyAgICAgIDEwLCAgICAyNSwgICAgMzAsICAgIC0xLCAgICA0MSwgICAgNDUsICAgIC0xLCAgICAxMSwgICAgMjUsICAgIDMwLAorICAgICAgLTEsICAgIDQzLCAgICA0NSwgICAgLTEsICAgIC0xLCAgICA0NSwgICAgNDYsICAgIC0xLCAgICA0NSwgICAgNjksCisgICAgICAtMSwgICAgNDUsICAgIDY3LCAgICAtMSwgICAgNDUsICAgIDQwLCAgICAtMSwgICAgNDUsICAgIDMwLCAgICAtMSwKKyAgICAgIDIwLCAgICA3MCwgICAgMzAsICAgIC0xLCAgICAxOSwgICAgNzEsICAgIDc0LCAgICAzMCwgICAgLTEsICAgIDIxLAorICAgICAgNzUsICAgIDc0LCAgICAzMCwgICAgLTEsICAgIDIyLCAgICAyNSwgICAgNzQsICAgIDMwLCAgICAtMSwgICAgMjMsCisgICAgICA3NiwgICAgNzYsICAgIDc0LCAgICAzMCwgICAgLTEsICAgICA3LCAgICAzMCwgICAgLTEsICAgIDQ3LCAgICA1MSwKKyAgICAgIC0xLCAgICA3MiwgICAgLTEsICAgIDQ4LCAgICA1MywgICAgNDksICAgIC0xLCAgICAtMSwgICAgNTEsICAgIDUyLAorICAgICAgLTEsICAgIDUxLCAgICA2OSwgICAgLTEsICAgIDUxLCAgICA2NywgICAgLTEsICAgIDUxLCAgICAzMCwgICAgLTEsCisgICAgICA1MSwgICAgNDAsICAgIC0xLCAgICAxOSwgICAgNzEsICAgIDc0LCAgICAzMCwgICAgLTEsICAgIDIwLCAgICA3MCwKKyAgICAgIDMwLCAgICAtMSwgICAgMTgsICAgIDMwLCAgICAtMSwgICAgMjEsICAgIDI1LCAgICA3NCwgICAgMzAsICAgIC0xLAorICAgICAgLTEsICAgIDUzLCAgICAzOSwgICAgLTEsICAgIDE0LCAgICA3NSwgICAgNzMsICAgIC0xLCAgICA3MiwgICAgLTEsCisgICAgICA1NCwgICAgNTcsICAgIDU1LCAgICAtMSwgICAgLTEsICAgIDU3LCAgICAzOSwgICAgLTEsICAgIDU3LCAgICA2MSwKKyAgICAgIC0xLCAgICA1NywgICAgNTAsICAgIC0xLCAgICAgNCwgICAgNzEsICAgIDMwLCAgICAtMSwgICAgNTgsICAgIDY4LAorICAgICAgLTEsICAgIDcyLCAgICAtMSwgICAgNTksICAgIDYyLCAgICA2MCwgICAgLTEsICAgIC0xLCAgICA2MiwgICAgMzksCisgICAgICAtMSwgICAgNjIsICAgIDYxLCAgICAtMSwgICAgNjIsICAgIDUwLCAgICAtMSwgICAgIDYsICAgIDcxLCAgICAzMCwKKyAgICAgIC0xLCAgICAgOSwgICAgNzEsICAgIDMwLCAgICAtMSwgICAgNjQsICAgIDY4LCAgICAtMSwgICAgMTIsICAgIDMwLAorICAgICAgLTEsICAgIDY2LCAgICAxMywgICAgLTEsICAgIC0xLCAgICA2OCwgICAgNjksICAgIC0xLCAgICA2OCwgICAgMzAsCisgICAgICAtMSwgICAgNjgsICAgIDQwLCAgICAtMSwgICAgMTYsICAgIDI0LCAgICA3NSwgICAgMzAsICAgIC0xLCAgICAxNiwKKyAgICAgIDc1LCAgICAzMCwgICAgLTEsICAgIDE3LCAgICA3NSwgICAgMzAsICAgIC0xLCAgICAtMSwgICAgNzEsICAgIDc0LAorICAgICAgLTEsICAgIDI1LCAgICAtMSwgICAgMjYsICAgIC0xLCAgICAgNSwgICAgMzAsICAgIC0xLCAgICAgOCwgICAgMzAsCisgICAgICAtMSwgICAgMTUsICAgIDMwLCAgICAtMSwgICAgMzAsICAgIC0xLCAgICA3MywgICAgMzAsICAgIC0xLCAgICAtMSwKKyAgICAgIDE0LCAgICA3NSwgICAgLTEsICAgIDc2LCAgICAtMSwgICAgNzYsICAgIDMzLCAgICA3NiwgICAgLTEsICAgIDc2LAorICAgICAgMjcsICAgIDc2LCAgICAtMSwgICAgMjksICAgIDc1LCAgICAyOCwgICAgLTEsICAgIDM0LCAgICA3NSwgICAgLTEsCisgICAgICA3NSwgICAgMzEsICAgIDc1LCAgICAtMSwgICAgNzUsICAgIDMyLCAgICA3NSwgICAgLTEsICAgIDI1LCAgICAtMSwKKyAgICAgIDI2LCAgICAtMQorfTsKKworLyogWVlSTElORVtZWU5dIC0tIHNvdXJjZSBsaW5lIHdoZXJlIHJ1bGUgbnVtYmVyIFlZTiB3YXMgZGVmaW5lZC4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW50IHl5cmxpbmVbXSA9Cit7CisgICAgICAgMCwgICAxMDMsICAgMTAzLCAgIDEwNSwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwKKyAgICAgMTEzLCAgIDExNywgICAxMjEsICAgMTIxLCAgIDEyMSwgICAxMjEsICAgMTIxLCAgIDEyMSwgICAxMjEsICAgMTI1LAorICAgICAxMjYsICAgMTI3LCAgIDEyOCwgICAxMjksICAgMTMwLCAgIDEzNCwgICAxMzUsICAgMTQxLCAgIDE0OSwgICAxNTUsCisgICAgIDE2MywgICAxNzMsICAgMTc1LCAgIDE3NiwgICAxNzcsICAgMTc4LCAgIDE3OSwgICAxODIsICAgMTkwLCAgIDE5NiwKKyAgICAgMjA2LCAgIDIxMiwgICAyMjAsICAgMjI5LCAgIDIzNCwgICAyNDIsICAgMjQ1LCAgIDI0NywgICAyNDgsICAgMjQ5LAorICAgICAyNTAsICAgMjUxLCAgIDI1NCwgICAyNjAsICAgMjcxLCAgIDI3NywgICAyODcsICAgMjg5LCAgIDI5NCwgICAzMDIsCisgICAgIDMxMCwgICAzMTMsICAgMzE1LCAgIDMxNiwgICAzMTcsICAgMzIyLCAgIDMyOSwgICAzMzQsICAgMzQyLCAgIDM0NSwKKyAgICAgMzQ3LCAgIDM0OCwgICAzNDksICAgMzUyLCAgIDM2MCwgICAzNjcsICAgMzc0LCAgIDM4MCwgICAzODcsICAgMzg5LAorICAgICAzOTAsICAgMzkxLCAgIDM5NCwgICAzOTksICAgNDA0LCAgIDQxMiwgICA0MTQsICAgNDE5LCAgIDQyMCwgICA0MjMsCisgICAgIDQyNCwgICA0MjUsICAgNDI5LCAgIDQzMCwgICA0MzMsICAgNDM0LCAgIDQzNywgICA0MzgsICAgNDM5LCAgIDQ0MCwKKyAgICAgNDQxLCAgIDQ0MiwgICA0NDMsICAgNDQ2LCAgIDQ0NworfTsKKyNlbmRpZgorCisjaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UKKy8qIFlZVE5NRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCisgICBGaXJzdCwgdGhlIHRlcm1pbmFscywgdGhlbiwgc3RhcnRpbmcgYXQgWVlOVE9LRU5TLCBub250ZXJtaW5hbHMuICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KK3sKKyAgIiRlbmQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZCIsICJUX01BSU5NRU5VIiwgIlRfTUVOVSIsICJUX0VORE1FTlUiLAorICAiVF9TT1VSQ0UiLCAiVF9DSE9JQ0UiLCAiVF9FTkRDSE9JQ0UiLCAiVF9DT01NRU5UIiwgIlRfQ09ORklHIiwKKyAgIlRfTUVOVUNPTkZJRyIsICJUX0hFTFAiLCAiVF9IRUxQVEVYVCIsICJUX0lGIiwgIlRfRU5ESUYiLCAiVF9ERVBFTkRTIiwKKyAgIlRfUkVRVUlSRVMiLCAiVF9PUFRJT05BTCIsICJUX1BST01QVCIsICJUX1RZUEUiLCAiVF9ERUZBVUxUIiwKKyAgIlRfU0VMRUNUIiwgIlRfUkFOR0UiLCAiVF9PTiIsICJUX1dPUkQiLCAiVF9XT1JEX1FVT1RFIiwgIlRfVU5FUVVBTCIsCisgICJUX0NMT1NFX1BBUkVOIiwgIlRfT1BFTl9QQVJFTiIsICJUX0VPTCIsICJUX09SIiwgIlRfQU5EIiwgIlRfRVFVQUwiLAorICAiVF9OT1QiLCAiJGFjY2VwdCIsICJpbnB1dCIsICJzdG10X2xpc3QiLCAib3B0aW9uX25hbWUiLCAiY29tbW9uX3N0bXQiLAorICAib3B0aW9uX2Vycm9yIiwgImNvbmZpZ19lbnRyeV9zdGFydCIsICJjb25maWdfc3RtdCIsCisgICJtZW51Y29uZmlnX2VudHJ5X3N0YXJ0IiwgIm1lbnVjb25maWdfc3RtdCIsICJjb25maWdfb3B0aW9uX2xpc3QiLAorICAiY29uZmlnX29wdGlvbiIsICJjaG9pY2UiLCAiY2hvaWNlX2VudHJ5IiwgImNob2ljZV9lbmQiLCAiY2hvaWNlX3N0bXQiLAorICAiY2hvaWNlX29wdGlvbl9saXN0IiwgImNob2ljZV9vcHRpb24iLCAiY2hvaWNlX2Jsb2NrIiwgImlmX2VudHJ5IiwKKyAgImlmX2VuZCIsICJpZl9zdG10IiwgImlmX2Jsb2NrIiwgIm1lbnUiLCAibWVudV9lbnRyeSIsICJtZW51X2VuZCIsCisgICJtZW51X3N0bXQiLCAibWVudV9ibG9jayIsICJzb3VyY2Vfc3RtdCIsICJjb21tZW50IiwgImNvbW1lbnRfc3RtdCIsCisgICJoZWxwX3N0YXJ0IiwgImhlbHAiLCAiZGVwZW5kc19saXN0IiwgImRlcGVuZHMiLCAicHJvbXB0X3N0bXRfb3B0IiwKKyAgInByb21wdCIsICJlbmQiLCAibmwiLCAiaWZfZXhwciIsICJleHByIiwgInN5bWJvbCIsIDAKK307CisjZW5kaWYKKworIyBpZmRlZiBZWVBSSU5UCisvKiBZWVRPS05VTVtZWUxFWC1OVU1dIC0tIEludGVybmFsIHRva2VuIG51bWJlciBjb3JyZXNwb25kaW5nIHRvCisgICB0b2tlbiBZWUxFWC1OVU0uICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCB5eXRva251bVtdID0KK3sKKyAgICAgICAwLCAgIDI1NiwgICAyNTcsICAgMjU4LCAgIDI1OSwgICAyNjAsICAgMjYxLCAgIDI2MiwgICAyNjMsICAgMjY0LAorICAgICAyNjUsICAgMjY2LCAgIDI2NywgICAyNjgsICAgMjY5LCAgIDI3MCwgICAyNzEsICAgMjcyLCAgIDI3MywgICAyNzQsCisgICAgIDI3NSwgICAyNzYsICAgMjc3LCAgIDI3OCwgICAyNzksICAgMjgwLCAgIDI4MSwgICAyODIsICAgMjgzLCAgIDI4NCwKKyAgICAgMjg1LCAgIDI4NiwgICAyODcsICAgMjg4LCAgIDI4OQorfTsKKyMgZW5kaWYKKworLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eXIxW10gPQoreworICAgICAgIDAsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM3LCAgICAzNywgICAgMzcsICAgIDM3LCAgICAzNywgICAgMzcsCisgICAgICAzNywgICAgMzcsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOSwKKyAgICAgIDM5LCAgICAzOSwgICAgMzksICAgIDM5LCAgICAzOSwgICAgNDAsICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLAorICAgICAgNDQsICAgIDQ1LCAgICA0NSwgICAgNDUsICAgIDQ1LCAgICA0NSwgICAgNDUsICAgIDQ2LCAgICA0NiwgICAgNDYsCisgICAgICA0NiwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTEsICAgIDUxLCAgICA1MSwKKyAgICAgIDUxLCAgICA1MSwgICAgNTIsICAgIDUyLCAgICA1MiwgICAgNTIsICAgIDUzLCAgICA1MywgICAgNTQsICAgIDU1LAorICAgICAgNTYsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsCisgICAgICA2MiwgICAgNjIsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OCwKKyAgICAgIDY4LCAgICA2OCwgICAgNjksICAgIDY5LCAgICA2OSwgICAgNzAsICAgIDcwLCAgICA3MSwgICAgNzEsICAgIDcyLAorICAgICAgNzIsICAgIDcyLCAgICA3MywgICAgNzMsICAgIDc0LCAgICA3NCwgICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzUsCisgICAgICA3NSwgICAgNzUsICAgIDc1LCAgICA3NiwgICAgNzYKK307CisKKy8qIFlZUjJbWVlOXSAtLSBOdW1iZXIgb2Ygc3ltYm9scyBjb21wb3NpbmcgcmlnaHQgaGFuZCBzaWRlIG9mIHJ1bGUgWVlOLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5cjJbXSA9Cit7CisgICAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgNCwKKyAgICAgICA0LCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDMsCisgICAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNCwKKyAgICAgICA0LCAgICAgNSwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDMsICAgICAyLCAgICAgNCwgICAgIDAsICAgICAyLCAgICAgMywgICAgIDEsCisgICAgICAgMywgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMCwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDAsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywKKyAgICAgICAyLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMQorfTsKKworLyogWVlERUZBQ1RbU1RBVEUtTkFNRV0gLS0gRGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlCisgICBTVEFURS1OVU0gd2hlbiBZWVRBQkxFIGRvZXNuJ3Qgc3BlY2lmeSBzb21ldGhpbmcgZWxzZSB0byBkby4gIFplcm8KKyAgIG1lYW5zIHRoZSBkZWZhdWx0IGlzIGFuIGVycm9yLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5ZGVmYWN0W10gPQoreworICAgICAgIDMsICAgICAwLCAgICAgMCwgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxMiwgICAgMTYsICAgIDEzLCAgICAxNCwKKyAgICAgIDE4LCAgICAxNSwgICAgMTcsICAgICAwLCAgICAxOSwgICAgIDAsICAgICA0LCAgICAzMSwgICAgMjIsICAgIDMxLAorICAgICAgMjMsICAgIDQ2LCAgICA1NiwgICAgIDUsICAgIDYxLCAgICAyMCwgICAgNzgsICAgIDY5LCAgICAgNiwgICAgMjQsCisgICAgICA3OCwgICAgMjEsICAgICA4LCAgICAxMSwgICAgODcsICAgIDg4LCAgICAgMCwgICAgIDAsICAgIDg5LCAgICAgMCwKKyAgICAgIDQyLCAgICA5MCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxMDMsICAgMTA0LCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgOTYsICAgIDkxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgIDkyLCAgICAgNywgICAgNjUsICAgIDczLCAgICA3NCwgICAgMjcsICAgIDI5LCAgICAgMCwKKyAgICAgMTAwLCAgICAgMCwgICAgIDAsICAgIDU4LCAgICAgMCwgICAgIDAsICAgICA5LCAgICAxMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgODUsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAzNiwgICAgMzUsCisgICAgICAzMiwgICAgIDAsICAgIDM0LCAgICAzMywgICAgIDAsICAgICAwLCAgICA4NSwgICAgIDAsICAgIDUwLCAgICA1MSwKKyAgICAgIDQ3LCAgICA0OSwgICAgNDgsICAgIDU3LCAgICA0NSwgICAgNDQsICAgIDYyLCAgICA2NCwgICAgNjAsICAgIDYzLAorICAgICAgNTksICAgIDgwLCAgICA4MSwgICAgNzksICAgIDcwLCAgICA3MiwgICAgNjgsICAgIDcxLCAgICA2NywgICAgOTMsCisgICAgICA5OSwgICAxMDEsICAgMTAyLCAgICA5OCwgICAgOTcsICAgIDI2LCAgICA3NiwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgIDk0LCAgICAgMCwgICAgOTQsICAgIDk0LCAgICA5NCwgICAgIDAsICAgICAwLCAgICA3NywgICAgNTQsICAgIDk0LAorICAgICAgIDAsICAgIDk0LCAgICAgMCwgICAgODMsICAgIDg0LCAgICAgMCwgICAgIDAsICAgIDM3LCAgICA4NiwgICAgIDAsCisgICAgICAgMCwgICAgOTQsICAgIDI1LCAgICAgMCwgICAgNTMsICAgICAwLCAgICA4MiwgICAgOTUsICAgIDM4LCAgICAzOSwKKyAgICAgIDQwLCAgICAgMCwgICAgNTIsICAgIDU1LCAgICA0MQorfTsKKworLyogWVlERUZHT1RPW05URVJNLU5VTV0uICovCitzdGF0aWMgY29uc3Qgc2hvcnQgaW50IHl5ZGVmZ290b1tdID0KK3sKKyAgICAgIC0xLCAgICAgMSwgICAgIDIsICAgIDI1LCAgICAyNiwgICAgOTksICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLAorICAgICAgNjQsICAgMTAwLCAgICAzMSwgICAgMzIsICAgMTE0LCAgICAzMywgICAgNjYsICAgMTEwLCAgICA2NywgICAgMzQsCisgICAgIDExOCwgICAgMzUsICAgIDY4LCAgICAzNiwgICAgMzcsICAgMTI2LCAgICAzOCwgICAgNzAsICAgIDM5LCAgICA0MCwKKyAgICAgIDQxLCAgIDEwMSwgICAxMDIsICAgIDY5LCAgIDEwMywgICAxNDEsICAgMTQyLCAgICA0MiwgICAgNzMsICAgMTU2LAorICAgICAgNTksICAgIDYwCit9OworCisvKiBZWVBBQ1RbU1RBVEUtTlVNXSAtLSBJbmRleCBpbiBZWVRBQkxFIG9mIHRoZSBwb3J0aW9uIGRlc2NyaWJpbmcKKyAgIFNUQVRFLU5VTS4gICovCisjZGVmaW5lIFlZUEFDVF9OSU5GIC03OAorc3RhdGljIGNvbnN0IHNob3J0IGludCB5eXBhY3RbXSA9Cit7CisgICAgIC03OCwgICAgIDIsICAgMTU5LCAgIC03OCwgICAtMjEsICAgICAwLCAgICAgMCwgICAtMTIsICAgICAwLCAgICAgMSwKKyAgICAgICA0LCAgICAgMCwgICAgMjcsICAgIDM4LCAgICA2MCwgICAgNTgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LAorICAgICAtNzgsICAgLTc4LCAgIC03OCwgICAxMDAsICAgLTc4LCAgIDEwNCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCisgICAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwKKyAgICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgIDg2LCAgIDExMywgICAtNzgsICAgMTE0LAorICAgICAtNzgsICAgLTc4LCAgIDEyNSwgICAxMjcsICAgMTI4LCAgIC03OCwgICAtNzgsICAgIDYwLCAgICA2MCwgICAyMTAsCisgICAgICA2NSwgICAtNzgsICAgMTQxLCAgIDE0MiwgICAgMzksICAgMTAzLCAgIDE4MiwgICAyMDAsICAgICA2LCAgICA2NiwKKyAgICAgICA2LCAgIDEzMSwgICAtNzgsICAgMTQ2LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgMTk2LAorICAgICAtNzgsICAgIDYwLCAgICA2MCwgICAxNDYsICAgIDQwLCAgICA0MCwgICAtNzgsICAgLTc4LCAgIDE1NSwgICAxNTYsCisgICAgICAtMiwgICAgNjAsICAgICAwLCAgICAgMCwgICAgNjAsICAgMTA1LCAgICA0MCwgICAxOTQsICAgLTc4LCAgIC03OCwKKyAgICAgLTc4LCAgIDIwNiwgICAtNzgsICAgLTc4LCAgIDE4MywgICAgIDAsICAgICAwLCAgIDE5NSwgICAtNzgsICAgLTc4LAorICAgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCisgICAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwKKyAgICAgLTc4LCAgIDE5NywgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgICA2MCwgICAyMTMsICAgMjE2LAorICAgICAyMTIsICAgMjAzLCAgIDIxMiwgICAxOTAsICAgMjEyLCAgICA0MCwgICAyMDgsICAgLTc4LCAgIC03OCwgICAyMTIsCisgICAgIDIyMiwgICAyMTIsICAgMjE5LCAgIC03OCwgICAtNzgsICAgIDYwLCAgIDIyMywgICAtNzgsICAgLTc4LCAgIDIyNCwKKyAgICAgMjI1LCAgIDIxMiwgICAtNzgsICAgMjI2LCAgIC03OCwgICAyMjcsICAgLTc4LCAgICA0NywgICAtNzgsICAgLTc4LAorICAgICAtNzgsICAgMjI4LCAgIC03OCwgICAtNzgsICAgLTc4Cit9OworCisvKiBZWVBHT1RPW05URVJNLU5VTV0uICAqLworc3RhdGljIGNvbnN0IHNob3J0IGludCB5eXBnb3RvW10gPQoreworICAgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgMTY0LCAgIC0zNiwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCisgICAgIDIzMCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgIDI5LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwKKyAgICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgIDU5LCAgIC03OCwgICAtNzgsICAgLTc4LAorICAgICAtNzgsICAgLTc4LCAgIDE5OCwgICAyMjAsICAgIDI0LCAgIDE1NywgICAgLTUsICAgMTY5LCAgIDIwMiwgICAgNzQsCisgICAgIC01MywgICAtNzcKK307CisKKy8qIFlZVEFCTEVbWVlQQUNUW1NUQVRFLU5VTV1dLiAgV2hhdCB0byBkbyBpbiBzdGF0ZSBTVEFURS1OVU0uICBJZgorICAgcG9zaXRpdmUsIHNoaWZ0IHRoYXQgdG9rZW4uICBJZiBuZWdhdGl2ZSwgcmVkdWNlIHRoZSBydWxlIHdoaWNoCisgICBudW1iZXIgaXMgdGhlIG9wcG9zaXRlLiAgSWYgemVybywgZG8gd2hhdCBZWURFRkFDVCBzYXlzLgorICAgSWYgWVlUQUJMRV9OSU5GLCBzeW50YXggZXJyb3IuICAqLworI2RlZmluZSBZWVRBQkxFX05JTkYgLTc2CitzdGF0aWMgY29uc3Qgc2hvcnQgaW50IHl5dGFibGVbXSA9Cit7CisgICAgICA0NiwgICAgNDcsICAgICAzLCAgICA0OSwgICAgNzksICAgIDgwLCAgICA1MiwgICAxMzMsICAgMTM0LCAgICA0MywKKyAgICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgNDgsICAgMTQ1LAorICAgICAgMTQsICAgIDE1LCAgIDEzNywgICAgNTUsICAgIDU2LCAgICA0NCwgICAgNDUsICAgIDU3LCAgIDEzMSwgICAxMzIsCisgICAgIDEwOSwgICAgNTAsICAgIDU4LCAgIDEyMiwgICAgNTEsICAgMTIyLCAgICAyNCwgICAxMzgsICAgMTM5LCAgIC0yOCwKKyAgICAgIDg4LCAgIDE0MywgICAtMjgsICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LAorICAgICAtMjgsICAgIDg5LCAgICA1MywgICAtMjgsICAgLTI4LCAgICA5MCwgICAgOTEsICAgLTI4LCAgICA5MiwgICAgOTMsCisgICAgICA5NCwgICAgOTUsICAgIDk2LCAgICA1NCwgICAgOTcsICAgIDU1LCAgICA1NiwgICAgODgsICAgMTYxLCAgICA5OCwKKyAgICAgLTY2LCAgIC02NiwgICAtNjYsICAgLTY2LCAgIC02NiwgICAtNjYsICAgLTY2LCAgIC02NiwgICAgODEsICAgIDgyLAorICAgICAtNjYsICAgLTY2LCAgICA5MCwgICAgOTEsICAgMTUyLCAgICA1NSwgICAgNTYsICAgMTQwLCAgICA2MSwgICAgNTcsCisgICAgIDExMiwgICAgOTcsICAgIDg0LCAgIDEyMywgICAgNTgsICAgMTIzLCAgIDEyMSwgICAxMTcsICAgIDg1LCAgIDEyNSwKKyAgICAgMTQ5LCAgICA2MiwgICAxNjcsICAgLTMwLCAgICA4OCwgICAgNjMsICAgLTMwLCAgIC0zMCwgICAtMzAsICAgLTMwLAorICAgICAtMzAsICAgLTMwLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgICA4OSwgICAgNzIsICAgLTMwLCAgIC0zMCwgICAgOTAsCisgICAgICA5MSwgICAtMzAsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAxMTksICAgIDk3LCAgIDEyNywKKyAgICAgMTQ0LCAgIC03NSwgICAgODgsICAgIDk4LCAgIC03NSwgICAtNzUsICAgLTc1LCAgIC03NSwgICAtNzUsICAgLTc1LAorICAgICAtNzUsICAgLTc1LCAgIC03NSwgICAgNzQsICAgIDc1LCAgIC03NSwgICAtNzUsICAgIDkwLCAgICA5MSwgICAtNzUsCisgICAgIC03NSwgICAtNzUsICAgLTc1LCAgIC03NSwgICAtNzUsICAgIDc2LCAgICA5NywgICAgNzcsICAgIDc4LCAgICAtMiwKKyAgICAgICA0LCAgIDEyMSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAorICAgICAgMTMsICAgIDg2LCAgICA4NywgICAgMTQsICAgIDE1LCAgICAxNiwgICAxMjksICAgIDE3LCAgICAxOCwgICAgMTksCisgICAgICAyMCwgICAgMjEsICAgIDIyLCAgICA4OCwgICAgMjMsICAgMTM1LCAgIDEzNiwgICAtNDMsICAgLTQzLCAgICAyNCwKKyAgICAgLTQzLCAgIC00MywgICAtNDMsICAgLTQzLCAgICA4OSwgICAxNDYsICAgLTQzLCAgIC00MywgICAgOTAsICAgIDkxLAorICAgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxMDcsICAgMTU1LCAgICAgNywgICAgIDgsICAgIDk3LCAgICAxMCwgICAgMTEsCisgICAgICAxMiwgICAgMTMsICAgMTA4LCAgIDE0OCwgICAgMTQsICAgIDE1LCAgIDE1OCwgICAxNTksICAgMTYwLCAgIDE0NywKKyAgICAgMTUxLCAgICA4MSwgICAgODIsICAgMTYzLCAgIDEzMCwgICAxNjUsICAgMTU1LCAgICA4MSwgICAgODIsICAgIDgyLAorICAgICAgMjQsICAgMTEzLCAgIDExNiwgICAxNTcsICAgMTI0LCAgIDE3MSwgICAxMTUsICAgMTIwLCAgIDE2MiwgICAxMjgsCisgICAgICA3MiwgICAgODEsICAgIDgyLCAgIDE1MywgICAgODEsICAgIDgyLCAgIDE1NCwgICAgODEsICAgIDgyLCAgIDE2NiwKKyAgICAgIDgxLCAgICA4MiwgICAxNjQsICAgMTY4LCAgIDE2OSwgICAxNzAsICAgMTcyLCAgIDE3MywgICAxNzQsICAgIDY1LAorICAgICAgNzEsICAgIDgzLCAgICAgMCwgICAxNTAsICAgMTExCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgaW50IHl5Y2hlY2tbXSA9Cit7CisgICAgICAgNSwgICAgIDYsICAgICAwLCAgICAgOCwgICAgNTcsICAgIDU4LCAgICAxMSwgICAgODQsICAgIDg1LCAgICAzMCwKKyAgICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMzAsICAgIDk2LAorICAgICAgMTQsICAgIDE1LCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNSwgICAgMjYsICAgIDI5LCAgICA4MSwgICAgODIsCisgICAgICA2NiwgICAgMzAsICAgIDM0LCAgICA2OSwgICAgMzAsICAgIDcxLCAgICAzMCwgICAgOTAsICAgIDkxLCAgICAgMCwKKyAgICAgICAxLCAgICA5NCwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgICAgMTEsICAgIDEyLCAgICAyNSwgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsCisgICAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNSwgICAgMjUsICAgIDI1LCAgICAyNiwgICAgIDEsICAgMTQ1LCAgICAzMCwKKyAgICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMzEsICAgIDMyLAorICAgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgMTM3LCAgICAyNSwgICAgMjYsICAgIDkyLCAgICAzMCwgICAgMjksCisgICAgICA2NiwgICAgMjUsICAgIDI3LCAgICA2OSwgICAgMzQsICAgIDcxLCAgICAzMCwgICAgNjgsICAgIDMzLCAgICA3MCwKKyAgICAgMTA1LCAgICAgMSwgICAxNTUsICAgICAwLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LAorICAgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMzAsICAgIDE0LCAgICAxNSwgICAgMTYsCisgICAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgNjgsICAgIDI1LCAgICA3MCwKKyAgICAgIDI1LCAgICAgMCwgICAgIDEsICAgIDMwLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICAgIDksICAgIDEwLCAgICAxMSwgICAgMzAsICAgIDMwLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsCisgICAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDMwLCAgICAyNSwgICAgMzAsICAgIDMwLCAgICAgMCwKKyAgICAgICAxLCAgICAzMCwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgICAgMTEsICAgIDMwLCAgICAzMCwgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMzAsICAgIDE4LCAgICAxOSwgICAgMjAsCisgICAgICAyMSwgICAgMjIsICAgIDIzLCAgICAgMSwgICAgMjUsICAgIDMwLCAgICAzMCwgICAgIDUsICAgICA2LCAgICAzMCwKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgIDEsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDE0LCAgICAgNSwgICAgIDYsICAgIDI1LCAgICAgOCwgICAgIDksCisgICAgICAxMCwgICAgMTEsICAgIDMwLCAgICAzMCwgICAgMTQsICAgIDE1LCAgIDE0MiwgICAxNDMsICAgMTQ0LCAgICAxMywKKyAgICAgIDI1LCAgICAzMSwgICAgMzIsICAgMTQ5LCAgICAyOCwgICAxNTEsICAgIDE0LCAgICAzMSwgICAgMzIsICAgIDMyLAorICAgICAgMzAsICAgIDY3LCAgICA2OCwgICAgMzAsICAgIDcwLCAgIDE2MSwgICAgNjcsICAgIDY4LCAgICAzMCwgICAgNzAsCisgICAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMCwKKyAgICAgIDMxLCAgICAzMiwgICAgMzAsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDI5LAorICAgICAgNDAsICAgIDU5LCAgICAtMSwgICAxMDYsICAgIDY2Cit9OworCisvKiBZWVNUT1NbU1RBVEUtTlVNXSAtLSBUaGUgKGludGVybmFsIG51bWJlciBvZiB0aGUpIGFjY2Vzc2luZworICAgc3ltYm9sIG9mIHN0YXRlIFNUQVRFLU5VTS4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eXN0b3NbXSA9Cit7CisgICAgICAgMCwgICAgMzYsICAgIDM3LCAgICAgMCwgICAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjUsICAgIDMwLCAgICAzOCwgICAgMzksICAgIDQxLCAgICA0MiwgICAgNDMsCisgICAgICA0NCwgICAgNDcsICAgIDQ4LCAgICA1MCwgICAgNTQsICAgIDU2LCAgICA1OCwgICAgNTksICAgIDYxLCAgICA2MywKKyAgICAgIDY0LCAgICA2NSwgICAgNzIsICAgIDMwLCAgICAyNSwgICAgMjYsICAgIDcxLCAgICA3MSwgICAgMzAsICAgIDcxLAorICAgICAgMzAsICAgIDMwLCAgICA3MSwgICAgMjUsICAgIDI1LCAgICAyNSwgICAgMjYsICAgIDI5LCAgICAzNCwgICAgNzUsCisgICAgICA3NiwgICAgMzAsICAgICAxLCAgICAgMSwgICAgNDUsICAgIDQ1LCAgICA1MSwgICAgNTMsICAgIDU3LCAgICA2OCwKKyAgICAgIDYyLCAgICA2OCwgICAgMzAsICAgIDczLCAgICAzMCwgICAgMzAsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDc1LAorICAgICAgNzUsICAgIDMxLCAgICAzMiwgICAgNzMsICAgIDI3LCAgICAzMywgICAgMzAsICAgIDMwLCAgICAgMSwgICAgMTIsCisgICAgICAxNiwgICAgMTcsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjUsICAgIDMwLCAgICA0MCwKKyAgICAgIDQ2LCAgICA2NiwgICAgNjcsICAgIDY5LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMzAsICAgIDQwLAorICAgICAgNTIsICAgIDY3LCAgICA2OSwgICAgMzksICAgIDQ5LCAgICA3MiwgICAgMzksICAgIDUwLCAgICA1NSwgICAgNjEsCisgICAgICA3MiwgICAgMzAsICAgIDQwLCAgICA2OSwgICAgMzksICAgIDUwLCAgICA2MCwgICAgNjEsICAgIDcyLCAgICAzMCwKKyAgICAgIDI4LCAgICA3NSwgICAgNzUsICAgIDc2LCAgICA3NiwgICAgMzAsICAgIDMwLCAgICAyNCwgICAgNzUsICAgIDc1LAorICAgICAgNzEsICAgIDcwLCAgICA3MSwgICAgNzUsICAgIDI1LCAgICA3NiwgICAgIDEsICAgIDEzLCAgICAzMCwgICAgNzEsCisgICAgICA3MCwgICAgMjUsICAgIDc1LCAgICAzMCwgICAgMzAsICAgIDE0LCAgICA3NCwgICAgMzAsICAgIDc0LCAgICA3NCwKKyAgICAgIDc0LCAgICA3NiwgICAgMzAsICAgIDc0LCAgICAzMCwgICAgNzQsICAgIDMwLCAgICA3NSwgICAgMzAsICAgIDMwLAorICAgICAgMzAsICAgIDc0LCAgICAzMCwgICAgMzAsICAgIDMwCit9OworCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkgJiYgZGVmaW5lZCAoX19TSVpFX1RZUEVfXykKKyMgZGVmaW5lIFlZU0laRV9UIF9fU0laRV9UWVBFX18KKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKHNpemVfdCkKKyMgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkKKyMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorIyAgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZW5kaWYKKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpCisjIGRlZmluZSBZWVNJWkVfVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCisjZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKKyNkZWZpbmUgWVlFTVBUWQkJKC0yKQorI2RlZmluZSBZWUVPRgkJMAorCisjZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKKyNkZWZpbmUgWVlBQk9SVAkJZ290byB5eWFib3J0bGFiCisjZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJvcmxhYgorCisKKy8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLiAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkKKyAgIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCisgICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCisKKyNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCisKKyNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQorCisjZGVmaW5lIFlZQkFDS1VQKFRva2VuLCBWYWx1ZSkJCQkJCVwKK2RvCQkJCQkJCQlcCisgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCisgICAgICB5eWx2YWwgPSAoVmFsdWUpOwkJCQkJCVwKKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAorICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCisgICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCVwKKyAgICB7IAkJCQkJCQkJXAorICAgICAgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTtcCisgICAgICBZWUVSUk9SOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJXAord2hpbGUgKDApCisKKworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworCisvKiBZWUxMT0NfREVGQVVMVCAtLSBTZXQgQ1VSUkVOVCB0byBzcGFuIGZyb20gUkhTWzFdIHRvIFJIU1tOXS4KKyAgIElmIE4gaXMgMCwgdGhlbiBzZXQgQ1VSUkVOVCB0byB0aGUgZW1wdHkgbG9jYXRpb24gd2hpY2ggZW5kcworICAgdGhlIHByZXZpb3VzIHN5bWJvbDogUkhTWzBdIChhbHdheXMgZGVmaW5lZCkuICAqLworCisjZGVmaW5lIFlZUkhTTE9DKFJocywgSykgKChSaHMpW0tdKQorI2lmbmRlZiBZWUxMT0NfREVGQVVMVAorIyBkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICBpZiAoTikJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gWVlSSFNMT0MgKFJocywgMSkuZmlyc3RfbGluZTsJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2NvbHVtbjsJXAorCSAgKEN1cnJlbnQpLmxhc3RfbGluZSAgICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfbGluZTsJCVwKKwkgIChDdXJyZW50KS5sYXN0X2NvbHVtbiAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2NvbHVtbjsJXAorCX0JCQkJCQkJCVwKKyAgICAgIGVsc2UJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gKEN1cnJlbnQpLmxhc3RfbGluZSAgID0JCVwKKwkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9saW5lOwkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gKEN1cnJlbnQpLmxhc3RfY29sdW1uID0JCVwKKwkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9jb2x1bW47CQkJCVwKKwl9CQkJCQkJCQlcCisgICAgd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBZWV9MT0NBVElPTl9QUklOVCAtLSBQcmludCB0aGUgbG9jYXRpb24gb24gdGhlIHN0cmVhbS4KKyAgIFRoaXMgbWFjcm8gd2FzIG5vdCBtYW5kYXRlZCBvcmlnaW5hbGx5OiBkZWZpbmUgb25seSBpZiB3ZSBrbm93CisgICB3ZSB3b24ndCBicmVhayB1c2VyIGNvZGU6IHdoZW4gdGhlc2UgYXJlIHRoZSBsb2NhdGlvbnMgd2Uga25vdy4gICovCisKKyNpZm5kZWYgWVlfTE9DQVRJT05fUFJJTlQKKyMgaWYgWVlMVFlQRV9JU19UUklWSUFMCisjICBkZWZpbmUgWVlfTE9DQVRJT05fUFJJTlQoRmlsZSwgTG9jKQkJCVwKKyAgICAgZnByaW50ZiAoRmlsZSwgIiVkLiVkLSVkLiVkIiwJCQlcCisgICAgICAgICAgICAgIChMb2MpLmZpcnN0X2xpbmUsIChMb2MpLmZpcnN0X2NvbHVtbiwJXAorICAgICAgICAgICAgICAoTG9jKS5sYXN0X2xpbmUsICAoTG9jKS5sYXN0X2NvbHVtbikKKyMgZWxzZQorIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCisKKyNpZmRlZiBZWUxFWF9QQVJBTQorIyBkZWZpbmUgWVlMRVggeXlsZXggKFlZTEVYX1BBUkFNKQorI2Vsc2UKKyMgZGVmaW5lIFlZTEVYIHl5bGV4ICgpCisjZW5kaWYKKworLyogRW5hYmxlIGRlYnVnZ2luZyBpZiByZXF1ZXN0ZWQuICAqLworI2lmIFlZREVCVUcKKworIyBpZm5kZWYgWVlGUFJJTlRGCisjICBpbmNsdWRlIDxzdGRpby5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlGUFJJTlRGIGZwcmludGYKKyMgZW5kaWYKKworIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCQkJXAorZG8gewkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQlcCisgICAgWVlGUFJJTlRGIEFyZ3M7CQkJCVwKK30gd2hpbGUgKDApCisKKyMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQkJXAorZG8gewkJCQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQlcCisgICAgICB5eXN5bXByaW50IChzdGRlcnIsIAkJCQkJXAorICAgICAgICAgICAgICAgICAgVHlwZSwgVmFsdWUpOwlcCisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CQkJCQlcCisgICAgfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5X3N0YWNrX3ByaW50IC0tIFByaW50IHRoZSBzdGF0ZSBzdGFjayBmcm9tIGl0cyBCT1RUT00gdXAgdG8gaXRzIHwKK3wgVE9QIChpbmNsdWRlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitzdGF0aWMgdm9pZAoreXlfc3RhY2tfcHJpbnQgKHNob3J0IGludCAqYm90dG9tLCBzaG9ydCBpbnQgKnRvcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfc3RhY2tfcHJpbnQgKGJvdHRvbSwgdG9wKQorICAgIHNob3J0IGludCAqYm90dG9tOworICAgIHNob3J0IGludCAqdG9wOworI2VuZGlmCit7CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7CisgIGZvciAoLyogTm90aGluZy4gKi87IGJvdHRvbSA8PSB0b3A7ICsrYm90dG9tKQorICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKmJvdHRvbSk7CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKK30KKworIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKKyAgICB5eV9zdGFja19wcmludCAoKEJvdHRvbSksIChUb3ApKTsJCQkJXAorfSB3aGlsZSAoMCkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUmVwb3J0IHRoYXQgdGhlIFlZUlVMRSBpcyBnb2luZyB0byBiZSByZWR1Y2VkLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitzdGF0aWMgdm9pZAoreXlfcmVkdWNlX3ByaW50IChpbnQgeXlydWxlKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eV9yZWR1Y2VfcHJpbnQgKHl5cnVsZSkKKyAgICBpbnQgeXlydWxlOworI2VuZGlmCit7CisgIGludCB5eWk7CisgIHVuc2lnbmVkIGludCB5eWxubyA9IHl5cmxpbmVbeXlydWxlXTsKKyAgWVlGUFJJTlRGIChzdGRlcnIsICJSZWR1Y2luZyBzdGFjayBieSBydWxlICVkIChsaW5lICV1KSwgIiwKKyAgICAgICAgICAgICB5eXJ1bGUgLSAxLCB5eWxubyk7CisgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICBmb3IgKHl5aSA9IHl5cHJoc1t5eXJ1bGVdOyAwIDw9IHl5cmhzW3l5aV07IHl5aSsrKQorICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZSBbeXlyaHNbeXlpXV0pOworICBZWUZQUklOVEYgKHN0ZGVyciwgIi0+ICVzXG4iLCB5eXRuYW1lIFt5eXIxW3l5cnVsZV1dKTsKK30KKworIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCQlcCitkbyB7CQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQlcCisgICAgeXlfcmVkdWNlX3ByaW50IChSdWxlKTsJCVwKK30gd2hpbGUgKDApCisKKy8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdAorICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCitpbnQgeXlkZWJ1ZzsKKyNlbHNlIC8qICFZWURFQlVHICovCisjIGRlZmluZSBZWURQUklOVEYoQXJncykKKyMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQorIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCisjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkKKyNlbmRpZiAvKiAhWVlERUJVRyAqLworCisKKy8qIFlZSU5JVERFUFRIIC0tIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzLiAgKi8KKyNpZm5kZWYJWVlJTklUREVQVEgKKyMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAorI2VuZGlmCisKKy8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5CisgICBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4KKworICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKKyAgIFNJWkVfTUFYIDwgWVlTVEFDS19CWVRFUyAoWVlNQVhERVBUSCkKKyAgIGV2YWx1YXRlZCB3aXRoIGluZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuICAqLworCisjaWZuZGVmIFlZTUFYREVQVEgKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKKyNlbmRpZgorCisMCisKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKworIyBpZm5kZWYgeXlzdHJsZW4KKyMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKQorIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KKyMgIGVsc2UKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFlZU1RSLiAgKi8KK3N0YXRpYyBZWVNJWkVfVAorIyAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3l5c3RybGVuIChjb25zdCBjaGFyICp5eXN0cikKKyMgICBlbHNlCit5eXN0cmxlbiAoeXlzdHIpCisgICAgIGNvbnN0IGNoYXIgKnl5c3RyOworIyAgIGVuZGlmCit7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3RyOworCisgIHdoaWxlICgqeXlzKysgIT0gJ1wwJykKKyAgICBjb250aW51ZTsKKworICByZXR1cm4geXlzIC0geXlzdHIgLSAxOworfQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgeXlzdHBjcHkKKyMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKSAmJiBkZWZpbmVkIChfR05VX1NPVVJDRSkKKyMgICBkZWZpbmUgeXlzdHBjcHkgc3RwY3B5CisjICBlbHNlCisvKiBDb3B5IFlZU1JDIHRvIFlZREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluCisgICBZWURFU1QuICAqLworc3RhdGljIGNoYXIgKgorIyAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3l5c3RwY3B5IChjaGFyICp5eWRlc3QsIGNvbnN0IGNoYXIgKnl5c3JjKQorIyAgIGVsc2UKK3l5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQorICAgICBjaGFyICp5eWRlc3Q7CisgICAgIGNvbnN0IGNoYXIgKnl5c3JjOworIyAgIGVuZGlmCit7CisgIHJlZ2lzdGVyIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqeXlzID0geXlzcmM7CisKKyAgd2hpbGUgKCgqeXlkKysgPSAqeXlzKyspICE9ICdcMCcpCisgICAgY29udGludWU7CisKKyAgcmV0dXJuIHl5ZCAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogIVlZRVJST1JfVkVSQk9TRSAqLworCisMCisKKyNpZiBZWURFQlVHCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitzdGF0aWMgdm9pZAoreXlzeW1wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eXN5bXByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKKyAgICBGSUxFICp5eW91dHB1dDsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgKnl5dmFsdWVwOworI2VuZGlmCit7CisgIC8qIFBhY2lmeSBgYHVudXNlZCB2YXJpYWJsZScnIHdhcm5pbmdzLiAgKi8KKyAgKHZvaWQpIHl5dmFsdWVwOworCisgIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCisgICAgWVlGUFJJTlRGICh5eW91dHB1dCwgInRva2VuICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOworICBlbHNlCisgICAgWVlGUFJJTlRGICh5eW91dHB1dCwgIm50ZXJtICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOworCisKKyMgaWZkZWYgWVlQUklOVAorICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQorICAgIFlZUFJJTlQgKHl5b3V0cHV0LCB5eXRva251bVt5eXR5cGVdLCAqeXl2YWx1ZXApOworIyBlbmRpZgorICBzd2l0Y2ggKHl5dHlwZSkKKyAgICB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIFlZRlBSSU5URiAoeXlvdXRwdXQsICIpIik7Cit9CisKKyNlbmRpZiAvKiAhIFlZREVCVUcgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFJlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHRoaXMgc3ltYm9sLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3N0YXRpYyB2b2lkCit5eWRlc3RydWN0IChjb25zdCBjaGFyICp5eW1zZywgaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXApCisjZWxzZQorc3RhdGljIHZvaWQKK3l5ZGVzdHJ1Y3QgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwKQorICAgIGNvbnN0IGNoYXIgKnl5bXNnOworICAgIGludCB5eXR5cGU7CisgICAgWVlTVFlQRSAqeXl2YWx1ZXA7CisjZW5kaWYKK3sKKyAgLyogUGFjaWZ5IGBgdW51c2VkIHZhcmlhYmxlJycgd2FybmluZ3MuICAqLworICAodm9pZCkgeXl2YWx1ZXA7CisKKyAgaWYgKCF5eW1zZykKKyAgICB5eW1zZyA9ICJEZWxldGluZyI7CisgIFlZX1NZTUJPTF9QUklOVCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKTsKKworICBzd2l0Y2ggKHl5dHlwZSkKKyAgICB7CisgICAgICBjYXNlIDQ4OiAvKiBjaG9pY2VfZW50cnkgKi8KKworICAgICAgICB7CisJZnByaW50ZihzdGRlcnIsICIlczolZDogbWlzc2luZyBlbmQgc3RhdGVtZW50IGZvciB0aGlzIGVudHJ5XG4iLAorCQkoeXl2YWx1ZXAtPm1lbnUpLT5maWxlLT5uYW1lLCAoeXl2YWx1ZXAtPm1lbnUpLT5saW5lbm8pOworCWlmIChjdXJyZW50X21lbnUgPT0gKHl5dmFsdWVwLT5tZW51KSkKKwkJbWVudV9lbmRfbWVudSgpOworfTsKKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTQ6IC8qIGlmX2VudHJ5ICovCisKKyAgICAgICAgeworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IG1pc3NpbmcgZW5kIHN0YXRlbWVudCBmb3IgdGhpcyBlbnRyeVxuIiwKKwkJKHl5dmFsdWVwLT5tZW51KS0+ZmlsZS0+bmFtZSwgKHl5dmFsdWVwLT5tZW51KS0+bGluZW5vKTsKKwlpZiAoY3VycmVudF9tZW51ID09ICh5eXZhbHVlcC0+bWVudSkpCisJCW1lbnVfZW5kX21lbnUoKTsKK307CisKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU5OiAvKiBtZW51X2VudHJ5ICovCisKKyAgICAgICAgeworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IG1pc3NpbmcgZW5kIHN0YXRlbWVudCBmb3IgdGhpcyBlbnRyeVxuIiwKKwkJKHl5dmFsdWVwLT5tZW51KS0+ZmlsZS0+bmFtZSwgKHl5dmFsdWVwLT5tZW51KS0+bGluZW5vKTsKKwlpZiAoY3VycmVudF9tZW51ID09ICh5eXZhbHVlcC0+bWVudSkpCisJCW1lbnVfZW5kX21lbnUoKTsKK307CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwwKKworLyogUHJldmVudCB3YXJuaW5ncyBmcm9tIC1XbWlzc2luZy1wcm90b3R5cGVzLiAgKi8KKworI2lmZGVmIFlZUEFSU0VfUEFSQU0KKyMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoraW50IHl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pOworIyBlbHNlCitpbnQgeXlwYXJzZSAoKTsKKyMgZW5kaWYKKyNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludCB5eXBhcnNlICh2b2lkKTsKKyNlbHNlCitpbnQgeXlwYXJzZSAoKTsKKyNlbmRpZgorI2VuZGlmIC8qICEgWVlQQVJTRV9QQVJBTSAqLworCisKKworLyogVGhlIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KK2ludCB5eWNoYXI7CisKKy8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9vay1haGVhZCBzeW1ib2wuICAqLworWVlTVFlQRSB5eWx2YWw7CisKKy8qIE51bWJlciBvZiBzeW50YXggZXJyb3JzIHNvIGZhci4gICovCitpbnQgeXluZXJyczsKKworCisKKy8qLS0tLS0tLS0tLS4KK3wgeXlwYXJzZS4gIHwKK2AtLS0tLS0tLS0tKi8KKworI2lmZGVmIFlZUEFSU0VfUEFSQU0KKyMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoraW50IHl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pCisjIGVsc2UKK2ludCB5eXBhcnNlIChZWVBBUlNFX1BBUkFNKQorICB2b2lkICpZWVBBUlNFX1BBUkFNOworIyBlbmRpZgorI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoraW50Cit5eXBhcnNlICh2b2lkKQorI2Vsc2UKK2ludAoreXlwYXJzZSAoKQorCisjZW5kaWYKKyNlbmRpZgoreworCisgIHJlZ2lzdGVyIGludCB5eXN0YXRlOworICByZWdpc3RlciBpbnQgeXluOworICBpbnQgeXlyZXN1bHQ7CisgIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLworICBpbnQgeXllcnJzdGF0dXM7CisgIC8qIExvb2stYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlci4gICovCisgIGludCB5eXRva2VuID0gMDsKKworICAvKiBUaHJlZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgorICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLAorICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLAorICAgICBgeXlscyc6IHJlbGF0ZWQgdG8gbG9jYXRpb25zLgorCisgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhyb3VnaCBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdworICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KKworICAvKiBUaGUgc3RhdGUgc3RhY2suICAqLworICBzaG9ydCBpbnQgeXlzc2FbWVlJTklUREVQVEhdOworICBzaG9ydCBpbnQgKnl5c3MgPSB5eXNzYTsKKyAgcmVnaXN0ZXIgc2hvcnQgaW50ICp5eXNzcDsKKworICAvKiBUaGUgc2VtYW50aWMgdmFsdWUgc3RhY2suICAqLworICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKKyAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOworICByZWdpc3RlciBZWVNUWVBFICp5eXZzcDsKKworCisKKyNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tKQorCisgIFlZU0laRV9UIHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7CisKKyAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKKyAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KKyAgWVlTVFlQRSB5eXZhbDsKKworCisgIC8qIFdoZW4gcmVkdWNpbmcsIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvbiB0aGUgUkhTIG9mIHRoZSByZWR1Y2VkCisgICAgIHJ1bGUuICAqLworICBpbnQgeXlsZW47CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpKTsKKworICB5eXN0YXRlID0gMDsKKyAgeXllcnJzdGF0dXMgPSAwOworICB5eW5lcnJzID0gMDsKKyAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCisKKyAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KKyAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCisgICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KKyAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLworCisgIHl5c3NwID0geXlzczsKKyAgeXl2c3AgPSB5eXZzOworCisKKyAgeXl2c3BbMF0gPSB5eWx2YWw7CisKKyAgZ290byB5eXNldHN0YXRlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXluZXdzdGF0ZSAtLSBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiB5eXN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgeXluZXdzdGF0ZToKKyAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKKyAgICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLgorICAgICAqLworICB5eXNzcCsrOworCisgeXlzZXRzdGF0ZToKKyAgKnl5c3NwID0geXlzdGF0ZTsKKworICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KKyAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7CisKKyNpZmRlZiB5eW92ZXJmbG93CisgICAgICB7CisJLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrLiBVc2UgY29waWVzIG9mCisJICAgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50bworCSAgIG1lbW9yeS4gICovCisJWVlTVFlQRSAqeXl2czEgPSB5eXZzOworCXNob3J0IGludCAqeXlzczEgPSB5eXNzOworCisKKwkvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZiB0aGUKKwkgICBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gIFRoaXMgdXNlZCB0byBiZSBhCisJICAgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLCBidXQgdGhhdCBtaWdodAorCSAgIGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLworCXl5b3ZlcmZsb3cgKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAorCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCisJCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKworCQkgICAgJnl5c3RhY2tzaXplKTsKKworCXl5c3MgPSB5eXNzMTsKKwl5eXZzID0geXl2czE7CisgICAgICB9CisjZWxzZSAvKiBubyB5eW92ZXJmbG93ICovCisjIGlmbmRlZiBZWVNUQUNLX1JFTE9DQVRFCisgICAgICBnb3RvIHl5b3ZlcmZsb3dsYWI7CisjIGVsc2UKKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworICAgICAgaWYgKFlZTUFYREVQVEggPD0geXlzdGFja3NpemUpCisJZ290byB5eW92ZXJmbG93bGFiOworICAgICAgeXlzdGFja3NpemUgKj0gMjsKKyAgICAgIGlmIChZWU1BWERFUFRIIDwgeXlzdGFja3NpemUpCisJeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOworCisgICAgICB7CisJc2hvcnQgaW50ICp5eXNzMSA9IHl5c3M7CisJdW5pb24geXlhbGxvYyAqeXlwdHIgPQorCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKKwlpZiAoISB5eXB0cikKKwkgIGdvdG8geXlvdmVyZmxvd2xhYjsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXNzKTsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXZzKTsKKworIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQorCWlmICh5eXNzMSAhPSB5eXNzYSkKKwkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOworICAgICAgfQorIyBlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKKyAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7CisKKworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWx1XG4iLAorCQkgICh1bnNpZ25lZCBsb25nKSB5eXN0YWNrc2l6ZSkpOworCisgICAgICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKKwlZWUFCT1JUOworICAgIH0KKworICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOworCisgIGdvdG8geXliYWNrdXA7CisKKy8qLS0tLS0tLS0tLS0uCit8IHl5YmFja3VwLiAgfAorYC0tLS0tLS0tLS0tKi8KK3l5YmFja3VwOgorCisvKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KKy8qIFJlYWQgYSBsb29rLWFoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KKy8qIHl5cmVzdW1lOiAqLworCisgIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rLWFoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlQQUNUX05JTkYpCisgICAgZ290byB5eWRlZmF1bHQ7CisKKyAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2stYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogWVlDSEFSIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GIG9yIGEgdmFsaWQgbG9vay1haGVhZCBzeW1ib2wuICAqLworICBpZiAoeXljaGFyID09IFlZRU1QVFkpCisgICAgeworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7CisgICAgICB5eWNoYXIgPSBZWUxFWDsKKyAgICB9CisKKyAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKyAgICB7CisgICAgICB5eWNoYXIgPSB5eXRva2VuID0gWVlFT0Y7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIFlZX1NZTUJPTF9QUklOVCAoIk5leHQgdG9rZW4gaXMiLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKKyAgICB9CisKKyAgLyogSWYgdGhlIHByb3BlciBhY3Rpb24gb24gc2VlaW5nIHRva2VuIFlZVE9LRU4gaXMgdG8gcmVkdWNlIG9yIHRvCisgICAgIGRldGVjdCBhbiBlcnJvciwgdGFrZSB0aGF0IGFjdGlvbi4gICovCisgIHl5biArPSB5eXRva2VuOworICBpZiAoeXluIDwgMCB8fCBZWUxBU1QgPCB5eW4gfHwgeXljaGVja1t5eW5dICE9IHl5dG9rZW4pCisgICAgZ290byB5eWRlZmF1bHQ7CisgIHl5biA9IHl5dGFibGVbeXluXTsKKyAgaWYgKHl5biA8PSAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIC8qIFNoaWZ0IHRoZSBsb29rLWFoZWFkIHRva2VuLiAgKi8KKyAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKKworICAvKiBEaXNjYXJkIHRoZSB0b2tlbiBiZWluZyBzaGlmdGVkIHVubGVzcyBpdCBpcyBlb2YuICAqLworICBpZiAoeXljaGFyICE9IFlZRU9GKQorICAgIHl5Y2hhciA9IFlZRU1QVFk7CisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisKKworICAvKiBDb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yCisgICAgIHN0YXR1cy4gICovCisgIGlmICh5eWVycnN0YXR1cykKKyAgICB5eWVycnN0YXR1cy0tOworCisgIHl5c3RhdGUgPSB5eW47CisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWRlZmF1bHQgLS0gZG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWRlZmF1bHQ6CisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKyAgZ290byB5eXJlZHVjZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eXJlZHVjZSAtLSBEbyBhIHJlZHVjdGlvbi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eXJlZHVjZToKKyAgLyogeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KKyAgeXlsZW4gPSB5eXIyW3l5bl07CisKKyAgLyogSWYgWVlMRU4gaXMgbm9uemVybywgaW1wbGVtZW50IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb246CisgICAgIGAkJCA9ICQxJy4KKworICAgICBPdGhlcndpc2UsIHRoZSBmb2xsb3dpbmcgbGluZSBzZXRzIFlZVkFMIHRvIGdhcmJhZ2UuCisgICAgIFRoaXMgYmVoYXZpb3IgaXMgdW5kb2N1bWVudGVkIGFuZCBCaXNvbgorICAgICB1c2VycyBzaG91bGQgbm90IHJlbHkgdXBvbiBpdC4gIEFzc2lnbmluZyB0byBZWVZBTAorICAgICB1bmNvbmRpdGlvbmFsbHkgbWFrZXMgdGhlIHBhcnNlciBhIGJpdCBzbWFsbGVyLCBhbmQgaXQgYXZvaWRzIGEKKyAgICAgR0NDIHdhcm5pbmcgdGhhdCBZWVZBTCBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkLiAgKi8KKyAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsKKworCisgIFlZX1JFRFVDRV9QUklOVCAoeXluKTsKKyAgc3dpdGNoICh5eW4pCisgICAgeworICAgICAgICBjYXNlIDg6CisKKyAgICB7IHpjb25mX2Vycm9yKCJ1bmV4cGVjdGVkIGVuZCBzdGF0ZW1lbnQiKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk6CisKKyAgICB7IHpjb25mX2Vycm9yKCJ1bmtub3duIHN0YXRlbWVudCBcIiVzXCIiLCAoeXl2c3BbLTJdLnN0cmluZykpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA6CisKKyAgICB7CisJemNvbmZfZXJyb3IoInVuZXhwZWN0ZWQgb3B0aW9uIFwiJXNcIiIsIGtjb25mX2lkX3N0cmluZ3MgKyAoeXl2c3BbLTJdLmlkKS0+bmFtZSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE6CisKKyAgICB7IHpjb25mX2Vycm9yKCJpbnZhbGlkIHN0YXRlbWVudCIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjU6CisKKyAgICB7IHpjb25mX2Vycm9yKCJ1bmtub3duIG9wdGlvbiBcIiVzXCIiLCAoeXl2c3BbLTJdLnN0cmluZykpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjY6CisKKyAgICB7IHpjb25mX2Vycm9yKCJpbnZhbGlkIG9wdGlvbiIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjc6CisKKyAgICB7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cCgoeXl2c3BbLTFdLnN0cmluZyksIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y29uZmlnICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCAoeXl2c3BbLTFdLnN0cmluZykpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDI4OgorCisgICAgeworCW1lbnVfZW5kX2VudHJ5KCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY29uZmlnXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyOToKKworICAgIHsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKCh5eXZzcFstMV0uc3RyaW5nKSwgMCk7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfT1BUSU9OQUw7CisJbWVudV9hZGRfZW50cnkoc3ltKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDptZW51Y29uZmlnICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCAoeXl2c3BbLTFdLnN0cmluZykpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDMwOgorCisgICAgeworCWlmIChjdXJyZW50X2VudHJ5LT5wcm9tcHQpCisJCWN1cnJlbnRfZW50cnktPnByb21wdC0+dHlwZSA9IFBfTUVOVTsKKwllbHNlCisJCXpjb25mcHJpbnQoIndhcm5pbmc6IG1lbnVjb25maWcgc3RhdGVtZW50IHdpdGhvdXQgcHJvbXB0Iik7CisJbWVudV9lbmRfZW50cnkoKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRjb25maWdcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDM3OgorCisgICAgeworCW1lbnVfc2V0X3R5cGUoKHl5dnNwWy0yXS5pZCktPnN0eXBlKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDp0eXBlKCV1KVxuIiwKKwkJemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwKKwkJKHl5dnNwWy0yXS5pZCktPnN0eXBlKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzODoKKworICAgIHsKKwltZW51X2FkZF9wcm9tcHQoUF9QUk9NUFQsICh5eXZzcFstMl0uc3RyaW5nKSwgKHl5dnNwWy0xXS5leHByKSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cHJvbXB0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzOToKKworICAgIHsKKwltZW51X2FkZF9leHByKFBfREVGQVVMVCwgKHl5dnNwWy0yXS5leHByKSwgKHl5dnNwWy0xXS5leHByKSk7CisJaWYgKCh5eXZzcFstM10uaWQpLT5zdHlwZSAhPSBTX1VOS05PV04pCisJCW1lbnVfc2V0X3R5cGUoKHl5dnNwWy0zXS5pZCktPnN0eXBlKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZhdWx0KCV1KVxuIiwKKwkJemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwKKwkJKHl5dnNwWy0zXS5pZCktPnN0eXBlKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0MDoKKworICAgIHsKKwltZW51X2FkZF9zeW1ib2woUF9TRUxFQ1QsIHN5bV9sb29rdXAoKHl5dnNwWy0yXS5zdHJpbmcpLCAwKSwgKHl5dnNwWy0xXS5leHByKSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6c2VsZWN0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0MToKKworICAgIHsKKwltZW51X2FkZF9leHByKFBfUkFOR0UsIGV4cHJfYWxsb2NfY29tcChFX1JBTkdFLCh5eXZzcFstM10uc3ltYm9sKSwgKHl5dnNwWy0yXS5zeW1ib2wpKSwgKHl5dnNwWy0xXS5leHByKSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cmFuZ2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDQyOgorCisgICAgeworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoTlVMTCwgMCk7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQ0hPSUNFOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJbWVudV9hZGRfZXhwcihQX0NIT0lDRSwgTlVMTCwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y2hvaWNlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0MzoKKworICAgIHsKKwkoeXl2YWwubWVudSkgPSBtZW51X2FkZF9tZW51KCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDQ6CisKKyAgICB7CisJaWYgKHpjb25mX2VuZHRva2VuKCh5eXZzcFswXS5pZCksIFRfQ0hPSUNFLCBUX0VORENIT0lDRSkpIHsKKwkJbWVudV9lbmRfbWVudSgpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRjaG9pY2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1MjoKKworICAgIHsKKwltZW51X2FkZF9wcm9tcHQoUF9QUk9NUFQsICh5eXZzcFstMl0uc3RyaW5nKSwgKHl5dnNwWy0xXS5leHByKSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cHJvbXB0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1MzoKKworICAgIHsKKwlpZiAoKHl5dnNwWy0yXS5pZCktPnN0eXBlID09IFNfQk9PTEVBTiB8fCAoeXl2c3BbLTJdLmlkKS0+c3R5cGUgPT0gU19UUklTVEFURSkgeworCQltZW51X3NldF90eXBlKCh5eXZzcFstMl0uaWQpLT5zdHlwZSk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnR5cGUoJXUpXG4iLAorCQkJemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwKKwkJCSh5eXZzcFstMl0uaWQpLT5zdHlwZSk7CisJfSBlbHNlCisJCVlZRVJST1I7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTQ6CisKKyAgICB7CisJY3VycmVudF9lbnRyeS0+c3ltLT5mbGFncyB8PSBTWU1CT0xfT1BUSU9OQUw7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6b3B0aW9uYWxcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDU1OgorCisgICAgeworCWlmICgoeXl2c3BbLTNdLmlkKS0+c3R5cGUgPT0gU19VTktOT1dOKSB7CisJCW1lbnVfYWRkX3N5bWJvbChQX0RFRkFVTFQsIHN5bV9sb29rdXAoKHl5dnNwWy0yXS5zdHJpbmcpLCAwKSwgKHl5dnNwWy0xXS5leHByKSk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlZmF1bHRcbiIsCisJCQl6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9IGVsc2UKKwkJWVlFUlJPUjsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1ODoKKworICAgIHsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDppZlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfZGVwKCh5eXZzcFstMV0uZXhwcikpOworCSh5eXZhbC5tZW51KSA9IG1lbnVfYWRkX21lbnUoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1OToKKworICAgIHsKKwlpZiAoemNvbmZfZW5kdG9rZW4oKHl5dnNwWzBdLmlkKSwgVF9JRiwgVF9FTkRJRikpIHsKKwkJbWVudV9lbmRfbWVudSgpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRpZlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorO30KKyAgICBicmVhazsKKworICBjYXNlIDY1OgorCisgICAgeworCW1lbnVfYWRkX2VudHJ5KE5VTEwpOworCW1lbnVfYWRkX3Byb21wdChQX01FTlUsICh5eXZzcFstMV0uc3RyaW5nKSwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjY6CisKKyAgICB7CisJKHl5dmFsLm1lbnUpID0gbWVudV9hZGRfbWVudSgpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDY3OgorCisgICAgeworCWlmICh6Y29uZl9lbmR0b2tlbigoeXl2c3BbMF0uaWQpLCBUX01FTlUsIFRfRU5ETUVOVSkpIHsKKwkJbWVudV9lbmRfbWVudSgpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRtZW51XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzM6CisKKyAgICB7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6c291cmNlICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCAoeXl2c3BbLTFdLnN0cmluZykpOworCXpjb25mX25leHRmaWxlKCh5eXZzcFstMV0uc3RyaW5nKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzQ6CisKKyAgICB7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfcHJvbXB0KFBfQ09NTUVOVCwgKHl5dnNwWy0xXS5zdHJpbmcpLCBOVUxMKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjb21tZW50XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NToKKworICAgIHsKKwltZW51X2VuZF9lbnRyeSgpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDc2OgorCisgICAgeworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmhlbHBcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCXpjb25mX3N0YXJ0aGVscCgpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDc3OgorCisgICAgeworCWN1cnJlbnRfZW50cnktPnN5bS0+aGVscCA9ICh5eXZzcFswXS5zdHJpbmcpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDgyOgorCisgICAgeworCW1lbnVfYWRkX2RlcCgoeXl2c3BbLTFdLmV4cHIpKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZXBlbmRzIG9uXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4MzoKKworICAgIHsKKwltZW51X2FkZF9kZXAoKHl5dnNwWy0xXS5leHByKSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVwZW5kc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODQ6CisKKyAgICB7CisJbWVudV9hZGRfZGVwKCh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnJlcXVpcmVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4NjoKKworICAgIHsKKwltZW51X2FkZF9wcm9tcHQoUF9QUk9NUFQsICh5eXZzcFstMV0uc3RyaW5nKSwgKHl5dnNwWzBdLmV4cHIpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4OToKKworICAgIHsgKHl5dmFsLmlkKSA9ICh5eXZzcFstMV0uaWQpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTA6CisKKyAgICB7ICh5eXZhbC5pZCkgPSAoeXl2c3BbLTFdLmlkKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDkxOgorCisgICAgeyAoeXl2YWwuaWQpID0gKHl5dnNwWy0xXS5pZCk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NDoKKworICAgIHsgKHl5dmFsLmV4cHIpID0gTlVMTDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk1OgorCisgICAgeyAoeXl2YWwuZXhwcikgPSAoeXl2c3BbMF0uZXhwcik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NjoKKworICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY19zeW1ib2woKHl5dnNwWzBdLnN5bWJvbCkpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTc6CisKKyAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCAoeXl2c3BbLTJdLnN5bWJvbCksICh5eXZzcFswXS5zeW1ib2wpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk4OgorCisgICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCAoeXl2c3BbLTJdLnN5bWJvbCksICh5eXZzcFswXS5zeW1ib2wpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk5OgorCisgICAgeyAoeXl2YWwuZXhwcikgPSAoeXl2c3BbLTFdLmV4cHIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTAwOgorCisgICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX29uZShFX05PVCwgKHl5dnNwWzBdLmV4cHIpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMToKKworICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY190d28oRV9PUiwgKHl5dnNwWy0yXS5leHByKSwgKHl5dnNwWzBdLmV4cHIpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMjoKKworICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY190d28oRV9BTkQsICh5eXZzcFstMl0uZXhwciksICh5eXZzcFswXS5leHByKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDM6CisKKyAgICB7ICh5eXZhbC5zeW1ib2wpID0gc3ltX2xvb2t1cCgoeXl2c3BbMF0uc3RyaW5nKSwgMCk7IGZyZWUoKHl5dnNwWzBdLnN0cmluZykpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA0OgorCisgICAgeyAoeXl2YWwuc3ltYm9sKSA9IHN5bV9sb29rdXAoKHl5dnNwWzBdLnN0cmluZyksIDEpOyBmcmVlKCh5eXZzcFswXS5zdHJpbmcpKTsgO30KKyAgICBicmVhazsKKworCisgICAgfQorCisvKiBMaW5lIDEwMzcgb2YgeWFjYy5jLiAgKi8KKworDAorICB5eXZzcCAtPSB5eWxlbjsKKyAgeXlzc3AgLT0geXlsZW47CisKKworICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOworCisgICorK3l5dnNwID0geXl2YWw7CisKKworICAvKiBOb3cgYHNoaWZ0JyB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uICBEZXRlcm1pbmUgd2hhdCBzdGF0ZQorICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKKyAgICAgbnVtYmVyIHJlZHVjZWQgYnkuICAqLworCisgIHl5biA9IHl5cjFbeXluXTsKKworICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UT0tFTlNdICsgKnl5c3NwOworICBpZiAoMCA8PSB5eXN0YXRlICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQorICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOworICBlbHNlCisgICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UT0tFTlNdOworCisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJsYWIgLS0gaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmxhYjoKKyAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCisgIGlmICgheXllcnJzdGF0dXMpCisgICAgeworICAgICAgKyt5eW5lcnJzOworI2lmIFlZRVJST1JfVkVSQk9TRQorICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOworCisgICAgICBpZiAoWVlQQUNUX05JTkYgPCB5eW4gJiYgeXluIDwgWVlMQVNUKQorCXsKKwkgIFlZU0laRV9UIHl5c2l6ZSA9IDA7CisJICBpbnQgeXl0eXBlID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisJICBjb25zdCBjaGFyKiB5eXByZWZpeDsKKwkgIGNoYXIgKnl5bXNnOworCSAgaW50IHl5eDsKKworCSAgLyogU3RhcnQgWVlYIGF0IC1ZWU4gaWYgbmVnYXRpdmUgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbgorCSAgICAgWVlDSEVDSy4gICovCisJICBpbnQgeXl4YmVnaW4gPSB5eW4gPCAwID8gLXl5biA6IDA7CisKKwkgIC8qIFN0YXkgd2l0aGluIGJvdW5kcyBvZiBib3RoIHl5Y2hlY2sgYW5kIHl5dG5hbWUuICAqLworCSAgaW50IHl5Y2hlY2tsaW0gPSBZWUxBU1QgLSB5eW47CisJICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7CisJICBpbnQgeXljb3VudCA9IDA7CisKKwkgIHl5cHJlZml4ID0gIiwgZXhwZWN0aW5nICI7CisJICBmb3IgKHl5eCA9IHl5eGJlZ2luOyB5eXggPCB5eXhlbmQ7ICsreXl4KQorCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCisJICAgICAgeworCQl5eXNpemUgKz0geXlzdHJsZW4gKHl5cHJlZml4KSArIHl5c3RybGVuICh5eXRuYW1lIFt5eXhdKTsKKwkJeXljb3VudCArPSAxOworCQlpZiAoeXljb3VudCA9PSA1KQorCQkgIHsKKwkJICAgIHl5c2l6ZSA9IDA7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgeXlzaXplICs9IChzaXplb2YgKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgIikKKwkJICAgICArIHl5c3RybGVuICh5eXRuYW1lW3l5dHlwZV0pKTsKKwkgIHl5bXNnID0gKGNoYXIgKikgWVlTVEFDS19BTExPQyAoeXlzaXplKTsKKwkgIGlmICh5eW1zZyAhPSAwKQorCSAgICB7CisJICAgICAgY2hhciAqeXlwID0geXlzdHBjcHkgKHl5bXNnLCAic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICIpOworCSAgICAgIHl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5dG5hbWVbeXl0eXBlXSk7CisKKwkgICAgICBpZiAoeXljb3VudCA8IDUpCisJCXsKKwkJICB5eXByZWZpeCA9ICIsIGV4cGVjdGluZyAiOworCQkgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCisJCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCisJCSAgICAgIHsKKwkJCXl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5cHJlZml4KTsKKwkJCXl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5dG5hbWVbeXl4XSk7CisJCQl5eXByZWZpeCA9ICIgb3IgIjsKKwkJICAgICAgfQorCQl9CisJICAgICAgeXllcnJvciAoeXltc2cpOworCSAgICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOworCSAgICB9CisJICBlbHNlCisJICAgIHl5ZXJyb3IgKCJzeW50YXggZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7CisJfQorICAgICAgZWxzZQorI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLworCXl5ZXJyb3IgKCJzeW50YXggZXJyb3IiKTsKKyAgICB9CisKKworCisgIGlmICh5eWVycnN0YXR1cyA9PSAzKQorICAgIHsKKyAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rLWFoZWFkIHRva2VuIGFmdGVyIGFuCisJIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIGF0IGVuZCBvZiBpbnB1dCwgcG9wIHRoZSBlcnJvciB0b2tlbiwKKwkgICAgIHRoZW4gdGhlIHJlc3Qgb2YgdGhlIHN0YWNrLCB0aGVuIHJldHVybiBmYWlsdXJlLiAgKi8KKwkgIGlmICh5eWNoYXIgPT0gWVlFT0YpCisJICAgICBmb3IgKDs7KQorCSAgICAgICB7CisKKwkJIFlZUE9QU1RBQ0s7CisJCSBpZiAoeXlzc3AgPT0geXlzcykKKwkJICAgWVlBQk9SVDsKKwkJIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogcG9wcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCk7CisJICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorCXsKKwkgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogZGlzY2FyZGluZyIsIHl5dG9rZW4sICZ5eWx2YWwpOworCSAgeXljaGFyID0gWVlFTVBUWTsKKwl9CisgICAgfQorCisgIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9vay1haGVhZCB0b2tlbiBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IKKyAgICAgdG9rZW4uICAqLworICBnb3RvIHl5ZXJybGFiMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJvcmxhYiAtLSBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBZWUVSUk9SLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycm9ybGFiOgorCisjaWZkZWYgX19HTlVDX18KKyAgLyogUGFjaWZ5IEdDQyB3aGVuIHRoZSB1c2VyIGNvZGUgbmV2ZXIgaW52b2tlcyBZWUVSUk9SIGFuZCB0aGUgbGFiZWwKKyAgICAgeXllcnJvcmxhYiB0aGVyZWZvcmUgbmV2ZXIgYXBwZWFycyBpbiB1c2VyIGNvZGUuICAqLworICBpZiAoMCkKKyAgICAgZ290byB5eWVycm9ybGFiOworI2VuZGlmCisKK3l5dnNwIC09IHl5bGVuOworICB5eXNzcCAtPSB5eWxlbjsKKyAgeXlzdGF0ZSA9ICp5eXNzcDsKKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmxhYjEgLS0gY29tbW9uIGNvZGUgZm9yIGJvdGggc3ludGF4IGVycm9yIGFuZCBZWUVSUk9SLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWIxOgorICB5eWVycnN0YXR1cyA9IDM7CS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcy4gICovCisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgICAgICBpZiAoeXluICE9IFlZUEFDVF9OSU5GKQorCXsKKwkgIHl5biArPSBZWVRFUlJPUjsKKwkgIGlmICgwIDw9IHl5biAmJiB5eW4gPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXluXSA9PSBZWVRFUlJPUikKKwkgICAgeworCSAgICAgIHl5biA9IHl5dGFibGVbeXluXTsKKwkgICAgICBpZiAoMCA8IHl5bikKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuLiAgKi8KKyAgICAgIGlmICh5eXNzcCA9PSB5eXNzKQorCVlZQUJPUlQ7CisKKworICAgICAgeXlkZXN0cnVjdCAoIkVycm9yOiBwb3BwaW5nIiwgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCk7CisgICAgICBZWVBPUFNUQUNLOworICAgICAgeXlzdGF0ZSA9ICp5eXNzcDsKKyAgICAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CisgICAgfQorCisgIGlmICh5eW4gPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKworCisgIC8qIFNoaWZ0IHRoZSBlcnJvciB0b2tlbi4gKi8KKyAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXN0b3NbeXluXSwgeXl2c3AsIHl5bHNwKTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFjY2VwdGxhYiAtLSBZWUFDQ0VQVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhY2NlcHRsYWI6CisgIHl5cmVzdWx0ID0gMDsKKyAgZ290byB5eXJldHVybjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhYm9ydGxhYiAtLSBZWUFCT1JUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhYm9ydGxhYjoKKyAgeXlkZXN0cnVjdCAoIkVycm9yOiBkaXNjYXJkaW5nIGxvb2thaGVhZCIsCisgICAgICAgICAgICAgIHl5dG9rZW4sICZ5eWx2YWwpOworICB5eWNoYXIgPSBZWUVNUFRZOworICB5eXJlc3VsdCA9IDE7CisgIGdvdG8geXlyZXR1cm47CisKKyNpZm5kZWYgeXlvdmVyZmxvdworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW92ZXJmbG93bGFiIC0tIHBhcnNlciBvdmVyZmxvdyBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlvdmVyZmxvd2xhYjoKKyAgeXllcnJvciAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIpOworICB5eXJlc3VsdCA9IDI7CisgIC8qIEZhbGwgdGhyb3VnaC4gICovCisjZW5kaWYKKworeXlyZXR1cm46CisjaWZuZGVmIHl5b3ZlcmZsb3cKKyAgaWYgKHl5c3MgIT0geXlzc2EpCisgICAgWVlTVEFDS19GUkVFICh5eXNzKTsKKyNlbmRpZgorICByZXR1cm4geXlyZXN1bHQ7Cit9CisKKworCisKKwordm9pZCBjb25mX3BhcnNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJemNvbmZfaW5pdHNjYW4obmFtZSk7CisKKwlzeW1faW5pdCgpOworCW1lbnVfaW5pdCgpOworCW1vZHVsZXNfc3ltID0gc3ltX2xvb2t1cCgiTU9EVUxFUyIsIDApOworCXJvb3RtZW51LnByb21wdCA9IG1lbnVfYWRkX3Byb21wdChQX01FTlUsICJCdXN5Ym94IENvbmZpZ3VyYXRpb24iLCBOVUxMKTsKKworI2lmIFlZREVCVUcKKwlpZiAoZ2V0ZW52KCJaQ09ORl9ERUJVRyIpKQorCQl6Y29uZmRlYnVnID0gMTsKKyNlbmRpZgorCXpjb25mcGFyc2UoKTsKKwlpZiAoemNvbmZuZXJycykKKwkJZXhpdCgxKTsKKwltZW51X2ZpbmFsaXplKCZyb290bWVudSk7CisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgeworCQlzeW1fY2hlY2tfZGVwcyhzeW0pOworICAgICAgICB9CisKKwlzeW1fY2hhbmdlX2NvdW50ID0gMTsKK30KKworY29uc3QgY2hhciAqemNvbmZfdG9rZW5uYW1lKGludCB0b2tlbikKK3sKKwlzd2l0Y2ggKHRva2VuKSB7CisJY2FzZSBUX01FTlU6CQlyZXR1cm4gIm1lbnUiOworCWNhc2UgVF9FTkRNRU5VOgkJcmV0dXJuICJlbmRtZW51IjsKKwljYXNlIFRfQ0hPSUNFOgkJcmV0dXJuICJjaG9pY2UiOworCWNhc2UgVF9FTkRDSE9JQ0U6CXJldHVybiAiZW5kY2hvaWNlIjsKKwljYXNlIFRfSUY6CQlyZXR1cm4gImlmIjsKKwljYXNlIFRfRU5ESUY6CQlyZXR1cm4gImVuZGlmIjsKKwljYXNlIFRfREVQRU5EUzoJCXJldHVybiAiZGVwZW5kcyI7CisJfQorCXJldHVybiAiPHRva2VuPiI7Cit9CisKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKHN0cnVjdCBrY29uZl9pZCAqaWQsIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pCit7CisJaWYgKGlkLT50b2tlbiAhPSBlbmR0b2tlbikgeworCQl6Y29uZl9lcnJvcigidW5leHBlY3RlZCAnJXMnIHdpdGhpbiAlcyBibG9jayIsCisJCQlrY29uZl9pZF9zdHJpbmdzICsgaWQtPm5hbWUsIHpjb25mX3Rva2VubmFtZShzdGFydHRva2VuKSk7CisJCXpjb25mbmVycnMrKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoY3VycmVudF9tZW51LT5maWxlICE9IGN1cnJlbnRfZmlsZSkgeworCQl6Y29uZl9lcnJvcigiJyVzJyBpbiBkaWZmZXJlbnQgZmlsZSB0aGFuICclcyciLAorCQkJa2NvbmZfaWRfc3RyaW5ncyArIGlkLT5uYW1lLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBsb2NhdGlvbiBvZiB0aGUgJyVzJ1xuIiwKKwkJCWN1cnJlbnRfbWVudS0+ZmlsZS0+bmFtZSwgY3VycmVudF9tZW51LT5saW5lbm8sCisJCQl6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZm5lcnJzKys7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mcHJpbnQoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCXZhX3N0YXJ0KGFwLCBlcnIpOworCXZmcHJpbnRmKHN0ZGVyciwgZXJyLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2Vycm9yKGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl6Y29uZm5lcnJzKys7CisJZnByaW50ZihzdGRlcnIsICIlczolZDogIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJdmFfc3RhcnQoYXAsIGVycik7CisJdmZwcmludGYoc3RkZXJyLCBlcnIsIGFwKTsKKwl2YV9lbmQoYXApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZlcnJvcihjb25zdCBjaGFyICplcnIpCit7CisjaWYgWVlERUJVRworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpICsgMSwgZXJyKTsKKyNlbmRpZgorfQorCit2b2lkIHByaW50X3F1b3RlZF9zdHJpbmcoRklMRSAqb3V0LCBjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgbGVuOworCisJcHV0YygnIicsIG91dCk7CisJd2hpbGUgKChwID0gc3RyY2hyKHN0ciwgJyInKSkpIHsKKwkJbGVuID0gcCAtIHN0cjsKKwkJaWYgKGxlbikKKwkJCWZwcmludGYob3V0LCAiJS4qcyIsIGxlbiwgc3RyKTsKKwkJZnB1dHMoIlxcXCIiLCBvdXQpOworCQlzdHIgPSBwICsgMTsKKwl9CisJZnB1dHMoc3RyLCBvdXQpOworCXB1dGMoJyInLCBvdXQpOworfQorCit2b2lkIHByaW50X3N5bWJvbChGSUxFICpvdXQsIHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQorCQlmcHJpbnRmKG91dCwgImNob2ljZVxuIik7CisJZWxzZQorCQlmcHJpbnRmKG91dCwgImNvbmZpZyAlc1xuIiwgc3ltLT5uYW1lKTsKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCQlmcHV0cygiICBib29sZWFuXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfVFJJU1RBVEU6CisJCWZwdXRzKCIgIHRyaXN0YXRlXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfU1RSSU5HOgorCQlmcHV0cygiICBzdHJpbmdcbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJCWZwdXRzKCIgIGludGVnZXJcbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19IRVg6CisJCWZwdXRzKCIgIGhleFxuIiwgb3V0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnB1dHMoIiAgPz8/XG4iLCBvdXQpOworCQlicmVhazsKKwl9CisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlpZiAocHJvcC0+bWVudSAhPSBtZW51KQorCQkJY29udGludWU7CisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfUFJPTVBUOgorCQkJZnB1dHMoIiAgcHJvbXB0ICIsIG91dCk7CisJCQlwcmludF9xdW90ZWRfc3RyaW5nKG91dCwgcHJvcC0+dGV4dCk7CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiIGlmICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJfQorCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIFBfREVGQVVMVDoKKwkJCWZwdXRzKCAiICBkZWZhdWx0ICIsIG91dCk7CisJCQlleHByX2ZwcmludChwcm9wLT5leHByLCBvdXQpOworCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiBpZiAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBQX0NIT0lDRToKKwkJCWZwdXRzKCIgICNjaG9pY2UgdmFsdWVcbiIsIG91dCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYob3V0LCAiICB1bmtub3duIHByb3AgJWQhXG4iLCBwcm9wLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChzeW0tPmhlbHApIHsKKwkJaW50IGxlbiA9IHN0cmxlbihzeW0tPmhlbHApOworCQl3aGlsZSAoc3ltLT5oZWxwWy0tbGVuXSA9PSAnXG4nKQorCQkJc3ltLT5oZWxwW2xlbl0gPSAwOworCQlmcHJpbnRmKG91dCwgIiAgaGVscFxuJXNcbiIsIHN5bS0+aGVscCk7CisJfQorCWZwdXRjKCdcbicsIG91dCk7Cit9CisKK3ZvaWQgemNvbmZkdW1wKEZJTEUgKm91dCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICptZW51OworCisJbWVudSA9IHJvb3RtZW51Lmxpc3Q7CisJd2hpbGUgKG1lbnUpIHsKKwkJaWYgKChzeW0gPSBtZW51LT5zeW0pKQorCQkJcHJpbnRfc3ltYm9sKG91dCwgbWVudSk7CisJCWVsc2UgaWYgKChwcm9wID0gbWVudS0+cHJvbXB0KSkgeworCQkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCQljYXNlIFBfQ09NTUVOVDoKKwkJCQlmcHV0cygiXG5jb21tZW50ICIsIG91dCk7CisJCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJCWZwdXRzKCJcbiIsIG91dCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBfTUVOVToKKwkJCQlmcHV0cygiXG5tZW51ICIsIG91dCk7CisJCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJCWZwdXRzKCJcbiIsIG91dCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJCX0KKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgIGRlcGVuZHMgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCX0KKwkJCWZwdXRzKCJcbiIsIG91dCk7CisJCX0KKworCQlpZiAobWVudS0+bGlzdCkKKwkJCW1lbnUgPSBtZW51LT5saXN0OworCQllbHNlIGlmIChtZW51LT5uZXh0KQorCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCWVsc2Ugd2hpbGUgKChtZW51ID0gbWVudS0+cGFyZW50KSkgeworCQkJaWYgKG1lbnUtPnByb21wdCAmJiBtZW51LT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKQorCQkJCWZwdXRzKCJcbmVuZG1lbnVcbiIsIG91dCk7CisJCQlpZiAobWVudS0+bmV4dCkgeworCQkJCW1lbnUgPSBtZW51LT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisjaW5jbHVkZSAibGV4Lnpjb25mLmMiCisjaW5jbHVkZSAidXRpbC5jIgorI2luY2x1ZGUgImNvbmZkYXRhLmMiCisjaW5jbHVkZSAiZXhwci5jIgorI2luY2x1ZGUgInN5bWJvbC5jIgorI2luY2x1ZGUgIm1lbnUuYyIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy96Y29uZi55IGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmNWU5MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMva2NvbmZpZy96Y29uZi55CkBAIC0wLDAgKzEsNjgzIEBACisleworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCisjZGVmaW5lIHByaW50ZChtYXNrLCBmbXQuLi4pIGlmIChjZGVidWcgJiAobWFzaykpIHByaW50ZihmbXQpCisKKyNkZWZpbmUgUFJJTlRECQkweDAwMDEKKyNkZWZpbmUgREVCVUdfUEFSU0UJMHgwMDAyCisKK2ludCBjZGVidWcgPSBQUklOVEQ7CisKK2V4dGVybiBpbnQgemNvbmZsZXgodm9pZCk7CitzdGF0aWMgdm9pZCB6Y29uZnByaW50KGNvbnN0IGNoYXIgKmVyciwgLi4uKTsKK3N0YXRpYyB2b2lkIHpjb25mX2Vycm9yKGNvbnN0IGNoYXIgKmVyciwgLi4uKTsKK3N0YXRpYyB2b2lkIHpjb25mZXJyb3IoY29uc3QgY2hhciAqZXJyKTsKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKHN0cnVjdCBrY29uZl9pZCAqaWQsIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pOworCitzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfaGFzaFsyNTddOworCitzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnRfbWVudSwgKmN1cnJlbnRfZW50cnk7CisKKyNkZWZpbmUgWVlERUJVRyAwCisjaWYgWVlERUJVRworI2RlZmluZSBZWUVSUk9SX1ZFUkJPU0UKKyNlbmRpZgorJX0KKyVleHBlY3QgMjYKKworJXVuaW9uCit7CisJY2hhciAqc3RyaW5nOworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlzdHJ1Y3Qga2NvbmZfaWQgKmlkOworfQorCisldG9rZW4gPGlkPlRfTUFJTk1FTlUKKyV0b2tlbiA8aWQ+VF9NRU5VCisldG9rZW4gPGlkPlRfRU5ETUVOVQorJXRva2VuIDxpZD5UX1NPVVJDRQorJXRva2VuIDxpZD5UX0NIT0lDRQorJXRva2VuIDxpZD5UX0VORENIT0lDRQorJXRva2VuIDxpZD5UX0NPTU1FTlQKKyV0b2tlbiA8aWQ+VF9DT05GSUcKKyV0b2tlbiA8aWQ+VF9NRU5VQ09ORklHCisldG9rZW4gPGlkPlRfSEVMUAorJXRva2VuIDxzdHJpbmc+IFRfSEVMUFRFWFQKKyV0b2tlbiA8aWQ+VF9JRgorJXRva2VuIDxpZD5UX0VORElGCisldG9rZW4gPGlkPlRfREVQRU5EUworJXRva2VuIDxpZD5UX1JFUVVJUkVTCisldG9rZW4gPGlkPlRfT1BUSU9OQUwKKyV0b2tlbiA8aWQ+VF9QUk9NUFQKKyV0b2tlbiA8aWQ+VF9UWVBFCisldG9rZW4gPGlkPlRfREVGQVVMVAorJXRva2VuIDxpZD5UX1NFTEVDVAorJXRva2VuIDxpZD5UX1JBTkdFCisldG9rZW4gPGlkPlRfT04KKyV0b2tlbiA8c3RyaW5nPiBUX1dPUkQKKyV0b2tlbiA8c3RyaW5nPiBUX1dPUkRfUVVPVEUKKyV0b2tlbiBUX1VORVFVQUwKKyV0b2tlbiBUX0NMT1NFX1BBUkVOCisldG9rZW4gVF9PUEVOX1BBUkVOCisldG9rZW4gVF9FT0wKKworJWxlZnQgVF9PUgorJWxlZnQgVF9BTkQKKyVsZWZ0IFRfRVFVQUwgVF9VTkVRVUFMCislbm9uYXNzb2MgVF9OT1QKKworJXR5cGUgPHN0cmluZz4gcHJvbXB0CisldHlwZSA8c3ltYm9sPiBzeW1ib2wKKyV0eXBlIDxleHByPiBleHByCisldHlwZSA8ZXhwcj4gaWZfZXhwcgorJXR5cGUgPGlkPiBlbmQKKyV0eXBlIDxpZD4gb3B0aW9uX25hbWUKKyV0eXBlIDxtZW51PiBpZl9lbnRyeSBtZW51X2VudHJ5IGNob2ljZV9lbnRyeQorCislZGVzdHJ1Y3RvciB7CisJZnByaW50ZihzdGRlcnIsICIlczolZDogbWlzc2luZyBlbmQgc3RhdGVtZW50IGZvciB0aGlzIGVudHJ5XG4iLAorCQkkJC0+ZmlsZS0+bmFtZSwgJCQtPmxpbmVubyk7CisJaWYgKGN1cnJlbnRfbWVudSA9PSAkJCkKKwkJbWVudV9lbmRfbWVudSgpOworfSBpZl9lbnRyeSBtZW51X2VudHJ5IGNob2ljZV9lbnRyeQorCisleworI2luY2x1ZGUgInpjb25mLmhhc2guYyIKKyV9CisKKyUlCitpbnB1dDogc3RtdF9saXN0OworCitzdG10X2xpc3Q6CisJICAvKiBlbXB0eSAqLworCXwgc3RtdF9saXN0IGNvbW1vbl9zdG10CisJfCBzdG10X2xpc3QgY2hvaWNlX3N0bXQKKwl8IHN0bXRfbGlzdCBtZW51X3N0bXQKKwl8IHN0bXRfbGlzdCBUX01BSU5NRU5VIHByb21wdCBubAorCXwgc3RtdF9saXN0IGVuZAkJCXsgemNvbmZfZXJyb3IoInVuZXhwZWN0ZWQgZW5kIHN0YXRlbWVudCIpOyB9CisJfCBzdG10X2xpc3QgVF9XT1JEIGVycm9yIFRfRU9MCXsgemNvbmZfZXJyb3IoInVua25vd24gc3RhdGVtZW50IFwiJXNcIiIsICQyKTsgfQorCXwgc3RtdF9saXN0IG9wdGlvbl9uYW1lIGVycm9yIFRfRU9MCit7CisJemNvbmZfZXJyb3IoInVuZXhwZWN0ZWQgb3B0aW9uIFwiJXNcIiIsIGtjb25mX2lkX3N0cmluZ3MgKyAkMi0+bmFtZSk7Cit9CisJfCBzdG10X2xpc3QgZXJyb3IgVF9FT0wJCXsgemNvbmZfZXJyb3IoImludmFsaWQgc3RhdGVtZW50Iik7IH0KKzsKKworb3B0aW9uX25hbWU6CisJVF9ERVBFTkRTIHwgVF9QUk9NUFQgfCBUX1RZUEUgfCBUX1NFTEVDVCB8IFRfT1BUSU9OQUwgfCBUX1JBTkdFIHwgVF9ERUZBVUxUCis7CisKK2NvbW1vbl9zdG10OgorCSAgVF9FT0wKKwl8IGlmX3N0bXQKKwl8IGNvbW1lbnRfc3RtdAorCXwgY29uZmlnX3N0bXQKKwl8IG1lbnVjb25maWdfc3RtdAorCXwgc291cmNlX3N0bXQKKzsKKworb3B0aW9uX2Vycm9yOgorCSAgVF9XT1JEIGVycm9yIFRfRU9MCQl7IHpjb25mX2Vycm9yKCJ1bmtub3duIG9wdGlvbiBcIiVzXCIiLCAkMSk7IH0KKwl8IGVycm9yIFRfRU9MCQkJeyB6Y29uZl9lcnJvcigiaW52YWxpZCBvcHRpb24iKTsgfQorOworCisKKy8qIGNvbmZpZy9tZW51Y29uZmlnIGVudHJ5ICovCisKK2NvbmZpZ19lbnRyeV9zdGFydDogVF9DT05GSUcgVF9XT1JEIFRfRU9MCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cCgkMiwgMCk7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfT1BUSU9OQUw7CisJbWVudV9hZGRfZW50cnkoc3ltKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjb25maWcgJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksICQyKTsKK307CisKK2NvbmZpZ19zdG10OiBjb25maWdfZW50cnlfc3RhcnQgY29uZmlnX29wdGlvbl9saXN0Cit7CisJbWVudV9lbmRfZW50cnkoKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRjb25maWdcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworbWVudWNvbmZpZ19lbnRyeV9zdGFydDogVF9NRU5VQ09ORklHIFRfV09SRCBUX0VPTAoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoJDIsIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudWNvbmZpZyAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgJDIpOworfTsKKworbWVudWNvbmZpZ19zdG10OiBtZW51Y29uZmlnX2VudHJ5X3N0YXJ0IGNvbmZpZ19vcHRpb25fbGlzdAoreworCWlmIChjdXJyZW50X2VudHJ5LT5wcm9tcHQpCisJCWN1cnJlbnRfZW50cnktPnByb21wdC0+dHlwZSA9IFBfTUVOVTsKKwllbHNlCisJCXpjb25mcHJpbnQoIndhcm5pbmc6IG1lbnVjb25maWcgc3RhdGVtZW50IHdpdGhvdXQgcHJvbXB0Iik7CisJbWVudV9lbmRfZW50cnkoKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRjb25maWdcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY29uZmlnX29wdGlvbl9saXN0OgorCSAgLyogZW1wdHkgKi8KKwl8IGNvbmZpZ19vcHRpb25fbGlzdCBjb25maWdfb3B0aW9uCisJfCBjb25maWdfb3B0aW9uX2xpc3QgZGVwZW5kcworCXwgY29uZmlnX29wdGlvbl9saXN0IGhlbHAKKwl8IGNvbmZpZ19vcHRpb25fbGlzdCBvcHRpb25fZXJyb3IKKwl8IGNvbmZpZ19vcHRpb25fbGlzdCBUX0VPTAorOworCitjb25maWdfb3B0aW9uOiBUX1RZUEUgcHJvbXB0X3N0bXRfb3B0IFRfRU9MCit7CisJbWVudV9zZXRfdHlwZSgkMS0+c3R5cGUpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnR5cGUoJXUpXG4iLAorCQl6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLAorCQkkMS0+c3R5cGUpOworfTsKKworY29uZmlnX29wdGlvbjogVF9QUk9NUFQgcHJvbXB0IGlmX2V4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9wcm9tcHQoUF9QUk9NUFQsICQyLCAkMyk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cHJvbXB0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfREVGQVVMVCBleHByIGlmX2V4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9leHByKFBfREVGQVVMVCwgJDIsICQzKTsKKwlpZiAoJDEtPnN0eXBlICE9IFNfVU5LTk9XTikKKwkJbWVudV9zZXRfdHlwZSgkMS0+c3R5cGUpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlZmF1bHQoJXUpXG4iLAorCQl6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLAorCQkkMS0+c3R5cGUpOworfTsKKworY29uZmlnX29wdGlvbjogVF9TRUxFQ1QgVF9XT1JEIGlmX2V4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9zeW1ib2woUF9TRUxFQ1QsIHN5bV9sb29rdXAoJDIsIDApLCAkMyk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6c2VsZWN0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfUkFOR0Ugc3ltYm9sIHN5bWJvbCBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfZXhwcihQX1JBTkdFLCBleHByX2FsbG9jX2NvbXAoRV9SQU5HRSwkMiwgJDMpLCAkNCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cmFuZ2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworLyogY2hvaWNlIGVudHJ5ICovCisKK2Nob2ljZTogVF9DSE9JQ0UgVF9FT0wKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKE5VTEwsIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIT0lDRTsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCW1lbnVfYWRkX2V4cHIoUF9DSE9JQ0UsIE5VTEwsIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNob2ljZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjaG9pY2VfZW50cnk6IGNob2ljZSBjaG9pY2Vfb3B0aW9uX2xpc3QKK3sKKwkkJCA9IG1lbnVfYWRkX21lbnUoKTsKK307CisKK2Nob2ljZV9lbmQ6IGVuZAoreworCWlmICh6Y29uZl9lbmR0b2tlbigkMSwgVF9DSE9JQ0UsIFRfRU5EQ0hPSUNFKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNob2ljZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorfTsKKworY2hvaWNlX3N0bXQ6IGNob2ljZV9lbnRyeSBjaG9pY2VfYmxvY2sgY2hvaWNlX2VuZAorOworCitjaG9pY2Vfb3B0aW9uX2xpc3Q6CisJICAvKiBlbXB0eSAqLworCXwgY2hvaWNlX29wdGlvbl9saXN0IGNob2ljZV9vcHRpb24KKwl8IGNob2ljZV9vcHRpb25fbGlzdCBkZXBlbmRzCisJfCBjaG9pY2Vfb3B0aW9uX2xpc3QgaGVscAorCXwgY2hvaWNlX29wdGlvbl9saXN0IFRfRU9MCisJfCBjaG9pY2Vfb3B0aW9uX2xpc3Qgb3B0aW9uX2Vycm9yCis7CisKK2Nob2ljZV9vcHRpb246IFRfUFJPTVBUIHByb21wdCBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAkMiwgJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjaG9pY2Vfb3B0aW9uOiBUX1RZUEUgcHJvbXB0X3N0bXRfb3B0IFRfRU9MCit7CisJaWYgKCQxLT5zdHlwZSA9PSBTX0JPT0xFQU4gfHwgJDEtPnN0eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJbWVudV9zZXRfdHlwZSgkMS0+c3R5cGUpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDp0eXBlKCV1KVxuIiwKKwkJCXpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksCisJCQkkMS0+c3R5cGUpOworCX0gZWxzZQorCQlZWUVSUk9SOworfTsKKworY2hvaWNlX29wdGlvbjogVF9PUFRJT05BTCBUX0VPTAoreworCWN1cnJlbnRfZW50cnktPnN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm9wdGlvbmFsXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2Nob2ljZV9vcHRpb246IFRfREVGQVVMVCBUX1dPUkQgaWZfZXhwciBUX0VPTAoreworCWlmICgkMS0+c3R5cGUgPT0gU19VTktOT1dOKSB7CisJCW1lbnVfYWRkX3N5bWJvbChQX0RFRkFVTFQsIHN5bV9sb29rdXAoJDIsIDApLCAkMyk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlZmF1bHRcbiIsCisJCQl6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9IGVsc2UKKwkJWVlFUlJPUjsKK307CisKK2Nob2ljZV9ibG9jazoKKwkgIC8qIGVtcHR5ICovCisJfCBjaG9pY2VfYmxvY2sgY29tbW9uX3N0bXQKKzsKKworLyogaWYgZW50cnkgKi8KKworaWZfZW50cnk6IFRfSUYgZXhwciBubAoreworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmlmXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwltZW51X2FkZF9lbnRyeShOVUxMKTsKKwltZW51X2FkZF9kZXAoJDIpOworCSQkID0gbWVudV9hZGRfbWVudSgpOworfTsKKworaWZfZW5kOiBlbmQKK3sKKwlpZiAoemNvbmZfZW5kdG9rZW4oJDEsIFRfSUYsIFRfRU5ESUYpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kaWZcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KK307CisKK2lmX3N0bXQ6IGlmX2VudHJ5IGlmX2Jsb2NrIGlmX2VuZAorOworCitpZl9ibG9jazoKKwkgIC8qIGVtcHR5ICovCisJfCBpZl9ibG9jayBjb21tb25fc3RtdAorCXwgaWZfYmxvY2sgbWVudV9zdG10CisJfCBpZl9ibG9jayBjaG9pY2Vfc3RtdAorOworCisvKiBtZW51IGVudHJ5ICovCisKK21lbnU6IFRfTUVOVSBwcm9tcHQgVF9FT0wKK3sKKwltZW51X2FkZF9lbnRyeShOVUxMKTsKKwltZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAkMiwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCittZW51X2VudHJ5OiBtZW51IGRlcGVuZHNfbGlzdAoreworCSQkID0gbWVudV9hZGRfbWVudSgpOworfTsKKworbWVudV9lbmQ6IGVuZAoreworCWlmICh6Y29uZl9lbmR0b2tlbigkMSwgVF9NRU5VLCBUX0VORE1FTlUpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kbWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorfTsKKworbWVudV9zdG10OiBtZW51X2VudHJ5IG1lbnVfYmxvY2sgbWVudV9lbmQKKzsKKworbWVudV9ibG9jazoKKwkgIC8qIGVtcHR5ICovCisJfCBtZW51X2Jsb2NrIGNvbW1vbl9zdG10CisJfCBtZW51X2Jsb2NrIG1lbnVfc3RtdAorCXwgbWVudV9ibG9jayBjaG9pY2Vfc3RtdAorOworCitzb3VyY2Vfc3RtdDogVF9TT1VSQ0UgcHJvbXB0IFRfRU9MCit7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6c291cmNlICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCAkMik7CisJemNvbmZfbmV4dGZpbGUoJDIpOworfTsKKworLyogY29tbWVudCBlbnRyeSAqLworCitjb21tZW50OiBUX0NPTU1FTlQgcHJvbXB0IFRfRU9MCit7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfcHJvbXB0KFBfQ09NTUVOVCwgJDIsIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNvbW1lbnRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY29tbWVudF9zdG10OiBjb21tZW50IGRlcGVuZHNfbGlzdAoreworCW1lbnVfZW5kX2VudHJ5KCk7Cit9OworCisvKiBoZWxwIG9wdGlvbiAqLworCitoZWxwX3N0YXJ0OiBUX0hFTFAgVF9FT0wKK3sKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpoZWxwXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl6Y29uZl9zdGFydGhlbHAoKTsKK307CisKK2hlbHA6IGhlbHBfc3RhcnQgVF9IRUxQVEVYVAoreworCWN1cnJlbnRfZW50cnktPnN5bS0+aGVscCA9ICQyOworfTsKKworLyogZGVwZW5kcyBvcHRpb24gKi8KKworZGVwZW5kc19saXN0OgorCSAgLyogZW1wdHkgKi8KKwl8IGRlcGVuZHNfbGlzdCBkZXBlbmRzCisJfCBkZXBlbmRzX2xpc3QgVF9FT0wKKwl8IGRlcGVuZHNfbGlzdCBvcHRpb25fZXJyb3IKKzsKKworZGVwZW5kczogVF9ERVBFTkRTIFRfT04gZXhwciBUX0VPTAoreworCW1lbnVfYWRkX2RlcCgkMyk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVwZW5kcyBvblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9CisJfCBUX0RFUEVORFMgZXhwciBUX0VPTAoreworCW1lbnVfYWRkX2RlcCgkMik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVwZW5kc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9CisJfCBUX1JFUVVJUkVTIGV4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9kZXAoJDIpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnJlcXVpcmVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKKy8qIHByb21wdCBzdGF0ZW1lbnQgKi8KKworcHJvbXB0X3N0bXRfb3B0OgorCSAgLyogZW1wdHkgKi8KKwl8IHByb21wdCBpZl9leHByCit7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAkMSwgJDIpOworfTsKKworcHJvbXB0OgkgIFRfV09SRAorCXwgVF9XT1JEX1FVT1RFCis7CisKK2VuZDoJICBUX0VORE1FTlUgVF9FT0wJeyAkJCA9ICQxOyB9CisJfCBUX0VORENIT0lDRSBUX0VPTAl7ICQkID0gJDE7IH0KKwl8IFRfRU5ESUYgVF9FT0wJCXsgJCQgPSAkMTsgfQorOworCitubDoKKwkgIFRfRU9MCisJfCBubCBUX0VPTAorOworCitpZl9leHByOiAgLyogZW1wdHkgKi8JCQl7ICQkID0gTlVMTDsgfQorCXwgVF9JRiBleHByCQkJeyAkJCA9ICQyOyB9Cis7CisKK2V4cHI6CSAgc3ltYm9sCQkJCXsgJCQgPSBleHByX2FsbG9jX3N5bWJvbCgkMSk7IH0KKwl8IHN5bWJvbCBUX0VRVUFMIHN5bWJvbAkJCXsgJCQgPSBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgJDEsICQzKTsgfQorCXwgc3ltYm9sIFRfVU5FUVVBTCBzeW1ib2wJCXsgJCQgPSBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCAkMSwgJDMpOyB9CisJfCBUX09QRU5fUEFSRU4gZXhwciBUX0NMT1NFX1BBUkVOCXsgJCQgPSAkMjsgfQorCXwgVF9OT1QgZXhwcgkJCQl7ICQkID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsICQyKTsgfQorCXwgZXhwciBUX09SIGV4cHIJCQl7ICQkID0gZXhwcl9hbGxvY190d28oRV9PUiwgJDEsICQzKTsgfQorCXwgZXhwciBUX0FORCBleHByCQkJeyAkJCA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCAkMSwgJDMpOyB9Cis7CisKK3N5bWJvbDoJICBUX1dPUkQJeyAkJCA9IHN5bV9sb29rdXAoJDEsIDApOyBmcmVlKCQxKTsgfQorCXwgVF9XT1JEX1FVT1RFCXsgJCQgPSBzeW1fbG9va3VwKCQxLCAxKTsgZnJlZSgkMSk7IH0KKzsKKworJSUKKwordm9pZCBjb25mX3BhcnNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJemNvbmZfaW5pdHNjYW4obmFtZSk7CisKKwlzeW1faW5pdCgpOworCW1lbnVfaW5pdCgpOworCW1vZHVsZXNfc3ltID0gc3ltX2xvb2t1cCgiTU9EVUxFUyIsIDApOworCXJvb3RtZW51LnByb21wdCA9IG1lbnVfYWRkX3Byb21wdChQX01FTlUsICJCdXN5Ym94IENvbmZpZ3VyYXRpb24iLCBOVUxMKTsKKworI2lmIFlZREVCVUcKKwlpZiAoZ2V0ZW52KCJaQ09ORl9ERUJVRyIpKQorCQl6Y29uZmRlYnVnID0gMTsKKyNlbmRpZgorCXpjb25mcGFyc2UoKTsKKwlpZiAoemNvbmZuZXJycykKKwkJZXhpdCgxKTsKKwltZW51X2ZpbmFsaXplKCZyb290bWVudSk7CisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgeworCQlzeW1fY2hlY2tfZGVwcyhzeW0pOworCX0KKworCXN5bV9jaGFuZ2VfY291bnQgPSAxOworfQorCitjb25zdCBjaGFyICp6Y29uZl90b2tlbm5hbWUoaW50IHRva2VuKQoreworCXN3aXRjaCAodG9rZW4pIHsKKwljYXNlIFRfTUVOVToJCXJldHVybiAibWVudSI7CisJY2FzZSBUX0VORE1FTlU6CQlyZXR1cm4gImVuZG1lbnUiOworCWNhc2UgVF9DSE9JQ0U6CQlyZXR1cm4gImNob2ljZSI7CisJY2FzZSBUX0VORENIT0lDRToJcmV0dXJuICJlbmRjaG9pY2UiOworCWNhc2UgVF9JRjoJCXJldHVybiAiaWYiOworCWNhc2UgVF9FTkRJRjoJCXJldHVybiAiZW5kaWYiOworCWNhc2UgVF9ERVBFTkRTOgkJcmV0dXJuICJkZXBlbmRzIjsKKwl9CisJcmV0dXJuICI8dG9rZW4+IjsKK30KKworc3RhdGljIGJvb2wgemNvbmZfZW5kdG9rZW4oc3RydWN0IGtjb25mX2lkICppZCwgaW50IHN0YXJ0dG9rZW4sIGludCBlbmR0b2tlbikKK3sKKwlpZiAoaWQtPnRva2VuICE9IGVuZHRva2VuKSB7CisJCXpjb25mX2Vycm9yKCJ1bmV4cGVjdGVkICclcycgd2l0aGluICVzIGJsb2NrIiwKKwkJCWtjb25mX2lkX3N0cmluZ3MgKyBpZC0+bmFtZSwgemNvbmZfdG9rZW5uYW1lKHN0YXJ0dG9rZW4pKTsKKwkJemNvbmZuZXJycysrOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChjdXJyZW50X21lbnUtPmZpbGUgIT0gY3VycmVudF9maWxlKSB7CisJCXpjb25mX2Vycm9yKCInJXMnIGluIGRpZmZlcmVudCBmaWxlIHRoYW4gJyVzJyIsCisJCQlrY29uZl9pZF9zdHJpbmdzICsgaWQtPm5hbWUsIHpjb25mX3Rva2VubmFtZShzdGFydHRva2VuKSk7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IGxvY2F0aW9uIG9mIHRoZSAnJXMnXG4iLAorCQkJY3VycmVudF9tZW51LT5maWxlLT5uYW1lLCBjdXJyZW50X21lbnUtPmxpbmVubywKKwkJCXpjb25mX3Rva2VubmFtZShzdGFydHRva2VuKSk7CisJCXpjb25mbmVycnMrKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJZnByaW50ZihzdGRlcnIsICIlczolZDogIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJdmFfc3RhcnQoYXAsIGVycik7CisJdmZwcmludGYoc3RkZXJyLCBlcnIsIGFwKTsKKwl2YV9lbmQoYXApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXpjb25mbmVycnMrKzsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiAiLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl2YV9zdGFydChhcCwgZXJyKTsKKwl2ZnByaW50ZihzdGRlcnIsIGVyciwgYXApOworCXZhX2VuZChhcCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycikKK3sKKyNpZiBZWURFQlVHCisJZnByaW50ZihzdGRlcnIsICIlczolZDogJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkgKyAxLCBlcnIpOworI2VuZGlmCit9CisKK3ZvaWQgcHJpbnRfcXVvdGVkX3N0cmluZyhGSUxFICpvdXQsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpwOworCWludCBsZW47CisKKwlwdXRjKCciJywgb3V0KTsKKwl3aGlsZSAoKHAgPSBzdHJjaHIoc3RyLCAnIicpKSkgeworCQlsZW4gPSBwIC0gc3RyOworCQlpZiAobGVuKQorCQkJZnByaW50ZihvdXQsICIlLipzIiwgbGVuLCBzdHIpOworCQlmcHV0cygiXFxcIiIsIG91dCk7CisJCXN0ciA9IHAgKyAxOworCX0KKwlmcHV0cyhzdHIsIG91dCk7CisJcHV0YygnIicsIG91dCk7Cit9CisKK3ZvaWQgcHJpbnRfc3ltYm9sKEZJTEUgKm91dCwgc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCisJCWZwcmludGYob3V0LCAiY2hvaWNlXG4iKTsKKwllbHNlCisJCWZwcmludGYob3V0LCAiY29uZmlnICVzXG4iLCBzeW0tPm5hbWUpOworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJCWZwdXRzKCIgIGJvb2xlYW5cbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19UUklTVEFURToKKwkJZnB1dHMoIiAgdHJpc3RhdGVcbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19TVFJJTkc6CisJCWZwdXRzKCIgIHN0cmluZ1xuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX0lOVDoKKwkJZnB1dHMoIiAgaW50ZWdlclxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX0hFWDoKKwkJZnB1dHMoIiAgaGV4XG4iLCBvdXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHV0cygiICA/Pz9cbiIsIG91dCk7CisJCWJyZWFrOworCX0KKwlmb3IgKHByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCWlmIChwcm9wLT5tZW51ICE9IG1lbnUpCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCWNhc2UgUF9QUk9NUFQ6CisJCQlmcHV0cygiICBwcm9tcHQgIiwgb3V0KTsKKwkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgaWYgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQl9CisJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgUF9ERUZBVUxUOgorCQkJZnB1dHMoICIgIGRlZmF1bHQgIiwgb3V0KTsKKwkJCWV4cHJfZnByaW50KHByb3AtPmV4cHIsIG91dCk7CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiIGlmICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJfQorCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIFBfQ0hPSUNFOgorCQkJZnB1dHMoIiAgI2Nob2ljZSB2YWx1ZVxuIiwgb3V0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihvdXQsICIgIHVua25vd24gcHJvcCAlZCFcbiIsIHByb3AtPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHN5bS0+aGVscCkgeworCQlpbnQgbGVuID0gc3RybGVuKHN5bS0+aGVscCk7CisJCXdoaWxlIChzeW0tPmhlbHBbLS1sZW5dID09ICdcbicpCisJCQlzeW0tPmhlbHBbbGVuXSA9IDA7CisJCWZwcmludGYob3V0LCAiICBoZWxwXG4lc1xuIiwgc3ltLT5oZWxwKTsKKwl9CisJZnB1dGMoJ1xuJywgb3V0KTsKK30KKwordm9pZCB6Y29uZmR1bXAoRklMRSAqb3V0KQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IG1lbnUgKm1lbnU7CisKKwltZW51ID0gcm9vdG1lbnUubGlzdDsKKwl3aGlsZSAobWVudSkgeworCQlpZiAoKHN5bSA9IG1lbnUtPnN5bSkpCisJCQlwcmludF9zeW1ib2wob3V0LCBtZW51KTsKKwkJZWxzZSBpZiAoKHByb3AgPSBtZW51LT5wcm9tcHQpKSB7CisJCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJCWNhc2UgUF9DT01NRU5UOgorCQkJCWZwdXRzKCJcbmNvbW1lbnQgIiwgb3V0KTsKKwkJCQlwcmludF9xdW90ZWRfc3RyaW5nKG91dCwgcHJvcC0+dGV4dCk7CisJCQkJZnB1dHMoIlxuIiwgb3V0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUF9NRU5VOgorCQkJCWZwdXRzKCJcbm1lbnUgIiwgb3V0KTsKKwkJCQlwcmludF9xdW90ZWRfc3RyaW5nKG91dCwgcHJvcC0+dGV4dCk7CisJCQkJZnB1dHMoIlxuIiwgb3V0KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJOworCQkJfQorCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiAgZGVwZW5kcyAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJfQorCQkJZnB1dHMoIlxuIiwgb3V0KTsKKwkJfQorCisJCWlmIChtZW51LT5saXN0KQorCQkJbWVudSA9IG1lbnUtPmxpc3Q7CisJCWVsc2UgaWYgKG1lbnUtPm5leHQpCisJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJZWxzZSB3aGlsZSAoKG1lbnUgPSBtZW51LT5wYXJlbnQpKSB7CisJCQlpZiAobWVudS0+cHJvbXB0ICYmIG1lbnUtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpCisJCQkJZnB1dHMoIlxuZW5kbWVudVxuIiwgb3V0KTsKKwkJCWlmIChtZW51LT5uZXh0KSB7CisJCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKyNpbmNsdWRlICJsZXguemNvbmYuYyIKKyNpbmNsdWRlICJ1dGlsLmMiCisjaW5jbHVkZSAiY29uZmRhdGEuYyIKKyNpbmNsdWRlICJleHByLmMiCisjaW5jbHVkZSAic3ltYm9sLmMiCisjaW5jbHVkZSAibWVudS5jIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9tZW11c2FnZSBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvbWVtdXNhZ2UKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGVmNTYwOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvbWVtdXNhZ2UKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCisKK2J1c3lib3g9Li4vYnVzeWJveAorCitpPTQwMDAKK2VjaG8gIkJlZm9yZSB3ZSBzdGFydGVkICRpIGNvcGllcyBvZiAnJGJ1c3lib3ggc2xlZXAgMTAnOiIKKyRidXN5Ym94IG5tZXRlciAnJXQgJVtwbl0gJW0nIHwgaGVhZCAtMworCit3aGlsZSB0ZXN0ICRpICE9IDA7IGRvCisgICAgJGJ1c3lib3ggc2xlZXAgMTAgJgorICAgIGk9JCgoaS0xKSkKK2RvbmUKK3NsZWVwIDEKKworZWNobyAiQWZ0ZXI6IgorJGJ1c3lib3ggbm1ldGVyICcldCAlW3BuXSAlbScgfCBoZWFkIC0zCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL21rY29uZmlncyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvbWtjb25maWdzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiOTRmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL21rY29uZmlncwpAQCAtMCwwICsxLDc2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAyIEtoYWxpZCBBeml6IDxraGFsaWRfYXppeiBhdCBocC5jb20+CisjIENvcHlyaWdodCAoQykgMjAwMiBSYW5keSBEdW5sYXAgPHJkZHVubGFwIGF0IG9zZGwub3JnPgorIyBDb3B5cmlnaHQgKEMpIDIwMDIgQWwgU3RvbmUgPGFoczMgYXQgZmMuaHAuY29tPgorIyBDb3B5cmlnaHQgKEMpIDIwMDIgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyAgIEJ1c3lib3ggdmVyc2lvbiBieSBNYXR0ZW8gQ3JvY2UgPDMyOTc2Mjc3OTkgYXQgd2luZC5pdD4KKyMKKyMgUnVsZXMgdG8gZ2VuZXJhdGUgYmJjb25maWdvcHRzLmggZnJvbSAuY29uZmlnOgorIyAgICAgIC0gUmV0YWluIGxpbmVzIHRoYXQgYmVnaW4gd2l0aCAiQ09ORklHXyIKKyMgICAgICAtIFJldGFpbiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggIiMgQ09ORklHXyIKKyMgICAgICAtIGxpbmVzIHRoYXQgdXNlIGRvdWJsZS1xdW90ZXMgbXVzdCBcXC1lc2NhcGUtcXVvdGUgdGhlbQorCitjb25maWc9LmNvbmZpZworCit7CitlY2hvICJcCisjaWZuZGVmIF9CQkNPTkZJR09QVFNfSAorI2RlZmluZSBfQkJDT05GSUdPUFRTX0gKKy8qCisgKiBidXN5Ym94IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgc2NyaXB0cy9ta2NvbmZpZ3MuCisgKiBEbyBub3QgZWRpdC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgYmJjb25maWdfY29uZmlnW10gQUxJR04xID0iCisKK2dyZXAgLWUgJ14jIENPTkZJR18nIC1lICdeQ09ORklHXycgIiRjb25maWciIFwKK3wgc2VkIC1lICdzL1wiL1xcXCIvZycgLWUgJ3MvXi8iLycgLWUgJ3MvJC9cXG4iLycKKworZWNobyAiOyIKK2VjaG8gIiNlbmRpZiIKK30gPiIkMSIKKworeworZWNobyAiXAorI2lmbmRlZiBfQkJDT05GSUdPUFRTX0JaMl9ICisjZGVmaW5lIF9CQkNPTkZJR09QVFNfQloyX0gKKy8qCisgKiBidXN5Ym94IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgc2NyaXB0cy9ta2NvbmZpZ3MuCisgKiBEbyBub3QgZWRpdC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgYmJjb25maWdfY29uZmlnX2J6MltdIEFMSUdOMSA9IHsiCisKK2dyZXAgLWUgJ14jIENPTkZJR18nIC1lICdeQ09ORklHXycgIiRjb25maWciIFwKK3wgYnppcDIgLTEgfCBkZCBicz0yIHNraXA9MSAyPi9kZXYvbnVsbCBcCit8IG9kIC12IC10IHgxIFwKK3wgc2VkIC1lICdzL15bXiBdKi8vJyBcCisgICAgICAgIC1lICdzLyAvL2cnIFwKKyAgICAgICAgLWUgJy9eJC9kJyBcCisgICAgICAgIC1lICdzL1woLi5cKS8weFwxLC9nJworCitlY2hvICJ9OyIKK2VjaG8gIiNlbmRpZiIKK30gPiIkMiIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvbWtkaWZmX29iaiBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvbWtkaWZmX29iagpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMDc0NzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9ta2RpZmZfb2JqCkBAIC0wLDAgKzEsNDYgQEAKKyMhL2Jpbi9zaAorCit1c2FnZSgpIHsKKwllY2hvICJVc2FnZTogJHswIyMqL30gRElSMSBESVIyIgorCWVjaG8KKwllY2hvICJDb21wYXJlcyBhbGwgb2JqZWN0IGZpbGVzIHJlY3Vyc2l2ZWx0eSBmb3VuZCBpbiBESVIxIGFuZCBESVIyLiIKKwllY2hvICJQcmludHMgZGlmZiBvZiB0aGVpciBkaXNhc3NlbWJseS4iCisJZWNobworCWV4aXQgJDEKK30KKworZmlsdGVyKCkgeworCSMgc2VkIHJlbW92ZXMgIiBhZGRyZXNzOiAiIHByZWZpeGVzIHdoaWNoIG1lc3MgdXAgZGlmZgorCXNlZCAkJ3MvXlxcKFx0KlxcKVsgXSpbMC05YS1mXVswLTlhLWZdKjpbIFx0XSovXFwxLycgXAorCXwgc2VkICdzL19fR0lfLy9nJworfQorCit0ZXN0IC1kICIkMSIgfHwgdXNhZ2UgMQordGVzdCAtZCAiJDIiIHx8IHVzYWdlIDEKKworeworCSgKKwkJY2QgIiQxIiB8fCBleGl0IDEKKwkJZmluZCAtbmFtZSAnKi5vJyAjIC1vIC1uYW1lICcqLm9zJyAjIC1vIC1uYW1lICcqLnNvJworCSkKKwkoCisJCWNkICIkMiIgfHwgZXhpdCAxCisJCWZpbmQgLW5hbWUgJyoubycgIyAtbyAtbmFtZSAnKi5vcycgIyAtbyAtbmFtZSAnKi5zbycKKwkpCit9IHwgc2VkICdzOl5cLi86OicgfCBzb3J0IHwgdW5pcSB8IFwKKygKK3doaWxlIElGUz0nJyByZWFkIC1yIG9uYW1lOyBkbworCWlmICEgdGVzdCAtZiAiJDEvJG9uYW1lIjsgdGhlbgorCQllY2hvICJPbmx5ICQyLyRvbmFtZSIKKwkJY29udGludWUKKwlmaQorCWlmICEgdGVzdCAtZiAiJDIvJG9uYW1lIjsgdGhlbgorCQllY2hvICJPbmx5ICQxLyRvbmFtZSIKKwkJY29udGludWUKKwlmaQorCWRpZmYgLXEgLS0gIiQxLyRvbmFtZSIgIiQyLyRvbmFtZSIgPi9kZXYvbnVsbCAmJiBjb250aW51ZQorCShjZCAiJDEiICYmIHsgc2l6ZSAiJG9uYW1lIjsgb2JqZHVtcCAtZHIgIiRvbmFtZSIgfCBmaWx0ZXI7IH0gPiIkb25hbWUuZGlzYXNtIikKKwkoY2QgIiQyIiAmJiB7IHNpemUgIiRvbmFtZSI7IG9iamR1bXAgLWRyICIkb25hbWUiIHwgZmlsdGVyOyB9ID4iJG9uYW1lLmRpc2FzbSIpCisJZGlmZiAtdSAtLSAiJDEvJG9uYW1lLmRpc2FzbSIgIiQyLyRvbmFtZS5kaXNhc20iCitkb25lCispCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL21rZGlmZl9vYmpfYmxvYXQgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL21rZGlmZl9vYmpfYmxvYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjNiMmMyZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvbWtkaWZmX29ial9ibG9hdApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKwordGVzdCAtZCAiJDEiIHx8IGV4aXQgMQordGVzdCAtZCAiJDIiIHx8IGV4aXQgMQorCit7CisJKAorCQljZCAiJDEiIHx8IGV4aXQgMQorCQlmaW5kIC1uYW1lICcqLm8nIC1vIC1uYW1lICcqLm9zJyAjIC1vIC1uYW1lICcqLnNvJworCSkKKwkoCisJCWNkICIkMiIgfHwgZXhpdCAxCisJCWZpbmQgLW5hbWUgJyoubycgLW8gLW5hbWUgJyoub3MnICMgLW8gLW5hbWUgJyouc28nCisJKQorfSB8IHNlZCAnczpeXC4vOjonIHwgc29ydCB8IHVuaXEgfCBcCit0ZWUgTFNUIHwgXAorKAorSUZTPScnCit3aGlsZSByZWFkIC1yIG9uYW1lOyBkbworCWlmICEgdGVzdCAtZiAiJDEvJG9uYW1lIjsgdGhlbgorCQllY2hvICJPbmx5ICQyLyRvbmFtZSIKKwkJY29udGludWUKKwlmaQorCWlmICEgdGVzdCAtZiAiJDIvJG9uYW1lIjsgdGhlbgorCQllY2hvICJPbmx5ICQxLyRvbmFtZSIKKwkJY29udGludWUKKwlmaQorCSQxL3NjcmlwdHMvYmxvYXQtby1tZXRlciAkMS8kb25hbWUgJDIvJG9uYW1lIHwgZ3JlcCAnb3RhbDogMCBieXRlJyA+L2Rldi9udWxsICYmIGNvbnRpbnVlCisJJDEvc2NyaXB0cy9ibG9hdC1vLW1ldGVyICQxLyRvbmFtZSAkMi8kb25hbWUKKwlzaXplICQxLyRvbmFtZSAkMi8kb25hbWUKKwllY2hvCitkb25lCispCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL21rbWFrZWZpbGUgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL21rbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWZjNTFhNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvbWttYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACisjIS9iaW4vc2gKKyMgR2VuZXJhdGVzIGEgc21hbGwgTWFrZWZpbGUgdXNlZCBpbiB0aGUgcm9vdCBvZiB0aGUgb3V0cHV0CisjIGRpcmVjdG9yeSwgdG8gYWxsb3cgbWFrZSB0byBiZSBzdGFydGVkIGZyb20gdGhlcmUuCisjIFRoZSBNYWtlZmlsZSBhbHNvIGFsbG93IGZvciBtb3JlIGNvbnZpbmllbnQgYnVpbGQgb2YgZXh0ZXJuYWwgbW9kdWxlcworCisjIFVzYWdlCisjICQxIC0gS2VybmVsIHNyYyBkaXJlY3RvcnkKKyMgJDIgLSBPdXRwdXQgZGlyZWN0b3J5CisjICQzIC0gdmVyc2lvbgorIyAkNCAtIHBhdGNobGV2ZWwKKworCit0ZXN0ICEgLXIgJDIvTWFrZWZpbGUgLW8gLU8gJDIvTWFrZWZpbGUgfHwgZXhpdCAwCitlY2hvICIgIEdFTiAgICAgJDIvTWFrZWZpbGUiCisKK2NhdCA8PCBFT0YgPiAkMi9NYWtlZmlsZQorIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAkMDogZG9uJ3QgZWRpdAorCitWRVJTSU9OID0gJDMKK1BBVENITEVWRUwgPSAkNAorCitLRVJORUxTUkMgICAgOj0gJDEKK0tFUk5FTE9VVFBVVCA6PSAkMgorCitNQUtFRkxBR1MgKz0gLS1uby1wcmludC1kaXJlY3RvcnkKKworLlBIT05ZOiBhbGwgXCQoTUFLRUNNREdPQUxTKQorCithbGw6CisJXCQoTUFLRSkgLUMgXCQoS0VSTkVMU1JDKSBPPVwkKEtFUk5FTE9VVFBVVCkKKworTWFrZWZpbGU6OworCitcJChmaWx0ZXItb3V0IGFsbCBNYWtlZmlsZSxcJChNQUtFQ01ER09BTFMpKToKKwlcJChNQUtFKSAtQyBcJChLRVJORUxTUkMpIE89XCQoS0VSTkVMT1VUUFVUKSBcJEAKKworJS86CisJXCQoTUFLRSkgLUMgXCQoS0VSTkVMU1JDKSBPPVwkKEtFUk5FTE9VVFBVVCkgXCRACitFT0YKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvb2Jqc2l6ZXMgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL29ianNpemVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkZjBjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL29ianNpemVzCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorCit0X3RleHQ9MAordF9kYXRhPTAKK3RfYnNzPTAKKworcHJpbnRmICIlOXMgJTExcyAlOXMgJTlzICVzXG4iICJ0ZXh0K2RhdGEiICJ0ZXh0K3JvZGF0YSIgcndkYXRhIGJzcyBmaWxlbmFtZQorCitmaW5kIC1uYW1lICcqLm8nIHwgZ3JlcCAtdiAnXlwuL3NjcmlwdHMvJyB8IGdyZXAgLXZGIGJ1aWx0LWluLm8gXAorfCBzZWQgJ3M6XlwuLzo6JyB8IHhhcmdzICIke0NST1NTX0NPTVBJTEV9c2l6ZSIgfCBncmVwICdeICpbMC05XScgXAorfCB7Cit3aGlsZSByZWFkIHRleHQgZGF0YSBic3MgZGVjIGhleCBmaWxlbmFtZTsgZG8KKyAgICB0X3RleHQ9JCgodF90ZXh0K3RleHQpKQorICAgIHRfZGF0YT0kKCh0X2RhdGErZGF0YSkpCisgICAgdF9ic3M9JCgodF9ic3MrYnNzKSkKKyAgICBwcmludGYgIiU5ZCAlMTFkICU5ZCAlOWQgJXNcbiIgJCgodGV4dCtkYXRhKSkgJHRleHQgJGRhdGEgJGJzcyAiJGZpbGVuYW1lIgorZG9uZQorcHJpbnRmICIlOWQgJTExZCAlOWQgJTlkICVzXG4iICQoKHRfdGV4dCt0X2RhdGEpKSAkdF90ZXh0ICR0X2RhdGEgJHRfYnNzICJUT1RBTCIKK30gfCBlbnYgLXVMQU5HIC11TENfQUxMIHNvcnQgLXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvcmFuZG9tdGVzdCBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvcmFuZG9tdGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMTAyNTkzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9yYW5kb210ZXN0CkBAIC0wLDAgKzEsOTYgQEAKKyMhL2Jpbi9zaAorCisjIElmIG5vdCBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQuLi4KK2lmICEgdGVzdCAiJExJQkMiOyB0aGVuCisJIyBTZWxlY3Qgd2hpY2ggbGliYyB0byBidWlsZCBhZ2FpbnN0CisJTElCQz0iZ2xpYmMiCisJTElCQz0idWNsaWJjIgorZmkKKyMgeDg2IDMyLWJpdDoKKyNDUk9TU19DT01QSUxFUl9QUkVGSVg9Imk0ODYtbGludXgtdWNsaWJjLSIKKyMgTXkgc3lzdGVtIGhhcyBzdHJhbmdlIHByZWZpeCBmb3IgeDg2IDY0LWJpdCB1Y2xpYmM6CisjQ1JPU1NfQ09NUElMRVJfUFJFRklYPSJ4ODZfNjQtcGMtbGludXgtZ251LSIKKworaWYgdGVzdCAkIyAtbHQgMiB8fCAhIHRlc3QgLWQgIiQxIiB8fCB0ZXN0IC1lICIkMiI7IHRoZW4KKwllY2hvICJVc2FnZTogJDAgU1JDX0RJUiBUTVBfRElSIgorCWVjaG8KKwllY2hvICJTUkNfRElSIHdpbGwgYmUgY29waWVkIHRvIFRNUF9ESVIgZGlyZWN0b3J5LiIKKwllY2hvICJUaGVuIGEgcmFuZG9tIGJ1aWxkIHdpbGwgYmUgcGVyZm9ybWVkLiIKKwllY2hvCisJZWNobyAiVXNlZnVsIHZhcmlhYmxlczoiCisJZWNobyAiXCRMSUJDLCBcJENST1NTX0NPTVBJTEVSX1BSRUZJWCwgXCRNQUtFT1BUUyIKKwlleGl0IDEKK2ZpCisKK2NwIC1kcHIgLS0gIiQxIiAiJDIiIHx8IHsgZWNobyAiY29weSBlcnJvciI7IGV4aXQgMTsgfQorY2QgLS0gIiQyIiB8fCB7IGVjaG8gImNkICRkaXIgZXJyb3IiOyBleGl0IDE7IH0KKworIyBHZW5lcmF0ZSByYW5kb20gY29uZmlnCittYWtlIHJhbmRjb25maWcgPi9kZXYvbnVsbCB8fCB7IGVjaG8gInJhbmRjb25maWcgZXJyb3IiOyBleGl0IDE7IH0KKworIyBUd2VhayByZXN1bHRpbmcgY29uZmlnCitjYXQgLmNvbmZpZyBcCit8IGdyZXAgLXYgQ09ORklHX0RFQlVHX1BFU1NJTUlaRSBcCit8IGdyZXAgLXYgQ09ORklHX1dFUlJPUiBcCit8IGdyZXAgLXYgQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWCBcCit8IGdyZXAgLXYgQ09ORklHX1NFTElOVVggXAorfCBncmVwIC12IENPTkZJR19FRkVOQ0UgXAorfCBncmVwIC12IENPTkZJR19ETUFMTE9DIFwKK1wKK3wgZ3JlcCAtdiBDT05GSUdfUkZLSUxMIFwKKz4uY29uZmlnLm5ldworbXYgLmNvbmZpZy5uZXcgLmNvbmZpZworZWNobyAnIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQnID4+LmNvbmZpZworZWNobyAnIyBDT05GSUdfV0VSUk9SIGlzIG5vdCBzZXQnID4+LmNvbmZpZworZWNobyAiQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD1cIiR7Q1JPU1NfQ09NUElMRVJfUFJFRklYfVwiIiA+Pi5jb25maWcKK2VjaG8gJyMgQ09ORklHX1NFTElOVVggaXMgbm90IHNldCcgPj4uY29uZmlnCitlY2hvICcjIENPTkZJR19FRkVOQ0UgaXMgbm90IHNldCcgPj4uY29uZmlnCitlY2hvICcjIENPTkZJR19ETUFMTE9DIGlzIG5vdCBzZXQnID4+LmNvbmZpZworZWNobyAnIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQnID4+LmNvbmZpZworCisjIElmIGdsaWJjLCBkb24ndCBidWlsZCBzdGF0aWMKK2lmIHRlc3QgeCIkTElCQyIgPSB4ImdsaWJjIjsgdGhlbgorCWNhdCAuY29uZmlnIFwKKwl8IGdyZXAgLXYgQ09ORklHX1NUQVRJQyBcCisJPi5jb25maWcubmV3CisJbXYgLmNvbmZpZy5uZXcgLmNvbmZpZworCWVjaG8gJyMgQ09ORklHX1NUQVRJQyBpcyBub3Qgc2V0JyA+Pi5jb25maWcKK2ZpCisKKyMgSWYgdWNsaWJjLCBidWlsZCBzdGF0aWMsIGFuZCByZW1vdmUgc29tZSB0aGluZ3MKKyMgbGlrZWx5IHRvIG5vdCB3b3JrIG9uIHVjbGliYy4KK2lmIHRlc3QgeCIkTElCQyIgPSB4InVjbGliYyI7IHRoZW4KKwljYXQgLmNvbmZpZyBcCisJfCBncmVwIC12IENPTkZJR19TVEFUSUMgXAorCXwgZ3JlcCAtdiBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBcCisJfCBncmVwIC12IENPTkZJR19QSUUgXAorCVwKKwl8IGdyZXAgLXYgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgXAorCT4uY29uZmlnLm5ldworCW12IC5jb25maWcubmV3IC5jb25maWcKKwllY2hvICdDT05GSUdfU1RBVElDPXknID4+LmNvbmZpZworCWVjaG8gJyMgQ09ORklHX0JVSUxEX0xJQkJVU1lCT1ggaXMgbm90IHNldCcgPj4uY29uZmlnCisJZWNobyAnIyBDT05GSUdfUElFIGlzIG5vdCBzZXQnID4+LmNvbmZpZworCWVjaG8gJyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldCcgPj4uY29uZmlnCitmaQorCisjIElmIFNUQVRJQywgcmVtb3ZlIHNvbWUgdGhpbmdzLgorIyBQQU0gd2l0aCBzdGF0aWMgbGlua2luZyBpcyBwcm9iYWJseSBwb2ludGxlc3MKKyMgKGJ1dCBJIG5lZWQgdG8gdHJ5IC0gbm93IEkgZG9uJ3QgaGF2ZSBsaWJwYW0uYSBvbiBteSBzeXN0ZW0sIG9ubHkgbGlicGFtLnNvKQoraWYgZ3JlcCAtcSAiXkNPTkZJR19TVEFUSUM9eSIgLmNvbmZpZzsgdGhlbgorCWNhdCAuY29uZmlnIFwKKwl8IGdyZXAgLXYgQ09ORklHX1BBTSBcCisJPi5jb25maWcubmV3CisJbXYgLmNvbmZpZy5uZXcgLmNvbmZpZworCWVjaG8gJyMgQ09ORklHX1BBTSBpcyBub3Qgc2V0JyA+Pi5jb25maWcKK2ZpCisKKyMgUmVnZW5lcmF0ZSAuY29uZmlnIHdpdGggZGVmYXVsdCBhbnN3ZXJzIGZvciB5YW5rZWQtb2ZmIG9wdGlvbnMKKyMgKG1vc3Qgb2YgZGVmYXVsdCBhbnN3ZXJzIGFyZSAibm8iKS4KK3sgeWVzICIiIHwgbWFrZSBvbGRjb25maWcgPi9kZXYvbnVsbDsgfSB8fCB7IGVjaG8gIm9sZGNvbmZpZyBlcnJvciI7IGV4aXQgMTsgfQorCisjIEJ1aWxkIQorbmljZSAtbiAxMCBtYWtlICRNQUtFT1BUUyAyPiYxIHwgdGVlIG1ha2UubG9nCisKKyMgUmV0dXJuIGV4aXRjb2RlIDEgaWYgYnVzeWJveCBleGVjdXRhYmxlIGRvZXMgbm90IGV4aXN0Cit0ZXN0IC14IGJ1c3lib3gKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvcmFuZG9tdGVzdC5sb29wIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9yYW5kb210ZXN0Lmxvb3AKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM4YTliZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvcmFuZG9tdGVzdC5sb29wCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorCit0ZXN0IC1kICIkMSIgfHwgeyBlY2hvICInJDEnIGlzIG5vdCBhIGRpcmVjdG9yeSI7IGV4aXQgMTsgfQordGVzdCAteCAiJDEvc2NyaXB0cy9yYW5kb210ZXN0IiB8fCB7IGVjaG8gIk5vIHNjcmlwdHMvcmFuZG9tdGVzdCBpbiAnJDEnIjsgZXhpdCAxOyB9CisKK2V4cG9ydCBMSUJDPSJ1Y2xpYmMiCitleHBvcnQgQ1JPU1NfQ09NUElMRVJfUFJFRklYPSJpNjg2LSIKK2V4cG9ydCBNQUtFT1BUUz0iLWo5IgorCitjbnQ9MAorZmFpbD0wCit3aGlsZSBzbGVlcCAxOyBkbworCWVjaG8gIlBhc3NlczogJGNudCBGYWlsdXJlczogJGZhaWwiCisJZGlyPSJ0ZXN0LiQkIgorCXdoaWxlIHRlc3QgLWUgIiRkaXIiIC1vIC1lICJmYWlsZWQuJGRpciI7IGRvCisJCWRpcj0idGVzdC4kJC4kUkFORE9NIgorCWRvbmUKKwllY2hvICJSdW5uaW5nIHJhbmRjb25maWcgdGVzdCBpbiAkZGlyLi4uIgorCWlmICEgIiQxL3NjcmlwdHMvcmFuZG9tdGVzdCIgIiQxIiAiJGRpciIgPi9kZXYvbnVsbDsgdGhlbgorCQltdiAtLSAiJGRpciIgImZhaWxlZC4kZGlyIgorCQllY2hvICJGYWlsZWQgYnVpbGQgaW46IGZhaWxlZC4kZGlyIgorCQlleGl0IDEgIyB5b3UgbWF5IGNvbW1lbnQgdGhpcyBvdXQuLi4KKwkJbGV0IGZhaWwrKworCWVsc2UKKwkJKAorCQkJY2QgLS0gIiRkaXIvdGVzdHN1aXRlIiB8fCBleGl0IDEKKwkJCWVjaG8gIlJ1bm5pbmcgdGVzdHN1aXRlIGluICRkaXIuLi4iCisJCQlTS0lQX0tOT1dOX0JVR1M9MSBTS0lQX0lOVEVSTkVUX1RFU1RTPTEgLi9ydW50ZXN0IC12ID5ydW50ZXN0LmxvZyAyPiYxCisJCSkKKwkJaWYgdGVzdCAkPyAhPSAwOyB0aGVuCisJCQllY2hvICJGYWlsZWQgcnVudGVzdCBpbiAkZGlyIgorCQkJZXhpdCAxCisJCWZpCisJCXRhaWwgLW4xMCAtLSAiJGRpci90ZXN0c3VpdGUvcnVudGVzdC5sb2ciCisJCXJtIC1yZiAtLSAiJGRpciIKKwlmaQorCWxldCBjbnQrKworZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9zYW1wbGVfcG1hcCBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvc2FtcGxlX3BtYXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTdmYjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvc2FtcGxlX3BtYXAKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL3NoCisKK2J1c3lib3g9Li4vYnVzeWJveAorCiskYnVzeWJveCBzbGVlcCAxMCAmCitwaWQ9JCEKK3NsZWVwIDEKKworZWNobyAiTWVtb3J5IG1hcCBvZiAnJGJ1c3lib3ggc2xlZXAgMTAnOiIKK3NpemUgJGJ1c3lib3gKK3BtYXAgJHBpZCB8IGVudiAtIGdyZXAgIl5bMC05YS1mXVswLTlhLWZdKiAiIHwgc29ydCAtciAtdCAiICIgLWsyLDk5OQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9zaG93YXNtIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy9zaG93YXNtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2MWFiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL3Nob3dhc20KQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworIyBEdW1iIGxpdHRsZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IG91dCB0aGUgYXNzZW1ibHkgZHVtcCBvZiBhIHNpbmdsZQorIyBmdW5jdGlvbiwgb3IgbGlzdCB0aGUgZnVuY3Rpb25zIHNvIGR1bXBhYmxlIGluIGFuIGV4ZWN1dGFibGUuICBZb3UnZCB0aGluaworIyB0aGVyZSB3b3VsZCBiZSBhIHdheSB0byBnZXQgb2JqZHVtcCB0byBkbyB0aGlzLCBidXQgSSBjYW4ndCBmaW5kIGl0LgorCitbICQjIC1sdCAxIF0gfHwgWyAkIyAtZ3QgMiBdICYmIHsgZWNobyAidXNhZ2U6IHNob3dhc20gZmlsZSBmdW5jdGlvbiI7IGV4aXQgMTsgfQorCitbICEgLWYgJDEgXSAmJiB7IGVjaG8gIkZpbGUgJDEgbm90IGZvdW5kIjsgZXhpdCAxOyB9CisKK2lmIFsgJCMgLWVxIDEgXQordGhlbgorICBvYmpkdW1wIC1kICQxIHwgc2VkIC1uIC1lICdzL15bMC05YS1mQS1GXSogPFwoLipcKT46JC9cMS9wJworICBleGl0IDAKK2ZpCisKK29iamR1bXAgLWQgJDEgfCBzZWQgLW4gLWUgJy8uL3tIOyQhZH0nIC1lICJ4Oy9eLlswLTlhLWZBLUZdKiA8JDI+Oi9wIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy90ZXN0X21ha2VfTyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvdGVzdF9tYWtlX08KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTBlZTZhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NjcmlwdHMvdGVzdF9tYWtlX08KQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL3NoCisKK2I9YGJhc2VuYW1lICRQV0RgCit0ZXN0ICIke2IjYnVzeWJveH0iICE9ICIkYiIgfHwgeyBlY2hvICJNdXN0IGJlIHJ1biBpbiBidXN5Ym94IHRyZWUiOyBleGl0IDE7IH0KKworcm0gLXJmIC4uL3Rlc3RkaXJfbWFrZV9PLiQkCitta2RpciAuLi90ZXN0ZGlyX21ha2VfTy4kJAorb2Rpcj1gY2QgLi4vdGVzdGRpcl9tYWtlX08uJCQgJiYgcHdkYAordGVzdCAtZCAiJG9kaXIiIHx8IGV4aXQgMQorCittYWtlIE89IiRvZGlyIiAkTUFLRU9QVFMgIiRAIiBkZWZjb25maWcgYnVzeWJveCAyPiYxIHwgdGVlIHRlc3RfbWFrZV9PLmxvZwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy90ZXN0X21ha2VfY2xlYW4gYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL3Rlc3RfbWFrZV9jbGVhbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYTNhNTQzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy90ZXN0X21ha2VfY2xlYW4KQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisKK2I9YGJhc2VuYW1lICRQV0RgCit0ZXN0ICIke2IjYnVzeWJveH0iICE9ICIkYiIgfHwgeyBlY2hvICJNdXN0IGJlIHJ1biBpbiBidXN5Ym94IHRyZWUiOyBleGl0IDE7IH0KKworY2QgLi4KK2NwIC1wUFIgIiRiIiBidXN5Ym94LiQkLnRlc3RfdHJlZQorY2QgYnVzeWJveC4kJC50ZXN0X3RyZWUKK21ha2UgZGVmY29uZmlnCittYWtlICRNQUtFT1BUUworbWFrZSBjbGVhbgorY2QgLi4KK2RpZmYgLXVycCAiJGIiIGJ1c3lib3guJCQudGVzdF90cmVlID5idXN5Ym94LiQkLnRlc3RfdHJlZS5kaWZmCitjYXQgYnVzeWJveC4kJC50ZXN0X3RyZWUuZGlmZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy90cnlsaW5rIGIvYnVzeWJveC0xLjE5LjMvc2NyaXB0cy90cnlsaW5rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4YjBiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zY3JpcHRzL3RyeWxpbmsKQEAgLTAsMCArMSwzMTAgQEAKKyMhL2Jpbi9zaAorCitkZWJ1Zz1mYWxzZQorCisjIExpbmtlciBmbGFncyB1c2VkOgorIworIyBJbmZvcm1hdGlvbmFsOgorIyAtLXdhcm4tY29tbW9uCisjIC1NYXAgJEVYRS5tYXAKKyMgLS12ZXJib3NlCisjCisjIE9wdGltaXphdGlvbnM6CisjIC0tc29ydC1jb21tb24gICAgICAgICAgICAgICAgIHJlZHVjZXMgcGFkZGluZworIyAtLXNvcnQtc2VjdGlvbiBhbGlnbm1lbnQgICAgICByZWR1Y2VzIHBhZGRpbmcKKyMgLS1nYy1zZWN0aW9ucyAgICAgICAgICAgICAgICAgdGhyb3dzIG91dCB1bnVzZWQgc2VjdGlvbnMsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHdvcmsgZm9yIHNoYXJlZCBsaWJzCisjIC1PbiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB1c2VkLCBtYXliZSB1c2VmdWw/CisjCisjIExpc3Qgb2YgZmlsZXMgdG8gbGluazoKKyMgJGxfbGlzdCAgICAgICAgICAgICAgICAgICAgICAgPT0gLS1zdGFydC1ncm91cCAtbGxpYjEgLWxsaWIyIC0tZW5kLWdyb3VwCisjIC0tc3RhcnQtZ3JvdXAgJE9fRklMRVMgJEFfRklMRVMgLS1lbmQtZ3JvdXAKKyMKKyMgU2hhcmVkIGxpYnJhcnkgbGluazoKKyMgLXNoYXJlZCAgICAgICAgICAgICAgICAgICAgICAgc2VsZi1leHBsYW5hdG9yeQorIyAtZlBJQyAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi1pbmRlcGVuZGVudCBjb2RlCisjIC0tZW5hYmxlLW5ldy1kdGFncyAgICAgICAgICAgID8KKyMgLXosY29tYnJlbG9jICAgICAgICAgICAgICAgICAgPworIyAtc29uYW1lPSJsaWJidXN5Ym94LnNvLiRCQl9WRVIiCisjIC0tdW5kZWZpbmVkPWxiYl9tYWluICAgICAgICAgIFNlZWQgbmFtZSB0byBzdGFydCBwdWxsaW5nIGZyb20KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyd2lzZSB3ZSdsbCBuZWVkIC0td2hvbGUtYXJjaGl2ZSkKKyMgLXN0YXRpYyAgICAgICAgICAgICAgICAgICAgICAgTm90IHVzZWQsIGJ1dCBtYXkgYmUgdXNlZnVsISBtYW5wYWdlOgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4uIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHdpdGggLXNoYXJlZC4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9pbmcgc28gbWVhbnMgdGhhdCBhIHNoYXJlZCBsaWJyYXJ5CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIGNyZWF0ZWQgYnV0IHRoYXQgYWxsIG9mIHRoZSBsaWJyYXJ5J3MKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgcmVmZXJlbmNlcyBtdXN0IGJlIHJlc29sdmVkIGJ5IHB1bGxpbmcKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZW50cmllcyBmcm9tIHN0YXRpYyBsaWJyYXJpZXMuIgorCisKK3RyeSgpIHsKKyAgICBwcmludGYgIiVzXG4iICJPdXRwdXQgb2Y6IiA+JEVYRS5vdXQKKyAgICBwcmludGYgIiVzXG4iICIkKiIgPj4kRVhFLm91dAorICAgIHByaW50ZiAiJXNcbiIgIj09PT09PT09PT0iID4+JEVYRS5vdXQKKyAgICAkZGVidWcgJiYgZWNobyAiVHJ5aW5nOiAkKiIKKyAgICAkQCA+PiRFWEUub3V0IDI+JjEKKyAgICByZXR1cm4gJD8KK30KKworY2hlY2tfY2MoKSB7CisgICAgbG9jYWwgdGVtcG5hbWU9Ii90bXAvdGVtcC4kJC4kUkFORE9NIgorICAgICMgQ2FuIHVzZSAiLW8gL2Rldi9udWxsIiwgYnV0IG9sZGVyIGdjYyB0ZW5kIHRvICp1bmxpbmsgaXQqIG9uIGZhaWx1cmUhIDooCisgICAgIyAiLXhjIjogQyBsYW5ndWFnZS4gIi9kZXYvbnVsbCIgaXMgYW4gZW1wdHkgc291cmNlIGZpbGUuCisgICAgaWYgJENDICQxIC1zaGFyZWQgLXhjIC9kZXYvbnVsbCAtbyAiJHRlbXBuYW1lIi5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCWVjaG8gIiQxIjsKKyAgICBlbHNlCisJZWNobyAiJDIiOworICAgIGZpCisgICAgcm0gIiR0ZW1wbmFtZSIubyAyPi9kZXYvbnVsbAorfQorCitjaGVja19saWJjX2lzX2dsaWJjKCkgeworICAgIGxvY2FsIHRlbXBuYW1lPSIvdG1wL3RlbXAuJCQuJFJBTkRPTSIKKyAgICBlY2hvICJcCisJI2luY2x1ZGUgPHN0ZGxpYi5oPgorCS8qIEFwcGFyZW50bHkgdWNsaWJjIGRlZmluZXMgX19HTElCQ19fIChjb21wYXQgdHJpY2s/KS4gT2ggd2VsbC4gKi8KKwkjaWYgZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKF9fVUNMSUJDX18pCisJc3ludGF4IGVycm9yIGhlcmUKKwkjZW5kaWYKKwkiID4iJHRlbXBuYW1lIi5jCisgICAgaWYgJENDICIkdGVtcG5hbWUiLmMgLWMgLW8gIiR0ZW1wbmFtZSIubyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwllY2hvICIkMiI7CisgICAgZWxzZQorCWVjaG8gIiQxIjsKKyAgICBmaQorICAgIHJtICIkdGVtcG5hbWUiLmMgIiR0ZW1wbmFtZSIubyAyPi9kZXYvbnVsbAorfQorCitFWEU9IiQxIgorQ0M9IiQyIgorQ0ZMQUdTPSIkMyIKK0xERkxBR1M9IiQ0IgorT19GSUxFUz0iJDUiCitBX0ZJTEVTPSIkNiIKK0xETElCUz0iJDciCisKKyMgVGhlIC0tc29ydC1zZWN0aW9uIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IG9sZGVyIHZlcnNpb25zIG9mIGxkCitTT1JUX1NFQ1RJT049YGNoZWNrX2NjICItV2wsLS1zb3J0LXNlY3Rpb24sYWxpZ25tZW50IiAiImAKKworU1RBUlRfR1JPVVA9Ii1XbCwtLXN0YXJ0LWdyb3VwIgorRU5EX0dST1VQPSItV2wsLS1lbmQtZ3JvdXAiCitJTkZPX09QVFM9Ii1XbCwtLXdhcm4tY29tbW9uIC1XbCwtTWFwLCRFWEUubWFwIC1XbCwtLXZlcmJvc2UiCisKKyMgZ29sZCBtYXkgbm90IHN1cHBvcnQgLS1zb3J0LWNvbW1vbiAoeWV0KQorU09SVF9DT01NT049YGNoZWNrX2NjICItV2wsLS1zb3J0LWNvbW1vbiIgIiJgCisKKyMgU3RhdGljIGxpbmtpbmcgYWdhaW5zdCBnbGliYyBwcm9kdWNlcyBidWdneSBleGVjdXRhYmxlcworIyAoZ2xpYmMgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggbGQgLS1nYy1zZWN0aW9ucykuCisjIFNlZSBzb3VyY2VzLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM0MDAKKyMgTm90ZSB0aGF0IGdsaWJjIGlzIHVuc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nIGFueXdheS4KKyMgV2UgYXJlIHJlbW92aW5nIC1XbCwtLWdjLXNlY3Rpb25zIGZyb20gbGluayBjb21tYW5kIGxpbmUuCitHQ19TRUNUSU9OUz1gKAorLiAuLy5jb25maWcKK2lmIHRlc3QgeCIkQ09ORklHX1NUQVRJQyIgPSB4InkiOyB0aGVuCisgICAgY2hlY2tfbGliY19pc19nbGliYyAiIiAiLVdsLC0tZ2Mtc2VjdGlvbnMiCitlbHNlCisgICAgZWNobyAiLVdsLC0tZ2Mtc2VjdGlvbnMiCitmaQorKWAKKworIyBUaGUgLS1nYy1zZWN0aW9ucyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBvbGRlciB2ZXJzaW9ucyBvZiBsZAoraWYgdGVzdCAtbiAiJEdDX1NFQ1RJT05TIjsgdGhlbgorICAgIEdDX1NFQ1RJT05TPWBjaGVja19jYyAiJEdDX1NFQ1RJT05TIiAiImAKK2ZpCisKKyMgU2FuaXRpemUgbGliIGxpc3QgKGR1cHMsIGV4dHJhIHNwYWNlcyBldGMpCitMRExJQlM9YGVjaG8gIiRMRExJQlMiIHwgeGFyZ3MgLW4xIHwgc29ydCB8IHVuaXEgfCB4YXJnc2AKKworIyBGaXJzdCBsaW5rIHdpdGggYWxsIGxpYnMuIElmIGl0IGZhaWxzLCBiYWlsIG91dAorZWNobyAiVHJ5aW5nIGxpYnJhcmllczogJExETElCUyIKKyMgImxpYjEgbGliMiBsaWIzIiAtPiAiLWxsaWIxIC1sbGliMiAtbGxpYjMiCitsX2xpc3Q9YGVjaG8gIiRMRExJQlMiIHwgc2VkIC1lICdzLyAvIC1sL2cnIC1lICdzL14vLWwvJyAtZSAncy9eLWwkLy8nYAordGVzdCAieCRsX2xpc3QiICE9ICJ4IiAmJiBsX2xpc3Q9IiRTVEFSVF9HUk9VUCAkbF9saXN0ICRFTkRfR1JPVVAiCit0cnkgJENDICRDRkxBR1MgJExERkxBR1MgXAorCS1vICRFWEUgXAorCSRTT1JUX0NPTU1PTiBcCisJJFNPUlRfU0VDVElPTiBcCisJJEdDX1NFQ1RJT05TIFwKKwkkU1RBUlRfR1JPVVAgJE9fRklMRVMgJEFfRklMRVMgJEVORF9HUk9VUCBcCisJJGxfbGlzdCBcCit8fCB7CisgICAgZWNobyAiRmFpbGVkOiAkbF9saXN0IgorICAgIGNhdCAkRVhFLm91dAorICAgIGV4aXQgMQorfQorCisjIE5vdyB0cnkgdG8gcmVtb3ZlIGVhY2ggbGliIGFuZCBidWlsZCB3aXRob3V0IGl0LgorIyBTdG9wIHdoZW4gbm8gbGliIGNhbiBiZSByZW1vdmVkLgord2hpbGUgdGVzdCAiJExETElCUyI7IGRvCisgICAgJGRlYnVnICYmIGVjaG8gIlRyeWluZyBsaWJyYXJpZXM6ICRMRExJQlMiCisgICAgYWxsX25lZWRlZD10cnVlCisgICAgbGFzdF9uZWVkZWQ9ZmFsc2UKKyAgICBmb3Igb25lIGluICRMRExJQlM7IGRvCisJd2l0aG91dF9vbmU9YGVjaG8gIiAkTERMSUJTICIgfCBzZWQgInMvICRvbmUgLyAvZyIgfCB4YXJnc2AKKwkjICJsaWIxIGxpYjIgbGliMyIgLT4gIi1sbGliMSAtbGxpYjIgLWxsaWIzIgorCWxfbGlzdD1gZWNobyAiJHdpdGhvdXRfb25lIiB8IHNlZCAtZSAncy8gLyAtbC9nJyAtZSAncy9eLy1sLycgLWUgJ3MvXi1sJC8vJ2AKKwl0ZXN0IHgiJGxfbGlzdCIgIT0geCIiICYmIGxfbGlzdD0iJFNUQVJUX0dST1VQICRsX2xpc3QgJEVORF9HUk9VUCIKKwkkZGVidWcgJiYgZWNobyAiVHJ5aW5nIC1sIG9wdGlvbnM6ICckbF9saXN0JyIKKwl0cnkgJENDICRDRkxBR1MgJExERkxBR1MgXAorCQktbyAkRVhFIFwKKwkJJFNPUlRfQ09NTU9OIFwKKwkJJFNPUlRfU0VDVElPTiBcCisJCSRHQ19TRUNUSU9OUyBcCisJCSRTVEFSVF9HUk9VUCAkT19GSUxFUyAkQV9GSUxFUyAkRU5EX0dST1VQIFwKKwkJJGxfbGlzdAorCWlmIHRlc3QgJD8gPSAwOyB0aGVuCisJICAgIGVjaG8gIiBMaWJyYXJ5ICRvbmUgaXMgbm90IG5lZWRlZCwgZXhjbHVkaW5nIGl0IgorCSAgICBMRExJQlM9IiR3aXRob3V0X29uZSIKKwkgICAgYWxsX25lZWRlZD1mYWxzZQorCSAgICBsYXN0X25lZWRlZD1mYWxzZQorCWVsc2UKKwkgICAgZWNobyAiIExpYnJhcnkgJG9uZSBpcyBuZWVkZWQsIGNhbid0IGV4Y2x1ZGUgaXQgKHlldCkiCisJICAgIGxhc3RfbmVlZGVkPXRydWUKKwlmaQorICAgIGRvbmUKKyAgICAjIEFsbCBsaWJzIHdlcmUgbmVlZGVkLCBjYW4ndCByZW1vdmUgYW55CisgICAgJGFsbF9uZWVkZWQgJiYgYnJlYWsKKyAgICAjIE9wdGltaXphdGlvbjogd2FzIHRoZSBsYXN0IHRyaWVkIGxpYiBuZWVkZWQ/CisgICAgaWYgJGxhc3RfbmVlZGVkOyB0aGVuCisJIyBXYXMgaXQgdGhlIG9ubHkgb25lIGxpYiBsZWZ0PyBEb24ndCB0ZXN0IGFnYWluIHRoZW4uCisJeyBlY2hvICIkTERMSUJTIiB8IGdyZXAgLXEgJyAnOyB9IHx8IGJyZWFrCisgICAgZmkKK2RvbmUKKworIyBNYWtlIHRoZSBiaW5hcnkgd2l0aCBmaW5hbCwgbWluaW1hbCBsaXN0IG9mIGxpYnMKK2VjaG8gIkZpbmFsIGxpbmsgd2l0aDogJHtMRExJQlM6LTxub25lPn0iCitsX2xpc3Q9YGVjaG8gIiRMRExJQlMiIHwgc2VkIC1lICdzLyAvIC1sL2cnIC1lICdzL14vLWwvJyAtZSAncy9eLWwkLy8nYAordGVzdCAieCRsX2xpc3QiICE9ICJ4IiAmJiBsX2xpc3Q9IiRTVEFSVF9HUk9VUCAkbF9saXN0ICRFTkRfR1JPVVAiCisjIC0tdmVyYm9zZSBnaXZlcyB1cyBnb2JzIG9mIGluZm8gdG8gc3Rkb3V0IChlLmcuIGxpbmtlciBzY3JpcHQgdXNlZCkKK2lmICEgdGVzdCAtZiBidXN5Ym94X2xkc2NyaXB0OyB0aGVuCisgICAgdHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTIFwKKwkgICAgLW8gJEVYRSBcCisJICAgICRTT1JUX0NPTU1PTiBcCisJICAgICRTT1JUX1NFQ1RJT04gXAorCSAgICAkR0NfU0VDVElPTlMgXAorCSAgICAkU1RBUlRfR1JPVVAgJE9fRklMRVMgJEFfRklMRVMgJEVORF9HUk9VUCBcCisJICAgICRsX2xpc3QgXAorCSAgICAkSU5GT19PUFRTIFwKKyAgICB8fCB7CisJY2F0ICRFWEUub3V0CisJZXhpdCAxCisgICAgfQorZWxzZQorICAgIGVjaG8gIkN1c3RvbSBsaW5rZXIgc2NyaXB0ICdidXN5Ym94X2xkc2NyaXB0JyBmb3VuZCwgdXNpbmcgaXQiCisgICAgIyBBZGQgU09SVF9CWV9BTElHTk1FTlQgdG8gbGlua2VyIHNjcmlwdCAoZm91bmQgaW4gJEVYRS5vdXQpOgorICAgICMgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIFNPUlRfQllfQUxJR05NRU5UKC5yb2RhdGEuKikgLmdudS5saW5rb25jZS5yLiopIH0KKyAgICAjICAqKC5kYXRhIFNPUlRfQllfQUxJR05NRU5UKC5kYXRhLiopIC5nbnUubGlua29uY2UuZC4qKQorICAgICMgICooLmJzcyBTT1JUX0JZX0FMSUdOTUVOVCguYnNzLiopIC5nbnUubGlua29uY2UuYi4qKQorICAgICMgVGhpcyB3aWxsIGVsaW1pbmF0ZSBtb3N0IG9mIHRoZSBwYWRkaW5nICh+M2tiKS4KKyAgICAjIEhtbSwgImxkIC0tc29ydC1zZWN0aW9uIGFsaWdubWVudCIgc2hvdWxkIGRvIGl0IHRvby4KKyAgICB0cnkgJENDICRDRkxBR1MgJExERkxBR1MgXAorCSAgICAtbyAkRVhFIFwKKwkgICAgJFNPUlRfQ09NTU9OIFwKKwkgICAgJFNPUlRfU0VDVElPTiBcCisJICAgICRHQ19TRUNUSU9OUyBcCisJICAgIC1XbCwtVCxidXN5Ym94X2xkc2NyaXB0IFwKKwkgICAgJFNUQVJUX0dST1VQICRPX0ZJTEVTICRBX0ZJTEVTICRFTkRfR1JPVVAgXAorCSAgICAkbF9saXN0IFwKKwkgICAgJElORk9fT1BUUyBcCisgICAgfHwgeworCWNhdCAkRVhFLm91dAorCWV4aXQgMQorICAgIH0KK2ZpCisKKy4gLi8uY29uZmlnCisKK3NoYXJlZGxpYl9kaXI9IjBfbGliIgorCitpZiB0ZXN0ICIkQ09ORklHX0JVSUxEX0xJQkJVU1lCT1giID0geTsgdGhlbgorICAgIG1rZGlyICIkc2hhcmVkbGliX2RpciIgMj4vZGV2L251bGwKKyAgICB0ZXN0IC1kICIkc2hhcmVkbGliX2RpciIgfHwgeworCWVjaG8gIkNhbm5vdCBtYWtlIGRpcmVjdG9yeSAkc2hhcmVkbGliX2RpciIKKwlleGl0IDEKKyAgICB9CisgICAgbG4gLXMgImxpYmJ1c3lib3guc28uJEJCX1ZFUiIgIiRzaGFyZWRsaWJfZGlyIi9saWJidXN5Ym94LnNvIDI+L2Rldi9udWxsCisKKyAgICBFWEU9IiRzaGFyZWRsaWJfZGlyL2xpYmJ1c3lib3guc28uJHtCQl9WRVJ9X3Vuc3RyaXBwZWQiCisgICAgdHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTIFwKKwkgICAgLW8gJEVYRSBcCisJICAgIC1zaGFyZWQgLWZQSUMgXAorCSAgICAtV2wsLS1lbmFibGUtbmV3LWR0YWdzIFwKKwkgICAgLVdsLC16LGNvbWJyZWxvYyBcCisJICAgIC1XbCwtc29uYW1lPSJsaWJidXN5Ym94LnNvLiRCQl9WRVIiIFwKKwkgICAgLVdsLC0tdW5kZWZpbmVkPWxiYl9tYWluIFwKKwkgICAgJFNPUlRfQ09NTU9OIFwKKwkgICAgJFNPUlRfU0VDVElPTiBcCisJICAgICRTVEFSVF9HUk9VUCAkQV9GSUxFUyAkRU5EX0dST1VQIFwKKwkgICAgJGxfbGlzdCBcCisJICAgICRJTkZPX09QVFMgXAorICAgIHx8IHsKKwllY2hvICJMaW5raW5nICRFWEUgZmFpbGVkIgorCWNhdCAkRVhFLm91dAorCWV4aXQgMQorICAgIH0KKyAgICAkU1RSSVAgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50ICRFWEUgLW8gIiRzaGFyZWRsaWJfZGlyL2xpYmJ1c3lib3guc28uJEJCX1ZFUiIKKyAgICBjaG1vZCBhK3ggIiRzaGFyZWRsaWJfZGlyL2xpYmJ1c3lib3guc28uJEJCX1ZFUiIKKyAgICBlY2hvICJsaWJidXN5Ym94OiAkc2hhcmVkbGliX2Rpci9saWJidXN5Ym94LnNvLiRCQl9WRVIiCitmaQorCitpZiB0ZXN0ICIkQ09ORklHX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1giID0geTsgdGhlbgorICAgIEVYRT0iJHNoYXJlZGxpYl9kaXIvYnVzeWJveF91bnN0cmlwcGVkIgorICAgIHRyeSAkQ0MgJENGTEFHUyAkTERGTEFHUyBcCisJICAgIC1vICRFWEUgXAorCSAgICAkU09SVF9DT01NT04gXAorCSAgICAkU09SVF9TRUNUSU9OIFwKKwkgICAgJEdDX1NFQ1RJT05TIFwKKwkgICAgJFNUQVJUX0dST1VQICRPX0ZJTEVTICRFTkRfR1JPVVAgXAorCSAgICAtTCIkc2hhcmVkbGliX2RpciIgLWxidXN5Ym94IFwKKwkgICAgJGxfbGlzdCBcCisJICAgICRJTkZPX09QVFMgXAorICAgIHx8IHsKKwllY2hvICJMaW5raW5nICRFWEUgZmFpbGVkIgorCWNhdCAkRVhFLm91dAorCWV4aXQgMQorICAgIH0KKyAgICAkU1RSSVAgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50ICRFWEUgLW8gIiRzaGFyZWRsaWJfZGlyL2J1c3lib3giCisgICAgZWNobyAiYnVzeWJveCBsaW5rZWQgYWdhaW5zdCBsaWJidXN5Ym94OiAkc2hhcmVkbGliX2Rpci9idXN5Ym94IgorZmkKKworaWYgdGVzdCAiJENPTkZJR19GRUFUVVJFX0lORElWSURVQUwiID0geTsgdGhlbgorICAgIGVjaG8gIkxpbmtpbmcgaW5kaXZpZHVhbCBhcHBsZXRzIGFnYWluc3QgbGliYnVzeWJveCAoc2VlICRzaGFyZWRsaWJfZGlyLyopIgorICAgIGdjYyAtRE5BTUVfTUFJTl9DTkFNRSAtRSAtaW5jbHVkZSBpbmNsdWRlL2F1dG9jb25mLmggaW5jbHVkZS9hcHBsZXRzLmggXAorICAgIHwgZ3JlcCAtdiAiXiMiIFwKKyAgICB8IGdyZXAgLXYgIl4kIiBcCisgICAgPiBhcHBsZXRfbHN0LnRtcAorICAgIHdoaWxlIHJlYWQgbmFtZSBtYWluIGp1bms7IGRvCisKKwllY2hvICJcCit2b2lkIGxiYl9wcmVwYXJlKGNvbnN0IGNoYXIgKmFwcGxldCwgY2hhciAqKmFyZ3YpOworaW50ICRtYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlsYmJfcHJlcGFyZShcIiRuYW1lXCIsIGFyZ3YpOworCXJldHVybiAkbWFpbihhcmdjLCBhcmd2KTsKK30KKyIgPiIkc2hhcmVkbGliX2Rpci9hcHBsZXQuYyIKKworCUVYRT0iJHNoYXJlZGxpYl9kaXIvJG5hbWUiCisJdHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTICIkc2hhcmVkbGliX2Rpci9hcHBsZXQuYyIgXAorCQktbyAkRVhFIFwKKwkJJFNPUlRfQ09NTU9OIFwKKwkJJFNPUlRfU0VDVElPTiBcCisJCSRHQ19TRUNUSU9OUyBcCisJCS1MIiRzaGFyZWRsaWJfZGlyIiAtbGJ1c3lib3ggXAorCQktV2wsLS13YXJuLWNvbW1vbiBcCisJfHwgeworCSAgICBlY2hvICJMaW5raW5nICRFWEUgZmFpbGVkIgorCSAgICBjYXQgJEVYRS5vdXQKKwkgICAgZXhpdCAxCisJfQorCXJtIC0tICIkc2hhcmVkbGliX2Rpci9hcHBsZXQuYyIgJEVYRS5vdXQKKwkkU1RSSVAgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50ICRFWEUKKworICAgIGRvbmUgPGFwcGxldF9sc3QudG1wCitmaQorCisjIGxpYmJ1c3lib3guc28gaXMgbmVlZGVkIG9ubHkgZm9yIC1sYnVzeWJveCBhdCBsaW5rIHRpbWUsCisjIGl0IGlzIG5vdCBuZWVkZWQgYXQgcnVudGltZS4gRGVsZXRpbmcgdG8gcmVkdWNlIGNvbmZ1c2lvbi4KK3JtICIkc2hhcmVkbGliX2RpciIvbGliYnVzeWJveC5zbyAyPi9kZXYvbnVsbAorZXhpdCAwICMgb3IgZWxzZSB3ZSBtYXkgY29uZnVzZSBtYWtlCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L0NvbmZpZy5zcmMgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkMTViNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDEyNCBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiU0VMaW51eCBVdGlsaXRpZXMiCisJZGVwZW5kcyBvbiBTRUxJTlVYCisKK0lOU0VSVAorCitjb25maWcgQ0hDT04KKwlib29sICJjaGNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBjaGFuZ2UgdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgZmlsZS4KKworY29uZmlnIEZFQVRVUkVfQ0hDT05fTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENIQ09OICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgY2hjb24gYXBwbGV0LgorCitjb25maWcgR0VURU5GT1JDRQorCWJvb2wgImdldGVuZm9yY2UiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gZ2V0IHRoZSBjdXJyZW50IG1vZGUgb2YgU0VMaW51eC4KKworY29uZmlnIEdFVFNFQk9PTAorCWJvb2wgImdldHNlYm9vbCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBnZXQgU0VMaW51eCBib29sZWFuIHZhbHVlcy4KKworY29uZmlnIExPQURfUE9MSUNZCisJYm9vbCAibG9hZF9wb2xpY3kiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gbG9hZCBTRUxpbnV4IHBvbGljeS4KKworY29uZmlnIE1BVENIUEFUSENPTgorCWJvb2wgIm1hdGNocGF0aGNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBnZXQgZGVmYXVsdCBzZWN1cml0eSBjb250ZXh0IG9mIHRoZQorCSAgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgZmlsZSBjb250ZXh0cyBjb25maWd1cmF0aW9uLgorCitjb25maWcgUkVTVE9SRUNPTgorCWJvb2wgInJlc3RvcmVjb24iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gcmVsYWJlbCBmaWxlcy4gVGhlIGZlYXR1cmUgaXMgYWxtb3N0CisJICB0aGUgc2FtZSBhcyBzZXRmaWxlcywgYnV0IHVzYWdlIGlzIGEgbGl0dGxlIGRpZmZlcmVudC4KKworY29uZmlnIFJVTkNPTgorCWJvb2wgInJ1bmNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBydW4gY29tbWFuZCBpbiBzcGVmaWNpZWQgc2VjdXJpdHkgY29udGV4dC4KKworY29uZmlnIEZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSVU5DT04gJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBydW5jb24gYXBwbGV0LgorCitjb25maWcgU0VMSU5VWEVOQUJMRUQKKwlib29sICJzZWxpbnV4ZW5hYmxlZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhpcyBjb21tYW5kIHRvIGJlIHVzZWQgd2l0aGluIHNoZWxsIHNjcmlwdHMKKwkgIHRvIGRldGVybWluZSBpZiBzZWxpbnV4IGlzIGVuYWJsZWQuCisKK2NvbmZpZyBTRVRFTkZPUkNFCisJYm9vbCAic2V0ZW5mb3JjZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBtb2RpZnkgdGhlIG1vZGUgU0VMaW51eCBpcyBydW5uaW5nIGluLgorCitjb25maWcgU0VURklMRVMKKwlib29sICJzZXRmaWxlcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBtb2RpZnkgdG8gcmVsYWJlbCBmaWxlcy4KKwkgIE5vdGljZTogSWYgeW91IGJ1aWx0IGxpYnNlbGludXggd2l0aCAtRF9GSUxFX09GRlNFVF9CSVRTPTY0LAorCSAgKEl0IGlzIGRlZmF1bHQgaW4gbGlic2VsaW51eCdzIE1ha2VmaWxlKSwgeW91IF9tdXN0XyBlbmFibGUKKwkgIENPTkZJR19MRlMuCisKK2NvbmZpZyBGRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTgorCWJvb2wgIkVuYWJsZSBjaGVjayBvcHRpb24iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRVRGSUxFUworCWhlbHAKKwkgIFN1cHBvcnQgIi1jIiBvcHRpb24gKGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29udGV4dHMgYWdhaW5zdAorCSAgdGhlIHNwZWNpZmllZCBiaW5hcnkgcG9saWN5KSBmb3Igc2V0ZmlsZXMuIFJlcXVpcmVzIGxpYnNlcG9sLgorCitjb25maWcgU0VUU0VCT09MCisJYm9vbCAic2V0c2Vib29sIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBjaGFuZ2UgYm9vbGVhbi4KKwkgIHNlbWFuYWdlIGFuZCAtUCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQuCisKK2NvbmZpZyBTRVNUQVRVUworCWJvb2wgInNlc3RhdHVzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIERpc3BsYXlzIHRoZSBzdGF0dXMgb2YgU0VMaW51eC4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDVmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L0tidWlsZC5zcmMKQEAgLTAsMCArMSwyMiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjIENvcHlyaWdodCAoQykgMjAwNyBieSBLYWlHYWkgS29oZWkgPGthaWdhaUBrYWlnYWkuZ3IuanA+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfQ0hDT04pCQkrPSBjaGNvbi5vCitsaWItJChDT05GSUdfR0VURU5GT1JDRSkJKz0gZ2V0ZW5mb3JjZS5vCitsaWItJChDT05GSUdfR0VUU0VCT09MKQkJKz0gZ2V0c2Vib29sLm8KK2xpYi0kKENPTkZJR19MT0FEX1BPTElDWSkJKz0gbG9hZF9wb2xpY3kubworbGliLSQoQ09ORklHX01BVENIUEFUSENPTikJKz0gbWF0Y2hwYXRoY29uLm8KK2xpYi0kKENPTkZJR19SVU5DT04pCQkrPSBydW5jb24ubworbGliLSQoQ09ORklHX1NFTElOVVhFTkFCTEVEKQkrPSBzZWxpbnV4ZW5hYmxlZC5vCitsaWItJChDT05GSUdfU0VURU5GT1JDRSkJKz0gc2V0ZW5mb3JjZS5vCitsaWItJChDT05GSUdfU0VURklMRVMpCQkrPSBzZXRmaWxlcy5vCitsaWItJChDT05GSUdfUkVTVE9SRUNPTikJKz0gc2V0ZmlsZXMubworbGliLSQoQ09ORklHX1NFVFNFQk9PTCkJCSs9IHNldHNlYm9vbC5vCitsaWItJChDT05GSUdfU0VTVEFUVVMpCQkrPSBzZXN0YXR1cy5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L2NoY29uLmMgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L2NoY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkMGNmZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvY2hjb24uYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIGNoY29uIC0tIGNoYW5nZSBzZWN1cml0eSBjb250ZXh0LCBiYXNlZCBvbiBjb3JldXRpbHMtNS45Ny0xMworICoKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDcgS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNoY29uX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gQ09OVEVYVCBGSUxFLi4uIgorLy91c2FnZTogICAgICAgIlxuCWNoY29uIFtPUFRJT05TXSBbLXUgVVNFUl0gWy1yIFJPTEVdIFstbCBSQU5HRV0gWy10IFRZUEVdIEZJTEUuLi4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAgICJcbgljaGNvbiBbT1BUSU9OU10gLS1yZWZlcmVuY2U9UkZJTEUgRklMRS4uLiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2RlZmluZSBjaGNvbl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiBlYWNoIEZJTEUgdG8gQ09OVEVYVFxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jaGFuZ2VzCQlSZXBvcnQgY2hhbmdlcyBtYWRlIgorLy91c2FnZTogICAgICJcbgktaCwtLW5vLWRlcmVmZXJlbmNlCUFmZmVjdCBzeW1saW5rcyBpbnN0ZWFkIG9mIHRoZWlyIHRhcmdldHMiCisvL3VzYWdlOiAgICAgIlxuCS1mLC0tc2lsZW50LC0tcXVpZXQJU3VwcHJlc3MgbW9zdCBlcnJvciBtZXNzYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1yZWZlcmVuY2U9UkZJTEUJVXNlIFJGSUxFJ3MgZ3JvdXAgaW5zdGVhZCBvZiB1c2luZyBhIENPTlRFWFQgdmFsdWUiCisvL3VzYWdlOiAgICAgIlxuCS11LC0tdXNlcj1VU0VSCQlTZXQgdXNlci9yb2xlL3R5cGUvcmFuZ2UgaW4gdGhlIHRhcmdldCIKKy8vdXNhZ2U6ICAgICAiXG4JLXIsLS1yb2xlPVJPTEUJCXNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS10LC0tdHlwZT1UWVBFIgorLy91c2FnZTogICAgICJcbgktbCwtLXJhbmdlPVJBTkdFIgorLy91c2FnZTogICAgICJcbgktUiwtLXJlY3Vyc2l2ZQkJUmVjdXJzZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJUmVwb3J0IGNoYW5nZXMgbWFkZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJQWZmZWN0IHN5bWxpbmtzIGluc3RlYWQgb2YgdGhlaXIgdGFyZ2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJU3VwcHJlc3MgbW9zdCBlcnJvciBtZXNzYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUglTZXQgdXNlci9yb2xlL3R5cGUvcmFuZ2UgaW4gdGhlIHRhcmdldCBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktciBST0xFIgorLy91c2FnZTogICAgICJcbgktdCBUWVBFIgorLy91c2FnZTogICAgICJcbgktbCBSTkciCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlY3Vyc2UiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlIDxzZWxpbnV4L2NvbnRleHQuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgT1BUX1JFQ1VSU0lWRQkJKDE8PDApCS8qICdSJyAqLworI2RlZmluZSBPUFRfQ0hBTkhFUwkJKDE8PDEpCS8qICdjJyAqLworI2RlZmluZSBPUFRfTk9ERVJFRkVSRU5DRQkoMTw8MikJLyogJ2gnICovCisjZGVmaW5lIE9QVF9RVUlFVAkJKDE8PDMpCS8qICdmJyAqLworI2RlZmluZSBPUFRfVVNFUgkJKDE8PDQpCS8qICd1JyAqLworI2RlZmluZSBPUFRfUk9MRQkJKDE8PDUpCS8qICdyJyAqLworI2RlZmluZSBPUFRfVFlQRQkJKDE8PDYpCS8qICd0JyAqLworI2RlZmluZSBPUFRfUkFOR0UJCSgxPDw3KQkvKiAnbCcgKi8KKyNkZWZpbmUgT1BUX1ZFUkJPU0UJCSgxPDw4KQkvKiAndicgKi8KKyNkZWZpbmUgT1BUX1JFRkVSRU5DRQkJKCgxPDw5KSAqIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUykKKyNkZWZpbmUgT1BUX0NPTVBPTkVOVF9TUEVDSUZJRUQJKE9QVF9VU0VSIHwgT1BUX1JPTEUgfCBPUFRfVFlQRSB8IE9QVF9SQU5HRSkKKworc3RhdGljIGNoYXIgKnVzZXIgPSBOVUxMOworc3RhdGljIGNoYXIgKnJvbGUgPSBOVUxMOworc3RhdGljIGNoYXIgKnR5cGUgPSBOVUxMOworc3RhdGljIGNoYXIgKnJhbmdlID0gTlVMTDsKK3N0YXRpYyBjaGFyICpzcGVjaWZpZWRfY29udGV4dCA9IE5VTEw7CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGNoYW5nZV9maWxlZGlyX2NvbnRleHQoCisJCWNvbnN0IGNoYXIgKmZuYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc3RidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJY29udGV4dF90IGNvbnRleHQgPSBOVUxMOworCXNlY3VyaXR5X2NvbnRleHRfdCBmaWxlX2NvbnRleHQgPSBOVUxMOworCXNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0X3N0cmluZzsKKwlpbnQgcmMgPSBGQUxTRTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX05PREVSRUZFUkVOQ0UpIHsKKwkJc3RhdHVzID0gbGdldGZpbGVjb24oZm5hbWUsICZmaWxlX2NvbnRleHQpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGdldGZpbGVjb24oZm5hbWUsICZmaWxlX2NvbnRleHQpOworCX0KKwlpZiAoc3RhdHVzIDwgMCAmJiBlcnJubyAhPSBFTk9EQVRBKSB7CisJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9RVUlFVCkgPT0gMCkKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3Qgb2J0YWluIHNlY3VyaXR5IGNvbnRleHQ6ICVzIiwgZm5hbWUpOworCQlnb3RvIHNraXA7CisJfQorCisJaWYgKGZpbGVfY29udGV4dCA9PSBOVUxMICYmIHNwZWNpZmllZF9jb250ZXh0ID09IE5VTEwpIHsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBhcHBseSBwYXJ0aWFsIGNvbnRleHQgdG8gdW5sYWJlbGVkIGZpbGUgJXMiLCBmbmFtZSk7CisJCWdvdG8gc2tpcDsKKwl9CisKKwlpZiAoc3BlY2lmaWVkX2NvbnRleHQgPT0gTlVMTCkgeworCQljb250ZXh0ID0gc2V0X3NlY3VyaXR5X2NvbnRleHRfY29tcG9uZW50KGZpbGVfY29udGV4dCwKKwkJCQkJCQkgdXNlciwgcm9sZSwgdHlwZSwgcmFuZ2UpOworCQlpZiAoIWNvbnRleHQpIHsKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgY29tcHV0ZSBzZWN1cml0eSBjb250ZXh0IGZyb20gJXMiLCBmaWxlX2NvbnRleHQpOworCQkJZ290byBza2lwOworCQl9CisJfSBlbHNlIHsKKwkJY29udGV4dCA9IGNvbnRleHRfbmV3KHNwZWNpZmllZF9jb250ZXh0KTsKKwkJaWYgKCFjb250ZXh0KSB7CisJCQliYl9lcnJvcl9tc2coImludmFsaWQgY29udGV4dDogJXMiLCBzcGVjaWZpZWRfY29udGV4dCk7CisJCQlnb3RvIHNraXA7CisJCX0KKwl9CisKKwljb250ZXh0X3N0cmluZyA9IGNvbnRleHRfc3RyKGNvbnRleHQpOworCWlmICghY29udGV4dF9zdHJpbmcpIHsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBvYnRhaW4gc2VjdXJpdHkgY29udGV4dCBpbiB0ZXh0IGV4cHJlc3Npb24iKTsKKwkJZ290byBza2lwOworCX0KKworCWlmIChmaWxlX2NvbnRleHQgPT0gTlVMTCB8fCBzdHJjbXAoY29udGV4dF9zdHJpbmcsIGZpbGVfY29udGV4dCkgIT0gMCkgeworCQlpbnQgZmFpbDsKKworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9OT0RFUkVGRVJFTkNFKSB7CisJCQlmYWlsID0gbHNldGZpbGVjb24oZm5hbWUsIGNvbnRleHRfc3RyaW5nKTsKKwkJfSBlbHNlIHsKKwkJCWZhaWwgPSBzZXRmaWxlY29uKGZuYW1lLCBjb250ZXh0X3N0cmluZyk7CisJCX0KKwkJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX1ZFUkJPU0UpIHx8ICgob3B0aW9uX21hc2szMiAmIE9QVF9DSEFOSEVTKSAmJiAhZmFpbCkpIHsKKwkJCXByaW50ZighZmFpbAorCQkJICAgICAgID8gImNvbnRleHQgb2YgJXMgY2hhbmdlZCB0byAlc1xuIgorCQkJICAgICAgIDogImNhbid0IGNoYW5nZSBjb250ZXh0IG9mICVzIHRvICVzXG4iLAorCQkJICAgICAgIGZuYW1lLCBjb250ZXh0X3N0cmluZyk7CisJCX0KKwkJaWYgKCFmYWlsKSB7CisJCQlyYyA9IFRSVUU7CisJCX0gZWxzZSBpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfUVVJRVQpID09IDApIHsKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgY2hhbmdlIGNvbnRleHQgb2YgJXMgdG8gJXMiLAorCQkJCSAgICAgZm5hbWUsIGNvbnRleHRfc3RyaW5nKTsKKwkJfQorCX0gZWxzZSBpZiAob3B0aW9uX21hc2szMiAmIE9QVF9WRVJCT1NFKSB7CisJCXByaW50ZigiY29udGV4dCBvZiAlcyByZXRhaW5lZCBhcyAlc1xuIiwgZm5hbWUsIGNvbnRleHRfc3RyaW5nKTsKKwkJcmMgPSBUUlVFOworCX0KK3NraXA6CisJY29udGV4dF9mcmVlKGNvbnRleHQpOworCWZyZWVjb24oZmlsZV9jb250ZXh0KTsKKworCXJldHVybiByYzsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgY2hjb25fbG9uZ29wdHNbXSBBTElHTjEgPQorCSJyZWN1cnNpdmVcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiUiIKKwkiY2hhbmdlc1wwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImMiCisJIm5vLWRlcmVmZXJlbmNlXDAiIE5vX2FyZ3VtZW50ICAgICAgICJoIgorCSJzaWxlbnRcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiZiIKKwkicXVpZXRcMCIgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJInVzZXJcMCIgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJyb2xlXDAiICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiciIKKwkidHlwZVwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInQiCisJInJhbmdlXDAiICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJsIgorCSJ2ZXJib3NlXDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAidiIKKwkicmVmZXJlbmNlXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlx4ZmYiIC8qIG5vIHNob3J0IG9wdGlvbiAqLworCTsKKyNlbmRpZgorCitpbnQgY2hjb25fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNoY29uX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpyZWZlcmVuY2VfZmlsZTsKKwljaGFyICpmbmFtZTsKKwlpbnQgaSwgZXJyb3JzID0gMDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBjaGNvbl9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIiAgLyogYXQgbGVhc3QgMSBwYXJhbSAqLworCQkiOj8iICAvKiBlcnJvciBpZiBleGNsdXNpdml0eSBjb25zdHJhaW50cyBhcmUgdmlvbGF0ZWQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMKKwkJIjpceGZmLS11cnRsOnUtLVx4ZmY6ci0tXHhmZjp0LS1ceGZmOmwtLVx4ZmYiCisjZW5kaWYKKwkJIjpmLS12OnYtLWYiOyAgLyogJ3ZlcmJvc2UnIGFuZCAncXVpZXQnIGFyZSBleGNsdXNpdmUgKi8KKwlnZXRvcHQzMihhcmd2LCAiUmNoZnU6cjp0Omw6diIsCisJCSZ1c2VyLCAmcm9sZSwgJnR5cGUsICZyYW5nZSwgJnJlZmVyZW5jZV9maWxlKTsKKwlhcmd2ICs9IG9wdGluZDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1JFRkVSRU5DRSkgeworCQkvKiBGSVhNRTogbGdldGZpbGVjb24oKSBzaG91bGQgYmUgdXNlZCB3aGVuICctaCcgaXMgc3BlY2lmaWVkLgorCQkgICBCdXQgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBvcmlnaW5hbCBvbmUuICovCisJCWlmIChnZXRmaWxlY29uKHJlZmVyZW5jZV9maWxlLCAmc3BlY2lmaWVkX2NvbnRleHQpIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0ZmlsZWNvbignJXMnKSBmYWlsZWQiLCByZWZlcmVuY2VfZmlsZSk7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfQ09NUE9ORU5UX1NQRUNJRklFRCkgPT0gMCkgeworCQlzcGVjaWZpZWRfY29udGV4dCA9ICphcmd2Kys7CisJCS8qIHNwZWNpZmllZF9jb250ZXh0IGlzIG5ldmVyIE5VTEwgLQorCQkgKiAiLTEiIGluIG9wdF9jb21wbGVtZW50YXJ5IHByZXZlbnRzIHRoaXMuICovCisJCWlmICghYXJndlswXSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gZmV3IGFyZ3VtZW50cyIpOworCX0KKworCWZvciAoaSA9IDA7IChmbmFtZSA9IGFyZ3ZbaV0pICE9IE5VTEw7IGkrKykgeworCQlpbnQgZm5hbWVfbGVuID0gc3RybGVuKGZuYW1lKTsKKwkJd2hpbGUgKGZuYW1lX2xlbiA+IDEgJiYgZm5hbWVbZm5hbWVfbGVuIC0gMV0gPT0gJy8nKQorCQkJZm5hbWVfbGVuLS07CisJCWZuYW1lW2ZuYW1lX2xlbl0gPSAnXDAnOworCisJCWlmIChyZWN1cnNpdmVfYWN0aW9uKGZuYW1lLAorCQkJCSAgICAgMTw8b3B0aW9uX21hc2szMiAmIE9QVF9SRUNVUlNJVkUsCisJCQkJICAgICBjaGFuZ2VfZmlsZWRpcl9jb250ZXh0LAorCQkJCSAgICAgY2hhbmdlX2ZpbGVkaXJfY29udGV4dCwKKwkJCQkgICAgIE5VTEwsIDApICE9IFRSVUUpCisJCQllcnJvcnMgPSAxOworCX0KKwlyZXR1cm4gZXJyb3JzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9nZXRlbmZvcmNlLmMgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L2dldGVuZm9yY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYxMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9nZXRlbmZvcmNlLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGdldGVuZm9yY2UKKyAqCisgKiBCYXNlZCBvbiBsaWJzZWxpbnV4IDEuMzMuMQorICogUG9ydCB0byBCdXN5Qm94ICBIaXJvc2hpIFNoaW5qaSA8c2hpcm9zaGlAbXkuZW1haWwubmUuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZ2V0ZW5mb3JjZV90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZ2V0ZW5mb3JjZV9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZ2V0ZW5mb3JjZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZ2V0ZW5mb3JjZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWludCByYzsKKworCXJjID0gaXNfc2VsaW51eF9lbmFibGVkKCk7CisJaWYgKHJjIDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlzX3NlbGludXhfZW5hYmxlZCgpIGZhaWxlZCIpOworCisJaWYgKHJjID09IDEpIHsKKwkJcmMgPSBzZWN1cml0eV9nZXRlbmZvcmNlKCk7CisJCWlmIChyYyA8IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZ2V0ZW5mb3JjZSgpIGZhaWxlZCIpOworCisJCWlmIChyYykKKwkJCXB1dHMoIkVuZm9yY2luZyIpOworCQllbHNlCisJCQlwdXRzKCJQZXJtaXNzaXZlIik7CisJfSBlbHNlIHsKKwkJcHV0cygiRGlzYWJsZWQiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NlbGludXgvZ2V0c2Vib29sLmMgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L2dldHNlYm9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjBmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L2dldHNlYm9vbC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBnZXRzZWJvb2wKKyAqCisgKiBCYXNlZCBvbiBsaWJzZWxpbnV4IDEuMzMuMQorICogUG9ydCB0byBCdXN5Qm94ICBIaXJvc2hpIFNoaW5qaSA8c2hpcm9zaGlAbXkuZW1haWwubmUuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZ2V0c2Vib29sX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItYSBvciBnZXRzZWJvb2wgYm9vbGVhbi4uLiIKKy8vdXNhZ2U6I2RlZmluZSBnZXRzZWJvb2xfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWEJU2hvdyBhbGwgc2VsaW51eCBib29sZWFucyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBnZXRzZWJvb2xfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGdldHNlYm9vbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgcmMgPSAwLCBhY3RpdmUsIHBlbmRpbmcsIGxlbiA9IDA7CisJY2hhciAqKm5hbWVzOworCXVuc2lnbmVkIG9wdDsKKworCXNlbGludXhfb3JfZGllKCk7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImEiKTsKKworCWlmIChvcHQpIHsgLyogLWEgKi8KKwkJaWYgKGFyZ2MgPiAyKQorCQkJYmJfc2hvd191c2FnZSgpOworCisJCXJjID0gc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fbmFtZXMoJm5hbWVzLCAmbGVuKTsKKwkJaWYgKHJjKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgYm9vbGVhbiBuYW1lcyIpOworCisJCWlmICghbGVuKSB7CisJCQlwdXRzKCJObyBib29sZWFucyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIWxlbikgeworCQlpZiAoYXJnYyA8IDIpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWxlbiA9IGFyZ2MgLSAxOworCQluYW1lcyA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBsZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQluYW1lc1tpXSA9IHhzdHJkdXAoYXJndltpICsgMV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlhY3RpdmUgPSBzZWN1cml0eV9nZXRfYm9vbGVhbl9hY3RpdmUobmFtZXNbaV0pOworCQlpZiAoYWN0aXZlIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGdldHRpbmcgYWN0aXZlIHZhbHVlIGZvciAlcyIsIG5hbWVzW2ldKTsKKwkJfQorCQlwZW5kaW5nID0gc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fcGVuZGluZyhuYW1lc1tpXSk7CisJCWlmIChwZW5kaW5nIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGdldHRpbmcgcGVuZGluZyB2YWx1ZSBmb3IgJXMiLCBuYW1lc1tpXSk7CisJCX0KKwkJcHJpbnRmKCIlcyAtLT4gJXMiLCBuYW1lc1tpXSwgKGFjdGl2ZSA/ICJvbiIgOiAib2ZmIikpOworCQlpZiAocGVuZGluZyAhPSBhY3RpdmUpCisJCQlwcmludGYoIiBwZW5kaW5nOiAlcyIsIChwZW5kaW5nID8gIm9uIiA6ICJvZmYiKSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCWZyZWUobmFtZXNbaV0pOworCQlmcmVlKG5hbWVzKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L2xvYWRfcG9saWN5LmMgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L2xvYWRfcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxMzlkYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvbG9hZF9wb2xpY3kuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICogbG9hZF9wb2xpY3kKKyAqIEF1dGhvcjogWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9hZF9wb2xpY3lfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIGxvYWRfcG9saWN5X2Z1bGxfdXNhZ2UgIiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBsb2FkX3BvbGljeV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9hZF9wb2xpY3lfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgcmM7CisKKwlpZiAoYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJcmMgPSBzZWxpbnV4X21rbG9hZF9wb2xpY3koMSk7CisJaWYgKHJjIDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGxvYWQgcG9saWN5Iik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L21hdGNocGF0aGNvbi5jIGIvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9tYXRjaHBhdGhjb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9tYXRjaHBhdGhjb24uYwpAQCAtMCwwICsxLDk3IEBACisvKiBtYXRjaHBhdGhjb24gIC0gIGdldCB0aGUgZGVmYXVsdCBzZWN1cml0eSBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICAgIHBhdGggZnJvbSB0aGUgZmlsZSBjb250ZXh0cyBjb25maWd1cmF0aW9uLgorICogICAgICAgICAgICAgICAgICBiYXNlZCBvbiBsaWJzZWxpbnV4LTEuMzIKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1hdGNocGF0aGNvbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1uXSBbLU5dIFstZiBmaWxlX2NvbnRleHRzX2ZpbGVdIFstcCBwcmVmaXhdIFstVl0iCisvL3VzYWdlOiNkZWZpbmUgbWF0Y2hwYXRoY29uX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1uCURvbid0IGRpc3BsYXkgcGF0aCIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JRG9uJ3QgdXNlIHRyYW5zbGF0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJVXNlIGFsdGVybmF0ZSBmaWxlX2NvbnRleHQgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJVXNlIHByZWZpeCB0byBzcGVlZCB0cmFuc2xhdGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1WCVZlcmlmeSBmaWxlIGNvbnRleHQgb24gZGlzayBtYXRjaGVzIGRlZmF1bHRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGludCBwcmludF9tYXRjaHBhdGhjb24oY2hhciAqcGF0aCwgaW50IG5vcHJpbnQpCit7CisJY2hhciAqYnVmOworCWludCByYyA9IG1hdGNocGF0aGNvbihwYXRoLCAwLCAmYnVmKTsKKwlpZiAocmMgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIm1hdGNocGF0aGNvbiglcykgZmFpbGVkIiwgcGF0aCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIW5vcHJpbnQpCisJCXByaW50ZigiJXNcdCVzXG4iLCBwYXRoLCBidWYpOworCWVsc2UKKwkJcHV0cyhidWYpOworCisJZnJlZWNvbihidWYpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE9QVF9OT1RfUFJJTlQgICAoMTw8MCkgIC8qIC1uICovCisjZGVmaW5lIE9QVF9OT1RfVFJBTlMgICAoMTw8MSkgIC8qIC1OICovCisjZGVmaW5lIE9QVF9GQ09OVEVYVCAgICAoMTw8MikgIC8qIC1mICovCisjZGVmaW5lIE9QVF9QUkVGSVggICAgICAoMTw8MykgIC8qIC1wICovCisjZGVmaW5lIE9QVF9WRVJJRlkgICAgICAoMTw8NCkgIC8qIC1WICovCisKK2ludCBtYXRjaHBhdGhjb25fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1hdGNocGF0aGNvbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGVycm9yID0gMDsKKwl1bnNpZ25lZCBvcHRzOworCWNoYXIgKmZjb250ZXh0LCAqcHJlZml4LCAqcGF0aDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIiAvKiBhdCBsZWFzdCBvbmUgcGFyYW0gcmVxZCAqLworCQkiOj86Zi0tcDpwLS1mIjsgLyogbXV0dWFsbHkgZXhjbHVzaXZlICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJuTmY6cDpWIiwgJmZjb250ZXh0LCAmcHJlZml4KTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChvcHRzICYgT1BUX05PVF9UUkFOUykgeworCQlzZXRfbWF0Y2hwYXRoY29uX2ZsYWdzKE1BVENIUEFUSENPTl9OT1RSQU5TKTsKKwl9CisJaWYgKG9wdHMgJiBPUFRfRkNPTlRFWFQpIHsKKwkJaWYgKG1hdGNocGF0aGNvbl9pbml0KGZjb250ZXh0KSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAlcyIsIGZjb250ZXh0KTsKKwl9CisJaWYgKG9wdHMgJiBPUFRfUFJFRklYKSB7CisJCWlmIChtYXRjaHBhdGhjb25faW5pdF9wcmVmaXgoTlVMTCwgcHJlZml4KSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAlcyIsIHByZWZpeCk7CisJfQorCisJd2hpbGUgKChwYXRoID0gKmFyZ3YrKykgIT0gTlVMTCkgeworCQlzZWN1cml0eV9jb250ZXh0X3QgY29uOworCQlpbnQgcmM7CisKKwkJaWYgKCEob3B0cyAmIE9QVF9WRVJJRlkpKSB7CisJCQllcnJvciArPSBwcmludF9tYXRjaHBhdGhjb24ocGF0aCwgb3B0cyAmIE9QVF9OT1RfUFJJTlQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc2VsaW51eF9maWxlX2NvbnRleHRfdmVyaWZ5KHBhdGgsIDApKSB7CisJCQlwcmludGYoIiVzIHZlcmlmaWVkXG4iLCBwYXRoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG9wdHMgJiBPUFRfTk9UX1RSQU5TKQorCQkJcmMgPSBsZ2V0ZmlsZWNvbl9yYXcocGF0aCwgJmNvbik7CisJCWVsc2UKKwkJCXJjID0gbGdldGZpbGVjb24ocGF0aCwgJmNvbik7CisKKwkJaWYgKHJjID49IDApIHsKKwkJCXByaW50ZigiJXMgaGFzIGNvbnRleHQgJXMsIHNob3VsZCBiZSAiLCBwYXRoLCBjb24pOworCQkJZXJyb3IgKz0gcHJpbnRfbWF0Y2hwYXRoY29uKHBhdGgsIDEpOworCQkJZnJlZWNvbihjb24pOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCJhY3R1YWwgY29udGV4dCB1bmtub3duOiAlcywgc2hvdWxkIGJlICIsIHN0cmVycm9yKGVycm5vKSk7CisJCWVycm9yICs9IHByaW50X21hdGNocGF0aGNvbihwYXRoLCAxKTsKKwl9CisJbWF0Y2hwYXRoY29uX2ZpbmkoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L3J1bmNvbi5jIGIvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9ydW5jb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTgzYTIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9ydW5jb24uYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIHJ1bmNvbiBbIGNvbnRleHQgfAorICogICAgICAgICAoIFsgLWMgXSBbIC1yIHJvbGUgXSBbLXQgdHlwZV0gWyAtdSB1c2VyIF0gWyAtbCBsZXZlbHJhbmdlIF0gKQorICogICAgICAgICBjb21tYW5kIFthcmcxIFthcmcyIC4uLl0gXQorICoKKyAqIGF0dGVtcHQgdG8gcnVuIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGV4dC4KKyAqCisgKiAtciByb2xlICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCByb2xlCisgKiAtdCB0eXBlICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlCisgKiAtdSB1c2VyICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCB1c2VyCisgKiAtbCBsZXZlbCA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCBsZXZlbCByYW5nZQorICogLWMgICAgICAgOiBjb21wdXRlIHByb2Nlc3MgdHJhbnNpdGlvbiBjb250ZXh0IGJlZm9yZSBtb2RpZnlpbmcKKyAqCisgKiBDb250ZXh0cyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKyAqCisgKiBOdW1iZXIgb2YgICAgICAgTUxTCisgKiBjb21wb25lbnRzICAgIHN5c3RlbT8KKyAqCisgKiAgICAgMSAgICAgICAgICAgIC0gICAgICAgICB0eXBlCisgKiAgICAgMiAgICAgICAgICAgIC0gICAgICAgICByb2xlOnR5cGUKKyAqICAgICAzICAgICAgICAgICAgWSAgICAgICAgIHJvbGU6dHlwZTpyYW5nZQorICogICAgIDMgICAgICAgICAgICBOICAgICAgICAgdXNlcjpyb2xlOnR5cGUKKyAqICAgICA0ICAgICAgICAgICAgWSAgICAgICAgIHVzZXI6cm9sZTp0eXBlOnJhbmdlCisgKiAgICAgNCAgICAgICAgICAgIE4gICAgICAgICBlcnJvcgorICoKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICogICAgICAgICAgICAgICAgICAtIGJhc2VkIG9uIGNvcmV1dGlscy01Ljk3IChpbiBGZWRvcmEgQ29yZSA2KQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJ1bmNvbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jXSBbLXUgVVNFUl0gWy1yIFJPTEVdIFstdCBUWVBFXSBbLWwgUkFOR0VdIFBST0cgQVJHU1xuIgorLy91c2FnZTogICAgICAgInJ1bmNvbiBDT05URVhUIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBydW5jb25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyBpbiBhIGRpZmZlcmVudCBzZWN1cml0eSBjb250ZXh0XG4iCisvL3VzYWdlOiAgICAgIlxuCUNPTlRFWFQJCUNvbXBsZXRlIHNlY3VyaXR5IGNvbnRleHRcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jb21wdXRlCUNvbXB1dGUgcHJvY2VzcyB0cmFuc2l0aW9uIGNvbnRleHQgYmVmb3JlIG1vZGlmeWluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10eXBlPVRZUEUJVHlwZSAoZm9yIHNhbWUgcm9sZSBhcyBwYXJlbnQpIgorLy91c2FnZTogICAgICJcbgktdSwtLXVzZXI9VVNFUglVc2VyIGlkZW50aXR5IgorLy91c2FnZTogICAgICJcbgktciwtLXJvbGU9Uk9MRQlSb2xlIgorLy91c2FnZTogICAgICJcbgktbCwtLXJhbmdlPVJORwlMZXZlbHJhbmdlIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ29tcHV0ZSBwcm9jZXNzIHRyYW5zaXRpb24gY29udGV4dCBiZWZvcmUgbW9kaWZ5aW5nIgorLy91c2FnZTogICAgICJcbgktdCBUWVBFCVR5cGUgKGZvciBzYW1lIHJvbGUgYXMgcGFyZW50KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUglVc2VyIGlkZW50aXR5IgorLy91c2FnZTogICAgICJcbgktciBST0xFCVJvbGUiCisvL3VzYWdlOiAgICAgIlxuCS1sIFJORwlMZXZlbHJhbmdlIgorLy91c2FnZToJKQorCisjaW5jbHVkZSA8c2VsaW51eC9jb250ZXh0Lmg+CisjaW5jbHVkZSA8c2VsaW51eC9mbGFzay5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGNvbnRleHRfdCBydW5jb25fY29tcHV0ZV9uZXdfY29udGV4dChjaGFyICp1c2VyLCBjaGFyICpyb2xlLCBjaGFyICp0eXBlLCBjaGFyICpyYW5nZSwKKwkJCQkJICAgIGNoYXIgKmNvbW1hbmQsIGludCBjb21wdXRlX3RyYW5zKQoreworCWNvbnRleHRfdCBjb247CisJc2VjdXJpdHlfY29udGV4dF90IGN1cl9jb250ZXh0OworCisJaWYgKGdldGNvbigmY3VyX2NvbnRleHQpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IGN1cnJlbnQgY29udGV4dCIpOworCisJaWYgKGNvbXB1dGVfdHJhbnMpIHsKKwkJc2VjdXJpdHlfY29udGV4dF90IGZpbGVfY29udGV4dCwgbmV3X2NvbnRleHQ7CisKKwkJaWYgKGdldGZpbGVjb24oY29tbWFuZCwgJmZpbGVfY29udGV4dCkgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJldHJpZXZlIGF0dHJpYnV0ZXMgb2YgJyVzJyIsCisJCQkJCSAgICAgY29tbWFuZCk7CisJCWlmIChzZWN1cml0eV9jb21wdXRlX2NyZWF0ZShjdXJfY29udGV4dCwgZmlsZV9jb250ZXh0LAorCQkJCQkgICAgU0VDQ0xBU1NfUFJPQ0VTUywgJm5ld19jb250ZXh0KSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmFibGUgdG8gY29tcHV0ZSBhIG5ldyBjb250ZXh0Iik7CisJCWN1cl9jb250ZXh0ID0gbmV3X2NvbnRleHQ7CisJfQorCisJY29uID0gY29udGV4dF9uZXcoY3VyX2NvbnRleHQpOworCWlmICghY29uKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBub3QgYSB2YWxpZCBjb250ZXh0IiwgY3VyX2NvbnRleHQpOworCWlmICh1c2VyICYmIGNvbnRleHRfdXNlcl9zZXQoY29uLCB1c2VyKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNldCBuZXcgdXNlciAnJXMnIiwgdXNlcik7CisJaWYgKHR5cGUgJiYgY29udGV4dF90eXBlX3NldChjb24sIHR5cGUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG5ldyB0eXBlICclcyciLCB0eXBlKTsKKwlpZiAocmFuZ2UgJiYgY29udGV4dF9yYW5nZV9zZXQoY29uLCByYW5nZSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgbmV3IHJhbmdlICclcyciLCByYW5nZSk7CisJaWYgKHJvbGUgJiYgY29udGV4dF9yb2xlX3NldChjb24sIHJvbGUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG5ldyByb2xlICclcyciLCByb2xlKTsKKworCXJldHVybiBjb247Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBydW5jb25fbG9uZ29wdHNbXSBBTElHTjEgPQorCSJ1c2VyXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJyb2xlXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJyIgorCSJ0eXBlXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCSJyYW5nZVwwIiAgIFJlcXVpcmVkX2FyZ3VtZW50ICJsIgorCSJjb21wdXRlXDAiIE5vX2FyZ3VtZW50ICJjIgorCSJoZWxwXDAiICAgIE5vX2FyZ3VtZW50ICJoIgorCTsKKyNlbmRpZgorCisjZGVmaW5lIE9QVFNfUk9MRQkoMTw8MCkJLyogciAqLworI2RlZmluZSBPUFRTX1RZUEUJKDE8PDEpCS8qIHQgKi8KKyNkZWZpbmUgT1BUU19VU0VSCSgxPDwyKQkvKiB1ICovCisjZGVmaW5lIE9QVFNfUkFOR0UJKDE8PDMpCS8qIGwgKi8KKyNkZWZpbmUgT1BUU19DT01QVVRFCSgxPDw0KQkvKiBjICovCisjZGVmaW5lIE9QVFNfSEVMUAkoMTw8NSkJLyogaCAqLworI2RlZmluZSBPUFRTX0NPTlRFWFRfQ09NUE9ORU5UCQkoT1BUU19ST0xFIHwgT1BUU19UWVBFIHwgT1BUU19VU0VSIHwgT1BUU19SQU5HRSkKKworaW50IHJ1bmNvbl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnVuY29uX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpyb2xlID0gTlVMTDsKKwljaGFyICpyYW5nZSA9IE5VTEw7CisJY2hhciAqdXNlciA9IE5VTEw7CisJY2hhciAqdHlwZSA9IE5VTEw7CisJY2hhciAqY29udGV4dCA9IE5VTEw7CisJdW5zaWduZWQgb3B0czsKKwljb250ZXh0X3QgY29uOworCisJc2VsaW51eF9vcl9kaWUoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTkNPTl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gcnVuY29uX2xvbmdvcHRzOworI2VuZGlmCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAicjp0OnU6bDpjaCIsICZyb2xlLCAmdHlwZSwgJnVzZXIsICZyYW5nZSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoIShvcHRzICYgT1BUU19DT05URVhUX0NPTVBPTkVOVCkpIHsKKwkJY29udGV4dCA9ICphcmd2Kys7CisJCWlmICghYXJndlswXSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBjb21tYW5kIGdpdmVuIik7CisJfQorCisJaWYgKGNvbnRleHQpIHsKKwkJY29uID0gY29udGV4dF9uZXcoY29udGV4dCk7CisJCWlmICghY29uKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgaXMgbm90IGEgdmFsaWQgY29udGV4dCIsIGNvbnRleHQpOworCX0gZWxzZSB7CisJCWNvbiA9IHJ1bmNvbl9jb21wdXRlX25ld19jb250ZXh0KHVzZXIsIHJvbGUsIHR5cGUsIHJhbmdlLAorCQkJCWFyZ3ZbMF0sIG9wdHMgJiBPUFRTX0NPTVBVVEUpOworCX0KKworCWlmIChzZWN1cml0eV9jaGVja19jb250ZXh0KGNvbnRleHRfc3RyKGNvbikpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBub3QgYSB2YWxpZCBjb250ZXh0IiwKKwkJCQkgICAgIGNvbnRleHRfc3RyKGNvbikpOworCisJaWYgKHNldGV4ZWNjb24oY29udGV4dF9zdHIoY29uKSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgdXAgc2VjdXJpdHkgY29udGV4dCAnJXMnIiwKKwkJCQkgICAgIGNvbnRleHRfc3RyKGNvbikpOworCisJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NlbGludXgvc2VsaW51eGVuYWJsZWQuYyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvc2VsaW51eGVuYWJsZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTgzMGRjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9zZWxpbnV4ZW5hYmxlZC5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBzZWxpbnV4ZW5hYmxlZAorICoKKyAqIEJhc2VkIG9uIGxpYnNlbGludXggMS4zMy4xCisgKiBQb3J0IHRvIEJ1c3lCb3ggIEhpcm9zaGkgU2hpbmppIDxzaGlyb3NoaUBteS5lbWFpbC5uZS5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZWxpbnV4ZW5hYmxlZF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgc2VsaW51eGVuYWJsZWRfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHNlbGludXhlbmFibGVkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZWxpbnV4ZW5hYmxlZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAhaXNfc2VsaW51eF9lbmFibGVkKCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L3Nlc3RhdHVzLmMgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L3Nlc3RhdHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkMWEwZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvc2VzdGF0dXMuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIHNlc3RhdHVzIC0tIGRpc3BsYXlzIHRoZSBzdGF0dXMgb2YgU0VMaW51eAorICoKKyAqIFBvcnRlZCB0byBidXN5Ym94OiBLYWlHYWkgS29oZWkgPGthaWdhaUBhay5qcC5uZWMuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgS2FpR2FpIEtvaGVpIDxrYWlnYWlAYWsuanAubmVjLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXN0YXR1c190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12Yl0iCisvL3VzYWdlOiNkZWZpbmUgc2VzdGF0dXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJRGlzcGxheSBjdXJyZW50IHN0YXRlIG9mIGJvb2xlYW5zIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZXh0ZXJuIGNoYXIgKnNlbGludXhfbW50OworCisjZGVmaW5lIE9QVF9WRVJCT1NFICAoMSA8PCAwKQorI2RlZmluZSBPUFRfQk9PTEVBTiAgKDEgPDwgMSkKKworI2RlZmluZSBDT0xfRk1UICAiJS0zMXMgIgorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2Jvb2xlYW4odm9pZCkKK3sKKwljaGFyICoqYm9vbHM7CisJaW50IGksIGFjdGl2ZSwgcGVuZGluZywgbmJvb2w7CisKKwlpZiAoc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fbmFtZXMoJmJvb2xzLCAmbmJvb2wpIDwgMCkKKwkJcmV0dXJuOworCisJcHV0cygiXG5Qb2xpY3kgYm9vbGVhbnM6Iik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJvb2w7IGkrKykgeworCQlhY3RpdmUgPSBzZWN1cml0eV9nZXRfYm9vbGVhbl9hY3RpdmUoYm9vbHNbaV0pOworCQlpZiAoYWN0aXZlIDwgMCkKKwkJCWdvdG8gc2tpcDsKKwkJcGVuZGluZyA9IHNlY3VyaXR5X2dldF9ib29sZWFuX3BlbmRpbmcoYm9vbHNbaV0pOworCQlpZiAocGVuZGluZyA8IDApCisJCQlnb3RvIHNraXA7CisJCXByaW50ZihDT0xfRk1UICIlcyIsCisJCSAgICAgICBib29sc1tpXSwgYWN0aXZlID09IDAgPyAib2ZmIiA6ICJvbiIpOworCQlpZiAoYWN0aXZlICE9IHBlbmRpbmcpCisJCQlwcmludGYoIiAoJXNhY3RpdmF0ZSBwZW5kaW5nKSIsIHBlbmRpbmcgPT0gMCA/ICJpbiIgOiAiIik7CisJCWJiX3B1dGNoYXIoJ1xuJyk7Cisgc2tpcDoKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShib29sc1tpXSk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShib29scyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfY29uZmlnKGNoYXIgKipwYywgaW50IG5wYywgY2hhciAqKmZjLCBpbnQgbmZjKQoreworCWNoYXIgKmJ1ZjsKKwlwYXJzZXJfdCAqcGFyc2VyOworCWludCBwY19vZnMgPSAwLCBmY19vZnMgPSAwLCBzZWN0aW9uID0gLTE7CisKKwlwY1swXSA9IGZjWzBdID0gTlVMTDsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuKCIvZXRjL3Nlc3RhdHVzLmNvbmYiKTsKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCAmYnVmLCAxLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJaWYgKHN0cmNtcChidWYsICJbcHJvY2Vzc10iKSA9PSAwKSB7CisJCQlzZWN0aW9uID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYnVmLCAiW2ZpbGVzXSIpID09IDApIHsKKwkJCXNlY3Rpb24gPSAyOworCQl9IGVsc2UgeworCQkJaWYgKHNlY3Rpb24gPT0gMSAmJiBwY19vZnMgPCBucGMgLTEpIHsKKwkJCQlwY1twY19vZnMrK10gPSB4c3RyZHVwKGJ1Zik7CisJCQkJcGNbcGNfb2ZzXSA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKHNlY3Rpb24gPT0gMiAmJiBmY19vZnMgPCBuZmMgLSAxKSB7CisJCQkJZmNbZmNfb2ZzKytdID0geHN0cmR1cChidWYpOworCQkJCWZjW2ZjX29mc10gPSBOVUxMOworCQkJfQorCQl9CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3ZlcmJvc2Uodm9pZCkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3QgY29uLCBfY29uOworCWNoYXIgKmZjWzUwXSwgKnBjWzUwXSwgKmN0ZXJtOworCXBpZF90ICpwaWRMaXN0OworCWludCBpOworCisJcmVhZF9jb25maWcocGMsIEFSUkFZX1NJWkUocGMpLCBmYywgQVJSQVlfU0laRShmYykpOworCisJLyogcHJvY2VzcyBjb250ZXh0cyAqLworCXB1dHMoIlxuUHJvY2VzcyBjb250ZXh0czoiKTsKKworCS8qIGN1cnJlbnQgY29udGV4dCAqLworCWlmIChnZXRjb24oJmNvbikgPT0gMCkgeworCQlwcmludGYoQ09MX0ZNVCAiJXNcbiIsICJDdXJyZW50IGNvbnRleHQ6IiwgY29uKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KKwkvKiAvc2Jpbi9pbml0IGNvbnRleHQgKi8KKwlpZiAoZ2V0cGlkY29uKDEsICZjb24pID09IDApIHsKKwkJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiSW5pdCBjb250ZXh0OiIsIGNvbik7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWVjb24oY29uKTsKKwl9CisKKwkvKiBbcHJvY2Vzc10gY29udGV4dCAqLworCWZvciAoaSA9IDA7IHBjW2ldICE9IE5VTEw7IGkrKykgeworCQlwaWRMaXN0ID0gZmluZF9waWRfYnlfbmFtZShiYl9iYXNlbmFtZShwY1tpXSkpOworCQlpZiAocGlkTGlzdFswXSA+IDAgJiYgZ2V0cGlkY29uKHBpZExpc3RbMF0sICZjb24pID09IDApIHsKKwkJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgcGNbaV0sIGNvbik7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZWNvbihjb24pOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUocGlkTGlzdCk7CisJfQorCisJLyogZmlsZXMgY29udGV4dHMgKi8KKwlwdXRzKCJcbkZpbGUgY29udGV4dHM6Iik7CisKKwljdGVybSA9IHhtYWxsb2NfdHR5bmFtZSgwKTsKKy8vRklYTUU6IGlmIGN0ZXJtID09IE5VTEwsIHdlIHNlZ2ZhdWx0IT8/CisJcHV0cyhjdGVybSk7CisJaWYgKGN0ZXJtICYmIGxnZXRmaWxlY29uKGN0ZXJtLCAmY29uKSA+PSAwKSB7CisJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIkNvbnRyb2xsaW5nIHRlcm06IiwgY29uKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KKworCWZvciAoaSA9IDA7IGZjW2ldICE9IE5VTEw7IGkrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKworCQlpZiAobGdldGZpbGVjb24oZmNbaV0sICZjb24pIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAobHN0YXQoZmNbaV0sICZzdGJ1ZikgPT0gMCkgeworCQkJaWYgKFNfSVNMTksoc3RidWYuc3RfbW9kZSkpIHsKKwkJCQlpZiAoZ2V0ZmlsZWNvbihmY1tpXSwgJl9jb24pID49IDApIHsKKwkJCQkJcHJpbnRmKENPTF9GTVQgIiVzIC0+ICVzXG4iLCBmY1tpXSwgX2NvbiwgY29uKTsKKwkJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCQkJZnJlZWNvbihfY29uKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgZmNbaV0sIGNvbik7CisJCQl9CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KK30KKworaW50IHNlc3RhdHVzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXN0YXR1c19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwljb25zdCBjaGFyICpwb2xfcGF0aDsKKwlpbnQgcmM7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MCI7ICAvKiBubyBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLiAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAidmIiKTsKKworCS8qIFNFTGludXggc3RhdHVzOiBsaW5lICovCisJcmMgPSBpc19zZWxpbnV4X2VuYWJsZWQoKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycm9yOworCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIlNFTGludXggc3RhdHVzOiIsCisJICAgICAgIHJjID09IDEgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCS8qIFNFTGludXhmcyBtb3VudDogbGluZSAqLworCWlmICghc2VsaW51eF9tbnQpCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiU0VMaW51eGZzIG1vdW50OiIsCisJICAgICAgIHNlbGludXhfbW50KTsKKworCS8qIEN1cnJlbnQgbW9kZTogbGluZSAqLworCXJjID0gc2VjdXJpdHlfZ2V0ZW5mb3JjZSgpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiQ3VycmVudCBtb2RlOiIsCisJICAgICAgIHJjID09IDAgPyAicGVybWlzc2l2ZSIgOiAiZW5mb3JjaW5nIik7CisKKwkvKiBNb2RlIGZyb20gY29uZmlnIGZpbGU6IGxpbmUgKi8KKwlpZiAoc2VsaW51eF9nZXRlbmZvcmNlbW9kZSgmcmMpICE9IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiTW9kZSBmcm9tIGNvbmZpZyBmaWxlOiIsCisJICAgICAgIHJjIDwgMCA/ICJkaXNhYmxlZCIgOiAocmMgPT0gMCA/ICJwZXJtaXNzaXZlIiA6ICJlbmZvcmNpbmciKSk7CisKKwkvKiBQb2xpY3kgdmVyc2lvbjogbGluZSAqLworCXJjID0gc2VjdXJpdHlfcG9saWN5dmVycygpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiV1XG4iLCAiUG9saWN5IHZlcnNpb246IiwgcmMpOworCisJLyogUG9saWN5IGZyb20gY29uZmlnIGZpbGU6IGxpbmUgKi8KKwlwb2xfcGF0aCA9IHNlbGludXhfcG9saWN5X3Jvb3QoKTsKKwlpZiAoIXBvbF9wYXRoKQorCQlnb3RvIGVycm9yOworCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIlBvbGljeSBmcm9tIGNvbmZpZyBmaWxlOiIsCisJICAgICAgIGJiX2Jhc2VuYW1lKHBvbF9wYXRoKSk7CisKKwlpZiAob3B0cyAmIE9QVF9CT09MRUFOKQorCQlkaXNwbGF5X2Jvb2xlYW4oKTsKKwlpZiAob3B0cyAmIE9QVF9WRVJCT1NFKQorCQlkaXNwbGF5X3ZlcmJvc2UoKTsKKworCXJldHVybiAwOworCisgIGVycm9yOgorCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibGlic2VsaW51eCByZXR1cm5zIHVua25vd24gc3RhdGUiKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NlbGludXgvc2V0ZW5mb3JjZS5jIGIvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9zZXRlbmZvcmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViYzBhNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvc2V0ZW5mb3JjZS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBzZXRlbmZvcmNlCisgKgorICogQmFzZWQgb24gbGlic2VsaW51eCAxLjMzLjEKKyAqIFBvcnQgdG8gQnVzeUJveCAgSGlyb3NoaSBTaGluamkgPHNoaXJvc2hpQG15LmVtYWlsLm5lLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNldGVuZm9yY2VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltFbmZvcmNpbmcgfCBQZXJtaXNzaXZlIHwgMSB8IDBdIgorLy91c2FnZTojZGVmaW5lIHNldGVuZm9yY2VfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhlc2Ugc3RyaW5ncyBhcmUgYXJyYW5nZWQgc28gdGhhdCBvZGQgb25lcworICogcmVzdWx0IGluIHNlY3VyaXR5X3NldGVuZm9yY2UoMSkgYmVpbmcgZG9uZSwKKyAqIHRoZSByZXN0IHdpbGwgZG8gc2VjdXJpdHlfc2V0ZW5mb3JjZSgwKSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNldGVuZm9yY2VfY21kW10gPSB7CisJIjAiLAorCSIxIiwKKwkicGVybWlzc2l2ZSIsCisJImVuZm9yY2luZyIsCisJTlVMTCwKK307CisKK2ludCBzZXRlbmZvcmNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRlbmZvcmNlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgcmM7CisKKwlpZiAoIWFyZ3ZbMV0gfHwgYXJndlsyXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJc2VsaW51eF9vcl9kaWUoKTsKKworCWZvciAoaSA9IDA7IHNldGVuZm9yY2VfY21kW2ldOyBpKyspIHsKKwkJaWYgKHN0cmNhc2VjbXAoYXJndlsxXSwgc2V0ZW5mb3JjZV9jbWRbaV0pICE9IDApCisJCQljb250aW51ZTsKKwkJcmMgPSBzZWN1cml0eV9zZXRlbmZvcmNlKGkgJiAxKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0ZW5mb3JjZSgpIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwliYl9zaG93X3VzYWdlKCk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L3NldGZpbGVzLmMgYi9idXN5Ym94LTEuMTkuMy9zZWxpbnV4L3NldGZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzZmQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvc2V0ZmlsZXMuYwpAQCAtMCwwICsxLDY4MCBAQAorLyoKKyAgc2V0ZmlsZXM6IGJhc2VkIG9uIHBvbGljeWNvcmV1dGlscyAyLjAuMTkKKyAgcG9saWN5Y29yZXV0aWxzIHdhcyByZWxlYXNlZCB1bmRlciBHUEwgMi4KKyAgUG9ydCB0byBCdXN5Qm94IChjKSAyMDA3IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorKi8KKworLy91c2FnZTojZGVmaW5lIHNldGZpbGVzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWRucHFzdlddIFstZSBESVJdLi4uIFstbyBGSUxFXSBbLXIgYWx0X3Jvb3RfcGF0aF0iCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTigKKy8vdXNhZ2U6ICAgICAgICIgWy1jIHBvbGljeWZpbGVdIHNwZWNfZmlsZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAgICIgcGF0aG5hbWUiCisvL3VzYWdlOiNkZWZpbmUgc2V0ZmlsZXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXNldCBmaWxlIGNvbnRleHRzIHVuZGVyIHBhdGhuYW1lIGFjY29yZGluZyB0byBzcGVjX2ZpbGVcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OKAorLy91c2FnZTogICAgICJcbgktYyBGSUxFCUNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29udGV4dHMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGJpbmFyeSBwb2xpY3kiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1kCVNob3cgd2hpY2ggc3BlY2lmaWNhdGlvbiBtYXRjaGVkIGVhY2ggZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTG9nIGNoYW5nZXMgaW4gZmlsZSBsYWJlbHMgdG8gc3lzbG9nIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBjaGFuZ2UgYW55IGZpbGUgbGFiZWxzIgorLy91c2FnZTogICAgICJcbgktcQlTdXBwcmVzcyB3YXJuaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgRElSCVVzZSBhbiBhbHRlcm5hdGUgcm9vdCBwYXRoIgorLy91c2FnZTogICAgICJcbgktZSBESVIJRXhjbHVkZSBESVIiCisvL3VzYWdlOiAgICAgIlxuCS1GCUZvcmNlIHJlc2V0IG9mIGNvbnRleHQgdG8gbWF0Y2ggZmlsZV9jb250ZXh0IGZvciBjdXN0b21pemFibGUgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS1vIEZJTEUJU2F2ZSBsaXN0IG9mIGZpbGVzIHdpdGggaW5jb3JyZWN0IGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS1zCVRha2UgYSBsaXN0IG9mIGZpbGVzIGZyb20gc3RkaW4gKGluc3RlYWQgb2YgY29tbWFuZCBsaW5lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJU2hvdyBjaGFuZ2VzIGluIGZpbGUgbGFiZWxzLCBpZiB0eXBlIG9yIHJvbGUgYXJlIGNoYW5naW5nIgorLy91c2FnZTogICAgICJcbgktdnYJU2hvdyBjaGFuZ2VzIGluIGZpbGUgbGFiZWxzLCBpZiB0eXBlLCByb2xlLCBvciB1c2VyIGFyZSBjaGFuZ2luZyIKKy8vdXNhZ2U6ICAgICAiXG4JLVcJRGlzcGxheSB3YXJuaW5ncyBhYm91dCBlbnRyaWVzIHRoYXQgaGFkIG5vIG1hdGNoaW5nIGZpbGVzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSByZXN0b3JlY29uX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWlGblJ2XSBbLWUgRVhDTFVERURJUl0uLi4gWy1vIEZJTEVdIFstZiBGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSByZXN0b3JlY29uX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVzZXQgc2VjdXJpdHkgY29udGV4dHMgb2YgZmlsZXMgaW4gcGF0aG5hbWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSWdub3JlIGZpbGVzIHRoYXQgZG9uJ3QgZXhpc3QiCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJRmlsZSB3aXRoIGxpc3Qgb2YgZmlsZXMgdG8gcHJvY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWUgRElSCURpcmVjdG9yeSB0byBleGNsdWRlIgorLy91c2FnZTogICAgICJcbgktUiwtcglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBjaGFuZ2UgYW55IGZpbGUgbGFiZWxzIgorLy91c2FnZTogICAgICJcbgktbyBGSUxFCVNhdmUgbGlzdCBvZiBmaWxlcyB3aXRoIGluY29ycmVjdCBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdnYJU2hvdyBjaGFuZ2VkIGxhYmVscyIKKy8vdXNhZ2U6ICAgICAiXG4JLUYJRm9yY2UgcmVzZXQgb2YgY29udGV4dCB0byBtYXRjaCBmaWxlX2NvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCQlmb3IgY3VzdG9taXphYmxlIGZpbGVzLCBvciB0aGUgdXNlciBzZWN0aW9uLCIKKy8vdXNhZ2U6ICAgICAiXG4JCWlmIGl0IGhhcyBjaGFuZ2VkIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04KKyNpbmNsdWRlIDxzZXBvbC9zZXBvbC5oPgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0VYQ0xVREVTIDUwCisKK3N0cnVjdCBlZGlyIHsKKwljaGFyICpkaXJlY3Rvcnk7CisJc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJRklMRSAqb3V0ZmlsZTsKKwljaGFyICpwb2xpY3lmaWxlOworCWNoYXIgKnJvb3RwYXRoOworCWludCByb290cGF0aGxlbjsKKwl1bnNpZ25lZCBjb3VudDsKKwlpbnQgZXhjbHVkZUN0cjsKKwlpbnQgZXJyb3JzOworCWludCB2ZXJib3NlOyAvKiBnZXRvcHQzMiB1c2VzIGl0LCBoYXMgdG8gYmUgaW50ICovCisJc21hbGxpbnQgcmVjdXJzZTsgLyogUmVjdXJzaXZlIGRlc2NlbnQgKi8KKwlzbWFsbGludCBmb2xsb3dfbW91bnRzOworCS8qIEJlaGF2aW9yIGZsYWdzIGRldGVybWluZWQgYmFzZWQgb24gc2V0ZmlsZXMgdnMuIHJlc3RvcmVjb24gKi8KKwlzbWFsbGludCBleHBhbmRfcmVhbHBhdGg7ICAvKiBFeHBhbmQgcGF0aHMgdmlhIHJlYWxwYXRoICovCisJc21hbGxpbnQgYWJvcnRfb25fZXJyb3I7IC8qIEFib3J0IHRoZSBmaWxlIHRyZWUgd2FsayB1cG9uIGFuIGVycm9yICovCisJaW50IGFkZF9hc3NvYzsgLyogVHJhY2sgaW5vZGUgYXNzb2NpYXRpb25zIGZvciBjb25mbGljdCBkZXRlY3Rpb24gKi8KKwlpbnQgbWF0Y2hwYXRoY29uX2ZsYWdzOyAvKiBGbGFncyB0byBtYXRjaHBhdGhjb24gKi8KKwlkZXZfdCBkZXZfaWQ7IC8qIERldmljZSBpZCB3aGVyZSB0YXJnZXQgZmlsZSBleGlzdHMgKi8KKwlpbnQgbmVycjsKKwlzdHJ1Y3QgZWRpciBleGNsdWRlQXJyYXlbTUFYX0VYQ0xVREVTXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCit2b2lkIEJVR19zZXRmaWxlc19nbG9iYWxzX3Rvb19iaWcodm9pZCk7CisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWlmIChzaXplb2YoRykgPiBDT01NT05fQlVGU0laRSkgXAorCQlCVUdfc2V0ZmlsZXNfZ2xvYmFsc190b29fYmlnKCk7IFwKKwkvKiBtZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7IC0gYWxyZWFkeSBpcyAqLyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBvdXRmaWxlICAgICAgICAgICAgKEcub3V0ZmlsZSAgICAgICAgICAgKQorI2RlZmluZSBwb2xpY3lmaWxlICAgICAgICAgKEcucG9saWN5ZmlsZSAgICAgICAgKQorI2RlZmluZSByb290cGF0aCAgICAgICAgICAgKEcucm9vdHBhdGggICAgICAgICAgKQorI2RlZmluZSByb290cGF0aGxlbiAgICAgICAgKEcucm9vdHBhdGhsZW4gICAgICAgKQorI2RlZmluZSBjb3VudCAgICAgICAgICAgICAgKEcuY291bnQgICAgICAgICAgICAgKQorI2RlZmluZSBleGNsdWRlQ3RyICAgICAgICAgKEcuZXhjbHVkZUN0ciAgICAgICAgKQorI2RlZmluZSBlcnJvcnMgICAgICAgICAgICAgKEcuZXJyb3JzICAgICAgICAgICAgKQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgICAgKEcudmVyYm9zZSAgICAgICAgICAgKQorI2RlZmluZSByZWN1cnNlICAgICAgICAgICAgKEcucmVjdXJzZSAgICAgICAgICAgKQorI2RlZmluZSBmb2xsb3dfbW91bnRzICAgICAgKEcuZm9sbG93X21vdW50cyAgICAgKQorI2RlZmluZSBleHBhbmRfcmVhbHBhdGggICAgKEcuZXhwYW5kX3JlYWxwYXRoICAgKQorI2RlZmluZSBhYm9ydF9vbl9lcnJvciAgICAgKEcuYWJvcnRfb25fZXJyb3IgICAgKQorI2RlZmluZSBhZGRfYXNzb2MgICAgICAgICAgKEcuYWRkX2Fzc29jICAgICAgICAgKQorI2RlZmluZSBtYXRjaHBhdGhjb25fZmxhZ3MgKEcubWF0Y2hwYXRoY29uX2ZsYWdzKQorI2RlZmluZSBkZXZfaWQgICAgICAgICAgICAgKEcuZGV2X2lkICAgICAgICAgICAgKQorI2RlZmluZSBuZXJyICAgICAgICAgICAgICAgKEcubmVyciAgICAgICAgICAgICAgKQorI2RlZmluZSBleGNsdWRlQXJyYXkgICAgICAgKEcuZXhjbHVkZUFycmF5ICAgICAgKQorCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIHN0cmluZyEgKi8KK2VudW0geworCU9QVF9kID0gKDEgPDwgMCksCisJT1BUX2UgPSAoMSA8PCAxKSwKKwlPUFRfZiA9ICgxIDw8IDIpLAorCU9QVF9pID0gKDEgPDwgMyksCisJT1BUX2wgPSAoMSA8PCA0KSwKKwlPUFRfbiA9ICgxIDw8IDUpLAorCU9QVF9wID0gKDEgPDwgNiksCisJT1BUX3EgPSAoMSA8PCA3KSwKKwlPUFRfciA9ICgxIDw8IDgpLAorCU9QVF9zID0gKDEgPDwgOSksCisJT1BUX3YgPSAoMSA8PCAxMCksCisJT1BUX28gPSAoMSA8PCAxMSksCisJT1BUX0YgPSAoMSA8PCAxMiksCisJT1BUX1cgPSAoMSA8PCAxMyksCisJT1BUX2MgPSAoMSA8PCAxNCksIC8qIGMgb25seSBmb3Igc2V0ZmlsZXMgKi8KKwlPUFRfUiA9ICgxIDw8IDE0KSwgLyogUiBvbmx5IGZvciByZXN0b3JlY29uICovCit9OworI2RlZmluZSBGTEFHX2RfZGVidWcgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9kKQorI2RlZmluZSBGTEFHX2UgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9lKQorI2RlZmluZSBGTEFHX2YgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9mKQorI2RlZmluZSBGTEFHX2lfaWdub3JlX2Vub2VudCAob3B0aW9uX21hc2szMiAmIE9QVF9pKQorI2RlZmluZSBGTEFHX2xfdGFrZV9sb2cgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9sKQorI2RlZmluZSBGTEFHX25fZHJ5X3J1biAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9uKQorI2RlZmluZSBGTEFHX3BfcHJvZ3Jlc3MgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9wKQorI2RlZmluZSBGTEFHX3FfcXVpZXQgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9xKQorI2RlZmluZSBGTEFHX3IgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9yKQorI2RlZmluZSBGTEFHX3MgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9zKQorI2RlZmluZSBGTEFHX3YgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF92KQorI2RlZmluZSBGTEFHX28gICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9vKQorI2RlZmluZSBGTEFHX0ZfZm9yY2UgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9GKQorI2RlZmluZSBGTEFHX1dfd2Fybl9ub19tYXRjaCAob3B0aW9uX21hc2szMiAmIE9QVF9XKQorI2RlZmluZSBGTEFHX2MgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9jKQorI2RlZmluZSBGTEFHX1IgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9SKQorCisKK3N0YXRpYyB2b2lkIHFwcmludGYoY29uc3QgY2hhciAqZm10IFVOVVNFRF9QQVJBTSwgLi4uKQoreworCS8qIHF1aWV0LCBkbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkIGluY19lcnIodm9pZCkKK3sKKwluZXJyKys7CisJaWYgKG5lcnIgPiA5ICYmICFGTEFHX2RfZGVidWcpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImV4aXRpbmcgYWZ0ZXIgMTAgZXJyb3JzIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfZXhjbHVkZShjb25zdCBjaGFyICpkaXJlY3RvcnkpCit7CisJc3RydWN0IHN0YXQgc2I7CisJc2l6ZV90IGxlbjsKKworCWlmIChkaXJlY3RvcnkgPT0gTlVMTCB8fCBkaXJlY3RvcnlbMF0gIT0gJy8nKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmdWxsIHBhdGggcmVxdWlyZWQgZm9yIGV4Y2x1ZGU6ICVzIiwgZGlyZWN0b3J5KTsKKwl9CisJaWYgKGxzdGF0KGRpcmVjdG9yeSwgJnNiKSkgeworCQliYl9lcnJvcl9tc2coImRpcmVjdG9yeSBcIiVzXCIgbm90IGZvdW5kLCBpZ25vcmluZyIsIGRpcmVjdG9yeSk7CisJCXJldHVybjsKKwl9CisJaWYgKChzYi5zdF9tb2RlICYgU19JRkRJUikgPT0gMCkgeworCQliYl9lcnJvcl9tc2coIlwiJXNcIiBpcyBub3QgYSBkaXJlY3Rvcnk6IG1vZGUgJW8sIGlnbm9yaW5nIiwKKwkJCWRpcmVjdG9yeSwgc2Iuc3RfbW9kZSk7CisJCXJldHVybjsKKwl9CisJaWYgKGV4Y2x1ZGVDdHIgPT0gTUFYX0VYQ0xVREVTKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtYXhpbXVtIGV4Y2x1ZGVzICVkIGV4Y2VlZGVkIiwgTUFYX0VYQ0xVREVTKTsKKwl9CisKKwlsZW4gPSBzdHJsZW4oZGlyZWN0b3J5KTsKKwl3aGlsZSAobGVuID4gMSAmJiBkaXJlY3RvcnlbbGVuIC0gMV0gPT0gJy8nKSB7CisJCWxlbi0tOworCX0KKwlleGNsdWRlQXJyYXlbZXhjbHVkZUN0cl0uZGlyZWN0b3J5ID0geHN0cm5kdXAoZGlyZWN0b3J5LCBsZW4pOworCWV4Y2x1ZGVBcnJheVtleGNsdWRlQ3RyKytdLnNpemUgPSBsZW47Cit9CisKK3N0YXRpYyBib29sIGV4Y2x1ZGUoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlpbnQgaSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGV4Y2x1ZGVDdHI7IGkrKykgeworCQlpZiAoc3RybmNtcChmaWxlLCBleGNsdWRlQXJyYXlbaV0uZGlyZWN0b3J5LAorCQkJCQlleGNsdWRlQXJyYXlbaV0uc2l6ZSkgPT0gMCkgeworCQkJaWYgKGZpbGVbZXhjbHVkZUFycmF5W2ldLnNpemVdID09ICdcMCcKKwkJCSB8fCBmaWxlW2V4Y2x1ZGVBcnJheVtpXS5zaXplXSA9PSAnLycpIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXRjaChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc2IsIGNoYXIgKipjb24pCit7CisJaW50IHJldDsKKwljaGFyIHBhdGhbUEFUSF9NQVggKyAxXTsKKwljaGFyICp0bXBfcGF0aCA9IHhzdHJkdXAobmFtZSk7CisKKwlpZiAoZXhjbHVkZUN0ciA+IDAgJiYgZXhjbHVkZShuYW1lKSkgeworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gbHN0YXQobmFtZSwgc2IpOworCWlmIChyZXQpIHsKKwkJaWYgKEZMQUdfaV9pZ25vcmVfZW5vZW50ICYmIGVycm5vID09IEVOT0VOVCkgeworCQkJZnJlZSh0bXBfcGF0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQliYl9lcnJvcl9tc2coInN0YXQoJXMpIiwgbmFtZSk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChleHBhbmRfcmVhbHBhdGgpIHsKKwkJaWYgKFNfSVNMTksoc2ItPnN0X21vZGUpKSB7CisJCQljaGFyICpwID0gTlVMTDsKKwkJCWNoYXIgKmZpbGVfc2VwOworCisJCQlzaXplX3QgbGVuID0gMDsKKworCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCWJiX2Vycm9yX21zZygid2FybmluZyEgJXMgcmVmZXJzIHRvIGEgc3ltYm9saWMgbGluaywgbm90IGZvbGxvd2luZyBsYXN0IGNvbXBvbmVudCIsIG5hbWUpOworCisJCQlmaWxlX3NlcCA9IHN0cnJjaHIodG1wX3BhdGgsICcvJyk7CisJCQlpZiAoZmlsZV9zZXAgPT0gdG1wX3BhdGgpIHsKKwkJCQlmaWxlX3NlcCsrOworCQkJCXBhdGhbMF0gPSAnXDAnOworCQkJCXAgPSBwYXRoOworCQkJfSBlbHNlIGlmIChmaWxlX3NlcCkgeworCQkJCSpmaWxlX3NlcCsrID0gJ1wwJzsKKwkJCQlwID0gcmVhbHBhdGgodG1wX3BhdGgsIHBhdGgpOworCQkJfSBlbHNlIHsKKwkJCQlmaWxlX3NlcCA9IHRtcF9wYXRoOworCQkJCXAgPSByZWFscGF0aCgiLi8iLCBwYXRoKTsKKwkJCX0KKwkJCWlmIChwKQorCQkJCWxlbiA9IHN0cmxlbihwKTsKKwkJCWlmICghcCB8fCBsZW4gKyBzdHJsZW4oZmlsZV9zZXApICsgMiA+IFBBVEhfTUFYKSB7CisJCQkJYmJfcGVycm9yX21zZygicmVhbHBhdGgoJXMpIGZhaWxlZCIsIG5hbWUpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJcCArPSBsZW47CisJCQkvKiBlbnN1cmUgdHJhaWxpbmcgc2xhc2ggb2YgZGlyZWN0b3J5IG5hbWUgKi8KKwkJCWlmIChsZW4gPT0gMCB8fCBwWy0xXSAhPSAnLycpIHsKKwkJCQkqcCsrID0gJy8nOworCQkJfQorCQkJc3RyY3B5KHAsIGZpbGVfc2VwKTsKKwkJCW5hbWUgPSBwYXRoOworCQkJaWYgKGV4Y2x1ZGVDdHIgPiAwICYmIGV4Y2x1ZGUobmFtZSkpCisJCQkJZ290byBlcnI7CisKKwkJfSBlbHNlIHsKKwkJCWNoYXIgKnA7CisJCQlwID0gcmVhbHBhdGgobmFtZSwgcGF0aCk7CisJCQlpZiAoIXApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJyZWFscGF0aCglcykiLCBuYW1lKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCW5hbWUgPSBwOworCQkJaWYgKGV4Y2x1ZGVDdHIgPiAwICYmIGV4Y2x1ZGUobmFtZSkpCisJCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwkvKiBuYW1lIHdpbGwgYmUgd2hhdCBpcyBtYXRjaGVkIGluIHRoZSBwb2xpY3kgKi8KKwlpZiAoTlVMTCAhPSByb290cGF0aCkgeworCQlpZiAoMCAhPSBzdHJuY21wKHJvb3RwYXRoLCBuYW1lLCByb290cGF0aGxlbikpIHsKKwkJCWJiX2Vycm9yX21zZygiJXMgaXMgbm90IGxvY2F0ZWQgaW4gJXMiLAorCQkJCW5hbWUsIHJvb3RwYXRoKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCW5hbWUgKz0gcm9vdHBhdGhsZW47CisJfQorCisJZnJlZSh0bXBfcGF0aCk7CisJaWYgKHJvb3RwYXRoICE9IE5VTEwgJiYgbmFtZVswXSA9PSAnXDAnKQorCQkvKiB0aGlzIGlzIGFjdHVhbGx5IHRoZSByb290IGRpciBvZiB0aGUgYWx0IHJvb3QgKi8KKwkJcmV0dXJuIG1hdGNocGF0aGNvbl9pbmRleCgiLyIsIHNiLT5zdF9tb2RlLCBjb24pOworCXJldHVybiBtYXRjaHBhdGhjb25faW5kZXgobmFtZSwgc2ItPnN0X21vZGUsIGNvbik7CisgZXJyOgorCWZyZWUodG1wX3BhdGgpOworCXJldHVybiAtMTsKK30KKworLyogQ29tcGFyZSB0d28gY29udGV4dHMgdG8gc2VlIGlmIHRoZWlyIGRpZmZlcmVuY2VzIGFyZSAic2lnbmlmaWNhbnQiLAorICogb3Igd2hldGhlciB0aGUgb25seSBkaWZmZXJlbmNlIGlzIGluIHRoZSB1c2VyLiAqLworc3RhdGljIGJvb2wgb25seV9jaGFuZ2VkX3VzZXIoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKwlpZiAoRkxBR19GX2ZvcmNlKQorCQlyZXR1cm4gMDsKKwlpZiAoIWEgfHwgIWIpCisJCXJldHVybiAwOworCWEgPSBzdHJjaHIoYSwgJzonKTsgLyogUmVzdCBvZiB0aGUgY29udGV4dCBhZnRlciB0aGUgdXNlciAqLworCWIgPSBzdHJjaHIoYiwgJzonKTsKKwlpZiAoIWEgfHwgIWIpCisJCXJldHVybiAwOworCXJldHVybiAoc3RyY21wKGEsIGIpID09IDApOworfQorCitzdGF0aWMgaW50IHJlc3RvcmUoY29uc3QgY2hhciAqZmlsZSkKK3sKKwljaGFyICpteV9maWxlOworCXN0cnVjdCBzdGF0IG15X3NiOworCWludCBpLCBqLCByZXQ7CisJY2hhciAqY29udGV4dCA9IE5VTEw7CisJY2hhciAqbmV3Y29uID0gTlVMTDsKKwlib29sIHVzZXJfb25seV9jaGFuZ2VkID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKworCW15X2ZpbGUgPSBiYl9zaW1wbGlmeV9wYXRoKGZpbGUpOworCisJaSA9IG1hdGNoKG15X2ZpbGUsICZteV9zYiwgJm5ld2Nvbik7CisKKwlpZiAoaSA8IDApIC8qIE5vIG1hdGNoaW5nIHNwZWNpZmljYXRpb24uICovCisJCWdvdG8gb3V0OworCisJaWYgKEZMQUdfcF9wcm9ncmVzcykgeworCQljb3VudCsrOworCQlpZiAoY291bnQgJSAweDQwMCA9PSAwKSB7IC8qIGV2ZXJ5IDEwMjQgdGltZXMgKi8KKwkJCWNvdW50ID0gKGNvdW50ICUgKDgwKjB4NDAwKSk7CisJCQlpZiAoY291bnQgPT0gMCkKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJYmJfcHV0Y2hhcignKicpOworCQkJZmZsdXNoX2FsbCgpOworCQl9CisJfQorCisJLyoKKwkgKiBUcnkgdG8gYWRkIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhpcyBpbm9kZSBhbmQKKwkgKiB0aGlzIHNwZWNpZmljYXRpb24uIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gYXNzb2NpYXRpb24KKwkgKiBmb3IgdGhpcyBpbm9kZSBhbmQgaXQgY29uZmxpY3RzIHdpdGggdGhpcyBzcGVjaWZpY2F0aW9uLAorCSAqIHRoZW4gdXNlIHRoZSBsYXN0IG1hdGNoaW5nIHNwZWNpZmljYXRpb24uCisJICovCisJaWYgKGFkZF9hc3NvYykgeworCQlqID0gbWF0Y2hwYXRoY29uX2ZpbGVzcGVjX2FkZChteV9zYi5zdF9pbm8sIGksIG15X2ZpbGUpOworCQlpZiAoaiA8IDApCisJCQlnb3RvIGVycjsKKworCQlpZiAoaiAhPSBpKSB7CisJCQkvKiBUaGVyZSB3YXMgYWxyZWFkeSBhbiBhc3NvY2lhdGlvbiBhbmQgaXQgdG9vayBwcmVjZWRlbmNlLiAqLworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoRkxBR19kX2RlYnVnKQorCQlwcmludGYoIiVzOiAlcyBtYXRjaGVkIGJ5ICVzXG4iLCBhcHBsZXRfbmFtZSwgbXlfZmlsZSwgbmV3Y29uKTsKKworCS8qIEdldCB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSBmaWxlLiAqLworCXJldCA9IGxnZXRmaWxlY29uX3JhdyhteV9maWxlLCAmY29udGV4dCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVOT0RBVEEpIHsKKwkJCWNvbnRleHQgPSBOVUxMOyAvKiBwYXJhbm9pYSAqLworCQl9IGVsc2UgeworCQkJYmJfcGVycm9yX21zZygibGdldGZpbGVjb25fcmF3IG9uICVzIiwgbXlfZmlsZSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQl1c2VyX29ubHlfY2hhbmdlZCA9IDA7CisJfSBlbHNlCisJCXVzZXJfb25seV9jaGFuZ2VkID0gb25seV9jaGFuZ2VkX3VzZXIoY29udGV4dCwgbmV3Y29uKTsKKworCS8qCisJICogRG8gbm90IHJlbGFiZWwgdGhlIGZpbGUgaWYgdGhlIG1hdGNoaW5nIHNwZWNpZmljYXRpb24gaXMKKwkgKiA8PG5vbmU+PiBvciB0aGUgZmlsZSBpcyBhbHJlYWR5IGxhYmVsZWQgYWNjb3JkaW5nIHRvIHRoZQorCSAqIHNwZWNpZmljYXRpb24uCisJICovCisJaWYgKChzdHJjbXAobmV3Y29uLCAiPDxub25lPj4iKSA9PSAwKQorCSB8fCAoY29udGV4dCAmJiAoc3RyY21wKGNvbnRleHQsIG5ld2NvbikgPT0gMCkgJiYgIUZMQUdfRl9mb3JjZSkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFGTEFHX0ZfZm9yY2UgJiYgY29udGV4dCAmJiAoaXNfY29udGV4dF9jdXN0b21pemFibGUoY29udGV4dCkgPiAwKSkgeworCQlpZiAodmVyYm9zZSA+IDEpIHsKKwkJCWJiX2Vycm9yX21zZygic2tpcHBpbmcgJXMuICVzIGlzIGN1c3RvbWl6YWJsZV90eXBlcyIsCisJCQkJbXlfZmlsZSwgY29udGV4dCk7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHZlcmJvc2UpIHsKKwkJLyogSWYgd2UncmUganVzdCBkb2luZyAiLXYiLCB0cmltIG91dCBhbnkgcmVsYWJlbHMgd2hlcmUKKwkJICogdGhlIHVzZXIgaGFzIGNoYW5nZWQgYnV0IHRoZSByb2xlIGFuZCB0eXBlIGFyZSB0aGUKKwkJICogc2FtZS4gIEZvciAiLXZ2IiwgZW1pdCBldmVyeXRoaW5nLiAqLworCQlpZiAodmVyYm9zZSA+IDEgfHwgIXVzZXJfb25seV9jaGFuZ2VkKSB7CisJCQliYl9pbmZvX21zZygiJXM6IHJlc2V0ICVzIGNvbnRleHQgJXMtPiVzIiwKKwkJCQlhcHBsZXRfbmFtZSwgbXlfZmlsZSwgY29udGV4dCA/IGNvbnRleHQgOiAiIiwgbmV3Y29uKTsKKwkJfQorCX0KKworCWlmIChGTEFHX2xfdGFrZV9sb2cgJiYgIXVzZXJfb25seV9jaGFuZ2VkKSB7CisJCWlmIChjb250ZXh0KQorCQkJYmJfaW5mb19tc2coInJlbGFiZWxpbmcgJXMgZnJvbSAlcyB0byAlcyIsIG15X2ZpbGUsIGNvbnRleHQsIG5ld2Nvbik7CisJCWVsc2UKKwkJCWJiX2luZm9fbXNnKCJsYWJlbGluZyAlcyB0byAlcyIsIG15X2ZpbGUsIG5ld2Nvbik7CisJfQorCisJaWYgKG91dGZpbGUgJiYgIXVzZXJfb25seV9jaGFuZ2VkKQorCQlmcHJpbnRmKG91dGZpbGUsICIlc1xuIiwgbXlfZmlsZSk7CisKKwkvKgorCSAqIERvIG5vdCByZWxhYmVsIHRoZSBmaWxlIGlmIC1uIHdhcyB1c2VkLgorCSAqLworCWlmIChGTEFHX25fZHJ5X3J1biB8fCB1c2VyX29ubHlfY2hhbmdlZCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFJlbGFiZWwgdGhlIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LgorCSAqLworCXJldCA9IGxzZXRmaWxlY29uKG15X2ZpbGUsIG5ld2Nvbik7CisJaWYgKHJldCkgeworCQliYl9wZXJyb3JfbXNnKCJsc2V0ZmlsZWNvbm9uKCVzLCVzKSIsIG15X2ZpbGUsIG5ld2Nvbik7CisJCWdvdG8gZXJyOworCX0KKworIG91dDoKKwlmcmVlY29uKGNvbnRleHQpOworCWZyZWVjb24obmV3Y29uKTsKKwlmcmVlKG15X2ZpbGUpOworCXJldHVybiByZXR2YWw7CisgZXJyOgorCXJldHZhbC0tOyAvKiAtMSAqLworCWdvdG8gb3V0OworfQorCisvKgorICogQXBwbHkgdGhlIGxhc3QgbWF0Y2hpbmcgc3BlY2lmaWNhdGlvbiB0byBhIGZpbGUuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSByZWN1cnNpdmVfYWN0aW9uIG9uIGVhY2ggZmlsZSBkdXJpbmcKKyAqIHRoZSBkaXJlY3RvcnkgdHJhdmVyc2FsLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBhcHBseV9zcGVjKAorCQljb25zdCBjaGFyICpmaWxlLAorCQlzdHJ1Y3Qgc3RhdCAqc2IsCisJCXZvaWQgKnVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAoIWZvbGxvd19tb3VudHMpIHsKKwkJLyogc2V0ZmlsZXMgZG9lcyBub3QgcHJvY2VzcyBhY3Jvc3MgZGlmZmVyZW50IG1vdW50IHBvaW50cyAqLworCQlpZiAoc2ItPnN0X2RldiAhPSBkZXZfaWQpIHsKKwkJCXJldHVybiBTS0lQOworCQl9CisJfQorCWVycm9ycyB8PSByZXN0b3JlKGZpbGUpOworCWlmIChhYm9ydF9vbl9lcnJvciAmJiBlcnJvcnMpCisJCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgaW50IGNhbm9uY29uKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGxpbmVubywgY2hhciAqKmNvbnRleHRwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGVycl9tc2dbXSBBTElHTjEgPSAiJXM6IGxpbmUgJXUgaGFzIGludmFsaWQgY29udGV4dCAlcyI7CisKKwljaGFyICp0bXBjb247CisJY2hhciAqY29udGV4dCA9ICpjb250ZXh0cDsKKwlpbnQgaW52YWxpZCA9IDA7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04KKwlpZiAocG9saWN5ZmlsZSkgeworCQlpZiAoc2Vwb2xfY2hlY2tfY29udGV4dChjb250ZXh0KSA+PSAwKQorCQkJcmV0dXJuIDA7CisJCS8qIEV4aXQgaW1tZWRpYXRlbHkgaWYgd2UncmUgaW4gY2hlY2tpbmcgbW9kZS4gKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoZXJyX21zZywgcGF0aCwgbGluZW5vLCBjb250ZXh0KTsKKwl9CisjZW5kaWYKKworCWlmIChzZWN1cml0eV9jYW5vbmljYWxpemVfY29udGV4dF9yYXcoY29udGV4dCwgJnRtcGNvbikgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWludmFsaWQgPSAxOworCQkJaW5jX2VycigpOworCQl9CisJfSBlbHNlIHsKKwkJZnJlZShjb250ZXh0KTsKKwkJKmNvbnRleHRwID0gdG1wY29uOworCX0KKworCWlmIChpbnZhbGlkKSB7CisJCWJiX2Vycm9yX21zZyhlcnJfbXNnLCBwYXRoLCBsaW5lbm8sIGNvbnRleHQpOworCX0KKworCXJldHVybiBpbnZhbGlkOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Nfb25lKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXQgc2I7CisJaW50IHJjOworCisJcmMgPSBsc3RhdChuYW1lLCAmc2IpOworCWlmIChyYyA8IDApIHsKKwkJaWYgKEZMQUdfaV9pZ25vcmVfZW5vZW50ICYmIGVycm5vID09IEVOT0VOVCkKKwkJCXJldHVybiAwOworCQliYl9wZXJyb3JfbXNnKCJzdGF0KCVzKSIsIG5hbWUpOworCQlnb3RvIGVycjsKKwl9CisJZGV2X2lkID0gc2Iuc3RfZGV2OworCisJaWYgKFNfSVNESVIoc2Iuc3RfbW9kZSkgJiYgcmVjdXJzZSkgeworCQlpZiAocmVjdXJzaXZlX2FjdGlvbihuYW1lLAorCQkJCSAgICAgQUNUSU9OX1JFQ1VSU0UsCisJCQkJICAgICBhcHBseV9zcGVjLAorCQkJCSAgICAgYXBwbHlfc3BlYywKKwkJCQkgICAgIE5VTEwsIDApICE9IFRSVUUpIHsKKwkJCWJiX2Vycm9yX21zZygiZXJyb3Igd2hpbGUgbGFiZWxpbmcgJXMiLCBuYW1lKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSByZXN0b3JlKG5hbWUpOworCQlpZiAocmMpCisJCQlnb3RvIGVycjsKKwl9CisKKyBvdXQ6CisJaWYgKGFkZF9hc3NvYykgeworCQlpZiAoRkxBR19xX3F1aWV0KQorCQkJc2V0X21hdGNocGF0aGNvbl9wcmludGYoJnFwcmludGYpOworCQltYXRjaHBhdGhjb25fZmlsZXNwZWNfZXZhbCgpOworCQlzZXRfbWF0Y2hwYXRoY29uX3ByaW50ZihOVUxMKTsKKwkJbWF0Y2hwYXRoY29uX2ZpbGVzcGVjX2Rlc3Ryb3koKTsKKwl9CisKKwlyZXR1cm4gcmM7CisKKyBlcnI6CisJcmMgPSAtMTsKKwlnb3RvIG91dDsKK30KKworaW50IHNldGZpbGVzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRmaWxlc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc2I7CisJaW50IHJjLCBpID0gMDsKKwljb25zdCBjaGFyICppbnB1dF9maWxlbmFtZSA9IE5VTEw7CisJY2hhciAqYnVmID0gTlVMTDsKKwlzaXplX3QgYnVmX2xlbjsKKwlpbnQgZmxhZ3M7CisJbGxpc3RfdCAqZXhjbHVkZV9kaXIgPSBOVUxMOworCWNoYXIgKm91dF9maWxlbmFtZSA9IE5VTEw7CisKKwlJTklUX0coKTsKKworCWlmIChhcHBsZXRfbmFtZVswXSA9PSAncycpIHsgLyogInNldGZpbGVzIiAqLworCQkvKgorCQkgKiBzZXRmaWxlczoKKwkJICogUmVjdXJzaXZlIGRlc2NlbnQsCisJCSAqIERvZXMgbm90IGV4cGFuZCBwYXRocyB2aWEgcmVhbHBhdGgsCisJCSAqIEFib3J0cyBvbiBlcnJvcnMgZHVyaW5nIHRoZSBmaWxlIHRyZWUgd2FsaywKKwkJICogVHJ5IHRvIHRyYWNrIGlub2RlIGFzc29jaWF0aW9ucyBmb3IgY29uZmxpY3QgZGV0ZWN0aW9uLAorCQkgKiBEb2VzIG5vdCBmb2xsb3cgbW91bnRzLAorCQkgKiBWYWxpZGF0ZXMgYWxsIGZpbGUgY29udGV4dHMgYXQgaW5pdCB0aW1lLgorCQkgKi8KKwkJcmVjdXJzZSA9IDE7CisJCWFib3J0X29uX2Vycm9yID0gMTsKKwkJYWRkX2Fzc29jID0gMTsKKwkJLyogZm9sbG93X21vdW50cyA9IDA7IC0gYWxyZWFkeSBpcyAqLworCQltYXRjaHBhdGhjb25fZmxhZ3MgPSBNQVRDSFBBVEhDT05fVkFMSURBVEUgfCBNQVRDSFBBVEhDT05fTk9UUkFOUzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiByZXN0b3JlY29uOgorCQkgKiBObyByZWN1cnNpdmUgZGVzY2VudCB1bmxlc3MgLXIvLVIsCisJCSAqIEV4cGFuZHMgcGF0aHMgdmlhIHJlYWxwYXRoLAorCQkgKiBEbyBub3QgYWJvcnQgb24gZXJyb3JzIGR1cmluZyB0aGUgZmlsZSB0cmVlIHdhbGssCisJCSAqIERvIG5vdCB0cnkgdG8gdHJhY2sgaW5vZGUgYXNzb2NpYXRpb25zIGZvciBjb25mbGljdCBkZXRlY3Rpb24sCisJCSAqIEZvbGxvd3MgbW91bnRzLAorCQkgKiBEb2VzIGxhenkgdmFsaWRhdGlvbiBvZiBjb250ZXh0cyB1cG9uIHVzZS4KKwkJICovCisJCWV4cGFuZF9yZWFscGF0aCA9IDE7CisJCWZvbGxvd19tb3VudHMgPSAxOworCQltYXRjaHBhdGhjb25fZmxhZ3MgPSBNQVRDSFBBVEhDT05fTk9UUkFOUzsKKwkJLyogcmVzdG9yZWNvbiBvbmx5ICovCisJCXNlbGludXhfb3JfZGllKCk7CisJfQorCisJc2V0X21hdGNocGF0aGNvbl9mbGFncyhtYXRjaHBhdGhjb25fZmxhZ3MpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZTo6dnY6di0tcDpwLS12OnYtLXE6cS0tdiI7CisJLyogT3B0aW9uIG9yZGVyIG11c3QgbWF0Y2ggT1BUX3ggZGVmaW5pdGlvbnMhICovCisJaWYgKGFwcGxldF9uYW1lWzBdID09ICdyJykgeyAvKiByZXN0b3JlY29uICovCisJCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImRlOmY6aWxucHFyc3ZvOkZXUiIsCisJCQkmZXhjbHVkZV9kaXIsICZpbnB1dF9maWxlbmFtZSwgJm91dF9maWxlbmFtZSwgJnZlcmJvc2UpOworCX0gZWxzZSB7IC8qIHNldGZpbGVzICovCisJCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImRlOmY6aWxucHFyOnN2bzpGVyIKKwkJCQlJRl9GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTigiYzoiKSwKKwkJCSZleGNsdWRlX2RpciwgJmlucHV0X2ZpbGVuYW1lLCAmcm9vdHBhdGgsICZvdXRfZmlsZW5hbWUsCisJCQkJIElGX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OKCZwb2xpY3lmaWxlLCkKKwkJCSZ2ZXJib3NlKTsKKwl9CisJYXJndiArPSBvcHRpbmQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04KKwlpZiAoKGFwcGxldF9uYW1lWzBdID09ICdzJykgJiYgKGZsYWdzICYgT1BUX2MpKSB7CisJCUZJTEUgKnBvbGljeXN0cmVhbTsKKworCQlwb2xpY3lzdHJlYW0gPSB4Zm9wZW5fZm9yX3JlYWQocG9saWN5ZmlsZSk7CisJCWlmIChzZXBvbF9zZXRfcG9saWN5ZGJfZnJvbV9maWxlKHBvbGljeXN0cmVhbSkgPCAwKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2Vwb2xfc2V0X3BvbGljeWRiX2Zyb21fZmlsZSBvbiAlcyIsIHBvbGljeWZpbGUpOworCQl9CisJCWZjbG9zZShwb2xpY3lzdHJlYW0pOworCisJCS8qIE9ubHkgcHJvY2VzcyB0aGUgc3BlY2lmaWVkIGZpbGVfY29udGV4dHMgZmlsZSwgbm90CisJCSAgIGFueSAuaG9tZWRpcnMgb3IgLmxvY2FsIGZpbGVzLCBhbmQgZG8gbm90IHBlcmZvcm0KKwkJICAgY29udGV4dCB0cmFuc2xhdGlvbnMuICovCisJCXNldF9tYXRjaHBhdGhjb25fZmxhZ3MoTUFUQ0hQQVRIQ09OX0JBU0VPTkxZIHwKKwkJCQkgICAgICAgTUFUQ0hQQVRIQ09OX05PVFJBTlMgfAorCQkJCSAgICAgICBNQVRDSFBBVEhDT05fVkFMSURBVEUpOworCX0KKyNlbmRpZgorCisJd2hpbGUgKGV4Y2x1ZGVfZGlyKQorCQlhZGRfZXhjbHVkZShsbGlzdF9wb3AoJmV4Y2x1ZGVfZGlyKSk7CisKKwlpZiAoZmxhZ3MgJiBPUFRfbykgeworCQlvdXRmaWxlID0gc3Rkb3V0OworCQlpZiAoTk9UX0xPTkVfQ0hBUihvdXRfZmlsZW5hbWUsICctJykpIHsKKwkJCW91dGZpbGUgPSB4Zm9wZW5fZm9yX3dyaXRlKG91dF9maWxlbmFtZSk7CisJCX0KKwl9CisJaWYgKGFwcGxldF9uYW1lWzBdID09ICdyJykgeyAvKiByZXN0b3JlY29uICovCisJCWlmIChmbGFncyAmIChPUFRfciB8IE9QVF9SKSkKKwkJCXJlY3Vyc2UgPSAxOworCX0gZWxzZSB7IC8qIHNldGZpbGVzICovCisJCWlmIChmbGFncyAmIE9QVF9yKQorCQkJcm9vdHBhdGhsZW4gPSBzdHJsZW4ocm9vdHBhdGgpOworCX0KKwlpZiAoZmxhZ3MgJiBPUFRfcykgeworCQlpbnB1dF9maWxlbmFtZSA9ICItIjsKKwkJYWRkX2Fzc29jID0gMDsKKwl9CisKKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ3MnKSB7IC8qIHNldGZpbGVzICovCisJCS8qIFVzZSBvdXIgb3duIGludmFsaWQgY29udGV4dCBjaGVja2luZyBmdW5jdGlvbiBzbyB0aGF0CisJCSAgIHdlIGNhbiBzdXBwb3J0IGVpdGhlciBjaGVja2luZyBhZ2FpbnN0IHRoZSBhY3RpdmUgcG9saWN5IG9yCisJCSAgIGNoZWNraW5nIGFnYWluc3QgYSBiaW5hcnkgcG9saWN5IGZpbGUuICovCisJCXNldF9tYXRjaHBhdGhjb25fY2Fub25jb24oJmNhbm9uY29uKTsKKwkJaWYgKCFhcmd2WzBdKQorCQkJYmJfc2hvd191c2FnZSgpOworCQl4c3RhdChhcmd2WzBdLCAmc2IpOworCQlpZiAoIVNfSVNSRUcoc2Iuc3RfbW9kZSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzcGVjIGZpbGUgJXMgaXMgbm90IGEgcmVndWxhciBmaWxlIiwgYXJndlswXSk7CisJCX0KKwkJLyogTG9hZCB0aGUgZmlsZSBjb250ZXh0cyBjb25maWd1cmF0aW9uIGFuZCBjaGVjayBpdC4gKi8KKwkJcmMgPSBtYXRjaHBhdGhjb25faW5pdChhcmd2WzBdKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJfQorCQlpZiAobmVycikKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJYXJndisrOworCX0KKworCWlmIChpbnB1dF9maWxlbmFtZSkgeworCQlzc2l6ZV90IGxlbjsKKwkJRklMRSAqZiA9IHN0ZGluOworCisJCWlmIChOT1RfTE9ORV9DSEFSKGlucHV0X2ZpbGVuYW1lLCAnLScpKQorCQkJZiA9IHhmb3Blbl9mb3JfcmVhZChpbnB1dF9maWxlbmFtZSk7CisJCXdoaWxlICgobGVuID0gZ2V0bGluZSgmYnVmLCAmYnVmX2xlbiwgZikpID4gMCkgeworCQkJYnVmW2xlbiAtIDFdID0gJ1wwJzsKKwkJCWVycm9ycyB8PSBwcm9jZXNzX29uZShidWYpOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZjbG9zZV9pZl9ub3Rfc3RkaW4oZik7CisJfSBlbHNlIHsKKwkJaWYgKCFhcmd2WzBdKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspIHsKKwkJCWVycm9ycyB8PSBwcm9jZXNzX29uZShhcmd2W2ldKTsKKwkJfQorCX0KKworCWlmIChGTEFHX1dfd2Fybl9ub19tYXRjaCkKKwkJbWF0Y2hwYXRoY29uX2NoZWNrbWF0Y2hlcyhhcmd2WzBdKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBvdXRmaWxlKQorCQlmY2xvc2Uob3V0ZmlsZSk7CisKKwlyZXR1cm4gZXJyb3JzOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2VsaW51eC9zZXRzZWJvb2wuYyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvc2V0c2Vib29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2ODJlNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NlbGludXgvc2V0c2Vib29sLmMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIHNldHNlYm9vbAorICogU2ltcGxlIHNldHNlYm9vbAorICogTk9URTogLVAgb3B0aW9uIHJlcXVpcmVzIGxpYnNlbWFuYWdlLCBzbyB0aGlzIGZlYXR1cmUgaXMKKyAqIG9taXR0ZWQgaW4gdGhpcyB2ZXJzaW9uCisgKiBZdWljaGkgTmFrYW11cmEgPHluYWthbUBoaXRhY2hpc29mdC5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRzZWJvb2xfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgImJvb2xlYW4gdmFsdWUiCisvL3VzYWdlOiNkZWZpbmUgc2V0c2Vib29sX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIGJvb2xlYW4gc2V0dGluZyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzZXRzZWJvb2xfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldHNlYm9vbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpwOworCWludCB2YWx1ZTsKKworCWlmIChhcmdjICE9IDMpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCXAgPSBhcmd2WzJdOworCisJaWYgKExPTkVfQ0hBUihwLCAnMScpIHx8IHN0cmNhc2VjbXAocCwgInRydWUiKSA9PSAwIHx8IHN0cmNhc2VjbXAocCwgIm9uIikgPT0gMCkgeworCQl2YWx1ZSA9IDE7CisJfSBlbHNlIGlmIChMT05FX0NIQVIocCwgJzAnKSB8fCBzdHJjYXNlY21wKHAsICJmYWxzZSIpID09IDAgfHwgc3RyY2FzZWNtcChwLCAib2ZmIikgPT0gMCkgeworCQl2YWx1ZSA9IDA7CisJfSBlbHNlIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmIChzZWN1cml0eV9zZXRfYm9vbGVhbihhcmd2WzFdLCB2YWx1ZSkgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IGJvb2xlYW4iKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvQ29uZmlnLnNyYyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxZTYyZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL0NvbmZpZy5zcmMKQEAgLTAsMCArMSwxNDkgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIlNoZWxscyIKKworSU5TRVJUCisKKworY2hvaWNlCisJcHJvbXB0ICJDaG9vc2Ugd2hpY2ggc2hlbGwgaXMgYWxpYXNlZCB0byAnc2gnIG5hbWUiCisJZGVmYXVsdCBGRUFUVVJFX1NIX0lTX0FTSAorCWhlbHAKKwkgIENob29zZSB3aGljaCBzaGVsbCB5b3Ugd2FudCB0byBiZSBleGVjdXRlZCBieSAnc2gnIGFsaWFzLgorCSAgVGhlIGFzaCBzaGVsbCBpcyB0aGUgbW9zdCBiYXNoIGNvbXBhdGlibGUgYW5kIGZ1bGwgZmVhdHVyZWQgb25lLgorCisjIG5vdGU6IGNhbm5vdCB1c2UgInNlbGVjdCBBU0giIGhlcmUsIGl0IGJyZWFrcyAibWFrZSBhbGxub2NvbmZpZyIKK2NvbmZpZyBGRUFUVVJFX1NIX0lTX0FTSAorCWRlcGVuZHMgb24gQVNICisJYm9vbCAiYXNoIgorCWRlcGVuZHMgb24gIU5PTU1VCisKK2NvbmZpZyBGRUFUVVJFX1NIX0lTX0hVU0gKKwlkZXBlbmRzIG9uIEhVU0gKKwlib29sICJodXNoIgorCitjb25maWcgRkVBVFVSRV9TSF9JU19OT05FCisJYm9vbCAibm9uZSIKKworZW5kY2hvaWNlCisKK2Nob2ljZQorCXByb21wdCAiQ2hvb3NlIHdoaWNoIHNoZWxsIGlzIGFsaWFzZWQgdG8gJ2Jhc2gnIG5hbWUiCisJZGVmYXVsdCBGRUFUVVJFX0JBU0hfSVNfTk9ORQorCWhlbHAKKwkgIENob29zZSB3aGljaCBzaGVsbCB5b3Ugd2FudCB0byBiZSBleGVjdXRlZCBieSAnYmFzaCcgYWxpYXMuCisJICBUaGUgYXNoIHNoZWxsIGlzIHRoZSBtb3N0IGJhc2ggY29tcGF0aWJsZSBhbmQgZnVsbCBmZWF0dXJlZCBvbmUuCisKKwkgIE5vdGUgdGhhdCBzZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3Qgc3dpdGNoIG9uIGFueSBiYXNoCisJICBjb21wYXRpYmlsaXR5IGNvZGUuIEl0IG1lcmVseSBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbnN0YWxsCisJICAvYmluL2Jhc2ggKHN5bSlsaW5rIGFuZCBydW4gc2NyaXB0cyB3aGljaCBzdGFydCB3aXRoCisJICAjIS9iaW4vYmFzaCBsaW5lLgorCisJICBNYW55IHN5c3RlbXMgdXNlIGl0IGluIHNjcmlwdHMgd2hpY2ggdXNlIGJhc2gtc3BlY2lmaWMgZmVhdHVyZXMsCisJICBldmVuIHNpbXBsZSBvbmVzIGxpa2UgJFJBTkRPTS4gV2l0aG91dCB0aGlzIG9wdGlvbiwgYnVzeWJveAorCSAgY2FuJ3QgYmUgdXNlZCBmb3IgcnVubmluZyB0aGVtIGJlY2F1c2UgaXQgd29uJ3QgcmVjb25nbml6ZQorCSAgImJhc2giIGFzIGEgc3VwcG9ydGVkIGFwcGxldCBuYW1lLgorCitjb25maWcgRkVBVFVSRV9CQVNIX0lTX0FTSAorCWRlcGVuZHMgb24gQVNICisJYm9vbCAiYXNoIgorCWRlcGVuZHMgb24gIU5PTU1VCisKK2NvbmZpZyBGRUFUVVJFX0JBU0hfSVNfSFVTSAorCWRlcGVuZHMgb24gSFVTSAorCWJvb2wgImh1c2giCisKK2NvbmZpZyBGRUFUVVJFX0JBU0hfSVNfTk9ORQorCWJvb2wgIm5vbmUiCisKK2VuZGNob2ljZQorCisKK2NvbmZpZyBTSF9NQVRIX1NVUFBPUlQKKwlib29sICJQT1NJWCBtYXRoIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBU0ggfHwgSFVTSAorCWhlbHAKKwkgIEVuYWJsZSBtYXRoIHN1cHBvcnQgaW4gdGhlIHNoZWxsIHZpYSAkKCguLi4pKSBzeW50YXguCisKK2NvbmZpZyBTSF9NQVRIX1NVUFBPUlRfNjQKKwlib29sICJFeHRlbmQgUE9TSVggbWF0aCBzdXBwb3J0IHRvIDY0IGJpdCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNIX01BVEhfU1VQUE9SVAorCWhlbHAKKwkgIEVuYWJsZSA2NC1iaXQgbWF0aCBzdXBwb3J0IGluIHRoZSBzaGVsbC4gVGhpcyB3aWxsIG1ha2UgdGhlIHNoZWxsCisJICBzbGlnaHRseSBsYXJnZXIsIGJ1dCB3aWxsIGFsbG93IGNvbXB1dGF0aW9uIHdpdGggdmVyeSBsYXJnZSBudW1iZXJzLgorCSAgVGhpcyBpcyBub3QgaW4gUE9TSVgsIHNvIGRvIG5vdCByZWx5IG9uIHRoaXMgaW4gcG9ydGFibGUgY29kZS4KKworY29uZmlnIEZFQVRVUkVfU0hfRVhUUkFfUVVJRVQKKwlib29sICJIaWRlIG1lc3NhZ2Ugb24gaW50ZXJhY3RpdmUgc2hlbGwgc3RhcnR1cCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhVU0ggfHwgQVNICisJaGVscAorCSAgUmVtb3ZlIHRoZSBidXN5Ym94IGludHJvZHVjdGlvbiB3aGVuIHN0YXJ0aW5nIGEgc2hlbGwuCisKK2NvbmZpZyBGRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwlib29sICJTdGFuZGFsb25lIHNoZWxsIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gKEhVU0ggfHwgQVNIKSAmJiBGRUFUVVJFX1BSRUZFUl9BUFBMRVRTCisJaGVscAorCSAgVGhpcyBvcHRpb24gY2F1c2VzIGJ1c3lib3ggc2hlbGxzIHRvIHVzZSBidXN5Ym94IGFwcGxldHMKKwkgIGluIHByZWZlcmVuY2UgdG8gZXhlY3V0YWJsZXMgaW4gdGhlIFBBVEggd2hlbmV2ZXIgcG9zc2libGUuIEZvcgorCSAgZXhhbXBsZSwgZW50ZXJpbmcgdGhlIGNvbW1hbmQgJ2lmY29uZmlnJyBpbnRvIHRoZSBzaGVsbCB3b3VsZCBjYXVzZQorCSAgYnVzeWJveCB0byB1c2UgdGhlIGlmY29uZmlnIGJ1c3lib3ggYXBwbGV0LiBTcGVjaWZ5aW5nIHRoZSBmdWxseQorCSAgcXVhbGlmaWVkIGV4ZWN1dGFibGUgbmFtZSwgc3VjaCBhcyAnL3NiaW4vaWZjb25maWcnIHdpbGwgc3RpbGwKKwkgIGV4ZWN1dGUgdGhlIC9zYmluL2lmY29uZmlnIGV4ZWN1dGFibGUgb24gdGhlIGZpbGVzeXN0ZW0uIFRoaXMgb3B0aW9uCisJICBpcyBnZW5lcmFsbHkgdXNlZCB3aGVuIGNyZWF0aW5nIGEgc3RhdGljYWxseSBsaW5rZWQgdmVyc2lvbiBvZiBidXN5Ym94CisJICBmb3IgdXNlIGFzIGEgcmVzY3VlIHNoZWxsLCBpbiB0aGUgZXZlbnQgdGhhdCB5b3Ugc2NyZXcgdXAgeW91ciBzeXN0ZW0uCisKKwkgIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgcmUtZXhlY2luZyAvcHJvYy9zZWxmL2V4ZSAodHlwaWNhbGx5KQorCSAgd2l0aCByaWdodCBwYXJhbWV0ZXJzLiBTb21lIHNlbGVjdGVkIGFwcGxldHMgKCJOT0ZPUksiIGFwcGxldHMpCisJICBjYW4gZXZlbiBiZSBleGVjdXRlZCB3aXRob3V0IGNyZWF0aW5nIG5ldyBwcm9jZXNzLgorCSAgSW5zdGVhZCwgYnVzeWJveCB3aWxsIGNhbGwgPGFwcGxldD5fbWFpbigpIGludGVybmFsbHkuCisKKwkgIEhvd2V2ZXIsIHRoaXMgY2F1c2VzIHByb2JsZW1zIGluIGNocm9vdCBqYWlscyB3aXRob3V0IG1vdW50ZWQgL3Byb2MKKwkgIGFuZCB3aXRoIHBzL3RvcCAoY29tbWFuZCBuYW1lIGNhbiBiZSBzaG93biBhcyAnZXhlJyBmb3IgYXBwbGV0cworCSAgc3RhcnRlZCB0aGlzIHdheSkuCisjIHVudHJ1ZT8KKyMJICBOb3RlIHRoYXQgdGhpcyB3aWxsICphbHNvKiBjYXVzZSBhcHBsZXRzIHRvIHRha2UgcHJlY2VkZW5jZQorIwkgIG92ZXIgc2hlbGwgYnVpbHRpbnMgb2YgdGhlIHNhbWUgbmFtZS4gU28gdHVybmluZyB0aGlzIG9uIHdpbGwKKyMJICBlbGltaW5hdGUgYW55IHBlcmZvcm1hbmNlIGdhaW5lZCBieSB0dXJuaW5nIG9uIHRoZSBidWlsdGluICJlY2hvIgorIwkgIGFuZCAidGVzdCIgY29tbWFuZHMgaW4gYXNoLgorIyB1bnRydWU/CisjCSAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgdGhpcyBvcHRpb24sIHRoZSBzaGVsbCB3aWxsIGF0dGVtcHQgdG8gZGlyZWN0bHkKKyMJICBydW4gJy9iaW4vYnVzeWJveCcuIElmIHlvdSBkbyBub3QgaGF2ZSB0aGUgYnVzeWJveCBiaW5hcnkgc2l0dGluZyBpbgorIwkgIHRoYXQgZXhhY3QgbG9jYXRpb24gd2l0aCB0aGF0IGV4YWN0IG5hbWUsIHRoaXMgb3B0aW9uIHdpbGwgbm90IHdvcmsgYXQKKyMJICBhbGwuCisKK2NvbmZpZyBGRUFUVVJFX1NIX05PRk9SSworCWJvb2wgIlJ1biAnbm9mb3JrJyBhcHBsZXRzIGRpcmVjdGx5IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gKEhVU0ggfHwgQVNIKSAmJiBGRUFUVVJFX1BSRUZFUl9BUFBMRVRTCisJaGVscAorCSAgVGhpcyBvcHRpb24gY2F1c2VzIGJ1c3lib3ggc2hlbGxzIHRvIG5vdCBleGVjdXRlIHR5cGljYWwKKwkgIGZvcmsvZXhlYy93YWl0IHNlcXVlbmNlLCBidXQgY2FsbCA8YXBwbGV0Pl9tYWluIGRpcmVjdGx5LAorCSAgaWYgcG9zc2libGUuIChTb21ldGltZXMgaXQgaXMgbm90IHBvc3NpYmxlOiBmb3IgZXhhbXBsZSwKKwkgIHRoaXMgaXMgbm90IHBvc3NpYmxlIGluIHBpcGVzKS4KKworCSAgVGhpcyB3aWxsIGJlIGRvbmUgb25seSBmb3Igc29tZSBhcHBsZXRzICh0aG9zZSB3aGljaCBhcmUgbWFya2VkCisJICBOT0ZPUksgaW4gaW5jbHVkZS9hcHBsZXRzLmgpLgorCisJICBUaGlzIG1heSBzaWduaWZpY2FudGx5IHNwZWVkIHVwIHNvbWUgc2hlbGwgc2NyaXB0cy4KKworCSAgVGhpcyBmZWF0dXJlIGlzIHJlbGF0aXZlbHkgbmV3LiBVc2Ugd2l0aCBjYXJlLiBSZXBvcnQgYnVncworCSAgdG8gcHJvamVjdCBtYWlsaW5nIGxpc3QuCisKK2NvbmZpZyBGRUFUVVJFX1NIX0hJU1RGSUxFU0laRQorCWJvb2wgIlVzZSAkSElTVEZJTEVTSVpFIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSCB8fCBBU0gKKwloZWxwCisJICBUaGlzIG9wdGlvbiBtYWtlcyBidXN5Ym94IHNoZWxscyB0byB1c2UgJEhJU1RGSUxFU0laRSB2YXJpYWJsZQorCSAgdG8gc2V0IHNoZWxsIGhpc3Rvcnkgc2l6ZS4gTm90ZSB0aGF0IGl0cyBtYXggdmFsdWUgaXMgY2FwcGVkCisJICBieSAiSGlzdG9yeSBzaXplIiBzZXR0aW5nIGluIGxpYnJhcnkgdHVuaW5nIHNlY3Rpb24uCisKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwYWVjOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxMSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19TSF9NQVRIX1NVUFBPUlQpICs9IG1hdGgubwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvUkVBRE1FIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOWY1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9SRUFETUUKQEAgLTAsMCArMSw4MiBAQAoraHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS8KK09wZW4gR3JvdXAgQmFzZSBTcGVjaWZpY2F0aW9ucyBJc3N1ZSA3CisKKworaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAxLmh0bWwKK1NoZWxsICYgVXRpbGl0aWVzCisKK0l0IHNheXMgdGhhdCBhbnkgb2YgdGhlIHN0YW5kYXJkIHV0aWxpdGllcyBtYXkgYmUgaW1wbGVtZW50ZWQKK2FzIGEgcmVndWxhciBzaGVsbCBidWlsdC1pbi4gSXQgZ2l2ZXMgYSBsaXN0IG9mIHV0aWxpdGllcyB3aGljaAorYXJlIHVzdWFsbHkgaW1wbGVtZW50ZWQgdGhhdCB3YXkgKGFuZCBzb21lIG9mIHRoZW0gY2FuIG9ubHkKK2JlIGltcGxlbWVudGVkIGFzIGJ1aWx0LWlucywgbGlrZSAiYWxpYXMiKToKKworYWxpYXMKK2JnCitjZAorY29tbWFuZAorZmFsc2UKK2ZjCitmZworZ2V0b3B0cworam9icwora2lsbAorbmV3Z3JwCitwd2QKK3JlYWQKK3RydWUKK3VtYXNrCit1bmFsaWFzCit3YWl0CisKKworaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwKK1NoZWxsIENvbW1hbmQgTGFuZ3VhZ2UKKworSXQgc2F5cyB0aGF0IHNoZWxsIG11c3QgaW1wbGVtZW50IHNwZWNpYWwgYnVpbHQtaW5zLiBTcGVjaWFsIGJ1aWx0LWlucworZGlmZmVyIGZyb20gcmVndWxhciBvbmVzIGJ5IHRoZSBmYWN0IHRoYXQgdmFyaWFibGUgYXNzaWdubWVudHMKK2RvbmUgb24gc3BlY2lhbCBidWlsdGluIGFyZSAqUFJFU0VSVkVEKi4gVGhhdCBpcywKKworVkFSPVZBTCBzcGVjaWFsX2J1aWx0aW47IGVjaG8gJFZBUgorCitzaG91bGQgcHJpbnQgVkFMLgorCisoQW5vdGhlciBkaXN0aW5jdGlvbiBpcyB0aGF0IGFuIGVycm9yIGluIHNwZWNpYWwgYnVpbHQtaW4gc2hvdWxkCithYm9ydCB0aGUgc2hlbGwsIGJ1dCB0aGlzIGlzIG5vdCBzdWNoIGEgY3JpdGljYWwgZGlmZmVyZW5jZSwKK2FuZCBtb3Jlb3ZlciwgYXQgbGVhc3QgYmFzaCdzICJzZXQiIGRvZXMgbm90IGZvbGxvdyB0aGlzIHJ1bGUsCit3aGljaCBpcyBldmVuIGNvZGlmaWVkIGluIGF1dG9jb25mIGNvbmZpZ3VyZSBsb2dpYyBub3cuLi4pCisKK0xpc3Qgb2Ygc3BlY2lhbCBidWlsdGluczoKKworLiBmaWxlCis6IFthcmd1bWVudC4uLl0KK2JyZWFrIFtuXQorY29udGludWUgW25dCitldmFsIFthcmd1bWVudC4uLl0KK2V4ZWMgW2NvbW1hbmQgW2FyZ3VtZW50Li4uXV0KK2V4aXQgW25dCitleHBvcnQgbmFtZVs9d29yZF0uLi4KK2V4cG9ydCAtcAorcmVhZG9ubHkgbmFtZVs9d29yZF0uLi4KK3JlYWRvbmx5IC1wCityZXR1cm4gW25dCitzZXQgWy1hYkNlZmhtbnV2eF0gWy1vIG9wdGlvbl0gW2FyZ3VtZW50Li4uXQorc2V0IFsrYWJDZWZobW51dnhdIFsrbyBvcHRpb25dIFthcmd1bWVudC4uLl0KK3NldCAtLSBbYXJndW1lbnQuLi5dCitzZXQgLW8KK3NldCArbworc2hpZnQgW25dCit0aW1lcwordHJhcCBuIFtjb25kaXRpb24uLi5dCit0cmFwIFthY3Rpb24gY29uZGl0aW9uLi4uXQordW5zZXQgWy1mdl0gbmFtZS4uLgorCitJbiBwcmFjdGljZSwgbm8gb25lIHVzZXMgdGhpcyBvYnNjdXJlIGZlYXR1cmUgLSBub25lIG9mIHRoZXNlIGJ1aWx0aW5zCitnaXZlcyBhbnkgc3BlY2lhbCByZWFzb25zIHRvIHBsYXkgc3VjaCBkaXJ0eSB0cmlja3MuCisKK0hvd2V2ZXIuIFRoaXMgc2VjdGlvbiBhbHNvIHNheXMgdGhhdCAqZnVuY3Rpb24gaW52b2NhdGlvbiogc2hvdWxkIGFjdAorc2ltaWxhciB0byBzcGVjaWFsIGJ1aWx0LWluLiBUaGF0IGlzLCB2YXJpYWJsZSBhc3NpZ25tZW50cworZG9uZSBvbiBmdW5jdGlvbiBpbnZvY2F0aW9uIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYWZ0ZXIgZnVuY3Rpb24gaW52b2NhdGlvbi4KKworVGhpcyBpcyBzaWduaWZpY2FudDogaXQgaXMgbm90IHVudGhpbmthYmxlIHRvIHdhbnQgdG8gcnVuIGEgZnVuY3Rpb24KK3dpdGggc29tZSB2YXJpYWJsZXMgc2V0IHRvIHNwZWNpYWwgdmFsdWVzLiBCdXQgYmVjYXVzZSBvZiB0aGUgYWJvdmUsCitpdCBkb2VzIG5vdCB3b3JrOiB2YXJpYWJsZSB3aWxsICJsZWFrIiBvdXQgb2YgdGhlIGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvUkVBRE1FLmpvYiBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL1JFQURNRS5qb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViYTk2NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL1JFQURNRS5qb2IKQEAgLTAsMCArMSwzMDQgQEAKK3N0cmFjZSBvZiAic2xlZXAgMSB8IHNsZWVwIDIiIGJlaW5nIHJ1biBmcm9tIGludGVyYWN0aXZlIGJhc2ggMy4wCisKKworU3lub3BzaXM6CitvcGVuIC9kZXYvdHR5IFssIGlmIGZhaWxzLCBvcGVuIHR0eW5hbWUoMCldOyBjbG9zZSAvKiBoZWxwcyByZS1lc3RhYmxpc2ggY3R0eSAqLworZ2V0IGN1cnJlbnQgc2lnbmFsIG1hc2sKK1RDR0VUUyBvbiBmZCMgMAorVENHRVRTIG9uIGZkIyAyIC8qIE5COiBpZiByZXR1cm5zIEVOT1RUWSAoMj4vZGV2L251bGwpLCBzaCBzZWVtcyB0byBkaXNhYmxlIGpvYiBjb250cm9sLAorICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHNob3cgcHJvbXB0LCBidXQgc3RpbGwgZXhlY3V0ZXMgY21kcyBmcm9tIGZkIyAwICovCitpbnN0YWxsIGRlZmF1bHQgaGFuZGxlcnMgZm9yIENITEQgUVVJVCBURVJNCitpbnN0YWxsIGNvbW1vbiBoYW5kbGVyIGZvciBIVVAgSU5UIElMTCBUUkFQIEFCUlQgRlBFIEJVUyBTRUdWIFNZUyBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFVTUjEgVVNSMgoraWdub3JlIFFVSVQKK2luc3RhbGwgaGFuZGxlciBmb3IgSU5UCitpZ25vcmUgVEVSTQoraW5zdGFsbCBoYW5kbGVyIGZvciBJTlQKK2lnbm9yZSBUU1RQIFRUT1UgVFRJTgoraW5zdGFsbCBoYW5kbGVyIGZvciBXSU5DSAorZ2V0IHBpZCwgcHBpZAorYmxvY2sgYWxsIHNpZ25hbHMKK3VuYmxvY2sgYWxsIHNpZ25hbHMKK2dldCBvdXIgcHByb2Nlc3MgZ3JvdXAKKyAgICBtaW5pZG9jOgorICAgIEVhY2ggcHJvY2VzcyBncm91cCBpcyBhIG1lbWJlciBvZiBhIHNlc3Npb24gYW5kIGVhY2ggcHJvY2VzcyBpcyBhIG1lbWJlcgorICAgIG9mIHRoZSBzZXNzaW9uIG9mIHdoaWNoIGl0cyBwcm9jZXNzIGdyb3VwIGlzIGEgbWVtYmVyLgorICAgIFByb2Nlc3MgZ3JvdXBzIGFyZSB1c2VkIGZvciBkaXN0cmlidXRpb24gb2Ygc2lnbmFscywgYW5kIGJ5IHRlcm1pbmFscworICAgIHRvIGFyYml0cmF0ZSByZXF1ZXN0cyBmb3IgdGhlaXIgaW5wdXQ6IHByb2Nlc3NlcyB0aGF0IGhhdmUgdGhlIHNhbWUKKyAgICBwcm9jZXNzIGdyb3VwIGFzIHRoZSB0ZXJtaW5hbCBhcmUgZm9yZWdyb3VuZCBhbmQgbWF5IHJlYWQsIHdoaWxlIG90aGVycworICAgIHdpbGwgYmxvY2sgd2l0aCBhIHNpZ25hbCBpZiB0aGV5IGF0dGVtcHQgdG8gcmVhZC4gIFRoZXNlIGNhbGxzIGFyZSB0aHVzIHVzZWQKKyAgICBieSBwcm9ncmFtcyAoc2hlbGxzKSB0byBjcmVhdGUgcHJvY2VzcyBncm91cHMgaW4gaW1wbGVtZW50aW5nIGpvYiBjb250cm9sLgorICAgIFRoZSBUSU9DR1BHUlAgYW5kIFRJT0NTUEdSUCBjYWxscyBkZXNjcmliZWQgaW4gdGVybWlvcygzKSBhcmUgdXNlZCB0byBnZXQvc2V0CisgICAgdGhlIHByb2Nlc3MgZ3JvdXAgb2YgdGhlIGNvbnRyb2wgdGVybWluYWwuCisgICAgSWYgYSBzZXNzaW9uIGhhcyBhIGNvbnRyb2xsaW5nIHRlcm1pbmFsLCBDTE9DQUwgaXMgbm90IHNldCBhbmQgYSBoYW5ndXAgb2NjdXJzLAorICAgIHRoZW4gdGhlIHNlc3Npb24gbGVhZGVyIGlzIHNlbnQgYSBTSUdIVVAuICBJZiB0aGUgc2Vzc2lvbiBsZWFkZXIgZXhpdHMsCisgICAgdGhlIFNJR0hVUCBzaWduYWwgd2lsbCBiZSBzZW50IHRvIGVhY2ggcHJvY2VzcyBpbiB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzCisgICAgZ3JvdXAgb2YgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgorICAgIElmIHRoZSBleGl0IG9mIHRoZSBwcm9jZXNzIGNhdXNlcyBhIHByb2Nlc3MgZ3JvdXAgdG8gYmVjb21lIG9ycGhhbmVkLAorICAgIGFuZCBpZiBhbnkgbWVtYmVyIG9mIHRoZSBuZXdseS1vcnBoYW5lZCBwcm9jZXNzIGdyb3VwIGlzIHN0b3BwZWQsIHRoZW4gYSBTSUdIVVAKKyAgICBzaWduYWwgZm9sbG93ZWQgYnkgYSBTSUdDT05UIHNpZ25hbCB3aWxsIGJlIHNlbnQgdG8gZWFjaCBwcm9jZXNzCisgICAgaW4gdGhlIG5ld2x5LW9ycGhhbmVkIHByb2Nlc3MgZ3JvdXAuCisuLi4KK2R1cCBzdGRlcnIgdG8gZmQjIDI1NQorbW92ZSBvdXJzZWxmIHRvIG91ciBvd24gcHJvY2VzcyBncm91cAorYmxvY2sgQ0hMRCBUU1RQIFRUSU4gVFRPVQorc2V0IHR0eSdzICgyNTUsIHN0ZGVycidzKSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgdG8gb3VyIGdyb3VwCithbGxvdyBhbGwgc2lnbmFscworbWFyayAyNTUgQ0xPRVhFQworc2V0IENITEQgaGFuZGxlcgorZ2V0IHNpZ25hbCBtYXNrCitnZXQgZmQjMCBmbGFncworZ2V0IHNpZ25hbCBtYXNrCitzZXQgSU5UIGhhbmRsZXIKK2Jsb2NrIENITEQgVFNUUCBUVElOIFRUT1UKK3NldCBmZCAjMjU1IGZvcmVncm91bmQgcHJvY2VzcyBncm91cCB0byBvdXIgZ3JvdXAKK2FsbG93IGFsbCBzaWduYWxzCitzZXQgSU5UIGhhbmRsZXIKK2Jsb2NrIGFsbCBzaWduYWxzCithbGxvdyBhbGwgc2lnbmFscworYmxvY2sgSU5UCithbGxvdyBhbGwgc2lnbmFscworbG90c2Egc2lnYWN0aW9uczogc2V0IElOVCxBTFJNLFdJTkNIIGhhbmRsZXJzLCBpZ25vcmUgVEVSTSxRVUlULFRTVFAsVFRPVSxUVElOCitibG9jayBhbGwgc2lnbmFscworYWxsb3cgYWxsIHNpZ25hbHMKK2Jsb2NrIGFsbCBzaWduYWxzCithbGxvdyBhbGwgc2lnbmFscworYmxvY2sgYWxsIHNpZ25hbHMKK2FsbG93IGFsbCBzaWduYWxzCityZWFkICJzbGVlcCAxIHwgc2xlZXAgMlxuIgorYmxvY2sgSU5UCitUQ1NFVFNXIG9uIGZkIyAwCithbGxvdyBhbGwgc2lnbmFscworbG90c2Egc2lnYWN0aW9uczogc2V0IElOVCxBTFJNLFdJTkNIIGhhbmRsZXJzLCBpZ25vcmUgVEVSTSxRVUlULFRTVFAsVFRPVSxUVElOCitibG9jayBDSExECitwaXBlKFs0LCA1XSkgIC8qIG9vcHMgc2VlbXMgSSBsb3N0IGFub3RoZXIgcGlwZSgpIGluIGVkaXRpbmcuLi4gKi8KK2ZvcmsgY2hpbGQgIzEKK3B1dCBjaGlsZCBpbiBpdCdzIG93biBwcm9jZXNzIGdyb3VwCitibG9jayBvbmx5IENITEQKK2Nsb3NlKDUpCitibG9jayBvbmx5IElOVCBDSExECitmb3JrIGNoaWxkICMyCitwdXQgY2hpbGQgaW4gdGhlIHNhbWUgcHJvY2VzcyBncm91cCBhcyBmaXJzdCBvbmUKK2Jsb2NrIG9ubHkgQ0hMRAorY2xvc2UoNCkKK2Jsb2NrIG9ubHkgQ0hMRAorYmxvY2sgb25seSBDSExEIFRTVFAgVFRJTiBUVE9VCitzZXQgZmQjIDI1NSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgdG8gZmlyc3QgY2hpbGQncyBvbmUKK2Jsb2NrIG9ubHkgQ0hMRAorYmxvY2sgb25seSBDSExECitibG9jayBvbmx5IENITEQKKy8qIG5vdGU6IGJlY2F1c2Ugc2hlbGwgaXMgbm90IGluIGZvcmVncm91bmQgbm93LCBlLmcuIEN0cmwtQyB3aWxsIHNlbmQgSU5UIHRvIGNoaWxkcmVuIG9ubHkhICovCit3YWl0NCBmb3IgY2hpbGRyZW4gdG8gZGllIG9yIHN0b3AgLSBmaXJzdCBjaGlsZCBleGl0cword2FpdDQgZm9yIGNoaWxkcmVuIHRvIGRpZSBvciBzdG9wIC0gc2Vjb25kIGNoaWxkIGV4aXRzCitibG9jayBDSExEIFRTVFAgVFRJTiBUVE9VCitzZXQgZmQjIDI1NSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgdG8gb3VyIG93biBvbmUKK2Jsb2NrIG9ubHkgQ0hMRAorYmxvY2sgb25seSBDSExECitibG9jayBub3RoaW5nCistLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQorICAgIHdhaXQgZm9yIGl0IC0gbm8gY2hpbGQgKGFscmVhZHkgd2FpdGVkIGZvcikKKyAgICBzaWdyZXR1cm4oKQorcmVhZCBzaWduYWwgbWFzaworbG90c2Egc2lnYWN0aW9ucy4uLgorcmVhZCBuZXh0IGNvbW1hbmQKKworCitleGVjdmUoIi9iaW4vc2giLCBbInNoIl0sIFsvKiAzNCB2YXJzICovXSkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKK2lvY3RsKDAsIFNORENUTF9UTVJfVElNRUJBU0Ugb3IgVENHRVRTLCB7QjM4NDAwIG9wb3N0IGlzaWcgaWNhbm9uIGVjaG8gLi4ufSkgPSAwCitpb2N0bCgyLCBTTkRDVExfVE1SX1RJTUVCQVNFIG9yIFRDR0VUUywge0IzODQwMCBvcG9zdCBpc2lnIGljYW5vbiBlY2hvIC4uLn0pID0gMAorcnRfc2lnYWN0aW9uKFNJR0NITEQsIHtTSUdfREZMfSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdRVUlULCB7U0lHX0RGTH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVEVSTSwge1NJR19ERkx9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0hVUCwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lMTCwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RSQVAsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdBQlJULCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHRlBFLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHQlVTLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHU0VHViwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1NZUywgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1BJUEUsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdBTFJNLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVEVSTSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1hDUFUsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdYRlNaLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVlRBTFJNLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVVNSMSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1VTUjIsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHtTSUdfSUdOfSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVEVSTSwge1NJR19JR059LCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwge1NJR19JR059LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUT1UsIHtTSUdfSUdOfSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7U0lHX0lHTn0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHV0lOQ0gsIHsweDgwN2RjMzMsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitnZXRwaWQoKSAgICAgICAgICAgICAgICA9IDE5NDczCitnZXRwcGlkKCkgICAgICAgICAgICAgICA9IDE5NDcyCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIH5bXSwgW10sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK2dldHBncnAoKSAgICAgICAgICAgICAgID0gMTg2NQorZHVwKDIpICAgICAgICAgICAgICAgICAgPSA0CitmY250bDY0KDI1NSwgRl9HRVRGRCkgICA9IC0xIEVCQURGIChCYWQgZmlsZSBkZXNjcmlwdG9yKQorZHVwMig0LCAyNTUpICAgICAgICAgICAgPSAyNTUKK2Nsb3NlKDQpICAgICAgICAgICAgICAgID0gMAoraW9jdGwoMjU1LCBUSU9DR1BHUlAsIFsxODY1XSkgPSAwCitnZXRwaWQoKSAgICAgICAgICAgICAgICA9IDE5NDczCitzZXRwZ2lkKDAsIDE5NDczKSAgICAgICA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITEQgVFNUUCBUVElOIFRUT1VdLCBbXSwgOCkgPSAwCitpb2N0bCgyNTUsIFRJT0NTUEdSUCwgWzE5NDczXSkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorZmNudGw2NCgyNTUsIEZfU0VURkQsIEZEX0NMT0VYRUMpID0gMAorcnRfc2lnYWN0aW9uKFNJR0NITEQsIHsweDgwN2M5MjIsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKK2ZjbnRsNjQoMCwgRl9HRVRGTCkgICAgID0gMHgyIChmbGFncyBPX1JEV1IpCisuLi4KK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEIFRTVFAgVFRJTiBUVE9VXSwgW10sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTQ3M10pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCB+W10sIFtdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtJTlRdLCBbXSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVEVSTSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdBTFJNLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RTVFAsIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVE9VLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUT1UsIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRJTiwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1dJTkNILCB7MHg4MGNhNWNkLCBbXSwgU0FfUkVTVE9SRVJ8U0FfUkVTVEFSVCwgMHg2ZmY3YTRmOH0sIHsweDgwN2RjMzMsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCB+W10sIFtdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIH5bXSwgW10sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgfltdLCBbXSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAord3JpdGUoMiwgInNoLTMuMDAjICIsIDkpID0gOQorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCityZWFkKDAsICJzIiwgMSkgICAgICAgICA9IDEKK3dyaXRlKDIsICJzIiwgMSkgICAgICAgID0gMQorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCityZWFkKDAsICJsIiwgMSkgICAgICAgICA9IDEKK3dyaXRlKDIsICJsIiwgMSkgICAgICAgID0gMQorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCisuLi4gcmVzdCBvZiAic2xlZXAgMSB8IHNsZWVwIDIiIGVudGVyZWQuLi4KK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAorcmVhZCgwLCAiMiIsIDEpICAgICAgICAgPSAxCit3cml0ZSgyLCAiMiIsIDEpICAgICAgICA9IDEKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAorcmVhZCgwLCAiXHIiLCAxKSAgICAgICAgPSAxCit3cml0ZSgyLCAiXG4iLCAxKSAgICAgICA9IDEKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0lOVF0sIFtdLCA4KSA9IDAKK2lvY3RsKDAsIFNORENUTF9UTVJfU1RPUCBvciBUQ1NFVFNXLCB7QjM4NDAwIG9wb3N0IGlzaWcgaWNhbm9uIGVjaG8gLi4ufSkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVEVSTSwge1NJR19JR059LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHtTSUdfSUdOfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdBTFJNLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RTVFAsIHtTSUdfSUdOfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVE9VLCB7U0lHX0lHTn0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRJTiwge1NJR19JR059LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1dJTkNILCB7MHg4MDdkYzMzLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MGNhNWNkLCBbXSwgU0FfUkVTVE9SRVJ8U0FfUkVTVEFSVCwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEXSwgW10sIDgpID0gMAorcGlwZShbNCwgNV0pICAgICAgICAgICAgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtJTlQgQ0hMRF0sIFtDSExEXSwgOCkgPSAwCitmb3JrKCkgICAgICAgICAgICAgICAgICA9IDE5NzU1CitzZXRwZ2lkKDE5NzU1LCAxOTc1NSkgICAgICAgICAgICAgICAgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW0NITERdLCBOVUxMLCA4KSA9IDAKK2Nsb3NlKDUpICAgICAgICAgICAgICAgID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbSU5UIENITERdLCBbQ0hMRF0sIDgpID0gMAorZm9yaygpICAgICAgICAgICAgICAgICAgPSAxOTc1Ngorc2V0cGdpZCgxOTc1NiwgMTk3NTUpICAgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW0NITERdLCBOVUxMLCA4KSA9IDAKK2Nsb3NlKDQpICAgICAgICAgICAgICAgID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbQ0hMRF0sIFtDSExEXSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEIFRTVFAgVFRJTiBUVE9VXSwgW0NITERdLCA4KSA9IDAKK2lvY3RsKDI1NSwgVElPQ1NQR1JQLCBbMTk3NTVdKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbQ0hMRF0sIE5VTEwsIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtDSExEXSwgTlVMTCwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEXSwgW0NITERdLCA4KSA9IDAKK3dhaXQ0KC0xLCBbe1dJRkVYSVRFRChzKSAmJiBXRVhJVFNUQVRVUyhzKSA9PSAwfV0sIFdVTlRSQUNFRCwgTlVMTCkgPSAxOTc1NQord2FpdDQoLTEsIFt7V0lGRVhJVEVEKHMpICYmIFdFWElUU1RBVFVTKHMpID09IDB9XSwgV1VOVFJBQ0VELCBOVUxMKSA9IDE5NzU2CitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEIFRTVFAgVFRJTiBUVE9VXSwgW0NITERdLCA4KSA9IDAKK2lvY3RsKDI1NSwgVElPQ1NQR1JQLCBbMTk0NzNdKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbQ0hMRF0sIE5VTEwsIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtDSExEXSwgTlVMTCwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorLS0tIFNJR0NITEQgKENoaWxkIGV4aXRlZCkgQCAwICgwKSAtLS0KK3dhaXQ0KC0xLCAweDc3ZmM5YzU0LCBXTk9IQU5HfFdVTlRSQUNFRCwgTlVMTCkgPSAtMSBFQ0hJTEQgKE5vIGNoaWxkIHByb2Nlc3NlcykKK3NpZ3JldHVybigpICAgICAgICAgICAgID0gPyAobWFzayBub3cgW10pCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbQ0hMRCBUU1RQIFRUSU4gVFRPVV0sIFtdLCA4KSA9IDAKK2lvY3RsKDI1NSwgVElPQ1NQR1JQLCBbMTk0NzNdKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0lOVF0sIFtdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdRVUlULCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FMUk0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUU1RQLCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUT1UsIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHV0lOQ0gsIHsweDgwY2E1Y2QsIFtdLCBTQV9SRVNUT1JFUnxTQV9SRVNUQVJULCAweDZmZjdhNGY4fSwgezB4ODA3ZGMzMywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCit3cml0ZSgyLCAic2gtMy4wMCMgIiwgOSkgPSA5CisKKworZ2V0cGlkKCkgPSAxOTc1NQorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUU1RQLCB7U0lHX0RGTH0sIHtTSUdfSUdOfSwgOCkgICAgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRJTiwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUT1UsIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3NldHBnaWQoMTk3NTUsIDE5NzU1KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITEQgVFNUUCBUVElOIFRUT1VdLCBbXSwgOCkgPSAwCitpb2N0bCgyNTUsIFRJT0NTUEdSUCwgWzE5NzU1XSkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorY2xvc2UoNCkgICA9IDAKK2R1cDIoNSwgMSkgPSAxCitjbG9zZSg1KSAgICAgICAgICAgICAgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7U0lHX0RGTH0sIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0RGTH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHQ0hMRCwge1NJR19ERkx9LCB7MHg4MDdjOTIyLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK2V4ZWN2ZSgiL2Jpbi9zbGVlcCIsIFsic2xlZXAiLCAiMSJdLCBbLyogMzQgdmFycyAqL10pID0gMAorLi4uCitfZXhpdCgwKSAgICAgICAgICAgICAgICA9ID8KKworCitnZXRwaWQoKSA9IDE5NzU2CitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RTVFAsIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7U0lHX0RGTH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorc2V0cGdpZCgxOTc1NiwgMTk3NTUpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbQ0hMRCBUU1RQIFRUSU4gVFRPVV0sIFtdLCA4KSA9IDAKK2lvY3RsKDI1NSwgVElPQ1NQR1JQLCBbMTk3NTVdKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitkdXAyKDQsIDApID0gMAorY2xvc2UoNCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7U0lHX0RGTH0sIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0RGTH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHQ0hMRCwge1NJR19ERkx9LCB7MHg4MDdjOTIyLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK2V4ZWN2ZSgiL2Jpbi9zbGVlcCIsIFsic2xlZXAiLCAiMiJdLCBbLyogMzQgdmFycyAqL10pID0gMAorLi4uCitfZXhpdCgwKSAgICAgICAgICAgICAgICA9ID8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaC5jIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4Y2QwMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaC5jCkBAIC0wLDAgKzEsMTMyNTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFzaCBzaGVsbCBwb3J0IGZvciBidXN5Ym94CisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBPcmlnaW5hbCBCU0QgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEsIDE5OTMsIDE5OTQKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogd2FzIHJlLXBvcnRlZCBmcm9tIE5ldEJTRCBhbmQgZGViaWFuaXplZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBzZXQgdG8gcmVmbGVjdCB0aGUgdHlwZSBvZiBzeXN0ZW0geW91IGhhdmU6CisgKiAgICAgIEpPQlMgLT4gMSBpZiB5b3UgaGF2ZSBCZXJrZWxleSBqb2IgY29udHJvbCwgMCBvdGhlcndpc2UuCisgKiAgICAgIGRlZmluZSBTWVNWIGlmIHlvdSBhcmUgcnVubmluZyB1bmRlciBTeXN0ZW0gVi4KKyAqICAgICAgZGVmaW5lIERFQlVHPTEgdG8gY29tcGlsZSBpbiBkZWJ1Z2dpbmcgKCdzZXQgLW8gZGVidWcnIHRvIHR1cm4gb24pCisgKiAgICAgIGRlZmluZSBERUJVRz0yIHRvIGNvbXBpbGUgaW4gYW5kIHR1cm4gb24gZGVidWdnaW5nLgorICoKKyAqIFdoZW4gZGVidWdnaW5nIGlzIG9uLCBkZWJ1Z2dpbmcgaW5mbyB3aWxsIGJlIHdyaXR0ZW4gdG8gLi90cmFjZSBhbmQKKyAqIGEgcXVpdCBzaWduYWwgd2lsbCBnZW5lcmF0ZSBhIGNvcmUgZHVtcC4KKyAqLworI2RlZmluZSBERUJVRyAwCisvKiBUd2VhayBkZWJ1ZyBvdXRwdXQgdmVyYm9zaXR5IGhlcmUgKi8KKyNkZWZpbmUgREVCVUdfVElNRSAwCisjZGVmaW5lIERFQlVHX1BJRCAxCisjZGVmaW5lIERFQlVHX1NJRyAxCisKKyNkZWZpbmUgUFJPRklMRSAwCisKKyNkZWZpbmUgSk9CUyBFTkFCTEVfQVNIX0pPQl9DT05UUk9MCisKKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKworI2luY2x1ZGUgImJ1c3lib3guaCIgLyogZm9yIGFwcGxldF9uYW1lcyAqLworI2luY2x1ZGUgInVuaWNvZGUuaCIKKworI2luY2x1ZGUgInNoZWxsX2NvbW1vbi5oIgorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKyMgaW5jbHVkZSAibWF0aC5oIgorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9SQU5ET01fU1VQUE9SVAorIyBpbmNsdWRlICJyYW5kb20uaCIKKyNlbHNlCisjIGRlZmluZSBDTEVBUl9SQU5ET01fVChybmQpICgodm9pZCkwKQorI2VuZGlmCisKKyNpbmNsdWRlICJOVU1fQVBQTEVUUy5oIgorI2lmIE5VTV9BUFBMRVRTID09IDEKKy8qIFNUQU5EQUxPTkUgZG9lcyBub3QgbWFrZSBzZW5zZSwgYW5kIHdvbid0IGNvbXBpbGUgKi8KKyMgdW5kZWYgQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIHVuZGVmIElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBJRl9OT1RfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FIDAKKyMgZGVmaW5lIElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSguLi4pCisjIGRlZmluZSBJRl9OT1RfRkVBVFVSRV9TSF9TVEFOREFMT05FKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisjaWZuZGVmIFBJUEVfQlVGCisjIGRlZmluZSBQSVBFX0JVRiA0MDk2ICAgICAgICAgICAvKiBhbW91bnQgb2YgYnVmZmVyaW5nIGluIGEgcGlwZSAqLworI2VuZGlmCisKKyNpZiAhQkJfTU1VCisjIGVycm9yICJEbyBub3QgZXZlbiBib3RoZXIsIGFzaCB3aWxsIG5vdCBydW4gb24gTk9NTVUgbWFjaGluZSIKKyNlbmRpZgorCisvL2NvbmZpZzpjb25maWcgQVNICisvL2NvbmZpZzoJYm9vbCAiYXNoIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gIU5PTU1VCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhhICdhc2gnIHNoZWxsIGFkZHMgYWJvdXQgNjBrIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYW5kIGlzCisvL2NvbmZpZzoJICB0aGUgbW9zdCBjb21wbGV0ZSBhbmQgbW9zdCBwZWRhbnRpY2FsbHkgY29ycmVjdCBzaGVsbCBpbmNsdWRlZCB3aXRoCisvL2NvbmZpZzoJICBidXN5Ym94LiBUaGlzIHNoZWxsIGlzIGFjdHVhbGx5IGEgZGVyaXZhdGl2ZSBvZiB0aGUgRGViaWFuICdkYXNoJworLy9jb25maWc6CSAgc2hlbGwgKGJ5IEhlcmJlcnQgWHUpLCB3aGljaCB3YXMgY3JlYXRlZCBieSBwb3J0aW5nIHRoZSAnYXNoJyBzaGVsbAorLy9jb25maWc6CSAgKHdyaXR0ZW4gYnkgS2VubmV0aCBBbG1xdWlzdCkgZnJvbSBOZXRCU0QuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfQkFTSF9DT01QQVQKKy8vY29uZmlnOglib29sICJiYXNoLWNvbXBhdGlibGUgZXh0ZW5zaW9ucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBiYXNoLWNvbXBhdGlibGUgZXh0ZW5zaW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9JRExFX1RJTUVPVVQKKy8vY29uZmlnOglib29sICJJZGxlIHRpbWVvdXQgdmFyaWFibGUiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGVzIGJhc2gtbGlrZSBhdXRvLWxvZ291dCBhZnRlciAkVE1PVVQgc2Vjb25kcyBvZiBpZGxlIHRpbWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfSk9CX0NPTlRST0wKKy8vY29uZmlnOglib29sICJKb2IgY29udHJvbCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBqb2IgY29udHJvbCBpbiB0aGUgYXNoIHNoZWxsLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0FMSUFTCisvL2NvbmZpZzoJYm9vbCAiQWxpYXMgc3VwcG9ydCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBhbGlhcyBzdXBwb3J0IGluIHRoZSBhc2ggc2hlbGwuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfR0VUT1BUUworLy9jb25maWc6CWJvb2wgIkJ1aWx0aW4gZ2V0b3B0IHRvIHBhcnNlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzdXBwb3J0IGZvciBnZXRvcHRzIGJ1aWx0aW4gaW4gYXNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0JVSUxUSU5fRUNITworLy9jb25maWc6CWJvb2wgIkJ1aWx0aW4gdmVyc2lvbiBvZiAnZWNobyciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc3VwcG9ydCBmb3IgZWNobyBidWlsdGluIGluIGFzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9CVUlMVElOX1BSSU5URgorLy9jb25maWc6CWJvb2wgIkJ1aWx0aW4gdmVyc2lvbiBvZiAncHJpbnRmJyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzdXBwb3J0IGZvciBwcmludGYgYnVpbHRpbiBpbiBhc2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfQlVJTFRJTl9URVNUCisvL2NvbmZpZzoJYm9vbCAiQnVpbHRpbiB2ZXJzaW9uIG9mICd0ZXN0JyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzdXBwb3J0IGZvciB0ZXN0IGJ1aWx0aW4gaW4gYXNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0NNRENNRAorLy9jb25maWc6CWJvb2wgIidjb21tYW5kJyBjb21tYW5kIHRvIG92ZXJyaWRlIHNoZWxsIGJ1aWx0aW5zIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBhc2ggJ2NvbW1hbmQnIGJ1aWx0aW4sIHdoaWNoIGFsbG93cworLy9jb25maWc6CSAgeW91IHRvIHJ1biB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cywKKy8vY29uZmlnOgkgIGV2ZW4gd2hlbiB0aGVyZSBpcyBhbiBhc2ggYnVpbHRpbiBjb21tYW5kIHdpdGggdGhlIHNhbWUgbmFtZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9NQUlMCisvL2NvbmZpZzoJYm9vbCAiQ2hlY2sgZm9yIG5ldyBtYWlsIG9uIGludGVyYWN0aXZlIHNoZWxscyIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSAiY2hlY2sgZm9yIG5ldyBtYWlsIiBmdW5jdGlvbiBpbiB0aGUgYXNoIHNoZWxsLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX09QVElNSVpFX0ZPUl9TSVpFCisvL2NvbmZpZzoJYm9vbCAiT3B0aW1pemUgZm9yIHNpemUgaW5zdGVhZCBvZiBzcGVlZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIENvbXBpbGUgYXNoIGZvciByZWR1Y2VkIHNpemUgYXQgdGhlIHByaWNlIG9mIHNwZWVkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX1JBTkRPTV9TVVBQT1JUCisvL2NvbmZpZzoJYm9vbCAiUHNldWRvcmFuZG9tIGdlbmVyYXRvciBhbmQgJFJBTkRPTSB2YXJpYWJsZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBwc2V1ZG9yYW5kb20gZ2VuZXJhdG9yIGFuZCBkeW5hbWljIHZhcmlhYmxlICIkUkFORE9NIi4KKy8vY29uZmlnOgkgIEVhY2ggcmVhZCBvZiAiJFJBTkRPTSIgd2lsbCBnZW5lcmF0ZSBhIG5ldyBwc2V1ZG9yYW5kb20gdmFsdWUuCisvL2NvbmZpZzoJICBZb3UgY2FuIHJlc2V0IHRoZSBnZW5lcmF0b3IgYnkgdXNpbmcgYSBzcGVjaWZpZWQgc3RhcnQgdmFsdWUuCisvL2NvbmZpZzoJICBBZnRlciAidW5zZXQgUkFORE9NIiB0aGUgZ2VuZXJhdG9yIHdpbGwgc3dpdGNoIG9mZiBhbmQgdGhpcworLy9jb25maWc6CSAgdmFyaWFibGUgd2lsbCBubyBsb25nZXIgaGF2ZSBzcGVjaWFsIHRyZWF0bWVudC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9FWFBBTkRfUFJNVAorLy9jb25maWc6CWJvb2wgIkV4cGFuZCBwcm9tcHQgc3RyaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgIlBTIyIgbWF5IGNvbnRhaW4gdm9sYXRpbGUgY29udGVudCwgc3VjaCBhcyBiYWNrcXVvdGUgY29tbWFuZHMuCisvL2NvbmZpZzoJICBUaGlzIG9wdGlvbiByZWNyZWF0ZXMgdGhlIHByb21wdCBzdHJpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQKKy8vY29uZmlnOgkgIHZhcmlhYmxlIGVhY2ggdGltZSBpdCBpcyBkaXNwbGF5ZWQuCisvL2NvbmZpZzoKKworLy9hcHBsZXQ6SUZfQVNIKEFQUExFVChhc2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9GRUFUVVJFX1NIX0lTX0FTSChBUFBMRVRfT0RETkFNRShzaCwgYXNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHNoKSkKKy8vYXBwbGV0OklGX0ZFQVRVUkVfQkFTSF9JU19BU0goQVBQTEVUX09ERE5BTUUoYmFzaCwgYXNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGJhc2gpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQVNIKSArPSBhc2gubyBhc2hfcHRyX2hhY2subyBzaGVsbF9jb21tb24ubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0FTSF9SQU5ET01fU1VQUE9SVCkgKz0gcmFuZG9tLm8KKworCisvKiA9PT09PT09PT09PT0gSGFzaCB0YWJsZSBzaXplcy4gQ29uZmlndXJhYmxlLiAqLworCisjZGVmaW5lIFZUQUJTSVpFIDM5CisjZGVmaW5lIEFUQUJTSVpFIDM5CisjZGVmaW5lIENNRFRBQkxFU0laRSAzMSAgICAgICAgIC8qIHNob3VsZCBiZSBwcmltZSAqLworCisKKy8qID09PT09PT09PT09PSBTaGVsbCBvcHRpb25zICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBvcHRsZXR0ZXJzX29wdG5hbWVzW10gPSB7CisJImUiICAgImVycmV4aXQiLAorCSJmIiAgICJub2dsb2IiLAorCSJJIiAgICJpZ25vcmVlb2YiLAorCSJpIiAgICJpbnRlcmFjdGl2ZSIsCisJIm0iICAgIm1vbml0b3IiLAorCSJuIiAgICJub2V4ZWMiLAorCSJzIiAgICJzdGRpbiIsCisJIngiICAgInh0cmFjZSIsCisJInYiICAgInZlcmJvc2UiLAorCSJDIiAgICJub2Nsb2JiZXIiLAorCSJhIiAgICJhbGxleHBvcnQiLAorCSJiIiAgICJub3RpZnkiLAorCSJ1IiAgICJub3Vuc2V0IiwKKwkiXDAiICAidmkiCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCSwiXDAiICAicGlwZWZhaWwiCisjZW5kaWYKKyNpZiBERUJVRworCSwiXDAiICAibm9sb2ciCisJLCJcMCIgICJkZWJ1ZyIKKyNlbmRpZgorfTsKKworI2RlZmluZSBvcHRsZXR0ZXJzKG4pICBvcHRsZXR0ZXJzX29wdG5hbWVzW25dWzBdCisjZGVmaW5lIG9wdG5hbWVzKG4pICAgKG9wdGxldHRlcnNfb3B0bmFtZXNbbl0gKyAxKQorCitlbnVtIHsgTk9QVFMgPSBBUlJBWV9TSVpFKG9wdGxldHRlcnNfb3B0bmFtZXMpIH07CisKKworLyogPT09PT09PT09PT09IE1pc2MgZGF0YSAqLworCisjZGVmaW5lIG1zZ19pbGxudW0gIklsbGVnYWwgbnVtYmVyOiAlcyIKKworLyoKKyAqIFdlIGVuY2xvc2Ugam1wX2J1ZiBpbiBhIHN0cnVjdHVyZSBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHBvaW50ZXJzIHRvCisgKiBqdW1wIGxvY2F0aW9ucy4gIFRoZSBnbG9iYWwgdmFyaWFibGUgaGFuZGxlciBjb250YWlucyB0aGUgbG9jYXRpb24gdG8KKyAqIGp1bXAgdG8gd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLCBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSBleGNlcHRpb25fdHlwZQorICogY29udGFpbnMgYSBjb2RlIGlkZW50aWZ5aW5nIHRoZSBleGNlcHRpb24uICBUbyBpbXBsZW1lbnQgbmVzdGVkCisgKiBleGNlcHRpb24gaGFuZGxlcnMsIHRoZSB1c2VyIHNob3VsZCBzYXZlIHRoZSB2YWx1ZSBvZiBoYW5kbGVyIG9uIGVudHJ5CisgKiB0byBhbiBpbm5lciBzY29wZSwgc2V0IGhhbmRsZXIgdG8gcG9pbnQgdG8gYSBqbXBsb2Mgc3RydWN0dXJlIGZvciB0aGUKKyAqIGlubmVyIHNjb3BlLCBhbmQgcmVzdG9yZSBoYW5kbGVyIG9uIGV4aXQgZnJvbSB0aGUgc2NvcGUuCisgKi8KK3N0cnVjdCBqbXBsb2MgeworCWptcF9idWYgbG9jOworfTsKKworc3RydWN0IGdsb2JhbHNfbWlzYyB7CisJLyogcGlkIG9mIG1haW4gc2hlbGwgKi8KKwlpbnQgcm9vdHBpZDsKKwkvKiBzaGVsbCBsZXZlbDogMCBmb3IgdGhlIG1haW4gc2hlbGwsIDEgZm9yIGl0cyBjaGlsZHJlbiwgYW5kIHNvIG9uICovCisJaW50IHNobHZsOworI2RlZmluZSByb290c2hlbGwgKCFzaGx2bCkKKwljaGFyICptaW51c2M7ICAvKiBhcmd1bWVudCB0byAtYyBvcHRpb24gKi8KKworCWNoYXIgKmN1cmRpcjsgLy8gPSBudWxsc3RyOyAgICAgLyogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAqLworCWNoYXIgKnBoeXNkaXI7IC8vID0gbnVsbHN0cjsgICAgLyogcGh5c2ljYWwgd29ya2luZyBkaXJlY3RvcnkgKi8KKworCWNoYXIgKmFyZzA7IC8qIHZhbHVlIG9mICQwICovCisKKwlzdHJ1Y3Qgam1wbG9jICpleGNlcHRpb25faGFuZGxlcjsKKworCXZvbGF0aWxlIGludCBzdXBwcmVzc19pbnQ7IC8qIGNvdW50ZXIgKi8KKwl2b2xhdGlsZSAvKnNpZ19hdG9taWNfdCovIHNtYWxsaW50IHBlbmRpbmdfaW50OyAvKiAxID0gZ290IFNJR0lOVCAqLworCS8qIGxhc3QgcGVuZGluZyBzaWduYWwgKi8KKwl2b2xhdGlsZSAvKnNpZ19hdG9taWNfdCovIHNtYWxsaW50IHBlbmRpbmdfc2lnOworCXNtYWxsaW50IGV4Y2VwdGlvbl90eXBlOyAvKiBraW5kIG9mIGV4Y2VwdGlvbiAoMC4uNSkgKi8KKwkvKiBleGNlcHRpb25zICovCisjZGVmaW5lIEVYSU5UIDAgICAgICAgICAvKiBTSUdJTlQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRVhFUlJPUiAxICAgICAgIC8qIGEgZ2VuZXJpYyBlcnJvciAqLworI2RlZmluZSBFWFNIRUxMUFJPQyAyICAgLyogZXhlY3V0ZSBhIHNoZWxsIHByb2NlZHVyZSAqLworI2RlZmluZSBFWEVYRUMgMyAgICAgICAgLyogY29tbWFuZCBleGVjdXRpb24gZmFpbGVkICovCisjZGVmaW5lIEVYRVhJVCA0ICAgICAgICAvKiBleGl0IHRoZSBzaGVsbCAqLworI2RlZmluZSBFWFNJRyA1ICAgICAgICAgLyogdHJhcHBlZCBzaWduYWwgaW4gd2FpdCgxKSAqLworCisJc21hbGxpbnQgaXNsb2dpbnNoOworCWNoYXIgbnVsbHN0clsxXTsgICAgICAgIC8qIHplcm8gbGVuZ3RoIHN0cmluZyAqLworCisJY2hhciBvcHRsaXN0W05PUFRTXTsKKyNkZWZpbmUgZWZsYWcgb3B0bGlzdFswXQorI2RlZmluZSBmZmxhZyBvcHRsaXN0WzFdCisjZGVmaW5lIElmbGFnIG9wdGxpc3RbMl0KKyNkZWZpbmUgaWZsYWcgb3B0bGlzdFszXQorI2RlZmluZSBtZmxhZyBvcHRsaXN0WzRdCisjZGVmaW5lIG5mbGFnIG9wdGxpc3RbNV0KKyNkZWZpbmUgc2ZsYWcgb3B0bGlzdFs2XQorI2RlZmluZSB4ZmxhZyBvcHRsaXN0WzddCisjZGVmaW5lIHZmbGFnIG9wdGxpc3RbOF0KKyNkZWZpbmUgQ2ZsYWcgb3B0bGlzdFs5XQorI2RlZmluZSBhZmxhZyBvcHRsaXN0WzEwXQorI2RlZmluZSBiZmxhZyBvcHRsaXN0WzExXQorI2RlZmluZSB1ZmxhZyBvcHRsaXN0WzEyXQorI2RlZmluZSB2aWZsYWcgb3B0bGlzdFsxM10KKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisjIGRlZmluZSBwaXBlZmFpbCBvcHRsaXN0WzE0XQorI2Vsc2UKKyMgZGVmaW5lIHBpcGVmYWlsIDAKKyNlbmRpZgorI2lmIERFQlVHCisjIGRlZmluZSBub2xvZyBvcHRsaXN0WzE0ICsgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVF0KKyMgZGVmaW5lIGRlYnVnIG9wdGxpc3RbMTUgKyBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUXQorI2VuZGlmCisKKwkvKiB0cmFwIGhhbmRsZXIgY29tbWFuZHMgKi8KKwkvKgorCSAqIFNpZ21vZGUgcmVjb3JkcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2lnbmFsIGhhbmRsZXJzIGZvciB0aGUgdmFyaW91cworCSAqIG1vZGVzLiAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgaGFuZGxlciBpcyBub3Qga25vd24uCisJICogU19IQVJEX0lHTiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2lnbmFsIHdhcyBpZ25vcmVkIG9uIGVudHJ5IHRvIHRoZSBzaGVsbC4KKwkgKi8KKwljaGFyIHNpZ21vZGVbTlNJRyAtIDFdOworI2RlZmluZSBTX0RGTCAgICAgIDEgICAgICAgICAgICAvKiBkZWZhdWx0IHNpZ25hbCBoYW5kbGluZyAoU0lHX0RGTCkgKi8KKyNkZWZpbmUgU19DQVRDSCAgICAyICAgICAgICAgICAgLyogc2lnbmFsIGlzIGNhdWdodCAqLworI2RlZmluZSBTX0lHTiAgICAgIDMgICAgICAgICAgICAvKiBzaWduYWwgaXMgaWdub3JlZCAoU0lHX0lHTikgKi8KKyNkZWZpbmUgU19IQVJEX0lHTiA0ICAgICAgICAgICAgLyogc2lnbmFsIGlzIGlnbm9yZWQgcGVybWVuYW50bHkgKi8KKworCS8qIGluZGljYXRlcyBzcGVjaWZpZWQgc2lnbmFsIHJlY2VpdmVkICovCisJdWludDhfdCBnb3RzaWdbTlNJRyAtIDFdOyAvKiBvZmZzZXQgYnkgMTogInNpZ25hbCIgMCBpcyBtZWFuaW5nbGVzcyAqLworCXVpbnQ4X3QgbWF5X2hhdmVfdHJhcHM7IC8qIDA6IGRlZmluaXRlbHkgbm8gdHJhcHMgYXJlIHNldCwgMTogc29tZSB0cmFwcyBtYXkgYmUgc2V0ICovCisJY2hhciAqdHJhcFtOU0lHXTsKKwljaGFyICoqdHJhcF9wdHI7ICAgICAgICAvKiB1c2VkIG9ubHkgYnkgInRyYXAgaGFjayIgKi8KKworCS8qIFJhcmVseSByZWZlcmVuY2VkIHN0dWZmICovCisjaWYgRU5BQkxFX0FTSF9SQU5ET01fU1VQUE9SVAorCXJhbmRvbV90IHJhbmRvbV9nZW47CisjZW5kaWYKKwlwaWRfdCBiYWNrZ25kcGlkOyAgICAgICAgLyogcGlkIG9mIGxhc3QgYmFja2dyb3VuZCBwcm9jZXNzICovCisJc21hbGxpbnQgam9iX3dhcm5pbmc7ICAgIC8qIHVzZXIgd2FzIHdhcm5lZCBhYm91dCBzdG9wcGVkIGpvYnMgKGNhbiBiZSAyLCAxIG9yIDApLiAqLworfTsKK2V4dGVybiBzdHJ1Y3QgZ2xvYmFsc19taXNjICpjb25zdCBhc2hfcHRyX3RvX2dsb2JhbHNfbWlzYzsKKyNkZWZpbmUgR19taXNjICgqYXNoX3B0cl90b19nbG9iYWxzX21pc2MpCisjZGVmaW5lIHJvb3RwaWQgICAgIChHX21pc2Mucm9vdHBpZCAgICApCisjZGVmaW5lIHNobHZsICAgICAgIChHX21pc2Muc2hsdmwgICAgICApCisjZGVmaW5lIG1pbnVzYyAgICAgIChHX21pc2MubWludXNjICAgICApCisjZGVmaW5lIGN1cmRpciAgICAgIChHX21pc2MuY3VyZGlyICAgICApCisjZGVmaW5lIHBoeXNkaXIgICAgIChHX21pc2MucGh5c2RpciAgICApCisjZGVmaW5lIGFyZzAgICAgICAgIChHX21pc2MuYXJnMCAgICAgICApCisjZGVmaW5lIGV4Y2VwdGlvbl9oYW5kbGVyIChHX21pc2MuZXhjZXB0aW9uX2hhbmRsZXIpCisjZGVmaW5lIGV4Y2VwdGlvbl90eXBlICAgIChHX21pc2MuZXhjZXB0aW9uX3R5cGUgICApCisjZGVmaW5lIHN1cHByZXNzX2ludCAgICAgIChHX21pc2Muc3VwcHJlc3NfaW50ICAgICApCisjZGVmaW5lIHBlbmRpbmdfaW50ICAgICAgIChHX21pc2MucGVuZGluZ19pbnQgICAgICApCisjZGVmaW5lIHBlbmRpbmdfc2lnICAgICAgIChHX21pc2MucGVuZGluZ19zaWcgICAgICApCisjZGVmaW5lIGlzbG9naW5zaCAgIChHX21pc2MuaXNsb2dpbnNoICApCisjZGVmaW5lIG51bGxzdHIgICAgIChHX21pc2MubnVsbHN0ciAgICApCisjZGVmaW5lIG9wdGxpc3QgICAgIChHX21pc2Mub3B0bGlzdCAgICApCisjZGVmaW5lIHNpZ21vZGUgICAgIChHX21pc2Muc2lnbW9kZSAgICApCisjZGVmaW5lIGdvdHNpZyAgICAgIChHX21pc2MuZ290c2lnICAgICApCisjZGVmaW5lIG1heV9oYXZlX3RyYXBzICAgIChHX21pc2MubWF5X2hhdmVfdHJhcHMgICApCisjZGVmaW5lIHRyYXAgICAgICAgIChHX21pc2MudHJhcCAgICAgICApCisjZGVmaW5lIHRyYXBfcHRyICAgIChHX21pc2MudHJhcF9wdHIgICApCisjZGVmaW5lIHJhbmRvbV9nZW4gIChHX21pc2MucmFuZG9tX2dlbiApCisjZGVmaW5lIGJhY2tnbmRwaWQgIChHX21pc2MuYmFja2duZHBpZCApCisjZGVmaW5lIGpvYl93YXJuaW5nIChHX21pc2Muam9iX3dhcm5pbmcpCisjZGVmaW5lIElOSVRfR19taXNjKCkgZG8geyBcCisJKCooc3RydWN0IGdsb2JhbHNfbWlzYyoqKSZhc2hfcHRyX3RvX2dsb2JhbHNfbWlzYykgPSB4emFsbG9jKHNpemVvZihHX21pc2MpKTsgXAorCWJhcnJpZXIoKTsgXAorCWN1cmRpciA9IG51bGxzdHI7IFwKKwlwaHlzZGlyID0gbnVsbHN0cjsgXAorCXRyYXBfcHRyID0gdHJhcDsgXAorfSB3aGlsZSAoMCkKKworCisvKiA9PT09PT09PT09PT0gREVCVUcgKi8KKyNpZiBERUJVRworc3RhdGljIHZvaWQgdHJhY2VfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyB2b2lkIHRyYWNlX3ZwcmludGYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZhKTsKKyMgZGVmaW5lIFRSQUNFKHBhcmFtKSAgICB0cmFjZV9wcmludGYgcGFyYW0KKyMgZGVmaW5lIFRSQUNFVihwYXJhbSkgICB0cmFjZV92cHJpbnRmIHBhcmFtCisjIGRlZmluZSBjbG9zZShmZCkgZG8geyBcCisJaW50IGRmZCA9IChmZCk7IFwKKwlpZiAoY2xvc2UoZGZkKSA8IDApIFwKKwkJYmJfZXJyb3JfbXNnKCJidWcgb24gJWQ6IGNsb3NpbmcgJWQoMHgleCkiLCBcCisJCQlfX0xJTkVfXywgZGZkLCBkZmQpOyBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIFRSQUNFKHBhcmFtKQorIyBkZWZpbmUgVFJBQ0VWKHBhcmFtKQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09IFV0aWxpdHkgZnVuY3Rpb25zICovCisjZGVmaW5lIHhiYXJyaWVyKCkgZG8geyBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiI6IDogOiJtZW1vcnkiKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBpc2RpZ2l0X3N0cjkoY29uc3QgY2hhciAqc3RyKQoreworCWludCBtYXhsZW4gPSA5ICsgMTsgLyogbWF4IDkgZGlnaXRzOiA5OTk5OTk5OTkgKi8KKwl3aGlsZSAoLS1tYXhsZW4gJiYgaXNkaWdpdCgqc3RyKSkKKwkJc3RyKys7CisJcmV0dXJuICgqc3RyID09ICdcMCcpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdmFyX2VuZChjb25zdCBjaGFyICp2YXIpCit7CisJd2hpbGUgKCp2YXIpCisJCWlmICgqdmFyKysgPT0gJz0nKQorCQkJYnJlYWs7CisJcmV0dXJuIHZhcjsKK30KKworCisvKiA9PT09PT09PT09PT0gSW50ZXJydXB0cyAvIGV4Y2VwdGlvbnMgKi8KKworc3RhdGljIHZvaWQgZXhpdHNoZWxsKHZvaWQpIE5PUkVUVVJOOworCisvKgorICogVGhlc2UgbWFjcm9zIGFsbG93IHRoZSB1c2VyIHRvIHN1c3BlbmQgdGhlIGhhbmRsaW5nIG9mIGludGVycnVwdCBzaWduYWxzCisgKiBvdmVyIGEgcGVyaW9kIG9mIHRpbWUuICBUaGlzIGlzIHNpbWlsYXIgdG8gU0lHSE9MRCBvciB0byBzaWdibG9jaywgYnV0CisgKiBtdWNoIG1vcmUgZWZmaWNpZW50IGFuZCBwb3J0YWJsZS4gIChCdXQgaGFja2luZyB0aGUga2VybmVsIGlzIHNvIG11Y2gKKyAqIG1vcmUgZnVuIHRoYW4gd29ycnlpbmcgYWJvdXQgZWZmaWNpZW5jeSBhbmQgcG9ydGFiaWxpdHkuIDotKSkKKyAqLworI2RlZmluZSBJTlRfT0ZGIGRvIHsgXAorCXN1cHByZXNzX2ludCsrOyBcCisJeGJhcnJpZXIoKTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIENhbGxlZCB0byByYWlzZSBhbiBleGNlcHRpb24uICBTaW5jZSBDIGRvZXNuJ3QgaW5jbHVkZSBleGNlcHRpb25zLCB3ZQorICoganVzdCBkbyBhIGxvbmdqbXAgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyLiAgVGhlIHR5cGUgb2YgZXhjZXB0aW9uIGlzCisgKiBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSAiZXhjZXB0aW9uX3R5cGUiLgorICovCitzdGF0aWMgdm9pZCByYWlzZV9leGNlcHRpb24oaW50KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCityYWlzZV9leGNlcHRpb24oaW50IGUpCit7CisjaWYgREVCVUcKKwlpZiAoZXhjZXB0aW9uX2hhbmRsZXIgPT0gTlVMTCkKKwkJYWJvcnQoKTsKKyNlbmRpZgorCUlOVF9PRkY7CisJZXhjZXB0aW9uX3R5cGUgPSBlOworCWxvbmdqbXAoZXhjZXB0aW9uX2hhbmRsZXItPmxvYywgMSk7Cit9CisjaWYgREVCVUcKKyNkZWZpbmUgcmFpc2VfZXhjZXB0aW9uKGUpIGRvIHsgXAorCVRSQUNFKCgicmFpc2luZyBleGNlcHRpb24gJWQgb24gbGluZSAlZFxuIiwgKGUpLCBfX0xJTkVfXykpOyBcCisJcmFpc2VfZXhjZXB0aW9uKGUpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qCisgKiBDYWxsZWQgZnJvbSB0cmFwLmMgd2hlbiBhIFNJR0lOVCBpcyByZWNlaXZlZC4gIChJZiB0aGUgdXNlciBzcGVjaWZpZXMKKyAqIHRoYXQgU0lHSU5UIGlzIHRvIGJlIHRyYXBwZWQgb3IgaWdub3JlZCB1c2luZyB0aGUgdHJhcCBidWlsdGluLCB0aGVuCisgKiB0aGlzIHJvdXRpbmUgaXMgbm90IGNhbGxlZC4pICBTdXBwcmVzc2ludCBpcyBub256ZXJvIHdoZW4gaW50ZXJydXB0cworICogYXJlIGhlbGQgdXNpbmcgdGhlIElOVF9PRkYgbWFjcm8uICAoVGhlIHRlc3QgZm9yIGlmbGFnIGlzIGp1c3QKKyAqIGRlZmVuc2l2ZSBwcm9ncmFtbWluZy4pCisgKi8KK3N0YXRpYyB2b2lkIHJhaXNlX2ludGVycnVwdCh2b2lkKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCityYWlzZV9pbnRlcnJ1cHQodm9pZCkKK3sKKwlpbnQgZXhfdHlwZTsKKworCXBlbmRpbmdfaW50ID0gMDsKKwkvKiBTaWduYWwgaXMgbm90IGF1dG9tYXRpY2FsbHkgdW5tYXNrZWQgYWZ0ZXIgaXQgaXMgcmFpc2VkLAorCSAqIGRvIGl0IG91cnNlbGYgLSB1bm1hc2sgYWxsIHNpZ25hbHMgKi8KKwlzaWdwcm9jbWFza19hbGxzaWdzKFNJR19VTkJMT0NLKTsKKwkvKiBwZW5kaW5nX3NpZyA9IDA7IC0gbm93IGRvbmUgaW4gc2lnbmFsX2hhbmRsZXIoKSAqLworCisJZXhfdHlwZSA9IEVYU0lHOworCWlmIChnb3RzaWdbU0lHSU5UIC0gMV0gJiYgIXRyYXBbU0lHSU5UXSkgeworCQlpZiAoIShyb290c2hlbGwgJiYgaWZsYWcpKSB7CisJCQkvKiBLaWxsIG91cnNlbGYgd2l0aCBTSUdJTlQgKi8KKwkJCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCQkJcmFpc2UoU0lHSU5UKTsKKwkJfQorCQlleF90eXBlID0gRVhJTlQ7CisJfQorCXJhaXNlX2V4Y2VwdGlvbihleF90eXBlKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisjaWYgREVCVUcKKyNkZWZpbmUgcmFpc2VfaW50ZXJydXB0KCkgZG8geyBcCisJVFJBQ0UoKCJyYWlzaW5nIGludGVycnVwdCBvbiBsaW5lICVkXG4iLCBfX0xJTkVfXykpOyBcCisJcmFpc2VfaW50ZXJydXB0KCk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIElGX0FTSF9PUFRJTUlaRV9GT1JfU0laRShpbmxpbmUpIHZvaWQKK2ludF9vbih2b2lkKQoreworCXhiYXJyaWVyKCk7CisJaWYgKC0tc3VwcHJlc3NfaW50ID09IDAgJiYgcGVuZGluZ19pbnQpIHsKKwkJcmFpc2VfaW50ZXJydXB0KCk7CisJfQorfQorI2RlZmluZSBJTlRfT04gaW50X29uKCkKK3N0YXRpYyBJRl9BU0hfT1BUSU1JWkVfRk9SX1NJWkUoaW5saW5lKSB2b2lkCitmb3JjZV9pbnRfb24odm9pZCkKK3sKKwl4YmFycmllcigpOworCXN1cHByZXNzX2ludCA9IDA7CisJaWYgKHBlbmRpbmdfaW50KQorCQlyYWlzZV9pbnRlcnJ1cHQoKTsKK30KKyNkZWZpbmUgRk9SQ0VfSU5UX09OIGZvcmNlX2ludF9vbigpCisKKyNkZWZpbmUgU0FWRV9JTlQodikgKCh2KSA9IHN1cHByZXNzX2ludCkKKworI2RlZmluZSBSRVNUT1JFX0lOVCh2KSBkbyB7IFwKKwl4YmFycmllcigpOyBcCisJc3VwcHJlc3NfaW50ID0gKHYpOyBcCisJaWYgKHN1cHByZXNzX2ludCA9PSAwICYmIHBlbmRpbmdfaW50KSBcCisJCXJhaXNlX2ludGVycnVwdCgpOyBcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PSBTdGRvdXQvc3RkZXJyIG91dHB1dCAqLworCitzdGF0aWMgdm9pZAorb3V0c3RyKGNvbnN0IGNoYXIgKnAsIEZJTEUgKmZpbGUpCit7CisJSU5UX09GRjsKKwlmcHV0cyhwLCBmaWxlKTsKKwlJTlRfT047Cit9CisKK3N0YXRpYyB2b2lkCitmbHVzaF9zdGRvdXRfc3RkZXJyKHZvaWQpCit7CisJSU5UX09GRjsKKwlmZmx1c2hfYWxsKCk7CisJSU5UX09OOworfQorCitzdGF0aWMgdm9pZAorb3V0Y3Nsb3coaW50IGMsIEZJTEUgKmRlc3QpCit7CisJSU5UX09GRjsKKwlwdXRjKGMsIGRlc3QpOworCWZmbHVzaChkZXN0KTsKKwlJTlRfT047Cit9CisKK3N0YXRpYyBpbnQgb3V0MWZtdChjb25zdCBjaGFyICosIC4uLikgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLDEsMikpKTsKK3N0YXRpYyBpbnQKK291dDFmbXQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcjsKKworCUlOVF9PRkY7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJciA9IHZwcmludGYoZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlJTlRfT047CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZm10c3RyKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLikgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLDMsNCkpKTsKK3N0YXRpYyBpbnQKK2ZtdHN0cihjaGFyICpvdXRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJldDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCUlOVF9PRkY7CisJcmV0ID0gdnNucHJpbnRmKG91dGJ1ZiwgbGVuZ3RoLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCUlOVF9PTjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorb3V0MXN0cihjb25zdCBjaGFyICpwKQoreworCW91dHN0cihwLCBzdGRvdXQpOworfQorCitzdGF0aWMgdm9pZAorb3V0MnN0cihjb25zdCBjaGFyICpwKQoreworCW91dHN0cihwLCBzdGRlcnIpOworCWZsdXNoX3N0ZG91dF9zdGRlcnIoKTsKK30KKworCisvKiA9PT09PT09PT09PT0gUGFyc2VyIHN0cnVjdHVyZXMgKi8KKworLyogY29udHJvbCBjaGFyYWN0ZXJzIGluIGFyZ3VtZW50IHN0cmluZ3MgKi8KKyNkZWZpbmUgQ1RMX0ZJUlNUIENUTEVTQworI2RlZmluZSBDVExFU0MgICAgICAgKCh1bnNpZ25lZCBjaGFyKSdcMjAxJykgICAgLyogZXNjYXBlIG5leHQgY2hhcmFjdGVyICovCisjZGVmaW5lIENUTFZBUiAgICAgICAoKHVuc2lnbmVkIGNoYXIpJ1wyMDInKSAgICAvKiB2YXJpYWJsZSBkZWZuICovCisjZGVmaW5lIENUTEVORFZBUiAgICAoKHVuc2lnbmVkIGNoYXIpJ1wyMDMnKQorI2RlZmluZSBDVExCQUNLUSAgICAgKCh1bnNpZ25lZCBjaGFyKSdcMjA0JykKKyNkZWZpbmUgQ1RMUVVPVEUgMDEgICAgICAgICAgICAgLyogb3JlZCB3aXRoIENUTEJBQ0tRIGNvZGUgaWYgaW4gcXVvdGVzICovCisvKiAgICAgIENUTEJBQ0tRIHwgQ1RMUVVPVEUgPT0gJ1wyMDUnICovCisjZGVmaW5lIENUTEFSSSAgICAgICAoKHVuc2lnbmVkIGNoYXIpJ1wyMDYnKSAgICAvKiBhcml0aG1ldGljIGV4cHJlc3Npb24gKi8KKyNkZWZpbmUgQ1RMRU5EQVJJICAgICgodW5zaWduZWQgY2hhciknXDIwNycpCisjZGVmaW5lIENUTFFVT1RFTUFSSyAoKHVuc2lnbmVkIGNoYXIpJ1wyMTAnKQorI2RlZmluZSBDVExfTEFTVCBDVExRVU9URU1BUksKKworLyogdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJ5dGUgKGZvbGxvd3MgQ1RMVkFSKSAqLworI2RlZmluZSBWU1RZUEUgIDB4MGYgICAgICAgICAgICAvKiB0eXBlIG9mIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiAqLworI2RlZmluZSBWU05VTCAgIDB4MTAgICAgICAgICAgICAvKiBjb2xvbi0tdHJlYXQgdGhlIGVtcHR5IHN0cmluZyBhcyB1bnNldCAqLworI2RlZmluZSBWU1FVT1RFIDB4ODAgICAgICAgICAgICAvKiBpbnNpZGUgZG91YmxlIHF1b3Rlcy0tc3VwcHJlc3Mgc3BsaXR0aW5nICovCisKKy8qIHZhbHVlcyBvZiBWU1RZUEUgZmllbGQgKi8KKyNkZWZpbmUgVlNOT1JNQUwgICAgICAgIDB4MSAgICAgLyogbm9ybWFsIHZhcmlhYmxlOiAgJHZhciBvciAke3Zhcn0gKi8KKyNkZWZpbmUgVlNNSU5VUyAgICAgICAgIDB4MiAgICAgLyogJHt2YXItdGV4dH0gKi8KKyNkZWZpbmUgVlNQTFVTICAgICAgICAgIDB4MyAgICAgLyogJHt2YXIrdGV4dH0gKi8KKyNkZWZpbmUgVlNRVUVTVElPTiAgICAgIDB4NCAgICAgLyogJHt2YXI/bWVzc2FnZX0gKi8KKyNkZWZpbmUgVlNBU1NJR04gICAgICAgIDB4NSAgICAgLyogJHt2YXI9dGV4dH0gKi8KKyNkZWZpbmUgVlNUUklNUklHSFQgICAgIDB4NiAgICAgLyogJHt2YXIlcGF0dGVybn0gKi8KKyNkZWZpbmUgVlNUUklNUklHSFRNQVggIDB4NyAgICAgLyogJHt2YXIlJXBhdHRlcm59ICovCisjZGVmaW5lIFZTVFJJTUxFRlQgICAgICAweDggICAgIC8qICR7dmFyI3BhdHRlcm59ICovCisjZGVmaW5lIFZTVFJJTUxFRlRNQVggICAweDkgICAgIC8qICR7dmFyIyNwYXR0ZXJufSAqLworI2RlZmluZSBWU0xFTkdUSCAgICAgICAgMHhhICAgICAvKiAkeyN2YXJ9ICovCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorI2RlZmluZSBWU1NVQlNUUiAgICAgICAgMHhjICAgICAvKiAke3Zhcjpwb3NpdGlvbjpsZW5ndGh9ICovCisjZGVmaW5lIFZTUkVQTEFDRSAgICAgICAweGQgICAgIC8qICR7dmFyL3BhdHRlcm4vcmVwbGFjZW1lbnR9ICovCisjZGVmaW5lIFZTUkVQTEFDRUFMTCAgICAweGUgICAgIC8qICR7dmFyLy9wYXR0ZXJuL3JlcGxhY2VtZW50fSAqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIGRvbGF0c3RyW10gQUxJR04xID0geworCUNUTFZBUiwgVlNOT1JNQUx8VlNRVU9URSwgJ0AnLCAnPScsICdcMCcKK307CisKKyNkZWZpbmUgTkNNRCAgICAgIDAKKyNkZWZpbmUgTlBJUEUgICAgIDEKKyNkZWZpbmUgTlJFRElSICAgIDIKKyNkZWZpbmUgTkJBQ0tHTkQgIDMKKyNkZWZpbmUgTlNVQlNIRUxMIDQKKyNkZWZpbmUgTkFORCAgICAgIDUKKyNkZWZpbmUgTk9SICAgICAgIDYKKyNkZWZpbmUgTlNFTUkgICAgIDcKKyNkZWZpbmUgTklGICAgICAgIDgKKyNkZWZpbmUgTldISUxFICAgIDkKKyNkZWZpbmUgTlVOVElMICAgMTAKKyNkZWZpbmUgTkZPUiAgICAgMTEKKyNkZWZpbmUgTkNBU0UgICAgMTIKKyNkZWZpbmUgTkNMSVNUICAgMTMKKyNkZWZpbmUgTkRFRlVOICAgMTQKKyNkZWZpbmUgTkFSRyAgICAgMTUKKyNkZWZpbmUgTlRPICAgICAgMTYKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisjZGVmaW5lIE5UTzIgICAgIDE3CisjZW5kaWYKKyNkZWZpbmUgTkNMT0JCRVIgMTgKKyNkZWZpbmUgTkZST00gICAgMTkKKyNkZWZpbmUgTkZST01UTyAgMjAKKyNkZWZpbmUgTkFQUEVORCAgMjEKKyNkZWZpbmUgTlRPRkQgICAgMjIKKyNkZWZpbmUgTkZST01GRCAgMjMKKyNkZWZpbmUgTkhFUkUgICAgMjQKKyNkZWZpbmUgTlhIRVJFICAgMjUKKyNkZWZpbmUgTk5PVCAgICAgMjYKKyNkZWZpbmUgTl9OVU1CRVIgMjcKKwordW5pb24gbm9kZTsKKworc3RydWN0IG5jbWQgeworCXNtYWxsaW50IHR5cGU7IC8qIE54eHh4ICovCisJdW5pb24gbm9kZSAqYXNzaWduOworCXVuaW9uIG5vZGUgKmFyZ3M7CisJdW5pb24gbm9kZSAqcmVkaXJlY3Q7Cit9OworCitzdHJ1Y3QgbnBpcGUgeworCXNtYWxsaW50IHR5cGU7CisJc21hbGxpbnQgcGlwZV9iYWNrZ25kOworCXN0cnVjdCBub2RlbGlzdCAqY21kbGlzdDsKK307CisKK3N0cnVjdCBucmVkaXIgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqbjsKKwl1bmlvbiBub2RlICpyZWRpcmVjdDsKK307CisKK3N0cnVjdCBuYmluYXJ5IHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKmNoMTsKKwl1bmlvbiBub2RlICpjaDI7Cit9OworCitzdHJ1Y3QgbmlmIHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKnRlc3Q7CisJdW5pb24gbm9kZSAqaWZwYXJ0OworCXVuaW9uIG5vZGUgKmVsc2VwYXJ0OworfTsKKworc3RydWN0IG5mb3IgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqYXJnczsKKwl1bmlvbiBub2RlICpib2R5OworCWNoYXIgKnZhcjsKK307CisKK3N0cnVjdCBuY2FzZSB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpleHByOworCXVuaW9uIG5vZGUgKmNhc2VzOworfTsKKworc3RydWN0IG5jbGlzdCB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpuZXh0OworCXVuaW9uIG5vZGUgKnBhdHRlcm47CisJdW5pb24gbm9kZSAqYm9keTsKK307CisKK3N0cnVjdCBuYXJnIHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKm5leHQ7CisJY2hhciAqdGV4dDsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmJhY2txdW90ZTsKK307CisKKy8qIG5maWxlIGFuZCBuZHVwIGxheW91dCBtdXN0IG1hdGNoIQorICogTlRPRkQgKD4mZmRudW0pIHVzZXMgbmR1cCBzdHJ1Y3R1cmUsIGJ1dCB3ZSBtYXkgZGlzY292ZXIgbWlkLWZsaWdodAorICogdGhhdCBpdCBpcyBhY3R1YWxseSBOVE8yICg+JmZpbGUpLCBhbmQgY2hhbmdlIGl0cyB0eXBlLgorICovCitzdHJ1Y3QgbmZpbGUgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqbmV4dDsKKwlpbnQgZmQ7CisJaW50IF91bnVzZWRfZHVwZmQ7CisJdW5pb24gbm9kZSAqZm5hbWU7CisJY2hhciAqZXhwZm5hbWU7Cit9OworCitzdHJ1Y3QgbmR1cCB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpuZXh0OworCWludCBmZDsKKwlpbnQgZHVwZmQ7CisJdW5pb24gbm9kZSAqdm5hbWU7CisJY2hhciAqX3VudXNlZF9leHBmbmFtZTsKK307CisKK3N0cnVjdCBuaGVyZSB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpuZXh0OworCWludCBmZDsKKwl1bmlvbiBub2RlICpkb2M7Cit9OworCitzdHJ1Y3Qgbm5vdCB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpjb207Cit9OworCit1bmlvbiBub2RlIHsKKwlzbWFsbGludCB0eXBlOworCXN0cnVjdCBuY21kIG5jbWQ7CisJc3RydWN0IG5waXBlIG5waXBlOworCXN0cnVjdCBucmVkaXIgbnJlZGlyOworCXN0cnVjdCBuYmluYXJ5IG5iaW5hcnk7CisJc3RydWN0IG5pZiBuaWY7CisJc3RydWN0IG5mb3IgbmZvcjsKKwlzdHJ1Y3QgbmNhc2UgbmNhc2U7CisJc3RydWN0IG5jbGlzdCBuY2xpc3Q7CisJc3RydWN0IG5hcmcgbmFyZzsKKwlzdHJ1Y3QgbmZpbGUgbmZpbGU7CisJc3RydWN0IG5kdXAgbmR1cDsKKwlzdHJ1Y3QgbmhlcmUgbmhlcmU7CisJc3RydWN0IG5ub3Qgbm5vdDsKK307CisKKy8qCisgKiBOT0RFX0VPRiBpcyByZXR1cm5lZCBieSBwYXJzZWNtZCB3aGVuIGl0IGVuY291bnRlcnMgYW4gZW5kIG9mIGZpbGUuCisgKiBJdCBtdXN0IGJlIGRpc3RpbmN0IGZyb20gTlVMTC4KKyAqLworI2RlZmluZSBOT0RFX0VPRiAoKHVuaW9uIG5vZGUgKikgLTFMKQorCitzdHJ1Y3Qgbm9kZWxpc3QgeworCXN0cnVjdCBub2RlbGlzdCAqbmV4dDsKKwl1bmlvbiBub2RlICpuOworfTsKKworc3RydWN0IGZ1bmNub2RlIHsKKwlpbnQgY291bnQ7CisJdW5pb24gbm9kZSBuOworfTsKKworLyoKKyAqIEZyZWUgYSBwYXJzZSB0cmVlLgorICovCitzdGF0aWMgdm9pZAorZnJlZWZ1bmMoc3RydWN0IGZ1bmNub2RlICpmKQoreworCWlmIChmICYmIC0tZi0+Y291bnQgPCAwKQorCQlmcmVlKGYpOworfQorCisKKy8qID09PT09PT09PT09PSBEZWJ1Z2dpbmcgb3V0cHV0ICovCisKKyNpZiBERUJVRworCitzdGF0aWMgRklMRSAqdHJhY2VmaWxlOworCitzdGF0aWMgdm9pZAordHJhY2VfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCWlmIChERUJVR19USU1FKQorCQlmcHJpbnRmKHRyYWNlZmlsZSwgIiV1ICIsIChpbnQpIHRpbWUoTlVMTCkpOworCWlmIChERUJVR19QSUQpCisJCWZwcmludGYodHJhY2VmaWxlLCAiWyV1XSAiLCAoaW50KSBnZXRwaWQoKSk7CisJaWYgKERFQlVHX1NJRykKKwkJZnByaW50Zih0cmFjZWZpbGUsICJwZW5kaW5nIHM6JWQgaTolZChzdXBwOiVkKSAiLCBwZW5kaW5nX3NpZywgcGVuZGluZ19pbnQsIHN1cHByZXNzX2ludCk7CisJdmFfc3RhcnQodmEsIGZtdCk7CisJdmZwcmludGYodHJhY2VmaWxlLCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworfQorCitzdGF0aWMgdm9pZAordHJhY2VfdnByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEpCit7CisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlpZiAoREVCVUdfVElNRSkKKwkJZnByaW50Zih0cmFjZWZpbGUsICIldSAiLCAoaW50KSB0aW1lKE5VTEwpKTsKKwlpZiAoREVCVUdfUElEKQorCQlmcHJpbnRmKHRyYWNlZmlsZSwgIlsldV0gIiwgKGludCkgZ2V0cGlkKCkpOworCWlmIChERUJVR19TSUcpCisJCWZwcmludGYodHJhY2VmaWxlLCAicGVuZGluZyBzOiVkIGk6JWQoc3VwcDolZCkgIiwgcGVuZGluZ19zaWcsIHBlbmRpbmdfaW50LCBzdXBwcmVzc19pbnQpOworCXZmcHJpbnRmKHRyYWNlZmlsZSwgZm10LCB2YSk7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFjZV9wdXRzKGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlmcHV0cyhzLCB0cmFjZWZpbGUpOworfQorCitzdGF0aWMgdm9pZAordHJhY2VfcHV0c19xdW90ZWQoY2hhciAqcykKK3sKKwljaGFyICpwOworCWNoYXIgYzsKKworCWlmIChkZWJ1ZyAhPSAxKQorCQlyZXR1cm47CisJcHV0YygnIicsIHRyYWNlZmlsZSk7CisJZm9yIChwID0gczsgKnA7IHArKykgeworCQlzd2l0Y2ggKCh1bnNpZ25lZCBjaGFyKSpwKSB7CisJCWNhc2UgJ1xuJzogYyA9ICduJzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgJ1x0JzogYyA9ICd0JzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgJ1xyJzogYyA9ICdyJzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgJ1wiJzogYyA9ICdcIic7IGdvdG8gYmFja3NsYXNoOworCQljYXNlICdcXCc6IGMgPSAnXFwnOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExFU0M6IGMgPSAnZSc7IGdvdG8gYmFja3NsYXNoOworCQljYXNlIENUTFZBUjogYyA9ICd2JzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgQ1RMVkFSK0NUTFFVT1RFOiBjID0gJ1YnOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExCQUNLUTogYyA9ICdxJzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgQ1RMQkFDS1ErQ1RMUVVPVEU6IGMgPSAnUSc7IGdvdG8gYmFja3NsYXNoOworIGJhY2tzbGFzaDoKKwkJCXB1dGMoJ1xcJywgdHJhY2VmaWxlKTsKKwkJCXB1dGMoYywgdHJhY2VmaWxlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKCpwID49ICcgJyAmJiAqcCA8PSAnficpCisJCQkJcHV0YygqcCwgdHJhY2VmaWxlKTsKKwkJCWVsc2UgeworCQkJCXB1dGMoJ1xcJywgdHJhY2VmaWxlKTsKKwkJCQlwdXRjKCgqcCA+PiA2KSAmIDAzLCB0cmFjZWZpbGUpOworCQkJCXB1dGMoKCpwID4+IDMpICYgMDcsIHRyYWNlZmlsZSk7CisJCQkJcHV0YygqcCAmIDA3LCB0cmFjZWZpbGUpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcHV0YygnIicsIHRyYWNlZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFjZV9wdXRzX2FyZ3MoY2hhciAqKmFwKQoreworCWlmIChkZWJ1ZyAhPSAxKQorCQlyZXR1cm47CisJaWYgKCEqYXApCisJCXJldHVybjsKKwl3aGlsZSAoMSkgeworCQl0cmFjZV9wdXRzX3F1b3RlZCgqYXApOworCQlpZiAoISorK2FwKSB7CisJCQlwdXRjKCdcbicsIHRyYWNlZmlsZSk7CisJCQlicmVhazsKKwkJfQorCQlwdXRjKCcgJywgdHJhY2VmaWxlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitvcGVudHJhY2Uodm9pZCkKK3sKKwljaGFyIHNbMTAwXTsKKyNpZmRlZiBPX0FQUEVORAorCWludCBmbGFnczsKKyNlbmRpZgorCisJaWYgKGRlYnVnICE9IDEpIHsKKwkJaWYgKHRyYWNlZmlsZSkKKwkJCWZmbHVzaCh0cmFjZWZpbGUpOworCQkvKiBsZWF2ZSBvcGVuIGJlY2F1c2UgbGliZWRpdCBtaWdodCBiZSB1c2luZyBpdCAqLworCQlyZXR1cm47CisJfQorCXN0cmNweShzLCAiLi90cmFjZSIpOworCWlmICh0cmFjZWZpbGUpIHsKKwkJaWYgKCFmcmVvcGVuKHMsICJhIiwgdHJhY2VmaWxlKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW4ndCByZS1vcGVuICVzXG4iLCBzKTsKKwkJCWRlYnVnID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCXRyYWNlZmlsZSA9IGZvcGVuKHMsICJhIik7CisJCWlmICh0cmFjZWZpbGUgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuICVzXG4iLCBzKTsKKwkJCWRlYnVnID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNpZmRlZiBPX0FQUEVORAorCWZsYWdzID0gZmNudGwoZmlsZW5vKHRyYWNlZmlsZSksIEZfR0VURkwpOworCWlmIChmbGFncyA+PSAwKQorCQlmY250bChmaWxlbm8odHJhY2VmaWxlKSwgRl9TRVRGTCwgZmxhZ3MgfCBPX0FQUEVORCk7CisjZW5kaWYKKwlzZXRsaW5lYnVmKHRyYWNlZmlsZSk7CisJZnB1dHMoIlxuVHJhY2luZyBzdGFydGVkLlxuIiwgdHJhY2VmaWxlKTsKK30KKworc3RhdGljIHZvaWQKK2luZGVudChpbnQgYW1vdW50LCBjaGFyICpwZngsIEZJTEUgKmZwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFtb3VudDsgaSsrKSB7CisJCWlmIChwZnggJiYgaSA9PSBhbW91bnQgLSAxKQorCQkJZnB1dHMocGZ4LCBmcCk7CisJCXB1dGMoJ1x0JywgZnApOworCX0KK30KKworLyogbGl0dGxlIGNpcmN1bGFyIHJlZmVyZW5jZXMgaGVyZS4uLiAqLworc3RhdGljIHZvaWQgc2h0cmVlKHVuaW9uIG5vZGUgKm4sIGludCBpbmQsIGNoYXIgKnBmeCwgRklMRSAqZnApOworCitzdGF0aWMgdm9pZAorc2hhcmcodW5pb24gbm9kZSAqYXJnLCBGSUxFICpmcCkKK3sKKwljaGFyICpwOworCXN0cnVjdCBub2RlbGlzdCAqYnFsaXN0OworCXVuc2lnbmVkIGNoYXIgc3VidHlwZTsKKworCWlmIChhcmctPnR5cGUgIT0gTkFSRykgeworCQlvdXQxZm10KCI8bm9kZSB0eXBlICVkPlxuIiwgYXJnLT50eXBlKTsKKwkJYWJvcnQoKTsKKwl9CisJYnFsaXN0ID0gYXJnLT5uYXJnLmJhY2txdW90ZTsKKwlmb3IgKHAgPSBhcmctPm5hcmcudGV4dDsgKnA7IHArKykgeworCQlzd2l0Y2ggKCh1bnNpZ25lZCBjaGFyKSpwKSB7CisJCWNhc2UgQ1RMRVNDOgorCQkJcCsrOworCQkJcHV0YygqcCwgZnApOworCQkJYnJlYWs7CisJCWNhc2UgQ1RMVkFSOgorCQkJcHV0YygnJCcsIGZwKTsKKwkJCXB1dGMoJ3snLCBmcCk7CisJCQlzdWJ0eXBlID0gKisrcDsKKwkJCWlmIChzdWJ0eXBlID09IFZTTEVOR1RIKQorCQkJCXB1dGMoJyMnLCBmcCk7CisKKwkJCXdoaWxlICgqcCAhPSAnPScpIHsKKwkJCQlwdXRjKCpwLCBmcCk7CisJCQkJcCsrOworCQkJfQorCisJCQlpZiAoc3VidHlwZSAmIFZTTlVMKQorCQkJCXB1dGMoJzonLCBmcCk7CisKKwkJCXN3aXRjaCAoc3VidHlwZSAmIFZTVFlQRSkgeworCQkJY2FzZSBWU05PUk1BTDoKKwkJCQlwdXRjKCd9JywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU01JTlVTOgorCQkJCXB1dGMoJy0nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTUExVUzoKKwkJCQlwdXRjKCcrJywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU1FVRVNUSU9OOgorCQkJCXB1dGMoJz8nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTQVNTSUdOOgorCQkJCXB1dGMoJz0nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTVFJJTUxFRlQ6CisJCQkJcHV0YygnIycsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNTEVGVE1BWDoKKwkJCQlwdXRjKCcjJywgZnApOworCQkJCXB1dGMoJyMnLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTVFJJTVJJR0hUOgorCQkJCXB1dGMoJyUnLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTVFJJTVJJR0hUTUFYOgorCQkJCXB1dGMoJyUnLCBmcCk7CisJCQkJcHV0YygnJScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNMRU5HVEg6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW91dDFmbXQoIjxzdWJ0eXBlICVkPiIsIHN1YnR5cGUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ1RMRU5EVkFSOgorCQkJcHV0YygnfScsIGZwKTsKKwkJCWJyZWFrOworCQljYXNlIENUTEJBQ0tROgorCQljYXNlIENUTEJBQ0tRfENUTFFVT1RFOgorCQkJcHV0YygnJCcsIGZwKTsKKwkJCXB1dGMoJygnLCBmcCk7CisJCQlzaHRyZWUoYnFsaXN0LT5uLCAtMSwgTlVMTCwgZnApOworCQkJcHV0YygnKScsIGZwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHV0YygqcCwgZnApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzaGNtZCh1bmlvbiBub2RlICpjbWQsIEZJTEUgKmZwKQoreworCXVuaW9uIG5vZGUgKm5wOworCWludCBmaXJzdDsKKwljb25zdCBjaGFyICpzOworCWludCBkZnRmZDsKKworCWZpcnN0ID0gMTsKKwlmb3IgKG5wID0gY21kLT5uY21kLmFyZ3M7IG5wOyBucCA9IG5wLT5uYXJnLm5leHQpIHsKKwkJaWYgKCFmaXJzdCkKKwkJCXB1dGMoJyAnLCBmcCk7CisJCXNoYXJnKG5wLCBmcCk7CisJCWZpcnN0ID0gMDsKKwl9CisJZm9yIChucCA9IGNtZC0+bmNtZC5yZWRpcmVjdDsgbnA7IG5wID0gbnAtPm5maWxlLm5leHQpIHsKKwkJaWYgKCFmaXJzdCkKKwkJCXB1dGMoJyAnLCBmcCk7CisJCWRmdGZkID0gMDsKKwkJc3dpdGNoIChucC0+bmZpbGUudHlwZSkgeworCQljYXNlIE5UTzogICAgICBzID0gIj4+IisxOyBkZnRmZCA9IDE7IGJyZWFrOworCQljYXNlIE5DTE9CQkVSOiBzID0gIj58IjsgZGZ0ZmQgPSAxOyBicmVhazsKKwkJY2FzZSBOQVBQRU5EOiAgcyA9ICI+PiI7IGRmdGZkID0gMTsgYnJlYWs7CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQljYXNlIE5UTzI6CisjZW5kaWYKKwkJY2FzZSBOVE9GRDogICAgcyA9ICI+JiI7IGRmdGZkID0gMTsgYnJlYWs7CisJCWNhc2UgTkZST006ICAgIHMgPSAiPCI7IGJyZWFrOworCQljYXNlIE5GUk9NRkQ6ICBzID0gIjwmIjsgYnJlYWs7CisJCWNhc2UgTkZST01UTzogIHMgPSAiPD4iOyBicmVhazsKKwkJZGVmYXVsdDogICAgICAgcyA9ICIqZXJyb3IqIjsgYnJlYWs7CisJCX0KKwkJaWYgKG5wLT5uZmlsZS5mZCAhPSBkZnRmZCkKKwkJCWZwcmludGYoZnAsICIlZCIsIG5wLT5uZmlsZS5mZCk7CisJCWZwdXRzKHMsIGZwKTsKKwkJaWYgKG5wLT5uZmlsZS50eXBlID09IE5UT0ZEIHx8IG5wLT5uZmlsZS50eXBlID09IE5GUk9NRkQpIHsKKwkJCWZwcmludGYoZnAsICIlZCIsIG5wLT5uZHVwLmR1cGZkKTsKKwkJfSBlbHNlIHsKKwkJCXNoYXJnKG5wLT5uZmlsZS5mbmFtZSwgZnApOworCQl9CisJCWZpcnN0ID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzaHRyZWUodW5pb24gbm9kZSAqbiwgaW50IGluZCwgY2hhciAqcGZ4LCBGSUxFICpmcCkKK3sKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmxwOworCWNvbnN0IGNoYXIgKnM7CisKKwlpZiAobiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpbmRlbnQoaW5kLCBwZngsIGZwKTsKKworCWlmIChuID09IE5PREVfRU9GKSB7CisJCWZwdXRzKCI8RU9GPiIsIGZwKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAobi0+dHlwZSkgeworCWNhc2UgTlNFTUk6CisJCXMgPSAiOyAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTkFORDoKKwkJcyA9ICIgJiYgIjsKKwkJZ290byBiaW5vcDsKKwljYXNlIE5PUjoKKwkJcyA9ICIgfHwgIjsKKyBiaW5vcDoKKwkJc2h0cmVlKG4tPm5iaW5hcnkuY2gxLCBpbmQsIE5VTEwsIGZwKTsKKwkJLyogaWYgKGluZCA8IDApICovCisJCQlmcHV0cyhzLCBmcCk7CisJCXNodHJlZShuLT5uYmluYXJ5LmNoMiwgaW5kLCBOVUxMLCBmcCk7CisJCWJyZWFrOworCWNhc2UgTkNNRDoKKwkJc2hjbWQobiwgZnApOworCQlpZiAoaW5kID49IDApCisJCQlwdXRjKCdcbicsIGZwKTsKKwkJYnJlYWs7CisJY2FzZSBOUElQRToKKwkJZm9yIChscCA9IG4tPm5waXBlLmNtZGxpc3Q7IGxwOyBscCA9IGxwLT5uZXh0KSB7CisJCQlzaHRyZWUobHAtPm4sIDAsIE5VTEwsIGZwKTsKKwkJCWlmIChscC0+bmV4dCkKKwkJCQlmcHV0cygiIHwgIiwgZnApOworCQl9CisJCWlmIChuLT5ucGlwZS5waXBlX2JhY2tnbmQpCisJCQlmcHV0cygiICYiLCBmcCk7CisJCWlmIChpbmQgPj0gMCkKKwkJCXB1dGMoJ1xuJywgZnApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKGZwLCAiPG5vZGUgdHlwZSAlZD4iLCBuLT50eXBlKTsKKwkJaWYgKGluZCA+PSAwKQorCQkJcHV0YygnXG4nLCBmcCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK3Nob3d0cmVlKHVuaW9uIG5vZGUgKm4pCit7CisJdHJhY2VfcHV0cygic2hvd3RyZWUgY2FsbGVkXG4iKTsKKwlzaHRyZWUobiwgMSwgTlVMTCwgc3RkZXJyKTsKK30KKworI2VuZGlmIC8qIERFQlVHICovCisKKworLyogPT09PT09PT09PT09IFBhcnNlciBkYXRhICovCisKKy8qCisgKiBhc2hfdm1zZygpIG5lZWRzIHBhcnNlZmlsZS0+ZmQsIGhlbmNlIHBhcnNlZmlsZSBkZWZpbml0aW9uIGlzIG1vdmVkIHVwLgorICovCitzdHJ1Y3Qgc3RybGlzdCB7CisJc3RydWN0IHN0cmxpc3QgKm5leHQ7CisJY2hhciAqdGV4dDsKK307CisKK3N0cnVjdCBhbGlhczsKKworc3RydWN0IHN0cnB1c2ggeworCXN0cnVjdCBzdHJwdXNoICpwcmV2OyAgIC8qIHByZWNlZGluZyBzdHJpbmcgb24gc3RhY2sgKi8KKwljaGFyICpwcmV2X3N0cmluZzsKKwlpbnQgcHJldl9sZWZ0X2luX2xpbmU7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCXN0cnVjdCBhbGlhcyAqYXA7ICAgICAgIC8qIGlmIHB1c2ggd2FzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGlhcyAqLworI2VuZGlmCisJY2hhciAqc3RyaW5nOyAgICAgICAgICAgLyogcmVtZW1iZXIgdGhlIHN0cmluZyBzaW5jZSBpdCBtYXkgY2hhbmdlICovCit9OworCitzdHJ1Y3QgcGFyc2VmaWxlIHsKKwlzdHJ1Y3QgcGFyc2VmaWxlICpwcmV2OyAvKiBwcmVjZWRpbmcgZmlsZSBvbiBzdGFjayAqLworCWludCBsaW5ubzsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbGluZSAqLworCWludCBwZl9mZDsgICAgICAgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciAob3IgLTEgaWYgc3RyaW5nKSAqLworCWludCBsZWZ0X2luX2xpbmU7ICAgICAgIC8qIG51bWJlciBvZiBjaGFycyBsZWZ0IGluIHRoaXMgbGluZSAqLworCWludCBsZWZ0X2luX2J1ZmZlcjsgICAgIC8qIG51bWJlciBvZiBjaGFycyBsZWZ0IGluIHRoaXMgYnVmZmVyIHBhc3QgdGhlIGxpbmUgKi8KKwljaGFyICpuZXh0X3RvX3BnZXRjOyAgICAvKiBuZXh0IGNoYXIgaW4gYnVmZmVyICovCisJY2hhciAqYnVmOyAgICAgICAgICAgICAgLyogaW5wdXQgYnVmZmVyICovCisJc3RydWN0IHN0cnB1c2ggKnN0cnB1c2g7IC8qIGZvciBwdXNoaW5nIHN0cmluZ3MgYXQgdGhpcyBsZXZlbCAqLworCXN0cnVjdCBzdHJwdXNoIGJhc2VzdHJwdXNoOyAvKiBzbyBwdXNoaW5nIG9uZSBpcyBmYXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHBhcnNlZmlsZSBiYXNlcGY7ICAgICAgICAvKiB0b3AgbGV2ZWwgaW5wdXQgZmlsZSAqLworc3RhdGljIHN0cnVjdCBwYXJzZWZpbGUgKmdfcGFyc2VmaWxlID0gJmJhc2VwZjsgIC8qIGN1cnJlbnQgaW5wdXQgZmlsZSAqLworc3RhdGljIGludCBzdGFydGxpbm5vOyAgICAgICAgICAgICAgICAgLyogbGluZSAjIHdoZXJlIGxhc3QgdG9rZW4gc3RhcnRlZCAqLworc3RhdGljIGNoYXIgKmNvbW1hbmRuYW1lOyAgICAgICAgICAgICAgLyogY3VycmVudGx5IGV4ZWN1dGluZyBjb21tYW5kICovCitzdGF0aWMgc3RydWN0IHN0cmxpc3QgKmNtZGVudmlyb247ICAgICAvKiBlbnZpcm9ubWVudCBmb3IgYnVpbHRpbiBjb21tYW5kICovCitzdGF0aWMgdWludDhfdCBleGl0c3RhdHVzOyAgICAgICAgICAgICAvKiBleGl0IHN0YXR1cyBvZiBsYXN0IGNvbW1hbmQgKi8KKworCisvKiA9PT09PT09PT09PT0gTWVzc2FnZSBwcmludGluZyAqLworCitzdGF0aWMgdm9pZAorYXNoX3Ztc2coY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IGFwKQoreworCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIGFyZzApOworCWlmIChjb21tYW5kbmFtZSkgeworCQlpZiAoc3RyY21wKGFyZzAsIGNvbW1hbmRuYW1lKSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIGNvbW1hbmRuYW1lKTsKKwkJaWYgKCFpZmxhZyB8fCBnX3BhcnNlZmlsZS0+cGZfZmQgPiAwKQorCQkJZnByaW50ZihzdGRlcnIsICJsaW5lICVkOiAiLCBzdGFydGxpbm5vKTsKKwl9CisJdmZwcmludGYoc3RkZXJyLCBtc2csIGFwKTsKKwlvdXRjc2xvdygnXG4nLCBzdGRlcnIpOworfQorCisvKgorICogRXh2ZXJyb3IgaXMgY2FsbGVkIHRvIHJhaXNlIHRoZSBlcnJvciBleGNlcHRpb24uICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50CisgKiBpcyBub3QgTlVMTCB0aGVuIGVycm9yIHByaW50cyBhbiBlcnJvciBtZXNzYWdlIHVzaW5nIHByaW50ZiBzdHlsZQorICogZm9ybWF0dGluZy4gIEl0IHRoZW4gcmFpc2VzIHRoZSBlcnJvciBleGNlcHRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGFzaF92bXNnX2FuZF9yYWlzZShpbnQsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZAorYXNoX3Ztc2dfYW5kX3JhaXNlKGludCBjb25kLCBjb25zdCBjaGFyICptc2csIHZhX2xpc3QgYXApCit7CisjaWYgREVCVUcKKwlpZiAobXNnKSB7CisJCVRSQUNFKCgiYXNoX3Ztc2dfYW5kX3JhaXNlKCVkLCBcIiIsIGNvbmQpKTsKKwkJVFJBQ0VWKChtc2csIGFwKSk7CisJCVRSQUNFKCgiXCIpIHBpZD0lZFxuIiwgZ2V0cGlkKCkpKTsKKwl9IGVsc2UKKwkJVFJBQ0UoKCJhc2hfdm1zZ19hbmRfcmFpc2UoJWQsIE5VTEwpIHBpZD0lZFxuIiwgY29uZCwgZ2V0cGlkKCkpKTsKKwlpZiAobXNnKQorI2VuZGlmCisJCWFzaF92bXNnKG1zZywgYXApOworCisJZmx1c2hfc3Rkb3V0X3N0ZGVycigpOworCXJhaXNlX2V4Y2VwdGlvbihjb25kKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkIGFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGNvbnN0IGNoYXIgKiwgLi4uKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCithc2hfbXNnX2FuZF9yYWlzZV9lcnJvcihjb25zdCBjaGFyICptc2csIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisJYXNoX3Ztc2dfYW5kX3JhaXNlKEVYRVJST1IsIG1zZywgYXApOworCS8qIE5PVFJFQUNIRUQgKi8KKwl2YV9lbmQoYXApOworfQorCitzdGF0aWMgdm9pZCByYWlzZV9lcnJvcl9zeW50YXgoY29uc3QgY2hhciAqKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCityYWlzZV9lcnJvcl9zeW50YXgoY29uc3QgY2hhciAqbXNnKQoreworCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJzeW50YXggZXJyb3I6ICVzIiwgbXNnKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkIGFzaF9tc2dfYW5kX3JhaXNlKGludCwgY29uc3QgY2hhciAqLCAuLi4pIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK2FzaF9tc2dfYW5kX3JhaXNlKGludCBjb25kLCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisJYXNoX3Ztc2dfYW5kX3JhaXNlKGNvbmQsIG1zZywgYXApOworCS8qIE5PVFJFQUNIRUQgKi8KKwl2YV9lbmQoYXApOworfQorCisvKgorICogZXJyb3Ivd2FybmluZyByb3V0aW5lcyBmb3IgZXh0ZXJuYWwgYnVpbHRpbnMKKyAqLworc3RhdGljIHZvaWQKK2FzaF9tc2coY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWFzaF92bXNnKGZtdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyBhbiBlcnJvci4gIFRoZSByZXR1cm5lZCBzdHJpbmcgbWF5IGJlIGEKKyAqIHBvaW50ZXIgdG8gYSBzdGF0aWMgYnVmZmVyIHRoYXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCBjYWxsLgorICogQWN0aW9uIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9uIHRoYXQgZ290IHRoZSBlcnJvci4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorZXJybXNnKGludCBlLCBjb25zdCBjaGFyICplbSkKK3sKKwlpZiAoZSA9PSBFTk9FTlQgfHwgZSA9PSBFTk9URElSKSB7CisJCXJldHVybiBlbTsKKwl9CisJcmV0dXJuIHN0cmVycm9yKGUpOworfQorCisKKy8qID09PT09PT09PT09PSBNZW1vcnkgYWxsb2NhdGlvbiAqLworCisjaWYgMAorLyogSSBjb25zaWRlciB0aGVzZSB3cmFwcGVycyBuZWFybHkgdXNlbGVzczoKKyAqIG9rLCB0aGV5IHJldHVybiB5b3UgdG8gbmVhcmVzdCBleGNlcHRpb24gaGFuZGxlciwgYnV0CisgKiBob3cgbXVjaCBtZW1vcnkgZG8geW91IGxlYWsgaW4gdGhlIHByb2Nlc3MsIG1ha2luZworICogbWVtb3J5IHN0YXJ2YXRpb24gd29yc2U/CisgKi8KK3N0YXRpYyB2b2lkICoKK2NrcmVhbGxvYyh2b2lkICogcCwgc2l6ZV90IG5ieXRlcykKK3sKKwlwID0gcmVhbGxvYyhwLCBuYnl0ZXMpOworCWlmICghcCkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCAqCitja21hbGxvYyhzaXplX3QgbmJ5dGVzKQoreworCXJldHVybiBja3JlYWxsb2MoTlVMTCwgbmJ5dGVzKTsKK30KKworc3RhdGljIHZvaWQgKgorY2t6YWxsb2Moc2l6ZV90IG5ieXRlcykKK3sKKwlyZXR1cm4gbWVtc2V0KGNrbWFsbG9jKG5ieXRlcyksIDAsIG5ieXRlcyk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2Nrc3RyZHVwKGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAqcCA9IHN0cmR1cChzKTsKKwlpZiAoIXApCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwlyZXR1cm4gcDsKK30KKyNlbHNlCisvKiBVc2luZyBiYm94IGVxdWl2YWxlbnRzLiBUaGV5IGV4aXQgaWYgb3V0IG9mIG1lbW9yeSAqLworIyBkZWZpbmUgY2tyZWFsbG9jIHhyZWFsbG9jCisjIGRlZmluZSBja21hbGxvYyAgeG1hbGxvYworIyBkZWZpbmUgY2t6YWxsb2MgIHh6YWxsb2MKKyMgZGVmaW5lIGNrc3RyZHVwICB4c3RyZHVwCisjZW5kaWYKKworLyoKKyAqIEl0IGFwcGVhcnMgdGhhdCBncmFic3RhY2tzdHIoKSB3aWxsIGJhcmYgd2l0aCBzdWNoIGFsaWdubWVudHMKKyAqIGJlY2F1c2Ugc3RhbGxvYygpIHdpbGwgcmV0dXJuIGEgc3RyaW5nIGFsbG9jYXRlZCBpbiBhIG5ldyBzdGFja2Jsb2NrLgorICovCisjZGVmaW5lIFNIRUxMX0FMSUdOKG5ieXRlcykgKCgobmJ5dGVzKSArIFNIRUxMX1NJWkUpICYgflNIRUxMX1NJWkUpCitlbnVtIHsKKwkvKiBNb3N0IG1hY2hpbmVzIHJlcXVpcmUgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gbWFsbG9jIHRvIGJlIGFsaWduZWQKKwkgKiBpbiBzb21lIHdheS4gIFRoZSBmb2xsb3dpbmcgbWFjcm8gd2lsbCBnZXQgdGhpcyByaWdodAorCSAqIG9uIG1hbnkgbWFjaGluZXMuICAqLworCVNIRUxMX1NJWkUgPSBzaXplb2YodW5pb24geyBpbnQgaTsgY2hhciAqY3A7IGRvdWJsZSBkOyB9KSAtIDEsCisJLyogTWluaW11bSBzaXplIG9mIGEgYmxvY2sgKi8KKwlNSU5TSVpFID0gU0hFTExfQUxJR04oNTA0KSwKK307CisKK3N0cnVjdCBzdGFja19ibG9jayB7CisJc3RydWN0IHN0YWNrX2Jsb2NrICpwcmV2OworCWNoYXIgc3BhY2VbTUlOU0laRV07Cit9OworCitzdHJ1Y3Qgc3RhY2ttYXJrIHsKKwlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnN0YWNrcDsKKwljaGFyICpzdGFja254dDsKKwlzaXplX3Qgc3RhY2tubGVmdDsKKwlzdHJ1Y3Qgc3RhY2ttYXJrICptYXJrbmV4dDsKK307CisKKworc3RydWN0IGdsb2JhbHNfbWVtc3RhY2sgeworCXN0cnVjdCBzdGFja19ibG9jayAqZ19zdGFja3A7IC8vID0gJnN0YWNrYmFzZTsKKwlzdHJ1Y3Qgc3RhY2ttYXJrICptYXJrcDsKKwljaGFyICpnX3N0YWNrbnh0OyAvLyA9IHN0YWNrYmFzZS5zcGFjZTsKKwljaGFyICpzc3RyZW5kOyAvLyA9IHN0YWNrYmFzZS5zcGFjZSArIE1JTlNJWkU7CisJc2l6ZV90IGdfc3RhY2tubGVmdDsgLy8gPSBNSU5TSVpFOworCWludCAgICBoZXJlZmQ7IC8vID0gLTE7CisJc3RydWN0IHN0YWNrX2Jsb2NrIHN0YWNrYmFzZTsKK307CitleHRlcm4gc3RydWN0IGdsb2JhbHNfbWVtc3RhY2sgKmNvbnN0IGFzaF9wdHJfdG9fZ2xvYmFsc19tZW1zdGFjazsKKyNkZWZpbmUgR19tZW1zdGFjayAoKmFzaF9wdHJfdG9fZ2xvYmFsc19tZW1zdGFjaykKKyNkZWZpbmUgZ19zdGFja3AgICAgIChHX21lbXN0YWNrLmdfc3RhY2twICAgICkKKyNkZWZpbmUgbWFya3AgICAgICAgIChHX21lbXN0YWNrLm1hcmtwICAgICAgICkKKyNkZWZpbmUgZ19zdGFja254dCAgIChHX21lbXN0YWNrLmdfc3RhY2tueHQgICkKKyNkZWZpbmUgc3N0cmVuZCAgICAgIChHX21lbXN0YWNrLnNzdHJlbmQgICAgICkKKyNkZWZpbmUgZ19zdGFja25sZWZ0IChHX21lbXN0YWNrLmdfc3RhY2tubGVmdCkKKyNkZWZpbmUgaGVyZWZkICAgICAgIChHX21lbXN0YWNrLmhlcmVmZCAgICAgICkKKyNkZWZpbmUgc3RhY2tiYXNlICAgIChHX21lbXN0YWNrLnN0YWNrYmFzZSAgICkKKyNkZWZpbmUgSU5JVF9HX21lbXN0YWNrKCkgZG8geyBcCisJKCooc3RydWN0IGdsb2JhbHNfbWVtc3RhY2sqKikmYXNoX3B0cl90b19nbG9iYWxzX21lbXN0YWNrKSA9IHh6YWxsb2Moc2l6ZW9mKEdfbWVtc3RhY2spKTsgXAorCWJhcnJpZXIoKTsgXAorCWdfc3RhY2twID0gJnN0YWNrYmFzZTsgXAorCWdfc3RhY2tueHQgPSBzdGFja2Jhc2Uuc3BhY2U7IFwKKwlnX3N0YWNrbmxlZnQgPSBNSU5TSVpFOyBcCisJc3N0cmVuZCA9IHN0YWNrYmFzZS5zcGFjZSArIE1JTlNJWkU7IFwKKwloZXJlZmQgPSAtMTsgXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIHN0YWNrYmxvY2soKSAgICAgKCh2b2lkICopZ19zdGFja254dCkKKyNkZWZpbmUgc3RhY2tibG9ja3NpemUoKSBnX3N0YWNrbmxlZnQKKworLyoKKyAqIFBhcnNlIHRyZWVzIGZvciBjb21tYW5kcyBhcmUgYWxsb2NhdGVkIGluIGxpZm8gb3JkZXIsIHNvIHdlIHVzZSBhIHN0YWNrCisgKiB0byBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQsIGFuZCBhbHNvIHRvIGF2b2lkIGFsbCBzb3J0cyBvZiBleGNlcHRpb24KKyAqIGhhbmRsaW5nIGNvZGUgdG8gaGFuZGxlIGludGVycnVwdHMgaW4gdGhlIG1pZGRsZSBvZiBhIHBhcnNlLgorICoKKyAqIFRoZSBzaXplIDUwNCB3YXMgY2hvc2VuIGJlY2F1c2UgdGhlIFVsdHJpeCBtYWxsb2MgaGFuZGxlcyB0aGF0IHNpemUKKyAqIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkICoKK3N0YWxsb2Moc2l6ZV90IG5ieXRlcykKK3sKKwljaGFyICpwOworCXNpemVfdCBhbGlnbmVkOworCisJYWxpZ25lZCA9IFNIRUxMX0FMSUdOKG5ieXRlcyk7CisJaWYgKGFsaWduZWQgPiBnX3N0YWNrbmxlZnQpIHsKKwkJc2l6ZV90IGxlbjsKKwkJc2l6ZV90IGJsb2Nrc2l6ZTsKKwkJc3RydWN0IHN0YWNrX2Jsb2NrICpzcDsKKworCQlibG9ja3NpemUgPSBhbGlnbmVkOworCQlpZiAoYmxvY2tzaXplIDwgTUlOU0laRSkKKwkJCWJsb2Nrc2l6ZSA9IE1JTlNJWkU7CisJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc3RhY2tfYmxvY2spIC0gTUlOU0laRSArIGJsb2Nrc2l6ZTsKKwkJaWYgKGxlbiA8IGJsb2Nrc2l6ZSkKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwkJSU5UX09GRjsKKwkJc3AgPSBja21hbGxvYyhsZW4pOworCQlzcC0+cHJldiA9IGdfc3RhY2twOworCQlnX3N0YWNrbnh0ID0gc3AtPnNwYWNlOworCQlnX3N0YWNrbmxlZnQgPSBibG9ja3NpemU7CisJCXNzdHJlbmQgPSBnX3N0YWNrbnh0ICsgYmxvY2tzaXplOworCQlnX3N0YWNrcCA9IHNwOworCQlJTlRfT047CisJfQorCXAgPSBnX3N0YWNrbnh0OworCWdfc3RhY2tueHQgKz0gYWxpZ25lZDsKKwlnX3N0YWNrbmxlZnQgLT0gYWxpZ25lZDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgKgorc3R6YWxsb2Moc2l6ZV90IG5ieXRlcykKK3sKKwlyZXR1cm4gbWVtc2V0KHN0YWxsb2MobmJ5dGVzKSwgMCwgbmJ5dGVzKTsKK30KKworc3RhdGljIHZvaWQKK3N0dW5hbGxvYyh2b2lkICpwKQoreworI2lmIERFQlVHCisJaWYgKCFwIHx8IChnX3N0YWNrbnh0IDwgKGNoYXIgKilwKSB8fCAoKGNoYXIgKilwIDwgZ19zdGFja3AtPnNwYWNlKSkgeworCQl3cml0ZShTVERFUlJfRklMRU5PLCAic3R1bmFsbG9jXG4iLCAxMCk7CisJCWFib3J0KCk7CisJfQorI2VuZGlmCisJZ19zdGFja25sZWZ0ICs9IGdfc3RhY2tueHQgLSAoY2hhciAqKXA7CisJZ19zdGFja254dCA9IHA7Cit9CisKKy8qCisgKiBMaWtlIHN0cmR1cCBidXQgd29ya3Mgd2l0aCB0aGUgYXNoIHN0YWNrLgorICovCitzdGF0aWMgY2hhciAqCitzdHN0cmR1cChjb25zdCBjaGFyICpwKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4ocCkgKyAxOworCXJldHVybiBtZW1jcHkoc3RhbGxvYyhsZW4pLCBwLCBsZW4pOworfQorCitzdGF0aWMgdm9pZAorc2V0c3RhY2ttYXJrKHN0cnVjdCBzdGFja21hcmsgKm1hcmspCit7CisJbWFyay0+c3RhY2twID0gZ19zdGFja3A7CisJbWFyay0+c3RhY2tueHQgPSBnX3N0YWNrbnh0OworCW1hcmstPnN0YWNrbmxlZnQgPSBnX3N0YWNrbmxlZnQ7CisJbWFyay0+bWFya25leHQgPSBtYXJrcDsKKwltYXJrcCA9IG1hcms7Cit9CisKK3N0YXRpYyB2b2lkCitwb3BzdGFja21hcmsoc3RydWN0IHN0YWNrbWFyayAqbWFyaykKK3sKKwlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnNwOworCisJaWYgKCFtYXJrLT5zdGFja3ApCisJCXJldHVybjsKKworCUlOVF9PRkY7CisJbWFya3AgPSBtYXJrLT5tYXJrbmV4dDsKKwl3aGlsZSAoZ19zdGFja3AgIT0gbWFyay0+c3RhY2twKSB7CisJCXNwID0gZ19zdGFja3A7CisJCWdfc3RhY2twID0gc3AtPnByZXY7CisJCWZyZWUoc3ApOworCX0KKwlnX3N0YWNrbnh0ID0gbWFyay0+c3RhY2tueHQ7CisJZ19zdGFja25sZWZ0ID0gbWFyay0+c3RhY2tubGVmdDsKKwlzc3RyZW5kID0gbWFyay0+c3RhY2tueHQgKyBtYXJrLT5zdGFja25sZWZ0OworCUlOVF9PTjsKK30KKworLyoKKyAqIFdoZW4gdGhlIHBhcnNlciByZWFkcyBpbiBhIHN0cmluZywgaXQgd2FudHMgdG8gc3RpY2sgdGhlIHN0cmluZyBvbiB0aGUKKyAqIHN0YWNrIGFuZCBvbmx5IGFkanVzdCB0aGUgc3RhY2sgcG9pbnRlciB3aGVuIGl0IGtub3dzIGhvdyBiaWcgdGhlCisgKiBzdHJpbmcgaXMuICBTdGFja2Jsb2NrIChkZWZpbmVkIGluIHN0YWNrLmgpIHJldHVybnMgYSBwb2ludGVyIHRvIGEgYmxvY2sKKyAqIG9mIHNwYWNlIG9uIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHN0YWNrYmxvY2tsZW4gcmV0dXJucyB0aGUgbGVuZ3RoIG9mCisgKiB0aGlzIGJsb2NrLiAgR3Jvd3N0YWNrYmxvY2sgd2lsbCBncm93IHRoaXMgc3BhY2UgYnkgYXQgbGVhc3Qgb25lIGJ5dGUsCisgKiBwb3NzaWJseSBtb3ZpbmcgaXQgKGxpa2UgcmVhbGxvYykuICBHcmFic3RhY2tibG9jayBhY3R1YWxseSBhbGxvY2F0ZXMgdGhlCisgKiBwYXJ0IG9mIHRoZSBibG9jayB0aGF0IGhhcyBiZWVuIHVzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitncm93c3RhY2tibG9jayh2b2lkKQoreworCXNpemVfdCBuZXdsZW47CisKKwluZXdsZW4gPSBnX3N0YWNrbmxlZnQgKiAyOworCWlmIChuZXdsZW4gPCBnX3N0YWNrbmxlZnQpCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwlpZiAobmV3bGVuIDwgMTI4KQorCQluZXdsZW4gKz0gMTI4OworCisJaWYgKGdfc3RhY2tueHQgPT0gZ19zdGFja3AtPnNwYWNlICYmIGdfc3RhY2twICE9ICZzdGFja2Jhc2UpIHsKKwkJc3RydWN0IHN0YWNrX2Jsb2NrICpvbGRzdGFja3A7CisJCXN0cnVjdCBzdGFja21hcmsgKnhtYXJrOworCQlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnNwOworCQlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnByZXZzdGFja3A7CisJCXNpemVfdCBncm9zc2xlbjsKKworCQlJTlRfT0ZGOworCQlvbGRzdGFja3AgPSBnX3N0YWNrcDsKKwkJc3AgPSBnX3N0YWNrcDsKKwkJcHJldnN0YWNrcCA9IHNwLT5wcmV2OworCQlncm9zc2xlbiA9IG5ld2xlbiArIHNpemVvZihzdHJ1Y3Qgc3RhY2tfYmxvY2spIC0gTUlOU0laRTsKKwkJc3AgPSBja3JlYWxsb2Moc3AsIGdyb3NzbGVuKTsKKwkJc3AtPnByZXYgPSBwcmV2c3RhY2twOworCQlnX3N0YWNrcCA9IHNwOworCQlnX3N0YWNrbnh0ID0gc3AtPnNwYWNlOworCQlnX3N0YWNrbmxlZnQgPSBuZXdsZW47CisJCXNzdHJlbmQgPSBzcC0+c3BhY2UgKyBuZXdsZW47CisKKwkJLyoKKwkJICogU3RhY2sgbWFya3MgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvbGQgYmxvY2sKKwkJICogbXVzdCBiZSByZWxvY2F0ZWQgdG8gcG9pbnQgdG8gdGhlIG5ldyBibG9jaworCQkgKi8KKwkJeG1hcmsgPSBtYXJrcDsKKwkJd2hpbGUgKHhtYXJrICE9IE5VTEwgJiYgeG1hcmstPnN0YWNrcCA9PSBvbGRzdGFja3ApIHsKKwkJCXhtYXJrLT5zdGFja3AgPSBnX3N0YWNrcDsKKwkJCXhtYXJrLT5zdGFja254dCA9IGdfc3RhY2tueHQ7CisJCQl4bWFyay0+c3RhY2tubGVmdCA9IGdfc3RhY2tubGVmdDsKKwkJCXhtYXJrID0geG1hcmstPm1hcmtuZXh0OworCQl9CisJCUlOVF9PTjsKKwl9IGVsc2UgeworCQljaGFyICpvbGRzcGFjZSA9IGdfc3RhY2tueHQ7CisJCXNpemVfdCBvbGRsZW4gPSBnX3N0YWNrbmxlZnQ7CisJCWNoYXIgKnAgPSBzdGFsbG9jKG5ld2xlbik7CisKKwkJLyogZnJlZSB0aGUgc3BhY2Ugd2UganVzdCBhbGxvY2F0ZWQgKi8KKwkJZ19zdGFja254dCA9IG1lbWNweShwLCBvbGRzcGFjZSwgb2xkbGVuKTsKKwkJZ19zdGFja25sZWZ0ICs9IG5ld2xlbjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitncmFic3RhY2tibG9jayhzaXplX3QgbGVuKQoreworCWxlbiA9IFNIRUxMX0FMSUdOKGxlbik7CisJZ19zdGFja254dCArPSBsZW47CisJZ19zdGFja25sZWZ0IC09IGxlbjsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHNvbWV3aGF0IGVhc2llciB0byB1c2UgdGhhbiB0aGUgYWJvdmUuCisgKiBUaGUgdXNlciBkZWNsYXJlcyBhIHZhcmlhYmxlIG9mIHR5cGUgU1RBQ0tTVFIsIHdoaWNoIG1heSBiZSBkZWNsYXJlZAorICogdG8gYmUgYSByZWdpc3Rlci4gIFRoZSBtYWNybyBTVEFSVFNUQUNLU1RSIGluaXRpYWxpemVzIHRoaW5ncy4gIFRoZW4KKyAqIHRoZSB1c2VyIHVzZXMgdGhlIG1hY3JvIFNUUFVUQyB0byBhZGQgY2hhcmFjdGVycyB0byB0aGUgc3RyaW5nLiAgSW4KKyAqIGVmZmVjdCwgU1RQVVRDKGMsIHApIGlzIHRoZSBzYW1lIGFzICpwKysgPSBjIGV4Y2VwdCB0aGF0IHRoZSBzdGFjayBpcworICogZ3Jvd24gYXMgbmVjZXNzYXJ5LiAgV2hlbiB0aGUgdXNlciBpcyBkb25lLCBzaGUgY2FuIGp1c3QgbGVhdmUgdGhlCisgKiBzdHJpbmcgdGhlcmUgYW5kIHJlZmVyIHRvIGl0IHVzaW5nIHN0YWNrYmxvY2soKS4gIE9yIHNoZSBjYW4gYWxsb2NhdGUKKyAqIHRoZSBzcGFjZSBmb3IgaXQgdXNpbmcgZ3JhYnN0YWNrc3RyKCkuICBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gYWxsb3cKKyAqIHNvbWVvbmUgZWxzZSB0byB1c2UgdGhlIHN0YWNrIHRlbXBvcmFyaWx5IGFuZCB0aGVuIGNvbnRpbnVlIHRvIGdyb3cKKyAqIHRoZSBzdHJpbmcsIHRoZSB1c2VyIHNob3VsZCB1c2UgZ3JhYnN0YWNrIHRvIGFsbG9jYXRlIHRoZSBzcGFjZSwgYW5kCisgKiB0aGVuIGNhbGwgdW5ncmFic3RyKHApIHRvIHJldHVybiB0byB0aGUgcHJldmlvdXMgbW9kZSBvZiBvcGVyYXRpb24uCisgKgorICogVVNUUFVUQyBpcyBsaWtlIFNUUFVUQyBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGNoZWNrIGZvciBvdmVyZmxvdy4KKyAqIENIRUNLU1RBQ0tTUEFDRSBjYW4gYmUgY2FsbGVkIGJlZm9yZSBVU1RQVVRDIHRvIGVuc3VyZSB0aGF0IHRoZXJlCisgKiBpcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIGNoYXJhY3Rlci4KKyAqLworc3RhdGljIHZvaWQgKgorZ3Jvd3N0YWNrc3RyKHZvaWQpCit7CisJc2l6ZV90IGxlbiA9IHN0YWNrYmxvY2tzaXplKCk7CisJaWYgKGhlcmVmZCA+PSAwICYmIGxlbiA+PSAxMDI0KSB7CisJCWZ1bGxfd3JpdGUoaGVyZWZkLCBzdGFja2Jsb2NrKCksIGxlbik7CisJCXJldHVybiBzdGFja2Jsb2NrKCk7CisJfQorCWdyb3dzdGFja2Jsb2NrKCk7CisJcmV0dXJuIChjaGFyICopc3RhY2tibG9jaygpICsgbGVuOworfQorCisvKgorICogQ2FsbGVkIGZyb20gQ0hFQ0tTVFJTUEFDRS4KKyAqLworc3RhdGljIGNoYXIgKgorbWFrZXN0cnNwYWNlKHNpemVfdCBuZXdsZW4sIGNoYXIgKnApCit7CisJc2l6ZV90IGxlbiA9IHAgLSBnX3N0YWNrbnh0OworCXNpemVfdCBzaXplID0gc3RhY2tibG9ja3NpemUoKTsKKworCWZvciAoOzspIHsKKwkJc2l6ZV90IG5sZWZ0OworCisJCXNpemUgPSBzdGFja2Jsb2Nrc2l6ZSgpOworCQlubGVmdCA9IHNpemUgLSBsZW47CisJCWlmIChubGVmdCA+PSBuZXdsZW4pCisJCQlicmVhazsKKwkJZ3Jvd3N0YWNrYmxvY2soKTsKKwl9CisJcmV0dXJuIChjaGFyICopc3RhY2tibG9jaygpICsgbGVuOworfQorCitzdGF0aWMgY2hhciAqCitzdGFja19ucHV0c3RyKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuLCBjaGFyICpwKQoreworCXAgPSBtYWtlc3Ryc3BhY2UobiwgcCk7CisJcCA9IChjaGFyICopbWVtY3B5KHAsIHMsIG4pICsgbjsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorc3RhY2tfcHV0c3RyKGNvbnN0IGNoYXIgKnMsIGNoYXIgKnApCit7CisJcmV0dXJuIHN0YWNrX25wdXRzdHIocywgc3RybGVuKHMpLCBwKTsKK30KKworc3RhdGljIGNoYXIgKgorX1NUUFVUQyhpbnQgYywgY2hhciAqcCkKK3sKKwlpZiAocCA9PSBzc3RyZW5kKQorCQlwID0gZ3Jvd3N0YWNrc3RyKCk7CisJKnArKyA9IGM7CisJcmV0dXJuIHA7Cit9CisKKyNkZWZpbmUgU1RBUlRTVEFDS1NUUihwKSAgICAgICAgKChwKSA9IHN0YWNrYmxvY2soKSkKKyNkZWZpbmUgU1RQVVRDKGMsIHApICAgICAgICAgICAgKChwKSA9IF9TVFBVVEMoKGMpLCAocCkpKQorI2RlZmluZSBDSEVDS1NUUlNQQUNFKG4sIHApIGRvIHsgXAorCWNoYXIgKnEgPSAocCk7IFwKKwlzaXplX3QgbCA9IChuKTsgXAorCXNpemVfdCBtID0gc3N0cmVuZCAtIHE7IFwKKwlpZiAobCA+IG0pIFwKKwkJKHApID0gbWFrZXN0cnNwYWNlKGwsIHEpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBVU1RQVVRDKGMsIHApICAgICAgICAgICAoKihwKSsrID0gKGMpKQorI2RlZmluZSBTVEFDS1NUUk5VTChwKSBkbyB7IFwKKwlpZiAoKHApID09IHNzdHJlbmQpIFwKKwkJKHApID0gZ3Jvd3N0YWNrc3RyKCk7IFwKKwkqKHApID0gJ1wwJzsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1RVTlBVVEMocCkgICAgICAgICAgICAgKC0tKHApKQorI2RlZmluZSBTVFRPUEMocCkgICAgICAgICAgICAgICAoKHApWy0xXSkKKyNkZWZpbmUgU1RBREpVU1QoYW1vdW50LCBwKSAgICAgKChwKSArPSAoYW1vdW50KSkKKworI2RlZmluZSBncmFic3RhY2tzdHIocCkgICAgICAgICBzdGFsbG9jKChjaGFyICopKHApIC0gKGNoYXIgKilzdGFja2Jsb2NrKCkpCisjZGVmaW5lIHVuZ3JhYnN0YWNrc3RyKHMsIHApICAgIHN0dW5hbGxvYyhzKQorI2RlZmluZSBzdGFja3N0cmVuZCgpICAgICAgICAgICAoKHZvaWQgKilzc3RyZW5kKQorCisKKy8qID09PT09PT09PT09PSBTdHJpbmcgaGVscGVycyAqLworCisvKgorICogcHJlZml4IC0tIHNlZSBpZiBwZnggaXMgYSBwcmVmaXggb2Ygc3RyaW5nLgorICovCitzdGF0aWMgY2hhciAqCitwcmVmaXgoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpwZngpCit7CisJd2hpbGUgKCpwZngpIHsKKwkJaWYgKCpwZngrKyAhPSAqc3RyaW5nKyspCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIChjaGFyICopIHN0cmluZzsKK30KKworLyoKKyAqIENoZWNrIGZvciBhIHZhbGlkIG51bWJlci4gIFRoaXMgc2hvdWxkIGJlIGVsc2V3aGVyZS4KKyAqLworc3RhdGljIGludAoraXNfbnVtYmVyKGNvbnN0IGNoYXIgKnApCit7CisJZG8geworCQlpZiAoIWlzZGlnaXQoKnApKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAoKisrcCAhPSAnXDAnKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgb2YgZGlnaXRzIHRvIGFuIGludGVnZXIsIHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2Ugb24KKyAqIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK251bWJlcihjb25zdCBjaGFyICpzKQoreworCWlmICghaXNfbnVtYmVyKHMpKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcihtc2dfaWxsbnVtLCBzKTsKKwlyZXR1cm4gYXRvaShzKTsKK30KKworLyoKKyAqIFByb2R1Y2UgYSBwb3NzaWJseSBzaW5nbGUgcXVvdGVkIHN0cmluZyBzdWl0YWJsZSBhcyBpbnB1dCB0byB0aGUgc2hlbGwuCisgKiBUaGUgcmV0dXJuIHN0cmluZyBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorICovCitzdGF0aWMgY2hhciAqCitzaW5nbGVfcXVvdGUoY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpwOworCisJU1RBUlRTVEFDS1NUUihwKTsKKworCWRvIHsKKwkJY2hhciAqcTsKKwkJc2l6ZV90IGxlbjsKKworCQlsZW4gPSBzdHJjaHJudWwocywgJ1wnJykgLSBzOworCisJCXEgPSBwID0gbWFrZXN0cnNwYWNlKGxlbiArIDMsIHApOworCisJCSpxKysgPSAnXCcnOworCQlxID0gKGNoYXIgKiltZW1jcHkocSwgcywgbGVuKSArIGxlbjsKKwkJKnErKyA9ICdcJyc7CisJCXMgKz0gbGVuOworCisJCVNUQURKVVNUKHEgLSBwLCBwKTsKKworCQlpZiAoKnMgIT0gJ1wnJykKKwkJCWJyZWFrOworCQlsZW4gPSAwOworCQlkbyBsZW4rKzsgd2hpbGUgKCorK3MgPT0gJ1wnJyk7CisKKwkJcSA9IHAgPSBtYWtlc3Ryc3BhY2UobGVuICsgMywgcCk7CisKKwkJKnErKyA9ICciJzsKKwkJcSA9IChjaGFyICopbWVtY3B5KHEsIHMgLSBsZW4sIGxlbikgKyBsZW47CisJCSpxKysgPSAnIic7CisKKwkJU1RBREpVU1QocSAtIHAsIHApOworCX0gd2hpbGUgKCpzKTsKKworCVVTVFBVVEMoJ1wwJywgcCk7CisKKwlyZXR1cm4gc3RhY2tibG9jaygpOworfQorCisKKy8qID09PT09PT09PT09PSBuZXh0b3B0ICovCisKK3N0YXRpYyBjaGFyICoqYXJncHRyOyAgICAgICAgICAgICAgICAgIC8qIGFyZ3VtZW50IGxpc3QgZm9yIGJ1aWx0aW4gY29tbWFuZHMgKi8KK3N0YXRpYyBjaGFyICpvcHRpb25hcmc7ICAgICAgICAgICAgICAgIC8qIHNldCBieSBuZXh0b3B0IChsaWtlIGdldG9wdCkgKi8KK3N0YXRpYyBjaGFyICpvcHRwdHI7ICAgICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgbmV4dG9wdCAqLworCisvKgorICogWFhYIC0gc2hvdWxkIGdldCByaWQgb2YuIEhhdmUgYWxsIGJ1aWx0aW5zIHVzZSBnZXRvcHQoMykuCisgKiBUaGUgbGlicmFyeSBnZXRvcHQgbXVzdCBoYXZlIHRoZSBCU0QgZXh0ZW5zaW9uIHN0YXRpYyB2YXJpYWJsZQorICogIm9wdHJlc2V0Iiwgb3RoZXJ3aXNlIGl0IGNhbid0IGJlIHVzZWQgd2l0aGluIHRoZSBzaGVsbCBzYWZlbHkuCisgKgorICogU3RhbmRhcmQgb3B0aW9uIHByb2Nlc3NpbmcgKGEgbGEgZ2V0b3B0KSBmb3IgYnVpbHRpbiByb3V0aW5lcy4KKyAqIFRoZSBvbmx5IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIG5leHRvcHQgaXMgdGhlIG9wdGlvbiBzdHJpbmc7CisgKiB0aGUgb3RoZXIgYXJndW1lbnRzIGFyZSB1bm5lY2Vzc2FyeS4gSXQgcmV0dXJucyB0aGUgY2hhcmFjdGVyLAorICogb3IgJ1wwJyBvbiBlbmQgb2YgaW5wdXQuCisgKi8KK3N0YXRpYyBpbnQKK25leHRvcHQoY29uc3QgY2hhciAqb3B0c3RyaW5nKQoreworCWNoYXIgKnA7CisJY29uc3QgY2hhciAqcTsKKwljaGFyIGM7CisKKwlwID0gb3B0cHRyOworCWlmIChwID09IE5VTEwgfHwgKnAgPT0gJ1wwJykgeworCQkvKiBXZSBhdGUgZW50aXJlICItcGFyYW0iLCB0YWtlIG5leHQgb25lICovCisJCXAgPSAqYXJncHRyOworCQlpZiAocCA9PSBOVUxMKQorCQkJcmV0dXJuICdcMCc7CisJCWlmICgqcCAhPSAnLScpCisJCQlyZXR1cm4gJ1wwJzsKKwkJaWYgKCorK3AgPT0gJ1wwJykgLyoganVzdCAiLSIgPyAqLworCQkJcmV0dXJuICdcMCc7CisJCWFyZ3B0cisrOworCQlpZiAoTE9ORV9EQVNIKHApKSAvKiAiLS0iID8gKi8KKwkJCXJldHVybiAnXDAnOworCQkvKiBwID0+IG5leHQgIi1wYXJhbSIgKi8KKwl9CisJLyogcCA9PiBzb21lIG9wdGlvbiBjaGFyIGluIHRoZSBtaWRkbGUgb2YgYSAiLXBhcmFtIiAqLworCWMgPSAqcCsrOworCWZvciAocSA9IG9wdHN0cmluZzsgKnEgIT0gYzspIHsKKwkJaWYgKCpxID09ICdcMCcpCisJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiaWxsZWdhbCBvcHRpb24gLSVjIiwgYyk7CisJCWlmICgqKytxID09ICc6JykKKwkJCXErKzsKKwl9CisJaWYgKCorK3EgPT0gJzonKSB7CisJCWlmICgqcCA9PSAnXDAnKSB7CisJCQlwID0gKmFyZ3B0cisrOworCQkJaWYgKHAgPT0gTlVMTCkKKwkJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigibm8gYXJnIGZvciAtJWMgb3B0aW9uIiwgYyk7CisJCX0KKwkJb3B0aW9uYXJnID0gcDsKKwkJcCA9IE5VTEw7CisJfQorCW9wdHB0ciA9IHA7CisJcmV0dXJuIGM7Cit9CisKKworLyogPT09PT09PT09PT09IFNoZWxsIHZhcmlhYmxlcyAqLworCisvKgorICogVGhlIHBhcnNlZmlsZSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgZ2xvYmFsIHZhcmlhYmxlIHBhcnNlZmlsZQorICogY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZmlsZSBiZWluZyByZWFkLgorICovCitzdHJ1Y3Qgc2hwYXJhbSB7CisJaW50IG5wYXJhbTsgICAgICAgICAgICAgLyogIyBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKHdpdGhvdXQgJDApICovCisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCisJaW50IG9wdGluZDsgICAgICAgICAgICAgLyogbmV4dCBwYXJhbWV0ZXIgdG8gYmUgcHJvY2Vzc2VkIGJ5IGdldG9wdHMgKi8KKwlpbnQgb3B0b2ZmOyAgICAgICAgICAgICAvKiB1c2VkIGJ5IGdldG9wdHMgKi8KKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgbWFsbG9jZWQ7IC8qIGlmIHBhcmFtZXRlciBsaXN0IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCAqLworCWNoYXIgKipwOyAgICAgICAgICAgICAgIC8qIHBhcmFtZXRlciBsaXN0ICovCit9OworCisvKgorICogRnJlZSB0aGUgbGlzdCBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlcGFyYW0odm9sYXRpbGUgc3RydWN0IHNocGFyYW0gKnBhcmFtKQoreworCWlmIChwYXJhbS0+bWFsbG9jZWQpIHsKKwkJY2hhciAqKmFwLCAqKmFwMTsKKwkJYXAgPSBhcDEgPSBwYXJhbS0+cDsKKwkJd2hpbGUgKCphcCkKKwkJCWZyZWUoKmFwKyspOworCQlmcmVlKGFwMSk7CisJfQorfQorCisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZ2V0b3B0c3Jlc2V0KGNvbnN0IGNoYXIgKnZhbHVlKTsKKyNlbmRpZgorCitzdHJ1Y3QgdmFyIHsKKwlzdHJ1Y3QgdmFyICpuZXh0OyAgICAgICAgICAgICAgIC8qIG5leHQgZW50cnkgaW4gaGFzaCBsaXN0ICovCisJaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyBhcmUgZGVmaW5lZCBhYm92ZSAqLworCWNvbnN0IGNoYXIgKnZhcl90ZXh0OyAgICAgICAgICAgLyogbmFtZT12YWx1ZSAqLworCXZvaWQgKCp2YXJfZnVuYykoY29uc3QgY2hhciAqKSBGQVNUX0ZVTkM7IC8qIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuICAqLworCQkJCQkvKiB0aGUgdmFyaWFibGUgZ2V0cyBzZXQvdW5zZXQgKi8KK307CisKK3N0cnVjdCBsb2NhbHZhciB7CisJc3RydWN0IGxvY2FsdmFyICpuZXh0OyAgICAgICAgICAvKiBuZXh0IGxvY2FsIHZhcmlhYmxlIGluIGxpc3QgKi8KKwlzdHJ1Y3QgdmFyICp2cDsgICAgICAgICAgICAgICAgIC8qIHRoZSB2YXJpYWJsZSB0aGF0IHdhcyBtYWRlIGxvY2FsICovCisJaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlZCBmbGFncyAqLworCWNvbnN0IGNoYXIgKnRleHQ7ICAgICAgICAgICAgICAgLyogc2F2ZWQgdGV4dCAqLworfTsKKworLyogZmxhZ3MgKi8KKyNkZWZpbmUgVkVYUE9SVCAgICAgICAgIDB4MDEgICAgLyogdmFyaWFibGUgaXMgZXhwb3J0ZWQgKi8KKyNkZWZpbmUgVlJFQURPTkxZICAgICAgIDB4MDIgICAgLyogdmFyaWFibGUgY2Fubm90IGJlIG1vZGlmaWVkICovCisjZGVmaW5lIFZTVFJGSVhFRCAgICAgICAweDA0ICAgIC8qIHZhcmlhYmxlIHN0cnVjdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCAqLworI2RlZmluZSBWVEVYVEZJWEVEICAgICAgMHgwOCAgICAvKiB0ZXh0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCisjZGVmaW5lIFZTVEFDSyAgICAgICAgICAweDEwICAgIC8qIHRleHQgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayAqLworI2RlZmluZSBWVU5TRVQgICAgICAgICAgMHgyMCAgICAvKiB0aGUgdmFyaWFibGUgaXMgbm90IHNldCAqLworI2RlZmluZSBWTk9GVU5DICAgICAgICAgMHg0MCAgICAvKiBkb24ndCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworI2RlZmluZSBWTk9TRVQgICAgICAgICAgMHg4MCAgICAvKiBkbyBub3Qgc2V0IHZhcmlhYmxlIC0ganVzdCByZWFkb25seSB0ZXN0ICovCisjZGVmaW5lIFZOT1NBVkUgICAgICAgICAweDEwMCAgIC8qIHdoZW4gdGV4dCBpcyBvbiB0aGUgaGVhcCBiZWZvcmUgc2V0dmFyZXEgKi8KKyNpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisjIGRlZmluZSBWRFlOQU1JQyAgICAgICAweDIwMCAgIC8qIGR5bmFtaWMgdmFyaWFibGUgKi8KKyNlbHNlCisjIGRlZmluZSBWRFlOQU1JQyAgICAgICAwCisjZW5kaWYKKworCisvKiBOZWVkIHRvIGJlIGJlZm9yZSB2YXJpbml0X2RhdGFbXSAqLworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorc3RhdGljIHZvaWQgRkFTVF9GVU5DCitjaGFuZ2VfbGNfYWxsKGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICh2YWx1ZSAmJiAqdmFsdWUgIT0gJ1wwJykKKwkJc2V0bG9jYWxlKExDX0FMTCwgdmFsdWUpOworfQorc3RhdGljIHZvaWQgRkFTVF9GVU5DCitjaGFuZ2VfbGNfY3R5cGUoY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHZhbHVlICYmICp2YWx1ZSAhPSAnXDAnKQorCQlzZXRsb2NhbGUoTENfQ1RZUEUsIHZhbHVlKTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9BU0hfTUFJTAorc3RhdGljIHZvaWQgY2hrbWFpbCh2b2lkKTsKK3N0YXRpYyB2b2lkIGNoYW5nZW1haWwoY29uc3QgY2hhciAqdmFyX3ZhbHVlKSBGQVNUX0ZVTkM7CisjZWxzZQorIyBkZWZpbmUgY2hrbWFpbCgpICAoKHZvaWQpMCkKKyNlbmRpZgorc3RhdGljIHZvaWQgY2hhbmdlcGF0aChjb25zdCBjaGFyICopIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCitzdGF0aWMgdm9pZCBjaGFuZ2VfcmFuZG9tKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCBmbGFnczsKKwljb25zdCBjaGFyICp2YXJfdGV4dDsKKwl2b2lkICgqdmFyX2Z1bmMpKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DOworfSB2YXJpbml0X2RhdGFbXSA9IHsKKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEICAgICAgICwgZGVmaWZzdmFyICAgLCBOVUxMICAgICAgICAgICAgfSwKKyNpZiBFTkFCTEVfQVNIX01BSUwKKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwgIk1BSUwiICAgICAgLCBjaGFuZ2VtYWlsICAgICAgfSwKKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwgIk1BSUxQQVRIIiAgLCBjaGFuZ2VtYWlsICAgICAgfSwKKyNlbmRpZgorCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCBiYl9QQVRIX3Jvb3RfcGF0aCwgY2hhbmdlcGF0aCB9LAorCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCAiUFMxPSQgIiAgICAsIE5VTEwgICAgICAgICAgICB9LAorCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCAiUFMyPT4gIiAgICAsIE5VTEwgICAgICAgICAgICB9LAorCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCAiUFM0PSsgIiAgICAsIE5VTEwgICAgICAgICAgICB9LAorI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCAiT1BUSU5EPTEiICAsIGdldG9wdHNyZXNldCAgICB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9SQU5ET01fU1VQUE9SVAorCXsgVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VUfFZEWU5BTUlDLCAiUkFORE9NIiwgY2hhbmdlX3JhbmRvbSB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsICJMQ19BTEwiICAgICwgY2hhbmdlX2xjX2FsbCAgIH0sCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsICJMQ19DVFlQRSIgICwgY2hhbmdlX2xjX2N0eXBlIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsICJISVNURklMRSIgICwgTlVMTCAgICAgICAgICAgIH0sCisjZW5kaWYKK307CisKK3N0cnVjdCByZWRpcnRhYjsKKworc3RydWN0IGdsb2JhbHNfdmFyIHsKKwlzdHJ1Y3Qgc2hwYXJhbSBzaGVsbHBhcmFtOyAgICAgIC8qICRAIGN1cnJlbnQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzICovCisJc3RydWN0IHJlZGlydGFiICpyZWRpcmxpc3Q7CisJaW50IGdfbnVsbHJlZGlyczsKKwlpbnQgcHJldmVycm91dF9mZDsgICAvKiBzYXZlIGZkMiBiZWZvcmUgcHJpbnQgZGVidWcgaWYgeGZsYWcgaXMgc2V0LiAqLworCXN0cnVjdCB2YXIgKnZhcnRhYltWVEFCU0laRV07CisJc3RydWN0IHZhciB2YXJpbml0W0FSUkFZX1NJWkUodmFyaW5pdF9kYXRhKV07Cit9OworZXh0ZXJuIHN0cnVjdCBnbG9iYWxzX3ZhciAqY29uc3QgYXNoX3B0cl90b19nbG9iYWxzX3ZhcjsKKyNkZWZpbmUgR192YXIgKCphc2hfcHRyX3RvX2dsb2JhbHNfdmFyKQorI2RlZmluZSBzaGVsbHBhcmFtICAgIChHX3Zhci5zaGVsbHBhcmFtICAgKQorLy8jZGVmaW5lIHJlZGlybGlzdCAgICAgKEdfdmFyLnJlZGlybGlzdCAgICApCisjZGVmaW5lIGdfbnVsbHJlZGlycyAgKEdfdmFyLmdfbnVsbHJlZGlycyApCisjZGVmaW5lIHByZXZlcnJvdXRfZmQgKEdfdmFyLnByZXZlcnJvdXRfZmQpCisjZGVmaW5lIHZhcnRhYiAgICAgICAgKEdfdmFyLnZhcnRhYiAgICAgICApCisjZGVmaW5lIHZhcmluaXQgICAgICAgKEdfdmFyLnZhcmluaXQgICAgICApCisjZGVmaW5lIElOSVRfR192YXIoKSBkbyB7IFwKKwl1bnNpZ25lZCBpOyBcCisJKCooc3RydWN0IGdsb2JhbHNfdmFyKiopJmFzaF9wdHJfdG9fZ2xvYmFsc192YXIpID0geHphbGxvYyhzaXplb2YoR192YXIpKTsgXAorCWJhcnJpZXIoKTsgXAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhcmluaXRfZGF0YSk7IGkrKykgeyBcCisJCXZhcmluaXRbaV0uZmxhZ3MgICAgPSB2YXJpbml0X2RhdGFbaV0uZmxhZ3M7IFwKKwkJdmFyaW5pdFtpXS52YXJfdGV4dCA9IHZhcmluaXRfZGF0YVtpXS52YXJfdGV4dDsgXAorCQl2YXJpbml0W2ldLnZhcl9mdW5jID0gdmFyaW5pdF9kYXRhW2ldLnZhcl9mdW5jOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHZpZnMgICAgICB2YXJpbml0WzBdCisjaWYgRU5BQkxFX0FTSF9NQUlMCisjIGRlZmluZSB2bWFpbCAgICAoJnZpZnMpWzFdCisjIGRlZmluZSB2bXBhdGggICAoJnZtYWlsKVsxXQorIyBkZWZpbmUgdnBhdGggICAgKCZ2bXBhdGgpWzFdCisjZWxzZQorIyBkZWZpbmUgdnBhdGggICAgKCZ2aWZzKVsxXQorI2VuZGlmCisjZGVmaW5lIHZwczEgICAgICAoJnZwYXRoKVsxXQorI2RlZmluZSB2cHMyICAgICAgKCZ2cHMxKVsxXQorI2RlZmluZSB2cHM0ICAgICAgKCZ2cHMyKVsxXQorI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworIyBkZWZpbmUgdm9wdGluZCAgKCZ2cHM0KVsxXQorIyBpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisjICBkZWZpbmUgdnJhbmRvbSAoJnZvcHRpbmQpWzFdCisjIGVuZGlmCisjZWxzZQorIyBpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisjICBkZWZpbmUgdnJhbmRvbSAoJnZwczQpWzFdCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFjY2VzcyB0aGUgdmFsdWVzIG9mIHRoZSBhYm92ZSB2YXJpYWJsZXMuCisgKiBUaGV5IGhhdmUgdG8gc2tpcCBvdmVyIHRoZSBuYW1lLiAgVGhleSByZXR1cm4gdGhlIG51bGwgc3RyaW5nCisgKiBmb3IgdW5zZXQgdmFyaWFibGVzLgorICovCisjZGVmaW5lIGlmc3ZhbCgpICAgICAgICAodmlmcy52YXJfdGV4dCArIDQpCisjZGVmaW5lIGlmc3NldCgpICAgICAgICAoKHZpZnMuZmxhZ3MgJiBWVU5TRVQpID09IDApCisjaWYgRU5BQkxFX0FTSF9NQUlMCisjIGRlZmluZSBtYWlsdmFsKCkgICAgICAodm1haWwudmFyX3RleHQgKyA1KQorIyBkZWZpbmUgbXBhdGh2YWwoKSAgICAgKHZtcGF0aC52YXJfdGV4dCArIDkpCisjIGRlZmluZSBtcGF0aHNldCgpICAgICAoKHZtcGF0aC5mbGFncyAmIFZVTlNFVCkgPT0gMCkKKyNlbmRpZgorI2RlZmluZSBwYXRodmFsKCkgICAgICAgKHZwYXRoLnZhcl90ZXh0ICsgNSkKKyNkZWZpbmUgcHMxdmFsKCkgICAgICAgICh2cHMxLnZhcl90ZXh0ICsgNCkKKyNkZWZpbmUgcHMydmFsKCkgICAgICAgICh2cHMyLnZhcl90ZXh0ICsgNCkKKyNkZWZpbmUgcHM0dmFsKCkgICAgICAgICh2cHM0LnZhcl90ZXh0ICsgNCkKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKyMgZGVmaW5lIG9wdGluZHZhbCgpICAgICh2b3B0aW5kLnZhcl90ZXh0ICsgNykKKyNlbmRpZgorCisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2dldG9wdHNyZXNldChjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlzaGVsbHBhcmFtLm9wdGluZCA9IG51bWJlcih2YWx1ZSk7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKK30KKyNlbmRpZgorCisvKiBtYXRoLmggaGFzIHRoZXNlLCBvdGhlcndpc2UgZGVmaW5lIG91ciBwcml2YXRlIGNvcGllcyAqLworI2lmICFFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisjZGVmaW5lIGlzX25hbWUoYykgICAgICAoKGMpID09ICdfJyB8fCBpc2FscGhhKCh1bnNpZ25lZCBjaGFyKShjKSkpCisjZGVmaW5lIGlzX2luX25hbWUoYykgICAoKGMpID09ICdfJyB8fCBpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKShjKSkpCisvKgorICogUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIGEgbGVnYWwgdmFyaWFibGUgbmFtZQorICogKGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgbGV0dGVycywgdW5kZXJzY29yZXMsIGFuZCBkaWdpdHMpLgorICovCitzdGF0aWMgY29uc3QgY2hhcioKK2VuZG9mbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWlmICghaXNfbmFtZSgqbmFtZSkpCisJCXJldHVybiBuYW1lOworCXdoaWxlICgqKytuYW1lKSB7CisJCWlmICghaXNfaW5fbmFtZSgqbmFtZSkpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisjZW5kaWYKKworLyoKKyAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVwIHRvIHRoZSBmaXJzdCA9IG9yICdcMCcuICBUaGUgZmlyc3QKKyAqIHN0cmluZyBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgJz0nOyB0aGUgc2Vjb25kIG1heSBiZSB0ZXJtaW5hdGVkIGJ5CisgKiBlaXRoZXIgJz0nIG9yICdcMCcuCisgKi8KK3N0YXRpYyBpbnQKK3ZhcmNtcChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpxKQoreworCWludCBjLCBkOworCisJd2hpbGUgKChjID0gKnApID09IChkID0gKnEpKSB7CisJCWlmICghYyB8fCBjID09ICc9JykKKwkJCWdvdG8gb3V0OworCQlwKys7CisJCXErKzsKKwl9CisJaWYgKGMgPT0gJz0nKQorCQljID0gJ1wwJzsKKwlpZiAoZCA9PSAnPScpCisJCWQgPSAnXDAnOworIG91dDoKKwlyZXR1cm4gYyAtIGQ7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBhcHByb3ByaWF0ZSBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBmcm9tIHRoZSBuYW1lLgorICovCitzdGF0aWMgc3RydWN0IHZhciAqKgoraGFzaHZhcihjb25zdCBjaGFyICpwKQoreworCXVuc2lnbmVkIGhhc2h2YWw7CisKKwloYXNodmFsID0gKCh1bnNpZ25lZCBjaGFyKSAqcCkgPDwgNDsKKwl3aGlsZSAoKnAgJiYgKnAgIT0gJz0nKQorCQloYXNodmFsICs9ICh1bnNpZ25lZCBjaGFyKSAqcCsrOworCXJldHVybiAmdmFydGFiW2hhc2h2YWwgJSBWVEFCU0laRV07Cit9CisKK3N0YXRpYyBpbnQKK3ZwY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIHZhcmNtcCgqKGNvbnN0IGNoYXIgKiopYSwgKihjb25zdCBjaGFyICoqKWIpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBidWlsdGluIHZhcmlhYmxlcy4KKyAqLworc3RhdGljIHZvaWQKK2luaXR2YXIodm9pZCkKK3sKKwlzdHJ1Y3QgdmFyICp2cDsKKwlzdHJ1Y3QgdmFyICplbmQ7CisJc3RydWN0IHZhciAqKnZwcDsKKworCS8qCisJICogUFMxIGRlcGVuZHMgb24gdWlkCisJICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORyAmJiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVAorCXZwczEudmFyX3RleHQgPSAiUFMxPVxcdyBcXCQgIjsKKyNlbHNlCisJaWYgKCFnZXRldWlkKCkpCisJCXZwczEudmFyX3RleHQgPSAiUFMxPSMgIjsKKyNlbmRpZgorCXZwID0gdmFyaW5pdDsKKwllbmQgPSB2cCArIEFSUkFZX1NJWkUodmFyaW5pdCk7CisJZG8geworCQl2cHAgPSBoYXNodmFyKHZwLT52YXJfdGV4dCk7CisJCXZwLT5uZXh0ID0gKnZwcDsKKwkJKnZwcCA9IHZwOworCX0gd2hpbGUgKCsrdnAgPCBlbmQpOworfQorCitzdGF0aWMgc3RydWN0IHZhciAqKgorZmluZHZhcihzdHJ1Y3QgdmFyICoqdnBwLCBjb25zdCBjaGFyICpuYW1lKQoreworCWZvciAoOyAqdnBwOyB2cHAgPSAmKCp2cHApLT5uZXh0KSB7CisJCWlmICh2YXJjbXAoKCp2cHApLT52YXJfdGV4dCwgbmFtZSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHZwcDsKK30KKworLyoKKyAqIEZpbmQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuICBSZXR1cm5zIE5VTEwgaWYgbm90IHNldC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIqIEZBU1RfRlVOQworbG9va3VwdmFyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHZhciAqdjsKKworCXYgPSAqZmluZHZhcihoYXNodmFyKG5hbWUpLCBuYW1lKTsKKwlpZiAodikgeworI2lmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKKwkvKgorCSAqIER5bmFtaWMgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCByb3VnaGx5IHRoZSBzYW1lIHdheSB0aGV5IGFyZQorCSAqIGluIGJhc2guIE5hbWVseSwgdGhleSdyZSAic3BlY2lhbCIgc28gbG9uZyBhcyB0aGV5IGFyZW4ndCB1bnNldC4KKwkgKiBBcyBzb29uIGFzIHRoZXkncmUgdW5zZXQsIHRoZXkncmUgbm8gbG9uZ2VyIGR5bmFtaWMsIGFuZCBkeW5hbWljCisJICogbG9va3VwIHdpbGwgbm8gbG9uZ2VyIGhhcHBlbiBhdCB0aGF0IHBvaW50LiAtLSBQRk0uCisJICovCisJCWlmICh2LT5mbGFncyAmIFZEWU5BTUlDKQorCQkJdi0+dmFyX2Z1bmMoTlVMTCk7CisjZW5kaWYKKwkJaWYgKCEodi0+ZmxhZ3MgJiBWVU5TRVQpKQorCQkJcmV0dXJuIHZhcl9lbmQodi0+dmFyX3RleHQpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNlYXJjaCB0aGUgZW52aXJvbm1lbnQgb2YgYSBidWlsdGluIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2JsdGlubG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCisJZm9yIChzcCA9IGNtZGVudmlyb247IHNwOyBzcCA9IHNwLT5uZXh0KSB7CisJCWlmICh2YXJjbXAoc3AtPnRleHQsIG5hbWUpID09IDApCisJCQlyZXR1cm4gdmFyX2VuZChzcC0+dGV4dCk7CisJfQorCXJldHVybiBsb29rdXB2YXIobmFtZSk7Cit9CisKKy8qCisgKiBTYW1lIGFzIHNldHZhciBleGNlcHQgdGhhdCB0aGUgdmFyaWFibGUgYW5kIHZhbHVlIGFyZSBwYXNzZWQgaW4KKyAqIHRoZSBmaXJzdCBhcmd1bWVudCBhcyBuYW1lPXZhbHVlLiAgU2luY2UgdGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwKKyAqIGJlIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgdGFibGUsIGl0IHNob3VsZCBub3QgYmUgYSBzdHJpbmcgdGhhdAorICogd2lsbCBnbyBhd2F5LgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0YXRpYyB2b2lkCitzZXR2YXJlcShjaGFyICpzLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHZhciAqdnAsICoqdnBwOworCisJdnBwID0gaGFzaHZhcihzKTsKKwlmbGFncyB8PSAoVkVYUE9SVCAmICgoKHVuc2lnbmVkKSAoMSAtIGFmbGFnKSkgLSAxKSk7CisJdnAgPSAqZmluZHZhcih2cHAsIHMpOworCWlmICh2cCkgeworCQlpZiAoKHZwLT5mbGFncyAmIChWUkVBRE9OTFl8VkRZTkFNSUMpKSA9PSBWUkVBRE9OTFkpIHsKKwkJCWNvbnN0IGNoYXIgKm47CisKKwkJCWlmIChmbGFncyAmIFZOT1NBVkUpCisJCQkJZnJlZShzKTsKKwkJCW4gPSB2cC0+dmFyX3RleHQ7CisJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiJS4qczogaXMgcmVhZCBvbmx5Iiwgc3RyY2hybnVsKG4sICc9JykgLSBuLCBuKTsKKwkJfQorCisJCWlmIChmbGFncyAmIFZOT1NFVCkKKwkJCXJldHVybjsKKworCQlpZiAodnAtPnZhcl9mdW5jICYmICEoZmxhZ3MgJiBWTk9GVU5DKSkKKwkJCXZwLT52YXJfZnVuYyh2YXJfZW5kKHMpKTsKKworCQlpZiAoISh2cC0+ZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0spKSkKKwkJCWZyZWUoKGNoYXIqKXZwLT52YXJfdGV4dCk7CisKKwkJZmxhZ3MgfD0gdnAtPmZsYWdzICYgfihWVEVYVEZJWEVEfFZTVEFDS3xWTk9TQVZFfFZVTlNFVCk7CisJfSBlbHNlIHsKKwkJLyogdmFyaWFibGUgcyBpcyBub3QgZm91bmQgKi8KKwkJaWYgKGZsYWdzICYgVk5PU0VUKQorCQkJcmV0dXJuOworCQl2cCA9IGNremFsbG9jKHNpemVvZigqdnApKTsKKwkJdnAtPm5leHQgPSAqdnBwOworCQkvKnZwLT5mdW5jID0gTlVMTDsgLSBja3phbGxvYyBkaWQgaXQgKi8KKwkJKnZwcCA9IHZwOworCX0KKwlpZiAoIShmbGFncyAmIChWVEVYVEZJWEVEfFZTVEFDS3xWTk9TQVZFKSkpCisJCXMgPSBja3N0cmR1cChzKTsKKwl2cC0+dmFyX3RleHQgPSBzOworCXZwLT5mbGFncyA9IGZsYWdzOworfQorCisvKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLiAgVGhlIGZsYWdzIGFyZ3VtZW50IGlzIG9yZWQgd2l0aCB0aGUKKyAqIGZsYWdzIG9mIHRoZSB2YXJpYWJsZS4gIElmIHZhbCBpcyBOVUxMLCB0aGUgdmFyaWFibGUgaXMgdW5zZXQuCisgKi8KK3N0YXRpYyB2b2lkCitzZXR2YXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsLCBpbnQgZmxhZ3MpCit7CisJY29uc3QgY2hhciAqcTsKKwljaGFyICpwOworCWNoYXIgKm5hbWVlcTsKKwlzaXplX3QgbmFtZWxlbjsKKwlzaXplX3QgdmFsbGVuOworCisJcSA9IGVuZG9mbmFtZShuYW1lKTsKKwlwID0gc3RyY2hybnVsKHEsICc9Jyk7CisJbmFtZWxlbiA9IHAgLSBuYW1lOworCWlmICghbmFtZWxlbiB8fCBwICE9IHEpCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCIlLipzOiBiYWQgdmFyaWFibGUgbmFtZSIsIG5hbWVsZW4sIG5hbWUpOworCXZhbGxlbiA9IDA7CisJaWYgKHZhbCA9PSBOVUxMKSB7CisJCWZsYWdzIHw9IFZVTlNFVDsKKwl9IGVsc2UgeworCQl2YWxsZW4gPSBzdHJsZW4odmFsKTsKKwl9CisKKwlJTlRfT0ZGOworCW5hbWVlcSA9IGNrbWFsbG9jKG5hbWVsZW4gKyB2YWxsZW4gKyAyKTsKKwlwID0gbWVtY3B5KG5hbWVlcSwgbmFtZSwgbmFtZWxlbikgKyBuYW1lbGVuOworCWlmICh2YWwpIHsKKwkJKnArKyA9ICc9JzsKKwkJcCA9IG1lbWNweShwLCB2YWwsIHZhbGxlbikgKyB2YWxsZW47CisJfQorCSpwID0gJ1wwJzsKKwlzZXR2YXJlcShuYW1lZXEsIGZsYWdzIHwgVk5PU0FWRSk7CisJSU5UX09OOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK3NldHZhcjIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKQoreworCXNldHZhcihuYW1lLCB2YWwsIDApOworfQorCisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCisvKgorICogU2FmZSB2ZXJzaW9uIG9mIHNldHZhciwgcmV0dXJucyAxIG9uIHN1Y2Nlc3MgMCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CitzZXR2YXJzYWZlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCwgaW50IGZsYWdzKQoreworCWludCBlcnI7CisJdm9sYXRpbGUgaW50IHNhdmVpbnQ7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXIgPSBleGNlcHRpb25faGFuZGxlcjsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKworCVNBVkVfSU5UKHNhdmVpbnQpOworCWlmIChzZXRqbXAoam1wbG9jLmxvYykpCisJCWVyciA9IDE7CisJZWxzZSB7CisJCWV4Y2VwdGlvbl9oYW5kbGVyID0gJmptcGxvYzsKKwkJc2V0dmFyKG5hbWUsIHZhbCwgZmxhZ3MpOworCQllcnIgPSAwOworCX0KKwlleGNlcHRpb25faGFuZGxlciA9IHNhdmVoYW5kbGVyOworCVJFU1RPUkVfSU5UKHNhdmVpbnQpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworLyoKKyAqIFVuc2V0IHRoZSBzcGVjaWZpZWQgdmFyaWFibGUuCisgKi8KK3N0YXRpYyBpbnQKK3Vuc2V0dmFyKGNvbnN0IGNoYXIgKnMpCit7CisJc3RydWN0IHZhciAqKnZwcDsKKwlzdHJ1Y3QgdmFyICp2cDsKKwlpbnQgcmV0dmFsOworCisJdnBwID0gZmluZHZhcihoYXNodmFyKHMpLCBzKTsKKwl2cCA9ICp2cHA7CisJcmV0dmFsID0gMjsKKwlpZiAodnApIHsKKwkJaW50IGZsYWdzID0gdnAtPmZsYWdzOworCisJCXJldHZhbCA9IDE7CisJCWlmIChmbGFncyAmIFZSRUFET05MWSkKKwkJCWdvdG8gb3V0OworI2lmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKKwkJdnAtPmZsYWdzICY9IH5WRFlOQU1JQzsKKyNlbmRpZgorCQlpZiAoZmxhZ3MgJiBWVU5TRVQpCisJCQlnb3RvIG9rOworCQlpZiAoKGZsYWdzICYgVlNUUkZJWEVEKSA9PSAwKSB7CisJCQlJTlRfT0ZGOworCQkJaWYgKChmbGFncyAmIChWVEVYVEZJWEVEfFZTVEFDSykpID09IDApCisJCQkJZnJlZSgoY2hhciopdnAtPnZhcl90ZXh0KTsKKwkJCSp2cHAgPSB2cC0+bmV4dDsKKwkJCWZyZWUodnApOworCQkJSU5UX09OOworCQl9IGVsc2UgeworCQkJc2V0dmFyKHMsIDAsIDApOworCQkJdnAtPmZsYWdzICY9IH5WRVhQT1JUOworCQl9Cisgb2s6CisJCXJldHZhbCA9IDA7CisJfQorIG91dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUHJvY2VzcyBhIGxpbmtlZCBsaXN0IG9mIHZhcmlhYmxlIGFzc2lnbm1lbnRzLgorICovCitzdGF0aWMgdm9pZAorbGlzdHNldHZhcihzdHJ1Y3Qgc3RybGlzdCAqbGlzdF9zZXRfdmFyLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHN0cmxpc3QgKmxwID0gbGlzdF9zZXRfdmFyOworCisJaWYgKCFscCkKKwkJcmV0dXJuOworCUlOVF9PRkY7CisJZG8geworCQlzZXR2YXJlcShscC0+dGV4dCwgZmxhZ3MpOworCQlscCA9IGxwLT5uZXh0OworCX0gd2hpbGUgKGxwKTsKKwlJTlRfT047Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhIGxpc3Qgb2YgdmFyaWFibGVzIHNhdGlzZnlpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbnMuCisgKi8KK3N0YXRpYyBjaGFyICoqCitsaXN0dmFycyhpbnQgb24sIGludCBvZmYsIGNoYXIgKioqZW5kKQoreworCXN0cnVjdCB2YXIgKip2cHA7CisJc3RydWN0IHZhciAqdnA7CisJY2hhciAqKmVwOworCWludCBtYXNrOworCisJU1RBUlRTVEFDS1NUUihlcCk7CisJdnBwID0gdmFydGFiOworCW1hc2sgPSBvbiB8IG9mZjsKKwlkbyB7CisJCWZvciAodnAgPSAqdnBwOyB2cDsgdnAgPSB2cC0+bmV4dCkgeworCQkJaWYgKCh2cC0+ZmxhZ3MgJiBtYXNrKSA9PSBvbikgeworCQkJCWlmIChlcCA9PSBzdGFja3N0cmVuZCgpKQorCQkJCQllcCA9IGdyb3dzdGFja3N0cigpOworCQkJCSplcCsrID0gKGNoYXIqKXZwLT52YXJfdGV4dDsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKCsrdnBwIDwgdmFydGFiICsgVlRBQlNJWkUpOworCWlmIChlcCA9PSBzdGFja3N0cmVuZCgpKQorCQllcCA9IGdyb3dzdGFja3N0cigpOworCWlmIChlbmQpCisJCSplbmQgPSBlcDsKKwkqZXArKyA9IE5VTEw7CisJcmV0dXJuIGdyYWJzdGFja3N0cihlcCk7Cit9CisKKworLyogPT09PT09PT09PT09IFBhdGggc2VhcmNoIGhlbHBlcgorICoKKyAqIFRoZSB2YXJpYWJsZSBwYXRoIChwYXNzZWQgYnkgcmVmZXJlbmNlKSBzaG91bGQgYmUgc2V0IHRvIHRoZSBzdGFydAorICogb2YgdGhlIHBhdGggYmVmb3JlIHRoZSBmaXJzdCBjYWxsOyBwYXRoX2FkdmFuY2Ugd2lsbCB1cGRhdGUKKyAqIHRoaXMgdmFsdWUgYXMgaXQgcHJvY2VlZHMuICBTdWNjZXNzaXZlIGNhbGxzIHRvIHBhdGhfYWR2YW5jZSB3aWxsIHJldHVybgorICogdGhlIHBvc3NpYmxlIHBhdGggZXhwYW5zaW9ucyBpbiBzZXF1ZW5jZS4gIElmIGFuIG9wdGlvbiAoaW5kaWNhdGVkIGJ5CisgKiBhIHBlcmNlbnQgc2lnbikgYXBwZWFycyBpbiB0aGUgcGF0aCBlbnRyeSB0aGVuIHRoZSBnbG9iYWwgdmFyaWFibGUKKyAqIHBhdGhvcHQgd2lsbCBiZSBzZXQgdG8gcG9pbnQgdG8gaXQ7IG90aGVyd2lzZSBwYXRob3B0IHdpbGwgYmUgc2V0IHRvCisgKiBOVUxMLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqcGF0aG9wdDsgICAgIC8qIHNldCBieSBwYXRoX2FkdmFuY2UgKi8KKworc3RhdGljIGNoYXIgKgorcGF0aF9hZHZhbmNlKGNvbnN0IGNoYXIgKipwYXRoLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqcTsKKwljb25zdCBjaGFyICpzdGFydDsKKwlzaXplX3QgbGVuOworCisJaWYgKCpwYXRoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXN0YXJ0ID0gKnBhdGg7CisJZm9yIChwID0gc3RhcnQ7ICpwICYmICpwICE9ICc6JyAmJiAqcCAhPSAnJSc7IHArKykKKwkJY29udGludWU7CisJbGVuID0gcCAtIHN0YXJ0ICsgc3RybGVuKG5hbWUpICsgMjsgICAgIC8qICIyIiBpcyBmb3IgJy8nIGFuZCAnXDAnICovCisJd2hpbGUgKHN0YWNrYmxvY2tzaXplKCkgPCBsZW4pCisJCWdyb3dzdGFja2Jsb2NrKCk7CisJcSA9IHN0YWNrYmxvY2soKTsKKwlpZiAocCAhPSBzdGFydCkgeworCQltZW1jcHkocSwgc3RhcnQsIHAgLSBzdGFydCk7CisJCXEgKz0gcCAtIHN0YXJ0OworCQkqcSsrID0gJy8nOworCX0KKwlzdHJjcHkocSwgbmFtZSk7CisJcGF0aG9wdCA9IE5VTEw7CisJaWYgKCpwID09ICclJykgeworCQlwYXRob3B0ID0gKytwOworCQl3aGlsZSAoKnAgJiYgKnAgIT0gJzonKQorCQkJcCsrOworCX0KKwlpZiAoKnAgPT0gJzonKQorCQkqcGF0aCA9IHAgKyAxOworCWVsc2UKKwkJKnBhdGggPSBOVUxMOworCXJldHVybiBzdGFsbG9jKGxlbik7Cit9CisKKworLyogPT09PT09PT09PT09IFByb21wdCAqLworCitzdGF0aWMgc21hbGxpbnQgZG9wcm9tcHQ7ICAgICAgICAgICAgICAgICAgIC8qIGlmIHNldCwgcHJvbXB0IHRoZSB1c2VyICovCitzdGF0aWMgc21hbGxpbnQgbmVlZHByb21wdDsgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgaW50ZXJhY3RpdmUgYW5kIGF0IHN0YXJ0IG9mIGxpbmUgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKK3N0YXRpYyBsaW5lX2lucHV0X3QgKmxpbmVfaW5wdXRfc3RhdGU7CitzdGF0aWMgY29uc3QgY2hhciAqY21kZWRpdF9wcm9tcHQ7CitzdGF0aWMgdm9pZAorcHV0cHJvbXB0KGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKEVOQUJMRV9BU0hfRVhQQU5EX1BSTVQpIHsKKwkJZnJlZSgoY2hhciopY21kZWRpdF9wcm9tcHQpOworCQljbWRlZGl0X3Byb21wdCA9IGNrc3RyZHVwKHMpOworCQlyZXR1cm47CisJfQorCWNtZGVkaXRfcHJvbXB0ID0gczsKK30KKyNlbHNlCitzdGF0aWMgdm9pZAorcHV0cHJvbXB0KGNvbnN0IGNoYXIgKnMpCit7CisJb3V0MnN0cihzKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0FTSF9FWFBBTkRfUFJNVAorLyogZXhwYW5kc3RyKCkgbmVlZHMgcGFyc2luZyBtYWNoaW5lcnksIHNvIGl0IGlzIGZhciBhd2F5IGFoZWFkLi4uICovCitzdGF0aWMgY29uc3QgY2hhciAqZXhwYW5kc3RyKGNvbnN0IGNoYXIgKnBzKTsKKyNlbHNlCisjZGVmaW5lIGV4cGFuZHN0cihzKSBzCisjZW5kaWYKKworc3RhdGljIHZvaWQKK3NldHByb21wdF9pZihzbWFsbGludCBkb19zZXQsIGludCB3aGljaHByb21wdCkKK3sKKwljb25zdCBjaGFyICpwcm9tcHQ7CisJSUZfQVNIX0VYUEFORF9QUk1UKHN0cnVjdCBzdGFja21hcmsgc21hcms7KQorCisJaWYgKCFkb19zZXQpCisJCXJldHVybjsKKworCW5lZWRwcm9tcHQgPSAwOworCisJc3dpdGNoICh3aGljaHByb21wdCkgeworCWNhc2UgMToKKwkJcHJvbXB0ID0gcHMxdmFsKCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcHJvbXB0ID0gcHMydmFsKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLworCQlwcm9tcHQgPSBudWxsc3RyOworCX0KKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJc3RhbGxvYyhzdGFja2Jsb2Nrc2l6ZSgpKTsKKyNlbmRpZgorCXB1dHByb21wdChleHBhbmRzdHIocHJvbXB0KSk7CisjaWYgRU5BQkxFX0FTSF9FWFBBTkRfUFJNVAorCXBvcHN0YWNrbWFyaygmc21hcmspOworI2VuZGlmCit9CisKKworLyogPT09PT09PT09PT09IFRoZSBjZCBhbmQgcHdkIGNvbW1hbmRzICovCisKKyNkZWZpbmUgQ0RfUEhZU0lDQUwgMQorI2RlZmluZSBDRF9QUklOVCAyCisKK3N0YXRpYyBpbnQKK2Nkb3B0KHZvaWQpCit7CisJaW50IGZsYWdzID0gMDsKKwlpbnQgaSwgajsKKworCWogPSAnTCc7CisJd2hpbGUgKChpID0gbmV4dG9wdCgiTFAiKSkgIT0gJ1wwJykgeworCQlpZiAoaSAhPSBqKSB7CisJCQlmbGFncyBePSBDRF9QSFlTSUNBTDsKKwkJCWogPSBpOworCQl9CisJfQorCisJcmV0dXJuIGZsYWdzOworfQorCisvKgorICogVXBkYXRlIGN1cmRpciAodGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5KSBpbiByZXNwb25zZSB0byBhCisgKiBjZCBjb21tYW5kLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCit1cGRhdGVwd2QoY29uc3QgY2hhciAqZGlyKQoreworCWNoYXIgKm5ldzsKKwljaGFyICpwOworCWNoYXIgKmNkY29tcHBhdGg7CisJY29uc3QgY2hhciAqbGltOworCisJY2Rjb21wcGF0aCA9IHN0c3RyZHVwKGRpcik7CisJU1RBUlRTVEFDS1NUUihuZXcpOworCWlmICgqZGlyICE9ICcvJykgeworCQlpZiAoY3VyZGlyID09IG51bGxzdHIpCisJCQlyZXR1cm4gMDsKKwkJbmV3ID0gc3RhY2tfcHV0c3RyKGN1cmRpciwgbmV3KTsKKwl9CisJbmV3ID0gbWFrZXN0cnNwYWNlKHN0cmxlbihkaXIpICsgMiwgbmV3KTsKKwlsaW0gPSAoY2hhciAqKXN0YWNrYmxvY2soKSArIDE7CisJaWYgKCpkaXIgIT0gJy8nKSB7CisJCWlmIChuZXdbLTFdICE9ICcvJykKKwkJCVVTVFBVVEMoJy8nLCBuZXcpOworCQlpZiAobmV3ID4gbGltICYmICpsaW0gPT0gJy8nKQorCQkJbGltKys7CisJfSBlbHNlIHsKKwkJVVNUUFVUQygnLycsIG5ldyk7CisJCWNkY29tcHBhdGgrKzsKKwkJaWYgKGRpclsxXSA9PSAnLycgJiYgZGlyWzJdICE9ICcvJykgeworCQkJVVNUUFVUQygnLycsIG5ldyk7CisJCQljZGNvbXBwYXRoKys7CisJCQlsaW0rKzsKKwkJfQorCX0KKwlwID0gc3RydG9rKGNkY29tcHBhdGgsICIvIik7CisJd2hpbGUgKHApIHsKKwkJc3dpdGNoICgqcCkgeworCQljYXNlICcuJzoKKwkJCWlmIChwWzFdID09ICcuJyAmJiBwWzJdID09ICdcMCcpIHsKKwkJCQl3aGlsZSAobmV3ID4gbGltKSB7CisJCQkJCVNUVU5QVVRDKG5ldyk7CisJCQkJCWlmIChuZXdbLTFdID09ICcvJykKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwWzFdID09ICdcMCcpCisJCQkJYnJlYWs7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCW5ldyA9IHN0YWNrX3B1dHN0cihwLCBuZXcpOworCQkJVVNUUFVUQygnLycsIG5ldyk7CisJCX0KKwkJcCA9IHN0cnRvaygwLCAiLyIpOworCX0KKwlpZiAobmV3ID4gbGltKQorCQlTVFVOUFVUQyhuZXcpOworCSpuZXcgPSAwOworCXJldHVybiBzdGFja2Jsb2NrKCk7Cit9CisKKy8qCisgKiBGaW5kIG91dCB3aGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcy4gSWYgd2UgYWxyZWFkeSBrbm93IHRoZSBjdXJyZW50CisgKiBkaXJlY3RvcnksIHRoaXMgcm91dGluZSByZXR1cm5zIGltbWVkaWF0ZWx5LgorICovCitzdGF0aWMgY2hhciAqCitnZXRwd2Qodm9pZCkKK3sKKwljaGFyICpkaXIgPSBnZXRjd2QoTlVMTCwgMCk7IC8qIGh1aCwgdXNpbmcgZ2xpYmMgZXh0ZW5zaW9uPyAqLworCXJldHVybiBkaXIgPyBkaXIgOiBudWxsc3RyOworfQorCitzdGF0aWMgdm9pZAorc2V0cHdkKGNvbnN0IGNoYXIgKnZhbCwgaW50IHNldG9sZCkKK3sKKwljaGFyICpvbGRjdXIsICpkaXI7CisKKwlvbGRjdXIgPSBkaXIgPSBjdXJkaXI7CisKKwlpZiAoc2V0b2xkKSB7CisJCXNldHZhcigiT0xEUFdEIiwgb2xkY3VyLCBWRVhQT1JUKTsKKwl9CisJSU5UX09GRjsKKwlpZiAocGh5c2RpciAhPSBudWxsc3RyKSB7CisJCWlmIChwaHlzZGlyICE9IG9sZGN1cikKKwkJCWZyZWUocGh5c2Rpcik7CisJCXBoeXNkaXIgPSBudWxsc3RyOworCX0KKwlpZiAob2xkY3VyID09IHZhbCB8fCAhdmFsKSB7CisJCWNoYXIgKnMgPSBnZXRwd2QoKTsKKwkJcGh5c2RpciA9IHM7CisJCWlmICghdmFsKQorCQkJZGlyID0gczsKKwl9IGVsc2UKKwkJZGlyID0gY2tzdHJkdXAodmFsKTsKKwlpZiAob2xkY3VyICE9IGRpciAmJiBvbGRjdXIgIT0gbnVsbHN0cikgeworCQlmcmVlKG9sZGN1cik7CisJfQorCWN1cmRpciA9IGRpcjsKKwlJTlRfT047CisJc2V0dmFyKCJQV0QiLCBkaXIsIFZFWFBPUlQpOworfQorCitzdGF0aWMgdm9pZCBoYXNoY2Qodm9pZCk7CisKKy8qCisgKiBBY3R1YWxseSBkbyB0aGUgY2hkaXIuICBXZSBhbHNvIGNhbGwgaGFzaGNkIHRvIGxldCB0aGUgcm91dGluZXMgaW4gZXhlYy5jCisgKiBrbm93IHRoYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGhhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgaW50Citkb2NkKGNvbnN0IGNoYXIgKmRlc3QsIGludCBmbGFncykKK3sKKwljb25zdCBjaGFyICpkaXIgPSBOVUxMOworCWludCBlcnI7CisKKwlUUkFDRSgoImRvY2QoXCIlc1wiLCAlZCkgY2FsbGVkXG4iLCBkZXN0LCBmbGFncykpOworCisJSU5UX09GRjsKKwlpZiAoIShmbGFncyAmIENEX1BIWVNJQ0FMKSkgeworCQlkaXIgPSB1cGRhdGVwd2QoZGVzdCk7CisJCWlmIChkaXIpCisJCQlkZXN0ID0gZGlyOworCX0KKwllcnIgPSBjaGRpcihkZXN0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlzZXRwd2QoZGlyLCAxKTsKKwloYXNoY2QoKTsKKyBvdXQ6CisJSU5UX09OOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitjZGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwljb25zdCBjaGFyICpkZXN0OworCWNvbnN0IGNoYXIgKnBhdGg7CisJY29uc3QgY2hhciAqcDsKKwljaGFyIGM7CisJc3RydWN0IHN0YXQgc3RhdGI7CisJaW50IGZsYWdzOworCisJZmxhZ3MgPSBjZG9wdCgpOworCWRlc3QgPSAqYXJncHRyOworCWlmICghZGVzdCkKKwkJZGVzdCA9IGJsdGlubG9va3VwKCJIT01FIik7CisJZWxzZSBpZiAoTE9ORV9EQVNIKGRlc3QpKSB7CisJCWRlc3QgPSBibHRpbmxvb2t1cCgiT0xEUFdEIik7CisJCWZsYWdzIHw9IENEX1BSSU5UOworCX0KKwlpZiAoIWRlc3QpCisJCWRlc3QgPSBudWxsc3RyOworCWlmICgqZGVzdCA9PSAnLycpCisJCWdvdG8gc3RlcDc7CisJaWYgKCpkZXN0ID09ICcuJykgeworCQljID0gZGVzdFsxXTsKKyBkb3Rkb3Q6CisJCXN3aXRjaCAoYykgeworCQljYXNlICdcMCc6CisJCWNhc2UgJy8nOgorCQkJZ290byBzdGVwNjsKKwkJY2FzZSAnLic6CisJCQljID0gZGVzdFsyXTsKKwkJCWlmIChjICE9ICcuJykKKwkJCQlnb3RvIGRvdGRvdDsKKwkJfQorCX0KKwlpZiAoISpkZXN0KQorCQlkZXN0ID0gIi4iOworCXBhdGggPSBibHRpbmxvb2t1cCgiQ0RQQVRIIik7CisJaWYgKCFwYXRoKSB7Cisgc3RlcDY6Cisgc3RlcDc6CisJCXAgPSBkZXN0OworCQlnb3RvIGRvY2Q7CisJfQorCWRvIHsKKwkJYyA9ICpwYXRoOworCQlwID0gcGF0aF9hZHZhbmNlKCZwYXRoLCBkZXN0KTsKKwkJaWYgKHN0YXQocCwgJnN0YXRiKSA+PSAwICYmIFNfSVNESVIoc3RhdGIuc3RfbW9kZSkpIHsKKwkJCWlmIChjICYmIGMgIT0gJzonKQorCQkJCWZsYWdzIHw9IENEX1BSSU5UOworIGRvY2Q6CisJCQlpZiAoIWRvY2QocCwgZmxhZ3MpKQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChwYXRoKTsKKwlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiY2FuJ3QgY2QgdG8gJXMiLCBkZXN0KTsKKwkvKiBOT1RSRUFDSEVEICovCisgb3V0OgorCWlmIChmbGFncyAmIENEX1BSSU5UKQorCQlvdXQxZm10KCIlc1xuIiwgY3VyZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK3B3ZGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgZmxhZ3M7CisJY29uc3QgY2hhciAqZGlyID0gY3VyZGlyOworCisJZmxhZ3MgPSBjZG9wdCgpOworCWlmIChmbGFncykgeworCQlpZiAocGh5c2RpciA9PSBudWxsc3RyKQorCQkJc2V0cHdkKGRpciwgMCk7CisJCWRpciA9IHBoeXNkaXI7CisJfQorCW91dDFmbXQoIiVzXG4iLCBkaXIpOworCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PSAuLi4gKi8KKworCisjZGVmaW5lIElCVUZTSVogKEVOQUJMRV9GRUFUVVJFX0VESVRJTkcgPyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU4gOiAxMDI0KQorCisvKiBTeW50YXggY2xhc3NlcyAqLworI2RlZmluZSBDV09SRCAgICAgMCAgICAgICAgICAgICAvKiBjaGFyYWN0ZXIgaXMgbm90aGluZyBzcGVjaWFsICovCisjZGVmaW5lIENOTCAgICAgICAxICAgICAgICAgICAgIC8qIG5ld2xpbmUgY2hhcmFjdGVyICovCisjZGVmaW5lIENCQUNLICAgICAyICAgICAgICAgICAgIC8qIGEgYmFja3NsYXNoIGNoYXJhY3RlciAqLworI2RlZmluZSBDU1FVT1RFICAgMyAgICAgICAgICAgICAvKiBzaW5nbGUgcXVvdGUgKi8KKyNkZWZpbmUgQ0RRVU9URSAgIDQgICAgICAgICAgICAgLyogZG91YmxlIHF1b3RlICovCisjZGVmaW5lIENFTkRRVU9URSA1ICAgICAgICAgICAgIC8qIGEgdGVybWluYXRpbmcgcXVvdGUgKi8KKyNkZWZpbmUgQ0JRVU9URSAgIDYgICAgICAgICAgICAgLyogYmFja3dhcmRzIHNpbmdsZSBxdW90ZSAqLworI2RlZmluZSBDVkFSICAgICAgNyAgICAgICAgICAgICAvKiBhIGRvbGxhciBzaWduICovCisjZGVmaW5lIENFTkRWQVIgICA4ICAgICAgICAgICAgIC8qIGEgJ30nIGNoYXJhY3RlciAqLworI2RlZmluZSBDTFAgICAgICAgOSAgICAgICAgICAgICAvKiBhIGxlZnQgcGFyZW4gaW4gYXJpdGhtZXRpYyAqLworI2RlZmluZSBDUlAgICAgICAxMCAgICAgICAgICAgICAvKiBhIHJpZ2h0IHBhcmVuIGluIGFyaXRobWV0aWMgKi8KKyNkZWZpbmUgQ0VOREZJTEUgMTEgICAgICAgICAgICAgLyogZW5kIG9mIGZpbGUgKi8KKyNkZWZpbmUgQ0NUTCAgICAgMTIgICAgICAgICAgICAgLyogbGlrZSBDV09SRCwgZXhjZXB0IGl0IG11c3QgYmUgZXNjYXBlZCAqLworI2RlZmluZSBDU1BDTCAgICAxMyAgICAgICAgICAgICAvKiB0aGVzZSB0ZXJtaW5hdGUgYSB3b3JkICovCisjZGVmaW5lIENJR04gICAgIDE0ICAgICAgICAgICAgIC8qIGNoYXJhY3RlciBzaG91bGQgYmUgaWdub3JlZCAqLworCisjZGVmaW5lIFBFT0YgICAgIDI1NgorI2lmIEVOQUJMRV9BU0hfQUxJQVMKKyMgZGVmaW5lIFBFT0EgICAgMjU3CisjZW5kaWYKKworI2RlZmluZSBVU0VfU0lUX0ZVTkNUSU9OIEVOQUJMRV9BU0hfT1BUSU1JWkVfRk9SX1NJWkUKKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKyMgZGVmaW5lIFNJVF9JVEVNKGEsYixjLGQpIChhIHwgKGIgPDwgNCkgfCAoYyA8PCA4KSB8IChkIDw8IDEyKSkKKyNlbHNlCisjIGRlZmluZSBTSVRfSVRFTShhLGIsYyxkKSAoYSB8IChiIDw8IDQpIHwgKGMgPDwgOCkpCisjZW5kaWYKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBTX0lfVFtdID0geworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwlTSVRfSVRFTShDU1BDTCAgICwgQ0lHTiAgICAgLCBDSUdOICwgQ0lHTiAgICksICAgIC8qIDAsIFBFT0EgKi8KKyNlbmRpZgorCVNJVF9JVEVNKENTUENMICAgLCBDV09SRCAgICAsIENXT1JELCBDV09SRCAgKSwgICAgLyogMSwgJyAnICovCisJU0lUX0lURU0oQ05MICAgICAsIENOTCAgICAgICwgQ05MICAsIENOTCAgICApLCAgICAvKiAyLCBcbiAqLworCVNJVF9JVEVNKENXT1JEICAgLCBDQ1RMICAgICAsIENDVEwgLCBDV09SRCAgKSwgICAgLyogMywgISotLzo9P1tdfiAqLworCVNJVF9JVEVNKENEUVVPVEUgLCBDRU5EUVVPVEUsIENXT1JELCBDV09SRCAgKSwgICAgLyogNCwgJyInICovCisJU0lUX0lURU0oQ1ZBUiAgICAsIENWQVIgICAgICwgQ1dPUkQsIENWQVIgICApLCAgICAvKiA1LCAkICovCisJU0lUX0lURU0oQ1NRVU9URSAsIENXT1JEICAgICwgQ0VORFFVT1RFLCBDV09SRCksICAvKiA2LCAiJyIgKi8KKwlTSVRfSVRFTShDU1BDTCAgICwgQ1dPUkQgICAgLCBDV09SRCwgQ0xQICAgICksICAgIC8qIDcsICggKi8KKwlTSVRfSVRFTShDU1BDTCAgICwgQ1dPUkQgICAgLCBDV09SRCwgQ1JQICAgICksICAgIC8qIDgsICkgKi8KKwlTSVRfSVRFTShDQkFDSyAgICwgQ0JBQ0sgICAgLCBDQ1RMICwgQ0JBQ0sgICksICAgIC8qIDksIFwgKi8KKwlTSVRfSVRFTShDQlFVT1RFICwgQ0JRVU9URSAgLCBDV09SRCwgQ0JRVU9URSksICAgIC8qIDEwLCBgICovCisJU0lUX0lURU0oQ0VORFZBUiAsIENFTkRWQVIgICwgQ1dPUkQsIENFTkRWQVIpLCAgICAvKiAxMSwgfSAqLworI2lmICFVU0VfU0lUX0ZVTkNUSU9OCisJU0lUX0lURU0oQ0VOREZJTEUsIENFTkRGSUxFICwgQ0VOREZJTEUsIENFTkRGSUxFKSwvKiAxMiwgUEVPRiAqLworCVNJVF9JVEVNKENXT1JEICAgLCBDV09SRCAgICAsIENXT1JELCBDV09SRCAgKSwgICAgLyogMTMsIDAtOUEtWmEteiAqLworCVNJVF9JVEVNKENDVEwgICAgLCBDQ1RMICAgICAsIENDVEwgLCBDQ1RMICAgKSAgICAgLyogMTQsIENUTEVTQyAuLi4gKi8KKyNlbmRpZgorI3VuZGVmIFNJVF9JVEVNCit9OworLyogQ29uc3RhbnRzIGJlbG93IG11c3QgbWF0Y2ggdGFibGUgYWJvdmUgKi8KK2VudW0geworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwlDU1BDTF9DSUdOX0NJR05fQ0lHTiAgICAgICAgICAgICAgICwgLyogIDAgKi8KKyNlbmRpZgorCUNTUENMX0NXT1JEX0NXT1JEX0NXT1JEICAgICAgICAgICAgLCAvKiAgMSAqLworCUNOTF9DTkxfQ05MX0NOTCAgICAgICAgICAgICAgICAgICAgLCAvKiAgMiAqLworCUNXT1JEX0NDVExfQ0NUTF9DV09SRCAgICAgICAgICAgICAgLCAvKiAgMyAqLworCUNEUVVPVEVfQ0VORFFVT1RFX0NXT1JEX0NXT1JEICAgICAgLCAvKiAgNCAqLworCUNWQVJfQ1ZBUl9DV09SRF9DVkFSICAgICAgICAgICAgICAgLCAvKiAgNSAqLworCUNTUVVPVEVfQ1dPUkRfQ0VORFFVT1RFX0NXT1JEICAgICAgLCAvKiAgNiAqLworCUNTUENMX0NXT1JEX0NXT1JEX0NMUCAgICAgICAgICAgICAgLCAvKiAgNyAqLworCUNTUENMX0NXT1JEX0NXT1JEX0NSUCAgICAgICAgICAgICAgLCAvKiAgOCAqLworCUNCQUNLX0NCQUNLX0NDVExfQ0JBQ0sgICAgICAgICAgICAgLCAvKiAgOSAqLworCUNCUVVPVEVfQ0JRVU9URV9DV09SRF9DQlFVT1RFICAgICAgLCAvKiAxMCAqLworCUNFTkRWQVJfQ0VORFZBUl9DV09SRF9DRU5EVkFSICAgICAgLCAvKiAxMSAqLworCUNFTkRGSUxFX0NFTkRGSUxFX0NFTkRGSUxFX0NFTkRGSUxFLCAvKiAxMiAqLworCUNXT1JEX0NXT1JEX0NXT1JEX0NXT1JEICAgICAgICAgICAgLCAvKiAxMyAqLworCUNDVExfQ0NUTF9DQ1RMX0NDVEwgICAgICAgICAgICAgICAgLCAvKiAxNCAqLworfTsKKworLyogYyBpbiBTSVQoYywgc3ludGF4KSBtdXN0IGJlIGFuICp1bnNpZ25lZCBjaGFyKiBvciBQRU9BIG9yIFBFT0YsCisgKiBjYWxsZXIgbXVzdCBlbnN1cmUgcHJvcGVyIGNhc3Qgb24gaXQgaWYgYyBpcyAqY2hhcl9wdHIhCisgKi8KKy8qIFZhbHVlcyBmb3Igc3ludGF4IHBhcmFtICovCisjZGVmaW5lIEJBU0VTWU5UQVggMCAgICAvKiBub3QgaW4gcXVvdGVzICovCisjZGVmaW5lIERRU1lOVEFYICAgMSAgICAvKiBpbiBkb3VibGUgcXVvdGVzICovCisjZGVmaW5lIFNRU1lOVEFYICAgMiAgICAvKiBpbiBzaW5nbGUgcXVvdGVzICovCisjZGVmaW5lIEFSSVNZTlRBWCAgMyAgICAvKiBpbiBhcml0aG1ldGljICovCisjZGVmaW5lIFBTU1lOVEFYICAgNCAgICAvKiBwcm9tcHQuIG5ldmVyIHBhc3NlZCB0byBTSVQoKSAqLworCisjaWYgVVNFX1NJVF9GVU5DVElPTgorCitzdGF0aWMgaW50CitTSVQoaW50IGMsIGludCBzeW50YXgpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc3BlY19zeW1ibHNbXSBBTElHTjEgPSAiXHRcbiAhXCIkJicoKSotLzo7PD0+P1tcXF1gfH1+IjsKKyMgaWYgRU5BQkxFX0FTSF9BTElBUworCXN0YXRpYyBjb25zdCB1aW50OF90IHN5bnRheF9pbmRleF90YWJsZVtdIEFMSUdOMSA9IHsKKwkJMSwgMiwgMSwgMywgNCwgNSwgMSwgNiwgICAgICAgICAvKiAiXHRcbiAhXCIkJiciICovCisJCTcsIDgsIDMsIDMsIDMsIDMsIDEsIDEsICAgICAgICAgLyogIigpKi0vOjs8IiAqLworCQkzLCAxLCAzLCAzLCA5LCAzLCAxMCwgMSwgICAgICAgIC8qICI9Pj9bXFxdYHwiICovCisJCTExLCAzICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIn1+IiAqLworCX07CisjIGVsc2UKKwlzdGF0aWMgY29uc3QgdWludDhfdCBzeW50YXhfaW5kZXhfdGFibGVbXSBBTElHTjEgPSB7CisJCTAsIDEsIDAsIDIsIDMsIDQsIDAsIDUsICAgICAgICAgLyogIlx0XG4gIVwiJCYnIiAqLworCQk2LCA3LCAyLCAyLCAyLCAyLCAwLCAwLCAgICAgICAgIC8qICIoKSotLzo7PCIgKi8KKwkJMiwgMCwgMiwgMiwgOCwgMiwgOSwgMCwgICAgICAgICAvKiAiPT4/W1xcXWB8IiAqLworCQkxMCwgMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJ9fiIgKi8KKwl9OworIyBlbmRpZgorCWNvbnN0IGNoYXIgKnM7CisJaW50IGluZHg7CisKKwlpZiAoYyA9PSBQRU9GKQorCQlyZXR1cm4gQ0VOREZJTEU7CisjIGlmIEVOQUJMRV9BU0hfQUxJQVMKKwlpZiAoYyA9PSBQRU9BKQorCQlpbmR4ID0gMDsKKwllbHNlCisjIGVuZGlmCisJeworCQkvKiBDYXN0IGlzIHB1cmVseSBmb3IgcGFyYW5vaWEgaGVyZSwKKwkJICoganVzdCBpbiBjYXNlIHNvbWVvbmUgcGFzc2VkIHNpZ25lZCBjaGFyIHRvIHVzICovCisJCWlmICgodW5zaWduZWQgY2hhciljID49IENUTF9GSVJTVAorCQkgJiYgKHVuc2lnbmVkIGNoYXIpYyA8PSBDVExfTEFTVAorCQkpIHsKKwkJCXJldHVybiBDQ1RMOworCQl9CisJCXMgPSBzdHJjaHJudWwoc3BlY19zeW1ibHMsIGMpOworCQlpZiAoKnMgPT0gJ1wwJykKKwkJCXJldHVybiBDV09SRDsKKwkJaW5keCA9IHN5bnRheF9pbmRleF90YWJsZVtzIC0gc3BlY19zeW1ibHNdOworCX0KKwlyZXR1cm4gKFNfSV9UW2luZHhdID4+IChzeW50YXgqNCkpICYgMHhmOworfQorCisjZWxzZSAgIC8qICFVU0VfU0lUX0ZVTkNUSU9OICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN5bnRheF9pbmRleF90YWJsZVtdID0geworCS8qIEJBU0VTWU5UQVhfRFFTWU5UQVhfU1FTWU5UQVhfQVJJU1lOVEFYICovCisJLyogICAwICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICAxICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICAyICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICAzICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICA0ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICA1ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICA2ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICA3ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICA4ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogICA5ICJcdCIgKi8gQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDEwICJcbiIgKi8gQ05MX0NOTF9DTkxfQ05MLAorCS8qICAxMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAxMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAxMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAxNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAxNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAxNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAxNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAxOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAxOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAyOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzMiAgIiAiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzMyAgIiEiICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgMzQgICIiIiAqLyBDRFFVT1RFX0NFTkRRVU9URV9DV09SRF9DV09SRCwKKwkvKiAgMzUgICIjIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgMzYgICIkIiAqLyBDVkFSX0NWQVJfQ1dPUkRfQ1ZBUiwKKwkvKiAgMzcgICIlIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgMzggICImIiAqLyBDU1BDTF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgMzkgICInIiAqLyBDU1FVT1RFX0NXT1JEX0NFTkRRVU9URV9DV09SRCwKKwkvKiAgNDAgICIoIiAqLyBDU1BDTF9DV09SRF9DV09SRF9DTFAsCisJLyogIDQxICAiKSIgKi8gQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1JQLAorCS8qICA0MiAgIioiICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgNDMgICIrIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgNDQgICIsIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgNDUgICItIiAqLyBDV09SRF9DQ1RMX0NDVExfQ1dPUkQsCisJLyogIDQ2ICAiLiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDQ3ICAiLyIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA0OCAgIjAiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA0OSAgIjEiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1MCAgIjIiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1MSAgIjMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1MiAgIjQiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1MyAgIjUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1NCAgIjYiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1NSAgIjciICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1NiAgIjgiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1NyAgIjkiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA1OCAgIjoiICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgNTkgICI7IiAqLyBDU1BDTF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgNjAgICI8IiAqLyBDU1BDTF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgNjEgICI9IiAqLyBDV09SRF9DQ1RMX0NDVExfQ1dPUkQsCisJLyogIDYyICAiPiIgKi8gQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDYzICAiPyIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA2NCAgIkAiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2NSAgIkEiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2NiAgIkIiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2NyAgIkMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2OCAgIkQiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2OSAgIkUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3MCAgIkYiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3MSAgIkciICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3MiAgIkgiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3MyAgIkkiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3NCAgIkoiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3NSAgIksiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3NiAgIkwiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3NyAgIk0iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3OCAgIk4iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA3OSAgIk8iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4MCAgIlAiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4MSAgIlEiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4MiAgIlIiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4MyAgIlMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4NCAgIlQiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4NSAgIlUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4NiAgIlYiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4NyAgIlciICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4OCAgIlgiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA4OSAgIlkiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5MCAgIloiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5MSAgIlsiICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgOTIgICJcIiAqLyBDQkFDS19DQkFDS19DQ1RMX0NCQUNLLAorCS8qICA5MyAgIl0iICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgOTQgICJeIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgOTUgICJfIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgOTYgICJgIiAqLyBDQlFVT1RFX0NCUVVPVEVfQ1dPUkRfQ0JRVU9URSwKKwkvKiAgOTcgICJhIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgOTggICJiIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgOTkgICJjIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDAgICJkIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDEgICJlIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDIgICJmIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDMgICJnIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDQgICJoIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDUgICJpIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDYgICJqIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDcgICJrIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDggICJsIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMDkgICJtIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTAgICJuIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTEgICJvIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTIgICJwIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTMgICJxIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTQgICJyIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTUgICJzIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTYgICJ0IiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTcgICJ1IiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTggICJ2IiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMTkgICJ3IiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjAgICJ4IiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjEgICJ5IiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjIgICJ6IiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjMgICJ7IiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjQgICJ8IiAqLyBDU1BDTF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjUgICJ9IiAqLyBDRU5EVkFSX0NFTkRWQVJfQ1dPUkRfQ0VORFZBUiwKKwkvKiAxMjYgICJ+IiAqLyBDV09SRF9DQ1RMX0NDVExfQ1dPUkQsCisJLyogMTI3ICBkZWwgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogMTI4IDB4ODAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogMTI5IENUTEVTQyAgICAgICAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzMCBDVExWQVIgICAgICAgKi8gQ0NUTF9DQ1RMX0NDVExfQ0NUTCwKKwkvKiAxMzEgQ1RMRU5EVkFSICAgICovIENDVExfQ0NUTF9DQ1RMX0NDVEwsCisJLyogMTMyIENUTEJBQ0tRICAgICAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzMyBDVExRVU9URSAgICAgKi8gQ0NUTF9DQ1RMX0NDVExfQ0NUTCwKKwkvKiAxMzQgQ1RMQVJJICAgICAgICovIENDVExfQ0NUTF9DQ1RMX0NDVEwsCisJLyogMTM1IENUTEVOREFSSSAgICAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzNiBDVExRVU9URU1BUksgKi8gQ0NUTF9DQ1RMX0NDVExfQ0NUTCwKKwkvKiAxMzcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMzggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMzkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNDkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNTkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNjkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxNzkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxODkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxOTkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMDkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMTkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMjkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyMzAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNDkgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNTAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNTEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNTIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNTMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNTQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAyNTUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiBQRU9GICovICAgICBDRU5ERklMRV9DRU5ERklMRV9DRU5ERklMRV9DRU5ERklMRSwKKyMgaWYgRU5BQkxFX0FTSF9BTElBUworCS8qIFBFT0EgKi8gICAgIENTUENMX0NJR05fQ0lHTl9DSUdOLAorIyBlbmRpZgorfTsKKworIyBkZWZpbmUgU0lUKGMsIHN5bnRheCkgKChTX0lfVFtzeW50YXhfaW5kZXhfdGFibGVbY11dID4+ICgoc3ludGF4KSo0KSkgJiAweGYpCisKKyNlbmRpZiAgLyogIVVTRV9TSVRfRlVOQ1RJT04gKi8KKworCisvKiA9PT09PT09PT09PT0gQWxpYXMgaGFuZGxpbmcgKi8KKworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKworI2RlZmluZSBBTElBU0lOVVNFIDEKKyNkZWZpbmUgQUxJQVNERUFEICAyCisKK3N0cnVjdCBhbGlhcyB7CisJc3RydWN0IGFsaWFzICpuZXh0OworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsOworCWludCBmbGFnOworfTsKKworCitzdGF0aWMgc3RydWN0IGFsaWFzICoqYXRhYjsgLy8gW0FUQUJTSVpFXTsKKyNkZWZpbmUgSU5JVF9HX2FsaWFzKCkgZG8geyBcCisJYXRhYiA9IHh6YWxsb2MoQVRBQlNJWkUgKiBzaXplb2YoYXRhYlswXSkpOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyBzdHJ1Y3QgYWxpYXMgKioKK19fbG9va3VwYWxpYXMoY29uc3QgY2hhciAqbmFtZSkgeworCXVuc2lnbmVkIGludCBoYXNodmFsOworCXN0cnVjdCBhbGlhcyAqKmFwcDsKKwljb25zdCBjaGFyICpwOworCXVuc2lnbmVkIGludCBjaDsKKworCXAgPSBuYW1lOworCisJY2ggPSAodW5zaWduZWQgY2hhcikqcDsKKwloYXNodmFsID0gY2ggPDwgNDsKKwl3aGlsZSAoY2gpIHsKKwkJaGFzaHZhbCArPSBjaDsKKwkJY2ggPSAodW5zaWduZWQgY2hhcikqKytwOworCX0KKwlhcHAgPSAmYXRhYltoYXNodmFsICUgQVRBQlNJWkVdOworCisJZm9yICg7ICphcHA7IGFwcCA9ICYoKmFwcCktPm5leHQpIHsKKwkJaWYgKHN0cmNtcChuYW1lLCAoKmFwcCktPm5hbWUpID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGFwcDsKK30KKworc3RhdGljIHN0cnVjdCBhbGlhcyAqCitsb29rdXBhbGlhcyhjb25zdCBjaGFyICpuYW1lLCBpbnQgY2hlY2spCit7CisJc3RydWN0IGFsaWFzICphcCA9ICpfX2xvb2t1cGFsaWFzKG5hbWUpOworCisJaWYgKGNoZWNrICYmIGFwICYmIChhcC0+ZmxhZyAmIEFMSUFTSU5VU0UpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gYXA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWxpYXMgKgorZnJlZWFsaWFzKHN0cnVjdCBhbGlhcyAqYXApCit7CisJc3RydWN0IGFsaWFzICpuZXh0OworCisJaWYgKGFwLT5mbGFnICYgQUxJQVNJTlVTRSkgeworCQlhcC0+ZmxhZyB8PSBBTElBU0RFQUQ7CisJCXJldHVybiBhcDsKKwl9CisKKwluZXh0ID0gYXAtPm5leHQ7CisJZnJlZShhcC0+bmFtZSk7CisJZnJlZShhcC0+dmFsKTsKKwlmcmVlKGFwKTsKKwlyZXR1cm4gbmV4dDsKK30KKworc3RhdGljIHZvaWQKK3NldGFsaWFzKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwlzdHJ1Y3QgYWxpYXMgKmFwLCAqKmFwcDsKKworCWFwcCA9IF9fbG9va3VwYWxpYXMobmFtZSk7CisJYXAgPSAqYXBwOworCUlOVF9PRkY7CisJaWYgKGFwKSB7CisJCWlmICghKGFwLT5mbGFnICYgQUxJQVNJTlVTRSkpIHsKKwkJCWZyZWUoYXAtPnZhbCk7CisJCX0KKwkJYXAtPnZhbCA9IGNrc3RyZHVwKHZhbCk7CisJCWFwLT5mbGFnICY9IH5BTElBU0RFQUQ7CisJfSBlbHNlIHsKKwkJLyogbm90IGZvdW5kICovCisJCWFwID0gY2t6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGlhcykpOworCQlhcC0+bmFtZSA9IGNrc3RyZHVwKG5hbWUpOworCQlhcC0+dmFsID0gY2tzdHJkdXAodmFsKTsKKwkJLyphcC0+ZmxhZyA9IDA7IC0gY2t6YWxsb2MgZGlkIGl0ICovCisJCS8qYXAtPm5leHQgPSBOVUxMOyovCisJCSphcHAgPSBhcDsKKwl9CisJSU5UX09OOworfQorCitzdGF0aWMgaW50Cit1bmFsaWFzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFsaWFzICoqYXBwOworCisJYXBwID0gX19sb29rdXBhbGlhcyhuYW1lKTsKKworCWlmICgqYXBwKSB7CisJCUlOVF9PRkY7CisJCSphcHAgPSBmcmVlYWxpYXMoKmFwcCk7CisJCUlOVF9PTjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitybWFsaWFzZXModm9pZCkKK3sKKwlzdHJ1Y3QgYWxpYXMgKmFwLCAqKmFwcDsKKwlpbnQgaTsKKworCUlOVF9PRkY7CisJZm9yIChpID0gMDsgaSA8IEFUQUJTSVpFOyBpKyspIHsKKwkJYXBwID0gJmF0YWJbaV07CisJCWZvciAoYXAgPSAqYXBwOyBhcDsgYXAgPSAqYXBwKSB7CisJCQkqYXBwID0gZnJlZWFsaWFzKCphcHApOworCQkJaWYgKGFwID09ICphcHApIHsKKwkJCQlhcHAgPSAmYXAtPm5leHQ7CisJCQl9CisJCX0KKwl9CisJSU5UX09OOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRhbGlhcyhjb25zdCBzdHJ1Y3QgYWxpYXMgKmFwKQoreworCW91dDFmbXQoIiVzPSVzXG4iLCBhcC0+bmFtZSwgc2luZ2xlX3F1b3RlKGFwLT52YWwpKTsKK30KKworLyoKKyAqIFRPRE8gLSBzb3J0IG91dHB1dAorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQworYWxpYXNjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpuLCAqdjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWxpYXMgKmFwOworCisJaWYgKCFhcmd2WzFdKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBBVEFCU0laRTsgaSsrKSB7CisJCQlmb3IgKGFwID0gYXRhYltpXTsgYXA7IGFwID0gYXAtPm5leHQpIHsKKwkJCQlwcmludGFsaWFzKGFwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJd2hpbGUgKChuID0gKisrYXJndikgIT0gTlVMTCkgeworCQl2ID0gc3RyY2hyKG4rMSwgJz0nKTsKKwkJaWYgKHYgPT0gTlVMTCkgeyAvKiBuKzE6IGZ1bm55IGtzaCBzdHVmZiAqLworCQkJYXAgPSAqX19sb29rdXBhbGlhcyhuKTsKKwkJCWlmIChhcCA9PSBOVUxMKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogJXMgbm90IGZvdW5kXG4iLCAiYWxpYXMiLCBuKTsKKwkJCQlyZXQgPSAxOworCQkJfSBlbHNlCisJCQkJcHJpbnRhbGlhcyhhcCk7CisJCX0gZWxzZSB7CisJCQkqdisrID0gJ1wwJzsKKwkJCXNldGFsaWFzKG4sIHYpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK3VuYWxpYXNjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJaW50IGk7CisKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJhIikpICE9ICdcMCcpIHsKKwkJaWYgKGkgPT0gJ2EnKSB7CisJCQlybWFsaWFzZXMoKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWZvciAoaSA9IDA7ICphcmdwdHI7IGFyZ3B0cisrKSB7CisJCWlmICh1bmFsaWFzKCphcmdwdHIpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBub3QgZm91bmRcbiIsICJ1bmFsaWFzIiwgKmFyZ3B0cik7CisJCQlpID0gMTsKKwkJfQorCX0KKworCXJldHVybiBpOworfQorCisjZW5kaWYgLyogQVNIX0FMSUFTICovCisKKworLyogPT09PT09PT09PT09IGpvYnMuYyAqLworCisvKiBNb2RlIGFyZ3VtZW50IHRvIGZvcmtzaGVsbC4gIERvbid0IGNoYW5nZSBGT1JLX0ZHIG9yIEZPUktfQkcuICovCisjZGVmaW5lIEZPUktfRkcgICAgMAorI2RlZmluZSBGT1JLX0JHICAgIDEKKyNkZWZpbmUgRk9SS19OT0pPQiAyCisKKy8qIG1vZGUgZmxhZ3MgZm9yIHNob3dqb2IocykgKi8KKyNkZWZpbmUgU0hPV19PTkxZX1BHSUQgIDB4MDEgICAgLyogc2hvdyBvbmx5IHBnaWQgKGpvYnMgLXApICovCisjZGVmaW5lIFNIT1dfUElEUyAgICAgICAweDAyICAgIC8qIHNob3cgaW5kaXZpZHVhbCBwaWRzLCBub3QganVzdCBvbmUgbGluZSBwZXIgam9iICovCisjZGVmaW5lIFNIT1dfQ0hBTkdFRCAgICAweDA0ICAgIC8qIG9ubHkgam9icyB3aG9zZSBzdGF0ZSBoYXMgY2hhbmdlZCAqLworCisvKgorICogQSBqb2Igc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgam9iLiAgQSBqb2IgaXMgZWl0aGVyIGEKKyAqIHNpbmdsZSBwcm9jZXNzIG9yIGEgc2V0IG9mIHByb2Nlc3NlcyBjb250YWluZWQgaW4gYSBwaXBlbGluZS4gIEluIHRoZQorICogbGF0dGVyIGNhc2UsIHBpZGxpc3Qgd2lsbCBiZSBub24tTlVMTCwgYW5kIHdpbGwgcG9pbnQgdG8gYSAtMSB0ZXJtaW5hdGVkCisgKiBhcnJheSBvZiBwaWRzLgorICovCitzdHJ1Y3QgcHJvY3N0YXQgeworCXBpZF90ICAgcHNfcGlkOyAgICAgICAgIC8qIHByb2Nlc3MgaWQgKi8KKwlpbnQgICAgIHBzX3N0YXR1czsgICAgICAvKiBsYXN0IHByb2Nlc3Mgc3RhdHVzIGZyb20gd2FpdCgpICovCisJY2hhciAgICAqcHNfY21kOyAgICAgICAgLyogdGV4dCBvZiBjb21tYW5kIGJlaW5nIHJ1biAqLworfTsKKworc3RydWN0IGpvYiB7CisJc3RydWN0IHByb2NzdGF0IHBzMDsgICAgLyogc3RhdHVzIG9mIHByb2Nlc3MgKi8KKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzOyAgICAvKiBzdGF0dXMgb3IgcHJvY2Vzc2VzIHdoZW4gbW9yZSB0aGFuIG9uZSAqLworI2lmIEpPQlMKKwlpbnQgc3RvcHN0YXR1czsgICAgICAgICAvKiBzdGF0dXMgb2YgYSBzdG9wcGVkIGpvYiAqLworI2VuZGlmCisJdWludDMyX3QKKwkJbnByb2NzOiAxNiwgICAgIC8qIG51bWJlciBvZiBwcm9jZXNzZXMgKi8KKwkJc3RhdGU6IDgsCisjZGVmaW5lIEpPQlJVTk5JTkcgICAgICAwICAgICAgIC8qIGF0IGxlYXN0IG9uZSBwcm9jIHJ1bm5pbmcgKi8KKyNkZWZpbmUgSk9CU1RPUFBFRCAgICAgIDEgICAgICAgLyogYWxsIHByb2NzIGFyZSBzdG9wcGVkICovCisjZGVmaW5lIEpPQkRPTkUgICAgICAgICAyICAgICAgIC8qIGFsbCBwcm9jcyBhcmUgY29tcGxldGVkICovCisjaWYgSk9CUworCQlzaWdpbnQ6IDEsICAgICAgLyogam9iIHdhcyBraWxsZWQgYnkgU0lHSU5UICovCisJCWpvYmN0bDogMSwgICAgICAvKiBqb2IgcnVubmluZyB1bmRlciBqb2IgY29udHJvbCAqLworI2VuZGlmCisJCXdhaXRlZDogMSwgICAgICAvKiB0cnVlIGlmIHRoaXMgZW50cnkgaGFzIGJlZW4gd2FpdGVkIGZvciAqLworCQl1c2VkOiAxLCAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGVudHJ5IGlzIGluIHVzZWQgKi8KKwkJY2hhbmdlZDogMTsgICAgIC8qIHRydWUgaWYgc3RhdHVzIGhhcyBjaGFuZ2VkICovCisJc3RydWN0IGpvYiAqcHJldl9qb2I7ICAgLyogcHJldmlvdXMgam9iICovCit9OworCitzdGF0aWMgc3RydWN0IGpvYiAqbWFrZWpvYigvKnVuaW9uIG5vZGUgKiwqLyBpbnQpOworc3RhdGljIGludCBmb3Jrc2hlbGwoc3RydWN0IGpvYiAqLCB1bmlvbiBub2RlICosIGludCk7CitzdGF0aWMgaW50IHdhaXRmb3Jqb2Ioc3RydWN0IGpvYiAqKTsKKworI2lmICFKT0JTCitlbnVtIHsgZG9pbmdfam9iY3RsID0gMCB9OworI2RlZmluZSBzZXRqb2JjdGwob24pIGRvIHt9IHdoaWxlICgwKQorI2Vsc2UKK3N0YXRpYyBzbWFsbGludCBkb2luZ19qb2JjdGw7IC8vcmVmZXJlbmNlczo4CitzdGF0aWMgdm9pZCBzZXRqb2JjdGwoaW50KTsKKyNlbmRpZgorCisvKgorICogSWdub3JlIGEgc2lnbmFsLgorICovCitzdGF0aWMgdm9pZAoraWdub3Jlc2lnKGludCBzaWdubykKK3sKKwkvKiBBdm9pZCB1bm5lY2Vzc2FyeSBzeXN0ZW0gY2FsbHMuIElzIGl0IGFscmVhZHkgU0lHX0lHTmVkPyAqLworCWlmIChzaWdtb2RlW3NpZ25vIC0gMV0gIT0gU19JR04gJiYgc2lnbW9kZVtzaWdubyAtIDFdICE9IFNfSEFSRF9JR04pIHsKKwkJLyogTm8sIG5lZWQgdG8gZG8gaXQgKi8KKwkJc2lnbmFsKHNpZ25vLCBTSUdfSUdOKTsKKwl9CisJc2lnbW9kZVtzaWdubyAtIDFdID0gU19IQVJEX0lHTjsKK30KKworLyoKKyAqIE9ubHkgb25lIHVzYWdlIHNpdGUgLSBpbiBzZXRzaWduYWwoKQorICovCitzdGF0aWMgdm9pZAorc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25vKQoreworCWdvdHNpZ1tzaWdubyAtIDFdID0gMTsKKworCWlmIChzaWdubyA9PSBTSUdJTlQgJiYgIXRyYXBbU0lHSU5UXSkgeworCQlpZiAoIXN1cHByZXNzX2ludCkgeworCQkJcGVuZGluZ19zaWcgPSAwOworCQkJcmFpc2VfaW50ZXJydXB0KCk7IC8qIGRvZXMgbm90IHJldHVybiAqLworCQl9CisJCXBlbmRpbmdfaW50ID0gMTsKKwl9IGVsc2UgeworCQlwZW5kaW5nX3NpZyA9IHNpZ25vOworCX0KK30KKworLyoKKyAqIFNldCB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIHRoZSBzcGVjaWZpZWQgc2lnbmFsLiAgVGhlIHJvdXRpbmUgZmlndXJlcworICogb3V0IHdoYXQgaXQgc2hvdWxkIGJlIHNldCB0by4KKyAqLworc3RhdGljIHZvaWQKK3NldHNpZ25hbChpbnQgc2lnbm8pCit7CisJY2hhciAqdDsKKwljaGFyIGN1cl9hY3QsIG5ld19hY3Q7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisKKwl0ID0gdHJhcFtzaWdub107CisJbmV3X2FjdCA9IFNfREZMOworCWlmICh0ICE9IE5VTEwpIHsgLyogdHJhcCBmb3IgdGhpcyBzaWcgaXMgc2V0ICovCisJCW5ld19hY3QgPSBTX0NBVENIOworCQlpZiAodFswXSA9PSAnXDAnKSAvKiB0cmFwIGlzICIiOiBpZ25vcmUgdGhpcyBzaWcgKi8KKwkJCW5ld19hY3QgPSBTX0lHTjsKKwl9CisKKwlpZiAocm9vdHNoZWxsICYmIG5ld19hY3QgPT0gU19ERkwpIHsKKwkJc3dpdGNoIChzaWdubykgeworCQljYXNlIFNJR0lOVDoKKwkJCWlmIChpZmxhZyB8fCBtaW51c2MgfHwgc2ZsYWcgPT0gMCkKKwkJCQluZXdfYWN0ID0gU19DQVRDSDsKKwkJCWJyZWFrOworCQljYXNlIFNJR1FVSVQ6CisjaWYgREVCVUcKKwkJCWlmIChkZWJ1ZykKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJLyogbWFuIGJhc2g6CisJCQkgKiAiSW4gYWxsIGNhc2VzLCBiYXNoIGlnbm9yZXMgU0lHUVVJVC4gTm9uLWJ1aWx0aW4KKwkJCSAqIGNvbW1hbmRzIHJ1biBieSBiYXNoIGhhdmUgc2lnbmFsIGhhbmRsZXJzCisJCQkgKiBzZXQgdG8gdGhlIHZhbHVlcyBpbmhlcml0ZWQgYnkgdGhlIHNoZWxsCisJCQkgKiBmcm9tIGl0cyBwYXJlbnQiLiAqLworCQkJbmV3X2FjdCA9IFNfSUdOOworCQkJYnJlYWs7CisJCWNhc2UgU0lHVEVSTToKKwkJCWlmIChpZmxhZykKKwkJCQluZXdfYWN0ID0gU19JR047CisJCQlicmVhazsKKyNpZiBKT0JTCisJCWNhc2UgU0lHVFNUUDoKKwkJY2FzZSBTSUdUVE9VOgorCQkJaWYgKG1mbGFnKQorCQkJCW5ld19hY3QgPSBTX0lHTjsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwl9CisvL1RPRE86IGlmICFyb290c2hlbGwsIHdlIHJlc2V0IFNJR1FVSVQgdG8gREZMLAorLy93aGVyZWFzIHdlIGhhdmUgdG8gcmVzdG9yZSBpdCB0byB3aGF0IHNoZWxsIGdvdCBvbiBlbnRyeQorLy9mcm9tIHRoZSBwYXJlbnQuIFNlZSBjb21tZW50IGFib3ZlCisKKwl0ID0gJnNpZ21vZGVbc2lnbm8gLSAxXTsKKwljdXJfYWN0ID0gKnQ7CisJaWYgKGN1cl9hY3QgPT0gMCkgeworCQkvKiBjdXJyZW50IHNldHRpbmcgaXMgbm90IHlldCBrbm93biAqLworCQlpZiAoc2lnYWN0aW9uKHNpZ25vLCBOVUxMLCAmYWN0KSkgeworCQkJLyogcHJldGVuZCBpdCB3b3JrZWQ7IG1heWJlIHdlIHNob3VsZCBnaXZlIGEgd2FybmluZywKKwkJCSAqIGJ1dCBvdGhlciBzaGVsbHMgZG9uJ3QuIFdlIGRvbid0IGFsdGVyIHNpZ21vZGUsCisJCQkgKiBzbyB3ZSByZXRyeSBldmVyeSB0aW1lLgorCQkJICogYnR3LCBpbiBMaW51eCBpdCBuZXZlciBmYWlscy4gLS12ZGEgKi8KKwkJCXJldHVybjsKKwkJfQorCQlpZiAoYWN0LnNhX2hhbmRsZXIgPT0gU0lHX0lHTikgeworCQkJY3VyX2FjdCA9IFNfSEFSRF9JR047CisJCQlpZiAobWZsYWcKKwkJCSAmJiAoc2lnbm8gPT0gU0lHVFNUUCB8fCBzaWdubyA9PSBTSUdUVElOIHx8IHNpZ25vID09IFNJR1RUT1UpCisJCQkpIHsKKwkJCQljdXJfYWN0ID0gU19JR047ICAgLyogZG9uJ3QgaGFyZCBpZ25vcmUgdGhlc2UgKi8KKwkJCX0KKwkJfQorCX0KKwlpZiAoY3VyX2FjdCA9PSBTX0hBUkRfSUdOIHx8IGN1cl9hY3QgPT0gbmV3X2FjdCkKKwkJcmV0dXJuOworCisJYWN0LnNhX2hhbmRsZXIgPSBTSUdfREZMOworCXN3aXRjaCAobmV3X2FjdCkgeworCWNhc2UgU19DQVRDSDoKKwkJYWN0LnNhX2hhbmRsZXIgPSBzaWduYWxfaGFuZGxlcjsKKwkJYnJlYWs7CisJY2FzZSBTX0lHTjoKKwkJYWN0LnNhX2hhbmRsZXIgPSBTSUdfSUdOOworCQlicmVhazsKKwl9CisKKwkvKiBmbGFncyBhbmQgbWFzayBtYXR0ZXIgb25seSBpZiAhREZMIGFuZCAhSUdOLCBidXQgd2UgZG8gaXQKKwkgKiBmb3IgYWxsIGNhc2VzIGZvciBtb3JlIGRldGVybWluaXN0aWMgYmVoYXZpb3I6CisJICovCisJYWN0LnNhX2ZsYWdzID0gMDsKKwlzaWdmaWxsc2V0KCZhY3Quc2FfbWFzayk7CisKKwlzaWdhY3Rpb25fc2V0KHNpZ25vLCAmYWN0KTsKKworCSp0ID0gbmV3X2FjdDsKK30KKworLyogbW9kZSBmbGFncyBmb3Igc2V0X2N1cmpvYiAqLworI2RlZmluZSBDVVJfREVMRVRFIDIKKyNkZWZpbmUgQ1VSX1JVTk5JTkcgMQorI2RlZmluZSBDVVJfU1RPUFBFRCAwCisKKy8qIG1vZGUgZmxhZ3MgZm9yIGRvd2FpdCAqLworI2RlZmluZSBET1dBSVRfTk9OQkxPQ0sgV05PSEFORworI2RlZmluZSBET1dBSVRfQkxPQ0sgICAgMAorCisjaWYgSk9CUworLyogcGdycCBvZiBzaGVsbCBvbiBpbnZvY2F0aW9uICovCitzdGF0aWMgaW50IGluaXRpYWxwZ3JwOyAvL3JlZmVyZW5jZXM6Mgorc3RhdGljIGludCB0dHlmZCA9IC0xOyAvLzUKKyNlbmRpZgorLyogYXJyYXkgb2Ygam9icyAqLworc3RhdGljIHN0cnVjdCBqb2IgKmpvYnRhYjsgLy81CisvKiBzaXplIG9mIGFycmF5ICovCitzdGF0aWMgdW5zaWduZWQgbmpvYnM7IC8vNAorLyogY3VycmVudCBqb2IgKi8KK3N0YXRpYyBzdHJ1Y3Qgam9iICpjdXJqb2I7IC8vbG90cworLyogbnVtYmVyIG9mIHByZXN1bWVkIGxpdmluZyB1bnRyYWNrZWQgam9icyAqLworc3RhdGljIGludCBqb2JsZXNzOyAvLzQKKworc3RhdGljIHZvaWQKK3NldF9jdXJqb2Ioc3RydWN0IGpvYiAqanAsIHVuc2lnbmVkIG1vZGUpCit7CisJc3RydWN0IGpvYiAqanAxOworCXN0cnVjdCBqb2IgKipqcHAsICoqY3VycDsKKworCS8qIGZpcnN0IHJlbW92ZSBmcm9tIGxpc3QgKi8KKwlqcHAgPSBjdXJwID0gJmN1cmpvYjsKKwl3aGlsZSAoMSkgeworCQlqcDEgPSAqanBwOworCQlpZiAoanAxID09IGpwKQorCQkJYnJlYWs7CisJCWpwcCA9ICZqcDEtPnByZXZfam9iOworCX0KKwkqanBwID0ganAxLT5wcmV2X2pvYjsKKworCS8qIFRoZW4gcmUtaW5zZXJ0IGluIGNvcnJlY3QgcG9zaXRpb24gKi8KKwlqcHAgPSBjdXJwOworCXN3aXRjaCAobW9kZSkgeworCWRlZmF1bHQ6CisjaWYgREVCVUcKKwkJYWJvcnQoKTsKKyNlbmRpZgorCWNhc2UgQ1VSX0RFTEVURToKKwkJLyogam9iIGJlaW5nIGRlbGV0ZWQgKi8KKwkJYnJlYWs7CisJY2FzZSBDVVJfUlVOTklORzoKKwkJLyogbmV3bHkgY3JlYXRlZCBqb2Igb3IgYmFja2dyb3VuZGVkIGpvYiwKKwkJICAgcHV0IGFmdGVyIGFsbCBzdG9wcGVkIGpvYnMuICovCisJCXdoaWxlICgxKSB7CisJCQlqcDEgPSAqanBwOworI2lmIEpPQlMKKwkJCWlmICghanAxIHx8IGpwMS0+c3RhdGUgIT0gSk9CU1RPUFBFRCkKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJanBwID0gJmpwMS0+cHJldl9qb2I7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKyNpZiBKT0JTCisJY2FzZSBDVVJfU1RPUFBFRDoKKyNlbmRpZgorCQkvKiBuZXdseSBzdG9wcGVkIGpvYiAtIGJlY29tZXMgY3Vyam9iICovCisJCWpwLT5wcmV2X2pvYiA9ICpqcHA7CisJCSpqcHAgPSBqcDsKKwkJYnJlYWs7CisJfQorfQorCisjaWYgSk9CUyB8fCBERUJVRworc3RhdGljIGludAoram9ibm8oY29uc3Qgc3RydWN0IGpvYiAqanApCit7CisJcmV0dXJuIGpwIC0gam9idGFiICsgMTsKK30KKyNlbmRpZgorCisvKgorICogQ29udmVydCBhIGpvYiBuYW1lIHRvIGEgam9iIHN0cnVjdHVyZS4KKyAqLworI2lmICFKT0JTCisjZGVmaW5lIGdldGpvYihuYW1lLCBnZXRjdGwpIGdldGpvYihuYW1lKQorI2VuZGlmCitzdGF0aWMgc3RydWN0IGpvYiAqCitnZXRqb2IoY29uc3QgY2hhciAqbmFtZSwgaW50IGdldGN0bCkKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKwlzdHJ1Y3Qgam9iICpmb3VuZDsKKwljb25zdCBjaGFyICplcnJfbXNnID0gIiVzOiBubyBzdWNoIGpvYiI7CisJdW5zaWduZWQgbnVtOworCWludCBjOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqKCptYXRjaCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisJanAgPSBjdXJqb2I7CisJcCA9IG5hbWU7CisJaWYgKCFwKQorCQlnb3RvIGN1cnJlbnRqb2I7CisKKwlpZiAoKnAgIT0gJyUnKQorCQlnb3RvIGVycjsKKworCWMgPSAqKytwOworCWlmICghYykKKwkJZ290byBjdXJyZW50am9iOworCisJaWYgKCFwWzFdKSB7CisJCWlmIChjID09ICcrJyB8fCBjID09ICclJykgeworIGN1cnJlbnRqb2I6CisJCQllcnJfbXNnID0gIk5vIGN1cnJlbnQgam9iIjsKKwkJCWdvdG8gY2hlY2s7CisJCX0KKwkJaWYgKGMgPT0gJy0nKSB7CisJCQlpZiAoanApCisJCQkJanAgPSBqcC0+cHJldl9qb2I7CisJCQllcnJfbXNnID0gIk5vIHByZXZpb3VzIGpvYiI7CisgY2hlY2s6CisJCQlpZiAoIWpwKQorCQkJCWdvdG8gZXJyOworCQkJZ290byBnb3RpdDsKKwkJfQorCX0KKworCWlmIChpc19udW1iZXIocCkpIHsKKwkJbnVtID0gYXRvaShwKTsKKwkJaWYgKG51bSA8IG5qb2JzKSB7CisJCQlqcCA9IGpvYnRhYiArIG51bSAtIDE7CisJCQlpZiAoanAtPnVzZWQpCisJCQkJZ290byBnb3RpdDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJbWF0Y2ggPSBwcmVmaXg7CisJaWYgKCpwID09ICc/JykgeworCQltYXRjaCA9IHN0cnN0cjsKKwkJcCsrOworCX0KKworCWZvdW5kID0gTlVMTDsKKwl3aGlsZSAoanApIHsKKwkJaWYgKG1hdGNoKGpwLT5wc1swXS5wc19jbWQsIHApKSB7CisJCQlpZiAoZm91bmQpCisJCQkJZ290byBlcnI7CisJCQlmb3VuZCA9IGpwOworCQkJZXJyX21zZyA9ICIlczogYW1iaWd1b3VzIjsKKwkJfQorCQlqcCA9IGpwLT5wcmV2X2pvYjsKKwl9CisJaWYgKCFmb3VuZCkKKwkJZ290byBlcnI7CisJanAgPSBmb3VuZDsKKworIGdvdGl0OgorI2lmIEpPQlMKKwllcnJfbXNnID0gImpvYiAlcyBub3QgY3JlYXRlZCB1bmRlciBqb2IgY29udHJvbCI7CisJaWYgKGdldGN0bCAmJiBqcC0+am9iY3RsID09IDApCisJCWdvdG8gZXJyOworI2VuZGlmCisJcmV0dXJuIGpwOworIGVycjoKKwlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcihlcnJfbXNnLCBuYW1lKTsKK30KKworLyoKKyAqIE1hcmsgYSBqb2Igc3RydWN0dXJlIGFzIHVudXNlZC4KKyAqLworc3RhdGljIHZvaWQKK2ZyZWVqb2Ioc3RydWN0IGpvYiAqanApCit7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKwlpbnQgaTsKKworCUlOVF9PRkY7CisJZm9yIChpID0ganAtPm5wcm9jcywgcHMgPSBqcC0+cHM7IC0taSA+PSAwOyBwcysrKSB7CisJCWlmIChwcy0+cHNfY21kICE9IG51bGxzdHIpCisJCQlmcmVlKHBzLT5wc19jbWQpOworCX0KKwlpZiAoanAtPnBzICE9ICZqcC0+cHMwKQorCQlmcmVlKGpwLT5wcyk7CisJanAtPnVzZWQgPSAwOworCXNldF9jdXJqb2IoanAsIENVUl9ERUxFVEUpOworCUlOVF9PTjsKK30KKworI2lmIEpPQlMKK3N0YXRpYyB2b2lkCit4dGNzZXRwZ3JwKGludCBmZCwgcGlkX3QgcGdycCkKK3sKKwlpZiAodGNzZXRwZ3JwKGZkLCBwZ3JwKSkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImNhbid0IHNldCB0dHkgcHJvY2VzcyBncm91cCAoJW0pIik7Cit9CisKKy8qCisgKiBUdXJuIGpvYiBjb250cm9sIG9uIGFuZCBvZmYuCisgKgorICogTm90ZTogIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHRoaXJkIGFyZyB0byBpb2N0bCBpcyBhIGNoYXJhY3RlcgorICogcG9pbnRlciwgd2hpY2ggaXMgdHJ1ZSBvbiBCZXJrZWxleSBzeXN0ZW1zIGJ1dCBub3QgU3lzdGVtIFYuICBTaW5jZQorICogU3lzdGVtIFYgZG9lc24ndCBoYXZlIGpvYiBjb250cm9sIHlldCwgdGhpcyBpc24ndCBhIHByb2JsZW0gbm93LgorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCitzdGF0aWMgdm9pZAorc2V0am9iY3RsKGludCBvbikKK3sKKwlpbnQgZmQ7CisJaW50IHBncnA7CisKKwlpZiAob24gPT0gZG9pbmdfam9iY3RsIHx8IHJvb3RzaGVsbCA9PSAwKQorCQlyZXR1cm47CisJaWYgKG9uKSB7CisJCWludCBvZmQ7CisJCW9mZCA9IGZkID0gb3BlbihfUEFUSF9UVFksIE9fUkRXUik7CisJCWlmIChmZCA8IDApIHsKKwkvKiBCVFcsIGJhc2ggd2lsbCB0cnkgdG8gb3Blbih0dHluYW1lKDApKSBpZiBvcGVuKCIvZGV2L3R0eSIpIGZhaWxzLgorCSAqIFRoYXQgc29tZXRpbWVzIGhlbHBzIHRvIGFjcXVpcmUgY29udHJvbGxpbmcgdHR5LgorCSAqIE9idmlvdXNseSwgYSB3b3JrYXJvdW5kIGZvciBidWdzIHdoZW4gc29tZW9uZQorCSAqIGZhaWxlZCB0byBwcm92aWRlIGEgY29udHJvbGxpbmcgdHR5IHRvIGJhc2ghIDopICovCisJCQlmZCA9IDI7CisJCQl3aGlsZSAoIWlzYXR0eShmZCkpCisJCQkJaWYgKC0tZmQgPCAwKQorCQkJCQlnb3RvIG91dDsKKwkJfQorCQlmZCA9IGZjbnRsKGZkLCBGX0RVUEZELCAxMCk7CisJCWlmIChvZmQgPj0gMCkKKwkJCWNsb3NlKG9mZCk7CisJCWlmIChmZCA8IDApCisJCQlnb3RvIG91dDsKKwkJLyogZmQgaXMgYSB0dHkgYXQgdGhpcyBwb2ludCAqLworCQljbG9zZV9vbl9leGVjX29uKGZkKTsKKwkJd2hpbGUgKDEpIHsgLyogd2hpbGUgd2UgYXJlIGluIHRoZSBiYWNrZ3JvdW5kICovCisJCQlwZ3JwID0gdGNnZXRwZ3JwKGZkKTsKKwkJCWlmIChwZ3JwIDwgMCkgeworIG91dDoKKwkJCQlhc2hfbXNnKCJjYW4ndCBhY2Nlc3MgdHR5OyBqb2IgY29udHJvbCB0dXJuZWQgb2ZmIik7CisJCQkJbWZsYWcgPSBvbiA9IDA7CisJCQkJZ290byBjbG9zZTsKKwkJCX0KKwkJCWlmIChwZ3JwID09IGdldHBncnAoKSkKKwkJCQlicmVhazsKKwkJCWtpbGxwZygwLCBTSUdUVElOKTsKKwkJfQorCQlpbml0aWFscGdycCA9IHBncnA7CisKKwkJc2V0c2lnbmFsKFNJR1RTVFApOworCQlzZXRzaWduYWwoU0lHVFRPVSk7CisJCXNldHNpZ25hbChTSUdUVElOKTsKKwkJcGdycCA9IHJvb3RwaWQ7CisJCXNldHBnaWQoMCwgcGdycCk7CisJCXh0Y3NldHBncnAoZmQsIHBncnApOworCX0gZWxzZSB7CisJCS8qIHR1cm5pbmcgam9iIGNvbnRyb2wgb2ZmICovCisJCWZkID0gdHR5ZmQ7CisJCXBncnAgPSBpbml0aWFscGdycDsKKwkJLyogd2FzIHh0Y3NldHBncnAsIGJ1dCB0aGlzIGNhbiBtYWtlIGV4aXRpbmcgYXNoCisJCSAqIGxvb3AgZm9yZXZlciBpZiBwdHkgaXMgYWxyZWFkeSBkZWxldGVkICovCisJCXRjc2V0cGdycChmZCwgcGdycCk7CisJCXNldHBnaWQoMCwgcGdycCk7CisJCXNldHNpZ25hbChTSUdUU1RQKTsKKwkJc2V0c2lnbmFsKFNJR1RUT1UpOworCQlzZXRzaWduYWwoU0lHVFRJTik7CisgY2xvc2U6CisJCWlmIChmZCA+PSAwKQorCQkJY2xvc2UoZmQpOworCQlmZCA9IC0xOworCX0KKwl0dHlmZCA9IGZkOworCWRvaW5nX2pvYmN0bCA9IG9uOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQwora2lsbGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ3ZbMV0gJiYgc3RyY21wKGFyZ3ZbMV0sICItbCIpICE9IDApIHsKKwkJaW50IGkgPSAxOworCQlkbyB7CisJCQlpZiAoYXJndltpXVswXSA9PSAnJScpIHsKKwkJCQkvKgorCQkJCSAqICJraWxsICVOIiAtIGpvYiBraWxsCisJCQkJICogQ29udmVydGluZyB0byBwZ3JwIC8gcGlkIGtpbGwKKwkJCQkgKi8KKwkJCQlzdHJ1Y3Qgam9iICpqcDsKKwkJCQljaGFyICpkc3Q7CisJCQkJaW50IGosIG47CisKKwkJCQlqcCA9IGdldGpvYihhcmd2W2ldLCAwKTsKKwkJCQkvKgorCQkJCSAqIEluIGpvYnMgc3RhcnRlZCB1bmRlciBqb2IgY29udHJvbCwgd2Ugc2lnbmFsCisJCQkJICogZW50aXJlIHByb2Nlc3MgZ3JvdXAgYnkga2lsbCAtUEdSUF9JRC4KKwkJCQkgKiBUaGlzIGhhcHBlbnMsIGYuZS4sIGluIGludGVyYWN0aXZlIHNoZWxsLgorCQkJCSAqCisJCQkJICogT3RoZXJ3aXNlLCB3ZSBzaWduYWwgZWFjaCBjaGlsZCB2aWEKKwkJCQkgKiBraWxsIFBJRDEgUElEMiBQSUQzLgorCQkJCSAqIFRlc3RjYXNlczoKKwkJCQkgKiBzaCAtYyAnc2xlZXAgMXxzbGVlcCAxICYga2lsbCAlMScKKwkJCQkgKiBzaCAtYyAndHJ1ZXxzbGVlcCAyICYgc2xlZXAgMTsga2lsbCAlMScKKwkJCQkgKiBzaCAtYyAndHJ1ZXxzbGVlcCAxICYgc2xlZXAgMjsga2lsbCAlMScKKwkJCQkgKi8KKwkJCQluID0ganAtPm5wcm9jczsgLyogY2FuJ3QgYmUgMCAoSSBob3BlKSAqLworCQkJCWlmIChqcC0+am9iY3RsKQorCQkJCQluID0gMTsKKwkJCQlkc3QgPSBhbGxvY2EobiAqIHNpemVvZihpbnQpKjQpOworCQkJCWFyZ3ZbaV0gPSBkc3Q7CisJCQkJZm9yIChqID0gMDsgaiA8IG47IGorKykgeworCQkJCQlzdHJ1Y3QgcHJvY3N0YXQgKnBzID0gJmpwLT5wc1tqXTsKKwkJCQkJLyogU2tpcCBub24tcnVubmluZyBhbmQgbm90LXN0b3BwZWQgbWVtYmVycworCQkJCQkgKiAoaS5lLiBkZWFkIG1lbWJlcnMpIG9mIHRoZSBqb2IKKwkJCQkJICovCisJCQkJCWlmIChwcy0+cHNfc3RhdHVzICE9IC0xICYmICFXSUZTVE9QUEVEKHBzLT5wc19zdGF0dXMpKQorCQkJCQkJY29udGludWU7CisJCQkJCS8qCisJCQkJCSAqIGtpbGxfbWFpbiBoYXMgbWF0Y2hpbmcgY29kZSB0byBleHBlY3QKKwkJCQkJICogbGVhZGluZyBzcGFjZS4gTmVlZGVkIHRvIG5vdCBjb25mdXNlCisJCQkJCSAqIG5lZ2F0aXZlIHBpZHMgd2l0aCAia2lsbCAtU0lHTkFMX05PIiBzeW50YXgKKwkJCQkJICovCisJCQkJCWRzdCArPSBzcHJpbnRmKGRzdCwganAtPmpvYmN0bCA/ICIgLSV1IiA6ICIgJXUiLCAoaW50KXBzLT5wc19waWQpOworCQkJCX0KKwkJCQkqZHN0ID0gJ1wwJzsKKwkJCX0KKwkJfSB3aGlsZSAoYXJndlsrK2ldKTsKKwl9CisJcmV0dXJuIGtpbGxfbWFpbihhcmdjLCBhcmd2KTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dwaXBlKHN0cnVjdCBqb2IgKmpwIC8qLCBGSUxFICpvdXQqLykKK3sKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzOworCXN0cnVjdCBwcm9jc3RhdCAqcHNlbmQ7CisKKwlwc2VuZCA9IGpwLT5wcyArIGpwLT5ucHJvY3M7CisJZm9yIChwcyA9IGpwLT5wcyArIDE7IHBzIDwgcHNlbmQ7IHBzKyspCisJCXByaW50ZigiIHwgJXMiLCBwcy0+cHNfY21kKTsKKwlvdXRjc2xvdygnXG4nLCBzdGRvdXQpOworCWZsdXNoX3N0ZG91dF9zdGRlcnIoKTsKK30KKworCitzdGF0aWMgaW50CityZXN0YXJ0am9iKHN0cnVjdCBqb2IgKmpwLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzOworCWludCBpOworCWludCBzdGF0dXM7CisJcGlkX3QgcGdpZDsKKworCUlOVF9PRkY7CisJaWYgKGpwLT5zdGF0ZSA9PSBKT0JET05FKQorCQlnb3RvIG91dDsKKwlqcC0+c3RhdGUgPSBKT0JSVU5OSU5HOworCXBnaWQgPSBqcC0+cHNbMF0ucHNfcGlkOworCWlmIChtb2RlID09IEZPUktfRkcpCisJCXh0Y3NldHBncnAodHR5ZmQsIHBnaWQpOworCWtpbGxwZyhwZ2lkLCBTSUdDT05UKTsKKwlwcyA9IGpwLT5wczsKKwlpID0ganAtPm5wcm9jczsKKwlkbyB7CisJCWlmIChXSUZTVE9QUEVEKHBzLT5wc19zdGF0dXMpKSB7CisJCQlwcy0+cHNfc3RhdHVzID0gLTE7CisJCX0KKwkJcHMrKzsKKwl9IHdoaWxlICgtLWkpOworIG91dDoKKwlzdGF0dXMgPSAobW9kZSA9PSBGT1JLX0ZHKSA/IHdhaXRmb3Jqb2IoanApIDogMDsKKwlJTlRfT047CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2ZnX2JnY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGpvYiAqanA7CisJaW50IG1vZGU7CisJaW50IHJldHZhbDsKKworCW1vZGUgPSAoKiphcmd2ID09ICdmJykgPyBGT1JLX0ZHIDogRk9SS19CRzsKKwluZXh0b3B0KG51bGxzdHIpOworCWFyZ3YgPSBhcmdwdHI7CisJZG8geworCQlqcCA9IGdldGpvYigqYXJndiwgMSk7CisJCWlmIChtb2RlID09IEZPUktfQkcpIHsKKwkJCXNldF9jdXJqb2IoanAsIENVUl9SVU5OSU5HKTsKKwkJCXByaW50ZigiWyVkXSAiLCBqb2JubyhqcCkpOworCQl9CisJCW91dDFzdHIoanAtPnBzWzBdLnBzX2NtZCk7CisJCXNob3dwaXBlKGpwIC8qLCBzdGRvdXQqLyk7CisJCXJldHZhbCA9IHJlc3RhcnRqb2IoanAsIG1vZGUpOworCX0gd2hpbGUgKCphcmd2ICYmICorK2FyZ3YpOworCXJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorc3ByaW50X3N0YXR1cyhjaGFyICpzLCBpbnQgc3RhdHVzLCBpbnQgc2lnb25seSkKK3sKKwlpbnQgY29sOworCWludCBzdDsKKworCWNvbCA9IDA7CisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworI2lmIEpPQlMKKwkJaWYgKFdJRlNUT1BQRUQoc3RhdHVzKSkKKwkJCXN0ID0gV1NUT1BTSUcoc3RhdHVzKTsKKwkJZWxzZQorI2VuZGlmCisJCQlzdCA9IFdURVJNU0lHKHN0YXR1cyk7CisJCWlmIChzaWdvbmx5KSB7CisJCQlpZiAoc3QgPT0gU0lHSU5UIHx8IHN0ID09IFNJR1BJUEUpCisJCQkJZ290byBvdXQ7CisjaWYgSk9CUworCQkJaWYgKFdJRlNUT1BQRUQoc3RhdHVzKSkKKwkJCQlnb3RvIG91dDsKKyNlbmRpZgorCQl9CisJCXN0ICY9IDB4N2Y7CisvL1RPRE86IHVzZSBiYm94J3MgZ2V0X3NpZ25hbWU/IHN0cnNpZ25hbCBhZGRzIH42MDAgYnl0ZXMgdG8gdGV4dCtyb2RhdGEKKwkJY29sID0gZm10c3RyKHMsIDMyLCBzdHJzaWduYWwoc3QpKTsKKwkJaWYgKFdDT1JFRFVNUChzdGF0dXMpKSB7CisJCQljb2wgKz0gZm10c3RyKHMgKyBjb2wsIDE2LCAiIChjb3JlIGR1bXBlZCkiKTsKKwkJfQorCX0gZWxzZSBpZiAoIXNpZ29ubHkpIHsKKwkJc3QgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQlpZiAoc3QpCisJCQljb2wgPSBmbXRzdHIocywgMTYsICJEb25lKCVkKSIsIHN0KTsKKwkJZWxzZQorCQkJY29sID0gZm10c3RyKHMsIDE2LCAiRG9uZSIpOworCX0KKyBvdXQ6CisJcmV0dXJuIGNvbDsKK30KKworc3RhdGljIGludAorZG93YWl0KGludCB3YWl0X2ZsYWdzLCBzdHJ1Y3Qgam9iICpqb2IpCit7CisJaW50IHBpZDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBqb2IgKmpwOworCXN0cnVjdCBqb2IgKnRoaXNqb2I7CisJaW50IHN0YXRlOworCisJVFJBQ0UoKCJkb3dhaXQoMHgleCkgY2FsbGVkXG4iLCB3YWl0X2ZsYWdzKSk7CisKKwkvKiBEbyBhIHdhaXQgc3lzdGVtIGNhbGwuIElmIGpvYiBjb250cm9sIGlzIGNvbXBpbGVkIGluLCB3ZSBhY2NlcHQKKwkgKiBzdG9wcGVkIHByb2Nlc3Nlcy4gd2FpdF9mbGFncyBtYXkgaGF2ZSBXTk9IQU5HLCBwcmV2ZW50aW5nIGJsb2NraW5nLgorCSAqIE5COiBfbm90XyBzYWZlX3dhaXRwaWQsIHdlIG5lZWQgdG8gZGV0ZWN0IEVJTlRSICovCisJaWYgKGRvaW5nX2pvYmN0bCkKKwkJd2FpdF9mbGFncyB8PSBXVU5UUkFDRUQ7CisJcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgd2FpdF9mbGFncyk7CisJVFJBQ0UoKCJ3YWl0IHJldHVybnMgcGlkPSVkLCBzdGF0dXM9MHgleCwgZXJybm89JWQoJXMpXG4iLAorCQkJCXBpZCwgc3RhdHVzLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKSk7CisJaWYgKHBpZCA8PSAwKQorCQlyZXR1cm4gcGlkOworCisJSU5UX09GRjsKKwl0aGlzam9iID0gTlVMTDsKKwlmb3IgKGpwID0gY3Vyam9iOyBqcDsganAgPSBqcC0+cHJldl9qb2IpIHsKKwkJc3RydWN0IHByb2NzdGF0ICpwczsKKwkJc3RydWN0IHByb2NzdGF0ICpwc2VuZDsKKwkJaWYgKGpwLT5zdGF0ZSA9PSBKT0JET05FKQorCQkJY29udGludWU7CisJCXN0YXRlID0gSk9CRE9ORTsKKwkJcHMgPSBqcC0+cHM7CisJCXBzZW5kID0gcHMgKyBqcC0+bnByb2NzOworCQlkbyB7CisJCQlpZiAocHMtPnBzX3BpZCA9PSBwaWQpIHsKKwkJCQlUUkFDRSgoIkpvYiAlZDogY2hhbmdpbmcgc3RhdHVzIG9mIHByb2MgJWQgIgorCQkJCQkiZnJvbSAweCV4IHRvIDB4JXhcbiIsCisJCQkJCWpvYm5vKGpwKSwgcGlkLCBwcy0+cHNfc3RhdHVzLCBzdGF0dXMpKTsKKwkJCQlwcy0+cHNfc3RhdHVzID0gc3RhdHVzOworCQkJCXRoaXNqb2IgPSBqcDsKKwkJCX0KKwkJCWlmIChwcy0+cHNfc3RhdHVzID09IC0xKQorCQkJCXN0YXRlID0gSk9CUlVOTklORzsKKyNpZiBKT0JTCisJCQlpZiAoc3RhdGUgPT0gSk9CUlVOTklORykKKwkJCQljb250aW51ZTsKKwkJCWlmIChXSUZTVE9QUEVEKHBzLT5wc19zdGF0dXMpKSB7CisJCQkJanAtPnN0b3BzdGF0dXMgPSBwcy0+cHNfc3RhdHVzOworCQkJCXN0YXRlID0gSk9CU1RPUFBFRDsKKwkJCX0KKyNlbmRpZgorCQl9IHdoaWxlICgrK3BzIDwgcHNlbmQpOworCQlpZiAodGhpc2pvYikKKwkJCWdvdG8gZ290am9iOworCX0KKyNpZiBKT0JTCisJaWYgKCFXSUZTVE9QUEVEKHN0YXR1cykpCisjZW5kaWYKKwkJam9ibGVzcy0tOworCWdvdG8gb3V0OworCisgZ290am9iOgorCWlmIChzdGF0ZSAhPSBKT0JSVU5OSU5HKSB7CisJCXRoaXNqb2ItPmNoYW5nZWQgPSAxOworCisJCWlmICh0aGlzam9iLT5zdGF0ZSAhPSBzdGF0ZSkgeworCQkJVFJBQ0UoKCJKb2IgJWQ6IGNoYW5naW5nIHN0YXRlIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJam9ibm8odGhpc2pvYiksIHRoaXNqb2ItPnN0YXRlLCBzdGF0ZSkpOworCQkJdGhpc2pvYi0+c3RhdGUgPSBzdGF0ZTsKKyNpZiBKT0JTCisJCQlpZiAoc3RhdGUgPT0gSk9CU1RPUFBFRCkgeworCQkJCXNldF9jdXJqb2IodGhpc2pvYiwgQ1VSX1NUT1BQRUQpOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisKKyBvdXQ6CisJSU5UX09OOworCisJaWYgKHRoaXNqb2IgJiYgdGhpc2pvYiA9PSBqb2IpIHsKKwkJY2hhciBzWzQ4ICsgMV07CisJCWludCBsZW47CisKKwkJbGVuID0gc3ByaW50X3N0YXR1cyhzLCBzdGF0dXMsIDEpOworCQlpZiAobGVuKSB7CisJCQlzW2xlbl0gPSAnXG4nOworCQkJc1tsZW4gKyAxXSA9ICdcMCc7CisJCQlvdXQyc3RyKHMpOworCQl9CisJfQorCXJldHVybiBwaWQ7Cit9CisKK3N0YXRpYyBpbnQKK2Jsb2NraW5nX3dhaXRfd2l0aF9yYWlzZV9vbl9zaWcodm9pZCkKK3sKKwlwaWRfdCBwaWQgPSBkb3dhaXQoRE9XQUlUX0JMT0NLLCBOVUxMKTsKKwlpZiAocGlkIDw9IDAgJiYgcGVuZGluZ19zaWcpCisJCXJhaXNlX2V4Y2VwdGlvbihFWFNJRyk7CisJcmV0dXJuIHBpZDsKK30KKworI2lmIEpPQlMKK3N0YXRpYyB2b2lkCitzaG93am9iKEZJTEUgKm91dCwgc3RydWN0IGpvYiAqanAsIGludCBtb2RlKQoreworCXN0cnVjdCBwcm9jc3RhdCAqcHM7CisJc3RydWN0IHByb2NzdGF0ICpwc2VuZDsKKwlpbnQgY29sOworCWludCBpbmRlbnRfY29sOworCWNoYXIgc1s4MF07CisKKwlwcyA9IGpwLT5wczsKKworCWlmIChtb2RlICYgU0hPV19PTkxZX1BHSUQpIHsgLyogam9icyAtcCAqLworCQkvKiBqdXN0IG91dHB1dCBwcm9jZXNzIChncm91cCkgaWQgb2YgcGlwZWxpbmUgKi8KKwkJZnByaW50ZihvdXQsICIlZFxuIiwgcHMtPnBzX3BpZCk7CisJCXJldHVybjsKKwl9CisKKwljb2wgPSBmbXRzdHIocywgMTYsICJbJWRdICAgIiwgam9ibm8oanApKTsKKwlpbmRlbnRfY29sID0gY29sOworCisJaWYgKGpwID09IGN1cmpvYikKKwkJc1tjb2wgLSAzXSA9ICcrJzsKKwllbHNlIGlmIChjdXJqb2IgJiYganAgPT0gY3Vyam9iLT5wcmV2X2pvYikKKwkJc1tjb2wgLSAzXSA9ICctJzsKKworCWlmIChtb2RlICYgU0hPV19QSURTKQorCQljb2wgKz0gZm10c3RyKHMgKyBjb2wsIDE2LCAiJWQgIiwgcHMtPnBzX3BpZCk7CisKKwlwc2VuZCA9IHBzICsganAtPm5wcm9jczsKKworCWlmIChqcC0+c3RhdGUgPT0gSk9CUlVOTklORykgeworCQlzdHJjcHkocyArIGNvbCwgIlJ1bm5pbmciKTsKKwkJY29sICs9IHNpemVvZigiUnVubmluZyIpIC0gMTsKKwl9IGVsc2UgeworCQlpbnQgc3RhdHVzID0gcHNlbmRbLTFdLnBzX3N0YXR1czsKKwkJaWYgKGpwLT5zdGF0ZSA9PSBKT0JTVE9QUEVEKQorCQkJc3RhdHVzID0ganAtPnN0b3BzdGF0dXM7CisJCWNvbCArPSBzcHJpbnRfc3RhdHVzKHMgKyBjb2wsIHN0YXR1cywgMCk7CisJfQorCS8qIEJ5IG5vdywgIltKT0JJRF0qICBbbWF5YmUgUElEXSBTVEFUVVMiIGlzIHByaW50ZWQgKi8KKworCS8qIFRoaXMgbG9vcCBlaXRoZXIgcHJpbnRzICI8Y21kMT4gfCA8Y21kMj4gfCA8Y21kMz4iIGxpbmUKKwkgKiBvciBwcmludHMgc2V2ZXJhbCAiUElEICAgICAgICAgICAgIHwgPGNtZE4+IiBsaW5lcywKKwkgKiBkZXBlbmRpbmcgb24gU0hPV19QSURTIGJpdC4KKwkgKiBXZSBkbyBub3QgcHJpbnQgc3RhdHVzIG9mIGluZGl2aWR1YWwgcHJvY2Vzc2VzCisJICogYmV0d2VlbiBQSUQgYW5kIDxjbWROPi4gYmFzaCBkb2VzIGl0LCBidXQgbm90IHZlcnkgd2VsbDoKKwkgKiBmaXJzdCBsaW5lIHNob3dzIG92ZXJhbGwgam9iIHN0YXR1cywgbm90IHByb2Nlc3Mgc3RhdHVzLAorCSAqIG1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIGtub3cgMXN0IHByb2Nlc3Mgc3RhdHVzLgorCSAqLworCWdvdG8gc3RhcnQ7CisJZG8geworCQkvKiBmb3IgZWFjaCBwcm9jZXNzICovCisJCXNbMF0gPSAnXDAnOworCQljb2wgPSAzMzsKKwkJaWYgKG1vZGUgJiBTSE9XX1BJRFMpCisJCQljb2wgPSBmbXRzdHIocywgNDgsICJcbiUqYyVkICIsIGluZGVudF9jb2wsICcgJywgcHMtPnBzX3BpZCkgLSAxOworIHN0YXJ0OgorCQlmcHJpbnRmKG91dCwgIiVzJSpjJXMlcyIsCisJCQkJcywKKwkJCQkzMyAtIGNvbCA+PSAwID8gMzMgLSBjb2wgOiAwLCAnICcsCisJCQkJcHMgPT0ganAtPnBzID8gIiIgOiAifCAiLAorCQkJCXBzLT5wc19jbWQKKwkJKTsKKwl9IHdoaWxlICgrK3BzICE9IHBzZW5kKTsKKwlvdXRjc2xvdygnXG4nLCBvdXQpOworCisJanAtPmNoYW5nZWQgPSAwOworCisJaWYgKGpwLT5zdGF0ZSA9PSBKT0JET05FKSB7CisJCVRSQUNFKCgic2hvd2pvYjogZnJlZWluZyBqb2IgJWRcbiIsIGpvYm5vKGpwKSkpOworCQlmcmVlam9iKGpwKTsKKwl9Cit9CisKKy8qCisgKiBQcmludCBhIGxpc3Qgb2Ygam9icy4gIElmICJjaGFuZ2UiIGlzIG5vbnplcm8sIG9ubHkgcHJpbnQgam9icyB3aG9zZQorICogc3RhdHVzZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gc2hvd2pvYnMuCisgKi8KK3N0YXRpYyB2b2lkCitzaG93am9icyhGSUxFICpvdXQsIGludCBtb2RlKQoreworCXN0cnVjdCBqb2IgKmpwOworCisJVFJBQ0UoKCJzaG93am9icygweCV4KSBjYWxsZWRcbiIsIG1vZGUpKTsKKworCS8qIEhhbmRsZSBhbGwgZmluaXNoZWQgam9icyAqLworCXdoaWxlIChkb3dhaXQoRE9XQUlUX05PTkJMT0NLLCBOVUxMKSA+IDApCisJCWNvbnRpbnVlOworCisJZm9yIChqcCA9IGN1cmpvYjsganA7IGpwID0ganAtPnByZXZfam9iKSB7CisJCWlmICghKG1vZGUgJiBTSE9XX0NIQU5HRUQpIHx8IGpwLT5jaGFuZ2VkKSB7CisJCQlzaG93am9iKG91dCwganAsIG1vZGUpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQworam9ic2NtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBtb2RlLCBtOworCisJbW9kZSA9IDA7CisJd2hpbGUgKChtID0gbmV4dG9wdCgibHAiKSkgIT0gJ1wwJykgeworCQlpZiAobSA9PSAnbCcpCisJCQltb2RlIHw9IFNIT1dfUElEUzsKKwkJZWxzZQorCQkJbW9kZSB8PSBTSE9XX09OTFlfUEdJRDsKKwl9CisKKwlhcmd2ID0gYXJncHRyOworCWlmICgqYXJndikgeworCQlkbworCQkJc2hvd2pvYihzdGRvdXQsIGdldGpvYigqYXJndiwgMCksIG1vZGUpOworCQl3aGlsZSAoKisrYXJndik7CisJfSBlbHNlIHsKKwkJc2hvd2pvYnMoc3Rkb3V0LCBtb2RlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBKT0JTICovCisKKy8qIENhbGxlZCBvbmx5IG9uIGZpbmlzaGVkIG9yIHN0b3BwZWQgam9icyAobm8gbWVtYmVycyBhcmUgcnVubmluZykgKi8KK3N0YXRpYyBpbnQKK2dldHN0YXR1cyhzdHJ1Y3Qgam9iICpqb2IpCit7CisJaW50IHN0YXR1czsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBwcm9jc3RhdCAqcHM7CisKKwkvKiBGZXRjaCBsYXN0IG1lbWJlcidzIHN0YXR1cyAqLworCXBzID0gam9iLT5wcyArIGpvYi0+bnByb2NzIC0gMTsKKwlzdGF0dXMgPSBwcy0+cHNfc3RhdHVzOworCWlmIChwaXBlZmFpbCkgeworCQkvKiAic2V0IC1vIHBpcGVmYWlsIiBtb2RlOiB1c2UgbGFzdCBfbm9uemVyb18gc3RhdHVzICovCisJCXdoaWxlIChzdGF0dXMgPT0gMCAmJiAtLXBzID49IGpvYi0+cHMpCisJCQlzdGF0dXMgPSBwcy0+cHNfc3RhdHVzOworCX0KKworCXJldHZhbCA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworI2lmIEpPQlMKKwkJcmV0dmFsID0gV1NUT1BTSUcoc3RhdHVzKTsKKwkJaWYgKCFXSUZTVE9QUEVEKHN0YXR1cykpCisjZW5kaWYKKwkJeworCQkJLyogWFhYOiBsaW1pdHMgbnVtYmVyIG9mIHNpZ25hbHMgKi8KKwkJCXJldHZhbCA9IFdURVJNU0lHKHN0YXR1cyk7CisjaWYgSk9CUworCQkJaWYgKHJldHZhbCA9PSBTSUdJTlQpCisJCQkJam9iLT5zaWdpbnQgPSAxOworI2VuZGlmCisJCX0KKwkJcmV0dmFsICs9IDEyODsKKwl9CisJVFJBQ0UoKCJnZXRzdGF0dXM6IGpvYiAlZCwgbnByb2MgJWQsIHN0YXR1cyAweCV4LCByZXR2YWwgMHgleFxuIiwKKwkJam9ibm8oam9iKSwgam9iLT5ucHJvY3MsIHN0YXR1cywgcmV0dmFsKSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK3dhaXRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgam9iICpqb2I7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgam9iICpqcDsKKworCWlmIChwZW5kaW5nX3NpZykKKwkJcmFpc2VfZXhjZXB0aW9uKEVYU0lHKTsKKworCW5leHRvcHQobnVsbHN0cik7CisJcmV0dmFsID0gMDsKKworCWFyZ3YgPSBhcmdwdHI7CisJaWYgKCEqYXJndikgeworCQkvKiB3YWl0IGZvciBhbGwgam9icyAqLworCQlmb3IgKDs7KSB7CisJCQlqcCA9IGN1cmpvYjsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCFqcCkgLyogbm8gcnVubmluZyBwcm9jcyAqLworCQkJCQlnb3RvIHJldDsKKwkJCQlpZiAoanAtPnN0YXRlID09IEpPQlJVTk5JTkcpCisJCQkJCWJyZWFrOworCQkJCWpwLT53YWl0ZWQgPSAxOworCQkJCWpwID0ganAtPnByZXZfam9iOworCQkJfQorCQkJYmxvY2tpbmdfd2FpdF93aXRoX3JhaXNlX29uX3NpZygpOworCS8qIG1hbiBiYXNoOgorCSAqICJXaGVuIGJhc2ggaXMgd2FpdGluZyBmb3IgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgdmlhCisJICogdGhlIHdhaXQgYnVpbHRpbiwgdGhlIHJlY2VwdGlvbiBvZiBhIHNpZ25hbCBmb3Igd2hpY2ggYSB0cmFwCisJICogaGFzIGJlZW4gc2V0IHdpbGwgY2F1c2UgdGhlIHdhaXQgYnVpbHRpbiB0byByZXR1cm4gaW1tZWRpYXRlbHkKKwkgKiB3aXRoIGFuIGV4aXQgc3RhdHVzIGdyZWF0ZXIgdGhhbiAxMjgsIGltbWVkaWF0ZWx5IGFmdGVyIHdoaWNoCisJICogdGhlIHRyYXAgaXMgZXhlY3V0ZWQuIgorCSAqCisJICogYmxvY2tpbmdfd2FpdF93aXRoX3JhaXNlX29uX3NpZyByYWlzZXMgc2lnbmFsIGhhbmRsZXJzCisJICogaWYgaXQgZ2V0cyBubyBwaWQgKHBpZCA8IDApLiBIb3dldmVyLAorCSAqIGlmIGNoaWxkIHNlbmRzIHVzIGEgc2lnbmFsICphbmQgaW1tZWRpYXRlbHkgZXhpdHMqLAorCSAqIGJsb2NraW5nX3dhaXRfd2l0aF9yYWlzZV9vbl9zaWcgZ2V0cyBwaWQgPiAwCisJICogYW5kIGRvZXMgbm90IGhhbmRsZSBwZW5kaW5nX3NpZy4gQ2hlY2sgdGhpcyBjYXNlOiAqLworCQkJaWYgKHBlbmRpbmdfc2lnKQorCQkJCXJhaXNlX2V4Y2VwdGlvbihFWFNJRyk7CisJCX0KKwl9CisKKwlyZXR2YWwgPSAxMjc7CisJZG8geworCQlpZiAoKiphcmd2ICE9ICclJykgeworCQkJcGlkX3QgcGlkID0gbnVtYmVyKCphcmd2KTsKKwkJCWpvYiA9IGN1cmpvYjsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCFqb2IpCisJCQkJCWdvdG8gcmVwZWF0OworCQkJCWlmIChqb2ItPnBzW2pvYi0+bnByb2NzIC0gMV0ucHNfcGlkID09IHBpZCkKKwkJCQkJYnJlYWs7CisJCQkJam9iID0gam9iLT5wcmV2X2pvYjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWpvYiA9IGdldGpvYigqYXJndiwgMCk7CisJCX0KKwkJLyogbG9vcCB1bnRpbCBwcm9jZXNzIHRlcm1pbmF0ZWQgb3Igc3RvcHBlZCAqLworCQl3aGlsZSAoam9iLT5zdGF0ZSA9PSBKT0JSVU5OSU5HKQorCQkJYmxvY2tpbmdfd2FpdF93aXRoX3JhaXNlX29uX3NpZygpOworCQlqb2ItPndhaXRlZCA9IDE7CisJCXJldHZhbCA9IGdldHN0YXR1cyhqb2IpOworIHJlcGVhdDogOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisgcmV0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgam9iICoKK2dyb3dqb2J0YWIodm9pZCkKK3sKKwlzaXplX3QgbGVuOworCXB0cmRpZmZfdCBvZmZzZXQ7CisJc3RydWN0IGpvYiAqanAsICpqcTsKKworCWxlbiA9IG5qb2JzICogc2l6ZW9mKCpqcCk7CisJanEgPSBqb2J0YWI7CisJanAgPSBja3JlYWxsb2MoanEsIGxlbiArIDQgKiBzaXplb2YoKmpwKSk7CisKKwlvZmZzZXQgPSAoY2hhciAqKWpwIC0gKGNoYXIgKilqcTsKKwlpZiAob2Zmc2V0KSB7CisJCS8qIFJlbG9jYXRlIHBvaW50ZXJzICovCisJCXNpemVfdCBsID0gbGVuOworCisJCWpxID0gKHN0cnVjdCBqb2IgKikoKGNoYXIgKilqcSArIGwpOworCQl3aGlsZSAobCkgeworCQkJbCAtPSBzaXplb2YoKmpwKTsKKwkJCWpxLS07CisjZGVmaW5lIGpvZmYocCkgKChzdHJ1Y3Qgam9iICopKChjaGFyICopKHApICsgbCkpCisjZGVmaW5lIGptb3ZlKHApIChwKSA9ICh2b2lkICopKChjaGFyICopKHApICsgb2Zmc2V0KQorCQkJaWYgKGpvZmYoanApLT5wcyA9PSAmanEtPnBzMCkKKwkJCQlqbW92ZShqb2ZmKGpwKS0+cHMpOworCQkJaWYgKGpvZmYoanApLT5wcmV2X2pvYikKKwkJCQlqbW92ZShqb2ZmKGpwKS0+cHJldl9qb2IpOworCQl9CisJCWlmIChjdXJqb2IpCisJCQlqbW92ZShjdXJqb2IpOworI3VuZGVmIGpvZmYKKyN1bmRlZiBqbW92ZQorCX0KKworCW5qb2JzICs9IDQ7CisJam9idGFiID0ganA7CisJanAgPSAoc3RydWN0IGpvYiAqKSgoY2hhciAqKWpwICsgbGVuKTsKKwlqcSA9IGpwICsgMzsKKwlkbyB7CisJCWpxLT51c2VkID0gMDsKKwl9IHdoaWxlICgtLWpxID49IGpwKTsKKwlyZXR1cm4ganA7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBuZXcgam9iIHN0cnVjdHVyZS4KKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCitzdGF0aWMgc3RydWN0IGpvYiAqCittYWtlam9iKC8qdW5pb24gbm9kZSAqbm9kZSwqLyBpbnQgbnByb2NzKQoreworCWludCBpOworCXN0cnVjdCBqb2IgKmpwOworCisJZm9yIChpID0gbmpvYnMsIGpwID0gam9idGFiOyA7IGpwKyspIHsKKwkJaWYgKC0taSA8IDApIHsKKwkJCWpwID0gZ3Jvd2pvYnRhYigpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGpwLT51c2VkID09IDApCisJCQlicmVhazsKKwkJaWYgKGpwLT5zdGF0ZSAhPSBKT0JET05FIHx8ICFqcC0+d2FpdGVkKQorCQkJY29udGludWU7CisjaWYgSk9CUworCQlpZiAoZG9pbmdfam9iY3RsKQorCQkJY29udGludWU7CisjZW5kaWYKKwkJZnJlZWpvYihqcCk7CisJCWJyZWFrOworCX0KKwltZW1zZXQoanAsIDAsIHNpemVvZigqanApKTsKKyNpZiBKT0JTCisJLyoganAtPmpvYmN0bCBpcyBhIGJpdGZpZWxkLgorCSAqICJqcC0+am9iY3RsIHw9IGpvYmN0bCIgbGlrZWx5IHRvIGdpdmUgYXdmdWwgY29kZSAqLworCWlmIChkb2luZ19qb2JjdGwpCisJCWpwLT5qb2JjdGwgPSAxOworI2VuZGlmCisJanAtPnByZXZfam9iID0gY3Vyam9iOworCWN1cmpvYiA9IGpwOworCWpwLT51c2VkID0gMTsKKwlqcC0+cHMgPSAmanAtPnBzMDsKKwlpZiAobnByb2NzID4gMSkgeworCQlqcC0+cHMgPSBja21hbGxvYyhucHJvY3MgKiBzaXplb2Yoc3RydWN0IHByb2NzdGF0KSk7CisJfQorCVRSQUNFKCgibWFrZWpvYiglZCkgcmV0dXJucyAlJSVkXG4iLCBucHJvY3MsCisJCQkJam9ibm8oanApKSk7CisJcmV0dXJuIGpwOworfQorCisjaWYgSk9CUworLyoKKyAqIFJldHVybiBhIHN0cmluZyBpZGVudGlmeWluZyBhIGNvbW1hbmQgKHRvIGJlIHByaW50ZWQgYnkgdGhlCisgKiBqb2JzIGNvbW1hbmQpLgorICovCitzdGF0aWMgY2hhciAqY21kbmV4dGM7CisKK3N0YXRpYyB2b2lkCitjbWRwdXRzKGNvbnN0IGNoYXIgKnMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdnN0eXBlW1ZTVFlQRSArIDFdWzNdID0geworCQkiIiwgIn0iLCAiLSIsICIrIiwgIj8iLCAiPSIsCisJCSIlIiwgIiUlIiwgIiMiLCAiIyMiCisJCUlGX0FTSF9CQVNIX0NPTVBBVCgsICI6IiwgIi8iLCAiLy8iKQorCX07CisKKwljb25zdCBjaGFyICpwLCAqc3RyOworCWNoYXIgY2NbMl07CisJY2hhciAqbmV4dGM7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGNoYXIgc3VidHlwZSA9IDA7CisJaW50IHF1b3RlZCA9IDA7CisKKwljY1sxXSA9ICdcMCc7CisJbmV4dGMgPSBtYWtlc3Ryc3BhY2UoKHN0cmxlbihzKSArIDEpICogOCwgY21kbmV4dGMpOworCXAgPSBzOworCXdoaWxlICgoYyA9ICpwKyspICE9ICdcMCcpIHsKKwkJc3RyID0gTlVMTDsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgQ1RMRVNDOgorCQkJYyA9ICpwKys7CisJCQlicmVhazsKKwkJY2FzZSBDVExWQVI6CisJCQlzdWJ0eXBlID0gKnArKzsKKwkJCWlmICgoc3VidHlwZSAmIFZTVFlQRSkgPT0gVlNMRU5HVEgpCisJCQkJc3RyID0gIiR7IyI7CisJCQllbHNlCisJCQkJc3RyID0gIiR7IjsKKwkJCWlmICghKHN1YnR5cGUgJiBWU1FVT1RFKSA9PSAhKHF1b3RlZCAmIDEpKQorCQkJCWdvdG8gZG9zdHI7CisJCQlxdW90ZWQgXj0gMTsKKwkJCWMgPSAnIic7CisJCQlicmVhazsKKwkJY2FzZSBDVExFTkRWQVI6CisJCQlzdHIgPSAiXCJ9IiArICEocXVvdGVkICYgMSk7CisJCQlxdW90ZWQgPj49IDE7CisJCQlzdWJ0eXBlID0gMDsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMQkFDS1E6CisJCQlzdHIgPSAiJCguLi4pIjsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMQkFDS1ErQ1RMUVVPVEU6CisJCQlzdHIgPSAiXCIkKC4uLilcIiI7CisJCQlnb3RvIGRvc3RyOworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJY2FzZSBDVExBUkk6CisJCQlzdHIgPSAiJCgoIjsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMRU5EQVJJOgorCQkJc3RyID0gIikpIjsKKwkJCWdvdG8gZG9zdHI7CisjZW5kaWYKKwkJY2FzZSBDVExRVU9URU1BUks6CisJCQlxdW90ZWQgXj0gMTsKKwkJCWMgPSAnIic7CisJCQlicmVhazsKKwkJY2FzZSAnPSc6CisJCQlpZiAoc3VidHlwZSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKChzdWJ0eXBlICYgVlNUWVBFKSAhPSBWU05PUk1BTCkKKwkJCQlxdW90ZWQgPDw9IDE7CisJCQlzdHIgPSB2c3R5cGVbc3VidHlwZSAmIFZTVFlQRV07CisJCQlpZiAoc3VidHlwZSAmIFZTTlVMKQorCQkJCWMgPSAnOic7CisJCQllbHNlCisJCQkJZ290byBjaGVja3N0cjsKKwkJCWJyZWFrOworCQljYXNlICdcJyc6CisJCWNhc2UgJ1xcJzoKKwkJY2FzZSAnIic6CisJCWNhc2UgJyQnOgorCQkJLyogVGhlc2UgY2FuIG9ubHkgaGFwcGVuIGluc2lkZSBxdW90ZXMgKi8KKwkJCWNjWzBdID0gYzsKKwkJCXN0ciA9IGNjOworCQkJYyA9ICdcXCc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCVVTVFBVVEMoYywgbmV4dGMpOworIGNoZWNrc3RyOgorCQlpZiAoIXN0cikKKwkJCWNvbnRpbnVlOworIGRvc3RyOgorCQl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICdcMCcpIHsKKwkJCVVTVFBVVEMoYywgbmV4dGMpOworCQl9CisJfSAvKiB3aGlsZSAqcCsrIG5vdCBOVUwgKi8KKworCWlmIChxdW90ZWQgJiAxKSB7CisJCVVTVFBVVEMoJyInLCBuZXh0Yyk7CisJfQorCSpuZXh0YyA9IDA7CisJY21kbmV4dGMgPSBuZXh0YzsKK30KKworLyogY21kdHh0KCkgYW5kIGNtZGxpc3QoKSBjYWxsIGVhY2ggb3RoZXIgKi8KK3N0YXRpYyB2b2lkIGNtZHR4dCh1bmlvbiBub2RlICpuKTsKKworc3RhdGljIHZvaWQKK2NtZGxpc3QodW5pb24gbm9kZSAqbnAsIGludCBzZXApCit7CisJZm9yICg7IG5wOyBucCA9IG5wLT5uYXJnLm5leHQpIHsKKwkJaWYgKCFzZXApCisJCQljbWRwdXRzKCIgIik7CisJCWNtZHR4dChucCk7CisJCWlmIChzZXAgJiYgbnAtPm5hcmcubmV4dCkKKwkJCWNtZHB1dHMoIiAiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjbWR0eHQodW5pb24gbm9kZSAqbikKK3sKKwl1bmlvbiBub2RlICpucDsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmxwOworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAoIW4pCisJCXJldHVybjsKKwlzd2l0Y2ggKG4tPnR5cGUpIHsKKwlkZWZhdWx0OgorI2lmIERFQlVHCisJCWFib3J0KCk7CisjZW5kaWYKKwljYXNlIE5QSVBFOgorCQlscCA9IG4tPm5waXBlLmNtZGxpc3Q7CisJCWZvciAoOzspIHsKKwkJCWNtZHR4dChscC0+bik7CisJCQlscCA9IGxwLT5uZXh0OworCQkJaWYgKCFscCkKKwkJCQlicmVhazsKKwkJCWNtZHB1dHMoIiB8ICIpOworCQl9CisJCWJyZWFrOworCWNhc2UgTlNFTUk6CisJCXAgPSAiOyAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTkFORDoKKwkJcCA9ICIgJiYgIjsKKwkJZ290byBiaW5vcDsKKwljYXNlIE5PUjoKKwkJcCA9ICIgfHwgIjsKKyBiaW5vcDoKKwkJY21kdHh0KG4tPm5iaW5hcnkuY2gxKTsKKwkJY21kcHV0cyhwKTsKKwkJbiA9IG4tPm5iaW5hcnkuY2gyOworCQlnb3RvIGRvbm9kZTsKKwljYXNlIE5SRURJUjoKKwljYXNlIE5CQUNLR05EOgorCQluID0gbi0+bnJlZGlyLm47CisJCWdvdG8gZG9ub2RlOworCWNhc2UgTk5PVDoKKwkJY21kcHV0cygiISIpOworCQluID0gbi0+bm5vdC5jb207CisgZG9ub2RlOgorCQljbWR0eHQobik7CisJCWJyZWFrOworCWNhc2UgTklGOgorCQljbWRwdXRzKCJpZiAiKTsKKwkJY21kdHh0KG4tPm5pZi50ZXN0KTsKKwkJY21kcHV0cygiOyB0aGVuICIpOworCQlpZiAobi0+bmlmLmVsc2VwYXJ0KSB7CisJCQljbWR0eHQobi0+bmlmLmlmcGFydCk7CisJCQljbWRwdXRzKCI7IGVsc2UgIik7CisJCQluID0gbi0+bmlmLmVsc2VwYXJ0OworCQl9IGVsc2UgeworCQkJbiA9IG4tPm5pZi5pZnBhcnQ7CisJCX0KKwkJcCA9ICI7IGZpIjsKKwkJZ290byBkb3RhaWw7CisJY2FzZSBOU1VCU0hFTEw6CisJCWNtZHB1dHMoIigiKTsKKwkJbiA9IG4tPm5yZWRpci5uOworCQlwID0gIikiOworCQlnb3RvIGRvdGFpbDsKKwljYXNlIE5XSElMRToKKwkJcCA9ICJ3aGlsZSAiOworCQlnb3RvIHVudGlsOworCWNhc2UgTlVOVElMOgorCQlwID0gInVudGlsICI7CisgdW50aWw6CisJCWNtZHB1dHMocCk7CisJCWNtZHR4dChuLT5uYmluYXJ5LmNoMSk7CisJCW4gPSBuLT5uYmluYXJ5LmNoMjsKKwkJcCA9ICI7IGRvbmUiOworIGRvZG86CisJCWNtZHB1dHMoIjsgZG8gIik7CisgZG90YWlsOgorCQljbWR0eHQobik7CisJCWdvdG8gZG90YWlsMjsKKwljYXNlIE5GT1I6CisJCWNtZHB1dHMoImZvciAiKTsKKwkJY21kcHV0cyhuLT5uZm9yLnZhcik7CisJCWNtZHB1dHMoIiBpbiAiKTsKKwkJY21kbGlzdChuLT5uZm9yLmFyZ3MsIDEpOworCQluID0gbi0+bmZvci5ib2R5OworCQlwID0gIjsgZG9uZSI7CisJCWdvdG8gZG9kbzsKKwljYXNlIE5ERUZVTjoKKwkJY21kcHV0cyhuLT5uYXJnLnRleHQpOworCQlwID0gIigpIHsgLi4uIH0iOworCQlnb3RvIGRvdGFpbDI7CisJY2FzZSBOQ01EOgorCQljbWRsaXN0KG4tPm5jbWQuYXJncywgMSk7CisJCWNtZGxpc3Qobi0+bmNtZC5yZWRpcmVjdCwgMCk7CisJCWJyZWFrOworCWNhc2UgTkFSRzoKKwkJcCA9IG4tPm5hcmcudGV4dDsKKyBkb3RhaWwyOgorCQljbWRwdXRzKHApOworCQlicmVhazsKKwljYXNlIE5IRVJFOgorCWNhc2UgTlhIRVJFOgorCQlwID0gIjw8Li4uIjsKKwkJZ290byBkb3RhaWwyOworCWNhc2UgTkNBU0U6CisJCWNtZHB1dHMoImNhc2UgIik7CisJCWNtZHB1dHMobi0+bmNhc2UuZXhwci0+bmFyZy50ZXh0KTsKKwkJY21kcHV0cygiIGluICIpOworCQlmb3IgKG5wID0gbi0+bmNhc2UuY2FzZXM7IG5wOyBucCA9IG5wLT5uY2xpc3QubmV4dCkgeworCQkJY21kdHh0KG5wLT5uY2xpc3QucGF0dGVybik7CisJCQljbWRwdXRzKCIpICIpOworCQkJY21kdHh0KG5wLT5uY2xpc3QuYm9keSk7CisJCQljbWRwdXRzKCI7OyAiKTsKKwkJfQorCQlwID0gImVzYWMiOworCQlnb3RvIGRvdGFpbDI7CisJY2FzZSBOVE86CisJCXAgPSAiPiI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBOQ0xPQkJFUjoKKwkJcCA9ICI+fCI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBOQVBQRU5EOgorCQlwID0gIj4+IjsKKwkJZ290byByZWRpcjsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJY2FzZSBOVE8yOgorI2VuZGlmCisJY2FzZSBOVE9GRDoKKwkJcCA9ICI+JiI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBORlJPTToKKwkJcCA9ICI8IjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5GUk9NRkQ6CisJCXAgPSAiPCYiOworCQlnb3RvIHJlZGlyOworCWNhc2UgTkZST01UTzoKKwkJcCA9ICI8PiI7CisgcmVkaXI6CisJCWNtZHB1dHModXRvYShuLT5uZmlsZS5mZCkpOworCQljbWRwdXRzKHApOworCQlpZiAobi0+dHlwZSA9PSBOVE9GRCB8fCBuLT50eXBlID09IE5GUk9NRkQpIHsKKwkJCWNtZHB1dHModXRvYShuLT5uZHVwLmR1cGZkKSk7CisJCQlicmVhazsKKwkJfQorCQluID0gbi0+bmZpbGUuZm5hbWU7CisJCWdvdG8gZG9ub2RlOworCX0KK30KKworc3RhdGljIGNoYXIgKgorY29tbWFuZHRleHQodW5pb24gbm9kZSAqbikKK3sKKwljaGFyICpuYW1lOworCisJU1RBUlRTVEFDS1NUUihjbWRuZXh0Yyk7CisJY21kdHh0KG4pOworCW5hbWUgPSBzdGFja2Jsb2NrKCk7CisJVFJBQ0UoKCJjb21tYW5kdGV4dDogbmFtZSAlcCwgZW5kICVwXG5cdFwiJXNcIlxuIiwKKwkJCW5hbWUsIGNtZG5leHRjLCBjbWRuZXh0YykpOworCXJldHVybiBja3N0cmR1cChuYW1lKTsKK30KKyNlbmRpZiAvKiBKT0JTICovCisKKy8qCisgKiBGb3JrIG9mZiBhIHN1YnNoZWxsLiAgSWYgd2UgYXJlIGRvaW5nIGpvYiBjb250cm9sLCBnaXZlIHRoZSBzdWJzaGVsbCBpdHMKKyAqIG93biBwcm9jZXNzIGdyb3VwLiAgSnAgaXMgYSBqb2Igc3RydWN0dXJlIHRoYXQgdGhlIGpvYiBpcyB0byBiZSBhZGRlZCB0by4KKyAqIE4gaXMgdGhlIGNvbW1hbmQgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCBieSB0aGUgY2hpbGQuICBCb3RoIGpwIGFuZCBuIG1heQorICogYmUgTlVMTC4gIFRoZSBtb2RlIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgIEZPUktfRkcgLSBGb3JrIG9mZiBhIGZvcmVncm91bmQgcHJvY2Vzcy4KKyAqICAgICAgRk9SS19CRyAtIEZvcmsgb2ZmIGEgYmFja2dyb3VuZCBwcm9jZXNzLgorICogICAgICBGT1JLX05PSk9CIC0gTGlrZSBGT1JLX0ZHLCBidXQgZG9uJ3QgZ2l2ZSB0aGUgcHJvY2VzcyBpdHMgb3duCisgKiAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGdyb3VwIGV2ZW4gaWYgam9iIGNvbnRyb2wgaXMgb24uCisgKgorICogV2hlbiBqb2IgY29udHJvbCBpcyB0dXJuZWQgb2ZmLCBiYWNrZ3JvdW5kIHByb2Nlc3NlcyBoYXZlIHRoZWlyIHN0YW5kYXJkCisgKiBpbnB1dCByZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCAoZXhjZXB0IGZvciB0aGUgc2Vjb25kIGFuZCBsYXRlciBwcm9jZXNzZXMKKyAqIGluIGEgcGlwZWxpbmUpLgorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCisvKgorICogQ2xlYXIgdHJhcHMgb24gYSBmb3JrLgorICovCitzdGF0aWMgdm9pZAorY2xlYXJfdHJhcHModm9pZCkKK3sKKwljaGFyICoqdHA7CisKKwlmb3IgKHRwID0gdHJhcDsgdHAgPCAmdHJhcFtOU0lHXTsgdHArKykgeworCQlpZiAoKnRwICYmICoqdHApIHsgICAgICAvKiB0cmFwIG5vdCBOVUxMIG9yICIiIChTSUdfSUdOKSAqLworCQkJSU5UX09GRjsKKwkJCWlmICh0cmFwX3B0ciA9PSB0cmFwKQorCQkJCWZyZWUoKnRwKTsKKwkJCS8qIGVsc2U6IGl0ICJiZWxvbmdzIiB0byB0cmFwX3B0ciB2ZWN0b3IsIGRvbid0IGZyZWUgKi8KKwkJCSp0cCA9IE5VTEw7CisJCQlpZiAoKHRwIC0gdHJhcCkgIT0gMCkKKwkJCQlzZXRzaWduYWwodHAgLSB0cmFwKTsKKwkJCUlOVF9PTjsKKwkJfQorCX0KKwltYXlfaGF2ZV90cmFwcyA9IDA7Cit9CisKKy8qIExpdmVzIGZhciBhd2F5IGZyb20gaGVyZSwgbmVlZGVkIGZvciBmb3JrY2hpbGQgKi8KK3N0YXRpYyB2b2lkIGNsb3Nlc2NyaXB0KHZvaWQpOworCisvKiBDYWxsZWQgYWZ0ZXIgZm9yaygpLCBpbiBjaGlsZCAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQKK2ZvcmtjaGlsZChzdHJ1Y3Qgam9iICpqcCwgdW5pb24gbm9kZSAqbiwgaW50IG1vZGUpCit7CisJaW50IG9sZGx2bDsKKworCVRSQUNFKCgiQ2hpbGQgc2hlbGwgJWRcbiIsIGdldHBpZCgpKSk7CisJb2xkbHZsID0gc2hsdmw7CisJc2hsdmwrKzsKKworCS8qIG1hbiBiYXNoOiAiTm9uLWJ1aWx0aW4gY29tbWFuZHMgcnVuIGJ5IGJhc2ggaGF2ZSBzaWduYWwgaGFuZGxlcnMKKwkgKiBzZXQgdG8gdGhlIHZhbHVlcyBpbmhlcml0ZWQgYnkgdGhlIHNoZWxsIGZyb20gaXRzIHBhcmVudCIuCisJICogRG8gd2UgZG8gaXQgY29ycmVjdGx5PyAqLworCisJY2xvc2VzY3JpcHQoKTsKKworCWlmIChtb2RlID09IEZPUktfTk9KT0IgICAgICAgICAgLyogaXMgaXQgYHh4eGAgPyAqLworCSAmJiBuICYmIG4tPnR5cGUgPT0gTkNNRCAgICAgICAgLyogaXMgaXQgc2luZ2xlIGNtZD8gKi8KKwkvKiAmJiBuLT5uY21kLmFyZ3MtPnR5cGUgPT0gTkFSRyAtIGFsd2F5cyB0cnVlPyAqLworCSAmJiBuLT5uY21kLmFyZ3MgJiYgc3RyY21wKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0LCAidHJhcCIpID09IDAKKwkgJiYgbi0+bmNtZC5hcmdzLT5uYXJnLm5leHQgPT0gTlVMTCAvKiAidHJhcCIgd2l0aCBubyBhcmd1bWVudHMgKi8KKwkvKiAmJiBuLT5uY21kLmFyZ3MtPm5hcmcuYmFja3F1b3RlID09IE5VTEwgLSBkbyB3ZSBuZWVkIHRvIGNoZWNrIHRoaXM/ICovCisJKSB7CisJCVRSQUNFKCgiVHJhcCBoYWNrXG4iKSk7CisJCS8qIEF3ZnVsIGhhY2sgZm9yIGB0cmFwYCBvciAkKHRyYXApLgorCQkgKgorCQkgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3RyYXAuaHRtbAorCQkgKiBjb250YWlucyBhbiBleGFtcGxlIHdoZXJlICJ0cmFwIiBpcyBleGVjdXRlZCBpbiBhIHN1YnNoZWxsOgorCQkgKgorCQkgKiBzYXZlX3RyYXBzPSQodHJhcCkKKwkJICogLi4uCisJCSAqIGV2YWwgIiRzYXZlX3RyYXBzIgorCQkgKgorCQkgKiBTdGFuZGFyZCBkb2VzIG5vdCBzYXkgdGhhdCAidHJhcCIgaW4gc3Vic2hlbGwgc2hhbGwgcHJpbnQKKwkJICogcGFyZW50IHNoZWxsJ3MgdHJhcHMuIEl0IG9ubHkgc2F5cyB0aGF0IGl0cyBvdXRwdXQKKwkJICogbXVzdCBoYXZlIHN1aXRhYmxlIGZvcm0sIGJ1dCB0aGVuLCBpbiB0aGUgYWJvdmUgZXhhbXBsZQorCQkgKiAod2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIG5vcm1hdGl2ZSksIGl0IGltcGxpZXMgdGhhdC4KKwkJICoKKwkJICogYmFzaCAoYW5kIHByb2JhYmx5IG90aGVyIHNoZWxsKSBkb2VzIGltcGxlbWVudCBpdAorCQkgKiAodHJhcHMgYXJlIHJlc2V0IHRvIGRlZmF1bHRzLCBidXQgInRyYXAiIHN0aWxsIHNob3dzIHRoZW0pLAorCQkgKiBidXQgYXMgYSByZXN1bHQsICJ0cmFwIiBsb2dpYyBpcyBob3BlbGVzc2x5IG1lc3NlZCB1cDoKKwkJICoKKwkJICogIyB0cmFwCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNIICA8LS0tIHdlIGhhdmUgYSBoYW5kbGVyCisJCSAqICMgKHRyYXApICAgICAgICA8LS0tIHRyYXAgaXMgaW4gc3Vic2hlbGwgLSBubyBvdXRwdXQgKGNvcnJlY3QsIHRyYXBzIGFyZSByZXNldCkKKwkJICogIyB0cnVlIHwgdHJhcCAgIDwtLS0gdHJhcCBpcyBpbiBzdWJzaGVsbCAtIG5vIG91dHB1dCAoZGl0dG8pCisJCSAqICMgZWNobyBgdHJ1ZSB8IHRyYXBgICAgIDwtLS0gaW4gc3Vic2hlbGwgLSBvdXRwdXQgKGJ1dCB0cmFwcyBhcmUgcmVzZXQhKQorCQkgKiB0cmFwIC0tICdlY2hvIEhvJyBTSUdXSU5DSAorCQkgKiAjIGVjaG8gYCh0cmFwKWAgICAgICAgICA8LS0tIGluIHN1YnNoZWxsIGluIHN1YnNoZWxsIC0gb3V0cHV0CisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqICMgZWNobyBgdHJ1ZSB8ICh0cmFwKWAgIDwtLS0gaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgLSBvdXRwdXQhCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqCisJCSAqIFRoZSBydWxlcyB3aGVuIHRvIGZvcmdldCBhbmQgd2hlbiB0byBub3QgZm9yZ2V0IHRyYXBzCisJCSAqIGdldCByZWFsbHkgY29tcGxleCBhbmQgbm9uc2Vuc2ljYWwuCisJCSAqCisJCSAqIE91ciBzb2x1dGlvbjogT05MWSBiYXJlICQodHJhcCkgb3IgYHRyYXBgIGlzIHNwZWNpYWwuCisJCSAqLworCQkvKiBTYXZlIHRyYXAgaGFuZGxlciBzdHJpbmdzIGZvciB0cmFwIGJ1aWx0aW4gdG8gcHJpbnQgKi8KKwkJdHJhcF9wdHIgPSBtZW1jcHkoeG1hbGxvYyhzaXplb2YodHJhcCkpLCB0cmFwLCBzaXplb2YodHJhcCkpOworCQkvKiBGYWxsIHRocm91Z2ggaW50byBjbGVhcmluZyB0cmFwcyAqLworCX0KKwljbGVhcl90cmFwcygpOworI2lmIEpPQlMKKwkvKiBkbyBqb2IgY29udHJvbCBvbmx5IGluIHJvb3Qgc2hlbGwgKi8KKwlkb2luZ19qb2JjdGwgPSAwOworCWlmIChtb2RlICE9IEZPUktfTk9KT0IgJiYganAtPmpvYmN0bCAmJiBvbGRsdmwgPT0gMCkgeworCQlwaWRfdCBwZ3JwOworCisJCWlmIChqcC0+bnByb2NzID09IDApCisJCQlwZ3JwID0gZ2V0cGlkKCk7CisJCWVsc2UKKwkJCXBncnAgPSBqcC0+cHNbMF0ucHNfcGlkOworCQkvKiB0aGlzIGNhbiBmYWlsIGJlY2F1c2Ugd2UgYXJlIGRvaW5nIGl0IGluIHRoZSBwYXJlbnQgYWxzbyAqLworCQlzZXRwZ2lkKDAsIHBncnApOworCQlpZiAobW9kZSA9PSBGT1JLX0ZHKQorCQkJeHRjc2V0cGdycCh0dHlmZCwgcGdycCk7CisJCXNldHNpZ25hbChTSUdUU1RQKTsKKwkJc2V0c2lnbmFsKFNJR1RUT1UpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKG1vZGUgPT0gRk9SS19CRykgeworCQkvKiBtYW4gYmFzaDogIldoZW4gam9iIGNvbnRyb2wgaXMgbm90IGluIGVmZmVjdCwKKwkJICogYXN5bmNocm9ub3VzIGNvbW1hbmRzIGlnbm9yZSBTSUdJTlQgYW5kIFNJR1FVSVQiICovCisJCWlnbm9yZXNpZyhTSUdJTlQpOworCQlpZ25vcmVzaWcoU0lHUVVJVCk7CisJCWlmIChqcC0+bnByb2NzID09IDApIHsKKwkJCWNsb3NlKDApOworCQkJaWYgKG9wZW4oYmJfZGV2X251bGwsIE9fUkRPTkxZKSAhPSAwKQorCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJjYW4ndCBvcGVuICclcyciLCBiYl9kZXZfbnVsbCk7CisJCX0KKwl9CisJaWYgKG9sZGx2bCA9PSAwKSB7CisJCWlmIChpZmxhZykgeyAvKiB3aHkgaWYgaWZsYWcgb25seT8gKi8KKwkJCXNldHNpZ25hbChTSUdJTlQpOworCQkJc2V0c2lnbmFsKFNJR1RFUk0pOworCQl9CisJCS8qIG1hbiBiYXNoOgorCQkgKiAiSW4gYWxsIGNhc2VzLCBiYXNoIGlnbm9yZXMgU0lHUVVJVC4gTm9uLWJ1aWx0aW4KKwkJICogY29tbWFuZHMgcnVuIGJ5IGJhc2ggaGF2ZSBzaWduYWwgaGFuZGxlcnMKKwkJICogc2V0IHRvIHRoZSB2YWx1ZXMgaW5oZXJpdGVkIGJ5IHRoZSBzaGVsbAorCQkgKiBmcm9tIGl0cyBwYXJlbnQiLgorCQkgKiBUYWtlIGNhcmUgb2YgdGhlIHNlY29uZCBydWxlOiAqLworCQlzZXRzaWduYWwoU0lHUVVJVCk7CisJfQorI2lmIEpPQlMKKwlpZiAobiAmJiBuLT50eXBlID09IE5DTUQKKwkgJiYgbi0+bmNtZC5hcmdzICYmIHN0cmNtcChuLT5uY21kLmFyZ3MtPm5hcmcudGV4dCwgImpvYnMiKSA9PSAwCisJKSB7CisJCVRSQUNFKCgiSm9iIGhhY2tcbiIpKTsKKwkJLyogImpvYnMiOiB3ZSBkbyBub3Qgd2FudCB0byBjbGVhciBqb2IgbGlzdCBmb3IgaXQsCisJCSAqIGluc3RlYWQgd2UgcmVtb3ZlIG9ubHkgX2l0c18gb3duXyBqb2IgZnJvbSBqb2IgbGlzdC4KKwkJICogVGhpcyBtYWtlcyAiam9icyAuLi4uIHwgY2F0IiBtb3JlIHVzZWZ1bC4KKwkJICovCisJCWZyZWVqb2IoY3Vyam9iKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCWZvciAoanAgPSBjdXJqb2I7IGpwOyBqcCA9IGpwLT5wcmV2X2pvYikKKwkJZnJlZWpvYihqcCk7CisJam9ibGVzcyA9IDA7Cit9CisKKy8qIENhbGxlZCBhZnRlciBmb3JrKCksIGluIHBhcmVudCAqLworI2lmICFKT0JTCisjZGVmaW5lIGZvcmtwYXJlbnQoanAsIG4sIG1vZGUsIHBpZCkgZm9ya3BhcmVudChqcCwgbW9kZSwgcGlkKQorI2VuZGlmCitzdGF0aWMgdm9pZAorZm9ya3BhcmVudChzdHJ1Y3Qgam9iICpqcCwgdW5pb24gbm9kZSAqbiwgaW50IG1vZGUsIHBpZF90IHBpZCkKK3sKKwlUUkFDRSgoIkluIHBhcmVudCBzaGVsbDogY2hpbGQgPSAlZFxuIiwgcGlkKSk7CisJaWYgKCFqcCkgeworCQl3aGlsZSAoam9ibGVzcyAmJiBkb3dhaXQoRE9XQUlUX05PTkJMT0NLLCBOVUxMKSA+IDApCisJCQljb250aW51ZTsKKwkJam9ibGVzcysrOworCQlyZXR1cm47CisJfQorI2lmIEpPQlMKKwlpZiAobW9kZSAhPSBGT1JLX05PSk9CICYmIGpwLT5qb2JjdGwpIHsKKwkJaW50IHBncnA7CisKKwkJaWYgKGpwLT5ucHJvY3MgPT0gMCkKKwkJCXBncnAgPSBwaWQ7CisJCWVsc2UKKwkJCXBncnAgPSBqcC0+cHNbMF0ucHNfcGlkOworCQkvKiBUaGlzIGNhbiBmYWlsIGJlY2F1c2Ugd2UgYXJlIGRvaW5nIGl0IGluIHRoZSBjaGlsZCBhbHNvICovCisJCXNldHBnaWQocGlkLCBwZ3JwKTsKKwl9CisjZW5kaWYKKwlpZiAobW9kZSA9PSBGT1JLX0JHKSB7CisJCWJhY2tnbmRwaWQgPSBwaWQ7ICAgICAgICAgICAgICAgLyogc2V0ICQhICovCisJCXNldF9jdXJqb2IoanAsIENVUl9SVU5OSU5HKTsKKwl9CisJaWYgKGpwKSB7CisJCXN0cnVjdCBwcm9jc3RhdCAqcHMgPSAmanAtPnBzW2pwLT5ucHJvY3MrK107CisJCXBzLT5wc19waWQgPSBwaWQ7CisJCXBzLT5wc19zdGF0dXMgPSAtMTsKKwkJcHMtPnBzX2NtZCA9IG51bGxzdHI7CisjaWYgSk9CUworCQlpZiAoZG9pbmdfam9iY3RsICYmIG4pCisJCQlwcy0+cHNfY21kID0gY29tbWFuZHRleHQobik7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2ZvcmtzaGVsbChzdHJ1Y3Qgam9iICpqcCwgdW5pb24gbm9kZSAqbiwgaW50IG1vZGUpCit7CisJaW50IHBpZDsKKworCVRSQUNFKCgiZm9ya3NoZWxsKCUlJWQsICVwLCAlZCkgY2FsbGVkXG4iLCBqb2JubyhqcCksIG4sIG1vZGUpKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIHsKKwkJVFJBQ0UoKCJGb3JrIGZhaWxlZCwgZXJybm89JWQiLCBlcnJubykpOworCQlpZiAoanApCisJCQlmcmVlam9iKGpwKTsKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImNhbid0IGZvcmsiKTsKKwl9CisJaWYgKHBpZCA9PSAwKSB7CisJCUNMRUFSX1JBTkRPTV9UKCZyYW5kb21fZ2VuKTsgLyogb3IgZWxzZSAkUkFORE9NIHJlcGVhdHMgaW4gY2hpbGQgKi8KKwkJZm9ya2NoaWxkKGpwLCBuLCBtb2RlKTsKKwl9IGVsc2UgeworCQlmb3JrcGFyZW50KGpwLCBuLCBtb2RlLCBwaWQpOworCX0KKwlyZXR1cm4gcGlkOworfQorCisvKgorICogV2FpdCBmb3Igam9iIHRvIGZpbmlzaC4KKyAqCisgKiBVbmRlciBqb2IgY29udHJvbCB3ZSBoYXZlIHRoZSBwcm9ibGVtIHRoYXQgd2hpbGUgYSBjaGlsZCBwcm9jZXNzCisgKiBpcyBydW5uaW5nIGludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSB1c2VyIGFyZSBzZW50IHRvIHRoZSBjaGlsZAorICogYnV0IG5vdCB0byB0aGUgc2hlbGwuICBUaGlzIG1lYW5zIHRoYXQgYW4gaW5maW5pdGUgbG9vcCBzdGFydGVkIGJ5CisgKiBhbiBpbnRlcmFjdGl2ZSB1c2VyIG1heSBiZSBoYXJkIHRvIGtpbGwuICBXaXRoIGpvYiBjb250cm9sIHR1cm5lZCBvZmYsCisgKiBhbiBpbnRlcmFjdGl2ZSB1c2VyIG1heSBwbGFjZSBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIGluc2lkZSBhIGxvb3AuCisgKiBJZiB0aGUgaW50ZXJhY3RpdmUgcHJvZ3JhbSBjYXRjaGVzIGludGVycnVwdHMsIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudAorICogdGhlc2UgaW50ZXJydXB0cyB0byBhbHNvIGFib3J0IHRoZSBsb29wLiAgVGhlIGFwcHJvYWNoIHdlIHRha2UgaGVyZQorICogaXMgdG8gaGF2ZSB0aGUgc2hlbGwgaWdub3JlIGludGVycnVwdCBzaWduYWxzIHdoaWxlIHdhaXRpbmcgZm9yIGEKKyAqIGZvcmVncm91bmQgcHJvY2VzcyB0byB0ZXJtaW5hdGUsIGFuZCB0aGVuIHNlbmQgaXRzZWxmIGFuIGludGVycnVwdAorICogc2lnbmFsIGlmIHRoZSBjaGlsZCBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGFuIGludGVycnVwdCBzaWduYWwuCisgKiBVbmZvcnR1bmF0ZWx5LCBzb21lIHByb2dyYW1zIHdhbnQgdG8gZG8gYSBiaXQgb2YgY2xlYW51cCBhbmQgdGhlbgorICogZXhpdCBvbiBpbnRlcnJ1cHQ7IHVubGVzcyB0aGVzZSBwcm9jZXNzZXMgdGVybWluYXRlIHRoZW1zZWx2ZXMgYnkKKyAqIHNlbmRpbmcgYSBzaWduYWwgdG8gdGhlbXNlbHZlcyAoaW5zdGVhZCBvZiBjYWxsaW5nIGV4aXQpIHRoZXkgd2lsbAorICogY29uZnVzZSB0aGlzIGFwcHJvYWNoLgorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCitzdGF0aWMgaW50Cit3YWl0Zm9yam9iKHN0cnVjdCBqb2IgKmpwKQoreworCWludCBzdDsKKworCVRSQUNFKCgid2FpdGZvcmpvYiglJSVkKSBjYWxsZWRcbiIsIGpvYm5vKGpwKSkpOworCisJSU5UX09GRjsKKwl3aGlsZSAoanAtPnN0YXRlID09IEpPQlJVTk5JTkcpIHsKKwkJLyogSW4gbm9uLWludGVyYWN0aXZlIHNoZWxscywgd2UgX2Nhbl8gZ2V0CisJCSAqIGEga2V5Ym9hcmQgc2lnbmFsIGhlcmUgYW5kIGJlIEVJTlRSZWQsCisJCSAqIGJ1dCB3ZSBqdXN0IGxvb3AgYmFjaywgd2FpdGluZyBmb3IgY29tbWFuZCB0byBjb21wbGV0ZS4KKwkJICoKKwkJICogbWFuIGJhc2g6CisJCSAqICJJZiBiYXNoIGlzIHdhaXRpbmcgZm9yIGEgY29tbWFuZCB0byBjb21wbGV0ZSBhbmQgcmVjZWl2ZXMKKwkJICogYSBzaWduYWwgZm9yIHdoaWNoIGEgdHJhcCBoYXMgYmVlbiBzZXQsIHRoZSB0cmFwCisJCSAqIHdpbGwgbm90IGJlIGV4ZWN1dGVkIHVudGlsIHRoZSBjb21tYW5kIGNvbXBsZXRlcy4iCisJCSAqCisJCSAqIFJlYWxpdHkgaXMgdGhhdCBldmVuIGlmIHRyYXAgaXMgbm90IHNldCwgYmFzaAorCQkgKiB3aWxsIG5vdCBhY3Qgb24gdGhlIHNpZ25hbCB1bnRpbCBjb21tYW5kIGNvbXBsZXRlcy4KKwkJICogVHJ5IHRoaXMuIHNsZWVwNWludG9mZi5jOgorCQkgKiAjaW5jbHVkZSA8c2lnbmFsLmg+CisJCSAqICNpbmNsdWRlIDx1bmlzdGQuaD4KKwkJICogaW50IG1haW4oKSB7CisJCSAqICAgICAgICAgc2lnc2V0X3Qgc2V0OworCQkgKiAgICAgICAgIHNpZ2VtcHR5c2V0KCZzZXQpOworCQkgKiAgICAgICAgIHNpZ2FkZHNldCgmc2V0LCBTSUdJTlQpOworCQkgKiAgICAgICAgIHNpZ2FkZHNldCgmc2V0LCBTSUdRVUlUKTsKKwkJICogICAgICAgICBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzZXQsIE5VTEwpOworCQkgKiAgICAgICAgIHNsZWVwKDUpOworCQkgKiAgICAgICAgIHJldHVybiAwOworCQkgKiB9CisJCSAqICQgYmFzaCAtYyAnLi9zbGVlcDVpbnRvZmY7IGVjaG8gaGknCisJCSAqIF5DXkNeQ15DIDwtLS0gcHJlc3NpbmcgXkMgb25jZSBhIHNlY29uZAorCQkgKiAkIF8KKwkJICogJCBiYXNoIC1jICcuL3NsZWVwNWludG9mZjsgZWNobyBoaScKKwkJICogXlxeXF5cXlxoaSA8LS0tIHByZXNzaW5nIF5cIChTSUdRVUlUKQorCQkgKiAkIF8KKwkJICovCisJCWRvd2FpdChET1dBSVRfQkxPQ0ssIGpwKTsKKwl9CisJSU5UX09OOworCisJc3QgPSBnZXRzdGF0dXMoanApOworI2lmIEpPQlMKKwlpZiAoanAtPmpvYmN0bCkgeworCQl4dGNzZXRwZ3JwKHR0eWZkLCByb290cGlkKTsKKwkJLyoKKwkJICogVGhpcyBpcyB0cnVseSBncm9zcy4KKwkJICogSWYgd2UncmUgZG9pbmcgam9iIGNvbnRyb2wsIHRoZW4gd2UgZGlkIGEgVElPQ1NQR1JQIHdoaWNoCisJCSAqIGNhdXNlZCB1cyAodGhlIHNoZWxsKSB0byBubyBsb25nZXIgYmUgaW4gdGhlIGNvbnRyb2xsaW5nCisJCSAqIHNlc3Npb24gLS0gc28gd2Ugd291bGRuJ3QgaGF2ZSBzZWVuIGFueSBeQy9TSUdJTlQuICBTbywgd2UKKwkJICogaW50dWl0IGZyb20gdGhlIHN1YnByb2Nlc3MgZXhpdCBzdGF0dXMgd2hldGhlciBhIFNJR0lOVAorCQkgKiBvY2N1cnJlZCwgYW5kIGlmIHNvIGludGVycnVwdCBvdXJzZWx2ZXMuICBZdWNrLiAgLSBteWNyb2Z0CisJCSAqLworCQlpZiAoanAtPnNpZ2ludCkgLyogVE9ETzogZG8gdGhlIHNhbWUgd2l0aCBhbGwgc2lnbmFscyAqLworCQkJcmFpc2UoU0lHSU5UKTsgLyogLi4uIGJ5IHJhaXNlKGpwLT5zaWcpIGluc3RlYWQ/ICovCisJfQorCWlmIChqcC0+c3RhdGUgPT0gSk9CRE9ORSkKKyNlbmRpZgorCQlmcmVlam9iKGpwKTsKKwlyZXR1cm4gc3Q7Cit9CisKKy8qCisgKiByZXR1cm4gMSBpZiB0aGVyZSBhcmUgc3RvcHBlZCBqb2JzLCBvdGhlcndpc2UgMAorICovCitzdGF0aWMgaW50CitzdG9wcGVkam9icyh2b2lkKQoreworCXN0cnVjdCBqb2IgKmpwOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSAwOworCWlmIChqb2Jfd2FybmluZykKKwkJZ290byBvdXQ7CisJanAgPSBjdXJqb2I7CisJaWYgKGpwICYmIGpwLT5zdGF0ZSA9PSBKT0JTVE9QUEVEKSB7CisJCW91dDJzdHIoIllvdSBoYXZlIHN0b3BwZWQgam9icy5cbiIpOworCQlqb2Jfd2FybmluZyA9IDI7CisJCXJldHZhbCsrOworCX0KKyBvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiA9PT09PT09PT09PT0gcmVkaXIuYworICoKKyAqIENvZGUgZm9yIGRlYWxpbmcgd2l0aCBpbnB1dC9vdXRwdXQgcmVkaXJlY3Rpb24uCisgKi8KKworI3VuZGVmIEVNUFRZCisjdW5kZWYgQ0xPU0VECisjZGVmaW5lIEVNUFRZIC0yICAgICAgICAgICAgICAgIC8qIG1hcmtzIGFuIHVudXNlZCBzbG90IGluIHJlZGlydGFiICovCisjZGVmaW5lIENMT1NFRCAtMyAgICAgICAgICAgICAgIC8qIG1hcmtzIGEgc2xvdCBvZiBwcmV2aW91c2x5LWNsb3NlZCBmZCAqLworCisvKgorICogT3BlbiBhIGZpbGUgaW4gbm9jbG9iYmVyIG1vZGUuCisgKiBUaGUgY29kZSB3YXMgY29waWVkIGZyb20gYmFzaC4KKyAqLworc3RhdGljIGludAorbm9jbG9iYmVyb3Blbihjb25zdCBjaGFyICpmbmFtZSkKK3sKKwlpbnQgciwgZmQ7CisJc3RydWN0IHN0YXQgZmluZm8sIGZpbmZvMjsKKworCS8qCisJICogSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSwgcmV0dXJuIGFuIGVycm9yCisJICogaW1tZWRpYXRlbHkuCisJICovCisJciA9IHN0YXQoZm5hbWUsICZmaW5mbyk7CisJaWYgKHIgPT0gMCAmJiBTX0lTUkVHKGZpbmZvLnN0X21vZGUpKSB7CisJCWVycm5vID0gRUVYSVNUOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZmlsZSB3YXMgbm90IHByZXNlbnQgKHIgIT0gMCksIG1ha2Ugc3VyZSB3ZSBvcGVuIGl0CisJICogZXhjbHVzaXZlbHkgc28gdGhhdCBpZiBpdCBpcyBjcmVhdGVkIGJlZm9yZSB3ZSBvcGVuIGl0LCBvdXIgb3BlbgorCSAqIHdpbGwgZmFpbC4gIE1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCB0cnVuY2F0ZSBhbiBleGlzdGluZyBmaWxlLgorCSAqIE5vdGUgdGhhdCB3ZSBkb24ndCB0dXJuIG9uIE9fRVhDTCB1bmxlc3MgdGhlIHN0YXQgZmFpbGVkIC0tIGlmIHRoZQorCSAqIGZpbGUgd2FzIG5vdCBhIHJlZ3VsYXIgZmlsZSwgd2UgbGVhdmUgT19FWENMIG9mZi4KKwkgKi8KKwlpZiAociAhPSAwKQorCQlyZXR1cm4gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX0VYQ0wsIDA2NjYpOworCWZkID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVCwgMDY2Nik7CisKKwkvKiBJZiB0aGUgb3BlbiBmYWlsZWQsIHJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJpZ2h0IGF3YXkuICovCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJLyoKKwkgKiBPSywgdGhlIG9wZW4gc3VjY2VlZGVkLCBidXQgdGhlIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20gYQorCSAqIG5vbi1yZWd1bGFyIGZpbGUgdG8gYSByZWd1bGFyIGZpbGUgYmV0d2VlbiB0aGUgc3RhdCBhbmQgdGhlIG9wZW4uCisJICogV2UgYXJlIGFzc3VtaW5nIHRoYXQgdGhlIE9fRVhDTCBvcGVuIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgRklMRU5BTUUKKwkgKiBkaWQgbm90IGV4aXN0IGFuZCBpcyBzeW1saW5rZWQgdG8gYW4gZXhpc3RpbmcgZmlsZSBiZXR3ZWVuIHRoZSBzdGF0CisJICogYW5kIG9wZW4uCisJICovCisKKwkvKgorCSAqIElmIHdlIGNhbiBvcGVuIGl0IGFuZCBmc3RhdCB0aGUgZmlsZSBkZXNjcmlwdG9yLCBhbmQgbmVpdGhlciBjaGVjaworCSAqIHJldmVhbGVkIHRoYXQgaXQgd2FzIGEgcmVndWxhciBmaWxlLCBhbmQgdGhlIGZpbGUgaGFzIG5vdCBiZWVuCisJICogcmVwbGFjZWQsIHJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorCSAqLworCWlmIChmc3RhdChmZCwgJmZpbmZvMikgPT0gMAorCSAmJiAhU19JU1JFRyhmaW5mbzIuc3RfbW9kZSkKKwkgJiYgZmluZm8uc3RfZGV2ID09IGZpbmZvMi5zdF9kZXYKKwkgJiYgZmluZm8uc3RfaW5vID09IGZpbmZvMi5zdF9pbm8KKwkpIHsKKwkJcmV0dXJuIGZkOworCX0KKworCS8qIFRoZSBmaWxlIGhhcyBiZWVuIHJlcGxhY2VkLiAgYmFkbmVzcy4gKi8KKwljbG9zZShmZCk7CisJZXJybm8gPSBFRVhJU1Q7CisJcmV0dXJuIC0xOworfQorCisvKgorICogSGFuZGxlIGhlcmUgZG9jdW1lbnRzLiAgTm9ybWFsbHkgd2UgZm9yayBvZmYgYSBwcm9jZXNzIHRvIHdyaXRlIHRoZQorICogZGF0YSB0byBhIHBpcGUuICBJZiB0aGUgZG9jdW1lbnQgaXMgc2hvcnQsIHdlIGNhbiBzdHVmZiB0aGUgZGF0YSBpbgorICogdGhlIHBpcGUgd2l0aG91dCBmb3JraW5nLgorICovCisvKiBvcGVuaGVyZSBuZWVkcyB0aGlzIGZvcndhcmQgcmVmZXJlbmNlICovCitzdGF0aWMgdm9pZCBleHBhbmRoZXJlKHVuaW9uIG5vZGUgKmFyZywgaW50IGZkKTsKK3N0YXRpYyBpbnQKK29wZW5oZXJlKHVuaW9uIG5vZGUgKnJlZGlyKQoreworCWludCBwaXBbMl07CisJc2l6ZV90IGxlbiA9IDA7CisKKwlpZiAocGlwZShwaXApIDwgMCkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInBpcGUgY2FsbCBmYWlsZWQiKTsKKwlpZiAocmVkaXItPnR5cGUgPT0gTkhFUkUpIHsKKwkJbGVuID0gc3RybGVuKHJlZGlyLT5uaGVyZS5kb2MtPm5hcmcudGV4dCk7CisJCWlmIChsZW4gPD0gUElQRV9CVUYpIHsKKwkJCWZ1bGxfd3JpdGUocGlwWzFdLCByZWRpci0+bmhlcmUuZG9jLT5uYXJnLnRleHQsIGxlbik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAoZm9ya3NoZWxsKChzdHJ1Y3Qgam9iICopTlVMTCwgKHVuaW9uIG5vZGUgKilOVUxMLCBGT1JLX05PSk9CKSA9PSAwKSB7CisJCS8qIGNoaWxkICovCisJCWNsb3NlKHBpcFswXSk7CisJCWlnbm9yZXNpZyhTSUdJTlQpOyAgLy9zaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKwkJaWdub3Jlc2lnKFNJR1FVSVQpOyAvL3NpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKKwkJaWdub3Jlc2lnKFNJR0hVUCk7ICAvL3NpZ25hbChTSUdIVVAsIFNJR19JR04pOworCQlpZ25vcmVzaWcoU0lHVFNUUCk7IC8vc2lnbmFsKFNJR1RTVFAsIFNJR19JR04pOworCQlzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisJCWlmIChyZWRpci0+dHlwZSA9PSBOSEVSRSkKKwkJCWZ1bGxfd3JpdGUocGlwWzFdLCByZWRpci0+bmhlcmUuZG9jLT5uYXJnLnRleHQsIGxlbik7CisJCWVsc2UgLyogTlhIRVJFICovCisJCQlleHBhbmRoZXJlKHJlZGlyLT5uaGVyZS5kb2MsIHBpcFsxXSk7CisJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorIG91dDoKKwljbG9zZShwaXBbMV0pOworCXJldHVybiBwaXBbMF07Cit9CisKK3N0YXRpYyBpbnQKK29wZW5yZWRpcmVjdCh1bmlvbiBub2RlICpyZWRpcikKK3sKKwljaGFyICpmbmFtZTsKKwlpbnQgZjsKKworCXN3aXRjaCAocmVkaXItPm5maWxlLnR5cGUpIHsKKwljYXNlIE5GUk9NOgorCQlmbmFtZSA9IHJlZGlyLT5uZmlsZS5leHBmbmFtZTsKKwkJZiA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZKTsKKwkJaWYgKGYgPCAwKQorCQkJZ290byBlb3BlbjsKKwkJYnJlYWs7CisJY2FzZSBORlJPTVRPOgorCQlmbmFtZSA9IHJlZGlyLT5uZmlsZS5leHBmbmFtZTsKKwkJZiA9IG9wZW4oZm5hbWUsIE9fUkRXUnxPX0NSRUFULCAwNjY2KTsKKwkJaWYgKGYgPCAwKQorCQkJZ290byBlY3JlYXRlOworCQlicmVhazsKKwljYXNlIE5UTzoKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJY2FzZSBOVE8yOgorI2VuZGlmCisJCS8qIFRha2UgY2FyZSBvZiBub2Nsb2JiZXIgbW9kZS4gKi8KKwkJaWYgKENmbGFnKSB7CisJCQlmbmFtZSA9IHJlZGlyLT5uZmlsZS5leHBmbmFtZTsKKwkJCWYgPSBub2Nsb2JiZXJvcGVuKGZuYW1lKTsKKwkJCWlmIChmIDwgMCkKKwkJCQlnb3RvIGVjcmVhdGU7CisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgTkNMT0JCRVI6CisJCWZuYW1lID0gcmVkaXItPm5maWxlLmV4cGZuYW1lOworCQlmID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2KTsKKwkJaWYgKGYgPCAwKQorCQkJZ290byBlY3JlYXRlOworCQlicmVhazsKKwljYXNlIE5BUFBFTkQ6CisJCWZuYW1lID0gcmVkaXItPm5maWxlLmV4cGZuYW1lOworCQlmID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX0FQUEVORCwgMDY2Nik7CisJCWlmIChmIDwgMCkKKwkJCWdvdG8gZWNyZWF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKyNpZiBERUJVRworCQlhYm9ydCgpOworI2VuZGlmCisJCS8qIEZhbGwgdGhyb3VnaCB0byBlbGltaW5hdGUgd2FybmluZy4gKi8KKy8qIE91ciBzaW5nbGUgY2FsbGVyIGRvZXMgdGhpcyBpdHNlbGYgKi8KKy8vCWNhc2UgTlRPRkQ6CisvLwljYXNlIE5GUk9NRkQ6CisvLwkJZiA9IC0xOworLy8JCWJyZWFrOworCWNhc2UgTkhFUkU6CisJY2FzZSBOWEhFUkU6CisJCWYgPSBvcGVuaGVyZShyZWRpcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBmOworIGVjcmVhdGU6CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImNhbid0IGNyZWF0ZSAlczogJXMiLCBmbmFtZSwgZXJybXNnKGVycm5vLCAibm9uZXhpc3RlbnQgZGlyZWN0b3J5IikpOworIGVvcGVuOgorCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJjYW4ndCBvcGVuICVzOiAlcyIsIGZuYW1lLCBlcnJtc2coZXJybm8sICJubyBzdWNoIGZpbGUiKSk7Cit9CisKKy8qCisgKiBDb3B5IGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlID49IHRvLiAgUmV0dXJucyAtMQorICogaWYgdGhlIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkLCBFTVBUWSBpZiB0aGVyZSBhcmUgbm8gdW51c2VkCisgKiBmaWxlIGRlc2NyaXB0b3JzIGxlZnQuCisgKi8KKy8qIDB4ODAwLi4wMDogYml0IHRvIHNldCBpbiAidG8iIHRvIHJlcXVlc3QgZHVwMiBpbnN0ZWFkIG9mIGZjbnRsKEZfRFVQRkQpLgorICogb2xkIGNvZGUgd2FzIGRvaW5nIGNsb3NlKHRvKSBwcmlvciB0byBjb3B5ZmQoKSB0byBhY2hpZXZlIHRoZSBzYW1lICovCitlbnVtIHsKKwlDT1BZRkRfRVhBQ1QgICA9IChpbnQpfihJTlRfTUFYKSwKKwlDT1BZRkRfUkVTVE9SRSA9IChpbnQpKCh1bnNpZ25lZClDT1BZRkRfRVhBQ1QgPj4gMSksCit9Oworc3RhdGljIGludAorY29weWZkKGludCBmcm9tLCBpbnQgdG8pCit7CisJaW50IG5ld2ZkOworCisJaWYgKHRvICYgQ09QWUZEX0VYQUNUKSB7CisJCXRvICY9IH5DT1BZRkRfRVhBQ1Q7CisJCS8qaWYgKGZyb20gIT0gdG8pKi8KKwkJCW5ld2ZkID0gZHVwMihmcm9tLCB0byk7CisJfSBlbHNlIHsKKwkJbmV3ZmQgPSBmY250bChmcm9tLCBGX0RVUEZELCB0byk7CisJfQorCWlmIChuZXdmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVNRklMRSkKKwkJCXJldHVybiBFTVBUWTsKKwkJLyogSGFwcGVucyB3aGVuIHNvdXJjZSBmZCBpcyBub3Qgb3BlbjogdHJ5ICJlY2hvID4mOTkiICovCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCIlZDogJW0iLCBmcm9tKTsKKwl9CisJcmV0dXJuIG5ld2ZkOworfQorCisvKiBTdHJ1Y3QgZGVmIGFuZCB2YXJpYWJsZSBhcmUgbW92ZWQgZG93biB0byB0aGUgZmlyc3QgdXNhZ2Ugc2l0ZSAqLworc3RydWN0IHR3b19mZF90IHsKKwlpbnQgb3JpZywgY29weTsKK307CitzdHJ1Y3QgcmVkaXJ0YWIgeworCXN0cnVjdCByZWRpcnRhYiAqbmV4dDsKKwlpbnQgbnVsbHJlZGlyczsKKwlpbnQgcGFpcl9jb3VudDsKKwlzdHJ1Y3QgdHdvX2ZkX3QgdHdvX2ZkW107Cit9OworI2RlZmluZSByZWRpcmxpc3QgKEdfdmFyLnJlZGlybGlzdCkKKworc3RhdGljIGludCBuZWVkX3RvX3JlbWVtYmVyKHN0cnVjdCByZWRpcnRhYiAqcnAsIGludCBmZCkKK3sKKwlpbnQgaTsKKworCWlmICghcnApIC8qIHJlbWVtYmVyaW5nIHdhcyBub3QgcmVxdWVzdGVkICovCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHJwLT5wYWlyX2NvdW50OyBpKyspIHsKKwkJaWYgKHJwLT50d29fZmRbaV0ub3JpZyA9PSBmZCkgeworCQkJLyogYWxyZWFkeSByZW1lbWJlcmVkICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyogImhpZGRlbiIgZmQgaXMgYSBmZCB1c2VkIHRvIHJlYWQgc2NyaXB0cywgb3IgYSBjb3B5IG9mIHN1Y2ggKi8KK3N0YXRpYyBpbnQgaXNfaGlkZGVuX2ZkKHN0cnVjdCByZWRpcnRhYiAqcnAsIGludCBmZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGFyc2VmaWxlICpwZjsKKworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIDA7CisJLyogQ2hlY2sgb3BlbiBzY3JpcHRzJyBmZHMgKi8KKwlwZiA9IGdfcGFyc2VmaWxlOworCXdoaWxlIChwZikgeworCQkvKiBXZSBza2lwIHBmX2ZkID09IDAgY2FzZSBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgY2FzZToKKwkJICogJCBhc2ggICMgcnVubmluZyBhc2ggaW50ZXJhY3RpdmVseQorCQkgKiAkIC4gLi9zY3JpcHQuc2gKKwkJICogYW5kIGluIHNjcmlwdC5zaDogImV4ZWMgOT4mMCIuCisJCSAqIEV2ZW4gdGhvdWdoIHRvcC1sZXZlbCBwZl9mZCBfaXNfIDAsCisJCSAqIGl0J3Mgc3RpbGwgb2sgdG8gdXNlIGl0OiAicmVhZCIgYnVpbHRpbiB1c2VzIGl0LAorCQkgKiB3aHkgc2hvdWxkIHdlIGNyaXBwbGUgImV4ZWMiIGJ1aWx0aW4/CisJCSAqLworCQlpZiAocGYtPnBmX2ZkID4gMCAmJiBmZCA9PSBwZi0+cGZfZmQpIHsKKwkJCXJldHVybiAxOworCQl9CisJCXBmID0gcGYtPnByZXY7CisJfQorCisJaWYgKCFycCkKKwkJcmV0dXJuIDA7CisJLyogQ2hlY2sgc2F2ZWQgZmRzIG9mIHJlZGlyZWN0cyAqLworCWZkIHw9IENPUFlGRF9SRVNUT1JFOworCWZvciAoaSA9IDA7IGkgPCBycC0+cGFpcl9jb3VudDsgaSsrKSB7CisJCWlmIChycC0+dHdvX2ZkW2ldLmNvcHkgPT0gZmQpIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogUHJvY2VzcyBhIGxpc3Qgb2YgcmVkaXJlY3Rpb24gY29tbWFuZHMuICBJZiB0aGUgUkVESVJfUFVTSCBmbGFnIGlzIHNldCwKKyAqIG9sZCBmaWxlIGRlc2NyaXB0b3JzIGFyZSBzdGFzaGVkIGF3YXkgc28gdGhhdCB0aGUgcmVkaXJlY3Rpb24gY2FuIGJlCisgKiB1bmRvbmUgYnkgY2FsbGluZyBwb3ByZWRpci4KKyAqLworLyogZmxhZ3MgcGFzc2VkIHRvIHJlZGlyZWN0ICovCisjZGVmaW5lIFJFRElSX1BVU0ggICAgMDEgICAgICAgIC8qIHNhdmUgcHJldmlvdXMgdmFsdWVzIG9mIGZpbGUgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUkVESVJfU0FWRUZEMiAwMyAgICAgICAgLyogc2V0IHByZXZlcnJvdXQgKi8KK3N0YXRpYyB2b2lkCityZWRpcmVjdCh1bmlvbiBub2RlICpyZWRpciwgaW50IGZsYWdzKQoreworCXN0cnVjdCByZWRpcnRhYiAqc3Y7CisJaW50IHN2X3BvczsKKwlpbnQgaTsKKwlpbnQgZmQ7CisJaW50IG5ld2ZkOworCWludCBjb3BpZWRfZmQyID0gLTE7CisKKwlnX251bGxyZWRpcnMrKzsKKwlpZiAoIXJlZGlyKSB7CisJCXJldHVybjsKKwl9CisKKwlzdiA9IE5VTEw7CisJc3ZfcG9zID0gMDsKKwlJTlRfT0ZGOworCWlmIChmbGFncyAmIFJFRElSX1BVU0gpIHsKKwkJdW5pb24gbm9kZSAqdG1wID0gcmVkaXI7CisJCWRvIHsKKwkJCXN2X3BvcysrOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJCWlmICh0bXAtPm5maWxlLnR5cGUgPT0gTlRPMikKKwkJCQlzdl9wb3MrKzsKKyNlbmRpZgorCQkJdG1wID0gdG1wLT5uZmlsZS5uZXh0OworCQl9IHdoaWxlICh0bXApOworCQlzdiA9IGNrbWFsbG9jKHNpemVvZigqc3YpICsgc3ZfcG9zICogc2l6ZW9mKHN2LT50d29fZmRbMF0pKTsKKwkJc3YtPm5leHQgPSByZWRpcmxpc3Q7CisJCXN2LT5wYWlyX2NvdW50ID0gc3ZfcG9zOworCQlyZWRpcmxpc3QgPSBzdjsKKwkJc3YtPm51bGxyZWRpcnMgPSBnX251bGxyZWRpcnMgLSAxOworCQlnX251bGxyZWRpcnMgPSAwOworCQl3aGlsZSAoc3ZfcG9zID4gMCkgeworCQkJc3ZfcG9zLS07CisJCQlzdi0+dHdvX2ZkW3N2X3Bvc10ub3JpZyA9IHN2LT50d29fZmRbc3ZfcG9zXS5jb3B5ID0gRU1QVFk7CisJCX0KKwl9CisKKwlkbyB7CisJCWludCByaWdodF9mZCA9IC0xOworCQlmZCA9IHJlZGlyLT5uZmlsZS5mZDsKKwkJaWYgKHJlZGlyLT5uZmlsZS50eXBlID09IE5UT0ZEIHx8IHJlZGlyLT5uZmlsZS50eXBlID09IE5GUk9NRkQpIHsKKwkJCXJpZ2h0X2ZkID0gcmVkaXItPm5kdXAuZHVwZmQ7CisJCQkvL2JiX2Vycm9yX21zZygiZG9pbmcgJWQgPiAlZCIsIGZkLCByaWdodF9mZCk7CisJCQkvKiByZWRpcmVjdCBmcm9tL3RvIHNhbWUgZmlsZSBkZXNjcmlwdG9yPyAqLworCQkJaWYgKHJpZ2h0X2ZkID09IGZkKQorCQkJCWNvbnRpbnVlOworCQkJLyogImVjaG8gPiYxMCIgYW5kIDEwIGlzIGEgZmQgb3BlbmVkIHRvIGEgc2ggc2NyaXB0PyAqLworCQkJaWYgKGlzX2hpZGRlbl9mZChzdiwgcmlnaHRfZmQpKSB7CisJCQkJZXJybm8gPSBFQkFERjsgLyogYXMgaWYgaXQgaXMgY2xvc2VkICovCisJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiVkOiAlbSIsIHJpZ2h0X2ZkKTsKKwkJCX0KKwkJCW5ld2ZkID0gLTE7CisJCX0gZWxzZSB7CisJCQluZXdmZCA9IG9wZW5yZWRpcmVjdChyZWRpcik7IC8qIGFsd2F5cyA+PSAwICovCisJCQlpZiAoZmQgPT0gbmV3ZmQpIHsKKwkJCQkvKiBEZXNjcmlwdG9yIHdhc24ndCBvcGVuIGJlZm9yZSByZWRpcmVjdC4KKwkJCQkgKiBNYXJrIGl0IGZvciBjbG9zZSBpbiB0aGUgZnV0dXJlICovCisJCQkJaWYgKG5lZWRfdG9fcmVtZW1iZXIoc3YsIGZkKSkgeworCQkJCQlnb3RvIHJlbWVtYmVyX3RvX2Nsb3NlOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKyByZWRpcmVjdF9tb3JlOgorI2VuZGlmCisJCWlmIChuZWVkX3RvX3JlbWVtYmVyKHN2LCBmZCkpIHsKKwkJCS8qIENvcHkgb2xkIGRlc2NyaXB0b3IgKi8KKwkJCS8qIENhcmVmdWwgdG8gbm90IGFjY2lkZW50YWxseSAic2F2ZSIKKwkJCSAqIHRvIHRoZSBzYW1lIGZkIGFzIHJpZ2h0IHNpZGUgZmQgaW4gTj4mTSAqLworCQkJaW50IG1pbmZkID0gcmlnaHRfZmQgPCAxMCA/IDEwIDogcmlnaHRfZmQgKyAxOworCQkJaSA9IGZjbnRsKGZkLCBGX0RVUEZELCBtaW5mZCk7CisvKiBZb3UnZCBleHBlY3QgY29weSB0byBiZSBDTE9FWEVDZWQuIEN1cnJlbnRseSB0aGVzZSBleHRyYSAic2F2ZWQiIGZkcworICogYXJlIGNsb3NlZCBpbiBwb3ByZWRpcigpIGluIHRoZSBjaGlsZCwgcHJldmVudGluZyB0aGVtIGZyb20gbGVha2luZworICogaW50byBjaGlsZC4gKHBvcHJlZGlyKCkgYWxzbyBjbGVhbnMgdXAgdGhlIG1lc3MgaW4gY2FzZSBvZiBmYWlsdXJlcykKKyAqLworCQkJaWYgKGkgPT0gLTEpIHsKKwkJCQlpID0gZXJybm87CisJCQkJaWYgKGkgIT0gRUJBREYpIHsKKwkJCQkJLyogU3RyYW5nZSBlcnJvciAoZS5nLiAidG9vIG1hbnkgZmlsZXMiIEVNRklMRT8pICovCisJCQkJCWlmIChuZXdmZCA+PSAwKQorCQkJCQkJY2xvc2UobmV3ZmQpOworCQkJCQllcnJubyA9IGk7CisJCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCIlZDogJW0iLCBmZCk7CisJCQkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJCQl9CisJCQkJLyogRUJBREY6IGl0IGlzIG5vdCBvcGVuIC0gZ29vZCwgcmVtZW1iZXIgdG8gY2xvc2UgaXQgKi8KKyByZW1lbWJlcl90b19jbG9zZToKKwkJCQlpID0gQ0xPU0VEOworCQkJfSBlbHNlIHsgLyogZmQgaXMgb3Blbiwgc2F2ZSBpdHMgY29weSAqLworCQkJCS8qICJleGVjIGZkPiYtIiBzaG91bGQgbm90IGNsb3NlIGZkcworCQkJCSAqIHdoaWNoIHBvaW50IHRvIHNjcmlwdCBmaWxlKHMpLgorCQkJCSAqIEZvcmNlIHRoZW0gdG8gYmUgcmVzdG9yZWQgYWZ0ZXJ3YXJkcyAqLworCQkJCWlmIChpc19oaWRkZW5fZmQoc3YsIGZkKSkKKwkJCQkJaSB8PSBDT1BZRkRfUkVTVE9SRTsKKwkJCX0KKwkJCWlmIChmZCA9PSAyKQorCQkJCWNvcGllZF9mZDIgPSBpOworCQkJc3YtPnR3b19mZFtzdl9wb3NdLm9yaWcgPSBmZDsKKwkJCXN2LT50d29fZmRbc3ZfcG9zXS5jb3B5ID0gaTsKKwkJCXN2X3BvcysrOworCQl9CisJCWlmIChuZXdmZCA8IDApIHsKKwkJCS8qIE5UT0ZEL05GUk9NRkQ6IGNvcHkgcmVkaXItPm5kdXAuZHVwZmQgdG8gZmQgKi8KKwkJCWlmIChyZWRpci0+bmR1cC5kdXBmZCA8IDApIHsgLyogImZkPiYtIiAqLworCQkJCS8qIERvbid0IHdhbnQgdG8gdHJpZ2dlciBkZWJ1Z2dpbmcgKi8KKwkJCQlpZiAoZmQgIT0gLTEpCisJCQkJCWNsb3NlKGZkKTsKKwkJCX0gZWxzZSB7CisJCQkJY29weWZkKHJlZGlyLT5uZHVwLmR1cGZkLCBmZCB8IENPUFlGRF9FWEFDVCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZmQgIT0gbmV3ZmQpIHsgLyogbW92ZSBuZXdmZCB0byBmZCAqLworCQkJY29weWZkKG5ld2ZkLCBmZCB8IENPUFlGRF9FWEFDVCk7CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQkJaWYgKCEocmVkaXItPm5maWxlLnR5cGUgPT0gTlRPMiAmJiBmZCA9PSAyKSkKKyNlbmRpZgorCQkJCWNsb3NlKG5ld2ZkKTsKKwkJfQorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJaWYgKHJlZGlyLT5uZmlsZS50eXBlID09IE5UTzIgJiYgZmQgPT0gMSkgeworCQkJLyogV2UgYWxyZWFkeSByZWRpcmVjdGVkIGl0IHRvIGZkIDEsIG5vdyBjb3B5IGl0IHRvIDIgKi8KKwkJCW5ld2ZkID0gMTsKKwkJCWZkID0gMjsKKwkJCWdvdG8gcmVkaXJlY3RfbW9yZTsKKwkJfQorI2VuZGlmCisJfSB3aGlsZSAoKHJlZGlyID0gcmVkaXItPm5maWxlLm5leHQpICE9IE5VTEwpOworCisJSU5UX09OOworCWlmICgoZmxhZ3MgJiBSRURJUl9TQVZFRkQyKSAmJiBjb3BpZWRfZmQyID49IDApCisJCXByZXZlcnJvdXRfZmQgPSBjb3BpZWRfZmQyOworfQorCisvKgorICogVW5kbyB0aGUgZWZmZWN0cyBvZiB0aGUgbGFzdCByZWRpcmVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3BvcHJlZGlyKGludCBkcm9wLCBpbnQgcmVzdG9yZSkKK3sKKwlzdHJ1Y3QgcmVkaXJ0YWIgKnJwOworCWludCBpOworCisJaWYgKC0tZ19udWxscmVkaXJzID49IDApCisJCXJldHVybjsKKwlJTlRfT0ZGOworCXJwID0gcmVkaXJsaXN0OworCWZvciAoaSA9IDA7IGkgPCBycC0+cGFpcl9jb3VudDsgaSsrKSB7CisJCWludCBmZCA9IHJwLT50d29fZmRbaV0ub3JpZzsKKwkJaW50IGNvcHkgPSBycC0+dHdvX2ZkW2ldLmNvcHk7CisJCWlmIChjb3B5ID09IENMT1NFRCkgeworCQkJaWYgKCFkcm9wKQorCQkJCWNsb3NlKGZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5ICE9IEVNUFRZKSB7CisJCQlpZiAoIWRyb3AgfHwgKHJlc3RvcmUgJiYgKGNvcHkgJiBDT1BZRkRfUkVTVE9SRSkpKSB7CisJCQkJY29weSAmPSB+Q09QWUZEX1JFU1RPUkU7CisJCQkJLypjbG9zZShmZCk7Ki8KKwkJCQljb3B5ZmQoY29weSwgZmQgfCBDT1BZRkRfRVhBQ1QpOworCQkJfQorCQkJY2xvc2UoY29weSAmIH5DT1BZRkRfUkVTVE9SRSk7CisJCX0KKwl9CisJcmVkaXJsaXN0ID0gcnAtPm5leHQ7CisJZ19udWxscmVkaXJzID0gcnAtPm51bGxyZWRpcnM7CisJZnJlZShycCk7CisJSU5UX09OOworfQorCisvKgorICogVW5kbyBhbGwgcmVkaXJlY3Rpb25zLiAgQ2FsbGVkIG9uIGVycm9yIG9yIGludGVycnVwdC4KKyAqLworCisvKgorICogRGlzY2FyZCBhbGwgc2F2ZWQgZmlsZSBkZXNjcmlwdG9ycy4KKyAqLworc3RhdGljIHZvaWQKK2NsZWFycmVkaXIoaW50IGRyb3ApCit7CisJZm9yICg7OykgeworCQlnX251bGxyZWRpcnMgPSAwOworCQlpZiAoIXJlZGlybGlzdCkKKwkJCWJyZWFrOworCQlwb3ByZWRpcihkcm9wLCAvKnJlc3RvcmU6Ki8gMCk7CisJfQorfQorCitzdGF0aWMgaW50CityZWRpcmVjdHNhZmUodW5pb24gbm9kZSAqcmVkaXIsIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCXZvbGF0aWxlIGludCBzYXZlaW50OworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyID0gZXhjZXB0aW9uX2hhbmRsZXI7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisKKwlTQVZFX0lOVChzYXZlaW50KTsKKwkvKiAiZWNobyA5Pi9kZXYvbnVsbDsgZWNobyA+Jjk7IGVjaG8gcmVzdWx0OiAkPyIgLSByZXN1bHQgc2hvdWxkIGJlIDEsIG5vdCAyISAqLworCWVyciA9IHNldGptcChqbXBsb2MubG9jKTsgLy8gaHVoPz8gd2FzID0gc2V0am1wKGptcGxvYy5sb2MpICogMjsKKwlpZiAoIWVycikgeworCQlleGNlcHRpb25faGFuZGxlciA9ICZqbXBsb2M7CisJCXJlZGlyZWN0KHJlZGlyLCBmbGFncyk7CisJfQorCWV4Y2VwdGlvbl9oYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisJaWYgKGVyciAmJiBleGNlcHRpb25fdHlwZSAhPSBFWEVSUk9SKQorCQlsb25nam1wKGV4Y2VwdGlvbl9oYW5kbGVyLT5sb2MsIDEpOworCVJFU1RPUkVfSU5UKHNhdmVpbnQpOworCXJldHVybiBlcnI7Cit9CisKKworLyogPT09PT09PT09PT09IFJvdXRpbmVzIHRvIGV4cGFuZCBhcmd1bWVudHMgdG8gY29tbWFuZHMKKyAqCisgKiBXZSBoYXZlIHRvIGRlYWwgd2l0aCBiYWNrcXVvdGVzLCBzaGVsbCB2YXJpYWJsZXMsIGFuZCBmaWxlIG1ldGFjaGFyYWN0ZXJzLgorICovCisKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCitzdGF0aWMgYXJpdGhfdAorYXNoX2FyaXRoKGNvbnN0IGNoYXIgKnMpCit7CisJYXJpdGhfc3RhdGVfdCBtYXRoX3N0YXRlOworCWFyaXRoX3QgcmVzdWx0OworCisJbWF0aF9zdGF0ZS5sb29rdXB2YXIgPSBsb29rdXB2YXI7CisJbWF0aF9zdGF0ZS5zZXR2YXIgICAgPSBzZXR2YXIyOworCS8vbWF0aF9zdGF0ZS5lbmRvZm5hbWUgPSBlbmRvZm5hbWU7CisKKwlJTlRfT0ZGOworCXJlc3VsdCA9IGFyaXRoKCZtYXRoX3N0YXRlLCBzKTsKKwlpZiAobWF0aF9zdGF0ZS5lcnJtc2cpCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKG1hdGhfc3RhdGUuZXJybXNnKTsKKwlJTlRfT047CisKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKy8qCisgKiBleHBhbmRhcmcgZmxhZ3MKKyAqLworI2RlZmluZSBFWFBfRlVMTCAgICAgICAgMHgxICAgICAvKiBwZXJmb3JtIHdvcmQgc3BsaXR0aW5nICYgZmlsZSBnbG9iYmluZyAqLworI2RlZmluZSBFWFBfVElMREUgICAgICAgMHgyICAgICAvKiBkbyBub3JtYWwgdGlsZGUgZXhwYW5zaW9uICovCisjZGVmaW5lIEVYUF9WQVJUSUxERSAgICAweDQgICAgIC8qIGV4cGFuZCB0aWxkZXMgaW4gYW4gYXNzaWdubWVudCAqLworI2RlZmluZSBFWFBfUkVESVIgICAgICAgMHg4ICAgICAvKiBmaWxlIGdsb2IgZm9yIGEgcmVkaXJlY3Rpb24gKDEgbWF0Y2ggb25seSkgKi8KKyNkZWZpbmUgRVhQX0NBU0UgICAgICAgIDB4MTAgICAgLyoga2VlcHMgcXVvdGVzIGFyb3VuZCBmb3IgQ0FTRSBwYXR0ZXJuICovCisjZGVmaW5lIEVYUF9SRUNPUkQgICAgICAweDIwICAgIC8qIG5lZWQgdG8gcmVjb3JkIGFyZ3VtZW50cyBmb3IgaWZzIGJyZWFrdXAgKi8KKyNkZWZpbmUgRVhQX1ZBUlRJTERFMiAgIDB4NDAgICAgLyogZXhwYW5kIHRpbGRlcyBhZnRlciBjb2xvbnMgb25seSAqLworI2RlZmluZSBFWFBfV09SRCAgICAgICAgMHg4MCAgICAvKiBleHBhbmQgd29yZCBpbiBwYXJhbWV0ZXIgZXhwYW5zaW9uICovCisjZGVmaW5lIEVYUF9RV09SRCAgICAgICAweDEwMCAgIC8qIGV4cGFuZCB3b3JkIGluIHF1b3RlZCBwYXJhbWV0ZXIgZXhwYW5zaW9uICovCisvKgorICogcm1lc2NhcGUoKSBmbGFncworICovCisjZGVmaW5lIFJNRVNDQVBFX0FMTE9DICAweDEgICAgIC8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZyAqLworI2RlZmluZSBSTUVTQ0FQRV9HTE9CICAgMHgyICAgICAvKiBBZGQgYmFja3NsYXNoZXMgZm9yIGdsb2IgKi8KKyNkZWZpbmUgUk1FU0NBUEVfUVVPVEVEIDB4NCAgICAgLyogUmVtb3ZlIENUTEVTQyB1bmxlc3MgaW4gcXVvdGVzICovCisjZGVmaW5lIFJNRVNDQVBFX0dST1cgICAweDggICAgIC8qIEdyb3cgc3RyaW5ncyBpbnN0ZWFkIG9mIHN0YWxsb2MgKi8KKyNkZWZpbmUgUk1FU0NBUEVfSEVBUCAgIDB4MTAgICAgLyogTWFsbG9jIHN0cmluZ3MgaW5zdGVhZCBvZiBzdGFsbG9jICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgc3BlY2lmeWluZyB3aGljaCBwYXJ0cyBvZiB0aGUgc3RyaW5nIHNob3VsZCBiZSBzZWFyY2hlZAorICogZm9yIElGUyBjaGFyYWN0ZXJzLgorICovCitzdHJ1Y3QgaWZzcmVnaW9uIHsKKwlzdHJ1Y3QgaWZzcmVnaW9uICpuZXh0OyAvKiBuZXh0IHJlZ2lvbiBpbiBsaXN0ICovCisJaW50IGJlZ29mZjsgICAgICAgICAgICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIHJlZ2lvbiAqLworCWludCBlbmRvZmY7ICAgICAgICAgICAgIC8qIG9mZnNldCBvZiBlbmQgb2YgcmVnaW9uICovCisJaW50IG51bG9ubHk7ICAgICAgICAgICAgLyogc2VhcmNoIGZvciBudWwgYnl0ZXMgb25seSAqLworfTsKKworc3RydWN0IGFyZ2xpc3QgeworCXN0cnVjdCBzdHJsaXN0ICpsaXN0OworCXN0cnVjdCBzdHJsaXN0ICoqbGFzdHA7Cit9OworCisvKiBvdXRwdXQgb2YgY3VycmVudCBzdHJpbmcgKi8KK3N0YXRpYyBjaGFyICpleHBkZXN0OworLyogbGlzdCBvZiBiYWNrIHF1b3RlIGV4cHJlc3Npb25zICovCitzdGF0aWMgc3RydWN0IG5vZGVsaXN0ICphcmdiYWNrcTsKKy8qIGZpcnN0IHN0cnVjdCBpbiBsaXN0IG9mIGlmcyByZWdpb25zICovCitzdGF0aWMgc3RydWN0IGlmc3JlZ2lvbiBpZnNmaXJzdDsKKy8qIGxhc3Qgc3RydWN0IGluIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgaWZzcmVnaW9uICppZnNsYXN0cDsKKy8qIGhvbGRzIGV4cGFuZGVkIGFyZyBsaXN0ICovCitzdGF0aWMgc3RydWN0IGFyZ2xpc3QgZXhwYXJnOworCisvKgorICogT3VyIG93biBpdG9hKCkuCisgKi8KKyNpZiAhRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorLyogY3Z0bnVtKCkgaXMgdXNlZCBldmVuIGlmIG1hdGggc3VwcG9ydCBpcyBvZmYgKHRvIHByZXBhcmUgJD8gdmFsdWVzIGFuZCBzdWNoKSAqLwordHlwZWRlZiBsb25nIGFyaXRoX3Q7CisjIGRlZmluZSBBUklUSF9GTVQgIiVsZCIKKyNlbmRpZgorc3RhdGljIGludAorY3Z0bnVtKGFyaXRoX3QgbnVtKQoreworCWludCBsZW47CisKKwlleHBkZXN0ID0gbWFrZXN0cnNwYWNlKDMyLCBleHBkZXN0KTsKKwlsZW4gPSBmbXRzdHIoZXhwZGVzdCwgMzIsIEFSSVRIX0ZNVCwgbnVtKTsKKwlTVEFESlVTVChsZW4sIGV4cGRlc3QpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzaXplX3QKK2VzY2xlbihjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqcCkKK3sKKwlzaXplX3QgZXNjID0gMDsKKworCXdoaWxlIChwID4gc3RhcnQgJiYgKHVuc2lnbmVkIGNoYXIpKi0tcCA9PSBDVExFU0MpIHsKKwkJZXNjKys7CisJfQorCXJldHVybiBlc2M7Cit9CisKKy8qCisgKiBSZW1vdmUgYW55IENUTEVTQyBjaGFyYWN0ZXJzIGZyb20gYSBzdHJpbmcuCisgKi8KK3N0YXRpYyBjaGFyICoKK3JtZXNjYXBlcyhjaGFyICpzdHIsIGludCBmbGFnKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHFjaGFyc1tdIEFMSUdOMSA9IHsgQ1RMRVNDLCBDVExRVU9URU1BUkssICdcMCcgfTsKKworCWNoYXIgKnAsICpxLCAqcjsKKwl1bnNpZ25lZCBpbnF1b3RlczsKKwl1bnNpZ25lZCBwcm90ZWN0X2FnYWluc3RfZ2xvYjsKKwl1bnNpZ25lZCBnbG9iYmluZzsKKworCXAgPSBzdHJwYnJrKHN0ciwgcWNoYXJzKTsKKwlpZiAoIXApCisJCXJldHVybiBzdHI7CisKKwlxID0gcDsKKwlyID0gc3RyOworCWlmIChmbGFnICYgUk1FU0NBUEVfQUxMT0MpIHsKKwkJc2l6ZV90IGxlbiA9IHAgLSBzdHI7CisJCXNpemVfdCBmdWxsbGVuID0gbGVuICsgc3RybGVuKHApICsgMTsKKworCQlpZiAoZmxhZyAmIFJNRVNDQVBFX0dST1cpIHsKKwkJCWludCBzdHJsb2MgPSBzdHIgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwkJCXIgPSBtYWtlc3Ryc3BhY2UoZnVsbGxlbiwgZXhwZGVzdCk7CisJCQkvKiBwIGFuZCBzdHIgbWF5IGJlIGludmFsaWRhdGVkIGJ5IG1ha2VzdHJzcGFjZSAqLworCQkJc3RyID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdHJsb2M7CisJCQlwID0gc3RyICsgbGVuOworCQl9IGVsc2UgaWYgKGZsYWcgJiBSTUVTQ0FQRV9IRUFQKSB7CisJCQlyID0gY2ttYWxsb2MoZnVsbGxlbik7CisJCX0gZWxzZSB7CisJCQlyID0gc3RhbGxvYyhmdWxsbGVuKTsKKwkJfQorCQlxID0gcjsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCXEgPSAoY2hhciAqKW1lbWNweShxLCBzdHIsIGxlbikgKyBsZW47CisJCX0KKwl9CisKKwlpbnF1b3RlcyA9IChmbGFnICYgUk1FU0NBUEVfUVVPVEVEKSBeIFJNRVNDQVBFX1FVT1RFRDsKKwlnbG9iYmluZyA9IGZsYWcgJiBSTUVTQ0FQRV9HTE9COworCXByb3RlY3RfYWdhaW5zdF9nbG9iID0gZ2xvYmJpbmc7CisJd2hpbGUgKCpwKSB7CisJCWlmICgodW5zaWduZWQgY2hhcikqcCA9PSBDVExRVU9URU1BUkspIHsKKy8vIFRPRE86IGlmIG5vIFJNRVNDQVBFX1FVT1RFRCBpbiBmbGFncywgaW5xdW90ZXMgbmV2ZXIgYmVjb21lcyAwCisvLyAoYWx0ZXJuYXRlcyBiZXR3ZWVuIFJNRVNDQVBFX1FVT1RFRCBhbmQgflJNRVNDQVBFX1FVT1RFRCkuIElzIGl0IG9rPworLy8gTm90ZTogYm90aCBpbnF1b3RlcyBhbmQgcHJvdGVjdF9hZ2FpbnN0X2dsb2Igb25seSBhZmZlY3Qgd2hldGhlcgorLy8gQ1RMRVNDLDxjaD4gZ2V0cyBjb252ZXJ0ZWQgdG8gPGNoPiBvciB0byBcPGNoPgorCQkJaW5xdW90ZXMgPSB+aW5xdW90ZXM7CisJCQlwKys7CisJCQlwcm90ZWN0X2FnYWluc3RfZ2xvYiA9IGdsb2JiaW5nOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpwID09ICdcXCcpIHsKKwkJCS8qIG5ha2VkIGJhY2sgc2xhc2ggKi8KKwkJCXByb3RlY3RfYWdhaW5zdF9nbG9iID0gMDsKKwkJCWdvdG8gY29weTsKKwkJfQorCQlpZiAoKHVuc2lnbmVkIGNoYXIpKnAgPT0gQ1RMRVNDKSB7CisJCQlwKys7CisJCQlpZiAocHJvdGVjdF9hZ2FpbnN0X2dsb2IgJiYgaW5xdW90ZXMgJiYgKnAgIT0gJy8nKSB7CisJCQkJKnErKyA9ICdcXCc7CisJCQl9CisJCX0KKwkJcHJvdGVjdF9hZ2FpbnN0X2dsb2IgPSBnbG9iYmluZzsKKyBjb3B5OgorCQkqcSsrID0gKnArKzsKKwl9CisJKnEgPSAnXDAnOworCWlmIChmbGFnICYgUk1FU0NBUEVfR1JPVykgeworCQlleHBkZXN0ID0gcjsKKwkJU1RBREpVU1QocSAtIHIgKyAxLCBleHBkZXN0KTsKKwl9CisJcmV0dXJuIHI7Cit9CisjZGVmaW5lIHBtYXRjaChhLCBiKSAhZm5tYXRjaCgoYSksIChiKSwgMCkKKworLyoKKyAqIFByZXBhcmUgYSBwYXR0ZXJuIGZvciBhIGV4cG1ldGEgKGludGVybmFsIGdsb2IoMykpIGNhbGwuCisgKgorICogUmV0dXJucyBhbiBzdGFsbG9jZWQgc3RyaW5nLgorICovCitzdGF0aWMgY2hhciAqCitwcmVnbG9iKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGludCBxdW90ZWQsIGludCBmbGFnKQoreworCWZsYWcgfD0gUk1FU0NBUEVfR0xPQjsKKwlpZiAocXVvdGVkKSB7CisJCWZsYWcgfD0gUk1FU0NBUEVfUVVPVEVEOworCX0KKwlyZXR1cm4gcm1lc2NhcGVzKChjaGFyICopcGF0dGVybiwgZmxhZyk7Cit9CisKKy8qCisgKiBQdXQgYSBzdHJpbmcgb24gdGhlIHN0YWNrLgorICovCitzdGF0aWMgdm9pZAorbWVtdG9kZXN0KGNvbnN0IGNoYXIgKnAsIHNpemVfdCBsZW4sIGludCBzeW50YXgsIGludCBxdW90ZXMpCit7CisJY2hhciAqcSA9IGV4cGRlc3Q7CisKKwlxID0gbWFrZXN0cnNwYWNlKHF1b3RlcyA/IGxlbiAqIDIgOiBsZW4sIHEpOworCisJd2hpbGUgKGxlbi0tKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICpwKys7CisJCWlmIChjID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJaWYgKHF1b3RlcykgeworCQkJaW50IG4gPSBTSVQoYywgc3ludGF4KTsKKwkJCWlmIChuID09IENDVEwgfHwgbiA9PSBDQkFDSykKKwkJCQlVU1RQVVRDKENUTEVTQywgcSk7CisJCX0KKwkJVVNUUFVUQyhjLCBxKTsKKwl9CisKKwlleHBkZXN0ID0gcTsKK30KKworc3RhdGljIHZvaWQKK3N0cnRvZGVzdChjb25zdCBjaGFyICpwLCBpbnQgc3ludGF4LCBpbnQgcXVvdGVzKQoreworCW1lbXRvZGVzdChwLCBzdHJsZW4ocCksIHN5bnRheCwgcXVvdGVzKTsKK30KKworLyoKKyAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgdG8gc2NhbiB0aGlzIHJlZ2lvbiBvZiB0aGUKKyAqIHN0cmluZyBmb3IgSUZTIGNoYXJhY3RlcnMuCisgKi8KK3N0YXRpYyB2b2lkCityZWNvcmRyZWdpb24oaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbnVsb25seSkKK3sKKwlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCisJaWYgKGlmc2xhc3RwID09IE5VTEwpIHsKKwkJaWZzcCA9ICZpZnNmaXJzdDsKKwl9IGVsc2UgeworCQlJTlRfT0ZGOworCQlpZnNwID0gY2t6YWxsb2Moc2l6ZW9mKCppZnNwKSk7CisJCS8qaWZzcC0+bmV4dCA9IE5VTEw7IC0gY2t6YWxsb2MgZGlkIGl0ICovCisJCWlmc2xhc3RwLT5uZXh0ID0gaWZzcDsKKwkJSU5UX09OOworCX0KKwlpZnNsYXN0cCA9IGlmc3A7CisJaWZzbGFzdHAtPmJlZ29mZiA9IHN0YXJ0OworCWlmc2xhc3RwLT5lbmRvZmYgPSBlbmQ7CisJaWZzbGFzdHAtPm51bG9ubHkgPSBudWxvbmx5OworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlcmVjb3JkcmVnaW9ucyhpbnQgZW5kb2ZmKQoreworCWlmIChpZnNsYXN0cCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoaWZzZmlyc3QuZW5kb2ZmID4gZW5kb2ZmKSB7CisJCXdoaWxlIChpZnNmaXJzdC5uZXh0KSB7CisJCQlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCQkJSU5UX09GRjsKKwkJCWlmc3AgPSBpZnNmaXJzdC5uZXh0LT5uZXh0OworCQkJZnJlZShpZnNmaXJzdC5uZXh0KTsKKwkJCWlmc2ZpcnN0Lm5leHQgPSBpZnNwOworCQkJSU5UX09OOworCQl9CisJCWlmIChpZnNmaXJzdC5iZWdvZmYgPiBlbmRvZmYpIHsKKwkJCWlmc2xhc3RwID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlmc2xhc3RwID0gJmlmc2ZpcnN0OworCQkJaWZzZmlyc3QuZW5kb2ZmID0gZW5kb2ZmOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZnNsYXN0cCA9ICZpZnNmaXJzdDsKKwl3aGlsZSAoaWZzbGFzdHAtPm5leHQgJiYgaWZzbGFzdHAtPm5leHQtPmJlZ29mZiA8IGVuZG9mZikKKwkJaWZzbGFzdHAgPSBpZnNsYXN0cC0+bmV4dDsKKwl3aGlsZSAoaWZzbGFzdHAtPm5leHQpIHsKKwkJc3RydWN0IGlmc3JlZ2lvbiAqaWZzcDsKKwkJSU5UX09GRjsKKwkJaWZzcCA9IGlmc2xhc3RwLT5uZXh0LT5uZXh0OworCQlmcmVlKGlmc2xhc3RwLT5uZXh0KTsKKwkJaWZzbGFzdHAtPm5leHQgPSBpZnNwOworCQlJTlRfT047CisJfQorCWlmIChpZnNsYXN0cC0+ZW5kb2ZmID4gZW5kb2ZmKQorCQlpZnNsYXN0cC0+ZW5kb2ZmID0gZW5kb2ZmOworfQorCitzdGF0aWMgY2hhciAqCitleHB0aWxkZShjaGFyICpzdGFydHAsIGNoYXIgKnAsIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwljb25zdCBjaGFyICpob21lOworCWludCBxdW90ZXMgPSBmbGFncyAmIChFWFBfRlVMTCB8IEVYUF9DQVNFIHwgRVhQX1JFRElSKTsKKwlpbnQgc3RhcnRsb2M7CisKKwluYW1lID0gcCArIDE7CisKKwl3aGlsZSAoKGMgPSAqKytwKSAhPSAnXDAnKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlIENUTEVTQzoKKwkJCXJldHVybiBzdGFydHA7CisJCWNhc2UgQ1RMUVVPVEVNQVJLOgorCQkJcmV0dXJuIHN0YXJ0cDsKKwkJY2FzZSAnOic6CisJCQlpZiAoZmxhZ3MgJiBFWFBfVkFSVElMREUpCisJCQkJZ290byBkb25lOworCQkJYnJlYWs7CisJCWNhc2UgJy8nOgorCQljYXNlIENUTEVORFZBUjoKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKyBkb25lOgorCSpwID0gJ1wwJzsKKwlpZiAoKm5hbWUgPT0gJ1wwJykgeworCQlob21lID0gbG9va3VwdmFyKCJIT01FIik7CisJfSBlbHNlIHsKKwkJcHcgPSBnZXRwd25hbShuYW1lKTsKKwkJaWYgKHB3ID09IE5VTEwpCisJCQlnb3RvIGxvc2U7CisJCWhvbWUgPSBwdy0+cHdfZGlyOworCX0KKwlpZiAoIWhvbWUgfHwgISpob21lKQorCQlnb3RvIGxvc2U7CisJKnAgPSBjOworCXN0YXJ0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCXN0cnRvZGVzdChob21lLCBTUVNZTlRBWCwgcXVvdGVzKTsKKwlyZWNvcmRyZWdpb24oc3RhcnRsb2MsIGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSwgMCk7CisJcmV0dXJuIHA7CisgbG9zZToKKwkqcCA9IGM7CisJcmV0dXJuIHN0YXJ0cDsKK30KKworLyoKKyAqIEV4ZWN1dGUgYSBjb21tYW5kIGluc2lkZSBiYWNrIHF1b3Rlcy4gIElmIGl0J3MgYSBidWlsdGluIGNvbW1hbmQsIHdlCisgKiB3YW50IHRvIHNhdmUgaXRzIG91dHB1dCBpbiBhIGJsb2NrIG9idGFpbmVkIGZyb20gbWFsbG9jLiAgT3RoZXJ3aXNlCisgKiB3ZSBmb3JrIG9mZiBhIHN1YnByb2Nlc3MgYW5kIGdldCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIHZpYSBhIHBpcGUuCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0cnVjdCBiYWNrY21kIHsgICAgICAgICAgICAgICAgLyogcmVzdWx0IG9mIGV2YWxiYWNrY21kICovCisJaW50IGZkOyAgICAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgZnJvbSAqLworCWludCBubGVmdDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFycyBpbiBidWZmZXIgKi8KKwljaGFyICpidWY7ICAgICAgICAgICAgICAvKiBidWZmZXIgKi8KKwlzdHJ1Y3Qgam9iICpqcDsgICAgICAgICAvKiBqb2Igc3RydWN0dXJlIGZvciBjb21tYW5kICovCit9OworCisvKiBUaGVzZSBmb3J3YXJkIGRlY2xzIGFyZSBuZWVkZWQgdG8gdXNlICJldmFsIiBjb2RlIGZvciBiYWNrdGlja3MgaGFuZGxpbmc6ICovCitzdGF0aWMgdWludDhfdCBiYWNrX2V4aXRzdGF0dXM7IC8qIGV4aXQgc3RhdHVzIG9mIGJhY2txdW90ZWQgY29tbWFuZCAqLworI2RlZmluZSBFVl9FWElUIDAxICAgICAgICAgICAgICAvKiBleGl0IGFmdGVyIGV2YWx1YXRpbmcgdHJlZSAqLworc3RhdGljIHZvaWQgZXZhbHRyZWUodW5pb24gbm9kZSAqLCBpbnQpOworCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2V2YWxiYWNrY21kKHVuaW9uIG5vZGUgKm4sIHN0cnVjdCBiYWNrY21kICpyZXN1bHQpCit7CisJaW50IHNhdmVoZXJlZmQ7CisKKwlyZXN1bHQtPmZkID0gLTE7CisJcmVzdWx0LT5idWYgPSBOVUxMOworCXJlc3VsdC0+bmxlZnQgPSAwOworCXJlc3VsdC0+anAgPSBOVUxMOworCWlmIChuID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2F2ZWhlcmVmZCA9IGhlcmVmZDsKKwloZXJlZmQgPSAtMTsKKworCXsKKwkJaW50IHBpcFsyXTsKKwkJc3RydWN0IGpvYiAqanA7CisKKwkJaWYgKHBpcGUocGlwKSA8IDApCisJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigicGlwZSBjYWxsIGZhaWxlZCIpOworCQlqcCA9IG1ha2Vqb2IoLypuLCovIDEpOworCQlpZiAoZm9ya3NoZWxsKGpwLCBuLCBGT1JLX05PSk9CKSA9PSAwKSB7CisJCQlGT1JDRV9JTlRfT047CisJCQljbG9zZShwaXBbMF0pOworCQkJaWYgKHBpcFsxXSAhPSAxKSB7CisJCQkJLypjbG9zZSgxKTsqLworCQkJCWNvcHlmZChwaXBbMV0sIDEgfCBDT1BZRkRfRVhBQ1QpOworCQkJCWNsb3NlKHBpcFsxXSk7CisJCQl9CisJCQllZmxhZyA9IDA7CisJCQlldmFsdHJlZShuLCBFVl9FWElUKTsgLyogYWN0dWFsbHkgZXZhbHRyZWVuci4uLiAqLworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWNsb3NlKHBpcFsxXSk7CisJCXJlc3VsdC0+ZmQgPSBwaXBbMF07CisJCXJlc3VsdC0+anAgPSBqcDsKKwl9CisJaGVyZWZkID0gc2F2ZWhlcmVmZDsKKyBvdXQ6CisJVFJBQ0UoKCJldmFsYmFja2NtZCBkb25lOiBmZD0lZCBidWY9MHgleCBubGVmdD0lZCBqcD0weCV4XG4iLAorCQlyZXN1bHQtPmZkLCByZXN1bHQtPmJ1ZiwgcmVzdWx0LT5ubGVmdCwgcmVzdWx0LT5qcCkpOworfQorCisvKgorICogRXhwYW5kIHN0dWZmIGluIGJhY2t3YXJkcyBxdW90ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitleHBiYWNrcSh1bmlvbiBub2RlICpjbWQsIGludCBxdW90ZWQsIGludCBxdW90ZXMpCit7CisJc3RydWN0IGJhY2tjbWQgaW47CisJaW50IGk7CisJY2hhciBidWZbMTI4XTsKKwljaGFyICpwOworCWNoYXIgKmRlc3Q7CisJaW50IHN0YXJ0bG9jOworCWludCBzeW50YXggPSBxdW90ZWQgPyBEUVNZTlRBWCA6IEJBU0VTWU5UQVg7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKworCUlOVF9PRkY7CisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJZGVzdCA9IGV4cGRlc3Q7CisJc3RhcnRsb2MgPSBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJZ3JhYnN0YWNrc3RyKGRlc3QpOworCWV2YWxiYWNrY21kKGNtZCwgJmluKTsKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKKworCXAgPSBpbi5idWY7CisJaSA9IGluLm5sZWZ0OworCWlmIChpID09IDApCisJCWdvdG8gcmVhZDsKKwlmb3IgKDs7KSB7CisJCW1lbXRvZGVzdChwLCBpLCBzeW50YXgsIHF1b3Rlcyk7CisgcmVhZDoKKwkJaWYgKGluLmZkIDwgMCkKKwkJCWJyZWFrOworCQlpID0gbm9uYmxvY2tfaW1tdW5lX3JlYWQoaW4uZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIC8qbG9vcF9vbl9FSU5UUjoqLyAxKTsKKwkJVFJBQ0UoKCJleHBiYWNrcTogcmVhZCByZXR1cm5zICVkXG4iLCBpKSk7CisJCWlmIChpIDw9IDApCisJCQlicmVhazsKKwkJcCA9IGJ1ZjsKKwl9CisKKwlmcmVlKGluLmJ1Zik7CisJaWYgKGluLmZkID49IDApIHsKKwkJY2xvc2UoaW4uZmQpOworCQliYWNrX2V4aXRzdGF0dXMgPSB3YWl0Zm9yam9iKGluLmpwKTsKKwl9CisJSU5UX09OOworCisJLyogRWF0IGFsbCB0cmFpbGluZyBuZXdsaW5lcyAqLworCWRlc3QgPSBleHBkZXN0OworCWZvciAoOyBkZXN0ID4gKGNoYXIgKilzdGFja2Jsb2NrKCkgJiYgZGVzdFstMV0gPT0gJ1xuJzspCisJCVNUVU5QVVRDKGRlc3QpOworCWV4cGRlc3QgPSBkZXN0OworCisJaWYgKHF1b3RlZCA9PSAwKQorCQlyZWNvcmRyZWdpb24oc3RhcnRsb2MsIGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSwgMCk7CisJVFJBQ0UoKCJldmFsYmFja3E6IHNpemU6JWQ6JyUuKnMnXG4iLAorCQkoaW50KSgoZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpKSAtIHN0YXJ0bG9jKSwKKwkJKGludCkoKGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSkgLSBzdGFydGxvYyksCisJCXN0YWNrYmxvY2soKSArIHN0YXJ0bG9jKSk7Cit9CisKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisvKgorICogRXhwYW5kIGFyaXRobWV0aWMgZXhwcmVzc2lvbi4gIEJhY2t1cCB0byBzdGFydCBvZiBleHByZXNzaW9uLAorICogZXZhbHVhdGUsIHBsYWNlIHJlc3VsdCBpbiAoYmFja2VkIHVwKSByZXN1bHQsIGFkanVzdCBzdHJpbmcgcG9zaXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitleHBhcmkoaW50IHF1b3RlcykKK3sKKwljaGFyICpwLCAqc3RhcnQ7CisJaW50IGJlZ29mZjsKKwlpbnQgZmxhZzsKKwlpbnQgbGVuOworCisJLyogaWZzZnJlZSgpOyAqLworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgaXMgc2xpZ2h0bHkgb3Zlci1jb21wbGljYXRlZCBmb3IKKwkgKiBlZmZpY2llbmN5LiAgTmV4dCB3ZSBzY2FuIGJhY2t3YXJkcyBsb29raW5nIGZvciB0aGUKKwkgKiBzdGFydCBvZiBhcml0aG1ldGljLgorCSAqLworCXN0YXJ0ID0gc3RhY2tibG9jaygpOworCXAgPSBleHBkZXN0IC0gMTsKKwkqcCA9ICdcMCc7CisJcC0tOworCXdoaWxlICgxKSB7CisJCWludCBlc2M7CisKKwkJd2hpbGUgKCh1bnNpZ25lZCBjaGFyKSpwICE9IENUTEFSSSkgeworCQkJcC0tOworI2lmIERFQlVHCisJCQlpZiAocCA8IHN0YXJ0KSB7CisJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIm1pc3NpbmcgQ1RMQVJJIChzaG91bGRuJ3QgaGFwcGVuKSIpOworCQkJfQorI2VuZGlmCisJCX0KKworCQllc2MgPSBlc2NsZW4oc3RhcnQsIHApOworCQlpZiAoIShlc2MgJSAyKSkgeworCQkJYnJlYWs7CisJCX0KKworCQlwIC09IGVzYyArIDE7CisJfQorCisJYmVnb2ZmID0gcCAtIHN0YXJ0OworCisJcmVtb3ZlcmVjb3JkcmVnaW9ucyhiZWdvZmYpOworCisJZmxhZyA9IHBbMV07CisKKwlleHBkZXN0ID0gcDsKKworCWlmIChxdW90ZXMpCisJCXJtZXNjYXBlcyhwICsgMiwgMCk7CisKKwlsZW4gPSBjdnRudW0oYXNoX2FyaXRoKHAgKyAyKSk7CisKKwlpZiAoZmxhZyAhPSAnIicpCisJCXJlY29yZHJlZ2lvbihiZWdvZmYsIGJlZ29mZiArIGxlbiwgMCk7Cit9CisjZW5kaWYKKworLyogYXJnc3RyIG5lZWRzIGl0ICovCitzdGF0aWMgY2hhciAqZXZhbHZhcihjaGFyICpwLCBpbnQgZmxhZ3MsIHN0cnVjdCBzdHJsaXN0ICp2YXJfc3RyX2xpc3QpOworCisvKgorICogUGVyZm9ybSB2YXJpYWJsZSBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24uICBJZiBFWFBfRlVMTCBpcyBzZXQsIG91dHB1dCBDVExFU0MKKyAqIGNoYXJhY3RlcnMgdG8gYWxsb3cgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gIE90aGVyd2lzZSB0cmVhdAorICogJEAgbGlrZSAkKiBzaW5jZSBubyBzcGxpdHRpbmcgd2lsbCBiZSBwZXJmb3JtZWQuCisgKgorICogdmFyX3N0cl9saXN0IChjYW4gYmUgTlVMTCkgaXMgYSBsaXN0IG9mICJWQVI9dmFsIiBzdHJpbmdzIHdoaWNoIHRha2UgcHJlY2VkZW5jZQorICogb3ZlciBzaGVsbCB2YXJhYmxlcy4gTmVlZGVkIGZvciAiQT1hIEI9JEE7IGVjaG8gJEIiIGNhc2UgLSB3ZSB1c2UgaXQKKyAqIGZvciBjb3JyZWN0IGV4cGFuc2lvbiBvZiAiQj0kQSIgd29yZC4KKyAqLworc3RhdGljIHZvaWQKK2FyZ3N0cihjaGFyICpwLCBpbnQgZmxhZ3MsIHN0cnVjdCBzdHJsaXN0ICp2YXJfc3RyX2xpc3QpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc3BjbGNoYXJzW10gQUxJR04xID0geworCQknPScsCisJCSc6JywKKwkJQ1RMUVVPVEVNQVJLLAorCQlDVExFTkRWQVIsCisJCUNUTEVTQywKKwkJQ1RMVkFSLAorCQlDVExCQUNLUSwKKwkJQ1RMQkFDS1EgfCBDVExRVU9URSwKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJCUNUTEVOREFSSSwKKyNlbmRpZgorCQknXDAnCisJfTsKKwljb25zdCBjaGFyICpyZWplY3QgPSBzcGNsY2hhcnM7CisJaW50IHF1b3RlcyA9IGZsYWdzICYgKEVYUF9GVUxMIHwgRVhQX0NBU0UgfCBFWFBfUkVESVIpOyAvKiBkbyBDVExFU0MgKi8KKwlpbnQgYnJlYWthbGwgPSBmbGFncyAmIEVYUF9XT1JEOworCWludCBpbnF1b3RlczsKKwlzaXplX3QgbGVuZ3RoOworCWludCBzdGFydGxvYzsKKworCWlmICghKGZsYWdzICYgRVhQX1ZBUlRJTERFKSkgeworCQlyZWplY3QgKz0gMjsKKwl9IGVsc2UgaWYgKGZsYWdzICYgRVhQX1ZBUlRJTERFMikgeworCQlyZWplY3QrKzsKKwl9CisJaW5xdW90ZXMgPSAwOworCWxlbmd0aCA9IDA7CisJaWYgKGZsYWdzICYgRVhQX1RJTERFKSB7CisJCWNoYXIgKnE7CisKKwkJZmxhZ3MgJj0gfkVYUF9USUxERTsKKyB0aWxkZToKKwkJcSA9IHA7CisJCWlmICgodW5zaWduZWQgY2hhcikqcSA9PSBDVExFU0MgJiYgKGZsYWdzICYgRVhQX1FXT1JEKSkKKwkJCXErKzsKKwkJaWYgKCpxID09ICd+JykKKwkJCXAgPSBleHB0aWxkZShwLCBxLCBmbGFncyk7CisJfQorIHN0YXJ0OgorCXN0YXJ0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjOworCisJCWxlbmd0aCArPSBzdHJjc3BuKHAgKyBsZW5ndGgsIHJlamVjdCk7CisJCWMgPSBwW2xlbmd0aF07CisJCWlmIChjKSB7CisJCQlpZiAoIShjICYgMHg4MCkKKwkJCUlGX1NIX01BVEhfU1VQUE9SVCh8fCBjID09IENUTEVOREFSSSkKKwkJCSkgeworCQkJCS8qIGMgPT0gJz0nIHx8IGMgPT0gJzonIHx8IGMgPT0gQ1RMRU5EQVJJICovCisJCQkJbGVuZ3RoKys7CisJCQl9CisJCX0KKwkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCWludCBuZXdsb2M7CisJCQlleHBkZXN0ID0gc3RhY2tfbnB1dHN0cihwLCBsZW5ndGgsIGV4cGRlc3QpOworCQkJbmV3bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCQkJaWYgKGJyZWFrYWxsICYmICFpbnF1b3RlcyAmJiBuZXdsb2MgPiBzdGFydGxvYykgeworCQkJCXJlY29yZHJlZ2lvbihzdGFydGxvYywgbmV3bG9jLCAwKTsKKwkJCX0KKwkJCXN0YXJ0bG9jID0gbmV3bG9jOworCQl9CisJCXAgKz0gbGVuZ3RoICsgMTsKKwkJbGVuZ3RoID0gMDsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXDAnOgorCQkJZ290byBicmVha2xvb3A7CisJCWNhc2UgJz0nOgorCQkJaWYgKGZsYWdzICYgRVhQX1ZBUlRJTERFMikgeworCQkJCXAtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZsYWdzIHw9IEVYUF9WQVJUSUxERTI7CisJCQlyZWplY3QrKzsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlICc6JzoKKwkJCS8qCisJCQkgKiBzb3J0IG9mIGEgaGFjayAtIGV4cGFuZCB0aWxkZXMgaW4gdmFyaWFibGUKKwkJCSAqIGFzc2lnbm1lbnRzIChhZnRlciB0aGUgZmlyc3QgJz0nIGFuZCBhZnRlciAnOidzKS4KKwkJCSAqLworCQkJaWYgKCotLXAgPT0gJ34nKSB7CisJCQkJZ290byB0aWxkZTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgQ1RMRU5EVkFSOiAvKiA/Pz8gKi8KKwkJCWdvdG8gYnJlYWtsb29wOworCQljYXNlIENUTFFVT1RFTUFSSzoKKwkJCS8qICIkQCIgc3ludGF4IGFkaGVyZW5jZSBoYWNrICovCisJCQlpZiAoIWlucXVvdGVzCisJCQkgJiYgbWVtY21wKHAsIGRvbGF0c3RyLCA0KSA9PSAwCisJCQkgJiYgKCAgcFs0XSA9PSAoY2hhcilDVExRVU9URU1BUksKKwkJCSAgICB8fCAocFs0XSA9PSAoY2hhcilDVExFTkRWQVIgJiYgcFs1XSA9PSAoY2hhcilDVExRVU9URU1BUkspCisJCQkgICAgKQorCQkJKSB7CisJCQkJcCA9IGV2YWx2YXIocCArIDEsIGZsYWdzLCAvKiB2YXJfc3RyX2xpc3Q6ICovIE5VTEwpICsgMTsKKwkJCQlnb3RvIHN0YXJ0OworCQkJfQorCQkJaW5xdW90ZXMgPSAhaW5xdW90ZXM7CisgYWRkcXVvdGU6CisJCQlpZiAocXVvdGVzKSB7CisJCQkJcC0tOworCQkJCWxlbmd0aCsrOworCQkJCXN0YXJ0bG9jKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDVExFU0M6CisJCQlzdGFydGxvYysrOworCQkJbGVuZ3RoKys7CisJCQlnb3RvIGFkZHF1b3RlOworCQljYXNlIENUTFZBUjoKKwkJCXAgPSBldmFsdmFyKHAsIGZsYWdzLCB2YXJfc3RyX2xpc3QpOworCQkJZ290byBzdGFydDsKKwkJY2FzZSBDVExCQUNLUToKKwkJCWMgPSAnXDAnOworCQljYXNlIENUTEJBQ0tRfENUTFFVT1RFOgorCQkJZXhwYmFja3EoYXJnYmFja3EtPm4sIGMsIHF1b3Rlcyk7CisJCQlhcmdiYWNrcSA9IGFyZ2JhY2txLT5uZXh0OworCQkJZ290byBzdGFydDsKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJCWNhc2UgQ1RMRU5EQVJJOgorCQkJcC0tOworCQkJZXhwYXJpKHF1b3Rlcyk7CisJCQlnb3RvIHN0YXJ0OworI2VuZGlmCisJCX0KKwl9CisgYnJlYWtsb29wOiA7Cit9CisKK3N0YXRpYyBjaGFyICoKK3NjYW5sZWZ0KGNoYXIgKnN0YXJ0cCwgY2hhciAqcm1lc2MsIGNoYXIgKnJtZXNjZW5kIFVOVVNFRF9QQVJBTSwKKwkJY2hhciAqcGF0dGVybiwgaW50IHF1b3RlcywgaW50IHplcm8pCit7CisJY2hhciAqbG9jLCAqbG9jMjsKKwljaGFyIGM7CisKKwlsb2MgPSBzdGFydHA7CisJbG9jMiA9IHJtZXNjOworCWRvIHsKKwkJaW50IG1hdGNoOworCQljb25zdCBjaGFyICpzID0gbG9jMjsKKworCQljID0gKmxvYzI7CisJCWlmICh6ZXJvKSB7CisJCQkqbG9jMiA9ICdcMCc7CisJCQlzID0gcm1lc2M7CisJCX0KKwkJbWF0Y2ggPSBwbWF0Y2gocGF0dGVybiwgcyk7CisKKwkJKmxvYzIgPSBjOworCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gbG9jOworCQlpZiAocXVvdGVzICYmICh1bnNpZ25lZCBjaGFyKSpsb2MgPT0gQ1RMRVNDKQorCQkJbG9jKys7CisJCWxvYysrOworCQlsb2MyKys7CisJfSB3aGlsZSAoYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjaGFyICoKK3NjYW5yaWdodChjaGFyICpzdGFydHAsIGNoYXIgKnJtZXNjLCBjaGFyICpybWVzY2VuZCwKKwkJY2hhciAqcGF0dGVybiwgaW50IHF1b3RlcywgaW50IG1hdGNoX2F0X3N0YXJ0KQoreworI2lmICFFTkFCTEVfQVNIX09QVElNSVpFX0ZPUl9TSVpFCisJaW50IHRyeTJvcHRpbWl6ZSA9IG1hdGNoX2F0X3N0YXJ0OworI2VuZGlmCisJaW50IGVzYyA9IDA7CisJY2hhciAqbG9jOworCWNoYXIgKmxvYzI7CisKKwkvKiBJZiB3ZSBjYWxsZWQgYnkgIiR7di9wYXR0ZXJuL3JlcGx9IiBvciAiJHt2Ly9wYXR0ZXJuL3JlcGx9IjoKKwkgKiBzdGFydHA9ImVzY2FwZWRfdmFsdWVfb2ZfdiIgcm1lc2M9InJhd192YWx1ZV9vZl92IgorCSAqIHJtZXNjZW5kPSIiKHB0ciB0byBOVUwgaW4gcm1lc2MpIHBhdHRlcm49InBhdHRlcm4iIHF1b3Rlcz1tYXRjaF9hdF9zdGFydD0xCisJICogTG9naWM6CisJICogbG9jIHN0YXJ0cyBhdCBOVUwgYXQgdGhlIGVuZCBvZiBzdGFydHAsIGxvYzIgc3RhcnRzIGF0IHRoZSBlbmQgb2Ygcm1lc2MsCisJICogYW5kIG9uIGVhY2ggaXRlcmF0aW9uIHRoZXkgZ28gYmFjayB0d28vb25lIGNoYXIgdW50aWwgdGhleSByZWFjaCB0aGUgYmVnaW5uaW5nLgorCSAqIFdlIHRyeSB0byBmaW5kIGEgbWF0Y2ggaW4gInJhd192YWx1ZV9vZl92IiwgInJhd192YWx1ZV9vZl8iLCAicmF3X3ZhbHVlX29mIiBldGMuCisJICovCisJLyogVE9ETzogZG9jdW1lbnQgaW4gd2hhdCBvdGhlciBjaXJjdW1zdGFuY2VzIHdlIGFyZSBjYWxsZWQuICovCisKKwlmb3IgKGxvYyA9IHBhdHRlcm4gLSAxLCBsb2MyID0gcm1lc2NlbmQ7IGxvYyA+PSBzdGFydHA7IGxvYzItLSkgeworCQlpbnQgbWF0Y2g7CisJCWNoYXIgYyA9ICpsb2MyOworCQljb25zdCBjaGFyICpzID0gbG9jMjsKKwkJaWYgKG1hdGNoX2F0X3N0YXJ0KSB7CisJCQkqbG9jMiA9ICdcMCc7CisJCQlzID0gcm1lc2M7CisJCX0KKwkJbWF0Y2ggPSBwbWF0Y2gocGF0dGVybiwgcyk7CisJCS8vYmJfZXJyb3JfbXNnKCJwbWF0Y2gocGF0dGVybjonJXMnLHM6JyVzJyk6JWQiLCBwYXR0ZXJuLCBzLCBtYXRjaCk7CisJCSpsb2MyID0gYzsKKwkJaWYgKG1hdGNoKQorCQkJcmV0dXJuIGxvYzsKKyNpZiAhRU5BQkxFX0FTSF9PUFRJTUlaRV9GT1JfU0laRQorCQlpZiAodHJ5Mm9wdGltaXplKSB7CisJCQkvKiBNYXliZSB3ZSBjYW4gb3B0aW1pemUgdGhpczoKKwkJCSAqIGlmIHBhdHRlcm4gZW5kcyB3aXRoIHVuZXNjYXBlZCAqLCB3ZSBjYW4gYXZvaWQgY2hlY2tpbmcKKwkJCSAqIHNob3J0ZXIgc3RyaW5nczogaWYgImZvbyoiIGRvZXNudCBtYXRjaCAicmF3X3ZhbHVlX29mX3YiLAorCQkJICogaXQgd29udCBtYXRjaCB0cnVuY2F0ZWQgInJhd192YWx1ZV9vZl8iIHN0cmluZ3MgdG9vLgorCQkJICovCisJCQl1bnNpZ25lZCBwbGVuID0gc3RybGVuKHBhdHRlcm4pOworCQkJLyogRG9lcyBpdCBlbmQgd2l0aCAiKiI/ICovCisJCQlpZiAocGxlbiAhPSAwICYmIHBhdHRlcm5bLS1wbGVuXSA9PSAnKicpIHsKKwkJCQkvKiAieHh4eCoiIGlzIG5vdCBlc2NhcGVkICovCisJCQkJLyogInh4eFwqIiBpcyBlc2NhcGVkICovCisJCQkJLyogInh4XFwqIiBpcyBub3QgZXNjYXBlZCAqLworCQkJCS8qICJ4XFxcKiIgaXMgZXNjYXBlZCAqLworCQkJCWludCBzbGFzaGVzID0gMDsKKwkJCQl3aGlsZSAocGxlbiAhPSAwICYmIHBhdHRlcm5bLS1wbGVuXSA9PSAnXFwnKQorCQkJCQlzbGFzaGVzKys7CisJCQkJaWYgKCEoc2xhc2hlcyAmIDEpKQorCQkJCQlicmVhazsgLyogZW5kcyB3aXRoIHVuZXNjYXBlZCAiKiIgKi8KKwkJCX0KKwkJCXRyeTJvcHRpbWl6ZSA9IDA7CisJCX0KKyNlbmRpZgorCQlsb2MtLTsKKwkJaWYgKHF1b3RlcykgeworCQkJaWYgKC0tZXNjIDwgMCkgeworCQkJCWVzYyA9IGVzY2xlbihzdGFydHAsIGxvYyk7CisJCQl9CisJCQlpZiAoZXNjICUgMikgeworCQkJCWVzYy0tOworCQkJCWxvYy0tOworCQkJfQorCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB2YXJ1bnNldChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK3ZhcnVuc2V0KGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp1bXNnLCBpbnQgdmFyZmxhZ3MpCit7CisJY29uc3QgY2hhciAqbXNnOworCWNvbnN0IGNoYXIgKnRhaWw7CisKKwl0YWlsID0gbnVsbHN0cjsKKwltc2cgPSAicGFyYW1ldGVyIG5vdCBzZXQiOworCWlmICh1bXNnKSB7CisJCWlmICgodW5zaWduZWQgY2hhcikqZW5kID09IENUTEVORFZBUikgeworCQkJaWYgKHZhcmZsYWdzICYgVlNOVUwpCisJCQkJdGFpbCA9ICIgb3IgbnVsbCI7CisJCX0gZWxzZSB7CisJCQltc2cgPSB1bXNnOworCQl9CisJfQorCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCIlLipzOiAlcyVzIiwgKGludCkoZW5kIC0gdmFyIC0gMSksIHZhciwgbXNnLCB0YWlsKTsKK30KKworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKK3N0YXRpYyBjaGFyICoKK3BhcnNlX3N1Yl9wYXR0ZXJuKGNoYXIgKmFyZywgaW50IHZhcmZsYWdzKQoreworCWNoYXIgKmlkeCwgKnJlcGwgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgYzsKKworCS8vY2hhciAqb3JnX2FyZyA9IGFyZzsKKwkvL2JiX2Vycm9yX21zZygiYXJnOiclcycgdmFyZmxhZ3M6JXgiLCBhcmcsIHZhcmZsYWdzKTsKKwlpZHggPSBhcmc7CisJd2hpbGUgKDEpIHsKKwkJYyA9ICphcmc7CisJCWlmICghYykKKwkJCWJyZWFrOworCQlpZiAoYyA9PSAnLycpIHsKKwkJCS8qIE9ubHkgdGhlIGZpcnN0ICcvJyBzZWVuIGlzIG91ciBzZXBhcmF0b3IgKi8KKwkJCWlmICghcmVwbCkgeworCQkJCXJlcGwgPSBpZHggKyAxOworCQkJCWMgPSAnXDAnOworCQkJfQorCQl9CisJCSppZHgrKyA9IGM7CisJCWFyZysrOworCQkvKgorCQkgKiBFeGFtcGxlOiB2PSdhYlxjJzsgZWNobyAke3YvXFxiL19cXF9cel99CisJCSAqIFRoZSByZXN1bHQgaXMgYV9cX3pfYyAobm90IGFcX1xfel9jKSEKKwkJICoKKwkJICogRW5hYmxlIGRlYnVnIHByaW50cyBpbiB0aGlzIGZ1bmN0aW9uIGFuZCB5b3UnbGwgc2VlOgorCQkgKiBhc2g6IGFyZzonXFxiL19cXF96XycgdmFyZmxhZ3M6ZAorCQkgKiBhc2g6IHBhdHRlcm46J1xcYicgcmVwbDonX1xfel8nCisJCSAqIFRoYXQgaXMsIFxcYiBpcyBpbnRlcnByZXRlZCBhcyBcXGIsIGJ1dCBcXF8gYXMgXF8hCisJCSAqIElPVzogc2VhcmNoIHBhdHRlcm4gYW5kIHJlcGxhY2Ugc3RyaW5nIHRyZWF0IGJhY2tzbGFzaGVzCisJCSAqIGRpZmZlcmVudGx5ISBUaGF0IGlzIHRoZSByZWFzb24gd2h5IHdlIGNoZWNrIHJlcGwgYmVsb3c6CisJCSAqLworCQlpZiAoYyA9PSAnXFwnICYmICphcmcgPT0gJ1xcJyAmJiByZXBsICYmICEodmFyZmxhZ3MgJiBWU1FVT1RFKSkKKwkJCWFyZysrOyAvKiBza2lwIGJvdGggJ1wnLCBub3QganVzdCBmaXJzdCBvbmUgKi8KKwl9CisJKmlkeCA9IGM7IC8qIE5VTCAqLworCS8vYmJfZXJyb3JfbXNnKCJwYXR0ZXJuOiclcycgcmVwbDonJXMnIiwgb3JnX2FyZywgcmVwbCk7CisKKwlyZXR1cm4gcmVwbDsKK30KKyNlbmRpZiAvKiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3N1YmV2YWx2YXIoY2hhciAqcCwgY2hhciAqdmFybmFtZSwgaW50IHN0cmxvYywgaW50IHN1YnR5cGUsCisJCWludCBzdGFydGxvYywgaW50IHZhcmZsYWdzLCBpbnQgcXVvdGVzLCBzdHJ1Y3Qgc3RybGlzdCAqdmFyX3N0cl9saXN0KQoreworCXN0cnVjdCBub2RlbGlzdCAqc2F2ZWFyZ2JhY2txID0gYXJnYmFja3E7CisJY2hhciAqc3RhcnRwOworCWNoYXIgKmxvYzsKKwljaGFyICpybWVzYywgKnJtZXNjZW5kOworCWNoYXIgKnN0cjsKKwlJRl9BU0hfQkFTSF9DT01QQVQoY29uc3QgY2hhciAqcmVwbCA9IE5VTEw7KQorCUlGX0FTSF9CQVNIX0NPTVBBVChpbnQgcG9zLCBsZW4sIG9yaWdfbGVuOykKKwlpbnQgc2F2ZWhlcmVmZCA9IGhlcmVmZDsKKwlpbnQgYW1vdW50LCB3b3JrbG9jLCByZXNldGxvYzsKKwlpbnQgemVybzsKKwljaGFyICooKnNjYW4pKGNoYXIqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBpbnQsIGludCk7CisKKwkvL2JiX2Vycm9yX21zZygic3ViZXZhbHZhcihwOiclcycsdmFybmFtZTonJXMnLHN0cmxvYzolZCxzdWJ0eXBlOiVkLHN0YXJ0bG9jOiVkLHZhcmZsYWdzOiV4LHF1b3RlczolZCkiLAorCS8vCQlwLCB2YXJuYW1lLCBzdHJsb2MsIHN1YnR5cGUsIHN0YXJ0bG9jLCB2YXJmbGFncywgcXVvdGVzKTsKKworCWhlcmVmZCA9IC0xOworCWFyZ3N0cihwLCAoc3VidHlwZSAhPSBWU0FTU0lHTiAmJiBzdWJ0eXBlICE9IFZTUVVFU1RJT04pID8gRVhQX0NBU0UgOiAwLAorCQkJdmFyX3N0cl9saXN0KTsKKwlTVFBVVEMoJ1wwJywgZXhwZGVzdCk7CisJaGVyZWZkID0gc2F2ZWhlcmVmZDsKKwlhcmdiYWNrcSA9IHNhdmVhcmdiYWNrcTsKKwlzdGFydHAgPSAoY2hhciAqKXN0YWNrYmxvY2soKSArIHN0YXJ0bG9jOworCisJc3dpdGNoIChzdWJ0eXBlKSB7CisJY2FzZSBWU0FTU0lHTjoKKwkJc2V0dmFyKHZhcm5hbWUsIHN0YXJ0cCwgMCk7CisJCWFtb3VudCA9IHN0YXJ0cCAtIGV4cGRlc3Q7CisJCVNUQURKVVNUKGFtb3VudCwgZXhwZGVzdCk7CisJCXJldHVybiBzdGFydHA7CisKKwljYXNlIFZTUVVFU1RJT046CisJCXZhcnVuc2V0KHAsIHZhcm5hbWUsIHN0YXJ0cCwgdmFyZmxhZ3MpOworCQkvKiBOT1RSRUFDSEVEICovCisKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJY2FzZSBWU1NVQlNUUjoKKwkJbG9jID0gc3RyID0gc3RhY2tibG9jaygpICsgc3RybG9jOworCQkvKiBSZWFkIFBPUyBpbiAke3ZhcjpQT1M6TEVOfSAqLworCQlwb3MgPSBhdG9pKGxvYyk7IC8qIG51bWJlcihsb2MpIGVycm9ycyBvdXQgb24gIjE6NCIgKi8KKwkJbGVuID0gc3RyIC0gc3RhcnRwIC0gMTsKKworCQkvKiAqbG9jICE9ICdcMCcsIGd1YXJhbnRlZWQgYnkgcGFyc2VyICovCisJCWlmIChxdW90ZXMpIHsKKwkJCWNoYXIgKnB0cjsKKworCQkJLyogQWRqdXN0IHRoZSBsZW5ndGggYnkgdGhlIG51bWJlciBvZiBlc2NhcGVzICovCisJCQlmb3IgKHB0ciA9IHN0YXJ0cDsgcHRyIDwgKHN0ciAtIDEpOyBwdHIrKykgeworCQkJCWlmICgodW5zaWduZWQgY2hhcikqcHRyID09IENUTEVTQykgeworCQkJCQlsZW4tLTsKKwkJCQkJcHRyKys7CisJCQkJfQorCQkJfQorCQl9CisJCW9yaWdfbGVuID0gbGVuOworCisJCWlmICgqbG9jKysgPT0gJzonKSB7CisJCQkvKiAke3Zhcjo6TEVOfSAqLworCQkJbGVuID0gbnVtYmVyKGxvYyk7CisJCX0gZWxzZSB7CisJCQkvKiBTa2lwIFBPUyBpbiAke3ZhcjpQT1M6TEVOfSAqLworCQkJbGVuID0gb3JpZ19sZW47CisJCQl3aGlsZSAoKmxvYyAmJiAqbG9jICE9ICc6JykgeworCQkJCS8qIFRPRE8/CisJCQkJICogYmFzaCBjb21wbGFpbnMgb246IHZhcj1xd2U7IGVjaG8gJHt2YXI6MWE6MTIzfQorCQkJCWlmICghaXNkaWdpdCgqbG9jKSkKKwkJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IobXNnX2lsbG51bSwgc3RyKTsKKwkJCQkgKi8KKwkJCQlsb2MrKzsKKwkJCX0KKwkJCWlmICgqbG9jKysgPT0gJzonKSB7CisJCQkJbGVuID0gbnVtYmVyKGxvYyk7CisJCQl9CisJCX0KKwkJaWYgKHBvcyA+PSBvcmlnX2xlbikgeworCQkJcG9zID0gMDsKKwkJCWxlbiA9IDA7CisJCX0KKwkJaWYgKGxlbiA+IChvcmlnX2xlbiAtIHBvcykpCisJCQlsZW4gPSBvcmlnX2xlbiAtIHBvczsKKworCQlmb3IgKHN0ciA9IHN0YXJ0cDsgcG9zOyBzdHIrKywgcG9zLS0pIHsKKwkJCWlmIChxdW90ZXMgJiYgKHVuc2lnbmVkIGNoYXIpKnN0ciA9PSBDVExFU0MpCisJCQkJc3RyKys7CisJCX0KKwkJZm9yIChsb2MgPSBzdGFydHA7IGxlbjsgbGVuLS0pIHsKKwkJCWlmIChxdW90ZXMgJiYgKHVuc2lnbmVkIGNoYXIpKnN0ciA9PSBDVExFU0MpCisJCQkJKmxvYysrID0gKnN0cisrOworCQkJKmxvYysrID0gKnN0cisrOworCQl9CisJCSpsb2MgPSAnXDAnOworCQlhbW91bnQgPSBsb2MgLSBleHBkZXN0OworCQlTVEFESlVTVChhbW91bnQsIGV4cGRlc3QpOworCQlyZXR1cm4gbG9jOworI2VuZGlmCisJfQorCisJcmVzZXRsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisKKwkvKiBXZSdsbCBjb21lYmFjayBoZXJlIGlmIHdlIGdyb3cgdGhlIHN0YWNrIHdoaWxlIGhhbmRsaW5nCisJICogYSBWU1JFUExBQ0Ugb3IgVlNSRVBMQUNFQUxMLCBzaW5jZSBvdXIgcG9pbnRlcnMgaW50byB0aGUKKwkgKiBzdGFjayB3aWxsIG5lZWQgcmViYXNpbmcsIGFuZCB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBvdXIgd29yaworCSAqIGFyZWFzIGVhY2ggdGltZQorCSAqLworIElGX0FTSF9CQVNIX0NPTVBBVChyZXN0YXJ0OikKKworCWFtb3VudCA9IGV4cGRlc3QgLSAoKGNoYXIgKilzdGFja2Jsb2NrKCkgKyByZXNldGxvYyk7CisJU1RBREpVU1QoLWFtb3VudCwgZXhwZGVzdCk7CisJc3RhcnRwID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdGFydGxvYzsKKworCXJtZXNjID0gc3RhcnRwOworCXJtZXNjZW5kID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdHJsb2M7CisJaWYgKHF1b3RlcykgeworCQlybWVzYyA9IHJtZXNjYXBlcyhzdGFydHAsIFJNRVNDQVBFX0FMTE9DIHwgUk1FU0NBUEVfR1JPVyk7CisJCWlmIChybWVzYyAhPSBzdGFydHApIHsKKwkJCXJtZXNjZW5kID0gZXhwZGVzdDsKKwkJCXN0YXJ0cCA9IChjaGFyICopc3RhY2tibG9jaygpICsgc3RhcnRsb2M7CisJCX0KKwl9CisJcm1lc2NlbmQtLTsKKwlzdHIgPSAoY2hhciAqKXN0YWNrYmxvY2soKSArIHN0cmxvYzsKKwlwcmVnbG9iKHN0ciwgdmFyZmxhZ3MgJiBWU1FVT1RFLCAwKTsKKwl3b3JrbG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCWlmIChzdWJ0eXBlID09IFZTUkVQTEFDRSB8fCBzdWJ0eXBlID09IFZTUkVQTEFDRUFMTCkgeworCQljaGFyICppZHgsICplbmQ7CisKKwkJaWYgKCFyZXBsKSB7CisJCQlyZXBsID0gcGFyc2Vfc3ViX3BhdHRlcm4oc3RyLCB2YXJmbGFncyk7CisJCQkvL2JiX2Vycm9yX21zZygicmVwbDonJXMnIiwgcmVwbCk7CisJCQlpZiAoIXJlcGwpCisJCQkJcmVwbCA9IG51bGxzdHI7CisJCX0KKworCQkvKiBJZiB0aGVyZSdzIG5vIHBhdHRlcm4gdG8gbWF0Y2gsIHJldHVybiB0aGUgZXhwYW5zaW9uIHVubW9sZXN0ZWQgKi8KKwkJaWYgKHN0clswXSA9PSAnXDAnKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJbGVuID0gMDsKKwkJaWR4ID0gc3RhcnRwOworCQllbmQgPSBzdHIgLSAxOworCQl3aGlsZSAoaWR4IDwgZW5kKSB7CisgdHJ5X3RvX21hdGNoOgorCQkJbG9jID0gc2NhbnJpZ2h0KGlkeCwgcm1lc2MsIHJtZXNjZW5kLCBzdHIsIHF1b3RlcywgMSk7CisJCQkvL2JiX2Vycm9yX21zZygic2NhbnJpZ2h0KCclcycpOiclcyciLCBzdHIsIGxvYyk7CisJCQlpZiAoIWxvYykgeworCQkJCS8qIE5vIG1hdGNoLCBhZHZhbmNlICovCisJCQkJY2hhciAqcmVzdGFydF9kZXRlY3QgPSBzdGFja2Jsb2NrKCk7Cisgc2tpcF9tYXRjaGluZzoKKwkJCQlTVFBVVEMoKmlkeCwgZXhwZGVzdCk7CisJCQkJaWYgKHF1b3RlcyAmJiAodW5zaWduZWQgY2hhcikqaWR4ID09IENUTEVTQykgeworCQkJCQlpZHgrKzsKKwkJCQkJbGVuKys7CisJCQkJCVNUUFVUQygqaWR4LCBleHBkZXN0KTsKKwkJCQl9CisJCQkJaWYgKHN0YWNrYmxvY2soKSAhPSByZXN0YXJ0X2RldGVjdCkKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCWlkeCsrOworCQkJCWxlbisrOworCQkJCXJtZXNjKys7CisJCQkJLyogY29udGludWU7IC0gcHJvbmUgdG8gcXVhZHJhdGljIGJlaGF2aW9yLCBzbWFydGVyIGNvZGU6ICovCisJCQkJaWYgKGlkeCA+PSBlbmQpCisJCQkJCWJyZWFrOworCQkJCWlmIChzdHJbMF0gPT0gJyonKSB7CisJCQkJCS8qIFBhdHRlcm4gaXMgIipmb28iLiBJZiAiKmZvbyIgZG9lcyBub3QgbWF0Y2ggImxvbmdfc3RyaW5nIiwKKwkJCQkJICogaXQgd291bGQgbmV2ZXIgbWF0Y2ggIm9uZ19zdHJpbmciIGV0Yywgbm8gcG9pbnQgaW4gdHJ5aW5nLgorCQkJCQkgKi8KKwkJCQkJZ290byBza2lwX21hdGNoaW5nOworCQkJCX0KKwkJCQlnb3RvIHRyeV90b19tYXRjaDsKKwkJCX0KKworCQkJaWYgKHN1YnR5cGUgPT0gVlNSRVBMQUNFQUxMKSB7CisJCQkJd2hpbGUgKGlkeCA8IGxvYykgeworCQkJCQlpZiAocXVvdGVzICYmICh1bnNpZ25lZCBjaGFyKSppZHggPT0gQ1RMRVNDKQorCQkJCQkJaWR4Kys7CisJCQkJCWlkeCsrOworCQkJCQlybWVzYysrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWR4ID0gbG9jOworCQkJfQorCisJCQkvL2JiX2Vycm9yX21zZygicmVwbDonJXMnIiwgcmVwbCk7CisJCQlmb3IgKGxvYyA9IChjaGFyKilyZXBsOyAqbG9jOyBsb2MrKykgeworCQkJCWNoYXIgKnJlc3RhcnRfZGV0ZWN0ID0gc3RhY2tibG9jaygpOworCQkJCWlmIChxdW90ZXMgJiYgKmxvYyA9PSAnXFwnKSB7CisJCQkJCVNUUFVUQyhDVExFU0MsIGV4cGRlc3QpOworCQkJCQlsZW4rKzsKKwkJCQl9CisJCQkJU1RQVVRDKCpsb2MsIGV4cGRlc3QpOworCQkJCWlmIChzdGFja2Jsb2NrKCkgIT0gcmVzdGFydF9kZXRlY3QpCisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQlsZW4rKzsKKwkJCX0KKworCQkJaWYgKHN1YnR5cGUgPT0gVlNSRVBMQUNFKSB7CisJCQkJLy9iYl9lcnJvcl9tc2coInRhaWw6JyVzJywgcXVvdGVzOiV4IiwgaWR4LCBxdW90ZXMpOworCQkJCXdoaWxlICgqaWR4KSB7CisJCQkJCWNoYXIgKnJlc3RhcnRfZGV0ZWN0ID0gc3RhY2tibG9jaygpOworCQkJCQlTVFBVVEMoKmlkeCwgZXhwZGVzdCk7CisJCQkJCWlmIChzdGFja2Jsb2NrKCkgIT0gcmVzdGFydF9kZXRlY3QpCisJCQkJCQlnb3RvIHJlc3RhcnQ7CisJCQkJCWxlbisrOworCQkJCQlpZHgrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBXZSd2ZSBwdXQgdGhlIHJlcGxhY2VkIHRleHQgaW50byBhIGJ1ZmZlciBhdCB3b3JrbG9jLCBub3cKKwkJICogbW92ZSBpdCB0byB0aGUgcmlnaHQgcGxhY2UgYW5kIGFkanVzdCB0aGUgc3RhY2suCisJCSAqLworCQlTVFBVVEMoJ1wwJywgZXhwZGVzdCk7CisJCXN0YXJ0cCA9IChjaGFyICopc3RhY2tibG9jaygpICsgc3RhcnRsb2M7CisJCW1lbW1vdmUoc3RhcnRwLCAoY2hhciAqKXN0YWNrYmxvY2soKSArIHdvcmtsb2MsIGxlbiArIDEpOworCQkvL2JiX2Vycm9yX21zZygic3RhcnRwOiclcyciLCBzdGFydHApOworCQlhbW91bnQgPSBleHBkZXN0IC0gKHN0YXJ0cCArIGxlbik7CisJCVNUQURKVVNUKC1hbW91bnQsIGV4cGRlc3QpOworCQlyZXR1cm4gc3RhcnRwOworCX0KKyNlbmRpZiAvKiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUICovCisKKwlzdWJ0eXBlIC09IFZTVFJJTVJJR0hUOworI2lmIERFQlVHCisJaWYgKHN1YnR5cGUgPCAwIHx8IHN1YnR5cGUgPiA3KQorCQlhYm9ydCgpOworI2VuZGlmCisJLyogemVybyA9IChzdWJ0eXBlID09IFZTVFJJTUxFRlQgfHwgc3VidHlwZSA9PSBWU1RSSU1MRUZUTUFYKSAqLworCXplcm8gPSBzdWJ0eXBlID4+IDE7CisJLyogVlNUUklNTEVGVC9WU1RSSU1SSUdIVE1BWCAtPiBzY2FubGVmdCAqLworCXNjYW4gPSAoc3VidHlwZSAmIDEpIF4gemVybyA/IHNjYW5sZWZ0IDogc2NhbnJpZ2h0OworCisJbG9jID0gc2NhbihzdGFydHAsIHJtZXNjLCBybWVzY2VuZCwgc3RyLCBxdW90ZXMsIHplcm8pOworCWlmIChsb2MpIHsKKwkJaWYgKHplcm8pIHsKKwkJCW1lbW1vdmUoc3RhcnRwLCBsb2MsIHN0ciAtIGxvYyk7CisJCQlsb2MgPSBzdGFydHAgKyAoc3RyIC0gbG9jKSAtIDE7CisJCX0KKwkJKmxvYyA9ICdcMCc7CisJCWFtb3VudCA9IGxvYyAtIGV4cGRlc3Q7CisJCVNUQURKVVNUKGFtb3VudCwgZXhwZGVzdCk7CisJfQorCXJldHVybiBsb2M7Cit9CisKKy8qCisgKiBBZGQgdGhlIHZhbHVlIG9mIGEgc3BlY2lhbGl6ZWQgdmFyaWFibGUgdG8gdGhlIHN0YWNrIHN0cmluZy4KKyAqIG5hbWUgcGFyYW1ldGVyIChleGFtcGxlcyk6CisgKiBhc2ggLWMgJ2VjaG8gJDEnICAgICAgbmFtZTonMT0nCisgKiBhc2ggLWMgJ2VjaG8gJHF3ZScgICAgbmFtZToncXdlPScKKyAqIGFzaCAtYyAnZWNobyAkJCcgICAgICBuYW1lOickPScKKyAqIGFzaCAtYyAnZWNobyAkeyR9JyAgICBuYW1lOickPScKKyAqIGFzaCAtYyAnZWNobyAkeyQjI3F9JyBuYW1lOickPXEnCisgKiBhc2ggLWMgJ2VjaG8gJHsjJH0nICAgbmFtZTonJD0nCisgKiBub3RlOiBleGFtcGxlcyB3aXRoIGJhZCBzaGVsbCBzeW50YXg6CisgKiBhc2ggLWMgJ2VjaG8gJHsjJDF9JyAgbmFtZTonJD0xJworICogYXNoIC1jICdlY2hvICR7IzEjfScgIG5hbWU6JzE9IycKKyAqLworc3RhdGljIE5PSU5MSU5FIHNzaXplX3QKK3ZhcnZhbHVlKGNoYXIgKm5hbWUsIGludCB2YXJmbGFncywgaW50IGZsYWdzLCBzdHJ1Y3Qgc3RybGlzdCAqdmFyX3N0cl9saXN0KQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IG51bTsKKwlpbnQgaTsKKwlpbnQgc2VwcSA9IDA7CisJc3NpemVfdCBsZW4gPSAwOworCWludCBzdWJ0eXBlID0gdmFyZmxhZ3MgJiBWU1RZUEU7CisJaW50IHF1b3RlcyA9IGZsYWdzICYgKEVYUF9GVUxMIHwgRVhQX0NBU0UgfCBFWFBfUkVESVIpOworCWludCBxdW90ZWQgPSB2YXJmbGFncyAmIFZTUVVPVEU7CisJaW50IHN5bnRheCA9IHF1b3RlZCA/IERRU1lOVEFYIDogQkFTRVNZTlRBWDsKKworCXN3aXRjaCAoKm5hbWUpIHsKKwljYXNlICckJzoKKwkJbnVtID0gcm9vdHBpZDsKKwkJZ290byBudW12YXI7CisJY2FzZSAnPyc6CisJCW51bSA9IGV4aXRzdGF0dXM7CisJCWdvdG8gbnVtdmFyOworCWNhc2UgJyMnOgorCQludW0gPSBzaGVsbHBhcmFtLm5wYXJhbTsKKwkJZ290byBudW12YXI7CisJY2FzZSAnISc6CisJCW51bSA9IGJhY2tnbmRwaWQ7CisJCWlmIChudW0gPT0gMCkKKwkJCXJldHVybiAtMTsKKyBudW12YXI6CisJCWxlbiA9IGN2dG51bShudW0pOworCQlnb3RvIGNoZWNrXzFjaGFyX25hbWU7CisJY2FzZSAnLSc6CisJCWV4cGRlc3QgPSBtYWtlc3Ryc3BhY2UoTk9QVFMsIGV4cGRlc3QpOworCQlmb3IgKGkgPSBOT1BUUyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAob3B0bGlzdFtpXSkgeworCQkJCVVTVFBVVEMob3B0bGV0dGVycyhpKSwgZXhwZGVzdCk7CisJCQkJbGVuKys7CisJCQl9CisJCX0KKyBjaGVja18xY2hhcl9uYW1lOgorI2lmIDAKKwkJLyogaGFuZGxlcyBjYXNlcyBzaW1pbGFyIHRvICR7IyQxfSAqLworCQlpZiAobmFtZVsyXSAhPSAnXDAnKQorCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJiYWQgc3Vic3RpdHV0aW9uIik7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSAnQCc6IHsKKwkJY2hhciAqKmFwOworCQlpbnQgc2VwOworCisJCWlmIChxdW90ZWQgJiYgKGZsYWdzICYgRVhQX0ZVTEwpKSB7CisJCQkvKiBub3RlOiB0aGlzIGlzIG5vdCBtZWFudCBhcyBQRU9GIHZhbHVlICovCisJCQlzZXAgPSAxIDw8IENIQVJfQklUOworCQkJZ290byBwYXJhbTsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlICcqJzoKKwkJc2VwID0gaWZzc2V0KCkgPyAodW5zaWduZWQgY2hhcikoaWZzdmFsKClbMF0pIDogJyAnOworCQlpID0gU0lUKHNlcCwgc3ludGF4KTsKKwkJaWYgKHF1b3RlcyAmJiAoaSA9PSBDQ1RMIHx8IGkgPT0gQ0JBQ0spKQorCQkJc2VwcSA9IDE7CisgcGFyYW06CisJCWFwID0gc2hlbGxwYXJhbS5wOworCQlpZiAoIWFwKQorCQkJcmV0dXJuIC0xOworCQl3aGlsZSAoKHAgPSAqYXArKykgIT0gTlVMTCkgeworCQkJc2l6ZV90IHBhcnRsZW47CisKKwkJCXBhcnRsZW4gPSBzdHJsZW4ocCk7CisJCQlsZW4gKz0gcGFydGxlbjsKKworCQkJaWYgKCEoc3VidHlwZSA9PSBWU1BMVVMgfHwgc3VidHlwZSA9PSBWU0xFTkdUSCkpCisJCQkJbWVtdG9kZXN0KHAsIHBhcnRsZW4sIHN5bnRheCwgcXVvdGVzKTsKKworCQkJaWYgKCphcCAmJiBzZXApIHsKKwkJCQljaGFyICpxOworCisJCQkJbGVuKys7CisJCQkJaWYgKHN1YnR5cGUgPT0gVlNQTFVTIHx8IHN1YnR5cGUgPT0gVlNMRU5HVEgpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXEgPSBleHBkZXN0OworCQkJCWlmIChzZXBxKQorCQkJCQlTVFBVVEMoQ1RMRVNDLCBxKTsKKwkJCQkvKiBub3RlOiBtYXkgcHV0IE5VTCBkZXNwaXRlIHNlcCAhPSAwCisJCQkJICogKHNlZSBzZXAgPSAxIDw8IENIQVJfQklUIGFib3ZlKSAqLworCQkJCVNUUFVUQyhzZXAsIHEpOworCQkJCWV4cGRlc3QgPSBxOworCQkJfQorCQl9CisJCXJldHVybiBsZW47CisJfSAvKiBjYXNlICdAJyBhbmQgJyonICovCisJY2FzZSAnMCc6CisJY2FzZSAnMSc6CisJY2FzZSAnMic6CisJY2FzZSAnMyc6CisJY2FzZSAnNCc6CisJY2FzZSAnNSc6CisJY2FzZSAnNic6CisJY2FzZSAnNyc6CisJY2FzZSAnOCc6CisJY2FzZSAnOSc6CisJCW51bSA9IGF0b2kobmFtZSk7IC8qIG51bWJlcihuYW1lKSBmYWlscyBvbiAke04jc3RyfSBldGMgKi8KKwkJaWYgKG51bSA8IDAgfHwgbnVtID4gc2hlbGxwYXJhbS5ucGFyYW0pCisJCQlyZXR1cm4gLTE7CisJCXAgPSBudW0gPyBzaGVsbHBhcmFtLnBbbnVtIC0gMV0gOiBhcmcwOworCQlnb3RvIHZhbHVlOworCWRlZmF1bHQ6CisJCS8qIE5COiBuYW1lIGhhcyBmb3JtICJWQVI9Li4uIiAqLworCisJCS8qICJBPWEgQj0kQSIgY2FzZTogdmFyX3N0cl9saXN0IGlzIGEgbGlzdCBvZiAiQT1hIiBzdHJpbmdzCisJCSAqIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGJlZm9yZSB3ZSBjaGVjayB2YXJpYWJsZXMuICovCisJCWlmICh2YXJfc3RyX2xpc3QpIHsKKwkJCXVuc2lnbmVkIG5hbWVfbGVuID0gKHN0cmNocm51bChuYW1lLCAnPScpIC0gbmFtZSkgKyAxOworCQkJcCA9IE5VTEw7CisJCQlkbyB7CisJCQkJY2hhciAqc3RyLCAqZXE7CisJCQkJc3RyID0gdmFyX3N0cl9saXN0LT50ZXh0OworCQkJCWVxID0gc3RyY2hyKHN0ciwgJz0nKTsKKwkJCQlpZiAoIWVxKSAvKiBzdG9wIGF0IGZpcnN0IG5vbi1hc3NpZ25tZW50ICovCisJCQkJCWJyZWFrOworCQkJCWVxKys7CisJCQkJaWYgKG5hbWVfbGVuID09ICh1bnNpZ25lZCkoZXEgLSBzdHIpCisJCQkJICYmIHN0cm5jbXAoc3RyLCBuYW1lLCBuYW1lX2xlbikgPT0gMAorCQkJCSkgeworCQkJCQlwID0gZXE7CisJCQkJCS8qIGdvdG8gdmFsdWU7IC0gV1JPTkchICovCisJCQkJCS8qIHRoaW5rICJBPTEgQT0yIEI9JEEiICovCisJCQkJfQorCQkJCXZhcl9zdHJfbGlzdCA9IHZhcl9zdHJfbGlzdC0+bmV4dDsKKwkJCX0gd2hpbGUgKHZhcl9zdHJfbGlzdCk7CisJCQlpZiAocCkKKwkJCQlnb3RvIHZhbHVlOworCQl9CisJCXAgPSBsb29rdXB2YXIobmFtZSk7CisgdmFsdWU6CisJCWlmICghcCkKKwkJCXJldHVybiAtMTsKKworCQlsZW4gPSBzdHJsZW4ocCk7CisJCWlmICghKHN1YnR5cGUgPT0gVlNQTFVTIHx8IHN1YnR5cGUgPT0gVlNMRU5HVEgpKQorCQkJbWVtdG9kZXN0KHAsIGxlbiwgc3ludGF4LCBxdW90ZXMpOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmIChzdWJ0eXBlID09IFZTUExVUyB8fCBzdWJ0eXBlID09IFZTTEVOR1RIKQorCQlTVEFESlVTVCgtbGVuLCBleHBkZXN0KTsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogRXhwYW5kIGEgdmFyaWFibGUsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUKKyAqIGlucHV0IHN0cmluZy4KKyAqLworc3RhdGljIGNoYXIgKgorZXZhbHZhcihjaGFyICpwLCBpbnQgZmxhZ3MsIHN0cnVjdCBzdHJsaXN0ICp2YXJfc3RyX2xpc3QpCit7CisJY2hhciB2YXJmbGFnczsKKwljaGFyIHN1YnR5cGU7CisJY2hhciBxdW90ZWQ7CisJY2hhciBlYXN5OworCWNoYXIgKnZhcjsKKwlpbnQgcGF0bG9jOworCWludCBzdGFydGxvYzsKKwlzc2l6ZV90IHZhcmxlbjsKKworCXZhcmZsYWdzID0gKHVuc2lnbmVkIGNoYXIpICpwKys7CisJc3VidHlwZSA9IHZhcmZsYWdzICYgVlNUWVBFOworCXF1b3RlZCA9IHZhcmZsYWdzICYgVlNRVU9URTsKKwl2YXIgPSBwOworCWVhc3kgPSAoIXF1b3RlZCB8fCAoKnZhciA9PSAnQCcgJiYgc2hlbGxwYXJhbS5ucGFyYW0pKTsKKwlzdGFydGxvYyA9IGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlwID0gc3RyY2hyKHAsICc9JykgKyAxOyAvL1RPRE86IHVzZSB2YXJfZW5kKHApPworCisgYWdhaW46CisJdmFybGVuID0gdmFydmFsdWUodmFyLCB2YXJmbGFncywgZmxhZ3MsIHZhcl9zdHJfbGlzdCk7CisJaWYgKHZhcmZsYWdzICYgVlNOVUwpCisJCXZhcmxlbi0tOworCisJaWYgKHN1YnR5cGUgPT0gVlNQTFVTKSB7CisJCXZhcmxlbiA9IC0xIC0gdmFybGVuOworCQlnb3RvIHZzcGx1czsKKwl9CisKKwlpZiAoc3VidHlwZSA9PSBWU01JTlVTKSB7CisgdnNwbHVzOgorCQlpZiAodmFybGVuIDwgMCkgeworCQkJYXJnc3RyKAorCQkJCXAsCisJCQkJZmxhZ3MgfCAocXVvdGVkID8gRVhQX1RJTERFfEVYUF9RV09SRCA6IEVYUF9USUxERXxFWFBfV09SRCksCisJCQkJdmFyX3N0cl9saXN0CisJCQkpOworCQkJZ290byBlbmQ7CisJCX0KKwkJaWYgKGVhc3kpCisJCQlnb3RvIHJlY29yZDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHN1YnR5cGUgPT0gVlNBU1NJR04gfHwgc3VidHlwZSA9PSBWU1FVRVNUSU9OKSB7CisJCWlmICh2YXJsZW4gPCAwKSB7CisJCQlpZiAoc3ViZXZhbHZhcihwLCB2YXIsIC8qIHN0cmxvYzogKi8gMCwKKwkJCQkJc3VidHlwZSwgc3RhcnRsb2MsIHZhcmZsYWdzLAorCQkJCQkvKiBxdW90ZXM6ICovIDAsCisJCQkJCXZhcl9zdHJfbGlzdCkKKwkJCSkgeworCQkJCXZhcmZsYWdzICY9IH5WU05VTDsKKwkJCQkvKgorCQkJCSAqIFJlbW92ZSBhbnkgcmVjb3JkZWQgcmVnaW9ucyBiZXlvbmQKKwkJCQkgKiBzdGFydCBvZiB2YXJpYWJsZQorCQkJCSAqLworCQkJCXJlbW92ZXJlY29yZHJlZ2lvbnMoc3RhcnRsb2MpOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCQlnb3RvIGVuZDsKKwkJfQorCQlpZiAoZWFzeSkKKwkJCWdvdG8gcmVjb3JkOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAodmFybGVuIDwgMCAmJiB1ZmxhZykKKwkJdmFydW5zZXQocCwgdmFyLCAwLCAwKTsKKworCWlmIChzdWJ0eXBlID09IFZTTEVOR1RIKSB7CisJCWN2dG51bSh2YXJsZW4gPiAwID8gdmFybGVuIDogMCk7CisJCWdvdG8gcmVjb3JkOworCX0KKworCWlmIChzdWJ0eXBlID09IFZTTk9STUFMKSB7CisJCWlmIChlYXN5KQorCQkJZ290byByZWNvcmQ7CisJCWdvdG8gZW5kOworCX0KKworI2lmIERFQlVHCisJc3dpdGNoIChzdWJ0eXBlKSB7CisJY2FzZSBWU1RSSU1MRUZUOgorCWNhc2UgVlNUUklNTEVGVE1BWDoKKwljYXNlIFZTVFJJTVJJR0hUOgorCWNhc2UgVlNUUklNUklHSFRNQVg6CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCWNhc2UgVlNTVUJTVFI6CisJY2FzZSBWU1JFUExBQ0U6CisJY2FzZSBWU1JFUExBQ0VBTEw6CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisjZW5kaWYKKworCWlmICh2YXJsZW4gPj0gMCkgeworCQkvKgorCQkgKiBUZXJtaW5hdGUgdGhlIHN0cmluZyBhbmQgc3RhcnQgcmVjb3JkaW5nIHRoZSBwYXR0ZXJuCisJCSAqIHJpZ2h0IGFmdGVyIGl0CisJCSAqLworCQlTVFBVVEMoJ1wwJywgZXhwZGVzdCk7CisJCXBhdGxvYyA9IGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwkJaWYgKE5VTEwgPT0gc3ViZXZhbHZhcihwLCAvKiB2YXJuYW1lOiAqLyBOVUxMLCBwYXRsb2MsIHN1YnR5cGUsCisJCQkJc3RhcnRsb2MsIHZhcmZsYWdzLAorLy9UT0RPOiB8IEVYUF9SRURJUiB0b28/IEFsbCBvdGhlciBzdWNoIHBsYWNlcyBkbyBpdCB0b28KKwkJCQkvKiBxdW90ZXM6ICovIGZsYWdzICYgKEVYUF9GVUxMIHwgRVhQX0NBU0UpLAorCQkJCXZhcl9zdHJfbGlzdCkKKwkJKSB7CisJCQlpbnQgYW1vdW50ID0gZXhwZGVzdCAtICgKKwkJCQkoY2hhciAqKXN0YWNrYmxvY2soKSArIHBhdGxvYyAtIDEKKwkJCSk7CisJCQlTVEFESlVTVCgtYW1vdW50LCBleHBkZXN0KTsKKwkJfQorCQkvKiBSZW1vdmUgYW55IHJlY29yZGVkIHJlZ2lvbnMgYmV5b25kIHN0YXJ0IG9mIHZhcmlhYmxlICovCisJCXJlbW92ZXJlY29yZHJlZ2lvbnMoc3RhcnRsb2MpOworIHJlY29yZDoKKwkJcmVjb3JkcmVnaW9uKHN0YXJ0bG9jLCBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCksIHF1b3RlZCk7CisJfQorCisgZW5kOgorCWlmIChzdWJ0eXBlICE9IFZTTk9STUFMKSB7ICAgICAgLyogc2tpcCB0byBlbmQgb2YgYWx0ZXJuYXRpdmUgKi8KKwkJaW50IG5lc3RpbmcgPSAxOworCQlmb3IgKDs7KSB7CisJCQl1bnNpZ25lZCBjaGFyIGMgPSAqcCsrOworCQkJaWYgKGMgPT0gQ1RMRVNDKQorCQkJCXArKzsKKwkJCWVsc2UgaWYgKGMgPT0gQ1RMQkFDS1EgfHwgYyA9PSAoQ1RMQkFDS1F8Q1RMUVVPVEUpKSB7CisJCQkJaWYgKHZhcmxlbiA+PSAwKQorCQkJCQlhcmdiYWNrcSA9IGFyZ2JhY2txLT5uZXh0OworCQkJfSBlbHNlIGlmIChjID09IENUTFZBUikgeworCQkJCWlmICgoKnArKyAmIFZTVFlQRSkgIT0gVlNOT1JNQUwpCisJCQkJCW5lc3RpbmcrKzsKKwkJCX0gZWxzZSBpZiAoYyA9PSBDVExFTkRWQVIpIHsKKwkJCQlpZiAoLS1uZXN0aW5nID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBwOworfQorCisvKgorICogQnJlYWsgdGhlIGFyZ3VtZW50IHN0cmluZyBpbnRvIHBpZWNlcyBiYXNlZCB1cG9uIElGUyBhbmQgYWRkIHRoZQorICogc3RyaW5ncyB0byB0aGUgYXJndW1lbnQgbGlzdC4gIFRoZSByZWdpb25zIG9mIHRoZSBzdHJpbmcgdG8gYmUKKyAqIHNlYXJjaGVkIGZvciBJRlMgY2hhcmFjdGVycyBoYXZlIGJlZW4gc3RvcmVkIGJ5IHJlY29yZHJlZ2lvbi4KKyAqLworc3RhdGljIHZvaWQKK2lmc2JyZWFrdXAoY2hhciAqc3RyaW5nLCBzdHJ1Y3QgYXJnbGlzdCAqYXJnbGlzdCkKK3sKKwlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKwljaGFyICpzdGFydDsKKwljaGFyICpwOworCWNoYXIgKnE7CisJY29uc3QgY2hhciAqaWZzLCAqcmVhbGlmczsKKwlpbnQgaWZzc3BjOworCWludCBudWxvbmx5OworCisJc3RhcnQgPSBzdHJpbmc7CisJaWYgKGlmc2xhc3RwICE9IE5VTEwpIHsKKwkJaWZzc3BjID0gMDsKKwkJbnVsb25seSA9IDA7CisJCXJlYWxpZnMgPSBpZnNzZXQoKSA/IGlmc3ZhbCgpIDogZGVmaWZzOworCQlpZnNwID0gJmlmc2ZpcnN0OworCQlkbyB7CisJCQlwID0gc3RyaW5nICsgaWZzcC0+YmVnb2ZmOworCQkJbnVsb25seSA9IGlmc3AtPm51bG9ubHk7CisJCQlpZnMgPSBudWxvbmx5ID8gbnVsbHN0ciA6IHJlYWxpZnM7CisJCQlpZnNzcGMgPSAwOworCQkJd2hpbGUgKHAgPCBzdHJpbmcgKyBpZnNwLT5lbmRvZmYpIHsKKwkJCQlxID0gcDsKKwkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKnAgPT0gQ1RMRVNDKQorCQkJCQlwKys7CisJCQkJaWYgKCFzdHJjaHIoaWZzLCAqcCkpIHsKKwkJCQkJcCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFudWxvbmx5KQorCQkJCQlpZnNzcGMgPSAoc3RyY2hyKGRlZmlmcywgKnApICE9IE5VTEwpOworCQkJCS8qIElnbm9yZSBJRlMgd2hpdGVzcGFjZSBhdCBzdGFydCAqLworCQkJCWlmIChxID09IHN0YXJ0ICYmIGlmc3NwYykgeworCQkJCQlwKys7CisJCQkJCXN0YXJ0ID0gcDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCSpxID0gJ1wwJzsKKwkJCQlzcCA9IHN0emFsbG9jKHNpemVvZigqc3ApKTsKKwkJCQlzcC0+dGV4dCA9IHN0YXJ0OworCQkJCSphcmdsaXN0LT5sYXN0cCA9IHNwOworCQkJCWFyZ2xpc3QtPmxhc3RwID0gJnNwLT5uZXh0OworCQkJCXArKzsKKwkJCQlpZiAoIW51bG9ubHkpIHsKKwkJCQkJZm9yICg7OykgeworCQkJCQkJaWYgKHAgPj0gc3RyaW5nICsgaWZzcC0+ZW5kb2ZmKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlxID0gcDsKKwkJCQkJCWlmICgodW5zaWduZWQgY2hhcikqcCA9PSBDVExFU0MpCisJCQkJCQkJcCsrOworCQkJCQkJaWYgKHN0cmNocihpZnMsICpwKSA9PSBOVUxMKSB7CisJCQkJCQkJcCA9IHE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoc3RyY2hyKGRlZmlmcywgKnApID09IE5VTEwpIHsKKwkJCQkJCQlpZiAoaWZzc3BjKSB7CisJCQkJCQkJCXArKzsKKwkJCQkJCQkJaWZzc3BjID0gMDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlwID0gcTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlCisJCQkJCQkJcCsrOworCQkJCQl9CisJCQkJfQorCQkJCXN0YXJ0ID0gcDsKKwkJCX0gLyogd2hpbGUgKi8KKwkJCWlmc3AgPSBpZnNwLT5uZXh0OworCQl9IHdoaWxlIChpZnNwICE9IE5VTEwpOworCQlpZiAobnVsb25seSkKKwkJCWdvdG8gYWRkOworCX0KKworCWlmICghKnN0YXJ0KQorCQlyZXR1cm47CisKKyBhZGQ6CisJc3AgPSBzdHphbGxvYyhzaXplb2YoKnNwKSk7CisJc3AtPnRleHQgPSBzdGFydDsKKwkqYXJnbGlzdC0+bGFzdHAgPSBzcDsKKwlhcmdsaXN0LT5sYXN0cCA9ICZzcC0+bmV4dDsKK30KKworc3RhdGljIHZvaWQKK2lmc2ZyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgaWZzcmVnaW9uICpwOworCisJSU5UX09GRjsKKwlwID0gaWZzZmlyc3QubmV4dDsKKwlkbyB7CisJCXN0cnVjdCBpZnNyZWdpb24gKmlmc3A7CisJCWlmc3AgPSBwLT5uZXh0OworCQlmcmVlKHApOworCQlwID0gaWZzcDsKKwl9IHdoaWxlIChwKTsKKwlpZnNsYXN0cCA9IE5VTEw7CisJaWZzZmlyc3QubmV4dCA9IE5VTEw7CisJSU5UX09OOworfQorCisvKgorICogQWRkIGEgZmlsZSBuYW1lIHRvIHRoZSBsaXN0LgorICovCitzdGF0aWMgdm9pZAorYWRkZm5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisKKwlzcCA9IHN0emFsbG9jKHNpemVvZigqc3ApKTsKKwlzcC0+dGV4dCA9IHN0c3RyZHVwKG5hbWUpOworCSpleHBhcmcubGFzdHAgPSBzcDsKKwlleHBhcmcubGFzdHAgPSAmc3AtPm5leHQ7Cit9CisKKy8qCisgKiBEbyBtZXRhY2hhcmFjdGVyIChpLmUuICosID8sIFsuLi5dKSBleHBhbnNpb24uCisgKi8KK3N0YXRpYyB2b2lkCitleHBtZXRhKGNoYXIgKmV4cGRpciwgY2hhciAqZW5kZGlyLCBjaGFyICpuYW1lKQoreworCWNoYXIgKnA7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqc3RhcnQ7CisJY2hhciAqZW5kbmFtZTsKKwlpbnQgbWV0YWZsYWc7CisJc3RydWN0IHN0YXQgc3RhdGI7CisJRElSICpkaXJwOworCXN0cnVjdCBkaXJlbnQgKmRwOworCWludCBhdGVuZDsKKwlpbnQgbWF0Y2hkb3Q7CisKKwltZXRhZmxhZyA9IDA7CisJc3RhcnQgPSBuYW1lOworCWZvciAocCA9IG5hbWU7ICpwOyBwKyspIHsKKwkJaWYgKCpwID09ICcqJyB8fCAqcCA9PSAnPycpCisJCQltZXRhZmxhZyA9IDE7CisJCWVsc2UgaWYgKCpwID09ICdbJykgeworCQkJY2hhciAqcSA9IHAgKyAxOworCQkJaWYgKCpxID09ICchJykKKwkJCQlxKys7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCpxID09ICdcXCcpCisJCQkJCXErKzsKKwkJCQlpZiAoKnEgPT0gJy8nIHx8ICpxID09ICdcMCcpCisJCQkJCWJyZWFrOworCQkJCWlmICgqKytxID09ICddJykgeworCQkJCQltZXRhZmxhZyA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICgqcCA9PSAnXFwnKQorCQkJcCsrOworCQllbHNlIGlmICgqcCA9PSAnLycpIHsKKwkJCWlmIChtZXRhZmxhZykKKwkJCQlnb3RvIG91dDsKKwkJCXN0YXJ0ID0gcCArIDE7CisJCX0KKwl9Cisgb3V0OgorCWlmIChtZXRhZmxhZyA9PSAwKSB7ICAgIC8qIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlsZSBuYW1lICovCisJCWlmIChlbmRkaXIgIT0gZXhwZGlyKQorCQkJbWV0YWZsYWcrKzsKKwkJcCA9IG5hbWU7CisJCWRvIHsKKwkJCWlmICgqcCA9PSAnXFwnKQorCQkJCXArKzsKKwkJCSplbmRkaXIrKyA9ICpwOworCQl9IHdoaWxlICgqcCsrKTsKKwkJaWYgKG1ldGFmbGFnID09IDAgfHwgbHN0YXQoZXhwZGlyLCAmc3RhdGIpID49IDApCisJCQlhZGRmbmFtZShleHBkaXIpOworCQlyZXR1cm47CisJfQorCWVuZG5hbWUgPSBwOworCWlmIChuYW1lIDwgc3RhcnQpIHsKKwkJcCA9IG5hbWU7CisJCWRvIHsKKwkJCWlmICgqcCA9PSAnXFwnKQorCQkJCXArKzsKKwkJCSplbmRkaXIrKyA9ICpwKys7CisJCX0gd2hpbGUgKHAgPCBzdGFydCk7CisJfQorCWlmIChlbmRkaXIgPT0gZXhwZGlyKSB7CisJCWNwID0gIi4iOworCX0gZWxzZSBpZiAoZW5kZGlyID09IGV4cGRpciArIDEgJiYgKmV4cGRpciA9PSAnLycpIHsKKwkJY3AgPSAiLyI7CisJfSBlbHNlIHsKKwkJY3AgPSBleHBkaXI7CisJCWVuZGRpclstMV0gPSAnXDAnOworCX0KKwlkaXJwID0gb3BlbmRpcihjcCk7CisJaWYgKGRpcnAgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChlbmRkaXIgIT0gZXhwZGlyKQorCQllbmRkaXJbLTFdID0gJy8nOworCWlmICgqZW5kbmFtZSA9PSAwKSB7CisJCWF0ZW5kID0gMTsKKwl9IGVsc2UgeworCQlhdGVuZCA9IDA7CisJCSplbmRuYW1lKysgPSAnXDAnOworCX0KKwltYXRjaGRvdCA9IDA7CisJcCA9IHN0YXJ0OworCWlmICgqcCA9PSAnXFwnKQorCQlwKys7CisJaWYgKCpwID09ICcuJykKKwkJbWF0Y2hkb3QrKzsKKwl3aGlsZSAoIXBlbmRpbmdfaW50ICYmIChkcCA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKKwkJaWYgKGRwLT5kX25hbWVbMF0gPT0gJy4nICYmICFtYXRjaGRvdCkKKwkJCWNvbnRpbnVlOworCQlpZiAocG1hdGNoKHN0YXJ0LCBkcC0+ZF9uYW1lKSkgeworCQkJaWYgKGF0ZW5kKSB7CisJCQkJc3RyY3B5KGVuZGRpciwgZHAtPmRfbmFtZSk7CisJCQkJYWRkZm5hbWUoZXhwZGlyKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChwID0gZW5kZGlyLCBjcCA9IGRwLT5kX25hbWU7ICgqcCsrID0gKmNwKyspICE9ICdcMCc7KQorCQkJCQljb250aW51ZTsKKwkJCQlwWy0xXSA9ICcvJzsKKwkJCQlleHBtZXRhKGV4cGRpciwgcCwgZW5kbmFtZSk7CisJCQl9CisJCX0KKwl9CisJY2xvc2VkaXIoZGlycCk7CisJaWYgKCFhdGVuZCkKKwkJZW5kbmFtZVstMV0gPSAnLyc7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqCittc29ydChzdHJ1Y3Qgc3RybGlzdCAqbGlzdCwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqcCwgKnEgPSBOVUxMOworCXN0cnVjdCBzdHJsaXN0ICoqbHBwOworCWludCBoYWxmOworCWludCBuOworCisJaWYgKGxlbiA8PSAxKQorCQlyZXR1cm4gbGlzdDsKKwloYWxmID0gbGVuID4+IDE7CisJcCA9IGxpc3Q7CisJZm9yIChuID0gaGFsZjsgLS1uID49IDA7KSB7CisJCXEgPSBwOworCQlwID0gcC0+bmV4dDsKKwl9CisJcS0+bmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgZmlyc3QgaGFsZiBvZiBsaXN0ICovCisJcSA9IG1zb3J0KGxpc3QsIGhhbGYpOyAgICAgICAgICAvKiBzb3J0IGZpcnN0IGhhbGYgb2YgbGlzdCAqLworCXAgPSBtc29ydChwLCBsZW4gLSBoYWxmKTsgICAgICAgICAgICAgICAvKiBzb3J0IHNlY29uZCBoYWxmICovCisJbHBwID0gJmxpc3Q7CisJZm9yICg7OykgeworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCQlpZiAoc3RyY29sbChwLT50ZXh0LCBxLT50ZXh0KSA8IDApCisjZWxzZQorCQlpZiAoc3RyY21wKHAtPnRleHQsIHEtPnRleHQpIDwgMCkKKyNlbmRpZgorCQkJCQkJeworCQkJKmxwcCA9IHA7CisJCQlscHAgPSAmcC0+bmV4dDsKKwkJCXAgPSAqbHBwOworCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCSpscHAgPSBxOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJKmxwcCA9IHE7CisJCQlscHAgPSAmcS0+bmV4dDsKKwkJCXEgPSAqbHBwOworCQkJaWYgKHEgPT0gTlVMTCkgeworCQkJCSpscHAgPSBwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBsaXN0OworfQorCisvKgorICogU29ydCB0aGUgcmVzdWx0cyBvZiBmaWxlIG5hbWUgZXhwYW5zaW9uLiAgSXQgY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mCisgKiBzdHJpbmdzIHRvIHNvcnQgYW5kIHRoZW4gY2FsbHMgbXNvcnQgKHNob3J0IGZvciBtZXJnZSBzb3J0KSB0byBkbyB0aGUKKyAqIHdvcmsuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqCitleHBzb3J0KHN0cnVjdCBzdHJsaXN0ICpzdHIpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisKKwlsZW4gPSAwOworCWZvciAoc3AgPSBzdHI7IHNwOyBzcCA9IHNwLT5uZXh0KQorCQlsZW4rKzsKKwlyZXR1cm4gbXNvcnQoc3RyLCBsZW4pOworfQorCitzdGF0aWMgdm9pZAorZXhwYW5kbWV0YShzdHJ1Y3Qgc3RybGlzdCAqc3RyIC8qLCBpbnQgZmxhZyovKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1ldGFjaGFyc1tdIEFMSUdOMSA9IHsKKwkJJyonLCAnPycsICdbJywgMAorCX07CisJLyogVE9ETyAtIEVYUF9SRURJUiAqLworCisJd2hpbGUgKHN0cikgeworCQljaGFyICpleHBkaXI7CisJCXN0cnVjdCBzdHJsaXN0ICoqc2F2ZWxhc3RwOworCQlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJCWNoYXIgKnA7CisKKwkJaWYgKGZmbGFnKQorCQkJZ290byBub21ldGE7CisJCWlmICghc3RycGJyayhzdHItPnRleHQsIG1ldGFjaGFycykpCisJCQlnb3RvIG5vbWV0YTsKKwkJc2F2ZWxhc3RwID0gZXhwYXJnLmxhc3RwOworCisJCUlOVF9PRkY7CisJCXAgPSBwcmVnbG9iKHN0ci0+dGV4dCwgMCwgUk1FU0NBUEVfQUxMT0MgfCBSTUVTQ0FQRV9IRUFQKTsKKwkJeworCQkJaW50IGkgPSBzdHJsZW4oc3RyLT50ZXh0KTsKKwkJCWV4cGRpciA9IGNrbWFsbG9jKGkgPCAyMDQ4ID8gMjA0OCA6IGkpOyAvKiBYWFggKi8KKwkJfQorCQlleHBtZXRhKGV4cGRpciwgZXhwZGlyLCBwKTsKKwkJZnJlZShleHBkaXIpOworCQlpZiAocCAhPSBzdHItPnRleHQpCisJCQlmcmVlKHApOworCQlJTlRfT047CisJCWlmIChleHBhcmcubGFzdHAgPT0gc2F2ZWxhc3RwKSB7CisJCQkvKgorCQkJICogbm8gbWF0Y2hlcworCQkJICovCisgbm9tZXRhOgorCQkJKmV4cGFyZy5sYXN0cCA9IHN0cjsKKwkJCXJtZXNjYXBlcyhzdHItPnRleHQsIDApOworCQkJZXhwYXJnLmxhc3RwID0gJnN0ci0+bmV4dDsKKwkJfSBlbHNlIHsKKwkJCSpleHBhcmcubGFzdHAgPSBOVUxMOworCQkJKnNhdmVsYXN0cCA9IHNwID0gZXhwc29ydCgqc2F2ZWxhc3RwKTsKKwkJCXdoaWxlIChzcC0+bmV4dCAhPSBOVUxMKQorCQkJCXNwID0gc3AtPm5leHQ7CisJCQlleHBhcmcubGFzdHAgPSAmc3AtPm5leHQ7CisJCX0KKwkJc3RyID0gc3RyLT5uZXh0OworCX0KK30KKworLyoKKyAqIFBlcmZvcm0gdmFyaWFibGUgc3Vic3RpdHV0aW9uIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBvbiBhbiBhcmd1bWVudCwKKyAqIHBsYWNpbmcgdGhlIHJlc3VsdGluZyBsaXN0IG9mIGFyZ3VtZW50cyBpbiBhcmdsaXN0LiAgSWYgRVhQX0ZVTEwgaXMgdHJ1ZSwKKyAqIHBlcmZvcm0gc3BsaXR0aW5nIGFuZCBmaWxlIG5hbWUgZXhwYW5zaW9uLiAgV2hlbiBhcmdsaXN0IGlzIE5VTEwsIHBlcmZvcm0KKyAqIGhlcmUgZG9jdW1lbnQgZXhwYW5zaW9uLgorICovCitzdGF0aWMgdm9pZAorZXhwYW5kYXJnKHVuaW9uIG5vZGUgKmFyZywgc3RydWN0IGFyZ2xpc3QgKmFyZ2xpc3QsIGludCBmbGFnKQoreworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKwljaGFyICpwOworCisJYXJnYmFja3EgPSBhcmctPm5hcmcuYmFja3F1b3RlOworCVNUQVJUU1RBQ0tTVFIoZXhwZGVzdCk7CisJaWZzZmlyc3QubmV4dCA9IE5VTEw7CisJaWZzbGFzdHAgPSBOVUxMOworCWFyZ3N0cihhcmctPm5hcmcudGV4dCwgZmxhZywKKwkJCS8qIHZhcl9zdHJfbGlzdDogKi8gYXJnbGlzdCA/IGFyZ2xpc3QtPmxpc3QgOiBOVUxMKTsKKwlwID0gX1NUUFVUQygnXDAnLCBleHBkZXN0KTsKKwlleHBkZXN0ID0gcCAtIDE7CisJaWYgKGFyZ2xpc3QgPT0gTlVMTCkgeworCQlyZXR1cm47ICAgICAgICAgICAgICAgICAvKiBoZXJlIGRvY3VtZW50IGV4cGFuZGVkICovCisJfQorCXAgPSBncmFic3RhY2tzdHIocCk7CisJZXhwYXJnLmxhc3RwID0gJmV4cGFyZy5saXN0OworCS8qCisJICogVE9ETyAtIEVYUF9SRURJUgorCSAqLworCWlmIChmbGFnICYgRVhQX0ZVTEwpIHsKKwkJaWZzYnJlYWt1cChwLCAmZXhwYXJnKTsKKwkJKmV4cGFyZy5sYXN0cCA9IE5VTEw7CisJCWV4cGFyZy5sYXN0cCA9ICZleHBhcmcubGlzdDsKKwkJZXhwYW5kbWV0YShleHBhcmcubGlzdCAvKiwgZmxhZyovKTsKKwl9IGVsc2UgeworCQlpZiAoZmxhZyAmIEVYUF9SRURJUikgLypYWFggLSBmb3Igbm93LCBqdXN0IHJlbW92ZSBlc2NhcGVzICovCisJCQlybWVzY2FwZXMocCwgMCk7CisJCXNwID0gc3R6YWxsb2Moc2l6ZW9mKCpzcCkpOworCQlzcC0+dGV4dCA9IHA7CisJCSpleHBhcmcubGFzdHAgPSBzcDsKKwkJZXhwYXJnLmxhc3RwID0gJnNwLT5uZXh0OworCX0KKwlpZiAoaWZzZmlyc3QubmV4dCkKKwkJaWZzZnJlZSgpOworCSpleHBhcmcubGFzdHAgPSBOVUxMOworCWlmIChleHBhcmcubGlzdCkgeworCQkqYXJnbGlzdC0+bGFzdHAgPSBleHBhcmcubGlzdDsKKwkJYXJnbGlzdC0+bGFzdHAgPSBleHBhcmcubGFzdHA7CisJfQorfQorCisvKgorICogRXhwYW5kIHNoZWxsIHZhcmlhYmxlcyBhbmQgYmFja3F1b3RlcyBpbnNpZGUgYSBoZXJlIGRvY3VtZW50LgorICovCitzdGF0aWMgdm9pZAorZXhwYW5kaGVyZSh1bmlvbiBub2RlICphcmcsIGludCBmZCkKK3sKKwloZXJlZmQgPSBmZDsKKwlleHBhbmRhcmcoYXJnLCAoc3RydWN0IGFyZ2xpc3QgKilOVUxMLCAwKTsKKwlmdWxsX3dyaXRlKGZkLCBzdGFja2Jsb2NrKCksIGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLgorICovCitzdGF0aWMgaW50CitwYXRtYXRjaChjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIHBtYXRjaChwcmVnbG9iKHBhdHRlcm4sIDAsIDApLCBzdHJpbmcpOworfQorCisvKgorICogU2VlIGlmIGEgcGF0dGVybiBtYXRjaGVzIGluIGEgY2FzZSBzdGF0ZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQKK2Nhc2VtYXRjaCh1bmlvbiBub2RlICpwYXR0ZXJuLCBjaGFyICp2YWwpCit7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwlpbnQgcmVzdWx0OworCisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJYXJnYmFja3EgPSBwYXR0ZXJuLT5uYXJnLmJhY2txdW90ZTsKKwlTVEFSVFNUQUNLU1RSKGV4cGRlc3QpOworCWlmc2xhc3RwID0gTlVMTDsKKwlhcmdzdHIocGF0dGVybi0+bmFyZy50ZXh0LCBFWFBfVElMREUgfCBFWFBfQ0FTRSwKKwkJCS8qIHZhcl9zdHJfbGlzdDogKi8gTlVMTCk7CisJU1RBQ0tTVFJOVUwoZXhwZGVzdCk7CisJcmVzdWx0ID0gcGF0bWF0Y2goc3RhY2tibG9jaygpLCB2YWwpOworCXBvcHN0YWNrbWFyaygmc21hcmspOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogPT09PT09PT09PT09IGZpbmRfY29tbWFuZCAqLworCitzdHJ1Y3QgYnVpbHRpbmNtZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpidWlsdGluKShpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKKwkvKiB1bnNpZ25lZCBmbGFnczsgKi8KK307CisjZGVmaW5lIElTX0JVSUxUSU5fU1BFQ0lBTChiKSAoKGIpLT5uYW1lWzBdICYgMSkKKy8qICJyZWd1bGFyIiBidWlsdGlucyBhbHdheXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29tbWFuZHMsCisgKiByZWdhcmRsZXNzIG9mIFBBVEg9Li4uLiVidWlsdGluLi4uIHBvc2l0aW9uICovCisjZGVmaW5lIElTX0JVSUxUSU5fUkVHVUxBUihiKSAoKGIpLT5uYW1lWzBdICYgMikKKyNkZWZpbmUgSVNfQlVJTFRJTl9BU1NJR04oYikgICgoYiktPm5hbWVbMF0gJiA0KQorCitzdHJ1Y3QgY21kZW50cnkgeworCXNtYWxsaW50IGNtZHR5cGU7ICAgICAgIC8qIENNRHh4eCAqLworCXVuaW9uIHBhcmFtIHsKKwkJaW50IGluZGV4OworCQkvKiBpbmRleCA+PSAwIGZvciBjb21tYW5kcyB3aXRob3V0IHBhdGggKHNsYXNoZXMpICovCisJCS8qIChUT0RPOiB3aGF0IGV4YWN0bHkgZG9lcyB0aGUgdmFsdWUgbWVhbj8gUEFUSCBwb3NpdGlvbj8pICovCisJCS8qIGluZGV4ID09IC0xIGZvciBjb21tYW5kcyB3aXRoIHNsYXNoZXMgKi8KKwkJLyogaW5kZXggPT0gKC0yIC0gYXBwbGV0X25vKSBmb3IgTk9GT1JLIGFwcGxldHMgKi8KKwkJY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgKmNtZDsKKwkJc3RydWN0IGZ1bmNub2RlICpmdW5jOworCX0gdTsKK307CisvKiB2YWx1ZXMgb2YgY21kdHlwZSAqLworI2RlZmluZSBDTURVTktOT1dOICAgICAgLTEgICAgICAvKiBubyBlbnRyeSBpbiB0YWJsZSBmb3IgY29tbWFuZCAqLworI2RlZmluZSBDTUROT1JNQUwgICAgICAgMCAgICAgICAvKiBjb21tYW5kIGlzIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSAqLworI2RlZmluZSBDTURGVU5DVElPTiAgICAgMSAgICAgICAvKiBjb21tYW5kIGlzIGEgc2hlbGwgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQ01EQlVJTFRJTiAgICAgIDIgICAgICAgLyogY29tbWFuZCBpcyBhIHNoZWxsIGJ1aWx0aW4gKi8KKworLyogYWN0aW9uIHRvIGZpbmRfY29tbWFuZCgpICovCisjZGVmaW5lIERPX0VSUiAgICAgICAgICAweDAxICAgIC8qIHByaW50cyBlcnJvcnMgKi8KKyNkZWZpbmUgRE9fQUJTICAgICAgICAgIDB4MDIgICAgLyogY2hlY2tzIGFic29sdXRlIHBhdGhzICovCisjZGVmaW5lIERPX05PRlVOQyAgICAgICAweDA0ICAgIC8qIGRvbid0IHJldHVybiBzaGVsbCBmdW5jdGlvbnMsIGZvciBjb21tYW5kICovCisjZGVmaW5lIERPX0FMVFBBVEggICAgICAweDA4ICAgIC8qIHVzaW5nIGFsdGVybmF0ZSBwYXRoICovCisjZGVmaW5lIERPX0FMVEJMVElOICAgICAweDIwICAgIC8qICVidWlsdGluIGluIGFsdC4gcGF0aCAqLworCitzdGF0aWMgdm9pZCBmaW5kX2NvbW1hbmQoY2hhciAqLCBzdHJ1Y3QgY21kZW50cnkgKiwgaW50LCBjb25zdCBjaGFyICopOworCisKKy8qID09PT09PT09PT09PSBIYXNoaW5nIGNvbW1hbmRzICovCisKKy8qCisgKiBXaGVuIGNvbW1hbmRzIGFyZSBmaXJzdCBlbmNvdW50ZXJlZCwgdGhleSBhcmUgZW50ZXJlZCBpbiBhIGhhc2ggdGFibGUuCisgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGZ1bGwgcGF0aCBzZWFyY2ggd2lsbCBub3QgaGF2ZSB0byBiZSBkb25lIGZvciB0aGVtCisgKiBvbiBlYWNoIGludm9jYXRpb24uCisgKgorICogV2Ugc2hvdWxkIGludmVzdGlnYXRlIGNvbnZlcnRpbmcgdG8gYSBsaW5lYXIgc2VhcmNoLCBldmVuIHRob3VnaCB0aGF0CisgKiB3b3VsZCBtYWtlIHRoZSBjb21tYW5kIG5hbWUgImhhc2giIGEgbWlzbm9tZXIuCisgKi8KKworc3RydWN0IHRibGVudHJ5IHsKKwlzdHJ1Y3QgdGJsZW50cnkgKm5leHQ7ICAvKiBuZXh0IGVudHJ5IGluIGhhc2ggY2hhaW4gKi8KKwl1bmlvbiBwYXJhbSBwYXJhbTsgICAgICAvKiBkZWZpbml0aW9uIG9mIGJ1aWx0aW4gZnVuY3Rpb24gKi8KKwlzbWFsbGludCBjbWR0eXBlOyAgICAgICAvKiBDTUR4eHggKi8KKwljaGFyIHJlaGFzaDsgICAgICAgICAgICAvKiBpZiBzZXQsIGNkIGRvbmUgc2luY2UgZW50cnkgY3JlYXRlZCAqLworCWNoYXIgY21kbmFtZVsxXTsgICAgICAgIC8qIG5hbWUgb2YgY29tbWFuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCB0YmxlbnRyeSAqKmNtZHRhYmxlOworI2RlZmluZSBJTklUX0dfY21kdGFibGUoKSBkbyB7IFwKKwljbWR0YWJsZSA9IHh6YWxsb2MoQ01EVEFCTEVTSVpFICogc2l6ZW9mKGNtZHRhYmxlWzBdKSk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgYnVpbHRpbmxvYyA9IC0xOyAgICAgLyogaW5kZXggaW4gcGF0aCBvZiAlYnVpbHRpbiwgb3IgLTEgKi8KKworCitzdGF0aWMgdm9pZAordHJ5ZXhlYyhJRl9GRUFUVVJFX1NIX1NUQU5EQUxPTkUoaW50IGFwcGxldF9ubywpIGNoYXIgKmNtZCwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwlpZiAoYXBwbGV0X25vID49IDApIHsKKwkJaWYgKEFQUExFVF9JU19OT0VYRUMoYXBwbGV0X25vKSkgeworCQkJY2xlYXJlbnYoKTsKKwkJCXdoaWxlICgqZW52cCkKKwkJCQlwdXRlbnYoKmVudnArKyk7CisJCQlydW5fYXBwbGV0X25vX2FuZF9leGl0KGFwcGxldF9ubywgYXJndik7CisJCX0KKwkJLyogcmUtZXhlYyBvdXJzZWx2ZXMgd2l0aCB0aGUgbmV3IGFyZ3VtZW50cyAqLworCQlleGVjdmUoYmJfYnVzeWJveF9leGVjX3BhdGgsIGFyZ3YsIGVudnApOworCQkvKiBJZiB0aGV5IGNhbGxlZCBjaHJvb3Qgb3Igb3RoZXJ3aXNlIG1hZGUgdGhlIGJpbmFyeSBubyBsb25nZXIKKwkJICogZXhlY3V0YWJsZSwgZmFsbCB0aHJvdWdoICovCisJfQorI2VuZGlmCisKKyByZXBlYXQ6CisjaWZkZWYgU1lTVgorCWRvIHsKKwkJZXhlY3ZlKGNtZCwgYXJndiwgZW52cCk7CisJfSB3aGlsZSAoZXJybm8gPT0gRUlOVFIpOworI2Vsc2UKKwlleGVjdmUoY21kLCBhcmd2LCBlbnZwKTsKKyNlbmRpZgorCWlmIChjbWQgPT0gKGNoYXIqKSBiYl9idXN5Ym94X2V4ZWNfcGF0aCkgeworCQkvKiBXZSBhbHJlYWR5IHZpc2l0ZWQgRU5PRVhFQyBicmFuY2ggYmVsb3csIGRvbid0IGRvIGl0IGFnYWluICovCisvL1RPRE86IHRyeSBleGVjdmUoaW5pdGlhbF9hcmd2MF9vZl9zaGVsbCwgYXJndiwgZW52cCkgYmVmb3JlIGdpdmluZyB1cD8KKwkJZnJlZShhcmd2KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZXJybm8gPT0gRU5PRVhFQykgeworCQkvKiBSdW4gImNtZCIgYXMgYSBzaGVsbCBzY3JpcHQ6CisJCSAqIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDIuaHRtbAorCQkgKiAiSWYgdGhlIGV4ZWN2ZSgpIGZ1bmN0aW9uIGZhaWxzIHdpdGggRU5PRVhFQywgdGhlIHNoZWxsCisJCSAqIHNoYWxsIGV4ZWN1dGUgYSBjb21tYW5kIGVxdWl2YWxlbnQgdG8gaGF2aW5nIGEgc2hlbGwgaW52b2tlZAorCQkgKiB3aXRoIHRoZSBjb21tYW5kIG5hbWUgYXMgaXRzIGZpcnN0IG9wZXJhbmQsCisJCSAqIHdpdGggYW55IHJlbWFpbmluZyBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBuZXcgc2hlbGwiCisJCSAqCisJCSAqIFRoYXQgaXMsIGRvIG5vdCB1c2UgJFNIRUxMLCB1c2VyJ3Mgc2hlbGwsIG9yIC9iaW4vc2g7CisJCSAqIGp1c3QgY2FsbCBvdXJzZWx2ZXMuCisJCSAqLworCQljaGFyICoqYXA7CisJCWNoYXIgKipuZXc7CisKKwkJZm9yIChhcCA9IGFyZ3Y7ICphcDsgYXArKykKKwkJCWNvbnRpbnVlOworCQluZXcgPSBja21hbGxvYygoYXAgLSBhcmd2ICsgMikgKiBzaXplb2YobmV3WzBdKSk7CisJCW5ld1swXSA9IChjaGFyKikgImFzaCI7CisJCW5ld1sxXSA9IGNtZDsKKwkJYXAgPSBuZXcgKyAyOworCQl3aGlsZSAoKCphcCsrID0gKisrYXJndikgIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQljbWQgPSAoY2hhciopIGJiX2J1c3lib3hfZXhlY19wYXRoOworCQlhcmd2ID0gbmV3OworCQlnb3RvIHJlcGVhdDsKKwl9Cit9CisKKy8qCisgKiBFeGVjIGEgcHJvZ3JhbS4gIE5ldmVyIHJldHVybnMuICBJZiB5b3UgY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IG1heQorICogaGF2ZSB0byBjaGFuZ2UgdGhlIGZpbmRfY29tbWFuZCByb3V0aW5lIGFzIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkIHNoZWxsZXhlYyhjaGFyICoqLCBjb25zdCBjaGFyICosIGludCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZAorc2hlbGxleGVjKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwYXRoLCBpbnQgaWR4KQoreworCWNoYXIgKmNtZG5hbWU7CisJaW50IGU7CisJY2hhciAqKmVudnA7CisJaW50IGV4ZXJybm87CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorCWludCBhcHBsZXRfbm8gPSAtMTsKKyNlbmRpZgorCisJY2xlYXJyZWRpcigvKmRyb3A6Ki8gMSk7CisJZW52cCA9IGxpc3R2YXJzKFZFWFBPUlQsIFZVTlNFVCwgLyplbmQ6Ki8gTlVMTCk7CisJaWYgKHN0cmNocihhcmd2WzBdLCAnLycpICE9IE5VTEwKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FCisJIHx8IChhcHBsZXRfbm8gPSBmaW5kX2FwcGxldF9ieV9uYW1lKGFyZ3ZbMF0pKSA+PSAwCisjZW5kaWYKKwkpIHsKKwkJdHJ5ZXhlYyhJRl9GRUFUVVJFX1NIX1NUQU5EQUxPTkUoYXBwbGV0X25vLCkgYXJndlswXSwgYXJndiwgZW52cCk7CisJCWUgPSBlcnJubzsKKwl9IGVsc2UgeworCQllID0gRU5PRU5UOworCQl3aGlsZSAoKGNtZG5hbWUgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIGFyZ3ZbMF0pKSAhPSBOVUxMKSB7CisJCQlpZiAoLS1pZHggPCAwICYmIHBhdGhvcHQgPT0gTlVMTCkgeworCQkJCXRyeWV4ZWMoSUZfRkVBVFVSRV9TSF9TVEFOREFMT05FKC0xLCkgY21kbmFtZSwgYXJndiwgZW52cCk7CisJCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKQorCQkJCQllID0gZXJybm87CisJCQl9CisJCQlzdHVuYWxsb2MoY21kbmFtZSk7CisJCX0KKwl9CisKKwkvKiBNYXAgdG8gUE9TSVggZXJyb3JzICovCisJc3dpdGNoIChlKSB7CisJY2FzZSBFQUNDRVM6CisJCWV4ZXJybm8gPSAxMjY7CisJCWJyZWFrOworCWNhc2UgRU5PRU5UOgorCQlleGVycm5vID0gMTI3OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlleGVycm5vID0gMjsKKwkJYnJlYWs7CisJfQorCWV4aXRzdGF0dXMgPSBleGVycm5vOworCVRSQUNFKCgic2hlbGxleGVjIGZhaWxlZCBmb3IgJXMsIGVycm5vICVkLCBzdXBwcmVzc19pbnQgJWRcbiIsCisJCWFyZ3ZbMF0sIGUsIHN1cHByZXNzX2ludCkpOworCWFzaF9tc2dfYW5kX3JhaXNlKEVYRVhFQywgIiVzOiAlcyIsIGFyZ3ZbMF0sIGVycm1zZyhlLCAibm90IGZvdW5kIikpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQKK3ByaW50ZW50cnkoc3RydWN0IHRibGVudHJ5ICpjbWRwKQoreworCWludCBpZHg7CisJY29uc3QgY2hhciAqcGF0aDsKKwljaGFyICpuYW1lOworCisJaWR4ID0gY21kcC0+cGFyYW0uaW5kZXg7CisJcGF0aCA9IHBhdGh2YWwoKTsKKwlkbyB7CisJCW5hbWUgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIGNtZHAtPmNtZG5hbWUpOworCQlzdHVuYWxsb2MobmFtZSk7CisJfSB3aGlsZSAoLS1pZHggPj0gMCk7CisJb3V0MWZtdCgiJXMlc1xuIiwgbmFtZSwgKGNtZHAtPnJlaGFzaCA/ICIqIiA6IG51bGxzdHIpKTsKK30KKworLyoKKyAqIENsZWFyIG91dCBjb21tYW5kIGVudHJpZXMuICBUaGUgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBmaXJzdCBlbnRyeSBpbgorICogUEFUSCB3aGljaCBoYXMgY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQKK2NsZWFyY21kZW50cnkoaW50IGZpcnN0Y2hhbmdlKQoreworCXN0cnVjdCB0YmxlbnRyeSAqKnRibHA7CisJc3RydWN0IHRibGVudHJ5ICoqcHA7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCisJSU5UX09GRjsKKwlmb3IgKHRibHAgPSBjbWR0YWJsZTsgdGJscCA8ICZjbWR0YWJsZVtDTURUQUJMRVNJWkVdOyB0YmxwKyspIHsKKwkJcHAgPSB0YmxwOworCQl3aGlsZSAoKGNtZHAgPSAqcHApICE9IE5VTEwpIHsKKwkJCWlmICgoY21kcC0+Y21kdHlwZSA9PSBDTUROT1JNQUwgJiYKKwkJCSAgICAgY21kcC0+cGFyYW0uaW5kZXggPj0gZmlyc3RjaGFuZ2UpCisJCQkgfHwgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTiAmJgorCQkJICAgICBidWlsdGlubG9jID49IGZpcnN0Y2hhbmdlKQorCQkJKSB7CisJCQkJKnBwID0gY21kcC0+bmV4dDsKKwkJCQlmcmVlKGNtZHApOworCQkJfSBlbHNlIHsKKwkJCQlwcCA9ICZjbWRwLT5uZXh0OworCQkJfQorCQl9CisJfQorCUlOVF9PTjsKK30KKworLyoKKyAqIExvY2F0ZSBhIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgaGFzaCB0YWJsZS4gIElmICJhZGQiIGlzIG5vbnplcm8sCisgKiBhZGQgdGhlIGNvbW1hbmQgdG8gdGhlIHRhYmxlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuICBUaGUKKyAqIHZhcmlhYmxlICJsYXN0Y21kZW50cnkiIGlzIHNldCB0byBwb2ludCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbGluaworICogcG9pbnRpbmcgdG8gdGhlIGVudHJ5LCBzbyB0aGF0IGRlbGV0ZV9jbWRfZW50cnkgY2FuIGRlbGV0ZSB0aGUKKyAqIGVudHJ5LgorICoKKyAqIEludGVycnVwdHMgbXVzdCBiZSBvZmYgaWYgY2FsbGVkIHdpdGggYWRkICE9IDAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGJsZW50cnkgKipsYXN0Y21kZW50cnk7CisKK3N0YXRpYyBzdHJ1Y3QgdGJsZW50cnkgKgorY21kbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIGludCBhZGQpCit7CisJdW5zaWduZWQgaW50IGhhc2h2YWw7CisJY29uc3QgY2hhciAqcDsKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisJc3RydWN0IHRibGVudHJ5ICoqcHA7CisKKwlwID0gbmFtZTsKKwloYXNodmFsID0gKHVuc2lnbmVkIGNoYXIpKnAgPDwgNDsKKwl3aGlsZSAoKnApCisJCWhhc2h2YWwgKz0gKHVuc2lnbmVkIGNoYXIpKnArKzsKKwloYXNodmFsICY9IDB4N0ZGRjsKKwlwcCA9ICZjbWR0YWJsZVtoYXNodmFsICUgQ01EVEFCTEVTSVpFXTsKKwlmb3IgKGNtZHAgPSAqcHA7IGNtZHA7IGNtZHAgPSBjbWRwLT5uZXh0KSB7CisJCWlmIChzdHJjbXAoY21kcC0+Y21kbmFtZSwgbmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCQlwcCA9ICZjbWRwLT5uZXh0OworCX0KKwlpZiAoYWRkICYmIGNtZHAgPT0gTlVMTCkgeworCQljbWRwID0gKnBwID0gY2t6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YmxlbnRyeSkKKwkJCQkrIHN0cmxlbihuYW1lKQorCQkJCS8qICsgMSAtIGFscmVhZHkgZG9uZSBiZWNhdXNlCisJCQkJICogdGJsZW50cnk6OmNtZG5hbWUgaXMgY2hhclsxXSAqLyk7CisJCS8qY21kcC0+bmV4dCA9IE5VTEw7IC0gY2t6YWxsb2MgZGlkIGl0ICovCisJCWNtZHAtPmNtZHR5cGUgPSBDTURVTktOT1dOOworCQlzdHJjcHkoY21kcC0+Y21kbmFtZSwgbmFtZSk7CisJfQorCWxhc3RjbWRlbnRyeSA9IHBwOworCXJldHVybiBjbWRwOworfQorCisvKgorICogRGVsZXRlIHRoZSBjb21tYW5kIGVudHJ5IHJldHVybmVkIG9uIHRoZSBsYXN0IGxvb2t1cC4KKyAqLworc3RhdGljIHZvaWQKK2RlbGV0ZV9jbWRfZW50cnkodm9pZCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisKKwlJTlRfT0ZGOworCWNtZHAgPSAqbGFzdGNtZGVudHJ5OworCSpsYXN0Y21kZW50cnkgPSBjbWRwLT5uZXh0OworCWlmIChjbWRwLT5jbWR0eXBlID09IENNREZVTkNUSU9OKQorCQlmcmVlZnVuYyhjbWRwLT5wYXJhbS5mdW5jKTsKKwlmcmVlKGNtZHApOworCUlOVF9PTjsKK30KKworLyoKKyAqIEFkZCBhIG5ldyBjb21tYW5kIGVudHJ5LCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIGNvbW1hbmQgZW50cnkgZm9yCisgKiB0aGUgc2FtZSBuYW1lIC0gZXhjZXB0IHNwZWNpYWwgYnVpbHRpbnMuCisgKi8KK3N0YXRpYyB2b2lkCithZGRjbWRlbnRyeShjaGFyICpuYW1lLCBzdHJ1Y3QgY21kZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMSk7CisJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ERlVOQ1RJT04pIHsKKwkJZnJlZWZ1bmMoY21kcC0+cGFyYW0uZnVuYyk7CisJfQorCWNtZHAtPmNtZHR5cGUgPSBlbnRyeS0+Y21kdHlwZTsKKwljbWRwLT5wYXJhbSA9IGVudHJ5LT51OworCWNtZHAtPnJlaGFzaCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitoYXNoY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB0YmxlbnRyeSAqKnBwOworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKwlpbnQgYzsKKwlzdHJ1Y3QgY21kZW50cnkgZW50cnk7CisJY2hhciAqbmFtZTsKKworCWlmIChuZXh0b3B0KCJyIikgIT0gJ1wwJykgeworCQljbGVhcmNtZGVudHJ5KDApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKmFyZ3B0ciA9PSBOVUxMKSB7CisJCWZvciAocHAgPSBjbWR0YWJsZTsgcHAgPCAmY21kdGFibGVbQ01EVEFCTEVTSVpFXTsgcHArKykgeworCQkJZm9yIChjbWRwID0gKnBwOyBjbWRwOyBjbWRwID0gY21kcC0+bmV4dCkgeworCQkJCWlmIChjbWRwLT5jbWR0eXBlID09IENNRE5PUk1BTCkKKwkJCQkJcHJpbnRlbnRyeShjbWRwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwljID0gMDsKKwl3aGlsZSAoKG5hbWUgPSAqYXJncHRyKSAhPSBOVUxMKSB7CisJCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMCk7CisJCWlmIChjbWRwICE9IE5VTEwKKwkJICYmIChjbWRwLT5jbWR0eXBlID09IENNRE5PUk1BTAorCQkgICAgIHx8IChjbWRwLT5jbWR0eXBlID09IENNREJVSUxUSU4gJiYgYnVpbHRpbmxvYyA+PSAwKSkKKwkJKSB7CisJCQlkZWxldGVfY21kX2VudHJ5KCk7CisJCX0KKwkJZmluZF9jb21tYW5kKG5hbWUsICZlbnRyeSwgRE9fRVJSLCBwYXRodmFsKCkpOworCQlpZiAoZW50cnkuY21kdHlwZSA9PSBDTURVTktOT1dOKQorCQkJYyA9IDE7CisJCWFyZ3B0cisrOworCX0KKwlyZXR1cm4gYzsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGEgY2QgaXMgZG9uZS4gIE1hcmtzIGFsbCBjb21tYW5kcyBzbyB0aGUgbmV4dCB0aW1lIHRoZXkKKyAqIGFyZSBleGVjdXRlZCB0aGV5IHdpbGwgYmUgcmVoYXNoZWQuCisgKi8KK3N0YXRpYyB2b2lkCitoYXNoY2Qodm9pZCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKipwcDsKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisKKwlmb3IgKHBwID0gY21kdGFibGU7IHBwIDwgJmNtZHRhYmxlW0NNRFRBQkxFU0laRV07IHBwKyspIHsKKwkJZm9yIChjbWRwID0gKnBwOyBjbWRwOyBjbWRwID0gY21kcC0+bmV4dCkgeworCQkJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ETk9STUFMCisJCQkgfHwgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTgorCQkJICAgICAmJiAhSVNfQlVJTFRJTl9SRUdVTEFSKGNtZHAtPnBhcmFtLmNtZCkKKwkJCSAgICAgJiYgYnVpbHRpbmxvYyA+IDApCisJCQkpIHsKKwkJCQljbWRwLT5yZWhhc2ggPSAxOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogRml4IGNvbW1hbmQgaGFzaCB0YWJsZSB3aGVuIFBBVEggY2hhbmdlZC4KKyAqIENhbGxlZCBiZWZvcmUgUEFUSCBpcyBjaGFuZ2VkLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuZXcgdmFsdWUgb2YgUEFUSDsKKyAqIHBhdGh2YWwoKSBzdGlsbCByZXR1cm5zIHRoZSBvbGQgdmFsdWUgYXQgdGhpcyBwb2ludC4KKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZXBhdGgoY29uc3QgY2hhciAqbmV3KQoreworCWNvbnN0IGNoYXIgKm9sZDsKKwlpbnQgZmlyc3RjaGFuZ2U7CisJaW50IGlkeDsKKwlpbnQgaWR4X2JsdGluOworCisJb2xkID0gcGF0aHZhbCgpOworCWZpcnN0Y2hhbmdlID0gOTk5OTsgICAgIC8qIGFzc3VtZSBubyBjaGFuZ2UgKi8KKwlpZHggPSAwOworCWlkeF9ibHRpbiA9IC0xOworCWZvciAoOzspIHsKKwkJaWYgKCpvbGQgIT0gKm5ldykgeworCQkJZmlyc3RjaGFuZ2UgPSBpZHg7CisJCQlpZiAoKCpvbGQgPT0gJ1wwJyAmJiAqbmV3ID09ICc6JykKKwkJCSB8fCAoKm9sZCA9PSAnOicgJiYgKm5ldyA9PSAnXDAnKQorCQkJKSB7CisJCQkJZmlyc3RjaGFuZ2UrKzsKKwkJCX0KKwkJCW9sZCA9IG5ldzsgICAgICAvKiBpZ25vcmUgc3Vic2VxdWVudCBkaWZmZXJlbmNlcyAqLworCQl9CisJCWlmICgqbmV3ID09ICdcMCcpCisJCQlicmVhazsKKwkJaWYgKCpuZXcgPT0gJyUnICYmIGlkeF9ibHRpbiA8IDAgJiYgcHJlZml4KG5ldyArIDEsICJidWlsdGluIikpCisJCQlpZHhfYmx0aW4gPSBpZHg7CisJCWlmICgqbmV3ID09ICc6JykKKwkJCWlkeCsrOworCQluZXcrKzsKKwkJb2xkKys7CisJfQorCWlmIChidWlsdGlubG9jIDwgMCAmJiBpZHhfYmx0aW4gPj0gMCkKKwkJYnVpbHRpbmxvYyA9IGlkeF9ibHRpbjsgICAgICAgICAgICAgLyogemFwIGJ1aWx0aW5zICovCisJaWYgKGJ1aWx0aW5sb2MgPj0gMCAmJiBpZHhfYmx0aW4gPCAwKQorCQlmaXJzdGNoYW5nZSA9IDA7CisJY2xlYXJjbWRlbnRyeShmaXJzdGNoYW5nZSk7CisJYnVpbHRpbmxvYyA9IGlkeF9ibHRpbjsKK30KKworI2RlZmluZSBURU9GIDAKKyNkZWZpbmUgVE5MIDEKKyNkZWZpbmUgVFJFRElSIDIKKyNkZWZpbmUgVFdPUkQgMworI2RlZmluZSBUU0VNSSA0CisjZGVmaW5lIFRCQUNLR05EIDUKKyNkZWZpbmUgVEFORCA2CisjZGVmaW5lIFRPUiA3CisjZGVmaW5lIFRQSVBFIDgKKyNkZWZpbmUgVExQIDkKKyNkZWZpbmUgVFJQIDEwCisjZGVmaW5lIFRFTkRDQVNFIDExCisjZGVmaW5lIFRFTkRCUVVPVEUgMTIKKyNkZWZpbmUgVE5PVCAxMworI2RlZmluZSBUQ0FTRSAxNAorI2RlZmluZSBURE8gMTUKKyNkZWZpbmUgVERPTkUgMTYKKyNkZWZpbmUgVEVMSUYgMTcKKyNkZWZpbmUgVEVMU0UgMTgKKyNkZWZpbmUgVEVTQUMgMTkKKyNkZWZpbmUgVEZJIDIwCisjZGVmaW5lIFRGT1IgMjEKKyNkZWZpbmUgVElGIDIyCisjZGVmaW5lIFRJTiAyMworI2RlZmluZSBUVEhFTiAyNAorI2RlZmluZSBUVU5USUwgMjUKKyNkZWZpbmUgVFdISUxFIDI2CisjZGVmaW5lIFRCRUdJTiAyNworI2RlZmluZSBURU5EIDI4Cit0eXBlZGVmIHNtYWxsaW50IHRva2VuX2lkX3Q7CisKKy8qIGZpcnN0IGNoYXIgaXMgaW5kaWNhdGluZyB3aGljaCB0b2tlbnMgbWFyayB0aGUgZW5kIG9mIGEgbGlzdCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRva25hbWVfYXJyYXlbXSA9IHsKKwkiXDFlbmQgb2YgZmlsZSIsCisJIlwwbmV3bGluZSIsCisJIlwwcmVkaXJlY3Rpb24iLAorCSJcMHdvcmQiLAorCSJcMDsiLAorCSJcMCYiLAorCSJcMCYmIiwKKwkiXDB8fCIsCisJIlwwfCIsCisJIlwwKCIsCisJIlwxKSIsCisJIlwxOzsiLAorCSJcMWAiLAorI2RlZmluZSBLV0RPRkZTRVQgMTMKKwkvKiB0aGUgZm9sbG93aW5nIGFyZSBrZXl3b3JkcyAqLworCSJcMCEiLAorCSJcMGNhc2UiLAorCSJcMWRvIiwKKwkiXDFkb25lIiwKKwkiXDFlbGlmIiwKKwkiXDFlbHNlIiwKKwkiXDFlc2FjIiwKKwkiXDFmaSIsCisJIlwwZm9yIiwKKwkiXDBpZiIsCisJIlwwaW4iLAorCSJcMXRoZW4iLAorCSJcMHVudGlsIiwKKwkiXDB3aGlsZSIsCisJIlwweyIsCisJIlwxfSIsCit9OworCisvKiBXcmFwcGVyIGFyb3VuZCBzdHJjbXAgZm9yIHFzb3J0L2JzZWFyY2gvLi4uICovCitzdGF0aWMgaW50Citwc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIHN0cmNtcCgoY2hhciopIGEsICgqKGNoYXIqKikgYikgKyAxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0ICoKK2ZpbmRrd2QoY29uc3QgY2hhciAqcykKK3sKKwlyZXR1cm4gYnNlYXJjaChzLCB0b2tuYW1lX2FycmF5ICsgS1dET0ZGU0VULAorCQkJQVJSQVlfU0laRSh0b2tuYW1lX2FycmF5KSAtIEtXRE9GRlNFVCwKKwkJCXNpemVvZih0b2tuYW1lX2FycmF5WzBdKSwgcHN0cmNtcCk7Cit9CisKKy8qCisgKiBMb2NhdGUgYW5kIHByaW50IHdoYXQgYSB3b3JkIGlzLi4uCisgKi8KK3N0YXRpYyBpbnQKK2Rlc2NyaWJlX2NvbW1hbmQoY2hhciAqY29tbWFuZCwgaW50IGRlc2NyaWJlX2NvbW1hbmRfdmVyYm9zZSkKK3sKKwlzdHJ1Y3QgY21kZW50cnkgZW50cnk7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwljb25zdCBzdHJ1Y3QgYWxpYXMgKmFwOworI2VuZGlmCisJY29uc3QgY2hhciAqcGF0aCA9IHBhdGh2YWwoKTsKKworCWlmIChkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UpIHsKKwkJb3V0MXN0cihjb21tYW5kKTsKKwl9CisKKwkvKiBGaXJzdCBsb29rIGF0IHRoZSBrZXl3b3JkcyAqLworCWlmIChmaW5ka3dkKGNvbW1hbmQpKSB7CisJCW91dDFzdHIoZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlID8gIiBpcyBhIHNoZWxsIGtleXdvcmQiIDogY29tbWFuZCk7CisJCWdvdG8gb3V0OworCX0KKworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwkvKiBUaGVuIGxvb2sgYXQgdGhlIGFsaWFzZXMgKi8KKwlhcCA9IGxvb2t1cGFsaWFzKGNvbW1hbmQsIDApOworCWlmIChhcCAhPSBOVUxMKSB7CisJCWlmICghZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKSB7CisJCQlvdXQxc3RyKCJhbGlhcyAiKTsKKwkJCXByaW50YWxpYXMoYXApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJb3V0MWZtdCgiIGlzIGFuIGFsaWFzIGZvciAlcyIsIGFwLT52YWwpOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKwkvKiBUaGVuIGNoZWNrIGlmIGl0IGlzIGEgdHJhY2tlZCBhbGlhcyAqLworCWNtZHAgPSBjbWRsb29rdXAoY29tbWFuZCwgMCk7CisJaWYgKGNtZHAgIT0gTlVMTCkgeworCQllbnRyeS5jbWR0eXBlID0gY21kcC0+Y21kdHlwZTsKKwkJZW50cnkudSA9IGNtZHAtPnBhcmFtOworCX0gZWxzZSB7CisJCS8qIEZpbmFsbHkgdXNlIGJydXRlIGZvcmNlICovCisJCWZpbmRfY29tbWFuZChjb21tYW5kLCAmZW50cnksIERPX0FCUywgcGF0aCk7CisJfQorCisJc3dpdGNoIChlbnRyeS5jbWR0eXBlKSB7CisJY2FzZSBDTUROT1JNQUw6IHsKKwkJaW50IGogPSBlbnRyeS51LmluZGV4OworCQljaGFyICpwOworCQlpZiAoaiA8IDApIHsKKwkJCXAgPSBjb21tYW5kOworCQl9IGVsc2UgeworCQkJZG8geworCQkJCXAgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIGNvbW1hbmQpOworCQkJCXN0dW5hbGxvYyhwKTsKKwkJCX0gd2hpbGUgKC0taiA+PSAwKTsKKwkJfQorCQlpZiAoZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKSB7CisJCQlvdXQxZm10KCIgaXMlcyAlcyIsCisJCQkJKGNtZHAgPyAiIGEgdHJhY2tlZCBhbGlhcyBmb3IiIDogbnVsbHN0ciksIHAKKwkJCSk7CisJCX0gZWxzZSB7CisJCQlvdXQxc3RyKHApOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgQ01ERlVOQ1RJT046CisJCWlmIChkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UpIHsKKwkJCW91dDFzdHIoIiBpcyBhIHNoZWxsIGZ1bmN0aW9uIik7CisJCX0gZWxzZSB7CisJCQlvdXQxc3RyKGNvbW1hbmQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDTURCVUlMVElOOgorCQlpZiAoZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKSB7CisJCQlvdXQxZm10KCIgaXMgYSAlc3NoZWxsIGJ1aWx0aW4iLAorCQkJCUlTX0JVSUxUSU5fU1BFQ0lBTChlbnRyeS51LmNtZCkgPworCQkJCQkic3BlY2lhbCAiIDogbnVsbHN0cgorCQkJKTsKKwkJfSBlbHNlIHsKKwkJCW91dDFzdHIoY29tbWFuZCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKSB7CisJCQlvdXQxc3RyKCI6IG5vdCBmb3VuZFxuIik7CisJCX0KKwkJcmV0dXJuIDEyNzsKKwl9Cisgb3V0OgorCW91dDFzdHIoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit0eXBlY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGkgPSAxOworCWludCBlcnIgPSAwOworCWludCB2ZXJib3NlID0gMTsKKworCS8qIHR5cGUgLXAgLi4uID8gKHdlIGRvbid0IGJvdGhlciBjaGVja2luZyBmb3IgJ3AnKSAqLworCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCWkrKzsKKwkJdmVyYm9zZSA9IDA7CisJfQorCXdoaWxlIChhcmd2W2ldKSB7CisJCWVyciB8PSBkZXNjcmliZV9jb21tYW5kKGFyZ3ZbaSsrXSwgdmVyYm9zZSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKyNpZiBFTkFCTEVfQVNIX0NNRENNRAorc3RhdGljIGludCBGQVNUX0ZVTkMKK2NvbW1hbmRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJaW50IGM7CisJZW51bSB7CisJCVZFUklGWV9CUklFRiA9IDEsCisJCVZFUklGWV9WRVJCT1NFID0gMiwKKwl9IHZlcmlmeSA9IDA7CisKKwl3aGlsZSAoKGMgPSBuZXh0b3B0KCJwdlYiKSkgIT0gJ1wwJykKKwkJaWYgKGMgPT0gJ1YnKQorCQkJdmVyaWZ5IHw9IFZFUklGWV9WRVJCT1NFOworCQllbHNlIGlmIChjID09ICd2JykKKwkJCXZlcmlmeSB8PSBWRVJJRllfQlJJRUY7CisjaWYgREVCVUcKKwkJZWxzZSBpZiAoYyAhPSAncCcpCisJCQlhYm9ydCgpOworI2VuZGlmCisJLyogTWltaWMgYmFzaDoganVzdCAiY29tbWFuZCAtdiIgZG9lc24ndCBjb21wbGFpbiwgaXQncyBhIG5vcCAqLworCWlmICh2ZXJpZnkgJiYgKCphcmdwdHIgIT0gTlVMTCkpIHsKKwkJcmV0dXJuIGRlc2NyaWJlX2NvbW1hbmQoKmFyZ3B0ciwgdmVyaWZ5IC0gVkVSSUZZX0JSSUVGKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PSBldmFsLmMgKi8KKworc3RhdGljIGludCBmdW5jYmxvY2tzaXplOyAgICAgICAvKiBzaXplIG9mIHN0cnVjdHVyZXMgaW4gZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgZnVuY3N0cmluZ3NpemU7ICAgICAgLyogc2l6ZSBvZiBzdHJpbmdzIGluIG5vZGUgKi8KK3N0YXRpYyB2b2lkICpmdW5jYmxvY2s7ICAgICAgICAgLyogYmxvY2sgdG8gYWxsb2NhdGUgZnVuY3Rpb24gZnJvbSAqLworc3RhdGljIGNoYXIgKmZ1bmNzdHJpbmc7ICAgICAgICAvKiBibG9jayB0byBhbGxvY2F0ZSBzdHJpbmdzIGZyb20gKi8KKworLyogZmxhZ3MgaW4gYXJndW1lbnQgdG8gZXZhbHRyZWUgKi8KKyNkZWZpbmUgRVZfRVhJVCAgICAwMSAgICAgICAgICAgLyogZXhpdCBhZnRlciBldmFsdWF0aW5nIHRyZWUgKi8KKyNkZWZpbmUgRVZfVEVTVEVEICAwMiAgICAgICAgICAgLyogZXhpdCBzdGF0dXMgaXMgY2hlY2tlZDsgaWdub3JlIC1lIGZsYWcgKi8KKyNkZWZpbmUgRVZfQkFDS0NNRCAwNCAgICAgICAgICAgLyogY29tbWFuZCBleGVjdXRpbmcgd2l0aGluIGJhY2sgcXVvdGVzICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IG5vZGVzaXplW05fTlVNQkVSXSA9IHsKKwlbTkNNRCAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmNtZCkpLAorCVtOUElQRSAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBucGlwZSkpLAorCVtOUkVESVIgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBucmVkaXIpKSwKKwlbTkJBQ0tHTkQgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbnJlZGlyKSksCisJW05TVUJTSEVMTF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5yZWRpcikpLAorCVtOQU5EICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSksCisJW05PUiAgICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5iaW5hcnkpKSwKKwlbTlNFTUkgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpLAorCVtOSUYgICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuaWYpKSwKKwlbTldISUxFICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpLAorCVtOVU5USUwgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSksCisJW05GT1IgICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5mb3IpKSwKKwlbTkNBU0UgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmNhc2UpKSwKKwlbTkNMSVNUICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmNsaXN0KSksCisJW05ERUZVTiAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5hcmcpKSwKKwlbTkFSRyAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmFyZykpLAorCVtOVE8gICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwlbTlRPMiAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmZpbGUpKSwKKyNlbmRpZgorCVtOQ0xPQkJFUiBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorCVtORlJPTSAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorCVtORlJPTVRPICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorCVtOQVBQRU5EICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorCVtOVE9GRCAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZHVwKSksCisJW05GUk9NRkQgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5kdXApKSwKKwlbTkhFUkUgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmhlcmUpKSwKKwlbTlhIRVJFICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmhlcmUpKSwKKwlbTk5PVCAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3Qgbm5vdCkpLAorfTsKKworc3RhdGljIHZvaWQgY2FsY3NpemUodW5pb24gbm9kZSAqbik7CisKK3N0YXRpYyB2b2lkCitzaXplbm9kZWxpc3Qoc3RydWN0IG5vZGVsaXN0ICpscCkKK3sKKwl3aGlsZSAobHApIHsKKwkJZnVuY2Jsb2Nrc2l6ZSArPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5vZGVsaXN0KSk7CisJCWNhbGNzaXplKGxwLT5uKTsKKwkJbHAgPSBscC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjYWxjc2l6ZSh1bmlvbiBub2RlICpuKQoreworCWlmIChuID09IE5VTEwpCisJCXJldHVybjsKKwlmdW5jYmxvY2tzaXplICs9IG5vZGVzaXplW24tPnR5cGVdOworCXN3aXRjaCAobi0+dHlwZSkgeworCWNhc2UgTkNNRDoKKwkJY2FsY3NpemUobi0+bmNtZC5yZWRpcmVjdCk7CisJCWNhbGNzaXplKG4tPm5jbWQuYXJncyk7CisJCWNhbGNzaXplKG4tPm5jbWQuYXNzaWduKTsKKwkJYnJlYWs7CisJY2FzZSBOUElQRToKKwkJc2l6ZW5vZGVsaXN0KG4tPm5waXBlLmNtZGxpc3QpOworCQlicmVhazsKKwljYXNlIE5SRURJUjoKKwljYXNlIE5CQUNLR05EOgorCWNhc2UgTlNVQlNIRUxMOgorCQljYWxjc2l6ZShuLT5ucmVkaXIucmVkaXJlY3QpOworCQljYWxjc2l6ZShuLT5ucmVkaXIubik7CisJCWJyZWFrOworCWNhc2UgTkFORDoKKwljYXNlIE5PUjoKKwljYXNlIE5TRU1JOgorCWNhc2UgTldISUxFOgorCWNhc2UgTlVOVElMOgorCQljYWxjc2l6ZShuLT5uYmluYXJ5LmNoMik7CisJCWNhbGNzaXplKG4tPm5iaW5hcnkuY2gxKTsKKwkJYnJlYWs7CisJY2FzZSBOSUY6CisJCWNhbGNzaXplKG4tPm5pZi5lbHNlcGFydCk7CisJCWNhbGNzaXplKG4tPm5pZi5pZnBhcnQpOworCQljYWxjc2l6ZShuLT5uaWYudGVzdCk7CisJCWJyZWFrOworCWNhc2UgTkZPUjoKKwkJZnVuY3N0cmluZ3NpemUgKz0gc3RybGVuKG4tPm5mb3IudmFyKSArIDE7CisJCWNhbGNzaXplKG4tPm5mb3IuYm9keSk7CisJCWNhbGNzaXplKG4tPm5mb3IuYXJncyk7CisJCWJyZWFrOworCWNhc2UgTkNBU0U6CisJCWNhbGNzaXplKG4tPm5jYXNlLmNhc2VzKTsKKwkJY2FsY3NpemUobi0+bmNhc2UuZXhwcik7CisJCWJyZWFrOworCWNhc2UgTkNMSVNUOgorCQljYWxjc2l6ZShuLT5uY2xpc3QuYm9keSk7CisJCWNhbGNzaXplKG4tPm5jbGlzdC5wYXR0ZXJuKTsKKwkJY2FsY3NpemUobi0+bmNsaXN0Lm5leHQpOworCQlicmVhazsKKwljYXNlIE5ERUZVTjoKKwljYXNlIE5BUkc6CisJCXNpemVub2RlbGlzdChuLT5uYXJnLmJhY2txdW90ZSk7CisJCWZ1bmNzdHJpbmdzaXplICs9IHN0cmxlbihuLT5uYXJnLnRleHQpICsgMTsKKwkJY2FsY3NpemUobi0+bmFyZy5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOVE86CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCWNhc2UgTlRPMjoKKyNlbmRpZgorCWNhc2UgTkNMT0JCRVI6CisJY2FzZSBORlJPTToKKwljYXNlIE5GUk9NVE86CisJY2FzZSBOQVBQRU5EOgorCQljYWxjc2l6ZShuLT5uZmlsZS5mbmFtZSk7CisJCWNhbGNzaXplKG4tPm5maWxlLm5leHQpOworCQlicmVhazsKKwljYXNlIE5UT0ZEOgorCWNhc2UgTkZST01GRDoKKwkJY2FsY3NpemUobi0+bmR1cC52bmFtZSk7CisJCWNhbGNzaXplKG4tPm5kdXAubmV4dCk7CisJYnJlYWs7CisJY2FzZSBOSEVSRToKKwljYXNlIE5YSEVSRToKKwkJY2FsY3NpemUobi0+bmhlcmUuZG9jKTsKKwkJY2FsY3NpemUobi0+bmhlcmUubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTk5PVDoKKwkJY2FsY3NpemUobi0+bm5vdC5jb20pOworCQlicmVhazsKKwl9OworfQorCitzdGF0aWMgY2hhciAqCitub2RlY2tzdHJkdXAoY2hhciAqcykKK3sKKwljaGFyICpydG4gPSBmdW5jc3RyaW5nOworCisJc3RyY3B5KGZ1bmNzdHJpbmcsIHMpOworCWZ1bmNzdHJpbmcgKz0gc3RybGVuKHMpICsgMTsKKwlyZXR1cm4gcnRuOworfQorCitzdGF0aWMgdW5pb24gbm9kZSAqY29weW5vZGUodW5pb24gbm9kZSAqKTsKKworc3RhdGljIHN0cnVjdCBub2RlbGlzdCAqCitjb3B5bm9kZWxpc3Qoc3RydWN0IG5vZGVsaXN0ICpscCkKK3sKKwlzdHJ1Y3Qgbm9kZWxpc3QgKnN0YXJ0OworCXN0cnVjdCBub2RlbGlzdCAqKmxwcDsKKworCWxwcCA9ICZzdGFydDsKKwl3aGlsZSAobHApIHsKKwkJKmxwcCA9IGZ1bmNibG9jazsKKwkJZnVuY2Jsb2NrID0gKGNoYXIgKikgZnVuY2Jsb2NrICsgU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBub2RlbGlzdCkpOworCQkoKmxwcCktPm4gPSBjb3B5bm9kZShscC0+bik7CisJCWxwID0gbHAtPm5leHQ7CisJCWxwcCA9ICYoKmxwcCktPm5leHQ7CisJfQorCSpscHAgPSBOVUxMOworCXJldHVybiBzdGFydDsKK30KKworc3RhdGljIHVuaW9uIG5vZGUgKgorY29weW5vZGUodW5pb24gbm9kZSAqbikKK3sKKwl1bmlvbiBub2RlICpuZXc7CisKKwlpZiAobiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwluZXcgPSBmdW5jYmxvY2s7CisJZnVuY2Jsb2NrID0gKGNoYXIgKikgZnVuY2Jsb2NrICsgbm9kZXNpemVbbi0+dHlwZV07CisKKwlzd2l0Y2ggKG4tPnR5cGUpIHsKKwljYXNlIE5DTUQ6CisJCW5ldy0+bmNtZC5yZWRpcmVjdCA9IGNvcHlub2RlKG4tPm5jbWQucmVkaXJlY3QpOworCQluZXctPm5jbWQuYXJncyA9IGNvcHlub2RlKG4tPm5jbWQuYXJncyk7CisJCW5ldy0+bmNtZC5hc3NpZ24gPSBjb3B5bm9kZShuLT5uY21kLmFzc2lnbik7CisJCWJyZWFrOworCWNhc2UgTlBJUEU6CisJCW5ldy0+bnBpcGUuY21kbGlzdCA9IGNvcHlub2RlbGlzdChuLT5ucGlwZS5jbWRsaXN0KTsKKwkJbmV3LT5ucGlwZS5waXBlX2JhY2tnbmQgPSBuLT5ucGlwZS5waXBlX2JhY2tnbmQ7CisJCWJyZWFrOworCWNhc2UgTlJFRElSOgorCWNhc2UgTkJBQ0tHTkQ6CisJY2FzZSBOU1VCU0hFTEw6CisJCW5ldy0+bnJlZGlyLnJlZGlyZWN0ID0gY29weW5vZGUobi0+bnJlZGlyLnJlZGlyZWN0KTsKKwkJbmV3LT5ucmVkaXIubiA9IGNvcHlub2RlKG4tPm5yZWRpci5uKTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EOgorCWNhc2UgTk9SOgorCWNhc2UgTlNFTUk6CisJY2FzZSBOV0hJTEU6CisJY2FzZSBOVU5USUw6CisJCW5ldy0+bmJpbmFyeS5jaDIgPSBjb3B5bm9kZShuLT5uYmluYXJ5LmNoMik7CisJCW5ldy0+bmJpbmFyeS5jaDEgPSBjb3B5bm9kZShuLT5uYmluYXJ5LmNoMSk7CisJCWJyZWFrOworCWNhc2UgTklGOgorCQluZXctPm5pZi5lbHNlcGFydCA9IGNvcHlub2RlKG4tPm5pZi5lbHNlcGFydCk7CisJCW5ldy0+bmlmLmlmcGFydCA9IGNvcHlub2RlKG4tPm5pZi5pZnBhcnQpOworCQluZXctPm5pZi50ZXN0ID0gY29weW5vZGUobi0+bmlmLnRlc3QpOworCQlicmVhazsKKwljYXNlIE5GT1I6CisJCW5ldy0+bmZvci52YXIgPSBub2RlY2tzdHJkdXAobi0+bmZvci52YXIpOworCQluZXctPm5mb3IuYm9keSA9IGNvcHlub2RlKG4tPm5mb3IuYm9keSk7CisJCW5ldy0+bmZvci5hcmdzID0gY29weW5vZGUobi0+bmZvci5hcmdzKTsKKwkJYnJlYWs7CisJY2FzZSBOQ0FTRToKKwkJbmV3LT5uY2FzZS5jYXNlcyA9IGNvcHlub2RlKG4tPm5jYXNlLmNhc2VzKTsKKwkJbmV3LT5uY2FzZS5leHByID0gY29weW5vZGUobi0+bmNhc2UuZXhwcik7CisJCWJyZWFrOworCWNhc2UgTkNMSVNUOgorCQluZXctPm5jbGlzdC5ib2R5ID0gY29weW5vZGUobi0+bmNsaXN0LmJvZHkpOworCQluZXctPm5jbGlzdC5wYXR0ZXJuID0gY29weW5vZGUobi0+bmNsaXN0LnBhdHRlcm4pOworCQluZXctPm5jbGlzdC5uZXh0ID0gY29weW5vZGUobi0+bmNsaXN0Lm5leHQpOworCQlicmVhazsKKwljYXNlIE5ERUZVTjoKKwljYXNlIE5BUkc6CisJCW5ldy0+bmFyZy5iYWNrcXVvdGUgPSBjb3B5bm9kZWxpc3Qobi0+bmFyZy5iYWNrcXVvdGUpOworCQluZXctPm5hcmcudGV4dCA9IG5vZGVja3N0cmR1cChuLT5uYXJnLnRleHQpOworCQluZXctPm5hcmcubmV4dCA9IGNvcHlub2RlKG4tPm5hcmcubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTlRPOgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwljYXNlIE5UTzI6CisjZW5kaWYKKwljYXNlIE5DTE9CQkVSOgorCWNhc2UgTkZST006CisJY2FzZSBORlJPTVRPOgorCWNhc2UgTkFQUEVORDoKKwkJbmV3LT5uZmlsZS5mbmFtZSA9IGNvcHlub2RlKG4tPm5maWxlLmZuYW1lKTsKKwkJbmV3LT5uZmlsZS5mZCA9IG4tPm5maWxlLmZkOworCQluZXctPm5maWxlLm5leHQgPSBjb3B5bm9kZShuLT5uZmlsZS5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOVE9GRDoKKwljYXNlIE5GUk9NRkQ6CisJCW5ldy0+bmR1cC52bmFtZSA9IGNvcHlub2RlKG4tPm5kdXAudm5hbWUpOworCQluZXctPm5kdXAuZHVwZmQgPSBuLT5uZHVwLmR1cGZkOworCQluZXctPm5kdXAuZmQgPSBuLT5uZHVwLmZkOworCQluZXctPm5kdXAubmV4dCA9IGNvcHlub2RlKG4tPm5kdXAubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTkhFUkU6CisJY2FzZSBOWEhFUkU6CisJCW5ldy0+bmhlcmUuZG9jID0gY29weW5vZGUobi0+bmhlcmUuZG9jKTsKKwkJbmV3LT5uaGVyZS5mZCA9IG4tPm5oZXJlLmZkOworCQluZXctPm5oZXJlLm5leHQgPSBjb3B5bm9kZShuLT5uaGVyZS5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOTk9UOgorCQluZXctPm5ub3QuY29tID0gY29weW5vZGUobi0+bm5vdC5jb20pOworCQlicmVhazsKKwl9OworCW5ldy0+dHlwZSA9IG4tPnR5cGU7CisJcmV0dXJuIG5ldzsKK30KKworLyoKKyAqIE1ha2UgYSBjb3B5IG9mIGEgcGFyc2UgdHJlZS4KKyAqLworc3RhdGljIHN0cnVjdCBmdW5jbm9kZSAqCitjb3B5ZnVuYyh1bmlvbiBub2RlICpuKQoreworCXN0cnVjdCBmdW5jbm9kZSAqZjsKKwlzaXplX3QgYmxvY2tzaXplOworCisJZnVuY2Jsb2Nrc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBmdW5jbm9kZSwgbik7CisJZnVuY3N0cmluZ3NpemUgPSAwOworCWNhbGNzaXplKG4pOworCWJsb2Nrc2l6ZSA9IGZ1bmNibG9ja3NpemU7CisJZiA9IGNrbWFsbG9jKGJsb2Nrc2l6ZSArIGZ1bmNzdHJpbmdzaXplKTsKKwlmdW5jYmxvY2sgPSAoY2hhciAqKSBmICsgb2Zmc2V0b2Yoc3RydWN0IGZ1bmNub2RlLCBuKTsKKwlmdW5jc3RyaW5nID0gKGNoYXIgKikgZiArIGJsb2Nrc2l6ZTsKKwljb3B5bm9kZShuKTsKKwlmLT5jb3VudCA9IDA7CisJcmV0dXJuIGY7Cit9CisKKy8qCisgKiBEZWZpbmUgYSBzaGVsbCBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2RlZnVuKGNoYXIgKm5hbWUsIHVuaW9uIG5vZGUgKmZ1bmMpCit7CisJc3RydWN0IGNtZGVudHJ5IGVudHJ5OworCisJSU5UX09GRjsKKwllbnRyeS5jbWR0eXBlID0gQ01ERlVOQ1RJT047CisJZW50cnkudS5mdW5jID0gY29weWZ1bmMoZnVuYyk7CisJYWRkY21kZW50cnkobmFtZSwgJmVudHJ5KTsKKwlJTlRfT047Cit9CisKKy8qIFJlYXNvbnMgZm9yIHNraXBwaW5nIGNvbW1hbmRzIChzZWUgY29tbWVudCBvbiBicmVha2NtZCByb3V0aW5lKSAqLworI2RlZmluZSBTS0lQQlJFQUsgICAgICAoMSA8PCAwKQorI2RlZmluZSBTS0lQQ09OVCAgICAgICAoMSA8PCAxKQorI2RlZmluZSBTS0lQRlVOQyAgICAgICAoMSA8PCAyKQorI2RlZmluZSBTS0lQRklMRSAgICAgICAoMSA8PCAzKQorI2RlZmluZSBTS0lQRVZBTCAgICAgICAoMSA8PCA0KQorc3RhdGljIHNtYWxsaW50IGV2YWxza2lwOyAgICAgICAvKiBzZXQgdG8gU0tJUHh4eCBpZiB3ZSBhcmUgc2tpcHBpbmcgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgc2tpcGNvdW50OyAgICAgICAgICAgLyogbnVtYmVyIG9mIGxldmVscyB0byBza2lwICovCitzdGF0aWMgaW50IGZ1bmNuZXN0OyAgICAgICAgICAgIC8qIGRlcHRoIG9mIGZ1bmN0aW9uIGNhbGxzICovCitzdGF0aWMgaW50IGxvb3BuZXN0OyAgICAgICAgICAgIC8qIGN1cnJlbnQgbG9vcCBuZXN0aW5nIGxldmVsICovCisKKy8qIEZvcndhcmQgZGVjbCB3YXkgb3V0IHRvIHBhcnNpbmcgY29kZSAtIGRvdHJhcCBuZWVkcyBpdCAqLworc3RhdGljIGludCBldmFsc3RyaW5nKGNoYXIgKnMsIGludCBtYXNrKTsKKworLyogQ2FsbGVkIHRvIGV4ZWN1dGUgYSB0cmFwLgorICogU2luZ2xlIGNhbGxzaXRlIC0gYXQgdGhlIGVuZCBvZiBldmFsdHJlZSgpLgorICogSWYgd2UgcmV0dXJuIG5vbi16ZXJvLCBldmFsdHJlZSByYWlzZXMgRVhFWElUIGV4Y2VwdGlvbi4KKyAqCisgKiBQZXJoYXBzIHdlIHNob3VsZCBhdm9pZCBlbnRlcmluZyBuZXcgdHJhcCBoYW5kbGVycworICogd2hpbGUgd2UgYXJlIGV4ZWN1dGluZyBhIHRyYXAgaGFuZGxlci4gW2lzIGl0IGEgVE9ETz9dCisgKi8KK3N0YXRpYyBpbnQKK2RvdHJhcCh2b2lkKQoreworCXVpbnQ4X3QgKmc7CisJaW50IHNpZzsKKwl1aW50OF90IHNhdmVzdGF0dXM7CisKKwlzYXZlc3RhdHVzID0gZXhpdHN0YXR1czsKKwlwZW5kaW5nX3NpZyA9IDA7CisJeGJhcnJpZXIoKTsKKworCVRSQUNFKCgiZG90cmFwIGVudGVyZWRcbiIpKTsKKwlmb3IgKHNpZyA9IDEsIGcgPSBnb3RzaWc7IHNpZyA8IE5TSUc7IHNpZysrLCBnKyspIHsKKwkJaW50IHdhbnRfZXhleGl0OworCQljaGFyICp0OworCisJCWlmICgqZyA9PSAwKQorCQkJY29udGludWU7CisJCXQgPSB0cmFwW3NpZ107CisJCS8qIG5vbi10cmFwcGVkIFNJR0lOVCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgcmFpc2VfaW50ZXJydXB0LAorCQkgKiBkb24ndCB1cHNldCBpdCBieSByZXNldHRpbmcgZ290c2lnW1NJR0lOVC0xXSAqLworCQlpZiAoc2lnID09IFNJR0lOVCAmJiAhdCkKKwkJCWNvbnRpbnVlOworCisJCVRSQUNFKCgic2lnICVkIGlzIGFjdGl2ZSwgd2lsbCBydW4gaGFuZGxlciAnJXMnXG4iLCBzaWcsIHQpKTsKKwkJKmcgPSAwOworCQlpZiAoIXQpCisJCQljb250aW51ZTsKKwkJd2FudF9leGV4aXQgPSBldmFsc3RyaW5nKHQsIFNLSVBFVkFMKTsKKwkJZXhpdHN0YXR1cyA9IHNhdmVzdGF0dXM7CisJCWlmICh3YW50X2V4ZXhpdCkgeworCQkJVFJBQ0UoKCJkb3RyYXAgcmV0dXJucyAlZFxuIiwgd2FudF9leGV4aXQpKTsKKwkJCXJldHVybiB3YW50X2V4ZXhpdDsKKwkJfQorCX0KKworCVRSQUNFKCgiZG90cmFwIHJldHVybnMgMFxuIikpOworCXJldHVybiAwOworfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAtIGV2YWx1YXRpb24gaXMgZmFpcmx5IHJlY3Vyc2l2ZSBidXNpbmVzcy4uLiAqLworc3RhdGljIHZvaWQgZXZhbGxvb3AodW5pb24gbm9kZSAqLCBpbnQpOworc3RhdGljIHZvaWQgZXZhbGZvcih1bmlvbiBub2RlICosIGludCk7CitzdGF0aWMgdm9pZCBldmFsY2FzZSh1bmlvbiBub2RlICosIGludCk7CitzdGF0aWMgdm9pZCBldmFsc3Vic2hlbGwodW5pb24gbm9kZSAqLCBpbnQpOworc3RhdGljIHZvaWQgZXhwcmVkaXIodW5pb24gbm9kZSAqKTsKK3N0YXRpYyB2b2lkIGV2YWxwaXBlKHVuaW9uIG5vZGUgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGV2YWxjb21tYW5kKHVuaW9uIG5vZGUgKiwgaW50KTsKK3N0YXRpYyBpbnQgZXZhbGJsdGluKGNvbnN0IHN0cnVjdCBidWlsdGluY21kICosIGludCwgY2hhciAqKik7CitzdGF0aWMgdm9pZCBwcmVoYXNoKHVuaW9uIG5vZGUgKik7CisKKy8qCisgKiBFdmFsdWF0ZSBhIHBhcnNlIHRyZWUuICBUaGUgdmFsdWUgaXMgbGVmdCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlCisgKiBleGl0c3RhdHVzLgorICovCitzdGF0aWMgdm9pZAorZXZhbHRyZWUodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyID0gZXhjZXB0aW9uX2hhbmRsZXI7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisJaW50IGNoZWNrZXhpdCA9IDA7CisJdm9pZCAoKmV2YWxmbikodW5pb24gbm9kZSAqLCBpbnQpOworCWludCBzdGF0dXM7CisJaW50IGludF9sZXZlbDsKKworCVNBVkVfSU5UKGludF9sZXZlbCk7CisKKwlpZiAobiA9PSBOVUxMKSB7CisJCVRSQUNFKCgiZXZhbHRyZWUoTlVMTCkgY2FsbGVkXG4iKSk7CisJCWdvdG8gb3V0MTsKKwl9CisJVFJBQ0UoKCJldmFsdHJlZSglcDogJWQsICVkKSBjYWxsZWRcbiIsIG4sIG4tPnR5cGUsIGZsYWdzKSk7CisKKwlleGNlcHRpb25faGFuZGxlciA9ICZqbXBsb2M7CisJeworCQlpbnQgZXJyID0gc2V0am1wKGptcGxvYy5sb2MpOworCQlpZiAoZXJyKSB7CisJCQkvKiBpZiBpdCB3YXMgYSBzaWduYWwsIGNoZWNrIGZvciB0cmFwIGhhbmRsZXJzICovCisJCQlpZiAoZXhjZXB0aW9uX3R5cGUgPT0gRVhTSUcpIHsKKwkJCQlUUkFDRSgoImV4Y2VwdGlvbiAlZCAoRVhTSUcpIGluIGV2YWx0cmVlLCBlcnI9JWRcbiIsCisJCQkJCQlleGNlcHRpb25fdHlwZSwgZXJyKSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQkvKiBjb250aW51ZSBvbiB0aGUgd2F5IG91dCAqLworCQkJVFJBQ0UoKCJleGNlcHRpb24gJWQgaW4gZXZhbHRyZWUsIHByb3BhZ2F0aW5nIGVycj0lZFxuIiwKKwkJCQkJZXhjZXB0aW9uX3R5cGUsIGVycikpOworCQkJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwkJCWxvbmdqbXAoZXhjZXB0aW9uX2hhbmRsZXItPmxvYywgZXJyKTsKKwkJfQorCX0KKworCXN3aXRjaCAobi0+dHlwZSkgeworCWRlZmF1bHQ6CisjaWYgREVCVUcKKwkJb3V0MWZtdCgiTm9kZSB0eXBlID0gJWRcbiIsIG4tPnR5cGUpOworCQlmZmx1c2hfYWxsKCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBOTk9UOgorCQlldmFsdHJlZShuLT5ubm90LmNvbSwgRVZfVEVTVEVEKTsKKwkJc3RhdHVzID0gIWV4aXRzdGF0dXM7CisJCWdvdG8gc2V0c3RhdHVzOworCWNhc2UgTlJFRElSOgorCQlleHByZWRpcihuLT5ucmVkaXIucmVkaXJlY3QpOworCQlzdGF0dXMgPSByZWRpcmVjdHNhZmUobi0+bnJlZGlyLnJlZGlyZWN0LCBSRURJUl9QVVNIKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWV2YWx0cmVlKG4tPm5yZWRpci5uLCBmbGFncyAmIEVWX1RFU1RFRCk7CisJCQlzdGF0dXMgPSBleGl0c3RhdHVzOworCQl9CisJCXBvcHJlZGlyKC8qZHJvcDoqLyAwLCAvKnJlc3RvcmU6Ki8gMCAvKiBub3Qgc3VyZSAqLyk7CisJCWdvdG8gc2V0c3RhdHVzOworCWNhc2UgTkNNRDoKKwkJZXZhbGZuID0gZXZhbGNvbW1hbmQ7CisgY2hlY2tleGl0OgorCQlpZiAoZWZsYWcgJiYgIShmbGFncyAmIEVWX1RFU1RFRCkpCisJCQljaGVja2V4aXQgPSB+MDsKKwkJZ290byBjYWxsZXZhbDsKKwljYXNlIE5GT1I6CisJCWV2YWxmbiA9IGV2YWxmb3I7CisJCWdvdG8gY2FsbGV2YWw7CisJY2FzZSBOV0hJTEU6CisJY2FzZSBOVU5USUw6CisJCWV2YWxmbiA9IGV2YWxsb29wOworCQlnb3RvIGNhbGxldmFsOworCWNhc2UgTlNVQlNIRUxMOgorCWNhc2UgTkJBQ0tHTkQ6CisJCWV2YWxmbiA9IGV2YWxzdWJzaGVsbDsKKwkJZ290byBjYWxsZXZhbDsKKwljYXNlIE5QSVBFOgorCQlldmFsZm4gPSBldmFscGlwZTsKKwkJZ290byBjaGVja2V4aXQ7CisJY2FzZSBOQ0FTRToKKwkJZXZhbGZuID0gZXZhbGNhc2U7CisJCWdvdG8gY2FsbGV2YWw7CisJY2FzZSBOQU5EOgorCWNhc2UgTk9SOgorCWNhc2UgTlNFTUk6IHsKKworI2lmIE5BTkQgKyAxICE9IE5PUgorI2Vycm9yIE5BTkQgKyAxICE9IE5PUgorI2VuZGlmCisjaWYgTk9SICsgMSAhPSBOU0VNSQorI2Vycm9yIE5PUiArIDEgIT0gTlNFTUkKKyNlbmRpZgorCQl1bnNpZ25lZCBpc19vciA9IG4tPnR5cGUgLSBOQU5EOworCQlldmFsdHJlZSgKKwkJCW4tPm5iaW5hcnkuY2gxLAorCQkJKGZsYWdzIHwgKChpc19vciA+PiAxKSAtIDEpKSAmIEVWX1RFU1RFRAorCQkpOworCQlpZiAoIWV4aXRzdGF0dXMgPT0gaXNfb3IpCisJCQlicmVhazsKKwkJaWYgKCFldmFsc2tpcCkgeworCQkJbiA9IG4tPm5iaW5hcnkuY2gyOworIGV2YWxuOgorCQkJZXZhbGZuID0gZXZhbHRyZWU7CisgY2FsbGV2YWw6CisJCQlldmFsZm4obiwgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgTklGOgorCQlldmFsdHJlZShuLT5uaWYudGVzdCwgRVZfVEVTVEVEKTsKKwkJaWYgKGV2YWxza2lwKQorCQkJYnJlYWs7CisJCWlmIChleGl0c3RhdHVzID09IDApIHsKKwkJCW4gPSBuLT5uaWYuaWZwYXJ0OworCQkJZ290byBldmFsbjsKKwkJfQorCQlpZiAobi0+bmlmLmVsc2VwYXJ0KSB7CisJCQluID0gbi0+bmlmLmVsc2VwYXJ0OworCQkJZ290byBldmFsbjsKKwkJfQorCQlnb3RvIHN1Y2Nlc3M7CisJY2FzZSBOREVGVU46CisJCWRlZnVuKG4tPm5hcmcudGV4dCwgbi0+bmFyZy5uZXh0KTsKKyBzdWNjZXNzOgorCQlzdGF0dXMgPSAwOworIHNldHN0YXR1czoKKwkJZXhpdHN0YXR1cyA9IHN0YXR1czsKKwkJYnJlYWs7CisJfQorCisgb3V0OgorCWV4Y2VwdGlvbl9oYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisKKyBvdXQxOgorCS8qIE9yZGVyIG9mIGNoZWNrcyBiZWxvdyBpcyBpbXBvcnRhbnQ6CisJICogc2lnbmFsIGhhbmRsZXJzIHRyaWdnZXIgYmVmb3JlIGV4aXQgY2F1c2VkIGJ5ICJzZXQgLWUiLgorCSAqLworCWlmIChwZW5kaW5nX3NpZyAmJiBkb3RyYXAoKSkKKwkJZ290byBleGV4aXQ7CisJaWYgKGNoZWNrZXhpdCAmIGV4aXRzdGF0dXMpCisJCWV2YWxza2lwIHw9IFNLSVBFVkFMOworCisJaWYgKGZsYWdzICYgRVZfRVhJVCkgeworIGV4ZXhpdDoKKwkJcmFpc2VfZXhjZXB0aW9uKEVYRVhJVCk7CisJfQorCisJUkVTVE9SRV9JTlQoaW50X2xldmVsKTsKKwlUUkFDRSgoImxlYXZpbmcgZXZhbHRyZWUgKG5vIGludGVycnVwdHMpXG4iKSk7Cit9CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSAzKQorc3RhdGljCisjZW5kaWYKK3ZvaWQgZXZhbHRyZWVucih1bmlvbiBub2RlICosIGludCkgX19hdHRyaWJ1dGVfXyAoKGFsaWFzKCJldmFsdHJlZSIpLF9fbm9yZXR1cm5fXykpOworCitzdGF0aWMgdm9pZAorZXZhbGxvb3AodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCWludCBzdGF0dXM7CisKKwlsb29wbmVzdCsrOworCXN0YXR1cyA9IDA7CisJZmxhZ3MgJj0gRVZfVEVTVEVEOworCWZvciAoOzspIHsKKwkJaW50IGk7CisKKwkJZXZhbHRyZWUobi0+bmJpbmFyeS5jaDEsIEVWX1RFU1RFRCk7CisJCWlmIChldmFsc2tpcCkgeworIHNraXBwaW5nOgorCQkJaWYgKGV2YWxza2lwID09IFNLSVBDT05UICYmIC0tc2tpcGNvdW50IDw9IDApIHsKKwkJCQlldmFsc2tpcCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZXZhbHNraXAgPT0gU0tJUEJSRUFLICYmIC0tc2tpcGNvdW50IDw9IDApCisJCQkJZXZhbHNraXAgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaSA9IGV4aXRzdGF0dXM7CisJCWlmIChuLT50eXBlICE9IE5XSElMRSkKKwkJCWkgPSAhaTsKKwkJaWYgKGkgIT0gMCkKKwkJCWJyZWFrOworCQlldmFsdHJlZShuLT5uYmluYXJ5LmNoMiwgZmxhZ3MpOworCQlzdGF0dXMgPSBleGl0c3RhdHVzOworCQlpZiAoZXZhbHNraXApCisJCQlnb3RvIHNraXBwaW5nOworCX0KKwlsb29wbmVzdC0tOworCWV4aXRzdGF0dXMgPSBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCitldmFsZm9yKHVuaW9uIG5vZGUgKm4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgYXJnbGlzdCBhcmdsaXN0OworCXVuaW9uIG5vZGUgKmFyZ3A7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlhcmdsaXN0Lmxpc3QgPSBOVUxMOworCWFyZ2xpc3QubGFzdHAgPSAmYXJnbGlzdC5saXN0OworCWZvciAoYXJncCA9IG4tPm5mb3IuYXJnczsgYXJncDsgYXJncCA9IGFyZ3AtPm5hcmcubmV4dCkgeworCQlleHBhbmRhcmcoYXJncCwgJmFyZ2xpc3QsIEVYUF9GVUxMIHwgRVhQX1RJTERFIHwgRVhQX1JFQ09SRCk7CisJCS8qIFhYWCAqLworCQlpZiAoZXZhbHNraXApCisJCQlnb3RvIG91dDsKKwl9CisJKmFyZ2xpc3QubGFzdHAgPSBOVUxMOworCisJZXhpdHN0YXR1cyA9IDA7CisJbG9vcG5lc3QrKzsKKwlmbGFncyAmPSBFVl9URVNURUQ7CisJZm9yIChzcCA9IGFyZ2xpc3QubGlzdDsgc3A7IHNwID0gc3AtPm5leHQpIHsKKwkJc2V0dmFyKG4tPm5mb3IudmFyLCBzcC0+dGV4dCwgMCk7CisJCWV2YWx0cmVlKG4tPm5mb3IuYm9keSwgZmxhZ3MpOworCQlpZiAoZXZhbHNraXApIHsKKwkJCWlmIChldmFsc2tpcCA9PSBTS0lQQ09OVCAmJiAtLXNraXBjb3VudCA8PSAwKSB7CisJCQkJZXZhbHNraXAgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGV2YWxza2lwID09IFNLSVBCUkVBSyAmJiAtLXNraXBjb3VudCA8PSAwKQorCQkJCWV2YWxza2lwID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWxvb3BuZXN0LS07Cisgb3V0OgorCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCitzdGF0aWMgdm9pZAorZXZhbGNhc2UodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXVuaW9uIG5vZGUgKmNwOworCXVuaW9uIG5vZGUgKnBhdHA7CisJc3RydWN0IGFyZ2xpc3QgYXJnbGlzdDsKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJYXJnbGlzdC5saXN0ID0gTlVMTDsKKwlhcmdsaXN0Lmxhc3RwID0gJmFyZ2xpc3QubGlzdDsKKwlleHBhbmRhcmcobi0+bmNhc2UuZXhwciwgJmFyZ2xpc3QsIEVYUF9USUxERSk7CisJZXhpdHN0YXR1cyA9IDA7CisJZm9yIChjcCA9IG4tPm5jYXNlLmNhc2VzOyBjcCAmJiBldmFsc2tpcCA9PSAwOyBjcCA9IGNwLT5uY2xpc3QubmV4dCkgeworCQlmb3IgKHBhdHAgPSBjcC0+bmNsaXN0LnBhdHRlcm47IHBhdHA7IHBhdHAgPSBwYXRwLT5uYXJnLm5leHQpIHsKKwkJCWlmIChjYXNlbWF0Y2gocGF0cCwgYXJnbGlzdC5saXN0LT50ZXh0KSkgeworCQkJCWlmIChldmFsc2tpcCA9PSAwKSB7CisJCQkJCWV2YWx0cmVlKGNwLT5uY2xpc3QuYm9keSwgZmxhZ3MpOworCQkJCX0KKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKyBvdXQ6CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7Cit9CisKKy8qCisgKiBLaWNrIG9mZiBhIHN1YnNoZWxsIHRvIGV2YWx1YXRlIGEgdHJlZS4KKyAqLworc3RhdGljIHZvaWQKK2V2YWxzdWJzaGVsbCh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGpvYiAqanA7CisJaW50IGJhY2tnbmQgPSAobi0+dHlwZSA9PSBOQkFDS0dORCk7CisJaW50IHN0YXR1czsKKworCWV4cHJlZGlyKG4tPm5yZWRpci5yZWRpcmVjdCk7CisJaWYgKCFiYWNrZ25kICYmIChmbGFncyAmIEVWX0VYSVQpICYmICFtYXlfaGF2ZV90cmFwcykKKwkJZ290byBub2Zvcms7CisJSU5UX09GRjsKKwlqcCA9IG1ha2Vqb2IoLypuLCovIDEpOworCWlmIChmb3Jrc2hlbGwoanAsIG4sIGJhY2tnbmQpID09IDApIHsKKwkJLyogY2hpbGQgKi8KKwkJSU5UX09OOworCQlmbGFncyB8PSBFVl9FWElUOworCQlpZiAoYmFja2duZCkKKwkJCWZsYWdzICY9IH5FVl9URVNURUQ7Cisgbm9mb3JrOgorCQlyZWRpcmVjdChuLT5ucmVkaXIucmVkaXJlY3QsIDApOworCQlldmFsdHJlZW5yKG4tPm5yZWRpci5uLCBmbGFncyk7CisJCS8qIG5ldmVyIHJldHVybnMgKi8KKwl9CisJc3RhdHVzID0gMDsKKwlpZiAoIWJhY2tnbmQpCisJCXN0YXR1cyA9IHdhaXRmb3Jqb2IoanApOworCWV4aXRzdGF0dXMgPSBzdGF0dXM7CisJSU5UX09OOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIGluIGEgcmVkaXJlY3Rpb24gbGlzdC4KKyAqLworc3RhdGljIHZvaWQgZml4cmVkaXIodW5pb24gbm9kZSAqLCBjb25zdCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZAorZXhwcmVkaXIodW5pb24gbm9kZSAqbikKK3sKKwl1bmlvbiBub2RlICpyZWRpcjsKKworCWZvciAocmVkaXIgPSBuOyByZWRpcjsgcmVkaXIgPSByZWRpci0+bmZpbGUubmV4dCkgeworCQlzdHJ1Y3QgYXJnbGlzdCBmbjsKKworCQlmbi5saXN0ID0gTlVMTDsKKwkJZm4ubGFzdHAgPSAmZm4ubGlzdDsKKwkJc3dpdGNoIChyZWRpci0+dHlwZSkgeworCQljYXNlIE5GUk9NVE86CisJCWNhc2UgTkZST006CisJCWNhc2UgTlRPOgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJY2FzZSBOVE8yOgorI2VuZGlmCisJCWNhc2UgTkNMT0JCRVI6CisJCWNhc2UgTkFQUEVORDoKKwkJCWV4cGFuZGFyZyhyZWRpci0+bmZpbGUuZm5hbWUsICZmbiwgRVhQX1RJTERFIHwgRVhQX1JFRElSKTsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisgc3RvcmVfZXhwZm5hbWU6CisjZW5kaWYKKwkJCXJlZGlyLT5uZmlsZS5leHBmbmFtZSA9IGZuLmxpc3QtPnRleHQ7CisJCQlicmVhazsKKwkJY2FzZSBORlJPTUZEOgorCQljYXNlIE5UT0ZEOiAvKiA+JiAqLworCQkJaWYgKHJlZGlyLT5uZHVwLnZuYW1lKSB7CisJCQkJZXhwYW5kYXJnKHJlZGlyLT5uZHVwLnZuYW1lLCAmZm4sIEVYUF9GVUxMIHwgRVhQX1RJTERFKTsKKwkJCQlpZiAoZm4ubGlzdCA9PSBOVUxMKQorCQkJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigicmVkaXIgZXJyb3IiKTsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisvL0ZJWE1FOiB3ZSB1c2VkIGV4cGFuZGFyZyB3aXRoIGRpZmZlcmVudCBhcmdzIQorCQkJCWlmICghaXNkaWdpdF9zdHI5KGZuLmxpc3QtPnRleHQpKSB7CisJCQkJCS8qID4mZmlsZSwgbm90ID4mZmQgKi8KKwkJCQkJaWYgKHJlZGlyLT5uZmlsZS5mZCAhPSAxKSAvKiAxMjM+JmZpbGUgLSBCQUQgKi8KKwkJCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJyZWRpciBlcnJvciIpOworCQkJCQlyZWRpci0+dHlwZSA9IE5UTzI7CisJCQkJCWdvdG8gc3RvcmVfZXhwZm5hbWU7CisJCQkJfQorI2VuZGlmCisJCQkJZml4cmVkaXIocmVkaXIsIGZuLmxpc3QtPnRleHQsIDEpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBFdmFsdWF0ZSBhIHBpcGVsaW5lLiAgQWxsIHRoZSBwcm9jZXNzZXMgaW4gdGhlIHBpcGVsaW5lIGFyZSBjaGlsZHJlbgorICogb2YgdGhlIHByb2Nlc3MgY3JlYXRpbmcgdGhlIHBpcGVsaW5lLiAgKFRoaXMgZGlmZmVycyBmcm9tIHNvbWUgdmVyc2lvbnMKKyAqIG9mIHRoZSBzaGVsbCwgd2hpY2ggbWFrZSB0aGUgbGFzdCBwcm9jZXNzIGluIGEgcGlwZWxpbmUgdGhlIHBhcmVudAorICogb2YgYWxsIHRoZSByZXN0LikKKyAqLworc3RhdGljIHZvaWQKK2V2YWxwaXBlKHVuaW9uIG5vZGUgKm4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmxwOworCWludCBwaXBlbGVuOworCWludCBwcmV2ZmQ7CisJaW50IHBpcFsyXTsKKworCVRSQUNFKCgiZXZhbHBpcGUoMHglbHgpIGNhbGxlZFxuIiwgKGxvbmcpbikpOworCXBpcGVsZW4gPSAwOworCWZvciAobHAgPSBuLT5ucGlwZS5jbWRsaXN0OyBscDsgbHAgPSBscC0+bmV4dCkKKwkJcGlwZWxlbisrOworCWZsYWdzIHw9IEVWX0VYSVQ7CisJSU5UX09GRjsKKwlqcCA9IG1ha2Vqb2IoLypuLCovIHBpcGVsZW4pOworCXByZXZmZCA9IC0xOworCWZvciAobHAgPSBuLT5ucGlwZS5jbWRsaXN0OyBscDsgbHAgPSBscC0+bmV4dCkgeworCQlwcmVoYXNoKGxwLT5uKTsKKwkJcGlwWzFdID0gLTE7CisJCWlmIChscC0+bmV4dCkgeworCQkJaWYgKHBpcGUocGlwKSA8IDApIHsKKwkJCQljbG9zZShwcmV2ZmQpOworCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJwaXBlIGNhbGwgZmFpbGVkIik7CisJCQl9CisJCX0KKwkJaWYgKGZvcmtzaGVsbChqcCwgbHAtPm4sIG4tPm5waXBlLnBpcGVfYmFja2duZCkgPT0gMCkgeworCQkJSU5UX09OOworCQkJaWYgKHBpcFsxXSA+PSAwKSB7CisJCQkJY2xvc2UocGlwWzBdKTsKKwkJCX0KKwkJCWlmIChwcmV2ZmQgPiAwKSB7CisJCQkJZHVwMihwcmV2ZmQsIDApOworCQkJCWNsb3NlKHByZXZmZCk7CisJCQl9CisJCQlpZiAocGlwWzFdID4gMSkgeworCQkJCWR1cDIocGlwWzFdLCAxKTsKKwkJCQljbG9zZShwaXBbMV0pOworCQkJfQorCQkJZXZhbHRyZWVucihscC0+biwgZmxhZ3MpOworCQkJLyogbmV2ZXIgcmV0dXJucyAqLworCQl9CisJCWlmIChwcmV2ZmQgPj0gMCkKKwkJCWNsb3NlKHByZXZmZCk7CisJCXByZXZmZCA9IHBpcFswXTsKKwkJLyogRG9uJ3Qgd2FudCB0byB0cmlnZ2VyIGRlYnVnZ2luZyAqLworCQlpZiAocGlwWzFdICE9IC0xKQorCQkJY2xvc2UocGlwWzFdKTsKKwl9CisJaWYgKG4tPm5waXBlLnBpcGVfYmFja2duZCA9PSAwKSB7CisJCWV4aXRzdGF0dXMgPSB3YWl0Zm9yam9iKGpwKTsKKwkJVFJBQ0UoKCJldmFscGlwZTogIGpvYiBkb25lIGV4aXQgc3RhdHVzICVkXG4iLCBleGl0c3RhdHVzKSk7CisJfQorCUlOVF9PTjsKK30KKworLyoKKyAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHNoZWxsIGlzIGludGVyYWN0aXZlIG9yIG5vdC4KKyAqLworc3RhdGljIHZvaWQKK3NldGludGVyYWN0aXZlKGludCBvbikKK3sKKwlzdGF0aWMgc21hbGxpbnQgaXNfaW50ZXJhY3RpdmU7CisKKwlpZiAoKytvbiA9PSBpc19pbnRlcmFjdGl2ZSkKKwkJcmV0dXJuOworCWlzX2ludGVyYWN0aXZlID0gb247CisJc2V0c2lnbmFsKFNJR0lOVCk7CisJc2V0c2lnbmFsKFNJR1FVSVQpOworCXNldHNpZ25hbChTSUdURVJNKTsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQKKwlpZiAoaXNfaW50ZXJhY3RpdmUgPiAxKSB7CisJCS8qIExvb2tzIGxpa2UgdGhleSB3YW50IGFuIGludGVyYWN0aXZlIHNoZWxsICovCisJCXN0YXRpYyBzbWFsbGludCBkaWRfYmFubmVyOworCisJCWlmICghZGlkX2Jhbm5lcikgeworCQkJLyogbm90ZTogYXNoIGFuZCBodXNoIHNoYXJlIHRoaXMgc3RyaW5nICovCisJCQlvdXQxZm10KCJcblxuJXMgJXNcbiIKKwkJCQkiRW50ZXIgJ2hlbHAnIGZvciBhIGxpc3Qgb2YgYnVpbHQtaW4gY29tbWFuZHMuIgorCQkJCSJcblxuIiwKKwkJCQliYl9iYW5uZXIsCisJCQkJImJ1aWx0LWluIHNoZWxsIChhc2gpIgorCQkJKTsKKwkJCWRpZF9iYW5uZXIgPSAxOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitvcHRzY2hhbmdlZCh2b2lkKQoreworI2lmIERFQlVHCisJb3BlbnRyYWNlKCk7CisjZW5kaWYKKwlzZXRpbnRlcmFjdGl2ZShpZmxhZyk7CisJc2V0am9iY3RsKG1mbGFnKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisJaWYgKHZpZmxhZykKKwkJbGluZV9pbnB1dF9zdGF0ZS0+ZmxhZ3MgfD0gVklfTU9ERTsKKwllbHNlCisJCWxpbmVfaW5wdXRfc3RhdGUtPmZsYWdzICY9IH5WSV9NT0RFOworI2Vsc2UKKwl2aWZsYWcgPSAwOyAvKiBmb3JjaWJseSBrZWVwIHRoZSBvcHRpb24gb2ZmICovCisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBsb2NhbHZhciAqbG9jYWx2YXJzOworCisvKgorICogQ2FsbGVkIGFmdGVyIGEgZnVuY3Rpb24gcmV0dXJucy4KKyAqIEludGVycnVwdHMgbXVzdCBiZSBvZmYuCisgKi8KK3N0YXRpYyB2b2lkCitwb3Bsb2NhbHZhcnModm9pZCkKK3sKKwlzdHJ1Y3QgbG9jYWx2YXIgKmx2cDsKKwlzdHJ1Y3QgdmFyICp2cDsKKworCXdoaWxlICgobHZwID0gbG9jYWx2YXJzKSAhPSBOVUxMKSB7CisJCWxvY2FsdmFycyA9IGx2cC0+bmV4dDsKKwkJdnAgPSBsdnAtPnZwOworCQlUUkFDRSgoInBvcGxvY2FsdmFyICVzXG4iLCB2cCA/IHZwLT52YXJfdGV4dCA6ICItIikpOworCQlpZiAodnAgPT0gTlVMTCkgeyAgICAgICAvKiAkLSBzYXZlZCAqLworCQkJbWVtY3B5KG9wdGxpc3QsIGx2cC0+dGV4dCwgc2l6ZW9mKG9wdGxpc3QpKTsKKwkJCWZyZWUoKGNoYXIqKWx2cC0+dGV4dCk7CisJCQlvcHRzY2hhbmdlZCgpOworCQl9IGVsc2UgaWYgKChsdnAtPmZsYWdzICYgKFZVTlNFVHxWU1RSRklYRUQpKSA9PSBWVU5TRVQpIHsKKwkJCXVuc2V0dmFyKHZwLT52YXJfdGV4dCk7CisJCX0gZWxzZSB7CisJCQlpZiAodnAtPnZhcl9mdW5jKQorCQkJCXZwLT52YXJfZnVuYyh2YXJfZW5kKGx2cC0+dGV4dCkpOworCQkJaWYgKCh2cC0+ZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0spKSA9PSAwKQorCQkJCWZyZWUoKGNoYXIqKXZwLT52YXJfdGV4dCk7CisJCQl2cC0+ZmxhZ3MgPSBsdnAtPmZsYWdzOworCQkJdnAtPnZhcl90ZXh0ID0gbHZwLT50ZXh0OworCQl9CisJCWZyZWUobHZwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2V2YWxmdW4oc3RydWN0IGZ1bmNub2RlICpmdW5jLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCBmbGFncykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2hwYXJhbSBzYXZlcGFyYW07CisJc3RydWN0IGxvY2FsdmFyICp2b2xhdGlsZSBzYXZlbG9jYWx2YXJzOworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCWludCBlOworCisJc2F2ZXBhcmFtID0gc2hlbGxwYXJhbTsKKwlzYXZlbG9jYWx2YXJzID0gbG9jYWx2YXJzOworCWUgPSBzZXRqbXAoam1wbG9jLmxvYyk7CisJaWYgKGUpIHsKKwkJZ290byBmdW5jZG9uZTsKKwl9CisJSU5UX09GRjsKKwlzYXZlaGFuZGxlciA9IGV4Y2VwdGlvbl9oYW5kbGVyOworCWV4Y2VwdGlvbl9oYW5kbGVyID0gJmptcGxvYzsKKwlsb2NhbHZhcnMgPSBOVUxMOworCXNoZWxscGFyYW0ubWFsbG9jZWQgPSAwOworCWZ1bmMtPmNvdW50Kys7CisJZnVuY25lc3QrKzsKKwlJTlRfT047CisJc2hlbGxwYXJhbS5ucGFyYW0gPSBhcmdjIC0gMTsKKwlzaGVsbHBhcmFtLnAgPSBhcmd2ICsgMTsKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKyNlbmRpZgorCWV2YWx0cmVlKCZmdW5jLT5uLCBmbGFncyAmIEVWX1RFU1RFRCk7CisgZnVuY2RvbmU6CisJSU5UX09GRjsKKwlmdW5jbmVzdC0tOworCWZyZWVmdW5jKGZ1bmMpOworCXBvcGxvY2FsdmFycygpOworCWxvY2FsdmFycyA9IHNhdmVsb2NhbHZhcnM7CisJZnJlZXBhcmFtKCZzaGVsbHBhcmFtKTsKKwlzaGVsbHBhcmFtID0gc2F2ZXBhcmFtOworCWV4Y2VwdGlvbl9oYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisJSU5UX09OOworCWV2YWxza2lwICY9IH5TS0lQRlVOQzsKKwlyZXR1cm4gZTsKK30KKworI2lmIEVOQUJMRV9BU0hfQ01EQ01ECitzdGF0aWMgY2hhciAqKgorcGFyc2VfY29tbWFuZF9hcmdzKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICoqcGF0aCkKK3sKKwljaGFyICpjcCwgYzsKKworCWZvciAoOzspIHsKKwkJY3AgPSAqKythcmd2OworCQlpZiAoIWNwKQorCQkJcmV0dXJuIDA7CisJCWlmICgqY3ArKyAhPSAnLScpCisJCQlicmVhazsKKwkJYyA9ICpjcCsrOworCQlpZiAoIWMpCisJCQlicmVhazsKKwkJaWYgKGMgPT0gJy0nICYmICEqY3ApIHsKKwkJCWFyZ3YrKzsKKwkJCWJyZWFrOworCQl9CisJCWRvIHsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAncCc6CisJCQkJKnBhdGggPSBiYl9kZWZhdWx0X3BhdGg7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIHJ1biAndHlwZWNtZCcgZm9yIG90aGVyIG9wdGlvbnMgKi8KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWMgPSAqY3ArKzsKKwkJfSB3aGlsZSAoYyk7CisJfQorCXJldHVybiBhcmd2OworfQorI2VuZGlmCisKKy8qCisgKiBNYWtlIGEgdmFyaWFibGUgYSBsb2NhbCB2YXJpYWJsZS4gIFdoZW4gYSB2YXJpYWJsZSBpcyBtYWRlIGxvY2FsLCBpdCdzCisgKiB2YWx1ZSBhbmQgZmxhZ3MgYXJlIHNhdmVkIGluIGEgbG9jYWx2YXIgc3RydWN0dXJlLiAgVGhlIHNhdmVkIHZhbHVlcworICogd2lsbCBiZSByZXN0b3JlZCB3aGVuIHRoZSBzaGVsbCBmdW5jdGlvbiByZXR1cm5zLiAgV2UgaGFuZGxlIHRoZSBuYW1lCisgKiAiLSIgYXMgYSBzcGVjaWFsIGNhc2UuCisgKi8KK3N0YXRpYyB2b2lkCitta2xvY2FsKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGxvY2FsdmFyICpsdnA7CisJc3RydWN0IHZhciAqKnZwcDsKKwlzdHJ1Y3QgdmFyICp2cDsKKworCUlOVF9PRkY7CisJbHZwID0gY2t6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NhbHZhcikpOworCWlmIChMT05FX0RBU0gobmFtZSkpIHsKKwkJY2hhciAqcDsKKwkJcCA9IGNrbWFsbG9jKHNpemVvZihvcHRsaXN0KSk7CisJCWx2cC0+dGV4dCA9IG1lbWNweShwLCBvcHRsaXN0LCBzaXplb2Yob3B0bGlzdCkpOworCQl2cCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJY2hhciAqZXE7CisKKwkJdnBwID0gaGFzaHZhcihuYW1lKTsKKwkJdnAgPSAqZmluZHZhcih2cHAsIG5hbWUpOworCQllcSA9IHN0cmNocihuYW1lLCAnPScpOworCQlpZiAodnAgPT0gTlVMTCkgeworCQkJaWYgKGVxKQorCQkJCXNldHZhcmVxKG5hbWUsIFZTVFJGSVhFRCk7CisJCQllbHNlCisJCQkJc2V0dmFyKG5hbWUsIE5VTEwsIFZTVFJGSVhFRCk7CisJCQl2cCA9ICp2cHA7ICAgICAgLyogdGhlIG5ldyB2YXJpYWJsZSAqLworCQkJbHZwLT5mbGFncyA9IFZVTlNFVDsKKwkJfSBlbHNlIHsKKwkJCWx2cC0+dGV4dCA9IHZwLT52YXJfdGV4dDsKKwkJCWx2cC0+ZmxhZ3MgPSB2cC0+ZmxhZ3M7CisJCQl2cC0+ZmxhZ3MgfD0gVlNUUkZJWEVEfFZURVhURklYRUQ7CisJCQlpZiAoZXEpCisJCQkJc2V0dmFyZXEobmFtZSwgMCk7CisJCX0KKwl9CisJbHZwLT52cCA9IHZwOworCWx2cC0+bmV4dCA9IGxvY2FsdmFyczsKKwlsb2NhbHZhcnMgPSBsdnA7CisJSU5UX09OOworfQorCisvKgorICogVGhlICJsb2NhbCIgY29tbWFuZC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2xvY2FsY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbmFtZTsKKworCWFyZ3YgPSBhcmdwdHI7CisJd2hpbGUgKChuYW1lID0gKmFyZ3YrKykgIT0gTlVMTCkgeworCQlta2xvY2FsKG5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2ZhbHNlY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQwordHJ1ZWNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2V4ZWNjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJndlsxXSkgeworCQlpZmxhZyA9IDA7ICAgICAgICAgICAgICAvKiBleGl0IG9uIGVycm9yICovCisJCW1mbGFnID0gMDsKKwkJb3B0c2NoYW5nZWQoKTsKKwkJc2hlbGxleGVjKGFyZ3YgKyAxLCBwYXRodmFsKCksIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSByZXR1cm4gY29tbWFuZC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3JldHVybmNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qCisJICogSWYgY2FsbGVkIG91dHNpZGUgYSBmdW5jdGlvbiwgZG8gd2hhdCBrc2ggZG9lczsKKwkgKiBza2lwIHRoZSByZXN0IG9mIHRoZSBmaWxlLgorCSAqLworCWV2YWxza2lwID0gZnVuY25lc3QgPyBTS0lQRlVOQyA6IFNLSVBGSUxFOworCXJldHVybiBhcmd2WzFdID8gbnVtYmVyKGFyZ3ZbMV0pIDogZXhpdHN0YXR1czsKK30KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGJ1aWx0aW50YWJbXSAqLworc3RhdGljIGludCBicmVha2NtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgZG90Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCBldmFsY21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCBleGl0Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCBleHBvcnRjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCitzdGF0aWMgaW50IGdldG9wdHNjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CisjZW5kaWYKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQKK3N0YXRpYyBpbnQgaGVscGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKKyNlbmRpZgorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKK3N0YXRpYyBpbnQgbGV0Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworI2VuZGlmCitzdGF0aWMgaW50IHJlYWRjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IHNldGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgc2hpZnRjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IHRpbWVzY21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCB0cmFwY21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCB1bWFza2NtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgdW5zZXRjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IHVsaW1pdGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKKworI2RlZmluZSBCVUlMVElOX05PU1BFQyAgICAgICAgICAiMCIKKyNkZWZpbmUgQlVJTFRJTl9TUEVDSUFMICAgICAgICAgIjEiCisjZGVmaW5lIEJVSUxUSU5fUkVHVUxBUiAgICAgICAgICIyIgorI2RlZmluZSBCVUlMVElOX1NQRUNfUkVHICAgICAgICAiMyIKKyNkZWZpbmUgQlVJTFRJTl9BU1NJR04gICAgICAgICAgIjQiCisjZGVmaW5lIEJVSUxUSU5fU1BFQ19BU1NHICAgICAgICI1IgorI2RlZmluZSBCVUlMVElOX1JFR19BU1NHICAgICAgICAiNiIKKyNkZWZpbmUgQlVJTFRJTl9TUEVDX1JFR19BU1NHICAgIjciCisKKy8qIFN0dWJzIGZvciBjYWxsaW5nIG5vbi1GQVNUX0ZVTkMncyAqLworI2lmIEVOQUJMRV9BU0hfQlVJTFRJTl9FQ0hPCitzdGF0aWMgaW50IEZBU1RfRlVOQyBlY2hvY21kKGludCBhcmdjLCBjaGFyICoqYXJndikgICB7IHJldHVybiBlY2hvX21haW4oYXJnYywgYXJndik7IH0KKyNlbmRpZgorI2lmIEVOQUJMRV9BU0hfQlVJTFRJTl9QUklOVEYKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHByaW50ZmNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsgcmV0dXJuIHByaW50Zl9tYWluKGFyZ2MsIGFyZ3YpOyB9CisjZW5kaWYKKyNpZiBFTkFCTEVfQVNIX0JVSUxUSU5fVEVTVAorc3RhdGljIGludCBGQVNUX0ZVTkMgdGVzdGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpICAgeyByZXR1cm4gdGVzdF9tYWluKGFyZ2MsIGFyZ3YpOyB9CisjZW5kaWYKKworLyogS2VlcCB0aGVzZSBpbiBwcm9wZXIgb3JkZXIgc2luY2UgaXQgaXMgc2VhcmNoZWQgdmlhIGJzZWFyY2goKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdGluY21kIGJ1aWx0aW50YWJbXSA9IHsKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiLiIgICAgICAgLCBkb3RjbWQgICAgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgIjoiICAgICAgICwgdHJ1ZWNtZCAgICB9LAorI2lmIEVOQUJMRV9BU0hfQlVJTFRJTl9URVNUCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgIlsiICAgICAgICwgdGVzdGNtZCAgICB9LAorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiW1siICAgICAgLCB0ZXN0Y21kICAgIH0sCisjZW5kaWYKKyNlbmRpZgorI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwl7IEJVSUxUSU5fUkVHX0FTU0cgICAgICAiYWxpYXMiICAgLCBhbGlhc2NtZCAgIH0sCisjZW5kaWYKKyNpZiBKT0JTCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgImJnIiAgICAgICwgZmdfYmdjbWQgICB9LAorI2VuZGlmCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgImJyZWFrIiAgICwgYnJlYWtjbWQgICB9LAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJjZCIgICAgICAsIGNkY21kICAgICAgfSwKKwl7IEJVSUxUSU5fTk9TUEVDICAgICAgICAiY2hkaXIiICAgLCBjZGNtZCAgICAgIH0sCisjaWYgRU5BQkxFX0FTSF9DTURDTUQKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiY29tbWFuZCIgLCBjb21tYW5kY21kIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiY29udGludWUiLCBicmVha2NtZCAgIH0sCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX0VDSE8KKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiZWNobyIgICAgLCBlY2hvY21kICAgIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiZXZhbCIgICAgLCBldmFsY21kICAgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgImV4ZWMiICAgICwgZXhlY2NtZCAgICB9LAorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJleGl0IiAgICAsIGV4aXRjbWQgICAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUdfQVNTRyAiZXhwb3J0IiAgLCBleHBvcnRjbWQgIH0sCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgImZhbHNlIiAgICwgZmFsc2VjbWQgICB9LAorI2lmIEpPQlMKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiZmciICAgICAgLCBmZ19iZ2NtZCAgIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiZ2V0b3B0cyIgLCBnZXRvcHRzY21kIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fTk9TUEVDICAgICAgICAiaGFzaCIgICAgLCBoYXNoY21kICAgIH0sCisjaWYgIUVOQUJMRV9GRUFUVVJFX1NIX0VYVFJBX1FVSUVUCisJeyBCVUlMVElOX05PU1BFQyAgICAgICAgImhlbHAiICAgICwgaGVscGNtZCAgICB9LAorI2VuZGlmCisjaWYgSk9CUworCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJqb2JzIiAgICAsIGpvYnNjbWQgICAgfSwKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAia2lsbCIgICAgLCBraWxsY21kICAgIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJeyBCVUlMVElOX05PU1BFQyAgICAgICAgImxldCIgICAgICwgbGV0Y21kICAgICB9LAorI2VuZGlmCisJeyBCVUlMVElOX0FTU0lHTiAgICAgICAgImxvY2FsIiAgICwgbG9jYWxjbWQgICB9LAorI2lmIEVOQUJMRV9BU0hfQlVJTFRJTl9QUklOVEYKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAicHJpbnRmIiAgLCBwcmludGZjbWQgIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fTk9TUEVDICAgICAgICAicHdkIiAgICAgLCBwd2RjbWQgICAgIH0sCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgInJlYWQiICAgICwgcmVhZGNtZCAgICB9LAorCXsgQlVJTFRJTl9TUEVDX1JFR19BU1NHICJyZWFkb25seSIsIGV4cG9ydGNtZCAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAicmV0dXJuIiAgLCByZXR1cm5jbWQgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgInNldCIgICAgICwgc2V0Y21kICAgICB9LAorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJzaGlmdCIgICAsIHNoaWZ0Y21kICAgfSwKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgInNvdXJjZSIgICwgZG90Y21kICAgICB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX1RFU1QKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAidGVzdCIgICAgLCB0ZXN0Y21kICAgIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAidGltZXMiICAgLCB0aW1lc2NtZCAgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgInRyYXAiICAgICwgdHJhcGNtZCAgICB9LAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJ0cnVlIiAgICAsIHRydWVjbWQgICAgfSwKKwl7IEJVSUxUSU5fTk9TUEVDICAgICAgICAidHlwZSIgICAgLCB0eXBlY21kICAgIH0sCisJeyBCVUlMVElOX05PU1BFQyAgICAgICAgInVsaW1pdCIgICwgdWxpbWl0Y21kICB9LAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJ1bWFzayIgICAsIHVtYXNrY21kICAgfSwKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgInVuYWxpYXMiICwgdW5hbGlhc2NtZCB9LAorI2VuZGlmCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgInVuc2V0IiAgICwgdW5zZXRjbWQgICB9LAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJ3YWl0IiAgICAsIHdhaXRjbWQgICAgfSwKK307CisKKy8qIFNob3VsZCBtYXRjaCB0aGUgYWJvdmUgdGFibGUhICovCisjZGVmaW5lIENPTU1BTkRDTUQgKGJ1aWx0aW50YWIgKyBcCisJMiArIFwKKwkxICogRU5BQkxFX0FTSF9CVUlMVElOX1RFU1QgKyBcCisJMSAqIEVOQUJMRV9BU0hfQlVJTFRJTl9URVNUICogRU5BQkxFX0FTSF9CQVNIX0NPTVBBVCArIFwKKwkxICogRU5BQkxFX0FTSF9BTElBUyArIFwKKwkxICogRU5BQkxFX0FTSF9KT0JfQ09OVFJPTCArIFwKKwkzKQorI2RlZmluZSBFWEVDQ01EIChidWlsdGludGFiICsgXAorCTIgKyBcCisJMSAqIEVOQUJMRV9BU0hfQlVJTFRJTl9URVNUICsgXAorCTEgKiBFTkFCTEVfQVNIX0JVSUxUSU5fVEVTVCAqIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQgKyBcCisJMSAqIEVOQUJMRV9BU0hfQUxJQVMgKyBcCisJMSAqIEVOQUJMRV9BU0hfSk9CX0NPTlRST0wgKyBcCisJMyArIFwKKwkxICogRU5BQkxFX0FTSF9DTURDTUQgKyBcCisJMSArIFwKKwlFTkFCTEVfQVNIX0JVSUxUSU5fRUNITyArIFwKKwkxKQorCisvKgorICogU2VhcmNoIHRoZSB0YWJsZSBvZiBidWlsdGluIGNvbW1hbmRzLgorICovCitzdGF0aWMgc3RydWN0IGJ1aWx0aW5jbWQgKgorZmluZF9idWlsdGluKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJ1aWx0aW5jbWQgKmJwOworCisJYnAgPSBic2VhcmNoKAorCQluYW1lLCBidWlsdGludGFiLCBBUlJBWV9TSVpFKGJ1aWx0aW50YWIpLCBzaXplb2YoYnVpbHRpbnRhYlswXSksCisJCXBzdHJjbXAKKwkpOworCXJldHVybiBicDsKK30KKworLyoKKyAqIEV4ZWN1dGUgYSBzaW1wbGUgY29tbWFuZC4KKyAqLworc3RhdGljIGludAoraXNhc3NpZ25tZW50KGNvbnN0IGNoYXIgKnApCit7CisJY29uc3QgY2hhciAqcSA9IGVuZG9mbmFtZShwKTsKKwlpZiAocCA9PSBxKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKnEgPT0gJz0nOworfQorc3RhdGljIGludCBGQVNUX0ZVTkMKK2JsdGluY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCS8qIFByZXNlcnZlIGV4aXRzdGF0dXMgb2YgYSBwcmV2aW91cyBwb3NzaWJsZSByZWRpcmVjdGlvbgorCSAqIGFzIFBPU0lYIG1hbmRhdGVzICovCisJcmV0dXJuIGJhY2tfZXhpdHN0YXR1czsKK30KK3N0YXRpYyB2b2lkCitldmFsY29tbWFuZCh1bmlvbiBub2RlICpjbWQsIGludCBmbGFncykKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgbnVsbF9ibHRpbiA9IHsKKwkJIlwwXDAiLCBibHRpbmNtZCAvKiB3aHkgdGhyZWUgTlVMcz8gKi8KKwl9OworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJdW5pb24gbm9kZSAqYXJncDsKKwlzdHJ1Y3QgYXJnbGlzdCBhcmdsaXN0OworCXN0cnVjdCBhcmdsaXN0IHZhcmxpc3Q7CisJY2hhciAqKmFyZ3Y7CisJaW50IGFyZ2M7CisJY29uc3Qgc3RydWN0IHN0cmxpc3QgKnNwOworCXN0cnVjdCBjbWRlbnRyeSBjbWRlbnRyeTsKKwlzdHJ1Y3Qgam9iICpqcDsKKwljaGFyICpsYXN0YXJnOworCWNvbnN0IGNoYXIgKnBhdGg7CisJaW50IHNwY2xibHRpbjsKKwlpbnQgc3RhdHVzOworCWNoYXIgKipuYXJndjsKKwlzdHJ1Y3QgYnVpbHRpbmNtZCAqYmNtZDsKKwlzbWFsbGludCBjbWRfaXNfZXhlYzsKKwlzbWFsbGludCBwc2V1ZG92YXJmbGFnID0gMDsKKworCS8qIEZpcnN0IGV4cGFuZCB0aGUgYXJndW1lbnRzLiAqLworCVRSQUNFKCgiZXZhbGNvbW1hbmQoMHglbHgsICVkKSBjYWxsZWRcbiIsIChsb25nKWNtZCwgZmxhZ3MpKTsKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwliYWNrX2V4aXRzdGF0dXMgPSAwOworCisJY21kZW50cnkuY21kdHlwZSA9IENNREJVSUxUSU47CisJY21kZW50cnkudS5jbWQgPSAmbnVsbF9ibHRpbjsKKwl2YXJsaXN0Lmxhc3RwID0gJnZhcmxpc3QubGlzdDsKKwkqdmFybGlzdC5sYXN0cCA9IE5VTEw7CisJYXJnbGlzdC5sYXN0cCA9ICZhcmdsaXN0Lmxpc3Q7CisJKmFyZ2xpc3QubGFzdHAgPSBOVUxMOworCisJYXJnYyA9IDA7CisJaWYgKGNtZC0+bmNtZC5hcmdzKSB7CisJCWJjbWQgPSBmaW5kX2J1aWx0aW4oY21kLT5uY21kLmFyZ3MtPm5hcmcudGV4dCk7CisJCXBzZXVkb3ZhcmZsYWcgPSBiY21kICYmIElTX0JVSUxUSU5fQVNTSUdOKGJjbWQpOworCX0KKworCWZvciAoYXJncCA9IGNtZC0+bmNtZC5hcmdzOyBhcmdwOyBhcmdwID0gYXJncC0+bmFyZy5uZXh0KSB7CisJCXN0cnVjdCBzdHJsaXN0ICoqc3BwOworCisJCXNwcCA9IGFyZ2xpc3QubGFzdHA7CisJCWlmIChwc2V1ZG92YXJmbGFnICYmIGlzYXNzaWdubWVudChhcmdwLT5uYXJnLnRleHQpKQorCQkJZXhwYW5kYXJnKGFyZ3AsICZhcmdsaXN0LCBFWFBfVkFSVElMREUpOworCQllbHNlCisJCQlleHBhbmRhcmcoYXJncCwgJmFyZ2xpc3QsIEVYUF9GVUxMIHwgRVhQX1RJTERFKTsKKworCQlmb3IgKHNwID0gKnNwcDsgc3A7IHNwID0gc3AtPm5leHQpCisJCQlhcmdjKys7CisJfQorCisJYXJndiA9IG5hcmd2ID0gc3RhbGxvYyhzaXplb2YoY2hhciAqKSAqIChhcmdjICsgMSkpOworCWZvciAoc3AgPSBhcmdsaXN0Lmxpc3Q7IHNwOyBzcCA9IHNwLT5uZXh0KSB7CisJCVRSQUNFKCgiZXZhbGNvbW1hbmQgYXJnOiAlc1xuIiwgc3AtPnRleHQpKTsKKwkJKm5hcmd2KysgPSBzcC0+dGV4dDsKKwl9CisJKm5hcmd2ID0gTlVMTDsKKworCWxhc3RhcmcgPSBOVUxMOworCWlmIChpZmxhZyAmJiBmdW5jbmVzdCA9PSAwICYmIGFyZ2MgPiAwKQorCQlsYXN0YXJnID0gbmFyZ3ZbLTFdOworCisJcHJldmVycm91dF9mZCA9IDI7CisJZXhwcmVkaXIoY21kLT5uY21kLnJlZGlyZWN0KTsKKwlzdGF0dXMgPSByZWRpcmVjdHNhZmUoY21kLT5uY21kLnJlZGlyZWN0LCBSRURJUl9QVVNIIHwgUkVESVJfU0FWRUZEMik7CisKKwlwYXRoID0gdnBhdGgudmFyX3RleHQ7CisJZm9yIChhcmdwID0gY21kLT5uY21kLmFzc2lnbjsgYXJncDsgYXJncCA9IGFyZ3AtPm5hcmcubmV4dCkgeworCQlzdHJ1Y3Qgc3RybGlzdCAqKnNwcDsKKwkJY2hhciAqcDsKKworCQlzcHAgPSB2YXJsaXN0Lmxhc3RwOworCQlleHBhbmRhcmcoYXJncCwgJnZhcmxpc3QsIEVYUF9WQVJUSUxERSk7CisKKwkJLyoKKwkJICogTW9kaWZ5IHRoZSBjb21tYW5kIGxvb2t1cCBwYXRoLCBpZiBhIFBBVEg9IGFzc2lnbm1lbnQKKwkJICogaXMgcHJlc2VudAorCQkgKi8KKwkJcCA9ICgqc3BwKS0+dGV4dDsKKwkJaWYgKHZhcmNtcChwLCBwYXRoKSA9PSAwKQorCQkJcGF0aCA9IHA7CisJfQorCisJLyogUHJpbnQgdGhlIGNvbW1hbmQgaWYgeGZsYWcgaXMgc2V0LiAqLworCWlmICh4ZmxhZykgeworCQlpbnQgbjsKKwkJY29uc3QgY2hhciAqcCA9ICIgJXMiICsgMTsKKworCQlmZHByaW50ZihwcmV2ZXJyb3V0X2ZkLCBwLCBleHBhbmRzdHIocHM0dmFsKCkpKTsKKwkJc3AgPSB2YXJsaXN0Lmxpc3Q7CisJCWZvciAobiA9IDA7IG4gPCAyOyBuKyspIHsKKwkJCXdoaWxlIChzcCkgeworCQkJCWZkcHJpbnRmKHByZXZlcnJvdXRfZmQsIHAsIHNwLT50ZXh0KTsKKwkJCQlzcCA9IHNwLT5uZXh0OworCQkJCXAgPSAiICVzIjsKKwkJCX0KKwkJCXNwID0gYXJnbGlzdC5saXN0OworCQl9CisJCXNhZmVfd3JpdGUocHJldmVycm91dF9mZCwgIlxuIiwgMSk7CisJfQorCisJY21kX2lzX2V4ZWMgPSAwOworCXNwY2xibHRpbiA9IC0xOworCisJLyogTm93IGxvY2F0ZSB0aGUgY29tbWFuZC4gKi8KKwlpZiAoYXJnYykgeworCQljb25zdCBjaGFyICpvbGRwYXRoOworCQlpbnQgY21kX2ZsYWcgPSBET19FUlI7CisKKwkJcGF0aCArPSA1OworCQlvbGRwYXRoID0gcGF0aDsKKwkJZm9yICg7OykgeworCQkJZmluZF9jb21tYW5kKGFyZ3ZbMF0sICZjbWRlbnRyeSwgY21kX2ZsYWcsIHBhdGgpOworCQkJaWYgKGNtZGVudHJ5LmNtZHR5cGUgPT0gQ01EVU5LTk9XTikgeworCQkJCWZsdXNoX3N0ZG91dF9zdGRlcnIoKTsKKwkJCQlzdGF0dXMgPSAxMjc7CisJCQkJZ290byBiYWlsOworCQkJfQorCisJCQkvKiBpbXBsZW1lbnQgYmx0aW4gYW5kIGNvbW1hbmQgaGVyZSAqLworCQkJaWYgKGNtZGVudHJ5LmNtZHR5cGUgIT0gQ01EQlVJTFRJTikKKwkJCQlicmVhazsKKwkJCWlmIChzcGNsYmx0aW4gPCAwKQorCQkJCXNwY2xibHRpbiA9IElTX0JVSUxUSU5fU1BFQ0lBTChjbWRlbnRyeS51LmNtZCk7CisJCQlpZiAoY21kZW50cnkudS5jbWQgPT0gRVhFQ0NNRCkKKwkJCQljbWRfaXNfZXhlYyA9IDE7CisjaWYgRU5BQkxFX0FTSF9DTURDTUQKKwkJCWlmIChjbWRlbnRyeS51LmNtZCA9PSBDT01NQU5EQ01EKSB7CisJCQkJcGF0aCA9IG9sZHBhdGg7CisJCQkJbmFyZ3YgPSBwYXJzZV9jb21tYW5kX2FyZ3MoYXJndiwgJnBhdGgpOworCQkJCWlmICghbmFyZ3YpCisJCQkJCWJyZWFrOworCQkJCWFyZ2MgLT0gbmFyZ3YgLSBhcmd2OworCQkJCWFyZ3YgPSBuYXJndjsKKwkJCQljbWRfZmxhZyB8PSBET19OT0ZVTkM7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHN0YXR1cykgeworCQkvKiBXZSBoYXZlIGEgcmVkaXJlY3Rpb24gZXJyb3IuICovCisJCWlmIChzcGNsYmx0aW4gPiAwKQorCQkJcmFpc2VfZXhjZXB0aW9uKEVYRVJST1IpOworIGJhaWw6CisJCWV4aXRzdGF0dXMgPSBzdGF0dXM7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEV4ZWN1dGUgdGhlIGNvbW1hbmQuICovCisJc3dpdGNoIChjbWRlbnRyeS5jbWR0eXBlKSB7CisJZGVmYXVsdDogeworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hfTk9GT1JLCisvKiAoMSkgQlVHOiBpZiB2YXJpYWJsZXMgYXJlIHNldCwgd2UgbmVlZCB0byBmb3JrLCBvciBzYXZlL3Jlc3RvcmUgdGhlbQorICogICAgIGFyb3VuZCBydW5fbm9mb3JrX2FwcGxldCgpIGNhbGwuCisgKiAoMikgU2hvdWxkIHRoaXMgY2hlY2sgYWxzbyBiZSBkb25lIGluIGZvcmtzaGVsbCgpPworICogICAgIChwZXJoYXBzIGl0IHNob3VsZCwgc28gdGhhdCAiVkFSPVZBTCBub2ZvcmsiIGF0IGxlYXN0IGF2b2lkcyBleGVjLi4uKQorICovCisJCS8qIGZpbmRfY29tbWFuZCgpIGVuY29kZXMgYXBwbGV0X25vIGFzICgtMiAtIGFwcGxldF9ubykgKi8KKwkJaW50IGFwcGxldF9ubyA9ICgtIGNtZGVudHJ5LnUuaW5kZXggLSAyKTsKKwkJaWYgKGFwcGxldF9ubyA+PSAwICYmIEFQUExFVF9JU19OT0ZPUksoYXBwbGV0X25vKSkgeworCQkJbGlzdHNldHZhcih2YXJsaXN0Lmxpc3QsIFZFWFBPUlR8VlNUQUNLKTsKKwkJCS8qIHJ1biA8YXBwbGV0Pl9tYWluKCkgKi8KKwkJCWV4aXRzdGF0dXMgPSBydW5fbm9mb3JrX2FwcGxldChhcHBsZXRfbm8sIGFyZ3YpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQkvKiBDYW4gd2UgYXZvaWQgZm9ya2luZyBvZmY/IEZvciBleGFtcGxlLCB2ZXJ5IGxhc3QgY29tbWFuZAorCQkgKiBpbiBhIHNjcmlwdCBvciBhIHN1YnNoZWxsIGRvZXMgbm90IG5lZWQgZm9ya2luZywKKwkJICogd2UgY2FuIGp1c3QgZXhlYyBpdC4KKwkJICovCisJCWlmICghKGZsYWdzICYgRVZfRVhJVCkgfHwgbWF5X2hhdmVfdHJhcHMpIHsKKwkJCS8qIE5vLCBmb3JraW5nIG9mZiBhIGNoaWxkIGlzIG5lY2Vzc2FyeSAqLworCQkJSU5UX09GRjsKKwkJCWpwID0gbWFrZWpvYigvKmNtZCwqLyAxKTsKKwkJCWlmIChmb3Jrc2hlbGwoanAsIGNtZCwgRk9SS19GRykgIT0gMCkgeworCQkJCS8qIHBhcmVudCAqLworCQkJCWV4aXRzdGF0dXMgPSB3YWl0Zm9yam9iKGpwKTsKKwkJCQlJTlRfT047CisJCQkJVFJBQ0UoKCJmb3JrZWQgY2hpbGQgZXhpdGVkIHdpdGggJWRcbiIsIGV4aXRzdGF0dXMpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGNoaWxkICovCisJCQlGT1JDRV9JTlRfT047CisJCQkvKiBmYWxsIHRocm91Z2ggdG8gZXhlYydpbmcgZXh0ZXJuYWwgcHJvZ3JhbSAqLworCQl9CisJCWxpc3RzZXR2YXIodmFybGlzdC5saXN0LCBWRVhQT1JUfFZTVEFDSyk7CisJCXNoZWxsZXhlYyhhcmd2LCBwYXRoLCBjbWRlbnRyeS51LmluZGV4KTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0gLyogZGVmYXVsdCAqLworCWNhc2UgQ01EQlVJTFRJTjoKKwkJY21kZW52aXJvbiA9IHZhcmxpc3QubGlzdDsKKwkJaWYgKGNtZGVudmlyb24pIHsKKwkJCXN0cnVjdCBzdHJsaXN0ICpsaXN0ID0gY21kZW52aXJvbjsKKwkJCWludCBpID0gVk5PU0VUOworCQkJaWYgKHNwY2xibHRpbiA+IDAgfHwgYXJnYyA9PSAwKSB7CisJCQkJaSA9IDA7CisJCQkJaWYgKGNtZF9pc19leGVjICYmIGFyZ2MgPiAxKQorCQkJCQlpID0gVkVYUE9SVDsKKwkJCX0KKwkJCWxpc3RzZXR2YXIobGlzdCwgaSk7CisJCX0KKwkJLyogVGlnaHQgbG9vcCB3aXRoIGJ1aWx0aW5zIG9ubHk6CisJCSAqICJ3aGlsZSBraWxsIC0wICRjaGlsZDsgZG8gdHJ1ZTsgZG9uZSIKKwkJICogd2lsbCBuZXZlciBleGl0IGV2ZW4gaWYgJGNoaWxkIGRpZWQsIHVubGVzcyB3ZSBkbyB0aGlzCisJCSAqIHRvIHJlYXAgdGhlIHpvbWJpZSBhbmQgbWFrZSBraWxsIGRldGVjdCB0aGF0IGl0J3MgZ29uZTogKi8KKwkJZG93YWl0KERPV0FJVF9OT05CTE9DSywgTlVMTCk7CisKKwkJaWYgKGV2YWxibHRpbihjbWRlbnRyeS51LmNtZCwgYXJnYywgYXJndikpIHsKKwkJCWludCBleGl0X3N0YXR1czsKKwkJCWludCBpID0gZXhjZXB0aW9uX3R5cGU7CisJCQlpZiAoaSA9PSBFWEVYSVQpCisJCQkJZ290byByYWlzZTsKKwkJCWV4aXRfc3RhdHVzID0gMjsKKwkJCWlmIChpID09IEVYSU5UKQorCQkJCWV4aXRfc3RhdHVzID0gMTI4ICsgU0lHSU5UOworCQkJaWYgKGkgPT0gRVhTSUcpCisJCQkJZXhpdF9zdGF0dXMgPSAxMjggKyBwZW5kaW5nX3NpZzsKKwkJCWV4aXRzdGF0dXMgPSBleGl0X3N0YXR1czsKKwkJCWlmIChpID09IEVYSU5UIHx8IHNwY2xibHRpbiA+IDApIHsKKyByYWlzZToKKwkJCQlsb25nam1wKGV4Y2VwdGlvbl9oYW5kbGVyLT5sb2MsIDEpOworCQkJfQorCQkJRk9SQ0VfSU5UX09OOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDTURGVU5DVElPTjoKKwkJbGlzdHNldHZhcih2YXJsaXN0Lmxpc3QsIDApOworCQkvKiBTZWUgYWJvdmUgZm9yIHRoZSByYXRpb25hbGUgKi8KKwkJZG93YWl0KERPV0FJVF9OT05CTE9DSywgTlVMTCk7CisJCWlmIChldmFsZnVuKGNtZGVudHJ5LnUuZnVuYywgYXJnYywgYXJndiwgZmxhZ3MpKQorCQkJZ290byByYWlzZTsKKwkJYnJlYWs7CisKKwl9IC8qIHN3aXRjaCAqLworCisgb3V0OgorCXBvcHJlZGlyKC8qZHJvcDoqLyBjbWRfaXNfZXhlYywgLypyZXN0b3JlOiovIGNtZF9pc19leGVjKTsKKwlpZiAobGFzdGFyZykgeworCQkvKiBkc2w6IEkgdGhpbmsgdGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHN1cHBvcnQKKwkJICogJ18nIGluICd2aScgY29tbWFuZCBtb2RlIGR1cmluZyBsaW5lIGVkaXRpbmcuLi4KKwkJICogSG93ZXZlciBJIGltcGxlbWVudGVkIHRoYXQgd2l0aGluIGxpYmVkaXQgaXRzZWxmLgorCQkgKi8KKwkJc2V0dmFyKCJfIiwgbGFzdGFyZywgMCk7CisJfQorCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCitzdGF0aWMgaW50CitldmFsYmx0aW4oY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnZvbGF0aWxlIHNhdmVjbWRuYW1lOworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCWludCBpOworCisJc2F2ZWNtZG5hbWUgPSBjb21tYW5kbmFtZTsKKwlpID0gc2V0am1wKGptcGxvYy5sb2MpOworCWlmIChpKQorCQlnb3RvIGNtZGRvbmU7CisJc2F2ZWhhbmRsZXIgPSBleGNlcHRpb25faGFuZGxlcjsKKwlleGNlcHRpb25faGFuZGxlciA9ICZqbXBsb2M7CisJY29tbWFuZG5hbWUgPSBhcmd2WzBdOworCWFyZ3B0ciA9IGFyZ3YgKyAxOworCW9wdHB0ciA9IE5VTEw7ICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBuZXh0b3B0ICovCisJZXhpdHN0YXR1cyA9ICgqY21kLT5idWlsdGluKShhcmdjLCBhcmd2KTsKKwlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7CisgY21kZG9uZToKKwlleGl0c3RhdHVzIHw9IGZlcnJvcihzdGRvdXQpOworCWNsZWFyZXJyKHN0ZG91dCk7CisJY29tbWFuZG5hbWUgPSBzYXZlY21kbmFtZTsKKwlleGNlcHRpb25faGFuZGxlciA9IHNhdmVoYW5kbGVyOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQKK2dvb2RuYW1lKGNvbnN0IGNoYXIgKnApCit7CisJcmV0dXJuIGVuZG9mbmFtZShwKVswXSA9PSAnXDAnOworfQorCisKKy8qCisgKiBTZWFyY2ggZm9yIGEgY29tbWFuZC4gIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB3ZSBmb3JrIHNvIHRoYXQgdGhlCisgKiBsb2NhdGlvbiBvZiB0aGUgY29tbWFuZCB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgcGFyZW50IGFzIHdlbGwgYXMKKyAqIHRoZSBjaGlsZC4gIFRoZSBjaGVjayBmb3IgImdvb2RuYW1lIiBpcyBhbiBvdmVybHkgY29uc2VydmF0aXZlCisgKiBjaGVjayB0aGF0IHRoZSBuYW1lIHdpbGwgbm90IGJlIHN1YmplY3QgdG8gZXhwYW5zaW9uLgorICovCitzdGF0aWMgdm9pZAorcHJlaGFzaCh1bmlvbiBub2RlICpuKQoreworCXN0cnVjdCBjbWRlbnRyeSBlbnRyeTsKKworCWlmIChuLT50eXBlID09IE5DTUQgJiYgbi0+bmNtZC5hcmdzICYmIGdvb2RuYW1lKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0KSkKKwkJZmluZF9jb21tYW5kKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0LCAmZW50cnksIDAsIHBhdGh2YWwoKSk7Cit9CisKKworLyogPT09PT09PT09PT09IEJ1aWx0aW4gY29tbWFuZHMKKyAqCisgKiBCdWlsdGluIGNvbW1hbmRzIHdob3NlIGZ1bmN0aW9ucyBhcmUgY2xvc2VseSB0aWVkIHRvIGV2YWx1YXRpb24KKyAqIGFyZSBpbXBsZW1lbnRlZCBoZXJlLgorICovCisKKy8qCisgKiBIYW5kbGUgYnJlYWsgYW5kIGNvbnRpbnVlIGNvbW1hbmRzLiAgQnJlYWssIGNvbnRpbnVlLCBhbmQgcmV0dXJuIGFyZQorICogYWxsIGhhbmRsZWQgYnkgc2V0dGluZyB0aGUgZXZhbHNraXAgZmxhZy4gIFRoZSBldmFsdWF0aW9uIHJvdXRpbmVzCisgKiBhYm92ZSBhbGwgY2hlY2sgdGhpcyBmbGFnLCBhbmQgaWYgaXQgaXMgc2V0IHRoZXkgc3RhcnQgc2tpcHBpbmcKKyAqIGNvbW1hbmRzIHJhdGhlciB0aGFuIGV4ZWN1dGluZyB0aGVtLiAgVGhlIHZhcmlhYmxlIHNraXBjb3VudCBpcworICogdGhlIG51bWJlciBvZiBsb29wcyB0byBicmVhay9jb250aW51ZSwgb3IgdGhlIG51bWJlciBvZiBmdW5jdGlvbgorICogbGV2ZWxzIHRvIHJldHVybi4gIChUaGUgbGF0dGVyIGlzIGFsd2F5cyAxLikgIEl0IHNob3VsZCBwcm9iYWJseQorICogYmUgYW4gZXJyb3IgdG8gYnJlYWsgb3V0IG9mIG1vcmUgbG9vcHMgdGhhbiBleGlzdCwgYnV0IGl0IGlzbid0CisgKiBpbiB0aGUgc3RhbmRhcmQgc2hlbGwgc28gd2UgZG9uJ3QgbWFrZSBpdCBvbmUgaGVyZS4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2JyZWFrY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG4gPSBhcmd2WzFdID8gbnVtYmVyKGFyZ3ZbMV0pIDogMTsKKworCWlmIChuIDw9IDApCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKG1zZ19pbGxudW0sIGFyZ3ZbMV0pOworCWlmIChuID4gbG9vcG5lc3QpCisJCW4gPSBsb29wbmVzdDsKKwlpZiAobiA+IDApIHsKKwkJZXZhbHNraXAgPSAoKiphcmd2ID09ICdjJykgPyBTS0lQQ09OVCA6IFNLSVBCUkVBSzsKKwkJc2tpcGNvdW50ID0gbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09IGlucHV0LmMKKyAqCisgKiBUaGlzIGltcGxlbWVudHMgdGhlIGlucHV0IHJvdXRpbmVzIHVzZWQgYnkgdGhlIHBhcnNlci4KKyAqLworCitlbnVtIHsKKwlJTlBVVF9QVVNIX0ZJTEUgPSAxLAorCUlOUFVUX05PRklMRV9PSyA9IDIsCit9OworCitzdGF0aWMgc21hbGxpbnQgY2hlY2trd2Q7CisvKiB2YWx1ZXMgb2YgY2hlY2trd2QgdmFyaWFibGUgKi8KKyNkZWZpbmUgQ0hLQUxJQVMgICAgICAgIDB4MQorI2RlZmluZSBDSEtLV0QgICAgICAgICAgMHgyCisjZGVmaW5lIENIS05MICAgICAgICAgICAweDQKKworLyoKKyAqIFB1c2ggYSBzdHJpbmcgYmFjayBvbnRvIHRoZSBpbnB1dCBhdCB0aGlzIGN1cnJlbnQgcGFyc2VmaWxlIGxldmVsLgorICogV2UgaGFuZGxlIGFsaWFzZXMgdGhpcyB3YXkuCisgKi8KKyNpZiAhRU5BQkxFX0FTSF9BTElBUworI2RlZmluZSBwdXNoc3RyaW5nKHMsIGFwKSBwdXNoc3RyaW5nKHMpCisjZW5kaWYKK3N0YXRpYyB2b2lkCitwdXNoc3RyaW5nKGNoYXIgKnMsIHN0cnVjdCBhbGlhcyAqYXApCit7CisJc3RydWN0IHN0cnB1c2ggKnNwOworCWludCBsZW47CisKKwlsZW4gPSBzdHJsZW4ocyk7CisJSU5UX09GRjsKKwlpZiAoZ19wYXJzZWZpbGUtPnN0cnB1c2gpIHsKKwkJc3AgPSBja3phbGxvYyhzaXplb2YoKnNwKSk7CisJCXNwLT5wcmV2ID0gZ19wYXJzZWZpbGUtPnN0cnB1c2g7CisJfSBlbHNlIHsKKwkJc3AgPSAmKGdfcGFyc2VmaWxlLT5iYXNlc3RycHVzaCk7CisJfQorCWdfcGFyc2VmaWxlLT5zdHJwdXNoID0gc3A7CisJc3AtPnByZXZfc3RyaW5nID0gZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGM7CisJc3AtPnByZXZfbGVmdF9pbl9saW5lID0gZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZTsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJc3AtPmFwID0gYXA7CisJaWYgKGFwKSB7CisJCWFwLT5mbGFnIHw9IEFMSUFTSU5VU0U7CisJCXNwLT5zdHJpbmcgPSBzOworCX0KKyNlbmRpZgorCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjID0gczsKKwlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID0gbGVuOworCUlOVF9PTjsKK30KKworc3RhdGljIHZvaWQKK3BvcHN0cmluZyh2b2lkKQoreworCXN0cnVjdCBzdHJwdXNoICpzcCA9IGdfcGFyc2VmaWxlLT5zdHJwdXNoOworCisJSU5UX09GRjsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJaWYgKHNwLT5hcCkgeworCQlpZiAoZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGNbLTFdID09ICcgJworCQkgfHwgZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGNbLTFdID09ICdcdCcKKwkJKSB7CisJCQljaGVja2t3ZCB8PSBDSEtBTElBUzsKKwkJfQorCQlpZiAoc3AtPnN0cmluZyAhPSBzcC0+YXAtPnZhbCkgeworCQkJZnJlZShzcC0+c3RyaW5nKTsKKwkJfQorCQlzcC0+YXAtPmZsYWcgJj0gfkFMSUFTSU5VU0U7CisJCWlmIChzcC0+YXAtPmZsYWcgJiBBTElBU0RFQUQpIHsKKwkJCXVuYWxpYXMoc3AtPmFwLT5uYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjID0gc3AtPnByZXZfc3RyaW5nOworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPSBzcC0+cHJldl9sZWZ0X2luX2xpbmU7CisJZ19wYXJzZWZpbGUtPnN0cnB1c2ggPSBzcC0+cHJldjsKKwlpZiAoc3AgIT0gJihnX3BhcnNlZmlsZS0+YmFzZXN0cnB1c2gpKQorCQlmcmVlKHNwKTsKKwlJTlRfT047Cit9CisKKy8vRklYTUU6IEJBU0hfQ09NUEFUIHdpdGggIi4uLiYiIGRvZXMgVFdPIHB1bmdldGMoKToKKy8vaXQgcGVla3Mgd2hldGhlciBpdCBpcyAmPiwgYW5kIHRoZW4gcHVzaGVzIGJhY2sgYm90aCBjaGFycy4KKy8vVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBzYXZlIGxhc3QgKm5leHRfdG9fcGdldGMgdG8gYnVmWzBdCisvL3RvIG1ha2UgdHdvIHB1bmdldGMoKSByZWxpYWJsZS4gQ3VycmVudGx5LAorLy8gcGdldGMgKG91dCBvZiBidWY6IGRvZXMgcHJlYWRmZCksIHBnZXRjLCBwdW5nZXRjLCBwdW5nZXRjIHdvbid0IHdvcmsuLi4KK3N0YXRpYyBpbnQKK3ByZWFkZmQodm9pZCkKK3sKKwlpbnQgbnI7CisJY2hhciAqYnVmID0gZ19wYXJzZWZpbGUtPmJ1ZjsKKworCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjID0gYnVmOworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKyByZXRyeToKKwlpZiAoIWlmbGFnIHx8IGdfcGFyc2VmaWxlLT5wZl9mZCAhPSBTVERJTl9GSUxFTk8pCisJCW5yID0gbm9uYmxvY2tfaW1tdW5lX3JlYWQoZ19wYXJzZWZpbGUtPnBmX2ZkLCBidWYsIElCVUZTSVogLSAxLCAvKmxvb3Bfb25fRUlOVFI6Ki8gMSk7CisJZWxzZSB7CisJCWludCB0aW1lb3V0ID0gLTE7CisjIGlmIEVOQUJMRV9BU0hfSURMRV9USU1FT1VUCisJCWlmIChpZmxhZykgeworCQkJY29uc3QgY2hhciAqdG1vdXRfdmFyID0gbG9va3VwdmFyKCJUTU9VVCIpOworCQkJaWYgKHRtb3V0X3ZhcikgeworCQkJCXRpbWVvdXQgPSBhdG9pKHRtb3V0X3ZhcikgKiAxMDAwOworCQkJCWlmICh0aW1lb3V0IDw9IDApCisJCQkJCXRpbWVvdXQgPSAtMTsKKwkJCX0KKwkJfQorIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCQlsaW5lX2lucHV0X3N0YXRlLT5wYXRoX2xvb2t1cCA9IHBhdGh2YWwoKTsKKyMgZW5kaWYKKwkJLyogVW5pY29kZSBzdXBwb3J0IHNob3VsZCBiZSBhY3RpdmF0ZWQgZXZlbiBpZiBMQU5HIGlzIHNldAorCQkgKiBfZHVyaW5nXyBzaGVsbCBleGVjdXRpb24sIG5vdCBvbmx5IGlmIGl0IHdhcyBzZXQgd2hlbgorCQkgKiBzaGVsbCB3YXMgc3RhcnRlZC4gVGhlcmVmb3JlLCByZS1jaGVjayBMQU5HIGV2ZXJ5IHRpbWU6CisJCSAqLworCQlyZWluaXRfdW5pY29kZShsb29rdXB2YXIoIkxBTkciKSk7CisJCW5yID0gcmVhZF9saW5lX2lucHV0KGxpbmVfaW5wdXRfc3RhdGUsIGNtZGVkaXRfcHJvbXB0LCBidWYsIElCVUZTSVosIHRpbWVvdXQpOworCQlpZiAobnIgPT0gMCkgeworCQkJLyogQ3RybCtDIHByZXNzZWQgKi8KKwkJCWlmICh0cmFwW1NJR0lOVF0pIHsKKwkJCQlidWZbMF0gPSAnXG4nOworCQkJCWJ1ZlsxXSA9ICdcMCc7CisJCQkJcmFpc2UoU0lHSU5UKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJaWYgKG5yIDwgMCkgeworCQkJaWYgKGVycm5vID09IDApIHsKKwkJCQkvKiBDdHJsK0QgcHJlc3NlZCAqLworCQkJCW5yID0gMDsKKwkJCX0KKyMgaWYgRU5BQkxFX0FTSF9JRExFX1RJTUVPVVQKKwkJCWVsc2UgaWYgKGVycm5vID09IEVBR0FJTiAmJiB0aW1lb3V0ID4gMCkgeworCQkJCXByaW50ZigiXDAwN3RpbWVkIG91dCB3YWl0aW5nIGZvciBpbnB1dDogYXV0by1sb2dvdXRcbiIpOworCQkJCWV4aXRzaGVsbCgpOworCQkJfQorIyBlbmRpZgorCQl9CisJfQorI2Vsc2UKKwluciA9IG5vbmJsb2NrX2ltbXVuZV9yZWFkKGdfcGFyc2VmaWxlLT5wZl9mZCwgYnVmLCBJQlVGU0laIC0gMSwgLypsb29wX29uX0VJTlRSOiovIDEpOworI2VuZGlmCisKKyNpZiAwIC8qIGRpc2FibGVkOiBub25ibG9ja19pbW11bmVfcmVhZCgpIGhhbmRsZXMgdGhpcyBwcm9ibGVtICovCisJaWYgKG5yIDwgMCkgeworCQlpZiAocGFyc2VmaWxlLT5mZCA9PSAwICYmIGVycm5vID09IEVXT1VMREJMT0NLKSB7CisJCQlpbnQgZmxhZ3MgPSBmY250bCgwLCBGX0dFVEZMKTsKKwkJCWlmIChmbGFncyA+PSAwICYmIChmbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCQkJZmxhZ3MgJj0gfk9fTk9OQkxPQ0s7CisJCQkJaWYgKGZjbnRsKDAsIEZfU0VURkwsIGZsYWdzKSA+PSAwKSB7CisJCQkJCW91dDJzdHIoInNoOiB0dXJuaW5nIG9mZiBOREVMQVkgbW9kZVxuIik7CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIG5yOworfQorCisvKgorICogUmVmaWxsIHRoZSBpbnB1dCBidWZmZXIgYW5kIHJldHVybiB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXI6CisgKgorICogMSkgSWYgYSBzdHJpbmcgd2FzIHB1c2hlZCBiYWNrIG9uIHRoZSBpbnB1dCwgcG9wIGl0OworICogMikgSWYgYW4gRU9GIHdhcyBwdXNoZWQgYmFjayAoZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA8IC1CSUdOVU0pCisgKiAgICBvciB3ZSBhcmUgcmVhZGluZyBmcm9tIGEgc3RyaW5nIHNvIHdlIGNhbid0IHJlZmlsbCB0aGUgYnVmZmVyLAorICogICAgcmV0dXJuIEVPRi4KKyAqIDMpIElmIHRoZXJlIGlzIG1vcmUgc3R1ZmYgaW4gdGhpcyBidWZmZXIsIHVzZSBpdCBlbHNlIGNhbGwgcmVhZCB0byBmaWxsIGl0LgorICogNCkgUHJvY2VzcyBpbnB1dCB1cCB0byB0aGUgbmV4dCBuZXdsaW5lLCBkZWxldGluZyBudWwgY2hhcmFjdGVycy4KKyAqLworLy8jZGVmaW5lIHBnZXRjX2RlYnVnKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorI2RlZmluZSBwZ2V0Y19kZWJ1ZyguLi4pICgodm9pZCkwKQorc3RhdGljIGludAorcHJlYWRidWZmZXIodm9pZCkKK3sKKwljaGFyICpxOworCWludCBtb3JlOworCisJd2hpbGUgKGdfcGFyc2VmaWxlLT5zdHJwdXNoKSB7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCQlpZiAoZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9PSAtMQorCQkgJiYgZ19wYXJzZWZpbGUtPnN0cnB1c2gtPmFwCisJCSAmJiBnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Y1stMV0gIT0gJyAnCisJCSAmJiBnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Y1stMV0gIT0gJ1x0JworCQkpIHsKKwkJCXBnZXRjX2RlYnVnKCJwcmVhZGJ1ZmZlciBQRU9BIik7CisJCQlyZXR1cm4gUEVPQTsKKwkJfQorI2VuZGlmCisJCXBvcHN0cmluZygpOworCQkvKiB0cnkgInBnZXRjIiBub3c6ICovCisJCXBnZXRjX2RlYnVnKCJwcmVhZGJ1ZmZlciBpbnRlcm5hbCBwZ2V0YyBhdCAlZDolcCclcyciLAorCQkJCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUsCisJCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMsCisJCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMpOworCQlpZiAoLS1nX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID49IDApCisJCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpKCpnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YysrKTsKKwl9CisJLyogb24gYm90aCBicmFuY2hlcyBhYm92ZSBnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lIDwgMC4KKwkgKiAicGdldGMiIG5lZWRzIHJlZmlsbGluZy4KKwkgKi8KKworCS8qIC05MCBpcyBvdXIgLUJJR05VTS4gQmVsb3cgd2UgdXNlIC05OSB0byBtYXJrICJFT0Ygb24gcmVhZCIsCisJICogcHVuZ2V0YygpIG1heSBpbmNyZW1lbnQgaXQgYSBmZXcgdGltZXMuCisJICogQXNzdW1pbmcgaXQgd29uJ3QgaW5jcmVtZW50IGl0IHRvIGxlc3MgdGhhbiAtOTAuCisJICovCisJaWYgKGdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPCAtOTAgfHwgZ19wYXJzZWZpbGUtPmJ1ZiA9PSBOVUxMKSB7CisJCXBnZXRjX2RlYnVnKCJwcmVhZGJ1ZmZlciBQRU9GMSIpOworCQkvKiBldmVuIGluIGZhaWx1cmUga2VlcCBsZWZ0X2luX2xpbmUgYW5kIG5leHRfdG9fcGdldGMKKwkJICogaW4gbG9jayBzdGVwLCBmb3IgY29ycmVjdCBtdWx0aS1sYXllciBwdW5nZXRjLgorCQkgKiBsZWZ0X2luX2xpbmUgd2FzIGRlY3JlbWVudGVkIGJlZm9yZSBwcmVhZGJ1ZmZlcigpLAorCQkgKiBtdXN0IGluYyBuZXh0X3RvX3BnZXRjOiAqLworCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YysrOworCQlyZXR1cm4gUEVPRjsKKwl9CisKKwltb3JlID0gZ19wYXJzZWZpbGUtPmxlZnRfaW5fYnVmZmVyOworCWlmIChtb3JlIDw9IDApIHsKKwkJZmx1c2hfc3Rkb3V0X3N0ZGVycigpOworIGFnYWluOgorCQltb3JlID0gcHJlYWRmZCgpOworCQlpZiAobW9yZSA8PSAwKSB7CisJCQkvKiBkb24ndCB0cnkgcmVhZGluZyBhZ2FpbiAqLworCQkJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9IC05OTsKKwkJCXBnZXRjX2RlYnVnKCJwcmVhZGJ1ZmZlciBQRU9GMiIpOworCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMrKzsKKwkJCXJldHVybiBQRU9GOworCQl9CisJfQorCisJLyogRmluZCBvdXQgd2hlcmUncyB0aGUgZW5kIG9mIGxpbmUuCisJICogU2V0IGdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUKKwkgKiBhbmQgZ19wYXJzZWZpbGUtPmxlZnRfaW5fYnVmZmVyIGFjb3JkaW5nbHkuCisJICogTlVMIGNoYXJzIGFyZSBkZWxldGVkLgorCSAqLworCXEgPSBnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YzsKKwlmb3IgKDs7KSB7CisJCWNoYXIgYzsKKworCQltb3JlLS07CisKKwkJYyA9ICpxOworCQlpZiAoYyA9PSAnXDAnKSB7CisJCQltZW1tb3ZlKHEsIHEgKyAxLCBtb3JlKTsKKwkJfSBlbHNlIHsKKwkJCXErKzsKKwkJCWlmIChjID09ICdcbicpIHsKKwkJCQlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID0gcSAtIGdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChtb3JlIDw9IDApIHsKKwkJCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPSBxIC0gZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMgLSAxOworCQkJaWYgKGdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPCAwKQorCQkJCWdvdG8gYWdhaW47CisJCQlicmVhazsKKwkJfQorCX0KKwlnX3BhcnNlZmlsZS0+bGVmdF9pbl9idWZmZXIgPSBtb3JlOworCisJaWYgKHZmbGFnKSB7CisJCWNoYXIgc2F2ZSA9ICpxOworCQkqcSA9ICdcMCc7CisJCW91dDJzdHIoZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMpOworCQkqcSA9IHNhdmU7CisJfQorCisJcGdldGNfZGVidWcoInByZWFkYnVmZmVyIGF0ICVkOiVwJyVzJyIsCisJCQlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lLAorCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMsCisJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Yyk7CisJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSpnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YysrOworfQorCisjZGVmaW5lIHBnZXRjX2FzX21hY3JvKCkgXAorCSgtLWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPj0gMCBcCisJPyAodW5zaWduZWQgY2hhcikqZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMrKyBcCisJOiBwcmVhZGJ1ZmZlcigpIFwKKwkpCisKK3N0YXRpYyBpbnQKK3BnZXRjKHZvaWQpCit7CisJcGdldGNfZGVidWcoInBnZXRjX2Zhc3QgYXQgJWQ6JXAnJXMnIiwKKwkJCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUsCisJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YywKKwkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKTsKKwlyZXR1cm4gcGdldGNfYXNfbWFjcm8oKTsKK30KKworI2lmIEVOQUJMRV9BU0hfT1BUSU1JWkVfRk9SX1NJWkUKKyMgZGVmaW5lIHBnZXRjX2Zhc3QoKSBwZ2V0YygpCisjZWxzZQorIyBkZWZpbmUgcGdldGNfZmFzdCgpIHBnZXRjX2FzX21hY3JvKCkKKyNlbmRpZgorCisjaWYgRU5BQkxFX0FTSF9BTElBUworc3RhdGljIGludAorcGdldGNfd2l0aG91dF9QRU9BKHZvaWQpCit7CisJaW50IGM7CisJZG8geworCQlwZ2V0Y19kZWJ1ZygicGdldGNfZmFzdCBhdCAlZDolcCclcyciLAorCQkJCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUsCisJCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMsCisJCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMpOworCQljID0gcGdldGNfZmFzdCgpOworCX0gd2hpbGUgKGMgPT0gUEVPQSk7CisJcmV0dXJuIGM7Cit9CisjZWxzZQorIyBkZWZpbmUgcGdldGNfd2l0aG91dF9QRU9BKCkgcGdldGMoKQorI2VuZGlmCisKKy8qCisgKiBSZWFkIGEgbGluZSBmcm9tIHRoZSBzY3JpcHQuCisgKi8KK3N0YXRpYyBjaGFyICoKK3BmZ2V0cyhjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCWNoYXIgKnAgPSBsaW5lOworCWludCBubGVmdCA9IGxlbjsKKwlpbnQgYzsKKworCXdoaWxlICgtLW5sZWZ0ID4gMCkgeworCQljID0gcGdldGNfd2l0aG91dF9QRU9BKCk7CisJCWlmIChjID09IFBFT0YpIHsKKwkJCWlmIChwID09IGxpbmUpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJfQorCQkqcCsrID0gYzsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwkqcCA9ICdcMCc7CisJcmV0dXJuIGxpbmU7Cit9CisKKy8qCisgKiBVbmRvIHRoZSBsYXN0IGNhbGwgdG8gcGdldGMuICBPbmx5IG9uZSBjaGFyYWN0ZXIgbWF5IGJlIHB1c2hlZCBiYWNrLgorICogUEVPRiBtYXkgYmUgcHVzaGVkIGJhY2suCisgKi8KK3N0YXRpYyB2b2lkCitwdW5nZXRjKHZvaWQpCit7CisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSsrOworCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjLS07CisJcGdldGNfZGVidWcoInB1c2hlZCBiYWNrIHRvICVkOiVwJyVzJyIsCisJCQlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lLAorCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMsCisJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Yyk7Cit9CisKKy8qCisgKiBUbyBoYW5kbGUgdGhlICIuIiBjb21tYW5kLCBhIHN0YWNrIG9mIGlucHV0IGZpbGVzIGlzIHVzZWQuICBQdXNoZmlsZQorICogYWRkcyBhIG5ldyBlbnRyeSB0byB0aGUgc3RhY2sgYW5kIHBvcGZpbGUgcmVzdG9yZXMgdGhlIHByZXZpb3VzIGxldmVsLgorICovCitzdGF0aWMgdm9pZAorcHVzaGZpbGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGFyc2VmaWxlICpwZjsKKworCXBmID0gY2t6YWxsb2Moc2l6ZW9mKCpwZikpOworCXBmLT5wcmV2ID0gZ19wYXJzZWZpbGU7CisJcGYtPnBmX2ZkID0gLTE7CisJLypwZi0+c3RycHVzaCA9IE5VTEw7IC0gY2t6YWxsb2MgZGlkIGl0ICovCisJLypwZi0+YmFzZXN0cnB1c2gucHJldiA9IE5VTEw7Ki8KKwlnX3BhcnNlZmlsZSA9IHBmOworfQorCitzdGF0aWMgdm9pZAorcG9wZmlsZSh2b2lkKQoreworCXN0cnVjdCBwYXJzZWZpbGUgKnBmID0gZ19wYXJzZWZpbGU7CisKKwlJTlRfT0ZGOworCWlmIChwZi0+cGZfZmQgPj0gMCkKKwkJY2xvc2UocGYtPnBmX2ZkKTsKKwlmcmVlKHBmLT5idWYpOworCXdoaWxlIChwZi0+c3RycHVzaCkKKwkJcG9wc3RyaW5nKCk7CisJZ19wYXJzZWZpbGUgPSBwZi0+cHJldjsKKwlmcmVlKHBmKTsKKwlJTlRfT047Cit9CisKKy8qCisgKiBSZXR1cm4gdG8gdG9wIGxldmVsLgorICovCitzdGF0aWMgdm9pZAorcG9wYWxsZmlsZXModm9pZCkKK3sKKwl3aGlsZSAoZ19wYXJzZWZpbGUgIT0gJmJhc2VwZikKKwkJcG9wZmlsZSgpOworfQorCisvKgorICogQ2xvc2UgdGhlIGZpbGUocykgdGhhdCB0aGUgc2hlbGwgaXMgcmVhZGluZyBjb21tYW5kcyBmcm9tLiAgQ2FsbGVkCisgKiBhZnRlciBhIGZvcmsgaXMgZG9uZS4KKyAqLworc3RhdGljIHZvaWQKK2Nsb3Nlc2NyaXB0KHZvaWQpCit7CisJcG9wYWxsZmlsZXMoKTsKKwlpZiAoZ19wYXJzZWZpbGUtPnBmX2ZkID4gMCkgeworCQljbG9zZShnX3BhcnNlZmlsZS0+cGZfZmQpOworCQlnX3BhcnNlZmlsZS0+cGZfZmQgPSAwOworCX0KK30KKworLyoKKyAqIExpa2Ugc2V0aW5wdXRmaWxlLCBidXQgdGFrZXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IuICBDYWxsIHRoaXMgd2l0aAorICogaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRpbnB1dGZkKGludCBmZCwgaW50IHB1c2gpCit7CisJY2xvc2Vfb25fZXhlY19vbihmZCk7CisJaWYgKHB1c2gpIHsKKwkJcHVzaGZpbGUoKTsKKwkJZ19wYXJzZWZpbGUtPmJ1ZiA9IE5VTEw7CisJfQorCWdfcGFyc2VmaWxlLT5wZl9mZCA9IGZkOworCWlmIChnX3BhcnNlZmlsZS0+YnVmID09IE5VTEwpCisJCWdfcGFyc2VmaWxlLT5idWYgPSBja21hbGxvYyhJQlVGU0laKTsKKwlnX3BhcnNlZmlsZS0+bGVmdF9pbl9idWZmZXIgPSAwOworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPSAwOworCWdfcGFyc2VmaWxlLT5saW5ubyA9IDE7Cit9CisKKy8qCisgKiBTZXQgdGhlIGlucHV0IHRvIHRha2UgaW5wdXQgZnJvbSBhIGZpbGUuICBJZiBwdXNoIGlzIHNldCwgcHVzaCB0aGUKKyAqIG9sZCBpbnB1dCBvbnRvIHRoZSBzdGFjayBmaXJzdC4KKyAqLworc3RhdGljIGludAorc2V0aW5wdXRmaWxlKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZmxhZ3MpCit7CisJaW50IGZkOworCWludCBmZDI7CisKKwlJTlRfT0ZGOworCWZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJaWYgKGZsYWdzICYgSU5QVVRfTk9GSUxFX09LKQorCQkJZ290byBvdXQ7CisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJjYW4ndCBvcGVuICclcyciLCBmbmFtZSk7CisJfQorCWlmIChmZCA8IDEwKSB7CisJCWZkMiA9IGNvcHlmZChmZCwgMTApOworCQljbG9zZShmZCk7CisJCWlmIChmZDIgPCAwKQorCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIm91dCBvZiBmaWxlIGRlc2NyaXB0b3JzIik7CisJCWZkID0gZmQyOworCX0KKwlzZXRpbnB1dGZkKGZkLCBmbGFncyAmIElOUFVUX1BVU0hfRklMRSk7Cisgb3V0OgorCUlOVF9PTjsKKwlyZXR1cm4gZmQ7Cit9CisKKy8qCisgKiBMaWtlIHNldGlucHV0ZmlsZSwgYnV0IHRha2VzIGlucHV0IGZyb20gYSBzdHJpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRpbnB1dHN0cmluZyhjaGFyICpzdHJpbmcpCit7CisJSU5UX09GRjsKKwlwdXNoZmlsZSgpOworCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjID0gc3RyaW5nOworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPSBzdHJsZW4oc3RyaW5nKTsKKwlnX3BhcnNlZmlsZS0+YnVmID0gTlVMTDsKKwlnX3BhcnNlZmlsZS0+bGlubm8gPSAxOworCUlOVF9PTjsKK30KKworCisvKiA9PT09PT09PT09PT0gbWFpbC5jCisgKgorICogUm91dGluZXMgdG8gY2hlY2sgZm9yIG1haWwuCisgKi8KKworI2lmIEVOQUJMRV9BU0hfTUFJTAorCisjZGVmaW5lIE1BWE1CT1hFUyAxMAorCisvKiB0aW1lcyBvZiBtYWlsYm94ZXMgKi8KK3N0YXRpYyB0aW1lX3QgbWFpbHRpbWVbTUFYTUJPWEVTXTsKKy8qIFNldCBpZiBNQUlMIG9yIE1BSUxQQVRIIGlzIGNoYW5nZWQuICovCitzdGF0aWMgc21hbGxpbnQgbWFpbF92YXJfcGF0aF9jaGFuZ2VkOworCisvKgorICogUHJpbnQgYXBwcm9wcmlhdGUgbWVzc2FnZShzKSBpZiBtYWlsIGhhcyBhcnJpdmVkLgorICogSWYgbWFpbF92YXJfcGF0aF9jaGFuZ2VkIGlzIHNldCwKKyAqIHRoZW4gdGhlIHZhbHVlIG9mIE1BSUwgaGFzIG1haWxfdmFyX3BhdGhfY2hhbmdlZCwKKyAqIHNvIHdlIGp1c3QgdXBkYXRlIHRoZSB2YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitjaGttYWlsKHZvaWQpCit7CisJY29uc3QgY2hhciAqbXBhdGg7CisJY2hhciAqcDsKKwljaGFyICpxOworCXRpbWVfdCAqbXRwOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJc3RydWN0IHN0YXQgc3RhdGI7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwltcGF0aCA9IG1wYXRoc2V0KCkgPyBtcGF0aHZhbCgpIDogbWFpbHZhbCgpOworCWZvciAobXRwID0gbWFpbHRpbWU7IG10cCA8IG1haWx0aW1lICsgTUFYTUJPWEVTOyBtdHArKykgeworCQlwID0gcGF0aF9hZHZhbmNlKCZtcGF0aCwgbnVsbHN0cik7CisJCWlmIChwID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKCpwID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJZm9yIChxID0gcDsgKnE7IHErKykKKwkJCWNvbnRpbnVlOworI2lmIERFQlVHCisJCWlmIChxWy0xXSAhPSAnLycpCisJCQlhYm9ydCgpOworI2VuZGlmCisJCXFbLTFdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgLyogZGVsZXRlIHRyYWlsaW5nICcvJyAqLworCQlpZiAoc3RhdChwLCAmc3RhdGIpIDwgMCkgeworCQkJKm10cCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIW1haWxfdmFyX3BhdGhfY2hhbmdlZCAmJiBzdGF0Yi5zdF9tdGltZSAhPSAqbXRwKSB7CisJCQlmcHJpbnRmKAorCQkJCXN0ZGVyciwgIiVzXG4iLAorCQkJCXBhdGhvcHQgPyBwYXRob3B0IDogInlvdSBoYXZlIG1haWwiCisJCQkpOworCQl9CisJCSptdHAgPSBzdGF0Yi5zdF9tdGltZTsKKwl9CisJbWFpbF92YXJfcGF0aF9jaGFuZ2VkID0gMDsKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKK30KKworc3RhdGljIHZvaWQgRkFTVF9GVU5DCitjaGFuZ2VtYWlsKGNvbnN0IGNoYXIgKnZhbCBVTlVTRURfUEFSQU0pCit7CisJbWFpbF92YXJfcGF0aF9jaGFuZ2VkID0gMTsKK30KKworI2VuZGlmIC8qIEFTSF9NQUlMICovCisKKworLyogPT09PT09PT09PT09ID8/PyAqLworCisvKgorICogU2V0IHRoZSBzaGVsbCBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZAorc2V0cGFyYW0oY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKm5ld3BhcmFtOworCWNoYXIgKiphcDsKKwlpbnQgbnBhcmFtOworCisJZm9yIChucGFyYW0gPSAwOyBhcmd2W25wYXJhbV07IG5wYXJhbSsrKQorCQljb250aW51ZTsKKwlhcCA9IG5ld3BhcmFtID0gY2ttYWxsb2MoKG5wYXJhbSArIDEpICogc2l6ZW9mKCphcCkpOworCXdoaWxlICgqYXJndikgeworCQkqYXArKyA9IGNrc3RyZHVwKCphcmd2KyspOworCX0KKwkqYXAgPSBOVUxMOworCWZyZWVwYXJhbSgmc2hlbGxwYXJhbSk7CisJc2hlbGxwYXJhbS5tYWxsb2NlZCA9IDE7CisJc2hlbGxwYXJhbS5ucGFyYW0gPSBucGFyYW07CisJc2hlbGxwYXJhbS5wID0gbmV3cGFyYW07CisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCisJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisjZW5kaWYKK30KKworLyoKKyAqIFByb2Nlc3Mgc2hlbGwgb3B0aW9ucy4gIFRoZSBnbG9iYWwgdmFyaWFibGUgYXJncHRyIGNvbnRhaW5zIGEgcG9pbnRlcgorICogdG8gdGhlIGFyZ3VtZW50IGxpc3Q7IHdlIGFkdmFuY2UgaXQgcGFzdCB0aGUgb3B0aW9ucy4KKyAqCisgKiBTVVN2MyBzZWN0aW9uIDIuOC4xICJDb25zZXF1ZW5jZXMgb2YgU2hlbGwgRXJyb3JzIiBzYXlzOgorICogRm9yIGEgbm9uLWludGVyYWN0aXZlIHNoZWxsLCBhbiBlcnJvciBjb25kaXRpb24gZW5jb3VudGVyZWQKKyAqIGJ5IGEgc3BlY2lhbCBidWlsdC1pbiAuLi4gc2hhbGwgY2F1c2UgdGhlIHNoZWxsIHRvIHdyaXRlIGEgZGlhZ25vc3RpYyBtZXNzYWdlCisgKiB0byBzdGFuZGFyZCBlcnJvciBhbmQgZXhpdCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorICogRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lhbCBCdWlsdC1JbgorICogLi4uCisgKiBVdGlsaXR5IHN5bnRheCBlcnJvciAob3B0aW9uIG9yIG9wZXJhbmQgZXJyb3IpICBTaGFsbCBleGl0CisgKiAuLi4KKyAqIEhvd2V2ZXIsIGluIGJ1ZyAxMTQyIChodHRwOi8vYnVzeWJveC5uZXQvYnVncy92aWV3LnBocD9pZD0xMTQyKQorICogd2Ugc2VlIHRoYXQgYmFzaCBkb2VzIG5vdCBkbyB0aGF0IChzZXQgImZpbmlzaGVzIiB3aXRoIGVycm9yIGNvZGUgMSBpbnN0ZWFkLAorICogYW5kIHNoZWxsIGNvbnRpbnVlcyksIGFuZCBwZW9wbGUgcmVseSBvbiB0aGlzIGJlaGF2aW9yIQorICogVGVzdGNhc2U6CisgKiBzZXQgLW8gYmFyZm9vIDI+L2Rldi9udWxsCisgKiBlY2hvICQ/CisgKgorICogT2ggd2VsbC4gTGV0J3MgbWltaWMgdGhhdC4KKyAqLworc3RhdGljIGludAorcGx1c19taW51c19vKGNoYXIgKm5hbWUsIGludCB2YWwpCit7CisJaW50IGk7CisKKwlpZiAobmFtZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTk9QVFM7IGkrKykgeworCQkJaWYgKHN0cmNtcChuYW1lLCBvcHRuYW1lcyhpKSkgPT0gMCkgeworCQkJCW9wdGxpc3RbaV0gPSB2YWw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJYXNoX21zZygiaWxsZWdhbCBvcHRpb24gJWNvICVzIiwgdmFsID8gJy0nIDogJysnLCBuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKSB7CisJCWlmICh2YWwpIHsKKwkJCW91dDFmbXQoIiUtMTZzJXNcbiIsIG9wdG5hbWVzKGkpLCBvcHRsaXN0W2ldID8gIm9uIiA6ICJvZmYiKTsKKwkJfSBlbHNlIHsKKwkJCW91dDFmbXQoInNldCAlY28gJXNcbiIsIG9wdGxpc3RbaV0gPyAnLScgOiAnKycsIG9wdG5hbWVzKGkpKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkCitzZXRvcHRpb24oaW50IGZsYWcsIGludCB2YWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTk9QVFM7IGkrKykgeworCQlpZiAob3B0bGV0dGVycyhpKSA9PSBmbGFnKSB7CisJCQlvcHRsaXN0W2ldID0gdmFsOworCQkJcmV0dXJuOworCQl9CisJfQorCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJpbGxlZ2FsIG9wdGlvbiAlYyVjIiwgdmFsID8gJy0nIDogJysnLCBmbGFnKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CitzdGF0aWMgaW50CitvcHRpb25zKGludCBjbWRsaW5lKQoreworCWNoYXIgKnA7CisJaW50IHZhbDsKKwlpbnQgYzsKKworCWlmIChjbWRsaW5lKQorCQltaW51c2MgPSBOVUxMOworCXdoaWxlICgocCA9ICphcmdwdHIpICE9IE5VTEwpIHsKKwkJYyA9ICpwKys7CisJCWlmIChjICE9ICctJyAmJiBjICE9ICcrJykKKwkJCWJyZWFrOworCQlhcmdwdHIrKzsKKwkJdmFsID0gMDsgLyogdmFsID0gMCBpZiBjID09ICcrJyAqLworCQlpZiAoYyA9PSAnLScpIHsKKwkJCXZhbCA9IDE7CisJCQlpZiAocFswXSA9PSAnXDAnIHx8IExPTkVfREFTSChwKSkgeworCQkJCWlmICghY21kbGluZSkgeworCQkJCQkvKiAiLSIgbWVhbnMgdHVybiBvZmYgLXggYW5kIC12ICovCisJCQkJCWlmIChwWzBdID09ICdcMCcpCisJCQkJCQl4ZmxhZyA9IHZmbGFnID0gMDsKKwkJCQkJLyogIi0tIiBtZWFucyByZXNldCBwYXJhbXMgKi8KKwkJCQkJZWxzZSBpZiAoKmFyZ3B0ciA9PSBOVUxMKQorCQkJCQkJc2V0cGFyYW0oYXJncHRyKTsKKwkJCQl9CisJCQkJYnJlYWs7ICAgIC8qICItIiBvciAiLS0iIHRlcm1pbmF0ZXMgb3B0aW9ucyAqLworCQkJfQorCQl9CisJCS8qIGZpcnN0IGNoYXIgd2FzICsgb3IgLSAqLworCQl3aGlsZSAoKGMgPSAqcCsrKSAhPSAnXDAnKSB7CisJCQkvKiBiYXNoIDMuMiBpbmRlZWQgaGFuZGxlcyAtYyBDTUQgYW5kICtjIENNRCB0aGUgc2FtZSAqLworCQkJaWYgKGMgPT0gJ2MnICYmIGNtZGxpbmUpIHsKKwkJCQltaW51c2MgPSBwOyAgICAgLyogY29tbWFuZCBpcyBhZnRlciBzaGVsbCBhcmdzICovCisJCQl9IGVsc2UgaWYgKGMgPT0gJ28nKSB7CisJCQkJaWYgKHBsdXNfbWludXNfbygqYXJncHRyLCB2YWwpKSB7CisJCQkJCS8qIGl0IGFscmVhZHkgcHJpbnRlZCBlcnIgbWVzc2FnZSAqLworCQkJCQlyZXR1cm4gMTsgLyogZXJyb3IgKi8KKwkJCQl9CisJCQkJaWYgKCphcmdwdHIpCisJCQkJCWFyZ3B0cisrOworCQkJfSBlbHNlIGlmIChjbWRsaW5lICYmIChjID09ICdsJykpIHsgLyogLWwgb3IgK2wgPT0gLS1sb2dpbiAqLworCQkJCWlzbG9naW5zaCA9IDE7CisJCQkvKiBiYXNoIGRvZXMgbm90IGFjY2VwdCArLWxvZ2luLCB3ZSBhbHNvIHdvbid0ICovCisJCQl9IGVsc2UgaWYgKGNtZGxpbmUgJiYgdmFsICYmIChjID09ICctJykpIHsgLyogbG9uZyBvcHRpb25zICovCisJCQkJaWYgKHN0cmNtcChwLCAibG9naW4iKSA9PSAwKQorCQkJCQlpc2xvZ2luc2ggPSAxOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlzZXRvcHRpb24oYywgdmFsKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBzaGlmdCBidWlsdGluIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitzaGlmdGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBuOworCWNoYXIgKiphcDEsICoqYXAyOworCisJbiA9IDE7CisJaWYgKGFyZ3ZbMV0pCisJCW4gPSBudW1iZXIoYXJndlsxXSk7CisJaWYgKG4gPiBzaGVsbHBhcmFtLm5wYXJhbSkKKwkJbiA9IDA7IC8qIGJhc2ggY29tcGF0LCB3YXMgPSBzaGVsbHBhcmFtLm5wYXJhbTsgKi8KKwlJTlRfT0ZGOworCXNoZWxscGFyYW0ubnBhcmFtIC09IG47CisJZm9yIChhcDEgPSBzaGVsbHBhcmFtLnA7IC0tbiA+PSAwOyBhcDErKykgeworCQlpZiAoc2hlbGxwYXJhbS5tYWxsb2NlZCkKKwkJCWZyZWUoKmFwMSk7CisJfQorCWFwMiA9IHNoZWxscGFyYW0ucDsKKwl3aGlsZSAoKCphcDIrKyA9ICphcDErKykgIT0gTlVMTCkKKwkJY29udGludWU7CisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCisJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisjZW5kaWYKKwlJTlRfT047CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQT1NJWCByZXF1aXJlcyB0aGF0ICdzZXQnIChidXQgbm90IGV4cG9ydCBvciByZWFkb25seSkgb3V0cHV0IHRoZQorICogdmFyaWFibGVzIGluIGxleGljb2dyYXBoaWMgb3JkZXIgLSBieSB0aGUgbG9jYWxlJ3MgY29sbGF0aW5nIG9yZGVyIChzaWdoKS4KKyAqIE1heWJlIHdlIGNvdWxkIGtlZXAgdGhlbSBpbiBhbiBvcmRlcmVkIGJhbGFuY2VkIGJpbmFyeSB0cmVlCisgKiBpbnN0ZWFkIG9mIGhhc2hlZCBsaXN0cy4KKyAqIEZvciBub3cganVzdCByb2xsICdlbSB0aHJvdWdoIHFzb3J0IGZvciBwcmludGluZy4uLgorICovCitzdGF0aWMgaW50CitzaG93dmFycyhjb25zdCBjaGFyICpzZXBfcHJlZml4LCBpbnQgb24sIGludCBvZmYpCit7CisJY29uc3QgY2hhciAqc2VwOworCWNoYXIgKiplcCwgKiplcGVuZDsKKworCWVwID0gbGlzdHZhcnMob24sIG9mZiwgJmVwZW5kKTsKKwlxc29ydChlcCwgZXBlbmQgLSBlcCwgc2l6ZW9mKGNoYXIgKiksIHZwY21wKTsKKworCXNlcCA9ICpzZXBfcHJlZml4ID8gIiAiIDogc2VwX3ByZWZpeDsKKworCWZvciAoOyBlcCA8IGVwZW5kOyBlcCsrKSB7CisJCWNvbnN0IGNoYXIgKnA7CisJCWNvbnN0IGNoYXIgKnE7CisKKwkJcCA9IHN0cmNocm51bCgqZXAsICc9Jyk7CisJCXEgPSBudWxsc3RyOworCQlpZiAoKnApCisJCQlxID0gc2luZ2xlX3F1b3RlKCsrcCk7CisJCW91dDFmbXQoIiVzJXMlLipzJXNcbiIsIHNlcF9wcmVmaXgsIHNlcCwgKGludCkocCAtICplcCksICplcCwgcSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhlIHNldCBjb21tYW5kIGJ1aWx0aW4uCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitzZXRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJaW50IHJldHZhbDsKKworCWlmICghYXJndlsxXSkKKwkJcmV0dXJuIHNob3d2YXJzKG51bGxzdHIsIDAsIFZVTlNFVCk7CisKKwlJTlRfT0ZGOworCXJldHZhbCA9IG9wdGlvbnMoLypjbWRsaW5lOiovIDApOworCWlmIChyZXR2YWwgPT0gMCkgeyAvKiBpZiBubyBwYXJzZSBlcnJvci4uLiAqLworCQlvcHRzY2hhbmdlZCgpOworCQlpZiAoKmFyZ3B0ciAhPSBOVUxMKSB7CisJCQlzZXRwYXJhbShhcmdwdHIpOworCQl9CisJfQorCUlOVF9PTjsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWYgRU5BQkxFX0FTSF9SQU5ET01fU1VQUE9SVAorc3RhdGljIHZvaWQgRkFTVF9GVU5DCitjaGFuZ2VfcmFuZG9tKGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXVpbnQzMl90IHQ7CisKKwlpZiAodmFsdWUgPT0gTlVMTCkgeworCQkvKiAiZ2V0IiwgZ2VuZXJhdGUgKi8KKwkJdCA9IG5leHRfcmFuZG9tKCZyYW5kb21fZ2VuKTsKKwkJLyogc2V0IHdpdGhvdXQgcmVjdXJzaW9uICovCisJCXNldHZhcih2cmFuZG9tLnZhcl90ZXh0LCB1dG9hKHQpLCBWTk9GVU5DKTsKKwkJdnJhbmRvbS5mbGFncyAmPSB+Vk5PRlVOQzsKKwl9IGVsc2UgeworCQkvKiBzZXQvcmVzZXQgKi8KKwkJdCA9IHN0cnRvdWwodmFsdWUsIE5VTEwsIDEwKTsKKwkJSU5JVF9SQU5ET01fVCgmcmFuZG9tX2dlbiwgKHQgPyB0IDogMSksIHQpOworCX0KK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCitzdGF0aWMgaW50CitnZXRvcHRzKGNoYXIgKm9wdHN0ciwgY2hhciAqb3B0dmFyLCBjaGFyICoqb3B0Zmlyc3QsIGludCAqcGFyYW1fb3B0aW5kLCBpbnQgKm9wdG9mZikKK3sKKwljaGFyICpwLCAqcTsKKwljaGFyIGMgPSAnPyc7CisJaW50IGRvbmUgPSAwOworCWludCBlcnIgPSAwOworCWNoYXIgc1sxMl07CisJY2hhciAqKm9wdG5leHQ7CisKKwlpZiAoKnBhcmFtX29wdGluZCA8IDEpCisJCXJldHVybiAxOworCW9wdG5leHQgPSBvcHRmaXJzdCArICpwYXJhbV9vcHRpbmQgLSAxOworCisJaWYgKCpwYXJhbV9vcHRpbmQgPD0gMSB8fCAqb3B0b2ZmIDwgMCB8fCAoaW50KXN0cmxlbihvcHRuZXh0Wy0xXSkgPCAqb3B0b2ZmKQorCQlwID0gTlVMTDsKKwllbHNlCisJCXAgPSBvcHRuZXh0Wy0xXSArICpvcHRvZmY7CisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSAnXDAnKSB7CisJCS8qIEN1cnJlbnQgd29yZCBpcyBkb25lLCBhZHZhbmNlICovCisJCXAgPSAqb3B0bmV4dDsKKwkJaWYgKHAgPT0gTlVMTCB8fCAqcCAhPSAnLScgfHwgKisrcCA9PSAnXDAnKSB7CisgYXRlbmQ6CisJCQlwID0gTlVMTDsKKwkJCWRvbmUgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJb3B0bmV4dCsrOworCQlpZiAoTE9ORV9EQVNIKHApKSAgICAgICAgLyogY2hlY2sgZm9yICItLSIgKi8KKwkJCWdvdG8gYXRlbmQ7CisJfQorCisJYyA9ICpwKys7CisJZm9yIChxID0gb3B0c3RyOyAqcSAhPSBjOykgeworCQlpZiAoKnEgPT0gJ1wwJykgeworCQkJaWYgKG9wdHN0clswXSA9PSAnOicpIHsKKwkJCQlzWzBdID0gYzsKKwkJCQlzWzFdID0gJ1wwJzsKKwkJCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgcywgMCk7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBvcHRpb24gLSVjXG4iLCBjKTsKKwkJCQl1bnNldHZhcigiT1BUQVJHIik7CisJCQl9CisJCQljID0gJz8nOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCorK3EgPT0gJzonKQorCQkJcSsrOworCX0KKworCWlmICgqKytxID09ICc6JykgeworCQlpZiAoKnAgPT0gJ1wwJyAmJiAocCA9ICpvcHRuZXh0KSA9PSBOVUxMKSB7CisJCQlpZiAob3B0c3RyWzBdID09ICc6JykgeworCQkJCXNbMF0gPSBjOworCQkJCXNbMV0gPSAnXDAnOworCQkJCWVyciB8PSBzZXR2YXJzYWZlKCJPUFRBUkciLCBzLCAwKTsKKwkJCQljID0gJzonOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGFyZyBmb3IgLSVjIG9wdGlvblxuIiwgYyk7CisJCQkJdW5zZXR2YXIoIk9QVEFSRyIpOworCQkJCWMgPSAnPyc7CisJCQl9CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChwID09ICpvcHRuZXh0KQorCQkJb3B0bmV4dCsrOworCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgcCwgMCk7CisJCXAgPSBOVUxMOworCX0gZWxzZQorCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgbnVsbHN0ciwgMCk7Cisgb3V0OgorCSpvcHRvZmYgPSBwID8gcCAtICoob3B0bmV4dCAtIDEpIDogLTE7CisJKnBhcmFtX29wdGluZCA9IG9wdG5leHQgLSBvcHRmaXJzdCArIDE7CisJZm10c3RyKHMsIHNpemVvZihzKSwgIiVkIiwgKnBhcmFtX29wdGluZCk7CisJZXJyIHw9IHNldHZhcnNhZmUoIk9QVElORCIsIHMsIFZOT0ZVTkMpOworCXNbMF0gPSBjOworCXNbMV0gPSAnXDAnOworCWVyciB8PSBzZXR2YXJzYWZlKG9wdHZhciwgcywgMCk7CisJaWYgKGVycikgeworCQkqcGFyYW1fb3B0aW5kID0gMTsKKwkJKm9wdG9mZiA9IC0xOworCQlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7CisJCXJhaXNlX2V4Y2VwdGlvbihFWEVSUk9SKTsKKwl9CisJcmV0dXJuIGRvbmU7Cit9CisKKy8qCisgKiBUaGUgZ2V0b3B0cyBidWlsdGluLiAgU2hlbGxwYXJhbS5vcHRuZXh0IHBvaW50cyB0byB0aGUgbmV4dCBhcmd1bWVudAorICogdG8gYmUgcHJvY2Vzc2VkLiAgU2hlbGxwYXJhbS5vcHRwdHIgcG9pbnRzIHRvIHRoZSBuZXh0IGNoYXJhY3RlciB0bworICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjdXJyZW50IGFyZ3VtZW50LiAgSWYgc2hlbGxwYXJhbS5vcHRuZXh0IGlzIE5VTEwsCisgKiB0aGVuIGl0J3MgdGhlIGZpcnN0IHRpbWUgZ2V0b3B0cyBoYXMgYmVlbiBjYWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitnZXRvcHRzY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqb3B0YmFzZTsKKworCWlmIChhcmdjIDwgMykKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInVzYWdlOiBnZXRvcHRzIG9wdHN0cmluZyB2YXIgW2FyZ10iKTsKKwlpZiAoYXJnYyA9PSAzKSB7CisJCW9wdGJhc2UgPSBzaGVsbHBhcmFtLnA7CisJCWlmIChzaGVsbHBhcmFtLm9wdGluZCA+IHNoZWxscGFyYW0ubnBhcmFtICsgMSkgeworCQkJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCQkJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKwkJfQorCX0gZWxzZSB7CisJCW9wdGJhc2UgPSAmYXJndlszXTsKKwkJaWYgKHNoZWxscGFyYW0ub3B0aW5kID4gYXJnYyAtIDIpIHsKKwkJCXNoZWxscGFyYW0ub3B0aW5kID0gMTsKKwkJCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gZ2V0b3B0cyhhcmd2WzFdLCBhcmd2WzJdLCBvcHRiYXNlLCAmc2hlbGxwYXJhbS5vcHRpbmQsCisJCQkmc2hlbGxwYXJhbS5vcHRvZmYpOworfQorI2VuZGlmIC8qIEFTSF9HRVRPUFRTICovCisKKworLyogPT09PT09PT09PT09IFNoZWxsIHBhcnNlciAqLworCitzdHJ1Y3QgaGVyZWRvYyB7CisJc3RydWN0IGhlcmVkb2MgKm5leHQ7ICAgLyogbmV4dCBoZXJlIGRvY3VtZW50IGluIGxpc3QgKi8KKwl1bmlvbiBub2RlICpoZXJlOyAgICAgICAvKiByZWRpcmVjdGlvbiBub2RlICovCisJY2hhciAqZW9mbWFyazsgICAgICAgICAgLyogc3RyaW5nIGluZGljYXRpbmcgZW5kIG9mIGlucHV0ICovCisJc21hbGxpbnQgc3RyaXB0YWJzOyAgICAgLyogaWYgc2V0LCBzdHJpcCBsZWFkaW5nIHRhYnMgKi8KK307CisKK3N0YXRpYyBzbWFsbGludCB0b2twdXNoYmFjazsgICAgICAgICAgIC8qIGxhc3QgdG9rZW4gcHVzaGVkIGJhY2sgKi8KK3N0YXRpYyBzbWFsbGludCBwYXJzZWJhY2txdW90ZTsgICAgICAgIC8qIG5vbnplcm8gaWYgd2UgYXJlIGluc2lkZSBiYWNrcXVvdGVzICovCitzdGF0aWMgc21hbGxpbnQgcXVvdGVmbGFnOyAgICAgICAgICAgICAvKiBzZXQgaWYgKHBhcnQgb2YpIGxhc3QgdG9rZW4gd2FzIHF1b3RlZCAqLworc3RhdGljIHRva2VuX2lkX3QgbGFzdHRva2VuOyAgICAgICAgICAgLyogbGFzdCB0b2tlbiByZWFkIChpbnRlZ2VyIGlkIFR4eHgpICovCitzdGF0aWMgc3RydWN0IGhlcmVkb2MgKmhlcmVkb2NsaXN0OyAgICAvKiBsaXN0IG9mIGhlcmUgZG9jdW1lbnRzIHRvIHJlYWQgKi8KK3N0YXRpYyBjaGFyICp3b3JkdGV4dDsgICAgICAgICAgICAgICAgIC8qIHRleHQgb2YgbGFzdCB3b3JkIHJldHVybmVkIGJ5IHJlYWR0b2tlbiAqLworc3RhdGljIHN0cnVjdCBub2RlbGlzdCAqYmFja3F1b3RlbGlzdDsKK3N0YXRpYyB1bmlvbiBub2RlICpyZWRpcm5vZGU7CitzdGF0aWMgc3RydWN0IGhlcmVkb2MgKmhlcmVkb2M7CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3Rva25hbWUoY2hhciAqYnVmLCBpbnQgdG9rKQoreworCWlmICh0b2sgPCBUU0VNSSkKKwkJcmV0dXJuIHRva25hbWVfYXJyYXlbdG9rXSArIDE7CisJc3ByaW50ZihidWYsICJcIiVzXCIiLCB0b2tuYW1lX2FycmF5W3Rva10gKyAxKTsKKwlyZXR1cm4gYnVmOworfQorCisvKiByYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheDoKKyAqIENhbGxlZCB3aGVuIGFuIHVuZXhwZWN0ZWQgdG9rZW4gaXMgcmVhZCBkdXJpbmcgdGhlIHBhcnNlLiAgVGhlIGFyZ3VtZW50CisgKiBpcyB0aGUgdG9rZW4gdGhhdCBpcyBleHBlY3RlZCwgb3IgLTEgaWYgbW9yZSB0aGFuIG9uZSB0eXBlIG9mIHRva2VuIGNhbgorICogb2NjdXIgYXQgdGhpcyBwb2ludC4KKyAqLworc3RhdGljIHZvaWQgcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoaW50KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCityYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChpbnQgdG9rZW4pCit7CisJY2hhciBtc2dbNjRdOworCWNoYXIgYnVmWzE2XTsKKwlpbnQgbDsKKworCWwgPSBzcHJpbnRmKG1zZywgInVuZXhwZWN0ZWQgJXMiLCB0b2tuYW1lKGJ1ZiwgbGFzdHRva2VuKSk7CisJaWYgKHRva2VuID49IDApCisJCXNwcmludGYobXNnICsgbCwgIiAoZXhwZWN0aW5nICVzKSIsIHRva25hbWUoYnVmLCB0b2tlbikpOworCXJhaXNlX2Vycm9yX3N5bnRheChtc2cpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworI2RlZmluZSBFT0ZNQVJLTEVOIDc5CisKKy8qIHBhcnNpbmcgaXMgaGVhdmlseSBjcm9zcy1yZWN1cnNpdmUsIG5lZWQgdGhlc2UgZm9yd2FyZCBkZWNscyAqLworc3RhdGljIHVuaW9uIG5vZGUgKmFuZG9yKHZvaWQpOworc3RhdGljIHVuaW9uIG5vZGUgKnBpcGVsaW5lKHZvaWQpOworc3RhdGljIHVuaW9uIG5vZGUgKnBhcnNlX2NvbW1hbmQodm9pZCk7CitzdGF0aWMgdm9pZCBwYXJzZWhlcmVkb2Modm9pZCk7CitzdGF0aWMgY2hhciBwZWVrdG9rZW4odm9pZCk7CitzdGF0aWMgaW50IHJlYWR0b2tlbih2b2lkKTsKKworc3RhdGljIHVuaW9uIG5vZGUgKgorbGlzdChpbnQgbmxmbGFnKQoreworCXVuaW9uIG5vZGUgKm4xLCAqbjIsICpuMzsKKwlpbnQgdG9rOworCisJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRCB8IENIS0FMSUFTOworCWlmIChubGZsYWcgPT0gMiAmJiBwZWVrdG9rZW4oKSkKKwkJcmV0dXJuIE5VTEw7CisJbjEgPSBOVUxMOworCWZvciAoOzspIHsKKwkJbjIgPSBhbmRvcigpOworCQl0b2sgPSByZWFkdG9rZW4oKTsKKwkJaWYgKHRvayA9PSBUQkFDS0dORCkgeworCQkJaWYgKG4yLT50eXBlID09IE5QSVBFKSB7CisJCQkJbjItPm5waXBlLnBpcGVfYmFja2duZCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWlmIChuMi0+dHlwZSAhPSBOUkVESVIpIHsKKwkJCQkJbjMgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5yZWRpcikpOworCQkJCQluMy0+bnJlZGlyLm4gPSBuMjsKKwkJCQkJLypuMy0+bnJlZGlyLnJlZGlyZWN0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJCQkJbjIgPSBuMzsKKwkJCQl9CisJCQkJbjItPnR5cGUgPSBOQkFDS0dORDsKKwkJCX0KKwkJfQorCQlpZiAobjEgPT0gTlVMTCkgeworCQkJbjEgPSBuMjsKKwkJfSBlbHNlIHsKKwkJCW4zID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSk7CisJCQluMy0+dHlwZSA9IE5TRU1JOworCQkJbjMtPm5iaW5hcnkuY2gxID0gbjE7CisJCQluMy0+bmJpbmFyeS5jaDIgPSBuMjsKKwkJCW4xID0gbjM7CisJCX0KKwkJc3dpdGNoICh0b2spIHsKKwkJY2FzZSBUQkFDS0dORDoKKwkJY2FzZSBUU0VNSToKKwkJCXRvayA9IHJlYWR0b2tlbigpOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgVE5MOgorCQkJaWYgKHRvayA9PSBUTkwpIHsKKwkJCQlwYXJzZWhlcmVkb2MoKTsKKwkJCQlpZiAobmxmbGFnID09IDEpCisJCQkJCXJldHVybiBuMTsKKwkJCX0gZWxzZSB7CisJCQkJdG9rcHVzaGJhY2sgPSAxOworCQkJfQorCQkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRCB8IENIS0FMSUFTOworCQkJaWYgKHBlZWt0b2tlbigpKQorCQkJCXJldHVybiBuMTsKKwkJCWJyZWFrOworCQljYXNlIFRFT0Y6CisJCQlpZiAoaGVyZWRvY2xpc3QpCisJCQkJcGFyc2VoZXJlZG9jKCk7CisJCQllbHNlCisJCQkJcHVuZ2V0YygpOyAgICAgICAgICAgICAgLyogcHVzaCBiYWNrIEVPRiBvbiBpbnB1dCAqLworCQkJcmV0dXJuIG4xOworCQlkZWZhdWx0OgorCQkJaWYgKG5sZmxhZyA9PSAxKQorCQkJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KC0xKTsKKwkJCXRva3B1c2hiYWNrID0gMTsKKwkJCXJldHVybiBuMTsKKwkJfQorCX0KK30KKworc3RhdGljIHVuaW9uIG5vZGUgKgorYW5kb3Iodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuMSwgKm4yLCAqbjM7CisJaW50IHQ7CisKKwluMSA9IHBpcGVsaW5lKCk7CisJZm9yICg7OykgeworCQl0ID0gcmVhZHRva2VuKCk7CisJCWlmICh0ID09IFRBTkQpIHsKKwkJCXQgPSBOQU5EOworCQl9IGVsc2UgaWYgKHQgPT0gVE9SKSB7CisJCQl0ID0gTk9SOworCQl9IGVsc2UgeworCQkJdG9rcHVzaGJhY2sgPSAxOworCQkJcmV0dXJuIG4xOworCQl9CisJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwkJbjIgPSBwaXBlbGluZSgpOworCQluMyA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpOworCQluMy0+dHlwZSA9IHQ7CisJCW4zLT5uYmluYXJ5LmNoMSA9IG4xOworCQluMy0+bmJpbmFyeS5jaDIgPSBuMjsKKwkJbjEgPSBuMzsKKwl9Cit9CisKK3N0YXRpYyB1bmlvbiBub2RlICoKK3BpcGVsaW5lKHZvaWQpCit7CisJdW5pb24gbm9kZSAqbjEsICpuMiwgKnBpcGVub2RlOworCXN0cnVjdCBub2RlbGlzdCAqbHAsICpwcmV2OworCWludCBuZWdhdGU7CisKKwluZWdhdGUgPSAwOworCVRSQUNFKCgicGlwZWxpbmU6IGVudGVyZWRcbiIpKTsKKwlpZiAocmVhZHRva2VuKCkgPT0gVE5PVCkgeworCQluZWdhdGUgPSAhbmVnYXRlOworCQljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCX0gZWxzZQorCQl0b2twdXNoYmFjayA9IDE7CisJbjEgPSBwYXJzZV9jb21tYW5kKCk7CisJaWYgKHJlYWR0b2tlbigpID09IFRQSVBFKSB7CisJCXBpcGVub2RlID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBucGlwZSkpOworCQlwaXBlbm9kZS0+dHlwZSA9IE5QSVBFOworCQkvKnBpcGVub2RlLT5ucGlwZS5waXBlX2JhY2tnbmQgPSAwOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQlscCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZWxpc3QpKTsKKwkJcGlwZW5vZGUtPm5waXBlLmNtZGxpc3QgPSBscDsKKwkJbHAtPm4gPSBuMTsKKwkJZG8geworCQkJcHJldiA9IGxwOworCQkJbHAgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5vZGVsaXN0KSk7CisJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCQlscC0+biA9IHBhcnNlX2NvbW1hbmQoKTsKKwkJCXByZXYtPm5leHQgPSBscDsKKwkJfSB3aGlsZSAocmVhZHRva2VuKCkgPT0gVFBJUEUpOworCQlscC0+bmV4dCA9IE5VTEw7CisJCW4xID0gcGlwZW5vZGU7CisJfQorCXRva3B1c2hiYWNrID0gMTsKKwlpZiAobmVnYXRlKSB7CisJCW4yID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBubm90KSk7CisJCW4yLT50eXBlID0gTk5PVDsKKwkJbjItPm5ub3QuY29tID0gbjE7CisJCXJldHVybiBuMjsKKwl9CisJcmV0dXJuIG4xOworfQorCitzdGF0aWMgdW5pb24gbm9kZSAqCittYWtlbmFtZSh2b2lkKQoreworCXVuaW9uIG5vZGUgKm47CisKKwluID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJbi0+dHlwZSA9IE5BUkc7CisJLypuLT5uYXJnLm5leHQgPSBOVUxMOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCW4tPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCW4tPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQKK2ZpeHJlZGlyKHVuaW9uIG5vZGUgKm4sIGNvbnN0IGNoYXIgKnRleHQsIGludCBlcnIpCit7CisJaW50IGZkOworCisJVFJBQ0UoKCJGaXggcmVkaXIgJXMgJWRcbiIsIHRleHQsIGVycikpOworCWlmICghZXJyKQorCQluLT5uZHVwLnZuYW1lID0gTlVMTDsKKworCWZkID0gYmJfc3RydG91KHRleHQsIE5VTEwsIDEwKTsKKwlpZiAoIWVycm5vICYmIGZkID49IDApCisJCW4tPm5kdXAuZHVwZmQgPSBmZDsKKwllbHNlIGlmIChMT05FX0RBU0godGV4dCkpCisJCW4tPm5kdXAuZHVwZmQgPSAtMTsKKwllbHNlIHsKKwkJaWYgKGVycikKKwkJCXJhaXNlX2Vycm9yX3N5bnRheCgiYmFkIGZkIG51bWJlciIpOworCQluLT5uZHVwLnZuYW1lID0gbWFrZW5hbWUoKTsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgY29udGFpbnMgbm90aGluZyB0byBleHBhbmQgKG5vIGRvbGxhciBzaWducworICogb3IgYmFja3F1b3RlcykuCisgKi8KK3N0YXRpYyBpbnQKK25vZXhwYW5kKGNvbnN0IGNoYXIgKnRleHQpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJd2hpbGUgKChjID0gKnRleHQrKykgIT0gJ1wwJykgeworCQlpZiAoYyA9PSBDVExRVU9URU1BUkspCisJCQljb250aW51ZTsKKwkJaWYgKGMgPT0gQ1RMRVNDKQorCQkJdGV4dCsrOworCQllbHNlIGlmIChTSVQoYywgQkFTRVNZTlRBWCkgPT0gQ0NUTCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlZm5hbWUodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuID0gcmVkaXJub2RlOworCisJaWYgKHJlYWR0b2tlbigpICE9IFRXT1JEKQorCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheCgtMSk7CisJaWYgKG4tPnR5cGUgPT0gTkhFUkUpIHsKKwkJc3RydWN0IGhlcmVkb2MgKmhlcmUgPSBoZXJlZG9jOworCQlzdHJ1Y3QgaGVyZWRvYyAqcDsKKwkJaW50IGk7CisKKwkJaWYgKHF1b3RlZmxhZyA9PSAwKQorCQkJbi0+dHlwZSA9IE5YSEVSRTsKKwkJVFJBQ0UoKCJIZXJlIGRvY3VtZW50ICVkXG4iLCBuLT50eXBlKSk7CisJCWlmICghbm9leHBhbmQod29yZHRleHQpIHx8IChpID0gc3RybGVuKHdvcmR0ZXh0KSkgPT0gMCB8fCBpID4gRU9GTUFSS0xFTikKKwkJCXJhaXNlX2Vycm9yX3N5bnRheCgiaWxsZWdhbCBlb2YgbWFya2VyIGZvciA8PCByZWRpcmVjdGlvbiIpOworCQlybWVzY2FwZXMod29yZHRleHQsIDApOworCQloZXJlLT5lb2ZtYXJrID0gd29yZHRleHQ7CisJCWhlcmUtPm5leHQgPSBOVUxMOworCQlpZiAoaGVyZWRvY2xpc3QgPT0gTlVMTCkKKwkJCWhlcmVkb2NsaXN0ID0gaGVyZTsKKwkJZWxzZSB7CisJCQlmb3IgKHAgPSBoZXJlZG9jbGlzdDsgcC0+bmV4dDsgcCA9IHAtPm5leHQpCisJCQkJY29udGludWU7CisJCQlwLT5uZXh0ID0gaGVyZTsKKwkJfQorCX0gZWxzZSBpZiAobi0+dHlwZSA9PSBOVE9GRCB8fCBuLT50eXBlID09IE5GUk9NRkQpIHsKKwkJZml4cmVkaXIobiwgd29yZHRleHQsIDApOworCX0gZWxzZSB7CisJCW4tPm5maWxlLmZuYW1lID0gbWFrZW5hbWUoKTsKKwl9Cit9CisKK3N0YXRpYyB1bmlvbiBub2RlICoKK3NpbXBsZWNtZCh2b2lkKQoreworCXVuaW9uIG5vZGUgKmFyZ3MsICoqYXBwOworCXVuaW9uIG5vZGUgKm4gPSBOVUxMOworCXVuaW9uIG5vZGUgKnZhcnMsICoqdnBwOworCXVuaW9uIG5vZGUgKipycHAsICpyZWRpcjsKKwlpbnQgc2F2ZWNoZWNra3dkOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwlzbWFsbGludCBkb3VibGVfYnJhY2tldHNfZmxhZyA9IDA7CisjZW5kaWYKKworCWFyZ3MgPSBOVUxMOworCWFwcCA9ICZhcmdzOworCXZhcnMgPSBOVUxMOworCXZwcCA9ICZ2YXJzOworCXJlZGlyID0gTlVMTDsKKwlycHAgPSAmcmVkaXI7CisKKwlzYXZlY2hlY2trd2QgPSBDSEtBTElBUzsKKwlmb3IgKDs7KSB7CisJCWludCB0OworCQljaGVja2t3ZCA9IHNhdmVjaGVja2t3ZDsKKwkJdCA9IHJlYWR0b2tlbigpOworCQlzd2l0Y2ggKHQpIHsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCWNhc2UgVEFORDogLyogIiYmIiAqLworCQljYXNlIFRPUjogLyogInx8IiAqLworCQkJaWYgKCFkb3VibGVfYnJhY2tldHNfZmxhZykgeworCQkJCXRva3B1c2hiYWNrID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXdvcmR0ZXh0ID0gKGNoYXIgKikgKHQgPT0gVEFORCA/ICItYSIgOiAiLW8iKTsKKyNlbmRpZgorCQljYXNlIFRXT1JEOgorCQkJbiA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmFyZykpOworCQkJbi0+dHlwZSA9IE5BUkc7CisJCQkvKm4tPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQluLT5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQlpZiAoc3RyY21wKCJbWyIsIHdvcmR0ZXh0KSA9PSAwKQorCQkJCWRvdWJsZV9icmFja2V0c19mbGFnID0gMTsKKwkJCWVsc2UgaWYgKHN0cmNtcCgiXV0iLCB3b3JkdGV4dCkgPT0gMCkKKwkJCQlkb3VibGVfYnJhY2tldHNfZmxhZyA9IDA7CisjZW5kaWYKKwkJCW4tPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwkJCWlmIChzYXZlY2hlY2trd2QgJiYgaXNhc3NpZ25tZW50KHdvcmR0ZXh0KSkgeworCQkJCSp2cHAgPSBuOworCQkJCXZwcCA9ICZuLT5uYXJnLm5leHQ7CisJCQl9IGVsc2UgeworCQkJCSphcHAgPSBuOworCQkJCWFwcCA9ICZuLT5uYXJnLm5leHQ7CisJCQkJc2F2ZWNoZWNra3dkID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRSRURJUjoKKwkJCSpycHAgPSBuID0gcmVkaXJub2RlOworCQkJcnBwID0gJm4tPm5maWxlLm5leHQ7CisJCQlwYXJzZWZuYW1lKCk7ICAgLyogcmVhZCBuYW1lIG9mIHJlZGlyZWN0aW9uIGZpbGUgKi8KKwkJCWJyZWFrOworCQljYXNlIFRMUDoKKwkJCWlmIChhcmdzICYmIGFwcCA9PSAmYXJncy0+bmFyZy5uZXh0CisJCQkgJiYgIXZhcnMgJiYgIXJlZGlyCisJCQkpIHsKKwkJCQlzdHJ1Y3QgYnVpbHRpbmNtZCAqYmNtZDsKKwkJCQljb25zdCBjaGFyICpuYW1lOworCisJCQkJLyogV2UgaGF2ZSBhIGZ1bmN0aW9uICovCisJCQkJaWYgKHJlYWR0b2tlbigpICE9IFRSUCkKKwkJCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFJQKTsKKwkJCQluYW1lID0gbi0+bmFyZy50ZXh0OworCQkJCWlmICghZ29vZG5hbWUobmFtZSkKKwkJCQkgfHwgKChiY21kID0gZmluZF9idWlsdGluKG5hbWUpKSAmJiBJU19CVUlMVElOX1NQRUNJQUwoYmNtZCkpCisJCQkJKSB7CisJCQkJCXJhaXNlX2Vycm9yX3N5bnRheCgiYmFkIGZ1bmN0aW9uIG5hbWUiKTsKKwkJCQl9CisJCQkJbi0+dHlwZSA9IE5ERUZVTjsKKwkJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCQkJbi0+bmFyZy5uZXh0ID0gcGFyc2VfY29tbWFuZCgpOworCQkJCXJldHVybiBuOworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQl0b2twdXNoYmFjayA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKyBvdXQ6CisJKmFwcCA9IE5VTEw7CisJKnZwcCA9IE5VTEw7CisJKnJwcCA9IE5VTEw7CisJbiA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmNtZCkpOworCW4tPnR5cGUgPSBOQ01EOworCW4tPm5jbWQuYXJncyA9IGFyZ3M7CisJbi0+bmNtZC5hc3NpZ24gPSB2YXJzOworCW4tPm5jbWQucmVkaXJlY3QgPSByZWRpcjsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHVuaW9uIG5vZGUgKgorcGFyc2VfY29tbWFuZCh2b2lkKQoreworCXVuaW9uIG5vZGUgKm4xLCAqbjI7CisJdW5pb24gbm9kZSAqYXAsICoqYXBwOworCXVuaW9uIG5vZGUgKmNwLCAqKmNwcDsKKwl1bmlvbiBub2RlICpyZWRpciwgKipycHA7CisJdW5pb24gbm9kZSAqKnJwcDI7CisJaW50IHQ7CisKKwlyZWRpciA9IE5VTEw7CisJcnBwMiA9ICZyZWRpcjsKKworCXN3aXRjaCAocmVhZHRva2VuKCkpIHsKKwlkZWZhdWx0OgorCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheCgtMSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwljYXNlIFRJRjoKKwkJbjEgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5pZikpOworCQluMS0+dHlwZSA9IE5JRjsKKwkJbjEtPm5pZi50ZXN0ID0gbGlzdCgwKTsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRUSEVOKQorCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFRIRU4pOworCQluMS0+bmlmLmlmcGFydCA9IGxpc3QoMCk7CisJCW4yID0gbjE7CisJCXdoaWxlIChyZWFkdG9rZW4oKSA9PSBURUxJRikgeworCQkJbjItPm5pZi5lbHNlcGFydCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmlmKSk7CisJCQluMiA9IG4yLT5uaWYuZWxzZXBhcnQ7CisJCQluMi0+dHlwZSA9IE5JRjsKKwkJCW4yLT5uaWYudGVzdCA9IGxpc3QoMCk7CisJCQlpZiAocmVhZHRva2VuKCkgIT0gVFRIRU4pCisJCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFRIRU4pOworCQkJbjItPm5pZi5pZnBhcnQgPSBsaXN0KDApOworCQl9CisJCWlmIChsYXN0dG9rZW4gPT0gVEVMU0UpCisJCQluMi0+bmlmLmVsc2VwYXJ0ID0gbGlzdCgwKTsKKwkJZWxzZSB7CisJCQluMi0+bmlmLmVsc2VwYXJ0ID0gTlVMTDsKKwkJCXRva3B1c2hiYWNrID0gMTsKKwkJfQorCQl0ID0gVEZJOworCQlicmVhazsKKwljYXNlIFRXSElMRToKKwljYXNlIFRVTlRJTDogeworCQlpbnQgZ290OworCQluMSA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpOworCQluMS0+dHlwZSA9IChsYXN0dG9rZW4gPT0gVFdISUxFKSA/IE5XSElMRSA6IE5VTlRJTDsKKwkJbjEtPm5iaW5hcnkuY2gxID0gbGlzdCgwKTsKKwkJZ290ID0gcmVhZHRva2VuKCk7CisJCWlmIChnb3QgIT0gVERPKSB7CisJCQlUUkFDRSgoImV4cGVjdGluZyBETyBnb3QgJyVzJyAlc1xuIiwgdG9rbmFtZV9hcnJheVtnb3RdICsgMSwKKwkJCQkJZ290ID09IFRXT1JEID8gd29yZHRleHQgOiAiIikpOworCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVERPKTsKKwkJfQorCQluMS0+bmJpbmFyeS5jaDIgPSBsaXN0KDApOworCQl0ID0gVERPTkU7CisJCWJyZWFrOworCX0KKwljYXNlIFRGT1I6CisJCWlmIChyZWFkdG9rZW4oKSAhPSBUV09SRCB8fCBxdW90ZWZsYWcgfHwgIWdvb2RuYW1lKHdvcmR0ZXh0KSkKKwkJCXJhaXNlX2Vycm9yX3N5bnRheCgiYmFkIGZvciBsb29wIHZhcmlhYmxlIik7CisJCW4xID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZm9yKSk7CisJCW4xLT50eXBlID0gTkZPUjsKKwkJbjEtPm5mb3IudmFyID0gd29yZHRleHQ7CisJCWNoZWNra3dkID0gQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCWlmIChyZWFkdG9rZW4oKSA9PSBUSU4pIHsKKwkJCWFwcCA9ICZhcDsKKwkJCXdoaWxlIChyZWFkdG9rZW4oKSA9PSBUV09SRCkgeworCQkJCW4yID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJCQkJbjItPnR5cGUgPSBOQVJHOworCQkJCS8qbjItPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQkJbjItPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQkJCW4yLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJCQkJKmFwcCA9IG4yOworCQkJCWFwcCA9ICZuMi0+bmFyZy5uZXh0OworCQkJfQorCQkJKmFwcCA9IE5VTEw7CisJCQluMS0+bmZvci5hcmdzID0gYXA7CisJCQlpZiAobGFzdHRva2VuICE9IFROTCAmJiBsYXN0dG9rZW4gIT0gVFNFTUkpCisJCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoLTEpOworCQl9IGVsc2UgeworCQkJbjIgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5hcmcpKTsKKwkJCW4yLT50eXBlID0gTkFSRzsKKwkJCS8qbjItPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQluMi0+bmFyZy50ZXh0ID0gKGNoYXIgKilkb2xhdHN0cjsKKwkJCS8qbjItPm5hcmcuYmFja3F1b3RlID0gTlVMTDsqLworCQkJbjEtPm5mb3IuYXJncyA9IG4yOworCQkJLyoKKwkJCSAqIE5ld2xpbmUgb3Igc2VtaWNvbG9uIGhlcmUgaXMgb3B0aW9uYWwgKGJ1dCBub3RlCisJCQkgKiB0aGF0IHRoZSBvcmlnaW5hbCBCb3VybmUgc2hlbGwgb25seSBhbGxvd2VkIE5MKS4KKwkJCSAqLworCQkJaWYgKGxhc3R0b2tlbiAhPSBUTkwgJiYgbGFzdHRva2VuICE9IFRTRU1JKQorCQkJCXRva3B1c2hiYWNrID0gMTsKKwkJfQorCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCWlmIChyZWFkdG9rZW4oKSAhPSBURE8pCisJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChURE8pOworCQluMS0+bmZvci5ib2R5ID0gbGlzdCgwKTsKKwkJdCA9IFRET05FOworCQlicmVhazsKKwljYXNlIFRDQVNFOgorCQluMSA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmNhc2UpKTsKKwkJbjEtPnR5cGUgPSBOQ0FTRTsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRXT1JEKQorCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFdPUkQpOworCQluMS0+bmNhc2UuZXhwciA9IG4yID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJCW4yLT50eXBlID0gTkFSRzsKKwkJLypuMi0+bmFyZy5uZXh0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJbjItPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQluMi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQlkbyB7CisJCQljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCQl9IHdoaWxlIChyZWFkdG9rZW4oKSA9PSBUTkwpOworCQlpZiAobGFzdHRva2VuICE9IFRJTikKKwkJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KFRJTik7CisJCWNwcCA9ICZuMS0+bmNhc2UuY2FzZXM7CisgbmV4dF9jYXNlOgorCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEOworCQl0ID0gcmVhZHRva2VuKCk7CisJCXdoaWxlICh0ICE9IFRFU0FDKSB7CisJCQlpZiAobGFzdHRva2VuID09IFRMUCkKKwkJCQlyZWFkdG9rZW4oKTsKKwkJCSpjcHAgPSBjcCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmNsaXN0KSk7CisJCQljcC0+dHlwZSA9IE5DTElTVDsKKwkJCWFwcCA9ICZjcC0+bmNsaXN0LnBhdHRlcm47CisJCQlmb3IgKDs7KSB7CisJCQkJKmFwcCA9IGFwID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJCQkJYXAtPnR5cGUgPSBOQVJHOworCQkJCS8qYXAtPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQkJYXAtPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQkJCWFwLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJCQkJaWYgKHJlYWR0b2tlbigpICE9IFRQSVBFKQorCQkJCQlicmVhazsKKwkJCQlhcHAgPSAmYXAtPm5hcmcubmV4dDsKKwkJCQlyZWFkdG9rZW4oKTsKKwkJCX0KKwkJCS8vYXAtPm5hcmcubmV4dCA9IE5VTEw7CisJCQlpZiAobGFzdHRva2VuICE9IFRSUCkKKwkJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChUUlApOworCQkJY3AtPm5jbGlzdC5ib2R5ID0gbGlzdCgyKTsKKworCQkJY3BwID0gJmNwLT5uY2xpc3QubmV4dDsKKworCQkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRDsKKwkJCXQgPSByZWFkdG9rZW4oKTsKKwkJCWlmICh0ICE9IFRFU0FDKSB7CisJCQkJaWYgKHQgIT0gVEVORENBU0UpCisJCQkJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KFRFTkRDQVNFKTsKKwkJCQlnb3RvIG5leHRfY2FzZTsKKwkJCX0KKwkJfQorCQkqY3BwID0gTlVMTDsKKwkJZ290byByZWRpcjsKKwljYXNlIFRMUDoKKwkJbjEgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5yZWRpcikpOworCQluMS0+dHlwZSA9IE5TVUJTSEVMTDsKKwkJbjEtPm5yZWRpci5uID0gbGlzdCgwKTsKKwkJLypuMS0+bnJlZGlyLnJlZGlyZWN0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJdCA9IFRSUDsKKwkJYnJlYWs7CisJY2FzZSBUQkVHSU46CisJCW4xID0gbGlzdCgwKTsKKwkJdCA9IFRFTkQ7CisJCWJyZWFrOworCWNhc2UgVFdPUkQ6CisJY2FzZSBUUkVESVI6CisJCXRva3B1c2hiYWNrID0gMTsKKwkJcmV0dXJuIHNpbXBsZWNtZCgpOworCX0KKworCWlmIChyZWFkdG9rZW4oKSAhPSB0KQorCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheCh0KTsKKworIHJlZGlyOgorCS8qIE5vdyBjaGVjayBmb3IgcmVkaXJlY3Rpb24gd2hpY2ggbWF5IGZvbGxvdyBjb21tYW5kICovCisJY2hlY2trd2QgPSBDSEtLV0QgfCBDSEtBTElBUzsKKwlycHAgPSBycHAyOworCXdoaWxlIChyZWFkdG9rZW4oKSA9PSBUUkVESVIpIHsKKwkJKnJwcCA9IG4yID0gcmVkaXJub2RlOworCQlycHAgPSAmbjItPm5maWxlLm5leHQ7CisJCXBhcnNlZm5hbWUoKTsKKwl9CisJdG9rcHVzaGJhY2sgPSAxOworCSpycHAgPSBOVUxMOworCWlmIChyZWRpcikgeworCQlpZiAobjEtPnR5cGUgIT0gTlNVQlNIRUxMKSB7CisJCQluMiA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbnJlZGlyKSk7CisJCQluMi0+dHlwZSA9IE5SRURJUjsKKwkJCW4yLT5ucmVkaXIubiA9IG4xOworCQkJbjEgPSBuMjsKKwkJfQorCQluMS0+bnJlZGlyLnJlZGlyZWN0ID0gcmVkaXI7CisJfQorCXJldHVybiBuMTsKK30KKworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKK3N0YXRpYyBpbnQgZGVjb2RlX2RvbGxhcl9zcXVvdGUodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBDX2VzY2FwZXNbXSBBTElHTjEgPSAibnJidGZhdiIieFxcMDEyMzQ1NjciOworCWludCBjLCBjbnQ7CisJY2hhciAqcDsKKwljaGFyIGJ1Zls0XTsKKworCWMgPSBwZ2V0YygpOworCXAgPSBzdHJjaHIoQ19lc2NhcGVzLCBjKTsKKwlpZiAocCkgeworCQlidWZbMF0gPSBjOworCQlwID0gYnVmOworCQljbnQgPSAzOworCQlpZiAoKHVuc2lnbmVkIGNoYXIpKGMgLSAnMCcpIDw9IDcpIHsgLyogXG9vbyAqLworCQkJZG8geworCQkJCWMgPSBwZ2V0YygpOworCQkJCSorK3AgPSBjOworCQkJfSB3aGlsZSAoKHVuc2lnbmVkIGNoYXIpKGMgLSAnMCcpIDw9IDcgJiYgLS1jbnQpOworCQkJcHVuZ2V0YygpOworCQl9IGVsc2UgaWYgKGMgPT0gJ3gnKSB7IC8qIFx4SEggKi8KKwkJCWRvIHsKKwkJCQljID0gcGdldGMoKTsKKwkJCQkqKytwID0gYzsKKwkJCX0gd2hpbGUgKGlzeGRpZ2l0KGMpICYmIC0tY250KTsKKwkJCXB1bmdldGMoKTsKKwkJCWlmIChjbnQgPT0gMykgeyAvKiBceCBidXQgbmV4dCBjaGFyIGlzICJiYWQiICovCisJCQkJYyA9ICd4JzsKKwkJCQlnb3RvIHVucmVjb2duaXplZDsKKwkJCX0KKwkJfSBlbHNlIHsgLyogc2ltcGxlIHNlcSBsaWtlIFxcIG9yIFx0ICovCisJCQlwKys7CisJCX0KKwkJKnAgPSAnXDAnOworCQlwID0gYnVmOworCQljID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoKHZvaWQqKSZwKTsKKwl9IGVsc2UgeyAvKiB1bnJlY29nbml6ZWQgIlx6IjogcHJpbnQgYm90aCBjaGFycyB1bmxlc3MgJyBvciAiICovCisJCWlmIChjICE9ICdcJycgJiYgYyAhPSAnIicpIHsKKyB1bnJlY29nbml6ZWQ6CisJCQljIHw9IDB4MTAwOyAvKiAicGxlYXNlIGVuY29kZSBcLCB0aGVuIG1lIiAqLworCQl9CisJfQorCXJldHVybiBjOworfQorI2VuZGlmCisKKy8qCisgKiBJZiBlb2ZtYXJrIGlzIE5VTEwsIHJlYWQgYSB3b3JkIG9yIGEgcmVkaXJlY3Rpb24gc3ltYm9sLiAgSWYgZW9mbWFyaworICogaXMgbm90IE5VTEwsIHJlYWQgYSBoZXJlIGRvY3VtZW50LiAgSW4gdGhlIGxhdHRlciBjYXNlLCBlb2ZtYXJrIGlzIHRoZQorICogd29yZCB3aGljaCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCBhbmQgc3RyaXB0YWJzIGlzIHRydWUgaWYKKyAqIGxlYWRpbmcgdGFicyBzaG91bGQgYmUgc3RyaXBwZWQgZnJvbSB0aGUgZG9jdW1lbnQuICBUaGUgYXJndW1lbnQgYworICogaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgdG9rZW4gb3IgZG9jdW1lbnQuCisgKgorICogQmVjYXVzZSBDIGRvZXMgbm90IGhhdmUgaW50ZXJuYWwgc3Vicm91dGluZXMsIEkgaGF2ZSBzaW11bGF0ZWQgdGhlbQorICogdXNpbmcgZ290bydzIHRvIGltcGxlbWVudCB0aGUgc3Vicm91dGluZSBsaW5rYWdlLiAgVGhlIGZvbGxvd2luZyBtYWNyb3MKKyAqIHdpbGwgcnVuIGNvZGUgdGhhdCBhcHBlYXJzIGF0IHRoZSBlbmQgb2YgcmVhZHRva2VuMS4KKyAqLworI2RlZmluZSBDSEVDS0VORCgpICAgICAge2dvdG8gY2hlY2tlbmQ7IGNoZWNrZW5kX3JldHVybjo7fQorI2RlZmluZSBQQVJTRVJFRElSKCkgICAge2dvdG8gcGFyc2VyZWRpcjsgcGFyc2VyZWRpcl9yZXR1cm46O30KKyNkZWZpbmUgUEFSU0VTVUIoKSAgICAgIHtnb3RvIHBhcnNlc3ViOyBwYXJzZXN1Yl9yZXR1cm46O30KKyNkZWZpbmUgUEFSU0VCQUNLUU9MRCgpIHtvbGRzdHlsZSA9IDE7IGdvdG8gcGFyc2ViYWNrcTsgcGFyc2ViYWNrcV9vbGRyZXR1cm46O30KKyNkZWZpbmUgUEFSU0VCQUNLUU5FVygpIHtvbGRzdHlsZSA9IDA7IGdvdG8gcGFyc2ViYWNrcTsgcGFyc2ViYWNrcV9uZXdyZXR1cm46O30KKyNkZWZpbmUgUEFSU0VBUklUSCgpICAgIHtnb3RvIHBhcnNlYXJpdGg7IHBhcnNlYXJpdGhfcmV0dXJuOjt9CitzdGF0aWMgaW50CityZWFkdG9rZW4xKGludCBjLCBpbnQgc3ludGF4LCBjaGFyICplb2ZtYXJrLCBpbnQgc3RyaXB0YWJzKQoreworCS8qIE5COiBzeW50YXggcGFyYW1ldGVyIGZpdHMgaW50byBzbWFsbGludCAqLworCS8qIGMgcGFyYW1ldGVyIGlzIGFuIHVuc2lnbmVkIGNoYXIgb3IgUEVPRiBvciBQRU9BICovCisJY2hhciAqb3V0OworCWludCBsZW47CisJY2hhciBsaW5lW0VPRk1BUktMRU4gKyAxXTsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmJxbGlzdDsKKwlzbWFsbGludCBxdW90ZWY7CisJc21hbGxpbnQgZGJscXVvdGU7CisJc21hbGxpbnQgb2xkc3R5bGU7CisJc21hbGxpbnQgcHJldnN5bnRheDsgLyogc3ludGF4IGJlZm9yZSBhcml0aG1ldGljICovCisjaWYgRU5BQkxFX0FTSF9FWFBBTkRfUFJNVAorCXNtYWxsaW50IHBzc3ludGF4OyAgIC8qIHdlIGFyZSBleHBhbmRpbmcgYSBwcm9tcHQgc3RyaW5nICovCisjZW5kaWYKKwlpbnQgdmFybmVzdDsgICAgICAgICAvKiBsZXZlbHMgb2YgdmFyaWFibGVzIGV4cGFuc2lvbiAqLworCWludCBhcmluZXN0OyAgICAgICAgIC8qIGxldmVscyBvZiBhcml0aG1ldGljIGV4cGFuc2lvbiAqLworCWludCBwYXJlbmxldmVsOyAgICAgIC8qIGxldmVscyBvZiBwYXJlbnMgaW4gYXJpdGhtZXRpYyAqLworCWludCBkcXZhcm5lc3Q7ICAgICAgIC8qIGxldmVscyBvZiB2YXJpYWJsZXMgZXhwYW5zaW9uIHdpdGhpbiBkb3VibGUgcXVvdGVzICovCisKKwlJRl9BU0hfQkFTSF9DT01QQVQoc21hbGxpbnQgYmFzaF9kb2xsYXJfc3F1b3RlID0gMDspCisKKyNpZiBfX0dOVUNfXworCS8qIEF2b2lkIGxvbmdqbXAgY2xvYmJlcmluZyAqLworCSh2b2lkKSAmb3V0OworCSh2b2lkKSAmcXVvdGVmOworCSh2b2lkKSAmZGJscXVvdGU7CisJKHZvaWQpICZ2YXJuZXN0OworCSh2b2lkKSAmYXJpbmVzdDsKKwkodm9pZCkgJnBhcmVubGV2ZWw7CisJKHZvaWQpICZkcXZhcm5lc3Q7CisJKHZvaWQpICZvbGRzdHlsZTsKKwkodm9pZCkgJnByZXZzeW50YXg7CisJKHZvaWQpICZzeW50YXg7CisjZW5kaWYKKwlzdGFydGxpbm5vID0gZ19wYXJzZWZpbGUtPmxpbm5vOworCWJxbGlzdCA9IE5VTEw7CisJcXVvdGVmID0gMDsKKwlwcmV2c3ludGF4ID0gMDsKKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisJcHNzeW50YXggPSAoc3ludGF4ID09IFBTU1lOVEFYKTsKKwlpZiAocHNzeW50YXgpCisJCXN5bnRheCA9IERRU1lOVEFYOworI2VuZGlmCisJZGJscXVvdGUgPSAoc3ludGF4ID09IERRU1lOVEFYKTsKKwl2YXJuZXN0ID0gMDsKKwlhcmluZXN0ID0gMDsKKwlwYXJlbmxldmVsID0gMDsKKwlkcXZhcm5lc3QgPSAwOworCisJU1RBUlRTVEFDS1NUUihvdXQpOworIGxvb3A6CisJLyogRm9yIGVhY2ggbGluZSwgdW50aWwgZW5kIG9mIHdvcmQgKi8KKwlDSEVDS0VORCgpOyAgICAgLyogc2V0IGMgdG8gUEVPRiBpZiBhdCBlbmQgb2YgaGVyZSBkb2N1bWVudCAqLworCWZvciAoOzspIHsgICAgICAvKiB1bnRpbCBlbmQgb2YgbGluZSBvciBlbmQgb2Ygd29yZCAqLworCQlDSEVDS1NUUlNQQUNFKDQsIG91dCk7ICAvKiBwZXJtaXQgNCBjYWxscyB0byBVU1RQVVRDICovCisJCXN3aXRjaCAoU0lUKGMsIHN5bnRheCkpIHsKKwkJY2FzZSBDTkw6ICAgICAgIC8qICdcbicgKi8KKwkJCWlmIChzeW50YXggPT0gQkFTRVNZTlRBWCkKKwkJCQlnb3RvIGVuZHdvcmQ7ICAgLyogZXhpdCBvdXRlciBsb29wICovCisJCQlVU1RQVVRDKGMsIG91dCk7CisJCQlnX3BhcnNlZmlsZS0+bGlubm8rKzsKKwkJCXNldHByb21wdF9pZihkb3Byb21wdCwgMik7CisJCQljID0gcGdldGMoKTsKKwkJCWdvdG8gbG9vcDsgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIG91dGVyIGxvb3AgKi8KKwkJY2FzZSBDV09SRDoKKwkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIENDVEw6CisJCQlpZiAoZW9mbWFyayA9PSBOVUxMIHx8IGRibHF1b3RlKQorCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJCWlmIChjID09ICdcXCcgJiYgYmFzaF9kb2xsYXJfc3F1b3RlKSB7CisJCQkJYyA9IGRlY29kZV9kb2xsYXJfc3F1b3RlKCk7CisJCQkJaWYgKGMgJiAweDEwMCkgeworCQkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJCWMgPSAodW5zaWduZWQgY2hhciljOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgQ0JBQ0s6ICAgICAvKiBiYWNrc2xhc2ggKi8KKwkJCWMgPSBwZ2V0Y193aXRob3V0X1BFT0EoKTsKKwkJCWlmIChjID09IFBFT0YpIHsKKwkJCQlVU1RQVVRDKENUTEVTQywgb3V0KTsKKwkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJcHVuZ2V0YygpOworCQkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCQlzZXRwcm9tcHRfaWYoZG9wcm9tcHQsIDIpOworCQkJfSBlbHNlIHsKKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisJCQkJaWYgKGMgPT0gJyQnICYmIHBzc3ludGF4KSB7CisJCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworCQkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJfQorI2VuZGlmCisJCQkJLyogQmFja3NsYXNoIGlzIHJldGFpbmVkIGlmIHdlIGFyZSBpbiAic3RyIiBhbmQgbmV4dCBjaGFyIGlzbid0IHNwZWNpYWwgKi8KKwkJCQlpZiAoZGJscXVvdGUKKwkJCQkgJiYgYyAhPSAnXFwnCisJCQkJICYmIGMgIT0gJ2AnCisJCQkJICYmIGMgIT0gJyQnCisJCQkJICYmIChjICE9ICciJyB8fCBlb2ZtYXJrICE9IE5VTEwpCisJCQkJKSB7CisJCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworCQkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJfQorCQkJCWlmIChTSVQoYywgU1FTWU5UQVgpID09IENDVEwpCisJCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQlxdW90ZWYgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ1NRVU9URToKKwkJCXN5bnRheCA9IFNRU1lOVEFYOworIHF1b3RlbWFyazoKKwkJCWlmIChlb2ZtYXJrID09IE5VTEwpIHsKKwkJCQlVU1RQVVRDKENUTFFVT1RFTUFSSywgb3V0KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENEUVVPVEU6CisJCQlzeW50YXggPSBEUVNZTlRBWDsKKwkJCWRibHF1b3RlID0gMTsKKwkJCWdvdG8gcXVvdGVtYXJrOworCQljYXNlIENFTkRRVU9URToKKwkJCUlGX0FTSF9CQVNIX0NPTVBBVChiYXNoX2RvbGxhcl9zcXVvdGUgPSAwOykKKwkJCWlmIChlb2ZtYXJrICE9IE5VTEwgJiYgYXJpbmVzdCA9PSAwCisJCQkgJiYgdmFybmVzdCA9PSAwCisJCQkpIHsKKwkJCQlVU1RQVVRDKGMsIG91dCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChkcXZhcm5lc3QgPT0gMCkgeworCQkJCQlzeW50YXggPSBCQVNFU1lOVEFYOworCQkJCQlkYmxxdW90ZSA9IDA7CisJCQkJfQorCQkJCXF1b3RlZiA9IDE7CisJCQkJZ290byBxdW90ZW1hcms7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDVkFSOiAgICAgIC8qICckJyAqLworCQkJUEFSU0VTVUIoKTsgICAgICAgICAgICAgLyogcGFyc2Ugc3Vic3RpdHV0aW9uICovCisJCQlicmVhazsKKwkJY2FzZSBDRU5EVkFSOiAgIC8qICd9JyAqLworCQkJaWYgKHZhcm5lc3QgPiAwKSB7CisJCQkJdmFybmVzdC0tOworCQkJCWlmIChkcXZhcm5lc3QgPiAwKSB7CisJCQkJCWRxdmFybmVzdC0tOworCQkJCX0KKwkJCQljID0gQ1RMRU5EVkFSOworCQkJfQorCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYnJlYWs7CisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQljYXNlIENMUDogICAgICAgLyogJygnIGluIGFyaXRobWV0aWMgKi8KKwkJCXBhcmVubGV2ZWwrKzsKKwkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIENSUDogICAgICAgLyogJyknIGluIGFyaXRobWV0aWMgKi8KKwkJCWlmIChwYXJlbmxldmVsID4gMCkgeworCQkJCXBhcmVubGV2ZWwtLTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBnZXRjKCkgPT0gJyknKSB7CisJCQkJCWlmICgtLWFyaW5lc3QgPT0gMCkgeworCQkJCQkJc3ludGF4ID0gcHJldnN5bnRheDsKKwkJCQkJCWRibHF1b3RlID0gKHN5bnRheCA9PSBEUVNZTlRBWCk7CisJCQkJCQljID0gQ1RMRU5EQVJJOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogdW5iYWxhbmNlZCBwYXJlbnMKKwkJCQkJICogKGRvbid0IDJuZCBndWVzcyAtIG5vIGVycm9yKQorCQkJCQkgKi8KKwkJCQkJcHVuZ2V0YygpOworCQkJCX0KKwkJCX0KKwkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQ0JRVU9URTogICAvKiAnYCcgKi8KKwkJCVBBUlNFQkFDS1FPTEQoKTsKKwkJCWJyZWFrOworCQljYXNlIENFTkRGSUxFOgorCQkJZ290byBlbmR3b3JkOyAgICAgICAgICAgLyogZXhpdCBvdXRlciBsb29wICovCisJCWNhc2UgQ0lHTjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHZhcm5lc3QgPT0gMCkgeworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJCQlpZiAoYyA9PSAnJicpIHsKKwkJCQkJaWYgKHBnZXRjKCkgPT0gJz4nKQorCQkJCQkJYyA9IDB4MTAwICsgJz4nOyAvKiBmbGFnICY+ICovCisJCQkJCXB1bmdldGMoKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlnb3RvIGVuZHdvcmQ7ICAgLyogZXhpdCBvdXRlciBsb29wICovCisJCQl9CisJCQlJRl9BU0hfQUxJQVMoaWYgKGMgIT0gUEVPQSkpCisJCQkJVVNUUFVUQyhjLCBvdXQpOworCQl9CisJCWMgPSBwZ2V0Y19mYXN0KCk7CisJfSAvKiBmb3IgKDs7KSAqLworIGVuZHdvcmQ6CisKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJaWYgKHN5bnRheCA9PSBBUklTWU5UQVgpCisJCXJhaXNlX2Vycm9yX3N5bnRheCgibWlzc2luZyAnKSknIik7CisjZW5kaWYKKwlpZiAoc3ludGF4ICE9IEJBU0VTWU5UQVggJiYgIXBhcnNlYmFja3F1b3RlICYmIGVvZm1hcmsgPT0gTlVMTCkKKwkJcmFpc2VfZXJyb3Jfc3ludGF4KCJ1bnRlcm1pbmF0ZWQgcXVvdGVkIHN0cmluZyIpOworCWlmICh2YXJuZXN0ICE9IDApIHsKKwkJc3RhcnRsaW5ubyA9IGdfcGFyc2VmaWxlLT5saW5ubzsKKwkJLyogeyAqLworCQlyYWlzZV9lcnJvcl9zeW50YXgoIm1pc3NpbmcgJ30nIik7CisJfQorCVVTVFBVVEMoJ1wwJywgb3V0KTsKKwlsZW4gPSBvdXQgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlvdXQgPSBzdGFja2Jsb2NrKCk7CisJaWYgKGVvZm1hcmsgPT0gTlVMTCkgeworCQlpZiAoKGMgPT0gJz4nIHx8IGMgPT0gJzwnIElGX0FTSF9CQVNIX0NPTVBBVCggfHwgYyA9PSAweDEwMCArICc+JykpCisJCSAmJiBxdW90ZWYgPT0gMAorCQkpIHsKKwkJCWlmIChpc2RpZ2l0X3N0cjkob3V0KSkgeworCQkJCVBBUlNFUkVESVIoKTsgLyogcGFzc2VkIGFzIHBhcmFtczogb3V0LCBjICovCisJCQkJbGFzdHRva2VuID0gVFJFRElSOworCQkJCXJldHVybiBsYXN0dG9rZW47CisJCQl9CisJCQkvKiBlbHNlOiBub24tbnVtYmVyIFggc2VlbiwgaW50ZXJwcmV0IGl0CisJCQkgKiBhcyAiTk5OWD5maWxlIiA9ICJOTk5YID5maWxlIiAqLworCQl9CisJCXB1bmdldGMoKTsKKwl9CisJcXVvdGVmbGFnID0gcXVvdGVmOworCWJhY2txdW90ZWxpc3QgPSBicWxpc3Q7CisJZ3JhYnN0YWNrYmxvY2sobGVuKTsKKwl3b3JkdGV4dCA9IG91dDsKKwlsYXN0dG9rZW4gPSBUV09SRDsKKwlyZXR1cm4gbGFzdHRva2VuOworLyogZW5kIG9mIHJlYWR0b2tlbiByb3V0aW5lICovCisKKy8qCisgKiBDaGVjayB0byBzZWUgd2hldGhlciB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaGVyZSBkb2N1bWVudC4gIFdoZW4gdGhpcworICogaXMgY2FsbGVkLCBjIGlzIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBuZXh0IGlucHV0IGxpbmUuICBJZgorICogd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGhlcmUgZG9jdW1lbnQsIHRoaXMgcm91dGluZSBzZXRzIHRoZSBjIHRvIFBFT0YuCisgKi8KK2NoZWNrZW5kOiB7CisJaWYgKGVvZm1hcmspIHsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJCWlmIChjID09IFBFT0EpCisJCQljID0gcGdldGNfd2l0aG91dF9QRU9BKCk7CisjZW5kaWYKKwkJaWYgKHN0cmlwdGFicykgeworCQkJd2hpbGUgKGMgPT0gJ1x0JykgeworCQkJCWMgPSBwZ2V0Y193aXRob3V0X1BFT0EoKTsKKwkJCX0KKwkJfQorCQlpZiAoYyA9PSAqZW9mbWFyaykgeworCQkJaWYgKHBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSkpICE9IE5VTEwpIHsKKwkJCQljaGFyICpwLCAqcTsKKworCQkJCXAgPSBsaW5lOworCQkJCWZvciAocSA9IGVvZm1hcmsgKyAxOyAqcSAmJiAqcCA9PSAqcTsgcCsrLCBxKyspCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgqcCA9PSAnXG4nICYmICpxID09ICdcMCcpIHsKKwkJCQkJYyA9IFBFT0Y7CisJCQkJCWdfcGFyc2VmaWxlLT5saW5ubysrOworCQkJCQluZWVkcHJvbXB0ID0gZG9wcm9tcHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHVzaHN0cmluZyhsaW5lLCBOVUxMKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZ290byBjaGVja2VuZF9yZXR1cm47Cit9CisKKy8qCisgKiBQYXJzZSBhIHJlZGlyZWN0aW9uIG9wZXJhdG9yLiAgVGhlIHZhcmlhYmxlICJvdXQiIHBvaW50cyB0byBhIHN0cmluZworICogc3BlY2lmeWluZyB0aGUgZmQgdG8gYmUgcmVkaXJlY3RlZC4gIFRoZSB2YXJpYWJsZSAiYyIgY29udGFpbnMgdGhlCisgKiBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9yLgorICovCitwYXJzZXJlZGlyOiB7CisJLyogb3V0IGlzIGFscmVhZHkgY2hlY2tlZCB0byBiZSBhIHZhbGlkIG51bWJlciBvciAiIiAqLworCWludCBmZCA9ICgqb3V0ID09ICdcMCcgPyAtMSA6IGF0b2kob3V0KSk7CisJdW5pb24gbm9kZSAqbnA7CisKKwlucCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmZpbGUpKTsKKwlpZiAoYyA9PSAnPicpIHsKKwkJbnAtPm5maWxlLmZkID0gMTsKKwkJYyA9IHBnZXRjKCk7CisJCWlmIChjID09ICc+JykKKwkJCW5wLT50eXBlID0gTkFQUEVORDsKKwkJZWxzZSBpZiAoYyA9PSAnfCcpCisJCQlucC0+dHlwZSA9IE5DTE9CQkVSOworCQllbHNlIGlmIChjID09ICcmJykKKwkJCW5wLT50eXBlID0gTlRPRkQ7CisJCQkvKiBpdCBhbHNvIGNhbiBiZSBOVE8yICg+JmZpbGUpLCBidXQgd2UgY2FuJ3QgZmlndXJlIGl0IG91dCB5ZXQgKi8KKwkJZWxzZSB7CisJCQlucC0+dHlwZSA9IE5UTzsKKwkJCXB1bmdldGMoKTsKKwkJfQorCX0KKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJZWxzZSBpZiAoYyA9PSAweDEwMCArICc+JykgeyAvKiB0aGlzIGZsYWdzICY+IHJlZGlyZWN0aW9uICovCisJCW5wLT5uZmlsZS5mZCA9IDE7CisJCXBnZXRjKCk7IC8qIHRoaXMgaXMgJz4nLCBubyBuZWVkIHRvIGNoZWNrICovCisJCW5wLT50eXBlID0gTlRPMjsKKwl9CisjZW5kaWYKKwllbHNlIHsgLyogYyA9PSAnPCcgKi8KKwkJLypucC0+bmZpbGUuZmQgPSAwOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQljID0gcGdldGMoKTsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJzwnOgorCQkJaWYgKHNpemVvZihzdHJ1Y3QgbmZpbGUpICE9IHNpemVvZihzdHJ1Y3QgbmhlcmUpKSB7CisJCQkJbnAgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5oZXJlKSk7CisJCQkJLypucC0+bmZpbGUuZmQgPSAwOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQkJfQorCQkJbnAtPnR5cGUgPSBOSEVSRTsKKwkJCWhlcmVkb2MgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IGhlcmVkb2MpKTsKKwkJCWhlcmVkb2MtPmhlcmUgPSBucDsKKwkJCWMgPSBwZ2V0YygpOworCQkJaWYgKGMgPT0gJy0nKSB7CisJCQkJaGVyZWRvYy0+c3RyaXB0YWJzID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJLypoZXJlZG9jLT5zdHJpcHRhYnMgPSAwOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQkJCXB1bmdldGMoKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJyYnOgorCQkJbnAtPnR5cGUgPSBORlJPTUZEOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPic6CisJCQlucC0+dHlwZSA9IE5GUk9NVE87CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbnAtPnR5cGUgPSBORlJPTTsKKwkJCXB1bmdldGMoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChmZCA+PSAwKQorCQlucC0+bmZpbGUuZmQgPSBmZDsKKwlyZWRpcm5vZGUgPSBucDsKKwlnb3RvIHBhcnNlcmVkaXJfcmV0dXJuOworfQorCisvKgorICogUGFyc2UgYSBzdWJzdGl0dXRpb24uICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHJlYWQgdGhlIGRvbGxhciBzaWduCisgKiBhbmQgbm90aGluZyBlbHNlLgorICovCisKKy8qIGlzX3NwZWNpYWwoYykgZXZhbHVhdGVzIHRvIDEgZm9yIGMgaW4gIiEjJCotMDEyMzQ1Njc4OT9AIjsgMCBvdGhlcndpc2UKKyAqIChhc3N1bWluZyBhc2NpaSBjaGFyIGNvZGVzLCBhcyB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gZGlkKSAqLworI2RlZmluZSBpc19zcGVjaWFsKGMpIFwKKwkoKCh1bnNpZ25lZCkoYykgLSAzMyA8IDMyKSBcCisJCQkmJiAoKDB4YzFmZjkyMGRVID4+ICgodW5zaWduZWQpKGMpIC0gMzMpKSAmIDEpKQorcGFyc2VzdWI6IHsKKwl1bnNpZ25lZCBjaGFyIHN1YnR5cGU7CisJaW50IHR5cGVsb2M7CisJaW50IGZsYWdzOworCisJYyA9IHBnZXRjKCk7CisJaWYgKGMgPiAyNTUgLyogUEVPQSBvciBQRU9GICovCisJIHx8IChjICE9ICcoJyAmJiBjICE9ICd7JyAmJiAhaXNfbmFtZShjKSAmJiAhaXNfc3BlY2lhbChjKSkKKwkpIHsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCWlmIChjID09ICdcJycpCisJCQliYXNoX2RvbGxhcl9zcXVvdGUgPSAxOworCQllbHNlCisjZW5kaWYKKwkJCVVTVFBVVEMoJyQnLCBvdXQpOworCQlwdW5nZXRjKCk7CisJfSBlbHNlIGlmIChjID09ICcoJykgeworCQkvKiAkKGNvbW1hbmQpIG9yICQoKGFyaXRoKSkgKi8KKwkJaWYgKHBnZXRjKCkgPT0gJygnKSB7CisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQkJUEFSU0VBUklUSCgpOworI2Vsc2UKKwkJCXJhaXNlX2Vycm9yX3N5bnRheCgieW91IGRpc2FibGVkIG1hdGggc3VwcG9ydCBmb3IgJCgoYXJpdGgpKSBzeW50YXgiKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJcHVuZ2V0YygpOworCQkJUEFSU0VCQUNLUU5FVygpOworCQl9CisJfSBlbHNlIHsKKwkJLyogJFZBUiwgJDxzcGVjaWFsY2hhcj4sICR7Li4ufSwgb3IgUEVPQS9QRU9GICovCisJCVVTVFBVVEMoQ1RMVkFSLCBvdXQpOworCQl0eXBlbG9jID0gb3V0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJCVVTVFBVVEMoVlNOT1JNQUwsIG91dCk7CisJCXN1YnR5cGUgPSBWU05PUk1BTDsKKwkJaWYgKGMgPT0gJ3snKSB7CisJCQljID0gcGdldGMoKTsKKwkJCWlmIChjID09ICcjJykgeworCQkJCWMgPSBwZ2V0YygpOworCQkJCWlmIChjID09ICd9JykKKwkJCQkJYyA9ICcjJzsgLyogJHsjfSAtIHNhbWUgYXMgJCMgKi8KKwkJCQllbHNlCisJCQkJCXN1YnR5cGUgPSBWU0xFTkdUSDsgLyogJHsjVkFSfSAqLworCQkJfSBlbHNlIHsKKwkJCQlzdWJ0eXBlID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoYyA8PSAyNTUgLyogbm90IFBFT0Egb3IgUEVPRiAqLyAmJiBpc19uYW1lKGMpKSB7CisJCQkvKiAkW3tbI11dTkFNRVt9XSAqLworCQkJZG8geworCQkJCVNUUFVUQyhjLCBvdXQpOworCQkJCWMgPSBwZ2V0YygpOworCQkJfSB3aGlsZSAoYyA8PSAyNTUgLyogbm90IFBFT0Egb3IgUEVPRiAqLyAmJiBpc19pbl9uYW1lKGMpKTsKKwkJfSBlbHNlIGlmIChpc2RpZ2l0KGMpKSB7CisJCQkvKiAkW3tbI11dTlVNW31dICovCisJCQlkbyB7CisJCQkJU1RQVVRDKGMsIG91dCk7CisJCQkJYyA9IHBnZXRjKCk7CisJCQl9IHdoaWxlIChpc2RpZ2l0KGMpKTsKKwkJfSBlbHNlIGlmIChpc19zcGVjaWFsKGMpKSB7CisJCQkvKiAkW3tbI11dPHNwZWNpYWxjaGFyPlt9XSAqLworCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYyA9IHBnZXRjKCk7CisJCX0gZWxzZSB7CisgYmFkc3ViOgorCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJiYWQgc3Vic3RpdHV0aW9uIik7CisJCX0KKwkJaWYgKGMgIT0gJ30nICYmIHN1YnR5cGUgPT0gVlNMRU5HVEgpIHsKKwkJCS8qICR7I1ZBUiBkaWRuJ3QgZW5kIHdpdGggfSAqLworCQkJZ290byBiYWRzdWI7CisJCX0KKworCQlTVFBVVEMoJz0nLCBvdXQpOworCQlmbGFncyA9IDA7CisJCWlmIChzdWJ0eXBlID09IDApIHsKKwkJCS8qICR7VkFSLi4ufSBidXQgbm90ICRWQVIgb3IgJHsjVkFSfSAqLworCQkJLyogYyA9PSBmaXJzdCBjaGFyIGFmdGVyIFZBUiAqLworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICc6JzoKKwkJCQljID0gcGdldGMoKTsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQkJaWYgKGMgPT0gJzonIHx8IGMgPT0gJyQnIHx8IGlzZGlnaXQoYykpIHsKKy8vVE9ETzogc3VwcG9ydCBtb3JlIGdlbmVyYWwgZm9ybWF0ICR7djpFWFBSOkVYUFJ9LAorLy8gd2hlcmUgRVhQUiBmb2xsb3dzICQoKCkpIHJ1bGVzCisJCQkJCXN1YnR5cGUgPSBWU1NVQlNUUjsKKwkJCQkJcHVuZ2V0YygpOworCQkJCQlicmVhazsgLyogImdvdG8gZG9fcHVuZ2V0YyIgaXMgYmlnZ2VyICghKSAqLworCQkJCX0KKyNlbmRpZgorCQkJCWZsYWdzID0gVlNOVUw7CisJCQkJLypGQUxMVEhST1VHSCovCisJCQlkZWZhdWx0OiB7CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgdHlwZXNbXSBBTElHTjEgPSAifS0rPz0iOworCQkJCWNvbnN0IGNoYXIgKnAgPSBzdHJjaHIodHlwZXMsIGMpOworCQkJCWlmIChwID09IE5VTEwpCisJCQkJCWdvdG8gYmFkc3ViOworCQkJCXN1YnR5cGUgPSBwIC0gdHlwZXMgKyBWU05PUk1BTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJyUnOgorCQkJY2FzZSAnIyc6IHsKKwkJCQlpbnQgY2MgPSBjOworCQkJCXN1YnR5cGUgPSAoYyA9PSAnIycgPyBWU1RSSU1MRUZUIDogVlNUUklNUklHSFQpOworCQkJCWMgPSBwZ2V0YygpOworCQkJCWlmIChjICE9IGNjKQorCQkJCQlnb3RvIGRvX3B1bmdldGM7CisJCQkJc3VidHlwZSsrOworCQkJCWJyZWFrOworCQkJfQorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJCWNhc2UgJy8nOgorCQkJCS8qICR7di9bL11wYXR0ZXJuL3JlcGx9ICovCisvL1RPRE86IGVuY29kZSBwYXR0ZXJuIGFuZCByZXBsIHNlcGFyYXRlbHkuCisvLyBDdXJyZW50bHkgJHt2LyR2YXJfd2l0aF9zbGFzaC9yZXBsfSBpcyBob3JyaWJseSBicm9rZW4KKwkJCQlzdWJ0eXBlID0gVlNSRVBMQUNFOworCQkJCWMgPSBwZ2V0YygpOworCQkJCWlmIChjICE9ICcvJykKKwkJCQkJZ290byBkb19wdW5nZXRjOworCQkJCXN1YnR5cGUrKzsgLyogVlNSRVBMQUNFQUxMICovCisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCX0KKwkJfSBlbHNlIHsKKyBkb19wdW5nZXRjOgorCQkJcHVuZ2V0YygpOworCQl9CisJCWlmIChkYmxxdW90ZSB8fCBhcmluZXN0KQorCQkJZmxhZ3MgfD0gVlNRVU9URTsKKwkJKCh1bnNpZ25lZCBjaGFyICopc3RhY2tibG9jaygpKVt0eXBlbG9jXSA9IHN1YnR5cGUgfCBmbGFnczsKKwkJaWYgKHN1YnR5cGUgIT0gVlNOT1JNQUwpIHsKKwkJCXZhcm5lc3QrKzsKKwkJCWlmIChkYmxxdW90ZSB8fCBhcmluZXN0KSB7CisJCQkJZHF2YXJuZXN0Kys7CisJCQl9CisJCX0KKwl9CisJZ290byBwYXJzZXN1Yl9yZXR1cm47Cit9CisKKy8qCisgKiBDYWxsZWQgdG8gcGFyc2UgY29tbWFuZCBzdWJzdGl0dXRpb25zLiAgTmV3c3R5bGUgaXMgc2V0IGlmIHRoZSBjb21tYW5kCisgKiBpcyBlbmNsb3NlZCBpbnNpZGUgJCguLi4pOyBubHBwIGlzIGEgcG9pbnRlciB0byB0aGUgaGVhZCBvZiB0aGUgbGlua2VkCisgKiBsaXN0IG9mIGNvbW1hbmRzIChwYXNzZWQgYnkgcmVmZXJlbmNlKSwgYW5kIHNhdmVsZW4gaXMgdGhlIG51bWJlciBvZgorICogY2hhcmFjdGVycyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aGljaCBtdXN0IGJlIHByZXNlcnZlZC4KKyAqLworcGFyc2ViYWNrcTogeworCXN0cnVjdCBub2RlbGlzdCAqKm5scHA7CisJc21hbGxpbnQgc2F2ZXBicTsKKwl1bmlvbiBub2RlICpuOworCWNoYXIgKnZvbGF0aWxlIHN0cjsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKwlzdHJ1Y3Qgam1wbG9jICp2b2xhdGlsZSBzYXZlaGFuZGxlcjsKKwlzaXplX3Qgc2F2ZWxlbjsKKwlzbWFsbGludCBzYXZlcHJvbXB0ID0gMDsKKworI2lmZGVmIF9fR05VQ19fCisJKHZvaWQpICZzYXZlcHJvbXB0OworI2VuZGlmCisJc2F2ZXBicSA9IHBhcnNlYmFja3F1b3RlOworCWlmIChzZXRqbXAoam1wbG9jLmxvYykpIHsKKwkJZnJlZShzdHIpOworCQlwYXJzZWJhY2txdW90ZSA9IDA7CisJCWV4Y2VwdGlvbl9oYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisJCWxvbmdqbXAoZXhjZXB0aW9uX2hhbmRsZXItPmxvYywgMSk7CisJfQorCUlOVF9PRkY7CisJc3RyID0gTlVMTDsKKwlzYXZlbGVuID0gb3V0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJaWYgKHNhdmVsZW4gPiAwKSB7CisJCXN0ciA9IGNrbWFsbG9jKHNhdmVsZW4pOworCQltZW1jcHkoc3RyLCBzdGFja2Jsb2NrKCksIHNhdmVsZW4pOworCX0KKwlzYXZlaGFuZGxlciA9IGV4Y2VwdGlvbl9oYW5kbGVyOworCWV4Y2VwdGlvbl9oYW5kbGVyID0gJmptcGxvYzsKKwlJTlRfT047CisJaWYgKG9sZHN0eWxlKSB7CisJCS8qIFdlIG11c3QgcmVhZCB1bnRpbCB0aGUgY2xvc2luZyBiYWNrcXVvdGUsIGdpdmluZyBzcGVjaWFsCisJCSAgIHRyZWF0bWVudCB0byBzb21lIHNsYXNoZXMsIGFuZCB0aGVuIHB1c2ggdGhlIHN0cmluZyBhbmQKKwkJICAgcmVyZWFkIGl0IGFzIGlucHV0LCBpbnRlcnByZXRpbmcgaXQgbm9ybWFsbHkuICAqLworCQljaGFyICpwb3V0OworCQlzaXplX3QgcHNhdmVsZW47CisJCWNoYXIgKnBzdHI7CisKKwkJU1RBUlRTVEFDS1NUUihwb3V0KTsKKwkJZm9yICg7OykgeworCQkJaW50IHBjOworCisJCQlzZXRwcm9tcHRfaWYobmVlZHByb21wdCwgMik7CisJCQlwYyA9IHBnZXRjKCk7CisJCQlzd2l0Y2ggKHBjKSB7CisJCQljYXNlICdgJzoKKwkJCQlnb3RvIGRvbmU7CisKKwkJCWNhc2UgJ1xcJzoKKwkJCQlwYyA9IHBnZXRjKCk7CisJCQkJaWYgKHBjID09ICdcbicpIHsKKwkJCQkJZ19wYXJzZWZpbGUtPmxpbm5vKys7CisJCQkJCXNldHByb21wdF9pZihkb3Byb21wdCwgMik7CisJCQkJCS8qCisJCQkJCSAqIElmIGVhdGluZyBhIG5ld2xpbmUsIGF2b2lkIHB1dHRpbmcKKwkJCQkJICogdGhlIG5ld2xpbmUgaW50byB0aGUgbmV3IGNoYXJhY3RlcgorCQkJCQkgKiBzdHJlYW0gKHZpYSB0aGUgU1RQVVRDIGFmdGVyIHRoZQorCQkJCQkgKiBzd2l0Y2gpLgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChwYyAhPSAnXFwnICYmIHBjICE9ICdgJyAmJiBwYyAhPSAnJCcKKwkJCQkgJiYgKCFkYmxxdW90ZSB8fCBwYyAhPSAnIicpCisJCQkJKSB7CisJCQkJCVNUUFVUQygnXFwnLCBwb3V0KTsKKwkJCQl9CisJCQkJaWYgKHBjIDw9IDI1NSAvKiBub3QgUEVPQSBvciBQRU9GICovKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQkJY2FzZSBQRU9GOgorCQkJSUZfQVNIX0FMSUFTKGNhc2UgUEVPQTopCisJCQkJc3RhcnRsaW5ubyA9IGdfcGFyc2VmaWxlLT5saW5ubzsKKwkJCQlyYWlzZV9lcnJvcl9zeW50YXgoIkVPRiBpbiBiYWNrcXVvdGUgc3Vic3RpdHV0aW9uIik7CisKKwkJCWNhc2UgJ1xuJzoKKwkJCQlnX3BhcnNlZmlsZS0+bGlubm8rKzsKKwkJCQluZWVkcHJvbXB0ID0gZG9wcm9tcHQ7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlTVFBVVEMocGMsIHBvdXQpOworCQl9CisgZG9uZToKKwkJU1RQVVRDKCdcMCcsIHBvdXQpOworCQlwc2F2ZWxlbiA9IHBvdXQgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwkJaWYgKHBzYXZlbGVuID4gMCkgeworCQkJcHN0ciA9IGdyYWJzdGFja3N0cihwb3V0KTsKKwkJCXNldGlucHV0c3RyaW5nKHBzdHIpOworCQl9CisJfQorCW5scHAgPSAmYnFsaXN0OworCXdoaWxlICgqbmxwcCkKKwkJbmxwcCA9ICYoKm5scHApLT5uZXh0OworCSpubHBwID0gc3R6YWxsb2Moc2l6ZW9mKCoqbmxwcCkpOworCS8qICgqbmxwcCktPm5leHQgPSBOVUxMOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCXBhcnNlYmFja3F1b3RlID0gb2xkc3R5bGU7CisKKwlpZiAob2xkc3R5bGUpIHsKKwkJc2F2ZXByb21wdCA9IGRvcHJvbXB0OworCQlkb3Byb21wdCA9IDA7CisJfQorCisJbiA9IGxpc3QoMik7CisKKwlpZiAob2xkc3R5bGUpCisJCWRvcHJvbXB0ID0gc2F2ZXByb21wdDsKKwllbHNlIGlmIChyZWFkdG9rZW4oKSAhPSBUUlApCisJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KFRSUCk7CisKKwkoKm5scHApLT5uID0gbjsKKwlpZiAob2xkc3R5bGUpIHsKKwkJLyoKKwkJICogU3RhcnQgcmVhZGluZyBmcm9tIG9sZCBmaWxlIGFnYWluLCBpZ25vcmluZyBhbnkgcHVzaGVkIGJhY2sKKwkJICogdG9rZW5zIGxlZnQgZnJvbSB0aGUgYmFja3F1b3RlIHBhcnNpbmcKKwkJICovCisJCXBvcGZpbGUoKTsKKwkJdG9rcHVzaGJhY2sgPSAwOworCX0KKwl3aGlsZSAoc3RhY2tibG9ja3NpemUoKSA8PSBzYXZlbGVuKQorCQlncm93c3RhY2tibG9jaygpOworCVNUQVJUU1RBQ0tTVFIob3V0KTsKKwlpZiAoc3RyKSB7CisJCW1lbWNweShvdXQsIHN0ciwgc2F2ZWxlbik7CisJCVNUQURKVVNUKHNhdmVsZW4sIG91dCk7CisJCUlOVF9PRkY7CisJCWZyZWUoc3RyKTsKKwkJc3RyID0gTlVMTDsKKwkJSU5UX09OOworCX0KKwlwYXJzZWJhY2txdW90ZSA9IHNhdmVwYnE7CisJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwlpZiAoYXJpbmVzdCB8fCBkYmxxdW90ZSkKKwkJVVNUUFVUQyhDVExCQUNLUSB8IENUTFFVT1RFLCBvdXQpOworCWVsc2UKKwkJVVNUUFVUQyhDVExCQUNLUSwgb3V0KTsKKwlpZiAob2xkc3R5bGUpCisJCWdvdG8gcGFyc2ViYWNrcV9vbGRyZXR1cm47CisJZ290byBwYXJzZWJhY2txX25ld3JldHVybjsKK30KKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKy8qCisgKiBQYXJzZSBhbiBhcml0aG1ldGljIGV4cGFuc2lvbiAoaW5kaWNhdGUgc3RhcnQgb2Ygb25lIGFuZCBzZXQgc3RhdGUpCisgKi8KK3BhcnNlYXJpdGg6IHsKKwlpZiAoKythcmluZXN0ID09IDEpIHsKKwkJcHJldnN5bnRheCA9IHN5bnRheDsKKwkJc3ludGF4ID0gQVJJU1lOVEFYOworCQlVU1RQVVRDKENUTEFSSSwgb3V0KTsKKwkJaWYgKGRibHF1b3RlKQorCQkJVVNUUFVUQygnIicsIG91dCk7CisJCWVsc2UKKwkJCVVTVFBVVEMoJyAnLCBvdXQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHdlIGNvbGxhcHNlIGVtYmVkZGVkIGFyaXRobWV0aWMgZXhwYW5zaW9uIHRvCisJCSAqIHBhcmVudGhlc2lzLCB3aGljaCBzaG91bGQgYmUgZXF1aXZhbGVudAorCQkgKi8KKwkJVVNUUFVUQygnKCcsIG91dCk7CisJfQorCWdvdG8gcGFyc2Vhcml0aF9yZXR1cm47Cit9CisjZW5kaWYKKworfSAvKiBlbmQgb2YgcmVhZHRva2VuICovCisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGlucHV0IHRva2VuLgorICogSWYgdGhlIHRva2VuIGlzIGEgd29yZCwgd2Ugc2V0IGJhY2txdW90ZWxpc3QgdG8gdGhlIGxpc3Qgb2YgY21kcyBpbgorICogICAgICBiYWNrcXVvdGVzLiAgV2Ugc2V0IHF1b3RlZmxhZyB0byB0cnVlIGlmIGFueSBwYXJ0IG9mIHRoZSB3b3JkIHdhcworICogICAgICBxdW90ZWQuCisgKiBJZiB0aGUgdG9rZW4gaXMgVFJFRElSLCB0aGVuIHdlIHNldCByZWRpcm5vZGUgdG8gYSBzdHJ1Y3R1cmUgY29udGFpbmluZworICogICAgICB0aGUgcmVkaXJlY3Rpb24uCisgKiBJbiBhbGwgY2FzZXMsIHRoZSB2YXJpYWJsZSBzdGFydGxpbm5vIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHRoZSBsaW5lCisgKiAgICAgIG9uIHdoaWNoIHRoZSB0b2tlbiBzdGFydHMuCisgKgorICogW0NoYW5nZSBjb21tZW50OiAgaGVyZSBkb2N1bWVudHMgYW5kIGludGVybmFsIHByb2NlZHVyZXNdCisgKiBbUmVhZHRva2VuIHNob3VsZG4ndCBoYXZlIGFueSBhcmd1bWVudHMuICBQZXJoYXBzIHdlIHNob3VsZCBtYWtlIHRoZQorICogIHdvcmQgcGFyc2luZyBjb2RlIGludG8gYSBzZXBhcmF0ZSByb3V0aW5lLiAgSW4gdGhpcyBjYXNlLCByZWFkdG9rZW4KKyAqICBkb2Vzbid0IG5lZWQgdG8gaGF2ZSBhbnkgaW50ZXJuYWwgcHJvY2VkdXJlcywgYnV0IHBhcnNld29yZCBkb2VzLgorICogIFdlIGNvdWxkIGFsc28gbWFrZSBwYXJzZW9wZXJhdG9yIGluIGVzc2VuY2UgdGhlIG1haW4gcm91dGluZSwgYW5kCisgKiAgaGF2ZSBwYXJzZXdvcmQgKHJlYWR0b2tlbjE/KSBoYW5kbGUgYm90aCB3b3JkcyBhbmQgcmVkaXJlY3Rpb24uXQorICovCisjZGVmaW5lIE5FV194eHJlYWR0b2tlbgorI2lmZGVmIE5FV194eHJlYWR0b2tlbgorLyogc2luZ2xlcyBtdXN0IGJlIGZpcnN0ISAqLworc3RhdGljIGNvbnN0IGNoYXIgeHhyZWFkdG9rZW5fY2hhcnNbN10gQUxJR04xID0geworCSdcbicsICcoJywgJyknLCAvKiBzaW5nbGVzICovCisJJyYnLCAnfCcsICc7JywgIC8qIGRvdWJsZXMgKi8KKwkwCit9OworCisjZGVmaW5lIHh4cmVhZHRva2VuX3NpbmdsZXMgMworI2RlZmluZSB4eHJlYWR0b2tlbl9kb3VibGVzIDMKKworc3RhdGljIGNvbnN0IGNoYXIgeHhyZWFkdG9rZW5fdG9rZW5zW10gQUxJR04xID0geworCVROTCwgVExQLCBUUlAsICAgICAgICAgIC8qIG9ubHkgc2luZ2xlIG9jY3VycmVuY2UgYWxsb3dlZCAqLworCVRCQUNLR05ELCBUUElQRSwgVFNFTUksIC8qIGlmIHNpbmdsZSBvY2N1cnJlbmNlICovCisJVEVPRiwgICAgICAgICAgICAgICAgICAgLyogY29ycmVzcG9uZHMgdG8gdHJhaWxpbmcgbnVsICovCisJVEFORCwgVE9SLCBURU5EQ0FTRSAgICAgLyogaWYgZG91YmxlIG9jY3VycmVuY2UgKi8KK307CisKK3N0YXRpYyBpbnQKK3h4cmVhZHRva2VuKHZvaWQpCit7CisJaW50IGM7CisKKwlpZiAodG9rcHVzaGJhY2spIHsKKwkJdG9rcHVzaGJhY2sgPSAwOworCQlyZXR1cm4gbGFzdHRva2VuOworCX0KKwlzZXRwcm9tcHRfaWYobmVlZHByb21wdCwgMik7CisJc3RhcnRsaW5ubyA9IGdfcGFyc2VmaWxlLT5saW5ubzsKKwlmb3IgKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHRva2VuIG9yIHN0YXJ0IG9mIHdvcmQgZm91bmQgKi8KKwkJYyA9IHBnZXRjX2Zhc3QoKTsKKwkJaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyBJRl9BU0hfQUxJQVMoIHx8IGMgPT0gUEVPQSkpCisJCQljb250aW51ZTsKKworCQlpZiAoYyA9PSAnIycpIHsKKwkJCXdoaWxlICgoYyA9IHBnZXRjKCkpICE9ICdcbicgJiYgYyAhPSBQRU9GKQorCQkJCWNvbnRpbnVlOworCQkJcHVuZ2V0YygpOworCQl9IGVsc2UgaWYgKGMgPT0gJ1xcJykgeworCQkJaWYgKHBnZXRjKCkgIT0gJ1xuJykgeworCQkJCXB1bmdldGMoKTsKKwkJCQlicmVhazsgLyogcmV0dXJuIHJlYWR0b2tlbjEoLi4uKSAqLworCQkJfQorCQkJc3RhcnRsaW5ubyA9ICsrZ19wYXJzZWZpbGUtPmxpbm5vOworCQkJc2V0cHJvbXB0X2lmKGRvcHJvbXB0LCAyKTsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0IGNoYXIgKnA7CisKKwkJCXAgPSB4eHJlYWR0b2tlbl9jaGFycyArIHNpemVvZih4eHJlYWR0b2tlbl9jaGFycykgLSAxOworCQkJaWYgKGMgIT0gUEVPRikgeworCQkJCWlmIChjID09ICdcbicpIHsKKwkJCQkJZ19wYXJzZWZpbGUtPmxpbm5vKys7CisJCQkJCW5lZWRwcm9tcHQgPSBkb3Byb21wdDsKKwkJCQl9CisKKwkJCQlwID0gc3RyY2hyKHh4cmVhZHRva2VuX2NoYXJzLCBjKTsKKwkJCQlpZiAocCA9PSBOVUxMKQorCQkJCQlicmVhazsgLyogcmV0dXJuIHJlYWR0b2tlbjEoLi4uKSAqLworCisJCQkJaWYgKChpbnQpKHAgLSB4eHJlYWR0b2tlbl9jaGFycykgPj0geHhyZWFkdG9rZW5fc2luZ2xlcykgeworCQkJCQlpbnQgY2MgPSBwZ2V0YygpOworCQkJCQlpZiAoY2MgPT0gYykgeyAgICAvKiBkb3VibGUgb2NjdXJyZW5jZT8gKi8KKwkJCQkJCXAgKz0geHhyZWFkdG9rZW5fZG91YmxlcyArIDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwdW5nZXRjKCk7CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQkJCQkJaWYgKGMgPT0gJyYnICYmIGNjID09ICc+JykgLyogJj4gKi8KKwkJCQkJCQlicmVhazsgLyogcmV0dXJuIHJlYWR0b2tlbjEoLi4uKSAqLworI2VuZGlmCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlsYXN0dG9rZW4gPSB4eHJlYWR0b2tlbl90b2tlbnNbcCAtIHh4cmVhZHRva2VuX2NoYXJzXTsKKwkJCXJldHVybiBsYXN0dG9rZW47CisJCX0KKwl9IC8qIGZvciAoOzspICovCisKKwlyZXR1cm4gcmVhZHRva2VuMShjLCBCQVNFU1lOVEFYLCAoY2hhciAqKSBOVUxMLCAwKTsKK30KKyNlbHNlIC8qIG9sZCB4eHJlYWR0b2tlbiAqLworI2RlZmluZSBSRVRVUk4odG9rZW4pICAgcmV0dXJuIGxhc3R0b2tlbiA9IHRva2VuCitzdGF0aWMgaW50Cit4eHJlYWR0b2tlbih2b2lkKQoreworCWludCBjOworCisJaWYgKHRva3B1c2hiYWNrKSB7CisJCXRva3B1c2hiYWNrID0gMDsKKwkJcmV0dXJuIGxhc3R0b2tlbjsKKwl9CisJc2V0cHJvbXB0X2lmKG5lZWRwcm9tcHQsIDIpOworCXN0YXJ0bGlubm8gPSBnX3BhcnNlZmlsZS0+bGlubm87CisJZm9yICg7OykgeyAgICAgIC8qIHVudGlsIHRva2VuIG9yIHN0YXJ0IG9mIHdvcmQgZm91bmQgKi8KKwkJYyA9IHBnZXRjX2Zhc3QoKTsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJyAnOiBjYXNlICdcdCc6CisJCUlGX0FTSF9BTElBUyhjYXNlIFBFT0E6KQorCQkJY29udGludWU7CisJCWNhc2UgJyMnOgorCQkJd2hpbGUgKChjID0gcGdldGMoKSkgIT0gJ1xuJyAmJiBjICE9IFBFT0YpCisJCQkJY29udGludWU7CisJCQlwdW5nZXRjKCk7CisJCQljb250aW51ZTsKKwkJY2FzZSAnXFwnOgorCQkJaWYgKHBnZXRjKCkgPT0gJ1xuJykgeworCQkJCXN0YXJ0bGlubm8gPSArK2dfcGFyc2VmaWxlLT5saW5ubzsKKwkJCQlzZXRwcm9tcHRfaWYoZG9wcm9tcHQsIDIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcHVuZ2V0YygpOworCQkJZ290byBicmVha2xvb3A7CisJCWNhc2UgJ1xuJzoKKwkJCWdfcGFyc2VmaWxlLT5saW5ubysrOworCQkJbmVlZHByb21wdCA9IGRvcHJvbXB0OworCQkJUkVUVVJOKFROTCk7CisJCWNhc2UgUEVPRjoKKwkJCVJFVFVSTihURU9GKTsKKwkJY2FzZSAnJic6CisJCQlpZiAocGdldGMoKSA9PSAnJicpCisJCQkJUkVUVVJOKFRBTkQpOworCQkJcHVuZ2V0YygpOworCQkJUkVUVVJOKFRCQUNLR05EKTsKKwkJY2FzZSAnfCc6CisJCQlpZiAocGdldGMoKSA9PSAnfCcpCisJCQkJUkVUVVJOKFRPUik7CisJCQlwdW5nZXRjKCk7CisJCQlSRVRVUk4oVFBJUEUpOworCQljYXNlICc7JzoKKwkJCWlmIChwZ2V0YygpID09ICc7JykKKwkJCQlSRVRVUk4oVEVORENBU0UpOworCQkJcHVuZ2V0YygpOworCQkJUkVUVVJOKFRTRU1JKTsKKwkJY2FzZSAnKCc6CisJCQlSRVRVUk4oVExQKTsKKwkJY2FzZSAnKSc6CisJCQlSRVRVUk4oVFJQKTsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gYnJlYWtsb29wOworCQl9CisJfQorIGJyZWFrbG9vcDoKKwlyZXR1cm4gcmVhZHRva2VuMShjLCBCQVNFU1lOVEFYLCAoY2hhciAqKU5VTEwsIDApOworI3VuZGVmIFJFVFVSTgorfQorI2VuZGlmIC8qIG9sZCB4eHJlYWR0b2tlbiAqLworCitzdGF0aWMgaW50CityZWFkdG9rZW4odm9pZCkKK3sKKwlpbnQgdDsKKyNpZiBERUJVRworCXNtYWxsaW50IGFscmVhZHlzZWVuID0gdG9rcHVzaGJhY2s7CisjZW5kaWYKKworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKyB0b3A6CisjZW5kaWYKKworCXQgPSB4eHJlYWR0b2tlbigpOworCisJLyoKKwkgKiBlYXQgbmV3bGluZXMKKwkgKi8KKwlpZiAoY2hlY2trd2QgJiBDSEtOTCkgeworCQl3aGlsZSAodCA9PSBUTkwpIHsKKwkJCXBhcnNlaGVyZWRvYygpOworCQkJdCA9IHh4cmVhZHRva2VuKCk7CisJCX0KKwl9CisKKwlpZiAodCAhPSBUV09SRCB8fCBxdW90ZWZsYWcpIHsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBjaGVjayBmb3Iga2V5d29yZHMKKwkgKi8KKwlpZiAoY2hlY2trd2QgJiBDSEtLV0QpIHsKKwkJY29uc3QgY2hhciAqY29uc3QgKnBwOworCisJCXBwID0gZmluZGt3ZCh3b3JkdGV4dCk7CisJCWlmIChwcCkgeworCQkJbGFzdHRva2VuID0gdCA9IHBwIC0gdG9rbmFtZV9hcnJheTsKKwkJCVRSQUNFKCgia2V5d29yZCAnJXMnIHJlY29nbml6ZWRcbiIsIHRva25hbWVfYXJyYXlbdF0gKyAxKSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChjaGVja2t3ZCAmIENIS0FMSUFTKSB7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCQlzdHJ1Y3QgYWxpYXMgKmFwOworCQlhcCA9IGxvb2t1cGFsaWFzKHdvcmR0ZXh0LCAxKTsKKwkJaWYgKGFwICE9IE5VTEwpIHsKKwkJCWlmICgqYXAtPnZhbCkgeworCQkJCXB1c2hzdHJpbmcoYXAtPnZhbCwgYXApOworCQkJfQorCQkJZ290byB0b3A7CisJCX0KKyNlbmRpZgorCX0KKyBvdXQ6CisJY2hlY2trd2QgPSAwOworI2lmIERFQlVHCisJaWYgKCFhbHJlYWR5c2VlbikKKwkJVFJBQ0UoKCJ0b2tlbiAnJXMnICVzXG4iLCB0b2tuYW1lX2FycmF5W3RdICsgMSwgdCA9PSBUV09SRCA/IHdvcmR0ZXh0IDogIiIpKTsKKwllbHNlCisJCVRSQUNFKCgicmVyZWFkIHRva2VuICclcycgJXNcbiIsIHRva25hbWVfYXJyYXlbdF0gKyAxLCB0ID09IFRXT1JEID8gd29yZHRleHQgOiAiIikpOworI2VuZGlmCisJcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyBjaGFyCitwZWVrdG9rZW4odm9pZCkKK3sKKwlpbnQgdDsKKworCXQgPSByZWFkdG9rZW4oKTsKKwl0b2twdXNoYmFjayA9IDE7CisJcmV0dXJuIHRva25hbWVfYXJyYXlbdF1bMF07Cit9CisKKy8qCisgKiBSZWFkIGFuZCBwYXJzZSBhIGNvbW1hbmQuICBSZXR1cm5zIE5PREVfRU9GIG9uIGVuZCBvZiBmaWxlLgorICogKE5VTEwgaXMgYSB2YWxpZCBwYXJzZSB0cmVlIGluZGljYXRpbmcgYSBibGFuayBsaW5lLikKKyAqLworc3RhdGljIHVuaW9uIG5vZGUgKgorcGFyc2VjbWQoaW50IGludGVyYWN0KQoreworCWludCB0OworCisJdG9rcHVzaGJhY2sgPSAwOworCWRvcHJvbXB0ID0gaW50ZXJhY3Q7CisJc2V0cHJvbXB0X2lmKGRvcHJvbXB0LCBkb3Byb21wdCk7CisJbmVlZHByb21wdCA9IDA7CisJdCA9IHJlYWR0b2tlbigpOworCWlmICh0ID09IFRFT0YpCisJCXJldHVybiBOT0RFX0VPRjsKKwlpZiAodCA9PSBUTkwpCisJCXJldHVybiBOVUxMOworCXRva3B1c2hiYWNrID0gMTsKKwlyZXR1cm4gbGlzdCgxKTsKK30KKworLyoKKyAqIElucHV0IGFueSBoZXJlIGRvY3VtZW50cy4KKyAqLworc3RhdGljIHZvaWQKK3BhcnNlaGVyZWRvYyh2b2lkKQoreworCXN0cnVjdCBoZXJlZG9jICpoZXJlOworCXVuaW9uIG5vZGUgKm47CisKKwloZXJlID0gaGVyZWRvY2xpc3Q7CisJaGVyZWRvY2xpc3QgPSBOVUxMOworCisJd2hpbGUgKGhlcmUpIHsKKwkJc2V0cHJvbXB0X2lmKG5lZWRwcm9tcHQsIDIpOworCQlyZWFkdG9rZW4xKHBnZXRjKCksIGhlcmUtPmhlcmUtPnR5cGUgPT0gTkhFUkUgPyBTUVNZTlRBWCA6IERRU1lOVEFYLAorCQkJCWhlcmUtPmVvZm1hcmssIGhlcmUtPnN0cmlwdGFicyk7CisJCW4gPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5hcmcpKTsKKwkJbi0+bmFyZy50eXBlID0gTkFSRzsKKwkJLypuLT5uYXJnLm5leHQgPSBOVUxMOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQluLT5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKwkJbi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQloZXJlLT5oZXJlLT5uaGVyZS5kb2MgPSBuOworCQloZXJlID0gaGVyZS0+bmV4dDsKKwl9Cit9CisKKworLyoKKyAqIGNhbGxlZCBieSBlZGl0bGluZSAtLSBhbnkgZXhwYW5zaW9ucyB0byB0aGUgcHJvbXB0IHNob3VsZCBiZSBhZGRlZCBoZXJlLgorICovCisjaWYgRU5BQkxFX0FTSF9FWFBBTkRfUFJNVAorc3RhdGljIGNvbnN0IGNoYXIgKgorZXhwYW5kc3RyKGNvbnN0IGNoYXIgKnBzKQoreworCXVuaW9uIG5vZGUgbjsKKworCS8qIFhYWCBGaXggKGNoYXIgKikgY2FzdC4gSXQgX2lzXyBhIGJ1Zy4gcHMgaXMgdmFyaWFibGUncyB2YWx1ZSwKKwkgKiBhbmQgdG9rZW4gcHJvY2Vzc2luZyBfY2FuXyBhbHRlciBpdCAoZGVsZXRlIE5VTHMgZXRjKS4gKi8KKwlzZXRpbnB1dHN0cmluZygoY2hhciAqKXBzKTsKKwlyZWFkdG9rZW4xKHBnZXRjKCksIFBTU1lOVEFYLCBudWxsc3RyLCAwKTsKKwlwb3BmaWxlKCk7CisKKwluLm5hcmcudHlwZSA9IE5BUkc7CisJbi5uYXJnLm5leHQgPSBOVUxMOworCW4ubmFyZy50ZXh0ID0gd29yZHRleHQ7CisJbi5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisKKwlleHBhbmRhcmcoJm4sIE5VTEwsIDApOworCXJldHVybiBzdGFja2Jsb2NrKCk7Cit9CisjZW5kaWYKKworLyoKKyAqIEV4ZWN1dGUgYSBjb21tYW5kIG9yIGNvbW1hbmRzIGNvbnRhaW5lZCBpbiBhIHN0cmluZy4KKyAqLworc3RhdGljIGludAorZXZhbHN0cmluZyhjaGFyICpzLCBpbnQgbWFzaykKK3sKKwl1bmlvbiBub2RlICpuOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJaW50IHNraXA7CisKKwlzZXRpbnB1dHN0cmluZyhzKTsKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKworCXNraXAgPSAwOworCXdoaWxlICgobiA9IHBhcnNlY21kKDApKSAhPSBOT0RFX0VPRikgeworCQlldmFsdHJlZShuLCAwKTsKKwkJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisJCXNraXAgPSBldmFsc2tpcDsKKwkJaWYgKHNraXApCisJCQlicmVhazsKKwl9CisJcG9wZmlsZSgpOworCisJc2tpcCAmPSBtYXNrOworCWV2YWxza2lwID0gc2tpcDsKKwlyZXR1cm4gc2tpcDsKK30KKworLyoKKyAqIFRoZSBldmFsIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitldmFsY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqcDsKKwljaGFyICpjb25jYXQ7CisKKwlpZiAoYXJndlsxXSkgeworCQlwID0gYXJndlsxXTsKKwkJYXJndiArPSAyOworCQlpZiAoYXJndlswXSkgeworCQkJU1RBUlRTVEFDS1NUUihjb25jYXQpOworCQkJZm9yICg7OykgeworCQkJCWNvbmNhdCA9IHN0YWNrX3B1dHN0cihwLCBjb25jYXQpOworCQkJCXAgPSAqYXJndisrOworCQkJCWlmIChwID09IE5VTEwpCisJCQkJCWJyZWFrOworCQkJCVNUUFVUQygnICcsIGNvbmNhdCk7CisJCQl9CisJCQlTVFBVVEMoJ1wwJywgY29uY2F0KTsKKwkJCXAgPSBncmFic3RhY2tzdHIoY29uY2F0KTsKKwkJfQorCQlldmFsc3RyaW5nKHAsIH5TS0lQRVZBTCk7CisJfQorCXJldHVybiBleGl0c3RhdHVzOworfQorCisvKgorICogUmVhZCBhbmQgZXhlY3V0ZSBjb21tYW5kcy4KKyAqICJUb3AiIGlzIG5vbnplcm8gZm9yIHRoZSB0b3AgbGV2ZWwgY29tbWFuZCBsb29wOworICogaXQgdHVybnMgb24gcHJvbXB0aW5nIGlmIHRoZSBzaGVsbCBpcyBpbnRlcmFjdGl2ZS4KKyAqLworc3RhdGljIGludAorY21kbG9vcChpbnQgdG9wKQoreworCXVuaW9uIG5vZGUgKm47CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwlpbnQgaW50ZXI7CisJaW50IG51bWVvZiA9IDA7CisKKwlUUkFDRSgoImNtZGxvb3AoJWQpIGNhbGxlZFxuIiwgdG9wKSk7CisJZm9yICg7OykgeworCQlpbnQgc2tpcDsKKworCQlzZXRzdGFja21hcmsoJnNtYXJrKTsKKyNpZiBKT0JTCisJCWlmIChkb2luZ19qb2JjdGwpCisJCQlzaG93am9icyhzdGRlcnIsIFNIT1dfQ0hBTkdFRCk7CisjZW5kaWYKKwkJaW50ZXIgPSAwOworCQlpZiAoaWZsYWcgJiYgdG9wKSB7CisJCQlpbnRlcisrOworCQkJY2hrbWFpbCgpOworCQl9CisJCW4gPSBwYXJzZWNtZChpbnRlcik7CisjaWYgREVCVUcKKwkJaWYgKERFQlVHID4gMiAmJiBkZWJ1ZyAmJiAobiAhPSBOT0RFX0VPRikpCisJCQlzaG93dHJlZShuKTsKKyNlbmRpZgorCQlpZiAobiA9PSBOT0RFX0VPRikgeworCQkJaWYgKCF0b3AgfHwgbnVtZW9mID49IDUwKQorCQkJCWJyZWFrOworCQkJaWYgKCFzdG9wcGVkam9icygpKSB7CisJCQkJaWYgKCFJZmxhZykKKwkJCQkJYnJlYWs7CisJCQkJb3V0MnN0cigiXG5Vc2UgXCJleGl0XCIgdG8gbGVhdmUgc2hlbGwuXG4iKTsKKwkJCX0KKwkJCW51bWVvZisrOworCQl9IGVsc2UgaWYgKG5mbGFnID09IDApIHsKKwkJCS8qIGpvYl93YXJuaW5nIGNhbiBvbmx5IGJlIDIsMSwwLiBIZXJlIDItPjEsIDEvMC0+MCAqLworCQkJam9iX3dhcm5pbmcgPj49IDE7CisJCQludW1lb2YgPSAwOworCQkJZXZhbHRyZWUobiwgMCk7CisJCX0KKwkJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisJCXNraXAgPSBldmFsc2tpcDsKKworCQlpZiAoc2tpcCkgeworCQkJZXZhbHNraXAgPSAwOworCQkJcmV0dXJuIHNraXAgJiBTS0lQRVZBTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRha2UgY29tbWFuZHMgZnJvbSBhIGZpbGUuICBUbyBiZSBjb21wYXRpYmxlIHdlIHNob3VsZCBkbyBhIHBhdGgKKyAqIHNlYXJjaCBmb3IgdGhlIGZpbGUsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBmaW5kIHN1Yi1jb21tYW5kcy4KKyAqLworc3RhdGljIGNoYXIgKgorZmluZF9kb3RfZmlsZShjaGFyICpuYW1lKQoreworCWNoYXIgKmZ1bGxuYW1lOworCWNvbnN0IGNoYXIgKnBhdGggPSBwYXRodmFsKCk7CisJc3RydWN0IHN0YXQgc3RhdGI7CisKKwkvKiBkb24ndCB0cnkgdGhpcyBmb3IgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgKi8KKwlpZiAoc3RyY2hyKG5hbWUsICcvJykpCisJCXJldHVybiBuYW1lOworCisJLyogSUlSQyBzdGFuZGFyZHMgZG8gbm90IHNheSB3aGV0aGVyIC4gaXMgdG8gYmUgc2VhcmNoZWQuCisJICogQW5kIGl0IGlzIGV2ZW4gc21hbGxlciB0aGlzIHdheSwgbWFraW5nIGl0IHVuY29uZGl0aW9uYWwgZm9yIG5vdzoKKwkgKi8KKwlpZiAoMSkgeyAvKiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUICovCisJCWZ1bGxuYW1lID0gbmFtZTsKKwkJZ290byB0cnlfY3VyX2RpcjsKKwl9CisKKwl3aGlsZSAoKGZ1bGxuYW1lID0gcGF0aF9hZHZhbmNlKCZwYXRoLCBuYW1lKSkgIT0gTlVMTCkgeworIHRyeV9jdXJfZGlyOgorCQlpZiAoKHN0YXQoZnVsbG5hbWUsICZzdGF0YikgPT0gMCkgJiYgU19JU1JFRyhzdGF0Yi5zdF9tb2RlKSkgeworCQkJLyoKKwkJCSAqIERvbid0IGJvdGhlciBmcmVlaW5nIGhlcmUsIHNpbmNlIGl0IHdpbGwKKwkJCSAqIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisJCQkgKi8KKwkJCXJldHVybiBmdWxsbmFtZTsKKwkJfQorCQlpZiAoZnVsbG5hbWUgIT0gbmFtZSkKKwkJCXN0dW5hbGxvYyhmdWxsbmFtZSk7CisJfQorCisJLyogbm90IGZvdW5kIGluIHRoZSBQQVRIICovCisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiVzOiBub3QgZm91bmQiLCBuYW1lKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitkb3RjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmZ1bGxuYW1lOworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2hwYXJhbSBzYXZlcGFyYW07CisKKwlmb3IgKHNwID0gY21kZW52aXJvbjsgc3A7IHNwID0gc3AtPm5leHQpCisJCXNldHZhcmVxKGNrc3RyZHVwKHNwLT50ZXh0KSwgVlNUUkZJWEVEIHwgVlRFWFRGSVhFRCk7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJLyogYmFzaCBzYXlzOiAiYmFzaDogLjogZmlsZW5hbWUgYXJndW1lbnQgcmVxdWlyZWQiICovCisJCXJldHVybiAyOyAvKiBiYXNoIGNvbXBhdCAqLworCX0KKworCS8qICJmYWxzZTsgLiBlbXB0eV9maWxlOyBlY2hvICQ/IiBzaG91bGQgcHJpbnQgMCwgbm90IDE6ICovCisJZXhpdHN0YXR1cyA9IDA7CisKKwlmdWxsbmFtZSA9IGZpbmRfZG90X2ZpbGUoYXJndlsxXSk7CisKKwlhcmd2ICs9IDI7CisJYXJnYyAtPSAyOworCWlmIChhcmdjKSB7IC8qIGFyZ2MgPiAwLCBhcmd2WzBdICE9IE5VTEwgKi8KKwkJc2F2ZXBhcmFtID0gc2hlbGxwYXJhbTsKKwkJc2hlbGxwYXJhbS5tYWxsb2NlZCA9IDA7CisJCXNoZWxscGFyYW0ubnBhcmFtID0gYXJnYzsKKwkJc2hlbGxwYXJhbS5wID0gYXJndjsKKwl9OworCisJc2V0aW5wdXRmaWxlKGZ1bGxuYW1lLCBJTlBVVF9QVVNIX0ZJTEUpOworCWNvbW1hbmRuYW1lID0gZnVsbG5hbWU7CisJY21kbG9vcCgwKTsKKwlwb3BmaWxlKCk7CisKKwlpZiAoYXJnYykgeworCQlmcmVlcGFyYW0oJnNoZWxscGFyYW0pOworCQlzaGVsbHBhcmFtID0gc2F2ZXBhcmFtOworCX07CisKKwlyZXR1cm4gZXhpdHN0YXR1czsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2V4aXRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpZiAoc3RvcHBlZGpvYnMoKSkKKwkJcmV0dXJuIDA7CisJaWYgKGFyZ3ZbMV0pCisJCWV4aXRzdGF0dXMgPSBudW1iZXIoYXJndlsxXSk7CisJcmFpc2VfZXhjZXB0aW9uKEVYRVhJVCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogUmVhZCBhIGZpbGUgY29udGFpbmluZyBzaGVsbCBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkCityZWFkY21kZmlsZShjaGFyICpuYW1lKQoreworCXNldGlucHV0ZmlsZShuYW1lLCBJTlBVVF9QVVNIX0ZJTEUpOworCWNtZGxvb3AoMCk7CisJcG9wZmlsZSgpOworfQorCisKKy8qID09PT09PT09PT09PSBmaW5kX2NvbW1hbmQgaW5wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIFJlc29sdmUgYSBjb21tYW5kIG5hbWUuICBJZiB5b3UgY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IG1heSBoYXZlIHRvCisgKiBjaGFuZ2UgdGhlIHNoZWxsZXhlYyByb3V0aW5lIGFzIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkCitmaW5kX2NvbW1hbmQoY2hhciAqbmFtZSwgc3RydWN0IGNtZGVudHJ5ICplbnRyeSwgaW50IGFjdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisJaW50IGlkeDsKKwlpbnQgcHJldjsKKwljaGFyICpmdWxsbmFtZTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKwlpbnQgZTsKKwlpbnQgdXBkYXRldGJsOworCXN0cnVjdCBidWlsdGluY21kICpiY21kOworCisJLyogSWYgbmFtZSBjb250YWlucyBhIHNsYXNoLCBkb24ndCB1c2UgUEFUSCBvciBoYXNoIHRhYmxlICovCisJaWYgKHN0cmNocihuYW1lLCAnLycpICE9IE5VTEwpIHsKKwkJZW50cnktPnUuaW5kZXggPSAtMTsKKwkJaWYgKGFjdCAmIERPX0FCUykgeworCQkJd2hpbGUgKHN0YXQobmFtZSwgJnN0YXRiKSA8IDApIHsKKyNpZmRlZiBTWVNWCisJCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCQljb250aW51ZTsKKyNlbmRpZgorCQkJCWVudHJ5LT5jbWR0eXBlID0gQ01EVU5LTk9XTjsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZW50cnktPmNtZHR5cGUgPSBDTUROT1JNQUw7CisJCXJldHVybjsKKwl9CisKKy8qICNpZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FLi4uIG1vdmVkIGFmdGVyIGJ1aWx0aW4gY2hlY2sgKi8KKworCXVwZGF0ZXRibCA9IChwYXRoID09IHBhdGh2YWwoKSk7CisJaWYgKCF1cGRhdGV0YmwpIHsKKwkJYWN0IHw9IERPX0FMVFBBVEg7CisJCWlmIChzdHJzdHIocGF0aCwgIiVidWlsdGluIikgIT0gTlVMTCkKKwkJCWFjdCB8PSBET19BTFRCTFRJTjsKKwl9CisKKwkvKiBJZiBuYW1lIGlzIGluIHRoZSB0YWJsZSwgY2hlY2sgYW5zd2VyIHdpbGwgYmUgb2sgKi8KKwljbWRwID0gY21kbG9va3VwKG5hbWUsIDApOworCWlmIChjbWRwICE9IE5VTEwpIHsKKwkJaW50IGJpdDsKKworCQlzd2l0Y2ggKGNtZHAtPmNtZHR5cGUpIHsKKwkJZGVmYXVsdDoKKyNpZiBERUJVRworCQkJYWJvcnQoKTsKKyNlbmRpZgorCQljYXNlIENNRE5PUk1BTDoKKwkJCWJpdCA9IERPX0FMVFBBVEg7CisJCQlicmVhazsKKwkJY2FzZSBDTURGVU5DVElPTjoKKwkJCWJpdCA9IERPX05PRlVOQzsKKwkJCWJyZWFrOworCQljYXNlIENNREJVSUxUSU46CisJCQliaXQgPSBET19BTFRCTFRJTjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhY3QgJiBiaXQpIHsKKwkJCXVwZGF0ZXRibCA9IDA7CisJCQljbWRwID0gTlVMTDsKKwkJfSBlbHNlIGlmIChjbWRwLT5yZWhhc2ggPT0gMCkKKwkJCS8qIGlmIG5vdCBpbnZhbGlkYXRlZCBieSBjZCwgd2UncmUgZG9uZSAqLworCQkJZ290byBzdWNjZXNzOworCX0KKworCS8qIElmICVidWlsdGluIG5vdCBpbiBwYXRoLCBjaGVjayBmb3IgYnVpbHRpbiBuZXh0ICovCisJYmNtZCA9IGZpbmRfYnVpbHRpbihuYW1lKTsKKwlpZiAoYmNtZCkgeworCQlpZiAoSVNfQlVJTFRJTl9SRUdVTEFSKGJjbWQpKQorCQkJZ290byBidWlsdGluX3N1Y2Nlc3M7CisJCWlmIChhY3QgJiBET19BTFRQQVRIKSB7CisJCQlpZiAoIShhY3QgJiBET19BTFRCTFRJTikpCisJCQkJZ290byBidWlsdGluX3N1Y2Nlc3M7CisJCX0gZWxzZSBpZiAoYnVpbHRpbmxvYyA8PSAwKSB7CisJCQlnb3RvIGJ1aWx0aW5fc3VjY2VzczsKKwkJfQorCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwl7CisJCWludCBhcHBsZXRfbm8gPSBmaW5kX2FwcGxldF9ieV9uYW1lKG5hbWUpOworCQlpZiAoYXBwbGV0X25vID49IDApIHsKKwkJCWVudHJ5LT5jbWR0eXBlID0gQ01ETk9STUFMOworCQkJZW50cnktPnUuaW5kZXggPSAtMiAtIGFwcGxldF9ubzsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogV2UgaGF2ZSB0byBzZWFyY2ggcGF0aC4gKi8KKwlwcmV2ID0gLTE7ICAgICAgICAgICAgICAvKiB3aGVyZSB0byBzdGFydCAqLworCWlmIChjbWRwICYmIGNtZHAtPnJlaGFzaCkgeyAgICAgLyogZG9pbmcgYSByZWhhc2ggKi8KKwkJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTikKKwkJCXByZXYgPSBidWlsdGlubG9jOworCQllbHNlCisJCQlwcmV2ID0gY21kcC0+cGFyYW0uaW5kZXg7CisJfQorCisJZSA9IEVOT0VOVDsKKwlpZHggPSAtMTsKKyBsb29wOgorCXdoaWxlICgoZnVsbG5hbWUgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIG5hbWUpKSAhPSBOVUxMKSB7CisJCXN0dW5hbGxvYyhmdWxsbmFtZSk7CisJCS8qIE5COiBjb2RlIGJlbG93IHdpbGwgc3RpbGwgdXNlIGZ1bGxuYW1lCisJCSAqIGRlc3BpdGUgaXQgYmVpbmcgInVuYWxsb2NhdGVkIiAqLworCQlpZHgrKzsKKwkJaWYgKHBhdGhvcHQpIHsKKwkJCWlmIChwcmVmaXgocGF0aG9wdCwgImJ1aWx0aW4iKSkgeworCQkJCWlmIChiY21kKQorCQkJCQlnb3RvIGJ1aWx0aW5fc3VjY2VzczsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgoYWN0ICYgRE9fTk9GVU5DKQorCQkJIHx8ICFwcmVmaXgocGF0aG9wdCwgImZ1bmMiKQorCQkJKSB7ICAgICAvKiBpZ25vcmUgdW5pbXBsZW1lbnRlZCBvcHRpb25zICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyogaWYgcmVoYXNoLCBkb24ndCByZWRvIGFic29sdXRlIHBhdGggbmFtZXMgKi8KKwkJaWYgKGZ1bGxuYW1lWzBdID09ICcvJyAmJiBpZHggPD0gcHJldikgeworCQkJaWYgKGlkeCA8IHByZXYpCisJCQkJY29udGludWU7CisJCQlUUkFDRSgoInNlYXJjaGV4ZWMgXCIlc1wiOiBubyBjaGFuZ2VcbiIsIG5hbWUpKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCQl3aGlsZSAoc3RhdChmdWxsbmFtZSwgJnN0YXRiKSA8IDApIHsKKyNpZmRlZiBTWVNWCisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisjZW5kaWYKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQgJiYgZXJybm8gIT0gRU5PVERJUikKKwkJCQllID0gZXJybm87CisJCQlnb3RvIGxvb3A7CisJCX0KKwkJZSA9IEVBQ0NFUzsgICAgIC8qIGlmIHdlIGZhaWwsIHRoaXMgd2lsbCBiZSB0aGUgZXJyb3IgKi8KKwkJaWYgKCFTX0lTUkVHKHN0YXRiLnN0X21vZGUpKQorCQkJY29udGludWU7CisJCWlmIChwYXRob3B0KSB7ICAgICAgICAgIC8qIHRoaXMgaXMgYSAlZnVuYyBkaXJlY3RvcnkgKi8KKwkJCXN0YWxsb2Moc3RybGVuKGZ1bGxuYW1lKSArIDEpOworCQkJLyogTkI6IHN0YWxsb2Mgd2lsbCByZXR1cm4gc3BhY2UgcG9pbnRlZCBieSBmdWxsbmFtZQorCQkJICogKGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgaW50ZXJ2ZW5pbmcgYWxsb2NhdGlvbnMKKwkJCSAqIGJldHdlZW4gc3R1bmFsbG9jIGFib3ZlIGFuZCB0aGlzIHN0YWxsb2MpICovCisJCQlyZWFkY21kZmlsZShmdWxsbmFtZSk7CisJCQljbWRwID0gY21kbG9va3VwKG5hbWUsIDApOworCQkJaWYgKGNtZHAgPT0gTlVMTCB8fCBjbWRwLT5jbWR0eXBlICE9IENNREZVTkNUSU9OKQorCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCIlcyBub3QgZGVmaW5lZCBpbiAlcyIsIG5hbWUsIGZ1bGxuYW1lKTsKKwkJCXN0dW5hbGxvYyhmdWxsbmFtZSk7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKwkJVFJBQ0UoKCJzZWFyY2hleGVjIFwiJXNcIiByZXR1cm5zIFwiJXNcIlxuIiwgbmFtZSwgZnVsbG5hbWUpKTsKKwkJaWYgKCF1cGRhdGV0YmwpIHsKKwkJCWVudHJ5LT5jbWR0eXBlID0gQ01ETk9STUFMOworCQkJZW50cnktPnUuaW5kZXggPSBpZHg7CisJCQlyZXR1cm47CisJCX0KKwkJSU5UX09GRjsKKwkJY21kcCA9IGNtZGxvb2t1cChuYW1lLCAxKTsKKwkJY21kcC0+Y21kdHlwZSA9IENNRE5PUk1BTDsKKwkJY21kcC0+cGFyYW0uaW5kZXggPSBpZHg7CisJCUlOVF9PTjsKKwkJZ290byBzdWNjZXNzOworCX0KKworCS8qIFdlIGZhaWxlZC4gIElmIHRoZXJlIHdhcyBhbiBlbnRyeSBmb3IgdGhpcyBjb21tYW5kLCBkZWxldGUgaXQgKi8KKwlpZiAoY21kcCAmJiB1cGRhdGV0YmwpCisJCWRlbGV0ZV9jbWRfZW50cnkoKTsKKwlpZiAoYWN0ICYgRE9fRVJSKQorCQlhc2hfbXNnKCIlczogJXMiLCBuYW1lLCBlcnJtc2coZSwgIm5vdCBmb3VuZCIpKTsKKwllbnRyeS0+Y21kdHlwZSA9IENNRFVOS05PV047CisJcmV0dXJuOworCisgYnVpbHRpbl9zdWNjZXNzOgorCWlmICghdXBkYXRldGJsKSB7CisJCWVudHJ5LT5jbWR0eXBlID0gQ01EQlVJTFRJTjsKKwkJZW50cnktPnUuY21kID0gYmNtZDsKKwkJcmV0dXJuOworCX0KKwlJTlRfT0ZGOworCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMSk7CisJY21kcC0+Y21kdHlwZSA9IENNREJVSUxUSU47CisJY21kcC0+cGFyYW0uY21kID0gYmNtZDsKKwlJTlRfT047Cisgc3VjY2VzczoKKwljbWRwLT5yZWhhc2ggPSAwOworCWVudHJ5LT5jbWR0eXBlID0gY21kcC0+Y21kdHlwZTsKKwllbnRyeS0+dSA9IGNtZHAtPnBhcmFtOworfQorCisKKy8qID09PT09PT09PT09PSB0cmFwLmMgKi8KKworLyoKKyAqIFRoZSB0cmFwIGJ1aWx0aW4uCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit0cmFwY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKmFjdGlvbjsKKwljaGFyICoqYXA7CisJaW50IHNpZ25vLCBleGl0Y29kZTsKKworCW5leHRvcHQobnVsbHN0cik7CisJYXAgPSBhcmdwdHI7CisJaWYgKCEqYXApIHsKKwkJZm9yIChzaWdubyA9IDA7IHNpZ25vIDwgTlNJRzsgc2lnbm8rKykgeworCQkJY2hhciAqdHIgPSB0cmFwX3B0cltzaWdub107CisJCQlpZiAodHIpIHsKKwkJCQkvKiBub3RlOiBiYXNoIGFkZHMgIlNJRyIsIGJ1dCBvbmx5IGlmIGludm9rZWQKKwkJCQkgKiBhcyAiYmFzaCIuIElmIGNhbGxlZCBhcyAic2giLCBvciBpZiBzZXQgLW8gcG9zaXgsCisJCQkJICogdGhlbiBpdCBwcmludHMgc2hvcnQgc2lnbmFsIG5hbWVzLgorCQkJCSAqIFdlIGFyZSBwcmludGluZyBzaG9ydCBuYW1lczogKi8KKwkJCQlvdXQxZm10KCJ0cmFwIC0tICVzICVzXG4iLAorCQkJCQkJc2luZ2xlX3F1b3RlKHRyKSwKKwkJCQkJCWdldF9zaWduYW1lKHNpZ25vKSk7CisJCS8qIHRyYXBfcHRyICE9IHRyYXAgb25seSBpZiB3ZSBhcmUgaW4gc3BlY2lhbC1jYXNlZCBgdHJhcGAgY29kZS4KKwkJICogSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGV4aXQgdmVyeSBzb29uLCBubyBuZWVkIHRvIGZyZWUoKS4gKi8KKwkJCQkvKiBpZiAodHJhcF9wdHIgIT0gdHJhcCAmJiB0cFswXSkgKi8KKwkJCQkvKglmcmVlKHRyKTsgKi8KKwkJCX0KKwkJfQorCQkvKgorCQlpZiAodHJhcF9wdHIgIT0gdHJhcCkgeworCQkJZnJlZSh0cmFwX3B0cik7CisJCQl0cmFwX3B0ciA9IHRyYXA7CisJCX0KKwkJKi8KKwkJcmV0dXJuIDA7CisJfQorCisJYWN0aW9uID0gTlVMTDsKKwlpZiAoYXBbMV0pCisJCWFjdGlvbiA9ICphcCsrOworCWV4aXRjb2RlID0gMDsKKwl3aGlsZSAoKmFwKSB7CisJCXNpZ25vID0gZ2V0X3NpZ251bSgqYXApOworCQlpZiAoc2lnbm8gPCAwKSB7CisJCQkvKiBNaW1pYyBiYXNoIG1lc3NhZ2UgZXhhY3RseSAqLworCQkJYXNoX21zZygiJXM6IGludmFsaWQgc2lnbmFsIHNwZWNpZmljYXRpb24iLCAqYXApOworCQkJZXhpdGNvZGUgPSAxOworCQkJZ290byBuZXh0OworCQl9CisJCUlOVF9PRkY7CisJCWlmIChhY3Rpb24pIHsKKwkJCWlmIChMT05FX0RBU0goYWN0aW9uKSkKKwkJCQlhY3Rpb24gPSBOVUxMOworCQkJZWxzZQorCQkJCWFjdGlvbiA9IGNrc3RyZHVwKGFjdGlvbik7CisJCX0KKwkJZnJlZSh0cmFwW3NpZ25vXSk7CisJCWlmIChhY3Rpb24pCisJCQltYXlfaGF2ZV90cmFwcyA9IDE7CisJCXRyYXBbc2lnbm9dID0gYWN0aW9uOworCQlpZiAoc2lnbm8gIT0gMCkKKwkJCXNldHNpZ25hbChzaWdubyk7CisJCUlOVF9PTjsKKyBuZXh0OgorCQlhcCsrOworCX0KKwlyZXR1cm4gZXhpdGNvZGU7Cit9CisKKworLyogPT09PT09PT09PT09IEJ1aWx0aW5zICovCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQKKy8qCisgKiBMaXN0cyBhdmFpbGFibGUgYnVpbHRpbnMKKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2hlbHBjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJdW5zaWduZWQgY29sOworCXVuc2lnbmVkIGk7CisKKwlvdXQxZm10KAorCQkiQnVpbHQtaW4gY29tbWFuZHM6XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWZvciAoY29sID0gMCwgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ1aWx0aW50YWIpOyBpKyspIHsKKwkJY29sICs9IG91dDFmbXQoIiVjJXMiLCAoKGNvbCA9PSAwKSA/ICdcdCcgOiAnICcpLAorCQkJCQlidWlsdGludGFiW2ldLm5hbWUgKyAxKTsKKwkJaWYgKGNvbCA+IDYwKSB7CisJCQlvdXQxZm10KCJcbiIpOworCQkJY29sID0gMDsKKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FCisJeworCQljb25zdCBjaGFyICphID0gYXBwbGV0X25hbWVzOworCQl3aGlsZSAoKmEpIHsKKwkJCWNvbCArPSBvdXQxZm10KCIlYyVzIiwgKChjb2wgPT0gMCkgPyAnXHQnIDogJyAnKSwgYSk7CisJCQlpZiAoY29sID4gNjApIHsKKwkJCQlvdXQxZm10KCJcbiIpOworCQkJCWNvbCA9IDA7CisJCQl9CisJCQlhICs9IHN0cmxlbihhKSArIDE7CisJCX0KKwl9CisjZW5kaWYKKwlvdXQxZm10KCJcblxuIik7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1NIX0VYVFJBX1FVSUVUICovCisKKy8qCisgKiBUaGUgZXhwb3J0IGFuZCByZWFkb25seSBjb21tYW5kcy4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2V4cG9ydGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB2YXIgKnZwOworCWNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICoqYXB0cjsKKwlpbnQgZmxhZyA9IGFyZ3ZbMF1bMF0gPT0gJ3InID8gVlJFQURPTkxZIDogVkVYUE9SVDsKKworCWlmIChuZXh0b3B0KCJwIikgIT0gJ3AnKSB7CisJCWFwdHIgPSBhcmdwdHI7CisJCW5hbWUgPSAqYXB0cjsKKwkJaWYgKG5hbWUpIHsKKwkJCWRvIHsKKwkJCQlwID0gc3RyY2hyKG5hbWUsICc9Jyk7CisJCQkJaWYgKHAgIT0gTlVMTCkgeworCQkJCQlwKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJdnAgPSAqZmluZHZhcihoYXNodmFyKG5hbWUpLCBuYW1lKTsKKwkJCQkJaWYgKHZwKSB7CisJCQkJCQl2cC0+ZmxhZ3MgfD0gZmxhZzsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCXNldHZhcihuYW1lLCBwLCBmbGFnKTsKKwkJCX0gd2hpbGUgKChuYW1lID0gKisrYXB0cikgIT0gTlVMTCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzaG93dmFycyhhcmd2WzBdLCBmbGFnLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlbGV0ZSBhIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cy4KKyAqLworc3RhdGljIHZvaWQKK3Vuc2V0ZnVuYyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMCk7CisJaWYgKGNtZHAgIT0gTlVMTCAmJiBjbWRwLT5jbWR0eXBlID09IENNREZVTkNUSU9OKQorCQlkZWxldGVfY21kX2VudHJ5KCk7Cit9CisKKy8qCisgKiBUaGUgdW5zZXQgYnVpbHRpbiBjb21tYW5kLiAgV2UgdW5zZXQgdGhlIGZ1bmN0aW9uIGJlZm9yZSB3ZSB1bnNldCB0aGUKKyAqIHZhcmlhYmxlIHRvIGFsbG93IGEgZnVuY3Rpb24gdG8gYmUgdW5zZXQgd2hlbiB0aGVyZSBpcyBhIHJlYWRvbmx5IHZhcmlhYmxlCisgKiB3aXRoIHRoZSBzYW1lIG5hbWUuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit1bnNldGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyICoqYXA7CisJaW50IGk7CisJaW50IGZsYWcgPSAwOworCWludCByZXQgPSAwOworCisJd2hpbGUgKChpID0gbmV4dG9wdCgidmYiKSkgIT0gMCkgeworCQlmbGFnID0gaTsKKwl9CisKKwlmb3IgKGFwID0gYXJncHRyOyAqYXA7IGFwKyspIHsKKwkJaWYgKGZsYWcgIT0gJ2YnKSB7CisJCQlpID0gdW5zZXR2YXIoKmFwKTsKKwkJCXJldCB8PSBpOworCQkJaWYgKCEoaSAmIDIpKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmbGFnICE9ICd2JykKKwkJCXVuc2V0ZnVuYygqYXApOworCX0KKwlyZXR1cm4gcmV0ICYgMTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGltZXNjbWRfc3RyW10gQUxJR04xID0geworCScgJywgIG9mZnNldG9mKHN0cnVjdCB0bXMsIHRtc191dGltZSksCisJJ1xuJywgb2Zmc2V0b2Yoc3RydWN0IHRtcywgdG1zX3N0aW1lKSwKKwknICcsICBvZmZzZXRvZihzdHJ1Y3QgdG1zLCB0bXNfY3V0aW1lKSwKKwknXG4nLCBvZmZzZXRvZihzdHJ1Y3QgdG1zLCB0bXNfY3N0aW1lKSwKKwkwCit9Oworc3RhdGljIGludCBGQVNUX0ZVTkMKK3RpbWVzY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXVuc2lnbmVkIGxvbmcgY2xrX3RjaywgcywgdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXN0cnVjdCB0bXMgYnVmOworCisJY2xrX3RjayA9IHN5c2NvbmYoX1NDX0NMS19UQ0spOworCXRpbWVzKCZidWYpOworCisJcCA9IHRpbWVzY21kX3N0cjsKKwlkbyB7CisJCXQgPSAqKGNsb2NrX3QgKikoKChjaGFyICopICZidWYpICsgcFsxXSk7CisJCXMgPSB0IC8gY2xrX3RjazsKKwkJdCA9IHQgJSBjbGtfdGNrOworCQlvdXQxZm10KCIlbHVtJWx1LiUwM2x1cyVjIiwKKwkJCXMgLyA2MCwgcyAlIDYwLAorCQkJKHQgKiAxMDAwKSAvIGNsa190Y2ssCisJCQlwWzBdKTsKKwkJcCArPSAyOworCX0gd2hpbGUgKCpwKTsKKworCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorLyoKKyAqIFRoZSBsZXQgYnVpbHRpbi4gUGFydGlhbGx5IHN0b2xlbiBmcm9tIEdOVSBCYXNoLCB0aGUgQm91cm5lIEFnYWluIFNIZWxsLgorICogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitsZXRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlhcml0aF90IGk7CisKKwlhcmd2Kys7CisJaWYgKCEqYXJndikKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKKwlkbyB7CisJCWkgPSBhc2hfYXJpdGgoKmFyZ3YpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuICFpOworfQorI2VuZGlmCisKKy8qCisgKiBUaGUgcmVhZCBidWlsdGluLiBPcHRpb25zOgorICogICAgICAtciAgICAgICAgICAgICAgRG8gbm90IGludGVycHJldCAnXCcgc3BlY2lhbGx5CisgKiAgICAgIC1zICAgICAgICAgICAgICBUdXJuIG9mZiBlY2hvICh0dHkgb25seSkKKyAqICAgICAgLW4gTkNIQVJTICAgICAgIFJlYWQgTkNIQVJTIG1heAorICogICAgICAtcCBQUk9NUFQgICAgICAgRGlzcGxheSBQUk9NUFQgb24gc3RkZXJyIChpZiBpbnB1dCBpcyBmcm9tIHR0eSkKKyAqICAgICAgLXQgU0VDT05EUyAgICAgIFRpbWVvdXQgYWZ0ZXIgU0VDT05EUyAodHR5IG9yIHBpcGUgb25seSkKKyAqICAgICAgLXUgRkQgICAgICAgICAgIFJlYWQgZnJvbSBnaXZlbiBGRCBpbnN0ZWFkIG9mIGZkIDAKKyAqIFRoaXMgdXNlcyB1bmJ1ZmZlcmVkIGlucHV0LCB3aGljaCBtYXkgYmUgYXZvaWRhYmxlIGluIHNvbWUgY2FzZXMuCisgKiBUT0RPOiBiYXNoIGFsc28gaGFzOgorICogICAgICAtYSBBUlJBWSAgICAgICAgUmVhZCBpbnRvIGFycmF5WzBdLFsxXSxldGMKKyAqICAgICAgLWQgREVMSU0gICAgICAgIEVuZCBvbiBERUxJTSBjaGFyLCBub3QgbmV3bGluZQorICogICAgICAtZSAgICAgICAgICAgICAgVXNlIGxpbmUgZWRpdGluZyAodHR5IG9ubHkpCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCityZWFkY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKm9wdF9uID0gTlVMTDsKKwljaGFyICpvcHRfcCA9IE5VTEw7CisJY2hhciAqb3B0X3QgPSBOVUxMOworCWNoYXIgKm9wdF91ID0gTlVMTDsKKwlpbnQgcmVhZF9mbGFncyA9IDA7CisJY29uc3QgY2hhciAqcjsKKwlpbnQgaTsKKworCXdoaWxlICgoaSA9IG5leHRvcHQoInA6dTpydDpuOnMiKSkgIT0gJ1wwJykgeworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAncCc6CisJCQlvcHRfcCA9IG9wdGlvbmFyZzsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW9wdF9uID0gb3B0aW9uYXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJcmVhZF9mbGFncyB8PSBCVUlMVElOX1JFQURfU0lMRU5UOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJb3B0X3QgPSBvcHRpb25hcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZWFkX2ZsYWdzIHw9IEJVSUxUSU5fUkVBRF9SQVc7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlvcHRfdSA9IG9wdGlvbmFyZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyID0gc2hlbGxfYnVpbHRpbl9yZWFkKHNldHZhcjIsCisJCWFyZ3B0ciwKKwkJYmx0aW5sb29rdXAoIklGUyIpLCAvKiBjYW4gYmUgTlVMTCAqLworCQlyZWFkX2ZsYWdzLAorCQlvcHRfbiwKKwkJb3B0X3AsCisJCW9wdF90LAorCQlvcHRfdQorCSk7CisKKwlpZiAoKHVpbnRwdHJfdClyID4gMSkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3Iocik7CisKKwlyZXR1cm4gKHVpbnRwdHJfdClyOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQwordW1hc2tjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBwZXJtdXNlclszXSBBTElHTjEgPSAidWdvIjsKKwlzdGF0aWMgY29uc3QgY2hhciBwZXJtbW9kZVszXSBBTElHTjEgPSAicnd4IjsKKwlzdGF0aWMgY29uc3Qgc2hvcnQgcGVybW1hc2tbXSBBTElHTjIgPSB7CisJCVNfSVJVU1IsIFNfSVdVU1IsIFNfSVhVU1IsCisJCVNfSVJHUlAsIFNfSVdHUlAsIFNfSVhHUlAsCisJCVNfSVJPVEgsIFNfSVdPVEgsIFNfSVhPVEgKKwl9OworCisJLyogVE9ETzogdXNlIGJiX3BhcnNlX21vZGUoKSBpbnN0ZWFkICovCisKKwljaGFyICphcDsKKwltb2RlX3QgbWFzazsKKwlpbnQgaTsKKwlpbnQgc3ltYm9saWNfbW9kZSA9IDA7CisKKwl3aGlsZSAobmV4dG9wdCgiUyIpICE9ICdcMCcpIHsKKwkJc3ltYm9saWNfbW9kZSA9IDE7CisJfQorCisJSU5UX09GRjsKKwltYXNrID0gdW1hc2soMCk7CisJdW1hc2sobWFzayk7CisJSU5UX09OOworCisJYXAgPSAqYXJncHRyOworCWlmIChhcCA9PSBOVUxMKSB7CisJCWlmIChzeW1ib2xpY19tb2RlKSB7CisJCQljaGFyIGJ1ZlsxOF07CisJCQljaGFyICpwID0gYnVmOworCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJaW50IGo7CisKKwkJCQkqcCsrID0gcGVybXVzZXJbaV07CisJCQkJKnArKyA9ICc9JzsKKwkJCQlmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisJCQkJCWlmICgobWFzayAmIHBlcm1tYXNrWzMgKiBpICsgal0pID09IDApIHsKKwkJCQkJCSpwKysgPSBwZXJtbW9kZVtqXTsKKwkJCQkJfQorCQkJCX0KKwkJCQkqcCsrID0gJywnOworCQkJfQorCQkJKi0tcCA9IDA7CisJCQlwdXRzKGJ1Zik7CisJCX0gZWxzZSB7CisJCQlvdXQxZm10KCIlLjRvXG4iLCBtYXNrKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqYXApKSB7CisJCQltYXNrID0gMDsKKwkJCWRvIHsKKwkJCQlpZiAoKmFwID49ICc4JyB8fCAqYXAgPCAnMCcpCisJCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKG1zZ19pbGxudW0sIGFyZ3ZbMV0pOworCQkJCW1hc2sgPSAobWFzayA8PCAzKSArICgqYXAgLSAnMCcpOworCQkJfSB3aGlsZSAoKisrYXAgIT0gJ1wwJyk7CisJCQl1bWFzayhtYXNrKTsKKwkJfSBlbHNlIHsKKwkJCW1hc2sgPSB+bWFzayAmIDA3Nzc7CisJCQlpZiAoIWJiX3BhcnNlX21vZGUoYXAsICZtYXNrKSkgeworCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJpbGxlZ2FsIG1vZGU6ICVzIiwgYXApOworCQkJfQorCQkJdW1hc2sofm1hc2sgJiAwNzc3KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK3VsaW1pdGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBzaGVsbF9idWlsdGluX3VsaW1pdChhcmd2KTsKK30KKworLyogPT09PT09PT09PT09IG1haW4oKSBhbmQgaGVscGVycyAqLworCisvKgorICogQ2FsbGVkIHRvIGV4aXQgdGhlIHNoZWxsLgorICovCitzdGF0aWMgdm9pZAorZXhpdHNoZWxsKHZvaWQpCit7CisJc3RydWN0IGptcGxvYyBsb2M7CisJY2hhciAqcDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZXhpdHN0YXR1czsKKwlUUkFDRSgoInBpZCAlZCwgZXhpdHNoZWxsKCVkKVxuIiwgZ2V0cGlkKCksIHN0YXR1cykpOworCWlmIChzZXRqbXAobG9jLmxvYykpIHsKKwkJaWYgKGV4Y2VwdGlvbl90eXBlID09IEVYRVhJVCkKKy8qIGRhc2ggYnVnOiBpdCBqdXN0IGRvZXMgX2V4aXQoZXhpdHN0YXR1cykgaGVyZQorICogYnV0IHdlIGhhdmUgdG8gZG8gc2V0am9iY3RsKDApIGZpcnN0IQorICogKGJ1ZyBpcyBzdGlsbCBub3QgZml4ZWQgaW4gZGFzaC0wLjUuMyAtIGlmIHlvdSBydW4gZGFzaAorICogdW5kZXIgTWlkbmlnaHQgQ29tbWFuZGVyLCBvbiBleGl0IGZyb20gZGFzaCBNQyBpcyBiYWNrZ3JvdW5kZWQpICovCisJCQlzdGF0dXMgPSBleGl0c3RhdHVzOworCQlnb3RvIG91dDsKKwl9CisJZXhjZXB0aW9uX2hhbmRsZXIgPSAmbG9jOworCXAgPSB0cmFwWzBdOworCWlmIChwKSB7CisJCXRyYXBbMF0gPSBOVUxMOworCQlldmFsc3RyaW5nKHAsIDApOworCQlmcmVlKHApOworCX0KKwlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7Cisgb3V0OgorCXNldGpvYmN0bCgwKTsKKwlfZXhpdChzdGF0dXMpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQKK2luaXQodm9pZCkKK3sKKwkvKiBmcm9tIGlucHV0LmM6ICovCisJLyogd2Ugd2lsbCBuZXZlciBmcmVlIHRoaXMgKi8KKwliYXNlcGYubmV4dF90b19wZ2V0YyA9IGJhc2VwZi5idWYgPSBja21hbGxvYyhJQlVGU0laKTsKKworCS8qIGZyb20gdHJhcC5jOiAqLworCXNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKKwkvKiBiYXNoIHJlLWVuYWJsZXMgU0lHSFVQIHdoaWNoIGlzIFNJR19JR05lZCBvbiBlbnRyeS4KKwkgKiBUcnk6ICJ0cmFwICcnIEhVUDsgYmFzaDsgZWNobyBSRVQiIGFuZCB0eXBlICJraWxsIC1IVVAgJCQiCisJICovCisJc2lnbmFsKFNJR0hVUCwgU0lHX0RGTCk7CisKKwkvKiBmcm9tIHZhci5jOiAqLworCXsKKwkJY2hhciAqKmVudnA7CisJCWNvbnN0IGNoYXIgKnA7CisJCXN0cnVjdCBzdGF0IHN0MSwgc3QyOworCisJCWluaXR2YXIoKTsKKwkJZm9yIChlbnZwID0gZW52aXJvbjsgZW52cCAmJiAqZW52cDsgZW52cCsrKSB7CisJCQlpZiAoc3RyY2hyKCplbnZwLCAnPScpKSB7CisJCQkJc2V0dmFyZXEoKmVudnAsIFZFWFBPUlR8VlRFWFRGSVhFRCk7CisJCQl9CisJCX0KKworCQlzZXR2YXIoIlBQSUQiLCB1dG9hKGdldHBwaWQoKSksIDApOworCisJCXAgPSBsb29rdXB2YXIoIlBXRCIpOworCQlpZiAocCkgeworCQkJaWYgKCpwICE9ICcvJyB8fCBzdGF0KHAsICZzdDEpIHx8IHN0YXQoIi4iLCAmc3QyKQorCQkJIHx8IHN0MS5zdF9kZXYgIT0gc3QyLnN0X2RldiB8fCBzdDEuc3RfaW5vICE9IHN0Mi5zdF9pbm8KKwkJCSkgeworCQkJCXAgPSAnXDAnOworCQkJfQorCQl9CisJCXNldHB3ZChwLCAwKTsKKwl9Cit9CisKKworLy91c2FnZTojZGVmaW5lIGFzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy0vK09QVElPTlNdIFstLytvIE9QVF0uLi4gWy1jICdTQ1JJUFQnIFtBUkcwIFtBUkdTXV0gLyBGSUxFIFtBUkdTXV0iCisvL3VzYWdlOiNkZWZpbmUgYXNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiVW5peCBzaGVsbCBpbnRlcnByZXRlciIKKworLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfU0hfSVNfQVNICisvL3VzYWdlOiMgZGVmaW5lIHNoX3RyaXZpYWxfdXNhZ2UgYXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6IyBkZWZpbmUgc2hfZnVsbF91c2FnZSAgICBhc2hfZnVsbF91c2FnZQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX0JBU0hfSVNfQVNICisvL3VzYWdlOiMgZGVmaW5lIGJhc2hfdHJpdmlhbF91c2FnZSBhc2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTojIGRlZmluZSBiYXNoX2Z1bGxfdXNhZ2UgICAgYXNoX2Z1bGxfdXNhZ2UKKy8vdXNhZ2U6I2VuZGlmCisKKy8qCisgKiBQcm9jZXNzIHRoZSBzaGVsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICovCitzdGF0aWMgdm9pZAorcHJvY2FyZ3MoY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqeG1pbnVzYzsKKwljaGFyICoqeGFyZ3Y7CisKKwl4YXJndiA9IGFyZ3Y7CisJYXJnMCA9IHhhcmd2WzBdOworCS8qIGlmICh4YXJndlswXSkgLSBtbW0sIHRoaXMgaXMgYWx3YXlzIHRydWUhICovCisJCXhhcmd2Kys7CisJZm9yIChpID0gMDsgaSA8IE5PUFRTOyBpKyspCisJCW9wdGxpc3RbaV0gPSAyOworCWFyZ3B0ciA9IHhhcmd2OworCWlmIChvcHRpb25zKC8qY21kbGluZToqLyAxKSkgeworCQkvKiBpdCBhbHJlYWR5IHByaW50ZWQgZXJyIG1lc3NhZ2UgKi8KKwkJcmFpc2VfZXhjZXB0aW9uKEVYRVJST1IpOworCX0KKwl4YXJndiA9IGFyZ3B0cjsKKwl4bWludXNjID0gbWludXNjOworCWlmICgqeGFyZ3YgPT0gTlVMTCkgeworCQlpZiAoeG1pbnVzYykKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGJiX21zZ19yZXF1aXJlc19hcmcsICItYyIpOworCQlzZmxhZyA9IDE7CisJfQorCWlmIChpZmxhZyA9PSAyICYmIHNmbGFnID09IDEgJiYgaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKKwkJaWZsYWcgPSAxOworCWlmIChtZmxhZyA9PSAyKQorCQltZmxhZyA9IGlmbGFnOworCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKQorCQlpZiAob3B0bGlzdFtpXSA9PSAyKQorCQkJb3B0bGlzdFtpXSA9IDA7CisjaWYgREVCVUcgPT0gMgorCWRlYnVnID0gMTsKKyNlbmRpZgorCS8qIFBPU0lYIDEwMDMuMjogZmlyc3QgYXJnIGFmdGVyIC1jIGNtZCBpcyAkMCwgcmVtYWluZGVyICQxLi4uICovCisJaWYgKHhtaW51c2MpIHsKKwkJbWludXNjID0gKnhhcmd2Kys7CisJCWlmICgqeGFyZ3YpCisJCQlnb3RvIHNldGFyZzA7CisJfSBlbHNlIGlmICghc2ZsYWcpIHsKKwkJc2V0aW5wdXRmaWxlKCp4YXJndiwgMCk7Cisgc2V0YXJnMDoKKwkJYXJnMCA9ICp4YXJndisrOworCQljb21tYW5kbmFtZSA9IGFyZzA7CisJfQorCisJc2hlbGxwYXJhbS5wID0geGFyZ3Y7CisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCisJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisjZW5kaWYKKwkvKiBhc3NlcnQoc2hlbGxwYXJhbS5tYWxsb2NlZCA9PSAwICYmIHNoZWxscGFyYW0ubnBhcmFtID09IDApOyAqLworCXdoaWxlICgqeGFyZ3YpIHsKKwkJc2hlbGxwYXJhbS5ucGFyYW0rKzsKKwkJeGFyZ3YrKzsKKwl9CisJb3B0c2NoYW5nZWQoKTsKK30KKworLyoKKyAqIFJlYWQgL2V0Yy9wcm9maWxlIG9yIC5wcm9maWxlLgorICovCitzdGF0aWMgdm9pZAorcmVhZF9wcm9maWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHNraXA7CisKKwlpZiAoc2V0aW5wdXRmaWxlKG5hbWUsIElOUFVUX1BVU0hfRklMRSB8IElOUFVUX05PRklMRV9PSykgPCAwKQorCQlyZXR1cm47CisJc2tpcCA9IGNtZGxvb3AoMCk7CisJcG9wZmlsZSgpOworCWlmIChza2lwKQorCQlleGl0c2hlbGwoKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhbiBlcnJvciBvciBhbiBpbnRlcnJ1cHQgb2NjdXJzIGluIGFuCisgKiBpbnRlcmFjdGl2ZSBzaGVsbCBhbmQgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgbWFpbiBjb21tYW5kIGxvb3AuCisgKi8KK3N0YXRpYyB2b2lkCityZXNldCh2b2lkKQoreworCS8qIGZyb20gZXZhbC5jOiAqLworCWV2YWxza2lwID0gMDsKKwlsb29wbmVzdCA9IDA7CisJLyogZnJvbSBpbnB1dC5jOiAqLworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2J1ZmZlciA9IDA7CisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9IDA7ICAgICAgLyogY2xlYXIgaW5wdXQgYnVmZmVyICovCisJcG9wYWxsZmlsZXMoKTsKKwkvKiBmcm9tIHBhcnNlci5jOiAqLworCXRva3B1c2hiYWNrID0gMDsKKwljaGVja2t3ZCA9IDA7CisJLyogZnJvbSByZWRpci5jOiAqLworCWNsZWFycmVkaXIoLypkcm9wOiovIDApOworfQorCisjaWYgUFJPRklMRQorc3RhdGljIHNob3J0IHByb2ZpbGVfYnVmWzE2Mzg0XTsKK2V4dGVybiBpbnQgZXRleHQoKTsKKyNlbmRpZgorCisvKgorICogTWFpbiByb3V0aW5lLiAgV2UgaW5pdGlhbGl6ZSB0aGluZ3MsIHBhcnNlIHRoZSBhcmd1bWVudHMsIGV4ZWN1dGUKKyAqIHByb2ZpbGVzIGlmIHdlJ3JlIGEgbG9naW4gc2hlbGwsIGFuZCB0aGVuIGNhbGwgY21kbG9vcCB0byBleGVjdXRlCisgKiBjb21tYW5kcy4gIFRoZSBzZXRqbXAgY2FsbCBzZXRzIHVwIHRoZSBsb2NhdGlvbiB0byBqdW1wIHRvIHdoZW4gYW4KKyAqIGV4Y2VwdGlvbiBvY2N1cnMuICBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgdGhlIHZhcmlhYmxlICJzdGF0ZSIKKyAqIGlzIHVzZWQgdG8gZmlndXJlIG91dCBob3cgZmFyIHdlIGhhZCBnb3R0ZW4uCisgKi8KK2ludCBhc2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFzaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqc2hpbml0OworCXZvbGF0aWxlIHNtYWxsaW50IHN0YXRlOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBkYXRhICovCisJSU5JVF9HX21pc2MoKTsKKwlJTklUX0dfbWVtc3RhY2soKTsKKwlJTklUX0dfdmFyKCk7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCUlOSVRfR19hbGlhcygpOworI2VuZGlmCisJSU5JVF9HX2NtZHRhYmxlKCk7CisKKyNpZiBQUk9GSUxFCisJbW9uaXRvcig0LCBldGV4dCwgcHJvZmlsZV9idWYsIHNpemVvZihwcm9maWxlX2J1ZiksIDUwKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworCWxpbmVfaW5wdXRfc3RhdGUgPSBuZXdfbGluZV9pbnB1dF90KEZPUl9TSEVMTCB8IFdJVEhfUEFUSF9MT09LVVApOworI2VuZGlmCisJc3RhdGUgPSAwOworCWlmIChzZXRqbXAoam1wbG9jLmxvYykpIHsKKwkJc21hbGxpbnQgZTsKKwkJc21hbGxpbnQgczsKKworCQlyZXNldCgpOworCisJCWUgPSBleGNlcHRpb25fdHlwZTsKKwkJaWYgKGUgPT0gRVhFUlJPUikKKwkJCWV4aXRzdGF0dXMgPSAyOworCQlzID0gc3RhdGU7CisJCWlmIChlID09IEVYRVhJVCB8fCBzID09IDAgfHwgaWZsYWcgPT0gMCB8fCBzaGx2bCkgeworCQkJZXhpdHNoZWxsKCk7CisJCX0KKwkJaWYgKGUgPT0gRVhJTlQpIHsKKwkJCW91dGNzbG93KCdcbicsIHN0ZGVycik7CisJCX0KKworCQlwb3BzdGFja21hcmsoJnNtYXJrKTsKKwkJRk9SQ0VfSU5UX09OOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQlpZiAocyA9PSAxKQorCQkJZ290byBzdGF0ZTE7CisJCWlmIChzID09IDIpCisJCQlnb3RvIHN0YXRlMjsKKwkJaWYgKHMgPT0gMykKKwkJCWdvdG8gc3RhdGUzOworCQlnb3RvIHN0YXRlNDsKKwl9CisJZXhjZXB0aW9uX2hhbmRsZXIgPSAmam1wbG9jOworI2lmIERFQlVHCisJb3BlbnRyYWNlKCk7CisJVFJBQ0UoKCJTaGVsbCBhcmdzOiAiKSk7CisJdHJhY2VfcHV0c19hcmdzKGFyZ3YpOworI2VuZGlmCisJcm9vdHBpZCA9IGdldHBpZCgpOworCisJaW5pdCgpOworCXNldHN0YWNrbWFyaygmc21hcmspOworCXByb2NhcmdzKGFyZ3YpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWQorCWlmIChpZmxhZykgeworCQljb25zdCBjaGFyICpocCA9IGxvb2t1cHZhcigiSElTVEZJTEUiKTsKKwkJaWYgKCFocCkgeworCQkJaHAgPSBsb29rdXB2YXIoIkhPTUUiKTsKKwkJCWlmIChocCkgeworCQkJCWNoYXIgKmRlZmhwID0gY29uY2F0X3BhdGhfZmlsZShocCwgIi5hc2hfaGlzdG9yeSIpOworCQkJCXNldHZhcigiSElTVEZJTEUiLCBkZWZocCwgMCk7CisJCQkJZnJlZShkZWZocCk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoYXJndlswXSAmJiBhcmd2WzBdWzBdID09ICctJykKKwkJaXNsb2dpbnNoID0gMTsKKwlpZiAoaXNsb2dpbnNoKSB7CisJCXN0YXRlID0gMTsKKwkJcmVhZF9wcm9maWxlKCIvZXRjL3Byb2ZpbGUiKTsKKyBzdGF0ZTE6CisJCXN0YXRlID0gMjsKKwkJcmVhZF9wcm9maWxlKCIucHJvZmlsZSIpOworCX0KKyBzdGF0ZTI6CisJc3RhdGUgPSAzOworCWlmICgKKyNpZm5kZWYgbGludXgKKwkgZ2V0dWlkKCkgPT0gZ2V0ZXVpZCgpICYmIGdldGdpZCgpID09IGdldGVnaWQoKSAmJgorI2VuZGlmCisJIGlmbGFnCisJKSB7CisJCXNoaW5pdCA9IGxvb2t1cHZhcigiRU5WIik7CisJCWlmIChzaGluaXQgIT0gTlVMTCAmJiAqc2hpbml0ICE9ICdcMCcpIHsKKwkJCXJlYWRfcHJvZmlsZShzaGluaXQpOworCQl9CisJfQorIHN0YXRlMzoKKwlzdGF0ZSA9IDQ7CisJaWYgKG1pbnVzYykgeworCQkvKiBldmFsc3RyaW5nIHB1c2hlcyBwYXJzZWZpbGUgc3RhY2suCisJCSAqIEVuc3VyZSB3ZSBkb24ndCBmYWxzZWx5IGNsYWltIHRoYXQgMCAoc3RkaW4pCisJCSAqIGlzIG9uZSBvZiBzdGFja2VkIHNvdXJjZSBmZHMuCisJCSAqIFRlc3RjYXNlOiBhc2ggLWMgJ2V4ZWMgMT4mMCcgbXVzdCBub3QgY29tcGxhaW4uICovCisJCS8vIGlmICghc2ZsYWcpIGdfcGFyc2VmaWxlLT5wZl9mZCA9IC0xOworCQkvLyBeXiBub3QgbmVjZXNzYXJ5IHNpbmNlIG5vdyB3ZSBzcGVjaWFsLWNhc2UgZmQgMAorCQkvLyBpbiBpc19oaWRkZW5fZmQoKSB0byBub3QgYmUgY29uc2lkZXJlZCAiaGlkZGVuIGZkIgorCQlldmFsc3RyaW5nKG1pbnVzYywgMCk7CisJfQorCisJaWYgKHNmbGFnIHx8IG1pbnVzYyA9PSBOVUxMKSB7CisjaWYgZGVmaW5lZCBNQVhfSElTVE9SWSAmJiBNQVhfSElTVE9SWSA+IDAgJiYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWQorCQlpZiAoaWZsYWcpIHsKKwkJCWNvbnN0IGNoYXIgKmhwID0gbG9va3VwdmFyKCJISVNURklMRSIpOworCQkJaWYgKGhwKQorCQkJCWxpbmVfaW5wdXRfc3RhdGUtPmhpc3RfZmlsZSA9IGhwOworIyBpZiBFTkFCTEVfRkVBVFVSRV9TSF9ISVNURklMRVNJWkUKKwkJCWhwID0gbG9va3VwdmFyKCJISVNURklMRVNJWkUiKTsKKwkJCWxpbmVfaW5wdXRfc3RhdGUtPm1heF9oaXN0b3J5ID0gc2l6ZV9mcm9tX0hJU1RGSUxFU0laRShocCk7CisjIGVuZGlmCisJCX0KKyNlbmRpZgorIHN0YXRlNDogLyogWFhYID8/PyAtIHdoeSBpc24ndCB0aGlzIGJlZm9yZSB0aGUgImlmIiBzdGF0ZW1lbnQgKi8KKwkJY21kbG9vcCgxKTsKKwl9CisjaWYgUFJPRklMRQorCW1vbml0b3IoMCk7CisjZW5kaWYKKyNpZmRlZiBHUFJPRgorCXsKKwkJZXh0ZXJuIHZvaWQgX21jbGVhbnVwKHZvaWQpOworCQlfbWNsZWFudXAoKTsKKwl9CisjZW5kaWYKKwlUUkFDRSgoIkVuZCBvZiBtYWluIHJlYWNoZWRcbiIpKTsKKwlleGl0c2hlbGwoKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEsIDE5OTMsIDE5OTQKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF9kb2MudHh0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX2RvYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhNDQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF9kb2MudHh0CkBAIC0wLDAgKzEsMTIyIEBACisJV2FpdCArIHNpZ25hbHMKKworV2UgaGFkIHNvbWUgYnVncyBoZXJlIHdoaWNoIGFyZSBoYXJkIHRvIHRlc3QgaW4gdGVzdHN1aXRlLgorCitCdWcgMTI4MCAoaHR0cDovL2J1c3lib3gubmV0L2J1Z3Mvdmlldy5waHA/aWQ9MTI4MCk6Cit3YXMgbWlzYmVoYXZpbmcgaW4gaW50ZXJhY3RpdmUgYXNoLiBDb3JyZWN0IGJlaGF2aW9yOgorCiskIHNsZWVwIDIwICYKKyQgd2FpdAorXkMKKyQgd2FpdAorXkMKKyQgd2FpdAorXkMKKy4uLgorCisKK0J1ZyAxOTg0IChodHRwOi8vYnVzeWJveC5uZXQvYnVncy92aWV3LnBocD9pZD0xOTg0KToKK3RyYXBzIHdlcmUgbm90IHRyaWdnZXJpbmc6CisKK3RyYXBfaGFuZGxlcl91c3IgKCkgeworICAgIGVjaG8gdHJhcCB1c3IKK30KK3RyYXBfaGFuZGxlcl9pbnQgKCkgeworICAgIGVjaG8gdHJhcCBpbnQKK30KK3RyYXAgdHJhcF9oYW5kbGVyX3VzciBVU1IxCit0cmFwIHRyYXBfaGFuZGxlcl9pbnQgSU5UCitzbGVlcCAzNjAwICYKK2VjaG8gIlBsZWFzZSBkbzoga2lsbCAtVVNSMSAkJCIKK2VjaG8gIm9yOiBraWxsIC1JTlQgJCQiCit3aGlsZSB0cnVlOyBkbyB3YWl0OyBlY2hvIHdhaXQgaW50ZXJydXB0ZWQ7IGRvbmUKKworCitCdWcgMTg5IChodHRwczovL2J1Z3MuYnVzeWJveC5uZXQvc2hvd19idWcuY2dpP2lkPTE4OSkKKworZnVuYygpIHsKKyAgICBzbGVlcCAxCit9Cit3aGlsZSAodHJ1ZSk7IGRvCisgICAgZnVuYworICAgIGVjaG8gTG9vcGluZworZG9uZQorCiteQyB3YXMgb2JzZXJ2ZWQgdG8gbWFrZSBhc2ggcHJvY2Vzc2VzIGdlb21ldHJpY2FsbHkgbXVsdGlwbHkgKCEpIGluc3RlYWQKK29mIGV4aXRpbmcuICh0cnVlKSBpbiBzdWJzaGVsbCBkb2VzIG5vdCBzZWVtIHRvIG1hdHRlciwgYXMgYW5vdGhlciB1c2VyCityZXBvcnRzIHRoZSBzYW1lIHdpdGg6CisKK3RyYXAgImVjaG8gVVNSMSIgVVNSMQord2hpbGUgdHJ1ZTsgZG8KKyAgICBlY2hvIFNsZWVwaW5nCisgICAgc2xlZXAgNQorZG9uZQorCitDb21wYXQgbm90ZS4KK0Jhc2ggdmVyc2lvbiAzLjIuMCgxKSBleGl0cyB0aGlzIHNjcmlwdCBhdCB0aGUgcmVjZWlwdCBvZiBTSUdJTlQKK19vbmx5XyBpZiBpdCBoYWQgdHdvIGxhc3QgY2hpbGRyZW4gZGllIGZyb20gaXQuCitUaGUgZm9sbG93aW5nIHRyYWNlIHdhcyBvYnRhaW5lZCB3aGlsZSBwZXJpb2RpY2FsbHkgcnVubmluZworImtpbGxhbGwgLVNJR0lOVCBzbGVlcDsgc2xlZXAgMC4xOyBraWxsIC1TSUdJTlQgPGJhc2hfUElEPiI6CisKKzIzOjQ4OjMyLjM3NjcwNyBjbG9uZSguLi4pID0gMTM1MjgKKzIzOjQ4OjMyLjM4ODcwNiB3YWl0cGlkKC0xLCAweGZmYzgzMmVjLCAwKSA9ID8gRVJFU1RBUlRTWVMgKFRvIGJlIHJlc3RhcnRlZCkKKzIzOjQ4OjMyLjQ1OTc2MSAtLS0gU0lHSU5UIChJbnRlcnJ1cHQpIEAgMCAoMCkgLS0tCisgICAga2lsbCAtU0lHSU5UIDxiYXNoX1BJRD4gaXMgaWdub3JlZCwgYmFjayB0byB3YWl0aW5nOgorMjM6NDg6MzIuNDYzNzA2IHdhaXRwaWQoLTEsIFt7V0lGRVhJVEVEKHMpICYmIFdFWElUU1RBVFVTKHMpID09IDB9XSwgMCkgPSAxMzUyOAorICAgIHNsZWVwIGV4aXRlZCB3aXRoIDAKKzIzOjQ4OjM3LjM3NzU1NyAtLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQorMjM6NDg6MzcuMzc4NDUxIGNsb25lKC4uLikgPSAxMzUzOAorMjM6NDg6MzcuMzkwNzA4IHdhaXRwaWQoLTEsIFt7V0lGU0lHTkFMRUQocykgJiYgV1RFUk1TSUcocykgPT0gU0lHSU5UfV0sIDApID0gMTM1MzgKKyAgICBzbGVlcCB3YXMga2lsbGVkIGJ5ICJraWxsYWxsIC1TSUdJTlQgc2xlZXAiCisyMzo0ODozOC41MjM5NDQgLS0tIFNJR0NITEQgKENoaWxkIGV4aXRlZCkgQCAwICgwKSAtLS0KKzIzOjQ4OjM4LjUyNDg2MSBjbG9uZSguLi4pID0gMTM1NDIKKzIzOjQ4OjM4LjUzODcwNiB3YWl0cGlkKC0xLCAweGZmYzgzMmVjLCAwKSA9ID8gRVJFU1RBUlRTWVMgKFRvIGJlIHJlc3RhcnRlZCkKKzIzOjQ4OjM4LjYyNDc2MSAtLS0gU0lHSU5UIChJbnRlcnJ1cHQpIEAgMCAoMCkgLS0tCisgICAga2lsbCAtU0lHSU5UIDxiYXNoX1BJRD4gaXMgaWdub3JlZCwgYmFjayB0byB3YWl0aW5nOgorMjM6NDg6MzguNjI4NzA2IHdhaXRwaWQoLTEsIFt7V0lGRVhJVEVEKHMpICYmIFdFWElUU1RBVFVTKHMpID09IDB9XSwgMCkgPSAxMzU0MgorICAgIHNsZWVwIGV4aXRlZCB3aXRoIDAKKzIzOjQ4OjQzLjUyNTY3NCAtLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQorMjM6NDg6NDMuNTI2NTYzIGNsb25lKC4uLikgPSAxMzU0NQorMjM6NDg6NDMuNTM4NzA5IHdhaXRwaWQoLTEsIFt7V0lGU0lHTkFMRUQocykgJiYgV1RFUk1TSUcocykgPT0gU0lHSU5UfV0sIDApID0gMTM1NDUKKyAgICBzbGVlcCB3YXMga2lsbGVkIGJ5ICJraWxsYWxsIC1TSUdJTlQgc2xlZXAiCisyMzo0ODo0NC40NjY4NDggLS0tIFNJR0NITEQgKENoaWxkIGV4aXRlZCkgQCAwICgwKSAtLS0KKzIzOjQ4OjQ0LjQ2NzczNSBjbG9uZSguLi4pID0gMTM1NDkKKzIzOjQ4OjQ0LjQ4MTcwNiB3YWl0cGlkKC0xLCAweGZmYzgzMmVjLCAwKSA9ID8gRVJFU1RBUlRTWVMgKFRvIGJlIHJlc3RhcnRlZCkKKzIzOjQ4OjQ0LjU2Nzc1NyAtLS0gU0lHSU5UIChJbnRlcnJ1cHQpIEAgMCAoMCkgLS0tCisgICAga2lsbCAtU0lHSU5UIDxiYXNoX1BJRD4gaXMgaWdub3JlZCwgYmFjayB0byB3YWl0aW5nOgorMjM6NDg6NDQuNTcxNzA2IHdhaXRwaWQoLTEsIFt7V0lGRVhJVEVEKHMpICYmIFdFWElUU1RBVFVTKHMpID09IDB9XSwgMCkgPSAxMzU0OQorICAgIHNsZWVwIGV4aXRlZCB3aXRoIDAKKzIzOjQ4OjQ5LjQ2ODU1MyAtLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQorMjM6NDg6NDkuNDY5NDQ1IGNsb25lKC4uLikgPSAxMzU1MQorMjM6NDg6NDkuNDgxNzA4IHdhaXRwaWQoLTEsIFt7V0lGU0lHTkFMRUQocykgJiYgV1RFUk1TSUcocykgPT0gU0lHSU5UfV0sIDApID0gMTM1NTEKKyAgICBzbGVlcCB3YXMga2lsbGVkIGJ5ICJraWxsYWxsIC1TSUdJTlQgc2xlZXAiCisyMzo0ODo1MC41MTU4MzcgLS0tIFNJR0NITEQgKENoaWxkIGV4aXRlZCkgQCAwICgwKSAtLS0KKzIzOjQ4OjUwLjUxNjcxOCBjbG9uZSguLi4pID0gMTM1NTUKKzIzOjQ4OjUwLjUzMDcwNiB3YWl0cGlkKC0xLCAweGZmYzgzMmVjLCAwKSA9ID8gRVJFU1RBUlRTWVMgKFRvIGJlIHJlc3RhcnRlZCkKKzIzOjQ4OjUwLjYxNTc2MSAtLS0gU0lHSU5UIChJbnRlcnJ1cHQpIEAgMCAoMCkgLS0tCisgICAga2lsbCAtU0lHSU5UIDxiYXNoX1BJRD4gaXMgaWdub3JlZCwgYmFjayB0byB3YWl0aW5nOgorMjM6NDg6NTAuNjE5NzA1IHdhaXRwaWQoLTEsIFt7V0lGU0lHTkFMRUQocykgJiYgV1RFUk1TSUcocykgPT0gU0lHSU5UfV0sIDApID0gMTM1NTUKKyAgICBzbGVlcCB3YXMga2lsbGVkIGJ5ICJraWxsYWxsIC1TSUdJTlQgc2xlZXAiLgorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBvbmUgaW4gYSByb3cuIEtpbGwgb3Vyc2VsZjoKKzIzOjQ4OjUxLjUwNDYwNCBraWxsKDEzNTE1LCBTSUdJTlQpICAgICA9IDAKKzIzOjQ4OjUxLjUwNDY4OSAtLS0gU0lHSU5UIChJbnRlcnJ1cHQpIEAgMCAoMCkgLS0tCisyMzo0ODo1MS41MDQ5MTUgKysrIGtpbGxlZCBieSBTSUdJTlQgKysrCisKK0FzIGxvbmcgYXMgdGhlcmUgaXMgYXQgbGVhc3Qgb25lICJzbGVlcCA1IiB3aGljaCBleGl0ZWQgc3VjY2Vzc2Z1bGx5Cisobm90IGtpbGxlZCBieSBTSUdJTlQpLCBiYXNoIGNvbnRpbnVlcy4gVGhpcyBpcyBub3QgZG9jdW1lbnRlZCBhbnl3aGVyZQorQUZBSUtTLgorCitXaHkga2V5Ym9hcmQgXkMgYWN0cyBkaWZmZXJlbnRseT8KKworMDA6MDg6MDcuNjU1OTg1IGNsb25lKC4uLikgPSAxNDI3MAorMDA6MDg6MDcuNjY5NzA3IHdhaXRwaWQoLTEsIFt7V0lGRVhJVEVEKHMpICYmIFdFWElUU1RBVFVTKHMpID09IDB9XSwgMCkgPSAxNDI3MAorMDA6MDg6MTIuNjU2ODcyIC0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCiswMDowODoxMi42NTc3NDMgY2xvbmUoLi4uKSA9IDE0MjczCiswMDowODoxMi42NzE3MDggd2FpdHBpZCgtMSwgW3tXSUZTSUdOQUxFRChzKSAmJiBXVEVSTVNJRyhzKSA9PSBTSUdJTlR9XSwgMCkgPSAxNDI3MworMDA6MDg6MTMuODEwNzc4IC0tLSBTSUdJTlQgKEludGVycnVwdCkgQCAwICgwKSAtLS0KKzAwOjA4OjEzLjgxODcwNSBraWxsKDE0MjY5LCBTSUdJTlQpICAgICA9IDAKKzAwOjA4OjEzLjgyMDEwMyAtLS0gU0lHSU5UIChJbnRlcnJ1cHQpIEAgMCAoMCkgLS0tCiswMDowODoxMy44MjA5MjUgKysrIGtpbGxlZCBieSBTSUdJTlQgKysrCisKK1BlcmhhcHMgYmVjYXVzZSBhdCB0aGUgbW9tZW50IGJhc2ggZ290IFNJR0lOVCBpdCBoYWQgbm8gY2hpbGRyZW4/CisoaXQgZGlkIG5vdCBtYW5hZ2UgdG8gc3Bhd24gbmV3IHNsZWVwIHlldCwgc2VlIHRoZSB0cmFjZSkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF9wdHJfaGFjay5jIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3B0cl9oYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5ODQwOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF9wdHJfaGFjay5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworc3RydWN0IGdsb2JhbHNfbWlzYzsKK3N0cnVjdCBnbG9iYWxzX21lbXN0YWNrOworc3RydWN0IGdsb2JhbHNfdmFyOworCisjaWZuZGVmIEdDQ19DT01CSU5FCisKKy8qIFdlIGNoZWF0IGhlcmUuIFRoZXkgYXJlIGRlY2xhcmVkIGFzIGNvbnN0IHB0ciBpbiBhc2guYywKKyAqIGJ1dCBoZXJlIHdlIG1ha2UgdGhlbSBsaXZlIGluIFIvVyBtZW1vcnkgKi8KK3N0cnVjdCBnbG9iYWxzX21pc2MgICAgICphc2hfcHRyX3RvX2dsb2JhbHNfbWlzYzsKK3N0cnVjdCBnbG9iYWxzX21lbXN0YWNrICphc2hfcHRyX3RvX2dsb2JhbHNfbWVtc3RhY2s7CitzdHJ1Y3QgZ2xvYmFsc192YXIgICAgICAqYXNoX3B0cl90b19nbG9iYWxzX3ZhcjsKKworI2Vsc2UKKworLyogZ2NjIC1jb21iaW5lIHdpbGwgc2VlIHRocm91Z2ggYW5kIGNvbXBsYWluICovCisvKiBVc2luZyBhbHRlcm5hdGl2ZSBtZXRob2Qgd2hpY2ggaXMgbW9yZSBsaWtlbHkgdG8gYnJlYWsKKyAqIG9uIHdlaXJkIGFyY2hpdGVjdHVyZXMsIGNvbXBpbGVycywgbGlua2VycyBhbmQgc28gb24gKi8KK3N0cnVjdCBnbG9iYWxzX21pc2MgICAgICpjb25zdCBhc2hfcHRyX3RvX2dsb2JhbHNfbWlzYyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKTsKK3N0cnVjdCBnbG9iYWxzX21lbXN0YWNrICpjb25zdCBhc2hfcHRyX3RvX2dsb2JhbHNfbWVtc3RhY2sgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSk7CitzdHJ1Y3QgZ2xvYmFsc192YXIgICAgICAqY29uc3QgYXNoX3B0cl90b19nbG9iYWxzX3ZhciBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYWxpYXMvYWxpYXMucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYWxpYXMvYWxpYXMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2N2IyMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hbGlhcy9hbGlhcy5yaWdodApAQCAtMCwwICsxLDQgQEAKK2FsaWFzOiAwCithbGlhczogMAorLi9hbGlhcy50ZXN0czogbGluZSAyNTogcWZvbzogbm90IGZvdW5kCitxdXV4CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYWxpYXMvYWxpYXMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYWxpYXMvYWxpYXMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQwN2IwYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hbGlhcy9hbGlhcy50ZXN0cwpAQCAtMCwwICsxLDM3IEBACisjIHBsYWNlIGhvbGRlciBmb3IgZnV0dXJlIGFsaWFzIHRlc3RpbmcKKyNhc2gjIHNob3B0IC1zIGV4cGFuZF9hbGlhc2VzCisKKyMgYWxpYXMvdW5hbGlhcyB0ZXN0cyBvcmlnaW5hbGx5IGluIGJ1aWx0aW5zLnRlc3RzCisKK3VuYWxpYXMgLWEKKyMgdGhpcyBzaG91bGQgcmV0dXJuIHN1Y2Nlc3MsIGFjY29yZGluZyB0byBQT1NJWC4yCithbGlhcworZWNobyBhbGlhczogJD8KK2FsaWFzIGZvbz1iYXIKK3VuYWxpYXMgZm9vCisjIHRoaXMgaGFkIGJldHRlciByZXR1cm4gc3VjY2VzcywgYWNjb3JkaW5nIHRvIFBPU0lYLjIKK2FsaWFzCitlY2hvIGFsaWFzOiAkPworCisjIGJ1ZyBpbiBhbGwgdmVyc2lvbnMgdGhyb3VnaCBiYXNoLTIuMDViCisKK3VuYWxpYXMgcWZvbyBxYmFyIHFiYXogcXV1eCAyPi9kZXYvbnVsbAorCithbGlhcyBxZm9vPXFiYXIKK2FsaWFzIHFiYXI9cWJhegorYWxpYXMgcWJhej1xdXV4CithbGlhcyBxdXV4PXFmb28KKworcWZvbworCit1bmFsaWFzIHFmb28gcWJhciBxYmF6IHF1dXgKKwordW5hbGlhcyAtYQorCithbGlhcyBmb289J2VjaG8gJworYWxpYXMgYmFyPWJhegorYWxpYXMgYmF6PXF1dXgKKworZm9vIGJhcgorCit1bmFsaWFzIGZvbyBiYXIgYmF6CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvUkVBRE1FLmFzaCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9SRUFETUUuYXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTIyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvUkVBRE1FLmFzaApAQCAtMCwwICsxIEBACit0aGVyZSBpcyBubyBzdXBwb3J0IGZvciAoKCApKSBjb25zdHJ1Y3RzIGluIGFzaApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWJhc2gxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWJhc2gxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjFkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtYmFzaDEucmlnaHQKQEAgLTAsMCArMSwyIEBACisxCiswCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtYmFzaDEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtYmFzaDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjM3YjczMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1iYXNoMS50ZXN0cwpAQCAtMCwwICsxLDUgQEAKKyMgY2hlY2tzIGZvciBbWyBdXQorCisjICYmIGFuZCB8fAorW1sgYSAmJiAiIiBdXTsgZWNobyAkPworW1sgYSB8fCAiIiBdXTsgZWNobyAkPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWZvci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1mb3IucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkYmMxNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1mb3IucmlnaHQKQEAgLTAsMCArMSw3NCBAQAorMAorMQorMgorMAorMQorMgorMAorMQorMgorMAorMgorNAorZnggaXMgYSBmdW5jdGlvbgorZnggKCkKK3sKKyAgICBpPTA7CisgICAgZm9yICgoMTsgaSA8IDM7IGkrKyApKQorICAgIGRvCisgICAgICAgIGVjaG8gJGk7CisgICAgZG9uZTsKKyAgICBmb3IgKChpPTA7IDE7IGkrKyApKQorICAgIGRvCisgICAgICAgIGlmICgoIGkgPj0gMyApKTsgdGhlbgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZpOworICAgICAgICBlY2hvICRpOworICAgIGRvbmU7CisgICAgZm9yICgoaT0wOyBpPDM7IDEpKQorICAgIGRvCisgICAgICAgIGVjaG8gJGk7CisgICAgICAgICgoIGkrKyApKTsKKyAgICBkb25lOworICAgIGk9MDsKKyAgICBmb3IgKCgxOyAxOyAxKSkKKyAgICBkbworICAgICAgICBpZiAoKCBpID4gMiApKTsgdGhlbgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZpOworICAgICAgICBlY2hvICRpOworICAgICAgICAoKCBpKysgKSk7CisgICAgZG9uZTsKKyAgICBpPTA7CisgICAgZm9yICgoMTsgMTsgMSkpCisgICAgZG8KKyAgICAgICAgaWYgKCggaSA+IDIgKSk7IHRoZW4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaTsKKyAgICAgICAgZWNobyAkaTsKKyAgICAgICAgKCggaSsrICkpOworICAgIGRvbmUKK30KKzAKKzEKKzIKKzAKKzEKKzIKKzAKKzEKKzIKKzAKKzEKKzIKKzAKKzEKKzIKKy4vYXJpdGgtZm9yLnRlc3RzOiBsaW5lIDc3OiBzeW50YXggZXJyb3I6IGFyaXRobWV0aWMgZXhwcmVzc2lvbiByZXF1aXJlZAorLi9hcml0aC1mb3IudGVzdHM6IGxpbmUgNzc6IHN5bnRheCBlcnJvcjogYCgoIGk9MDsgImkgPCAzIiApKScKKzIKKy4vYXJpdGgtZm9yLnRlc3RzOiBsaW5lIDgzOiBzeW50YXggZXJyb3I6IGA7JyB1bmV4cGVjdGVkCisuL2FyaXRoLWZvci50ZXN0czogbGluZSA4Mzogc3ludGF4IGVycm9yOiBgKCggaT0wOyBpIDwgMzsgaSsrOyA3ICkpJworMgorMjAKKzIwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtZm9yLnRlc3RzeCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1mb3IudGVzdHN4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmYTMwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtZm9yLnRlc3RzeApAQCAtMCwwICsxLDk0IEBACitmeCgpCit7CitpPTAKK2ZvciAoKCA7IGkgPCAzOyBpKysgKSkKK2RvCisJZWNobyAkaQorZG9uZQorCitmb3IgKCggaT0wOyA7IGkrKyApKQorZG8KKwlpZiAoKCBpID49IDMgKSk7IHRoZW4KKwkJYnJlYWs7CisJZmkKKwllY2hvICRpCitkb25lCisKK2ZvciAoKCBpPTA7IGk8MzsgKSkKK2RvCisJZWNobyAkaQorCSgoIGkrKyApKQorZG9uZQorCitpPTAKK2ZvciAoKCA7IDsgKSkKK2RvCisJaWYgKCggaSA+IDIgKSk7IHRoZW4KKwkJYnJlYWs7CisJZmkKKwllY2hvICRpOworCSgoIGkrKyApKQorZG9uZQorCitpPTAKK2ZvciAoKDs7KSkKK2RvCisJaWYgKCggaSA+IDIgKSk7IHRoZW4KKwkJYnJlYWs7CisJZmkKKwllY2hvICRpOworCSgoIGkrKyApKQorZG9uZQorfQorCitmb3IgKCggaT0wOyAiaSA8IDMiIDsgaSsrICkpCitkbworCWVjaG8gJGkKK2RvbmUKKworaT0wCitmb3IgKCggOyAiaSA8IDMiOyBpKysgKSkKK2RvCisJZWNobyAkaQorZG9uZQorCitmb3IgKCggaT0wOyA7IGkrKyApKQorZG8KKwlpZiAoKCBpID49IDMgKSk7IHRoZW4KKwkJYnJlYWs7CisJZmkKKwllY2hvICRpCitkb25lCisKK2ZvciAoKGkgPSAwOyA7aSsrICkpCitkbworCWVjaG8gJGkKKwlpZiAoKCBpIDwgMyApKTsgdGhlbgorCQkoKCBpKysgKSkKKwkJY29udGludWU7CisJZmkKKwlicmVhaworZG9uZQorCit0eXBlIGZ4CitmeAorCisjIGVycm9ycworZm9yICgoIGk9MDsgImkgPCAzIiApKQorZG8KKwllY2hvICRpCitkb25lCitlY2hvICQ/CisKK2ZvciAoKCBpPTA7IGkgPCAzOyBpKys7IDcgKSkKK2RvCisJZWNobyAkaQorZG9uZQorZWNobyAkPworCisjIG9uZS1saW5lcnMgYWRkZWQgaW4gcG9zdC1iYXNoLTIuMDQKK2ZvciAgICAgKChpPTA7IGkgPCAyMDsgaSsrKSkgZG8gOiA7IGRvbmUKK2VjaG8gJGkKKworZm9yICAgICAoKGk9MDsgaSA8IDIwOyBpKyspKSB7IDogOyB9CitlY2hvICRpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5Y2E4ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC5yaWdodApAQCAtMCwwICsxLDEzOCBAQAorRm9ybWF0OiAnZXhwZWN0ZWQgYWN0dWFsJworMTYzIDE2MworNCA0CisxNiAxNgorOCA4CisyIDIKKzQgNAorMiAyCisyIDIKKzEgMQorMCAwCiswIDAKKzAgMAorMSAxCisxIDEKKzIgMgorLTMgLTMKKy0yIC0yCisxIDEKKzAgMAorMiAyCisxMzEwNzIgMTMxMDcyCisyOSAyOQorMzMgMzMKKzQ5IDQ5CisxIDEKKzEgMQorMCAwCiswIDAKKzEgMQorMSAxCisxIDEKKzIgMgorMyAzCisxIDEKKzU4IDU4CisyIDIKKzYwIDYwCisxIDEKKzI1NiAyNTYKKzE2IDE2Cis2MiA2MgorNCA0CisyOSAyOQorNSA1CistNCAtNAorNCA0CisxIDEKKzMyIDMyCiszMiAzMgorMSAxCisxIDEKKzMyIDMyCisyMCAyMAorMzAgMzAKKzIwIDIwCiszMCAzMAorLi9hcml0aC50ZXN0czogbGluZSAxMTc6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis2IDYKKzYsNSwzIDYsNSwzCisyNjMgMjYzCisyNTUgMjU1Cis0MCA0MAorLi9hcml0aC50ZXN0czogbGluZSAxNjM6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDE2NTogZGl2aWRlIGJ5IHplcm8KKy4vYXJpdGgudGVzdHM6IGxldDogbGluZSAxNjY6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDE2NzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxldDogbGluZSAxNjg6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCithYmMKK2RlZgorZ2hpCisuL2FyaXRoLnRlc3RzOiBsaW5lIDE5MTogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzE2IDE2CisuL2FyaXRoLnRlc3RzOiBsaW5lIDE5NjogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMTk3OiBtYWxmb3JtZWQgPzogb3BlcmF0b3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMTk4OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorOSA5CisuL2FyaXRoLnRlc3RzOiBsaW5lIDIwNTogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMjA4OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorOSA5Cis5IDkKKzkgOQorNyA3Cis3Cis0IDQKKzMyNzY3IDMyNzY3CiszMjc2OCAzMjc2OAorMTMxMDcyIDEzMTA3MgorMjE0NzQ4MzY0NyAyMTQ3NDgzNjQ3CisxIDEKKzQgNAorNCA0Cis1IDUKKzUgNQorNCA0CiszIDMKKzMgMworNCA0Cis0IDQKKy4vYXJpdGgudGVzdHM6IGxpbmUgMjU3OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGluZSAyNTk6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDI2MDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMjYyOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGluZSAyNjM6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis0IDQKKzcgNworLTcgLTcKKy4vYXJpdGgxLnN1YjogbGluZSAyOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aDEuc3ViOiBsaW5lIDM6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoMS5zdWI6IGxpbmUgNDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgxLnN1YjogbGluZSA1OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorNiA2CiszIDMKKzcgNworNCA0CiswIDAKKzMgMworNyA3CisyIDIKKy0yIC0yCisxIDEKKy4vYXJpdGgxLnN1YjogbGluZSAzNzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgyLnN1YjogbGluZSAyOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aDIuc3ViOiBsaW5lIDM6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoMi5zdWI6IGxpbmUgNDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgyLnN1YjogbGluZSA1OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorNSA1CisxIDEKKzQgNAorMCAwCisuL2FyaXRoMi5zdWI6IGxpbmUgNDI6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoMi5zdWI6IGxpbmUgNDc6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis4IDEyCisuL2FyaXRoLnRlc3RzOiBsaW5lIDI5MDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzQyCis0MgorNDIKKy4vYXJpdGgudGVzdHM6IGxpbmUgMzAyOiBhW2JbY11kXT1lOiBub3QgZm91bmQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjU3NThlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLnRlc3RzCkBAIC0wLDAgKzEsMzAyIEBACisjYXNoIyBzZXQgK28gcG9zaXgKKyNhc2gjIGRlY2xhcmUgLWkgaXYganYKKworZWNobyAiRm9ybWF0OiAnZXhwZWN0ZWQgYWN0dWFsJyIKKworaXY9JCgoIDMgKyA1ICogMzIgKSkKK2VjaG8gMTYzICRpdgorI2FzaCMgaXY9aXYrMworI2FzaCMgZWNobyAxNjYgJGl2Citpdj0yCitqdj1pdgorCitsZXQgImp2ICo9IDIiCitlY2hvIDQgJGp2Citqdj0kKCggJGp2IDw8IDIgKSkKK2VjaG8gMTYgJGp2CisKK2xldCBqdj0iJGp2IC8gMiIKK2VjaG8gOCAkanYKKyNhc2gjIGp2PSJqdiA+PiAyIgorICAgICAgbGV0IGp2PSJqdiA+PiAyIgorZWNobyAyICRqdgorCitpdj0kKChpdisgJGp2KSkKK2VjaG8gNCAkaXYKK2VjaG8gMiAkKChpdiAtPSBqdikpCitlY2hvIDIgJGl2CitlY2hvIDEgJCgoIGl2ID09IGp2ICkpCitlY2hvIDAgJCgoIGl2ICE9ICRqdiApKQorZWNobyAwICQoKCBpdiA8IGp2ICkpCitlY2hvIDAgJCgoICRpdiA+ICRqdiApKQorZWNobyAxICQoKCBpdiA8PSAkanYgKSkKK2VjaG8gMSAkKCggJGl2ID49IGp2ICkpCisKK2VjaG8gMiAkanYKK2VjaG8gLTMgJCgoIH4kanYgKSkKK2VjaG8gLTIgJCgoIH4xICkpCitlY2hvIDEgJCgoICEgMCApKQorCitlY2hvIDAgJCgoIGp2ICUgMiApKQorZWNobyAyICQoKCAkaXYgJSA0ICkpCisKK2VjaG8gMTMxMDcyICQoKCBpdiA8PD0gMTYgKSkKK2VjaG8gMjkgJCgoIGl2ICU9IDMzICkpCisKK2VjaG8gMzMgJCgoIDMzICYgNTUgKSkKK2VjaG8gNDkgJCgoIDMzIHwgMTcgKSkKKworZWNobyAxICQoKCBpdiAmJiAkanYgKSkKK2VjaG8gMSAkKCggJGl2IHx8IGp2ICkpCisKK2VjaG8gMCAkKCggaXYgJiYgMCApKQorZWNobyAwICQoKCBpdiAmIDAgKSkKK2VjaG8gMSAkKCggaXYgJiYgMSApKQorZWNobyAxICQoKCBpdiAmIDEgKSkKKworZWNobyAxICQoKCAkanYgfHwgMCApKQorZWNobyAyICQoKCBqdiB8IDAgKSkKK2VjaG8gMyAkKCgganYgfCAxICkpCitlY2hvIDEgJCgoICRqdiB8fCAxICkpCisKK2xldCAnaXYgKj0ganYnCitlY2hvIDU4ICRpdgorZWNobyAyICRqdgorbGV0ICJqdiArPSAkaXYiCitlY2hvIDYwICRqdgorCitlY2hvIDEgJCgoIGp2IC89IGl2ICkpCitlY2hvIDI1NiAkKCgganYgPDw9IDggKSkKK2VjaG8gMTYgJCgoIGp2ID4+PSA0ICkpCisKK2VjaG8gNjIgJCgoIGl2IHw9IDQgKSkKK2VjaG8gNCAkKCggaXYgJj0gNCApKQorCitlY2hvIDI5ICQoKCBpdiArPSAoanYgKyA5KSkpCitlY2hvIDUgJCgoIChpdiArIDQpICUgNyApKQorCisjIHVuYXJ5IHBsdXMsIG1pbnVzCitlY2hvIC00ICQoKCArNCAtIDggKSkKK2VjaG8gNCAkKCggLTQgKyA4ICkpCisKKyMgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMKK2VjaG8gMSAkKCggNDw1ID8gMSA6IDMyKSkKK2VjaG8gMzIgJCgoIDQ+NSA/IDEgOiAzMikpCitlY2hvIDMyICQoKCA0PigyKzMpID8gMSA6IDMyKSkKK2VjaG8gMSAkKCggNDwoMiszKSA/IDEgOiAzMikpCitlY2hvIDEgJCgoICgyKzIpPCgyKzMpID8gMSA6IDMyKSkKK2VjaG8gMzIgJCgoICgyKzIpPigyKzMpID8gMSA6IDMyKSkKKworIyBjaGVjayB0aGF0IHRoZSB1bmV2YWx1YXRlZCBwYXJ0IG9mIHRoZSB0ZXJuYXJ5IG9wZXJhdG9yIGRvZXMgbm90IGRvCisjIGV2YWx1YXRpb24gb3IgYXNzaWdubWVudAoreD1pKz0yCit5PWorPTIKKyNhc2gjIGRlY2xhcmUgLWkgaT0xIGo9MQorICAgICAgaT0xCisgICAgICBqPTEKK2VjaG8gMjAgJCgoMSA/IDIwIDogKHgrPTIpKSkKKyNhc2gjIGVjaG8gJGksJHggICAgICAgICAgICAgIyBhc2ggbWlzaGFuZGxlcyB0aGlzCitlY2hvIDMwICQoKDAgPyAoeSs9MikgOiAzMCkpCisjYXNoIyBlY2hvICRqLCR5ICAgICAgICAgICAgICMgYXNoIG1pc2hhbmRsZXMgdGhpcworCit4PWkrPTIKK3k9ais9MgorI2FzaCMgZGVjbGFyZSAtaSBpPTEgaj0xCisgICAgICBpPTEKKyAgICAgIGo9MQorZWNobyAyMCAkKCgxID8gMjAgOiAoeCs9MikpKQorI2FzaCMgZWNobyAkaSwkeCAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKK2VjaG8gMzAgJCgoMCA/ICh5Kz0yKSA6IDMwKSkKKyNhc2gjIGVjaG8gJGksJHkgICAgICAgICAgICAgIyBhc2ggbWlzaGFuZGxlcyB0aGlzCisKKyMgY2hlY2sgcHJlY2VkZW5jZSBvZiBhc3NpZ25tZW50IHZzLiBjb25kaXRpb25hbCBvcGVyYXRvcgorIyBzaG91bGQgYmUgYW4gZXJyb3IKKyNhc2gjIGRlY2xhcmUgLWkgeD0yCisgICAgICB4PTIKKyNhc2hub3RlIyBiYXNoIHJlcG9ydHMgZXJyb3IgYnV0IGNvbnRpbnVlcywgYXNoIGFib3J0cyAtIHVzaW5nIHN1YnNoZWxsIHRvICdlbXVsYXRlJyBiYXNoOgorKCAgeT0kKCgxID8gMjAgOiB4Kz0yKSkgICkKKworIyBjaGVjayBwcmVjZWRlbmNlIG9mIGFzc2lnbm1lbnQgdnMuIGNvbmRpdGlvbmFsIG9wZXJhdG9yCisjYXNoIyBkZWNsYXJlIC1pIHg9MgorICAgICAgeD0yCisjIGFzaCBzYXlzICJsaW5lIE5OTjogc3ludGF4IGVycm9yOiAwID8geCs9MiA6IDIwIgorI2FzaCMgZWNobyAyMCAkKCgwID8geCs9MiA6IDIwKSkKKworIyBhc3NvY2lhdGl2aXR5IG9mIGFzc2lnbm1lbnQtb3BlcmF0b3Igb3BlcmF0b3IKKyNhc2gjIGRlY2xhcmUgLWkgaT0xIGo9MiBrPTMKK2k9MQoraj0yCitrPTMKK2VjaG8gNiAkKChpICs9IGogKz0gaykpCitlY2hvIDYsNSwzICRpLCRqLCRrCisKKyMgb2N0YWwsIGhleAorZWNobyAyNjMgJCgoIDB4MTAwIHwgMDA3ICkpCitlY2hvIDI1NSAkKCggMHhmZiApKQorI2FzaCMgZWNobyAyNTUgJCgoIDE2I2ZmICkpCisjYXNoIyBlY2hvIDEyNyAkKCggMTYjRkYvMiApKQorI2FzaCMgZWNobyAzNiAkKCggOCM0NCApKQorCitlY2hvIDQwICQoKCA4IF4gMzIgKSkKKworI2FzaCMgIyBvdGhlciBiYXNlcworI2FzaCMgZWNobyAxMCAkKCggMTYjYSApKQorI2FzaCMgZWNobyAxMCAkKCggMzIjYSApKQorI2FzaCMgZWNobyAxMCAkKCggNTYjYSApKQorI2FzaCMgZWNobyAxMCAkKCggNjQjYSApKQorI2FzaCMKKyNhc2gjIGVjaG8gMTAgJCgoIDE2I0EgKSkKKyNhc2gjIGVjaG8gMTAgJCgoIDMyI0EgKSkKKyNhc2gjIGVjaG8gMzYgJCgoIDU2I0EgKSkKKyNhc2gjIGVjaG8gMzYgJCgoIDY0I0EgKSkKKyNhc2gjCisjYXNoIyBlY2hvIDYyICQoKCA2NCNAICkpCisjYXNoIyBlY2hvIDYzICQoKCA2NCNfICkpCisKKyNhc2gjICMgd2VpcmQgYmFzZXMgKGVycm9yKQorI2FzaCMgZWNobyAkKCggMzQyNSM1NiApKQorCisjYXNoIyAjIG1pc3NpbmcgbnVtYmVyIGFmdGVyIGJhc2UKKyNhc2gjIGVjaG8gMCAkKCggMiMgKSkKKworIyB0aGVzZSBzaG91bGQgZ2VuZXJhdGUgZXJyb3JzCisoICBlY2hvICQoKCA3ID0gNDMgKSkgICAgICApCisjYXNoIyBlY2hvICQoKCAyIzQ0ICkpCisoICBlY2hvICQoKCA0NCAvIDAgKSkgICAgICApCisoICBsZXQgJ2p2ICs9ICRpdicgICAgICAgICApCisoICBlY2hvICQoKCBqdiArPSBcJGl2ICkpICApCisoICBsZXQgJ3J2ID0gNyArICg0MyAqIDYnICApCisKKyNhc2gjICMgbW9yZSBlcnJvcnMKKyNhc2gjIGRlY2xhcmUgLWkgaQorI2FzaCMgaT0wIzQKKyNhc2gjIGk9MiMxMTAjMTEKKworKChlY2hvIGFiYzsgZWNobyBkZWY7KTsgZWNobyBnaGkpCisKKyNhc2gjIGlmICgoKDQrNCkgKyAoNCArIDcpKSk7IHRoZW4KKyNhc2gjIAllY2hvIG9rCisjYXNoIyBmaQorCisjYXNoIyAoKCkpCSMgbWFrZSBzdXJlIHRoZSBudWxsIGV4cHJlc3Npb24gd29ya3MgT0sKKworI2FzaCMgYT0oMCAyIDQgNikKKyNhc2gjIGVjaG8gNiAkKCggYVsxXSArIGFbMl0gKSkKKyNhc2gjIGVjaG8gMSAkKCggKGFbMV0gKyBhWzJdKSA9PSBhWzNdICkpCisjYXNoIyAoKCAoYVsxXSArIGFbMl0pID09IGFbM10gKSkgOyBlY2hvIDAgJD8KKworIyB0ZXN0IHB1c2hpbmcgYW5kIHBvcHBpbmcgdGhlIGV4cHJlc3Npb24gc3RhY2sKK3Vuc2V0IEEKK0E9IjQgKyAiCisoICBlY2hvIEEgJCgoICggNCArIEEgKSArIDQgKSkgICkKK0E9IjMgKyA1IgorZWNobyAxNiAkKCggKCA0ICsgQSApICsgNCApKQorCisjIGJhZGx5LWZvcm1lZCBjb25kaXRpb25hbCBleHByZXNzaW9ucworKCAgZWNobyAkKCggNCA/IDogJEEgKSkgICkKKyggIGVjaG8gJCgoIDEgPyAyMCApKSAgICApCisoICBlY2hvICQoKCA0ID8gMjAgOiApKSAgKQorCisjIHByZWNlZGVuY2UgYW5kIHNob3J0LWNpcmN1aXQgZXZhbHVhdGlvbgorQj05CitlY2hvIDkgJEIKKworIyBlcnJvcgorKCAgZWNobyAkKCggMCAmJiBCPTQyICkpOyBlY2hvIDkgJEIgICkKKworIyBlcnJvcgorKCAgZWNobyAkKCggMSB8fCBCPTg4ICkpOyBlY2hvIDkgJEIgICkKKworIyBhc2ggbWlzdGFrZW5seSBldmFsdWF0ZXMgQj0uLi4gYmVsb3cKKyNhc2gjIGVjaG8gMCAkKCggMCAmJiAoQj00MikgKSkKK2VjaG8gOSAkQgorI2FzaCMgZWNobyAwICQoKCAoJHskfSAtICQkKSAmJiAoQj00MikgKSkKK2VjaG8gOSAkQgorI2FzaCMgZWNobyAxICQoKCAxIHx8IChCPTg4KSApKQorZWNobyA5ICRCCisKKworIyB1bnRpbCBjb21tYW5kIHdpdGggKCggKSkgY29tbWFuZAoreD03CisKK2VjaG8gNyAkeAorI2FzaCMgdW50aWwgKCggeCA9PSA0ICkpCisgICAgICB1bnRpbCB0ZXN0ICIkeCIgPSA0CitkbworCWVjaG8gJHgKKwl4PTQKK2RvbmUKKworZWNobyA0ICR4CisKKyMgZXhwb25lbnRpYXRpb24KK2VjaG8gMzI3NjcgJCgoIDIqKjE1IC0gMSkpCitlY2hvIDMyNzY4ICQoKCAyKiooMTYtMSkpKQorZWNobyAxMzEwNzIgJCgoIDIqKjE2KjIgKSkKK2VjaG8gMjE0NzQ4MzY0NyAkKCggMioqMzEtMSkpCitlY2hvIDEgJCgoIDIqKjAgKSkKKworIyB7cHJlLHBvc3R9LXtpbmMsZGVjfXJlbWVudCBhbmQgYXNzb2NpYXRlZCBlcnJvcnMKKworeD00CisKK2VjaG8gNCAkeAorZWNobyA0ICQoKCB4KysgKSkKK2VjaG8gNSAkeAorZWNobyA1ICQoKCB4LS0gKSkKK2VjaG8gNCAkeAorCitlY2hvIDMgJCgoIC0teCApKQorZWNobyAzICR4CisKK2VjaG8gNCAkKCggKyt4ICkpCitlY2hvIDQgJHgKKworIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0ICsrNyBpcyA3CisjYXNoIyBlY2hvIDcgJCgoICsrNyApKQorKCAgZWNobyAkKCggNy0tICkpICAgICkKKworKCAgZWNobyAkKCggLS14PTcgKSkgICkKKyggIGVjaG8gJCgoICsreD03ICkpICApCisKKyggIGVjaG8gJCgoIHgrKz03ICkpICApCisoICBlY2hvICQoKCB4LS09NyApKSAgKQorCitlY2hvIDQgJHgKKworZWNobyA3ICQoKCArNyApKQorZWNobyAtNyAkKCggLTcgKSkKKworIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0ICsrNyBpcyA3CisjYXNoIyBlY2hvICQoKCArKzcgKSkKKyNhc2gjIGVjaG8gJCgoIC0tNyApKQorCiske1RISVNfU0h9IC4vYXJpdGgxLnN1YgorJHtUSElTX1NIfSAuL2FyaXRoMi5zdWIKKworeD00Cit5PTcKKworI2FzaCMgKCggeD04ICwgeT0xMiApKQorICAgICAgeD04CisgICAgICB5PTEyCitlY2hvICR4ICR5CisKKyNhc2gjICMgc2hvdWxkIGJlIGFuIGVycm9yCisjYXNoIyAoKCB4PTkgeT00MSApKQorCisjIFRoZXNlIGFyZSBlcnJvcnMKK3Vuc2V0IGIKKyggIGVjaG8gJCgoYSBiKSkgICkKKyNhc2gjICgoYSBiKSkKKworbj00MgorcHJpbnRmICIlZFxuIiAkbgorcHJpbnRmICIlaVxuIiAkbgorI2FzaCMgZWNobyAkKCggOCMkKHByaW50ZiAiJW9cbiIgJG4pICkpCitwcmludGYgIiV1XG4iICRuCisjYXNoIyBlY2hvICQoKCAxNiMkKHByaW50ZiAiJXhcbiIgJG4pICkpCisjYXNoIyBlY2hvICQoKCAxNiMkKHByaW50ZiAiJVhcbiIgJG4pICkpCisKKyMgY2F1c2VzIGxvbmdqbXAgYm90Y2hlcyB0aHJvdWdoIGJhc2gtMi4wNWIKK2FbYltjXWRdPWUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aDEuc3ViIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoMS5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODBhYTk5OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aDEuc3ViCkBAIC0wLDAgKzEsNDAgQEAKKyMgdGVzdCBvZiByZWRvbmUgcG9zdC1pbmNyZW1lbnQgYW5kIHBvc3QtZGVjcmVtZW50IGNvZGUKKyggIGVjaG8gJCgoIDQtLSApKSAgICkKKyggIGVjaG8gJCgoIDQrKyApKSAgICkKKyggIGVjaG8gJCgoIDQgLS0gKSkgICkKKyggIGVjaG8gJCgoIDQgKysgKSkgICkKKworI2FzaCMgKCggYXJyYXlbMF0rKyApKQorI2FzaCMgZWNobyAke2FycmF5fQorCisjYXNoIyAoKCBhcnJheVswXSArKyApKQorI2FzaCMgZWNobyAke2FycmF5fQorCisjYXNoIyAoKCBhKysgKSkKKyNhc2gjIGVjaG8gJGEKKyNhc2gjICgoIGEgKysgKSkKKyNhc2gjIGVjaG8gJGEKKyAgICAgIGE9MgorCitlY2hvIDYgJCgoIGEgKysgKyA0ICkpCitlY2hvIDMgJGEKKworZWNobyA3ICQoKCBhKysrNCApKQorZWNobyA0ICRhCisKK2VjaG8gMCAkKCggYS0tLTQgKSkKK2VjaG8gMyAkYQorCitlY2hvIDcgJCgoIGEgLS0gKyA0ICkpCitlY2hvIDIgJGEKKworZWNobyAtMiAkKCggYSAtLSAtIDQgKSkKK2VjaG8gMSAkYQorCisjYXNoIyAoKCArKyArIDcgKSkKKworI2FzaCMgKCggKysgKSkKKyggIGVjaG8gJCgoICsrKzcgKSkgICkKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCArKyArNyBpcyA3CisjYXNoIyBlY2hvICQoKCArKyArIDcgKSkKKyNhc2gjICgoIC0tICkpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgyLnN1YiBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aDIuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3ZTNjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgyLnN1YgpAQCAtMCwwICsxLDU3IEBACisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKys3IGlzIDcgZXRjCisoICBlY2hvICQoKCAtLTcgKSkgICApCisoICBlY2hvICQoKCArKzcgKSkgICApCisoICBlY2hvICQoKCAtLSA3ICkpICApCisoICBlY2hvICQoKCArKyA3ICkpICApCisKKyNhc2gjICgoKythcnJheVswXSApKQorI2FzaCMgZWNobyAxICRhcnJheQorI2FzaCMgKCggKysgYXJyYXlbMF0gKSkKKyNhc2gjIGVjaG8gMiAkYXJyYXkKKworI2FzaCMgKCggKythICkpCisjYXNoIyBlY2hvIDEgJGEKKyNhc2gjICgoICsrIGEgKSkKKyNhc2gjIGVjaG8gMiAkYQorCisjYXNoIyAoKCAtLWEgKSkKKyNhc2gjIGVjaG8gMSAkYQorI2FzaCMgKCggLS0gYSApKQorI2FzaCMgZWNobyAwICRhCisgICAgICBhPTAKKworZWNobyA1ICQoKCA0ICsgKythICkpCitlY2hvIDEgJGEKKworIyBhc2ggZG9lc24ndCBoYW5kbGUgaXQgcmlnaHQuLi4KKyNhc2gjIGVjaG8gNiAkKCggNCsrK2EgKSkKKyNhc2gjIGVjaG8gMiAkYQorICAgICAgYT0yCisKKyMgYXNoIGRvZXNuJ3QgaGFuZGxlIGl0IHJpZ2h0Li4uCisjYXNoIyBlY2hvIDMgJCgoIDQtLS1hICkpCisjYXNoIyBlY2hvIDEgJGEKKyAgICAgIGE9MQorCitlY2hvIDQgJCgoIDQgLSAtLSBhICkpCitlY2hvIDAgJGEKKworI2FzaCMgKCggLS0gKSkKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCAtLS03IGlzIC03CisjYXNoIyBlY2hvICQoKCAtLS03ICkpCisoICBlY2hvICQoKCAtLSAtIDcgKSkgICkKKworI2FzaCMgKCggKysgKSkKKyMgYmFzaCAzLjI6IDcKKyNhc2gjIGVjaG8gNyAkKCggKys3ICkpCisoICBlY2hvICQoKCArKyArIDcgKSkgICkKKworIyBiYXNoIDMuMjogLTcKKyNhc2gjIGVjaG8gLTcgJCgoICsrLTcgKSkKKyMgYmFzaCAzLjI6IC03CisjYXNoIyBlY2hvIC03ICQoKCArKyAtIDcgKSkKKworIyBiYXNoIDMuMjogNworI2FzaCMgZWNobyA3ICQoKCArLS03ICkpCisjIGJhc2ggMy4yOiA3CisjYXNoIyBlY2hvIDcgJCgoIC0tICsgNyApKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWhlcmVkb2MvaGVyZWRvYy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMTE1MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MucmlnaHQKQEAgLTAsMCArMSwyMSBAQAordGhlcmUKK29uZSAtIGFscGhhCit0d28gLSBiZXRhCit0aHJlZSAtIGdhbW1hCitoaVwKK3RoZXJlJGEKK3N0dWZmCitoaVwKK3RoZXJlCitFT1wKK0YKK2hpCit0YWIgMQordGFiIDIKK3RhYiAzCithYmMKK2RlZiBnaGkKK2prbCBtbm8KK2ZmZiBpcyBhIHNoZWxsIGZ1bmN0aW9uCitoaQordGhlcmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtaGVyZWRvYy9oZXJlZG9jLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzY2RjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtaGVyZWRvYy9oZXJlZG9jLnRlc3RzCkBAIC0wLDAgKzEsOTQgQEAKKyMgY2hlY2sgb3JkZXIgYW5kIGNvbnRlbnQgb2YgbXVsdGlwbGUgaGVyZSBkb2NzCisKK2NhdCA8PCBFT0YxIDw8IEVPRjIKK2hpCitFT0YxCit0aGVyZQorRU9GMgorCit3aGlsZSByZWFkIGxpbmUxOyBkbworCXJlYWQgbGluZTIgPCYzCisJZWNobyAkbGluZTEgLSAkbGluZTIKK2RvbmUgPDxFT0YxIDM8PEVPRjIKK29uZQordHdvCit0aHJlZQorRU9GMQorYWxwaGEKK2JldGEKK2dhbW1hCitFT0YyCisKKworIyBjaGVjayBxdW90ZWQgaGVyZS1kb2MgaXMgcHJvdGVjdGVkCisKK2E9Zm9vCitjYXQgPDwgJ0VPRicKK2hpXAordGhlcmUkYQorc3R1ZmYKK0VPRgorCisjIGNoZWNrIHRoYXQgcXVvdGVkIGhlcmUtZG9jdW1lbnRzIGRvbid0IGhhdmUgXG5ld2xpbmUgcHJvY2Vzc2luZyBkb25lCisKK2NhdCA8PCAnRU9GJworaGlcCit0aGVyZQorRU9cCitGCitFT0YKK3RydWUKKworIyBjaGVjayB0aGF0IFxuZXdsaW5lIGlzIHJlbW92ZWQgYXQgc3RhcnQgb2YgaGVyZS1kb2MKK2NhdCA8PCBFT1wKK0YKK2hpCitFT0YKKworI2FzaCMgIyBjaGVjayB0aGF0IFxuZXdsaW5lIHJlbW92YWwgd29ya3MgZm9yIGhlcmUtZG9jIGRlbGltaXRlcgorI2FzaCMgY2F0IDw8IEVPRgorI2FzaCMgaGkKKyNhc2gjIEVPXAorI2FzaCMgRgorCisjIGNoZWNrIG9wZXJhdGlvbiBvZiB0YWIgcmVtb3ZhbCBpbiBoZXJlIGRvY3VtZW50cworY2F0IDw8LSBFT0YKKwl0YWIgMQorCXRhYiAyCisJdGFiIDMKKwlFT0YKKworIyBjaGVjayBhcHBlbmRpbmcgb2YgdGV4dCB0byBmaWxlIGZyb20gaGVyZSBkb2N1bWVudAorcm0gLWYgL3RtcC9iYXNoLXp6egorY2F0ID4gL3RtcC9iYXNoLXp6eiA8PCBFT0YKK2FiYworRU9GCitjYXQgPj4gL3RtcC9iYXNoLXp6eiA8PCBFT0YKK2RlZiBnaGkKK2prbCBtbm8KK0VPRgorY2F0IC90bXAvYmFzaC16enoKK3JtIC1mIC90bXAvYmFzaC16enoKKworIyBtYWtlIHN1cmUgY29tbWFuZCBwcmludGluZyBwdXRzIHRoZSBoZXJlLWRvY3VtZW50IGFzIHRoZSBsYXN0IHJlZGlyZWN0aW9uCisjIG9uIHRoZSBsaW5lLCBhbmQgdGhlIGZ1bmN0aW9uIGV4cG9ydCBjb2RlIHByZXNlcnZlcyBzeW50YWN0aWMgY29ycmVjdG5lc3MKK2ZmZigpCit7CisgIGVkIC90bXAvZm9vIDw8RU5ET0ZJTlBVVCA+L2Rldi9udWxsCisvXm5hbWUvZAordworcQorRU5ET0ZJTlBVVAorYWE9MQorfQorCit0eXBlIGZmZgorI2FzaCMgZXhwb3J0IC1mIGZmZgorI2FzaCMgJHtUSElTX1NIfSAtYyAndHlwZSBmZmYnCisKKyMgY2hlY2sgdGhhdCBlbmQgb2YgZmlsZSBkZWxpbWl0cyBhIGhlcmUtZG9jdW1lbnQKKyMgVEhJUyBNVVNUIEJFIExBU1QhCisKK2NhdCA8PCBFT0YKK2hpCit0aGVyZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWludmVydC9pbnZlcnQucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtaW52ZXJ0L2ludmVydC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkyMzlhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWludmVydC9pbnZlcnQucmlnaHQKQEAgLTAsMCArMSwxMCBAQAorMQorMQorMQorMAorMAorMQorMAorMQorMAorMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWludmVydC9pbnZlcnQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtaW52ZXJ0L2ludmVydC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MzkzZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLWludmVydC9pbnZlcnQudGVzdHMKQEAgLTAsMCArMSwxOSBAQAorIyB0ZXN0cyBvZiByZXR1cm4gdmFsdWUgaW52ZXJzaW9uCisjIHBsYWNlaG9sZGVyIGZvciBmdXR1cmUgZXhwYW5zaW9uCisKKyMgdXNlciBzdWJzaGVsbHMgKC4uLikgZGlkIHRoaXMgd3JvbmcgaW4gYmFzaCB2ZXJzaW9ucyBiZWZvcmUgMi4wNAorCishICggZWNobyBoZWxsbyB8IGdyZXAgaCA+L2Rldi9udWxsIDI+JjEgKTsgZWNobyAkPworISBlY2hvIGhlbGxvIHwgZ3JlcCBoID4vZGV2L251bGwgMj4mMSA7IGVjaG8gJD8KKworISB0cnVlIDsgZWNobyAkPworISBmYWxzZTsgZWNobyAkPworCishIChmYWxzZSkgOyBlY2hvICQ/CishICh0cnVlKTsgZWNobyAkPworCishIHRydWUgfCBmYWxzZSA7IGVjaG8gJD8KKyEgZmFsc2UgfCB0cnVlIDsgZWNobyAkPworCishICh0cnVlIHwgZmFsc2UpIDsgZWNobyAkPworISAoZmFsc2UgfCB0cnVlKSA7IGVjaG8gJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTFhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorYXNoOiB3cml0ZSBlcnJvcjogQnJva2VuIHBpcGUKK09rOiAxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvZWNob193cml0ZV9lcnJvci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQwYzlmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvZWNob193cml0ZV9lcnJvci50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK3RyYXAgIiIgUElQRQorCit7CitzbGVlcCAxCitlY2hvIENhbnQgd3JpdGUgdGhpcyAtIGdldCBFUElQRQorZWNobyBPazogJD8gPiYyCit9IHwgeyB0cnVlOyB9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9sYXN0X2FtcC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xhc3RfYW1wLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTIxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9sYXN0X2FtcC5yaWdodApAQCAtMCwwICsxLDIgQEAKKzMKK0VuZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbGFzdF9hbXAudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9sYXN0X2FtcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNjA5Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbGFzdF9hbXAudGVzdHMKQEAgLTAsMCArMSw4IEBACiskVEhJU19TSCAtYyAnZWNobyAzJicKK2Q9YGRhdGVgCit3aGlsZSB0ZXN0ICJgZGF0ZWAiID0gIiRkIjsgZG8gdHJ1ZTsgZG9uZQorZDE9YGRhdGVgCiskVEhJU19TSCAtYyAnc2xlZXAgMSYnCitkMj1gZGF0ZWAKK3Rlc3QgIiRkMSIgPSAiJGQyIiB8fCBlY2hvIEJBRAorZWNobyBFbmQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL251bGx0aWNrMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL251bGx0aWNrMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBiODIwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbnVsbHRpY2sxLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorVGVzdCAxCitUZXN0IDIKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL251bGx0aWNrMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL251bGx0aWNrMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mODE5MjNkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbnVsbHRpY2sxLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZWNobyBUZXN0IGAgYCAxCitlY2hvIFRlc3QgYDwvZGV2L251bGxgIDIKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc2hpZnQxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc2hpZnQxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzQ1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zaGlmdDEucmlnaHQKQEAgLTAsMCArMSw5IEBACisyIDMgNAorMDogc2hpZnQ6IGxpbmUgMTogSWxsZWdhbCBudW1iZXI6IC0xCisxIDIgMyA0CisyIDMgNAorMyA0Cis0CisKKzEgMiAzIDQKKzEgMiAzIDQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NoaWZ0MS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NoaWZ0MS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOTkyZDliCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc2hpZnQxLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKKyRUSElTX1NIIC1jICdzaGlmdDsgICAgZWNobyAiJEAiJyAwIDEgMiAzIDQKKyNXZSBkbyBhYm9ydCBvbiAtMSwgYnV0IHRoZW4gd2UgYWJvcnQuIGJhc2ggZXhlY3V0ZXMgZWNoby4KKyRUSElTX1NIIC1jICdzaGlmdCAtMTsgZWNobyAiJEAiJyAwIDEgMiAzIDQKKyRUSElTX1NIIC1jICdzaGlmdCAgMDsgZWNobyAiJEAiJyAwIDEgMiAzIDQKKyRUSElTX1NIIC1jICdzaGlmdCAgMTsgZWNobyAiJEAiJyAwIDEgMiAzIDQKKyRUSElTX1NIIC1jICdzaGlmdCAgMjsgZWNobyAiJEAiJyAwIDEgMiAzIDQKKyRUSElTX1NIIC1jICdzaGlmdCAgMzsgZWNobyAiJEAiJyAwIDEgMiAzIDQKKyRUSElTX1NIIC1jICdzaGlmdCAgNDsgZWNobyAiJEAiJyAwIDEgMiAzIDQKKyRUSElTX1NIIC1jICdzaGlmdCAgNTsgZWNobyAiJEAiJyAwIDEgMiAzIDQKKyRUSElTX1NIIC1jICdzaGlmdCAgNjsgZWNobyAiJEAiJyAwIDEgMiAzIDQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjdjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UxLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorU291cmNlZCBvaworRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTJlNzViMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTEudGVzdHMKQEAgLTAsMCArMSw1IEBACitlY2hvICJlY2hvIFNvdXJjZWQgb2siID4uLi9zb3VyY2VkLnNoCitQQVRIPSIuLjokUEFUSCIKKy4gc291cmNlZC5zaAorcm0gLi4vc291cmNlZC5zaAorZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcxNzFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMi5yaWdodApAQCAtMCwwICsxIEBACitEb25lOiAwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODcwY2RmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMi50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2ZhbHNlCisuIC9kZXYvbnVsbAorZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3JlcGxfc2xhc2hfYmFzaDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfcmVwbF9zbGFzaF9iYXNoMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjEyYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3JlcGxfc2xhc2hfYmFzaDEucmlnaHQKQEAgLTAsMCArMSwxMCBAQAorMTkyXC4xNjhcLjBcLjEKKzE5MlwuMTY4XC4wXC4xWworMTkyXC4xNjhcLjBcLjFbCisxOTJcXC4xNjhcXC4wXFwuMVsKKzE5MlwuMTY4XC4wXC4xWworMTkyXC4xNjhcLjBcLjEKKzE5MlwuMTY4XC4wXC4xWworMTkyXC4xNjhcLjBcLjFbCisxOTJcXC4xNjhcXC4wXFwuMVsKKzE5MlwuMTY4XC4wXC4xWwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3JlcGxfc2xhc2hfYmFzaDEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfcmVwbF9zbGFzaF9iYXNoMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmEyZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3JlcGxfc2xhc2hfYmFzaDEudGVzdHMKQEAgLTAsMCArMSwyMSBAQAorIyBUaGUgYnVnIGhlcmUgd2FzIHRyaWdnZXJlZCBieToKKyMgKiBwZXJmb3JtaW4gcGF0aG5hbWUgZXhwYW5zaW9uIGJlY2F1c2Ugd2Ugc2VlIFsKKyMgKiByZXBsYWNlIG9wZXJhdG9yIGRpZCBub3QgZXNjYXBlIFwgaW4gcmVwbGFjZSBzdHJpbmcKKworSVA9MTkyLjE2OC4wLjEKKworcm0gLWYgJzE5Mi4xNjguMC4xWycKK2VjaG8gIiR7SVAvLy4vXFwufSIKK2VjaG8gIiR7SVAvLy4vXFwufSInWycgIyBidWcgd2FzIGhlcmUKK2VjaG8gIiR7SVAvLy4vXFwufVsiICAgIyBidWcgd2FzIGhlcmUKK2VjaG8gIiR7SVAvLy4vXFxcXC59WyIgIyBidWcgd2FzIGhlcmUKK2VjaG8gIjE5MlwuMTY4XC4wXC4xWyIKKworZWNobyA+JzE5Mi4xNjguMC4xWycKK2VjaG8gIiR7SVAvLy4vXFwufSIKK2VjaG8gIiR7SVAvLy4vXFwufSInWycgIyBidWcgd2FzIGhlcmUKK2VjaG8gIiR7SVAvLy4vXFwufVsiICAgIyBidWcgd2FzIGhlcmUKK2VjaG8gIiR7SVAvLy4vXFxcXC59WyIgIyBidWcgd2FzIGhlcmUKK2VjaG8gIjE5MlwuMTY4XC4wXC4xWyIKKworcm0gLWYgJzE5Mi4xNjguMC4xWycKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9zcXVvdGVfYmFzaDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfc3F1b3RlX2Jhc2gxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTM2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfc3F1b3RlX2Jhc2gxLnJpZ2h0CkBAIC0wLDAgKzEsOSBAQAorYQliCithCitiIGMKK2RlZgorYSdiIGMiZCBlXGYKK2EzYiBjM2IgZTMzZgorYVw4MGIgYzA4YgorYTNiIGMzMGIKK3gJeQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3NxdW90ZV9iYXNoMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9zcXVvdGVfYmFzaDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTNhNTZjYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9zcXVvdGVfYmFzaDEudGVzdHMKQEAgLTAsMCArMSw3IEBACitlY2hvICQnYVx0YicKK2VjaG8gJCdhXG5iJyAkJ2NcbmQnJ2VmJworZWNobyAkJ2FcJ2InICQnY1wiZCcgJCdlXFxmJworZWNobyAkJ2FcNjNiJyAkJ2NcMDYzYicgJCdlXDA2MzNmJworZWNobyAkJ2FcODBiJyAkJ2NcNjA4YicKK2VjaG8gJCdhXHgzM2InICQnY1x4MzMwYicKK2VjaG8gJCd4XHg5eScKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfUkVQTFkucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX1JFUExZLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjVkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX1JFUExZLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAordGVzdCAxOiB8ICBhYmMxICBkZWYgIHwKK3Rlc3QgMjogfCAgXGFiYzIgIGRcZWYgIHwKK3Rlc3QgMzogfGFiYzMgIGRlZnwKK3Rlc3QgNDogfFxhYmM0ICBkXGVmfAorRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9SRVBMWS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfUkVQTFkudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmEyMGNhZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfUkVQTFkudGVzdHMKQEAgLTAsMCArMSw1IEBACitlY2hvICcgIFxhYmMxICBkXGVmICAnIHwgKCByZWFkICAgICAgICAgOyBlY2hvICJ0ZXN0IDE6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmMyICBkXGVmICAnIHwgKCByZWFkIC1yICAgICAgOyBlY2hvICJ0ZXN0IDI6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmMzICBkXGVmICAnIHwgKCByZWFkICAgIFJFUExZOyBlY2hvICJ0ZXN0IDM6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmM0ICBkXGVmICAnIHwgKCByZWFkIC1yIFJFUExZOyBlY2hvICJ0ZXN0IDQ6IHwkUkVQTFl8IiApCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfaWZzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9pZnMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyMzM0NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfaWZzLnJpZ2h0CkBAIC0wLDAgKzEsMTAgQEAKK3Rlc3QgMTogLmEuIC5iLiAuYy4KK3Rlc3QgMjogLmEuIC5iLiAuYy4KK3Rlc3QgMzogLmEuIC4uIC5iLGMuCit0ZXN0IDQ6IC5hLiAuLiAuYixjLgordGVzdCA1OiAuYS4gLi4gLmMuCit0ZXN0IDY6IC5hLiAuLiAuYy4gLmQuCit0ZXN0IDc6IC5hLiAuLiAuYixjLGQgICwgICwuCit0ZXN0IDg6IC4uIC5hLiAuYi4gLmMuCit0ZXN0IDk6IC5hLiAuYi4gLmMuIC4uCit0ZXN0IEE6IC4uIC5hLiAuLiAuYi4gLmMuCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX2lmcy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfaWZzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlODMxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX2lmcy50ZXN0cwpAQCAtMCwwICsxLDEwIEBACitwcmludGYgJ2FcdFx0Ylx0Y1xuJyB8ICggSUZTPSQocHJpbnRmICJcdCIpIHJlYWQgYSBiIGM7ICBlY2hvICJ0ZXN0IDE6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2FcdFx0Ylx0Y1xuJyB8ICggSUZTPSQocHJpbnRmICIgXHQiKSByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDI6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EsLGIsY1xuJyAgICB8ICggSUZTPSIsIiByZWFkIGEgYiBjOyAgZWNobyAidGVzdCAzOiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdhLCxiLGNcbicgICAgfCAoIElGUz0iICwiIHJlYWQgYSBiIGM7IGVjaG8gInRlc3QgNDogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYSAsLCBjXG4nICAgIHwgKCBJRlM9IiAsIiByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDU6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EgLCwgYyBkXG4nICB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYyBkOyAgICAgZWNobyAidGVzdCA2OiAuJGEuIC4kYi4gLiRjLiAuJGQuIiApCitwcmludGYgJyBhLCxiLGMsZCAgLCAgLFxuJyB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYzsgZWNobyAidGVzdCA3OiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdcdCxcdGFcdCxcdGJcdGMnICAgfCAoIElGUz0kKHByaW50ZiAiIFx0LCIpIHJlYWQgYSBiIGMgZDsgICBlY2hvICJ0ZXN0IDg6IC4kYS4gLiRiLiAuJGMuIC4kZC4iICkKK3ByaW50ZiAnXHRcdGFcdCxcdGJcdGMnICAgIHwgKCBJRlM9JChwcmludGYgIiBcdCwiKSByZWFkIGEgYiBjIGQ7ICAgZWNobyAidGVzdCA5OiAuJGEuIC4kYi4gLiRjLiAuJGQuIiApCitwcmludGYgJ1x0LFx0YVx0LCxcdGJcdGMnICB8ICggSUZTPSQocHJpbnRmICIgXHQsIikgcmVhZCBhIGIgYyBkIGU7IGVjaG8gInRlc3QgQTogLiRhLiAuJGIuIC4kYy4gLiRkLiAuJGUuIiApCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX24ucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4MWFmMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfbi5yaWdodApAQCAtMCwwICsxLDMgQEAKK3Rlc3QKK3RlcwordGVzCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX24udGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTI0MjNiYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfbi50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2VjaG8gJ3Rlc3QnIHwgKHJlYWQgcmVwbHk7IGVjaG8gIiRyZXBseSIpCitlY2hvICd0ZXN0JyB8IChyZWFkIC1uIDMgcmVwbHk7IGVjaG8gIiRyZXBseSIpCitlY2hvICd0ZXN0JyB8IChyZWFkIC1uMyByZXBseTsgZWNobyAiJHJlcGx5IikKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTM2YmY3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9yLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAordGVzdGJlc3QKK3Rlc3RcCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3IudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM0Y2M2MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfci50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2VjaG8gLWUgJ3Rlc3RcXFxuYmVzdCcgfCAocmVhZCByZXBseTsgZWNobyAiJHJlcGx5IikKK2VjaG8gLWUgJ3Rlc3RcXFxuYmVzdCcgfCAocmVhZCAtciByZXBseTsgZWNobyAiJHJlcGx5IikKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfdC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDEyNmNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF90LnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorPjwKKz48Cis+dGVzdDwKKz50ZXN0PApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF90LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF90LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2NWYxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3QudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorIyBiYXNoIDMuMiBvdXRwdXRzOgorCisjID48Cit7IGVjaG8gLW4gJ3RlJzsgc2xlZXAgMjsgZWNobyAnc3QnOyB9ICAgfCAocmVhZCAtdCAxIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCisjID48Cit7ICAgICAgICAgICAgICAgc2xlZXAgMjsgZWNobyAndGVzdCc7IH0gfCAocmVhZCAtdCAxIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCisjID50ZXN0PAoreyBlY2hvIC1uICd0ZSc7IHNsZWVwIDE7IGVjaG8gJ3N0JzsgfSAgIHwgKHJlYWQgLXQgMiByZXBseTsgZWNobyAiPiRyZXBseTwiKQorIyA+dGVzdDwKK3sgICAgICAgICAgICAgICBzbGVlcCAxOyBlY2hvICd0ZXN0JzsgfSB8IChyZWFkIC10IDIgcmVwbHk7IGVjaG8gIj4kcmVwbHk8IikKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE2ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorYXNoOiB3cml0ZSBlcnJvcjogQmFkIGZpbGUgZGVzY3JpcHRvcgorVEVTVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhMWE2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIudGVzdHMKQEAgLTAsMCArMSw2IEBACisjIHRlc3Q6IGNsb3NlZCBmZHMgc2hvdWxkIHN0YXkgY2xvc2VkCitleGVjIDE+Ji0KK2VjaG8gVEVTVCA+VEVTVAorZWNobyBKVU5LICMgbG9zdDogc3Rkb3V0IGlzIGNsb3NlZAorY2F0IFRFU1QgPiYyCitybSBURVNUCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMi5yaWdodApAQCAtMCwwICsxIEBACitPSwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjFjY2VhMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjIudGVzdHMKQEAgLTAsMCArMSw1IEBACisjIGFzaCBvbmNlIGNvdWxkbid0IHJlZGlyZWN0IGFib3ZlIGZkIzkKK2V4ZWMgMT4vZGV2L251bGwKKyhlY2hvIExPU1QxID4mMjIpIDIyPiYxCisoZWNobyBMT1NUMiA+JjIyKSAyMj4mMQorKGVjaG8gT0sgPiYyMikgMjI+JjIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjMucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNjQxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIzLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorVEVTVAorLi9yZWRpcjMudGVzdHM6IGxpbmUgNDogOTogQmFkIGZpbGUgZGVzY3JpcHRvcgorT3V0cHV0IHRvIGZkIzk6IDEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzN2Q1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIzLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorIyByZWRpcmVjdHMgdG8gY2xvc2VkIGRlc2NyaXB0b3JzIHNob3VsZCBub3QgbGVhdmUgdGhlc2UgZGVzY3JpcHRvcnMKKyMgb3BlbiBhZnRlcndhcmRzCitlY2hvIFRFU1QgOT4vZGV2L251bGwKK2VjaG8gTVVTVCBFUlJPUiBPVVQgPiY5CitlY2hvICJPdXRwdXQgdG8gZmQjOTogJD8iCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI0LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNC5yaWdodApAQCAtMCwwICsxIEBACitPSwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGJkZjVhZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjQudGVzdHMKQEAgLTAsMCArMSw3MiBAQAorIyBhc2ggdXNlcyBmZCAxMCAodXN1YWxseSkgZm9yIHJlYWRpbmcgdGhlIHNjcmlwdAorZXhlYyAxMz4mLQorZXhlYyAxMj4mLQorZXhlYyAxMT4mLQorZXhlYyAxMD4mLQorIyBzb21lIGFtb3VudCBvZiBpbnB1dCBpcyBwcmVmZXRjaGVkLgorIyBtYWtlIHN1cmUgZmluYWwgZWNobyBpcyBmYXIgZW5vdWdoIHRvIG5vdCBiZSBwcmVmZXRjaGVkLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitlY2hvICJPSyIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjUucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDg3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI1LnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorLi9yZWRpcjUudGVzdHM6IGxpbmUgMjogMTA6IEJhZCBmaWxlIGRlc2NyaXB0b3IKK09LCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI1LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MWIwYzFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMgYXNoIHVzZXMgZmQgMTAgKHVzdWFsbHkpIGZvciByZWFkaW5nIHRoZSBzY3JpcHQKK2VjaG8gTE9TVCA+JjEwCitlY2hvIE9LCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI2LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDc1NGRmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNi5yaWdodApAQCAtMCwwICsxLDIgQEAKK0hlbGxvCitPSwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzNiNmQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjYudGVzdHMKQEAgLTAsMCArMSwzIEBACisjIHdlIGhhZCBhIGJ1ZyB3aGVyZSB0aGlzIHdvdWxkIGhhbmcKKyhoZWFkIC1uIDEgPHJlZGlyNi5yaWdodCkKK2VjaG8gT0sKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjcucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI3LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzBiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI3LnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorT2sKK09rCitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI3LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTM5NzlhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNy50ZXN0cwpAQCAtMCwwICsxLDEyIEBACisjIENoYXJzIGFib3ZlIDB4N2YgYXJlIHVzZWQgYXMgc3BlY2lhbCBjb2Rlcy4KKyMgMHg4MSBpcyBDVExFU0MgKHNlZSBhc2guYykuCisjIFRoZSBidWcgd2FzIHRoYXQgcXVvdGluZyBhbmQgdW5xdW90aW5nIG9mIHRoZW0KKyMgd2FzIG91dCBvZiBzeW5jIGZvciByZWRpcmVjdCBmaWxlbmFtZXMuCisKKz51bmljb2RlLnNoCitlY2hvIC1lICdlY2hvIE9rID51bmlceDgxY29kZScgPj51bmljb2RlLnNoCitlY2hvIC1lICdjYXQgdW5pXHg4MWNvZGUnID4+dW5pY29kZS5zaAorZWNobyAtZSAnY2F0IHVuaT9jb2RlJyA+PnVuaWNvZGUuc2gKKy4gLi91bmljb2RlLnNoCitybSB1bmkqY29kZSoKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjgucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzMGIwMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjgucmlnaHQKQEAgLTAsMCArMSwzIEBACitPaworT2sKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjgudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI4LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjYjQyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI4LnRlc3RzCkBAIC0wLDAgKzEsMTUgQEAKKyMgQ2hhcnMgYWJvdmUgMHg3ZiBhcmUgdXNlZCBhcyBzcGVjaWFsIGNvZGVzLgorIyAweDgxIGlzIENUTEVTQyAoc2VlIGFzaC5jKS4KKyMgVGhlIGJ1ZyB3YXMgdGhhdCBxdW90aW5nIGFuZCB1bnF1b3Rpbmcgb2YgdGhlbQorIyB3YXMgb3V0IG9mIHN5bmMgZm9yIHJlZGlyZWN0IGZpbGVuYW1lcy4KKworIyBTdWJjYXNlIHdoZW4gcmVkaXJlY3QgZmlsZW5hbWUgaXMgc3BlY2lmaWVkIGluIGEgdmFyaWFibGUuCisKKz51bmljb2RlLnNoCitlY2hvIC1lICd2PXVuaVx4ODFjb2RlJyA+PnVuaWNvZGUuc2gKK2VjaG8gLWUgJ2VjaG8gT2sgPiIkdiInID4+dW5pY29kZS5zaAorZWNobyAtZSAnY2F0IHVuaVx4ODFjb2RlJyA+PnVuaWNvZGUuc2gKK2VjaG8gLWUgJ2NhdCB1bmk/Y29kZScgPj51bmljb2RlLnNoCisuIC4vdW5pY29kZS5zaAorcm0gdW5pKmNvZGUqCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjkucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI5LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI5LnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorT2sKK0RvbmU6MApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjkudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGJlZmE2MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjkudGVzdHMKQEAgLTAsMCArMSw0IEBACitlY2hvIE9rID5maWxlLnRtcAorY2F0IDA8PmZpbGUudG1wCitlY2hvIERvbmU6JD8KK3JtIGZpbGUudG1wCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9yZWFwMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3JlYXAxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjZkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9yZWFwMS5yaWdodApAQCAtMCwwICsxIEBACitPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvcmVhcDEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9yZWFwMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjFhMWY5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvcmVhcDEudGVzdHMKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisKKyMgTXVzdCBub3QgZmluZCB1cyBhbGl2ZQoreyBzbGVlcCAyOyBraWxsIC05ICQkOyB9IDI+L2Rldi9udWxsICYKKworc2xlZXAgMSAmCitQSUQ9JCEKKworIyBXZSBtdXN0IGV4aXQgdGhlIGxvb3AgaW4gb25lIHNlY29uZC4KKyMgV2UgaGFkIGJ1ZyA1MzA0OiBidWlsdGlucyBuZXZlciB3YWl0ZWQgZm9yIGV4aXRlZCBjaGlsZHJlbgord2hpbGUga2lsbCAtMCAkUElEID4vZGV2L251bGwgMj4mMTsgZG8KKyAgICB0cnVlCitkb25lCitlY2hvIE9rCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zYXZldHJhcC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NhdmV0cmFwLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTIyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zYXZldHJhcC5yaWdodApAQCAtMCwwICsxLDggQEAKK3RyYXAgLS0gJ2VjaG8gRXhpdGluZycgRVhJVAordHJhcCAtLSAnZWNobyBXSU5DSCEnIFdJTkNICit0cmFwIC0tICdlY2hvIEV4aXRpbmcnIEVYSVQKK3RyYXAgLS0gJ2VjaG8gV0lOQ0ghJyBXSU5DSAordHJhcCAtLSAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwIC0tICdlY2hvIFdJTkNIIScgV0lOQ0gKK0RvbmUKK0V4aXRpbmcKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NhdmV0cmFwLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2F2ZXRyYXAudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiMzEyZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NhdmV0cmFwLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAordHJhcCAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwICdlY2hvIFdJTkNIIScgU0lHV0lOQ0gKK3Y9YCB0cmFwICAgYAorZWNobyAiJHYiCit2PSQoCXRyYXAgKQorZWNobyAiJHYiCit2PWB0cmFwYAorZWNobyAiJHYiCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ2ludDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWdpbnQxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDk0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWdpbnQxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK1NlbmRpbmcgU0lHSU5UIHRvIG1haW4gc2hlbGwgUElECmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWdpbnQxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnaW50MS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDQ4M2QzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnaW50MS50ZXN0cwpAQCAtMCwwICsxLDQxIEBACisjIFdoYXQgc2hvdWxkIGhhcHBlbiBpZiBub24taW50ZXJhY3RpdmUgc2hlbGwgZ2V0cyBTSUdJTlQ/CisKKyhzbGVlcCAxOyBlY2hvIFNlbmRpbmcgU0lHSU5UIHRvIG1haW4gc2hlbGwgUElEOyBleGVjIGtpbGwgLUlOVCAkJCkgJgorCisjIFdlIGNyZWF0ZSBhIGNoaWxkIHdoaWNoIGV4aXRzIHdpdGggMCBldmVuIG9uIFNJR0lOVAorIyAoVGhlIGNvbXBsZXggY29tbWFuZCBpcyBuZWNlc3Nhcnkgb25seSBpZiBTSUdJTlQgaXMgZ2VuZXJhdGVkIGJ5IF5DLAorIyBpbiB0aGlzIHRlc3RjYXNlIGV2ZW4gYmFyZSAic2xlZXAgMiIgd291bGQgZG8gYmVjYXVzZQorIyBpbiB0aGUgdGVzdGNhc2Ugd2UgZG9uJ3Qgc2VuZCBTSUdJTlQgKnRvIHRoZSBjaGlsZCouLi4pCiskVEhJU19TSCAtYyAndHJhcCAiZXhpdCAwIiBTSUdJTlQ7IHNsZWVwIDInCisKKyMgSW4gb25lIHNlY29uZCwgd2UgKG1haW4gc2hlbGwpIGdldCBTSUdJTlQgaGVyZS4KKyMgVGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgd2Ugc2hvdWxkLCBvciBzaG91bGQgbm90LCBleGl0LgorCisjIGJhc2ggd2lsbCBub3Qgc3RvcCBoZXJlLiBJdCB3aWxsIGV4ZWN1dGUgbmV4dCBjb21tYW5kKHMpLgorCisjIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgaXMgZGVzY3JpYmVkIGhlcmU6CisjIGh0dHA6Ly93d3cuY29ucy5vcmcvY3JhY2F1ZXIvc2lnaW50Lmh0bWwKKyMKKyMgQmFzaWNhbGx5LCBiYXNoIHdpbGwgbm90IGV4aXQgb24gU0lHSU5UIGltbWVkaWF0ZWx5IGlmIGl0IHdhaXRzCisjIGZvciBhIGNoaWxkLiBJdCB3aWxsIHdhaXQgZm9yIHRoZSBjaGlsZCB0byBleGl0LgorIyBJZiBjaGlsZCBleGl0cyBOT1QgYnkgZHlpbmcgb24gU0lHSU5ULCB0aGVuIGJhc2ggd2lsbCBub3QgZXhpdC4KKyMKKyMgVGhlIGlkZWEgaXMgdGhhdCB0aGUgZm9sbG93aW5nIHNjcmlwdDoKKyMgfCBlbWFjcyBmaWxlLnR4dAorIyB8IG1vcmUgY21kcworIyBVc2VyIG1heSB1c2UgXkMgdG8gaW50ZXJydXB0IGVkaXRvcidzIG9wcyBsaWtlIHNlYXJjaC4gQnV0IHRoZW4KKyMgZW1hY3MgZXhpdHMgbm9ybWFsbHkuIFVzZXIgZXhwZWN0cyB0aGF0IHNjcmlwdCBkb2Vzbid0IHN0b3AuCisjCisjIFRoaXMgaXMgYSBuaWNlIGlkZWEsIGJ1dCBkZXRlY3RpbmcgImRpZCBwcm9jZXNzIHJlYWxseSBleGl0CisjIHdpdGggU0lHSU5UPyIgaXMgcmFjeS4gQ29uc2lkZXI6CisjIHwgYmFzaCAtYyAnd2hpbGUgdHJ1ZTsgZG8gL2Jpbi90cnVlOyBkb25lJworIyBXaGVuIF5DIGlzIHByZXNzZWQgd2hpbGUgYmFzaCB3YWl0cyBmb3IgL2Jpbi90cnVlIHRvIGV4aXQsCisjIGl0IG1heSBoYXBwZW4gdGhhdCAvYmluL3RydWUgZXhpdHMgd2l0aCBleGl0Y29kZSAwIGJlZm9yZQorIyBeQyBpcyBkZWxpdmVyZWQgdG8gaXQgYXMgU0lHSU5ULiBiYXNoIHdpbGwgc2VlIFNJR0lOVCwgdGhlbgorIyBpdCB3aWxsIHNlZSB0aGF0IGNoaWxkIGV4aXRlZCB3aXRoIDAsIGFuZCBiYXNoIHdpbGwgTk9UIEVYSVQuCisKKyMgVGhlcmVmb3JlIHdlIGRvIG5vdCBpbXBsZW1lbnQgYmFzaCBiZWhhdmlvci4KKyMgSSdkIHNheSB0aGF0IGVtYWNzIG5lZWQgdG8gcHV0IGl0c2VsZiBpbnRvIGEgc2VwYXJhdGUgcGdycAorIyB0byBpc29sYXRlIHNoZWxsIGZyb20gZ2V0dGluZyBzdHJheSBTSUdJTlRzIGZyb20gXkMuCisKK2VjaG8gTmV4dCBjb21tYW5kIGFmdGVyIFNJR0lOVCB3YXMgZXhlY3V0ZWQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDAzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwxLnJpZ2h0CkBAIC0wLDAgKzEsMjAgQEAKK2dvdCBzaWduYWwKK3RyYXAgLS0gJ2VjaG8gZ290IHNpZ25hbCcgVVNSMQorc2VudCAxIHNpZ25hbAorZ290IHNpZ25hbAord2FpdCBpbnRlcnJ1cHRlZAordHJhcCAtLSAnZWNobyBnb3Qgc2lnbmFsJyBVU1IxCitzZW50IDIgc2lnbmFsCitnb3Qgc2lnbmFsCit3YWl0IGludGVycnVwdGVkCit0cmFwIC0tICdlY2hvIGdvdCBzaWduYWwnIFVTUjEKK3NlbnQgMyBzaWduYWwKK2dvdCBzaWduYWwKK3dhaXQgaW50ZXJydXB0ZWQKK3RyYXAgLS0gJ2VjaG8gZ290IHNpZ25hbCcgVVNSMQorc2VudCA0IHNpZ25hbAorZ290IHNpZ25hbAord2FpdCBpbnRlcnJ1cHRlZAordHJhcCAtLSAnZWNobyBnb3Qgc2lnbmFsJyBVU1IxCitzZW50IDUgc2lnbmFsCitzbGVlcCBjb21wbGV0ZWQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI4YmZjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwxLnRlc3RzCkBAIC0wLDAgKzEsMjggQEAKK3RyYXAgImVjaG8gZ290IHNpZ25hbCIgVVNSMQorCitmb3IgdHJ5IGluIDEgMiAzIDQgNTsgZG8KKyAgICBraWxsIC1VU1IxICQkCisgICAgc2xlZXAgMC4yCisgICAgZWNobyAic2VudCAkdHJ5IHNpZ25hbCIKK2RvbmUgJgorCisjIEVuc3VyZSAid2FpdCIgaGFzIHNvbWV0aGluZyB0byB3YWl0IGZvcgorc2xlZXAgMiAmCisKKyMgRW5zdXJlIHdlIGRvIG5vdCBleGVjdXRlICJ0cmFwIiBiZWxvdyBiZWZvcmUgImtpbGwgLVVTUjEiIGFib3ZlCisjICh3YXMgZ2V0dGluZyBmYWlsdXJlIG9uIGxvYWRlZCBtYWNoaW5lIHdpdGhvdXQgdGhpcykKK3NsZWVwIDAuMQorCitzbGVlcGluZz10cnVlCit3aGlsZSAkc2xlZXBpbmc7IGRvCisgICAgdHJhcAorICAgIGlmIHdhaXQgJSU7IHRoZW4KKyAgICAgICAgZWNobyAic2xlZXAgY29tcGxldGVkIgorICAgICAgICBzbGVlcGluZz1mYWxzZQorICAgIGVsaWYgWyAkPyA9PSAxMjcgXTsgdGhlbgorICAgICAgICBlY2hvICJCVUc6IG5vIHByb2Nlc3NlcyB0byB3YWl0IGZvcj8hIgorICAgICAgICBzbGVlcGluZz1mYWxzZQorICAgIGVsc2UKKyAgICAgICAgZWNobyAid2FpdCBpbnRlcnJ1cHRlZCIKKyAgICBmaQorZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhZjkxOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDIucmlnaHQKQEAgLTAsMCArMSwzIEBACitjaGlsZCBzbGVlcHMKK2NoaWxkIGV4aXRzIGFzIGV4cGVjdGVkCitwYXJlbnQgZXhpdHMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmNjM5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwyLnRlc3RzCkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaAorCiskVEhJU19TSCAtYyAnCitjbGVhbnVwKCkgeworICAgIGVjaG8gImNoaWxkIGV4aXRzIGFzIGV4cGVjdGVkIgorICAgIGV4aXQKK30KK3RyYXAgY2xlYW51cCBIVVAKK2VjaG8gImNoaWxkIHNsZWVwcyIKK3NsZWVwIDEKK2VjaG8gIkJBRCBleGl0IGZyb20gY2hpbGQhIgorJyAmCisKK2NoaWxkPSQhCitzbGVlcCAwLjEgIyBsZXQgY2hpbGQgaW5zdGFsbCBoYW5kbGVyIGZpcnN0CitraWxsIC1IVVAgJGNoaWxkCit3YWl0CitlY2hvICJwYXJlbnQgZXhpdHMiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTEzYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMy5yaWdodApAQCAtMCwwICsxLDQgQEAKK2NoaWxkIHNsZWVwcworY2hpbGQgZ290IEhVUAorY2hpbGQgZXhpdHMKK3BhcmVudCBleGl0cwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjU2YzJkOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDMudGVzdHMKQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL3NoCisKKyRUSElTX1NIIC1jICcKK2h1cCgpIHsKKyAgICBlY2hvICJjaGlsZCBnb3QgSFVQIgorfQordHJhcCBodXAgSFVQCitlY2hvICJjaGlsZCBzbGVlcHMiCitzbGVlcCAxCitlY2hvICJjaGlsZCBleGl0cyIKKycgJgorCitjaGlsZD0kIQorc2xlZXAgMC4xICMgbGV0IGNoaWxkIGluc3RhbGwgaGFuZGxlciBmaXJzdAora2lsbCAtSFVQICRjaGlsZAord2FpdAorZWNobyAicGFyZW50IGV4aXRzIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2MDU4NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDQucmlnaHQKQEAgLTAsMCArMSw0IEBACisuL3NpZ25hbDQudGVzdHM6IHRyYXA6IGxpbmUgMzogQkFETkFNRTogaW52YWxpZCBzaWduYWwgc3BlY2lmaWNhdGlvbgorMQorVHJhcHBlZAorT2sKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmMWM0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw0LnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorIyEvYmluL3NoCisKK3RyYXAgImVjaG8gVHJhcHBlZCIgQkFETkFNRSBURVJNOyBlY2hvICQ/CitraWxsICQkCitlY2hvIE9rCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw1LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2ZkNDExCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNS5yaWdodApAQCAtMCwwICsxLDEyIEBACitTbGVlcGluZworU2xlZXBpbmcKK1dhaXRpbmcKKzIgc2VjIHBhc3NlZCwgc2VuZGluZyBVU1IxIHRvIHBhcmVudAorVVNSMSByZWNlaXZlZAorV2FpdCBleGl0IGNvZGU6IDEzOAorV2FpdGluZworMyBzZWMgcGFzc2VkLCBzZW5kaW5nIFVTUjEgdG8gcGFyZW50CitVU1IxIHJlY2VpdmVkCitXYWl0IGV4aXQgY29kZTogMTM4CitXYWl0aW5nCitXYWl0IHJldHVybmVkIDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDUudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE3OWJjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw1LnRlc3RzCkBAIC0wLDAgKzEsMTQgQEAKK3RyYXAgImVjaG8gVVNSMSByZWNlaXZlZCIgVVNSMQorc3R1YigpIHsKKyAgICBlY2hvICJTbGVlcGluZyIKKyAgICBzbGVlcCAkMQorICAgIGVjaG8gIiQxIHNlYyBwYXNzZWQsIHNlbmRpbmcgVVNSMSB0byBwYXJlbnQiCisgICAga2lsbCAtVVNSMSAkJAorfQorc3R1YiAzICYKK3N0dWIgMiAmCitzbGVlcCAxCit1bnRpbCB7IGVjaG8gIldhaXRpbmciOyB3YWl0OyB9IGRvCisgICAgZWNobyAiV2FpdCBleGl0IGNvZGU6ICQ/IgorZG9uZQorZWNobyAiV2FpdCByZXR1cm5lZCAwIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDYucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ZDkzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDYucmlnaHQKQEAgLTAsMCArMSwyIEBACitnb3QgVEVSTQorRG9uZTogMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2NlMTUxMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDYudGVzdHMKQEAgLTAsMCArMSwyIEBACit7IHRyYXAgImVjaG8gZ290IFRFUk0iIFRFUk07IHNsZWVwIDM7IH0mIHNsZWVwIDE7IGtpbGwgJCE7IHdhaXQKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDcucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw3LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzQ1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw3LnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0J1ZyBkZXRlY3RlZDogMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDcudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiMTM4MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDcudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorYnVnKCkgeworCXRyYXAgOiBleGl0CisJIyBCdWcgd2FzIGNhdXNpbmcgc2ggdG8gYmUgcnVuIGluIHN1YnNoZWxsLAorCSMgYXMgaWYgdGhpcyBsaW5lIGlzIHJlcGxhY2VkIHdpdGggKHNoIC1jIC4uLjsgZXhpdCAkPykgJgorCSMgaGVyZToKKwlzaCAtYyAnZWNobyBSRUFMX0NISUxEPSQkJyAmCisJZWNobyBQQVJFTlRTX0lERUFfT0ZfQ0hJTEQ9JCEKKwl3YWl0ICAjIG1ha2Ugc3VyZSBia2dkIHNoZWxsIGNvbXBsZXRlcworfQorCitidWcgfCB7Cit3aGlsZSByZWFkIHZhcnZhbDsgZG8KKwlldmFsICR2YXJ2YWwKK2RvbmUKK3Rlc3QgeCIkUkVBTF9DSElMRCIgIT0geCIiIFwKKyYmIHRlc3QgeCIkUkVBTF9DSElMRCIgPSB4IiRQQVJFTlRTX0lERUFfT0ZfQ0hJTEQiCitlY2hvICJCdWcgZGV0ZWN0ZWQ6ICQ/IgorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDgucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1NzJmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDgucmlnaHQKQEAgLTAsMCArMSwzIEBACitSZW1vdmluZyB0cmFwcworRW5kIG9mIGV4aXRfZnVuYworRG9uZTogMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDgudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzMxYWY3NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDgudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorIiRUSElTX1NIIiAtYyAnCitleGl0X2Z1bmMoKSB7CisgICAgZWNobyAiUmVtb3ZpbmcgdHJhcHMiCisgICAgdHJhcCAtIEVYSVQgVEVSTSBJTlQKKyAgICBlY2hvICJFbmQgb2YgZXhpdF9mdW5jIgorfQorc2V0IC1lCit0cmFwIGV4aXRfZnVuYyBFWElUIFRFUk0gSU5UCitzbGVlcCAyCitleGl0IDc3CisnICYKKworc2xlZXAgMQorIyBCVUc6IGFzaCBraWxscyAtUEdSUCwgYnV0IGluIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbCB3ZSBkbyBub3QgY3JlYXRlIHBncnBzIQorIyBJbiB0aGlzIGNhc2UsIGJhc2gga2lsbHMgYnkgUElELCBub3QgUEdSUC4KK2tpbGwgLVRFUk0gJTEKK3dhaXQKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDkucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw5LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTcyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw5LnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorUmVtb3ZpbmcgdHJhcHMKK0VuZCBvZiBleGl0X2Z1bmMKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDkudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw5LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4ZTcxMDEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw5LnRlc3RzCkBAIC0wLDAgKzEsMjEgQEAKKyMgTm90ZTogdGhlIGlubmVyIHNjcmlwdCBpcyBhIHRlc3Qgd2hpY2ggY2hlY2tzIGZvciBhIGRpZmZlcmVudCBidWcKKyMgKG9yZGVyaW5nIGJldHdlZW4gSU5UIGhhbmRsZXIgYW5kIGV4aXQgb24gInNldCAtZSIpLAorIyBidXQgc28gZmFyIEkgZGlkIG5vdCBmaWd1cmUgb3V0IGhvdyB0byBzaW11bGF0ZSBpdCBub24taW50ZXJhY3RpdmVseS4KKworIiRUSElTX1NIIiAtYyAnCitleGl0X2Z1bmMoKSB7CisgICAgZWNobyAiUmVtb3ZpbmcgdHJhcHMiCisgICAgdHJhcCAtIEVYSVQgVEVSTSBJTlQKKyAgICBlY2hvICJFbmQgb2YgZXhpdF9mdW5jIgorfQorc2V0IC1lCit0cmFwIGV4aXRfZnVuYyBFWElUIFRFUk0gSU5UCitzbGVlcCAyCitleGl0IDc3CisnICYKKworY2hpbGQ9JCEKK3NsZWVwIDEKK2tpbGwgLVRFUk0gJGNoaWxkCit3YWl0CitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2V4ZWNfZ2V0c19ub19lbnYucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2V4ZWNfZ2V0c19ub19lbnYucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyMmRmZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL25vZXhlY19nZXRzX25vX2Vudi5yaWdodApAQCAtMCwwICsxLDQgQEAKK1ZBUjc9VkFMCiswCitWQVI4PVZBTAorMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9leGVjX2dldHNfbm9fZW52LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9leGVjX2dldHNfbm9fZW52LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkMzQ3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2V4ZWNfZ2V0c19ub19lbnYudGVzdHMKQEAgLTAsMCArMSw1IEBACitleHBvcnQgVkFSNz1WQUwKK2VudiB8IGdyZXAgXlZBUjc9CitlY2hvICQ/CitWQVI4PVZBTCBlbnYgfCBncmVwIF5WQVI4PQorZWNobyAkPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9mb3JrX3RyYXNoZXNfZ2V0b3B0LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9mb3JrX3RyYXNoZXNfZ2V0b3B0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzU0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2ZvcmtfdHJhc2hlc19nZXRvcHQucmlnaHQKQEAgLTAsMCArMSBAQAorMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9mb3JrX3RyYXNoZXNfZ2V0b3B0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9mb3JrX3RyYXNoZXNfZ2V0b3B0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0MmM1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2ZvcmtfdHJhc2hlc19nZXRvcHQudGVzdHMKQEAgLTAsMCArMSw2IEBACisjIEluIHRoaXMgdGVzdCwgcm0gaXMgTk9GT1JLIGFuZCBpdCBtb2RpZmllcyBnZXRvcHQgaW50ZXJuYWwgc3RhdGUKK3JtIC1mIG5vbl9leGlzdGVudF9maWxlCisjIFN1YnNlcXVlbnQgaGV4ZHVtcCBpcyBydW4gYXMgTk9FWEVDLCBhbmQgdGh1cyBzdGlsbCB1c2VzIHRoaXMgc3RhdGUKK2hleGR1bXAgPC9kZXYvbnVsbAorIyBEaWQgaGV4ZHVtcCBzZWdmYXVsdCBldGM/CitlY2hvICQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS92YXJfc3RhbmRhbG9uZTEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS92YXJfc3RhbmRhbG9uZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0NTdmZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL3Zhcl9zdGFuZGFsb25lMS5yaWdodApAQCAtMCwwICsxIEBACitEb25lOiAxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS92YXJfc3RhbmRhbG9uZTEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS92YXJfc3RhbmRhbG9uZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWU5MDViYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL3Zhcl9zdGFuZGFsb25lMS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK1ZBUj00MiAkVEhJU19TSCAtYyAndW5zZXQgVkFSOyBlbnYgfCBncmVwIF5WQVInCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTAxMjkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMS5yaWdodApAQCAtMCwwICsxLDYgQEAKK2E9YSBBPWEKK2E9YSBBPWEKK2E9IEE9CithPSBBPQorYT1hIEE9YQorYT1hIEE9YQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODAyZTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjEudGVzdHMKQEAgLTAsMCArMSwxNCBAQAorIyBjaGVjayB0aGF0IGZpcnN0IGFzc2lnbm1lbnQgaGFzIHByb3BlciBlZmZlY3Qgb24gc2Vjb25kIG9uZQorCisoCithPWEgQT0kYQorZWNobyBhPSRhIEE9JEEKKykKKyhhPWEgQT0kYTsgZWNobyBhPSRhIEE9JEEpCisoYT1hIEE9JGEgZWNobyBhPSRhIEE9JEEpCisoYT1hIEE9JGEgL2Jpbi9lY2hvIGE9JGEgQT0kQSkKKworZigpIHsgZWNobyBhPSRhIEE9JEE7IH0KKworKGE9YSBBPSRhIGYpCisoYT1hIEE9JGE7IGYpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmVkMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMi5yaWdodApAQCAtMCwwICsxIEBACitidXMvdXNiLzEvMgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDdmZWFlYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjIudGVzdHMKQEAgLTAsMCArMSBAQAorWD11c2JkZXYxLjIgWD0ke1gjdXNiZGV2fSBCPSR7WCUlLip9IEQ9JHtYIyoufTsgZWNobyBidXMvdXNiLyRCLyRECmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhMDc2OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMS5yaWdodApAQCAtMCwwICsxLDE0IEBACisKKworZgorYmNkZWYKK2FiY2RlZgorYWJjZGVmCitiY2RlCithYmNkCithYmNkCithYmNkZWYKK2JjZGVmCithYmNkZWYKK2FiY2RlZgorYWJjZGVmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjRkM2M5YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMS50ZXN0cwpAQCAtMCwwICsxLDE4IEBACit2YXI9YWJjZGVmCisKK2VjaG8gJHt2YXI6N30KK2VjaG8gJHt2YXI6Nn0KK2VjaG8gJHt2YXI6NX0KK2VjaG8gJHt2YXI6MX0KK2VjaG8gJHt2YXI6MH0KK2VjaG8gJHt2YXI6LTF9CisKK2VjaG8gJHt2YXI6MTo0fQorZWNobyAke3ZhcjowOjR9CitlY2hvICR7dmFyOjo0fQorZWNobyAke3ZhcjotMTo0fQorCitlY2hvICR7dmFyOjE6N30KK2VjaG8gJHt2YXI6MDo3fQorZWNobyAke3Zhcjo6N30KK2VjaG8gJHt2YXI6LTE6N30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JhNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gyLnJpZ2h0CkBAIC0wLDAgKzEsMTAgQEAKK2FiYzEyM3hjYmExMjMKK2FieDEyM2RjYmExMjMKK2FieDEyM2R4YmExMjMKK2FiY3gyM2RjYmExMjMKK2FiY3h4eGRjYmF4eHgKK2FieAoreGJhMTIzCithYngyMworYWJjMjNkY2JhMTIzCithYmNkY2JhCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjljNTI2YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMi50ZXN0cwpAQCAtMCwwICsxLDI0IEBACit2YXI9YWJjMTIzZGNiYTEyMworCitlY2hvICR7dmFyL2QveH0KK2VjaG8gJHt2YXIvYy94fQorZWNobyAke3Zhci8vYy94fQorZWNobyAke3Zhci9bMTIzXS94fQorZWNobyAke3Zhci8vWzEyM10veH0KK2VjaG8gJHt2YXIvYyoveH0KK2VjaG8gJHt2YXIvKmMveH0KKworIyBtdXN0IG1hdGNoIGxvbmdlc3QgbWF0Y2g6IHJlc3VsdCBpcyAiYWJ4MjMiCitlY2hvICR7dmFyL2MqMS94fQorCisjIGVtcHR5IHJlcGxhY2VtZW50IC0gMm5kIHNsYXNoIGNhbiBiZSBvbWl0dGVkCitlY2hvICR7dmFyL1sxMjNdfQorZWNobyAke3Zhci8vWzEyM119CisKKyMjIyBhc2ggZG9lc24ndCBzdXBwb3J0CisjIyMgIyBtYXRjaCBvbmx5IGF0IHRoZSBiZWdpbm5pbmc6CisjIyMgZWNobyAke3Zhci8jYS94fQorIyMjIGVjaG8gJHt2YXIvI2IveH0gIyBzaG91bGQgbm90IG1hdGNoCisjIyMgZWNobyAke3Zhci8vI2IveH0gIyBzaG91bGQgbm90IG1hdGNoCisjIyMgIyBtYXRjaCBvbmx5IGF0IHRoZSBlbmQ6CisjIyMgZWNobyAke3Zhci8lMy94fQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5N2M4NTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDMucmlnaHQKQEAgLTAsMCArMSwyMCBAQAorMSBhMDQxI2MKKzIgYTA0MSNjCiszIGFcMDQxI2MKKzQgYVwwNDEjYworNSBhXDA0MSNjCis2IGFcMDQxI2MKKzcgYVwwNDEjYworOCBhXDA0MSNjCis5IGFcMDQxI2MKKzEwIGFcYworMTEgYVxjCisxMiBhXGMKKzEzIGFcXGMKKzE0IGFcXGMKKzE1IGFcXGMKKzE2IGFcdGMKKzE3IGFcdGMKKzE4IGFcdGMKKzE5IGF0YworMjAgYVx0YwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0NmRiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDMudGVzdHMKQEAgLTAsMCArMSw0MSBAQAorYT0nYWJjJworcj0ke2EvL2IvXDA0MSN9CitlY2hvIDEgJHIKK2VjaG8gMiAke2EvL2IvXDA0MSN9CitlY2hvIDMgIiR7YS8vYi9cMDQxI30iCisKK2E9J2FiYycKK3I9JHthLy9iL1xcMDQxI30KK2VjaG8gNCAkcgorZWNobyA1ICR7YS8vYi9cXDA0MSN9CitlY2hvIDYgIiR7YS8vYi9cXDA0MSN9IgorCithPSdhYmMnCitiPSdcMDQxIycKK3I9JHthLy9iLyRifQorZWNobyA3ICRyCitlY2hvIDggJHthLy9iLyRifQorZWNobyA5ICIke2EvL2IvJGJ9IgorCithPSdhYmMnCitiPSdcJworcj0iJHthLy9iLyRifSIKK2VjaG8gMTAgJHIKK2VjaG8gMTEgJHthLy9iLyRifQorZWNobyAxMiAiJHthLy9iLyRifSIKKworYT0nYWJjJworYj0nXFwnCityPSIke2EvL2IvJGJ9IgorZWNobyAxMyAkcgorZWNobyAxNCAke2EvL2IvJGJ9CitlY2hvIDE1ICIke2EvL2IvJGJ9IgorCithPSdhYmMnCitiPSdcdCcKK3I9IiR7YS8vYi8kYn0iCitlY2hvIDE2ICRyCitlY2hvIDE3ICR7YS8vYi8kYn0KK2VjaG8gMTggIiR7YS8vYi8kYn0iCitlY2hvIDE5ICR7YS8vYi9cdH0KK2VjaG8gMjAgIiR7YS8vYi9cdH0iCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDQucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwZTg1MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNC5yaWdodApAQCAtMCwwICsxLDIzIEBACitTb3VyY2U6ICAgICAgICBhKmJcKmMKK1JlcGxhY2Ugc3RyOiAgIF9cXF9cel8KK1BhdHRlcm46ICAgICAgIHNpbmdsZSBiYWNrc2xhc2ggYW5kIHN0YXI6ICJyZXBsYWNlIGxpdGVyYWwgc3RhciIKK0luIGFzc2lnbm1lbnQ6IGFfXF96X2JcKmMKK1VucXVvdGVkOiAgICAgIGFfXF96X2JcKmMKK1F1b3RlZDogICAgICAgIGFfXF9cel9iXCpjCitQYXR0ZXJuOiAgICAgICBkb3VibGUgYmFja3NsYXNoIGFuZCBzdGFyOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQiCitJbiBhc3NpZ25tZW50OiBhKmJfXF96XworVW5xdW90ZWQ6ICAgICAgYSpiX1xfel8KK1F1b3RlZDogICAgICAgIGEqYl9cX1x6XworCitTb3VyY2U6ICAgICAgICBhXGJjCitSZXBsYWNlIHN0cjogICBfXFxfXHpfCitQYXR0ZXJuOiAgICAgICBzaW5nbGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiIgorSW4gYXNzaWdubWVudDogYVxfXF96X2MKK1VucXVvdGVkOiAgICAgIGFcX1xfel9jCitRdW90ZWQ6ICAgICAgICBhXF9cX1x6X2MKK1BhdHRlcm46ICAgICAgIGRvdWJsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgYiIKK0luIGFzc2lnbm1lbnQ6IGFfXF96X2MKK1VucXVvdGVkOiAgICAgIGFfXF96X2MKK1F1b3RlZDogICAgICAgIGFfXF9cel9jCisKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNTQ3MDYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g0LnRlc3RzCkBAIC0wLDAgKzEsNDcgQEAKKyMgVGhpcyB0ZXN0Y2FzZSBkZW1vbnN0cmF0ZXMgdGhhdCBiYWNrc2xhc2hlcyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseQorIyBpbiAxc3QgYW5kIDJuZCBwYXJ0cyBvZiAke3Zhci9zZWFyY2gvcmVwbH06CisjIGlmIHF1b3RlZCAoIiR7dmFyL3NlYXJjaC9yZXBsfSIpLCBhbmQgcmVwbCBjb250YWlucyBcYSAoYSBub24tc3BlY2lhbCBjaGFyKSwKKyMgdGhlIGJhY2tzbGFzaCBpbiByZXBsIHN0YXlzOyBpZiB1bnF1b3RlZCwgYmFja3NsYXNoIGlzIHJlbW92ZWQuCisjIEJ1dCBzZWFyY2ggcGFydCBkb2VzIG5vdCBhY3QgbGlrZSB0aGF0OiBcYSBpcyBhbHdheXMgY29udmVydGVkIHRvIGp1c3QgYSwKKyMgZXZlbiBpbiBxdW90ZXMuCisjCisjIGJhc2g0IChhbmQgcHJvYmFibHkgYmFzaDMgdG9vKTogIlF1b3RlZDoiIHJlc3VsdHMgYXJlIGRpZmZlcmVudCBmcm9tCisjIHVucXVvdGVkIGFuZCBhc3NpZ25tZW50IGV4cGFuc2lvbnMgLSB0aGV5IGhhdmUgYSBiYWNrc2xhc2ggYmVmb3JlIHouCisKK3Y9J2EqYlwqYycKK2VjaG8gJ1NvdXJjZTogICAgICAgJyAiJHYiCitlY2hvICdSZXBsYWNlIHN0cjogICcgJ19cXF9cel8nCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnc2luZ2xlIGJhY2tzbGFzaCBhbmQgc3RhcjogInJlcGxhY2UgbGl0ZXJhbCBzdGFyIicKK3I9JHt2L1wqL19cXF9cel99CitlY2hvICdJbiBhc3NpZ25tZW50OicgIiRyIgorZWNobyAnVW5xdW90ZWQ6ICAgICAnICR7di9cKi9fXFxfXHpffQorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXCovX1xcX1x6X30iCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnZG91YmxlIGJhY2tzbGFzaCBhbmQgc3RhcjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IicKK3I9JHt2L1xcKi9fXFxfXHpffQorZWNobyAnSW4gYXNzaWdubWVudDonICIkciIKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAgJHt2L1xcKi9fXFxfXHpffQorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXFwqL19cXF9cel99IgorCitlY2hvCisKK3Y9J2FcYmMnCitlY2hvICdTb3VyY2U6ICAgICAgICcgIiR2IgorZWNobyAnUmVwbGFjZSBzdHI6ICAnICdfXFxfXHpfJworCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ3NpbmdsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGIiJworcj0ke3YvXGIvX1xcX1x6X30KK2VjaG8gJ0luIGFzc2lnbm1lbnQ6JyAiJHIiCitlY2hvICdVbnF1b3RlZDogICAgICcgICR7di9cYi9fXFxfXHpffQorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXGIvX1xcX1x6X30iCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnZG91YmxlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBiIicKK3I9JHt2L1xcYi9fXFxfXHpffQorZWNobyAnSW4gYXNzaWdubWVudDonICIkciIKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAgJHt2L1xcYi9fXFxfXHpffQorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXFxiL19cXF9cel99IgorCitlY2hvCisKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzhlZDMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g1LnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorYS8KK2EvZAorYS9lL2YKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZjQ4MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g1LnRlc3RzCkBAIC0wLDAgKzEsMTEgQEAKKyMgVGhpcyB0ZXN0Y2FzZSBjaGVja3Mgd2hldGhlciBzbGFzaGVzIGluICR7di9hL2J9IGFyZSBwYXJzZWQgYmVmb3JlCisjIG9yIGFmdGVyIGV4cGFuc2lvbnMKKwordj0nYS9iL2MnCitzPSdiL2MnCityPSdlL2YnCitlY2hvICIke3YvJHN9IgorZWNobyAiJHt2LyRzL2R9IgorZWNobyAiJHt2LyRzLyRyfSIKKworZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2xlYWsucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfbGVhay5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWE1ZTMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2xlYWsucmlnaHQKQEAgLTAsMCArMSw0IEBACitzaG91bGQgYmUgZW1wdHk6ICcnCitzaG91bGQgYmUgZW1wdHk6ICcnCitzaG91bGQgYmUgbm90IGVtcHR5OiAndmFsMicKK3Nob3VsZCBiZSBub3QgZW1wdHk6ICd2YWwzJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2xlYWsudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfbGVhay50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MjQyZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2xlYWsudGVzdHMKQEAgLTAsMCArMSwyMyBAQAorIyBjYXQgaXMgYW4gZXh0ZXJuYWwgcHJvZ3JhbSwgdmFyaWFibGUgc2hvdWxkIG5vdCBsZWFrIG91dCBvZiBpdC4KKyMgdGhpcyBjdXJyZW50bHkgZmFpbHMgd2l0aCBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUks9eQorVkFSPScnCitWQVI9dmFsMCBjYXQgL2Rldi9udWxsCitlY2hvICJzaG91bGQgYmUgZW1wdHk6ICckVkFSJyIKKworIyB0cnVlIGlzIGEgcmVndWxhciBidWlsdGluLCB2YXJpYWJsZSBzaG91bGQgbm90IGxlYWsgb3V0IG9mIGl0LgorVkFSPScnCitWQVI9dmFsMSB0cnVlCitlY2hvICJzaG91bGQgYmUgZW1wdHk6ICckVkFSJyIKKworIyBhc2ggZm9sbG93cyB0aGUgInNwZWNpYWwgYnVpbHRpbiBsZWFrcyB2YXJpYWJsZXMiIHJ1bGUgaGVyZToKKyMgZXhlYyBpcyBhIHNwZWNpYWwgYnVpbHRpbi4gKGJhc2ggZG9lcyBub3QgZG8gaXQpCitWQVI9JycKK1ZBUj12YWwyIGV4ZWMgMj4mMQorZWNobyAic2hvdWxkIGJlIG5vdCBlbXB0eTogJyRWQVInIgorCisjIGFzaCBmb2xsb3dzIHRoZSAiZnVuY3Rpb24gY2FsbCBpcyBhIHNwZWNpYWwgYnVpbHRpbiIgcnVsZSBoZXJlCisjIChiYXNoIGRvZXMgbm90IGRvIGl0KQorZigpIHsgdHJ1ZTsgfQorVkFSPScnCitWQVI9dmFsMyBmCitlY2hvICJzaG91bGQgYmUgbm90IGVtcHR5OiAnJFZBUiciCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfcG9zaXgxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX3Bvc2l4MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWYzNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX3Bvc2l4MS5yaWdodApAQCAtMCwwICsxLDE3IEBACithYmNkY2QKK2FiY2RjZAorYWJjZGNkCitjZGNkCitiYWJjZGNkCitiYWJjZGNkCithYmFiY2RjZAorCithYmFiY2QKK2FiYWJjZAorYWJhYmNkCithYmFiCithYmFiY2RjCithYmFiY2RjCithYmFiY2RjZAorCitlbmQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9wb3NpeDEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfcG9zaXgxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxMzllMmMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfcG9zaXgxLnRlc3RzCkBAIC0wLDAgKzEsMjEgQEAKK3Zhcj1hYmFiY2RjZAorCitlY2hvICR7dmFyI2FifQorZWNobyAke3ZhciMjYWJ9CitlY2hvICR7dmFyI2EqYn0KK2VjaG8gJHt2YXIjI2EqYn0KK2VjaG8gJHt2YXIjP30KK2VjaG8gJHt2YXIjIz99CitlY2hvICR7dmFyIyp9CitlY2hvICR7dmFyIyMqfQorCitlY2hvICR7dmFyJWNkfQorZWNobyAke3ZhciUlY2R9CitlY2hvICR7dmFyJWMqZH0KK2VjaG8gJHt2YXIlJWMqZH0KK2VjaG8gJHt2YXIlP30KK2VjaG8gJHt2YXIlJT99CitlY2hvICR7dmFyJSp9CitlY2hvICR7dmFyJSUqfQorCitlY2hvIGVuZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvcHJpbnRlbnYuYyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L3ByaW50ZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjY2RhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L3ByaW50ZW52LmMKQEAgLTAsMCArMSw2NyBAQAorLyogcHJpbnRlbnYgLS0gbWluaW1hbCBjbG9uZSBvZiBCU0QgcHJpbnRlbnYoMSkuCisKKyAgIHVzYWdlOiBwcmludGVudiBbdmFybmFtZV0KKworICAgQ2hldCBSYW1leQorICAgY2hldEBwby5jd3J1LmVkdQorKi8KKworLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCYXNoLCB0aGUgQm91cm5lIEFnYWluIFNIZWxsLgorCisgICBCYXNoIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICAgdmVyc2lvbi4KKworICAgQmFzaCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICB3aXRoIEJhc2g7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEgVVNBLiAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKiplbnZwLCAqZXZhbDsKKyAgaW50IGxlbjsKKworICBhcmd2Kys7CisgIGFyZ2MtLTsKKworICAvKiBwcmludGVudiAqLworICBpZiAoYXJnYyA9PSAwKQorICAgIHsKKyAgICAgIGZvciAoZW52cCA9IGVudmlyb247ICplbnZwOyBlbnZwKyspCisJcHV0cyAoKmVudnApOworICAgICAgZXhpdChFWElUX1NVQ0NFU1MpOworICAgIH0KKworICAvKiBwcmludGVudiB2YXJuYW1lICovCisgIGxlbiA9IHN0cmxlbiAoKmFyZ3YpOworICBmb3IgKGVudnAgPSBlbnZpcm9uOyAqZW52cDsgZW52cCsrKQorICAgIHsKKyAgICAgIGlmICgqKmFyZ3YgPT0gKiplbnZwICYmIHN0cm5jbXAgKCplbnZwLCAqYXJndiwgbGVuKSA9PSAwKQorCXsKKwkgIGV2YWwgPSAqZW52cCArIGxlbjsKKwkgIC8qIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2Vzbid0IGhhdmUgYW4gYD0nLCBpZ25vcmUgaXQuICovCisJICBpZiAoKmV2YWwgPT0gJz0nKQorCSAgICB7CisJICAgICAgcHV0cyAoZXZhbCArIDEpOworCSAgICAgIGV4aXQoRVhJVF9TVUNDRVNTKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L3JlY2hvLmMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9yZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYTVmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9yZWNoby5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgICByZWNobyAtLSByZWFsbHkgZWNobyBhcmdzLCBicmFja2V0ZWQgd2l0aCA8PiBhbmQgd2l0aCBpbnZpc2libGUgY2hhcnMKKwkgICAgbWFkZSB2aXNpYmxlLgorCisgICBDaGV0IFJhbWV5CisgICBjaGV0QHBvLmN3cnUuZWR1CisqLworCisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJhc2gsIHRoZSBCb3VybmUgQWdhaW4gU0hlbGwuCisKKyAgIEJhc2ggaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgICB2ZXJzaW9uLgorCisgICBCYXNoIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICAgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggQmFzaDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMSBVU0EuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit2b2lkIHN0cnByaW50KCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJcHJpbnRmKCJhcmd2WyVkXSA9IDwiLCBpKTsKKwkJc3RycHJpbnQoYXJndltpXSk7CisJCXByaW50ZigiPlxuIik7CisJfQorCWV4aXQoRVhJVF9TVUNDRVNTKTsKK30KKwordm9pZCBzdHJwcmludChjaGFyICpzdHIpCit7CisJdW5zaWduZWQgY2hhciAqczsKKworCWZvciAocyA9ICh1bnNpZ25lZCBjaGFyICopc3RyOyBzICYmICpzOyBzKyspIHsKKwkJaWYgKCpzIDwgJyAnKSB7CisJCQlwdXRjaGFyKCdeJyk7CisJCQlwdXRjaGFyKCpzKzY0KTsKKwkJfSBlbHNlIGlmICgqcyA9PSAxMjcpIHsKKwkJCXB1dGNoYXIoJ14nKTsKKwkJCXB1dGNoYXIoJz8nKTsKKwkJfSBlbHNlCisJCQlwdXRjaGFyKCpzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC9ydW4tYWxsIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvcnVuLWFsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZDkzZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvYXNoX3Rlc3QvcnVuLWFsbApAQCAtMCwwICsxLDc0IEBACisjIS9iaW4vc2gKKworVE9QRElSPSRQV0QKKwordGVzdCAteCBhc2ggfHwgeworICAgIGVjaG8gIk5vIC4vYXNoIC0gY3JlYXRpbmcgYSBsaW5rIHRvIC4uLy4uL2J1c3lib3giCisgICAgbG4gLXMgLi4vLi4vYnVzeWJveCBhc2gKK30KK3Rlc3QgLXggcHJpbnRlbnYgfHwgZ2NjIC1PMiAtbyBwcmludGVudiBwcmludGVudi5jIHx8IGV4aXQgJD8KK3Rlc3QgLXggcmVjaG8gICAgfHwgZ2NjIC1PMiAtbyByZWNobyAgICByZWNoby5jICAgIHx8IGV4aXQgJD8KK3Rlc3QgLXggemVjaG8gICAgfHwgZ2NjIC1PMiAtbyB6ZWNobyAgICB6ZWNoby5jICAgIHx8IGV4aXQgJD8KKworUEFUSD0iJFBXRDokUEFUSCIgIyBmb3IgYXNoIGFuZCByZWNoby96ZWNoby9wcmludGVudgorZXhwb3J0IFBBVEgKKworVEhJU19TSD0iJFBXRC9hc2giCitleHBvcnQgVEhJU19TSAorCitkb190ZXN0KCkKK3sKKyAgICB0ZXN0IC1kICIkMSIgfHwgcmV0dXJuIDAKKyMgICBlY2hvIGRvX3Rlc3QgIiQxIgorICAgICMgJDEgYnV0IHdpdGggLyByZXBsYWNlZCBieSAjIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgZmlsZW5hbWUgcGFydAorICAgIG5vc2xhc2g9YGVjaG8gIiQxIiB8IHNlZCAnczovOiM6ZydgCisgICAgKAorICAgIGNkICIkMSIgfHwgeyBlY2hvICJjYW5ub3QgY2QgJDEhIjsgZXhpdCAxOyB9CisgICAgZm9yIHggaW4gcnVuLSo7IGRvCisJdGVzdCAtZiAiJHgiIHx8IGNvbnRpbnVlCisJY2FzZSAiJHgiIGluCisJICAgICIkMCJ8cnVuLW1pbmltYWx8cnVuLWdwcm9mKSA7OworCSAgICAqLm9yaWd8Kn4pIDs7CisJICAgICMqKSBlY2hvICR4IDsgc2ggJHggOzsKKwkgICAgKikKKwkgICAgc2ggIiR4IiA+IiRUT1BESVIvJG5vc2xhc2gtJHguZmFpbCIgMj4mMSAmJiBcCisJICAgIHsgZWNobyAiJDEvJHg6IG9rIjsgcm0gIiRUT1BESVIvJG5vc2xhc2gtJHguZmFpbCI7IH0gfHwgZWNobyAiJDEvJHg6IGZhaWwiOworCSAgICA7OworCWVzYWMKKyAgICBkb25lCisgICAgIyBNYW55IGJhc2ggcnVuLVhYWCBzY3JpcHRzIGp1c3QgZG8gdGhpcywKKyAgICAjIG5vIHBvaW50IGluIGR1cGxpY2F0aW9uIGl0IGFsbCBvdmVyIHRoZSBwbGFjZQorICAgIGZvciB4IGluICoudGVzdHM7IGRvCisJdGVzdCAteCAiJHgiIHx8IGNvbnRpbnVlCisJbmFtZT0iJHt4JSUudGVzdHN9IgorCXRlc3QgLWYgIiRuYW1lLnJpZ2h0IiB8fCBjb250aW51ZQorCXsKKwkgICAgIiRUSElTX1NIIiAiLi8keCIgPiIkbmFtZS54eCIgMj4mMQorCSAgICBkaWZmIC11ICIkbmFtZS54eCIgIiRuYW1lLnJpZ2h0IiA+IiRUT1BESVIvJG5vc2xhc2gtJHguZmFpbCIgXAorCSAgICAmJiBybSAtZiAiJG5hbWUueHgiICIkVE9QRElSLyRub3NsYXNoLSR4LmZhaWwiCisJfSAmJiBlY2hvICIkMS8keDogb2siIHx8IGVjaG8gIiQxLyR4OiBmYWlsIgorICAgIGRvbmUKKyAgICApCit9CisKKyMgbWFpbiBwYXJ0IG9mIHRoaXMgc2NyaXB0CisjIFVzYWdlOiBydW4tYWxsIFtkaXJlY3Rvcmllc10KKworaWYgWyAkIyAtbHQgMSBdOyB0aGVuCisgICAgIyBBbGwgc3ViIGRpcmVjdG9yaWVzCisgICAgbW9kdWxlcz1gbHMgLWQgYXNoLSpgCisgICAgIyBJZiB5b3Ugd2FudCB0byB0ZXN0IGFzaCBhZ2FpbnN0IGh1c2ggYW5kIG1zaCB0ZXN0c3VpdGVzCisgICAgIyAoaGF2ZSB0byBjb3B5IGh1c2hfdGVzdCBhbmQgbXNoX3Rlc3QgZGlycyB0byBjdXJyZW50IGRpciBmaXJzdCk6CisgICAgI21vZHVsZXM9YGxzIC1kIGFzaC0qIGh1c2hfdGVzdC9odXNoLSogbXNoX3Rlc3QvbXNoLSpgCisKKyAgICBmb3IgbW9kdWxlIGluICRtb2R1bGVzOyBkbworCWRvX3Rlc3QgJG1vZHVsZQorICAgIGRvbmUKK2Vsc2UKKyAgICB3aGlsZSBbICQjIC1nZSAxIF07IGRvCisJaWYgWyAtZCAkMSBdOyB0aGVuCisJICAgIGRvX3Rlc3QgJDEKKwlmaQorCXNoaWZ0CisgICAgZG9uZQorZmkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2FzaF90ZXN0L3plY2hvLmMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC96ZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWE1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9hc2hfdGVzdC96ZWNoby5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIHplY2hvIC0gYmFyZS1ib25lcyBlY2hvICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5Ni0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmFzaCwgdGhlIEJvdXJuZSBBZ2FpbiBTSGVsbC4KKworICAgQmFzaCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAgIHZlcnNpb24uCisKKyAgIEJhc2ggaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisgICBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgd2l0aCBCYXNoOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExIFVTQS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlhcmd2Kys7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJKHZvaWQpcHJpbnRmKCIlcyIsICphcmd2KTsKKwkJaWYgKCorK2FyZ3YpCisJCQlwdXRjaGFyKCcgJyk7CisJfQorCisJcHV0Y2hhcignXG4nKTsKKwlleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9icmFjZS50eHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9icmFjZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0ODYxYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2JyYWNlLnR4dApAQCAtMCwwICsxLDUwIEBACitCcmFjZSBFeHBhbnNpb24KKworQnJhY2UgZXhwYW5zaW9uIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIGFyYml0cmFyeSBzdHJpbmdzIG1heSBiZSBnZW5lci0KK2F0ZWQuICAgVGhpcyAgbWVjaGFuaXNtIGlzIHNpbWlsYXIgdG8gcGF0aG5hbWUgZXhwYW5zaW9uLCBidXQgdGhlIGZpbGUtCituYW1lcyBnZW5lcmF0ZWQgbmVlZCBub3QgZXhpc3QuICBQYXR0ZXJucyB0byBiZSBicmFjZSBleHBhbmRlZCB0YWtlIHRoZQorZm9ybSBvZiBhbiBvcHRpb25hbCBwcmVhbWJsZSwgZm9sbG93ZWQgYnkgZWl0aGVyIGEgc2VyaWVzIG9mIGNvbW1hLXNlcC0KK2FyYXRlZCBzdHJpbmdzIG9yIGEgc2VxdWVuY2UgZXhwcmVzc2lvbiBiZXR3ZWVuIGEgcGFpciBvZiBicmFjZXMsICBmb2wtCitsb3dlZCAgYnkgIGFuICBvcHRpb25hbCAgcG9zdHNjcmlwdC4gICBUaGUgcHJlYW1ibGUgaXMgcHJlZml4ZWQgdG8gZWFjaAorc3RyaW5nIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGJyYWNlcywgYW5kIHRoZSBwb3N0c2NyaXB0IGlzIHRoZW4gYXBwZW5kZWQKK3RvIGVhY2ggcmVzdWx0aW5nIHN0cmluZywgZXhwYW5kaW5nIGxlZnQgdG8gcmlnaHQuCisKK0JyYWNlICBleHBhbnNpb25zICBtYXkgIGJlIG5lc3RlZC4gIFRoZSByZXN1bHRzIG9mIGVhY2ggZXhwYW5kZWQgc3RyaW5nCithcmUgbm90IHNvcnRlZDsgIGxlZnQgIHRvICByaWdodCAgb3JkZXIgIGlzICBwcmVzZXJ2ZWQuICAgRm9yICBleGFtcGxlLAorYXtkLGMsYn1lIGV4cGFuZHMgaW50byBgYWRlIGFjZSBhYmUnLgorCitBICBzZXF1ZW5jZSAgZXhwcmVzc2lvbiB0YWtlcyB0aGUgZm9ybSB7eC4ueX0sIHdoZXJlIHggYW5kIHkgYXJlIGVpdGhlcgoraW50ZWdlcnMgb3Igc2luZ2xlIGNoYXJhY3RlcnMuICBXaGVuIGludGVnZXJzIGFyZSBzdXBwbGllZCwgdGhlIGV4cHJlcy0KK3Npb24gIGV4cGFuZHMgIHRvIGVhY2ggbnVtYmVyIGJldHdlZW4geCBhbmQgeSwgaW5jbHVzaXZlLiAgV2hlbiBjaGFyYWMtCit0ZXJzIGFyZSBzdXBwbGllZCwgdGhlIGV4cHJlc3Npb24gZXhwYW5kcyAgdG8gIGVhY2ggIGNoYXJhY3RlciAgbGV4aWNvLQorZ3JhcGhpY2FsbHkgYmV0d2VlbiB4IGFuZCB5LCBpbmNsdXNpdmUuICBOb3RlIHRoYXQgYm90aCB4IGFuZCB5IG11c3QgYmUKK29mIHRoZSBzYW1lIHR5cGUuCisKK0JyYWNlIGV4cGFuc2lvbiBpcyBwZXJmb3JtZWQgYmVmb3JlIGFueSBvdGhlciBleHBhbnNpb25zLCBhbmQgYW55IGNoYXItCithY3RlcnMgIHNwZWNpYWwgdG8gb3RoZXIgZXhwYW5zaW9ucyBhcmUgcHJlc2VydmVkIGluIHRoZSByZXN1bHQuICBJdCBpcworc3RyaWN0bHkgdGV4dHVhbC4gIEJhc2ggZG9lcyBub3QgYXBwbHkgYW55IHN5bnRhY3RpYyBpbnRlcnByZXRhdGlvbiAgdG8KK3RoZSBjb250ZXh0IG9mIHRoZSBleHBhbnNpb24gb3IgdGhlIHRleHQgYmV0d2VlbiB0aGUgYnJhY2VzLgorCitBICBjb3JyZWN0bHktZm9ybWVkICBicmFjZSAgZXhwYW5zaW9uIG11c3QgY29udGFpbiB1bnF1b3RlZCBvcGVuaW5nIGFuZAorY2xvc2luZyBicmFjZXMsIGFuZCBhdCBsZWFzdCBvbmUgdW5xdW90ZWQgY29tbWEgIG9yICBhICB2YWxpZCAgc2VxdWVuY2UKK2V4cHJlc3Npb24uICAgQW55IGluY29ycmVjdGx5IGZvcm1lZCBicmFjZSBleHBhbnNpb24gaXMgbGVmdCB1bmNoYW5nZWQuCitBIHsgb3IgLCBtYXkgYmUgcXVvdGVkIHdpdGggYSBiYWNrc2xhc2ggdG8gcHJldmVudCBpdHMgYmVpbmcgY29uc2lkZXJlZAorcGFydCAgb2YgIGEgYnJhY2UgZXhwcmVzc2lvbi4gIFRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHBhcmFtZXRlciBleHBhbi0KK3Npb24sIHRoZSBzdHJpbmcgJHsgaXMgbm90IGNvbnNpZGVyZWQgZWxpZ2libGUgZm9yIGJyYWNlIGV4cGFuc2lvbi4KKworVGhpcyBjb25zdHJ1Y3QgaXMgdHlwaWNhbGx5IHVzZWQgYXMgc2hvcnRoYW5kIHdoZW4gdGhlIGNvbW1vbiBwcmVmaXggb2YKK3RoZSBzdHJpbmdzIHRvIGJlIGdlbmVyYXRlZCBpcyBsb25nZXIgdGhhbiBpbiB0aGUgYWJvdmUgZXhhbXBsZToKKworICAgICAgIG1rZGlyIC91c3IvbG9jYWwvc3JjL2Jhc2gve29sZCxuZXcsZGlzdCxidWdzfQorb3IKKyAgICAgICBjaG93biByb290IC91c3Ive3VjYi97ZXgsZWRpdH0sbGliL3tleD8uPyosaG93X2V4fX0KKworQnJhY2UgIGV4cGFuc2lvbiAgaW50cm9kdWNlcyAgYSAgc2xpZ2h0IGluY29tcGF0aWJpbGl0eSB3aXRoIGhpc3RvcmljYWwKK3ZlcnNpb25zIG9mIHNoLiAgc2ggZG9lcyBub3QgdHJlYXQgb3BlbmluZyBvciBjbG9zaW5nIGJyYWNlcyAgc3BlY2lhbGx5Cit3aGVuICB0aGV5ICBhcHBlYXIgYXMgcGFydCBvZiBhIHdvcmQsIGFuZCBwcmVzZXJ2ZXMgdGhlbSBpbiB0aGUgb3V0cHV0LgorQmFzaCByZW1vdmVzIGJyYWNlcyBmcm9tIHdvcmRzIGFzIGEgIGNvbnNlcXVlbmNlICBvZiAgYnJhY2UgIGV4cGFuc2lvbi4KK0ZvciAgZXhhbXBsZSwgIGEgd29yZCBlbnRlcmVkIHRvIHNoIGFzIGZpbGV7MSwyfSBhcHBlYXJzIGlkZW50aWNhbGx5IGluCit0aGUgb3V0cHV0LiAgVGhlIHNhbWUgd29yZCBpcyBvdXRwdXQgYXMgZmlsZTEgZmlsZTIgYWZ0ZXIgZXhwYW5zaW9uICBieQorYmFzaC4gICBJZiBzdHJpY3QgY29tcGF0aWJpbGl0eSB3aXRoIHNoIGlzIGRlc2lyZWQsIHN0YXJ0IGJhc2ggd2l0aCB0aGUKKytCIG9wdGlvbiBvciBkaXNhYmxlIGJyYWNlIGV4cGFuc2lvbiB3aXRoIHRoZSArQiBvcHRpb24gdG8gdGhlIHNldCBjb20tCittYW5kCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9jdHR5aGFjay5jIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvY3R0eWhhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2VhMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvY3R0eWhhY2suYwpAQCAtMCwwICsxLDE2OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vYXBwbGV0OklGX0NUVFlIQUNLKEFQUExFVChjdHR5aGFjaywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0NUVFlIQUNLKSArPSBjdHR5aGFjay5vCisKKy8vY29uZmlnOmNvbmZpZyBDVFRZSEFDSworLy9jb25maWc6CWJvb2wgImN0dHloYWNrIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE9uZSBjb21tb24gcHJvYmxlbSByZXBvcnRlZCBvbiB0aGUgbWFpbGluZyBsaXN0IGlzIHRoZSAiY2FuJ3QKKy8vY29uZmlnOgkgIGFjY2VzcyB0dHk7IGpvYiBjb250cm9sIHR1cm5lZCBvZmYiIGVycm9yIG1lc3NhZ2UsIHdoaWNoIHR5cGljYWxseQorLy9jb25maWc6CSAgYXBwZWFycyB3aGVuIG9uZSB0cmllcyB0byB1c2UgYSBzaGVsbCB3aXRoIHN0ZGluL3N0ZG91dCBvbgorLy9jb25maWc6CSAgL2Rldi9jb25zb2xlLgorLy9jb25maWc6CSAgVGhpcyBkZXZpY2UgaXMgc3BlY2lhbCAtIGl0IGNhbm5vdCBiZSBhIGNvbnRyb2xsaW5nIHR0eS4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgVGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byB1c2UgdGhlIGNvcnJlY3QgZGV2aWNlIGluc3RlYWQgb2YKKy8vY29uZmlnOgkgIC9kZXYvY29uc29sZS4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgY3R0eWhhY2sgcHJvdmlkZXMgYSAicXVpY2sgYW5kIGRpcnR5IiBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0uCisvL2NvbmZpZzoJICBJdCBhbmFseXplcyBzdGRpbiB3aXRoIHZhcmlvdXMgaW9jdGxzLCB0cnlpbmcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKy8vY29uZmlnOgkgIGl0IGlzIGEgL2Rldi90dHlOIG9yIC9kZXYvdHR5U04gKHZpcnR1YWwgdGVybWluYWwgb3Igc2VyaWFsIGxpbmUpLgorLy9jb25maWc6CSAgT24gTGludXggaXQgYWxzbyBjaGVja3Mgc3lzZnMgZm9yIGEgcG9pbnRlciB0byB0aGUgYWN0aXZlIGNvbnNvbGUuCisvL2NvbmZpZzoJICBJZiBjdHR5aGFjayBpcyBhYmxlIHRvIGZpbmQgdGhlIHJlYWwgY29uc29sZSBkZXZpY2UsIGl0IGNsb3NlcworLy9jb25maWc6CSAgc3RkaW4vb3V0L2VyciBhbmQgcmVvcGVucyB0aGF0IGRldmljZS4KKy8vY29uZmlnOgkgIFRoZW4gaXQgZXhlY3V0ZXMgdGhlIGdpdmVuIHByb2dyYW0uIE9wZW5pbmcgdGhlIGRldmljZSB3aWxsIG1ha2UKKy8vY29uZmlnOgkgIHRoYXQgZGV2aWNlIGEgY29udHJvbGxpbmcgdHR5LiBUaGlzIG1heSByZXF1aXJlIGN0dHloYWNrCisvL2NvbmZpZzoJICB0byBiZSBhIHNlc3Npb24gbGVhZGVyLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBFeGFtcGxlIGZvciAvZXRjL2luaXR0YWIgKGZvciBidXN5Ym94IGluaXQpOgorLy9jb25maWc6CisvL2NvbmZpZzoJICA6OnJlc3Bhd246L2Jpbi9jdHR5aGFjayAvYmluL3NoCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFN0YXJ0aW5nIGFuIGludGVyYWN0aXZlIHNoZWxsIGZyb20gYm9vdCBzaGVsbCBzY3JpcHQ6CisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIHNldHNpZCBjdHR5aGFjayBzaAorLy9jb25maWc6CisvL2NvbmZpZzoJICBHaXZpbmcgY29udHJvbGxpbmcgdHR5IHRvIHNoZWxsIHJ1bm5pbmcgd2l0aCBQSUQgMToKKy8vY29uZmlnOgorLy9jb25maWc6CSAgIyBleGVjIGN0dHloYWNrIHNoCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFdpdGhvdXQgY3R0eWhhY2ssIHlvdSBuZWVkIHRvIGtub3cgZXhhY3QgdHR5IG5hbWUsCisvL2NvbmZpZzoJICBhbmQgZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKy8vY29uZmlnOgorLy9jb25maWc6CSAgIyBleGVjIHNldHNpZCBzaCAtYyAnZXhlYyBzaCA8L2Rldi90dHkxID4vZGV2L3R0eTEgMj4mMScKKy8vY29uZmlnOgorCisvL3VzYWdlOiNkZWZpbmUgY3R0eWhhY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBjdHR5aGFja19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkdpdmUgUFJPRyBhIGNvbnRyb2xsaW5nIHR0eSBpZiBwb3NzaWJsZS4iCisvL3VzYWdlOiAgICAgIlxuRXhhbXBsZSBmb3IgL2V0Yy9pbml0dGFiIChmb3IgYnVzeWJveCBpbml0KToiCisvL3VzYWdlOiAgICAgIlxuCTo6cmVzcGF3bjovYmluL2N0dHloYWNrIC9iaW4vc2giCisvL3VzYWdlOiAgICAgIlxuR2l2aW5nIGNvbnRyb2xsaW5nIHR0eSB0byBzaGVsbCBydW5uaW5nIHdpdGggUElEIDE6IgorLy91c2FnZTogICAgICJcbgkkIGV4ZWMgY3R0eWhhY2sgc2giCisvL3VzYWdlOiAgICAgIlxuU3RhcnRpbmcgaW50ZXJhY3RpdmUgc2hlbGwgZnJvbSBib290IHNoZWxsIHNjcmlwdDoiCisvL3VzYWdlOiAgICAgIlxuCXNldHNpZCBjdHR5aGFjayBzaCIKKworI2lmICFkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoVElPQ0dTRVJJQUwpICYmICFFTkFCTEVfV0VSUk9SCisjIHdhcm5pbmcgY3R0eWhhY2sgd2lsbCBub3QgYmUgYWJsZSB0byBkZXRlY3QgYSBjb250cm9sbGluZyB0dHkgb24gdGhpcyBzeXN0ZW0KKyNlbmRpZgorCisvKiBGcm9tIDxsaW51eC92dC5oPiAqLworc3RydWN0IHZ0X3N0YXQgeworCXVuc2lnbmVkIHNob3J0IHZfYWN0aXZlOyAgICAgICAgLyogYWN0aXZlIHZ0ICovCisJdW5zaWduZWQgc2hvcnQgdl9zaWduYWw7ICAgICAgICAvKiBzaWduYWwgdG8gc2VuZCAqLworCXVuc2lnbmVkIHNob3J0IHZfc3RhdGU7ICAgICAgICAgLyogdnQgYml0bWFzayAqLworfTsKK2VudW0geyBWVF9HRVRTVEFURSA9IDB4NTYwMyB9OyAvKiBnZXQgZ2xvYmFsIHZ0IHN0YXRlIGluZm8gKi8KKworLyogRnJvbSA8bGludXgvc2VyaWFsLmg+ICovCitzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB7CisJaW50CXR5cGU7CisJaW50CWxpbmU7CisJdW5zaWduZWQgaW50CXBvcnQ7CisJaW50CWlycTsKKwlpbnQJZmxhZ3M7CisJaW50CXhtaXRfZmlmb19zaXplOworCWludAljdXN0b21fZGl2aXNvcjsKKwlpbnQJYmF1ZF9iYXNlOworCXVuc2lnbmVkIHNob3J0CWNsb3NlX2RlbGF5OworCWNoYXIJaW9fdHlwZTsKKwljaGFyCXJlc2VydmVkX2NoYXJbMV07CisJaW50CWh1YjY7CisJdW5zaWduZWQgc2hvcnQJY2xvc2luZ193YWl0OyAgIC8qIHRpbWUgdG8gd2FpdCBiZWZvcmUgY2xvc2luZyAqLworCXVuc2lnbmVkIHNob3J0CWNsb3Npbmdfd2FpdDI7ICAvKiBubyBsb25nZXIgdXNlZC4uLiAqLworCXVuc2lnbmVkIGNoYXIJKmlvbWVtX2Jhc2U7CisJdW5zaWduZWQgc2hvcnQJaW9tZW1fcmVnX3NoaWZ0OworCXVuc2lnbmVkIGludAlwb3J0X2hpZ2g7CisJdW5zaWduZWQgbG9uZwlpb21hcF9iYXNlOwkvKiBjb29raWUgcGFzc2VkIGludG8gaW9yZW1hcCAqLworCWludAlyZXNlcnZlZFsxXTsKK307CisKK2ludCBjdHR5aGFja19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY3R0eWhhY2tfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwljaGFyIGNvbnNvbGVbc2l6ZW9mKGludCkqMyArIDE2XTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2dF9zdGF0IHZ0OworCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzcjsKKwkJY2hhciBwYXJhbm9pYVtzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpICogM107CisJfSB1OworCisJaWYgKCEqKythcmd2KSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlzdHJjcHkoY29uc29sZSwgIi9kZXYvdHR5Iik7CisJZmQgPSBvcGVuKGNvbnNvbGUsIE9fUkRXUik7CisJaWYgKGZkID49IDApIHsKKwkJLyogV2UgYWxyZWFkeSBoYXZlIGN0dHksIG5vdGhpbmcgdG8gZG8gKi8KKwkJY2xvc2UoZmQpOworCX0gZWxzZSB7CisJCS8qIFdlIGRvbid0IGhhdmUgY3R0eSAob3IgZG9uJ3QgaGF2ZSAiL2Rldi90dHkiIG5vZGUuLi4pICovCisJCWRvIHsKKyNpZmRlZiBfX2xpbnV4X18KKwkJCWludCBzID0gb3Blbl9yZWFkX2Nsb3NlKCIvc3lzL2NsYXNzL3R0eS9jb25zb2xlL2FjdGl2ZSIsCisJCQkJY29uc29sZSArIDUsIHNpemVvZihjb25zb2xlKSAtIDUpOworCQkJaWYgKHMgPiAwKSB7CisJCQkJLyogZm91bmQgYWN0aXZlIGNvbnNvbGUgdmlhIHN5c2ZzIChMaW51eCAyLjYuMzgrKQorCQkJCSAqIHN5c2ZzIHN0cmluZyBsb29rcyBsaWtlICJ0dHlTMFxuIiBzbyB6YXAgdGhlIG5ld2xpbmU6CisJCQkJICovCisJCQkJY29uc29sZVs0ICsgc10gPSAnXDAnOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaW9jdGwoMCwgVlRfR0VUU1RBVEUsICZ1LnZ0KSA9PSAwKSB7CisJCQkJLyogdGhpcyBpcyBsaW51eCB2aXJ0dWFsIHR0eSAqLworCQkJCXNwcmludGYoY29uc29sZSArIDgsICJTJWQiICsgMSwgdS52dC52X2FjdGl2ZSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKyNpZmRlZiBUSU9DR1NFUklBTAorCQkJaWYgKGlvY3RsKDAsIFRJT0NHU0VSSUFMLCAmdS5zcikgPT0gMCkgeworCQkJCS8qIHRoaXMgaXMgYSBzZXJpYWwgY29uc29sZSwgYXN1bWluZyBpdCBpcyBuYW1lZCAvZGV2L3R0eVNuICovCisJCQkJc3ByaW50Zihjb25zb2xlICsgOCwgIlMlZCIsIHUuc3IubGluZSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJCS8qIG5vcGUsIGNvdWxkIG5vdCBmaW5kIGl0ICovCisJCQlnb3RvIHJldDsKKwkJfSB3aGlsZSAoMCk7CisKKwkJZmQgPSBvcGVuX29yX3dhcm4oY29uc29sZSwgT19SRFdSKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWdvdG8gcmV0OworCQkvL2JiX2Vycm9yX21zZygic3dpdGNoaW5nIHRvICclcyciLCBjb25zb2xlKTsKKwkJZHVwMihmZCwgMCk7CisJCWR1cDIoZmQsIDEpOworCQlkdXAyKGZkLCAyKTsKKwkJd2hpbGUgKGZkID4gMikKKwkJCWNsb3NlKGZkLS0pOworCQkvKiBTb21lIG90aGVyIHNlc3Npb24gbWF5IGhhdmUgaXQgYXMgY3R0eSwKKwkJICogc3RlYWwgaXQgZnJvbSB0aGVtOgorCQkgKi8KKwkJaW9jdGwoMCwgVElPQ1NDVFRZLCAxKTsKKwl9CisKK3JldDoKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaC5jIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGFmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoLmMKQEAgLTAsMCArMSw5MTM2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBIHByb3RvdHlwZSBCb3VybmUgc2hlbGwgZ3JhbW1hciBwYXJzZXIuCisgKiBJbnRlbmRlZCB0byBmb2xsb3cgdGhlIG9yaWdpbmFsIFRob21wc29uIGFuZCBSaXRjaGllCisgKiAic21hbGwgYW5kIHNpbXBsZSBpcyBiZWF1dGlmdWwiIHBoaWxvc29waHksIHdoaWNoCisgKiBpbmNpZGVudGFsbHkgaXMgYSBnb29kIG1hdGNoIHRvIHRvZGF5J3MgQnVzeUJveC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgTGFycnkgRG9vbGl0dGxlIDxsYXJyeUBkb29saXR0bGUuYm9hLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5ICBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQ3JlZGl0czoKKyAqICAgICAgVGhlIHBhcnNlciByb3V0aW5lcyBwcm9wZXIgYXJlIGFsbCBvcmlnaW5hbCBtYXRlcmlhbCwgZmlyc3QKKyAqICAgICAgd3JpdHRlbiBEZWMgMjAwMCBhbmQgSmFuIDIwMDEgYnkgTGFycnkgRG9vbGl0dGxlLiAgVGhlCisgKiAgICAgIGV4ZWN1dGlvbiBlbmdpbmUsIHRoZSBidWlsdGlucywgYW5kIG11Y2ggb2YgdGhlIHVuZGVybHlpbmcKKyAqICAgICAgc3VwcG9ydCBoYXMgYmVlbiBhZGFwdGVkIGZyb20gYnVzeWJveC0wLjQ5cHJlJ3MgbGFzaCwgd2hpY2ggaXMKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogICAgICB3cml0dGVuIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4uICBUaGF0LCBpbiB0dXJuLAorICogICAgICBpcyBiYXNlZCBpbiBwYXJ0IG9uIGxhZHNoLmMsIGJ5IE1pY2hhZWwgSy4gSm9obnNvbiBhbmQgRXJpayBXLgorICogICAgICBUcm9hbiwgd2hpY2ggdGhleSBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4uICBJIGRvbid0IGtub3cKKyAqICAgICAgaG93IG11Y2ggb2YgdGhlIEpvaG5zb24vVHJvYW4gY29kZSBoYXMgc3Vydml2ZWQgdGhlIHJlcGVhdGVkCisgKiAgICAgIHJld3JpdGVzLgorICoKKyAqIE90aGVyIGNyZWRpdHM6CisgKiAgICAgIG9fYWRkY2hyIGRlcml2ZWQgZnJvbSBzaW1pbGFyIHdfYWRkY2hhciBmdW5jdGlvbiBpbiBnbGliYy0yLjIuCisgKiAgICAgIHBhcnNlX3JlZGlyZWN0LCByZWRpcmVjdF9vcHRfbnVtLCBhbmQgYmlnIGNodW5rcyBvZiBtYWluCisgKiAgICAgIGFuZCBtYW55IGJ1aWx0aW5zIGRlcml2ZWQgZnJvbSBjb250cmlidXRpb25zIGJ5IEVyaWsgQW5kZXJzZW4uCisgKiAgICAgIE1pc2NlbGxhbmVvdXMgYnVnZml4ZXMgZnJvbSBNYXR0IEtyYWFpLgorICoKKyAqIFRoZXJlIGFyZSB0d28gYmlnIChhbmQgcmVsYXRlZCkgYXJjaGl0ZWN0dXJlIGRpZmZlcmVuY2VzIGJldHdlZW4KKyAqIHRoaXMgcGFyc2VyIGFuZCB0aGUgbGFzaCBwYXJzZXIuICBPbmUgaXMgdGhhdCB0aGlzIHZlcnNpb24gaXMKKyAqIGFjdHVhbGx5IGRlc2lnbmVkIGZyb20gdGhlIGdyb3VuZCB1cCB0byB1bmRlcnN0YW5kIG5lYXJseSBhbGwKKyAqIG9mIHRoZSBCb3VybmUgZ3JhbW1hci4gIFRoZSBzZWNvbmQsIGNvbnNlcXVlbnRpYWwgY2hhbmdlIGlzIHRoYXQKKyAqIHRoZSBwYXJzZXIgYW5kIGlucHV0IHJlYWRlciBoYXZlIGJlZW4gdHVybmVkIGluc2lkZSBvdXQuICBOb3csCisgKiB0aGUgcGFyc2VyIGlzIGluIGNvbnRyb2wsIGFuZCBhc2tzIGZvciBpbnB1dCBhcyBuZWVkZWQuICBUaGUgb2xkCisgKiB3YXkgaGFkIHRoZSBpbnB1dCByZWFkZXIgaW4gY29udHJvbCwgYW5kIGl0IGFza2VkIGZvciBwYXJzaW5nIHRvCisgKiB0YWtlIHBsYWNlIGFzIG5lZWRlZC4gIFRoZSBuZXcgd2F5IG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIHByb3Blcmx5CisgKiBoYW5kbGUgdGhlIHJlY3Vyc2lvbiBpbXBsaWNpdCBpbiB0aGUgdmFyaW91cyBzdWJzdGl0dXRpb25zLCBlc3BlY2lhbGx5CisgKiBhY3Jvc3MgY29udGludWF0aW9uIGxpbmVzLgorICoKKyAqIFRPRE9zOgorICogICAgICBncmVwIGZvciAiVE9ETyIgYW5kIGZpeCAoc29tZSBvZiB0aGVtIGFyZSBlYXN5KQorICogICAgICBzcGVjaWFsIHZhcmlhYmxlcyAoZG9uZTogUFdELCBQUElELCBSQU5ET00pCisgKiAgICAgIHRpbGRlIGV4cGFuc2lvbgorICogICAgICBhbGlhc2VzCisgKiAgICAgIGZvbGxvdyBJRlMgcnVsZXMgbW9yZSBwcmVjaXNlbHksIGluY2x1ZGluZyB1cGRhdGUgc2VtYW50aWNzCisgKiAgICAgIGJ1aWx0aW5zIG1hbmRhdGVkIGJ5IHN0YW5kYXJkcyB3ZSBkb24ndCBzdXBwb3J0OgorICogICAgICAgICAgW3VuXWFsaWFzLCBjb21tYW5kLCBmYywgZ2V0b3B0cywgbmV3Z3JwLCByZWFkb25seSwgdGltZXMKKyAqICAgICAgbWFrZSBjb21wbGV4ICR7dmFyJS4uLn0gY29uc3RydWN0cyBzdXBwb3J0IG9wdGlvbmFsCisgKiAgICAgIG1ha2UgaGVyZSBkb2N1bWVudHMgb3B0aW9uYWwKKyAqCisgKiBCYXNoIGNvbXBhdCBUT0RPOgorICogICAgICByZWRpcmVjdGlvbiBvZiBzdGRvdXQrc3RkZXJyOiAmPiBhbmQgPiYKKyAqICAgICAgcmVzZXJ2ZWQgd29yZHM6IGZ1bmN0aW9uIHNlbGVjdAorICogICAgICBhZHZhbmNlZCB0ZXN0OiBbWyBdXQorICogICAgICBwcm9jZXNzIHN1YnN0aXR1dGlvbjogPChsaXN0KSBhbmQgPihsaXN0KQorICogICAgICA9fjogcmVnZXggb3BlcmF0b3IKKyAqICAgICAgbGV0IEVYUFIgW0VYUFIuLi5dCisgKiAgICAgICAgICBFYWNoIEVYUFIgaXMgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uIChBUklUSE1FVElDIEVWQUxVQVRJT04pCisgKiAgICAgICAgICBJZiB0aGUgbGFzdCBhcmcgZXZhbHVhdGVzIHRvIDAsIGxldCByZXR1cm5zIDE7IDAgb3RoZXJ3aXNlLgorICogICAgICAgICAgTkI6IGxldCBgZWNobyAnYT1hICsgMSdgIC0gZXJyb3IgKElPVzogbXVsdGktd29yZCBleHBhbnNpb24gaXMgdXNlZCkKKyAqICAgICAgKChFWFBSKSkKKyAqICAgICAgICAgIFRoZSBFWFBSIGlzIGV2YWx1YXRlZCBhY2NvcmRpbmcgdG8gQVJJVEhNRVRJQyBFVkFMVUFUSU9OLgorICogICAgICAgICAgVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gbGV0ICJFWFBSIi4KKyAqICAgICAgJFtFWFBSXTogc3lub255bSBmb3IgJCgoRVhQUikpCisgKgorICogV29uJ3QgZG86CisgKiAgICAgIEluIGJhc2gsIGV4cG9ydCBidWlsdGluIGlzIHNwZWNpYWwsIGl0cyBhcmd1bWVudHMgYXJlIGFzc2lnbm1lbnRzCisgKiAgICAgICAgICBhbmQgdGhlcmVmb3JlIGV4cGFuc2lvbiBvZiB0aGVtIHNob3VsZCBiZSAib25lLXdvcmQiIGV4cGFuc2lvbjoKKyAqICAgICAgICAgICAgICAkIGV4cG9ydCBpPWBlY2hvICdhICBiJ2AgIyBleHBvcnQgaGFzIG9uZSBhcmc6ICJpPWEgIGIiCisgKiAgICAgICAgICBjb21wYXJlIHdpdGg6CisgKiAgICAgICAgICAgICAgJCBscyBpPWBlY2hvICdhICBiJ2AgICAgICMgbHMgaGFzIHR3byBhcmdzOiAiaT1hIiBhbmQgImIiCisgKiAgICAgICAgICAgICAgbHM6IGNhbm5vdCBhY2Nlc3MgaT1hOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgKiAgICAgICAgICAgICAgbHM6IGNhbm5vdCBhY2Nlc3MgYjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICogICAgICAgICAgTm90ZTE6IHNhbWUgYXBwbGllcyB0byBsb2NhbCBidWlsdGluLgorICogICAgICAgICAgTm90ZTI6IGJhc2ggMy4yLjMzKDEpIGRvZXMgdGhpcyBvbmx5IGlmIGV4cG9ydCB3b3JkIGl0c2VsZgorICogICAgICAgICAgaXMgbm90IHF1b3RlZDoKKyAqICAgICAgICAgICAgICAkIGV4cG9ydCBpPWBlY2hvICdhYWEgIGJiYidgOyBlY2hvICIkaSIKKyAqICAgICAgICAgICAgICBhYWEgIGJiYgorICogICAgICAgICAgICAgICQgImV4cG9ydCIgaT1gZWNobyAnYWFhICBiYmInYDsgZWNobyAiJGkiCisgKiAgICAgICAgICAgICAgYWFhCisgKi8KKyNpZiAhKGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgXAorCXx8IGRlZmluZWQoX19BUFBMRV9fKSBcCisgICAgKQorIyBpbmNsdWRlIDxtYWxsb2MuaD4gICAvKiBmb3IgbWFsbG9jX3RyaW0gKi8KKyNlbmRpZgorI2luY2x1ZGUgPGdsb2IuaD4KKy8qICNpbmNsdWRlIDxkbWFsbG9jLmg+ICovCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorIyBpbmNsdWRlIDxmbm1hdGNoLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJ1c3lib3guaCIgIC8qIGZvciBBUFBMRVRfSVNfTk9GT1JLL05PRVhFQyAqLworI2luY2x1ZGUgInVuaWNvZGUuaCIKKyNpbmNsdWRlICJzaGVsbF9jb21tb24uaCIKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKyNpZiBFTkFCTEVfSFVTSF9SQU5ET01fU1VQUE9SVAorIyBpbmNsdWRlICJyYW5kb20uaCIKKyNlbHNlCisjIGRlZmluZSBDTEVBUl9SQU5ET01fVChybmQpICgodm9pZCkwKQorI2VuZGlmCisjaWZuZGVmIFBJUEVfQlVGCisjIGRlZmluZSBQSVBFX0JVRiA0MDk2ICAvKiBhbW91bnQgb2YgYnVmZmVyaW5nIGluIGEgcGlwZSAqLworI2VuZGlmCisKKy8qIE5vdCBldmVyeSBsaWJjIGhhcyBzaWdoYW5kbGVyX3QuIEZpeCBpdCAqLwordHlwZWRlZiB2b2lkICgqaHVzaF9zaWdoYW5kbGVyX3QpKGludCk7CisjZGVmaW5lIHNpZ2hhbmRsZXJfdCBodXNoX3NpZ2hhbmRsZXJfdAorCisvL2NvbmZpZzpjb25maWcgSFVTSAorLy9jb25maWc6CWJvb2wgImh1c2giCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgaHVzaCBpcyBhIHNtYWxsIHNoZWxsICgyNWspLiBJdCBoYW5kbGVzIHRoZSBub3JtYWwgZmxvdyBjb250cm9sCisvL2NvbmZpZzoJICBjb25zdHJ1Y3RzIHN1Y2ggYXMgaWYvdGhlbi9lbGlmL2Vsc2UvZmksIGZvci9pbi9kby9kb25lLCB3aGlsZSBsb29wcywKKy8vY29uZmlnOgkgIGNhc2UvZXNhYy4gUmVkaXJlY3Rpb25zLCBoZXJlIGRvY3VtZW50cywgJCgoYXJpdGhtZXRpYykpCisvL2NvbmZpZzoJICBhbmQgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIEl0IHdpbGwgY29tcGlsZSBhbmQgd29yayBvbiBuby1tbXUgc3lzdGVtcy4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgSXQgZG9lcyBub3QgaGFuZGxlIHNlbGVjdCwgYWxpYXNlcywgdGlsZGUgZXhwYW5zaW9uLAorLy9jb25maWc6CSAgJj5maWxlIGFuZCA+JmZpbGUgcmVkaXJlY3Rpb24gb2Ygc3Rkb3V0K3N0ZGVyci4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfQkFTSF9DT01QQVQKKy8vY29uZmlnOglib29sICJiYXNoLWNvbXBhdGlibGUgZXh0ZW5zaW9ucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgYmFzaC1jb21wYXRpYmxlIGV4dGVuc2lvbnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0JSQUNFX0VYUEFOU0lPTgorLy9jb25maWc6CWJvb2wgIkJyYWNlIGV4cGFuc2lvbiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0hfQkFTSF9DT01QQVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUge2FiYyxkZWZ9IGV4dGVuc2lvbi4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfSEVMUAorLy9jb25maWc6CWJvb2wgImhlbHAgYnVpbHRpbiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgaGVscCBidWlsdGluIGluIGh1c2guIENvZGUgc2l6ZSArIH4xIGtieXRlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9JTlRFUkFDVElWRQorLy9jb25maWc6CWJvb2wgIkludGVyYWN0aXZlIG1vZGUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGludGVyYWN0aXZlIG1vZGUgKHByb21wdCBhbmQgY29tbWFuZCBlZGl0aW5nKS4KKy8vY29uZmlnOgkgIFdpdGhvdXQgdGhpcywgaHVzaCBzaW1wbHkgcmVhZHMgYW5kIGV4ZWN1dGVzIGNvbW1hbmRzCisvL2NvbmZpZzoJICBmcm9tIHN0ZGluIGp1c3QgbGlrZSBhIHNoZWxsIHNjcmlwdCBmcm9tIGEgZmlsZS4KKy8vY29uZmlnOgkgIE5vIHByb21wdCwgbm8gUFMxL1BTMiBtYWdpYyBzaGVsbCB2YXJpYWJsZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX1NBVkVISVNUT1JZCisvL2NvbmZpZzoJYm9vbCAiU2F2ZSBjb21tYW5kIGhpc3RvcnkgdG8gLmh1c2hfaGlzdG9yeSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0hfSU5URVJBQ1RJVkUgJiYgRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGhpc3Rvcnkgc2F2aW5nIGluIGh1c2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0pPQgorLy9jb25maWc6CWJvb2wgIkpvYiBjb250cm9sIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSF9JTlRFUkFDVElWRQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBqb2IgY29udHJvbDogQ3RybC1aIGJhY2tncm91bmRzLCBDdHJsLUMgaW50ZXJydXB0cyBjdXJyZW50CisvL2NvbmZpZzoJICBjb21tYW5kIChub3QgZW50aXJlIHNoZWxsKSwgZmcvYmcgYnVpbHRpbnMgd29yay4gV2l0aG91dCB0aGlzIG9wdGlvbiwKKy8vY29uZmlnOgkgICJjbWQgJiIgc3RpbGwgd29ya3MgYnkgc2ltcGx5IHNwYXduaW5nIGEgcHJvY2VzcyBhbmQgaW1tZWRpYXRlbHkKKy8vY29uZmlnOgkgIHByb21wdGluZyBmb3IgbmV4dCBjb21tYW5kIChvciBleGVjdXRpbmcgbmV4dCBjb21tYW5kIGluIGEgc2NyaXB0KSwKKy8vY29uZmlnOgkgIGJ1dCBubyBzZXBhcmF0ZSBwcm9jZXNzIGdyb3VwIGlzIGZvcm1lZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfVElDSworLy9jb25maWc6CWJvb2wgIlByb2Nlc3Mgc3Vic3RpdHV0aW9uIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBwcm9jZXNzIHN1YnN0aXR1dGlvbiBgY29tbWFuZGAgYW5kICQoY29tbWFuZCkgaW4gaHVzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfSUYKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGlmL3RoZW4vZWxpZi9lbHNlL2ZpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBpZi90aGVuL2VsaWYvZWxzZS9maSBpbiBodXNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9MT09QUworLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgZm9yLCB3aGlsZSBhbmQgdW50aWwgbG9vcHMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGZvciwgd2hpbGUgYW5kIHVudGlsIGxvb3BzIGluIGh1c2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0NBU0UKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGNhc2UgLi4uIGVzYWMgc3RhdGVtZW50IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBjYXNlIC4uLiBlc2FjIHN0YXRlbWVudCBpbiBodXNoLiArNDAwIGJ5dGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9GVU5DVElPTlMKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGZ1bmNuYW1lKCkgeyBjb21tYW5kczsgfSBzeW50YXgiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHN1cHBvcnQgZm9yIHNoZWxsIGZ1bmN0aW9ucyBpbiBodXNoLiArODAwIGJ5dGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9MT0NBTAorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgbG9jYWwgYnVpbHRpbiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0hfRlVOQ1RJT05TCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHN1cHBvcnQgZm9yIGxvY2FsIHZhcmlhYmxlcyBpbiBmdW5jdGlvbnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX1JBTkRPTV9TVVBQT1JUCisvL2NvbmZpZzoJYm9vbCAiUHNldWRvcmFuZG9tIGdlbmVyYXRvciBhbmQgJFJBTkRPTSB2YXJpYWJsZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgcHNldWRvcmFuZG9tIGdlbmVyYXRvciBhbmQgZHluYW1pYyB2YXJpYWJsZSAiJFJBTkRPTSIuCisvL2NvbmZpZzoJICBFYWNoIHJlYWQgb2YgIiRSQU5ET00iIHdpbGwgZ2VuZXJhdGUgYSBuZXcgcHNldWRvcmFuZG9tIHZhbHVlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9FWFBPUlRfTgorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgJ2V4cG9ydCAtbicgb3B0aW9uIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGV4cG9ydCAtbiB1bmV4cG9ydHMgdmFyaWFibGVzLiBJdCBpcyBhIGJhc2ggZXh0ZW5zaW9uLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9NT0RFX1gKKy8vY29uZmlnOglib29sICJTdXBwb3J0ICdodXNoIC14JyBvcHRpb24gYW5kICdzZXQgLXgnIGNvbW1hbmQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBpbnN0cnVjdHMgaHVzaCB0byBwcmludCBjb21tYW5kcyBiZWZvcmUgZXhlY3V0aW9uLgorLy9jb25maWc6CSAgQWRkcyB+MzAwIGJ5dGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgTVNICisvL2NvbmZpZzoJYm9vbCAibXNoIChkZXByZWNhdGVkOiBhbGlhc2VkIHRvIGh1c2gpIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CXNlbGVjdCBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgbXNoIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCwgcGxlYXNlIG1pZ3JhdGUgdG8gaHVzaC4KKy8vY29uZmlnOgorCisvL2FwcGxldDpJRl9IVVNIKEFQUExFVChodXNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfTVNIKEFQUExFVChtc2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9GRUFUVVJFX1NIX0lTX0hVU0goQVBQTEVUX09ERE5BTUUoc2gsIGh1c2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgc2gpKQorLy9hcHBsZXQ6SUZfRkVBVFVSRV9CQVNIX0lTX0hVU0goQVBQTEVUX09ERE5BTUUoYmFzaCwgaHVzaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBiYXNoKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0hVU0gpICs9IGh1c2gubyBtYXRjaC5vIHNoZWxsX2NvbW1vbi5vCisvL2tidWlsZDpsaWItJChDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVCkgKz0gcmFuZG9tLm8KKworLyogLWkgKGludGVyYWN0aXZlKSBhbmQgLXMgKHJlYWQgc3RkaW4pIGFyZSBhbHNvIGFjY2VwdGVkLAorICogYnV0IGN1cnJlbnRseSBkbyBub3RoaW5nLCB0aGVyZWZvcmUgYXJlbid0IHNob3duIGluIGhlbHAuCisgKiBOT01NVS1zcGVjaWZpYyBvcHRpb25zIGFyZSBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSB1c2VycywKKyAqIHRoZXJlZm9yZSB3ZSBkb24ndCBzaG93IHRoZW0gZWl0aGVyLgorICovCisvL3VzYWdlOiNkZWZpbmUgaHVzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1ueGxdIFstYyAnU0NSSVBUJyBbQVJHMCBbQVJHU11dIC8gRklMRSBbQVJHU11dIgorLy91c2FnZTojZGVmaW5lIGh1c2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CSJVbml4IHNoZWxsIGludGVycHJldGVyIgorCisvL3VzYWdlOiNkZWZpbmUgbXNoX3RyaXZpYWxfdXNhZ2UgaHVzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiNkZWZpbmUgbXNoX2Z1bGxfdXNhZ2UgaHVzaF9mdWxsX3VzYWdlCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX1NIX0lTX0hVU0gKKy8vdXNhZ2U6IyBkZWZpbmUgc2hfdHJpdmlhbF91c2FnZSBodXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6IyBkZWZpbmUgc2hfZnVsbF91c2FnZSAgICBodXNoX2Z1bGxfdXNhZ2UKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOiNpZiBFTkFCTEVfRkVBVFVSRV9CQVNIX0lTX0hVU0gKKy8vdXNhZ2U6IyBkZWZpbmUgYmFzaF90cml2aWFsX3VzYWdlIGh1c2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTojIGRlZmluZSBiYXNoX2Z1bGxfdXNhZ2UgICAgaHVzaF9mdWxsX3VzYWdlCisvL3VzYWdlOiNlbmRpZgorCisKKy8qIEJ1aWxkIGtub2JzICovCisjZGVmaW5lIExFQUtfSFVOVElORyAwCisjZGVmaW5lIEJVSUxEX0FTX05PTU1VIDAKKy8qIEVuYWJsZS9kaXNhYmxlIHNhbml0eSBjaGVja3MuIE9rIHRvIGVuYWJsZSBpbiBwcm9kdWN0aW9uLAorICogb25seSBhZGRzIGEgYml0IG9mIGJsb2F0LiBTZXQgdG8gPjEgdG8gZ2V0IG5vbi1wcm9kdWN0aW9uIGxldmVsIHZlcmJvc2l0eS4KKyAqIEtlZXBpbmcgMSBmb3Igbm93IGV2ZW4gaW4gcmVsZWFzZWQgdmVyc2lvbnMuCisgKi8KKyNkZWZpbmUgSFVTSF9ERUJVRyAxCisvKiBTbGlnaHRseSBiaWdnZXIgKCsyMDAgYnl0ZXMpLCBidXQgZmFzdGVyIGh1c2guCisgKiBTbyBmYXIgaXQgb25seSBlbmFibGVzIGEgdHJpY2sgd2l0aCBjb3VudGluZyBTSUdDSExEcyBhbmQgZm9ya3MsCisgKiB3aGljaCBhbGxvd3MgdXMgdG8gZG8gZmV3ZXIgd2FpdHBpZCdzLgorICogKHdlIGNhbiBkZXRlY3QgYSBjYXNlIHdoZXJlIG5laXRoZXIgZm9ya3Mgd2VyZSBkb25lIG5vciBTSUdDSExEcyBoYXBwZW5lZAorICogYW5kIHRoZXJlZm9yZSB3YWl0cGlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBhcyBsYXN0IHRpbWUpCisgKi8KKyNkZWZpbmUgRU5BQkxFX0hVU0hfRkFTVCAwCisvKiBUT0RPOiBpbXBsZW1lbnQgc2ltcGxpZmllZCBjb2RlIGZvciB1c2VycyB3aGljaCBkbyBub3QgbmVlZCAke3ZhciUuLi59IG9wcworICogU28gZmFyICR7dmFyJS4uLn0gb3BzIGFyZSBhbHdheXMgZW5hYmxlZDoKKyAqLworI2RlZmluZSBFTkFCTEVfSFVTSF9ET0xMQVJfT1BTIDEKKworCisjaWYgQlVJTERfQVNfTk9NTVUKKyMgdW5kZWYgQkJfTU1VCisjIHVuZGVmIFVTRV9GT1JfTk9NTVUKKyMgdW5kZWYgVVNFX0ZPUl9NTVUKKyMgZGVmaW5lIEJCX01NVSAwCisjIGRlZmluZSBVU0VfRk9SX05PTU1VKC4uLikgX19WQV9BUkdTX18KKyMgZGVmaW5lIFVTRV9GT1JfTU1VKC4uLikKKyNlbmRpZgorCisjaW5jbHVkZSAiTlVNX0FQUExFVFMuaCIKKyNpZiBOVU1fQVBQTEVUUyA9PSAxCisvKiBTVEFOREFMT05FIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIGFuZCB3b24ndCBjb21waWxlICovCisjIHVuZGVmIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKyMgdW5kZWYgRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBJRl9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKyMgdW5kZWYgSUZfTk9UX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSAwCisjIGRlZmluZSBJRl9GRUFUVVJFX1NIX1NUQU5EQUxPTkUoLi4uKQorIyBkZWZpbmUgSUZfTk9UX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworI2lmICFFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9FRElUSU5HIDAKKyMgdW5kZWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUIDAKKyNlbmRpZgorCisvKiBEbyB3ZSBzdXBwb3J0IEFOWSBrZXl3b3Jkcz8gKi8KKyNpZiBFTkFCTEVfSFVTSF9JRiB8fCBFTkFCTEVfSFVTSF9MT09QUyB8fCBFTkFCTEVfSFVTSF9DQVNFCisjIGRlZmluZSBIQVNfS0VZV09SRFMgMQorIyBkZWZpbmUgSUZfSEFTX0tFWVdPUkRTKC4uLikgX19WQV9BUkdTX18KKyMgZGVmaW5lIElGX0hBU19OT19LRVlXT1JEUyguLi4pCisjZWxzZQorIyBkZWZpbmUgSEFTX0tFWVdPUkRTIDAKKyMgZGVmaW5lIElGX0hBU19LRVlXT1JEUyguLi4pCisjIGRlZmluZSBJRl9IQVNfTk9fS0VZV09SRFMoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKy8qIElmIHlvdSBjb21tZW50IG91dCBvbmUgb2YgdGhlc2UgYmVsb3csIGl0IHdpbGwgYmUgI2RlZmluZWQgbGF0ZXIKKyAqIHRvIHBlcmZvcm0gZGVidWcgcHJpbnRmcyB0byBzdGRlcnI6ICovCisjZGVmaW5lIGRlYnVnX3ByaW50ZiguLi4pICAgICAgICBkbyB7fSB3aGlsZSAoMCkKKy8qIEZpbmVyLWdyYWluZWQgZGVidWcgc3dpdGNoZXMgKi8KKyNkZWZpbmUgZGVidWdfcHJpbnRmX3BhcnNlKC4uLikgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludF90cmVlKGEsIGIpICAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9leGVjKC4uLikgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2VudiguLi4pICAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfam9icyguLi4pICAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9leHBhbmQoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX3ZhcmV4cCguLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfZ2xvYiguLi4pICAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9saXN0KC4uLikgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX3N1YnN0KC4uLikgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfY2xlYW4oLi4uKSAgZG8ge30gd2hpbGUgKDApCisKKyNkZWZpbmUgRVJSX1BUUiAoKHZvaWQqKShsb25nKTEpCisKKyNkZWZpbmUgSk9CX1NUQVRVU19GT1JNQVQgICAgIlslZF0gJS0yMnMgJS40MHNcbiIKKworI2RlZmluZSBfU1BFQ0lBTF9WQVJTX1NUUiAgICAgIl8qQCQhPyMiCisjZGVmaW5lIFNQRUNJQUxfVkFSU19TVFIgICAgICgiXypAJCE/IyIgKyAxKQorI2RlZmluZSBOVU1FUklDX1NQRUNWQVJTX1NUUiAoIl8qQCQhPyMiICsgMykKKyNpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorLyogU3VwcG9ydCAvIGFuZCAvLyByZXBsYWNlIG9wcyAqLworLyogTm90ZSB0aGF0IC8vIGlzIHN0b3JlZCBhcyBcIGluICJlbmNvZGVkIiBzdHJpbmcgcmVwcmVzZW50YXRpb24gKi8KKyMgZGVmaW5lIFZBUl9FTkNPREVEX1NVQlNUX09QUyAgICAgICJcXC8lIzotPSs/IgorIyBkZWZpbmUgVkFSX1NVQlNUX09QUyAgICAgICAgICAgICAoIlxcLyUjOi09Kz8iICsgMSkKKyMgZGVmaW5lIE1JTlVTX1BMVVNfRVFVQUxfUVVFU1RJT04gKCJcXC8lIzotPSs/IiArIDUpCisjZWxzZQorIyBkZWZpbmUgVkFSX0VOQ09ERURfU1VCU1RfT1BTICAgICAgIiUjOi09Kz8iCisjIGRlZmluZSBWQVJfU1VCU1RfT1BTICAgICAgICAgICAgICAiJSM6LT0rPyIKKyMgZGVmaW5lIE1JTlVTX1BMVVNfRVFVQUxfUVVFU1RJT04gKCIlIzotPSs/IiArIDMpCisjZW5kaWYKKworI2RlZmluZSBTUEVDSUFMX1ZBUl9TWU1CT0wgICAzCisKK3N0cnVjdCB2YXJpYWJsZTsKKworc3RhdGljIGNvbnN0IGNoYXIgaHVzaF92ZXJzaW9uX3N0cltdIEFMSUdOMSA9ICJIVVNIX1ZFUlNJT049IkJCX1ZFUjsKKworLyogVGhpcyBzdXBwb3J0cyBzYXZpbmcgcG9pbnRlcnMgbWFsbG9jZWQgaW4gdmZvcmsgY2hpbGQsCisgKiB0byBiZSBmcmVlZCBpbiB0aGUgcGFyZW50LgorICovCisjaWYgIUJCX01NVQordHlwZWRlZiBzdHJ1Y3Qgbm9tbXVfc2F2ZV90IHsKKwljaGFyICoqbmV3X2VudjsKKwlzdHJ1Y3QgdmFyaWFibGUgKm9sZF92YXJzOworCWNoYXIgKiphcmd2OworCWNoYXIgKiphcmd2X2Zyb21fcmVfZXhlY2luZzsKK30gbm9tbXVfc2F2ZV90OworI2VuZGlmCisKK2VudW0geworCVJFU19OT05FICA9IDAsCisjaWYgRU5BQkxFX0hVU0hfSUYKKwlSRVNfSUYgICAgLAorCVJFU19USEVOICAsCisJUkVTX0VMSUYgICwKKwlSRVNfRUxTRSAgLAorCVJFU19GSSAgICAsCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCVJFU19GT1IgICAsCisJUkVTX1dISUxFICwKKwlSRVNfVU5USUwgLAorCVJFU19ETyAgICAsCisJUkVTX0RPTkUgICwKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTIHx8IEVOQUJMRV9IVVNIX0NBU0UKKwlSRVNfSU4gICAgLAorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCVJFU19DQVNFICAsCisJLyogdGhyZWUgcHNldWRvLWtleXdvcmRzIHN1cHBvcnQgY29udHJpdmVkICJjYXNlIiBzeW50YXg6ICovCisJUkVTX0NBU0VfSU4sICAgLyogImNhc2UgLi4uIElOIiwgdHVybnMgaW50byBSRVNfTUFUQ0ggd2hlbiBJTiBpcyBvYnNlcnZlZCAqLworCVJFU19NQVRDSCAsICAgIC8qICJ3b3JkKSIgKi8KKwlSRVNfQ0FTRV9CT0RZLCAvKiAidGhpcyBjb21tYW5kIGlzIGluc2lkZSBDQVNFIiAqLworCVJFU19FU0FDICAsCisjZW5kaWYKKwlSRVNfWFhYWCAgLAorCVJFU19TTlRYCit9OworCit0eXBlZGVmIHN0cnVjdCBvX3N0cmluZyB7CisJY2hhciAqZGF0YTsKKwlpbnQgbGVuZ3RoOyAvKiBwb3NpdGlvbiB3aGVyZSBkYXRhIGlzIGFwcGVuZGVkICovCisJaW50IG1heGxlbjsKKwlpbnQgb19leHBmbGFnczsKKwkvKiBBdCBsZWFzdCBzb21lIHBhcnQgb2YgdGhlIHN0cmluZyB3YXMgaW5zaWRlICcnIG9yICIiLAorCSAqIHBvc3NpYmx5IGVtcHR5IG9uZTogd29yZCIiLCB3bycncmQgZXRjLiAqLworCXNtYWxsaW50IGhhc19xdW90ZWRfcGFydDsKKwlzbWFsbGludCBoYXNfZW1wdHlfc2xvdDsKKwlzbWFsbGludCBvX2Fzc2lnbm1lbnQ7IC8qIDA6bWF5YmUsIDE6eWVzLCAyOm5vICovCit9IG9fc3RyaW5nOworZW51bSB7CisJRVhQX0ZMQUdfU0lOR0xFV09SRCAgICAgPSAweDgwLCAvKiBtdXN0IGJlIDB4ODAgKi8KKwlFWFBfRkxBR19HTE9CICAgICAgICAgICA9IDB4MiwKKwkvKiBQcm90ZWN0IG5ld2x5IGFkZGVkIGNoYXJzIGFnYWluc3QgZ2xvYmJpbmcKKwkgKiBieSBwcmVwZW5kaW5nIFwgdG8gKiwgPywgWywgXCAqLworCUVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTID0gMHgxLAorfTsKK2VudW0geworCU1BWUJFX0FTU0lHTk1FTlQgICAgICA9IDAsCisJREVGSU5JVEVMWV9BU1NJR05NRU5UID0gMSwKKwlOT1RfQVNTSUdOTUVOVCAgICAgICAgPSAyLAorCS8qIE5vdCBhbiBhc3NpZ21lbnQsIGJ1dCBuZXh0IHdvcmQgbWF5IGJlOiAiaWYgdj14eXogY21kOyIgKi8KKwlXT1JEX0lTX0tFWVdPUkQgICAgICAgPSAzLAorfTsKKy8qIFVzZWQgZm9yIGluaXRpYWxpemF0aW9uOiBvX3N0cmluZyBmb28gPSBOVUxMX09fU1RSSU5HOyAqLworI2RlZmluZSBOVUxMX09fU1RSSU5HIHsgTlVMTCB9CisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3BhcnNlCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYXNzaWdubWVudF9mbGFnW10gPSB7CisJIk1BWUJFX0FTU0lHTk1FTlQiLAorCSJERUZJTklURUxZX0FTU0lHTk1FTlQiLAorCSJOT1RfQVNTSUdOTUVOVCIsCisJIldPUkRfSVNfS0VZV09SRCIsCit9OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGluX3N0ciB7CisJY29uc3QgY2hhciAqcDsKKwkvKiBlb2ZfZmxhZz0xOiBsYXN0IGNoYXIgaW4gLT5wIGlzIHJlYWxseSBhbiBFT0YgKi8KKwljaGFyIGVvZl9mbGFnOyAvKiBtZWFuaW5nbGVzcyBpZiAtPnAgPT0gTlVMTCAqLworCWNoYXIgcGVla19idWZbMl07CisjaWYgRU5BQkxFX0hVU0hfSU5URVJBQ1RJVkUKKwlzbWFsbGludCBwcm9tcHRtb2RlOyAvKiAwOiBQUzEsIDE6IFBTMiAqLworI2VuZGlmCisJaW50IGxhc3RfY2hhcjsKKwlGSUxFICpmaWxlOworCWludCAoKmdldCkgKHN0cnVjdCBpbl9zdHIgKikgRkFTVF9GVU5DOworCWludCAoKnBlZWspIChzdHJ1Y3QgaW5fc3RyICopIEZBU1RfRlVOQzsKK30gaW5fc3RyOworI2RlZmluZSBpX2dldGNoKGlucHV0KSAoKGlucHV0KS0+Z2V0KGlucHV0KSkKKyNkZWZpbmUgaV9wZWVrKGlucHV0KSAoKGlucHV0KS0+cGVlayhpbnB1dCkpCisKKy8qIFRoZSBkZXNjcmlwIG1lbWJlciBvZiB0aGlzIHN0cnVjdHVyZSBpcyBvbmx5IHVzZWQgdG8gbWFrZQorICogZGVidWdnaW5nIG91dHB1dCBwcmV0dHkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCBtb2RlOworCXNpZ25lZCBjaGFyIGRlZmF1bHRfZmQ7CisJY2hhciBkZXNjcmlwWzNdOworfSByZWRpcl90YWJsZVtdID0geworCXsgT19SRE9OTFksICAgICAgICAgICAgICAgICAgMCwgIjwiICB9LAorCXsgT19DUkVBVHxPX1RSVU5DfE9fV1JPTkxZLCAgMSwgIj4iICB9LAorCXsgT19DUkVBVHxPX0FQUEVORHxPX1dST05MWSwgMSwgIj4+IiB9LAorCXsgT19DUkVBVHxPX1JEV1IsICAgICAgICAgICAgMSwgIjw+IiB9LAorCXsgT19SRE9OTFksICAgICAgICAgICAgICAgICAgMCwgIjw8IiB9LAorLyogU2hvdWxkIG5vdCBiZSBuZWVkZWQuIEJvZ3VzIGRlZmF1bHRfZmQgaGVscHMgaW4gZGVidWdnaW5nICovCisvKgl7IE9fUkRPTkxZLCAgICAgICAgICAgICAgICAgNzcsICI8PCIgfSwgKi8KK307CisKK3N0cnVjdCByZWRpcl9zdHJ1Y3QgeworCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKm5leHQ7CisJY2hhciAqcmRfZmlsZW5hbWU7ICAgICAgICAgIC8qIGZpbGVuYW1lICovCisJaW50IHJkX2ZkOyAgICAgICAgICAgICAgICAgIC8qIGZkIHRvIHJlZGlyZWN0ICovCisJLyogZmQgdG8gcmVkaXJlY3QgdG8sIG9yIC0zIGlmIHJkX2ZkIGlzIHRvIGJlIGNsb3NlZCAobj4mLSkgKi8KKwlpbnQgcmRfZHVwOworCXNtYWxsaW50IHJkX3R5cGU7ICAgICAgICAgICAvKiAoZW51bSByZWRpcl90eXBlKSAqLworCS8qIG5vdGU6IGZvciBoZXJlZG9jcywgcmRfZmlsZW5hbWUgY29udGFpbnMgaGVyZWRvYyBkZWxpbWl0ZXIsCisJICogYW5kIHN1YnNlcXVlbnRseSBoZXJlZG9jIGl0c2VsZjsgYW5kIHJkX2R1cCBpcyBhIGJpdG1hc2s6CisJICogYml0IDA6IGRvIHdlIG5lZWQgdG8gdHJpbSBsZWFkaW5nIHRhYnM/CisJICogYml0IDE6IGlzIGhlcmVkb2MgcXVvdGVkICg8PCdkZWxpbScgc3ludGF4KSA/CisJICovCit9OwordHlwZWRlZiBlbnVtIHJlZGlyX3R5cGUgeworCVJFRElSRUNUX0lOUFVUICAgICA9IDAsCisJUkVESVJFQ1RfT1ZFUldSSVRFID0gMSwKKwlSRURJUkVDVF9BUFBFTkQgICAgPSAyLAorCVJFRElSRUNUX0lPICAgICAgICA9IDMsCisJUkVESVJFQ1RfSEVSRURPQyAgID0gNCwKKwlSRURJUkVDVF9IRVJFRE9DMiAgPSA1LCAvKiBSRURJUkVDVF9IRVJFRE9DIGFmdGVyIGhlcmVkb2MgaXMgbG9hZGVkICovCisKKwlSRURJUkZEX0NMT1NFICAgICAgPSAtMywKKwlSRURJUkZEX1NZTlRBWF9FUlIgPSAtMiwKKwlSRURJUkZEX1RPX0ZJTEUgICAgPSAtMSwKKwkvKiBvdGhlcndpc2UsIHJkX2ZkIGlzIHJlZGlyZWN0ZWQgdG8gcmRfZHVwICovCisKKwlIRVJFRE9DX1NLSVBUQUJTID0gMSwKKwlIRVJFRE9DX1FVT1RFRCAgID0gMiwKK30gcmVkaXJfdHlwZTsKKworCitzdHJ1Y3QgY29tbWFuZCB7CisJcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgIC8qIDAgaWYgZXhpdGVkICovCisJaW50IGFzc2lnbm1lbnRfY250OyAgICAgICAgIC8qIGhvdyBtYW55IGFyZ3ZbaV0gYXJlIGFzc2lnbm1lbnRzPyAqLworCXNtYWxsaW50IGlzX3N0b3BwZWQ7ICAgICAgICAvKiBpcyB0aGUgY29tbWFuZCBjdXJyZW50bHkgcnVubmluZz8gKi8KKwlzbWFsbGludCBjbWRfdHlwZTsgICAgICAgICAgLyogQ01EX3h4eCAqLworI2RlZmluZSBDTURfTk9STUFMICAgMAorI2RlZmluZSBDTURfU1VCU0hFTEwgMQorI2lmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisvKiB1c2VkIGZvciAiW1sgRVhQUiBdXSIgKi8KKyMgZGVmaW5lIENNRF9TSU5HTEVXT1JEX05PR0xPQiAyCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKyMgZGVmaW5lIENNRF9GVU5DREVGIDMKKyNlbmRpZgorCisJc21hbGx1aW50IGNtZF9leGl0Y29kZTsKKwkvKiBpZiBub24tTlVMTCwgdGhpcyAiY29tbWFuZCIgaXMgeyBsaXN0IH0sICggbGlzdCApLCBvciBhIGNvbXBvdW5kIHN0YXRlbWVudCAqLworCXN0cnVjdCBwaXBlICpncm91cDsKKyNpZiAhQkJfTU1VCisJY2hhciAqZ3JvdXBfYXNfc3RyaW5nOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJc3RydWN0IGZ1bmN0aW9uICpjaGlsZF9mdW5jOworLyogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIHByZXZlbnQgYSBidWcgaGVyZToKKyAqIHdoaWxlLi4uZG8gZjEoKSB7YTt9OyBmMTsgZjEoKSB7Yjt9OyBmMTsgZG9uZQorICogV2hlbiB3ZSBleGVjdXRlICJmMSgpIHthO30iIGNtZCwgd2UgY3JlYXRlIG5ldyBmdW5jdGlvbiBhbmQgY2xlYXIKKyAqIGNtZC0+Z3JvdXAsIGNtZC0+Z3JvdXBfYXNfc3RyaW5nLCBjbWQtPmFyZ3ZbMF0uCisgKiBXaGVuIHdlIGV4ZWN1dGUgImYxKCkge2I7fSIsIHdlIG5vdGljZSB0aGF0IGYxIGV4aXN0cywKKyAqIGFuZCB0aGF0IGl0cyAicGFyZW50IGNtZCIgc3RydWN0IGlzIHN0aWxsICJhbGl2ZSIsCisgKiB3ZSBwdXQgdGhvc2UgZmllbGRzIGJhY2sgaW50byBjbWQtPnh4eAorICogKHN0cnVjdCBmdW5jdGlvbiBoYXMgLT5wYXJlbnRfY21kIHB0ciB0byBmYWNpbGl0YXRlIHRoYXQpLgorICogV2hlbiB3ZSBsb29wIGJhY2ssIHdlIGNhbiBleGVjdXRlICJmMSgpIHthO30iIGFnYWluIGFuZCBzZXQgZjEgY29ycmVjdGx5LgorICogV2l0aG91dCB0aGlzIHRyaWNrLCBsb29wIHdvdWxkIGV4ZWN1dGUgYTtiO2I7YjsuLi4KKyAqIGluc3RlYWQgb2YgY29ycmVjdCBzZXF1ZW5jZSBhO2I7YTtiOy4uLgorICogV2hlbiBjb21tYW5kIGlzIGZyZWVkLCBpdCBzZXZlcnMgdGhlIGxpbmsKKyAqIChzZXRzIC0+Y2hpbGRfZnVuYy0+cGFyZW50X2NtZCB0byBOVUxMKS4KKyAqLworI2VuZGlmCisJY2hhciAqKmFyZ3Y7ICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgbmFtZSBhbmQgYXJndW1lbnRzICovCisvKiBhcmd2IHZlY3RvciBtYXkgY29udGFpbiB2YXJpYWJsZSByZWZlcmVuY2VzICheQ3Zhcl5DLCBeQzBeQyBldGMpCisgKiBhbmQgb24gZXhlY3V0aW9uIHRoZXNlIGFyZSBzdWJzdGl0dXRlZCB3aXRoIHRoZWlyIHZhbHVlcy4KKyAqIFN1YnN0aXR1dGlvbiBjYW4gbWFrZSBfc2V2ZXJhbF8gd29yZHMgb3V0IG9mIG9uZSBhcmd2W25dIQorICogRXhhbXBsZTogYXJndlswXT09Jy5eQypeQy4nIGhlcmU6IGVjaG8gLiQqLgorICogUmVmZXJlbmNlcyBvZiB0aGUgZm9ybSBeQ2BjbWQgYXJnXkMgYXJlIGBjbWQgYXJnYCBzdWJzdGl0dXRpb25zLgorICovCisJc3RydWN0IHJlZGlyX3N0cnVjdCAqcmVkaXJlY3RzOyAvKiBJL08gcmVkaXJlY3Rpb25zICovCit9OworLyogSXMgdGhlcmUgYW55dGhpbmcgaW4gdGhpcyBjb21tYW5kIGF0IGFsbD8gKi8KKyNkZWZpbmUgSVNfTlVMTF9DTUQoY21kKSBcCisJKCEoY21kKS0+Z3JvdXAgJiYgIShjbWQpLT5hcmd2ICYmICEoY21kKS0+cmVkaXJlY3RzKQorCitzdHJ1Y3QgcGlwZSB7CisJc3RydWN0IHBpcGUgKm5leHQ7CisJaW50IG51bV9jbWRzOyAgICAgICAgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBjb21tYW5kcyBpbiBwaXBlICovCisJaW50IGFsaXZlX2NtZHM7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb21tYW5kcyBydW5uaW5nIChub3QgZXhpdGVkKSAqLworCWludCBzdG9wcGVkX2NtZHM7ICAgICAgICAgICAvKiBudW1iZXIgb2YgY29tbWFuZHMgYWxpdmUsIGJ1dCBzdG9wcGVkICovCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJaW50IGpvYmlkOyAgICAgICAgICAgICAgICAgIC8qIGpvYiBudW1iZXIgKi8KKwlwaWRfdCBwZ3JwOyAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBncm91cCBJRCBmb3IgdGhlIGpvYiAqLworCWNoYXIgKmNtZHRleHQ7ICAgICAgICAgICAgICAvKiBuYW1lIG9mIGpvYiAqLworI2VuZGlmCisJc3RydWN0IGNvbW1hbmQgKmNtZHM7ICAgICAgIC8qIGFycmF5IG9mIGNvbW1hbmRzIGluIHBpcGUgKi8KKwlzbWFsbGludCBmb2xsb3d1cDsgICAgICAgICAgLyogUElQRV9CRywgUElQRV9TRVEsIFBJUEVfT1IsIFBJUEVfQU5EICovCisJSUZfSEFTX0tFWVdPUkRTKHNtYWxsaW50IHBpX2ludmVydGVkOykgLyogIiEgY21kIHwgY21kIiAqLworCUlGX0hBU19LRVlXT1JEUyhzbWFsbGludCByZXNfd29yZDspIC8qIG5lZWRlZCBmb3IgaWYsIGZvciwgd2hpbGUsIHVudGlsLi4uICovCit9OwordHlwZWRlZiBlbnVtIHBpcGVfc3R5bGUgeworCVBJUEVfU0VRID0gMSwKKwlQSVBFX0FORCA9IDIsCisJUElQRV9PUiAgPSAzLAorCVBJUEVfQkcgID0gNCwKK30gcGlwZV9zdHlsZTsKKy8qIElzIHRoZXJlIGFueXRoaW5nIGluIHRoaXMgcGlwZSBhdCBhbGw/ICovCisjZGVmaW5lIElTX05VTExfUElQRShwaSkgXAorCSgocGkpLT5udW1fY21kcyA9PSAwIElGX0hBU19LRVlXT1JEUyggJiYgKHBpKS0+cmVzX3dvcmQgPT0gUkVTX05PTkUpKQorCisvKiBUaGlzIGhvbGRzIHBvaW50ZXJzIHRvIHRoZSB2YXJpb3VzIHJlc3VsdHMgb2YgcGFyc2luZyAqLworc3RydWN0IHBhcnNlX2NvbnRleHQgeworCS8qIGxpbmtlZCBsaXN0IG9mIHBpcGVzICovCisJc3RydWN0IHBpcGUgKmxpc3RfaGVhZDsKKwkvKiBsYXN0IHBpcGUgKGJlaW5nIGNvbnN0cnVjdGVkIHJpZ2h0IG5vdykgKi8KKwlzdHJ1Y3QgcGlwZSAqcGlwZTsKKwkvKiBsYXN0IGNvbW1hbmQgaW4gcGlwZSAoYmVpbmcgY29uc3RydWN0ZWQgcmlnaHQgbm93KSAqLworCXN0cnVjdCBjb21tYW5kICpjb21tYW5kOworCS8qIGxhc3QgcmVkaXJlY3QgaW4gY29tbWFuZC0+cmVkaXJlY3RzIGxpc3QgKi8KKwlzdHJ1Y3QgcmVkaXJfc3RydWN0ICpwZW5kaW5nX3JlZGlyZWN0OworI2lmICFCQl9NTVUKKwlvX3N0cmluZyBhc19zdHJpbmc7CisjZW5kaWYKKyNpZiBIQVNfS0VZV09SRFMKKwlzbWFsbGludCBjdHhfcmVzX3c7CisJc21hbGxpbnQgY3R4X2ludmVydGVkOyAvKiAiISBjbWQgfCBjbWQiICovCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCXNtYWxsaW50IGN0eF9kc2VtaWNvbG9uOyAvKiAiOzsiIHNlZW4gKi8KKyNlbmRpZgorCS8qIGJpdG1hc2sgb2YgRkxBR194eHgsIGZvciBmaWd1cmluZyBvdXQgdmFsaWQgcmVzZXJ2ZWQgd29yZHMgKi8KKwlpbnQgb2xkX2ZsYWc7CisJLyogZ3JvdXAgd2UgYXJlIGVuY2xvc2VkIGluOgorCSAqIGV4YW1wbGU6ICJpZiBwaXBlMTsgcGlwZTI7IHRoZW4gcGlwZTM7IGZpIgorCSAqIHdoZW4gd2Ugc2VlICJpZiIgb3IgInRoZW4iLCB3ZSBtYWxsb2MgYW5kIGNvcHkgY3VycmVudCBjb250ZXh0LAorCSAqIGFuZCBtYWtlIC0+c3RhY2sgcG9pbnQgdG8gaXQuIHRoZW4gd2UgcGFyc2UgcGlwZU4uCisJICogd2hlbiBjbG9zaW5nICJ0aGVuIiAvIGZpIiAvIHdoYXRldmVyIGlzIGZvdW5kLAorCSAqIHdlIG1vdmUgbGlzdF9oZWFkIGludG8gLT5zdGFjay0+Y29tbWFuZC0+Z3JvdXAsCisJICogY29weSAtPnN0YWNrIGludG8gY3VycmVudCBjb250ZXh0LCBhbmQgZGVsZXRlIC0+c3RhY2suCisJICogKHBhcnNpbmcgb2YgeyBsaXN0IH0gYW5kICggbGlzdCApIGRvZXNuJ3QgdXNlIHRoaXMgbWV0aG9kKQorCSAqLworCXN0cnVjdCBwYXJzZV9jb250ZXh0ICpzdGFjazsKKyNlbmRpZgorfTsKKworLyogT24gcHJvZ3JhbSBzdGFydCwgZW52aXJvbiBwb2ludHMgdG8gaW5pdGlhbCBlbnZpcm9ubWVudC4KKyAqIHB1dGVudiBhZGRzIG5ldyBwb2ludGVycyBpbnRvIGl0LCB1bnNldGVudiByZW1vdmVzIHRoZW0uCisgKiBOZWl0aGVyIG9mIHRoZXNlIChkZSlhbGxvY2F0ZXMgdGhlIHN0cmluZ3MuCisgKiBzZXRlbnYgYWxsb2NhdGVzIG5ldyBzdHJpbmdzIGluIG1hbGxvYyBzcGFjZSBhbmQgZG9lcyBwdXRlbnYsCisgKiBhbmQgdGh1cyBzZXRlbnYgaXMgdW51c2FibGUgKGxlYWt5KSBmb3Igc2hlbGwncyBwdXJwb3NlcyAqLworI2RlZmluZSBzZXRlbnYoLi4uKSBzZXRlbnZfaXNfbGVha3lfZG9udF91c2UoKQorc3RydWN0IHZhcmlhYmxlIHsKKwlzdHJ1Y3QgdmFyaWFibGUgKm5leHQ7CisJY2hhciAqdmFyc3RyOyAgICAgICAgLyogcG9pbnRzIHRvICJuYW1lPSIgcG9ydGlvbiAqLworI2lmIEVOQUJMRV9IVVNIX0xPQ0FMCisJdW5zaWduZWQgZnVuY19uZXN0X2xldmVsOworI2VuZGlmCisJaW50IG1heF9sZW47ICAgICAgICAgLyogaWYgPiAwLCBuYW1lIGlzIHBhcnQgb2YgaW5pdGlhbCBlbnY7IGVsc2UgbmFtZSBpcyBtYWxsb2NlZCAqLworCXNtYWxsaW50IGZsZ19leHBvcnQ7IC8qIHB1dGVudiBzaG91bGQgYmUgZG9uZSBvbiB0aGlzIHZhciAqLworCXNtYWxsaW50IGZsZ19yZWFkX29ubHk7Cit9OworCitlbnVtIHsKKwlCQ19CUkVBSyA9IDEsCisJQkNfQ09OVElOVUUgPSAyLAorfTsKKworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworc3RydWN0IGZ1bmN0aW9uIHsKKwlzdHJ1Y3QgZnVuY3Rpb24gKm5leHQ7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgY29tbWFuZCAqcGFyZW50X2NtZDsKKwlzdHJ1Y3QgcGlwZSAqYm9keTsKKyMgaWYgIUJCX01NVQorCWNoYXIgKmJvZHlfYXNfc3RyaW5nOworIyBlbmRpZgorfTsKKyNlbmRpZgorCisKKy8qIHNldCAtLytvIE9QVCBzdXBwb3J0LiAoVE9ETzogbWFrZSBpdCBvcHRpb25hbCkKKyAqIGJhc2ggc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBvcHRzOgorICogYWxsZXhwb3J0ICAgICAgIG9mZgorICogYnJhY2VleHBhbmQgICAgIG9uCisgKiBlbWFjcyAgICAgICAgICAgb24KKyAqIGVycmV4aXQgICAgICAgICBvZmYKKyAqIGVycnRyYWNlICAgICAgICBvZmYKKyAqIGZ1bmN0cmFjZSAgICAgICBvZmYKKyAqIGhhc2hhbGwgICAgICAgICBvbgorICogaGlzdGV4cGFuZCAgICAgIG9mZgorICogaGlzdG9yeSAgICAgICAgIG9uCisgKiBpZ25vcmVlb2YgICAgICAgb2ZmCisgKiBpbnRlcmFjdGl2ZS1jb21tZW50cyAgICBvbgorICoga2V5d29yZCAgICAgICAgIG9mZgorICogbW9uaXRvciAgICAgICAgIG9uCisgKiBub2Nsb2JiZXIgICAgICAgb2ZmCisgKiBub2V4ZWMgICAgICAgICAgb2ZmCisgKiBub2dsb2IgICAgICAgICAgb2ZmCisgKiBub2xvZyAgICAgICAgICAgb2ZmCisgKiBub3RpZnkgICAgICAgICAgb2ZmCisgKiBub3Vuc2V0ICAgICAgICAgb2ZmCisgKiBvbmVjbWQgICAgICAgICAgb2ZmCisgKiBwaHlzaWNhbCAgICAgICAgb2ZmCisgKiBwaXBlZmFpbCAgICAgICAgb2ZmCisgKiBwb3NpeCAgICAgICAgICAgb2ZmCisgKiBwcml2aWxlZ2VkICAgICAgb2ZmCisgKiB2ZXJib3NlICAgICAgICAgb2ZmCisgKiB2aSAgICAgICAgICAgICAgb2ZmCisgKiB4dHJhY2UgICAgICAgICAgb2ZmCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIG9fb3B0X3N0cmluZ3NbXSBBTElHTjEgPQorCSJwaXBlZmFpbFwwIgorCSJub2V4ZWNcMCIKKyNpZiBFTkFCTEVfSFVTSF9NT0RFX1gKKwkieHRyYWNlXDAiCisjZW5kaWYKKwk7CitlbnVtIHsKKwlPUFRfT19QSVBFRkFJTCwKKwlPUFRfT19OT0VYRUMsCisjaWYgRU5BQkxFX0hVU0hfTU9ERV9YCisJT1BUX09fWFRSQUNFLAorI2VuZGlmCisJTlVNX09QVF9PCit9OworCisKKy8qICJHbG9iYWxzIiB3aXRoaW4gdGhpcyBmaWxlICovCisvKiBTb3J0ZWQgcm91Z2hseSBieSBzaXplIChzbWFsbGVyIG9mZnNldHMgPT0gc21hbGxlciBjb2RlKSAqLworc3RydWN0IGdsb2JhbHMgeworCS8qIGludGVyYWN0aXZlX2ZkICE9IDAgbWVhbnMgd2UgYXJlIGFuIGludGVyYWN0aXZlIHNoZWxsLgorCSAqIElmIHdlIGFyZSwgdGhlbiBzYXZlZF90dHlfcGdycCBjYW4gYWxzbyBiZSAhPSAwLCBtZWFuaW5nCisJICogdGhhdCBjb250cm9sbGluZyB0dHkgaXMgYXZhaWxhYmxlLiBXaXRoIHNhdmVkX3R0eV9wZ3JwID09IDAsCisJICogam9iIGNvbnRyb2wgc3RpbGwgd29ya3MsIGJ1dCB0ZXJtaW5hbCBzaWduYWxzCisJICogKF5DLCBeWiwgXlksIF5cKSB3b24ndCB3b3JrIGF0IGFsbCwgYW5kIGJhY2tncm91bmQKKwkgKiBwcm9jZXNzIGdyb3VwcyBjYW4gb25seSBiZSBjcmVhdGVkIHdpdGggImNtZCAmIi4KKwkgKiBXaXRoIHNhdmVkX3R0eV9wZ3JwICE9IDAsIGh1c2ggd2lsbCB1c2UgdGNzZXRwZ3JwKCkKKwkgKiB0byBnaXZlIHR0eSB0byB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwLAorCSAqIGFuZCB3aWxsIHRha2UgaXQgYmFjayB3aGVuIHRoZSBncm91cCBpcyBzdG9wcGVkICheWikKKwkgKiBvciBraWxsZWQgKF5DKS4KKwkgKi8KKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorCS8qICdpbnRlcmFjdGl2ZV9mZCcgaXMgYSBmZCMgb3BlbiB0byBjdHR5LCBpZiB3ZSBoYXZlIG9uZQorCSAqIF9BTkRfIGlmIHdlIGRlY2lkZWQgdG8gYWN0IGludGVyYWN0aXZlbHkgKi8KKwlpbnQgaW50ZXJhY3RpdmVfZmQ7CisJY29uc3QgY2hhciAqUFMxOworCWNvbnN0IGNoYXIgKlBTMjsKKyMgZGVmaW5lIEdfaW50ZXJhY3RpdmVfZmQgKEcuaW50ZXJhY3RpdmVfZmQpCisjZWxzZQorIyBkZWZpbmUgR19pbnRlcmFjdGl2ZV9mZCAwCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HCisJbGluZV9pbnB1dF90ICpsaW5lX2lucHV0X3N0YXRlOworI2VuZGlmCisJcGlkX3Qgcm9vdF9waWQ7CisJcGlkX3Qgcm9vdF9wcGlkOworCXBpZF90IGxhc3RfYmdfcGlkOworI2lmIEVOQUJMRV9IVVNIX1JBTkRPTV9TVVBQT1JUCisJcmFuZG9tX3QgcmFuZG9tX2dlbjsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0pPQgorCWludCBydW5fbGlzdF9sZXZlbDsKKwlpbnQgbGFzdF9qb2JpZDsKKwlwaWRfdCBzYXZlZF90dHlfcGdycDsKKwlzdHJ1Y3QgcGlwZSAqam9iX2xpc3Q7CisjIGRlZmluZSBHX3NhdmVkX3R0eV9wZ3JwIChHLnNhdmVkX3R0eV9wZ3JwKQorI2Vsc2UKKyMgZGVmaW5lIEdfc2F2ZWRfdHR5X3BncnAgMAorI2VuZGlmCisJY2hhciBvX29wdFtOVU1fT1BUX09dOworI2lmIEVOQUJMRV9IVVNIX01PREVfWAorIyBkZWZpbmUgR194X21vZGUgKEcub19vcHRbT1BUX09fWFRSQUNFXSkKKyNlbHNlCisjIGRlZmluZSBHX3hfbW9kZSAwCisjZW5kaWYKKwlzbWFsbGludCBmbGFnX1NJR0lOVDsKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCXNtYWxsaW50IGZsYWdfYnJlYWtfY29udGludWU7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkvKiAwOiBvdXRzaWRlIG9mIGEgZnVuY3Rpb24gKG9yIHNvdXJjZWQgZmlsZSkKKwkgKiAtMTogaW5zaWRlIG9mIGEgZnVuY3Rpb24sIG9rIHRvIHVzZSByZXR1cm4gYnVpbHRpbgorCSAqIDE6IHJldHVybiBpcyBpbnZva2VkLCBza2lwIGFsbCB0aWxsIGVuZCBvZiBmdW5jCisJICovCisJc21hbGxpbnQgZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3M7CisjZW5kaWYKKwlzbWFsbGludCBleGl0aW5nOyAvKiB1c2VkIHRvIHByZXZlbnQgRVhJVCB0cmFwIHJlY3Vyc2lvbiAqLworCS8qIFRoZXNlIGZvdXIgc3VwcG9ydCAkPywgJCMsIGFuZCAkMSAqLworCXNtYWxsdWludCBsYXN0X2V4aXRjb2RlOworCS8qIGFyZSBnbG9iYWxfYXJndiBhbmQgZ2xvYmFsX2FyZ3ZbMS4ubl0gbWFsbG9jZWQ/IChub3RlOiBub3QgWzBdKSAqLworCXNtYWxsdWludCBnbG9iYWxfYXJnc19tYWxsb2NlZDsKKwkvKiBob3cgbWFueSBub24tTlVMTCBhcmd2J3Mgd2UgaGF2ZS4gTkI6ICQjICsgMSAqLworCWludCBnbG9iYWxfYXJnYzsKKwljaGFyICoqZ2xvYmFsX2FyZ3Y7CisjaWYgIUJCX01NVQorCWNoYXIgKmFyZ3YwX2Zvcl9yZV9leGVjaW5nOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwl1bnNpZ25lZCBkZXB0aF9icmVha19jb250aW51ZTsKKwl1bnNpZ25lZCBkZXB0aF9vZl9sb29wOworI2VuZGlmCisJY29uc3QgY2hhciAqaWZzOworCWNvbnN0IGNoYXIgKmN3ZDsKKwlzdHJ1Y3QgdmFyaWFibGUgKnRvcF92YXI7CisJY2hhciAqKmV4cGFuZGVkX2Fzc2lnbm1lbnRzOworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCXN0cnVjdCBmdW5jdGlvbiAqdG9wX2Z1bmM7CisjIGlmIEVOQUJMRV9IVVNIX0xPQ0FMCisJc3RydWN0IHZhcmlhYmxlICoqc2hhZG93ZWRfdmFyc19wcDsKKwl1bnNpZ25lZCBmdW5jX25lc3RfbGV2ZWw7CisjIGVuZGlmCisjZW5kaWYKKwkvKiBTaWduYWwgYW5kIHRyYXAgaGFuZGxpbmcgKi8KKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJdW5zaWduZWQgY291bnRfU0lHQ0hMRDsKKwl1bnNpZ25lZCBoYW5kbGVkX1NJR0NITEQ7CisJc21hbGxpbnQgd2VfaGF2ZV9jaGlsZHJlbjsKKyNlbmRpZgorCS8qIFdoaWNoIHNpZ25hbHMgaGF2ZSBub24tREZMIGhhbmRsZXIgKGV2ZW4gd2l0aCBubyB0cmFwcyBzZXQpPworCSAqIFNldCBhdCB0aGUgc3RhcnQgdG86CisJICogKFNJR1FVSVQgKyBtYXliZSBTUEVDSUFMX0lOVEVSQUNUSVZFX1NJR1MgKyBtYXliZSBTUEVDSUFMX0pPQlNUT1BfU0lHUykKKwkgKiBTUEVDSUFMX0lOVEVSQUNUSVZFX1NJR1MgYXJlIGNsZWFyZWQgYWZ0ZXIgZm9yay4KKwkgKiBUaGUgcmVzdCBpcyBjbGVhcmVkIHJpZ2h0IGJlZm9yZSBleGVjdiBzeXNjYWxscy4KKwkgKiBPdGhlciB0aGFuIHRoZXNlIHR3byB0aW1lcywgbmV2ZXIgbW9kaWZpZWQuCisJICovCisJdW5zaWduZWQgc3BlY2lhbF9zaWdfbWFzazsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwl1bnNpZ25lZCBmYXRhbF9zaWdfbWFzazsKKyMgZGVmaW5lIEdfZmF0YWxfc2lnX21hc2sgRy5mYXRhbF9zaWdfbWFzaworI2Vsc2UKKyMgZGVmaW5lIEdfZmF0YWxfc2lnX21hc2sgMAorI2VuZGlmCisJY2hhciAqKnRyYXBzOyAvKiBjaGFyICp0cmFwc1tOU0lHXSAqLworCXNpZ3NldF90IHBlbmRpbmdfc2V0OworI2lmIEhVU0hfREVCVUcKKwl1bnNpZ25lZCBsb25nIG1lbWxlYWtfdmFsdWU7CisJaW50IGRlYnVnX2luZGVudDsKKyNlbmRpZgorCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisJY2hhciB1c2VyX2lucHV0X2J1ZltFTkFCTEVfRkVBVFVSRV9FRElUSU5HID8gQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOIDogMl07Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisvKiBOb3QgI2RlZmluaW5nIG5hbWUgdG8gRy5uYW1lIC0gdGhpcyBxdWlja2x5IGdldHMgdW53aWVsZHkKKyAqICh0b28gbWFueSBkZWZpbmVzKS4gQWxzbywgSSBhY3R1YWxseSBwcmVmZXIgdG8gc2VlIHdoZW4gYSB2YXJpYWJsZQorICogaXMgZ2xvYmFsLCB0aHVzICJHLiIgcHJlZml4IGlzIGEgdXNlZnVsIGhpbnQgKi8KKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwkvKiBtZW1zZXQoJkcuc2EsIDAsIHNpemVvZihHLnNhKSk7ICovICBcCisJc2lnZmlsbHNldCgmRy5zYS5zYV9tYXNrKTsgXAorCUcuc2Euc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOyBcCit9IHdoaWxlICgwKQorCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGJ1aWx0aW5zICovCitzdGF0aWMgaW50IGJ1aWx0aW5fY2QoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9lY2hvKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fZXZhbChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX2V4ZWMoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9leGl0KGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fZXhwb3J0KGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjaWYgRU5BQkxFX0hVU0hfSk9CCitzdGF0aWMgaW50IGJ1aWx0aW5fZmdfYmcoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9qb2JzKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9IRUxQCitzdGF0aWMgaW50IGJ1aWx0aW5faGVscChjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9DQUwKK3N0YXRpYyBpbnQgYnVpbHRpbl9sb2NhbChjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgSFVTSF9ERUJVRworc3RhdGljIGludCBidWlsdGluX21lbWxlYWsoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNlbmRpZgorI2lmIEVOQUJMRV9QUklOVEYKK3N0YXRpYyBpbnQgYnVpbHRpbl9wcmludGYoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNlbmRpZgorc3RhdGljIGludCBidWlsdGluX3B3ZChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3JlYWQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9zZXQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9zaGlmdChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3NvdXJjZShjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3Rlc3QoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl90cmFwKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fdHlwZShjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3RydWUoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl91bWFzayhjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3Vuc2V0KGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fd2FpdChjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCitzdGF0aWMgaW50IGJ1aWx0aW5fYnJlYWsoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9jb250aW51ZShjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCitzdGF0aWMgaW50IGJ1aWx0aW5fcmV0dXJuKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjZW5kaWYKKworLyogVGFibGUgb2YgYnVpbHQtaW4gZnVuY3Rpb25zLiAgVGhleSBjYW4gYmUgZm9ya2VkIG9yIG5vdCwgZGVwZW5kaW5nIG9uCisgKiBjb250ZXh0OiB3aXRoaW4gcGlwZXMsIHRoZXkgZm9yay4gIEFzIHNpbXBsZSBjb21tYW5kcywgdGhleSBkbyBub3QuCisgKiBXaGVuIHVzZWQgaW4gbm9uLWZvcmtpbmcgY29udGV4dCwgdGhleSBjYW4gY2hhbmdlIGdsb2JhbCB2YXJpYWJsZXMKKyAqIGluIHRoZSBwYXJlbnQgc2hlbGwgcHJvY2Vzcy4gIElmIGZvcmtlZCwgb2YgY291cnNlIHRoZXkgY2Fubm90LgorICogRm9yIGV4YW1wbGUsICd1bnNldCBmb28gfCB3aGF0ZXZlcicgd2lsbCBwYXJzZSBhbmQgcnVuLCBidXQgZm9vIHdpbGwKKyAqIHN0aWxsIGJlIHNldCBhdCB0aGUgZW5kLiAqLworc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgeworCWNvbnN0IGNoYXIgKmJfY21kOworCWludCAoKmJfZnVuY3Rpb24pKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjaWYgRU5BQkxFX0hVU0hfSEVMUAorCWNvbnN0IGNoYXIgKmJfZGVzY3I7CisjIGRlZmluZSBCTFRJTihjbWQsIGZ1bmMsIGhlbHApIHsgY21kLCBmdW5jLCBoZWxwIH0KKyNlbHNlCisjIGRlZmluZSBCTFRJTihjbWQsIGZ1bmMsIGhlbHApIHsgY21kLCBmdW5jIH0KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kIGJsdGluczFbXSA9IHsKKwlCTFRJTigiLiIgICAgICAgICwgYnVpbHRpbl9zb3VyY2UgICwgIlJ1biBjb21tYW5kcyBpbiBhIGZpbGUiKSwKKwlCTFRJTigiOiIgICAgICAgICwgYnVpbHRpbl90cnVlICAgICwgTlVMTCksCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJQkxUSU4oImJnIiAgICAgICAsIGJ1aWx0aW5fZmdfYmcgICAsICJSZXN1bWUgYSBqb2IgaW4gdGhlIGJhY2tncm91bmQiKSwKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJQkxUSU4oImJyZWFrIiAgICAsIGJ1aWx0aW5fYnJlYWsgICAsICJFeGl0IGZyb20gYSBsb29wIiksCisjZW5kaWYKKwlCTFRJTigiY2QiICAgICAgICwgYnVpbHRpbl9jZCAgICAgICwgIkNoYW5nZSBkaXJlY3RvcnkiKSwKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCUJMVElOKCJjb250aW51ZSIgLCBidWlsdGluX2NvbnRpbnVlLCAiU3RhcnQgbmV3IGxvb3AgaXRlcmF0aW9uIiksCisjZW5kaWYKKwlCTFRJTigiZXZhbCIgICAgICwgYnVpbHRpbl9ldmFsICAgICwgIkNvbnN0cnVjdCBhbmQgcnVuIHNoZWxsIGNvbW1hbmQiKSwKKwlCTFRJTigiZXhlYyIgICAgICwgYnVpbHRpbl9leGVjICAgICwgIkV4ZWN1dGUgY29tbWFuZCwgZG9uJ3QgcmV0dXJuIHRvIHNoZWxsIiksCisJQkxUSU4oImV4aXQiICAgICAsIGJ1aWx0aW5fZXhpdCAgICAsICJFeGl0IiksCisJQkxUSU4oImV4cG9ydCIgICAsIGJ1aWx0aW5fZXhwb3J0ICAsICJTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIiksCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJQkxUSU4oImZnIiAgICAgICAsIGJ1aWx0aW5fZmdfYmcgICAsICJCcmluZyBqb2IgaW50byB0aGUgZm9yZWdyb3VuZCIpLAorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfSEVMUAorCUJMVElOKCJoZWxwIiAgICAgLCBidWlsdGluX2hlbHAgICAgLCBOVUxMKSwKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0pPQgorCUJMVElOKCJqb2JzIiAgICAgLCBidWlsdGluX2pvYnMgICAgLCAiTGlzdCBqb2JzIiksCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT0NBTAorCUJMVElOKCJsb2NhbCIgICAgLCBidWlsdGluX2xvY2FsICAgLCAiU2V0IGxvY2FsIHZhcmlhYmxlcyIpLAorI2VuZGlmCisjaWYgSFVTSF9ERUJVRworCUJMVElOKCJtZW1sZWFrIiAgLCBidWlsdGluX21lbWxlYWsgLCBOVUxMKSwKKyNlbmRpZgorCUJMVElOKCJyZWFkIiAgICAgLCBidWlsdGluX3JlYWQgICAgLCAiSW5wdXQgaW50byB2YXJpYWJsZSIpLAorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCUJMVElOKCJyZXR1cm4iICAgLCBidWlsdGluX3JldHVybiAgLCAiUmV0dXJuIGZyb20gYSBmdW5jdGlvbiIpLAorI2VuZGlmCisJQkxUSU4oInNldCIgICAgICAsIGJ1aWx0aW5fc2V0ICAgICAsICJTZXQvdW5zZXQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIiksCisJQkxUSU4oInNoaWZ0IiAgICAsIGJ1aWx0aW5fc2hpZnQgICAsICJTaGlmdCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMiKSwKKyNpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCUJMVElOKCJzb3VyY2UiICAgLCBidWlsdGluX3NvdXJjZSAgLCAiUnVuIGNvbW1hbmRzIGluIGEgZmlsZSIpLAorI2VuZGlmCisJQkxUSU4oInRyYXAiICAgICAsIGJ1aWx0aW5fdHJhcCAgICAsICJUcmFwIHNpZ25hbHMiKSwKKwlCTFRJTigidHlwZSIgICAgICwgYnVpbHRpbl90eXBlICAgICwgIlNob3cgY29tbWFuZCB0eXBlIiksCisJQkxUSU4oInVsaW1pdCIgICAsIHNoZWxsX2J1aWx0aW5fdWxpbWl0ICAsICJDb250cm9sIHJlc291cmNlIGxpbWl0cyIpLAorCUJMVElOKCJ1bWFzayIgICAgLCBidWlsdGluX3VtYXNrICAgLCAiU2V0IGZpbGUgY3JlYXRpb24gbWFzayIpLAorCUJMVElOKCJ1bnNldCIgICAgLCBidWlsdGluX3Vuc2V0ICAgLCAiVW5zZXQgdmFyaWFibGVzIiksCisJQkxUSU4oIndhaXQiICAgICAsIGJ1aWx0aW5fd2FpdCAgICAsICJXYWl0IGZvciBwcm9jZXNzIiksCit9OworLyogRm9yIG5vdywgZWNobyBhbmQgdGVzdCBhcmUgdW5jb25kaXRpb25hbGx5IGVuYWJsZWQuCisgKiBNYXliZSBtYWtlIGl0IGNvbmZpZ3VyYWJsZT8gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCBibHRpbnMyW10gPSB7CisJQkxUSU4oIlsiICAgICAgICAsIGJ1aWx0aW5fdGVzdCAgICAsIE5VTEwpLAorCUJMVElOKCJlY2hvIiAgICAgLCBidWlsdGluX2VjaG8gICAgLCBOVUxMKSwKKyNpZiBFTkFCTEVfUFJJTlRGCisJQkxUSU4oInByaW50ZiIgICAsIGJ1aWx0aW5fcHJpbnRmICAsIE5VTEwpLAorI2VuZGlmCisJQkxUSU4oInB3ZCIgICAgICAsIGJ1aWx0aW5fcHdkICAgICAsIE5VTEwpLAorCUJMVElOKCJ0ZXN0IiAgICAgLCBidWlsdGluX3Rlc3QgICAgLCBOVUxMKSwKK307CisKKworLyogRGVidWcgcHJpbnRvdXRzLgorICovCisjaWYgSFVTSF9ERUJVRworLyogcHJldmVudCBkaXNhc3RlcnMgd2l0aCBHLmRlYnVnX2luZGVudCA8IDAgKi8KKyMgZGVmaW5lIGluZGVudCgpIGZkcHJpbnRmKDIsICIlKnMiLCAoRy5kZWJ1Z19pbmRlbnQgKiAyKSAmIDB4ZmYsICIiKQorIyBkZWZpbmUgZGVidWdfZW50ZXIoKSAoRy5kZWJ1Z19pbmRlbnQrKykKKyMgZGVmaW5lIGRlYnVnX2xlYXZlKCkgKEcuZGVidWdfaW5kZW50LS0pCisjZWxzZQorIyBkZWZpbmUgaW5kZW50KCkgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIGRlYnVnX2VudGVyKCkgKCh2b2lkKTApCisjIGRlZmluZSBkZWJ1Z19sZWF2ZSgpICgodm9pZCkwKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmCisjIGRlZmluZSBkZWJ1Z19wcmludGYoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9wYXJzZQorIyBkZWZpbmUgZGVidWdfcHJpbnRmX3BhcnNlKC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfZXhlYworI2RlZmluZSBkZWJ1Z19wcmludGZfZXhlYyguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX2VudgorIyBkZWZpbmUgZGVidWdfcHJpbnRmX2VudiguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX2pvYnMKKyMgZGVmaW5lIGRlYnVnX3ByaW50Zl9qb2JzKC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjIGRlZmluZSBERUJVR19KT0JTIDEKKyNlbHNlCisjIGRlZmluZSBERUJVR19KT0JTIDAKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9leHBhbmQKKyMgZGVmaW5lIGRlYnVnX3ByaW50Zl9leHBhbmQoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyMgZGVmaW5lIERFQlVHX0VYUEFORCAxCisjZWxzZQorIyBkZWZpbmUgREVCVUdfRVhQQU5EIDAKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl92YXJleHAKKyMgZGVmaW5lIGRlYnVnX3ByaW50Zl92YXJleHAoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9nbG9iCisjIGRlZmluZSBkZWJ1Z19wcmludGZfZ2xvYiguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorIyBkZWZpbmUgREVCVUdfR0xPQiAxCisjZWxzZQorIyBkZWZpbmUgREVCVUdfR0xPQiAwCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfbGlzdAorIyBkZWZpbmUgZGVidWdfcHJpbnRmX2xpc3QoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9zdWJzdAorIyBkZWZpbmUgZGVidWdfcHJpbnRmX3N1YnN0KC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfY2xlYW4KKyMgZGVmaW5lIGRlYnVnX3ByaW50Zl9jbGVhbiguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorIyBkZWZpbmUgREVCVUdfQ0xFQU4gMQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHX0NMRUFOIDAKKyNlbmRpZgorCisjaWYgREVCVUdfRVhQQU5ECitzdGF0aWMgdm9pZCBkZWJ1Z19wcmludF9zdHJpbmdzKGNvbnN0IGNoYXIgKnByZWZpeCwgY2hhciAqKnZ2KQoreworCWluZGVudCgpOworCWZkcHJpbnRmKDIsICIlczpcbiIsIHByZWZpeCk7CisJd2hpbGUgKCp2dikKKwkJZmRwcmludGYoMiwgIiAnJXMnXG4iLCAqdnYrKyk7Cit9CisjZWxzZQorIyBkZWZpbmUgZGVidWdfcHJpbnRfc3RyaW5ncyhwcmVmaXgsIHZ2KSAoKHZvaWQpMCkKKyNlbmRpZgorCisKKy8qIExlYWsgaHVudGluZy4gVXNlIGh1c2hfbGVha3Rvb2wuc2ggZm9yIHBvc3QtcHJvY2Vzc2luZy4KKyAqLworI2lmIExFQUtfSFVOVElORworc3RhdGljIHZvaWQgKnh4bWFsbG9jKGludCBsaW5lbm8sIHNpemVfdCBzaXplKQoreworCXZvaWQgKnB0ciA9IHhtYWxsb2MoKHNpemUgKyAweGZmKSAmIH4weGZmKTsKKwlmZHByaW50ZigyLCAibGluZSAlZDogbWFsbG9jICVwXG4iLCBsaW5lbm8sIHB0cik7CisJcmV0dXJuIHB0cjsKK30KK3N0YXRpYyB2b2lkICp4eHJlYWxsb2MoaW50IGxpbmVubywgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlwdHIgPSB4cmVhbGxvYyhwdHIsIChzaXplICsgMHhmZikgJiB+MHhmZik7CisJZmRwcmludGYoMiwgImxpbmUgJWQ6IHJlYWxsb2MgJXBcbiIsIGxpbmVubywgcHRyKTsKKwlyZXR1cm4gcHRyOworfQorc3RhdGljIGNoYXIgKnh4c3RyZHVwKGludCBsaW5lbm8sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpwdHIgPSB4c3RyZHVwKHN0cik7CisJZmRwcmludGYoMiwgImxpbmUgJWQ6IHN0cmR1cCAlcFxuIiwgbGluZW5vLCBwdHIpOworCXJldHVybiBwdHI7Cit9CitzdGF0aWMgdm9pZCB4eGZyZWUodm9pZCAqcHRyKQoreworCWZkcHJpbnRmKDIsICJmcmVlICVwXG4iLCBwdHIpOworCWZyZWUocHRyKTsKK30KKyMgZGVmaW5lIHhtYWxsb2MocykgICAgIHh4bWFsbG9jKF9fTElORV9fLCBzKQorIyBkZWZpbmUgeHJlYWxsb2MocCwgcykgeHhyZWFsbG9jKF9fTElORV9fLCBwLCBzKQorIyBkZWZpbmUgeHN0cmR1cChzKSAgICAgeHhzdHJkdXAoX19MSU5FX18sIHMpCisjIGRlZmluZSBmcmVlKHApICAgICAgICB4eGZyZWUocCkKKyNlbmRpZgorCisKKy8qIFN5bnRheCBhbmQgcnVudGltZSBlcnJvcnMuIFRoZXkgYWx3YXlzIGFib3J0IHNjcmlwdHMuCisgKiBJbiBpbnRlcmFjdGl2ZSB1c2UgdGhleSB1c3VhbGx5IGRpc2NhcmQgdW5wYXJzZWQgYW5kL29yIHVuZXhlY3V0ZWQgY29tbWFuZHMKKyAqIGFuZCByZXR1cm4gdG8gdGhlIHByb21wdC4KKyAqIEhVU0hfREVCVUcgPj0gMiBwcmludHMgbGluZSBudW1iZXIgaW4gdGhpcyBmaWxlIHdoZXJlIGl0IHdhcyBkZXRlY3RlZC4KKyAqLworI2lmIEhVU0hfREVCVUcgPCAyCisjIGRlZmluZSBkaWVfaWZfc2NyaXB0KGxpbmVubywgLi4uKSAgICAgICAgICAgICBkaWVfaWZfc2NyaXB0KF9fVkFfQVJHU19fKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yKGxpbmVubywgbXNnKSAgICAgICAgICAgICAgc3ludGF4X2Vycm9yKG1zZykKKyMgZGVmaW5lIHN5bnRheF9lcnJvcl9hdChsaW5lbm8sIG1zZykgICAgICAgICAgIHN5bnRheF9lcnJvcl9hdChtc2cpCisjIGRlZmluZSBzeW50YXhfZXJyb3JfdW50ZXJtX2NoKGxpbmVubywgY2gpICAgICBzeW50YXhfZXJyb3JfdW50ZXJtX2NoKGNoKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VudGVybV9zdHIobGluZW5vLCBzKSAgICAgc3ludGF4X2Vycm9yX3VudGVybV9zdHIocykKKyMgZGVmaW5lIHN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKGxpbmVubywgY2gpIHN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKGNoKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRpZV9pZl9zY3JpcHQodW5zaWduZWQgbGluZW5vLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHA7CisKKyNpZiBIVVNIX0RFQlVHID49IDIKKwliYl9lcnJvcl9tc2coImh1c2guYzoldSIsIGxpbmVubyk7CisjZW5kaWYKKwl2YV9zdGFydChwLCBmbXQpOworCWJiX3ZlcnJvcl9tc2coZm10LCBwLCBOVUxMKTsKKwl2YV9lbmQocCk7CisJaWYgKCFHX2ludGVyYWN0aXZlX2ZkKQorCQl4ZnVuY19kaWUoKTsKK30KKworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yKHVuc2lnbmVkIGxpbmVubyBVTlVTRURfUEFSQU0sIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpZiAobXNnKQorCQliYl9lcnJvcl9tc2coInN5bnRheCBlcnJvcjogJXMiLCBtc2cpOworCWVsc2UKKwkJYmJfZXJyb3JfbXNnKCJzeW50YXggZXJyb3IiKTsKK30KKworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yX2F0KHVuc2lnbmVkIGxpbmVubyBVTlVTRURfUEFSQU0sIGNvbnN0IGNoYXIgKm1zZykKK3sKKwliYl9lcnJvcl9tc2coInN5bnRheCBlcnJvciBhdCAnJXMnIiwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yX3VudGVybV9zdHIodW5zaWduZWQgbGluZW5vIFVOVVNFRF9QQVJBTSwgY29uc3QgY2hhciAqcykKK3sKKwliYl9lcnJvcl9tc2coInN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICVzIiwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIHN5bnRheF9lcnJvcl91bnRlcm1fY2godW5zaWduZWQgbGluZW5vLCBjaGFyIGNoKQoreworCWNoYXIgbXNnWzJdID0geyBjaCwgJ1wwJyB9OworCXN5bnRheF9lcnJvcl91bnRlcm1fc3RyKGxpbmVubywgbXNnKTsKK30KKworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2godW5zaWduZWQgbGluZW5vIFVOVVNFRF9QQVJBTSwgaW50IGNoKQoreworCWNoYXIgbXNnWzJdOworCW1zZ1swXSA9IGNoOworCW1zZ1sxXSA9ICdcMCc7CisJYmJfZXJyb3JfbXNnKCJzeW50YXggZXJyb3I6IHVuZXhwZWN0ZWQgJXMiLCBjaCA9PSBFT0YgPyAiRU9GIiA6IG1zZyk7Cit9CisKKyNpZiBIVVNIX0RFQlVHIDwgMgorIyB1bmRlZiBkaWVfaWZfc2NyaXB0CisjIHVuZGVmIHN5bnRheF9lcnJvcgorIyB1bmRlZiBzeW50YXhfZXJyb3JfYXQKKyMgdW5kZWYgc3ludGF4X2Vycm9yX3VudGVybV9jaAorIyB1bmRlZiBzeW50YXhfZXJyb3JfdW50ZXJtX3N0cgorIyB1bmRlZiBzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaAorI2Vsc2UKKyMgZGVmaW5lIGRpZV9pZl9zY3JpcHQoLi4uKSAgICAgICAgICAgICBkaWVfaWZfc2NyaXB0KF9fTElORV9fLCBfX1ZBX0FSR1NfXykKKyMgZGVmaW5lIHN5bnRheF9lcnJvcihtc2cpICAgICAgICAgICAgICBzeW50YXhfZXJyb3IoX19MSU5FX18sIG1zZykKKyMgZGVmaW5lIHN5bnRheF9lcnJvcl9hdChtc2cpICAgICAgICAgICBzeW50YXhfZXJyb3JfYXQoX19MSU5FX18sIG1zZykKKyMgZGVmaW5lIHN5bnRheF9lcnJvcl91bnRlcm1fY2goY2gpICAgICBzeW50YXhfZXJyb3JfdW50ZXJtX2NoKF9fTElORV9fLCBjaCkKKyMgZGVmaW5lIHN5bnRheF9lcnJvcl91bnRlcm1fc3RyKHMpICAgICBzeW50YXhfZXJyb3JfdW50ZXJtX3N0cihfX0xJTkVfXywgcykKKyMgZGVmaW5lIHN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKGNoKSBzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaChfX0xJTkVfXywgY2gpCisjZW5kaWYKKworCisjaWYgRU5BQkxFX0hVU0hfSU5URVJBQ1RJVkUKK3N0YXRpYyB2b2lkIGNtZGVkaXRfdXBkYXRlX3Byb21wdCh2b2lkKTsKKyNlbHNlCisjIGRlZmluZSBjbWRlZGl0X3VwZGF0ZV9wcm9tcHQoKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKKy8qIFV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKy8qIFJlcGxhY2UgZWFjaCBceCB3aXRoIHggaW4gcGxhY2UsIHJldHVybiBwdHIgcGFzdCBOVUwuICovCitzdGF0aWMgY2hhciAqdW5iYWNrc2xhc2goY2hhciAqc3JjKQoreworCWNoYXIgKmRzdCA9IHNyYyA9IHN0cmNocm51bChzcmMsICdcXCcpOworCXdoaWxlICgxKSB7CisJCWlmICgqc3JjID09ICdcXCcpCisJCQlzcmMrKzsKKwkJaWYgKCgqZHN0KysgPSAqc3JjKyspID09ICdcMCcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGRzdDsKK30KKworc3RhdGljIGNoYXIgKiphZGRfc3RyaW5nc190b19zdHJpbmdzKGNoYXIgKipzdHJpbmdzLCBjaGFyICoqYWRkLCBpbnQgbmVlZF90b19kdXApCit7CisJaW50IGk7CisJdW5zaWduZWQgY291bnQxOworCXVuc2lnbmVkIGNvdW50MjsKKwljaGFyICoqdjsKKworCXYgPSBzdHJpbmdzOworCWNvdW50MSA9IDA7CisJaWYgKHYpIHsKKwkJd2hpbGUgKCp2KSB7CisJCQljb3VudDErKzsKKwkJCXYrKzsKKwkJfQorCX0KKwljb3VudDIgPSAwOworCXYgPSBhZGQ7CisJd2hpbGUgKCp2KSB7CisJCWNvdW50MisrOworCQl2Kys7CisJfQorCXYgPSB4cmVhbGxvYyhzdHJpbmdzLCAoY291bnQxICsgY291bnQyICsgMSkgKiBzaXplb2YoY2hhciopKTsKKwl2W2NvdW50MSArIGNvdW50Ml0gPSBOVUxMOworCWkgPSBjb3VudDI7CisJd2hpbGUgKC0taSA+PSAwKQorCQl2W2NvdW50MSArIGldID0gKG5lZWRfdG9fZHVwID8geHN0cmR1cChhZGRbaV0pIDogYWRkW2ldKTsKKwlyZXR1cm4gdjsKK30KKyNpZiBMRUFLX0hVTlRJTkcKK3N0YXRpYyBjaGFyICoqeHhfYWRkX3N0cmluZ3NfdG9fc3RyaW5ncyhpbnQgbGluZW5vLCBjaGFyICoqc3RyaW5ncywgY2hhciAqKmFkZCwgaW50IG5lZWRfdG9fZHVwKQoreworCWNoYXIgKipwdHIgPSBhZGRfc3RyaW5nc190b19zdHJpbmdzKHN0cmluZ3MsIGFkZCwgbmVlZF90b19kdXApOworCWZkcHJpbnRmKDIsICJsaW5lICVkOiBhZGRfc3RyaW5nc190b19zdHJpbmdzICVwXG4iLCBsaW5lbm8sIHB0cik7CisJcmV0dXJuIHB0cjsKK30KKyNkZWZpbmUgYWRkX3N0cmluZ3NfdG9fc3RyaW5ncyhzdHJpbmdzLCBhZGQsIG5lZWRfdG9fZHVwKSBcCisJeHhfYWRkX3N0cmluZ3NfdG9fc3RyaW5ncyhfX0xJTkVfXywgc3RyaW5ncywgYWRkLCBuZWVkX3RvX2R1cCkKKyNlbmRpZgorCisvKiBOb3RlOiB0YWtlcyBvd25lcnNoaXAgb2YgImFkZCIgcHRyIChpdCBpcyBub3Qgc3RyZHVwJ2VkKSAqLworc3RhdGljIGNoYXIgKiphZGRfc3RyaW5nX3RvX3N0cmluZ3MoY2hhciAqKnN0cmluZ3MsIGNoYXIgKmFkZCkKK3sKKwljaGFyICp2WzJdOworCXZbMF0gPSBhZGQ7CisJdlsxXSA9IE5VTEw7CisJcmV0dXJuIGFkZF9zdHJpbmdzX3RvX3N0cmluZ3Moc3RyaW5ncywgdiwgLypkdXA6Ki8gMCk7Cit9CisjaWYgTEVBS19IVU5USU5HCitzdGF0aWMgY2hhciAqKnh4X2FkZF9zdHJpbmdfdG9fc3RyaW5ncyhpbnQgbGluZW5vLCBjaGFyICoqc3RyaW5ncywgY2hhciAqYWRkKQoreworCWNoYXIgKipwdHIgPSBhZGRfc3RyaW5nX3RvX3N0cmluZ3Moc3RyaW5ncywgYWRkKTsKKwlmZHByaW50ZigyLCAibGluZSAlZDogYWRkX3N0cmluZ190b19zdHJpbmdzICVwXG4iLCBsaW5lbm8sIHB0cik7CisJcmV0dXJuIHB0cjsKK30KKyNkZWZpbmUgYWRkX3N0cmluZ190b19zdHJpbmdzKHN0cmluZ3MsIGFkZCkgXAorCXh4X2FkZF9zdHJpbmdfdG9fc3RyaW5ncyhfX0xJTkVfXywgc3RyaW5ncywgYWRkKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZyZWVfc3RyaW5ncyhjaGFyICoqc3RyaW5ncykKK3sKKwljaGFyICoqdjsKKworCWlmICghc3RyaW5ncykKKwkJcmV0dXJuOworCXYgPSBzdHJpbmdzOworCXdoaWxlICgqdikgeworCQlmcmVlKCp2KTsKKwkJdisrOworCX0KKwlmcmVlKHN0cmluZ3MpOworfQorCisKKy8qIEhlbHBlcnMgZm9yIHNldHRpbmcgbmV3ICRuIGFuZCByZXN0b3JpbmcgdGhlbSBiYWNrCisgKi8KK3R5cGVkZWYgc3RydWN0IHNhdmVfYXJnX3QgeworCWNoYXIgKnN2X2FyZ3YwOworCWNoYXIgKipzdl9nX2FyZ3Y7CisJaW50IHN2X2dfYXJnYzsKKwlzbWFsbGludCBzdl9nX21hbGxvY2VkOworfSBzYXZlX2FyZ190OworCitzdGF0aWMgdm9pZCBzYXZlX2FuZF9yZXBsYWNlX0dfYXJncyhzYXZlX2FyZ190ICpzdiwgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisKKwlzdi0+c3ZfYXJndjAgPSBhcmd2WzBdOworCXN2LT5zdl9nX2FyZ3YgPSBHLmdsb2JhbF9hcmd2OworCXN2LT5zdl9nX2FyZ2MgPSBHLmdsb2JhbF9hcmdjOworCXN2LT5zdl9nX21hbGxvY2VkID0gRy5nbG9iYWxfYXJnc19tYWxsb2NlZDsKKworCWFyZ3ZbMF0gPSBHLmdsb2JhbF9hcmd2WzBdOyAvKiByZXRhaW4gJDAgKi8KKwlHLmdsb2JhbF9hcmd2ID0gYXJndjsKKwlHLmdsb2JhbF9hcmdzX21hbGxvY2VkID0gMDsKKworCW4gPSAxOworCXdoaWxlICgqKythcmd2KQorCQluKys7CisJRy5nbG9iYWxfYXJnYyA9IG47Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfR19hcmdzKHNhdmVfYXJnX3QgKnN2LCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqcHA7CisKKwlpZiAoRy5nbG9iYWxfYXJnc19tYWxsb2NlZCkgeworCQkvKiBzb21lb25lIHJhbiAic2V0IC0tIGFyZzEgYXJnMiAuLi4iLCB1bmRvICovCisJCXBwID0gRy5nbG9iYWxfYXJndjsKKwkJd2hpbGUgKCorK3BwKSAvKiBub3RlOiBkb2VzIG5vdCBmcmVlICQwICovCisJCQlmcmVlKCpwcCk7CisJCWZyZWUoRy5nbG9iYWxfYXJndik7CisJfQorCWFyZ3ZbMF0gPSBzdi0+c3ZfYXJndjA7CisJRy5nbG9iYWxfYXJndiA9IHN2LT5zdl9nX2FyZ3Y7CisJRy5nbG9iYWxfYXJnYyA9IHN2LT5zdl9nX2FyZ2M7CisJRy5nbG9iYWxfYXJnc19tYWxsb2NlZCA9IHN2LT5zdl9nX21hbGxvY2VkOworfQorCisKKy8qIEJhc2ljIHRoZW9yeSBvZiBzaWduYWwgaGFuZGxpbmcgaW4gc2hlbGwKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoaXMgZG9lcyBub3QgZGVzY3JpYmUgd2hhdCBodXNoIGRvZXMsIHJhdGhlciwgaXQgaXMgY3VycmVudCB1bmRlcnN0YW5kaW5nCisgKiB3aGF0IGl0IF9zaG91bGRfIGRvLiBJZiBpdCBkb2Vzbid0LCBpdCdzIGEgYnVnLgorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwjdHJhcAorICoKKyAqIFNpZ25hbHMgYXJlIGhhbmRsZWQgb25seSBhZnRlciBlYWNoIHBpcGUgKCJjbWQgfCBjbWQgfCBjbWQiIHRoaW5nKQorICogaXMgZmluaXNoZWQgb3IgYmFja2dyb3VuZGVkLiBJdCBpcyB0aGUgc2FtZSBpbiBpbnRlcmFjdGl2ZSBhbmQKKyAqIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbHMsIGFuZCBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAqIGEgdXNlciB0cmFwIGhhbmRsZXIgaXMgaW5zdGFsbGVkIG9yIGEgc2hlbGwgc3BlY2lhbCBvbmUgaXMgaW4gZWZmZWN0LgorICogXkMgb3IgXlogZnJvbSBrZXlib2FyZCBzZWVtcyB0byBleGVjdXRlICJhdCBvbmNlIiBiZWNhdXNlIGl0IHVzdWFsbHkKKyAqIGJhY2tncm91bmRzIChpLmUuIHN0b3BzKSBvciBraWxscyBhbGwgbWVtYmVycyBvZiBjdXJyZW50bHkgcnVubmluZworICogcGlwZS4KKyAqCisgKiBXYWl0IGJ1aWx0aW4gaW4gaW50ZXJydXB0aWJsZSBieSBzaWduYWxzIGZvciB3aGljaCB1c2VyIHRyYXAgaXMgc2V0CisgKiBvciBieSBTSUdJTlQgaW4gaW50ZXJhY3RpdmUgc2hlbGwuCisgKgorICogVHJhcCBoYW5kbGVycyB3aWxsIGV4ZWN1dGUgZXZlbiB3aXRoaW4gdHJhcCBoYW5kbGVycy4gKHJpZ2h0PykKKyAqCisgKiBVc2VyIHRyYXAgaGFuZGxlcnMgYXJlIGZvcmdvdHRlbiB3aGVuIHN1YnNoZWxsICgiKGNtZCkiKSBpcyBlbnRlcmVkLAorICogZXhjZXB0IGZvciBoYW5kbGVycyBzZXQgdG8gJycgKGVtcHR5IHN0cmluZykuCisgKgorICogSWYgam9iIGNvbnRyb2wgaXMgb2ZmLCBiYWNrZ3JvdW5kZWQgY29tbWFuZHMgKCJjbWQgJiIpCisgKiBoYXZlIFNJR0lOVCwgU0lHUVVJVCBzZXQgdG8gU0lHX0lHTi4KKyAqCisgKiBDb21tYW5kcyB3aGljaCBhcmUgcnVuIGluIGNvbW1hbmQgc3Vic3RpdHV0aW9uICgiYGNtZGAiKQorICogaGF2ZSBTSUdUVElOLCBTSUdUVE9VLCBTSUdUU1RQIHNldCB0byBTSUdfSUdOLgorICoKKyAqIE9yZGluYXJ5IGNvbW1hbmRzIGhhdmUgc2lnbmFscyBzZXQgdG8gU0lHX0lHTi9ERkwgYXMgaW5oZXJpdGVkCisgKiBieSB0aGUgc2hlbGwgZnJvbSBpdHMgcGFyZW50LgorICoKKyAqIFNpZ25hbHMgd2hpY2ggZGlmZmVyIGZyb20gU0lHX0RGTCBhY3Rpb24KKyAqIChub3RlOiBjaGlsZCAoaS5lLiwgW3ZdZm9ya2VkKSBzaGVsbCBpcyBub3QgYW4gaW50ZXJhY3RpdmUgc2hlbGwpOgorICoKKyAqIFNJR1FVSVQ6IGlnbm9yZQorICogU0lHVEVSTSAoaW50ZXJhY3RpdmUpOiBpZ25vcmUKKyAqIFNJR0hVUCAoaW50ZXJhY3RpdmUpOgorICogICAgc2VuZCBTSUdDT05UIHRvIHN0b3BwZWQgam9icywgc2VuZCBTSUdIVVAgdG8gYWxsIGpvYnMgYW5kIGV4aXQKKyAqIFNJR1RUSU4sIFNJR1RUT1UsIFNJR1RTVFAgKGlmIGpvYiBjb250cm9sIGlzIG9uKTogaWdub3JlCisgKiAgICBOb3RlIHRoYXQgXlogaXMgaGFuZGxlZCBub3QgYnkgdHJhcHBpbmcgU0lHVFNUUCwgYnV0IGJ5IHNlZWluZworICogICAgdGhhdCBhbGwgcGlwZSBtZW1iZXJzIGFyZSBzdG9wcGVkLiBUcnkgdGhpcyBpbiBiYXNoOgorICogICAgd2hpbGUgOjsgZG8gOjsgZG9uZSAtIF5aIGRvZXMgbm90IGJhY2tncm91bmQgaXQKKyAqICAgICh3aGlsZSA6OyBkbyA6OyBkb25lKSAtIF5aIGJhY2tncm91bmRzIGl0CisgKiBTSUdJTlQgKGludGVyYWN0aXZlKTogd2FpdCBmb3IgbGFzdCBwaXBlLCBpZ25vcmUgdGhlIHJlc3QKKyAqICAgIG9mIHRoZSBjb21tYW5kIGxpbmUsIHNob3cgcHJvbXB0LiBOQjogXkMgZG9lcyBub3Qgc2VuZCBTSUdJTlQKKyAqICAgIHRvIGludGVyYWN0aXZlIHNoZWxsIHdoaWxlIHNoZWxsIGlzIHdhaXRpbmcgZm9yIGEgcGlwZSwKKyAqICAgIHNpbmNlIHNoZWxsIGlzIGJnJ2VkIChpcyBub3QgaW4gZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwKS4KKyAqICAgIEV4YW1wbGUgMTogdGhpcyB3YWl0cyA1IHNlYywgYnV0IGRvZXMgbm90IGV4ZWN1dGUgbHM6CisgKiAgICAiZWNobyAkJDsgc2xlZXAgNTsgbHMgLWwiICsgImtpbGwgLUlOVCA8cGlkPiIKKyAqICAgIEV4YW1wbGUgMjogdGhpcyBkb2VzIG5vdCB3YWl0IGFuZCBkb2VzIG5vdCBleGVjdXRlIGxzOgorICogICAgImVjaG8gJCQ7IHNsZWVwIDUgJiB3YWl0OyBscyAtbCIgKyAia2lsbCAtSU5UIDxwaWQ+IgorICogICAgRXhhbXBsZSAzOiB0aGlzIGRvZXMgbm90IHdhaXQgNSBzZWMsIGJ1dCBleGVjdXRlcyBsczoKKyAqICAgICJzbGVlcCA1OyBscyAtbCIgKyBwcmVzcyBeQworICogICAgRXhhbXBsZSA0OiB0aGlzIGRvZXMgbm90IHdhaXQgYW5kIGRvZXMgbm90IGV4ZWN1dGUgbHM6CisgKiAgICAic2xlZXAgNSAmIHdhaXQ7IGxzIC1sIiArIHByZXNzIF5DCisgKgorICogKFdoYXQgaGFwcGVucyB0byBzaWduYWxzIHdoaWNoIGFyZSBJR04gb24gc2hlbGwgc3RhcnQ/KQorICogKFdoYXQgaGFwcGVucyB3aXRoIHNpZ25hbCBtYXNrIG9uIHNoZWxsIHN0YXJ0PykKKyAqCisgKiBPbGQgaW1wbGVtZW50YXRpb24KKyAqID09PT09PT09PT09PT09PT09PQorICogV2UgdXNlIGluLWtlcm5lbCBwZW5kaW5nIHNpZ25hbCBtYXNrIHRvIGRldGVybWluZSB3aGljaCBzaWduYWxzIHdlcmUgc2VudC4KKyAqIFdlIGJsb2NrIGFsbCBzaWduYWxzIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gdGFrZSBhY3Rpb24gaW1tZWRpYXRlbHksCisgKiBpLmUuIHdlIGJsb2NrIGFsbCBzaWduYWxzIHdoaWNoIG5lZWQgdG8gaGF2ZSBzcGVjaWFsIGhhbmRsaW5nIGFzIGRlc2NyaWJlZAorICogYWJvdmUsIGFuZCBhbGwgc2lnbmFscyB3aGljaCBoYXZlIHRyYXBzIHNldC4KKyAqIEFmdGVyIGVhY2ggcGlwZSBleGVjdXRpb24sIHdlIGV4dHJhY3QgYW55IHBlbmRpbmcgc2lnbmFscyB2aWEgc2lndGltZWR3YWl0KCkKKyAqIGFuZCBhY3Qgb24gdGhlbS4KKyAqCisgKiB1bnNpZ25lZCBzcGVjaWFsX3NpZ19tYXNrOiBhIG1hc2sgb2Ygc3VjaCAic3BlY2lhbCIgc2lnbmFscworICogc2lnc2V0X3QgYmxvY2tlZF9zZXQ6ICBjdXJyZW50IGJsb2NrZWQgc2lnbmFsIHNldAorICoKKyAqICJ0cmFwIC0gU0lHeHh4IjoKKyAqICAgIGNsZWFyIGJpdCBpbiBibG9ja2VkX3NldCB1bmxlc3MgaXQgaXMgYWxzbyBpbiBzcGVjaWFsX3NpZ19tYXNrCisgKiAidHJhcCAnY21kJyBTSUd4eHgiOgorICogICAgc2V0IGJpdCBpbiBibG9ja2VkX3NldCAoZXZlbiBpZiAnY21kJyBpcyAnJykKKyAqIGFmdGVyIFt2XWZvcmssIGlmIHdlIHBsYW4gdG8gYmUgYSBzaGVsbDoKKyAqICAgIHVuYmxvY2sgc2lnbmFscyB3aXRoIHNwZWNpYWwgaW50ZXJhY3RpdmUgaGFuZGxpbmcKKyAqICAgIChjaGlsZCBzaGVsbCBpcyBub3QgaW50ZXJhY3RpdmUpLAorICogICAgdW5zZXQgYWxsIHRyYXBzIGV4Y2VwdCAnJyAobm90ZTogcmVnYXJkbGVzcyBvZiBjaGlsZCBzaGVsbCdzIHR5cGUgLSB7fSwgKCksIGV0YykKKyAqIGFmdGVyIFt2XWZvcmssIGlmIHdlIHBsYW4gdG8gZXhlYzoKKyAqICAgIFBPU0lYIHNheXMgZm9yayBjbGVhcnMgcGVuZGluZyBzaWduYWwgbWFzayBpbiBjaGlsZCAtIG5vIG5lZWQgdG8gY2xlYXIgaXQuCisgKiAgICBSZXN0b3JlIGJsb2NrZWQgc2lnbmFsIHNldCB0byBvbmUgaW5oZXJpdGVkIGJ5IHNoZWxsIGp1c3QgcHJpb3IgdG8gZXhlYy4KKyAqCisgKiBOb3RlOiBhcyBhIHJlc3VsdCwgd2UgZG8gbm90IHVzZSBzaWduYWwgaGFuZGxlcnMgbXVjaC4gVGhlIG9ubHkgdXNlcworICogYXJlIHRvIGNvdW50IFNJR0NITERzCisgKiBhbmQgdG8gcmVzdG9yZSB0dHkgcGdycCBvbiBzaWduYWwtaW5kdWNlZCBleGl0LgorICoKKyAqIE5vdGUgMiAoY29tcGF0KToKKyAqIFN0YW5kYXJkIHNheXMgIldoZW4gYSBzdWJzaGVsbCBpcyBlbnRlcmVkLCB0cmFwcyB0aGF0IGFyZSBub3QgYmVpbmcgaWdub3JlZAorICogYXJlIHNldCB0byB0aGUgZGVmYXVsdCBhY3Rpb25zIi4gYmFzaCBpbnRlcnByZXRzIGl0IHNvIHRoYXQgdHJhcHMgd2hpY2gKKyAqIGFyZSBzZXQgdG8gJycgKGlnbm9yZSkgYXJlIE5PVCByZXNldCB0byBkZWZhdWx0cy4gV2UgZG8gdGhlIHNhbWUuCisgKgorICogUHJvYmxlbTogdGhlIGFib3ZlIGFwcHJvYWNoIG1ha2VzIGl0IHVud2llbGR5IHRvIGNhdGNoIHNpZ25hbHMgd2hpbGUKKyAqIHdlIGFyZSBpbiByZWFkIGJ1aWx0aW4sIG9mIHdoaWxlIHdlIHJlYWQgY29tbWFuZHMgZnJvbSBzdGRpbjoKKyAqIG1hc2tlZCBzaWduYWxzIGFyZSBub3QgdmlzaWJsZSEKKyAqCisgKiBOZXcgaW1wbGVtZW50YXRpb24KKyAqID09PT09PT09PT09PT09PT09PQorICogV2UgcmVjb3JkIGVhY2ggc2lnbmFsIHdlIGFyZSBpbnRlcmVzdGVkIGluIGJ5IGluc3RhbGxpbmcgc2lnbmFsIGhhbmRsZXIKKyAqIGZvciB0aGVtIC0gYSBiaXQgbGlrZSBlbXVsYXRpbmcga2VybmVsIHBlbmRpbmcgc2lnbmFsIG1hc2sgaW4gdXNlcnNwYWNlLgorICogV2UgYXJlIGludGVyZXN0ZWQgaW46IHNpZ25hbHMgd2hpY2ggbmVlZCB0byBoYXZlIHNwZWNpYWwgaGFuZGxpbmcKKyAqIGFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIGFsbCBzaWduYWxzIHdoaWNoIGhhdmUgdHJhcHMgc2V0LgorICogU2lnbmFscyBhcmUgcm9jb3JkZWQgaW4gcGVuZGluZ19zZXQuCisgKiBBZnRlciBlYWNoIHBpcGUgZXhlY3V0aW9uLCB3ZSBleHRyYWN0IGFueSBwZW5kaW5nIHNpZ25hbHMKKyAqIGFuZCBhY3Qgb24gdGhlbS4KKyAqCisgKiB1bnNpZ25lZCBzcGVjaWFsX3NpZ19tYXNrOiBhIG1hc2sgb2Ygc2hlbGwtc3BlY2lhbCBzaWduYWxzLgorICogdW5zaWduZWQgZmF0YWxfc2lnX21hc2s6IGEgbWFzayBvZiBzaWduYWxzIG9uIHdoaWNoIHdlIHJlc3RvcmUgdHR5IHBncnAuCisgKiBjaGFyICp0cmFwc1tzaWddIGlmIHRyYXAgZm9yIHNpZyBpcyBzZXQgKGV2ZW4gaWYgaXQncyAnJykuCisgKiBzaWdzZXRfdCBwZW5kaW5nX3NldDogc2V0IG9mIHNpZ3Mgd2UgcmVjZWl2ZWQuCisgKgorICogInRyYXAgLSBTSUd4eHgiOgorICogICAgaWYgc2lnIGlzIGluIHNwZWNpYWxfc2lnX21hc2ssIHNldCBoYW5kbGVyIGJhY2sgdG86CisgKiAgICAgICAgcmVjb3JkX3BlbmRpbmdfc2lnbm8sIG9yIHRvIElHTiBpZiBpdCdzIGEgdHR5IHN0b3Agc2lnbmFsCisgKiAgICBpZiBzaWcgaXMgaW4gZmF0YWxfc2lnX21hc2ssIHNldCBoYW5kbGVyIGJhY2sgdG8gc2lnZXhpdC4KKyAqICAgIGVsc2U6IHNldCBoYW5kbGVyIGJhY2sgdG8gU0lHX0RGTAorICogInRyYXAgJ2NtZCcgU0lHeHh4IjoKKyAqICAgIHNldCBoYW5kbGVyIHRvIHJlY29yZF9wZW5kaW5nX3NpZ25vLgorICogInRyYXAgJycgU0lHeHh4IjoKKyAqICAgIHNldCBoYW5kbGVyIHRvIFNJR19JR04uCisgKiBhZnRlciBbdl1mb3JrLCBpZiB3ZSBwbGFuIHRvIGJlIGEgc2hlbGw6CisgKiAgICBzZXQgc2lnbmFscyB3aXRoIHNwZWNpYWwgaW50ZXJhY3RpdmUgaGFuZGxpbmcgdG8gU0lHX0RGTAorICogICAgKGJlY2F1c2UgY2hpbGQgc2hlbGwgaXMgbm90IGludGVyYWN0aXZlKSwKKyAqICAgIHVuc2V0IGFsbCB0cmFwcyBleGNlcHQgJycgKG5vdGU6IHJlZ2FyZGxlc3Mgb2YgY2hpbGQgc2hlbGwncyB0eXBlIC0ge30sICgpLCBldGMpCisgKiBhZnRlciBbdl1mb3JrLCBpZiB3ZSBwbGFuIHRvIGV4ZWM6CisgKiAgICBQT1NJWCBzYXlzIGZvcmsgY2xlYXJzIHBlbmRpbmcgc2lnbmFsIG1hc2sgaW4gY2hpbGQgLSBubyBuZWVkIHRvIGNsZWFyIGl0LgorICoKKyAqIFRvIG1ha2Ugd2FpdCBidWlsdGluIGludGVycnVwdGlibGUsIHdlIGhhbmRsZSBTSUdDSExEIGFzIHNwZWNpYWwgc2lnbmFsLAorICogb3RoZXJ3aXNlIChpZiB3ZSBsZWF2ZSBpdCBTSUdfREZMKSBzaWdzdXNwZW5kIGluIHdhaXQgYnVpbHRpbiB3aWxsIG5vdCB3YWtlIHVwIG9uIGl0LgorICoKKyAqIE5vdGUgKGNvbXBhdCk6CisgKiBTdGFuZGFyZCBzYXlzICJXaGVuIGEgc3Vic2hlbGwgaXMgZW50ZXJlZCwgdHJhcHMgdGhhdCBhcmUgbm90IGJlaW5nIGlnbm9yZWQKKyAqIGFyZSBzZXQgdG8gdGhlIGRlZmF1bHQgYWN0aW9ucyIuIGJhc2ggaW50ZXJwcmV0cyBpdCBzbyB0aGF0IHRyYXBzIHdoaWNoCisgKiBhcmUgc2V0IHRvICcnIChpZ25vcmUpIGFyZSBOT1QgcmVzZXQgdG8gZGVmYXVsdHMuIFdlIGRvIHRoZSBzYW1lLgorICovCitlbnVtIHsKKwlTUEVDSUFMX0lOVEVSQUNUSVZFX1NJR1MgPSAwCisJCXwgKDEgPDwgU0lHVEVSTSkKKwkJfCAoMSA8PCBTSUdJTlQpCisJCXwgKDEgPDwgU0lHSFVQKQorCQksCisJU1BFQ0lBTF9KT0JTVE9QX1NJR1MgPSAwCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCXwgKDEgPDwgU0lHVFRJTikKKwkJfCAoMSA8PCBTSUdUVE9VKQorCQl8ICgxIDw8IFNJR1RTVFApCisjZW5kaWYKKwkJLAorfTsKKworc3RhdGljIHZvaWQgcmVjb3JkX3BlbmRpbmdfc2lnbm8oaW50IHNpZykKK3sKKwlzaWdhZGRzZXQoJkcucGVuZGluZ19zZXQsIHNpZyk7CisjaWYgRU5BQkxFX0hVU0hfRkFTVAorCWlmIChzaWcgPT0gU0lHQ0hMRCkgeworCQlHLmNvdW50X1NJR0NITEQrKzsKKy8vYmJfZXJyb3JfbXNnKCJbJWRdIFNJR0NITERfaGFuZGxlcjogRy5jb3VudF9TSUdDSExEOiVkIEcuaGFuZGxlZF9TSUdDSExEOiVkIiwgZ2V0cGlkKCksIEcuY291bnRfU0lHQ0hMRCwgRy5oYW5kbGVkX1NJR0NITEQpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgc2lnaGFuZGxlcl90IGluc3RhbGxfc2lnaGFuZGxlcihpbnQgc2lnLCBzaWdoYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIG9sZF9zYTsKKworCS8qIFdlIGNvdWxkIHVzZSBzaWduYWwoKSB0byBpbnN0YWxsIGhhbmRsZXJzLi4uIGFsbW9zdDoKKwkgKiBleGNlcHQgdGhhdCB3ZSBuZWVkIHRvIG1hc2sgQUxMIHNpZ25hbHMgd2hpbGUgaGFuZGxlcnMgcnVuLgorCSAqIEkgc2F3IHNpZ25hbCBuZXN0aW5nIGluIHN0cmFjZSwgcmFjZSB3aW5kb3cgaXNuJ3Qgc21hbGwuCisJICogU0FfUkVTVEFSVCBpcyBhbHNvIG5lZWRlZCwgYnV0IGluIExpbnV4LCBzaWduYWwoKQorCSAqIHNldHMgU0FfUkVTVEFSVCB0b28uCisJICovCisJLyogbWVtc2V0KCZHLnNhLCAwLCBzaXplb2YoRy5zYSkpOyAtIGFscmVhZHkgZG9uZSAqLworCS8qIHNpZ2ZpbGxzZXQoJkcuc2Euc2FfbWFzayk7ICAgICAgLSBhbHJlYWR5IGRvbmUgKi8KKwkvKiBHLnNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsgICAgIC0gYWxyZWFkeSBkb25lICovCisJRy5zYS5zYV9oYW5kbGVyID0gaGFuZGxlcjsKKwlzaWdhY3Rpb24oc2lnLCAmRy5zYSwgJm9sZF9zYSk7CisJcmV0dXJuIG9sZF9zYS5zYV9oYW5kbGVyOworfQorCisjaWYgRU5BQkxFX0hVU0hfSk9CCisKKy8qIEFmdGVyIFt2XWZvcmssIGluIGNoaWxkOiBkbyBub3QgcmVzdG9yZSB0dHkgcGdycCBvbiB4ZnVuYyBkZWF0aCAqLworIyBkZWZpbmUgZGlzYWJsZV9yZXN0b3JlX3R0eV9wZ3JwX29uX2V4aXQoKSAoZGllX3NsZWVwID0gMCkKKy8qIEFmdGVyIFt2XWZvcmssIGluIHBhcmVudDogcmVzdG9yZSB0dHkgcGdycCBvbiB4ZnVuYyBkZWF0aCAqLworIyBkZWZpbmUgZW5hYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpICAoZGllX3NsZWVwID0gLTEpCisKKy8qIFJlc3RvcmVzIHR0eSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAsIGFuZCBleGl0cy4KKyAqIE1heSBiZSBjYWxsZWQgYXMgc2lnbmFsIGhhbmRsZXIgZm9yIGZhdGFsIHNpZ25hbAorICogKHdpbGwgcmVzZW5kIHNpZ25hbCB0byBpdHNlbGYsIHByb2R1Y2luZyBjb3JyZWN0IGV4aXQgc3RhdGUpCisgKiBvciBjYWxsZWQgZGlyZWN0bHkgd2l0aCAtRVhJVENPREUuCisgKiBXZSBhbHNvIGNhbGwgaXQgaWYgeGZ1bmMgaXMgZXhpdGluZy4gKi8KK3N0YXRpYyB2b2lkIHNpZ2V4aXQoaW50IHNpZykgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBzaWdleGl0KGludCBzaWcpCit7CisJLyogQ2FyZWZ1bDogd2UgY2FuIGVuZCB1cCBoZXJlIGFmdGVyIFt2XWZvcmsuIERvIG5vdCByZXN0b3JlCisJICogdHR5IHBncnAgdGhlbiwgb25seSB0b3AtbGV2ZWwgc2hlbGwgcHJvY2VzcyBkb2VzIHRoYXQgKi8KKwlpZiAoR19zYXZlZF90dHlfcGdycCAmJiBnZXRwaWQoKSA9PSBHLnJvb3RfcGlkKSB7CisJCS8qIERpc2FibGUgYWxsIHNpZ25hbHM6IGpvYiBjb250cm9sLCBTSUdQSVBFLCBldGMuCisJCSAqIE1vc3RseSBwYXJhbm9pZCBtZWFzdXJlLCB0byBwcmV2ZW50IGluZmluaXRlIFNJR1RUT1UuCisJCSAqLworCQlzaWdwcm9jbWFza19hbGxzaWdzKFNJR19CTE9DSyk7CisJCXRjc2V0cGdycChHX2ludGVyYWN0aXZlX2ZkLCBHX3NhdmVkX3R0eV9wZ3JwKTsKKwl9CisKKwkvKiBOb3QgYSBzaWduYWwsIGp1c3QgZXhpdCAqLworCWlmIChzaWcgPD0gMCkKKwkJX2V4aXQoLSBzaWcpOworCisJa2lsbF9teXNlbGZfd2l0aF9zaWcoc2lnKTsgLyogZG9lcyBub3QgcmV0dXJuICovCit9CisjZWxzZQorCisjIGRlZmluZSBkaXNhYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpICgodm9pZCkwKQorIyBkZWZpbmUgZW5hYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpICAoKHZvaWQpMCkKKworI2VuZGlmCisKK3N0YXRpYyBzaWdoYW5kbGVyX3QgcGlja19zaWdoYW5kbGVyKHVuc2lnbmVkIHNpZykKK3sKKwlzaWdoYW5kbGVyX3QgaGFuZGxlciA9IFNJR19ERkw7CisJaWYgKHNpZyA8IHNpemVvZih1bnNpZ25lZCkqOCkgeworCQl1bnNpZ25lZCBzaWdtYXNrID0gKDEgPDwgc2lnKTsKKworI2lmIEVOQUJMRV9IVVNIX0pPQgorCQkvKiBpcyBzaWcgZmF0YWw/ICovCisJCWlmIChHX2ZhdGFsX3NpZ19tYXNrICYgc2lnbWFzaykKKwkJCWhhbmRsZXIgPSBzaWdleGl0OworCQllbHNlCisjZW5kaWYKKwkJLyogc2lnIGhhcyBzcGVjaWFsIGhhbmRsaW5nPyAqLworCQlpZiAoRy5zcGVjaWFsX3NpZ19tYXNrICYgc2lnbWFzaykgeworCQkJaGFuZGxlciA9IHJlY29yZF9wZW5kaW5nX3NpZ25vOworCQkJLyogVFRJTi9UVE9VL1RTVFAgY2FuJ3QgYmUgc2V0IHRvIHJlY29yZF9wZW5kaW5nX3NpZ25vCisJCQkgKiBpbiBvcmRlciB0byBpZ25vcmUgdGhlbTogdGhleSB3aWxsIGJlIHJhaXNlZAorCQkJICogaW4gYW4gZW5kbGVzcyBsb29wIHdoZW4gd2UgdHJ5IHRvIGRvIHNvbWUKKwkJCSAqIHRlcm1pbmFsIGlvY3RscyEgV2UgZG8gaGF2ZSB0byBfaWdub3JlXyB0aGVzZS4KKwkJCSAqLworCQkJaWYgKFNQRUNJQUxfSk9CU1RPUF9TSUdTICYgc2lnbWFzaykKKwkJCQloYW5kbGVyID0gU0lHX0lHTjsKKwkJfQorCX0KKwlyZXR1cm4gaGFuZGxlcjsKK30KKworLyogUmVzdG9yZXMgdHR5IGZvcmVncm91bmQgcHJvY2VzcyBncm91cCwgYW5kIGV4aXRzLiAqLworc3RhdGljIHZvaWQgaHVzaF9leGl0KGludCBleGl0Y29kZSkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBodXNoX2V4aXQoaW50IGV4aXRjb2RlKQoreworCWZmbHVzaF9hbGwoKTsKKwlpZiAoRy5leGl0aW5nIDw9IDAgJiYgRy50cmFwcyAmJiBHLnRyYXBzWzBdICYmIEcudHJhcHNbMF1bMF0pIHsKKwkJY2hhciAqYXJndlszXTsKKwkJLyogYXJndlswXSBpcyB1bnVzZWQgKi8KKwkJYXJndlsxXSA9IEcudHJhcHNbMF07CisJCWFyZ3ZbMl0gPSBOVUxMOworCQlHLmV4aXRpbmcgPSAxOyAvKiBwcmV2ZW50IEVYSVQgdHJhcCByZWN1cnNpb24gKi8KKwkJLyogTm90ZTogRy50cmFwc1swXSBpcyBub3QgY2xlYXJlZCEKKwkJICogInRyYXAiIHdpbGwgc3RpbGwgc2hvdyBpdCwgaWYgZXhlY3V0ZWQKKwkJICogaW4gdGhlIGhhbmRsZXIgKi8KKwkJYnVpbHRpbl9ldmFsKGFyZ3YpOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCisJeworCQlzdHJ1Y3QgdmFyaWFibGUgKmN1cl92YXI7CisJCWlmIChHLmN3ZCAhPSBiYl9tc2dfdW5rbm93bikKKwkJCWZyZWUoKGNoYXIqKUcuY3dkKTsKKwkJY3VyX3ZhciA9IEcudG9wX3ZhcjsKKwkJd2hpbGUgKGN1cl92YXIpIHsKKwkJCXN0cnVjdCB2YXJpYWJsZSAqdG1wID0gY3VyX3ZhcjsKKwkJCWlmICghY3VyX3Zhci0+bWF4X2xlbikKKwkJCQlmcmVlKGN1cl92YXItPnZhcnN0cik7CisJCQljdXJfdmFyID0gY3VyX3Zhci0+bmV4dDsKKwkJCWZyZWUodG1wKTsKKwkJfQorCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJZmZsdXNoX2FsbCgpOworCXNpZ2V4aXQoLSAoZXhpdGNvZGUgJiAweGZmKSk7CisjZWxzZQorCWV4aXQoZXhpdGNvZGUpOworI2VuZGlmCit9CisKKworLy9UT0RPOiByZXR1cm4gYSBtYXNrIG9mIEFMTCBoYW5kbGVkIHNpZ3M/CitzdGF0aWMgaW50IGNoZWNrX2FuZF9ydW5fdHJhcHModm9pZCkKK3sKKwlpbnQgbGFzdF9zaWcgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHNpZzsKKworCQlpZiAoc2lnaXNlbXB0eXNldCgmRy5wZW5kaW5nX3NldCkpCisJCQlicmVhazsKKwkJc2lnID0gMDsKKwkJZG8geworCQkJc2lnKys7CisJCQlpZiAoc2lnaXNtZW1iZXIoJkcucGVuZGluZ19zZXQsIHNpZykpIHsKKwkJCQlzaWdkZWxzZXQoJkcucGVuZGluZ19zZXQsIHNpZyk7CisJCQkJZ290byBnb3Rfc2lnOworCQkJfQorCQl9IHdoaWxlIChzaWcgPCBOU0lHKTsKKwkJYnJlYWs7CisgZ290X3NpZzoKKwkJaWYgKEcudHJhcHMgJiYgRy50cmFwc1tzaWddKSB7CisJCQlpZiAoRy50cmFwc1tzaWddWzBdKSB7CisJCQkJLyogV2UgaGF2ZSB1c2VyLWRlZmluZWQgaGFuZGxlciAqLworCQkJCXNtYWxsdWludCBzYXZlX3Jjb2RlOworCQkJCWNoYXIgKmFyZ3ZbM107CisJCQkJLyogYXJndlswXSBpcyB1bnVzZWQgKi8KKwkJCQlhcmd2WzFdID0gRy50cmFwc1tzaWddOworCQkJCWFyZ3ZbMl0gPSBOVUxMOworCQkJCXNhdmVfcmNvZGUgPSBHLmxhc3RfZXhpdGNvZGU7CisJCQkJYnVpbHRpbl9ldmFsKGFyZ3YpOworCQkJCUcubGFzdF9leGl0Y29kZSA9IHNhdmVfcmNvZGU7CisJCQkJbGFzdF9zaWcgPSBzaWc7CisJCQl9IC8qIGVsc2U6ICIiIHRyYXAsIGlnbm9yaW5nIHNpZ25hbCAqLworCQkJY29udGludWU7CisJCX0KKwkJLyogbm90IGEgdHJhcDogc3BlY2lhbCBhY3Rpb24gKi8KKwkJc3dpdGNoIChzaWcpIHsKKwkJY2FzZSBTSUdJTlQ6CisJCQkvKiBCdWlsdGluIHdhcyBeQydlZCwgbWFrZSBpdCBsb29rIHByZXR0aWVyOiAqLworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCUcuZmxhZ19TSUdJTlQgPSAxOworCQkJbGFzdF9zaWcgPSBzaWc7CisJCQlicmVhazsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJY2FzZSBTSUdIVVA6IHsKKwkJCXN0cnVjdCBwaXBlICpqb2I7CisJCQkvKiBiYXNoIGlzIG9ic2VydmVkIHRvIHNpZ25hbCB3aG9sZSBwcm9jZXNzIGdyb3VwcywKKwkJCSAqIG5vdCBpbmRpdmlkdWFsIHByb2Nlc3NlcyAqLworCQkJZm9yIChqb2IgPSBHLmpvYl9saXN0OyBqb2I7IGpvYiA9IGpvYi0+bmV4dCkgeworCQkJCWlmIChqb2ItPnBncnAgPD0gMCkKKwkJCQkJY29udGludWU7CisJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIkhVUGluZyBwZ3JwICVkXG4iLCBqb2ItPnBncnApOworCQkJCWlmIChraWxsKC0gam9iLT5wZ3JwLCBTSUdIVVApID09IDApCisJCQkJCWtpbGwoLSBqb2ItPnBncnAsIFNJR0NPTlQpOworCQkJfQorCQkJc2lnZXhpdChTSUdIVVApOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJCWNhc2UgU0lHQ0hMRDoKKwkJCUcuY291bnRfU0lHQ0hMRCsrOworLy9iYl9lcnJvcl9tc2coIlslZF0gY2hlY2tfYW5kX3J1bl90cmFwczogRy5jb3VudF9TSUdDSExEOiVkIEcuaGFuZGxlZF9TSUdDSExEOiVkIiwgZ2V0cGlkKCksIEcuY291bnRfU0lHQ0hMRCwgRy5oYW5kbGVkX1NJR0NITEQpOworCQkJLyogTm90ZToKKwkJCSAqIFdlIGRvbnQgZG8gJ2xhc3Rfc2lnID0gc2lnJyBoZXJlIC0+IE5PVCByZXR1cm5pbmcgdGhpcyBzaWcuCisJCQkgKiBUaGlzIHNpbXBsaWZpZXMgd2FpdCBidWlsdGluIGEgYml0LgorCQkJICovCisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OiAvKiBpZ25vcmVkOiAqLworCQkJLyogU0lHVEVSTSwgU0lHUVVJVCwgU0lHVFRJTiwgU0lHVFRPVSwgU0lHVFNUUCAqLworCQkJLyogTm90ZToKKwkJCSAqIFdlIGRvbnQgZG8gJ2xhc3Rfc2lnID0gc2lnJyBoZXJlIC0+IE5PVCByZXR1cm5pbmcgdGhpcyBzaWcuCisJCQkgKiBFeGFtcGxlOiB3YWl0IGlzIG5vdCBpbnRlcnJ1cHRlZCBieSBURVJNCisJCQkgKiBpbiBpbnRlcmFjdGl2ZSBzaGVsbCwgYmVjYXVzZSBURVJNIGlzIGlnbm9yZWQuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBsYXN0X3NpZzsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2N3ZChpbnQgZm9yY2UpCit7CisJaWYgKGZvcmNlIHx8IEcuY3dkID09IE5VTEwpIHsKKwkJLyogeHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oYXJnKSBjYWxscyBmcmVlKGFyZyksCisJCSAqIHdlIG11c3Qgbm90IHRyeSB0byBmcmVlKGJiX21zZ191bmtub3duKSAqLworCQlpZiAoRy5jd2QgPT0gYmJfbXNnX3Vua25vd24pCisJCQlHLmN3ZCA9IE5VTEw7CisJCUcuY3dkID0geHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oKGNoYXIgKilHLmN3ZCk7CisJCWlmICghRy5jd2QpCisJCQlHLmN3ZCA9IGJiX21zZ191bmtub3duOworCX0KKwlyZXR1cm4gRy5jd2Q7Cit9CisKKworLyoKKyAqIFNoZWxsIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBzdXBwb3J0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgdmFyaWFibGUgKipnZXRfcHRyX3RvX2xvY2FsX3Zhcihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHZhcmlhYmxlICoqcHA7CisJc3RydWN0IHZhcmlhYmxlICpjdXI7CisKKwlwcCA9ICZHLnRvcF92YXI7CisJd2hpbGUgKChjdXIgPSAqcHApICE9IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAoY3VyLT52YXJzdHIsIG5hbWUsIGxlbikgPT0gMCAmJiBjdXItPnZhcnN0cltsZW5dID09ICc9JykKKwkJCXJldHVybiBwcDsKKwkJcHAgPSAmY3VyLT5uZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIEZBU1RfRlVOQyBnZXRfbG9jYWxfdmFyX3ZhbHVlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHZhcmlhYmxlICoqdnBwOworCXVuc2lnbmVkIGxlbiA9IHN0cmxlbihuYW1lKTsKKworCWlmIChHLmV4cGFuZGVkX2Fzc2lnbm1lbnRzKSB7CisJCWNoYXIgKipjcHAgPSBHLmV4cGFuZGVkX2Fzc2lnbm1lbnRzOworCQl3aGlsZSAoKmNwcCkgeworCQkJY2hhciAqY3AgPSAqY3BwOworCQkJaWYgKHN0cm5jbXAoY3AsIG5hbWUsIGxlbikgPT0gMCAmJiBjcFtsZW5dID09ICc9JykKKwkJCQlyZXR1cm4gY3AgKyBsZW4gKyAxOworCQkJY3BwKys7CisJCX0KKwl9CisKKwl2cHAgPSBnZXRfcHRyX3RvX2xvY2FsX3ZhcihuYW1lLCBsZW4pOworCWlmICh2cHApCisJCXJldHVybiAoKnZwcCktPnZhcnN0ciArIGxlbiArIDE7CisKKwlpZiAoc3RyY21wKG5hbWUsICJQUElEIikgPT0gMCkKKwkJcmV0dXJuIHV0b2EoRy5yb290X3BwaWQpOworCS8vIGJhc2ggY29tcGF0OiBVSUQ/IEVVSUQ/CisjaWYgRU5BQkxFX0hVU0hfUkFORE9NX1NVUFBPUlQKKwlpZiAoc3RyY21wKG5hbWUsICJSQU5ET00iKSA9PSAwKQorCQlyZXR1cm4gdXRvYShuZXh0X3JhbmRvbSgmRy5yYW5kb21fZ2VuKSk7CisjZW5kaWYKKwlyZXR1cm4gTlVMTDsKK30KKworLyogc3RyIGhvbGRzICJOQU1FPVZBTCIgYW5kIGlzIGV4cGVjdGVkIHRvIGJlIG1hbGxvY2VkLgorICogV2UgdGFrZSBvd25lcnNoaXAgb2YgaXQuCisgKiBmbGdfZXhwb3J0OgorICogIDA6IGRvIG5vdCBjaGFuZ2UgZXhwb3J0IGZsYWcKKyAqICAgICAoaWYgY3JlYXRpbmcgbmV3IHZhcmlhYmxlLCBmbGFnIHdpbGwgYmUgMCkKKyAqICAxOiBzZXQgZXhwb3J0IGZsYWcgYW5kIHB1dGVudiB0aGUgdmFyaWFibGUKKyAqIC0xOiBjbGVhciBleHBvcnQgZmxhZyBhbmQgdW5zZXRlbnYgdGhlIHZhcmlhYmxlCisgKiBmbGdfcmVhZF9vbmx5IGlzIHNldCBvbmx5IHdoZW4gd2UgaGFuZGxlIC1SIHZhcj12YWwKKyAqLworI2lmICFCQl9NTVUgJiYgRU5BQkxFX0hVU0hfTE9DQUwKKy8qIGFsbCBwYXJhbXMgYXJlIHVzZWQgKi8KKyNlbGlmIEJCX01NVSAmJiBFTkFCTEVfSFVTSF9MT0NBTAorI2RlZmluZSBzZXRfbG9jYWxfdmFyKHN0ciwgZmxnX2V4cG9ydCwgbG9jYWxfbHZsLCBmbGdfcmVhZF9vbmx5KSBcCisJc2V0X2xvY2FsX3ZhcihzdHIsIGZsZ19leHBvcnQsIGxvY2FsX2x2bCkKKyNlbGlmIEJCX01NVSAmJiAhRU5BQkxFX0hVU0hfTE9DQUwKKyNkZWZpbmUgc2V0X2xvY2FsX3ZhcihzdHIsIGZsZ19leHBvcnQsIGxvY2FsX2x2bCwgZmxnX3JlYWRfb25seSkgXAorCXNldF9sb2NhbF92YXIoc3RyLCBmbGdfZXhwb3J0KQorI2VsaWYgIUJCX01NVSAmJiAhRU5BQkxFX0hVU0hfTE9DQUwKKyNkZWZpbmUgc2V0X2xvY2FsX3ZhcihzdHIsIGZsZ19leHBvcnQsIGxvY2FsX2x2bCwgZmxnX3JlYWRfb25seSkgXAorCXNldF9sb2NhbF92YXIoc3RyLCBmbGdfZXhwb3J0LCBmbGdfcmVhZF9vbmx5KQorI2VuZGlmCitzdGF0aWMgaW50IHNldF9sb2NhbF92YXIoY2hhciAqc3RyLCBpbnQgZmxnX2V4cG9ydCwgaW50IGxvY2FsX2x2bCwgaW50IGZsZ19yZWFkX29ubHkpCit7CisJc3RydWN0IHZhcmlhYmxlICoqdmFyX3BwOworCXN0cnVjdCB2YXJpYWJsZSAqY3VyOworCWNoYXIgKmVxX3NpZ247CisJaW50IG5hbWVfbGVuOworCisJZXFfc2lnbiA9IHN0cmNocihzdHIsICc9Jyk7CisJaWYgKCFlcV9zaWduKSB7IC8qIG5vdCBleHBlY3RlZCB0byBldmVyIGhhcHBlbj8gKi8KKwkJZnJlZShzdHIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbmFtZV9sZW4gPSBlcV9zaWduIC0gc3RyICsgMTsgLyogaW5jbHVkaW5nICc9JyAqLworCXZhcl9wcCA9ICZHLnRvcF92YXI7CisJd2hpbGUgKChjdXIgPSAqdmFyX3BwKSAhPSBOVUxMKSB7CisJCWlmIChzdHJuY21wKGN1ci0+dmFyc3RyLCBzdHIsIG5hbWVfbGVuKSAhPSAwKSB7CisJCQl2YXJfcHAgPSAmY3VyLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJLyogV2UgZm91bmQgYW4gZXhpc3RpbmcgdmFyIHdpdGggdGhpcyBuYW1lICovCisJCWlmIChjdXItPmZsZ19yZWFkX29ubHkpIHsKKyNpZiAhQkJfTU1VCisJCQlpZiAoIWZsZ19yZWFkX29ubHkpCisjZW5kaWYKKwkJCQliYl9lcnJvcl9tc2coIiVzOiByZWFkb25seSB2YXJpYWJsZSIsIHN0cik7CisJCQlmcmVlKHN0cik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGZsZ19leHBvcnQgPT0gLTEpIHsgLy8gIiYmIGN1ci0+ZmxnX2V4cG9ydCIgPworCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHVuc2V0ZW52ICclcydcbiIsIF9fZnVuY19fLCBzdHIpOworCQkJKmVxX3NpZ24gPSAnXDAnOworCQkJdW5zZXRlbnYoc3RyKTsKKwkJCSplcV9zaWduID0gJz0nOworCQl9CisjaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwkJaWYgKGN1ci0+ZnVuY19uZXN0X2xldmVsIDwgbG9jYWxfbHZsKSB7CisJCQkvKiBOZXcgdmFyaWFibGUgaXMgZGVjbGFyZWQgYXMgbG9jYWwsCisJCQkgKiBhbmQgZXhpc3Rpbmcgb25lIGlzIGdsb2JhbCwgb3IgbG9jYWwKKwkJCSAqIGZyb20gZW5jbG9zaW5nIGZ1bmN0aW9uLgorCQkJICogUmVtb3ZlIGFuZCBzYXZlIG9sZCBvbmU6ICovCisJCQkqdmFyX3BwID0gY3VyLT5uZXh0OworCQkJY3VyLT5uZXh0ID0gKkcuc2hhZG93ZWRfdmFyc19wcDsKKwkJCSpHLnNoYWRvd2VkX3ZhcnNfcHAgPSBjdXI7CisJCQkvKiBiYXNoIDMuMi4zMygxKSBhbmQgZXhwb3J0ZWQgdmFyczoKKwkJCSAqICMgZXhwb3J0IHo9egorCQkJICogIyBmKCkgeyBsb2NhbCB6PWE7IGVudiB8IGdyZXAgXno7IH0KKwkJCSAqICMgZgorCQkJICogej1hCisJCQkgKiAjIGVudiB8IGdyZXAgXnoKKwkJCSAqIHo9egorCQkJICovCisJCQlpZiAoY3VyLT5mbGdfZXhwb3J0KQorCQkJCWZsZ19leHBvcnQgPSAxOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlpZiAoc3RyY21wKGN1ci0+dmFyc3RyICsgbmFtZV9sZW4sIGVxX3NpZ24gKyAxKSA9PSAwKSB7CisgZnJlZV9hbmRfZXhwOgorCQkJZnJlZShzdHIpOworCQkJZ290byBleHA7CisJCX0KKwkJaWYgKGN1ci0+bWF4X2xlbiAhPSAwKSB7CisJCQlpZiAoY3VyLT5tYXhfbGVuID49IHN0cmxlbihzdHIpKSB7CisJCQkJLyogVGhpcyBvbmUgaXMgZnJvbSBzdGFydHVwIGVudiwgcmV1c2Ugc3BhY2UgKi8KKwkJCQlzdHJjcHkoY3VyLT52YXJzdHIsIHN0cik7CisJCQkJZ290byBmcmVlX2FuZF9leHA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBtYXhfbGVuID09IDAgc2lnbmlmaWVzICJtYWxsb2NlZCIgdmFyLCB3aGljaCB3ZSBjYW4KKwkJCSAqIChhbmQgaGFzIHRvKSBmcmVlICovCisJCQlmcmVlKGN1ci0+dmFyc3RyKTsKKwkJfQorCQljdXItPm1heF9sZW4gPSAwOworCQlnb3RvIHNldF9zdHJfYW5kX2V4cDsKKwl9CisKKwkvKiBOb3QgZm91bmQgLSBjcmVhdGUgbmV3IHZhcmlhYmxlIHN0cnVjdCAqLworCWN1ciA9IHh6YWxsb2Moc2l6ZW9mKCpjdXIpKTsKKyNpZiBFTkFCTEVfSFVTSF9MT0NBTAorCWN1ci0+ZnVuY19uZXN0X2xldmVsID0gbG9jYWxfbHZsOworI2VuZGlmCisJY3VyLT5uZXh0ID0gKnZhcl9wcDsKKwkqdmFyX3BwID0gY3VyOworCisgc2V0X3N0cl9hbmRfZXhwOgorCWN1ci0+dmFyc3RyID0gc3RyOworI2lmICFCQl9NTVUKKwljdXItPmZsZ19yZWFkX29ubHkgPSBmbGdfcmVhZF9vbmx5OworI2VuZGlmCisgZXhwOgorCWlmIChmbGdfZXhwb3J0ID09IDEpCisJCWN1ci0+ZmxnX2V4cG9ydCA9IDE7CisJaWYgKG5hbWVfbGVuID09IDQgJiYgY3VyLT52YXJzdHJbMF0gPT0gJ1AnICYmIGN1ci0+dmFyc3RyWzFdID09ICdTJykKKwkJY21kZWRpdF91cGRhdGVfcHJvbXB0KCk7CisJaWYgKGN1ci0+ZmxnX2V4cG9ydCkgeworCQlpZiAoZmxnX2V4cG9ydCA9PSAtMSkgeworCQkJY3VyLT5mbGdfZXhwb3J0ID0gMDsKKwkJCS8qIHVuc2V0ZW52IHdhcyBhbHJlYWR5IGRvbmUgKi8KKwkJfSBlbHNlIHsKKwkJCWRlYnVnX3ByaW50Zl9lbnYoIiVzOiBwdXRlbnYgJyVzJ1xuIiwgX19mdW5jX18sIGN1ci0+dmFyc3RyKTsKKwkJCXJldHVybiBwdXRlbnYoY3VyLT52YXJzdHIpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBVc2VkIGF0IHN0YXJ0dXAgYW5kIGFmdGVyIGVhY2ggY2QgKi8KK3N0YXRpYyB2b2lkIHNldF9wd2RfdmFyKGludCBleHApCit7CisJc2V0X2xvY2FsX3Zhcih4YXNwcmludGYoIlBXRD0lcyIsIGdldF9jd2QoLypmb3JjZToqLyAxKSksCisJCS8qZXhwOiovIGV4cCwgLypsdmw6Ki8gMCwgLypybzoqLyAwKTsKK30KKworc3RhdGljIGludCB1bnNldF9sb2NhbF92YXJfbGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbikKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKmN1cjsKKwlzdHJ1Y3QgdmFyaWFibGUgKip2YXJfcHA7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJdmFyX3BwID0gJkcudG9wX3ZhcjsKKwl3aGlsZSAoKGN1ciA9ICp2YXJfcHApICE9IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAoY3VyLT52YXJzdHIsIG5hbWUsIG5hbWVfbGVuKSA9PSAwICYmIGN1ci0+dmFyc3RyW25hbWVfbGVuXSA9PSAnPScpIHsKKwkJCWlmIChjdXItPmZsZ19yZWFkX29ubHkpIHsKKwkJCQliYl9lcnJvcl9tc2coIiVzOiByZWFkb25seSB2YXJpYWJsZSIsIG5hbWUpOworCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCQl9CisJCQkqdmFyX3BwID0gY3VyLT5uZXh0OworCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHVuc2V0ZW52ICclcydcbiIsIF9fZnVuY19fLCBjdXItPnZhcnN0cik7CisJCQliYl91bnNldGVudihjdXItPnZhcnN0cik7CisJCQlpZiAobmFtZV9sZW4gPT0gMyAmJiBjdXItPnZhcnN0clswXSA9PSAnUCcgJiYgY3VyLT52YXJzdHJbMV0gPT0gJ1MnKQorCQkJCWNtZGVkaXRfdXBkYXRlX3Byb21wdCgpOworCQkJaWYgKCFjdXItPm1heF9sZW4pCisJCQkJZnJlZShjdXItPnZhcnN0cik7CisJCQlmcmVlKGN1cik7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJCXZhcl9wcCA9ICZjdXItPm5leHQ7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgdW5zZXRfbG9jYWxfdmFyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIHVuc2V0X2xvY2FsX3Zhcl9sZW4obmFtZSwgc3RybGVuKG5hbWUpKTsKK30KKworc3RhdGljIHZvaWQgdW5zZXRfdmFycyhjaGFyICoqc3RyaW5ncykKK3sKKwljaGFyICoqdjsKKworCWlmICghc3RyaW5ncykKKwkJcmV0dXJuOworCXYgPSBzdHJpbmdzOworCXdoaWxlICgqdikgeworCQljb25zdCBjaGFyICplcSA9IHN0cmNocm51bCgqdiwgJz0nKTsKKwkJdW5zZXRfbG9jYWxfdmFyX2xlbigqdiwgKGludCkoZXEgLSAqdikpOworCQl2Kys7CisJfQorCWZyZWUoc3RyaW5ncyk7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBzZXRfbG9jYWxfdmFyX2Zyb21faGFsdmVzKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwljaGFyICp2YXIgPSB4YXNwcmludGYoIiVzPSVzIiwgbmFtZSwgdmFsKTsKKwlzZXRfbG9jYWxfdmFyKHZhciwgLypmbGFnczoqLyAwLCAvKmx2bDoqLyAwLCAvKnJvOiovIDApOworfQorCisKKy8qCisgKiBIZWxwZXJzIGZvciAidmFyMT12YWwxIHZhcjI9dmFsMiBjbWQiIGZlYXR1cmUKKyAqLworc3RhdGljIHZvaWQgYWRkX3ZhcnMoc3RydWN0IHZhcmlhYmxlICp2YXIpCit7CisJc3RydWN0IHZhcmlhYmxlICpuZXh0OworCisJd2hpbGUgKHZhcikgeworCQluZXh0ID0gdmFyLT5uZXh0OworCQl2YXItPm5leHQgPSBHLnRvcF92YXI7CisJCUcudG9wX3ZhciA9IHZhcjsKKwkJaWYgKHZhci0+ZmxnX2V4cG9ydCkgeworCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHJlc3RvcmluZyBleHBvcnRlZCAnJXMnXG4iLCBfX2Z1bmNfXywgdmFyLT52YXJzdHIpOworCQkJcHV0ZW52KHZhci0+dmFyc3RyKTsKKwkJfSBlbHNlIHsKKwkJCWRlYnVnX3ByaW50Zl9lbnYoIiVzOiByZXN0b3JpbmcgdmFyaWFibGUgJyVzJ1xuIiwgX19mdW5jX18sIHZhci0+dmFyc3RyKTsKKwkJfQorCQl2YXIgPSBuZXh0OworCX0KK30KKworc3RhdGljIHN0cnVjdCB2YXJpYWJsZSAqc2V0X3ZhcnNfYW5kX3NhdmVfb2xkKGNoYXIgKipzdHJpbmdzKQoreworCWNoYXIgKipzOworCXN0cnVjdCB2YXJpYWJsZSAqb2xkID0gTlVMTDsKKworCWlmICghc3RyaW5ncykKKwkJcmV0dXJuIG9sZDsKKwlzID0gc3RyaW5nczsKKwl3aGlsZSAoKnMpIHsKKwkJc3RydWN0IHZhcmlhYmxlICp2YXJfcDsKKwkJc3RydWN0IHZhcmlhYmxlICoqdmFyX3BwOworCQljaGFyICplcTsKKworCQllcSA9IHN0cmNocigqcywgJz0nKTsKKwkJaWYgKGVxKSB7CisJCQl2YXJfcHAgPSBnZXRfcHRyX3RvX2xvY2FsX3ZhcigqcywgZXEgLSAqcyk7CisJCQlpZiAodmFyX3BwKSB7CisJCQkJLyogUmVtb3ZlIHZhcmlhYmxlIGZyb20gZ2xvYmFsIGxpbmtlZCBsaXN0ICovCisJCQkJdmFyX3AgPSAqdmFyX3BwOworCQkJCWRlYnVnX3ByaW50Zl9lbnYoIiVzOiByZW1vdmluZyAnJXMnXG4iLCBfX2Z1bmNfXywgdmFyX3AtPnZhcnN0cik7CisJCQkJKnZhcl9wcCA9IHZhcl9wLT5uZXh0OworCQkJCS8qIEFkZCBpdCB0byByZXR1cm5lZCBsaXN0ICovCisJCQkJdmFyX3AtPm5leHQgPSBvbGQ7CisJCQkJb2xkID0gdmFyX3A7CisJCQl9CisJCQlzZXRfbG9jYWxfdmFyKCpzLCAvKmV4cDoqLyAxLCAvKmx2bDoqLyAwLCAvKnJvOiovIDApOworCQl9CisJCXMrKzsKKwl9CisJcmV0dXJuIG9sZDsKK30KKworCisvKgorICogaW5fc3RyIHN1cHBvcnQKKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgc3RhdGljX2dldChzdHJ1Y3QgaW5fc3RyICppKQoreworCWludCBjaCA9ICppLT5wOworCWlmIChjaCAhPSAnXDAnKSB7CisJCWktPnArKzsKKwkJaS0+bGFzdF9jaGFyID0gY2g7CisJCXJldHVybiBjaDsKKwl9CisJcmV0dXJuIEVPRjsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgc3RhdGljX3BlZWsoc3RydWN0IGluX3N0ciAqaSkKK3sKKwlyZXR1cm4gKmktPnA7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorCitzdGF0aWMgdm9pZCBjbWRlZGl0X3VwZGF0ZV9wcm9tcHQodm9pZCkKK3sKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQpIHsKKwkJRy5QUzEgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJQUzEiKTsKKwkJaWYgKEcuUFMxID09IE5VTEwpCisJCQlHLlBTMSA9ICJcXHcgXFwkICI7CisJCUcuUFMyID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiUFMyIik7CisJfSBlbHNlIHsKKwkJRy5QUzEgPSBOVUxMOworCX0KKwlpZiAoRy5QUzIgPT0gTlVMTCkKKwkJRy5QUzIgPSAiPiAiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2V0dXBfcHJvbXB0X3N0cmluZyhpbnQgcHJvbXB0bW9kZSkKK3sKKwljb25zdCBjaGFyICpwcm9tcHRfc3RyOworCWRlYnVnX3ByaW50Zigic2V0dXBfcHJvbXB0X3N0cmluZyAlZCAiLCBwcm9tcHRtb2RlKTsKKwlpZiAoIUVOQUJMRV9GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUKSB7CisJCS8qIFNldCB1cCB0aGUgcHJvbXB0ICovCisJCWlmIChwcm9tcHRtb2RlID09IDApIHsgLyogUFMxICovCisJCQlmcmVlKChjaGFyKilHLlBTMSk7CisJCQkvKiBiYXNoIHVzZXMgJFBXRCB2YWx1ZSwgZXZlbiBpZiBpdCBpcyBzZXQgYnkgdXNlci4KKwkJCSAqIEl0IHVzZXMgY3VycmVudCBkaXIgb25seSBpZiBQV0QgaXMgdW5zZXQuCisJCQkgKiBXZSBhbHdheXMgdXNlIGN1cnJlbnQgZGlyLiAqLworCQkJRy5QUzEgPSB4YXNwcmludGYoIiVzICVjICIsIGdldF9jd2QoMCksIChnZXRldWlkKCkgIT0gMCkgPyAnJCcgOiAnIycpOworCQkJcHJvbXB0X3N0ciA9IEcuUFMxOworCQl9IGVsc2UKKwkJCXByb21wdF9zdHIgPSBHLlBTMjsKKwl9IGVsc2UKKwkJcHJvbXB0X3N0ciA9IChwcm9tcHRtb2RlID09IDApID8gRy5QUzEgOiBHLlBTMjsKKwlkZWJ1Z19wcmludGYoInJlc3VsdCAnJXMnXG4iLCBwcm9tcHRfc3RyKTsKKwlyZXR1cm4gcHJvbXB0X3N0cjsKK30KKworc3RhdGljIHZvaWQgZ2V0X3VzZXJfaW5wdXQoc3RydWN0IGluX3N0ciAqaSkKK3sKKwlpbnQgcjsKKwljb25zdCBjaGFyICpwcm9tcHRfc3RyOworCisJcHJvbXB0X3N0ciA9IHNldHVwX3Byb21wdF9zdHJpbmcoaS0+cHJvbXB0bW9kZSk7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKwkvKiBFbmFibGUgY29tbWFuZCBsaW5lIGVkaXRpbmcgb25seSB3aGlsZSBhIGNvbW1hbmQgbGluZQorCSAqIGlzIGFjdHVhbGx5IGJlaW5nIHJlYWQgKi8KKwlkbyB7CisJCS8qIFVuaWNvZGUgc3VwcG9ydCBzaG91bGQgYmUgYWN0aXZhdGVkIGV2ZW4gaWYgTEFORyBpcyBzZXQKKwkJICogX2R1cmluZ18gc2hlbGwgZXhlY3V0aW9uLCBub3Qgb25seSBpZiBpdCB3YXMgc2V0IHdoZW4KKwkJICogc2hlbGwgd2FzIHN0YXJ0ZWQuIFRoZXJlZm9yZSwgcmUtY2hlY2sgTEFORyBldmVyeSB0aW1lOgorCQkgKi8KKwkJcmVpbml0X3VuaWNvZGUoZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiTEFORyIpKTsKKworCQlHLmZsYWdfU0lHSU5UID0gMDsKKwkJLyogYnVnbGV0OiBTSUdJTlQgd2lsbCBub3QgbWFrZSBuZXcgcHJvbXB0IHRvIGFwcGVhciBfYXQgb25jZV8sCisJCSAqIG9ubHkgYWZ0ZXIgPEVudGVyPi4gKF5DIHdpbGwgd29yaykgKi8KKwkJciA9IHJlYWRfbGluZV9pbnB1dChHLmxpbmVfaW5wdXRfc3RhdGUsIHByb21wdF9zdHIsIEcudXNlcl9pbnB1dF9idWYsIENPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTi0xLCAvKnRpbWVvdXQqLyAtMSk7CisJCS8qIGNhdGNoICpTSUdJTlQqIGV0YyAoXkMgaXMgaGFuZGxlZCBieSByZWFkX2xpbmVfaW5wdXQpICovCisJCWNoZWNrX2FuZF9ydW5fdHJhcHMoKTsKKwl9IHdoaWxlIChyID09IDAgfHwgRy5mbGFnX1NJR0lOVCk7IC8qIHJlcGVhdCBpZiBeQyBvciBTSUdJTlQgKi8KKwlpLT5lb2ZfZmxhZyA9IChyIDwgMCk7CisJaWYgKGktPmVvZl9mbGFnKSB7IC8qIEVPRi9lcnJvciBkZXRlY3RlZCAqLworCQlHLnVzZXJfaW5wdXRfYnVmWzBdID0gRU9GOyAvKiB5ZXMsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkLCBpdCdzIG9rICovCisJCUcudXNlcl9pbnB1dF9idWZbMV0gPSAnXDAnOworCX0KKyMgZWxzZQorCWRvIHsKKwkJRy5mbGFnX1NJR0lOVCA9IDA7CisJCWlmIChpLT5sYXN0X2NoYXIgPT0gJ1wwJyB8fCBpLT5sYXN0X2NoYXIgPT0gJ1xuJykgeworCQkJLyogV2h5IGNoZWNrX2FuZF9ydW5fdHJhcHMgaGVyZT8gVHJ5IHRoaXMgaW50ZXJhY3RpdmVseToKKwkJCSAqICQgdHJhcCAnZWNobyBJTlQnIElOVDsgKHNsZWVwIDI7IGtpbGwgLUlOVCAkJCkgJgorCQkJICogJCA8W2VudGVyXSwgcmVwZWF0ZWRseS4uLj4KKwkJCSAqIFdpdGhvdXQgY2hlY2tfYW5kX3J1bl90cmFwcywgaGFuZGxlciBuZXZlciBydW5zLgorCQkJICovCisJCQljaGVja19hbmRfcnVuX3RyYXBzKCk7CisJCQlmcHV0cyhwcm9tcHRfc3RyLCBzdGRvdXQpOworCQl9CisJCWZmbHVzaF9hbGwoKTsKKwkJRy51c2VyX2lucHV0X2J1ZlswXSA9IHIgPSBmZ2V0YyhpLT5maWxlKTsKKwkJLypHLnVzZXJfaW5wdXRfYnVmWzFdID0gJ1wwJzsgLSBhbHJlYWR5IGlzIGFuZCBuZXZlciBjaGFuZ2VkICovCisJfSB3aGlsZSAoRy5mbGFnX1NJR0lOVCk7CisJaS0+ZW9mX2ZsYWcgPSAociA9PSBFT0YpOworIyBlbmRpZgorCWktPnAgPSBHLnVzZXJfaW5wdXRfYnVmOworfQorCisjZW5kaWYgIC8qIElOVEVSQUNUSVZFICovCisKKy8qIFRoaXMgaXMgdGhlIG1hZ2ljIGxvY2F0aW9uIHRoYXQgcHJpbnRzIHByb21wdHMKKyAqIGFuZCBnZXRzIGRhdGEgYmFjayBmcm9tIHRoZSB1c2VyICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBmaWxlX2dldChzdHJ1Y3QgaW5fc3RyICppKQoreworCWludCBjaDsKKworCS8qIElmIHRoZXJlIGlzIGRhdGEgd2FpdGluZywgZWF0IGl0IHVwICovCisJaWYgKGktPnAgJiYgKmktPnApIHsKKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorIHRha2VfY2FjaGVkOgorI2VuZGlmCisJCWNoID0gKmktPnArKzsKKwkJaWYgKGktPmVvZl9mbGFnICYmICEqaS0+cCkKKwkJCWNoID0gRU9GOworCQkvKiBub3RlOiBjaCBpcyBuZXZlciBOVUwgKi8KKwl9IGVsc2UgeworCQkvKiBuZWVkIHRvIGRvdWJsZSBjaGVjayBpLT5maWxlIGJlY2F1c2Ugd2UgbWlnaHQgYmUgZG9pbmcgc29tZXRoaW5nCisJCSAqIG1vcmUgY29tcGxpY2F0ZWQgYnkgbm93LCBsaWtlIHNvdXJjaW5nIG9yIHN1YnN0aXR1dGluZy4gKi8KKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorCQlpZiAoR19pbnRlcmFjdGl2ZV9mZCAmJiBpLT5maWxlID09IHN0ZGluKSB7CisJCQlkbyB7CisJCQkJZ2V0X3VzZXJfaW5wdXQoaSk7CisJCQl9IHdoaWxlICghKmktPnApOyAvKiBuZWVkIG5vbi1lbXB0eSBsaW5lICovCisJCQlpLT5wcm9tcHRtb2RlID0gMTsgLyogUFMyICovCisJCQlnb3RvIHRha2VfY2FjaGVkOworCQl9CisjZW5kaWYKKwkJZG8gY2ggPSBmZ2V0YyhpLT5maWxlKTsgd2hpbGUgKGNoID09ICdcMCcpOworCX0KKwlkZWJ1Z19wcmludGYoImZpbGVfZ2V0OiBnb3QgJyVjJyAlZFxuIiwgY2gsIGNoKTsKKwlpLT5sYXN0X2NoYXIgPSBjaDsKKwlyZXR1cm4gY2g7Cit9CisKKy8qIEFsbCBjYWxsZXJzIGd1YXJhbnRlZSB0aGlzIHJvdXRpbmUgd2lsbCBuZXZlcgorICogYmUgdXNlZCByaWdodCBhZnRlciBhIG5ld2xpbmUsIHNvIHByb21wdGluZyBpcyBub3QgbmVlZGVkLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBmaWxlX3BlZWsoc3RydWN0IGluX3N0ciAqaSkKK3sKKwlpbnQgY2g7CisJaWYgKGktPnAgJiYgKmktPnApIHsKKwkJaWYgKGktPmVvZl9mbGFnICYmICFpLT5wWzFdKQorCQkJcmV0dXJuIEVPRjsKKwkJcmV0dXJuICppLT5wOworCQkvKiBub3RlOiBjaCBpcyBuZXZlciBOVUwgKi8KKwl9CisJZG8gY2ggPSBmZ2V0YyhpLT5maWxlKTsgd2hpbGUgKGNoID09ICdcMCcpOworCWktPmVvZl9mbGFnID0gKGNoID09IEVPRik7CisJaS0+cGVla19idWZbMF0gPSBjaDsKKwlpLT5wZWVrX2J1ZlsxXSA9ICdcMCc7CisJaS0+cCA9IGktPnBlZWtfYnVmOworCWRlYnVnX3ByaW50ZigiZmlsZV9wZWVrOiBnb3QgJyVjJyAlZFxuIiwgY2gsIGNoKTsKKwlyZXR1cm4gY2g7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2ZpbGVfaW5fc3RyKHN0cnVjdCBpbl9zdHIgKmksIEZJTEUgKmYpCit7CisJbWVtc2V0KGksIDAsIHNpemVvZigqaSkpOworCWktPnBlZWsgPSBmaWxlX3BlZWs7CisJaS0+Z2V0ID0gZmlsZV9nZXQ7CisJLyogaS0+cHJvbXB0bW9kZSA9IDA7IC0gUFMxIChtZW1zZXQgZGlkIGl0KSAqLworCWktPmZpbGUgPSBmOworCS8qIGktPnAgPSBOVUxMOyAqLworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9zdHJpbmdfaW5fc3RyKHN0cnVjdCBpbl9zdHIgKmksIGNvbnN0IGNoYXIgKnMpCit7CisJbWVtc2V0KGksIDAsIHNpemVvZigqaSkpOworCWktPnBlZWsgPSBzdGF0aWNfcGVlazsKKwlpLT5nZXQgPSBzdGF0aWNfZ2V0OworCS8qIGktPnByb21wdG1vZGUgPSAwOyAtIFBTMSAobWVtc2V0IGRpZCBpdCkgKi8KKwlpLT5wID0gczsKKwkvKiBpLT5lb2ZfZmxhZyA9IDA7ICovCit9CisKKworLyoKKyAqIG9fc3RyaW5nIHN1cHBvcnQKKyAqLworI2RlZmluZSBCX0NIVU5LICAoMzIgKiBzaXplb2YoY2hhciopKQorCitzdGF0aWMgdm9pZCBvX3Jlc2V0X3RvX2VtcHR5X3VucXVvdGVkKG9fc3RyaW5nICpvKQoreworCW8tPmxlbmd0aCA9IDA7CisJby0+aGFzX3F1b3RlZF9wYXJ0ID0gMDsKKwlpZiAoby0+ZGF0YSkKKwkJby0+ZGF0YVswXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIG9fZnJlZShvX3N0cmluZyAqbykKK3sKKwlmcmVlKG8tPmRhdGEpOworCW1lbXNldChvLCAwLCBzaXplb2YoKm8pKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCBvX2ZyZWVfdW5zYWZlKG9fc3RyaW5nICpvKQoreworCWZyZWUoby0+ZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIG9fZ3Jvd19ieShvX3N0cmluZyAqbywgaW50IGxlbikKK3sKKwlpZiAoby0+bGVuZ3RoICsgbGVuID4gby0+bWF4bGVuKSB7CisJCW8tPm1heGxlbiArPSAoMipsZW4gPiBCX0NIVU5LID8gMipsZW4gOiBCX0NIVU5LKTsKKwkJby0+ZGF0YSA9IHhyZWFsbG9jKG8tPmRhdGEsIDEgKyBvLT5tYXhsZW4pOworCX0KK30KKworc3RhdGljIHZvaWQgb19hZGRjaHIob19zdHJpbmcgKm8sIGludCBjaCkKK3sKKwlkZWJ1Z19wcmludGYoIm9fYWRkY2hyOiAnJWMnIG8tPmxlbmd0aD0lZCBvPSVwXG4iLCBjaCwgby0+bGVuZ3RoLCBvKTsKKwlvX2dyb3dfYnkobywgMSk7CisJby0+ZGF0YVtvLT5sZW5ndGhdID0gY2g7CisJby0+bGVuZ3RoKys7CisJby0+ZGF0YVtvLT5sZW5ndGhdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgb19hZGRibG9jayhvX3N0cmluZyAqbywgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCW9fZ3Jvd19ieShvLCBsZW4pOworCW1lbWNweSgmby0+ZGF0YVtvLT5sZW5ndGhdLCBzdHIsIGxlbik7CisJby0+bGVuZ3RoICs9IGxlbjsKKwlvLT5kYXRhW28tPmxlbmd0aF0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBvX2FkZHN0cihvX3N0cmluZyAqbywgY29uc3QgY2hhciAqc3RyKQoreworCW9fYWRkYmxvY2sobywgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKKyNpZiAhQkJfTU1VCitzdGF0aWMgdm9pZCBub21tdV9hZGRjaHIob19zdHJpbmcgKm8sIGludCBjaCkKK3sKKwlpZiAobykKKwkJb19hZGRjaHIobywgY2gpOworfQorI2Vsc2UKKyMgZGVmaW5lIG5vbW11X2FkZGNocihvLCBzdHIpICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG9fYWRkc3RyX3dpdGhfTlVMKG9fc3RyaW5nICpvLCBjb25zdCBjaGFyICpzdHIpCit7CisJb19hZGRibG9jayhvLCBzdHIsIHN0cmxlbihzdHIpICsgMSk7Cit9CisKKy8qCisgKiBIVVNIX0JSQUNFX0VYUEFOU0lPTiBjb2RlIG5lZWRzIGNvcnJlc3BvbmRpbmcgcXVvdGluZyBvbiB2YXJpYWJsZSBleHBhbnNpb24gc2lkZS4KKyAqIEN1cnJlbnRseSwgInY9J3txLHd9JzsgZWNobyAkdiIgZXJyb25lb3VzbHkgZXhwYW5kcyBicmFjZXMgaW4gJHYuCisgKiBBcHBhcmVudGx5LCBvbiB1bnF1b3RlZCAkdiBiYXNoIHN0aWxsIGRvZXMgZ2xvYmJpbmcKKyAqICgidj0nKi50eHQnOyBlY2hvICR2IiBwcmludHMgYWxsIC50eHQgZmlsZXMpLAorICogYnV0IE5PVCBicmFjZSBleHBhbnNpb24hIFRodXMsIHRoZXJlIHNob3VsZCBiZSBUV08gaW5kZXBlbmRlbnQKKyAqIHF1b3RpbmcgbWVjaGFuaXNtcyBvbiAkdiBleHBhbnNpb24gc2lkZTogb25lIHByb3RlY3RzCisgKiAkdiBmcm9tIGJyYWNlIGV4cGFuc2lvbiwgYW5kIG90aGVyIGFkZGl0aW9uYWxseSBwcm90ZWN0cyAiJHYiIGFnYWluc3QgZ2xvYmJpbmcuCisgKiBXZSBoYXZlIG9ubHkgc2Vjb25kIG9uZS4KKyAqLworCisjaWYgRU5BQkxFX0hVU0hfQlJBQ0VfRVhQQU5TSU9OCisjIGRlZmluZSBNQVlCRV9CUkFDRVMgInt9IgorI2Vsc2UKKyMgZGVmaW5lIE1BWUJFX0JSQUNFUyAiIgorI2VuZGlmCisKKy8qIE15IGFuYWx5c2lzIG9mIHF1b3Rpbmcgc2VtYW50aWNzIHRlbGxzIG1lIHRoYXQgc3RhdGUgaW5mb3JtYXRpb24KKyAqIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGRlc3RpbmF0aW9uLCBub3QgYSBzb3VyY2UuCisgKi8KK3N0YXRpYyB2b2lkIG9fYWRkcWNocihvX3N0cmluZyAqbywgaW50IGNoKQoreworCWludCBzeiA9IDE7CisJY2hhciAqZm91bmQgPSBzdHJjaHIoIio/W1xcIiBNQVlCRV9CUkFDRVMsIGNoKTsKKwlpZiAoZm91bmQpCisJCXN6Kys7CisJb19ncm93X2J5KG8sIHN6KTsKKwlpZiAoZm91bmQpIHsKKwkJby0+ZGF0YVtvLT5sZW5ndGhdID0gJ1xcJzsKKwkJby0+bGVuZ3RoKys7CisJfQorCW8tPmRhdGFbby0+bGVuZ3RoXSA9IGNoOworCW8tPmxlbmd0aCsrOworCW8tPmRhdGFbby0+bGVuZ3RoXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIG9fYWRkUWNocihvX3N0cmluZyAqbywgaW50IGNoKQoreworCWludCBzeiA9IDE7CisJaWYgKChvLT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpCisJICYmIHN0cmNocigiKj9bXFwiIE1BWUJFX0JSQUNFUywgY2gpCisJKSB7CisJCXN6Kys7CisJCW8tPmRhdGFbby0+bGVuZ3RoXSA9ICdcXCc7CisJCW8tPmxlbmd0aCsrOworCX0KKwlvX2dyb3dfYnkobywgc3opOworCW8tPmRhdGFbby0+bGVuZ3RoXSA9IGNoOworCW8tPmxlbmd0aCsrOworCW8tPmRhdGFbby0+bGVuZ3RoXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIG9fYWRkcWJsb2NrKG9fc3RyaW5nICpvLCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbikgeworCQljaGFyIGNoOworCQlpbnQgc3o7CisJCWludCBvcmRpbmFyeV9jbnQgPSBzdHJjc3BuKHN0ciwgIio/W1xcIiBNQVlCRV9CUkFDRVMpOworCQlpZiAob3JkaW5hcnlfY250ID4gbGVuKSAvKiBwYXJhbm9pYSAqLworCQkJb3JkaW5hcnlfY250ID0gbGVuOworCQlvX2FkZGJsb2NrKG8sIHN0ciwgb3JkaW5hcnlfY250KTsKKwkJaWYgKG9yZGluYXJ5X2NudCA9PSBsZW4pCisJCQlyZXR1cm47IC8qIE5VTCBpcyBhbHJlYWR5IGFkZGVkIGJ5IG9fYWRkYmxvY2sgKi8KKwkJc3RyICs9IG9yZGluYXJ5X2NudDsKKwkJbGVuIC09IG9yZGluYXJ5X2NudCArIDE7IC8qIHdlIGFyZSBwcm9jZXNzaW5nICsgMSBjaGFyIGJlbG93ICovCisKKwkJY2ggPSAqc3RyKys7CisJCXN6ID0gMTsKKwkJaWYgKGNoKSB7IC8qIGl0IGlzIG5lY2Vzc2FyaWx5IG9uZSBvZiAiKj9bXFwiIE1BWUJFX0JSQUNFUyAqLworCQkJc3orKzsKKwkJCW8tPmRhdGFbby0+bGVuZ3RoXSA9ICdcXCc7CisJCQlvLT5sZW5ndGgrKzsKKwkJfQorCQlvX2dyb3dfYnkobywgc3opOworCQlvLT5kYXRhW28tPmxlbmd0aF0gPSBjaDsKKwkJby0+bGVuZ3RoKys7CisJfQorCW8tPmRhdGFbby0+bGVuZ3RoXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIG9fYWRkUWJsb2NrKG9fc3RyaW5nICpvLCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJaWYgKCEoby0+b19leHBmbGFncyAmIEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTKSkgeworCQlvX2FkZGJsb2NrKG8sIHN0ciwgbGVuKTsKKwkJcmV0dXJuOworCX0KKwlvX2FkZHFibG9jayhvLCBzdHIsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIG9fYWRkUXN0cihvX3N0cmluZyAqbywgY29uc3QgY2hhciAqc3RyKQoreworCW9fYWRkUWJsb2NrKG8sIHN0ciwgc3RybGVuKHN0cikpOworfQorCisvKiBBIHNwZWNpYWwga2luZCBvZiBvX3N0cmluZyBmb3IgJFZBUiBhbmQgYGNtZGAgZXhwYW5zaW9uLgorICogSXQgY29udGFpbnMgY2hhciogbGlzdFtdIGF0IHRoZSBiZWdpbm5pbmcsIHdoaWNoIGlzIGdyb3duIGluIDE2IGVsZW1lbnQKKyAqIGluY3JlbWVudHMuIEFjdHVhbCBzdHJpbmcgZGF0YSBzdGFydHMgYXQgdGhlIG5leHQgbXVsdGlwbGUgb2YgMTYgKiAoY2hhciopLgorICogbGlzdFtpXSBjb250YWlucyBhbiBJTkRFWCAoaW50ISkgaW50byB0aGlzIHN0cmluZyBkYXRhLgorICogSXQgbWVhbnMgdGhhdCBpZiBsaXN0W10gbmVlZHMgdG8gZ3JvdywgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBoaWdoZXIgdXAKKyAqIGJ1dCBsaXN0W2ldJ3MgbmVlZCBub3QgYmUgbW9kaWZpZWQuCisgKiBOQjogcmVtZW1iZXJpbmcgaG93IG1hbnkgbGlzdFtpXSdzIHlvdSBoYXZlIHRoZXJlIGlzIGNydWNpYWwuCisgKiBvX2ZpbmFsaXplX2xpc3QoKSBvcGVyYXRpb24gcG9zdC1wcm9jZXNzZXMgdGhpcyBzdHJ1Y3R1cmUgLSBjYWxjdWxhdGVzCisgKiBhbmQgc3RvcmVzIGFjdHVhbCBjaGFyKiBwdHJzIGluIGxpc3RbXS4gT2gsIGl0IE5VTEwgdGVybWluYXRlcyBpdCBhcyB3ZWxsLgorICovCisjaWYgREVCVUdfRVhQQU5EIHx8IERFQlVHX0dMT0IKK3N0YXRpYyB2b2lkIGRlYnVnX3ByaW50X2xpc3QoY29uc3QgY2hhciAqcHJlZml4LCBvX3N0cmluZyAqbywgaW50IG4pCit7CisJY2hhciAqKmxpc3QgPSAoY2hhcioqKW8tPmRhdGE7CisJaW50IHN0cmluZ19zdGFydCA9ICgobiArIDB4ZikgJiB+MHhmKSAqIHNpemVvZihsaXN0WzBdKTsKKwlpbnQgaSA9IDA7CisKKwlpbmRlbnQoKTsKKwlmZHByaW50ZigyLCAiJXM6IGxpc3Q6JXAgbjolZCBzdHJpbmdfc3RhcnQ6JWQgbGVuZ3RoOiVkIG1heGxlbjolZCBnbG9iOiVkIHF1b3RlZDolZCBlc2NhcGU6JWRcbiIsCisJCQlwcmVmaXgsIGxpc3QsIG4sIHN0cmluZ19zdGFydCwgby0+bGVuZ3RoLCBvLT5tYXhsZW4sCisJCQkhIShvLT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfR0xPQiksCisJCQlvLT5oYXNfcXVvdGVkX3BhcnQsCisJCQkhIShvLT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpKTsKKwl3aGlsZSAoaSA8IG4pIHsKKwkJaW5kZW50KCk7CisJCWZkcHJpbnRmKDIsICIgbGlzdFslZF09JWQgJyVzJyAlcFxuIiwgaSwgKGludCkodWludHB0cl90KWxpc3RbaV0sCisJCQkJby0+ZGF0YSArIChpbnQpKHVpbnRwdHJfdClsaXN0W2ldICsgc3RyaW5nX3N0YXJ0LAorCQkJCW8tPmRhdGEgKyAoaW50KSh1aW50cHRyX3QpbGlzdFtpXSArIHN0cmluZ19zdGFydCk7CisJCWkrKzsKKwl9CisJaWYgKG4pIHsKKwkJY29uc3QgY2hhciAqcCA9IG8tPmRhdGEgKyAoaW50KSh1aW50cHRyX3QpbGlzdFtuIC0gMV0gKyBzdHJpbmdfc3RhcnQ7CisJCWluZGVudCgpOworCQlmZHByaW50ZigyLCAiIHRvdGFsX3N6OiVsZFxuIiwgKGxvbmcpKChwICsgc3RybGVuKHApICsgMSkgLSBvLT5kYXRhKSk7CisJfQorfQorI2Vsc2UKKyMgZGVmaW5lIGRlYnVnX3ByaW50X2xpc3QocHJlZml4LCBvLCBuKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiBuID0gb19zYXZlX3B0cl9oZWxwZXIoc3RyLCBuKSAic3RhcnRzIG5ldyBzdHJpbmciIGJ5IHN0b3JpbmcgYW4gaW5kZXggdmFsdWUKKyAqIGluIGxpc3Rbbl0gc28gdGhhdCBpdCBwb2ludHMgcGFzdCBsYXN0IHN0b3JlZCBieXRlIHNvIGZhci4KKyAqIEl0IHJldHVybnMgbisxLiAqLworc3RhdGljIGludCBvX3NhdmVfcHRyX2hlbHBlcihvX3N0cmluZyAqbywgaW50IG4pCit7CisJY2hhciAqKmxpc3QgPSAoY2hhcioqKW8tPmRhdGE7CisJaW50IHN0cmluZ19zdGFydDsKKwlpbnQgc3RyaW5nX2xlbjsKKworCWlmICghby0+aGFzX2VtcHR5X3Nsb3QpIHsKKwkJc3RyaW5nX3N0YXJ0ID0gKChuICsgMHhmKSAmIH4weGYpICogc2l6ZW9mKGxpc3RbMF0pOworCQlzdHJpbmdfbGVuID0gby0+bGVuZ3RoIC0gc3RyaW5nX3N0YXJ0OworCQlpZiAoIShuICYgMHhmKSkgeyAvKiAwLCAweDEwLCAweDIwLi4uPyAqLworCQkJZGVidWdfcHJpbnRmX2xpc3QoImxpc3RbJWRdPSVkIHN0cmluZ19zdGFydD0lZCAoZ3Jvd2luZylcbiIsIG4sIHN0cmluZ19sZW4sIHN0cmluZ19zdGFydCk7CisJCQkvKiBsaXN0W25dIHBvaW50cyB0byBzdHJpbmdfc3RhcnQsIG1ha2Ugc3BhY2UgZm9yIDE2IG1vcmUgcG9pbnRlcnMgKi8KKwkJCW8tPm1heGxlbiArPSAweDEwICogc2l6ZW9mKGxpc3RbMF0pOworCQkJby0+ZGF0YSA9IHhyZWFsbG9jKG8tPmRhdGEsIG8tPm1heGxlbiArIDEpOworCQkJbGlzdCA9IChjaGFyKiopby0+ZGF0YTsKKwkJCW1lbW1vdmUobGlzdCArIG4gKyAweDEwLCBsaXN0ICsgbiwgc3RyaW5nX2xlbik7CisJCQlvLT5sZW5ndGggKz0gMHgxMCAqIHNpemVvZihsaXN0WzBdKTsKKwkJfSBlbHNlIHsKKwkJCWRlYnVnX3ByaW50Zl9saXN0KCJsaXN0WyVkXT0lZCBzdHJpbmdfc3RhcnQ9JWRcbiIsCisJCQkJCW4sIHN0cmluZ19sZW4sIHN0cmluZ19zdGFydCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBXZSBoYXZlIGVtcHR5IHNsb3QgYXQgbGlzdFtuXSwgcmV1c2Ugd2l0aG91dCBncm93dGggKi8KKwkJc3RyaW5nX3N0YXJ0ID0gKChuKzEgKyAweGYpICYgfjB4ZikgKiBzaXplb2YobGlzdFswXSk7IC8qIE5COiBuKzEhICovCisJCXN0cmluZ19sZW4gPSBvLT5sZW5ndGggLSBzdHJpbmdfc3RhcnQ7CisJCWRlYnVnX3ByaW50Zl9saXN0KCJsaXN0WyVkXT0lZCBzdHJpbmdfc3RhcnQ9JWQgKGVtcHR5IHNsb3QpXG4iLAorCQkJCW4sIHN0cmluZ19sZW4sIHN0cmluZ19zdGFydCk7CisJCW8tPmhhc19lbXB0eV9zbG90ID0gMDsKKwl9CisJby0+aGFzX3F1b3RlZF9wYXJ0ID0gMDsKKwlsaXN0W25dID0gKGNoYXIqKSh1aW50cHRyX3Qpc3RyaW5nX2xlbjsKKwlyZXR1cm4gbiArIDE7Cit9CisKKy8qICJXaGF0IHdhcyBvdXIgbGFzdCBvX3NhdmVfcHRyJ2VkIHBvc2l0aW9uIChieXRlIG9mZnNldCByZWxhdGl2ZSBvLT5kYXRhKT8iICovCitzdGF0aWMgaW50IG9fZ2V0X2xhc3RfcHRyKG9fc3RyaW5nICpvLCBpbnQgbikKK3sKKwljaGFyICoqbGlzdCA9IChjaGFyKiopby0+ZGF0YTsKKwlpbnQgc3RyaW5nX3N0YXJ0ID0gKChuICsgMHhmKSAmIH4weGYpICogc2l6ZW9mKGxpc3RbMF0pOworCisJcmV0dXJuICgoaW50KSh1aW50cHRyX3QpbGlzdFtuLTFdKSArIHN0cmluZ19zdGFydDsKK30KKworI2lmIEVOQUJMRV9IVVNIX0JSQUNFX0VYUEFOU0lPTgorLyogVGhlcmUgaW4gYSBHTlUgZXh0ZW5zaW9uLCBHTE9CX0JSQUNFLCBidXQgaXQgaXMgbm90IHVzYWJsZToKKyAqIGZpcnN0LCBpdCBwcm9jZXNzZXMgZXZlbiB7YX0gKG5vIGNvbW1hcyksIHNlY29uZCwKKyAqIEkgZGlkbid0IG1hbmFnZSB0byBtYWtlIGl0IHJldHVybiBzdHJpbmdzIHdoZW4gdGhleSBkb24ndCBtYXRjaAorICogZXhpc3RpbmcgZmlsZXMuIE5lZWQgdG8gcmUtaW1wbGVtZW50IGl0LgorICovCisKKy8qIEhlbHBlciAqLworc3RhdGljIGludCBnbG9iX25lZWRlZChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlpZiAoKnMgPT0gJ1xcJykgeworCQkJaWYgKCFzWzFdKQorCQkJCXJldHVybiAwOworCQkJcyArPSAyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpzID09ICcqJyB8fCAqcyA9PSAnWycgfHwgKnMgPT0gJz8nIHx8ICpzID09ICd7JykKKwkJCXJldHVybiAxOworCQlzKys7CisJfQorCXJldHVybiAwOworfQorLyogUmV0dXJuIHBvaW50ZXIgdG8gbmV4dCBjbG9zaW5nIGJyYWNlIG9yIHRvIGNvbW1hICovCitzdGF0aWMgY29uc3QgY2hhciAqbmV4dF9icmFjZV9zdWIoY29uc3QgY2hhciAqY3ApCit7CisJdW5zaWduZWQgZGVwdGggPSAwOworCWNwKys7CisJd2hpbGUgKCpjcCAhPSAnXDAnKSB7CisJCWlmICgqY3AgPT0gJ1xcJykgeworCQkJaWYgKCorK2NwID09ICdcMCcpCisJCQkJYnJlYWs7CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCgqY3AgPT0gJ30nICYmIGRlcHRoLS0gPT0gMCkgfHwgKCpjcCA9PSAnLCcgJiYgZGVwdGggPT0gMCkpCisJCQlicmVhazsKKwkJaWYgKCpjcCsrID09ICd7JykKKwkJCWRlcHRoKys7CisJfQorCisJcmV0dXJuICpjcCAhPSAnXDAnID8gY3AgOiBOVUxMOworfQorLyogUmVjdXJzaXZlIGJyYWNlIGdsb2JiZXIuIE5vdGU6IG1heSBnYXJibGUgcGF0dGVybltdLiAqLworc3RhdGljIGludCBnbG9iX2JyYWNlKGNoYXIgKnBhdHRlcm4sIG9fc3RyaW5nICpvLCBpbnQgbikKK3sKKwljaGFyICpuZXdfcGF0dGVybl9idWY7CisJY29uc3QgY2hhciAqYmVnaW47CisJY29uc3QgY2hhciAqbmV4dDsKKwljb25zdCBjaGFyICpyZXN0OworCWNvbnN0IGNoYXIgKnA7CisJc2l6ZV90IHJlc3RfbGVuOworCisJZGVidWdfcHJpbnRmX2dsb2IoImdsb2JfYnJhY2UoJyVzJylcbiIsIHBhdHRlcm4pOworCisJYmVnaW4gPSBwYXR0ZXJuOworCXdoaWxlICgxKSB7CisJCWlmICgqYmVnaW4gPT0gJ1wwJykKKwkJCWdvdG8gc2ltcGxlX2dsb2I7CisJCWlmICgqYmVnaW4gPT0gJ3snKSB7CisJCQkvKiBGaW5kIHRoZSBmaXJzdCBzdWItcGF0dGVybiBhbmQgYXQgdGhlIHNhbWUgdGltZQorCQkJICogZmluZCB0aGUgcmVzdCBhZnRlciB0aGUgY2xvc2luZyBicmFjZSAqLworCQkJbmV4dCA9IG5leHRfYnJhY2Vfc3ViKGJlZ2luKTsKKwkJCWlmIChuZXh0ID09IE5VTEwpIHsKKwkJCQkvKiBBbiBpbGxlZ2FsIGV4cHJlc3Npb24gKi8KKwkJCQlnb3RvIHNpbXBsZV9nbG9iOworCQkJfQorCQkJaWYgKCpuZXh0ID09ICd9JykgeworCQkJCS8qICJ7YWJjfSIgd2l0aCBubyBjb21tYXMgLSBpbGxlZ2FsCisJCQkJICogYnJhY2UgZXhwciwgZGlzcmVnYXJkIGFuZCBza2lwIGl0ICovCisJCQkJYmVnaW4gPSBuZXh0ICsgMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmICgqYmVnaW4gPT0gJ1xcJyAmJiBiZWdpblsxXSAhPSAnXDAnKQorCQkJYmVnaW4rKzsKKwkJYmVnaW4rKzsKKwl9CisJZGVidWdfcHJpbnRmX2dsb2IoImJlZ2luOiVzXG4iLCBiZWdpbik7CisJZGVidWdfcHJpbnRmX2dsb2IoIm5leHQ6JXNcbiIsIG5leHQpOworCisJLyogTm93IGZpbmQgdGhlIGVuZCBvZiB0aGUgd2hvbGUgYnJhY2UgZXhwcmVzc2lvbiAqLworCXJlc3QgPSBuZXh0OworCXdoaWxlICgqcmVzdCAhPSAnfScpIHsKKwkJcmVzdCA9IG5leHRfYnJhY2Vfc3ViKHJlc3QpOworCQlpZiAocmVzdCA9PSBOVUxMKSB7CisJCQkvKiBBbiBpbGxlZ2FsIGV4cHJlc3Npb24gKi8KKwkJCWdvdG8gc2ltcGxlX2dsb2I7CisJCX0KKwkJZGVidWdfcHJpbnRmX2dsb2IoInJlc3Q6JXNcbiIsIHJlc3QpOworCX0KKwlyZXN0X2xlbiA9IHN0cmxlbigrK3Jlc3QpICsgMTsKKworCS8qIFdlIGFyZSBzdXJlIHRoZSBicmFjZSBleHByZXNzaW9uIGlzIHdlbGwtZm9ybWVkICovCisKKwkvKiBBbGxvY2F0ZSB3b3JraW5nIGJ1ZmZlciBsYXJnZSBlbm91Z2ggZm9yIG91ciB3b3JrICovCisJbmV3X3BhdHRlcm5fYnVmID0geG1hbGxvYyhzdHJsZW4ocGF0dGVybikpOworCisJLyogV2UgaGF2ZSBhIGJyYWNlIGV4cHJlc3Npb24uICBCRUdJTiBwb2ludHMgdG8gdGhlIG9wZW5pbmcgeywKKwkgKiBORVhUIHBvaW50cyBwYXN0IHRoZSB0ZXJtaW5hdG9yIG9mIHRoZSBmaXJzdCBlbGVtZW50LCBhbmQgUkVTVAorCSAqIHBvaW50cyBwYXN0IHRoZSBmaW5hbCB9LiAgV2Ugd2lsbCBhY2N1bXVsYXRlIHJlc3VsdCBuYW1lcyBmcm9tCisJICogcmVjdXJzaXZlIHJ1bnMgZm9yIGVhY2ggYnJhY2UgYWx0ZXJuYXRpdmUgaW4gdGhlIGJ1ZmZlciB1c2luZworCSAqIEdMT0JfQVBQRU5ELiAgKi8KKworCXAgPSBiZWdpbiArIDE7CisJd2hpbGUgKDEpIHsKKwkJLyogQ29uc3RydWN0IHRoZSBuZXcgZ2xvYiBleHByZXNzaW9uICovCisJCW1lbWNweSgKKwkJCW1lbXBjcHkoCisJCQkJbWVtcGNweShuZXdfcGF0dGVybl9idWYsCisJCQkJCS8qIFdlIGtub3cgdGhlIHByZWZpeCBmb3IgYWxsIHN1Yi1wYXR0ZXJucyAqLworCQkJCQlwYXR0ZXJuLCBiZWdpbiAtIHBhdHRlcm4pLAorCQkJCXAsIG5leHQgLSBwKSwKKwkJCXJlc3QsIHJlc3RfbGVuKTsKKworCQkvKiBOb3RlOiBnbG9iX2JyYWNlKCkgbWF5IGdhcmJsZSBuZXdfcGF0dGVybl9idWZbXS4KKwkJICogVGhhdCdzIHdoeSB3ZSByZS1jb3B5IHByZWZpeCBldmVyeSB0aW1lICgxc3QgbWVtY3B5IGFib3ZlKS4KKwkJICovCisJCW4gPSBnbG9iX2JyYWNlKG5ld19wYXR0ZXJuX2J1Ziwgbywgbik7CisJCWlmICgqbmV4dCA9PSAnfScpIHsKKwkJCS8qIFdlIHNhdyB0aGUgbGFzdCBlbnRyeSAqLworCQkJYnJlYWs7CisJCX0KKwkJcCA9IG5leHQgKyAxOworCQluZXh0ID0gbmV4dF9icmFjZV9zdWIobmV4dCk7CisJfQorCWZyZWUobmV3X3BhdHRlcm5fYnVmKTsKKwlyZXR1cm4gbjsKKworIHNpbXBsZV9nbG9iOgorCXsKKwkJaW50IGdyOworCQlnbG9iX3QgZ2xvYmRhdGE7CisKKwkJbWVtc2V0KCZnbG9iZGF0YSwgMCwgc2l6ZW9mKGdsb2JkYXRhKSk7CisJCWdyID0gZ2xvYihwYXR0ZXJuLCAwLCBOVUxMLCAmZ2xvYmRhdGEpOworCQlkZWJ1Z19wcmludGZfZ2xvYigiZ2xvYignJXMnKTolZFxuIiwgcGF0dGVybiwgZ3IpOworCQlpZiAoZ3IgIT0gMCkgeworCQkJaWYgKGdyID09IEdMT0JfTk9NQVRDSCkgeworCQkJCWdsb2JmcmVlKCZnbG9iZGF0YSk7CisJCQkJLyogTkI6IGdhcmJsZXMgcGFyYW1ldGVyICovCisJCQkJdW5iYWNrc2xhc2gocGF0dGVybik7CisJCQkJb19hZGRzdHJfd2l0aF9OVUwobywgcGF0dGVybik7CisJCQkJZGVidWdfcHJpbnRmX2dsb2IoImdsb2IgcGF0dGVybiAnJXMnIGlzIGxpdGVyYWxcbiIsIHBhdHRlcm4pOworCQkJCXJldHVybiBvX3NhdmVfcHRyX2hlbHBlcihvLCBuKTsKKwkJCX0KKwkJCWlmIChnciA9PSBHTE9CX05PU1BBQ0UpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCQkJLyogR0xPQl9BQk9SVEVEPyBPbmx5IGhhcHBlbnMgd2l0aCBHTE9CX0VSUiBmbGFnLAorCQkJICogYnV0IHdlIGRpZG4ndCBzcGVjaWZ5IGl0LiBQYXJhbm9pYSBhZ2Fpbi4gKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJnbG9iIGVycm9yICVkIG9uICclcyciLCBnciwgcGF0dGVybik7CisJCX0KKwkJaWYgKGdsb2JkYXRhLmdsX3BhdGh2ICYmIGdsb2JkYXRhLmdsX3BhdGh2WzBdKSB7CisJCQljaGFyICoqYXJndiA9IGdsb2JkYXRhLmdsX3BhdGh2OworCQkJd2hpbGUgKDEpIHsKKwkJCQlvX2FkZHN0cl93aXRoX05VTChvLCAqYXJndik7CisJCQkJbiA9IG9fc2F2ZV9wdHJfaGVscGVyKG8sIG4pOworCQkJCWFyZ3YrKzsKKwkJCQlpZiAoISphcmd2KQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlnbG9iZnJlZSgmZ2xvYmRhdGEpOworCX0KKwlyZXR1cm4gbjsKK30KKy8qIFBlcmZvcm1zIGdsb2JiaW5nIG9uIGxhc3QgbGlzdFtdLAorICogc2F2aW5nIGVhY2ggcmVzdWx0IGFzIGEgbmV3IGxpc3RbXS4KKyAqLworc3RhdGljIGludCBwZXJmb3JtX2dsb2Iob19zdHJpbmcgKm8sIGludCBuKQoreworCWNoYXIgKnBhdHRlcm4sICpjb3B5OworCisJZGVidWdfcHJpbnRmX2dsb2IoInN0YXJ0IHBlcmZvcm1fZ2xvYjogbjolZCBvLT5kYXRhOiVwXG4iLCBuLCBvLT5kYXRhKTsKKwlpZiAoIW8tPmRhdGEpCisJCXJldHVybiBvX3NhdmVfcHRyX2hlbHBlcihvLCBuKTsKKwlwYXR0ZXJuID0gby0+ZGF0YSArIG9fZ2V0X2xhc3RfcHRyKG8sIG4pOworCWRlYnVnX3ByaW50Zl9nbG9iKCJnbG9iIHBhdHRlcm4gJyVzJ1xuIiwgcGF0dGVybik7CisJaWYgKCFnbG9iX25lZWRlZChwYXR0ZXJuKSkgeworCQkvKiB1bmJhY2tzbGFzaCBsYXN0IHN0cmluZyBpbiBvIGluIHBsYWNlLCBmaXggbGVuZ3RoICovCisJCW8tPmxlbmd0aCA9IHVuYmFja3NsYXNoKHBhdHRlcm4pIC0gby0+ZGF0YTsKKwkJZGVidWdfcHJpbnRmX2dsb2IoImdsb2IgcGF0dGVybiAnJXMnIGlzIGxpdGVyYWxcbiIsIHBhdHRlcm4pOworCQlyZXR1cm4gb19zYXZlX3B0cl9oZWxwZXIobywgbik7CisJfQorCisJY29weSA9IHhzdHJkdXAocGF0dGVybik7CisJLyogImZvcmdldCIgcGF0dGVybiBpbiBvICovCisJby0+bGVuZ3RoID0gcGF0dGVybiAtIG8tPmRhdGE7CisJbiA9IGdsb2JfYnJhY2UoY29weSwgbywgbik7CisJZnJlZShjb3B5KTsKKwlpZiAoREVCVUdfR0xPQikKKwkJZGVidWdfcHJpbnRfbGlzdCgicGVyZm9ybV9nbG9iIHJldHVybmluZyIsIG8sIG4pOworCXJldHVybiBuOworfQorCisjZWxzZSAvKiAhSFVTSF9CUkFDRV9FWFBBTlNJT04gKi8KKworLyogSGVscGVyICovCitzdGF0aWMgaW50IGdsb2JfbmVlZGVkKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCWlmICgqcyA9PSAnXFwnKSB7CisJCQlpZiAoIXNbMV0pCisJCQkJcmV0dXJuIDA7CisJCQlzICs9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnMgPT0gJyonIHx8ICpzID09ICdbJyB8fCAqcyA9PSAnPycpCisJCQlyZXR1cm4gMTsKKwkJcysrOworCX0KKwlyZXR1cm4gMDsKK30KKy8qIFBlcmZvcm1zIGdsb2JiaW5nIG9uIGxhc3QgbGlzdFtdLAorICogc2F2aW5nIGVhY2ggcmVzdWx0IGFzIGEgbmV3IGxpc3RbXS4KKyAqLworc3RhdGljIGludCBwZXJmb3JtX2dsb2Iob19zdHJpbmcgKm8sIGludCBuKQoreworCWdsb2JfdCBnbG9iZGF0YTsKKwlpbnQgZ3I7CisJY2hhciAqcGF0dGVybjsKKworCWRlYnVnX3ByaW50Zl9nbG9iKCJzdGFydCBwZXJmb3JtX2dsb2I6IG46JWQgby0+ZGF0YTolcFxuIiwgbiwgby0+ZGF0YSk7CisJaWYgKCFvLT5kYXRhKQorCQlyZXR1cm4gb19zYXZlX3B0cl9oZWxwZXIobywgbik7CisJcGF0dGVybiA9IG8tPmRhdGEgKyBvX2dldF9sYXN0X3B0cihvLCBuKTsKKwlkZWJ1Z19wcmludGZfZ2xvYigiZ2xvYiBwYXR0ZXJuICclcydcbiIsIHBhdHRlcm4pOworCWlmICghZ2xvYl9uZWVkZWQocGF0dGVybikpIHsKKyBsaXRlcmFsOgorCQkvKiB1bmJhY2tzbGFzaCBsYXN0IHN0cmluZyBpbiBvIGluIHBsYWNlLCBmaXggbGVuZ3RoICovCisJCW8tPmxlbmd0aCA9IHVuYmFja3NsYXNoKHBhdHRlcm4pIC0gby0+ZGF0YTsKKwkJZGVidWdfcHJpbnRmX2dsb2IoImdsb2IgcGF0dGVybiAnJXMnIGlzIGxpdGVyYWxcbiIsIHBhdHRlcm4pOworCQlyZXR1cm4gb19zYXZlX3B0cl9oZWxwZXIobywgbik7CisJfQorCisJbWVtc2V0KCZnbG9iZGF0YSwgMCwgc2l6ZW9mKGdsb2JkYXRhKSk7CisJLyogQ2FuJ3QgdXNlIEdMT0JfTk9DSEVDSzogaXQgZG9lcyBub3QgdW5lc2NhcGUgdGhlIHN0cmluZy4KKwkgKiBJZiB3ZSBnbG9iICIqLlwqIiBhbmQgZG9uJ3QgZmluZCBhbnl0aGluZywgd2UgbmVlZAorCSAqIHRvIGZhbGwgYmFjayB0byB1c2luZyBsaXRlcmFsICIqLioiLCBidXQgR0xPQl9OT0NIRUNLCisJICogd2lsbCByZXR1cm4gIiouXCoiIQorCSAqLworCWdyID0gZ2xvYihwYXR0ZXJuLCAwLCBOVUxMLCAmZ2xvYmRhdGEpOworCWRlYnVnX3ByaW50Zl9nbG9iKCJnbG9iKCclcycpOiVkXG4iLCBwYXR0ZXJuLCBncik7CisJaWYgKGdyICE9IDApIHsKKwkJaWYgKGdyID09IEdMT0JfTk9NQVRDSCkgeworCQkJZ2xvYmZyZWUoJmdsb2JkYXRhKTsKKwkJCWdvdG8gbGl0ZXJhbDsKKwkJfQorCQlpZiAoZ3IgPT0gR0xPQl9OT1NQQUNFKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCQkvKiBHTE9CX0FCT1JURUQ/IE9ubHkgaGFwcGVucyB3aXRoIEdMT0JfRVJSIGZsYWcsCisJCSAqIGJ1dCB3ZSBkaWRuJ3Qgc3BlY2lmeSBpdC4gUGFyYW5vaWEgYWdhaW4uICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJnbG9iIGVycm9yICVkIG9uICclcyciLCBnciwgcGF0dGVybik7CisJfQorCWlmIChnbG9iZGF0YS5nbF9wYXRodiAmJiBnbG9iZGF0YS5nbF9wYXRodlswXSkgeworCQljaGFyICoqYXJndiA9IGdsb2JkYXRhLmdsX3BhdGh2OworCQkvKiAiZm9yZ2V0IiBwYXR0ZXJuIGluIG8gKi8KKwkJby0+bGVuZ3RoID0gcGF0dGVybiAtIG8tPmRhdGE7CisJCXdoaWxlICgxKSB7CisJCQlvX2FkZHN0cl93aXRoX05VTChvLCAqYXJndik7CisJCQluID0gb19zYXZlX3B0cl9oZWxwZXIobywgbik7CisJCQlhcmd2Kys7CisJCQlpZiAoISphcmd2KQorCQkJCWJyZWFrOworCQl9CisJfQorCWdsb2JmcmVlKCZnbG9iZGF0YSk7CisJaWYgKERFQlVHX0dMT0IpCisJCWRlYnVnX3ByaW50X2xpc3QoInBlcmZvcm1fZ2xvYiByZXR1cm5pbmciLCBvLCBuKTsKKwlyZXR1cm4gbjsKK30KKworI2VuZGlmIC8qICFIVVNIX0JSQUNFX0VYUEFOU0lPTiAqLworCisvKiBJZiBvLT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfR0xPQiwgZ2xvYiB0aGUgc3RyaW5nIHNvIGZhciByZW1lbWJlcmVkLgorICogT3RoZXJ3aXNlLCBqdXN0IGZpbmlzaCBjdXJyZW50IGxpc3RbXSBhbmQgc3RhcnQgbmV3ICovCitzdGF0aWMgaW50IG9fc2F2ZV9wdHIob19zdHJpbmcgKm8sIGludCBuKQoreworCWlmIChvLT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfR0xPQikgeworCQkvKiBJZiBvLT5oYXNfZW1wdHlfc2xvdCwgbGlzdFtuXSB3YXMgYWxyZWFkeSBnbG9iYmVkCisJCSAqIChpZiBpdCB3YXMgcmVxdWVzdGVkIGJhY2sgdGhlbiB3aGVuIGl0IHdhcyBmaWxsZWQpCisJCSAqIHNvIGRvbid0IGRvIHRoYXQgYWdhaW4hICovCisJCWlmICghby0+aGFzX2VtcHR5X3Nsb3QpCisJCQlyZXR1cm4gcGVyZm9ybV9nbG9iKG8sIG4pOyAvKiBvX3NhdmVfcHRyX2hlbHBlciBpcyBpbnNpZGUgKi8KKwl9CisJcmV0dXJuIG9fc2F2ZV9wdHJfaGVscGVyKG8sIG4pOworfQorCisvKiAiUGxlYXNlIGNvbnZlcnQgbGlzdFtuXSB0byByZWFsIGNoYXIqIHB0cnMsIGFuZCBOVUxMIHRlcm1pbmF0ZSBpdC4iICovCitzdGF0aWMgY2hhciAqKm9fZmluYWxpemVfbGlzdChvX3N0cmluZyAqbywgaW50IG4pCit7CisJY2hhciAqKmxpc3Q7CisJaW50IHN0cmluZ19zdGFydDsKKworCW4gPSBvX3NhdmVfcHRyKG8sIG4pOyAvKiBmb3JjZSBncm93dGggZm9yIGxpc3Rbbl0gaWYgbmVjZXNzYXJ5ICovCisJaWYgKERFQlVHX0VYUEFORCkKKwkJZGVidWdfcHJpbnRfbGlzdCgiZmluYWxpemVkIiwgbywgbik7CisJZGVidWdfcHJpbnRmX2V4cGFuZCgiZmluYWxpemVkIG46JWRcbiIsIG4pOworCWxpc3QgPSAoY2hhcioqKW8tPmRhdGE7CisJc3RyaW5nX3N0YXJ0ID0gKChuICsgMHhmKSAmIH4weGYpICogc2l6ZW9mKGxpc3RbMF0pOworCWxpc3RbLS1uXSA9IE5VTEw7CisJd2hpbGUgKG4pIHsKKwkJbi0tOworCQlsaXN0W25dID0gby0+ZGF0YSArIChpbnQpKHVpbnRwdHJfdClsaXN0W25dICsgc3RyaW5nX3N0YXJ0OworCX0KKwlyZXR1cm4gbGlzdDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9waXBlX2xpc3Qoc3RydWN0IHBpcGUgKnBpKTsKKworLyogUmV0dXJucyBwaS0+bmV4dCAtIG5leHQgcGlwZSBpbiB0aGUgbGlzdCAqLworc3RhdGljIHN0cnVjdCBwaXBlICpmcmVlX3BpcGUoc3RydWN0IHBpcGUgKnBpKQoreworCXN0cnVjdCBwaXBlICpuZXh0OworCWludCBpOworCisJZGVidWdfcHJpbnRmX2NsZWFuKCJmcmVlX3BpcGUgKHBpZCAlZClcbiIsIGdldHBpZCgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGktPm51bV9jbWRzOyBpKyspIHsKKwkJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQ7CisJCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKnIsICpybmV4dDsKKworCQljb21tYW5kID0gJnBpLT5jbWRzW2ldOworCQlkZWJ1Z19wcmludGZfY2xlYW4oIiAgY29tbWFuZCAlZDpcbiIsIGkpOworCQlpZiAoY29tbWFuZC0+YXJndikgeworCQkJaWYgKERFQlVHX0NMRUFOKSB7CisJCQkJaW50IGE7CisJCQkJY2hhciAqKnA7CisJCQkJZm9yIChhID0gMCwgcCA9IGNvbW1hbmQtPmFyZ3Y7ICpwOyBhKyssIHArKykgeworCQkJCQlkZWJ1Z19wcmludGZfY2xlYW4oIiAgIGFyZ3ZbJWRdID0gJXNcbiIsIGEsICpwKTsKKwkJCQl9CisJCQl9CisJCQlmcmVlX3N0cmluZ3MoY29tbWFuZC0+YXJndik7CisJCQkvL2NvbW1hbmQtPmFyZ3YgPSBOVUxMOworCQl9CisJCS8qIG5vdCAiZWxzZSBpZiI6IG9uIHN5bnRheCBlcnJvciwgd2UgbWF5IGhhdmUgYm90aCEgKi8KKwkJaWYgKGNvbW1hbmQtPmdyb3VwKSB7CisJCQlkZWJ1Z19wcmludGZfY2xlYW4oIiAgIGJlZ2luIGdyb3VwIChjbWRfdHlwZTolZClcbiIsCisJCQkJCWNvbW1hbmQtPmNtZF90eXBlKTsKKwkJCWZyZWVfcGlwZV9saXN0KGNvbW1hbmQtPmdyb3VwKTsKKwkJCWRlYnVnX3ByaW50Zl9jbGVhbigiICAgZW5kIGdyb3VwXG4iKTsKKwkJCS8vY29tbWFuZC0+Z3JvdXAgPSBOVUxMOworCQl9CisJCS8qIGVsc2UgaXMgY3J1Y2lhbCBoZXJlLgorCQkgKiBJZiBncm91cCAhPSBOVUxMLCBjaGlsZF9mdW5jIGlzIG1lYW5pbmdsZXNzICovCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCWVsc2UgaWYgKGNvbW1hbmQtPmNoaWxkX2Z1bmMpIHsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCJjbWQgJXAgcmVsZWFzZXMgY2hpbGQgZnVuYyBhdCAlcFxuIiwgY29tbWFuZCwgY29tbWFuZC0+Y2hpbGRfZnVuYyk7CisJCQljb21tYW5kLT5jaGlsZF9mdW5jLT5wYXJlbnRfY21kID0gTlVMTDsKKwkJfQorI2VuZGlmCisjaWYgIUJCX01NVQorCQlmcmVlKGNvbW1hbmQtPmdyb3VwX2FzX3N0cmluZyk7CisJCS8vY29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nID0gTlVMTDsKKyNlbmRpZgorCQlmb3IgKHIgPSBjb21tYW5kLT5yZWRpcmVjdHM7IHI7IHIgPSBybmV4dCkgeworCQkJZGVidWdfcHJpbnRmX2NsZWFuKCIgICByZWRpcmVjdCAlZCVzIiwKKwkJCQkJci0+cmRfZmQsIHJlZGlyX3RhYmxlW3ItPnJkX3R5cGVdLmRlc2NyaXApOworCQkJLyogZ3VhcmQgYWdhaW5zdCB0aGUgY2FzZSA+JEZPTywgd2hlcmUgZm9vIGlzIHVuc2V0IG9yIGJsYW5rICovCisJCQlpZiAoci0+cmRfZmlsZW5hbWUpIHsKKwkJCQlkZWJ1Z19wcmludGZfY2xlYW4oIiBmbmFtZTonJXMnXG4iLCByLT5yZF9maWxlbmFtZSk7CisJCQkJZnJlZShyLT5yZF9maWxlbmFtZSk7CisJCQkJLy9yLT5yZF9maWxlbmFtZSA9IE5VTEw7CisJCQl9CisJCQlkZWJ1Z19wcmludGZfY2xlYW4oIiByZF9kdXA6JWRcbiIsIHItPnJkX2R1cCk7CisJCQlybmV4dCA9IHItPm5leHQ7CisJCQlmcmVlKHIpOworCQl9CisJCS8vY29tbWFuZC0+cmVkaXJlY3RzID0gTlVMTDsKKwl9CisJZnJlZShwaS0+Y21kcyk7ICAgLyogY2hpbGRyZW4gYXJlIGFuIGFycmF5LCB0aGV5IGdldCBmcmVlZCBhbGwgYXQgb25jZSAqLworCS8vcGktPmNtZHMgPSBOVUxMOworI2lmIEVOQUJMRV9IVVNIX0pPQgorCWZyZWUocGktPmNtZHRleHQpOworCS8vcGktPmNtZHRleHQgPSBOVUxMOworI2VuZGlmCisKKwluZXh0ID0gcGktPm5leHQ7CisJZnJlZShwaSk7CisJcmV0dXJuIG5leHQ7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGlwZV9saXN0KHN0cnVjdCBwaXBlICpwaSkKK3sKKwl3aGlsZSAocGkpIHsKKyNpZiBIQVNfS0VZV09SRFMKKwkJZGVidWdfcHJpbnRmX2NsZWFuKCJwaXBlIHJlc2VydmVkIHdvcmQgJWRcbiIsIHBpLT5yZXNfd29yZCk7CisjZW5kaWYKKwkJZGVidWdfcHJpbnRmX2NsZWFuKCJwaXBlIGZvbGxvd3VwIGNvZGUgJWRcbiIsIHBpLT5mb2xsb3d1cCk7CisJCXBpID0gZnJlZV9waXBlKHBpKTsKKwl9Cit9CisKKworLyoqKiBQYXJzaW5nIHJvdXRpbmVzICoqKi8KKworI2lmbmRlZiBkZWJ1Z19wcmludF90cmVlCitzdGF0aWMgdm9pZCBkZWJ1Z19wcmludF90cmVlKHN0cnVjdCBwaXBlICpwaSwgaW50IGx2bCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgUElQRVtdID0geworCQlbUElQRV9TRVFdID0gIlNFUSIsCisJCVtQSVBFX0FORF0gPSAiQU5EIiwKKwkJW1BJUEVfT1IgXSA9ICJPUiIgLAorCQlbUElQRV9CRyBdID0gIkJHIiAsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqUkVTW10gPSB7CisJCVtSRVNfTk9ORSBdID0gIk5PTkUiICwKKyMgaWYgRU5BQkxFX0hVU0hfSUYKKwkJW1JFU19JRiAgIF0gPSAiSUYiICAgLAorCQlbUkVTX1RIRU4gXSA9ICJUSEVOIiAsCisJCVtSRVNfRUxJRiBdID0gIkVMSUYiICwKKwkJW1JFU19FTFNFIF0gPSAiRUxTRSIgLAorCQlbUkVTX0ZJICAgXSA9ICJGSSIgICAsCisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX0xPT1BTCisJCVtSRVNfRk9SICBdID0gIkZPUiIgICwKKwkJW1JFU19XSElMRV0gPSAiV0hJTEUiLAorCQlbUkVTX1VOVElMXSA9ICJVTlRJTCIsCisJCVtSRVNfRE8gICBdID0gIkRPIiAgICwKKwkJW1JFU19ET05FIF0gPSAiRE9ORSIgLAorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9MT09QUyB8fCBFTkFCTEVfSFVTSF9DQVNFCisJCVtSRVNfSU4gICBdID0gIklOIiAgICwKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQlbUkVTX0NBU0UgXSA9ICJDQVNFIiAsCisJCVtSRVNfQ0FTRV9JTiBdID0gIkNBU0VfSU4iICwKKwkJW1JFU19NQVRDSF0gPSAiTUFUQ0giLAorCQlbUkVTX0NBU0VfQk9EWV0gPSAiQ0FTRV9CT0RZIiwKKwkJW1JFU19FU0FDIF0gPSAiRVNBQyIgLAorIyBlbmRpZgorCQlbUkVTX1hYWFggXSA9ICJYWFhYIiAsCisJCVtSRVNfU05UWCBdID0gIlNOVFgiICwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBDTURUWVBFW10gPSB7CisJCSJ7fSIsCisJCSIoKSIsCisJCSJbbm9nbG9iXSIsCisjIGlmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQkiZnVuYygpIiwKKyMgZW5kaWYKKwl9OworCisJaW50IHBpbiwgcHJuOworCisJcGluID0gMDsKKwl3aGlsZSAocGkpIHsKKwkJZmRwcmludGYoMiwgIiUqc3BpcGUgJWQgcmVzX3dvcmQ9JXMgZm9sbG93dXA9JWQgJXNcbiIsIGx2bCoyLCAiIiwKKwkJCQlwaW4sIFJFU1twaS0+cmVzX3dvcmRdLCBwaS0+Zm9sbG93dXAsIFBJUEVbcGktPmZvbGxvd3VwXSk7CisJCXBybiA9IDA7CisJCXdoaWxlIChwcm4gPCBwaS0+bnVtX2NtZHMpIHsKKwkJCXN0cnVjdCBjb21tYW5kICpjb21tYW5kID0gJnBpLT5jbWRzW3Bybl07CisJCQljaGFyICoqYXJndiA9IGNvbW1hbmQtPmFyZ3Y7CisKKwkJCWZkcHJpbnRmKDIsICIlKnMgY21kICVkIGFzc2lnbm1lbnRfY250OiVkIiwKKwkJCQkJbHZsKjIsICIiLCBwcm4sCisJCQkJCWNvbW1hbmQtPmFzc2lnbm1lbnRfY250KTsKKwkJCWlmIChjb21tYW5kLT5ncm91cCkgeworCQkJCWZkcHJpbnRmKDIsICIgZ3JvdXAgJXM6IChhcmd2PSVwKSVzJXNcbiIsCisJCQkJCQlDTURUWVBFW2NvbW1hbmQtPmNtZF90eXBlXSwKKwkJCQkJCWFyZ3YKKyMgaWYgIUJCX01NVQorCQkJCQkJLCAiIGdyb3VwX2FzX3N0cmluZzoiLCBjb21tYW5kLT5ncm91cF9hc19zdHJpbmcKKyMgZWxzZQorCQkJCQkJLCAiIiwgIiIKKyMgZW5kaWYKKwkJCQkpOworCQkJCWRlYnVnX3ByaW50X3RyZWUoY29tbWFuZC0+Z3JvdXAsIGx2bCsxKTsKKwkJCQlwcm4rKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChhcmd2KSB3aGlsZSAoKmFyZ3YpIHsKKwkJCQlmZHByaW50ZigyLCAiICclcyciLCAqYXJndik7CisJCQkJYXJndisrOworCQkJfQorCQkJZmRwcmludGYoMiwgIlxuIik7CisJCQlwcm4rKzsKKwkJfQorCQlwaSA9IHBpLT5uZXh0OworCQlwaW4rKzsKKwl9Cit9CisjZW5kaWYgLyogZGVidWdfcHJpbnRfdHJlZSAqLworCitzdGF0aWMgc3RydWN0IHBpcGUgKm5ld19waXBlKHZvaWQpCit7CisJc3RydWN0IHBpcGUgKnBpOworCXBpID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHBpcGUpKTsKKwkvKnBpLT5mb2xsb3d1cCA9IDA7IC0gZGVsaWJlcmF0ZWx5IGludmFsaWQgdmFsdWUgKi8KKwkvKnBpLT5yZXNfd29yZCA9IFJFU19OT05FOyAtIFJFU19OT05FIGlzIDAgYW55d2F5ICovCisJcmV0dXJuIHBpOworfQorCisvKiBDb21tYW5kIChtZW1iZXIgb2YgYSBwaXBlKSBpcyBjb21wbGV0ZSwgb3Igd2Ugc3RhcnQgYSBuZXcgcGlwZQorICogaWYgY3R4LT5jb21tYW5kIGlzIE5VTEwuCisgKiBObyBlcnJvcnMgcG9zc2libGUgaGVyZS4KKyAqLworc3RhdGljIGludCBkb25lX2NvbW1hbmQoc3RydWN0IHBhcnNlX2NvbnRleHQgKmN0eCkKK3sKKwkvKiBUaGUgY29tbWFuZCBpcyByZWFsbHkgYWxyZWFkeSBpbiB0aGUgcGlwZSBzdHJ1Y3R1cmUsIHNvCisJICogYWR2YW5jZSB0aGUgcGlwZSBjb3VudGVyIGFuZCBtYWtlIGEgbmV3LCBudWxsIGNvbW1hbmQuICovCisJc3RydWN0IHBpcGUgKnBpID0gY3R4LT5waXBlOworCXN0cnVjdCBjb21tYW5kICpjb21tYW5kID0gY3R4LT5jb21tYW5kOworCisJaWYgKGNvbW1hbmQpIHsKKwkJaWYgKElTX05VTExfQ01EKGNvbW1hbmQpKSB7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfY29tbWFuZDogc2tpcHBpbmcgbnVsbCBjbWQsIG51bV9jbWRzPSVkXG4iLCBwaS0+bnVtX2NtZHMpOworCQkJZ290byBjbGVhcl9hbmRfcmV0OworCQl9CisJCXBpLT5udW1fY21kcysrOworCQlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfY29tbWFuZDogKytudW1fY21kcz0lZFxuIiwgcGktPm51bV9jbWRzKTsKKwkJLy9kZWJ1Z19wcmludF90cmVlKGN0eC0+bGlzdF9oZWFkLCAyMCk7CisJfSBlbHNlIHsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX2NvbW1hbmQ6IGluaXRpYWxpemluZywgbnVtX2NtZHM9JWRcbiIsIHBpLT5udW1fY21kcyk7CisJfQorCisJLyogT25seSByZWFsIHRyaWNraW5lc3MgaGVyZSBpcyB0aGF0IHRoZSB1bmNvbW1pdHRlZAorCSAqIGNvbW1hbmQgc3RydWN0dXJlIGlzIG5vdCBjb3VudGVkIGluIHBpLT5udW1fY21kcy4gKi8KKwlwaS0+Y21kcyA9IHhyZWFsbG9jKHBpLT5jbWRzLCBzaXplb2YoKnBpLT5jbWRzKSAqIChwaS0+bnVtX2NtZHMrMSkpOworCWN0eC0+Y29tbWFuZCA9IGNvbW1hbmQgPSAmcGktPmNtZHNbcGktPm51bV9jbWRzXTsKKyBjbGVhcl9hbmRfcmV0OgorCW1lbXNldChjb21tYW5kLCAwLCBzaXplb2YoKmNvbW1hbmQpKTsKKwlyZXR1cm4gcGktPm51bV9jbWRzOyAvKiB1c2VkIG9ubHkgZm9yIDAvbm9uemVybyBjaGVjayAqLworfQorCitzdGF0aWMgdm9pZCBkb25lX3BpcGUoc3RydWN0IHBhcnNlX2NvbnRleHQgKmN0eCwgcGlwZV9zdHlsZSB0eXBlKQoreworCWludCBub3RfbnVsbDsKKworCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV9waXBlIGVudGVyZWQsIGZvbGxvd3VwICVkXG4iLCB0eXBlKTsKKwkvKiBDbG9zZSBwcmV2aW91cyBjb21tYW5kICovCisJbm90X251bGwgPSBkb25lX2NvbW1hbmQoY3R4KTsKKwljdHgtPnBpcGUtPmZvbGxvd3VwID0gdHlwZTsKKyNpZiBIQVNfS0VZV09SRFMKKwljdHgtPnBpcGUtPnBpX2ludmVydGVkID0gY3R4LT5jdHhfaW52ZXJ0ZWQ7CisJY3R4LT5jdHhfaW52ZXJ0ZWQgPSAwOworCWN0eC0+cGlwZS0+cmVzX3dvcmQgPSBjdHgtPmN0eF9yZXNfdzsKKyNlbmRpZgorCisJLyogV2l0aG91dCB0aGlzIGNoZWNrLCBldmVuIGp1c3QgPGVudGVyPiBvbiBjb21tYW5kIGxpbmUgZ2VuZXJhdGVzCisJICogdHJlZSBvZiB0aHJlZSBOT1BzICghKS4gV2hpY2ggaXMgaGFybWxlc3MgYnV0IGFubm95aW5nLgorCSAqIElPVzogaXQgaXMgc2FmZSB0byBkbyBpdCB1bmNvbmRpdGlvbmFsbHkuICovCisJaWYgKG5vdF9udWxsCisjaWYgRU5BQkxFX0hVU0hfSUYKKwkgfHwgY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0ZJCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCSB8fCBjdHgtPmN0eF9yZXNfdyA9PSBSRVNfRE9ORQorCSB8fCBjdHgtPmN0eF9yZXNfdyA9PSBSRVNfRk9SCisJIHx8IGN0eC0+Y3R4X3Jlc193ID09IFJFU19JTgorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCSB8fCBjdHgtPmN0eF9yZXNfdyA9PSBSRVNfRVNBQworI2VuZGlmCisJKSB7CisJCXN0cnVjdCBwaXBlICpuZXdfcDsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX3BpcGU6IGFkZGluZyBuZXcgcGlwZTogIgorCQkJCSJub3RfbnVsbDolZCBjdHgtPmN0eF9yZXNfdzolZFxuIiwKKwkJCQlub3RfbnVsbCwgY3R4LT5jdHhfcmVzX3cpOworCQluZXdfcCA9IG5ld19waXBlKCk7CisJCWN0eC0+cGlwZS0+bmV4dCA9IG5ld19wOworCQljdHgtPnBpcGUgPSBuZXdfcDsKKwkJLyogUkVTX1RIRU4sIFJFU19ETyBldGMgYXJlICJzdGlja3kiIC0KKwkJICogdGhleSByZW1haW4gc2V0IGZvciBwaXBlcyBpbnNpZGUgaWYvd2hpbGUuCisJCSAqIFRoaXMgaXMgdXNlZCB0byBjb250cm9sIGV4ZWN1dGlvbi4KKwkJICogUkVTX0ZPUiBhbmQgUkVTX0lOIGFyZSBOT1Qgc3RpY2t5IChuZWVkZWQgdG8gc3VwcG9ydAorCQkgKiBjYXNlcyB3aGVyZSB2YXJpYWJsZSBvciB2YWx1ZSBoYXBwZW5zIHRvIG1hdGNoIGEga2V5d29yZCk6CisJCSAqLworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJCWlmIChjdHgtPmN0eF9yZXNfdyA9PSBSRVNfRk9SCisJCSB8fCBjdHgtPmN0eF9yZXNfdyA9PSBSRVNfSU4pCisJCQljdHgtPmN0eF9yZXNfdyA9IFJFU19OT05FOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQlpZiAoY3R4LT5jdHhfcmVzX3cgPT0gUkVTX01BVENIKQorCQkJY3R4LT5jdHhfcmVzX3cgPSBSRVNfQ0FTRV9CT0RZOworCQlpZiAoY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0NBU0UpCisJCQljdHgtPmN0eF9yZXNfdyA9IFJFU19DQVNFX0lOOworI2VuZGlmCisJCWN0eC0+Y29tbWFuZCA9IE5VTEw7IC8qIHRyaWNrIGRvbmVfY29tbWFuZCBiZWxvdyAqLworCQkvKiBDcmVhdGUgdGhlIG1lbW9yeSBmb3IgY29tbWFuZCwgcm91Z2hseToKKwkJICogY3R4LT5waXBlLT5jbWRzID0gbmV3IHN0cnVjdCBjb21tYW5kOworCQkgKiBjdHgtPmNvbW1hbmQgPSAmY3R4LT5waXBlLT5jbWRzWzBdOworCQkgKi8KKwkJZG9uZV9jb21tYW5kKGN0eCk7CisJCS8vZGVidWdfcHJpbnRfdHJlZShjdHgtPmxpc3RfaGVhZCwgMTApOworCX0KKwlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfcGlwZSByZXR1cm5cbiIpOworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2NvbnRleHQoc3RydWN0IHBhcnNlX2NvbnRleHQgKmN0eCkKK3sKKwltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworCWN0eC0+cGlwZSA9IGN0eC0+bGlzdF9oZWFkID0gbmV3X3BpcGUoKTsKKwkvKiBDcmVhdGUgdGhlIG1lbW9yeSBmb3IgY29tbWFuZCwgcm91Z2hseToKKwkgKiBjdHgtPnBpcGUtPmNtZHMgPSBuZXcgc3RydWN0IGNvbW1hbmQ7CisJICogY3R4LT5jb21tYW5kID0gJmN0eC0+cGlwZS0+Y21kc1swXTsKKwkgKi8KKwlkb25lX2NvbW1hbmQoY3R4KTsKK30KKworLyogSWYgYSByZXNlcnZlZCB3b3JkIGlzIGZvdW5kIGFuZCBwcm9jZXNzZWQsIHBhcnNlIGNvbnRleHQgaXMgbW9kaWZpZWQKKyAqIGFuZCAxIGlzIHJldHVybmVkLgorICovCisjaWYgSEFTX0tFWVdPUkRTCitzdHJ1Y3QgcmVzZXJ2ZWRfY29tYm8geworCWNoYXIgbGl0ZXJhbFs2XTsKKwl1bnNpZ25lZCBjaGFyIHJlczsKKwl1bnNpZ25lZCBjaGFyIGFzc2lnbm1lbnRfZmxhZzsKKwlpbnQgZmxhZzsKK307CitlbnVtIHsKKwlGTEFHX0VORCAgID0gKDEgPDwgUkVTX05PTkUgKSwKKyMgaWYgRU5BQkxFX0hVU0hfSUYKKwlGTEFHX0lGICAgID0gKDEgPDwgUkVTX0lGICAgKSwKKwlGTEFHX1RIRU4gID0gKDEgPDwgUkVTX1RIRU4gKSwKKwlGTEFHX0VMSUYgID0gKDEgPDwgUkVTX0VMSUYgKSwKKwlGTEFHX0VMU0UgID0gKDEgPDwgUkVTX0VMU0UgKSwKKwlGTEFHX0ZJICAgID0gKDEgPDwgUkVTX0ZJICAgKSwKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwlGTEFHX0ZPUiAgID0gKDEgPDwgUkVTX0ZPUiAgKSwKKwlGTEFHX1dISUxFID0gKDEgPDwgUkVTX1dISUxFKSwKKwlGTEFHX1VOVElMID0gKDEgPDwgUkVTX1VOVElMKSwKKwlGTEFHX0RPICAgID0gKDEgPDwgUkVTX0RPICAgKSwKKwlGTEFHX0RPTkUgID0gKDEgPDwgUkVTX0RPTkUgKSwKKwlGTEFHX0lOICAgID0gKDEgPDwgUkVTX0lOICAgKSwKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfQ0FTRQorCUZMQUdfTUFUQ0ggPSAoMSA8PCBSRVNfTUFUQ0gpLAorCUZMQUdfRVNBQyAgPSAoMSA8PCBSRVNfRVNBQyApLAorIyBlbmRpZgorCUZMQUdfU1RBUlQgPSAoMSA8PCBSRVNfWFhYWCApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZXNlcnZlZF9jb21ibyogbWF0Y2hfcmVzZXJ2ZWRfd29yZChvX3N0cmluZyAqd29yZCkKK3sKKwkvKiBNb3N0bHkgYSBsaXN0IG9mIGFjY2VwdGVkIGZvbGxvdy11cCByZXNlcnZlZCB3b3Jkcy4KKwkgKiBGTEFHX0VORCBtZWFucyB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBzZXF1ZW5jZSwgYW5kIGFyZSByZWFkeQorCSAqIHRvIHR1cm4gdGhlIGNvbXBvdW5kIGxpc3QgaW50byBhIGNvbW1hbmQuCisJICogRkxBR19TVEFSVCBtZWFucyB0aGUgd29yZCBtdXN0IHN0YXJ0IGEgbmV3IGNvbXBvdW5kIGxpc3QuCisJICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCByZXNlcnZlZF9jb21ibyByZXNlcnZlZF9saXN0W10gPSB7CisjIGlmIEVOQUJMRV9IVVNIX0lGCisJCXsgIiEiLCAgICAgUkVTX05PTkUsICBOT1RfQVNTSUdOTUVOVCAgLCAwIH0sCisJCXsgImlmIiwgICAgUkVTX0lGLCAgICBNQVlCRV9BU1NJR05NRU5ULCBGTEFHX1RIRU4gfCBGTEFHX1NUQVJUIH0sCisJCXsgInRoZW4iLCAgUkVTX1RIRU4sICBNQVlCRV9BU1NJR05NRU5ULCBGTEFHX0VMSUYgfCBGTEFHX0VMU0UgfCBGTEFHX0ZJIH0sCisJCXsgImVsaWYiLCAgUkVTX0VMSUYsICBNQVlCRV9BU1NJR05NRU5ULCBGTEFHX1RIRU4gfSwKKwkJeyAiZWxzZSIsICBSRVNfRUxTRSwgIE1BWUJFX0FTU0lHTk1FTlQsIEZMQUdfRkkgICB9LAorCQl7ICJmaSIsICAgIFJFU19GSSwgICAgTk9UX0FTU0lHTk1FTlQgICwgRkxBR19FTkQgIH0sCisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX0xPT1BTCisJCXsgImZvciIsICAgUkVTX0ZPUiwgICBOT1RfQVNTSUdOTUVOVCAgLCBGTEFHX0lOIHwgRkxBR19ETyB8IEZMQUdfU1RBUlQgfSwKKwkJeyAid2hpbGUiLCBSRVNfV0hJTEUsIE1BWUJFX0FTU0lHTk1FTlQsIEZMQUdfRE8gfCBGTEFHX1NUQVJUIH0sCisJCXsgInVudGlsIiwgUkVTX1VOVElMLCBNQVlCRV9BU1NJR05NRU5ULCBGTEFHX0RPIHwgRkxBR19TVEFSVCB9LAorCQl7ICJpbiIsICAgIFJFU19JTiwgICAgTk9UX0FTU0lHTk1FTlQgICwgRkxBR19ETyAgIH0sCisJCXsgImRvIiwgICAgUkVTX0RPLCAgICBNQVlCRV9BU1NJR05NRU5ULCBGTEFHX0RPTkUgfSwKKwkJeyAiZG9uZSIsICBSRVNfRE9ORSwgIE5PVF9BU1NJR05NRU5UICAsIEZMQUdfRU5EICB9LAorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9DQVNFCisJCXsgImNhc2UiLCAgUkVTX0NBU0UsICBOT1RfQVNTSUdOTUVOVCAgLCBGTEFHX01BVENIIHwgRkxBR19TVEFSVCB9LAorCQl7ICJlc2FjIiwgIFJFU19FU0FDLCAgTk9UX0FTU0lHTk1FTlQgICwgRkxBR19FTkQgIH0sCisjIGVuZGlmCisJfTsKKwljb25zdCBzdHJ1Y3QgcmVzZXJ2ZWRfY29tYm8gKnI7CisKKwlmb3IgKHIgPSByZXNlcnZlZF9saXN0OyByIDwgcmVzZXJ2ZWRfbGlzdCArIEFSUkFZX1NJWkUocmVzZXJ2ZWRfbGlzdCk7IHIrKykgeworCQlpZiAoc3RyY21wKHdvcmQtPmRhdGEsIHItPmxpdGVyYWwpID09IDApCisJCQlyZXR1cm4gcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisvKiBSZXR1cm4gMDogbm90IGEga2V5d29yZCwgMToga2V5d29yZAorICovCitzdGF0aWMgaW50IHJlc2VydmVkX3dvcmQob19zdHJpbmcgKndvcmQsIHN0cnVjdCBwYXJzZV9jb250ZXh0ICpjdHgpCit7CisjIGlmIEVOQUJMRV9IVVNIX0NBU0UKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJlc2VydmVkX2NvbWJvIHJlc2VydmVkX21hdGNoID0geworCQkiIiwgICAgICAgIFJFU19NQVRDSCwgTk9UX0FTU0lHTk1FTlQgLCBGTEFHX01BVENIIHwgRkxBR19FU0FDCisJfTsKKyMgZW5kaWYKKwljb25zdCBzdHJ1Y3QgcmVzZXJ2ZWRfY29tYm8gKnI7CisKKwlpZiAod29yZC0+aGFzX3F1b3RlZF9wYXJ0KQorCQlyZXR1cm4gMDsKKwlyID0gbWF0Y2hfcmVzZXJ2ZWRfd29yZCh3b3JkKTsKKwlpZiAoIXIpCisJCXJldHVybiAwOworCisJZGVidWdfcHJpbnRmKCJmb3VuZCByZXNlcnZlZCB3b3JkICVzLCByZXMgJWRcbiIsIHItPmxpdGVyYWwsIHItPnJlcyk7CisjIGlmIEVOQUJMRV9IVVNIX0NBU0UKKwlpZiAoci0+cmVzID09IFJFU19JTiAmJiBjdHgtPmN0eF9yZXNfdyA9PSBSRVNfQ0FTRV9JTikgeworCQkvKiAiY2FzZSB3b3JkIElOIC4uLiIgLSBJTiBwYXJ0IHN0YXJ0cyBmaXJzdCBNQVRDSCBwYXJ0ICovCisJCXIgPSAmcmVzZXJ2ZWRfbWF0Y2g7CisJfSBlbHNlCisjIGVuZGlmCisJaWYgKHItPmZsYWcgPT0gMCkgeyAvKiAnIScgKi8KKwkJaWYgKGN0eC0+Y3R4X2ludmVydGVkKSB7IC8qIGJhc2ggZG9lc24ndCBhY2NlcHQgJyEgISB0cnVlJyAqLworCQkJc3ludGF4X2Vycm9yKCIhICEgY29tbWFuZCIpOworCQkJY3R4LT5jdHhfcmVzX3cgPSBSRVNfU05UWDsKKwkJfQorCQljdHgtPmN0eF9pbnZlcnRlZCA9IDE7CisJCXJldHVybiAxOworCX0KKwlpZiAoci0+ZmxhZyAmIEZMQUdfU1RBUlQpIHsKKwkJc3RydWN0IHBhcnNlX2NvbnRleHQgKm9sZDsKKworCQlvbGQgPSB4bWFsbG9jKHNpemVvZigqb2xkKSk7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgicHVzaCBzdGFjayAlcFxuIiwgb2xkKTsKKwkJKm9sZCA9ICpjdHg7ICAgLyogcGh5c2ljYWwgY29weSAqLworCQlpbml0aWFsaXplX2NvbnRleHQoY3R4KTsKKwkJY3R4LT5zdGFjayA9IG9sZDsKKwl9IGVsc2UgaWYgKC8qY3R4LT5jdHhfcmVzX3cgPT0gUkVTX05PTkUgfHwqLyAhKGN0eC0+b2xkX2ZsYWcgJiAoMSA8PCByLT5yZXMpKSkgeworCQlzeW50YXhfZXJyb3JfYXQod29yZC0+ZGF0YSk7CisJCWN0eC0+Y3R4X3Jlc193ID0gUkVTX1NOVFg7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCS8qICJ7Li4ufSBmaSIgaXMgb2suICJ7Li4ufSBpZiIgaXMgbm90CisJCSAqIEV4YW1wbGU6CisJCSAqIGlmIHsgZWNobyBmb287IH0gdGhlbiB7IGVjaG8gYmFyOyB9IGZpICovCisJCWlmIChjdHgtPmNvbW1hbmQtPmdyb3VwKQorCQkJZG9uZV9waXBlKGN0eCwgUElQRV9TRVEpOworCX0KKworCWN0eC0+Y3R4X3Jlc193ID0gci0+cmVzOworCWN0eC0+b2xkX2ZsYWcgPSByLT5mbGFnOworCXdvcmQtPm9fYXNzaWdubWVudCA9IHItPmFzc2lnbm1lbnRfZmxhZzsKKwlkZWJ1Z19wcmludGZfcGFyc2UoIndvcmQtPm9fYXNzaWdubWVudD0nJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbd29yZC0+b19hc3NpZ25tZW50XSk7CisKKwlpZiAoY3R4LT5vbGRfZmxhZyAmIEZMQUdfRU5EKSB7CisJCXN0cnVjdCBwYXJzZV9jb250ZXh0ICpvbGQ7CisKKwkJZG9uZV9waXBlKGN0eCwgUElQRV9TRVEpOworCQlkZWJ1Z19wcmludGZfcGFyc2UoInBvcCBzdGFjayAlcFxuIiwgY3R4LT5zdGFjayk7CisJCW9sZCA9IGN0eC0+c3RhY2s7CisJCW9sZC0+Y29tbWFuZC0+Z3JvdXAgPSBjdHgtPmxpc3RfaGVhZDsKKwkJb2xkLT5jb21tYW5kLT5jbWRfdHlwZSA9IENNRF9OT1JNQUw7CisjIGlmICFCQl9NTVUKKwkJb19hZGRzdHIoJm9sZC0+YXNfc3RyaW5nLCBjdHgtPmFzX3N0cmluZy5kYXRhKTsKKwkJb19mcmVlX3Vuc2FmZSgmY3R4LT5hc19zdHJpbmcpOworCQlvbGQtPmNvbW1hbmQtPmdyb3VwX2FzX3N0cmluZyA9IHhzdHJkdXAob2xkLT5hc19zdHJpbmcuZGF0YSk7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgicG9wLCByZW1lbWJlcmluZyBhczonJXMnXG4iLAorCQkJCW9sZC0+Y29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nKTsKKyMgZW5kaWYKKwkJKmN0eCA9ICpvbGQ7ICAgLyogcGh5c2ljYWwgY29weSAqLworCQlmcmVlKG9sZCk7CisJfQorCXJldHVybiAxOworfQorI2VuZGlmIC8qIEhBU19LRVlXT1JEUyAqLworCisvKiBXb3JkIGlzIGNvbXBsZXRlLCBsb29rIGF0IGl0IGFuZCB1cGRhdGUgcGFyc2luZyBjb250ZXh0LgorICogTm9ybWFsIHJldHVybiBpcyAwLiBTeW50YXggZXJyb3JzIHJldHVybiAxLgorICogTm90ZTogb24gcmV0dXJuLCB3b3JkIGlzIHJlc2V0LCBidXQgbm90IG9fZnJlZSdkIQorICovCitzdGF0aWMgaW50IGRvbmVfd29yZChvX3N0cmluZyAqd29yZCwgc3RydWN0IHBhcnNlX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCA9IGN0eC0+Y29tbWFuZDsKKworCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV93b3JkIGVudGVyZWQ6ICclcycgJXBcbiIsIHdvcmQtPmRhdGEsIGNvbW1hbmQpOworCWlmICh3b3JkLT5sZW5ndGggPT0gMCAmJiAhd29yZC0+aGFzX3F1b3RlZF9wYXJ0KSB7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV93b3JkIHJldHVybiAwOiB0cnVlIG51bGwsIGlnbm9yZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY3R4LT5wZW5kaW5nX3JlZGlyZWN0KSB7CisJCS8qIFdlIGRvIG5vdCBnbG9iIGluIGUuZy4gPioudG1wIGNhc2UuIGJhc2ggc2VlbXMgdG8gZ2xvYiBoZXJlCisJCSAqIG9ubHkgaWYgcnVuIGFzICJiYXNoIiwgbm90ICJzaCIgKi8KKwkJLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy94Y3VfY2hhcDAyLmh0bWwKKwkJICogIjIuNyBSZWRpcmVjdGlvbgorCQkgKiAuLi50aGUgd29yZCB0aGF0IGZvbGxvd3MgdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9yCisJCSAqIHNoYWxsIGJlIHN1YmplY3RlZCB0byB0aWxkZSBleHBhbnNpb24sIHBhcmFtZXRlciBleHBhbnNpb24sCisJCSAqIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCBhcml0aG1ldGljIGV4cGFuc2lvbiwgYW5kIHF1b3RlCisJCSAqIHJlbW92YWwuIFBhdGhuYW1lIGV4cGFuc2lvbiBzaGFsbCBub3QgYmUgcGVyZm9ybWVkCisJCSAqIG9uIHRoZSB3b3JkIGJ5IGEgbm9uLWludGVyYWN0aXZlIHNoZWxsOyBhbiBpbnRlcmFjdGl2ZQorCQkgKiBzaGVsbCBtYXkgcGVyZm9ybSBpdCwgYnV0IHNoYWxsIGRvIHNvIG9ubHkgd2hlbgorCQkgKiB0aGUgZXhwYW5zaW9uIHdvdWxkIHJlc3VsdCBpbiBvbmUgd29yZC4iCisJCSAqLworCQljdHgtPnBlbmRpbmdfcmVkaXJlY3QtPnJkX2ZpbGVuYW1lID0geHN0cmR1cCh3b3JkLT5kYXRhKTsKKwkJLyogQ2F0ZXIgZm9yID5cZmlsZSBjYXNlOgorCQkgKiA+XGEgY3JlYXRlcyBmaWxlIGE7ID5cXGEsID4iXGEiLCA+IlxcYSIgY3JlYXRlIGZpbGUgXGEKKwkJICogU2FtZSB3aXRoIGhlcmVkb2NzOgorCQkgKiBmb3IgPDxcSCBkZWxpbSBpcyBIOyA8PFxcSCwgPDwiXEgiLCA8PCJcXEgiIC0gXEgKKwkJICovCisJCWlmIChjdHgtPnBlbmRpbmdfcmVkaXJlY3QtPnJkX3R5cGUgPT0gUkVESVJFQ1RfSEVSRURPQykgeworCQkJdW5iYWNrc2xhc2goY3R4LT5wZW5kaW5nX3JlZGlyZWN0LT5yZF9maWxlbmFtZSk7CisJCQkvKiBJcyBpdCA8PCJIRVJFRE9DIj8gKi8KKwkJCWlmICh3b3JkLT5oYXNfcXVvdGVkX3BhcnQpIHsKKwkJCQljdHgtPnBlbmRpbmdfcmVkaXJlY3QtPnJkX2R1cCB8PSBIRVJFRE9DX1FVT1RFRDsKKwkJCX0KKwkJfQorCQlkZWJ1Z19wcmludGZfcGFyc2UoIndvcmQgc3RvcmVkIGluIHJkX2ZpbGVuYW1lOiAnJXMnXG4iLCB3b3JkLT5kYXRhKTsKKwkJY3R4LT5wZW5kaW5nX3JlZGlyZWN0ID0gTlVMTDsKKwl9IGVsc2UgeworI2lmIEhBU19LRVlXT1JEUworIyBpZiBFTkFCTEVfSFVTSF9DQVNFCisJCWlmIChjdHgtPmN0eF9kc2VtaWNvbG9uCisJCSAmJiBzdHJjbXAod29yZC0+ZGF0YSwgImVzYWMiKSAhPSAwIC8qIG5vdCAiLi4uIHBhdHRlcm4pIGNtZDs7IGVzYWMiICovCisJCSkgeworCQkJLyogYWxyZWFkeSBkb25lIHdoZW4gY3R4X2RzZW1pY29sb24gd2FzIHNldCB0byAxOiAqLworCQkJLyogY3R4LT5jdHhfcmVzX3cgPSBSRVNfTUFUQ0g7ICovCisJCQljdHgtPmN0eF9kc2VtaWNvbG9uID0gMDsKKwkJfSBlbHNlCisjIGVuZGlmCisJCWlmICghY29tbWFuZC0+YXJndiAvKiBpZiBpdCdzIHRoZSBmaXJzdCB3b3JkLi4uICovCisjIGlmIEVOQUJMRV9IVVNIX0xPT1BTCisJCSAmJiBjdHgtPmN0eF9yZXNfdyAhPSBSRVNfRk9SIC8qIC4uLm5vdCBhZnRlciBGT1Igb3IgSU4gKi8KKwkJICYmIGN0eC0+Y3R4X3Jlc193ICE9IFJFU19JTgorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9DQVNFCisJCSAmJiBjdHgtPmN0eF9yZXNfdyAhPSBSRVNfQ0FTRQorIyBlbmRpZgorCQkpIHsKKwkJCWludCByZXNlcnZlZCA9IHJlc2VydmVkX3dvcmQod29yZCwgY3R4KTsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiY2hlY2tpbmcgZm9yIHJlc2VydmVkLW5lc3M6ICVkXG4iLCByZXNlcnZlZCk7CisJCQlpZiAocmVzZXJ2ZWQpIHsKKwkJCQlvX3Jlc2V0X3RvX2VtcHR5X3VucXVvdGVkKHdvcmQpOworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV93b3JkIHJldHVybiAlZFxuIiwKKwkJCQkJCShjdHgtPmN0eF9yZXNfdyA9PSBSRVNfU05UWCkpOworCQkJCXJldHVybiAoY3R4LT5jdHhfcmVzX3cgPT0gUkVTX1NOVFgpOworCQkJfQorIyBpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCQkJaWYgKHN0cmNtcCh3b3JkLT5kYXRhLCAiW1siKSA9PSAwKSB7CisJCQkJY29tbWFuZC0+Y21kX3R5cGUgPSBDTURfU0lOR0xFV09SRF9OT0dMT0I7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKyMgZW5kaWYKKwkJfQorI2VuZGlmCisJCWlmIChjb21tYW5kLT5ncm91cCkgeworCQkJLyogInsgZWNobyBmb287IH0gZWNobyBiYXIiIC0gYmFkICovCisJCQlzeW50YXhfZXJyb3JfYXQod29yZC0+ZGF0YSk7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfd29yZCByZXR1cm4gMTogc3ludGF4IGVycm9yLCAiCisJCQkJCSJncm91cHMgYW5kIGFyZ2xpc3RzIGRvbid0IG1peFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIElmIHRoaXMgd29yZCB3YXNuJ3QgYW4gYXNzaWdubWVudCwgbmV4dCBvbmVzIGRlZmluaXRlbHkKKwkJICogY2FuJ3QgYmUgYXNzaWdubWVudHMuIEV2ZW4gaWYgdGhleSBsb29rIGxpa2Ugb25lcy4gKi8KKwkJaWYgKHdvcmQtPm9fYXNzaWdubWVudCAhPSBERUZJTklURUxZX0FTU0lHTk1FTlQKKwkJICYmIHdvcmQtPm9fYXNzaWdubWVudCAhPSBXT1JEX0lTX0tFWVdPUkQKKwkJKSB7CisJCQl3b3JkLT5vX2Fzc2lnbm1lbnQgPSBOT1RfQVNTSUdOTUVOVDsKKwkJfSBlbHNlIHsKKwkJCWlmICh3b3JkLT5vX2Fzc2lnbm1lbnQgPT0gREVGSU5JVEVMWV9BU1NJR05NRU5UKSB7CisJCQkJY29tbWFuZC0+YXNzaWdubWVudF9jbnQrKzsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoIisrYXNzaWdubWVudF9jbnQ9JWRcbiIsIGNvbW1hbmQtPmFzc2lnbm1lbnRfY250KTsKKwkJCX0KKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgid29yZC0+b19hc3NpZ25tZW50IHdhczonJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbd29yZC0+b19hc3NpZ25tZW50XSk7CisJCQl3b3JkLT5vX2Fzc2lnbm1lbnQgPSBNQVlCRV9BU1NJR05NRU5UOworCQl9CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgid29yZC0+b19hc3NpZ25tZW50PSclcydcbiIsIGFzc2lnbm1lbnRfZmxhZ1t3b3JkLT5vX2Fzc2lnbm1lbnRdKTsKKworCQlpZiAod29yZC0+aGFzX3F1b3RlZF9wYXJ0CisJCSAvKiBvcHRpbWl6YXRpb246IGFuZCBpZiBpdCdzICgiIiBvciAnJykgb3IgKCR2Li4uIG9yIGBjbWRgLi4uKTogKi8KKwkJICYmICh3b3JkLT5kYXRhWzBdID09ICdcMCcgfHwgd29yZC0+ZGF0YVswXSA9PSBTUEVDSUFMX1ZBUl9TWU1CT0wpCisJCSAvKiAob3RoZXJ3aXNlIGl0J3Mga25vd24gdG8gYmUgbm90IGVtcHR5IGFuZCBpcyBhbHJlYWR5IHNhZmUpICovCisJCSkgeworCQkJLyogZXhjbHVkZSAiJEAiIC0gaXQgY2FuIGV4cGFuZCB0byBubyB3b3JkIGRlc3BpdGUgIiIgKi8KKwkJCWNoYXIgKnAgPSB3b3JkLT5kYXRhOworCQkJd2hpbGUgKHBbMF0gPT0gU1BFQ0lBTF9WQVJfU1lNQk9MCisJCQkgICAgJiYgKHBbMV0gJiAweDdmKSA9PSAnQCcKKwkJCSAgICAmJiBwWzJdID09IFNQRUNJQUxfVkFSX1NZTUJPTAorCQkJKSB7CisJCQkJcCArPSAzOworCQkJfQorCQl9CisJCWNvbW1hbmQtPmFyZ3YgPSBhZGRfc3RyaW5nX3RvX3N0cmluZ3MoY29tbWFuZC0+YXJndiwgeHN0cmR1cCh3b3JkLT5kYXRhKSk7CisJCWRlYnVnX3ByaW50X3N0cmluZ3MoIndvcmQgYXBwZW5kZWQgdG8gYXJndiIsIGNvbW1hbmQtPmFyZ3YpOworCX0KKworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJaWYgKGN0eC0+Y3R4X3Jlc193ID09IFJFU19GT1IpIHsKKwkJaWYgKHdvcmQtPmhhc19xdW90ZWRfcGFydAorCQkgfHwgIWlzX3dlbGxfZm9ybWVkX3Zhcl9uYW1lKGNvbW1hbmQtPmFyZ3ZbMF0sICdcMCcpCisJCSkgeworCQkJLyogYmFzaCBzYXlzIGp1c3QgIm5vdCBhIHZhbGlkIGlkZW50aWZpZXIiICovCisJCQlzeW50YXhfZXJyb3IoIm5vdCBhIHZhbGlkIGlkZW50aWZpZXIgaW4gZm9yIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBGb3JjZSBGT1IgdG8gaGF2ZSBqdXN0IG9uZSB3b3JkICh2YXJpYWJsZSBuYW1lKSAqLworCQkvKiBOQjogYmFzaWNhbGx5LCB0aGlzIG1ha2VzIGh1c2ggc2VlICJmb3IgdiBpbiAuLi4iCisJCSAqIHN5bnRheCBhcyBpZiBpdCBpcyAiZm9yIHY7IGluIC4uLiIuIEZPUiBhbmQgSU4gYmVjb21lCisJCSAqIHR3byBwaXBlIHN0cnVjdHMgaW4gcGFyc2UgdHJlZS4gKi8KKwkJZG9uZV9waXBlKGN0eCwgUElQRV9TRVEpOworCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkvKiBGb3JjZSBDQVNFIHRvIGhhdmUganVzdCBvbmUgd29yZCAqLworCWlmIChjdHgtPmN0eF9yZXNfdyA9PSBSRVNfQ0FTRSkgeworCQlkb25lX3BpcGUoY3R4LCBQSVBFX1NFUSk7CisJfQorI2VuZGlmCisKKwlvX3Jlc2V0X3RvX2VtcHR5X3VucXVvdGVkKHdvcmQpOworCisJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX3dvcmQgcmV0dXJuIDBcbiIpOworCXJldHVybiAwOworfQorCisKKy8qIFBlZWsgYWhlYWQgaW4gdGhlIGlucHV0IHRvIGZpbmQgb3V0IGlmIHdlIGhhdmUgYSAiJm4iIGNvbnN0cnVjdCwKKyAqIGFzIGluICIyPiYxIiwgdGhhdCByZXByZXNlbnRzIGR1cGxpY2F0aW5nIGEgZmlsZSBkZXNjcmlwdG9yLgorICogUmV0dXJuOgorICogUkVESVJGRF9DTE9TRSBpZiA+Ji0gImNsb3NlIGZkIiBjb25zdHJ1Y3QgaXMgc2VlbiwKKyAqIFJFRElSRkRfU1lOVEFYX0VSUiBpZiBzeW50YXggZXJyb3IsCisgKiBSRURJUkZEX1RPX0ZJTEUgaWYgbm8gJiB3YXMgc2VlbiwKKyAqIG9yIHRoZSBudW1iZXIgZm91bmQuCisgKi8KKyNpZiBCQl9NTVUKKyNkZWZpbmUgcGFyc2VfcmVkaXJfcmlnaHRfZmQoYXNfc3RyaW5nLCBpbnB1dCkgXAorCXBhcnNlX3JlZGlyX3JpZ2h0X2ZkKGlucHV0KQorI2VuZGlmCitzdGF0aWMgaW50IHBhcnNlX3JlZGlyX3JpZ2h0X2ZkKG9fc3RyaW5nICphc19zdHJpbmcsIHN0cnVjdCBpbl9zdHIgKmlucHV0KQoreworCWludCBjaCwgZCwgb2s7CisKKwljaCA9IGlfcGVlayhpbnB1dCk7CisJaWYgKGNoICE9ICcmJykKKwkJcmV0dXJuIFJFRElSRkRfVE9fRklMRTsKKworCWNoID0gaV9nZXRjaChpbnB1dCk7ICAvKiBnZXQgdGhlICYgKi8KKwlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJY2ggPSBpX3BlZWsoaW5wdXQpOworCWlmIChjaCA9PSAnLScpIHsKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQlyZXR1cm4gUkVESVJGRF9DTE9TRTsKKwl9CisJZCA9IDA7CisJb2sgPSAwOworCXdoaWxlIChjaCAhPSBFT0YgJiYgaXNkaWdpdChjaCkpIHsKKwkJZCA9IGQqMTAgKyAoY2gtJzAnKTsKKwkJb2sgPSAxOworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCWNoID0gaV9wZWVrKGlucHV0KTsKKwl9CisJaWYgKG9rKSByZXR1cm4gZDsKKworLy9UT0RPOiB0aGlzIGlzIHRoZSBwbGFjZSB0byBjYXRjaCAiPiZmaWxlIiBiYXNoaXNtIChyZWRpcmVjdCBib3RoIGZkIDEgYW5kIDIpCisKKwliYl9lcnJvcl9tc2coImFtYmlndW91cyByZWRpcmVjdCIpOworCXJldHVybiBSRURJUkZEX1NZTlRBWF9FUlI7Cit9CisKKy8qIFJldHVybiBjb2RlIGlzIDAgbm9ybWFsLCAxIGlmIGEgc3ludGF4IGVycm9yIGlzIGRldGVjdGVkCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcmVkaXJlY3Qoc3RydWN0IHBhcnNlX2NvbnRleHQgKmN0eCwKKwkJaW50IGZkLAorCQlyZWRpcl90eXBlIHN0eWxlLAorCQlzdHJ1Y3QgaW5fc3RyICppbnB1dCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCA9IGN0eC0+Y29tbWFuZDsKKwlzdHJ1Y3QgcmVkaXJfc3RydWN0ICpyZWRpcjsKKwlzdHJ1Y3QgcmVkaXJfc3RydWN0ICoqcmVkaXJwOworCWludCBkdXBfbnVtOworCisJZHVwX251bSA9IFJFRElSRkRfVE9fRklMRTsKKwlpZiAoc3R5bGUgIT0gUkVESVJFQ1RfSEVSRURPQykgeworCQkvKiBDaGVjayBmb3IgYSAnPiYxJyB0eXBlIHJlZGlyZWN0ICovCisJCWR1cF9udW0gPSBwYXJzZV9yZWRpcl9yaWdodF9mZCgmY3R4LT5hc19zdHJpbmcsIGlucHV0KTsKKwkJaWYgKGR1cF9udW0gPT0gUkVESVJGRF9TWU5UQVhfRVJSKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaW50IGNoID0gaV9wZWVrKGlucHV0KTsKKwkJZHVwX251bSA9IChjaCA9PSAnLScpOyAvKiBIRVJFRE9DX1NLSVBUQUJTIGJpdCBpcyAxICovCisJCWlmIChkdXBfbnVtKSB7IC8qIDw8LS4uLiAqLworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCW5vbW11X2FkZGNocigmY3R4LT5hc19zdHJpbmcsIGNoKTsKKwkJCWNoID0gaV9wZWVrKGlucHV0KTsKKwkJfQorCX0KKworCWlmIChzdHlsZSA9PSBSRURJUkVDVF9PVkVSV1JJVEUgJiYgZHVwX251bSA9PSBSRURJUkZEX1RPX0ZJTEUpIHsKKwkJaW50IGNoID0gaV9wZWVrKGlucHV0KTsKKwkJaWYgKGNoID09ICd8JykgeworCQkJLyogPnxGSUxFIHJlZGlyZWN0ICgiY2xvYmJlcmluZyIgPikuCisJCQkgKiBTaW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCAic2V0IC1vIG5vY2xvYmJlciIgeWV0LAorCQkJICogPnwgYW5kID4gYXJlIHRoZSBzYW1lIGZvciBub3cuIEp1c3QgZWF0IHwuCisJCQkgKi8KKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQlub21tdV9hZGRjaHIoJmN0eC0+YXNfc3RyaW5nLCBjaCk7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgYSBuZXcgcmVkaXJfc3RydWN0IGFuZCBhcHBlbmQgaXQgdG8gdGhlIGxpbmtlZCBsaXN0ICovCisJcmVkaXJwID0gJmNvbW1hbmQtPnJlZGlyZWN0czsKKwl3aGlsZSAoKHJlZGlyID0gKnJlZGlycCkgIT0gTlVMTCkgeworCQlyZWRpcnAgPSAmKHJlZGlyLT5uZXh0KTsKKwl9CisJKnJlZGlycCA9IHJlZGlyID0geHphbGxvYyhzaXplb2YoKnJlZGlyKSk7CisJLyogcmVkaXItPm5leHQgPSBOVUxMOyAqLworCS8qIHJlZGlyLT5yZF9maWxlbmFtZSA9IE5VTEw7ICovCisJcmVkaXItPnJkX3R5cGUgPSBzdHlsZTsKKwlyZWRpci0+cmRfZmQgPSAoZmQgPT0gLTEpID8gcmVkaXJfdGFibGVbc3R5bGVdLmRlZmF1bHRfZmQgOiBmZDsKKworCWRlYnVnX3ByaW50Zl9wYXJzZSgicmVkaXJlY3QgdHlwZSAlZCAlc1xuIiwgcmVkaXItPnJkX2ZkLAorCQkJCXJlZGlyX3RhYmxlW3N0eWxlXS5kZXNjcmlwKTsKKworCXJlZGlyLT5yZF9kdXAgPSBkdXBfbnVtOworCWlmIChzdHlsZSAhPSBSRURJUkVDVF9IRVJFRE9DICYmIGR1cF9udW0gIT0gUkVESVJGRF9UT19GSUxFKSB7CisJCS8qIEVyaWsgaGFkIGEgY2hlY2sgaGVyZSB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gcXVlc3Rpb24KKwkJICogaXMgbGVnaXQ7IEkgcG9zdHBvbmUgdGhhdCB0byAicnVuIHRpbWUiCisJCSAqIEEgIi0iIHJlcHJlc2VudGF0aW9uIG9mICJjbG9zZSBtZSIgc2hvd3MgdXAgYXMgYSAtMyBoZXJlICovCisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZHVwbGljYXRpbmcgcmVkaXJlY3QgJyVkPiYlZCdcbiIsCisJCQkJcmVkaXItPnJkX2ZkLCByZWRpci0+cmRfZHVwKTsKKwl9IGVsc2UgeworCQkvKiBTZXQgY3R4LT5wZW5kaW5nX3JlZGlyZWN0LCBzbyB3ZSBrbm93IHdoYXQgdG8gZG8gYXQgdGhlCisJCSAqIGVuZCBvZiB0aGUgbmV4dCBwYXJzZWQgd29yZC4gKi8KKwkJY3R4LT5wZW5kaW5nX3JlZGlyZWN0ID0gcmVkaXI7CisJfQorCXJldHVybiAwOworfQorCisvKiBJZiBhIHJlZGlyZWN0IGlzIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgbnVtYmVyLCB0aGF0IG51bWJlciBpcworICogc3VwcG9zZWQgdG8gdGVsbCB3aGljaCBmaWxlIGRlc2NyaXB0b3IgdG8gcmVkaXJlY3QuICBUaGlzIHJvdXRpbmUKKyAqIGxvb2tzIGZvciBzdWNoIHByZWNlZGluZyBudW1iZXJzLiAgSW4gYW4gaWRlYWwgd29ybGQgdGhpcyByb3V0aW5lCisgKiBuZWVkcyB0byBoYW5kbGUgYWxsIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBvZiByZWRpcmVjdHMuLi4KKyAqICAgICBlY2hvIDI+Zm9vICAgICAjIHJlZGlyZWN0cyBmZCAgMiB0byBmaWxlICJmb28iLCBub3RoaW5nIHBhc3NlZCB0byBlY2hvCisgKiAgICAgZWNobyA0OT5mb28gICAgIyByZWRpcmVjdHMgZmQgNDkgdG8gZmlsZSAiZm9vIiwgbm90aGluZyBwYXNzZWQgdG8gZWNobworICogICAgIGVjaG8gLTI+Zm9vICAgICMgcmVkaXJlY3RzIGZkICAxIHRvIGZpbGUgImZvbyIsICAgICItMiIgcGFzc2VkIHRvIGVjaG8KKyAqICAgICBlY2hvIDQ5eD5mb28gICAjIHJlZGlyZWN0cyBmZCAgMSB0byBmaWxlICJmb28iLCAgICI0OXgiIHBhc3NlZCB0byBlY2hvCisgKgorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy94Y3VfY2hhcDAyLmh0bWwKKyAqICIyLjcgUmVkaXJlY3Rpb24KKyAqIC4uLiBJZiBuIGlzIHF1b3RlZCwgdGhlIG51bWJlciBzaGFsbCBub3QgYmUgcmVjb2duaXplZCBhcyBwYXJ0IG9mCisgKiB0aGUgcmVkaXJlY3Rpb24gZXhwcmVzc2lvbi4gRm9yIGV4YW1wbGU6CisgKiBlY2hvIFwyPmEKKyAqIHdyaXRlcyB0aGUgY2hhcmFjdGVyIDIgaW50byBmaWxlIGEiCisgKiBXZSBhcmUgZ2V0dGluZyBpdCByaWdodCBieSBzZXR0aW5nIC0+aGFzX3F1b3RlZF9wYXJ0IG9uIGFueSBcPGNoYXI+CisgKgorICogQSAtMSByZXR1cm4gbWVhbnMgbm8gdmFsaWQgbnVtYmVyIHdhcyBmb3VuZCwKKyAqIHRoZSBjYWxsZXIgc2hvdWxkIHVzZSB0aGUgYXBwcm9wcmlhdGUgZGVmYXVsdCBmb3IgdGhpcyByZWRpcmVjdGlvbi4KKyAqLworc3RhdGljIGludCByZWRpcmVjdF9vcHRfbnVtKG9fc3RyaW5nICpvKQoreworCWludCBudW07CisKKwlpZiAoby0+ZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbnVtID0gYmJfc3RydG91KG8tPmRhdGEsIE5VTEwsIDEwKTsKKwlpZiAoZXJybm8gfHwgbnVtIDwgMCkKKwkJcmV0dXJuIC0xOworCW9fcmVzZXRfdG9fZW1wdHlfdW5xdW90ZWQobyk7CisJcmV0dXJuIG51bTsKK30KKworI2lmIEJCX01NVQorI2RlZmluZSBmZXRjaF90aWxsX3N0cihhc19zdHJpbmcsIGlucHV0LCB3b3JkLCBza2lwX3RhYnMpIFwKKwlmZXRjaF90aWxsX3N0cihpbnB1dCwgd29yZCwgc2tpcF90YWJzKQorI2VuZGlmCitzdGF0aWMgY2hhciAqZmV0Y2hfdGlsbF9zdHIob19zdHJpbmcgKmFzX3N0cmluZywKKwkJc3RydWN0IGluX3N0ciAqaW5wdXQsCisJCWNvbnN0IGNoYXIgKndvcmQsCisJCWludCBoZXJlZG9jX2ZsYWdzKQoreworCW9fc3RyaW5nIGhlcmVkb2MgPSBOVUxMX09fU1RSSU5HOworCXVuc2lnbmVkIHBhc3RfRU9MOworCWludCBwcmV2ID0gMDsgLyogbm90IFwgKi8KKwlpbnQgY2g7CisKKwlnb3RvIGp1bXBfaW47CisKKwl3aGlsZSAoMSkgeworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlpZiAoY2ggIT0gRU9GKQorCQkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQlpZiAoKGNoID09ICdcbicgfHwgY2ggPT0gRU9GKQorCQkgJiYgKChoZXJlZG9jX2ZsYWdzICYgSEVSRURPQ19RVU9URUQpIHx8IHByZXYgIT0gJ1xcJykKKwkJKSB7CisJCQlpZiAoc3RyY21wKGhlcmVkb2MuZGF0YSArIHBhc3RfRU9MLCB3b3JkKSA9PSAwKSB7CisJCQkJaGVyZWRvYy5kYXRhW3Bhc3RfRU9MXSA9ICdcMCc7CisJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZWQgaGVyZWRvYyAnJXMnXG4iLCBoZXJlZG9jLmRhdGEpOworCQkJCXJldHVybiBoZXJlZG9jLmRhdGE7CisJCQl9CisJCQl3aGlsZSAoY2ggPT0gJ1xuJykgeworCQkJCW9fYWRkY2hyKCZoZXJlZG9jLCBjaCk7CisJCQkJcHJldiA9IGNoOworIGp1bXBfaW46CisJCQkJcGFzdF9FT0wgPSBoZXJlZG9jLmxlbmd0aDsKKwkJCQlkbyB7CisJCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJCWlmIChjaCAhPSBFT0YpCisJCQkJCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCQkJfSB3aGlsZSAoKGhlcmVkb2NfZmxhZ3MgJiBIRVJFRE9DX1NLSVBUQUJTKSAmJiBjaCA9PSAnXHQnKTsKKwkJCX0KKwkJfQorCQlpZiAoY2ggPT0gRU9GKSB7CisJCQlvX2ZyZWVfdW5zYWZlKCZoZXJlZG9jKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW9fYWRkY2hyKCZoZXJlZG9jLCBjaCk7CisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJaWYgKHByZXYgPT0gJ1xcJyAmJiBjaCA9PSAnXFwnKQorCQkJLyogQ29ycmVjdGx5IGhhbmRsZSBmb29cXDxlb2w+IChub3QgYSBsaW5lIGNvbnQuKSAqLworCQkJcHJldiA9IDA7IC8qIG5vdCBcICovCisJCWVsc2UKKwkJCXByZXYgPSBjaDsKKwl9Cit9CisKKy8qIExvb2sgYXQgZW50aXJlIHBhcnNlIHRyZWUgZm9yIG5vdC15ZXQtbG9hZGVkIFJFRElSRUNUX0hFUkVET0NzCisgKiBhbmQgbG9hZCB0aGVtIGFsbC4gVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgaGVyZWRvY19jbnQgb2YgdGhlbS4KKyAqLworc3RhdGljIGludCBmZXRjaF9oZXJlZG9jcyhpbnQgaGVyZWRvY19jbnQsIHN0cnVjdCBwYXJzZV9jb250ZXh0ICpjdHgsIHN0cnVjdCBpbl9zdHIgKmlucHV0KQoreworCXN0cnVjdCBwaXBlICpwaSA9IGN0eC0+bGlzdF9oZWFkOworCisJd2hpbGUgKHBpICYmIGhlcmVkb2NfY250KSB7CisJCWludCBpOworCQlzdHJ1Y3QgY29tbWFuZCAqY21kID0gcGktPmNtZHM7CisKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJmZXRjaF9oZXJlZG9jczogbnVtX2NtZHM6JWQgY21kIGFyZ3YwOiclcydcbiIsCisJCQkJcGktPm51bV9jbWRzLAorCQkJCWNtZC0+YXJndiA/IGNtZC0+YXJndlswXSA6ICJOT05FIik7CisJCWZvciAoaSA9IDA7IGkgPCBwaS0+bnVtX2NtZHM7IGkrKykgeworCQkJc3RydWN0IHJlZGlyX3N0cnVjdCAqcmVkaXIgPSBjbWQtPnJlZGlyZWN0czsKKworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJmZXRjaF9oZXJlZG9jczogJWQgY21kIGFyZ3YwOiclcydcbiIsCisJCQkJCWksIGNtZC0+YXJndiA/IGNtZC0+YXJndlswXSA6ICJOT05FIik7CisJCQl3aGlsZSAocmVkaXIpIHsKKwkJCQlpZiAocmVkaXItPnJkX3R5cGUgPT0gUkVESVJFQ1RfSEVSRURPQykgeworCQkJCQljaGFyICpwOworCisJCQkJCXJlZGlyLT5yZF90eXBlID0gUkVESVJFQ1RfSEVSRURPQzI7CisJCQkJCS8qIHJlZGlyLT5yZF9kdXAgaXMgKGFiKXVzZWQgdG8gaW5kaWNhdGUgPDwtICovCisJCQkJCXAgPSBmZXRjaF90aWxsX3N0cigmY3R4LT5hc19zdHJpbmcsIGlucHV0LAorCQkJCQkJCXJlZGlyLT5yZF9maWxlbmFtZSwgcmVkaXItPnJkX2R1cCk7CisJCQkJCWlmICghcCkgeworCQkJCQkJc3ludGF4X2Vycm9yKCJ1bmV4cGVjdGVkIEVPRiBpbiBoZXJlIGRvY3VtZW50Iik7CisJCQkJCQlyZXR1cm4gMTsKKwkJCQkJfQorCQkJCQlmcmVlKHJlZGlyLT5yZF9maWxlbmFtZSk7CisJCQkJCXJlZGlyLT5yZF9maWxlbmFtZSA9IHA7CisJCQkJCWhlcmVkb2NfY250LS07CisJCQkJfQorCQkJCXJlZGlyID0gcmVkaXItPm5leHQ7CisJCQl9CisJCQljbWQrKzsKKwkJfQorCQlwaSA9IHBpLT5uZXh0OworCX0KKyNpZiAwCisJLyogU2hvdWxkIGJlIDAuIElmIGl0IGlzbid0LCBpdCdzIGEgcGFyc2UgZXJyb3IgKi8KKwlpZiAoaGVyZWRvY19jbnQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJoZXJlZG9jIEJVRyAyIik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJ1bl9saXN0KHN0cnVjdCBwaXBlICpwaSk7CisjaWYgQkJfTU1VCisjZGVmaW5lIHBhcnNlX3N0cmVhbShwc3RyaW5nLCBpbnB1dCwgZW5kX3RyaWdnZXIpIFwKKwlwYXJzZV9zdHJlYW0oaW5wdXQsIGVuZF90cmlnZ2VyKQorI2VuZGlmCitzdGF0aWMgc3RydWN0IHBpcGUgKnBhcnNlX3N0cmVhbShjaGFyICoqcHN0cmluZywKKwkJc3RydWN0IGluX3N0ciAqaW5wdXQsCisJCWludCBlbmRfdHJpZ2dlcik7CisKKworI2lmICFFTkFCTEVfSFVTSF9GVU5DVElPTlMKKyNkZWZpbmUgcGFyc2VfZ3JvdXAoZGVzdCwgY3R4LCBpbnB1dCwgY2gpIFwKKwlwYXJzZV9ncm91cChjdHgsIGlucHV0LCBjaCkKKyNlbmRpZgorc3RhdGljIGludCBwYXJzZV9ncm91cChvX3N0cmluZyAqZGVzdCwgc3RydWN0IHBhcnNlX2NvbnRleHQgKmN0eCwKKwlzdHJ1Y3QgaW5fc3RyICppbnB1dCwgaW50IGNoKQoreworCS8qIGRlc3QgY29udGFpbnMgY2hhcmFjdGVycyBzZWVuIHByaW9yIHRvICggb3Igey4KKwkgKiBUeXBpY2FsbHkgaXQncyBlbXB0eSwgYnV0IGZvciBmdW5jdGlvbiBkZWZzLAorCSAqIGl0IGNvbnRhaW5zIGZ1bmN0aW9uIG5hbWUgKHdpdGhvdXQgJygpJykuICovCisJc3RydWN0IHBpcGUgKnBpcGVfbGlzdDsKKwlpbnQgZW5kY2g7CisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQgPSBjdHgtPmNvbW1hbmQ7CisKKwlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX2dyb3VwIGVudGVyZWRcbiIpOworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCWlmIChjaCA9PSAnKCcgJiYgIWRlc3QtPmhhc19xdW90ZWRfcGFydCkgeworCQlpZiAoZGVzdC0+bGVuZ3RoKQorCQkJaWYgKGRvbmVfd29yZChkZXN0LCBjdHgpKQorCQkJCXJldHVybiAxOworCQlpZiAoIWNvbW1hbmQtPmFyZ3YpCisJCQlnb3RvIHNraXA7IC8qICguLi4gKi8KKwkJaWYgKGNvbW1hbmQtPmFyZ3ZbMV0pIHsgLyogd29yZCB3b3JkIC4uLiAoLi4uICovCisJCQlzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaCgnKCcpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogaXQgaXMgIndvcmQoLi4uIiBvciAid29yZCAoLi4uIiAqLworCQlkbworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJd2hpbGUgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnKTsKKwkJaWYgKGNoICE9ICcpJykgeworCQkJc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2goY2gpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbm9tbXVfYWRkY2hyKCZjdHgtPmFzX3N0cmluZywgY2gpOworCQlkbworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJd2hpbGUgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicpOworCQlpZiAoY2ggIT0gJ3snKSB7CisJCQlzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaChjaCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlub21tdV9hZGRjaHIoJmN0eC0+YXNfc3RyaW5nLCBjaCk7CisJCWNvbW1hbmQtPmNtZF90eXBlID0gQ01EX0ZVTkNERUY7CisJCWdvdG8gc2tpcDsKKwl9CisjZW5kaWYKKworI2lmIDAgLyogUHJldmVudGVkIGJ5IGNhbGxlciAqLworCWlmIChjb21tYW5kLT5hcmd2IC8qIHdvcmQgW3dvcmRdey4uLiAqLworCSB8fCBkZXN0LT5sZW5ndGggLyogd29yZHsuLi4gKi8KKwkgfHwgZGVzdC0+aGFzX3F1b3RlZF9wYXJ0IC8qICIiey4uLiAqLworCSkgeworCQlzeW50YXhfZXJyb3IoTlVMTCk7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2VfZ3JvdXAgcmV0dXJuIDE6ICIKKwkJCSJzeW50YXggZXJyb3IsIGdyb3VwcyBhbmQgYXJnbGlzdHMgZG9uJ3QgbWl4XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKyBza2lwOgorI2VuZGlmCisJZW5kY2ggPSAnfSc7CisJaWYgKGNoID09ICcoJykgeworCQllbmRjaCA9ICcpJzsKKwkJY29tbWFuZC0+Y21kX3R5cGUgPSBDTURfU1VCU0hFTEw7CisJfSBlbHNlIHsKKwkJLyogYmFzaCBkb2VzIG5vdCBhbGxvdyAie2VjaG8uLi4iLCByZXF1aXJlcyB3aGl0ZXNwYWNlICovCisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCWlmIChjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JyAmJiBjaCAhPSAnXG4nKSB7CisJCQlzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaChjaCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlub21tdV9hZGRjaHIoJmN0eC0+YXNfc3RyaW5nLCBjaCk7CisJfQorCisJeworI2lmIEJCX01NVQorIyBkZWZpbmUgYXNfc3RyaW5nIE5VTEwKKyNlbHNlCisJCWNoYXIgKmFzX3N0cmluZyA9IE5VTEw7CisjZW5kaWYKKwkJcGlwZV9saXN0ID0gcGFyc2Vfc3RyZWFtKCZhc19zdHJpbmcsIGlucHV0LCBlbmRjaCk7CisjaWYgIUJCX01NVQorCQlpZiAoYXNfc3RyaW5nKQorCQkJb19hZGRzdHIoJmN0eC0+YXNfc3RyaW5nLCBhc19zdHJpbmcpOworI2VuZGlmCisJCS8qIGVtcHR5ICgpL3t9IG9yIHBhcnNlIGVycm9yPyAqLworCQlpZiAoIXBpcGVfbGlzdCB8fCBwaXBlX2xpc3QgPT0gRVJSX1BUUikgeworCQkJLyogcGFyc2Vfc3RyZWFtIGFscmVhZHkgZW1pdHRlZCBlcnJvciBtc2cgKi8KKwkJCWlmICghQkJfTU1VKQorCQkJCWZyZWUoYXNfc3RyaW5nKTsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2VfZ3JvdXAgcmV0dXJuIDE6ICIKKwkJCQkicGFyc2Vfc3RyZWFtIHJldHVybmVkICVwXG4iLCBwaXBlX2xpc3QpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJY29tbWFuZC0+Z3JvdXAgPSBwaXBlX2xpc3Q7CisjaWYgIUJCX01NVQorCQlhc19zdHJpbmdbc3RybGVuKGFzX3N0cmluZykgLSAxXSA9ICdcMCc7IC8qIHBsaW5rICcpJyBvciAnfScgKi8KKwkJY29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nID0gYXNfc3RyaW5nOworCQlkZWJ1Z19wcmludGZfcGFyc2UoImVuZCBvZiBncm91cCwgcmVtZW1iZXJpbmcgYXM6JyVzJ1xuIiwKKwkJCQljb21tYW5kLT5ncm91cF9hc19zdHJpbmcpOworI2VuZGlmCisjdW5kZWYgYXNfc3RyaW5nCisJfQorCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2VfZ3JvdXAgcmV0dXJuIDBcbiIpOworCXJldHVybiAwOworCS8qIGNvbW1hbmQgcmVtYWlucyAib3BlbiIsIGF2YWlsYWJsZSBmb3IgcG9zc2libGUgcmVkaXJlY3RzICovCit9CisKKyNpZiBFTkFCTEVfSFVTSF9USUNLIHx8IEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQgfHwgRU5BQkxFX0hVU0hfRE9MTEFSX09QUworLyogU3Vicm91dGluZXMgZm9yIGNvcHlpbmcgJCguLi4pIGFuZCBgLi4uYCB0aGluZ3MgKi8KK3N0YXRpYyBpbnQgYWRkX3RpbGxfYmFja3F1b3RlKG9fc3RyaW5nICpkZXN0LCBzdHJ1Y3QgaW5fc3RyICppbnB1dCwgaW50IGluX2RxdW90ZSk7CisvKiAnLi4uJyAqLworc3RhdGljIGludCBhZGRfdGlsbF9zaW5nbGVfcXVvdGUob19zdHJpbmcgKmRlc3QsIHN0cnVjdCBpbl9zdHIgKmlucHV0KQoreworCXdoaWxlICgxKSB7CisJCWludCBjaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlpZiAoY2ggPT0gRU9GKSB7CisJCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKCdcJycpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGNoID09ICdcJycpCisJCQlyZXR1cm4gMTsKKwkJb19hZGRjaHIoZGVzdCwgY2gpOworCX0KK30KKy8qICIuLi5cIi4uLmAuLmAuLi4uIiAtIGRvIHdlIG5lZWQgdG8gaGFuZGxlICIuLi4kKC4uKS4uLiIgdG9vPyAqLworc3RhdGljIGludCBhZGRfdGlsbF9kb3VibGVfcXVvdGUob19zdHJpbmcgKmRlc3QsIHN0cnVjdCBpbl9zdHIgKmlucHV0KQoreworCXdoaWxlICgxKSB7CisJCWludCBjaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlpZiAoY2ggPT0gRU9GKSB7CisJCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKCciJyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoY2ggPT0gJyInKQorCQkJcmV0dXJuIDE7CisJCWlmIChjaCA9PSAnXFwnKSB7ICAvKiBceC4gQ29weSBib3RoIGNoYXJzLiAqLworCQkJb19hZGRjaHIoZGVzdCwgY2gpOworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJfQorCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCWlmIChjaCA9PSAnYCcpIHsKKwkJCWlmICghYWRkX3RpbGxfYmFja3F1b3RlKGRlc3QsIGlucHV0LCAvKmluX2RxdW90ZToqLyAxKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8vaWYgKGNoID09ICckJykgLi4uCisJfQorfQorLyogUHJvY2VzcyBgY21kYCAtIGNvcHkgY29udGVudHMgdW50aWwgImAiIGlzIHNlZW4uIENvbXBsaWNhdGVkIGJ5CisgKiBcYCBxdW90aW5nLgorICogIldpdGhpbiB0aGUgYmFja3F1b3RlZCBzdHlsZSBvZiBjb21tYW5kIHN1YnN0aXR1dGlvbiwgYmFja3NsYXNoCisgKiBzaGFsbCByZXRhaW4gaXRzIGxpdGVyYWwgbWVhbmluZywgZXhjZXB0IHdoZW4gZm9sbG93ZWQgYnk6ICckJywgJ2AnLCBvciAnXCcuCisgKiBUaGUgc2VhcmNoIGZvciB0aGUgbWF0Y2hpbmcgYmFja3F1b3RlIHNoYWxsIGJlIHNhdGlzZmllZCBieSB0aGUgZmlyc3QKKyAqIGJhY2txdW90ZSBmb3VuZCB3aXRob3V0IGEgcHJlY2VkaW5nIGJhY2tzbGFzaDsgZHVyaW5nIHRoaXMgc2VhcmNoLAorICogaWYgYSBub24tZXNjYXBlZCBiYWNrcXVvdGUgaXMgZW5jb3VudGVyZWQgd2l0aGluIGEgc2hlbGwgY29tbWVudCwKKyAqIGEgaGVyZS1kb2N1bWVudCwgYW4gZW1iZWRkZWQgY29tbWFuZCBzdWJzdGl0dXRpb24gb2YgdGhlICQoY29tbWFuZCkKKyAqIGZvcm0sIG9yIGEgcXVvdGVkIHN0cmluZywgdW5kZWZpbmVkIHJlc3VsdHMgb2NjdXIuIEEgc2luZ2xlLXF1b3RlZAorICogb3IgZG91YmxlLXF1b3RlZCBzdHJpbmcgdGhhdCBiZWdpbnMsIGJ1dCBkb2VzIG5vdCBlbmQsIHdpdGhpbiB0aGUKKyAqICJgLi4uYCIgc2VxdWVuY2UgcHJvZHVjZXMgdW5kZWZpbmVkIHJlc3VsdHMuIgorICogRXhhbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQKKyAqIGVjaG8gYGVjaG8gJ1wnVEVTVFxgZWNobyBaWlxgQkVTVGAgICAgXFRFU1RaWkJFU1QKKyAqLworc3RhdGljIGludCBhZGRfdGlsbF9iYWNrcXVvdGUob19zdHJpbmcgKmRlc3QsIHN0cnVjdCBpbl9zdHIgKmlucHV0LCBpbnQgaW5fZHF1b3RlKQoreworCXdoaWxlICgxKSB7CisJCWludCBjaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlpZiAoY2ggPT0gJ2AnKQorCQkJcmV0dXJuIDE7CisJCWlmIChjaCA9PSAnXFwnKSB7CisJCQkvKiBceC4gQ29weSBib3RoIHVubGVzcyBpdCBpcyBcYCwgXCQsIFxcIGFuZCBtYXliZSBcIiAqLworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCWlmIChjaCAhPSAnYCcKKwkJCSAmJiBjaCAhPSAnJCcKKwkJCSAmJiBjaCAhPSAnXFwnCisJCQkgJiYgKCFpbl9kcXVvdGUgfHwgY2ggIT0gJyInKQorCQkJKSB7CisJCQkJb19hZGRjaHIoZGVzdCwgJ1xcJyk7CisJCQl9CisJCX0KKwkJaWYgKGNoID09IEVPRikgeworCQkJc3ludGF4X2Vycm9yX3VudGVybV9jaCgnYCcpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJb19hZGRjaHIoZGVzdCwgY2gpOworCX0KK30KKy8qIFByb2Nlc3MgJChjbWQpIC0gY29weSBjb250ZW50cyB1bnRpbCAiKSIgaXMgc2Vlbi4gQ29tcGxpY2F0ZWQgYnkKKyAqIHF1b3RpbmcgYW5kIG5lc3RlZCAoKXMuCisgKiAiV2l0aCB0aGUgJChjb21tYW5kKSBzdHlsZSBvZiBjb21tYW5kIHN1YnN0aXR1dGlvbiwgYWxsIGNoYXJhY3RlcnMKKyAqIGZvbGxvd2luZyB0aGUgb3BlbiBwYXJlbnRoZXNpcyB0byB0aGUgbWF0Y2hpbmcgY2xvc2luZyBwYXJlbnRoZXNpcworICogY29uc3RpdHV0ZSB0aGUgY29tbWFuZC4gQW55IHZhbGlkIHNoZWxsIHNjcmlwdCBjYW4gYmUgdXNlZCBmb3IgY29tbWFuZCwKKyAqIGV4Y2VwdCBhIHNjcmlwdCBjb25zaXN0aW5nIHNvbGVseSBvZiByZWRpcmVjdGlvbnMgd2hpY2ggcHJvZHVjZXMKKyAqIHVuc3BlY2lmaWVkIHJlc3VsdHMuIgorICogRXhhbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dAorICogZWNobyAkKGVjaG8gJyhURVNUKScgQkVTVCkgICAgICAgICAgIChURVNUKSBCRVNUCisgKiBlY2hvICQoZWNobyAnVEVTVCknIEJFU1QpICAgICAgICAgICAgVEVTVCkgQkVTVAorICogZWNobyAkKGVjaG8gXChcKFRFU1RcKSBCRVNUKSAgICAgICAgICgoVEVTVCkgQkVTVAorICoKKyAqIEFsc28gYWRhcHRlZCB0byBlYXQgJHt2YXIlLi4ufSBhbmQgJCgoLi4uKSkgY29uc3RydWN0cywgc2luY2UgLi4uIHBhcnQKKyAqIGNhbiBjb250YWluIGFyYml0cmFyeSBjb25zdHJ1Y3RzLCBqdXN0IGxpa2UgJChjbWQpLgorICogSW4gYmFzaCBjb21wYXQgbW9kZSwgaXQgbmVlZHMgdG8gYWxzbyBiZSBhYmxlIHRvIHN0b3Agb24gJzonIG9yICcvJworICogZm9yICR7dmFyOk5bOk1dfSBhbmQgJHt2YXIvUFsvUl19IHBhcnNpbmcuCisgKi8KKyNkZWZpbmUgRE9VQkxFX0NMT1NFX0NIQVJfRkxBRyAweDgwCitzdGF0aWMgaW50IGFkZF90aWxsX2Nsb3NpbmdfYnJhY2tldChvX3N0cmluZyAqZGVzdCwgc3RydWN0IGluX3N0ciAqaW5wdXQsIHVuc2lnbmVkIGVuZF9jaCkKK3sKKwlpbnQgY2g7CisJY2hhciBkYmwgPSBlbmRfY2ggJiBET1VCTEVfQ0xPU0VfQ0hBUl9GTEFHOworIyBpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCWNoYXIgZW5kX2NoYXIyID0gZW5kX2NoID4+IDg7CisjIGVuZGlmCisJZW5kX2NoICY9IChET1VCTEVfQ0xPU0VfQ0hBUl9GTEFHIC0gMSk7CisKKwl3aGlsZSAoMSkgeworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlpZiAoY2ggPT0gRU9GKSB7CisJCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKGVuZF9jaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoY2ggPT0gZW5kX2NoICBJRl9IVVNIX0JBU0hfQ09NUEFUKCB8fCBjaCA9PSBlbmRfY2hhcjIpKSB7CisJCQlpZiAoIWRibCkKKwkJCQlicmVhazsKKwkJCS8qIHdlIGxvb2sgZm9yIGNsb3NpbmcgKSkgb2YgJCgoRVhQUikpICovCisJCQlpZiAoaV9wZWVrKGlucHV0KSA9PSBlbmRfY2gpIHsKKwkJCQlpX2dldGNoKGlucHV0KTsgLyogZWF0IHNlY29uZCAnKScgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCWlmIChjaCA9PSAnKCcgfHwgY2ggPT0gJ3snKSB7CisJCQljaCA9IChjaCA9PSAnKCcgPyAnKScgOiAnfScpOworCQkJaWYgKCFhZGRfdGlsbF9jbG9zaW5nX2JyYWNrZXQoZGVzdCwgaW5wdXQsIGNoKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjaCA9PSAnXCcnKSB7CisJCQlpZiAoIWFkZF90aWxsX3NpbmdsZV9xdW90ZShkZXN0LCBpbnB1dCkpCisJCQkJcmV0dXJuIDA7CisJCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2ggPT0gJyInKSB7CisJCQlpZiAoIWFkZF90aWxsX2RvdWJsZV9xdW90ZShkZXN0LCBpbnB1dCkpCisJCQkJcmV0dXJuIDA7CisJCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2ggPT0gJ2AnKSB7CisJCQlpZiAoIWFkZF90aWxsX2JhY2txdW90ZShkZXN0LCBpbnB1dCwgLyppbl9kcXVvdGU6Ki8gMCkpCisJCQkJcmV0dXJuIDA7CisJCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2ggPT0gJ1xcJykgeworCQkJLyogXHguIENvcHkgdmVyYmF0aW0uIEltcG9ydGFudCBmb3IgIFwoLCBcKSAqLworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCWlmIChjaCA9PSBFT0YpIHsKKwkJCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKCcpJyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlyZXR1cm4gY2g7Cit9CisjZW5kaWYgLyogRU5BQkxFX0hVU0hfVElDSyB8fCBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUIHx8IEVOQUJMRV9IVVNIX0RPTExBUl9PUFMgKi8KKworLyogUmV0dXJuIGNvZGU6IDAgZm9yIE9LLCAxIGZvciBzeW50YXggZXJyb3IgKi8KKyNpZiBCQl9NTVUKKyNkZWZpbmUgcGFyc2VfZG9sbGFyKGFzX3N0cmluZywgZGVzdCwgaW5wdXQsIHF1b3RlX21hc2spIFwKKwlwYXJzZV9kb2xsYXIoZGVzdCwgaW5wdXQsIHF1b3RlX21hc2spCisjZGVmaW5lIGFzX3N0cmluZyBOVUxMCisjZW5kaWYKK3N0YXRpYyBpbnQgcGFyc2VfZG9sbGFyKG9fc3RyaW5nICphc19zdHJpbmcsCisJCW9fc3RyaW5nICpkZXN0LAorCQlzdHJ1Y3QgaW5fc3RyICppbnB1dCwgdW5zaWduZWQgY2hhciBxdW90ZV9tYXNrKQoreworCWludCBjaCA9IGlfcGVlayhpbnB1dCk7ICAvKiBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlICQgKi8KKworCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2VfZG9sbGFyIGVudGVyZWQ6IGNoPSclYydcbiIsIGNoKTsKKwlpZiAoaXNhbHBoYShjaCkpIHsKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworIG1ha2VfdmFyOgorCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQl3aGlsZSAoMSkgeworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCI6ICclYydcbiIsIGNoKTsKKwkJCW9fYWRkY2hyKGRlc3QsIGNoIHwgcXVvdGVfbWFzayk7CisJCQlxdW90ZV9tYXNrID0gMDsKKwkJCWNoID0gaV9wZWVrKGlucHV0KTsKKwkJCWlmICghaXNhbG51bShjaCkgJiYgY2ggIT0gJ18nKQorCQkJCWJyZWFrOworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJfQorCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCX0gZWxzZSBpZiAoaXNkaWdpdChjaCkpIHsKKyBtYWtlX29uZV9jaGFyX3ZhcjoKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQlkZWJ1Z19wcmludGZfcGFyc2UoIjogJyVjJ1xuIiwgY2gpOworCQlvX2FkZGNocihkZXN0LCBjaCB8IHF1b3RlX21hc2spOworCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCX0gZWxzZSBzd2l0Y2ggKGNoKSB7CisJY2FzZSAnJCc6IC8qIHBpZCAqLworCWNhc2UgJyEnOiAvKiBsYXN0IGJnIHBpZCAqLworCWNhc2UgJz8nOiAvKiBsYXN0IGV4aXQgY29kZSAqLworCWNhc2UgJyMnOiAvKiBudW1iZXIgb2YgYXJncyAqLworCWNhc2UgJyonOiAvKiBhcmdzICovCisJY2FzZSAnQCc6IC8qIGFyZ3MgKi8KKwkJZ290byBtYWtlX29uZV9jaGFyX3ZhcjsKKwljYXNlICd7JzogeworCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCisJCWNoID0gaV9nZXRjaChpbnB1dCk7IC8qIGVhdCAneycgKi8KKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCisJCWNoID0gaV9nZXRjaChpbnB1dCk7IC8qIGZpcnN0IGNoYXIgYWZ0ZXIgJ3snICovCisJCS8qIEl0IHNob3VsZCBiZSAkez99LCBvciAkeyN2YXJ9LAorCQkgKiBvciBldmVuICR7PytzdWJzdH0gLSBvcGVyYXRvciBhY3Rpbmcgb24gYSBzcGVjaWFsIHZhcmlhYmxlLAorCQkgKiBvciB0aGUgYmVnaW5uaW5nIG9mIHZhcmlhYmxlIG5hbWUuCisJCSAqLworCQlpZiAoY2ggPT0gRU9GCisJCSB8fCAoIXN0cmNocihfU1BFQ0lBTF9WQVJTX1NUUiwgY2gpICYmICFpc2FsbnVtKGNoKSkgLyogbm90IG9uZSBvZiB0aG9zZSAqLworCQkpIHsKKyBiYWRfZG9sbGFyX3N5bnRheDoKKwkJCXN5bnRheF9lcnJvcl91bnRlcm1fc3RyKCIke25hbWV9Iik7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX2RvbGxhciByZXR1cm4gMDogdW50ZXJtaW5hdGVkICR7bmFtZX1cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQljaCB8PSBxdW90ZV9tYXNrOworCisJCS8qIEl0J3MgcG9zc2libGUgdG8ganVzdCBjYWxsIGFkZF90aWxsX2Nsb3NpbmdfYnJhY2tldCgpIGF0IHRoaXMgcG9pbnQuCisJCSAqIEhvd2V2ZXIsIHRoaXMgcmVncmVzc2VzIHNvbWUgb2Ygb3VyIHRlc3RzdWl0ZSBjYXNlcworCQkgKiB3aGljaCBjaGVjayBpbnZhbGlkIGNvbnN0cnVjdHMgbGlrZSAkeyV9LgorCQkgKiBPaCB3ZWxsLi4uIGxldCdzIGNoZWNrIHRoYXQgdGhlIHZhciBuYW1lIHBhcnQgaXMgZmluZS4uLiAqLworCisJCXdoaWxlICgxKSB7CisJCQl1bnNpZ25lZCBwb3M7CisKKwkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiOiAnJWMnXG4iLCBjaCk7CisKKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCQlpZiAoY2ggPT0gJ30nKQorCQkJCWJyZWFrOworCisJCQlpZiAoIWlzYWxudW0oY2gpICYmIGNoICE9ICdfJykgeworCQkJCXVuc2lnbmVkIGVuZF9jaDsKKwkJCQl1bnNpZ25lZCBjaGFyIGxhc3RfY2g7CisJCQkJLyogaGFuZGxlIHBhcmFtZXRlciBleHBhbnNpb25zCisJCQkJICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy94Y3VfY2hhcDAyLmh0bWwjdGFnXzAyXzA2XzAyCisJCQkJICovCisJCQkJaWYgKCFzdHJjaHIoVkFSX1NVQlNUX09QUywgY2gpKSAvKiAke3ZhcjxiYWRfY2hhcj4uLi4gKi8KKwkJCQkJZ290byBiYWRfZG9sbGFyX3N5bnRheDsKKworCQkJCS8qIEVhdCBldmVyeXRoaW5nIHVudGlsIGNsb3NpbmcgJ30nIChvciAnOicpICovCisJCQkJZW5kX2NoID0gJ30nOworCQkJCWlmIChFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCQkJCSAmJiBjaCA9PSAnOicKKwkJCQkgJiYgIXN0cmNocihNSU5VU19QTFVTX0VRVUFMX1FVRVNUSU9OLCBpX3BlZWsoaW5wdXQpKQorCQkJCSkgeworCQkJCQkvKiBJdCdzICR7dmFyOk5bOk1dfSB0aGluZyAqLworCQkJCQllbmRfY2ggPSAnfScgKiAweDEwMCArICc6JzsKKwkJCQl9CisJCQkJaWYgKEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJCQkJICYmIGNoID09ICcvJworCQkJCSkgeworCQkJCQkvKiBJdCdzICR7dmFyL1svXXBhdHRlcm5bL3JlcGxdfSB0aGluZyAqLworCQkJCQlpZiAoaV9wZWVrKGlucHV0KSA9PSAnLycpIHsgLyogJHt2YXIvL3BhdHRlcm5bL3JlcGxdfT8gKi8KKwkJCQkJCWlfZ2V0Y2goaW5wdXQpOworCQkJCQkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgJy8nKTsKKwkJCQkJCWNoID0gJ1xcJzsKKwkJCQkJfQorCQkJCQllbmRfY2ggPSAnfScgKiAweDEwMCArICcvJzsKKwkJCQl9CisJCQkJb19hZGRjaHIoZGVzdCwgY2gpOworIGFnYWluOgorCQkJCWlmICghQkJfTU1VKQorCQkJCQlwb3MgPSBkZXN0LT5sZW5ndGg7CisjaWYgRU5BQkxFX0hVU0hfRE9MTEFSX09QUworCQkJCWxhc3RfY2ggPSBhZGRfdGlsbF9jbG9zaW5nX2JyYWNrZXQoZGVzdCwgaW5wdXQsIGVuZF9jaCk7CisJCQkJaWYgKGxhc3RfY2ggPT0gMCkgLyogZXJyb3I/ICovCisJCQkJCXJldHVybiAwOworI2Vsc2UKKyNlcnJvciBTaW1wbGUgY29kZSB0byBvbmx5IGFsbG93ICR7dmFyfSBpcyBub3QgaW1wbGVtZW50ZWQKKyNlbmRpZgorCQkJCWlmIChhc19zdHJpbmcpIHsKKwkJCQkJb19hZGRzdHIoYXNfc3RyaW5nLCBkZXN0LT5kYXRhICsgcG9zKTsKKwkJCQkJb19hZGRjaHIoYXNfc3RyaW5nLCBsYXN0X2NoKTsKKwkJCQl9CisKKwkJCQlpZiAoRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQgJiYgKGVuZF9jaCAmIDB4ZmYwMCkpIHsKKwkJCQkJLyogY2xvc2UgdGhlIGZpcnN0IGJsb2NrOiAqLworCQkJCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJCQkvKiB3aGlsZSBwYXJzaW5nIE4gZnJvbSAke3ZhcjpOWzpNXX0KKwkJCQkJICogb3IgcGF0dGVybiBmcm9tICR7dmFyL1svXXBhdHRlcm5bL3JlcGxdfSAqLworCQkJCQlpZiAoKGVuZF9jaCAmIDB4ZmYpID09IGxhc3RfY2gpIHsKKwkJCQkJCS8qIGdvdCAnOicgb3IgJy8nLSBwYXJzZSB0aGUgcmVzdCAqLworCQkJCQkJZW5kX2NoID0gJ30nOworCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJfQorCQkJCQkvKiBnb3QgJ30nICovCisJCQkJCWlmIChlbmRfY2ggPT0gJ30nICogMHgxMDAgKyAnOicpIHsKKwkJCQkJCS8qIGl0J3MgJHt2YXI6Tn0gLSBlbXVsYXRlIDo5OTk5OTk5OTkgKi8KKwkJCQkJCW9fYWRkc3RyKGRlc3QsICI5OTk5OTk5OTkiKTsKKwkJCQkJfSAvKiBlbHNlOiBpdCdzICR7dmFyL1svXXBhdHRlcm59ICovCisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCWJyZWFrOworCX0KKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUIHx8IEVOQUJMRV9IVVNIX1RJQ0sKKwljYXNlICcoJzogeworCQl1bnNpZ25lZCBwb3M7CisKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworIyBpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJCWlmIChpX3BlZWsoaW5wdXQpID09ICcoJykgeworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQlvX2FkZGNocihkZXN0LCAvKnF1b3RlX21hc2sgfCovICcrJyk7CisJCQlpZiAoIUJCX01NVSkKKwkJCQlwb3MgPSBkZXN0LT5sZW5ndGg7CisJCQlpZiAoIWFkZF90aWxsX2Nsb3NpbmdfYnJhY2tldChkZXN0LCBpbnB1dCwgJyknIHwgRE9VQkxFX0NMT1NFX0NIQVJfRkxBRykpCisJCQkJcmV0dXJuIDA7IC8qIGVycm9yICovCisJCQlpZiAoYXNfc3RyaW5nKSB7CisJCQkJb19hZGRzdHIoYXNfc3RyaW5nLCBkZXN0LT5kYXRhICsgcG9zKTsKKwkJCQlvX2FkZGNocihhc19zdHJpbmcsICcpJyk7CisJCQkJb19hZGRjaHIoYXNfc3RyaW5nLCAnKScpOworCQkJfQorCQkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJCWJyZWFrOworCQl9CisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX1RJQ0sKKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJb19hZGRjaHIoZGVzdCwgcXVvdGVfbWFzayB8ICdgJyk7CisJCWlmICghQkJfTU1VKQorCQkJcG9zID0gZGVzdC0+bGVuZ3RoOworCQlpZiAoIWFkZF90aWxsX2Nsb3NpbmdfYnJhY2tldChkZXN0LCBpbnB1dCwgJyknKSkKKwkJCXJldHVybiAwOyAvKiBlcnJvciAqLworCQlpZiAoYXNfc3RyaW5nKSB7CisJCQlvX2FkZHN0cihhc19zdHJpbmcsIGRlc3QtPmRhdGEgKyBwb3MpOworCQkJb19hZGRjaHIoYXNfc3RyaW5nLCAnKScpOworCQl9CisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisjIGVuZGlmCisJCWJyZWFrOworCX0KKyNlbmRpZgorCWNhc2UgJ18nOgorCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCWNoID0gaV9wZWVrKGlucHV0KTsKKwkJaWYgKGlzYWxudW0oY2gpKSB7IC8qIGl0J3MgJF9uYW1lIG9yICRfMTIzICovCisJCQljaCA9ICdfJzsKKwkJCWdvdG8gbWFrZV92YXI7CisJCX0KKwkJLyogZWxzZTogaXQncyAkXyAqLworCS8qIFRPRE86ICRfIGFuZCAkLTogKi8KKwkvKiAkXyBTaGVsbCBvciBzaGVsbCBzY3JpcHQgbmFtZTsgb3IgbGFzdCBhcmd1bWVudCBvZiBsYXN0IGNvbW1hbmQKKwkgKiAoaWYgbGFzdCBjb21tYW5kIHdhc24ndCBhIHBpcGU7IGlmIGl0IHdhcywgYmFzaCBzZXRzICRfIHRvICIiKTsKKwkgKiBidXQgaW4gY29tbWFuZCdzIGVudiwgc2V0IHRvIGZ1bGwgcGF0aG5hbWUgdXNlZCB0byBpbnZva2UgaXQgKi8KKwkvKiAkLSBPcHRpb24gZmxhZ3Mgc2V0IGJ5IHNldCBidWlsdGluIG9yIHNoZWxsIG9wdGlvbnMgKC1pIGV0YykgKi8KKwlkZWZhdWx0OgorCQlvX2FkZFFjaHIoZGVzdCwgJyQnKTsKKwl9CisJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9kb2xsYXIgcmV0dXJuIDEgKG9rKVxuIik7CisJcmV0dXJuIDE7CisjdW5kZWYgYXNfc3RyaW5nCit9CisKKyNpZiBCQl9NTVUKKyMgaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKyNkZWZpbmUgZW5jb2RlX3N0cmluZyhhc19zdHJpbmcsIGRlc3QsIGlucHV0LCBkcXVvdGVfZW5kLCBwcm9jZXNzX2Jrc2xhc2gpIFwKKwllbmNvZGVfc3RyaW5nKGRlc3QsIGlucHV0LCBkcXVvdGVfZW5kLCBwcm9jZXNzX2Jrc2xhc2gpCisjIGVsc2UKKy8qIG9ubHkgJHt2YXIvcGF0dGVybi9yZXBsfSAoaXRzIHBhdHRlcm4gcGFydCkgbmVlZHMgYWRkaXRpb25hbCBtb2RlICovCisjZGVmaW5lIGVuY29kZV9zdHJpbmcoYXNfc3RyaW5nLCBkZXN0LCBpbnB1dCwgZHF1b3RlX2VuZCwgcHJvY2Vzc19ia3NsYXNoKSBcCisJZW5jb2RlX3N0cmluZyhkZXN0LCBpbnB1dCwgZHF1b3RlX2VuZCkKKyMgZW5kaWYKKyNkZWZpbmUgYXNfc3RyaW5nIE5VTEwKKworI2Vsc2UgLyogIU1NVSAqLworCisjIGlmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisvKiBhbGwgcGFyYW1ldGVycyBhcmUgbmVlZGVkLCBubyBtYWNybyB0cmlja3MgKi8KKyMgZWxzZQorI2RlZmluZSBlbmNvZGVfc3RyaW5nKGFzX3N0cmluZywgZGVzdCwgaW5wdXQsIGRxdW90ZV9lbmQsIHByb2Nlc3NfYmtzbGFzaCkgXAorCWVuY29kZV9zdHJpbmcoYXNfc3RyaW5nLCBkZXN0LCBpbnB1dCwgZHF1b3RlX2VuZCkKKyMgZW5kaWYKKyNlbmRpZgorc3RhdGljIGludCBlbmNvZGVfc3RyaW5nKG9fc3RyaW5nICphc19zdHJpbmcsCisJCW9fc3RyaW5nICpkZXN0LAorCQlzdHJ1Y3QgaW5fc3RyICppbnB1dCwKKwkJaW50IGRxdW90ZV9lbmQsCisJCWludCBwcm9jZXNzX2Jrc2xhc2gpCit7CisjaWYgIUVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJY29uc3QgaW50IHByb2Nlc3NfYmtzbGFzaCA9IDE7CisjZW5kaWYKKwlpbnQgY2g7CisJaW50IG5leHQ7CisKKyBhZ2FpbjoKKwljaCA9IGlfZ2V0Y2goaW5wdXQpOworCWlmIChjaCAhPSBFT0YpCisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwlpZiAoY2ggPT0gZHF1b3RlX2VuZCkgeyAvKiBtYXkgYmUgb25seSAnIicgb3IgRU9GICovCisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZW5jb2RlX3N0cmluZyByZXR1cm4gMSAob2spXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIG5vdGU6IGNhbid0IG1vdmUgaXQgYWJvdmUgY2ggPT0gZHF1b3RlX2VuZCBjaGVjayEgKi8KKwlpZiAoY2ggPT0gRU9GKSB7CisJCXN5bnRheF9lcnJvcl91bnRlcm1fY2goJyInKTsKKwkJcmV0dXJuIDA7IC8qIGVycm9yICovCisJfQorCW5leHQgPSAnXDAnOworCWlmIChjaCAhPSAnXG4nKSB7CisJCW5leHQgPSBpX3BlZWsoaW5wdXQpOworCX0KKwlkZWJ1Z19wcmludGZfcGFyc2UoIlwiIGNoPSVjICglZCkgZXNjYXBlPSVkXG4iLAorCQkJY2gsIGNoLCAhIShkZXN0LT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpKTsKKwlpZiAocHJvY2Vzc19ia3NsYXNoICYmIGNoID09ICdcXCcpIHsKKwkJaWYgKG5leHQgPT0gRU9GKSB7CisJCQlzeW50YXhfZXJyb3IoIlxcPGVvZj4iKTsKKwkJCXhmdW5jX2RpZSgpOworCQl9CisJCS8qIGJhc2g6CisJCSAqICJUaGUgYmFja3NsYXNoIHJldGFpbnMgaXRzIHNwZWNpYWwgbWVhbmluZyBbaW4gIi4uLiJdCisJCSAqIG9ubHkgd2hlbiBmb2xsb3dlZCBieSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgorCQkgKiAkLCBgLCAiLCBcLCBvciA8bmV3bGluZT4uICBBIGRvdWJsZSBxdW90ZSBtYXkgYmUgcXVvdGVkCisJCSAqIHdpdGhpbiBkb3VibGUgcXVvdGVzIGJ5IHByZWNlZGluZyBpdCB3aXRoIGEgYmFja3NsYXNoLiIKKwkJICogTkI6IGluICh1bnF1b3RlZCkgaGVyZWRvYywgYWJvdmUgZG9lcyBub3QgYXBwbHkgdG8gIiwKKwkJICogdGhlcmVmb3JlIHdlIGNoZWNrIGZvciBpdCBieSAibmV4dCA9PSBkcXVvdGVfZW5kIiBjb25kLgorCQkgKi8KKwkJaWYgKG5leHQgPT0gZHF1b3RlX2VuZCB8fCBzdHJjaHIoIiRgXFxcbiIsIG5leHQpKSB7CisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOyAvKiBlYXQgbmV4dCAqLworCQkJaWYgKGNoID09ICdcbicpCisJCQkJZ290byBhZ2FpbjsgLyogc2tpcCBcPG5ld2xpbmU+ICovCisJCX0gLyogZWxzZTogY2ggcmVtYWlucyA9PSAnXFwnLCBhbmQgd2UgZG91YmxlIGl0IGJlbG93OiAqLworCQlvX2FkZHFjaHIoZGVzdCwgY2gpOyAvKiBcYyBpZiBjIGlzIGEgZ2xvYiBjaGFyLCBlbHNlIGp1c3QgYyAqLworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCWdvdG8gYWdhaW47CisJfQorCWlmIChjaCA9PSAnJCcpIHsKKwkJaWYgKCFwYXJzZV9kb2xsYXIoYXNfc3RyaW5nLCBkZXN0LCBpbnB1dCwgLypxdW90ZV9tYXNrOiovIDB4ODApKSB7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoImVuY29kZV9zdHJpbmcgcmV0dXJuIDA6ICIKKwkJCQkJInBhcnNlX2RvbGxhciByZXR1cm5lZCAwIChlcnJvcilcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZ290byBhZ2FpbjsKKwl9CisjaWYgRU5BQkxFX0hVU0hfVElDSworCWlmIChjaCA9PSAnYCcpIHsKKwkJLy91bnNpZ25lZCBwb3MgPSBkZXN0LT5sZW5ndGg7CisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCW9fYWRkY2hyKGRlc3QsIDB4ODAgfCAnYCcpOworCQlpZiAoIWFkZF90aWxsX2JhY2txdW90ZShkZXN0LCBpbnB1dCwgLyppbl9kcXVvdGU6Ki8gZHF1b3RlX2VuZCA9PSAnIicpKQorCQkJcmV0dXJuIDA7IC8qIGVycm9yICovCisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCS8vZGVidWdfcHJpbnRmX3N1YnN0KCJTVUJTVCBSRVMzICclcydcbiIsIGRlc3QtPmRhdGEgKyBwb3MpOworCQlnb3RvIGFnYWluOworCX0KKyNlbmRpZgorCW9fYWRkUWNocihkZXN0LCBjaCk7CisJZ290byBhZ2FpbjsKKyN1bmRlZiBhc19zdHJpbmcKK30KKworLyoKKyAqIFNjYW4gaW5wdXQgdW50aWwgRU9GIG9yIGVuZF90cmlnZ2VyIGNoYXIuCisgKiBSZXR1cm4gYSBsaXN0IG9mIHBpcGVzIHRvIGV4ZWN1dGUsIG9yIE5VTEwgb24gRU9GCisgKiBvciBpZiBlbmRfdHJpZ2dlciBjaGFyYWN0ZXIgaXMgbWV0LgorICogT24gc3ludGF4IGVycm9yLCBleGl0IGlmIHNoZWxsIGlzIG5vdCBpbnRlcmFjdGl2ZSwKKyAqIHJlc2V0IHBhcnNpbmcgbWFjaGluZXJ5IGFuZCBzdGFydCBwYXJzaW5nIGFuZXcsCisgKiBvciByZXR1cm4gRVJSX1BUUi4KKyAqLworc3RhdGljIHN0cnVjdCBwaXBlICpwYXJzZV9zdHJlYW0oY2hhciAqKnBzdHJpbmcsCisJCXN0cnVjdCBpbl9zdHIgKmlucHV0LAorCQlpbnQgZW5kX3RyaWdnZXIpCit7CisJc3RydWN0IHBhcnNlX2NvbnRleHQgY3R4OworCW9fc3RyaW5nIGRlc3QgPSBOVUxMX09fU1RSSU5HOworCWludCBoZXJlZG9jX2NudDsKKworCS8qIFNpbmdsZS1xdW90ZSB0cmlnZ2VycyBhIGJ5cGFzcyBvZiB0aGUgbWFpbiBsb29wIHVudGlsIGl0cyBtYXRlIGlzCisJICogZm91bmQuICBXaGVuIHJlY3Vyc2luZywgcXVvdGUgc3RhdGUgaXMgcGFzc2VkIGluIHZpYSBkZXN0LT5vX2V4cGZsYWdzLgorCSAqLworCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2Vfc3RyZWFtIGVudGVyZWQsIGVuZF90cmlnZ2VyPSclYydcbiIsCisJCQllbmRfdHJpZ2dlciA/IGVuZF90cmlnZ2VyIDogJ1gnKTsKKwlkZWJ1Z19lbnRlcigpOworCisJLyogSWYgdmVyeSBmaXJzdCBhcmcgaXMgIiIgb3IgJycsIGRlc3QuZGF0YSBtYXkgZW5kIHVwIE5VTEwuCisJICogUHJldmVudGluZyB0aGlzOiAqLworCW9fYWRkY2hyKCZkZXN0LCAnXDAnKTsKKwlkZXN0Lmxlbmd0aCA9IDA7CisKKwkvKiBXZSB1c2VkIHRvIHNlcGFyYXRlIHdvcmRzIG9uICRJRlMgaGVyZS4gVGhpcyB3YXMgd3JvbmcuCisJICogJElGUyBpcyB1c2VkIG9ubHkgZm9yIHdvcmQgc3BsaXR0aW5nIHdoZW4gJHZhciBpcyBleHBhbmRlZCwKKwkgKiBoZXJlIHdlIHNob3VsZCB1c2UgYmxhbmsgY2hhcnMgYXMgc2VwYXJhdG9ycywgbm90ICRJRlMKKwkgKi8KKworCWlmIChNQVlCRV9BU1NJR05NRU5UICE9IDApCisJCWRlc3Qub19hc3NpZ25tZW50ID0gTUFZQkVfQVNTSUdOTUVOVDsKKwlpbml0aWFsaXplX2NvbnRleHQoJmN0eCk7CisJaGVyZWRvY19jbnQgPSAwOworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKmlzX2JsYW5rOworCQljb25zdCBjaGFyICppc19zcGVjaWFsOworCQlpbnQgY2g7CisJCWludCBuZXh0OworCQlpbnQgcmVkaXJfZmQ7CisJCXJlZGlyX3R5cGUgcmVkaXJfc3R5bGU7CisKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCI6IGNoPSVjICglZCkgZXNjYXBlPSVkXG4iLAorCQkJCWNoLCBjaCwgISEoZGVzdC5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpKTsKKwkJaWYgKGNoID09IEVPRikgeworCQkJc3RydWN0IHBpcGUgKnBpOworCisJCQlpZiAoaGVyZWRvY19jbnQpIHsKKwkJCQlzeW50YXhfZXJyb3JfdW50ZXJtX3N0cigiaGVyZSBkb2N1bWVudCIpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQkvKiBlbmRfdHJpZ2dlciA9PSAnfScgY2FzZSBlcnJvcnMgb3V0IGVhcmxpZXIsCisJCQkgKiBjaGVja2luZyBvbmx5ICcpJyAqLworCQkJaWYgKGVuZF90cmlnZ2VyID09ICcpJykgeworCQkJCXN5bnRheF9lcnJvcl91bnRlcm1fY2goJygnKTsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlvX2ZyZWUoJmRlc3QpOworCQkJZG9uZV9waXBlKCZjdHgsIFBJUEVfU0VRKTsKKwkJCXBpID0gY3R4Lmxpc3RfaGVhZDsKKwkJCS8qIElmIHdlIGdvdCBub3RoaW5nLi4uICovCisJCQkvKiAodGhpcyBtYWtlcyBiYXJlICImIiBjbWQgYSBuby1vcC4KKwkJCSAqIGJhc2ggc2F5czogInN5bnRheCBlcnJvciBuZWFyIHVuZXhwZWN0ZWQgdG9rZW4gJyYnIikgKi8KKwkJCWlmIChwaS0+bnVtX2NtZHMgPT0gMAorCQkJICAgIElGX0hBU19LRVlXT1JEUyggJiYgcGktPnJlc193b3JkID09IFJFU19OT05FKQorCQkJKSB7CisJCQkJZnJlZV9waXBlX2xpc3QocGkpOworCQkJCXBpID0gTlVMTDsKKwkJCX0KKyNpZiAhQkJfTU1VCisJCQlkZWJ1Z19wcmludGZfcGFyc2UoImFzX3N0cmluZyAnJXMnXG4iLCBjdHguYXNfc3RyaW5nLmRhdGEpOworCQkJaWYgKHBzdHJpbmcpCisJCQkJKnBzdHJpbmcgPSBjdHguYXNfc3RyaW5nLmRhdGE7CisJCQllbHNlCisJCQkJb19mcmVlX3Vuc2FmZSgmY3R4LmFzX3N0cmluZyk7CisjZW5kaWYKKwkJCWRlYnVnX2xlYXZlKCk7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX3N0cmVhbSByZXR1cm4gJXBcbiIsIHBpKTsKKwkJCXJldHVybiBwaTsKKwkJfQorCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKworCQluZXh0ID0gJ1wwJzsKKwkJaWYgKGNoICE9ICdcbicpCisJCQluZXh0ID0gaV9wZWVrKGlucHV0KTsKKworCQlpc19zcGVjaWFsID0gInt9PD47JnwoKSMnIiAvKiBzcGVjaWFsIG91dHNpZGUgb2YgInN0ciIgKi8KKwkJCQkiXFwkXCIiIElGX0hVU0hfVElDSygiYCIpOyAvKiBhbHdheXMgc3BlY2lhbCAqLworCQkvKiBBcmUgeyBhbmQgfSBzcGVjaWFsIGhlcmU/ICovCisJCWlmIChjdHguY29tbWFuZC0+YXJndiAvKiB3b3JkIFt3b3JkXXsuLi4gLSBub24tc3BlY2lhbCAqLworCQkgfHwgZGVzdC5sZW5ndGggICAgICAgLyogd29yZHsuLi4gLSBub24tc3BlY2lhbCAqLworCQkgfHwgZGVzdC5oYXNfcXVvdGVkX3BhcnQgICAgIC8qICIiey4uLiAtIG5vbi1zcGVjaWFsICovCisJCSB8fCAobmV4dCAhPSAnOycgICAgICAgICAgICAgLyogfTsgLSBzcGVjaWFsICovCisJCSAgICAmJiBuZXh0ICE9ICcpJyAgICAgICAgICAgLyogfSkgLSBzcGVjaWFsICovCisJCSAgICAmJiBuZXh0ICE9ICcmJyAgICAgICAgICAgLyogfSYgYW5kIH0mJiAuLi4gLSBzcGVjaWFsICovCisJCSAgICAmJiBuZXh0ICE9ICd8JyAgICAgICAgICAgLyogfXx8IC4uLiAtIHNwZWNpYWwgKi8KKwkJICAgICYmICFzdHJjaHIoZGVmaWZzLCBuZXh0KSAvKiB7d29yZCAtIG5vbi1zcGVjaWFsICovCisJCSAgICApCisJCSkgeworCQkJLyogVGhleSBhcmUgbm90IHNwZWNpYWwsIHNraXAgInt9IiAqLworCQkJaXNfc3BlY2lhbCArPSAyOworCQl9CisJCWlzX3NwZWNpYWwgPSBzdHJjaHIoaXNfc3BlY2lhbCwgY2gpOworCQlpc19ibGFuayA9IHN0cmNocihkZWZpZnMsIGNoKTsKKworCQlpZiAoIWlzX3NwZWNpYWwgJiYgIWlzX2JsYW5rKSB7IC8qIG9yZGluYXJ5IGNoYXIgKi8KKyBvcmRpbmFyeV9jaGFyOgorCQkJb19hZGRRY2hyKCZkZXN0LCBjaCk7CisJCQlpZiAoKGRlc3Qub19hc3NpZ25tZW50ID09IE1BWUJFX0FTU0lHTk1FTlQKKwkJCSAgICB8fCBkZXN0Lm9fYXNzaWdubWVudCA9PSBXT1JEX0lTX0tFWVdPUkQpCisJCQkgJiYgY2ggPT0gJz0nCisJCQkgJiYgaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoZGVzdC5kYXRhLCAnPScpCisJCQkpIHsKKwkJCQlkZXN0Lm9fYXNzaWdubWVudCA9IERFRklOSVRFTFlfQVNTSUdOTUVOVDsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoImRlc3Qub19hc3NpZ25tZW50PSclcydcbiIsIGFzc2lnbm1lbnRfZmxhZ1tkZXN0Lm9fYXNzaWdubWVudF0pOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXNfYmxhbmspIHsKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCWlmIChjaCA9PSAnXG4nKSB7CisJCQkJLyogSXMgdGhpcyBhIGNhc2Ugd2hlbiBuZXdsaW5lIGlzIHNpbXBseSBpZ25vcmVkPworCQkJCSAqIFNvbWUgZXhhbXBsZXM6CisJCQkJICogImNtZCB8IDxuZXdsaW5lPiBjbWQgLi4uIgorCQkJCSAqICJjYXNlIC4uLiBpbiA8bmV3bGluZT4gd29yZCkgLi4uIgorCQkJCSAqLworCQkJCWlmIChJU19OVUxMX0NNRChjdHguY29tbWFuZCkKKwkJCQkgJiYgZGVzdC5sZW5ndGggPT0gMCAmJiAhZGVzdC5oYXNfcXVvdGVkX3BhcnQKKwkJCQkpIHsKKwkJCQkJLyogVGhpcyBuZXdsaW5lIGNhbiBiZSBpZ25vcmVkLiBCdXQuLi4KKwkJCQkJICogV2l0aG91dCBjaGVjayAjMSwgaW50ZXJhY3RpdmUgc2hlbGwKKwkJCQkJICogaWdub3JlcyBldmVuIGJhcmUgPG5ld2xpbmU+LAorCQkJCQkgKiBhbmQgc2hvd3MgdGhlIGNvbnRpbnVhdGlvbiBwcm9tcHQ6CisJCQkJCSAqIHBzMV9wcm9tcHQkIDxlbnRlcj4KKwkJCQkJICogcHMyPiBfICAgPD09PSB3cm9uZywgc2hvdWxkIGJlIHBzMQorCQkJCQkgKiBXaXRob3V0IGNoZWNrICMyLCAiY21kICYgPG5ld2xpbmU+IgorCQkJCQkgKiBpcyBzaW1pbGFybHkgbWlzdHJlYXRlZC4KKwkJCQkJICogKEJUVywgdGhpcyBtYWtlcyAiY21kICYgY21kIgorCQkJCQkgKiBhbmQgImNtZCAmJiBjbWQiIG5vbi1vcnRob2dvbmFsLgorCQkJCQkgKiBSZWFsbHksIGFzayB5b3Vyc2VsZiwgd2h5CisJCQkJCSAqICJjbWQgJiYgPG5ld2xpbmU+IiBkb2Vzbid0IHN0YXJ0CisJCQkJCSAqIGNtZCBidXQgd2FpdHMgZm9yIG1vcmUgaW5wdXQ/CisJCQkJCSAqIE5vIHJlYXNvbi4uLikKKwkJCQkJICovCisJCQkJCXN0cnVjdCBwaXBlICpwaSA9IGN0eC5saXN0X2hlYWQ7CisJCQkJCWlmIChwaS0+bnVtX2NtZHMgIT0gMCAgICAgICAvKiBjaGVjayAjMSAqLworCQkJCQkgJiYgcGktPmZvbGxvd3VwICE9IFBJUEVfQkcgLyogY2hlY2sgIzIgKi8KKwkJCQkJKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBUcmVhdCBuZXdsaW5lIGFzIGEgY29tbWFuZCBzZXBhcmF0b3IuICovCisJCQkJZG9uZV9waXBlKCZjdHgsIFBJUEVfU0VRKTsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoImhlcmVkb2NfY250OiVkXG4iLCBoZXJlZG9jX2NudCk7CisJCQkJaWYgKGhlcmVkb2NfY250KSB7CisJCQkJCWlmIChmZXRjaF9oZXJlZG9jcyhoZXJlZG9jX2NudCwgJmN0eCwgaW5wdXQpKSB7CisJCQkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJCQl9CisJCQkJCWhlcmVkb2NfY250ID0gMDsKKwkJCQl9CisJCQkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBNQVlCRV9BU1NJR05NRU5UOworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZGVzdC5vX2Fzc2lnbm1lbnQ9JyVzJ1xuIiwgYXNzaWdubWVudF9mbGFnW2Rlc3Qub19hc3NpZ25tZW50XSk7CisJCQkJY2ggPSAnOyc7CisJCQkJLyogbm90ZTogaWYgKGlzX2JsYW5rKSBjb250aW51ZTsKKwkJCQkgKiB3aWxsIHN0aWxsIHRyaWdnZXIgZm9yIHVzICovCisJCQl9CisJCX0KKworCQkvKiAiY21kfSIgb3IgImNtZCB9Li4uIiB3aXRob3V0IHNlbWljb2xvbiBvciAmOgorCQkgKiB9IGlzIGFuIG9yZGluYXJ5IGNoYXIgaW4gdGhpcyBjYXNlLCBldmVuIGluc2lkZSB7IGNtZDsgfQorCQkgKiBQYXRob2xvZ2ljYWwgZXhhbXBsZTogeyAiIn07IH0gc2hvdWxkIGV4ZWMgIn0iIGNtZAorCQkgKi8KKwkJaWYgKGNoID09ICd9JykgeworCQkJaWYgKCFJU19OVUxMX0NNRChjdHguY29tbWFuZCkgLyogY21kIH0gKi8KKwkJCSB8fCBkZXN0Lmxlbmd0aCAhPSAwIC8qIHdvcmR9ICovCisJCQkgfHwgZGVzdC5oYXNfcXVvdGVkX3BhcnQgICAgLyogIiJ9ICovCisJCQkpIHsKKwkJCQlnb3RvIG9yZGluYXJ5X2NoYXI7CisJCQl9CisJCQlpZiAoIUlTX05VTExfUElQRShjdHgucGlwZSkpIC8qIGNtZCB8IH0gKi8KKwkJCQlnb3RvIHNraXBfZW5kX3RyaWdnZXI7CisJCQkvKiBlbHNlOiB9IGRvZXMgdGVybWluYXRlIGEgZ3JvdXAgKi8KKwkJfQorCisJCWlmIChlbmRfdHJpZ2dlciAmJiBlbmRfdHJpZ2dlciA9PSBjaAorCQkgJiYgKGNoICE9ICc7JyB8fCBoZXJlZG9jX2NudCA9PSAwKQorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJICYmIChjaCAhPSAnKScKKwkJICAgIHx8IGN0eC5jdHhfcmVzX3cgIT0gUkVTX01BVENICisJCSAgICB8fCAoIWRlc3QuaGFzX3F1b3RlZF9wYXJ0ICYmIHN0cmNtcChkZXN0LmRhdGEsICJlc2FjIikgPT0gMCkKKwkJICAgICkKKyNlbmRpZgorCQkpIHsKKwkJCWlmIChoZXJlZG9jX2NudCkgeworCQkJCS8qIFRoaXMgaXMgdGVjaG5pY2FsbHkgdmFsaWQ6CisJCQkJICogeyBjYXQgPDxIRVJFOyB9OyBlY2hvIE9rCisJCQkJICogaGVyZWRvYworCQkJCSAqIGhlcmVkb2MKKwkJCQkgKiBIRVJFCisJCQkJICogYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhpcy4KKwkJCQkgKiBXZSByZXF1aXJlIGhlcmVkb2MgdG8gYmUgaW4gZW5jbG9zaW5nIHt9LygpLAorCQkJCSAqIGlmIGFueS4KKwkJCQkgKi8KKwkJCQlzeW50YXhfZXJyb3JfdW50ZXJtX3N0cigiaGVyZSBkb2N1bWVudCIpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9TRVEpOworCQkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBNQVlCRV9BU1NJR05NRU5UOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkZXN0Lm9fYXNzaWdubWVudD0nJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbZGVzdC5vX2Fzc2lnbm1lbnRdKTsKKwkJCS8qIERvIHdlIHNpdCBvdXRzaWRlIG9mIGFueSBpZidzLCBsb29wcyBvciBjYXNlJ3M/ICovCisJCQlpZiAoIUhBU19LRVlXT1JEUworCQkJIElGX0hBU19LRVlXT1JEUyh8fCAoY3R4LmN0eF9yZXNfdyA9PSBSRVNfTk9ORSAmJiBjdHgub2xkX2ZsYWcgPT0gMCkpCisJCQkpIHsKKwkJCQlvX2ZyZWUoJmRlc3QpOworI2lmICFCQl9NTVUKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoImFzX3N0cmluZyAnJXMnXG4iLCBjdHguYXNfc3RyaW5nLmRhdGEpOworCQkJCWlmIChwc3RyaW5nKQorCQkJCQkqcHN0cmluZyA9IGN0eC5hc19zdHJpbmcuZGF0YTsKKwkJCQllbHNlCisJCQkJCW9fZnJlZV91bnNhZmUoJmN0eC5hc19zdHJpbmcpOworI2VuZGlmCisJCQkJZGVidWdfbGVhdmUoKTsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX3N0cmVhbSByZXR1cm4gJXA6ICIKKwkJCQkJCSJlbmRfdHJpZ2dlciBjaGFyIGZvdW5kXG4iLAorCQkJCQkJY3R4Lmxpc3RfaGVhZCk7CisJCQkJcmV0dXJuIGN0eC5saXN0X2hlYWQ7CisJCQl9CisJCX0KKyBza2lwX2VuZF90cmlnZ2VyOgorCQlpZiAoaXNfYmxhbmspCisJCQljb250aW51ZTsKKworCQkvKiBDYXRjaCA8LCA+IGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIHRoaXMgd29yZCBpcworCQkgKiBhbiBhc3NpZ25tZW50LiBhPTEgMj56IGI9MjogYj0yIGlzIHN0aWxsIGFzc2lnbm1lbnQgKi8KKwkJc3dpdGNoIChjaCkgeworCQljYXNlICc+JzoKKwkJCXJlZGlyX2ZkID0gcmVkaXJlY3Rfb3B0X251bSgmZGVzdCk7CisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlyZWRpcl9zdHlsZSA9IFJFRElSRUNUX09WRVJXUklURTsKKwkJCWlmIChuZXh0ID09ICc+JykgeworCQkJCXJlZGlyX3N0eWxlID0gUkVESVJFQ1RfQVBQRU5EOworCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQl9CisjaWYgMAorCQkJZWxzZSBpZiAobmV4dCA9PSAnKCcpIHsKKwkJCQlzeW50YXhfZXJyb3IoIj4ocHJvY2Vzcykgbm90IHN1cHBvcnRlZCIpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwYXJzZV9yZWRpcmVjdCgmY3R4LCByZWRpcl9mZCwgcmVkaXJfc3R5bGUsIGlucHV0KSkKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJY29udGludWU7IC8qIGJhY2sgdG8gdG9wIG9mIHdoaWxlICgxKSAqLworCQljYXNlICc8JzoKKwkJCXJlZGlyX2ZkID0gcmVkaXJlY3Rfb3B0X251bSgmZGVzdCk7CisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlyZWRpcl9zdHlsZSA9IFJFRElSRUNUX0lOUFVUOworCQkJaWYgKG5leHQgPT0gJzwnKSB7CisJCQkJcmVkaXJfc3R5bGUgPSBSRURJUkVDVF9IRVJFRE9DOworCQkJCWhlcmVkb2NfY250Kys7CisJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIrK2hlcmVkb2NfY250PSVkXG4iLCBoZXJlZG9jX2NudCk7CisJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCX0gZWxzZSBpZiAobmV4dCA9PSAnPicpIHsKKwkJCQlyZWRpcl9zdHlsZSA9IFJFRElSRUNUX0lPOworCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQl9CisjaWYgMAorCQkJZWxzZSBpZiAobmV4dCA9PSAnKCcpIHsKKwkJCQlzeW50YXhfZXJyb3IoIjwocHJvY2Vzcykgbm90IHN1cHBvcnRlZCIpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwYXJzZV9yZWRpcmVjdCgmY3R4LCByZWRpcl9mZCwgcmVkaXJfc3R5bGUsIGlucHV0KSkKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJY29udGludWU7IC8qIGJhY2sgdG8gdG9wIG9mIHdoaWxlICgxKSAqLworCQljYXNlICcjJzoKKwkJCWlmIChkZXN0Lmxlbmd0aCA9PSAwICYmICFkZXN0Lmhhc19xdW90ZWRfcGFydCkgeworCQkJCS8qIHNraXAgIiNjb21tZW50IiAqLworCQkJCXdoaWxlICgxKSB7CisJCQkJCWNoID0gaV9wZWVrKGlucHV0KTsKKwkJCQkJaWYgKGNoID09IEVPRiB8fCBjaCA9PSAnXG4nKQorCQkJCQkJYnJlYWs7CisJCQkJCWlfZ2V0Y2goaW5wdXQpOworCQkJCQkvKiBub3RlOiB3ZSBkbyBub3QgYWRkIGl0IHRvICZjdHguYXNfc3RyaW5nICovCisJCQkJfQorCQkJCW5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgJ1xuJyk7CisJCQkJY29udGludWU7IC8qIGJhY2sgdG8gdG9wIG9mIHdoaWxlICgxKSAqLworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1xcJzoKKwkJCWlmIChuZXh0ID09ICdcbicpIHsKKwkJCQkvKiBJdCdzICJcPG5ld2xpbmU+IiAqLworI2lmICFCQl9NTVUKKwkJCQkvKiBSZW1vdmUgdHJhaWxpbmcgJ1wnIGZyb20gY3R4LmFzX3N0cmluZyAqLworCQkJCWN0eC5hc19zdHJpbmcuZGF0YVstLWN0eC5hc19zdHJpbmcubGVuZ3RoXSA9ICdcMCc7CisjZW5kaWYKKwkJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOyAvKiBlYXQgaXQgKi8KKwkJCQljb250aW51ZTsgLyogYmFjayB0byB0b3Agb2Ygd2hpbGUgKDEpICovCisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkZXN0Lm9fYXNzaWdubWVudCA9PSBNQVlCRV9BU1NJR05NRU5UCisJCSAvKiBjaGVjayB0aGF0IHdlIGFyZSBub3QgaW4gd29yZCBpbiAiYT0xIDI+d29yZCBiPTEiOiAqLworCQkgJiYgIWN0eC5wZW5kaW5nX3JlZGlyZWN0CisJCSkgeworCQkJLyogY2ggaXMgYSBzcGVjaWFsIGNoYXIgYW5kIHRodXMgdGhpcyB3b3JkCisJCQkgKiBjYW5ub3QgYmUgYW4gYXNzaWdubWVudCAqLworCQkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBOT1RfQVNTSUdOTUVOVDsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZGVzdC5vX2Fzc2lnbm1lbnQ9JyVzJ1xuIiwgYXNzaWdubWVudF9mbGFnW2Rlc3Qub19hc3NpZ25tZW50XSk7CisJCX0KKworCQkvKiBOb3RlOiBub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKSBpcyBhbHJlYWR5IGRvbmUgKi8KKworCQlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgJyMnOiAvKiBub24tY29tbWVudCAjOiAiZWNobyBhI2IiIGV0YyAqLworCQkJb19hZGRRY2hyKCZkZXN0LCBjaCk7CisJCQlicmVhazsKKwkJY2FzZSAnXFwnOgorCQkJaWYgKG5leHQgPT0gRU9GKSB7CisJCQkJc3ludGF4X2Vycm9yKCJcXDxlb2Y+Iik7CisJCQkJeGZ1bmNfZGllKCk7CisJCQl9CisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJLyogbm90ZTogY2ggIT0gJ1xuJyAodGhhdCBjYXNlIGRvZXMgbm90IHJlYWNoIHRoaXMgcGxhY2UpICovCisJCQlvX2FkZGNocigmZGVzdCwgJ1xcJyk7CisJCQkvKm5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgJ1xcJyk7IC0gYWxyZWFkeSBkb25lICovCisJCQlvX2FkZGNocigmZGVzdCwgY2gpOworCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQkvKiBFeGFtcGxlOiBlY2hvIEhlbGxvIFwyPmZpbGUKKwkJCSAqIHdlIG5lZWQgdG8ga25vdyB0aGF0IHdvcmQgMiBpcyBxdW90ZWQgKi8KKwkJCWRlc3QuaGFzX3F1b3RlZF9wYXJ0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICckJzoKKwkJCWlmICghcGFyc2VfZG9sbGFyKCZjdHguYXNfc3RyaW5nLCAmZGVzdCwgaW5wdXQsIC8qcXVvdGVfbWFzazoqLyAwKSkgeworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2Vfc3RyZWFtIHBhcnNlIGVycm9yOiAiCisJCQkJCSJwYXJzZV9kb2xsYXIgcmV0dXJuZWQgMCAoZXJyb3IpXG4iKTsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1wnJzoKKwkJCWRlc3QuaGFzX3F1b3RlZF9wYXJ0ID0gMTsKKwkJCWlmIChuZXh0ID09ICdcJycgJiYgIWN0eC5wZW5kaW5nX3JlZGlyZWN0KSB7CisgaW5zZXJ0X2VtcHR5X3F1b3RlZF9zdHJfbWFya2VyOgorCQkJCW5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgbmV4dCk7CisJCQkJaV9nZXRjaChpbnB1dCk7IC8qIGVhdCBzZWNvbmQgJyAqLworCQkJCW9fYWRkY2hyKCZkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJCW9fYWRkY2hyKCZkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJCQlpZiAoY2ggPT0gRU9GKSB7CisJCQkJCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKCdcJycpOworCQkJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCQkJfQorCQkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCQkJaWYgKGNoID09ICdcJycpCisJCQkJCQlicmVhazsKKwkJCQkJb19hZGRxY2hyKCZkZXN0LCBjaCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJyInOgorCQkJZGVzdC5oYXNfcXVvdGVkX3BhcnQgPSAxOworCQkJaWYgKG5leHQgPT0gJyInICYmICFjdHgucGVuZGluZ19yZWRpcmVjdCkKKwkJCQlnb3RvIGluc2VydF9lbXB0eV9xdW90ZWRfc3RyX21hcmtlcjsKKwkJCWlmIChkZXN0Lm9fYXNzaWdubWVudCA9PSBOT1RfQVNTSUdOTUVOVCkKKwkJCQlkZXN0Lm9fZXhwZmxhZ3MgfD0gRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlM7CisJCQlpZiAoIWVuY29kZV9zdHJpbmcoJmN0eC5hc19zdHJpbmcsICZkZXN0LCBpbnB1dCwgJyInLCAvKnByb2Nlc3NfYmtzbGFzaDoqLyAxKSkKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJZGVzdC5vX2V4cGZsYWdzICY9IH5FWFBfRkxBR19FU0NfR0xPQl9DSEFSUzsKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9IVVNIX1RJQ0sKKwkJY2FzZSAnYCc6IHsKKwkJCVVTRV9GT1JfTk9NTVUodW5zaWduZWQgcG9zOykKKworCQkJb19hZGRjaHIoJmRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQlvX2FkZGNocigmZGVzdCwgJ2AnKTsKKwkJCVVTRV9GT1JfTk9NTVUocG9zID0gZGVzdC5sZW5ndGg7KQorCQkJaWYgKCFhZGRfdGlsbF9iYWNrcXVvdGUoJmRlc3QsIGlucHV0LCAvKmluX2RxdW90ZToqLyAwKSkKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworIyBpZiAhQkJfTU1VCisJCQlvX2FkZHN0cigmY3R4LmFzX3N0cmluZywgZGVzdC5kYXRhICsgcG9zKTsKKwkJCW9fYWRkY2hyKCZjdHguYXNfc3RyaW5nLCAnYCcpOworIyBlbmRpZgorCQkJb19hZGRjaHIoJmRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQkvL2RlYnVnX3ByaW50Zl9zdWJzdCgiU1VCU1QgUkVTMyAnJXMnXG4iLCBkZXN0LmRhdGEgKyBwb3MpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQljYXNlICc7JzoKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisgY2FzZV9zZW1pOgorI2VuZGlmCisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9TRVEpOworI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJCS8qIEVhdCBtdWx0aXBsZSBzZW1pY29sb25zLCBkZXRlY3QKKwkJCSAqIHdoZXRoZXIgaXQgbWVhbnMgc29tZXRoaW5nIHNwZWNpYWwgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJY2ggPSBpX3BlZWsoaW5wdXQpOworCQkJCWlmIChjaCAhPSAnOycpCisJCQkJCWJyZWFrOworCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQkJaWYgKGN0eC5jdHhfcmVzX3cgPT0gUkVTX0NBU0VfQk9EWSkgeworCQkJCQljdHguY3R4X2RzZW1pY29sb24gPSAxOworCQkJCQljdHguY3R4X3Jlc193ID0gUkVTX01BVENIOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisjZW5kaWYKKyBuZXdfY21kOgorCQkJLyogV2UganVzdCBmaW5pc2hlZCBhIGNtZC4gTmV3IG9uZSBtYXkgc3RhcnQKKwkJCSAqIHdpdGggYW4gYXNzaWdubWVudCAqLworCQkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBNQVlCRV9BU1NJR05NRU5UOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkZXN0Lm9fYXNzaWdubWVudD0nJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbZGVzdC5vX2Fzc2lnbm1lbnRdKTsKKwkJCWJyZWFrOworCQljYXNlICcmJzoKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCWlmIChuZXh0ID09ICcmJykgeworCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQkJZG9uZV9waXBlKCZjdHgsIFBJUEVfQU5EKTsKKwkJCX0gZWxzZSB7CisJCQkJZG9uZV9waXBlKCZjdHgsIFBJUEVfQkcpOworCQkJfQorCQkJZ290byBuZXdfY21kOworCQljYXNlICd8JzoKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJCQlpZiAoY3R4LmN0eF9yZXNfdyA9PSBSRVNfTUFUQ0gpCisJCQkJYnJlYWs7IC8qIHdlIGFyZSBpbiBjYXNlJ3MgIndvcmQgfCB3b3JkKSIgKi8KKyNlbmRpZgorCQkJaWYgKG5leHQgPT0gJ3wnKSB7IC8qIHx8ICovCisJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9PUik7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGNvdWxkIHBpY2sgdXAgYSBmaWxlIGRlc2NyaXB0b3IgY2hvaWNlIGhlcmUKKwkJCQkgKiB3aXRoIHJlZGlyZWN0X29wdF9udW0oKSwgYnV0IGJhc2ggZG9lc24ndCBkbyBpdC4KKwkJCQkgKiAiZWNobyBmb28gMnwgY2F0IiB5aWVsZHMgImZvbyAyIi4gKi8KKwkJCQlkb25lX2NvbW1hbmQoJmN0eCk7CisjaWYgIUJCX01NVQorCQkJCW9fcmVzZXRfdG9fZW1wdHlfdW5xdW90ZWQoJmN0eC5hc19zdHJpbmcpOworI2VuZGlmCisJCQl9CisJCQlnb3RvIG5ld19jbWQ7CisJCWNhc2UgJygnOgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJCS8qICJjYXNlLi4uIGluIFsoXXdvcmQpLi4uIiAtIHNraXAgJygnICovCisJCQlpZiAoY3R4LmN0eF9yZXNfdyA9PSBSRVNfTUFUQ0gKKwkJCSAmJiBjdHguY29tbWFuZC0+YXJndiA9PSBOVUxMIC8qIG5vdCAod29yZHwoLi4uICovCisJCQkgJiYgZGVzdC5sZW5ndGggPT0gMCAvKiBub3Qgd29yZCguLi4gKi8KKwkJCSAmJiBkZXN0Lmhhc19xdW90ZWRfcGFydCA9PSAwIC8qIG5vdCAiIiguLi4gKi8KKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCWNhc2UgJ3snOgorCQkJaWYgKHBhcnNlX2dyb3VwKCZkZXN0LCAmY3R4LCBpbnB1dCwgY2gpICE9IDApIHsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJZ290byBuZXdfY21kOworCQljYXNlICcpJzoKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJCQlpZiAoY3R4LmN0eF9yZXNfdyA9PSBSRVNfTUFUQ0gpCisJCQkJZ290byBjYXNlX3NlbWk7CisjZW5kaWYKKwkJY2FzZSAnfSc6CisJCQkvKiBwcm9wZXIgdXNlIG9mIHRoaXMgY2hhcmFjdGVyIGlzIGNhdWdodCBieSBlbmRfdHJpZ2dlcjoKKwkJCSAqIGlmIHdlIHNlZSB7LCB3ZSBjYWxsIHBhcnNlX2dyb3VwKC4uLiwgZW5kX3RyaWdnZXI9J30nKQorCQkJICogYW5kIGl0IHdpbGwgbWF0Y2ggfSBlYXJsaWVyIChub3QgaGVyZSkuICovCisJCQlzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaChjaCk7CisJCQlnb3RvIHBhcnNlX2Vycm9yOworCQlkZWZhdWx0OgorCQkJaWYgKEhVU0hfREVCVUcpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkJVRzogdW5leHBlY3RlZCAlY1xuIiwgY2gpOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKworIHBhcnNlX2Vycm9yOgorCXsKKwkJc3RydWN0IHBhcnNlX2NvbnRleHQgKnBjdHg7CisJCUlGX0hBU19LRVlXT1JEUyhzdHJ1Y3QgcGFyc2VfY29udGV4dCAqcDI7KQorCisJCS8qIENsZWFuIHVwIGFsbG9jYXRlZCB0cmVlLgorCQkgKiBTYW1wbGUgZm9yIGZpbmRpbmcgbGVha3Mgb24gc3ludGF4IGVycm9yIHJlY292ZXJ5IHBhdGguCisJCSAqIFJ1biBpdCBmcm9tIGludGVyYWN0aXZlIHNoZWxsLCB3YXRjaCBwbWFwIGBwaWRvZiBodXNoYC4KKwkJICogd2hpbGUgaWYgZmFsc2U7IHRoZW4gZmFsc2U7IGZpOyBkbyBicmVhazsgZmkKKwkJICogU2FtcGxlcyB0byBjYXRjaCBsZWFrcyBhdCBleGVjdXRpb246CisJCSAqIHdoaWxlIGlmICh0cnVlIHwge3RydWU7fSk7IHRoZW4gZWNobyBvazsgZmk7IGRvIGJyZWFrOyBkb25lCisJCSAqIHdoaWxlIGlmICh0cnVlIHwge3RydWU7fSk7IHRoZW4gZWNobyBvazsgZmk7IGRvIChpZiBlY2hvIG9rOyBicmVhazsgdGhlbiA6OyBmaSkgfCBjYXQ7IGJyZWFrOyBkb25lCisJCSAqLworCQlwY3R4ID0gJmN0eDsKKwkJZG8geworCQkJLyogVXBkYXRlIHBpcGUvY29tbWFuZCBjb3VudHMsCisJCQkgKiBvdGhlcndpc2UgZnJlZWluZyBtYXkgbWlzcyBzb21lICovCisJCQlkb25lX3BpcGUocGN0eCwgUElQRV9TRVEpOworCQkJZGVidWdfcHJpbnRmX2NsZWFuKCJmcmVlaW5nIGxpc3QgJXAgZnJvbSBjdHggJXBcbiIsCisJCQkJCXBjdHgtPmxpc3RfaGVhZCwgcGN0eCk7CisJCQlkZWJ1Z19wcmludF90cmVlKHBjdHgtPmxpc3RfaGVhZCwgMCk7CisJCQlmcmVlX3BpcGVfbGlzdChwY3R4LT5saXN0X2hlYWQpOworCQkJZGVidWdfcHJpbnRmX2NsZWFuKCJmcmVlZCBsaXN0ICVwXG4iLCBwY3R4LT5saXN0X2hlYWQpOworI2lmICFCQl9NTVUKKwkJCW9fZnJlZV91bnNhZmUoJnBjdHgtPmFzX3N0cmluZyk7CisjZW5kaWYKKwkJCUlGX0hBU19LRVlXT1JEUyhwMiA9IHBjdHgtPnN0YWNrOykKKwkJCWlmIChwY3R4ICE9ICZjdHgpIHsKKwkJCQlmcmVlKHBjdHgpOworCQkJfQorCQkJSUZfSEFTX0tFWVdPUkRTKHBjdHggPSBwMjspCisJCX0gd2hpbGUgKEhBU19LRVlXT1JEUyAmJiBwY3R4KTsKKworCQlvX2ZyZWUoJmRlc3QpOworCQlHLmxhc3RfZXhpdGNvZGUgPSAxOworI2lmICFCQl9NTVUKKwkJaWYgKHBzdHJpbmcpCisJCQkqcHN0cmluZyA9IE5VTEw7CisjZW5kaWYKKwkJZGVidWdfbGVhdmUoKTsKKwkJcmV0dXJuIEVSUl9QVFI7CisJfQorfQorCisKKy8qKiogRXhlY3V0aW9uIHJvdXRpbmVzICoqKi8KKworLyogRXhwYW5zaW9uIGNhbiByZWN1cnNlLCBuZWVkIGZvcndhcmQgZGVjbHM6ICovCisjaWYgIUVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisvKiBvbmx5ICR7dmFyL3BhdHRlcm4vcmVwbH0gKGl0cyBwYXR0ZXJuIHBhcnQpIG5lZWRzIGFkZGl0aW9uYWwgbW9kZSAqLworI2RlZmluZSBleHBhbmRfc3RyaW5nX3RvX3N0cmluZyhzdHIsIGRvX3VuYmFja3NsYXNoKSBcCisJZXhwYW5kX3N0cmluZ190b19zdHJpbmcoc3RyKQorI2VuZGlmCitzdGF0aWMgY2hhciAqZXhwYW5kX3N0cmluZ190b19zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgZG9fdW5iYWNrc2xhc2gpOworI2lmIEVOQUJMRV9IVVNIX1RJQ0sKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kX3N1YnMob19zdHJpbmcgKmRlc3QsIGNvbnN0IGNoYXIgKnMpOworI2VuZGlmCisKKy8qIGV4cGFuZF9zdHJ2ZWNfdG9fc3RydmVjKCkgdGFrZXMgYSBsaXN0IG9mIHN0cmluZ3MsIGV4cGFuZHMKKyAqIGFsbCB2YXJpYWJsZSByZWZlcmVuY2VzIHdpdGhpbiBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAqIGEgbGlzdCBvZiBleHBhbmRlZCBzdHJpbmdzLCBwb3NzaWJseSB3aXRoIGxhcmdlciBudW1iZXIKKyAqIG9mIHN0cmluZ3MuIChUaGluayBWQVI9ImEgYiI7IGVjaG8gJFZBUikuCisgKiBUaGlzIG5ldyBsaXN0IGlzIGFsbG9jYXRlZCBhcyBhIHNpbmdsZSBtYWxsb2MgYmxvY2suCisgKiBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBjaGFyKiBwb2ludGVycyBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0LAorICogZm9sbG93ZWQgYnkgc3RyaW5ncyB0aGVtc2VsdmVzLgorICogQ2FsbGVyIGNhbiBkZWFsbG9jYXRlIGVudGlyZSBsaXN0IGJ5IHNpbmdsZSBmcmVlKGxpc3QpLiAqLworCisvKiBBIGhvcmRlIG9mIGl0cyBoZWxwZXJzIGNvbWUgZmlyc3Q6ICovCisKK3N0YXRpYyB2b2lkIG9fYWRkYmxvY2tfZHVwbGljYXRlX2JhY2tzbGFzaChvX3N0cmluZyAqbywgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCXdoaWxlICgtLWxlbiA+PSAwKSB7CisJCWNoYXIgYyA9ICpzdHIrKzsKKworI2lmIEVOQUJMRV9IVVNIX0JSQUNFX0VYUEFOU0lPTgorCQlpZiAoYyA9PSAneycgfHwgYyA9PSAnfScpIHsKKwkJCS8qIHsgLT4gXHssIH0gLT4gXH0gKi8KKwkJCW9fYWRkY2hyKG8sICdcXCcpOworCQkJLyogQW5kIG5vdyB3ZSB3YW50IHRvIGFkZCB7IG9yIH0gYW5kIGNvbnRpbnVlOgorCQkJICogIG9fYWRkY2hyKG8sIGMpOworCQkJICogIGNvbnRpbnVlOworCQkJICogbHVja2lseSwganVzdCBmYWxsaW5nIHRocm91Z2h0IGFjaGlldmVzIHRoaXMuCisJCQkgKi8KKwkJfQorI2VuZGlmCisJCW9fYWRkY2hyKG8sIGMpOworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQkvKiBceiAtPiBcXFx6OyBcPGVvbD4gLT4gXFw8ZW9sPiAqLworCQkJb19hZGRjaHIobywgJ1xcJyk7CisJCQlpZiAobGVuKSB7CisJCQkJbGVuLS07CisJCQkJb19hZGRjaHIobywgJ1xcJyk7CisJCQkJb19hZGRjaHIobywgKnN0cisrKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyogU3RvcmUgZ2l2ZW4gc3RyaW5nLCBmaW5hbGl6aW5nIHRoZSB3b3JkIGFuZCBzdGFydGluZyBuZXcgb25lIHdoZW5ldmVyCisgKiB3ZSBlbmNvdW50ZXIgSUZTIGNoYXIocykuIFRoaXMgaXMgdXNlZCBmb3IgZXhwYW5kaW5nIHZhcmlhYmxlIHZhbHVlcy4KKyAqIEVuZC1vZi1zdHJpbmcgZG9lcyBOT1QgZmluYWxpemUgd29yZDogdGhpbmsgYWJvdXQgJ2VjaG8gLSRWQVItJy4KKyAqIFJldHVybiBpbiAqZW5kZWRfd2l0aF9pZnM6CisgKiAxIC0gZW5kZWQgd2l0aCBJRlMgY2hhciwgZWxzZSAwICh0aGlzIGluY2x1ZGVzIGNhc2Ugb2YgZW1wdHkgc3RyKS4KKyAqLworc3RhdGljIGludCBleHBhbmRfb25faWZzKGludCAqZW5kZWRfd2l0aF9pZnMsIG9fc3RyaW5nICpvdXRwdXQsIGludCBuLCBjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGxhc3RfaXNfaWZzID0gMDsKKworCXdoaWxlICgxKSB7CisJCWludCB3b3JkX2xlbjsKKworCQlpZiAoISpzdHIpICAvKiBFT0wgLSBkbyBub3QgZmluYWxpemUgd29yZCAqLworCQkJYnJlYWs7CisJCXdvcmRfbGVuID0gc3RyY3NwbihzdHIsIEcuaWZzKTsKKwkJaWYgKHdvcmRfbGVuKSB7CisJCQkvKiBXZSBoYXZlIFdPUkRfTEVOIGxlYWRpbmcgbm9uLUlGUyBjaGFycyAqLworCQkJaWYgKCEob3V0cHV0LT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfR0xPQikpIHsKKwkJCQlvX2FkZGJsb2NrKG91dHB1dCwgc3RyLCB3b3JkX2xlbik7CisJCQl9IGVsc2UgeworCQkJCS8qIFByb3RlY3QgYmFja3NsYXNoZXMgYWdhaW5zdCBnbG9iYmluZyB1cCA6KQorCQkJCSAqIEV4YW1wbGU6ICJ2PSdcKic7IGVjaG8gYiR2IiBwcmludHMgImJcKiIKKwkJCQkgKiAoYW5kIGRvZXMgbm90IHRyeSB0byBnbG9iIG9uICIqIikKKwkJCQkgKi8KKwkJCQlvX2FkZGJsb2NrX2R1cGxpY2F0ZV9iYWNrc2xhc2gob3V0cHV0LCBzdHIsIHdvcmRfbGVuKTsKKwkJCQkvKi8gV2h5IGNhbid0IHdlIGRvIGl0IGVhc2llcj8gKi8KKwkJCQkvKm9fYWRkYmxvY2sob3V0cHV0LCBzdHIsIHdvcmRfbGVuKTsgLSBXUk9ORzogInY9J1wqJzsgZWNobyBaJHYiIHByaW50cyAiWioiIGluc3RlYWQgb2YgIlpcKiIgKi8KKwkJCQkvKm9fYWRkcWJsb2NrKG91dHB1dCwgc3RyLCB3b3JkX2xlbik7IC0gV1JPTkc6ICJ2PScqJzsgZWNobyBaJHYiIHByaW50cyAiWioiIGluc3RlYWQgb2YgWiogZmlsZXMgKi8KKwkJCX0KKwkJCWxhc3RfaXNfaWZzID0gMDsKKwkJCXN0ciArPSB3b3JkX2xlbjsKKwkJCWlmICghKnN0cikgIC8qIEVPTCAtIGRvIG5vdCBmaW5hbGl6ZSB3b3JkICovCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBXZSBrbm93IHN0ciBoZXJlIHBvaW50cyB0byBhdCBsZWFzdCBvbmUgSUZTIGNoYXIgKi8KKwkJbGFzdF9pc19pZnMgPSAxOworCQlzdHIgKz0gc3Ryc3BuKHN0ciwgRy5pZnMpOyAvKiBza2lwIElGUyBjaGFycyAqLworCQlpZiAoISpzdHIpICAvKiBFT0wgLSBkbyBub3QgZmluYWxpemUgd29yZCAqLworCQkJYnJlYWs7CisKKwkJLyogU3RhcnQgbmV3IHdvcmQuLi4gYnV0IG5vdCBhbHdheXMhICovCisJCS8qIENhc2UgInY9JyBhJzsgZWNobyAnJyR2Ijogd2UgZG8gbmVlZCB0byBmaW5hbGl6ZSBlbXB0eSB3b3JkOiAqLworCQlpZiAob3V0cHV0LT5oYXNfcXVvdGVkX3BhcnQKKwkJLyogQ2FzZSAidj0nIGEnOyBlY2hvICR2IjoKKwkJICogaGVyZSBub3RoaW5nIHByZWNlZGVzIHRoZSBzcGFjZSBpbiAkdiBleHBhbnNpb24sCisJCSAqIHRoZXJlZm9yZSB3ZSBzaG91bGQgbm90IGZpbmlzaCB0aGUgd29yZAorCQkgKiAoSU9XOiBpZiB0aGVyZSAqaXMqIHdvcmQgdG8gZmluYWxpemUsIG9ubHkgdGhlbiBkbyBpdCk6CisJCSAqLworCQkgfHwgKG4gPiAwICYmIG91dHB1dC0+ZGF0YVtvdXRwdXQtPmxlbmd0aCAtIDFdKQorCQkpIHsKKwkJCW9fYWRkY2hyKG91dHB1dCwgJ1wwJyk7CisJCQlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfb25faWZzIiwgb3V0cHV0LCBuKTsKKwkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCX0KKwl9CisKKwlpZiAoZW5kZWRfd2l0aF9pZnMpCisJCSplbmRlZF93aXRoX2lmcyA9IGxhc3RfaXNfaWZzOworCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF9vbl9pZnNbMV0iLCBvdXRwdXQsIG4pOworCXJldHVybiBuOworfQorCisvKiBIZWxwZXIgdG8gZXhwYW5kICQoKC4uLikpIGFuZCBoZXJlZG9jIGJvZHkuIFRoZXNlIGFjdCBhcyBpZgorICogdGhleSBhcmUgaW4gZG91YmxlIHF1b3Rlcywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhleSBhcmUgbm90IDopLgorICogSnVzdCB0aGUgcnVsZXMgYXJlIHNpbWlsYXI6ICJleHBhbmQgb25seSAkdmFyIGFuZCBgY21kYCIKKyAqCisgKiBSZXR1cm5zIG1hbGxvY2VkIHN0cmluZy4KKyAqIEFzIGFuIG9wdGltaXphdGlvbiwgd2UgcmV0dXJuIE5VTEwgaWYgZXhwYW5zaW9uIGlzIG5vdCBuZWVkZWQuCisgKi8KKyNpZiAhRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKy8qIG9ubHkgJHt2YXIvcGF0dGVybi9yZXBsfSAoaXRzIHBhdHRlcm4gcGFydCkgbmVlZHMgYWRkaXRpb25hbCBtb2RlICovCisjZGVmaW5lIGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoc3RyLCBwcm9jZXNzX2Jrc2xhc2gsIGRvX3VuYmFja3NsYXNoKSBcCisJZW5jb2RlX3RoZW5fZXhwYW5kX3N0cmluZyhzdHIpCisjZW5kaWYKK3N0YXRpYyBjaGFyICplbmNvZGVfdGhlbl9leHBhbmRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHByb2Nlc3NfYmtzbGFzaCwgaW50IGRvX3VuYmFja3NsYXNoKQoreworCWNoYXIgKmV4cF9zdHI7CisJc3RydWN0IGluX3N0ciBpbnB1dDsKKwlvX3N0cmluZyBkZXN0ID0gTlVMTF9PX1NUUklORzsKKworCWlmICghc3RyY2hyKHN0ciwgJyQnKQorCSAmJiAhc3RyY2hyKHN0ciwgJ1xcJykKKyNpZiBFTkFCTEVfSFVTSF9USUNLCisJICYmICFzdHJjaHIoc3RyLCAnYCcpCisjZW5kaWYKKwkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogV2UgbmVlZCB0byBleHBhbmQuIEV4YW1wbGU6CisJICogZWNobyAkKCgkYSArIGBlY2hvIDFgKSkgJCgoMSArICQoKDIpKSApKQorCSAqLworCXNldHVwX3N0cmluZ19pbl9zdHIoJmlucHV0LCBzdHIpOworCWVuY29kZV9zdHJpbmcoTlVMTCwgJmRlc3QsICZpbnB1dCwgRU9GLCBwcm9jZXNzX2Jrc2xhc2gpOworLy9UT0RPOiBlcnJvciBjaGVjayAoZW5jb2RlX3N0cmluZyByZXR1cm5zIDAgb24gZXJyb3IpPworCS8vYmJfZXJyb3JfbXNnKCInJXMnIC0+ICclcyciLCBzdHIsIGRlc3QuZGF0YSk7CisJZXhwX3N0ciA9IGV4cGFuZF9zdHJpbmdfdG9fc3RyaW5nKGRlc3QuZGF0YSwgLyp1bmJhY2tzbGFzaDoqLyBkb191bmJhY2tzbGFzaCk7CisJLy9iYl9lcnJvcl9tc2coIiclcycgLT4gJyVzJyIsIGRlc3QuZGF0YSwgZXhwX3N0cik7CisJb19mcmVlX3Vuc2FmZSgmZGVzdCk7CisJcmV0dXJuIGV4cF9zdHI7Cit9CisKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCitzdGF0aWMgYXJpdGhfdCBleHBhbmRfYW5kX2V2YWx1YXRlX2FyaXRoKGNvbnN0IGNoYXIgKmFyZywgY29uc3QgY2hhciAqKmVycm1zZ19wKQoreworCWFyaXRoX3N0YXRlX3QgbWF0aF9zdGF0ZTsKKwlhcml0aF90IHJlczsKKwljaGFyICpleHBfc3RyOworCisJbWF0aF9zdGF0ZS5sb29rdXB2YXIgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlOworCW1hdGhfc3RhdGUuc2V0dmFyID0gc2V0X2xvY2FsX3Zhcl9mcm9tX2hhbHZlczsKKwkvL21hdGhfc3RhdGUuZW5kb2ZuYW1lID0gZW5kb2ZuYW1lOworCWV4cF9zdHIgPSBlbmNvZGVfdGhlbl9leHBhbmRfc3RyaW5nKGFyZywgLypwcm9jZXNzX2Jrc2xhc2g6Ki8gMSwgLyp1bmJhY2tzbGFzaDoqLyAxKTsKKwlyZXMgPSBhcml0aCgmbWF0aF9zdGF0ZSwgZXhwX3N0ciA/IGV4cF9zdHIgOiBhcmcpOworCWZyZWUoZXhwX3N0cik7CisJaWYgKGVycm1zZ19wKQorCQkqZXJybXNnX3AgPSBtYXRoX3N0YXRlLmVycm1zZzsKKwlpZiAobWF0aF9zdGF0ZS5lcnJtc2cpCisJCWRpZV9pZl9zY3JpcHQobWF0aF9zdGF0ZS5lcnJtc2cpOworCXJldHVybiByZXM7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisvKiAke3Zhci9bL11wYXR0ZXJuWy9yZXBsXX0gaGVscGVycyAqLworc3RhdGljIGNoYXIgKnN0cnN0cl9wYXR0ZXJuKGNoYXIgKnZhbCwgY29uc3QgY2hhciAqcGF0dGVybiwgaW50ICpzaXplKQoreworCXdoaWxlICgxKSB7CisJCWNoYXIgKmVuZCA9IHNjYW5fYW5kX21hdGNoKHZhbCwgcGF0dGVybiwgU0NBTl9NT1ZFX0ZST01fUklHSFQgKyBTQ0FOX01BVENIX0xFRlRfSEFMRik7CisJCWRlYnVnX3ByaW50Zl92YXJleHAoInZhbDonJXMnIHBhdHRlcm46JyVzJyBlbmQ6JyVzJ1xuIiwgdmFsLCBwYXR0ZXJuLCBlbmQpOworCQlpZiAoZW5kKSB7CisJCQkqc2l6ZSA9IGVuZCAtIHZhbDsKKwkJCXJldHVybiB2YWw7CisJCX0KKwkJaWYgKCp2YWwgPT0gJ1wwJykKKwkJCXJldHVybiBOVUxMOworCQkvKiBPcHRpbWl6YXRpb246IGlmICIqcGF0IiBkaWQgbm90IG1hdGNoIHRoZSBzdGFydCBvZiAic3RyaW5nIiwKKwkJICogd2Uga25vdyB0aGF0ICJ0cmluZyIsICJyaW5nIiBldGMgd2lsbCBub3QgbWF0Y2ggdG9vOgorCQkgKi8KKwkJaWYgKHBhdHRlcm5bMF0gPT0gJyonKQorCQkJcmV0dXJuIE5VTEw7CisJCXZhbCsrOworCX0KK30KK3N0YXRpYyBjaGFyICpyZXBsYWNlX3BhdHRlcm4oY2hhciAqdmFsLCBjb25zdCBjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpyZXBsLCBjaGFyIGV4cF9vcCkKK3sKKwljaGFyICpyZXN1bHQgPSBOVUxMOworCXVuc2lnbmVkIHJlc19sZW4gPSAwOworCXVuc2lnbmVkIHJlcGxfbGVuID0gc3RybGVuKHJlcGwpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHNpemU7CisJCWNoYXIgKnMgPSBzdHJzdHJfcGF0dGVybih2YWwsIHBhdHRlcm4sICZzaXplKTsKKwkJaWYgKCFzKQorCQkJYnJlYWs7CisKKwkJcmVzdWx0ID0geHJlYWxsb2MocmVzdWx0LCByZXNfbGVuICsgKHMgLSB2YWwpICsgcmVwbF9sZW4gKyAxKTsKKwkJbWVtY3B5KHJlc3VsdCArIHJlc19sZW4sIHZhbCwgcyAtIHZhbCk7CisJCXJlc19sZW4gKz0gcyAtIHZhbDsKKwkJc3RyY3B5KHJlc3VsdCArIHJlc19sZW4sIHJlcGwpOworCQlyZXNfbGVuICs9IHJlcGxfbGVuOworCQlkZWJ1Z19wcmludGZfdmFyZXhwKCJ2YWw6JyVzJyBzOiclcycgcmVzdWx0OiclcydcbiIsIHZhbCwgcywgcmVzdWx0KTsKKworCQl2YWwgPSBzICsgc2l6ZTsKKwkJaWYgKGV4cF9vcCA9PSAnLycpCisJCQlicmVhazsKKwl9CisJaWYgKHZhbFswXSAmJiByZXN1bHQpIHsKKwkJcmVzdWx0ID0geHJlYWxsb2MocmVzdWx0LCByZXNfbGVuICsgc3RybGVuKHZhbCkgKyAxKTsKKwkJc3RyY3B5KHJlc3VsdCArIHJlc19sZW4sIHZhbCk7CisJCWRlYnVnX3ByaW50Zl92YXJleHAoInZhbDonJXMnIHJlc3VsdDonJXMnXG4iLCB2YWwsIHJlc3VsdCk7CisJfQorCWRlYnVnX3ByaW50Zl92YXJleHAoInJlc3VsdDonJXMnXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworLyogSGVscGVyOgorICogSGFuZGxlcyA8U1BFQ0lBTF9WQVJfU1lNQk9MPnZhcm5hbWUuLi48U1BFQ0lBTF9WQVJfU1lNQk9MPiBjb25zdHJ1Y3QuCisgKi8KK3N0YXRpYyBOT0lOTElORSBjb25zdCBjaGFyICpleHBhbmRfb25lX3ZhcihjaGFyICoqdG9fYmVfZnJlZWRfcHAsIGNoYXIgKmFyZywgY2hhciAqKnBwKQoreworCWNvbnN0IGNoYXIgKnZhbCA9IE5VTEw7CisJY2hhciAqdG9fYmVfZnJlZWQgPSBOVUxMOworCWNoYXIgKnAgPSAqcHA7CisJY2hhciAqdmFyOworCWNoYXIgZmlyc3RfY2hhcjsKKwljaGFyIGV4cF9vcDsKKwljaGFyIGV4cF9zYXZlID0gZXhwX3NhdmU7IC8qIGZvciBjb21waWxlciAqLworCWNoYXIgKmV4cF9zYXZlcHRyOyAvKiBwb2ludHMgdG8gZXhwYW5zaW9uIG9wZXJhdG9yICovCisJY2hhciAqZXhwX3dvcmQgPSBleHBfd29yZDsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciBhcmcwOworCisJKnAgPSAnXDAnOyAvKiByZXBsYWNlIHRyYWlsaW5nIFNQRUNJQUxfVkFSX1NZTUJPTCAqLworCXZhciA9IGFyZzsKKwlleHBfc2F2ZXB0ciA9IGFyZ1sxXSA/IHN0cmNocihWQVJfRU5DT0RFRF9TVUJTVF9PUFMsIGFyZ1sxXSkgOiBOVUxMOworCWFyZzAgPSBhcmdbMF07CisJZmlyc3RfY2hhciA9IGFyZ1swXSA9IGFyZzAgJiAweDdmOworCWV4cF9vcCA9IDA7CisKKwlpZiAoZmlyc3RfY2hhciA9PSAnIycgICAgICAvKiAkeyMuLi4gKi8KKwkgJiYgYXJnWzFdICYmICFleHBfc2F2ZXB0ciAvKiBub3QgJHsjfSBhbmQgbm90ICR7IzxvcF9jaGFyPi4uLn0gKi8KKwkpIHsKKwkJLyogSXQgbXVzdCBiZSBsZW5ndGggb3BlcmF0b3I6ICR7I3Zhcn0gKi8KKwkJdmFyKys7CisJCWV4cF9vcCA9ICdMJzsKKwl9IGVsc2UgeworCQkvKiBNYXliZSBoYW5kbGUgcGFyYW1ldGVyIGV4cGFuc2lvbiAqLworCQlpZiAoZXhwX3NhdmVwdHIgLyogaWYgMm5kIGNoYXIgaXMgb25lIG9mIGV4cGFuc2lvbiBvcGVyYXRvcnMgKi8KKwkJICYmIHN0cmNocihOVU1FUklDX1NQRUNWQVJTX1NUUiwgZmlyc3RfY2hhcikgLyogMXN0IGNoYXIgaXMgc3BlY2lhbCB2YXJpYWJsZSAqLworCQkpIHsKKwkJCS8qICR7PzowfSwgJHsjWzpdJTB9IGV0YyAqLworCQkJZXhwX3NhdmVwdHIgPSB2YXIgKyAxOworCQl9IGVsc2UgeworCQkJLyogJHs/fSwgJHt2YXJ9LCAke3ZhcjowfSwgJHt2YXJbOl0lMH0gZXRjICovCisJCQlleHBfc2F2ZXB0ciA9IHZhcisxICsgc3RyY3Nwbih2YXIrMSwgVkFSX0VOQ09ERURfU1VCU1RfT1BTKTsKKwkJfQorCQlleHBfb3AgPSBleHBfc2F2ZSA9ICpleHBfc2F2ZXB0cjsKKwkJaWYgKGV4cF9vcCkgeworCQkJZXhwX3dvcmQgPSBleHBfc2F2ZXB0ciArIDE7CisJCQlpZiAoZXhwX29wID09ICc6JykgeworCQkJCWV4cF9vcCA9ICpleHBfd29yZCsrOworLy9UT0RPOiB0cnkgJHt2YXI6fSBhbmQgJHt2YXI6Ym9ndXN9IGluIG5vbi1iYXNoIGNvbmZpZworCQkJCWlmIChFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCQkJCSAmJiAoIWV4cF9vcCB8fCAhc3RyY2hyKE1JTlVTX1BMVVNfRVFVQUxfUVVFU1RJT04sIGV4cF9vcCkpCisJCQkJKSB7CisJCQkJCS8qIG9vcHMuLi4gaXQncyAke3ZhcjpOWzpNXX0sIG5vdCAke3Zhcjo/eHh4fSBvciBzb21lIHN1Y2ggKi8KKwkJCQkJZXhwX29wID0gJzonOworCQkJCQlleHBfd29yZC0tOworCQkJCX0KKwkJCX0KKwkJCSpleHBfc2F2ZXB0ciA9ICdcMCc7CisJCX0gLyogZWxzZTogaXQncyBub3QgYW4gZXhwYW5zaW9uIG9wLCBidXQgYmFyZSAke3Zhcn0gKi8KKwl9CisKKwkvKiBMb29rIHVwIHRoZSB2YXJpYWJsZSBpbiBxdWVzdGlvbiAqLworCWlmIChpc2RpZ2l0KHZhclswXSkpIHsKKwkJLyogcGFyc2VfZG9sbGFyIHNob3VsZCBoYXZlIHZldHRlZCB2YXIgZm9yIHVzICovCisJCWludCBuID0geGF0b2lfcG9zaXRpdmUodmFyKTsKKwkJaWYgKG4gPCBHLmdsb2JhbF9hcmdjKQorCQkJdmFsID0gRy5nbG9iYWxfYXJndltuXTsKKwkJLyogZWxzZSB2YWwgcmVtYWlucyBOVUxMOiAkTiB3aXRoIHRvbyBiaWcgTiAqLworCX0gZWxzZSB7CisJCXN3aXRjaCAodmFyWzBdKSB7CisJCWNhc2UgJyQnOiAvKiBwaWQgKi8KKwkJCXZhbCA9IHV0b2EoRy5yb290X3BpZCk7CisJCQlicmVhazsKKwkJY2FzZSAnISc6IC8qIGJnIHBpZCAqLworCQkJdmFsID0gRy5sYXN0X2JnX3BpZCA/IHV0b2EoRy5sYXN0X2JnX3BpZCkgOiAiIjsKKwkJCWJyZWFrOworCQljYXNlICc/JzogLyogZXhpdGNvZGUgKi8KKwkJCXZhbCA9IHV0b2EoRy5sYXN0X2V4aXRjb2RlKTsKKwkJCWJyZWFrOworCQljYXNlICcjJzogLyogYXJnYyAqLworCQkJdmFsID0gdXRvYShHLmdsb2JhbF9hcmdjID8gRy5nbG9iYWxfYXJnYy0xIDogMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZhbCA9IGdldF9sb2NhbF92YXJfdmFsdWUodmFyKTsKKwkJfQorCX0KKworCS8qIEhhbmRsZSBhbnkgZXhwYW5zaW9ucyAqLworCWlmIChleHBfb3AgPT0gJ0wnKSB7CisJCWRlYnVnX3ByaW50Zl9leHBhbmQoImV4cGFuZDogbGVuZ3RoKCVzKT0iLCB2YWwpOworCQl2YWwgPSB1dG9hKHZhbCA/IHN0cmxlbih2YWwpIDogMCk7CisJCWRlYnVnX3ByaW50Zl9leHBhbmQoIiVzXG4iLCB2YWwpOworCX0gZWxzZSBpZiAoZXhwX29wKSB7CisJCWlmIChleHBfb3AgPT0gJyUnIHx8IGV4cF9vcCA9PSAnIycpIHsKKwkJCS8qIFN0YW5kYXJkLW1hbmRhdGVkIHN1YnN0cmluZyByZW1vdmFsIG9wczoKKwkJCSAqICR7cGFyYW1ldGVyJXdvcmR9IC0gcmVtb3ZlIHNtYWxsZXN0IHN1ZmZpeCBwYXR0ZXJuCisJCQkgKiAke3BhcmFtZXRlciUld29yZH0gLSByZW1vdmUgbGFyZ2VzdCBzdWZmaXggcGF0dGVybgorCQkJICogJHtwYXJhbWV0ZXIjd29yZH0gLSByZW1vdmUgc21hbGxlc3QgcHJlZml4IHBhdHRlcm4KKwkJCSAqICR7cGFyYW1ldGVyIyN3b3JkfSAtIHJlbW92ZSBsYXJnZXN0IHByZWZpeCBwYXR0ZXJuCisJCQkgKgorCQkJICogV29yZCBpcyBleHBhbmRlZCB0byBwcm9kdWNlIGEgZ2xvYiBwYXR0ZXJuLgorCQkJICogVGhlbiB2YXIncyB2YWx1ZSBpcyBtYXRjaGVkIHRvIGl0IGFuZCBtYXRjaGluZyBwYXJ0IHJlbW92ZWQuCisJCQkgKi8KKwkJCWlmICh2YWwgJiYgdmFsWzBdKSB7CisJCQkJY2hhciAqdDsKKwkJCQljaGFyICpleHBfZXhwX3dvcmQ7CisJCQkJY2hhciAqbG9jOworCQkJCXVuc2lnbmVkIHNjYW5fZmxhZ3MgPSBwaWNrX3NjYW4oZXhwX29wLCAqZXhwX3dvcmQpOworCQkJCWlmIChleHBfb3AgPT0gKmV4cF93b3JkKSAgLyogIyMgb3IgJSUgKi8KKwkJCQkJZXhwX3dvcmQrKzsKKwkJCQlleHBfZXhwX3dvcmQgPSBlbmNvZGVfdGhlbl9leHBhbmRfc3RyaW5nKGV4cF93b3JkLCAvKnByb2Nlc3NfYmtzbGFzaDoqLyAxLCAvKnVuYmFja3NsYXNoOiovIDEpOworCQkJCWlmIChleHBfZXhwX3dvcmQpCisJCQkJCWV4cF93b3JkID0gZXhwX2V4cF93b3JkOworCQkJCS8qIEhBQ0sgQUxFUlQuIFdlIGRlcGVuZCBoZXJlIG9uIHRoZSBmYWN0IHRoYXQKKwkJCQkgKiBHLmdsb2JhbF9hcmd2IGFuZCByZXN1bHRzIG9mIHV0b2EgYW5kIGdldF9sb2NhbF92YXJfdmFsdWUKKwkJCQkgKiBhcmUgYWN0dWFsbHkgaW4gd3JpdGFibGUgbWVtb3J5OgorCQkJCSAqIHNjYW5fYW5kX21hdGNoIG1vbWVudGFyaWx5IHN0b3JlcyBOVUxzIHRoZXJlLiAqLworCQkJCXQgPSAoY2hhciopdmFsOworCQkJCWxvYyA9IHNjYW5fYW5kX21hdGNoKHQsIGV4cF93b3JkLCBzY2FuX2ZsYWdzKTsKKwkJCQkvL2JiX2Vycm9yX21zZygib3A6JWMgc3RyOiclcycgcGF0OiclcycgcmVzOiclcyciLAorCQkJCS8vCQlleHBfb3AsIHQsIGV4cF93b3JkLCBsb2MpOworCQkJCWZyZWUoZXhwX2V4cF93b3JkKTsKKwkJCQlpZiAobG9jKSB7IC8qIG1hdGNoIHdhcyBmb3VuZCAqLworCQkJCQlpZiAoc2Nhbl9mbGFncyAmIFNDQU5fTUFUQ0hfTEVGVF9IQUxGKSAvKiAjWyNdICovCisJCQkJCQl2YWwgPSBsb2M7IC8qIHRha2UgcmlnaHQgcGFydCAqLworCQkJCQllbHNlIC8qICVbJV0gKi8KKwkJCQkJCXZhbCA9IHRvX2JlX2ZyZWVkID0geHN0cm5kdXAodmFsLCBsb2MgLSB2YWwpOyAvKiBsZWZ0ICovCisJCQkJfQorCQkJfQorCQl9CisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwkJZWxzZSBpZiAoZXhwX29wID09ICcvJyB8fCBleHBfb3AgPT0gJ1xcJykgeworCQkJLyogSXQncyAke3Zhci9bL11wYXR0ZXJuWy9yZXBsXX0gdGhpbmcuCisJCQkgKiBOb3RlIHRoYXQgaW4gZW5jb2RlZCBmb3JtIGl0IGhhcyBUV08gcGFydHM6CisJCQkgKiB2YXIvcGF0dGVybjxTUEVDSUFMX1ZBUl9TWU1CT0w+cmVwbDxTUEVDSUFMX1ZBUl9TWU1CT0w+CisJCQkgKiBhbmQgaWYgLy8gaXMgdXNlZCwgaXQgaXMgZW5jb2RlZCBhcyBcOgorCQkJICogdmFyXHBhdHRlcm48U1BFQ0lBTF9WQVJfU1lNQk9MPnJlcGw8U1BFQ0lBTF9WQVJfU1lNQk9MPgorCQkJICovCisJCQkvKiBFbXB0eSB2YXJpYWJsZSBhbHdheXMgZ2l2ZXMgbm90aGluZzogKi8KKwkJCS8vICJ2PScnOyBlY2hvICR7di8qL3d9IiBwcmludHMgIiIsIG5vdCAidyIKKwkJCWlmICh2YWwgJiYgdmFsWzBdKSB7CisJCQkJLyogcGF0dGVybiB1c2VzIG5vbi1zdGFuZGFyZCBleHBhbnNpb24uCisJCQkJICogcmVwbCBzaG91bGQgYmUgdW5iYWNrc2xhc2hlZCBhbmQgZ2xvYmJlZAorCQkJCSAqIGJ5IHRoZSB1c3VhbCBleHBhbnNpb24gcnVsZXM6CisJCQkJICogPmF6OyA+Yno7CisJCQkJICogdj0nYSBieic7IGVjaG8gIiR7di9hKnovYSp6fSIgcHJpbnRzICJhKnoiCisJCQkJICogdj0nYSBieic7IGVjaG8gIiR7di9hKnovXHp9IiAgcHJpbnRzICJceiIKKwkJCQkgKiB2PSdhIGJ6JzsgZWNobyAke3YvYSp6L2Eqen0gICBwcmludHMgImF6IgorCQkJCSAqIHY9J2EgYnonOyBlY2hvICR7di9hKnovXHp9ICAgIHByaW50cyAieiIKKwkJCQkgKiAobm90ZSB0aGF0IGEqeiBfcGF0dGVybl8gaXMgbmV2ZXIgZ2xvYmJlZCEpCisJCQkJICovCisJCQkJY2hhciAqcGF0dGVybiwgKnJlcGwsICp0OworCQkJCXBhdHRlcm4gPSBlbmNvZGVfdGhlbl9leHBhbmRfc3RyaW5nKGV4cF93b3JkLCAvKnByb2Nlc3NfYmtzbGFzaDoqLyAwLCAvKnVuYmFja3NsYXNoOiovIDApOworCQkJCWlmICghcGF0dGVybikKKwkJCQkJcGF0dGVybiA9IHhzdHJkdXAoZXhwX3dvcmQpOworCQkJCWRlYnVnX3ByaW50Zl92YXJleHAoInBhdHRlcm46JyVzJy0+JyVzJ1xuIiwgZXhwX3dvcmQsIHBhdHRlcm4pOworCQkJCSpwKysgPSBTUEVDSUFMX1ZBUl9TWU1CT0w7CisJCQkJZXhwX3dvcmQgPSBwOworCQkJCXAgPSBzdHJjaHIocCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJCQkqcCA9ICdcMCc7CisJCQkJcmVwbCA9IGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoZXhwX3dvcmQsIC8qcHJvY2Vzc19ia3NsYXNoOiovIGFyZzAgJiAweDgwLCAvKnVuYmFja3NsYXNoOiovIDEpOworCQkJCWRlYnVnX3ByaW50Zl92YXJleHAoInJlcGw6JyVzJy0+JyVzJ1xuIiwgZXhwX3dvcmQsIHJlcGwpOworCQkJCS8qIEhBQ0sgQUxFUlQuIFdlIGRlcGVuZCBoZXJlIG9uIHRoZSBmYWN0IHRoYXQKKwkJCQkgKiBHLmdsb2JhbF9hcmd2IGFuZCByZXN1bHRzIG9mIHV0b2EgYW5kIGdldF9sb2NhbF92YXJfdmFsdWUKKwkJCQkgKiBhcmUgYWN0dWFsbHkgaW4gd3JpdGFibGUgbWVtb3J5OgorCQkJCSAqIHJlcGxhY2VfcGF0dGVybiBtb21lbnRhcmlseSBzdG9yZXMgTlVMcyB0aGVyZS4gKi8KKwkJCQl0ID0gKGNoYXIqKXZhbDsKKwkJCQl0b19iZV9mcmVlZCA9IHJlcGxhY2VfcGF0dGVybih0LAorCQkJCQkJcGF0dGVybiwKKwkJCQkJCShyZXBsID8gcmVwbCA6IGV4cF93b3JkKSwKKwkJCQkJCWV4cF9vcCk7CisJCQkJaWYgKHRvX2JlX2ZyZWVkKSAvKiBhdCBsZWFzdCBvbmUgcmVwbGFjZSBoYXBwZW5lZCAqLworCQkJCQl2YWwgPSB0b19iZV9mcmVlZDsKKwkJCQlmcmVlKHBhdHRlcm4pOworCQkJCWZyZWUocmVwbCk7CisJCQl9CisJCX0KKyNlbmRpZgorCQllbHNlIGlmIChleHBfb3AgPT0gJzonKSB7CisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQgJiYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQkJLyogSXQncyAke3ZhcjpOWzpNXX0gYmFzaGlzbS4KKwkJCSAqIE5vdGUgdGhhdCBpbiBlbmNvZGVkIGZvcm0gaXQgaGFzIFRXTyBwYXJ0czoKKwkJCSAqIHZhcjpOPFNQRUNJQUxfVkFSX1NZTUJPTD5NPFNQRUNJQUxfVkFSX1NZTUJPTD4KKwkJCSAqLworCQkJYXJpdGhfdCBiZWcsIGxlbjsKKwkJCWNvbnN0IGNoYXIgKmVycm1zZzsKKworCQkJYmVnID0gZXhwYW5kX2FuZF9ldmFsdWF0ZV9hcml0aChleHBfd29yZCwgJmVycm1zZyk7CisJCQlpZiAoZXJybXNnKQorCQkJCWdvdG8gYXJpdGhfZXJyOworCQkJZGVidWdfcHJpbnRmX3ZhcmV4cCgiYmVnOiclcyc9JWxsZFxuIiwgZXhwX3dvcmQsIChsb25nIGxvbmcpYmVnKTsKKwkJCSpwKysgPSBTUEVDSUFMX1ZBUl9TWU1CT0w7CisJCQlleHBfd29yZCA9IHA7CisJCQlwID0gc3RyY2hyKHAsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQkqcCA9ICdcMCc7CisJCQlsZW4gPSBleHBhbmRfYW5kX2V2YWx1YXRlX2FyaXRoKGV4cF93b3JkLCAmZXJybXNnKTsKKwkJCWlmIChlcnJtc2cpCisJCQkJZ290byBhcml0aF9lcnI7CisJCQlkZWJ1Z19wcmludGZfdmFyZXhwKCJsZW46JyVzJz0lbGxkXG4iLCBleHBfd29yZCwgKGxvbmcgbG9uZylsZW4pOworCQkJaWYgKGxlbiA+PSAwKSB7IC8qIGJhc2ggY29tcGF0OiBsZW4gPCAwIGlzIGlsbGVnYWwgKi8KKwkJCQlpZiAoYmVnIDwgMCkgLyogYmFzaCBjb21wYXQgKi8KKwkJCQkJYmVnID0gMDsKKwkJCQlkZWJ1Z19wcmludGZfdmFyZXhwKCJmcm9tIHZhbDonJXMnXG4iLCB2YWwpOworCQkJCWlmIChsZW4gPT0gMCB8fCAhdmFsIHx8IGJlZyA+PSBzdHJsZW4odmFsKSkgeworIGFyaXRoX2VycjoKKwkJCQkJdmFsID0gTlVMTDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBQYXJhbm9pYS4gV2hhdCBpZiB1c2VyIGVudGVyZWQgOTk5OTk5OTk5OTk5OQorCQkJCQkgKiB3aGljaCBmaXRzIGluIGFyaXRoX3QgYnV0IG5vdCBpbnQ/ICovCisJCQkJCWlmIChsZW4gPj0gSU5UX01BWCkKKwkJCQkJCWxlbiA9IElOVF9NQVg7CisJCQkJCXZhbCA9IHRvX2JlX2ZyZWVkID0geHN0cm5kdXAodmFsICsgYmVnLCBsZW4pOworCQkJCX0KKwkJCQlkZWJ1Z19wcmludGZfdmFyZXhwKCJ2YWw6JyVzJ1xuIiwgdmFsKTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJZGllX2lmX3NjcmlwdCgibWFsZm9ybWVkICR7JXM6Li4ufSIsIHZhcik7CisJCQkJdmFsID0gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsgLyogb25lIG9mICItPSs/IiAqLworCQkJLyogU3RhbmRhcmQtbWFuZGF0ZWQgc3Vic3RpdHV0aW9uIG9wczoKKwkJCSAqICR7dmFyP3dvcmR9IC0gaW5kaWNhdGUgZXJyb3IgaWYgdW5zZXQKKwkJCSAqICAgICAgSWYgdmFyIGlzIHVuc2V0LCB3b3JkIChvciBhIG1lc3NhZ2UgaW5kaWNhdGluZyBpdCBpcyB1bnNldAorCQkJICogICAgICBpZiB3b3JkIGlzIG51bGwpIGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQgZXJyb3IKKwkJCSAqICAgICAgYW5kIHRoZSBzaGVsbCBleGl0cyB3aXRoIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMuCisJCQkgKiAgICAgIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIHZhciBpcyBzdWJzdGl0dXRlZC4KKwkJCSAqICR7dmFyLXdvcmR9IC0gdXNlIGRlZmF1bHQgdmFsdWUKKwkJCSAqICAgICAgSWYgdmFyIGlzIHVuc2V0LCB3b3JkIGlzIHN1YnN0aXR1dGVkLgorCQkJICogJHt2YXI9d29yZH0gLSBhc3NpZ24gYW5kIHVzZSBkZWZhdWx0IHZhbHVlCisJCQkgKiAgICAgIElmIHZhciBpcyB1bnNldCwgd29yZCBpcyBhc3NpZ25lZCB0byB2YXIuCisJCQkgKiAgICAgIEluIGFsbCBjYXNlcywgZmluYWwgdmFsdWUgb2YgdmFyIGlzIHN1YnN0aXR1dGVkLgorCQkJICogJHt2YXIrd29yZH0gLSB1c2UgYWx0ZXJuYXRpdmUgdmFsdWUKKwkJCSAqICAgICAgSWYgdmFyIGlzIHVuc2V0LCBudWxsIGlzIHN1YnN0aXR1dGVkLgorCQkJICogICAgICBPdGhlcndpc2UsIHdvcmQgaXMgc3Vic3RpdHV0ZWQuCisJCQkgKgorCQkJICogV29yZCBpcyBzdWJqZWN0ZWQgdG8gdGlsZGUgZXhwYW5zaW9uLCBwYXJhbWV0ZXIgZXhwYW5zaW9uLAorCQkJICogY29tbWFuZCBzdWJzdGl0dXRpb24sIGFuZCBhcml0aG1ldGljIGV4cGFuc2lvbi4KKwkJCSAqIElmIHdvcmQgaXMgbm90IG5lZWRlZCwgaXQgaXMgbm90IGV4cGFuZGVkLgorCQkJICoKKwkJCSAqIENvbG9uIGZvcm1zICgke3Zhcjotd29yZH0sICR7dmFyOj13b3JkfSBldGMpIGRvIHRoZSBzYW1lLAorCQkJICogYnV0IGFsc28gdHJlYXQgbnVsbCB2YXIgYXMgaWYgaXQgaXMgdW5zZXQuCisJCQkgKi8KKwkJCWludCB1c2Vfd29yZCA9ICghdmFsIHx8ICgoZXhwX3NhdmUgPT0gJzonKSAmJiAhdmFsWzBdKSk7CisJCQlpZiAoZXhwX29wID09ICcrJykKKwkJCQl1c2Vfd29yZCA9ICF1c2Vfd29yZDsKKwkJCWRlYnVnX3ByaW50Zl9leHBhbmQoImV4cGFuZDogb3A6JWMgKG51bGw6JXMpIHRlc3Q6JWlcbiIsIGV4cF9vcCwKKwkJCQkJKGV4cF9zYXZlID09ICc6JykgPyAidHJ1ZSIgOiAiZmFsc2UiLCB1c2Vfd29yZCk7CisJCQlpZiAodXNlX3dvcmQpIHsKKwkJCQl0b19iZV9mcmVlZCA9IGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoZXhwX3dvcmQsIC8qcHJvY2Vzc19ia3NsYXNoOiovIDEsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQkJaWYgKHRvX2JlX2ZyZWVkKQorCQkJCQlleHBfd29yZCA9IHRvX2JlX2ZyZWVkOworCQkJCWlmIChleHBfb3AgPT0gJz8nKSB7CisJCQkJCS8qIG1pbWljIGJhc2ggbWVzc2FnZSAqLworCQkJCQlkaWVfaWZfc2NyaXB0KCIlczogJXMiLAorCQkJCQkJdmFyLAorCQkJCQkJZXhwX3dvcmRbMF0gPyBleHBfd29yZCA6ICJwYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0IgorCQkJCQkpOworLy9UT0RPOiBob3cgaW50ZXJhY3RpdmUgYmFzaCBhYm9ydHMgZXhwYW5zaW9uIG1pZC1jb21tYW5kPworCQkJCX0gZWxzZSB7CisJCQkJCXZhbCA9IGV4cF93b3JkOworCQkJCX0KKworCQkJCWlmIChleHBfb3AgPT0gJz0nKSB7CisJCQkJCS8qICR7dmFyPVt3b3JkXX0gb3IgJHt2YXI6PVt3b3JkXX0gKi8KKwkJCQkJaWYgKGlzZGlnaXQodmFyWzBdKSB8fCB2YXJbMF0gPT0gJyMnKSB7CisJCQkJCQkvKiBtaW1pYyBiYXNoIG1lc3NhZ2UgKi8KKwkJCQkJCWRpZV9pZl9zY3JpcHQoIiQlczogY2Fubm90IGFzc2lnbiBpbiB0aGlzIHdheSIsIHZhcik7CisJCQkJCQl2YWwgPSBOVUxMOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2hhciAqbmV3X3ZhciA9IHhhc3ByaW50ZigiJXM9JXMiLCB2YXIsIHZhbCk7CisJCQkJCQlzZXRfbG9jYWxfdmFyKG5ld192YXIsIC8qZXhwOiovIDAsIC8qbHZsOiovIDAsIC8qcm86Ki8gMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gLyogb25lIG9mICItPSs/IiAqLworCisJCSpleHBfc2F2ZXB0ciA9IGV4cF9zYXZlOworCX0gLyogaWYgKGV4cF9vcCkgKi8KKworCWFyZ1swXSA9IGFyZzA7CisKKwkqcHAgPSBwOworCSp0b19iZV9mcmVlZF9wcCA9IHRvX2JlX2ZyZWVkOworCXJldHVybiB2YWw7Cit9CisKKy8qIEV4cGFuZCBhbGwgdmFyaWFibGUgcmVmZXJlbmNlcyBpbiBnaXZlbiBzdHJpbmcsIGFkZGluZyB3b3JkcyB0byBsaXN0W10KKyAqIGF0IG4sIG4rMSwuLi4gcG9zaXRpb25zLiBSZXR1cm4gdXBkYXRlZCBuIChzbyB0aGF0IGxpc3Rbbl0gaXMgbmV4dCBvbmUKKyAqIHRvIGJlIGZpbGxlZCkuIFRoaXMgcm91dGluZSBpcyBleHRyZW1lbHkgdHJpY2t5OiBoYXMgdG8gZGVhbCB3aXRoCisgKiB2YXJpYWJsZXMvcGFyYW1ldGVycyB3aXRoIHdoaXRlc3BhY2UsICQqIGFuZCAkQCwgYW5kIGNvbnN0cnVjdHMgbGlrZQorICogJ2VjaG8gLSQqLScuIElmIHlvdSBwbGF5IGhlcmUsIHlvdSBtdXN0IHJ1biB0ZXN0c3VpdGUgYWZ0ZXJ3YXJkcyEgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgZXhwYW5kX3ZhcnNfdG9fbGlzdChvX3N0cmluZyAqb3V0cHV0LCBpbnQgbiwgY2hhciAqYXJnKQoreworCS8qIG91dHB1dC0+b19leHBmbGFncyAmIEVYUF9GTEFHX1NJTkdMRVdPUkQgKDB4ODApIGlmIHdlIGFyZSBpbgorCSAqIGV4cGFuc2lvbiBvZiByaWdodC1oYW5kIHNpZGUgb2YgYXNzaWdubWVudCA9PSAxLWVsZW1lbnQgZXhwYW5kLgorCSAqLworCWNoYXIgY2FudF9iZV9udWxsID0gMDsgLyogb25seSBiaXQgMHg4MCBtYXR0ZXJzICovCisJaW50IGVuZGVkX2luX2lmcyA9IDA7ICAvKiBkaWQgbGFzdCB1bnF1b3RlZCBleHBhbnNpb24gZW5kIHdpdGggSUZTIGNoYXJzPyAqLworCWNoYXIgKnA7CisKKwlkZWJ1Z19wcmludGZfZXhwYW5kKCJleHBhbmRfdmFyc190b19saXN0OiBhcmc6JyVzJyBzaW5nbGV3b3JkOiV4XG4iLCBhcmcsCisJCQkhIShvdXRwdXQtPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19TSU5HTEVXT1JEKSk7CisJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcnNfdG9fbGlzdCIsIG91dHB1dCwgbik7CisJbiA9IG9fc2F2ZV9wdHIob3V0cHV0LCBuKTsKKwlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyc190b19saXN0WzBdIiwgb3V0cHV0LCBuKTsKKworCXdoaWxlICgocCA9IHN0cmNocihhcmcsIFNQRUNJQUxfVkFSX1NZTUJPTCkpICE9IE5VTEwpIHsKKwkJY2hhciBmaXJzdF9jaDsKKwkJY2hhciAqdG9fYmVfZnJlZWQgPSBOVUxMOworCQljb25zdCBjaGFyICp2YWwgPSBOVUxMOworI2lmIEVOQUJMRV9IVVNIX1RJQ0sKKwkJb19zdHJpbmcgc3Vic3RfcmVzdWx0ID0gTlVMTF9PX1NUUklORzsKKyNlbmRpZgorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJY2hhciBhcml0aF9idWZbc2l6ZW9mKGFyaXRoX3QpKjMgKyAyXTsKKyNlbmRpZgorCisJCWlmIChlbmRlZF9pbl9pZnMpIHsKKwkJCW9fYWRkY2hyKG91dHB1dCwgJ1wwJyk7CisJCQluID0gb19zYXZlX3B0cihvdXRwdXQsIG4pOworCQkJZW5kZWRfaW5faWZzID0gMDsKKwkJfQorCisJCW9fYWRkYmxvY2sob3V0cHV0LCBhcmcsIHAgLSBhcmcpOworCQlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyc190b19saXN0WzFdIiwgb3V0cHV0LCBuKTsKKwkJYXJnID0gKytwOworCQlwID0gc3RyY2hyKHAsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisKKwkJLyogRmV0Y2ggc3BlY2lhbCB2YXIgbmFtZSAoaWYgaXQgaXMgaW5kZWVkIG9uZSBvZiB0aGVtKQorCQkgKiBhbmQgcXVvdGUgYml0LCBmb3JjZSB0aGUgYml0IG9uIGlmIHNpbmdsZXdvcmQgZXhwYW5zaW9uIC0KKwkJICogaW1wb3J0YW50IGZvciBub3QgZ2V0dGluZyB2PSRAIGV4cGFuZCB0byBtYW55IHdvcmRzLiAqLworCQlmaXJzdF9jaCA9IGFyZ1swXSB8IChvdXRwdXQtPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19TSU5HTEVXT1JEKTsKKworCQkvKiBJcyB0aGlzIHZhcmlhYmxlIHF1b3RlZCBhbmQgdGh1cyBleHBhbnNpb24gY2FuJ3QgYmUgbnVsbD8KKwkJICogIiRAIiBpcyBzcGVjaWFsLiBFdmVuIGlmIHF1b3RlZCwgaXQgY2FuIHN0aWxsCisJCSAqIGV4cGFuZCB0byBub3RoaW5nIChub3QgZXZlbiBhbiBlbXB0eSBzdHJpbmcpLAorCQkgKiB0aHVzIGl0IGlzIGV4Y2x1ZGVkLiAqLworCQlpZiAoKGZpcnN0X2NoICYgMHg3ZikgIT0gJ0AnKQorCQkJY2FudF9iZV9udWxsIHw9IGZpcnN0X2NoOworCisJCXN3aXRjaCAoZmlyc3RfY2ggJiAweDdmKSB7CisJCS8qIEhpZ2hlc3QgYml0IGluIGZpcnN0X2NoIGluZGljYXRlcyB0aGF0IHZhciBpcyBkb3VibGUtcXVvdGVkICovCisJCWNhc2UgJyonOgorCQljYXNlICdAJzogeworCQkJaW50IGk7CisJCQlpZiAoIUcuZ2xvYmFsX2FyZ3ZbMV0pCisJCQkJYnJlYWs7CisJCQlpID0gMTsKKwkJCWNhbnRfYmVfbnVsbCB8PSBmaXJzdF9jaDsgLyogZG8gaXQgZm9yICIkQCIgX25vd18sIHdoZW4gd2Uga25vdyBpdCdzIG5vdCBlbXB0eSAqLworCQkJaWYgKCEoZmlyc3RfY2ggJiAweDgwKSkgeyAvKiB1bnF1b3RlZCAkKiBvciAkQCAqLworCQkJCXdoaWxlIChHLmdsb2JhbF9hcmd2W2ldKSB7CisJCQkJCW4gPSBleHBhbmRfb25faWZzKE5VTEwsIG91dHB1dCwgbiwgRy5nbG9iYWxfYXJndltpXSk7CisJCQkJCWRlYnVnX3ByaW50Zl9leHBhbmQoImV4cGFuZF92YXJzX3RvX2xpc3Q6IGFyZ3YgJWQgKGxhc3QgJWQpXG4iLCBpLCBHLmdsb2JhbF9hcmdjIC0gMSk7CisJCQkJCWlmIChHLmdsb2JhbF9hcmd2W2krK11bMF0gJiYgRy5nbG9iYWxfYXJndltpXSkgeworCQkJCQkJLyogdGhpcyBhcmd2W10gaXMgbm90IGVtcHR5IGFuZCBub3QgbGFzdDoKKwkJCQkJCSAqIHB1dCB0ZXJtaW5hdGluZyBOVUwsIHN0YXJ0IG5ldyB3b3JkICovCisJCQkJCQlvX2FkZGNocihvdXRwdXQsICdcMCcpOworCQkJCQkJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcnNfdG9fbGlzdFsyXSIsIG91dHB1dCwgbik7CisJCQkJCQluID0gb19zYXZlX3B0cihvdXRwdXQsIG4pOworCQkJCQkJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcnNfdG9fbGlzdFszXSIsIG91dHB1dCwgbik7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UKKwkJCS8qIElmIEVYUF9GTEFHX1NJTkdMRVdPUkQsIHdlIGhhbmRsZSBhc3NpZ25tZW50ICdhPS4uLi4kQC4uLi4uJworCQkJICogYW5kIGluIHRoaXMgY2FzZSBzaG91bGQgdHJlYXQgaXQgbGlrZSAnJConIC0gc2VlICdlbHNlLi4uJyBiZWxvdyAqLworCQkJaWYgKGZpcnN0X2NoID09ICgnQCd8MHg4MCkgIC8qIHF1b3RlZCAkQCAqLworCQkJICYmICEob3V0cHV0LT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfU0lOR0xFV09SRCkgLyogbm90IHY9IiRAIiBjYXNlICovCisJCQkpIHsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQlvX2FkZFFzdHIob3V0cHV0LCBHLmdsb2JhbF9hcmd2W2ldKTsKKwkJCQkJaWYgKCsraSA+PSBHLmdsb2JhbF9hcmdjKQorCQkJCQkJYnJlYWs7CisJCQkJCW9fYWRkY2hyKG91dHB1dCwgJ1wwJyk7CisJCQkJCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbNF0iLCBvdXRwdXQsIG4pOworCQkJCQluID0gb19zYXZlX3B0cihvdXRwdXQsIG4pOworCQkJCX0KKwkJCX0gZWxzZSB7IC8qIHF1b3RlZCAkKiAob3Igdj0iJEAiIGNhc2UpOiBhZGQgYXMgb25lIHdvcmQgKi8KKwkJCQl3aGlsZSAoMSkgeworCQkJCQlvX2FkZFFzdHIob3V0cHV0LCBHLmdsb2JhbF9hcmd2W2ldKTsKKwkJCQkJaWYgKCFHLmdsb2JhbF9hcmd2WysraV0pCisJCQkJCQlicmVhazsKKwkJCQkJaWYgKEcuaWZzWzBdKQorCQkJCQkJb19hZGRjaHIob3V0cHV0LCBHLmlmc1swXSk7CisJCQkJfQorCQkJCW91dHB1dC0+aGFzX3F1b3RlZF9wYXJ0ID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1BFQ0lBTF9WQVJfU1lNQk9MOiAvKiA8U1BFQ0lBTF9WQVJfU1lNQk9MPjxTUEVDSUFMX1ZBUl9TWU1CT0w+ICovCisJCQkvKiAiRW1wdHkgdmFyaWFibGUiLCB1c2VkIHRvIG1ha2UgIiIgZXRjIHRvIG5vdCBkaXNhcHBlYXIgKi8KKwkJCW91dHB1dC0+aGFzX3F1b3RlZF9wYXJ0ID0gMTsKKwkJCWFyZysrOworCQkJY2FudF9iZV9udWxsID0gMHg4MDsKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9IVVNIX1RJQ0sKKwkJY2FzZSAnYCc6IC8qIDxTUEVDSUFMX1ZBUl9TWU1CT0w+YGNtZDxTUEVDSUFMX1ZBUl9TWU1CT0w+ICovCisJCQkqcCA9ICdcMCc7IC8qIHJlcGxhY2UgdHJhaWxpbmcgPFNQRUNJQUxfVkFSX1NZTUJPTD4gKi8KKwkJCWFyZysrOworCQkJLyogQ2FuJ3QganVzdCBzdHVmZiBpdCBpbnRvIG91dHB1dCBvX3N0cmluZywKKwkJCSAqIGV4cGFuZGVkIHJlc3VsdCBtYXkgbmVlZCB0byBiZSBnbG9iYmVkCisJCQkgKiBhbmQgJElGUy1zcGxpdHRlZCAqLworCQkJZGVidWdfcHJpbnRmX3N1YnN0KCJTVUJTVCAnJXMnIGZpcnN0X2NoICV4XG4iLCBhcmcsIGZpcnN0X2NoKTsKKwkJCUcubGFzdF9leGl0Y29kZSA9IHByb2Nlc3NfY29tbWFuZF9zdWJzKCZzdWJzdF9yZXN1bHQsIGFyZyk7CisJCQlkZWJ1Z19wcmludGZfc3Vic3QoIlNVQlNUIFJFUzolZCAnJXMnXG4iLCBHLmxhc3RfZXhpdGNvZGUsIHN1YnN0X3Jlc3VsdC5kYXRhKTsKKwkJCXZhbCA9IHN1YnN0X3Jlc3VsdC5kYXRhOworCQkJZ290byBzdG9yZV92YWw7CisjZW5kaWYKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJCWNhc2UgJysnOiB7IC8qIDxTUEVDSUFMX1ZBUl9TWU1CT0w+K2NtZDxTUEVDSUFMX1ZBUl9TWU1CT0w+ICovCisJCQlhcml0aF90IHJlczsKKworCQkJYXJnKys7IC8qIHNraXAgJysnICovCisJCQkqcCA9ICdcMCc7IC8qIHJlcGxhY2UgdHJhaWxpbmcgPFNQRUNJQUxfVkFSX1NZTUJPTD4gKi8KKwkJCWRlYnVnX3ByaW50Zl9zdWJzdCgiQVJJVEggJyVzJyBmaXJzdF9jaCAleFxuIiwgYXJnLCBmaXJzdF9jaCk7CisJCQlyZXMgPSBleHBhbmRfYW5kX2V2YWx1YXRlX2FyaXRoKGFyZywgTlVMTCk7CisJCQlkZWJ1Z19wcmludGZfc3Vic3QoIkFSSVRIIFJFUyAnIkFSSVRIX0ZNVCInXG4iLCByZXMpOworCQkJc3ByaW50Zihhcml0aF9idWYsIEFSSVRIX0ZNVCwgcmVzKTsKKwkJCXZhbCA9IGFyaXRoX2J1ZjsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXZhbCA9IGV4cGFuZF9vbmVfdmFyKCZ0b19iZV9mcmVlZCwgYXJnLCAmcCk7CisgSUZfSFVTSF9USUNLKHN0b3JlX3ZhbDopCisJCQlpZiAoIShmaXJzdF9jaCAmIDB4ODApKSB7IC8qIHVucXVvdGVkICRWQVIgKi8KKwkJCQlkZWJ1Z19wcmludGZfZXhwYW5kKCJ1bnF1b3RlZCAnJXMnLCBvdXRwdXQtPm9fZXNjYXBlOiVkXG4iLCB2YWwsCisJCQkJCQkhIShvdXRwdXQtPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUykpOworCQkJCWlmICh2YWwgJiYgdmFsWzBdKSB7CisJCQkJCW4gPSBleHBhbmRfb25faWZzKCZlbmRlZF9pbl9pZnMsIG91dHB1dCwgbiwgdmFsKTsKKwkJCQkJdmFsID0gTlVMTDsKKwkJCQl9CisJCQl9IGVsc2UgeyAvKiBxdW90ZWQgJFZBUiwgdmFsIHdpbGwgYmUgYXBwZW5kZWQgYmVsb3cgKi8KKwkJCQlvdXRwdXQtPmhhc19xdW90ZWRfcGFydCA9IDE7CisJCQkJZGVidWdfcHJpbnRmX2V4cGFuZCgicXVvdGVkICclcycsIG91dHB1dC0+b19lc2NhcGU6JWRcbiIsIHZhbCwKKwkJCQkJCSEhKG91dHB1dC0+b19leHBmbGFncyAmIEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTKSk7CisJCQl9CisJCQlicmVhazsKKworCQl9IC8qIHN3aXRjaCAoY2hhciBhZnRlciA8U1BFQ0lBTF9WQVJfU1lNQk9MPikgKi8KKworCQlpZiAodmFsICYmIHZhbFswXSkgeworCQkJb19hZGRRc3RyKG91dHB1dCwgdmFsKTsKKwkJfQorCQlmcmVlKHRvX2JlX2ZyZWVkKTsKKworCQkvKiBSZXN0b3JlIE5VTEwnZWQgU1BFQ0lBTF9WQVJfU1lNQk9MLgorCQkgKiBEbyB0aGUgY2hlY2sgdG8gYXZvaWQgd3JpdGluZyB0byBhIGNvbnN0IHN0cmluZy4gKi8KKwkJaWYgKCpwICE9IFNQRUNJQUxfVkFSX1NZTUJPTCkKKwkJCSpwID0gU1BFQ0lBTF9WQVJfU1lNQk9MOworCisjaWYgRU5BQkxFX0hVU0hfVElDSworCQlvX2ZyZWUoJnN1YnN0X3Jlc3VsdCk7CisjZW5kaWYKKwkJYXJnID0gKytwOworCX0gLyogZW5kIG9mICJ3aGlsZSAoU1BFQ0lBTF9WQVJfU1lNQk9MIGlzIGZvdW5kKSAuLi4iICovCisKKwlpZiAoYXJnWzBdKSB7CisJCWlmIChlbmRlZF9pbl9pZnMpIHsKKwkJCW9fYWRkY2hyKG91dHB1dCwgJ1wwJyk7CisJCQluID0gb19zYXZlX3B0cihvdXRwdXQsIG4pOworCQl9CisJCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbYV0iLCBvdXRwdXQsIG4pOworCQkvKiB0aGlzIHBhcnQgaXMgbGl0ZXJhbCwgYW5kIGl0IHdhcyBhbHJlYWR5IHByZS1xdW90ZWQKKwkJICogaWYgbmVlZGVkIChtdWNoIGVhcmxpZXIpLCBkbyBub3QgdXNlIG9fYWRkUXN0ciBoZXJlISAqLworCQlvX2FkZHN0cl93aXRoX05VTChvdXRwdXQsIGFyZyk7CisJCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbYl0iLCBvdXRwdXQsIG4pOworCX0gZWxzZSBpZiAob3V0cHV0LT5sZW5ndGggPT0gb19nZXRfbGFzdF9wdHIob3V0cHV0LCBuKSAvKiBleHBhbnNpb24gaXMgZW1wdHkgKi8KKwkgJiYgIShjYW50X2JlX251bGwgJiAweDgwKSAvKiBhbmQgYWxsIHZhcnMgd2VyZSBub3QgcXVvdGVkLiAqLworCSkgeworCQluLS07CisJCS8qIGFsbG93IHRvIHJldXNlIGxpc3Rbbl0gbGF0ZXIgd2l0aG91dCByZS1ncm93dGggKi8KKwkJb3V0cHV0LT5oYXNfZW1wdHlfc2xvdCA9IDE7CisJfSBlbHNlIHsKKwkJb19hZGRjaHIob3V0cHV0LCAnXDAnKTsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGNoYXIgKipleHBhbmRfdmFyaWFibGVzKGNoYXIgKiphcmd2LCB1bnNpZ25lZCBleHBmbGFncykKK3sKKwlpbnQgbjsKKwljaGFyICoqbGlzdDsKKwlvX3N0cmluZyBvdXRwdXQgPSBOVUxMX09fU1RSSU5HOworCisJb3V0cHV0Lm9fZXhwZmxhZ3MgPSBleHBmbGFnczsKKworCW4gPSAwOworCXdoaWxlICgqYXJndikgeworCQluID0gZXhwYW5kX3ZhcnNfdG9fbGlzdCgmb3V0cHV0LCBuLCAqYXJndik7CisJCWFyZ3YrKzsKKwl9CisJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcmlhYmxlcyIsICZvdXRwdXQsIG4pOworCisJLyogb3V0cHV0LmRhdGEgKG1hbGxvY2VkIGluIG9uZSBibG9jaykgZ2V0cyByZXR1cm5lZCBpbiAibGlzdCIgKi8KKwlsaXN0ID0gb19maW5hbGl6ZV9saXN0KCZvdXRwdXQsIG4pOworCWRlYnVnX3ByaW50X3N0cmluZ3MoImV4cGFuZF92YXJpYWJsZXNbMV0iLCBsaXN0KTsKKwlyZXR1cm4gbGlzdDsKK30KKworc3RhdGljIGNoYXIgKipleHBhbmRfc3RydmVjX3RvX3N0cnZlYyhjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gZXhwYW5kX3ZhcmlhYmxlcyhhcmd2LCBFWFBfRkxBR19HTE9CIHwgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpOworfQorCisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKK3N0YXRpYyBjaGFyICoqZXhwYW5kX3N0cnZlY190b19zdHJ2ZWNfc2luZ2xld29yZF9ub2dsb2IoY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGV4cGFuZF92YXJpYWJsZXMoYXJndiwgRVhQX0ZMQUdfU0lOR0xFV09SRCk7Cit9CisjZW5kaWYKKworLyogVXNlZCBmb3IgZXhwYW5zaW9uIG9mIHJpZ2h0IGhhbmQgb2YgYXNzaWdubWVudHMsCisgKiAkKCguLi4pKSwgaGVyZWRvY3MsIHZhcmlhYmxlIGVzcGFuc2lvbiBwYXJ0cy4KKyAqCisgKiBOQjogc2hvdWxkIE5PVCBkbyBnbG9iYmluZyEKKyAqICJleHBvcnQgdj0vYmluL2MqOyBlbnYgfCBncmVwIF52PSIgb3V0cHV0cyAidj0vYmluL2MqIgorICovCitzdGF0aWMgY2hhciAqZXhwYW5kX3N0cmluZ190b19zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgZG9fdW5iYWNrc2xhc2gpCit7CisjaWYgIUVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJY29uc3QgaW50IGRvX3VuYmFja3NsYXNoID0gMTsKKyNlbmRpZgorCWNoYXIgKmFyZ3ZbMl0sICoqbGlzdDsKKworCWRlYnVnX3ByaW50Zl9leHBhbmQoInN0cmluZ190b19zdHJpbmc8PSclcydcbiIsIHN0cik7CisJLyogVGhpcyBpcyBnZW5lcmFsbHkgYW4gb3B0aW1pemF0aW9uLCBidXQgaXQgYWxzbworCSAqIGhhbmRsZXMgIiIsIHdoaWNoIG90aGVyd2lzZSB0cmlwcyBvdmVyICFsaXN0WzBdIGNoZWNrIGJlbG93LgorCSAqIChpcyB0aGlzIGV2ZXIgaGFwcGVucyB0aGF0IHdlIGFjdHVhbGx5IGdldCBzdHI9IiIgaGVyZT8pCisJICovCisJaWYgKCFzdHJjaHIoc3RyLCBTUEVDSUFMX1ZBUl9TWU1CT0wpICYmICFzdHJjaHIoc3RyLCAnXFwnKSkgeworCQkvL1RPRE86IENhbiB1c2Ugb24gc3RyaW5ncyB3aXRoIFwgdG9vLCBqdXN0IHVuYmFja3NsYXNoKCkgdGhlbT8KKwkJZGVidWdfcHJpbnRmX2V4cGFuZCgic3RyaW5nX3RvX3N0cmluZyhmYXN0KT0+JyVzJ1xuIiwgc3RyKTsKKwkJcmV0dXJuIHhzdHJkdXAoc3RyKTsKKwl9CisKKwlhcmd2WzBdID0gKGNoYXIqKXN0cjsKKwlhcmd2WzFdID0gTlVMTDsKKwlsaXN0ID0gZXhwYW5kX3ZhcmlhYmxlcyhhcmd2LCBkb191bmJhY2tzbGFzaAorCQkJPyBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUyB8IEVYUF9GTEFHX1NJTkdMRVdPUkQKKwkJCTogRVhQX0ZMQUdfU0lOR0xFV09SRAorCSk7CisJaWYgKEhVU0hfREVCVUcpCisJCWlmICghbGlzdFswXSB8fCBsaXN0WzFdKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkJVRyBpbiB2YXJleHAyIik7CisJLyogYWN0dWFsbHksIGp1c3QgbW92ZSBzdHJpbmcgMipzaXplb2YoY2hhciopIGJ5dGVzIGJhY2sgKi8KKwlvdmVybGFwcGluZ19zdHJjcHkoKGNoYXIqKWxpc3QsIGxpc3RbMF0pOworCWlmIChkb191bmJhY2tzbGFzaCkKKwkJdW5iYWNrc2xhc2goKGNoYXIqKWxpc3QpOworCWRlYnVnX3ByaW50Zl9leHBhbmQoInN0cmluZ190b19zdHJpbmc9PiclcydcbiIsIChjaGFyKilsaXN0KTsKKwlyZXR1cm4gKGNoYXIqKWxpc3Q7Cit9CisKKy8qIFVzZWQgZm9yICJldmFsIiBidWlsdGluICovCitzdGF0aWMgY2hhciogZXhwYW5kX3N0cnZlY190b19zdHJpbmcoY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKmxpc3Q7CisKKwlsaXN0ID0gZXhwYW5kX3ZhcmlhYmxlcyhhcmd2LCBFWFBfRkxBR19TSU5HTEVXT1JEKTsKKwkvKiBDb252ZXJ0IGFsbCBOVUxzIHRvIHNwYWNlcyAqLworCWlmIChsaXN0WzBdKSB7CisJCWludCBuID0gMTsKKwkJd2hpbGUgKGxpc3Rbbl0pIHsKKwkJCWlmIChIVVNIX0RFQlVHKQorCQkJCWlmIChsaXN0W24tMV0gKyBzdHJsZW4obGlzdFtuLTFdKSArIDEgIT0gbGlzdFtuXSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkJVRyBpbiB2YXJleHAzIik7CisJCQkvKiBiYXNoIHVzZXMgJyAnIHJlZ2FyZGxlc3Mgb2YgJElGUyBjb250ZW50cyAqLworCQkJbGlzdFtuXVstMV0gPSAnICc7CisJCQluKys7CisJCX0KKwl9CisJb3ZlcmxhcHBpbmdfc3RyY3B5KChjaGFyKilsaXN0LCBsaXN0WzBdKTsKKwlkZWJ1Z19wcmludGZfZXhwYW5kKCJzdHJ2ZWNfdG9fc3RyaW5nPSclcydcbiIsIChjaGFyKilsaXN0KTsKKwlyZXR1cm4gKGNoYXIqKWxpc3Q7Cit9CisKK3N0YXRpYyBjaGFyICoqZXhwYW5kX2Fzc2lnbm1lbnRzKGNoYXIgKiphcmd2LCBpbnQgY291bnQpCit7CisJaW50IGk7CisJY2hhciAqKnA7CisKKwlHLmV4cGFuZGVkX2Fzc2lnbm1lbnRzID0gcCA9IE5VTEw7CisJLyogRXhwYW5kIGFzc2lnbm1lbnRzIGludG8gb25lIHN0cmluZyBlYWNoICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJRy5leHBhbmRlZF9hc3NpZ25tZW50cyA9IHAgPSBhZGRfc3RyaW5nX3RvX3N0cmluZ3MocCwgZXhwYW5kX3N0cmluZ190b19zdHJpbmcoYXJndltpXSwgLyp1bmJhY2tzbGFzaDoqLyAxKSk7CisJfQorCUcuZXhwYW5kZWRfYXNzaWdubWVudHMgPSBOVUxMOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyB2b2lkIHN3aXRjaF9vZmZfc3BlY2lhbF9zaWdzKHVuc2lnbmVkIG1hc2spCit7CisJdW5zaWduZWQgc2lnID0gMDsKKwl3aGlsZSAoKG1hc2sgPj49IDEpICE9IDApIHsKKwkJc2lnKys7CisJCWlmICghKG1hc2sgJiAxKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoRy50cmFwcykgeworCQkJaWYgKEcudHJhcHNbc2lnXSAmJiAhRy50cmFwc1tzaWddWzBdKQorCQkJCS8qIHRyYXAgaXMgJycsIGhhcyB0byByZW1haW4gU0lHX0lHTiAqLworCQkJCWNvbnRpbnVlOworCQkJZnJlZShHLnRyYXBzW3NpZ10pOworCQkJRy50cmFwc1tzaWddID0gTlVMTDsKKwkJfQorCQkvKiBXZSBhcmUgaGVyZSBvbmx5IGlmIG5vIHRyYXAgb3IgdHJhcCB3YXMgbm90ICcnICovCisJCWluc3RhbGxfc2lnaGFuZGxlcihzaWcsIFNJR19ERkwpOworCX0KK30KKworI2lmIEJCX01NVQorLyogbmV2ZXIgY2FsbGVkICovCit2b2lkIHJlX2V4ZWN1dGVfc2hlbGwoY2hhciAqKip0b19mcmVlLCBjb25zdCBjaGFyICpzLAorCQljaGFyICpnX2FyZ3YwLCBjaGFyICoqZ19hcmd2LAorCQljaGFyICoqYnVpbHRpbl9hcmd2KSBOT1JFVFVSTjsKKworc3RhdGljIHZvaWQgcmVzZXRfdHJhcHNfdG9fZGVmYXVsdHModm9pZCkKK3sKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgaW4gYSBjaGlsZCBzaGVsbAorCSAqIGFmdGVyIGZvcmsgKG5vdCB2Zm9yaywgTk9NTVUgZG9lc24ndCB1c2UgdGhpcyBmdW5jdGlvbikuCisJICovCisJdW5zaWduZWQgc2lnOworCXVuc2lnbmVkIG1hc2s7CisKKwkvKiBDaGlsZCBzaGVsbHMgYXJlIG5vdCBpbnRlcmFjdGl2ZS4KKwkgKiBTSUdUVElOL1NJR1RUT1UvU0lHVFNUUCBzaG91bGQgbm90IGhhdmUgc3BlY2lhbCBoYW5kbGluZy4KKwkgKiBUZXN0Y2FzZTogKHdoaWxlIDo7IGRvIDo7IGRvbmUpICsgXlogc2hvdWxkIGJhY2tncm91bmQuCisJICogU2FtZSBnb2VzIGZvciBTSUdURVJNLCBTSUdIVVAsIFNJR0lOVC4KKwkgKi8KKwltYXNrID0gKEcuc3BlY2lhbF9zaWdfbWFzayAmIFNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUykgfCBHX2ZhdGFsX3NpZ19tYXNrOworCWlmICghRy50cmFwcyAmJiAhbWFzaykKKwkJcmV0dXJuOyAvKiBhbHJlYWR5IG5vIHRyYXBzIGFuZCBubyBzcGVjaWFsIHNpZ3MgKi8KKworCS8qIFN3aXRjaCBvZmYgc3BlY2lhbCBzaWdzICovCisJc3dpdGNoX29mZl9zcGVjaWFsX3NpZ3MobWFzayk7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJR19mYXRhbF9zaWdfbWFzayA9IDA7CisjZW5kaWYKKwlHLnNwZWNpYWxfc2lnX21hc2sgJj0gflNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUzsKKwkvKiBTSUdRVUlULFNJR0NITEQgYW5kIG1heWJlIFNQRUNJQUxfSk9CU1RPUF9TSUdTCisJICogcmVtYWluIHNldCBpbiBHLnNwZWNpYWxfc2lnX21hc2sgKi8KKworCWlmICghRy50cmFwcykKKwkJcmV0dXJuOworCisJLyogUmVzZXQgYWxsIHNpZ3MgdG8gZGVmYXVsdCBleGNlcHQgb25lcyB3aXRoIGVtcHR5IHRyYXBzICovCisJZm9yIChzaWcgPSAwOyBzaWcgPCBOU0lHOyBzaWcrKykgeworCQlpZiAoIUcudHJhcHNbc2lnXSkKKwkJCWNvbnRpbnVlOyAvKiBubyB0cmFwOiBub3RoaW5nIHRvIGRvICovCisJCWlmICghRy50cmFwc1tzaWddWzBdKQorCQkJY29udGludWU7IC8qIGVtcHR5IHRyYXA6IGhhcyB0byByZW1haW4gU0lHX0lHTiAqLworCQkvKiBzaWcgaGFzIG5vbi1lbXB0eSB0cmFwLCByZXNldCBpdDogKi8KKwkJZnJlZShHLnRyYXBzW3NpZ10pOworCQlHLnRyYXBzW3NpZ10gPSBOVUxMOworCQkvKiBUaGVyZSBpcyBubyBzaWduYWwgZm9yIHRyYXAgMCAoRVhJVCkgKi8KKwkJaWYgKHNpZyA9PSAwKQorCQkJY29udGludWU7CisJCWluc3RhbGxfc2lnaGFuZGxlcihzaWcsIHBpY2tfc2lnaGFuZGxlcihzaWcpKTsKKwl9Cit9CisKKyNlbHNlIC8qICFCQl9NTVUgKi8KKworc3RhdGljIHZvaWQgcmVfZXhlY3V0ZV9zaGVsbChjaGFyICoqKnRvX2ZyZWUsIGNvbnN0IGNoYXIgKnMsCisJCWNoYXIgKmdfYXJndjAsIGNoYXIgKipnX2FyZ3YsCisJCWNoYXIgKipidWlsdGluX2FyZ3YpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgcmVfZXhlY3V0ZV9zaGVsbChjaGFyICoqKnRvX2ZyZWUsIGNvbnN0IGNoYXIgKnMsCisJCWNoYXIgKmdfYXJndjAsIGNoYXIgKipnX2FyZ3YsCisJCWNoYXIgKipidWlsdGluX2FyZ3YpCit7CisjIGRlZmluZSBOT01NVV9IQUNLX0ZNVCAoIi0kJXg6JXg6JXg6JXg6JXg6JWxseCIgSUZfSFVTSF9MT09QUygiOiV4IikpCisJLyogZGVsaW1zICsgMiAqIChudW1iZXIgb2YgYnl0ZXMgaW4gcHJpbnRlZCBoZXggbnVtYmVycykgKi8KKwljaGFyIHBhcmFtX2J1ZltzaXplb2YoTk9NTVVfSEFDS19GTVQpICsgMiAqIChzaXplb2YoaW50KSo2ICsgc2l6ZW9mKGxvbmcgbG9uZykqMSldOworCWNoYXIgKmhlcmVkb2NfYXJndls0XTsKKwlzdHJ1Y3QgdmFyaWFibGUgKmN1cjsKKyMgaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJc3RydWN0IGZ1bmN0aW9uICpmdW5jcDsKKyMgZW5kaWYKKwljaGFyICoqYXJndiwgKipwcDsKKwl1bnNpZ25lZCBjbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGVtcHR5X3RyYXBfbWFzazsKKworCWlmICghZ19hcmd2MCkgeyAvKiBoZXJlZG9jICovCisJCWFyZ3YgPSBoZXJlZG9jX2FyZ3Y7CisJCWFyZ3ZbMF0gPSAoY2hhciAqKSBHLmFyZ3YwX2Zvcl9yZV9leGVjaW5nOworCQlhcmd2WzFdID0gKGNoYXIgKikgIi08IjsKKwkJYXJndlsyXSA9IChjaGFyICopIHM7CisJCWFyZ3ZbM10gPSBOVUxMOworCQlwcCA9ICZhcmd2WzNdOyAvKiB1c2VkIGFzIHBvaW50ZXIgdG8gZW1wdHkgZW52aXJvbm1lbnQgKi8KKwkJZ290byBkb19leGVjOworCX0KKworCWNudCA9IDA7CisJcHAgPSBidWlsdGluX2FyZ3Y7CisJaWYgKHBwKSB3aGlsZSAoKnBwKyspCisJCWNudCsrOworCisJZW1wdHlfdHJhcF9tYXNrID0gMDsKKwlpZiAoRy50cmFwcykgeworCQlpbnQgc2lnOworCQlmb3IgKHNpZyA9IDE7IHNpZyA8IE5TSUc7IHNpZysrKSB7CisJCQlpZiAoRy50cmFwc1tzaWddICYmICFHLnRyYXBzW3NpZ11bMF0pCisJCQkJZW1wdHlfdHJhcF9tYXNrIHw9IDFMTCA8PCBzaWc7CisJCX0KKwl9CisKKwlzcHJpbnRmKHBhcmFtX2J1ZiwgTk9NTVVfSEFDS19GTVQKKwkJCSwgKHVuc2lnbmVkKSBHLnJvb3RfcGlkCisJCQksICh1bnNpZ25lZCkgRy5yb290X3BwaWQKKwkJCSwgKHVuc2lnbmVkKSBHLmxhc3RfYmdfcGlkCisJCQksICh1bnNpZ25lZCkgRy5sYXN0X2V4aXRjb2RlCisJCQksIGNudAorCQkJLCBlbXB0eV90cmFwX21hc2sKKwkJCUlGX0hVU0hfTE9PUFMoLCBHLmRlcHRoX29mX2xvb3ApCisJCQkpOworIyB1bmRlZiBOT01NVV9IQUNLX0ZNVAorCS8qIDE6aHVzaCAyOi0kPHBpZD46PHBpZD46PGV4aXRjb2RlPjo8ZXRjLi4uPiA8dmFycy4uLj4gPGZ1bmNzLi4uPgorCSAqIDM6LWMgNDo8Y21kPiA1OjxhcmcwPiA8YXJnTi4uLj4gNjpOVUxMCisJICovCisJY250ICs9IDY7CisJZm9yIChjdXIgPSBHLnRvcF92YXI7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJCWlmICghY3VyLT5mbGdfZXhwb3J0IHx8IGN1ci0+ZmxnX3JlYWRfb25seSkKKwkJCWNudCArPSAyOworCX0KKyMgaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJZm9yIChmdW5jcCA9IEcudG9wX2Z1bmM7IGZ1bmNwOyBmdW5jcCA9IGZ1bmNwLT5uZXh0KQorCQljbnQgKz0gMzsKKyMgZW5kaWYKKwlwcCA9IGdfYXJndjsKKwl3aGlsZSAoKnBwKyspCisJCWNudCsrOworCSp0b19mcmVlID0gYXJndiA9IHBwID0geHphbGxvYyhzaXplb2YoYXJndlswXSkgKiBjbnQpOworCSpwcCsrID0gKGNoYXIgKikgRy5hcmd2MF9mb3JfcmVfZXhlY2luZzsKKwkqcHArKyA9IHBhcmFtX2J1ZjsKKwlmb3IgKGN1ciA9IEcudG9wX3ZhcjsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJaWYgKHN0cmNtcChjdXItPnZhcnN0ciwgaHVzaF92ZXJzaW9uX3N0cikgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY3VyLT5mbGdfcmVhZF9vbmx5KSB7CisJCQkqcHArKyA9IChjaGFyICopICItUiI7CisJCQkqcHArKyA9IGN1ci0+dmFyc3RyOworCQl9IGVsc2UgaWYgKCFjdXItPmZsZ19leHBvcnQpIHsKKwkJCSpwcCsrID0gKGNoYXIgKikgIi1WIjsKKwkJCSpwcCsrID0gY3VyLT52YXJzdHI7CisJCX0KKwl9CisjIGlmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCWZvciAoZnVuY3AgPSBHLnRvcF9mdW5jOyBmdW5jcDsgZnVuY3AgPSBmdW5jcC0+bmV4dCkgeworCQkqcHArKyA9IChjaGFyICopICItRiI7CisJCSpwcCsrID0gZnVuY3AtPm5hbWU7CisJCSpwcCsrID0gZnVuY3AtPmJvZHlfYXNfc3RyaW5nOworCX0KKyMgZW5kaWYKKwkvKiBXZSBjYW4gcGFzcyBhY3RpdmF0ZWQgdHJhcHMgaGVyZS4gU2F5LCAtVG5uOnRyYXBfc3RyaW5nCisJICoKKwkgKiBIb3dldmVyLCBQT1NJWCBzYXlzIHRoYXQgc3Vic2hlbGxzIHJlc2V0IHNpZ25hbHMgd2l0aCB0cmFwcworCSAqIHRvIFNJR19ERkwuCisJICogSSB0ZXN0ZWQgYmFzaC0zLjIgYW5kIGl0IG5vdCBvbmx5IGRvZXMgdGhhdCB3aXRoIHRydWUgc3Vic2hlbGxzCisJICogb2YgdGhlIGZvcm0gKCBsaXN0ICksIGJ1dCB3aXRoIGFueSBmb3JrZWQgY2hpbGRyZW4gc2hlbGxzLgorCSAqIEkgc2V0IHRyYXAgImVjaG8gVyIgV0lOQ0g7IGFuZCB0aGVuIHRyaWVkOgorCSAqCisJICogeyBlY2hvIDE7IHNsZWVwIDIwOyBlY2hvIDI7IH0gJgorCSAqIHdoaWxlIHRydWU7IGRvIGVjaG8gMTsgc2xlZXAgMjA7IGVjaG8gMjsgYnJlYWs7IGRvbmUgJgorCSAqIHRydWUgfCB7IGVjaG8gMTsgc2xlZXAgMjA7IGVjaG8gMjsgfSB8IGNhdAorCSAqCisJICogSW4gYWxsIHRoZXNlIGNhc2VzIHNlbmRpbmcgU0lHV0lOQ0ggdG8gdGhlIGNoaWxkIHNoZWxsCisJICogZGlkIG5vdCBydW4gdGhlIHRyYXAuIElmIEkgYWRkIHRyYXAgImVjaG8gViIgV0lOQ0g7CisJICogX2luc2lkZV8gZ3JvdXAgKGp1c3QgYmVmb3JlIGVjaG8gMSksIGl0IHdvcmtzLgorCSAqCisJICogSSBjb25jbHVkZSBpdCBtZWFucyB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgYWN0aXZlIHRyYXBzIGhlcmUuCisJICovCisJKnBwKysgPSAoY2hhciAqKSAiLWMiOworCSpwcCsrID0gKGNoYXIgKikgczsKKwlpZiAoYnVpbHRpbl9hcmd2KSB7CisJCXdoaWxlICgqKytidWlsdGluX2FyZ3YpCisJCQkqcHArKyA9ICpidWlsdGluX2FyZ3Y7CisJCSpwcCsrID0gKGNoYXIgKikgIiI7CisJfQorCSpwcCsrID0gZ19hcmd2MDsKKwl3aGlsZSAoKmdfYXJndikKKwkJKnBwKysgPSAqZ19hcmd2Kys7CisJLyogKnBwID0gTlVMTDsgLSBpcyBhbHJlYWR5IHRoZXJlICovCisJcHAgPSBlbnZpcm9uOworCisgZG9fZXhlYzoKKwlkZWJ1Z19wcmludGZfZXhlYygicmVfZXhlY3V0ZV9zaGVsbCBwaWQ6JWQgY21kOiclcydcbiIsIGdldHBpZCgpLCBzKTsKKwkvKiBEb24ndCBwcm9wYWdhdGUgU0lHX0lHTiB0byB0aGUgY2hpbGQgKi8KKwlpZiAoU1BFQ0lBTF9KT0JTVE9QX1NJR1MgIT0gMCkKKwkJc3dpdGNoX29mZl9zcGVjaWFsX3NpZ3MoRy5zcGVjaWFsX3NpZ19tYXNrICYgU1BFQ0lBTF9KT0JTVE9QX1NJR1MpOworCWV4ZWN2ZShiYl9idXN5Ym94X2V4ZWNfcGF0aCwgYXJndiwgcHApOworCS8qIEZhbGxiYWNrLiBVc2VmdWwgZm9yIGluaXQ9L2Jpbi9odXNoIHVzYWdlIGV0YyAqLworCWlmIChhcmd2WzBdWzBdID09ICcvJykKKwkJZXhlY3ZlKGFyZ3ZbMF0sIGFyZ3YsIHBwKTsKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAxMjc7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlLWV4ZWN1dGUgdGhlIHNoZWxsIik7Cit9CisjZW5kaWYgIC8qICFCQl9NTVUgKi8KKworCitzdGF0aWMgaW50IHJ1bl9hbmRfZnJlZV9saXN0KHN0cnVjdCBwaXBlICpwaSk7CisKKy8qIEV4ZWN1dGluZyBmcm9tIHN0cmluZzogZXZhbCwgc2ggLWMgJy4uLicKKyAqICAgICAgICAgIG9yIGZyb20gZmlsZTogL2V0Yy9wcm9maWxlLCAuIGZpbGUsIHNoIDxzY3JpcHQ+LCBzaCAoaW50ZXJlYWN0aXZlKQorICogZW5kX3RyaWdnZXIgY29udHJvbHMgaG93IG9mdGVuIHdlIHN0b3AgcGFyc2luZworICogTlVMOiBwYXJzZSBhbGwsIGV4ZWN1dGUsIHJldHVybgorICogJzsnOiBwYXJzZSB0aWxsICc7JyBvciBuZXdsaW5lLCBleGVjdXRlLCByZXBlYXQgdGlsbCBFT0YKKyAqLworc3RhdGljIHZvaWQgcGFyc2VfYW5kX3J1bl9zdHJlYW0oc3RydWN0IGluX3N0ciAqaW5wLCBpbnQgZW5kX3RyaWdnZXIpCit7CisJLyogV2h5IHdlIG5lZWQgZW1wdHkgZmxhZz8KKwkgKiBBbiBvYnNjdXJlIGNvcm5lciBjYXNlICJmYWxzZTsgYGA7IGVjaG8gJD8iOgorCSAqIGVtcHR5IGNvbW1hbmQgaW4gYGAgc2hvdWxkIHN0aWxsIHNldCAkPyB0byAwLgorCSAqIEJ1dCB3ZSBjYW4ndCBqdXN0IHNldCAkPyB0byAwIGF0IHRoZSBzdGFydCwKKwkgKiB0aGlzIGJyZWFrcyAiZmFsc2U7IGVjaG8gYGVjaG8gJD9gIiBjYXNlLgorCSAqLworCWJvb2wgZW1wdHkgPSAxOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBwaXBlICpwaXBlX2xpc3Q7CisKKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorCQlpZiAoZW5kX3RyaWdnZXIgPT0gJzsnKQorCQkJaW5wLT5wcm9tcHRtb2RlID0gMDsgLyogUFMxICovCisjZW5kaWYKKwkJcGlwZV9saXN0ID0gcGFyc2Vfc3RyZWFtKE5VTEwsIGlucCwgZW5kX3RyaWdnZXIpOworCQlpZiAoIXBpcGVfbGlzdCB8fCBwaXBlX2xpc3QgPT0gRVJSX1BUUikgeyAvKiBFT0YvZXJyb3IgKi8KKwkJCS8qIElmIHdlIGFyZSBpbiAiYmlnIiBzY3JpcHQKKwkJCSAqIChub3QgaW4gYGNtZGAgb3Igc29tZXRoaW5nIHNpbWlsYXIpLi4uCisJCQkgKi8KKwkJCWlmIChwaXBlX2xpc3QgPT0gRVJSX1BUUiAmJiBlbmRfdHJpZ2dlciA9PSAnOycpIHsKKwkJCQkvKiBEaXNjYXJkIGNhY2hlZCBpbnB1dCAocmVzdCBvZiBsaW5lKSAqLworCQkJCWludCBjaCA9IGlucC0+bGFzdF9jaGFyOworCQkJCXdoaWxlIChjaCAhPSBFT0YgJiYgY2ggIT0gJ1xuJykgeworCQkJCQkvL2JiX2Vycm9yX21zZygiRGlzY2FyZGVkOiclYyciLCBjaCk7CisJCQkJCWNoID0gaV9nZXRjaChpbnApOworCQkJCX0KKwkJCQkvKiBGb3JjZSBwcm9tcHQgKi8KKwkJCQlpbnAtPnAgPSBOVUxMOworCQkJCS8qIFRoaXMgc3RyZWFtIGlzbid0IGVtcHR5ICovCisJCQkJZW1wdHkgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwaXBlX2xpc3QgJiYgZW1wdHkpCisJCQkJRy5sYXN0X2V4aXRjb2RlID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWRlYnVnX3ByaW50X3RyZWUocGlwZV9saXN0LCAwKTsKKwkJZGVidWdfcHJpbnRmX2V4ZWMoInBhcnNlX2FuZF9ydW5fc3RyZWFtOiBydW5fYW5kX2ZyZWVfbGlzdFxuIik7CisJCXJ1bl9hbmRfZnJlZV9saXN0KHBpcGVfbGlzdCk7CisJCWVtcHR5ID0gMDsKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJaWYgKEcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPT0gMSkKKwkJCWJyZWFrOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgdm9pZCBwYXJzZV9hbmRfcnVuX3N0cmluZyhjb25zdCBjaGFyICpzKQoreworCXN0cnVjdCBpbl9zdHIgaW5wdXQ7CisJc2V0dXBfc3RyaW5nX2luX3N0cigmaW5wdXQsIHMpOworCXBhcnNlX2FuZF9ydW5fc3RyZWFtKCZpbnB1dCwgJ1wwJyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2FuZF9ydW5fZmlsZShGSUxFICpmKQoreworCXN0cnVjdCBpbl9zdHIgaW5wdXQ7CisJc2V0dXBfZmlsZV9pbl9zdHIoJmlucHV0LCBmKTsKKwlwYXJzZV9hbmRfcnVuX3N0cmVhbSgmaW5wdXQsICc7Jyk7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9USUNLCitzdGF0aWMgRklMRSAqZ2VuZXJhdGVfc3RyZWFtX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnMsIHBpZF90ICpwaWRfcCkKK3sKKwlwaWRfdCBwaWQ7CisJaW50IGNoYW5uZWxbMl07CisjIGlmICFCQl9NTVUKKwljaGFyICoqdG9fZnJlZSA9IE5VTEw7CisjIGVuZGlmCisKKwl4cGlwZShjaGFubmVsKTsKKwlwaWQgPSBCQl9NTVUgPyB4Zm9yaygpIDogeHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7IC8qIGNoaWxkICovCisJCWRpc2FibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCk7CisJCS8qIFByb2Nlc3Mgc3Vic3RpdHV0aW9uIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlIHVzdWFsCisJCSAqICdjb21tYW5kIGV4ZWN1dGlvbicuCisJCSAqIFNVU3YzIHNheXMgY3RybC1aIHNob3VsZCBiZSBpZ25vcmVkLCBjdHJsLUMgc2hvdWxkIG5vdC4KKwkJICovCisJCWJiX3NpZ25hbHMoMAorCQkJKyAoMSA8PCBTSUdUU1RQKQorCQkJKyAoMSA8PCBTSUdUVElOKQorCQkJKyAoMSA8PCBTSUdUVE9VKQorCQkJLCBTSUdfSUdOKTsKKwkJQ0xFQVJfUkFORE9NX1QoJkcucmFuZG9tX2dlbik7IC8qIG9yIGVsc2UgJFJBTkRPTSByZXBlYXRzIGluIGNoaWxkICovCisJCWNsb3NlKGNoYW5uZWxbMF0pOyAvKiBOQjogY2xvc2UgX2ZpcnN0XywgdGhlbiBtb3ZlIGZkISAqLworCQl4bW92ZV9mZChjaGFubmVsWzFdLCAxKTsKKwkJLyogUHJldmVudCBpdCBmcm9tIHRyeWluZyB0byBoYW5kbGUgY3RybC16IGV0YyAqLworCQlJRl9IVVNIX0pPQihHLnJ1bl9saXN0X2xldmVsID0gMTspCisJCS8qIEF3ZnVsIGhhY2sgZm9yIGB0cmFwYCBvciAkKHRyYXApLgorCQkgKgorCQkgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3RyYXAuaHRtbAorCQkgKiBjb250YWlucyBhbiBleGFtcGxlIHdoZXJlICJ0cmFwIiBpcyBleGVjdXRlZCBpbiBhIHN1YnNoZWxsOgorCQkgKgorCQkgKiBzYXZlX3RyYXBzPSQodHJhcCkKKwkJICogLi4uCisJCSAqIGV2YWwgIiRzYXZlX3RyYXBzIgorCQkgKgorCQkgKiBTdGFuZGFyZCBkb2VzIG5vdCBzYXkgdGhhdCAidHJhcCIgaW4gc3Vic2hlbGwgc2hhbGwgcHJpbnQKKwkJICogcGFyZW50IHNoZWxsJ3MgdHJhcHMuIEl0IG9ubHkgc2F5cyB0aGF0IGl0cyBvdXRwdXQKKwkJICogbXVzdCBoYXZlIHN1aXRhYmxlIGZvcm0sIGJ1dCB0aGVuLCBpbiB0aGUgYWJvdmUgZXhhbXBsZQorCQkgKiAod2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIG5vcm1hdGl2ZSksIGl0IGltcGxpZXMgdGhhdC4KKwkJICoKKwkJICogYmFzaCAoYW5kIHByb2JhYmx5IG90aGVyIHNoZWxsKSBkb2VzIGltcGxlbWVudCBpdAorCQkgKiAodHJhcHMgYXJlIHJlc2V0IHRvIGRlZmF1bHRzLCBidXQgInRyYXAiIHN0aWxsIHNob3dzIHRoZW0pLAorCQkgKiBidXQgYXMgYSByZXN1bHQsICJ0cmFwIiBsb2dpYyBpcyBob3BlbGVzc2x5IG1lc3NlZCB1cDoKKwkJICoKKwkJICogIyB0cmFwCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNIICA8LS0tIHdlIGhhdmUgYSBoYW5kbGVyCisJCSAqICMgKHRyYXApICAgICAgICA8LS0tIHRyYXAgaXMgaW4gc3Vic2hlbGwgLSBubyBvdXRwdXQgKGNvcnJlY3QsIHRyYXBzIGFyZSByZXNldCkKKwkJICogIyB0cnVlIHwgdHJhcCAgIDwtLS0gdHJhcCBpcyBpbiBzdWJzaGVsbCAtIG5vIG91dHB1dCAoZGl0dG8pCisJCSAqICMgZWNobyBgdHJ1ZSB8IHRyYXBgICAgIDwtLS0gaW4gc3Vic2hlbGwgLSBvdXRwdXQgKGJ1dCB0cmFwcyBhcmUgcmVzZXQhKQorCQkgKiB0cmFwIC0tICdlY2hvIEhvJyBTSUdXSU5DSAorCQkgKiAjIGVjaG8gYCh0cmFwKWAgICAgICAgICA8LS0tIGluIHN1YnNoZWxsIGluIHN1YnNoZWxsIC0gb3V0cHV0CisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqICMgZWNobyBgdHJ1ZSB8ICh0cmFwKWAgIDwtLS0gaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgLSBvdXRwdXQhCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqCisJCSAqIFRoZSBydWxlcyB3aGVuIHRvIGZvcmdldCBhbmQgd2hlbiB0byBub3QgZm9yZ2V0IHRyYXBzCisJCSAqIGdldCByZWFsbHkgY29tcGxleCBhbmQgbm9uc2Vuc2ljYWwuCisJCSAqCisJCSAqIE91ciBzb2x1dGlvbjogT05MWSBiYXJlICQodHJhcCkgb3IgYHRyYXBgIGlzIHNwZWNpYWwuCisJCSAqLworCQlzID0gc2tpcF93aGl0ZXNwYWNlKHMpOworCQlpZiAoc3RybmNtcChzLCAidHJhcCIsIDQpID09IDAKKwkJICYmIHNraXBfd2hpdGVzcGFjZShzICsgNClbMF0gPT0gJ1wwJworCQkpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhcmd2W10gPSB7IE5VTEwsIE5VTEwgfTsKKwkJCWJ1aWx0aW5fdHJhcCgoY2hhcioqKWFyZ3YpOworCQkJZXhpdCgwKTsgLyogbm90IF9leGl0KCkgLSB3ZSBuZWVkIHRvIGZmbHVzaCAqLworCQl9CisjIGlmIEJCX01NVQorCQlyZXNldF90cmFwc190b19kZWZhdWx0cygpOworCQlwYXJzZV9hbmRfcnVuX3N0cmluZyhzKTsKKwkJX2V4aXQoRy5sYXN0X2V4aXRjb2RlKTsKKyMgZWxzZQorCS8qIFdlIHJlLWV4ZWN1dGUgYWZ0ZXIgdmZvcmsgb24gTk9NTVUuIFRoaXMgbWFrZXMgdGhpcyBzY3JpcHQgc2FmZToKKwkgKiB5ZXMgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiIHwgZGQgYnM9MzIgY291bnQ9NjRrID5CSUcKKwkgKiBodWdlPWBjYXQgQklHYCAjIHdhcyBibG9ja2luZyBoZXJlIGZvcmV2ZXIKKwkgKiBlY2hvIE9LCisJICovCisJCXJlX2V4ZWN1dGVfc2hlbGwoJnRvX2ZyZWUsCisJCQkJcywKKwkJCQlHLmdsb2JhbF9hcmd2WzBdLAorCQkJCUcuZ2xvYmFsX2FyZ3YgKyAxLAorCQkJCU5VTEwpOworIyBlbmRpZgorCX0KKworCS8qIHBhcmVudCAqLworCSpwaWRfcCA9IHBpZDsKKyMgaWYgRU5BQkxFX0hVU0hfRkFTVAorCUcuY291bnRfU0lHQ0hMRCsrOworLy9iYl9lcnJvcl9tc2coIlslZF0gZm9yayBpbiBnZW5lcmF0ZV9zdHJlYW1fZnJvbV9zdHJpbmc6IgorLy8JCSIgRy5jb3VudF9TSUdDSExEOiVkIEcuaGFuZGxlZF9TSUdDSExEOiVkIiwKKy8vCQlnZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCk7CisjIGVuZGlmCisJZW5hYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpOworIyBpZiAhQkJfTU1VCisJZnJlZSh0b19mcmVlKTsKKyMgZW5kaWYKKwljbG9zZShjaGFubmVsWzFdKTsKKwljbG9zZV9vbl9leGVjX29uKGNoYW5uZWxbMF0pOworCXJldHVybiB4ZmRvcGVuX2Zvcl9yZWFkKGNoYW5uZWxbMF0pOworfQorCisvKiBSZXR1cm4gY29kZSBpcyBleGl0IHN0YXR1cyBvZiB0aGUgcHJvY2VzcyB0aGF0IGlzIHJ1bi4gKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kX3N1YnMob19zdHJpbmcgKmRlc3QsIGNvbnN0IGNoYXIgKnMpCit7CisJRklMRSAqZnA7CisJc3RydWN0IGluX3N0ciBwaXBlX3N0cjsKKwlwaWRfdCBwaWQ7CisJaW50IHN0YXR1cywgY2gsIGVvbF9jbnQ7CisKKwlmcCA9IGdlbmVyYXRlX3N0cmVhbV9mcm9tX3N0cmluZyhzLCAmcGlkKTsKKworCS8qIE5vdyBzZW5kIHJlc3VsdHMgb2YgY29tbWFuZCBiYWNrIGludG8gb3JpZ2luYWwgY29udGV4dCAqLworCXNldHVwX2ZpbGVfaW5fc3RyKCZwaXBlX3N0ciwgZnApOworCWVvbF9jbnQgPSAwOworCXdoaWxlICgoY2ggPSBpX2dldGNoKCZwaXBlX3N0cikpICE9IEVPRikgeworCQlpZiAoY2ggPT0gJ1xuJykgeworCQkJZW9sX2NudCsrOworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKGVvbF9jbnQpIHsKKwkJCW9fYWRkY2hyKGRlc3QsICdcbicpOworCQkJZW9sX2NudC0tOworCQl9CisJCW9fYWRkUWNocihkZXN0LCBjaCk7CisJfQorCisJZGVidWdfcHJpbnRmKCJkb25lIHJlYWRpbmcgZnJvbSBgY21kYCBwaXBlLCBjbG9zaW5nIGl0XG4iKTsKKwlmY2xvc2UoZnApOworCS8qIFdlIG5lZWQgdG8gZXh0cmFjdCBleGl0Y29kZS4gVGVzdCBjYXNlCisJICogInRydWU7IGVjaG8gYHNsZWVwIDE7IGZhbHNlYCAkPyIKKwkgKiBzaG91bGQgcHJpbnQgMSAqLworCXNhZmVfd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCWRlYnVnX3ByaW50ZigiY2hpbGQgZXhpdGVkLiByZXR1cm5pbmcgaXRzIGV4aXRjb2RlOiVkXG4iLCBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKKwlyZXR1cm4gV0VYSVRTVEFUVVMoc3RhdHVzKTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSFVTSF9USUNLICovCisKKworc3RhdGljIHZvaWQgc2V0dXBfaGVyZWRvYyhzdHJ1Y3QgcmVkaXJfc3RydWN0ICpyZWRpcikKK3sKKwlzdHJ1Y3QgZmRfcGFpciBwYWlyOworCXBpZF90IHBpZDsKKwlpbnQgbGVuLCB3cml0dGVuOworCS8qIHRoZSBfYm9keV8gb2YgaGVyZWRvYyAobWlzbGVhZGluZyBmaWVsZCBuYW1lKSAqLworCWNvbnN0IGNoYXIgKmhlcmVkb2MgPSByZWRpci0+cmRfZmlsZW5hbWU7CisJY2hhciAqZXhwYW5kZWQ7CisjaWYgIUJCX01NVQorCWNoYXIgKip0b19mcmVlOworI2VuZGlmCisKKwlleHBhbmRlZCA9IE5VTEw7CisJaWYgKCEocmVkaXItPnJkX2R1cCAmIEhFUkVET0NfUVVPVEVEKSkgeworCQlleHBhbmRlZCA9IGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoaGVyZWRvYywgLypwcm9jZXNzX2Jrc2xhc2g6Ki8gMSwgLyp1bmJhY2tzbGFzaDoqLyAxKTsKKwkJaWYgKGV4cGFuZGVkKQorCQkJaGVyZWRvYyA9IGV4cGFuZGVkOworCX0KKwlsZW4gPSBzdHJsZW4oaGVyZWRvYyk7CisKKwljbG9zZShyZWRpci0+cmRfZmQpOyAvKiBvZnRlbiBzYXZlcyBkdXAyK2Nsb3NlIGluIHhtb3ZlX2ZkICovCisJeHBpcGVkX3BhaXIocGFpcik7CisJeG1vdmVfZmQocGFpci5yZCwgcmVkaXItPnJkX2ZkKTsKKworCS8qIFRyeSB3cml0aW5nIHdpdGhvdXQgZm9ya2luZy4gTmV3ZXIga2VybmVscyBoYXZlCisJICogZHluYW1pY2FsbHkgZ3Jvd2luZyBwaXBlcy4gTXVzdCB1c2Ugbm9uLWJsb2NraW5nIHdyaXRlISAqLworCW5kZWxheV9vbihwYWlyLndyKTsKKwl3aGlsZSAoMSkgeworCQl3cml0dGVuID0gd3JpdGUocGFpci53ciwgaGVyZWRvYywgbGVuKTsKKwkJaWYgKHdyaXR0ZW4gPD0gMCkKKwkJCWJyZWFrOworCQlsZW4gLT0gd3JpdHRlbjsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQljbG9zZShwYWlyLndyKTsKKwkJCWZyZWUoZXhwYW5kZWQpOworCQkJcmV0dXJuOworCQl9CisJCWhlcmVkb2MgKz0gd3JpdHRlbjsKKwl9CisJbmRlbGF5X29mZihwYWlyLndyKTsKKworCS8qIE9rYXksIHBpcGUgYnVmZmVyIHdhcyBub3QgYmlnIGVub3VnaCAqLworCS8qIE5vdGU6IHdlIG11c3Qgbm90IGNyZWF0ZSBhIHN0cmF5IGNoaWxkIChiYXN0YXJkPyA6KQorCSAqIGZvciB0aGUgdW5zdXNwZWN0aW5nIHBhcmVudCBwcm9jZXNzLiBDaGlsZCBjcmVhdGVzIGEgZ3JhbmRjaGlsZAorCSAqIGFuZCBleGl0cyBiZWZvcmUgcGFyZW50IGV4ZWNzIHRoZSBwcm9jZXNzIHdoaWNoIGNvbnN1bWVzIGhlcmVkb2MKKwkgKiAodGhhdCBleGVjIGhhcHBlbnMgYWZ0ZXIgd2UgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbikgKi8KKyNpZiAhQkJfTU1VCisJdG9fZnJlZSA9IE5VTEw7CisjZW5kaWYKKwlwaWQgPSB4dmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogY2hpbGQgKi8KKwkJZGlzYWJsZV9yZXN0b3JlX3R0eV9wZ3JwX29uX2V4aXQoKTsKKwkJcGlkID0gQkJfTU1VID8geGZvcmsoKSA6IHh2Zm9yaygpOworCQlpZiAocGlkICE9IDApCisJCQlfZXhpdCgwKTsKKwkJLyogZ3JhbmRjaGlsZCAqLworCQljbG9zZShyZWRpci0+cmRfZmQpOyAvKiByZWFkIHNpZGUgb2YgdGhlIHBpcGUgKi8KKyNpZiBCQl9NTVUKKwkJZnVsbF93cml0ZShwYWlyLndyLCBoZXJlZG9jLCBsZW4pOyAvKiBtYXkgbG9vcCBvciBibG9jayAqLworCQlfZXhpdCgwKTsKKyNlbHNlCisJCS8qIERlbGVnYXRlIGJsb2NraW5nIHdyaXRlcyB0byBhbm90aGVyIHByb2Nlc3MgKi8KKwkJeG1vdmVfZmQocGFpci53ciwgU1RET1VUX0ZJTEVOTyk7CisJCXJlX2V4ZWN1dGVfc2hlbGwoJnRvX2ZyZWUsIGhlcmVkb2MsIE5VTEwsIE5VTEwsIE5VTEwpOworI2VuZGlmCisJfQorCS8qIHBhcmVudCAqLworI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwlHLmNvdW50X1NJR0NITEQrKzsKKy8vYmJfZXJyb3JfbXNnKCJbJWRdIGZvcmsgaW4gc2V0dXBfaGVyZWRvYzogRy5jb3VudF9TSUdDSExEOiVkIEcuaGFuZGxlZF9TSUdDSExEOiVkIiwgZ2V0cGlkKCksIEcuY291bnRfU0lHQ0hMRCwgRy5oYW5kbGVkX1NJR0NITEQpOworI2VuZGlmCisJZW5hYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpOworI2lmICFCQl9NTVUKKwlmcmVlKHRvX2ZyZWUpOworI2VuZGlmCisJY2xvc2UocGFpci53cik7CisJZnJlZShleHBhbmRlZCk7CisJd2FpdChOVUxMKTsgLyogd2FpdCB0aWxsIGNoaWxkIGhhcyBkaWVkICovCit9CisKKy8qIHNxdWlycmVsICE9IE5VTEwgbWVhbnMgd2Ugc3F1aXJyZWwgYXdheSBjb3BpZXMgb2Ygc3RkaW4sIHN0ZG91dCwKKyAqIGFuZCBzdGRlcnIgaWYgdGhleSBhcmUgcmVkaXJlY3RlZC4gKi8KK3N0YXRpYyBpbnQgc2V0dXBfcmVkaXJlY3RzKHN0cnVjdCBjb21tYW5kICpwcm9nLCBpbnQgc3F1aXJyZWxbXSkKK3sKKwlpbnQgb3BlbmZkLCBtb2RlOworCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKnJlZGlyOworCisJZm9yIChyZWRpciA9IHByb2ctPnJlZGlyZWN0czsgcmVkaXI7IHJlZGlyID0gcmVkaXItPm5leHQpIHsKKwkJaWYgKHJlZGlyLT5yZF90eXBlID09IFJFRElSRUNUX0hFUkVET0MyKSB7CisJCQkvKiByZF9mZDw8SEVSRSBjYXNlICovCisJCQlpZiAoc3F1aXJyZWwgJiYgcmVkaXItPnJkX2ZkIDwgMworCQkJICYmIHNxdWlycmVsW3JlZGlyLT5yZF9mZF0gPCAwCisJCQkpIHsKKwkJCQlzcXVpcnJlbFtyZWRpci0+cmRfZmRdID0gZHVwKHJlZGlyLT5yZF9mZCk7CisJCQl9CisJCQkvKiBmb3IgUkVESVJFQ1RfSEVSRURPQzIsIHJkX2ZpbGVuYW1lIGhvbGRzIF9jb250ZW50c18KKwkJCSAqIG9mIHRoZSBoZXJlZG9jICovCisJCQlkZWJ1Z19wcmludGZfcGFyc2UoInNldCBoZXJlZG9jICclcydcbiIsCisJCQkJCXJlZGlyLT5yZF9maWxlbmFtZSk7CisJCQlzZXR1cF9oZXJlZG9jKHJlZGlyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlZGlyLT5yZF9kdXAgPT0gUkVESVJGRF9UT19GSUxFKSB7CisJCQkvKiByZF9mZDwqPmZpbGUgY2FzZSAoPCo+IGlzIDwsPiw+Piw8PikgKi8KKwkJCWNoYXIgKnA7CisJCQlpZiAocmVkaXItPnJkX2ZpbGVuYW1lID09IE5VTEwpIHsKKwkJCQkvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBpbiB0aGUgcGFyc2UuCisJCQkJICogUHJldGVuZCBpdCBkaWRuJ3QgaGFwcGVuICovCisJCQkJYmJfZXJyb3JfbXNnKCJidWcgaW4gcmVkaXJlY3QgcGFyc2UiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1vZGUgPSByZWRpcl90YWJsZVtyZWRpci0+cmRfdHlwZV0ubW9kZTsKKwkJCXAgPSBleHBhbmRfc3RyaW5nX3RvX3N0cmluZyhyZWRpci0+cmRfZmlsZW5hbWUsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQlvcGVuZmQgPSBvcGVuX29yX3dhcm4ocCwgbW9kZSk7CisJCQlmcmVlKHApOworCQkJaWYgKG9wZW5mZCA8IDApIHsKKwkJCS8qIHRoaXMgY291bGQgZ2V0IGxvc3QgaWYgc3RkZXJyIGhhcyBiZWVuIHJlZGlyZWN0ZWQsIGJ1dAorCQkJICogYmFzaCBhbmQgYXNoIGJvdGggbG9zZSBpdCBhcyB3ZWxsICh0aG91Z2ggenNoIGRvZXNuJ3QhKSAqLworLy93aGF0IHRoZSBhYm92ZSBjb21tZW50IHRyaWVzIHRvIHNheT8KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHJkX2ZkPCo+cmRfZHVwIG9yIHJkX2ZkPCo+LSBjYXNlcyAqLworCQkJb3BlbmZkID0gcmVkaXItPnJkX2R1cDsKKwkJfQorCisJCWlmIChvcGVuZmQgIT0gcmVkaXItPnJkX2ZkKSB7CisJCQlpZiAoc3F1aXJyZWwgJiYgcmVkaXItPnJkX2ZkIDwgMworCQkJICYmIHNxdWlycmVsW3JlZGlyLT5yZF9mZF0gPCAwCisJCQkpIHsKKwkJCQlzcXVpcnJlbFtyZWRpci0+cmRfZmRdID0gZHVwKHJlZGlyLT5yZF9mZCk7CisJCQl9CisJCQlpZiAob3BlbmZkID09IFJFRElSRkRfQ0xPU0UpIHsKKwkJCQkvKiAibj4tIiBtZWFucyAiY2xvc2UgbWUiICovCisJCQkJY2xvc2UocmVkaXItPnJkX2ZkKTsKKwkJCX0gZWxzZSB7CisJCQkJeGR1cDIob3BlbmZkLCByZWRpci0+cmRfZmQpOworCQkJCWlmIChyZWRpci0+cmRfZHVwID09IFJFRElSRkRfVE9fRklMRSkKKwkJCQkJY2xvc2Uob3BlbmZkKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVzdG9yZV9yZWRpcmVjdHMoaW50IHNxdWlycmVsW10pCit7CisJaW50IGksIGZkOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJZmQgPSBzcXVpcnJlbFtpXTsKKwkJaWYgKGZkICE9IC0xKSB7CisJCQkvKiBXZSBzaW1wbHkgZGllIG9uIGVycm9yICovCisJCQl4bW92ZV9mZChmZCwgaSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjaGFyICpmaW5kX2luX3BhdGgoY29uc3QgY2hhciAqYXJnKQoreworCWNoYXIgKnJldCA9IE5VTEw7CisJY29uc3QgY2hhciAqUEFUSCA9IGdldF9sb2NhbF92YXJfdmFsdWUoIlBBVEgiKTsKKworCWlmICghUEFUSCkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoMSkgeworCQljb25zdCBjaGFyICplbmQgPSBzdHJjaHJudWwoUEFUSCwgJzonKTsKKwkJaW50IHN6ID0gZW5kIC0gUEFUSDsgLyogbXVzdCBiZSBpbnQhICovCisKKwkJZnJlZShyZXQpOworCQlpZiAoc3ogIT0gMCkgeworCQkJcmV0ID0geGFzcHJpbnRmKCIlLipzLyVzIiwgc3osIFBBVEgsIGFyZyk7CisJCX0gZWxzZSB7CisJCQkvKiBXZSBoYXZlIHh4eDo6eXl5eSBpbiAkUEFUSCwKKwkJCSAqIGl0IG1lYW5zICJ1c2UgY3VycmVudCBkaXIiICovCisJCQlyZXQgPSB4c3RyZHVwKGFyZyk7CisJCX0KKwkJaWYgKGFjY2VzcyhyZXQsIEZfT0spID09IDApCisJCQlicmVhazsKKworCQlpZiAoKmVuZCA9PSAnXDAnKSB7CisJCQlmcmVlKHJldCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlQQVRIID0gZW5kICsgMTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKmZpbmRfYnVpbHRpbl9oZWxwZXIoY29uc3QgY2hhciAqbmFtZSwKKwkJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKngsCisJCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICplbmQpCit7CisJd2hpbGUgKHggIT0gZW5kKSB7CisJCWlmIChzdHJjbXAobmFtZSwgeC0+Yl9jbWQpICE9IDApIHsKKwkJCXgrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRlYnVnX3ByaW50Zl9leGVjKCJmb3VuZCBidWlsdGluICclcydcbiIsIG5hbWUpOworCQlyZXR1cm4geDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKmZpbmRfYnVpbHRpbjEoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gZmluZF9idWlsdGluX2hlbHBlcihuYW1lLCBibHRpbnMxLCAmYmx0aW5zMVtBUlJBWV9TSVpFKGJsdGluczEpXSk7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKmZpbmRfYnVpbHRpbihjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4ID0gZmluZF9idWlsdGluMShuYW1lKTsKKwlpZiAoeCkKKwkJcmV0dXJuIHg7CisJcmV0dXJuIGZpbmRfYnVpbHRpbl9oZWxwZXIobmFtZSwgYmx0aW5zMiwgJmJsdGluczJbQVJSQVlfU0laRShibHRpbnMyKV0pOworfQorCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCitzdGF0aWMgc3RydWN0IGZ1bmN0aW9uICoqZmluZF9mdW5jdGlvbl9zbG90KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZ1bmN0aW9uICoqZnVuY3BwID0gJkcudG9wX2Z1bmM7CisJd2hpbGUgKCpmdW5jcHApIHsKKwkJaWYgKHN0cmNtcChuYW1lLCAoKmZ1bmNwcCktPm5hbWUpID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWZ1bmNwcCA9ICYoKmZ1bmNwcCktPm5leHQ7CisJfQorCXJldHVybiBmdW5jcHA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnVuY3Rpb24gKmZpbmRfZnVuY3Rpb24oY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwID0gKmZpbmRfZnVuY3Rpb25fc2xvdChuYW1lKTsKKwlpZiAoZnVuY3ApCisJCWRlYnVnX3ByaW50Zl9leGVjKCJmb3VuZCBmdW5jdGlvbiAnJXMnXG4iLCBuYW1lKTsKKwlyZXR1cm4gZnVuY3A7Cit9CisKKy8qIE5vdGU6IHRha2VzIG93bmVyc2hpcCBvbiBuYW1lIHB0ciAqLworc3RhdGljIHN0cnVjdCBmdW5jdGlvbiAqbmV3X2Z1bmN0aW9uKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZ1bmN0aW9uICoqZnVuY3BwID0gZmluZF9mdW5jdGlvbl9zbG90KG5hbWUpOworCXN0cnVjdCBmdW5jdGlvbiAqZnVuY3AgPSAqZnVuY3BwOworCisJaWYgKGZ1bmNwICE9IE5VTEwpIHsKKwkJc3RydWN0IGNvbW1hbmQgKmNtZCA9IGZ1bmNwLT5wYXJlbnRfY21kOworCQlkZWJ1Z19wcmludGZfZXhlYygiZnVuYyAlcCBwYXJlbnRfY21kICVwXG4iLCBmdW5jcCwgY21kKTsKKwkJaWYgKCFjbWQpIHsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCJmcmVlaW5nICYgcmVwbGFjaW5nIGZ1bmN0aW9uICclcydcbiIsIGZ1bmNwLT5uYW1lKTsKKwkJCWZyZWUoZnVuY3AtPm5hbWUpOworCQkJLyogTm90ZTogaWYgIWZ1bmNwLT5ib2R5LCBkbyBub3QgZnJlZSBib2R5X2FzX3N0cmluZyEKKwkJCSAqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgIi1GIG5hbWUgYm9keSIgZnVuY3Rpb246CisJCQkgKiBib2R5X2FzX3N0cmluZyB3YXMgbm90IG1hbGxvY2VkISAqLworCQkJaWYgKGZ1bmNwLT5ib2R5KSB7CisJCQkJZnJlZV9waXBlX2xpc3QoZnVuY3AtPmJvZHkpOworIyBpZiAhQkJfTU1VCisJCQkJZnJlZShmdW5jcC0+Ym9keV9hc19zdHJpbmcpOworIyBlbmRpZgorCQkJfQorCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnRmX2V4ZWMoInJlaW5zZXJ0aW5nIGluIHRyZWUgJiByZXBsYWNpbmcgZnVuY3Rpb24gJyVzJ1xuIiwgZnVuY3AtPm5hbWUpOworCQkJY21kLT5hcmd2WzBdID0gZnVuY3AtPm5hbWU7CisJCQljbWQtPmdyb3VwID0gZnVuY3AtPmJvZHk7CisjIGlmICFCQl9NTVUKKwkJCWNtZC0+Z3JvdXBfYXNfc3RyaW5nID0gZnVuY3AtPmJvZHlfYXNfc3RyaW5nOworIyBlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJZGVidWdfcHJpbnRmX2V4ZWMoInJlbWVtYmVyaW5nIG5ldyBmdW5jdGlvbiAnJXMnXG4iLCBuYW1lKTsKKwkJZnVuY3AgPSAqZnVuY3BwID0geHphbGxvYyhzaXplb2YoKmZ1bmNwKSk7CisJCS8qZnVuY3AtPm5leHQgPSBOVUxMOyovCisJfQorCisJZnVuY3AtPm5hbWUgPSBuYW1lOworCXJldHVybiBmdW5jcDsKK30KKworc3RhdGljIHZvaWQgdW5zZXRfZnVuYyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmdW5jdGlvbiAqKmZ1bmNwcCA9IGZpbmRfZnVuY3Rpb25fc2xvdChuYW1lKTsKKwlzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwID0gKmZ1bmNwcDsKKworCWlmIChmdW5jcCAhPSBOVUxMKSB7CisJCWRlYnVnX3ByaW50Zl9leGVjKCJmcmVlaW5nIGZ1bmN0aW9uICclcydcbiIsIGZ1bmNwLT5uYW1lKTsKKwkJKmZ1bmNwcCA9IGZ1bmNwLT5uZXh0OworCQkvKiBmdW5jcCBpcyB1bmxpbmtlZCBub3csIGRlbGV0aW5nIGl0LgorCQkgKiBOb3RlOiBpZiAhZnVuY3AtPmJvZHksIHRoZSBmdW5jdGlvbiB3YXMgY3JlYXRlZCBieQorCQkgKiAiLUYgbmFtZSBib2R5IiwgZG8gbm90IGZyZWUgLT5ib2R5X2FzX3N0cmluZworCQkgKiBhbmQgLT5uYW1lIGFzIHRoZXkgd2VyZSBub3QgbWFsbG9jZWQuICovCisJCWlmIChmdW5jcC0+Ym9keSkgeworCQkJZnJlZV9waXBlX2xpc3QoZnVuY3AtPmJvZHkpOworCQkJZnJlZShmdW5jcC0+bmFtZSk7CisjIGlmICFCQl9NTVUKKwkJCWZyZWUoZnVuY3AtPmJvZHlfYXNfc3RyaW5nKTsKKyMgZW5kaWYKKwkJfQorCQlmcmVlKGZ1bmNwKTsKKwl9Cit9CisKKyMgaWYgQkJfTU1VCisjZGVmaW5lIGV4ZWNfZnVuY3Rpb24odG9fZnJlZSwgZnVuY3AsIGFyZ3YpIFwKKwlleGVjX2Z1bmN0aW9uKGZ1bmNwLCBhcmd2KQorIyBlbmRpZgorc3RhdGljIHZvaWQgZXhlY19mdW5jdGlvbihjaGFyICoqKnRvX2ZyZWUsCisJCWNvbnN0IHN0cnVjdCBmdW5jdGlvbiAqZnVuY3AsCisJCWNoYXIgKiphcmd2KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGV4ZWNfZnVuY3Rpb24oY2hhciAqKip0b19mcmVlLAorCQljb25zdCBzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwLAorCQljaGFyICoqYXJndikKK3sKKyMgaWYgQkJfTU1VCisJaW50IG4gPSAxOworCisJYXJndlswXSA9IEcuZ2xvYmFsX2FyZ3ZbMF07CisJRy5nbG9iYWxfYXJndiA9IGFyZ3Y7CisJd2hpbGUgKCorK2FyZ3YpCisJCW4rKzsKKwlHLmdsb2JhbF9hcmdjID0gbjsKKwkvKiBPbiBNTVUsIGZ1bmNwLT5ib2R5IGlzIGFsd2F5cyBub24tTlVMTCAqLworCW4gPSBydW5fbGlzdChmdW5jcC0+Ym9keSk7CisJZmZsdXNoX2FsbCgpOworCV9leGl0KG4pOworIyBlbHNlCisJcmVfZXhlY3V0ZV9zaGVsbCh0b19mcmVlLAorCQkJZnVuY3AtPmJvZHlfYXNfc3RyaW5nLAorCQkJRy5nbG9iYWxfYXJndlswXSwKKwkJCWFyZ3YgKyAxLAorCQkJTlVMTCk7CisjIGVuZGlmCit9CisKK3N0YXRpYyBpbnQgcnVuX2Z1bmN0aW9uKGNvbnN0IHN0cnVjdCBmdW5jdGlvbiAqZnVuY3AsIGNoYXIgKiphcmd2KQoreworCWludCByYzsKKwlzYXZlX2FyZ190IHN2OworCXNtYWxsaW50IHN2X2ZsZzsKKworCXNhdmVfYW5kX3JlcGxhY2VfR19hcmdzKCZzdiwgYXJndik7CisKKwkvKiAid2UgYXJlIGluIGZ1bmN0aW9uLCBvayB0byB1c2UgcmV0dXJuIiAqLworCXN2X2ZsZyA9IEcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3M7CisJRy5mbGFnX3JldHVybl9pbl9wcm9ncmVzcyA9IC0xOworIyBpZiBFTkFCTEVfSFVTSF9MT0NBTAorCUcuZnVuY19uZXN0X2xldmVsKys7CisjIGVuZGlmCisKKwkvKiBPbiBNTVUsIGZ1bmNwLT5ib2R5IGlzIGFsd2F5cyBub24tTlVMTCAqLworIyBpZiAhQkJfTU1VCisJaWYgKCFmdW5jcC0+Ym9keSkgeworCQkvKiBGdW5jdGlvbiBkZWZpbmVkIGJ5IC1GICovCisJCXBhcnNlX2FuZF9ydW5fc3RyaW5nKGZ1bmNwLT5ib2R5X2FzX3N0cmluZyk7CisJCXJjID0gRy5sYXN0X2V4aXRjb2RlOworCX0gZWxzZQorIyBlbmRpZgorCXsKKwkJcmMgPSBydW5fbGlzdChmdW5jcC0+Ym9keSk7CisJfQorCisjIGlmIEVOQUJMRV9IVVNIX0xPQ0FMCisJeworCQlzdHJ1Y3QgdmFyaWFibGUgKnZhcjsKKwkJc3RydWN0IHZhcmlhYmxlICoqdmFyX3BwOworCisJCXZhcl9wcCA9ICZHLnRvcF92YXI7CisJCXdoaWxlICgodmFyID0gKnZhcl9wcCkgIT0gTlVMTCkgeworCQkJaWYgKHZhci0+ZnVuY19uZXN0X2xldmVsIDwgRy5mdW5jX25lc3RfbGV2ZWwpIHsKKwkJCQl2YXJfcHAgPSAmdmFyLT5uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogVW5leHBvcnQgKi8KKwkJCWlmICh2YXItPmZsZ19leHBvcnQpCisJCQkJYmJfdW5zZXRlbnYodmFyLT52YXJzdHIpOworCQkJLyogUmVtb3ZlIGZyb20gZ2xvYmFsIGxpc3QgKi8KKwkJCSp2YXJfcHAgPSB2YXItPm5leHQ7CisJCQkvKiBGcmVlICovCisJCQlpZiAoIXZhci0+bWF4X2xlbikKKwkJCQlmcmVlKHZhci0+dmFyc3RyKTsKKwkJCWZyZWUodmFyKTsKKwkJfQorCQlHLmZ1bmNfbmVzdF9sZXZlbC0tOworCX0KKyMgZW5kaWYKKwlHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzID0gc3ZfZmxnOworCisJcmVzdG9yZV9HX2FyZ3MoJnN2LCBhcmd2KTsKKworCXJldHVybiByYzsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSFVTSF9GVU5DVElPTlMgKi8KKworCisjaWYgQkJfTU1VCisjZGVmaW5lIGV4ZWNfYnVpbHRpbih0b19mcmVlLCB4LCBhcmd2KSBcCisJZXhlY19idWlsdGluKHgsIGFyZ3YpCisjZWxzZQorI2RlZmluZSBleGVjX2J1aWx0aW4odG9fZnJlZSwgeCwgYXJndikgXAorCWV4ZWNfYnVpbHRpbih0b19mcmVlLCBhcmd2KQorI2VuZGlmCitzdGF0aWMgdm9pZCBleGVjX2J1aWx0aW4oY2hhciAqKip0b19mcmVlLAorCQljb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqeCwKKwkJY2hhciAqKmFyZ3YpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZXhlY19idWlsdGluKGNoYXIgKioqdG9fZnJlZSwKKwkJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKngsCisJCWNoYXIgKiphcmd2KQoreworI2lmIEJCX01NVQorCWludCByY29kZTsKKwlmZmx1c2hfYWxsKCk7CisJcmNvZGUgPSB4LT5iX2Z1bmN0aW9uKGFyZ3YpOworCWZmbHVzaF9hbGwoKTsKKwlfZXhpdChyY29kZSk7CisjZWxzZQorCWZmbHVzaF9hbGwoKTsKKwkvKiBPbiBOT01NVSwgd2UgbXVzdCBuZXZlciBibG9jayEKKwkgKiBFeGFtcGxlOiB7IHNsZWVwIDk5IHwgcmVhZCBsaW5lOyB9ICYgZWNobyBPaworCSAqLworCXJlX2V4ZWN1dGVfc2hlbGwodG9fZnJlZSwKKwkJCWFyZ3ZbMF0sCisJCQlHLmdsb2JhbF9hcmd2WzBdLAorCQkJRy5nbG9iYWxfYXJndiArIDEsCisJCQlhcmd2KTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkIGV4ZWN2cF9vcl9kaWUoY2hhciAqKmFyZ3YpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZXhlY3ZwX29yX2RpZShjaGFyICoqYXJndikKK3sKKwlkZWJ1Z19wcmludGZfZXhlYygiZXhlY2luZyAnJXMnXG4iLCBhcmd2WzBdKTsKKwkvKiBEb24ndCBwcm9wYWdhdGUgU0lHX0lHTiB0byB0aGUgY2hpbGQgKi8KKwlpZiAoU1BFQ0lBTF9KT0JTVE9QX1NJR1MgIT0gMCkKKwkJc3dpdGNoX29mZl9zcGVjaWFsX3NpZ3MoRy5zcGVjaWFsX3NpZ19tYXNrICYgU1BFQ0lBTF9KT0JTVE9QX1NJR1MpOworCWV4ZWN2cChhcmd2WzBdLCBhcmd2KTsKKwliYl9wZXJyb3JfbXNnKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmd2WzBdKTsKKwlfZXhpdCgxMjcpOyAvKiBiYXNoIGNvbXBhdCAqLworfQorCisjaWYgRU5BQkxFX0hVU0hfTU9ERV9YCitzdGF0aWMgdm9pZCBkdW1wX2NtZF9pbl94X21vZGUoY2hhciAqKmFyZ3YpCit7CisJaWYgKEdfeF9tb2RlICYmIGFyZ3YpIHsKKwkJLyogV2Ugd2FudCB0byBvdXRwdXQgdGhlIGxpbmUgaW4gb25lIHdyaXRlIG9wICovCisJCWNoYXIgKmJ1ZiwgKnA7CisJCWludCBsZW47CisJCWludCBuOworCisJCWxlbiA9IDM7CisJCW4gPSAwOworCQl3aGlsZSAoYXJndltuXSkKKwkJCWxlbiArPSBzdHJsZW4oYXJndltuKytdKSArIDE7CisJCWJ1ZiA9IHhtYWxsb2MobGVuKTsKKwkJYnVmWzBdID0gJysnOworCQlwID0gYnVmICsgMTsKKwkJbiA9IDA7CisJCXdoaWxlIChhcmd2W25dKQorCQkJcCArPSBzcHJpbnRmKHAsICIgJXMiLCBhcmd2W24rK10pOworCQkqcCsrID0gJ1xuJzsKKwkJKnAgPSAnXDAnOworCQlmcHV0cyhidWYsIHN0ZGVycik7CisJCWZyZWUoYnVmKTsKKwl9Cit9CisjZWxzZQorIyBkZWZpbmUgZHVtcF9jbWRfaW5feF9tb2RlKGFyZ3YpICgodm9pZCkwKQorI2VuZGlmCisKKyNpZiBCQl9NTVUKKyNkZWZpbmUgcHNldWRvX2V4ZWNfYXJndihub21tdV9zYXZlLCBhcmd2LCBhc3NpZ25tZW50X2NudCwgYXJndl9leHBhbmRlZCkgXAorCXBzZXVkb19leGVjX2FyZ3YoYXJndiwgYXNzaWdubWVudF9jbnQsIGFyZ3ZfZXhwYW5kZWQpCisjZGVmaW5lIHBzZXVkb19leGVjKG5vbW11X3NhdmUsIGNvbW1hbmQsIGFyZ3ZfZXhwYW5kZWQpIFwKKwlwc2V1ZG9fZXhlYyhjb21tYW5kLCBhcmd2X2V4cGFuZGVkKQorI2VuZGlmCisKKy8qIENhbGxlZCBhZnRlciBbdl1mb3JrKCkgaW4gcnVuX3BpcGUsIG9yIGZyb20gYnVpbHRpbl9leGVjLgorICogTmV2ZXIgcmV0dXJucy4KKyAqIERvbid0IGV4aXQoKSBoZXJlLiAgSWYgeW91IGRvbid0IGV4ZWMsIHVzZSBfZXhpdCBpbnN0ZWFkLgorICogVGhlIGF0X2V4aXQgaGFuZGxlcnMgYXBwYXJlbnRseSBjb25mdXNlIHRoZSBjYWxsaW5nIHByb2Nlc3MsCisgKiBpbiBwYXJ0aWN1bGFyIHN0ZGluIGhhbmRsaW5nLiAgTm90IHN1cmUgd2h5PyAtLSBiZWNhdXNlIG9mIHZmb3JrISAodmRhKSAqLworc3RhdGljIHZvaWQgcHNldWRvX2V4ZWNfYXJndihub21tdV9zYXZlX3QgKm5vbW11X3NhdmUsCisJCWNoYXIgKiphcmd2LCBpbnQgYXNzaWdubWVudF9jbnQsCisJCWNoYXIgKiphcmd2X2V4cGFuZGVkKSBOT1JFVFVSTjsKK3N0YXRpYyBOT0lOTElORSB2b2lkIHBzZXVkb19leGVjX2FyZ3Yobm9tbXVfc2F2ZV90ICpub21tdV9zYXZlLAorCQljaGFyICoqYXJndiwgaW50IGFzc2lnbm1lbnRfY250LAorCQljaGFyICoqYXJndl9leHBhbmRlZCkKK3sKKwljaGFyICoqbmV3X2VudjsKKworCW5ld19lbnYgPSBleHBhbmRfYXNzaWdubWVudHMoYXJndiwgYXNzaWdubWVudF9jbnQpOworCWR1bXBfY21kX2luX3hfbW9kZShuZXdfZW52KTsKKworCWlmICghYXJndlthc3NpZ25tZW50X2NudF0pIHsKKwkJLyogQ2FzZSB3aGVuIHdlIGFyZSBoZXJlOiAuLi4gfCB2YXI9dmFsIHwgLi4uCisJCSAqIChub3RlIHRoYXQgd2UgZG8gbm90IGV4aXQgZWFybHksIGkuZS4sIGRvIG5vdCBvcHRpbWl6ZSBvdXQKKwkJICogZXhwYW5kX2Fzc2lnbm1lbnRzKCk6IHRoaW5rIGFib3V0IC4uLiB8IHZhcj1gc2xlZXAgMWAgfCAuLi4KKwkJICovCisJCWZyZWVfc3RyaW5ncyhuZXdfZW52KTsKKwkJX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisKKyNpZiBCQl9NTVUKKwlzZXRfdmFyc19hbmRfc2F2ZV9vbGQobmV3X2Vudik7CisJZnJlZShuZXdfZW52KTsgLyogb3B0aW9uYWwgKi8KKwkvKiB3ZSBjYW4gYWxzbyBkZXN0cm95IHNldF92YXJzX2FuZF9zYXZlX29sZCdzIHJldHVybiB2YWx1ZSwKKwkgKiB0byBzYXZlIG1lbW9yeSAqLworI2Vsc2UKKwlub21tdV9zYXZlLT5uZXdfZW52ID0gbmV3X2VudjsKKwlub21tdV9zYXZlLT5vbGRfdmFycyA9IHNldF92YXJzX2FuZF9zYXZlX29sZChuZXdfZW52KTsKKyNlbmRpZgorCisJaWYgKGFyZ3ZfZXhwYW5kZWQpIHsKKwkJYXJndiA9IGFyZ3ZfZXhwYW5kZWQ7CisJfSBlbHNlIHsKKwkJYXJndiA9IGV4cGFuZF9zdHJ2ZWNfdG9fc3RydmVjKGFyZ3YgKyBhc3NpZ25tZW50X2NudCk7CisjaWYgIUJCX01NVQorCQlub21tdV9zYXZlLT5hcmd2ID0gYXJndjsKKyNlbmRpZgorCX0KKwlkdW1wX2NtZF9pbl94X21vZGUoYXJndik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FIHx8IEJCX01NVQorCWlmIChzdHJjaHIoYXJndlswXSwgJy8nKSAhPSBOVUxMKQorCQlnb3RvIHNraXA7CisjZW5kaWYKKworCS8qIENoZWNrIGlmIHRoZSBjb21tYW5kIG1hdGNoZXMgYW55IG9mIHRoZSBidWlsdGlucy4KKwkgKiBEZXBlbmRpbmcgb24gY29udGV4dCwgdGhpcyBtaWdodCBiZSByZWR1bmRhbnQuICBCdXQgaXQncworCSAqIGVhc2llciB0byB3YXN0ZSBhIGZldyBDUFUgY3ljbGVzIHRoYW4gaXQgaXMgdG8gZmlndXJlIG91dAorCSAqIGlmIHRoaXMgaXMgb25lIG9mIHRob3NlIGNhc2VzLgorCSAqLworCXsKKwkJLyogT24gTk9NTVUsIGl0IGlzIG1vcmUgZXhwZW5zaXZlIHRvIHJlLWV4ZWN1dGUgc2hlbGwKKwkJICoganVzdCBpbiBvcmRlciB0byBydW4gZWNobyBvciB0ZXN0IGJ1aWx0aW4uCisJCSAqIEl0J3MgYmV0dGVyIHRvIHNraXAgaXQgaGVyZSBhbmQgcnVuIGNvcnJlc3BvbmRpbmcKKwkJICogbm9uLWJ1aWx0aW4gbGF0ZXIuICovCisJCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4OworCQl4ID0gQkJfTU1VID8gZmluZF9idWlsdGluKGFyZ3ZbMF0pIDogZmluZF9idWlsdGluMShhcmd2WzBdKTsKKwkJaWYgKHgpIHsKKwkJCWV4ZWNfYnVpbHRpbigmbm9tbXVfc2F2ZS0+YXJndl9mcm9tX3JlX2V4ZWNpbmcsIHgsIGFyZ3YpOworCQl9CisJfQorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCS8qIENoZWNrIGlmIHRoZSBjb21tYW5kIG1hdGNoZXMgYW55IGZ1bmN0aW9ucyAqLworCXsKKwkJY29uc3Qgc3RydWN0IGZ1bmN0aW9uICpmdW5jcCA9IGZpbmRfZnVuY3Rpb24oYXJndlswXSk7CisJCWlmIChmdW5jcCkgeworCQkJZXhlY19mdW5jdGlvbigmbm9tbXVfc2F2ZS0+YXJndl9mcm9tX3JlX2V4ZWNpbmcsIGZ1bmNwLCBhcmd2KTsKKwkJfQorCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorCS8qIENoZWNrIGlmIHRoZSBjb21tYW5kIG1hdGNoZXMgYW55IGJ1c3lib3ggYXBwbGV0cyAqLworCXsKKwkJaW50IGEgPSBmaW5kX2FwcGxldF9ieV9uYW1lKGFyZ3ZbMF0pOworCQlpZiAoYSA+PSAwKSB7CisjIGlmIEJCX01NVSAvKiBzZWUgYWJvdmUgd2h5IG9uIE5PTU1VIGl0IGlzIG5vdCBhbGxvd2VkICovCisJCQlpZiAoQVBQTEVUX0lTX05PRVhFQyhhKSkgeworCQkJCWRlYnVnX3ByaW50Zl9leGVjKCJydW5uaW5nIGFwcGxldCAnJXMnXG4iLCBhcmd2WzBdKTsKKwkJCQlydW5fYXBwbGV0X25vX2FuZF9leGl0KGEsIGFyZ3YpOworCQkJfQorIyBlbmRpZgorCQkJLyogUmUtZXhlYyBvdXJzZWx2ZXMgKi8KKwkJCWRlYnVnX3ByaW50Zl9leGVjKCJyZS1leGVjaW5nIGFwcGxldCAnJXMnXG4iLCBhcmd2WzBdKTsKKwkJCS8qIERvbid0IHByb3BhZ2F0ZSBTSUdfSUdOIHRvIHRoZSBjaGlsZCAqLworCQkJaWYgKFNQRUNJQUxfSk9CU1RPUF9TSUdTICE9IDApCisJCQkJc3dpdGNoX29mZl9zcGVjaWFsX3NpZ3MoRy5zcGVjaWFsX3NpZ19tYXNrICYgU1BFQ0lBTF9KT0JTVE9QX1NJR1MpOworCQkJZXhlY3YoYmJfYnVzeWJveF9leGVjX3BhdGgsIGFyZ3YpOworCQkJLyogSWYgdGhleSBjYWxsZWQgY2hyb290IG9yIG90aGVyd2lzZSBtYWRlIHRoZSBiaW5hcnkgbm8gbG9uZ2VyCisJCQkgKiBleGVjdXRhYmxlLCBmYWxsIHRocm91Z2ggKi8KKwkJfQorCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSB8fCBCQl9NTVUKKyBza2lwOgorI2VuZGlmCisJZXhlY3ZwX29yX2RpZShhcmd2KTsKK30KKworLyogQ2FsbGVkIGFmdGVyIFt2XWZvcmsoKSBpbiBydW5fcGlwZQorICovCitzdGF0aWMgdm9pZCBwc2V1ZG9fZXhlYyhub21tdV9zYXZlX3QgKm5vbW11X3NhdmUsCisJCXN0cnVjdCBjb21tYW5kICpjb21tYW5kLAorCQljaGFyICoqYXJndl9leHBhbmRlZCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBwc2V1ZG9fZXhlYyhub21tdV9zYXZlX3QgKm5vbW11X3NhdmUsCisJCXN0cnVjdCBjb21tYW5kICpjb21tYW5kLAorCQljaGFyICoqYXJndl9leHBhbmRlZCkKK3sKKwlpZiAoY29tbWFuZC0+YXJndikgeworCQlwc2V1ZG9fZXhlY19hcmd2KG5vbW11X3NhdmUsIGNvbW1hbmQtPmFyZ3YsCisJCQkJY29tbWFuZC0+YXNzaWdubWVudF9jbnQsIGFyZ3ZfZXhwYW5kZWQpOworCX0KKworCWlmIChjb21tYW5kLT5ncm91cCkgeworCQkvKiBDYXNlcyB3aGVuIHdlIGFyZSBoZXJlOgorCQkgKiAoIGxpc3QgKQorCQkgKiB7IGxpc3QgfSAmCisJCSAqIC4uLiB8ICggbGlzdCApIHwgLi4uCisJCSAqIC4uLiB8IHsgbGlzdCB9IHwgLi4uCisJCSAqLworI2lmIEJCX01NVQorCQlpbnQgcmNvZGU7CisJCWRlYnVnX3ByaW50Zl9leGVjKCJwc2V1ZG9fZXhlYzogcnVuX2xpc3RcbiIpOworCQlyZXNldF90cmFwc190b19kZWZhdWx0cygpOworCQlyY29kZSA9IHJ1bl9saXN0KGNvbW1hbmQtPmdyb3VwKTsKKwkJLyogT0sgdG8gbGVhayBtZW1vcnkgYnkgbm90IGNhbGxpbmcgZnJlZV9waXBlX2xpc3QsCisJCSAqIHNpbmNlIHRoaXMgcHJvY2VzcyBpcyBhYm91dCB0byBleGl0ICovCisJCV9leGl0KHJjb2RlKTsKKyNlbHNlCisJCXJlX2V4ZWN1dGVfc2hlbGwoJm5vbW11X3NhdmUtPmFyZ3ZfZnJvbV9yZV9leGVjaW5nLAorCQkJCWNvbW1hbmQtPmdyb3VwX2FzX3N0cmluZywKKwkJCQlHLmdsb2JhbF9hcmd2WzBdLAorCQkJCUcuZ2xvYmFsX2FyZ3YgKyAxLAorCQkJCU5VTEwpOworI2VuZGlmCisJfQorCisJLyogQ2FzZSB3aGVuIHdlIGFyZSBoZXJlOiAuLi4gfCA+ZmlsZSAqLworCWRlYnVnX3ByaW50Zl9leGVjKCJwc2V1ZG9fZXhlYydlZCBudWxsIGNvbW1hbmRcbiIpOworCV9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfY21kdGV4dChzdHJ1Y3QgcGlwZSAqcGkpCit7CisJY2hhciAqKmFyZ3Y7CisJY2hhciAqcDsKKwlpbnQgbGVuOworCisJLyogVGhpcyBpcyBzdWJ0bGUuIC0+Y21kdGV4dCBpcyBjcmVhdGVkIG9ubHkgb24gZmlyc3QgYmFja2dyb3VuZGluZy4KKwkgKiAoVGhpbmsgImNhdCwgPGN0cmwtej4sIGZnLCA8Y3RybC16PiwgZmcsIDxjdHJsLXo+Li4uLiIgaGVyZS4uLikKKwkgKiBPbiBzdWJzZXF1ZW50IGJnIGFyZ3YgaXMgdHJhc2hlZCwgYnV0IHdlIHdvbid0IHVzZSBpdCAqLworCWlmIChwaS0+Y21kdGV4dCkKKwkJcmV0dXJuIHBpLT5jbWR0ZXh0OworCWFyZ3YgPSBwaS0+Y21kc1swXS5hcmd2OworCWlmICghYXJndiB8fCAhYXJndlswXSkgeworCQlwaS0+Y21kdGV4dCA9IHh6YWxsb2MoMSk7CisJCXJldHVybiBwaS0+Y21kdGV4dDsKKwl9CisKKwlsZW4gPSAwOworCWRvIHsKKwkJbGVuICs9IHN0cmxlbigqYXJndikgKyAxOworCX0gd2hpbGUgKCorK2FyZ3YpOworCXAgPSB4bWFsbG9jKGxlbik7CisJcGktPmNtZHRleHQgPSBwOworCWFyZ3YgPSBwaS0+Y21kc1swXS5hcmd2OworCWRvIHsKKwkJbGVuID0gc3RybGVuKCphcmd2KTsKKwkJbWVtY3B5KHAsICphcmd2LCBsZW4pOworCQlwICs9IGxlbjsKKwkJKnArKyA9ICcgJzsKKwl9IHdoaWxlICgqKythcmd2KTsKKwlwWy0xXSA9ICdcMCc7CisJcmV0dXJuIHBpLT5jbWR0ZXh0OworfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfYmdfam9iKHN0cnVjdCBwaXBlICpwaSkKK3sKKwlzdHJ1Y3QgcGlwZSAqam9iLCAqKmpvYnA7CisJaW50IGk7CisKKwkvKiBMaW5lYXIgc2VhcmNoIGZvciB0aGUgSUQgb2YgdGhlIGpvYiB0byB1c2UgKi8KKwlwaS0+am9iaWQgPSAxOworCWZvciAoam9iID0gRy5qb2JfbGlzdDsgam9iOyBqb2IgPSBqb2ItPm5leHQpCisJCWlmIChqb2ItPmpvYmlkID49IHBpLT5qb2JpZCkKKwkJCXBpLT5qb2JpZCA9IGpvYi0+am9iaWQgKyAxOworCisJLyogQWRkIGpvYiB0byB0aGUgbGlzdCBvZiBydW5uaW5nIGpvYnMgKi8KKwlqb2JwID0gJkcuam9iX2xpc3Q7CisJd2hpbGUgKChqb2IgPSAqam9icCkgIT0gTlVMTCkKKwkJam9icCA9ICZqb2ItPm5leHQ7CisJam9iID0gKmpvYnAgPSB4bWFsbG9jKHNpemVvZigqam9iKSk7CisKKwkqam9iID0gKnBpOyAvKiBwaHlzaWNhbCBjb3B5ICovCisJam9iLT5uZXh0ID0gTlVMTDsKKwlqb2ItPmNtZHMgPSB4emFsbG9jKHNpemVvZihwaS0+Y21kc1swXSkgKiBwaS0+bnVtX2NtZHMpOworCS8qIENhbm5vdCBjb3B5IGVudGlyZSBwaS0+Y21kc1tdIHZlY3RvciEgVGhpcyBjYXVzZXMgZG91YmxlIGZyZWVzICovCisJZm9yIChpID0gMDsgaSA8IHBpLT5udW1fY21kczsgaSsrKSB7CisJCWpvYi0+Y21kc1tpXS5waWQgPSBwaS0+Y21kc1tpXS5waWQ7CisJCS8qIGFsbCBvdGhlciBmaWVsZHMgYXJlIG5vdCB1c2VkIGFuZCBzdGF5IHplcm8gKi8KKwl9CisJam9iLT5jbWR0ZXh0ID0geHN0cmR1cChnZXRfY21kdGV4dChwaSkpOworCisJaWYgKEdfaW50ZXJhY3RpdmVfZmQpCisJCXByaW50ZigiWyVkXSAlZCAlc1xuIiwgam9iLT5qb2JpZCwgam9iLT5jbWRzWzBdLnBpZCwgam9iLT5jbWR0ZXh0KTsKKwlHLmxhc3Rfam9iaWQgPSBqb2ItPmpvYmlkOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfYmdfam9iKHN0cnVjdCBwaXBlICpwaSkKK3sKKwlzdHJ1Y3QgcGlwZSAqcHJldl9waXBlOworCisJaWYgKHBpID09IEcuam9iX2xpc3QpIHsKKwkJRy5qb2JfbGlzdCA9IHBpLT5uZXh0OworCX0gZWxzZSB7CisJCXByZXZfcGlwZSA9IEcuam9iX2xpc3Q7CisJCXdoaWxlIChwcmV2X3BpcGUtPm5leHQgIT0gcGkpCisJCQlwcmV2X3BpcGUgPSBwcmV2X3BpcGUtPm5leHQ7CisJCXByZXZfcGlwZS0+bmV4dCA9IHBpLT5uZXh0OworCX0KKwlpZiAoRy5qb2JfbGlzdCkKKwkJRy5sYXN0X2pvYmlkID0gRy5qb2JfbGlzdC0+am9iaWQ7CisJZWxzZQorCQlHLmxhc3Rfam9iaWQgPSAwOworfQorCisvKiBSZW1vdmUgYSBiYWNrZ3JvdW5kZWQgam9iICovCitzdGF0aWMgdm9pZCBkZWxldGVfZmluaXNoZWRfYmdfam9iKHN0cnVjdCBwaXBlICpwaSkKK3sKKwlyZW1vdmVfYmdfam9iKHBpKTsKKwlmcmVlX3BpcGUocGkpOworfQorI2VuZGlmIC8qIEpPQiAqLworCisvKiBDaGVjayB0byBzZWUgaWYgYW55IHByb2Nlc3NlcyBoYXZlIGV4aXRlZCAtLSBpZiB0aGV5CisgKiBoYXZlLCBmaWd1cmUgb3V0IHdoeSBhbmQgc2VlIGlmIGEgam9iIGhhcyBjb21wbGV0ZWQgKi8KK3N0YXRpYyBpbnQgY2hlY2tqb2JzKHN0cnVjdCBwaXBlICpmZ19waXBlKQoreworCWludCBhdHRyaWJ1dGVzOworCWludCBzdGF0dXM7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJc3RydWN0IHBpcGUgKnBpOworI2VuZGlmCisJcGlkX3QgY2hpbGRwaWQ7CisJaW50IHJjb2RlID0gMDsKKworCWRlYnVnX3ByaW50Zl9qb2JzKCJjaGVja2pvYnMgJXBcbiIsIGZnX3BpcGUpOworCisJYXR0cmlidXRlcyA9IFdVTlRSQUNFRDsKKwlpZiAoZmdfcGlwZSA9PSBOVUxMKQorCQlhdHRyaWJ1dGVzIHw9IFdOT0hBTkc7CisKKwllcnJubyA9IDA7CisjaWYgRU5BQkxFX0hVU0hfRkFTVAorCWlmIChHLmhhbmRsZWRfU0lHQ0hMRCA9PSBHLmNvdW50X1NJR0NITEQpIHsKKy8vYmJfZXJyb3JfbXNnKCJbJWRdIGNoZWNram9iczogRy5jb3VudF9TSUdDSExEOiVkIEcuaGFuZGxlZF9TSUdDSExEOiVkIGNoaWxkcmVuPzolZCBmZ19waXBlOiVwIiwKKy8vZ2V0cGlkKCksIEcuY291bnRfU0lHQ0hMRCwgRy5oYW5kbGVkX1NJR0NITEQsIEcud2VfaGF2ZV9jaGlsZHJlbiwgZmdfcGlwZSk7CisJCS8qIFRoZXJlIHdhcyBuZWl0aGVyIGZvcmsgbm9yIFNJR0NITEQgc2luY2UgbGFzdCB3YWl0cGlkICovCisJCS8qIEF2b2lkIGRvaW5nIHdhaXRwaWQgc3lzY2FsbCBpZiBwb3NzaWJsZSAqLworCQlpZiAoIUcud2VfaGF2ZV9jaGlsZHJlbikgeworCQkJZXJybm8gPSBFQ0hJTEQ7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGZnX3BpcGUgPT0gTlVMTCkgeyAvKiBpcyBXTk9IQU5HIHNldD8gKi8KKwkJCS8qIFdlIGhhdmUgY2hpbGRyZW4sIGJ1dCB0aGV5IGRpZCBub3QgZXhpdAorCQkJICogb3Igc3RvcCB5ZXQgKHdlIHNhdyBubyBTSUdDSExEKSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogZWxzZTogIVdOT0hBTkcsIHdhaXRwaWQgd2lsbCBibG9jaywgY2FuJ3Qgc2hvcnQtY2lyY3VpdCAqLworCX0KKyNlbmRpZgorCisvKiBEbyB3ZSBkbyB0aGlzIHJpZ2h0PworICogYmFzaC0zLjAwIyBzbGVlcCAyMCB8IGZhbHNlCisgKiA8Y3RybC1aIHByZXNzZWQ+CisgKiBbM10rICBTdG9wcGVkICAgICAgICAgIHNsZWVwIDIwIHwgZmFsc2UKKyAqIGJhc2gtMy4wMCMgZWNobyAkPworICogMSAgIDw9PT09PT09PT09IGJnIHBpcGUgaXMgbm90IGZ1bGx5IGRvbmUsIGJ1dCBleGl0Y29kZSBpcyBhbHJlYWR5IGtub3duIQorICogW2h1c2ggMS4xNC4wOiB5ZXMgd2UgZG8gaXQgcmlnaHRdCisgKi8KKyB3YWl0X21vcmU6CisJd2hpbGUgKDEpIHsKKwkJaW50IGk7CisJCWludCBkZWFkOworCisjaWYgRU5BQkxFX0hVU0hfRkFTVAorCQlpID0gRy5jb3VudF9TSUdDSExEOworI2VuZGlmCisJCWNoaWxkcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgYXR0cmlidXRlcyk7CisJCWlmIChjaGlsZHBpZCA8PSAwKSB7CisJCQlpZiAoY2hpbGRwaWQgJiYgZXJybm8gIT0gRUNISUxEKQorCQkJCWJiX3BlcnJvcl9tc2coIndhaXRwaWQiKTsKKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJCQllbHNlIHsgLyogVW50aWwgbmV4dCBTSUdDSExELCB3YWl0cGlkJ3MgYXJlIHVzZWxlc3MgKi8KKwkJCQlHLndlX2hhdmVfY2hpbGRyZW4gPSAoY2hpbGRwaWQgPT0gMCk7CisJCQkJRy5oYW5kbGVkX1NJR0NITEQgPSBpOworLy9iYl9lcnJvcl9tc2coIlslZF0gY2hlY2tqb2JzOiB3YWl0cGlkIHJldHVybmVkIDw9IDAsIEcuY291bnRfU0lHQ0hMRDolZCBHLmhhbmRsZWRfU0lHQ0hMRDolZCIsIGdldHBpZCgpLCBHLmNvdW50X1NJR0NITEQsIEcuaGFuZGxlZF9TSUdDSExEKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJZGVhZCA9IFdJRkVYSVRFRChzdGF0dXMpIHx8IFdJRlNJR05BTEVEKHN0YXR1cyk7CisKKyNpZiBERUJVR19KT0JTCisJCWlmIChXSUZTVE9QUEVEKHN0YXR1cykpCisJCQlkZWJ1Z19wcmludGZfam9icygicGlkICVkIHN0b3BwZWQgYnkgc2lnICVkIChleGl0Y29kZSAlZClcbiIsCisJCQkJCWNoaWxkcGlkLCBXU1RPUFNJRyhzdGF0dXMpLCBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKKwkJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQlkZWJ1Z19wcmludGZfam9icygicGlkICVkIGtpbGxlZCBieSBzaWcgJWQgKGV4aXRjb2RlICVkKVxuIiwKKwkJCQkJY2hpbGRwaWQsIFdURVJNU0lHKHN0YXR1cyksIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQlpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJCQlkZWJ1Z19wcmludGZfam9icygicGlkICVkIGV4aXRlZCwgZXhpdGNvZGUgJWRcbiIsCisJCQkJCWNoaWxkcGlkLCBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKKyNlbmRpZgorCQkvKiBXZXJlIHdlIGFza2VkIHRvIHdhaXQgZm9yIGZnIHBpcGU/ICovCisJCWlmIChmZ19waXBlKSB7CisJCQlpID0gZmdfcGlwZS0+bnVtX2NtZHM7CisJCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCQlkZWJ1Z19wcmludGZfam9icygiY2hlY2sgcGlkICVkXG4iLCBmZ19waXBlLT5jbWRzW2ldLnBpZCk7CisJCQkJaWYgKGZnX3BpcGUtPmNtZHNbaV0ucGlkICE9IGNoaWxkcGlkKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoZGVhZCkgeworCQkJCQlpbnQgZXg7CisJCQkJCWZnX3BpcGUtPmNtZHNbaV0ucGlkID0gMDsKKwkJCQkJZmdfcGlwZS0+YWxpdmVfY21kcy0tOworCQkJCQlleCA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJCQkJCS8qIGJhc2ggcHJpbnRzIGtpbGxlciBzaWduYWwncyBuYW1lIGZvciAqbGFzdCoKKwkJCQkJICogcHJvY2VzcyBpbiBwaXBlIChwcmludHMganVzdCBuZXdsaW5lIGZvciBTSUdJTlQvU0lHUElQRSkuCisJCQkJCSAqIE1pbWljIHRoaXMuIEV4YW1wbGU6ICJzbGVlcCA1IiArICheXCBvciBraWxsIC1RVUlUKQorCQkJCQkgKi8KKwkJCQkJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKKwkJCQkJCWludCBzaWcgPSBXVEVSTVNJRyhzdGF0dXMpOworCQkJCQkJaWYgKGkgPT0gZmdfcGlwZS0+bnVtX2NtZHMtMSkKKwkJCQkJCQkvKiBUT0RPOiB1c2Ugc3Ryc2lnbmFsKCkgaW5zdGVhZCBmb3IgYmFzaCBjb21wYXQ/IGJ1dCB0aGF0J3MgYmxvYXQuLi4gKi8KKwkJCQkJCQlwcmludGYoIiVzXG4iLCBzaWcgPT0gU0lHSU5UIHx8IHNpZyA9PSBTSUdQSVBFID8gIiIgOiBnZXRfc2lnbmFtZShzaWcpKTsKKwkJCQkJCS8qIFRPRE86IGlmIChXQ09SRURVTVAoc3RhdHVzKSkgKyAiIChjb3JlIGR1bXBlZCkiOyAqLworCQkJCQkJLyogVE9ETzogTUlQUyBoYXMgMTI4IHNpZ3MgKDEuLjEyOCksIHdoYXQgaWYgc2lnPT0xMjggaGVyZT8KKwkJCQkJCSAqIE1heWJlIHdlIG5lZWQgdG8gdXNlIHNpZyB8IDEyOD8gKi8KKwkJCQkJCWV4ID0gc2lnICsgMTI4OworCQkJCQl9CisJCQkJCWZnX3BpcGUtPmNtZHNbaV0uY21kX2V4aXRjb2RlID0gZXg7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmdfcGlwZS0+Y21kc1tpXS5pc19zdG9wcGVkID0gMTsKKwkJCQkJZmdfcGlwZS0+c3RvcHBlZF9jbWRzKys7CisJCQkJfQorCQkJCWRlYnVnX3ByaW50Zl9qb2JzKCJmZ19waXBlOiBhbGl2ZV9jbWRzICVkIHN0b3BwZWRfY21kcyAlZFxuIiwKKwkJCQkJCWZnX3BpcGUtPmFsaXZlX2NtZHMsIGZnX3BpcGUtPnN0b3BwZWRfY21kcyk7CisJCQkJaWYgKGZnX3BpcGUtPmFsaXZlX2NtZHMgPT0gZmdfcGlwZS0+c3RvcHBlZF9jbWRzKSB7CisJCQkJCS8qIEFsbCBwcm9jZXNzZXMgaW4gZmcgcGlwZSBoYXZlIGV4aXRlZCBvciBzdG9wcGVkICovCisJCQkJCWkgPSBmZ19waXBlLT5udW1fY21kczsKKwkJCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJCQlyY29kZSA9IGZnX3BpcGUtPmNtZHNbaV0uY21kX2V4aXRjb2RlOworCQkJCQkJLyogdXN1YWxseSBsYXN0IHByb2Nlc3MgZ2l2ZXMgb3ZlcmFsbCBleGl0c3RhdHVzLAorCQkJCQkJICogYnV0IHdpdGggInNldCAtbyBwaXBlZmFpbCIsIGxhc3QgKmZhaWxlZCogcHJvY2VzcyBkb2VzICovCisJCQkJCQlpZiAoRy5vX29wdFtPUFRfT19QSVBFRkFJTF0gPT0gMCB8fCByY29kZSAhPSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCUlGX0hBU19LRVlXT1JEUyhpZiAoZmdfcGlwZS0+cGlfaW52ZXJ0ZWQpIHJjb2RlID0gIXJjb2RlOykKKy8qIE5vdGU6ICpub24taW50ZXJhY3RpdmUqIGJhc2ggZG9lcyBub3QgY29udGludWUgaWYgYWxsIHByb2Nlc3NlcyBpbiBmZyBwaXBlCisgKiBhcmUgc3RvcHBlZC4gVGVzdGNhc2U6ICJjYXQgfCBjYXQiIGluIGEgc2NyaXB0IChub3Qgb24gY29tbWFuZCBsaW5lISkKKyAqIGFuZCAia2lsbGFsbCAtU1RPUCBjYXQiICovCisJCQkJCWlmIChHX2ludGVyYWN0aXZlX2ZkKSB7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCQkJCQlpZiAoZmdfcGlwZS0+YWxpdmVfY21kcyAhPSAwKQorCQkJCQkJCWluc2VydF9iZ19qb2IoZmdfcGlwZSk7CisjZW5kaWYKKwkJCQkJCXJldHVybiByY29kZTsKKwkJCQkJfQorCQkJCQlpZiAoZmdfcGlwZS0+YWxpdmVfY21kcyA9PSAwKQorCQkJCQkJcmV0dXJuIHJjb2RlOworCQkJCX0KKwkJCQkvKiBUaGVyZSBhcmUgc3RpbGwgcnVubmluZyBwcm9jZXNzZXMgaW4gdGhlIGZnIHBpcGUgKi8KKwkJCQlnb3RvIHdhaXRfbW9yZTsgLyogZG8gd2FpdHBpZCBhZ2FpbiAqLworCQkJfQorCQkJLyogaXQgd2FzbnQgZmdfcGlwZSwgbG9vayBmb3IgcHJvY2VzcyBpbiBiZyBwaXBlcyAqLworCQl9CisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJLyogV2UgYXNrZWQgdG8gd2FpdCBmb3IgYmcgb3Igb3JwaGFuZWQgY2hpbGRyZW4gKi8KKwkJLyogTm8gbmVlZCB0byByZW1lbWJlciBleGl0Y29kZSBpbiB0aGlzIGNhc2UgKi8KKwkJZm9yIChwaSA9IEcuam9iX2xpc3Q7IHBpOyBwaSA9IHBpLT5uZXh0KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcGktPm51bV9jbWRzOyBpKyspIHsKKwkJCQlpZiAocGktPmNtZHNbaV0ucGlkID09IGNoaWxkcGlkKQorCQkJCQlnb3RvIGZvdW5kX3BpX2FuZF9wcm9nbnVtOworCQkJfQorCQl9CisJCS8qIEhhcHBlbnMgd2hlbiBzaGVsbCBpcyB1c2VkIGFzIGluaXQgcHJvY2VzcyAoaW5pdD0vYmluL3NoKSAqLworCQlkZWJ1Z19wcmludGYoImNoZWNram9iczogcGlkICVkIHdhcyBub3QgaW4gb3VyIGxpc3QhXG4iLCBjaGlsZHBpZCk7CisJCWNvbnRpbnVlOyAvKiBkbyB3YWl0cGlkIGFnYWluICovCisKKyBmb3VuZF9waV9hbmRfcHJvZ251bToKKwkJaWYgKGRlYWQpIHsKKwkJCS8qIGNoaWxkIGV4aXRlZCAqLworCQkJcGktPmNtZHNbaV0ucGlkID0gMDsKKwkJCXBpLT5hbGl2ZV9jbWRzLS07CisJCQlpZiAoIXBpLT5hbGl2ZV9jbWRzKSB7CisJCQkJaWYgKEdfaW50ZXJhY3RpdmVfZmQpCisJCQkJCXByaW50ZihKT0JfU1RBVFVTX0ZPUk1BVCwgcGktPmpvYmlkLAorCQkJCQkJCSJEb25lIiwgcGktPmNtZHRleHQpOworCQkJCWRlbGV0ZV9maW5pc2hlZF9iZ19qb2IocGkpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogY2hpbGQgc3RvcHBlZCAqLworCQkJcGktPmNtZHNbaV0uaXNfc3RvcHBlZCA9IDE7CisJCQlwaS0+c3RvcHBlZF9jbWRzKys7CisJCX0KKyNlbmRpZgorCX0gLyogd2hpbGUgKHdhaXRwaWQgc3VjY2VlZHMpLi4uICovCisKKwlyZXR1cm4gcmNvZGU7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKK3N0YXRpYyBpbnQgY2hlY2tqb2JzX2FuZF9mZ19zaGVsbChzdHJ1Y3QgcGlwZSAqZmdfcGlwZSkKK3sKKwlwaWRfdCBwOworCWludCByY29kZSA9IGNoZWNram9icyhmZ19waXBlKTsKKwlpZiAoR19zYXZlZF90dHlfcGdycCkgeworCQkvKiBKb2IgZmluaXNoZWQsIG1vdmUgdGhlIHNoZWxsIHRvIHRoZSBmb3JlZ3JvdW5kICovCisJCXAgPSBnZXRwZ3JwKCk7IC8qIG91ciBwcm9jZXNzIGdyb3VwIGlkICovCisJCWRlYnVnX3ByaW50Zl9qb2JzKCJmZydpbmcgb3Vyc2VsZjogZ2V0cGdycCgpPSVkXG4iLCAoaW50KXApOworCQl0Y3NldHBncnAoR19pbnRlcmFjdGl2ZV9mZCwgcCk7CisJfQorCXJldHVybiByY29kZTsKK30KKyNlbmRpZgorCisvKiBTdGFydCBhbGwgdGhlIGpvYnMsIGJ1dCBkb24ndCB3YWl0IGZvciBhbnl0aGluZyB0byBmaW5pc2guCisgKiBTZWUgY2hlY2tqb2JzKCkuCisgKgorICogUmV0dXJuIGNvZGUgaXMgbm9ybWFsbHkgLTEsIHdoZW4gdGhlIGNhbGxlciBoYXMgdG8gd2FpdCBmb3IgY2hpbGRyZW4KKyAqIHRvIGZpbmlzaCB0byBkZXRlcm1pbmUgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBwaXBlLiAgSWYgdGhlIHBpcGUKKyAqIGlzIGEgc2ltcGxlIGJ1aWx0aW4gY29tbWFuZCwgaG93ZXZlciwgdGhlIGFjdGlvbiBpcyBkb25lIGJ5IHRoZQorICogdGltZSBydW5fcGlwZSByZXR1cm5zLCBhbmQgdGhlIGV4aXQgY29kZSBpcyBwcm92aWRlZCBhcyB0aGUKKyAqIHJldHVybiB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zIC0xIG9ubHkgaWYgc3RhcnRlZCBzb21lIGNoaWxkcmVuLiBJT1c6IHdlIGhhdmUgdG8KKyAqIG1hc2sgb3V0IHJldHZhbHMgb2YgYnVpbHRpbnMgZXRjIHdpdGggMHhmZiEKKyAqCisgKiBUaGUgb25seSBjYXNlIHdoZW4gd2UgZG8gbm90IG5lZWQgdG8gW3ZdZm9yayBpcyB3aGVuIHRoZSBwaXBlCisgKiBpcyBzaW5nbGUsIG5vbi1iYWNrZ3JvdW5kZWQsIG5vbi1zdWJzaGVsbCBjb21tYW5kLiBFeGFtcGxlczoKKyAqIGNtZCA7IC4uLiAgIHsgbGlzdCB9IDsgLi4uCisgKiBjbWQgJiYgLi4uICB7IGxpc3QgfSAmJiAuLi4KKyAqIGNtZCB8fCAuLi4gIHsgbGlzdCB9IHx8IC4uLgorICogSWYgaXQgaXMsIHRoZW4gd2UgY2FuIHJ1biBjbWQgYXMgYSBidWlsdGluLCBOT0ZPUkssCisgKiBvciAoaWYgU0hfU1RBTkRBTE9ORSkgYW4gYXBwbGV0LCBhbmQgd2UgY2FuIHJ1biB0aGUgeyBsaXN0IH0KKyAqIHdpdGggcnVuX2xpc3QuIElmIGl0IGlzbid0IG9uZSBvZiB0aGVzZSwgd2UgZm9yayBhbmQgZXhlYyBjbWQuCisgKgorICogQ2FzZXMgd2hlbiB3ZSBtdXN0IGZvcms6CisgKiBub24tc2luZ2xlOiAgIGNtZCB8IGNtZAorICogYmFja2dyb3VuZGVkOiBjbWQgJiAgICAgeyBsaXN0IH0gJgorICogc3Vic2hlbGw6ICAgICAoIGxpc3QgKSBbJl0KKyAqLworI2lmICFFTkFCTEVfSFVTSF9NT0RFX1gKKyNkZWZpbmUgcmVkaXJlY3RfYW5kX3ZhcmV4cF9oZWxwZXIobmV3X2Vudl9wLCBvbGRfdmFyc19wLCBjb21tYW5kLCBzcXVpcnJlbCwgYXJndl9leHBhbmRlZCkgXAorCXJlZGlyZWN0X2FuZF92YXJleHBfaGVscGVyKG5ld19lbnZfcCwgb2xkX3ZhcnNfcCwgY29tbWFuZCwgc3F1aXJyZWwpCisjZW5kaWYKK3N0YXRpYyBpbnQgcmVkaXJlY3RfYW5kX3ZhcmV4cF9oZWxwZXIoY2hhciAqKipuZXdfZW52X3AsCisJCXN0cnVjdCB2YXJpYWJsZSAqKm9sZF92YXJzX3AsCisJCXN0cnVjdCBjb21tYW5kICpjb21tYW5kLAorCQlpbnQgc3F1aXJyZWxbM10sCisJCWNoYXIgKiphcmd2X2V4cGFuZGVkKQoreworCS8qIHNldHVwX3JlZGlyZWN0cyBhY3RzIG9uIGZpbGUgZGVzY3JpcHRvcnMsIG5vdCBGSUxFcy4KKwkgKiBUaGlzIGlzIHBlcmZlY3QgZm9yIHdvcmsgdGhhdCBjb21lcyBhZnRlciBleGVjKCkuCisJICogSXMgaXQgcmVhbGx5IHNhZmUgZm9yIGlubGluZSB1c2U/ICBFeHBlcmltZW50YWxseSwKKwkgKiB0aGluZ3Mgc2VlbSB0byB3b3JrLiAqLworCWludCByY29kZSA9IHNldHVwX3JlZGlyZWN0cyhjb21tYW5kLCBzcXVpcnJlbCk7CisJaWYgKHJjb2RlID09IDApIHsKKwkJY2hhciAqKm5ld19lbnYgPSBleHBhbmRfYXNzaWdubWVudHMoY29tbWFuZC0+YXJndiwgY29tbWFuZC0+YXNzaWdubWVudF9jbnQpOworCQkqbmV3X2Vudl9wID0gbmV3X2VudjsKKwkJZHVtcF9jbWRfaW5feF9tb2RlKG5ld19lbnYpOworCQlkdW1wX2NtZF9pbl94X21vZGUoYXJndl9leHBhbmRlZCk7CisJCWlmIChvbGRfdmFyc19wKQorCQkJKm9sZF92YXJzX3AgPSBzZXRfdmFyc19hbmRfc2F2ZV9vbGQobmV3X2Vudik7CisJfQorCXJldHVybiByY29kZTsKK30KK3N0YXRpYyBOT0lOTElORSBpbnQgcnVuX3BpcGUoc3RydWN0IHBpcGUgKnBpKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBudWxsX3B0ciA9IE5VTEw7CisKKwlpbnQgY21kX25vOworCWludCBuZXh0X2luZmQ7CisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQ7CisJY2hhciAqKmFyZ3ZfZXhwYW5kZWQ7CisJY2hhciAqKmFyZ3Y7CisJLyogaXQgaXMgbm90IGFsd2F5cyBuZWVkZWQsIGJ1dCB3ZSBhaW0gdG8gc21hbGxlciBjb2RlICovCisJaW50IHNxdWlycmVsW10gPSB7IC0xLCAtMSwgLTEgfTsKKwlpbnQgcmNvZGU7CisKKwlkZWJ1Z19wcmludGZfZXhlYygicnVuX3BpcGUgc3RhcnQ6IG1lbWJlcnM6JWRcbiIsIHBpLT5udW1fY21kcyk7CisJZGVidWdfZW50ZXIoKTsKKworCS8qIFRlc3RjYXNlOiBzZXQgLS0gcSB3IGU7IChJRlM9JycgZWNobyAiJCoiOyBJRlM9Jyc7IGVjaG8gIiQqIik7IGVjaG8gIiQqIgorCSAqIFJlc3VsdCBzaG91bGQgYmUgMyBsaW5lczogcSB3IGUsIHF3ZSwgcSB3IGUKKwkgKi8KKwlHLmlmcyA9IGdldF9sb2NhbF92YXJfdmFsdWUoIklGUyIpOworCWlmICghRy5pZnMpCisJCUcuaWZzID0gZGVmaWZzOworCisJSUZfSFVTSF9KT0IocGktPnBncnAgPSAtMTspCisJcGktPnN0b3BwZWRfY21kcyA9IDA7CisJY29tbWFuZCA9ICZwaS0+Y21kc1swXTsKKwlhcmd2X2V4cGFuZGVkID0gTlVMTDsKKworCWlmIChwaS0+bnVtX2NtZHMgIT0gMQorCSB8fCBwaS0+Zm9sbG93dXAgPT0gUElQRV9CRworCSB8fCBjb21tYW5kLT5jbWRfdHlwZSA9PSBDTURfU1VCU0hFTEwKKwkpIHsKKwkJZ290byBtdXN0X2Zvcms7CisJfQorCisJcGktPmFsaXZlX2NtZHMgPSAxOworCisJZGVidWdfcHJpbnRmX2V4ZWMoIjogZ3JvdXA6JXAgYXJndjonJXMnXG4iLAorCQljb21tYW5kLT5ncm91cCwgY29tbWFuZC0+YXJndiA/IGNvbW1hbmQtPmFyZ3ZbMF0gOiAiTk9ORSIpOworCisJaWYgKGNvbW1hbmQtPmdyb3VwKSB7CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCWlmIChjb21tYW5kLT5jbWRfdHlwZSA9PSBDTURfRlVOQ0RFRikgeworCQkJLyogImV4ZWN1dGluZyIgZnVuYyAoKSB7IGxpc3QgfSAqLworCQkJc3RydWN0IGZ1bmN0aW9uICpmdW5jcDsKKworCQkJZnVuY3AgPSBuZXdfZnVuY3Rpb24oY29tbWFuZC0+YXJndlswXSk7CisJCQkvKiBmdW5jcC0+bmFtZSBpcyBhbHJlYWR5IHNldCB0byBhcmd2WzBdICovCisJCQlmdW5jcC0+Ym9keSA9IGNvbW1hbmQtPmdyb3VwOworIyBpZiAhQkJfTU1VCisJCQlmdW5jcC0+Ym9keV9hc19zdHJpbmcgPSBjb21tYW5kLT5ncm91cF9hc19zdHJpbmc7CisJCQljb21tYW5kLT5ncm91cF9hc19zdHJpbmcgPSBOVUxMOworIyBlbmRpZgorCQkJY29tbWFuZC0+Z3JvdXAgPSBOVUxMOworCQkJY29tbWFuZC0+YXJndlswXSA9IE5VTEw7CisJCQlkZWJ1Z19wcmludGZfZXhlYygiY21kICVwIGhhcyBjaGlsZCBmdW5jIGF0ICVwXG4iLCBjb21tYW5kLCBmdW5jcCk7CisJCQlmdW5jcC0+cGFyZW50X2NtZCA9IGNvbW1hbmQ7CisJCQljb21tYW5kLT5jaGlsZF9mdW5jID0gZnVuY3A7CisKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fcGlwZTogcmV0dXJuIEVYSVRfU1VDQ0VTU1xuIik7CisJCQlkZWJ1Z19sZWF2ZSgpOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorI2VuZGlmCisJCS8qIHsgbGlzdCB9ICovCisJCWRlYnVnX3ByaW50Zigibm9uLXN1YnNoZWxsIGdyb3VwXG4iKTsKKwkJcmNvZGUgPSAxOyAvKiBleGl0Y29kZSBpZiByZWRpciBmYWlsZWQgKi8KKwkJaWYgKHNldHVwX3JlZGlyZWN0cyhjb21tYW5kLCBzcXVpcnJlbCkgPT0gMCkgeworCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogcnVuX2xpc3RcbiIpOworCQkJcmNvZGUgPSBydW5fbGlzdChjb21tYW5kLT5ncm91cCkgJiAweGZmOworCQl9CisJCXJlc3RvcmVfcmVkaXJlY3RzKHNxdWlycmVsKTsKKwkJSUZfSEFTX0tFWVdPUkRTKGlmIChwaS0+cGlfaW52ZXJ0ZWQpIHJjb2RlID0gIXJjb2RlOykKKwkJZGVidWdfbGVhdmUoKTsKKwkJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9waXBlOiByZXR1cm4gJWRcbiIsIHJjb2RlKTsKKwkJcmV0dXJuIHJjb2RlOworCX0KKworCWFyZ3YgPSBjb21tYW5kLT5hcmd2ID8gY29tbWFuZC0+YXJndiA6IChjaGFyICoqKSAmbnVsbF9wdHI7CisJeworCQljb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqeDsKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJY29uc3Qgc3RydWN0IGZ1bmN0aW9uICpmdW5jcDsKKyNlbHNlCisJCWVudW0geyBmdW5jcCA9IDAgfTsKKyNlbmRpZgorCQljaGFyICoqbmV3X2VudiA9IE5VTEw7CisJCXN0cnVjdCB2YXJpYWJsZSAqb2xkX3ZhcnMgPSBOVUxMOworCisJCWlmIChhcmd2W2NvbW1hbmQtPmFzc2lnbm1lbnRfY250XSA9PSBOVUxMKSB7CisJCQkvKiBBc3NpZ25tZW50cywgYnV0IG5vIGNvbW1hbmQgKi8KKwkJCS8qIEVuc3VyZSByZWRpcmVjdHMgdGFrZSBlZmZlY3QgKHRoYXQgaXMsIGNyZWF0ZSBmaWxlcykuCisJCQkgKiBUcnkgImE9dCA+ZmlsZSIgKi8KKyNpZiAwIC8qIEEgZmV3IGNhc2VzIGluIHRlc3RzdWl0ZSBmYWlsIHdpdGggdGhpcyBjb2RlLiBGSVhNRSAqLworCQkJcmNvZGUgPSByZWRpcmVjdF9hbmRfdmFyZXhwX2hlbHBlcigmbmV3X2VudiwgLypvbGRfdmFyczoqLyBOVUxMLCBjb21tYW5kLCBzcXVpcnJlbCwgLyphcmd2X2V4cGFuZGVkOiovIE5VTEwpOworCQkJLyogU2V0IHNoZWxsIHZhcmlhYmxlcyAqLworCQkJaWYgKG5ld19lbnYpIHsKKwkJCQlhcmd2ID0gbmV3X2VudjsKKwkJCQl3aGlsZSAoKmFyZ3YpIHsKKwkJCQkJc2V0X2xvY2FsX3ZhcigqYXJndiwgLypleHA6Ki8gMCwgLypsdmw6Ki8gMCwgLypybzoqLyAwKTsKKwkJCQkJLyogRG8gd2UgbmVlZCB0byBmbGFnIHNldF9sb2NhbF92YXIoKSBlcnJvcnM/CisJCQkJCSAqICJhc3NpZ25tZW50IHRvIHJlYWRvbmx5IHZhciIgYW5kICJwdXRlbnYgZXJyb3IiCisJCQkJCSAqLworCQkJCQlhcmd2Kys7CisJCQkJfQorCQkJfQorCQkJLyogUmVkaXJlY3QgZXJyb3Igc2V0cyAkPyB0byAxLiBPdGhlcndpc2UsCisJCQkgKiBpZiBldmFsdWF0aW5nIGFzc2lnbm1lbnQgdmFsdWUgc2V0ICQ/LCByZXRhaW4gaXQuCisJCQkgKiBUcnkgImZhbHNlOyBxPWBleGl0IDJgOyBlY2hvICQ/IiAtIHNob3VsZCBwcmludCAyOiAqLworCQkJaWYgKHJjb2RlID09IDApCisJCQkJcmNvZGUgPSBHLmxhc3RfZXhpdGNvZGU7CisJCQkvKiBFeGl0LCBfc2tpcHBpbmdfIHZhcmlhYmxlIHJlc3RvcmluZyBjb2RlOiAqLworCQkJZ290byBjbGVhbl91cF9hbmRfcmV0MDsKKworI2Vsc2UgLyogT2xkZXIsIGJpZ2dlciwgYnV0IG1vcmUgY29ycmVjdCBjb2RlICovCisKKwkJCXJjb2RlID0gc2V0dXBfcmVkaXJlY3RzKGNvbW1hbmQsIHNxdWlycmVsKTsKKwkJCXJlc3RvcmVfcmVkaXJlY3RzKHNxdWlycmVsKTsKKwkJCS8qIFNldCBzaGVsbCB2YXJpYWJsZXMgKi8KKwkJCWlmIChHX3hfbW9kZSkKKwkJCQliYl9wdXRjaGFyX3N0ZGVycignKycpOworCQkJd2hpbGUgKCphcmd2KSB7CisJCQkJY2hhciAqcCA9IGV4cGFuZF9zdHJpbmdfdG9fc3RyaW5nKCphcmd2LCAvKnVuYmFja3NsYXNoOiovIDEpOworCQkJCWlmIChHX3hfbW9kZSkKKwkJCQkJZnByaW50ZihzdGRlcnIsICIgJXMiLCBwKTsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygic2V0IHNoZWxsIHZhcjonJXMnLT4nJXMnXG4iLAorCQkJCQkJKmFyZ3YsIHApOworCQkJCXNldF9sb2NhbF92YXIocCwgLypleHA6Ki8gMCwgLypsdmw6Ki8gMCwgLypybzoqLyAwKTsKKwkJCQkvKiBEbyB3ZSBuZWVkIHRvIGZsYWcgc2V0X2xvY2FsX3ZhcigpIGVycm9ycz8KKwkJCQkgKiAiYXNzaWdubWVudCB0byByZWFkb25seSB2YXIiIGFuZCAicHV0ZW52IGVycm9yIgorCQkJCSAqLworCQkJCWFyZ3YrKzsKKwkJCX0KKwkJCWlmIChHX3hfbW9kZSkKKwkJCQliYl9wdXRjaGFyX3N0ZGVycignXG4nKTsKKwkJCS8qIFJlZGlyZWN0IGVycm9yIHNldHMgJD8gdG8gMS4gT3RoZXJ3aXNlLAorCQkJICogaWYgZXZhbHVhdGluZyBhc3NpZ25tZW50IHZhbHVlIHNldCAkPywgcmV0YWluIGl0LgorCQkJICogVHJ5ICJmYWxzZTsgcT1gZXhpdCAyYDsgZWNobyAkPyIgLSBzaG91bGQgcHJpbnQgMjogKi8KKwkJCWlmIChyY29kZSA9PSAwKQorCQkJCXJjb2RlID0gRy5sYXN0X2V4aXRjb2RlOworCQkJSUZfSEFTX0tFWVdPUkRTKGlmIChwaS0+cGlfaW52ZXJ0ZWQpIHJjb2RlID0gIXJjb2RlOykKKwkJCWRlYnVnX2xlYXZlKCk7CisJCQlkZWJ1Z19wcmludGZfZXhlYygicnVuX3BpcGU6IHJldHVybiAlZFxuIiwgcmNvZGUpOworCQkJcmV0dXJuIHJjb2RlOworI2VuZGlmCisJCX0KKworCQkvKiBFeHBhbmQgdGhlIHJlc3QgaW50byAocG9zc2libHkpIG1hbnkgc3RyaW5ncyBlYWNoICovCisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwkJaWYgKGNvbW1hbmQtPmNtZF90eXBlID09IENNRF9TSU5HTEVXT1JEX05PR0xPQikgeworCQkJYXJndl9leHBhbmRlZCA9IGV4cGFuZF9zdHJ2ZWNfdG9fc3RydmVjX3NpbmdsZXdvcmRfbm9nbG9iKGFyZ3YgKyBjb21tYW5kLT5hc3NpZ25tZW50X2NudCk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCWFyZ3ZfZXhwYW5kZWQgPSBleHBhbmRfc3RydmVjX3RvX3N0cnZlYyhhcmd2ICsgY29tbWFuZC0+YXNzaWdubWVudF9jbnQpOworCQl9CisKKwkJLyogaWYgc29tZW9uZSBnaXZlcyB1cyBhbiBlbXB0eSBzdHJpbmc6IGBjbWQgd2l0aCBlbXB0eSBvdXRwdXRgICovCisJCWlmICghYXJndl9leHBhbmRlZFswXSkgeworCQkJZnJlZShhcmd2X2V4cGFuZGVkKTsKKwkJCWRlYnVnX2xlYXZlKCk7CisJCQlyZXR1cm4gRy5sYXN0X2V4aXRjb2RlOworCQl9CisKKwkJeCA9IGZpbmRfYnVpbHRpbihhcmd2X2V4cGFuZGVkWzBdKTsKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJZnVuY3AgPSBOVUxMOworCQlpZiAoIXgpCisJCQlmdW5jcCA9IGZpbmRfZnVuY3Rpb24oYXJndl9leHBhbmRlZFswXSk7CisjZW5kaWYKKwkJaWYgKHggfHwgZnVuY3ApIHsKKwkJCWlmICghZnVuY3ApIHsKKwkJCQlpZiAoeC0+Yl9mdW5jdGlvbiA9PSBidWlsdGluX2V4ZWMgJiYgYXJndl9leHBhbmRlZFsxXSA9PSBOVUxMKSB7CisJCQkJCWRlYnVnX3ByaW50ZigiZXhlYyB3aXRoIHJlZGlyZWN0cyBvbmx5XG4iKTsKKwkJCQkJcmNvZGUgPSBzZXR1cF9yZWRpcmVjdHMoY29tbWFuZCwgTlVMTCk7CisJCQkJCWdvdG8gY2xlYW5fdXBfYW5kX3JldDE7CisJCQkJfQorCQkJfQorCQkJcmNvZGUgPSByZWRpcmVjdF9hbmRfdmFyZXhwX2hlbHBlcigmbmV3X2VudiwgJm9sZF92YXJzLCBjb21tYW5kLCBzcXVpcnJlbCwgYXJndl9leHBhbmRlZCk7CisJCQlpZiAocmNvZGUgPT0gMCkgeworCQkJCWlmICghZnVuY3ApIHsKKwkJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogYnVpbHRpbiAnJXMnICclcycuLi5cbiIsCisJCQkJCQl4LT5iX2NtZCwgYXJndl9leHBhbmRlZFsxXSk7CisJCQkJCWZmbHVzaF9hbGwoKTsKKwkJCQkJcmNvZGUgPSB4LT5iX2Z1bmN0aW9uKGFyZ3ZfZXhwYW5kZWQpICYgMHhmZjsKKwkJCQkJZmZsdXNoX2FsbCgpOworCQkJCX0KKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJCQllbHNlIHsKKyMgaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwkJCQkJc3RydWN0IHZhcmlhYmxlICoqc3Y7CisJCQkJCXN2ID0gRy5zaGFkb3dlZF92YXJzX3BwOworCQkJCQlHLnNoYWRvd2VkX3ZhcnNfcHAgPSAmb2xkX3ZhcnM7CisjIGVuZGlmCisJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IGZ1bmN0aW9uICclcycgJyVzJy4uLlxuIiwKKwkJCQkJCWZ1bmNwLT5uYW1lLCBhcmd2X2V4cGFuZGVkWzFdKTsKKwkJCQkJcmNvZGUgPSBydW5fZnVuY3Rpb24oZnVuY3AsIGFyZ3ZfZXhwYW5kZWQpICYgMHhmZjsKKyMgaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwkJCQkJRy5zaGFkb3dlZF92YXJzX3BwID0gc3Y7CisjIGVuZGlmCisJCQkJfQorI2VuZGlmCisJCQl9CisgY2xlYW5fdXBfYW5kX3JldDoKKwkJCXVuc2V0X3ZhcnMobmV3X2Vudik7CisJCQlhZGRfdmFycyhvbGRfdmFycyk7CisvKiBjbGVhbl91cF9hbmRfcmV0MDogKi8KKwkJCXJlc3RvcmVfcmVkaXJlY3RzKHNxdWlycmVsKTsKKyBjbGVhbl91cF9hbmRfcmV0MToKKwkJCWZyZWUoYXJndl9leHBhbmRlZCk7CisJCQlJRl9IQVNfS0VZV09SRFMoaWYgKHBpLT5waV9pbnZlcnRlZCkgcmNvZGUgPSAhcmNvZGU7KQorCQkJZGVidWdfbGVhdmUoKTsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fcGlwZSByZXR1cm4gJWRcbiIsIHJjb2RlKTsKKwkJCXJldHVybiByY29kZTsKKwkJfQorCisJCWlmIChFTkFCTEVfRkVBVFVSRV9TSF9OT0ZPUkspIHsKKwkJCWludCBuID0gZmluZF9hcHBsZXRfYnlfbmFtZShhcmd2X2V4cGFuZGVkWzBdKTsKKwkJCWlmIChuID49IDAgJiYgQVBQTEVUX0lTX05PRk9SSyhuKSkgeworCQkJCXJjb2RlID0gcmVkaXJlY3RfYW5kX3ZhcmV4cF9oZWxwZXIoJm5ld19lbnYsICZvbGRfdmFycywgY29tbWFuZCwgc3F1aXJyZWwsIGFyZ3ZfZXhwYW5kZWQpOworCQkJCWlmIChyY29kZSA9PSAwKSB7CisJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHJ1bl9ub2ZvcmtfYXBwbGV0ICclcycgJyVzJy4uLlxuIiwKKwkJCQkJCWFyZ3ZfZXhwYW5kZWRbMF0sIGFyZ3ZfZXhwYW5kZWRbMV0pOworCQkJCQlyY29kZSA9IHJ1bl9ub2ZvcmtfYXBwbGV0KG4sIGFyZ3ZfZXhwYW5kZWQpOworCQkJCX0KKwkJCQlnb3RvIGNsZWFuX3VwX2FuZF9yZXQ7CisJCQl9CisJCX0KKwkJLyogSXQgaXMgbmVpdGhlciBidWlsdGluIG5vciBhcHBsZXQuIFdlIG11c3QgZm9yay4gKi8KKwl9CisKKyBtdXN0X2Zvcms6CisJLyogTkI6IGFyZ3ZfZXhwYW5kZWQgbWF5IGFscmVhZHkgYmUgY3JlYXRlZCwgYW5kIHRoYXQKKwkgKiBtaWdodCBpbmNsdWRlIGBjbWRgIHJ1bnMhIERvIG5vdCByZXJ1biBpdCEgV2UgKm11c3QqCisJICogdXNlIGFyZ3ZfZXhwYW5kZWQgaWYgaXQncyBub24tTlVMTCAqLworCisJLyogR29pbmcgdG8gZm9yayBhIGNoaWxkIHBlciBlYWNoIHBpcGUgbWVtYmVyICovCisJcGktPmFsaXZlX2NtZHMgPSAwOworCW5leHRfaW5mZCA9IDA7CisKKwljbWRfbm8gPSAwOworCXdoaWxlIChjbWRfbm8gPCBwaS0+bnVtX2NtZHMpIHsKKwkJc3RydWN0IGZkX3BhaXIgcGlwZWZkczsKKyNpZiAhQkJfTU1VCisJCXZvbGF0aWxlIG5vbW11X3NhdmVfdCBub21tdV9zYXZlOworCQlub21tdV9zYXZlLm5ld19lbnYgPSBOVUxMOworCQlub21tdV9zYXZlLm9sZF92YXJzID0gTlVMTDsKKwkJbm9tbXVfc2F2ZS5hcmd2ID0gTlVMTDsKKwkJbm9tbXVfc2F2ZS5hcmd2X2Zyb21fcmVfZXhlY2luZyA9IE5VTEw7CisjZW5kaWYKKwkJY29tbWFuZCA9ICZwaS0+Y21kc1tjbWRfbm9dOworCQljbWRfbm8rKzsKKwkJaWYgKGNvbW1hbmQtPmFyZ3YpIHsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHBpcGUgbWVtYmVyICclcycgJyVzJy4uLlxuIiwKKwkJCQkJY29tbWFuZC0+YXJndlswXSwgY29tbWFuZC0+YXJndlsxXSk7CisJCX0gZWxzZSB7CisJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBwaXBlIG1lbWJlciB3aXRoIG5vIGFyZ3ZcbiIpOworCQl9CisKKwkJLyogcGlwZXMgYXJlIGluc2VydGVkIGJldHdlZW4gcGFpcnMgb2YgY29tbWFuZHMgKi8KKwkJcGlwZWZkcy5yZCA9IDA7CisJCXBpcGVmZHMud3IgPSAxOworCQlpZiAoY21kX25vIDwgcGktPm51bV9jbWRzKQorCQkJeHBpcGVkX3BhaXIocGlwZWZkcyk7CisKKwkJY29tbWFuZC0+cGlkID0gQkJfTU1VID8gZm9yaygpIDogdmZvcmsoKTsKKwkJaWYgKCFjb21tYW5kLT5waWQpIHsgLyogY2hpbGQgKi8KKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJCWRpc2FibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCk7CisJCQlDTEVBUl9SQU5ET01fVCgmRy5yYW5kb21fZ2VuKTsgLyogb3IgZWxzZSAkUkFORE9NIHJlcGVhdHMgaW4gY2hpbGQgKi8KKworCQkJLyogRXZlcnkgY2hpbGQgYWRkcyBpdHNlbGYgdG8gbmV3IHByb2Nlc3MgZ3JvdXAKKwkJCSAqIHdpdGggcGdpZCA9PSBwaWRfb2ZfZmlyc3RfY2hpbGRfaW5fcGlwZSAqLworCQkJaWYgKEcucnVuX2xpc3RfbGV2ZWwgPT0gMSAmJiBHX2ludGVyYWN0aXZlX2ZkKSB7CisJCQkJcGlkX3QgcGdycDsKKwkJCQlwZ3JwID0gcGktPnBncnA7CisJCQkJaWYgKHBncnAgPCAwKSAvKiB0cnVlIGZvciAxc3QgcHJvY2VzcyBvbmx5ICovCisJCQkJCXBncnAgPSBnZXRwaWQoKTsKKwkJCQlpZiAoc2V0cGdpZCgwLCBwZ3JwKSA9PSAwCisJCQkJICYmIHBpLT5mb2xsb3d1cCAhPSBQSVBFX0JHCisJCQkJICYmIEdfc2F2ZWRfdHR5X3BncnAgLyogd2UgaGF2ZSBjdHR5ICovCisJCQkJKSB7CisJCQkJCS8qIFdlIGRvIGl0IGluICpldmVyeSogY2hpbGQsIG5vdCBqdXN0IGZpcnN0LAorCQkJCQkgKiB0byBhdm9pZCByYWNlcyAqLworCQkJCQl0Y3NldHBncnAoR19pbnRlcmFjdGl2ZV9mZCwgcGdycCk7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlpZiAocGktPmFsaXZlX2NtZHMgPT0gMCAmJiBwaS0+Zm9sbG93dXAgPT0gUElQRV9CRykgeworCQkJCS8qIDFzdCBjbWQgaW4gYmFja2dyb3VuZGVkIHBpcGUKKwkJCQkgKiBzaG91bGQgaGF2ZSBpdHMgc3RkaW4gL2Rldi9udWxsJ2VkICovCisJCQkJY2xvc2UoMCk7CisJCQkJaWYgKG9wZW4oYmJfZGV2X251bGwsIE9fUkRPTkxZKSkKKwkJCQkJeG9wZW4oIi8iLCBPX1JET05MWSk7CisJCQl9IGVsc2UgeworCQkJCXhtb3ZlX2ZkKG5leHRfaW5mZCwgMCk7CisJCQl9CisJCQl4bW92ZV9mZChwaXBlZmRzLndyLCAxKTsKKwkJCWlmIChwaXBlZmRzLnJkID4gMSkKKwkJCQljbG9zZShwaXBlZmRzLnJkKTsKKwkJCS8qIExpa2UgYmFzaCwgZXhwbGljaXQgcmVkaXJlY3RzIG92ZXJyaWRlIHBpcGVzLAorCQkJICogYW5kIHRoZSBwaXBlIGZkIGlzIGF2YWlsYWJsZSBmb3IgZHVwJ2luZy4gKi8KKwkJCWlmIChzZXR1cF9yZWRpcmVjdHMoY29tbWFuZCwgTlVMTCkpCisJCQkJX2V4aXQoMSk7CisKKwkJCS8qIFN0b3JlcyB0byBub21tdV9zYXZlIGxpc3Qgb2YgZW52IHZhcnMgcHV0ZW52J2VkCisJCQkgKiAoTk9NTVUsIG9uIE1NVSB3ZSBkb24ndCBuZWVkIHRoYXQpICovCisJCQkvKiBjYXN0IGF3YXkgdm9sYXRpbGl0eS4uLiAqLworCQkJcHNldWRvX2V4ZWMoKG5vbW11X3NhdmVfdCopICZub21tdV9zYXZlLCBjb21tYW5kLCBhcmd2X2V4cGFuZGVkKTsKKwkJCS8qIHBzZXVkb19leGVjKCkgZG9lcyBub3QgcmV0dXJuICovCisJCX0KKworCQkvKiBwYXJlbnQgb3IgZXJyb3IgKi8KKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJCUcuY291bnRfU0lHQ0hMRCsrOworLy9iYl9lcnJvcl9tc2coIlslZF0gZm9yayBpbiBydW5fcGlwZTogRy5jb3VudF9TSUdDSExEOiVkIEcuaGFuZGxlZF9TSUdDSExEOiVkIiwgZ2V0cGlkKCksIEcuY291bnRfU0lHQ0hMRCwgRy5oYW5kbGVkX1NJR0NITEQpOworI2VuZGlmCisJCWVuYWJsZV9yZXN0b3JlX3R0eV9wZ3JwX29uX2V4aXQoKTsKKyNpZiAhQkJfTU1VCisJCS8qIENsZWFuIHVwIGFmdGVyIHZmb3JrZWQgY2hpbGQgKi8KKwkJZnJlZShub21tdV9zYXZlLmFyZ3YpOworCQlmcmVlKG5vbW11X3NhdmUuYXJndl9mcm9tX3JlX2V4ZWNpbmcpOworCQl1bnNldF92YXJzKG5vbW11X3NhdmUubmV3X2Vudik7CisJCWFkZF92YXJzKG5vbW11X3NhdmUub2xkX3ZhcnMpOworI2VuZGlmCisJCWZyZWUoYXJndl9leHBhbmRlZCk7CisJCWFyZ3ZfZXhwYW5kZWQgPSBOVUxMOworCQlpZiAoY29tbWFuZC0+cGlkIDwgMCkgeyAvKiBbdl1mb3JrIGZhaWxlZCAqLworCQkJLyogQ2xlYXJseSBpbmRpY2F0ZSwgd2FzIGl0IGZvcmsgb3IgdmZvcmsgKi8KKwkJCWJiX3BlcnJvcl9tc2coQkJfTU1VID8gInZmb3JrIisxIDogInZmb3JrIik7CisJCX0gZWxzZSB7CisJCQlwaS0+YWxpdmVfY21kcysrOworI2lmIEVOQUJMRV9IVVNIX0pPQgorCQkJLyogU2Vjb25kIGFuZCBuZXh0IGNoaWxkcmVuIG5lZWQgdG8ga25vdyBwaWQgb2YgZmlyc3Qgb25lICovCisJCQlpZiAocGktPnBncnAgPCAwKQorCQkJCXBpLT5wZ3JwID0gY29tbWFuZC0+cGlkOworI2VuZGlmCisJCX0KKworCQlpZiAoY21kX25vID4gMSkKKwkJCWNsb3NlKG5leHRfaW5mZCk7CisJCWlmIChjbWRfbm8gPCBwaS0+bnVtX2NtZHMpCisJCQljbG9zZShwaXBlZmRzLndyKTsKKwkJLyogUGFzcyByZWFkIChvdXRwdXQpIHBpcGUgZW5kIHRvIG5leHQgaXRlcmF0aW9uICovCisJCW5leHRfaW5mZCA9IHBpcGVmZHMucmQ7CisJfQorCisJaWYgKCFwaS0+YWxpdmVfY21kcykgeworCQlkZWJ1Z19sZWF2ZSgpOworCQlkZWJ1Z19wcmludGZfZXhlYygicnVuX3BpcGUgcmV0dXJuIDEgKGFsbCBmb3JrcyBmYWlsZWQsIG5vIGNoaWxkcmVuKVxuIik7CisJCXJldHVybiAxOworCX0KKworCWRlYnVnX2xlYXZlKCk7CisJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9waXBlIHJldHVybiAtMSAoJXUgY2hpbGRyZW4gc3RhcnRlZClcbiIsIHBpLT5hbGl2ZV9jbWRzKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIE5COiBjYWxsZWQgYnkgcHNldWRvX2V4ZWMsIGFuZCB0aGVyZWZvcmUgbXVzdCBub3QgbW9kaWZ5IGFueQorICogZ2xvYmFsIGRhdGEgdW50aWwgZXhlYy9fZXhpdCAod2UgY2FuIGJlIGEgY2hpbGQgYWZ0ZXIgdmZvcmshKSAqLworc3RhdGljIGludCBydW5fbGlzdChzdHJ1Y3QgcGlwZSAqcGkpCit7CisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCWNoYXIgKmNhc2Vfd29yZCA9IE5VTEw7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCXN0cnVjdCBwaXBlICpsb29wX3RvcCA9IE5VTEw7CisJY2hhciAqKmZvcl9sY3VyID0gTlVMTDsKKwljaGFyICoqZm9yX2xpc3QgPSBOVUxMOworI2VuZGlmCisJc21hbGxpbnQgbGFzdF9mb2xsb3d1cDsKKwlzbWFsbHVpbnQgcmNvZGU7CisjaWYgRU5BQkxFX0hVU0hfSUYgfHwgRU5BQkxFX0hVU0hfQ0FTRQorCXNtYWxsdWludCBjb25kX2NvZGUgPSAwOworI2Vsc2UKKwllbnVtIHsgY29uZF9jb2RlID0gMCB9OworI2VuZGlmCisjaWYgSEFTX0tFWVdPUkRTCisJc21hbGxpbnQgcndvcmQ7ICAgICAgLyogUkVTX2ZvbyAqLworCXNtYWxsaW50IGxhc3RfcndvcmQ7IC8qIGRpdHRvICovCisjZW5kaWYKKworCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fbGlzdCBzdGFydCBsdmwgJWRcbiIsIEcucnVuX2xpc3RfbGV2ZWwpOworCWRlYnVnX2VudGVyKCk7CisKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCS8qIENoZWNrIHN5bnRheCBmb3IgImZvciIgKi8KKwl7CisJCXN0cnVjdCBwaXBlICpjcGlwZTsKKwkJZm9yIChjcGlwZSA9IHBpOyBjcGlwZTsgY3BpcGUgPSBjcGlwZS0+bmV4dCkgeworCQkJaWYgKGNwaXBlLT5yZXNfd29yZCAhPSBSRVNfRk9SICYmIGNwaXBlLT5yZXNfd29yZCAhPSBSRVNfSU4pCisJCQkJY29udGludWU7CisJCQkvKiBjdXJyZW50IHdvcmQgaXMgRk9SIG9yIElOIChCT0xEIGluIGNvbW1lbnRzIGJlbG93KSAqLworCQkJaWYgKGNwaXBlLT5uZXh0ID09IE5VTEwpIHsKKwkJCQlzeW50YXhfZXJyb3IoIm1hbGZvcm1lZCBmb3IiKTsKKwkJCQlkZWJ1Z19sZWF2ZSgpOworCQkJCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fbGlzdCBsdmwgJWQgcmV0dXJuIDFcbiIsIEcucnVuX2xpc3RfbGV2ZWwpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJLyogIkZPUiB2OyBkbyAuLi4iIGFuZCAiZm9yIHYgSU4gYSBiOyBkby4uLiIgYXJlIG9rICovCisJCQlpZiAoY3BpcGUtPm5leHQtPnJlc193b3JkID09IFJFU19ETykKKwkJCQljb250aW51ZTsKKwkJCS8qIG5leHQgd29yZCBpcyBub3QgImRvIi4gSXQgbXVzdCBiZSAiaW4iIHRoZW4gKCJGT1IgdiBpbiAuLi4iKSAqLworCQkJaWYgKGNwaXBlLT5yZXNfd29yZCA9PSBSRVNfSU4gLyogImZvciB2IElOIGEgYjsgbm90X2RvLi4uIj8gKi8KKwkJCSB8fCBjcGlwZS0+bmV4dC0+cmVzX3dvcmQgIT0gUkVTX0lOIC8qIEZPUiB2IG5vdF9kb19hbmRfbm90X2luLi4uIj8gKi8KKwkJCSkgeworCQkJCXN5bnRheF9lcnJvcigibWFsZm9ybWVkIGZvciIpOworCQkJCWRlYnVnX2xlYXZlKCk7CisJCQkJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9saXN0IGx2bCAlZCByZXR1cm4gMVxuIiwgRy5ydW5fbGlzdF9sZXZlbCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCS8qIFBhc3QgdGhpcyBwb2ludCwgYWxsIGNvZGUgcGF0aHMgc2hvdWxkIGp1bXAgdG8gcmV0OiBsYWJlbAorCSAqIGluIG9yZGVyIHRvIHJldHVybiwgbm8gZGlyZWN0ICJyZXR1cm4iIHN0YXRlbWVudHMgcGxlYXNlLgorCSAqIFRoaXMgaGVscHMgdG8gZW5zdXJlIHRoYXQgbm8gbWVtb3J5IGlzIGxlYWtlZC4gKi8KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorCUcucnVuX2xpc3RfbGV2ZWwrKzsKKyNlbmRpZgorCisjaWYgSEFTX0tFWVdPUkRTCisJcndvcmQgPSBSRVNfTk9ORTsKKwlsYXN0X3J3b3JkID0gUkVTX1hYWFg7CisjZW5kaWYKKwlsYXN0X2ZvbGxvd3VwID0gUElQRV9TRVE7CisJcmNvZGUgPSBHLmxhc3RfZXhpdGNvZGU7CisKKwkvKiBHbyB0aHJvdWdoIGxpc3Qgb2YgcGlwZXMsIChtYXliZSkgZXhlY3V0aW5nIHRoZW0uICovCisJZm9yICg7IHBpOyBwaSA9IElGX0hVU0hfTE9PUFMocndvcmQgPT0gUkVTX0RPTkUgPyBsb29wX3RvcCA6ICkgcGktPm5leHQpIHsKKwkJaWYgKEcuZmxhZ19TSUdJTlQpCisJCQlicmVhazsKKworCQlJRl9IQVNfS0VZV09SRFMocndvcmQgPSBwaS0+cmVzX3dvcmQ7KQorCQlkZWJ1Z19wcmludGZfZXhlYygiOiByd29yZD0lZCBjb25kX2NvZGU9JWQgbGFzdF9yd29yZD0lZFxuIiwKKwkJCQlyd29yZCwgY29uZF9jb2RlLCBsYXN0X3J3b3JkKTsKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCQlpZiAoKHJ3b3JkID09IFJFU19XSElMRSB8fCByd29yZCA9PSBSRVNfVU5USUwgfHwgcndvcmQgPT0gUkVTX0ZPUikKKwkJICYmIGxvb3BfdG9wID09IE5VTEwgLyogYXZvaWQgYnVtcGluZyBHLmRlcHRoX29mX2xvb3AgdHdpY2UgKi8KKwkJKSB7CisJCQkvKiBzdGFydCBvZiBhIGxvb3A6IHJlbWVtYmVyIHdoZXJlIGxvb3Agc3RhcnRzICovCisJCQlsb29wX3RvcCA9IHBpOworCQkJRy5kZXB0aF9vZl9sb29wKys7CisJCX0KKyNlbmRpZgorCQkvKiBTdGlsbCBpbiB0aGUgc2FtZSAiaWYuLi4iLCAidGhlbi4uLiIgb3IgImRvLi4uIiBicmFuY2g/ICovCisJCWlmIChJRl9IQVNfS0VZV09SRFMocndvcmQgPT0gbGFzdF9yd29yZCAmJikgMSkgeworCQkJaWYgKChyY29kZSA9PSAwICYmIGxhc3RfZm9sbG93dXAgPT0gUElQRV9PUikKKwkJCSB8fCAocmNvZGUgIT0gMCAmJiBsYXN0X2ZvbGxvd3VwID09IFBJUEVfQU5EKQorCQkJKSB7CisJCQkJLyogSXQgaXMgIjx0cnVlPiB8fCBDTUQiIG9yICI8ZmFsc2U+ICYmIENNRCIKKwkJCQkgKiBhbmQgd2Ugc2hvdWxkIG5vdCBleGVjdXRlIENNRCAqLworCQkJCWRlYnVnX3ByaW50Zl9leGVjKCJza2lwcGVkIGNtZCBiZWNhdXNlIG9mIHx8IG9yICYmXG4iKTsKKwkJCQlsYXN0X2ZvbGxvd3VwID0gcGktPmZvbGxvd3VwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWxhc3RfZm9sbG93dXAgPSBwaS0+Zm9sbG93dXA7CisJCUlGX0hBU19LRVlXT1JEUyhsYXN0X3J3b3JkID0gcndvcmQ7KQorI2lmIEVOQUJMRV9IVVNIX0lGCisJCWlmIChjb25kX2NvZGUpIHsKKwkJCWlmIChyd29yZCA9PSBSRVNfVEhFTikgeworCQkJCS8qIGlmIGZhbHNlOyB0aGVuIC4uLiBmaSBoYXMgZXhpdGNvZGUgMCEgKi8KKwkJCQlHLmxhc3RfZXhpdGNvZGUgPSByY29kZSA9IEVYSVRfU1VDQ0VTUzsKKwkJCQkvKiAiaWYgPGZhbHNlPiBUSEVOIGNtZCI6IHNraXAgY21kICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocndvcmQgPT0gUkVTX0VMU0UgfHwgcndvcmQgPT0gUkVTX0VMSUYpIHsKKwkJCQkvKiAiaWYgPHRydWU+IHRoZW4gLi4uIEVMU0UvRUxJRiBjbWQiOgorCQkJCSAqIHNraXAgY21kIGFuZCBhbGwgZm9sbG93aW5nIG9uZXMgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJaWYgKHJ3b3JkID09IFJFU19GT1IpIHsgLyogJiYgcGktPm51bV9jbWRzIC0gYWx3YXlzID09IDEgKi8KKwkJCWlmICghZm9yX2xjdXIpIHsKKwkJCQkvKiBmaXJzdCBsb29wIHRocm91Z2ggZm9yICovCisKKwkJCQlzdGF0aWMgY29uc3QgY2hhciBlbmNvZGVkX2RvbGxhcl9hdFtdIEFMSUdOMSA9IHsKKwkJCQkJU1BFQ0lBTF9WQVJfU1lNQk9MLCAnQCcgfCAweDgwLCBTUEVDSUFMX1ZBUl9TWU1CT0wsICdcMCcKKwkJCQl9OyAvKiBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mICIkQCIgKi8KKwkJCQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZW5jb2RlZF9kb2xsYXJfYXRfYXJndltdID0geworCQkJCQllbmNvZGVkX2RvbGxhcl9hdCwgTlVMTAorCQkJCX07IC8qIGFyZ3YgbGlzdCB3aXRoIG9uZSBlbGVtZW50OiAiJEAiICovCisJCQkJY2hhciAqKnZhbHM7CisKKwkJCQl2YWxzID0gKGNoYXIqKillbmNvZGVkX2RvbGxhcl9hdF9hcmd2OworCQkJCWlmIChwaS0+bmV4dC0+cmVzX3dvcmQgPT0gUkVTX0lOKSB7CisJCQkJCS8qIGlmIG5vIHZhcmlhYmxlIHZhbHVlcyBhZnRlciAiaW4iIHdlIHNraXAgImZvciIgKi8KKwkJCQkJaWYgKCFwaS0+bmV4dC0+Y21kc1swXS5hcmd2KSB7CisJCQkJCQlHLmxhc3RfZXhpdGNvZGUgPSByY29kZSA9IEVYSVRfU1VDQ0VTUzsKKwkJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IG51bGwgRk9SOiBleGl0Y29kZSBFWElUX1NVQ0NFU1NcbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJdmFscyA9IHBpLT5uZXh0LT5jbWRzWzBdLmFyZ3Y7CisJCQkJfSAvKiBlbHNlOiAiZm9yIHZhcjsgZG8uLi4iIC0+IGFzc3VtZSAiJEAiIGxpc3QgKi8KKwkJCQkvKiBjcmVhdGUgbGlzdCBvZiB2YXJpYWJsZSB2YWx1ZXMgKi8KKwkJCQlkZWJ1Z19wcmludF9zdHJpbmdzKCJmb3JfbGlzdCBtYWRlIGZyb20iLCB2YWxzKTsKKwkJCQlmb3JfbGlzdCA9IGV4cGFuZF9zdHJ2ZWNfdG9fc3RydmVjKHZhbHMpOworCQkJCWZvcl9sY3VyID0gZm9yX2xpc3Q7CisJCQkJZGVidWdfcHJpbnRfc3RyaW5ncygiZm9yX2xpc3QiLCBmb3JfbGlzdCk7CisJCQl9CisJCQlpZiAoISpmb3JfbGN1cikgeworCQkJCS8qICJmb3IiIGxvb3AgaXMgb3ZlciwgY2xlYW4gdXAgKi8KKwkJCQlmcmVlKGZvcl9saXN0KTsKKwkJCQlmb3JfbGlzdCA9IE5VTEw7CisJCQkJZm9yX2xjdXIgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogSW5zZXJ0IG5leHQgdmFsdWUgZnJvbSBmb3JfbGN1ciAqLworCQkJLyogbm90ZTogKmZvcl9sY3VyIGFscmVhZHkgaGFzIHF1b3RlcyByZW1vdmVkLCAkdmFyIGV4cGFuZGVkLCBldGMgKi8KKwkJCXNldF9sb2NhbF92YXIoeGFzcHJpbnRmKCIlcz0lcyIsIHBpLT5jbWRzWzBdLmFyZ3ZbMF0sICpmb3JfbGN1cisrKSwgLypleHA6Ki8gMCwgLypsdmw6Ki8gMCwgLypybzoqLyAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyd29yZCA9PSBSRVNfSU4pIHsKKwkJCWNvbnRpbnVlOyAvKiAiZm9yIHYgSU4gbGlzdDsuLi4iIC0gImluIiBoYXMgbm8gY21kcyBhbnl3YXkgKi8KKwkJfQorCQlpZiAocndvcmQgPT0gUkVTX0RPTkUpIHsKKwkJCWNvbnRpbnVlOyAvKiAiZG9uZSIgaGFzIG5vIGNtZHMgdG9vICovCisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJaWYgKHJ3b3JkID09IFJFU19DQVNFKSB7CisJCQljYXNlX3dvcmQgPSBleHBhbmRfc3RydmVjX3RvX3N0cmluZyhwaS0+Y21kcy0+YXJndik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocndvcmQgPT0gUkVTX01BVENIKSB7CisJCQljaGFyICoqYXJndjsKKworCQkJaWYgKCFjYXNlX3dvcmQpIC8qICJjYXNlIC4uLiBtYXRjaGVkX3dvcmQpIC4uLiBXT1JEKSI6IHdlIGV4ZWN1dGVkIHNlbGVjdGVkIGJyYW5jaCwgc3RvcCAqLworCQkJCWJyZWFrOworCQkJLyogYWxsIHByZXYgd29yZHMgZGlkbid0IG1hdGNoLCBkb2VzIHRoaXMgb25lIG1hdGNoPyAqLworCQkJYXJndiA9IHBpLT5jbWRzLT5hcmd2OworCQkJd2hpbGUgKCphcmd2KSB7CisJCQkJY2hhciAqcGF0dGVybiA9IGV4cGFuZF9zdHJpbmdfdG9fc3RyaW5nKCphcmd2LCAvKnVuYmFja3NsYXNoOiovIDEpOworCQkJCS8qIFRPRE86IHdoaWNoIEZOTV94eHggZmxhZ3MgdG8gdXNlPyAqLworCQkJCWNvbmRfY29kZSA9IChmbm1hdGNoKHBhdHRlcm4sIGNhc2Vfd29yZCwgLypmbGFnczoqLyAwKSAhPSAwKTsKKwkJCQlmcmVlKHBhdHRlcm4pOworCQkJCWlmIChjb25kX2NvZGUgPT0gMCkgeyAvKiBtYXRjaCEgd2Ugd2lsbCBleGVjdXRlIHRoaXMgYnJhbmNoICovCisJCQkJCWZyZWUoY2FzZV93b3JkKTsgLyogbWFrZSBmdXR1cmUgIndvcmQpIiBzdG9wICovCisJCQkJCWNhc2Vfd29yZCA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlhcmd2Kys7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocndvcmQgPT0gUkVTX0NBU0VfQk9EWSkgeyAvKiBpbnNpZGUgb2YgYSBjYXNlIGJyYW5jaCAqLworCQkJaWYgKGNvbmRfY29kZSAhPSAwKQorCQkJCWNvbnRpbnVlOyAvKiBub3QgbWF0Y2hlZCB5ZXQsIHNraXAgdGhpcyBwaXBlICovCisJCX0KKyNlbmRpZgorCQkvKiBKdXN0IHByZXNzaW5nIDxlbnRlcj4gaW4gc2hlbGwgc2hvdWxkIGNoZWNrIGZvciBqb2JzLgorCQkgKiBPVE9ILCBpbiBub24taW50ZXJhY3RpdmUgc2hlbGwgdGhpcyBpcyB1c2VsZXNzCisJCSAqIGFuZCBvbmx5IGxlYWRzIHRvIGV4dHJhIGpvYiBjaGVja3MgKi8KKwkJaWYgKHBpLT5udW1fY21kcyA9PSAwKSB7CisJCQlpZiAoR19pbnRlcmFjdGl2ZV9mZCkKKwkJCQlnb3RvIGNoZWNrX2pvYnNfYW5kX2NvbnRpbnVlOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBBZnRlciBhbmFseXppbmcgYWxsIGtleXdvcmRzIGFuZCBjb25kaXRpb25zLCB3ZSBkZWNpZGVkCisJCSAqIHRvIGV4ZWN1dGUgdGhpcyBwaXBlLiBOQjogaGF2ZSB0byBkbyBjaGVja2pvYnMoTlVMTCkKKwkJICogYWZ0ZXIgcnVuX3BpcGUgdG8gY29sbGVjdCBhbnkgYmFja2dyb3VuZCBjaGlsZHJlbiwKKwkJICogZXZlbiBpZiBsaXN0IGV4ZWN1dGlvbiBpcyB0byBiZSBzdG9wcGVkLiAqLworCQlkZWJ1Z19wcmludGZfZXhlYygiOiBydW5fcGlwZSB3aXRoICVkIG1lbWJlcnNcbiIsIHBpLT5udW1fY21kcyk7CisJCXsKKwkJCWludCByOworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJCQlHLmZsYWdfYnJlYWtfY29udGludWUgPSAwOworI2VuZGlmCisJCQlyY29kZSA9IHIgPSBydW5fcGlwZShwaSk7IC8qIE5COiByY29kZSBpcyBhIHNtYWxsaW50ICovCisJCQlpZiAociAhPSAtMSkgeworCQkJCS8qIFdlIHJhbiBhIGJ1aWx0aW4sIGZ1bmN0aW9uLCBvciBncm91cC4KKwkJCQkgKiByY29kZSBpcyBhbHJlYWR5IGtub3duCisJCQkJICogYW5kIHdlIGRvbid0IG5lZWQgdG8gd2FpdCBmb3IgYW55dGhpbmcuICovCisJCQkJRy5sYXN0X2V4aXRjb2RlID0gcmNvZGU7CisJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogYnVpbHRpbi9mdW5jIGV4aXRjb2RlICVkXG4iLCByY29kZSk7CisJCQkJY2hlY2tfYW5kX3J1bl90cmFwcygpOworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJCQkJLyogV2FzIGl0ICJicmVhayIgb3IgImNvbnRpbnVlIj8gKi8KKwkJCQlpZiAoRy5mbGFnX2JyZWFrX2NvbnRpbnVlKSB7CisJCQkJCXNtYWxsaW50IGZiYyA9IEcuZmxhZ19icmVha19jb250aW51ZTsKKwkJCQkJLyogV2UgbWlnaHQgZmFsbCBpbnRvIG91dGVyICpsb29wKiwKKwkJCQkJICogZG9uJ3Qgd2FudCB0byBicmVhayBpdCB0b28gKi8KKwkJCQkJaWYgKGxvb3BfdG9wKSB7CisJCQkJCQlHLmRlcHRoX2JyZWFrX2NvbnRpbnVlLS07CisJCQkJCQlpZiAoRy5kZXB0aF9icmVha19jb250aW51ZSA9PSAwKQorCQkJCQkJCUcuZmxhZ19icmVha19jb250aW51ZSA9IDA7CisJCQkJCQkvKiBlbHNlOiBlLmcuICJjb250aW51ZSAyIiBzaG91bGQgKmJyZWFrKiBvbmNlLCAqdGhlbiogY29udGludWUgKi8KKwkJCQkJfSAvKiBlbHNlOiAid2hpbGUuLi4gZG8uLi4geyB3ZSBhcmUgaGVyZSAoaW5uZXJtb3N0IGxpc3QgaXMgbm90IGEgbG9vcCEpIH07Li4uZG9uZSIgKi8KKwkJCQkJaWYgKEcuZGVwdGhfYnJlYWtfY29udGludWUgIT0gMCB8fCBmYmMgPT0gQkNfQlJFQUspCisJCQkJCQlnb3RvIGNoZWNrX2pvYnNfYW5kX2JyZWFrOworCQkJCQkvKiAiY29udGludWUiOiBzaW11bGF0ZSBlbmQgb2YgbG9vcCAqLworCQkJCQlyd29yZCA9IFJFU19ET05FOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJCQlpZiAoRy5mbGFnX3JldHVybl9pbl9wcm9ncmVzcyA9PSAxKSB7CisJCQkJCS8qIHNhbWUgYXMgImdvdG8gY2hlY2tfam9ic19hbmRfYnJlYWsiICovCisJCQkJCWNoZWNram9icyhOVUxMKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2VuZGlmCisJCQl9IGVsc2UgaWYgKHBpLT5mb2xsb3d1cCA9PSBQSVBFX0JHKSB7CisJCQkJLyogV2hhdCBkb2VzIGJhc2ggZG8gd2l0aCBhdHRlbXB0cyB0byBiYWNrZ3JvdW5kIGJ1aWx0aW5zPyAqLworCQkJCS8qIGV2ZW4gYmFzaCAzLjIgZG9lc24ndCBkbyB0aGF0IHdlbGwgd2l0aCBuZXN0ZWQgYmc6CisJCQkJICogdHJ5ICJ7IHsgc2xlZXAgMTA7IGVjaG8gREVFUDsgfSAmIGVjaG8gSEVSRTsgfSAmIi4KKwkJCQkgKiBJJ20gTk9UIHRyZWF0aW5nIGlubmVyICYncyBhcyBqb2JzICovCisJCQkJY2hlY2tfYW5kX3J1bl90cmFwcygpOworI2lmIEVOQUJMRV9IVVNIX0pPQgorCQkJCWlmIChHLnJ1bl9saXN0X2xldmVsID09IDEpCisJCQkJCWluc2VydF9iZ19qb2IocGkpOworI2VuZGlmCisJCQkJLyogTGFzdCBjb21tYW5kJ3MgcGlkIGdvZXMgdG8gJCEgKi8KKwkJCQlHLmxhc3RfYmdfcGlkID0gcGktPmNtZHNbcGktPm51bV9jbWRzIC0gMV0ucGlkOworCQkJCUcubGFzdF9leGl0Y29kZSA9IHJjb2RlID0gRVhJVF9TVUNDRVNTOworCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IGNtZCY6IGV4aXRjb2RlIEVYSVRfU1VDQ0VTU1xuIik7CisJCQl9IGVsc2UgeworI2lmIEVOQUJMRV9IVVNIX0pPQgorCQkJCWlmIChHLnJ1bl9saXN0X2xldmVsID09IDEgJiYgR19pbnRlcmFjdGl2ZV9mZCkgeworCQkJCQkvKiBXYWl0cyBmb3IgY29tcGxldGlvbiwgdGhlbiBmZydzIG1haW4gc2hlbGwgKi8KKwkJCQkJcmNvZGUgPSBjaGVja2pvYnNfYW5kX2ZnX3NoZWxsKHBpKTsKKwkJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogY2hlY2tqb2JzX2FuZF9mZ19zaGVsbCBleGl0Y29kZSAlZFxuIiwgcmNvZGUpOworCQkJCQljaGVja19hbmRfcnVuX3RyYXBzKCk7CisJCQkJfSBlbHNlCisjZW5kaWYKKwkJCQl7IC8qIFRoaXMgb25lIGp1c3Qgd2FpdHMgZm9yIGNvbXBsZXRpb24gKi8KKwkJCQkJcmNvZGUgPSBjaGVja2pvYnMocGkpOworCQkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBjaGVja2pvYnMgZXhpdGNvZGUgJWRcbiIsIHJjb2RlKTsKKwkJCQkJY2hlY2tfYW5kX3J1bl90cmFwcygpOworCQkJCX0KKwkJCQlHLmxhc3RfZXhpdGNvZGUgPSByY29kZTsKKwkJCX0KKwkJfQorCisJCS8qIEFuYWx5emUgaG93IHJlc3VsdCBhZmZlY3RzIHN1YnNlcXVlbnQgY29tbWFuZHMgKi8KKyNpZiBFTkFCTEVfSFVTSF9JRgorCQlpZiAocndvcmQgPT0gUkVTX0lGIHx8IHJ3b3JkID09IFJFU19FTElGKQorCQkJY29uZF9jb2RlID0gcmNvZGU7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCQkvKiBCZXdhcmUgb2YgIndoaWxlIGZhbHNlOyB0cnVlOyBkbyAuLi4iISAqLworCQlpZiAocGktPm5leHQKKwkJICYmIChwaS0+bmV4dC0+cmVzX3dvcmQgPT0gUkVTX0RPIHx8IHBpLT5uZXh0LT5yZXNfd29yZCA9PSBSRVNfRE9ORSkKKwkJIC8qIGNoZWNrIGZvciBSRVNfRE9ORSBpcyBuZWVkZWQgZm9yICJ3aGlsZSAuLi47IGRvIFxuIGRvbmUiIGNhc2UgKi8KKwkJKSB7CisJCQlpZiAocndvcmQgPT0gUkVTX1dISUxFKSB7CisJCQkJaWYgKHJjb2RlKSB7CisJCQkJCS8qICJ3aGlsZSBmYWxzZTsgZG8uLi5kb25lIiAtIGV4aXRjb2RlIDAgKi8KKwkJCQkJRy5sYXN0X2V4aXRjb2RlID0gcmNvZGUgPSBFWElUX1NVQ0NFU1M7CisJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHdoaWxlIGV4cHIgaXMgZmFsc2U6IGJyZWFraW5nIChleGl0Y29kZTpFWElUX1NVQ0NFU1MpXG4iKTsKKwkJCQkJZ290byBjaGVja19qb2JzX2FuZF9icmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAocndvcmQgPT0gUkVTX1VOVElMKSB7CisJCQkJaWYgKCFyY29kZSkgeworCQkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiB1bnRpbCBleHByIGlzIHRydWU6IGJyZWFraW5nXG4iKTsKKyBjaGVja19qb2JzX2FuZF9icmVhazoKKwkJCQkJY2hlY2tqb2JzKE5VTEwpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCisgY2hlY2tfam9ic19hbmRfY29udGludWU6CisJCWNoZWNram9icyhOVUxMKTsKKwl9IC8qIGZvciAocGkpICovCisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlHLnJ1bl9saXN0X2xldmVsLS07CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCWlmIChsb29wX3RvcCkKKwkJRy5kZXB0aF9vZl9sb29wLS07CisJZnJlZShmb3JfbGlzdCk7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJZnJlZShjYXNlX3dvcmQpOworI2VuZGlmCisJZGVidWdfbGVhdmUoKTsKKwlkZWJ1Z19wcmludGZfZXhlYygicnVuX2xpc3QgbHZsICVkIHJldHVybiAlZFxuIiwgRy5ydW5fbGlzdF9sZXZlbCArIDEsIHJjb2RlKTsKKwlyZXR1cm4gcmNvZGU7Cit9CisKKy8qIFNlbGVjdCB3aGljaCB2ZXJzaW9uIHdlIHdpbGwgdXNlICovCitzdGF0aWMgaW50IHJ1bl9hbmRfZnJlZV9saXN0KHN0cnVjdCBwaXBlICpwaSkKK3sKKwlpbnQgcmNvZGUgPSAwOworCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fYW5kX2ZyZWVfbGlzdCBlbnRlcmVkXG4iKTsKKwlpZiAoIUcub19vcHRbT1BUX09fTk9FWEVDXSkgeworCQlkZWJ1Z19wcmludGZfZXhlYygiOiBydW5fbGlzdDogMXN0IHBpcGUgd2l0aCAlZCBjbWRzXG4iLCBwaS0+bnVtX2NtZHMpOworCQlyY29kZSA9IHJ1bl9saXN0KHBpKTsKKwl9CisJLyogZnJlZV9waXBlX2xpc3QgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjbGVhcmluZyBtZW1vcnkuCisJICogSW4gdGhlIGxvbmcgcnVuIHRoYXQgZnVuY3Rpb24gY2FuIGJlIG1lcmdlZCB3aXRoIHJ1bl9saXN0LAorCSAqIGJ1dCBkb2luZyB0aGF0IG5vdyB3b3VsZCBob2JibGUgdGhlIGRlYnVnZ2luZyBlZmZvcnQuICovCisJZnJlZV9waXBlX2xpc3QocGkpOworCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fYW5kX2ZyZWVfbGlzdCByZXR1cm4gJWRcbiIsIHJjb2RlKTsKKwlyZXR1cm4gcmNvZGU7Cit9CisKKworc3RhdGljIHZvaWQgaW5zdGFsbF9zaWdoYW5kbGVycyh1bnNpZ25lZCBtYXNrKQoreworCXNpZ2hhbmRsZXJfdCBvbGRfaGFuZGxlcjsKKwl1bnNpZ25lZCBzaWcgPSAwOworCXdoaWxlICgobWFzayA+Pj0gMSkgIT0gMCkgeworCQlzaWcrKzsKKwkJaWYgKCEobWFzayAmIDEpKQorCQkJY29udGludWU7CisJCW9sZF9oYW5kbGVyID0gaW5zdGFsbF9zaWdoYW5kbGVyKHNpZywgcGlja19zaWdoYW5kbGVyKHNpZykpOworCQkvKiBQT1NJWCBhbGxvd3Mgc2hlbGwgdG8gcmUtZW5hYmxlIFNJR0NITEQKKwkJICogZXZlbiBpZiBpdCB3YXMgU0lHX0lHTiBvbiBlbnRyeS4KKwkJICogVGhlcmVmb3JlIHdlIHNraXAgSUdOIGNoZWNrIGZvciBpdDoKKwkJICovCisJCWlmIChzaWcgPT0gU0lHQ0hMRCkKKwkJCWNvbnRpbnVlOworCQlpZiAob2xkX2hhbmRsZXIgPT0gU0lHX0lHTikgeworCQkJLyogb29wcy4uLiByZXN0b3JlIGJhY2sgdG8gSUdOLCBhbmQgcmVjb3JkIHRoaXMgZmFjdCAqLworCQkJaW5zdGFsbF9zaWdoYW5kbGVyKHNpZywgb2xkX2hhbmRsZXIpOworCQkJaWYgKCFHLnRyYXBzKQorCQkJCUcudHJhcHMgPSB4emFsbG9jKHNpemVvZihHLnRyYXBzWzBdKSAqIE5TSUcpOworCQkJZnJlZShHLnRyYXBzW3NpZ10pOworCQkJRy50cmFwc1tzaWddID0geHphbGxvYygxKTsgLyogPT0geHN0cmR1cCgiIik7ICovCisJCX0KKwl9Cit9CisKKy8qIENhbGxlZCBhIGZldyB0aW1lcyBvbmx5IChvciBldmVuIG9uY2UgaWYgInNoIC1jIikgKi8KK3N0YXRpYyB2b2lkIGluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycyh2b2lkKQoreworCXVuc2lnbmVkIG1hc2s7CisKKwkvKiBXaGljaCBzaWduYWxzIGFyZSBzaGVsbC1zcGVjaWFsPyAqLworCW1hc2sgPSAoMSA8PCBTSUdRVUlUKSB8ICgxIDw8IFNJR0NITEQpOworCWlmIChHX2ludGVyYWN0aXZlX2ZkKSB7CisJCW1hc2sgfD0gU1BFQ0lBTF9JTlRFUkFDVElWRV9TSUdTOworCQlpZiAoR19zYXZlZF90dHlfcGdycCkgLyogd2UgaGF2ZSBjdHR5LCBqb2IgY29udHJvbCBzaWdzIHdvcmsgKi8KKwkJCW1hc2sgfD0gU1BFQ0lBTF9KT0JTVE9QX1NJR1M7CisJfQorCS8qIENhcmVmdWwsIGRvIG5vdCByZS1pbnN0YWxsIGhhbmRsZXJzIHdlIGFscmVhZHkgaW5zdGFsbGVkICovCisJaWYgKEcuc3BlY2lhbF9zaWdfbWFzayAhPSBtYXNrKSB7CisJCXVuc2lnbmVkIGRpZmYgPSBtYXNrICYgfkcuc3BlY2lhbF9zaWdfbWFzazsKKwkJRy5zcGVjaWFsX3NpZ19tYXNrID0gbWFzazsKKwkJaW5zdGFsbF9zaWdoYW5kbGVycyhkaWZmKTsKKwl9Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKy8qIGhlbHBlciAqLworLyogU2V0IGhhbmRsZXJzIHRvIHJlc3RvcmUgdHR5IHBncnAgYW5kIGV4aXQgKi8KK3N0YXRpYyB2b2lkIGluc3RhbGxfZmF0YWxfc2lnaGFuZGxlcnModm9pZCkKK3sKKwl1bnNpZ25lZCBtYXNrOworCisJLyogV2Ugd2lsbCByZXN0b3JlIHR0eSBwZ3JwIG9uIHRoZXNlIHNpZ25hbHMgKi8KKwltYXNrID0gMAorCQkrICgxIDw8IFNJR0lMTCApICogSFVTSF9ERUJVRworCQkrICgxIDw8IFNJR0ZQRSApICogSFVTSF9ERUJVRworCQkrICgxIDw8IFNJR0JVUyApICogSFVTSF9ERUJVRworCQkrICgxIDw8IFNJR1NFR1YpICogSFVTSF9ERUJVRworCQkrICgxIDw8IFNJR1RSQVApICogSFVTSF9ERUJVRworCQkrICgxIDw8IFNJR0FCUlQpCisJLyogYmFzaCAzLjIgc2VlbXMgdG8gaGFuZGxlIHRoZXNlIGp1c3QgbGlrZSAnZmF0YWwnIG9uZXMgKi8KKwkJKyAoMSA8PCBTSUdQSVBFKQorCQkrICgxIDw8IFNJR0FMUk0pCisJLyogaWYgd2UgYXJlIGludGVyYWN0aXZlLCBTSUdIVVAsIFNJR1RFUk0gYW5kIFNJR0lOVCBhcmUgc3BlY2lhbCBzaWdzLgorCSAqIGlmIHdlIGFyZW4ndCBpbnRlcmFjdGl2ZS4uLiBidXQgaW4gdGhpcyBjYXNlCisJICogd2UgbmV2ZXIgd2FudCB0byByZXN0b3JlIHBncnAgb24gZXhpdCwgYW5kIHRoaXMgZm4gaXMgbm90IGNhbGxlZAorCSAqLworCQkvKisgKDEgPDwgU0lHSFVQICkqLworCQkvKisgKDEgPDwgU0lHVEVSTSkqLworCQkvKisgKDEgPDwgU0lHSU5UICkqLworCTsKKwlHX2ZhdGFsX3NpZ19tYXNrID0gbWFzazsKKworCWluc3RhbGxfc2lnaGFuZGxlcnMobWFzayk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzZXRfbW9kZShpbnQgc3RhdGUsIGNoYXIgbW9kZSwgY29uc3QgY2hhciAqb19vcHQpCit7CisJaW50IGlkeDsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlICduJzoKKwkJRy5vX29wdFtPUFRfT19OT0VYRUNdID0gc3RhdGU7CisJCWJyZWFrOworCWNhc2UgJ3gnOgorCQlJRl9IVVNIX01PREVfWChHX3hfbW9kZSA9IHN0YXRlOykKKwkJYnJlYWs7CisJY2FzZSAnbyc6CisJCWlmICghb19vcHQpIHsKKwkJCS8qICJzZXQgLStvIiB3aXRob3V0IHBhcmFtZXRlci4KKwkJCSAqIGluIGJhc2gsIHNldCAtbyBwcm9kdWNlcyB0aGlzIG91dHB1dDoKKwkJCSAqICBwaXBlZmFpbCAgICAgICAgb2ZmCisJCQkgKiBhbmQgc2V0ICtvOgorCQkJICogIHNldCArbyBwaXBlZmFpbAorCQkJICogV2UgYWx3YXlzIHVzZSB0aGUgc2Vjb25kIGZvcm0uCisJCQkgKi8KKwkJCWNvbnN0IGNoYXIgKnAgPSBvX29wdF9zdHJpbmdzOworCQkJaWR4ID0gMDsKKwkJCXdoaWxlICgqcCkgeworCQkJCXByaW50Zigic2V0ICVjbyAlc1xuIiwgKEcub19vcHRbaWR4XSA/ICctJyA6ICcrJyksIHApOworCQkJCWlkeCsrOworCQkJCXAgKz0gc3RybGVuKHApICsgMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlkeCA9IGluZGV4X2luX3N0cmluZ3Mob19vcHRfc3RyaW5ncywgb19vcHQpOworCQlpZiAoaWR4ID49IDApIHsKKwkJCUcub19vcHRbaWR4XSA9IHN0YXRlOworCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitpbnQgaHVzaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaHVzaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJT1BUX2xvZ2luID0gKDEgPDwgMCksCisJfTsKKwl1bnNpZ25lZCBmbGFnczsKKwlpbnQgb3B0OworCXVuc2lnbmVkIGJ1aWx0aW5fYXJnYzsKKwljaGFyICoqZTsKKwlzdHJ1Y3QgdmFyaWFibGUgKmN1cl92YXI7CisJc3RydWN0IHZhcmlhYmxlICpzaGVsbF92ZXI7CisKKwlJTklUX0coKTsKKwlpZiAoRVhJVF9TVUNDRVNTICE9IDApIC8qIGlmIEVYSVRfU1VDQ0VTUyA9PSAwLCBpdCBpcyBhbHJlYWR5IGRvbmUgKi8KKwkJRy5sYXN0X2V4aXRjb2RlID0gRVhJVF9TVUNDRVNTOworI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwlHLmNvdW50X1NJR0NITEQrKzsgLyogZW5zdXJlIGl0IGlzICE9IEcuaGFuZGxlZF9TSUdDSExEICovCisjZW5kaWYKKyNpZiAhQkJfTU1VCisJRy5hcmd2MF9mb3JfcmVfZXhlY2luZyA9IGFyZ3ZbMF07CisjZW5kaWYKKwkvKiBEZWFsIHdpdGggSFVTSF9WRVJTSU9OICovCisJc2hlbGxfdmVyID0geHphbGxvYyhzaXplb2YoKnNoZWxsX3ZlcikpOworCXNoZWxsX3Zlci0+ZmxnX2V4cG9ydCA9IDE7CisJc2hlbGxfdmVyLT5mbGdfcmVhZF9vbmx5ID0gMTsKKwkvKiBDb2RlIHdoaWNoIGhhbmRsZXMgJHt2YXI8b3A+Li4ufSBuZWVkcyB3cml0YWJsZSB2YWx1ZXMgZm9yIGFsbCB2YXJpYWJsZXMsCisJICogdGhlcmVmb3JlIHdlIHhzdHJkdXA6ICovCisJc2hlbGxfdmVyLT52YXJzdHIgPSB4c3RyZHVwKGh1c2hfdmVyc2lvbl9zdHIpOworCS8qIENyZWF0ZSBzaGVsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgdmFsdWVzCisJICogY3VycmVudGx5IGxpdmluZyBpbiB0aGUgZW52aXJvbm1lbnQgKi8KKwlkZWJ1Z19wcmludGZfZW52KCJ1bnNldGVudiAnJXMnXG4iLCAiSFVTSF9WRVJTSU9OIik7CisJdW5zZXRlbnYoIkhVU0hfVkVSU0lPTiIpOyAvKiBpbiBjYXNlIGl0IGV4aXN0cyBpbiBpbml0aWFsIGVudiAqLworCUcudG9wX3ZhciA9IHNoZWxsX3ZlcjsKKwljdXJfdmFyID0gRy50b3BfdmFyOworCWUgPSBlbnZpcm9uOworCWlmIChlKSB3aGlsZSAoKmUpIHsKKwkJY2hhciAqdmFsdWUgPSBzdHJjaHIoKmUsICc9Jyk7CisJCWlmICh2YWx1ZSkgeyAvKiBwYXJhbm9pYSAqLworCQkJY3VyX3Zhci0+bmV4dCA9IHh6YWxsb2Moc2l6ZW9mKCpjdXJfdmFyKSk7CisJCQljdXJfdmFyID0gY3VyX3Zhci0+bmV4dDsKKwkJCWN1cl92YXItPnZhcnN0ciA9ICplOworCQkJY3VyX3Zhci0+bWF4X2xlbiA9IHN0cmxlbigqZSk7CisJCQljdXJfdmFyLT5mbGdfZXhwb3J0ID0gMTsKKwkJfQorCQllKys7CisJfQorCS8qIChSZSlpbnNlcnQgSFVTSF9WRVJTSU9OIGludG8gZW52IChBRlRFUiB3ZSBzY2FubmVkIHRoZSBlbnYhKSAqLworCWRlYnVnX3ByaW50Zl9lbnYoInB1dGVudiAnJXMnXG4iLCBzaGVsbF92ZXItPnZhcnN0cik7CisJcHV0ZW52KHNoZWxsX3Zlci0+dmFyc3RyKTsKKworCS8qIEV4cG9ydCBQV0QgKi8KKwlzZXRfcHdkX3ZhcigvKmV4cDoqLyAxKTsKKwkvKiBiYXNoIGFsc28gZXhwb3J0cyBTSExWTCBhbmQgXywKKwkgKiBhbmQgc2V0cyAoYnV0IGRvZXNuJ3QgZXhwb3J0KSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKwkgKiBCQVNIPS9iaW4vYmFzaAorCSAqIEJBU0hfVkVSU0lORk89KFswXT0iMyIgWzFdPSIyIiBbMl09IjAiIFszXT0iMSIgWzRdPSJyZWxlYXNlIiBbNV09ImkzODYtcGMtbGludXgtZ251IikKKwkgKiBCQVNIX1ZFUlNJT049JzMuMi4wKDEpLXJlbGVhc2UnCisJICogSE9TVFRZUEU9aTM4NgorCSAqIE1BQ0hUWVBFPWkzODYtcGMtbGludXgtZ251CisJICogT1NUWVBFPWxpbnV4LWdudQorCSAqIEhPU1ROQU1FPTx4eHh4eHh4eHh4PgorCSAqIFBQSUQ9PE5OTk5OPiAtIHdlIGFsc28gZG8gaXQgZWxzZXdoZXJlCisJICogRVVJRD08Tk5OTk4+CisJICogVUlEPTxOTk5OTj4KKwkgKiBHUk9VUFM9KCkKKwkgKiBMSU5FUz08Tk5OPgorCSAqIENPTFVNTlM9PE5OTj4KKwkgKiBCQVNIX0FSR0M9KCkKKwkgKiBCQVNIX0FSR1Y9KCkKKwkgKiBCQVNIX0xJTkVOTz0oKQorCSAqIEJBU0hfU09VUkNFPSgpCisJICogRElSU1RBQ0s9KCkKKwkgKiBQSVBFU1RBVFVTPShbMF09IjAiKQorCSAqIEhJU1RGSUxFPS88eHh4Pi8uYmFzaF9oaXN0b3J5CisJICogSElTVEZJTEVTSVpFPTUwMAorCSAqIEhJU1RTSVpFPTUwMAorCSAqIE1BSUxDSEVDSz02MAorCSAqIFBBVEg9L3Vzci9nbnUvYmluOi91c3IvbG9jYWwvYmluOi9iaW46L3Vzci9iaW46LgorCSAqIFNIRUxMPS9iaW4vYmFzaAorCSAqIFNIRUxMT1BUUz1icmFjZWV4cGFuZDplbWFjczpoYXNoYWxsOmhpc3RleHBhbmQ6aGlzdG9yeTppbnRlcmFjdGl2ZS1jb21tZW50czptb25pdG9yCisJICogVEVSTT1kdW1iCisJICogT1BURVJSPTEKKwkgKiBPUFRJTkQ9MQorCSAqIElGUz0kJyBcdFxuJworCSAqIFBTMT0nXHMtXHZcJCAnCisJICogUFMyPSc+ICcKKwkgKiBQUzQ9JysgJworCSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworCUcubGluZV9pbnB1dF9zdGF0ZSA9IG5ld19saW5lX2lucHV0X3QoRk9SX1NIRUxMKTsKKyMgaWYgTUFYX0hJU1RPUlkgPiAwICYmIEVOQUJMRV9IVVNIX1NBVkVISVNUT1JZCisJeworCQljb25zdCBjaGFyICpocCA9IGdldF9sb2NhbF92YXJfdmFsdWUoIkhJU1RGSUxFIik7CisJCWlmICghaHApIHsKKwkJCWhwID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiSE9NRSIpOworCQkJaWYgKGhwKQorCQkJCWhwID0gY29uY2F0X3BhdGhfZmlsZShocCwgIi5odXNoX2hpc3RvcnkiKTsKKwkJfSBlbHNlIHsKKwkJCWhwID0geHN0cmR1cChocCk7CisJCX0KKwkJaWYgKGhwKSB7CisJCQlHLmxpbmVfaW5wdXRfc3RhdGUtPmhpc3RfZmlsZSA9IGhwOworCQkJLy9zZXRfbG9jYWxfdmFyKHhhc3ByaW50ZigiSElTVEZJTEU9JXMiLCAuLi4pKTsKKwkJfQorIyAgaWYgRU5BQkxFX0ZFQVRVUkVfU0hfSElTVEZJTEVTSVpFCisJCWhwID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiSElTVEZJTEVTSVpFIik7CisJCUcubGluZV9pbnB1dF9zdGF0ZS0+bWF4X2hpc3RvcnkgPSBzaXplX2Zyb21fSElTVEZJTEVTSVpFKGhwKTsKKyMgIGVuZGlmCisJfQorIyBlbmRpZgorI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIHNvbWUgbW9yZSBnbG9iYWxzIHRvIG5vbi16ZXJvIHZhbHVlcyAqLworCWNtZGVkaXRfdXBkYXRlX3Byb21wdCgpOworCisJaWYgKHNldGptcChkaWVfam1wKSkgeworCQkvKiB4ZnVuYyBoYXMgZmFpbGVkISBkaWUgZGllIGRpZSAqLworCQkvKiBubyBFWElUIHRyYXBzLCB0aGlzIGlzIGFuIGVzY2FwZSBoYXRjaCEgKi8KKwkJRy5leGl0aW5nID0gMTsKKwkJaHVzaF9leGl0KHhmdW5jX2Vycm9yX3JldHZhbCk7CisJfQorCisJLyogU2hlbGwgaXMgbm9uLWludGVyYWN0aXZlIGF0IGZpcnN0LiBXZSBuZWVkIHRvIGNhbGwKKwkgKiBpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKSBpZiB3ZSBhcmUgZ29pbmcgdG8gZXhlY3V0ZSAic2ggPHNjcmlwdD4iLAorCSAqICJzaCAtYyA8Y21kcz4iIG9yIGxvZ2luIHNoZWxsJ3MgL2V0Yy9wcm9maWxlIGFuZCBmcmllbmRzLgorCSAqIElmIHdlIGxhdGVyIGRlY2lkZSB0aGF0IHdlIGFyZSBpbnRlcmFjdGl2ZSwgd2UgcnVuIGluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpCisJICogaW4gb3JkZXIgdG8gaW50ZXJjZXB0IChtb3JlKSBzaWduYWxzLgorCSAqLworCisJLyogUGFyc2Ugb3B0aW9ucyAqLworCS8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3NoLmh0bWwgKi8KKwlmbGFncyA9IChhcmd2WzBdICYmIGFyZ3ZbMF1bMF0gPT0gJy0nKSA/IE9QVF9sb2dpbiA6IDA7CisJYnVpbHRpbl9hcmdjID0gMDsKKwl3aGlsZSAoMSkgeworCQlvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIitjOnhpbnNsIgorI2lmICFCQl9NTVUKKwkJCQkiPDokOlI6VjoiCisjIGlmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQkJCSJGOiIKKyMgZW5kaWYKKyNlbmRpZgorCQkpOworCQlpZiAob3B0IDw9IDApCisJCQlicmVhazsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAnYyc6CisJCQkvKiBQb3NzaWJpbGl0aWVzOgorCQkJICogc2ggLi4uIC1jICdzY3JpcHQnCisJCQkgKiBzaCAuLi4gLWMgJ3NjcmlwdCcgQVJHMCBbQVJHMS4uLl0KKwkJCSAqIE9uIE5PTU1VLCBpZiBidWlsdGluX2FyZ2MgIT0gMCwKKwkJCSAqIHNoIC4uLiAtYyAnYnVpbHRpbicgQkFSR1YuLi4gIiIgQVJHMCBbQVJHMS4uLl0KKwkJCSAqICIiIG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggTlVMTAorCQkJICogYW5kIEJBUkdWIHZlY3RvciBmZWQgdG8gYnVpbHRpbiBmdW5jdGlvbi4KKwkJCSAqIE5vdGU6IHRoZSBmb3JtIHdpdGhvdXQgQVJHMCBuZXZlciBoYXBwZW5zOgorCQkJICogc2ggLi4uIC1jICdidWlsdGluJyBCQVJHVi4uLiAiIgorCQkJICovCisJCQlpZiAoIUcucm9vdF9waWQpIHsKKwkJCQlHLnJvb3RfcGlkID0gZ2V0cGlkKCk7CisJCQkJRy5yb290X3BwaWQgPSBnZXRwcGlkKCk7CisJCQl9CisJCQlHLmdsb2JhbF9hcmd2ID0gYXJndiArIG9wdGluZDsKKwkJCUcuZ2xvYmFsX2FyZ2MgPSBhcmdjIC0gb3B0aW5kOworCQkJaWYgKGJ1aWx0aW5fYXJnYykgeworCQkJCS8qIC1jICdidWlsdGluJyBbQkFSR1YuLi5dICIiIEFSRzAgW0FSRzEuLi5dICovCisJCQkJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKng7CisKKwkJCQlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKwkJCQl4ID0gZmluZF9idWlsdGluKG9wdGFyZyk7CisJCQkJaWYgKHgpIHsgLyogcGFyYW5vaWEgKi8KKwkJCQkJRy5nbG9iYWxfYXJnYyAtPSBidWlsdGluX2FyZ2M7IC8qIHNraXAgW0JBUkdWLi4uXSAiIiAqLworCQkJCQlHLmdsb2JhbF9hcmd2ICs9IGJ1aWx0aW5fYXJnYzsKKwkJCQkJRy5nbG9iYWxfYXJndlstMV0gPSBOVUxMOyAvKiByZXBsYWNlICIiICovCisJCQkJCWZmbHVzaF9hbGwoKTsKKwkJCQkJRy5sYXN0X2V4aXRjb2RlID0geC0+Yl9mdW5jdGlvbihhcmd2ICsgb3B0aW5kIC0gMSk7CisJCQkJfQorCQkJCWdvdG8gZmluYWxfcmV0dXJuOworCQkJfQorCQkJaWYgKCFHLmdsb2JhbF9hcmd2WzBdKSB7CisJCQkJLyogLWMgJ3NjcmlwdCcgKG5vIHBhcmFtcyk6IHByZXZlbnQgZW1wdHkgJDAgKi8KKwkJCQlHLmdsb2JhbF9hcmd2LS07IC8qIHBvaW50cyB0byBhcmd2W2ldIG9mICdzY3JpcHQnICovCisJCQkJRy5nbG9iYWxfYXJndlswXSA9IGFyZ3ZbMF07CisJCQkJRy5nbG9iYWxfYXJnYysrOworCQkJfSAvKiBlbHNlIC1jICdzY3JpcHQnIEFSRzAgW0FSRzEuLi5dOiAkMCBpcyBBUkcwICovCisJCQlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKwkJCXBhcnNlX2FuZF9ydW5fc3RyaW5nKG9wdGFyZyk7CisJCQlnb3RvIGZpbmFsX3JldHVybjsKKwkJY2FzZSAnaSc6CisJCQkvKiBXZWxsLCB3ZSBjYW5ub3QganVzdCBkZWNsYXJlIGludGVyYWN0aXZlbmVzcywKKwkJCSAqIHdlIGhhdmUgdG8gaGF2ZSBzb21lIHN0dWZmIChjdHR5LCBldGMpICovCisJCQkvKiBHX2ludGVyYWN0aXZlX2ZkKys7ICovCisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQkvKiAiLXMiIG1lYW5zICJyZWFkIGZyb20gc3RkaW4iLCBidXQgdGhpcyBpcyBob3cgd2UgYWx3YXlzCisJCQkgKiBvcGVyYXRlLCBzbyBzaW1wbHkgZG8gbm90aGluZyBoZXJlLiAqLworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJZmxhZ3MgfD0gT1BUX2xvZ2luOworCQkJYnJlYWs7CisjaWYgIUJCX01NVQorCQljYXNlICc8JzogLyogImJpZyBoZXJlZG9jIiBzdXBwb3J0ICovCisJCQlmdWxsX3dyaXRlMV9zdHIob3B0YXJnKTsKKwkJCV9leGl0KDApOworCQljYXNlICckJzogeworCQkJdW5zaWduZWQgbG9uZyBsb25nIGVtcHR5X3RyYXBfbWFzazsKKworCQkJRy5yb290X3BpZCA9IGJiX3N0cnRvdShvcHRhcmcsICZvcHRhcmcsIDE2KTsKKwkJCW9wdGFyZysrOworCQkJRy5yb290X3BwaWQgPSBiYl9zdHJ0b3Uob3B0YXJnLCAmb3B0YXJnLCAxNik7CisJCQlvcHRhcmcrKzsKKwkJCUcubGFzdF9iZ19waWQgPSBiYl9zdHJ0b3Uob3B0YXJnLCAmb3B0YXJnLCAxNik7CisJCQlvcHRhcmcrKzsKKwkJCUcubGFzdF9leGl0Y29kZSA9IGJiX3N0cnRvdShvcHRhcmcsICZvcHRhcmcsIDE2KTsKKwkJCW9wdGFyZysrOworCQkJYnVpbHRpbl9hcmdjID0gYmJfc3RydG91KG9wdGFyZywgJm9wdGFyZywgMTYpOworCQkJb3B0YXJnKys7CisJCQllbXB0eV90cmFwX21hc2sgPSBiYl9zdHJ0b3VsbChvcHRhcmcsICZvcHRhcmcsIDE2KTsKKwkJCWlmIChlbXB0eV90cmFwX21hc2sgIT0gMCkgeworCQkJCWludCBzaWc7CisJCQkJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisJCQkJRy50cmFwcyA9IHh6YWxsb2Moc2l6ZW9mKEcudHJhcHNbMF0pICogTlNJRyk7CisJCQkJZm9yIChzaWcgPSAxOyBzaWcgPCBOU0lHOyBzaWcrKykgeworCQkJCQlpZiAoZW1wdHlfdHJhcF9tYXNrICYgKDFMTCA8PCBzaWcpKSB7CisJCQkJCQlHLnRyYXBzW3NpZ10gPSB4emFsbG9jKDEpOyAvKiA9PSB4c3RyZHVwKCIiKTsgKi8KKwkJCQkJCWluc3RhbGxfc2lnaGFuZGxlcihzaWcsIFNJR19JR04pOworCQkJCQl9CisJCQkJfQorCQkJfQorIyBpZiBFTkFCTEVfSFVTSF9MT09QUworCQkJb3B0YXJnKys7CisJCQlHLmRlcHRoX29mX2xvb3AgPSBiYl9zdHJ0b3Uob3B0YXJnLCAmb3B0YXJnLCAxNik7CisjIGVuZGlmCisJCQlicmVhazsKKwkJfQorCQljYXNlICdSJzoKKwkJY2FzZSAnVic6CisJCQlzZXRfbG9jYWxfdmFyKHhzdHJkdXAob3B0YXJnKSwgLypleHA6Ki8gMCwgLypsdmw6Ki8gMCwgLypybzoqLyBvcHQgPT0gJ1InKTsKKwkJCWJyZWFrOworIyBpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJY2FzZSAnRic6IHsKKwkJCXN0cnVjdCBmdW5jdGlvbiAqZnVuY3AgPSBuZXdfZnVuY3Rpb24ob3B0YXJnKTsKKwkJCS8qIGZ1bmNwLT5uYW1lIGlzIGFscmVhZHkgc2V0IHRvIG9wdGFyZyAqLworCQkJLyogZnVuY3AtPmJvZHkgaXMgc2V0IHRvIE5VTEwuIEl0J3MgYSBzcGVjaWFsIGNhc2UuICovCisJCQlmdW5jcC0+Ym9keV9hc19zdHJpbmcgPSBhcmd2W29wdGluZF07CisJCQlvcHRpbmQrKzsKKwkJCWJyZWFrOworCQl9CisjIGVuZGlmCisjZW5kaWYKKwkJY2FzZSAnbic6CisJCWNhc2UgJ3gnOgorCQkJaWYgKHNldF9tb2RlKDEsIG9wdCwgTlVMTCkgPT0gMCkgLyogbm8gZXJyb3IgKi8KKwkJCQlicmVhazsKKwkJZGVmYXVsdDoKKyNpZm5kZWYgQkJfVkVSCisJCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBzaCBbRklMRV0uLi5cbiIKKwkJCQkJIiAgIG9yOiBzaCAtYyBjb21tYW5kIFthcmdzXS4uLlxuXG4iKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbHNlCisJCQliYl9zaG93X3VzYWdlKCk7CisjZW5kaWYKKwkJfQorCX0gLyogb3B0aW9uIHBhcnNpbmcgbG9vcCAqLworCisJLyogU2tpcCBvcHRpb25zLiBUcnkgImh1c2ggLWwiOiAkMSBzaG91bGQgbm90IGJlICItbCIhICovCisJRy5nbG9iYWxfYXJnYyA9IGFyZ2MgLSAob3B0aW5kIC0gMSk7CisJRy5nbG9iYWxfYXJndiA9IGFyZ3YgKyAob3B0aW5kIC0gMSk7CisJRy5nbG9iYWxfYXJndlswXSA9IGFyZ3ZbMF07CisKKwlpZiAoIUcucm9vdF9waWQpIHsKKwkJRy5yb290X3BpZCA9IGdldHBpZCgpOworCQlHLnJvb3RfcHBpZCA9IGdldHBwaWQoKTsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgbG9naW4gc2hlbGwuLi4gKi8KKwlpZiAoZmxhZ3MgJiBPUFRfbG9naW4pIHsKKwkJRklMRSAqaW5wdXQ7CisJCWRlYnVnX3ByaW50Zigic291cmNpbmcgL2V0Yy9wcm9maWxlXG4iKTsKKwkJaW5wdXQgPSBmb3Blbl9mb3JfcmVhZCgiL2V0Yy9wcm9maWxlIik7CisJCWlmIChpbnB1dCAhPSBOVUxMKSB7CisJCQljbG9zZV9vbl9leGVjX29uKGZpbGVubyhpbnB1dCkpOworCQkJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisJCQlwYXJzZV9hbmRfcnVuX2ZpbGUoaW5wdXQpOworCQkJZmNsb3NlKGlucHV0KTsKKwkJfQorCQkvKiBiYXNoOiBhZnRlciBzb3VyY2luZyAvZXRjL3Byb2ZpbGUsCisJCSAqIHRyaWVzIHRvIHNvdXJjZSAoaW4gdGhlIGdpdmVuIG9yZGVyKToKKwkJICogfi8uYmFzaF9wcm9maWxlLCB+Ly5iYXNoX2xvZ2luLCB+Ly5wcm9maWxlLAorCQkgKiBzdG9wcGluZyBvbiBmaXJzdCBmb3VuZC4gLS1ub3Byb2ZpbGUgdHVybnMgdGhpcyBvZmYuCisJCSAqIGJhc2ggYWxzbyBzb3VyY2VzIH4vLmJhc2hfbG9nb3V0IG9uIGV4aXQuCisJCSAqIElmIGNhbGxlZCBhcyBzaCwgc2tpcHMgLmJhc2hfWFhYIGZpbGVzLgorCQkgKi8KKwl9CisKKwlpZiAoRy5nbG9iYWxfYXJndlsxXSkgeworCQlGSUxFICppbnB1dDsKKwkJLyoKKwkJICogImJhc2ggPHNjcmlwdD4iICh3aGljaCBpcyBuZXZlciBpbnRlcmFjdGl2ZSAodW5sZXNzIC1pPykpCisJCSAqIHNvdXJjZXMgJEJBU0hfRU5WIGhlcmUgKHdpdGhvdXQgc2Nhbm5pbmcgJFBBVEgpLgorCQkgKiBJZiBjYWxsZWQgYXMgc2gsIGRvZXMgdGhlIHNhbWUgYnV0IHdpdGggJEVOVi4KKwkJICovCisJCUcuZ2xvYmFsX2FyZ2MtLTsKKwkJRy5nbG9iYWxfYXJndisrOworCQlkZWJ1Z19wcmludGYoInJ1bm5pbmcgc2NyaXB0ICclcydcbiIsIEcuZ2xvYmFsX2FyZ3ZbMF0pOworCQlpbnB1dCA9IHhmb3Blbl9mb3JfcmVhZChHLmdsb2JhbF9hcmd2WzBdKTsKKwkJY2xvc2Vfb25fZXhlY19vbihmaWxlbm8oaW5wdXQpKTsKKwkJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisJCXBhcnNlX2FuZF9ydW5fZmlsZShpbnB1dCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKKwkJZmNsb3NlKGlucHV0KTsKKyNlbmRpZgorCQlnb3RvIGZpbmFsX3JldHVybjsKKwl9CisKKwkvKiBVcCB0byBoZXJlLCBzaGVsbCB3YXMgbm9uLWludGVyYWN0aXZlLiBOb3cgaXQgbWF5IGJlY29tZSBvbmUuCisJICogTkI6IGRvbid0IGZvcmdldCB0byAocmUpcnVuIGluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpIGFzIG5lZWRlZC4KKwkgKi8KKworCS8qIEEgc2hlbGwgaXMgaW50ZXJhY3RpdmUgaWYgdGhlICctaScgZmxhZyB3YXMgZ2l2ZW4sCisJICogb3IgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCSAqICAgIG5vIC1jIGNvbW1hbmQKKwkgKiAgICBubyBhcmd1bWVudHMgcmVtYWluaW5nIG9yIHRoZSAtcyBmbGFnIGdpdmVuCisJICogICAgc3RhbmRhcmQgaW5wdXQgaXMgYSB0ZXJtaW5hbAorCSAqICAgIHN0YW5kYXJkIG91dHB1dCBpcyBhIHRlcm1pbmFsCisJICogUmVmZXIgdG8gUG9zaXguMiwgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAnc2gnIHV0aWxpdHkuCisJICovCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pICYmIGlzYXR0eShTVERPVVRfRklMRU5PKSkgeworCQlHX3NhdmVkX3R0eV9wZ3JwID0gdGNnZXRwZ3JwKFNURElOX0ZJTEVOTyk7CisJCWRlYnVnX3ByaW50Zigic2F2ZWRfdHR5X3BncnA6JWRcbiIsIEdfc2F2ZWRfdHR5X3BncnApOworCQlpZiAoR19zYXZlZF90dHlfcGdycCA8IDApCisJCQlHX3NhdmVkX3R0eV9wZ3JwID0gMDsKKworCQkvKiB0cnkgdG8gZHVwIHN0ZGluIHRvIGhpZ2ggZmQjLCA+PSAyNTUgKi8KKwkJR19pbnRlcmFjdGl2ZV9mZCA9IGZjbnRsKFNURElOX0ZJTEVOTywgRl9EVVBGRCwgMjU1KTsKKwkJaWYgKEdfaW50ZXJhY3RpdmVfZmQgPCAwKSB7CisJCQkvKiB0cnkgdG8gZHVwIHRvIGFueSBmZCAqLworCQkJR19pbnRlcmFjdGl2ZV9mZCA9IGR1cChTVERJTl9GSUxFTk8pOworCQkJaWYgKEdfaW50ZXJhY3RpdmVfZmQgPCAwKSB7CisJCQkJLyogZ2l2ZSB1cCAqLworCQkJCUdfaW50ZXJhY3RpdmVfZmQgPSAwOworCQkJCUdfc2F2ZWRfdHR5X3BncnAgPSAwOworCQkJfQorCQl9CisvLyBUT0RPOiB0cmFjayAmIGRpc2FsbG93IGFueSBhdHRlbXB0cyBvZiB1c2VyCisvLyB0byAoaW5hZHZlcnRlbnRseSkgY2xvc2UvcmVkaXJlY3QgR19pbnRlcmFjdGl2ZV9mZAorCX0KKwlkZWJ1Z19wcmludGYoImludGVyYWN0aXZlX2ZkOiVkXG4iLCBHX2ludGVyYWN0aXZlX2ZkKTsKKwlpZiAoR19pbnRlcmFjdGl2ZV9mZCkgeworCQljbG9zZV9vbl9leGVjX29uKEdfaW50ZXJhY3RpdmVfZmQpOworCisJCWlmIChHX3NhdmVkX3R0eV9wZ3JwKSB7CisJCQkvKiBJZiB3ZSB3ZXJlIHJ1biBhcyAnaHVzaCAmJywgc2xlZXAgdW50aWwgd2UgYXJlCisJCQkgKiBpbiB0aGUgZm9yZWdyb3VuZCAodHR5IHBncnAgPT0gb3VyIHBncnApLgorCQkJICogSWYgd2UgZ2V0IHN0YXJ0ZWQgdW5kZXIgYSBqb2IgYXdhcmUgYXBwIChsaWtlIGJhc2gpLAorCQkJICogbWFrZSBzdXJlIHdlIGFyZSBub3cgaW4gY2hhcmdlIHNvIHdlIGRvbid0IGZpZ2h0IG92ZXIKKwkJCSAqIHdobyBnZXRzIHRoZSBmb3JlZ3JvdW5kICovCisJCQl3aGlsZSAoMSkgeworCQkJCXBpZF90IHNoZWxsX3BncnAgPSBnZXRwZ3JwKCk7CisJCQkJR19zYXZlZF90dHlfcGdycCA9IHRjZ2V0cGdycChHX2ludGVyYWN0aXZlX2ZkKTsKKwkJCQlpZiAoR19zYXZlZF90dHlfcGdycCA9PSBzaGVsbF9wZ3JwKQorCQkJCQlicmVhazsKKwkJCQkvKiBzZW5kIFRUSU4gdG8gb3Vyc2VsZiAoc2hvdWxkIHN0b3AgdXMpICovCisJCQkJa2lsbCgtIHNoZWxsX3BncnAsIFNJR1RUSU4pOworCQkJfQorCQl9CisKKwkJLyogSW5zdGFsbCBtb3JlIHNpZ25hbCBoYW5kbGVycyAqLworCQlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKworCQlpZiAoR19zYXZlZF90dHlfcGdycCkgeworCQkJLyogU2V0IG90aGVyIHNpZ25hbHMgdG8gcmVzdG9yZSBzYXZlZF90dHlfcGdycCAqLworCQkJaW5zdGFsbF9mYXRhbF9zaWdoYW5kbGVycygpOworCQkJLyogUHV0IG91cnNlbHZlcyBpbiBvdXIgb3duIHByb2Nlc3MgZ3JvdXAKKwkJCSAqIChiYXNoLCB0b28sIGRvZXMgdGhpcyBvbmx5IGlmIGN0dHkgaXMgYXZhaWxhYmxlKSAqLworCQkJYmJfc2V0cGdycCgpOyAvKiBpcyB0aGUgc2FtZSBhcyBzZXRwZ2lkKG91cl9waWQsIG91cl9waWQpOyAqLworCQkJLyogR3JhYiBjb250cm9sIG9mIHRoZSB0ZXJtaW5hbCAqLworCQkJdGNzZXRwZ3JwKEdfaW50ZXJhY3RpdmVfZmQsIGdldHBpZCgpKTsKKwkJfQorCQkvKiAtMSBpcyBzcGVjaWFsIC0gbWFrZXMgeGZ1bmNzIGxvbmdqbXAsIG5vdCBleGl0CisJCSAqICh3ZSByZXNldCBkaWVfc2xlZXAgPSAwIHdoZXJlZXZlciB3ZSBbdl1mb3JrKSAqLworCQllbmFibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCk7IC8qIHNldHMgZGllX3NsZWVwID0gLTEgKi8KKwl9IGVsc2UgeworCQlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKwl9CisjZWxpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorCS8qIE5vIGpvYiBjb250cm9sIGNvbXBpbGVkIGluLCBvbmx5IHByb21wdC9saW5lIGVkaXRpbmcgKi8KKwlpZiAoaXNhdHR5KFNURElOX0ZJTEVOTykgJiYgaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCUdfaW50ZXJhY3RpdmVfZmQgPSBmY250bChTVERJTl9GSUxFTk8sIEZfRFVQRkQsIDI1NSk7CisJCWlmIChHX2ludGVyYWN0aXZlX2ZkIDwgMCkgeworCQkJLyogdHJ5IHRvIGR1cCB0byBhbnkgZmQgKi8KKwkJCUdfaW50ZXJhY3RpdmVfZmQgPSBkdXAoU1RESU5fRklMRU5PKTsKKwkJCWlmIChHX2ludGVyYWN0aXZlX2ZkIDwgMCkKKwkJCQkvKiBnaXZlIHVwICovCisJCQkJR19pbnRlcmFjdGl2ZV9mZCA9IDA7CisJCX0KKwl9CisJaWYgKEdfaW50ZXJhY3RpdmVfZmQpIHsKKwkJY2xvc2Vfb25fZXhlY19vbihHX2ludGVyYWN0aXZlX2ZkKTsKKwl9CisJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisjZWxzZQorCS8qIFdlIGhhdmUgaW50ZXJhY3RpdmVuZXNzIGNvZGUgZGlzYWJsZWQgKi8KKwlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKyNlbmRpZgorCS8qIGJhc2g6CisJICogaWYgaW50ZXJhY3RpdmUgYnV0IG5vdCBhIGxvZ2luIHNoZWxsLCBzb3VyY2VzIH4vLmJhc2hyYworCSAqICgtLW5vcmMgdHVybnMgdGhpcyBvZmYsIC0tcmNmaWxlIDxmaWxlPiBvdmVycmlkZXMpCisJICovCisKKwlpZiAoIUVOQUJMRV9GRUFUVVJFX1NIX0VYVFJBX1FVSUVUICYmIEdfaW50ZXJhY3RpdmVfZmQpIHsKKwkJLyogbm90ZTogYXNoIGFuZCBodXNoIHNoYXJlIHRoaXMgc3RyaW5nICovCisJCXByaW50ZigiXG5cbiVzICVzXG4iCisJCQlJRl9IVVNIX0hFTFAoIkVudGVyICdoZWxwJyBmb3IgYSBsaXN0IG9mIGJ1aWx0LWluIGNvbW1hbmRzLlxuIikKKwkJCSJcbiIsCisJCQliYl9iYW5uZXIsCisJCQkiaHVzaCAtIHRoZSBodW1ibGUgc2hlbGwiCisJCSk7CisJfQorCisJcGFyc2VfYW5kX3J1bl9maWxlKHN0ZGluKTsKKworIGZpbmFsX3JldHVybjoKKwlodXNoX2V4aXQoRy5sYXN0X2V4aXRjb2RlKTsKK30KKworCisjaWYgRU5BQkxFX01TSAoraW50IG1zaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbXNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCS8vYmJfZXJyb3JfbXNnKCJtc2ggaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBodXNoIGluc3RlYWQiKTsKKwlyZXR1cm4gaHVzaF9tYWluKGFyZ2MsIGFyZ3YpOworfQorI2VuZGlmCisKKworLyoKKyAqIEJ1aWx0LWlucworICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3RydWUoY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ1bl9hcHBsZXRfbWFpbihjaGFyICoqYXJndiwgaW50ICgqYXBwbGV0X21haW5fZnVuYykoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSkKK3sKKwlpbnQgYXJnYyA9IDA7CisJd2hpbGUgKCphcmd2KSB7CisJCWFyZ2MrKzsKKwkJYXJndisrOworCX0KKwlyZXR1cm4gYXBwbGV0X21haW5fZnVuYyhhcmdjLCBhcmd2IC0gYXJnYyk7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fdGVzdChjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gcnVuX2FwcGxldF9tYWluKGFyZ3YsIHRlc3RfbWFpbik7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fZWNobyhjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gcnVuX2FwcGxldF9tYWluKGFyZ3YsIGVjaG9fbWFpbik7Cit9CisKKyNpZiBFTkFCTEVfUFJJTlRGCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3ByaW50ZihjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gcnVuX2FwcGxldF9tYWluKGFyZ3YsIHByaW50Zl9tYWluKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY2hhciAqKnNraXBfZGFzaF9kYXNoKGNoYXIgKiphcmd2KQoreworCWFyZ3YrKzsKKwlpZiAoYXJndlswXSAmJiBhcmd2WzBdWzBdID09ICctJyAmJiBhcmd2WzBdWzFdID09ICctJyAmJiBhcmd2WzBdWzJdID09ICdcMCcpCisJCWFyZ3YrKzsKKwlyZXR1cm4gYXJndjsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9ldmFsKGNoYXIgKiphcmd2KQoreworCWludCByY29kZSA9IEVYSVRfU1VDQ0VTUzsKKworCWFyZ3YgPSBza2lwX2Rhc2hfZGFzaChhcmd2KTsKKwlpZiAoKmFyZ3YpIHsKKwkJY2hhciAqc3RyID0gZXhwYW5kX3N0cnZlY190b19zdHJpbmcoYXJndik7CisJCS8qIGJhc2g6CisJCSAqIGV2YWwgImVjaG8gSGk7IGRvbmUiICgiZG9uZSIgaXMgc3ludGF4IGVycm9yKToKKwkJICogImVjaG8gSGkiIHdpbGwgbm90IGV4ZWN1dGUgdG9vLgorCQkgKi8KKwkJcGFyc2VfYW5kX3J1bl9zdHJpbmcoc3RyKTsKKwkJZnJlZShzdHIpOworCQlyY29kZSA9IEcubGFzdF9leGl0Y29kZTsKKwl9CisJcmV0dXJuIHJjb2RlOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2NkKGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKm5ld2RpcjsKKworCWFyZ3YgPSBza2lwX2Rhc2hfZGFzaChhcmd2KTsKKwluZXdkaXIgPSBhcmd2WzBdOworCWlmIChuZXdkaXIgPT0gTlVMTCkgeworCQkvKiBiYXNoIGRvZXMgbm90aGluZyAoZXhpdGNvZGUgMCkgaWYgSE9NRSBpcyAiIjsgaWYgaXQncyB1bnNldCwKKwkJICogYmFzaCBzYXlzICJiYXNoOiBjZDogSE9NRSBub3Qgc2V0IiBhbmQgZG9lcyBub3RoaW5nCisJCSAqIChleGl0Y29kZSAxKQorCQkgKi8KKwkJY29uc3QgY2hhciAqaG9tZSA9IGdldF9sb2NhbF92YXJfdmFsdWUoIkhPTUUiKTsKKwkJbmV3ZGlyID0gaG9tZSA/IGhvbWUgOiAiLyI7CisJfQorCWlmIChjaGRpcihuZXdkaXIpKSB7CisJCS8qIE1pbWljIGJhc2ggbWVzc2FnZSBleGFjdGx5ICovCisJCWJiX3BlcnJvcl9tc2coImNkOiAlcyIsIG5ld2Rpcik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCS8qIFJlYWQgY3VycmVudCBkaXIgKGdldF9jd2QoMSkgaXMgaW5zaWRlKSBhbmQgc2V0IFBXRC4KKwkgKiBOb3RlOiBkbyBub3QgZW5mb3JjZSBleHBvcnRpbmcuIElmIFBXRCB3YXMgdW5zZXQgb3IgdW5leHBvcnRlZCwKKwkgKiBzZXQgaXQgYWdhaW4sIGJ1dCBkbyBub3QgZXhwb3J0LiBiYXNoIGRvZXMgdGhlIHNhbWUuCisJICovCisJc2V0X3B3ZF92YXIoLypleHA6Ki8gMCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9leGVjKGNoYXIgKiphcmd2KQoreworCWFyZ3YgPSBza2lwX2Rhc2hfZGFzaChhcmd2KTsKKwlpZiAoYXJndlswXSA9PSBOVUxMKQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOyAvKiBiYXNoIGRvZXMgdGhpcyAqLworCisJLyogQ2FyZWZ1bDogd2UgY2FuIGVuZCB1cCBoZXJlIGFmdGVyIFt2XWZvcmsuIERvIG5vdCByZXN0b3JlCisJICogdHR5IHBncnAgdGhlbiwgb25seSB0b3AtbGV2ZWwgc2hlbGwgcHJvY2VzcyBkb2VzIHRoYXQgKi8KKwlpZiAoR19zYXZlZF90dHlfcGdycCAmJiBnZXRwaWQoKSA9PSBHLnJvb3RfcGlkKQorCQl0Y3NldHBncnAoR19pbnRlcmFjdGl2ZV9mZCwgR19zYXZlZF90dHlfcGdycCk7CisKKwkvKiBUT0RPOiBpZiBleGVjIGZhaWxzLCBiYXNoIGRvZXMgTk9UIGV4aXQhIFdlIGRvLgorCSAqIFdlJ2xsIG5lZWQgdG8gdW5kbyB0cmFwIGNsZWFudXAgKGl0J3MgaW5zaWRlIGV4ZWN2cF9vcl9kaWUpCisJICogYW5kIHRjc2V0cGdycCwgYW5kIHRoaXMgaXMgaW5oZXJlbnRseSByYWN5LgorCSAqLworCWV4ZWN2cF9vcl9kaWUoYXJndik7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fZXhpdChjaGFyICoqYXJndikKK3sKKwlkZWJ1Z19wcmludGZfZXhlYygiJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogaW50ZXJhY3RpdmUgYmFzaDoKKwkgKiAjIHRyYXAgImVjaG8gRUVFIiBFWElUCisJICogIyBleGl0CisJICogZXhpdAorCSAqIFRoZXJlIGFyZSBzdG9wcGVkIGpvYnMuCisJICogKGlmIHRoZXJlIGFyZSBfc3RvcHBlZF8gam9icywgcnVubmluZyBvbmVzIGRvbid0IGNvdW50KQorCSAqICMgZXhpdAorCSAqIGV4aXQKKwkgIyBFRUUgKHRoZW4gYmFzaCBleGl0cykKKwkgKgorCSAqIFRPRE86IHdlIGNhbiB1c2UgRy5leGl0aW5nID0gLTEgYXMgaW5kaWNhdG9yICJsYXN0IGNtZCB3YXMgZXhpdCIKKwkgKi8KKworCS8qIG5vdGU6IEVYSVQgdHJhcCBpcyBydW4gYnkgaHVzaF9leGl0ICovCisJYXJndiA9IHNraXBfZGFzaF9kYXNoKGFyZ3YpOworCWlmIChhcmd2WzBdID09IE5VTEwpCisJCWh1c2hfZXhpdChHLmxhc3RfZXhpdGNvZGUpOworCS8qIG1pbWljIGJhc2g6IGV4aXQgMTIzYWJjID09IGV4aXQgMjU1ICsgZXJyb3IgbXNnICovCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMjU1OworCS8qIGJhc2g6IGV4aXQgLTIgPT0gZXhpdCAyNTQsIG5vIGVycm9yIG1zZyAqLworCWh1c2hfZXhpdCh4YXRvaShhcmd2WzBdKSAmIDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9lc2NhcGVkKGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKCpzID09ICdcJycpCisJCWdvdG8gc3F1b3RlOworCWRvIHsKKwkJY29uc3QgY2hhciAqcCA9IHN0cmNocm51bChzLCAnXCcnKTsKKwkJLyogcHJpbnQgJ3h4eHgnLCBwb3NzaWJseSBqdXN0ICcnICovCisJCXByaW50ZigiJyUuKnMnIiwgKGludCkocCAtIHMpLCBzKTsKKwkJaWYgKCpwID09ICdcMCcpCisJCQlicmVhazsKKwkJcyA9IHA7Cisgc3F1b3RlOgorCQkvKiBzIHBvaW50cyB0byAnOyBwcmludCAiJycnLi4uJycnIiAqLworCQlwdXRjaGFyKCciJyk7CisJCWRvIHB1dGNoYXIoJ1wnJyk7IHdoaWxlICgqKytzID09ICdcJycpOworCQlwdXRjaGFyKCciJyk7CisJfSB3aGlsZSAoKnMpOworfQorCisjaWYgIUVOQUJMRV9IVVNIX0xPQ0FMCisjZGVmaW5lIGhlbHBlcl9leHBvcnRfbG9jYWwoYXJndiwgZXhwLCBsdmwpIFwKKwloZWxwZXJfZXhwb3J0X2xvY2FsKGFyZ3YsIGV4cCkKKyNlbmRpZgorc3RhdGljIHZvaWQgaGVscGVyX2V4cG9ydF9sb2NhbChjaGFyICoqYXJndiwgaW50IGV4cCwgaW50IGx2bCkKK3sKKwlkbyB7CisJCWNoYXIgKm5hbWUgPSAqYXJndjsKKwkJY2hhciAqbmFtZV9lbmQgPSBzdHJjaHJudWwobmFtZSwgJz0nKTsKKworCQkvKiBTbyBmYXIgd2UgZG8gbm90IGNoZWNrIHRoYXQgbmFtZSBpcyB2YWxpZCAoVE9ETz8pICovCisKKwkJaWYgKCpuYW1lX2VuZCA9PSAnXDAnKSB7CisJCQlzdHJ1Y3QgdmFyaWFibGUgKnZhciwgKip2cHA7CisKKwkJCXZwcCA9IGdldF9wdHJfdG9fbG9jYWxfdmFyKG5hbWUsIG5hbWVfZW5kIC0gbmFtZSk7CisJCQl2YXIgPSB2cHAgPyAqdnBwIDogTlVMTDsKKworCQkJaWYgKGV4cCA9PSAtMSkgeyAvKiB1bmV4cG9ydGluZz8gKi8KKwkJCQkvKiBleHBvcnQgLW4gTkFNRSAod2l0aG91dCA9VkFMVUUpICovCisJCQkJaWYgKHZhcikgeworCQkJCQl2YXItPmZsZ19leHBvcnQgPSAwOworCQkJCQlkZWJ1Z19wcmludGZfZW52KCIlczogdW5zZXRlbnYgJyVzJ1xuIiwgX19mdW5jX18sIG5hbWUpOworCQkJCQl1bnNldGVudihuYW1lKTsKKwkJCQl9IC8qIGVsc2U6IGV4cG9ydCAtbiBOT1RfRVhJU1RJTkdfVkFSOiBuby1vcCAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGV4cCA9PSAxKSB7IC8qIGV4cG9ydGluZz8gKi8KKwkJCQkvKiBleHBvcnQgTkFNRSAod2l0aG91dCA9VkFMVUUpICovCisJCQkJaWYgKHZhcikgeworCQkJCQl2YXItPmZsZ19leHBvcnQgPSAxOworCQkJCQlkZWJ1Z19wcmludGZfZW52KCIlczogcHV0ZW52ICclcydcbiIsIF9fZnVuY19fLCB2YXItPnZhcnN0cik7CisJCQkJCXB1dGVudih2YXItPnZhcnN0cik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCS8qIEV4cG9ydGluZyBub24tZXhpc3RpbmcgdmFyaWFibGUuCisJCQkgKiBiYXNoIGRvZXMgbm90IHB1dCBpdCBpbiBlbnZpcm9ubWVudCwKKwkJCSAqIGJ1dCByZW1lbWJlcnMgdGhhdCBpdCBpcyBleHBvcnRlZCwKKwkJCSAqIGFuZCBkb2VzIHB1dCBpdCBpbiBlbnYgd2hlbiBpdCBpcyBzZXQgbGF0ZXIuCisJCQkgKiBXZSBqdXN0IHNldCBpdCB0byAiIiBhbmQgZXhwb3J0LiAqLworCQkJLyogT3IsIGl0J3MgImxvY2FsIE5BTUUiICh3aXRob3V0ID1WQUxVRSkuCisJCQkgKiBiYXNoIHNldHMgdGhlIHZhbHVlIHRvICIiLiAqLworCQkJbmFtZSA9IHhhc3ByaW50ZigiJXM9IiwgbmFtZSk7CisJCX0gZWxzZSB7CisJCQkvKiAoVW4pZXhwb3J0aW5nL21ha2luZyBsb2NhbCBOQU1FPVZBTFVFICovCisJCQluYW1lID0geHN0cmR1cChuYW1lKTsKKwkJfQorCQlzZXRfbG9jYWxfdmFyKG5hbWUsIC8qZXhwOiovIGV4cCwgLypsdmw6Ki8gbHZsLCAvKnJvOiovIDApOworCX0gd2hpbGUgKCorK2FyZ3YpOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2V4cG9ydChjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRfdW5leHBvcnQ7CisKKyNpZiBFTkFCTEVfSFVTSF9FWFBPUlRfTgorCS8qICIhIjogZG8gbm90IGFib3J0IG9uIGVycm9ycyAqLworCW9wdF91bmV4cG9ydCA9IGdldG9wdDMyKGFyZ3YsICIhbiIpOworCWlmIChvcHRfdW5leHBvcnQgPT0gKHVpbnQzMl90KS0xKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCWFyZ3YgKz0gb3B0aW5kOworI2Vsc2UKKwlvcHRfdW5leHBvcnQgPSAwOworCWFyZ3YrKzsKKyNlbmRpZgorCisJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkgeworCQljaGFyICoqZSA9IGVudmlyb247CisJCWlmIChlKSB7CisJCQl3aGlsZSAoKmUpIHsKKyNpZiAwCisJCQkJcHV0cygqZSsrKTsKKyNlbHNlCisJCQkJLyogYXNoIGVtaXRzOiBleHBvcnQgVkFSPSdWQUwnCisJCQkJICogYmFzaDogZGVjbGFyZSAteCBWQVI9IlZBTCIKKwkJCQkgKiB3ZSBmb2xsb3cgYXNoIGV4YW1wbGUgKi8KKwkJCQljb25zdCBjaGFyICpzID0gKmUrKzsKKwkJCQljb25zdCBjaGFyICpwID0gc3RyY2hyKHMsICc9Jyk7CisKKwkJCQlpZiAoIXApIC8qIHd0Zj8gdGFrZSBuZXh0IHZhcmlhYmxlICovCisJCQkJCWNvbnRpbnVlOworCQkJCS8qIGV4cG9ydCB2YXI9ICovCisJCQkJcHJpbnRmKCJleHBvcnQgJS4qcyIsIChpbnQpKHAgLSBzKSArIDEsIHMpOworCQkJCXByaW50X2VzY2FwZWQocCArIDEpOworCQkJCXB1dGNoYXIoJ1xuJyk7CisjZW5kaWYKKwkJCX0KKwkJCS8qZmZsdXNoX2FsbCgpOyAtIGRvbmUgYWZ0ZXIgZWFjaCBidWlsdGluIGFueXdheSAqLworCQl9CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJaGVscGVyX2V4cG9ydF9sb2NhbChhcmd2LCAob3B0X3VuZXhwb3J0ID8gLTEgOiAxKSwgMCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisjaWYgRU5BQkxFX0hVU0hfTE9DQUwKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fbG9jYWwoY2hhciAqKmFyZ3YpCit7CisJaWYgKEcuZnVuY19uZXN0X2xldmVsID09IDApIHsKKwkJYmJfZXJyb3JfbXNnKCIlczogbm90IGluIGEgZnVuY3Rpb24iLCBhcmd2WzBdKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsgLyogYmFzaCBjb21wYXQgKi8KKwl9CisJaGVscGVyX2V4cG9ydF9sb2NhbChhcmd2LCAwLCBHLmZ1bmNfbmVzdF9sZXZlbCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3RyYXAoY2hhciAqKmFyZ3YpCit7CisJaW50IHNpZzsKKwljaGFyICpuZXdfY21kOworCisJaWYgKCFHLnRyYXBzKQorCQlHLnRyYXBzID0geHphbGxvYyhzaXplb2YoRy50cmFwc1swXSkgKiBOU0lHKTsKKworCWFyZ3YrKzsKKwlpZiAoISphcmd2KSB7CisJCWludCBpOworCQkvKiBObyBhcmdzOiBwcmludCBhbGwgdHJhcHBlZCAqLworCQlmb3IgKGkgPSAwOyBpIDwgTlNJRzsgKytpKSB7CisJCQlpZiAoRy50cmFwc1tpXSkgeworCQkJCXByaW50ZigidHJhcCAtLSAiKTsKKwkJCQlwcmludF9lc2NhcGVkKEcudHJhcHNbaV0pOworCQkJCS8qIG5vdGU6IGJhc2ggYWRkcyAiU0lHIiwgYnV0IG9ubHkgaWYgaW52b2tlZAorCQkJCSAqIGFzICJiYXNoIi4gSWYgY2FsbGVkIGFzICJzaCIsIG9yIGlmIHNldCAtbyBwb3NpeCwKKwkJCQkgKiB0aGVuIGl0IHByaW50cyBzaG9ydCBzaWduYWwgbmFtZXMuCisJCQkJICogV2UgYXJlIHByaW50aW5nIHNob3J0IG5hbWVzOiAqLworCQkJCXByaW50ZigiICVzXG4iLCBnZXRfc2lnbmFtZShpKSk7CisJCQl9CisJCX0KKwkJLypmZmx1c2hfYWxsKCk7IC0gZG9uZSBhZnRlciBlYWNoIGJ1aWx0aW4gYW55d2F5ICovCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJbmV3X2NtZCA9IE5VTEw7CisJLyogSWYgZmlyc3QgYXJnIGlzIGEgbnVtYmVyOiByZXNldCBhbGwgc3BlY2lmaWVkIHNpZ25hbHMgKi8KKwlzaWcgPSBiYl9zdHJ0b3UoKmFyZ3YsIE5VTEwsIDEwKTsKKwlpZiAoZXJybm8gPT0gMCkgeworCQlpbnQgcmV0OworIHByb2Nlc3Nfc2lnX2xpc3Q6CisJCXJldCA9IEVYSVRfU1VDQ0VTUzsKKwkJd2hpbGUgKCphcmd2KSB7CisJCQlzaWdoYW5kbGVyX3QgaGFuZGxlcjsKKworCQkJc2lnID0gZ2V0X3NpZ251bSgqYXJndisrKTsKKwkJCWlmIChzaWcgPCAwIHx8IHNpZyA+PSBOU0lHKSB7CisJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCS8qIE1pbWljIGJhc2ggbWVzc2FnZSBleGFjdGx5ICovCisJCQkJYmJfcGVycm9yX21zZygidHJhcDogJXM6IGludmFsaWQgc2lnbmFsIHNwZWNpZmljYXRpb24iLCBhcmd2Wy0xXSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWZyZWUoRy50cmFwc1tzaWddKTsKKwkJCUcudHJhcHNbc2lnXSA9IHhzdHJkdXAobmV3X2NtZCk7CisKKwkJCWRlYnVnX3ByaW50ZigidHJhcDogc2V0dGluZyBTSUclcyAoJWkpIHRvICclcydcbiIsCisJCQkJZ2V0X3NpZ25hbWUoc2lnKSwgc2lnLCBHLnRyYXBzW3NpZ10pOworCisJCQkvKiBUaGVyZSBpcyBubyBzaWduYWwgZm9yIDAgKEVYSVQpICovCisJCQlpZiAoc2lnID09IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChuZXdfY21kKQorCQkJCWhhbmRsZXIgPSAobmV3X2NtZFswXSA/IHJlY29yZF9wZW5kaW5nX3NpZ25vIDogU0lHX0lHTik7CisJCQllbHNlCisJCQkJLyogV2UgYXJlIHJlbW92aW5nIHRyYXAgaGFuZGxlciAqLworCQkJCWhhbmRsZXIgPSBwaWNrX3NpZ2hhbmRsZXIoc2lnKTsKKwkJCWluc3RhbGxfc2lnaGFuZGxlcihzaWcsIGhhbmRsZXIpOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFhcmd2WzFdKSB7IC8qIG5vIHNlY29uZCBhcmcgKi8KKwkJYmJfZXJyb3JfbXNnKCJ0cmFwOiBpbnZhbGlkIGFyZ3VtZW50cyIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCS8qIEZpcnN0IGFyZyBpcyAiLSI6IHJlc2V0IGFsbCBzcGVjaWZpZWQgdG8gZGVmYXVsdCAqLworCS8qIEZpcnN0IGFyZyBpcyAiLS0iOiBza2lwIGl0LCB0aGUgcmVzdCBpcyAiaGFuZGxlciBTSUdzLi4uIiAqLworCS8qIEV2ZXJ5dGhpbmcgZWxzZTogc2V0IGFyZyBhcyBzaWduYWwgaGFuZGxlcgorCSAqIChpbmNsdWRlcyAiIiBjYXNlLCB3aGljaCBpZ25vcmVzIHNpZ25hbCkgKi8KKwlpZiAoYXJndlswXVswXSA9PSAnLScpIHsKKwkJaWYgKGFyZ3ZbMF1bMV0gPT0gJ1wwJykgeyAvKiAiLSIgKi8KKwkJCS8qIG5ld19jbWQgcmVtYWlucyBOVUxMOiAicmVzZXQgdGhlc2Ugc2lncyIgKi8KKwkJCWdvdG8gcmVzZXRfdHJhcHM7CisJCX0KKwkJaWYgKGFyZ3ZbMF1bMV0gPT0gJy0nICYmIGFyZ3ZbMF1bMl0gPT0gJ1wwJykgeyAvKiAiLS0iICovCisJCQlhcmd2Kys7CisJCX0KKwkJLyogZWxzZTogIi1zb21ldGhpbmciLCBubyBzcGVjaWFsIG1lYW5pbmcgKi8KKwl9CisJbmV3X2NtZCA9ICphcmd2OworIHJlc2V0X3RyYXBzOgorCWFyZ3YrKzsKKwlnb3RvIHByb2Nlc3Nfc2lnX2xpc3Q7Cit9CisKKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3R5cGUuaHRtbCAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl90eXBlKGNoYXIgKiphcmd2KQoreworCWludCByZXQgPSBFWElUX1NVQ0NFU1M7CisKKwl3aGlsZSAoKisrYXJndikgeworCQljb25zdCBjaGFyICp0eXBlOworCQljaGFyICpwYXRoID0gTlVMTDsKKworCQlpZiAoMCkge30gLyogbWFrZSBjb25kaXRpb25hbCBjb21waWxlIGVhc2llciBiZWxvdyAqLworCQkvKmVsc2UgaWYgKGZpbmRfYWxpYXMoKmFyZ3YpKQorCQkJdHlwZSA9ICJhbiBhbGlhcyI7Ki8KKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJZWxzZSBpZiAoZmluZF9mdW5jdGlvbigqYXJndikpCisJCQl0eXBlID0gImEgZnVuY3Rpb24iOworI2VuZGlmCisJCWVsc2UgaWYgKGZpbmRfYnVpbHRpbigqYXJndikpCisJCQl0eXBlID0gImEgc2hlbGwgYnVpbHRpbiI7CisJCWVsc2UgaWYgKChwYXRoID0gZmluZF9pbl9wYXRoKCphcmd2KSkgIT0gTlVMTCkKKwkJCXR5cGUgPSBwYXRoOworCQllbHNlIHsKKwkJCWJiX2Vycm9yX21zZygidHlwZTogJXM6IG5vdCBmb3VuZCIsICphcmd2KTsKKwkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJpbnRmKCIlcyBpcyAlc1xuIiwgKmFyZ3YsIHR5cGUpOworCQlmcmVlKHBhdGgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKy8qIGJ1aWx0LWluICdmZycgYW5kICdiZycgaGFuZGxlciAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9mZ19iZyhjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgam9ibnVtOworCXN0cnVjdCBwaXBlICpwaTsKKworCWlmICghR19pbnRlcmFjdGl2ZV9mZCkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworCS8qIElmIHRoZXkgZ2F2ZSB1cyBubyBhcmdzLCBhc3N1bWUgdGhleSB3YW50IHRoZSBsYXN0IGJhY2tncm91bmRlZCB0YXNrICovCisJaWYgKCFhcmd2WzFdKSB7CisJCWZvciAocGkgPSBHLmpvYl9saXN0OyBwaTsgcGkgPSBwaS0+bmV4dCkgeworCQkJaWYgKHBpLT5qb2JpZCA9PSBHLmxhc3Rfam9iaWQpIHsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJCWJiX2Vycm9yX21zZygiJXM6IG5vIGN1cnJlbnQgam9iIiwgYXJndlswXSk7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWlmIChzc2NhbmYoYXJndlsxXSwgIiUlJWQiLCAmam9ibnVtKSAhPSAxKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IGJhZCBhcmd1bWVudCAnJXMnIiwgYXJndlswXSwgYXJndlsxXSk7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWZvciAocGkgPSBHLmpvYl9saXN0OyBwaTsgcGkgPSBwaS0+bmV4dCkgeworCQlpZiAocGktPmpvYmlkID09IGpvYm51bSkgeworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwliYl9lcnJvcl9tc2coIiVzOiAlZDogbm8gc3VjaCBqb2IiLCBhcmd2WzBdLCBqb2JudW0pOworCXJldHVybiBFWElUX0ZBSUxVUkU7CisgZm91bmQ6CisJLyogVE9ETzogYmFzaCBwcmludHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKwkgKiBvZiBqb2IgYmVpbmcgZm9yZWdyb3VuZGVkIChsaWtlICJzbGVlcCAxIHwgY2F0IikgKi8KKwlpZiAoYXJndlswXVswXSA9PSAnZicgJiYgR19zYXZlZF90dHlfcGdycCkgeworCQkvKiBQdXQgdGhlIGpvYiBpbnRvIHRoZSBmb3JlZ3JvdW5kLiAgKi8KKwkJdGNzZXRwZ3JwKEdfaW50ZXJhY3RpdmVfZmQsIHBpLT5wZ3JwKTsKKwl9CisKKwkvKiBSZXN0YXJ0IHRoZSBwcm9jZXNzZXMgaW4gdGhlIGpvYiAqLworCWRlYnVnX3ByaW50Zl9qb2JzKCJyZXZpdmluZyAlZCBwcm9jcywgcGdycCAlZFxuIiwgcGktPm51bV9jbWRzLCBwaS0+cGdycCk7CisJZm9yIChpID0gMDsgaSA8IHBpLT5udW1fY21kczsgaSsrKSB7CisJCWRlYnVnX3ByaW50Zl9qb2JzKCJyZXZpdmluZyBwaWQgJWRcbiIsIHBpLT5jbWRzW2ldLnBpZCk7CisJCXBpLT5jbWRzW2ldLmlzX3N0b3BwZWQgPSAwOworCX0KKwlwaS0+c3RvcHBlZF9jbWRzID0gMDsKKworCWkgPSBraWxsKC0gcGktPnBncnAsIFNJR0NPTlQpOworCWlmIChpIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRVNSQ0gpIHsKKwkJCWRlbGV0ZV9maW5pc2hlZF9iZ19qb2IocGkpOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQliYl9wZXJyb3JfbXNnKCJraWxsIChTSUdDT05UKSIpOworCX0KKworCWlmIChhcmd2WzBdWzBdID09ICdmJykgeworCQlyZW1vdmVfYmdfam9iKHBpKTsKKwkJcmV0dXJuIGNoZWNram9ic19hbmRfZmdfc2hlbGwocGkpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfSFVTSF9IRUxQCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2hlbHAoY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4OworCisJcHJpbnRmKAorCQkiQnVpbHQtaW4gY29tbWFuZHM6XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWZvciAoeCA9IGJsdGluczE7IHggIT0gJmJsdGluczFbQVJSQVlfU0laRShibHRpbnMxKV07IHgrKykgeworCQlpZiAoeC0+Yl9kZXNjcikKKwkJCXByaW50ZigiJS0xMHMlc1xuIiwgeC0+Yl9jbWQsIHgtPmJfZGVzY3IpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9IVVNIX0pPQgorc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9qb2JzKGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgcGlwZSAqam9iOworCWNvbnN0IGNoYXIgKnN0YXR1c19zdHJpbmc7CisKKwlmb3IgKGpvYiA9IEcuam9iX2xpc3Q7IGpvYjsgam9iID0gam9iLT5uZXh0KSB7CisJCWlmIChqb2ItPmFsaXZlX2NtZHMgPT0gam9iLT5zdG9wcGVkX2NtZHMpCisJCQlzdGF0dXNfc3RyaW5nID0gIlN0b3BwZWQiOworCQllbHNlCisJCQlzdGF0dXNfc3RyaW5nID0gIlJ1bm5pbmciOworCisJCXByaW50ZihKT0JfU1RBVFVTX0ZPUk1BVCwgam9iLT5qb2JpZCwgc3RhdHVzX3N0cmluZywgam9iLT5jbWR0ZXh0KTsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWYgSFVTSF9ERUJVRworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9tZW1sZWFrKGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwl2b2lkICpwOworCXVuc2lnbmVkIGxvbmcgbDsKKworIyBpZmRlZiBNX1RSSU1fVEhSRVNIT0xECisJLyogT3B0aW9uYWwuIFJlZHVjZXMgcHJvYmFiaWxpdHkgb2YgZmFsc2UgcG9zaXRpdmVzICovCisJbWFsbG9jX3RyaW0oMCk7CisjIGVuZGlmCisJLyogQ3J1ZGUgYXR0ZW1wdCB0byBmaW5kIHdoZXJlICJmcmVlIG1lbW9yeSIgc3RhcnRzLAorCSAqIHNhbnMgZnJhZ21lbnRhdGlvbi4gKi8KKwlwID0gbWFsbG9jKDI0MCk7CisJbCA9ICh1bnNpZ25lZCBsb25nKXA7CisJZnJlZShwKTsKKwlwID0gbWFsbG9jKDM0MDApOworCWlmIChsIDwgKHVuc2lnbmVkIGxvbmcpcCkgbCA9ICh1bnNpZ25lZCBsb25nKXA7CisJZnJlZShwKTsKKworCWlmICghRy5tZW1sZWFrX3ZhbHVlKQorCQlHLm1lbWxlYWtfdmFsdWUgPSBsOworCisJbCAtPSBHLm1lbWxlYWtfdmFsdWU7CisJaWYgKChsb25nKWwgPCAwKQorCQlsID0gMDsKKwlsIC89IDEwMjQ7CisJaWYgKGwgPiAxMjcpCisJCWwgPSAxMjc7CisKKwkvKiBFeGl0Y29kZSBpcyAiaG93IG1hbnkga2lsb2J5dGVzIHdlIGxlYWtlZCBzaW5jZSAxc3QgY2FsbCIgKi8KKwlyZXR1cm4gbDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3B3ZChjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJcHV0cyhnZXRfY3dkKDApKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisvKiBJbnRlcnJ1cHRpYmlsaXR5IG9mIHJlYWQgYnVpbHRpbiBpbiBiYXNoCisgKiAodGVzdGVkIG9uIGJhc2gtNC4yLjggYnkgc2VuZGluZyBzaWduYWxzIChub3QgYnkgXkMpKToKKyAqCisgKiBFbXB0eSB0cmFwIG1ha2VzIHJlYWQgaWdub3JlIGNvcnJlc3BvbmRpbmcgc2lnbmFsLCBmb3IgYW55IHNpZ25hbC4KKyAqCisgKiBTSUdJTlQ6CisgKiAtIHRlcm1pbmF0ZXMgbm9uLWludGVyYWN0aXZlIHNoZWxsOworICogLSBpbnRlcnJ1cHRzIHJlYWQgaW4gaW50ZXJhY3RpdmUgc2hlbGw7CisgKiBpZiBpdCBoYXMgbm9uLWVtcHR5IHRyYXA6CisgKiAtIGV4ZWN1dGVzIHRyYXAgYW5kIHJldHVybnMgdG8gY29tbWFuZCBwcm9tcHQgaW4gaW50ZXJhY3RpdmUgc2hlbGw7CisgKiAtIGV4ZWN1dGVzIHRyYXAgYW5kIHJldHVybnMgdG8gcmVhZCBpbiBub24taW50ZXJhY3RpdmUgc2hlbGw7CisgKiBTSUdURVJNOgorICogLSBpcyBpZ25vcmVkIChkb2VzIG5vdCBpbnRlcnJ1cHQpIHJlYWQgaW4gaW50ZXJhY3RpdmUgc2hlbGw7CisgKiAtIHRlcm1pbmF0ZXMgbm9uLWludGVyYWN0aXZlIHNoZWxsOworICogaWYgaXQgaGFzIG5vbi1lbXB0eSB0cmFwOgorICogLSBleGVjdXRlcyB0cmFwIGFuZCByZXR1cm5zIHRvIHJlYWQ7CisgKiBTSUdIVVA6CisgKiAtIHRlcm1pbmF0ZXMgc2hlbGwgKHJlZ2FyZGxlc3Mgb2YgaW50ZXJhY3Rpdml0eSk7CisgKiBpZiBpdCBoYXMgbm9uLWVtcHR5IHRyYXA6CisgKiAtIGV4ZWN1dGVzIHRyYXAgYW5kIHJldHVybnMgdG8gcmVhZDsKKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9yZWFkKGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnI7CisJY2hhciAqb3B0X24gPSBOVUxMOworCWNoYXIgKm9wdF9wID0gTlVMTDsKKwljaGFyICpvcHRfdCA9IE5VTEw7CisJY2hhciAqb3B0X3UgPSBOVUxMOworCWNvbnN0IGNoYXIgKmlmczsKKwlpbnQgcmVhZF9mbGFnczsKKworCS8qICIhIjogZG8gbm90IGFib3J0IG9uIGVycm9ycy4KKwkgKiBPcHRpb24gc3RyaW5nIG11c3Qgc3RhcnQgd2l0aCAic3IiIHRvIG1hdGNoIEJVSUxUSU5fUkVBRF94eHgKKwkgKi8KKwlyZWFkX2ZsYWdzID0gZ2V0b3B0MzIoYXJndiwgIiFzcm46cDp0OnU6IiwgJm9wdF9uLCAmb3B0X3AsICZvcHRfdCwgJm9wdF91KTsKKwlpZiAocmVhZF9mbGFncyA9PSAodWludDMyX3QpLTEpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJYXJndiArPSBvcHRpbmQ7CisJaWZzID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiSUZTIik7IC8qIGNhbiBiZSBOVUxMICovCisKKyBhZ2FpbjoKKwlyID0gc2hlbGxfYnVpbHRpbl9yZWFkKHNldF9sb2NhbF92YXJfZnJvbV9oYWx2ZXMsCisJCWFyZ3YsCisJCWlmcywKKwkJcmVhZF9mbGFncywKKwkJb3B0X24sCisJCW9wdF9wLAorCQlvcHRfdCwKKwkJb3B0X3UKKwkpOworCisJaWYgKCh1aW50cHRyX3QpciA9PSAxICYmIGVycm5vID09IEVJTlRSKSB7CisJCXVuc2lnbmVkIHNpZyA9IGNoZWNrX2FuZF9ydW5fdHJhcHMoKTsKKwkJaWYgKHNpZyAmJiBzaWcgIT0gU0lHSU5UKQorCQkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAoKHVpbnRwdHJfdClyID4gMSkgeworCQliYl9lcnJvcl9tc2coIiVzIiwgcik7CisJCXIgPSAoY2hhciopKHVpbnRwdHJfdCkxOworCX0KKworCXJldHVybiAodWludHB0cl90KXI7Cit9CisKKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL1YzX2NoYXAwMi5odG1sI3NldAorICogYnVpbHQtaW4gJ3NldCcgaGFuZGxlcgorICogU1VTdjMgc2F5czoKKyAqIHNldCBbLWFiQ2VmaG1udXZ4XSBbLW8gb3B0aW9uXSBbYXJndW1lbnQuLi5dCisgKiBzZXQgWythYkNlZmhtbnV2eF0gWytvIG9wdGlvbl0gW2FyZ3VtZW50Li4uXQorICogc2V0IC0tIFthcmd1bWVudC4uLl0KKyAqIHNldCAtbworICogc2V0ICtvCisgKiBJbXBsZW1lbnRhdGlvbnMgc2hhbGwgc3VwcG9ydCB0aGUgb3B0aW9ucyBpbiBib3RoIHRoZWlyIGh5cGhlbiBhbmQKKyAqIHBsdXMtc2lnbiBmb3Jtcy4gVGhlc2Ugb3B0aW9ucyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMgb3B0aW9ucyB0byBzaC4KKyAqIEV4YW1wbGVzOgorICogV3JpdGUgb3V0IGFsbCB2YXJpYWJsZXMgYW5kIHRoZWlyIHZhbHVlczogc2V0CisgKiBTZXQgJDEsICQyLCBhbmQgJDMgYW5kIHNldCAiJCMiIHRvIDM6IHNldCBjIGEgYgorICogVHVybiBvbiB0aGUgLXggYW5kIC12IG9wdGlvbnM6IHNldCAteHYKKyAqIFVuc2V0IGFsbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnM6IHNldCAtLQorICogU2V0ICQxIHRvIHRoZSB2YWx1ZSBvZiB4LCBldmVuIGlmIGl0IGJlZ2lucyB3aXRoICctJyBvciAnKyc6IHNldCAtLSAiJHgiCisgKiBTZXQgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0byB0aGUgZXhwYW5zaW9uIG9mIHgsIGV2ZW4gaWYgeCBleHBhbmRzCisgKiB3aXRoIGEgbGVhZGluZyAnLScgb3IgJysnOiBzZXQgLS0gJHgKKyAqCisgKiBTbyBmYXIsIHdlIG9ubHkgc3VwcG9ydCAic2V0IC0tIFthcmd1bWVudC4uLl0iIGFuZCBzb21lIG9mIHRoZSBzaG9ydCBuYW1lcy4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9zZXQoY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJY2hhciAqKnBwLCAqKmdfYXJndjsKKwljaGFyICphcmcgPSAqKythcmd2OworCisJaWYgKGFyZyA9PSBOVUxMKSB7CisJCXN0cnVjdCB2YXJpYWJsZSAqZTsKKwkJZm9yIChlID0gRy50b3BfdmFyOyBlOyBlID0gZS0+bmV4dCkKKwkJCXB1dHMoZS0+dmFyc3RyKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlkbyB7CisJCWlmIChzdHJjbXAoYXJnLCAiLS0iKSA9PSAwKSB7CisJCQkrK2FyZ3Y7CisJCQlnb3RvIHNldF9hcmd2OworCQl9CisJCWlmIChhcmdbMF0gIT0gJysnICYmIGFyZ1swXSAhPSAnLScpCisJCQlicmVhazsKKwkJZm9yIChuID0gMTsgYXJnW25dOyArK24pIHsKKwkJCWlmIChzZXRfbW9kZSgoYXJnWzBdID09ICctJyksIGFyZ1tuXSwgYXJndlsxXSkpCisJCQkJZ290byBlcnJvcjsKKwkJCWlmIChhcmdbbl0gPT0gJ28nICYmIGFyZ3ZbMV0pCisJCQkJYXJndisrOworCQl9CisJfSB3aGlsZSAoKGFyZyA9ICorK2FyZ3YpICE9IE5VTEwpOworCS8qIE5vdyBhcmd2WzBdIGlzIDFzdCBhcmd1bWVudCAqLworCisJaWYgKGFyZyA9PSBOVUxMKQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworIHNldF9hcmd2OgorCisJLyogTkI6IEcuZ2xvYmFsX2FyZ3ZbMF0gKCQwKSBpcyBuZXZlciBmcmVlZC9jaGFuZ2VkICovCisJZ19hcmd2ID0gRy5nbG9iYWxfYXJndjsKKwlpZiAoRy5nbG9iYWxfYXJnc19tYWxsb2NlZCkgeworCQlwcCA9IGdfYXJndjsKKwkJd2hpbGUgKCorK3BwKQorCQkJZnJlZSgqcHApOworCQlnX2FyZ3ZbMV0gPSBOVUxMOworCX0gZWxzZSB7CisJCUcuZ2xvYmFsX2FyZ3NfbWFsbG9jZWQgPSAxOworCQlwcCA9IHh6YWxsb2Moc2l6ZW9mKHBwWzBdKSAqIDIpOworCQlwcFswXSA9IGdfYXJndlswXTsgLyogcmV0YWluICQwICovCisJCWdfYXJndiA9IHBwOworCX0KKwkvKiBUaGlzIHJlYWxsb2MncyBHLmdsb2JhbF9hcmd2ICovCisJRy5nbG9iYWxfYXJndiA9IHBwID0gYWRkX3N0cmluZ3NfdG9fc3RyaW5ncyhnX2FyZ3YsIGFyZ3YsIC8qZHVwOiovIDEpOworCisJbiA9IDE7CisJd2hpbGUgKCorK3BwKQorCQluKys7CisJRy5nbG9iYWxfYXJnYyA9IG47CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworCisJLyogTm90aGluZyBrbm93biwgc28gYWJvcnQgKi8KKyBlcnJvcjoKKwliYl9lcnJvcl9tc2coInNldDogJXM6IGludmFsaWQgb3B0aW9uIiwgYXJnKTsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3NoaWZ0KGNoYXIgKiphcmd2KQoreworCWludCBuID0gMTsKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJaWYgKGFyZ3ZbMF0pIHsKKwkJbiA9IGF0b2koYXJndlswXSk7CisJfQorCWlmIChuID49IDAgJiYgbiA8IEcuZ2xvYmFsX2FyZ2MpIHsKKwkJaWYgKEcuZ2xvYmFsX2FyZ3NfbWFsbG9jZWQpIHsKKwkJCWludCBtID0gMTsKKwkJCXdoaWxlIChtIDw9IG4pCisJCQkJZnJlZShHLmdsb2JhbF9hcmd2W20rK10pOworCQl9CisJCUcuZ2xvYmFsX2FyZ2MgLT0gbjsKKwkJbWVtbW92ZSgmRy5nbG9iYWxfYXJndlsxXSwgJkcuZ2xvYmFsX2FyZ3ZbbisxXSwKKwkJCQlHLmdsb2JhbF9hcmdjICogc2l6ZW9mKEcuZ2xvYmFsX2FyZ3ZbMF0pKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9zb3VyY2UoY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYXJnX3BhdGgsICpmaWxlbmFtZTsKKwlGSUxFICppbnB1dDsKKwlzYXZlX2FyZ190IHN2OworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCXNtYWxsaW50IHN2X2ZsZzsKKyNlbmRpZgorCisJYXJndiA9IHNraXBfZGFzaF9kYXNoKGFyZ3YpOworCWZpbGVuYW1lID0gYXJndlswXTsKKwlpZiAoIWZpbGVuYW1lKSB7CisJCS8qIGJhc2ggc2F5czogImJhc2g6IC46IGZpbGVuYW1lIGFyZ3VtZW50IHJlcXVpcmVkIiAqLworCQlyZXR1cm4gMjsgLyogYmFzaCBjb21wYXQgKi8KKwl9CisJYXJnX3BhdGggPSBOVUxMOworCWlmICghc3RyY2hyKGZpbGVuYW1lLCAnLycpKSB7CisJCWFyZ19wYXRoID0gZmluZF9pbl9wYXRoKGZpbGVuYW1lKTsKKwkJaWYgKGFyZ19wYXRoKQorCQkJZmlsZW5hbWUgPSBhcmdfcGF0aDsKKwl9CisJaW5wdXQgPSBmb3Blbl9vcl93YXJuKGZpbGVuYW1lLCAiciIpOworCWZyZWUoYXJnX3BhdGgpOworCWlmICghaW5wdXQpIHsKKwkJLyogYmJfcGVycm9yX21zZygiJXMiLCAqYXJndik7IC0gZG9uZSBieSBmb3Blbl9vcl93YXJuICovCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWNsb3NlX29uX2V4ZWNfb24oZmlsZW5vKGlucHV0KSk7CisKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlzdl9mbGcgPSBHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzOworCS8qICJ3ZSBhcmUgaW5zaWRlIHNvdXJjZWQgZmlsZSwgb2sgdG8gdXNlIHJldHVybiIgKi8KKwlHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzID0gLTE7CisjZW5kaWYKKwlzYXZlX2FuZF9yZXBsYWNlX0dfYXJncygmc3YsIGFyZ3YpOworCisJcGFyc2VfYW5kX3J1bl9maWxlKGlucHV0KTsKKwlmY2xvc2UoaW5wdXQpOworCisJcmVzdG9yZV9HX2FyZ3MoJnN2LCBhcmd2KTsKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzID0gc3ZfZmxnOworI2VuZGlmCisKKwlyZXR1cm4gRy5sYXN0X2V4aXRjb2RlOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3VtYXNrKGNoYXIgKiphcmd2KQoreworCWludCByYzsKKwltb2RlX3QgbWFzazsKKworCW1hc2sgPSB1bWFzaygwKTsKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJaWYgKGFyZ3ZbMF0pIHsKKwkJbW9kZV90IG9sZF9tYXNrID0gbWFzazsKKworCQltYXNrIF49IDA3Nzc7CisJCXJjID0gYmJfcGFyc2VfbW9kZShhcmd2WzBdLCAmbWFzayk7CisJCW1hc2sgXj0gMDc3NzsKKwkJaWYgKHJjID09IDApIHsKKwkJCW1hc2sgPSBvbGRfbWFzazsKKwkJCS8qIGJhc2ggbWVzc2FnZXM6CisJCQkgKiBiYXNoOiB1bWFzazogJ3EnOiBpbnZhbGlkIHN5bWJvbGljIG1vZGUgb3BlcmF0b3IKKwkJCSAqIGJhc2g6IHVtYXNrOiA5OTk6IG9jdGFsIG51bWJlciBvdXQgb2YgcmFuZ2UKKwkJCSAqLworCQkJYmJfZXJyb3JfbXNnKCIlczogaW52YWxpZCBtb2RlICclcyciLCAidW1hc2siLCBhcmd2WzBdKTsKKwkJfQorCX0gZWxzZSB7CisJCXJjID0gMTsKKwkJLyogTWltaWMgYmFzaCAqLworCQlwcmludGYoIiUwNG9cbiIsICh1bnNpZ25lZCkgbWFzayk7CisJCS8qIGZhbGwgdGhyb3VnaCBhbmQgcmVzdG9yZSBtYXNrIHdoaWNoIHdlIHNldCB0byAwICovCisJfQorCXVtYXNrKG1hc2spOworCisJcmV0dXJuICFyYzsgLyogcmMgIT0gMCAtIHN1Y2Nlc3MgKi8KK30KKworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwjdW5zZXQgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fdW5zZXQoY2hhciAqKmFyZ3YpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBvcHRzOworCisJLyogIiEiOiBkbyBub3QgYWJvcnQgb24gZXJyb3JzICovCisJLyogIisiOiBzdG9wIGF0IDFzdCBub24tb3B0aW9uICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICIhK3ZmIik7CisJaWYgKG9wdHMgPT0gKHVuc2lnbmVkKS0xKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCWlmIChvcHRzID09IDMpIHsKKwkJYmJfZXJyb3JfbXNnKCJ1bnNldDogLXYgYW5kIC1mIGFyZSBleGNsdXNpdmUiKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJYXJndiArPSBvcHRpbmQ7CisKKwlyZXQgPSBFWElUX1NVQ0NFU1M7CisJd2hpbGUgKCphcmd2KSB7CisJCWlmICghKG9wdHMgJiAyKSkgeyAvKiBub3QgLWYgKi8KKwkJCWlmICh1bnNldF9sb2NhbF92YXIoKmFyZ3YpKSB7CisJCQkJLyogdW5zZXQgPG5vbmV4aXN0ZW50X3Zhcj4gZG9lc24ndCBmYWlsLgorCQkJCSAqIEVycm9yIGlzIHdoZW4gb25lIHRyaWVzIHRvIHVuc2V0IFJPIHZhci4KKwkJCQkgKiBNZXNzYWdlIHdhcyBwcmludGVkIGJ5IHVuc2V0X2xvY2FsX3Zhci4gKi8KKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQl9CisJCX0KKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJZWxzZSB7CisJCQl1bnNldF9mdW5jKCphcmd2KTsKKwkJfQorI2VuZGlmCisJCWFyZ3YrKzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvd2FpdC5odG1sICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3dhaXQoY2hhciAqKmFyZ3YpCit7CisJaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgc3RhdHVzOworCisJYXJndiA9IHNraXBfZGFzaF9kYXNoKGFyZ3YpOworCWlmIChhcmd2WzBdID09IE5VTEwpIHsKKwkJLyogRG9uJ3QgY2FyZSBhYm91dCB3YWl0IHJlc3VsdHMgKi8KKwkJLyogTm90ZSAxOiBtdXN0IHdhaXQgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgY2hpbGRyZW4gKi8KKwkJLyogTm90ZSAyOiBtdXN0IGJlIGludGVycnVwdGlibGUgKi8KKwkJLyogRXhhbXBsZXM6CisJCSAqICQgc2xlZXAgMyAmIHNsZWVwIDYgJiB3YWl0CisJCSAqIFsxXSAzMDkzNCBzbGVlcCAzCisJCSAqIFsyXSAzMDkzNSBzbGVlcCA2CisJCSAqIFsxXSBEb25lICAgICAgICAgICAgICAgICAgIHNsZWVwIDMKKwkJICogWzJdIERvbmUgICAgICAgICAgICAgICAgICAgc2xlZXAgNgorCQkgKiAkIHNsZWVwIDMgJiBzbGVlcCA2ICYgd2FpdAorCQkgKiBbMV0gMzA5MzYgc2xlZXAgMworCQkgKiBbMl0gMzA5Mzcgc2xlZXAgNgorCQkgKiBbMV0gRG9uZSAgICAgICAgICAgICAgICAgICBzbGVlcCAzCisJCSAqIF5DIDwtLSBhZnRlciB+NCBzZWMgZnJvbSBrZXlib2FyZAorCQkgKiAkCisJCSAqLworCQl3aGlsZSAoMSkgeworCQkJaW50IHNpZzsKKwkJCXNpZ3NldF90IG9sZHNldCwgYWxsc2lnczsKKworCQkJLyogd2FpdHBpZCBpcyBub3QgaW50ZXJydXB0aWJsZSBieSBTQV9SRVNUQVJUZWQKKwkJCSAqIHNpZ25hbHMgd2hpY2ggd2UgdXNlLiBUaHVzLCB0aGlzIHVnbHkgZGFuY2U6CisJCQkgKi8KKworCQkJLyogTWFrZSBzdXJlIHBvc3NpYmxlIFNJR0NITEQgaXMgc3RvcmVkIGluIGtlcm5lbCdzCisJCQkgKiBwZW5kaW5nIHNpZ25hbCBtYXNrIGJlZm9yZSB3ZSBjYWxsIHdhaXRwaWQuCisJCQkgKiBPciBlbHNlIHdlIG1heSByYWNlIHdpdGggU0lHQ0hMRCwgbG9zZSBpdCwKKwkJCSAqIGFuZCBnZXQgc3R1Y2sgaW4gc2lnd2FpdGluZm8uLi4KKwkJCSAqLworCQkJc2lnZmlsbHNldCgmYWxsc2lncyk7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmFsbHNpZ3MsICZvbGRzZXQpOworCisJCQlpZiAoIXNpZ2lzZW1wdHlzZXQoJkcucGVuZGluZ19zZXQpKSB7CisJCQkJLyogQ3JhcCEgd2UgcmFjZWQgd2l0aCBzb21lIHNpZ25hbCEgKi8KKwkJCS8vCXNpZyA9IDA7CisJCQkJZ290byByZXN0b3JlOworCQkJfQorCisJCQljaGVja2pvYnMoTlVMTCk7IC8qIHdhaXRwaWQoV05PSEFORykgaW5zaWRlICovCisJCQlpZiAoZXJybm8gPT0gRUNISUxEKSB7CisJCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbGRzZXQsIE5VTEwpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBXYWl0IGZvciBTSUdDSExEIG9yIGFueSBvdGhlciBzaWduYWwgKi8KKwkJCS8vc2lnID0gc2lnd2FpdGluZm8oJmFsbHNpZ3MsIE5VTEwpOworCQkJLyogSXQgaXMgdml0YWxseSBpbXBvcnRhbnQgZm9yIHNpZ3N1c3BlbmQgdGhhdCBTSUdDSExEIGhhcyBub24tREZMIGhhbmRsZXIhICovCisJCQkvKiBOb3RlOiBzaWdzdXNwZW5kIGludm9rZXMgc2lnbmFsIGhhbmRsZXIgKi8KKwkJCXNpZ3N1c3BlbmQoJm9sZHNldCk7CisgcmVzdG9yZToKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkc2V0LCBOVUxMKTsKKworCQkJLyogU28sIGRpZCB3ZSBnZXQgYSBzaWduYWw/ICovCisJCQkvL2lmIChzaWcgPiAwKQorCQkJLy8JcmFpc2Uoc2lnKTsgLyogcnVuIGhhbmRsZXIgKi8KKwkJCXNpZyA9IGNoZWNrX2FuZF9ydW5fdHJhcHMoKTsKKwkJCWlmIChzaWcgLyomJiBzaWcgIT0gU0lHQ0hMRCAtIGFsd2F5cyB0cnVlICovKSB7CisJCQkJLyogc2VlIG5vdGUgMiAqLworCQkJCXJldCA9IDEyOCArIHNpZzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFNJR0NITEQsIG9yIG5vIHNpZ25hbCwgb3IgaWdub3JlZCBvbmUsIHN1Y2ggYXMgU0lHUVVJVC4gUmVwZWF0ICovCisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBUaGlzIGlzIHByb2JhYmx5IGJ1Z2d5IHdydCBpbnRlcnJ1cHRpYmxlLW5lc3MgKi8KKwl3aGlsZSAoKmFyZ3YpIHsKKwkJcGlkX3QgcGlkID0gYmJfc3RydG91KCphcmd2LCBOVUxMLCAxMCk7CisJCWlmIChlcnJubykgeworCQkJLyogbWltaWMgYmFzaCBtZXNzYWdlICovCisJCQliYl9lcnJvcl9tc2coIndhaXQ6ICclcyc6IG5vdCBhIHBpZCBvciB2YWxpZCBqb2Igc3BlYyIsICphcmd2KTsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwkJaWYgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA9PSBwaWQpIHsKKwkJCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQorCQkJCXJldCA9IDEyOCArIFdURVJNU0lHKHN0YXR1cyk7CisJCQllbHNlIGlmIChXSUZFWElURUQoc3RhdHVzKSkKKwkJCQlyZXQgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQkJZWxzZSAvKiB3dGY/ICovCisJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQl9IGVsc2UgeworCQkJYmJfcGVycm9yX21zZygid2FpdCAlcyIsICphcmd2KTsKKwkJCXJldCA9IDEyNzsKKwkJfQorCQlhcmd2Kys7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmIEVOQUJMRV9IVVNIX0xPT1BTIHx8IEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworc3RhdGljIHVuc2lnbmVkIHBhcnNlX251bWVyaWNfYXJndjEoY2hhciAqKmFyZ3YsIHVuc2lnbmVkIGRlZiwgdW5zaWduZWQgZGVmX21pbikKK3sKKwlpZiAoYXJndlsxXSkgeworCQlkZWYgPSBiYl9zdHJ0b3UoYXJndlsxXSwgTlVMTCwgMTApOworCQlpZiAoZXJybm8gfHwgZGVmIDwgZGVmX21pbiB8fCBhcmd2WzJdKSB7CisJCQliYl9lcnJvcl9tc2coIiVzOiBiYWQgYXJndW1lbnRzIiwgYXJndlswXSk7CisJCQlkZWYgPSBVSU5UX01BWDsKKwkJfQorCX0KKwlyZXR1cm4gZGVmOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9icmVhayhjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBkZXB0aDsKKwlpZiAoRy5kZXB0aF9vZl9sb29wID09IDApIHsKKwkJYmJfZXJyb3JfbXNnKCIlczogb25seSBtZWFuaW5nZnVsIGluIGEgbG9vcCIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOyAvKiBiYXNoIGNvbXBhdCAqLworCX0KKwlHLmZsYWdfYnJlYWtfY29udGludWUrKzsgLyogQkNfQlJFQUsgPSAxICovCisKKwlHLmRlcHRoX2JyZWFrX2NvbnRpbnVlID0gZGVwdGggPSBwYXJzZV9udW1lcmljX2FyZ3YxKGFyZ3YsIDEsIDEpOworCWlmIChkZXB0aCA9PSBVSU5UX01BWCkKKwkJRy5mbGFnX2JyZWFrX2NvbnRpbnVlID0gQkNfQlJFQUs7CisJaWYgKEcuZGVwdGhfb2ZfbG9vcCA8IGRlcHRoKQorCQlHLmRlcHRoX2JyZWFrX2NvbnRpbnVlID0gRy5kZXB0aF9vZl9sb29wOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9jb250aW51ZShjaGFyICoqYXJndikKK3sKKwlHLmZsYWdfYnJlYWtfY29udGludWUgPSAxOyAvKiBCQ19DT05USU5VRSA9IDIgPSAxKzEgKi8KKwlyZXR1cm4gYnVpbHRpbl9icmVhayhhcmd2KTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3JldHVybihjaGFyICoqYXJndikKK3sKKwlpbnQgcmM7CisKKwlpZiAoRy5mbGFnX3JldHVybl9pbl9wcm9ncmVzcyAhPSAtMSkgeworCQliYl9lcnJvcl9tc2coIiVzOiBub3QgaW4gYSBmdW5jdGlvbiBvciBzb3VyY2VkIHNjcmlwdCIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOyAvKiBiYXNoIGNvbXBhdCAqLworCX0KKworCUcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPSAxOworCisJLyogYmFzaDoKKwkgKiBvdXQgb2YgcmFuZ2U6IHdyYXBzIGFyb3VuZCBhdCAyNTYsIGRvZXMgbm90IGVycm9yIG91dAorCSAqIG5vbi1udW1lcmljIHBhcmFtOgorCSAqIGYoKSB7IGZhbHNlOyByZXR1cm4gcXdlOyB9OyBmOyBlY2hvICQ/CisJICogYmFzaDogcmV0dXJuOiBxd2U6IG51bWVyaWMgYXJndW1lbnQgcmVxdWlyZWQgIDw9PSB3ZSBkbyB0aGlzCisJICogMjU1ICA8PT0gd2UgYWxzbyBkbyB0aGlzCisJICovCisJcmMgPSBwYXJzZV9udW1lcmljX2FyZ3YxKGFyZ3YsIEcubGFzdF9leGl0Y29kZSwgMCk7CisJcmV0dXJuIHJjOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX2RvYy50eHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX2RvYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4ZGMyNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfZG9jLnR4dApAQCAtMCwwICsxLDE0MyBAQAorMjAwOC0wNy0xNAorCisJQ29tbWFuZCBwYXJzaW5nCisKK0NvbW1hbmQgcGFyc2luZyByZXN1bHRzIGluIGEgbGlzdCBvZiAicGlwZSIgc3RydWN0dXJlcy4KK1RoaXMgbGlzdCBjb3JyZXNwb25kIG5vdCBvbmx5IHRvIHVzdWFsICJwaXBlMSB8fCBwaXBlMiAmJiBwaXBlMyIKK2xpc3RzLCBidXQgaXQgYWxzbyBjb250cm9scyBleGVjdXRpb24gb2YgaWYsIHdoaWxlLCBldGMgc3RhdGVtZW50cy4KK0V2ZXJ5IHN1Y2ggc3RhdGVtZW50IGlzIGEgbGlzdCBmb3IgaHVzaC4gTGlzdCBjb25zaXN0cyBvZiBwaXBlcy4KKworc3RydWN0IHBpcGUgZmllbGRzOgorICBzbWFsbGludCByZXNfd29yZCAtICJub25lIiBmb3Igbm9ybWFsIGNvbW1hbmRzLAorICAgICAgICAgICAgICAgICAgICAgICJpZiIgZm9yIGlmIGNvbmRpdGlvbiBldGMKKyAgc3RydWN0IGNoaWxkX3Byb2cgcHJvZ3NbXSAtIGFycmF5IG9mIGNvbW1hbmRzIGluIHBpcGUKKyAgc21hbGxpbnQgZm9sbG93dXAgLSBob3cgdGhpcyBwaXBlIGlzIHJlbGF0ZWQgdG8gbmV4dDogaXMgaXQKKyAgICAgICAgICAgICAgICAgICAgICAicGlwZTsgcGlwZSIsICJwaXBlICYgcGlwZSIgInBpcGUgJiYgcGlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgInBpcGUgfHwgcGlwZSI/CisKK0Jsb2NrcyBvZiBjb21tYW5kcyB7IHBpcGU7IHBpcGU7IH0gYW5kIChwaXBlOyBwaXBlKSBhcmUgcmVwcmVzZW50ZWQKK2FzIG9uZSBwaXBlIHN0cnVjdCB3aXRoIG9uZSBwcm9nc1swXSBlbGVtZW50IHdoaWNoIGlzIGEgImdyb3VwIiAtCitzdHJ1Y3QgY2hpbGRfcHJvZyBjYW4gY29udGFpbiBhIGxpc3Qgb2YgcGlwZXMuIFNvbWV0aW1lcyB0aGVzZQorImdyb3VwcyIgYXJlIGNyZWF0ZWQgaW1wbGljaXRseSwgZS5nLiBldmVyeSBjb250cm9sCitzdGF0ZW1lbnQgKGlmLCB3aGlsZSwgZXRjKSBzaXRzIGluc2lkZSBpdHMgb3duIGdyb3VwLgorCityZXNfd29yZCBjb250cm9scyBzdGF0ZW1lbnQgZXhlY3V0aW9uLiBFeGFtcGxlczoKKworImVjaG8gSGVsbG8iIC0KK3BpcGUgMCByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdlY2hvJyAnSGVsbG8nCitwaXBlIDEgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKworImVjaG8gZm9vIHx8IGVjaG8gYmFyIiAtCitwaXBlIDAgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1PUiAgcHJvZ1swXSAnZWNobycgJ2ZvbycKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdlY2hvJyAnYmFyJworcGlwZSAyIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRCisKKyJpZiB0cnVlOyB0aGVuIGVjaG8gSGVsbG87IHRydWU7IGZpIiAtCityZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorIHByb2cgMCBncm91cCB7fToKKyAgcGlwZSAwIHJlc193b3JkPUlGIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd0cnVlJworICBwaXBlIDEgcmVzX3dvcmQ9VEhFTiBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnZWNobycgJ0hlbGxvJworICBwaXBlIDIgcmVzX3dvcmQ9VEhFTiBmb2xsb3d1cD1TRVEgcHJvZ1swXSAndHJ1ZScKKyAgcGlwZSAzIHJlc193b3JkPUZJIGZvbGxvd3VwPVNFUQorICBwaXBlIDQgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD0obnVsbCkKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCitBYm92ZSB5b3Ugc2VlIHRoYXQgaWYgaXMgYSBsaXN0LCBhbmQgaXQgc2l0cyBpbiBhIHt9IGdyb3VwCitpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgaHVzaC4gQWxzbyBub3RlIHR3byBUSEVOIHJlc193b3JkJ3MgLQoraXQgaXMgZXhwbGFpbmVkIGJlbG93LgorCisiaWYgdHJ1ZTsgdGhlbiB7IGVjaG8gSGVsbG87IHRydWU7IH07IGZpIiAtCitwaXBlIDAgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKyBwcm9nIDAgZ3JvdXAge306CisgIHBpcGUgMCByZXNfd29yZD1JRiBmb2xsb3d1cD1TRVEgcHJvZ1swXSAndHJ1ZScKKyAgcGlwZSAxIHJlc193b3JkPVRIRU4gZm9sbG93dXA9U0VRCisgICBwcm9nIDAgZ3JvdXAge306CisgICAgcGlwZSAwIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2VjaG8nICdIZWxsbycKKyAgICBwaXBlIDEgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEgcHJvZ1swXSAndHJ1ZScKKyAgICBwaXBlIDIgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKyAgcGlwZSAyIHJlc193b3JkPU5PTkUgZm9sbG93dXA9KG51bGwpCitwaXBlIDEgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKworImZvciB2IGluIGEgYjsgZG8gZWNobyAkdjsgdHJ1ZTsgZG9uZSIgLQorcGlwZSAwIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRCisgcHJvZyAwIGdyb3VwIHt9OgorICBwaXBlIDAgcmVzX3dvcmQ9Rk9SIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd2JworICBwaXBlIDEgcmVzX3dvcmQ9SU4gZm9sbG93dXA9U0VRIHByb2dbMF0gJ2EnICdiJworICBwaXBlIDIgcmVzX3dvcmQ9RE8gZm9sbG93dXA9U0VRIHByb2dbMF0gJ2VjaG8nICckdicKKyAgcGlwZSAzIHJlc193b3JkPURPIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd0cnVlJworICBwaXBlIDQgcmVzX3dvcmQ9RE9ORSBmb2xsb3d1cD1TRVEKKyAgcGlwZSA1IHJlc193b3JkPU5PTkUgZm9sbG93dXA9KG51bGwpCitwaXBlIDEgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKworTm90ZSBob3cgIlRIRU4iIGFuZCAiRE8iIGRvZXMgbm90IGp1c3QgbWFyayB0aGUgZmlyc3QgcGlwZSwKK2l0ICJzdGlja3MiIHRvIGFsbCBwaXBlcyBpbiB0aGUgYm9keS4gVGhpcyBpcyB1c2VkIHdoZW4KK2h1c2ggZXhlY3V0ZXMgcGFyc2VkIHBpcGVzLgorCitEdW1teSB0cmFpbGluZyBwaXBlcyB3aXRoIG5vIGNvbW1hbmRzIGFyZSBhcnRpZmFjdHMgb2YgaW1wZXJmZWN0CitwYXJzaW5nIGFsZ29yaXRobSAtIGRvbmVfcGlwZSgpIGFwcGVuZHMgbmV3IHBpcGUgc3RydWN0IGJlZm9yZWhhbmQKK2FuZCBsYXN0IG9uZSBlbmRzIHVwIGVtcHR5IGFuZCB1bnVzZWQuCisKKyJmb3IiIGFuZCAiY2FzZSIgc3RhdGVtZW50cyAoYWIpdXNlIHByb2dzW10gdG8ga2VlcCB0aGVpciBkYXRhCitpbnN0ZWFkIG9mIGFyZ3YgdmVjdG9yIHByb2dzW10gdXN1YWxseSBkby4gImZvciIga2V5d29yZCBpcyBmb3JjaW5nCitwaXBlIHRlcm1pbmF0aW9uIGFmdGVyIGZpcnN0IHdvcmQsIHdoaWNoIG1ha2VzIGh1c2ggc2VlCisiZm9yIHYgaW4uLi4iIGFzICJmb3IgdjsgaW4uLi4iLiAiY2FzZSIga2V5d29yZCBkb2VzIHRoZSBzYW1lLgorT3RoZXIganVkaWNpdW9zbHkgcGxhY2VkIGhhY2tzIG1ha2UgaHVzaCBzZWUKKyJjYXNlIHdvcmQgaW4gYSkgY21kMTs7IGIpIGNtZDI7OyBlc2FjIiBhcyBpZiBpdCB3YXMKKyJjYXNlIHdvcmQ7IG1hdGNoIGE7IGNtZDsgbWF0Y2ggYjsgY21kMjsgZXNhYyIKKygibWF0Y2giIGlzIGEgZmljdGl0aW91cyBrZXl3b3JkIGhlcmUpOgorCisiY2FzZSB3b3JkIGluIGEpIGNtZDE7OyBiKSBjbWQyOyBlc2FjIiAtCitwaXBlIDAgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD0xIFNFUQorIHByb2cgMCBncm91cCB7fToKKyAgcGlwZSAwIHJlc193b3JkPUNBU0UgZm9sbG93dXA9U0VRIHByb2dbMF0gJ3dvcmQnCisgIHBpcGUgMSByZXNfd29yZD1NQVRDSCBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnYScKKyAgcGlwZSAyIHJlc193b3JkPUNBU0VJIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdjbWQxJworICBwaXBlIDMgcmVzX3dvcmQ9TUFUQ0ggZm9sbG93dXA9U0VRIHByb2dbMF0gJ2InCisgIHBpcGUgNCByZXNfd29yZD1DQVNFSSBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnY21kMicKKyAgcGlwZSA1IHJlc193b3JkPUNBU0VJIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdjbWQzJworICBwaXBlIDYgcmVzX3dvcmQ9RVNBQyBmb2xsb3d1cD1TRVEKKyAgcGlwZSA3IHJlc193b3JkPU5PTkUgZm9sbG93dXA9KG51bGwpCitwaXBlIDEgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKworCisyMDA4LTAxCisKKwlDb21tYW5kIGV4ZWN1dGlvbgorCisvKiBjYWxsc2l0ZTogcHJvY2Vzc19jb21tYW5kX3N1YnMgKi8KK2dlbmVyYXRlX3N0cmVhbV9mcm9tX2xpc3Qoc3RydWN0IHBpcGUgKmhlYWQpIC0gaGFuZGxlcyBgY21kc2AKKyAgY3JlYXRlIFVOSVggcGlwZQorICBbdl1mb3JrCisgIGNoaWxkOgorICByZWRpcmVjdCBwaXBlIG91dHB1dCB0byBzdGRvdXQKKyAgX2V4aXQocnVuX2xpc3QoaGVhZCkpOyAgIC8qIGxlYWtzIG1lbW9yeSAqLworICBwYXJlbnQ6CisgIHJldHVybiBVTklYIHBpcGUncyBvdXRwdXQgZmQKKyAgLyogaGVhZCBpcyBmcmVlZCBieSB0aGUgY2FsbGVyICovCisKKy8qIGNhbGxzaXRlOiBwYXJzZV9hbmRfcnVuX3N0cmVhbSAqLworcnVuX2FuZF9mcmVlX2xpc3Qoc3RydWN0IHBpcGUgKikKKyAgcnVuX2xpc3Qoc3RydWN0IHBpcGUgKikKKyAgZnJlZV9waXBlX2xpc3Qoc3RydWN0IHBpcGUgKikKKworLyogY2FsbHNpdGVzOiBnZW5lcmF0ZV9zdHJlYW1fZnJvbV9saXN0LCBydW5fYW5kX2ZyZWVfbGlzdCwgcHNldWRvX2V4ZWMsIHJ1bl9waXBlICovCitydW5fbGlzdChzdHJ1Y3QgcGlwZSAqKSAtIGhhbmRsZXMgImNtZDsgY21kMiAmJiBjbWQzIiwgd2hpbGUvZm9yL2RvIGxvb3BzCisgIHJ1bl9waXBlIC0gZm9yIGV2ZXJ5IHBpcGUgaW4gbGlzdAorCisvKiBjYWxsc2l0ZTogcnVuX2xpc3QgKi8KK3J1bl9waXBlIC0gcnVucyAiY21kMSB8IGNtZDIgfCBjbWQzIFsmXSIKKyAgcnVuX2xpc3QgLSB1c2VkIGlmIG9ubHkgb25lIGNtZCBhbmQgaXQgaXMgb2YgdGhlIGZvcm0gIntjbWRzO30iCisgIGZvcmtzIGZvciBldmVyeSBjbWQgaWYgbW9yZSB0aGFuIG9uZSBjbWQgb3IgaWYgJiBpcyB0aGVyZQorICBwc2V1ZG9fZXhlYyAtIHJ1bnMgZWFjaCAiY21kTiIgKGhhbmRsZXMgYnVpbHRpbnMgZXRjKQorCisvKiBjYWxsc2l0ZTogcnVuX3BpcGUgKi8KK3BzZXVkb19leGVjIC0gcnVucyAiY21kIiAoaGFuZGxlcyBidWlsdGlucyBldGMpCisgIGV4ZWMgLSBleGVjcyBleHRlcm5hbCBwcm9ncmFtcworICBydW5fbGlzdCAtIHVzZWQgaWYgY21kTiBpcyAiKGNtZHMpIiBvciAie2NtZHM7fSIKKyAgLyogcHJvYmxlbTogcHV0ZW52J3MgbWFsbG9jZWQgc3RyaW5ncyBpbnRvIGVudmlyb24gLQorICAqKiB3aXRoIHZmb3JrIHRoZXkgd2lsbCBsZWFrIGludG8gcGFyZW50IHByb2Nlc3MKKyAgKi8KKyAgLyogcHJvYmxlbSB3aXRoIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkU6CisgICoqIHJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoYSwgYXJndikgdXNlcyBleGl0IC0gdGhpcyBjYW4gaW50ZXJmZXJlCisgICoqIHdpdGggdmZvcmsgLSBzd2l0Y2ggdG8gX2V4aXQgdGhlcmU/CisgICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX2xlYWt0b29sLnNoIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF9sZWFrdG9vbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTM1ZWMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF9sZWFrdG9vbC5zaApAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vc2gKKworIyBodXNoJ3Mgc3RkZXJyIHdpdGggbGVhayBkZWJ1ZyBlbmFibGVkCitvdXRwdXQ9b3V0cHV0CisKK2ZyZWVsaXN0PWBncmVwICdmcmVlIDB4JyAiJG91dHB1dCIgfCBjdXQgLWQnICcgLWYyIHwgc29ydCB8IHVuaXEgfCB4YXJnc2AKKworZ3JlcCAtdiBmcmVlICIkb3V0cHV0IiA+IiRvdXRwdXQubGVha2VkIgorCitpPTgKK2xpc3Q9Citmb3IgZnJlZWQgaW4gJGZyZWVsaXN0OyBkbworICAgIGxpc3Q9IiRsaXN0IC1lICRmcmVlZCIKKyAgICB0ZXN0ICQoKC0taSkpICE9IDAgJiYgY29udGludWUKKyAgICBlY2hvIERyb3BwaW5nICRsaXN0CisgICAgZ3JlcCAtRiAtdiAkbGlzdCA8IiRvdXRwdXQubGVha2VkIiA+IiRvdXRwdXQudGVtcCIKKyAgICBtdiAiJG91dHB1dC50ZW1wIiAiJG91dHB1dC5sZWFrZWQiCisgICAgaT04CisgICAgbGlzdD0KK2RvbmUKK2lmIHRlc3QgIiRsaXN0IjsgdGhlbgorICAgIGVjaG8gRHJvcHBpbmcgJGxpc3QKKyAgICBncmVwIC1GIC12ICRsaXN0IDwiJG91dHB1dC5sZWFrZWQiID4iJG91dHB1dC50ZW1wIgorICAgIG12ICIkb3V0cHV0LnRlbXAiICIkb3V0cHV0LmxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjAxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aC5yaWdodApAQCAtMCwwICsxLDE0NyBAQAorRm9ybWF0OiAnZXhwZWN0ZWQgYWN0dWFsJworMTYzIDE2MworNCA0CisxNiAxNgorOCA4CisyIDIKKzQgNAorMiAyCisyIDIKKzEgMQorMCAwCiswIDAKKzAgMAorMSAxCisxIDEKKzIgMgorLTMgLTMKKy0yIC0yCisxIDEKKzAgMAorMiAyCisxMzEwNzIgMTMxMDcyCisyOSAyOQorMzMgMzMKKzQ5IDQ5CisxIDEKKzEgMQorMCAwCiswIDAKKzEgMQorMSAxCisxIDEKKzIgMgorMyAzCisxIDEKKzU4IDU4CisyIDIKKzYwIDYwCisxIDEKKzI1NiAyNTYKKzE2IDE2Cis2MiA2MgorNCA0CisyOSAyOQorNSA1Cit1bmFyeSBwbHVzLCBtaW51cworLTQgLTQKKzQgNAorY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMKKzEgMQorMzIgMzIKKzMyIDMyCisxIDEKKzEgMQorMzIgMzIKK2NoZWNrIHRoYXQgcGFyZW50aGVzZXMgaW4gYGNtZGAgYXJlIGludGVycHJldGVkIGNvcnJlY3RseQorMyAzCitjaGVjayB0aGF0IHRoZSB1bmV2YWx1YXRlZCBwYXJ0IG9mIHRoZSB0ZXJuYXJ5IG9wZXJhdG9yIGRvZXMgbm90IGRvIGV2YWx1YXRpb24gb3IgYXNzaWdubWVudAorMjAgMjAKKzMwIDMwCisyMCAyMAorMzAgMzAKK2NoZWNrIHByZWNlZGVuY2Ugb2YgYXNzaWdubWVudCB2cy4gY29uZGl0aW9uYWwgb3BlcmF0b3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitjaGVjayBwcmVjZWRlbmNlIG9mIGFzc2lnbm1lbnQgdnMuIGNvbmRpdGlvbmFsIG9wZXJhdG9yCithc3NvY2lhdGl2aXR5IG9mIGFzc2lnbm1lbnQtb3BlcmF0b3Igb3BlcmF0b3IKKzYgNgorNiw1LDMgNiw1LDMKK29jdGFsLCBoZXgKKzI2MyAyNjMKKzI1NSAyNTUKKzQwIDQwCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogZGl2aWRlIGJ5IHplcm8KK2h1c2g6IGNhbid0IGV4ZWN1dGUgJ2xldCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBjYW4ndCBleGVjdXRlICdsZXQnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CithYmMKK2RlZgorZ2hpCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorMTYgMTYKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBtYWxmb3JtZWQgPzogb3BlcmF0b3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis5IDkKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorOSA5Cis5IDkKKzkgOQorNyA3Cis3Cis0IDQKKzMyNzY3IDMyNzY3CiszMjc2OCAzMjc2OAorMTMxMDcyIDEzMTA3MgorMjE0NzQ4MzY0NyAyMTQ3NDgzNjQ3CisxIDEKKzQgNAorNCA0Cis1IDUKKzUgNQorNCA0CiszIDMKKzMgMworNCA0Cis0IDQKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorNCA0Cis3IDcKKy03IC03CitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorNiA2CiszIDMKKzcgNworNCA0CiswIDAKKzMgMworNyA3CisyIDIKKy0yIC0yCisxIDEKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorNSA1CisxIDEKKzQgNAorMCAwCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzggMTIKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis0MgorNDIKKzQyCitodXNoOiBjYW4ndCBleGVjdXRlICdhW2JbY11kXT1lJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYXJpdGgvYXJpdGgudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYzZiMzQxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYXJpdGgvYXJpdGgudGVzdHMKQEAgLTAsMCArMSwzMDUgQEAKKyNhc2gjIHNldCArbyBwb3NpeAorI2FzaCMgZGVjbGFyZSAtaSBpdiBqdgorCitlY2hvICJGb3JtYXQ6ICdleHBlY3RlZCBhY3R1YWwnIgorCitpdj0kKCggMyArIDUgKiAzMiApKQorZWNobyAxNjMgJGl2CisjYXNoIyBpdj1pdiszCisjYXNoIyBlY2hvIDE2NiAkaXYKK2l2PTIKK2p2PWl2CisKKzogJCgoanYgKj0gMikpICMjaHVzaCMjIGxldCAianYgKj0gMiIKK2VjaG8gNCAkanYKK2p2PSQoKCAkanYgPDwgMiApKQorZWNobyAxNiAkanYKKworOiAkKChqdj0kanYgLyAyKSkgIyNodXNoIyMgbGV0IGp2PSIkanYgLyAyIgorZWNobyA4ICRqdgorI2FzaCMganY9Imp2ID4+IDIiCis6ICQoKGp2PWp2ID4+IDIpKSAjI2h1c2gjIyBsZXQganY9Imp2ID4+IDIiCitlY2hvIDIgJGp2CisKK2l2PSQoKGl2KyAkanYpKQorZWNobyA0ICRpdgorZWNobyAyICQoKGl2IC09IGp2KSkKK2VjaG8gMiAkaXYKK2VjaG8gMSAkKCggaXYgPT0ganYgKSkKK2VjaG8gMCAkKCggaXYgIT0gJGp2ICkpCitlY2hvIDAgJCgoIGl2IDwganYgKSkKK2VjaG8gMCAkKCggJGl2ID4gJGp2ICkpCitlY2hvIDEgJCgoIGl2IDw9ICRqdiApKQorZWNobyAxICQoKCAkaXYgPj0ganYgKSkKKworZWNobyAyICRqdgorZWNobyAtMyAkKCggfiRqdiApKQorZWNobyAtMiAkKCggfjEgKSkKK2VjaG8gMSAkKCggISAwICkpCisKK2VjaG8gMCAkKCgganYgJSAyICkpCitlY2hvIDIgJCgoICRpdiAlIDQgKSkKKworZWNobyAxMzEwNzIgJCgoIGl2IDw8PSAxNiApKQorZWNobyAyOSAkKCggaXYgJT0gMzMgKSkKKworZWNobyAzMyAkKCggMzMgJiA1NSApKQorZWNobyA0OSAkKCggMzMgfCAxNyApKQorCitlY2hvIDEgJCgoIGl2ICYmICRqdiApKQorZWNobyAxICQoKCAkaXYgfHwganYgKSkKKworZWNobyAwICQoKCBpdiAmJiAwICkpCitlY2hvIDAgJCgoIGl2ICYgMCApKQorZWNobyAxICQoKCBpdiAmJiAxICkpCitlY2hvIDEgJCgoIGl2ICYgMSApKQorCitlY2hvIDEgJCgoICRqdiB8fCAwICkpCitlY2hvIDIgJCgoIGp2IHwgMCApKQorZWNobyAzICQoKCBqdiB8IDEgKSkKK2VjaG8gMSAkKCggJGp2IHx8IDEgKSkKKworOiAkKChpdiAqPSBqdikpICMjaHVzaCMjIGxldCAnaXYgKj0ganYnCitlY2hvIDU4ICRpdgorZWNobyAyICRqdgorOiAkKChqdiArPSAkaXYpKSAjI2h1c2gjIyBsZXQgImp2ICs9ICRpdiIKK2VjaG8gNjAgJGp2CisKK2VjaG8gMSAkKCgganYgLz0gaXYgKSkKK2VjaG8gMjU2ICQoKCBqdiA8PD0gOCApKQorZWNobyAxNiAkKCgganYgPj49IDQgKSkKKworZWNobyA2MiAkKCggaXYgfD0gNCApKQorZWNobyA0ICQoKCBpdiAmPSA0ICkpCisKK2VjaG8gMjkgJCgoIGl2ICs9IChqdiArIDkpKSkKK2VjaG8gNSAkKCggKGl2ICsgNCkgJSA3ICkpCisKK2VjaG8gdW5hcnkgcGx1cywgbWludXMKK2VjaG8gLTQgJCgoICs0IC0gOCApKQorZWNobyA0ICQoKCAtNCArIDggKSkKKworZWNobyBjb25kaXRpb25hbCBleHByZXNzaW9ucworZWNobyAxICQoKCA0PDUgPyAxIDogMzIpKQorZWNobyAzMiAkKCggND41ID8gMSA6IDMyKSkKK2VjaG8gMzIgJCgoIDQ+KDIrMykgPyAxIDogMzIpKQorZWNobyAxICQoKCA0PCgyKzMpID8gMSA6IDMyKSkKK2VjaG8gMSAkKCggKDIrMik8KDIrMykgPyAxIDogMzIpKQorZWNobyAzMiAkKCggKDIrMik+KDIrMykgPyAxIDogMzIpKQorCitlY2hvICdjaGVjayB0aGF0IHBhcmVudGhlc2VzIGluIGBjbWRgIGFyZSBpbnRlcnByZXRlZCBjb3JyZWN0bHknCisjIFx4MjggaXMgJygnCitlY2hvIDMgJCgoICggYHByaW50ZiAnKFx4MjggMSdgICsgYGVjaG8gMlwpXClgICkgKSkKKworZWNobyBjaGVjayB0aGF0IHRoZSB1bmV2YWx1YXRlZCBwYXJ0IG9mIHRoZSB0ZXJuYXJ5IG9wZXJhdG9yIGRvZXMgbm90IGRvIGV2YWx1YXRpb24gb3IgYXNzaWdubWVudAoreD1pKz0yCit5PWorPTIKKyNhc2gjIGRlY2xhcmUgLWkgaT0xIGo9MQorICAgICAgaT0xCisgICAgICBqPTEKK2VjaG8gMjAgJCgoMSA/IDIwIDogKHgrPTIpKSkKKyNhc2gjIGVjaG8gJGksJHggICAgICAgICAgICAgIyBhc2ggbWlzaGFuZGxlcyB0aGlzCitlY2hvIDMwICQoKDAgPyAoeSs9MikgOiAzMCkpCisjYXNoIyBlY2hvICRqLCR5ICAgICAgICAgICAgICMgYXNoIG1pc2hhbmRsZXMgdGhpcworCit4PWkrPTIKK3k9ais9MgorI2FzaCMgZGVjbGFyZSAtaSBpPTEgaj0xCisgICAgICBpPTEKKyAgICAgIGo9MQorZWNobyAyMCAkKCgxID8gMjAgOiAoeCs9MikpKQorI2FzaCMgZWNobyAkaSwkeCAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKK2VjaG8gMzAgJCgoMCA/ICh5Kz0yKSA6IDMwKSkKKyNhc2gjIGVjaG8gJGksJHkgICAgICAgICAgICAgIyBhc2ggbWlzaGFuZGxlcyB0aGlzCisKK2VjaG8gY2hlY2sgcHJlY2VkZW5jZSBvZiBhc3NpZ25tZW50IHZzLiBjb25kaXRpb25hbCBvcGVyYXRvcgorIyBzaG91bGQgYmUgYW4gZXJyb3IKKyNhc2gjIGRlY2xhcmUgLWkgeD0yCisgICAgICB4PTIKKyNhc2hub3RlIyBiYXNoIHJlcG9ydHMgZXJyb3IgYnV0IGNvbnRpbnVlcywgYXNoIGFib3J0cyAtIHVzaW5nIHN1YnNoZWxsIHRvICdlbXVsYXRlJyBiYXNoOgorKCAgeT0kKCgxID8gMjAgOiB4Kz0yKSkgICkKKworZWNobyBjaGVjayBwcmVjZWRlbmNlIG9mIGFzc2lnbm1lbnQgdnMuIGNvbmRpdGlvbmFsIG9wZXJhdG9yCisjYXNoIyBkZWNsYXJlIC1pIHg9MgorICAgICAgeD0yCisjIGFzaCBzYXlzICJsaW5lIE5OTjogc3ludGF4IGVycm9yOiAwID8geCs9MiA6IDIwIgorI2FzaCMgZWNobyAyMCAkKCgwID8geCs9MiA6IDIwKSkKKworZWNobyBhc3NvY2lhdGl2aXR5IG9mIGFzc2lnbm1lbnQtb3BlcmF0b3Igb3BlcmF0b3IKKyNhc2gjIGRlY2xhcmUgLWkgaT0xIGo9MiBrPTMKK2k9MQoraj0yCitrPTMKK2VjaG8gNiAkKChpICs9IGogKz0gaykpCitlY2hvIDYsNSwzICRpLCRqLCRrCisKK2VjaG8gb2N0YWwsIGhleAorZWNobyAyNjMgJCgoIDB4MTAwIHwgMDA3ICkpCitlY2hvIDI1NSAkKCggMHhmZiApKQorI2FzaCMgZWNobyAyNTUgJCgoIDE2I2ZmICkpCisjYXNoIyBlY2hvIDEyNyAkKCggMTYjRkYvMiApKQorI2FzaCMgZWNobyAzNiAkKCggOCM0NCApKQorCitlY2hvIDQwICQoKCA4IF4gMzIgKSkKKworI2FzaCMgIyBvdGhlciBiYXNlcworI2FzaCMgZWNobyAxMCAkKCggMTYjYSApKQorI2FzaCMgZWNobyAxMCAkKCggMzIjYSApKQorI2FzaCMgZWNobyAxMCAkKCggNTYjYSApKQorI2FzaCMgZWNobyAxMCAkKCggNjQjYSApKQorI2FzaCMKKyNhc2gjIGVjaG8gMTAgJCgoIDE2I0EgKSkKKyNhc2gjIGVjaG8gMTAgJCgoIDMyI0EgKSkKKyNhc2gjIGVjaG8gMzYgJCgoIDU2I0EgKSkKKyNhc2gjIGVjaG8gMzYgJCgoIDY0I0EgKSkKKyNhc2gjCisjYXNoIyBlY2hvIDYyICQoKCA2NCNAICkpCisjYXNoIyBlY2hvIDYzICQoKCA2NCNfICkpCisKKyNhc2gjICMgd2VpcmQgYmFzZXMgKGVycm9yKQorI2FzaCMgZWNobyAkKCggMzQyNSM1NiApKQorCisjYXNoIyAjIG1pc3NpbmcgbnVtYmVyIGFmdGVyIGJhc2UKKyNhc2gjIGVjaG8gMCAkKCggMiMgKSkKKworIyB0aGVzZSBzaG91bGQgZ2VuZXJhdGUgZXJyb3JzCisoICBlY2hvICQoKCA3ID0gNDMgKSkgICAgICApCisjYXNoIyBlY2hvICQoKCAyIzQ0ICkpCisoICBlY2hvICQoKCA0NCAvIDAgKSkgICAgICApCisoICBsZXQgJ2p2ICs9ICRpdicgICAgICAgICApCisoICBlY2hvICQoKCBqdiArPSBcJGl2ICkpICApCisoICBsZXQgJ3J2ID0gNyArICg0MyAqIDYnICApCisKKyNhc2gjICMgbW9yZSBlcnJvcnMKKyNhc2gjIGRlY2xhcmUgLWkgaQorI2FzaCMgaT0wIzQKKyNhc2gjIGk9MiMxMTAjMTEKKworKChlY2hvIGFiYzsgZWNobyBkZWY7KTsgZWNobyBnaGkpCisKKyNhc2gjIGlmICgoKDQrNCkgKyAoNCArIDcpKSk7IHRoZW4KKyNhc2gjIAllY2hvIG9rCisjYXNoIyBmaQorCisjYXNoIyAoKCkpCSMgbWFrZSBzdXJlIHRoZSBudWxsIGV4cHJlc3Npb24gd29ya3MgT0sKKworI2FzaCMgYT0oMCAyIDQgNikKKyNhc2gjIGVjaG8gNiAkKCggYVsxXSArIGFbMl0gKSkKKyNhc2gjIGVjaG8gMSAkKCggKGFbMV0gKyBhWzJdKSA9PSBhWzNdICkpCisjYXNoIyAoKCAoYVsxXSArIGFbMl0pID09IGFbM10gKSkgOyBlY2hvIDAgJD8KKworIyB0ZXN0IHB1c2hpbmcgYW5kIHBvcHBpbmcgdGhlIGV4cHJlc3Npb24gc3RhY2sKK3Vuc2V0IEEKK0E9IjQgKyAiCisoICBlY2hvIEEgJCgoICggNCArIEEgKSArIDQgKSkgICkKK0E9IjMgKyA1IgorZWNobyAxNiAkKCggKCA0ICsgQSApICsgNCApKQorCisjIGJhZGx5LWZvcm1lZCBjb25kaXRpb25hbCBleHByZXNzaW9ucworKCAgZWNobyAkKCggNCA/IDogJEEgKSkgICkKKyggIGVjaG8gJCgoIDEgPyAyMCApKSAgICApCisoICBlY2hvICQoKCA0ID8gMjAgOiApKSAgKQorCisjIHByZWNlZGVuY2UgYW5kIHNob3J0LWNpcmN1aXQgZXZhbHVhdGlvbgorQj05CitlY2hvIDkgJEIKKworIyBlcnJvcgorKCAgZWNobyAkKCggMCAmJiBCPTQyICkpOyBlY2hvIDkgJEIgICkKKworIyBlcnJvcgorKCAgZWNobyAkKCggMSB8fCBCPTg4ICkpOyBlY2hvIDkgJEIgICkKKworIyBhc2ggbWlzdGFrZW5seSBldmFsdWF0ZXMgQj0uLi4gYmVsb3cKKyNhc2gjIGVjaG8gMCAkKCggMCAmJiAoQj00MikgKSkKK2VjaG8gOSAkQgorI2FzaCMgZWNobyAwICQoKCAoJHskfSAtICQkKSAmJiAoQj00MikgKSkKK2VjaG8gOSAkQgorI2FzaCMgZWNobyAxICQoKCAxIHx8IChCPTg4KSApKQorZWNobyA5ICRCCisKKworIyB1bnRpbCBjb21tYW5kIHdpdGggKCggKSkgY29tbWFuZAoreD03CisKK2VjaG8gNyAkeAorI2FzaCMgdW50aWwgKCggeCA9PSA0ICkpCisgICAgICB1bnRpbCB0ZXN0ICIkeCIgPSA0CitkbworCWVjaG8gJHgKKwl4PTQKK2RvbmUKKworZWNobyA0ICR4CisKKyMgZXhwb25lbnRpYXRpb24KK2VjaG8gMzI3NjcgJCgoIDIqKjE1IC0gMSkpCitlY2hvIDMyNzY4ICQoKCAyKiooMTYtMSkpKQorZWNobyAxMzEwNzIgJCgoIDIqKjE2KjIgKSkKK2VjaG8gMjE0NzQ4MzY0NyAkKCggMioqMzEtMSkpCitlY2hvIDEgJCgoIDIqKjAgKSkKKworIyB7cHJlLHBvc3R9LXtpbmMsZGVjfXJlbWVudCBhbmQgYXNzb2NpYXRlZCBlcnJvcnMKKworeD00CisKK2VjaG8gNCAkeAorZWNobyA0ICQoKCB4KysgKSkKK2VjaG8gNSAkeAorZWNobyA1ICQoKCB4LS0gKSkKK2VjaG8gNCAkeAorCitlY2hvIDMgJCgoIC0teCApKQorZWNobyAzICR4CisKK2VjaG8gNCAkKCggKyt4ICkpCitlY2hvIDQgJHgKKworIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0ICsrNyBpcyA3CisjYXNoIyBlY2hvIDcgJCgoICsrNyApKQorKCAgZWNobyAkKCggNy0tICkpICAgICkKKworKCAgZWNobyAkKCggLS14PTcgKSkgICkKKyggIGVjaG8gJCgoICsreD03ICkpICApCisKKyggIGVjaG8gJCgoIHgrKz03ICkpICApCisoICBlY2hvICQoKCB4LS09NyApKSAgKQorCitlY2hvIDQgJHgKKworZWNobyA3ICQoKCArNyApKQorZWNobyAtNyAkKCggLTcgKSkKKworIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0ICsrNyBpcyA3CisjYXNoIyBlY2hvICQoKCArKzcgKSkKKyNhc2gjIGVjaG8gJCgoIC0tNyApKQorCiske1RISVNfU0h9IC4vYXJpdGgxLnN1YgorJHtUSElTX1NIfSAuL2FyaXRoMi5zdWIKKworeD00Cit5PTcKKworI2FzaCMgKCggeD04ICwgeT0xMiApKQorICAgICAgeD04CisgICAgICB5PTEyCitlY2hvICR4ICR5CisKKyNhc2gjICMgc2hvdWxkIGJlIGFuIGVycm9yCisjYXNoIyAoKCB4PTkgeT00MSApKQorCisjIFRoZXNlIGFyZSBlcnJvcnMKK3Vuc2V0IGIKKyggIGVjaG8gJCgoYSBiKSkgICkKKyNhc2gjICgoYSBiKSkKKworbj00MgorcHJpbnRmICIlZFxuIiAkbgorcHJpbnRmICIlaVxuIiAkbgorI2FzaCMgZWNobyAkKCggOCMkKHByaW50ZiAiJW9cbiIgJG4pICkpCitwcmludGYgIiV1XG4iICRuCisjYXNoIyBlY2hvICQoKCAxNiMkKHByaW50ZiAiJXhcbiIgJG4pICkpCisjYXNoIyBlY2hvICQoKCAxNiMkKHByaW50ZiAiJVhcbiIgJG4pICkpCisKKyMgY2F1c2VzIGxvbmdqbXAgYm90Y2hlcyB0aHJvdWdoIGJhc2gtMi4wNWIKK2FbYltjXWRdPWUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoMS5zdWIgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aDEuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwYWE5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aDEuc3ViCkBAIC0wLDAgKzEsNDAgQEAKKyMgdGVzdCBvZiByZWRvbmUgcG9zdC1pbmNyZW1lbnQgYW5kIHBvc3QtZGVjcmVtZW50IGNvZGUKKyggIGVjaG8gJCgoIDQtLSApKSAgICkKKyggIGVjaG8gJCgoIDQrKyApKSAgICkKKyggIGVjaG8gJCgoIDQgLS0gKSkgICkKKyggIGVjaG8gJCgoIDQgKysgKSkgICkKKworI2FzaCMgKCggYXJyYXlbMF0rKyApKQorI2FzaCMgZWNobyAke2FycmF5fQorCisjYXNoIyAoKCBhcnJheVswXSArKyApKQorI2FzaCMgZWNobyAke2FycmF5fQorCisjYXNoIyAoKCBhKysgKSkKKyNhc2gjIGVjaG8gJGEKKyNhc2gjICgoIGEgKysgKSkKKyNhc2gjIGVjaG8gJGEKKyAgICAgIGE9MgorCitlY2hvIDYgJCgoIGEgKysgKyA0ICkpCitlY2hvIDMgJGEKKworZWNobyA3ICQoKCBhKysrNCApKQorZWNobyA0ICRhCisKK2VjaG8gMCAkKCggYS0tLTQgKSkKK2VjaG8gMyAkYQorCitlY2hvIDcgJCgoIGEgLS0gKyA0ICkpCitlY2hvIDIgJGEKKworZWNobyAtMiAkKCggYSAtLSAtIDQgKSkKK2VjaG8gMSAkYQorCisjYXNoIyAoKCArKyArIDcgKSkKKworI2FzaCMgKCggKysgKSkKKyggIGVjaG8gJCgoICsrKzcgKSkgICkKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCArKyArNyBpcyA3CisjYXNoIyBlY2hvICQoKCArKyArIDcgKSkKKyNhc2gjICgoIC0tICkpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aDIuc3ViIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYXJpdGgvYXJpdGgyLnN1YgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mN2UzYzkyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYXJpdGgvYXJpdGgyLnN1YgpAQCAtMCwwICsxLDU3IEBACisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKys3IGlzIDcgZXRjCisoICBlY2hvICQoKCAtLTcgKSkgICApCisoICBlY2hvICQoKCArKzcgKSkgICApCisoICBlY2hvICQoKCAtLSA3ICkpICApCisoICBlY2hvICQoKCArKyA3ICkpICApCisKKyNhc2gjICgoKythcnJheVswXSApKQorI2FzaCMgZWNobyAxICRhcnJheQorI2FzaCMgKCggKysgYXJyYXlbMF0gKSkKKyNhc2gjIGVjaG8gMiAkYXJyYXkKKworI2FzaCMgKCggKythICkpCisjYXNoIyBlY2hvIDEgJGEKKyNhc2gjICgoICsrIGEgKSkKKyNhc2gjIGVjaG8gMiAkYQorCisjYXNoIyAoKCAtLWEgKSkKKyNhc2gjIGVjaG8gMSAkYQorI2FzaCMgKCggLS0gYSApKQorI2FzaCMgZWNobyAwICRhCisgICAgICBhPTAKKworZWNobyA1ICQoKCA0ICsgKythICkpCitlY2hvIDEgJGEKKworIyBhc2ggZG9lc24ndCBoYW5kbGUgaXQgcmlnaHQuLi4KKyNhc2gjIGVjaG8gNiAkKCggNCsrK2EgKSkKKyNhc2gjIGVjaG8gMiAkYQorICAgICAgYT0yCisKKyMgYXNoIGRvZXNuJ3QgaGFuZGxlIGl0IHJpZ2h0Li4uCisjYXNoIyBlY2hvIDMgJCgoIDQtLS1hICkpCisjYXNoIyBlY2hvIDEgJGEKKyAgICAgIGE9MQorCitlY2hvIDQgJCgoIDQgLSAtLSBhICkpCitlY2hvIDAgJGEKKworI2FzaCMgKCggLS0gKSkKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCAtLS03IGlzIC03CisjYXNoIyBlY2hvICQoKCAtLS03ICkpCisoICBlY2hvICQoKCAtLSAtIDcgKSkgICkKKworI2FzaCMgKCggKysgKSkKKyMgYmFzaCAzLjI6IDcKKyNhc2gjIGVjaG8gNyAkKCggKys3ICkpCisoICBlY2hvICQoKCArKyArIDcgKSkgICkKKworIyBiYXNoIDMuMjogLTcKKyNhc2gjIGVjaG8gLTcgJCgoICsrLTcgKSkKKyMgYmFzaCAzLjI6IC03CisjYXNoIyBlY2hvIC03ICQoKCArKyAtIDcgKSkKKworIyBiYXNoIDMuMjogNworI2FzaCMgZWNobyA3ICQoKCArLS03ICkpCisjIGJhc2ggMy4yOiA3CisjYXNoIyBlY2hvIDcgJCgoIC0tICsgNyApKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9hbmRfb3JfYW5kX2JhY2tncm91bmRpbmcucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNlNjNlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9hbmRfb3JfYW5kX2JhY2tncm91bmRpbmcucmlnaHQKQEAgLTAsMCArMSw0IEBACitGaXJzdAorU2Vjb25kCitUaGlyZAorRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9hbmRfb3JfYW5kX2JhY2tncm91bmRpbmcudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWFjZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9hbmRfb3JfYW5kX2JhY2tncm91bmRpbmcudGVzdHMKQEAgLTAsMCArMSwzMSBAQAorIyBVTkZJWEVEIEJVRzogaHVzaCB0aGlua3MgdGhhdCA7ICYmIHx8ICYgaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlLgorIyBBY2NvcmRpbmcgdG8gdGhpcyBkb2MsICYmIHx8IGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiA7ICYuCisjIFNlZSBleGFtcGxlIGJlbG93LgorIyBQcmVjZWRlbmNlIG9mIDsgaXMgbm90IGEgcHJvYmxlbSBpbiBwcmFjdGljZS4gUHJlY2VkZW5jZSBvZiAmIGlzLgorIworI2h0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMveGN1X2NoYXAwMi5odG1sCisjCisjMi45LjMgTGlzdHMKKyMKKyNBbiBBTkQtT1IgbGlzdCBpcyBhIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlIHBpcGVsaW5lcyBzZXBhcmF0ZWQgYnkKKyN0aGUgb3BlcmF0b3JzICImJiIgYW5kICJ8fCIgLgorIworI0EgbGlzdCBpcyBhIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlIEFORC1PUiBsaXN0cyBzZXBhcmF0ZWQgYnkgdGhlIG9wZXJhdG9ycworIyc7JyBhbmQgJyYnIGFuZCBvcHRpb25hbGx5IHRlcm1pbmF0ZWQgYnkgJzsnLCAnJicsIG9yIDxuZXdsaW5lPi4KKyMKKyNUaGUgb3BlcmF0b3JzICImJiIgYW5kICJ8fCIgc2hhbGwgaGF2ZSBlcXVhbCBwcmVjZWRlbmNlIGFuZCBzaGFsbCBiZQorI2V2YWx1YXRlZCB3aXRoIGxlZnQgYXNzb2NpYXRpdml0eS4gRm9yIGV4YW1wbGUsIGJvdGggb2YgdGhlIGZvbGxvd2luZworI2NvbW1hbmRzIHdyaXRlIHNvbGVseSBiYXIgdG8gc3RhbmRhcmQgb3V0cHV0OgorIworIyAgICBmYWxzZSAmJiBlY2hvIGZvbyB8fCBlY2hvIGJhcgorIyAgICB0cnVlIHx8IGVjaG8gZm9vICYmIGVjaG8gYmFyCisjCisjQSAnOycgb3IgPG5ld2xpbmU+IHRlcm1pbmF0b3Igc2hhbGwgY2F1c2UgdGhlIHByZWNlZGluZyBBTkQtT1IgbGlzdAorI3RvIGJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseTsgYW4gJyYnIHNoYWxsIGNhdXNlIGFzeW5jaHJvbm91cyBleGVjdXRpb24KKyNvZiB0aGUgcHJlY2VkaW5nIEFORC1PUiBsaXN0LgorCitlY2hvIEZpcnN0ICYmIHNsZWVwIDAuMiAmJiBlY2hvIFRoaXJkICYKK3NsZWVwIDAuMQorZWNobyBTZWNvbmQKK3dhaXQKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9leHBvcnRfZXhwLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9leHBvcnRfZXhwLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTJlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2V4cG9ydF9leHAucmlnaHQKQEAgLTAsMCArMSw3IEBACithYTAgYmIwCithPWFhMCBiPWJiMAorYWExIGJiMQorYT1hYTEgYj1iYjEKK3p6ej16enoKK3p6PSoKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWJ1Z3MvZXhwb3J0X2V4cC50ZXN0cy5kaXNhYmxlZCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWJ1Z3MvZXhwb3J0X2V4cC50ZXN0cy5kaXNhYmxlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTEzZmQzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9leHBvcnRfZXhwLnRlc3RzLmRpc2FibGVkCkBAIC0wLDAgKzEsMjIgQEAKKyMgVGhpcyB0ZXN0IHNob3dzIGEgdmVyeSBzcGVjaWFsIGhhbmRsaW5nIG9mIGV4cG9ydCBhbmQgbG9jYWwKKyMgYnVpbHRpbnMgYnkgYmFzaC4KKwordj0iYT1hYTAgYj1iYjAiCisjIG9ubHkgMXN0IGFyZyBzaG91bGQgYmUgZXhwYW5kZWQgaW4gbXVsdGlwbGUgd29yZHMKK2V4cG9ydCAkdiBjPSR2CitlY2hvICRhICRiCitlY2hvICRjCisKKyMgb25seSAxc3QgYXJnIHNob3VsZCBiZSBleHBhbmRlZCBpbiBtdWx0aXBsZSB3b3JkcworZXhwb3J0IGBlY2hvIGE9YWExIGI9YmIxYCBjPWBlY2hvIGE9YWExIGI9YmIxYAorZWNobyAkYSAkYgorZWNobyAkYworCis+eno9enoKKz56eno9enp6CisjIG9ubHkgMXN0IGFyZyBzaG91bGQgYmUgZ2xvYmJlZAorZXhwb3J0IHp6eiogeno9KgorZW52IHwgZ3JlcCBeenogfCBzb3J0CitybSAtcmYgeno9enogenp6PXp6egorCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvYmFzaF9icmFjZTEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2Jhc2hfYnJhY2UxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzY1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2Jhc2hfYnJhY2UxLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorYmFzaF9icmFjZTEudGVzdHMKKyp7YixifXJhY2UxLnQqCitiYXNoX2JyYWNlMS50ZXN0cyBiYXNoX2JyYWNlMS50ZXN0cworRG9uZTogMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9iYXNoX2JyYWNlMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvYmFzaF9icmFjZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWIyZjBlOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvYmFzaF9icmFjZTEudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorIyB1bnF1b3RlZCAkdiBzaG91bGQgYmUgZ2xvYmJlZDoKK3Y9JypicmFjZTEudConOyBlY2hvICR2CisKKyMgLi4uYnV0IG5vdCBicmFjZSBleHBhbmRlZDoKK3Y9Jyp7YixifXJhY2UxLnQqJzsgZWNobyAkdgorCisjIHdoZXJlYXMgZGlyZWN0IGJyY2VzIGFyZSBleHBhbmRlZDoKK2VjaG8gKntiLGJ9cmFjZTEudCoKKworZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5YWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjEucmlnaHQKQEAgLTAsMCArMSwyIEBACitnbG9iMS50ZXN0cworZ2xvYjEudGVzdHMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5ODBjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IxLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyAqZ2xvYjE/dFtlXXN0cyoKK2VjaG8gImdsb2IxIj8ndCdbZV1zKgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3MGMyMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjIucmlnaHQKQEAgLTAsMCArMSwxOCBAQAorRXhwZWN0ZWQgQWN0dWFsCitaXCogICAgOiBaXCoKK1oqICAgICA6IFoqCitaXGYgICAgOiBaXGYKK1pcKiAgICA6IFpcKgorCitaXHogICAgOiBaXHoKK1p6ICAgICA6IFp6CitaXHogICAgOiBaXHoKK1pceiAgICA6IFpcegorCitaXCAgICAgOiBaXAorWlwgICAgIDogWlwKKworWlxmIFpmIDogWlxmIFpmCitaXGYgWmYgOiBaXGYgWmYKKworRG9uZTogMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGRiYzkyNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjIudGVzdHMKQEAgLTAsMCArMSwyNyBAQAorIyBUaGlzIHRlc3QgZGVtb25zdHJhdGVzIHRoYXQgaW4gdW5xdW90ZWQgJHYsIGJhY2tzbGFzaGVzIGV4cGFuZCBieSB0aGlzIHJ1bGU6CisjIFx6IC0+IFxcXHo7IFw8ZW9sPiAtPiBcXDxlb2w+IChmb3IgYW55IHosIHNwZWNpYWwgb3Igbm90KSwKKyMgYW5kIHN1YnNlcXVlbnRseSBnbG9iYmluZyBjb252ZXJ0cyBcXCB0byBcIGFuZCB0cmVhdHMgXHogYXMgbGl0ZXJhbCB6CisjIGV2ZW4gaWYgaXQgaXMgYSBzcGVjaWFsIGNoYXIuCisKKz4nWmYnCis+J1pcZicKKwllY2hvICdFeHBlY3RlZCcgJ0FjdHVhbCcKK3Y9J1wqJzsgZWNobyAnWlwqICAgIDonIFokdgorICAgICAgICBlY2hvICdaKiAgICAgOicgWlwqCisgICAgICAgIGVjaG8gJ1pcZiAgICA6JyBaXFwqCisgICAgICAgIGVjaG8gJ1pcKiAgICA6JyBaXFxcKiAgIyBOQiEgb25seSB0aGlzIG1hdGNoZXMgWiR2IG91dHB1dAorZWNobwordj0nXHonOyBlY2hvICdaXHogICAgOicgWiR2CisgICAgICAgIGVjaG8gJ1p6ICAgICA6JyBaXHoKKyAgICAgICAgZWNobyAnWlx6ICAgIDonIFpcXHoKKyAgICAgICAgZWNobyAnWlx6ICAgIDonIFpcXFx6CitlY2hvCit2PSdcJzsgIGVjaG8gJ1pcICAgICA6JyBaJHYKKyAgICAgICAgZWNobyAnWlwgICAgIDonIFpcXAorZWNobwordj0nKic7ICBlY2hvICdaXGYgWmYgOicgWiR2CisgICAgICAgIGVjaG8gJ1pcZiBaZiA6JyBaKgorZWNobworCitybSAnWlxmJyAnWmYnCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfYW5kX2Fzc2lnbi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NmU0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfYW5kX2Fzc2lnbi5yaWdodApAQCAtMCwwICsxLDYgQEAKK1pWQVI9ei50bXAgWlZBUj0qLnRtcCBaVkFSPVt6XS50bXAKK1pWQVI9ei50bXAgWlZBUj0qLnRtcCBaVkFSPVt6XS50bXAKKyoudG1wCitaVkFSPXoudG1wIHoudG1wCitaVkFSPXoudG1wIFpWQVI9Ki50bXAgWlZBUj1bel0udG1wCitaVkFSPXoudG1wIFpWQVI9Ki50bXAgWlZBUj1bel0udG1wCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfYW5kX2Fzc2lnbi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiMTU4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfYW5kX2Fzc2lnbi50ZXN0cwpAQCAtMCwwICsxLDEwIEBACis+WlZBUj16LnRtcAorPnoudG1wCitaVkFSPSoudG1wIGVjaG8gWlZBUj0qLnRtcCAiWlZBUj0qLnRtcCIgIlpWQVI9W3pdLnRtcCIKK1pWQVI9Ki50bXAgL2Jpbi9lY2hvIFpWQVI9Ki50bXAgIlpWQVI9Ki50bXAiICJaVkFSPVt6XS50bXAiCitaVkFSPSoudG1wCitlY2hvICIkWlZBUiIKK2VjaG8gJFpWQVIKK2VjaG8gWlZBUj0qLnRtcCAiWlZBUj0qLnRtcCIgIlpWQVI9W3pdLnRtcCIKKy9iaW4vZWNobyBaVkFSPSoudG1wICJaVkFSPSoudG1wIiAiWlZBUj1bel0udG1wIgorcm0gWlZBUj16LnRtcCB6LnRtcApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iX3JlZGlyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iX3JlZGlyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDAzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfcmVkaXIucmlnaHQKQEAgLTAsMCArMSwyIEBACit6LnRtcDoKKz8udG1wOiBURVNUCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfcmVkaXIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfcmVkaXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjIxZDEyMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9yZWRpci50ZXN0cwpAQCAtMCwwICsxLDkgQEAKKyMgUmVkaXJlY3Rpb25zIGFyZSBub3QgZ2xvYmJlZC4KKyMgYmFzaDoKKyMgaWYgcnVuIGFzICJzaCIsIHRoZXkgYXJlIG5vdCBnbG9iYmVkLCBidXQKKyMgaWYgcnVuIGFzICJiYXNoIiwgdGhleSBhcmUhCis+ei50bXAKK2VjaG8gVEVTVCA+Py50bXAKK2VjaG8gJ3oudG1wOicgYGNhdCAnei50bXAnYAorZWNobyAnPy50bXA6JyBgY2F0ICc/LnRtcCdgCitybSAnei50bXAnICc/LnRtcCcKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWxlYWsvbGVha19hcmd2MS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLWxlYWsvbGVha19hcmd2MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDRkNmZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbGVhay9sZWFrX2FyZ3YxLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uCitPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbGVhay9sZWFrX2FyZ3YxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbGVhay9sZWFrX2FyZ3YxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiMzcxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1sZWFrL2xlYWtfYXJndjEudGVzdHMKQEAgLTAsMCArMSw4MCBAQAorIyBXYXJtIHVwCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gWDsgZG8KKyAgICBzZXQgLS0gYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6CisgICAgc2hpZnQKKyAgICBzaGlmdCAyCisgICAgc2hpZnQgNQorICAgIHNoaWZ0IDExCisgICAgc2V0IC0tIEEgQiBDIEQgRSBGIEcgSCBJIEogSyBMIE0gTiBPIFAgUSBSIFMgVCBVIFYgVyBYIFkgWgorICAgIHNoaWZ0IDMKKyAgICBzaGlmdCA3CisgICAgaT0xJGkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTsgdGhlbiBpPTI7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTI7IHRoZW4gaT0zOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEzOyB0aGVuIGk9NDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNDsgdGhlbiBpPTU7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTU7IHRoZW4gaT02OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE2OyB0aGVuIGk9NzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNzsgdGhlbiBpPTg7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTg7IHRoZW4gaT05OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE5OyB0aGVuIGk9YTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExYTsgdGhlbiBpPWI7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWI7IHRoZW4gaT1jOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFjOyB0aGVuIGk9ZDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZDsgdGhlbiBpPWU7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWU7IHRoZW4gaT1mOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFmOyB0aGVuIGk9ZzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZzsgdGhlbiBpPWg7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWg7IHRoZW4gaT1pOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFpOyB0aGVuIGk9ajsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExajsgdGhlbiBpPVg7IGZpCitkb25lCisKK3Vuc2V0IGkKK3NldCAtLQorbWVtbGVhaworCitlY2hvICJNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4iCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gWDsgZG8KKyAgICBzZXQgLS0gYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6CisgICAgc2hpZnQKKyAgICBzaGlmdCAyCisgICAgc2hpZnQgNQorICAgIHNoaWZ0IDExCisgICAgc2V0IC0tIEEgQiBDIEQgRSBGIEcgSCBJIEogSyBMIE0gTiBPIFAgUSBSIFMgVCBVIFYgVyBYIFkgWgorICAgIHNoaWZ0IDMKKyAgICBzaGlmdCA3CisgICAgaT0xJGkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTsgdGhlbiBpPTI7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTI7IHRoZW4gaT0zOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEzOyB0aGVuIGk9NDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNDsgdGhlbiBpPTU7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTU7IHRoZW4gaT02OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE2OyB0aGVuIGk9NzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNzsgdGhlbiBpPTg7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTg7IHRoZW4gaT05OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE5OyB0aGVuIGk9YTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExYTsgdGhlbiBpPWI7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWI7IHRoZW4gaT1jOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFjOyB0aGVuIGk9ZDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZDsgdGhlbiBpPWU7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWU7IHRoZW4gaT1mOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFmOyB0aGVuIGk9ZzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZzsgdGhlbiBpPWg7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWg7IHRoZW4gaT1pOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFpOyB0aGVuIGk9ajsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExajsgdGhlbiBpPVg7IGZpCitkb25lCisKK3Vuc2V0IGkKK3NldCAtLQorbWVtbGVhaworCitrYj0kPworaWYgdGVzdCAka2IgLWxlIDQ7IHRoZW4KKyAgICBlY2hvIE9rICMka2IKK2Vsc2UKKyAgICBlY2hvICJCYWQ6ICRrYiBrYiBsZWFrZWQiCitmaQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hbmQtb3IucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2FuZC1vci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWZhNWZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hbmQtb3IucmlnaHQKQEAgLTAsMCArMSwxOCBAQAorYTEKK2E0CitiMQorYjMKK2I0CitiNgorYzQKK2M1CitjNworYzgKK2ZmMQorZmYzCitmdDIKK2Z0MwordGYyCit0ZjMKK3R0MgordHQ0CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2FuZC1vci50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYW5kLW9yLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4NTQ1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2FuZC1vci50ZXN0cwpAQCAtMCwwICsxLDM0IEBACitmYWxzZSB8fCBlY2hvIGExCitmYWxzZSAmJiBlY2hvIGEyCit0cnVlIHx8IGVjaG8gYTMKK3RydWUgJiYgZWNobyBhNAorCitmYWxzZSB8fCBlY2hvIGIxIHx8IGVjaG8gYjIKK2ZhbHNlIHx8IGVjaG8gYjMgJiYgZWNobyBiNAorZmFsc2UgJiYgZWNobyBiNSB8fCBlY2hvIGI2CitmYWxzZSAmJiBlY2hvIGI3ICYmIGVjaG8gYjgKKwordHJ1ZSB8fCBlY2hvIGMxIHx8IGVjaG8gYzIKK3RydWUgfHwgZWNobyBjMyAmJiBlY2hvIGM0Cit0cnVlICYmIGVjaG8gYzUgfHwgZWNobyBjNgordHJ1ZSAmJiBlY2hvIGM3ICYmIGVjaG8gYzgKKworZmFsc2UgfHwgZmFsc2UgfHwgZWNobyBmZjEKK2ZhbHNlIHx8IGZhbHNlICYmIGVjaG8gZmYyCitmYWxzZSAmJiBmYWxzZSB8fCBlY2hvIGZmMworZmFsc2UgJiYgZmFsc2UgJiYgZWNobyBmZjQKKworZmFsc2UgfHwgdHJ1ZSB8fCBlY2hvIGZ0MQorZmFsc2UgfHwgdHJ1ZSAmJiBlY2hvIGZ0MgorZmFsc2UgJiYgdHJ1ZSB8fCBlY2hvIGZ0MworZmFsc2UgJiYgdHJ1ZSAmJiBlY2hvIGZ0NAorCit0cnVlIHx8IGZhbHNlIHx8IGVjaG8gdGYxCit0cnVlIHx8IGZhbHNlICYmIGVjaG8gdGYyCit0cnVlICYmIGZhbHNlIHx8IGVjaG8gdGYzCit0cnVlICYmIGZhbHNlICYmIGVjaG8gdGY0CisKK3RydWUgfHwgdHJ1ZSB8fCBlY2hvIHR0MQordHJ1ZSB8fCB0cnVlICYmIGVjaG8gdHQyCit0cnVlICYmIHRydWUgfHwgZWNobyB0dDMKK3RydWUgJiYgdHJ1ZSAmJiBlY2hvIHR0NApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50MS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhMTNkMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDEucmlnaHQKQEAgLTAsMCArMSw5IEBACitpZjE6MAord2hpbGUxOjAKK3VudGlsMTowCitpZjI6MAord2hpbGUyOjAKK3VudGlsMjowCitpZjM6MAord2hpbGUzOjAKK3VudGlsMzowCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50MS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMzNiMzUyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50MS50ZXN0cwpAQCAtMCwwICsxLDQyIEBACisjIEFzc2lnbm1lbnRzIGFmdGVyIHNvbWUga2V5d29yZHMgc2hvdWxkIHN0aWxsIHdvcmsKKworaWYgYT0xIHRydWU7IHRoZW4gYT0xIHRydWU7IGVsaWYgYT0xIHRydWU7IHRoZW4gYT0xIHRydWU7IGVsc2UgYT0xIHRydWU7IGZpCitlY2hvIGlmMTokPword2hpbGUgYT0xIHRydWU7IGRvIGE9MSB0cnVlOyBicmVhazsgZG9uZQorZWNobyB3aGlsZTE6JD8KK3VudGlsIGE9MSBmYWxzZTsgZG8gYT0xIHRydWU7IGJyZWFrOyBkb25lCitlY2hvIHVudGlsMTokPworCitpZiBhPTEgdHJ1ZQorIHRoZW4gYT0xIHRydWUKKyBlbGlmIGE9MSB0cnVlCisgdGhlbiBhPTEgdHJ1ZQorIGVsc2UgYT0xIHRydWUKKyBmaQorZWNobyBpZjI6JD8KK3doaWxlIGE9MSB0cnVlCisgZG8gYT0xIHRydWUKKyBicmVhaworIGRvbmUKK2VjaG8gd2hpbGUyOiQ/Cit1bnRpbCBhPTEgZmFsc2UKKyBkbyBhPTEgdHJ1ZQorIGJyZWFrCisgZG9uZQorZWNobyB1bnRpbDI6JD8KKworaWYKKyBhPTEgdHJ1ZTsgdGhlbgorIGE9MSB0cnVlOyBlbGlmCisgYT0xIHRydWU7IHRoZW4KKyBhPTEgdHJ1ZTsgZWxzZQorIGE9MSB0cnVlOyBmaQorZWNobyBpZjM6JD8KK3doaWxlCisgYT0xIHRydWU7IGRvCisgYT0xIHRydWU7IGJyZWFrOyBkb25lCitlY2hvIHdoaWxlMzokPwordW50aWwKKyBhPTEgZmFsc2U7IGRvCisgYT0xIHRydWU7IGJyZWFrOyBkb25lCitlY2hvIHVudGlsMzokPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50Mi5yaWd0aCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDIucmlndGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxNTUyYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDIucmlndGgKQEAgLTAsMCArMSwyIEBACitodXNoOiBjYW4ndCBleGVjICdhPWInOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50Mi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NDBlMDFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50Mi50ZXN0cwpAQCAtMCwwICsxLDQgQEAKKyMgVGhpcyBtdXN0IG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBhc3NpZ25tZW50CithJyc9YiB0cnVlCitlY2hvICQ/CisjIChidWdsZXQ6ICQ/IHNob3VsZCBiZSAxMjcuIGl0IGlzIGN1cnJlbnRseSAxKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50My5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMmQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDMucmlnaHQKQEAgLTAsMCArMSwyIEBACitEb25lOjAKK2FiYz0xMjMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5MDEyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQzLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorIyBUaGlzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgYXNzaWdubWVudHMKK2E9MSBiXAorPTIgYz0zCitlY2hvIERvbmU6JD8KK2VjaG8gYWJjPSRhJGIkYwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50NC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjODk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDQucmlnaHQKQEAgLTAsMCArMSBAQAorRG9uZTowCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQ0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50NC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZjQ2ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50NC50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMgVGhlcmUgd2FzIGEgYnVnIHdoZXJlIHdlIG1pc2ludGVycHJldGVkIGFzc2lnbm1lbnRzIGFmdGVyICdkbyc6Citmb3IgaSBpbiAxOyBkbyBldmFsIGI9OyBkb25lCitlY2hvIERvbmU6JD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWsxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhNGIxNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWsxLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorQQorT0s6MApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYTZiMDYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazEudGVzdHMKQEAgLTAsMCArMSwyIEBACit3aGlsZSB0cnVlOyBkbyBlY2hvIEE7IGJyZWFrOyBlY2hvIEI7IGRvbmUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWsyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExNWNiOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWsyLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorQQorQUEKK09LOjAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWsyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2RhOWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWsyLnRlc3RzCkBAIC0wLDAgKzEsNiBAQAord2hpbGUgdHJ1ZTsgZG8KKyAgICBlY2hvIEEKKyAgICB3aGlsZSB0cnVlOyBkbyBlY2hvIEFBOyBicmVhayAyOyBlY2hvIEJCOyBkb25lCisgICAgZWNobyBCCitkb25lCitlY2hvIE9LOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWszLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTRiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMy5yaWdodApAQCAtMCwwICsxLDIgQEAKK0EKK09LOjAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWszLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDEzOGRjYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWszLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAordj1icmVhazsgd2hpbGUgdHJ1ZTsgZG8gZWNobyBBOyAkdjsgZWNobyBCOyBicmVhazsgZWNobyBDOyBkb25lCitlY2hvIE9LOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDFjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNC5yaWdodApAQCAtMCwwICsxLDYgQEAKK0EKK0FBCitUUlVFCitBCitBQQorT0s6MApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42N2RhMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazQudGVzdHMKQEAgLTAsMCArMSwxMiBAQAorY29uZD10cnVlCit3aGlsZSAkY29uZDsgZG8KKyAgICBlY2hvIEEKKyAgICBpZiB0ZXN0ICIkY29uZCIgPSB0cnVlOyB0aGVuCisJY29uZD0nZWNobyBUUlVFJworICAgIGVsc2UKKwljb25kPWZhbHNlCisgICAgZmkKKyAgICB3aGlsZSB0cnVlOyBkbyBlY2hvIEFBOyBjb250aW51ZSAyOyBlY2hvIEJCOyBkb25lCisgICAgZWNobyBCCitkb25lCitlY2hvIE9LOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOWRmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNS5yaWdodApAQCAtMCwwICsxLDEzIEBACitBCitCCiswCitBOmEKK0IKK0QKK0E6YgorQgorRAorQTpjCitCCitECiswCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3M2UwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNS50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK3doaWxlIHRydWU7IGRvIGVjaG8gQTsgeyBlY2hvIEI7IGJyZWFrOyBlY2hvIEM7IH07IGVjaG8gRDsgZG9uZQorZWNobyAkPworZm9yIHYgaW4gYSBiIGM7IGRvIGVjaG8gQTokdjsgKGVjaG8gQjsgYnJlYWs7IGVjaG8gQyk7IGVjaG8gRDsgZG9uZQorZWNobyAkPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9idWlsdGluMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnVpbHRpbjEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1NWVjYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnVpbHRpbjEucmlnaHQKQEAgLTAsMCArMSwyIEBACitWQVJJQUJMRT1leHBvcnQKK09LOjAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnVpbHRpbjEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2J1aWx0aW4xLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhMjk0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2J1aWx0aW4xLnRlc3RzCkBAIC0wLDAgKzEsNiBAQAorIyBidWlsdGlucywgdW5saWtlIGtleXdvcmRzIGxpa2UgIndoaWxlIiwgY2FuIGJlIGNvbnN0cnVjdGVkCisjIHdpdGggc3Vic3RpdHV0aW9ucworVkFSSUFCTEU9ZXhwb3J0CiskVkFSSUFCTEUgVkFSSUFCTEUKK2VudiB8IGdyZXAgXlZBUklBQkxFCitlY2hvIE9LOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Nhc2UxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jYXNlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZiMmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jYXNlMS5yaWdodApAQCAtMCwwICsxLDIyIEBACitPS18xCitPS18xCitPS18yMQorT0tfMjIKK09LXzIzCitPS18zMQorT0tfMzIKK09LXzQxCitPS180MgorT0tfNDMKK09LXzQ0CitPS181MQorT0tfNTIKK09LXzUzCitPS19zdWIxCitPS19zdWIyCitPS19zdWIzCitPS19zdWI0CitPS19zdWI1CitPS19zdWI2CitPS19lc2FjMQorRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jYXNlMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY2FzZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDcyYjU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY2FzZTEudGVzdHMKQEAgLTAsMCArMSw0MCBAQAorY2FzZSB3IGluIGEpIGVjaG8gU0tJUDs7IHcpIGVjaG8gT0tfMTs7IHcpIGVjaG8gV1JPTkc7OyBlc2FjCisKK2Nhc2UgdyBpbgorIGEpIGVjaG8gU0tJUDs7CisgdyllY2hvIE9LXzEgOzsKKyB3KQorIGVjaG8gV1JPTkcKKyA7OworZXNhYworCit0PXcKK2Nhc2UgJHQgaW4gYSkgZWNobyBTS0lQOzsgdykgZWNobyBPS18yMTs7IHcpIGVjaG8gV1JPTkc7OyBlc2FjOworY2FzZSAiJHQiIGluIGEpIGVjaG8gU0tJUDs7IHcpIGVjaG8gT0tfMjI7OyB3KSBlY2hvIFdST05HOzsgZXNhYzsKK2Nhc2UgdyBpbiBhKSBlY2hvIFNLSVA7OyAkdCkgZWNobyBPS18yMzs7ICIkdCIpIGVjaG8gV1JPTkc7OyBlc2FjOworCitjYXNlICcnIGluIGEpIGVjaG8gU0tJUDs7IHcpIGVjaG8gV1JPTkc7OyAqKSBlY2hvIE9LXzMxOzsgZXNhYzsKK2Nhc2UgJycgaW4gYSkgZWNobyBTS0lQOzsgJycpIGVjaG8gT0tfMzI7OyAqKSBlY2hvIFdST05HOzsgZXNhYzsKKworY2FzZSBgZWNobyB3YCBpbiBhKSBlY2hvIFNLSVA7OyB3KSBlY2hvIE9LXzQxOzsgdykgZWNobyBXUk9ORzs7IGVzYWM7CitjYXNlICJgZWNobyB3YCIgaW4gYSkgZWNobyBTS0lQOzsgdykgZWNobyBPS180Mjs7IHcpIGVjaG8gV1JPTkc7OyBlc2FjOworY2FzZSBgZWNobyB3IHdgIGluIGEpIGVjaG8gU0tJUDs7IHcpIGVjaG8gV1JPTkc7OyAndyB3JykgZWNobyBPS180Mzs7IGVzYWM7CitjYXNlIGBlY2hvIHcgd2AgaW4gYSkgZWNobyBTS0lQOzsgdykgZWNobyBXUk9ORzs7IHcqKSBlY2hvIE9LXzQ0OzsgZXNhYzsKKworY2FzZSB3IGluIGBlY2hvIHdgKSBlY2hvIE9LXzUxOzsgYGVjaG8gV1JPTkcgPiYyYHcpIGVjaG8gV1JPTkc7OyBlc2FjOworY2FzZSB3IGluIGBlY2hvIE9LXzUyID4mMmApIGVjaG8gU0tJUDs7IGBlY2hvYHcpIGVjaG8gT0tfNTM7OyBlc2FjOworCisjIHBhcnNpbmcgY2FzZXMgaW4gc3Vic2hlbGxzIGNhbiBlYXNpbHkgZ2V0IG1lc3N5CisgY2FzZSBtIGluICBtKSBlY2hvIE9LX3N1YjE7OyBlc2FjCisgY2FzZSBtIGluIChtKSBlY2hvIE9LX3N1YjI7OyBlc2FjCisoY2FzZSBtIGluICBtKSBlY2hvIE9LX3N1YjM7OyBlc2FjKQorKGNhc2UgbSBpbiAobSkgZWNobyBPS19zdWI0OzsgZXNhYykKKygKKyBjYXNlIG0gaW4gIG0pIGVjaG8gT0tfc3ViNTs7IGVzYWMKKykKKygKKyBjYXNlIG0gaW4gKG0pIGVjaG8gT0tfc3ViNjs7IGVzYWMKKykKKyhjYXNlIGVzYWMgaW4gImVzYWMiKSBlY2hvIE9LX2VzYWMxOzsgZXNhYykKKworZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbG9uLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb2xvbi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTg3ZDAyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb2xvbi5yaWdodApAQCAtMCwwICsxLDIgQEAKKzAKK09LOiAwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbG9uLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb2xvbi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjhhYjUzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb2xvbi50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2ZhbHNlCis6CitlY2hvICQ/Cisod2hpbGUgOjsgZG8gZXhpdDsgZG9uZSkKK2VjaG8gT0s6ICQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbXBvdW5kLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb21wb3VuZC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdkNDJmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb21wb3VuZC5yaWdodApAQCAtMCwwICsxLDE0IEBACituZXcgZ3JvdXAKKzAKKzEKKzIKKzMKKzQKKzUKKzYKK25ldyBncm91cAorbmV3IGdyb3VwCiswCisxCisyCiszCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbXBvdW5kLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb21wb3VuZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNWU4NWMzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb21wb3VuZC50ZXN0cwpAQCAtMCwwICsxLDIxIEBACitlY2hvIG5ldyBncm91cAorZWNobyAwOyAgeyA6OyB9CitlY2hvIDE7ICB7IDogO30KK2VjaG8gMjsgKHsgOjsgfSkKK2VjaG8gMzsgKHsgOiA7fSkKK2VjaG8gNDsgICggOiAgKQorZWNobyA1OyAgKCA6OyApCitlY2hvIDY7ICAoIDogOykKKyMgbm90IHN1cmUgaWYgUE9TSVggcmVxdWlyZXMgdGhlc2UsIGJ1dCBiYXNoIGFjY2VwdHMgdGhlbSAuLi4KKyNlY2hvIDc7IHsoIDogICl9CisjZWNobyA4OyB7KCA6OyApfQorI2VjaG8gOTsgeyggOiA7KX0KKworZWNobyBuZXcgZ3JvdXAKKyNlY2hvIDA7ICB7KDopO30KKworZWNobyBuZXcgZ3JvdXAKK2VjaG8gMDsgICg6KQorZWNobyAxOyAgKDo7KQorZWNobyAyOyAgKDopOworZWNobyAzOyAgKDo7KTsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNTU2NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUxLnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAorQTphCitBOmIKK0E6YworT0sxCitBOmEKK0E6YgorQTpjCitPSzIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzJkMzU2NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUxLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAorZm9yIHYgaW4gYSBiIGM7IGRvIGVjaG8gQTokdjsgY29udGludWUgNjY2OyBkb25lCitlY2hvIE9LMQorZm9yIHYgaW4gYSBiIGM7IGRvIGVjaG8gQTokdjsgY29udGludWUgNjY2OyBkb25lCitlY2hvIE9LMgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQzZWJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTIucmlnaHQKQEAgLTAsMCArMSBAQAorT2s6MQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmRmMDcxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTIudGVzdHMKQEAgLTAsMCArMSwzIEBACitlPScnCisod2hpbGUgdGVzdCAkZSAmJiBleGl0IDE7IHRydWU7IGRvIGU9MTsgY29udGludWU7IGRvbmUpCitlY2hvIE9rOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDdkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMy5yaWdodApAQCAtMCwwICsxLDIgQEAKKzAKKzAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFmZjg2NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUzLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyBUZXN0IHRoYXQgImNvbnRpbnVlIiBkb2VzIGFmZmVjdCBleGl0Y29kZSAoc2V0cyB0byAwKQorZT0nJword2hpbGUgZWNobyAkPzsgdGVzdCAkZSAmJiBleGl0OyB0cnVlOyBkbyBlPTE7IGZhbHNlOyBjb250aW51ZTsgZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2FkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IucmlnaHQKQEAgLTAsMCArMSwyIEBACitodXNoOiB3cml0ZSBlcnJvcjogQnJva2VuIHBpcGUKK09rOiAxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGE0MGM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZWNob193cml0ZV9lcnJvci50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK3RyYXAgIiIgUElQRQorCit7CitzbGVlcCAxCitlY2hvIENhbnQgd3JpdGUgdGhpcyAtIGdldCBFUElQRQorZWNobyBPazogJD8gPiYyCit9IHwgeyB0cnVlOyB9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2FyZ3MucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2FyZ3MucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlZDhiOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfYXJncy5yaWdodApAQCAtMCwwICsxLDYgQEAKK051bGwgMHRoIGFyZzoKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEyNworTnVsbCAxc3QgYXJnOgorMAorTnVsbCBhcmcgaW4gZXhlYzoKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfYXJncy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfYXJncy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZmNlNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9hcmdzLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorZWNobyBOdWxsIDB0aCBhcmc6CisiIgorZWNobyAkPworZWNobyBOdWxsIDFzdCBhcmc6CisjIHByaW50ZiB3aXRob3V0IGFyZ3Mgd291bGQgcHJpbnQgdXNhZ2UgaW5mbworcHJpbnRmICIiCitlY2hvICQ/CitlY2hvIE51bGwgYXJnIGluIGV4ZWM6CitleGVjIHByaW50ZiAiIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9mb3IucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2Zvci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTBkMzliCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9mb3IucmlnaHQKQEAgLTAsMCArMSBAQAorT0s6IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9mb3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGNiNTJlOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZmFsc2UKK2ZvciBhIGluOyBkbyBlY2hvICJIRUxMTyI7IGRvbmUKK2VjaG8gT0s6ICQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2ZvcjIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2ZvcjIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjZWU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yMi5yaWdodApAQCAtMCwwICsxLDQgQEAKK1BBUkFNOmFiYworUEFSQU06ZCBlCitQQVJBTToxMjMKK09LOiAwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2ZvcjIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2ZvcjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIxMmVjMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yMi50ZXN0cwpAQCAtMCwwICsxLDYgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICQwIGFiYyAiZCBlIiAxMjMKK2ZpCitmYWxzZQorZm9yIHY7IGRvIGVjaG8gIlBBUkFNOiR2IjsgZG9uZQorZWNobyBPSzogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW52X2FuZF9mdW5jLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbnZfYW5kX2Z1bmMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExNTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW52X2FuZF9mdW5jLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAordmFyPXZhbAordmFyPW9sZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbnZfYW5kX2Z1bmMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Vudl9hbmRfZnVuYy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDRlYWYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbnZfYW5kX2Z1bmMudGVzdHMKQEAgLTAsMCArMSw0IEBACit2YXI9b2xkCitmKCkgeyBlY2hvICJ2YXI9JHZhciI7IH0KK3Zhcj12YWwgZgorZWNobyAidmFyPSR2YXIiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4ZWMucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4ZWMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkZTYwOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhlYy5yaWdodApAQCAtMCwwICsxLDYgQEAKK3Bhc3MgZmQgb3V0IG9wZW4KK3Bhc3MgZmQgb3V0IGR1cAorcGFzcyBmZCBvdXQgY2xvc2UKK3Bhc3MgZmQgaW4gb3BlbgorcGFzcyBmZCBpbiBkdXAKK3Bhc3MgZmQgaW4gY2xvc2UKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhlYy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhlYy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZGU1MGZhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leGVjLnRlc3RzCkBAIC0wLDAgKzEsMzAgQEAKKyMgbWFrZSBzdXJlIHdlIGhhdmUgYSB3YXkgb2YgY2hlY2tpbmcgdGhlc2UgdGhpbmdzCitjZCAvcHJvYy8kJC9mZCB8fCBjZCAvZGV2L2ZkIHx8IGV4aXQgMQorCitbIC1lIDQ0IF0gJiYgZXhpdCAxCitleGVjIDQ0Pi9kZXYvbnVsbAorWyAtZSA0NCBdIHx8IGV4aXQgMQorZWNobyBwYXNzIGZkIG91dCBvcGVuCisKK1sgLWUgNTUgXSAmJiBleGl0IDEKK2V4ZWMgNTU+JjQ0CitbIC1lIDU1IF0gfHwgZXhpdCAxCitlY2hvIHBhc3MgZmQgb3V0IGR1cAorCitleGVjIDQ0PiYtCitbIC1lIDQ0IF0gJiYgZXhpdCAxCitlY2hvIHBhc3MgZmQgb3V0IGNsb3NlCisKK1sgLWUgNjYgXSAmJiBleGl0IDEKK2V4ZWMgNjY8L2Rldi9udWxsCitbIC1lIDY2IF0gfHwgZXhpdCAxCitlY2hvIHBhc3MgZmQgaW4gb3BlbgorCitbIC1lIDc3IF0gJiYgZXhpdCAxCitleGVjIDc3PCY2NgorWyAtZSA3NyBdIHx8IGV4aXQgMQorZWNobyBwYXNzIGZkIGluIGR1cAorCitleGVjIDY2PCYtCitbIC1lIDY2IF0gJiYgZXhpdCAxCitlY2hvIHBhc3MgZmQgaW4gY2xvc2UKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhpdDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4aXQxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmNmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4aXQxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09uY2UKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhpdDEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4aXQxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxZTBkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4aXQxLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAordHJhcCAiZWNobyBOb3Qgc2hvd24iIEVYSVQKKyhleGl0KSAgIyBtdXN0IGJlIHNpbGVudAordHJhcCAiZWNobyBPbmNlOyBleGl0IiBFWElUCit7IGV4aXQ7IH0KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhwb3J0LW4ucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC1uLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTViZjcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC1uLnJpZ2h0CkBAIC0wLDAgKzEsMTAgQEAKK2V4cG9ydCBhYWExPSInJyciCitleHBvcnQgYWFhMj0nJworZXhwb3J0IGFhYTM9IicnJyInYWJjJworZXhwb3J0IGFhYTg9JzgnCithYWE5PTkKK2FhYTEwPTEwCitOb3RoaW5nOgorTm90aGluZzoKK05vdGhpbmc6CitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC1uLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leHBvcnQtbi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MjUyYTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leHBvcnQtbi50ZXN0cwpAQCAtMCwwICsxLDM3IEBACitleHBvcnQgYWFhMT0iJycnIgorZXhwb3J0IGFhYTI9IiIKK2V4cG9ydCBhYWEzPSInJydhYmMiCitleHBvcnQgfCBncmVwIGFhYS49CisKK2V4cG9ydCAtbiBhYWExCit1bnNldCBhYWEyOyBleHBvcnQgLW4gYWFhMj0iZ2hpIgorZXhwb3J0IC1uIGFhYTM9ImtsbSIKK2V4cG9ydCB8IGdyZXAgYWFhLj0KKworZXhwb3J0IGFhYTQ9NCBhYWE1PTUKK2V4cG9ydCAtbiBhYWE0PTRuCitleHBvcnQgLW4gYWFhNQorZXhwb3J0IHwgZ3JlcCBhYWEuPQorCitleHBvcnQgYWFhNT01IGFhYTY9NiBhYWE3PTcgYWFhOD04CitleHBvcnQgLW4gYWFhNSBhYWE2PTZuIGFhYTcKK2V4cG9ydCB8IGdyZXAgYWFhLj0KKworYWFhOT05CitleHBvcnQgLW4gYWFhOQorc2V0IHwgZ3JlcCBeYWFhOT0KKworZXhwb3J0IGFhYTEwPTEwCitleHBvcnQgLW4gYWFhMTAKK3NldCB8IGdyZXAgXmFhYTEwPQorCisKK2V4cG9ydCBFWFBPUlRFRD1xd2UKK2V4cG9ydCAtbm5ubm5uIG5ubm5ubjsgZWNobyAiTm90aGluZzoiOyBlbnYgfCBncmVwIG5ubm5ubgorCitleHBvcnQgLW4gRVhQT1JURUQ9MTIzOyBlY2hvICJOb3RoaW5nOiI7IGVudiB8IGdyZXAgXkVYUE9SVEVECisKK2V4cG9ydCBFWFBPUlRFRD1xd2UKK2V4cG9ydCAtbiBFWFBPUlRFRDsgRVhQT1JURUQ9MTIzOyBlY2hvICJOb3RoaW5nOiI7IGVudiB8IGdyZXAgXkVYUE9SVEVECisKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leHBvcnQucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTNlNTAzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leHBvcnQucmlnaHQKQEAgLTAsMCArMSw2IEBACitleHBvcnQgYWFhMT0iJycnIgorZXhwb3J0IGFhYTI9JycKK2V4cG9ydCBhYWEzPSInJyciJ2FiYycKK2V4cG9ydCBhYWE0PSdkZWYnIicnJyIKK2V4cG9ydCBhYWE1PSInJyciJ2FiYyciJycnIidkZWYnIicnJyIKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhwb3J0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leHBvcnQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdhMjdlYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhwb3J0LnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorZXhwb3J0IGFhYTE9IicnJyIKK2V4cG9ydCBhYWEyPSIiCitleHBvcnQgYWFhMz0iJycnYWJjIgorZXhwb3J0IGFhYTQ9ImRlZicnJyIKK2V4cG9ydCBhYWE1PSInJydhYmMnJydkZWYnJyciCitleHBvcnQgfCBncmVwIGFhYS49CitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZm9yX3dpdGhfYnNsYXNoZXMucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2JzbGFzaGVzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDk2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2JzbGFzaGVzLnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAorYQorYlxjCitiXFxjCitiImMKK2InYworYiRjCitiYHRydWVgYworWmVybzowCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2JzbGFzaGVzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mb3Jfd2l0aF9ic2xhc2hlcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNjNmM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mb3Jfd2l0aF9ic2xhc2hlcy50ZXN0cwpAQCAtMCwwICsxLDEwIEBACisjIFVORklYRUQgQlVHLgorIyBjb21tZW50ZWQtb3V0IHdvcmRzIGNvbnRhaW4gXkMgY2hhcmFjdGVyLgorIyBJdCdzIGEgU1BFQ0lBTF9WQVJfU1lNQk9MLCBmb3Igbm93IGh1c2ggZG9lcyBub3QgZXNjYXBlIGl0LgorIyBXaGVuIGl0IGlzIGZpeGVkLCB1cGRhdGUgdGhpcyB0ZXN0LgorCitmb3IgYSBpbiAnYScgJ2JcYycgJ2JcXGMnICdiImMnICJiJ2MiICdiJGMnICdiYHRydWVgYycgIyMjICdiAyMDYycKK2RvCisgICAgZWNobyAkYQorZG9uZQorZWNobyBaZXJvOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2tleXdvcmRzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mb3Jfd2l0aF9rZXl3b3Jkcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjA0ZTlhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mb3Jfd2l0aF9rZXl3b3Jkcy5yaWdodApAQCAtMCwwICsxLDQgQEAKK2RvCitkb25lCit0aGVuCitPSzogMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mb3Jfd2l0aF9rZXl3b3Jkcy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZm9yX3dpdGhfa2V5d29yZHMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYThiOGU0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZm9yX3dpdGhfa2V5d29yZHMudGVzdHMKQEAgLTAsMCArMSwyIEBACitmb3IgaWYgaW4gZG8gZG9uZSB0aGVuOyBkbyBlY2hvICRpZjsgZG9uZQorZWNobyBPSzogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTY2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMxLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorSGVsbG8KK1plcm86IDAKK09uZTogMSBQYXJhbTE6IFdvcmxkCitaZXJvOiAwIFBhcmFtMTogUmVzdG9yZWQKK011bHRpIGxpbmUgZnVuY3Rpb24KK09uZTogMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmZiMjY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzEudGVzdHMKQEAgLTAsMCArMSwxNiBAQAorZigpIHsgZWNobyBIZWxsbzsgfQorZyAoKSB7IGVjaG8gT25lOiAkIyBQYXJhbTE6ICQxOyB9CitoICggKQoreworICAgIGVjaG8gLW4gJ011bHRpICcgJiYgZWNobyAtbiAnbGluZSAnCisgICAgZWNobyBmdW5jdGlvbgorICAgIGZhbHNlCit9CisKK2YKK2VjaG8gWmVybzogJD8KK3NldCAtLSBSZXN0b3JlZAoreyBnIFdvcmxkOyB9CitlY2hvIFplcm86ICQ/IFBhcmFtMTogJDEKKyggaCApCitlY2hvIE9uZTogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTA0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMyLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAorRmlyc3QgMAorU2Vjb25kIDAKK0ZpcnN0IDEKK1NlY29uZCAxCitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NjMyMDNmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMi50ZXN0cwpAQCAtMCwwICsxLDkgQEAKK2k9MAord2hpbGUgdGVzdCAkaSAhPSAyOyBkbworICAgIGYoKSB7IGVjaG8gRmlyc3QgJGk7IH0KKyAgICBmCisgICAgZigpIHsgZWNobyBTZWNvbmQgJGk7IH0KKyAgICBmCisgICAgOiAkKChpKyspKQorZG9uZQorZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmQ3MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMy5yaWdodApAQCAtMCwwICsxLDQgQEAKK09uZToxCitaZXJvOjAKK09uZToxCitGaXZlOjUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhNmYyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMzLnRlc3RzCkBAIC0wLDAgKzEsOCBAQAorZigpIHsgZmFsc2U7IHJldHVybjsgZWNobyBCQUQ7IH07Cit7IGY7IGVjaG8gT25lOiQ/OyB9OyBlY2hvIFplcm86JD8KKworZigpIHsgZmFsc2U7IHJldHVybjsgfTsKK2Y7IGVjaG8gT25lOiQ/CisKK2YoKSB7IHJldHVybiA1OyB9OworZjsgZWNobyBGaXZlOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM0LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg3ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNC5yaWdodApAQCAtMCwwICsxLDIgQEAKKzI0CitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGMxYjlhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNC50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK2Z1bmMoKSB7CisJZXZhbCAiZWNobyBcIlwke3ZhbF8kezF9fVwiIgorfQorCit2YWxfeD0yNAorKGZ1bmMgeCkKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNzljMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzUucmlnaHQKQEAgLTAsMCArMSwzIEBACisxCisyCiszCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM1LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YzVmOWZhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNS50ZXN0cwpAQCAtMCwwICsxLDkgQEAKK2YoKSB7IGVjaG8gJDE7IH0KK2YgMQorCisjIGh1c2ggZmFpbHMgb24gdGhpcyBzeW50YXgsIGJ1dCBpJ3ZlIG5ldmVyIHNlZW4gYW55b25lIHVzZSBpdCAuLi4KKyNmKCkgKCBlY2hvICQxOyApCitmIDIKKworI2YoKSAoIGVjaG8gJDEgKQorZiAzCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmNfYXJnczEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmNfYXJnczEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmYjk2MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19hcmdzMS5yaWdodApAQCAtMCwwICsxLDUgQEAKK3BhcmFtczogYSBiIGMKKydmIDEgMiAzJyBjYWxsZWQKK3BhcmFtczogYSBiIGMKKydmIDEgMiAzJyBjYWxsZWQKK3BhcmFtczogYSBiIGMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19hcmdzMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19hcmdzMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNTc5MjFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2FyZ3MxLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKKyMgVU5GSVhFRCBCVUcKKworZigpIHsgZWNobyAiJ2YgJDEgJDIgJDMnIGNhbGxlZCI7IH0KKworc2V0IC0tIGEgYiBjCitlY2hvICJwYXJhbXM6ICQxICQyICQzIgorZiAxIDIgMworZWNobyAicGFyYW1zOiAkMSAkMiAkMyIKK3RydWUgfCBmIDEgMiAzCitlY2hvICJwYXJhbXM6ICQxICQyICQzIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19sb2NhbDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyMTc4MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19sb2NhbDEucmlnaHQKQEAgLTAsMCArMSwzIEBACit6PWEKK3o9egorRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19sb2NhbDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQ1OTRlMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19sb2NhbDEudGVzdHMKQEAgLTAsMCArMSw1IEBACitleHBvcnQgej16CitmKCkgeyBsb2NhbCB6PWE7IGVudiB8IGdyZXAgXno7IH0KK2YKK2VudiB8IGdyZXAgXnoKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19sb2NhbDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5MzQzYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19sb2NhbDIucmlnaHQKQEAgLTAsMCArMSwxNCBAQAorMQorMgorMQorMgorMQorMQorMgorMgorMworMgorMgorMworMQorRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19sb2NhbDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE5YWU1NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19sb2NhbDIudGVzdHMKQEAgLTAsMCArMSw3IEBACit4PTEKK2YoKSB7IGVjaG8gJHg7IGxvY2FsIHg9JCgoeCsxKSk7IGVjaG8gJHg7IH0KK2coKSB7IGY7IGVjaG8gJHg7IGY7IGxvY2FsIHg9JCgoeCsxKSk7IGY7IGVjaG8gJHg7IGY7IH0KK2YKK2cKK2VjaG8gJHgKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjNjhmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzEucmlnaHQKQEAgLTAsMCArMSw1IEBACitxd2UKK2FzZAorMTIzCis0NTYKK09rCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZWViNDcyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMS50ZXN0cwpAQCAtMCwwICsxLDkgQEAKK2NhdCA8PDAwMDsgY2F0IDw8d3d3OyBjYXQgPDxlZWUKKzAwMAorcXdlCithc2QKK3d3dworMTIzCis0NTYKK2VlZQorZWNobyBPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxMTBlMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzIucmlnaHQKQEAgLTAsMCArMSw5IEBACitleGl0IEVPRi1mCisiCitlY2hvIDEKK2VjaG8gSGVsbG8gV29ybGQKK21vbwkgCisgRU9GLWYKK0VPRi1mICAgZgorRU9GLWYgCitPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTYxOWJkZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzIudGVzdHMKQEAgLTAsMCArMSwxMiBAQAorZj0xCisgIGNhdCA8PC0gRU9GLWYKKwkJZXhpdCBFT0YtZgorIgorZWNobyAkZgorZWNobyBgZWNobyBIZWxsbyBXb3JsZGAKKwkJbW9vCSAKKyBFT0YtZgorRU9GLWYgICBmCitFT0YtZiAKK0VPRi1mCitlY2hvIE9rCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ1MTdmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMy5yaWdodApAQCAtMCwwICsxLDkgQEAKK2V4aXQgRU9GLWYKKyIKK2VjaG8gJGYKK2VjaG8gYGVjaG8gSGVsbG8gV29ybGRgCittb28JIAorIEVPRi1mCitFT0YtZiAgIGYKK0VPRi1mIAorT2sKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzODU3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MzLnRlc3RzCkBAIC0wLDAgKzEsMTIgQEAKK2Y9MQorICBjYXQgPDwtIEVPRi1mIiIKKwkJZXhpdCBFT0YtZgorIgorZWNobyAkZgorZWNobyBgZWNobyBIZWxsbyBXb3JsZGAKKwkJbW9vCSAKKyBFT0YtZgorRU9GLWYgICBmCitFT0YtZiAKK0VPRi1mCitlY2hvIE9rCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfYmFja3NsYXNoMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvY19iYWNrc2xhc2gxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjExNDgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfYmFja3NsYXNoMS5yaWdodApAQCAtMCwwICsxLDQzIEBACitRdW90ZWQgaGVyZWRvYzoKK2FcCisJYgorYVxcCisJYgorIDEyMzQ1NiAtJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisJLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LQorIDEyMzQ1NiBgZWNobyAgdictJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tJ2AKKyAxMjM0NTYgJChlY2hvIHYnLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LScpCitjXAorCitVbnF1b3RlZCBoZXJlZG9jOgorYQliCithXAorCWIKKyAxMjM0NTYgLXF3ZXJ0eS1cdC1cLVwiLVwnLWAtXC0tXHotXCotXD8tCisJLXF3ZXJ0eS1cdC1cLVwiLVwnLWAtXC0tXHotXCotXD8tCisgMTIzNDU2IHYtJGEtXHQtXC1cIi1ceC1gLVwtLVx6LVwqLVw/LQorIDEyMzQ1NiB2LSRhLVx0LVxcLVwiLVx4LVxgLVwtLVx6LVwqLVw/LQorY0VPRjIKKworUXVvdGVkIC1oZXJlZG9jOgorYVwKK2IKK2FcXAorYgorIDEyMzQ1NiAtJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCistJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisgMTIzNDU2IGBlY2hvICB2Jy0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0nYAorIDEyMzQ1NiAkKGVjaG8gdictJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tJykKK2NcCisKK1VucXVvdGVkIC1oZXJlZG9jOgorYQliCithXAorYgorIDEyMzQ1NiAtcXdlcnR5LVx0LVwtXCItXCctYC1cLS1cei1cKi1cPy0KKy1xd2VydHktXHQtXC1cIi1cJy1gLVwtLVx6LVwqLVw/LQorIDEyMzQ1NiB2LSRhLVx0LVwtXCItXHgtYC1cLS1cei1cKi1cPy0KKyAxMjM0NTYgdi0kYS1cdC1cXC1cIi1ceC1cYC1cLS1cei1cKi1cPy0KK2NFT0Y0CisKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvY19iYWNrc2xhc2gxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jX2JhY2tzbGFzaDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTAxYWY1NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvY19iYWNrc2xhc2gxLnRlc3RzCkBAIC0wLDAgKzEsNzAgQEAKKyMgVGVzdCBmb3IgY29ycmVjdCBoYW5kbGluZyBvZiBiYWNrc2xhc2hlcy4KKyMgTm90ZSB0aGF0IHNvbWUgbGluZXMgaW4gZWFjaCBoZXJlZG9jIHN0YXJ0IHdpdGggYSB0YWIuCisKK2E9cXdlcnR5CisKK2VjaG8gUXVvdGVkIGhlcmVkb2M6CitjYXQgPDwiRU9GMSIKK2FcCisJYgorYVxcCisJYgorIDEyMzQ1NiAtJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisJLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LQorIDEyMzQ1NiBgZWNobyAgdictJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tJ2AKKyAxMjM0NTYgJChlY2hvIHYnLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LScpCitjXAorRU9GMQorZWNobworCitlY2hvIFVucXVvdGVkIGhlcmVkb2M6CitjYXQgPDxFT0YyCithXAorCWIKK2FcXAorCWIKKyAxMjM0NTYgLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LQorCS0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0KKyAxMjM0NTYgYGVjaG8gIHYnLSRhLVx0LVxcLVwiLVx4LVxgLVwtLVx6LVwqLVw/LSdgCisgMTIzNDU2ICQoZWNobyB2Jy0kYS1cdC1cXC1cIi1ceC1cYC1cLS1cei1cKi1cPy0nKQorY1wKK0VPRjIKK0VPRjIKK2VjaG8KKworZWNobyBRdW90ZWQgLWhlcmVkb2M6CitjYXQgPDwtIkVPRjMiCithXAorCWIKK2FcXAorCWIKKyAxMjM0NTYgLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LQorCS0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0KKyAxMjM0NTYgYGVjaG8gIHYnLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LSdgCisgMTIzNDU2ICQoZWNobyB2Jy0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0nKQorY1wKKwlFT0YzCisjIEluIC1oZXJlZG9jIGNhc2UgdGhlIG1hcmtlciBpcyBkZXRlY3RlZCBldmVuIGlmIGl0IGlzIGluZGVudGVkLgorZWNobworCitlY2hvIFVucXVvdGVkIC1oZXJlZG9jOgorY2F0IDw8LUVPRjQKK2FcCisJYgorYVxcCisJYgorIDEyMzQ1NiAtJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisJLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LQorIDEyMzQ1NiBgZWNobyAgdictJGEtXHQtXFwtXCItXHgtXGAtXC0tXHotXCotXD8tJ2AKKyAxMjM0NTYgJChlY2hvIHYnLSRhLVx0LVxcLVwiLVx4LVxgLVwtLVx6LVwqLVw/LScpCitjXAorRU9GNAorCUVPRjQKKyMgVGhlIG1hcmtlciBpcyBub3QgZGV0ZWN0ZWQgaWYgcHJlY2VkaW5nIGxpbmUgZW5kcyBpbiBiYWNrc2xhc2guCisjIFRPRE86IG1hcmtlciBzaG91bGQgYmUgZGV0ZWN0ZWQgZXZlbiBpZiBpdCBpcyBzcGxpdCBieSBsaW5lIGNvbnRpbnVhdGlvbjoKKyMgRU9GXAorIyA0CisjIGJ1dCBjdXJyZW50bHkgaHVzaCBkb2Vzbid0IGRvIGl0LiAoVGFiIGJlZm9yZSAiNCIgaXMgbm90IGFsbG93ZWQsIHRob3VnaC4pCitlY2hvCisKK2VjaG8gIkRvbmU6ICQ/IgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jX2h1Z2UucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfaHVnZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc0MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jX2h1Z2UucmlnaHQKQEAgLTAsMCArMSwzIEBACis1NDZlZDNmNWM4MWM3ODBkM2FiODZhZGExNDgyNDIzNyAgLQorNTQ2ZWQzZjVjODFjNzgwZDNhYjg2YWRhMTQ4MjQyMzcgIC0KK0VuZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jX2h1Z2UudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfaHVnZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmVjMjgxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jX2h1Z2UudGVzdHMKQEAgLTAsMCArMSw5IEBACisjIFRoaXMgY3JlYXRlcyAxMjBrIGhlcmVkb2MKK2VjaG8gJ2NhdCA8PEhFUkUgfCBtZDVzdW0nID4iJDAudG1wIgoreWVzICIxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkiIHwgaGVhZCAtMzAwMCA+PiIkMC50bXAiCitlY2hvICdIRVJFJyA+PiIkMC50bXAiCisKK3llcyAiMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IiB8IGhlYWQgLTMwMDAgfCBtZDVzdW0KKy4gIiQwLnRtcCIKK3JtICIkMC50bXAiCitlY2hvIEVuZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaWZfZmFsc2VfZXhpdGNvZGUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyNGEzNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaWZfZmFsc2VfZXhpdGNvZGUucmlnaHQKQEAgLTAsMCArMSBAQAorT2s6MApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaWZfZmFsc2VfZXhpdGNvZGUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDFiMzZiMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaWZfZmFsc2VfZXhpdGNvZGUudGVzdHMKQEAgLTAsMCArMSwyIEBACitpZiBmYWxzZTsgdGhlbiBlY2hvIEJhZDsgZmkKK2VjaG8gT2s6JD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwNmE4NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUxLnJpZ2h0CkBAIC0wLDAgKzEsNyBAQAorT2sKK09rCitPaworT2sKK09rCitPaworRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11MS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTRhZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTEudGVzdHMKQEAgLTAsMCArMSwxMiBAQAorKGVjaG8gXAorT2spCisoIChlY2hvIFwKK09rKSApCisoICggKGVjaG8gXAorT2spICkgKQorCisoZWNobyBcT2spCisoIChlY2hvIFxPaykgKQorKCAoIChlY2hvIFxPaykgKSApCisKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhiYThiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTIucmlnaHQKQEAgLTAsMCArMSw1IEBACitPaworT2sKK09rCitPaworRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MWVkNWNlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTIudGVzdHMKQEAgLTAsMCArMSw1IEBACitlY2hvIE5vdCBzaG93biB8IGlmIHRydWU7IHRoZW4gZWNobyAkKGVjaG8gT2spOyBmaQorZWNobyBOb3Qgc2hvd24gfCBpZiB0cnVlOyB0aGVuIGVjaG8gYGVjaG8gT2tgOyBmaQorZWNobyBOb3Qgc2hvd24gfCAoIGlmIHRydWU7IHRoZW4gZWNobyAkKGVjaG8gT2spOyBmaSApCitlY2hvIE5vdCBzaG93biB8ICggaWYgdHJ1ZTsgdGhlbiBlY2hvIGBlY2hvIE9rYDsgZmkgKQorZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL29wdHMxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9vcHRzMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE3NTczCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9vcHRzMS5yaWdodApAQCAtMCwwICsxLDIgQEAKK1BhcmFtMTogPi0xMHF3ZXJ0eXVpb3A8CitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL29wdHMxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9vcHRzMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NWEyM2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9vcHRzMS50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICQwIC0xMHF3ZXJ0eXVpb3AKK2ZpCitlY2hvICJQYXJhbTE6ID4kMTwiCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlkLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9waWQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczNTQxYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlkLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKzAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlkLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9waWQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWFlYWE3MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlkLnRlc3RzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgYChlY2hvICQkKWAgPSBgZWNobyAkJGA7IGVjaG8gJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlwZWZhaWwucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3BpcGVmYWlsLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDVkODkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3BpcGVmYWlsLnJpZ2h0CkBAIC0wLDAgKzEsNDAgQEAKK0RlZmF1bHQ6Cit0cnVlIHwgdHJ1ZToKKzAKKzEKK3RydWUgfCBmYWxzZToKKzEKKzAKK2ZhbHNlIHwgdHJ1ZToKKzAKKzEKK2V4aXQgMiB8IGV4aXQgMyB8IGV4aXQgNDoKKzQKKzAKK1BpcGVmYWlsIG9uOgordHJ1ZSB8IHRydWU6CiswCisxCit0cnVlIHwgZmFsc2U6CisxCiswCitmYWxzZSB8IHRydWU6CisxCiswCitleGl0IDIgfCBleGl0IDMgfCBleGl0IDQ6Cis0CiswCitQaXBlZmFpbCBvZmY6Cit0cnVlIHwgdHJ1ZToKKzAKKzEKK3RydWUgfCBmYWxzZToKKzEKKzAKK2ZhbHNlIHwgdHJ1ZToKKzAKKzEKK2V4aXQgMiB8IGV4aXQgMyB8IGV4aXQgNDoKKzQKKzAKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlwZWZhaWwudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3BpcGVmYWlsLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlkZjg0MTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3BpcGVmYWlsLnRlc3RzCkBAIC0wLDAgKzEsNDUgQEAKK2VjaG8gRGVmYXVsdDoKK2VjaG8gInRydWUgfCB0cnVlOiIKKyAgdHJ1ZSB8IHRydWU7IGVjaG8gJD8KKyEgdHJ1ZSB8IHRydWU7IGVjaG8gJD8KK2VjaG8gInRydWUgfCBmYWxzZToiCisgIHRydWUgfCBmYWxzZTsgZWNobyAkPworISB0cnVlIHwgZmFsc2U7IGVjaG8gJD8KK2VjaG8gImZhbHNlIHwgdHJ1ZToiCisgIGZhbHNlIHwgdHJ1ZTsgZWNobyAkPworISBmYWxzZSB8IHRydWU7IGVjaG8gJD8KK2VjaG8gImV4aXQgMiB8IGV4aXQgMyB8IGV4aXQgNDoiCisgIGV4aXQgMiB8IGV4aXQgMyB8IGV4aXQgNDsgZWNobyAkPworISBleGl0IDIgfCBleGl0IDMgfCBleGl0IDQ7IGVjaG8gJD8KKworZWNobyBQaXBlZmFpbCBvbjoKK3NldCAtbyBwaXBlZmFpbAorZWNobyAidHJ1ZSB8IHRydWU6IgorICB0cnVlIHwgdHJ1ZTsgZWNobyAkPworISB0cnVlIHwgdHJ1ZTsgZWNobyAkPworZWNobyAidHJ1ZSB8IGZhbHNlOiIKKyAgdHJ1ZSB8IGZhbHNlOyBlY2hvICQ/CishIHRydWUgfCBmYWxzZTsgZWNobyAkPworZWNobyAiZmFsc2UgfCB0cnVlOiIKKyAgZmFsc2UgfCB0cnVlOyBlY2hvICQ/CishIGZhbHNlIHwgdHJ1ZTsgZWNobyAkPworZWNobyAiZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OiIKKyAgZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OyBlY2hvICQ/CishIGV4aXQgMiB8IGV4aXQgMyB8IGV4aXQgNDsgZWNobyAkPworCitlY2hvIFBpcGVmYWlsIG9mZjoKK3NldCArbyBwaXBlZmFpbAorZWNobyAidHJ1ZSB8IHRydWU6IgorICB0cnVlIHwgdHJ1ZTsgZWNobyAkPworISB0cnVlIHwgdHJ1ZTsgZWNobyAkPworZWNobyAidHJ1ZSB8IGZhbHNlOiIKKyAgdHJ1ZSB8IGZhbHNlOyBlY2hvICQ/CishIHRydWUgfCBmYWxzZTsgZWNobyAkPworZWNobyAiZmFsc2UgfCB0cnVlOiIKKyAgZmFsc2UgfCB0cnVlOyBlY2hvICQ/CishIGZhbHNlIHwgdHJ1ZTsgZWNobyAkPworZWNobyAiZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OiIKKyAgZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OyBlY2hvICQ/CishIGV4aXQgMiB8IGV4aXQgMyB8IGV4aXQgNDsgZWNobyAkPworCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVhZC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVhZC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTUwZTJhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWFkLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorcmVhZAorY2F0CitlY2hvICJSRVBMWT0kUkVQTFkiCitSRVBMWT1leGVjIDxyZWFkLnRlc3RzCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlYWQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlYWQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmYxYWNiZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVhZC50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK2V4ZWMgPHJlYWQudGVzdHMKK3JlYWQKK2NhdAorZWNobyAiUkVQTFk9JFJFUExZIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTUxNWQxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjEucmlnaHQKQEAgLTAsMCArMSwxMiBAQAorVGVzdCAwOiAgdmFyOm9rCitGaWxlIGNyZWF0ZWQ6b2sKK1Rlc3QgMTogIHZhcjpvaworRmlsZSBjcmVhdGVkOm9rCitUZXN0IDI6ICB2YXI6b2sKK0ZpbGUgY3JlYXRlZDpvaworVGVzdCAzOiAgdmFyOm9rCitGaWxlIGNyZWF0ZWQ6b2sKK1Rlc3QgNDogIHZhcjpvaworRmlsZSBjcmVhdGVkOm9rCitUZXN0IDU6ICB2YXI6b2sKK0ZpbGUgY3JlYXRlZDpvawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjJmYmZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjEudGVzdHMKQEAgLTAsMCArMSw0MCBAQAorcm0gc2hlbGxfdGVzdF8kJCAyPi9kZXYvbnVsbAordmFyPWJhZAorPnNoZWxsX3Rlc3RfJCQgdmFyPW9rCitlY2hvICJUZXN0IDA6ICB2YXI6JHZhciIKK3Rlc3QgLWYgc2hlbGxfdGVzdF8kJCAmJiBlY2hvICJGaWxlIGNyZWF0ZWQ6b2siCisKK3JtIHNoZWxsX3Rlc3RfJCQgMj4vZGV2L251bGwKK3Zhcj1iYWQKK3Zhcj1vayA+c2hlbGxfdGVzdF8kJAorZWNobyAiVGVzdCAxOiAgdmFyOiR2YXIiCit0ZXN0IC1mIHNoZWxsX3Rlc3RfJCQgJiYgZWNobyAiRmlsZSBjcmVhdGVkOm9rIgorCitybSBzaGVsbF90ZXN0XyQkIDI+L2Rldi9udWxsCit2YXI9b2sKK3RydWUgfCB2YXI9YmFkID5zaGVsbF90ZXN0XyQkCitlY2hvICJUZXN0IDI6ICB2YXI6JHZhciIKK3Rlc3QgLWYgc2hlbGxfdGVzdF8kJCAmJiBlY2hvICJGaWxlIGNyZWF0ZWQ6b2siCisKK3JtIHNoZWxsX3Rlc3RfJCQgMj4vZGV2L251bGwKK3Zhcj1iYWQKK3sgdmFyPW9rID5zaGVsbF90ZXN0XyQkOyB9CitlY2hvICJUZXN0IDM6ICB2YXI6JHZhciIKK3Rlc3QgLWYgc2hlbGxfdGVzdF8kJCAmJiBlY2hvICJGaWxlIGNyZWF0ZWQ6b2siCisKK3JtIHNoZWxsX3Rlc3RfJCQgMj4vZGV2L251bGwKK3Zhcj1vaworeyB2YXI9YmFkID5zaGVsbF90ZXN0XyQkOyB9ICYKKyMgY2FudCB1c2UgdXNsZWVwIGFzIGl0IGlzbnQgc3RhbmRhcmQgaW4gJFBBVEggLS0KKyMgd2UgZmFpbCB3aGVuIHRlc3RpbmcgYnVzeWJveCBjb21waWxlZCBzb2xlbHkgYXMgImh1c2giCit3YWl0CitlY2hvICJUZXN0IDQ6ICB2YXI6JHZhciIKK3Rlc3QgLWYgc2hlbGxfdGVzdF8kJCAmJiBlY2hvICJGaWxlIGNyZWF0ZWQ6b2siCisKK3JtIHNoZWxsX3Rlc3RfJCQgMj4vZGV2L251bGwKK3Zhcj1vaworKCB2YXI9YmFkID5zaGVsbF90ZXN0XyQkICkKK2VjaG8gIlRlc3QgNTogIHZhcjokdmFyIgordGVzdCAtZiBzaGVsbF90ZXN0XyQkICYmIGVjaG8gIkZpbGUgY3JlYXRlZDpvayIKKworcm0gc2hlbGxfdGVzdF8kJCAyPi9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzI2ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjIucmlnaHQKQEAgLTAsMCArMSBAQAorT2sKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODE5ODNjYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIyLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyBOT1QgU0hPV04gXDI+L2Rldi9udWxsCitlY2hvIE9rCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjBiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMy5yaWdodApAQCAtMCwwICsxLDE0IEBACitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CitPbmU6MQoraHVzaDogY2FuJ3Qgb3BlbiAnL2NhbnQvYmUvY3JlYXRlZCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK09uZToxCitPaworaHVzaDogY2FuJ3Qgb3BlbiAnL2NhbnQvYmUvY3JlYXRlZCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK1plcm86MAoraHVzaDogY2FuJ3Qgb3BlbiAnL2NhbnQvYmUvY3JlYXRlZCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK09uZToxCitodXNoOiBjYW4ndCBvcGVuICcvY2FudC9iZS9jcmVhdGVkJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorT25lOjEKK2h1c2g6IGNhbid0IG9wZW4gJy9jYW50L2JlL2NyZWF0ZWQnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CitaZXJvOjAKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MyOGU0MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIzLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorZWNobyBFcnJvciA+L2RvZXMvbm90L2V4aXN0OyBlY2hvIE9uZTokPwordD1CQUQKK3Q9T2sgPj4vY2FudC9iZS9jcmVhdGVkOyBlY2hvIE9uZTokPworZWNobyAkdAorISA+L2NhbnQvYmUvY3JlYXRlZDsgZWNobyBaZXJvOiQ/CitleGVjID4vY2FudC9iZS9jcmVhdGVkOyBlY2hvIE9uZTokPworZXhlYyAvYmluL3RydWUgPi9jYW50L2JlL2NyZWF0ZWQ7IGVjaG8gT25lOiQ/CishIGV4ZWMgL2Jpbi90cnVlID4vY2FudC9iZS9jcmVhdGVkOyBlY2hvIFplcm86JD8KK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjQucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQyNWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjQucmlnaHQKQEAgLTAsMCArMSwxOCBAQAorc2hlbGxfdGVzdAorXHNoZWxsX3Rlc3QKK1xzaGVsbF90ZXN0Citcc2hlbGxfdGVzdAorSGVyZTEKK09rMQorSGVyZTIKK09rMgorSGVyZTMKK09rMworSGVyZTQKK09rNAorTm93IHdpdGggdmFyaWFibGUgcmVmcworc2hlbGxfdGVzdF8xCitcc2hlbGxfdGVzdF8xCitcc2hlbGxfdGVzdF8xCitcc2hlbGxfdGVzdF8xCitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM1MGI4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNC50ZXN0cwpAQCAtMCwwICsxLDg1IEBACitybSAqc2hlbGxfdGVzdCogMj4vZGV2L251bGwKKworPlxzaGVsbF90ZXN0CitlY2hvICpzaGVsbF90ZXN0Kgorcm0gKnNoZWxsX3Rlc3QqCisKKz5cXHNoZWxsX3Rlc3QKK2VjaG8gKnNoZWxsX3Rlc3QqCitybSAqc2hlbGxfdGVzdCoKKworPiJcc2hlbGxfdGVzdCIKK2VjaG8gKnNoZWxsX3Rlc3QqCitybSAqc2hlbGxfdGVzdCoKKworPiJcXHNoZWxsX3Rlc3QiCitlY2hvICpzaGVsbF90ZXN0Kgorcm0gKnNoZWxsX3Rlc3QqCisKKworY2F0IDw8XHNoZWxsX3Rlc3QKK0hlcmUxCitzaGVsbF90ZXN0CitlY2hvIE9rMQorCitjYXQgPDxcXHNoZWxsX3Rlc3QKK0hlcmUyCitcc2hlbGxfdGVzdAorZWNobyBPazIKKworY2F0IDw8IlxzaGVsbF90ZXN0IgorSGVyZTMKK1xzaGVsbF90ZXN0CitlY2hvIE9rMworCitjYXQgPDwiXFxzaGVsbF90ZXN0IgorSGVyZTQKK1xzaGVsbF90ZXN0CitlY2hvIE9rNAorCisKK2VjaG8gTm93IHdpdGggdmFyaWFibGUgcmVmcworaT0xCisKKworPlxzaGVsbF90ZXN0XyRpCitlY2hvICpzaGVsbF90ZXN0Kgorcm0gKnNoZWxsX3Rlc3QqCisKKz5cXHNoZWxsX3Rlc3RfJGkKK2VjaG8gKnNoZWxsX3Rlc3QqCitybSAqc2hlbGxfdGVzdCoKKworPiJcc2hlbGxfdGVzdF8kaSIKK2VjaG8gKnNoZWxsX3Rlc3QqCitybSAqc2hlbGxfdGVzdCoKKworPiJcXHNoZWxsX3Rlc3RfJGkiCitlY2hvICpzaGVsbF90ZXN0Kgorcm0gKnNoZWxsX3Rlc3QqCisKK2VjaG8gRG9uZTtleGl0CisjIFVORklYRUQgQlVHLiBiYXNoIGFwcGFyZW50bHkgd2lsbCBleHBhbmQgJGkgZXZlbiBpbiB0ZXJtaW5hdGluZyBkZWxpbWl0ZXIuCisjIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMveGN1X2NoYXAwMi5odG1sCisjIGRvZXMgbm90IG1hbmRhdGUgdGhpcyBiZWhhdmlvci4KKyMgVGhpcyBpcyBub3QgbGlrZWx5IHRvIGJlIHVzZWQgbXVjaCBpbiByZWFsLXdvcmxkLgorCitjYXQgPDxcc2hlbGxfdGVzdF8kaQorSGVyZTEKK3NoZWxsX3Rlc3RfJGkKK2VjaG8gT2sxCisKK2NhdCA8PFxcc2hlbGxfdGVzdF8kaQorSGVyZTIKK1xzaGVsbF90ZXN0XyRpCitlY2hvIE9rMgorCitjYXQgPDwiXHNoZWxsX3Rlc3RfJGkiCitIZXJlMworXHNoZWxsX3Rlc3RfJGkKK2VjaG8gT2szCisKK2NhdCA8PCJcXHNoZWxsX3Rlc3RfJGkiCitIZXJlNAorXHNoZWxsX3Rlc3RfJGkKK2VjaG8gT2s0CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyY2NlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNS5yaWdodApAQCAtMCwwICsxLDQgQEAKK0JhY2tncm91bmRlZCBwaXBlcyBzaGFsbCBoYXZlIHRoZWlyIHN0ZGluIHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsCitaZXJvOjAKK1plcm86MAorRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjUudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTdmOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjUudGVzdHMKQEAgLTAsMCArMSwxMyBAQAorZWNobyAiQmFja2dyb3VuZGVkIHBpcGVzIHNoYWxsIGhhdmUgdGhlaXIgc3RkaW4gcmVkaXJlY3RlZCB0byAvZGV2L251bGwiCisKKyMgMS4gYmFzaCBkb2VzIG5vdCByZWRpcmVjdCBzdGRpbiB0byAvZGV2L251bGwgaWYgaXQgaXMgaW50ZXJhY3RpdmUuCisjIGh1c2ggZG9lcyBpdCBhbHdheXMgKHRoaXMgaXMgYWxsb3dlZCBieSBzdGFuZGFyZHMpLgorCisjIDIuIEZhaWx1cmUgd2lsbCByZXN1bHQgaW4gdGhpcyBzY3JpcHQgaGFuZ2luZworCitjYXQgJiB3YWl0OyBlY2hvIFplcm86JD8KKworIyBUaGlzIGRvZXMgbm90IHdvcmsgZm9yIGJhc2ghIGJhc2ggYnVnPworY2F0IHwgY2F0ICYgd2FpdDsgZWNobyBaZXJvOiQ/CisKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjYucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTdjNGJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjYucmlnaHQKQEAgLTAsMCArMSw0IEBACitUZXN0aW5nIG11bHRpcGxlIHJlZGlyZWN0aW9ucyB0byBzYW1lIGZkCitIZWxsbworRG9uZTEKK0RvbmUyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI2LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2MzllYmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNi50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2VjaG8gIlRlc3RpbmcgbXVsdGlwbGUgcmVkaXJlY3Rpb25zIHRvIHNhbWUgZmQiCisjIGJ1ZyB3YXMgbWFraW5nIHVzIGxvc2UgZmQgIzEgYWZ0ZXIgdGhpczoKK2VjaG8gSGVsbG8gPi9kZXYvbnVsbCAxPiYyCitlY2hvIERvbmUxCitlY2hvIERvbmUyID4mMgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZXR1cm4xLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZXR1cm4xLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMjRhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JldHVybjEucmlnaHQKQEAgLTAsMCArMSBAQAorT2s6MApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZXR1cm4xLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZXR1cm4xLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlYjkyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JldHVybjEudGVzdHMKQEAgLTAsMCArMSw0IEBACitlY2hvICJ0cnVlICYmIHJldHVybjsgZWNobyBTaG91bGQgbm90IGJlIHByaW50ZWQiID5yZXR1cm5fc291cmNlZAorLiAuL3JldHVybl9zb3VyY2VkCitybSByZXR1cm5fc291cmNlZAorZWNobyBPazokPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaGlmdC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2hpZnQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4MWUzNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2hpZnQucmlnaHQKQEAgLTAsMCArMSw2IEBACisuL3NoaWZ0LnRlc3RzIGFiYyBkIGUKKy4vc2hpZnQudGVzdHMgZCBlIDEyMworLi9zaGlmdC50ZXN0cyBkIGUgMTIzCisuL3NoaWZ0LnRlc3RzCisuL3NoaWZ0LnRlc3RzCisuL3NoaWZ0LnRlc3RzCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NoaWZ0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaGlmdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41M2VmMjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaGlmdC50ZXN0cwpAQCAtMCwwICsxLDE0IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAkMCBhYmMgImQgZSIgMTIzCitmaQorZWNobyAkMCAkMSAkMgorc2hpZnQKK2VjaG8gJDAgJDEgJDIKK3NoaWZ0IDk5OQorZWNobyAkMCAkMSAkMgorc2hpZnQgMgorZWNobyAkMCAkMSAkMgorc2hpZnQgMgorZWNobyAkMCAkMSAkMgorc2hpZnQKK2VjaG8gJDAgJDEgJDIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnX2V4aXRjb2RlLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaWdfZXhpdGNvZGUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmMDAwYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnX2V4aXRjb2RlLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAorS0lMTAorMTM3OjEzNworS0lMTAorMDowCitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NpZ19leGl0Y29kZS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnX2V4aXRjb2RlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4NzlkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NpZ19leGl0Y29kZS50ZXN0cwpAQCAtMCwwICsxLDkgQEAKK2V4ZWMgMj4mMQorCiskVEhJU19TSCAtYyAna2lsbCAtOSAkJCcKK2VjaG8gMTM3OiQ/CisKKyEgJFRISVNfU0ggLWMgJ2tpbGwgLTkgJCQnCitlY2hvIDA6JD8KKworZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NpZ2ludDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NpZ2ludDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwOTRiMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnaW50MS5yaWdodApAQCAtMCwwICsxIEBACitTZW5kaW5nIFNJR0lOVCB0byBtYWluIHNoZWxsIFBJRApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaWdpbnQxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaWdpbnQxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkNDgzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NpZ2ludDEudGVzdHMKQEAgLTAsMCArMSw0MSBAQAorIyBXaGF0IHNob3VsZCBoYXBwZW4gaWYgbm9uLWludGVyYWN0aXZlIHNoZWxsIGdldHMgU0lHSU5UPworCisoc2xlZXAgMTsgZWNobyBTZW5kaW5nIFNJR0lOVCB0byBtYWluIHNoZWxsIFBJRDsgZXhlYyBraWxsIC1JTlQgJCQpICYKKworIyBXZSBjcmVhdGUgYSBjaGlsZCB3aGljaCBleGl0cyB3aXRoIDAgZXZlbiBvbiBTSUdJTlQKKyMgKFRoZSBjb21wbGV4IGNvbW1hbmQgaXMgbmVjZXNzYXJ5IG9ubHkgaWYgU0lHSU5UIGlzIGdlbmVyYXRlZCBieSBeQywKKyMgaW4gdGhpcyB0ZXN0Y2FzZSBldmVuIGJhcmUgInNsZWVwIDIiIHdvdWxkIGRvIGJlY2F1c2UKKyMgaW4gdGhlIHRlc3RjYXNlIHdlIGRvbid0IHNlbmQgU0lHSU5UICp0byB0aGUgY2hpbGQqLi4uKQorJFRISVNfU0ggLWMgJ3RyYXAgImV4aXQgMCIgU0lHSU5UOyBzbGVlcCAyJworCisjIEluIG9uZSBzZWNvbmQsIHdlIChtYWluIHNoZWxsKSBnZXQgU0lHSU5UIGhlcmUuCisjIFRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIHdlIHNob3VsZCwgb3Igc2hvdWxkIG5vdCwgZXhpdC4KKworIyBiYXNoIHdpbGwgbm90IHN0b3AgaGVyZS4gSXQgd2lsbCBleGVjdXRlIG5leHQgY29tbWFuZChzKS4KKworIyBUaGUgcmF0aW9uYWxlIGZvciB0aGlzIGlzIGRlc2NyaWJlZCBoZXJlOgorIyBodHRwOi8vd3d3LmNvbnMub3JnL2NyYWNhdWVyL3NpZ2ludC5odG1sCisjCisjIEJhc2ljYWxseSwgYmFzaCB3aWxsIG5vdCBleGl0IG9uIFNJR0lOVCBpbW1lZGlhdGVseSBpZiBpdCB3YWl0cworIyBmb3IgYSBjaGlsZC4gSXQgd2lsbCB3YWl0IGZvciB0aGUgY2hpbGQgdG8gZXhpdC4KKyMgSWYgY2hpbGQgZXhpdHMgTk9UIGJ5IGR5aW5nIG9uIFNJR0lOVCwgdGhlbiBiYXNoIHdpbGwgbm90IGV4aXQuCisjCisjIFRoZSBpZGVhIGlzIHRoYXQgdGhlIGZvbGxvd2luZyBzY3JpcHQ6CisjIHwgZW1hY3MgZmlsZS50eHQKKyMgfCBtb3JlIGNtZHMKKyMgVXNlciBtYXkgdXNlIF5DIHRvIGludGVycnVwdCBlZGl0b3IncyBvcHMgbGlrZSBzZWFyY2guIEJ1dCB0aGVuCisjIGVtYWNzIGV4aXRzIG5vcm1hbGx5LiBVc2VyIGV4cGVjdHMgdGhhdCBzY3JpcHQgZG9lc24ndCBzdG9wLgorIworIyBUaGlzIGlzIGEgbmljZSBpZGVhLCBidXQgZGV0ZWN0aW5nICJkaWQgcHJvY2VzcyByZWFsbHkgZXhpdAorIyB3aXRoIFNJR0lOVD8iIGlzIHJhY3kuIENvbnNpZGVyOgorIyB8IGJhc2ggLWMgJ3doaWxlIHRydWU7IGRvIC9iaW4vdHJ1ZTsgZG9uZScKKyMgV2hlbiBeQyBpcyBwcmVzc2VkIHdoaWxlIGJhc2ggd2FpdHMgZm9yIC9iaW4vdHJ1ZSB0byBleGl0LAorIyBpdCBtYXkgaGFwcGVuIHRoYXQgL2Jpbi90cnVlIGV4aXRzIHdpdGggZXhpdGNvZGUgMCBiZWZvcmUKKyMgXkMgaXMgZGVsaXZlcmVkIHRvIGl0IGFzIFNJR0lOVC4gYmFzaCB3aWxsIHNlZSBTSUdJTlQsIHRoZW4KKyMgaXQgd2lsbCBzZWUgdGhhdCBjaGlsZCBleGl0ZWQgd2l0aCAwLCBhbmQgYmFzaCB3aWxsIE5PVCBFWElULgorCisjIFRoZXJlZm9yZSB3ZSBkbyBub3QgaW1wbGVtZW50IGJhc2ggYmVoYXZpb3IuCisjIEknZCBzYXkgdGhhdCBlbWFjcyBuZWVkIHRvIHB1dCBpdHNlbGYgaW50byBhIHNlcGFyYXRlIHBncnAKKyMgdG8gaXNvbGF0ZSBzaGVsbCBmcm9tIGdldHRpbmcgc3RyYXkgU0lHSU5UcyBmcm9tIF5DLgorCitlY2hvIE5leHQgY29tbWFuZCBhZnRlciBTSUdJTlQgd2FzIGV4ZWN1dGVkCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NvdXJjZTEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NvdXJjZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyNTYwMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMS5yaWdodApAQCAtMCwwICsxLDUgQEAKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK2xpbmUyCitPazE6MAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJworT2syOjEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTM4ODgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zb3VyY2UxLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKK2VjaG8gJ2VjaG8gJHtefQorZWNobyBsaW5lMicgPnNvdXJjZWQxCisuIC4vc291cmNlZDEKK2VjaG8gT2sxOiQ/CisKK2VjaG8gImVjaG8gJyIgPnNvdXJjZWQxCisuIC4vc291cmNlZDEKK2VjaG8gT2syOiQ/CisKK3JtIHNvdXJjZWQxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwZTc5NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vyci5yaWdodApAQCAtMCwwICsxLDQgQEAKK3Nob3duCitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAnCit0ZXN0Citub3Qgc2hvd24KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vyci50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vyci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTBlZDQyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZWNobyBzaG93bgorZWNobyB0ZXN0IGBlY2hvICdhYWAKK2VjaG8gbm90IHNob3duCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnJfbmVnYXRlLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyX25lZ2F0ZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzcwMTA2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyX25lZ2F0ZS5yaWdodApAQCAtMCwwICsxLDIgQEAKK2Jhc2ggMy4yIGZhaWxzIHRoaXMKK2h1c2g6IHN5bnRheCBlcnJvcjogISAhIGNvbW1hbmQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vycl9uZWdhdGUudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnJfbmVnYXRlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2MWIxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnJfbmVnYXRlLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyBiYXNoIDMuMiBmYWlscyB0aGlzCishICEgdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy91bnRpbDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3VudGlsMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTJkYWFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy91bnRpbDEucmlnaHQKQEAgLTAsMCArMSwzIEBACisxCisxCitPazowCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3VudGlsMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW50aWwxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwYWIyODMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3VudGlsMS50ZXN0cwpAQCAtMCwwICsxLDExIEBACit4PTEKK3VudGlsIHRlc3QgIiR4IiA9IDQ7IGRvIGVjaG8gJHg7IHg9NDsgZG9uZQorCisjIFdlIGhhZCBhIGJ1ZyBpbiBtdWx0aS1saW5lIGZvcm0KK3g9MQordW50aWwgdGVzdCAiJHgiID0gNDsgZG8KKyAgICAgICAgZWNobyAkeAorICAgICAgICB4PTQKK2RvbmUKKworZWNobyBPazokPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRkN2JlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTEucmlnaHQKQEAgLTAsMCArMSBAQAorT0s6MApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMWUyMDFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTEudGVzdHMKQEAgLTAsMCArMSwyIEBACit3aGlsZSBmYWxzZTsgZG8gZWNobyBOT1QgU0hPV047IGRvbmUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyMDdjYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorSGVsbG8KK09LOjAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjI0N2FkYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUyLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAord2hpbGUgZWNobyBIZWxsbzsgZmFsc2U7IGRvIGVjaG8gTk9UIFNIT1dOOyBkb25lCitlY2hvIE9LOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGQ3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMy5yaWdodApAQCAtMCwwICsxIEBACitPSzowCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxMzJiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMy50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK3doaWxlIGZhbHNlOyBkbworICAgICMgYmFzaCB3aWxsIHJlcXVpcmUgYXQgbGVhc3QgIjoiIGhlcmUuLi4KK2RvbmUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGVfaW5fc3Vic2hlbGwucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlX2luX3N1YnNoZWxsLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGQzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlX2luX3N1YnNoZWxsLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LOiAwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlX2luX3N1YnNoZWxsLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZV9pbl9zdWJzaGVsbC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZWY4ZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZV9pbl9zdWJzaGVsbC50ZXN0cwpAQCAtMCwwICsxLDIgQEAKKyh3aGlsZSB0cnVlOyBkbyBleGl0OyBkb25lKQorZWNobyBPSzogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYXJndjAucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2FyZ3YwLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmJhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2FyZ3YwLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2FyZ3YwLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9hcmd2MC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNWM0MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9hcmd2MC50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgYXJnCitmaQorZWNobyBPSwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjE5ZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTEucmlnaHQKQEAgLTAsMCArMSw3IEBACit7YWJjfQoreworfQoraHVzaDogY2FuJ3QgZXhlY3V0ZSAne2NtZCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJ3snOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CitodXNoOiBjYW4ndCBleGVjdXRlICd7JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorRG9uZTogMTI3CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiNDU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMS50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK2VjaG8ge2FiY30KK2VjaG8geworZWNobyB9Cit7Y21kCisiInsKK3siIgorZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E5NjY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTIucmlnaHQKQEAgLTAsMCArMSwzIEBACit7cSx3fQore3Esd30KK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWY3NWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UyLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAordj0ne3Esd30nCisjIFNob3VsZCBub3QgYnJhY2UtZXhwYW5kIHYgdmFsdWUKK2VjaG8gJHYKK2VjaG8gIiR2IgorZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2NvbW1lbnQxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9jb21tZW50MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTAyYjFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9jb21tZW50MS5yaWdodApAQCAtMCwwICsxLDIgQEAKK05vdGhpbmc6CitTdHJpbmc6ICNzaG91bGQtYmUtZWNob2VkCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2NvbW1lbnQxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9jb21tZW50MS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMjY4ODYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9jb21tZW50MS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2VjaG8gTm90aGluZzogI3Nob3VsZC1ub3QtYmUtZWNob2VkCitlY2hvIFN0cmluZzogIiIjc2hvdWxkLWJlLWVjaG9lZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lb2wxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lb2wxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzg5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VvbDEucmlnaHQKQEAgLTAsMCArMSBAQAorRG9uZTowCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VvbDEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VvbDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjFiNTVlOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZW9sMS50ZXN0cwpAQCAtMCwwICsxLDE4IEBACisjIGJ1ZyB3YXMgdGhhdCB3ZSB0cmVhdGVkIDxuZXdsaW5lPiBhcyAnOycgaW4gdGhpcyBsaW5lOgordHJ1ZSB8fCBlY2hvIGZvbyB8CitlY2hvIEJBRDEgfCBjYXQKKworIyB2YXJpYXRpb24gb24gdGhlIHNhbWUgdGhlbWUKK3RydWUgfHwgZWNobyBmb28gfAorIyBjb21tZW50CitlY2hvIEJBRDIgfCBjYXQKKworIyB2YXJpYXRpb24gb24gdGhlIHNhbWUgdGhlbWUKK3RydWUgfHwgZWNobyBmb28gfAorCitlY2hvIEJBRDMgfCBjYXQKKworIyB0aGlzIHNob3VsZCBlcnJvciBvdXQsIGJ1dCBjdXJyZW50bHkgd29ya3MgaW4gaHVzaDoKKyN0cnVlIHx8IGVjaG8gZm9vIHw7CisKK2VjaG8gRG9uZTokPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OTliODcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTEucmlnaHQKQEAgLTAsMCArMSw0IEBACitcCithXGIKK1xcCitjXFxkCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjVhYzk2YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMS50ZXN0cwpAQCAtMCwwICsxLDYgQEAKK3Rlc3QgIiRDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPIiA9ICJ5IiB8fCBleGl0IDc3CisKK2VjaG8gIlxcIgorZWNobyBhIlxcImIKK2VjaG8gJ1xcJworZWNobyBjJ1xcJ2QKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTVmZDRhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUyLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorKj9bYV0qCithKj9bYV0qYgorKj9bYV0qCitjKj9bYV0qZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlNzE4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTIudGVzdHMKQEAgLTAsMCArMSw0IEBACitlY2hvICIqP1thXSoiCitlY2hvIGEiKj9bYV0qImIKK2VjaG8gJyo/W2FdKicKK2VjaG8gYycqP1thXSonZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDJhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTMucmlnaHQKQEAgLTAsMCArMSwyMyBAQAordjogYSBcIGIgXFwgYyBcXFwgZCBcXFxcIGUKK3Y6IGEgXCBiIFxcIGMgXFxcIGQgXFxcXCBlCitVbnF1b3RlZDoKKy5hLgorLlwuCisuYi4KKy5cXC4KKy5jLgorLlxcXC4KKy5kLgorLlxcXFwuCisuZS4KK1F1b3RlZDoKKy5hLgorLlwuCisuYi4KKy5cXC4KKy5jLgorLlxcXC4KKy5kLgorLlxcXFwuCisuZS4KK2RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODcwNWJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUzLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKK3Rlc3QgIiRDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPIiA9ICJ5IiB8fCBleGl0IDc3CisKK3Y9J2EgXCBiIFxcIGMgXFxcIGQgXFxcXCBlJworZWNobyB2OiAkdgorZWNobyB2OiAiJHYiCitlY2hvIFVucXVvdGVkOgorZm9yIGEgaW4gJHY7IGRvIGVjaG8gLiRhLjsgZG9uZQorZWNobyBRdW90ZWQ6Citmb3IgYSBpbiAkdjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKK2VjaG8gZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU0LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTNlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTQucmlnaHQKQEAgLTAsMCArMSwyIEBACitPaworRW5kCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGY4YmYwYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNC50ZXN0cwpAQCAtMCwwICsxLDYgQEAKK2lcCitmIHRyXAordWU7IHRoXAorZW4gZWNobyAiT1wKK2siOyBmaTsgZWNobyAiXAorRW5kIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RkMzkzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU1LnJpZ2h0CkBAIC0wLDAgKzEsOSBAQAorYVxuYlxuY1xuCithCitiCitjCithXG5iXG5jXG4KK2EKK2IKK2MKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzdhOThlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU1LnRlc3RzCkBAIC0wLDAgKzEsNyBAQAordj0iYVxuYlxuY1xuIgorZWNobyAiJHYiCitwcmludGYgIiR2Igordj0nYVxuYlxuY1xuJworZWNobyAiJHYiCitwcmludGYgIiR2IgorZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2M0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMS5yaWdodApAQCAtMCwwICsxIEBACit3b3JkfSB9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwNjNmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMS50ZXN0cwpAQCAtMCwwICsxIEBACit7IGVjaG8gd29yZH0gfTsgfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjRkOTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDIucmlnaHQKQEAgLTAsMCArMSwyIEBACitnb3QgVEVSTQorRG9uZTogMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOTkxNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDIudGVzdHMKQEAgLTAsMCArMSwzIEBACisjIEJ1ZyB3YXMgaW4gaGFuZGxpbmcgb2YgIn0mIiB3aXRob3V0IHNwYWNlCit7IHRyYXAgImVjaG8gZ290IFRFUk0iIFRFUk07IHNsZWVwIDI7IH0mIHNsZWVwIDE7IGtpbGwgJCE7IHdhaXQKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXBzX2FuZF9rZXl3b3JkczEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3Vwc19hbmRfa2V5d29yZHMxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDY2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3Vwc19hbmRfa2V5d29yZHMxLnJpZ2h0CkBAIC0wLDAgKzEsMTEgQEAKK1NlbWljb2xvbnMgYWZ0ZXIgfSBjYW4gYmUgb21pdHRlZCAxOgorZm9vCitiYXIKK1NlbWljb2xvbnMgYWZ0ZXIgfSBjYW4gYmUgb21pdHRlZCAyOgorZm9vCitiYXIKK1NlbWljb2xvbnMgYWZ0ZXIgZmkgY2FuIGJlIG9taXR0ZWQ6Citmb28KK2JhcgorYmF6CitEb25lOjAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXBzX2FuZF9rZXl3b3JkczEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3Vwc19hbmRfa2V5d29yZHMxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAxOTQ0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3Vwc19hbmRfa2V5d29yZHMxLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKK2VjaG8gIlNlbWljb2xvbnMgYWZ0ZXIgfSBjYW4gYmUgb21pdHRlZCAxOiIKK2lmIHsgZWNobyBmb287IH0gdGhlbiB7IGVjaG8gYmFyOyB9IGZpCisKK2VjaG8gIlNlbWljb2xvbnMgYWZ0ZXIgfSBjYW4gYmUgb21pdHRlZCAyOiIKK3doaWxlIHsgZWNobyBmb287IH0gZG8geyBlY2hvIGJhcjsgYnJlYWs7IH0gZG9uZQorCitlY2hvICJTZW1pY29sb25zIGFmdGVyIGZpIGNhbiBiZSBvbWl0dGVkOiIKK3doaWxlIGlmIGVjaG8gZm9vOyB0aGVuIGVjaG8gYmFyOyBmaSBkbyBlY2hvIGJhejsgYnJlYWs7IGRvbmUKKworZWNobyBEb25lOiQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25lZ2F0ZS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbmVnYXRlLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZDJlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25lZ2F0ZS5yaWdodApAQCAtMCwwICsxLDM2IEBACishIHByaW50aW5nICEKKzAKKzEKKzEKKzAKKzAKKzAKKyEKK2EKK2IKK2MKKyEgMQorYSAxCitiIDEKK2MgMQorISAxCithIDEKK2IgMQorYyAxCiswCiswCiswCiswCisxCisxCisxCisxCiswCiswCiswCiswCisxCisxCisxCisxCitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25lZ2F0ZS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbmVnYXRlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxMTUxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25lZ2F0ZS50ZXN0cwpAQCAtMCwwICsxLDE5IEBACitlY2hvICEgcHJpbnRpbmcgIQorISBmYWxzZQorZWNobyAkPworISB0cnVlCitlY2hvICQ/CitpZiAhIGZhbHNlOyB0aGVuIGZhbHNlOyBlY2hvICQ/OyBmaQorZWNobyAkPworaWYgISBmYWxzZTsgdGhlbiAhIGZhbHNlOyBlY2hvICQ/OyBmaQorZWNobyAkPworUFJJTlRGPWB3aGljaCBwcmludGZgCitmb3IgYSBpbiAhIGEgYiBjOyBkbyBlY2hvICRhOyBkb25lCitmb3IgYSBpbiAhIGEgYiBjOyBkbyAhIHByaW50ZiAiJGEgIjsgZWNobyAkPzsgZG9uZQordGVzdCB4IiRQUklOVEYiID0geCIiICYmIGV4aXQgMQorZm9yIGEgaW4gISBhIGIgYzsgZG8gISAiJFBSSU5URiIgIiRhICI7IGVjaG8gJD87IGRvbmUKK2ZvciBhIGluICEgYSBiIGM7IGRvICEgcHJpbnRmICIkYSAiIHwgZmFsc2U7IGVjaG8gJD87IGRvbmUKK2ZvciBhIGluICEgYSBiIGM7IGRvICEgcHJpbnRmICIkYSAiIHwgdHJ1ZTsgZWNobyAkPzsgZG9uZQorZm9yIGEgaW4gISBhIGIgYzsgZG8gISB7IHByaW50ZiAiJGEgIiB8IGZhbHNlOyB9OyBlY2hvICQ/OyBkb25lCitmb3IgYSBpbiAhIGEgYiBjOyBkbyAhIHsgcHJpbnRmICIkYSAiIHwgdHJ1ZTsgfTsgZWNobyAkPzsgZG9uZQorZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI3OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbC5yaWdodApAQCAtMCwwICsxIEBACitIRUxMTwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTkzMTEzYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wudGVzdHMKQEAgLTAsMCArMSwyIEBACisjIG5leHQgbGluZSBoYXMgbm8gRU9MIQorZWNobyBIRUxMTwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwNDkxZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wyLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKzEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTIyMGYwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wyLnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorIyBsYXN0IGxpbmUgaGFzIG5vIEVPTCEKK2lmIHRydWUKK3RoZW4KKyAgZWNobyAxCitlbHNlCisgIGVjaG8gMgorZmkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Zjg1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMy5yaWdodApAQCAtMCwwICsxIEBACitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjOTU4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMy50ZXN0cwpAQCAtMCwwICsxLDIgQEAKKyMgbGFzdCBsaW5lIGhhcyBubyBFT0whCitlY2hvICJ1bnRlcm1pbmF0ZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3Byb2Nlc3Nfc3Vic3QucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3Byb2Nlc3Nfc3Vic3QucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3YmM4MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcHJvY2Vzc19zdWJzdC5yaWdodApAQCAtMCwwICsxLDMgQEAKK1RFU1R6ekJFU1QKK1RFU1QkKGVjaG8genopQkVTVAorVEVTVCdCRVNUCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3Byb2Nlc3Nfc3Vic3QudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3Byb2Nlc3Nfc3Vic3QudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjE5OTZiYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcHJvY2Vzc19zdWJzdC50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2VjaG8gIlRFU1RgZWNobyB6ejtlY2hvO2VjaG9gQkVTVCIKK2VjaG8gIlRFU1RgZWNobyAnJChlY2hvIHp6KSdgQkVTVCIKK2VjaG8gIlRFU1RgZWNobyAiJyJgQkVTVCIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzODIwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKycxJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTU4OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTEudGVzdHMKQEAgLTAsMCArMSwyIEBACithPTEKK2VjaG8gIickYSciCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzllZGMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMi5yaWdodApAQCAtMCwwICsxIEBACis+MQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDk2NmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTIudGVzdHMKQEAgLTAsMCArMSwyIEBACithPTEKK2VjaG8gIj4kYSIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlNDZkZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUzLnJpZ2h0CkBAIC0wLDAgKzEsMTIgQEAKK1Rlc3Rpbmc6IGluICIiCisuLgorVGVzdGluZzogaW4gJycKKy4uCitUZXN0aW5nOiBpbiAkZW1wdHkKK1Rlc3Rpbmc6IGluICRlbXB0eSIiCisuLgorVGVzdGluZzogaW4gJGVtcHR5JycKKy4uCitUZXN0aW5nOiBpbiAiJGVtcHR5IgorLi4KK0ZpbmlzaGVkCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZmQ1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMy50ZXN0cwpAQCAtMCwwICsxLDIxIEBACitlbXB0eT0nJworCitlY2hvICdUZXN0aW5nOiBpbiAiIicKK2ZvciBhIGluICIiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAnIicnIgorZm9yIGEgaW4gJyc7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRlbXB0eScKK2ZvciBhIGluICRlbXB0eTsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJGVtcHR5IiInCitmb3IgYSBpbiAkZW1wdHkiIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJGVtcHR5JyInJyIKK2ZvciBhIGluICRlbXB0eScnOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAiJGVtcHR5IicKK2ZvciBhIGluICIkZW1wdHkiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvIEZpbmlzaGVkCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlNC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGU0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOTAxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlNC5yaWdodApAQCAtMCwwICsxIEBACithIGIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGU0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjFkYWJmYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGU0LnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorYV9iPSdhIGInCitlY2hvICIkYV9iIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9yZWRpcl9zcGFjZS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcmVkaXJfc3BhY2UucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0Mjk1MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcmVkaXJfc3BhY2UucmlnaHQKQEAgLTAsMCArMSwzIEBACit6MS50bXA6IDEKK3oyLnRtcDogMQorInoxLnRtcCB6Mi50bXAiOiBURVNUIDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcmVkaXJfc3BhY2UudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3JlZGlyX3NwYWNlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwYjU0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3JlZGlyX3NwYWNlLnRlc3RzCkBAIC0wLDAgKzEsNiBAQAordj0nejEudG1wIHoyLnRtcCcKK2VjaG8gVEVTVCA+JHYKK2VjaG8gJ3oxLnRtcDonIGBjYXQgJ3oxLnRtcCcgMj4vZGV2L251bGw7IGVjaG8gJD9gCitlY2hvICd6Mi50bXA6JyBgY2F0ICd6Mi50bXAnIDI+L2Rldi9udWxsOyBlY2hvICQ/YAorZWNobyAnInoxLnRtcCB6Mi50bXAiOicgYGNhdCAnejEudG1wIHoyLnRtcCcgMj4vZGV2L251bGw7IGVjaG8gJD9gCitybSB6Ki50bXAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYzMjNmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkLnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAorLjEgYWJjIGQgZSBmLgorLjEuCisuYWJjLgorLmQgZSBmLgorLi0xIGFiYyBkIGUgZi0uCisuLTEuCisuYWJjLgorLmQgZSBmLS4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZmU0OWIxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkLnRlc3RzCkBAIC0wLDAgKzEsOCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiAxIGFiYyAnZCBlIGYnCitmaQorCitmb3IgYSBpbiAiJCoiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorZm9yIGEgaW4gIiRAIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKK2ZvciBhIGluICItJCotIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKK2ZvciBhIGluICItJEAtIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZDIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZmY0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQyLnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAorU2hvdWxkIGJlIHByaW50ZWQKK1dvdWxkIG5vdCBiZSBwcmludGVkIGJ5IGJhc2gKK1dvdWxkIG5vdCBiZSBwcmludGVkIGJ5IGJhc2gKK1dvdWxkIG5vdCBiZSBwcmludGVkIGJ5IGJhc2gKK1Nob3VsZCBiZSBwcmludGVkCitFbXB0eToKK0VtcHR5OgorRW1wdHk6CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzVmZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkMi50ZXN0cwpAQCAtMCwwICsxLDE5IEBACitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIgorZmkKKworIyBObyBwYXJhbXMhCitmb3IgYSBpbiAiJCoiOyBkbyBlY2hvIFNob3VsZCBiZSBwcmludGVkOyBkb25lCitmb3IgYSBpbiAiJEAiOyBkbyBlY2hvIFNob3VsZCBub3QgYmUgcHJpbnRlZDsgZG9uZQorIyBZZXMsIGJlbGlldmUgaXQgb3Igbm90LCBiYXNoIGlzIG1lc21lcml6ZWQgYnkgIiRAIiBhbmQgc3RvcHMKKyMgdHJlYXRpbmcgIiIgYXMgInRoaXMgd29yZCBjYW5ub3QgYmUgZXhwYW5kZWQgdG8gbm90aGluZywKKyMgYnV0IG11c3QgYmUgYXQgbGVhc3QgbnVsbCBzdHJpbmciLiBOb3cgaXQgY2FuIGJlIGV4cGFuZGVkIHRvIG5vdGhpbmcuCitmb3IgYSBpbiAiJEAiIiI7IGRvIGVjaG8gV291bGQgbm90IGJlIHByaW50ZWQgYnkgYmFzaDsgZG9uZQorZm9yIGEgaW4gIiIiJEAiOyBkbyBlY2hvIFdvdWxkIG5vdCBiZSBwcmludGVkIGJ5IGJhc2g7IGRvbmUKK2ZvciBhIGluICIiIiRAIicnIiRAIicnOyBkbyBlY2hvIFdvdWxkIG5vdCBiZSBwcmludGVkIGJ5IGJhc2g7IGRvbmUKK2ZvciBhIGluICIiOyBkbyBlY2hvIFNob3VsZCBiZSBwcmludGVkOyBkb25lCisKKyMgQnVnIDIwNzogIiRAIiBleHBhbmRzIHRvIG5vdGhpbmcsIGFuZCB3ZSBlcnJvbmVvdXNseSBnbG9iICIlc1xuIiB0d2ljZToKK3ByaW50ZiAnRW1wdHk6JXNcbicgIiRAIgorcHJpbnRmICJFbXB0eTolc1xuIiAiJEAiCitwcmludGYgIkVtcHR5OiVzXFxuIiAiJEAiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZW1wdHl0aWNrLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2VtcHR5dGljay5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTAwY2FiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2VtcHR5dGljay5yaWdodApAQCAtMCwwICsxLDE3IEBACiswCiswCitodXNoOiBjYW4ndCBleGVjdXRlICcnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxMjcKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEyNworMAorMAorMAorMAoraHVzaDogY2FuJ3QgZXhlY3V0ZSAnJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMTI3CitodXNoOiBjYW4ndCBleGVjdXRlICcnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxMjcKKzAKKzAKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9lbXB0eXRpY2sudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZW1wdHl0aWNrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhZmZhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZW1wdHl0aWNrLnRlc3RzCkBAIC0wLDAgKzEsMTYgQEAKK3RydWU7ICBgYDsgZWNobyAkPworZmFsc2U7IGBgOyBlY2hvICQ/Cit0cnVlOyAgYCIiYDsgZWNobyAkPworZmFsc2U7IGAiImA7IGVjaG8gJD8KK3RydWU7ICBgICAgICBgOyBlY2hvICQ/CitmYWxzZTsgYCAgICAgYDsgZWNobyAkPworCit0cnVlOyAgJCgpOyBlY2hvICQ/CitmYWxzZTsgJCgpOyBlY2hvICQ/Cit0cnVlOyAgJCgiIik7IGVjaG8gJD8KK2ZhbHNlOyAkKCIiKTsgZWNobyAkPwordHJ1ZTsgICQoICAgICApOyBlY2hvICQ/CitmYWxzZTsgJCggICAgICk7IGVjaG8gJD8KKworZXhlYyAnJzsgZWNobyAkPworZWNobyBOb3QgcmVhY2hlZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2ZhbHNldGljay5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9mYWxzZXRpY2sucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5OGZiNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9mYWxzZXRpY2sucmlnaHQKQEAgLTAsMCArMSwyNyBAQAorMAorMAorMAorMAorMgorMgorMgorMgoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQoraHVzaDogY2FuJ3Qgb3BlbiAnL2RvZXMvbm90L2V4aXN0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQorRG9uZTogYT1iCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZmFsc2V0aWNrLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2ZhbHNldGljay50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NGQyZWFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2ZhbHNldGljay50ZXN0cwpAQCAtMCwwICsxLDIyIEBACisjIEV4aXRjb2RlIDAgKGBgIGhhcyBubyBleGl0Y29kZSwgYnV0IGFzc2lnbm1lbnQgaGFzKToKK3RydWU7ICBhPWBgOyBlY2hvICQ/CitmYWxzZTsgYT1gYDsgZWNobyAkPwordHJ1ZTsgIGE9JCgpOyBlY2hvICQ/CitmYWxzZTsgYT0kKCk7IGVjaG8gJD8KKyMgRXhpdGNvZGUgMiAoYGNtZGAgZXhwYW5zaW9uIHNldHMgZXhpdGNvZGUgYWZ0ZXIgYXNzaWdubWVudCBzZXQgaXQgdG8gMCk6Cit0cnVlOyAgYT1gZXhpdCAyYDsgZWNobyAkPworZmFsc2U7IGE9YGV4aXQgMmA7IGVjaG8gJD8KK3RydWU7ICBhPSQoZXhpdCAyKTsgZWNobyAkPworZmFsc2U7IGE9JChleGl0IDIpOyBlY2hvICQ/CisjIEV4aXRjb2RlIDEgKHJlZGlyZWN0IHNldHMgZXhpdGNvZGUgdG8gMSBvbiBlcnJvciBhZnRlciB0aGVtKToKK3RydWU7ICBhPWBgID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KK2ZhbHNlOyBhPWBgID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KK3RydWU7ICBhPSQoKSA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/CitmYWxzZTsgYT0kKCkgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPwordHJ1ZTsgIGE9YGV4aXQgMmAgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPworZmFsc2U7IGE9YGV4aXQgMmAgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPwordHJ1ZTsgIGE9JChleGl0IDIpID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KK2ZhbHNlOyBhPSQoZXhpdCAyKSA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/CisjIC4uLmFuZCBhc3NpZ25tZW50IHN0aWxsIGhhcHBlbnMgZGVzcGl0ZSByZWRpcmVjdCBlcnJvcjoKK3RydWU7ICBhPSQoZWNobyBiKSA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/CitlY2hvICJEb25lOiBhPSRhIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2sucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljay5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQyODFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2sucmlnaHQKQEAgLTAsMCArMSwyIEBACisxCisxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljay50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmNzQ5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljay50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK3RydWUKK2ZhbHNlOyBlY2hvIGBlY2hvICQ/YAordHJ1ZQoreyBmYWxzZTsgZWNobyBgZWNobyAkP2A7IH0KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTZjODgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2syLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0JBWgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2syLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2syLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiNGU5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazIudGVzdHMKQEAgLTAsMCArMSw1IEBACitpZiBmYWxzZTsgdGhlbgorICAgIGVjaG8gIkZPTyIKKyAgICB0bXA9YGVjaG8gQkFSID4mMmAKK2ZpCitlY2hvIEJBWgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2szLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2szLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjI2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazMucmlnaHQKQEAgLTAsMCArMSw2IEBACitcVEVTVFpaQkVTVAorJFRFU1QKK1EKK2FcYmMKKzExLSRhLVx0LVwtXCItYC1cLS1cei1cKi1cPy0yMiAzMy0kYS1cdC1cLSItYC1cLS1cei1cKi1cPy00NAorZG9uZTowCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2FlYjI0MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMy50ZXN0cwpAQCAtMCwwICsxLDE0IEBACit0ZXN0ICIkQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITyIgPSAieSIgfHwgZXhpdCA3NworCitURVNUPVEKKyMgXGAgaXMgc3BlY2lhbAorZWNobyBgZWNobyAnXCdURVNUXGBlY2hvIFpaXGBCRVNUYAorIyBcJCBhbmQgXFwgYXJlIHNwZWNpYWwKK2VjaG8gYGVjaG8gXFwkVEVTVGAKK2VjaG8gYGVjaG8gXCRURVNUYAorZWNobyBhYGVjaG8gXFxcXGJgYworCisjIFwiIGlzIG5vdCBzcGVjaWFsIGlmIGluIHVucXVvdGVkIGBjbWRgIChwYXNzZWQgdmVyYmF0aW0gV0lUSCBcKSwKKyMgYnV0IGlzIHNwZWNpYWwgaW4gcXVvdGVkIG9uZQorZWNobyBgZWNobyAxMSctJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tJzIyYCAiYGVjaG8gMzMnLSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LSc0NGAiCitlY2hvIGRvbmU6JD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODAzMGVhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s0LnJpZ2h0CkBAIC0wLDAgKzEsNyBAQAorKFRFU1QpIEJFU1QKK1RFU1QpIEJFU1QKKygoVEVTVCkgQkVTVAorKQorYWJjCithKWMKK09LOiAwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjIzMDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNC50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK2VjaG8gJChlY2hvICcoVEVTVCknIEJFU1QpCitlY2hvICQoZWNobyAnVEVTVCknIEJFU1QpCitlY2hvICQoZWNobyBcKFwoVEVTVFwpIEJFU1QpCitlY2hvICQoZWNobyBcKSkKK2VjaG8gJChlY2hvIGEiYGVjaG8gImIiYCJjICkKK2VjaG8gJChlY2hvIGEiYGVjaG8gIikiYCJjICkKK2VjaG8gT0s6ICQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazUucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwNDkxZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNS5yaWdodApAQCAtMCwwICsxIEBACisxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazUudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQxNjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNS50ZXN0cwpAQCAtMCwwICsxIEBACit0cnVlOyBlY2hvIGBmYWxzZWAgJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrX2h1Z2UucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGlja19odWdlLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzQwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGlja19odWdlLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorNTQ2ZWQzZjVjODFjNzgwZDNhYjg2YWRhMTQ4MjQyMzcgIC0KKzU0NmVkM2Y1YzgxYzc4MGQzYWI4NmFkYTE0ODI0MjM3ICAtCitFbmQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrX2h1Z2UudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGlja19odWdlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjY2U5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGlja19odWdlLnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorIyBUaGlzIGNyZWF0ZXMgMTIwayBmaWxlCit5ZXMgIjEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSIgfCBoZWFkIC0zMDAwID4+IiQwLnRtcCIKKworZWNobyAiYGNhdCAkMC50bXBgIiB8IG1kNXN1bQorcm0gIiQwLnRtcCIKK3llcyAiMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IiB8IGhlYWQgLTMwMDAgfCBtZDVzdW0KK2VjaG8gRW5kCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfUkVQTFkucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfUkVQTFkucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmNWQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9SRVBMWS5yaWdodApAQCAtMCwwICsxLDUgQEAKK3Rlc3QgMTogfCAgYWJjMSAgZGVmICB8Cit0ZXN0IDI6IHwgIFxhYmMyICBkXGVmICB8Cit0ZXN0IDM6IHxhYmMzICBkZWZ8Cit0ZXN0IDQ6IHxcYWJjNCAgZFxlZnwKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9SRVBMWS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9SRVBMWS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTIwY2FlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX1JFUExZLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorZWNobyAnICBcYWJjMSAgZFxlZiAgJyB8ICggcmVhZCAgICAgICAgIDsgZWNobyAidGVzdCAxOiB8JFJFUExZfCIgKQorZWNobyAnICBcYWJjMiAgZFxlZiAgJyB8ICggcmVhZCAtciAgICAgIDsgZWNobyAidGVzdCAyOiB8JFJFUExZfCIgKQorZWNobyAnICBcYWJjMyAgZFxlZiAgJyB8ICggcmVhZCAgICBSRVBMWTsgZWNobyAidGVzdCAzOiB8JFJFUExZfCIgKQorZWNobyAnICBcYWJjNCAgZFxlZiAgJyB8ICggcmVhZCAtciBSRVBMWTsgZWNobyAidGVzdCA0OiB8JFJFUExZfCIgKQorZWNobyBEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfaWZzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX2lmcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTIzMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX2lmcy5yaWdodApAQCAtMCwwICsxLDEwIEBACit0ZXN0IDE6IC5hLiAuYi4gLmMuCit0ZXN0IDI6IC5hLiAuYi4gLmMuCit0ZXN0IDM6IC5hLiAuLiAuYixjLgordGVzdCA0OiAuYS4gLi4gLmIsYy4KK3Rlc3QgNTogLmEuIC4uIC5jLgordGVzdCA2OiAuYS4gLi4gLmMuIC5kLgordGVzdCA3OiAuYS4gLi4gLmIsYyxkICAsICAsLgordGVzdCA4OiAuLiAuYS4gLmIuIC5jLgordGVzdCA5OiAuYS4gLmIuIC5jLiAuLgordGVzdCBBOiAuLiAuYS4gLi4gLmIuIC5jLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX2lmcy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9pZnMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU4MzExMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9pZnMudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorcHJpbnRmICdhXHRcdGJcdGNcbicgfCAoIElGUz0kKHByaW50ZiAiXHQiKSByZWFkIGEgYiBjOyAgZWNobyAidGVzdCAxOiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdhXHRcdGJcdGNcbicgfCAoIElGUz0kKHByaW50ZiAiIFx0IikgcmVhZCBhIGIgYzsgZWNobyAidGVzdCAyOiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdhLCxiLGNcbicgICAgfCAoIElGUz0iLCIgcmVhZCBhIGIgYzsgIGVjaG8gInRlc3QgMzogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYSwsYixjXG4nICAgIHwgKCBJRlM9IiAsIiByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDQ6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EgLCwgY1xuJyAgICB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYzsgZWNobyAidGVzdCA1OiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdhICwsIGMgZFxuJyAgfCAoIElGUz0iICwiIHJlYWQgYSBiIGMgZDsgICAgIGVjaG8gInRlc3QgNjogLiRhLiAuJGIuIC4kYy4gLiRkLiIgKQorcHJpbnRmICcgYSwsYixjLGQgICwgICxcbicgfCAoIElGUz0iICwiIHJlYWQgYSBiIGM7IGVjaG8gInRlc3QgNzogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnXHQsXHRhXHQsXHRiXHRjJyAgIHwgKCBJRlM9JChwcmludGYgIiBcdCwiKSByZWFkIGEgYiBjIGQ7ICAgZWNobyAidGVzdCA4OiAuJGEuIC4kYi4gLiRjLiAuJGQuIiApCitwcmludGYgJ1x0XHRhXHQsXHRiXHRjJyAgICB8ICggSUZTPSQocHJpbnRmICIgXHQsIikgcmVhZCBhIGIgYyBkOyAgIGVjaG8gInRlc3QgOTogLiRhLiAuJGIuIC4kYy4gLiRkLiIgKQorcHJpbnRmICdcdCxcdGFcdCwsXHRiXHRjJyAgfCAoIElGUz0kKHByaW50ZiAiIFx0LCIpIHJlYWQgYSBiIGMgZCBlOyBlY2hvICJ0ZXN0IEE6IC4kYS4gLiRiLiAuJGMuIC4kZC4gLiRlLiIgKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX24ucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfbi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjgxYWYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX24ucmlnaHQKQEAgLTAsMCArMSwzIEBACit0ZXN0Cit0ZXMKK3RlcwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX24udGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfbi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjQyM2JhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX24udGVzdHMKQEAgLTAsMCArMSwzIEBACitlY2hvICd0ZXN0JyB8IChyZWFkIHJlcGx5OyBlY2hvICIkcmVwbHkiKQorZWNobyAndGVzdCcgfCAocmVhZCAtbiAzIHJlcGx5OyBlY2hvICIkcmVwbHkiKQorZWNobyAndGVzdCcgfCAocmVhZCAtbjMgcmVwbHk7IGVjaG8gIiRyZXBseSIpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzZiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfci5yaWdodApAQCAtMCwwICsxLDIgQEAKK3Rlc3RiZXN0Cit0ZXN0XApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3IudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYzRjYzYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3IudGVzdHMKQEAgLTAsMCArMSwyIEBACitlY2hvIC1lICd0ZXN0XFxcbmJlc3QnIHwgKHJlYWQgcmVwbHk7IGVjaG8gIiRyZXBseSIpCitlY2hvIC1lICd0ZXN0XFxcbmJlc3QnIHwgKHJlYWQgLXIgcmVwbHk7IGVjaG8gIiRyZXBseSIpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfdC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF90LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTI2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfdC5yaWdodApAQCAtMCwwICsxLDQgQEAKKz48Cis+PAorPnRlc3Q8Cis+dGVzdDwKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF90LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3QudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY1ZjFhZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF90LnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKKyMgYmFzaCAzLjIgb3V0cHV0czoKKworIyA+PAoreyBlY2hvIC1uICd0ZSc7IHNsZWVwIDI7IGVjaG8gJ3N0JzsgfSAgIHwgKHJlYWQgLXQgMSByZXBseTsgZWNobyAiPiRyZXBseTwiKQorIyA+PAoreyAgICAgICAgICAgICAgIHNsZWVwIDI7IGVjaG8gJ3Rlc3QnOyB9IHwgKHJlYWQgLXQgMSByZXBseTsgZWNobyAiPiRyZXBseTwiKQorIyA+dGVzdDwKK3sgZWNobyAtbiAndGUnOyBzbGVlcCAxOyBlY2hvICdzdCc7IH0gICB8IChyZWFkIC10IDIgcmVwbHk7IGVjaG8gIj4kcmVwbHk8IikKKyMgPnRlc3Q8Cit7ICAgICAgICAgICAgICAgc2xlZXAgMTsgZWNobyAndGVzdCc7IH0gfCAocmVhZCAtdCAyIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2NhdGNoLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9jYXRjaC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGEwNjJjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9jYXRjaC5yaWdodApAQCAtMCwwICsxLDUgQEAKK3NlbmRpbmcgVVNSMgorY2F1Z2h0CitzZW5kaW5nIFVTUjIKK3NlbmRpbmcgVVNSMgorVVNSMgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9jYXRjaC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvY2F0Y2gudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDJhMjFkMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvY2F0Y2gudGVzdHMKQEAgLTAsMCArMSwyMCBAQAorIyBhdm9pZCB1Z2x5IHdhcm5pbmdzIGFib3V0IHNpZ25hbHMgbm90IGJlaW5nIGNhdWdodAordHJhcCAiOiIgVVNSMSBVU1IyCisKKyIkVEhJU19TSCIgLWMgJwordHJhcCAiZWNobyBjYXVnaHQiIFVTUjIKK2VjaG8gInNlbmRpbmcgVVNSMiIKK2tpbGwgLVVTUjIgJCQKKwordHJhcCAiIiBVU1IyCitlY2hvICJzZW5kaW5nIFVTUjIiCitraWxsIC1VU1IyICQkCisKK3RyYXAgIi0iIFVTUjIKK2VjaG8gInNlbmRpbmcgVVNSMiIKK2tpbGwgLVVTUjIgJCQKKworZWNobyAibm90IHJlYWNoZWQiCisnCisKK3RyYXAgIi0iIFVTUjEgVVNSMgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9leGl0LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9leGl0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDA3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2V4aXQucmlnaHQKQEAgLTAsMCArMSwxMiBAQAorY293Cittb28KK1RyYXBzMToKK3RyYXAgLS0gJ2V4aXRmdW5jJyBFWElUCitUcmFwczI6Cit0cmFwIC0tICdlY2hvIFNob3VsZCBub3QgcnVuJyBFWElUCitDaGVjazE6IDQyCitUcmFwczE6Cit0cmFwIC0tICdleGl0ZnVuYycgRVhJVAorVHJhcHMyOgordHJhcCAtLSAnZWNobyBTaG91bGQgbm90IHJ1bicgRVhJVAorQ2hlY2syOiA0MgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9leGl0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9leGl0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwNjExMDUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2V4aXQudGVzdHMKQEAgLTAsMCArMSwzNCBAQAorIiRUSElTX1NIIiAtYyAndHJhcCAiZWNobyBjb3ciIDAnCisiJFRISVNfU0giIC1jICd0cmFwICJlY2hvIG1vbyIgRVhJVCcKKyIkVEhJU19TSCIgLWMgJ3RyYXAgImVjaG8gbm8iIDA7IHRyYXAgMCcKKworKAorZXhpdGZ1bmMoKSB7CisgICAgICAgIGVjaG8gIlRyYXBzMToiCisgICAgICAgIHRyYXAKKyAgICAgICAgIyBFWElUIHRyYXAgaXMgZGlzYWJsZWQgYWZ0ZXIgaXQgaXMgdHJpZ2dlcmVkLAorICAgICAgICAjIGl0IGNhbiBub3QgYmUgInJlLWFybWVkIiBsaWtlIHRoaXM6CisgICAgICAgIHRyYXAgImVjaG8gU2hvdWxkIG5vdCBydW4iIEVYSVQKKyAgICAgICAgZWNobyAiVHJhcHMyOiIKKyAgICAgICAgdHJhcAorfQordHJhcCAnZXhpdGZ1bmMnIEVYSVQKK2V4aXQgNDIKKykKK2VjaG8gQ2hlY2sxOiAkPworCisoCitleGl0ZnVuYygpIHsKKyAgICAgICAgZWNobyAiVHJhcHMxOiIKKyAgICAgICAgdHJhcAorICAgICAgICAjIEVYSVQgdHJhcCBpcyBkaXNhYmxlZCBhZnRlciBpdCBpcyB0cmlnZ2VyZWQsCisgICAgICAgICMgaXQgY2FuIG5vdCBiZSAicmUtYXJtZWQiIGxpa2UgdGhpczoKKyAgICAgICAgdHJhcCAiZWNobyBTaG91bGQgbm90IHJ1biIgRVhJVAorICAgICAgICBlY2hvICJUcmFwczI6IgorICAgICAgICB0cmFwCisgICAgICAgIGV4aXQgNDIKK30KK3RyYXAgJ2V4aXRmdW5jJyBFWElUCitleGl0IDY2CispCitlY2hvIENoZWNrMjogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZS1yZXQucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmUtcmV0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZTEyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmUtcmV0LnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorWUVBSAorMApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZlLXJldC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZS1yZXQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDc4NmI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZS1yZXQudGVzdHMKQEAgLTAsMCArMSw0IEBACisjIG1ha2Ugc3VyZSB3ZSBkbyBub3QgY29ycnVwdCAkPyBhY3Jvc3MgdHJhcHMKK3RyYXAgImVjaG8gWUVBSDsgZmFsc2UiIFVTUjEKK2tpbGwgLVVTUjEgJCQKK2VjaG8gJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZXRyYXAucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmV0cmFwLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTIyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmV0cmFwLnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAordHJhcCAtLSAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwIC0tICdlY2hvIFdJTkNIIScgV0lOQ0gKK3RyYXAgLS0gJ2VjaG8gRXhpdGluZycgRVhJVAordHJhcCAtLSAnZWNobyBXSU5DSCEnIFdJTkNICit0cmFwIC0tICdlY2hvIEV4aXRpbmcnIEVYSVQKK3RyYXAgLS0gJ2VjaG8gV0lOQ0ghJyBXSU5DSAorRG9uZQorRXhpdGluZwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZldHJhcC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZXRyYXAudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiMzEyZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZXRyYXAudGVzdHMKQEAgLTAsMCArMSw5IEBACit0cmFwICdlY2hvIEV4aXRpbmcnIEVYSVQKK3RyYXAgJ2VjaG8gV0lOQ0ghJyBTSUdXSU5DSAordj1gIHRyYXAgICBgCitlY2hvICIkdiIKK3Y9JCgJdHJhcCApCitlY2hvICIkdiIKK3Y9YHRyYXBgCitlY2hvICIkdiIKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWw3LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWw3LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzQ1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbDcucmlnaHQKQEAgLTAsMCArMSBAQAorQnVnIGRldGVjdGVkOiAwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbDcudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbDcudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiMTM4MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsNy50ZXN0cwpAQCAtMCwwICsxLDE4IEBACitidWcoKSB7CisJdHJhcCA6IGV4aXQKKwkjIEJ1ZyB3YXMgY2F1c2luZyBzaCB0byBiZSBydW4gaW4gc3Vic2hlbGwsCisJIyBhcyBpZiB0aGlzIGxpbmUgaXMgcmVwbGFjZWQgd2l0aCAoc2ggLWMgLi4uOyBleGl0ICQ/KSAmCisJIyBoZXJlOgorCXNoIC1jICdlY2hvIFJFQUxfQ0hJTEQ9JCQnICYKKwllY2hvIFBBUkVOVFNfSURFQV9PRl9DSElMRD0kIQorCXdhaXQgICMgbWFrZSBzdXJlIGJrZ2Qgc2hlbGwgY29tcGxldGVzCit9CisKK2J1ZyB8IHsKK3doaWxlIHJlYWQgdmFydmFsOyBkbworCWV2YWwgJHZhcnZhbAorZG9uZQordGVzdCB4IiRSRUFMX0NISUxEIiAhPSB4IiIgXAorJiYgdGVzdCB4IiRSRUFMX0NISUxEIiA9IHgiJFBBUkVOVFNfSURFQV9PRl9DSElMRCIKK2VjaG8gIkJ1ZyBkZXRlY3RlZDogJD8iCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzBhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMS5yaWdodApAQCAtMCwwICsxIEBACitHb3QgSFVQOjAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTEwNTQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQxLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorKHNsZWVwIDE7IGtpbGwgLUhVUCAkJCkgJgordHJhcCAnZWNobyAiR290IEhVUDokPyI7IGV4aXQnIEhVUAord2hpbGUgdHJ1ZTsgZG8KKwlyZWFkIGlnbm9yZWQKK2RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhNmJjMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorSFVQCitEb25lOjEyOQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWI1YjliCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDIudGVzdHMKQEAgLTAsMCArMSw3IEBACiskVEhJU19TSCAtYyAnCisoc2xlZXAgMTsga2lsbCAtSFVQICQkKSAmCit3aGlsZSB0cnVlOyBkbworCXJlYWQgaWdub3JlZAorZG9uZQorJworZWNobyAiRG9uZTokPyIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc3Vic2hlbGwucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3N1YnNoZWxsLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjViOTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3N1YnNoZWxsLnJpZ2h0CkBAIC0wLDAgKzEsMjEgQEAKK3RyYXAgLS0gJycgSFVQCit0cmFwIC0tICcnIFFVSVQKK3RyYXAgLS0gJycgU1lTCitPawordHJhcCAtLSAnJyBIVVAKK3RyYXAgLS0gJycgUVVJVAordHJhcCAtLSAnJyBTWVMKK09rCit0cmFwIC0tICcnIEhVUAordHJhcCAtLSAnJyBRVUlUCit0cmFwIC0tICcnIFNZUworT2sKK3RyYXAgLS0gJycgSFVQCit0cmFwIC0tICcnIFFVSVQKK3RyYXAgLS0gJycgU1lTCitPawordHJhcCAtLSAnJyBIVVAKK3RyYXAgLS0gJycgUVVJVAordHJhcCAtLSAnJyBTWVMKK1RFUk0KK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc3Vic2hlbGwudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3N1YnNoZWxsLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ4NzdmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3N1YnNoZWxsLnRlc3RzCkBAIC0wLDAgKzEsMTkgQEAKKyMgTm9uLWVtcHR5IHRyYXBzIHNob3VsZCBiZSByZXNldCBpbiBzdWJzaGVsbAorCisjIEhVUCBpcyBzcGVjaWFsIGluIGludGVyYWN0aXZlIHNoZWxscwordHJhcCAnJyBIVVAKKyMgUVVJVCBpcyBhbHdheXMgc3BlY2lhbAordHJhcCAnJyBRVUlUCisjIFNZUyBpcyBub3Qgc3BlY2lhbAordHJhcCAnJyBTWVMKKyMgV0lOQ0ggaXMgaGFybWxlc3MKK3RyYXAgJ2JhZDogY2F1Z2h0IFdJTkNIJyBXSU5DSAorIyBXaXRoIFRFUk0gd2UnbGwgY2hlY2sgd2hldGhlciBpdCBpcyByZXNldAordHJhcCAnYmFkOiBjYXVnaHQgVEVSTScgIFRFUk0KKworKHRyYXA7ICIkVEhJU19TSCIgLWMgJ2tpbGwgLUhVUCAgICRQUElEJzsgZWNobyBPaykKKyh0cmFwOyAiJFRISVNfU0giIC1jICdraWxsIC1RVUlUICAkUFBJRCc7IGVjaG8gT2spCisodHJhcDsgIiRUSElTX1NIIiAtYyAna2lsbCAtU1lTICAgJFBQSUQnOyBlY2hvIE9rKQorKHRyYXA7ICIkVEhJU19TSCIgLWMgJ2tpbGwgLVdJTkNIICRQUElEJzsgZWNobyBPaykKKyh0cmFwOyAiJFRISVNfU0giIC1jICdraWxsIC1URVJNICAkUFBJRCc7IGVjaG8gQmFkOiBURVJNIGlzIG5vdCByZXNldCkKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC91c2FnZS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvdXNhZ2UucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkYmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvdXNhZ2UucmlnaHQKQEAgLTAsMCArMSwxNCBAQAorX19fCitfX18KK19fXwordHJhcCAtLSAnYScgRVhJVAordHJhcCAtLSAnYScgSU5UCit0cmFwIC0tICdhJyBVU1IxCit0cmFwIC0tICdhJyBVU1IyCitfX18KK19fXwordHJhcCAtLSAnYScgVVNSMQordHJhcCAtLSAnYScgVVNSMgorX19fCitfX18KK3RyYXAgLS0gJ2EnIFVTUjIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvdXNhZ2UudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3VzYWdlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyOWM2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3VzYWdlLnRlc3RzCkBAIC0wLDAgKzEsMjMgQEAKKyMgbm8gb3V0cHV0IC0tIGRlZmF1bHQgc3RhdGUKK2VjaG8gX19fCit0cmFwCisKKyMgYXNzaWduIHNvbWUgdHJhcHMKK2VjaG8gX19fCit0cmFwICJhIiBFWElUIElOVCBVU1IxIFVTUjIKKworIyBzaG93IHRoZW0gYWxsCitlY2hvIF9fXwordHJhcAorCisjIGNsZWFyIG9uZQorZWNobyBfX18KK3RyYXAgMCBJTlQKK2VjaG8gX19fCit0cmFwCisKKyMgY2xlYXIgYW5vdGhlcgorZWNobyBfX18KK3RyYXAgIi0iIFVTUjEKK2VjaG8gX19fCit0cmFwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2VtcHR5LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9lbXB0eS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2IzYzcwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9lbXB0eS5yaWdodApAQCAtMCwwICsxLDMgQEAKK2EgYiBjIGQgZSBmIDEgMiAzIDQgNSA2IDcgOCA5IDAgQSBCIEMgRCBFIEYKK2EgYiBjIGQgZSBmIDEgMiAzIDQgNSA2IDcgOCA5IDAgQSBCIEMgRCBFIEYKK2EgYiBjIGQgZSBmIDEgMiAzIDQgNSA2IDcgOCA5IDAgQSBCIEMgRCBFIEYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZW1wdHkudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2VtcHR5LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5YzI0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2VtcHR5LnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorZT0KKworZWNobyBhIGIgYyBkIGUgZiAxIDIgMyA0IDUgNiA3IDggOSAwIEEgQiBDIEQgRSBGCitlY2hvIGEgJGUgYiAkZSBjICRlIGQgJGUgZSAkZSBmICRlIDEgJGUgMiAkZSAzICRlIDQgJGUgNSAkZSA2ICRlIDcgJGUgOCAkZSA5ICRlIDAgJGUgQSAkZSBCICRlIEMgJGUgRCAkZSBFICRlIEYKK2VjaG8gJGUgYSAkZSBiICRlIGMgJGUgZCAkZSBlICRlIGYgJGUgMSAkZSAyICRlIDMgJGUgNCAkZSA1ICRlIDYgJGUgNyAkZSA4ICRlIDkgJGUgMCAkZSBBICRlIEIgJGUgQyAkZSBEICRlIEUgJGUgRgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9nbG9iX2FuZF92YXJzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9nbG9iX2FuZF92YXJzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzdlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2dsb2JfYW5kX3ZhcnMucmlnaHQKQEAgLTAsMCArMSBAQAorLi9nbG9iX2FuZF92YXJzLnJpZ2h0IC4vZ2xvYl9hbmRfdmFycy50ZXN0cwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9nbG9iX2FuZF92YXJzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9nbG9iX2FuZF92YXJzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4MmNmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2dsb2JfYW5kX3ZhcnMudGVzdHMKQEAgLTAsMCArMSwyIEBACit2PS4KK2VjaG8gJHYvZ2xvYl9hbmRfdmFycy5bdHJdKgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYWx0LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYWx0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjE4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hbHQucmlnaHQKQEAgLTAsMCArMSw4IEBACitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CitfXyBfXworXyBfIF8gXyBfCitfYWFhYSBfIF8gX3dvcmQgX3dvcmQKK18gXyBfIF8gXworXyBfIF8gX3dvcmQgXworX2ZmZiBfIF8gX3dvcmQgX3dvcmQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2FsdC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2FsdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYjY0NmIxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYWx0LnRlc3RzCkBAIC0wLDAgKzEsMjIgQEAKKyMgZmlyc3QgdHJ5IHNvbWUgaW52YWxpZCBwYXR0ZXJucyAoZG8gaW4gc3Vic2hlbGwgZHVlIHRvIHBhcnNpbmcgZXJyb3IpCisiJFRISVNfU0giIC1jICdlY2hvICR7K30gIDsgZWNobyBtb28nCisiJFRISVNfU0giIC1jICdlY2hvICR7Oit9IDsgZWNobyBtb28nCisKKyMgbm93IHNvbWUgZnVua3kgb25lcy4gKGJhc2ggZG9lc24ndCBhY2NlcHQgJHsjK30pCitlY2hvIF8keyMrfV8gXyR7IzorfV8KKworIyBub3cgc29tZSB2YWxpZCBvbmVzCitzZXQgLS0KK2VjaG8gXyQxIF8kezErfSBfJHsxOit9IF8kezErd29yZH0gXyR7MTord29yZH0KKworc2V0IC0tIGFhYWEKK2VjaG8gXyQxIF8kezErfSBfJHsxOit9IF8kezErd29yZH0gXyR7MTord29yZH0KKwordW5zZXQgZgorZWNobyBfJGYgXyR7Zit9IF8ke2Y6K30gXyR7Zit3b3JkfSBfJHtmOit3b3JkfQorCitmPQorZWNobyBfJGYgXyR7Zit9IF8ke2Y6K30gXyR7Zit3b3JkfSBfJHtmOit3b3JkfQorCitmPWZmZgorZWNobyBfJGYgXyR7Zit9IF8ke2Y6K30gXyR7Zit3b3JkfSBfJHtmOit3b3JkfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYXNzaWduLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYXNzaWduLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjI1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hc3NpZ24ucmlnaHQKQEAgLTAsMCArMSwyNyBAQAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQorMAorMAoraHVzaDogJDE6IGNhbm5vdCBhc3NpZ24gaW4gdGhpcyB3YXkKK2h1c2g6ICQxOiBjYW5ub3QgYXNzaWduIGluIHRoaXMgd2F5CitodXNoOiAkMTogY2Fubm90IGFzc2lnbiBpbiB0aGlzIHdheQoraHVzaDogJDE6IGNhbm5vdCBhc3NpZ24gaW4gdGhpcyB3YXkKK19hYQorX2FhCitfYWEKK19hYQorXworXworXworX3dvcmQKK193b3JkCitfCitfCitfCitfCitfd29yZAorX2ZmZgorX2ZmZgorX2ZmZgorX2ZmZgorX2ZmZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYXNzaWduLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYXNzaWduLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0OWNiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hc3NpZ24udGVzdHMKQEAgLTAsMCArMSwzOCBAQAorIyBmaXJzdCB0cnkgc29tZSBpbnZhbGlkIHBhdHRlcm5zIChkbyBpbiBzdWJzaGVsbCBkdWUgdG8gcGFyc2luZyBlcnJvcikKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs9fScKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs6PX0nCisKKyMgbm93IHNvbWUgZnVua3kgb25lcworIiRUSElTX1NIIiAtYyAnZWNobyAkeyM9fScKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHsjOj19JworCisjIHNob3VsZCBlcnJvciBvdXQKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxPX0nCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MTo9fScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxPXdvcmR9JworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE6PXdvcmR9JworCisjIHNob3VsZCBub3QgZXJyb3IKKyIkVEhJU19TSCIgLWMgJ3NldCBhYTsgZWNobyBfJHsxPX0nCisiJFRISVNfU0giIC1jICdzZXQgYWE7IGVjaG8gXyR7MTo9fScKKyIkVEhJU19TSCIgLWMgJ3NldCBhYTsgZWNobyBfJHsxPXdvcmR9JworIiRUSElTX1NIIiAtYyAnc2V0IGFhOyBlY2hvIF8kezE6PXdvcmR9JworCisjIHNob3VsZCB3b3JrIGZpbmUKK3Vuc2V0IGY7IGVjaG8gXyRmCit1bnNldCBmOyBlY2hvIF8ke2Y9fQordW5zZXQgZjsgZWNobyBfJHtmOj19Cit1bnNldCBmOyBlY2hvIF8ke2Y9d29yZH0KK3Vuc2V0IGY7IGVjaG8gXyR7Zjo9d29yZH0KKworZj07IGVjaG8gXyRmCitmPTsgZWNobyBfJHtmPX0KK2Y9OyBlY2hvIF8ke2Y6PX0KK2Y9OyBlY2hvIF8ke2Y9d29yZH0KK2Y9OyBlY2hvIF8ke2Y6PXdvcmR9CisKK2Y9ZmZmOyBlY2hvIF8kZgorZj1mZmY7IGVjaG8gXyR7Zj19CitmPWZmZjsgZWNobyBfJHtmOj19CitmPWZmZjsgZWNobyBfJHtmPXdvcmR9CitmPWZmZjsgZWNobyBfJHtmOj13b3JkfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYmFzaF9zdWJzdHJpbmcucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9iYXNoX3N1YnN0cmluZy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRjNTFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYmFzaF9zdWJzdHJpbmcucmlnaHQKQEAgLTAsMCArMSw2NCBAQAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQorMDEyMzQ1Njc4OQorMSAgICA9fHwKKzE6MSAgPXx8CisxOjE6Mj18fAorMTo6MiA9fHwKKzE6MTogPXx8CisxOjogID18fAorMSAgICA9fDAxMjN8CisxOjEgID18MTIzfAorMToxOjI9fDEyfAorMTo6MiA9fDAxfAorMToxOiA9fHwKKzE6OiAgPXx8CitmICAgID18fAorZjoxICA9fHwKK2Y6MToyPXx8CitmOjoyID18fAorZjoxOiA9fHwKK2Y6OiAgPXx8CitmICAgID18fAorZjoxICA9fHwKK2Y6MToyPXx8CitmOjoyID18fAorZjoxOiA9fHwKK2Y6OiAgPXx8CitmICAgID18YXwKK2Y6MSAgPXx8CitmOjE6Mj18fAorZjo6MiA9fGF8CitmOjE6ID18fAorZjo6ICA9fHwKK2YgICAgPXwwMTIzNDU2Nzg5fAorZjoxICA9fDEyMzQ1Njc4OXwKK2Y6MToyPXwxMnwKK2Y6OjIgPXwwMXwKK2Y6MTogPXx8CitmOjogID18fAorU3Vic3RyaW5ncyBmcm9tIHNwZWNpYWwgdmFycworPyAgICA9fDB8Cis/OjEgID18fAorPzoxOjI9fHwKKz86OjIgPXwwfAorPzoxOiA9fHwKKz86OiAgPXx8CisjICAgID18MTF8CisjOjEgID18MXwKKyM6MToyPXwxfAorIzo6MiA9fDExfAorIzoxOiA9fHwKKyM6OiAgPXx8CitTdWJzdHJpbmdzIHdpdGggZXhwcmVzc2lvbnMKK2YgICAgICAgICAgICA9fDAxMjM0NTY3fAorZjoxKzE6MisyICAgID18MjM0NXwKK2Y6LTE6MisyICAgICA9fDAxMjM0NTY3fAorZjoxOmYgICAgICAgID18MTIzNDU2N3wKK2Y6MTokZiAgICAgICA9fDEyMzQ1Njd8CitmOjE6JHtmfSAgICAgPXwxMjM0NTY3fAorZjoxOiR7ZjozOjF9ID18MTIzfAorZjoxOjFgZWNobyAxYD18MXwKK0RvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Jhc2hfc3Vic3RyaW5nLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYmFzaF9zdWJzdHJpbmcudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWM5NTUyZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Jhc2hfc3Vic3RyaW5nLnRlc3RzCkBAIC0wLDAgKzEsODMgQEAKKyMgZmlyc3QgdHJ5IHNvbWUgaW52YWxpZCBwYXR0ZXJucworIyBkbyBhbGwgb2YgdGhlc2UgaW4gc3Vic2hlbGxzIHNpbmNlIGl0J3Mgc3VwcG9zZWQgdG8gZXJyb3Igb3V0CitleHBvcnQgdmFyPTAxMjM0NTY3ODkKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs6fScKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs6On0nCisiJFRISVNfU0giIC1jICdlY2hvICR7OjF9JworIiRUSElTX1NIIiAtYyAnZWNobyAkezo6MX0nCisKKyN0aGlzIGFsc28gaXMgbm90IHZhbGlkIGluIGJhc2gsIGJ1dCB3ZSBhY2NlcHQgaXQ6CisiJFRISVNfU0giIC1jICdlY2hvICR7dmFyOn0nCisKKyMgdGhlbiBzb21lIGZ1bmt5IG9uZXMKKyMgVU5GSVhFRCBCVUc6IHRoaXMgc2hvdWxkIHdvcms6ICIkVEhJU19TSCIgLWMgJ2VjaG8gJHs/OjB9JworCisjIG5vdyBzb21lIHZhbGlkIG9uZXMKK3NldCAtLTsgZWNobyAiMSAgICA9fCR7MX18Igorc2V0IC0tOyBlY2hvICIxOjEgID18JHsxOjF9fCIKK3NldCAtLTsgZWNobyAiMToxOjI9fCR7MToxOjJ9fCIKK3NldCAtLTsgZWNobyAiMTo6MiA9fCR7MTo6Mn18Igorc2V0IC0tOyBlY2hvICIxOjE6ID18JHsxOjE6fXwiCitzZXQgLS07IGVjaG8gIjE6OiAgPXwkezE6On18IgorCitzZXQgLS0gMDEyMzsgZWNobyAiMSAgICA9fCR7MX18Igorc2V0IC0tIDAxMjM7IGVjaG8gIjE6MSAgPXwkezE6MX18Igorc2V0IC0tIDAxMjM7IGVjaG8gIjE6MToyPXwkezE6MToyfXwiCitzZXQgLS0gMDEyMzsgZWNobyAiMTo6MiA9fCR7MTo6Mn18Igorc2V0IC0tIDAxMjM7IGVjaG8gIjE6MTogPXwkezE6MTp9fCIKK3NldCAtLSAwMTIzOyBlY2hvICIxOjogID18JHsxOjp9fCIKKwordW5zZXQgZjsgZWNobyAiZiAgICA9fCRmfCIKK3Vuc2V0IGY7IGVjaG8gImY6MSAgPXwke2Y6MX18IgordW5zZXQgZjsgZWNobyAiZjoxOjI9fCR7ZjoxOjJ9fCIKK3Vuc2V0IGY7IGVjaG8gImY6OjIgPXwke2Y6OjJ9fCIKK3Vuc2V0IGY7IGVjaG8gImY6MTogPXwke2Y6MTp9fCIKK3Vuc2V0IGY7IGVjaG8gImY6OiAgPXwke2Y6On18IgorCitmPTsgZWNobyAiZiAgICA9fCRmfCIKK2Y9OyBlY2hvICJmOjEgID18JHtmOjF9fCIKK2Y9OyBlY2hvICJmOjE6Mj18JHtmOjE6Mn18IgorZj07IGVjaG8gImY6OjIgPXwke2Y6OjJ9fCIKK2Y9OyBlY2hvICJmOjE6ID18JHtmOjE6fXwiCitmPTsgZWNobyAiZjo6ICA9fCR7Zjo6fXwiCisKK2Y9YTsgZWNobyAiZiAgICA9fCRmfCIKK2Y9YTsgZWNobyAiZjoxICA9fCR7ZjoxfXwiCitmPWE7IGVjaG8gImY6MToyPXwke2Y6MToyfXwiCitmPWE7IGVjaG8gImY6OjIgPXwke2Y6OjJ9fCIKK2Y9YTsgZWNobyAiZjoxOiA9fCR7ZjoxOn18IgorZj1hOyBlY2hvICJmOjogID18JHtmOjp9fCIKKworZj0wMTIzNDU2Nzg5OyBlY2hvICJmICAgID18JGZ8IgorZj0wMTIzNDU2Nzg5OyBlY2hvICJmOjEgID18JHtmOjF9fCIKK2Y9MDEyMzQ1Njc4OTsgZWNobyAiZjoxOjI9fCR7ZjoxOjJ9fCIKK2Y9MDEyMzQ1Njc4OTsgZWNobyAiZjo6MiA9fCR7Zjo6Mn18IgorZj0wMTIzNDU2Nzg5OyBlY2hvICJmOjE6ID18JHtmOjE6fXwiCitmPTAxMjM0NTY3ODk7IGVjaG8gImY6OiAgPXwke2Y6On18IgorCitlY2hvICJTdWJzdHJpbmdzIGZyb20gc3BlY2lhbCB2YXJzIgorZWNobyAnPyAgICAnIj18JD98IgorZWNobyAnPzoxICAnIj18JHs/OjF9fCIKK2VjaG8gJz86MToyJyI9fCR7PzoxOjJ9fCIKK2VjaG8gJz86OjIgJyI9fCR7Pzo6Mn18IgorZWNobyAnPzoxOiAnIj18JHs/OjE6fXwiCitlY2hvICc/OjogICciPXwkez86On18Igorc2V0IC0tIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExCitlY2hvICcjICAgICciPXwkI3wiCitlY2hvICcjOjEgICciPXwkeyM6MX18IgorZWNobyAnIzoxOjInIj18JHsjOjE6Mn18IgorZWNobyAnIzo6MiAnIj18JHsjOjoyfXwiCitlY2hvICcjOjE6ICciPXwkeyM6MTp9fCIKK2VjaG8gJyM6OiAgJyI9fCR7Izo6fXwiCisKK2VjaG8gIlN1YnN0cmluZ3Mgd2l0aCBleHByZXNzaW9ucyIKK2Y9MDEyMzQ1Njc7IGVjaG8gJ2YgICAgICAgICAgICAnIj18JGZ8IgorZj0wMTIzNDU2NzsgZWNobyAnZjoxKzE6MisyICAgICciPXwke2Y6MSsxOjIrMn18IgorZj0wMTIzNDU2NzsgZWNobyAnZjotMToyKzIgICAgICciPXwke2Y6LTE6MisyfXwiCitmPTAxMjM0NTY3OyBlY2hvICdmOjE6ZiAgICAgICAgJyI9fCR7ZjoxOmZ9fCIKK2Y9MDEyMzQ1Njc7IGVjaG8gJ2Y6MTokZiAgICAgICAnIj18JHtmOjE6JGZ9fCIKK2Y9MDEyMzQ1Njc7IGVjaG8gJ2Y6MToke2Z9ICAgICAnIj18JHtmOjE6JHtmfX18IgorZj0wMTIzNDU2NzsgZWNobyAnZjoxOiR7ZjozOjF9ICciPXwke2Y6MToke2Y6MzoxfX18IgorZj0wMTIzNDU2NzsgZWNobyAnZjoxOjFgZWNobyAxYCciPXwke2Y6MTpgZWNobyAxYH18IgorCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2RlZmF1bHQucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9kZWZhdWx0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzcxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9kZWZhdWx0LnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQorXzAgXzAKK18gXyBfIF93b3JkIF93b3JkCitfYWFhYSBfYWFhYSBfYWFhYSBfYWFhYSBfYWFhYQorXyBfIF8gX3dvcmQgX3dvcmQKK18gXyBfIF8gX3dvcmQKK19mZmYgX2ZmZiBfZmZmIF9mZmYgX2ZmZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfZGVmYXVsdC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2RlZmF1bHQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWVhMDUxNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2RlZmF1bHQudGVzdHMKQEAgLTAsMCArMSwyMiBAQAorIyBmaXJzdCB0cnkgc29tZSBpbnZhbGlkIHBhdHRlcm5zIChkbyBpbiBzdWJzaGVsbCBkdWUgdG8gcGFyc2luZyBlcnJvcikKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHstfScKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs6LX0nCisKKyMgbm93IHNvbWUgZnVua3kgb25lcworZWNobyBfJHsjLX0gXyR7IzotfQorCisjIG5vdyBzb21lIHZhbGlkIG9uZXMKK3NldCAtLQorZWNobyBfJDEgXyR7MS19IF8kezE6LX0gXyR7MS13b3JkfSBfJHsxOi13b3JkfQorCitzZXQgLS0gYWFhYQorZWNobyBfJDEgXyR7MS19IF8kezE6LX0gXyR7MS13b3JkfSBfJHsxOi13b3JkfQorCit1bnNldCBmCitlY2hvIF8kZiBfJHtmLX0gXyR7ZjotfSBfJHtmLXdvcmR9IF8ke2Y6LXdvcmR9CisKK2Y9CitlY2hvIF8kZiBfJHtmLX0gXyR7ZjotfSBfJHtmLXdvcmR9IF8ke2Y6LXdvcmR9CisKK2Y9ZmZmCitlY2hvIF8kZiBfJHtmLX0gXyR7ZjotfSBfJHtmLXdvcmR9IF8ke2Y6LXdvcmR9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9pbmRpY2F0ZV9lcnJvci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2luZGljYXRlX2Vycm9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZmNjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9pbmRpY2F0ZV9lcnJvci5yaWdodApAQCAtMCwwICsxLDQzIEBACitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CiswCiswCis9PT09CitfCitodXNoOiAxOiBwYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0CitodXNoOiAxOiBwYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0CitodXNoOiAxOiBtZXNzYWdlMQoraHVzaDogMTogbWVzc2FnZTEKK2h1c2g6IDE6IHVuc2V0IQoraHVzaDogMTogbnVsbCBvciB1bnNldCEKKz09PT0KK19hYWFhCitfYWFhYQorX2FhYWEKK19hYWFhCitfYWFhYQorX2FhYWEKK19hYWFhCis9PT09CitfCitodXNoOiBmOiBwYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0CitodXNoOiBmOiBwYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0CitodXNoOiBmOiBtZXNzYWdlMworaHVzaDogZjogbWVzc2FnZTMKK2h1c2g6IGY6IHVuc2V0IQoraHVzaDogZjogbnVsbCBvciB1bnNldCEKKz09PT0KK18KK18KK2h1c2g6IGY6IHBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQKK18KK2h1c2g6IGY6IG1lc3NhZ2U0CitfCitodXNoOiBmOiBudWxsIG9yIHVuc2V0IQorPT09PQorX2ZmZgorX2ZmZgorX2ZmZgorX2ZmZgorX2ZmZgorX2ZmZgorX2ZmZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfaW5kaWNhdGVfZXJyb3IudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9pbmRpY2F0ZV9lcnJvci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZTE0YjFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfaW5kaWNhdGVfZXJyb3IudGVzdHMKQEAgLTAsMCArMSw2MCBAQAorIyBkbyBhbGwgb2YgdGhlc2UgaW4gc3Vic2hlbGxzIHNpbmNlIGl0J3Mgc3VwcG9zZWQgdG8gZXJyb3Igb3V0CisKKyMgZmlyc3QgdHJ5IHNvbWUgaW52YWxpZCBwYXR0ZXJucworIyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs/fScgLS0gdGhpcyBpcyB2YWxpZCBhcyBpdCdzIHRoZSBzYW1lIGFzICQ/CisiJFRISVNfU0giIC1jICdlY2hvICR7Oj99JworCisjIHRoZW4gc29tZSBmdW5reSBvbmVzCisjIG5vdGU6IGJhc2ggcHJpbnRzIDEgLSB0cmVhdHMgaXQgYXMgImxlbmd0aCBvZiAkIyI/IFdlIHByaW50IDAKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHsjP30nCisjIGJhc2ggcHJpbnRzIDAKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHsjOj99JworCisjIG5vdyBzb21lIHZhbGlkIG9uZXMKK2V4cG9ydCBtc2dfdW5zZXQ9InVuc2V0ISIKK2V4cG9ydCBtc2dfbnVsbF9vcl91bnNldD0ibnVsbCBvciB1bnNldCEiCisKK2VjaG8gPT09PQorIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kMScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxP30nCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MTo/fScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxP21lc3NhZ2UxfScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxOj9tZXNzYWdlMX0nCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MT8kbXNnX3Vuc2V0fScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxOj8kbXNnX251bGxfb3JfdW5zZXR9JworCitlY2hvID09PT0KKyIkVEhJU19TSCIgLWMgJ3NldCAtLSBhYWFhOyBlY2hvIF8kMScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLSBhYWFhOyBlY2hvIF8kezE/fScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLSBhYWFhOyBlY2hvIF8kezE6P30nCisiJFRISVNfU0giIC1jICdzZXQgLS0gYWFhYTsgZWNobyBfJHsxP3dvcmR9JworIiRUSElTX1NIIiAtYyAnc2V0IC0tIGFhYWE7IGVjaG8gXyR7MTo/d29yZH0nCisiJFRISVNfU0giIC1jICdzZXQgLS0gYWFhYTsgZWNobyBfJHsxPyRtc2dfdW5zZXR9JworIiRUSElTX1NIIiAtYyAnc2V0IC0tIGFhYWE7IGVjaG8gXyR7MTo/JG1zZ19udWxsX29yX3Vuc2V0fScKKworZWNobyA9PT09CisiJFRISVNfU0giIC1jICd1bnNldCBmOyBlY2hvIF8kZicKKyIkVEhJU19TSCIgLWMgJ3Vuc2V0IGY7IGVjaG8gXyR7Zj99JworIiRUSElTX1NIIiAtYyAndW5zZXQgZjsgZWNobyBfJHtmOj99JworIiRUSElTX1NIIiAtYyAndW5zZXQgZjsgZWNobyBfJHtmP21lc3NhZ2UzfScKKyIkVEhJU19TSCIgLWMgJ3Vuc2V0IGY7IGVjaG8gXyR7Zjo/bWVzc2FnZTN9JworIiRUSElTX1NIIiAtYyAndW5zZXQgZjsgZWNobyBfJHtmPyRtc2dfdW5zZXR9JworIiRUSElTX1NIIiAtYyAndW5zZXQgZjsgZWNobyBfJHtmOj8kbXNnX251bGxfb3JfdW5zZXR9JworCitlY2hvID09PT0KKyIkVEhJU19TSCIgLWMgJ2Y9OyBlY2hvIF8kZicKKyIkVEhJU19TSCIgLWMgJ2Y9OyBlY2hvIF8ke2Y/fScKKyIkVEhJU19TSCIgLWMgJ2Y9OyBlY2hvIF8ke2Y6P30nCisiJFRISVNfU0giIC1jICdmPTsgZWNobyBfJHtmP3dvcmR9JworIiRUSElTX1NIIiAtYyAnZj07IGVjaG8gXyR7Zjo/bWVzc2FnZTR9JworIiRUSElTX1NIIiAtYyAnZj07IGVjaG8gXyR7Zj8kbXNnX3Vuc2V0fScKKyIkVEhJU19TSCIgLWMgJ2Y9OyBlY2hvIF8ke2Y6PyRtc2dfbnVsbF9vcl91bnNldH0nCisKK2VjaG8gPT09PQorIiRUSElTX1NIIiAtYyAnZj1mZmY7IGVjaG8gXyRmJworIiRUSElTX1NIIiAtYyAnZj1mZmY7IGVjaG8gXyR7Zj99JworIiRUSElTX1NIIiAtYyAnZj1mZmY7IGVjaG8gXyR7Zjo/fScKKyIkVEhJU19TSCIgLWMgJ2Y9ZmZmOyBlY2hvIF8ke2Y/d29yZH0nCisiJFRISVNfU0giIC1jICdmPWZmZjsgZWNobyBfJHtmOj93b3JkfScKKyIkVEhJU19TSCIgLWMgJ2Y9ZmZmOyBlY2hvIF8ke2Y/JG1zZ191bnNldH0nCisiJFRISVNfU0giIC1jICdmPWZmZjsgZWNobyBfJHtmOj8kbXNnX251bGxfb3JfdW5zZXR9JwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfbGVuLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfbGVuLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZThjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9sZW4ucmlnaHQKQEAgLTAsMCArMSw5IEBACiswCiswCisxCitNYWtlIHN1cmUgbGVuIHBhcnNpbmcgZG9lc250IGJyZWFrIGFyZyBjb3VudAorMCAwCis0IDQKK1Rlc3RpbmcgbGVuIG9wCis0IDMgMiAxIDAgMAorMCAzIDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2xlbi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2xlbi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTIwYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfbGVuLnRlc3RzCkBAIC0wLDAgKzEsMTcgQEAKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJCMnCisiJFRISVNfU0giIC1jICdlY2hvICQjJyBhcmcwCisiJFRISVNfU0giIC1jICdlY2hvICQjJyBhcmcwIGFyZzEKKworZWNobyBNYWtlIHN1cmUgbGVuIHBhcnNpbmcgZG9lc250IGJyZWFrIGFyZyBjb3VudAorc2V0IC0tCitlY2hvICQjICR7I30KK3NldCAtLSBhYWFhIGJiYiBjYyBkCitlY2hvICQjICR7I30KKworZWNobyBUZXN0aW5nIGxlbiBvcAorZWNobyAkeyMxfSAkeyMyfSAkeyMzfSAkeyM0fSAkeyM1fSAkeyM2fQorCit1bnNldCBlCitmPWFiYworZz0KK2VjaG8gJHsjZX0gJHsjZn0gJHsjZ30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZ2xvYi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZ2xvYi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVlOGZlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9nbG9iLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorcGFyYW1fZ2xvYi50ZXN0cworcGFyYW1fZ2xvYi50ZXN0cworcGFyYW1fZ2xvYi50KgorcGFyYW1fZ2xvYi50KgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9nbG9iLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9nbG9iLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkNzRmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2dsb2IudGVzdHMKQEAgLTAsMCArMSw5IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiICdwYXJhbV9nbG9iLnQqJworICAgIGVjaG8gTk9UIFNIT1dOCisgICAgZXhpdAorZmkKK2VjaG8gJCoKK2VjaG8gJEAKK2VjaG8gIiQqIgorZWNobyAiJEAiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX3N1YnNoZWxsLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9zdWJzaGVsbC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2MzNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9zdWJzaGVsbC5yaWdodApAQCAtMCwwICsxLDcgQEAKKzE9MQorMj0yCiszPTMKKzQ9NAorNT01Cis2PTYKKzc9NwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9zdWJzaGVsbC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fc3Vic2hlbGwudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjdmZGM1YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fc3Vic2hlbGwudGVzdHMKQEAgLTAsMCArMSwxNSBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICAiJFRISVNfU0giICIkMCIgMSAyIDMgNCA1IDYgNyA4IDkKKyAgICBleGl0CitmaQorZWNobyAxPSQxCit7IGVjaG8gMj0kMjsgfQoreyBlY2hvIDM9JDM7IH0gJgorIyBjYW50IHVzZSB1c2xlZXAgYXMgaXQgaXNudCBzdGFuZGFyZCBpbiAkUEFUSCAtLQorIyB3ZSBmYWlsIHdoZW4gdGVzdGluZyBidXN5Ym94IGNvbXBpbGVkIHNvbGVseSBhcyAiaHVzaCIKK3dhaXQKKyggZWNobyA0PSQ0ICkKKyggZWNobyA1PSQ1ICkgJgord2FpdAordHJ1ZSB8IGVjaG8gNj0kNiB8IGNhdAordHJ1ZSB8IHsgZWNobyA3PSQ3OyB9IHwgY2F0CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3N0YXIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3N0YXIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjYzU1YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvc3Rhci5yaWdodApAQCAtMCwwICsxLDYgQEAKKy4xLgorLmFiYy4KKy5kLgorLmUuCisuZi4KKy4xIGFiYyBkIGUgZi4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvc3Rhci50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvc3Rhci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NTU0YzQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9zdGFyLnRlc3RzCkBAIC0wLDAgKzEsOCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgc3Rhci50ZXN0cyAxIGFiYyAnZCBlIGYnCitmaQorIyAnZCBlIGYnIHNob3VsZCBiZSBzcGxpdCBpbnRvIDMgc2VwYXJhdGUgYXJnczoKK2ZvciBhIGluICQqOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCisjIG11c3QgcHJvZHVjZSAuMSBhYmMgZCBlIGYuCitmb3IgYSBpbiAiJCoiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy91bnNldC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdW5zZXQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiZTc2YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdW5zZXQucmlnaHQKQEAgLTAsMCArMSwxOCBAQAorMAordW5zZXQ6IGludmFsaWQgb3B0aW9uIC0tIG0KKzEKKzAKK19fXworMCBmIGcKKzAgZworMAorX19fCiswIGYgZworMAorMCBmIGcKKzAKK19fXworaHVzaDogSFVTSF9WRVJTSU9OOiByZWFkb25seSB2YXJpYWJsZQorMSBmIGcKK2h1c2g6IEhVU0hfVkVSU0lPTjogcmVhZG9ubHkgdmFyaWFibGUKKzEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdW5zZXQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Vuc2V0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1OWNlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Vuc2V0LnRlc3RzCkBAIC0wLDAgKzEsMzYgQEAKKyMgY2hlY2sgaW52YWxpZCBvcHRpb25zIGFyZSByZWplY3RlZAordW5zZXQgLQorZWNobyAkPwordW5zZXQgLW0gYSBiIGMKK2VjaG8gJD8KKworIyBjaGVjayBmdW5reSB1c2FnZQordW5zZXQKK2VjaG8gJD8KKworIyBjaGVjayBub3JtYWwgdXNhZ2UKK2VjaG8gX19fCitmPWYgZz1nCitlY2hvICQ/ICRmICRnCit1bnNldCBmCitlY2hvICQ/ICRmICRnCit1bnNldCBnCitlY2hvICQ/ICRmICRnCisKK2VjaG8gX19fCitmPWYgZz1nCitlY2hvICQ/ICRmICRnCit1bnNldCBmIGcKK2VjaG8gJD8gJGYgJGcKK2Y9ZiBnPWcKK2VjaG8gJD8gJGYgJGcKK3Vuc2V0IC12IGYgZworZWNobyAkPyAkZiAkZworCisjIGNoZWNrIHJlYWQgb25seSB2YXJzCitlY2hvIF9fXworZj1mIGc9ZwordW5zZXQgSFVTSF9WRVJTSU9OCitlY2hvICQ/ICRmICRnCit1bnNldCBmIEhVU0hfVkVSU0lPTiBnCitlY2hvICQ/ICRmICRnCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0ZTdkYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMS5yaWdodApAQCAtMCwwICsxLDQgQEAKK2h0dHA6Ly9idXN5Ym94Lm5ldAoraHR0cDovL2J1c3lib3gubmV0X2FiYworMSAxCisxIDEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40OGE2NzgyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIxLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorVVJMPWh0dHA6Ly9idXN5Ym94Lm5ldAorCitlY2hvICRVUkwKK2VjaG8gJHtVUkx9X2FiYworCit0cnVlCitmYWxzZTsgZWNobyAkPyAkez99Cit0cnVlCit7IGZhbHNlOyBlY2hvICQ/ICR7P307IH0KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMi5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGJmNGJmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAoraHR0cDovL2J1c3lib3gubmV0CitodHRwOi8vYnVzeWJveC5uZXRfYWJjCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTI5MjQxMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMi50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK18xPWh0dHA6Ly9idXN5Ym94Lm5ldAorCitlY2hvICRfMQorZWNobyAke18xfV9hYmMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU2N2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIzLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAoraHVzaDogaW52YWxpZCBudW1iZXIgJzFxJworaHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlYTM2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjMudGVzdHMKQEAgLTAsMCArMSw0IEBACisjIHJlamVjdCBpbnZhbGlkIHZhcnMKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHsxcX0nCisiJFRISVNfU0giIC1jICdlY2hvICR7Jn0nCisjIiRUSElTX1NIIiAtYyAnZWNobyAkeyR9JyAtLSB0aGlzIGlzIHZhbGlkIGFzIGl0J3MgdGhlIHNhbWUgYXMgJCQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gxLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhMDc2OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gxLnJpZ2h0CkBAIC0wLDAgKzEsMTQgQEAKKworCitmCitiY2RlZgorYWJjZGVmCithYmNkZWYKK2JjZGUKK2FiY2QKK2FiY2QKK2FiY2RlZgorYmNkZWYKK2FiY2RlZgorYWJjZGVmCithYmNkZWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjRkM2M5YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gxLnRlc3RzCkBAIC0wLDAgKzEsMTggQEAKK3Zhcj1hYmNkZWYKKworZWNobyAke3Zhcjo3fQorZWNobyAke3Zhcjo2fQorZWNobyAke3Zhcjo1fQorZWNobyAke3ZhcjoxfQorZWNobyAke3ZhcjowfQorZWNobyAke3ZhcjotMX0KKworZWNobyAke3ZhcjoxOjR9CitlY2hvICR7dmFyOjA6NH0KK2VjaG8gJHt2YXI6OjR9CitlY2hvICR7dmFyOi0xOjR9CisKK2VjaG8gJHt2YXI6MTo3fQorZWNobyAke3ZhcjowOjd9CitlY2hvICR7dmFyOjo3fQorZWNobyAke3ZhcjotMTo3fQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JhNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDIucmlnaHQKQEAgLTAsMCArMSwxMCBAQAorYWJjMTIzeGNiYTEyMworYWJ4MTIzZGNiYTEyMworYWJ4MTIzZHhiYTEyMworYWJjeDIzZGNiYTEyMworYWJjeHh4ZGNiYXh4eAorYWJ4Cit4YmExMjMKK2FieDIzCithYmMyM2RjYmExMjMKK2FiY2RjYmEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjljNTI2YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gyLnRlc3RzCkBAIC0wLDAgKzEsMjQgQEAKK3Zhcj1hYmMxMjNkY2JhMTIzCisKK2VjaG8gJHt2YXIvZC94fQorZWNobyAke3Zhci9jL3h9CitlY2hvICR7dmFyLy9jL3h9CitlY2hvICR7dmFyL1sxMjNdL3h9CitlY2hvICR7dmFyLy9bMTIzXS94fQorZWNobyAke3Zhci9jKi94fQorZWNobyAke3Zhci8qYy94fQorCisjIG11c3QgbWF0Y2ggbG9uZ2VzdCBtYXRjaDogcmVzdWx0IGlzICJhYngyMyIKK2VjaG8gJHt2YXIvYyoxL3h9CisKKyMgZW1wdHkgcmVwbGFjZW1lbnQgLSAybmQgc2xhc2ggY2FuIGJlIG9taXR0ZWQKK2VjaG8gJHt2YXIvWzEyM119CitlY2hvICR7dmFyLy9bMTIzXX0KKworIyMjIGFzaCBkb2Vzbid0IHN1cHBvcnQKKyMjIyAjIG1hdGNoIG9ubHkgYXQgdGhlIGJlZ2lubmluZzoKKyMjIyBlY2hvICR7dmFyLyNhL3h9CisjIyMgZWNobyAke3Zhci8jYi94fSAjIHNob3VsZCBub3QgbWF0Y2gKKyMjIyBlY2hvICR7dmFyLy8jYi94fSAjIHNob3VsZCBub3QgbWF0Y2gKKyMjIyAjIG1hdGNoIG9ubHkgYXQgdGhlIGVuZDoKKyMjIyBlY2hvICR7dmFyLyUzL3h9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5N2M4NTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMy5yaWdodApAQCAtMCwwICsxLDIwIEBACisxIGEwNDEjYworMiBhMDQxI2MKKzMgYVwwNDEjYworNCBhXDA0MSNjCis1IGFcMDQxI2MKKzYgYVwwNDEjYworNyBhXDA0MSNjCis4IGFcMDQxI2MKKzkgYVwwNDEjYworMTAgYVxjCisxMSBhXGMKKzEyIGFcYworMTMgYVxcYworMTQgYVxcYworMTUgYVxcYworMTYgYVx0YworMTcgYVx0YworMTggYVx0YworMTkgYXRjCisyMCBhXHRjCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0NmRiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMy50ZXN0cwpAQCAtMCwwICsxLDQxIEBACithPSdhYmMnCityPSR7YS8vYi9cMDQxI30KK2VjaG8gMSAkcgorZWNobyAyICR7YS8vYi9cMDQxI30KK2VjaG8gMyAiJHthLy9iL1wwNDEjfSIKKworYT0nYWJjJworcj0ke2EvL2IvXFwwNDEjfQorZWNobyA0ICRyCitlY2hvIDUgJHthLy9iL1xcMDQxI30KK2VjaG8gNiAiJHthLy9iL1xcMDQxI30iCisKK2E9J2FiYycKK2I9J1wwNDEjJworcj0ke2EvL2IvJGJ9CitlY2hvIDcgJHIKK2VjaG8gOCAke2EvL2IvJGJ9CitlY2hvIDkgIiR7YS8vYi8kYn0iCisKK2E9J2FiYycKK2I9J1wnCityPSIke2EvL2IvJGJ9IgorZWNobyAxMCAkcgorZWNobyAxMSAke2EvL2IvJGJ9CitlY2hvIDEyICIke2EvL2IvJGJ9IgorCithPSdhYmMnCitiPSdcXCcKK3I9IiR7YS8vYi8kYn0iCitlY2hvIDEzICRyCitlY2hvIDE0ICR7YS8vYi8kYn0KK2VjaG8gMTUgIiR7YS8vYi8kYn0iCisKK2E9J2FiYycKK2I9J1x0Jworcj0iJHthLy9iLyRifSIKK2VjaG8gMTYgJHIKK2VjaG8gMTcgJHthLy9iLyRifQorZWNobyAxOCAiJHthLy9iLyRifSIKK2VjaG8gMTkgJHthLy9iL1x0fQorZWNobyAyMCAiJHthLy9iL1x0fSIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g0LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmMWJmNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g0LnJpZ2h0CkBAIC0wLDAgKzEsNDAgQEAKK1NvdXJjZTogICAgICAgIGEqYlwqYworUmVwbGFjZSBzdHI6ICAgX1xcX1x6XworUGF0dGVybjogICAgICAgc2luZ2xlIGJhY2tzbGFzaCBhbmQgc3RhcjogInJlcGxhY2UgbGl0ZXJhbCBzdGFyIgorVW5xdW90ZWQ6ICAgICAgYV9cX3pfYlwqYworVW5xdW90ZWQgPTogICAgYV9cX3pfYlwqYworUXVvdGVkOiAgICAgICAgYV9cX1x6X2JcKmMKK1F1b3RlZCA9OiAgICAgIGFfXF9cel9iXCpjCitQYXR0ZXJuOiAgICAgICBkb3VibGUgYmFja3NsYXNoIGFuZCBzdGFyOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQiCitVbnF1b3RlZDogICAgICBhKmJfXF96XworVW5xdW90ZWQgPTogICAgYSpiX1xfel8KK1F1b3RlZDogICAgICAgIGEqYl9cX1x6XworUXVvdGVkID06ICAgICAgYSpiX1xfXHpfCisKK1NvdXJjZTogICAgICAgIGFcYmMKK1JlcGxhY2Ugc3RyOiAgIF9cXF9cel8KK1BhdHRlcm46ICAgICAgIHNpbmdsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGIiCitVbnF1b3RlZDogICAgICBhXF9cX3pfYworVW5xdW90ZWQgPTogICAgYVxfXF96X2MKK1F1b3RlZDogICAgICAgIGFcX1xfXHpfYworUXVvdGVkID06ICAgICAgYVxfXF9cel9jCitQYXR0ZXJuOiAgICAgICBkb3VibGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGIiCitVbnF1b3RlZDogICAgICBhX1xfel9jCitVbnF1b3RlZCA9OiAgICBhX1xfel9jCitRdW90ZWQ6ICAgICAgICBhX1xfXHpfYworUXVvdGVkID06ICAgICAgYV9cX1x6X2MKKworU291cmNlOiAgICAgICAgYVxiYworUmVwbGFjZSBzdHI6ICAgX1xcX1x6XyAoYXMgdmFyaWFibGUgJHMpCitQYXR0ZXJuOiAgICAgICBzaW5nbGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiIgorVW5xdW90ZWQ6ICAgICAgYVxfXFxfXHpfYworVW5xdW90ZWQgPTogICAgYVxfXFxfXHpfYworUXVvdGVkOiAgICAgICAgYVxfXFxfXHpfYworUXVvdGVkID06ICAgICAgYVxfXFxfXHpfYworUGF0dGVybjogICAgICAgZG91YmxlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBiIgorVW5xdW90ZWQ6ICAgICAgYV9cXF9cel9jCitVbnF1b3RlZCA9OiAgICBhX1xcX1x6X2MKK1F1b3RlZDogICAgICAgIGFfXFxfXHpfYworUXVvdGVkID06ICAgICAgYV9cXF9cel9jCisKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzJhYTJiMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g0LnRlc3RzCkBAIC0wLDAgKzEsODEgQEAKKyMgVGhpcyB0ZXN0Y2FzZSBkZW1vbnN0cmF0ZXMgdGhhdCBiYWNrc2xhc2hlcyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseQorIyBpbiAxc3QgYW5kIDJuZCBwYXJ0cyBvZiAke3Zhci9zZWFyY2gvcmVwbH06CisjIGlmIHF1b3RlZCAoIiR7dmFyL3NlYXJjaC9yZXBsfSIpLCBhbmQgcmVwbCBjb250YWlucyBcYSAoYSBub24tc3BlY2lhbCBjaGFyKSwKKyMgdGhlIGJhY2tzbGFzaCBpbiByZXBsIHN0YXlzOyBpZiB1bnF1b3RlZCwgYmFja3NsYXNoIGlzIHJlbW92ZWQuCisjIEJ1dCBzZWFyY2ggcGFydCBkb2VzIG5vdCBhY3QgbGlrZSB0aGF0OiBcYSBpcyBhbHdheXMgY29udmVydGVkIHRvIGp1c3QgYSwKKyMgZXZlbiBpbiBxdW90ZXMuCisjCisjIGJhc2g0IChhbmQgcHJvYmFibHkgYmFzaDMgdG9vKTogIlF1b3RlZDoiIHJlc3VsdHMgYXJlIGRpZmZlcmVudCBmcm9tCisjIHVucXVvdGVkIGV4cGFuc2lvbnMgLSB0aGV5IGhhdmUgYSBiYWNrc2xhc2ggYmVmb3JlIHouCisjCisjIFRoZSBkaWZmZXJlbmNlIG9ubHkgZXhpc3RzIGlmIHJlcGwgaXMgYSBsaXRlcmFsLiBJZiBpdCBpcyBhIHZhcmlhYmxlOgorIyAke3YvLi4uLyRzfSwgdGhlbiBhbGwgYmFja3NsYXNoZXMgYXJlIHByZXNlcnZlZCBpbiBib3RoIGNhc2VzLgorCit2PSdhKmJcKmMnCitlY2hvICdTb3VyY2U6ICAgICAgICcgIiR2IgorZWNobyAnUmVwbGFjZSBzdHI6ICAnICdfXFxfXHpfJworCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ3NpbmdsZSBiYWNrc2xhc2ggYW5kIHN0YXI6ICJyZXBsYWNlIGxpdGVyYWwgc3RhciInCitlY2hvICdVbnF1b3RlZDogICAgICcgJHt2L1wqL19cXF9cel99CityPSR7di9cKi9fXFxfXHpffQorZWNobyAnVW5xdW90ZWQgPTogICAnICIkciIKK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1wqL19cXF9cel99Igorcj0iJHt2L1wqL19cXF9cel99IgorZWNobyAnUXVvdGVkID06ICAgICAnICIkciIKKworZWNobyAnUGF0dGVybjogICAgICAnICdkb3VibGUgYmFja3NsYXNoIGFuZCBzdGFyOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQiJworZWNobyAnVW5xdW90ZWQ6ICAgICAnICAke3YvXFwqL19cXF9cel99CityPSR7di9cXCovX1xcX1x6X30KK2VjaG8gJ1VucXVvdGVkID06ICAgJyAiJHIiCitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cXCovX1xcX1x6X30iCityPSIke3YvXFwqL19cXF9cel99IgorZWNobyAnUXVvdGVkID06ICAgICAnICIkciIKKworZWNobworCit2PSdhXGJjJworZWNobyAnU291cmNlOiAgICAgICAnICIkdiIKK2VjaG8gJ1JlcGxhY2Ugc3RyOiAgJyAnX1xcX1x6XycKKworZWNobyAnUGF0dGVybjogICAgICAnICdzaW5nbGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiIicKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAgJHt2L1xiL19cXF9cel99CityPSR7di9cYi9fXFxfXHpffQorZWNobyAnVW5xdW90ZWQgPTogICAnICIkciIKK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1xiL19cXF9cel99Igorcj0iJHt2L1xiL19cXF9cel99IgorZWNobyAnUXVvdGVkID06ICAgICAnICIkciIKKworZWNobyAnUGF0dGVybjogICAgICAnICdkb3VibGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGIiJworZWNobyAnVW5xdW90ZWQ6ICAgICAnICAke3YvXFxiL19cXF9cel99CityPSR7di9cXGIvX1xcX1x6X30KK2VjaG8gJ1VucXVvdGVkID06ICAgJyAiJHIiCitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cXGIvX1xcX1x6X30iCityPSIke3YvXFxiL19cXF9cel99IgorZWNobyAnUXVvdGVkID06ICAgICAnICIkciIKKworZWNobworCit2PSdhXGJjJworcz0nX1xcX1x6XycKK2VjaG8gJ1NvdXJjZTogICAgICAgJyAiJHYiCitlY2hvICdSZXBsYWNlIHN0cjogICcgIiRzIiAnKGFzIHZhcmlhYmxlICRzKScKKworZWNobyAnUGF0dGVybjogICAgICAnICdzaW5nbGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiIicKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAgJHt2L1xiLyRzfQorcj0ke3YvXGIvJHN9CitlY2hvICdVbnF1b3RlZCA9OiAgICcgIiRyIgorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXGIvJHN9Igorcj0iJHt2L1xiLyRzfSIKK2VjaG8gJ1F1b3RlZCA9OiAgICAgJyAiJHIiCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnZG91YmxlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBiIicKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAgJHt2L1xcYi8kc30KK3I9JHt2L1xcYi8kc30KK2VjaG8gJ1VucXVvdGVkID06ICAgJyAiJHIiCitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cXGIvJHN9Igorcj0iJHt2L1xcYi8kc30iCitlY2hvICdRdW90ZWQgPTogICAgICcgIiRyIgorCitlY2hvCisKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g1LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk5MDkwMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g1LnJpZ2h0CkBAIC0wLDAgKzEsMTEgQEAKKzEgYS8KKzIgYS9kCiszIGEvZS9mCis0IGFcCis1IGFcZAorNiBhXGVcZgorNyBhXFwKKzggYVxcZAorOSBhXFxlXFxmCithIGFiCitEb25lOiAwCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3NDhiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNS50ZXN0cwpAQCAtMCwwICsxLDI5IEBACisjIFRoaXMgdGVzdGNhc2UgY2hlY2tzIHdoZXRoZXIgc2xhc2hlcyBpbiAke3YvYS9ifSBhcmUgcGFyc2VkIGJlZm9yZQorIyBvciBhZnRlciBleHBhbnNpb25zCisKK3Y9J2EvYi9jJworcz0nYi9jJworcj0nZS9mJworZWNobyAiMSAke3YvJHN9IgorZWNobyAiMiAke3YvJHMvZH0iCitlY2hvICIzICR7di8kcy8kcn0iCisKK3Y9J2FcYlxjJworcz0nYlxcYycKK3I9J2VcZicKK2VjaG8gIjQgJHt2LyRzfSIKK2VjaG8gIjUgJHt2LyRzL2R9IgorZWNobyAiNiAke3YvJHMvJHJ9IgorCit2PSdhXFxiXFxjJworcz0nYlxcXFxjJworcj0nZVxcZicKK2VjaG8gIjcgJHt2LyRzfSIKK2VjaG8gIjggJHt2LyRzL2R9IgorZWNobyAiOSAke3YvJHMvJHJ9IgorCit2PSdhLSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LWInCitzPSctJGEtXFx0LVxcXFwtXFwiLVxcYC1cXC0tXFx6LVxcXCotXFxcPy0nCitlY2hvICJhICR7di8kc30iCisKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g2LnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDYucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmYzIzZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g2LnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAorRXhwZWN0ZWQgQWN0dWFsCithKnogICAgOiBhKnoKK1x6ICAgICA6IFx6CithMXogYTJ6OiBhMXogYTJ6Cit6ICAgICAgOiB6CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g2LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmMmU0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNi50ZXN0cwpAQCAtMCwwICsxLDkgQEAKKyMgVGhpcyB0ZXN0Y2FzZSBjaGVja3MgZ2xvYmJpbmcgY29ycmVjdG5lc3MgaW4gJHt2L2EvYn0KKworPmExejsgPmEyejsKKyAgICAgICAgICBlY2hvICdFeHBlY3RlZCcgJ0FjdHVhbCcKK3Y9J2EgYnonOyBlY2hvICdhKnogICAgOicgIiR7di9hKnovYSp6fSIKK3Y9J2EgYnonOyBlY2hvICdceiAgICAgOicgIiR7di9hKnovXHp9Igordj0nYSBieic7IGVjaG8gJ2ExeiBhMno6JyAke3YvYSp6L2Eqen0KK3Y9J2EgYnonOyBlY2hvICd6ICAgICAgOicgJHt2L2Eqei9cen0KK3JtIGExeiBhMnoKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9hc3NpZ24ucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MjIxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAorLiAuCisuYWJjIGQgZS4KKy5hYmMgZCBlLgorLmFiYyBkIGUuCisuYWJjIGQgZS4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9hc3NpZ24udGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4Y2RjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnRlc3RzCkBAIC0wLDAgKzEsMTUgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgYWJjICJkIGUiCitmaQorCitzcGFjZT0nICcKK2VjaG8gLiRzcGFjZS4KKworYT0kKgorZWNobyAuJGEuCithPSRACitlY2hvIC4kYS4KK2E9IiQqIgorZWNobyAuJGEuCithPSIkQCIKK2VjaG8gLiRhLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX3JlZGlyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX3JlZGlyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzI5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fcmVkaXIucmlnaHQKQEAgLTAsMCArMSwzIEBACitURVNUMQorVEVTVDIKK1RFU1QzCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fcmVkaXIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fcmVkaXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRhNmJkZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9yZWRpci50ZXN0cwpAQCAtMCwwICsxLDEzIEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIGFiYyAiZCBlIgorZmkKKworZWNobyBURVNUMSA+IiQxLm91dCIKK2VjaG8gVEVTVDIgPiIkMi5vdXQiCisjIGJhc2ggc2F5czogIiRALm91dCI6IGFtYmlndW91cyByZWRpcmVjdAorIyBhc2ggaGFuZGxlcyBpdCBhcyBpZiBpdCBpcyAnJConIC0gd2UgZG8gdGhlIHNhbWUKK2VjaG8gVEVTVDMgPiIkQC5vdXQiCisKK2NhdCBhYmMub3V0ICJkIGUub3V0IiAiYWJjIGQgZS5vdXQiCisKK3JtIGFiYy5vdXQgImQgZS5vdXQiICJhYmMgZCBlLm91dCIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9vbl9pZnMucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfb25faWZzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDIwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfb25faWZzLnJpZ2h0CkBAIC0wLDAgKzEsOSBAQAorMSBhIGIgYworMiBhICsgYiBjCiszIGEgYiBjCis0IGEgIGIgYworNSBhICBiIGMKKzYgYSBiICsgYworNyBhIGIgYworOCBhIGIgIGMKKzkgYSBiICBjCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfb25faWZzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX29uX2lmcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMTJmZjhlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX29uX2lmcy50ZXN0cwpAQCAtMCwwICsxLDExIEBACitiPScgYiAnCitlPScnCitlY2hvIDEgYSAkYiBjCitlY2hvIDIgYSArJGIgYworZWNobyAzIGEgJGUkYiBjCitlY2hvIDQgYSAiJGUiJGIgYworZWNobyA1IGEgIiIkYiBjCitlY2hvIDYgYSAkYisgYworZWNobyA3IGEgJGIkZSBjCitlY2hvIDggYSAkYiIkZSIgYworZWNobyA5IGEgJGIiIiBjCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9pbl9waXBlcy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2luX3BpcGVzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjY1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9pbl9waXBlcy5yaWdodApAQCAtMCwwICsxLDYgQEAKK2I9MQorYj0yCitiPTMKK2I9NAorYj01CitiPTYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2luX3BpcGVzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfaW5fcGlwZXMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Y4Y2QyNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2luX3BpcGVzLnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorYj0xIGVudiB8IGdyZXAgXmI9Cit0cnVlIHwgYj0yIGVudiB8IGdyZXAgXmI9CithPTEgdHJ1ZSB8IGI9MyBlbnYgfCBncmVwIF5iPQorCisoYj00IGVudikgfCBncmVwIF5iPQorKHRydWUgfCBiPTUgZW52KSB8IGdyZXAgXmI9CisoYT0xIHRydWUgfCBiPTYgZW52KSB8IGdyZXAgXmI9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9sZWFrcy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2xlYWtzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmJhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9sZWFrcy5yaWdodApAQCAtMCwwICsxIEBACitPSwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfbGVha3MudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9sZWFrcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yN2M4YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfbGVha3MudGVzdHMKQEAgLTAsMCArMSwxNCBAQAorIyBleHRlcm5hbCBwcm9ncmFtCithPWIgL2Jpbi90cnVlCitlbnYgfCBncmVwIF5hPQorCisjIGJ1aWx0aW4KK2E9YiB0cnVlCitlbnYgfCBncmVwIF5hPQorCisjIGV4ZWMgd2l0aCByZWRpcmVjdGlvbiBvbmx5CisjIGluIGJhc2gsIHRoaXMgbGVha3MhCithPWIgZXhlYyAxPiYxCitlbnYgfCBncmVwIF5hPQorCitlY2hvIE9LCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wb3NpeDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wb3NpeDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmNjE4YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3Bvc2l4MS5yaWdodApAQCAtMCwwICsxLDQxIEBACitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK2FiY2RjZAorYWJjZGNkCithYmNkY2QKK2NkY2QKK2JhYmNkY2QKK2JhYmNkY2QKK2FiYWJjZGNkCitFbXB0eToKK2FiYWJjZGNkfV90YWlsCithYmFiY2RjZF90YWlsCithYmFiY2QKK2FiYWJjZAorYWJhYmNkCithYmFiCithYmFiY2RjCithYmFiY2RjCithYmFiY2RjZAorRW1wdHk6CithYmFiY2RjZH1fdGFpbAorYWJhYmNkY2RfdGFpbAorYWJhYmNkY2QKK2FiCithYgorYWIKK0VuZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcG9zaXgxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcG9zaXgxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyYWJlODEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wb3NpeDEudGVzdHMKQEAgLTAsMCArMSw1MiBAQAordW5zZXQgdmFyCisKK2VjaG8gRW1wdHk6JHt2YXIjfQorZWNobyBFbXB0eToke3ZhciMjfQorZWNobyBFbXB0eToke3ZhciMqfQorZWNobyBFbXB0eToke3ZhciMjKn0KK2VjaG8gRW1wdHk6JHt2YXIlfQorZWNobyBFbXB0eToke3ZhciUlfQorZWNobyBFbXB0eToke3ZhciUqfQorZWNobyBFbXB0eToke3ZhciUlKn0KKwordmFyPQorCitlY2hvIEVtcHR5OiR7dmFyI30KK2VjaG8gRW1wdHk6JHt2YXIjI30KK2VjaG8gRW1wdHk6JHt2YXIjKn0KK2VjaG8gRW1wdHk6JHt2YXIjIyp9CitlY2hvIEVtcHR5OiR7dmFyJX0KK2VjaG8gRW1wdHk6JHt2YXIlJX0KK2VjaG8gRW1wdHk6JHt2YXIlKn0KK2VjaG8gRW1wdHk6JHt2YXIlJSp9CisKK3Zhcj1hYmFiY2RjZAorCitlY2hvICR7dmFyI2FifQorZWNobyAke3ZhciMjYWJ9CitlY2hvICR7dmFyI2EqYn0KK2VjaG8gJHt2YXIjI2EqYn0KK2VjaG8gJHt2YXIjP30KK2VjaG8gJHt2YXIjIz99CitlY2hvICR7dmFyIyp9CitlY2hvIEVtcHR5OiR7dmFyIyMqfQorZWNobyAke3ZhciN9fV90YWlsCitlY2hvICR7dmFyI1x9fV90YWlsCisKK2VjaG8gJHt2YXIlY2R9CitlY2hvICR7dmFyJSVjZH0KK2VjaG8gJHt2YXIlYypkfQorZWNobyAke3ZhciUlYypkfQorZWNobyAke3ZhciU/fQorZWNobyAke3ZhciUlP30KK2VjaG8gJHt2YXIlKn0KK2VjaG8gRW1wdHk6JHt2YXIlJSp9CitlY2hvICR7dmFyI319X3RhaWwKK2VjaG8gJHt2YXIjXH19X3RhaWwKK2VjaG8gJHt2YXIlXFwqfQorCithPWFifTsgZWNobyAke2ElXH19OworYT1hYmM7IGM9YzsgZWNobyAke2ElJHtjfX0KK2E9YWJ7e2M7IGVjaG8gJHthJWBlY2hvIHt7Y2B9CisKK2VjaG8gRW5kCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wcmVzZXJ2ZWQucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wcmVzZXJ2ZWQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5OTE3YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3ByZXNlcnZlZC5yaWdodApAQCAtMCwwICsxLDQgQEAKK2E9YgorYT1iCithPWIKK09LCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wcmVzZXJ2ZWQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wcmVzZXJ2ZWQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWJkZGQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3ByZXNlcnZlZC50ZXN0cwpAQCAtMCwwICsxLDE2IEBACitleHBvcnQgYT1iCisKKyMgZXh0ZXJuYWwgcHJvZ3JhbQorYT1jIC9iaW4vdHJ1ZQorZW52IHwgZ3JlcCBeYT0KKworIyBidWlsdGluCithPWQgdHJ1ZQorZW52IHwgZ3JlcCBeYT0KKworIyBleGVjIHdpdGggcmVkaXJlY3Rpb24gb25seQorIyBpbiBiYXNoLCB0aGlzIGxlYWtzIQorYT1lIGV4ZWMgMT4mMQorZW52IHwgZ3JlcCBeYT0KKworZWNobyBPSwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc2VyaWFsLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc2VyaWFsLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYWEzMzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zZXJpYWwucmlnaHQKQEAgLTAsMCArMSw1IEBACitBc3NpZ25tZW50cyBvbmx5OiBjPWEKK0Fzc2lnbm1lbnRzIGFuZCBhIGNvbW1hbmQ6IGM9YQorQXNzaWdubWVudHMgYW5kIGEgYnVpbHRpbjogYz1hCitBc3NpZ25tZW50cyBhbmQgYSBmdW5jdGlvbjogYz1hCitEb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zZXJpYWwudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zZXJpYWwudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmI0YTRjZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3NlcmlhbC50ZXN0cwpAQCAtMCwwICsxLDIyIEBACithPWEKKworYj1iCitjPWMKKyMgU2Vjb25kIGFzc2lnbm1lbnQgZGVwZW5kcyBvbiB0aGUgZmlyc3Q6CitiPSRhIGM9JGIKK2VjaG8gQXNzaWdubWVudHMgb25seTogYz0kYworCitiPWIKK2M9YworYj0kYSBjPSRiICIkVEhJU19TSCIgLWMgJ2VjaG8gQXNzaWdubWVudHMgYW5kIGEgY29tbWFuZDogYz0kYycKKworYj1iCitjPWMKK2I9JGEgYz0kYiBldmFsICdlY2hvIEFzc2lnbm1lbnRzIGFuZCBhIGJ1aWx0aW46IGM9JGMnCisKK2I9YgorYz1jCitmKCkgeyBlY2hvIEFzc2lnbm1lbnRzIGFuZCBhIGZ1bmN0aW9uOiBjPSRjOyB9CitiPSRhIGM9JGIgZgorCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGFjYTFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnJpZ2h0CkBAIC0wLDAgKzEsNDAgQEAKK1Rlc3Rpbmc6IGluIHggeSB6CisueC4KKy55LgorLnouCitUZXN0aW5nOiBpbiB1ICRlbXB0eSB2CisudS4KKy52LgorVGVzdGluZzogaW4gdSAiICRlbXB0eSIgdgorLnUuCisuIC4KKy52LgorVGVzdGluZzogaW4gdSAkZW1wdHkgJGVtcHR5JGEgdgorLnUuCisuYS4KKy52LgorVGVzdGluZzogaW4gJGFfYgorLmEuCisuYi4KK1Rlc3Rpbmc6IGluICQqCisuYWJjLgorLmQuCisuZS4KK1Rlc3Rpbmc6IGluICRACisuYWJjLgorLmQuCisuZS4KK1Rlc3Rpbmc6IGluIC0kKi0KKy4tYWJjLgorLmQuCisuZS0uCitUZXN0aW5nOiBpbiAtJEAtCisuLWFiYy4KKy5kLgorLmUtLgorVGVzdGluZzogaW4gJGFfYiAtJGFfYi0KKy5hLgorLmIuCisuLWEuCisuYi0uCitGaW5pc2hlZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzM2M2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IudGVzdHMKQEAgLTAsMCArMSw0MCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiBhYmMgImQgZSIKK2ZpCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIHggeSB6JworZm9yIGEgaW4geCB5IHo7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIHUgJGVtcHR5IHYnCitlbXB0eT0nJworZm9yIGEgaW4gdSAkZW1wdHkgdjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gdSAiICRlbXB0eSIgdicKK2VtcHR5PScnCitmb3IgYSBpbiB1ICIgJGVtcHR5IiB2OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiB1ICRlbXB0eSAkZW1wdHkkYSB2JworYT0nYScKK2ZvciBhIGluIHUgJGVtcHR5ICRlbXB0eSRhIHY7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRhX2InCithX2I9J2EgYicKK2ZvciBhIGluICRhX2I7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICQqJworZm9yIGEgaW4gJCo7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRAJworZm9yIGEgaW4gJEA7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIC0kKi0nCitmb3IgYSBpbiAtJCotOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAtJEAtJworZm9yIGEgaW4gLSRALTsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJGFfYiAtJGFfYi0nCithX2I9J2EgYicKK2ZvciBhIGluICRhX2IgLSRhX2ItOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvIEZpbmlzaGVkCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl91bmJhY2tzbGFzaC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3VuYmFja3NsYXNoLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzgzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl91bmJhY2tzbGFzaC5yaWdodApAQCAtMCwwICsxLDExIEBACitiMT0tcXdlcnR5LXQtXC0iLWAtLS16LSotPy0KK2IxPS1xd2VydHktdC1cLSItYC0tLXotKi0/LQorYjI9LXF3ZXJ0eS1cdC1cLSItYC1cLS1cei1cKi1cPy0KK2IyPS1xd2VydHktXHQtXC0iLWAtXC0tXHotXCotXD8tCitiMz0tJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tCitiMz0tJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tCitjPS0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0KK2M9LSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LQorYz0tJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tCitjPS0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0KK0RvbmU6IDAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3VuYmFja3NsYXNoLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfdW5iYWNrc2xhc2gudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmI1MmFmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3VuYmFja3NsYXNoLnRlc3RzCkBAIC0wLDAgKzEsMjMgQEAKKyMgVGVzdCBmb3IgY29ycmVjdCBoYW5kbGluZyBvZiBiYWNrc2xhc2hlcworYT1xd2VydHkKKworYj0tJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tCitlY2hvIGIxPSRiCitlY2hvICJiMT0kYiIKK2I9Ii0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0iCitlY2hvIGIyPSRiCitlY2hvICJiMj0kYiIKK2I9Jy0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0nCitlY2hvIGIzPSRiCitlY2hvICJiMz0kYiIKKworYz0kYgorZWNobyAiYz0kYyIKK2M9JHtifQorZWNobyAiYz0kYyIKK2M9IiRiIgorZWNobyAiYz0kYyIKK2M9IiR7Yn0iCitlY2hvICJjPSRjIgorCitlY2hvICJEb25lOiAkPyIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDEucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwxLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorV2FybSB1cAorTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uCitPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjgyMDdjZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDEudGVzdHMKQEAgLTAsMCArMSwxNDggQEAKKyMgIkNoZWNrIG1hbnkgbGVha3MiIHRlc3QgIzEKKyMgQ3JhbW1pbmcgYWxsIGtpbmRzIG9mIHdlaXJkIGNvbW1hbmRzIGluIGhlcmUuCisjIEFzIHlvdSBmaW5kIGxlYWtzLCBwbGVhc2UgY3JlYXRlIHNlcGFyYXRlLCBzbWFsbCB0ZXN0CisjIGZvciBlYWNoIGxlYWsuCisjIE5hcnJvd2luZyBkb3duIHRoZSBsZWFrIHVzaW5nIHRoaXMgbGFyZ2UgdGVzdCBtYXkgYmUgZGlmZmljdWx0LgorIyBJdCBpcyBpbnRlbmRlZCB0byBiZSBhIGJsYW5rZXQgImlzIGV2ZXJ5dGhpbmcgb2s/IiB0ZXN0CisKK2VjaG8gIldhcm0gdXAiCitpPTEKK2w9MQordD0xCitleHBvcnQgdAord2hpbGUgdGVzdCAkaSAhPSA5OTsgZG8KKyAgICB0PXZhbHVlMV8kaTsgdD12YWx1ZTJfJGkgdHJ1ZTsgdD12YWx1ZTNfJGkgL2Jpbi90cnVlOyB0PXZhbHVlNF8kaSBleGVjIDE+JjEKKyAgICB7IHQ9dmFsdWUzXyRpIC9iaW4vdHJ1ZTsgfSA8L2Rldi9udWxsCisgICAgaWYgdHJ1ZTsgdD12YWx1ZUFfJGkgZmFsc2UgPj4vZGV2L251bGw7IHRydWU7IHRoZW4KKwk6IDw8IEhFUkUgPi9kZXYvbnVsbDsgdHJ1ZSA8PEhFUkUKK0hlbGxvIGJ1aWx0aW4gOgorSEVSRQorSGVsbG8gJGkgdHJ1ZQorSEVSRQorICAgIGVsaWYgZmFsc2U7IHRoZW4KKwl0cnVlOyBlY2hvIERvZXNudCBydW4KKyAgICBlbHNlCisJeyB0cnVlOyB9OyBlY2hvIERvZXNudCBydW4gdG9vID4+L2Zvby9iYXIKKyAgICBmaQorICAgIHsgOiAvYmluLyo7IH0KKyAgICB1bnNldCB2YXIKKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlKn0KKyAgICB2YXI9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyI30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjI30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJX0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJX0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJSp9CisgICAgdmFyPWFiYWJjZGNkCisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyI2FifQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjYWJ9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyI2EqYn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjI2EqYn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjP30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjIz99CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciVjZH0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJWNkfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciVjKmR9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSVjKmR9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJT99CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSU/fQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlKn0KKyAgICBzZXQgLS0gcGFyMV8kaSBwYXIyXyRpIHBhcjNfJGkgcGFyNF8kaQorICAgIHRyYXAgImVjaG8gdHJhcCRpIiBXSU5DSAorICAgIGYoKSB7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IH0KKyAgICBmKCkgeyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyBlY2hvICQxOyB9CisgICAgaT1paWkkaSB0PXR0dCRpIHo9enp6JGkgZiA+L2Rldi9udWxsCisgICAgOiAkKChpKyspKQorZG9uZQordW5zZXQgaSBsIHQKK3Vuc2V0IC1mIGYKKworbWVtbGVhaworCitlY2hvICJNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4iCisjIFBsZWFzZSBjb3B5IHRoZSBlbnRpcmUgYmxvY2sgZnJvbSBhYm92ZSB2ZXJiYXRpbQoraT0xCitsPTEKK3Q9MQorZXhwb3J0IHQKK3doaWxlIHRlc3QgJGkgIT0gOTk7IGRvCisgICAgdD12YWx1ZTFfJGk7IHQ9dmFsdWUyXyRpIHRydWU7IHQ9dmFsdWUzXyRpIC9iaW4vdHJ1ZTsgdD12YWx1ZTRfJGkgZXhlYyAxPiYxCisgICAgeyB0PXZhbHVlM18kaSAvYmluL3RydWU7IH0gPC9kZXYvbnVsbAorICAgIGlmIHRydWU7IHQ9dmFsdWVBXyRpIGZhbHNlID4+L2Rldi9udWxsOyB0cnVlOyB0aGVuCisJOiA8PCBIRVJFID4vZGV2L251bGw7IHRydWUgPDxIRVJFCitIZWxsbyBidWlsdGluIDoKK0hFUkUKK0hlbGxvICRpIHRydWUKK0hFUkUKKyAgICBlbGlmIGZhbHNlOyB0aGVuCisJdHJ1ZTsgZWNobyBEb2VzbnQgcnVuCisgICAgZWxzZQorCXsgdHJ1ZTsgfTsgZWNobyBEb2VzbnQgcnVuIHRvbyA+Pi9mb28vYmFyCisgICAgZmkKKyAgICB7IDogL2Jpbi8qOyB9CisgICAgdW5zZXQgdmFyCisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyI30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjI30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJX0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJX0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJSp9CisgICAgdmFyPQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciN9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyN9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciV9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSV9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSUqfQorICAgIHZhcj1hYmFiY2RjZAorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciNhYn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjI2FifQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciNhKmJ9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyNhKmJ9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIz99CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyM/fQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlY2R9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSVjZH0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlYypkfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlYypkfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciU/fQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlP30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJSp9CisgICAgc2V0IC0tIHBhcjFfJGkgcGFyMl8kaSBwYXIzXyRpIHBhcjRfJGkKKyAgICB0cmFwICJlY2hvIHRyYXAkaSIgV0lOQ0gKKyAgICBmKCkgeyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB9CisgICAgZigpIHsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgZWNobyAkMTsgfQorICAgIGk9aWlpJGkgdD10dHQkaSB6PXp6eiRpIGYgPi9kZXYvbnVsbAorICAgIDogJCgoaSsrKSkKK2RvbmUKK3Vuc2V0IGkgbCB0Cit1bnNldCAtZiBmCisKKworbWVtbGVhawora2I9JD8KK2lmIHRlc3QgJGtiIC1sZSA0OyB0aGVuCisgICAgZWNobyBPayAjJGtiCitlbHNlCisgICAgZWNobyAiQmFkOiAka2Iga2IgbGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwyLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorV2FybSB1cAorTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uCitPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDUxZWE4MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDIudGVzdHMKQEAgLTAsMCArMSw5MyBAQAorIyAiQ2hlY2sgbWFueSBsZWFrcyIgdGVzdCAjMgorIyBDcmFtbWluZyBhbGwga2luZHMgb2Ygd2VpcmQgY29tbWFuZHMgaW4gaGVyZS4KKyMgQXMgeW91IGZpbmQgbGVha3MsIHBsZWFzZSBjcmVhdGUgc2VwYXJhdGUsIHNtYWxsIHRlc3QKKyMgZm9yIGVhY2ggbGVhay4KKyMgTmFycm93aW5nIGRvd24gdGhlIGxlYWsgdXNpbmcgdGhpcyBsYXJnZSB0ZXN0IG1heSBiZSBkaWZmaWN1bHQuCisjIEl0IGlzIGludGVuZGVkIHRvIGJlIGEgYmxhbmtldCAiaXMgZXZlcnl0aGluZyBvaz8iIHRlc3QKKworZWNobyAiV2FybSB1cCIKK2xvY2FsX3Zhcj0ibG9jYWwgdmFsIgorZXhwb3J0IGRldl9udWxsPSIvZGV2L251bGwiCis+JGRldl9udWxsCitlY2hvIGhpMSAkbG9jYWxfdmFyIGBlY2hvIGhvYCA+Pi9kZXYvbnVsbAorZWNobyBoaTIgJGxvY2FsX3ZhciA8L2Rldi9udWxsIHwgZWNobyAyPiYtIHwgY2F0IDE8Pi9kZXYvbnVsbAoreyBlY2hvIGhpNCAkbG9jYWxfdmFyIGBlY2hvIGhvYCAxPD4vZGV2L251bGw7IH0KKyggZWNobyBoaTQgJGxvY2FsX3ZhciBgZWNobyBob2AgMTw+L2Rldi9udWxsICkKK2lmIGVjaG8gJGxvY2FsX3ZhcjsgZmFsc2UKKyAgICB0aGVuIGVjaG8gbm90IHJ1bgorICAgIGVsaWYgZmFsc2UgPCRkZXZfbnVsbAorICAgIHRoZW4gbm9uZQorICAgIGVsc2UgY2F0IDA8PiRkZXZfbnVsbCAxPD4iJGRldl9udWxsIgorZmkgPj4vZGV2L251bGwKK3sKKyAgICBpZiBlY2hvICRsb2NhbF92YXI7IHRoZW4gY2F0IDw8SEVSRQorSGkgY2F0CitIRVJFCisgICAgZmkgPj4vZGV2L251bGwKK30gMTw+L2Rldi9udWxsCit3aGlsZSB7IGVjaG8gJGRldl9udWxsID4+JGRldl9udWxsOyB9OyBkbyBjYXQgPCIkZGV2X251bGwiOyBicmVhazsgZG9uZQorKCB1bnRpbCB7IGVjaG8gJGRldl9udWxsID4+JGRldl9udWxsIHwgZmFsc2U7IH07IGRvIGNhdCA8IiRkZXZfbnVsbCI7IGJyZWFrOyBkb25lICkgPCRkZXZfbnVsbAorZigpIHsgZWNobyAkMTsgfQorZiA+L2Rldi9udWxsCisKK21lbWxlYWsKKworZWNobyAiTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uIgorIyBQbGVhc2UgY29weSB0aGUgZW50aXJlIGJsb2NrIGZyb20gYWJvdmUgdmVyYmF0aW0KK2xvY2FsX3Zhcj0ibG9jYWwgdmFsIgorZXhwb3J0IGRldl9udWxsPSIvZGV2L251bGwiCis+JGRldl9udWxsCitlY2hvIGhpMSAkbG9jYWxfdmFyIGBlY2hvIGhvYCA+Pi9kZXYvbnVsbAorZWNobyBoaTIgJGxvY2FsX3ZhciA8L2Rldi9udWxsIHwgZWNobyAyPiYtIHwgY2F0IDE8Pi9kZXYvbnVsbAoreyBlY2hvIGhpNCAkbG9jYWxfdmFyIGBlY2hvIGhvYCAxPD4vZGV2L251bGw7IH0KKyggZWNobyBoaTQgJGxvY2FsX3ZhciBgZWNobyBob2AgMTw+L2Rldi9udWxsICkKK2lmIGVjaG8gJGxvY2FsX3ZhcjsgZmFsc2UKKyAgICB0aGVuIGVjaG8gbm90IHJ1bgorICAgIGVsaWYgZmFsc2UgPCRkZXZfbnVsbAorICAgIHRoZW4gbm9uZQorICAgIGVsc2UgY2F0IDA8PiRkZXZfbnVsbCAxPD4iJGRldl9udWxsIgorZmkgPj4vZGV2L251bGwKK3sKKyAgICBpZiBlY2hvICRsb2NhbF92YXI7IHRoZW4gY2F0IDw8SEVSRQorSGkgY2F0CitIRVJFCisgICAgZmkgPj4vZGV2L251bGwKK30gMTw+L2Rldi9udWxsCit3aGlsZSB7IGVjaG8gJGRldl9udWxsID4+JGRldl9udWxsOyB9OyBkbyBjYXQgPCIkZGV2X251bGwiOyBicmVhazsgZG9uZQorKCB1bnRpbCB7IGVjaG8gJGRldl9udWxsID4+JGRldl9udWxsIHwgZmFsc2U7IH07IGRvIGNhdCA8IiRkZXZfbnVsbCI7IGJyZWFrOyBkb25lICkgPCRkZXZfbnVsbAorZigpIHsgZWNobyAkMTsgfQorZiA+L2Rldi9udWxsCisKKyMgQW5kIHNhbWUgYWdhaW4KKworbG9jYWxfdmFyPSJsb2NhbCB2YWwiCitleHBvcnQgZGV2X251bGw9Ii9kZXYvbnVsbCIKKz4kZGV2X251bGwKK2VjaG8gaGkxICRsb2NhbF92YXIgYGVjaG8gaG9gID4+L2Rldi9udWxsCitlY2hvIGhpMiAkbG9jYWxfdmFyIDwvZGV2L251bGwgfCBlY2hvIDI+Ji0gfCBjYXQgMTw+L2Rldi9udWxsCit7IGVjaG8gaGk0ICRsb2NhbF92YXIgYGVjaG8gaG9gIDE8Pi9kZXYvbnVsbDsgfQorKCBlY2hvIGhpNCAkbG9jYWxfdmFyIGBlY2hvIGhvYCAxPD4vZGV2L251bGwgKQoraWYgZWNobyAkbG9jYWxfdmFyOyBmYWxzZQorICAgIHRoZW4gZWNobyBub3QgcnVuCisgICAgZWxpZiBmYWxzZSA8JGRldl9udWxsCisgICAgdGhlbiBub25lCisgICAgZWxzZSBjYXQgMDw+JGRldl9udWxsIDE8PiIkZGV2X251bGwiCitmaSA+Pi9kZXYvbnVsbAoreworICAgIGlmIGVjaG8gJGxvY2FsX3ZhcjsgdGhlbiBjYXQgPDxIRVJFCitIaSBjYXQKK0hFUkUKKyAgICBmaSA+Pi9kZXYvbnVsbAorfSAxPD4vZGV2L251bGwKK3doaWxlIHsgZWNobyAkZGV2X251bGwgPj4kZGV2X251bGw7IH07IGRvIGNhdCA8IiRkZXZfbnVsbCI7IGJyZWFrOyBkb25lCisoIHVudGlsIHsgZWNobyAkZGV2X251bGwgPj4kZGV2X251bGwgfCBmYWxzZTsgfTsgZG8gY2F0IDwiJGRldl9udWxsIjsgYnJlYWs7IGRvbmUgKSA8JGRldl9udWxsCitmKCkgeyBlY2hvICQxOyB9CitmID4vZGV2L251bGwKKworbWVtbGVhawora2I9JD8KK2lmIHRlc3QgJGtiIC1sZSA0OyB0aGVuCisgICAgZWNobyBPayAjJGtiCitlbHNlCisgICAgZWNobyAiQmFkOiAka2Iga2IgKG9yIG1vcmUpIGxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19lbXB0eV90aWNrLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfZW1wdHlfdGljay5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfZW1wdHlfdGljay5yaWdodApAQCAtMCwwICsxLDMgQEAKK1dhcm0gdXAKK01lYXN1cmluZyBtZW1vcnkgbGVhay4uLgorT2sKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2VtcHR5X3RpY2sudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19lbXB0eV90aWNrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlMzc1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19lbXB0eV90aWNrLnRlc3RzCkBAIC0wLDAgKzEsMjggQEAKK2VjaG8gIldhcm0gdXAiCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gOTsgZG8KKyAgICBgdHJ1ZWAKKyAgICA6ICQoKGkrKykpCitkb25lCisKK21lbWxlYWsKKworZWNobyAiTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uIgoraT0xCit3aGlsZSB0ZXN0ICRpICE9IDE5OTsgZG8KKyAgICBgdHJ1ZWAKKyAgICA6ICQoKGkrKykpCitkb25lCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gMTk5OyBkbworICAgIGB0cnVlYAorICAgIDogJCgoaSsrKSkKK2RvbmUKKworbWVtbGVhawora2I9JD8KK2lmIHRlc3QgJGtiIC1sZSA0OyB0aGVuCisgICAgZWNobyBPayAjJGtiCitlbHNlCisgICAgZWNobyAiQmFkOiAka2Iga2IgKG9yIG1vcmUpIGxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19oZXJlZG9jMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2hlcmVkb2MxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19oZXJlZG9jMS5yaWdodApAQCAtMCwwICsxLDMgQEAKK1dhcm0gdXAKK01lYXN1cmluZyBtZW1vcnkgbGVhay4uLgorT2sKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2hlcmVkb2MxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfaGVyZWRvYzEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjZjYmIyOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2hlcmVkb2MxLnRlc3RzCkBAIC0wLDAgKzEsMzQgQEAKK2VjaG8gIldhcm0gdXAiCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gOTk7IGRvCisgICAgOiA8PEhFUkUKK0hlbGxvICRpIGBlY2hvIGJ1aWx0aW5fJGlgCitIRVJFCisgICAgOiAkKChpKyspKQorZG9uZQorCittZW1sZWFrCisKK2VjaG8gIk1lYXN1cmluZyBtZW1vcnkgbGVhay4uLiIKK2k9MQord2hpbGUgdGVzdCAkaSAhPSA5OTsgZG8KKyAgICA6IDw8SEVSRQorSGVsbG8gJGkgYGVjaG8gYnVpbHRpbl8kaWAKK0hFUkUKKyAgICA6ICQoKGkrKykpCitkb25lCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gOTk7IGRvCisgICAgOiA8PEhFUkUKK0hlbGxvICRpIGBlY2hvIGJ1aWx0aW5fJGlgCitIRVJFCisgICAgOiAkKChpKyspKQorZG9uZQorCittZW1sZWFrCitrYj0kPworaWYgdGVzdCAka2IgLWxlIDQ7IHRoZW4KKyAgICBlY2hvIE9rICMka2IKK2Vsc2UKKyAgICBlY2hvICJCYWQ6ICRrYiBrYiAob3IgbW9yZSkgbGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3Zhci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3Zhci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDRkNmZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uCitPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxYzA5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIudGVzdHMKQEAgLTAsMCArMSw0NyBAQAorZWNobyAiTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uIgoraT0xCit3aGlsZSB0ZXN0ICRpICE9IFg7IGRvCisgICAgdW5zZXQgdAorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCisgICAgZXhwb3J0IHQKKyAgICB1bnNldCB0CisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKKyAgICBleHBvcnQgdAorICAgIHVuc2V0IHQKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorICAgIGV4cG9ydCB0CisgICAgdW5zZXQgdAorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCisgICAgZXhwb3J0IHQKKyAgICB1bnNldCB0CisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKKyAgICBleHBvcnQgdAorICAgIGk9MSRpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE7IHRoZW4gaT0yOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyOyB0aGVuIGk9MzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMzsgdGhlbiBpPTQ7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTQ7IHRoZW4gaT01OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE1OyB0aGVuIGk9NjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNjsgdGhlbiBpPTc7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTc7IHRoZW4gaT04OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE4OyB0aGVuIGk9OTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOTsgdGhlbiBpPWE7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWE7IHRoZW4gaT1iOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFiOyB0aGVuIGk9YzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExYzsgdGhlbiBpPWQ7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWQ7IHRoZW4gaT1lOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFlOyB0aGVuIGk9ZjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZjsgdGhlbiBpPWc7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWc7IHRoZW4gaT1oOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFoOyB0aGVuIGk9aTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExaTsgdGhlbiBpPWo7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWo7IHRoZW4gaT1YOyBmaQorICAgIG1lbWxlYWsKK2RvbmUKK21lbWxlYWsKK2tiPSQ/CitpZiB0ZXN0ICRrYiAtbGUgNDsgdGhlbgorICAgIGVjaG8gT2sKK2Vsc2UKKyAgICBlY2hvICJCYWQ6ICRrYiBrYiAob3IgbW9yZSkgbGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIyLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorV2FybSB1cAorTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uCitPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMi50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjExNjY2YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjIudGVzdHMKQEAgLTAsMCArMSw0MyBAQAorZWNobyAiV2FybSB1cCIKK3Q9MQorZXhwb3J0IHQKK2k9MQord2hpbGUgdGVzdCAkaSAhPSBYOyBkbworICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwJGkKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSRpIHRydWUKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMiRpIC9iaW4vdHJ1ZQorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEzJGkgZXhlYyAxPiYxCisgICAgaT0xJGkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTsgdGhlbiBpPTI7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTI7IHRoZW4gaT0zOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEzOyB0aGVuIGk9NDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNDsgdGhlbiBpPVg7IGZpCitkb25lCit1bnNldCB0IGkKKworbWVtbGVhaworCitlY2hvICJNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4iCit0PTEKK2V4cG9ydCB0CitpPTEKK3doaWxlIHRlc3QgJGkgIT0gWDsgZG8KKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCRpCisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEkaSB0cnVlCisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIkaSAvYmluL3RydWUKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMyRpIGV4ZWMgMT4mMQorICAgIGk9MSRpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE7IHRoZW4gaT0yOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyOyB0aGVuIGk9MzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMzsgdGhlbiBpPTQ7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTQ7IHRoZW4gaT1YOyBmaQorZG9uZQordW5zZXQgdCBpCisKK21lbWxlYWsKK2tiPSQ/CitpZiB0ZXN0ICRrYiAtbGUgNDsgdGhlbgorICAgIGVjaG8gT2sKK2Vsc2UKKyAgICBlY2hvICJCYWQ6ICRrYiBrYiAob3IgbW9yZSkgbGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjMucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIzLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorV2FybSB1cAorTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uCitPawpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTU1NGM0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjMudGVzdHMKQEAgLTAsMCArMSw0MSBAQAorIyBXYXMgc2VlbiBsZWFraW5nIG9uIE5PTU1VIGJ1aWxkCisKK2VjaG8gIldhcm0gdXAiCitpPTE7IHQ9MTsgZXhwb3J0IHQKK3doaWxlIHRlc3QgJGkgIT0gNDAwOyBkbworICAgIHQ9dmFsdWVBXyRpIHRydWUKKyAgICA6ICQoKGkrKykpCitkb25lCisKK21lbWxlYWsKK2VjaG8gIk1lYXN1cmluZyBtZW1vcnkgbGVhay4uLiIKKworIyBQbGVhc2UgY29weSB0aGUgZW50aXJlIGJsb2NrIGZyb20gYWJvdmUgdmVyYmF0aW0KK2k9MTsgdD0xOyBleHBvcnQgdAord2hpbGUgdGVzdCAkaSAhPSA0MDA7IGRvCisgICAgdD12YWx1ZUFfJGkgdHJ1ZQorICAgIDogJCgoaSsrKSkKK2RvbmUKK2k9MTsgdD0xOyBleHBvcnQgdAord2hpbGUgdGVzdCAkaSAhPSA0MDA7IGRvCisgICAgdD12YWx1ZUFfJGkgdHJ1ZQorICAgIDogJCgoaSsrKSkKK2RvbmUKK2k9MTsgdD0xOyBleHBvcnQgdAord2hpbGUgdGVzdCAkaSAhPSA0MDA7IGRvCisgICAgdD12YWx1ZUFfJGkgdHJ1ZQorICAgIDogJCgoaSsrKSkKK2RvbmUKK2k9MTsgdD0xOyBleHBvcnQgdAord2hpbGUgdGVzdCAkaSAhPSA0MDA7IGRvCisgICAgdD12YWx1ZUFfJGkgdHJ1ZQorICAgIDogJCgoaSsrKSkKK2RvbmUKKworbWVtbGVhawora2I9JD8KK2lmIHRlc3QgJGtiIC1sZSA0OyB0aGVuCisgICAgZWNobyBPayAjJGtiCitlbHNlCisgICAgZWNobyAiQmFkOiAka2Iga2IgKG9yIG1vcmUpIGxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvcnVuLWFsbCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL2h1c2hfdGVzdC9ydW4tYWxsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0YTdhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9odXNoX3Rlc3QvcnVuLWFsbApAQCAtMCwwICsxLDEwNSBAQAorIyEvYmluL3NoCisKK3Vuc2V0IExBTkcgTEFOR1VBR0UKK3Vuc2V0IExDX0NPTExBVEUKK3Vuc2V0IExDX0NUWVBFCit1bnNldCBMQ19NT05FVEFSWQordW5zZXQgTENfTUVTU0FHRVMKK3Vuc2V0IExDX05VTUVSSUMKK3Vuc2V0IExDX1RJTUUKK3Vuc2V0IExDX0FMTAorCitpZiB0ZXN0ICEgLXggaHVzaDsgdGhlbgorCWlmIHRlc3QgISAteCAuLi8uLi9idXN5Ym94OyB0aGVuCisJCWVjaG8gIkNhbid0IHJ1biB0ZXN0cy4gUHV0IGh1c2ggYmluYXJ5IGludG8gdGhpcyBkaXJlY3RvcnkgKGBwd2RgKSIKKwkJZXhpdCAxCisJZmkKKwllY2hvICJObyAuL2h1c2ggLSBjcmVhdGluZyBhIGxpbmsgdG8gLi4vLi4vYnVzeWJveCIKKwlsbiAtcyAuLi8uLi9idXN5Ym94IGh1c2gKK2ZpCitpZiB0ZXN0ICEgLWYgLmNvbmZpZzsgdGhlbgorCWlmIHRlc3QgISAtZiAuLi8uLi8uY29uZmlnOyB0aGVuCisJCWVjaG8gIk1pc3NpbmcgLmNvbmZpZyBmaWxlIgorCQlleGl0IDEKKwlmaQorCWNwIC4uLy4uLy5jb25maWcgLiB8fCBleGl0IDEKK2ZpCisKK2V2YWwgJChzZWQgLWUgJy9eIy9kJyAtZSAnL14kL2QnIC1lICdzOl46ZXhwb3J0IDonIC5jb25maWcpCisKK1BBVEg9ImBwd2RgOiRQQVRIIiAjIGZvciBodXNoIGFuZCByZWNoby96ZWNoby9wcmludGVudgorZXhwb3J0IFBBVEgKKworVEhJU19TSD0iYHB3ZGAvaHVzaCIKK2V4cG9ydCBUSElTX1NICisKK2RvX3Rlc3QoKQoreworCXRlc3QgLWQgIiQxIiB8fCByZXR1cm4gMAorCWQ9JHtkJS99CisjCWVjaG8gUnVubmluZyB0ZXN0cyBpbiBkaXJlY3RvcnkgIiQxIgorCSgKKwl0cmV0PTAKKwljZCAiJDEiIHx8IHsgZWNobyAiY2Fubm90IGNkICQxISI7IGV4aXQgMTsgfQorCWZvciB4IGluIHJ1bi0qOyBkbworCQl0ZXN0IC1mICIkeCIgfHwgY29udGludWUKKwkJY2FzZSAiJHgiIGluCisJCQkiJDAifHJ1bi1taW5pbWFsfHJ1bi1ncHJvZikgOzsKKwkJCSoub3JpZ3wqfikgOzsKKwkJCSMqKSBlY2hvICR4IDsgc2ggJHggOzsKKwkJCSopCisJCQllY2hvIC1uICIkMS8keDoiCisJCQlzaCAiJHgiID4iLi4vJDEtJHguZmFpbCIgMj4mMSAmJiBcCisJCQl7IHsgZWNobyAiIG9rIjsgcm0gIi4uLyQxLSR4LmZhaWwiOyB9IHx8IGVjaG8gIiBmYWlsIjsgfQorCQkJOzsKKwkJZXNhYworCWRvbmUKKwkjIE1hbnkgYmFzaCBydW4tWFhYIHNjcmlwdHMganVzdCBkbyB0aGlzLAorCSMgbm8gcG9pbnQgaW4gZHVwbGljYXRpb24gaXQgYWxsIG92ZXIgdGhlIHBsYWNlCisJZm9yIHggaW4gKi50ZXN0czsgZG8KKwl0ZXN0IC14ICIkeCIgfHwgY29udGludWUKKwluYW1lPSIke3glJS50ZXN0c30iCisJdGVzdCAtZiAiJG5hbWUucmlnaHQiIHx8IGNvbnRpbnVlCisjCWVjaG8gUnVubmluZyB0ZXN0OiAiJHgiCisJZWNobyAtbiAiJDEvJHg6IgorCSgKKwkJIiRUSElTX1NIIiAiLi8keCIgPiIkbmFtZS54eCIgMj4mMQorCQkjIGZpbHRlciBDIGxpYnJhcnkgZGlmZmVyZW5jZXMKKwkJc2VkIC1pIFwKKwkJCS1lICIvOiBpbnZhbGlkIG9wdGlvbiAvczonOjpnIiBcCisJCQkiJG5hbWUueHgiCisJCXRlc3QgJD8gLWVxIDc3ICYmIHJtIC1mICIuLi8kMS0keC5mYWlsIiAmJiBleGl0IDc3CisJCWRpZmYgLXUgIiRuYW1lLnh4IiAiJG5hbWUucmlnaHQiID4iLi4vJDEtJHguZmFpbCIgJiYgcm0gLWYgIiRuYW1lLnh4IiAiLi4vJDEtJHguZmFpbCIKKwkpCisJY2FzZSAkPyBpbgorCQkwKSAgZWNobyAiIG9rIjs7CisJCTc3KSBlY2hvICIgc2tpcCAoZmVhdHVyZSBkaXNhYmxlZCkiOzsKKwkJKikgIGVjaG8gIiBmYWlsIjsgdHJldD0xOzsKKwllc2FjCisJZG9uZQorCWV4aXQgJHt0cmV0fQorCSkKK30KKworIyBNYWluIHBhcnQgb2YgdGhpcyBzY3JpcHQKKyMgVXNhZ2U6IHJ1bi1hbGwgW2RpcmVjdG9yaWVzXQorCityZXQ9MAorCitpZiBbICQjIC1sdCAxIF07IHRoZW4KKwkjIEFsbCBzdWIgZGlyZWN0b3JpZXMKKwltb2R1bGVzPWBscyAtZCBodXNoLSpgCisKKwlmb3IgbW9kdWxlIGluICRtb2R1bGVzOyBkbworCWRvX3Rlc3QgJG1vZHVsZSB8fCByZXQ9MQorCWRvbmUKK2Vsc2UKKwl3aGlsZSBbICQjIC1nZSAxIF07IGRvCisJaWYgWyAtZCAkMSBdOyB0aGVuCisJCWRvX3Rlc3QgJDEgfHwgcmV0PTEKKwlmaQorCXNoaWZ0CisJZG9uZQorZmkKKworZXhpdCAke3JldH0KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21hdGNoLmMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTNjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tYXRjaC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogIyMvJSUgdmFyaWFibGUgbWF0Y2hpbmcgY29kZSByaXBwZWQgb3V0IG9mIGFzaCBzaGVsbCBmb3IgY29kZSBzaGFyaW5nCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKiB3YXMgcmUtcG9ydGVkIGZyb20gTmV0QlNEIGFuZCBkZWJpYW5pemVkLgorICovCisjaWZkZWYgU1RBTkRBTE9ORQorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGRlZmluZSBGQVNUX0ZVTkMgLyogbm90aGluZyAqLworIyBkZWZpbmUgUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIFBPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZIC8qIG5vdGhpbmcgKi8KKyNlbHNlCisjIGluY2x1ZGUgImxpYmJiLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSAibWF0Y2guaCIKKworY2hhciogRkFTVF9GVU5DIHNjYW5fYW5kX21hdGNoKGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqcGF0dGVybiwgdW5zaWduZWQgZmxhZ3MpCit7CisJY2hhciAqbG9jOworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwlpbnQgZWFybHlfZXhpdDsKKworCS8qIFdlIGNhbiBzdG9wIHRoZSBzY2FuIGVhcmx5IG9ubHkgaWYgdGhlIHN0cmluZyBwYXJ0CisJICogd2UgYXJlIG1hdGNoaW5nIGFnYWluc3QgaXMgc2hyaW5raW5nLCBhbmQgdGhlIHBhdHRlcm4gaGFzCisJICogYW4gdW5xdW90ZWQgInN0YXIiIGF0IHRoZSBjb3JyZXNwb25kaW5nIGVuZC4gVGhlcmUgYXJlIHR3byBjYXNlcy4KKwkgKiBDYXNlIDE6CisJICogInF3ZXJ0eSIgZG9lcyBub3QgbWF0Y2ggYWdhaW5zdCBwYXR0ZXJuICIqenkiLAorCSAqIG5vIHBvaW50IGluIHRyeWluZyB0byBtYXRjaCAid2VydHkiLCAiZXJ0eSIgZXRjOgorCSAqLworCWVhcmx5X2V4aXQgPSAoZmxhZ3MgPT0gKFNDQU5fTU9WRV9GUk9NX0xFRlQgKyBTQ0FOX01BVENIX1JJR0hUX0hBTEYpICYmIHBhdHRlcm5bMF0gPT0gJyonKTsKKworCWlmIChmbGFncyAmIFNDQU5fTU9WRV9GUk9NX0xFRlQpIHsKKwkJbG9jID0gc3RyaW5nOworCQllbmQgPSBzdHJpbmcgKyBsZW4gKyAxOworCX0gZWxzZSB7CisJCWxvYyA9IHN0cmluZyArIGxlbjsKKwkJZW5kID0gc3RyaW5nIC0gMTsKKwkJaWYgKGZsYWdzID09IChTQ0FOX01PVkVfRlJPTV9SSUdIVCArIFNDQU5fTUFUQ0hfTEVGVF9IQUxGKSkgeworCQkJLyogQ2FzZSAyOgorCQkJICogInF3ZXJ0eSIgZG9lcyBub3QgbWF0Y2ggYWdhaW5zdCBwYXR0ZXJuICJxeioiLAorCQkJICogbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIG1hdGNoICJxd2VydCIsICJxd2VyIiBldGM6CisJCQkgKi8KKwkJCWNvbnN0IGNoYXIgKnAgPSBwYXR0ZXJuICsgc3RybGVuKHBhdHRlcm4pOworCQkJaWYgKC0tcCA+PSBwYXR0ZXJuICYmICpwID09ICcqJykgeworCQkJCWVhcmx5X2V4aXQgPSAxOworCQkJCXdoaWxlICgtLXAgPj0gcGF0dGVybiAmJiAqcCA9PSAnXFwnKQorCQkJCQllYXJseV9leGl0IF49IDE7CisJCQl9CisJCX0KKwl9CisKKwl3aGlsZSAobG9jICE9IGVuZCkgeworCQljaGFyIGM7CisJCWludCByOworCisJCWMgPSAqbG9jOworCQlpZiAoZmxhZ3MgJiBTQ0FOX01BVENIX0xFRlRfSEFMRikgeworCQkJKmxvYyA9ICdcMCc7CisJCQlyID0gZm5tYXRjaChwYXR0ZXJuLCBzdHJpbmcsIDApOworCQkJKmxvYyA9IGM7CisJCX0gZWxzZSB7CisJCQlyID0gZm5tYXRjaChwYXR0ZXJuLCBsb2MsIDApOworCQl9CisJCWlmIChyID09IDApIC8qIG1hdGNoIGZvdW5kICovCisJCQlyZXR1cm4gbG9jOworCQlpZiAoZWFybHlfZXhpdCkgeworI2lmZGVmIFNUQU5EQUxPTkUKKwkJCXByaW50ZigiKGVhcmx5IGV4aXQpICIpOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCWlmIChmbGFncyAmIFNDQU5fTU9WRV9GUk9NX0xFRlQpIHsKKwkJCWxvYysrOworCQl9IGVsc2UgeworCQkJbG9jLS07CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBTVEFOREFMT05FCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKnN0cmluZzsKKwljaGFyICpvcDsKKwljaGFyICpwYXR0ZXJuOworCWNoYXIgKmxvYzsKKworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworCisJaWYgKCFhcmd2WzFdKSB7CisJCXB1dHMoCisJCQkiVXNhZ2U6IG1hdGNoIDx0ZXN0PiBbdGVzdC4uLl1cblxuIgorCQkJIldoZXJlIGEgPHRlc3Q+IGlzIHRoZSBmb3JtOiA8c3RyaW5nPjxvcD48bWF0Y2g+XG4iCisJCQkiVGhpcyBpcyB0byB0ZXN0IHRoZSBzaGVsbCAke3ZhciN2YWx9IGV4cHJlc3Npb24gdHlwZS5cblxuIgorCQkJImUuZy4gYG1hdGNoICdhYmMjYSonYCAtPiBiYyIKKwkJKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKCorK2FyZ3YpIHsKKwkJc2l6ZV90IG9mZjsKKwkJdW5zaWduZWQgc2Nhbl9mbGFnczsKKworCQlzdHJpbmcgPSAqYXJndjsKKwkJb2ZmID0gc3RyY3NwbihzdHJpbmcsICIjJSIpOworCQlpZiAoIW9mZikgeworCQkJcHJpbnRmKCJpbnZhbGlkIGZvcm1hdFxuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlvcCA9IHN0cmluZyArIG9mZjsKKwkJc2Nhbl9mbGFncyA9IHBpY2tfc2NhbihvcFswXSwgb3BbMV0pOworCisJCXByaW50ZigiJyVzJzogZmxhZ3M6JXgsICIsIHN0cmluZywgc2Nhbl9mbGFncyk7CisJCXBhdHRlcm4gPSBvcCArIDE7CisJCWlmIChvcFswXSA9PSBvcFsxXSkKKwkJCXBhdHRlcm4rKzsKKwkJb3BbMF0gPSAnXDAnOworCisJCWxvYyA9IHNjYW5fYW5kX21hdGNoKHN0cmluZywgcGF0dGVybiwgc2Nhbl9mbGFncyk7CisKKwkJaWYgKHNjYW5fZmxhZ3MgJiBTQ0FOX01BVENIX0xFRlRfSEFMRikgeworCQkJcHJpbnRmKCInJXMnXG4iLCBsb2MpOworCQl9IGVsc2UgeworCQkJaWYgKGxvYykKKwkJCQkqbG9jID0gJ1wwJzsKKwkJCXByaW50ZigiJyVzJ1xuIiwgc3RyaW5nKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tYXRjaC5oIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbWF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM5M2VkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbWF0Y2guaApAQCAtMCwwICsxLDM0IEBACisvKiBtYXRjaC5oIC0gaW50ZXJmYWNlIHRvIHNoZWxsICMjLyUlIG1hdGNoaW5nIGNvZGUgKi8KKworI2lmbmRlZiBTSEVMTF9NQVRDSF9ICisjZGVmaW5lIFNIRUxMX01BVENIX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLy9UT0RPISBXaHkgYXNoLmMgc3RpbGwgdXNlcyBpbnRlcm5hbCB2ZXJzaW9uPyEKKworZW51bSB7CisJU0NBTl9NT1ZFX0ZST01fTEVGVCA9ICgxIDw8IDApLAorCVNDQU5fTU9WRV9GUk9NX1JJR0hUID0gKDEgPDwgMSksCisJU0NBTl9NQVRDSF9MRUZUX0hBTEYgPSAoMSA8PCAyKSwKKwlTQ0FOX01BVENIX1JJR0hUX0hBTEYgPSAoMSA8PCAzKSwKK307CisKK2NoYXIqIEZBU1RfRlVOQyBzY2FuX2FuZF9tYXRjaChjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIHVuc2lnbmVkIGZsYWdzKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBwaWNrX3NjYW4oY2hhciBvcDEsIGNoYXIgb3AyKQoreworCXVuc2lnbmVkIHNjYW5fZmxhZ3M7CisJaWYgKG9wMSA9PSAnIycpIHsKKwkJc2Nhbl9mbGFncyA9IFNDQU5fTUFUQ0hfTEVGVF9IQUxGICsKKwkJCShvcDEgPT0gb3AyID8gU0NBTl9NT1ZFX0ZST01fUklHSFQgOiBTQ0FOX01PVkVfRlJPTV9MRUZUKTsKKwl9IGVsc2UgeyAvKiAlICovCisJCXNjYW5fZmxhZ3MgPSBTQ0FOX01BVENIX1JJR0hUX0hBTEYgKworCQkJKG9wMSA9PSBvcDIgPyBTQ0FOX01PVkVfRlJPTV9MRUZUIDogU0NBTl9NT1ZFX0ZST01fUklHSFQpOworCX0KKwlyZXR1cm4gc2Nhbl9mbGFnczsKK30KKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tYXRoLmMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwNjQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21hdGguYwpAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqIEFyaXRobWV0aWMgY29kZSByaXBwZWQgb3V0IG9mIGFzaCBzaGVsbCBmb3IgY29kZSBzaGFyaW5nLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogT3JpZ2luYWwgQlNEIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkxLCAxOTkzLCAxOTk0CisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqIHdhcyByZS1wb3J0ZWQgZnJvbSBOZXRCU0QgYW5kIGRlYmlhbml6ZWQuCisgKgorICogcmV3cml0ZSBhcml0aC55IHRvIG1pY3JvIHN0YWNrIGJhc2VkIGNyeXB0aWMgYWxnb3JpdGhtIGJ5CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgQWFyb24gTGVobWFubiA8YWFyb25sQHZpdGVsdXMuY29tPgorICoKKyAqIE1vZGlmaWVkIGJ5IFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+IChjKSAyMDA0IHRvIHN1cHBvcnQKKyAqIGR5bmFtaWMgdmFyaWFibGVzLgorICoKKyAqIE1vZGlmaWVkIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gKGMpIDIwMDEtMjAwNSB0byBiZQorICogdXNlZCBpbiBidXN5Ym94IGFuZCBzaXplIG9wdGltaXphdGlvbnMsCisgKiByZXdyb3RlIGFyaXRoIChzZWUgbm90ZXMgdG8gdGhpcyksIGFkZGVkIGxvY2FsZSBzdXBwb3J0LAorICogcmV3cm90ZSBkeW5hbWljIHZhcmlhYmxlcy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMDEgQWFyb24gTGVobWFubiA8YWFyb25sQHZpdGVsdXMuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyogVGhpcyBpcyBteSBpbmZpeCBwYXJzZXIvZXZhbHVhdG9yLiBJdCBpcyBvcHRpbWl6ZWQgZm9yIHNpemUsIGludGVuZGVkCisgKiBhcyBhIHJlcGxhY2VtZW50IGZvciB5YWNjLWJhc2VkIHBhcnNlcnMuIEhvd2V2ZXIsIGl0IG1heSB3ZWxsIGJlIGZhc3RlcgorICogdGhhbiBhIGNvbXBhcmFibGUgcGFyc2VyIHdyaXR0ZW4gaW4geWFjYy4gVGhlIHN1cHBvcnRlZCBvcGVyYXRvcnMgYXJlCisgKiBsaXN0ZWQgaW4gI2RlZmluZXMgYmVsb3cuIFBhcmVucywgb3JkZXIgb2Ygb3BlcmF0aW9ucywgYW5kIGVycm9yIGhhbmRsaW5nCisgKiBhcmUgc3VwcG9ydGVkLiBUaGlzIGNvZGUgaXMgdGhyZWFkIHNhZmUuIFRoZSBleGFjdCBleHByZXNzaW9uIGZvcm1hdCBzaG91bGQKKyAqIGJlIHRoYXQgd2hpY2ggUE9TSVggc3BlY2lmaWVzIGZvciBzaGVsbHMuCisgKgorICogVGhlIGNvZGUgdXNlcyBhIHNpbXBsZSB0d28tc3RhY2sgYWxnb3JpdGhtLiBTZWUKKyAqIGh0dHA6Ly93d3cub250aGVuZXQuY29tLmF1L35ncmFoYW1pcy9pbnQyMDA4L3dlZWswMi9sZWN0MDIuaHRtbAorICogZm9yIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIGluZml4LXRvLXBvc3RmaXggYWxnb3JpdGhtIG9uIHdoaWNoCisgKiB0aGlzIGlzIGJhc2VkICh0aGlzIGNvZGUgZGlmZmVycyBpbiB0aGF0IGl0IGFwcGxpZXMgb3BlcmF0b3JzIGltbWVkaWF0ZWx5CisgKiB0byB0aGUgc3RhY2sgaW5zdGVhZCBvZiBhZGRpbmcgdGhlbSB0byBhIHF1ZXVlIHRvIGVuZCB1cCB3aXRoIGFuCisgKiBleHByZXNzaW9uKS4KKyAqLworCisvKgorICogQXVnIDI0LCAyMDAxICAgICAgICAgICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogUmVkdWNlZCB0aGUgZ2VuZXJhdGVkIGNvZGUgc2l6ZSBieSBhYm91dCAzMCUgKGkzODYpIGFuZCBmaXhlZCBzZXZlcmFsIGJ1Z3MuCisgKgorICogMSkgSW4gYXJpdGhfYXBwbHkoKToKKyAqICAgIGEpIENhY2hlZCB2YWx1ZXMgb2YgKm51bXB0ciBhbmQgJihudW1wdHJbLTFdKS4KKyAqICAgIGIpIFJlbW92ZWQgcmVkdW5kYW50IHRlc3QgZm9yIHplcm8gZGVub21pbmF0b3IuCisgKgorICogMikgSW4gYXJpdGgoKToKKyAqICAgIGEpIEVsaW1pbmF0ZWQgcmVkdW5kYW50IGNvZGUgZm9yIHByb2Nlc3Npbmcgb3BlcmF0b3IgdG9rZW5zIGJ5IG1vdmluZworICogICAgICAgdG8gYSB0YWJsZS1iYXNlZCBpbXBsZW1lbnRhdGlvbi4gIEFsc28gZm9sZGVkIGhhbmRsaW5nIG9mIHBhcmVucworICogICAgICAgaW50byB0aGUgdGFibGUuCisgKiAgICBiKSBDb21iaW5lZCBhbGwgMyBsb29wcyB3aGljaCBjYWxsZWQgYXJpdGhfYXBwbHkgdG8gcmVkdWNlIGdlbmVyYXRlZAorICogICAgICAgY29kZSBzaXplIGF0IHRoZSBjb3N0IG9mIHNwZWVkLgorICoKKyAqIDMpIFRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnMgd2VyZSB0cmVhdGVkIGFzIHZhbGlkIGJ5IHRoZSBvcmlnaW5hbCBjb2RlOgorICogICAgICAgMSgpICAsICAgIDAhICAsICAgIDEgKCAqMyApICAgLgorICogICAgVGhlc2UgYnVncyBoYXZlIGJlZW4gZml4ZWQgYnkgaW50ZXJuYWxseSBlbmNsb3NpbmcgdGhlIGV4cHJlc3Npb24gaW4KKyAqICAgIHBhcmVucyBhbmQgdGhlbiBjaGVja2luZyB0aGF0IGFsbCBiaW5hcnkgb3BzIGFuZCByaWdodCBwYXJlbnMgYXJlCisgKiAgICBwcmVjZWRlZCBieSBhIHZhbGlkIGV4cHJlc3Npb24gKE5VTV9UT0tFTikuCisgKgorICogTm90ZTogSXQgbWF5IGJlIGRlc2lyYWJsZSB0byByZXBsYWNlIEFhcm9uJ3MgdGVzdCBmb3Igd2hpdGVzcGFjZSB3aXRoCisgKiBjdHlwZSdzIGlzc3BhY2UoKSBpZiBpdCBpcyB1c2VkIGJ5IGFub3RoZXIgYnVzeWJveCBhcHBsZXQgb3IgaWYgYWRkaXRpb25hbAorICogd2hpdGVzcGFjZSBjaGFycyBzaG91bGQgYmUgY29uc2lkZXJlZC4gIExvb2sgYmVsb3cgdGhlICIjaW5jbHVkZSJzIGZvciBhCisgKiBwcmVjb21waWxlciB0ZXN0LgorICovCisvKgorICogQXVnIDI2LCAyMDAxICAgICAgICAgICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogUmV0dXJuIDAgZm9yIG51bGwgZXhwcmVzc2lvbnMuICBQb2ludGVkIG91dCBieSBWbGFkaW1pciBPbGV5bmlrLgorICoKKyAqIE1lcmdlIGluIEFhcm9uJ3MgY29tbWVudHMgcHJldmlvdXNseSBwb3N0ZWQgdG8gdGhlIGJ1c3lib3ggbGlzdCwKKyAqIG1vZGlmaWVkIHNsaWdodGx5IHRvIHRha2UgYWNjb3VudCBvZiBteSBjaGFuZ2VzIHRvIHRoZSBjb2RlLgorICoKKyAqLworLyoKKyAqICAoQykgMjAwMyBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogLSBhbGxvdyBhY2Nlc3MgdG8gdmFyaWFibGUsCisgKiAgIHVzZSByZWN1cnNpdmUgdmFsdWUgaW5kaXJlY3Rpb246IGM9IjIqMiI7IGE9ImMiOyBlY2hvICQoKGErPTIpKSBwcm9kdWNlIDYKKyAqIC0gaW1wbGVtZW50IGFzc2lnbiBzeW50YXggKFZBUj1leHByLCArPSwgKj0gZXRjKQorICogLSBpbXBsZW1lbnQgZXhwb25lbnRpYXRpb24gKCoqIG9wZXJhdG9yKQorICogLSBpbXBsZW1lbnQgY29tbWEgc2VwYXJhdGVkIC0gZXhwciwgZXhwcgorICogLSBpbXBsZW1lbnQgKytleHByIC0tZXhwciBleHByKysgZXhwci0tCisgKiAtIGltcGxlbWVudCBleHByID8gZXhwciA6IGV4cHIgKGJ1dCBzZWNvbmQgZXhwciBpcyBhbHdheXMgY2FsY3VsYXRlZCkKKyAqIC0gYWxsb3cgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMKKyAqIC0gcmVzdG9yZSBsb3N0IFhPUiBvcGVyYXRvcgorICogLSBwcm90ZWN0ICQoKG51bSBudW0pKSBhcyB0cnVlIHplcm8gZXhwciAoTWFudWVsJ3MgZXJyb3IpCisgKiAtIGFsd2F5cyB1c2Ugc3BlY2lhbCBpc3NwYWNlKCksIHNlZSBjb21tZW50IGZyb20gYmFzaCA7LSkKKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibWF0aC5oIgorCisjZGVmaW5lIGxvb2t1cHZhciAobWF0aF9zdGF0ZS0+bG9va3VwdmFyKQorI2RlZmluZSBzZXR2YXIgICAgKG1hdGhfc3RhdGUtPnNldHZhciAgICkKKy8vI2RlZmluZSBlbmRvZm5hbWUgKG1hdGhfc3RhdGUtPmVuZG9mbmFtZSkKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9wZXJhdG9yOworCisvKiBBbiBvcGVyYXRvcidzIHRva2VuIGlkIGlzIGEgYml0IG9mIGEgYml0ZmllbGQuIFRoZSBsb3dlciA1IGJpdHMgYXJlIHRoZQorICogcHJlY2VkZW5jZSwgYW5kIDMgaGlnaCBiaXRzIGFyZSBhbiBJRCB1bmlxdWUgYWNyb3NzIG9wZXJhdG9ycyBvZiB0aGF0CisgKiBwcmVjZWRlbmNlLiBUaGUgSUQgcG9ydGlvbiBpcyBzbyB0aGF0IG11bHRpcGxlIG9wZXJhdG9ycyBjYW4gaGF2ZSB0aGUKKyAqIHNhbWUgcHJlY2VkZW5jZSwgZW5zdXJpbmcgdGhhdCB0aGUgbGVmdG1vc3Qgb25lIGlzIGV2YWx1YXRlZCBmaXJzdC4KKyAqIENvbnNpZGVyICogYW5kIC8KKyAqLworI2RlZmluZSB0b2tfZGVjbChwcmVjLGlkKSAgICAgICAoKChpZCk8PDUpIHwgKHByZWMpKQorI2RlZmluZSBQUkVDKG9wKSAgICAgICAgICAgICAgICAoKG9wKSAmIDB4MUYpCisKKyNkZWZpbmUgVE9LX0xQQVJFTiAgICAgICAgICAgICAgdG9rX2RlY2woMCwwKQorCisjZGVmaW5lIFRPS19DT01NQSAgICAgICAgICAgICAgIHRva19kZWNsKDEsMCkKKworLyogQWxsIGFzc2lnbm1lbnRzIGFyZSByaWdodCBhc3NvY2lhdGl2ZSBhbmQgaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlLAorICogYnV0IHRoZXJlIGFyZSAxMSBvZiB0aGVtLCB3aGljaCBkb2Vzbid0IGZpdCBpbnRvIDMgYml0cyBmb3IgdW5pcXVlIGlkLgorICogQWJ1c2luZyBhbm90aGVyIHByZWNlZGVuY2UgbGV2ZWw6CisgKi8KKyNkZWZpbmUgVE9LX0FTU0lHTiAgICAgICAgICAgICAgdG9rX2RlY2woMiwwKQorI2RlZmluZSBUT0tfQU5EX0FTU0lHTiAgICAgICAgICB0b2tfZGVjbCgyLDEpCisjZGVmaW5lIFRPS19PUl9BU1NJR04gICAgICAgICAgIHRva19kZWNsKDIsMikKKyNkZWZpbmUgVE9LX1hPUl9BU1NJR04gICAgICAgICAgdG9rX2RlY2woMiwzKQorI2RlZmluZSBUT0tfUExVU19BU1NJR04gICAgICAgICB0b2tfZGVjbCgyLDQpCisjZGVmaW5lIFRPS19NSU5VU19BU1NJR04gICAgICAgIHRva19kZWNsKDIsNSkKKyNkZWZpbmUgVE9LX0xTSElGVF9BU1NJR04gICAgICAgdG9rX2RlY2woMiw2KQorI2RlZmluZSBUT0tfUlNISUZUX0FTU0lHTiAgICAgICB0b2tfZGVjbCgyLDcpCisKKyNkZWZpbmUgVE9LX01VTF9BU1NJR04gICAgICAgICAgdG9rX2RlY2woMywwKQorI2RlZmluZSBUT0tfRElWX0FTU0lHTiAgICAgICAgICB0b2tfZGVjbCgzLDEpCisjZGVmaW5lIFRPS19SRU1fQVNTSUdOICAgICAgICAgIHRva19kZWNsKDMsMikKKworI2RlZmluZSBmaXhfYXNzaWdubWVudF9wcmVjKHByZWMpIGRvIHsgaWYgKHByZWMgPT0gMykgcHJlYyA9IDI7IH0gd2hpbGUgKDApCisKKy8qIFRlcm5hcnkgY29uZGl0aW9uYWwgb3BlcmF0b3IgaXMgcmlnaHQgYXNzb2NpYXRpdmUgdG9vICovCisjZGVmaW5lIFRPS19DT05ESVRJT05BTCAgICAgICAgIHRva19kZWNsKDQsMCkKKyNkZWZpbmUgVE9LX0NPTkRJVElPTkFMX1NFUCAgICAgdG9rX2RlY2woNCwxKQorCisjZGVmaW5lIFRPS19PUiAgICAgICAgICAgICAgICAgIHRva19kZWNsKDUsMCkKKworI2RlZmluZSBUT0tfQU5EICAgICAgICAgICAgICAgICB0b2tfZGVjbCg2LDApCisKKyNkZWZpbmUgVE9LX0JPUiAgICAgICAgICAgICAgICAgdG9rX2RlY2woNywwKQorCisjZGVmaW5lIFRPS19CWE9SICAgICAgICAgICAgICAgIHRva19kZWNsKDgsMCkKKworI2RlZmluZSBUT0tfQkFORCAgICAgICAgICAgICAgICB0b2tfZGVjbCg5LDApCisKKyNkZWZpbmUgVE9LX0VRICAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTAsMCkKKyNkZWZpbmUgVE9LX05FICAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTAsMSkKKworI2RlZmluZSBUT0tfTFQgICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxMSwwKQorI2RlZmluZSBUT0tfR1QgICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxMSwxKQorI2RlZmluZSBUT0tfR0UgICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxMSwyKQorI2RlZmluZSBUT0tfTEUgICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxMSwzKQorCisjZGVmaW5lIFRPS19MU0hJRlQgICAgICAgICAgICAgIHRva19kZWNsKDEyLDApCisjZGVmaW5lIFRPS19SU0hJRlQgICAgICAgICAgICAgIHRva19kZWNsKDEyLDEpCisKKyNkZWZpbmUgVE9LX0FERCAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTMsMCkKKyNkZWZpbmUgVE9LX1NVQiAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTMsMSkKKworI2RlZmluZSBUT0tfTVVMICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxNCwwKQorI2RlZmluZSBUT0tfRElWICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxNCwxKQorI2RlZmluZSBUT0tfUkVNICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxNCwyKQorCisvKiBFeHBvbmVudCBpcyByaWdodCBhc3NvY2lhdGl2ZSAqLworI2RlZmluZSBUT0tfRVhQT05FTlQgICAgICAgICAgICB0b2tfZGVjbCgxNSwxKQorCisvKiBVbmFyeSBvcGVyYXRvcnMgKi8KKyNkZWZpbmUgVU5BUllQUkVDICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVE9LX0JOT1QgICAgICAgICAgICAgICAgdG9rX2RlY2woVU5BUllQUkVDLDApCisjZGVmaW5lIFRPS19OT1QgICAgICAgICAgICAgICAgIHRva19kZWNsKFVOQVJZUFJFQywxKQorCisjZGVmaW5lIFRPS19VTUlOVVMgICAgICAgICAgICAgIHRva19kZWNsKFVOQVJZUFJFQysxLDApCisjZGVmaW5lIFRPS19VUExVUyAgICAgICAgICAgICAgIHRva19kZWNsKFVOQVJZUFJFQysxLDEpCisKKyNkZWZpbmUgUFJFQ19QUkUgICAgICAgICAgICAgICAgKFVOQVJZUFJFQysyKQorCisjZGVmaW5lIFRPS19QUkVfSU5DICAgICAgICAgICAgIHRva19kZWNsKFBSRUNfUFJFLCAwKQorI2RlZmluZSBUT0tfUFJFX0RFQyAgICAgICAgICAgICB0b2tfZGVjbChQUkVDX1BSRSwgMSkKKworI2RlZmluZSBQUkVDX1BPU1QgICAgICAgICAgICAgICAoVU5BUllQUkVDKzMpCisKKyNkZWZpbmUgVE9LX1BPU1RfSU5DICAgICAgICAgICAgdG9rX2RlY2woUFJFQ19QT1NULCAwKQorI2RlZmluZSBUT0tfUE9TVF9ERUMgICAgICAgICAgICB0b2tfZGVjbChQUkVDX1BPU1QsIDEpCisKKyNkZWZpbmUgU1BFQ19QUkVDICAgICAgICAgICAgICAgKFVOQVJZUFJFQys0KQorCisjZGVmaW5lIFRPS19OVU0gICAgICAgICAgICAgICAgIHRva19kZWNsKFNQRUNfUFJFQywgMCkKKyNkZWZpbmUgVE9LX1JQQVJFTiAgICAgICAgICAgICAgdG9rX2RlY2woU1BFQ19QUkVDLCAxKQorCitzdGF0aWMgaW50Citpc19hc3NpZ25fb3Aob3BlcmF0b3Igb3ApCit7CisJb3BlcmF0b3IgcHJlYyA9IFBSRUMob3ApOworCWZpeF9hc3NpZ25tZW50X3ByZWMocHJlYyk7CisJcmV0dXJuIHByZWMgPT0gUFJFQyhUT0tfQVNTSUdOKQorCXx8IHByZWMgPT0gUFJFQ19QUkUKKwl8fCBwcmVjID09IFBSRUNfUE9TVDsKK30KKworc3RhdGljIGludAoraXNfcmlnaHRfYXNzb2NpYXRpdmUob3BlcmF0b3IgcHJlYykKK3sKKwlyZXR1cm4gcHJlYyA9PSBQUkVDKFRPS19BU1NJR04pCisJfHwgcHJlYyA9PSBQUkVDKFRPS19FWFBPTkVOVCkKKwl8fCBwcmVjID09IFBSRUMoVE9LX0NPTkRJVElPTkFMKTsKK30KKworCit0eXBlZGVmIHN0cnVjdCB7CisJYXJpdGhfdCB2YWw7CisJLyogV2UgYWNxdWlyZSBzZWNvbmRfdmFsIG9ubHkgd2hlbiAiZXhwcjEgOiBleHByMiIgcGFydAorCSAqIG9mIHRlcm5hcnkgPzogb3AgaXMgZXZhbHVhdGVkLgorCSAqIFdlIHRyZWF0ID86IGFzIHR3byBiaW5hcnkgb3BzOiAoZXhwciA/IChleHByMSA6IGV4cHIyKSkuCisJICogJzonIHByb2R1Y2VzIGEgbmV3IHZhbHVlIHdoaWNoIGhhcyB0d28gcGFydHMsIHZhbCBhbmQgc2Vjb25kX3ZhbDsKKwkgKiB0aGVuICc/JyBzZWxlY3RzIG9uZSBvZiB0aGVtIGJhc2VkIG9uIGl0cyBsZWZ0IHNpZGUuCisJICovCisJYXJpdGhfdCBzZWNvbmRfdmFsOworCWNoYXIgc2Vjb25kX3ZhbF9wcmVzZW50OworCS8qIElmIE5VTEwgdGhlbiBpdCdzIGp1c3QgYSBudW1iZXIsIGVsc2UgaXQncyBhIG5hbWVkIHZhcmlhYmxlICovCisJY2hhciAqdmFyOworfSB2YXJfb3JfbnVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHJlbWVtYmVyZWRfbmFtZSB7CisJc3RydWN0IHJlbWVtYmVyZWRfbmFtZSAqbmV4dDsKKwljb25zdCBjaGFyICp2YXI7Cit9IHJlbWVtYmVyZWRfbmFtZTsKKworCitzdGF0aWMgYXJpdGhfdCBGQVNUX0ZVTkMKK2V2YWx1YXRlX3N0cmluZyhhcml0aF9zdGF0ZV90ICptYXRoX3N0YXRlLCBjb25zdCBjaGFyICpleHByKTsKKworc3RhdGljIGNvbnN0IGNoYXIqCithcml0aF9sb29rdXBfdmFsKGFyaXRoX3N0YXRlX3QgKm1hdGhfc3RhdGUsIHZhcl9vcl9udW1fdCAqdCkKK3sKKwlpZiAodC0+dmFyKSB7CisJCWNvbnN0IGNoYXIgKnAgPSBsb29rdXB2YXIodC0+dmFyKTsKKwkJaWYgKHApIHsKKwkJCXJlbWVtYmVyZWRfbmFtZSAqY3VyOworCQkJcmVtZW1iZXJlZF9uYW1lIGN1cl9zYXZlOworCisJCQkvKiBkaWQgd2UgYWxyZWFkeSBzZWUgdGhpcyBuYW1lPworCQkJICogdGVzdGNhc2U6IGE9YjsgYj1hOyBlY2hvICQoKGEpKQorCQkJICovCisJCQlmb3IgKGN1ciA9IG1hdGhfc3RhdGUtPmxpc3Rfb2ZfcmVjdXJzZWRfbmFtZXM7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJCQkJaWYgKHN0cmNtcChjdXItPnZhciwgdC0+dmFyKSA9PSAwKSB7CisJCQkJCS8qIFllcyAqLworCQkJCQlyZXR1cm4gImV4cHJlc3Npb24gcmVjdXJzaW9uIGxvb3AgZGV0ZWN0ZWQiOworCQkJCX0KKwkJCX0KKworCQkJLyogcHVzaCBjdXJyZW50IHZhciBuYW1lICovCisJCQljdXIgPSBtYXRoX3N0YXRlLT5saXN0X29mX3JlY3Vyc2VkX25hbWVzOworCQkJY3VyX3NhdmUudmFyID0gdC0+dmFyOworCQkJY3VyX3NhdmUubmV4dCA9IGN1cjsKKwkJCW1hdGhfc3RhdGUtPmxpc3Rfb2ZfcmVjdXJzZWRfbmFtZXMgPSAmY3VyX3NhdmU7CisKKwkJCS8qIHJlY3Vyc2l2ZWx5IGV2YWx1YXRlIHAgYXMgZXhwcmVzc2lvbiAqLworCQkJdC0+dmFsID0gZXZhbHVhdGVfc3RyaW5nKG1hdGhfc3RhdGUsIHApOworCisJCQkvKiBwb3AgY3VycmVudCB2YXIgbmFtZSAqLworCQkJbWF0aF9zdGF0ZS0+bGlzdF9vZl9yZWN1cnNlZF9uYW1lcyA9IGN1cjsKKworCQkJcmV0dXJuIG1hdGhfc3RhdGUtPmVycm1zZzsKKwkJfQorCQkvKiB0cmVhdCB1bmRlZmluZWQgdmFyIGFzIDAgKi8KKwkJdC0+dmFsID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qICJBcHBseWluZyIgYSB0b2tlbiBtZWFucyBwZXJmb3JtaW5nIGl0IG9uIHRoZSB0b3AgZWxlbWVudHMgb24gdGhlIGludGVnZXIKKyAqIHN0YWNrLiBGb3IgYW4gdW5hcnkgb3BlcmF0b3IgaXQgd2lsbCBvbmx5IGNoYW5nZSB0aGUgdG9wIGVsZW1lbnQsIGJ1dCBhCisgKiBiaW5hcnkgb3BlcmF0b3Igd2lsbCBwb3AgdHdvIGFyZ3VtZW50cyBhbmQgcHVzaCB0aGUgcmVzdWx0ICovCitzdGF0aWMgTk9JTkxJTkUgY29uc3QgY2hhcioKK2FyaXRoX2FwcGx5KGFyaXRoX3N0YXRlX3QgKm1hdGhfc3RhdGUsIG9wZXJhdG9yIG9wLCB2YXJfb3JfbnVtX3QgKm51bXN0YWNrLCB2YXJfb3JfbnVtX3QgKipudW1zdGFja3B0cikKK3sKKyNkZWZpbmUgTlVNUFRSICgqbnVtc3RhY2twdHIpCisKKwl2YXJfb3JfbnVtX3QgKnRvcF9vZl9zdGFjazsKKwlhcml0aF90IHJlejsKKwljb25zdCBjaGFyICplcnI7CisKKwkvKiBUaGVyZSBpcyBubyBvcGVyYXRvciB0aGF0IGNhbiB3b3JrIHdpdGhvdXQgYXJndW1lbnRzICovCisJaWYgKE5VTVBUUiA9PSBudW1zdGFjaykKKwkJZ290byBlcnI7CisKKwl0b3Bfb2Zfc3RhY2sgPSBOVU1QVFIgLSAxOworCisJLyogUmVzb2x2ZSBuYW1lIHRvIHZhbHVlLCBpZiBuZWVkZWQgKi8KKwllcnIgPSBhcml0aF9sb29rdXBfdmFsKG1hdGhfc3RhdGUsIHRvcF9vZl9zdGFjayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJleiA9IHRvcF9vZl9zdGFjay0+dmFsOworCWlmIChvcCA9PSBUT0tfVU1JTlVTKQorCQlyZXogPSAtcmV6OworCWVsc2UgaWYgKG9wID09IFRPS19OT1QpCisJCXJleiA9ICFyZXo7CisJZWxzZSBpZiAob3AgPT0gVE9LX0JOT1QpCisJCXJleiA9IH5yZXo7CisJZWxzZSBpZiAob3AgPT0gVE9LX1BPU1RfSU5DIHx8IG9wID09IFRPS19QUkVfSU5DKQorCQlyZXorKzsKKwllbHNlIGlmIChvcCA9PSBUT0tfUE9TVF9ERUMgfHwgb3AgPT0gVE9LX1BSRV9ERUMpCisJCXJlei0tOworCWVsc2UgaWYgKG9wICE9IFRPS19VUExVUykgeworCQkvKiBCaW5hcnkgb3BlcmF0b3JzICovCisJCWFyaXRoX3QgcmlnaHRfc2lkZV92YWw7CisJCWNoYXIgYmFkX3NlY29uZF92YWw7CisKKwkJLyogQmluYXJ5IG9wZXJhdG9ycyBuZWVkIHR3byBhcmd1bWVudHMgKi8KKwkJaWYgKHRvcF9vZl9zdGFjayA9PSBudW1zdGFjaykKKwkJCWdvdG8gZXJyOworCQkvKiAuLi5hbmQgdGhleSBwb3Agb25lICovCisJCU5VTVBUUiA9IHRvcF9vZl9zdGFjazsgLyogdGhpcyBkZWNyZW1lbnRzIE5VTVBUUiAqLworCisJCWJhZF9zZWNvbmRfdmFsID0gdG9wX29mX3N0YWNrLT5zZWNvbmRfdmFsX3ByZXNlbnQ7CisJCWlmIChvcCA9PSBUT0tfQ09ORElUSU9OQUwpIHsgLyogPyBvcGVyYXRpb24gKi8KKwkJCS8qIE1ha2UgbmV4dCBpZiAoLi4uKSBwcm90ZWN0IGFnYWluc3QKKwkJCSAqICQoKGV4cHIxID8gZXhwcjIpKSAtIHRoYXQgaXMsIG1pc3NpbmcgIjogZXhwciIgKi8KKwkJCWJhZF9zZWNvbmRfdmFsID0gIWJhZF9zZWNvbmRfdmFsOworCQl9CisJCWlmIChiYWRfc2Vjb25kX3ZhbCkgeworCQkJLyogUHJvdGVjdCBhZ2FpbnN0ICQoKGV4cHIgPG5vdF8/X29wPiBleHByMSA6IGV4cHIyKSkgKi8KKwkJCXJldHVybiAibWFsZm9ybWVkID86IG9wZXJhdG9yIjsKKwkJfQorCisJCXRvcF9vZl9zdGFjay0tOyAvKiBub3cgcG9pbnRzIHRvIGxlZnQgc2lkZSAqLworCisJCWlmIChvcCAhPSBUT0tfQVNTSUdOKSB7CisJCQkvKiBSZXNvbHZlIGxlZnQgc2lkZSB2YWx1ZSAodW5sZXNzIHRoZSBvcCBpcyAnPScpICovCisJCQllcnIgPSBhcml0aF9sb29rdXBfdmFsKG1hdGhfc3RhdGUsIHRvcF9vZl9zdGFjayk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQlyaWdodF9zaWRlX3ZhbCA9IHJlejsKKwkJcmV6ID0gdG9wX29mX3N0YWNrLT52YWw7CisJCWlmIChvcCA9PSBUT0tfQ09ORElUSU9OQUwpIC8qID8gb3BlcmF0aW9uICovCisJCQlyZXogPSAocmV6ID8gcmlnaHRfc2lkZV92YWwgOiB0b3Bfb2Zfc3RhY2tbMV0uc2Vjb25kX3ZhbCk7CisJCWVsc2UgaWYgKG9wID09IFRPS19DT05ESVRJT05BTF9TRVApIHsgLyogOiBvcGVyYXRpb24gKi8KKwkJCWlmICh0b3Bfb2Zfc3RhY2sgPT0gbnVtc3RhY2spIHsKKwkJCQkvKiBQcm90ZWN0IGFnYWluc3QgJCgoZXhwciA6IGV4cHIpKSAqLworCQkJCXJldHVybiAibWFsZm9ybWVkID86IG9wZXJhdG9yIjsKKwkJCX0KKwkJCXRvcF9vZl9zdGFjay0+c2Vjb25kX3ZhbF9wcmVzZW50ID0gb3A7CisJCQl0b3Bfb2Zfc3RhY2stPnNlY29uZF92YWwgPSByaWdodF9zaWRlX3ZhbDsKKwkJfQorCQllbHNlIGlmIChvcCA9PSBUT0tfQk9SIHx8IG9wID09IFRPS19PUl9BU1NJR04pCisJCQlyZXogfD0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19PUikKKwkJCXJleiA9IHJpZ2h0X3NpZGVfdmFsIHx8IHJlejsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0JBTkQgfHwgb3AgPT0gVE9LX0FORF9BU1NJR04pCisJCQlyZXogJj0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19CWE9SIHx8IG9wID09IFRPS19YT1JfQVNTSUdOKQorCQkJcmV6IF49IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfQU5EKQorCQkJcmV6ID0gcmV6ICYmIHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfRVEpCisJCQlyZXogPSAocmV6ID09IHJpZ2h0X3NpZGVfdmFsKTsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX05FKQorCQkJcmV6ID0gKHJleiAhPSByaWdodF9zaWRlX3ZhbCk7CisJCWVsc2UgaWYgKG9wID09IFRPS19HRSkKKwkJCXJleiA9IChyZXogPj0gcmlnaHRfc2lkZV92YWwpOworCQllbHNlIGlmIChvcCA9PSBUT0tfUlNISUZUIHx8IG9wID09IFRPS19SU0hJRlRfQVNTSUdOKQorCQkJcmV6ID4+PSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0xTSElGVCB8fCBvcCA9PSBUT0tfTFNISUZUX0FTU0lHTikKKwkJCXJleiA8PD0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19HVCkKKwkJCXJleiA9IChyZXogPiByaWdodF9zaWRlX3ZhbCk7CisJCWVsc2UgaWYgKG9wID09IFRPS19MVCkKKwkJCXJleiA9IChyZXogPCByaWdodF9zaWRlX3ZhbCk7CisJCWVsc2UgaWYgKG9wID09IFRPS19MRSkKKwkJCXJleiA9IChyZXogPD0gcmlnaHRfc2lkZV92YWwpOworCQllbHNlIGlmIChvcCA9PSBUT0tfTVVMIHx8IG9wID09IFRPS19NVUxfQVNTSUdOKQorCQkJcmV6ICo9IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfQUREIHx8IG9wID09IFRPS19QTFVTX0FTU0lHTikKKwkJCXJleiArPSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX1NVQiB8fCBvcCA9PSBUT0tfTUlOVVNfQVNTSUdOKQorCQkJcmV6IC09IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfQVNTSUdOIHx8IG9wID09IFRPS19DT01NQSkKKwkJCXJleiA9IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfRVhQT05FTlQpIHsKKwkJCWFyaXRoX3QgYzsKKwkJCWlmIChyaWdodF9zaWRlX3ZhbCA8IDApCisJCQkJcmV0dXJuICJleHBvbmVudCBsZXNzIHRoYW4gMCI7CisJCQljID0gMTsKKwkJCXdoaWxlICgtLXJpZ2h0X3NpZGVfdmFsID49IDApCisJCQkgICAgYyAqPSByZXo7CisJCQlyZXogPSBjOworCQl9CisJCWVsc2UgaWYgKHJpZ2h0X3NpZGVfdmFsID09IDApCisJCQlyZXR1cm4gImRpdmlkZSBieSB6ZXJvIjsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0RJViB8fCBvcCA9PSBUT0tfRElWX0FTU0lHTikKKwkJCXJleiAvPSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX1JFTSB8fCBvcCA9PSBUT0tfUkVNX0FTU0lHTikKKwkJCXJleiAlPSByaWdodF9zaWRlX3ZhbDsKKwl9CisKKwlpZiAoaXNfYXNzaWduX29wKG9wKSkgeworCQljaGFyIGJ1ZltzaXplb2YoYXJpdGhfdCkqMyArIDJdOworCisJCWlmICh0b3Bfb2Zfc3RhY2stPnZhciA9PSBOVUxMKSB7CisJCQkvKiBIbW0sIDE9MiA/ICovCisvL1RPRE86IGFjdHVhbGx5LCBiYXNoIGFsbG93cyArKzcgYnV0IGZvciBzb21lIHJlYXNvbiBpdCBldmFscyB0byA3LCBub3QgOAorCQkJZ290byBlcnI7CisJCX0KKwkJLyogU2F2ZSB0byBzaGVsbCB2YXJpYWJsZSAqLworCQlzcHJpbnRmKGJ1ZiwgQVJJVEhfRk1ULCByZXopOworCQlzZXR2YXIodG9wX29mX3N0YWNrLT52YXIsIGJ1Zik7CisJCS8qIEFmdGVyIHNhdmluZywgbWFrZSBwcmV2aW91cyB2YWx1ZSBmb3IgdisrIG9yIHYtLSAqLworCQlpZiAob3AgPT0gVE9LX1BPU1RfSU5DKQorCQkJcmV6LS07CisJCWVsc2UgaWYgKG9wID09IFRPS19QT1NUX0RFQykKKwkJCXJleisrOworCX0KKworCXRvcF9vZl9zdGFjay0+dmFsID0gcmV6OworCS8qIEVyYXNlIHZhciBuYW1lLCBpdCBpcyBqdXN0IGEgbnVtYmVyIG5vdyAqLworCXRvcF9vZl9zdGFjay0+dmFyID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKKyBlcnI6CisJcmV0dXJuICJhcml0aG1ldGljIHN5bnRheCBlcnJvciI7CisjdW5kZWYgTlVNUFRSCit9CisKKy8qIGxvbmdlc3QgbXVzdCBiZSBmaXJzdCAqLworc3RhdGljIGNvbnN0IGNoYXIgb3BfdG9rZW5zW10gQUxJR04xID0geworCSc8JywnPCcsJz0nLDAsIFRPS19MU0hJRlRfQVNTSUdOLAorCSc+JywnPicsJz0nLDAsIFRPS19SU0hJRlRfQVNTSUdOLAorCSc8JywnPCcsICAgIDAsIFRPS19MU0hJRlQsCisJJz4nLCc+JywgICAgMCwgVE9LX1JTSElGVCwKKwknfCcsJ3wnLCAgICAwLCBUT0tfT1IsCisJJyYnLCcmJywgICAgMCwgVE9LX0FORCwKKwknIScsJz0nLCAgICAwLCBUT0tfTkUsCisJJzwnLCc9JywgICAgMCwgVE9LX0xFLAorCSc+JywnPScsICAgIDAsIFRPS19HRSwKKwknPScsJz0nLCAgICAwLCBUT0tfRVEsCisJJ3wnLCc9JywgICAgMCwgVE9LX09SX0FTU0lHTiwKKwknJicsJz0nLCAgICAwLCBUT0tfQU5EX0FTU0lHTiwKKwknKicsJz0nLCAgICAwLCBUT0tfTVVMX0FTU0lHTiwKKwknLycsJz0nLCAgICAwLCBUT0tfRElWX0FTU0lHTiwKKwknJScsJz0nLCAgICAwLCBUT0tfUkVNX0FTU0lHTiwKKwknKycsJz0nLCAgICAwLCBUT0tfUExVU19BU1NJR04sCisJJy0nLCc9JywgICAgMCwgVE9LX01JTlVTX0FTU0lHTiwKKwknLScsJy0nLCAgICAwLCBUT0tfUE9TVF9ERUMsCisJJ14nLCc9JywgICAgMCwgVE9LX1hPUl9BU1NJR04sCisJJysnLCcrJywgICAgMCwgVE9LX1BPU1RfSU5DLAorCScqJywnKicsICAgIDAsIFRPS19FWFBPTkVOVCwKKwknIScsICAgICAgICAwLCBUT0tfTk9ULAorCSc8JywgICAgICAgIDAsIFRPS19MVCwKKwknPicsICAgICAgICAwLCBUT0tfR1QsCisJJz0nLCAgICAgICAgMCwgVE9LX0FTU0lHTiwKKwknfCcsICAgICAgICAwLCBUT0tfQk9SLAorCScmJywgICAgICAgIDAsIFRPS19CQU5ELAorCScqJywgICAgICAgIDAsIFRPS19NVUwsCisJJy8nLCAgICAgICAgMCwgVE9LX0RJViwKKwknJScsICAgICAgICAwLCBUT0tfUkVNLAorCScrJywgICAgICAgIDAsIFRPS19BREQsCisJJy0nLCAgICAgICAgMCwgVE9LX1NVQiwKKwknXicsICAgICAgICAwLCBUT0tfQlhPUiwKKwkvKiB1bmlxICovCisJJ34nLCAgICAgICAgMCwgVE9LX0JOT1QsCisJJywnLCAgICAgICAgMCwgVE9LX0NPTU1BLAorCSc/JywgICAgICAgIDAsIFRPS19DT05ESVRJT05BTCwKKwknOicsICAgICAgICAwLCBUT0tfQ09ORElUSU9OQUxfU0VQLAorCScpJywgICAgICAgIDAsIFRPS19SUEFSRU4sCisJJygnLCAgICAgICAgMCwgVE9LX0xQQVJFTiwKKwkwCit9OworI2RlZmluZSBwdHJfdG9fcnBhcmVuICgmb3BfdG9rZW5zW3NpemVvZihvcF90b2tlbnMpLTddKQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMKK2VuZG9mbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWlmICghaXNfbmFtZSgqbmFtZSkpCisJCXJldHVybiBuYW1lOworCXdoaWxlICgqKytuYW1lKSB7CisJCWlmICghaXNfaW5fbmFtZSgqbmFtZSkpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBhcml0aF90IEZBU1RfRlVOQworZXZhbHVhdGVfc3RyaW5nKGFyaXRoX3N0YXRlX3QgKm1hdGhfc3RhdGUsIGNvbnN0IGNoYXIgKmV4cHIpCit7CisJb3BlcmF0b3IgbGFzdHRvazsKKwljb25zdCBjaGFyICplcnJtc2c7CisJY29uc3QgY2hhciAqc3RhcnRfZXhwciA9IGV4cHIgPSBza2lwX3doaXRlc3BhY2UoZXhwcik7CisJdW5zaWduZWQgZXhwcl9sZW4gPSBzdHJsZW4oZXhwcikgKyAyOworCS8qIFN0YWNrIG9mIGludGVnZXJzICovCisJLyogVGhlIHByb29mIHRoYXQgdGhlcmUgY2FuIGJlIG5vIG1vcmUgdGhhbiBzdHJsZW4oc3RhcnRidWYpLzIrMQorCSAqIGludGVnZXJzIGluIGFueSBnaXZlbiBjb3JyZWN0IG9yIGluY29ycmVjdCBleHByZXNzaW9uCisJICogaXMgbGVmdCBhcyBhbiBleGVyY2lzZSB0byB0aGUgcmVhZGVyLiAqLworCXZhcl9vcl9udW1fdCAqY29uc3QgbnVtc3RhY2sgPSBhbGxvY2EoKGV4cHJfbGVuIC8gMikgKiBzaXplb2YobnVtc3RhY2tbMF0pKTsKKwl2YXJfb3JfbnVtX3QgKm51bXN0YWNrcHRyID0gbnVtc3RhY2s7CisJLyogU3RhY2sgb2Ygb3BlcmF0b3IgdG9rZW5zICovCisJb3BlcmF0b3IgKmNvbnN0IHN0YWNrID0gYWxsb2NhKGV4cHJfbGVuICogc2l6ZW9mKHN0YWNrWzBdKSk7CisJb3BlcmF0b3IgKnN0YWNrcHRyID0gc3RhY2s7CisKKwkvKiBTdGFydCB3aXRoIGEgbGVmdCBwYXJlbiAqLworCSpzdGFja3B0cisrID0gbGFzdHRvayA9IFRPS19MUEFSRU47CisJZXJybXNnID0gTlVMTDsKKworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKnA7CisJCW9wZXJhdG9yIG9wOworCQlvcGVyYXRvciBwcmVjOworCQljaGFyIGFyaXRodmFsOworCisJCWV4cHIgPSBza2lwX3doaXRlc3BhY2UoZXhwcik7CisJCWFyaXRodmFsID0gKmV4cHI7CisJCWlmIChhcml0aHZhbCA9PSAnXDAnKSB7CisJCQlpZiAoZXhwciA9PSBzdGFydF9leHByKSB7CisJCQkJLyogTnVsbCBleHByZXNzaW9uICovCisJCQkJbnVtc3RhY2stPnZhbCA9IDA7CisJCQkJZ290byByZXQ7CisJCQl9CisKKwkJCS8qIFRoaXMgaXMgb25seSByZWFjaGVkIGFmdGVyIGFsbCB0b2tlbnMgaGF2ZSBiZWVuIGV4dHJhY3RlZCBmcm9tIHRoZQorCQkJICogaW5wdXQgc3RyZWFtLiBJZiB0aGVyZSBhcmUgc3RpbGwgdG9rZW5zIG9uIHRoZSBvcGVyYXRvciBzdGFjaywgdGhleQorCQkJICogYXJlIHRvIGJlIGFwcGxpZWQgaW4gb3JkZXIuIEF0IHRoZSBlbmQsIHRoZXJlIHNob3VsZCBiZSBhIGZpbmFsCisJCQkgKiByZXN1bHQgb24gdGhlIGludGVnZXIgc3RhY2sgKi8KKworCQkJaWYgKGV4cHIgIT0gcHRyX3RvX3JwYXJlbiArIDEpIHsKKwkJCQkvKiBJZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeSwKKwkJCQkgKiBhcHBlbmQgYSBjbG9zaW5nIHJpZ2h0IHBhcmVuCisJCQkJICogYW5kIGxldCB0aGUgbG9vcCBwcm9jZXNzIGl0ICovCisJCQkJZXhwciA9IHB0cl90b19ycGFyZW47CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBBdCB0aGlzIHBvaW50LCB3ZSdyZSBkb25lIHdpdGggdGhlIGV4cHJlc3Npb24gKi8KKwkJCWlmIChudW1zdGFja3B0ciAhPSBudW1zdGFjayArIDEpIHsKKwkJCQkvKiAuLi5idXQgaWYgdGhlcmUgaXNuJ3QsIGl0J3MgYmFkICovCisJCQkJZ290byBlcnI7CisJCQl9CisJCQlpZiAobnVtc3RhY2stPnZhcikgeworCQkJCS8qIGV4cHJlc3Npb24gaXMgJCgodmFyKSkgb25seSwgbG9va3VwIG5vdyAqLworCQkJCWVycm1zZyA9IGFyaXRoX2xvb2t1cF92YWwobWF0aF9zdGF0ZSwgbnVtc3RhY2spOworCQkJfQorCQkJZ290byByZXQ7CisJCX0KKworCQlwID0gZW5kb2ZuYW1lKGV4cHIpOworCQlpZiAocCAhPSBleHByKSB7CisJCQkvKiBOYW1lICovCisJCQlzaXplX3QgdmFyX25hbWVfc2l6ZSA9IChwLWV4cHIpICsgMTsgIC8qICsxIGZvciBOVUwgKi8KKwkJCW51bXN0YWNrcHRyLT52YXIgPSBhbGxvY2EodmFyX25hbWVfc2l6ZSk7CisJCQlzYWZlX3N0cm5jcHkobnVtc3RhY2twdHItPnZhciwgZXhwciwgdmFyX25hbWVfc2l6ZSk7CisJCQlleHByID0gcDsKKyBudW06CisJCQludW1zdGFja3B0ci0+c2Vjb25kX3ZhbF9wcmVzZW50ID0gMDsKKwkJCW51bXN0YWNrcHRyKys7CisJCQlsYXN0dG9rID0gVE9LX05VTTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGlzZGlnaXQoYXJpdGh2YWwpKSB7CisJCQkvKiBOdW1iZXIgKi8KKwkJCW51bXN0YWNrcHRyLT52YXIgPSBOVUxMOworCQkJZXJybm8gPSAwOworCQkJbnVtc3RhY2twdHItPnZhbCA9IHN0cnRvX2FyaXRoX3QoZXhwciwgKGNoYXIqKikgJmV4cHIsIDApOworCQkJaWYgKGVycm5vKQorCQkJCW51bXN0YWNrcHRyLT52YWwgPSAwOyAvKiBiYXNoIGNvbXBhdCAqLworCQkJZ290byBudW07CisJCX0KKworCQkvKiBTaG91bGQgYmUgYW4gb3BlcmF0b3IgKi8KKwkJcCA9IG9wX3Rva2VuczsKKwkJd2hpbGUgKDEpIHsKKy8vIFRPRE86IGJhc2ggYWxsb3dzIDcrKyt2LCB0cmVhdHMgaXQgYXMgNyArICsrdgorLy8gd2UgdHJlYXQgaXQgYXMgNysrICsgdiBhbmQgcmVqZWN0CisJCQkvKiBDb21wYXJlIGV4cHIgdG8gY3VycmVudCBvcF90b2tlbnNbXSBlbGVtZW50ICovCisJCQljb25zdCBjaGFyICplID0gZXhwcjsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCpwID09ICdcMCcpIHsKKwkJCQkJLyogTWF0Y2g6IG9wZXJhdG9yIGlzIGZvdW5kICovCisJCQkJCWV4cHIgPSBlOworCQkJCQlnb3RvIHRva19mb3VuZDsKKwkJCQl9CisJCQkJaWYgKCpwICE9ICplKQorCQkJCQlicmVhazsKKwkJCQlwKys7CisJCQkJZSsrOworCQkJfQorCQkJLyogTm8gbWF0Y2gsIGdvIHRvIG5leHQgZWxlbWVudCBvZiBvcF90b2tlbnNbXSAqLworCQkJd2hpbGUgKCpwKQorCQkJCXArKzsKKwkJCXAgKz0gMjsgLyogc2tpcCBOVUwgYW5kIFRPS19mb28gYnl0ZXMgKi8KKwkJCWlmICgqcCA9PSAnXDAnKSB7CisJCQkJLyogTm8gbmV4dCBlbGVtZW50LCBvcGVyYXRvciBub3QgZm91bmQgKi8KKwkJCQkvL21hdGhfc3RhdGUtPnN5bnRheF9lcnJvcl9hdCA9IGV4cHI7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKyB0b2tfZm91bmQ6CisJCW9wID0gcFsxXTsgLyogZmV0Y2ggVE9LX2ZvbyB2YWx1ZSAqLworCQkvKiBOQjogZXhwciBub3cgcG9pbnRzIHBhc3QgdGhlIG9wZXJhdG9yICovCisKKwkJLyogcG9zdCBncmFtbWFyOiBhKysgcmVkdWNlIHRvIG51bSAqLworCQlpZiAobGFzdHRvayA9PSBUT0tfUE9TVF9JTkMgfHwgbGFzdHRvayA9PSBUT0tfUE9TVF9ERUMpCisJCQlsYXN0dG9rID0gVE9LX05VTTsKKworCQkvKiBQbHVzIGFuZCBtaW51cyBhcmUgYmluYXJ5IChub3QgdW5hcnkpIF9vbmx5XyBpZiB0aGUgbGFzdAorCQkgKiB0b2tlbiB3YXMgYSBudW1iZXIsIG9yIGEgcmlnaHQgcGFyZW4gKHdoaWNoIHByZXRlbmRzIHRvIGJlCisJCSAqIGEgbnVtYmVyLCBzaW5jZSBpdCBldmFsdWF0ZXMgdG8gb25lKS4gVGhpbmsgYWJvdXQgaXQuCisJCSAqIEl0IG1ha2VzIHNlbnNlLiAqLworCQlpZiAobGFzdHRvayAhPSBUT0tfTlVNKSB7CisJCQlzd2l0Y2ggKG9wKSB7CisJCQljYXNlIFRPS19BREQ6CisJCQkJb3AgPSBUT0tfVVBMVVM7CisJCQkJYnJlYWs7CisJCQljYXNlIFRPS19TVUI6CisJCQkJb3AgPSBUT0tfVU1JTlVTOworCQkJCWJyZWFrOworCQkJY2FzZSBUT0tfUE9TVF9JTkM6CisJCQkJb3AgPSBUT0tfUFJFX0lOQzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVE9LX1BPU1RfREVDOgorCQkJCW9wID0gVE9LX1BSRV9ERUM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogV2UgZG9uJ3Qgd2FudCBhbiB1bmFyeSBvcGVyYXRvciB0byBjYXVzZSByZWN1cnNpdmUgZGVzY2VudCBvbiB0aGUKKwkJICogc3RhY2ssIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgaW4gYSByb3cgYW5kIGl0IGNvdWxkIGNhdXNlIGFuCisJCSAqIG9wZXJhdG9yIHRvIGJlIGV2YWx1YXRlZCBiZWZvcmUgaXRzIGFyZ3VtZW50IGlzIHB1c2hlZCBvbnRvIHRoZQorCQkgKiBpbnRlZ2VyIHN0YWNrLgorCQkgKiBCdXQgZm9yIGJpbmFyeSBvcGVyYXRvcnMsICJhcHBseSIgZXZlcnl0aGluZyBvbiB0aGUgb3BlcmF0b3IKKwkJICogc3RhY2sgdW50aWwgd2UgZmluZCBhbiBvcGVyYXRvciB3aXRoIGEgbGVzc2VyIHByaW9yaXR5IHRoYW4gdGhlCisJCSAqIG9uZSB3ZSBoYXZlIGp1c3QgZXh0cmFjdGVkLiBJZiBvcCBpcyByaWdodC1hc3NvY2lhdGl2ZSwKKwkJICogdGhlbiBzdG9wICJhcHBseWluZyIgb24gdGhlIGVxdWFsIHByaW9yaXR5IHRvby4KKwkJICogTGVmdCBwYXJlbiBpcyBnaXZlbiB0aGUgbG93ZXN0IHByaW9yaXR5IHNvIGl0IHdpbGwgbmV2ZXIgYmUKKwkJICogImFwcGxpZWQiIGluIHRoaXMgd2F5LgorCQkgKi8KKwkJcHJlYyA9IFBSRUMob3ApOworCQlpZiAoKHByZWMgPiAwICYmIHByZWMgPCBVTkFSWVBSRUMpIHx8IHByZWMgPT0gU1BFQ19QUkVDKSB7CisJCQkvKiBub3QgbGVmdCBwYXJlbiBvciB1bmFyeSAqLworCQkJaWYgKGxhc3R0b2sgIT0gVE9LX05VTSkgeworCQkJCS8qIGJpbmFyeSBvcCBtdXN0IGJlIHByZWNlZGVkIGJ5IGEgbnVtICovCisJCQkJZ290byBlcnI7CisJCQl9CisJCQl3aGlsZSAoc3RhY2twdHIgIT0gc3RhY2spIHsKKwkJCQlvcGVyYXRvciBwcmV2X29wID0gKi0tc3RhY2twdHI7CisJCQkJaWYgKG9wID09IFRPS19SUEFSRU4pIHsKKwkJCQkJLyogVGhlIGFsZ29yaXRobSBlbXBsb3llZCBoZXJlIGlzIHNpbXBsZTogd2hpbGUgd2UgZG9uJ3QKKwkJCQkJICogaGl0IGFuIG9wZW4gcGFyZW4gbm9yIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLCBwb3AKKwkJCQkJICogdG9rZW5zIGFuZCBhcHBseSB0aGVtICovCisJCQkJCWlmIChwcmV2X29wID09IFRPS19MUEFSRU4pIHsKKwkJCQkJCS8qIEFueSBvcGVyYXRvciBkaXJlY3RseSBhZnRlciBhCisJCQkJCQkgKiBjbG9zZSBwYXJlbiBzaG91bGQgY29uc2lkZXIgaXRzZWxmIGJpbmFyeSAqLworCQkJCQkJbGFzdHRvayA9IFRPS19OVU07CisJCQkJCQlnb3RvIG5leHQ7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlvcGVyYXRvciBwcmV2X3ByZWMgPSBQUkVDKHByZXZfb3ApOworCQkJCQlmaXhfYXNzaWdubWVudF9wcmVjKHByZWMpOworCQkJCQlmaXhfYXNzaWdubWVudF9wcmVjKHByZXZfcHJlYyk7CisJCQkJCWlmIChwcmV2X3ByZWMgPCBwcmVjCisJCQkJCSB8fCAocHJldl9wcmVjID09IHByZWMgJiYgaXNfcmlnaHRfYXNzb2NpYXRpdmUocHJlYykpCisJCQkJCSkgeworCQkJCQkJc3RhY2twdHIrKzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWVycm1zZyA9IGFyaXRoX2FwcGx5KG1hdGhfc3RhdGUsIHByZXZfb3AsIG51bXN0YWNrLCAmbnVtc3RhY2twdHIpOworCQkJCWlmIChlcnJtc2cpCisJCQkJCWdvdG8gZXJyX3dpdGhfY3VzdG9tX21zZzsKKwkJCX0KKwkJCWlmIChvcCA9PSBUT0tfUlBBUkVOKQorCQkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogUHVzaCB0aGlzIG9wZXJhdG9yIHRvIHRoZSBzdGFjayBhbmQgcmVtZW1iZXIgaXQgKi8KKwkJKnN0YWNrcHRyKysgPSBsYXN0dG9rID0gb3A7CisgbmV4dDogOworCX0gLyogd2hpbGUgKDEpICovCisKKyBlcnI6CisJZXJybXNnID0gImFyaXRobWV0aWMgc3ludGF4IGVycm9yIjsKKyBlcnJfd2l0aF9jdXN0b21fbXNnOgorCW51bXN0YWNrLT52YWwgPSAtMTsKKyByZXQ6CisJbWF0aF9zdGF0ZS0+ZXJybXNnID0gZXJybXNnOworCXJldHVybiBudW1zdGFjay0+dmFsOworfQorCithcml0aF90IEZBU1RfRlVOQworYXJpdGgoYXJpdGhfc3RhdGVfdCAqbWF0aF9zdGF0ZSwgY29uc3QgY2hhciAqZXhwcikKK3sKKwltYXRoX3N0YXRlLT5lcnJtc2cgPSBOVUxMOworCW1hdGhfc3RhdGUtPmxpc3Rfb2ZfcmVjdXJzZWRfbmFtZXMgPSBOVUxMOworCXJldHVybiBldmFsdWF0ZV9zdHJpbmcobWF0aF9zdGF0ZSwgZXhwcik7Cit9CisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEsIDE5OTMsIDE5OTQKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21hdGguaCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDMwNWViCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbWF0aC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIG1hdGguaCAtIGludGVyZmFjZSB0byBzaGVsbCBtYXRoICJsaWJyYXJ5IiAtLSB0aGlzIGFsbG93cyBzaGVsbHMgdG8gc2hhcmUKKyAqICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhcml0aG1ldGljICQoKC4uLikpIGV4cGFuc2lvbnMuCisgKgorICogVGhpcyBhaW1zIHRvIGJlIGEgUE9TSVggc2hlbGwgbWF0aCBsaWJyYXJ5IGFzIGRvY3VtZW50ZWQgaGVyZToKKyAqCWh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL1YzX2NoYXAwMi5odG1sI3RhZ18xOF8wNl8wNAorICoKKyAqIFNlZSBtYXRoLmMgZm9yIGludGVybmFsIGRvY3VtZW50YXRpb24uCisgKi8KKworLyogVGhlIG1hdGggbGlicmFyeSBoYXMganVzdCBvbmUgZnVuY3Rpb246CisgKgorICogYXJpdGhfdCBhcml0aChhcml0aF9zdGF0ZV90ICpzdGF0ZSwgY29uc3QgY2hhciAqZXhwcik7CisgKgorICogVGhlIGV4cHIgYXJndW1lbnQgaXMgdGhlIG1hdGggc3RyaW5nIHRvIHBhcnNlLiAgQWxsIG5vcm1hbCBleHBhbnNpb25zIG11c3QKKyAqIGJlIGRvbmUgYWxyZWFkeS4gIGkuZS4gbm8gZG9sbGFyIHN5bWJvbHMgc2hvdWxkIGJlIHByZXNlbnQuCisgKgorICogVGhlIHN0YXRlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBvZiBob29rcyBmb3IgeW91ciBzaGVsbCAoc2VlIGJlbG93KSwKKyAqIGFuZCBhbiBlcnJvciBtZXNzYWdlIHN0cmluZyAoTlVMTCBpZiBubyBlcnJvcikuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFuc3dlciB0byB0aGUgZXhwcmVzc2lvbi4gIFNvIGlmIHlvdSBjYWxsZWQgaXQKKyAqIHdpdGggdGhlIGV4cHJlc3Npb246CisgKiAiMSArIDIgKyAzIgorICogeW91IHdvdWxkIG9idmlvdXNseSBnZXQgYmFjayA2LgorICovCisKKy8qIFRvIGFkZCBzdXBwb3J0IHRvIGEgc2hlbGwsIHlvdSBuZWVkIHRvIGltcGxlbWVudCB0aHJlZSBmdW5jdGlvbnM6CisgKgorICogbG9va3VwdmFyKCkgLSBsb29rIHVwIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUKKyAqCisgKglJZiB0aGUgc2hlbGwgZG9lczoKKyAqCQlmb289MTIzCisgKglUaGVuIHRoZSBjb2RlOgorICoJCWNvbnN0IGNoYXIgKnZhbCA9IGxvb2t1cHZhcigiZm9vIik7CisgKgl3aWxsIHJlc3VsdCBpbiB2YWwgcG9pbnRpbmcgdG8gIjEyMyIKKyAqCisgKiBzZXR2YXIoKSAtIHNldCBhIHZhcmlhYmxlIHRvIHNvbWUgdmFsdWUKKyAqCisgKglJZiB0aGUgYXJpdGhtZXRpYyBleHBhbnNpb24gZG9lcyBzb21ldGhpbmcgbGlrZToKKyAqCQkkKCggaSA9IDEpKQorICoJdGhlbiB0aGUgbWF0aCBjb2RlIHdpbGwgbWFrZSBhIGNhbGwgbGlrZSBzbzoKKyAqCQlzZXR2YXIoImkiLCAiMSIsIDApOworICoJVGhlIHN0b3JhZ2UgZm9yIHRoZSBmaXJzdCB0d28gcGFyYW1ldGVycyBhcmUgbm90IGFsbG9jYXRlZCwgc28geW91cgorICoJc2hlbGwgaW1wbGVtZW50YXRpb24gd2lsbCBtb3N0IGxpa2VseSBuZWVkIHRvIHN0cmR1cCgpIHRoZW0gdG8gc2F2ZS4KKyAqCisgKiBlbmRvZm5hbWUoKSAtIHJldHVybiB0aGUgZW5kIG9mIGEgdmFyaWFibGUgbmFtZSBmcm9tIGlucHV0CisgKgorICoJVGhlIGFyaXRobWV0aWMgY29kZSBkb2VzIG5vdCBrbm93IGFib3V0IHZhcmlhYmxlIG5hbWluZyBjb252ZW50aW9ucy4KKyAqCVNvIHdoZW4gaXQgaXMgZ2l2ZW4gYW4gZXhwZXJlc3Npb24sIGl0IGtub3dzIHNvbWV0aGluZyBpcyBub3QgbnVtZXJpYywKKyAqCWJ1dCBpdCBpcyB1cCB0byB0aGUgc2hlbGwgdG8gZGljdGF0ZSB3aGF0IGlzIGEgdmFsaWQgaWRlbnRpZmllcnMuCisgKglTbyB3aGVuIGl0IGVuY291bnRlcnMgc29tZXRoaW5nIGxpa2U6CisgKgkJJCgoIHNvbWVfdmFyICsgMTIzICkpCisgKglJdCB3aWxsIG1ha2UgYSBjYWxsIGxpa2Ugc286CisgKgkJZW5kID0gZW5kb2ZuYW1lKCJzb21lX3ZhciArIDEyMyIpOworICoJU28gdGhlIHNoZWxsIG5lZWRzIHRvIHNjYW4gdGhlIGlucHV0IHN0cmluZyBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUKKyAqCWZpcnN0IG5vbi1pZGVudGlmaWVyIHN0cmluZy4gIEluIHRoaXMgY2FzZSwgaXQgc2hvdWxkIHJldHVybiB0aGUgaW5wdXQKKyAqCXBvaW50ZXIgd2l0aCBhbiBvZmZzZXQgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IHNwYWNlLiAgVGhlIHR5cGljYWwKKyAqCWltcGxlbWVudGF0aW9uIHdpbGwgcmV0dXJuIHRoZSBvZmZzZXQgb2YgZmlyc3QgY2hhciB0aGF0IGRvZXMgbm90IG1hdGNoCisgKgl0aGUgcmVnZXggKGluIEMgbG9jYWxlKTogXlthLXpBLVpfXVthLXpBLVpfMC05XSoKKyAqLworCisjaWZuZGVmIFNIRUxMX01BVEhfSAorI2RlZmluZSBTSEVMTF9NQVRIX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlRfNjQKK3R5cGVkZWYgbG9uZyBsb25nIGFyaXRoX3Q7CisjZGVmaW5lIEFSSVRIX0ZNVCAiJWxsZCIKKyNkZWZpbmUgc3RydG9fYXJpdGhfdCBzdHJ0b3VsbAorI2Vsc2UKK3R5cGVkZWYgbG9uZyBhcml0aF90OworI2RlZmluZSBBUklUSF9GTVQgIiVsZCIKKyNkZWZpbmUgc3RydG9fYXJpdGhfdCBzdHJ0b3VsCisjZW5kaWYKKworLyogYXNoJ3MgYW5kIGh1c2gncyBlbmRvZm5hbWUgaXMgdGhlIHNhbWUsIHNvLi4uICovCisjIGRlZmluZSBpc19uYW1lKGMpICAgICAgKChjKSA9PSAnXycgfHwgaXNhbHBoYSgodW5zaWduZWQgY2hhcikoYykpKQorIyBkZWZpbmUgaXNfaW5fbmFtZShjKSAgICgoYykgPT0gJ18nIHx8IGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpKGMpKSkKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBlbmRvZm5hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKK3R5cGVkZWYgY29uc3QgY2hhciogRkFTVF9GVU5DICgqYXJpdGhfdmFyX2xvb2t1cF90KShjb25zdCBjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAgICAgICAgRkFTVF9GVU5DICgqYXJpdGhfdmFyX3NldF90KShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpOworLy90eXBlZGVmIGNvbnN0IGNoYXIqIEZBU1RfRlVOQyAoKmFyaXRoX3Zhcl9lbmRvZm5hbWVfdCkoY29uc3QgY2hhciAqbmFtZSk7CisKK3R5cGVkZWYgc3RydWN0IGFyaXRoX3N0YXRlX3QgeworCWNvbnN0IGNoYXIgICAgICAgICAgICplcnJtc2c7CisJYXJpdGhfdmFyX2xvb2t1cF90ICAgIGxvb2t1cHZhcjsKKwlhcml0aF92YXJfc2V0X3QgICAgICAgc2V0dmFyOworLy8JYXJpdGhfdmFyX2VuZG9mbmFtZV90IGVuZG9mbmFtZTsKKwl2b2lkICAgICAgICAgICAgICAgICAqbGlzdF9vZl9yZWN1cnNlZF9uYW1lczsKK30gYXJpdGhfc3RhdGVfdDsKKworYXJpdGhfdCBGQVNUX0ZVTkMgYXJpdGgoYXJpdGhfc3RhdGVfdCAqc3RhdGUsIGNvbnN0IGNoYXIgKmV4cHIpOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL25vZW9sMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL25vZW9sMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY4NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvbm9lb2wzLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL25vZW9sMy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL25vZW9sMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYzk1OGVkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvbm9lb2wzLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorIyBsYXN0IGxpbmUgaGFzIG5vIEVPTCEKK2VjaG8gInVudGVybWluYXRlZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Byb2Nlc3Nfc3Vic3QucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9wcm9jZXNzX3N1YnN0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2JjODAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9wcm9jZXNzX3N1YnN0LnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorVEVTVHp6QkVTVAorVEVTVCQoZWNobyB6eilCRVNUCitURVNUJ0JFU1QKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Byb2Nlc3Nfc3Vic3QudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9wcm9jZXNzX3N1YnN0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIxOTk2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9wcm9jZXNzX3N1YnN0LnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZWNobyAiVEVTVGBlY2hvIHp6O2VjaG87ZWNob2BCRVNUIgorZWNobyAiVEVTVGBlY2hvICckKGVjaG8genopJ2BCRVNUIgorZWNobyAiVEVTVGBlY2hvICInImBCRVNUIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcmVhZC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3JlYWQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1MGUyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3JlYWQucmlnaHQKQEAgLTAsMCArMSw0IEBACityZWFkCitjYXQKK2VjaG8gIlJFUExZPSRSRVBMWSIKK1JFUExZPWV4ZWMgPHJlYWQudGVzdHMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3JlYWQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9yZWFkLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmMWFjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9yZWFkLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAorZXhlYyA8cmVhZC50ZXN0cworcmVhZAorY2F0CitlY2hvICJSRVBMWT0kUkVQTFkiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zaGlmdC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3NoaWZ0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODFlMzUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zaGlmdC5yaWdodApAQCAtMCwwICsxLDYgQEAKKy4vc2hpZnQudGVzdHMgYWJjIGQgZQorLi9zaGlmdC50ZXN0cyBkIGUgMTIzCisuL3NoaWZ0LnRlc3RzIGQgZSAxMjMKKy4vc2hpZnQudGVzdHMKKy4vc2hpZnQudGVzdHMKKy4vc2hpZnQudGVzdHMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3NoaWZ0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc2hpZnQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTNlZjI0OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3NoaWZ0LnRlc3RzCkBAIC0wLDAgKzEsMTQgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICQwIGFiYyAiZCBlIiAxMjMKK2ZpCitlY2hvICQwICQxICQyCitzaGlmdAorZWNobyAkMCAkMSAkMgorc2hpZnQgOTk5CitlY2hvICQwICQxICQyCitzaGlmdCAyCitlY2hvICQwICQxICQyCitzaGlmdCAyCitlY2hvICQwICQxICQyCitzaGlmdAorZWNobyAkMCAkMSAkMgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3RhcnF1b3RlZC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N0YXJxdW90ZWQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2MzIzZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N0YXJxdW90ZWQucmlnaHQKQEAgLTAsMCArMSw4IEBACisuMSBhYmMgZCBlIGYuCisuMS4KKy5hYmMuCisuZCBlIGYuCisuLTEgYWJjIGQgZSBmLS4KKy4tMS4KKy5hYmMuCisuZCBlIGYtLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3RhcnF1b3RlZC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N0YXJxdW90ZWQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmZlNDliMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N0YXJxdW90ZWQudGVzdHMKQEAgLTAsMCArMSw4IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIDEgYWJjICdkIGUgZicKK2ZpCisKK2ZvciBhIGluICIkKiI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCitmb3IgYSBpbiAiJEAiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorZm9yIGEgaW4gIi0kKi0iOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorZm9yIGEgaW4gIi0kQC0iOyBkbyBlY2hvICIuJGEuIjsgZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3ludGF4X2Vyci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N5bnRheF9lcnIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhMjcwYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N5bnRheF9lcnIucmlnaHQKQEAgLTAsMCArMSwyIEBACitzaG93bgoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3ludGF4X2Vyci50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N5bnRheF9lcnIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDEwZWQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N5bnRheF9lcnIudGVzdHMKQEAgLTAsMCArMSwzIEBACitlY2hvIHNob3duCitlY2hvIHRlc3QgYGVjaG8gJ2FhYAorZWNobyBub3Qgc2hvd24KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9hc3NpZ24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyMjEwZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAorLiAuCisuYWJjIGQgZS4KKy5hYmMgZCBlLgorLmFiYyBkIGUuCisuYWJjIGQgZS4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9hc3NpZ24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMThjZGM3NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnRlc3RzCkBAIC0wLDAgKzEsMTUgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgYWJjICJkIGUiCitmaQorCitzcGFjZT0nICcKK2VjaG8gLiRzcGFjZS4KKworYT0kKgorZWNobyAuJGEuCithPSRACitlY2hvIC4kYS4KK2E9IiQqIgorZWNobyAuJGEuCithPSIkQCIKK2VjaG8gLiRhLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9yZWRpci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fcmVkaXIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzMjk5YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fcmVkaXIucmlnaHQKQEAgLTAsMCArMSwzIEBACitURVNUMQorVEVTVDIKK1RFU1QzCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX3JlZGlyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9yZWRpci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZGE2YmRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9yZWRpci50ZXN0cwpAQCAtMCwwICsxLDEzIEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIGFiYyAiZCBlIgorZmkKKworZWNobyBURVNUMSA+IiQxLm91dCIKK2VjaG8gVEVTVDIgPiIkMi5vdXQiCisjIGJhc2ggc2F5czogIiRALm91dCI6IGFtYmlndW91cyByZWRpcmVjdAorIyBhc2ggaGFuZGxlcyBpdCBhcyBpZiBpdCBpcyAnJConIC0gd2UgZG8gdGhlIHNhbWUKK2VjaG8gVEVTVDMgPiIkQC5vdXQiCisKK2NhdCBhYmMub3V0ICJkIGUub3V0IiAiYWJjIGQgZS5vdXQiCisKK3JtIGFiYy5vdXQgImQgZS5vdXQiICJhYmMgZCBlLm91dCIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRUFDQ0VTLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FQUNDRVMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NDgwYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRUFDQ0VTLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorLi86IGNhbid0IGV4ZWN1dGUKKzEyNgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FQUNDRVMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VBQ0NFUy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNmI1YzYxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FQUNDRVMudGVzdHMKQEAgLTAsMCArMSwyIEBACisuLworZWNobyAkPwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FTk9FTlQucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VOT0VOVC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ5ZDJjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FTk9FTlQucmlnaHQKQEAgLTAsMCArMSwyIEBACisuL2RvZXNfbm90X2V4aXN0X2Zvcl9zdXJlOiBub3QgZm91bmQKKzEyNwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FTk9FTlQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VOT0VOVC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZjFiODhhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FTk9FTlQudGVzdHMKQEAgLTAsMCArMSwyIEBACisuL2RvZXNfbm90X2V4aXN0X2Zvcl9zdXJlCitlY2hvICQ/CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL21hbnlfY29udGludWVzLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9tYW55X2NvbnRpbnVlcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9tYW55X2NvbnRpbnVlcy5yaWdodApAQCAtMCwwICsxIEBACitPSwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9tYW55X2NvbnRpbnVlcy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbWFueV9jb250aW51ZXMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODZjNzI5YQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbWFueV9jb250aW51ZXMudGVzdHMKQEAgLTAsMCArMSwxNSBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICAjIENoaWxkIHdpbGwga2lsbCB1cyBpbiAxIHNlY29uZAorICAgICIkVEhJU19TSCIgIiQwIiAkJCAmCisKKyAgICAjIExvb3AgbWFueSwgbWFueSB0aW1lcworICAgIHRyYXAgJ2VjaG8gT0s7IGV4aXQgMCcgMTUKKyAgICB3aGlsZSB0cnVlOyBkbworCWNvbnRpbnVlCisgICAgZG9uZQorICAgIGVjaG8gQkFECisgICAgZXhpdCAxCitmaQorCitzbGVlcCAxCitraWxsICQxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL25lc3RlZF9icmVhay5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbmVzdGVkX2JyZWFrLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOGI2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL25lc3RlZF9icmVhay5yaWdodApAQCAtMCwwICsxLDggQEAKK0EKK0IKK2l0ZXJhdGlvbgorQworQQorQgoraXRlcmF0aW9uCitECmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL25lc3RlZF9icmVhay50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbmVzdGVkX2JyZWFrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhOTU0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL25lc3RlZF9icmVhay50ZXN0cwpAQCAtMCwwICsxLDE3IEBACisjIFRlc3RjYXNlIGZvciBodHRwOi8vYnVncy5idXN5Ym94Lm5ldC92aWV3LnBocD9pZD04NDYKKworbj0wCit3aGlsZSA6CitkbworCWVjaG8gQQorCXdoaWxlIDoKKwlkbworCQllY2hvIEIKKwkJYnJlYWsKKwlkb25lCisJZWNobyBpdGVyYXRpb24KKwlbICRuID0gMSBdICYmIGJyZWFrCisJZWNobyBDCisJbj1gZXhwciAkbiArIDFgCitkb25lCitlY2hvIEQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1taXNjL3RpY2sucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtbWlzYy90aWNrLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDI4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtbWlzYy90aWNrLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorMQorMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLW1pc2MvdGljay50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1taXNjL3RpY2sudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWY3NDlhOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1taXNjL3RpY2sudGVzdHMKQEAgLTAsMCArMSw0IEBACit0cnVlCitmYWxzZTsgZWNobyBgZWNobyAkP2AKK3RydWUKK3sgZmFsc2U7IGVjaG8gYGVjaG8gJD9gOyB9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9hcmd2MC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL2FyZ3YwLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmJhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9hcmd2MC5yaWdodApAQCAtMCwwICsxIEBACitPSwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvYXJndjAudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9hcmd2MC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNWM0MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvYXJndjAudGVzdHMKQEAgLTAsMCArMSw0IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIGFyZworZmkKK2VjaG8gT0sKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNzk4NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0hFTExPCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5MzExM2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbC50ZXN0cwpAQCAtMCwwICsxLDIgQEAKKyMgbmV4dCBsaW5lIGhhcyBubyBFT0whCitlY2hvIEhFTExPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDQ5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbDIucmlnaHQKQEAgLTAsMCArMSBAQAorMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyMjBmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbDIudGVzdHMKQEAgLTAsMCArMSw3IEBACisjIGxhc3QgbGluZSBoYXMgbm8gRU9MIQoraWYgdHJ1ZQordGhlbgorICBlY2hvIDEKK2Vsc2UKKyAgZWNobyAyCitmaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMS5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM4MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKycxJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUxLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1NTg5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTEudGVzdHMKQEAgLTAsMCArMSwyIEBACithPTEKK2VjaG8gIickYSciCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTIucmlnaHQgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjOWVkYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMi5yaWdodApAQCAtMCwwICsxIEBACis+MQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkOTY2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTIudGVzdHMKQEAgLTAsMCArMSwyIEBACithPTEKK2VjaG8gIj4kYSIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMy5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlhNDZlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUzLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorVGVzdGluZzogaW4gJGVtcHR5IiIKKy4uCitGaW5pc2hlZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUzLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3NWU3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTMudGVzdHMKQEAgLTAsMCArMSw4IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiBxdW90ZTMudGVzdHMgYWJjICJkIGUiCitmaQorCitlY2hvICdUZXN0aW5nOiBpbiAkZW1wdHkiIicKK2VtcHR5PScnCitmb3IgYSBpbiAkZW1wdHkiIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKK2VjaG8gRmluaXNoZWQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlNC5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjkwMWVhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGU0LnJpZ2h0CkBAIC0wLDAgKzEgQEAKK2EgYgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGU0LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGU0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxZGFiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTQudGVzdHMKQEAgLTAsMCArMSwyIEBACithX2I9J2EgYicKK2VjaG8gIiRhX2IiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy9zdGFyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvc3Rhci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWNjNTViCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvc3Rhci5yaWdodApAQCAtMCwwICsxLDYgQEAKKy4xLgorLmFiYy4KKy5kLgorLmUuCisuZi4KKy4xIGFiYyBkIGUgZi4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3N0YXIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy9zdGFyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1NTRjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy9zdGFyLnRlc3RzCkBAIC0wLDAgKzEsOCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgc3Rhci50ZXN0cyAxIGFiYyAnZCBlIGYnCitmaQorIyAnZCBlIGYnIHNob3VsZCBiZSBzcGxpdCBpbnRvIDMgc2VwYXJhdGUgYXJnczoKK2ZvciBhIGluICQqOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCisjIG11c3QgcHJvZHVjZSAuMSBhYmMgZCBlIGYuCitmb3IgYSBpbiAiJCoiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyLnJpZ2h0IGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjIzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXIucmlnaHQKQEAgLTAsMCArMSw0IEBACitodHRwOi8vYnVzeWJveC5uZXQKK2h0dHA6Ly9idXN5Ym94Lm5ldF9hYmMKKzEKKzEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhci50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTYzNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorVVJMPWh0dHA6Ly9idXN5Ym94Lm5ldAorCitlY2hvICRVUkwKK2VjaG8gJHtVUkx9X2FiYworCit0cnVlCitmYWxzZTsgZWNobyAkPwordHJ1ZQoreyBmYWxzZTsgZWNobyAkPzsgfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci5yaWdodCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhY2ExYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IucmlnaHQKQEAgLTAsMCArMSw0MCBAQAorVGVzdGluZzogaW4geCB5IHoKKy54LgorLnkuCisuei4KK1Rlc3Rpbmc6IGluIHUgJGVtcHR5IHYKKy51LgorLnYuCitUZXN0aW5nOiBpbiB1ICIgJGVtcHR5IiB2CisudS4KKy4gLgorLnYuCitUZXN0aW5nOiBpbiB1ICRlbXB0eSAkZW1wdHkkYSB2CisudS4KKy5hLgorLnYuCitUZXN0aW5nOiBpbiAkYV9iCisuYS4KKy5iLgorVGVzdGluZzogaW4gJCoKKy5hYmMuCisuZC4KKy5lLgorVGVzdGluZzogaW4gJEAKKy5hYmMuCisuZC4KKy5lLgorVGVzdGluZzogaW4gLSQqLQorLi1hYmMuCisuZC4KKy5lLS4KK1Rlc3Rpbmc6IGluIC0kQC0KKy4tYWJjLgorLmQuCisuZS0uCitUZXN0aW5nOiBpbiAkYV9iIC0kYV9iLQorLmEuCisuYi4KKy4tYS4KKy5iLS4KK0ZpbmlzaGVkCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZDFjMTEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci50ZXN0cwpAQCAtMCwwICsxLDQwIEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiB2YXJfc3Vic3RfaW5fZm9yLnRlc3RzIGFiYyAiZCBlIgorZmkKKworZWNobyAnVGVzdGluZzogaW4geCB5IHonCitmb3IgYSBpbiB4IHkgejsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gdSAkZW1wdHkgdicKK2VtcHR5PScnCitmb3IgYSBpbiB1ICRlbXB0eSB2OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiB1ICIgJGVtcHR5IiB2JworZW1wdHk9JycKK2ZvciBhIGluIHUgIiAkZW1wdHkiIHY7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIHUgJGVtcHR5ICRlbXB0eSRhIHYnCithPSdhJworZm9yIGEgaW4gdSAkZW1wdHkgJGVtcHR5JGEgdjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJGFfYicKK2FfYj0nYSBiJworZm9yIGEgaW4gJGFfYjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJConCitmb3IgYSBpbiAkKjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJEAnCitmb3IgYSBpbiAkQDsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gLSQqLScKK2ZvciBhIGluIC0kKi07IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIC0kQC0nCitmb3IgYSBpbiAtJEAtOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkYV9iIC0kYV9iLScKK2FfYj0nYSBiJworZm9yIGEgaW4gJGFfYiAtJGFfYi07IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gRmluaXNoZWQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL21zaF90ZXN0L3J1bi1hbGwgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9ydW4tYWxsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5ZjYyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9tc2hfdGVzdC9ydW4tYWxsCkBAIC0wLDAgKzEsNjQgQEAKKyMhL2Jpbi9zaAorCit0ZXN0IC14IG1zaCB8fCB7CisgICAgZWNobyAiTm8gLi9tc2ggLSBjcmVhdGluZyBhIGxpbmsgdG8gLi4vLi4vYnVzeWJveCIKKyAgICBsbiAtcyAuLi8uLi9idXN5Ym94IG1zaAorfQorCitQQVRIPSIkUFdEOiRQQVRIIiAjIGZvciBtc2gKK2V4cG9ydCBQQVRICisKK1RISVNfU0g9IiRQV0QvbXNoIgorZXhwb3J0IFRISVNfU0gKKworZG9fdGVzdCgpCit7CisgICAgdGVzdCAtZCAiJDEiIHx8IHJldHVybiAwCisjICAgZWNobyBSdW5uaW5nIHRlc3RzIGluIGRpcmVjdG9yeSAiJDEiCisgICAgKAorICAgIGNkICIkMSIgfHwgeyBlY2hvICJjYW5ub3QgY2QgJDEhIjsgZXhpdCAxOyB9CisgICAgZm9yIHggaW4gcnVuLSo7IGRvCisJdGVzdCAtZiAiJHgiIHx8IGNvbnRpbnVlCisJY2FzZSAiJHgiIGluCisJICAgICIkMCJ8cnVuLW1pbmltYWx8cnVuLWdwcm9mKSA7OworCSAgICAqLm9yaWd8Kn4pIDs7CisJICAgICMqKSBlY2hvICR4IDsgc2ggJHggOzsKKwkgICAgKikKKwkgICAgc2ggIiR4IiA+Ii4uLyQxLSR4LmZhaWwiIDI+JjEgJiYgXAorCSAgICB7IGVjaG8gIiQxLyR4OiBvayI7IHJtICIuLi8kMS0keC5mYWlsIjsgfSB8fCBlY2hvICIkMS8keDogZmFpbCI7CisJICAgIDs7CisJZXNhYworICAgIGRvbmUKKyAgICAjIE1hbnkgYmFzaCBydW4tWFhYIHNjcmlwdHMganVzdCBkbyB0aGlzLAorICAgICMgbm8gcG9pbnQgaW4gZHVwbGljYXRpb24gaXQgYWxsIG92ZXIgdGhlIHBsYWNlCisgICAgZm9yIHggaW4gKi50ZXN0czsgZG8KKwl0ZXN0IC14ICIkeCIgfHwgY29udGludWUKKwluYW1lPSIke3glJS50ZXN0c30iCisJdGVzdCAtZiAiJG5hbWUucmlnaHQiIHx8IGNvbnRpbnVlCisjCWVjaG8gUnVubmluZyB0ZXN0OiAiJG5hbWUucmlnaHQiCisJeworCSAgICAiJFRISVNfU0giICIuLyR4IiA+IiRuYW1lLnh4IiAyPiYxCisJICAgIGRpZmYgLXUgIiRuYW1lLnh4IiAiJG5hbWUucmlnaHQiID4iLi4vJDEtJHguZmFpbCIgJiYgcm0gLWYgIiRuYW1lLnh4IiAiLi4vJDEtJHguZmFpbCIKKwl9ICYmIGVjaG8gIiQxLyR4OiBvayIgfHwgZWNobyAiJDEvJHg6IGZhaWwiCisgICAgZG9uZQorICAgICkKK30KKworIyBNYWluIHBhcnQgb2YgdGhpcyBzY3JpcHQKKyMgVXNhZ2U6IHJ1bi1hbGwgW2RpcmVjdG9yaWVzXQorCitpZiBbICQjIC1sdCAxIF07IHRoZW4KKyAgICAjIEFsbCBzdWIgZGlyZWN0b3JpZXMKKyAgICBtb2R1bGVzPWBscyAtZCBtc2gtKmAKKworICAgIGZvciBtb2R1bGUgaW4gJG1vZHVsZXM7IGRvCisJZG9fdGVzdCAkbW9kdWxlCisgICAgZG9uZQorZWxzZQorICAgIHdoaWxlIFsgJCMgLWdlIDEgXTsgZG8KKwlpZiBbIC1kICQxIF07IHRoZW4KKwkgICAgZG9fdGVzdCAkMQorCWZpCisJc2hpZnQKKyAgICBkb25lCitmaQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvcmFuZG9tLmMgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9yYW5kb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNhYjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvcmFuZG9tLmMKQEAgLTAsMCArMSw0NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogJFJBTkRPTSBzdXBwb3J0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJhbmRvbS5oIgorCit1aW50MzJfdCBGQVNUX0ZVTkMKK25leHRfcmFuZG9tKHJhbmRvbV90ICpybmQpCit7CisJLyogR2Fsb2lzIExGU1IgcGFyYW1ldGVyICovCisJLyogVGFwcyBhdCAzMiAzMSAyOSAxOiAqLworCWVudW0geyBNQVNLID0gMHg4MDAwMDAwYiB9OworCS8qIEFub3RoZXIgZXhhbXBsZSAtIHRhcHMgYXQgMzIgMzEgMzAgMTA6ICovCisJLyogTUFTSyA9IDB4MDA0MDAwMDcgKi8KKworCXVpbnQzMl90IHQ7CisKKwlpZiAoVU5JTklURURfUkFORE9NX1Qocm5kKSkgeworCQkvKiBDYW4gdXNlIG1vbm90b25pY19ucygpIGZvciBiZXR0ZXIgcmFuZG9tbmVzcyBidXQgZm9yIG5vdworCQkgKiBpdCBpcyBub3QgdXNlZCBhbnl3aGVyZSBlbHNlIGluIGJ1c3lib3guLi4gc28gYXZvaWQgYmxvYXQKKwkJICovCisJCUlOSVRfUkFORE9NX1Qocm5kLCBnZXRwaWQoKSwgbW9ub3RvbmljX3VzKCkpOworCX0KKworCS8qIExDRyBoYXMgcGVyaW9kIG9mIDJeMzIgYW5kIGFsdGVybmF0aW5nIGxvd2VzdCBiaXQgKi8KKwlybmQtPkxDRyA9IDE2NjQ1MjUgKiBybmQtPkxDRyArIDEwMTM5MDQyMjM7CisJLyogR2Fsb2lzIExGU1IgaGFzIHBlcmlvZCBvZiAyXjMyLTEgPSAzICogNSAqIDE3ICogMjU3ICogNjU1MzcgKi8KKwl0ID0gKHJuZC0+Z2Fsb2lzX0xGU1IgPDwgMSk7CisJaWYgKHJuZC0+Z2Fsb2lzX0xGU1IgPCAwKSAvKiBpZiB3ZSBqdXN0IHNoaWZ0ZWQgMSBvdXQgb2YgbXNiLi4uICovCisJCXQgXj0gTUFTSzsKKwlybmQtPmdhbG9pc19MRlNSID0gdDsKKwkvKiBCb3RoIGFyZSB3ZWFrLCBjb21iaW5pbmcgdGhlbSBnaXZlcyBiZXR0ZXIgcmFuZG9tbmVzcworCSAqIGFuZCB+Ml42NCBwZXJpb2QuICYgMHg3ZmZmIGlzIHByb2JhYmx5IGJhc2ggY29tcGF0CisJICogZm9yICRSQU5ET00gcmFuZ2UuIENvbWJpbmluZyB3aXRoIHN1YnRyYWN0aW9uIGlzCisJICoganVzdCBmb3IgZnVuLiArIGFuZCBeIHdvdWxkIHdvcmsgZXF1YWxseSB3ZWxsLiAqLworCXQgPSAodCAtIHJuZC0+TENHKSAmIDB4N2ZmZjsKKworCXJldHVybiB0OworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc2hlbGwvcmFuZG9tLmggYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9yYW5kb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBjNDhhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvcmFuZG9tLmgKQEAgLTAsMCArMSwzMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogJFJBTkRPTSBzdXBwb3J0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgU0hFTExfUkFORE9NX0gKKyNkZWZpbmUgU0hFTExfUkFORE9NX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKwordHlwZWRlZiBzdHJ1Y3QgcmFuZG9tX3QgeworCS8qIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyAqLworCWludDMyX3QgZ2Fsb2lzX0xGU1I7IC8qIEdhbG9pcyBMRlNSIChmYXN0IGJ1dCB3ZWFrKS4gc2lnbmVkISAqLworCXVpbnQzMl90IExDRzsgICAgICAgIC8qIExDRyAoZmFzdCBidXQgd2VhaykgKi8KK30gcmFuZG9tX3Q7CisKKyNkZWZpbmUgVU5JTklURURfUkFORE9NX1Qocm5kKSBcCisJKChybmQpLT5nYWxvaXNfTEZTUiA9PSAwKQorCisjZGVmaW5lIElOSVRfUkFORE9NX1Qocm5kLCBub256ZXJvLCB2KSBcCisJKChybmQpLT5nYWxvaXNfTEZTUiA9IChub256ZXJvKSwgKHJuZCktPkxDRyA9ICh2KSkKKworI2RlZmluZSBDTEVBUl9SQU5ET01fVChybmQpIFwKKwkoKHJuZCktPmdhbG9pc19MRlNSID0gMCkKKwordWludDMyX3QgbmV4dF9yYW5kb20ocmFuZG9tX3QgKnJuZCkgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3NoZWxsL3NoZWxsX2NvbW1vbi5jIGIvYnVzeWJveC0xLjE5LjMvc2hlbGwvc2hlbGxfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjMjJlZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL3NoZWxsX2NvbW1vbi5jCkBAIC0wLDAgKzEsNDkzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBZGFwdGVkIGZyb20gYXNoIGFwcGxldCBjb2RlCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEsIDE5OTMsIDE5OTQKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogd2FzIHJlLXBvcnRlZCBmcm9tIE5ldEJTRCBhbmQgZGViaWFuaXplZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqIFNwbGl0IGZyb20gYXNoLmMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJzaGVsbF9jb21tb24uaCIKKworY29uc3QgY2hhciBkZWZpZnN2YXJbXSBBTElHTjEgPSAiSUZTPSBcdFxuIjsKKworCitpbnQgRkFTVF9GVU5DIGlzX3dlbGxfZm9ybWVkX3Zhcl9uYW1lKGNvbnN0IGNoYXIgKnMsIGNoYXIgdGVybWluYXRvcikKK3sKKwlpZiAoIXMgfHwgIShpc2FscGhhKCpzKSB8fCAqcyA9PSAnXycpKQorCQlyZXR1cm4gMDsKKworCWRvCisJCXMrKzsKKwl3aGlsZSAoaXNhbG51bSgqcykgfHwgKnMgPT0gJ18nKTsKKworCXJldHVybiAqcyA9PSB0ZXJtaW5hdG9yOworfQorCisvKiByZWFkIGJ1aWx0aW4gKi8KKworLyogTmVlZHMgdG8gYmUgaW50ZXJydXB0aWJsZTogc2hlbGwgbXVzaCBoYW5kbGUgdHJhcHMgYW5kIHNoZWxsLXNwZWNpYWwgc2lnbmFscworICogd2hpbGUgaW5zaWRlIHJlYWQuIFRvIGltcGxlbWVudCB0aGlzLCBiZSBzdXJlIHRvIG5vdCBsb29wIG9uIEVJTlRSCisgKiBhbmQgcmV0dXJuIGVycm5vID09IEVJTlRSIHJlbGlhYmx5LgorICovCisvL1RPRE86IHVzZSBtb3JlIGVmZmljaWVudCBzZXR2YXIoKSB3aGljaCB0YWtlcyBhIHBvaW50ZXIgdG8gbWFsbG9jZWQgIlZBUj1WQUwiCisvL3N0cmluZy4gaHVzaCBuYXR1cmFsbHkgaGFzIGl0LCBhbmQgYXNoIGhhcyBzZXR2YXJlcSgpLgorLy9IZXJlIHdlIGNhbiBzaW1wbHkgc3RvcmUgIlZBUj0iIGF0IGJ1ZmZlciBzdGFydCBhbmQgc3RvcmUgcmVhZCBkYXRhIGRpcmVjdGx5CisvL2FmdGVyICI9IiwgdGhlbiBwYXNzIGJ1ZmZlciB0byBzZXR2YXIoKSB0byBjb25zdW1lLgorY29uc3QgY2hhciogRkFTVF9GVU5DCitzaGVsbF9idWlsdGluX3JlYWQodm9pZCBGQVNUX0ZVTkMgKCpzZXR2YXIpKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCksCisJY2hhciAgICAgICAqKmFyZ3YsCisJY29uc3QgY2hhciAqaWZzLAorCWludCAgICAgICAgcmVhZF9mbGFncywKKwljb25zdCBjaGFyICpvcHRfbiwKKwljb25zdCBjaGFyICpvcHRfcCwKKwljb25zdCBjaGFyICpvcHRfdCwKKwljb25zdCBjaGFyICpvcHRfdQorKQoreworCXVuc2lnbmVkIGVycjsKKwl1bnNpZ25lZCBlbmRfbXM7IC8qIC10IFRJTUVPVVQgKi8KKwlpbnQgZmQ7IC8qIC11IEZEICovCisJaW50IG5jaGFyczsgLyogLW4gTlVNICovCisJY2hhciAqKnBwOworCWNoYXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgdGVybWlvcyB0dHksIG9sZF90dHk7CisJY29uc3QgY2hhciAqcmV0dmFsOworCWludCBidWZwb3M7IC8qIG5lZWQgdG8gYmUgYWJsZSB0byBob2xkIC0xICovCisJaW50IHN0YXJ0d29yZDsKKwlzbWFsbGludCBiYWNrc2xhc2g7CisKKwllcnJubyA9IGVyciA9IDA7CisKKwlwcCA9IGFyZ3Y7CisJd2hpbGUgKCpwcCkgeworCQlpZiAoIWlzX3dlbGxfZm9ybWVkX3Zhcl9uYW1lKCpwcCwgJ1wwJykpIHsKKwkJCS8qIE1pbWljIGJhc2ggbWVzc2FnZSAqLworCQkJYmJfZXJyb3JfbXNnKCJyZWFkOiAnJXMnOiBub3QgYSB2YWxpZCBpZGVudGlmaWVyIiwgKnBwKTsKKwkJCXJldHVybiAoY29uc3QgY2hhciAqKSh1aW50cHRyX3QpMTsKKwkJfQorCQlwcCsrOworCX0KKworCW5jaGFycyA9IDA7IC8qIGlmICE9IDAsIC1uIGlzIGluIGVmZmVjdCAqLworCWlmIChvcHRfbikgeworCQluY2hhcnMgPSBiYl9zdHJ0b3Uob3B0X24sIE5VTEwsIDEwKTsKKwkJaWYgKG5jaGFycyA8IDAgfHwgZXJybm8pCisJCQlyZXR1cm4gImludmFsaWQgY291bnQiOworCQkvKiBub3RlOiAiLW4gMCI6IG9mZiAoYmFzaCAzLjIgZG9lcyB0aGlzIHRvbykgKi8KKwl9CisJZW5kX21zID0gMDsKKwlpZiAob3B0X3QpIHsKKwkJZW5kX21zID0gYmJfc3RydG91KG9wdF90LCBOVUxMLCAxMCk7CisJCWlmIChlcnJubyB8fCBlbmRfbXMgPiBVSU5UX01BWCAvIDIwNDgpCisJCQlyZXR1cm4gImludmFsaWQgdGltZW91dCI7CisJCWVuZF9tcyAqPSAxMDAwOworI2lmIDAgLyogZXZlbiBiYXNoIGhhcyBubyAtdCBOLk5OTiBzdXBwb3J0ICovCisJCXRzLnR2X3NlYyA9IGJiX3N0cnRvdShvcHRfdCwgJnAsIDEwKTsKKwkJdHMudHZfdXNlYyA9IDA7CisJCS8qIEVJTlZBTCBtZWFucyBudW1iZXIgaXMgb2ssIGJ1dCBub3QgdGVybWluYXRlZCBieSBOVUwgKi8KKwkJaWYgKCpwID09ICcuJyAmJiBlcnJubyA9PSBFSU5WQUwpIHsKKwkJCWNoYXIgKnAyOworCQkJaWYgKCorK3ApIHsKKwkJCQlpbnQgc2NhbGU7CisJCQkJdHMudHZfdXNlYyA9IGJiX3N0cnRvdShwLCAmcDIsIDEwKTsKKwkJCQlpZiAoZXJybm8pCisJCQkJCXJldHVybiAiaW52YWxpZCB0aW1lb3V0IjsKKwkJCQlzY2FsZSA9IHAyIC0gcDsKKwkJCQkvKiBub3JtYWxpemUgdG8gdXNlYyAqLworCQkJCWlmIChzY2FsZSA+IDYpCisJCQkJCXJldHVybiAiaW52YWxpZCB0aW1lb3V0IjsKKwkJCQl3aGlsZSAoc2NhbGUrKyA8IDYpCisJCQkJCXRzLnR2X3VzZWMgKj0gMTA7CisJCQl9CisJCX0gZWxzZSBpZiAodHMudHZfc2VjIDwgMCB8fCBlcnJubykgeworCQkJcmV0dXJuICJpbnZhbGlkIHRpbWVvdXQiOworCQl9CisJCWlmICghKHRzLnR2X3NlYyB8IHRzLnR2X3VzZWMpKSB7IC8qIGJvdGggYXJlIDA/ICovCisJCQlyZXR1cm4gImludmFsaWQgdGltZW91dCI7CisJCX0KKyNlbmRpZiAvKiBpZiAwICovCisJfQorCWZkID0gU1RESU5fRklMRU5POworCWlmIChvcHRfdSkgeworCQlmZCA9IGJiX3N0cnRvdShvcHRfdSwgTlVMTCwgMTApOworCQlpZiAoZmQgPCAwIHx8IGVycm5vKQorCQkJcmV0dXJuICJpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciI7CisJfQorCisJaWYgKG9wdF9wICYmIGlzYXR0eShmZCkpIHsKKwkJZnB1dHMob3B0X3AsIHN0ZGVycik7CisJCWZmbHVzaF9hbGwoKTsKKwl9CisKKwlpZiAoaWZzID09IE5VTEwpCisJCWlmcyA9IGRlZmlmczsKKworCWlmIChuY2hhcnMgfHwgKHJlYWRfZmxhZ3MgJiBCVUlMVElOX1JFQURfU0lMRU5UKSkgeworCQl0Y2dldGF0dHIoZmQsICZ0dHkpOworCQlvbGRfdHR5ID0gdHR5OworCQlpZiAobmNoYXJzKSB7CisJCQl0dHkuY19sZmxhZyAmPSB+SUNBTk9OOworCQkJdHR5LmNfY2NbVk1JTl0gPSBuY2hhcnMgPCAyNTYgPyBuY2hhcnMgOiAyNTU7CisJCX0KKwkJaWYgKHJlYWRfZmxhZ3MgJiBCVUlMVElOX1JFQURfU0lMRU5UKSB7CisJCQl0dHkuY19sZmxhZyAmPSB+KEVDSE8gfCBFQ0hPSyB8IEVDSE9OTCk7CisJCX0KKwkJLyogVGhpcyBmb3JjZXMgZXhlY3V0aW9uIG9mICJyZXN0b3JpbmciIHRjZ2V0YXR0ciBsYXRlciAqLworCQlyZWFkX2ZsYWdzIHw9IEJVSUxUSU5fUkVBRF9TSUxFTlQ7CisJCS8qIGlmIHRjZ2V0YXR0ciBmYWlsZWQsIHRjc2V0YXR0ciB3aWxsIGZhaWwgdG9vLgorCQkgKiBJZ25vcmluZywgaXQncyBoYXJtbGVzcy4gKi8KKwkJdGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmdHR5KTsKKwl9CisKKwlyZXR2YWwgPSAoY29uc3QgY2hhciAqKSh1aW50cHRyX3QpMDsKKwlzdGFydHdvcmQgPSAxOworCWJhY2tzbGFzaCA9IDA7CisJaWYgKGVuZF9tcykgLyogTkI6IGVuZF9tcyBzdGF5cyBub256ZXJvOiAqLworCQllbmRfbXMgPSAoKHVuc2lnbmVkKW1vbm90b25pY19tcygpICsgZW5kX21zKSB8IDE7CisJYnVmZmVyID0gTlVMTDsKKwlidWZwb3MgPSAwOworCWRvIHsKKwkJY2hhciBjOworCQlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKwkJaW50IHRpbWVvdXQ7CisKKwkJaWYgKChidWZwb3MgJiAweGZmKSA9PSAwKQorCQkJYnVmZmVyID0geHJlYWxsb2MoYnVmZmVyLCBidWZwb3MgKyAweDEwMCk7CisKKwkJdGltZW91dCA9IC0xOworCQlpZiAoZW5kX21zKSB7CisJCQl0aW1lb3V0ID0gZW5kX21zIC0gKHVuc2lnbmVkKW1vbm90b25pY19tcygpOworCQkJaWYgKHRpbWVvdXQgPD0gMCkgeyAvKiBhbHJlYWR5IGxhdGU/ICovCisJCQkJcmV0dmFsID0gKGNvbnN0IGNoYXIgKikodWludHB0cl90KTE7CisJCQkJZ290byByZXQ7CisJCQl9CisJCX0KKworCQkvKiBXZSBtdXN0IHBvbGwgZXZlbiBpZiB0aW1lb3V0IGlzIC0xOgorCQkgKiB3ZSB3YW50IHRvIGJlIGludGVycnVwdGVkIGlmIHNpZ25hbCBhcnJpdmVzLAorCQkgKiByZWdhcmRsZXNzIG9mIFNBX1JFU1RBUlQtbmVzcyBvZiB0aGF0IHNpZ25hbCEKKwkJICovCisJCWVycm5vID0gMDsKKwkJcGZkWzBdLmZkID0gZmQ7CisJCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJCWlmIChwb2xsKHBmZCwgMSwgdGltZW91dCkgIT0gMSkgeworCQkJLyogdGltZWQgb3V0LCBvciBFSU5UUiAqLworCQkJZXJyID0gZXJybm87CisJCQlyZXR2YWwgPSAoY29uc3QgY2hhciAqKSh1aW50cHRyX3QpMTsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChyZWFkKGZkLCAmYnVmZmVyW2J1ZnBvc10sIDEpICE9IDEpIHsKKwkJCWVyciA9IGVycm5vOworCQkJcmV0dmFsID0gKGNvbnN0IGNoYXIgKikodWludHB0cl90KTE7CisJCQlicmVhazsKKwkJfQorCisJCWMgPSBidWZmZXJbYnVmcG9zXTsKKwkJaWYgKGMgPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQlpZiAoYmFja3NsYXNoKSB7CisJCQliYWNrc2xhc2ggPSAwOworCQkJaWYgKGMgIT0gJ1xuJykKKwkJCQlnb3RvIHB1dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghKHJlYWRfZmxhZ3MgJiBCVUlMVElOX1JFQURfUkFXKSAmJiBjID09ICdcXCcpIHsKKwkJCWJhY2tzbGFzaCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnXG4nKQorCQkJYnJlYWs7CisKKwkJLyogJElGUyBzcGxpdHRpbmcuIE5PVCBkb25lIGlmIHdlIHJ1biAicmVhZCIKKwkJICogd2l0aG91dCB2YXJpYWJsZSBuYW1lcyAoYmFzaCBjb21wYXQpLgorCQkgKiBUaHVzLCAicmVhZCIgYW5kICJyZWFkIFJFUExZIiBhcmUgbm90IHRoZSBzYW1lLgorCQkgKi8KKwkJaWYgKGFyZ3ZbMF0pIHsKKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL1YzX2NoYXAwMi5odG1sI3RhZ18xOF8wNl8wNSAqLworCQkJY29uc3QgY2hhciAqaXNfaWZzID0gc3RyY2hyKGlmcywgYyk7CisJCQlpZiAoc3RhcnR3b3JkICYmIGlzX2lmcykgeworCQkJCWlmIChpc3NwYWNlKGMpKQorCQkJCQljb250aW51ZTsKKwkJCQkvKiBpdCBpcyBhIG5vbi1zcGFjZSBpZnMgY2hhciAqLworCQkJCXN0YXJ0d29yZC0tOworCQkJCWlmIChzdGFydHdvcmQgPT0gMSkgLyogZmlyc3Qgb25lPyAqLworCQkJCQljb250aW51ZTsgLyogeWVzLCBpdCBpcyBub3QgbmV4dCB3b3JkIHlldCAqLworCQkJfQorCQkJc3RhcnR3b3JkID0gMDsKKwkJCWlmIChhcmd2WzFdICE9IE5VTEwgJiYgaXNfaWZzKSB7CisJCQkJYnVmZmVyW2J1ZnBvc10gPSAnXDAnOworCQkJCWJ1ZnBvcyA9IDA7CisJCQkJc2V0dmFyKCphcmd2LCBidWZmZXIpOworCQkJCWFyZ3YrKzsKKwkJCQkvKiBjYW4gd2Ugc2tpcCBvbmUgbm9uLXNwYWNlIGlmcyBjaGFyPyAoMjogeWVzKSAqLworCQkJCXN0YXJ0d29yZCA9IGlzc3BhY2UoYykgPyAyIDogMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorIHB1dDoKKwkJYnVmcG9zKys7CisJfSB3aGlsZSAoLS1uY2hhcnMpOworCisJaWYgKGFyZ3ZbMF0pIHsKKwkJLyogUmVtb3ZlIHRyYWlsaW5nIHNwYWNlICRJRlMgY2hhcnMgKi8KKwkJd2hpbGUgKC0tYnVmcG9zID49IDAgJiYgaXNzcGFjZShidWZmZXJbYnVmcG9zXSkgJiYgc3RyY2hyKGlmcywgYnVmZmVyW2J1ZnBvc10pICE9IE5VTEwpCisJCQljb250aW51ZTsKKwkJYnVmZmVyW2J1ZnBvcyArIDFdID0gJ1wwJzsKKwkJLyogVXNlIHRoZSByZW1haW5kZXIgYXMgYSB2YWx1ZSBmb3IgdGhlIG5leHQgdmFyaWFibGUgKi8KKwkJc2V0dmFyKCphcmd2LCBidWZmZXIpOworCQkvKiBTZXQgdGhlIHJlc3QgdG8gIiIgKi8KKwkJd2hpbGUgKCorK2FyZ3YpCisJCQlzZXR2YXIoKmFyZ3YsICIiKTsKKwl9IGVsc2UgeworCQkvKiBOb3RlOiBubyAkSUZTIHJlbW92YWwgKi8KKwkJYnVmZmVyW2J1ZnBvc10gPSAnXDAnOworCQlzZXR2YXIoIlJFUExZIiwgYnVmZmVyKTsKKwl9CisKKyByZXQ6CisJZnJlZShidWZmZXIpOworCWlmIChyZWFkX2ZsYWdzICYgQlVJTFRJTl9SRUFEX1NJTEVOVCkKKwkJdGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmb2xkX3R0eSk7CisKKwllcnJubyA9IGVycjsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiB1bGltaXQgYnVpbHRpbiAqLworCitzdHJ1Y3QgbGltaXRzIHsKKwl1aW50OF90IGNtZDsgICAgICAgICAgICAvKiBSTElNSVRfeHh4IGZpdCBpbnRvIGl0ICovCisJdWludDhfdCBmYWN0b3Jfc2hpZnQ7ICAgLyogc2hpZnQgYnkgdG8gZ2V0IHJsaW1fe2N1cixtYXh9IHZhbHVlcyAqLworCWNoYXIgb3B0aW9uOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGxpbWl0cyBsaW1pdHNfdGJsW10gPSB7CisjaWZkZWYgUkxJTUlUX0ZTSVpFCisJeyBSTElNSVRfRlNJWkUsCQk5LAknZicsCSJmaWxlIHNpemUgKGJsb2NrcykiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfQ1BVCisJeyBSTElNSVRfQ1BVLAkJMCwJJ3QnLAkiY3B1IHRpbWUgKHNlY29uZHMpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0RBVEEKKwl7IFJMSU1JVF9EQVRBLAkJMTAsCSdkJywJImRhdGEgc2VnIHNpemUgKGtiKSIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9TVEFDSworCXsgUkxJTUlUX1NUQUNLLAkJMTAsCSdzJywJInN0YWNrIHNpemUgKGtiKSIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9DT1JFCisJeyBSTElNSVRfQ09SRSwJCTksCSdjJywJImNvcmUgZmlsZSBzaXplIChibG9ja3MpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1JTUworCXsgUkxJTUlUX1JTUywJCTEwLAknbScsCSJyZXNpZGVudCBzZXQgc2l6ZSAoa2IpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX01FTUxPQ0sKKwl7IFJMSU1JVF9NRU1MT0NLLAkxMCwJJ2wnLAkibG9ja2VkIG1lbW9yeSAoa2IpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05QUk9DCisJeyBSTElNSVRfTlBST0MsCQkwLAkncCcsCSJwcm9jZXNzZXMiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTk9GSUxFCisJeyBSTElNSVRfTk9GSUxFLAkwLAknbicsCSJmaWxlIGRlc2NyaXB0b3JzIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0FTCisJeyBSTElNSVRfQVMsCQkxMCwJJ3YnLAkiYWRkcmVzcyBzcGFjZSAoa2IpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0xPQ0tTCisJeyBSTElNSVRfTE9DS1MsCQkwLAkndycsCSJsb2NrcyIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OSUNFCisJeyBSTElNSVRfTklDRSwJCTAsCSdlJywJInNjaGVkdWxpbmcgcHJpb3JpdHkiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlRQUklPCisJeyBSTElNSVRfUlRQUklPLAkwLAkncicsCSJyZWFsLXRpbWUgcHJpb3JpdHkiIH0sCisjZW5kaWYKK307CisKK2VudW0geworCU9QVF9oYXJkID0gKDEgPDwgMCksCisJT1BUX3NvZnQgPSAoMSA8PCAxKSwKK307CisKKy8qICItIjogdHJlYXQgYXJncyBhcyBwYXJhbWV0ZXJzIG9mIG9wdGlvbiB3aXRoIEFTQ0lJIGNvZGUgMSAqLworc3RhdGljIGNvbnN0IGNoYXIgdWxpbWl0X29wdF9zdHJpbmdbXSA9ICItSFNhIgorI2lmZGVmIFJMSU1JVF9GU0laRQorCQkJImY6OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9DUFUKKwkJCSJ0OjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfREFUQQorCQkJImQ6OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9TVEFDSworCQkJInM6OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9DT1JFCisJCQkiYzo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1JTUworCQkJIm06OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9NRU1MT0NLCisJCQkibDo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05QUk9DCisJCQkicDo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05PRklMRQorCQkJIm46OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9BUworCQkJInY6OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9MT0NLUworCQkJInc6OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OSUNFCisJCQkiZTo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1JUUFJJTworCQkJInI6OiIKKyNlbmRpZgorCQkJOworCitzdGF0aWMgdm9pZCBwcmludGxpbSh1bnNpZ25lZCBvcHRzLCBjb25zdCBzdHJ1Y3QgcmxpbWl0ICpsaW1pdCwKKwkJCWNvbnN0IHN0cnVjdCBsaW1pdHMgKmwpCit7CisJcmxpbV90IHZhbDsKKworCXZhbCA9IGxpbWl0LT5ybGltX21heDsKKwlpZiAoIShvcHRzICYgT1BUX2hhcmQpKQorCQl2YWwgPSBsaW1pdC0+cmxpbV9jdXI7CisKKwlpZiAodmFsID09IFJMSU1fSU5GSU5JVFkpCisJCXByaW50ZigidW5saW1pdGVkXG4iKTsKKwllbHNlIHsKKwkJdmFsID4+PSBsLT5mYWN0b3Jfc2hpZnQ7CisJCXByaW50ZigiJWxsdVxuIiwgKGxvbmcgbG9uZykgdmFsKTsKKwl9Cit9CisKK2ludCBGQVNUX0ZVTkMKK3NoZWxsX2J1aWx0aW5fdWxpbWl0KGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdHM7CisJdW5zaWduZWQgYXJnYzsKKworCS8qIFdlIGNhbid0IHVzZSBnZXRvcHQzMjogbmVlZCB0byBoYW5kbGUgY29tbWFuZHMgbGlrZQorCSAqIHVsaW1pdCAxMjMgLWMyIC1sIDQ1NgorCSAqLworCisJLyogSW4gY2FzZSBnZXRvcHQgd2FzIGFscmVhZHkgY2FsbGVkOgorCSAqIHJlc2V0IHRoZSBsaWJjIGdldG9wdCgpIGZ1bmN0aW9uLCB3aGljaCBrZWVwcyBpbnRlcm5hbCBzdGF0ZS4KKwkgKi8KKyNpZmRlZiBfX0dMSUJDX18KKwlvcHRpbmQgPSAwOworI2Vsc2UgLyogQlNEIHN0eWxlICovCisJb3B0aW5kID0gMTsKKwkvKiBvcHRyZXNldCA9IDE7ICovCisjZW5kaWYKKwkvKiBvcHRhcmcgPSBOVUxMOyBvcHRlcnIgPSAwOyBvcHRvcHQgPSAwOyAtIGRvIHdlIG5lZWQgdGhpcz8/ICovCisKKwlhcmdjID0gMTsKKwl3aGlsZSAoYXJndlthcmdjXSkKKwkJYXJnYysrOworCisJb3B0cyA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHJsaW1pdCBsaW1pdDsKKwkJY29uc3Qgc3RydWN0IGxpbWl0cyAqbDsKKwkJaW50IG9wdF9jaGFyID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIHVsaW1pdF9vcHRfc3RyaW5nKTsKKworCQlpZiAob3B0X2NoYXIgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKG9wdF9jaGFyID09ICdIJykgeworCQkJb3B0cyB8PSBPUFRfaGFyZDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvcHRfY2hhciA9PSAnUycpIHsKKwkJCW9wdHMgfD0gT1BUX3NvZnQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChvcHRfY2hhciA9PSAnYScpIHsKKwkJCWZvciAobCA9IGxpbWl0c190Ymw7IGwgIT0gJmxpbWl0c190YmxbQVJSQVlfU0laRShsaW1pdHNfdGJsKV07IGwrKykgeworCQkJCWdldHJsaW1pdChsLT5jbWQsICZsaW1pdCk7CisJCQkJcHJpbnRmKCItJWM6ICUtMzBzICIsIGwtPm9wdGlvbiwgbC0+bmFtZSk7CisJCQkJcHJpbnRsaW0ob3B0cywgJmxpbWl0LCBsKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG9wdF9jaGFyID09IDEpCisJCQlvcHRfY2hhciA9ICdmJzsKKwkJZm9yIChsID0gbGltaXRzX3RibDsgbCAhPSAmbGltaXRzX3RibFtBUlJBWV9TSVpFKGxpbWl0c190YmwpXTsgbCsrKSB7CisJCQlpZiAob3B0X2NoYXIgPT0gbC0+b3B0aW9uKSB7CisJCQkJY2hhciAqdmFsX3N0cjsKKworCQkJCWdldHJsaW1pdChsLT5jbWQsICZsaW1pdCk7CisKKwkJCQl2YWxfc3RyID0gb3B0YXJnOworCQkJCWlmICghdmFsX3N0ciAmJiBhcmd2W29wdGluZF0gJiYgYXJndltvcHRpbmRdWzBdICE9ICctJykKKwkJCQkJdmFsX3N0ciA9IGFyZ3Zbb3B0aW5kKytdOyAvKiArKyBza2lwcyBOTiBpbiAiLWMgTk4iIGNhc2UgKi8KKwkJCQlpZiAodmFsX3N0cikgeworCQkJCQlybGltX3QgdmFsOworCisJCQkJCWlmIChzdHJjbXAodmFsX3N0ciwgInVubGltaXRlZCIpID09IDApCisJCQkJCQl2YWwgPSBSTElNX0lORklOSVRZOworCQkJCQllbHNlIHsKKwkJCQkJCWlmIChzaXplb2YodmFsKSA9PSBzaXplb2YoaW50KSkKKwkJCQkJCQl2YWwgPSBiYl9zdHJ0b3UodmFsX3N0ciwgTlVMTCwgMTApOworCQkJCQkJZWxzZSBpZiAoc2l6ZW9mKHZhbCkgPT0gc2l6ZW9mKGxvbmcpKQorCQkJCQkJCXZhbCA9IGJiX3N0cnRvdWwodmFsX3N0ciwgTlVMTCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXZhbCA9IGJiX3N0cnRvdWxsKHZhbF9zdHIsIE5VTEwsIDEwKTsKKwkJCQkJCWlmIChlcnJubykgeworCQkJCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBudW1iZXIgJyVzJyIsIHZhbF9zdHIpOworCQkJCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCQkJCQl9CisJCQkJCQl2YWwgPDw9IGwtPmZhY3Rvcl9zaGlmdDsKKwkJCQkJfQorLy9iYl9lcnJvcl9tc2coIm9wdCAlYyB2YWxfc3RyOiclcycgdmFsOiVsbGQiLCBvcHRfY2hhciwgdmFsX3N0ciwgKGxvbmcgbG9uZyl2YWwpOworCQkJCQkvKiBmcm9tIG1hbiBiYXNoOiAiSWYgbmVpdGhlciAtSCBub3IgLVMKKwkJCQkJICogaXMgc3BlY2lmaWVkLCBib3RoIHRoZSBzb2Z0IGFuZCBoYXJkCisJCQkJCSAqIGxpbWl0cyBhcmUgc2V0LiAqLworCQkJCQlpZiAoIW9wdHMpCisJCQkJCQlvcHRzID0gT1BUX2hhcmQgKyBPUFRfc29mdDsKKwkJCQkJaWYgKG9wdHMgJiBPUFRfaGFyZCkKKwkJCQkJCWxpbWl0LnJsaW1fbWF4ID0gdmFsOworCQkJCQlpZiAob3B0cyAmIE9QVF9zb2Z0KQorCQkJCQkJbGltaXQucmxpbV9jdXIgPSB2YWw7CisvL2JiX2Vycm9yX21zZygic2V0cmxpbWl0KCVkLCAlbGxkLCAlbGxkKSIsIGwtPmNtZCwgKGxvbmcgbG9uZylsaW1pdC5ybGltX2N1ciwgKGxvbmcgbG9uZylsaW1pdC5ybGltX21heCk7CisJCQkJCWlmIChzZXRybGltaXQobC0+Y21kLCAmbGltaXQpIDwgMCkgeworCQkJCQkJYmJfcGVycm9yX21zZygiZXJyb3Igc2V0dGluZyBsaW1pdCIpOworCQkJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXByaW50bGltKG9wdHMsICZsaW1pdCwgbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IC8qIGZvciAoZXZlcnkgcG9zc2libGUgb3B0KSAqLworCisJCWlmIChsID09ICZsaW1pdHNfdGJsW0FSUkFZX1NJWkUobGltaXRzX3RibCldKSB7CisJCQkvKiBiYWQgb3B0aW9uLiBnZXRvcHQgYWxyZWFkeSBjb21wbGFpbmVkLiAqLworCQkJYnJlYWs7CisJCX0KKworCX0gLyogd2hpbGUgKHRoZXJlIGFyZSBvcHRpb25zKSAqLworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zaGVsbC9zaGVsbF9jb21tb24uaCBiL2J1c3lib3gtMS4xOS4zL3NoZWxsL3NoZWxsX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNmJjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zaGVsbC9zaGVsbF9jb21tb24uaApAQCAtMCwwICsxLDUxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBZGFwdGVkIGZyb20gYXNoIGFwcGxldCBjb2RlCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEsIDE5OTMsIDE5OTQKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogd2FzIHJlLXBvcnRlZCBmcm9tIE5ldEJTRCBhbmQgZGViaWFuaXplZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqIFNwbGl0IGZyb20gYXNoLmMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIFNIRUxMX0NPTU1PTl9ICisjZGVmaW5lIFNIRUxMX0NPTU1PTl9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2V4dGVybiBjb25zdCBjaGFyIGRlZmlmc3ZhcltdOyAvKiAiSUZTPSBcdFxuIiAqLworI2RlZmluZSBkZWZpZnMgKGRlZmlmc3ZhciArIDQpCisKK2ludCBGQVNUX0ZVTkMgaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoY29uc3QgY2hhciAqcywgY2hhciB0ZXJtaW5hdG9yKTsKKworLyogQnVpbHRpbnMgKi8KKworZW51bSB7CisJQlVJTFRJTl9SRUFEX1NJTEVOVCA9IDEgPDwgMCwKKwlCVUlMVElOX1JFQURfUkFXICAgID0gMSA8PCAxLAorfTsKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQworc2hlbGxfYnVpbHRpbl9yZWFkKHZvaWQgRkFTVF9GVU5DICgqc2V0dmFyKShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpLAorCWNoYXIgICAgICAgKiphcmd2LAorCWNvbnN0IGNoYXIgKmlmcywKKwlpbnQgICAgICAgIHJlYWRfZmxhZ3MsCisJY29uc3QgY2hhciAqb3B0X24sCisJY29uc3QgY2hhciAqb3B0X3AsCisJY29uc3QgY2hhciAqb3B0X3QsCisJY29uc3QgY2hhciAqb3B0X3UKKyk7CisKK2ludCBGQVNUX0ZVTkMKK3NoZWxsX2J1aWx0aW5fdWxpbWl0KGNoYXIgKiphcmd2KTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zeXNrbG9nZC9Db25maWcuc3JjIGIvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2QvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2E0OTRlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2QvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDE1MyBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIFNZU0xPR0QKKwlib29sICJzeXNsb2dkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBzeXNsb2dkIHV0aWxpdHkgaXMgdXNlZCB0byByZWNvcmQgbG9ncyBvZiBhbGwgdGhlCisJICBzaWduaWZpY2FudCBldmVudHMgdGhhdCBvY2N1ciBvbiBhIHN5c3RlbS4gRXZlcnkKKwkgIG1lc3NhZ2UgdGhhdCBpcyBsb2dnZWQgcmVjb3JkcyB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUKKwkgIGV2ZW50LCBhbmQgd2lsbCBnZW5lcmFsbHkgYWxzbyByZWNvcmQgdGhlIG5hbWUgb2YgdGhlCisJICBhcHBsaWNhdGlvbiB0aGF0IGdlbmVyYXRlZCB0aGUgbWVzc2FnZS4gV2hlbiB1c2VkIGluCisJICBjb25qdW5jdGlvbiB3aXRoIGtsb2dkLCBtZXNzYWdlcyBmcm9tIHRoZSBMaW51eCBrZXJuZWwKKwkgIGNhbiBhbHNvIGJlIHJlY29yZGVkLiBUaGlzIGlzIHRlcnJpYmx5IHVzZWZ1bCwKKwkgIGVzcGVjaWFsbHkgZm9yIGZpbmRpbmcgd2hhdCBoYXBwZW5lZCB3aGVuIHNvbWV0aGluZyBnb2VzCisJICB3cm9uZy4gQW5kIHNvbWV0aGluZyBhbG1vc3QgYWx3YXlzIHdpbGwgZ28gd3JvbmcgaWYKKwkgIHlvdSB3YWl0IGxvbmcgZW5vdWdoLi4uLgorCitjb25maWcgRkVBVFVSRV9ST1RBVEVfTE9HRklMRQorCWJvb2wgIlJvdGF0ZSBtZXNzYWdlIGZpbGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzeXNsb2dkIHRvIHJvdGF0ZSB0aGUgbWVzc2FnZSBmaWxlcworCSAgb24gaGlzIG93bi4gTm8gbmVlZCB0byB1c2UgYW4gZXh0ZXJuYWwgcm90YXRlc2NyaXB0LgorCitjb25maWcgRkVBVFVSRV9SRU1PVEVfTE9HCisJYm9vbCAiUmVtb3RlIExvZyBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFdoZW4geW91IGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSBzeXNsb2dkIHV0aWxpdHkgY2FuCisJICBiZSB1c2VkIHRvIHNlbmQgc3lzdGVtIGxvZyBtZXNzYWdlcyB0byBhbm90aGVyIHN5c3RlbQorCSAgY29ubmVjdGVkIHZpYSBhIG5ldHdvcmsuIFRoaXMgYWxsb3dzIHRoZSByZW1vdGUKKwkgIG1hY2hpbmUgdG8gbG9nIGFsbCB0aGUgc3lzdGVtIG1lc3NhZ2VzLCB3aGljaCBjYW4gYmUKKwkgIHRlcnJpYmx5IHVzZWZ1bCBmb3IgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBzZXJpYWwKKwkgIGNhYmxlcyB5b3UgdXNlLiBJdCBjYW4gYWxzbyBiZSBhIHZlcnkgZ29vZCBzZWN1cml0eQorCSAgbWVhc3VyZSB0byBwcmV2ZW50IHN5c3RlbSBsb2dzIGZyb20gYmVpbmcgdGFtcGVyZWQgd2l0aAorCSAgYnkgYW4gaW50cnVkZXIuCisKK2NvbmZpZyBGRUFUVVJFX1NZU0xPR0RfRFVQCisJYm9vbCAiU3VwcG9ydCAtRCAoZHJvcCBkdXBzKSBvcHRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTWVNMT0dECisJaGVscAorCSAgT3B0aW9uIC1EIGluc3RydWN0cyBzeXNsb2dkIHRvIGRyb3AgY29uc2VjdXRpdmUgbWVzc2FnZXMKKwkgIHdoaWNoIGFyZSB0b3RhbGx5IHRoZSBzYW1lLgorCitjb25maWcgRkVBVFVSRV9TWVNMT0dEX0NGRworCWJvb2wgIlN1cHBvcnQgc3lzbG9nLmNvbmYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTWVNMT0dECisJaGVscAorCSAgU3VwcG9ydHMgcmVzdHJpY3RlZCBzeXNsb2dkIGNvbmZpZy4gU2VlIGRvY3Mvc3lzbG9nLmNvbmYudHh0CisKK2NvbmZpZyBGRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRQorCWludCAiUmVhZCBidWZmZXIgc2l6ZSBpbiBieXRlcyIKKwlkZWZhdWx0IDI1NgorCXJhbmdlIDI1NiAyMDAwMAorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNldHMgdGhlIHNpemUgb2YgdGhlIHN5c2xvZyByZWFkIGJ1ZmZlci4KKwkgIEFjdHVhbCBtZW1vcnkgdXNhZ2UgaW5jcmVhc2VzIGFyb3VuZCBmaXZlIHRpbWVzIHRoZQorCSAgY2hhbmdlIGRvbmUgaGVyZS4KKworY29uZmlnIEZFQVRVUkVfSVBDX1NZU0xPRworCWJvb2wgIkNpcmN1bGFyIEJ1ZmZlciBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFdoZW4geW91IGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSBzeXNsb2dkIHV0aWxpdHkgd2lsbAorCSAgdXNlIGEgY2lyY3VsYXIgYnVmZmVyIHRvIHJlY29yZCBzeXN0ZW0gbG9nIG1lc3NhZ2VzLgorCSAgV2hlbiB0aGUgYnVmZmVyIGlzIGZpbGxlZCBpdCB3aWxsIGNvbnRpbnVlIHRvIG92ZXJ3cml0ZQorCSAgdGhlIG9sZGVzdCBtZXNzYWdlcy4gVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yCisJICBzeXN0ZW1zIHdpdGggbGl0dGxlIG9yIG5vIHBlcm1hbmVudCBzdG9yYWdlLCBzaW5jZQorCSAgb3RoZXJ3aXNlIHN5c3RlbSBsb2dzIGNhbiBldmVudHVhbGx5IGZpbGwgdXAgeW91cgorCSAgZW50aXJlIGZpbGVzeXN0ZW0sIHdoaWNoIG1heSBjYXVzZSB5b3VyIHN5c3RlbSB0bworCSAgYnJlYWsgYmFkbHkuCisKK2NvbmZpZyBGRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkUKKwlpbnQgIkNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIEtieXRlcyAobWluaW11bSA0S0IpIgorCWRlZmF1bHQgMTYKKwlyYW5nZSA0IDIxNDc0ODM2NDcKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBDX1NZU0xPRworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNldHMgdGhlIHNpemUgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCSAgdXNlZCB0byByZWNvcmQgc3lzdGVtIGxvZyBtZXNzYWdlcy4KKworY29uZmlnIExPR1JFQUQKKwlib29sICJsb2dyZWFkIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUENfU1lTTE9HCisJaGVscAorCSAgSWYgeW91IGVuYWJsZWQgQ2lyY3VsYXIgQnVmZmVyIHN1cHBvcnQsIHlvdSBhbG1vc3QKKwkgIGNlcnRhaW5seSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUgYXMgd2VsbC4gVGhpcworCSAgdXRpbGl0eSB3aWxsIGFsbG93IHlvdSB0byByZWFkIHRoZSBtZXNzYWdlcyB0aGF0IGFyZQorCSAgc3RvcmVkIGluIHRoZSBzeXNsb2dkIGNpcmN1bGFyIGJ1ZmZlci4KKworY29uZmlnIEZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkcKKwlib29sICJEb3VibGUgYnVmZmVyaW5nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9HUkVBRAorCWhlbHAKKwkgICdsb2dyZWFkJyBvdXB1dCB0byBzbG93IHNlcmlhbCB0ZXJtaW5hbHMgY2FuIGhhdmUKKwkgIHNpZGUgZWZmZWN0cyBvbiBzeXNsb2cgYmVjYXVzZSBvZiB0aGUgc2VtYXBob3JlLgorCSAgVGhpcyBvcHRpb24gbWFrZSBsb2dyZWFkIHRvIGRvdWJsZSBidWZmZXIgY29weQorCSAgZnJvbSBjaXJjdWxhciBidWZmZXIsIG1pbmltaXppbmcgc2VtYXBob3JlCisJICBjb250ZW50aW9uIGF0IHNvbWUgbWlub3IgbWVtb3J5IGV4cGVuc2UuCisKK2NvbmZpZyBLTE9HRAorCWJvb2wgImtsb2dkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGtsb2dkIGlzIGEgdXRpbGl0eSB3aGljaCBpbnRlcmNlcHRzIGFuZCBsb2dzIGFsbAorCSAgbWVzc2FnZXMgZnJvbSB0aGUgTGludXgga2VybmVsIGFuZCBzZW5kcyB0aGUgbWVzc2FnZXMKKwkgIG91dCB0byB0aGUgJ3N5c2xvZ2QnIHV0aWxpdHkgc28gdGhleSBjYW4gYmUgbG9nZ2VkLiBJZgorCSAgeW91IHdpc2ggdG8gcmVjb3JkIHRoZSBtZXNzYWdlcyBwcm9kdWNlZCBieSB0aGUga2VybmVsLAorCSAgeW91IHNob3VsZCBlbmFibGUgdGhpcyBvcHRpb24uCisKK2NvbmZpZyBGRUFUVVJFX0tMT0dEX0tMT0dDVEwKKwlib29sICJVc2UgdGhlIGtsb2djdGwoKSBpbnRlcmZhY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBLTE9HRAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBrbG9nZCBhcHBsZXQgc3VwcG9ydHMgdHdvIGludGVyZmFjZXMgZm9yIHJlYWRpbmcKKwkgIGtlcm5lbCBtZXNzYWdlcy4gTGludXggcHJvdmlkZXMgdGhlIGtsb2djdGwoKSBpbnRlcmZhY2UKKwkgIHdoaWNoIGFsbG93cyByZWFkaW5nIG1lc3NhZ2VzIGZyb20gdGhlIGtlcm5lbCByaW5nIGJ1ZmZlcgorCSAgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KKworCSAgSWYgeW91IGFuc3dlciAnTicgaGVyZSwga2xvZ2Qgd2lsbCB1c2UgdGhlIG1vcmUgcG9ydGFibGUKKwkgIGFwcHJvYWNoIG9mIHJlYWRpbmcgdGhlbSBmcm9tIC9wcm9jIG9yIGEgZGV2aWNlIG5vZGUuCisJICBIb3dldmVyLCB0aGlzIG1ldGhvZCByZXF1aXJlcyB0aGUgZmlsZSB0byBiZSBhdmFpbGFibGUuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgJ1knLgorCitjb25maWcgTE9HR0VSCisJYm9vbCAibG9nZ2VyIgorCWRlZmF1bHQgeQorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgICAgVGhlIGxvZ2dlciB1dGlsaXR5IGFsbG93cyB5b3UgdG8gc2VuZCBhcmJpdHJhcnkgdGV4dAorCSAgICBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGxvZyAoaS5lLiB0aGUgJ3N5c2xvZ2QnIHV0aWxpdHkpIHNvCisJICAgIHRoZXkgY2FuIGJlIGxvZ2dlZC4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB0byBoZWxwIGxvY2F0ZQorCSAgICBwcm9ibGVtcyB0aGF0IG9jY3VyIHdpdGhpbiBwcm9ncmFtcyBhbmQgc2NyaXB0cy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2QvS2J1aWxkLnNyYyBiL2J1c3lib3gtMS4xOS4zL3N5c2tsb2dkL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4NmNjMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3N5c2tsb2dkL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxMyBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfS0xPR0QpCQkrPSBrbG9nZC5vCitsaWItJChDT05GSUdfTE9HR0VSKQkJKz0gc3lzbG9nZF9hbmRfbG9nZ2VyLm8KK2xpYi0kKENPTkZJR19MT0dSRUFEKQkJKz0gbG9ncmVhZC5vCitsaWItJChDT05GSUdfU1lTTE9HRCkJCSs9IHN5c2xvZ2RfYW5kX2xvZ2dlci5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zeXNrbG9nZC9rbG9nZC5jIGIvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2Qva2xvZ2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmEwZTUzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2Qva2xvZ2QuYwpAQCAtMCwwICsxLDI2NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBrbG9nZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+LgorICogQ2hhbmdlczogTWFkZSB0aGlzIGEgc3RhbmRhbG9uZSBidXN5Ym94IG1vZHVsZSB3aGljaCB1c2VzIHN0YW5kYWxvbmUKKyAqIHN5c2xvZygpIGNsaWVudCBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBLYXJsIE0uIEhlZ2Jsb29tIDxrYXJsaGVnQGRlYmlhbi5vcmc+CisgKgorICogImNpcmN1bGFyIGJ1ZmZlciIgQ29weXJpZ2h0IChDKSAyMDAwIGJ5IEdlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4KKyAqCisgKiBNYWludGFpbmVyOiBHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+IGFzIG9mIE1hciAxMiwgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGtsb2dkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWMgTl0gWy1uXSIKKy8vdXNhZ2U6I2RlZmluZSBrbG9nZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIktlcm5lbCBsb2dnZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgTglQcmludCB0byBjb25zb2xlIG1lc3NhZ2VzIG1vcmUgdXJnZW50IHRoYW4gcHJpbyBOICgxLTgpIgorLy91c2FnZTogICAgICJcbgktbglSdW4gaW4gZm9yZWdyb3VuZCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKworLyogVGhlIExpbnV4LXNwZWNpZmljIGtsb2djdGwoMykgaW50ZXJmYWNlIGRvZXMgbm90IHJlbHkgb24gdGhlIGZpbGVzeXN0ZW0gYW5kCisgKiBhbGxvd3MgdXMgdG8gY2hhbmdlIHRoZSBjb25zb2xlIGxvZ2xldmVsLiBBbHRlcm5hdGl2ZWx5LCB3ZSByZWFkIHRoZQorICogbWVzc2FnZXMgZnJvbSBfUEFUSF9LTE9HLiAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfS0xPR0RfS0xPR0NUTAorCisjIGluY2x1ZGUgPHN5cy9rbG9nLmg+CisKK3N0YXRpYyB2b2lkIGtsb2dkX29wZW4odm9pZCkKK3sKKwkvKiAiT3BlbiB0aGUgbG9nLiBDdXJyZW50bHkgYSBOT1AiICovCisJa2xvZ2N0bCgxLCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQga2xvZ2Rfc2V0bG9nbGV2ZWwoaW50IGx2bCkKK3sKKwkvKiAicHJpbnRrKCkgcHJpbnRzIGEgbWVzc2FnZSBvbiB0aGUgY29uc29sZSBvbmx5IGlmIGl0IGhhcyBhIGxvZ2xldmVsCisJICogbGVzcyB0aGFuIGNvbnNvbGVfbG9nbGV2ZWwiLiBIZXJlIHdlIHNldCBjb25zb2xlX2xvZ2xldmVsID0gbHZsLiAqLworCWtsb2djdGwoOCwgTlVMTCwgbHZsKTsKK30KKworc3RhdGljIGludCBrbG9nZF9yZWFkKGNoYXIgKmJ1ZnAsIGludCBsZW4pCit7CisJcmV0dXJuIGtsb2djdGwoMiwgYnVmcCwgbGVuKTsKK30KKyMgZGVmaW5lIFJFQURfRVJST1IgImtsb2djdGwoMikgZXJyb3IiCisKK3N0YXRpYyB2b2lkIGtsb2dkX2Nsb3NlKHZvaWQpCit7CisJLyogRllJOiBjbWQgNyBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgY29uc29sZV9sb2dsZXZlbCB0byA3CisJICogdmlhIGtsb2djdGwoOCwgTlVMTCwgNykuICovCisJa2xvZ2N0bCg3LCBOVUxMLCAwKTsgLyogIjcgLS0gRW5hYmxlIHByaW50aydzIHRvIGNvbnNvbGUiICovCisJa2xvZ2N0bCgwLCBOVUxMLCAwKTsgLyogIjAgLS0gQ2xvc2UgdGhlIGxvZy4gQ3VycmVudGx5IGEgTk9QIiAqLworfQorCisjZWxzZQorCisjIGluY2x1ZGUgPHBhdGhzLmg+CisjIGlmbmRlZiBfUEFUSF9LTE9HCisjICBpZmRlZiBfX0dOVV9fCisjICAgZGVmaW5lIF9QQVRIX0tMT0cgIi9kZXYva2xvZyIKKyMgIGVsc2UKKyMgICBlcnJvciAieW91ciBzeXN0ZW0ncyBfUEFUSF9LTE9HIGlzIHVua25vd24iCisjICBlbmRpZgorIyBlbmRpZgorIyBkZWZpbmUgUEFUSF9QUklOVEsgIi9wcm9jL3N5cy9rZXJuZWwvcHJpbnRrIgorCitlbnVtIHsga2xvZ2ZkID0gMyB9OworCitzdGF0aWMgdm9pZCBrbG9nZF9vcGVuKHZvaWQpCit7CisJaW50IGZkID0geG9wZW4oX1BBVEhfS0xPRywgT19SRE9OTFkpOworCXhtb3ZlX2ZkKGZkLCBrbG9nZmQpOworfQorCitzdGF0aWMgdm9pZCBrbG9nZF9zZXRsb2dsZXZlbChpbnQgbHZsKQoreworCUZJTEUgKmZwID0gZm9wZW5fb3Jfd2FybihQQVRIX1BSSU5USywgInciKTsKKwlpZiAoZnApIHsKKwkJLyogVGhpcyBjaGFuZ2VzIG9ubHkgZmlyc3QgdmFsdWU6CisJCSAqICJtZXNzYWdlcyB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhpcworCQkgKiBbdGhhdCBpcywgd2l0aCBudW1lcmljYWxseSBsb3dlciB2YWx1ZV0KKwkJICogd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlIi4KKwkJICogVGhlIG90aGVyIHRocmVlIHZhbHVlcyBpbiB0aGlzIHBzZXVkby1maWxlIGFyZW4ndCBjaGFuZ2VkLgorCQkgKi8KKwkJZnByaW50ZihmcCwgIiV1XG4iLCBsdmwpOworCQlmY2xvc2UoZnApOworCX0KK30KKworc3RhdGljIGludCBrbG9nZF9yZWFkKGNoYXIgKmJ1ZnAsIGludCBsZW4pCit7CisJcmV0dXJuIHJlYWQoa2xvZ2ZkLCBidWZwLCBsZW4pOworfQorIyBkZWZpbmUgUkVBRF9FUlJPUiAicmVhZCBlcnJvciIKKworc3RhdGljIHZvaWQga2xvZ2RfY2xvc2Uodm9pZCkKK3sKKwlrbG9nZF9zZXRsb2dsZXZlbCg3KTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGtsb2dmZCk7Cit9CisKKyNlbmRpZgorCisjZGVmaW5lIGxvZ19idWZmZXIgYmJfY29tbW9uX2J1ZnNpejEKK2VudW0geworCUtMT0dEX0xPR0JVRl9TSVpFID0gc2l6ZW9mKGxvZ19idWZmZXIpLAorCU9QVF9MRVZFTCAgICAgID0gKDEgPDwgMCksCisJT1BUX0ZPUkVHUk9VTkQgPSAoMSA8PCAxKSwKK307CisKKy8qIFRPRE86IGdsaWJjIG9wZW5sb2coTE9HX0tFUk4pIHJldmVydHMgdG8gTE9HX1VTRVIgaW5zdGVhZCwKKyAqIGJlY2F1c2UgdGhhdCdzIGhvdyB0aGV5IGludGVycHJldCB3b3JkICJkZWZhdWx0IgorICogaW4gdGhlIG9wZW5sb2coKSBtYW5wYWdlOgorICogICAgICBMT0dfVVNFUiAoZGVmYXVsdCkKKyAqICAgICAgICAgICAgICBnZW5lcmljIHVzZXItbGV2ZWwgbWVzc2FnZXMKKyAqIGFuZCB0aGUgZmFjdCB0aGF0IExPR19LRVJOIGlzIGEgY29uc3RhbnQgMC4KKyAqIGdsaWJjIGludGVycHJldHMgaXQgYXMgIjAgaW4gb3BlbmxvZygpIGNhbGwgbWVhbnMgJ3VzZSBkZWZhdWx0JyIuCisgKiBJIHRoaW5rIGl0IG1lYW5zICJpZiBvcGVubG9nIHdhc24ndCBjYWxsZWQgYmVmb3JlIHN5c2xvZygpIGlzIGNhbGxlZCwKKyAqIHVzZSBkZWZhdWx0Ii4KKyAqIENvbnZpbmNpbmcgZ2xpYmMgbWFpbnRhaW5lcnMgb3RoZXJ3aXNlIGlzLCBhcyB1c3VhbCwgbmVhcmx5IGltcG9zc2libGUuCisgKiBTaG91bGQgd2Ugb3Blbi1jb2RlIHN5c2xvZygpIGhlcmUgdG8gdXNlIGNvcnJlY3QgZmFjaWxpdHk/CisgKi8KKworaW50IGtsb2dkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBrbG9nZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGkgPSAwOworCWNoYXIgKm9wdF9jOworCWludCBvcHQ7CisJaW50IHVzZWQ7CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYzpuIiwgJm9wdF9jKTsKKwlpZiAob3B0ICYgT1BUX0xFVkVMKSB7CisJCS8qIFZhbGlkIGxldmVscyBhcmUgYmV0d2VlbiAxIGFuZCA4ICovCisJCWkgPSB4YXRvdV9yYW5nZShvcHRfYywgMSwgOCk7CisJfQorCWlmICghKG9wdCAmIE9QVF9GT1JFR1JPVU5EKSkgeworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NIRElSX1JPT1QsIGFyZ3YpOworCX0KKworCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKworCS8qIGtsb2dkX29wZW4oKSBiZWZvcmUgb3BlbmxvZygpLCBzaW5jZSBpdCBtaWdodCB1c2UgZml4ZWQgZmQgMywKKwkgKiBhbmQgb3BlbmxvZygpIGFsc28gbWF5IHVzZSB0aGUgc2FtZSBmZCAzIGlmIHdlIHN3YXAgdGhlbToKKwkgKi8KKwlrbG9nZF9vcGVuKCk7CisJb3BlbmxvZygia2VybmVsIiwgMCwgTE9HX0tFUk4pOworCS8qCisJICogZ2xpYmMgcHJvYmxlbTogZm9yIHNvbWUgcmVhc29uLCBnbGliYyBjaGFuZ2VzIExPR19LRVJOIHRvIExPR19VU0VSCisJICogYWJvdmUuIFRoZSBsb2dpYyBiZWhpbmQgdGhpcyBpcyB0aGF0IHN0YW5kYXJkCisJICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvZnVuY3Rpb25zL3N5c2xvZy5odG1sCisJICogc2F5cyB0aGUgZm9sbG93aW5nIGFib3V0IG9wZW5sb2cgYW5kIHN5c2xvZzoKKwkgKiAiTE9HX1VTRVIKKwkgKiAgTWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IGFyYml0cmFyeSBwcm9jZXNzZXMuCisJICogIFRoaXMgaXMgdGhlIGRlZmF1bHQgZmFjaWxpdHkgaWRlbnRpZmllciBpZiBub25lIGlzIHNwZWNpZmllZC4iCisJICoKKwkgKiBJIGJlbGlldmUgZ2xpYmMgbWlzaW50ZXJwcmV0ZWQgdGhpcyB0ZXh0IGFzICJpZiBvcGVubG9nJ3MKKwkgKiB0aGlyZCBwYXJhbWV0ZXIgaXMgMCAoPUxPR19LRVJOKSwgdHJlYXQgaXQgYXMgTE9HX1VTRVIiLgorCSAqIFdoZXJlYXMgaXQgd2FzIG1lYW50IHRvIHNheSAiaWYgKnN5c2xvZyogaXMgY2FsbGVkIHdpdGggZmFjaWxpdHkKKwkgKiAwIGluIGl0cyAxc3QgcGFyYW1ldGVyIHdpdGhvdXQgcHJpb3IgY2FsbCB0byBvcGVubG9nLCB0aGVuIHBlcmZvcm0KKwkgKiBpbXBsaWNpdCBvcGVubG9nKExPR19VU0VSKSIuCisJICoKKwkgKiBBcyBhIHJlc3VsdCBvZiB0aGlzLCBlaCwgZmVhdHVyZSwgc3RhbmRhcmQga2xvZ2Qgd2FzIGZvcmNlZAorCSAqIHRvIG9wZW4tY29kZSBpdHMgb3duIG9wZW5sb2cgYW5kIHN5c2xvZyBpbXBsZW1lbnRhdGlvbiAoISkuCisJICoKKwkgKiBOb3RlIHRoYXQgcHJvaGliaXRpbmcgb3BlbmxvZyhMT0dfS0VSTikgb24gbGliYyBsZXZlbCBkb2VzIG5vdAorCSAqIGFkZCBhbnkgc2VjdXJpdHk6IGFueSBwcm9jZXNzIGNhbiBvcGVuIGEgc29ja2V0IHRvICIvZGV2L2xvZyIKKwkgKiBhbmQgd3JpdGUgYSBzdHJpbmcgIjwwPlZvaWxhLCBhIExPR19LRVJOICsgTE9HX0VNRVJHIG1lc3NhZ2UiCisJICoKKwkgKiBHb29nbGUgY29kZSBzZWFyY2ggdGVsbHMgbWUgdGhlcmUgaXMgbm8gd2lkZXNwcmVhZCB1c2Ugb2YKKwkgKiBvcGVubG9nKCJmb28iLCAwLCAwKSwgdGh1cyBmaXhpbmcgZ2xpYmMgd29uJ3QgYnJlYWsgdXNlcnNwYWNlLgorCSAqCisJICogVGhlIGJ1ZyBhZ2FpbnN0IGdsaWJjIHdhcyBmaWxlZDoKKwkgKiBidWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD01NDcwMDAKKwkgKi8KKworCWlmIChpKQorCQlrbG9nZF9zZXRsb2dsZXZlbChpKTsKKworCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOworCS8qIFdlIHdhbnQga2xvZ2RfcmVhZCB0byBub3QgYmUgcmVzdGFydGVkLCB0aHVzIF9ub3Jlc3RhcnQ6ICovCisJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KEJCX0ZBVEFMX1NJR1MsIHJlY29yZF9zaWdubyk7CisKKwlzeXNsb2coTE9HX05PVElDRSwgImtsb2dkIHN0YXJ0ZWQ6ICVzIiwgYmJfYmFubmVyKTsKKworCXVzZWQgPSAwOworCXdoaWxlICghYmJfZ290X3NpZ25hbCkgeworCQlpbnQgbjsKKwkJaW50IHByaW9yaXR5OworCQljaGFyICpzdGFydDsKKworCQkvKiAiMiAtLSBSZWFkIGZyb20gdGhlIGxvZy4iICovCisJCXN0YXJ0ID0gbG9nX2J1ZmZlciArIHVzZWQ7CisJCW4gPSBrbG9nZF9yZWFkKHN0YXJ0LCBLTE9HRF9MT0dCVUZfU0laRS0xIC0gdXNlZCk7CisJCWlmIChuIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJYmJfcGVycm9yX21zZyhSRUFEX0VSUk9SKTsKKwkJCWJyZWFrOworCQl9CisJCXN0YXJ0W25dID0gJ1wwJzsKKworCQkvKiBQcm9jZXNzIGVhY2ggbmV3bGluZS10ZXJtaW5hdGVkIGxpbmUgaW4gdGhlIGJ1ZmZlciAqLworCQlzdGFydCA9IGxvZ19idWZmZXI7CisJCXdoaWxlICgxKSB7CisJCQljaGFyICpuZXdsaW5lID0gc3RyY2hybnVsKHN0YXJ0LCAnXG4nKTsKKworCQkJaWYgKCpuZXdsaW5lID09ICdcMCcpIHsKKwkJCQkvKiBUaGlzIGxpbmUgaXMgaW5jb21wbGV0ZSAqLworCisJCQkJLyogbW92ZSBpdCB0byB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlciAqLworCQkJCW92ZXJsYXBwaW5nX3N0cmNweShsb2dfYnVmZmVyLCBzdGFydCk7CisJCQkJdXNlZCA9IG5ld2xpbmUgLSBzdGFydDsKKwkJCQlpZiAodXNlZCA8IEtMT0dEX0xPR0JVRl9TSVpFLTEpIHsKKwkJCQkJLyogYnVmZmVyIGlzbid0IGZ1bGwgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBsb2cgaXQgYW55d2F5ICovCisJCQkJdXNlZCA9IDA7CisJCQkJbmV3bGluZSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCSpuZXdsaW5lKysgPSAnXDAnOworCQkJfQorCisJCQkvKiBFeHRyYWN0IHRoZSBwcmlvcml0eSAqLworCQkJcHJpb3JpdHkgPSBMT0dfSU5GTzsKKwkJCWlmICgqc3RhcnQgPT0gJzwnKSB7CisJCQkJc3RhcnQrKzsKKwkJCQlpZiAoKnN0YXJ0KSB7CisJCQkJCS8qIGtlcm5lbCBuZXZlciBnZW5lcmF0ZXMgbXVsdGktZGlnaXQgcHJpb3MgKi8KKwkJCQkJcHJpb3JpdHkgPSAoKnN0YXJ0IC0gJzAnKTsKKwkJCQkJc3RhcnQrKzsKKwkJCQl9CisJCQkJaWYgKCpzdGFydCA9PSAnPicpCisJCQkJCXN0YXJ0Kys7CisJCQl9CisJCQkvKiBMb2cgKG9ubHkgbm9uLWVtcHR5IGxpbmVzKSAqLworCQkJaWYgKCpzdGFydCkKKwkJCQlzeXNsb2cocHJpb3JpdHksICIlcyIsIHN0YXJ0KTsKKworCQkJaWYgKCFuZXdsaW5lKQorCQkJCWJyZWFrOworCQkJc3RhcnQgPSBuZXdsaW5lOworCQl9CisJfQorCisJa2xvZ2RfY2xvc2UoKTsKKwlzeXNsb2coTE9HX05PVElDRSwgImtsb2dkOiBleGl0aW5nIik7CisJaWYgKGJiX2dvdF9zaWduYWwpCisJCWtpbGxfbXlzZWxmX3dpdGhfc2lnKGJiX2dvdF9zaWduYWwpOworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy9zeXNrbG9nZC9sb2dnZXIuYyBiL2J1c3lib3gtMS4xOS4zL3N5c2tsb2dkL2xvZ2dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzAyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zeXNrbG9nZC9sb2dnZXIuYwpAQCAtMCwwICsxLDE2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBsb2dnZXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9nZ2VyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW01FU1NBR0VdIgorLy91c2FnZTojZGVmaW5lIGxvZ2dlcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIldyaXRlIE1FU1NBR0UgKG9yIHN0ZGluKSB0byBzeXNsb2dcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTG9nIHRvIHN0ZGVyciBhcyB3ZWxsIGFzIHRoZSBzeXN0ZW0gbG9nIgorLy91c2FnZTogICAgICJcbgktdCBUQUcJTG9nIHVzaW5nIHRoZSBzcGVjaWZpZWQgdGFnIChkZWZhdWx0cyB0byB1c2VyIG5hbWUpIgorLy91c2FnZTogICAgICJcbgktcCBQUklPCVByaW9yaXR5IChudW1lcmljIG9yIGZhY2lsaXR5LmxldmVsIHBhaXIpIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsb2dnZXJfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbG9nZ2VyIFwiaGVsbG9cIlxuIgorCisvKgorICogRG9uZSBpbiBzeXNsb2dkX2FuZF9sb2dnZXIuYzoKKyNpbmNsdWRlICJsaWJiYi5oIgorI2RlZmluZSBTWVNMT0dfTkFNRVMKKyNkZWZpbmUgU1lTTE9HX05BTUVTX0NPTlNUCisjaW5jbHVkZSA8c3lzbG9nLmg+CisqLworCisvKiBEZWNvZGUgYSBzeW1ib2xpYyBuYW1lIHRvIGEgbnVtZXJpYyB2YWx1ZQorICogdGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlKGNoYXIgKm5hbWUsIGNvbnN0IENPREUgKmNvZGV0YWIpCit7CisJY29uc3QgQ09ERSAqYzsKKworCWlmIChpc2RpZ2l0KCpuYW1lKSkKKwkJcmV0dXJuIGF0b2kobmFtZSk7CisJZm9yIChjID0gY29kZXRhYjsgYy0+Y19uYW1lOyBjKyspIHsKKwkJaWYgKCFzdHJjYXNlY21wKG5hbWUsIGMtPmNfbmFtZSkpIHsKKwkJCXJldHVybiBjLT5jX3ZhbDsKKwkJfQorCX0KKworCXJldHVybiAtMTsKK30KKworLyogRGVjb2RlIGEgc3ltYm9saWMgbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKKyAqIHRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gY29kZQorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICovCitzdGF0aWMgaW50IHBlbmNvZGUoY2hhciAqcykKK3sKKwljaGFyICpzYXZlOworCWludCBsZXYsIGZhYyA9IExPR19VU0VSOworCisJZm9yIChzYXZlID0gczsgKnMgJiYgKnMgIT0gJy4nOyArK3MpCisJCTsKKwlpZiAoKnMpIHsKKwkJKnMgPSAnXDAnOworCQlmYWMgPSBkZWNvZGUoc2F2ZSwgZmFjaWxpdHluYW1lcyk7CisJCWlmIChmYWMgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gJXMgbmFtZTogJXMiLCAiZmFjaWxpdHkiLCBzYXZlKTsKKwkJKnMrKyA9ICcuJzsKKwl9IGVsc2UgeworCQlzID0gc2F2ZTsKKwl9CisJbGV2ID0gZGVjb2RlKHMsIHByaW9yaXR5bmFtZXMpOworCWlmIChsZXYgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biAlcyBuYW1lOiAlcyIsICJwcmlvcml0eSIsIHNhdmUpOworCXJldHVybiAoKGxldiAmIExPR19QUklNQVNLKSB8IChmYWMgJiBMT0dfRkFDTUFTSykpOworfQorCisjZGVmaW5lIHN0cmJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCitpbnQgbG9nZ2VyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsb2dnZXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnN0cl9wLCAqc3RyX3Q7CisJaW50IG9wdDsKKwlpbnQgaSA9IDA7CisKKwkvKiBGaWxsIG91dCB0aGUgbmFtZSBzdHJpbmcgZWFybHkgKG1heSBiZSBvdmVyd3JpdHRlbiBsYXRlcikgKi8KKwlzdHJfdCA9IHVpZDJ1bmFtZV91dG9hKGdldGV1aWQoKSk7CisKKwkvKiBQYXJzZSBhbnkgb3B0aW9ucyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJwOnN0OiIsICZzdHJfcCwgJnN0cl90KTsKKworCWlmIChvcHQgJiAweDIpIC8qIC1zICovCisJCWkgfD0gTE9HX1BFUlJPUjsKKwkvL2lmIChvcHQgJiAweDQpIC8qIC10ICovCisJb3BlbmxvZyhzdHJfdCwgaSwgMCk7CisJaSA9IExPR19VU0VSIHwgTE9HX05PVElDRTsKKwlpZiAob3B0ICYgMHgxKSAvKiAtcCAqLworCQlpID0gcGVuY29kZShzdHJfcCk7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJd2hpbGUgKGZnZXRzKHN0cmJ1ZiwgQ09NTU9OX0JVRlNJWkUsIHN0ZGluKSkgeworCQkJaWYgKHN0cmJ1ZlswXQorCQkJICYmIE5PVF9MT05FX0NIQVIoc3RyYnVmLCAnXG4nKQorCQkJKSB7CisJCQkJLyogTmVpdGhlciAiIiBub3IgIlxuIiAqLworCQkJCXN5c2xvZyhpLCAiJXMiLCBzdHJidWYpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJY2hhciAqbWVzc2FnZSA9IE5VTEw7CisJCWludCBsZW4gPSAwOworCQlpbnQgcG9zID0gMDsKKwkJZG8geworCQkJbGVuICs9IHN0cmxlbigqYXJndikgKyAxOworCQkJbWVzc2FnZSA9IHhyZWFsbG9jKG1lc3NhZ2UsIGxlbiArIDEpOworCQkJc3ByaW50ZihtZXNzYWdlICsgcG9zLCAiICVzIiwgKmFyZ3YpLAorCQkJcG9zID0gbGVuOworCQl9IHdoaWxlICgqKythcmd2KTsKKwkJc3lzbG9nKGksICIlcyIsIG1lc3NhZ2UgKyAxKTsgLyogc2tpcCBsZWFkaW5nICIgIiAqLworCX0KKworCWNsb3NlbG9nKCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworLyogQ2xlYW4gdXAuIE5lZWRlZCBiZWNhdXNlIHdlIGFyZSBpbmNsdWRlZCBmcm9tIHN5c2xvZ2RfYW5kX2xvZ2dlci5jICovCisjdW5kZWYgc3RyYnVmCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBsaWNlbnNlIHN0YXRlbWVudCBmb3IgdGhlIGRlY29kZSBhbmQgcGVuY29kZSBmdW5jdGlvbnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQlNEIEFkdmVydGlzaW5nIENsYXVzZSBvbWl0dGVkIHBlciB0aGUgSnVseSAyMiwgMTk5OSBsaWNlbnNpbmcgY2hhbmdlCisgKiAgICBmdHA6Ly9mdHAuY3MuYmVya2VsZXkuZWR1L3B1Yi80YnNkL1JFQURNRS5JbXB0LkxpY2Vuc2UuQ2hhbmdlCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2QvbG9ncmVhZC5jIGIvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2QvbG9ncmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Mzk1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zeXNrbG9nZC9sb2dyZWFkLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNpcmN1bGFyIGJ1ZmZlciBzeXNsb2cgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgR2VubmFkeSBGZWxkbWFuIDxnZmVsZG1hbkBnZW5hMDEuY29tPgorICoKKyAqIE1haW50YWluZXI6IEdlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4gYXMgb2YgTWFyIDEyLCAyMDAxCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9ncmVhZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mXSIKKy8vdXNhZ2U6I2RlZmluZSBsb2dyZWFkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2hvdyBtZXNzYWdlcyBpbiBzeXNsb2dkJ3MgY2lyY3VsYXIgYnVmZmVyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCU91dHB1dCBkYXRhIGFzIGxvZyBncm93cyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9zZW0uaD4KKyNpbmNsdWRlIDxzeXMvc2htLmg+CisKKyNkZWZpbmUgREVCVUcgMAorCisvKiBvdXIgc2hhcmVkIGtleSAoc3lzbG9nZC5jIGFuZCBsb2dyZWFkLmMgbXVzdCBiZSBpbiBzeW5jKSAqLworZW51bSB7IEtFWV9JRCA9IDB4NDE0ZTQ1NDcgfTsgLyogIkdFTkEiICovCisKK3N0cnVjdCBzaGJ1Zl9kcyB7CisJaW50MzJfdCBzaXplOyAgICAgICAgICAgLy8gc2l6ZSBvZiBkYXRhIC0gMQorCWludDMyX3QgdGFpbDsgICAgICAgICAgIC8vIGVuZCBvZiBtZXNzYWdlIGxpc3QKKwljaGFyIGRhdGFbMV07ICAgICAgICAgICAvLyBtZXNzYWdlcworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZW1idWYgaW5pdF9zZW1bM10gPSB7CisJezAsIC0xLCBJUENfTk9XQUlUIHwgU0VNX1VORE99LAorCXsxLCAwfSwgezAsICsxLCBTRU1fVU5ET30KK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3Qgc2VtYnVmIFNNcnVwWzFdOyAvLyB7MCwgLTEsIElQQ19OT1dBSVQgfCBTRU1fVU5ET30sCisJc3RydWN0IHNlbWJ1ZiBTTXJkblsyXTsgLy8gezEsIDB9LCB7MCwgKzEsIFNFTV9VTkRPfQorCXN0cnVjdCBzaGJ1Zl9kcyAqc2hidWY7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBTTXJ1cCAoRy5TTXJ1cCkKKyNkZWZpbmUgU01yZG4gKEcuU01yZG4pCisjZGVmaW5lIHNoYnVmIChHLnNoYnVmKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwltZW1jcHkoU01ydXAsIGluaXRfc2VtLCBzaXplb2YoaW5pdF9zZW0pKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZXJyb3JfZXhpdChjb25zdCBjaGFyICpzdHIpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZXJyb3JfZXhpdChjb25zdCBjaGFyICpzdHIpCit7CisJLy9yZWxlYXNlIGFsbCBhY3F1aXJlZCByZXNvdXJjZXMKKwlzaG1kdChzaGJ1Zik7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKHN0cik7Cit9CisKKy8qCisgKiBzZW1fdXAgLSB1cCgpJ3MgYSBzZW1hcGhvcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNlbV91cChpbnQgc2VtaWQpCit7CisJaWYgKHNlbW9wKHNlbWlkLCBTTXJ1cCwgMSkgPT0gLTEpCisJCWVycm9yX2V4aXQoInNlbW9wW1NNcnVwXSIpOworfQorCitzdGF0aWMgdm9pZCBpbnRlcnJ1cHRlZChpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKwlzaG1kdChzaGJ1Zik7CisJZXhpdChFWElUX1NVQ0NFU1MpOworfQorCitpbnQgbG9ncmVhZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9ncmVhZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgY3VyOworCWludCBsb2dfc2VtaWQ7IC8qIGlwYyBzZW1hcGhvcmUgaWQgKi8KKwlpbnQgbG9nX3NobWlkOyAvKiBpcGMgc2hhcmVkIG1lbW9yeSBpZCAqLworCXNtYWxsaW50IGZvbGxvdyA9IGdldG9wdDMyKGFyZ3YsICJmIik7CisKKwlJTklUX0coKTsKKworCWxvZ19zaG1pZCA9IHNobWdldChLRVlfSUQsIDAsIDApOworCWlmIChsb2dfc2htaWQgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCBzeXNsb2dkIGJ1ZmZlciIpOworCisJLyogQXR0YWNoIHNoYXJlZCBtZW1vcnkgdG8gb3VyIGNoYXIqICovCisJc2hidWYgPSBzaG1hdChsb2dfc2htaWQsIE5VTEwsIFNITV9SRE9OTFkpOworCWlmIChzaGJ1ZiA9PSBOVUxMKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGFjY2VzcyBzeXNsb2dkIGJ1ZmZlciIpOworCisJbG9nX3NlbWlkID0gc2VtZ2V0KEtFWV9JRCwgMCwgMCk7CisJaWYgKGxvZ19zZW1pZCA9PSAtMSkKKwkJZXJyb3JfZXhpdCgiY2FuJ3QgZ2V0IGFjY2VzcyB0byBzZW1hcGhvcmVzIGZvciBzeXNsb2dkIGJ1ZmZlciIpOworCisJc2lnbmFsKFNJR0lOVCwgaW50ZXJydXB0ZWQpOworCisJLyogU3VwcG9zZSBhdG9taWMgbWVtb3J5IHJlYWQgKi8KKwkvKiBNYXggcG9zc2libGUgdmFsdWUgZm9yIHRhaWwgaXMgc2hidWYtPnNpemUgLSAxICovCisJY3VyID0gc2hidWYtPnRhaWw7CisKKwkvKiBMb29wIGZvciBsb2dyZWFkIC1mLCBvbmUgcGFzcyBpZiB0aGVyZSB3YXMgbm8gLWYgKi8KKwlkbyB7CisJCXVuc2lnbmVkIHNoYnVmX3NpemU7CisJCXVuc2lnbmVkIHNoYnVmX3RhaWw7CisJCWNvbnN0IGNoYXIgKnNoYnVmX2RhdGE7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkcKKwkJaW50IGk7CisJCWludCBsZW5fZmlyc3RfcGFydDsKKwkJaW50IGxlbl90b3RhbCA9IGxlbl90b3RhbDsgLyogZm9yIGdjYyAqLworCQljaGFyICpjb3B5ID0gY29weTsgLyogZm9yIGdjYyAqLworI2VuZGlmCisJCWlmIChzZW1vcChsb2dfc2VtaWQsIFNNcmRuLCAyKSA9PSAtMSkKKwkJCWVycm9yX2V4aXQoInNlbW9wW1NNcmRuXSIpOworCisJCS8qIENvcHkgdGhlIGluZm8sIGhlbHBzIGdjYyB0byByZWFsaXplIHRoYXQgaXQgZG9lc24ndCBjaGFuZ2UgKi8KKwkJc2hidWZfc2l6ZSA9IHNoYnVmLT5zaXplOworCQlzaGJ1Zl90YWlsID0gc2hidWYtPnRhaWw7CisJCXNoYnVmX2RhdGEgPSBzaGJ1Zi0+ZGF0YTsgLyogcG9pbnRlciEgKi8KKworCQlpZiAoREVCVUcpCisJCQlwcmludGYoImN1cjolZCB0YWlsOiVpIHNpemU6JWlcbiIsCisJCQkJCWN1ciwgc2hidWZfdGFpbCwgc2hidWZfc2l6ZSk7CisKKwkJaWYgKCFmb2xsb3cpIHsKKwkJCS8qIGFkdmFuY2UgdG8gb2xkZXN0IGNvbXBsZXRlIG1lc3NhZ2UgKi8KKwkJCS8qIGZpbmQgTlVMICovCisJCQljdXIgKz0gc3RybGVuKHNoYnVmX2RhdGEgKyBjdXIpOworCQkJaWYgKGN1ciA+PSBzaGJ1Zl9zaXplKSB7IC8qIGxhc3QgYnl0ZSBpbiBidWZmZXI/ICovCisJCQkJY3VyID0gc3RybmxlbihzaGJ1Zl9kYXRhLCBzaGJ1Zl90YWlsKTsKKwkJCQlpZiAoY3VyID09IHNoYnVmX3RhaWwpCisJCQkJCWdvdG8gdW5sb2NrOyAvKiBubyBjb21wbGV0ZSBtZXNzYWdlcyAqLworCQkJfQorCQkJLyogYWR2YW5jZSB0byBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlICovCisJCQljdXIrKzsKKwkJCWlmIChjdXIgPj0gc2hidWZfc2l6ZSkgLyogbGFzdCBieXRlIGluIGJ1ZmZlcj8gKi8KKwkJCQljdXIgPSAwOworCQl9IGVsc2UgeyAvKiBsb2dyZWFkIC1mICovCisJCQlpZiAoY3VyID09IHNoYnVmX3RhaWwpIHsKKwkJCQlzZW1fdXAobG9nX3NlbWlkKTsKKwkJCQlmZmx1c2hfYWxsKCk7CisJCQkJc2xlZXAoMSk7IC8qIFRPRE86IHJlcGxhY2UgbWUgd2l0aCBhIHNsZWVwX29uICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBSZWFkIGZyb20gY3VyIHRvIHRhaWwgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORworCQlsZW5fZmlyc3RfcGFydCA9IGxlbl90b3RhbCA9IHNoYnVmX3RhaWwgLSBjdXI7CisJCWlmIChsZW5fdG90YWwgPCAwKSB7CisJCQkvKiBtZXNzYWdlIHdyYXBzOiAqLworCQkJLyogW1NFQ09ORCBQQVJULi4uLi4uLi4uRklSU1QgUEFSVF0gKi8KKwkJCS8qICBeZGF0YSAgICAgIF50YWlsICAgIF5jdXIgICAgICBec2l6ZSAqLworCQkJbGVuX3RvdGFsICs9IHNoYnVmX3NpemU7CisJCX0KKwkJY29weSA9IHhtYWxsb2MobGVuX3RvdGFsICsgMSk7CisJCWlmIChsZW5fZmlyc3RfcGFydCA8IDApIHsKKwkJCS8qIG1lc3NhZ2Ugd3JhcHMgKHNlZSBhYm92ZSkgKi8KKwkJCWxlbl9maXJzdF9wYXJ0ID0gc2hidWZfc2l6ZSAtIGN1cjsKKwkJCW1lbWNweShjb3B5ICsgbGVuX2ZpcnN0X3BhcnQsIHNoYnVmX2RhdGEsIHNoYnVmX3RhaWwpOworCQl9CisJCW1lbWNweShjb3B5LCBzaGJ1Zl9kYXRhICsgY3VyLCBsZW5fZmlyc3RfcGFydCk7CisJCWNvcHlbbGVuX3RvdGFsXSA9ICdcMCc7CisJCWN1ciA9IHNoYnVmX3RhaWw7CisjZWxzZQorCQl3aGlsZSAoY3VyICE9IHNoYnVmX3RhaWwpIHsKKwkJCWZwdXRzKHNoYnVmX2RhdGEgKyBjdXIsIHN0ZG91dCk7CisJCQljdXIgKz0gc3RybGVuKHNoYnVmX2RhdGEgKyBjdXIpICsgMTsKKwkJCWlmIChjdXIgPj0gc2hidWZfc2l6ZSkKKwkJCQljdXIgPSAwOworCQl9CisjZW5kaWYKKyB1bmxvY2s6CisJCS8qIHJlbGVhc2UgdGhlIGxvY2sgb24gdGhlIGxvZyBjaGFpbiAqLworCQlzZW1fdXAobG9nX3NlbWlkKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HCisJCWZvciAoaSA9IDA7IGkgPCBsZW5fdG90YWw7IGkgKz0gc3RybGVuKGNvcHkgKyBpKSArIDEpIHsKKwkJCWZwdXRzKGNvcHkgKyBpLCBzdGRvdXQpOworCQl9CisJCWZyZWUoY29weSk7CisjZW5kaWYKKwl9IHdoaWxlIChmb2xsb3cpOworCisJc2htZHQoc2hidWYpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2Qvc3lzbG9nZC5jIGIvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2Qvc3lzbG9nZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Y2NlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy9zeXNrbG9nZC9zeXNsb2dkLmMKQEAgLTAsMCArMSwxMDM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHN5c2xvZ2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IEthcmwgTS4gSGVnYmxvb20gPGthcmxoZWdAZGViaWFuLm9yZz4KKyAqCisgKiAiY2lyY3VsYXIgYnVmZmVyIiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgR2VubmFkeSBGZWxkbWFuIDxnZmVsZG1hbkBnZW5hMDEuY29tPgorICoKKyAqIE1haW50YWluZXI6IEdlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4gYXMgb2YgTWFyIDEyLCAyMDAxCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3lzbG9nZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIgorLy91c2FnZTojZGVmaW5lIHN5c2xvZ2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTeXN0ZW0gbG9nZ2luZyB1dGlsaXR5XG4iCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9TWVNMT0dEX0NGRygKKy8vdXNhZ2U6ICAgICAgICIodGhpcyB2ZXJzaW9uIG9mIHN5c2xvZ2QgaWdub3JlcyAvZXRjL3N5c2xvZy5jb25mKVxuIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbgkJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOiAgICAgIlxuCS1PIEZJTEUJCUxvZyB0byBGSUxFIChkZWZhdWx0Oi92YXIvbG9nL21lc3NhZ2VzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTgkJTG9nIG9ubHkgbWVzc2FnZXMgbW9yZSB1cmdlbnQgdGhhbiBwcmlvIE4gKDEtOCkiCisvL3VzYWdlOiAgICAgIlxuCS1TCQlTbWFsbGVyIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJCUxvZyB0aW1lIHN0YW1wcyBpbiBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSAoVVRDKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoCisvL3VzYWdlOiAgICAgIlxuCS1zIFNJWkUJCU1heCBzaXplIChLQikgYmVmb3JlIHJvdGF0aW9uIChkZWZhdWx0OjIwMEtCLCAwPW9mZikiCisvL3VzYWdlOiAgICAgIlxuCS1iIE4JCU4gcm90YXRlZCBsb2dzIHRvIGtlZXAgKGRlZmF1bHQ6MSwgbWF4PTk5LCAwPXB1cmdlKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUkVNT1RFX0xPRygKKy8vdXNhZ2U6ICAgICAiXG4JLVIgSE9TVFs6UE9SVF0JTG9nIHRvIElQIG9yIGhvc3RuYW1lIG9uIFBPUlQgKGRlZmF1bHQgUE9SVD01MTQvVURQKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJCUxvZyBsb2NhbGx5IGFuZCB2aWEgbmV0d29yayAoZGVmYXVsdCBpcyBuZXR3b3JrIG9ubHkgaWYgLVIpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9TWVNMT0dEX0RVUCgKKy8vdXNhZ2U6ICAgICAiXG4JLUQJCURyb3AgZHVwbGljYXRlcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBDX1NZU0xPRygKKy8qIE5COiAtQ3NpemUgc2hvdWxkbid0IGhhdmUgc3BhY2UgKGJlY2F1c2Ugc2l6ZSBpcyBvcHRpb25hbCkgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLUNbc2l6ZV9rYl0JTG9nIHRvIHNoYXJlZCBtZW0gYnVmZmVyICh1c2UgbG9ncmVhZCB0byByZWFkIGl0KSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJCVVzZSBGSUxFIGFzIGNvbmZpZyAoZGVmYXVsdDovZXRjL3N5c2xvZy5jb25mKSIKKy8vdXNhZ2U6CSkKKy8qIC8vdXNhZ2U6ICAiXG4JLW0gTUlOCQlNaW51dGVzIGJldHdlZW4gTUFSSyBsaW5lcyAoZGVmYXVsdDoyMCwgMD1vZmYpIiAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzeXNsb2dkX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHN5c2xvZ2QgLVIgbWFzdGVybG9nOjUxNFxuIgorLy91c2FnZTogICAgICAgIiQgc3lzbG9nZCAtUiAxOTIuMTY4LjEuMTo2MDFcbiIKKworLyoKKyAqIERvbmUgaW4gc3lzbG9nZF9hbmRfbG9nZ2VyLmM6CisjaW5jbHVkZSAibGliYmIuaCIKKyNkZWZpbmUgU1lTTE9HX05BTUVTCisjZGVmaW5lIFNZU0xPR19OQU1FU19DT05TVAorI2luY2x1ZGUgPHN5c2xvZy5oPgorKi8KKworI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2lmIEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cKKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NlbS5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKyNlbmRpZgorCisKKyNkZWZpbmUgREVCVUcgMAorCisvKiBNQVJLIGNvZGUgaXMgbm90IHZlcnkgdXNlZnVsLCBpcyBibG9hdCwgYW5kIGJyb2tlbjoKKyAqIGNhbiBkZWFkbG9jayBpZiBhbGFybWVkIHRvIG1ha2UgTUFSSyB3aGlsZSB3cml0aW5nIHRvIElQQyBidWZmZXIKKyAqIChzZW1hcGhvcmVzIGFyZSBkb3duIGJ1dCBkb19tYXJrIHJvdXRpbmUgdHJpZXMgdG8gZG93biB0aGVtIGFnYWluKSAqLworI3VuZGVmIFNZU0xPR0RfTUFSSworCisvKiBXcml0ZSBsb2NraW5nIGRvZXMgbm90IHNlZW0gdG8gYmUgdXNlZnVsIGVpdGhlciAqLworI3VuZGVmIFNZU0xPR0RfV1JMT0NLCisKK2VudW0geworCU1BWF9SRUFEID0gQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFLAorCUROU19XQUlUX1NFQyA9IDIgKiA2MCwKK307CisKKy8qIFNlbWFwaG9yZSBvcGVyYXRpb24gc3RydWN0dXJlcyAqLworc3RydWN0IHNoYnVmX2RzIHsKKwlpbnQzMl90IHNpemU7ICAgLyogc2l6ZSBvZiBkYXRhIC0gMSAqLworCWludDMyX3QgdGFpbDsgICAvKiBlbmQgb2YgbWVzc2FnZSBsaXN0ICovCisJY2hhciBkYXRhWzFdOyAgIC8qIGRhdGEvbWVzc2FnZXMgKi8KK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHJlbW90ZUZEOworCXVuc2lnbmVkIGxhc3RfZG5zX3Jlc29sdmU7CisJbGVuX2FuZF9zb2NrYWRkciAqcmVtb3RlQWRkcjsKKwljb25zdCBjaGFyICpyZW1vdGVIb3N0bmFtZTsKK30gcmVtb3RlSG9zdF90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGxvZ0ZpbGVfdCB7CisJY29uc3QgY2hhciAqcGF0aDsKKwlpbnQgZmQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwl1bnNpZ25lZCBzaXplOworCXVpbnQ4X3QgaXNSZWd1bGFyOworI2VuZGlmCit9IGxvZ0ZpbGVfdDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCit0eXBlZGVmIHN0cnVjdCBsb2dSdWxlX3QgeworCXVpbnQ4X3QgZW5hYmxlZF9mYWNpbGl0eV9wcmlvbWFwW0xPR19ORkFDSUxJVElFU107CisJc3RydWN0IGxvZ0ZpbGVfdCAqZmlsZTsKKwlzdHJ1Y3QgbG9nUnVsZV90ICpuZXh0OworfSBsb2dSdWxlX3Q7CisjZW5kaWYKKworLyogQWxsb3dzIHVzIHRvIGhhdmUgc21hbGxlciBpbml0aWFsaXplci4gVWdseS4gKi8KKyNkZWZpbmUgR0xPQkFMUyBcCisJbG9nRmlsZV90IGxvZ0ZpbGU7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkvKiBpbnRlcnZhbCBiZXR3ZWVuIG1hcmtzIGluIHNlY29uZHMgKi8gXAorCS8qaW50IG1hcmtJbnRlcnZhbDsqLyAgICAgICAgICAgICAgICAgICBcCisJLyogbGV2ZWwgb2YgbWVzc2FnZXMgdG8gYmUgbG9nZ2VkICovICAgIFwKKwlpbnQgbG9nTGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSggXAorCS8qIG1heCBzaXplIG9mIGZpbGUgYmVmb3JlIHJvdGF0aW9uICovICBcCisJdW5zaWduZWQgbG9nRmlsZVNpemU7ICAgICAgICAgICAgICAgICAgIFwKKwkvKiBudW1iZXIgb2Ygcm90YXRlZCBtZXNzYWdlIGZpbGVzICovICAgXAorCXVuc2lnbmVkIGxvZ0ZpbGVSb3RhdGU7ICAgICAgICAgICAgICAgICBcCispIFwKK0lGX0ZFQVRVUkVfSVBDX1NZU0xPRyggXAorCWludCBzaG1pZDsgLyogaXBjIHNoYXJlZCBtZW1vcnkgaWQgKi8gICBcCisJaW50IHNfc2VtaWQ7IC8qIGlwYyBzZW1hcGhvcmUgaWQgKi8gICAgIFwKKwlpbnQgc2htX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBzZW1idWYgU013dXBbMV07ICAgICAgICAgICAgICAgICBcCisJc3RydWN0IHNlbWJ1ZiBTTXdkblszXTsgICAgICAgICAgICAgICAgIFwKKykgXAorSUZfRkVBVFVSRV9TWVNMT0dEX0NGRyggXAorCWxvZ1J1bGVfdCAqbG9nX3J1bGVzOyBcCispCisKK3N0cnVjdCBpbml0X2dsb2JhbHMgeworCUdMT0JBTFMKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlHTE9CQUxTCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HCisJbGxpc3RfdCAqcmVtb3RlSG9zdHM7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HCisJc3RydWN0IHNoYnVmX2RzICpzaGJ1ZjsKKyNlbmRpZgorCXRpbWVfdCBsYXN0X2xvZ190aW1lOworCS8qIGxvY2FsaG9zdCdzIG5hbWUuIFdlIHByaW50IG9ubHkgZmlyc3QgNjQgY2hhcnMgKi8KKwljaGFyICpob3N0bmFtZTsKKworCS8qIFdlIHJlY3YgaW50byByZWN2YnVmLi4uICovCisJY2hhciByZWN2YnVmW01BWF9SRUFEICogKDEgKyBFTkFCTEVfRkVBVFVSRV9TWVNMT0dEX0RVUCldOworCS8qIC4uLnRoZW4gY29weSB0byBwYXJzZWJ1ZiwgZXNjYXBpbmcgY29udHJvbCBjaGFycyAqLworCS8qIChjYW4gZ3JvdyB4MiBtYXgpICovCisJY2hhciBwYXJzZWJ1ZltNQVhfUkVBRCoyXTsKKwkvKiAuLi50aGVuIHNwcmludGYgaW50byBwcmludGJ1ZiwgYWRkaW5nIHRpbWVzdGFtcCAoMjYgY2hhcnMpLAorCSAqIGhvc3QgKDY0KSwgZmFjLnByaW8gKDIwKSB0byB0aGUgbWVzc2FnZSAqLworCS8qIChncm93dGggYnk6IDI2ICsgNjQgKyAyMCArIGRlbGltcyA9IH4xMjEpICovCisJY2hhciBwcmludGJ1ZltNQVhfUkVBRCoyICsgMTM5XTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5pdF9nbG9iYWxzIGluaXRfZGF0YSA9IHsKKwkubG9nRmlsZSA9IHsKKwkJLnBhdGggPSAiL3Zhci9sb2cvbWVzc2FnZXMiLAorCQkuZmQgPSAtMSwKKwl9LAorI2lmZGVmIFNZU0xPR0RfTUFSSworCS5tYXJrSW50ZXJ2YWwgPSAyMCAqIDYwLAorI2VuZGlmCisJLmxvZ0xldmVsID0gOCwKKyNpZiBFTkFCTEVfRkVBVFVSRV9ST1RBVEVfTE9HRklMRQorCS5sb2dGaWxlU2l6ZSA9IDIwMCAqIDEwMjQsCisJLmxvZ0ZpbGVSb3RhdGUgPSAxLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBDX1NZU0xPRworCS5zaG1pZCA9IC0xLAorCS5zX3NlbWlkID0gLTEsCisJLnNobV9zaXplID0gKChDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFKSoxMDI0KSwgLyogZGVmYXVsdCBzaG0gc2l6ZSAqLworCS5TTXd1cCA9IHsgezEsIC0xLCBJUENfTk9XQUlUfSB9LAorCS5TTXdkbiA9IHsgezAsIDB9LCB7MSwgMH0sIHsxLCArMX0gfSwKKyNlbmRpZgorfTsKKworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyhtZW1jcHkoeHphbGxvYyhzaXplb2YoRykpLCAmaW5pdF9kYXRhLCBzaXplb2YoaW5pdF9kYXRhKSkpOyBcCit9IHdoaWxlICgwKQorCisKKy8qIE9wdGlvbnMgKi8KK2VudW0geworCU9QVEJJVF9tYXJrID0gMCwgLy8gLW0KKwlPUFRCSVRfbm9mb3JrLCAvLyAtbgorCU9QVEJJVF9vdXRmaWxlLCAvLyAtTworCU9QVEJJVF9sb2dsZXZlbCwgLy8gLWwKKwlPUFRCSVRfc21hbGwsIC8vIC1TCisJT1BUQklUX3V0YywgLy8gLXUKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKE9QVEJJVF9maWxlc2l6ZSAgICwpCS8vIC1zCisJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRShPUFRCSVRfcm90YXRlY250ICAsKQkvLyAtYgorCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgT1BUQklUX3JlbW90ZWxvZyAgLCkJLy8gLVIKKwlJRl9GRUFUVVJFX1JFTU9URV9MT0coICAgIE9QVEJJVF9sb2NhbGxvZyAgICwpCS8vIC1MCisJSUZfRkVBVFVSRV9JUENfU1lTTE9HKCAgICBPUFRCSVRfY2lyY3VsYXJsb2csKQkvLyAtQworCUlGX0ZFQVRVUkVfU1lTTE9HRF9EVVAoICAgT1BUQklUX2R1cCAgICAgICAgLCkJLy8gLUQKKwlJRl9GRUFUVVJFX1NZU0xPR0RfQ0ZHKCAgIE9QVEJJVF9jZmcgICAgICAgICwpCS8vIC1mCisKKwlPUFRfbWFyayAgICAgICAgPSAxIDw8IE9QVEJJVF9tYXJrICAgICwKKwlPUFRfbm9mb3JrICAgICAgPSAxIDw8IE9QVEJJVF9ub2ZvcmsgICwKKwlPUFRfb3V0ZmlsZSAgICAgPSAxIDw8IE9QVEJJVF9vdXRmaWxlICwKKwlPUFRfbG9nbGV2ZWwgICAgPSAxIDw8IE9QVEJJVF9sb2dsZXZlbCwKKwlPUFRfc21hbGwgICAgICAgPSAxIDw8IE9QVEJJVF9zbWFsbCAgICwKKwlPUFRfdXRjCQkJPSAxIDw8IE9QVEJJVF91dGMJICAsCisJT1BUX2ZpbGVzaXplICAgID0gSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgoMSA8PCBPUFRCSVRfZmlsZXNpemUgICApKSArIDAsCisJT1BUX3JvdGF0ZWNudCAgID0gSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgoMSA8PCBPUFRCSVRfcm90YXRlY250ICApKSArIDAsCisJT1BUX3JlbW90ZWxvZyAgID0gSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCAgICAoMSA8PCBPUFRCSVRfcmVtb3RlbG9nICApKSArIDAsCisJT1BUX2xvY2FsbG9nICAgID0gSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCAgICAoMSA8PCBPUFRCSVRfbG9jYWxsb2cgICApKSArIDAsCisJT1BUX2NpcmN1bGFybG9nID0gSUZfRkVBVFVSRV9JUENfU1lTTE9HKCAgICAoMSA8PCBPUFRCSVRfY2lyY3VsYXJsb2cpKSArIDAsCisJT1BUX2R1cCAgICAgICAgID0gSUZfRkVBVFVSRV9TWVNMT0dEX0RVUCggICAoMSA8PCBPUFRCSVRfZHVwICAgICAgICApKSArIDAsCisJT1BUX2NmZyAgICAgICAgID0gSUZfRkVBVFVSRV9TWVNMT0dEX0NGRyggICAoMSA8PCBPUFRCSVRfY2ZnICAgICAgICApKSArIDAsCit9OworI2RlZmluZSBPUFRJT05fU1RSICJtOm5POmw6U3UiIFwKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCJzOiIgKSBcCisJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgiYjoiICkgXAorCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgIlI6IiApIFwKKwlJRl9GRUFUVVJFX1JFTU9URV9MT0coICAgICJMIiAgKSBcCisJSUZfRkVBVFVSRV9JUENfU1lTTE9HKCAgICAiQzo6IikgXAorCUlGX0ZFQVRVUkVfU1lTTE9HRF9EVVAoICAgIkQiICApIFwKKwlJRl9GRUFUVVJFX1NZU0xPR0RfQ0ZHKCAgICJmOiIgICkKKyNkZWZpbmUgT1BUSU9OX0RFQ0wgKm9wdF9tLCAqb3B0X2wgXAorCUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoLCpvcHRfcykgXAorCUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoLCpvcHRfYikgXAorCUlGX0ZFQVRVUkVfSVBDX1NZU0xPRyggICAgLCpvcHRfQyA9IE5VTEwpIFwKKwlJRl9GRUFUVVJFX1NZU0xPR0RfQ0ZHKCAgICwqb3B0X2YgPSBOVUxMKQorI2RlZmluZSBPUFRJT05fUEFSQU0gJm9wdF9tLCAmKEcubG9nRmlsZS5wYXRoKSwgJm9wdF9sIFwKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCwmb3B0X3MpIFwKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCwmb3B0X2IpIFwKKwlJRl9GRUFUVVJFX1JFTU9URV9MT0coCSAgLCZyZW1vdGVBZGRyTGlzdCkgXAorCUlGX0ZFQVRVUkVfSVBDX1NZU0xPRyggICAgLCZvcHRfQykgXAorCUlGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoICAgLCZvcHRfZikKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9DRkcKK3N0YXRpYyBjb25zdCBDT0RFKiBmaW5kX2J5X25hbWUoY2hhciAqbmFtZSwgY29uc3QgQ09ERSogY19zZXQpCit7CisJZm9yICg7IGNfc2V0LT5jX25hbWU7IGNfc2V0KyspIHsKKwkJaWYgKHN0cmNtcChuYW1lLCBjX3NldC0+Y19uYW1lKSA9PSAwKQorCQkJcmV0dXJuIGNfc2V0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorc3RhdGljIGNvbnN0IENPREUqIGZpbmRfYnlfdmFsKGludCB2YWwsIGNvbnN0IENPREUqIGNfc2V0KQoreworCWZvciAoOyBjX3NldC0+Y19uYW1lOyBjX3NldCsrKSB7CisJCWlmIChjX3NldC0+Y192YWwgPT0gdmFsKQorCQkJcmV0dXJuIGNfc2V0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCitzdGF0aWMgdm9pZCBwYXJzZV9zeXNsb2dkY2ZnKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJY2hhciAqdDsKKwlsb2dSdWxlX3QgKipwcF9ydWxlOworCS8qIHRva1swXSBzZXQgb2Ygc2VsZWN0b3JzICovCisJLyogdG9rWzFdIGZpbGUgbmFtZSAqLworCS8qIHRva1syXSBoYXMgdG8gYmUgTlVMTCAqLworCWNoYXIgKnRva1szXTsKKwlwYXJzZXJfdCAqcGFyc2VyOworCisJcGFyc2VyID0gY29uZmlnX29wZW4yKGZpbGUgPyBmaWxlIDogIi9ldGMvc3lzbG9nLmNvbmYiLAorCQkJCWZpbGUgPyB4Zm9wZW5fZm9yX3JlYWQgOiBmb3Blbl9mb3JfcmVhZCk7CisJaWYgKCFwYXJzZXIpCisJCS8qIGRpZG4ndCBmaW5kIGRlZmF1bHQgL2V0Yy9zeXNsb2cuY29uZiAqLworCQkvKiBwcm9jZWVkIGFzIGlmIHdlIGJ1aWx0IGJ1c3lib3ggd2l0aG91dCBjb25maWcgc3VwcG9ydCAqLworCQlyZXR1cm47CisKKwkvKiB1c2UgcHRyIHRvIHB0ciB0byBhdm9pZCBjaGVja2luZyB3aGV0aGVyIGhlYWQgd2FzIGluaXRpYWxpemVkICovCisJcHBfcnVsZSA9ICZHLmxvZ19ydWxlczsKKwkvKiBpdGVyYXRlIHRocm91Z2ggbGluZXMgb2YgY29uZmlnLCBza2lwcGluZyBjb21tZW50cyAqLworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRvaywgMywgMiwgIiMgXHQiLCBQQVJTRV9OT1JNQUwgfCBQQVJTRV9NSU5fRElFKSkgeworCQljaGFyICpjdXJfc2VsZWN0b3I7CisJCWxvZ1J1bGVfdCAqY3VyX3J1bGU7CisKKwkJLyogdW5leHBlY3RlZCB0cmFpbGluZyB0b2tlbj8gKi8KKwkJaWYgKHRva1syXSkKKwkJCWdvdG8gY2ZnZXJyOworCisJCWN1cl9ydWxlID0gKnBwX3J1bGUgPSB4emFsbG9jKHNpemVvZigqY3VyX3J1bGUpKTsKKworCQljdXJfc2VsZWN0b3IgPSB0b2tbMF07CisJCS8qIGl0ZXJhdGUgdGhyb3VnaCBzZWxlY3RvcnM6ICJrZXJuLmluZm87a2Vybi4hZXJyOy4uLiIgKi8KKwkJZG8geworCQkJY29uc3QgQ09ERSAqY29kZTsKKwkJCWNoYXIgKm5leHRfc2VsZWN0b3I7CisJCQl1aW50OF90IG5lZ2F0ZWRfcHJpbzsgLyogImtlcm4uIWVyciIgKi8KKwkJCXVpbnQ4X3Qgc2luZ2xlX3ByaW87ICAvKiAia2Vybi49ZXJyIiAqLworCQkJdWludDMyX3QgZmFjbWFwOyAvKiBiaXRtYXAgb2YgZW5hYmxlZCBmYWNpbGl0aWVzICovCisJCQl1aW50OF90IHByaW1hcDsgIC8qIGJpdG1hcCBvZiBlbmFibGVkIHByaW9yaXRpZXMgKi8KKwkJCXVuc2lnbmVkIGk7CisKKwkJCW5leHRfc2VsZWN0b3IgPSBzdHJjaHIoY3VyX3NlbGVjdG9yLCAnOycpOworCQkJaWYgKG5leHRfc2VsZWN0b3IpCisJCQkJKm5leHRfc2VsZWN0b3IrKyA9ICdcMCc7CisKKwkJCXQgPSBzdHJjaHIoY3VyX3NlbGVjdG9yLCAnLicpOworCQkJaWYgKCF0KQorCQkJCWdvdG8gY2ZnZXJyOworCQkJKnQrKyA9ICdcMCc7IC8qIHNlcGFyYXRlIGZhY2lsaXR5IGZyb20gcHJpb3JpdHkgKi8KKworCQkJbmVnYXRlZF9wcmlvID0gMDsKKwkJCXNpbmdsZV9wcmlvID0gMDsKKwkJCWlmICgqdCA9PSAnIScpIHsKKwkJCQluZWdhdGVkX3ByaW8gPSAxOworCQkJCSsrdDsKKwkJCX0KKwkJCWlmICgqdCA9PSAnPScpIHsKKwkJCQlzaW5nbGVfcHJpbyA9IDE7CisJCQkJKyt0OworCQkJfQorCisJCQkvKiBwYXJzZSBwcmlvcml0eSAqLworCQkJaWYgKCp0ID09ICcqJykKKwkJCQlwcmltYXAgPSAweGZmOyAvKiBhbGwgOCBsb2cgbGV2ZWxzIGVuYWJsZWQgKi8KKwkJCWVsc2UgeworCQkJCXVpbnQ4X3QgcHJpb3JpdHk7CisJCQkJY29kZSA9IGZpbmRfYnlfbmFtZSh0LCBwcmlvcml0eW5hbWVzKTsKKwkJCQlpZiAoIWNvZGUpCisJCQkJCWdvdG8gY2ZnZXJyOworCQkJCXByaW1hcCA9IDA7CisJCQkJcHJpb3JpdHkgPSBjb2RlLT5jX3ZhbDsKKwkJCQlpZiAocHJpb3JpdHkgPT0gSU5URVJOQUxfTk9QUkkpIHsKKwkJCQkJLyogZW5zdXJlIHdlIHRha2UgImVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtmYWNdICY9IDAiIGJyYW5jaCBiZWxvdyAqLworCQkJCQluZWdhdGVkX3ByaW8gPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW9yaXR5ID0gMSA8PCBwcmlvcml0eTsKKwkJCQkJZG8geworCQkJCQkJcHJpbWFwIHw9IHByaW9yaXR5OworCQkJCQkJaWYgKHNpbmdsZV9wcmlvKQorCQkJCQkJCWJyZWFrOworCQkJCQkJcHJpb3JpdHkgPj49IDE7CisJCQkJCX0gd2hpbGUgKHByaW9yaXR5KTsKKwkJCQkJaWYgKG5lZ2F0ZWRfcHJpbykKKwkJCQkJCXByaW1hcCA9IH5wcmltYXA7CisJCQkJfQorCQkJfQorCisJCQkvKiBwYXJzZSBmYWNpbGl0eSAqLworCQkJaWYgKCpjdXJfc2VsZWN0b3IgPT0gJyonKQorCQkJCWZhY21hcCA9ICgxPDxMT0dfTkZBQ0lMSVRJRVMpIC0gMTsKKwkJCWVsc2UgeworCQkJCWNoYXIgKm5leHRfZmFjaWxpdHk7CisJCQkJZmFjbWFwID0gMDsKKwkJCQl0ID0gY3VyX3NlbGVjdG9yOworCQkJCS8qIGl0ZXJhdGUgdGhyb3VnaCBmYWNpbGl0aWVzOiAia2VybixkYWVtb24uPHByaW9zcGVjPiIgKi8KKwkJCQlkbyB7CisJCQkJCW5leHRfZmFjaWxpdHkgPSBzdHJjaHIodCwgJywnKTsKKwkJCQkJaWYgKG5leHRfZmFjaWxpdHkpCisJCQkJCQkqbmV4dF9mYWNpbGl0eSsrID0gJ1wwJzsKKwkJCQkJY29kZSA9IGZpbmRfYnlfbmFtZSh0LCBmYWNpbGl0eW5hbWVzKTsKKwkJCQkJaWYgKCFjb2RlKQorCQkJCQkJZ290byBjZmdlcnI7CisJCQkJCS8qICJtYXJrIiBpcyBub3QgYSByZWFsIGZhY2lsaXR5LCBza2lwIGl0ICovCisJCQkJCWlmIChjb2RlLT5jX3ZhbCAhPSBJTlRFUk5BTF9NQVJLKQorCQkJCQkJZmFjbWFwIHw9IDE8PChMT0dfRkFDKGNvZGUtPmNfdmFsKSk7CisJCQkJCXQgPSBuZXh0X2ZhY2lsaXR5OworCQkJCX0gd2hpbGUgKHQpOworCQkJfQorCisJCQkvKiBtZXJnZSByZXN1bHQgd2l0aCBwcmV2aW91cyBzZWxlY3RvcnMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBMT0dfTkZBQ0lMSVRJRVM7ICsraSkgeworCQkJCWlmICghKGZhY21hcCAmICgxPDxpKSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChuZWdhdGVkX3ByaW8pCisJCQkJCWN1cl9ydWxlLT5lbmFibGVkX2ZhY2lsaXR5X3ByaW9tYXBbaV0gJj0gcHJpbWFwOworCQkJCWVsc2UKKwkJCQkJY3VyX3J1bGUtPmVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtpXSB8PSBwcmltYXA7CisJCQl9CisKKwkJCWN1cl9zZWxlY3RvciA9IG5leHRfc2VsZWN0b3I7CisJCX0gd2hpbGUgKGN1cl9zZWxlY3Rvcik7CisKKwkJLyogY2hlY2sgd2hldGhlciBjdXJyZW50IGZpbGUgbmFtZSB3YXMgbWVudGlvbmVkIGluIHByZXZpb3VzIHJ1bGVzIG9yCisJCSAqIGFzIGdsb2JhbCBsb2dmaWxlIChHLmxvZ0ZpbGUpLgorCQkgKi8KKwkJaWYgKHN0cmNtcChHLmxvZ0ZpbGUucGF0aCwgdG9rWzFdKSA9PSAwKSB7CisJCQljdXJfcnVsZS0+ZmlsZSA9ICZHLmxvZ0ZpbGU7CisJCQlnb3RvIGZvdW5kOworCQl9CisJCS8qIHRlbXBvcmFyaWx5IHVzZSBjdXJfcnVsZSBhcyBpdGVyYXRvciwgYnV0ICpwcF9ydWxlIHN0aWxsIHBvaW50cworCQkgKiB0byBjdXJyZW50bHkgcHJvY2Vzc2luZyBydWxlIGVudHJ5LgorCQkgKiBOT1RFOiAqcHBfcnVsZSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgKGFuZCBsYXN0IGluIHRoZSBsaXN0KSBydWxlLgorCQkgKi8KKwkJZm9yIChjdXJfcnVsZSA9IEcubG9nX3J1bGVzOyBjdXJfcnVsZSAhPSAqcHBfcnVsZTsgY3VyX3J1bGUgPSBjdXJfcnVsZS0+bmV4dCkgeworCQkJaWYgKHN0cmNtcChjdXJfcnVsZS0+ZmlsZS0+cGF0aCwgdG9rWzFdKSA9PSAwKSB7CisJCQkJLyogZm91bmQgLSByZXVzZSB0aGUgc2FtZSBmaWxlIHN0cnVjdHVyZSAqLworCQkJCSgqcHBfcnVsZSktPmZpbGUgPSBjdXJfcnVsZS0+ZmlsZTsKKwkJCQljdXJfcnVsZSA9ICpwcF9ydWxlOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJY3VyX3J1bGUtPmZpbGUgPSB4emFsbG9jKHNpemVvZigqY3VyX3J1bGUtPmZpbGUpKTsKKwkJY3VyX3J1bGUtPmZpbGUtPmZkID0gLTE7CisJCWN1cl9ydWxlLT5maWxlLT5wYXRoID0geHN0cmR1cCh0b2tbMV0pOworIGZvdW5kOgorCQlwcF9ydWxlID0gJmN1cl9ydWxlLT5uZXh0OworCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKwlyZXR1cm47CisKKyBjZmdlcnI6CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGluICclcycgYXQgbGluZSAlZCIsIGZpbGUsIHBhcnNlci0+bGluZW5vKTsKK30KKyNlbmRpZgorCisvKiBjaXJjdWxhciBidWZmZXIgdmFyaWFibGVzL3N0cnVjdHVyZXMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HCisKKyNpZiBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFIDwgNAorI2Vycm9yIFNvcnJ5LCB5b3UgbXVzdCBzZXQgdGhlIHN5c2xvZ2QgYnVmZmVyIHNpemUgdG8gYXQgbGVhc3QgNEtCLgorI2Vycm9yIFBsZWFzZSBjaGVjayBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFCisjZW5kaWYKKworLyogb3VyIHNoYXJlZCBrZXkgKHN5c2xvZ2QuYyBhbmQgbG9ncmVhZC5jIG11c3QgYmUgaW4gc3luYykgKi8KK2VudW0geyBLRVlfSUQgPSAweDQxNGU0NTQ3IH07IC8qICJHRU5BIiAqLworCitzdGF0aWMgdm9pZCBpcGNzeXNsb2dfY2xlYW51cCh2b2lkKQoreworCWlmIChHLnNobWlkICE9IC0xKSB7CisJCXNobWR0KEcuc2hidWYpOworCX0KKwlpZiAoRy5zaG1pZCAhPSAtMSkgeworCQlzaG1jdGwoRy5zaG1pZCwgSVBDX1JNSUQsIE5VTEwpOworCX0KKwlpZiAoRy5zX3NlbWlkICE9IC0xKSB7CisJCXNlbWN0bChHLnNfc2VtaWQsIDAsIElQQ19STUlELCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwY3N5c2xvZ19pbml0KHZvaWQpCit7CisJaWYgKERFQlVHKQorCQlwcmludGYoInNobWdldCgleCwgJWQsLi4uKVxuIiwgKGludClLRVlfSUQsIEcuc2htX3NpemUpOworCisJRy5zaG1pZCA9IHNobWdldChLRVlfSUQsIEcuc2htX3NpemUsIElQQ19DUkVBVCB8IDA2NDQpOworCWlmIChHLnNobWlkID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2htZ2V0Iik7CisJfQorCisJRy5zaGJ1ZiA9IHNobWF0KEcuc2htaWQsIE5VTEwsIDApOworCWlmIChHLnNoYnVmID09ICh2b2lkKikgLTFMKSB7IC8qIHNobWF0IGhhcyBiaXphcnJlIGVycm9yIHJldHVybiAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNobWF0Iik7CisJfQorCisJbWVtc2V0KEcuc2hidWYsIDAsIEcuc2htX3NpemUpOworCUcuc2hidWYtPnNpemUgPSBHLnNobV9zaXplIC0gb2Zmc2V0b2Yoc3RydWN0IHNoYnVmX2RzLCBkYXRhKSAtIDE7CisJLypHLnNoYnVmLT50YWlsID0gMDsqLworCisJLyogd2UnbGwgdHJ1c3QgdGhlIE9TIHRvIHNldCBpbml0aWFsIHNlbXZhbCB0byAwIChsZXQncyBob3BlKSAqLworCUcuc19zZW1pZCA9IHNlbWdldChLRVlfSUQsIDIsIElQQ19DUkVBVCB8IElQQ19FWENMIHwgMTAyMyk7CisJaWYgKEcuc19zZW1pZCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRUVYSVNUKSB7CisJCQlHLnNfc2VtaWQgPSBzZW1nZXQoS0VZX0lELCAyLCAwKTsKKwkJCWlmIChHLnNfc2VtaWQgIT0gLTEpCisJCQkJcmV0dXJuOworCQl9CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VtZ2V0Iik7CisJfQorfQorCisvKiBXcml0ZSBtZXNzYWdlIHRvIHNoYXJlZCBtZW0gYnVmZmVyICovCitzdGF0aWMgdm9pZCBsb2dfdG9fc2htZW0oY29uc3QgY2hhciAqbXNnKQoreworCWludCBvbGRfdGFpbCwgbmV3X3RhaWw7CisJaW50IGxlbjsKKworCWlmIChzZW1vcChHLnNfc2VtaWQsIEcuU013ZG4sIDMpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU013ZG4iKTsKKwl9CisKKwkvKiBDaXJjdWxhciBCdWZmZXIgQWxnb3JpdGhtOgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogdGFpbCA9PSBwb3NpdGlvbiB3aGVyZSB0byBzdG9yZSBuZXh0IHN5c2xvZyBtZXNzYWdlLgorCSAqIHRhaWwncyBtYXggdmFsdWUgaXMgKHNoYnVmLT5zaXplIC0gMSkKKwkgKiBMYXN0IGJ5dGUgb2YgYnVmZmVyIGlzIG5ldmVyIHVzZWQgYW5kIHJlbWFpbnMgTlVMLgorCSAqLworCWxlbiA9IHN0cmxlbihtc2cpICsgMTsgLyogbGVuZ3RoIHdpdGggTlVMIGluY2x1ZGVkICovCisgYWdhaW46CisJb2xkX3RhaWwgPSBHLnNoYnVmLT50YWlsOworCW5ld190YWlsID0gb2xkX3RhaWwgKyBsZW47CisJaWYgKG5ld190YWlsIDwgRy5zaGJ1Zi0+c2l6ZSkgeworCQkvKiBzdG9yZSBtZXNzYWdlLCBzZXQgbmV3IHRhaWwgKi8KKwkJbWVtY3B5KEcuc2hidWYtPmRhdGEgKyBvbGRfdGFpbCwgbXNnLCBsZW4pOworCQlHLnNoYnVmLT50YWlsID0gbmV3X3RhaWw7CisJfSBlbHNlIHsKKwkJLyogayA9PSBhdmFpbGFibGUgYnVmZmVyIHNwYWNlIGFoZWFkIG9mIG9sZCB0YWlsICovCisJCWludCBrID0gRy5zaGJ1Zi0+c2l6ZSAtIG9sZF90YWlsOworCQkvKiBjb3B5IHdoYXQgZml0cyB0byB0aGUgZW5kIG9mIGJ1ZmZlciwgYW5kIHJlcGVhdCAqLworCQltZW1jcHkoRy5zaGJ1Zi0+ZGF0YSArIG9sZF90YWlsLCBtc2csIGspOworCQltc2cgKz0gazsKKwkJbGVuIC09IGs7CisJCUcuc2hidWYtPnRhaWwgPSAwOworCQlnb3RvIGFnYWluOworCX0KKwlpZiAoc2Vtb3AoRy5zX3NlbWlkLCBHLlNNd3VwLCAxKSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlNNd3VwIik7CisJfQorCWlmIChERUJVRykKKwkJcHJpbnRmKCJ0YWlsOiVkXG4iLCBHLnNoYnVmLT50YWlsKTsKK30KKyNlbHNlCit2b2lkIGlwY3N5c2xvZ19jbGVhbnVwKHZvaWQpOwordm9pZCBpcGNzeXNsb2dfaW5pdCh2b2lkKTsKK3ZvaWQgbG9nX3RvX3NobWVtKGNvbnN0IGNoYXIgKm1zZyk7CisjZW5kaWYgLyogRkVBVFVSRV9JUENfU1lTTE9HICovCisKKy8qIFByaW50IGEgbWVzc2FnZSB0byB0aGUgbG9nIGZpbGUuICovCitzdGF0aWMgdm9pZCBsb2dfbG9jYWxseSh0aW1lX3Qgbm93LCBjaGFyICptc2csIGxvZ0ZpbGVfdCAqbG9nX2ZpbGUpCit7CisjaWZkZWYgU1lTTE9HRF9XUkxPQ0sKKwlzdHJ1Y3QgZmxvY2sgZmw7CisjZW5kaWYKKwlpbnQgbGVuID0gc3RybGVuKG1zZyk7CisKKwlpZiAobG9nX2ZpbGUtPmZkID49IDApIHsKKwkJLyogUmVvcGVuIGxvZyBmaWxlIGV2ZXJ5IHNlY29uZC4gVGhpcyBhbGxvd3MgYWRtaW4KKwkJICogdG8gZGVsZXRlIHRoZSBmaWxlIGFuZCBub3Qgd29ycnkgYWJvdXQgcmVzdGFydGluZyB1cy4KKwkJICogVGhpcyBjb3N0cyBhbG1vc3Qgbm90aGluZyBzaW5jZSBpdCBoYXBwZW5zCisJCSAqIF9hdCBtb3N0XyBvbmNlIGEgc2Vjb25kLgorCQkgKi8KKwkJaWYgKCFub3cpCisJCQlub3cgPSB0aW1lKE5VTEwpOworCQlpZiAoRy5sYXN0X2xvZ190aW1lICE9IG5vdykgeworCQkJRy5sYXN0X2xvZ190aW1lID0gbm93OworCQkJY2xvc2UobG9nX2ZpbGUtPmZkKTsKKwkJCWdvdG8gcmVvcGVuOworCQl9CisJfSBlbHNlIHsKKyByZW9wZW46CisJCWxvZ19maWxlLT5mZCA9IG9wZW4obG9nX2ZpbGUtPnBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVAorCQkJCQl8IE9fTk9DVFRZIHwgT19BUFBFTkQgfCBPX05PTkJMT0NLLAorCQkJCQkwNjY2KTsKKwkJaWYgKGxvZ19maWxlLT5mZCA8IDApIHsKKwkJCS8qIGNhbm5vdCBvcGVuIGxvZ2ZpbGU/IC0gcHJpbnQgdG8gL2Rldi9jb25zb2xlIHRoZW4gKi8KKwkJCWludCBmZCA9IGRldmljZV9vcGVuKERFVl9DT05TT0xFLCBPX1dST05MWSB8IE9fTk9DVFRZIHwgT19OT05CTE9DSyk7CisJCQlpZiAoZmQgPCAwKQorCQkJCWZkID0gMjsgLyogdGhlbiBzdGRlcnIsIGRhbW1pdCAqLworCQkJZnVsbF93cml0ZShmZCwgbXNnLCBsZW4pOworCQkJaWYgKGZkICE9IDIpCisJCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwkJeworCQkJc3RydWN0IHN0YXQgc3RhdGY7CisJCQlsb2dfZmlsZS0+aXNSZWd1bGFyID0gKGZzdGF0KGxvZ19maWxlLT5mZCwgJnN0YXRmKSA9PSAwICYmIFNfSVNSRUcoc3RhdGYuc3RfbW9kZSkpOworCQkJLyogYnVnIChtb3N0bHkgaGFybWxlc3MpOiBjYW4gd3JhcCBhcm91bmQgaWYgZmlsZSA+IDRnYiAqLworCQkJbG9nX2ZpbGUtPnNpemUgPSBzdGF0Zi5zdF9zaXplOworCQl9CisjZW5kaWYKKwl9CisKKyNpZmRlZiBTWVNMT0dEX1dSTE9DSworCWZsLmxfd2hlbmNlID0gU0VFS19TRVQ7CisJZmwubF9zdGFydCA9IDA7CisJZmwubF9sZW4gPSAxOworCWZsLmxfdHlwZSA9IEZfV1JMQ0s7CisJZmNudGwobG9nX2ZpbGUtPmZkLCBGX1NFVExLVywgJmZsKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwlpZiAoRy5sb2dGaWxlU2l6ZSAmJiBsb2dfZmlsZS0+aXNSZWd1bGFyICYmIGxvZ19maWxlLT5zaXplID4gRy5sb2dGaWxlU2l6ZSkgeworCQlpZiAoRy5sb2dGaWxlUm90YXRlKSB7IC8qIGFsd2F5cyAwLi45OSAqLworCQkJaW50IGkgPSBzdHJsZW4obG9nX2ZpbGUtPnBhdGgpICsgMyArIDE7CisJCQljaGFyIG9sZEZpbGVbaV07CisJCQljaGFyIG5ld0ZpbGVbaV07CisJCQlpID0gRy5sb2dGaWxlUm90YXRlIC0gMTsKKwkJCS8qIHJlbmFtZTogZi44IC0+IGYuOTsgZi43IC0+IGYuODsgLi4uICovCisJCQl3aGlsZSAoMSkgeworCQkJCXNwcmludGYobmV3RmlsZSwgIiVzLiVkIiwgbG9nX2ZpbGUtPnBhdGgsIGkpOworCQkJCWlmIChpID09IDApIGJyZWFrOworCQkJCXNwcmludGYob2xkRmlsZSwgIiVzLiVkIiwgbG9nX2ZpbGUtPnBhdGgsIC0taSk7CisJCQkJLyogaWdub3JlIGVycm9ycyAtIGZpbGUgbWlnaHQgYmUgbWlzc2luZyAqLworCQkJCXJlbmFtZShvbGRGaWxlLCBuZXdGaWxlKTsKKwkJCX0KKwkJCS8qIG5ld0ZpbGUgPT0gImYuMCIgbm93ICovCisJCQlyZW5hbWUobG9nX2ZpbGUtPnBhdGgsIG5ld0ZpbGUpOworCQkJLyogSW5jcmVkaWJseSwgaWYgRiBhbmQgRi4wIGFyZSBoYXJkbGlua3MsIFBPU0lYCisJCQkgKiBfZGVtYW5kc18gdGhhdCByZW5hbWUgcmV0dXJucyAwIGJ1dCBkb2VzIG5vdAorCQkJICogcmVtb3ZlIEYhISEKKwkJCSAqIChoYXJkbGlua2VkIEYvRi4wIHBhaXIgd2FzIG9ic2VydmVkIGFmdGVyCisJCQkgKiBwb3dlciBmYWlsdXJlIGR1cmluZyByZW5hbWUoKSkuCisJCQkgKiBFbnN1cmUgb2xkIGZpbGUgaXMgZ29uZToKKwkJCSAqLworCQkJdW5saW5rKGxvZ19maWxlLT5wYXRoKTsKKyNpZmRlZiBTWVNMT0dEX1dSTE9DSworCQkJZmwubF90eXBlID0gRl9VTkxDSzsKKwkJCWZjbnRsKGxvZ19maWxlLT5mZCwgRl9TRVRMS1csICZmbCk7CisjZW5kaWYKKwkJCWNsb3NlKGxvZ19maWxlLT5mZCk7CisJCQlnb3RvIHJlb3BlbjsKKwkJfQorCQlmdHJ1bmNhdGUobG9nX2ZpbGUtPmZkLCAwKTsKKwl9CisJbG9nX2ZpbGUtPnNpemUgKz0KKyNlbmRpZgorCQkJZnVsbF93cml0ZShsb2dfZmlsZS0+ZmQsIG1zZywgbGVuKTsKKyNpZmRlZiBTWVNMT0dEX1dSTE9DSworCWZsLmxfdHlwZSA9IEZfVU5MQ0s7CisJZmNudGwobG9nX2ZpbGUtPmZkLCBGX1NFVExLVywgJmZsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwYXJzZV9mYWNfcHJpb18yMChpbnQgcHJpLCBjaGFyICpyZXMyMCkKK3sKKwljb25zdCBDT0RFICpjX3ByaSwgKmNfZmFjOworCisJY19mYWMgPSBmaW5kX2J5X3ZhbChMT0dfRkFDKHByaSkgPDwgMywgZmFjaWxpdHluYW1lcyk7CisJaWYgKGNfZmFjKSB7CisJCWNfcHJpID0gZmluZF9ieV92YWwoTE9HX1BSSShwcmkpLCBwcmlvcml0eW5hbWVzKTsKKwkJaWYgKGNfcHJpKSB7CisJCQlzbnByaW50ZihyZXMyMCwgMjAsICIlcy4lcyIsIGNfZmFjLT5jX25hbWUsIGNfcHJpLT5jX25hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNucHJpbnRmKHJlczIwLCAyMCwgIjwlZD4iLCBwcmkpOworfQorCitzdGF0aWMgc3RydWN0IHRtICogZ2VuZXJhdGVfdGltZShzdHJ1Y3QgdGltZXZhbCAqdHZwLCBzdHJ1Y3QgdG0gKnRtcCkKK3sKKwlzdHJ1Y3QgdG0gKnRtOworCisJZ2V0dGltZW9mZGF5KHR2cCwgTlVMTCk7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF91dGMpIHsKKwkJdG0gPSBnbXRpbWVfcigmdHZwLT50dl9zZWMsIHRtcCk7CisJfSBlbHNlIHsKKwkJdG0gPSBsb2NhbHRpbWVfcigmdHZwLT50dl9zZWMsIHRtcCk7CisJfQorCisJcmV0dXJuIHRtOworfQorCisvKiBsZW4gcGFyYW1ldGVyIGlzIHVzZWQgb25seSBmb3IgImlzIHRoZXJlIGEgdGltZXN0YW1wPyIgY2hlY2suCisgKiBOQjogc29tZSBjYWxsZXJzIGNoZWF0IGFuZCBzdXBwbHkgbGVuPT0wIHdoZW4gdGhleSBrbm93CisgKiB0aGF0IHRoZXJlIGlzIG5vIHRpbWVzdGFtcCwgc2hvcnQtY2lyY3VpdGluZyB0aGUgdGVzdC4gKi8KK3N0YXRpYyB2b2lkIHRpbWVzdGFtcF9hbmRfbG9nKGludCBwcmksIGNoYXIgKm1zZywgaW50IGxlbikKK3sKKwljaGFyIHRpbWVzdGFtcFsyN107CisJc3RydWN0IHRpbWV2YWwgdHZub3c7CisJc3RydWN0IHRtIHBhcnNlZCwgdG1ub3csICp0bXA7CisJc2l6ZV90IG47CisKKwkvKiBKYW4gMTggMDA6MTE6MjIgbXNnLi4uICovCisJLyogMDEyMzQ1Njc4OTAxMjM0NTYgKi8KKwlpZiAobGVuIDwgMTYgfHwgbXNnWzNdICE9ICcgJyB8fCBtc2dbNl0gIT0gJyAnCisJIHx8IG1zZ1s5XSAhPSAnOicgfHwgbXNnWzEyXSAhPSAnOicgfHwgbXNnWzE1XSAhPSAnICcKKwkpIHsKKwkJdG1wID0gZ2VuZXJhdGVfdGltZSgmdHZub3csICZ0bW5vdyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHRtIGxvY2FsOworCQl0dm5vdy50dl9zZWMgPSB0aW1lKE5VTEwpOworCQlsb2NhbHRpbWVfcigmdHZub3cudHZfc2VjLCAmbG9jYWwpOworCQlpZiAoc3RycHRpbWUobXNnLCAiJWggJWUgJVQiLCAmcGFyc2VkKSAhPSBOVUxMKSB7CisKKwkJCXBhcnNlZC50bV9nbXRvZmYJPSBsb2NhbC50bV9nbXRvZmY7CisJCQlwYXJzZWQudG1fem9uZQkJPSBsb2NhbC50bV96b25lOworCQkJcGFyc2VkLnRtX3llYXIJCT0gbG9jYWwudG1feWVhcjsKKwkJCXBhcnNlZC50bV9pc2RzdAkJPSBsb2NhbC50bV9pc2RzdDsKKwkJCXR2bm93LnR2X3NlYyA9IG1rdGltZSgmcGFyc2VkKTsKKwkJCXR2bm93LnR2X3VzZWMgPSAwOworCisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF91dGMpIHsKKwkJCQl0bXAgPSBnbXRpbWVfcigmdHZub3cudHZfc2VjLCAmdG1ub3cpOworCQkJfSBlbHNlIHsKKwkJCQl0bXAgPSAmcGFyc2VkOworCQkJfQorCQl9IGVsc2UgeworCQkJdG1wICA9IGdlbmVyYXRlX3RpbWUoJnR2bm93LCAmdG1ub3cpOworCQl9CisJCW1zZyArPSAxNjsKKwl9CisJbiA9IHN0cmZ0aW1lKHRpbWVzdGFtcCwgc2l6ZW9mKHRpbWVzdGFtcCksICIlRiAlVCIsIHRtcCk7CisJc25wcmludGYodGltZXN0YW1wICsgbiwgc2l6ZW9mKHRpbWVzdGFtcCkgLSBuLCAiLiUwNmxkIiwgdHZub3cudHZfdXNlYyk7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9zbWFsbCkKKwkJc3ByaW50ZihHLnByaW50YnVmLCAiJXMgJXNcbiIsIHRpbWVzdGFtcCwgbXNnKTsKKwllbHNlIHsKKwkJY2hhciByZXNbMjBdOworCQlwYXJzZV9mYWNfcHJpb18yMChwcmksIHJlcyk7CisJCXNwcmludGYoRy5wcmludGJ1ZiwgIiVzICUuNjRzICVzICVzXG4iLCB0aW1lc3RhbXAsIEcuaG9zdG5hbWUsIHJlcywgbXNnKTsKKwl9CisKKwkvKiBMb2cgbWVzc2FnZSBsb2NhbGx5ICh0byBmaWxlIG9yIHNoYXJlZCBtZW0pICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9DRkcKKwl7CisJCWJvb2wgbWF0Y2ggPSAwOworCQlsb2dSdWxlX3QgKnJ1bGU7CisJCXVpbnQ4X3QgZmFjaWxpdHkgPSBMT0dfRkFDKHByaSk7CisJCXVpbnQ4X3QgcHJpb19iaXQgPSAxIDw8IExPR19QUkkocHJpKTsKKworCQlmb3IgKHJ1bGUgPSBHLmxvZ19ydWxlczsgcnVsZTsgcnVsZSA9IHJ1bGUtPm5leHQpIHsKKwkJCWlmIChydWxlLT5lbmFibGVkX2ZhY2lsaXR5X3ByaW9tYXBbZmFjaWxpdHldICYgcHJpb19iaXQpIHsKKwkJCQlsb2dfbG9jYWxseSh0dm5vdy50dl9zZWMsIEcucHJpbnRidWYsIHJ1bGUtPmZpbGUpOworCQkJCW1hdGNoID0gMTsKKwkJCX0KKwkJfQorCQlpZiAobWF0Y2gpCisJCQlyZXR1cm47CisJfQorI2VuZGlmCisJaWYgKExPR19QUkkocHJpKSA8IEcubG9nTGV2ZWwpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HCisJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9jaXJjdWxhcmxvZykgJiYgRy5zaGJ1ZikgeworCQkJbG9nX3RvX3NobWVtKEcucHJpbnRidWYpOworCQkJcmV0dXJuOworCQl9CisjZW5kaWYKKwkJbG9nX2xvY2FsbHkodHZub3cudHZfc2VjLCBHLnByaW50YnVmLCAmRy5sb2dGaWxlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVzdGFtcF9hbmRfbG9nX2ludGVybmFsKGNvbnN0IGNoYXIgKm1zZykKK3sKKwkvKiAtTCwgb3Igbm8gLVIgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRyAmJiAhKG9wdGlvbl9tYXNrMzIgJiBPUFRfbG9jYWxsb2cpKQorCQlyZXR1cm47CisJdGltZXN0YW1wX2FuZF9sb2coTE9HX1NZU0xPRyB8IExPR19JTkZPLCAoY2hhciopbXNnLCAwKTsKK30KKworLyogdG1wYnVmW2xlbl0gaXMgYSBOVUwgYnl0ZSAoc2V0IGJ5IGNhbGxlciksIGJ1dCB0aGVyZSBjYW4gYmUgb3RoZXIsCisgKiBlbWJlZGRlZCBOVUxzLiBTcGxpdCBtZXNzYWdlcyBvbiBlYWNoIG9mIHRoZXNlIE5VTHMsIHBhcnNlIHByaW8sCisgKiBlc2NhcGUgY29udHJvbCBjaGFycyBhbmQgbG9nIGVhY2ggbG9jYWxseS4gKi8KK3N0YXRpYyB2b2lkIHNwbGl0X2VzY2FwZV9hbmRfbG9nKGNoYXIgKnRtcGJ1ZiwgaW50IGxlbikKK3sKKwljaGFyICpwID0gdG1wYnVmOworCisJdG1wYnVmICs9IGxlbjsKKwl3aGlsZSAocCA8IHRtcGJ1ZikgeworCQljaGFyIGM7CisJCWNoYXIgKnEgPSBHLnBhcnNlYnVmOworCQlpbnQgcHJpID0gKExPR19VU0VSIHwgTE9HX05PVElDRSk7CisKKwkJaWYgKCpwID09ICc8JykgeworCQkJLyogUGFyc2UgdGhlIG1hZ2ljIHByaW9yaXR5IG51bWJlciAqLworCQkJcHJpID0gYmJfc3RydG91KHAgKyAxLCAmcCwgMTApOworCQkJaWYgKCpwID09ICc+JykKKwkJCQlwKys7CisJCQlpZiAocHJpICYgfihMT0dfRkFDTUFTSyB8IExPR19QUklNQVNLKSkKKwkJCQlwcmkgPSAoTE9HX1VTRVIgfCBMT0dfTk9USUNFKTsKKwkJfQorCisJCXdoaWxlICgoYyA9ICpwKyspKSB7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCWMgPSAnICc7CisJCQlpZiAoIShjICYgfjB4MWYpICYmIGMgIT0gJ1x0JykgeworCQkJCSpxKysgPSAnXic7CisJCQkJYyArPSAnQCc7IC8qIF5ALCBeQSwgXkIuLi4gKi8KKwkJCX0KKwkJCSpxKysgPSBjOworCQl9CisJCSpxID0gJ1wwJzsKKworCQkvKiBOb3cgbG9nIGl0ICovCisJCXRpbWVzdGFtcF9hbmRfbG9nKHByaSwgRy5wYXJzZWJ1ZiwgcSAtIEcucGFyc2VidWYpOworCX0KK30KKworI2lmZGVmIFNZU0xPR0RfTUFSSworc3RhdGljIHZvaWQgZG9fbWFyayhpbnQgc2lnKQoreworCWlmIChHLm1hcmtJbnRlcnZhbCkgeworCQl0aW1lc3RhbXBfYW5kX2xvZ19pbnRlcm5hbCgiLS0gTUFSSyAtLSIpOworCQlhbGFybShHLm1hcmtJbnRlcnZhbCk7CisJfQorfQorI2VuZGlmCisKKy8qIERvbid0IGlubGluZTogcHJldmVudCBzdHJ1Y3Qgc29ja2FkZHJfdW4gdG8gdGFrZSB1cCBzcGFjZSBvbiBzdGFjaworICogcGVybWFuZW50bHkgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgY3JlYXRlX3NvY2tldCh2b2lkKQoreworCXN0cnVjdCBzb2NrYWRkcl91biBzdW54OworCWludCBzb2NrX2ZkOworCWNoYXIgKmRldl9sb2dfbmFtZTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU1RFTUQKKwlpZiAoc2RfbGlzdGVuX2ZkcygpID09IDEpCisJCXJldHVybiBTRF9MSVNURU5fRkRTX1NUQVJUOworI2VuZGlmCisKKwltZW1zZXQoJnN1bngsIDAsIHNpemVvZihzdW54KSk7CisJc3VueC5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKworCS8qIFVubGluayBvbGQgL2Rldi9sb2cgb3Igb2JqZWN0IGl0IHBvaW50cyB0by4gKi8KKwkvKiAoaWYgaXQgZXhpc3RzLCBiaW5kIHdpbGwgZmFpbCkgKi8KKwlzdHJjcHkoc3VueC5zdW5fcGF0aCwgIi9kZXYvbG9nIik7CisJZGV2X2xvZ19uYW1lID0geG1hbGxvY19mb2xsb3dfc3ltbGlua3MoIi9kZXYvbG9nIik7CisJaWYgKGRldl9sb2dfbmFtZSkgeworCQlzYWZlX3N0cm5jcHkoc3VueC5zdW5fcGF0aCwgZGV2X2xvZ19uYW1lLCBzaXplb2Yoc3VueC5zdW5fcGF0aCkpOworCQlmcmVlKGRldl9sb2dfbmFtZSk7CisJfQorCXVubGluayhzdW54LnN1bl9wYXRoKTsKKworCXNvY2tfZmQgPSB4c29ja2V0KEFGX1VOSVgsIFNPQ0tfREdSQU0sIDApOworCXhiaW5kKHNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnN1bngsIHNpemVvZihzdW54KSk7CisJY2htb2QoIi9kZXYvbG9nIiwgMDY2Nik7CisKKwlyZXR1cm4gc29ja19mZDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cKK3N0YXRpYyBpbnQgdHJ5X3RvX3Jlc29sdmVfcmVtb3RlKHJlbW90ZUhvc3RfdCAqcmgpCit7CisJaWYgKCFyaC0+cmVtb3RlQWRkcikgeworCQl1bnNpZ25lZCBub3cgPSBtb25vdG9uaWNfc2VjKCk7CisKKwkJLyogRG9uJ3QgcmVzb2x2ZSBuYW1lIHRvbyBvZnRlbiAtIEROUyB0aW1lb3V0cyBjYW4gYmUgYmlnICovCisJCWlmICgobm93IC0gcmgtPmxhc3RfZG5zX3Jlc29sdmUpIDwgRE5TX1dBSVRfU0VDKQorCQkJcmV0dXJuIC0xOworCQlyaC0+bGFzdF9kbnNfcmVzb2x2ZSA9IG5vdzsKKwkJcmgtPnJlbW90ZUFkZHIgPSBob3N0MnNvY2thZGRyKHJoLT5yZW1vdGVIb3N0bmFtZSwgNTE0KTsKKwkJaWYgKCFyaC0+cmVtb3RlQWRkcikKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHhzb2NrZXQocmgtPnJlbW90ZUFkZHItPnUuc2Euc2FfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkb19zeXNsb2dkKHZvaWQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZG9fc3lzbG9nZCh2b2lkKQoreworCWludCBzb2NrX2ZkOworI2lmIEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cKKwlsbGlzdF90ICppdGVtOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9EVVAKKwlpbnQgbGFzdF9zeiA9IC0xOworCWNoYXIgKmxhc3RfYnVmOworCWNoYXIgKnJlY3ZidWYgPSBHLnJlY3ZidWY7CisjZWxzZQorI2RlZmluZSByZWN2YnVmIChHLnJlY3ZidWYpCisjZW5kaWYKKworCS8qIFNldCB1cCBzaWduYWwgaGFuZGxlcnMgKHNvIHRoYXQgdGhleSBpbnRlcnJ1cHQgcmVhZCgpKSAqLworCXNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHVEVSTSwgcmVjb3JkX3NpZ25vKTsKKwlzaWduYWxfbm9fU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR0lOVCwgcmVjb3JkX3NpZ25vKTsKKwkvL3NpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHUVVJVCwgcmVjb3JkX3NpZ25vKTsKKwlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKyNpZmRlZiBTWVNMT0dEX01BUksKKwlzaWduYWwoU0lHQUxSTSwgZG9fbWFyayk7CisJYWxhcm0oRy5tYXJrSW50ZXJ2YWwpOworI2VuZGlmCisJc29ja19mZCA9IGNyZWF0ZV9zb2NrZXQoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HICYmIChvcHRpb25fbWFzazMyICYgT1BUX2NpcmN1bGFybG9nKSkgeworCQlpcGNzeXNsb2dfaW5pdCgpOworCX0KKworCXRpbWVzdGFtcF9hbmRfbG9nX2ludGVybmFsKCJzeXNsb2dkIHN0YXJ0ZWQ6IEJ1c3lCb3ggdiIgQkJfVkVSKTsKKworCXdoaWxlICghYmJfZ290X3NpZ25hbCkgeworCQlzc2l6ZV90IHN6OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9EVVAKKwkJbGFzdF9idWYgPSByZWN2YnVmOworCQlpZiAocmVjdmJ1ZiA9PSBHLnJlY3ZidWYpCisJCQlyZWN2YnVmID0gRy5yZWN2YnVmICsgTUFYX1JFQUQ7CisJCWVsc2UKKwkJCXJlY3ZidWYgPSBHLnJlY3ZidWY7CisjZW5kaWYKKyByZWFkX2FnYWluOgorCQlzeiA9IHJlYWQoc29ja19mZCwgcmVjdmJ1ZiwgTUFYX1JFQUQgLSAxKTsKKwkJaWYgKHN6IDwgMCkgeworCQkJaWYgKCFiYl9nb3Rfc2lnbmFsKQorCQkJCWJiX3BlcnJvcl9tc2coInJlYWQgZnJvbSAvZGV2L2xvZyIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBEcm9wIHRyYWlsaW5nICdcbicgYW5kIE5VTHMgKHR5cGljYWxseSB0aGVyZSBpcyBvbmUgTlVMKSAqLworCQl3aGlsZSAoMSkgeworCQkJaWYgKHN6ID09IDApCisJCQkJZ290byByZWFkX2FnYWluOworCQkJLyogbWFuIDMgc3lzbG9nIHNheXM6ICJBIHRyYWlsaW5nIG5ld2xpbmUgaXMgYWRkZWQgd2hlbiBuZWVkZWQiLgorCQkJICogSG93ZXZlciwgbmVpdGhlciBnbGliYyBub3IgdWNsaWJjIGRvIHRoaXM6CisJCQkgKiBzeXNsb2cocHJpbywgInRlc3QiKSAgIHNlbmRzICJ0ZXN0XDAiIHRvIC9kZXYvbG9nLAorCQkJICogc3lzbG9nKHByaW8sICJ0ZXN0XG4iKSBzZW5kcyAidGVzdFxuXDAiLgorCQkJICogSU9XOiBuZXdsaW5lIGlzIHBhc3NlZCB2ZXJiYXRpbSEKKwkJCSAqIEkgdGFrZSBpdCB0byBtZWFuIHRoYXQgaXQncyBzeXNsb2dkJ3Mgam9iCisJCQkgKiB0byBtYWtlIHRob3NlIGxvb2sgaWRlbnRpY2FsIGluIHRoZSBsb2cgZmlsZXMuICovCisJCQlpZiAocmVjdmJ1Zltzei0xXSAhPSAnXDAnICYmIHJlY3ZidWZbc3otMV0gIT0gJ1xuJykKKwkJCQlicmVhazsKKwkJCXN6LS07CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0dEX0RVUAorCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfZHVwKSAmJiAoc3ogPT0gbGFzdF9zeikpCisJCQlpZiAobWVtY21wKGxhc3RfYnVmLCByZWN2YnVmLCBzeikgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJbGFzdF9zeiA9IHN6OworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworCQkvKiBTdG9jayBzeXNsb2dkIHNlbmRzIGl0ICdcbictdGVybWluYXRlZAorCQkgKiBvdmVyIG5ldHdvcmssIG1pbWljIHRoYXQgKi8KKwkJcmVjdmJ1Zltzel0gPSAnXG4nOworCisJCS8qIFdlIGFyZSBub3QgbW9kaWZ5aW5nIGxvZyBtZXNzYWdlcyBpbiBhbnkgd2F5IGJlZm9yZSBzZW5kICovCisJCS8qIFJlbW90ZSBzaXRlIGNhbm5vdCB0cnVzdCBfdXNfIGFueXdheSBhbmQgbmVlZCB0byBkbyB2YWxpZGF0aW9uIGFnYWluICovCisJCWZvciAoaXRlbSA9IEcucmVtb3RlSG9zdHM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCXJlbW90ZUhvc3RfdCAqcmggPSAocmVtb3RlSG9zdF90ICopaXRlbS0+ZGF0YTsKKworCQkJaWYgKHJoLT5yZW1vdGVGRCA9PSAtMSkgeworCQkJCXJoLT5yZW1vdGVGRCA9IHRyeV90b19yZXNvbHZlX3JlbW90ZShyaCk7CisJCQkJaWYgKHJoLT5yZW1vdGVGRCA9PSAtMSkKKwkJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFNlbmQgbWVzc2FnZSB0byByZW1vdGUgbG9nZ2VyLgorCQkJICogT24gc29tZSBlcnJvcnMsIGNsb3NlIGFuZCBzZXQgcmVtb3RlRkQgdG8gLTEKKwkJCSAqIHNvIHRoYXQgRE5TIHJlc29sdXRpb24gaXMgcmV0cmllZC4KKwkJCSAqLworCQkJaWYgKHNlbmR0byhyaC0+cmVtb3RlRkQsIHJlY3ZidWYsIHN6KzEsCisJCQkJCU1TR19ET05UV0FJVCB8IE1TR19OT1NJR05BTCwKKwkJCQkJJihyaC0+cmVtb3RlQWRkci0+dS5zYSksIHJoLT5yZW1vdGVBZGRyLT5sZW4pID09IC0xCisJCQkpIHsKKwkJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJY2FzZSBFQ09OTlJFU0VUOgorCQkJCWNhc2UgRU5PVENPTk46IC8qIHBhcmFub2lhICovCisJCQkJY2FzZSBFUElQRToKKwkJCQkJY2xvc2UocmgtPnJlbW90ZUZEKTsKKwkJCQkJcmgtPnJlbW90ZUZEID0gLTE7CisJCQkJCWZyZWUocmgtPnJlbW90ZUFkZHIpOworCQkJCQlyaC0+cmVtb3RlQWRkciA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HIHx8IChvcHRpb25fbWFzazMyICYgT1BUX2xvY2FsbG9nKSkgeworCQkJcmVjdmJ1Zltzel0gPSAnXDAnOyAvKiBlbnN1cmUgaXQgKmlzKiBOVUwgdGVybWluYXRlZCAqLworCQkJc3BsaXRfZXNjYXBlX2FuZF9sb2cocmVjdmJ1Ziwgc3opOworCQl9CisJfSAvKiB3aGlsZSAoIWJiX2dvdF9zaWduYWwpICovCisKKwl0aW1lc3RhbXBfYW5kX2xvZ19pbnRlcm5hbCgic3lzbG9nZCBleGl0aW5nIik7CisJcHV0cygic3lzbG9nZCBleGl0aW5nIik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cpCisJCWlwY3N5c2xvZ19jbGVhbnVwKCk7CisJa2lsbF9teXNlbGZfd2l0aF9zaWcoYmJfZ290X3NpZ25hbCk7CisjdW5kZWYgcmVjdmJ1ZgorfQorCitpbnQgc3lzbG9nZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3lzbG9nZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdHM7CisJY2hhciBPUFRJT05fREVDTDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HCisJbGxpc3RfdCAqcmVtb3RlQWRkckxpc3QgPSBOVUxMOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCS8qIE5vIG5vbi1vcHRpb24gcGFyYW1zLCAtUiBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MCIgSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCI6Ujo6Iik7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsIE9QVElPTl9QQVJBTSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworCXdoaWxlIChyZW1vdGVBZGRyTGlzdCkgeworCQlyZW1vdGVIb3N0X3QgKnJoID0geHphbGxvYyhzaXplb2YoKnJoKSk7CisJCXJoLT5yZW1vdGVIb3N0bmFtZSA9IGxsaXN0X3BvcCgmcmVtb3RlQWRkckxpc3QpOworCQlyaC0+cmVtb3RlRkQgPSAtMTsKKwkJcmgtPmxhc3RfZG5zX3Jlc29sdmUgPSBtb25vdG9uaWNfc2VjKCkgLSBETlNfV0FJVF9TRUMgLSAxOworCQlsbGlzdF9hZGRfdG8oJkcucmVtb3RlSG9zdHMsIHJoKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIFNZU0xPR0RfTUFSSworCWlmIChvcHRzICYgT1BUX21hcmspIC8vIC1tCisJCUcubWFya0ludGVydmFsID0geGF0b3VfcmFuZ2Uob3B0X20sIDAsIElOVF9NQVgvNjApICogNjA7CisjZW5kaWYKKwkvL2lmIChvcHRzICYgT1BUX25vZm9yaykgLy8gLW4KKwkvL2lmIChvcHRzICYgT1BUX291dGZpbGUpIC8vIC1PCisJaWYgKG9wdHMgJiBPUFRfbG9nbGV2ZWwpIC8vIC1sCisJCUcubG9nTGV2ZWwgPSB4YXRvdV9yYW5nZShvcHRfbCwgMSwgOCk7CisJLy9pZiAob3B0cyAmIE9QVF9zbWFsbCkgLy8gLVMKKyNpZiBFTkFCTEVfRkVBVFVSRV9ST1RBVEVfTE9HRklMRQorCWlmIChvcHRzICYgT1BUX2ZpbGVzaXplKSAvLyAtcworCQlHLmxvZ0ZpbGVTaXplID0geGF0b3VfcmFuZ2Uob3B0X3MsIDAsIElOVF9NQVgvMTAyNCkgKiAxMDI0OworCWlmIChvcHRzICYgT1BUX3JvdGF0ZWNudCkgLy8gLWIKKwkJRy5sb2dGaWxlUm90YXRlID0geGF0b3VfcmFuZ2Uob3B0X2IsIDAsIDk5KTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cKKwlpZiAob3B0X0MpIC8vIC1DbgorCQlHLnNobV9zaXplID0geGF0b3VsX3JhbmdlKG9wdF9DLCA0LCBJTlRfTUFYLzEwMjQpICogMTAyNDsKKyNlbmRpZgorCS8qIElmIHRoZXkgaGF2ZSBub3Qgc3BlY2lmaWVkIHJlbW90ZSBsb2dnaW5nLCB0aGVuIGxvZyBsb2NhbGx5ICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cgJiYgIShvcHRzICYgT1BUX3JlbW90ZWxvZykpIC8vIC1SCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX2xvY2FsbG9nOworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCisJcGFyc2Vfc3lzbG9nZGNmZyhvcHRfZik7CisjZW5kaWYKKworCS8qIFN0b3JlIGF3YXkgbG9jYWxob3N0J3MgbmFtZSBiZWZvcmUgdGhlIGZvcmsgKi8KKwlHLmhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCSpzdHJjaHJudWwoRy5ob3N0bmFtZSwgJy4nKSA9ICdcMCc7CisKKwlpZiAoIShvcHRzICYgT1BUX25vZm9yaykpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DSERJUl9ST09ULCBhcmd2KTsKKwl9CisJLy91bWFzaygwKTsgLSB3aHk/PworCXdyaXRlX3BpZGZpbGUoIi92YXIvcnVuL3N5c2xvZ2QucGlkIik7CisJZG9fc3lzbG9nZCgpOworCS8qIHJldHVybiBFWElUX1NVQ0NFU1M7ICovCit9CisKKy8qIENsZWFuIHVwLiBOZWVkZWQgYmVjYXVzZSB3ZSBhcmUgaW5jbHVkZWQgZnJvbSBzeXNsb2dkX2FuZF9sb2dnZXIuYyAqLworI3VuZGVmIERFQlVHCisjdW5kZWYgU1lTTE9HRF9NQVJLCisjdW5kZWYgU1lTTE9HRF9XUkxPQ0sKKyN1bmRlZiBHCisjdW5kZWYgR0xPQkFMUworI3VuZGVmIElOSVRfRworI3VuZGVmIE9QVElPTl9TVFIKKyN1bmRlZiBPUFRJT05fREVDTAorI3VuZGVmIE9QVElPTl9QQVJBTQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2Qvc3lzbG9nZF9hbmRfbG9nZ2VyLmMgYi9idXN5Ym94LTEuMTkuMy9zeXNrbG9nZC9zeXNsb2dkX2FuZF9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY0ZjIzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvc3lza2xvZ2Qvc3lzbG9nZF9hbmRfbG9nZ2VyLmMKQEAgLTAsMCArMSw1MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcHJpb3JpdHluYW1lc1tdIGFuZCBmYWNpbGl0eW5hbWVzW10KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNkZWZpbmUgU1lTTE9HX05BTUVTCisjZGVmaW5lIFNZU0xPR19OQU1FU19DT05TVAorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjaWYgMAorLyogRm9yIHRoZSByZWNvcmQ6IHdpdGggU1lTTE9HX05BTUVTIDxzeXNsb2cuaD4gZGVmaW5lcworICogKG5vdCBkZWNsYXJlcykgdGhlIGZvbGxvd2luZzoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2NvZGUgeworCS8qY29uc3QqLyBjaGFyICpjX25hbWU7CisJaW50IGNfdmFsOworfSBDT0RFOworLypjb25zdCovIENPREUgcHJpb3JpdHluYW1lc1tdID0geworICAgIHsgImFsZXJ0IiwgTE9HX0FMRVJUIH0sCisuLi4KKyAgICB7IE5VTEwsIC0xIH0KK307CisvKiBzYW1lIGZvciBmYWNpbGl0eW5hbWVzW10gKi8KKworLyogVGhpcyBNVVNUIG9jY3VyIG9ubHkgb25jZSBwZXIgZW50aXJlIGV4ZWN1dGFibGUsCisgKiB0aGVyZWZvcmUgd2UgY2FuJ3QganVzdCBkbyBpdCBpbiBzeXNsb2dkLmMgYW5kIGxvZ2dlci5jIC0KKyAqIHRoZXJlIHdpbGwgYmUgdHdvIGNvcGllcyBvZiBpdC4KKyAqCisgKiBXZSBjYW5ub3QgZXZlbiBkbyBpdCBpbiBzZXBhcmF0ZSBmaWxlIGFuZCB0aGVuIGp1c3QgcmVmZXJlbmNlCisgKiBwcmlvcml0eW5hbWVzW10gZnJvbSBzeXNsb2dkLmMgYW5kIGxvZ2dlci5jIC0gYmFyZSA8c3lzbG9nLmg+CisgKiB3aWxsIG5vdCBlbWl0IGV4dGVybiBkZWNscyBmb3IgcHJpb3JpdHluYW1lc1tdISBBdHRlbXB0cyB0bworICogZW1pdCAibWF0Y2hpbmciIHN0cnVjdCBfY29kZSBkZWNsYXJhdGlvbiBkZWZlYXQgdGhlIHdob2xlIHB1cnBvc2UKKyAqIG9mIDxzeXNsb2cuaD4uCisgKgorICogRm9yIG5vdywgc3lzbG9nZC5jIGFuZCBsb2dnZXIuYyBhcmUgc2ltcGx5IGNvbXBpbGVkIGludG8KKyAqIG9uZSBvYmplY3QgZmlsZS4KKyAqLworI2VuZGlmCisKKyNpZiBFTkFCTEVfU1lTTE9HRAorI2luY2x1ZGUgInN5c2xvZ2QuYyIKKyNlbmRpZgorCisjaWYgRU5BQkxFX0xPR0dFUgorI2luY2x1ZGUgImxvZ2dlci5jIgorI2VuZGlmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvUkVBRE1FIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQzYTEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL1JFQURNRQpAQCAtMCwwICsxLDUyIEBACitUbyBydW4gdGhlIHRlc3Qgc3VpdGUsIGNoYW5nZSB0byB0aGlzIGRpcmVjdG9yeSBhbmQgcnVuICIuL3J1bnRlc3QiLiAgSXQgd2lsbAorcnVuIGFsbCBvZiB0aGUgdGVzdCBjYXNlcywgYW5kIGxpc3QgdGhvc2Ugd2l0aCB1bmV4cGVjdGVkIG91dGNvbWVzLiAgQWRkaW5nIHRoZQorLXYgb3B0aW9uIHdpbGwgY2F1c2UgaXQgdG8gc2hvdyBleHBlY3RlZCBvdXRjb21lcyBhcyB3ZWxsLiAgVG8gb25seSBydW4gdGhlIHRlc3QKK2Nhc2VzIGZvciBwYXJ0aWN1bGFyIGFwcGxldHM6CisKKy4vcnVudGVzdCA8YXBwbGV0MT4gPGFwcGxldDI+Li4uCisKK1NldCBTS0lQX0tOT1dOX0JVR1MgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYW55IG5vbi1lbXB0eSB2YWx1ZQordG8gZXhjbHVkZSB0ZXN0cyB3aGljaCBhcmUga25vd24gdG8gZmFpbC4KKworU2V0IFNLSVBfSU5URVJORVRfVEVTVFMgdG8gZXhjbHVkZSB0ZXN0cyB3aGljaCByZXF1aXJlIHdvcmtpbmcKK2ludGVybmV0IGNvbm5lY3Rpb24uCisKKworQ29tbW9uIGNhdXNlcyBvZiBmYWxzZSBwb3NpdGl2ZXM6CisKK0ZvciBidXN5Ym94IGJ1aWx0IGFnYWluc3QgdWNsaWJjLCAvZXRjL1RaIGRvZXMgbm90IGV4aXN0IG9yIGRvZXMgbm90IG1hdGNoCitob3N0IHN5c3RlbSB0aW1lem9uZSBzZXR0aW5nLiBGb3IgZ2xpYmMgYmFzZWQgaG9zdCBzeXN0ZW1zLCB0aW1lem9uZSBzZXR0aW5ncworYXJlIGluIC9ldGMvbG9jYWx0aW1lLgorCitMQU5HIGFuZCBMQ194eHggZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCB0byBub24tQyBsb2NhbGUuCisKKworRGV2ZWxvcGVyJ3Mgbm90ZXM6CisKK1RoZSB0ZXN0IGNhc2VzIGZvciBhbiBhcHBsZXQgcmVzaWRlIGluIHRoZSBzdWJkaXJlY3Rvcnkgb2YgdGhlIGFwcGxldCBuYW1lLgorVGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSBzaG91bGQgYmUgdGhlIGFzc2VydGlvbiB0aGF0IGlzIHRlc3RlZC4KK1RoZSB0ZXN0IGNhc2Ugc2hvdWxkIGJlIGEgc2hlbGwgZnJhZ21lbnQgdGhhdCByZXR1cm5zIHN1Y2Nlc3NmdWxseQoraWYgdGhlIHRlc3QgY2FzZSBwYXNzZXMsIGFuZCB1bnN1Y2Nlc3NmdWxseSBvdGhlcndpc2UuCisKK0lmIHRoZSB0ZXN0IGNhc2UgcmVsaWVzIG9uIGEgY2VydGFpbiBmZWF0dXJlLCBpdCBzaG91bGQgaW5jbHVkZSB0aGUgc3RyaW5nCisiRkVBVFVSRTogIiBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSBpbiBhIGNvbW1lbnQuICBJZiBpdCBpcyBhbHdheXMKK2V4cGVjdGVkIHRvIGZhaWwsIGl0IHNob3VsZCBpbmNsdWRlIHRoZSBzdHJpbmcgIlhGQUlMIiBpbiBhIGNvbW1lbnQuCisKKworRm9yIHRoZSBlbnRpcmUgdGVzdHN1aXRlLCB0aGUgY29weXJpZ2h0IGlzIGFzIGZvbGxvd3M6CisKK0NvcHlyaWdodCAoQykgMjAwMSwgMjAwMiAgTWF0dCBLcmFhaQorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKK29mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL1RPRE8gYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk1N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL1RPRE8KQEAgLTAsMCArMSwyNiBAQAorVGhpcyB0ZXN0c3VpdGUgaXMgcXVpdGUgb2J2aW91c2x5IGEgd29yayBpbiBwcm9ncmVzcy4gIEFzIHN1Y2gsCit0aGVyZSBhcmUgYSBudW1iZXIgb2YgZ29vZCBleHRlbnNpb25zLiAgSWYgeW91IGFyZSBsb29raW5nIGZvcgorc29tZXRoaW5nIHRvIGRvLCBmZWVsIGZyZWUgdG8gdGFja2xlIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmc6CisKK01vdmluZyB0byB0aGUgbmV3IGZvcm1hdC4KKwlUaGUgb2xkIHdheSB3YXMgImxvdHMgb2YgbGl0dGxlIHRlc3RzIGZpbGVzIGluIGEgZGlyZWN0b3J5Iiwgd2hpY2gKKwlkb2Vzbid0IGludGVyYWN0IHdlbGwgd2l0aCBzb3VyY2UgY29udHJvbCBzeXN0ZW1zLiAgVGhlIG5ldyB0ZXN0CisJZm9ybWF0IGlzIGNvbW1hbmQudGVzdHMgZmlsZXMgdGhhdCB1c2UgdGVzdGluZy5zaC4KKworRXZlcnkgYnVzeWJveCBhcHBsZXQgbmVlZHMgYSBjb3JyZXNwb25kaW5nIGFwcGxldC50ZXN0cy4KKworRnVsbCBTVVN2MyB0ZXN0IHN1aXRlLgorCUxldCdzIG1ha2UgdGhlIExpbnV4IFRlc3QgUHJvamVjdCBqZWFsb3VzLCBzaGFsbCB3ZT8gIERvbid0IGp1c3QKKwlhdWRpdCBwcm9ncmFtcyBmb3Igc3RhbmRhcmRzIGNvbXBsaWFuY2UsIF9wcm92ZV8gaXQgd2l0aCBhIHJlZ3Jlc3Npb24KKwl0ZXN0IGhhcm5lc3MuCisKKwlodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzLworCitTb21lIHRlc3RzIG5lZWQgcm9vdCBhY2Nlc3MuCisJSXQncyBoYXJkIHRvIHRlc3QgdGhpbmdzIGxpa2UgbW91bnQgb3IgaW5pdCBhcyBhIG5vcm1hbCB1c2VyLgorCVBvc3NpYmx5IFVzZXIgTW9kZSBMaW51eCBjb3VsZCBiZSB1c2VkIGZvciB0aGlzLCBvciBwZXJoYXBzCisJRXJpaydzIGJ1aWxkcm9vdC4KKworbGliYmIgdW5pdCB0ZXN0aW5nCisJQmVpbmcgYWJsZSB0byB0ZXN0IHRoZSBmdW5jdGlvbnMgb2YgbGliYmIgaW5kaXZpZHVhbGx5IG1heQorCWhlbHAgdG8gcHJldmVudCByZWdyZXNzaW9ucy4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9hbGxfc291cmNlY29kZS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9hbGxfc291cmNlY29kZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZGNiYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2FsbF9zb3VyY2Vjb2RlLnRlc3RzCkBAIC0wLDAgKzEsOTIgQEAKKyMhL2Jpbi9zaAorCisjIFRlc3RzIGZvciB0aGUgc291cmNlY29kZSBiYXNlIGl0c2VsZi4KKyMgQ29weXJpZ2h0IDIwMDYgYnkgTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitbIC1uICIkc3JjZGlyIiBdIHx8IHNyY2Rpcj0kKHB3ZCkKKy4gLi90ZXN0aW5nLnNoCisKKworIworIyBpZiB3ZSBkb24ndCBoYXZlIHRoZSBzb3VyY2Vjb2RlIGF2YWlsYWJsZSwgbGV0J3MganVzdCBiYWlsCisjCitbIC1zICIkc3JjZGlyLy4uL01ha2VmaWxlIiBdIHx8IGV4aXQgMAorWyAtcyAiJHNyY2Rpci8uLi9pbmNsdWRlL2FwcGxldHMuaCIgXSB8fCBleGl0IDAKKworCisjCisjIG1ha2Ugc3VyZSBhbGwgdXNhZ2Ugc3RyaW5ncyBhcmUgcHJvcGVybHkgZXNjYXBlZC4gIG9mdGVudGltZXMgcGVvcGxlIG1pc3MKKyMgYW4gZXNjYXBlIHNlcXVlbmNlIHNvIHdlIGVuZCB1cCB3aXRoOgorIyAjZGVmaW5lIGZvb191c2FnZSBcCisjICAgICAgICIgdGhpcyBsaW5lIGlzIG9rIiBcCisjICAgICAgICIgYXMgaXMgdGhpcyBsaW5lIgorIyAgICAgICAiIGJ1dCB0aGlzIG9uZSBpcyBicm9rZW4gYXMgdGhlIFwgaXMgbWlzc2luZyBmcm9tIGFib3ZlIgorIworJHtDUk9TU19DT01QSUxFfWNwcCAtZEQgLVAgJHNyY2Rpci8uLi9pbmNsdWRlL3VzYWdlLmggXAorCXwgc2VkIC1lICcvXiNkZWZpbmUvZCcgLWUgJy9eJC9kJyA+IHNyYy51c2FnZS5lc2NhcGVkCit0ZXN0aW5nICJVc2FnZSBzdHJpbmdzIGVzY2FwZWQiICJjYXQgc3JjLnVzYWdlLmVzY2FwZWQiICIiICIiICIiCitybSAtZiBzcmMudXNhZ2UuZXNjYXBlZAorCisKKyMKKyMgdmVyaWZ5IHRoZSBhcHBsZXQgb3JkZXIgaXMgY29ycmVjdCBpbiBhcHBsZXRzLmgsIG90aGVyd2lzZQorIyBhcHBsZXRzIHdvbid0IGJlIGNhbGxlZCBwcm9wZXJseS4KKyMKK3NlZCAtbiAtZSAnczpeLy86OicgLWUgJy9eSUZfW0EtWl0qKEFQUExFVC97czosLio6OjtzOi4qKDo6O3M6Ijo6ZztwfScgXAorCSRzcmNkaXIvLi4vaW5jbHVkZS9hcHBsZXRzLmggPiBhcHBsZXQub3JkZXIuY3VycmVudAorTENfQUxMPUMgc29ydCBhcHBsZXQub3JkZXIuY3VycmVudCA+IGFwcGxldC5vcmRlci5jb3JyZWN0Cit0ZXN0aW5nICJBcHBsZXQgb3JkZXIiICJkaWZmIC11IGFwcGxldC5vcmRlci5jdXJyZW50IGFwcGxldC5vcmRlci5jb3JyZWN0IiAiIiAiIiAiIgorcm0gLWYgYXBwbGV0Lm9yZGVyLmN1cnJlbnQgYXBwbGV0Lm9yZGVyLmNvcnJlY3QKKworCisjCisjIGNoZWNrIGZvciBtaXNjIGNvbW1vbiB0eXBvcworIworZmluZCAkc3JjZGlyLy4uLyBcCisJJygnIC10eXBlIGQgLWEgJygnIC1uYW1lIC5zdm4gLW8gLW5hbWUgdGVzdHN1aXRlICcpJyAtcHJ1bmUgJyknIFwKKwktbyAnKCcgLXR5cGUgZiAtYSAtcHJpbnQwICcpJyB8IHhhcmdzIC0wIFwKKwlncmVwIC1JIFwKKwkJLWUgJ1w8Y29tcGF0YWJpbGl0eVw+JyBcCisJCS1lICdcPGNvbXBhdGFibGVcPicgXAorCQktZSAnXDxmb3JkZWdyb3VuZFw+JyBcCisJCS1lICdcPGRlcGVuY3lcPicgLWUgJ1w8ZGVwZW5kYW5jeVw+JyAtZSAnXDxkZXBlbmRhbmNpZXNcPicgXAorCQktZSAnXDxkZWZhbHRcPicgXAorCQktZSAnXDxyZW1haW5nXD4nIFwKKwkJLWUgJ1w8cXVldWVpbmdcPicgXAorCQktZSAnXDxkZXRhdGNoXD4nIFwKKwkJLWUgJ1w8c2VtcGFob3JlXD4nIFwKKwkJLWUgJ1w8cmVwcmVuc3RhdGl2ZVw+JyBcCisJCS1lICdcPG92ZXJyaWRlblw+JyBcCisJCS1lICdcPHJlYWRlZFw+JyBcCisJCS1lICdcPGZvcm1hdGVkXD4nIFwKKwkJLWUgJ1w8YWxnb3JpdGhpY1w+JyBcCisJCS1lICdcPGRlYW1vblw+JyBcCisJCS1lICdcPGRlcmVmZXJuY2VcPicgXAorCQktZSAnXDxhY29tYWRhdGVcPicgXAorCQl8IHNlZCAtZSAiczpeJHNyY2Rpci9cLlwuLzo6ZyIgPiBzcmMudHlwb3MKK3Rlc3RpbmcgIkNvbW1vbiB0eXBvcyIgImNhdCBzcmMudHlwb3MiICIiICIiICIiCitybSAtZiBzcmMudHlwb3MKKworCisjCisjIGRvbid0IGFsbG93IG9ic29sZXRlIGZ1bmN0aW9ucworIworZmluZCAkc3JjZGlyLy4uICcoJyAtbmFtZSAnKi5jJyAtbyAtbmFtZSAnKi5oJyAnKScgLXByaW50MCB8IHhhcmdzIC0wIFwKKwlncmVwIC1FIC1lICdcPChiY21wfGJjb3B5fGJ6ZXJvfGdldHdkfGluZGV4fG1rdGVtcHxyaW5kZXh8dXRpbWV8c2lnYmxvY2t8c2lnZ2V0bWFza3xzaWdzZXRtYXNrKVw+W1s6c3BhY2U6XV0qXCgnIFwKKwl8IHNlZCAtZSAiczpeJHNyY2Rpci9cLlwuLzo6ZyIgPiBzcmMub2Jzb2xldGUuZnVuY3MKK3Rlc3RpbmcgIk9ic29sZXRlIGZ1bmN0aW9uIHVzYWdlIiAiY2F0IHNyYy5vYnNvbGV0ZS5mdW5jcyIgIiIgIiIgIiIKK3JtIC1mIHNyYy5vYnNvbGV0ZS5mdW5jcworCisKKyMKKyMgZG9uJ3QgYWxsb3cgb2Jzb2xldGUgaGVhZGVycworIworZmluZCAkc3JjZGlyLy4uICcoJyAtbmFtZSAnKi5jJyAtbyAtbmFtZSAnKi5oJyAnKScgLXByaW50MCB8IHhhcmdzIC0wIFwKKwlncmVwIC1FIC1lICdcPChtYWxsb2N8bWVtb3J5fHN5cy8oZXJybm98ZmNudGx8c2lnbmFsfHN0cm9wdHN8dGVybWlvc3x1bmlzdGQpKVwuaFw+JyBcCisJfCBzZWQgLWUgInM6XiRzcmNkaXIvXC5cLi86OmciID4gc3JjLm9ic29sZXRlLmhlYWRlcnMKK3Rlc3RpbmcgIk9ic29sZXRlIGhlYWRlcnMiICJjYXQgc3JjLm9ic29sZXRlLmhlYWRlcnMiICIiICIiICIiCitybSAtZiBzcmMub2Jzb2xldGUuaGVhZGVycworCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2FyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2FyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhOGViOWIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYXIudGVzdHMKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIE5va2lhIENvcnBvcmF0aW9uCisjIFdyaXR0ZW4gYnkgQWxleGFuZGVyIFNoaXNoa2luCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZChzKSIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworb3B0aW9uYWwgRkVBVFVSRV9BUl9DUkVBVEUKKworcm0gdGVzdC5hIDI+L2Rldi9udWxsCit0ZXN0aW5nICJhciBjcmVhdGVzIGFyY2hpdmVzIiBcCisgICAgICAgImFyIHJjIHRlc3QuYSBSRUFETUUgJiYgYXIgcCB0ZXN0LmEgUkVBRE1FIHwgbWQ1c3VtIiBcCisgICAgICAgIiQobWQ1c3VtIDxSRUFETUUpXG4iIFwKKyAgICAgICAiIiBcCisgICAgICAgIiIKK3JtIHRlc3QuYQorCit0ZXN0aW5nICJhciByZXBsYWNlcyB0aGluZ3MgaW4gYXJjaGl2ZXMiIFwKKyAgICAgICAiZWNobyAnYmxhaCEnID5maWxlMSAmJiBlY2hvICdibGFzdCEnID5maWxlMiAmJiBhciBjciB0ZXN0LmEgUkVBRE1FIGZpbGUxIGZpbGUyICYmIG12IGZpbGUyIGZpbGUxICYmIGFyIGNyIHRlc3QuYSBmaWxlMSAmJiBhciBwIHRlc3QuYSBmaWxlMSIgXAorICAgICAgICJibGFzdCFcbiIgXAorICAgICAgICIiIFwKKyAgICAgICAiIgorcm0gdGVzdC5hIGZpbGUxIGZpbGUxIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2FzaC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9hc2gudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE5OTI0NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9hc2gudGVzdHMKQEAgLTAsMCArMSw4MyBAQAorIyEvYmluL3NoCisjCisjIFRoZXNlIGFyZSBub3QgYXNoIHRlc3RzLCB3ZSB1c2UgYXNoIGFzIGEgd2F5IHRvIHRlc3QgbGluZWVkaXQhCisjCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKwordGVzdCB4IkNPTkZJR19TQ1JJUFQiID0geCJ5IiB8fCBleGl0IDAKK3Rlc3QgeCJDT05GSUdfSEVYRFVNUCIgPSB4InkiIHx8IGV4aXQgMAordGVzdCB4IkNPTkZJR19GRUFUVVJFX0RFVlBUUyIgPSB4InkiIHx8IGV4aXQgMAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK2lmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOIiA9IHgieSI7IHRoZW4KK3Rlc3RpbmcgIk9uZSBieXRlIHdoaWNoIGlzIG5vdCB2YWxpZCB1bmljb2RlIGNoYXIgZm9sbG93ZWQgYnkgdmFsaWQgaW5wdXQiIFwKKwkic2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgZmYgMmQgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Li0ufAorMDAwMDAwMDMKKyIgXAorCSIiIFwKKwkiZWNobyBceGZmLSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKKwordGVzdGluZyAiMzAgYnl0ZXMgd2hpY2ggYXJlIG5vdCB2YWxpZCB1bmljb2RlIGNoYXJzIGZvbGxvd2VkIGJ5IHZhbGlkIGlucHV0IiBcCisJInNjcmlwdCAtcSAtYyAnYXNoJyAvZGV2L251bGwgPi9kZXYvbnVsbDsgY2F0IGFzaC5vdXRwdXQiIFwKKwkiXAorMDAwMDAwMDAgIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmICBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDAxMCAgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgIGZmIGZmIGZmIGZmIGZmIGZmIDJkIDBhICB8Li4uLi4uLi4uLi4uLi4tLnwKKzAwMDAwMDIwCisiIFwKKwkiIiBcCisJImVjaG8gXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmLSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKK2Vsc2UKK3Rlc3RpbmcgIk9uZSBieXRlIHdoaWNoIGlzIG5vdCB2YWxpZCB1bmljb2RlIGNoYXIgZm9sbG93ZWQgYnkgdmFsaWQgaW5wdXQiIFwKKwkic2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgM2YgMmQgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Py0ufAorMDAwMDAwMDMKKyIgXAorCSIiIFwKKwkiZWNobyBceGZmLSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKKwordGVzdGluZyAiMzAgYnl0ZXMgd2hpY2ggYXJlIG5vdCB2YWxpZCB1bmljb2RlIGNoYXJzIGZvbGxvd2VkIGJ5IHZhbGlkIGlucHV0IiBcCisJInNjcmlwdCAtcSAtYyAnYXNoJyAvZGV2L251bGwgPi9kZXYvbnVsbDsgY2F0IGFzaC5vdXRwdXQiIFwKKwkiXAorMDAwMDAwMDAgIDNmIDNmIDNmIDNmIDNmIDNmIDNmIDNmICAzZiAzZiAzZiAzZiAzZiAzZiAzZiAzZiAgfD8/Pz8/Pz8/Pz8/Pz8/Pz98CiswMDAwMDAxMCAgM2YgM2YgM2YgM2YgM2YgM2YgM2YgM2YgIDNmIDNmIDNmIDNmIDNmIDNmIDJkIDBhICB8Pz8/Pz8/Pz8/Pz8/Pz8tLnwKKzAwMDAwMDIwCisiIFwKKwkiIiBcCisJImVjaG8gXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmLSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKK2ZpCisKKworIyBOb3Qgc3VyZSB0aGlzIGJlaGF2aW9yIGlzIHBlcmZlY3Q6IHdlIGxvc2UgYWxsIGludmFsaWQgaW5wdXQgd2hpY2ggcHJlY2VkZXMKKyMgYXJyb3cga2V5cyBhbmQgc3VjaC4gSW4gdGhpcyBleGFtcGxlLCBceGZmXHhmZiBhcmUgbG9zdAordGVzdGluZyAiMiBieXRlcyB3aGljaCBhcmUgbm90IHZhbGlkIHVuaWNvZGUgY2hhcnMgZm9sbG93ZWQgYnkgbGVmdCBhcnJvdyBrZXkiIFwKKwkic2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgM2QgMmQgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8PS0ufAorMDAwMDAwMDMKKyIgXAorCSIiIFwKKwkiZWNobyA9K1x4ZmZceGZmXHgxYlx4NWJceDQ0LSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKKworIyBhc2ggc2hvdWxkIHNlZSAiZWNobyBceGZmXG4iLHBhdXNlIC0+IGV4ZWN1dGUgaXQgYXMgImVjaG8gPyIgKHdoaWNoIGlzCisjIG5vdCBjaGVja2VkIGJ5IHRoZSB0ZXN0KSwgdGhlbiByZWFkIGFuZCBleGVjdXRlIHRoZSByZXN0OiAiZWNobyBBIHwgLi4uIgorIyBUaGUgYnVnIHdhcyB0aGF0IGFzaCB3YXMgZWF0aW5nIHRoZSBiZWdpbm5pbmcgb2YgImVjaG8gQSIgZGVzcGl0ZSB0aGUgcGF1c2UuCit0ZXN0aW5nICJJbnZhbGlkIHVuaWNvZGUgY2hhcnMgZm9sbG93ZWQgYnkgYSBwYXVzZSBkbyBub3QgZWF0IG5leHQgY2hhcnMiIFwKKwkieyAkRUNITyAtbmUgJ2VjaG8gXHhmZlxuJzsgc2xlZXAgMTsgJEVDSE8gLW5lICdlY2hvIEEgfCBoZXhkdW1wIC1DID5hc2gub3V0cHV0OyBleGl0OyBleGl0OyBleGl0OyBleGl0XG4nOyB9IFwKKyAgICAgICAgIHwgc2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgNDEgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8QS58CiswMDAwMDAwMgorIiBcCisJIiIgIiIKKworcm0gYXNoLm91dHB1dAorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9hd2sudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYXdrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhZmU5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYXdrLnRlc3RzCkBAIC0wLDAgKzEsMjA1IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAwNyBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJhd2sgLUYgY2FzZSAwIiAiYXdrIC1GICdbI10nICd7IHByaW50IE5GIH0nIiAiIiAgICAiIiAiIgordGVzdGluZyAiYXdrIC1GIGNhc2UgMSIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjBcbiIgIiIgIlxuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgMiIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjJcbiIgIiIgIiNcbiIKK3Rlc3RpbmcgImF3ayAtRiBjYXNlIDMiICJhd2sgLUYgJ1sjXScgJ3sgcHJpbnQgTkYgfSciICIzXG4iICIiICIjYWJjI1xuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgNCIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjNcbiIgIiIgIiNhYmMjenpcbiIKK3Rlc3RpbmcgImF3ayAtRiBjYXNlIDUiICJhd2sgLUYgJ1sjXScgJ3sgcHJpbnQgTkYgfSciICI0XG4iICIiICIjYWJjIyN6elxuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgNiIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjRcbiIgIiIgInojYWJjIyN6elxuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgNyIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjVcbiIgIiIgInojI2FiYyMjenpcbiIKKworIyA0Mjk0OTY3Mjk1ID0gMHhmZmZmZmZmZgordGVzdGluZyAiYXdrIGJpdHdpc2Ugb3AiICAiYXdrICd7IHByaW50IG9yKDQyOTQ5NjcyOTUsMSkgfSciICI0LjI5NDk3ZSswOVxuIiAiIiAiXG4iCitvcHRpb25hbCBERVNLVE9QCit0ZXN0aW5nICJhd2sgaGV4IGNvbnN0IDEiICJhd2sgJ3sgcHJpbnQgb3IoMHhmZmZmZmZmZiwxKSB9JyIgIjQuMjk0OTdlKzA5XG4iICIiICJcbiIKK3Rlc3RpbmcgImF3ayBoZXggY29uc3QgMiIgImF3ayAneyBwcmludCBvcigweDgwMDAwMDAwLDEpIH0nIiAiMi4xNDc0OGUrMDlcbiIgIiIgIlxuIgordGVzdGluZyAiYXdrIG9jdCBjb25zdCIgICAiYXdrICd7IHByaW50IG9yKDAxMjM0LDEpIH0nIiAgICAgICI2NjlcbiIgICAgICAgICAiIiAiXG4iCitTS0lQPQorCisjIGNoZWNrIHRoYXQgImhleC9vY3QgaW50ZWdlciIgaGV1cmlzdGljIGRvZXNuJ3Qga2ljayBpbiBvbiAwME5OLk5OTgordGVzdGluZyAiYXdrIGZsb2F0aW5nIGNvbnN0IHdpdGggbGVhZGluZyB6ZXJvZXMiIFwKKwkiYXdrICd7IHByaW50ZiBcIiVmICVmXG5cIiwgXCIwMDAuMTIzXCIsIFwiMDA5LjEyM1wiIH0nIiBcCisJIjAuMTIzMDAwIDkuMTIzMDAwXG4iIFwKKwkiIiAiXG4iCisKKyMgbG9uZyBmaWVsZCBzZXBzIHJlcXVpcmluZyByZWdleAordGVzdGluZyAiYXdrIGxvbmcgZmllbGQgc2VwIiAiYXdrIC1GLS0gJ3sgcHJpbnQgTkYsIGxlbmd0aChcJE5GKSwgXCRORiB9JyIgXAorCSIyIDAgXG4zIDAgXG40IDAgXG41IDAgXG4iIFwKKwkiIiBcCisJImEtLVxuYS0tYi0tXG5hLS1iLS1jLS1cbmEtLWItLWMtLWQtLSIKKworIyAnQChzYW1wfGNvZGV8ZmlsZSlceycgaXMgYW4gaW52YWxpZCBleHRlbmRlZCByZWdleCAodW5tYXRjaGVkICd7JyksCisjIGJ1dCBnYXdrIDMuMS41IGRvZXMgbm90IGJhaWwgb3V0IG9uIGl0LgordGVzdGluZyAiYXdrIGdzdWIgZmFsbHMgYmFjayB0byBub24tZXh0ZW5kZWQtcmVnZXgiIFwKKwkiYXdrICdnc3ViKFwiQChzYW1wfGNvZGV8ZmlsZSlce1wiLFwiXCIpOyc7IGVjaG8gXCQ/IiAiMFxuIiAiIiAiSGlcbiIKKworb3B0aW9uYWwgVEFSIEJVTlpJUDIgRkVBVFVSRV9TRUFNTEVTU19CWjIKK3Rlc3QgeCIkU0tJUCIgIT0geCIxIiAmJiB0YXIgeGpmIGF3a190MS50YXIuYnoyCit0ZXN0aW5nICJhd2sgJ2djYyBidWlsZCBidWcnIiBcCisJImF3ayAtZiBhd2tfdDFfb3B0LWZ1bmN0aW9ucy5hd2sgLWYgYXdrX3QxX29wdGgtZ2VuLmF3ayA8YXdrX3QxX2lucHV0IHwgbWQ1c3VtIiBcCisJImY4NDJlMjU2NDYxYTVhYjFlYzYwYjU4ZDE2ZjExMTRmICAtXG4iIFwKKwkiIiAiIgorcm0gLXJmIGF3a190MV8qIDI+L2Rldi9udWxsCitTS0lQPQorCitRPSciOiInCisKK3Rlc3RpbmcgImF3ayBORiBpbiBCRUdJTiIgXAorCSJhd2sgJ0JFR0lOIHsgcHJpbnQgJHtRfSBORiAke1F9IFwkMCAke1F9IFwkMSAke1F9IFwkMiAke1F9IH0nIiBcCisJIjowOjo6OlxuIiBcCisJIiIgIiIKKworcHJnPScKK2Z1bmN0aW9uIGIodG1wKSB7CisJdG1wID0gMDsKKwlwcmludCAiIiB0bXA7ICN0aGlzIGxpbmUgY2F1c2VzIHRoZSBidWcKKwlyZXR1cm4gdG1wOworfQorZnVuY3Rpb24gYyh0bXBjKSB7CisJdG1wYyA9IGIoKTsgcmV0dXJuIHRtcGM7Cit9CitCRUdJTiB7CisJcHJpbnQgKGMoKSA/ICJzdHJpbmciIDogIm51bWJlciIpOworfScKK3Rlc3RpbmcgImF3ayBzdHJpbmcgY2FzdCAoYnVnIDcyNSkiIFwKKwkiYXdrICckcHJnJyIgXAorCSIwXG5udW1iZXJcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgImF3ayBoYW5kbGVzIHdoaXRlc3BhY2UgYmVmb3JlIGFycmF5IHN1YnNjcmlwdCIgXAorCSJhd2sgJ0JFR0lOIHsgYXJyIFszXSA9IDE7IHByaW50IGFyciBbM10gfSciICIxXG4iICIiICIiCisKKyMgR05VIGF3ayAzLjEuNSdzICJwcmludCBFUlJOTyIgcHJpbnRzICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiBpbnN0ZWFkIG9mICIyIiwKKyMgZG8gd2UgbmVlZCB0byBlbXVsYXRlIHRoYXQgYXMgd2VsbD8KK3Rlc3RpbmcgImF3ayBoYW5kbGVzIG5vbi1leGlzdGluZyBmaWxlIGNvcnJlY3RseSIgXAorCSJhd2sgJ0JFR0lOIHsgZ2V0bGluZSBsaW5lIDxcImRvZXNudF9leGlzdFwiOyBwcmludCBFUlJOTzsgRVJSTk89MDsgY2xvc2UoXCJkb2VzbnRfZXhpc3RcIik7IHByaW50IEVSUk5POyBwcmludCBcIk9rXCIgfSciIFwKKwkiMlxuMFxuT2tcbiIgIiIgIiIKKworcHJnPScKK0JFR0lOIHsKKyAgdVsiYSJdPTEKKyAgdVsiYiJdPTEKKyAgdVsiYyJdPTEKKyAgdlsiZCJdPTEKKyAgdlsiZSJdPTEKKyAgdlsiZiJdPTEKKyAgZm9yIChsIGluIHUpIHsKKyAgICBwcmludCAib3V0ZXIxIiwgbDsKKyAgICBmb3IgKGwgaW4gdikgeworICAgICAgcHJpbnQgIiBpbm5lciIsIGw7CisgICAgfQorICAgIHByaW50ICJvdXRlcjIiLCBsOworICB9CisgIHByaW50ICJlbmQiLCBsOworICBsPSJhIgorICBleGl0OworfScKK3Rlc3RpbmcgImF3ayBuZXN0ZWQgbG9vcHMgd2l0aCB0aGUgc2FtZSB2YXJpYWJsZSIgXAorCSJhd2sgJyRwcmcnIiBcCisJIlwKK291dGVyMSBhCisgaW5uZXIgZAorIGlubmVyIGUKKyBpbm5lciBmCitvdXRlcjIgZgorb3V0ZXIxIGIKKyBpbm5lciBkCisgaW5uZXIgZQorIGlubmVyIGYKK291dGVyMiBmCitvdXRlcjEgYworIGlubmVyIGQKKyBpbm5lciBlCisgaW5uZXIgZgorb3V0ZXIyIGYKK2VuZCBmCisiIFwKKwkiIiAiIgorCitwcmc9JworQkVHSU4geworICB1WyJhIl09MQorICB1WyJiIl09MQorICB1WyJjIl09MQorICB2WyJkIl09MQorICB2WyJlIl09MQorICB2WyJmIl09MQorICBmb3IgKGwgaW4gdSkgeworICAgIHByaW50ICJvdXRlcjEiLCBsOworICAgIGZvciAobCBpbiB2KSB7CisgICAgICBwcmludCAiIGlubmVyIiwgbDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwcmludCAib3V0ZXIyIiwgbDsKKyAgfQorICBwcmludCAiZW5kIiwgbDsKKyAgbD0iYSIKKyAgZXhpdDsKK30nCisjIEl0J3Mgbm90IGp1c3QgYnVnZ3ksIGl0IGVudGVycyBpbmZpbml0ZSBsb29wLiBUaHVzIGRpc2FibGVkCitmYWxzZSAmJiB0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgdGVzdGluZyAiYXdrIG5lc3RlZCBsb29wcyB3aXRoIHRoZSBzYW1lIHZhcmlhYmxlIGFuZCBicmVhayIgXAorCSJhd2sgJyRwcmcnIiBcCisJIlwKK291dGVyMSBhCisgaW5uZXIgZAorb3V0ZXIyIGQKK291dGVyMSBiCisgaW5uZXIgZAorb3V0ZXIyIGQKK291dGVyMSBjCisgaW5uZXIgZAorb3V0ZXIyIGQKK2VuZCBkCisiIFwKKwkiIiAiIgorCitwcmc9JworZnVuY3Rpb24gZigpIHsKKyAgZm9yIChsIGluIHYpIHsKKyAgICBwcmludCAiIGlubmVyIiwgbDsKKyAgICByZXR1cm47CisgIH0KK30KKworQkVHSU4geworICB1WyJhIl09MQorICB1WyJiIl09MQorICB1WyJjIl09MQorICB2WyJkIl09MQorICB2WyJlIl09MQorICB2WyJmIl09MQorICBmb3IgKGwgaW4gdSkgeworICAgIHByaW50ICJvdXRlcjEiLCBsOworICAgIGYoKTsKKyAgICBwcmludCAib3V0ZXIyIiwgbDsKKyAgfQorICBwcmludCAiZW5kIiwgbDsKKyAgbD0iYSIKKyAgZXhpdDsKK30nCisjIEl0J3Mgbm90IGp1c3QgYnVnZ3ksIGl0IGVudGVycyBpbmZpbml0ZSBsb29wLiBUaHVzIGRpc2FibGVkCitmYWxzZSAmJiB0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgdGVzdGluZyAiYXdrIG5lc3RlZCBsb29wcyB3aXRoIHRoZSBzYW1lIHZhcmlhYmxlIGFuZCByZXR1cm4iIFwKKwkiYXdrICckcHJnJyIgXAorCSJcCitvdXRlcjEgYQorIGlubmVyIGQKK291dGVyMiBkCitvdXRlcjEgYgorIGlubmVyIGQKK291dGVyMiBkCitvdXRlcjEgYworIGlubmVyIGQKK291dGVyMiBkCitlbmQgZAorIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYXdrX3QxLnRhci5iejIgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYXdrX3QxLnRhci5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiOGEwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9hd2tfdDEudGFyLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYmFzZW5hbWUvYmFzZW5hbWUtZG9lcy1ub3QtcmVtb3ZlLWlkZW50aWNhbC1leHRlbnNpb24gYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYmFzZW5hbWUvYmFzZW5hbWUtZG9lcy1ub3QtcmVtb3ZlLWlkZW50aWNhbC1leHRlbnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0OGZkZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS1kb2VzLW5vdC1yZW1vdmUtaWRlbnRpY2FsLWV4dGVuc2lvbgpAQCAtMCwwICsxIEBACit0ZXN0IHhmb28gPSB4YGJ1c3lib3ggYmFzZW5hbWUgZm9vIGZvb2AKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQwZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2Jhc2VuYW1lL2Jhc2VuYW1lLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoYmFzZW5hbWUgJChwd2QpKSA9IHgkKGJ1c3lib3ggYmFzZW5hbWUgJChwd2QpKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2J1bnppcDIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYnVuemlwMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mY2ZjZTFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2J1bnppcDIudGVzdHMKQEAgLTAsMCArMSw1NTcgQEAKKyMhL2Jpbi9zaAorIyBVc2VkIGJ5IGJvdGggZ3VuemlwIGFuZCBidW56aXAyIHRlc3RzCisKK0ZBSUxDT1VOVD0wCisKK2lmIHRlc3QgIiR7MCMjKi99IiA9ICJndW56aXAudGVzdHMiOyB0aGVuCisgICAgdW5wYWNrPWd1bnppcAorICAgIGV4dD1negorZWxpZiB0ZXN0ICIkezAjIyovfSIgPSAiYnVuemlwMi50ZXN0cyI7IHRoZW4KKyAgICB1bnBhY2s9YnVuemlwMgorICAgIGV4dD1iejIKK2Vsc2UKKyAgICBlY2hvICJXVEY/IGFyZ3YwPSckMCciCisgICAgZXhpdCAxCitmaQorCitiYj0iYnVzeWJveCAiCisKK3Vuc2V0IExDX0FMTAordW5zZXQgTENfTUVTU0FHRVMKK3Vuc2V0IExBTkcKK3Vuc2V0IExBTkdVQUdFCisKK2hlbGxvX2d6KCkgeworIyBHemlwcGVkICJIRUxMT1xuIgorI19fX19fX19fX19fX19fX19fX19fX19fX18gdnZ2IHZ2diB2dnYgdnZ2IC0gbXRpbWUKKyRFQ0hPIC1uZSAiXHgxZlx4OGJceDA4XHgwMFx4ODVceDFkXHhlZlx4NDVceDAyXHgwM1x4ZjNceDcwXHhmNVx4ZjFceGYxXHhlNyIKKyRFQ0hPIC1uZSAiXHgwMlx4MDBceDZlXHhkN1x4YWNceGZkXHgwNlx4MDBceDAwXHgwMCIKK30KKworaGVsbG9fYnoyKCkgeworIyBCemlwcGVkICJIRUxMT1xuIgorJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHg1Ylx4YjhceGU4XHhhM1x4MDBceDAwIgorJEVDSE8gLW5lICJceDAxXHg0NFx4MDBceDAwXHgxMFx4MDJceDQ0XHhhMFx4MDBceDMwXHhjZFx4MDBceGMzXHg0Nlx4MjlceDk3IgorJEVDSE8gLW5lICJceDE3XHg3Mlx4NDVceDM4XHg1MFx4OTBceDViXHhiOFx4ZThceGEzIgorfQorCisjIFdlIGhhZCBidW56aXAyIGVycm9yIG9uIHRoaXMgLmJ6MiBmaWxlIChmaXhlZCBpbiByZXYgMjI1MjEpCit0ZXN0MV9iejIoKQoreworJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHhiZlx4NGJceDk1XHhlN1x4MDBceDE1IgorJEVDSE8gLW5lICJceGExXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorJEVDSE8gLW5lICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGVmXHhmZlx4ZmZceGZiXHhmZlx4ZmZceGZmIgorJEVDSE8gLW5lICJceGZmXHhmZlx4ZmZceGUwXHgxNlx4ZTZceDM3XHhiN1x4NzdceGIwXHhmYlx4MjJceGI1XHg4MVx4NDBceGY1IgorJEVDSE8gLW5lICJceGE3XHg2OVx4YTRceDQ3XHhhYlx4NjFceDRkXHg2YVx4M2RceGVmXHg3NVx4N2JceDIyXHhhZlx4NzFceDliIgorJEVDSE8gLW5lICJceGIzXHg1YVx4OTNceGJiXHg3OFx4MDBceDc5XHhiZFx4YzBceDA3XHhhZVx4MWJceGRiXHhjNVx4YzZceDZiIgorJEVDSE8gLW5lICJceDdhXHg3Ylx4ZDNceGQ3XHgzOFx4YmJceDcwXHg1ZVx4ZjBceGQxXHgwOFx4OWFceDY0XHgyNlx4NTNceDY4IgorJEVDSE8gLW5lICJceDAzXHg1M1x4NGRceDMyXHgzMFx4ZDJceDYxXHgzMVx4MTNceDY4XHhkMVx4YTZceDRjXHg0MVx4ODlceDg0IgorJEVDSE8gLW5lICJceDMxXHg0Zlx4NDBceGQyXHg3OVx4MTRceGYwXHhhM1x4ZGFceDFhXHgwMFx4NjVceDRmXHg1M1x4ZDlceDI4IgorJEVDSE8gLW5lICJceGQzXHhmNFx4NGNceDEzXHgyNlx4NGNceDRjXHg2NFx4MzRceDlhXHg2YVx4N2FceDk5XHgzY1x4MTJceDc4IgorJEVDSE8gLW5lICJceGQyXHg2OFx4ZDRceGRhXHg2YVx4NzlceDMyXHg2NFx4ZDFceGE4XHgxYlx4MTNceDAxXHg0Zlx4MjlceGVhIgorJEVDSE8gLW5lICJceDZjXHhhM1x4ZDJceDA3XHg5NFx4MDZceGE2XHg0NFx4MDFceDRmXHgxMVx4YTNceDRkXHgxM1x4NGRceDMxIgorJEVDSE8gLW5lICJceDMyXHg0Y1x4OThceDBjXHg5YVx4YTZceGRhXHgyOVx4M2RceGE0XHhmMVx4MjRceGZkXHgxYVx4YTNceDdhIgorJEVDSE8gLW5lICJceDkzXHhmNFx4YTdceGI1XHgzZFx4NTFceGUyXHg0N1x4OTRceGYyXHg4Zlx4MjlceGIyXHg5Ylx4MjlceGU5IgorJEVDSE8gLW5lICJceDM0XHg3OVx4NGZceDQ2XHg5ZVx4ODRceDZhXHg2OVx4ZWFceDY5XHhhN1x4YTlceGI1XHgwM1x4MjdceGE4IgorJEVDSE8gLW5lICJceGYxXHg0MFx4MzJceDdhXHgxM1x4MTBceDAwXHgzZFx4NDFceDkwXHgwMFx4ZDBceDFlXHg4NFx4MGRceDFiIgorJEVDSE8gLW5lICJceDUzXHg0MVx4YTNceDIxXHg5M1x4ZDBceDgzXHg1M1x4MTBceDk5XHgzNFx4MjRceGY1XHgzMlx4OTlceDM0IgorJEVDSE8gLW5lICJceGQyXHg3YVx4ODZceGNhXHg2Y1x4MjhceGRhXHg2ZFx4MjlceGE2XHg0ZFx4MzFceDBjXHhkNFx4N2FceDY5IgorJEVDSE8gLW5lICJceDFlXHg5M1x4MjNceGNhXHgxZVx4OTNceDRkXHgwM1x4MjZceDlhXHg2OFx4MDFceGEwXHhjOVx4YTBceDFhIgorJEVDSE8gLW5lICJceDAwXHgzNFx4MDBceDAwXHg2OVx4YTBceGY0XHg4MFx4MGRceDAwXHgwMFx4MzRceDA2XHg4Nlx4ODBceDM0IgorJEVDSE8gLW5lICJceDAwXHgwMFx4MDBceDM0XHgwMFx4NDhceDg4XHg4NFx4NTNceDY4XHg0Zlx4NDVceDNkXHg1MVx4ZmFceDRkIgorJEVDSE8gLW5lICJceDRjXHhkYVx4OWFceDhkXHhiNVx4NGNceGQ0XHhmMlx4MzVceDFiXHg1MVx4YjRceGQzXHgxNFx4ZjVceDBmIgorJEVDSE8gLW5lICJceDUwXHhmNVx4MGZceDI0XHhkM1x4MzJceDIzXHhkNFx4Y2RceDIxXHhhNlx4ZDRceGQwXHhkMFx4NjlceGEwIgorJEVDSE8gLW5lICJceGY0XHg4ZFx4M2RceDQzXHhkM1x4NTFceGVhXHg2Y1x4OTBceGQwXHg2OFx4ZjRceDQwXHgwMFx4MDdceGE4IgorJEVDSE8gLW5lICJceDE5XHgzZFx4NDdceGE4XHgxZVx4YTBceGQwXHgzNFx4MDBceDBkXHgxYVx4MDZceDgwXHgwMVx4ZTlceDAwIgorJEVDSE8gLW5lICJceDY0XHgyMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorJEVDSE8gLW5lICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorJEVDSE8gLW5lICJceDAwXHgwMFx4NDhceDkyXHgxYVx4NDZceDlhXHgwMlx4OWVceDI0XHhjNVx4NGZceGM5XHg5MVx4NGZceDI5IgorJEVDSE8gLW5lICJceGVjXHhhOVx4ZWFceDM0XHhkM1x4ZDJceDY4XHg2OFx4MDBceGY0XHhkNFx4ZjVceDE5XHgwMFx4MzRceDAwIgorJEVDSE8gLW5lICJceDA2XHg0ZFx4MDBceGQwXHgxYVx4MWFceDAzXHgyMFx4MDFceGEwXHgwMFx4ZjVceDAwXHgwZFx4MDZceDliIgorJEVDSE8gLW5lICJceDUwXHgzNlx4YTNceDM1XHgwMFx4MDNceDQwXHgwM1x4NDBceDY4XHhmNVx4MzRceDAwXHgwMFx4MDBceDcxIgorJEVDSE8gLW5lICJceGU0XHgzY1x4MGNceDBmXHgwZlx4M2RceDIzXHg5YVx4N2ZceDMxXHg4MFx4YWVceDFhXHhlMVx4MDlceDAzIgorJEVDSE8gLW5lICJceDJjXHg2MVx4NjNceDE4XHhmY1x4MWFceDI4XHgwZVx4OWFceDg1XHhjM1x4ODZceDk2XHgxMVx4OTRceDg4IgorJEVDSE8gLW5lICJceDBmXHg5Mlx4MTFceDhhXHgxYVx4YjRceDYxXHg4Y1x4MzhceDMwXHhmM1x4YTlceGZiXHhiZVx4Y2RceDhkIgorJEVDSE8gLW5lICJceGM0XHhiN1x4N2FceDUyXHhhZFx4OTJceDlmXHhkZVx4ZTZceDc1XHg3NFx4YjdceGJiXHgwYlx4ZjVceDRjIgorJEVDSE8gLW5lICJceDk3XHhkOVx4NDlceGM4XHg2M1x4OWJceGE2XHhiYVx4OTVceGU4XHg0Nlx4NzBceDExXHg3MVx4NTVceDY3IgorJEVDSE8gLW5lICJceDE3XHhlM1x4YWJceDkxXHg3ZFx4YmVceDBkXHg1Nlx4NzhceDYxXHg5OFx4NDFceDI4XHgyY1x4YjVceGEzIgorJEVDSE8gLW5lICJceGQxXHhiOFx4NzZceDgwXHhjOFx4YWRceDliXHg3OVx4NmZceDhhXHg3YVx4ODRceDQ0XHgzNVx4MjRceDY0IgorJEVDSE8gLW5lICJceGEwXHhkZVx4MThceDgwXHgxMVx4MTRceGNkXHhiMFx4YzZceGU0XHgzMVx4NDlceDcxXHg1M1x4YWZceDVkIgorJEVDSE8gLW5lICJceDIwXHhjOVx4NTlceGRjXHhhMlx4NTNceDA2XHhmMFx4NGZceGM4XHgwOVx4MjFceDkyXHg2Ylx4ZjJceDM3IgorJEVDSE8gLW5lICJceDMyXHhjYlx4NzVceDkxXHg3NVx4NDFceGMwXHhlOFx4NDdceDAyXHhiM1x4OGVceDBiXHgxN1x4NDdceDQyIgorJEVDSE8gLW5lICJceDc5XHgyMVx4M2NceGVjXHg2Y1x4YjBceDg0XHgyNFx4OTZceDQ1XHg0YVx4OGVceGJiXHhiZVx4YzJceGUwIgorJEVDSE8gLW5lICJceDE2XHg4NVx4NzZceDQzXHgyNlx4ZDVceGQwXHg1OFx4ZGRceGY3XHg4M1x4NjVceDQ0XHg4Zlx4YmVceDZjIgorJEVDSE8gLW5lICJceDcyXHhlMVx4NWJceDFhXHgwZVx4M2FceGJiXHg1MVx4Y2ZceGJkXHg5Ylx4M2FceGQwXHhkNVx4MzlceDViIgorJEVDSE8gLW5lICJceDIzXHg3ZFx4YzlceDBiXHgwOFx4MGFceDIzXHg3Ylx4M2FceDAwXHg2N1x4YTFceDc2XHhhNVx4MTlceGFiIgorJEVDSE8gLW5lICJceDQ4XHhiZFx4NTRceGFhXHg4Zlx4YWZceGI2XHhlOFx4ZDVceDkxXHgwZlx4M2VceDRiXHgzYVx4OGRceGM5IgorJEVDSE8gLW5lICJceDQ4XHgwMlx4YzJceDZiXHhmY1x4ZWZceDBhXHg5Ylx4ZjFceDY3XHhkMFx4NDVceDQ4XHg0NVx4MDVceGMwIgorJEVDSE8gLW5lICJceDA3XHhjNFx4NDdceDk2XHg2ZVx4NzlceGFjXHgzMVx4NDlceGNmXHgxZlx4YThceDNiXHhkY1x4MWRceDQ0IgorJEVDSE8gLW5lICJceDgzXHg4NFx4MDRceDQ5XHg5Zlx4MjVceDAxXHg0Ylx4NDFceDgwXHgxNFx4MWJceDlkXHhhZlx4ZmNceGI1IgorJEVDSE8gLW5lICJceDQ2XHgyMlx4Y2FceDk2XHg0ZVx4ZDVceGUzXHgwOFx4N2RceGFiXHgxN1x4MGJceDY1XHhjZFx4YTdceGQ0IgorJEVDSE8gLW5lICJceDVlXHhkMVx4OGFceDI3XHhjOFx4NjBceGU5XHgxN1x4YTNceGM5XHhiNFx4MjZceGY4XHg1OFx4YjJceDRhIgorJEVDSE8gLW5lICJceDE1XHg1Mlx4OGVceDE1XHgyMFx4NzJceGIyXHgwZVx4NGZceDY0XHhjYlx4MmJceGEzXHhkOVx4ZjBceGE2IgorJEVDSE8gLW5lICJceDZmXHgwYlx4NTBceGVkXHg0ZVx4YTRceDI4XHhlOFx4ZTBceDA1XHgyZFx4MTVceDI2XHgyY1x4M2RceDlmIgorJEVDSE8gLW5lICJceDg3XHhjNFx4ZDFceGQzXHg2OVx4ZTJceDFjXHhlYVx4NDFceDk5XHhiZFx4NDNceDU5XHg5Zlx4MDZceDU3IgorJEVDSE8gLW5lICJceDA2XHhiNFx4NzJceGU3XHg0NVx4MmNceGQyXHhjZlx4NWZceDY2XHhhNVx4ZWJceDU4XHg2YVx4YzBceDM3IgorJEVDSE8gLW5lICJceDgyXHg4MVx4ZjZceGRjXHgxY1x4MzVceDViXHhjNlx4ZjFceDkyXHg0ZVx4ZTBceGUyXHhkMlx4MTJceDgyIgorJEVDSE8gLW5lICJceDkyXHg5N1x4MTRceGU1XHhhY1x4NDlceDlmXHhmZFx4MTZceDQ2XHhjNlx4YzJceGYxXHg0OFx4ODZceDA1IgorJEVDSE8gLW5lICJceGU2XHg3NFx4YWNceDlhXHg1Mlx4NDlceDY0XHg0NVx4MjVceDQzXHgwOFx4MDZceDAzXHg2M1x4NDlceDkxIgorJEVDSE8gLW5lICJceDlhXHg5Mlx4OTZceDViXHhlM1x4MmZceDExXHg1MVx4Y2RceGUzXHhhM1x4OWZceDNlXHg4Zlx4OWZceGFiIgorJEVDSE8gLW5lICJceDkyXHhiY1x4NmRceDM2XHhhM1x4ZDFceDcxXHhhNFx4NGFceGI2XHhlMVx4NDlceGI4XHhkY1x4MmNceDkwIgorJEVDSE8gLW5lICJceGIyXHhkNlx4ZmJceGE2XHhjNlx4ZDlceGE0XHg1Ylx4OWJceGU1XHhkNlx4NTlceGIzXHg3Nlx4MzdceGViIgorJEVDSE8gLW5lICJceGE2XHgzZVx4ZjBceDRjXHg5OFx4MWRceDczXHgwNFx4MDFceDA2XHg4Y1x4MTBceDAwXHgzYlx4MmJceDA0IgorJEVDSE8gLW5lICJceDU1XHhmNFx4ZmRceGVjXHg5ZFx4YWRceGM3XHgyYlx4YmRceGUzXHhkYVx4NGJceGVlXHgyOFx4NWRceDdhIgorJEVDSE8gLW5lICJceGJlXHhhNlx4YjlceGUwXHg4MVx4MTVceGE2XHgwOVx4MjZceDUyXHg2MFx4Y2NceDAzXHgzMFx4NjZceDYwIgorJEVDSE8gLW5lICJceGI5XHhkMFx4NzlceGZkXHhiNlx4YjNceDg1XHhhY1x4ZDFceGM0XHg0Y1x4YmZceDgwXHgyMFx4NDRceDQ1IgorJEVDSE8gLW5lICJceDdmXHg3Mlx4MjdceGZmXHgxNFx4YzJceGMwXHg4MVx4MDJceGFiXHgzMlx4MjBceDQzXHg0Nlx4MDZceDdmIgorJEVDSE8gLW5lICJceGI3XHhjMlx4YjlceGY2XHgzOVx4N2JceDBiXHgwY1x4Y2JceGU3XHg2ZVx4MDNceGUzXHgyMFx4NDZceDgyIgorJEVDSE8gLW5lICJceDRhXHgwMVx4MjNceGJiXHhiMFx4MGNceGI1XHg2Zlx4ZjdceGZiXHhmY1x4ZjVceGYyXHgzY1x4OGVceDdlIgorJEVDSE8gLW5lICJceGNiXHg3N1x4NmZceDdlXHhjM1x4NzFceDdjXHg0NFx4M2ZceGJjXHgzY1x4NTRceGI4XHg0MFx4MjdceDc4IgorJEVDSE8gLW5lICJceDYzXHg0ZFx4ODNceDIyXHg2YVx4MGFceDAwXHgwZVx4OGRceGE1XHhmYVx4NWVceGU1XHg4OVx4NTVceGE0IgorJEVDSE8gLW5lICJceDE4XHg2MFx4YzJceGE2XHhkNlx4MTdceDk4XHgyM1x4ZjBceDA3XHg0NFx4NDVceDE4XHhhNFx4NjhceGQ5IgorJEVDSE8gLW5lICJceGNjXHgwZFx4ZTNceDgxXHgwNlx4MDlceDBjXHgxN1x4YWZceDUyXHhhZFx4ODVceDgzXHg1ZFx4MDlceDMwIgorJEVDSE8gLW5lICJceDBkXHhhOVx4YjNceGU2XHg0NVx4ODVceDllXHgyNlx4NDdceGFiXHg3ZFx4MTRceGUxXHg4YVx4YjlceGZlIgorJEVDSE8gLW5lICJceDBhXHgwZlx4OGRceDY4XHg3M1x4NzNceDVjXHhhM1x4MGJceGI1XHgyOVx4MGNceGQ4XHhkZVx4YzJceDMwIgorJEVDSE8gLW5lICJceGJlXHg2MVx4Y2VceGJkXHg0ZFx4M2FceDAzXHhlZlx4ZTlceDQ1XHhlZlx4ZWJceDA3XHhlOFx4NmJceDdkIgorJEVDSE8gLW5lICJceGQyXHhmNFx4OTJceDhmXHg5MVx4YTFceDZlXHg4NVx4MmJceDczXHhhZlx4MDFceDhhXHhkMlx4MGZceDUyIgorJEVDSE8gLW5lICJceGVkXHg2NVx4OWZceGU2XHgxNVx4NDdceGIyXHg3MVx4ZDNceGJjXHhlZVx4ZGVceGZmXHgxMFx4ZmFceDRkIgorJEVDSE8gLW5lICJceDdmXHg5ZFx4NWFceDRiXHgxM1x4NGFceDkyXHhkNlx4ODVceGIyXHhlZlx4ZTFceGJiXHg5Mlx4ODBceDRhIgorJEVDSE8gLW5lICJceDQ1XHg3MFx4YTBceDRlXHhlNlx4ZjNceDM5XHg5YVx4ZjZceDU1XHhlZVx4ODBceGM1XHhhMFx4ZmZceDlkIgorJEVDSE8gLW5lICJceGI2XHg2Nlx4ZTZceGNjXHg4MVx4YjJceGRjXHhkNlx4MzlceGI3XHgwNlx4MmNceGQ2XHgzYlx4MjdceDBlIgorJEVDSE8gLW5lICJceDVkXHgwMVx4OTJceDVjXHhmM1x4YmVceDNkXHg0Nlx4OGFceDQ2XHhhNFx4ZDRceDAzXHgyMVx4ODZceDhlIgorJEVDSE8gLW5lICJceDY4XHgwNVx4M2JceGYwXHg2Nlx4NjlceDRjXHg2MVx4ZjBceDM5XHgxY1x4OWRceGUyXHg3NFx4M2JceDVmIgorJEVDSE8gLW5lICJceGQ3XHg4N1x4ZGNceGQzXHhlYlx4NTlceDUwXHhiNlx4NmRceDc1XHhjOVx4NWJceGRjXHg0ZFx4YjdceDI5IgorJEVDSE8gLW5lICJceDBjXHg2NFx4OWNceDVjXHgyMlx4ZDFceDQ0XHhkN1x4MDFceDY4XHgwYVx4MjZceDI1XHg3ZFx4NmFceDc2IgorJEVDSE8gLW5lICJceDFjXHgxYlx4YmZceDdhXHhhNVx4ZWJceDQyXHg4Zlx4MmZceDkzXHhhM1x4YzFceGNhXHhlM1x4OWZceDQ2IgorJEVDSE8gLW5lICJceGZkXHg3N1x4MDdceDI3XHgyZFx4YWZceGJiXHgxYVx4MTNceDViXHg4Nlx4OTRceDAwXHg5MFx4ODZceGMxIgorJEVDSE8gLW5lICJceDI0XHg4ZFx4ODZceDIyXHg1Nlx4YmVceDA2XHhlMVx4YTFceDQ0XHg0Y1x4MzZceGUyXHgyMlx4MDhceDIxIgorJEVDSE8gLW5lICJceGIyXHgyMFx4NmRceGI2XHhkYlx4NmNceDZlXHgyNlx4MjZceDA2XHhjMFx4MjZceDA5XHg5NFx4MDlceDc1IgorJEVDSE8gLW5lICJceDJjXHgxMFx4NGJceDQ0XHhiMFx4MWJceDQ0XHgyNlx4MTFceDU4XHgxMFx4ZGZceDJjXHhjMVx4NTVceDhhIgorJEVDSE8gLW5lICJceGFkXHhiMlx4YTNceDA4XHg2N1x4MzRceGU1XHg4M1x4OTVceDBhXHgwOFx4ODJceGMxXHg4YVx4MDZceGRkIgorJEVDSE8gLW5lICJceGIxXHgzMlx4MTRceGE1XHgyN1x4NzhceGNhXHhiNlx4ZDFceDU3XHg1YVx4YzlceDJhXHgwNlx4MDVceDI5IgorJEVDSE8gLW5lICJceDBjXHg4OFx4MjhceGQyXHg4Nlx4YTVceGE5XHg2OVx4NTFceDgxXHg0Nlx4YTFceGE0XHg4MVx4YjFceDhkIgorJEVDSE8gLW5lICJceGIxXHhiMFx4MDFceDgzXHg0OVx4NGJceDE1XHgxYVx4NmVceDEzXHgyNFx4NjhceDU0XHg2MFx4NGJceDRlIgorJEVDSE8gLW5lICJceDIxXHgzOVx4ODJceDFjXHg4ZFx4MDJceDZkXHgyM1x4YzNceDMwXHgyNVx4ODNceDY5XHgwNVx4MTFceDA1IgorJEVDSE8gLW5lICJceDRkXHgyNFx4MDRceDRlXHgwY1x4NTNceDgxXHgyNVx4Y2VceDM0XHgxMFx4ZDBceDA0XHhkNFx4OThceGExIgorJEVDSE8gLW5lICJceDIxXHgwYlx4N2VceGM0XHgwOVx4MTFceDMwXHg4Mlx4OGZceDY4XHhjNFx4MTNceDQ4XHgwYVx4MzBceDE3IgorJEVDSE8gLW5lICJceDRmXHhhZlx4ODBceDUyXHhkMFx4MzZceDIyXHhkNlx4NDNceDQ4XHgxNVx4ZjZceGExXHg4Mlx4ODRceGRjIgorJEVDSE8gLW5lICJceDQ0XHgzNFx4MDdceDUyXHhjNFx4MmNceDU2XHhiN1x4YWZceGE4XHgzYlx4YjFceDA4XHg0Ylx4NmJceDZjIgorJEVDSE8gLW5lICJceDI0XHgwNVx4Y2VceDFhXHgxMFx4ZTJceDAyXHgzMVx4MjJceDI1XHhiOFx4MjNceDY1XHhkMFx4NTJceDliIgorJEVDSE8gLW5lICJceDRhXHhjYlx4NjRceGFlXHhiZFx4ZThceGRhXHgzMFx4YjRceDI1XHg3OVx4YTRceGJjXHhlNlx4ZTBceGYzIgorJEVDSE8gLW5lICJceGRlXHg4Mlx4MjNceDg0XHhjZVx4ZTVceGI5XHhjOVx4ZTlceGViXHg2OVx4NzhceDJmXHhiY1x4NzZceDZkIgorJEVDSE8gLW5lICJceDU4XHg4Nlx4YzRceGE1XHg4Mlx4ZmFceGFkXHg2MVx4NzVceDYyXHgwY1x4YjZceDliXHgwMFx4ZGZceDMwIgorJEVDSE8gLW5lICJceDRhXHhkNlx4ODNceGFhXHg2MFx4OGFceDMzXHg3Y1x4ZDJceDEyXHhmNVx4NmNceDQ4XHg1Mlx4YzVceDg1IgorJEVDSE8gLW5lICJceGUyXHg2Zlx4MzdceDczXHhjN1x4YmNceGFkXHhlYVx4MjdceDI3XHhhOFx4ZWZceGY3XHhlZlx4NTlceDE3IgorJEVDSE8gLW5lICJceDY1XHhiNlx4ZTFceGQ4XHhkZFx4YjVceDkzXHg0Mlx4ZDBceDI5XHg1YVx4MThceDc2XHgwOFx4ZGJceGU1IgorJEVDSE8gLW5lICJceDM4XHhmOVx4YThceGU0XHhhMVx4YTJceGQ0XHg0MFx4YTBceGZkXHg0NVx4MThceDRiXHgzY1x4YTZceDg1IgorJEVDSE8gLW5lICJceDAyXHg5NFx4OGNceDg4XHhhOVx4NzFceDg3XHg0MFx4OTZceDRkXHgyM1x4MjZceGY0XHgxN1x4NDRceGI4IgorJEVDSE8gLW5lICJceDc4XHgxZVx4NzFceGUzXHgzYlx4ZWVceGM2XHg0Ylx4ODdceDg4XHhmZFx4MmJceGI1XHg4Ylx4MWJceDUzIgorJEVDSE8gLW5lICJceDBiXHhhYlx4ZDZceDQ3XHgyM1x4YTdceGNmXHg3OFx4M2FceDI1XHhkN1x4M2NceDc3XHhiM1x4OGVceDAwIgorJEVDSE8gLW5lICJceDM3XHg4M1x4MTFceGJiXHg2OFx4ZjVceGVkXHgwYVx4MWFceDRkXHhhM1x4OTBceDY4XHhlYVx4ZWRceDQ5IgorJEVDSE8gLW5lICJceDhkXHhiNlx4ODBceDY5XHg4M1x4NjdceGNmXHg2NVx4NWFceGVjXHhkYVx4MTJceGU2XHg1YVx4NDdceDVhIgorJEVDSE8gLW5lICJceDNjXHg2M1x4NTBceDQxXHg3M1x4NDBceDgzXHhjN1x4NjlceGJjXHg0Nlx4YTdceGIxXHhlZFx4NzlceDNjIgorJEVDSE8gLW5lICJceGZlXHhkZlx4MjdceDRiXHhiZVx4ZWJceDY4XHhlY1x4ODNceDAwXHg2Ylx4N2JceDA4XHg0YVx4NmVceDBjIgorJEVDSE8gLW5lICJceDJkXHgxNlx4YmFceDFhXHg5Nlx4YTFceDAzXHhjM1x4NjNceDllXHg3YVx4Y2VceDhiXHhlMlx4YWVceDUxIgorJEVDSE8gLW5lICJceGZiXHg3ZFx4ZWRceDVkXHhmYlx4YmNceGVkXHgwNFx4NmZceDFmXHgyMVx4ZmNceDY5XHgzY1x4YjFceGFhIgorJEVDSE8gLW5lICJceGRmXHhiZlx4YTBceGFiXHhjM1x4Y2NceDZhXHhiZlx4ZTdceDk2XHhiZVx4MzZceGIzXHgyM1x4MzJceDFjIgorJEVDSE8gLW5lICJceGI1XHgxOFx4NDRceDU0XHg1MVx4ODFceGI0XHg2M1x4YzdceDk5XHg4NFx4MDZceGNiXHhhZlx4NWJceDA1IgorJEVDSE8gLW5lICJceDRmXHg4Mlx4ZjVceDkzXHhiNFx4YzNceGNmXHhkYlx4NjVceGI4XHg4ZFx4YWVceGExXHhjMlx4ZjBceGRmIgorJEVDSE8gLW5lICJceGE3XHhlNVx4ZjNceDM3XHhkMlx4NTdceDczXHgwZFx4ODlceGI4XHgyMVx4MTBceDlhXHg0M1x4ZTlceGUwIgorJEVDSE8gLW5lICJceDA5XHgxYVx4NDBceDQ5XHhhMFx4Y2NceDAzXHgzMFx4NDZceDY2XHg2Nlx4MGNceDEyXHg0OFx4ODlceGZmIgorJEVDSE8gLW5lICJceDU3XHhlOFx4ZDJceDdjXHgzZVx4OGRceDllXHg0Nlx4N2ZceDk3XHhmY1x4M2JceDEyXHg5NVx4ZDJceGRmIgorJEVDSE8gLW5lICJceDJmXHhiMVx4YzhceDdkXHg2MVx4ZGJceGIyXHg4YVx4ZGRceGJmXHhmM1x4N2VceDA4XHhjY1x4YWRceDE2IgorJEVDSE8gLW5lICJceGJlXHg0NVx4MTNceGYyXHg3Zlx4MTRceDVhXHg3OVx4MmVceGI1XHhiYlx4NzhceDBjXHgyMlx4YzZceDEwIgorJEVDSE8gLW5lICJceDMxXHhjZVx4OWNceDZiXHgxZFx4NDhceDExXHgxNlx4NGNceGRmXHg5OFx4MTJceGYzXHg0MVx4MDVceDgxIgorJEVDSE8gLW5lICJceGQzXHgyNFx4OTRceDkyXHgzN1x4NTFceDVkXHhkY1x4NTFceDA4XHhkM1x4NzNceGJhXHg4OVx4NDJceDNmIgorJEVDSE8gLW5lICJceGNiXHg1Y1x4NGNceGIyXHgxNlx4Y2JceDA0XHhjZFx4ODZceGIyXHgwNVx4OGFceGMzXHg1Nlx4YzhceDgzIgorJEVDSE8gLW5lICJceDBiXHgyZVx4OTBceDMxXHg4Nlx4NWNceDY4XHhiOVx4OGRceGJjXHhiZlx4ZjJceGUyXHhkMlx4YjBceDBiIgorJEVDSE8gLW5lICJceDc2XHgyYlx4M2RceDc5XHhiYVx4M2ZceDliXHhlM1x4OGVceGM0XHhmNVx4ZWRceGUwXHhmN1x4ZGRceGRiIgorJEVDSE8gLW5lICJceDk3XHg1Zlx4OWFceGIzXHhmY1x4NTBceGJmXHg4OVx4ZjRceDdhXHgzOFx4YTNceDQ0XHgwY1x4NTBceDVkIgorJEVDSE8gLW5lICJceDdjXHhiYlx4NjVceDQ3XHhmMVx4MzNceGQ2XHg2N1x4YTRceGUwXHhmMFx4NjhceDU4XHhlOVx4NmNceDQwIgorJEVDSE8gLW5lICJceDAyXHg2Ylx4MDFceDIwXHg0MFx4ODRceDg5XHg4MFx4MDhceGNjXHg1Mlx4YTBceDIwXHg4MVx4OThceDE2IgorJEVDSE8gLW5lICJceGExXHg5MFx4ZjhceGNkXHhiZVx4MWVceGM3XHg2Ylx4MWRceGI1XHg4MVx4NmJceDA0XHhkYlx4NGNceDQzIgorJEVDSE8gLW5lICJceDFhXHhiY1x4ZDRceDBkXHhiNlx4MGRceGIzXHg4Mlx4YzhceGM3XHhmMFx4MTNceGE4XHhjNVx4MjBceGQ1IgorJEVDSE8gLW5lICJceGJkXHhiNFx4YzBceDVhXHhkZFx4ZThceGQxXHgzMVx4NGZceGFkXHg4OFx4NjNceDMwXHg0NFx4MGRceGQ1IgorJEVDSE8gLW5lICJceGM2XHg1Nlx4OTZceDI4XHhlMlx4ZThceGE4XHhhOVx4MTBceGRiXHgxYVx4YTNceDIxXHhhNlx4YzVceGU2IgorJEVDSE8gLW5lICJceGY1XHhiMlx4YTRceDZkXHg4ZFx4YjRceDMxXHhiNVx4YzNceGVjXHgzZVx4OGZceGQwXHhlYlx4MzVceGNlIgorJEVDSE8gLW5lICJceGRiXHgwMlx4OWNceDRlXHg5Nlx4Y2RceDQwXHgxNFx4Y2RceDk3XHhiOVx4MGFceGUzXHgwOVx4ZjVceDQ5IgorJEVDSE8gLW5lICJceGZlXHgxZVx4YzdceGM1XHg1N1x4YjlceDk2XHhlOVx4ZjVceDhhXHg1Nlx4ZGZceDYzXHhkYVx4OGFceGVhIgorJEVDSE8gLW5lICJceDQxXHg5N1x4NzRceDdiXHhhNlx4NTdceDk5XHg4ZFx4YjBceDc4XHg2MFx4ZTRceDA0XHhkN1x4ZTRceGJmIgorJEVDSE8gLW5lICJceDg5XHg3MVx4YTVceGM4XHg5M1x4NDJceDAyXHg1M1x4N2FceDZhXHg5ZFx4OTlceGM5XHhkM1x4MmJceDg3IgorJEVDSE8gLW5lICJceDc1XHhiMlx4OGZceDE5XHg4Nlx4MjhceDJiXHhjM1x4MmJceDY3XHg5NVx4NzJceGZiXHgxM1x4MzlceGI1IgorJEVDSE8gLW5lICJceGNhXHg4Y1x4NDNceDg4XHgxY1x4ZGNceDQ3XHhiNlx4ZGJceDA1XHhhZlx4OGVceDMxXHg1NFx4YjhceGJkIgorJEVDSE8gLW5lICJceDk4XHg4Ylx4MWRceDFmXHgxN1x4ODdceDlkXHg2ZFx4MDVceGNhXHhhOFx4OTBceDQ5XHgxMFx4YmJceDY3IgorJEVDSE8gLW5lICJceDJmXHg5Mlx4NjFceDQzXHhmZVx4ZTJceGQ2XHgxOFx4NmRceDJhXHhjMFx4MTRceDk2XHg5YVx4MmFceDY1IgorJEVDSE8gLW5lICJceDQ4XHgwNFx4YzdceDJkXHg3Nlx4YTZceDFmXHhjNVx4NzlceDM2XHgyOFx4NjlceDZmXHgwOVx4YjZceDkwIgorJEVDSE8gLW5lICJceGMzXHg1NVx4NmRceDk4XHhmMFx4YmRceGNlXHhiMVx4MzdceGY0XHhjNFx4OTBceDFjXHhkZlx4NWFceDI3IgorJEVDSE8gLW5lICJceGJjXHgyNFx4MzhceDUyXHg3NVx4YzBceGVlXHhjOVx4MDVceDVhXHhkN1x4MmJceDYxXHhmZFx4YmFceGZiIgorJEVDSE8gLW5lICJceGVhXHg5Zlx4NjVceDM5XHg5Zlx4ZTdceGM5XHhjM1x4MGVceGE5XHgzYVx4MjBceDUwXHg4N1x4YjZceDA4IgorJEVDSE8gLW5lICJceGM3XHg4MFx4OTJceGUyXHg2MFx4MjFceGQyXHgyZFx4NTFceDEyXHhmOFx4NDZceDYwXHhiZFx4ZjRceDY1IgorJEVDSE8gLW5lICJceGQ1XHg3Ylx4MWFceGE3XHg3OVx4YjdceDczXHg3OVx4ZTlceDBkXHg2MFx4MzRceGMzXHhiMFx4NThceGM4IgorJEVDSE8gLW5lICJceGNjXHg0Mlx4N2JceGIwXHg1Nlx4OGNceGRlXHg2Nlx4NzJceDIzXHhjMlx4NTlceGU2XHg5Zlx4ODNceDZhIgorJEVDSE8gLW5lICJceGVmXHg0YVx4OWVceDFlXHhmM1x4ZDVceGRlXHg1Mlx4MzJceDE0XHg4YVx4MmRceDBiXHhmMFx4MWVceDViIgorJEVDSE8gLW5lICJceDdjXHg0YVx4MzRceDRkXHg3Mlx4NGZceDFkXHg4Zlx4OTdceGU4XHhjOVx4Y2RceGUyXHhiOVx4MDNceDM2IgorJEVDSE8gLW5lICJceDlmXHg4OVx4OTdceGMzXHgxOVx4OGRceDhkXHg4NFx4NDFceDBjXHgwM1x4MzRceDE4XHg0MVx4MjBceDEwIgorJEVDSE8gLW5lICJceDI2XHg0Y1x4MTBceDE4XHg1MFx4NWVceGQ3XHg5M1x4MWZceDMxXHhmN1x4NTRceGIzXHg0M1x4NGRceGQ3IgorJEVDSE8gLW5lICJceDQ4XHg2OVx4Y2ZceDdkXHgyOVx4MmZceDdmXHg4Zlx4MTFceGYyXHg0Y1x4M2ZceGNkXHhlN1x4YTJceGUxIgorJEVDSE8gLW5lICJceDA5XHg5YVx4MWFceDZjXHhjNlx4ZjNceGNmXHgzM1x4ZTVceGI1XHg4Zlx4NmVceDQxXHhmMVx4ODBceDA3IgorJEVDSE8gLW5lICJceDRkXHg3Zlx4YmVceDFiXHgzN1x4ZGRceGUzXHg2NFx4YjhceGEyXHg1OVx4OTBceDJjXHhhMlx4YmVceGY0IgorJEVDSE8gLW5lICJceDgyXHgyYVx4ODBceDQ2XHg0ZFx4MWFceDhjXHg4OFx4NWFceDE4XHgzMFx4NjRceDBhXHg1YVx4NTdceDM3IgorJEVDSE8gLW5lICJceDYzXHhlOVx4NmRceDhhXHg2ZFx4NWZceDg4XHg1ZVx4NmRceDQxXHgzM1x4NjBceGZkXHg0NVx4OTBceDdlIgorJEVDSE8gLW5lICJceDE1XHhhYVx4OTVceDZmXHhiZFx4ZmNceGU5XHgwYlx4MzRceGU0XHgzYlx4YThceDQxXHg3OFx4MWNceDU1IgorJEVDSE8gLW5lICJceDYyXHg1ZFx4YjJceDE5XHhkZFx4ZWJceDY5XHhlYlx4ZWZceGUxXHhiZlx4N2JceGViXHg2Mlx4MjNceDhhIgorJEVDSE8gLW5lICJceDYxXHgxNFx4OWZceDIyXHg1M1x4MDhceDZhXHgzMVx4YmFceDMwXHgyNFx4MWVceDU0XHg4M1x4YWVceGJkIgorJEVDSE8gLW5lICJceDg3XHhhMVx4NzFceGYwXHgzY1x4N2RceDk0XHhhMVx4MmNceGVhXHhmZlx4ODRceDc2XHg3N1x4ZDJceGM5IgorJEVDSE8gLW5lICJceDlmXHgyZlx4OWNceGM3XHg4M1x4M2ZceDg5XHg1ZFx4MWJceDVjXHhjM1x4MGZceGZhXHhkMlx4OTNceDMyIgorJEVDSE8gLW5lICJceGZjXHhlZFx4YTZceDI2XHg4Nlx4OThceDFiXHgwNVx4MTBceDIwXHgyN1x4NGNceDk1XHgzZlx4NmRceDk0IgorJEVDSE8gLW5lICJceDgyXHg1YVx4YThceDY4XHg3Mlx4YWVceGQ3XHhhZVx4ZGJceGFmXHgyNlx4YjZceDVhXHg4OVx4MzBceGU3IgorJEVDSE8gLW5lICJceGQwXHg1YVx4N2NceGM2XHg2Nlx4ZmFceGMzXHg4NVx4N2RceDI2XHhlZVx4YjNceDM0XHhjMlx4YWNceDcwIgorJEVDSE8gLW5lICJceDg4XHgwM1x4MTVceGM2XHhlZVx4NTVceDQ1XHhkZVx4MWNceDEwXHgwMVx4ZTZceDNiXHgzNlx4MjZceDExIgorJEVDSE8gLW5lICJceGJlXHhlY1x4NTRceGVhXHhkOFx4MjBceDFkXHgzNVx4MDBceGQxXHg4Y1x4MDBceGU4XHhmNVx4MjFceDk3IgorJEVDSE8gLW5lICJceDI2XHgwNlx4NjlceDg3XHg1NVx4YTNceGM4XHhmNlx4NThceGNjXHg2MFx4MTJceDMwXHgwYlx4OGFceDUwIgorJEVDSE8gLW5lICJceDAxXHg1N1x4MzBceGRjXHg5YVx4MDFceGQ0XHhhNFx4Y2RceGQ2XHg2OVx4MjNceDBmXHhjM1x4YjhceDg1IgorJEVDSE8gLW5lICJceDEyXHhiYlx4OGVceGRmXHhjNVx4ZjFceGYzXHg3Y1x4YzlceDdhXHgyNFx4MjVceDA3XHg5Y1x4ODZceDk3IgorJEVDSE8gLW5lICJceDY4XHhiNVx4YWRceDBiXHhiYVx4MmVceGU4XHg2Zlx4N2ZceGExXHhlZFx4NGZceDBjXHgzNFx4N2JceGM4IgorJEVDSE8gLW5lICJceDg0XHgxMFx4MDhceDJhXHhjY1x4MTlceDU5XHhiZFx4YmNceGU0XHgzZFx4YThceGQ5XHgzNVx4YWZceDhiIgorJEVDSE8gLW5lICJceGE3XHgwYVx4YWRceDQyXHhlOFx4MDJceDkwXHhlNlx4OGVceDc2XHg1ZFx4MGZceDNiXHg4N1x4YjhceGU0IgorJEVDSE8gLW5lICJceDY1XHg0ZVx4NWZceDBkXHhlOFx4MjZceGFmXHgyYVx4OTRceDlhXHgyZVx4MjFceDlhXHgxOVx4YjlceGEwIgorJEVDSE8gLW5lICJceDhkXHgyNlx4NzhceGExXHg0Ylx4NmVceGY2XHhkN1x4MjlceDY2XHhkYlx4NDlceDA5XHhhMFx4Y2FceDRkIgorJEVDSE8gLW5lICJceDMyXHhiMFx4MzFceGY1XHg3M1x4ZTFceDY3XHhjZVx4ZTBceDVhXHg3OVx4ODRceGE0XHgyMlx4ZDRceGM5IgorJEVDSE8gLW5lICJceDQzXHg1OVx4MDhceGE4XHhkNVx4NWVceDhjXHg3Mlx4NjFceDcwXHg5YVx4YTZceDQyXHhjMFx4NDJceDIyIgorJEVDSE8gLW5lICJceDJkXHhkMFx4YmVceGIxXHg0OVx4NmVceDM2XHhiYlx4OGRceDhmXHgwM1x4OWJceGI0XHhkYlx4NWFceDc3IgorJEVDSE8gLW5lICJceDNlXHgyOVx4OTFceGM2XHg3M1x4ODhceGVmXHg4Y1x4ZjdceGRlXHhlMlx4MmJceGMyXHhjZVx4Y2RceDhjIgorJEVDSE8gLW5lICJceDkyXHg2MFx4OTZceDI5XHg4OVx4OTlceDYyXHg5OVx4ODFceDM2XHg5Ylx4NTBceGM4XHg3MFx4ZDZceDhkIgorJEVDSE8gLW5lICJceGFmXHg2Ylx4MzBceGJhXHhjN1x4N2FceGNhXHg0Y1x4NTZceDY2XHg2Nlx4MmRceGM3XHhhNVx4ZjdceDYzIgorJEVDSE8gLW5lICJceGE0XHg1NVx4OGRceGQ0XHg5Mlx4ZGJceDJiXHg2Ylx4YjFceGExXHg5Nlx4OTlceGQ5XHgyNVx4ZGJceDE0IgorJEVDSE8gLW5lICJceDFjXHg0OVx4MDRceDY3XHgyNVx4NDVceDBhXHg1MFx4MWRceDIwXHhkOFx4OGRceGNmXHhlN1x4MDNceDIwIgorJEVDSE8gLW5lICJceGYwXHhkN1x4YzBceGNjXHg4NFx4MjBceDY4XHg0YVx4NjNceDQxXHhhNFx4NmNceDMyXHgwOFx4YTJceDM3IgorJEVDSE8gLW5lICJceDAzXHg2Ylx4NDJceDEyXHhiZVx4YTlceDRlXHg5Ylx4OTdceDE2XHg5Mlx4NDhceDU2XHgzMlx4YWVceDJjIgorJEVDSE8gLW5lICJceDEwXHhjNlx4MzFceDE0XHg4Y1x4Y2NceGQ2XHgyM1x4MDlceGY0XHg2NFx4MTVceDllXHhmMVx4MzVceDc1IgorJEVDSE8gLW5lICJceDk4XHgzYVx4MGNceDEyXHgyOVx4YWFceGI3XHgyYlx4ODJceGUwXHhmOVx4Y2RceDA1XHhlZFx4YjhceGJlIgorJEVDSE8gLW5lICJceGI2XHhmNVx4NmZceGNjXHg0MVx4YmNceDNhXHg4MVx4MzlceDNiXHgwM1x4ZThceGIyXHhhYlx4YjZceGFhIgorJEVDSE8gLW5lICJceGVkXHhhOFx4NThceGRmXHhjYVx4MDZceGJhXHg2NFx4N2JceGM0XHhlZlx4ZWNceDIzXHgzOFx4NzdceGVjIgorJEVDSE8gLW5lICJceGNmXHhkN1x4ZDJceGViXHg3NVx4M2RceDI2XHhlMlx4ZmFceDY2XHg0OVx4MGJceDRhXHhkY1x4ZTNceDQ4IgorJEVDSE8gLW5lICJceDY0XHgzM1x4YzRceGIzXHg5M1x4ZGFceGRkXHgzY1x4MDhceDgzXHg3ZFx4OTFceDc4XHhlNVx4NjFceDU3IgorJEVDSE8gLW5lICJceDY3XHgzN1x4NzNceGUxXHgwNVx4YmJceDk2XHgzZVx4MjZceGM3XHg2Y1x4NDRceGI1XHhmYlx4ODBceGIyIgorJEVDSE8gLW5lICJceGQ5XHhhMFx4OTlceDZiXHhiZlx4NzRceDYyXHhiN1x4ZjdceDE0XHhlY1x4MDdceDEyXHhmY1x4ZTZceDFiIgorJEVDSE8gLW5lICJceGYxXHgxZFx4MjRceGZlXHhkMFx4YjlceDYxXHg3Nlx4NTZceGEwXHhhNVx4OGNceDYzXHhjZVx4OTZceDVkIgorJEVDSE8gLW5lICJceDY1XHg0Zlx4YWVceGNjXHg3ZFx4ODZceDJkXHhkN1x4NzRceDk2XHg2N1x4YjdceDVjXHg5NFx4YTZceDMwIgorJEVDSE8gLW5lICJceGJkXHhiM1x4ODRceDU2XHg5M1x4MWVceDQ0XHhjNVx4NDNceDVmXHg2NVx4OWRceDFhXHg5Mlx4YjFceDlhIgorJEVDSE8gLW5lICJceDRjXHg0Nlx4MWZceGQyXHg2NFx4NTRceGI2XHg0ZVx4N2VceGIyXHg3MVx4NzVceGY2XHhjZVx4YWNceGRjIgorJEVDSE8gLW5lICJceDVhXHhhMVx4ZDRceGYxXHhmNVx4NzFceDZhXHg5M1x4NTBceGQyXHg4Ylx4YjJceGIxXHg3Zlx4YWZceDIwIgorJEVDSE8gLW5lICJceGQyXHhjOVx4Y2VceGViXHhmYlx4MWRceDRhXHhmZlx4MjZceDg5XHhhMlx4NjBceGVkXHg4YVx4ZWJceGE3IgorJEVDSE8gLW5lICJceDZlXHg5Mlx4ZWFceGI3XHhlZlx4N2FceGNjXHhkOVx4NGJceGJiXHgzZVx4YWRceGM2XHg3YVx4ZmFceGJiIgorJEVDSE8gLW5lICJceGUwXHgyNVx4MGNceDBmXHhlMlx4MTRceGY5XHgyZVx4MGJceDVmXHhkNFx4YmRceDhmXHg1YVx4YWVceGI2IgorJEVDSE8gLW5lICJceGNhXHhjMVx4NWFceDg5XHg0Y1x4NzRceDM2XHhkM1x4MzJceGFiXHg4N1x4YTdceDdkXHg1N1x4N2ZceDQ1IgorJEVDSE8gLW5lICJceDFhXHgxZFx4NDVceGNjXHhjOFx4ZjFceDM2XHg4Y1x4NGRceDZlXHhjOVx4MDFceGI4XHg3YVx4OTlceGRjIgorJEVDSE8gLW5lICJceDRkXHg5YVx4YTFceGMzXHg3YVx4ODFceGFjXHhhOVx4NDBceDIwXHhjMVx4MThceGM3XHgxZVx4MGRceGViIgorJEVDSE8gLW5lICJceGY3XHg1M1x4OWJceGNiXHhlMlx4NjRceDRlXHgxN1x4MWNceDZhXHhkN1x4NzRceDZiXHhlNFx4NGJceGU3IgorJEVDSE8gLW5lICJceDVmXHgwNlx4MzFceGFjXHhlN1x4NWNceDY0XHg5M1x4MDVceDY5XHgxM1x4MWFceDM0XHg1Mlx4M2VceDFhIgorJEVDSE8gLW5lICJceGM4XHhmNlx4ZWRceGRlXHg1ZVx4NzlceGY0XHhlMlx4MDRceGMzXHhiNlx4YjNceDQ5XHhkY1x4N2FceGUzIgorJEVDSE8gLW5lICJceDUyXHgxMlx4MWJceDMyXHhkOVx4ZTJceDVjXHg5NVx4NWZceDY5XHgwMVx4ZGVceDc3XHgxNlx4MzRceGY3IgorJEVDSE8gLW5lICJceGRhXHg0M1x4MmNceDU2XHg3N1x4MjFceGNjXHg4Nlx4YzRceDRhXHgxNFx4YjhceDI5XHgyOFx4MGFceGYxIgorJEVDSE8gLW5lICJceDc5XHg4YVx4OWVceDk0XHg4Nlx4NmNceDZhXHg2Y1x4MGZceDE1XHhlNlx4YjRceDU3XHg5Mlx4ZmNceDFmIgorJEVDSE8gLW5lICJceDZkXHg5OFx4YmZceDJmXHgwYlx4OTdceGIzXHg0Ylx4ZWNceGU2XHhkM1x4ZjdceDk0XHhlNFx4MmNceGYzIgorJEVDSE8gLW5lICJceDIwXHhmYVx4NDJceDY5XHhkOVx4YjZceGIyXHg5Nlx4MzFceDA5XHg2Ylx4Y2JceGQyXHg5Mlx4MTRceDQwIgorJEVDSE8gLW5lICJceDY5XHg3NVx4OWFceDgzXHg0OVx4NDRceGVkXHhlMFx4ZGRceGEzXHgzZFx4MDlceGUwXHhlNFx4Y2ZceDRmIgorJEVDSE8gLW5lICJceDNiXHgxMlx4ODRceGI2XHg0N1x4MmJceDFiXHg3ZVx4YzJceGFjXHg4ZFx4ZjZceDFjXHg3NFx4MjZceGIwIgorJEVDSE8gLW5lICJceDJhXHgyN1x4ZjZceDAzXHhlM1x4ZjlceGUzXHhiYlx4NGFceDFhXHg2Zlx4YTJceGY0XHgxMFx4YjBceGU1IgorJEVDSE8gLW5lICJceDcwXHg5YVx4OWJceGRmXHhhY1x4NDJceDZhXHhkY1x4ODBceGMzXHg4MFx4MGNceDg0XHgyNlx4ZjBceDIzIgorJEVDSE8gLW5lICJceGQ2XHg1Ylx4Y2JceDhiXHgzYlx4ZTFceDY1XHhmZVx4YmFceGFkXHg4NVx4ZTlceDFkXHg4OFx4YTRceGY4IgorJEVDSE8gLW5lICJceDA1XHhiOFx4NThceDBiXHhiMVx4MTNceGE4XHhkOFx4ZWFceGZkXHgwN1x4NjhceGVlXHg2Ylx4NWNceDg4IgorJEVDSE8gLW5lICJceDE3XHg0OVx4ODlceDBlXHhhNVx4N2FceGU2XHhhMFx4OWNceDNhXHgwNlx4MmRceDcxXHg4NFx4MmNceGQyIgorJEVDSE8gLW5lICJceDFiXHgwN1x4ZmRceDQzXHg5Ylx4NDhceDliXHhhZVx4NjBceDU0XHg1ZFx4ZDNceDJiXHhmMVx4YzBceDBkIgorJEVDSE8gLW5lICJceDQ5XHgwMVx4NjRceDM0XHgzNlx4NzdceDJmXHgwZVx4ZTdceDcyXHgzNVx4NDhceDJmXHgwNVx4YWFceGQ1IgorJEVDSE8gLW5lICJceGI0XHg5OFx4NzdceGEzXHgxOVx4YTJceGY0XHhiOFx4MTFceGE3XHhhNlx4MjRceDkxXHhhY1x4MWVceDA5IgorJEVDSE8gLW5lICJceDM4XHgwNFx4YzZceGZmXHgwYlx4N2RceDM2XHhjMlx4Y2JceGI4XHg5Y1x4N2VceDdiXHg0OVx4OGNceDRlIgorJEVDSE8gLW5lICJceGJiXHgzN1x4MTlceDE4XHg4M1x4YzVceDIzXHgwM1x4NmNceGNiXHg1MVx4MjRceGU1XHg0Mlx4ODVceGM3IgorJEVDSE8gLW5lICJceDczXHgxM1x4MmNceGM4XHgyMlx4MjhceDUwXHg4M1x4YmNceDNhXHg4ZVx4NjBceGFjXHhiMVx4ZGFceDE4IgorJEVDSE8gLW5lICJceDI0XHg2ZFx4NjRceGQwXHhhOVx4NjVceGNkXHhkNlx4NWFceGE3XHhhYVx4YzZceGVkXHgzMlx4NzZceDdiIgorJEVDSE8gLW5lICJceDA3XHg5MFx4YjRceDdiXHg1ZFx4MTZceDg4XHg5Ylx4ZDdceDVlXHgwYVx4YjdceGJmXHhiZlx4YzRceDVkIgorJEVDSE8gLW5lICJceDFjXHhiZFx4MzlceGYzXHgxN1x4YWVceDUwXHhhYVx4YzdceGE0XHhlOVx4YWRceGE1XHhhY1x4MDRceGQ5IgorJEVDSE8gLW5lICJceGE0XHgyN1x4NWZceDc5XHg3NVx4MjlceDEwXHg2OVx4NzVceGU5XHgwNlx4NTNceDdjXHg2Nlx4OGJceDgzIgorJEVDSE8gLW5lICJceGY3XHg3Y1x4ZmRceGNkXHgxNlx4YzNceDhjXHg4ZVx4NTFceDZmXHhjYlx4NjhceDBhXHg5Y1x4MzlceDM5IgorJEVDSE8gLW5lICJceGI5XHgwYlx4NmFceDE2XHhjNVx4NGFceDIyXHhjMFx4MzFceDA5XHgyMlx4MjhceGEwXHg2NVx4NjlceDA1IgorJEVDSE8gLW5lICJceDMwXHg5MFx4YzFceDE4XHgyMlx4MDVceDllXHhhZFx4YTlceGMzXHg1NFx4M2VceDI3XHhhOVx4YzRceDQxIgorJEVDSE8gLW5lICJceDJjXHgzOVx4MDNceGQyXHg4ZVx4M2ZceDkxXHg5YVx4NGNceGM4XHg2OFx4MTRceGU0XHgxY1x4YTZceDVmIgorJEVDSE8gLW5lICJceDBiXHg1N1x4MjdceDA5XHg4YVx4N2RceGZmXHg0N1x4NjNceGE3XHg1YVx4MjlceDgyXHhhMFx4M2FceDI4IgorJEVDSE8gLW5lICJceDMwXHg5YVx4MmJceGYzXHg2OVx4NjNceDE4XHhjZFx4ZTJceDMyXHg2Nlx4M2NceGQ3XHg3OVx4ZGRceDEyIgorJEVDSE8gLW5lICJceDg2XHgzNFx4YzZceDllXHg3NVx4MDVceDg3XHgzOVx4MjNceDcyXHg5N1x4NzFceDI3XHg2NFx4Y2RceGQ5IgorJEVDSE8gLW5lICJceGE2XHgyZVx4NjFceGQyXHgzN1x4ZTRceGFlXHhjNlx4YzlceDgxXHhjMFx4MmVceDlmXHhjNlx4ZjlceDdmIgorJEVDSE8gLW5lICJceGQ5XHg1ZVx4ZDBceGE5XHgwOVx4OTdceDM1XHhhMlx4ZTNceDRmXHhlOVx4MTlceDdjXHhhNVx4YzdceDRkIgorJEVDSE8gLW5lICJceDJkXHg5Mlx4ZWNceGQ2XHhlZlx4ZGFceDU1XHhmM1x4YTJceDk1XHgxN1x4MWJceGNlXHhiZVx4NmJceDc0IgorJEVDSE8gLW5lICJceDcwXHhlZVx4ZGJceGE4XHg0Mlx4MjZceGIxXHhjY1x4YzFceDMxXHgwYVx4NjdceDkyXHgxM1x4OWRceDljIgorJEVDSE8gLW5lICJceDEyXHgxOFx4YTRceDA4XHg0ZFx4NGRceGZjXHg3Y1x4ZWJceDU5XHg2Ylx4MjJceDAzXHhhYVx4OTdceGMzIgorJEVDSE8gLW5lICJceDI3XHhhNVx4MjFceDM1XHg2OFx4ZDJceDU3XHg1NFx4Y2FceDU4XHgzOFx4ODJceGM1XHgwNVx4YTBceDcxIgorJEVDSE8gLW5lICJceDAxXHgxYlx4Y2VceDU3XHgxZVx4MjBceGJmXHg4OVx4OTZceDJhXHgzMVx4OGVceDZlXHhhZlx4N2ZceDM1IgorJEVDSE8gLW5lICJceDA4XHgxMFx4ZDlceDBlXHg4YVx4NzhceGIwXHg0OFx4OThceGE0XHg2NFx4MTRceGEyXHhjZlx4MjNceDJkIgorJEVDSE8gLW5lICJceDBhXHg3Ylx4ODRceGU1XHhmZFx4MjlceDQ5XHgxNVx4M2RceDc1XHgzOVx4ZmRceGFhXHhkNlx4YTRceGI5IgorJEVDSE8gLW5lICJceDA1XHgxMlx4NTdceDMxXHgwNFx4ZGNceDI2XHgzNFx4MTZceDNmXHhhN1x4MDNceDMyXHgxZFx4NGJceDFkIgorJEVDSE8gLW5lICJceDc4XHhkY1x4OWJceDc5XHg5Nlx4OWFceDg3XHg2ZVx4YjRceDgwXHhhYVx4MDFceDE5XHgzM1x4OTJceGIwIgorJEVDSE8gLW5lICJceDE2XHhjOVx4OTRceDljXHhlN1x4YTVceDYzXHhlNlx4MThceDEzXHhiMlx4MzRceGJkXHg5OFx4NDFceGQ2IgorJEVDSE8gLW5lICJceGE0XHhjOFx4YjlceDZlXHgwNlx4OWNceDcyXHhmOFx4NDlceGFiXHhkNVx4NDdceDllXHhhMVx4ZTZceGRlIgorJEVDSE8gLW5lICJceDYyXHhkMFx4ZWNceGFmXHhiZlx4MWJceDhhXHhhZlx4NjNceGEwXHgyOVx4YmVceDNkXHg4N1x4YTBceDIyIgorJEVDSE8gLW5lICJceGNlXHg0Nlx4NGVceDE4XHgzMFx4N2JceDNjXHgzZFx4ODZceGUxXHg5ZVx4YjZceDU5XHhlZlx4MWNceDQzIgorJEVDSE8gLW5lICJceDY1XHhkMFx4M2RceDUzXHhkMFx4NDFceDIwXHg0MFx4YjdceDJiXHhiMVx4ZGRceDUyXHgyY1x4ZGRceDY4IgorJEVDSE8gLW5lICJceDQ0XHhjMVx4YmVceDQwXHg3Mlx4NjFceGQ3XHgyNVx4NWRceGY1XHg2OVx4Y2VceDNhXHgzYlx4MmVceDliIgorJEVDSE8gLW5lICJceDEzXHgxOVx4NzlceDFhXHhmMFx4ZWVceGIwXHhlN1x4MTdceDQ0XHg0NVx4ZThceDJkXHg1OVx4NTBceGJjIgorJEVDSE8gLW5lICJceDQwXHg2N1x4NjZceDEyXHgyMFx4Y2NceDQzXHg4YVx4OWNceDFkXHhkZVx4YWNceDJkXHgwMFx4NzZceGIyIgorJEVDSE8gLW5lICJceDk4XHg4YVx4YTlceGRlXHgxY1x4YjZceDhiXHgzMlx4MTlceDY3XHgxY1x4NjdceDk1XHg0MVx4NDBceDYwIgorJEVDSE8gLW5lICJceGYzXHgxM1x4NDRceGI4XHhjNVx4MThceGE3XHhjYVx4ZGRceDhjXHg1YVx4OGZceDcyXHg2OVx4ZjFceDMxIgorJEVDSE8gLW5lICJceGE5XHhkMlx4ZWJceGFjXHgzZVx4MmZceGRjXHhjN1x4ZTBceDAwXHg3OFx4NWRceDcyXHhmZlx4MDFceDk1IgorJEVDSE8gLW5lICJceDg2XHg0YVx4OTBceDJiXHhmOFx4MTBceGM1XHhjMlx4ZDFceDlkXHg3YVx4YzNceDY1XHhiMVx4ZmRceDJkIgorJEVDSE8gLW5lICJceDA5XHgwYlx4Y2RceGRmXHgwM1x4ODBceDNlXHg0NFx4ODFceDY1XHg0OVx4NGZceDUwXHg3ZVx4MWZceDc1IgorJEVDSE8gLW5lICJceDk3XHhjNlx4MDVceGRhXHg1YVx4ZTlceGY2XHhlZVx4ZTVceDY2XHhjY1x4NWVceDE3XHhlMlx4OGNceGIyIgorJEVDSE8gLW5lICJceDA2XHg1Ylx4ZGRceDQxXHgwZFx4MjZceGNjXHg4N1x4MGRceDM3XHgyZVx4MmRceDM1XHhlMFx4NWRceDkzIgorJEVDSE8gLW5lICJceGM1XHhkZlx4MmRceGI0XHhhMlx4YjFceDFiXHgwZVx4OWJceGU2XHg3Nlx4YjRceDI4XHg2OVx4NWNceGU5IgorJEVDSE8gLW5lICJceDRlXHgyN1x4NmZceDUyXHhjYlx4NGRceGIzXHhjOFx4YWFceGVhXHhkM1x4MWFceDU3XHgwMFx4ZGZceDIwIgorJEVDSE8gLW5lICJceDJkXHg0Mlx4ZWFceDZhXHgxOFx4MGFceGFjXHhhZVx4OWFceDMyXHgwOFx4MjNceDk5XHhiN1x4ZDhceGU1IgorJEVDSE8gLW5lICJceDc1XHgzYVx4NjVceDhiXHgyZlx4YWFceDRmXHg3Ylx4NjhceGQ1XHg2Nlx4NzZceGY0XHhlY1x4M2RceGRiIgorJEVDSE8gLW5lICJceGU5XHgzN1x4ZGJceDY5XHg0MFx4NmRceDM1XHg0Zlx4NzdceGZhXHg4Zlx4MDdceDYwXHhhY1x4OGVceDNiIgorJEVDSE8gLW5lICJceDg5XHg0Nlx4M2NceDE2XHhkNFx4NGJceDZlXHg3MVx4NGZceDAwXHgxMFx4MjJceDE0XHgxMlx4Y2FceDcyIgorJEVDSE8gLW5lICJceGUwXHg2Y1x4NTRceDJmXHgwZVx4MzJceDhjXHhiYVx4NTNceGFkXHg1MVx4NDhceGFmXHhlZVx4YjJceGNhIgorJEVDSE8gLW5lICJceDkzXHg0YVx4NDZceDI0XHgxZlx4MDlceDgzXHg2OVx4MWNceDNmXHg3Mlx4NTBceDcwXHhmZlx4MTBceDc0IgorJEVDSE8gLW5lICJceDIxXHhlZlx4NGFceDA4XHgzOFx4MjVceDRjXHg1NFx4YjZceDM0XHg4M1x4NjRceDk5XHgyMlx4MGZceDAyIgorJEVDSE8gLW5lICJceDQ5XHg1OFx4NTBceDc0XHhhM1x4YmVceGMyXHgxN1x4MDVceGE3XHg2MFx4NTVceGM0XHgyMVx4NTJceDBjIgorJEVDSE8gLW5lICJceDU3XHhlZVx4MGZceDY0XHg2YVx4YTlceDczXHgyNVx4YTFceDJhXHg5NFx4MWRceDAwXHhjYVx4NjVceGM0IgorJEVDSE8gLW5lICJceDM5XHhmY1x4NTNceGE4XHhlN1x4NGNceDA3XHg0NFx4NWZceDI5XHgxOVx4OThceDA4XHgxNlx4NTNceDFhIgorJEVDSE8gLW5lICJceGJhXHhlZVx4OGVceDJlXHgxNlx4OTdceDY2XHg1Ylx4N2NceGI1XHg2M1x4MmRceDMxXHgxOFx4ZGJceDY0IgorJEVDSE8gLW5lICJceGM1XHg2OVx4MTVceGE5XHhlOFx4MjNceDVmXHg5Mlx4ZGJceDc1XHg2MFx4OTBceDZhXHhiZlx4YjVceGJhIgorJEVDSE8gLW5lICJceGU1XHhhNVx4NzBceGNlXHgyNlx4ZDBceGMxXHg2M1x4Y2JceDBlXHgyMVx4NjdceDFlXHg4ZVx4MjBceDMyIgorJEVDSE8gLW5lICJceGExXHgyZFx4NTFceGZjXHgzMlx4YTBceGM5XHhkMFx4MzJceDkxXHg5YVx4ZGFceDQ1XHg3M1x4MmVceDk3IgorJEVDSE8gLW5lICJceDA5XHgxN1x4MGNceGVhXHhlNFx4ODlceDk0XHhlOFx4YWRceDY0XHhkNlx4NzhceDAyXHgwN1x4NzlceDA2IgorJEVDSE8gLW5lICJceGE0XHgwMVx4Y2VceGQwXHhjY1x4MzNceDIwXHg4ZFx4YzlceDJkXHg2N1x4ZGZceDg1XHgwNlx4YjVceDIxIgorJEVDSE8gLW5lICJceDc0XHg2MVx4NDlceDk5XHg5OFx4ZWNceDI4XHgwNlx4YzRceGJkXHgyNVx4YjVceDYyXHgyZFx4YjBceGJhIgorJEVDSE8gLW5lICJceDVmXHg0Y1x4YzRceDMzXHg4NVx4NDJceDU4XHgxMVx4ZDRceGZmXHgyN1x4MjFceDNjXHg1N1x4OWVceGQ5IgorJEVDSE8gLW5lICJceGM0XHhiMVx4NmRceDhkXHg0YVx4OGNceDhhXHg4MFx4NmNceDFlXHgxNlx4NWZceGMxXHhjNFx4NjhceDRhIgorJEVDSE8gLW5lICJceGNhXHgyMFx4YjFceDQwXHgxMFx4MWJceDFiXHg2Y1x4ZjdceDgyXHhmOFx4ZDRceDM1XHgyOVx4MTBceDc2IgorJEVDSE8gLW5lICJceDdkXHgzYVx4NGRceDRkXHg0OVx4OWJceDYyXHg2NVx4NjZceGQ0XHhkYVx4ODFceDI0XHhjYVx4NGFceDQ4IgorJEVDSE8gLW5lICJceDQ4XHgyZlx4ODNceDQ4XHhkMVx4MDlceGRmXHgyZlx4MTdceDhiXHhjNVx4MzdceDg5XHg5NFx4MTVceGIxIgorJEVDSE8gLW5lICJceDM2XHg1OFx4Y2RceDgwXHhiNFx4MTlceGM1XHhjNlx4ZGFceGRhXHgxNlx4OTVceDgyXHgxNFx4YzVceDE5IgorJEVDSE8gLW5lICJceDYxXHg2ZVx4YjVceGNjXHgyN1x4YjVceGYzXHhkYlx4ZWZceDZlXHg0NFx4MzdceGJmXHhkY1x4MTFceGY5IgorJEVDSE8gLW5lICJceGEwXHhmMlx4NzhceDMwXHg4NVx4YzBceGMwXHgwN1x4NjdceDAyXHg2Nlx4NTZceDdjXHg3Nlx4ZWVceDdhIgorJEVDSE8gLW5lICJceDk3XHg2ZVx4MDJceDVlXHgwOFx4YzBceDM1XHgwMlx4NGFceDg3XHgzOVx4NGNceGQ2XHhjNFx4ZTBceDk5IgorJEVDSE8gLW5lICJceGNkXHhkOVx4ZGFceDJjXHg0OVx4MThceDVjXHgyMlx4YjZceDUxXHg0Ylx4YTBceDU4XHg4Ylx4N2FceDU1IgorJEVDSE8gLW5lICJceDYxXHhkY1x4YTVceDIxXHg4M1x4MWRceDQ3XHg5Y1x4MGJceGY0XHg3NFx4YmFceDA4XHg4NVx4ZTRceGM4IgorJEVDSE8gLW5lICJceDgwXHhiZVx4ODBceDQ2XHhmY1x4NDZceDg1XHg2MFx4NjRceGE2XHhjNFx4YzFceGFlXHg2OVx4NjdceDBiIgorJEVDSE8gLW5lICJceDhlXHhhY1x4YTJceGMwXHhmNFx4NmJceDZmXHg3YVx4OWVceDAwXHhkZFx4NGRceDU5XHg1N1x4NGFceDc4IgorJEVDSE8gLW5lICJceDA4XHg2NFx4MDhceDg0XHg4MFx4NTBceDM0XHhiMVx4M2JceGM3XHg3MVx4M2ZceDNlXHgxY1x4MWRceDRlIgorJEVDSE8gLW5lICJceDRlXHhhOVx4YjBceDMyXHgwMlx4MTBceDhlXHg4OFx4NzFceGVkXHg4N1x4MmNceDMyXHg0ZFx4NTdceDA1IgorJEVDSE8gLW5lICJceGYxXHhiYVx4YTBceGY5XHg2MVx4MzBceDRiXHgxOFx4NjVceDZlXHgzOFx4ZjlceDQxXHhkZFx4ZjFceDQ4IgorJEVDSE8gLW5lICJceDYzXHgzOFx4NTBceDEwXHhjMVx4YWNceDFiXHhmMlx4NWJceGFhXHgxNVx4ZjRceDg5XHgwZVx4ZTlceDc3IgorJEVDSE8gLW5lICJceDgwXHg1Nlx4NTBceDE4XHg4MVx4NzFceGQ4XHhkYlx4MGRceDZhXHhjZVx4ZDJceGI2XHg3Nlx4YmRceDM1IgorJEVDSE8gLW5lICJceGYwXHg5Nlx4ZTFceDA2XHg4Ylx4MDlceGFiXHg4M1x4MjFceDEwXHgxMFx4MzBceDY4XHgzMFx4YWRceGUwIgorJEVDSE8gLW5lICJceGMyXHg2Mlx4YTJceDk5XHgwYlx4OTJceDE3XHgxOVx4YWJceGUzXHg3YVx4ZDFceDkwXHhhZVx4NWNceDJiIgorJEVDSE8gLW5lICJceDZlXHhiZVx4MzFceGVjXHg3Mlx4NzhceDAzXHg3YVx4ODVceDcwXHhlMFx4NjdceDM2XHhlMFx4ZGJceDYzIgorJEVDSE8gLW5lICJceDZlXHhlZFx4MjZceDk0XHhjY1x4OWJceDRlXHhhOFx4MjNceDU3XHg1Nlx4ZTFceDQ5XHg2MVx4MzFceDVlIgorJEVDSE8gLW5lICJceGM4XHgyYlx4ODFceDA1XHgyM1x4MThceGRiXHg2OFx4MzRceDBiXHg2Y1x4ZjFceGZjXHhjN1x4ZGRceGRmIgorJEVDSE8gLW5lICJceDFhXHgzOVx4ZjhceGY2XHg3Mlx4YjlceDRkXHhjOVx4ODBceGJmXHgyM1x4OTNceDI0XHg3Nlx4ZGRceDZkIgorJEVDSE8gLW5lICJceDBhXHg4Zlx4MThceGUxXHg4MVx4OGZceDQ4XHg3Ylx4NDhceDJlXHhkMFx4YjVceGQwXHhjYlx4YTFceDQ2IgorJEVDSE8gLW5lICJceGFlXHgxY1x4MjZceDAyXHhkMlx4ZTBceGY0XHg1Nlx4OGNceDhhXHgwMVx4OTdceDRlXHg1Zlx4ZDFceGRlIgorJEVDSE8gLW5lICJceDlhXHgxMFx4MzFceDBkXHg0Y1x4YmNceDQwXHgwNlx4YzVceDA0XHg5Mlx4OTFceDg4XHg4MVx4NThceDVkIgorJEVDSE8gLW5lICJceDU1XHgxM1x4YWJceDRmXHhhYVx4YmRceGVlXHhhMFx4NmFceDgwXHhiMlx4ODNceGQwXHg0Nlx4MzFceGEwIgorJEVDSE8gLW5lICJceGJjXHgyY1x4ZjlceDBkXHhhZFx4ZTJceDYyXHhiMFx4YWNceGE0XHg5MVx4ODRceGI4XHgzMVx4OTlceGI5IgorJEVDSE8gLW5lICJceDQ1XHhiM1x4NDdceDFlXHhjMlx4OTZceGM5XHg5ZFx4Y2NceGQzXHhjY1x4NzFceGM0XHhmM1x4OWFceDkyIgorJEVDSE8gLW5lICJceDJiXHhhY1x4YzNceDhjXHhlMVx4ZGNceDQwXHg2Nlx4NjRceGU4XHgyNFx4MzVceDUwXHgyNlx4NjhceDBiIgorJEVDSE8gLW5lICJceDc5XHg5Nlx4ODFceGI2XHgzNlx4YzdceGE0XHg4Mlx4MGRceDMyXHg2NVx4YzNceDRjXHg2MVx4NDlceDMyIgorJEVDSE8gLW5lICJceDA5XHgxNFx4MjJceGFjXHgzN1x4NjlceDM0XHhiNFx4NmNceGRkXHhiY1x4OTVceDU0XHg2Ylx4NTlceDUzIgorJEVDSE8gLW5lICJceGM2XHg1MFx4MzJceDA5XHg5OVx4MTRceDhjXHgxOFx4NzRceGNjXHgwNVx4ODZceDdhXHgwNlx4NDhceDUwIgorJEVDSE8gLW5lICJceDZlXHhlMFx4YWFceDQxXHhiYlx4YjBceGJjXHgxOVx4YWFceDJjXHgxMlx4OWNceGNkXHhhNVx4MWNceDZkIgorJEVDSE8gLW5lICJceDE5XHgwYVx4NjJceDAyXHhmZVx4ZDNceDRhXHhjY1x4N2NceDZhXHhhNVx4NzJceDA2XHgzNVx4ZmJceDhkIgorJEVDSE8gLW5lICJceGY5XHhhYlx4MWVceDBiXHgyOVx4NzNceDcwXHhiNVx4ZThceGY2XHg1NFx4YjZceDRjXHhjOFx4ZWFceDMwIgorJEVDSE8gLW5lICJceDhjXHhhZlx4ZDBceGQzXHhiMFx4MjBceDU5XHg4MFx4NjFceDQwXHhjOFx4MTlceDk5XHg2ZFx4OTdceGIzIgorJEVDSE8gLW5lICJceGNhXHg2Nlx4MWVceDE2XHgzZFx4YTdceDc0XHhhNlx4NThceGYwXHhkNFx4MDBceDY3XHhkY1x4YmJceDhhIgorJEVDSE8gLW5lICJceDRhXHg3Ylx4NzVceGE0XHg2ZVx4ODlceGM0XHg0NFx4NDRceDNkXHg3Mlx4YjRceDUyXHg4YVx4YzBceGMyIgorJEVDSE8gLW5lICJceDExXHg0MFx4MjJceDlhXHgxNFx4MDlceDY2XHhjMlx4MDNceGNjXHgwNFx4ODZceDAyXHgwM1x4YTZceDhhIgorJEVDSE8gLW5lICJceGFiXHg2MFx4ZTBceGU4XHhkY1x4MmJceDVkXHgwZFx4NzNceGI1XHg4Zlx4NzRceGM2XHhjZVx4ZGJceGI1IgorJEVDSE8gLW5lICJceGE4XHhlN1x4OTVceDNmXHg4Ylx4YWZceGI5XHg4N1x4YmNceDYzXHhhYlx4ODRceGVhXHg5M1x4MWVceDlkIgorJEVDSE8gLW5lICJceGI0XHhlMFx4ODNceGM4XHg0YVx4YzlceGM3XHhiOVx4YzdceGYyXHhjNlx4MjVceDEwXHg1OFx4YzBceDIxIgorJEVDSE8gLW5lICJceDY0XHhhMVx4MDhceGQzXHgxMFx4MmZceDk0XHg0MFx4NWFceDU2XHgxN1x4YTFceDBmXHhhNlx4ZmJceGRhIgorJEVDSE8gLW5lICJceGQzXHgxMlx4NDJceDMxXHg3MVx4MDlceGE1XHgyZVx4OGJceGQxXHg2OVx4NWNceDk5XHg1Ylx4MDlceDUyIgorJEVDSE8gLW5lICJceGM2XHg5Ylx4NWFceDE4XHgwY1x4MDZceDQ3XHg0Mlx4OGFceGMzXHhhZFx4ZWZceDlhXHhlOVx4OWRceGY2IgorJEVDSE8gLW5lICJceDJiXHg4MVx4NzJceDQ4XHgwNVx4MjBceDE2XHgxMFx4YTNceGMzXHhjNVx4ZDJceDcxXHgwZVx4Y2FceDA0IgorJEVDSE8gLW5lICJceDE3XHhlZlx4ZGZceDM5XHg2NFx4MjZceDRjXHg5Zlx4MjJceGI0XHgxM1x4MWNceDNkXHhlN1x4NTVceDQwIgorJEVDSE8gLW5lICJceDJlXHhkMVx4OTFceDI4XHhjOFx4MWNceDY4XHg2OVx4NjVceDk3XHgxM1x4NzVceGZlXHg1Ylx4NWNceGIxIgorJEVDSE8gLW5lICJceDliXHg1YVx4ZjdceGQyXHgwMlx4YjJceDBiXHg0MVx4MzZceDY3XHhlN1x4YTlceDEwXHg4MFx4ZDBceDVjIgorJEVDSE8gLW5lICJceDY0XHgwOFx4NjdceGRhXHg1Nlx4MzZceDUzXHg0YVx4YThceGNhXHgxNlx4ODhceGM1XHg3OVx4ZGRceDNlIgorJEVDSE8gLW5lICJceDg3XHg3MVx4MTNceDM5XHhhZVx4ZmRceDJhXHg5M1x4NmVceGJiXHg5Nlx4MDJceDM5XHhlYVx4ZGFceDVhIgorJEVDSE8gLW5lICJceDg3XHhiOFx4ZmFceDU0XHgyY1x4NDlceGEzXHhhMFx4YmJceGE1XHhjNFx4MTBceDVjXHhkMlx4MTBceDEwIgorJEVDSE8gLW5lICJceDBjXHg4OFx4YjJceGQ0XHhmNFx4NjdceDZhXHg5M1x4NWJceGJiXHgyMFx4MDZceGRjXHg3NVx4N2ZceDNhIgorJEVDSE8gLW5lICJceDliXHhhM1x4YjBceDc2XHg5OFx4ZDlceDc3XHgzMlx4OTdceGE1XHhkY1x4NjRceGE0XHg3Ylx4YTVceGFlIgorJEVDSE8gLW5lICJceGFhXHgxNVx4MmRceDU5XHgwY1x4YzFceDdhXHg0MFx4ZDJceGMyXHhiYlx4NDVceDEwXHhlMVx4OWFceDQ2IgorJEVDSE8gLW5lICJceDUyXHg5MVx4ZTRceDI0XHgyMVx4OWNceDQ2XHhlZVx4MDVceDU3XHg0NFx4NWVceDQxXHhhZFx4NWFceDA4IgorJEVDSE8gLW5lICJceDQ2XHgwYlx4YTBceGRmXHhiNFx4NTlceDdhXHhlNFx4NDFceGEzXHgwYVx4NTlceDVlXHgyYlx4MTdceDIwIgorJEVDSE8gLW5lICJceDE5XHgwMlx4NmNceGU2XHhlMlx4NDhceDg1XHg5OVx4YjNceGJhXHhmY1x4OWNceGUzXHhjZFx4ZjlceDMxIgorJEVDSE8gLW5lICJceDViXHhmMVx4ODZceDY0XHg5ZFx4OGZceDkzXHgyNFx4YTNceDI5XHgzOFx4OTRceGNiXHgxZVx4NzFceDg3IgorJEVDSE8gLW5lICJceDU0XHhmMlx4MjdceDIyXHg0ZVx4NTdceDI2XHg5YVx4ODJceGI1XHg2ZVx4NmNceDFjXHhhZFx4MmRceDJiIgorJEVDSE8gLW5lICJceDIyXHg2Mlx4MGFceGQwXHgyM1x4NWRceDVhXHg3NVx4MTVceGFlXHhhMFx4MjZceDA0XHgyMVx4NmRceDJjIgorJEVDSE8gLW5lICJceGZlXHgwNlx4ZDlceDYwXHg2MVx4MjBceDhlXHhlYVx4ZWZceGJhXHg1OVx4MDNceDY0XHhkYVx4ZTVceGIyIgorJEVDSE8gLW5lICJceDMwXHhjMFx4OWNceGRjXHhjZlx4MTFceDc3XHhlOVx4MjNceDU0XHgzM1x4YjhceGU5XHgwNVx4YWJceDRjIgorJEVDSE8gLW5lICJceDViXHhiNVx4NGJceDJkXHgwM1x4MGNceDUxXHhjNVx4ODBceDExXHg1MVx4YWNceGViXHg4ZFx4NGNceDI1IgorJEVDSE8gLW5lICJceDIxXHg5OFx4NzlceGIwXHgzOFx4OTlceDljXHhiY1x4ZTJceDk2XHhlOVx4NGFceGQwXHhhZFx4NTZceDZhIgorJEVDSE8gLW5lICJceDY1XHhlMVx4ZDRceDkwXHgxMlx4NGFceGE1XHg0OFx4MDZceGM2XHg0OFx4MzFceGFjXHhhZlx4MjFceDBhIgorJEVDSE8gLW5lICJceDU2XHhhMlx4OTBceDEyXHhkN1x4NTNceGE4XHg0OFx4MDNceDc1XHgyZVx4MzZceDE0XHhmNFx4NTBceDg5IgorJEVDSE8gLW5lICJceDdjXHg0OVx4NGVceDRhXHgyYVx4YmNceDQ2XHhjM1x4MmRceDE2XHg0ZVx4NDJceDI1XHgyOFx4ZDRceGYyIgorJEVDSE8gLW5lICJceDAxXHg0N1x4YTNceDVhXHhkMVx4NmFceDBjXHgxY1x4MzVceDljXHg1Mlx4YzhceDJkXHhlYlx4YWJceDE1IgorJEVDSE8gLW5lICJceDJhXHg5OVx4NTFceDQ1XHgyMlx4OWNceDc3XHhhZlx4ODVceDc3XHhiY1x4ODRceGIyXHhmNVx4OTlceGU5IgorJEVDSE8gLW5lICJceGQ4XHhkOVx4YzFceDkwXHg4M1x4MDJceGViXHhkZVx4OGZceDkxXHg4Mlx4YTNceDBjXHg3M1x4MWFceDA1IgorJEVDSE8gLW5lICJceDZiXHg5Y1x4OThceDI4XHhjNVx4NTZceDU1XHhlOVx4ZjNceDc0XHgyNFx4ODFceDQ4XHhhZlx4MjFceGI0IgorJEVDSE8gLW5lICJceDg0XHgyZFx4NmJceDQ1XHg4OFx4YzJceDkwXHhiMVx4MTJceDEyXHg2MFx4YzhceDZhXHhlY1x4NjFceDMzIgorJEVDSE8gLW5lICJceGEyXHhjM1x4YjNceDU4XHhiZlx4MjlceDFjXHg0OFx4OTdceDdhXHhlYVx4MjBceDY1XHgwM1x4N2ZceDIyIgorJEVDSE8gLW5lICJceDQ1XHhhNVx4ZGRceDAzXHg1Y1x4NTJceGRjXHgzMFx4ODVceGRlXHhkOVx4NDdceDVlXHhlYlx4MzFceDY1IgorJEVDSE8gLW5lICJceDBiXHhmM1x4MTNceDgwXHhhZVx4M2VceDA3XHg1Mlx4MmFceDQ3XHhiOVx4N2JceDdjXHhhOFx4NDFceDc5IgorJEVDSE8gLW5lICJceDk1XHgyZVx4Y2ZceDNkXHg2MFx4MDhceGU2XHgyNlx4MDBceGQxXHg4Mlx4NjBceDcwXHg0NVx4YTFceDRhIgorJEVDSE8gLW5lICJceDQ4XHhhMlx4MThceDc2XHgzNVx4YjVceGU4XHg2Y1x4MGRceDQyXHhkMlx4YmFceDJjXHgxM1x4NWJceDI1IgorJEVDSE8gLW5lICJceDI3XHhkNFx4OGRceDczXHg3YVx4ZjhceGQ5XHhmZVx4ZjNceGQzXHg4MVx4NzNceDgzXHhlOFx4NjVceDYwIgorJEVDSE8gLW5lICJceGYzXHg1Ylx4MThceDA3XHgxNVx4MDRceDYwXHg2N1x4NTFceGNhXHhhYlx4OTFceDg1XHhkY1x4NjFceDNhIgorJEVDSE8gLW5lICJceGU5XHg3Mlx4YzJceGQxXHhhNFx4NjhceGUyXHgwMFx4YzhceDBjXHg1ZVx4ODJceGEwXHgwYlx4ODJceDE2IgorJEVDSE8gLW5lICJceDQwXHg4Mlx4YjJceDk4XHg3Ylx4NzZceGY4XHg1Ylx4YjVceGY2XHg4ZFx4ZmJceGM5XHgzNlx4OGNceDFlIgorJEVDSE8gLW5lICJceGE2XHhjOVx4YjVceDk1XHhkOFx4MzZceDI4XHgzNlx4ZWVceGE5XHhhMlx4NzJceDY2XHg1OFx4ZjVceDkwIgorJEVDSE8gLW5lICJceDAyXHg5NVx4ZWVceGE4XHhmY1x4NzlceGZhXHg2Zlx4NjZceGY2XHg0N1x4ZDZceDRmXHgxMFx4OTVceDg2IgorJEVDSE8gLW5lICJceDU0XHgwZFx4YTBceDIyXHgyNlx4MDFceGJlXHg2M1x4YzVceGYxXHhhY1x4MzZceDRhXHhlMVx4MGZceDZiIgorJEVDSE8gLW5lICJceGU3XHhiYVx4NGZceDIwXHgxN1x4YzBceGY5XHgwMlx4NWRceGM0XHhjMFx4YWZceGYwXHgxZlx4ODhceDU0IgorJEVDSE8gLW5lICJceGU0XHg2ZVx4YzBceGEyXHhiYlx4NTlceDZmXHg4Mlx4MjFceGJiXHg1MFx4OWNceDRlXHg5Mlx4ODNceDI0IgorJEVDSE8gLW5lICJceDIzXHhmOFx4MjhceDRjXHg0NVx4NzlceDg4XHg3MVx4M2JceDA1XHg3OVx4OThceDRmXHhhMVx4MDBceDJkIgorJEVDSE8gLW5lICJceDZlXHg2OFx4MDhceDQ2XHgzYlx4ZmJceGYwXHg1Y1x4MjJceGYzXHg0Mlx4NDBceDdkXHg1ZVx4NjdceDNmIgorJEVDSE8gLW5lICJceGRmXHhmZlx4MmVceDczXHgwZFx4MzFceGI1XHhjMFx4NzhceDRjXHgwZlx4ODVceDBmXHhkYlx4ZTZceDJiIgorJEVDSE8gLW5lICJceDg2XHgwZlx4YjNceDhmXHg5ZFx4MWFceGU2XHhlMlx4ZGJceDMyXHg2OFx4ZmJceDVhXHg3OVx4MGFceGY0IgorJEVDSE8gLW5lICJceDI1XHgyOFx4MDFceDM5XHhkMlx4N2NceDA1XHg3Ylx4MGJceDE4XHhiYlx4OWNceDY4XHgzMVx4OGRceGIwIgorJEVDSE8gLW5lICJceGZjXHg2OVx4MmRceDE3XHgyY1x4MzNceDYyXHhhNlx4MjRceDZmXHgwZVx4Y2NceGRjXHhmZlx4N2JceGRmIgorJEVDSE8gLW5lICJceDc4XHhkM1x4ODhceDVjXHg0YVx4YmRceGViXHgxNFx4ZGFceGUwXHgwZVx4ZDNceGYzXHg1Ylx4ZDJceGFhIgorJEVDSE8gLW5lICJceGQxXHg2NFx4ODJceDQyXHgwY1x4ZmVceDU0XHg5MFx4NDBceGViXHg3NVx4MTNceDYzXHg2OFx4YjVceDUyIgorJEVDSE8gLW5lICJceDBhXHhkOVx4M2JceGM1XHhkMFx4MTRceGUxXHhkMlx4MzVceGFiXHgyYlx4OGJceGVkXHgyMVx4ZjNceGUxIgorJEVDSE8gLW5lICJceGNiXHhlZFx4YmNceDNlXHg2NFx4ODFceDYzXHg1Zlx4YWFceGYzXHhiOFx4MDVceDEwXHgyOVx4ZTFceDY3IgorJEVDSE8gLW5lICJceGFlXHgwYVx4MTZceGJiXHg3MVx4MDVceDAyXHg0Nlx4YmFceGVmXHgzMFx4ZGFceGU3XHgzYVx4MThceDRiIgorJEVDSE8gLW5lICJceGNiXHgwZVx4OTdceGQxXHhlOVx4ZjVceDdhXHg3M1x4YzFceDYwXHg5MVx4YWZceDYzXHg0YVx4YzhceDU3IgorJEVDSE8gLW5lICJceGE2XHhiMFx4MDlceGI0XHg5NVx4OThceDg3XHhhOVx4YzRceDVlXHgwNFx4ZTdceGVmXHhiZlx4ZTVceDhjIgorJEVDSE8gLW5lICJceDM5XHg4ZVx4ZTJceGRkXHg5YVx4YzBceGJmXHgzN1x4OWNceDM4XHhhM1x4YWRceGM2XHgxNFx4ODZceDNmIgorJEVDSE8gLW5lICJceDdkXHhjMVx4OWRceGI1XHhiYlx4NjhceDU4XHg0Y1x4MTRceDAzXHhmMVx4MzZceGQ0XHhmMlx4Y2VceGI2IgorJEVDSE8gLW5lICJceGJjXHg5ZFx4YjNceDMxXHg1NVx4NjhceDBjXHg1Zlx4ZDBceDMwXHhlMlx4MDVceGFlXHg2OFx4NGVceDExIgorJEVDSE8gLW5lICJceDVhXHgyOFx4MTVceDY4XHg4Zlx4YWNceGEzXHgxYlx4ODlceGFkXHg0OFx4ODlceDA4XHgwOFx4YTNceDNiIgorJEVDSE8gLW5lICJceDI2XHg1ZVx4MzJceDFkXHg2ZFx4NzNceDJiXHgyMFx4OTBceDA4XHg0YVx4MTJceGIwXHgxZlx4ZjFceGEzIgorJEVDSE8gLW5lICJceDM3XHhmOFx4ZWNceDMwXHgyMVx4MDZceGYzXHhiYlx4M2JceDQ2XHhmOVx4YWFceGViXHgxYVx4MzFceDMzIgorJEVDSE8gLW5lICJceDJiXHhhNVx4ODdceDRkXHg0ZFx4YmNceDEzXHhkYVx4YTlceGEwXHg0Y1x4Y2FceDBiXHg0Nlx4YTZceDA5IgorJEVDSE8gLW5lICJceDQxXHg3M1x4YmJceDNmXHg3MVx4OWZceDZhXHg4OFx4NDFceDAyXHgyMFx4M2ZceDU0XHg2ZFx4NDJceGM4IgorJEVDSE8gLW5lICJceDcwXHg2ZVx4NjRceGQwXHg1MFx4ODhceDgzXHhjNFx4MzNceDc4XHg2ZFx4MDRceGI2XHg0M1x4ZWRceDVlIgorJEVDSE8gLW5lICJceDcyXHg3MVx4NmJceGQ1XHg2NVx4ODBceGNmXHg2Nlx4NDZceDI5XHgxMFx4ZGJceDc5XHhkMVx4YTlceDk1IgorJEVDSE8gLW5lICJceGI3XHg5ZFx4ZjRceGE5XHg5M1x4YjRceDVhXHgwMFx4YzZceGIyXHhhZFx4YmZceDdlXHhhYVx4ZTZceDhkIgorJEVDSE8gLW5lICJceDhjXHhjMFx4NmJceGY1XHhjMlx4YWRceDAwXHhmYlx4MDhceDYzXHhlMlx4YjVceGIxXHhlMFx4NzZceGFjIgorJEVDSE8gLW5lICJceDBhXHhlNFx4NzJceGI1XHg3Mlx4YmNceDI0XHg2Ylx4ZWZceDYyXHgwZlx4YWFceGI5XHgyOFx4ZDJceDNjIgorJEVDSE8gLW5lICJceGY2XHgzZVx4MjZceDIwXHg4Ylx4Y2NceGQyXHg2MVx4Y2RceGQ0XHhjN1x4ZWRceDM5XHhhOFx4MzlceDRlIgorJEVDSE8gLW5lICJceDdlXHgwNVx4OTdceGViXHgyOVx4MjRceDNhXHhiMlx4YzlceGJkXHhhZFx4Y2ZceGYwXHgyMlx4YmNceGRkIgorJEVDSE8gLW5lICJceGI4XHg4Y1x4MmVceDZhXHhiZlx4NGZceDY3XHgyZlx4ZmNceDA3XHhkMFx4NTNceDBjXHg1NFx4MzBceDM1IgorJEVDSE8gLW5lICJceGY4XHhmMVx4NzZceDQ1XHgyNlx4NWFceDg2XHgxMVx4MWVceGViXHg1OFx4YzBceDJkXHg2Y1x4M2RceDg3IgorJEVDSE8gLW5lICJceGE2XHhjYVx4OGVceDg5XHg0Zlx4NzVceDg4XHhmOVx4YjlceDlhXHg5OVx4OGJceDY4XHgyMlx4ZTJceDUyIgorJEVDSE8gLW5lICJceDRkXHg0Nlx4OGRceDQ0XHgzMVx4MmJceGMxXHhiMFx4MTlceGE3XHg5MFx4ZmJceDk1XHhkYVx4MTlceDJmIgorJEVDSE8gLW5lICJceDZlXHgwZFx4ZTJceGMxXHg4NVx4ZDBceDFmXHg5Ylx4ZDNceGFlXHgzM1x4ZTNceDU1XHhhNFx4NzdceGYyIgorJEVDSE8gLW5lICJceGYxXHhkN1x4YThceGYwXHg1N1x4MzBceGM0XHgzYlx4ZTZceDU1XHg5N1x4ZjlceGUzXHg4OVx4ODJceGRhIgorJEVDSE8gLW5lICJceGFlXHgwMlx4NDVceGIxXHg4Nlx4OGNceDg0XHg0Y1x4YjJceGNmXHg4Mlx4ZGJceDRlXHgwNFx4NDVceGNjIgorJEVDSE8gLW5lICJceDE5XHg1M1x4OWVceDJmXHg5NVx4YTlceGM3XHhhOFx4MDhceDE3XHg2MVx4YzFceDhjXHgyNlx4N2ZceDliIgorJEVDSE8gLW5lICJceDA3XHg4Y1x4ZTdceDc3XHgyZFx4MTJceGQyXHhjZFx4YzZceDk3XHhjZlx4MjlceDNhXHgxZVx4YWNceDJiIgorJEVDSE8gLW5lICJceDY5XHhiOVx4YjRceDYxXHhlZVx4ZWJceGIzXHhhZVx4NjBceDE4XHhhMFx4M2FceGU1XHhjMFx4YjlceDU4IgorJEVDSE8gLW5lICJceDM4XHg0ZFx4MzJceDU3XHg4MVx4ODlceDk5XHgyOVx4NzNceGRkXHg0N1x4NDNceDJmXHgxZVx4MzlceGM2IgorJEVDSE8gLW5lICJceDA2XHhiZlx4N2ZceDY0XHg5ZVx4OTFceGMzXHg5Zlx4MThceDFiXHhiYVx4ZjhceGI1XHgyOVx4NWRceGUzIgorJEVDSE8gLW5lICJceDQ2XHg3ZVx4YjVceDFhXHhmZFx4OWJceGIwXHgxYlx4ODVceDA2XHhjM1x4YzVceDA5XHhkYlx4ODJceGQwIgorJEVDSE8gLW5lICJceGQxXHhmZlx4ZTFceDBmXHhlYlx4MzdceDFkXHhjZVx4NjVceDZkXHgyNlx4NTVceGUwXHgyMFx4MDBceGM0IgorJEVDSE8gLW5lICJceDM2XHgyZlx4YmFceDg2XHgyNlx4YzZceDdiXHhhNFx4ZTlceGIxXHg0MVx4MjBceDA0XHgxMVx4ZWJceDI0IgorJEVDSE8gLW5lICJceDNjXHg3Mlx4YmZceGQzXHhjNVx4YjNceGJkXHhjZVx4MTRceDQ1XHgyZFx4NTBceDAxXHgwMFx4MjZceDM5IgorJEVDSE8gLW5lICJceDNjXHg4NVx4MTdceDBlXHg0Mlx4NjZceDhhXHgxY1x4OTRceGE4XHg5MFx4MDJceGM0XHg0Mlx4ZDhceGQxIgorJEVDSE8gLW5lICJceGNjXHg5NFx4N2FceDI1XHhhZFx4ZmRceDhkXHhhNFx4MGVceGUwXHhjYlx4OTJceDVlXHg2Zlx4MTRceDJiIgorJEVDSE8gLW5lICJceDI5XHhiZFx4YzBceDgxXHgyMFx4M2ZceDBiXHgyY1x4N2FceDJjXHhlN1x4YmFceDZkXHg5OVx4MTRceGJlIgorJEVDSE8gLW5lICJceGQ1XHgzOVx4YzhceDZmXHgyZVx4YmRceDc5XHg1OVx4MTlceDc1XHhiNlx4ZjVceDRmXHgxMlx4ZjZceDhlIgorJEVDSE8gLW5lICJceDQwXHhhMFx4MDBceDhiXHgxMlx4ZThceGZiXHhiN1x4MjdceGFhXHhkM1x4MzZceDBjXHhmY1x4ZTFceDQwIgorJEVDSE8gLW5lICJceDAxXHhmZlx4OGJceGI5XHgyMlx4OWNceDI4XHg0OFx4NWZceGE1XHhjYVx4ZjNceDgwIgorfQorCitwYnppcF80bV96ZXJvcygpIHsKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4YzlceGI1XHgyMVx4ZWZceDAwXHgwNCIKKyRFQ0hPIC1uZSAiXHg4ZFx4NDBceDIwXHhjMFx4MDBceDAxXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDVceDI5XHhhNiIKKyRFQ0hPIC1uZSAiXHg0YVx4MTFceGIxXHg0YVx4MTFceGUyXHhlZVx4NDhceGE3XHgwYVx4MTJceDE5XHgzNlx4YTRceDNkXHhlMCIKK30KKworcHJlcCgpIHsKKyAgICBybSAtZiB0KgorICAgIGhlbGxvXyRleHQgPnQxLiRleHQKKyAgICBoZWxsb18kZXh0ID50Mi4kZXh0Cit9CisKK2NoZWNrKCkgeworICAgIGV2YWwgJDIgPnRfYWN0dWFsIDI+JjEKKyAgICBpZiAkRUNITyAtbmUgIiRleHBlY3RlZCIgfCBjbXAgLSB0X2FjdHVhbDsgdGhlbgorCWVjaG8gIlBBU1M6ICQxIgorICAgIGVsc2UKKwllY2hvICJGQUlMOiAkMSIKKwlGQUlMQ09VTlQ9JCgoRkFJTENPVU5UICsgMSkpCisgICAgZmkKK30KKworbWtkaXIgdGVzdGRpciAyPi9kZXYvbnVsbAorKAorY2QgdGVzdGRpciB8fCB7IGVjaG8gImNhbm5vdCBjZCB0ZXN0ZGlyISI7IGV4aXQgMTsgfQorCitleHBlY3RlZD0iJHVucGFjazogejogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQorSEVMTE8KKyIKK3ByZXA7IGNoZWNrICIkdW5wYWNrOiBkb2VzbnQgZXhpc3QiICIke2JifSR1bnBhY2sgeiB0MS4kZXh0OyBlY2hvIFwkPzsgY2F0IHQxIgorCisKK2V4cGVjdGVkPSIkdW5wYWNrOiB0Lnp6OiB1bmtub3duIHN1ZmZpeCAtIGlnbm9yZWQKKzEKK0hFTExPCisiCitwcmVwOyA+dC56ejsgY2hlY2sgIiR1bnBhY2s6IHVua25vd24gc3VmZml4IiAiJHtiYn0kdW5wYWNrIHQuenogdDEuJGV4dDsgZWNobyBcJD87IGNhdCB0MSIKKworCisjIEluIHRoaXMgY2FzZSBmaWxlICJ0MSIgZXhpc3RzLCBhbmQgd2Ugc2tpcCB0MS5neiBhbmQgdW5wYWNrIHQyLmd6CitleHBlY3RlZD0iJHVucGFjazogY2FuJ3Qgb3BlbiAndDEnOiBGaWxlIGV4aXN0cworMQorSEVMTE8KKyIKK3ByZXA7ID50MTsgY2hlY2sgIiR1bnBhY2s6IGFscmVhZHkgZXhpc3RzIiAiJHtiYn0kdW5wYWNrIHQxLiRleHQgdDIuJGV4dDsgZWNobyBcJD87IGNhdCB0MSB0MiIKKworCisjIEZyb20gb2xkIHRlc3RzdWl0ZQorZXhwZWN0ZWQ9IkhFTExPXG4wXG4iCitwcmVwOyBjaGVjayAiJHVucGFjazogc3RyZWFtIHVucGFjayIgImNhdCB0MS4kZXh0IHwgJHtiYn0kdW5wYWNrOyBlY2hvIFwkPyIKKworZXhwZWN0ZWQ9Im9rXG4iCitwcmVwOyBjaGVjayAiJHVucGFjazogZGVsZXRlIHNyYyIgIiR7YmJ9JHVucGFjayB0Mi4kZXh0OyB0ZXN0ICEgLWYgdDIuJGV4dCAmJiBlY2hvIG9rIgorCispCitybSAtcmYgdGVzdGRpcgorCisjIFRoaXMgdGVzdCBpcyBvbmx5IGZvciBidW56aXAyCitpZiB0ZXN0ICIkezAjIyovfSIgPSAiYnVuemlwMi50ZXN0cyI7IHRoZW4KKyAgICBpZiB0ZXN0MV9iejIgfCAke2JifWJ1bnppcDIgPi9kZXYvbnVsbCBcCisJJiYgdGVzdCAiYHRlc3QxX2J6MiB8ICR7YmJ9YnVuemlwMiB8IG1kNXN1bWAiID0gIjYxYmJlZWU0YmU5YzZmMTEwYTcxNDQ3ZjU4NGZkYTdiICAtIgorICAgIHRoZW4KKwllY2hvICJQQVNTOiAkdW5wYWNrOiB0ZXN0X2J6MiBmaWxlIgorICAgIGVsc2UKKwllY2hvICJGQUlMOiAkdW5wYWNrOiB0ZXN0X2J6MiBmaWxlIgorCUZBSUxDT1VOVD0kKChGQUlMQ09VTlQgKyAxKSkKKyAgICBmaQorCisgICAgaWYgcGJ6aXBfNG1femVyb3MgfCAke2JifWJ1bnppcDIgPi9kZXYvbnVsbCBcCisJJiYgdGVzdCAiYHBiemlwXzRtX3plcm9zIHwgJHtiYn1idW56aXAyIHwgbWQ1c3VtYCIgPSAiYjVjZmE5ZDZjOGZlYmQ2MThmOTFhYzI4NDNkNTBhMWMgIC0iCisgICAgdGhlbgorCWVjaG8gIlBBU1M6ICR1bnBhY2s6IHBiemlwXzRtX3plcm9zIGZpbGUiCisgICAgZWxzZQorCWVjaG8gIkZBSUw6ICR1bnBhY2s6IHBiemlwXzRtX3plcm9zIGZpbGUiCisJRkFJTENPVU5UPSQoKEZBSUxDT1VOVCArIDEpKQorICAgIGZpCitmaQorCitleGl0ICQoKEZBSUxDT1VOVCA8PSAyNTUgPyBGQUlMQ09VTlQgOiAyNTUpKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZWFkcy1mcm9tLXN0YW5kYXJkLWlucHV0IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZWFkcy1mcm9tLXN0YW5kYXJkLWlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTJhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYnVuemlwMi9idW56aXAyLXJlYWRzLWZyb20tc3RhbmRhcmQtaW5wdXQKQEAgLTAsMCArMSwyIEBACitlY2hvIGZvbyB8IGJ6aXAyIHwgYnVzeWJveCBidW56aXAyID4gb3V0cHV0CitlY2hvIGZvbyB8IGNtcCAtIG91dHB1dApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZW1vdmVzLWNvbXByZXNzZWQtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9idW56aXAyL2J1bnppcDItcmVtb3Zlcy1jb21wcmVzc2VkLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMTU1MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9idW56aXAyL2J1bnppcDItcmVtb3Zlcy1jb21wcmVzc2VkLWZpbGUKQEAgLTAsMCArMSwzIEBACitlY2hvIGZvbyB8IGJ6aXAyID5mb28uYnoyCitidXN5Ym94IGJ1bnppcDIgZm9vLmJ6MgordGVzdCAhIC1mIGZvby5iejIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9idW56aXAyL2J6Y2F0LWRvZXMtbm90LXJlbW92ZS1jb21wcmVzc2VkLWZpbGUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYnVuemlwMi9iemNhdC1kb2VzLW5vdC1yZW1vdmUtY29tcHJlc3NlZC1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDAxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvYnVuemlwMi9iemNhdC1kb2VzLW5vdC1yZW1vdmUtY29tcHJlc3NlZC1maWxlCkBAIC0wLDAgKzEsMyBAQAorZWNobyBmb28gfCBiemlwMiA+Zm9vLmJ6MgorYnVzeWJveCBiemNhdCBmb28uYnoyCit0ZXN0IC1mIGZvby5iejIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9idXN5Ym94LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2J1c3lib3gudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRmZWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9idXN5Ym94LnRlc3RzCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9zaAorCisjIFRlc3RzIGZvciBidXN5Ym94IGFwcGxldCBpdHNlbGYuCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKK0hFTFBEVU1QPWB0cnVlIHwgYnVzeWJveCAyPiYxIHwgY2F0YAorCisjIFdlIG5lZWQgdG8gdGVzdCB1bmRlciBjYWxsaW5nIHRoZSBiaW5hcnkgdW5kZXIgb3RoZXIgbmFtZXMuCisKK29wdGlvbmFsIEZFQVRVUkVfVkVSQk9TRV9VU0FHRQordGVzdGluZyAiYnVzeWJveCAtLWhlbHAgYnVzeWJveCIgInRydWUgfCBidXN5Ym94IC0taGVscCBidXN5Ym94IDI+JjEgfCBjYXQiICIkSEVMUERVTVBcblxuIiAiIiAiIgorU0tJUD0KKworbG4gLXMgYHdoaWNoIGJ1c3lib3hgIGJ1c3lib3gtc3VmZml4Citmb3IgaSBpbiBidXN5Ym94IC4vYnVzeWJveC1zdWZmaXgKK2RvCisJIyBUaGUgZ3JhdHVpdG91cyAiXG4icyBhcmUgZHVlIHRvIGEgc2hlbGwgaWRpb3N5bmNyYXN5OgorCSMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNlZW0gdG8gc3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworCXRlc3RpbmcgIiIgIiRpIiAiJEhFTFBEVU1QXG5cbiIgIiIgIiIKKworCXRlc3RpbmcgIiRpIHVua25vd24iICIkaSB1bmtub3duIDI+JjEiIFwKKwkJInVua25vd246IGFwcGxldCBub3QgZm91bmRcbiIgIiIgIiIKKworCXRlc3RpbmcgIiRpIC0taGVscCIgIiRpIC0taGVscCAyPiYxIiAiJEhFTFBEVU1QXG5cbiIgIiIgIiIKKworCW9wdGlvbmFsIEZFQVRVUkVfVkVSQk9TRV9VU0FHRSBDQVQKKwl0ZXN0aW5nICIiICIkaSBjYXQiICJtb28iICIiICJtb28iCisJdGVzdGluZyAiJGkgLS1oZWxwIGNhdCIgIiRpIC0taGVscCBjYXQgMj4mMSB8IGdyZXAgcHJpbnQiIFwKKwkJIkNvbmNhdGVuYXRlIEZJTEVzIGFuZCBwcmludCB0aGVtIHRvIHN0ZG91dFxuIiAiIiAiIgorCVNLSVA9CisKKwl0ZXN0aW5nICIkaSAtLWhlbHAgdW5rbm93biIgIiRpIC0taGVscCB1bmtub3duIDI+JjEiIFwKKwkJInVua25vd246IGFwcGxldCBub3QgZm91bmRcbiIgIiIgIiIKK2RvbmUKK3JtIGJ1c3lib3gtc3VmZml4CisKK2xuIC1zIGB3aGljaCBidXN5Ym94YCB1bmtub3duCisKK3Rlc3RpbmcgImJ1c3lib3ggYXMgdW5rbm93biBuYW1lIiAiLi91bmtub3duIDI+JjEiIFwKKwkidW5rbm93bjogYXBwbGV0IG5vdCBmb3VuZFxuIiAiIiAiIgorcm0gdW5rbm93bgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9iemNhdC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9iemNhdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjRmM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2J6Y2F0LnRlc3RzCkBAIC0wLDAgKzEsNTQgQEAKKyMhL2Jpbi9zaAorCitGQUlMQ09VTlQ9MAorCitleHQ9YnoyCisKK2JiPSJidXN5Ym94ICIKKwordW5zZXQgTENfQUxMCit1bnNldCBMQ19NRVNTQUdFUwordW5zZXQgTEFORwordW5zZXQgTEFOR1VBR0UKKworaGVsbG9fZ3ooKSB7CisgICAgIyBHemlwcGVkICJIRUxMT1xuIgorICAgICNfX19fX19fX19fX19fX19fX19fX19fX19fIHZ2diB2dnYgdnZ2IHZ2diAtIG10aW1lCisgICAgJEVDSE8gLW5lICJceDFmXHg4Ylx4MDhceDAwXHg4NVx4MWRceGVmXHg0NVx4MDJceDAzXHhmM1x4NzBceGY1XHhmMVx4ZjFceGU3IgorICAgICRFQ0hPIC1uZSAiXHgwMlx4MDBceDZlXHhkN1x4YWNceGZkXHgwNlx4MDBceDAwXHgwMCIKK30KKworaGVsbG9fYnoyKCkgeworICAgICMgQnppcHBlZCAiSEVMTE9cbiIKKyAgICAkRUNITyAtbmUgIlx4NDJceDVhXHg2OFx4MzlceDMxXHg0MVx4NTlceDI2XHg1M1x4NTlceDViXHhiOFx4ZThceGEzXHgwMFx4MDAiCisgICAgJEVDSE8gLW5lICJceDAxXHg0NFx4MDBceDAwXHgxMFx4MDJceDQ0XHhhMFx4MDBceDMwXHhjZFx4MDBceGMzXHg0Nlx4MjlceDk3IgorICAgICRFQ0hPIC1uZSAiXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg1Ylx4YjhceGU4XHhhMyIKK30KKworcHJlcCgpIHsKKyAgICBybSAtZiB0KgorICAgIGhlbGxvXyRleHQgPnQxLiRleHQKKyAgICBoZWxsb18kZXh0ID50Mi4kZXh0Cit9CisKK2NoZWNrKCkgeworICAgIGV2YWwgJDIgPnRfYWN0dWFsIDI+JjEKKyAgICBpZiAkRUNITyAtbmUgIiRleHBlY3RlZCIgfCBjbXAgLSB0X2FjdHVhbDsgdGhlbgorCWVjaG8gIlBBU1M6ICQxIgorICAgIGVsc2UKKwllY2hvICJGQUlMOiAkMSIKKwlGQUlMQ09VTlQ9JCgoRkFJTENPVU5UICsgMSkpCisgICAgZmkKK30KKworbWtkaXIgdGVzdGRpciAyPi9kZXYvbnVsbAorKAorY2QgdGVzdGRpciB8fCB7IGVjaG8gImNhbm5vdCBjZCB0ZXN0ZGlyISI7IGV4aXQgMTsgfQorCitleHBlY3RlZD0iSEVMTE9cbm9rXG4iCitwcmVwOyBjaGVjayAiYnpjYXQ6IGRvbnQgZGVsZXRlIHNyYyIgIiR7YmJ9YnpjYXQgdDIuYnoyOyB0ZXN0IC1mIHQyLmJ6MiAmJiBlY2hvIG9rIgorCispCitybSAtcmYgdGVzdGRpcgorCitleGl0ICQoKEZBSUxDT1VOVCA8PSAyNTUgPyBGQUlMQ09VTlQgOiAyNTUpKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NhbC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jYWwudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTUwOWNmMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jYWwudGVzdHMKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJjYWwgMjAwMCIgImNhbCAxIDIwMDAiICJcCisgICAgSmFudWFyeSAyMDAwCitTdSBNbyBUdSBXZSBUaCBGciBTYQorICAgICAgICAgICAgICAgICAgIDEKKyAyICAzICA0ICA1ICA2ICA3ICA4CisgOSAxMCAxMSAxMiAxMyAxNCAxNQorMTYgMTcgMTggMTkgMjAgMjEgMjIKKzIzIDI0IDI1IDI2IDI3IDI4IDI5CiszMCAzMQorIiAiIiAiIgorCit0ZXN0IHgiJENPTkZJR19MT0NBTEVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIiA9IHgiMCIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1NUQVRJQyIgIT0geCJ5IiBcCismJiB0ZXN0IHgiJENPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVgiID0geCIiIFwKKyYmIHRlc3RpbmcgInVuaWNvZGUgY2FsIDIwMDAiICJMQU5HPXpoX1RXLnV0ZjggY2FsIDEgMjAwMCIgIlwKKyAgICDkuIDmnIggMjAwMAor5pelIOS4gCDkuowg5LiJIOWbmyDkupQg5YWtCisgICAgICAgICAgICAgICAgICAgMQorIDIgIDMgIDQgIDUgIDYgIDcgIDgKKyA5IDEwIDExIDEyIDEzIDE0IDE1CisxNiAxNyAxOCAxOSAyMCAyMSAyMgorMjMgMjQgMjUgMjYgMjcgMjggMjkKKzMwIDMxCisiICIiICIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NhdC9jYXQtcHJpbnRzLWEtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jYXQvY2F0LXByaW50cy1hLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmMzVhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jYXQvY2F0LXByaW50cy1hLWZpbGUKQEAgLTAsMCArMSwzIEBACitlY2hvIEkgV0FOVCA+IGZvbworYnVzeWJveCBjYXQgZm9vID5iYXIKK2NtcCBmb28gYmFyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY2F0L2NhdC1wcmludHMtYS1maWxlLWFuZC1zdGFuZGFyZC1pbnB1dCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jYXQvY2F0LXByaW50cy1hLWZpbGUtYW5kLXN0YW5kYXJkLWlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTIzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY2F0L2NhdC1wcmludHMtYS1maWxlLWFuZC1zdGFuZGFyZC1pbnB1dApAQCAtMCwwICsxLDcgQEAKK2VjaG8gSSBXQU5UID4gZm9vCitlY2hvIFNPTUVUSElORyB8IGJ1c3lib3ggY2F0IGZvbyAtID5iYXIKK2NhdCA+YmF6IDw8RU9GCitJIFdBTlQKK1NPTUVUSElORworRU9GCitjbXAgYmFyIGJhegpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NtcC9jbXAtZGV0ZWN0cy1kaWZmZXJlbmNlIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NtcC9jbXAtZGV0ZWN0cy1kaWZmZXJlbmNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YmI2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY21wL2NtcC1kZXRlY3RzLWRpZmZlcmVuY2UKQEAgLTAsMCArMSw5IEBACitlY2hvIGZvbyA+Zm9vCitlY2hvIGJhciA+YmFyCitzZXQgK2UKK2J1c3lib3ggY21wIC1zIGZvbyBiYXIKK2lmIFsgJD8gIT0gMCBdIDsgdGhlbgorCWV4aXQgMDsKK2ZpCisKK2V4aXQgMTsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jb21tLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NvbW0udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmY0ODE2OAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jb21tLnRlc3RzCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgImNvbW0gdGVzdCAxIiAiY29tbSBpbnB1dCAtIiAgICAgICAgICAgICAgIlx0MTIzXG4iIjQ1NlxuIiJhYmNcbiIiXHRkZWZcbiIgIjQ1NlxuYWJjXG4iICIxMjNcbmRlZlxuIgordGVzdGluZyAiY29tbSB0ZXN0IDIiICJjb21tIC0gaW5wdXQiICAgICAgICAgICAgICAiMTIzXG4iIlx0NDU2XG4iIlx0YWJjXG4iImRlZlxuIiAiNDU2XG5hYmNcbiIgIjEyM1xuZGVmXG4iCit0ZXN0aW5nICJjb21tIHRlc3QgMyIgImNvbW0gaW5wdXQgLSIgICAgICAgICAgICAgICJhYmNcbiIiXHRkZWZcbiIieHl6XG4iICAgICAgICAgICJhYmNcbnh5elxuIiAiZGVmXG4iCit0ZXN0aW5nICJjb21tIHRlc3QgNCIgImNvbW0gLSBpbnB1dCIgICAgICAgICAgICAgICJcdGFiY1xuIiJkZWZcbiIiXHR4eXpcbiIgICAgICAgICJhYmNcbnh5elxuIiAiZGVmXG4iCit0ZXN0aW5nICJjb21tIHRlc3QgNSIgImNvbW0gaW5wdXQgLSIgICAgICAgICAgICAgICIxMjNcbiIiYWJjXG4iIlx0ZGVmXG4iICAgICAgICAgICIxMjNcbmFiY1xuIiAiZGVmXG4iCit0ZXN0aW5nICJjb21tIHRlc3QgNiIgImNvbW0gLSBpbnB1dCIgICAgICAgICAgICAgICJcdDEyM1xuIiJcdGFiY1xuIiJkZWZcbiIgICAgICAgICIxMjNcbmFiY1xuIiAiZGVmXG4iCit0ZXN0aW5nICJjb21tIHVudGVybWluYXRlZCBsaW5lIDEiICJjb21tIGlucHV0IC0iICJhYmNcbiIiXHRkZWZcbiIgICAgICAgICAgICAgICAgICJhYmMiICAgICAgICAiZGVmIgordGVzdGluZyAiY29tbSB1bnRlcm1pbmF0ZWQgbGluZSAyIiAiY29tbSAtIGlucHV0IiAiXHRhYmNcbiIiZGVmXG4iICAgICAgICAgICAgICAgICAiYWJjIiAgICAgICAgImRlZiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzNjZDg3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC50ZXN0cwpAQCAtMCwwICsxLDIwNiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgT3BlbmluZyBxdW90ZSBpbiAib21pdHRpbmcgZGlyZWN0b3J5ICdkaXInIiBtZXNzYWdlOgorc3E9J2AnICAjIEdOVSBjcDogYAorc3E9IiciICAjIGJib3ggY3A6ICcKKworcm0gLXJmIGNwLnRlc3RkaXIgPi9kZXYvbnVsbAorCitta2RpciBjcC50ZXN0ZGlyCitta2RpciBjcC50ZXN0ZGlyL2RpcgorPiBjcC50ZXN0ZGlyL2Rpci9maWxlCitsbiAtcyBmaWxlIGNwLnRlc3RkaXIvZGlyL2ZpbGVfc3ltbGluaworCis+IGNwLnRlc3RkaXIvZmlsZQorbG4gLXMgZmlsZSBjcC50ZXN0ZGlyL2ZpbGVfc3ltbGluaworbG4gLXMgZGlyIGNwLnRlc3RkaXIvZGlyX3N5bWxpbmsKKworCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdGluZyAiY3AiICdcCitjZCBjcC50ZXN0ZGlyIHx8IGV4aXQgMTsgY3AgKiAuLi9jcC50ZXN0ZGlyMiAyPiYxOyBlY2hvICQ/OyBjZCAuLi9jcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3QgISAtTCBmaWxlICAgICAgICAgJiYgdGVzdCAgIC1mIGZpbGUgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGZpbGUKK3Rlc3QgISAtTCBmaWxlX3N5bWxpbmsgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAmJiB0ZXN0ICEgLWUgZGlyICAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZGlyCit0ZXN0ICEgLUwgZGlyX3N5bWxpbmsgICYmIHRlc3QgISAtZSBkaXJfc3ltbGluayAgICAgIHx8IGVjaG8gQkFEOiBkaXJfc3ltbGluaworJyAiXAorY3A6IG9taXR0aW5nIGRpcmVjdG9yeSAke3NxfWRpcicKK2NwOiBvbWl0dGluZyBkaXJlY3RvcnkgJHtzcX1kaXJfc3ltbGluaycKKzEKKyIgIiIgIiIKKworcm0gLXJmIGNwLnRlc3RkaXIyID4vZGV2L251bGwgJiYgbWtkaXIgY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0aW5nICJjcCAtZCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtZCAqIC4uL2NwLnRlc3RkaXIyIDI+JjE7IGVjaG8gJD87IGNkIC4uL2NwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdCAhIC1MIGZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAgIC1MIGZpbGVfc3ltbGluayAmJiB0ZXN0ICAgLWYgZmlsZV9zeW1saW5rICAgICB8fCBlY2hvIEJBRDogZmlsZV9zeW1saW5rCit0ZXN0ICEgLUwgZGlyICAgICAgICAgICYmIHRlc3QgISAtZSBkaXIgICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIKK3Rlc3QgICAtTCBkaXJfc3ltbGluayAgJiYgdGVzdCAhIC1lIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCisnICJcCitjcDogb21pdHRpbmcgZGlyZWN0b3J5ICR7c3F9ZGlyJworMQorIiAiIiAiIgorCitybSAtcmYgY3AudGVzdGRpcjIgPi9kZXYvbnVsbCAmJiBta2RpciBjcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3RpbmcgImNwIC1QIiAnXAorY2QgY3AudGVzdGRpciB8fCBleGl0IDE7IGNwIC1QICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICYmIHRlc3QgICAtZiBmaWxlICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBmaWxlCit0ZXN0ICAgLUwgZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBmaWxlX3N5bWxpbmsgICAgIHx8IGVjaG8gQkFEOiBmaWxlX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIgICAgICAgICAgJiYgdGVzdCAhIC1lIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAgIC1MIGRpcl9zeW1saW5rICAmJiB0ZXN0ICEgLWUgZGlyX3N5bWxpbmsgICAgICB8fCBlY2hvIEJBRDogZGlyX3N5bWxpbmsKKycgIlwKK2NwOiBvbWl0dGluZyBkaXJlY3RvcnkgJHtzcX1kaXInCisxCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdGluZyAiY3AgLUwiICdcCitjZCBjcC50ZXN0ZGlyIHx8IGV4aXQgMTsgY3AgLUwgKiAuLi9jcC50ZXN0ZGlyMiAyPiYxOyBlY2hvICQ/OyBjZCAuLi9jcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3QgISAtTCBmaWxlICAgICAgICAgJiYgdGVzdCAgIC1mIGZpbGUgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGZpbGUKK3Rlc3QgISAtTCBmaWxlX3N5bWxpbmsgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAmJiB0ZXN0ICEgLWUgZGlyICAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZGlyCit0ZXN0ICEgLUwgZGlyX3N5bWxpbmsgICYmIHRlc3QgISAtZSBkaXJfc3ltbGluayAgICAgIHx8IGVjaG8gQkFEOiBkaXJfc3ltbGluaworJyAiXAorY3A6IG9taXR0aW5nIGRpcmVjdG9yeSAke3NxfWRpcicKK2NwOiBvbWl0dGluZyBkaXJlY3RvcnkgJHtzcX1kaXJfc3ltbGluaycKKzEKKyIgIiIgIiIKKworcm0gLXJmIGNwLnRlc3RkaXIyID4vZGV2L251bGwgJiYgbWtkaXIgY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0aW5nICJjcCAtSCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtSCAqIC4uL2NwLnRlc3RkaXIyIDI+JjE7IGVjaG8gJD87IGNkIC4uL2NwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdCAhIC1MIGZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAhIC1MIGZpbGVfc3ltbGluayAmJiB0ZXN0ICAgLWYgZmlsZV9zeW1saW5rICAgICB8fCBlY2hvIEJBRDogZmlsZV9zeW1saW5rCit0ZXN0ICEgLUwgZGlyICAgICAgICAgICYmIHRlc3QgISAtZSBkaXIgICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIKK3Rlc3QgISAtTCBkaXJfc3ltbGluayAgJiYgdGVzdCAhIC1lIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCisnICJcCitjcDogb21pdHRpbmcgZGlyZWN0b3J5ICR7c3F9ZGlyJworY3A6IG9taXR0aW5nIGRpcmVjdG9yeSAke3NxfWRpcl9zeW1saW5rJworMQorIiAiIiAiIgorCitybSAtcmYgY3AudGVzdGRpcjIgPi9kZXYvbnVsbCAmJiBta2RpciBjcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3RpbmcgImNwIC1SIiAnXAorY2QgY3AudGVzdGRpciB8fCBleGl0IDE7IGNwIC1SICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAgIC1MIGZpbGVfc3ltbGluayAgICAgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAgICAgJiYgdGVzdCAgIC1kIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAgIC1MIGRpcl9zeW1saW5rICAgICAgJiYgdGVzdCAgIC1kIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCit0ZXN0ICEgLUwgZGlyL2ZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGUgICAgICAgICB8fCBlY2hvIEJBRDogZGlyL2ZpbGUKK3Rlc3QgICAtTCBkaXIvZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBkaXIvZmlsZV9zeW1saW5rIHx8IGVjaG8gQkFEOiBkaXIvZmlsZV9zeW1saW5rCisnICJcCiswCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdGluZyAiY3AgLVJkIiAnXAorY2QgY3AudGVzdGRpciB8fCBleGl0IDE7IGNwIC1SZCAqIC4uL2NwLnRlc3RkaXIyIDI+JjE7IGVjaG8gJD87IGNkIC4uL2NwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdCAhIC1MIGZpbGUgICAgICAgICAgICAgJiYgdGVzdCAgIC1mIGZpbGUgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGZpbGUKK3Rlc3QgICAtTCBmaWxlX3N5bWxpbmsgICAgICYmIHRlc3QgICAtZiBmaWxlX3N5bWxpbmsgICAgIHx8IGVjaG8gQkFEOiBmaWxlX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIgICAgICAgICAgICAgICYmIHRlc3QgICAtZCBkaXIgICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIKK3Rlc3QgICAtTCBkaXJfc3ltbGluayAgICAgICYmIHRlc3QgICAtZCBkaXJfc3ltbGluayAgICAgIHx8IGVjaG8gQkFEOiBkaXJfc3ltbGluawordGVzdCAhIC1MIGRpci9maWxlICAgICAgICAgJiYgdGVzdCAgIC1mIGRpci9maWxlICAgICAgICAgfHwgZWNobyBCQUQ6IGRpci9maWxlCit0ZXN0ICAgLUwgZGlyL2ZpbGVfc3ltbGluayAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGVfc3ltbGluayB8fCBlY2hvIEJBRDogZGlyL2ZpbGVfc3ltbGluaworJyAiXAorMAorIiAiIiAiIgorCitybSAtcmYgY3AudGVzdGRpcjIgPi9kZXYvbnVsbCAmJiBta2RpciBjcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3RpbmcgImNwIC1SUCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtUlAgKiAuLi9jcC50ZXN0ZGlyMiAyPiYxOyBlY2hvICQ/OyBjZCAuLi9jcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3QgISAtTCBmaWxlICAgICAgICAgICAgICYmIHRlc3QgICAtZiBmaWxlICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBmaWxlCit0ZXN0ICAgLUwgZmlsZV9zeW1saW5rICAgICAmJiB0ZXN0ICAgLWYgZmlsZV9zeW1saW5rICAgICB8fCBlY2hvIEJBRDogZmlsZV9zeW1saW5rCit0ZXN0ICEgLUwgZGlyICAgICAgICAgICAgICAmJiB0ZXN0ICAgLWQgZGlyICAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZGlyCit0ZXN0ICAgLUwgZGlyX3N5bWxpbmsgICAgICAmJiB0ZXN0ICAgLWQgZGlyX3N5bWxpbmsgICAgICB8fCBlY2hvIEJBRDogZGlyX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIvZmlsZSAgICAgICAgICYmIHRlc3QgICAtZiBkaXIvZmlsZSAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIvZmlsZQordGVzdCAgIC1MIGRpci9maWxlX3N5bWxpbmsgJiYgdGVzdCAgIC1mIGRpci9maWxlX3N5bWxpbmsgfHwgZWNobyBCQUQ6IGRpci9maWxlX3N5bWxpbmsKKycgIlwKKzAKKyIgIiIgIiIKKworcm0gLXJmIGNwLnRlc3RkaXIyID4vZGV2L251bGwgJiYgbWtkaXIgY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0aW5nICJjcCAtUkwiICdcCitjZCBjcC50ZXN0ZGlyIHx8IGV4aXQgMTsgY3AgLVJMICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAhIC1MIGZpbGVfc3ltbGluayAgICAgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAgICAgJiYgdGVzdCAgIC1kIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAhIC1MIGRpcl9zeW1saW5rICAgICAgJiYgdGVzdCAgIC1kIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCit0ZXN0ICEgLUwgZGlyL2ZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGUgICAgICAgICB8fCBlY2hvIEJBRDogZGlyL2ZpbGUKK3Rlc3QgISAtTCBkaXIvZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBkaXIvZmlsZV9zeW1saW5rIHx8IGVjaG8gQkFEOiBkaXIvZmlsZV9zeW1saW5rCisnICJcCiswCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQorIyBHTlUgY29yZXV0aWxzIDcuMiBzYXlzOgorIyBjcDogd2lsbCBub3QgY3JlYXRlIGhhcmQgbGluayBgLi4vY3AudGVzdGRpcjIvZGlyX3N5bWxpbmsnIHRvIGRpcmVjdG9yeSBgLi4vY3AudGVzdGRpcjIvZGlyJwordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIFwKK3Rlc3RpbmcgImNwIC1SSCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtUkggKiAuLi9jcC50ZXN0ZGlyMiAyPiYxOyBlY2hvICQ/OyBjZCAuLi9jcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3QgISAtTCBmaWxlICAgICAgICAgICAgICYmIHRlc3QgICAtZiBmaWxlICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBmaWxlCit0ZXN0ICEgLUwgZmlsZV9zeW1saW5rICAgICAmJiB0ZXN0ICAgLWYgZmlsZV9zeW1saW5rICAgICB8fCBlY2hvIEJBRDogZmlsZV9zeW1saW5rCit0ZXN0ICEgLUwgZGlyICAgICAgICAgICAgICAmJiB0ZXN0ICAgLWQgZGlyICAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZGlyCit0ZXN0ICEgLUwgZGlyX3N5bWxpbmsgICAgICAmJiB0ZXN0ICAgLWQgZGlyX3N5bWxpbmsgICAgICB8fCBlY2hvIEJBRDogZGlyX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIvZmlsZSAgICAgICAgICYmIHRlc3QgICAtZiBkaXIvZmlsZSAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIvZmlsZQordGVzdCAgIC1MIGRpci9maWxlX3N5bWxpbmsgJiYgdGVzdCAgIC1mIGRpci9maWxlX3N5bWxpbmsgfHwgZWNobyBCQUQ6IGRpci9maWxlX3N5bWxpbmsKKycgIlwKKzAKKyIgIiIgIiIKKworcm0gLXJmIGNwLnRlc3RkaXIyID4vZGV2L251bGwgJiYgbWtkaXIgY3AudGVzdGRpcjIgfHwgZXhpdCAxCisjIEdOVSBjb3JldXRpbHMgNy4yIHNheXM6CisjIGNwOiB3aWxsIG5vdCBjcmVhdGUgaGFyZCBsaW5rIGAuLi9jcC50ZXN0ZGlyMi9kaXJfc3ltbGluaycgdG8gZGlyZWN0b3J5IGAuLi9jcC50ZXN0ZGlyMi9kaXInCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgXAordGVzdGluZyAiY3AgLVJIUCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtUkhQICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAhIC1MIGZpbGVfc3ltbGluayAgICAgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAgICAgJiYgdGVzdCAgIC1kIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAhIC1MIGRpcl9zeW1saW5rICAgICAgJiYgdGVzdCAgIC1kIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCit0ZXN0ICEgLUwgZGlyL2ZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGUgICAgICAgICB8fCBlY2hvIEJBRDogZGlyL2ZpbGUKK3Rlc3QgICAtTCBkaXIvZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBkaXIvZmlsZV9zeW1saW5rIHx8IGVjaG8gQkFEOiBkaXIvZmlsZV9zeW1saW5rCisnICJcCiswCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdGluZyAiY3AgLVJITCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtUkhMICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAhIC1MIGZpbGVfc3ltbGluayAgICAgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAgICAgJiYgdGVzdCAgIC1kIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAhIC1MIGRpcl9zeW1saW5rICAgICAgJiYgdGVzdCAgIC1kIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCit0ZXN0ICEgLUwgZGlyL2ZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGUgICAgICAgICB8fCBlY2hvIEJBRDogZGlyL2ZpbGUKK3Rlc3QgISAtTCBkaXIvZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBkaXIvZmlsZV9zeW1saW5rIHx8IGVjaG8gQkFEOiBkaXIvZmlsZV9zeW1saW5rCisnICJcCiswCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQorIyBXb3chICJjcCAtUkxIIiBpcyBub3QgdGhlIHNhbWUgYXMgImNwIC1SSEwiIChwcmV2IHRlc3QpIQorIyBHTlUgY29yZXV0aWxzIDcuMiBzYXlzOgorIyBjcDogd2lsbCBub3QgY3JlYXRlIGhhcmQgbGluayBgLi4vY3AudGVzdGRpcjIvZGlyX3N5bWxpbmsnIHRvIGRpcmVjdG9yeSBgLi4vY3AudGVzdGRpcjIvZGlyJwordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIFwKK3Rlc3RpbmcgImNwIC1STEgiICdcCitjZCBjcC50ZXN0ZGlyIHx8IGV4aXQgMTsgY3AgLVJMSCAqIC4uL2NwLnRlc3RkaXIyIDI+JjE7IGVjaG8gJD87IGNkIC4uL2NwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdCAhIC1MIGZpbGUgICAgICAgICAgICAgJiYgdGVzdCAgIC1mIGZpbGUgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGZpbGUKK3Rlc3QgISAtTCBmaWxlX3N5bWxpbmsgICAgICYmIHRlc3QgICAtZiBmaWxlX3N5bWxpbmsgICAgIHx8IGVjaG8gQkFEOiBmaWxlX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIgICAgICAgICAgICAgICYmIHRlc3QgICAtZCBkaXIgICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIKK3Rlc3QgISAtTCBkaXJfc3ltbGluayAgICAgICYmIHRlc3QgICAtZCBkaXJfc3ltbGluayAgICAgIHx8IGVjaG8gQkFEOiBkaXJfc3ltbGluawordGVzdCAhIC1MIGRpci9maWxlICAgICAgICAgJiYgdGVzdCAgIC1mIGRpci9maWxlICAgICAgICAgfHwgZWNobyBCQUQ6IGRpci9maWxlCit0ZXN0ICEgLUwgZGlyL2ZpbGVfc3ltbGluayAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGVfc3ltbGluayB8fCBlY2hvIEJBRDogZGlyL2ZpbGVfc3ltbGluaworJyAiXAorMAorIiAiIiAiIgorCisKKyMgQ2xlYW4gdXAKK3JtIC1yZiBjcC50ZXN0ZGlyIGNwLnRlc3RkaXIyIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLVJITC1kb2VzX25vdF9wcmVzZXJ2ZS1saW5rcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1SSEwtZG9lc19ub3RfcHJlc2VydmUtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkNmMzZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1SSEwtZG9lc19ub3RfcHJlc2VydmUtbGlua3MKQEAgLTAsMCArMSw2IEBACitta2RpciBhCis+YS9maWxlCitsbiAtcyBmaWxlIGEvbGluaworYnVzeWJveCBjcCAtUkhMIGEgYgordGVzdCAhIC1MIGIvbGluaworI3NoIDwvZGV2L3R0eSA+L2Rldi90dHkgMj4mMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWEtZmlsZXMtdG8tZGlyIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWEtZmlsZXMtdG8tZGlyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTllZjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtYS1maWxlcy10by1kaXIKQEAgLTAsMCArMSwxNSBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBmaWxlMgorbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIGRpcjEKKyMgd2h5Pz8/CisjVFo9VVRDMCB0b3VjaCAtZCAnMjAwMC0wMS0zMCAwNToyNDowOCcgZGlyMS9maWxlMworbWtkaXIgdGhlcmUKK2J1c3lib3ggY3AgLWEgZmlsZTEgZmlsZTIgbGluazEgZGlyMSB0aGVyZQordGVzdCAtZiB0aGVyZS9maWxlMQordGVzdCAtZiB0aGVyZS9maWxlMgordGVzdCAhIC1zIHRoZXJlL2RpcjEvZmlsZTMKK3Rlc3QgLUwgdGhlcmUvbGluazEKK3Rlc3QgeGZpbGUyID0geGByZWFkbGluayB0aGVyZS9saW5rMWAKK3Rlc3QgISBkaXIxL2ZpbGUzIC1vdCB0aGVyZS9kaXIxL2ZpbGUzCit0ZXN0ICEgZGlyMS9maWxlMyAtbnQgdGhlcmUvZGlyMS9maWxlMwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWEtcHJlc2VydmVzLWxpbmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWEtcHJlc2VydmVzLWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMGNkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtYS1wcmVzZXJ2ZXMtbGlua3MKQEAgLTAsMCArMSw1IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggY3AgLWEgYmFyIGJhegordGVzdCAtTCBiYXoKK3Rlc3QgeGZvbyA9IHhgcmVhZGxpbmsgYmF6YApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWNvcGllcy1lbXB0eS1maWxlIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWNvcGllcy1lbXB0eS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjVhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtY29waWVzLWVtcHR5LWZpbGUKQEAgLTAsMCArMSwzIEBACit0b3VjaCBmb28KK2J1c3lib3ggY3AgZm9vIGJhcgorY21wIGZvbyBiYXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1jb3BpZXMtbGFyZ2UtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1jb3BpZXMtbGFyZ2UtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjIyNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWNvcGllcy1sYXJnZS1maWxlCkBAIC0wLDAgKzEsMyBAQAorZGQgaWY9L2Rldi96ZXJvIG9mPWZvbyBzZWVrPTEwayBjb3VudD0xIDI+L2Rldi9udWxsCitidXN5Ym94IGNwIGZvbyBiYXIKK2NtcCBmb28gYmFyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtY29waWVzLXNtYWxsLWZpbGUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtY29waWVzLXNtYWxsLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyYTg4NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1jb3BpZXMtc21hbGwtZmlsZQpAQCAtMCwwICsxLDMgQEAKK2VjaG8gSSBXQU5UID4gZm9vCitidXN5Ym94IGNwIGZvbyBiYXIKK2NtcCBmb28gYmFyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtZC1maWxlcy10by1kaXIgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtZC1maWxlcy10by1kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MWE1NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1kLWZpbGVzLXRvLWRpcgpAQCAtMCwwICsxLDExIEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitlY2hvIGZpbGUgbnVtYmVyIHR3byA+IGZpbGUyCit0b3VjaCBmaWxlMworbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIHRoZXJlCitidXN5Ym94IGNwIC1kIGZpbGUxIGZpbGUyIGZpbGUzIGxpbmsxIHRoZXJlCit0ZXN0IC1mIHRoZXJlL2ZpbGUxCit0ZXN0IC1mIHRoZXJlL2ZpbGUyCit0ZXN0ICEgLXMgdGhlcmUvZmlsZTMKK3Rlc3QgLUwgdGhlcmUvbGluazEKK3Rlc3QgeGZpbGUyID0geGByZWFkbGluayB0aGVyZS9saW5rMWAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1kZXYtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1kZXYtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTVmMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWRldi1maWxlCkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCBjcCAvZGV2L251bGwgZm9vCit0ZXN0IC1mIGZvbwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWRpci1jcmVhdGUtZGlyIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWRpci1jcmVhdGUtZGlyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDdiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtZGlyLWNyZWF0ZS1kaXIKQEAgLTAsMCArMSw0IEBACitta2RpciBiYXIKK3RvdWNoIGJhci9iYXoKK2J1c3lib3ggY3AgLVIgYmFyIGZvbwordGVzdCAtZiBmb28vYmF6CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtZGlyLWV4aXN0aW5nLWRpciBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1kaXItZXhpc3RpbmctZGlyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNzg4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtZGlyLWV4aXN0aW5nLWRpcgpAQCAtMCwwICsxLDUgQEAKK21rZGlyIGJhcgordG91Y2ggYmFyL2JhegorbWtkaXIgZm9vCitidXN5Ym94IGNwIC1SIGJhciBmb28KK3Rlc3QgLWYgZm9vL2Jhci9iYXoKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1kb2VzLW5vdC1jb3B5LXVucmVhZGFibGUtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1kb2VzLW5vdC1jb3B5LXVucmVhZGFibGUtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdlOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWRvZXMtbm90LWNvcHktdW5yZWFkYWJsZS1maWxlCkBAIC0wLDAgKzEsMTEgQEAKK3RvdWNoIGZvbworY2htb2QgYS1yIGZvbworc2V0ICtlCitpZiB0ZXN0IGBpZCAtdWAgPSAwOyB0aGVuCisgICAgIyBydW4gYXMgdXNlciB3aXRoIG5vbnplcm8gdWlkCisgICAgc2V0dWlkZ2lkIDEgYnVzeWJveCBjcCBmb28gYmFyCitlbHNlCisgICAgYnVzeWJveCBjcCBmb28gYmFyCitmaQorc2V0IC1lCit0ZXN0ICEgLWYgYmFyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtZmlsZXMtdG8tZGlyIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWZpbGVzLXRvLWRpcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI4MTkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWZpbGVzLXRvLWRpcgpAQCAtMCwwICsxLDExIEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitlY2hvIGZpbGUgbnVtYmVyIHR3byA+IGZpbGUyCit0b3VjaCBmaWxlMworbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIHRoZXJlCitidXN5Ym94IGNwIGZpbGUxIGZpbGUyIGZpbGUzIGxpbmsxIHRoZXJlCit0ZXN0IC1mIHRoZXJlL2ZpbGUxCit0ZXN0IC1mIHRoZXJlL2ZpbGUyCit0ZXN0ICEgLXMgdGhlcmUvZmlsZTMKK3Rlc3QgLWYgdGhlcmUvbGluazEKK2NtcCB0aGVyZS9maWxlMiB0aGVyZS9saW5rMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWZvbGxvd3MtbGlua3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtZm9sbG93cy1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDlmMDVlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLWZvbGxvd3MtbGlua3MKQEAgLTAsMCArMSw0IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggY3AgYmFyIGJhegordGVzdCAtZiBiYXoKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1wYXJlbnRzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLXBhcmVudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3YzE2MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1wYXJlbnRzCkBAIC0wLDAgKzEsNiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlMKK21rZGlyIC1wIGZvby9iYXIvYmF6Cit0b3VjaCBmb28vYmFyL2Jhei9maWxlCitta2RpciBkaXIKK2J1c3lib3ggY3AgLS1wYXJlbnRzIGZvby9iYXIvYmF6L2ZpbGUgZGlyCit0ZXN0IC1mIGRpci9mb28vYmFyL2Jhei9maWxlCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtcHJlc2VydmVzLWhhcmQtbGlua3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtcHJlc2VydmVzLWhhcmQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlN2I4NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jcC9jcC1wcmVzZXJ2ZXMtaGFyZC1saW5rcwpAQCAtMCwwICsxLDYgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTCit0b3VjaCBmb28KK2xuIGZvbyBiYXIKK21rZGlyIGJhegorYnVzeWJveCBjcCAtZCBmb28gYmFyIGJhegordGVzdCBiYXovZm9vIC1lZiBiYXovYmFyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtcHJlc2VydmVzLWxpbmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLXByZXNlcnZlcy1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFkYzVmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLXByZXNlcnZlcy1saW5rcwpAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbworbG4gLXMgZm9vIGJhcgorYnVzeWJveCBjcCAtZCBiYXIgYmF6Cit0ZXN0IC1MIGJhegordGVzdCB4Zm9vID0geGByZWFkbGluayBiYXpgCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3AvY3AtcHJlc2VydmVzLXNvdXJjZS1maWxlIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLXByZXNlcnZlcy1zb3VyY2UtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGY1MDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwL2NwLXByZXNlcnZlcy1zb3VyY2UtZmlsZQpAQCAtMCwwICsxLDMgQEAKK3RvdWNoIGZvbworYnVzeWJveCBjcCBmb28gYmFyCit0ZXN0IC1mIGZvbwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwaW8udGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3Bpby50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Y2Q0NDFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2NwaW8udGVzdHMKQEAgLTAsMCArMSwxMzMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCit1bWFzayAwMjIKKworIyBscyAtbG4gc2hvd3MgZGF0ZS4gTmVlZCB0byByZW1vdmUgdGhhdCwgaXQncyB2YXJpYWJsZS4KKyMgc2VkOiBjb2FsZXNjZSBzcGFjZXMKKyMgY3V0OiByZW1vdmUgZGF0ZQorIyBncmVwOiByZW1vdmUgInRvdGFsIE5OTiIgbGluZXMKK0ZJTFRFUl9MUz0ic2VkICdzLyAgKi8gL2cnIHwgY3V0IC1kJyAnIC1mIDEtNSw5LSB8IGdyZXAgLXYgJ150b3RhbCAnIgorCisKKyMgbmV3YyBjcGlvIGFyY2hpdmUgb2YgZGlyZWN0b3J5IGNwaW8udGVzdGRpciB3aXRoIGVtcHR5IHggYW5kIHkgaGFyZGxpbmtzCitoZXhkdW1wPSJcCitceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHg2NFx4MWVceDkxXHg4Y1x4MDBceDAwXAorXHg0OFx4N2ZceDgwXHg0Y1x4NDhceDA4XHgwMFx4MjhceDAxXHhmZlx4ZTBceDNmXHgyNFx4MTRceDAwXHgwZVwKK1x4MjBceGRjXHg2MFx4MjBceDAwXHg5Mlx4MTFceGVhXHhhMFx4MWFceDAwXHgwMFx4MDBceDAzXHgyMFx4OGFcCitceDkzXHhkNFx4OWFceDY4XHgxYVx4MGRceDFlXHg5MVx4YTFceGEwXHgwNlx4OThceGUzXHg1Y1x4MmZceGQ5XAorXHgyNlx4YTFceDI1XHgyNFx4MjBceGVkXHg0N1x4YzdceDIxXHg0MFx4MmJceDZlXHhmMlx4ZTZceGZlXHg5OFwKK1x4MTNceDY4XHhhOFx4YmRceDgyXHhiMlx4NGZceDI2XHgwMlx4MjRceDE2XHg1Ylx4MjJceDE2XHg3Mlx4NzRcCitceDE1XHhjZFx4YzFceGE2XHg5ZVx4YTZceDVlXHg2Y1x4MTZceDM3XHgzNVx4MDFceDk5XHhjNFx4ODFceDIxXAorXHgyOVx4MjhceDRiXHg2OVx4NTFceGE5XHgzY1x4MWFceDliXHgwYVx4ZTFceGU0XHhiNFx4YWZceDg1XHg3M1wKK1x4YmFceDIzXHgxMFx4NTlceGU4XHhiM1x4ZTFceGExXHg2M1x4MDVceDhjXHg0Zlx4YzVceGRjXHg5MVx4NGVcCitceDE0XHgyNFx4MTlceDA3XHhhNFx4NjNceDAwIgorCit1c2VyPSQoaWQgLXUpCitncm91cD0kKGlkIC1nKQorCitybSAtcmYgY3Bpby50ZXN0ZGlyIGNwaW8udGVzdGRpcjIgMj4vZGV2L251bGwKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCitvcHRpb25hbCBGRUFUVVJFX0xTX1NPUlRGSUxFUyBGRUFUVVJFX0xTX1RJTUVTVEFNUFMKK3Rlc3RpbmcgImNwaW8gZXh0cmFjdHMgemVyby1zaXplZCBoYXJkbGlua3MiIFwKKyIkRUNITyAtbmUgJyRoZXhkdW1wJyB8IGJ6Y2F0IHwgY3BpbyAtaSAyPiYxOyBlY2hvIFwkPzsKK2xzIC1sbiBjcGlvLnRlc3RkaXIgfCAkRklMVEVSX0xTIiBcCisiXAorMSBibG9ja3MKKzAKKy1ydy1yLS1yLS0gMiAkdXNlciAkZ3JvdXAgMCB4Cistcnctci0tci0tIDIgJHVzZXIgJGdyb3VwIDAgeQorIiAiIiAiIgorU0tJUD0KKworCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgeworIyBDdXJyZW50bHkgZmFpbHMuIE51bWVyb3VzIGJ1Z2xldHM6ICIxIGJsb2NrcyIgdmVyc3VzICIxIGJsb2NrIiwKKyMgZG9lcyBub3QgbGlzdCBjcGlvLnRlc3RkaXIveCBhbmQgY3Bpby50ZXN0ZGlyL3kKK3Rlc3RpbmcgImNwaW8gbGlzdHMgaGFyZGxpbmtzIiBcCisiJEVDSE8gLW5lICckaGV4ZHVtcCcgfCBiemNhdCB8IGNwaW8gLXQgMj4mMTsgZWNobyBcJD8iIFwKKyJcCitjcGlvLnRlc3RkaXIKK2NwaW8udGVzdGRpci94CitjcGlvLnRlc3RkaXIveQorMSBibG9ja3MKKzAKKyIgIiIgIiIKK30KKworCisjIE1vcmUgY29tcGxleCBjYXNlCitybSAtcmYgY3Bpby50ZXN0ZGlyIGNwaW8udGVzdGRpcjIgMj4vZGV2L251bGwKK21rZGlyIGNwaW8udGVzdGRpcgordG91Y2ggY3Bpby50ZXN0ZGlyL3NvbG8KK3RvdWNoIGNwaW8udGVzdGRpci9lbXB0eQorZWNobyB4ID5jcGlvLnRlc3RkaXIvbm9uZW1wdHkKK2xuIGNwaW8udGVzdGRpci9lbXB0eSBjcGlvLnRlc3RkaXIvZW1wdHkxCitsbiBjcGlvLnRlc3RkaXIvbm9uZW1wdHkgY3Bpby50ZXN0ZGlyL25vbmVtcHR5MQorbWtkaXIgY3Bpby50ZXN0ZGlyMgorCitvcHRpb25hbCBGRUFUVVJFX0NQSU9fTyBMT05HX09QVFMgRkVBVFVSRV9MU19TT1JURklMRVMgRkVBVFVSRV9MU19USU1FU1RBTVBTCit0ZXN0aW5nICJjcGlvIGV4dHJhY3RzIHplcm8tc2l6ZWQgaGFyZGxpbmtzIDIiIFwKKyJmaW5kIGNwaW8udGVzdGRpciB8IGNwaW8gLUggbmV3YyAtLWNyZWF0ZSB8IChjZCBjcGlvLnRlc3RkaXIyICYmIGNwaW8gLWkgMj4mMSk7IGVjaG8gXCQ/OworbHMgLWxuIGNwaW8udGVzdGRpcjIvY3Bpby50ZXN0ZGlyIHwgJEZJTFRFUl9MUyIgXAorIlwKKzIgYmxvY2tzCiswCistcnctci0tci0tIDIgJHVzZXIgJGdyb3VwIDAgZW1wdHkKKy1ydy1yLS1yLS0gMiAkdXNlciAkZ3JvdXAgMCBlbXB0eTEKKy1ydy1yLS1yLS0gMiAkdXNlciAkZ3JvdXAgMiBub25lbXB0eQorLXJ3LXItLXItLSAyICR1c2VyICRncm91cCAyIG5vbmVtcHR5MQorLXJ3LXItLXItLSAxICR1c2VyICRncm91cCAwIHNvbG8KKyIgIiIgIiIKK1NLSVA9CisKKyMgV2FzIHRyeWluZyB0byBjcmVhdGUgIi91c3IvYmluIiwgY29ycmVjdCBpcyAidXNyL2JpbiIuCitybSAtcmYgY3Bpby50ZXN0ZGlyCitvcHRpb25hbCBGRUFUVVJFX0NQSU9fUAordGVzdGluZyAiY3BpbyAtcCB3aXRoIGFic29sdXRlIHBhdGhzIiBcCisiZWNobyAvdXNyL2JpbiB8IGNwaW8gLWRwIGNwaW8udGVzdGRpciAyPiYxOyBlY2hvIFwkPzsKK2xzIGNwaW8udGVzdGRpciIgXAorIlwKKzEgYmxvY2tzCiswCit1c3IKKyIgIiIgIiIKK1NLSVA9CisKKyMgY2hvd24gb24gYSBsaW5rIHdhcyBhZmZlY3RpbmcgZmlsZSwgZHJvcHBpbmcgaXRzIHN1aWQvc2dpZCBiaXRzCitybSAtcmYgY3Bpby50ZXN0ZGlyCitvcHRpb25hbCBGRUFUVVJFX0NQSU9fTyBGRUFUVVJFX1NUQVRfRk9STUFUCitta2RpciBjcGlvLnRlc3RkaXIKK3RvdWNoIGNwaW8udGVzdGRpci9maWxlCitjaG1vZCA2NzU1IGNwaW8udGVzdGRpci9maWxlICAjIHNldHMgc3VpZC9zZ2lkIGJpdHMKK2xuIC1zZiBmaWxlIGNwaW8udGVzdGRpci9saW5rCit0ZXN0aW5nICJjcGlvIHJlc3RvcmVzIHN1aWQvc2dpZCBiaXRzIiBcCisiY2QgY3Bpby50ZXN0ZGlyICYmIHsgZWNobyBmaWxlOyBlY2hvIGxpbms7IH0gfCBjcGlvIC1vdkhuZXdjID5wYWNrLmNwaW8gJiYgcm0gPz8/PyAmJiBjcGlvIC1pZG12dSA8cGFjay5jcGlvIDI+L2Rldi9udWxsOworIHN0YXQgLWMgJyVhICVuJyBmaWxlIiBcCisiXAorZmlsZQorbGluaworNjc1NSBmaWxlCisiICIiICIiCitTS0lQPQorCisjIGF2b2lkICdub3QgY3JlYXRlZDogbmV3ZXIgb3Igc2FtZSBhZ2UgZmlsZSBleGlzdHMnIG1lc3NhZ2UgZm9yIGRpcmVjdG9yaWVzCitybSAtcmYgY3Bpby50ZXN0ZGlyIGNwaW8udGVzdGRpcjIgMj4vZGV2L251bGwKK21rZGlyIGNwaW8udGVzdGRpcgordGVzdGluZyAiY3BpbyBleHRyYWN0cyBpbiBleGlzdGluZyBkaXJlY3RvcnkiIFwKKyIkRUNITyAtbmUgJyRoZXhkdW1wJyB8IGJ6Y2F0IHwgY3BpbyAtaWQgMj4mMTsgZWNobyBcJD8iIFwKKyJcCisxIGJsb2NrcworMAorIiAiIiAiIgorU0tJUD0KKworIyBDbGVhbiB1cAorcm0gLXJmIGNwaW8udGVzdGRpciBjcGlvLnRlc3RkaXIyIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2N1dC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTEwMzQwMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDcgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKK3Rlc3RpbmcgImN1dCAnLScgKHN0ZGluKSBhbmQgbXVsdGkgZmlsZSBoYW5kbGluZyIgXAorCSJjdXQgLWQnICcgLWYyIC0gaW5wdXQiIFwKKwkib3ZlclxuIiJxdWlja1xuIiBcCisJInRoZSBxdWljayBicm93biBmb3hcbiIgXAorCSJqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ1xuIiBcCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWNoYXJhY3RlciBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jaGFyYWN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjNWVmYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jaGFyYWN0ZXIKQEAgLTAsMCArMSBAQAordGVzdCAkKGVjaG8gYWJjZCB8IGJ1c3lib3ggY3V0IC1jIDMpID0gYwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWNsb3NlZC1yYW5nZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jbG9zZWQtcmFuZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MGI3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jbG9zZWQtcmFuZ2UKQEAgLTAsMCArMSBAQAordGVzdCAkKGVjaG8gYWJjZCB8IGJ1c3lib3ggY3V0IC1jIDEtMikgPSBhYgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWZpZWxkIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWZpZWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDBiNmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWEtZmllbGQKQEAgLTAsMCArMSBAQAordGVzdCAkKCRFQ0hPIC1lICJmMVx0ZjJcdGYzIiB8IGJ1c3lib3ggY3V0IC1mIDIpID0gZjIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tb3Blbi1yYW5nZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tb3Blbi1yYW5nZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJmMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hbi1vcGVuLXJhbmdlCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChlY2hvIGFiY2QgfCBidXN5Ym94IGN1dCAtYyAtMykgPSBhYmMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tdW5jbG9zZWQtcmFuZ2UgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWFuLXVuY2xvc2VkLXJhbmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjBjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWFuLXVuY2xvc2VkLXJhbmdlCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChlY2hvIGFiY2QgfCBidXN5Ym94IGN1dCAtYyAzLSkgPSBjZApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RhdGUvZGF0ZS1ALXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RhdGUvZGF0ZS1ALXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjRjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGF0ZS9kYXRlLUAtd29ya3MKQEAgLTAsMCArMSwxMyBAQAorIyBUZXN0cyBmb3IgdGltZV90IHZhbHVlICh1bml4IHRpbWUgZm9ybWF0KQorCisjIEp1c3QgYmVmb3JlIERTVCBzd2l0Y2hlZCBvZmYKK3Rlc3QgeCJTdW4gT2N0IDMxIDAzOjU5OjU5IEVFU1QgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI4ODQ4Njc5OWAiCisKKyMgSnVzdCBhZnRlciBEU1Qgc3dpdGNoZWQgb2ZmCit0ZXN0IHgiU3VuIE9jdCAzMSAwMzowMDowMSBFRVQgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI4ODQ4NjgwMWAiCisKKyMgSnVzdCBiZWZvcmUgRFNUIHN3aXRjaGVkIG9uCit0ZXN0IHgiU3VuIE1hciAyOCAwMjo1OTo1OSBFRVQgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI2OTczNzk5OWAiCisKKyMgSnVzdCBhZnRlciBEU1Qgc3dpdGNoZWQgb24KK3Rlc3QgeCJTdW4gTWFyIDI4IDA0OjAwOjAxIEVFU1QgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI2OTczODAwMWAiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGF0ZS9kYXRlLVItd29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGF0ZS9kYXRlLVItd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNzhjYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtUi13b3JrcwpAQCAtMCwwICsxLDEzIEBACisjIFdoZW4gZGlmZmVyZW50IGRhdGUncyB1c2UgdGltZSgpIGFuZCBjbG9ja19nZXR0aW1lKCksCisjIHNlY29uZHMgdHJhbnNpdGlvbiBtYXkgbm90IGhhcHBlbiBhdCBfZXhhY3RseV8gdGhlIHNhbWUgbW9tZW50LgorIyBUaGVyZWZvcmUgd2UgdHJ5IGl0IHNldmVyYWwgdGltZXMuCisKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK2ZhbHNlCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGF0ZS9kYXRlLWZvcm1hdC13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtZm9ybWF0LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTIwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGF0ZS9kYXRlLWZvcm1hdC13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyMgVE9ETzogZ251IGRhdGUgZG9lc24ndCBhY2NlcHQgJzIwMDAuMTEuMjItMTE6MjI6MzMnIGZvcm1hdCwKKyMgYnV0IGFjY2VwdHMgJzIwMDAtMTEtMjIgMTE6MjI6MzMnLiBXZSBtdXN0IGZvbGxvdy4KK3Rlc3QgeCIwMS8wMS85OSIgPSB4ImBidXN5Ym94IGRhdGUgLWQgMTk5OS4wMS4wMS0xMToyMjozMyAnKyVkLyVtLyV5J2AiCit0ZXN0IHgiMjIvMTEvMDAiID0geCJgYnVzeWJveCBkYXRlIC1kIDIwMDAuMTEuMjItMTE6MjI6MzMgJyslZC8lbS8leSdgIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RhdGUvZGF0ZS11LXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RhdGUvZGF0ZS11LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGF0ZS9kYXRlLXUtd29ya3MKQEAgLTAsMCArMSBAQAordGVzdCB4IlNhdCBKYW4gIDEgMTE6MjI6MzMgVVRDIDIwMDAiID0geCJgVFo9Q0VULTFDRVNULTIgYnVzeWJveCBkYXRlIC11IC1kIDIwMDAuMDEuMDEtMTE6MjI6MzNgIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RhdGUvZGF0ZS13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxYzQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtd29ya3MKQEAgLTAsMCArMSw0NCBAQAorZHQ9YGJ1c3lib3ggZGF0ZWAKKyMgRXhwZWN0ZWQgZm9ybWF0OiBGcmkgQXByIDI1IDAzOjQ3OjU1IENFU1QgMjAwOAorZHQ9YGVjaG8gIiRkdCIgfCBzZWQgJ3MvXlteIF1bXiBdW14gXSBbXiBdW14gXVteIF0gWyAwMTIzXVswLTldIFswMTJdWzAtOV06WzAtNV1bMC05XTpbMC02XVswLTldIFtBLVpdW0EtWl0qIFswMTJdWzAtOV1bMC05XVswLTldJC9PSy8nYAordGVzdCB4IiRkdCIgPSB4Ik9LIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDE6MmAKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iMTItMTlgCit0ZXN0IHgiJGR0IiA9IHgiMDE6MDI6MDAiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMToyOjNgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjEyLTE5YAordGVzdCB4IiRkdCIgPSB4IjAxOjAyOjAzIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDEuMi0zOjRgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCit0ZXN0IHgiJGR0IiA9IHgiSmFuICAyIDAzOjA0OjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDEuMi0zOjQ6NWAKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iNS0xOWAKK3Rlc3QgeCIkZHQiID0geCJKYW4gIDIgMDM6MDQ6MDUiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMTk5OS4xLjItMzo0YAorZHQ9YGVjaG8gIiRkdCIgfCBjdXQgLWIxLTE5YAordGVzdCB4IiRkdCIgPSB4IlNhdCBKYW4gIDIgMDM6MDQ6MDAiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMTk5OS4xLjItMzo0OjVgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjEtMTlgCit0ZXN0IHgiJGR0IiA9IHgiU2F0IEphbiAgMiAwMzowNDowNSIKKworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAnMTk5OS0xLTIgMzo0OjUnYAorZHQ9YGVjaG8gIiRkdCIgfCBjdXQgLWIxLTE5YAordGVzdCB4IiRkdCIgPSB4IlNhdCBKYW4gIDIgMDM6MDQ6MDUiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMDEyMzExMzNgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCit0ZXN0IHgiJGR0IiA9IHgiSmFuIDIzIDExOjMzOjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDIwMDAwMTIzMTEzM2AKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iMS0xOWAKK3Rlc3QgeCIkZHQiID0geCJTdW4gSmFuIDIzIDExOjMzOjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDIwMDAwMTIzMTEzMy4zMGAKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iMS0xOWAKK3Rlc3QgeCIkZHQiID0geCJTdW4gSmFuIDIzIDExOjMzOjMwIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RhdGUvZGF0ZS13b3Jrcy0xIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RhdGUvZGF0ZS13b3Jrcy0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWNlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGF0ZS9kYXRlLXdvcmtzLTEKQEAgLTAsMCArMSwxMzQgQEAKK3Vuc2V0IExBTkcKK3Vuc2V0IExBTkdVQUdFCit1bnNldCBMQ19USU1FCit1bnNldCBMQ19BTEwKKworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxOjIgKyVUYAordGVzdCB4IiRkdCIgPSB4IjAxOjAyOjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDE6MjozICslVGAKK3Rlc3QgeCIkZHQiID0geCIwMTowMjowMyIKKworaG9zdF9kYXRlPS9iaW4vZGF0ZQorCisjIGRhdGUgKEdOVSBjb3JldXRpbHMpIDYuMTAgcmVwb3J0czoKKyMJZGF0ZTogaW52YWxpZCBkYXRlICcxLjItMzo0JworIyBidXN5Ym94IDEuMTEuMC5zdm4gZGF0ZSByZXBvcnRzOgorIwlkYXRlOiBpbnZhbGlkIGRhdGUgJzEvMiAzOjQnCisKKyMgVE9ETzogKDEpIGNvbXBhcmUgd2l0aCBzdHJpbmdzLCBub3QgImhvc3QgZGF0ZSIKKyMgKDIpIGltcGxlbWVudCBkL21bL3ldIGhoOm1tWzpzc10gZm10IGluIGRhdGUgYXBwbGV0CisjaGR0PWAkaG9zdF9kYXRlIC1kICcxLzIgMzo0J2AKKyNkdD1gYnVzeWJveCBkYXRlIC1kIDEuMi0zOjRgCisjdGVzdCB4IiRoZHQiID0geCIkZHQiCisKKyNoZHQ9YCRob3N0X2RhdGUgLWQgJzEvMiAzOjQ6NSdgCisjZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxLjItMzo0OjVgCisjdGVzdCB4IiRoZHQiID0geCIkZHQiCisKKyNoZHQ9YCRob3N0X2RhdGUgLWQgJzEvMi8xOTk5IDM6NCdgCisjZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxOTk5LjEuMi0zOjRgCisjdGVzdCB4IiRoZHQiID0geCIkZHQiCisKKyNoZHQ9YCRob3N0X2RhdGUgLWQgJzEvMi8xOTk5IDM6NDo1J2AKKyNkdD1gYnVzeWJveCBkYXRlIC1kIDE5OTkuMS4yLTM6NDo1YAorI3Rlc3QgeCIkaGR0IiA9IHgiJGR0IgorCitoZHQ9YCRob3N0X2RhdGUgLWQgJzE5OTktMS0yIDM6NDo1J2AKK2R0PWBidXN5Ym94IGRhdGUgLWQgJzE5OTktMS0yIDM6NDo1J2AKK3Rlc3QgeCIkaGR0IiA9IHgiJGR0IgorCisjIEF2b2lkaW5nIHVzaW5nIHdlZWsgZGF5IGluIHRoaXMgZXZhbHVhdGlvbiwgYXMgaXQncyBtb3N0bHkgZGlmZmVyZW50IGV2ZXJ5IHllYXIKKyMgZGF0ZSAoR05VIGNvcmV1dGlscykgNi4xMCByZXBvcnRzOgorIwlkYXRlOiBpbnZhbGlkIGRhdGUgJzAxMjMxMTMzJworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAwMTIzMTEzMyArJWNgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCit0ZXN0IHgiJGR0IiA9IHgiSmFuIDIzIDExOjMzOjAwIgorCisjIGRhdGUgKEdOVSBjb3JldXRpbHMpIDYuMTAgcmVwb3J0czoKKyMJZGF0ZTogaW52YWxpZCBkYXRlICcwMTIzMTEzMzIwMDAnCitkdD1gYnVzeWJveCBkYXRlIC1kIDIwMDAwMTIzMTEzMyArJWNgCit0ZXN0IHgiJGR0IiA9IHgiU3VuIEphbiAyMyAxMTozMzowMCAyMDAwIgorCisjIGRhdGUgKEdOVSBjb3JldXRpbHMpIDYuMTAgcmVwb3J0czoKKyMJZGF0ZTogaW52YWxpZCBkYXRlICcwMTIzMTEzMzIwMDAnCitkdD1gYnVzeWJveCBkYXRlIC1kIDIwMDAwMTIzMTEzMy4zMCArJWNgCit0ZXN0IHgiJGR0IiA9IHgiU3VuIEphbiAyMyAxMTozMzozMCAyMDAwIgorCitsY2JiZD0iTENfQUxMPUMgYnVzeWJveCBkYXRlIgord2Q9JChldmFsICRsY2JiZCArJWEpCQkjIHdlZWtkYXkgbmFtZQorbW49JChldmFsICRsY2JiZCArJWIpCQkjIG1vbnRoIG5hbWUKK2RtPSQoZXZhbCAkbGNiYmQgKyVlKQkJIyBkYXkgb2YgbW9udGgsIHNwYWNlIHBhZGRlZAoraD0kKGV2YWwgJGxjYmJkICslSCkJCSMgaG91ciwgemVybyBwYWRkZWQKK209JChldmFsICRsY2JiZCArJU0pCQkjIG1pbnV0ZSwgemVybyBwYWRkZWQKK3M9JChldmFsICRsY2JiZCArJVMpCQkjIHNlY29uZCwgemVybyBwYWRkZWQKK3o9JChldmFsICRsY2JiZCAtdSArJVopCQkjIHRpbWUgem9uZSBhYmJyZXZpYXRpb24KK3k9JChldmFsICRsY2JiZCArJVkpCQkjIHllYXIKKworcmVzPU9LCitjYXNlICR3ZCBpbgorCVN1bikKKwkJOzsKKwlNb24pCisJCTs7CisJVHVlKQorCQk7OworCVdlZCkKKwkJOzsKKwlUaHUpCisJCTs7CisJRnJpKQorCQk7OworCVNhdCkKKwkJOzsKKwkqKQorCQlyZXM9QkFECisJCTs7Citlc2FjCisKK2Nhc2UgJG1uIGluCisJSmFuKQorCQk7OworCUZlYikKKwkJOzsKKwlNYXIpCisJCTs7CisJQXByKQorCQk7OworCU1heSkKKwkJOzsKKwlKdW4pCisJCTs7CisJSnVsKQorCQk7OworCUF1ZykKKwkJOzsKKwlTZXApCisJCTs7CisJT2N0KQorCQk7OworCU5vdikKKwkJOzsKKwlEZWMpCisJCTs7CisJKikKKwkJcmVzPUJBRAorCQk7OworZXNhYworCitkbT0ke2RtIyAqfQorWyAkZG0gLWdlIDEgXSAmJiBbICRkbSAtbGUgMzEgXSB8fCByZXM9QkFECitoPSR7aCMwfQorWyAkaCAtZ2UgMCBdICYmIFsgJGggLWxlIDIzIF0gfHwgcmVzPUJBRAorbT0ke20jMH0KK1sgJG0gLWdlIDAgXSAmJiBbICRtIC1sZSA1OSBdIHx8IHJlcz1CQUQKK3M9JHtzIzB9CitbICRzIC1nZSAwIF0gJiYgWyAkcyAtbGUgNTkgXSB8fCByZXM9QkFECitbICR6ID0gVVRDIF0gfHwgcmVzPUJBRAorWyAkeSAtZ2UgMTk3MCBdIHx8IHJlcz1CQUQKKwordGVzdCB4IiRyZXMiID0geE9LCisKKyMgVGhpcyBzaG91bGQgZXJyb3Igb3V0IChieSBzaG93aW5nIHVzYWdlIHRleHQpLiBUZXN0aW5nIGZvciB0aGF0CitkdD1gYnVzeWJveCBkYXRlIC1kIDAxMjMxMTMzMjAwMC4zMCAlK2MgMj4mMSB8IGhlYWQgLW4gMWAKK3Rlc3QgeCIke2R0IyNCdXN5Qm94ICogbXVsdGktY2FsbCBiaW5hcnkqfSIgPSB4IiIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1hY2NlcHRzLWlmIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RkL2RkLWFjY2VwdHMtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkMWFmOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1hY2NlcHRzLWlmCkBAIC0wLDAgKzEsMiBAQAorZWNobyBJIFdBTlQgPmZvbwordGVzdCAiJChidXN5Ym94IGRkIGlmPWZvbyAyPi9kZXYvbnVsbCkiID0gIkkgV0FOVCIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1hY2NlcHRzLW9mIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RkL2RkLWFjY2VwdHMtb2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0MDVlNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1hY2NlcHRzLW9mCkBAIC0wLDAgKzEsMiBAQAorZWNobyBJIFdBTlQgfCBidXN5Ym94IGRkIG9mPWZvbyAyPi9kZXYvbnVsbAorZWNobyBJIFdBTlQgfCBjbXAgZm9vIC0KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1jb3BpZXMtZnJvbS1zdGFuZGFyZC1pbnB1dC10by1zdGFuZGFyZC1vdXRwdXQgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGQvZGQtY29waWVzLWZyb20tc3RhbmRhcmQtaW5wdXQtdG8tc3RhbmRhcmQtb3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTBlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGQvZGQtY29waWVzLWZyb20tc3RhbmRhcmQtaW5wdXQtdG8tc3RhbmRhcmQtb3V0cHV0CkBAIC0wLDAgKzEgQEAKK3Rlc3QgIiQoZWNobyBJIFdBTlQgfCBidXN5Ym94IGRkIDI+L2Rldi9udWxsKSIgPSAiSSBXQU5UIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RkL2RkLXByaW50cy1jb3VudC10by1zdGFuZGFyZC1lcnJvciBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1wcmludHMtY291bnQtdG8tc3RhbmRhcmQtZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4N2RjMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1wcmludHMtY291bnQtdG8tc3RhbmRhcmQtZXJyb3IKQEAgLTAsMCArMSwyIEBACitlY2hvIEkgV0FOVCB8IGJ1c3lib3ggZGQgb2Y9Zm9vID4vZGV2L251bGwgMj5iYXIKK2dyZXAgLXEgcmVjb3JkcyBiYXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1yZXBvcnRzLXdyaXRlLWVycm9ycyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kZC9kZC1yZXBvcnRzLXdyaXRlLWVycm9ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIwNjAwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RkL2RkLXJlcG9ydHMtd3JpdGUtZXJyb3JzCkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCBkZCBpZj0iJDAiIG9mPS9kZXYvZnVsbCAyPi9kZXYvbnVsbCB8fCBzdGF0dXM9JD8KK3Rlc3QgJHN0YXR1cyA9IDEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaWZmLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2RpZmYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmRlNDY0OAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaWZmLnRlc3RzCkBAIC0wLDAgKzEsMjE3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kcyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworIyBkaWZmIG91dHB1dHMgZGF0ZS90aW1lIGluIHRoZSBoZWFkZXIsIHdoaWNoIHNob3VsZCBub3QgYmUgYW5hbHlzZWQKKyMgTkI6IHNlZCBoYXMgdGFiIGNoYXJhY3RlciBpbiBzIGNvbW1hbmQhCitUUklNX1RBQj0ic2VkICdzLwkuKi8vJyIKKwordGVzdGluZyAiZGlmZiBvZiBzdGRpbiIgXAorCSJkaWZmIC11IC0gaW5wdXQgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gLQorKysrIGlucHV0CitAQCAtMSArMSwzIEBACisrcXdlCisgYXNkCisrenhjCisiIFwKKwkicXdlXG5hc2Rcbnp4Y1xuIiBcCisJImFzZFxuIgorCit0ZXN0aW5nICJkaWZmIG9mIHN0ZGluLCBubyBuZXdsaW5lIGluIHRoZSBmaWxlIiBcCisJImRpZmYgLXUgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xICsxLDMgQEAKKytxd2UKKyBhc2QKKyt6eGMKK1xcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyIgXAorCSJxd2VcbmFzZFxuenhjIiBcCisJImFzZFxuIgorCisjIHdlIGFsc28gdGVzdCB0aGF0IHN0ZGluIGlzIGluIGZhY3QgTk9UIHJlYWQKK3Rlc3RpbmcgImRpZmYgb2Ygc3RkaW4sIHR3aWNlIiBcCisJJ2RpZmYgLSAtOyBlY2hvICQ/OyB3YyAtYycgXAorCSIwXG41XG4iIFwKKwkiIiBcCisJInN0ZGluIgorCit0ZXN0aW5nICJkaWZmIG9mIGVtcHR5IGZpbGUgYWdhaW5zdCBub25lbXB0eSBvbmUiIFwKKwkiZGlmZiAtdSAtIGlucHV0IHwgJFRSSU1fVEFCIiBcCisiXAorLS0tIC0KKysrKyBpbnB1dAorQEAgLTAsMCArMSBAQAorK2EKKyIgXAorCSJhXG4iIFwKKwkiIgorCit0ZXN0aW5nICJkaWZmIC1iIHRyZWF0cyBFT0YgYXMgd2hpdGVzcGFjZSIgXAorCSdkaWZmIC11YiAtIGlucHV0OyBlY2hvICQ/JyBcCisJIjBcbiIgXAorCSJhYmMiIFwKKwkiYWJjICIKKwordGVzdGluZyAiZGlmZiAtYiB0cmVhdHMgYWxsIHNwYWNlcyBhcyBlcXVhbCIgXAorCSdkaWZmIC11YiAtIGlucHV0OyBlY2hvICQ/JyBcCisJIjBcbiIgXAorCSJhIFx0IGNcbiIgXAorCSJhXHQgXHRjXG4iCisKK3Rlc3RpbmcgImRpZmYgLUIgaWdub3JlcyBjaGFuZ2VzIHdob3NlIGxpbmVzIGFyZSBhbGwgYmxhbmsiIFwKKwknZGlmZiAtdUIgLSBpbnB1dDsgZWNobyAkPycgXAorCSIwXG4iIFwKKwkiYVxuIiBcCisJIlxuYVxuXG4iCisKK3Rlc3RpbmcgImRpZmYgLUIgZG9lcyBub3QgaWdub3JlIGNoYW5nZXMgd2hvc2UgbGluZXMgYXJlIG5vdCBhbGwgYmxhbmsiIFwKKwkiZGlmZiAtdUIgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xLDMgKzEgQEAKKy0KKy1iCistCisrYQorIiBcCisJImFcbiIgXAorCSJcbmJcblxuIgorCit0ZXN0aW5nICJkaWZmIGFsd2F5cyB0YWtlcyBjb250ZXh0IGZyb20gb2xkIGZpbGUiIFwKKwkiZGlmZiAtdWIgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xICsxLDMgQEAKKythYmMKKyBhIGMKKytkZWYKKyIgXAorCSJhYmNcbmEgIGNcbmRlZlxuIiBcCisJImEgY1xuIgorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmRzIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCisjIGNsZWFuIHVwCitybSAtcmYgZGlmZjEgZGlmZjIKKworbWtkaXIgZGlmZjEgZGlmZjIgZGlmZjIvc3ViZGlyCitlY2hvIHF3ZSA+ZGlmZjEvLQorZWNobyBhc2QgPmRpZmYyL3N1YmRpci8tCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIGRpZmYxIGRpZmYyL3N1YmRpciIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorb3B0aW9uYWwgRkVBVFVSRV9ESUZGX0RJUgordGVzdGluZyAiZGlmZiBkaXIgZGlyMi9maWxlLy0iIFwKKwkiZGlmZiAtdXIgZGlmZjEgZGlmZjIvc3ViZGlyLy0gfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorbWtkaXIgZGlmZjEvdGVzdAorbWtmaWZvIGRpZmYyL3N1YmRpci90ZXN0CitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIG9mIGRpciBhbmQgZmlmbyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorT25seSBpbiBkaWZmMi9zdWJkaXI6IHRlc3QKKyIgXAorCSIiICIiCitTS0lQPQorCisjIHVzaW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QuLi4KK3JtZGlyIGRpZmYxL3Rlc3QKK2VjaG8gPmRpZmYxL3Rlc3QKK29wdGlvbmFsIEZFQVRVUkVfRElGRl9ESVIKK3Rlc3RpbmcgImRpZmYgb2YgZmlsZSBhbmQgZmlmbyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorRmlsZSBkaWZmMi9zdWJkaXIvdGVzdCBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorbWtmaWZvIGRpZmYxL3Rlc3QyCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIC1yTiBkb2VzIG5vdCByZWFkIG5vbi1yZWd1bGFyIGZpbGVzIiBcCisJImRpZmYgLXVyTiBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorRmlsZSBkaWZmMi9zdWJkaXIvdGVzdCBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorRmlsZSBkaWZmMS90ZXN0MiBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY2xlYW4gdXAKK3JtIC1yZiBkaWZmMSBkaWZmMgorCisjIE5PVCB1c2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0Li4uCitta2RpciBkaWZmMSBkaWZmMgorZWNobyBxd2UgPmRpZmYxLy0KK2VjaG8gcnR5ID5kaWZmMi8tCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIGRpZmYxIGRpZmYyLyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi8gfCAkVFJJTV9UQUI7IGRpZmYgLXVyIC4vLy9kaWZmMSBkaWZmMi8vLy8gfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyLy0KK0BAIC0xICsxIEBACistcXdlCisrcnR5CistLS0gLi8vL2RpZmYxLy0KKysrKyBkaWZmMi8vLy8tCitAQCAtMSArMSBAQAorLXF3ZQorK3J0eQorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY2xlYW4gdXAKK3JtIC1yZiBkaWZmMSBkaWZmMgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1hYnNvbHV0ZS1wYXRoIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLWFic29sdXRlLXBhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExYTUxYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1hYnNvbHV0ZS1wYXRoCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgL2Zvby9iYXIvYmF6KSA9IC9mb28vYmFyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtZW1wdHktcGF0aCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1lbXB0eS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTM0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtZW1wdHktcGF0aApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lICcnKSA9IC4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1tdWx0aXBsZS1zbGFzaGVzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLW11bHRpcGxlLXNsYXNoZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2ZjI1MwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1tdWx0aXBsZS1zbGFzaGVzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgZm9vL2Jhci8vL2JheikgPSBmb28vYmFyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtcmVsYXRpdmUtcGF0aCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yZWxhdGl2ZS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTRhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtcmVsYXRpdmUtcGF0aApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lIGZvby9iYXIvYmF6KSA9IGZvby9iYXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yb290IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLXJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkNjJiOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yb290CkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgLykgPSAvCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtc2luZ2xlLWNvbXBvbmVudCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1zaW5nbGUtY29tcG9uZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjlhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtc2luZ2xlLWNvbXBvbmVudApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lIGZvbykgPSAuCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjczZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGRpcm5hbWUgJChwd2QpKSA9IHgkKGJ1c3lib3ggZGlybmFtZSAkKHB3ZCkpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZHUvZHUtaC13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kdS9kdS1oLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzdiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZHUvZHUtaC13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKworZGQgaWY9L2Rldi96ZXJvIG9mPWZpbGUgYnM9MU0gY291bnQ9MSAyPi9kZXYvbnVsbAordGVzdCB4ImBidXN5Ym94IGR1IC1oIGZpbGVgIiA9IHgiMS4wTQlmaWxlIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2R1L2R1LWstd29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZHUvZHUtay13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjlhOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2R1L2R1LWstd29ya3MKQEAgLTAsMCArMSw2IEBACitta2RpciBkdS50ZXN0ZGlyCitjZCBkdS50ZXN0ZGlyCitkZCBpZj0vZGV2L3plcm8gb2Y9ZmlsZTEgYnM9MWsgY291bnQ9NjQgMj4vZGV2L251bGwKK2RkIGlmPS9kZXYvemVybyBvZj1maWxlMiBicz0xayBjb3VudD0xNiAyPi9kZXYvbnVsbAordGVzdCB4ImBidXN5Ym94IGR1IC1rIC5gIiA9IHgiODAJLiIgXAorICAtbyB4ImBidXN5Ym94IGR1IC1rIC5gIiA9IHgiODgJLiIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kdS9kdS1sLXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2R1L2R1LWwtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ZWU4OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kdS9kdS1sLXdvcmtzCkBAIC0wLDAgKzEsMTEgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsKKworbWtkaXIgZHUudGVzdGRpcgorY2QgZHUudGVzdGRpcgorZGQgaWY9L2Rldi96ZXJvIG9mPWZpbGUxIGJzPTFrIGNvdW50PTY0IDI+L2Rldi9udWxsCitsbiBmaWxlMSBmaWxlMS4xCitkZCBpZj0vZGV2L3plcm8gb2Y9ZmlsZTIgYnM9MWsgY291bnQ9MTYgMj4vZGV2L251bGwKK3Rlc3QgeCJgYnVzeWJveCBkdSAtbCAuYCIgPSB4IjE0NAkuIiBcCisgIC1vIHgiYGJ1c3lib3ggZHUgLWwgLmAiID0geCIxNDgJLiIgXAorICAtbyB4ImBidXN5Ym94IGR1IC1sIC5gIiA9IHgiMTUyCS4iIFwKKyAgLW8geCJgYnVzeWJveCBkdSAtbCAuYCIgPSB4IjE1NgkuIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2R1L2R1LW0td29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZHUvZHUtbS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmE3NDM3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2R1L2R1LW0td29ya3MKQEAgLTAsMCArMSw0IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisKK2RkIGlmPS9kZXYvemVybyBvZj1maWxlIGJzPTFNIGNvdW50PTEgMj4vZGV2L251bGwKK3Rlc3QgeCJgYnVzeWJveCBkdSAtbSAuYCIgPSB4IjEJLiIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kdS9kdS1zLXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2R1L2R1LXMtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0NDMyYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9kdS9kdS1zLXdvcmtzCkBAIC0wLDAgKzEsOCBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSworCitkPS9iaW4KK2R1IC1zICIkZCIgPiBsb2dmaWxlLmdudQorYnVzeWJveCBkdSAtcyAiJGQiID4gbG9nZmlsZS5iYgorY21wIGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIgJiYgZXhpdCAwCitkaWZmIC11IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2R1L2R1LXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2R1L2R1LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjBmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZHUvZHUtd29ya3MKQEAgLTAsMCArMSw4IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLCisKK2Q9L2JpbgorZHUgIiRkIiA+IGxvZ2ZpbGUuZ251CitidXN5Ym94IGR1ICIkZCIgPiBsb2dmaWxlLmJiCitjbXAgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYiAmJiBleGl0IDAKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgorZXhpdCAxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLWRvZXMtbm90LXByaW50LW5ld2xpbmUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLWRvZXMtbm90LXByaW50LW5ld2xpbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1N2MwZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tZG9lcy1ub3QtcHJpbnQtbmV3bGluZQpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITworCit0ZXN0IGBidXN5Ym94IGVjaG8gLW4gd29yZCB8IHdjIC1jYCAtZXEgNApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtYXJndW1lbnQgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1hcmd1bWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzlkYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtYXJndW1lbnQKQEAgLTAsMCArMSBAQAordGVzdCB4ZnViYXIgPSB4YGJ1c3lib3ggZWNobyBmdWJhcmAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLWFyZ3VtZW50cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLWFyZ3VtZW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTRlM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtYXJndW1lbnRzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgImBidXN5Ym94IGVjaG8gZm9vIGJhcmAiID0gImZvbyBiYXIiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1kYXNoIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtZGFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNkYmFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtZGFzaApAQCAtMCwwICsxIEBACit0ZXN0ICJgYnVzeWJveCBlY2hvIC0gfCBvZCAtdCB4MSB8IGhlYWQgLW4gMWAiID0gIjAwMDAwMDAgMmQgMGEiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1uZXdsaW5lIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtbmV3bGluZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg2NzFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtbmV3bGluZQpAQCAtMCwwICsxIEBACit0ZXN0IGBidXN5Ym94IGVjaG8gd29yZCB8IHdjIC1jYCAtZXEgNQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtbm9uLW9wdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1ub24tb3B0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2QxZTIwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtbm9uLW9wdHMKQEAgLTAsMCArMSBAQAordGVzdCAiYGJ1c3lib3ggZWNobyAtbmVFWiB8IG9kIC10IHgxIHwgaGVhZCAtbiAxYCIgPSAiMDAwMDAwMCAyZCA2ZSA2NSA0NSA1YSAwYSIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoLXplcm8gYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaC16ZXJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5N2VkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaC16ZXJvCkBAIC0wLDAgKzEsMyBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPCisKK3Rlc3QgImBidXN5Ym94IGVjaG8gLWUgLW4gJ21zZ1xuXDAnIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDZkIDczIDY3IDBhIDAwIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDAwNDEgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wMDA0MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ZmYWJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDAwNDEKQEAgLTAsMCArMSwzIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8KKwordGVzdCAiYGJ1c3lib3ggZWNobyAtbmUgJ1wwMDA0MXonIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDA0IDMxIDdhIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDA0MSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzAwNDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NDI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzAwNDEKQEAgLTAsMCArMSwzIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8KKwordGVzdCAiYGJ1c3lib3ggZWNobyAtbmUgJ1wwMDQxeicgfCBvZCAtdCB4MSB8IGhlYWQgLW4gMWAiID0gIjAwMDAwMDAgMjEgN2EiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wNDEgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wNDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3MGNlYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzA0MQpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITworCit0ZXN0ICJgYnVzeWJveCBlY2hvIC1uZSAnXDA0MXonIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDIxIDdhIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfNDEgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF80MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDg5OTliCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfNDEKQEAgLTAsMCArMSwzIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8KKwordGVzdCAiYGJ1c3lib3ggZWNobyAtbmUgJ1w0MXonIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDIxIDdhIgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2V4cGFuZC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9leHBhbmQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDY4MmMyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9leHBhbmQudGVzdHMKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJleHBhbmQiIFwKKwkiZXhwYW5kIiBcCisJIiAgICAgICAgMTIzNDU2NzggICAgICAgIDEyMzQ1Njc4XG4iIFwKKwkiIiBcCisJIlx0MTIzNDU2NzhcdDEyMzQ1Njc4XG4iCisKK3Rlc3QgeCIkQ09ORklHX1VOSUNPREVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIiAhPSB4InkiIFwKKyYmIHRlc3RpbmcgImV4cGFuZCB3aXRoIHVuaWNvZGUgY2hhcmFjaGVyIDB4Mzk0IiBcCisJImV4cGFuZCIgXAorCSLOlCAgICAgICAxMjM0Nc6UzpTOlCAgICAgICAgMTIzNDU2NzhcbiIgXAorCSIiIFwKKwkizpRcdDEyMzQ1zpTOlM6UXHQxMjM0NTY3OFxuIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9leHBhbmQvZXhwYW5kLXdvcmtzLWxpa2UtR05VIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2V4cGFuZC9leHBhbmQtd29ya3MtbGlrZS1HTlUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyNzhkOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9leHBhbmQvZXhwYW5kLXdvcmtzLWxpa2UtR05VCkBAIC0wLDAgKzEsMjAgQEAKKyMgRkVBVFVSRTogQ09ORklHX1VORVhQQU5ECisKK3JtIC1mIGZvbyBiYXIKKyRFQ0hPIC1lICJcdHkiIHwgZXhwYW5kIC10IDMgLi4vLi4vYnVzeWJveCA+IGZvbworJEVDSE8gLWUgIlx0eSIgfCBidXN5Ym94IHVuZXhwYW5kIC10IDMgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCitybSAtZiBmb28gYmFyCiskRUNITyAtZSAiXHR5XHR4IiB8IGV4cGFuZCAtaXQgMyAuLi8uLi9idXN5Ym94ID4gZm9vCiskRUNITyAtZSAiXHR5XHR4IiB8IGJ1c3lib3ggdW5leHBhbmQgLWl0IDMgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZXhwci9leHByLWJpZyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9leHByL2V4cHItYmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGJiYjMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZXhwci9leHByLWJpZwpAQCAtMCwwICsxLDE2IEBACisjIGJ1c3lib3ggZXhwcgorCisjIDMqMTAwMCoxMDAwKjEwMDAgb3ZlcmZsb3dzIDMyLWJpdCBzaWduZWQgaW50CityZXM9YGJ1c3lib3ggZXhwciAwICc8JyAzMDAwMDAwMDAwYAorWyB4IiRyZXMiID0geDEgXSB8fCBleGl0IDEKKworIyA5MjIzMzcyMDM2ODU0Nzc1ODA3ID0gMl4zMS0xCityZXM9YGJ1c3lib3ggZXhwciAwICc8JyA5MjIzMzcyMDM2ODU0Nzc1ODA3YAorWyB4IiRyZXMiID0geDEgXSB8fCBleGl0IDEKKyMgY29yZXV0aWxzIGZhaWxzIHRoaXMgb25lIQorcmVzPWBidXN5Ym94IGV4cHIgLTkyMjMzNzIwMzY4NTQ3NzU4MDAgJzwnIDkyMjMzNzIwMzY4NTQ3NzU4MDdgCitbIHgiJHJlcyIgPSB4MSBdIHx8IGV4aXQgMQorCisjIFRoaXMgb25lIHdvcmtzIG9ubHkgYnkgY2hhbmNlCisjIHJlcz1gYnVzeWJveCBleHByIDAgJzwnIDkyMjMzNzIwMzY4NTQ3NzU4MDhgCisjIFsgeCIkcmVzIiA9IHgxIF0gfHwgZXhpdCAxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZXhwci9leHByLXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2V4cHIvZXhwci13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTBmZmZiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2V4cHIvZXhwci13b3JrcwpAQCAtMCwwICsxLDU4IEBACisjIGJ1c3lib3ggZXhwcgorYnVzeWJveCBleHByIDEgXHwgMQorYnVzeWJveCBleHByIDEgXHwgMAorYnVzeWJveCBleHByIDAgXHwgMQorYnVzeWJveCBleHByIDEgXCYgMQorYnVzeWJveCBleHByIDAgXDwgMQorYnVzeWJveCBleHByIDEgXD4gMAorYnVzeWJveCBleHByIDAgXDw9IDEKK2J1c3lib3ggZXhwciAxIFw8PSAxCitidXN5Ym94IGV4cHIgMSBcPj0gMAorYnVzeWJveCBleHByIDEgXD49IDEKK2J1c3lib3ggZXhwciAxICsgMgorYnVzeWJveCBleHByIDIgLSAxCitidXN5Ym94IGV4cHIgMiBcKiAzCitidXN5Ym94IGV4cHIgMTIgLyAyCitidXN5Ym94IGV4cHIgMTIgJSA1CisKKworc2V0ICtlCitidXN5Ym94IGV4cHIgMCBcfCAwCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKKworYnVzeWJveCBleHByIDEgXCYgMAoraWYgWyAkPyAhPSAxIF0gOyB0aGVuCisJZXhpdCAxOworZmk7CisKK2J1c3lib3ggZXhwciAwIFwmIDEKK2lmIFsgJD8gIT0gMSBdIDsgdGhlbgorCWV4aXQgMTsKK2ZpOworCitidXN5Ym94IGV4cHIgMCBcJiAwCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKKworYnVzeWJveCBleHByIDEgXDwgMAoraWYgWyAkPyAhPSAxIF0gOyB0aGVuCisJZXhpdCAxOworZmk7CisKK2J1c3lib3ggZXhwciAwIFw+IDEKK2lmIFsgJD8gIT0gMSBdIDsgdGhlbgorCWV4aXQgMTsKK2ZpOworCitidXN5Ym94IGV4cHIgMSBcPD0gMAoraWYgWyAkPyAhPSAxIF0gOyB0aGVuCisJZXhpdCAxOworZmk7CisKK2J1c3lib3ggZXhwciAwIFw+PSAxCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9mYWxzZS9mYWxzZS1pcy1zaWxlbnQgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZmFsc2UvZmFsc2UtaXMtc2lsZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWFhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZmFsc2UvZmFsc2UtaXMtc2lsZW50CkBAIC0wLDAgKzEgQEAKK2J1c3lib3ggZmFsc2UgMj4mMSB8IGNtcCAtIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2ZhbHNlL2ZhbHNlLXJldHVybnMtZmFpbHVyZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9mYWxzZS9mYWxzZS1yZXR1cm5zLWZhaWx1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwNjFmMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9mYWxzZS9mYWxzZS1yZXR1cm5zLWZhaWx1cmUKQEAgLTAsMCArMSBAQAorISBidXN5Ym94IGZhbHNlCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZmluZC9maW5kLXN1cHBvcnRzLW1pbnVzLXhkZXYgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZmluZC9maW5kLXN1cHBvcnRzLW1pbnVzLXhkZXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwN2ZjOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9maW5kL2ZpbmQtc3VwcG9ydHMtbWludXMteGRldgpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRklORF9YREVWCisKK2J1c3lib3ggZmluZCAuIC14ZGV2ID4vZGV2L251bGwgMj4mMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2ZvbGQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZm9sZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lY2Y4YjljCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2ZvbGQudGVzdHMKQEAgLTAsMCArMSw2MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA5IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJmb2xkIC1zIiAiZm9sZCAtdyA3IC1zIiBcCisgICAgICAgICIxMjM0NTZcblx0XG5hc2RmIiBcCisgICAgICAgICIiIFwKKyAgICAgICAgIjEyMzQ1Nlx0YXNkZiIgXAorCit0ZXN0aW5nICJmb2xkIC13MSIgImZvbGQgLXcxIiBcCisJInFcbnFcbiBcbndcbiBcbmVcbmVcbmVcbiBcbnJcbiBcbnRcbnRcbnRcbnRcbiBcbnkiIFwKKwkiIiBcCisJInFxIHcgZWVlIHIgdHR0dCB5IiBcCisKK3Rlc3RpbmcgImZvbGQgd2l0aCBOVUxzIiAiZm9sZCAtc3cyMiIgXAorCSJcCitUaGUgTlVMIGlzIGhlcmU6PlwwPCBcblwKK2FuZCBhbm90aGVyIG9uZSBpcyBcblwKK2hlcmU6PlwwPCAtIHRoZXkgbXVzdCBcblwKK2JlIHByZXNlcnZlZAorIiBcCisJIiIgXAorCSJUaGUgTlVMIGlzIGhlcmU6PlwwPCBhbmQgYW5vdGhlciBvbmUgXAoraXMgaGVyZTo+XDA8IC0gdGhleSBtdXN0IGJlIHByZXNlcnZlZAorIiBcCisKKyMgVGhlIHRleHQgd2FzIHRha2VuIGZyb20gRW5nbGlzaCBhbmQgVWtyYWluaWFuIHdpa2lwZWRpYSBwYWdlcwordGVzdCB4IiRDT05GSUdfVU5JQ09ERV9TVVBQT1JUIiA9IHgieSIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUiICE9IHgieSIgXAorJiYgdGVzdGluZyAiZm9sZCAtc3c2NiB3aXRoIHVuaWNvZGUgaW5wdXQiICJmb2xkIC1zdzY2IiBcCisJIlwKK1RoZSBBbmRyb21lZGEgR2FsYXh5IChwcm9ub3VuY2VkIC/Dpm7LiGRyyZJtyZlkyZkvLCBhbHNvIGtub3duIGFzIFxuXAorTWVzc2llciAzMSwgTTMxLCBvciBOR0MyMjQ7IG9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSBHcmVhdCBcblwKK0FuZHJvbWVkYSBOZWJ1bGEgaW4gb2xkZXIgdGV4dHMpIGlzIGEgc3BpcmFsIGdhbGF4eSBhcHByb3hpbWF0ZWx5IFxuXAorMiw1MDAsMDAwIGxpZ2h0LXllYXJzICgxLjU4w5cxMF4xMSBBVSkgYXdheSBpbiB0aGUgY29uc3RlbGxhdGlvbiBcblwKK0FuZHJvbWVkYS4gSXQgaXMgdGhlIG5lYXJlc3Qgc3BpcmFsIGdhbGF4eSB0byBvdXIgb3duLCB0aGUgTWlsa3kgXG5cCitXYXkuXG5cCivQk9Cw0LvQsNC60YLQuNC60LAg0LDQsdC+INCi0YPQvNCw0L3QvdGW0YHRgtGMINCQ0L3QtNGA0L7QvNC10LTQuCAo0YLQsNC60L7QtiDQstGW0LTQvtC80LAg0Y/QuiBNMzEg0LfQsCBcblwKK9C60LDRgtCw0LvQvtCz0L7QvCDQnNC10YHRgdGM0ZQg0YLQsCBOR0MyMjQg0LfQsCDQndC+0LLQuNC8INC30LDQs9Cw0LvRjNC90LjQvCDQutCw0YLQsNC70L7Qs9C+0LwpIOKAlCBcblwKK9GB0L/RltGA0LDQu9GM0L3QsCDQs9Cw0LvQsNC60YLQuNC60LAsINGJ0L4g0LfQvdCw0YXQvtC00LjRgtGM0YHRjyDQvdCwINCy0ZbQtNGB0YLQsNC90ZYg0L/RgNC40LHQu9C40LfQvdC+INGDIDIsNSBcblwKK9C80ZbQu9GM0LnQvtC90Lgg0YHQstGW0YLQu9C+0LLQuNGFINGA0L7QutGW0LIg0LLRltC0INC90LDRiNC+0Zcg0L/Qu9Cw0L3QtdGC0Lgg0YMg0YHRg9C30ZbRgCfRlyDQkNC90LTRgNC+0LzQtdC00LguIFxuXAor0J3QsCDQv9C+0YfQsNGC0LrRgyDQpdCl0IYg0YHRgi4g0LIg0YbQtdC90YLRgNGWINCz0LDQu9Cw0LrRgtC40LrQuCDQstC40Y/QstC70LXQvdC+INGH0L7RgNC90YMg0LTRltGA0LrRgy4iIFwKKwkiIiBcCisJIlwKK1RoZSBBbmRyb21lZGEgR2FsYXh5IChwcm9ub3VuY2VkIC/Dpm7LiGRyyZJtyZlkyZkvLCBhbHNvIGtub3duIGFzIFwKK01lc3NpZXIgMzEsIE0zMSwgb3IgTkdDMjI0OyBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgR3JlYXQgXAorQW5kcm9tZWRhIE5lYnVsYSBpbiBvbGRlciB0ZXh0cykgaXMgYSBzcGlyYWwgZ2FsYXh5IGFwcHJveGltYXRlbHkgXAorMiw1MDAsMDAwIGxpZ2h0LXllYXJzICgxLjU4w5cxMF4xMSBBVSkgYXdheSBpbiB0aGUgY29uc3RlbGxhdGlvbiBcCitBbmRyb21lZGEuIEl0IGlzIHRoZSBuZWFyZXN0IHNwaXJhbCBnYWxheHkgdG8gb3VyIG93biwgdGhlIE1pbGt5IFwKK1dheS4KK9CT0LDQu9Cw0LrRgtC40LrQsCDQsNCx0L4g0KLRg9C80LDQvdC90ZbRgdGC0Ywg0JDQvdC00YDQvtC80LXQtNC4ICjRgtCw0LrQvtC2INCy0ZbQtNC+0LzQsCDRj9C6IE0zMSDQt9CwIFwKK9C60LDRgtCw0LvQvtCz0L7QvCDQnNC10YHRgdGM0ZQg0YLQsCBOR0MyMjQg0LfQsCDQndC+0LLQuNC8INC30LDQs9Cw0LvRjNC90LjQvCDQutCw0YLQsNC70L7Qs9C+0LwpIOKAlCBcCivRgdC/0ZbRgNCw0LvRjNC90LAg0LPQsNC70LDQutGC0LjQutCwLCDRidC+INC30L3QsNGF0L7QtNC40YLRjNGB0Y8g0L3QsCDQstGW0LTRgdGC0LDQvdGWINC/0YDQuNCx0LvQuNC30L3QviDRgyAyLDUgXAor0LzRltC70YzQudC+0L3QuCDRgdCy0ZbRgtC70L7QstC40YUg0YDQvtC60ZbQsiDQstGW0LQg0L3QsNGI0L7RlyDQv9C70LDQvdC10YLQuCDRgyDRgdGD0LfRltGAJ9GXINCQ0L3QtNGA0L7QvNC10LTQuC4gXAor0J3QsCDQv9C+0YfQsNGC0LrRgyDQpdCl0IYg0YHRgi4g0LIg0YbQtdC90YLRgNGWINCz0LDQu9Cw0LrRgtC40LrQuCDQstC40Y/QstC70LXQvdC+INGH0L7RgNC90YMg0LTRltGA0LrRgy4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2dyZXAudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZ3JlcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZmNlMDMzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2dyZXAudGVzdHMKQEAgLTAsMCArMSwxMDYgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6CisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIFRlc3QgZXhpdCBzdGF0dXMKKwordGVzdGluZyAiZ3JlcCAoZXhpdCB3aXRoIGVycm9yKSIgImdyZXAgbm9uZXhpc3RlbnQgMj4gL2Rldi9udWxsIDsgZWNobyBcJD8iIFwKKwkiMVxuIiAiIiAiIgordGVzdGluZyAiZ3JlcCAoZXhpdCBzdWNjZXNzKSIgImdyZXAgZ3JlcCAkMCA+IC9kZXYvbnVsbCAyPiYxIDsgZWNobyBcJD8iICIwXG4iIFwKKwkiIiAiIgorIyBUZXN0IHZhcmlvdXMgZGF0YSBzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbnMKKwordGVzdGluZyAiZ3JlcCAoZGVmYXVsdCB0byBzdGRpbikiICJncmVwIHR3byIgInR3b1xuIiAiIiBcCisJIm9uZVxudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCit0ZXN0aW5nICJncmVwIC0gKHNwZWNpZnkgc3RkaW4pIiAiZ3JlcCB0d28gLSIgInR3b1xuIiAiIiBcCisJIm9uZVxudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCit0ZXN0aW5nICJncmVwIGlucHV0IChzcGVjaWZ5IGZpbGUpIiAiZ3JlcCB0d28gaW5wdXQiICJ0d29cbiIgXAorCSJvbmVcbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIiAiIgorCisjIEdOVSBncmVwIDIuNS4zIG91dHB1dHMgYSBuZXcgbGluZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxvY2F0ZWQgc3RyaW5nCisjIGV2ZW4gaWYgdGhlcmUgaXMgbm8gbmV3IGxpbmUgY2hhcmFjdGVyIGluIHRoZSBpbnB1dAordGVzdGluZyAiZ3JlcCAobm8gbmV3bGluZSBhdCBFT0wpIiAiZ3JlcCBidWcgaW5wdXQiICJidWdcbiIgImJ1ZyIgIiIKKworPmVtcHR5Cit0ZXN0aW5nICJncmVwIHR3byBmaWxlcyIgImdyZXAgdHdvIGlucHV0IGVtcHR5IDI+L2Rldi9udWxsIiBcCisJImlucHV0OnR3b1xuIiAib25lXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKK3JtIGVtcHR5CisKK3Rlc3RpbmcgImdyZXAgLSBpbmZpbGUgKHNwZWNpZnkgc3RkaW4gYW5kIGZpbGUpIiAiZ3JlcCB0d28gLSBpbnB1dCIgXAorCSIoc3RhbmRhcmQgaW5wdXQpOnR3b1xuaW5wdXQ6dHdvXG4iICJvbmVcbnR3b1xudGhyZWVcbiIgXAorCSJvbmVcbnR3b1xudG9vXG50aHJlZVxudGhyZWVcbiIKKworIyBDaGVjayBpZiB3ZSBzZWUgdGhlIGNvcnJlY3QgcmV0dXJuIHZhbHVlIGlmIGJvdGggc3RkaW4gYW5kIG5vbi1leGlzdGluZyBmaWxlCisjIGFyZSBnaXZlbi4KK3Rlc3RpbmcgImdyZXAgLSBub2ZpbGUgKHNwZWNpZnkgc3RkaW4gYW5kIG5vbmV4aXN0aW5nIGZpbGUpIiBcCisJImdyZXAgdHdvIC0gbm9uZXhpc3RlbnQgMj4gL2Rldi9udWxsIDsgZWNobyBcJD8iIFwKKwkiKHN0YW5kYXJkIGlucHV0KTp0d29cbihzdGFuZGFyZCBpbnB1dCk6dHdvXG4yXG4iIFwKKwkiIiAib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgordGVzdGluZyAiZ3JlcCAtcSAtIG5vZmlsZSAoc3BlY2lmeSBzdGRpbiBhbmQgbm9uZXhpc3RpbmcgZmlsZSwgbm8gbWF0Y2gpIiBcCisJImdyZXAgLXEgbm9tYXRjaCAtIG5vbmV4aXN0ZW50IDI+IC9kZXYvbnVsbCA7IGVjaG8gXCQ/IiBcCisJIjJcbiIgIiIgIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIKKyMgU1VTdjM6IElmIHRoZSAtcSBvcHRpb24gaXMgc3BlY2lmaWVkLCB0aGUgZXhpdCBzdGF0dXMgc2hhbGwgYmUgemVybworIyAgICAgICAgaWYgYW4gaW5wdXQgbGluZSBpcyBzZWxlY3RlZCwgZXZlbiBpZiBhbiBlcnJvciB3YXMgZGV0ZWN0ZWQuCit0ZXN0aW5nICJncmVwIC1xIC0gbm9maWxlIChzcGVjaWZ5IHN0ZGluIGFuZCBub25leGlzdGluZyBmaWxlLCBtYXRjaCkiIFwKKwkiZ3JlcCAtcSB0d28gLSBub25leGlzdGVudCA7IGVjaG8gXCQ/IiBcCisJIjBcbiIgIiIgIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIKKworIyBUZXN0IHZhcmlvdXMgY29tbWFuZCBsaW5lIG9wdGlvbnMKKyMgLXMgbm8gZXJyb3IgbWVzc2FnZXMKK3Rlc3RpbmcgImdyZXAgLXMgbm9maWxlIChub25leGlzdGluZyBmaWxlLCBubyBtYXRjaCkiIFwKKwkiZ3JlcCAtcyBub21hdGNoIG5vbmV4aXN0ZW50IDsgZWNobyBcJD8iICIyXG4iICIiICIiCit0ZXN0aW5nICJncmVwIC1zIG5vZmlsZSAtIChzdGRpbiBhbmQgbm9uZXhpc3RpbmcgZmlsZSwgbWF0Y2gpIiBcCisJImdyZXAgLXMgZG9tYXRjaCBub25leGlzdGVudCAtIDsgZWNobyBcJD8iIFwKKwkiKHN0YW5kYXJkIGlucHV0KTpkb21hdGNoXG4yXG4iICIiICJub21hdGNoXG5kb21hdGNoXG5lbmRcbiIKKworb3B0aW9uYWwgRVhUUkFfQ09NUEFUCit0ZXN0aW5nICJncmVwIGhhbmRsZXMgTlVMIGluIGZpbGVzIiAiZ3JlcCAtYSBmb28gaW5wdXQiICJcMGZvb1xuIiAiXDBmb29cblxuIiAiIgordGVzdGluZyAiZ3JlcCBoYW5kbGVzIE5VTCBvbiBzdGRpbiIgImdyZXAgLWEgZm9vIiAiXDBmb29cbiIgIiIgIlwwZm9vXG5cbiIKKwordGVzdGluZyAiZ3JlcCBtYXRjaGVzIE5VTCIgImdyZXAgLiBpbnB1dCA+IC9kZXYvbnVsbCAyPiYxIDsgZWNobyBcJD8iIFwKKwkiMFxuIiAiXDBcbiIgIiIKK1NLSVA9CisKKyMgLWUgcmVnZXgKK3Rlc3RpbmcgImdyZXAgaGFuZGxlcyBtdWx0aXBsZSByZWdleHBzIiAiZ3JlcCAtZSBvbmUgLWUgdHdvIGlucHV0IDsgZWNobyBcJD8iIFwKKwkib25lXG50d29cbjBcbiIgIm9uZVxudHdvXG4iICIiCit0ZXN0aW5nICJncmVwIC1GIGhhbmRsZXMgbXVsdGlwbGUgZXhwZXNzaW9ucyIgImdyZXAgLUYgLWUgb25lIC1lIHR3byBpbnB1dCA7IGVjaG8gXCQ/IiBcCisJIm9uZVxudHdvXG4wXG4iICJvbmVcbnR3b1xuIiAiIgordGVzdGluZyAiZ3JlcCAtRiBoYW5kbGVzIC1pIiAiZ3JlcCAtRiAtaSBmb28gaW5wdXQgOyBlY2hvIFwkPyIgXAorCSJGT09cbjBcbiIgIkZPT1xuIiAiIgorCisjIC1mIGZpbGUvLQordGVzdGluZyAiZ3JlcCBjYW4gcmVhZCByZWdleHBzIGZyb20gc3RkaW4iICJncmVwIC1mIC0gaW5wdXQgOyBlY2hvIFwkPyIgXAorCSJ0d29cbnRocmVlXG4wXG4iICJ0d1xudHdvXG50aHJlZVxuIiAidHcuXG50aHJcbiIKKworb3B0aW9uYWwgRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTCit0ZXN0aW5nICJncmVwIC1FIHN1cHBvcnRzIGV4dGVuZGVkIHJlZ2V4cHMiICJncmVwIC1FIGZvKyIgImZvb1xuIiAiIiBcCisJImJcYXJcbmZvb1xuYmF6IgordGVzdGluZyAiZ3JlcCBpcyBhbHNvIGVncmVwIiAiZWdyZXAgZm9vIiAiZm9vXG4iICIiICJmb29cbmJhclxuIgordGVzdGluZyAiZWdyZXAgaXMgbm90IGNhc2UgaW5zZW5zaXRpdmUiIFwKKwkiZWdyZXAgZm9vIDsgWyBcJD8gLW5lIDAgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiRk9PXG4iCit0ZXN0aW5nICJncmVwIC1FIC1vIHByaW50cyBhbGwgbWF0Y2hlcyIgXAorCSJncmVwIC1FIC1vICcoW1s6eGRpZ2l0Ol1dezJ9WzotXSl7NX1bWzp4ZGlnaXQ6XV17Mn0nIiBcCisJIjAwOjE5OjNFOjAwOkFBOjVFXG4wMDoxRDo2MDozRDozQTpGQlxuMDA6MjI6NDM6NDk6RkI6QUFcbiIgXAorCSIiICIwMDoxOTozRTowMDpBQTo1RSAwMDoxRDo2MDozRDozQTpGQiAwMDoyMjo0Mzo0OTpGQjpBQVxuIgorU0tJUD0KKwordGVzdGluZyAiZ3JlcCAtbyBkb2VzIG5vdCBsb29wIGZvcmV2ZXIiIFwKKwknZ3JlcCAtbyAiW14vXSokIicgXAorCSJ0ZXN0XG4iIFwKKwkiIiAiL3Zhci90ZXN0XG4iCit0ZXN0aW5nICJncmVwIC1vIGRvZXMgbm90IGxvb3AgZm9yZXZlciBvbiB6ZXJvLWxlbmd0aCBtYXRjaCIgXAorCSdncmVwIC1vICIiIHwgaGVhZCAtbjEnIFwKKwkiIiBcCisJIiIgInRlc3RcbiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZ3VuemlwLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2d1bnppcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGMwNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2d1bnppcC50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCisuIC4vYnVuemlwMi50ZXN0cwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2d1bnppcC9ndW56aXAtcmVhZHMtZnJvbS1zdGFuZGFyZC1pbnB1dCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ndW56aXAvZ3VuemlwLXJlYWRzLWZyb20tc3RhbmRhcmQtaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0OThjMAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ndW56aXAvZ3VuemlwLXJlYWRzLWZyb20tc3RhbmRhcmQtaW5wdXQKQEAgLTAsMCArMSwyIEBACitlY2hvIGZvbyB8IGd6aXAgfCBidXN5Ym94IGd1bnppcCA+IG91dHB1dAorZWNobyBmb28gfCBjbXAgLSBvdXRwdXQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1tdWx0aXBsZS1maWxlcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1tdWx0aXBsZS1maWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjBkOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2d6aXAvZ3ppcC1hY2NlcHRzLW11bHRpcGxlLWZpbGVzCkBAIC0wLDAgKzEsMyBAQAordG91Y2ggZm9vIGJhcgorYnVzeWJveCBnemlwIGZvbyBiYXIKK3Rlc3QgLWYgZm9vLmd6IC1hIC1mIGJhci5negpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2d6aXAvZ3ppcC1hY2NlcHRzLXNpbmdsZS1taW51cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1zaW5nbGUtbWludXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MWZkZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1zaW5nbGUtbWludXMKQEAgLTAsMCArMSBAQAorZWNobyBmb28gfCBidXN5Ym94IGd6aXAgLSA+L2Rldi9udWxsCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZ3ppcC9nemlwLXJlbW92ZXMtb3JpZ2luYWwtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9nemlwL2d6aXAtcmVtb3Zlcy1vcmlnaW5hbC1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Y2I5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvZ3ppcC9nemlwLXJlbW92ZXMtb3JpZ2luYWwtZmlsZQpAQCAtMCwwICsxLDMgQEAKK3RvdWNoIGZvbworYnVzeWJveCBnemlwIGZvbwordGVzdCAhIC1mIGZvbwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2hlYWQvaGVhZC1uLXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2hlYWQvaGVhZC1uLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDMyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaGVhZC9oZWFkLW4td29ya3MKQEAgLTAsMCArMSw0IEBACitbIC1uICIkZCIgXSB8fCBkPS4uCitoZWFkIC1uIDIgIiRkL1JFQURNRSIgPiBsb2dmaWxlLmdudQorYnVzeWJveCBoZWFkIC1uIDIgIiRkL1JFQURNRSIgPiBsb2dmaWxlLmJiCitjbXAgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2hlYWQvaGVhZC13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9oZWFkL2hlYWQtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZDNlMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9oZWFkL2hlYWQtd29ya3MKQEAgLTAsMCArMSw0IEBACitbIC1uICIkZCIgXSB8fCBkPS4uCitoZWFkICIkZC9SRUFETUUiID4gbG9nZmlsZS5nbnUKK2J1c3lib3ggaGVhZCAiJGQvUkVBRE1FIiA+IGxvZ2ZpbGUuYmIKK2NtcCBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaG9zdGlkL2hvc3RpZC13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ob3N0aWQvaG9zdGlkLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZmQ3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaG9zdGlkL2hvc3RpZC13b3JrcwpAQCAtMCwwICsxLDggQEAKK2g9eCQoYnVzeWJveCBob3N0aWQpCisjIElzICRoIGEgc2VxdWVuY2Ugb2YgaGV4IG51bWJlcnM/Cit4PSIke2gvL1swMTIzNDU2Nzg5YWJjZGVmXS94fSIKK3g9IiR7eC8veHh4L3h9IgoreD0iJHt4Ly94eHgveH0iCit4PSIke3gvL3h4eC94fSIKK3g9IiR7eC8veHgveH0iCit0ZXN0IHgiJHgiID0geCJ4IgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLWQtd29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtZC13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGMwYWFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLWQtd29ya3MKQEAgLTAsMCArMSwzIEBACitmPSQoYnVzeWJveCBob3N0bmFtZSAtZikuCitkPSQoYnVzeWJveCBob3N0bmFtZSAtZCkKK3Rlc3QgeCIke2YjKi59IiA9IHgiJGQke2Q6Ky59IgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLWktd29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtaS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjk5YmZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLWktd29ya3MKQEAgLTAsMCArMSw5IEBACit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgIT0geCIiICYmIGV4aXQKKworIyBPYnNlcnZlZCBidWc6CisjICMgLi9idXN5Ym94IGhvc3RuYW1lIC1pCisjIDEyNy4wLjAuMQorIyAjIGhvc3RuYW1lIC1pCisjIDEyNy4wLjAuMSAxMC4wLjAuMiAxMC4zMi4xMC40NQorCit0ZXN0IHgkKGhvc3RuYW1lIC1pKSA9IHgkKGJ1c3lib3ggaG9zdG5hbWUgLWkpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtcy13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS1zLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmI5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtcy13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGhvc3RuYW1lIC1zKSA9IHgkKGJ1c3lib3ggaG9zdG5hbWUgLXMpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtd29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxYTQwNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGhvc3RuYW1lKSA9IHgkKGJ1c3lib3ggaG9zdG5hbWUpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaWQvaWQtZy13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9pZC9pZC1nLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWZjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaWQvaWQtZy13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGlkIC1nKSA9IHgkKGJ1c3lib3ggaWQgLWcpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaWQvaWQtdS13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9pZC9pZC11LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNThjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaWQvaWQtdS13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGlkIC11KSA9IHgkKGJ1c3lib3ggaWQgLXUpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaWQvaWQtdW4td29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvaWQvaWQtdW4td29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzOTBlNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9pZC9pZC11bi13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGlkIC11bikgPSB4JChidXN5Ym94IGlkIC11bikKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9pZC9pZC11ci13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9pZC9pZC11ci13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjBmY2IwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2lkL2lkLXVyLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoaWQgLXVyKSA9IHgkKGJ1c3lib3ggaWQgLXVyKQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xuL2xuLWNyZWF0ZXMtaGFyZC1saW5rcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9sbi9sbi1jcmVhdGVzLWhhcmQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2ZTIzZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9sbi9sbi1jcmVhdGVzLWhhcmQtbGlua3MKQEAgLTAsMCArMSw0IEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitidXN5Ym94IGxuIGZpbGUxIGxpbmsxCit0ZXN0IC1mIGZpbGUxCit0ZXN0IC1mIGxpbmsxCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbG4vbG4tY3JlYXRlcy1zb2Z0LWxpbmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xuL2xuLWNyZWF0ZXMtc29mdC1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1ZTRjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xuL2xuLWNyZWF0ZXMtc29mdC1saW5rcwpAQCAtMCwwICsxLDQgQEAKK2VjaG8gZmlsZSBudW1iZXIgb25lID4gZmlsZTEKK2J1c3lib3ggbG4gLXMgZmlsZTEgbGluazEKK3Rlc3QgLUwgbGluazEKK3Rlc3QgeGZpbGUxID0geGByZWFkbGluayBsaW5rMWAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9sbi9sbi1mb3JjZS1jcmVhdGVzLWhhcmQtbGlua3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbG4vbG4tZm9yY2UtY3JlYXRlcy1oYXJkLWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NmI3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbG4vbG4tZm9yY2UtY3JlYXRlcy1oYXJkLWxpbmtzCkBAIC0wLDAgKzEsNSBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBsaW5rMQorYnVzeWJveCBsbiAtZiBmaWxlMSBsaW5rMQordGVzdCAtZiBmaWxlMQordGVzdCAtZiBsaW5rMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xuL2xuLWZvcmNlLWNyZWF0ZXMtc29mdC1saW5rcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9sbi9sbi1mb3JjZS1jcmVhdGVzLXNvZnQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiOGQxZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9sbi9sbi1mb3JjZS1jcmVhdGVzLXNvZnQtbGlua3MKQEAgLTAsMCArMSw1IEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitlY2hvIGZpbGUgbnVtYmVyIHR3byA+IGxpbmsxCitidXN5Ym94IGxuIC1mIC1zIGZpbGUxIGxpbmsxCit0ZXN0IC1MIGxpbmsxCit0ZXN0IHhmaWxlMSA9IHhgcmVhZGxpbmsgbGluazFgCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbG4vbG4tcHJlc2VydmVzLWhhcmQtbGlua3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbG4vbG4tcHJlc2VydmVzLWhhcmQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmYjk4OQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9sbi9sbi1wcmVzZXJ2ZXMtaGFyZC1saW5rcwpAQCAtMCwwICsxLDggQEAKK2VjaG8gZmlsZSBudW1iZXIgb25lID4gZmlsZTEKK2VjaG8gZmlsZSBudW1iZXIgdHdvID4gbGluazEKK3NldCArZQorYnVzeWJveCBsbiBmaWxlMSBsaW5rMQoraWYgWyAkPyAhPSAwIF0gOyB0aGVuCisJZXhpdCAwOworZmkKK2V4aXQgMTsKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9sbi9sbi1wcmVzZXJ2ZXMtc29mdC1saW5rcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9sbi9sbi1wcmVzZXJ2ZXMtc29mdC1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ5YmVkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xuL2xuLXByZXNlcnZlcy1zb2Z0LWxpbmtzCkBAIC0wLDAgKzEsOCBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBsaW5rMQorc2V0ICtlCitidXN5Ym94IGxuIC1zIGZpbGUxIGxpbmsxCitpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKwlleGl0IDA7CitmaQorZXhpdCAxOwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xzLm1rX3VuaV90ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9scy5ta191bmlfdGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwYzI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9scy5ta191bmlfdGVzdHMKQEAgLTAsMCArMSwxMTEgQEAKKyMgRE8gTk9UIEVESVQgVEhJUyBGSUxFISBNT1NUIFRFWFQgRURJVE9SUyBXSUxMIERBTUFHRSBJVCEKKz4nMDAwMV8xX19Tb21lX2NvcnJlY3RfVVRGLThfdGV4dF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDAyXzJfX0JvdW5kYXJ5X2NvbmRpdGlvbl90ZXN0X2Nhc2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMDNfMi4xX19GaXJzdF9wb3NzaWJsZV9zZXF1ZW5jZV9vZl9hX2NlcnRhaW5fbGVuZ3RoX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwNF8yLjEuMl9fMl9ieXRlc19fVS0wMDAwMDA4MF86X19fX19fX18iwoAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwNV8yLjEuM19fM19ieXRlc19fVS0wMDAwMDgwMF86X19fX19fX18i4KCAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMDZfMi4xLjRfXzRfYnl0ZXNfX1UtMDAwMTAwMDBfOl9fX19fX19fIvCQgIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwN18yLjEuNV9fNV9ieXRlc19fVS0wMDIwMDAwMF86X19fX19fX18i+IiAgIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwOF8yLjEuNl9fNl9ieXRlc19fVS0wNDAwMDAwMF86X19fX19fX18i/ISAgICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMDlfMi4yX19MYXN0X3Bvc3NpYmxlX3NlcXVlbmNlX29mX2FfY2VydGFpbl9sZW5ndGhfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxMF8yLjIuMV9fMV9ieXRlX19fVS0wMDAwMDA3Rl86X19fX19fX18ifyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDExXzIuMi4yX18yX2J5dGVzX19VLTAwMDAwN0ZGXzpfX19fX19fXyLfvyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDEyXzIuMi4zX18zX2J5dGVzX19VLTAwMDBGRkZGXzpfX19fX19fXyLvv78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxM18yLjIuNF9fNF9ieXRlc19fVS0wMDFGRkZGRl86X19fX19fX18i97+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDE0XzIuMi41X181X2J5dGVzX19VLTAzRkZGRkZGXzpfX19fX19fXyL7v7+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDE1XzIuMi42X182X2J5dGVzX19VLTdGRkZGRkZGXzpfX19fX19fXyL9v7+/v78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxNl8yLjNfX090aGVyX2JvdW5kYXJ5X2NvbmRpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDE3XzIuMy4xX19VLTAwMDBEN0ZGXz1fZWRfOWZfYmZfPV8i7Z+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxOF8yLjMuMl9fVS0wMDAwRTAwMF89X2VlXzgwXzgwXz1fIu6AgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMTlfMi4zLjNfX1UtMDAwMEZGRkRfPV9lZl9iZl9iZF89XyLvv70iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDIwXzIuMy40X19VLTAwMTBGRkZGXz1fZjRfOGZfYmZfYmZfPV8i9I+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjFfMi4zLjVfX1UtMDAxMTAwMDBfPV9mNF85MF84MF84MF89XyL0kICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyMl8zX19NYWxmb3JtZWRfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDIzXzMuMV9fVW5leHBlY3RlZF9jb250aW51YXRpb25fYnl0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjRfMy4xLjFfX0ZpcnN0X2NvbnRpbnVhdGlvbl9ieXRlXzB4ODA6XyKAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyNV8zLjEuMl9fTGFzdF9fY29udGludWF0aW9uX2J5dGVfMHhiZjpfIr8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDI2XzMuMS4zX18yX2NvbnRpbnVhdGlvbl9ieXRlczpfIoC/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjdfMy4xLjRfXzNfY29udGludWF0aW9uX2J5dGVzOl8igL+AIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyOF8zLjEuNV9fNF9jb250aW51YXRpb25fYnl0ZXM6XyKAv4C/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDI5XzMuMS42X181X2NvbnRpbnVhdGlvbl9ieXRlczpfIoC/gL+AIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMzBfMy4xLjdfXzZfY29udGludWF0aW9uX2J5dGVzOl8igL+Av4C/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAzMV8zLjEuOF9fN19jb250aW51YXRpb25fYnl0ZXM6XyKAv4C/gL+AIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDMyXzMuMS45X19TZXF1ZW5jZV9vZl9hbGxfNjRfcG9zc2libGVfY29udGludWF0aW9uX2J5dGVzX18weDgwLTB4YmZfOl9fX3wnCis+JzAwMzNfX19fIoCBgoOEhYaHiImKi4yNjo9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAzNF9fX19fkJGSk5SVlpeYmZqbnJ2en19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDM1X19fX1+goaKjpKWmp6ipqqusra6vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMzZfX19fX7CxsrO0tba3uLm6u7y9vr8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAzN18zLjJfX0xvbmVseV9zdGFydF9jaGFyYWN0ZXJzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDM4XzMuMi4xX19BbGxfMzJfZmlyc3RfYnl0ZXNfb2ZfMi1ieXRlX3NlcXVlbmNlc19fMHhjMC0weGRmXyxfX19fX19fX19fX3wnCis+JzAwMzlfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA0MF9fX18iwF/BX8Jfw1/EX8Vfxl/HX8hfyV/KX8tfzF/NX85fz19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDQxX19fX1/QX9Ff0l/TX9Rf1V/WX9df2F/ZX9pf21/cX91f3l/fXyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDJfMy4yLjJfX0FsbF8xNl9maXJzdF9ieXRlc19vZl8zLWJ5dGVfc2VxdWVuY2VzX18weGUwLTB4ZWZfLF9fX19fX19fX19ffCcKKz4nMDA0M19fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDQ0X19fXyLgX+Ff4l/jX+Rf5V/mX+df6F/pX+pf61/sX+1f7l/vXyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDVfMy4yLjNfX0FsbF84X2ZpcnN0X2J5dGVzX29mXzQtYnl0ZV9zZXF1ZW5jZXNfXzB4ZjAtMHhmN18sX19fX19fX19fX19ffCcKKz4nMDA0Nl9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDQ3X19fXyLwX/Ff8l/zX/Rf9V/2X/dfIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDhfMy4yLjRfX0FsbF80X2ZpcnN0X2J5dGVzX29mXzUtYnl0ZV9zZXF1ZW5jZXNfXzB4ZjgtMHhmYl8sX19fX19fX19fX19ffCcKKz4nMDA0OV9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDUwX19fXyL4X/lf+l/7XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNTFfMy4yLjVfX0FsbF8yX2ZpcnN0X2J5dGVzX29mXzYtYnl0ZV9zZXF1ZW5jZXNfXzB4ZmMtMHhmZF8sX19fX19fX19fX19ffCcKKz4nMDA1Ml9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDUzX19fXyL8X/1fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNTRfMy4zX19TZXF1ZW5jZXNfd2l0aF9sYXN0X2NvbnRpbnVhdGlvbl9ieXRlX21pc3NpbmdfX19fX19fX19fX19fX19fX19ffCcKKz4nMDA1NV8zLjMuMV9fMi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iwCJfX19fX198JworPicwMDU2XzMuMy4yX18zLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyLggCJfX19fX198JworPicwMDU3XzMuMy4zX180LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyLwgIAiX19fX19ffCcKKz4nMDA1OF8zLjMuNF9fNS1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18i+ICAgCJfX19fX198JworPicwMDU5XzMuMy41X182LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyL8gICAgCJfX19fX198JworPicwMDYwXzMuMy42X18yLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wMDAwMDdGRl86XyLfIl9fX19fX3wnCis+JzAwNjFfMy4zLjdfXzMtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMDBGRkZGXzpfIu+/Il9fX19fX3wnCis+JzAwNjJfMy4zLjhfXzQtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMUZGRkZGXzpfIve/vyJfX19fX198JworPicwMDYzXzMuMy45X181LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wM0ZGRkZGRl86XyL7v7+/Il9fX19fX3wnCis+JzAwNjRfMy4zLjEwXzYtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTdGRkZGRkZGXzpfIv2/v7+/Il9fX19fX3wnCis+JzAwNjVfMy40X19Db25jYXRlbmF0aW9uX29mX2luY29tcGxldGVfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA2Nl9fX18iwOCA8ICA+ICAgPyAgICA3++/97+/+7+/v/2/v7+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNjdfMy41X19JbXBvc3NpYmxlX2J5dGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA2OF8zLjUuMV9fZmVfPV8i/iJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDY5XzMuNS4yX19mZl89XyL/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzBfMy41LjNfX2ZlX2ZlX2ZmX2ZmXz1fIv7+//8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA3MV80X19PdmVybG9uZ19zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDcyXzQuMV9fRXhhbXBsZXNfb2ZfYW5fb3ZlcmxvbmdfQVNDSUlfY2hhcmFjdGVyX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzNfNC4xLjFfVSswMDJGXz1fYzBfYWZfX19fX19fX19fX19fPV8iwK8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzRfNC4xLjJfVSswMDJGXz1fZTBfODBfYWZfX19fX19fX19fPV8i4ICvIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDc1XzQuMS4zX1UrMDAyRl89X2YwXzgwXzgwX2FmX19fX19fXz1fIvCAgK8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzZfNC4xLjRfVSswMDJGXz1fZjhfODBfODBfODBfYWZfX19fPV8i+ICAgK8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzdfNC4xLjVfVSswMDJGXz1fZmNfODBfODBfODBfODBfYWZfPV8i/ICAgICvIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDc4XzQuMl9fTWF4aW11bV9vdmVybG9uZ19zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzlfNC4yLjFfX1UtMDAwMDAwN0ZfPV9jMV9iZl9fX19fX19fX19fX189XyLBvyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODBfNC4yLjJfX1UtMDAwMDA3RkZfPV9lMF85Zl9iZl9fX19fX19fX189XyLgn78iX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDgxXzQuMi4zX19VLTAwMDBGRkZGXz1fZjBfOGZfYmZfYmZfX19fX19fPV8i8I+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODJfNC4yLjRfX1UtMDAxRkZGRkZfPV9mOF84N19iZl9iZl9iZl9fX189XyL4h7+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODNfNC4yLjVfX1UtMDNGRkZGRkZfPV9mY184M19iZl9iZl9iZl9iZl89XyL8g7+/v78iX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDg0XzQuM19fT3ZlcmxvbmdfcmVwcmVzZW50YXRpb25fb2ZfdGhlX05VTF9jaGFyYWN0ZXJfX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODVfNC4zLjFfX1UrMDAwMF89X2MwXzgwX19fX19fX19fX19fXz1fIsCAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODZfNC4zLjJfX1UrMDAwMF89X2UwXzgwXzgwX19fX19fX19fXz1fIuCAgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDg3XzQuMy4zX19VKzAwMDBfPV9mMF84MF84MF84MF9fX19fX189XyLwgICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODhfNC4zLjRfX1UrMDAwMF89X2Y4XzgwXzgwXzgwXzgwX19fXz1fIviAgICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODlfNC4zLjVfX1UrMDAwMF89X2ZjXzgwXzgwXzgwXzgwXzgwXz1fIvyAgICAgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDkwXzVfX0lsbGVnYWxfY29kZV9wb3NpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTFfNS4xX1NpbmdsZV9VVEYtMTZfc3Vycm9nYXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5Ml81LjEuMV9fVStEODAwXz1fZWRfYTBfODBfPV8i7aCAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTNfNS4xLjJfX1UrREI3Rl89X2VkX2FkX2JmXz1fIu2tvyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDk0XzUuMS4zX19VK0RCODBfPV9lZF9hZV84MF89XyLtroAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5NV81LjEuNF9fVStEQkZGXz1fZWRfYWZfYmZfPV8i7a+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTZfNS4xLjVfX1UrREMwMF89X2VkX2IwXzgwXz1fIu2wgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDk3XzUuMS42X19VK0RGODBfPV9lZF9iZV84MF89XyLtvoAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5OF81LjEuN19fVStERkZGXz1fZWRfYmZfYmZfPV8i7b+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTlfNS4yX1BhaXJlZF9VVEYtMTZfc3Vycm9nYXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwMF81LjIuMV9fVStEODAwX1UrREMwMF89X2VkX2EwXzgwX2VkX2IwXzgwXz1fIu2ggO2wgCJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwMV81LjIuMl9fVStEODAwX1UrREZGRl89X2VkX2EwXzgwX2VkX2JmX2JmXz1fIu2ggO2/vyJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwMl81LjIuM19fVStEQjdGX1UrREMwMF89X2VkX2FkX2JmX2VkX2IwXzgwXz1fIu2tv+2wgCJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwM181LjIuNF9fVStEQjdGX1UrREZGRl89X2VkX2FkX2JmX2VkX2JmX2JmXz1fIu2tv+2/vyJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwNF81LjIuNV9fVStEQjgwX1UrREMwMF89X2VkX2FlXzgwX2VkX2IwXzgwXz1fIu2ugO2wgCJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwNV81LjIuNl9fVStEQjgwX1UrREZGRl89X2VkX2FlXzgwX2VkX2JmX2JmXz1fIu2ugO2/vyJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwNl81LjIuN19fVStEQkZGX1UrREMwMF89X2VkX2FmX2JmX2VkX2IwXzgwXz1fIu2vv+2wgCJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwN181LjIuOF9fVStEQkZGX1UrREZGRl89X2VkX2FmX2JmX2VkX2JmX2JmXz1fIu2vv+2/vyJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwOF81LjNfT3RoZXJfaWxsZWdhbF9jb2RlX3Bvc2l0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMTA5XzUuMy4xX19VK0ZGRkVfPV9lZl9iZl9iZV89XyLvv74iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDExMF81LjMuMl9fVStGRkZGXz1fZWZfYmZfYmZfPV8i77+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbHMudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbHMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTMwOWQzNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9scy50ZXN0cwpAQCAtMCwwICsxLDI2OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworcm0gLXJmIGxzLnRlc3RkaXIgMj4vZGV2L251bGwKK21rZGlyIGxzLnRlc3RkaXIgfHwgZXhpdCAxCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZCIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworIyBXaXRoIFVuaWNvZGUgcHJvdmlkZWQgYnkgbGliYyBsb2NhbGUsIEknbSBub3Qgc3VyZSB0aGlzIHRlc3QgY2FuIHBhc3MuCisjIEkgc3VzcGVjdCB3ZSBtaWdodCBmYWlsIHRvIHNraXAgZXhhY3RseSBjb3JyZWN0IG51bWJlciBvZiBieXRlcworIyBvdmVyIGJyb2tlZCB1bmljb2RlIHNlcXVlbmNlcy4KK3Rlc3QgeCIkQ09ORklHX1VOSUNPREVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIiAhPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1NVQlNUX1dDSEFSIiA9IHgiNjMiIFwKKyYmIHRlc3QgeCIkQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIiA9IHgiNzY3IiBcCismJiB0ZXN0IHgiJENPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUyIgPSB4InkiIFwKKyYmIHRlc3RpbmcgImxzIHVuaWNvZGUgdGVzdCB3aXRoIGNvZGVwb2ludHMgbGltaXRlZCB0byA3NjciIFwKKyIoY2QgbHMudGVzdGRpciAmJiBzaCAuLi9scy5ta191bmlfdGVzdHMpICYmIGxzIC0xIGxzLnRlc3RkaXIiIFwKKycwMDAxXzFfX1NvbWVfY29ycmVjdF9VVEYtOF90ZXh0X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDJfMl9fQm91bmRhcnlfY29uZGl0aW9uX3Rlc3RfY2FzZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwM18yLjFfX0ZpcnN0X3Bvc3NpYmxlX3NlcXVlbmNlX29mX2FfY2VydGFpbl9sZW5ndGhfX19fX19fX19fX19fX19fX19fX198CiswMDA0XzIuMS4yX18yX2J5dGVzX19VLTAwMDAwMDgwXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDVfMi4xLjNfXzNfYnl0ZXNfX1UtMDAwMDA4MDBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwNl8yLjEuNF9fNF9ieXRlc19fVS0wMDAxMDAwMF86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA3XzIuMS41X181X2J5dGVzX19VLTAwMjAwMDAwXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDhfMi4xLjZfXzZfYnl0ZXNfX1UtMDQwMDAwMDBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwOV8yLjJfX0xhc3RfcG9zc2libGVfc2VxdWVuY2Vfb2ZfYV9jZXJ0YWluX2xlbmd0aF9fX19fX19fX19fX19fX19fX19fX198CiswMDEwXzIuMi4xX18xX2J5dGVfX19VLTAwMDAwMDdGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTFfMi4yLjJfXzJfYnl0ZXNfX1UtMDAwMDA3RkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxMl8yLjIuM19fM19ieXRlc19fVS0wMDAwRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDEzXzIuMi40X180X2J5dGVzX19VLTAwMUZGRkZGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTRfMi4yLjVfXzVfYnl0ZXNfX1UtMDNGRkZGRkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxNV8yLjIuNl9fNl9ieXRlc19fVS03RkZGRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE2XzIuM19fT3RoZXJfYm91bmRhcnlfY29uZGl0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTdfMi4zLjFfX1UtMDAwMEQ3RkZfPV9lZF85Zl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxOF8yLjMuMl9fVS0wMDAwRTAwMF89X2VlXzgwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE5XzIuMy4zX19VLTAwMDBGRkZEXz1fZWZfYmZfYmRfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjBfMi4zLjRfX1UtMDAxMEZGRkZfPV9mNF84Zl9iZl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyMV8yLjMuNV9fVS0wMDExMDAwMF89X2Y0XzkwXzgwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDIyXzNfX01hbGZvcm1lZF9zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjNfMy4xX19VbmV4cGVjdGVkX2NvbnRpbnVhdGlvbl9ieXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyNF8zLjEuMV9fRmlyc3RfY29udGludWF0aW9uX2J5dGVfMHg4MDpfIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI1XzMuMS4yX19MYXN0X19jb250aW51YXRpb25fYnl0ZV8weGJmOl8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjZfMy4xLjNfXzJfY29udGludWF0aW9uX2J5dGVzOl8iPz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyN18zLjEuNF9fM19jb250aW51YXRpb25fYnl0ZXM6XyI/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI4XzMuMS41X180X2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjlfMy4xLjZfXzVfY29udGludWF0aW9uX2J5dGVzOl8iPz8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzMF8zLjEuN19fNl9jb250aW51YXRpb25fYnl0ZXM6XyI/Pz8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDMxXzMuMS44X183X2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/Pz8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzJfMy4xLjlfX1NlcXVlbmNlX29mX2FsbF82NF9wb3NzaWJsZV9jb250aW51YXRpb25fYnl0ZXNfXzB4ODAtMHhiZl86X19ffAorMDAzM19fX18iPz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDM0X19fX18/Pz8/Pz8/Pz8/Pz8/Pz8/X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzVfX19fXz8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzNl9fX19fPz8/Pz8/Pz8/Pz8/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDM3XzMuMl9fTG9uZWx5X3N0YXJ0X2NoYXJhY3RlcnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzhfMy4yLjFfX0FsbF8zMl9maXJzdF9ieXRlc19vZl8yLWJ5dGVfc2VxdWVuY2VzX18weGMwLTB4ZGZfLF9fX19fX19fX19ffAorMDAzOV9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQwX19fXyI/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDFfX19fXz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0Ml8zLjIuMl9fQWxsXzE2X2ZpcnN0X2J5dGVzX29mXzMtYnl0ZV9zZXF1ZW5jZXNfXzB4ZTAtMHhlZl8sX19fX19fX19fX198CiswMDQzX19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDRfX19fIj9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0NV8zLjIuM19fQWxsXzhfZmlyc3RfYnl0ZXNfb2ZfNC1ieXRlX3NlcXVlbmNlc19fMHhmMC0weGY3XyxfX19fX19fX19fX198CiswMDQ2X19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDdfX19fIj9fP18/Xz9fP18/Xz9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0OF8zLjIuNF9fQWxsXzRfZmlyc3RfYnl0ZXNfb2ZfNS1ieXRlX3NlcXVlbmNlc19fMHhmOC0weGZiXyxfX19fX19fX19fX198CiswMDQ5X19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNTBfX19fIj9fP18/Xz9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA1MV8zLjIuNV9fQWxsXzJfZmlyc3RfYnl0ZXNfb2ZfNi1ieXRlX3NlcXVlbmNlc19fMHhmYy0weGZkXyxfX19fX19fX19fX198CiswMDUyX19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNTNfX19fIj9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA1NF8zLjNfX1NlcXVlbmNlc193aXRoX2xhc3RfY29udGludWF0aW9uX2J5dGVfbWlzc2luZ19fX19fX19fX19fX19fX19fX198CiswMDU1XzMuMy4xX18yLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyI/Il9fX19fX3wKKzAwNTZfMy4zLjJfXzMtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA1N18zLjMuM19fNC1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iPyJfX19fX198CiswMDU4XzMuMy40X181LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyI/Il9fX19fX3wKKzAwNTlfMy4zLjVfXzYtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA2MF8zLjMuNl9fMi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDAwMDA3RkZfOl8iPyJfX19fX198CiswMDYxXzMuMy43X18zLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wMDAwRkZGRl86XyI/Il9fX19fX3wKKzAwNjJfMy4zLjhfXzQtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMUZGRkZGXzpfIj8iX19fX19ffAorMDA2M18zLjMuOV9fNS1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDNGRkZGRkZfOl8iPyJfX19fX198CiswMDY0XzMuMy4xMF82LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS03RkZGRkZGRl86XyI/Il9fX19fX3wKKzAwNjVfMy40X19Db25jYXRlbmF0aW9uX29mX2luY29tcGxldGVfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA2Nl9fX18iPz8/Pz8/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDY3XzMuNV9fSW1wb3NzaWJsZV9ieXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNjhfMy41LjFfX2ZlXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA2OV8zLjUuMl9fZmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDcwXzMuNS4zX19mZV9mZV9mZl9mZl89XyI/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzFfNF9fT3Zlcmxvbmdfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3Ml80LjFfX0V4YW1wbGVzX29mX2FuX292ZXJsb25nX0FTQ0lJX2NoYXJhY3Rlcl9fX19fX19fX19fX19fX19fX19fX19fX198CiswMDczXzQuMS4xX1UrMDAyRl89X2MwX2FmX19fX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzRfNC4xLjJfVSswMDJGXz1fZTBfODBfYWZfX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3NV80LjEuM19VKzAwMkZfPV9mMF84MF84MF9hZl9fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc2XzQuMS40X1UrMDAyRl89X2Y4XzgwXzgwXzgwX2FmX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzdfNC4xLjVfVSswMDJGXz1fZmNfODBfODBfODBfODBfYWZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3OF80LjJfX01heGltdW1fb3Zlcmxvbmdfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc5XzQuMi4xX19VLTAwMDAwMDdGXz1fYzFfYmZfX19fX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODBfNC4yLjJfX1UtMDAwMDA3RkZfPV9lMF85Zl9iZl9fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4MV80LjIuM19fVS0wMDAwRkZGRl89X2YwXzhmX2JmX2JmX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDgyXzQuMi40X19VLTAwMUZGRkZGXz1fZjhfODdfYmZfYmZfYmZfX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODNfNC4yLjVfX1UtMDNGRkZGRkZfPV9mY184M19iZl9iZl9iZl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4NF80LjNfX092ZXJsb25nX3JlcHJlc2VudGF0aW9uX29mX3RoZV9OVUxfY2hhcmFjdGVyX19fX19fX19fX19fX19fX19fX198CiswMDg1XzQuMy4xX19VKzAwMDBfPV9jMF84MF9fX19fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODZfNC4zLjJfX1UrMDAwMF89X2UwXzgwXzgwX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4N180LjMuM19fVSswMDAwXz1fZjBfODBfODBfODBfX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDg4XzQuMy40X19VKzAwMDBfPV9mOF84MF84MF84MF84MF9fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODlfNC4zLjVfX1UrMDAwMF89X2ZjXzgwXzgwXzgwXzgwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5MF81X19JbGxlZ2FsX2NvZGVfcG9zaXRpb25zX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDkxXzUuMV9TaW5nbGVfVVRGLTE2X3N1cnJvZ2F0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTJfNS4xLjFfX1UrRDgwMF89X2VkX2EwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5M181LjEuMl9fVStEQjdGXz1fZWRfYWRfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk0XzUuMS4zX19VK0RCODBfPV9lZF9hZV84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTVfNS4xLjRfX1UrREJGRl89X2VkX2FmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5Nl81LjEuNV9fVStEQzAwXz1fZWRfYjBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk3XzUuMS42X19VK0RGODBfPV9lZF9iZV84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOThfNS4xLjdfX1UrREZGRl89X2VkX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5OV81LjJfUGFpcmVkX1VURi0xNl9zdXJyb2dhdGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMTAwXzUuMi4xX19VK0Q4MDBfVStEQzAwXz1fZWRfYTBfODBfZWRfYjBfODBfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDFfNS4yLjJfX1UrRDgwMF9VK0RGRkZfPV9lZF9hMF84MF9lZF9iZl9iZl89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwMl81LjIuM19fVStEQjdGX1UrREMwMF89X2VkX2FkX2JmX2VkX2IwXzgwXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTAzXzUuMi40X19VK0RCN0ZfVStERkZGXz1fZWRfYWRfYmZfZWRfYmZfYmZfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDRfNS4yLjVfX1UrREI4MF9VK0RDMDBfPV9lZF9hZV84MF9lZF9iMF84MF89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwNV81LjIuNl9fVStEQjgwX1UrREZGRl89X2VkX2FlXzgwX2VkX2JmX2JmXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA2XzUuMi43X19VK0RCRkZfVStEQzAwXz1fZWRfYWZfYmZfZWRfYjBfODBfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDdfNS4yLjhfX1UrREJGRl9VK0RGRkZfPV9lZF9hZl9iZl9lZF9iZl9iZl89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwOF81LjNfT3RoZXJfaWxsZWdhbF9jb2RlX3Bvc2l0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMTA5XzUuMy4xX19VK0ZGRkVfPV9lZl9iZl9iZV89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMTBfNS4zLjJfX1UrRkZGRl89X2VmX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorJyAiIiAiIgorCisjIEN1cnJlbnRseSBmYWlscyBvbiAiMDA4MF80LjIuMl9fVS0wMDAwMDdGRl89X2UwXzlmX2JmIiBsaW5lCit0ZXN0IHgiJENPTkZJR19VTklDT0RFX1NVUFBPUlQiID0geCJ5IiBcCismJiB0ZXN0IHgiJENPTkZJR19VTklDT0RFX1VTSU5HX0xPQ0FMRSIgIT0geCJ5IiBcCismJiB0ZXN0IHgiJENPTkZJR19TVUJTVF9XQ0hBUiIgPSB4IjYzIiBcCismJiB0ZXN0IHgiJENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiIgPSB4IjAiIFwKKyYmIHRlc3RpbmcgImxzIHVuaWNvZGUgdGVzdCB3aXRoIHVubGltaXRlZCBjb2RlcG9pbnRzIiBcCisiKGNkIGxzLnRlc3RkaXIgJiYgc2ggLi4vbHMubWtfdW5pX3Rlc3RzKSAmJiBscyAtMSBscy50ZXN0ZGlyIiBcCisnMDAwMV8xX19Tb21lX2NvcnJlY3RfVVRGLThfdGV4dF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDAyXzJfX0JvdW5kYXJ5X2NvbmRpdGlvbl90ZXN0X2Nhc2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDNfMi4xX19GaXJzdF9wb3NzaWJsZV9zZXF1ZW5jZV9vZl9hX2NlcnRhaW5fbGVuZ3RoX19fX19fX19fX19fX19fX19fX19ffAorMDAwNF8yLjEuMl9fMl9ieXRlc19fVS0wMDAwMDA4MF86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA1XzIuMS4zX18zX2J5dGVzX19VLTAwMDAwODAwXzpfX19fX19fXyLgoIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwNl8yLjEuNF9fNF9ieXRlc19fVS0wMDAxMDAwMF86X19fX19fX18i8JCAgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA3XzIuMS41X181X2J5dGVzX19VLTAwMjAwMDAwXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDhfMi4xLjZfXzZfYnl0ZXNfX1UtMDQwMDAwMDBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwOV8yLjJfX0xhc3RfcG9zc2libGVfc2VxdWVuY2Vfb2ZfYV9jZXJ0YWluX2xlbmd0aF9fX19fX19fX19fX19fX19fX19fX198CiswMDEwXzIuMi4xX18xX2J5dGVfX19VLTAwMDAwMDdGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTFfMi4yLjJfXzJfYnl0ZXNfX1UtMDAwMDA3RkZfOl9fX19fX19fIt+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTJfMi4yLjNfXzNfYnl0ZXNfX1UtMDAwMEZGRkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxM18yLjIuNF9fNF9ieXRlc19fVS0wMDFGRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE0XzIuMi41X181X2J5dGVzX19VLTAzRkZGRkZGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTVfMi4yLjZfXzZfYnl0ZXNfX1UtN0ZGRkZGRkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxNl8yLjNfX090aGVyX2JvdW5kYXJ5X2NvbmRpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE3XzIuMy4xX19VLTAwMDBEN0ZGXz1fZWRfOWZfYmZfPV8i7Z+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxOF8yLjMuMl9fVS0wMDAwRTAwMF89X2VlXzgwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE5XzIuMy4zX19VLTAwMDBGRkZEXz1fZWZfYmZfYmRfPV8i77+9Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyMF8yLjMuNF9fVS0wMDEwRkZGRl89X2Y0XzhmX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDIxXzIuMy41X19VLTAwMTEwMDAwXz1fZjRfOTBfODBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjJfM19fTWFsZm9ybWVkX3NlcXVlbmNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyM18zLjFfX1VuZXhwZWN0ZWRfY29udGludWF0aW9uX2J5dGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI0XzMuMS4xX19GaXJzdF9jb250aW51YXRpb25fYnl0ZV8weDgwOl8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjVfMy4xLjJfX0xhc3RfX2NvbnRpbnVhdGlvbl9ieXRlXzB4YmY6XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyNl8zLjEuM19fMl9jb250aW51YXRpb25fYnl0ZXM6XyI/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI3XzMuMS40X18zX2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjhfMy4xLjVfXzRfY29udGludWF0aW9uX2J5dGVzOl8iPz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyOV8zLjEuNl9fNV9jb250aW51YXRpb25fYnl0ZXM6XyI/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDMwXzMuMS43X182X2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzFfMy4xLjhfXzdfY29udGludWF0aW9uX2J5dGVzOl8iPz8/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzMl8zLjEuOV9fU2VxdWVuY2Vfb2ZfYWxsXzY0X3Bvc3NpYmxlX2NvbnRpbnVhdGlvbl9ieXRlc19fMHg4MC0weGJmXzpfX198CiswMDMzX19fXyI/Pz8/Pz8/Pz8/Pz8/Pz8/X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzRfX19fXz8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzNV9fX19fPz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDM2X19fX18/Pz8/Pz8/Pz8/Pz8/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzdfMy4yX19Mb25lbHlfc3RhcnRfY2hhcmFjdGVyc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzOF8zLjIuMV9fQWxsXzMyX2ZpcnN0X2J5dGVzX29mXzItYnl0ZV9zZXF1ZW5jZXNfXzB4YzAtMHhkZl8sX19fX19fX19fX198CiswMDM5X19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDBfX19fIj9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0MV9fX19fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQyXzMuMi4yX19BbGxfMTZfZmlyc3RfYnl0ZXNfb2ZfMy1ieXRlX3NlcXVlbmNlc19fMHhlMC0weGVmXyxfX19fX19fX19fX3wKKzAwNDNfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0NF9fX18iP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQ1XzMuMi4zX19BbGxfOF9maXJzdF9ieXRlc19vZl80LWJ5dGVfc2VxdWVuY2VzX18weGYwLTB4ZjdfLF9fX19fX19fX19fX3wKKzAwNDZfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0N19fX18iP18/Xz9fP18/Xz9fP18/XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQ4XzMuMi40X19BbGxfNF9maXJzdF9ieXRlc19vZl81LWJ5dGVfc2VxdWVuY2VzX18weGY4LTB4ZmJfLF9fX19fX19fX19fX3wKKzAwNDlfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA1MF9fX18iP18/Xz9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDUxXzMuMi41X19BbGxfMl9maXJzdF9ieXRlc19vZl82LWJ5dGVfc2VxdWVuY2VzX18weGZjLTB4ZmRfLF9fX19fX19fX19fX3wKKzAwNTJfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA1M19fX18iP18/XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDU0XzMuM19fU2VxdWVuY2VzX3dpdGhfbGFzdF9jb250aW51YXRpb25fYnl0ZV9taXNzaW5nX19fX19fX19fX19fX19fX19fX3wKKzAwNTVfMy4zLjFfXzItYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA1Nl8zLjMuMl9fMy1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iPyJfX19fX198CiswMDU3XzMuMy4zX180LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyI/Il9fX19fX3wKKzAwNThfMy4zLjRfXzUtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA1OV8zLjMuNV9fNi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iPyJfX19fX198CiswMDYwXzMuMy42X18yLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wMDAwMDdGRl86XyI/Il9fX19fX3wKKzAwNjFfMy4zLjdfXzMtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMDBGRkZGXzpfIj8iX19fX19ffAorMDA2Ml8zLjMuOF9fNC1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDAxRkZGRkZfOl8iPyJfX19fX198CiswMDYzXzMuMy45X181LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wM0ZGRkZGRl86XyI/Il9fX19fX3wKKzAwNjRfMy4zLjEwXzYtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTdGRkZGRkZGXzpfIj8iX19fX19ffAorMDA2NV8zLjRfX0NvbmNhdGVuYXRpb25fb2ZfaW5jb21wbGV0ZV9zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDY2X19fXyI/Pz8/Pz8/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNjdfMy41X19JbXBvc3NpYmxlX2J5dGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA2OF8zLjUuMV9fZmVfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDY5XzMuNS4yX19mZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzBfMy41LjNfX2ZlX2ZlX2ZmX2ZmXz1fIj8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3MV80X19PdmVybG9uZ19zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDcyXzQuMV9fRXhhbXBsZXNfb2ZfYW5fb3ZlcmxvbmdfQVNDSUlfY2hhcmFjdGVyX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzNfNC4xLjFfVSswMDJGXz1fYzBfYWZfX19fX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3NF80LjEuMl9VKzAwMkZfPV9lMF84MF9hZl9fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc1XzQuMS4zX1UrMDAyRl89X2YwXzgwXzgwX2FmX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzZfNC4xLjRfVSswMDJGXz1fZjhfODBfODBfODBfYWZfX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3N180LjEuNV9VKzAwMkZfPV9mY184MF84MF84MF84MF9hZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc4XzQuMl9fTWF4aW11bV9vdmVybG9uZ19zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzlfNC4yLjFfX1UtMDAwMDAwN0ZfPV9jMV9iZl9fX19fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4MF80LjIuMl9fVS0wMDAwMDdGRl89X2UwXzlmX2JmX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDgxXzQuMi4zX19VLTAwMDBGRkZGXz1fZjBfOGZfYmZfYmZfX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODJfNC4yLjRfX1UtMDAxRkZGRkZfPV9mOF84N19iZl9iZl9iZl9fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4M180LjIuNV9fVS0wM0ZGRkZGRl89X2ZjXzgzX2JmX2JmX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDg0XzQuM19fT3ZlcmxvbmdfcmVwcmVzZW50YXRpb25fb2ZfdGhlX05VTF9jaGFyYWN0ZXJfX19fX19fX19fX19fX19fX19fX3wKKzAwODVfNC4zLjFfX1UrMDAwMF89X2MwXzgwX19fX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4Nl80LjMuMl9fVSswMDAwXz1fZTBfODBfODBfX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDg3XzQuMy4zX19VKzAwMDBfPV9mMF84MF84MF84MF9fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODhfNC4zLjRfX1UrMDAwMF89X2Y4XzgwXzgwXzgwXzgwX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4OV80LjMuNV9fVSswMDAwXz1fZmNfODBfODBfODBfODBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDkwXzVfX0lsbGVnYWxfY29kZV9wb3NpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTFfNS4xX1NpbmdsZV9VVEYtMTZfc3Vycm9nYXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5Ml81LjEuMV9fVStEODAwXz1fZWRfYTBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDkzXzUuMS4yX19VK0RCN0ZfPV9lZF9hZF9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTRfNS4xLjNfX1UrREI4MF89X2VkX2FlXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5NV81LjEuNF9fVStEQkZGXz1fZWRfYWZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk2XzUuMS41X19VK0RDMDBfPV9lZF9iMF84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTdfNS4xLjZfX1UrREY4MF89X2VkX2JlXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5OF81LjEuN19fVStERkZGXz1fZWRfYmZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk5XzUuMl9QYWlyZWRfVVRGLTE2X3N1cnJvZ2F0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDBfNS4yLjFfX1UrRDgwMF9VK0RDMDBfPV9lZF9hMF84MF9lZF9iMF84MF89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwMV81LjIuMl9fVStEODAwX1UrREZGRl89X2VkX2EwXzgwX2VkX2JmX2JmXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTAyXzUuMi4zX19VK0RCN0ZfVStEQzAwXz1fZWRfYWRfYmZfZWRfYjBfODBfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDNfNS4yLjRfX1UrREI3Rl9VK0RGRkZfPV9lZF9hZF9iZl9lZF9iZl9iZl89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwNF81LjIuNV9fVStEQjgwX1UrREMwMF89X2VkX2FlXzgwX2VkX2IwXzgwXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA1XzUuMi42X19VK0RCODBfVStERkZGXz1fZWRfYWVfODBfZWRfYmZfYmZfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDZfNS4yLjdfX1UrREJGRl9VK0RDMDBfPV9lZF9hZl9iZl9lZF9iMF84MF89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwN181LjIuOF9fVStEQkZGX1UrREZGRl89X2VkX2FmX2JmX2VkX2JmX2JmXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA4XzUuM19PdGhlcl9pbGxlZ2FsX2NvZGVfcG9zaXRpb25zX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDlfNS4zLjFfX1UrRkZGRV89X2VmX2JmX2JlXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDExMF81LjMuMl9fVStGRkZGXz1fZWZfYmZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisnICIiICIiCisKK3JtIC1yZiBscy50ZXN0ZGlyIDI+L2Rldi9udWxsCitta2RpciBscy50ZXN0ZGlyIHx8IGV4aXQgMQorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3QgeCIkQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTIiA9IHgieSIgXAorJiYgdGVzdGluZyAibHMgc3ltbGlua190b19kaXIiIFwKKyJ0b3VjaCBscy50ZXN0ZGlyL0EgbHMudGVzdGRpci9COyBsbiAtcyBscy50ZXN0ZGlyIGxzLmxpbms7IGxzIGxzLmxpbms7IGxzIC0xIGxzLmxpbmsvOyBscyAtMSBscy5saW5rOyBybSAtZiBscy5saW5rIiBcCisiQVxuQlxuQVxuQlxuQVxuQlxuIiBcCisiIiAiIgorCisjIENsZWFuIHVwCitybSAtcmYgbHMudGVzdGRpciAyPi9kZXYvbnVsbAorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9scy9scy0xLXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xzL2xzLTEtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhYjlhNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9scy9scy0xLXdvcmtzCkBAIC0wLDAgKzEsNiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVMKKworWyAtbiAiJGQiIF0gfHwgZD0uLgorTENfQUxMPUMgbHMgLTEgIiRkIiA+IGxvZ2ZpbGUuZ251CitMQ19BTEw9QyBidXN5Ym94IGxzIC0xICIkZCIgPiBsb2dmaWxlLmJiCitkaWZmIC11YncgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xzL2xzLWgtd29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbHMvbHMtaC13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDAxNmJhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xzL2xzLWgtd29ya3MKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUyBDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCitbIC1uICIkZCIgXSB8fCBkPS4uCitMQ19BTEw9QyBscyAtaCAiJGQiID4gbG9nZmlsZS5nbnUKK0xDX0FMTD1DIGJ1c3lib3ggbHMgLWggIiRkIiA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXVidyBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbHMvbHMtbC13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9scy9scy1sLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDg4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbHMvbHMtbC13b3JrcwpAQCAtMCwwICsxLDggQEAKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiAhPSB4IiIgJiYgZXhpdAorCisjIGJ1c3lib3ggZG9lcyBub3QgZW1pdCAidG90YWwgTk5OIiBsaW5lCisKK1sgLW4gIiRkIiBdIHx8IGQ9Li4KK0xDX0FMTD1DIGxzIC1sICIkZCIgPiBsb2dmaWxlLmdudQorTENfQUxMPUMgYnVzeWJveCBscyAtbCAiJGQiID4gbG9nZmlsZS5iYgorZGlmZiAtdWJ3IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9scy9scy1zLXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL2xzL2xzLXMtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmNWM2NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9scy9scy1zLXdvcmtzCkBAIC0wLDAgKzEsOCBAQAordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiICE9IHgiIiAmJiBleGl0CisKKyMgYnVzeWJveCBkb2VzIG5vdCBlbWl0ICJ0b3RhbCBOTk4iIGxpbmUKKworWyAtbiAiJGQiIF0gfHwgZD0uLgorTENfQUxMPUMgbHMgLTFzICIkZCIgPiBsb2dmaWxlLmdudQorTENfQUxMPUMgYnVzeWJveCBscyAtMXMgIiRkIiA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXVidyBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbWFrZWRldnMuZGV2aWNlX3RhYmxlLnR4dCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tYWtlZGV2cy5kZXZpY2VfdGFibGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWMyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbWFrZWRldnMuZGV2aWNlX3RhYmxlLnR4dApAQCAtMCwwICsxLDE3MiBAQAorIyBXaGVuIGJ1aWxkaW5nIGEgdGFyZ2V0IGZpbGVzeXN0ZW0sIGl0IGlzIGRlc2lyYWJsZSB0byBub3QgaGF2ZSB0bworIyBiZWNvbWUgcm9vdCBhbmQgdGhlbiBydW4gJ21rbm9kJyBhIHRob3VzYW5kIHRpbWVzLiAgVXNpbmcgYSBkZXZpY2UKKyMgdGFibGUgeW91IGNhbiBjcmVhdGUgZGV2aWNlIG5vZGVzIGFuZCBkaXJlY3RvcmllcyAib24gdGhlIGZseSIuCisjCisjIFRoaXMgaXMgYSBzYW1wbGUgZGV2aWNlIHRhYmxlIGZpbGUgZm9yIHVzZSB3aXRoIGdlbmV4dDJmcy4gIFlvdSBjYW4KKyMgZG8gYWxsIHNvcnRzIG9mIGludGVyZXN0aW5nIHRoaW5ncyB3aXRoIGEgZGV2aWNlIHRhYmxlIGZpbGUuICBGb3IKKyMgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYWRqdXN0IHRoZSBwZXJtaXNzaW9ucyBvbiBhIHBhcnRpY3VsYXIgZmlsZQorIyB5b3UgY2FuIGp1c3QgYWRkIGFuIGVudHJ5IGxpa2U6CisjICAgL3NiaW4vZm9vYmFyICAgICAgICBmICAgICAgIDI3NTUgICAgMCAgICAgICAwICAgICAgIC0gICAgICAgLSAgICAgICAtICAgICAgIC0gICAgICAgLQorIyBhbmQgKGFzc3VtaW5nIHRoZSBmaWxlIC9zYmluL2Zvb2JhciBleGlzdHMpIGl0IHdpbGwgYmUgbWFkZSBzZXR1aWQKKyMgcm9vdCAocmVnYXJkbGVzcyBvZiB3aGF0IGl0cyBwZXJtaXNzaW9ucyBhcmUgb24gdGhlIGhvc3QgZmlsZXN5c3RlbSkuCisjIEZ1cnRoZXJtb3JlLCB5b3UgY2FuIHVzZSBhIHNpbmdsZSB0YWJsZSBlbnRyeSB0byBjcmVhdGUgYSBtYW55IGRldmljZQorIyBtaW5vcnMuICBGb3IgZXhhbXBsZSwgaWYgSSB3YW50ZWQgdG8gY3JlYXRlIC9kZXYvaGRhIGFuZCAvZGV2L2hkYVswLTE1XQorIyBJIGNvdWxkIGp1c3QgdXNlIHRoZSBmb2xsb3dpbmcgdHdvIHRhYmxlIGVudHJpZXM6CisjICAgL2Rldi9oZGEgICAgYiAgICAgICA2NDAgICAgIDAgICAgICAgMCAgICAgICAzICAgICAgIDAgICAgICAgMCAgICAgICAwICAgICAgIC0KKyMgICAvZGV2L2hkYSAgICBiICAgICAgIDY0MCAgICAgMCAgICAgICAwICAgICAgIDMgICAgICAgMSAgICAgICAxICAgICAgIDEgICAgICAgMTUKKyMKKyMgRGV2aWNlIHRhYmxlIGVudHJpZXMgdGFrZSB0aGUgZm9ybSBvZjoKKyMgPG5hbWU+ICAgIDx0eXBlPiAgICAgIDxtb2RlPiAgPHVpZD4gICA8Z2lkPiAgIDxtYWpvcj4gPG1pbm9yPiA8c3RhcnQ+IDxpbmM+ICAgPGNvdW50PgorIyB3aGVyZSBuYW1lIGlzIHRoZSBmaWxlIG5hbWUsICB0eXBlIGNhbiBiZSBvbmUgb2Y6CisjICAgICAgIGYgICAgICAgQSByZWd1bGFyIGZpbGUKKyMgICAgICAgZCAgICAgICBEaXJlY3RvcnkKKyMgICAgICAgYyAgICAgICBDaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2UgZmlsZQorIyAgICAgICBiICAgICAgIEJsb2NrIHNwZWNpYWwgZGV2aWNlIGZpbGUKKyMgICAgICAgcCAgICAgICBGaWZvIChuYW1lZCBwaXBlKQorIyB1aWQgaXMgdGhlIHVzZXIgaWQgZm9yIHRoZSB0YXJnZXQgZmlsZSwgZ2lkIGlzIHRoZSBncm91cCBpZCBmb3IgdGhlCisjIHRhcmdldCBmaWxlLiAgVGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMgKG1ham9yLCBtaW5vciwgZXRjKSBhcHBseSBvbmx5CisjIHRvIGRldmljZSBzcGVjaWFsIGZpbGVzLgorCisjIEhhdmUgZnVuCisjIC1FcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisKKyM8bmFtZT4JCTx0eXBlPgk8bW9kZT4JPHVpZD4JPGdpZD4JPG1ham9yPgk8bWlub3I+CTxzdGFydD4JPGluYz4JPGNvdW50PgorL2RldgkJZAk3NTUJMAkwCS0JLQktCS0JLQorL2Rldi9wdHMJZAk3NTUJMAkwCS0JLQktCS0JLQorL2Rldi9zaG0JZAk3NTUJMAkwCS0JLQktCS0JLQorL3RtcAkJZAkxNzc3CTAJMAktCS0JLQktCS0KKy9ldGMJCWQJNzU1CTAJMAktCS0JLQktCS0KKy9ob21lL2RlZmF1bHQJZAkyNzU1CTEwMDAJMTAwMAktCS0JLQktCS0KKyM8bmFtZT4JCQkJCTx0eXBlPgk8bW9kZT4JPHVpZD4JPGdpZD4JPG1ham9yPgk8bWlub3I+CTxzdGFydD4JPGluYz4JPGNvdW50PgorIyMjL2Jpbi9idXN5Ym94CQkJCWYJNDc1NQkwCTAJLQktCS0JLQktCisjIyMvZXRjL3NoYWRvdwkJCQlmCTYwMAkwCTAJLQktCS0JLQktCisjIyMvZXRjL3Bhc3N3ZAkJCQlmCTY0NAkwCTAJLQktCS0JLQktCisvZXRjL25ldHdvcmsvaWYtdXAuZAkJCWQJNzU1CTAJMAktCS0JLQktCS0KKy9ldGMvbmV0d29yay9pZi1wcmUtdXAuZAkJZAk3NTUJMAkwCS0JLQktCS0JLQorL2V0Yy9uZXR3b3JrL2lmLWRvd24uZAkJCWQJNzU1CTAJMAktCS0JLQktCS0KKy9ldGMvbmV0d29yay9pZi1wb3N0LWRvd24uZAkJZAk3NTUJMAkwCS0JLQktCS0JLQorIyMjL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQJZgk3NTUJMAkwCS0JLQktCS0JLQorIyB1bmNvbW1lbnQgdGhpcyB0byBhbGxvdyBzdGFydGluZyB4IGFzIG5vbi1yb290CisjL3Vzci9YMTFSNi9iaW4vWGZiZGV2CQlmCTQ3NTUJMAkwCS0JLQktCS0JLQorCisjIE5vcm1hbCBzeXN0ZW0gZGV2aWNlcworIyA8bmFtZT4gICAgPHR5cGU+ICAgICAgPG1vZGU+ICA8dWlkPiAgIDxnaWQ+ICAgPG1ham9yPiA8bWlub3I+IDxzdGFydD4gPGluYz4gICA8Y291bnQ+CisvZGV2L21lbQljCTY0MAkwCTAJMQkxCTAJMAktCisvZGV2L2ttZW0JYwk2NDAJMAkwCTEJMgkwCTAJLQorL2Rldi9udWxsCWMJNjY2CTAJMAkxCTMJMAkwCS0KKy9kZXYvemVybwljCTY2NgkwCTAJMQk1CTAJMAktCisvZGV2L3JhbmRvbQljCTY2NgkwCTAJMQk4CTAJMAktCisvZGV2L3VyYW5kb20JYwk2NjYJMAkwCTEJOQkwCTAJLQorL2Rldi9yYW0JYgk2NDAJMAkwCTEJMQkwCTAJLQorL2Rldi9yYW0JYgk2NDAJMAkwCTEJMAkwCTEJNAorL2Rldi9sb29wCWIJNjQwCTAJMAk3CTAJMAkxCTIKKy9kZXYvcnRjCWMJNjQwCTAJMAkxMAkxMzUJLQktCS0KKy9kZXYvY29uc29sZQljCTY2NgkwCTAJNQkxCS0JLQktCisvZGV2L3R0eQljCTY2NgkwCTAJNQkwCS0JLQktCisvZGV2L3R0eQljCTY2NgkwCTAJNAkwCTAJMQk4CisvZGV2L3R0eXAJYwk2NjYJMAkwCTMJMAkwCTEJMTAKKy9kZXYvcHR5cAljICAgICAgIDY2NiAgICAgMCAgICAgICAwICAgICAgIDIgICAgICAgMCAgICAgICAwICAgICAgIDEgICAgICAgMTAKKy9kZXYvcHRteAljCTY2NgkwCTAJNQkyCS0JLQktCisvZGV2L3R0eVAJYwk2NjYJMAkwCTU3CTAJMAkxCTQKKy9kZXYvdHR5UwljCTY2NgkwCTAJNAk2NAkwCTEJNAorL2Rldi9mYgkJYwk2NDAJMAk1CTI5CTAJMAkzMgk0CisjL2Rldi90dHlTQQljCTY2NgkwCTAJMjA0CTUJMAkxCTMKKy9kZXYvcHNhdXgJYwk2NjYJMAkwCTEwCTEJMAkwCS0KKyMvZGV2L3BwcAljCTY2NgkwCTAJMTA4CTAJLQktCS0KKworIyBJbnB1dCBzdHVmZgorL2Rldi9pbnB1dAlkCTc1NQkwCTAJLQktCS0JLQktCisvZGV2L2lucHV0L21pY2UJYwk2NDAJMAkwCTEzCTYzCTAJMAktCisvZGV2L2lucHV0L21vdXNlIGMJNjYwCTAJMAkxMwkzMgkwCTEJNAorL2Rldi9pbnB1dC9ldmVudCBjCTY2MAkwCTAJMTMJNjQJMAkxCTQKKyMvZGV2L2lucHV0L2pzCWMJNjYwCTAJMAkxMwkwCTAJMQk0CisKKworIyBNVEQgc3R1ZmYKKy9kZXYvbXRkCWMJNjQwCTAJMAk5MAkwCTAJMgk0CisvZGV2L210ZGJsb2NrCWIJNjQwCTAJMAkzMQkwCTAJMQk0CisKKyNUdW4vdGFwIGRyaXZlcgorL2Rldi9uZXQJZAk3NTUJMAkwCS0JLQktCS0JLQorL2Rldi9uZXQvdHVuCWMJNjYwCTAJMAkxMAkyMDAJLQktCS0KKworIyBBdWRpbyBzdHVmZgorIy9kZXYvYXVkaW8JYwk2NjYJMAkyOQkxNAk0CS0JLQktCisjL2Rldi9hdWRpbzEJYwk2NjYJMAkyOQkxNAkyMAktCS0JLQorIy9kZXYvZHNwCWMJNjY2CTAJMjkJMTQJMwktCS0JLQorIy9kZXYvZHNwMQljCTY2NgkwCTI5CTE0CTE5CS0JLQktCisjL2Rldi9zbmRzdGF0CWMJNjY2CTAJMjkJMTQJNgktCS0JLQorCisjIFVzZXItbW9kZSBMaW51eCBzdHVmZgorIy9kZXYvdWJkYQliCTY0MAkwCTAJOTgJMAkwCTAJLQorIy9kZXYvdWJkYQliCTY0MAkwCTAJOTgJMQkxCTEJMTUKKworIyBJREUgRGV2aWNlcworL2Rldi9oZGEJYgk2NDAJMAkwCTMJMAkwCTAJLQorL2Rldi9oZGEJYgk2NDAJMAkwCTMJMQkxCTEJMTUKKy9kZXYvaGRiCWIJNjQwCTAJMAkzCTY0CTAJMAktCisvZGV2L2hkYgliCTY0MAkwCTAJMwk2NQkxCTEJMTUKKyMvZGV2L2hkYwliCTY0MAkwCTAJMjIJMAkwCTAJLQorIy9kZXYvaGRjCWIJNjQwCTAJMAkyMgkxCTEJMQkxNQorIy9kZXYvaGRkCWIJNjQwCTAJMAkyMgk2NAkwCTAJLQorIy9kZXYvaGRkCWIJNjQwCTAJMAkyMgk2NQkxCTEJMTUKKyMvZGV2L2hkZQliCTY0MAkwCTAJMzMJMAkwCTAJLQorIy9kZXYvaGRlCWIJNjQwCTAJMAkzMwkxCTEJMQkxNQorIy9kZXYvaGRmCWIJNjQwCTAJMAkzMwk2NAkwCTAJLQorIy9kZXYvaGRmCWIJNjQwCTAJMAkzMwk2NQkxCTEJMTUKKyMvZGV2L2hkZwliCTY0MAkwCTAJMzQJMAkwCTAJLQorIy9kZXYvaGRnCWIJNjQwCTAJMAkzNAkxCTEJMQkxNQorIy9kZXYvaGRoCWIJNjQwCTAJMAkzNAk2NAkwCTAJLQorIy9kZXYvaGRoCWIJNjQwCTAJMAkzNAk2NQkxCTEJMTUKKworIyBTQ1NJIERldmljZXMKKyMvZGV2L3NkYQliCTY0MAkwCTAJOAkwCTAJMAktCisjL2Rldi9zZGEJYgk2NDAJMAkwCTgJMQkxCTEJMTUKKyMvZGV2L3NkYgliCTY0MAkwCTAJOAkxNgkwCTAJLQorIy9kZXYvc2RiCWIJNjQwCTAJMAk4CTE3CTEJMQkxNQorIy9kZXYvc2RjCWIJNjQwCTAJMAk4CTMyCTAJMAktCisjL2Rldi9zZGMJYgk2NDAJMAkwCTgJMzMJMQkxCTE1CisjL2Rldi9zZGQJYgk2NDAJMAkwCTgJNDgJMAkwCS0KKyMvZGV2L3NkZAliCTY0MAkwCTAJOAk0OQkxCTEJMTUKKyMvZGV2L3NkZQliCTY0MAkwCTAJOAk2NAkwCTAJLQorIy9kZXYvc2RlCWIJNjQwCTAJMAk4CTY1CTEJMQkxNQorIy9kZXYvc2RmCWIJNjQwCTAJMAk4CTgwCTAJMAktCisjL2Rldi9zZGYJYgk2NDAJMAkwCTgJODEJMQkxCTE1CisjL2Rldi9zZGcJYgk2NDAJMAkwCTgJOTYJMAkwCS0KKyMvZGV2L3NkZwliCTY0MAkwCTAJOAk5NwkxCTEJMTUKKyMvZGV2L3NkaAliCTY0MAkwCTAJOAkxMTIJMAkwCS0KKyMvZGV2L3NkaAliCTY0MAkwCTAJOAkxMTMJMQkxCTE1CisjL2Rldi9zZwljCTY0MAkwCTAJMjEJMAkwCTEJMTUKKyMvZGV2L3NjZAliCTY0MAkwCTAJMTEJMAkwCTEJMTUKKyMvZGV2L3N0CWMJNjQwCTAJMAk5CTAJMAkxCTgKKyMvZGV2L25zdAljCTY0MAkwCTAJOQkxMjgJMAkxCTgKKyMvZGV2L3N0CWMJNjQwCTAJMAk5CTMyCTEJMQk0CisjL2Rldi9zdAljCTY0MAkwCTAJOQk2NAkxCTEJNAorIy9kZXYvc3QJYwk2NDAJMAkwCTkJOTYJMQkxCTQKKworIyBGbG9wcHkgZGlzayBkZXZpY2VzCisjL2Rldi9mZAliCTY0MAkwCTAJMgkwCTAJMQkyCisjL2Rldi9mZDBkMzYwCWIJNjQwCTAJMAkyCTQJMAkwCS0KKyMvZGV2L2ZkMWQzNjAJYgk2NDAJMAkwCTIJNQkwCTAJLQorIy9kZXYvZmQwaDEyMDAJYgk2NDAJMAkwCTIJOAkwCTAJLQorIy9kZXYvZmQxaDEyMDAJYgk2NDAJMAkwCTIJOQkwCTAJLQorIy9kZXYvZmQwdTE0NDAJYgk2NDAJMAkwCTIJMjgJMAkwCS0KKyMvZGV2L2ZkMXUxNDQwCWIJNjQwCTAJMAkyCTI5CTAJMAktCisjL2Rldi9mZDB1Mjg4MAliCTY0MAkwCTAJMgkzMgkwCTAJLQorIy9kZXYvZmQxdTI4ODAJYgk2NDAJMAkwCTIJMzMJMAkwCS0KKworIyBBbGwgdGhlIHByb3ByaWV0YXJ5IGNkcm9tIGRldmljZXMgaW4gdGhlIHdvcmxkCisjL2Rldi9henRjZAliCTY0MAkwCTAJMjkJMAkwCTAJLQorIy9kZXYvYnBjZAliCTY0MAkwCTAJNDEJMAkwCTAJLQorIy9kZXYvY2FwaTIwCWMJNjQwCTAJMAk2OAkwCTAJMQkyCisjL2Rldi9jZHUzMWEJYgk2NDAJMAkwCTE1CTAJMAkwCS0KKyMvZGV2L2NkdTUzNQliCTY0MAkwCTAJMjQJMAkwCTAJLQorIy9kZXYvY20yMDZjZAliCTY0MAkwCTAJMzIJMAkwCTAJLQorIy9kZXYvc2pjZAliCTY0MAkwCTAJMTgJMAkwCTAJLQorIy9kZXYvc29ueWNkCWIJNjQwCTAJMAkxNQkwCTAJMAktCisjL2Rldi9nc2NkCWIJNjQwCTAJMAkxNgkwCTAJMAktCisjL2Rldi9zYnBjZAliCTY0MAkwCTAJMjUJMAkwCTAJLQorIy9kZXYvc2JwY2QJYgk2NDAJMAkwCTI1CTAJMAkxCTQKKyMvZGV2L21jZAliCTY0MAkwCTAJMjMJMAkwCTAJLQorIy9kZXYvb3B0Y2QJYgk2NDAJMAkwCTE3CTAJMAkwCS0KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tYWtlZGV2cy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tYWtlZGV2cy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZDEyNDYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21ha2VkZXZzLnRlc3RzCkBAIC0wLDAgKzEsMTUwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKwordGVzdCB4ImBpZCAtdWAiID0geCIwIiB8fCB7CisJZWNobyAiU0tJUFBFRDogbWFrZWRldnMgKG11c3QgYmUgcm9vdCB0byB0ZXN0IHRoaXMpIgorCWV4aXQgMAorfQorCit1bnNldCBMQU5HCit1bnNldCBMQ19DT0xMQVRFCit1bnNldCBMQ19BTEwKKworIyBscyAtbG4gaXMgc2hvd2luZyBkYXRlLiBOZWVkIHRvIHJlbW92ZSB0aGF0LCBpdCdzIHZhcmlhYmxlCisjIHNlZDogKDEpICJtYWosIG1pbiIgLT4gIm1haixtaW4iICgyKSBjb2FsZXNjZSBzcGFjZXMKKyMgY3V0OiByZW1vdmUgZGF0ZQorRklMVEVSX0xTPSJzZWQgLWUgJ3MvLCAgKi8sL2cnIC1lICdzLyAgKi8gL2cnIHwgY3V0IC1kJyAnIC1mIDEtNSw5LSIKKyMgY3V0OiByZW1vdmUgc2l6ZStkYXRlCitGSUxURVJfTFMyPSJzZWQgLWUgJ3MvLCAgKi8sL2cnIC1lICdzLyAgKi8gL2cnIHwgY3V0IC1kJyAnIC1mIDEtNCw5LSIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCitybSAtcmYgbWFrZWRldnMudGVzdGRpcgorbWtkaXIgbWFrZWRldnMudGVzdGRpcgorCitvcHRpb25hbCBGRUFUVVJFX01BS0VERVZTX1RBQkxFIEZFQVRVUkVfRklORF9OT1QgRkVBVFVSRV9GSU5EX1RZUEUgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgIm1ha2VkZXZzIC1kIC4uL21ha2VkZXZzLmRldmljZV90YWJsZS50eHQgLiIgXAorCSIoY2QgbWFrZWRldnMudGVzdGRpciAmJiBtYWtlZGV2cyAtZCAuLi9tYWtlZGV2cy5kZXZpY2VfdGFibGUudHh0IC4gMj4mMSk7CisJZmluZCBtYWtlZGV2cy50ZXN0ZGlyICEgLXR5cGUgZCB8IHNvcnQgfCB4YXJncyBscyAtbG5SIHwgJEZJTFRFUl9MUyIgXAorIlwKK3Jvb3RkaXI9LgordGFibGU9Jy4uL21ha2VkZXZzLmRldmljZV90YWJsZS50eHQnCitjcnctcnctcnctIDEgMCAwIDUsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9jb25zb2xlCitjcnctci0tLS0tIDEgMCA1IDI5LDAgbWFrZWRldnMudGVzdGRpci9kZXYvZmIwCitjcnctci0tLS0tIDEgMCA1IDI5LDMyIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2ZiMQorY3J3LXItLS0tLSAxIDAgNSAyOSw2NCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9mYjIKK2Nydy1yLS0tLS0gMSAwIDUgMjksOTYgbWFrZWRldnMudGVzdGRpci9kZXYvZmIzCiticnctci0tLS0tIDEgMCAwIDMsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGEKK2Jydy1yLS0tLS0gMSAwIDAgMywxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTEKK2Jydy1yLS0tLS0gMSAwIDAgMywxMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGExMAorYnJ3LXItLS0tLSAxIDAgMCAzLDExIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTExCiticnctci0tLS0tIDEgMCAwIDMsMTIgbWFrZWRldnMudGVzdGRpci9kZXYvaGRhMTIKK2Jydy1yLS0tLS0gMSAwIDAgMywxMyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGExMworYnJ3LXItLS0tLSAxIDAgMCAzLDE0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTE0Citicnctci0tLS0tIDEgMCAwIDMsMTUgbWFrZWRldnMudGVzdGRpci9kZXYvaGRhMTUKK2Jydy1yLS0tLS0gMSAwIDAgMywyIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTIKK2Jydy1yLS0tLS0gMSAwIDAgMywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTMKK2Jydy1yLS0tLS0gMSAwIDAgMyw0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTQKK2Jydy1yLS0tLS0gMSAwIDAgMyw1IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTUKK2Jydy1yLS0tLS0gMSAwIDAgMyw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTYKK2Jydy1yLS0tLS0gMSAwIDAgMyw3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTcKK2Jydy1yLS0tLS0gMSAwIDAgMyw4IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTgKK2Jydy1yLS0tLS0gMSAwIDAgMyw5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTkKK2Jydy1yLS0tLS0gMSAwIDAgMyw2NCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIKK2Jydy1yLS0tLS0gMSAwIDAgMyw2NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxCiticnctci0tLS0tIDEgMCAwIDMsNzQgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMTAKK2Jydy1yLS0tLS0gMSAwIDAgMyw3NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxMQorYnJ3LXItLS0tLSAxIDAgMCAzLDc2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjEyCiticnctci0tLS0tIDEgMCAwIDMsNzcgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMTMKK2Jydy1yLS0tLS0gMSAwIDAgMyw3OCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxNAorYnJ3LXItLS0tLSAxIDAgMCAzLDc5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjE1Citicnctci0tLS0tIDEgMCAwIDMsNjYgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMgorYnJ3LXItLS0tLSAxIDAgMCAzLDY3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjMKK2Jydy1yLS0tLS0gMSAwIDAgMyw2OCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGI0Citicnctci0tLS0tIDEgMCAwIDMsNjkgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiNQorYnJ3LXItLS0tLSAxIDAgMCAzLDcwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjYKK2Jydy1yLS0tLS0gMSAwIDAgMyw3MSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGI3Citicnctci0tLS0tIDEgMCAwIDMsNzIgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiOAorYnJ3LXItLS0tLSAxIDAgMCAzLDczIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjkKK2Nydy1ydy0tLS0gMSAwIDAgMTMsNjQgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvZXZlbnQwCitjcnctcnctLS0tIDEgMCAwIDEzLDY1IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L2V2ZW50MQorY3J3LXJ3LS0tLSAxIDAgMCAxMyw2NiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9pbnB1dC9ldmVudDIKK2Nydy1ydy0tLS0gMSAwIDAgMTMsNjcgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvZXZlbnQzCitjcnctci0tLS0tIDEgMCAwIDEzLDYzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L21pY2UKK2Nydy1ydy0tLS0gMSAwIDAgMTMsMzIgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvbW91c2UwCitjcnctcnctLS0tIDEgMCAwIDEzLDMzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L21vdXNlMQorY3J3LXJ3LS0tLSAxIDAgMCAxMywzNCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9pbnB1dC9tb3VzZTIKK2Nydy1ydy0tLS0gMSAwIDAgMTMsMzUgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvbW91c2UzCitjcnctci0tLS0tIDEgMCAwIDEsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9rbWVtCiticnctci0tLS0tIDEgMCAwIDcsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9sb29wMAorYnJ3LXItLS0tLSAxIDAgMCA3LDEgbWFrZWRldnMudGVzdGRpci9kZXYvbG9vcDEKK2Nydy1yLS0tLS0gMSAwIDAgMSwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L21lbQorY3J3LXItLS0tLSAxIDAgMCA5MCwwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L210ZDAKK2Nydy1yLS0tLS0gMSAwIDAgOTAsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGQxCitjcnctci0tLS0tIDEgMCAwIDkwLDQgbWFrZWRldnMudGVzdGRpci9kZXYvbXRkMgorY3J3LXItLS0tLSAxIDAgMCA5MCw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L210ZDMKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazAKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazEKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazIKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazMKK2Nydy1ydy0tLS0gMSAwIDAgMTAsMjAwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L25ldC90dW4KK2Nydy1ydy1ydy0gMSAwIDAgMSwzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L251bGwKK2Nydy1ydy1ydy0gMSAwIDAgMTAsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wc2F1eAorY3J3LXJ3LXJ3LSAxIDAgMCA1LDIgbWFrZWRldnMudGVzdGRpci9kZXYvcHRteAorY3J3LXJ3LXJ3LSAxIDAgMCAyLDAgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDAKK2Nydy1ydy1ydy0gMSAwIDAgMiwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXAxCitjcnctcnctcnctIDEgMCAwIDIsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwMgorY3J3LXJ3LXJ3LSAxIDAgMCAyLDMgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDMKK2Nydy1ydy1ydy0gMSAwIDAgMiw0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXA0CitjcnctcnctcnctIDEgMCAwIDIsNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwNQorY3J3LXJ3LXJ3LSAxIDAgMCAyLDYgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDYKK2Nydy1ydy1ydy0gMSAwIDAgMiw3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXA3CitjcnctcnctcnctIDEgMCAwIDIsOCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwOAorY3J3LXJ3LXJ3LSAxIDAgMCAyLDkgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDkKK2Jydy1yLS0tLS0gMSAwIDAgMSwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3JhbQorYnJ3LXItLS0tLSAxIDAgMCAxLDAgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMAorYnJ3LXItLS0tLSAxIDAgMCAxLDEgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMQorYnJ3LXItLS0tLSAxIDAgMCAxLDIgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMgorYnJ3LXItLS0tLSAxIDAgMCAxLDMgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMworY3J3LXJ3LXJ3LSAxIDAgMCAxLDggbWFrZWRldnMudGVzdGRpci9kZXYvcmFuZG9tCitjcnctci0tLS0tIDEgMCAwIDEwLDEzNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9ydGMKK2Nydy1ydy1ydy0gMSAwIDAgNSwwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDAgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MAorY3J3LXJ3LXJ3LSAxIDAgMCA0LDEgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDIgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MgorY3J3LXJ3LXJ3LSAxIDAgMCA0LDMgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MworY3J3LXJ3LXJ3LSAxIDAgMCA0LDQgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NAorY3J3LXJ3LXJ3LSAxIDAgMCA0LDUgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDYgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NgorY3J3LXJ3LXJ3LSAxIDAgMCA0LDcgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NworY3J3LXJ3LXJ3LSAxIDAgMCA1NywwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVAwCitjcnctcnctcnctIDEgMCAwIDU3LDEgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UDEKK2Nydy1ydy1ydy0gMSAwIDAgNTcsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlQMgorY3J3LXJ3LXJ3LSAxIDAgMCA1NywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVAzCitjcnctcnctcnctIDEgMCAwIDQsNjQgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UzAKK2Nydy1ydy1ydy0gMSAwIDAgNCw2NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlTMQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDY2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVMyCitjcnctcnctcnctIDEgMCAwIDQsNjcgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UzMKK2Nydy1ydy1ydy0gMSAwIDAgMywwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXAwCitjcnctcnctcnctIDEgMCAwIDMsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwMQorY3J3LXJ3LXJ3LSAxIDAgMCAzLDIgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDIKK2Nydy1ydy1ydy0gMSAwIDAgMywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXAzCitjcnctcnctcnctIDEgMCAwIDMsNCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwNAorY3J3LXJ3LXJ3LSAxIDAgMCAzLDUgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDUKK2Nydy1ydy1ydy0gMSAwIDAgMyw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXA2CitjcnctcnctcnctIDEgMCAwIDMsNyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwNworY3J3LXJ3LXJ3LSAxIDAgMCAzLDggbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDgKK2Nydy1ydy1ydy0gMSAwIDAgMyw5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXA5CitjcnctcnctcnctIDEgMCAwIDEsOSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi91cmFuZG9tCitjcnctcnctcnctIDEgMCAwIDEsNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi96ZXJvCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjbGVhbiB1cAorcm0gLXJmIG1ha2VkZXZzLnRlc3RkaXIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbWQ1c3VtLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21kNXN1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDY4YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21kNXN1bS50ZXN0cwpAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKyMgVXNlZCBieSB7bXM1LHNoYU59c3VtCisKKyMgV2UgcGlwZSB0ZXh0cyAwLi4uOTk5IGJ5dGVzIGxvbmcsIHttZDUsc2hhTn1zdW0gdGhlbSwKKyMgdGhlbiB7bWQ1LHNoYU59c3VtIHRoZSByZXN1bHRpbmcgbGlzdC4KKyMgVGhlbiB3ZSBjb21wYXJlIHRoZSByZXN1bHQgd2l0aCBleHBlY3RlZCByZXN1bHQuCisjCisjIEhlcmUgYXJlIHRoZSBleHBlY3RlZCByZXN1bHRzOgorIyBlZmUzMGM0ODJlMGI2ODdlMGNjYTA2MTJmNDJjYTI5YgorIyBkNDEzMzdlODM0Mzc3MTQwYWU3Zjk4NDYwZDcxZDkwODU5OGVmMDRmCisjIDhlMWQzZWQ1N2ViYzEzMGYwZjcyNTA4NDQ2NTU5ZWVhZTA2NDUxYWU2ZDYxYjFlOGNlNDYzNzBjZmI4OTYzYzMKKyMgZmU0MTNlMGYxNzczMjRkMTM1Mzg5M2NhMDc3MmNlYmE4M2ZkNDE1MTJiYTYzODk1YTBlZWJiNzAzZWY5ZmVhYzJmYjRlOTJiMmNiNDMwYjNiZGE0MWI0NmIwY2I0ZWE4MzA3MTkwYTVjYzc5NTE1N2NmYjY4MGE5Y2Q2MzVkMGYKKworaWYgISB0ZXN0ICIkMSI7IHRoZW4KKwlzZXQgLS0gbWQ1c3VtIGVmZTMwYzQ4MmUwYjY4N2UwY2NhMDYxMmY0MmNhMjliCitmaQorCitzdW09IiQxIgorZXhwZWN0ZWQ9IiQyIgorCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKwordGVzdCB4IiRDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEIiAhPSB4InkiIFwKKyYmIHsgZWNobyAiU0tJUFBFRDogJHN1bSI7IGV4aXQgMDsgfQorCit0ZXh0PSJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nIgordGV4dD1geWVzICIkdGV4dCIgfCBoZWFkIC1jIDk5OTlgCisKK3Jlc3VsdD1gKAorbj0wCit3aGlsZSB0ZXN0ICRuIC1sZSA5OTk7IGRvCisJZWNobyAiJHRleHQiIHwgaGVhZCAtYyAkbiB8ICIkc3VtIgorCTogJCgobisrKSkKK2RvbmUgfCAiJHN1bSIKKylgCisKK2lmIHRlc3QgeCIkcmVzdWx0IiA9IHgiJGV4cGVjdGVkICAtIjsgdGhlbgorICAgIGVjaG8gIlBBU1M6ICRzdW0iCisgICAgZXhpdCAwCitmaQorCitlY2hvICJGQUlMOiAkc3VtIChyOiRyZXN1bHQgZXhwOiRleHBlY3RlZCkiCitleGl0IDEKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tZDVzdW0vbWQ1c3VtLXZlcmlmaWVzLW5vbi1iaW5hcnktZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tZDVzdW0vbWQ1c3VtLXZlcmlmaWVzLW5vbi1iaW5hcnktZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGY4MThlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21kNXN1bS9tZDVzdW0tdmVyaWZpZXMtbm9uLWJpbmFyeS1maWxlCkBAIC0wLDAgKzEsNSBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0sKKwordG91Y2ggZm9vCittZDVzdW0gZm9vID4gYmFyCitidXN5Ym94IG1kNXN1bSAtYyBiYXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tZGV2LnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21kZXYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzMyMGUxNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tZGV2LnRlc3RzCkBAIC0wLDAgKzEsMjI2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyBscyAtbG4gaXMgc2hvd2luZyBkYXRlLiBOZWVkIHRvIHJlbW92ZSB0aGF0LCBpdCdzIHZhcmlhYmxlCisjIHNlZDogKDEpICJtYWosIG1pbiIgLT4gIm1haixtaW4iICgyKSBjb2FsZXNjZSBzcGFjZXMKKyMgY3V0OiByZW1vdmUgZGF0ZQorRklMVEVSX0xTPSJncmVwIC12ICdedG90YWwgJyB8IHNlZCAtZSAncy8sICAqLywvZycgLWUgJ3MvICAqLyAvZycgfCBjdXQgLWQnICcgLWYgMS01LDktIgorIyBjdXQ6IHJlbW92ZSBzaXplK2RhdGUKK0ZJTFRFUl9MUzI9ImdyZXAgLXYgJ150b3RhbCAnIHwgc2VkIC1lICdzLywgICovLC9nJyAtZSAncy8gICovIC9nJyB8IGN1dCAtZCcgJyAtZiAxLTQsOS0iCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworcm0gLXJmIG1kZXYudGVzdGRpcgorbWtkaXIgbWRldi50ZXN0ZGlyCisjIFdlIG5lZWQgbWRldiBleGVjdXRhYmxlIHRvIGJlIGluIGNocm9vdCBqYWlsIQorIyAod2lsbCBzdGlsbCBmYWlsIHdpdGggZHluYW1pY2FsbHkgbGlua2VkIG9uZSwgdGhvdWdoLi4uKQorY3AgLi4vYnVzeWJveCBtZGV2LnRlc3RkaXIvbWRldgorbWtkaXIgbWRldi50ZXN0ZGlyL2JpbgorY3AgLi4vYnVzeWJveCBtZGV2LnRlc3RkaXIvYmluL3NoIDI+L2Rldi9udWxsICMgZm9yIHRlc3RpbmcgY21kIGZlYXR1cmUKK21rZGlyIG1kZXYudGVzdGRpci9ldGMKK21rZGlyIG1kZXYudGVzdGRpci9kZXYKK21rZGlyIC1wIG1kZXYudGVzdGRpci9zeXMvYmxvY2svc2RhCitlY2hvICI4OjAiID5tZGV2LnRlc3RkaXIvc3lzL2Jsb2NrL3NkYS9kZXYKKworIyBlbnYgLSBQQVRIPSRQQVRIOiBvbiBzb21lIHN5c3RlbXMgY2hyb290IGJpbmFyeSB3b24ndCBvdGhlcndpc2UgYmUgZm91bmQKKworb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FCit0ZXN0aW5nICJtZGV2IGFkZCAvYmxvY2svc2RhIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sbiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUyIgXAorIlwKK2Jydy1ydy0tLS0gMSAwIDAgOCwwIHNkYQorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY29udGludWluZyB0byB1c2UgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdAorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FCit0ZXN0aW5nICJtZGV2IGRlbGV0ZXMgL2Jsb2NrL3NkYSIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1yZW1vdmUgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG4gbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICIuKiAxOjEgNjY2IiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gInNkYSAyOjIgNDQ0IiA+Pm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgc3RvcHMgb24gZmlyc3QgcnVsZSIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG4gbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCiticnctcnctcnctIDEgMSAxIDgsMCBzZGEKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gIi0uKiAxOjEgNjY2IiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gInNkYSAyOjIgNDQ0IiA+Pm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgZG9lcyBub3Qgc3RvcCBvbiBkYXNoLXJ1bGUiIFwKKwkiZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2Jsb2NrL3NkYSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorYnItLXItLXItLSAxIDIgMiA4LDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJcJE1PREFMSUFTPXF3ICAxOjEgNjY2IiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gIlwkTU9EQUxJQVM9cXcuIDI6MiA0NDQiID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gIlwkTU9EQUxJQVM9cXcuIDM6MyA0MDAiID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRQordGVzdGluZyAibWRldiBcJEVOVlZBUj1yZWdleCBtYXRjaCIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIE1PREFMSUFTPXF3ZSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorYnItLXItLXItLSAxIDIgMiA4LDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDQ0NCA+ZGlzay9zY3NpQSIgPm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9NREVWX1JFTkFNRSBGRUFUVVJFX0xTX1JFQ1VSU0lWRSBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRQordGVzdGluZyAibWRldiBtb3ZlL3N5bWxpbmsgcnVsZSAnPmJhci9iYXonIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMyIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Ryd3hyLXhyLXggMiAwIDAgZGlzaworbHJ3eHJ3eHJ3eCAxIDAgMCBzZGEgLT4gZGlzay9zY3NpQQorCittZGV2LnRlc3RkaXIvZGV2L2Rpc2s6Citici0tci0tci0tIDEgMCAwIHNjc2lBCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDQ0NCA+ZGlzay8iID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTURFVl9SRU5BTUUgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgbW92ZS9zeW1saW5rIHJ1bGUgJz5iYXIvJyIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG5SIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTMiIgXAorIlwKK21kZXYudGVzdGRpci9kZXY6Citkcnd4ci14ci14IDIgMCAwIGRpc2sKK2xyd3hyd3hyd3ggMSAwIDAgc2RhIC0+IGRpc2svc2RhCisKK21kZXYudGVzdGRpci9kZXYvZGlzazoKK2JyLS1yLS1yLS0gMSAwIDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCisjIGhlcmUgd2UgY29tcGxpY2F0ZSB0aGluZ3MgYnkgaGF2aW5nIG5vbi1tYXRjaGluZyBncm91cCAxIGFuZCB1c2luZyAlMAorZWNobyAicyhbMC05XSkqZChbYS16XSspIDA6MCA2NDQgPnNkLyUyXyUwIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfUkVOQU1FIEZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIEZFQVRVUkVfTFNfUkVDVVJTSVZFIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FIEZFQVRVUkVfTFNfU09SVEZJTEVTCit0ZXN0aW5nICJtZGV2IHJlZ2V4cCBzdWJzdHJpbmcgbWF0Y2ggKyByZXBsYWNlIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMyIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Ryd3hyLXhyLXggMiAwIDAgc2QKK2xyd3hyd3hyd3ggMSAwIDAgc2RhIC0+IHNkL2Ffc2RhCisKK21kZXYudGVzdGRpci9kZXYvc2Q6Citicnctci0tci0tIDEgMCAwIGFfc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDY0NCBAZWNobyBAZWNobyBURVNUIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfRVhFQyBGRUFUVVJFX0xTX1JFQ1VSU0lWRSBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRSBGRUFUVVJFX1NIX0lTX0FTSAordGVzdGluZyAibWRldiBjb21tYW5kIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCitAZWNobyBURVNUCittZGV2LnRlc3RkaXIvZGV2OgorYnJ3LXItLXItLSAxIDAgMCA4LDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDY0NCA9YmxvY2svIEBlY2hvIEBlY2hvIFRFU1Q6XCRNREVWIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfUkVOQU1FIEZFQVRVUkVfTURFVl9FWEVDIEZFQVRVUkVfTFNfUkVDVVJTSVZFIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FIEZFQVRVUkVfU0hfSVNfQVNICit0ZXN0aW5nICJtZGV2IG1vdmUgYW5kIGNvbW1hbmQiIFwKKwkiZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2Jsb2NrL3NkYSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuUiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUzIiIFwKKyJcCitAZWNobyBURVNUOmJsb2NrL3NkYQorbWRldi50ZXN0ZGlyL2RldjoKK2Ryd3hyLXhyLXggMiAwIDAgYmxvY2sKKworbWRldi50ZXN0ZGlyL2Rldi9ibG9jazoKK2Jydy1yLS1yLS0gMSAwIDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJAOCwwIDA6MSA2NDQiID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTURFVl9SRU5BTUUgRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgI21haixtaW4gYW5kIG5vIGV4cGxpY2l0IHVpZCIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG5SIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Jydy1yLS1yLS0gMSAwIDEgOCwwIHNkYQorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY29udGludWluZyB0byB1c2UgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdAorcm0gLXJmIG1kZXYudGVzdGRpci9kZXYvKgorbWtkaXIgLXAgbWRldi50ZXN0ZGlyL3N5cy9jbGFzcy90dHkvY2FwaQorZWNobyAiMTkxOjAiID5tZGV2LnRlc3RkaXIvc3lzL2NsYXNzL3R0eS9jYXBpL2RldgorbWtkaXIgLXAgbWRldi50ZXN0ZGlyL3N5cy9jbGFzcy90dHkvY2FwaTEKK2VjaG8gIjE5MToxIiA+bWRldi50ZXN0ZGlyL3N5cy9jbGFzcy90dHkvY2FwaTEvZGV2Citta2RpciAtcCBtZGV2LnRlc3RkaXIvc3lzL2NsYXNzL3R0eS9jYXBpMjAKK2VjaG8gIjE5MToyMCIgPm1kZXYudGVzdGRpci9zeXMvY2xhc3MvdHR5L2NhcGkyMC9kZXYKK2VjaG8gImNhcGkgICAgICAgICAgICAwOjAgMDY2MCA9Y2FwaTIwIiAgICAgID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorZWNobyAiY2FwaShbMC05XSkgICAgIDA6MCAwNjYwID1jYXBpMjAuMCUxIiA+Pm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitlY2hvICJjYXBpKFswLTldKikgICAgMDowIDA2NjAgPWNhcGkyMC4lMSIgID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKKyMgbWRldiBpbnZvY2F0aW9uIHdpdGggREVWUEFUSD0vY2xhc3MvdHR5L2NhcGkyMCB3YXMgZGVsZXRpbmcgL2Rldi9jYXBpMjAKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfUkVOQU1FIEZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIEZFQVRVUkVfTFNfUkVDVVJTSVZFIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FIEZFQVRVUkVfTFNfU09SVEZJTEVTCit0ZXN0aW5nICJtb3ZlIHJ1bGUgZG9lcyBub3QgZGVsZXRlIG5vZGUgd2l0aCBuYW1lID09IGRldmljZV9uYW1lIiBcCisJIlwKKwllbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vY2xhc3MvdHR5L2NhcGkgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9jbGFzcy90dHkvY2FwaTEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9jbGFzcy90dHkvY2FwaTIwIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG5SIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Nydy1ydy0tLS0gMSAwIDAgMTkxLDAgY2FwaTIwCitjcnctcnctLS0tIDEgMCAwIDE5MSwxIGNhcGkyMC4wMQorY3J3LXJ3LS0tLSAxIDAgMCAxOTEsMjAgY2FwaTIwLjIwCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjbGVhbiB1cAorcm0gLXJmIG1kZXYudGVzdGRpcgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ta2Rpci9ta2Rpci1tYWtlcy1hLWRpcmVjdG9yeSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ta2Rpci9ta2Rpci1tYWtlcy1hLWRpcmVjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E1YzRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21rZGlyL21rZGlyLW1ha2VzLWEtZGlyZWN0b3J5CkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCBta2RpciBmb28KK3Rlc3QgLWQgZm9vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbWtkaXIvbWtkaXItbWFrZXMtcGFyZW50LWRpcmVjdG9yaWVzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21rZGlyL21rZGlyLW1ha2VzLXBhcmVudC1kaXJlY3RvcmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJmYWNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21rZGlyL21rZGlyLW1ha2VzLXBhcmVudC1kaXJlY3RvcmllcwpAQCAtMCwwICsxLDIgQEAKK2J1c3lib3ggbWtkaXIgLXAgZm9vL2JhcgordGVzdCAtZCBmb28gLWEgLWQgZm9vL2JhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21rZnMubWluaXgudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbWtmcy5taW5peC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YTMzYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21rZnMubWluaXgudGVzdHMKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL3NoCisKKyMgbWtmcy5taW5peCB0ZXN0cy4KKyMgQ29weXJpZ2h0IDIwMDcgYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJta2ZzLm1pbml4IiBcCisJImRkIGlmPS9kZXYvemVybyBvZj1pbnB1dCBicz0xayBjb3VudD0xMDI0IDI+L2Rldi9udWxsOyBta2ZzLm1pbml4IGlucHV0OyBtZDVzdW0gPGlucHV0IiBcCisiMzUyIGlub2Rlc1xuIlwKKyIxMDI0IGJsb2Nrc1xuIlwKKyJGaXJzdGRhdGF6b25lPTE1ICgxNSlcbiJcCisiWm9uZXNpemU9MTAyNFxuIlwKKyJNYXhzaXplPTI2ODk2NjkxMlxuIlwKKyI0ZjM1ZjdhZmViYTA3ZDU2MDU1YmVkMWYyOWFlMjBiNyAgLVxuIiBcCisJIiIgXAorCSIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21vdW50LnRlc3Ryb290IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21vdW50LnRlc3Ryb290Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMzRjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbW91bnQudGVzdHJvb3QKQEAgLTAsMCArMSwxODMgQEAKKyMhL2Jpbi9zaAorCisjIFNVU3YzIGNvbXBsaWFudCBtb3VudCBhbmQgdW1vdW50IHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitpZiBbIC16ICIkVEVTVERJUiIgXQordGhlbgorICBlY2hvICdOZWVkICRURVNURElSJworICBleGl0IDEKK2ZpCisKK2NkICIkVEVTVERJUiIKKworLiB0ZXN0aW5nLnNoCisKKyMgSWYgd2UgYXJlbid0IFBJRCAxLCBiYXJmLgorCisjaWYgWyAkJCAtbmUgMSBdCisjdGhlbgorIyAgZWNobyAiU0tJUFBFRDogbW91bnQgdGVzdCByZXF1aXJlcyBlbXVsYXRpb24gZW52aXJvbm1lbnQiCisjICBleGl0IDAKKyNmaQorCisjIFJ1biB0ZXN0cyB3aXRoaW4gdGhlIGNocm9vdCBlbnZpcm9ubWVudC4KK2RvY2hyb290IGJhc2ggcm0gbHMgbG4gY2F0IHBzIG1rbm9kIG1rZGlyIGRkIGdyZXAgY21wIGRpZmYgdGFpbCBcCisJbWtmcy5leHQyIG1rZnMudmZhdCBtb3VudCB1bW91bnQgbG9zZXR1cCB3YyA8PCBFT0YKKyMhL2Jpbi9iYXNoCisKKy4gL3Rlc3Rpbmcuc2gKKworbWtub2QgL2Rldi9sb29wMCBiIDcgMAorbWtub2QgL2Rldi9sb29wMSBiIDcgMQorCisjIFdlIG5lZWQgL3Byb2MgdG8gZG8gbXVjaC4gIE1ha2Ugc3VyZSB3ZSBjYW4gbW91bnQgaXQgZXhwbGljaXRseS4KKwordGVzdGluZyAibW91bnQgbm8gcHJvYyBbR05VRkFJTF0iICJtb3VudCAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IC9wcm9jIiAibW91bnQgLXQgcHJvYyAvcHJvYyAvcHJvYyAmJiBscyAtZCAvcHJvYy8xIiBcCisJIi9wcm9jLzFcbiIgIiIgIiIKKworIyBNYWtlIHN1cmUgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIGxpc3QgaXMgL3Byb2MKKwordGVzdGluZyAibW91bnQgbGlzdDEiICJtb3VudCB8IHRhaWwgLW4gMSIgIi9wcm9jIG9uIC9wcm9jIHR5cGUgcHJvYyAocncpXG4iIFwKKwkiIiAiIgorCisKKyMgQ3JlYXRlIGFuIGV4dDIgaW1hZ2UKKworbWtkaXIgLXAgaW1hZ2VzL3tleHQyLmRpcix2ZmF0LmRpcix0ZXN0MSx0ZXN0Mix0ZXN0M30KK2RkIGlmPS9kZXYvemVybyBvZj1pbWFnZXMvZXh0Mi5pbWcgYnM9MU0gY291bnQ9MSAyPiAvZGV2L251bGwKK21rZnMuZXh0MiAtRiAtYiAxMDI0IGltYWdlcy9leHQyLmltZyA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwKK2RkIGlmPS9kZXYvemVybyBvZj1pbWFnZXMvdmZhdC5pbWcgYnM9MU0gY291bnQ9MSAyPiAvZGV2L251bGwKK21rZnMudmZhdCBpbWFnZXMvdmZhdC5pbWcgPiAvZGV2L251bGwKKworIyBUZXN0IG1vdW50IGl0CisKK3Rlc3RpbmcgIm1vdW50IHZmYXQgaW1hZ2UgKGV4cGxpY2l0bHkgYXV0b2RldGVjdCB0eXBlKSIgXAorCSJtb3VudCAtdCBhdXRvIGltYWdlcy92ZmF0LmltZyBpbWFnZXMvdmZhdC5kaXIgJiYgbW91bnQgfCB0YWlsIC1uIDEgfCBncmVwIC1vICd2ZmF0LmRpciB0eXBlIHZmYXQnIiBcCisJInZmYXQuZGlyIHR5cGUgdmZhdFxuIiAiIiAiIgordGVzdGluZyAibW91bnQgZXh0MiBpbWFnZSAoYXV0b2RldGVjdCB0eXBlKSIgXAorCSJtb3VudCBpbWFnZXMvZXh0Mi5pbWcgaW1hZ2VzL2V4dDIuZGlyIDI+IC9kZXYvbnVsbCAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AxIG9uIC9pbWFnZXMvZXh0Mi5kaXIgdHlwZSBleHQyIChydylcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IHJlbW91bnQgZXh0MiBpbWFnZSBub2F0aW1lIiBcCisJIm1vdW50IC1vIHJlbW91bnQsbm9hdGltZSBpbWFnZXMvZXh0Mi5kaXIgJiYgbW91bnQgfCB0YWlsIC1uIDEiIFwKKwkiL2Rldi9sb29wMSBvbiAvaW1hZ2VzL2V4dDIuZGlyIHR5cGUgZXh0MiAocncsbm9hdGltZSlcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IHJlbW91bnQgZXh0MiBpbWFnZSBybyByZW1lbWJlcnMgbm9hdGltZSIgXAorCSJtb3VudCAtbyByZW1vdW50LHJvIGltYWdlcy9leHQyLmRpciAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AxIG9uIC9pbWFnZXMvZXh0Mi5kaXIgdHlwZSBleHQyIChybyxub2F0aW1lKVxuIiAiIiAiIgorCit1bW91bnQgLWQgaW1hZ2VzL3ZmYXQuZGlyCit1bW91bnQgLWQgaW1hZ2VzL2V4dDIuZGlyCisKK3Rlc3RpbmcgIm1vdW50IHVtb3VudCBmcmVlZCBsb29wIGRldmljZSIgXAorCSJtb3VudCBpbWFnZXMvZXh0Mi5pbWcgaW1hZ2VzL2V4dDIuZGlyICYmIG1vdW50IHwgdGFpbCAtbiAxIiBcCisJIi9kZXYvbG9vcDAgb24gL2ltYWdlcy9leHQyLmRpciB0eXBlIGV4dDIgKHJ3KVxuIiAiIiAiIgorCit0ZXN0aW5nICJtb3VudCBibG9jayBkZXZpY2UiIFwKKwkibW91bnQgLXQgZXh0MiAvZGV2L2xvb3AwIGltYWdlcy90ZXN0MSAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AwIG9uIC9pbWFnZXMvdGVzdDEgdHlwZSBleHQyIChydylcbiIgIiIgIiIKKwordW1vdW50IC1kIGltYWdlcy9leHQyLmRpciBpbWFnZXMvdGVzdDEKKwordGVzdGluZyAibW91bnQgcmVtb3VudCBub25leGlzdGVudCBkaXJlY3RvcnkiIFwKKwkibW91bnQgLW8gcmVtb3VudCxub2F0aW1lIGltYWdlcy9leHQyLmRpciAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCisKKyMgRnVuIHdpdGggbW91bnQgLWEKKwordGVzdGluZyAibW91bnQgLWEgbm8gZnN0YWIiICJtb3VudCAtYSAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorCit1bW91bnQgL3Byb2MKKworIyBUaGUgZmlyc3QgZmllbGQgaXMgc3BhY2UgZGVsaW1pdGVkLCB0aGUgcmVzdCB0YWJzLgorCitjYXQgPiAvZXRjL2ZzdGFiIDw8IEZTVEFCCisvcHJvYyAgICAgICAgICAgICAvcHJvYwkJCXByb2MJZGVmYXVsdHMJMAkwCisjIEF1dG9kZXRlY3QgbG9vcCwgYW5kIHByb3ZpZGUgZmxhZ3Mgd2l0aCBjb21tYXMgaW4gdGhlbS4KKy9pbWFnZXMvZXh0Mi5pbWcgIC9pbWFnZXMvZXh0Mi5kaXIJZXh0Mglub2F0aW1lLG5vZGV2CTAJMAorIyBhdXRvZGV0ZWN0IGZpbGVzeXN0ZW0sIGZsYWdzIHdpdGhvdXQgY29tbWFzLgorL2ltYWdlcy92ZmF0LmltZyAgL2ltYWdlcy92ZmF0LmRpcglhdXRvCXJvCQkwCTAKKyMgQSBibG9jayBkZXZpY2UKKy9kZXYvbG9vcDIgICAgICAgIC9pbWFnZXMvdGVzdDEJCWF1dG8JZGVmYXVsdHMJMAkwCisjIHRtcGZzLCBmaWxlc3lzdGVtIHNwZWNpZmljIGZsYWcuCit3YWxydXMJCSAgL2ltYWdlcy90ZXN0MgkJdG1wZnMJc2l6ZT00MgkJMAkwCisjIEF1dG9kZXRlY3QgYSBiaW5kIG1vdW50LgorL2ltYWdlcy90ZXN0MiAgICAgL2ltYWdlcy90ZXN0MwkJYXV0bwlkZWZhdWx0cwkwCTAKK0ZTVEFCCisKKyMgUHV0IHNvbWV0aGluZyBvbiBsb29wMi4KK21rbm9kIC9kZXYvbG9vcDIgYiA3IDIKK2NhdCBpbWFnZXMvZXh0Mi5pbWcgPiBpbWFnZXMvZXh0Mi0yLmltZworbG9zZXR1cCAvZGV2L2xvb3AyIGltYWdlcy9leHQyLTIuaW1nCisKK3Rlc3RpbmcgIm1vdW50IC1hIiAibW91bnQgLWEgJiYgZWNobyBoZWxsbyA+IC9pbWFnZXMvdGVzdDIvYWJjICYmIGNhdCAvaW1hZ2VzL3Rlc3QzL2FiYyAmJiAobW91bnQgfCB3YyAtbCkiICJoZWxsb1xuOFxuIiAiIiAiIgorCit0ZXN0aW5nICJ1bW91bnQgLWEiICJ1bW91bnQgLWEgJiYgbHMgL3Byb2MiICIiICIiICIiCisKKyMvYmluL2Jhc2ggPCAvZGV2L3R0eSA+IC9kZXYvdHR5IDI+IC9kZXYvdHR5Citta25vZCAvZGV2L2NvbnNvbGUgYyA1IDEKKy9iaW4vYmFzaCA8IC9kZXYvY29uc29sZSA+IC9kZXYvY29uc29sZSAyPiAvZGV2L2NvbnNvbGUKK0VPRgorCitleGl0IDAKKworIyBSdW4gc29tZSB0ZXN0cworCitsb3NldHVwIG5vbmV4aXN0ZW50IGRldmljZSAoc2hvdWxkIHJldHVybiBlcnJvciAyKQorbG9zZXR1cCB1bmJvdW5kIGxvb3AgZGV2aWNlIChzaG91bGQgcmV0dXJuIGVycm9yIDEpCitsb3NldHVwIGJpbmQgZmlsZSB0byBsb29wIGRldmljZQorbG9zZXR1cCBib3VuZCBsb29wIGRldmljZSAoZGlzcGxheSkgIChzaG91bGQgcmV0dXJuIGVycm9yIDApCitsb3NldHVwIGZpbGVuYW1lIChlcnJvcikKK2xvc2V0dXAgbm9maWxlIChmaWxlIG5vdCBmb3VuZCkKK2xvc2V0dXAgLWQKK2xvc2V0dXAgYmluZCB3aXRoIG9mZnNldAorbG9zZXR1cCAtZiAocHJpbnQgZmlyc3QgbG9vcCBkZXZpY2UpCitsb3NldHVwIC1mIGZpbGVuYW1lIChhc3NvY2lhdGUgZmlsZSB3aXRoIGZpcnN0IGxvb3AgZGV2aWNlKQorbG9zZXR1cCAtbyAocGFzdCBlbmQgb2YgZmlsZSkgLWYgZmlsZW5hbWUKKworbW91bnQgLWEKKyAgd2l0aCBtdWx0aXBsZSBlbnRyaWVzIGluIGZzdGFiCisgIHdpdGggZHVwbGljYXRlIGVudHJpZXMgaW4gZnN0YWIKKyAgd2l0aCByZWxhdGl2ZSBwYXRocyBpbiBmc3RhYgorICB3aXRoIHVzZXIgZW50cmllcyBpbiBmc3RhYgorbW91bnQgLW8gYXN5bmMsc3luYyxhdGltZSxub2F0aW1lLGRldixub2RldixleGVjLG5vZXhlYyxsb29wLHN1aWQsbm9zdWlkLHJlbW91bnQscm8scncsYmluZCxtb3ZlCittb3VudCAtcgorbW91bnQgLW8gcncgLXIKK21vdW50IC13IC1vIHJvCittb3VudCAtdCBhdXRvCisKK21vdW50IHdpdGggcmVsYXRpdmUgcGF0aCBpbiBmc3RhYgorbW91bnQgYmxvY2sgZGV2aWNlCittb3VudCBjaGFyIGRldmljZQorbW91bnQgZmlsZSAoYXV0b2xvb3ApCittb3VudCBkaXJlY3RvcnkgKGF1dG9iaW5kKQorCisKK3Rlc3RpbmcgInVtb3VudCB3aXRoIG5vIC9wcm9jIgordGVzdGluZyAidW1vdW50IGN1cmRpciIKKworIyBUaGUgYmFzaWMgdGVzdHMuICBUaGVzZSBzaG91bGQgd29yayBldmVuIHdpdGggdGhlIHNtYWxsIGJ1c3lib3guCisKK3Rlc3RpbmcgInNvcnQiICJpbnB1dCIgImFcbmJcbmNcbiIgImNcbmFcbmJcbiIgIiIKK3Rlc3RpbmcgInNvcnQgIzIiICJpbnB1dCIgIjAxMFxuMVxuM1xuIiAiM1xuMVxuMDEwXG4iICIiCit0ZXN0aW5nICJzb3J0IHN0ZGluIiAiIiAiYVxuYlxuY1xuIiAiIiAiYlxuYVxuY1xuIgordGVzdGluZyAic29ydCBudW1lcmljIiAiLW4gaW5wdXQiICIxXG4zXG4wMTBcbiIgIjNcbjFcbjAxMFxuIiAiIgordGVzdGluZyAic29ydCByZXZlcnNlIiAiLXIgaW5wdXQiICJ3b29rXG53YWxydXNcbnBvaW50XG5wYWJzdFxuYWFyZ2hcbiIgXAorCSJwb2ludFxud29va1xucGFic3RcbmFhcmdoXG53YWxydXNcbiIgIiIKKworb3B0aW9uYWwgRkVBVFVSRV9NT1VOVF9MT09QCit0ZXN0aW5nICJ1bW91bnQgLUQiCisKK29wdGlvbmFsIEZFQVRVUkVfTVRBQl9TVVBQT1JUCitvcHRpb25hbCBGRUFUVVJFX01PVU5UX05GUworIyBObyBpZGVhIHdoYXQgdG8gdGVzdCBoZXJlLgorCitvcHRpb25hbCBVTU9VTlQKK29wdGlvbmFsIEZFQVRVUkVfVU1PVU5UX0FMTAordGVzdGluZyAidW1vdW50IC1hIgordGVzdGluZyAidW1vdW50IC1yIgordGVzdGluZyAidW1vdW50IC1sIgordGVzdGluZyAidW1vdW50IC1mIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tb3VudC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tb3VudC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTg5MWJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21vdW50LnRlc3RzCkBAIC0wLDAgKzEsODYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwNyBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAordGVzdCAtZiAiJGJpbmRpci8uY29uZmlnIiAmJiAuICIkYmluZGlyLy5jb25maWciCisKK3Rlc3QgImBpZCAtdWAiID0gMCB8fCB7CisJZWNobyAiU0tJUFBFRDogbW91bnQgKG11c3QgYmUgcm9vdCB0byB0ZXN0IHRoaXMpIgorCWV4aXQgMAorfQorCitpZiB0ZXN0IHgiJENPTkZJR19NS0ZTX01JTklYIiAhPSB4InkiIFwKK3x8IHRlc3QgeCIkQ09ORklHX0ZFQVRVUkVfTUlOSVgyIiAhPSB4InkiIFwKK3x8IHRlc3QgeCIkQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUCIgIT0geCJ5IiBcCit8fCB0ZXN0IHgiJENPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTIiAhPSB4InkiIFwKK3x8IHRlc3QgeCIkQ09ORklHX0ZFQVRVUkVfREVWRlMiID0geCJ5IiBcCis7IHRoZW4KKwllY2hvICJTS0lQUEVEOiBtb3VudCIKKwlleGl0IDAKK2ZpCisKK3Rlc3RkaXI9IiRQV0QvbW91bnQudGVzdGRpciIKKworZGQgaWY9L2Rldi96ZXJvIG9mPW1vdW50LmltYWdlMW0gY291bnQ9MSBicz0xTSAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gImRkIGVycm9yIjsgZXhpdCAxOyB9Citta2ZzLm1pbml4IC12IG1vdW50LmltYWdlMW0gPi9kZXYvbnVsbCAyPiYxIHx8IHsgZWNobyAibWtmcy5taW5peCBlcnJvciI7IGV4aXQgMTsgfQorbW9kcHJvYmUgbWluaXggMj4vZGV2L251bGwKK21rZGlyICIkdGVzdGRpciIgMj4vZGV2L251bGwKK3Vtb3VudCAtZCAiJHRlc3RkaXIiIDI+L2Rldi9udWxsCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZCIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCit0ZXN0aW5nICJtb3VudCAtbyByZW1vdW50LG1hbmQiIFwKKyJtb3VudCAtbyBsb29wIG1vdW50LmltYWdlMW0gJHRlc3RkaXIgIlwKKyImJiBncmVwIC1GYyAkdGVzdGRpciA8L3Byb2MvbW91bnRzICJcCisiJiYgbW91bnQgLW8gcmVtb3VudCxtYW5kICR0ZXN0ZGlyICJcCisiJiYgZ3JlcCAtRiAkdGVzdGRpciA8L3Byb2MvbW91bnRzIHwgZ3JlcCAtYyAnWywgXW1hbmRbLCBdJyIgXAorCSIxXG4iIjFcbiIgXAorCSIiICIiCisKK3Vtb3VudCAtZCAiJHRlc3RkaXIiCitybWRpciAiJHRlc3RkaXIiCitybSBtb3VudC5pbWFnZTFtCisKKworIyBCdWc6IG1vdW50LnNoYXJlZDEgZGlyZWN0b3J5IHNob3dzIG5vIGZpbGVzIChoYXMgdG8gc2hvdyBmaWxlcyBhIGFuZCBiKQorb3B0aW9uYWwgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgIm1vdW50IGJpbmQrcnNoYXJlZCIgIlwKK21rZGlyIC1wIG1vdW50LmRpciBtb3VudC5zaGFyZWQxIG1vdW50LnNoYXJlZDIKK3RvdWNoIG1vdW50LmRpci9hIG1vdW50LmRpci9iCisKK21vdW50IC0tYmluZCAgICAgICAgIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMSAyPiYxCittb3VudCAtLW1ha2UtcnNoYXJlZCBtb3VudC5zaGFyZWQxICAgICAgICAgICAgICAgMj4mMQorbW91bnQgLS1iaW5kICAgICAgICAgbW91bnQuc2hhcmVkMiBtb3VudC5zaGFyZWQyIDI+JjEKK21vdW50IC0tbWFrZS1yc2hhcmVkIG1vdW50LnNoYXJlZDIgICAgICAgICAgICAgICAyPiYxCisKK21vdW50IC0tYmluZCBtb3VudC5zaGFyZWQyIG1vdW50LnNoYXJlZDEgICAgICAgICAyPiYxCittb3VudCAtLWJpbmQgbW91bnQuZGlyICAgICBtb3VudC5zaGFyZWQyICAgICAgICAgMj4mMQorCitscyAtUiBtb3VudC5kaXIgbW91bnQuc2hhcmVkMSBtb3VudC5zaGFyZWQyICAgICAgMj4mMQorCit1bW91bnQgbW91bnQuZGlyIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMiAyPi9kZXYvbnVsbAordW1vdW50IG1vdW50LmRpciBtb3VudC5zaGFyZWQxIG1vdW50LnNoYXJlZDIgMj4vZGV2L251bGwKK3Vtb3VudCBtb3VudC5kaXIgbW91bnQuc2hhcmVkMSBtb3VudC5zaGFyZWQyIDI+L2Rldi9udWxsCitybSAtZiBtb3VudC5kaXIvYSBtb3VudC5kaXIvYiBtb3VudC5kaXIvYworcm1kaXIgbW91bnQuZGlyIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMgorIiBcCisiXAorbW91bnQuZGlyOgorYQorYgorCittb3VudC5zaGFyZWQxOgorYQorYgorCittb3VudC5zaGFyZWQyOgorYQorYgorIiBcCisJIiIgIiIKK1NLSVA9CisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21zaC9tc2gtc3VwcG9ydHMtdW5kZXJzY29yZXMtaW4tdmFyaWFibGUtbmFtZXMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXNoL21zaC1zdXBwb3J0cy11bmRlcnNjb3Jlcy1pbi12YXJpYWJsZS1uYW1lcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzc4MzRiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL21zaC9tc2gtc3VwcG9ydHMtdW5kZXJzY29yZXMtaW4tdmFyaWFibGUtbmFtZXMKQEAgLTAsMCArMSBAQAordGVzdCAiYGJ1c3lib3ggbXNoIC1jICdGT09fQkFSPWZvbzsgZWNobyAkRk9PX0JBUidgIiA9IGZvbwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LWZpbGVzLXRvLWRpciBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1maWxlcy10by1kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1NjdmNwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1maWxlcy10by1kaXIKQEAgLTAsMCArMSwxNiBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBmaWxlMgorbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIGRpcjEKK1RaPVVUQzAgdG91Y2ggLWQgJzIwMDAtMDEtMzAgMDU6MjQ6MDgnIGRpcjEvZmlsZTMKK21rZGlyIHRoZXJlCitidXN5Ym94IG12IGZpbGUxIGZpbGUyIGxpbmsxIGRpcjEgdGhlcmUKK3Rlc3QgLWYgdGhlcmUvZmlsZTEKK3Rlc3QgLWYgdGhlcmUvZmlsZTIKK3Rlc3QgLWYgdGhlcmUvZGlyMS9maWxlMwordGVzdCAtTCB0aGVyZS9saW5rMQordGVzdCB4ZmlsZTIgPSB4YHJlYWRsaW5rIHRoZXJlL2xpbmsxYAordGVzdCAhIC1lIGZpbGUxCit0ZXN0ICEgLWUgZmlsZTIKK3Rlc3QgISAtZSBsaW5rMQordGVzdCAhIC1lIGRpcjEvZmlsZTMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1mb2xsb3dzLWxpbmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LWZvbGxvd3MtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiMzU1YgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1mb2xsb3dzLWxpbmtzCkBAIC0wLDAgKzEsNCBAQAordG91Y2ggZm9vCitsbiAtcyBmb28gYmFyCitidXN5Ym94IG12IGJhciBiYXoKK3Rlc3QgLWYgYmF6CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZW1wdHktZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1lbXB0eS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWZjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZW1wdHktZmlsZQpAQCAtMCwwICsxLDQgQEAKK3RvdWNoIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LW1vdmVzLWZpbGUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGI0YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LW1vdmVzLWZpbGUKQEAgLTAsMCArMSwzIEBACit0b3VjaCBmb28KK2J1c3lib3ggbXYgZm9vIGJhcgordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1oYXJkbGlua3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtaGFyZGxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTgyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtaGFyZGxpbmtzCkBAIC0wLDAgKzEsNCBAQAordG91Y2ggZm9vCitsbiBmb28gYmFyCitidXN5Ym94IG12IGJhciBiYXoKK3Rlc3QgISAtZiBiYXIgLWEgLWYgYmF6CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtbGFyZ2UtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1sYXJnZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDA4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtbGFyZ2UtZmlsZQpAQCAtMCwwICsxLDQgQEAKK2RkIGlmPS9kZXYvemVybyBvZj1mb28gc2Vlaz0xMGsgY291bnQ9MSAyPi9kZXYvbnVsbAorYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LW1vdmVzLXNtYWxsLWZpbGUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtc21hbGwtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVjN2YxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LW1vdmVzLXNtYWxsLWZpbGUKQEAgLTAsMCArMSw0IEBACitlY2hvIEkgV0FOVCA+IGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LW1vdmVzLXN5bWxpbmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LW1vdmVzLXN5bWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTNhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtc3ltbGlua3MKQEAgLTAsMCArMSw2IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggbXYgYmFyIGJhegordGVzdCAtZiBmb28KK3Rlc3QgISAtZSBiYXIKK3Rlc3QgLUwgYmF6CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtdW5yZWFkYWJsZS1maWxlcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy11bnJlYWRhYmxlLWZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOWMzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtdW5yZWFkYWJsZS1maWxlcwpAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbworY2htb2QgYS1yIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1oYXJkLWxpbmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1oYXJkLWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmEzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtcHJlc2VydmVzLWhhcmQtbGlua3MKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUwordG91Y2ggZm9vCitsbiBmb28gYmFyCitta2RpciBiYXoKK2J1c3lib3ggbXYgZm9vIGJhciBiYXoKK3Rlc3QgYmF6L2ZvbyAtZWYgYmF6L2JhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1saW5rcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1wcmVzZXJ2ZXMtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1NjVkMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1wcmVzZXJ2ZXMtbGlua3MKQEAgLTAsMCArMSw1IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggbXYgYmFyIGJhegordGVzdCAtTCBiYXoKK3Rlc3QgeGZvbyA9IHhgcmVhZGxpbmsgYmF6YApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL212L212LXJlZnVzZXMtbXYtZGlyLXRvLXN1YmRpciBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1yZWZ1c2VzLW12LWRpci10by1zdWJkaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZDEzMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1yZWZ1c2VzLW12LWRpci10by1zdWJkaXIKQEAgLTAsMCArMSwyMyBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBmaWxlMgorbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIGRpcjEKK1RaPVVUQzAgdG91Y2ggLWQgJzIwMDAtMDEtMzAgMDU6MjQ6MDgnIGRpcjEvZmlsZTMKK21rZGlyIHRoZXJlCitidXN5Ym94IG12IGZpbGUxIGZpbGUyIGxpbmsxIGRpcjEgdGhlcmUKK3Rlc3QgLWYgdGhlcmUvZmlsZTEKK3Rlc3QgLWYgdGhlcmUvZmlsZTIKK3Rlc3QgLWYgdGhlcmUvZGlyMS9maWxlMwordGVzdCAtTCB0aGVyZS9saW5rMQordGVzdCB4ZmlsZTIgPSB4YHJlYWRsaW5rIHRoZXJlL2xpbmsxYAordGVzdCAhIC1lIGZpbGUxCit0ZXN0ICEgLWUgZmlsZTIKK3Rlc3QgISAtZSBsaW5rMQordGVzdCAhIC1lIGRpcjEvZmlsZTMKK3NldCArZQorYnVzeWJveCBtdiB0aGVyZSB0aGVyZS9kaXIxCitpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKwlleGl0IDA7CitmaQorCitleGl0IDE7CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtcmVtb3Zlcy1zb3VyY2UtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9tdi9tdi1yZW1vdmVzLXNvdXJjZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWZjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvbXYvbXYtcmVtb3Zlcy1zb3VyY2UtZmlsZQpAQCAtMCwwICsxLDQgQEAKK3RvdWNoIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL29kLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL29kLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhOWRhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvb2QudGVzdHMKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZHMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK29wdGlvbmFsIERFU0tUT1AKK3Rlc3RpbmcgIm9kIC1iIiBcCisJIm9kIC1iIiBcCisiXAorMDAwMDAwMCAxMTAgMTA1IDExNCAxMTQgMTE3CiswMDAwMDA1CisiIFwKKwkiIiAiSEVMTE8iCitTS0lQPQorCitvcHRpb25hbCBERVNLVE9QIExPTkdfT1BUUwordGVzdGluZyAib2QgLWIgLS10cmFkaXRpb25hbCIgXAorCSJvZCAtYiAtLXRyYWRpdGlvbmFsIiBcCisiXAorMDAwMDAwMCAxMTAgMTA1IDExNCAxMTQgMTE3CiswMDAwMDA1CisiIFwKKwkiIiAiSEVMTE8iCitTS0lQPQorCitvcHRpb25hbCBERVNLVE9QIExPTkdfT1BUUwordGVzdGluZyAib2QgLWIgLS10cmFkaXRpb25hbCBGSUxFIiBcCisJIm9kIC1iIC0tdHJhZGl0aW9uYWwgaW5wdXQiIFwKKyJcCiswMDAwMDAwIDExMCAxMDUgMTE0IDExNCAxMTcKKzAwMDAwMDUKKyIgXAorCSJIRUxMTyIgIiIKK1NLSVA9CisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3BhcnNlLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3BhcnNlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwNGUxYTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcGFyc2UudGVzdHMKQEAgLTAsMCArMSwxMTAgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKK0NPTExBUFNFPSQoKCAweDAwMDEwMDAwKSkKK1RSSU09JCgoICAgICAweDAwMDIwMDAwKSkKK0dSRUVEWT0kKCggICAweDAwMDQwMDAwKSkKK01JTl9ESUU9JCgoICAweDAwMTAwMDAwKSkKK0tFRVBfQ09QWT0kKCgweDAwMjAwMDAwKSkKK0VTQ0FQRT0kKCggICAweDAwNDAwMDAwKSkKK05PUk1BTD0kKCggICBDT0xMQVBTRSB8IFRSSU0gfCBHUkVFRFkpKQorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJwYXJzZSBtZGV2LmNvbmYiIFwKKwkicGFyc2UgLW4gNCAtbSAzIC1mICQoKE5PUk1BTCkpIC0iIFwKKwkiW3NkYV1bMDowXVs2NDRdW0BlY2hvIEBlY2hvIFRFU1RdXG4iIFwKKwkiLSIgXAorCSIgc2RhIDA6MCA2NDQgQGVjaG8gQGVjaG8gVEVTVCAjIGVjaG8gdHJhcFxuIgorCit0ZXN0aW5nICJwYXJzZSBub3RyaW0iIFwKKwkicGFyc2UgLW4gNCAtbSAzIC1mICQoKE5PUk1BTCAtIFRSSU0gLSBDT0xMQVBTRSkpIC0iIFwKKwkiW11bc2RhXVswOjBdWzY0NCBAZWNobyBAZWNobyBURVNUIF1cbiIgXAorCSItIiBcCisJIiBzZGEgMDowIDY0NCBAZWNobyBAZWNobyBURVNUIFxuIgorCitGSUxFPV9fcGFyc2UKK2NhdCA+JEZJTEUgPDxFT0YKKyMKKyMgRGV2aWNlICAgICAgICAgUG9pbnQgICAgICAgICAgICAgICBTeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMKKyNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKy9kZXYvaGRiMyAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICBleHQyICAgICAgICAgICAgICAgICBkZWZhdWx0cyAgICAgIDEgICAgICAgICAgMAorICAgL2Rldi9oZGIxICAgICAgIC9kb3NjICAgICAgICAgICAgICAgaHBmcyAgICAgICAgICAgICAgICAgcm8gICAgICAxICAgICAgICAgIDAKKyAvZGV2L2ZkMCAgICAgICAgICAvZG9zYSAgICAgICAgICAgICAgdmZhdCAgICAgICAgICAgICAgICAgIHJ3LHVzZXIsbm9hdXRvLG5vaGlkZQkgMAkJMAorCS9kZXYvZmQxICAgICAgICAgIC9kb3NiICAgICAgICAgICAgICB2ZmF0ICAgICAgICAgICAgICAgICAgcncsdXNlcixub2F1dG8sbm9oaWRlCSAwCQkwCisjCisgL2Rldi9jZHJvbSAgICAgL2Nkcm9tICAgICAgICAgICAgaXNvOTY2MCAgICAgICAgICBybyx1c2VyLG5vYXV0byxub2hpZGUJIDAJCTAKKy9kZXYvaGRiNSAgICAgICAvcmVkaGF0ICAgICAgICAgICAgZXh0MiAgICAgICAgICAgICAgICAgcncscm9vdCxub2F1dG8sbm9oaWRlCSAwCQkwICNzc3NkCisJL2Rldi9oZGI2ICAgICAgIC93aW4yaG9tZSAgICAgbnRmcyAgICAgICAgICAgICAgICAgIHJ3LHJvb3Qsbm9hdXRvLG5vaGlkZQkgMAkJMCMgc3Nkc2QKKy9kZXYvaGRiNyAgICAgICAvd2luMnNrdWwgICAgICAgIG50ZnMgICAgICAgICAgICAgICAgICBydyxyb290LG5vYXV0byxub2hpZGUgbm9uZQkgMAkJMAorbm9uZSAgICAgL2Rldi9wdHMgICAgICAgICAgIGRldnB0cyAgICAgICAgICAgICBnaWQ9NSxtb2RlPTYyMCAgICAgICAgICAgICAgICAgMCAgICAwIAorICAgICBub25lICAgICAgICAgICAgICAgIC9wcm9jICAgICAgICAgICAgICAgcHJvYyAgICAgICAgICAgICAgICBkZWZhdWx0cyAgICAgMCAgICAgICAgICAwCitFT0YKKworY2F0ID4kRklMRS5yZXMgPDxFT0YKK1svZGV2L2hkYjNdWy9dW2V4dDJdW2RlZmF1bHRzXVsxXVswXQorWy9kZXYvaGRiMV1bL2Rvc2NdW2hwZnNdW3JvXVsxXVswXQorWy9kZXYvZmQwXVsvZG9zYV1bdmZhdF1bcncsdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvZmQxXVsvZG9zYl1bdmZhdF1bcncsdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvY2Ryb21dWy9jZHJvbV1baXNvOTY2MF1bcm8sdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvaGRiNV1bL3JlZGhhdF1bZXh0Ml1bcncscm9vdCxub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvaGRiNl1bL3dpbjJob21lXVtudGZzXVtydyxyb290LG5vYXV0byxub2hpZGVdWzBdWzBdCitbL2Rldi9oZGI3XVsvd2luMnNrdWxdW250ZnNdW3J3LHJvb3Qsbm9hdXRvLG5vaGlkZV1bbm9uZV1bMAkJMF0KK1tub25lXVsvZGV2L3B0c11bZGV2cHRzXVtnaWQ9NSxtb2RlPTYyMF1bMF1bMF0KK1tub25lXVsvcHJvY11bcHJvY11bZGVmYXVsdHNdWzBdWzBdCitFT0YKKwordGVzdGluZyAicGFyc2UgcG9sbHV0ZWQgZnN0YWIiIFwKKwkicGFyc2UgLW4gNiAtbSA2ICRGSUxFIiBcCisJImBjYXQgJEZJTEUucmVzYFxuIiBcCisJIiIgXAorCSIiCitjcCAuLi9leGFtcGxlcy9pbml0dGFiICRGSUxFCitjYXQgPiRGSUxFLnJlcyA8PEVPRgorW11bXVtzeXNpbml0XVsvZXRjL2luaXQuZC9yY1NdCitbXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHkyXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHkzXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHk0XVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHk0XVtdW3Jlc3Bhd25dWy9zYmluL2dldHR5IDM4NDAwIHR0eTVdCitbdHR5NV1bXVtyZXNwYXduXVsvc2Jpbi9nZXR0eSAzODQwMCB0dHk2XQorW11bXVtyZXN0YXJ0XVsvc2Jpbi9pbml0XQorW11bXVtjdHJsYWx0ZGVsXVsvc2Jpbi9yZWJvb3RdCitbXVtdW3NodXRkb3duXVsvYmluL3Vtb3VudCAtYSAtcl0KK1tdW11bc2h1dGRvd25dWy9zYmluL3N3YXBvZmYgLWFdCitFT0YKKwordGVzdGluZyAicGFyc2UgaW5pdHRhYiBmcm9tIGV4YW1wbGVzIiBcCisJInBhcnNlIC1uIDQgLW0gNCAtZiAkKChOT1JNQUwgLSBUUklNIC0gQ09MTEFQU0UpKSAtZCcjOicgJEZJTEUiIFwKKwkiYGNhdCAkRklMRS5yZXNgXG4iIFwKKwkiIiBcCisJIiIKKworY3AgLi4vZXhhbXBsZXMvdWRoY3AvdWRoY3BkLmNvbmYgJEZJTEUKK2NhdCA+JEZJTEUucmVzIDw8RU9GCitbc3RhcnRdWzE5Mi4xNjguMC4yMF0KK1tlbmRdWzE5Mi4xNjguMC4yNTRdCitbaW50ZXJmYWNlXVtldGgwXQorW29wdF1bZG5zXVsxOTIuMTY4LjEwLjJdWzE5Mi4xNjguMTAuMTBdCitbb3B0aW9uXVtzdWJuZXRdWzI1NS4yNTUuMjU1LjBdCitbb3B0XVtyb3V0ZXJdWzE5Mi4xNjguMTAuMl0KK1tvcHRdW3dpbnNdWzE5Mi4xNjguMTAuMTBdCitbb3B0aW9uXVtkbnNdWzEyOS4yMTkuMTMuODFdCitbb3B0aW9uXVtkb21haW5dW2xvY2FsXQorW29wdGlvbl1bbGVhc2VdWzg2NDAwMF0KK1tvcHRpb25dWzB4MDhdWzAxMDIwMzA0XQorRU9GCisKK3Rlc3RpbmcgInBhcnNlIHVkaGNwZC5jb25mIGZyb20gZXhhbXBsZXMiIFwKKwkicGFyc2UgLW4gMTI3ICRGSUxFIiBcCisJImBjYXQgJEZJTEUucmVzYFxuIiBcCisJIiIgXAorCSIiCisKK3JtIC1mICRGSUxFICRGSUxFLnJlcworCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9wYXRjaC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9wYXRjaC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNjA0YjljCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3BhdGNoLnRlc3RzCkBAIC0wLDAgKzEsMjE3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kKHMpIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJwYXRjaCB3aXRoIG9sZF9maWxlID09IG5ld19maWxlIiBcCisJJ3BhdGNoIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK3F3ZQorYXNkCit6eGMKKyIgXAorIlwKK3F3ZQorenhjCisiIFwKKyJcCistLS0gaW5wdXQJSmFuIDAxIDAxOjAxOjAxIDIwMDAKKysrKyBpbnB1dAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorQEAgLTEsMiArMSwzIEBACisgcXdlCisrYXNkCisgenhjCisiIFwKKwordGVzdGluZyAicGF0Y2ggd2l0aCBub25leGlzdGVudCBvbGRfZmlsZSIgXAorCSdwYXRjaCAyPiYxOyBlY2hvICQ/OyBjYXQgaW5wdXQnIFwKKyJcCitwYXRjaGluZyBmaWxlIGlucHV0CiswCitxd2UKK2FzZAorenhjCisiIFwKKyJcCitxd2UKK3p4YworIiBcCisiXAorLS0tIGlucHV0LmRvZXNudF9leGlzdAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBxd2UKKythc2QKKyB6eGMKKyIgXAorCit0ZXN0aW5nICJwYXRjaCAtUiB3aXRoIG5vbmV4aXN0ZW50IG9sZF9maWxlIiBcCisJJ3BhdGNoIC1SIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK3F3ZQorenhjCisiIFwKKyJcCitxd2UKK2FzZAorenhjCisiIFwKKyJcCistLS0gaW5wdXQuZG9lc250X2V4aXN0CUphbiAwMSAwMTowMTowMSAyMDAwCisrKysgaW5wdXQJSmFuIDAxIDAxOjAxOjAxIDIwMDAKK0BAIC0xLDIgKzEsMyBAQAorIHF3ZQorK2FzZAorIHp4YworIiBcCisKK3Rlc3RpbmcgInBhdGNoIGRldGVjdHMgYWxyZWFkeSBhcHBsaWVkIGh1bmsiIFwKKwkncGF0Y2ggMj4mMTsgZWNobyAkPzsgY2F0IGlucHV0JyBcCisiXAorUG9zc2libHkgcmV2ZXJzZWQgaHVuayAxIGF0IDQKK0h1bmsgMSBGQUlMRUQgMS8xLgorIGFiYworK2RlZgorIDEyMworcGF0Y2hpbmcgZmlsZSBpbnB1dAorMQorYWJjCitkZWYKKzEyMworIiBcCisiXAorYWJjCitkZWYKKzEyMworIiBcCisiXAorLS0tIGlucHV0Lm9sZAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKytkZWYKKyAxMjMKKyIgXAorCit0ZXN0aW5nICJwYXRjaCBkZXRlY3RzIGFscmVhZHkgYXBwbGllZCBodW5rIGF0IHRoZSBFT0YiIFwKKwkncGF0Y2ggMj4mMTsgZWNobyAkPzsgY2F0IGlucHV0JyBcCisiXAorUG9zc2libHkgcmV2ZXJzZWQgaHVuayAxIGF0IDQKK0h1bmsgMSBGQUlMRUQgMS8xLgorIGFiYworIDEyMworKzQ1NgorcGF0Y2hpbmcgZmlsZSBpbnB1dAorMQorYWJjCisxMjMKKzQ1NgorIiBcCisiXAorYWJjCisxMjMKKzQ1NgorIiBcCisiXAorLS0tIGlucHV0Lm9sZAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKyAxMjMKKys0NTYKKyIgXAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQocykiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCit0ZXN0aW5nICJwYXRjaCAtTiBpZ25vcmVzIGFscmVhZHkgYXBwbGllZCBodW5rIiBcCisJJ3BhdGNoIC1OIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK2FiYworZGVmCisxMjMKKyIgXAorIlwKK2FiYworZGVmCisxMjMKKyIgXAorIlwKKy0tLSBpbnB1dAorKysrIGlucHV0CitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKytkZWYKKyAxMjMKKyIgXAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQocykiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCit0ZXN0aW5nICJwYXRjaCBGSUxFIFBBVENIIiBcCisJJ2NhdCA+YS5wYXRjaDsgcGF0Y2ggaW5wdXQgYS5wYXRjaCAyPiYxOyBlY2hvICQ/OyBjYXQgaW5wdXQ7IHJtIGEucGF0Y2gnIFwKKyJcCitwYXRjaGluZyBmaWxlIGlucHV0CiswCithYmMKK2RlZgorMTIzCisiIFwKKyJcCithYmMKKzEyMworIiBcCisiXAorLS0tIGZvby5vbGQKKysrKyBmb28KK0BAIC0xLDIgKzEsMyBAQAorIGFiYworK2RlZgorIDEyMworIiBcCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZChzKSIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKK3Rlc3RpbmcgInBhdGNoIGF0IHRoZSBiZWdpbm5pbmciIFwKKwkncGF0Y2ggMj4mMTsgY2F0IGlucHV0JyBcCisiXAorcGF0Y2hpbmcgZmlsZSBpbnB1dAorMTExY2hhbmdlZAorNDQ0Cis1NTUKKzY2NgorNzc3Cis4ODgKKzk5OQorIiBcCisiXAorMTExCisyMjIKKzMzMworNDQ0Cis1NTUKKzY2NgorNzc3Cis4ODgKKzk5OQorIiBcCisiXAorLS0tIGlucHV0CisrKysgaW5wdXQKK0BAIC0xLDYgKzEsNCBAQAorLTExMQorLTIyMgorLTMzMworKzExMWNoYW5nZWQKKyA0NDQKKyA1NTUKKyA2NjYKKyIgXAorCitybSBpbnB1dC5vcmlnIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3BpZG9mLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3BpZG9mLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhMDZkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcGlkb2YudGVzdHMKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKKyMgcGlkb2YgdGVzdHMuCisjIENvcHlyaWdodCAyMDA1IGJ5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisjIEFVRElUOgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgInBpZG9mIChleGl0IHdpdGggZXJyb3IpIiBcCisJInBpZG9mIHZlcnl1bmxpa2VseW9jY3VyaW5nYmluYXJ5bmFtZSA7IGVjaG8gXCQ/IiAiMVxuIiAiIiAiIgordGVzdGluZyAicGlkb2YgKGV4aXQgd2l0aCBzdWNjZXNzKSIgInBpZG9mIHBpZG9mID4gL2Rldi9udWxsOyBlY2hvIFwkPyIgXAorCSIwXG4iICIiICIiCisjIFdlIGNhbiBnZXQgYXdheSB3aXRoIHRoaXMgYmVjYXVzZSBpdCBzYXlzICMhL2Jpbi9zaCB1cCB0b3AuCisKK3Rlc3RpbmcgInBpZG9mIHRoaXMiICJwaWRvZiBwaWRvZi50ZXN0cyB8IGdyZXAgLW8gLXcgJCQiICIkJFxuIiAiIiAiIgorCitvcHRpb25hbCBGRUFUVVJFX1BJRE9GX1NJTkdMRQordGVzdGluZyAicGlkb2YgLXMiICJwaWRvZiAtcyBpbml0IiAiMVxuIiAiIiAiIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9QSURPRl9PTUlUIEZFQVRVUkVfUElET0ZfU0lOR0xFCisjIFRoaXMgdGVzdCBmYWlscyBub3cgYmVjYXVzZSBwcm9jZXNzIG5hbWUgbWF0Y2hpbmcgbG9naWMgaGFzIGNoYW5nZWQsCisjIGJ1dCBuZXcgbG9naWMgaXMgbm90ICJ3cm9uZyIgZWl0aGVyLi4uIHNlZSBmaW5kX3BpZF9ieV9uYW1lLmMgY29tbWVudHMKKyN0ZXN0aW5nICJwaWRvZiAtbyAlUFBJRCIgInBpZG9mIC1vICVQUElEIHBpZG9mLnRlc3RzIHwgZ3JlcCAtbyAtdyAkJCIgIiIgIiIgIiIKK3Rlc3RpbmcgInBpZG9mIC1vICVQUElEIE5PUCIgInBpZG9mIC1vICVQUElEIC1zIGluaXQiICIxXG4iICIiICIiCit0ZXN0aW5nICJwaWRvZiAtbyBpbml0IiAicGlkb2YgLW8gMSBpbml0IHwgZ3JlcCAtbyAtdyAxIiAiIiAiIiAiIgorU0tJUD0KKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcHJpbnRmLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3ByaW50Zi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTNjODc0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3ByaW50Zi50ZXN0cwpAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgTmVlZCB0aGlzIGluIG9yZGVyIHRvIG5vdCBleGVjdXRlIHNoZWxsIGJ1aWx0aW4KK2JiPSJidXN5Ym94ICIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJwcmludGYgcHJvZHVjZXMgbm8gZnVydGhlciBvdXRwdXQgMSIgXAorCSIke2JifXByaW50ZiAnXGMnIGZvbyIgXAorCSIiIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgcHJvZHVjZXMgbm8gZnVydGhlciBvdXRwdXQgMiIgXAorCSIke2JifXByaW50ZiAnJXNcYycgZm9vIGJhciIgXAorCSJmb28iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgcmVwZWF0ZWRseSB1c2VzIHBhdHRlcm4gZm9yIGVhY2ggYXJndiIgXAorCSIke2JifXByaW50ZiAnJXNcbicgZm9vIFwkSE9NRSIgXAorCSJmb29cbiRIT01FXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJWIgZXNjYXBlZF9zdHJpbmciIFwKKwkiJHtiYn1wcmludGYgJyViJyAnYVx0YicgJ2NcXGRcbicgMj4mMTsgZWNobyBcJD8iIFwKKwkiYVx0YmNcXGRcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICVkICdcIngnIFwiJ3lcIiBcIid6VEFJTFwiIiBcCisJIiR7YmJ9cHJpbnRmICclZFxuJyAnXCJ4JyBcIid5XCIgXCInelRBSUxcIiAyPiYxOyBlY2hvIFwkPyIgXAorCSIxMjBcbiIiMTIxXG4iIjEyMlxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJXMgJ1wieCcgXCIneVwiIFwiJ3pUQUlMXCIiIFwKKwkiJHtiYn1wcmludGYgJyVzXG4nICdcIngnIFwiJ3lcIiBcIid6VEFJTFwiIDI+JjE7IGVjaG8gXCQ/IiBcCisJIlwieFxuIiIneVxuIiInelRBSUxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUyMy4xMmYiIFwKKwkiJHtiYn1wcmludGYgJ3wlMjMuMTJmfFxuJyA1LjI1IDI+JjE7IGVjaG8gXCQ/IiBcCisJInwgICAgICAgICA1LjI1MDAwMDAwMDAwMHxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUqLipmIiBcCisJIiR7YmJ9cHJpbnRmICd8JSouKmZ8XG4nIDIzIDEyIDUuMjUgMj4mMTsgZWNobyBcJD8iIFwKKwkifCAgICAgICAgIDUuMjUwMDAwMDAwMDAwfFxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJSpmIHdpdGggbmVnYXRpdmUgd2lkdGgiIFwKKwkiJHtiYn1wcmludGYgJ3wlKmZ8XG4nIC0yMyA1LjI1IDI+JjE7IGVjaG8gXCQ/IiBcCisJInw1LjI1MDAwMCAgICAgICAgICAgICAgIHxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUuKmYgd2l0aCBuZWdhdGl2ZSBwcmVjaXNpb24iIFwKKwkiJHtiYn1wcmludGYgJ3wlLipmfFxuJyAtMTIgNS4yNSAyPiYxOyBlY2hvIFwkPyIgXAorCSJ8NS4yNTAwMDB8XG4iIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiB1bmRlcnN0YW5kcyAlKi4qZiB3aXRoIG5lZ2F0aXZlIHdpZHRoL3ByZWNpc2lvbiIgXAorCSIke2JifXByaW50ZiAnfCUqLipmfFxuJyAtMjMgLTEyIDUuMjUgMj4mMTsgZWNobyBcJD8iIFwKKwkifDUuMjUwMDAwICAgICAgICAgICAgICAgfFxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJXpkIiBcCisJIiR7YmJ9cHJpbnRmICclemRcbicgLTUgMj4mMTsgZWNobyBcJD8iIFwKKwkiLTVcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICVsZCIgXAorCSIke2JifXByaW50ZiAnJWxkXG4nIC01IDI+JjE7IGVjaG8gXCQ/IiBcCisJIi01XG4iIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiB1bmRlcnN0YW5kcyAlTGQiIFwKKwkiJHtiYn1wcmludGYgJyVMZFxuJyAtNSAyPiYxOyBlY2hvIFwkPyIgXAorCSItNVxuIiIwXG4iIFwKKwkiIiAiIgorCisjICJGSVhFRCIgbm93IHRvIGFjdCBjb21wYXRpYmx5CisjIyBXZSBhcmUgIm1vcmUgY29ycmVjdCIgaGVyZSB0aGFuIGJhc2gvY29yZXV0aWxzOiB0aGV5IGhhcHBpbHkgcHJpbnQgLTIKKyMjIGFzIGlmIGl0IGlzIGEgaHVnZSB1bnNpZ25lZCBudW1iZXIKKyN0ZXN0aW5nICJwcmludGYgaGFuZGxlcyAldSAtTiIgXAorIwkiJHtiYn1wcmludGYgJyV1XG4nIDEgLTIgMyAyPiYxOyBlY2hvIFwkPyIgXAorIwkiMVxuIiJwcmludGY6IC0yOiBpbnZhbGlkIG51bWJlclxuIiIwXG4iIjNcbiIiMFxuIiBcCisjCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiBoYW5kbGVzICVkIGJhZF9pbnB1dCIgXAorCSIke2JifXByaW50ZiAnJWRcbicgMSAtIDIgYmFkIDMgMTIzYmFkIDQgMj4mMTsgZWNobyBcJD8iIFwKKyIxXG4iInByaW50ZjogaW52YWxpZCBudW1iZXIgJy0nXG4iIjBcbiJcCisiMlxuIiJwcmludGY6IGludmFsaWQgbnVtYmVyICdiYWQnXG4iIjBcbiJcCisiM1xuIiJwcmludGY6IGludmFsaWQgbnVtYmVyICcxMjNiYWQnXG4iIjBcbiJcCisiNFxuIiIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgYWJvcnRzIG9uIGJhcmUgJSIgXAorCSIke2JifXByaW50ZiAnJScgYSBiIGMgMj4mMTsgZWNobyBcJD8iIFwKKwkicHJpbnRmOiAlOiBpbnZhbGlkIGZvcm1hdFxuIiIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgYWJvcnRzIG9uICVyIiBcCisJIiR7YmJ9cHJpbnRmICclcicgYSBiIGMgMj4mMTsgZWNobyBcJD8iIFwKKwkicHJpbnRmOiAlcjogaW52YWxpZCBmb3JtYXRcbiIiMVxuIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcHdkL3B3ZC1wcmludHMtd29ya2luZy1kaXJlY3RvcnkgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcHdkL3B3ZC1wcmludHMtd29ya2luZy1kaXJlY3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3NTM0NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9wd2QvcHdkLXByaW50cy13b3JraW5nLWRpcmVjdG9yeQpAQCAtMCwwICsxIEBACit0ZXN0ICQocHdkKSA9ICQoYnVzeWJveCBwd2QpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcmVhZGxpbmsudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcmVhZGxpbmsudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdmYzhhZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9yZWFkbGluay50ZXN0cwpAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKworIyBSZWFkbGluayB0ZXN0cy4KKyMgQ29weXJpZ2h0IDIwMDYgYnkgTmF0YW5hZWwgQ29wYSA8bkB0YW5hZWwub3JnPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCitURVNURElSPXJlYWRsaW5rX3Rlc3RkaXIKK1RFU1RGSUxFPSIkVEVTVERJUi90ZXN0ZmlsZSIKK1RFU1RMSU5LPSJ0ZXN0bGluayIKK0ZBSUxMSU5LPSIkVEVTVERJUi8kVEVTVERJUi90ZXN0bGluayIKKworIyBjcmVhdGUgdGhlIGRpciBhbmQgdGVzdCBmaWxlcworbWtkaXIgLXAgIi4vJFRFU1RESVIiCit0b3VjaCAiLi8kVEVTVEZJTEUiCitsbiAtcyAiLi8kVEVTVEZJTEUiICIuLyRURVNUTElOSyIKKwordGVzdGluZyAicmVhZGxpbmsgb24gYSBmaWxlIiAicmVhZGxpbmsgLi8kVEVTVEZJTEUiICIiICIiICIiCit0ZXN0aW5nICJyZWFkbGluayBvbiBhIGxpbmsiICJyZWFkbGluayAuLyRURVNUTElOSyIgIi4vJFRFU1RGSUxFXG4iICIiICIiCisKK29wdGlvbmFsIEZFQVRVUkVfUkVBRExJTktfRk9MTE9XCisKK3Rlc3RpbmcgInJlYWRsaW5rIC1mIG9uIGEgZmlsZSIgInJlYWRsaW5rIC1mIC4vJFRFU1RGSUxFIiAiJFBXRC8kVEVTVEZJTEVcbiIgIiIgIiIKK3Rlc3RpbmcgInJlYWRsaW5rIC1mIG9uIGEgbGluayIgInJlYWRsaW5rIC1mIC4vJFRFU1RMSU5LIiAiJFBXRC8kVEVTVEZJTEVcbiIgIiIgIiIKK3Rlc3RpbmcgInJlYWRsaW5rIC1mIG9uIGFuIGludmFsaWQgbGluayIgInJlYWRsaW5rIC1mIC4vJEZBSUxMSU5LIiAiIiAiIiAiIgordGVzdGluZyAicmVhZGxpbmsgLWYgb24gYSB3aWVyZCBkaXIiICJyZWFkbGluayAtZiAkVEVTVERJUi8uLi8kVEVTVEZJTEUiICIkUFdELyRURVNURklMRVxuIiAiIiAiIgorCisKKyMgY2xlYW4gdXAKK3JtIC1yICIkVEVTVExJTksiICIkVEVTVERJUiIKKworZXhpdCAkKChGQUlMQ09VTlQgPD0gMjU1ID8gRkFJTENPVU5UIDogMjU1KSkKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ybS9ybS1yZW1vdmVzLWZpbGUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcm0vcm0tcmVtb3Zlcy1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTcxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcm0vcm0tcmVtb3Zlcy1maWxlCkBAIC0wLDAgKzEsMyBAQAordG91Y2ggZm9vCitidXN5Ym94IHJtIGZvbwordGVzdCAhIC1mIGZvbwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3JtZGlyL3JtZGlyLXJlbW92ZXMtcGFyZW50LWRpcmVjdG9yaWVzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3JtZGlyL3JtZGlyLXJlbW92ZXMtcGFyZW50LWRpcmVjdG9yaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMmY1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvcm1kaXIvcm1kaXItcmVtb3Zlcy1wYXJlbnQtZGlyZWN0b3JpZXMKQEAgLTAsMCArMSwzIEBACitta2RpciAtcCBmb28vYmFyCitidXN5Ym94IHJtZGlyIC1wIGZvby9iYXIKK3Rlc3QgISAtZCBmb28KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ydW50ZXN0IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3J1bnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTE1NzVkOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9ydW50ZXN0CkBAIC0wLDAgKzEsMTcxIEBACisjIS9iaW4vc2gKKyMgVXNhZ2U6CisjIHJ1bnRlc3QgW2FwcGxldDFdIFthcHBsZXQyLi4uXQorCisuIC4vdGVzdGluZy5zaAorCit0b3RhbF9mYWlsZWQ9MAorCisjIFJ1biBvbmUgb2xkLXN0eWxlIHRlc3QuCisjIFRlc3RzIGFyZSBzdG9yZWQgaW4gYXBwbGV0L3Rlc3RjYXNlIHNoZWxsIHNjcmlwdHMuCisjIFRoZXkgYXJlIHJ1biB1c2luZyAic2ggLXggLWUgYXBwbGV0L3Rlc3RjYXNlIi4KKyMgT3B0aW9uIC1lIHdpbGwgbWFrZSB0ZXN0Y2FzZSBzdG9wIG9uIHRoZSBmaXJzdCBmYWlsZWQgY29tbWFuZC4KK3J1bl9hcHBsZXRfdGVzdGNhc2UoKQoreworCWxvY2FsIGFwcGxldD0iJDEiCisJbG9jYWwgdGVzdGNhc2U9IiQyIgorCisJbG9jYWwgc3RhdHVzPTAKKwlsb2NhbCB1Y19hcHBsZXQ9JChlY2hvICIkYXBwbGV0IiB8IHRyIGEteiBBLVopCisJbG9jYWwgdGVzdG5hbWU9IiR0ZXN0Y2FzZSIKKworCXRlc3RuYW1lPSIke3Rlc3RuYW1lIyMqL30iICMgdGFrZSBiYXNlbmFtZQorCWlmIGdyZXAgIl4jIENPTkZJR18kdWNfYXBwbGV0IGlzIG5vdCBzZXQkIiAiJGJpbmRpci8uY29uZmlnIiA+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gIlVOVEVTVEVEOiAkdGVzdG5hbWUiCisJCXJldHVybiAwCisJZmkKKworCWlmIGdyZXAgIl4jIEZFQVRVUkU6ICIgIiR0ZXN0Y2FzZSIgPi9kZXYvbnVsbDsgdGhlbgorCQlsb2NhbCBmZWF0dXJlPSQoc2VkIC1uZSAncy9eIyBGRUFUVVJFOiAvL3AnICIkdGVzdGNhc2UiKQorCisJCWZvciBmIGluICRmZWF0dXJlOyBkbworCQkJaWYgZ3JlcCAiXiMgJGYgaXMgbm90IHNldCQiICIkYmluZGlyLy5jb25maWciID4vZGV2L251bGw7IHRoZW4KKwkJCQllY2hvICJVTlRFU1RFRDogJHRlc3RuYW1lIgorCQkJCXJldHVybiAwCisJCQlmaQorCQlkb25lCisJZmkKKworCXJtIC1yZiAiLnRtcGRpci4kYXBwbGV0IgorCW1rZGlyIC1wICIudG1wZGlyLiRhcHBsZXQiCisJY2QgIi50bXBkaXIuJGFwcGxldCIgfHwgcmV0dXJuIDEKKworIwllY2hvICJSdW5uaW5nIHRlc3RjYXNlICR0ZXN0Y2FzZSIKKwlkPSIkdHNkaXIiIFwKKwkJc2ggLXggLWUgIiR0ZXN0Y2FzZSIgPiIkdGVzdG5hbWUuc3Rkb3V0LnR4dCIgMj4mMSB8fCBzdGF0dXM9JD8KKwlpZiBbICRzdGF0dXMgLW5lIDAgXTsgdGhlbgorCQllY2hvICJGQUlMOiAkdGVzdG5hbWUiCisJCWlmIFsgeCIkVkVSQk9TRSIgIT0geCBdOyB0aGVuCisJCQljYXQgIiR0ZXN0bmFtZS5zdGRvdXQudHh0IgorCQlmaQorCWVsc2UKKwkJZWNobyAiUEFTUzogJHRlc3RuYW1lIgorCWZpCisKKwljZCAuLgorCXJtIC1yZiAiLnRtcGRpci4kYXBwbGV0IgorCisJcmV0dXJuICRzdGF0dXMKK30KKworIyBSdW4gYWxsIG9sZC1zdHlsZSB0ZXN0cyBmb3IgZ2l2ZW4gYXBwbGV0CitydW5fb2xkc3R5bGVfYXBwbGV0X3Rlc3RzKCkKK3sKKwlsb2NhbCBhcHBsZXQ9IiQxIgorCWxvY2FsIHN0YXR1cz0wCisKKwlmb3IgdGVzdGNhc2UgaW4gIiR0c2Rpci8kYXBwbGV0Ii8qOyBkbworCQkjIHN3aXRjaCBvbiBiYXNlbmFtZSBvZiAkdGVzdGNhc2UKKwkJY2FzZSAiJHt0ZXN0Y2FzZSMjKi99IiBpbgorCQkJLiopICAgICBjb250aW51ZSA7OyAgICAjIC5zdm4sIC5naXQgZXRjCisJCQkqfikgICAgIGNvbnRpbnVlIDs7ICAgICMgYmFja3VwIGZpbGVzCisJCQkiQ1ZTIikgIGNvbnRpbnVlIDs7CisJCQlcIyopICAgIGNvbnRpbnVlIDs7ICAgICMgQ1ZTIG1lcmdlIHJlc2lkdWVzCisJCQkqLm1pbmUpIGNvbnRpbnVlIDs7ICAgICMgc3ZuLXByb2R1Y2VkIGp1bmsKKwkJCSouclswLTldKikgY29udGludWUgOzsgIyBzdm4tcHJvZHVjZWQganVuaworCQllc2FjCisJCXJ1bl9hcHBsZXRfdGVzdGNhc2UgIiRhcHBsZXQiICIkdGVzdGNhc2UiIHx8IHsKKwkJCXN0YXR1cz0xCisJCQl0b3RhbF9mYWlsZWQ9JCgodG90YWxfZmFpbGVkICsgMSkpCisJCX0KKwlkb25lCisJcmV0dXJuICRzdGF0dXMKK30KKworCisKK2xjd2Q9JChwd2QpCitbIHgiJHRzZGlyIiAhPSB4IiIgXSB8fCB0c2Rpcj0iJGxjd2QiCitbIHgiJGJpbmRpciIgIT0geCIiIF0gfHwgYmluZGlyPSIke2xjd2QlLyp9IiAjIG9uZSBkaXJlY3RvcnkgdXAgZnJvbSAkbGN3ZAorUEFUSD0iJGJpbmRpcjokUEFUSCIKK2V4cG9ydCBiaW5kaXIgICAjIHNvbWUgdGVzdHMgbmVlZCB0byBsb29rIGF0ICRiaW5kaXIvLmNvbmZpZworCitpZiBbIHgiJFZFUkJPU0UiID0geCBdOyB0aGVuCisJZXhwb3J0IFZFUkJPU0U9CitmaQorCitpZiBbIHgiJDEiID0geCItdiIgXTsgdGhlbgorCWV4cG9ydCBWRVJCT1NFPTEKKwlzaGlmdAorZmkKKworaW1wbGVtZW50ZWQ9JCgKKwlwcmludGYgImJ1c3lib3ggIiAjIGFsd2F5cyBpbXBsZW1lbnRlZAorCSIkYmluZGlyL2J1c3lib3giIDI+JjEgfAorCXdoaWxlIHJlYWQgbGluZTsgZG8KKwkJaWYgWyB4IiRsaW5lIiA9IHgiQ3VycmVudGx5IGRlZmluZWQgZnVuY3Rpb25zOiIgXTsgdGhlbgorCQkJeGFyZ3MgfCBzZWQgJ3MvLC8vZycKKwkJCWJyZWFrCisJCWZpCisJZG9uZQorCSkKKworYXBwbGV0cz0iJGltcGxlbWVudGVkIgoraWYgWyAkIyAtbmUgMCBdOyB0aGVuCisJYXBwbGV0cz0iJEAiCitmaQorCisjIFBvcHVsYXRlIGEgZGlyZWN0b3J5IHdpdGggbGlua3MgdG8gYWxsIGJ1c3lib3ggYXBwbGV0cworCitMSU5LU0RJUj0iJGJpbmRpci9ydW50ZXN0LXRlbXBkaXItbGlua3MiCisKKyMgQ29tbWVudCB0aGlzIGxpbmUgb3V0IGlmIHlvdSBoYXZlIHB1dCBhIGRpZmZlcmVudCBiaW5hcnkgaW4gJExJTktTRElSCisjIChzYXksIGEgInN0YW5kYXJkIiB0b29sJ3MgYmluYXJ5KSBpbiBvcmRlciB0byBydW4gdGVzdHMgYWdhaW5zdCBpdDoKK3JtIC1yZiAiJExJTktTRElSIiAyPi9kZXYvbnVsbAorCitta2RpciAiJExJTktTRElSIiAyPi9kZXYvbnVsbAorZm9yIGkgaW4gJGltcGxlbWVudGVkOyBkbworCSMgTm90ZTogaWYgJExJTktTRElSL2FwcGxldCBleGlzdHMsIHdlIGRvIG5vdCBvdmVyd3JpdGUgaXQuCisJIyBVc2VmdWwgaWYgb25lIHdhbnRzIHRvIHJ1biB0ZXN0cyBhZ2FpbnN0IGEgc3RhbmRhcmQgdXRpbGl0eSwKKwkjIG5vdCBhbiBhcHBsZXQuCisJbG4gLXMgIiRiaW5kaXIvYnVzeWJveCIgIiRMSU5LU0RJUi8kaSIgMj4vZGV2L251bGwKK2RvbmUKKworIyBTZXQgdXAgb3B0aW9uIGZsYWdzIHNvIHRlc3RzIGNhbiBiZSBzZWxlY3RpdmUuCitleHBvcnQgT1BUSU9ORkxBR1M9OiQoCisJc2VkIC1uciAncy9eQ09ORklHXy8vcCcgIiRiaW5kaXIvLmNvbmZpZyIgfAorCXNlZCAncy89LiovLycgfCB4YXJncyB8IHNlZCAncy8gLzovZycKKwkpOgorCitzdGF0dXM9MAorZm9yIGFwcGxldCBpbiAkYXBwbGV0czsgZG8KKwkjIEFueSBvbGQtc3R5bGUgdGVzdHMgZm9yIHRoaXMgYXBwbGV0PworCWlmIFsgLWQgIiR0c2Rpci8kYXBwbGV0IiBdOyB0aGVuCisJCXJ1bl9vbGRzdHlsZV9hcHBsZXRfdGVzdHMgIiRhcHBsZXQiIHx8IHN0YXR1cz0xCisJZmkKKworCSMgSXMgdGhpcyBhIG5ldy1zdHlsZSB0ZXN0PworCWlmIFsgLWYgIiRhcHBsZXQudGVzdHMiIF07IHRoZW4KKwkJaWYgWyAhIC1lICIkTElOS1NESVIvJGFwcGxldCIgXTsgdGhlbgorCQkJIyAoYXZvaWRpbmcgYmFzaCdpc20gIiR7YXBwbGV0OjA6NH0iKQorCQkJaWYgISBlY2hvICIkYXBwbGV0IiB8IGdyZXAgIl5hbGxfIiA+L2Rldi9udWxsOyB0aGVuCisJCQkJZWNobyAiU0tJUFBFRDogJGFwcGxldCAobm90IGJ1aWx0KSIKKwkJCQljb250aW51ZQorCQkJZmkKKwkJZmkKKyMJCWVjaG8gIlJ1bm5pbmcgdGVzdCAkdHNkaXIvJGFwcGxldC50ZXN0cyIKKwkJUEFUSD0iJExJTktTRElSOiR0c2RpcjokYmluZGlyOiRQQVRIIiBcCisJCQkiJHRzZGlyLyRhcHBsZXQudGVzdHMiCisJCXJjPSQ/CisJCXRvdGFsX2ZhaWxlZD0kKCh0b3RhbF9mYWlsZWQgKyByYykpCisJCXRlc3QgJHJjIC1uZSAwICYmIHN0YXR1cz0xCisJZmkKK2RvbmUKKworIyBMZWF2aW5nIHRoZSBkaXIgbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIHJ1biBmYWlsZWQgdGVzdCBieSBoYW5kCisjcm0gLXJmICIkTElOS1NESVIiCisKK2lmIFsgJHN0YXR1cyAtbmUgMCBdICYmIFsgeCIkVkVSQk9TRSIgPSB4IF07IHRoZW4KKwllY2hvICIkdG90YWxfZmFpbGVkIGZhaWx1cmUocykgZGV0ZWN0ZWQ7IHJ1bm5pbmcgd2l0aCAtdiAodmVyYm9zZSkgd2lsbCBnaXZlIG1vcmUgaW5mbyIKK2ZpCitleGl0ICRzdGF0dXMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9yeC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9yeC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zN2ZhMDJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3J4LnRlc3RzCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOSBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKKyMgU2ltcGxlIG9uZS1ibG9jayBmaWxlIHRyYW5zZmVyCisjIHJ4ID0+ICdDJworIyByeCA8PSBTT0ggPGJsb2Nrbm8+IDwyNTUtYmxvY2tubz4gPDEyOCBieXRlIHBhZGRlZCB3aXRoIHgxQT4gPGNyYz4gPGNyYz4KKyMgcnggPT4gQUNLCisjIHJ4IDw9IEVPVAorIyByeCA9PiBBQ0sKK3Rlc3RpbmcgInJ4IiBcCisJInJ4IHJ4Lk9VVEZJTEUgfCBoZXhkdW1wIC12QyAmJiBjYXQgcnguT1VURklMRSIgXAorIlwKKzAwMDAwMDAwICA0MyAwNiAwNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxDLi58XG5cCiswMDAwMDAwM1xuXAorPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/IiBcCisJIiIgIlwwMVwwMVwwMzc2XAorPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/XAorXHgxQVx4MUFceDFBXHgxQVx4MUFceDRCXHhCMFwwNCIKKworcm0gLWYgcnguT1VURklMRSAyPi9kZXYvbnVsbAorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9zZWQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvc2VkLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhMTYzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvc2VkLnRlc3RzCkBAIC0wLDAgKzEsMzAwIEBACisjIS9iaW4vc2gKKworIyBTVVN2MyBjb21wbGlhbnQgc2VkIHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZHMiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBDb3JuZXIgY2FzZXMKK3Rlc3RpbmcgInNlZCBubyBmaWxlcyAoc3RkaW4pIiAnc2VkICIiJyAiaGVsbG9cbiIgIiIgImhlbGxvXG4iCit0ZXN0aW5nICJzZWQgZXhwbGljaXQgc3RkaW4iICdzZWQgIiIgLScgImhlbGxvXG4iICIiICJoZWxsb1xuIgordGVzdGluZyAic2VkIGhhbmRsZXMgZW1wdHkgbGluZXMiICJzZWQgLWUgJ3MvXCQvQC8nIiAiQFxuIiAiIiAiXG4iCit0ZXN0aW5nICJzZWQgc3RkaW4gdHdpY2UiICdzZWQgIiIgLSAtJyAiaGVsbG8iICIiICJoZWxsbyIKKworIyBUcmFpbGluZyBFT0YuCisjCU1hdGNoICQsIGF0IGVuZCBvZiBlYWNoIGZpbGUgb3IgYWxsIGZpbGVzPworCisjIC1lIGNvcm5lciBjYXNlcworIwl3aXRob3V0IC1lCisjCW11bHRpcGxlIC1lCisjCQlpbnRlcmFjdCB3aXRoIGEKKyMJLWVlZSBhcmcxIGFyZzIgYXJnMworIyAtZiBjb3JuZXIgY2FzZXMKKyMJLWUgLWYgLWUKKyMgLW4gY29ybmVyIGNhc2VzCisjCW5vIG5ld2xpbmUgYXQgRU9GPworIyAtciBjb3JuZXIgY2FzZXMKKyMJSnVzdCBtYWtlIHN1cmUgaXQgd29ya3MuCisjIC1pIGNvcm5lciBjYXNlczoKKyMJc2VkIC1pIC0KKyMJcGVybWlzc2lvbnMKKyMJLWkgb24gYSBzeW1saW5rCisjCW9uIGEgZGlyZWN0b3J5CisjICAgICAgIFdpdGggJCBsYXN0LWxpbmUgdGVzdAorIyBDb250aW51ZSB3aXRoIFwKKyMgICAgICAgRW5kIG9mIHNjcmlwdCB3aXRoIHRyYWlsaW5nIFwKKworIyBjb21tYW5kIGxpc3QKK3Rlc3RpbmcgInNlZCBhY2NlcHRzIGJsYW5rcyBiZWZvcmUgY29tbWFuZCIgInNlZCAtZSAnMSBkJyIgIiIgIiIgIiIKK3Rlc3RpbmcgInNlZCBhY2NlcHRzIG5ld2xpbmVzIGluIC1lIiAic2VkIC1lICdpXAorMQorYVwKKzMnIiAiMVxuMlxuM1xuIiAiIiAiMlxuIgordGVzdGluZyAic2VkIGFjY2VwdHMgbXVsdGlwbGUgLWUiICJzZWQgLWUgJ2lcJyAtZSAnMScgLWUgJ2FcJyAtZSAnMyciIFwKKwkiMVxuMlxuM1xuIiAiIiAiMlxuIgorCisjIHN1YnN0aXR1dGlvbnMKK3Rlc3RpbmcgInNlZCAtbiIgInNlZCAtbiAtZSBzL2Zvby9iYXIvIC1lIHMvYmFyL2Jhei8iICIiICIiICJmb29cbiIKK3Rlc3RpbmcgInNlZCBzLy9wIiAic2VkIC1lIHMvZm9vL2Jhci9wIC1lIHMvYmFyL2Jhei9wIiAiYmFyXG5iYXpcbmJhelxuIiBcCisJIiIgImZvb1xuIgordGVzdGluZyAic2VkIC1uIHMvL3AiICJzZWQgLW5lIHMvYWJjL2RlZi9wIiAiZGVmXG4iICIiICJhYmNcbiIKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7Cit0ZXN0aW5nICJzZWQgcy8vZyAoZXhoYXVzdGl2ZSkiICJzZWQgLWUgJ3MvW1s6c3BhY2U6XV0qLywvZyciICIsMSwyLDMsNCw1LFxuIiBcCisJIiIgIjEyMzQ1XG4iCit9Cit0ZXN0aW5nICJzZWQgcyBhcmJpdHJhcnkgZGVsaW1pdGVyIiAic2VkIC1lICdzIHdvbyBib2luZyAnIiAiYm9pbmdcbiIgIiIgIndvb1xuIgordGVzdGluZyAic2VkIHMgY2hhaW5zIiAic2VkIC1lIHMvZm9vL2Jhci8gLWUgcy9iYXIvYmF6LyIgImJhelxuIiAiIiAiZm9vXG4iCit0ZXN0aW5nICJzZWQgcyBjaGFpbnMyIiAic2VkIC1lIHMvZm9vL2Jhci8gLWUgcy9iYXovbmVlLyIgImJhclxuIiAiIiAiZm9vXG4iCit0ZXN0aW5nICJzZWQgcyBbZGVsaW1pdGVyXSIgInNlZCAtZSAnc0BbQF1AQCciICJvbmV0d28iICIiICJvbmVAdHdvIgordGVzdGluZyAic2VkIHMgd2l0aCBcXHQgKEdOVSBleHQpIiAic2VkICdzL1x0LyAvJyIgIm9uZSB0d28iICIiICJvbmVcdHR3byIKKworIyBicmFuY2gKK3Rlc3RpbmcgInNlZCBiIChicmFuY2gpIiAic2VkIC1lICdiIG9uZTtwOzogb25lJyIgImZvb1xuIiAiIiAiZm9vXG4iCit0ZXN0aW5nICJzZWQgYiAoYnJhbmNoIHdpdGggbm8gbGFiZWwganVtcHMgdG8gZW5kKSIgInNlZCAtZSAnYjtwJyIgXAorCSJmb29cbiIgIiIgImZvb1xuIgorCisjIHRlc3QgYW5kIGJyYW5jaAordGVzdGluZyAic2VkIHQgKHRlc3QvYnJhbmNoKSIgInNlZCAtZSAncy9hLzEvO3Qgb25lO3A7OiBvbmU7cCciIFwKKwkiMVxuMVxuYlxuYlxuYlxuY1xuY1xuY1xuIiAiIiAiYVxuYlxuY1xuIgordGVzdGluZyAic2VkIHQgKHRlc3QvYnJhbmNoIGNsZWFycyB0ZXN0IGJpdCkiICJzZWQgLWUgJ3MvYS9iLzs6bG9vcDt0IGxvb3AnIiBcCisJImJcbmJcbmNcbiIgIiIgImFcbmJcbmNcbiIKK3Rlc3RpbmcgInNlZCBUICghdGVzdC9icmFuY2gpIiAic2VkIC1lICdzL2EvMS87VCBub3RvbmU7cDs6IG5vdG9uZTtwJyIgXAorCSIxXG4xXG4xXG5iXG5iXG5jXG5jXG4iICIiICJhXG5iXG5jXG4iCisKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7CisjIE5vcm1hbCBzZWQgZW5kLW9mLXNjcmlwdCBkb2Vzbid0IHByaW50ICJjIiBiZWNhdXNlIG4gZmx1c2hlZCB0aGUgcGF0dGVybgorIyBzcGFjZS4gIElmIG4gaGl0cyBFT0YsIHBhdHRlcm4gc3BhY2UgaXMgZW1wdHkgd2hlbiBzY3JpcHQgZW5kcy4KKyMgUXVlcnk6IGhvdyBkb2VzIHRoaXMgaW50ZXJhY3Qgd2l0aCBubyBuZXdsaW5lIGF0IEVPRj8KK3Rlc3RpbmcgInNlZCBuIChmbHVzaGVzIHBhdHRlcm4gc3BhY2UsIHRlcm1pbmF0ZXMgZWFybHkpIiAic2VkIC1lICduO3AnIiBcCisJImFcbmJcbmJcbmNcbiIgIiIgImFcbmJcbmNcbiIKK30KKyMgbm9uLUdOVSBzZWQ6IE4gZG9lcyBfbm90XyBmbHVzaCBwYXR0ZXJuIHNwYWNlLCB0aGVyZWZvcmUgYyBpcyBlYXRlbiBAIHNjcmlwdCBlbmQKKyMgR05VIHNlZDogTiBmbHVzaGVzIHBhdHRlcm4gc3BhY2UsIHRoZXJlZm9yZSBjIGlzIHByaW50ZWQgdG9vIEAgc2NyaXB0IGVuZAordGVzdGluZyAic2VkIE4gKGZsdXNoZXMgcGF0dGVybiBzcGFjZSAoR05VIGJlaGF2aW9yKSkiICJzZWQgLWUgJ047cCciIFwKKwkiYVxuYlxuYVxuYlxuY1xuIiAiIiAiYVxuYlxuY1xuIgorCit0ZXN0aW5nICJzZWQgTiB0ZXN0MiIgInNlZCAnOmE7TjtzL1xuLyAvO3RhJyIgXAorCSJhIGIgY1xuIiAiIiAiYVxuYlxuY1xuIgorCit0ZXN0aW5nICJzZWQgTiB0ZXN0MyIgInNlZCAnTjtzL1xuLyAvJyIgXAorCSJhIGJcbmNcbiIgIiIgImFcbmJcbmNcbiIKKwordGVzdGluZyAic2VkIGFkZHJlc3MgbWF0Y2ggbmV3bGluZSIgJ3NlZCAiL2IvTjsvYlxcbmMvaSB3b28iJyBcCisJImFcbndvb1xuYlxuY1xuZFxuIiAiIiAiYVxuYlxuY1xuZFxuIgorCisjIE11bHRpcGxlIGxpbmVzIGluIHBhdHRlcm4gc3BhY2UKK3Rlc3RpbmcgInNlZCBOIChzdG9wcyBhdCBlbmQgb2YgaW5wdXQpIGFuZCBQIChwcmludHMgdG8gZmlyc3QgbmV3bGluZSBvbmx5KSIgXAorCSJzZWQgLW4gJ047UDtwJyIgImFcbmFcbmJcbiIgIiIgImFcbmJcbmNcbiIKKworIyBIb2xkIHNwYWNlCit0ZXN0aW5nICJzZWQgRyAoYXBwZW5kIGhvbGQgc3BhY2UgdG8gcGF0dGVybiBzcGFjZSkiICdzZWQgRycgImFcblxuYlxuXG5jXG5cbiIgXAorCSIiICJhXG5iXG5jXG4iCisjdGVzdGluZyAic2VkIGcvRyAoc3dhcC9hcHBlbmQgaG9sZCBhbmQgcGF0dGVyIHNwYWNlKSIKKyN0ZXN0aW5nICJzZWQgZyAoc3dhcCBob2xkL3BhdHRlcm4gc3BhY2UpIgorCit0ZXN0aW5nICJzZWQgZCBlbmRzIHNjcmlwdCBpdGVyYXRpb24iIFwKKwkic2VkIC1lICcvb29rL2Q7cy9vb2svcGluZy9wO2kgd29vdCciICIiICIiICJvb2tcbiIKK3Rlc3RpbmcgInNlZCBkIGVuZHMgc2NyaXB0IGl0ZXJhdGlvbiAoMikiIFwKKwkic2VkIC1lICcvb29rL2Q7YVwnIC1lICdiYW5nJyIgIndvb3RcbmJhbmdcbiIgIiIgIm9va1xud29vdFxuIgorCisjIE11bHRpcGxlIGZpbGVzLCB3aXRoIHZhcnlpbmcgbmV3bGluZXMgYW5kIE5VTCBieXRlcwordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIHsKK3Rlc3RpbmcgInNlZCBlbWJlZGRlZCBOVUwiICJzZWQgLWUgJ3Mvd29vL2JhbmcvJyIgIlwwYmFuZ1wwd29vXDAiICIiIFwKKwkiXDB3b29cMHdvb1wwIgorfQordGVzdGluZyAic2VkIGVtYmVkZGVkIE5VTCBnIiAic2VkIC1lICdzL3dvby9iYW5nL2cnIiAiYmFuZ1wwYmFuZ1wwIiAiIiBcCisJIndvb1wwd29vXDAiCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgeworJEVDSE8gLWUgIi93b28vYSBoZVwwbGxvIiA+IHNlZC5jb21tYW5kcwordGVzdGluZyAic2VkIE5VTCBpbiBjb21tYW5kIiAic2VkIC1mIHNlZC5jb21tYW5kcyIgIndvb1xuaGVcMGxsb1xuIiAiIiAid29vIgorcm0gc2VkLmNvbW1hbmRzCit9CisKKyMgc2VkIGhhcyBmdW5reSBiZWhhdmlvciB3aXRoIG5ld2xpbmVzIGF0IHRoZSBlbmQgb2YgZmlsZS4gIFRlc3QgbG90cyBvZgorIyBjb3JuZXIgY2FzZXMgd2l0aCB0aGUgb3B0aW9uYWwgbmV3bGluZSBhcHBlbmRpbmcgYmVoYXZpb3IuCisKK3Rlc3RpbmcgInNlZCBub3JtYWwgbmV3bGluZXMiICJzZWQgLWUgJ3Mvd29vL2JhbmcvJyBpbnB1dCAtIiAiYmFuZ1xuYmFuZ1xuIiBcCisJIndvb1xuIiAid29vXG4iCit0ZXN0aW5nICJzZWQgbGVhdmUgb2ZmIHRyYWlsaW5nIG5ld2xpbmUiICJzZWQgLWUgJ3Mvd29vL2JhbmcvJyBpbnB1dCAtIiBcCisJImJhbmdcbmJhbmciICJ3b29cbiIgIndvbyIKK3Rlc3RpbmcgInNlZCBhdXRvaW5zZXJ0IG5ld2xpbmUiICJzZWQgLWUgJ3Mvd29vL2JhbmcvJyBpbnB1dCAtIiAiYmFuZ1xuYmFuZyIgXAorCSJ3b28iICJ3b28iCit0ZXN0aW5nICJzZWQgZW1wdHkgZmlsZSBwbHVzIGNhdCIgInNlZCAtZSAncy9ub2hpdC8vJyBpbnB1dCAtIiAib25lXG50d28iIFwKKwkiIiAib25lXG50d28iCit0ZXN0aW5nICJzZWQgY2F0IHBsdXMgZW1wdHkgZmlsZSIgInNlZCAtZSAncy9ub2hpdC8vJyBpbnB1dCAtIiAib25lXG50d28iIFwKKwkib25lXG50d28iICIiCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgewordGVzdGluZyAic2VkIGFwcGVuZCBhdXRvaW5zZXJ0cyBuZXdsaW5lIiAic2VkIC1lICcvd29vdC9hIHdvbycgLSIgXAorCSJ3b290XG53b29cbiIgIiIgIndvb3QiCit9Cit0ZXN0aW5nICJzZWQgaW5zZXJ0IGRvZXNuJ3QgYXV0b2luc2VydCBuZXdsaW5lIiAic2VkIC1lICcvd29vdC9pIHdvbycgLSIgXAorCSJ3b29cbndvb3QiICIiICJ3b290IgordGVzdGluZyAic2VkIHByaW50IGF1dG9pbnNlcnQgbmV3bGluZXMiICJzZWQgLWUgJ3AnIC0iICJvbmVcbm9uZSIgIiIgIm9uZSIKK3Rlc3RpbmcgInNlZCBwcmludCBhdXRvaW5zZXJ0IG5ld2xpbmVzIHR3byBmaWxlcyIgInNlZCAtZSAncCcgaW5wdXQgLSIgXAorCSJvbmVcbm9uZVxudHdvXG50d28iICJvbmUiICJ0d28iCit0ZXN0aW5nICJzZWQgbm9wcmludCwgbm8gbWF0Y2gsIG5vIG5ld2xpbmUiICJzZWQgLW5lICdzL3dvby9iYW5nLycgaW5wdXQiIFwKKwkiIiAibm9cbiIgIiIKK3Rlc3RpbmcgInNlZCBzZWxlY3RpdmUgbWF0Y2hlcyB3aXRoIG9uZSBubCIgInNlZCAtbmUgJ3Mvd29vL2JhbmcvcCcgaW5wdXQgLSIgXAorCSJhIGJhbmdcbmMgYmFuZ1xuIiAiYSB3b29cbmIgbm8iICJjIHdvb1xuZCBubyIKK3Rlc3RpbmcgInNlZCBzZWxlY3RpdmUgbWF0Y2hlcyBpbnNlcnQgbmV3bGluZSIgXAorCSJzZWQgLW5lICdzL3dvby9iYW5nL3AnIGlucHV0IC0iICJhIGJhbmdcbmIgYmFuZ1xuZCBiYW5nIiBcCisJImEgd29vXG5iIHdvbyIgImMgbm9cbmQgd29vIgordGVzdGluZyAic2VkIHNlbGVjdGl2ZSBtYXRjaGVzIG5vaW5zZXJ0IG5ld2xpbmUiIFwKKwkic2VkIC1uZSAncy93b28vYmFuZy9wJyBpbnB1dCAtIiAiYSBiYW5nXG5iIGJhbmciICJhIHdvb1xuYiB3b28iIFwKKwkiYyBub1xuZCBubyIKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7Cit0ZXN0aW5nICJzZWQgY2x1c3Rlcm5ld2xpbmUiIFwKKwkic2VkIC1lICcvb25lL2EgMTExJyAtZSAnL3R3by9pIDIyMicgLWUgcCBpbnB1dCAtIiBcCisJIm9uZVxub25lXG4xMTFcbjIyMlxudHdvXG50d28iICJvbmUiICJ0d28iCit9Cit0ZXN0aW5nICJzZWQgc3Vic3Qrd3JpdGUiIFwKKwkic2VkIC1lICdzL2kvei8nIC1lICd3b3V0cHV0dycgaW5wdXQgLTsgJEVDSE8gLW4gWDsgY2F0IG91dHB1dHciIFwKKwkidGh6bmd5XG5hZ2F6blh0aHpuZ3lcbmFnYXpuIiAidGhpbmd5IiAiYWdhaW4iCitybSBvdXRwdXR3Cit0ZXN0aW5nICJzZWQgdHJhaWxpbmcgTlVMIiBcCisJInNlZCAncy9pL3ovJyBpbnB1dCAtIiBcCisJImFcMGJcMFxuYyIgImFcMGJcMCIgImMiCit0ZXN0aW5nICJzZWQgZXNjYXBlZCBuZXdsaW5lIGluIGNvbW1hbmQiIFwKKwkic2VkICdzL2EvelxcCit6LycgaW5wdXQiIFwKKwkielxueiIgImEiICIiCisKKyMgVGVzdCBlbmQtb2YtZmlsZSBtYXRjaGluZyBiZWhhdmlvcgorCit0ZXN0aW5nICJzZWQgbWF0Y2ggRU9GIiAic2VkIC1lICciJyRwJyInIiAiaGVsbG9cbnRoZXJlXG50aGVyZSIgIiIgXAorCSJoZWxsb1xudGhlcmUiCit0ZXN0aW5nICJzZWQgbWF0Y2ggRU9GIHR3byBmaWxlcyIgInNlZCAtZSAnIickcCciJyBpbnB1dCAtIiBcCisJIm9uZVxudHdvXG50aHJlZVxuZm91clxuZm91ciIgIm9uZVxudHdvIiAidGhyZWVcbmZvdXIiCisjIHNlZCBtYXRjaCBFT0YgaW5saW5lOiBnbnUgc2VkIDQuMS41IG91dHB1dHMgdGhpczoKKyMwMDAwMDAwMCAgNmYgNmUgNjUgMGEgNmYgNmYgNmIgMGEgIDZmIDZmIDZiIDBhIDc0IDc3IDZmIDBhICB8b25lLm9vay5vb2sudHdvLnwKKyMwMDAwMDAxMCAgMGEgNzQgNjggNzIgNjUgNjUgMGEgNmYgIDZmIDZiIDBhIDZmIDZmIDZiIDBhIDY2ICB8LnRocmVlLm9vay5vb2suZnwKKyMwMDAwMDAyMCAgNmYgNzUgNzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8b3VyfAorIyB3aGljaCBsb29rcyBidWdneSB0byBtZS4KKyRFQ0hPIC1uZSAidGhyZWVcbmZvdXIiID4gaW5wdXQyCit0ZXN0aW5nICJzZWQgbWF0Y2ggRU9GIGlubGluZSIgXAorCSJzZWQgLWUgJyInJGkgb29rJyInIC1pIGlucHV0IGlucHV0MiAmJiBjYXQgaW5wdXQgaW5wdXQyIiBcCisJIm9uZVxub29rXG50d290aHJlZVxub29rXG5mb3VyIiAib25lXG50d28iICIiCitybSBpbnB1dDIKKworIyBUZXN0IGxpZS10by1hdXRvY29uZgorCit0ZXN0aW5nICJzZWQgbGllLXRvLWF1dG9jb25mIiAic2VkIC0tdmVyc2lvbiB8IGdyZXAgLW8gJ0dOVSBzZWQgdmVyc2lvbiAnIiBcCisJIkdOVSBzZWQgdmVyc2lvbiBcbiIgIiIgIiIKKworIyBKdW1wIHRvIG5vbmV4aXN0ZW50IGxhYmVsCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgeworIyBJbmNvbXBhdGliaWxpdHk6IGlsbGVnYWwganVtcCBpcyBub3QgZGV0ZWN0ZWQgaWYgaW5wdXQgaXMgIiIKKyMgKHRoYXQgaXMsIG5vIGxpbmVzIGF0IGFsbCkuIEdOVSBzZWQgNC4xLjUgY29tcGxhaW5zIGV2ZW4gaW4gdGhpcyBjYXNlCit0ZXN0aW5nICJzZWQgbm9uZXhpc3RlbnQgbGFiZWwiICJzZWQgLWUgJ2Igd2FscnVzJyAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK30KKwordGVzdGluZyAic2VkIGJhY2tyZWYgZnJvbSBlbXB0eSBzIHVzZXMgcmFuZ2UgcmVnZXgiIFwKKwkic2VkIC1lICcvd29vdC9zLy9lZXAgXDAgZWVwLyciICJlZXAgd29vdCBlZXAiICIiICJ3b290IgorCit0ZXN0aW5nICJzZWQgYmFja3JlZiBmcm9tIGVtcHR5IHMgdXNlcyByYW5nZSByZWdleCB3aXRoIG5ld2xpbmUiIFwKKwkic2VkIC1lICcvd29vdC9zLy9lZXAgXDAgZWVwLyciICJlZXAgd29vdCBlZXBcbiIgIiIgIndvb3RcbiIKKworIyAtaSB3aXRoIG5vIGZpbGVuYW1lCisKK3RvdWNoIC4vLSAgIyBEZXRlY3QgZ251IGZhaWx1cmUgbW9kZSBoZXJlLgordGVzdGluZyAic2VkIC1pIHdpdGggbm8gYXJnIFtHTlVGQUlMXSIgInNlZCAtZSAnJyAtaSAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCitybSAuLy0gICAgICMgQ2xlYW4gdXAKKwordGVzdGluZyAic2VkIHMveHh4L1svIiAic2VkIC1lICdzL3h4eC9bLyciICJbXG4iICIiICJ4eHhcbiIKKworIyBQb25kZXIgdGhpcyBhIGJpdCBtb3JlLCB3aHkgIndvbyBub3QgZm91bmQiIGZyb20gZ251IHZlcnNpb24/CisjdGVzdGluZyAic2VkIGRvZXNuJ3Qgc3Vic3RpdHV0ZSBpbiBkZWxldGVkIGxpbmUiIFwKKyMJInNlZCAtZSAnL29vay9kO3Mvb29rLy87dCB3b287YSBiYW5nOyciICJiYW5nIiAiIiAib29rXG4iCisKKyMgVGhpcyBtYWtlcyBib3RoIHNlZHMgdmVyeSB1bmhhcHB5LiAgV2h5PworI3Rlc3RpbmcgInNlZCAtZyAoZXhoYXVzdGl2ZSkiICJzZWQgLWUgJ3MvW1s6c3BhY2U6XV0qLywvZyciICIsMSwyLDMsNCw1LCIgXAorIwkiIiAiMTIzNDUiCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kcyIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJzZWQgbiBjb21tYW5kIG11c3QgcmVzZXQgJ3N1YnN0aXR1dGVkJyBiaXQiIFwKKwkic2VkICdzLzEveC87VDtuOzogbmV4dDtzLzMveS87dCBxdWl0O247YiBuZXh0OzogcXVpdDtxJyIgXAorCSIwXG54XG4yXG55XG4iICIiICIwXG4xXG4yXG4zXG4iCisKK3Rlc3RpbmcgInNlZCBkIGRvZXMgbm90IGJyZWFrIG4sbSBtYXRjaGluZyIgXAorCSJzZWQgLW4gJzFkOzEsM3AnIiBcCisJInNlY29uZFxudGhpcmRcbiIgIiIgImZpcnN0XG5zZWNvbmRcbnRoaXJkXG5mb3VydGhcbiIKKwordGVzdGluZyAic2VkIGQgZG9lcyBub3QgYnJlYWsgbixyZWdleCBtYXRjaGluZyIgXAorCSJzZWQgLW4gJzFkOzEsL2hpci9wJyIgXAorCSJzZWNvbmRcbnRoaXJkXG4iICIiICJmaXJzdFxuc2Vjb25kXG50aGlyZFxuZm91cnRoXG4iCisKK3Rlc3RpbmcgInNlZCBkIGRvZXMgbm90IGJyZWFrIG4scmVnZXggbWF0Y2hpbmcgIzIiIFwKKwkic2VkIC1uICcxLDVkOzEsL2hpci9wJyIgXAorCSJzZWNvbmQyXG50aGlyZDJcbiIgIiIgXAorCSJmaXJzdFxuc2Vjb25kXG50aGlyZFxuZm91cnRoXG4iImZpcnN0Mlxuc2Vjb25kMlxudGhpcmQyXG5mb3VydGgyXG4iCisKK3Rlc3RpbmcgInNlZCAyZDsyLDFwIChnbnUgY29tcGF0KSIgXAorCSJzZWQgLW4gJzJkOzIsMXAnIiBcCisJInRoaXJkXG4iICIiIFwKKwkiZmlyc3RcbnNlY29uZFxudGhpcmRcbmZvdXJ0aFxuIgorCisjIFJlZ2V4IG1lYW5zOiAibWF0Y2ggLyBhdCBCT0wgb3Igbm90aGluZywgdGhlbiBvbmUgb3IgbW9yZSBub3Qtc2xhc2hlcyIuCisjIFRoZSBidWcgd2FzIHRoYXQgc2Vjb25kIHNsYXNoIGluIC91c3IvbGliIHdhcyB0cmVhdGVkIGFzICJhdCBCT0wiIHRvby4KK3Rlc3RpbmcgInNlZCBiZWdpbm5pbmcgKF4pIG1hdGNoZXMgb25seSBvbmNlIiBcCisJInNlZCAncyxcKF4vXHxcKVteL11bXi9dKiw+XDA8LGcnIiBcCisJIj4vdXNyPC8+bGliPFxuIiAiIiBcCisJIi91c3IvbGliXG4iCisKK3Rlc3RpbmcgInNlZCBjIiBcCisJInNlZCAnY3JlcGwnIiBcCisJInJlcGxcbnJlcGxcbiIgIiIgXAorCSJmaXJzdFxuc2Vjb25kXG4iCisKK3Rlc3RpbmcgInNlZCBuZXN0ZWQge31zIiBcCisJInNlZCAnL2FzZC8geyBwOyAvcy8geyBzL3MvYy8gfTsgcDsgcSB9JyIgXAorCSJxd2VcbmFzZFxuYWNkXG5hY2RcbiIgIiIgXAorCSJxd2VcbmFzZFxuenhjXG4iCisKK3Rlc3RpbmcgInNlZCBhIGNtZCBlbmRlZCBieSBkb3VibGUgYmFja3NsYXNoIiBcCisJInNlZCAtZSAnL3wgb25lIC9hIFxcCisJfCB0aHJlZSBcXFxcJyAtZSAnL3wgb25lLS9hIFxcCisJfCB0aHJlZS0qIFxcXFwnIiBcCisnCXwgb25lIFxcCisJfCB0aHJlZSBcXAorCXwgdHdvIFxcCisnICcnIFwKKycJfCBvbmUgXFwKKwl8IHR3byBcXAorJworCisjIGZpcnN0IHRocmVlIGxpbmVzIGFyZSBkZWxldGVkOyA0dGggbGluZSBpcyBtYXRjaGVkIGFuZCBwcmludGVkIGJ5ICIyLDMiIGFuZCBieSAiNCIgcmFuZ2VzCit0ZXN0aW5nICJzZWQgd2l0aCBOIHNraXBwaW5nIGxpbmVzIHBhc3QgcmFuZ2VzIG9uIG5leHQgY21kcyIgXAorCSJzZWQgLW4gJzF7TjtOO2R9OzFwOzIsM3A7M3A7NHAnIiBcCisJIjRcbjRcbiIgIiIgIjFcbjJcbjNcbjRcbiIKKwordGVzdGluZyAic2VkIC1pIHdpdGggYWRkcmVzcyBtb2RpZmllcyBhbGwgZmlsZXMsIG5vdCBvbmx5IGZpcnN0IiBcCisJImNwIGlucHV0IGlucHV0Mjsgc2VkIC1pIC1lICcxcy9mb28vYmFyLycgaW5wdXQgaW5wdXQyICYmIGNhdCBpbnB1dCBpbnB1dDI7IHJtIGlucHV0MiIgXAorCSJiYXJcbmJhclxuIiAiZm9vXG4iICIiCisKK3Rlc3RpbmcgInNlZCB1bmRlcnN0YW5kcyBcciIgXAorCSJzZWQgJ3Mvci9cci8nIiBcCisJIlxycnJcbiIgIiIgInJyclxuIgorCit0ZXN0aW5nICJzZWQgLWkgZmluaXNoZXMgcmFuZ2VzIGNvcnJlY3RseSIgXAorCSJzZWQgJzEsMmQnIC1pIGlucHV0OyBlY2hvIFwkPzsgY2F0IGlucHV0IiBcCisJIjBcbjNcbjRcbiIgIjFcbjJcbjNcbjRcbiIgIiIKKworIyB0ZXN0aW5nICJkZXNjcmlwdGlvbiIgImNvbW1hbmRzIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3NlcS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9zZXEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWUxMTE2YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9zZXEudGVzdHMKQEAgLTAsMCArMSw0NiBAQAorIyEvYmluL3NoCisKKyMgU1VTdjMgY29tcGxpYW50IHNlcSB0ZXN0cy4KKyMgQ29weXJpZ2h0IDIwMDYgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworIyBBVURJVDogRnVsbCBTVVN2MyBjb3ZlcmFnZSAoZXhjZXB0IGludGVybmF0aW9uYWxpemF0aW9uKS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKKyMgVGVzdCBleGl0IHN0YXR1cworCit0ZXN0aW5nICJzZXEgKGV4aXQgd2l0aCBlcnJvcikiICJzZXEgMj4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgKGV4aXQgd2l0aCBlcnJvcikiICJzZXEgMSAyIDMgNCAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgb25lIGFyZ3VtZW50IiAic2VxIDMiICIxXG4yXG4zXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyIgInNlcSA1IDciICI1XG42XG43XG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyByZXZlcnNlZCIgInNlcSA3IDUiICIiICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCIgInNlcSAzIDMiICIzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCwgYXJiaXRyYXJ5IG5lZ2F0aXZlIHN0ZXAiICJzZXEgMSAtMTUgMSIgXAorCSIxXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCwgYXJiaXRyYXJ5IHBvc2l0aXZlIHN0ZXAiICJzZXEgMSArMTUgMSIgXAorCSIxXG4iICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgdXAgYnkgMiIgInNlcSA0IDIgOCIgIjRcbjZcbjhcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBkb3duIGJ5IDIiICJzZXEgOCAtMiA0IiAiOFxuNlxuNFxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IHdyb25nIHdheSAjMSIgInNlcSA0IC0yIDgiICIiICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgd3Jvbmcgd2F5ICMyIiAic2VxIDggMiA0IiAiIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zIiAic2VxIDMgLjMgNCIgIjMuMFxuMy4zXG4zLjZcbjMuOVxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zMCIgInNlcSAzIC4zMCA0IiAiMy4wMFxuMy4zMFxuMy42MFxuMy45MFxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zMCB0byA0LjAwMCIgInNlcSAzIC4zMCA0LjAwMCIgIjMuMDBcbjMuMzBcbjMuNjBcbjMuOTBcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBieSAtLjkiICJzZXEgLjcgLS45IC0yLjIiICIwLjdcbi0wLjJcbi0xLjFcbi0yLjBcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBieSB6ZXJvIiAic2VxIDQgMCA4IHwgaGVhZCAtbiAxMCIgIjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbiIgIiIgIiIKKwordGVzdGluZyAic2VxIG9uZSBhcmd1bWVudCB3aXRoIHBhZGRpbmciICJzZXEgLXcgMDAzIiAiMDAxXG4wMDJcbjAwM1xuIiAiIiAiIgordGVzdGluZyAic2VxIHR3byBhcmd1bWVudHMgd2l0aCBwYWRkaW5nIiAic2VxIC13IDAwNSA3IiAiMDA1XG4wMDZcbjAwN1xuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGRvd24gYnkgMyB3aXRoIHBhZGRpbmciICJzZXEgLXcgOCAtMyAwNCIgIjA4XG4wNVxuIiAiIiAiIgorIyBMb29rcyBsaWtlIGEgYnVnIGluIGNvcmV1dGlscyA2LjEwOiBpdCB1c2VzIHdpZHRoIG9uZSBsZXNzIHRoYW4gbmVlZGVkCisjIFRoZXNlIHRlc3RzIGNvbnRhaW4gdGhlIGV4cGVjdGVkICJmaXhlZCIgb3V0cHV0Cit0ZXN0aW5nICJzZXEgY291bnQgYnkgLjMgd2l0aCBwYWRkaW5nIDEiICJzZXEgLXcgMDkgLjMgMTEiICIwOS4wXG4wOS4zXG4wOS42XG4wOS45XG4xMC4yXG4xMC41XG4xMC44XG4iICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgYnkgLjMgd2l0aCBwYWRkaW5nIDIiICJzZXEgLXcgMDMgLjMgMDAwNCIgIjAwMDMuMFxuMDAwMy4zXG4wMDAzLjZcbjAwMDMuOVxuIiAiIiAiIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9zaGExc3VtLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3NoYTFzdW0udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTk2OGZhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS9zaGExc3VtLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL3NoCisKKy4gLi9tZDVzdW0udGVzdHMgc2hhMXN1bSBkNDEzMzdlODM0Mzc3MTQwYWU3Zjk4NDYwZDcxZDkwODU5OGVmMDRmCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvc2hhMjU2c3VtLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3NoYTI1NnN1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMmRkNzhmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3NoYTI1NnN1bS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCisuIC4vbWQ1c3VtLnRlc3RzIHNoYTI1NnN1bSA4ZTFkM2VkNTdlYmMxMzBmMGY3MjUwODQ0NjU1OWVlYWUwNjQ1MWFlNmQ2MWIxZThjZTQ2MzcwY2ZiODk2M2MzCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvc2hhNTEyc3VtLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3NoYTUxMnN1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYmM3Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3NoYTUxMnN1bS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCisuIC4vbWQ1c3VtLnRlc3RzIHNoYTUxMnN1bSBmZTQxM2UwZjE3NzMyNGQxMzUzODkzY2EwNzcyY2ViYTgzZmQ0MTUxMmJhNjM4OTVhMGVlYmI3MDNlZjlmZWFjMmZiNGU5MmIyY2I0MzBiM2JkYTQxYjQ2YjBjYjRlYTgzMDcxOTBhNWNjNzk1MTU3Y2ZiNjgwYTljZDYzNWQwZgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3NvcnQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvc29ydC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MWIyODJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3NvcnQudGVzdHMKQEAgLTAsMCArMSwxMzEgQEAKKyMhL2Jpbi9zaAorCisjIFNVU3YzIGNvbXBsaWFudCBzb3J0IHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIFRoZSBiYXNpYyB0ZXN0cy4gIFRoZXNlIHNob3VsZCB3b3JrIGV2ZW4gd2l0aCB0aGUgc21hbGwgYnVzeWJveC4KKwordGVzdGluZyAic29ydCIgInNvcnQgaW5wdXQiICJhXG5iXG5jXG4iICJjXG5hXG5iXG4iICIiCit0ZXN0aW5nICJzb3J0ICMyIiAic29ydCBpbnB1dCIgIjAxMFxuMVxuM1xuIiAiM1xuMVxuMDEwXG4iICIiCit0ZXN0aW5nICJzb3J0IHN0ZGluIiAic29ydCIgImFcbmJcbmNcbiIgIiIgImJcbmFcbmNcbiIKK3Rlc3RpbmcgInNvcnQgbnVtZXJpYyIgInNvcnQgLW4gaW5wdXQiICIxXG4zXG4wMTBcbiIgIjNcbjFcbjAxMFxuIiAiIgordGVzdGluZyAic29ydCByZXZlcnNlIiAic29ydCAtciBpbnB1dCIgIndvb2tcbndhbHJ1c1xucG9pbnRcbnBhYnN0XG5hYXJnaFxuIiBcCisJInBvaW50XG53b29rXG5wYWJzdFxuYWFyZ2hcbndhbHJ1c1xuIiAiIgorCisjIFRoZXNlIHRlc3RzIHJlcXVpcmUgdGhlIGZ1bGwgb3B0aW9uIHNldC4KKworb3B0aW9uYWwgRkVBVFVSRV9TT1JUX0JJRworIyBMb25naXNoIGNodW5rIG9mIGRhdGEgcmUtdXNlZCBieSB0aGUgbmV4dCBmZXcgdGVzdHMKKworZGF0YT0iNDIJMQkzCXdvb3QKKzQyCTEJMDEwCXpvb2xvZ3kKK2VnZwkxCTIJcGFweXJ1cworNwkzCTQyCXNvdXAKKzk5OQkzCTAJYWxnZWJyYQorIgorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZChzKSIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCisjIFNvcnRpbmcgd2l0aCBrZXlzCisKK3Rlc3RpbmcgInNvcnQgb25lIGtleSIgInNvcnQgLWs0LDQgaW5wdXQiIFwKKyI5OTkJMwkwCWFsZ2VicmEKK2VnZwkxCTIJcGFweXJ1cworNwkzCTQyCXNvdXAKKzQyCTEJMwl3b290Cis0MgkxCTAxMAl6b29sb2d5CisiICIkZGF0YSIgIiIKKwordGVzdGluZyAic29ydCBrZXkgcmFuZ2Ugd2l0aCBudW1lcmljIG9wdGlvbiIgInNvcnQgLWsyLDNuIGlucHV0IiBcCisiNDIJMQkwMTAJem9vbG9neQorNDIJMQkzCXdvb3QKK2VnZwkxCTIJcGFweXJ1cworNwkzCTQyCXNvdXAKKzk5OQkzCTAJYWxnZWJyYQorIiAiJGRhdGEiICIiCisKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7CisjIEJ1c3lib3ggaXMgZGVmaW5pdGVseSBkb2luZyB0aGVzZSB3cm9uZy4gIEZJWE1FCit0ZXN0aW5nICJzb3J0IGtleSByYW5nZSB3aXRoIG51bWVyaWMgb3B0aW9uIGFuZCBnbG9iYWwgcmV2ZXJzZSIgXAorInNvcnQgLWsyLDNuIC1yIGlucHV0IiBcCisiZWdnCTEJMglwYXB5cnVzCis0MgkxCTMJd29vdAorNDIJMQkwMTAJem9vbG9neQorOTk5CTMJMAlhbGdlYnJhCis3CTMJNDIJc291cAorIiAiJGRhdGEiICIiCisKK3Rlc3RpbmcgInNvcnQga2V5IHJhbmdlIHdpdGggbXVsdGlwbGUgb3B0aW9ucyIgInNvcnQgLWsyLDNybiBpbnB1dCIgXAorIjcJMwk0Mglzb3VwCis5OTkJMwkwCWFsZ2VicmEKKzQyCTEJMDEwCXpvb2xvZ3kKKzQyCTEJMwl3b290CitlZ2cJMQkyCXBhcHlydXMKKyIgIiRkYXRhIiAiIgorfQorCit0ZXN0aW5nICJzb3J0IGtleSByYW5nZSB3aXRoIHR3byAtayBvcHRpb25zIiAic29ydCAtayAyLDJuIC1rIDEsMXIgaW5wdXQiICJcCitkIDIKK2IgMgorYyAzCisiICJcCitjIDMKK2IgMgorZCAyCisiICIiCisKK3Rlc3RpbmcgInNvcnQgd2l0aCBub24tZGVmYXVsdCBsZWFkaW5nIGRlbGltIDEiICJzb3J0IC1uIC1rMiAtdC8gaW5wdXQiICJcCisvYS8yCisvYi8xCisiICJcCisvYS8yCisvYi8xCisiICIiCisKK3Rlc3RpbmcgInNvcnQgd2l0aCBub24tZGVmYXVsdCBsZWFkaW5nIGRlbGltIDIiICJzb3J0IC1uIC1rMyAtdC8gaW5wdXQiICJcCisvYi8xCisvYS8yCisiICJcCisvYi8xCisvYS8yCisiICIiCisKK3Rlc3RpbmcgInNvcnQgd2l0aCBub24tZGVmYXVsdCBsZWFkaW5nIGRlbGltIDMiICJzb3J0IC1uIC1rMyAtdC8gaW5wdXQiICJcCisvL2EvMgorLy9iLzEKKyIgIlwKKy8vYS8yCisvL2IvMQorIiAiIgorCit0ZXN0aW5nICJzb3J0IC11IHNob3VsZCBjb25zaWRlciBmaWVsZCBvbmx5IHdoZW4gZGlzY2FyZGluZyIgInNvcnQgLXUgLWsyIGlucHV0IiAiXAorYSBjCisiICJcCithIGMKK2IgYworIiAiIgorCit0ZXN0aW5nICJzb3J0IC16IG91dHB1dHMgTlVMIHRlcm1pbmF0ZWQgbGluZXMiICJzb3J0IC16IGlucHV0IiAiXAorb25lXDB0aHJlZVwwdHdvXDBcCisiICJcCitvbmVcMHR3b1wwdGhyZWVcMFwKKyIgIiIKKwordGVzdGluZyAic29ydCBrZXkgZG9lc24ndCBzdHJpcCBsZWFkaW5nIGJsYW5rcywgZGlzYWJsZXMgZmFsbGJhY2sgZ2xvYmFsIHNvcnQiIFwKKyJzb3J0IC1uIC1rMiAtdCAnICciICIgYSBcbiAxIFxuIDIgXG4iICIiICIgMiBcbiAxIFxuIGEgXG4iCisKK3Rlc3RpbmcgInNvcnQgZmlsZSBpbiBwbGFjZSIgXAorInNvcnQgLW8gaW5wdXQgaW5wdXQgJiYgY2F0IGlucHV0IiAiXAorMTExCisyMjIKKyIgIlwKKzIyMgorMTExCisiICIiCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kKHMpIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3N0YXJ0LXN0b3AtZGFlbW9uLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3N0YXJ0LXN0b3AtZGFlbW9uLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwN2FlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvc3RhcnQtc3RvcC1kYWVtb24udGVzdHMKQEAgLTAsMCArMSwxOSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY21kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJzdGFydC1zdG9wLWRhZW1vbiAteCB3aXRob3V0IC1hIiBcCisJJ3N0YXJ0LXN0b3AtZGFlbW9uIC1TIC14IHRydWUgMj4mMTsgZWNobyAkPycgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJzdGFydC1zdG9wLWRhZW1vbiAtYSB3aXRob3V0IC14IiBcCisJJ3N0YXJ0LXN0b3AtZGFlbW9uIC1TIC1hIGZhbHNlIDI+JjE7IGVjaG8gJD8nIFwKKwkiMVxuIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvc3RyaW5ncy9zdHJpbmdzLXdvcmtzLWxpa2UtR05VIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3N0cmluZ3Mvc3RyaW5ncy13b3Jrcy1saWtlLUdOVQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDY0NzEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3N0cmluZ3Mvc3RyaW5ncy13b3Jrcy1saWtlLUdOVQpAQCAtMCwwICsxLDkgQEAKK3JtIC1mIGZvbyBiYXIKK3N0cmluZ3MgLWFmIC4uLy4uL2J1c3lib3ggPiBmb28KK2J1c3lib3ggc3RyaW5ncyAtYWYgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvc3VtLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3N1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOWY0Y2JmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3N1bS50ZXN0cwpAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vc2gKKworIyB1bml0IHRlc3QgZm9yIHN1bS4KKyMgQ29weXJpZ2h0IDIwMDcgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6IFVuaXQgdGVzdHMgZm9yIHN1bQorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjICAgZmlsZSBpbnB1dCB3aWxsIGJlIGZpbGUgY2FsbGVkICJpbnB1dCIKKyMgICB0ZXN0IGNhbiBjcmVhdGUgYSBmaWxlICJhY3R1YWwiIGluc3RlYWQgb2Ygd3JpdGluZyB0byBzdGRvdXQKKwordGVzdGluZyAic3VtIC1yIGZpbGUgZG9lc24ndCBwcmludCBmaWxlJ3MgbmFtZSIgXAorICAgICAgICAic3VtIC1yICQwIHwgZ3JlcCAtYyAkMCAmJiBlY2hvIHdyb25nbHlfcHJpbnRlZF9maWxlbmFtZSB8fCBlY2hvIHllcyIgXAorCSIwXG55ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgInN1bSAtciBmaWxlIGZpbGUgZG9lcyBwcmludCBib3RoIG5hbWVzIiBcCisgICAgICAgICJzdW0gLXIgJDAgJDAgfCBncmVwIC1jICQwICYmIGVjaG8geWVzIHx8IGVjaG8gd3JvbmdseV9vbWl0dGVkX2ZpbGVuYW1lIiBcCisJIjJcbnllc1xuIiAiIiAiIgordGVzdGluZyAic3VtIC1zIGZpbGUgZG9lcyBwcmludCBmaWxlJ3MgbmFtZSIgXAorICAgICAgICAic3VtIC1zICQwIHwgZ3JlcCAtYyAkMCAmJiBlY2hvIHllcyB8fCBlY2hvIHdyb25nbHlfb21pdHRlZF9maWxlbmFtZSIgXAorCSIxXG55ZXNcbiIgIiIgIiIKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RhaWwudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFpbC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMDVhODNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RhaWwudGVzdHMKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDkgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKK3Rlc3RpbmcgInRhaWw6ICtOIHdpdGggTiA+IGZpbGUgbGVuZ3RoIiBcCisJInRhaWwgLWMgKzU1IDI+JjE7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICJxdyIKKwordGVzdGluZyAidGFpbDogLWMgK04gd2l0aCBsYXJnaXNoIE4iIFwKKwkiCisJZGQgaWY9L2Rldi96ZXJvIGJzPTE2ayBjb3VudD0xIDI+L2Rldi9udWxsIHwgdGFpbCAtYyArODIwMCB8IHdjIC1jOworCWRkIGlmPS9kZXYvemVybyBicz0xNmsgY291bnQ9MSAyPi9kZXYvbnVsbCB8IHRhaWwgLWMgKzgyMDggfCB3YyAtYzsKKwkiIFwKKwkiODE4NVxuODE3N1xuIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFpbC90YWlsLW4td29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFpbC90YWlsLW4td29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxMzE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YWlsL3RhaWwtbi13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyRFQ0hPIC1uZSAiYWJjXG5kZWZcbjEyM1xuIiA+aW5wdXQKKyRFQ0hPIC1uZSAiZGVmXG4xMjNcbiIgPmxvZ2ZpbGUub2sKK2J1c3lib3ggdGFpbCAtbiAyIGlucHV0ID4gbG9nZmlsZS5iYgorY21wIGxvZ2ZpbGUub2sgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RhaWwvdGFpbC13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YWlsL3RhaWwtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlY2ExMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YWlsL3RhaWwtd29ya3MKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19JTkNMVURFX1NVU3YyCisKKyRFQ0hPIC1uZSAiYWJjXG5kZWZcbjEyM1xuIiA+aW5wdXQKKyRFQ0hPIC1uZSAiZGVmXG4xMjNcbiIgPmxvZ2ZpbGUub2sKK2J1c3lib3ggdGFpbCAtMiBpbnB1dCA+IGxvZ2ZpbGUuYmIKK2NtcCBsb2dmaWxlLm9rIGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5ZWNlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyLnRlc3RzCkBAIC0wLDAgKzEsMTk1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDkgYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKwordW5zZXQgTEFORwordW5zZXQgTEFOR1VBR0UKK3Vuc2V0IExDX0NPTExBVEUKK3Vuc2V0IExDX0FMTAordW1hc2sgMDIyCisKK3JtIC1yZiB0YXIudGVtcGRpciAyPi9kZXYvbnVsbAorbWtkaXIgdGFyLnRlbXBkaXIgJiYgY2QgdGFyLnRlbXBkaXIgfHwgZXhpdCAxCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAic2NyaXB0IiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgInRhciBoYXJkbGlua3MgYW5kIHJlcGVhdGVkIGZpbGVzIiAnXAorcm0gLXJmIGlucHV0XyogdGVzdC50YXIgMj4vZGV2L251bGwKKz5pbnB1dF9oYXJkMQorbG4gaW5wdXRfaGFyZDEgaW5wdXRfaGFyZDIKK21rZGlyIGlucHV0X2RpcgorPmlucHV0X2Rpci9maWxlCitjaG1vZCAtUiA2NDQgKgorY2htb2QgICAgNzU1IGlucHV0X2RpcgordGFyIGNmIHRlc3QudGFyIGlucHV0IGlucHV0X2Rpci8gaW5wdXRfaGFyZDEgaW5wdXRfaGFyZDIgaW5wdXRfaGFyZDEgaW5wdXRfZGlyLyBpbnB1dAordGFyIHR2ZiB0ZXN0LnRhciB8IHNlZCAicy8uKlswLTldIGlucHV0L2lucHV0LyIKK3RhciB4ZiB0ZXN0LnRhciAyPiYxCitlY2hvIE9rOiAkPworbHMgLWwgLiBpbnB1dF9kaXIvKiB8IGdyZXAgaW5wdXRfIHwgc2VkICJzL1xcKF5bXiBdKlxcKSAuKiBpbnB1dC9cXDEgaW5wdXQvIgorJyAiXAoraW5wdXQKK2lucHV0X2Rpci8KK2lucHV0X2Rpci9maWxlCitpbnB1dF9oYXJkMQoraW5wdXRfaGFyZDIgLT4gaW5wdXRfaGFyZDEKK2lucHV0X2hhcmQxIC0+IGlucHV0X2hhcmQxCitpbnB1dF9kaXIvCitpbnB1dF9kaXIvZmlsZQoraW5wdXQKK09rOiAwCistcnctci0tci0tIGlucHV0X2Rpci9maWxlCitkcnd4ci14ci14IGlucHV0X2RpcgorLXJ3LXItLXItLSBpbnB1dF9oYXJkMQorLXJ3LXItLXItLSBpbnB1dF9oYXJkMgorIiBcCisiIiAiIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9UQVJfQ1JFQVRFIEZFQVRVUkVfTFNfU09SVEZJTEVTCit0ZXN0aW5nICJ0YXIgaGFyZGxpbmtzIG1vZGUiICdcCitybSAtcmYgaW5wdXRfKiB0ZXN0LnRhciAyPi9kZXYvbnVsbAorPmlucHV0X2hhcmQxCitjaG1vZCA3NDEgaW5wdXRfaGFyZDEKK2xuIGlucHV0X2hhcmQxIGlucHV0X2hhcmQyCitta2RpciBpbnB1dF9kaXIKK2xuIGlucHV0X2hhcmQxIGlucHV0X2RpcgorbG4gaW5wdXRfaGFyZDIgaW5wdXRfZGlyCitjaG1vZCA1NTAgaW5wdXRfZGlyCisjIE9uIHNvbWUgZmlsZXN5c3RlbXMsIGlucHV0X2Rpci9pbnB1dF9oYXJkMiBpcyByZXR1cm5lZCBieSByZWFkZGlyCisjIEJFRk9SRSBpbnB1dF9kaXIvaW5wdXRfaGFyZDEhIFRoYXRzIHdoeSB3ZSBjYW50IGp1c3QgInRhciBjZiAuLi4gaW5wdXRfKiI6Cit0YXIgY2YgdGVzdC50YXIgaW5wdXRfZGlyL2lucHV0X2hhcmQqIGlucHV0X2hhcmQqCit0YXIgdHZmIHRlc3QudGFyIHwgc2VkICJzLy4qWzAtOV0gaW5wdXQvaW5wdXQvIgorY2htb2QgNzcwIGlucHV0X2Rpcgorcm0gLXJmIGlucHV0XyoKK3RhciB4ZiB0ZXN0LnRhciAyPiYxCitlY2hvIE9rOiAkPworbHMgLWwgLiBpbnB1dF9kaXIvKiB8IGdyZXAgImlucHV0LipoYXJkIiB8IHNlZCAicy9cXCheW14gXSpcXCkgLiogaW5wdXQvXFwxIGlucHV0LyIKKycgIlwKK2lucHV0X2Rpci9pbnB1dF9oYXJkMQoraW5wdXRfZGlyL2lucHV0X2hhcmQyIC0+IGlucHV0X2Rpci9pbnB1dF9oYXJkMQoraW5wdXRfaGFyZDEgLT4gaW5wdXRfZGlyL2lucHV0X2hhcmQxCitpbnB1dF9oYXJkMiAtPiBpbnB1dF9kaXIvaW5wdXRfaGFyZDEKK09rOiAwCistcnd4ci0tLS14IGlucHV0X2Rpci9pbnB1dF9oYXJkMQorLXJ3eHItLS0teCBpbnB1dF9kaXIvaW5wdXRfaGFyZDIKKy1yd3hyLS0tLXggaW5wdXRfaGFyZDEKKy1yd3hyLS0tLXggaW5wdXRfaGFyZDIKKyIgXAorIiIgIiIKK1NLSVA9CisKK29wdGlvbmFsIEZFQVRVUkVfVEFSX0NSRUFURSBGRUFUVVJFX0xTX1NPUlRGSUxFUwordGVzdGluZyAidGFyIHN5bWxpbmtzIG1vZGUiICdcCitybSAtcmYgaW5wdXRfKiB0ZXN0LnRhciAyPi9kZXYvbnVsbAorPmlucHV0X2ZpbGUKK2NobW9kIDc0MSBpbnB1dF9maWxlCitsbiAtcyBpbnB1dF9maWxlIGlucHV0X3NvZnQKK21rZGlyIGlucHV0X2RpcgorbG4gaW5wdXRfZmlsZSBpbnB1dF9kaXIKK2xuIGlucHV0X3NvZnQgaW5wdXRfZGlyCitjaG1vZCA1NTAgaW5wdXRfZGlyCit0YXIgY2YgdGVzdC50YXIgaW5wdXRfZGlyLyogaW5wdXRfW2ZzXSoKK3RhciB0dmYgdGVzdC50YXIgfCBzZWQgInMvLipbMC05XSBpbnB1dC9pbnB1dC8iIHwgc29ydAorY2htb2QgNzcwIGlucHV0X2Rpcgorcm0gLXJmIGlucHV0XyoKK3RhciB4ZiB0ZXN0LnRhciAyPiYxCitlY2hvIE9rOiAkPworbHMgLWwgLiBpbnB1dF9kaXIvKiB8IGdyZXAgImlucHV0X1tmc10iIHwgc2VkICJzL1xcKF5bXiBdKlxcKSAuKiBpbnB1dC9cXDEgaW5wdXQvIgorJyAiXAoraW5wdXRfZGlyL2lucHV0X2ZpbGUKK2lucHV0X2Rpci9pbnB1dF9zb2Z0IC0+IGlucHV0X2ZpbGUKK2lucHV0X2ZpbGUgLT4gaW5wdXRfZGlyL2lucHV0X2ZpbGUKK2lucHV0X3NvZnQgLT4gaW5wdXRfZGlyL2lucHV0X3NvZnQKK09rOiAwCistcnd4ci0tLS14IGlucHV0X2Rpci9pbnB1dF9maWxlCitscnd4cnd4cnd4IGlucHV0X2ZpbGUKKy1yd3hyLS0tLXggaW5wdXRfZmlsZQorbHJ3eHJ3eHJ3eCBpbnB1dF9maWxlCisiIFwKKyIiICIiCitTS0lQPQorCitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUgRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TCit0ZXN0aW5nICJ0YXIgLS1vdmVyd3JpdGUiICJcCitybSAtcmYgaW5wdXRfKiB0ZXN0LnRhciAyPi9kZXYvbnVsbAorbG4gaW5wdXQgaW5wdXRfaGFyZAordGFyIGNmIHRlc3QudGFyIGlucHV0X2hhcmQKK2VjaG8gV1JPTkcgPmlucHV0CisjIC0tb3ZlcndyaXRlIG9wZW5zICdpbnB1dF9oYXJkJyB3aXRob3V0IHVubGlua2luZywKKyMgdGh1cyAnaW5wdXRfaGFyZCcgc3RpbGwgbGlua2VkIHRvICdpbnB1dCcgYW5kIHdlIHdyaXRlICdPaycgaW50byBpdAordGFyIHhmIHRlc3QudGFyIC0tb3ZlcndyaXRlIDI+JjEgJiYgY2F0IGlucHV0CisiICJcCitPaworIiBcCisiT2tcbiIgIiIKK1NLSVA9CisKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7CisjIE5lZWRzIHRvIGJlIHJ1biB1bmRlciBub24tcm9vdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0CitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUKK3Rlc3RpbmcgInRhciB3cml0aW5nIGludG8gcmVhZC1vbmx5IGRpciIgJ1wKK3JtIC1yZiBpbnB1dF8qIHRlc3QudGFyIDI+L2Rldi9udWxsCitta2RpciBpbnB1dF9kaXIKKz5pbnB1dF9kaXIvaW5wdXRfZmlsZQorY2htb2QgNTUwIGlucHV0X2RpcgordGFyIGNmIHRlc3QudGFyIGlucHV0X2RpcgordGFyIHR2ZiB0ZXN0LnRhciB8IHNlZCAicy8uKlswLTldIGlucHV0L2lucHV0LyIKK2NobW9kIDc3MCBpbnB1dF9kaXIKK3JtIC1yZiBpbnB1dF8qCit0YXIgeGYgdGVzdC50YXIgMj4mMQorZWNobyBPazogJD8KK2xzIC1sIGlucHV0X2Rpci8qIC4gfCBncmVwIGlucHV0XyB8IHNlZCAicy9cXCheW14gXSpcXCkgLiogaW5wdXQvXFwxIGlucHV0LyIKK2NobW9kIDc3MCBpbnB1dF9kaXIKKycgIlwKK2lucHV0X2Rpci8KK2lucHV0X2Rpci9pbnB1dF9maWxlCitPazogMAorLXJ3LXItLXItLSBpbnB1dF9kaXIvaW5wdXRfZmlsZQorZHIteHIteC0tLSBpbnB1dF9kaXIKKyIgXAorIiIgIiIKK1NLSVA9Cit9CisKKyMgSGFkIGEgYnVnIHdoZXJlIG9uIGV4dHJhY3QgYXV0b2RldGVjdCBmaXJzdCAic3dpdGNoZWQgb2ZmIiAtegorIyBhbmQgdGhlbiBmYWlsZWQgdG8gcmVjb2duaXplIC50Z3ogZXh0ZW5zaW9uCitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUgRkVBVFVSRV9TRUFNTEVTU19HWgordGVzdGluZyAidGFyIGV4dHJhY3QgdGd6IiAiXAorZGQgY291bnQ9MSBicz0xTSBpZj0vZGV2L3plcm8gb2Y9RjAgMj4vZGV2L251bGwKK3RhciAtY3pmIEYwLnRneiBGMAorcm0gRjAKK3RhciAteHp2ZiBGMC50Z3ogJiYgZWNobyBPaworcm0gRjAgfHwgZWNobyBCQUQKKyIgIlwKK0YwCitPaworIiBcCisiIiAiIgorU0tJUD0KKworIyBPbiBleHRyYWN0LCBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgbGFzdCAiLi4iIGNvbXBvbmVudCBpcyBzdHJpcHBlZAorb3B0aW9uYWwgRkVBVFVSRV9UQVJfQ1JFQVRFCit0ZXN0aW5nICJ0YXIgc3RyaXBzIC8uLi8gb24gZXh0cmFjdCIgIlwKK3JtIC1yZiBpbnB1dF8qIHRlc3QudGFyIDI+L2Rldi9udWxsCitta2RpciBpbnB1dF9kaXIKK2VjaG8gT2sgPmlucHV0X2Rpci9maWxlCit0YXIgY2YgdGVzdC50YXIgLi8uLi90YXIudGVtcGRpci9pbnB1dF9kaXIvLi4vaW5wdXRfZGlyIDI+JjEKK3JtIC1yZiBpbnB1dF8qIDI+L2Rldi9udWxsCit0YXIgLXZ4ZiB0ZXN0LnRhciAyPiYxCitjYXQgaW5wdXRfZGlyL2ZpbGUgMj4mMQorIiAiXAordGFyOiByZW1vdmluZyBsZWFkaW5nICcuLy4uL3Rhci50ZW1wZGlyL2lucHV0X2Rpci8uLi8nIGZyb20gbWVtYmVyIG5hbWVzCitpbnB1dF9kaXIvCitpbnB1dF9kaXIvZmlsZQorT2sKKyIgXAorIiIgIiIKK1NLSVA9CisKKworY2QgLi4gJiYgcm0gLXJmIHRhci50ZW1wZGlyIHx8IGV4aXQgMQorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWFyY2hpdmVzLW11bHRpcGxlLWZpbGVzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItYXJjaGl2ZXMtbXVsdGlwbGUtZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1ZDllOQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWFyY2hpdmVzLW11bHRpcGxlLWZpbGVzCkBAIC0wLDAgKzEsNiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCit0b3VjaCBmb28gYmFyCitidXN5Ym94IHRhciBjZiBmb28udGFyIGZvbyBiYXIKK3JtIGZvbyBiYXIKK3RhciB4ZiBmb28udGFyCit0ZXN0IC1mIGZvbyAtYSAtZiBiYXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWNvbXBsYWlucy1hYm91dC1taXNzaW5nLWZpbGUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1jb21wbGFpbnMtYWJvdXQtbWlzc2luZy1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZThjYmIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1jb21wbGFpbnMtYWJvdXQtbWlzc2luZy1maWxlCkBAIC0wLDAgKzEsMyBAQAordG91Y2ggZm9vCit0YXIgY2YgZm9vLnRhciBmb28KKyEgYnVzeWJveCB0YXIgeGYgZm9vLnRhciBiYXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWRlbWFuZHMtYXQtbGVhc3Qtb25lLWN0eCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWRlbWFuZHMtYXQtbGVhc3Qtb25lLWN0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU3ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZGVtYW5kcy1hdC1sZWFzdC1vbmUtY3R4CkBAIC0wLDAgKzEgQEAKKyEgYnVzeWJveCB0YXIgdgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZGVtYW5kcy1hdC1tb3N0LW9uZS1jdHggYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1kZW1hbmRzLWF0LW1vc3Qtb25lLWN0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzBkMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZGVtYW5kcy1hdC1tb3N0LW9uZS1jdHgKQEAgLTAsMCArMSBAQAorISBidXN5Ym94IHRhciB0eApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtYWxsLXN1YmRpcnMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy1hbGwtc3ViZGlycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTM1MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtYWxsLXN1YmRpcnMKQEAgLTAsMCArMSwxMiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCitta2RpciAtcCBmb28vezEsMiwzfQorbWtkaXIgLXAgZm9vLzEvezEwLDExfQorbWtkaXIgLXAgZm9vLzEvMTAvezEwMCwxMDEsMTAyfQordGFyIGNmIGZvby50YXIgLUMgZm9vIC4KK3JtIC1yZiBmb28vKgorYnVzeWJveCB0YXIgeGYgZm9vLnRhciAtQyBmb28gLi8xLzEwCitmaW5kIGZvbyB8IHNvcnQgPmxvZ2ZpbGUuYmIKK3JtIC1yZiBmb28vKgordGFyIHhmIGZvby50YXIgLUMgZm9vIC4vMS8xMAorZmluZCBmb28gfCBzb3J0ID5sb2dmaWxlLmdudQorZGlmZiAtdSBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy1maWxlIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTcyZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZmlsZQpAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbwordGFyIGNmIGZvby50YXIgZm9vCitybSBmb28KK2J1c3lib3ggdGFyIHhmIGZvby50YXIKK3Rlc3QgLWYgZm9vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy1mcm9tLXN0YW5kYXJkLWlucHV0IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZnJvbS1zdGFuZGFyZC1pbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBlOWYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZnJvbS1zdGFuZGFyZC1pbnB1dApAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbwordGFyIGNmIGZvby50YXIgZm9vCitybSBmb28KK2NhdCBmb28udGFyIHwgYnVzeWJveCB0YXIgeAordGVzdCAtZiBmb28KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLW11bHRpcGxlLWZpbGVzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtbXVsdGlwbGUtZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5N2Q4MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLW11bHRpcGxlLWZpbGVzCkBAIC0wLDAgKzEsNiBAQAordG91Y2ggZm9vIGJhcgordGFyIGNmIGZvby50YXIgZm9vIGJhcgorcm0gZm9vIGJhcgorYnVzeWJveCB0YXIgLXhmIGZvby50YXIKK3Rlc3QgLWYgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtdG8tc3RhbmRhcmQtb3V0cHV0IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtdG8tc3RhbmRhcmQtb3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDhlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy10by1zdGFuZGFyZC1vdXRwdXQKQEAgLTAsMCArMSwzIEBACitlY2hvIGZvbyA+IGZvbwordGFyIGNmIGZvby50YXIgZm9vCitjYXQgZm9vLnRhciB8IGJ1c3lib3ggdGFyIE94IHwgY21wIGZvbyAtCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWN6LW9wdGlvbnMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWN6LW9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjNjI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtY3otb3B0aW9ucwpAQCAtMCwwICsxLDUgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURQorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWgordG91Y2ggZm9vCitidXN5Ym94IHRhciBjemYgZm9vLnRhci5neiBmb28KK2d6aXAgLWQgZm9vLnRhci5negpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1lbXB0eS1pbmNsdWRlLWFuZC1ub24tZW1wdHktZXhjbHVkZS1saXN0IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1lbXB0eS1pbmNsdWRlLWFuZC1ub24tZW1wdHktZXhjbHVkZS1saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzM2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWVtcHR5LWluY2x1ZGUtYW5kLW5vbi1lbXB0eS1leGNsdWRlLWxpc3QKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9GUk9NCisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEUKK3RvdWNoIGZvbwordGFyIGNmIGZvby50YXIgZm9vCitlY2hvIGZvbyA+Zm9vLmV4Y2x1ZGUKK2J1c3lib3ggdGFyIHhmIGZvby50YXIgLVggZm9vLmV4Y2x1ZGUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtZXhjbHVkZS1hbmQtZXh0cmFjdC1saXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtZXhjbHVkZS1hbmQtZXh0cmFjdC1saXN0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGUwZjBlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1leGNsdWRlLWFuZC1leHRyYWN0LWxpc3RzCkBAIC0wLDAgKzEsOCBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfRlJPTQorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCit0b3VjaCBmb28gYmFyIGJhegordGFyIGNmIGZvby50YXIgZm9vIGJhciBiYXoKK2VjaG8gZm9vID5mb28uZXhjbHVkZQorcm0gZm9vIGJhciBiYXoKK2J1c3lib3ggdGFyIHhmIGZvby50YXIgZm9vIGJhciAtWCBmb28uZXhjbHVkZQordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIgLWEgISAtZiBiYXoKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtbXVsdGlwbGUtWC1vcHRpb25zIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1tdWx0aXBsZS1YLW9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1YjI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtbXVsdGlwbGUtWC1vcHRpb25zCkBAIC0wLDAgKzEsMTAgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0ZST00KKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURQordG91Y2ggZm9vCit0b3VjaCBiYXIKK3RhciBjZiBmb28udGFyIGZvbyBiYXIKK2VjaG8gZm9vID4gZm9vLmV4Y2x1ZGUKK2VjaG8gYmFyID4gYmFyLmV4Y2x1ZGUKK3JtIGZvbyBiYXIKK2J1c3lib3ggdGFyIHhmIGZvby50YXIgLVggZm9vLmV4Y2x1ZGUgLVggYmFyLmV4Y2x1ZGUKK3Rlc3QgISAtZiBmb28gLWEgISAtZiBiYXIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtbmVzdGVkLWV4Y2x1ZGUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLW5lc3RlZC1leGNsdWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDEzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLW5lc3RlZC1leGNsdWRlCkBAIC0wLDAgKzEsOSBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfRlJPTQorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCitta2RpciBmb28KK3RvdWNoIGZvby9iYXIKK3RhciBjZiBmb28udGFyIGZvbworcm0gLXJmIGZvbworZWNobyBmb28vYmFyID5mb29iYXIuZXhjbHVkZQorYnVzeWJveCB0YXIgeGYgZm9vLnRhciBmb28gLVggZm9vYmFyLmV4Y2x1ZGUKK3Rlc3QgLWQgZm9vIC1hICEgLWYgZm9vL2JhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXJfd2l0aF9saW5rX3dpdGhfc2l6ZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfbGlua193aXRoX3NpemUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0Y2Q1NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfbGlua193aXRoX3NpemUKQEAgLTAsMCArMSwzMSBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKworIyBUaGlzIHRhcmJhbGwgY29udGFpbnMgYSBzb2Z0bGluayB3aXRoIHNpemUgZmllbGQgIT0gMC4KKyMgSWYgbm90IGlnbm9yZWQsIGl0IG1ha2VzIGhleHQgaGVhZGVyIHRvIGJlIHNraXBwZWQKKyMgYW5kIGRhdGEgdG8gYmUgcmVhZCBhcyBhIGhlYWRlci4KKyMgR05VIHRhciAxLjE1LjEgaGFzIGEgYnVnIGhlcmU6IHRmIHdvbid0IHdvcmssIGJ1dCB4ZiB3aWxsLgordGFyMV9iejIoKQoreworICAgICRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzOVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4MTRceDQ0XHhlM1x4ZGRceDAwXHgwMCIKKyAgICAkRUNITyAtbmUgIlx4OWFceGZiXHg5MFx4Y2FceDE4XHgwMFx4YzBceDQwXHgwM1x4ZmZceDgwXHgwOFx4MDBceDdiXHhlM1x4ZmYiCisgICAgJEVDSE8gLW5lICJceDgwXHgwNFx4MDBceDAwXHgwOFx4MzBceDAwXHhkNlx4YjNceDA5XHg0NVx4MTlceDBkXHgwZFx4NDFceDg0IgorICAgICRFQ0hPIC1uZSAiXHgxYVx4NjhceGQwXHg3YVx4OTlceDkwXHg0YVx4MGFceDZkXHg0Y1x4YTNceDIwXHg3YVx4NDFceGEwXHgwMCIKKyAgICAkRUNITyAtbmUgIlx4MDBceDU1XHgyNVx4MzRceDFhXHgzNFx4ZDBceDAwXHg2NFx4NjRceDFhXHgzMlx4M2ZceDc2XHgzY1x4MWMiCisgICAgJEVDSE8gLW5lICJceGQzXHgzY1x4YTBceDg0XHg5Ylx4ODhceDA1XHg3MFx4OTBceGJiXHgxOFx4MjhceDM5XHgyOVx4YjNceDMwIgorICAgICRFQ0hPIC1uZSAiXHhhOFx4MGFceDIxXHg3MFx4MGNceDAxXHgzMlx4M2JceGJlXHhkZVx4ZDdceDEzXHgyZVx4YmRceDJhXHg5YyIKKyAgICAkRUNITyAtbmUgIlx4YThceDQyXHgyYVx4OTFceDE1XHhlMlx4YTFceGNkXHgyNFx4MzdceDljXHg5MVx4YWFceGM3XHgxNFx4ZGIiCisgICAgJEVDSE8gLW5lICJceDRjXHgwOFx4YWFceGFmXHgxMlx4ZWJceDZjXHgzN1x4OTZceGIwXHhhNFx4MjVceDBjXHhiNFx4NGJceGM1IgorICAgICRFQ0hPIC1uZSAiXHg1Mlx4NzBceDNiXHgyNVx4NGNceDBlXHg0Nlx4NjdceDUxXHg1NFx4ODlceDEzXHgxM1x4ZjBceGE4XHhlOSIKKyAgICAkRUNITyAtbmUgIlx4NjhceDRlXHg4Y1x4ODFceGZjXHg3OVx4ZTBceGIwXHhkOFx4NzlceDM0XHg5NFx4NzFceGEyXHgwY1x4YmUiCisgICAgJEVDSE8gLW5lICJceDkzXHg2MVx4ODJceDk1XHgxMFx4ODhceGQxXHhhNlx4NjlceGFhXHgzOFx4OWNceGI2XHhjMlx4YjJceDk0IgorICAgICRFQ0hPIC1uZSAiXHg5MFx4YzNceDgyXHgyOVx4ZThceDhjXHhiOFx4OTVceDgzXHgzMlx4NDBceDYxXHgxMVx4MTFceGQzXHhhYSIKKyAgICAkRUNITyAtbmUgIlx4M2ZceDhiXHhiOVx4MjJceDljXHgyOFx4NDhceDBhXHgyMlx4NzFceGVlXHg4MCIKK30KK3JlczE9IlwKK2xyd3hyd3hyd3ggdXNlci9ncm91cCAgICAgICAgIDAgMjAwOC0wNy0xOSAxNTowMjozNyBmaXJtd2FyZS0zNzIvc291cmNlcy9uYXRpdmUvYmluL2Nocm9vdC1zZXR1cC5zaCAtPiBxZW11LXNldHVwLnNoCistcnd4ci14ci14IHVzZXIvZ3JvdXAgICAgICAgNTEyIDIwMDgtMDctMTkgMTU6MDI6MzcgZmlybXdhcmUtMzcyL3NvdXJjZXMvbmF0aXZlL2Jpbi9xZW11LXNldHVwLnNoIgorCitleHBvcnQgVFo9VVRDLTIKKwordD1gdGFyMV9iejIgfCBidW56aXAyIHwgYnVzeWJveCB0YXIgdHZmIC1gCit0ZXN0IHgiJHJlczEiID0geCIkdCIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfcHJlZml4X2ZpZWxkcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfcHJlZml4X2ZpZWxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFmZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhci90YXJfd2l0aF9wcmVmaXhfZmllbGRzCkBAIC0wLDAgKzEsMjY0IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorIyBGRUFUVVJFOiBDT05GSUdfREVTS1RPUAorCit0YXIxX2J6MigpCit7CisgICAgJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHgxMlx4ZDFceDg2XHgzMFx4MDBceDBjIgorICAgICRFQ0hPIC1uZSAiXHhiOFx4N2ZceDgwXHhmZlx4NTBceDA4XHhhMFx4NWVceGZmXHhmZlx4ZmRceDdmXHhmZlx4ZmZceGVlXHhmZiIKKyAgICAkRUNITyAtbmUgIlx4ZmZceGZmXHhmYVx4MDBceDA4XHg2MFx4MGZceGM1XHgzZVx4ZjRceGRjXHgwMFx4MDBceDU5XHgyNVx4YmQiCisgICAgJEVDSE8gLW5lICJceGI4XHg3YVx4MDJceGI1XHg4Mlx4NzhceDI1XHhiMFx4ODlceDU0XHgxMFx4MTFceDQ0XHg4Ylx4MzZceDM2IgorICAgICRFQ0hPIC1uZSAiXHhjOFx4OTdceDBkXHgzNFx4OWFceDIxXHhhOVx4MzZceGE5XHhlZFx4MzJceDAyXHg4ZFx4YTZceDgxXHg4YSIKKyAgICAkRUNITyAtbmUgIlx4NzlceDEzXHg0ZFx4MWFceDAzXHgxMFx4NjlceGEwXHhkM1x4NDBceDY0XHgwZlx4NDRceDY4XHgzZFx4NDEiCisgICAgJEVDSE8gLW5lICJceDJhXHg3YVx4MjBceDA5XHhhMVx4MzRceDlhXHgwOVx4YTRceGM4XHhmNVx4NGZceDQ2XHhhNlx4ODZceDMyIgorICAgICRFQ0hPIC1uZSAiXHg0Y1x4MDhceDAwXHgwMFx4ZDBceDA2XHg5YVx4MDBceGQzXHhkNFx4MTFceDQ5XHhhN1x4YjVceDIwXHgxYSIKKyAgICAkRUNITyAtbmUgIlx4N2FceDgwXHgwMFx4MDBceDAwXHgwMFx4ZDBceDY4XHgwMFx4MDBceDAwXHgwMFx4MDBceDQ5XHhhOFx4ODkiCisgICAgJEVDSE8gLW5lICJceGE5XHgzMVx4NGZceDIyXHhhN1x4ZWFceDliXHg2MVx4NTNceGY0XHg5M1x4ZjJceGEzXHg0N1x4YTRceGQzIgorICAgICRFQ0hPIC1uZSAiXHg0MVx4ZWFceDA2XHg0MVx4YTBceDBkXHgwMFx4MDBceDAwXHgxZVx4YTBceDcwXHgzNFx4ZDNceDRkXHgwNiIKKyAgICAkRUNITyAtbmUgIlx4ODZceDg2XHg4Nlx4NDZceDgwXHg2NFx4MDFceGExXHhhMFx4MzRceGQxXHg5MFx4MDBceDAzXHgwOVx4ODgiCisgICAgJEVDSE8gLW5lICJceDBkXHgwNFx4ODlceDA4XHgwMFx4ODJceDdhXHg0Y1x4NDJceDY0XHhjOVx4M2RceDFhXHgyOVx4ZTlceGEyIgorICAgICRFQ0hPIC1uZSAiXHgzZFx4NDZceDllXHg0Nlx4OWFceDEzXHgyNlx4OWVceDUzXHgxMFx4MDFceDkxXHhlYVx4NjhceDE5XHhmMCIKKyAgICAkRUNITyAtbmUgIlx4NzNceGYyXHhlMFx4ZDFceDNjXHg4MFx4MDFceGIxXHg0OFx4NDRceDA4XHg5YVx4YmFceGYzXHg5ZVx4ODciCisgICAgJEVDSE8gLW5lICJceGVjXHhjNFx4NGJceDAyXHg5Mlx4ODBceDc1XHgwMFx4NTZceDQyXHg4OFx4MTBceDY4XHhjY1x4MDZceDIyIgorICAgICRFQ0hPIC1uZSAiXHg3Y1x4MmJceGE3XHhjOFx4MjFceDkxXHgxM1x4ZTVceDcyXHhjMFx4ZTZceDBjXHgwM1x4MTBceGYyXHg4OSIKKyAgICAkRUNITyAtbmUgIlx4OWNceDY3XHg2Ylx4YzNceGU2XHhhZVx4OThceDg1XHgwYVx4N2ZceDI1XHgyZVx4M2RceDg0XHg1Ylx4ZWIiCisgICAgJEVDSE8gLW5lICJceGYzXHhmZlx4YjNceDUyXHhmN1x4NmVceGY2XHg5Mlx4ZDZceDMzXHg1Zlx4NGZceGQxXHgzZFx4YjdceGM0IgorICAgICRFQ0hPIC1uZSAiXHgwZFx4NTBceDAyXHg0OVx4MDFceGFmXHhkMFx4NjlceGJiXHhkM1x4ZTlceDYzXHgwYVx4NjhceDM2XHg5MiIKKyAgICAkRUNITyAtbmUgIlx4ZjJceDAzXHgxZFx4ZjJceGUyXHgzNVx4YmNceDczXHhkNFx4NDRceGY2XHhhMFx4ZTBceDMxXHhkN1x4N2QiCisgICAgJEVDSE8gLW5lICJceDU2XHg5Nlx4Y2JceDUyXHhmY1x4NzlceGUwXHhlYlx4ZjdceDM0XHhkOFx4ZGFceDE4XHg3Mlx4MzBceDk0IgorICAgICRFQ0hPIC1uZSAiXHg1M1x4NDVceGY1XHg1NFx4NTZceDZjXHgwYlx4NTBceGEwXHhiY1x4YmRceGNjXHhkOFx4MjFceGFiXHg3YiIKKyAgICAkRUNITyAtbmUgIlx4YThceGE0XHhlNFx4NzhceDI1XHg3M1x4YmZceDRiXHgzMFx4MzhceDcxXHhlOVx4M2NceDE0XHg1ZFx4YTMiCisgICAgJEVDSE8gLW5lICJceDEyXHgwNFx4NmJceDM3XHg5ZFx4ZTVceGNlXHhhNVx4ZDlceGQxXHhhNVx4NjlceDA5XHgwOFx4YzRceDQ4IgorICAgICRFQ0hPIC1uZSAiXHg0Ylx4MzRceDU4XHg4MVx4MTVceDE4XHg4OFx4YWNceDExXHg1MVx4ODhceDM1XHgwZFx4ZDNceDEzXHgxOCIKKyAgICAkRUNITyAtbmUgIlx4NjdceDczXHgyMFx4NWNceDI4XHgwM1x4MjZceGNkXHg2ZFx4MjBceDkwXHhiYVx4YTRceDEyXHhiM1x4MDgiCisgICAgJEVDSE8gLW5lICJceDI3XHg3NFx4NmFceDk5XHhkZlx4YjFceDIwXHgzZFx4ODVceGU3XHg1Zlx4YWJceDBlXHgyZVx4ZGNceDIzIgorICAgICRFQ0hPIC1uZSAiXHg5OVx4ZTFceGVmXHgzNFx4NjhceGNkXHhhOVx4YjBceGJmXHhkYVx4ZWNceDgxXHhkZFx4NjZceGNhXHgyMSIKKyAgICAkRUNITyAtbmUgIlx4MTNceDQ3XHhkN1x4Y2FceDQ4XHhjZlx4ZWJceDI1XHhiYlx4NzlceDZkXHg0MFx4ZDBceGU0XHg2OVx4M2MiCisgICAgJEVDSE8gLW5lICJceDhmXHgwOVx4MWVceDdiXHhhYVx4NGJceDkxXHgzOVx4YWNceGQ2XHhkMlx4MGNceDg1XHgxZFx4ZjdceDcwIgorICAgICRFQ0hPIC1uZSAiXHgxZlx4MWVceDU4XHhiYlx4MjJceDExXHgyOVx4MzlceDE0XHg0ZFx4NThceDgxXHg5Zlx4ZDdceDFlXHgyMiIKKyAgICAkRUNITyAtbmUgIlx4MjFceDkxXHgwYVx4NDBceGQxXHg4N1x4MjlceDk5XHg5M1x4ZjRceGYzXHgyNVx4NDhceGJiXHhiNFx4MjQiCisgICAgJEVDSE8gLW5lICJceDJhXHgxY1x4YTdceDI4XHhjMVx4NjhceDA4XHgyNVx4MDBceGFhXHgzZFx4ZWVceGFlXHhjMVx4ZTFceDRmIgorICAgICRFQ0hPIC1uZSAiXHhlNlx4OWFceDI2XHg2Ylx4Y2ZceGIxXHgzZVx4YjlceDg1XHgwNFx4ZjRceGVmXHhmZlx4N2FceDJmXHgyYSIKKyAgICAkRUNITyAtbmUgIlx4MDRceDA4XHhlMFx4NGNceGI4XHhiZFx4OGJceDgxXHhiZlx4YTJceGJlXHg4Mlx4NTJceDliXHg0MFx4NjMiCisgICAgJEVDSE8gLW5lICJceGU2XHhmM1x4YjNceGU0XHhlNlx4ZTVceDk0XHg0YVx4ZGRceGMzXHgxYlx4YWZceDYxXHhmM1x4YmZceDViIgorICAgICRFQ0hPIC1uZSAiXHg2ZFx4YWFceGFhXHgyN1x4ZThceDUwXHg4ZFx4MjNceDk3XHhhNFx4YmRceGMzXHhkMlx4ZTZceGI1XHg2NiIKKyAgICAkRUNITyAtbmUgIlx4OWFceDFhXHg4ZVx4NDVceDJhXHhlZFx4MGJceDc5XHhiOFx4ODlceDM4XHg0YVx4MDRceDg1XHgwZFx4MWUiCisgICAgJEVDSE8gLW5lICJceDJiXHg3N1x4NTFceDkxXHg1Zlx4OWZceGUwXHgyYVx4NDlceDU2XHhkM1x4YTFceGRlXHhmNlx4ZDdceDg4IgorICAgICRFQ0hPIC1uZSAiXHg1YVx4NjFceGU1XHgwNFx4NTRceGRmXHhhM1x4OTJceGViXHhiZlx4NzVceDM5XHhjZVx4ZmFceGY1XHhkZSIKKyAgICAkRUNITyAtbmUgIlx4MzBceGQ3XHg1Nlx4ZDFceDdkXHgyY1x4ZGZceGRhXHgzZVx4MWNceGM4XHhjMlx4OTNceDYxXHgyMVx4MjAiCisgICAgJEVDSE8gLW5lICJceGIyXHgyMlx4NmRceGJlXHgzOVx4NTJceDY0XHhmNlx4YjNceDkxXHgyMVx4ODZceGRiXHg2N1x4NzJceDhmIgorICAgICRFQ0hPIC1uZSAiXHg0OVx4YWRceGU0XHg5M1x4MzlceDVjXHgzNFx4OGZceDU4XHhkYlx4NThceGQzXHgzY1x4MWVceDRjXHg2YyIKKyAgICAkRUNITyAtbmUgIlx4YmJceDcwXHg2Zlx4NDJceGNmXHg5ZVx4YmZceGIxXHhjYlx4YTlceDhkXHgwNVx4ZTdceGVhXHhlYVx4ZDciCisgICAgJEVDSE8gLW5lICJceDNjXHg2N1x4MzFceDY5XHg0NFx4MzNceGE0XHg5Mlx4OWNceDY1XHhhNFx4ODlceDVhXHhhZVx4Y2ZceGM5IgorICAgICRFQ0hPIC1uZSAiXHg1NVx4NDNceDYyXHg2ZFx4YmZceDA1XHgzY1x4ZDFceDBmXHgwMVx4NGFceGI1XHgxZFx4YmJceDJjXHhmYiIKKyAgICAkRUNITyAtbmUgIlx4YTZceGI3XHhiM1x4YjFceDFkXHg2Nlx4ZDNceGViXHgyMlx4ZDBceGI1XHg1YVx4NGJceGM0XHg0N1x4NDciCisgICAgJEVDSE8gLW5lICJceDVhXHg0OVx4ODVceDE4XHhiY1x4MTVceDM5XHgzYlx4OTJceGVlXHg1MVx4OThceDMzXHgzNFx4NWRceGI1IgorICAgICRFQ0hPIC1uZSAiXHhiYlx4OGJceDk0XHg4Y1x4ZGVceDhlXHgzZlx4M2RceDA5XHg0Zlx4YmFceGQzXHhmNlx4NzlceDc0XHg4ZSIKKyAgICAkRUNITyAtbmUgIlx4ODJceDBkXHg1Nlx4ODVceGEyXHhjN1x4YzZceGE2XHg4OVx4MjlceDI2XHhhM1x4NTNceDVlXHg1Mlx4ZjUiCisgICAgJEVDSE8gLW5lICJceDU2XHg3NFx4OGJceDE3XHg4Mlx4ZWRceDdhXHg4Ylx4NjhceDYxXHhhNVx4YzlceDdjXHhkZVx4OWZceDY4IgorICAgICRFQ0hPIC1uZSAiXHgyN1x4NGRceGVhXHg2NVx4NjhceDZmXHg3ZFx4NWVceDg4XHg3M1x4ODdceDZjXHg5Mlx4ZjJceGE5XHgxNSIKKyAgICAkRUNITyAtbmUgIlx4NGVceGVlXHg0ZFx4NDFceGJiXHg5OFx4NWRceDhhXHhhZlx4Y2JceDExXHg3Ylx4MmFceGNlXHhmNFx4MWUiCisgICAgJEVDSE8gLW5lICJceDNhXHgyOFx4NDhceDE0XHhmZVx4N2ZceDA5XHg0NVx4NDhceGYxXHg1Ylx4YzFceGNiXHhjZFx4OTFceGJhIgorICAgICRFQ0hPIC1uZSAiXHgzYlx4ZTJceDdkXHg1N1x4ODVceDY2XHg2OFx4ZWNceDUxXHg4Mlx4OTdceDg4XHhlYlx4OTRceDNiXHg3OCIKKyAgICAkRUNITyAtbmUgIlx4NmNceGY0XHhmMVx4M2VceDM4XHg4ZFx4MjJceDE2XHhhYlx4M2JceDEzXHhiM1x4MWJceDM5XHg5NFx4MGUiCisgICAgJEVDSE8gLW5lICJceGE4XHgyNlx4YjdceDhkXHhlOVx4N2RceDY2XHgyM1x4NGJceDY1XHgwN1x4YjdceDJiXHhjOVx4OTZceGI2IgorICAgICRFQ0hPIC1uZSAiXHg5OVx4MTJceDIyXHhiY1x4OTBceGRhXHg1MVx4YmNceGZkXHg5N1x4YTVceDdkXHhiY1x4MTJceGE2XHg3MiIKKyAgICAkRUNITyAtbmUgIlx4ZDNceGUzXHg4Y1x4YzdceDU4XHhlMVx4ZjhceDI4XHhmNFx4NDZceDQ5XHgxNFx4ZDBceDlkXHhiNlx4ZWQiCisgICAgJEVDSE8gLW5lICJceGNlXHg5OVx4YzZceGJjXHhlZFx4YTNceGFiXHhhMFx4OGNceDlkXHhjZVx4MWFceDFhXHhjMlx4ZTZceDc3IgorICAgICRFQ0hPIC1uZSAiXHhiYVx4YWVceGJhXHhkNlx4YzlceGIyXHhkMVx4NjVceDI0XHg3Ylx4MGRceGQ0XHhmMlx4YWNceDI4XHhjMyIKKyAgICAkRUNITyAtbmUgIlx4MWNceGJlXHg0YVx4NTRceGUzXHgwZlx4OGRceGFkXHhiMlx4MzdceDllXHgxZlx4ODFceDcyXHgyZFx4YWIiCisgICAgJEVDSE8gLW5lICJceDhmXHhiMVx4Y2RceGY3XHhiNFx4NTFceDJmXHgxZFx4ZjhceGFkXHg3N1x4MTRceDM3XHhkMlx4MWFceDlhIgorICAgICRFQ0hPIC1uZSAiXHhjMFx4ZjJceDQ4XHhjNlx4NGNceDhkXHhkM1x4OGRceGYxXHhkOVx4MmVceDJjXHhkZFx4N2FceDk4XHgzYyIKKyAgICAkRUNITyAtbmUgIlx4MjRceDc2XHhiOVx4OWRceDI3XHhjZFx4NzFceDdkXHg2Y1x4YzdceDFmXHgwYVx4NzRceDhhXHg2ZVx4NTQiCisgICAgJEVDSE8gLW5lICJceGVjXHg1YVx4YTFceDc3XHg2MFx4ODBceGVmXHgwMFx4YTRceDVmXHg5ZVx4OGJceDJmXHgwMlx4NzJceDljIgorICAgICRFQ0hPIC1uZSAiXHg0Nlx4ZDhceDc5XHg5Mlx4NGNceDhmXHg0ZVx4MzdceGVkXHgwY1x4NThceGFiXHg0NFx4ZWVceDFkXHhkMSIKKyAgICAkRUNITyAtbmUgIlx4YTFceGIwXHhhNVx4MWZceGFmXHhiMFx4MzlceDAxXHgyNlx4YjJceDRhXHgyMFx4NjhceDRhXHgxOFx4MjMiCisgICAgJEVDSE8gLW5lICJceGMzXHgwM1x4ODRceDIyXHgxOFx4ZGJceDZkXHg4M1x4NjBceGMxXHgxMlx4MDlceDIxXHg4NFx4MjJceDQ4IgorICAgICRFQ0hPIC1uZSAiXHg3Zlx4MWVceDE3XHhmNVx4YmVceGNlXHg0Y1x4NGZceDlmXHg5Zlx4ZWVceGY0XHhmZVx4ZWZceDlhXHgzNCIKKyAgICAkRUNITyAtbmUgIlx4OTFceDhmXHgzNlx4MWRceGJjXHg3M1x4ZDdceGViXHhjOFx4MmVceDgxXHgyNVx4ZmFceDE4XHg3Nlx4MzUiCisgICAgJEVDSE8gLW5lICJceDFmXHgxNlx4ZGJceDIwXHg0Ylx4NzRceDZkXHg5NFx4NGVceGU1XHgzNlx4ZWRceGY1XHg1ZFx4NTlceGFmIgorICAgICRFQ0hPIC1uZSAiXHg0Nlx4NzBceGVhXHgwM1x4YWNceDUwXHhiYlx4MjZceGFiXHgzOVx4OWFceDRiXHg2Ylx4MDlceDhjXHg2ZCIKKyAgICAkRUNITyAtbmUgIlx4MzRceGNmXHhlZFx4YWFceGY3XHg1Nlx4NDBceGYyXHhhYlx4MDdceGNhXHgyMlx4NzFceDk3XHhjN1x4MzUiCisgICAgJEVDSE8gLW5lICJceGU4XHgwNlx4OTBceDdiXHhlY1x4YzNceDlmXHhhNFx4ZGVceGQ5XHhkYlx4NDNceGYxXHhkNVx4MDZceDU4IgorICAgICRFQ0hPIC1uZSAiXHg3Mlx4OWVceDFmXHgwOFx4YjZceGMyXHgwNVx4MGRceDI1XHhmZVx4N2FceDg1XHhlNVx4MTBceDEyXHg2OCIKKyAgICAkRUNITyAtbmUgIlx4MThceDdlXHg4Y1x4YTBceGZhXHhiNFx4YzRceGM3XHg0ZVx4YTlceGYyXHgxM1x4ZDdceGMyXHg1Mlx4YjUiCisgICAgJEVDSE8gLW5lICJceGUzXHg3Mlx4MzdceDMxXHgxZVx4NGZceDk5XHhmZFx4YWNceDk3XHgwOFx4ODhceDcxXHg4OFx4ZWJceDFhIgorICAgICRFQ0hPIC1uZSAiXHhmOVx4YTFceDEwXHg5Y1x4NDRceDA4XHg1Nlx4NGFceDc3XHhhYVx4MGZceDE5XHg1Zlx4NWZceGIzXHg5NSIKKyAgICAkRUNITyAtbmUgIlx4ZWVceDliXHg5Zlx4NWJceGI1XHhjOVx4MGFceGY0XHgyOFx4MTZceDI1XHgzNFx4NmNceDcyXHhkYVx4OTIiCisgICAgJEVDSE8gLW5lICJceGI0XHgyY1x4YmRceDVlXHhiMVx4ZThceGU1XHgwZlx4NjhceGYzXHg0NFx4OGFceGQ1XHhmYVx4NzNceDVjIgorICAgICRFQ0hPIC1uZSAiXHg4OVx4MmVceDk5XHg3ZFx4ZWRceGUzXHg1Ylx4M2ZceDQ4XHg5N1x4ZWJceGI2XHg3Nlx4NWNceGE1XHg5ZCIKKyAgICAkRUNITyAtbmUgIlx4ZWZceDEyXHgxZVx4NDJceDg5XHg1Mlx4YWRceDI4XHg5MFx4ZTVceDJiXHg4OFx4YTBceDRmXHgxMVx4OTIiCisgICAgJEVDSE8gLW5lICJceGNkXHhjY1x4NjNceDQwXHgxYVx4YzdceDEwXHgwY1x4MmZceGNkXHgwMVx4ZjJceDA3XHgzOFx4YWNceDE0IgorICAgICRFQ0hPIC1uZSAiXHhlNVx4OTBceGMwXHgzMFx4MjFceGUyXHhlM1x4NzJceDBlXHgzZVx4MDRceGM4XHg5ZVx4YTdceDAwXHhkYiIKKyAgICAkRUNITyAtbmUgIlx4OTFceGRkXHg5ZFx4ODBceGE0XHg2OVx4MmFceDQ4XHgzN1x4OTdceGE0XHgyNlx4NWRceGFlXHg4NFx4MWUiCisgICAgJEVDSE8gLW5lICJceDg4XHhmNFx4ODNceDA0XHgyNFx4YzlceDFmXHg5NFx4NjFceDI1XHhmOVx4ODJceGRkXHhlZFx4MmRceDk2IgorICAgICRFQ0hPIC1uZSAiXHhhZFx4MDZceDQ1XHhkZFx4ODhceGQ3XHg1MFx4NDBceDE0XHhkY1x4N2NceGRiXHgwZlx4NTNceDk2XHgyNyIKKyAgICAkRUNITyAtbmUgIlx4Y2JceDY3XHhhY1x4YTZceGMxXHgxNVx4MmZceGMzXHhkYlx4MmNceGNhXHg5NFx4YjNceGYzXHhkMVx4NmEiCisgICAgJEVDSE8gLW5lICJceGJhXHgzNFx4ODNceGQxXHhjY1x4NDBceDNlXHg3Nlx4YTFceDY5XHg3Zlx4NDlceDMzXHhkY1x4YTdceDNjIgorICAgICRFQ0hPIC1uZSAiXHg2YVx4NjdceDE1XHhhYlx4ZGJceDUyXHhhMFx4YjhceGE2XHgxZVx4Y2VceGUzXHhhZlx4ZjRceGEyXHg2MiIKKyAgICAkRUNITyAtbmUgIlx4MzVceDBmXHgwM1x4NDBceDhlXHgyMFx4MTJceDljXHhiNlx4MzRceDcxXHgzYVx4MTVceDVkXHhlNVx4MzQiCisgICAgJEVDSE8gLW5lICJceGE4XHhkNFx4MDVceDk5XHg2Ylx4OWFceGI2XHg0MVx4MGJceDc4XHhjNFx4ZDhceGQ5XHg3YVx4NjVceGRjIgorICAgICRFQ0hPIC1uZSAiXHhkYlx4ZTNceDQyXHhkNVx4NjZceGY5XHhiNFx4ODNceDdlXHhjMFx4ZjRceDAxXHhjNFx4Y2NceDNiXHgwZSIKKyAgICAkRUNITyAtbmUgIlx4MTVceGRjXHgxNVx4YzJceDNlXHgwNFx4MmZceGZjXHg2Ylx4NzJceGViXHhmNlx4YWFceDE2XHgyMFx4ZGUiCisgICAgJEVDSE8gLW5lICJceGQzXHgzYVx4YjFceDEwXHhjNlx4M2NceGU4XHgyYlx4YjhceGVhXHhkYVx4MTlceDZlXHgzNlx4YWFceGE0IgorICAgICRFQ0hPIC1uZSAiXHgyM1x4NmRceGEwXHg0MFx4ZDFceDVhXHgwYlx4N2VceGE0XHhkNVx4MmRceGNiXHhhOVx4MTVceDM1XHhiYSIKKyAgICAkRUNITyAtbmUgIlx4OTNceDkyXHg0NVx4NDFceGIwXHgxYVx4ZDFceDEzXHgzMVx4YjZceDQ0XHg5OFx4NzhceDI4XHgxNVx4ZTQiCisgICAgJEVDSE8gLW5lICJceGFlXHhiYVx4NThceGQxXHg3NVx4MzZceDM0XHgxYVx4ZDhceDI4XHhmMVx4NGFceDRjXHhiY1x4MWJceGE4IgorICAgICRFQ0hPIC1uZSAiXHhmN1x4NTdceDkyXHhiY1x4ZTJceGI1XHhkYVx4YjZceGE2XHgxZFx4ODNceDM3XHg5Nlx4NDNceDIwXHg4NCIKKyAgICAkRUNITyAtbmUgIlx4Y2JceGI2XHhkOVx4M2ZceGViXHhmYVx4YTBceGZlXHg5YVx4N2RceGVlXHg0N1x4OThceGM0XHhlN1x4YzQiCisgICAgJEVDSE8gLW5lICJceGJkXHhjNlx4ZjBceDZkXHhiMlx4MjZceDEwXHgxZVx4NzhceGVmXHhmM1x4MjhceDNlXHgzNVx4ZTZceGU0IgorICAgICRFQ0hPIC1uZSAiXHhlNlx4ZjNceDBmXHgyNlx4MzRceDEzXHg4NVx4ZDBceGNmXHg1NVx4MGZceDhiXHhkN1x4ZTlceGY0XHhkZiIKKyAgICAkRUNITyAtbmUgIlx4NzBceDY4XHhjMFx4YjVceDMwXHgzY1x4YjFceDAxXHhlOFx4MjhceGFlXHg4MFx4MjZceDAxXHg4Ylx4MTUiCisgICAgJEVDSE8gLW5lICJceDBmXHg4MFx4NDhceDE4XHg0Ylx4ZTJceGVkXHg1OVx4OTJceDMxXHhjZlx4ZDJceDhmXHg0Mlx4YmZceGVlIgorICAgICRFQ0hPIC1uZSAiXHhiZFx4MDdceDkxXHgyNFx4YzZceDY2XHg1ZVx4OGNceDlhXHg0OFx4NjNceGU3XHhhY1x4OGFceDFlXHhjNSIKKyAgICAkRUNITyAtbmUgIlx4NjlceDE2XHg4ZFx4YWNceDY3XHhkY1x4NzVceDc1XHg4Mlx4Y2FceDE5XHgyOFx4MzZceDRkXHgxMFx4ZjkiCisgICAgJEVDSE8gLW5lICJceDQxXHhjYlx4MTVceDA1XHg2NFx4YzdceGIwXHhjM1x4NjRceGYzXHg0OFx4NzFceDYwXHhmMlx4YmRceGNjIgorICAgICRFQ0hPIC1uZSAiXHgzN1x4YjFceDM2XHhiY1x4YTdceDJlXHg2Ylx4MjBceDExXHg1MVx4NDJceGUxXHg4YVx4MjlceGFjXHg0NCIKKyAgICAkRUNITyAtbmUgIlx4OGZceDYzXHg1Nlx4MjNceGQ0XHhkNFx4MDdceGI0XHg2MFx4YTRceGI4XHhjZFx4ZWVceDQ5XHhhNVx4NDIiCisgICAgJEVDSE8gLW5lICJceGNjXHg1Mlx4MDBceDZmXHhkY1x4NDRceDIwXHg1N1x4N2RceDM2XHhkN1x4NDhceDFhXHgyMlx4MmNceGQwIgorICAgICRFQ0hPIC1uZSAiXHgxOVx4NDNceDUxXHg1ZVx4MWNceDhjXHg1Zlx4NzBceGMyXHg2Ylx4Y2ZceGVhXHhkNFx4OTdceDYxXHg3MiIKKyAgICAkRUNITyAtbmUgIlx4MzNceGMzXHg5YVx4ZDRceDA2XHhmMVx4OGFceDlhXHhmZVx4MjFceDgzXHgwYlx4ZWFceGYxXHhmYVx4MmMiCisgICAgJEVDSE8gLW5lICJceDUyXHgyM1x4MmNceGI4XHhjMVx4ZTZceGM4XHg5ZFx4OWNceDVmXHg4Zlx4ZjJceDRhXHg4Nlx4NzZceDkyIgorICAgICRFQ0hPIC1uZSAiXHg3OFx4MGZceDdkXHg5ZFx4MDlceDM4XHhjZVx4ZTFceDlhXHhmM1x4NjBceGVkXHg2NVx4MGJceDFhXHg2OCIKKyAgICAkRUNITyAtbmUgIlx4YTZceDUyXHgzOVx4MThceDFlXHg0NVx4ZTNceDVkXHhlMFx4N2RceGZiXHhjNlx4Y2NceDQ0XHgxOFx4OTMiCisgICAgJEVDSE8gLW5lICJceGU5XHg3MVx4YThceDE4XHgwZFx4NzRceDQ4XHg4YVx4MThceDBiXHg2MVx4YmZceGUxXHhhOVx4MGVceDRjIgorICAgICRFQ0hPIC1uZSAiXHhhZFx4MWJceGFmXHgxYVx4MzdceDM5XHg5Mlx4NGRceGNjXHg5Nlx4ODdceDQ2XHgwZFx4ODNceDA2XHgzMyIKKyAgICAkRUNITyAtbmUgIlx4NTNceDM1XHhkOVx4MmNceDM2XHg5OFx4MjhceDFjXHg1Mlx4YjFceDg5XHg1NVx4NTZceGNjXHgzN1x4MjAiCisgICAgJEVDSE8gLW5lICJceDg5XHg4NFx4MGVceDNkXHgyN1x4MmZceGM2XHhmYVx4NzhceDA0XHhlMVx4ZDVceGM2XHg5MFx4NDlceDE2IgorICAgICRFQ0hPIC1uZSAiXHhmZVx4MGFceDE2XHg2Zlx4MTFceDU0XHg0Mlx4MjJceGExXHg5MFx4MmRceDE5XHg5MVx4MjhceDA1XHhmMiIKKyAgICAkRUNITyAtbmUgIlx4MzBceDZjXHgxNFx4MTZceGQ2XHg4YVx4Y2VceGY2XHhjZFx4N2NceDY0XHg3Nlx4NDJceGU5XHgyOFx4ZTkiCisgICAgJEVDSE8gLW5lICJceDFjXHhkMVx4YjhceDllXHhjZFx4NTNceGIyXHg2Ylx4OGRceDU3XHg1N1x4MmFceGI4XHg1OVx4NThceDhjIgorICAgICRFQ0hPIC1uZSAiXHhkM1x4MTJceDU3XHhhNlx4ZTNceDQ4XHg3MFx4ZjVceDU1XHgwZlx4NzZceGI1XHgyN1x4MDhceGQxXHhhMCIKKyAgICAkRUNITyAtbmUgIlx4ZjhceDYwXHgwOVx4YTFceGYyXHgzMFx4NDNceDRhXHgzMFx4NDZceGY3XHg5Nlx4MTlceGU5XHgzYVx4NDQiCisgICAgJEVDSE8gLW5lICJceGMwXHhkOFx4YThceDUxXHhhZVx4NTBceDkyXHg4MVx4ODFceGRhXHgxMFx4ZDNceDE4XHg2Mlx4OTRceGQwIgorICAgICRFQ0hPIC1uZSAiXHg5ZVx4NTRceDBiXHgyMlx4Y2NceGQwXHhmZVx4MGNceDM2XHg0NFx4NGRceDRkXHg0MFx4NWNceGE4XHgzNSIKKyAgICAkRUNITyAtbmUgIlx4YjZceDUzXHg5Y1x4MzZceDljXHg1YVx4MGVceDBlXHhiMFx4NWNceDI5XHgyYVx4MzVceDY2XHhhYVx4M2EiCisgICAgJEVDSE8gLW5lICJceGNiXHgyM1x4N2JceGJiXHhjOFx4NjBceGJjXHhiNFx4MjhceGY0XHg2ZVx4ZmVceDg2XHhmY1x4MTZceDg1IgorICAgICRFQ0hPIC1uZSAiXHgwY1x4ZTBceDFkXHhjZlx4ZmRceDEyXHgyOFx4YzZceDYwXHhkMFx4ZTZceDJmXHg3Nlx4ZjBceDFhXHg1YiIKKyAgICAkRUNITyAtbmUgIlx4ZmFceGE2XHhjNlx4ZWFceDU4XHhiYlx4MjZceDM3XHg4NFx4ZGRceDg1XHhkNVx4MzdceDgyXHg3Nlx4ZDkiCisgICAgJEVDSE8gLW5lICJceDE0XHg3YVx4Y2FceGVkXHgxM1x4NzJceGMzXHhlMVx4YjlceDY5XHg0NVx4ZDRceGVjXHg0NFx4OTRceDI2IgorICAgICRFQ0hPIC1uZSAiXHg4ZVx4MGJceDkwXHhiNlx4OGJceDFmXHgxZVx4MDFceDk2XHg1YVx4YjlceDUxXHhhNlx4MjdceGEyXHg5YiIKKyAgICAkRUNITyAtbmUgIlx4MzhceGQ5XHgyNVx4MzJceDliXHg1NFx4ZmNceDQ1XHhkMVx4YThceDU5XHgzNVx4MWFceGIwXHhiMlx4MWEiCisgICAgJEVDSE8gLW5lICJceGM4XHg4OFx4MTVceDQyXHg5OFx4NTBceDk5XHgxMlx4OWVceGY1XHg1OVx4YjJceDVjXHhjNVx4YTdceDM0IgorICAgICRFQ0hPIC1uZSAiXHgzNVx4Y2FceGIzXHhlZFx4ZGNceGM5XHg5Zlx4M2VceDc3XHg4Zlx4NmNceGRlXHhjOFx4NDFceDZhXHhjNSIKKyAgICAkRUNITyAtbmUgIlx4MjRceDg1XHgwNFx4YTFceDJmXHhlM1x4NDdceDhjXHg0N1x4ZDRceGRiXHg3NFx4OGNceGI2XHg0Y1x4ZWYiCisgICAgJEVDSE8gLW5lICJceGVkXHhhZFx4OWZceDg2XHgzMVx4ZDhceGM4XHgwN1x4YzVceDExXHgxY1x4MzlceDNhXHhmOFx4NzVceDczIgorICAgICRFQ0hPIC1uZSAiXHhhZVx4NzhceDdkXHgxZFx4MzZceDViXHhkMVx4MjNceDVkXHg4NFx4MTdceDVkXHg0Ylx4YWNceGQzXHg3MCIKKyAgICAkRUNITyAtbmUgIlx4OGFceDgzXHg0OFx4NDhceDgzXHg3Ylx4NWNceDk5XHg5ZVx4NTZceGJiXHhmY1x4MGNceDRiXHgwNFx4Y2YiCisgICAgJEVDSE8gLW5lICJceDgzXHg1ZFx4ZjhceDMxXHgyY1x4YzRceDVjXHhhMVx4NjhceDZhXHg1Nlx4ZTFceDdmXHhiZVx4ZDZceDU5IgorICAgICRFQ0hPIC1uZSAiXHg2Y1x4NTVceGIwXHg2M1x4NDFceGViXHg4OFx4NjlceGI2XHg5Ylx4NTBceGM0XHgzMVx4ZWFceGIwXHhkNyIKKyAgICAkRUNITyAtbmUgIlx4ZTJceGZiXHg3Ylx4ZWJceGJiXHg1Mlx4YzRceDk3XHgyM1x4ZTlceDE2XHgyOVx4MThceDUwXHg0ZFx4MGUiCisgICAgJEVDSE8gLW5lICJceDY4XHg2Mlx4ZmJceDNmXHhkOVx4MDdceGI5XHg4OVx4NGRceDU4XHg3Y1x4MzJceDZkXHgxMlx4M2VceDliIgorICAgICRFQ0hPIC1uZSAiXHgzYVx4MTRceGVlXHhhY1x4M2NceDhkXHgwOVx4NjJceDMwXHg4ZVx4ZTBceDg2XHg4NFx4YjlceGYzXHgwZCIKKyAgICAkRUNITyAtbmUgIlx4ZjhceGFkXHg0Mlx4YTZceGJiXHg3ZFx4ZDFceGYyXHhmM1x4YzBceGUyXHgzMlx4YzRceDQwXHhhYVx4OGEiCisgICAgJEVDSE8gLW5lICJceDJhXHhlOVx4YTlceDQ1XHg4M1x4MjNceGY2XHg5MFx4MDVceDI0XHg1OVx4MjJceDg0XHg1MFx4ODJceGMwIgorICAgICRFQ0hPIC1uZSAiXHg1OFx4NDFceDQyXHgxOFx4OTFceDNkXHhkOFx4ODBceGIxXHgyNlx4NjhceGIyXHhhOFx4YzBceDIxXHgxNCIKKyAgICAkRUNITyAtbmUgIlx4MThceGRmXHgzYVx4ODZceDI1XHg4NVx4NTZceGFiXHgyMFx4MzhceGNkXHhkY1x4OThceDZlXHgwN1x4YzQiCisgICAgJEVDSE8gLW5lICJceDZiXHgxNlx4NTVceGUwXHg0MVx4ZTBceDQxXHhkYVx4MjlceDYyXHg4ZFx4YmFceGNlXHhhMlx4Y2JceGZjIgorICAgICRFQ0hPIC1uZSAiXHg3MFx4NzhceDk5XHhmOVx4MTZceDBiXHg1YVx4MGNceGM1XHhhZFx4MThceGViXHhmMFx4YjVceGM5XHgyNSIKKyAgICAkRUNITyAtbmUgIlx4ODJceDE2XHhlMFx4NWRceGMxXHhjNFx4YzZceGYwXHg4NFx4NmFceDQ1XHg3ZFx4ZGJceDI4XHg0Nlx4YWIiCisgICAgJEVDSE8gLW5lICJceGVmXHgzMlx4YzlceDQ5XHg1MFx4NTFceDYwXHg3N1x4MWNceGZkXHg1OFx4OWNceDAxXHgzYlx4N2FceGZhIgorICAgICRFQ0hPIC1uZSAiXHg0OVx4NDdceDNlXHg4N1x4MWNceDM5XHhhNlx4NmFceGE0XHhiN1x4MzlceDkzXHhhY1x4YWNceGIwXHgzOSIKKyAgICAkRUNITyAtbmUgIlx4MmZceGJjXHhhYlx4OWJceDUyXHg5Nlx4MjRceDQ2XHhjMVx4OTVceGU0XHgzMVx4ODlceDM3XHgxOFx4YzgiCisgICAgJEVDSE8gLW5lICJceDJjXHgyMlx4MzJceDJhXHg4Zlx4YjZceDU4XHg3N1x4NTdceDc3XHgyZlx4MDlceGQwXHg3Y1x4ZWRceDc0IgorICAgICRFQ0hPIC1uZSAiXHhhYVx4N2NceDg2XHgyNVx4NDVceDBjXHg0M1x4NGRceDMxXHhiMFx4NjNceDQwXHhjZlx4ODZceGZlXHg3NSIKKyAgICAkRUNITyAtbmUgIlx4NzZceGUwXHhlZVx4OTlceGI1XHg3MVx4ZTJceDRlXHhlNVx4YzFceGY5XHgyZVx4NDhceGUyXHhhNlx4MWIiCisgICAgJEVDSE8gLW5lICJceDI4XHhhNVx4YTNceGJlXHhmZlx4MzdceGQxXHhkZFx4NjZceGEyXHhlOFx4ZDNceDg4XHg0ZFx4MTNceGQ1IgorICAgICRFQ0hPIC1uZSAiXHg2OFx4NTFceDI3XHg0MVx4YzNceDZjXHgxYlx4NDhceDY3XHg2YVx4ZGZceDI1XHgyYVx4NDBceGExXHg4NyIKKyAgICAkRUNITyAtbmUgIlx4MWRceDU0XHhiN1x4ZTNceDkxXHhjMlx4NmJceDViXHhiOVx4OGNceGQ1XHgxMFx4MTFceDEwXHgxNlx4YWIiCisgICAgJEVDSE8gLW5lICJceDZiXHhiZVx4NjVceDZiXHg3M1x4YTdceDM1XHhhMVx4MDlceDYwXHg2MFx4ZWRceDk2XHgzOVx4YzlceDQwIgorICAgICRFQ0hPIC1uZSAiXHg1ZFx4ZGNceGVlXHg2MFx4NDlceDBjXHg2OFx4MThceDM0XHhiMlx4NmZceDJhXHg5NVx4MTRceDI5XHg5NSIKKyAgICAkRUNITyAtbmUgIlx4NWJceDU5XHhkMlx4MWZceDYzXHgyYVx4YmVceGZkXHhhZVx4MDlceDVjXHhlZVx4MTFceGI1XHgyOVx4MzYiCisgICAgJEVDSE8gLW5lICJceGNhXHhkZlx4MjhceDhjXHg2NVx4NDJceDQ2XHg3NFx4MGNceDM5XHg2OFx4MzBceGFjXHgyY1x4MmZceGQwIgorICAgICRFQ0hPIC1uZSAiXHg5Ylx4YjNceDkyXHgxOVx4OTBceGExXHgwN1x4Y2NceGY2XHhkZVx4NjRceDVmXHg2Zlx4ZDdceGI2XHhjYyIKKyAgICAkRUNITyAtbmUgIlx4ZTBceDcwXHgwZlx4MGJceGQyXHgwZVx4NzdceGExXHg3MFx4ZTNceDU2XHg5MFx4NGJceDI4XHg1OFx4ZDAiCisgICAgJEVDSE8gLW5lICJceGQxXHhlMVx4OWRceDE4XHg5OFx4YmFceDZiXHgzNlx4NTRceGE5XHg1NFx4MDlceDYzXHg0OVx4MThceDU1IgorICAgICRFQ0hPIC1uZSAiXHg2MFx4YmFceDExXHhiMVx4MGFceDE0XHg0NVx4MWZceGFlXHgwOFx4NTBceDA5XHgzM1x4MDBceGEyXHhiMiIKKyAgICAkRUNITyAtbmUgIlx4NzFceDgxXHg3NVx4ODlceGI3XHhiOVx4MGNceDczXHhjMFx4NGNceDMyXHg4OVx4NzJceGFjXHhhOVx4YTMiCisgICAgJEVDSE8gLW5lICJceDQ3XHg1Zlx4N2RceDRlXHgxYlx4NGRceGI5XHhlYVx4ODRceDQ1XHgwMFx4MzdceDNjXHhiM1x4N2JceGY4IgorICAgICRFQ0hPIC1uZSAiXHhlN1x4MGZceGFhXHgzM1x4MWFceDliXHhjMlx4MGNceDM1XHg4YVx4ZDRceDA0XHg0Nlx4NDJceGNiXHhhYiIKKyAgICAkRUNITyAtbmUgIlx4YWFceGM3XHhlNVx4YzlceDIwXHg2ZVx4MjFceGE2XHg4Y1x4ZWRceDYxXHg4Nlx4NDJceDg3XHgwM1x4MjUiCisgICAgJEVDSE8gLW5lICJceGRlXHgyY1x4NGFceDg1XHhjYlx4YjRceDM2XHhjOVx4ZDRceDcyXHg2MFx4NjJceGMyXHgxOVx4ZDBceDMwIgorICAgICRFQ0hPIC1uZSAiXHgxNlx4NmRceDU4XHg2MVx4NjJceDE2XHhlOFx4ZDJceDBlXHhkMFx4ZjNceGRiXHg1M1x4MzdceDA3XHgzNyIKKyAgICAkRUNITyAtbmUgIlx4NDBceGMzXHhlNVx4NWJceDlkXHgxNlx4NDVceDYwXHg4ZVx4ZmJceDEyXHhjNFx4NWZceDlmXHhkZFx4ZTEiCisgICAgJEVDSE8gLW5lICJceDQ1XHg1ZFx4NDVceDM2XHgyMVx4YTBceGMwXHhiOFx4MTFceDk4XHgwZlx4NjRceDk4XHg2N1x4MWNceDExIgorICAgICRFQ0hPIC1uZSAiXHhhOVx4YTFceDY1XHgxMFx4YjlceDIyXHgxMlx4OTFceDEwXHg5Ylx4MTBceDZmXHg5NVx4MmVceDM0XHg5MSIKKyAgICAkRUNITyAtbmUgIlx4NjRceDgyXHhhNFx4MDVceDAyXHhmY1x4NGFceDlmXHg5Y1x4NGRceDZjXHg4ZFx4NjdceDI2XHg5MFx4NjMiCisgICAgJEVDSE8gLW5lICJceDA0XHgxMlx4NmZceDBlXHg1NVx4M2NceDhlXHhmMlx4OGRceGI0XHg2Ylx4M2RceGFjXHhjZlx4ODRceDJlIgorICAgICRFQ0hPIC1uZSAiXHg2MFx4MGZceDQwXHg2Mlx4ODhceDNhXHhjZlx4YmRceGVhXHhhZFx4NDBceDRjXHgyOVx4ZTFceGI1XHhiNiIKKyAgICAkRUNITyAtbmUgIlx4M2VceDE1XHg4Nlx4ZDVceGJlXHhhZFx4MjdceGRlXHgyYlx4MzJceGVmXHhjZlx4OTdceDg4XHg4Ylx4MTciCisgICAgJEVDSE8gLW5lICJceDgwXHg0M1x4MGVceDIwXHg3OVx4M2JceDM2XHg3M1x4YjhceGFkXHgxMlx4MGVceDg3XHg1OVx4NWZceGQzIgorICAgICRFQ0hPIC1uZSAiXHgzY1x4OGNceDg0XHhjOFx4NTRceDJiXHg5NFx4YzlceDJlXHgzNlx4OGJceDMyXHg0OFx4ZjFceGUzXHgwOCIKKyAgICAkRUNITyAtbmUgIlx4ZjBceDM2XHhjMFx4YjhceGMyXHhhMlx4YTlceGUyXHg1Mlx4MDJceGYxXHg5Ylx4Y2JceGRlXHhjY1x4YjUiCisgICAgJEVDSE8gLW5lICJceDVhXHg2Y1x4MDVceDA2XHgzMVx4NDRceDQxXHg4OFx4YTNceDA1XHgwNFx4MTZceDBkXHg0YVx4ODVceDIwIgorICAgICRFQ0hPIC1uZSAiXHg3OVx4ZGFceDg5XHg4Mlx4MWRceDVmXHg1YVx4MTFceDg4XHg4OVx4MDZceDA1XHhmNVx4ZjRceGVkXHg3NSIKKyAgICAkRUNITyAtbmUgIlx4NjJceDM5XHgzN1x4NjlceDExXHgzMlx4M2VceDhkXHhlNFx4NjBceDYyXHg1Mlx4YzlceGFkXHg4Mlx4OWEiCisgICAgJEVDSE8gLW5lICJceDlhXHgyZlx4MDZceDQxXHgyNlx4YjRceDQ4XHg3MFx4MzlceDJiXHg4YVx4YjFceDVhXHg1M1x4YzZceDQ4IgorICAgICRFQ0hPIC1uZSAiXHg1N1x4MTdceGY1XHhkOFx4NWFceGM2XHgxOVx4ODNceDA2XHgwYlx4OWJceDA0XHhiOFx4ZjVceGFmXHgyMyIKKyAgICAkRUNITyAtbmUgIlx4NDVceDg3XHg0OFx4NTBceDZkXHgxNlx4ZWFceGI0XHgyMFx4YjhceDQ5XHg5Mlx4NmJceDBjXHg3Nlx4MTQiCisgICAgJEVDSE8gLW5lICJceDQ4XHg1M1x4YTFceDI5XHg3NFx4ZjZceGQ3XHg0OVx4NDRceDM5XHhiYVx4YmRceDYzXHhhNlx4ZjJceDgxIgorICAgICRFQ0hPIC1uZSAiXHg4Zlx4NWJceDVlXHg0Nlx4MGFceDM0XHg5NVx4MzFceGMwXHhkZFx4NjBceDUwXHhkNlx4MGFceGE2XHgyOSIKKyAgICAkRUNITyAtbmUgIlx4M2RceDM2XHgzYVx4YzdceGI4XHhjZlx4MjVceDVlXHhmN1x4ODJceDU1XHg4OFx4YzJceDhiXHgzMFx4ZDIiCisgICAgJEVDSE8gLW5lICJceDk3XHg5MFx4NDlceDk0XHhkZVx4ZTVceGFhXHhlYlx4NDJceDhjXHg5NFx4MmFceGEwXHgwZFx4OWJceGI1IgorICAgICRFQ0hPIC1uZSAiXHg1OVx4YmVceGNiXHgzNVx4YTNceDM3XHg1NFx4NzZceDM1XHg5OFx4Y2JceDFmXHgxM1x4M2ZceDRhXHhkMSIKKyAgICAkRUNITyAtbmUgIlx4NDVceDg3XHg2N1x4ZWRceDY2XHgwMlx4MDZceDQ5XHgxY1x4NTlceDUxXHgxZlx4NGRceDg1XHgwM1x4NDYiCisgICAgJEVDSE8gLW5lICJceDY1XHg4Nlx4NGVceDRjXHg2YVx4ZDJceDI0XHgzMVx4NWJceDZhXHgzYlx4MTlceDQ5XHhlMVx4ODNceDE0IgorICAgICRFQ0hPIC1uZSAiXHhjMVx4ZjBceDU2XHg2MVx4OTNceDhiXHgzM1x4MTNceDU0XHg2Zlx4NzhceDRjXHhhMFx4ODVceGYwXHhiMyIKKyAgICAkRUNITyAtbmUgIlx4MTdceGFhXHhmMlx4NjdceDAyXHgwY1x4MzFceGVkXHg1ZVx4OThceDAyXHgyOFx4YzRceGU1XHg4N1x4YTIiCisgICAgJEVDSE8gLW5lICJceDcwXHhkMVx4ZDVceDljXHhmOFx4ZWNceDE5XHg4OFx4YTlceDBkXHgwZVx4NGFceGUzXHg0N1x4ODNceDZlIgorICAgICRFQ0hPIC1uZSAiXHhmN1x4NzBceDNlXHhhNFx4YTlceGMwXHg0Y1x4ZmFceDJiXHgzYlx4ZDdceDZmXHg5Nlx4YzNceDZkXHg2ZCIKKyAgICAkRUNITyAtbmUgIlx4NzFceDJhXHg4ZFx4NjJceGYxXHhkM1x4ZGRceGIwXHgzM1x4ZDRceDY3XHgxOVx4MGRceDMwXHg4NVx4M2EiCisgICAgJEVDSE8gLW5lICJceDA2XHgwNFx4ODVceDAwXHg0OFx4NWRceDUzXHgzNVx4YTBceDMxXHg1Nlx4ODRceDgyXHhhNVx4YWNceDIyIgorICAgICRFQ0hPIC1uZSAiXHgwMlx4NDRceGFmXHg2ZFx4YzBceDYxXHg1OVx4MjNceDk2XHg3Mlx4NWFceDgxXHg5ZVx4MGNceGU1XHg3OSIKKyAgICAkRUNITyAtbmUgIlx4ZGFceGQwXHg0Mlx4NWNceDg5XHhhNVx4MDBceGVjXHg1Nlx4NDFceDY0XHg4YVx4MTFceDYwXHg3OVx4YjEiCisgICAgJEVDSE8gLW5lICJceGVkXHg1NVx4MTZceDU0XHhlNlx4NTFceDAzXHgzNFx4MTRceDYwXHgzMVx4ZDJceGYwXHgwYlx4Y2VceGYyIgorICAgICRFQ0hPIC1uZSAiXHg0ZVx4NGNceDQ1XHg4Y1x4ZWJceDJhXHg4Mlx4M2FceGE4XHg1Mlx4Y2VceDhmXHg0ZVx4ZjFceDg5XHhlYSIKKyAgICAkRUNITyAtbmUgIlx4NDRceDkxXHg2Nlx4ZGRceDZiXHg0OVx4YTNceDgzXHgwYlx4MTlceDBlXHg2Nlx4NWZceDAyXHgyMlx4NTgiCisgICAgJEVDSE8gLW5lICJceGU3XHhjMFx4YThceGNlXHg1NVx4NDhceGE2XHgwNFx4ZjNceDAzXHhhY1x4NjJceGIyXHhjMFx4YWFceGEwIgorICAgICRFQ0hPIC1uZSAiXHgwOVx4YWVceDViXHg5Nlx4ZDBceGRkXHhhOVx4MWZceGZiXHgyZFx4M2RceGY1XHgwMlx4ZTFceDg2XHgwMiIKKyAgICAkRUNITyAtbmUgIlx4M2VceGRhXHhkMFx4NWRceGJhXHgxNlx4MzlceGNkXHg3NVx4YTJceDQ3XHgyNlx4NzRceDI1XHhhOFx4NWUiCisgICAgJEVDSE8gLW5lICJceGYzXHgzNlx4MGNceDM3XHgxOVx4MTdceDA2XHg2Nlx4ZDBceDBiXHg0Mlx4NDFceDBhXHhhMFx4ZGVceDkzIgorICAgICRFQ0hPIC1uZSAiXHhkN1x4YjRceDlmXHhmYlx4YzdceDRmXHg2NVx4NTRceGRhXHhiOFx4OGJceDIzXHhkZVx4OWNceDU3XHhjZiIKKyAgICAkRUNITyAtbmUgIlx4MmRceDJhXHgxMlx4ZGFceGNjXHhmNlx4NzNceDgzXHgwMlx4NGNceDBlXHg0Mlx4ODhceGRhXHgyN1x4YjkiCisgICAgJEVDSE8gLW5lICJceGNiXHgwNFx4YjZceDA3XHgyNlx4NzhceGExXHhhMVx4MDlceGEzXHg2YVx4ODZceGJkXHg5ZFx4ZDRceGY5IgorICAgICRFQ0hPIC1uZSAiXHhjMFx4ODFceGE2XHg0OVx4YTlceDcyXHhlYlx4NTZceGJkXHhmOVx4ZWFceDg5XHg0Zlx4YWVceDcyXHgyOCIKKyAgICAkRUNITyAtbmUgIlx4YjZceDU3XHgzNVx4YmVceDk0XHhhZFx4YzBceGZmXHgxZVx4ZjJceDM1XHgyNFx4YTBceDQ1XHhkNVx4MDkiCisgICAgJEVDSE8gLW5lICJceGMwXHhlMFx4MTBceGQwXHgxN1x4OTBceGUyXHhmZlx4OGJceGI5XHgyMlx4OWNceDI4XHg0OFx4MDlceDY4IgorICAgICRFQ0hPIC1uZSAiXHhjM1x4MThceDAwIgorfQorCit0YXIyX2J6MigpCit7CisgICAgJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHgxNlx4MDhceGZkXHg2MFx4MDBceDAwIgorICAgICRFQ0hPIC1uZSAiXHgwMVx4ZmZceDgwXHg0OFx4ODBceDAwXHhhMFx4NDBceDAzXHhmZlx4YzBceDcyXHgwMFx4ODlceDQwXHhmZiIKKyAgICAkRUNITyAtbmUgIlx4ZTdceGRmXHhjMFx4MjBceDAwXHg5Mlx4MTFceDUzXHhmNVx4MTNceGQzXHg1M1x4N2FceDQxXHhhOFx4ZjIiCisgICAgJEVDSE8gLW5lICJceDlhXHg2MFx4MjFceDlhXHg0MFx4ZjRceDliXHhkMlx4MGRceDA5XHhhNVx4M2NceGE2XHg0Zlx4NDRceGY1IgorICAgICRFQ0hPIC1uZSAiXHgzNFx4MzRceGQxXHhiNVx4MDFceGEwXHgzZFx4NDFceGE0XHhlMVx4ZWJceDRjXHg1YVx4MDFceDQ3XHgzYiIKKyAgICAkRUNITyAtbmUgIlx4ZDFceDY3XHgxYVx4NGNceDNiXHgyMVx4ODRceDIzXHgyY1x4NWNceGY3XHhlMFx4YmRceDJhXHhhNFx4ZWEiCisgICAgJEVDSE8gLW5lICJceGRjXHhkYlx4NzFceDgwXHgyNlx4OThceDIxXHgwZVx4NzZceDIxXHgzMFx4Y2VceGU0XHhhZFx4OGNceGI1IgorICAgICRFQ0hPIC1uZSAiXHg2OFx4NjJceDM1XHhhMVx4ZmRceDhlXHg3Ylx4NTFceDcwXHg5Nlx4YjFceDJjXHhhMlx4OTlceDZjXHhhMSIKKyAgICAkRUNITyAtbmUgIlx4YzJceGNkXHhlYVx4YTdceDVlXHg2Ylx4OTFceDRmXHg3M1x4OTZceGU0XHg0OFx4M2NceGU3XHg4Y1x4MGYiCisgICAgJEVDSE8gLW5lICJceDAzXHg2NFx4NWJceDdhXHg0M1x4YzFceDY4XHg4Nlx4NDFceDgzXHg0Nlx4MGJceGJhXHhhYVx4NmFceDliIgorICAgICRFQ0hPIC1uZSAiXHg1OVx4MzRceGYxXHgxY1x4MDhceDY5XHgxZFx4NDFceGZiXHg0YVx4OTZceDFiXHgxNFx4OWVceDMyXHg4OSIKKyAgICAkRUNITyAtbmUgIlx4NjlceDVmXHg2M1x4OWFceDIyXHhlNFx4OTZceDM0XHhmZlx4MTJceDIwXHhkMFx4MjVceDcwXHhkY1x4NWQiCisgICAgJEVDSE8gLW5lICJceGM5XHgxNFx4ZTFceDQyXHg0MFx4NThceDIzXHhmNVx4ODAiCit9CisKKyMgTkI6IHRhciBlbWl0cyAidGFyOiBzaG9ydCByZWFkIiBvbiBzdGRlcnIgYmVjYXVzZSB0aGVzZSB0ZXN0IHRhcnMgYXJlCisjIGFsc28gbGFja2luZyBwcm9wZXIgdGVybWluYXRpbmcgemVyb2VkIGJsb2Nrcy4gQnV0IGV4aXRjb2RlIGlzIDAuCisjIFRoaXMgaXMgaW50ZW5kZWQuCisKK2V4cG9ydCBUWj1VVEMtMQorCisjIENhc2UgMTogbG9uZyBuYW1lLCB3aXRoIHBhdGggaW4gcHJlZml4IGZpZWxkCityZXMxPSctcnctci0tci0tIGZtMy91c2VycyAgICAgIDk4NjkgMjAwNy0wMy0xMiAxMDo0NDo1NCBWaXJ0dWFsQm94LTEuNS42X09TRS9zcmMvbGlicy94cGNvbTE4YTQvaXBjL2lwY2QvZXh0ZW5zaW9ucy90cmFuc21uZ3IvcHVibGljL2lwY0lUcmFuc2FjdGlvblNlcnZpY2UuaWRsJwordD1gdGFyMV9iejIgfCBidW56aXAyIHwgYnVzeWJveCB0YXIgdHZmIC1gCit0ZXN0IHgiJHJlczEiID0geCIkdCIKK3Q9YHRhcjFfYnoyIHwgYnVuemlwMiB8IGJ1c3lib3ggdGFyIHR2YAordGVzdCB4IiRyZXMxIiA9IHgiJHQiCisKKyMgQ2FzZSAyOiBsb25nIGRpciBuYW1lLCB3aXRoIEVOVElSRSBwYXRoIGluIHByZWZpeCBmaWVsZCAobmFtZSA9ICIiKQorcmVzMj0nZHJ3eHIteHIteCBmbTMvdXNlcnMgICAgICAgICAwIDIwMDgtMDItMTkgMTY6MzM6MjAgVmlydHVhbEJveC0xLjUuNl9PU0Uvc3JjL1ZCb3gvQWRkaXRpb25zL2xpbnV4L3gxMWluY2x1ZGUvNC4zL3Byb2dyYW1zL1hzZXJ2ZXIvaHcveGZyZWU4Ni94ZjI0XzMyYnBwLycKK3Q9YHRhcjJfYnoyIHwgYnVuemlwMiB8IGJ1c3lib3ggdGFyIHR2ZiAtYAordGVzdCB4IiRyZXMyIiA9IHgiJHQiCit0PWB0YXIyX2J6MiB8IGJ1bnppcDIgfCBidXN5Ym94IHRhciB0dmAKK3Rlc3QgeCIkcmVzMiIgPSB4IiR0IgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhc2tzZXQudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGFza3NldC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmI1YzkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rhc2tzZXQudGVzdHMKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorIyBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorYT0idGFza3NldCIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICAgICAgICAgICAgICAib3B0cyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wIiAic3RkaW4iCit0ZXN0aW5nICJ0YXNrc2V0IChnZXQgZnJvbSBwaWQgMSkiICIkYSAtcCAxID4vZGV2L251bGw7ZWNobyBcJD8iICIwXG4iICIiICIiCit0ZXN0aW5nICJ0YXNrc2V0IChpbnZhbGlkIHBpZCkiICAgICIkYSAtcCAwID4vZGV2L251bGwgMj4mMTtlY2hvIFwkPyIgIjFcbiIgIiIgIiIKK3Rlc3RpbmcgInRhc2tzZXQgKHNldF9hZmYsIG5lZWRzIENBUF9TWVNfTklDRSkiIFwKKwkiJGEgMHgxICRTSEVMTCAtYyAnJGEgLXAgXCRcJCB8IGdyZXAgXCJjdXJyZW50IGFmZmluaXR5IG1hc2s6IDFcIiA+L2Rldi9udWxsJzsgZWNobyBcJD8iIFwKKwkiMFxuIiAiIiAiIgorCit1bnNldCBhCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90ZWUvdGVlLWFwcGVuZHMtaW5wdXQgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGVlL3RlZS1hcHBlbmRzLWlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjIwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGVlL3RlZS1hcHBlbmRzLWlucHV0CkBAIC0wLDAgKzEsNSBAQAorZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCA+Zm9vCitjcCBmb28gYmFyCitlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90ID4+Zm9vCitlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90IHwgYnVzeWJveCB0ZWUgLWEgYmFyID4vZGV2L251bGwKK2NtcCBmb28gYmFyCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGVlL3RlZS10ZWVzLWlucHV0IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RlZS90ZWUtdGVlcy1pbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmUyMTczCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RlZS90ZWUtdGVlcy1pbnB1dApAQCAtMCwwICsxLDMgQEAKK2VjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgPmZvbworZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCB8IGJ1c3lib3ggdGVlIGJhciA+YmF6CitjbXAgZm9vIGJhciAmJiBjbXAgZm9vIGJhegpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rlc3QudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGVzdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYzkyZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rlc3QudGVzdHMKQEAgLTAsMCArMSw3OSBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDcgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKKyMgTmVlZCB0byBjYWxsICdidXN5Ym94IHRlc3QnLCBvdGhlcndpc2Ugc2hlbGwgYnVpbHRpbiBpcyB1c2VkCisKK3Rlc3RpbmcgInRlc3Q6IHNob3VsZCBiZSBmYWxzZSAoMSkiIFwKKwkiYnVzeWJveCB0ZXN0OyBlY2hvIFwkPyIgXAorCSIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICcnOiBzaG91bGQgYmUgZmFsc2UgKDEpIiBcCisJImJ1c3lib3ggdGVzdCAnJzsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAhOiBzaG91bGQgYmUgdHJ1ZSAoMCkiIFwKKwkiYnVzeWJveCB0ZXN0ICE7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgYTogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCBhOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0IC0taGVscDogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCAtLWhlbHA7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgLWY6IHNob3VsZCBiZSB0cnVlICgwKSIgXAorCSJidXN5Ym94IHRlc3QgLWY7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgISAtZjogc2hvdWxkIGJlIGZhbHNlICgxKSIgXAorCSJidXN5Ym94IHRlc3QgISAtZjsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCBhID0gYTogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCBhID0gYTsgZWNobyBcJD8iIFwKKwkiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAtbHQgPSAtZ3Q6IHNob3VsZCBiZSBmYWxzZSAoMSkiIFwKKwkiYnVzeWJveCB0ZXN0IC1sdCA9IC1ndDsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCBhIC1hICE6IHNob3VsZCBiZSB0cnVlICgwKSIgXAorCSJidXN5Ym94IHRlc3QgYSAtYSAhOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0IC1mID0gYSAtbyBiOiBzaG91bGQgYmUgdHJ1ZSAoMCkiIFwKKwkiYnVzeWJveCB0ZXN0IC1mID0gYSAtbyBiOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICEgYSA9IGIgLWEgISBjID0gYzogc2hvdWxkIGJlIGZhbHNlICgxKSIgXAorCSJidXN5Ym94IHRlc3QgISBhID0gYiAtYSAhIGMgPSBjOyBlY2hvIFwkPyIgXAorCSIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICEgYSA9IGIgLWEgISBjID0gZDogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCAhIGEgPSBiIC1hICEgYyA9IGQ7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rlc3Rpbmcuc2ggYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdGVzdGluZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U2NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3Rlc3Rpbmcuc2gKQEAgLTAsMCArMSwxNzAgQEAKKyMgU2ltcGxlIHRlc3QgaGFybmVzcyBpbmZyYXN0cnVjdHVyZSBmb3IgQnVzeUJveAorIworIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleQorIworIyBMaWNlbnNlIGlzIEdQTHYyLCBzZWUgTElDRU5TRSBpbiB0aGUgYnVzeWJveCB0YXJiYWxsIGZvciBmdWxsIGxpY2Vuc2UgdGV4dC4KKworIyBUaGlzIGZpbGUgZGVmaW5lcyB0d28gZnVuY3Rpb25zLCAidGVzdGluZyIgYW5kICJvcHRpb25hbCIKKyMgYW5kIGEgY291cGxlIG1vcmUuLi4KKworIyBUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXkgYmUgc2V0IHRvIGVuYWJsZSBvcHRpb25hbCBiZWhhdmlvcgorIyBpbiAidGVzdGluZyI6CisjICAgIFZFUkJPU0UgLSBQcmludCB0aGUgZGlmZiAtdSBvZiBlYWNoIGZhaWxlZCB0ZXN0IGNhc2UuCisjICAgIERFQlVHIC0gRW5hYmxlIGNvbW1hbmQgdHJhY2luZy4KKyMgICAgU0tJUCAtIGRvIG5vdCBwZXJmb3JtIHRoaXMgdGVzdCAodGhpcyBpcyBzZXQgYnkgIm9wdGlvbmFsIikKKyMKKyMgVGhlICJ0ZXN0aW5nIiBmdW5jdGlvbiB0YWtlcyBmaXZlIGFyZ3VtZW50czoKKyMJJDEpIFRlc3QgZGVzY3JpcHRpb24KKyMJJDIpIENvbW1hbmQocykgdG8gcnVuLiBNYXkgaGF2ZSBwaXBlcywgcmVkaXJlY3RzLCBldGMKKyMJJDMpIEV4cGVjdGVkIHJlc3VsdCBvbiBzdGRvdXQKKyMJJDQpIERhdGEgdG8gYmUgd3JpdHRlbiB0byBmaWxlICJpbnB1dCIKKyMJJDUpIERhdGEgdG8gYmUgd3JpdHRlbiB0byBzdGRpbgorIworIyBUaGUgZXhpdCB2YWx1ZSBvZiB0ZXN0aW5nIGlzIHRoZSBleGl0IHZhbHVlIG9mICQyIGl0IHJhbi4KKyMKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICJGQUlMQ09VTlQiIGNvbnRhaW5zIGEgY3VtdWxhdGl2ZSB0b3RhbCBvZiB0aGUKKyMgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KKworIyBUaGUgIm9wdGlvbmFsIiBmdW5jdGlvbiBpcyB1c2VkIHRvIHNraXAgY2VydGFpbiB0ZXN0cywgYWxhOgorIyAgIG9wdGlvbmFsIEZFQVRVUkVfVEhJTkdZCisjCisjIFRoZSAib3B0aW9uYWwiIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgIk9QVElPTkZMQUdTIiwKKyMgd2hpY2ggaXMgZWl0aGVyIGVtcHR5IChpbiB3aGljaCBjYXNlIGl0IGFsd2F5cyBjbGVhcnMgU0tJUCkgb3IKKyMgZWxzZSBjb250YWlucyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGZlYXR1cmVzIChpbiB3aGljaCBjYXNlIHRoZSBmdW5jdGlvbgorIyBjbGVhcnMgU0tJUCBpZiB0aGUgZmxhZyB3YXMgZm91bmQsIG9yIHNldHMgaXQgdG8gMSBpZiB0aGUgZmxhZyB3YXMgbm90IGZvdW5kKS4KKworZXhwb3J0IEZBSUxDT1VOVD0wCitleHBvcnQgU0tJUD0KKworIyBIZWxwZXIgZm9yIGhlbHBlcnMuIE9oIG15Li4uCisKK3Rlc3QgeCIkRUNITyIgIT0geCIiIHx8IHsKKwlFQ0hPPSJlY2hvIgorCXRlc3QgeCJgZWNobyAtbmVgIiA9IHgiIiB8fCB7CisJCSMgQ29tcGlsZSBhbmQgdXNlIGEgcmVwbGFjZW1lbnQgJ2VjaG8nIHdoaWNoIHVuZGVyc3RhbmRzIC1lIC1uCisJCUVDSE89IiRQV0QvZWNoby1uZSIKKwkJdGVzdCAteCAiJEVDSE8iIHx8IHsKKwkJCWdjYyAtT3MgLW8gIiRFQ0hPIiAuLi9zY3JpcHRzL2VjaG8uYyB8fCBleGl0IDEKKwkJfQorCX0KKwlleHBvcnQgRUNITworfQorCisjIEhlbHBlciBmdW5jdGlvbnMKKworb3B0aW9uYWwoKQoreworCVNLSVA9CisJd2hpbGUgdGVzdCAiJDEiOyBkbworCQlpZiB0ZXN0IHgiJHtPUFRJT05GTEFHUy8qOiQxOioveX0iICE9IHgieSI7IHRoZW4KKwkJCVNLSVA9MQorCQkJcmV0dXJuCisJCWZpCisJCXNoaWZ0CisJZG9uZQorfQorCisjIFRoZSB0ZXN0aW5nIGZ1bmN0aW9uCisKK3Rlc3RpbmcoKQoreworICBOQU1FPSIkMSIKKyAgWyAtbiAiJDEiIF0gfHwgTkFNRT0iJDIiCisKKyAgaWYgWyAkIyAtbmUgNSBdCisgIHRoZW4KKyAgICBlY2hvICJUZXN0ICROQU1FIGhhcyB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzOiAkIyAobXVzdCBiZSA1KSIgPiYyCisgICAgZXhpdCAxCisgIGZpCisKKyAgWyAteiAiJERFQlVHIiBdIHx8IHNldCAteAorCisgIGlmIFsgLW4gIiRTS0lQIiBdCisgIHRoZW4KKyAgICBlY2hvICJTS0lQUEVEOiAkTkFNRSIKKyAgICByZXR1cm4gMAorICBmaQorCisgICRFQ0hPIC1uZSAiJDMiID4gZXhwZWN0ZWQKKyAgJEVDSE8gLW5lICIkNCIgPiBpbnB1dAorICBbIC16ICIkVkVSQk9TRSIgXSB8fCBlY2hvID09PT09PT09PT09PT09PT09PT09PT0KKyAgWyAteiAiJFZFUkJPU0UiIF0gfHwgZWNobyAiZWNobyAtbmUgJyQ0JyA+aW5wdXQiCisgIFsgLXogIiRWRVJCT1NFIiBdIHx8IGVjaG8gImVjaG8gLW5lICckNScgfCAkMiIKKyAgJEVDSE8gLW5lICIkNSIgfCBldmFsICIkMiIgPiBhY3R1YWwKKyAgUkVUVkFMPSQ/CisKKyAgaWYgY21wIGV4cGVjdGVkIGFjdHVhbCA+L2Rldi9udWxsIDI+L2Rldi9udWxsCisgIHRoZW4KKyAgICBlY2hvICJQQVNTOiAkTkFNRSIKKyAgZWxzZQorICAgIEZBSUxDT1VOVD0kKCgkRkFJTENPVU5UICsgMSkpCisgICAgZWNobyAiRkFJTDogJE5BTUUiCisgICAgWyAteiAiJFZFUkJPU0UiIF0gfHwgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKyAgZmkKKyAgcm0gLWYgaW5wdXQgZXhwZWN0ZWQgYWN0dWFsCisKKyAgWyAteiAiJERFQlVHIiBdIHx8IHNldCAreAorCisgIHJldHVybiAkUkVUVkFMCit9CisKKyMgUmVjdXJzaXZlbHkgZ3JhYiBhbiBleGVjdXRhYmxlIGFuZCBhbGwgdGhlIGxpYnJhcmllcyBuZWVkZWQgdG8gcnVuIGl0LgorIyBTb3VyY2UgcGF0aHMgYmVnaW5uaW5nIHdpdGggLyB3aWxsIGJlIGNvcGllZCBpbnRvIGRlc3RwYXRoLCBvdGhlcndpc2UKKyMgdGhlIGZpbGUgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIHRoZXJlIGFuZCBvbmx5IGl0cyBsaWJyYXJ5IGRlcGVuZGVuY2llcworIyBhcmUgY29waWVkLgorCitta2Nocm9vdCgpCit7CisgIFsgJCMgLWx0IDIgXSAmJiByZXR1cm4KKworICAkRUNITyAtbiAuCisKKyAgZGVzdD0kMQorICBzaGlmdAorICBmb3IgaSBpbiAiJEAiCisgIGRvCisgICAgI2Jhc2hpc206IFsgIiR7aTowOjF9IiA9PSAiLyIgXSB8fCBpPSQod2hpY2ggJGkpCisgICAgaT0kKHdoaWNoICRpKSAjIG5vLW9wIGZvciAvYmluL3Byb2cKKyAgICBbIC1mICIkZGVzdC8kaSIgXSAmJiBjb250aW51ZQorICAgIGlmIFsgLWUgIiRpIiBdCisgICAgdGhlbgorICAgICAgZD1gZWNobyAiJGkiIHwgZ3JlcCAtbyAnLiovJ2AgJiYKKyAgICAgIG1rZGlyIC1wICIkZGVzdC8kZCIgJiYKKyAgICAgIGNhdCAiJGkiID4gIiRkZXN0LyRpIiAmJgorICAgICAgY2htb2QgK3ggIiRkZXN0LyRpIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIk5vdCBmb3VuZDogJGkiCisgICAgZmkKKyAgICBta2Nocm9vdCAiJGRlc3QiICQobGRkICIkaSIgfCBlZ3JlcCAtbyAnLy4qICcpCisgIGRvbmUKK30KKworIyBTZXQgdXAgYSBjaHJvb3QgZW52aXJvbm1lbnQgYW5kIHJ1biBjb21tYW5kcyB3aXRoaW4gaXQuCisjIE5lZWRlZCBjb21tYW5kcyBsaXN0ZWQgb24gY29tbWFuZCBsaW5lCisjIFNjcmlwdCBmZWQgdG8gc3RkaW4uCisKK2RvY2hyb290KCkKK3sKKyAgbWtkaXIgdG1wZGlyNGNocm9vdAorICBtb3VudCAtdCByYW1mcyB0bXBkaXI0Y2hyb290IHRtcGRpcjRjaHJvb3QKKyAgbWtkaXIgLXAgdG1wZGlyNGNocm9vdC97ZXRjLHN5cyxwcm9jLHRtcCxkZXZ9CisgIGNwIC1MIHRlc3Rpbmcuc2ggdG1wZGlyNGNocm9vdAorCisgICMgQ29weSB1dGlsaXRpZXMgZnJvbSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisKKyAgJEVDSE8gLW4gIlNldHVwIGNocm9vdCIKKyAgbWtjaHJvb3QgdG1wZGlyNGNocm9vdCAkKgorICBlY2hvCisKKyAgbWtub2QgdG1wZGlyNGNocm9vdC9kZXYvdHR5IGMgNSAwCisgIG1rbm9kIHRtcGRpcjRjaHJvb3QvZGV2L251bGwgYyAxIDMKKyAgbWtub2QgdG1wZGlyNGNocm9vdC9kZXYvemVybyBjIDEgNQorCisgICMgQ29weSBzY3JpcHQgZnJvbSBzdGRpbgorCisgIGNhdCA+IHRtcGRpcjRjaHJvb3QvdGVzdC5zaAorICBjaG1vZCAreCB0bXBkaXI0Y2hyb290L3Rlc3Quc2gKKyAgY2hyb290IHRtcGRpcjRjaHJvb3QgL3Rlc3Quc2gKKyAgdW1vdW50IC1sIHRtcGRpcjRjaHJvb3QKKyAgcm1kaXIgdG1wZGlyNGNocm9vdAorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLWNyZWF0ZXMtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC1jcmVhdGVzLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0OTM1NAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC1jcmVhdGVzLWZpbGUKQEAgLTAsMCArMSwyIEBACitidXN5Ym94IHRvdWNoIGZvbwordGVzdCAtZiBmb28KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC1kb2VzLW5vdC1jcmVhdGUtZmlsZSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC1kb2VzLW5vdC1jcmVhdGUtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODUyNTkyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLWRvZXMtbm90LWNyZWF0ZS1maWxlCkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCB0b3VjaCAtYyBmb28KK3Rlc3QgISAtZiBmb28KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC10b3VjaGVzLWZpbGVzLWFmdGVyLW5vbi1leGlzdGVudC1maWxlIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLXRvdWNoZXMtZmlsZXMtYWZ0ZXItbm9uLWV4aXN0ZW50LWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2OWVjMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC10b3VjaGVzLWZpbGVzLWFmdGVyLW5vbi1leGlzdGVudC1maWxlCkBAIC0wLDAgKzEsMyBAQAordG91Y2ggLXQgMTk4MDAxMDEwMDAwIGJhcgorYnVzeWJveCB0b3VjaCAtYyBmb28gYmFyCit0ZXN0IHgiYGZpbmQgYmFyIC1tdGltZSAtMWAiID0geGJhcgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RyLnRlc3RzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjY2EyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHIudGVzdHMKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDkgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJkZXNjcmlwdGlvbiIgImFyZ3VtZW50cyIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJ0ciBkb2VzIG5vdCB0cmVhdCBbXSBpbiBbYS16XSBhcyBzcGVjaWFsIiBcCisJInRyICdbcS16XScgJ19RLVorJyIgXAorCSJfUVdlKyIgIiIgIltxd2VdIgorCit0ZXN0aW5nICJ0ciB1bmRlcnN0YW5kcyAwLTlBLUYiIFwKKwkidHIgLWNkICdbMC05QS1GXSciIFwKKwkiMTlBRiIgIiIgIjE5QUZIXG4iCisKK29wdGlvbmFsIEZFQVRVUkVfVFJfQ0xBU1NFUwordGVzdGluZyAidHIgdW5kZXJzdGFuZHMgWzp4ZGlnaXQ6XSIgXAorCSJ0ciAtY2QgJ1s6eGRpZ2l0Ol0nIiBcCisJIjE5QUYiICIiICIxOUFGSFxuIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9UUl9DTEFTU0VTCit0ZXN0aW5nICJ0ciBkb2VzIG5vdCBzdG9wIGFmdGVyIFs6ZGlnaXQ6XSIgXAorCSJ0ciAnWzpkaWdpdDpdeS16JyAxMTExMTExMTExMjMiIFwKKwkiMTExYWJjeDIzXG4iICIiICI3ODlhYmN4eXpcbiIKK1NLSVA9CisKK29wdGlvbmFsIEZFQVRVUkVfVFJfQ0xBU1NFUwordGVzdGluZyAidHIgaGFzIGNvcnJlY3QgeGRpZ2l0IHNlcXVlbmNlIiBcCisJInRyICdbOnhkaWdpdDpdR2cnIDExMTExMTExNTEyNDIyMjIzMzMzMzB4WCIgXAorCSIjMTExMTExMTE1MTI0MjIyMngzMzMzMzBYXG4iICIiIFwKKwkiIzAxMjM0NTY3ODlBQkNERUZHYWJjZGVmZ1xuIgorU0tJUD0KKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHIvdHItZC1hbG51bS13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90ci90ci1kLWFsbnVtLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NDBlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHIvdHItZC1hbG51bS13b3JrcwpAQCAtMCwwICsxLDYgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUworCitlY2hvIHRlc3RpbmcgfCB0ciAtZCAnW1s6YWxudW06XV0nID4gbG9nZmlsZS5nbnUKK2VjaG8gdGVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1tbOmFsbnVtOl1dJyA+IGxvZ2ZpbGUuYmIKKworZGlmZiAtdSBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHIvdHItZC13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90ci90ci1kLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmJmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHIvdHItZC13b3JrcwpAQCAtMCwwICsxLDQgQEAKK2VjaG8gdGVzdGluZyB8IHRyIC1kIGFlaW91ID4gbG9nZmlsZS5nbnUKK2VjaG8gdGVzdGluZyB8IGJ1c3lib3ggdHIgLWQgYWVpb3UgPiBsb2dmaWxlLmJiCisKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RyL3RyLW5vbi1nbnUgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHIvdHItbm9uLWdudQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmE2OTUxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RyL3RyLW5vbi1nbnUKQEAgLTAsMCArMSBAQAorZWNobyBmZGhybnp2ZnUgYmZmdnNlbnRyIHwgYnVzeWJveCB0ciAnW2Etel0nICdbbi16XVthLW1dJwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RyL3RyLXJlamVjdHMtd3JvbmctY2xhc3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHIvdHItcmVqZWN0cy13cm9uZy1jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ4OGEzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RyL3RyLXJlamVjdHMtd3JvbmctY2xhc3MKQEAgLTAsMCArMSwyMSBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTCisKK2VjaG8gdDEyZXN0aW5nIHwgdHIgLWQgJ1tbOmFscGhhOl1dJyA+IGxvZ2ZpbGUuZ251CitlY2hvIHQxMmVzdGluZyB8IHRyIC1kICdbOmFscGhhOl0nICA+PiBsb2dmaWxlLmdudQorZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnW1s6YWxwaGE6XScgPj4gbG9nZmlsZS5nbnUKK2VjaG8gdDEyZXN0aW5nIHwgdHIgLWQgJ1tbOmFscGhhOicgPj4gbG9nZmlsZS5nbnUKK2VjaG8gdDEyZXN0aW5nIHwgdHIgLWQgJ1tbOmFscGhhJyA+PiBsb2dmaWxlLmdudQorZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnWzphbHBoYTpdJyA+PiBsb2dmaWxlLmdudQorZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnWzphbHBoYTonID4+IGxvZ2ZpbGUuZ251CitlY2hvIHQxMmVzdGluZyB8IHRyIC1kICdbOmFscGhhJyA+PiBsb2dmaWxlLmdudQorCitlY2hvIHQxMmVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1tbOmFscGhhOl1dJyA+IGxvZ2ZpbGUuYmIKK2VjaG8gdDEyZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnWzphbHBoYTpdJyAgPj4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbWzphbHBoYTpdJyA+PiBsb2dmaWxlLmJiCitlY2hvIHQxMmVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1tbOmFscGhhOicgPj4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbWzphbHBoYScgPj4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbOmFscGhhOl0nID4+IGxvZ2ZpbGUuYmIKK2VjaG8gdDEyZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnWzphbHBoYTonID4+IGxvZ2ZpbGUuYmIKK2VjaG8gdDEyZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnWzphbHBoYScgPj4gbG9nZmlsZS5iYgorCitkaWZmIC11IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90ci90ci13b3JrcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90ci90ci13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTRhMzBlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RyL3RyLXdvcmtzCkBAIC0wLDAgKzEsMjggQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUworCitydW5fdHIgKCkKK3sKKwkkRUNITyAtbiAiZWNobyAnJDEnIHwgdHIgJyQyJyAnJDMnOiAiCisJZWNobyAiJDEiIHwgJGJiIHRyICIkMiIgIiQzIgorCWVjaG8KK30KK3RyX3Rlc3QgKCkKK3sKKwlydW5fdHIgImNiYWFiIgkJYWJjIAkJenl4CisJcnVuX3RyICJURVNUSU5HIEEgQiBDIiAJJ1tBLVpdJyAJJ1thLXpdJworCXJ1bl90ciAiYWJjW10iIAkJImFbYiIgCQlBWEIKKwlydW5fdHIgYWJjCQknWzphbHBoYTpdJyAJQS1aQS1aCisJcnVuX3RyIGFiYzU2CQknWzphbG51bTpdJyAJQS1aQS1aeHh4eHh4eHh4eAorCXJ1bl90ciAwMTIJCSdbOmRpZ2l0Ol0nIAlhYmNkZWZnaGkKKwlydW5fdHIgYWJjNTYJCSdbOmxvd2VyOl0nIAknWzp1cHBlcjpdJworCXJ1bl90ciAiIAkiCSdbOnNwYWNlOl0nIAkxMjM0NQorCXJ1bl90ciAiIAkiCSdbOmJsYW5rOl0nIAkxMgorCXJ1bl90ciAnYSBiJwkJJ1s9ID1dJyAJWAorCXJ1bl90ciAiWzoiCQknWzonIAkJYWIKKwlydW5fdHIgIiAJLiw6IgknWzpwdW5jdDpdJwkxMgorCXJ1bl90ciAiIAkuLDoiCSdbOmNudHJsOl0nCTEyCit9CisKK2JiPSAgICAgICAgdHJfdGVzdCA+IGxvZ2ZpbGUuZ251CitiYj1idXN5Ym94IHRyX3Rlc3QgPiBsb2dmaWxlLmJiCitkaWZmIC11IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90cnVlL3RydWUtaXMtc2lsZW50IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3RydWUvdHJ1ZS1pcy1zaWxlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxYmRiMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90cnVlL3RydWUtaXMtc2lsZW50CkBAIC0wLDAgKzEgQEAKK2J1c3lib3ggdHJ1ZSAyPiYxIHwgY21wIC0gL2Rldi9udWxsCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHJ1ZS90cnVlLXJldHVybnMtc3VjY2VzcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS90cnVlL3RydWUtcmV0dXJucy1zdWNjZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjJkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdHJ1ZS90cnVlLXJldHVybnMtc3VjY2VzcwpAQCAtMCwwICsxIEBACitidXN5Ym94IHRydWUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91bWx3cmFwcGVyLnNoIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3VtbHdyYXBwZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU1ZTRkYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91bWx3cmFwcGVyLnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9zaAorCisjIFdyYXBwZXIgZm9yIFVzZXIgTW9kZSBMaW51eCBlbXVsYXRpb24gZW52aXJvbm1lbnQKKworUlVORklMRT0iJChwd2QpLyR7MX0udGVzdHJvb3QiCitpZiBbIC16ICIkUlVORklMRSIgXSB8fCBbICEgLXggIiRSVU5GSUxFIiBdCit0aGVuCisgIGVjaG8gIkNhbid0IHJ1biAnJFJVTkZJTEUnIgorICBleGl0IDEKK2ZpCisKK3NoaWZ0CisKK2lmIFsgLXogJCh3aGljaCBsaW51eCkgXQordGhlbgorICBlY2hvICJObyBVc2VyIE1vZGUgTGludXguIgorICBleGl0IDE7CitmaQorCitsaW51eCByb290ZnN0eXBlPWhvc3RmcyBydyBpbml0PSIkUlVORklMRSIgVEVTVERJUj1gcHdkYCBQQVRIPSIkUEFUSCIgJCogcXVpZXQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91bmV4cGFuZC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91bmV4cGFuZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjMyNmRjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3VuZXhwYW5kLnRlc3RzCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAordGVzdCAtZiAiJGJpbmRpci8uY29uZmlnIiAmJiAuICIkYmluZGlyLy5jb25maWciCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSAxIiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICAgICAxMjM0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgMiIgInVuZXhwYW5kIiBcCisJIlx0IDEyMzQ1Njc4XG4iICIiICIgICAgICAgICAxMjM0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgMyIgInVuZXhwYW5kIiBcCisJIlx0ICAxMjM0NTY3OFxuIiAiIiAiICAgICAgICAgIDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA0IiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICAgIFx0MTIzNDU2NzhcbiIgXAorCit0ZXN0aW5nICJ1bmV4cGFuZCBjYXNlIDUiICJ1bmV4cGFuZCIgXAorCSJcdDEyMzQ1Njc4XG4iICIiICIgICAgICBcdDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA2IiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICBcdDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA3IiAidW5leHBhbmQiIFwKKwkiMTIzXHQgNDU2NzhcbiIgIiIgIjEyMyBcdCA0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgOCIgInVuZXhwYW5kIiBcCisJImEgYlxuIiAiIiAiYSBiXG4iIFwKKwordGVzdCB4IiRDT05GSUdfVU5JQ09ERV9TVVBQT1JUIiA9IHgieSIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUiICE9IHgieSIgXAorJiYgdGVzdGluZyAidW5leHBhbmQgd2l0aCB1bmljb2RlIGNoYXJhY2hlciAweDM5NCIgInVuZXhwYW5kIiBcCisJIjHOlM6UzpQ1XHQ5OTk5OVxuIiAiIiAiMc6UzpTOlDUgICA5OTk5OVxuIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91bmV4cGFuZC91bmV4cGFuZC13b3Jrcy1saWtlLUdOVSBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91bmV4cGFuZC91bmV4cGFuZC13b3Jrcy1saWtlLUdOVQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI1ODM2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3VuZXhwYW5kL3VuZXhwYW5kLXdvcmtzLWxpa2UtR05VCkBAIC0wLDAgKzEsNTIgQEAKK3JtIC1mIGZvbyBiYXIKK2VjaG8gIiAgICAgICB5IiB8IHVuZXhwYW5kIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICB5IiB8IGJ1c3lib3ggdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCitybSAtZiBmb28gYmFyCitlY2hvICIgICAgICAgIHkiIHwgdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGZvbworZWNobyAiICAgICAgICB5IiB8IGJ1c3lib3ggdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCitlY2hvICIgICAgICAgeSAgICAgICB5IiB8IHVuZXhwYW5kIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICB5ICAgICAgIHkiIHwgYnVzeWJveCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKK3JtIC1mIGZvbyBiYXIKK2VjaG8gIiAgICAgICAgeSAgICAgICAgeSIgfCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gZm9vCitlY2hvICIgICAgICAgIHkgICAgICAgIHkiIHwgYnVzeWJveCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKK2VjaG8gIiAgICAgICB5ICAgICAgIHkiIHwgdW5leHBhbmQgLWEgLi4vLi4vYnVzeWJveCA+IGZvbworZWNobyAiICAgICAgIHkgICAgICAgeSIgfCBidXN5Ym94IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBiYXIKK3NldCArZQordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKK2lmIFsgJD8gPSAwIF0gOyB0aGVuCisJc2V0IC1lCisJZGlmZiAtcSBmb28gYmFyCitmaQorcm0gLWYgZm9vIGJhcgorZWNobyAiICAgICAgICB5ICAgICAgICB5IiB8IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICAgeSAgICAgICAgeSIgfCBidXN5Ym94IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBiYXIKK3NldCArZQordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKK2lmIFsgJD8gPSAwIF0gOyB0aGVuCisJc2V0IC1lCisJZGlmZiAtcSBmb28gYmFyCitmaQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3VuaXEudGVzdHMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdW5pcS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44M2JmMzgyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3VuaXEudGVzdHMKQEAgLTAsMCArMSw4NyBAQAorIyEvYmluL3NoCisKKyMgU1VTdjMgY29tcGxpYW50IHVuaXEgdGVzdHMuCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6IEZ1bGwgU1VTdjMgY292ZXJhZ2UgKGV4Y2VwdCBpbnRlcm5hdGlvbmFsaXphdGlvbikuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIFRlc3QgZXhpdCBzdGF0dXMKKwordGVzdGluZyAidW5pcSAoZXhpdCB3aXRoIGVycm9yKSIgInVuaXEgbm9uZXhpc3RlbnQgMj4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiBcCisJInllc1xuIiAiIiAiIgordGVzdGluZyAidW5pcSAoZXhpdCBzdWNjZXNzKSIgInVuaXEgL2Rldi9udWxsICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCisKKyMgVGVzdCB2YXJpb3VzIGRhdGEgc291cmNlcyBhbmQgZGVzdGluYXRpb25zCisKK3Rlc3RpbmcgInVuaXEgKGRlZmF1bHQgdG8gc3RkaW4pIiAidW5pcSIgIm9uZVxudHdvXG50aHJlZVxuIiAiIiBcCisJIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIKK3Rlc3RpbmcgInVuaXEgLSAoc3BlY2lmeSBzdGRpbikiICJ1bmlxIC0iICJvbmVcbnR3b1xudGhyZWVcbiIgIiIgXAorCSJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCit0ZXN0aW5nICJ1bmlxIGlucHV0IChzcGVjaWZ5IGZpbGUpIiAidW5pcSBpbnB1dCIgIm9uZVxudHdvXG50aHJlZVxuIiBcCisJIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKKwordGVzdGluZyAidW5pcSBpbnB1dCBvdXRmaWxlICh0d28gZmlsZXMpIiAidW5pcSBpbnB1dCBhY3R1YWwgPiAvZGV2L251bGwiIFwKKwkib25lXG50d29cbnRocmVlXG4iICJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iICIiCit0ZXN0aW5nICJ1bmlxIChzdGRpbikgb3V0ZmlsZSIgInVuaXEgLSBhY3R1YWwiIFwKKwkib25lXG50d29cbnRocmVlXG4iICIiICJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCisjIE5vdGU6IFNVU3YzIGRvZXNuJ3Qgc2VlbSB0byByZXF1aXJlIHN1cHBvcnQgZm9yICItIiBvdXRwdXQsIGJ1dCB3ZSBkbyBhbnl3YXkuCit0ZXN0aW5nICJ1bmlxIGlucHV0IC0gKHNwZWNpZnkgc3Rkb3V0KSIgInVuaXEgaW5wdXQgLSIgXAorCSJvbmVcbnR3b1xudGhyZWVcbiIgIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKKworCisjLWYgc2tpcCBmaWVsZHMKKyMtcyBza2lwIGNoYXJzCisjLWMgb2NjdXJyZW5jZXMKKyMtZCBkdXBzIG9ubHkKKyMtdQorIy13IG1heCBjaGFycworCisjIFRlc3QgdmFyaW91cyBjb21tYW5kIGxpbmUgb3B0aW9ucworCisjIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBhIG1pbm9yIHRlY2huaWNhbCB2aW9sYXRpb24gb2YgdGhlIHNwZWMsCisjIGJ1dCBzaW5jZSBnbnUgZG9lcyBpdC4uLgordGVzdGluZyAidW5pcSAtYyAob2NjdXJyZW5jZSBjb3VudCkiICJ1bmlxIC1jIHwgc2VkICdzL15bIFx0XSovLyciIFwKKwkiMSBvbmVcbjIgdHdvXG4zIHRocmVlXG4iICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgordGVzdGluZyAidW5pcSAtZCAoZHVwcyBvbmx5KSIgInVuaXEgLWQiICJ0d29cbnRocmVlXG4iICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgorCit0ZXN0aW5nICJ1bmlxIC1mIC1zIChza2lwIGZpZWxkcyBhbmQgY2hhcnMpIiAidW5pcSAtZjIgLXMgMyIgXAorImNjCWRkCWVlOAorYWEJYmIJY2M5CisiICIiIFwKKyJjYwlkZAllZTgKK2JiCWNjCWRkOAorYWEJYmIJY2M5CisiCit0ZXN0aW5nICJ1bmlxIC13IChjb21wYXJlIG1heCBjaGFyYWN0ZXJzKSIgInVuaXEgLXcgMiIgXAorImNjMQorIiAiIiBcCisiY2MxCitjYzIKK2NjMworIgorCit0ZXN0aW5nICJ1bmlxIC1zIC13IChza2lwIGZpZWxkcyBhbmQgY29tcGFyZSBtYXggY2hhcnMpIiBcCisidW5pcSAtcyAyIC13IDIiIFwKKyJhYWNjYWEKKyIgIiIgXAorImFhY2NhYQorYWFjY2JiCitiYmNjYWEKKyIKKworIyAtZCBpcyAiU3VwcHJlc3MgdGhlIHdyaXRpbmcgZm8gbGluZXMgdGhhdCBhcmUgbm90IHJlcGVhdGVkIGluIHRoZSBpbnB1dC4iCisjIC11IGlzICJTdXBwcmVzcyB0aGUgd3JpdGluZyBvZiBsaW5lcyB0aGF0IGFyZSByZXBlYXRlZCBpbiB0aGUgaW5wdXQuIgorIyBUaGVyZWZvcmUsIHRvZ2V0aGVyIHRoaXMgbWVhbnMgdGhleSBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQuCit0ZXN0aW5nICJ1bmlxIC11IGFuZCAtZCBwcm9kdWNlIG5vIG91dHB1dCIgInVuaXEgLWQgLXUiICIiICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91bnppcC50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91bnppcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Njc3YTAzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3VuemlwLnRlc3RzCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorCisjIFRlc3RzIGZvciB1bnppcC4KKyMgQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyMgQ29weXJpZ2h0IDIwMDYgR2xlbm4gTWNHcmF0aAorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjICAgZmlsZSBpbnB1dCB3aWxsIGJlIGZpbGUgY2FsbGVkICJpbnB1dCIKKyMgICB0ZXN0IGNhbiBjcmVhdGUgYSBmaWxlICJhY3R1YWwiIGluc3RlYWQgb2Ygd3JpdGluZyB0byBzdGRvdXQKKworIyBDcmVhdGUgYSBzY3JhdGNoIGRpcmVjdG9yeQorCitta2RpciB0ZW1wCitjZCB0ZW1wCisKKyMgQ3JlYXRlIHRlc3QgZmlsZSB0byB3b3JrIHdpdGguCisKK21rZGlyIGZvbwordG91Y2ggZm9vL2JhcgoremlwIGZvby56aXAgZm9vIGZvby9iYXIgPiAvZGV2L251bGwKK3JtIC1mIGZvby9iYXIKK3JtZGlyIGZvbworCisjIFRlc3QgdGhhdCB1bnppcHBpbmcganVzdCBmb28gZG9lc24ndCBjcmVhdGUgYmFyLgordGVzdGluZyAidW56aXAgKHN1YmRpciBvbmx5KSIgInVuemlwIC1xIGZvby56aXAgZm9vLyAmJiB0ZXN0IC1kIGZvbyAmJiB0ZXN0ICEgLWYgZm9vL2JhciAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorCitybWRpciBmb28KK3JtIGZvby56aXAKKworIyBDbGVhbiB1cCBzY3JhdGNoIGRpcmVjdG9yeS4KKworY2QgLi4KK3JtIC1yZiB0ZW1wCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3VwdGltZS91cHRpbWUtd29ya3MgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvdXB0aW1lL3VwdGltZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjE2OGFiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3VwdGltZS91cHRpbWUtd29ya3MKQEAgLTAsMCArMSBAQAorYnVzeWJveCB1cHRpbWUKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91dWVuY29kZS50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS91dWVuY29kZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZDYxOTFiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3V1ZW5jb2RlLnRlc3RzCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorCisjIHVuaXQgdGVzdCBmb3IgdXVlbmNvZGUgdG8gdGVzdCBmdW5jdGlvbmFsaXR5LgorIyBDb3B5cmlnaHQgMjAwNiBieSBFcmlrIEhvdmxhbmQgPGVyaWtAaG92bGFuZC5vcmc+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6IFVuaXQgdGVzdHMgZm9yIHV1ZW5jb2RlCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIFRlc3Qgc2V0dXAgb2Ygc3RhbmRhcmQgaW5wdXQKK3VtYXNrIDAKK3Rlc3RpbmcgInV1ZW5jb2RlIHNldHMgc3RhbmRhcmQgaW5wdXQgbW9kZSBjb3JyZWN0bHkiIFwKKyAgICAgICAgInV1ZW5jb2RlIGZvbyA8L2Rldi9udWxsIHwgaGVhZCAtbiAxIHwgZ3JlcCAtcSA2NjYgJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3VtYXNrIDAyMgorCit0ZXN0aW5nICJ1dWVuY29kZSBjb3JyZWN0IGVuY29kaW5nIiAidXVlbmNvZGUgYmJfdXVlbmNfdGVzdC5vdXQiIFwKKyJiZWdpbiA2NDQgYmJfdXVlbmNfdGVzdC5vdXRcbk01JkFFKCY5QTxXMEA5VylFPjIhRjtXQEA6RzVNPCY1RCgmXVY5NyhAPSZBRSgmUUE+R0RAOEcpTz1WWEBcbiU5Jl1HK0BIXGBcblxgXG5lbmRcbiIgXAorICAgICAgICAiIiAiVGhlIGZhc3QgZ3JleSBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgYnJvd24gZG9nLlxuIgordGVzdGluZyAidXVlbmNvZGUgY29ycmVjdCBiYXNlNjQgZW5jb2RpbmciICJ1dWVuY29kZSAtbSBiYl91dWVuY190ZXN0Lm91dCIgXAorImJlZ2luLWJhc2U2NCA2NDQgYmJfdXVlbmNfdGVzdC5vdXRcblZHaGxJR1poYzNRZ1ozSmxlU0JtYjNnZ2FuVnRjR1ZrSUc5MlpYSWdkR2hsSUd4aGVua2dZbkp2ZDI0Z1xuWkc5bkxnbz1cbj09PT1cbiIgXAorICAgICAgICAiIiAiVGhlIGZhc3QgZ3JleSBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgYnJvd24gZG9nLlxuIgorZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWFsbCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtYWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODM2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWFsbApAQCAtMCwwICsxLDIgQEAKKyMgMSBsaW5lLCA0IHdvcmRzLCAyMCBjaGFycy4KK3Rlc3QgImBlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90IHwgYnVzeWJveCB3YyB8IHNlZCAncy8gICovIC9nJyB8IHNlZCAncy9eIC8vJ2AiID0gJzEgNCAyMCcKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtY2hhcmFjdGVycyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtY2hhcmFjdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU4NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3djL3djLWNvdW50cy1jaGFyYWN0ZXJzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgYGVjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgfCBidXN5Ym94IHdjIC1jYCAtZXEgMjAKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtbGluZXMgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWxpbmVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTZlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWxpbmVzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgYGVjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgfCBidXN5Ym94IHdjIC1sYCAtZXEgMQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3djL3djLWNvdW50cy13b3JkcyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtd29yZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxNjUwZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtd29yZHMKQEAgLTAsMCArMSBAQAordGVzdCBgZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCB8IGJ1c3lib3ggd2MgLXdgIC1lcSA0CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2Mvd2MtcHJpbnRzLWxvbmdlc3QtbGluZS1sZW5ndGggYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2Mvd2MtcHJpbnRzLWxvbmdlc3QtbGluZS1sZW5ndGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4MzFmYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Yy93Yy1wcmludHMtbG9uZ2VzdC1saW5lLWxlbmd0aApAQCAtMCwwICsxIEBACit0ZXN0IGBlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90IHwgYnVzeWJveCB3YyAtTGAgLWVxIDE5CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2dldC93Z2V0LS1PLW92ZXJyaWRlcy0tUCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtLU8tb3ZlcnJpZGVzLS1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTNhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2dldC93Z2V0LS1PLW92ZXJyaWRlcy0tUApAQCAtMCwwICsxLDUgQEAKK3Rlc3QgeCIkU0tJUF9JTlRFUk5FVF9URVNUUyIgIT0geCIiICYmIGV4aXQKKworbWtkaXIgZm9vCitidXN5Ym94IHdnZXQgLXEgLU8gaW5kZXguaHRtbCAtUCBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBpbmRleC5odG1sCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2dldC93Z2V0LWhhbmRsZXMtZW1wdHktcGF0aCBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtaGFuZGxlcy1lbXB0eS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDYwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2dldC93Z2V0LWhhbmRsZXMtZW1wdHktcGF0aApAQCAtMCwwICsxLDMgQEAKK3Rlc3QgeCIkU0tJUF9JTlRFUk5FVF9URVNUUyIgIT0geCIiICYmIGV4aXQKKworYnVzeWJveCB3Z2V0IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3dnZXQvd2dldC1yZXRyaWV2ZXMtZ29vZ2xlLWluZGV4IGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3dnZXQvd2dldC1yZXRyaWV2ZXMtZ29vZ2xlLWluZGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZGJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2dldC93Z2V0LXJldHJpZXZlcy1nb29nbGUtaW5kZXgKQEAgLTAsMCArMSw0IEBACit0ZXN0IHgiJFNLSVBfSU5URVJORVRfVEVTVFMiICE9IHgiIiAmJiBleGl0CisKK2J1c3lib3ggd2dldCAtcSAtTyBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBmb28KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtc3VwcG9ydHMtLVAgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2dldC93Z2V0LXN1cHBvcnRzLS1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTRhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2dldC93Z2V0LXN1cHBvcnRzLS1QCkBAIC0wLDAgKzEsNSBAQAordGVzdCB4IiRTS0lQX0lOVEVSTkVUX1RFU1RTIiAhPSB4IiIgJiYgZXhpdAorCitta2RpciBmb28KK2J1c3lib3ggd2dldCAtcSAtUCBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBmb28vaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3doaWNoL3doaWNoLXVzZXMtZGVmYXVsdC1wYXRoIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3doaWNoL3doaWNoLXVzZXMtZGVmYXVsdC1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzY2ViOWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUvd2hpY2gvd2hpY2gtdXNlcy1kZWZhdWx0LXBhdGgKQEAgLTAsMCArMSw0IEBACitCVVNZQk9YPSQodHlwZSAtcCBidXN5Ym94KQorU0FWRURfUEFUSD0kUEFUSAordW5zZXQgUEFUSAorJEJVU1lCT1ggd2hpY2ggbHMKZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS94YXJncy50ZXN0cyBiL2J1c3lib3gtMS4xOS4zL3Rlc3RzdWl0ZS94YXJncy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZDBhMjAxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3hhcmdzLnRlc3RzCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgInhhcmdzIC1FIF8gc3RvcHMgb24gdW5kZXJzY29yZSIgXAorCSJ4YXJncyAtRSBfIiBcCisJImFcbiIgXAorCSIiICJhXG5fXG5iXG4iCisKK3Rlc3RpbmcgInhhcmdzIC1FICcnIiBcCisJInhhcmdzIC1FICcnIiBcCisJImEgXyBiXG4iIFwKKwkiIiAiYVxuX1xuYlxuIgorCit0ZXN0aW5nICJ4YXJncyAtZSB3aXRob3V0IHBhcmFtIiBcCisJInhhcmdzIC1lIiBcCisJImEgXyBiXG4iIFwKKwkiIiAiYVxuX1xuYlxuIgorCit0ZXN0aW5nICJ4YXJncyBkb2VzIG5vdCBzdG9wIG9uIHVuZGVyc2NvcmUgKCduZXcnIEdOVSBiZWhhdmlvcikiIFwKKwkieGFyZ3MiIFwKKwkiYSBfIGJcbiIgXAorCSIiICJhXG5fXG5iXG4iCisKK3Rlc3RpbmcgInhhcmdzIC1zNyBjYW4gdGFrZSBvbmUtY2hhciBpbnB1dCIgXAorCSJ4YXJncyAtczcgZWNobyIgXAorCSJhXG4iIFwKKwkiIiAiYVxuIgorCit0ZXN0aW5nICJ4YXJncyAtc05VTSB0ZXN0IDEiIFwKKwkieGFyZ3MgLXRzMjUgZWNobyAyPiYxID4vZGV2L251bGwiIFwKKwkiZWNobyAxIDIgMyA0IDUgNiA3IDggOSAwXG4iImVjaG8gMSAyIDMgNCA1IDYgNyA4IDlcbiIiZWNobyAwMFxuIiBcCisJIiIgIjEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMDBcbiIKKwordGVzdGluZyAieGFyZ3MgLXNOVU0gdGVzdCAyIiBcCisJInhhcmdzIC10czI1IGVjaG8gMSAyPiYxID4vZGV2L251bGwiIFwKKwkiZWNobyAxIDIgMyA0IDUgNiA3IDggOSAwXG4iImVjaG8gMSAyIDMgNCA1IDYgNyA4IDlcbiIiZWNobyAxIDAwXG4iIFwKKwkiIiAiMiAzIDQgNSA2IDcgOCA5IDAgMiAzIDQgNSA2IDcgOCA5IDAwXG4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3hhcmdzL3hhcmdzLXdvcmtzIGIvYnVzeWJveC0xLjE5LjMvdGVzdHN1aXRlL3hhcmdzL3hhcmdzLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTg2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy90ZXN0c3VpdGUveGFyZ3MveGFyZ3Mtd29ya3MKQEAgLTAsMCArMSw0IEBACitbIC1uICIkZCIgXSB8fCBkPS4uCitmaW5kICIkZCIgLW5hbWUgXCp3b3JrcyAtdHlwZSBmIHwgeGFyZ3MgbWQ1c3VtID4gbG9nZmlsZS5nbnUKK2ZpbmQgIiRkIiAtbmFtZSBcKndvcmtzIC10eXBlIGYgfCBidXN5Ym94IHhhcmdzIG1kNXN1bSA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9Db25maWcuc3JjIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDU3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L0NvbmZpZy5zcmMKQEAgLTAsMCArMSw5NzUgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxpbnV4IFN5c3RlbSBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgQUNQSUQKKwlib29sICJhY3BpZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBhY3BpZCBsaXN0ZW5zIHRvIEFDUEkgZXZlbnRzIGNvbWluZyBlaXRoZXIgaW4gdGV4dHVhbCBmb3JtIGZyb20KKwkgIC9wcm9jL2FjcGkvZXZlbnQgKHRob3VnaCBpdCBpcyBtYXJrZWQgZGVwcmVjYXRlZCBpdCBpcyBzdGlsbCB3aWRlbHkKKwkgIHVzZWQgYW5kIF9pc18gYSBzdGFuZGFyZCkgb3IgaW4gYmluYXJ5IGZvcm0gZnJvbSBzcGVjaWZpZWQgZXZkZXZzCisJICAoanVzdCB1c2UgL2Rldi9pbnB1dC9ldmVudCopLgorCisJICBJdCBwYXJzZXMgdGhlIGV2ZW50IHRvIHJldHJpZXZlIEFDVElPTiBhbmQgYSBwb3NzaWJsZSBQQVJBTUVURVIuCisJICBJdCB0aGVuIHNwYXducyAvZXRjL2FjcGkvPEFDVElPTj5bLzxQQVJBTUVURVI+XSBlaXRoZXIgdmlhIHJ1bi1wYXJ0cworCSAgKGlmIHRoZSByZXN1bHRpbmcgcGF0aCBpcyBhIGRpcmVjdG9yeSkgb3IgZGlyZWN0bHkgYXMgYW4gZXhlY3V0YWJsZS4KKworCSAgTi5CLiBhY3BpZCByZWxpZXMgb24gcnVuLXBhcnRzIHNvIGhhdmUgdGhlIGxhdHRlciBpbnN0YWxsZWQuCisKK2NvbmZpZyBGRUFUVVJFX0FDUElEX0NPTVBBVAorCWJvb2wgIkFjY2VwdCBhbmQgaWdub3JlIHJlZHVuZGFudCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQUNQSUQKKwloZWxwCisJICBBY2NlcHQgYW5kIGlnbm9yZSBjb21wYXRpYmlsaXR5IG9wdGlvbnMgLWcgLW0gLXMgLVMgLXYuCisKK2NvbmZpZyBCTEtJRAorCWJvb2wgImJsa2lkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBWT0xVTUVJRAorCWhlbHAKKwkgIExpc3RzIGxhYmVscyBhbmQgVVVJRHMgb2YgYWxsIGZpbGVzeXN0ZW1zLgorCSAgV0FSTklORzoKKwkgIFdpdGggYWxsIHN1Ym1vZHVsZXMgc2VsZWN0ZWQsIGl0IHdpbGwgYWRkIH44ayB0byBidXN5Ym94LgorCitjb25maWcgRkVBVFVSRV9CTEtJRF9UWVBFCisJYm9vbCAiUHJpbnQgZmlsZXN5c3RlbSB0eXBlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQkxLSUQKKwloZWxwCisJICBTaG93IFRZUEU9ImZpbGVzeXN0ZW0gdHlwZSIKKworY29uZmlnIERNRVNHCisJYm9vbCAiZG1lc2ciCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZG1lc2cgaXMgdXNlZCB0byBleGFtaW5lIG9yIGNvbnRyb2wgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlci4gV2hlbiB0aGUKKwkgIExpbnV4IGtlcm5lbCBwcmludHMgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2csIHRoZXkgYXJlIHN0b3JlZCBpbgorCSAgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlci4gWW91IGNhbiB1c2UgZG1lc2cgdG8gcHJpbnQgdGhlIGtlcm5lbCdzIHJpbmcKKwkgIGJ1ZmZlciwgY2xlYXIgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlciwgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBrZXJuZWwKKwkgIHJpbmcgYnVmZmVyLCBhbmQgY2hhbmdlIHRoZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCBrZXJuZWwgbWVzc2FnZXMKKwkgIGFyZSBhbHNvIGxvZ2dlZCB0byB0aGUgc3lzdGVtIGNvbnNvbGUuIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3UKKwkgIHdpc2ggdG8gZW5hYmxlIHRoZSAnZG1lc2cnIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0RNRVNHX1BSRVRUWQorCWJvb2wgIlByZXR0eSBkbWVzZyBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBETUVTRworCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIHNjcnViIHRoZSBzeXNsb2cgbGV2ZWwgZnJvbSB0aGUgb3V0cHV0LCBzYXkgJ1knIGhlcmUuCisJICBUaGUgc3lzbG9nIGxldmVsIGlzIGEgc3RyaW5nIHByZWZpeGVkIHRvIGV2ZXJ5IGxpbmUgd2l0aCB0aGUgZm9ybQorCSAgIjwjPiIuCisKKwkgIFdpdGggdGhpcyBvcHRpb24geW91IHdpbGwgc2VlOgorCSAgICAjIGRtZXNnCisJICAgIExpbnV4IHZlcnNpb24gMi42LjE3LjQgLi4uLi4KKwkgICAgQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgorCSAgICAgQklPUy1lODIwOiAwMDAwMDAwMDAwMDAwMDAwIC0gMDAwMDAwMDAwMDA5ZjAwMCAodXNhYmxlKQorCisJICBXaXRob3V0IHRoaXMgb3B0aW9uIHlvdSB3aWxsIHNlZToKKwkgICAgIyBkbWVzZworCSAgICA8NT5MaW51eCB2ZXJzaW9uIDIuNi4xNy40IC4uLi4uCisJICAgIDw2PkJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoKKwkgICAgPDY+IEJJT1MtZTgyMDogMDAwMDAwMDAwMDAwMDAwMCAtIDAwMDAwMDAwMDAwOWYwMDAgKHVzYWJsZSkKKworY29uZmlnIEZCU0VUCisJYm9vbCAiZmJzZXQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZmJzZXQgaXMgdXNlZCB0byBzaG93IG9yIGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgYSBMaW51eCBmcmFtZSBidWZmZXIKKwkgIGRldmljZS4gVGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgcHJvdmlkZXMgYSBzaW1wbGUgYW5kIHVuaXF1ZQorCSAgaW50ZXJmYWNlIHRvIGFjY2VzcyBhIGdyYXBoaWNzIGRpc3BsYXkuIEVuYWJsZSB0aGlzIG9wdGlvbgorCSAgaWYgeW91IHdpc2ggdG8gZW5hYmxlIHRoZSAnZmJzZXQnIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0ZCU0VUX0ZBTkNZCisJYm9vbCAiVHVybiBvbiBleHRyYSBmYnNldCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkJTRVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGV4dGVuZGVkIGZic2V0IG9wdGlvbnMsIGFsbG93aW5nIG9uZSB0byBzZXQgdGhlCisJICBmcmFtZWJ1ZmZlciBzaXplLCBjb2xvciBkZXB0aCwgZXRjLiBpbnRlcmZhY2UgdG8gYWNjZXNzIGEgZ3JhcGhpY3MKKwkgIGRpc3BsYXkuIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byBlbmFibGUgZXh0ZW5kZWQgZmJzZXQKKwkgIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX0ZCU0VUX1JFQURNT0RFCisJYm9vbCAiVHVybiBvbiBmYnNldCByZWFkbW9kZSBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkJTRVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgZmJzZXQgdG8gcmVhZCB0aGUgdmlkZW8gbW9kZSBkYXRhYmFzZSBzdG9yZWQgYnkKKwkgIGRlZmF1bHQgYXMgL2V0Yy9mYi5tb2Rlcywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2V0IGZyYW1lIGJ1ZmZlcgorCSAgZGV2aWNlIHRvIHByZS1kZWZpbmVkIHZpZGVvIG1vZGVzLgorCitjb25maWcgRkRGTFVTSAorCWJvb2wgImZkZmx1c2giCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZmRmbHVzaCBpcyBvbmx5IG5lZWRlZCB3aGVuIGNoYW5naW5nIG1lZGlhIG9uIHNsaWdodGx5LWJyb2tlbgorCSAgcmVtb3ZhYmxlIG1lZGlhIGRyaXZlcy4gSXQgaXMgdXNlZCB0byBtYWtlIExpbnV4IGJlbGlldmUgdGhhdCBhCisJICBoYXJkd2FyZSBkaXNrLWNoYW5nZSBzd2l0Y2ggaGFzIGJlZW4gYWN0dWF0ZWQsIHdoaWNoIGNhdXNlcyBMaW51eCB0bworCSAgZm9yZ2V0IGFueXRoaW5nIGl0IGhhcyBjYWNoZWQgZnJvbSB0aGUgcHJldmlvdXMgbWVkaWEuIElmIHlvdSBoYXZlCisJICBzdWNoIGEgc2xpZ2h0bHktYnJva2VuIGRyaXZlLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBmZGZsdXNoIGV2ZXJ5IHRpbWUKKwkgIHlvdSBjaGFuZ2UgYSBkaXNrLiBNb3N0IHBlb3BsZSBoYXZlIHdvcmtpbmcgaGFyZHdhcmUgYW5kIGNhbiBzYWZlbHkKKwkgIGxlYXZlIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBGREZPUk1BVAorCWJvb2wgImZkZm9ybWF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGZkZm9ybWF0IGlzIHVzZWQgdG8gbG93LWxldmVsIGZvcm1hdCBhIGZsb3BweSBkaXNrLgorCitjb25maWcgRkRJU0sKKwlib29sICJmZGlzayIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgZmRpc2sgdXRpbGl0eSBpcyB1c2VkIHRvIGRpdmlkZSBoYXJkIGRpc2tzIGludG8gb25lIG9yIG1vcmUKKwkgIGxvZ2ljYWwgZGlza3MsIHdoaWNoIGFyZSBnZW5lcmFsbHkgY2FsbGVkIHBhcnRpdGlvbnMuIFRoaXMgdXRpbGl0eQorCSAgY2FuIGJlIHVzZWQgdG8gbGlzdCBhbmQgZWRpdCB0aGUgc2V0IG9mIHBhcnRpdGlvbnMgb3IgQlNEIHN0eWxlCisJICAnZGlzayBzbGljZXMnIHRoYXQgYXJlIGRlZmluZWQgb24gYSBoYXJkIGRyaXZlLgorCitjb25maWcgRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUworCWJvb2wgIlN1cHBvcnQgb3ZlciA0R0IgZGlza3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRElTSworCWRlcGVuZHMgb24gIUxGUyAgICMgd2l0aCBMRlMgbm8gc3BlY2lhbCBjb2RlIGlzIG5lZWRlZAorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBzdXBwb3J0IGxhcmdlIGRpc2tzID4gNEdCLgorCitjb25maWcgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWJvb2wgIldyaXRlIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRElTSworCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIG9yIGNoYW5nZSBhIHBhcnRpdGlvbiB0YWJsZQorCSAgYW5kIHdyaXRlIHRob3NlIGNoYW5nZXMgb3V0IHRvIGRpc2suIElmIHlvdSBsZWF2ZSB0aGlzIG9wdGlvbgorCSAgZGlzYWJsZWQsIHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byB2aWV3IHRoZSBwYXJ0aXRpb24gdGFibGUuCisKK2NvbmZpZyBGRUFUVVJFX0FJWF9MQUJFTAorCWJvb2wgIlN1cHBvcnQgQUlYIGRpc2tsYWJlbHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRElTSyAmJiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgb3IgY2hhbmdlIEFJWCBkaXNrbGFiZWxzLgorCSAgTW9zdCBwZW9wbGUgY2FuIHNhZmVseSBsZWF2ZSB0aGlzIG9wdGlvbiBkaXNhYmxlZC4KKworY29uZmlnIEZFQVRVUkVfU0dJX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBTR0kgZGlza2xhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNyZWF0ZSBvciBjaGFuZ2UgU0dJIGRpc2tsYWJlbHMuCisJICBNb3N0IHBlb3BsZSBjYW4gc2FmZWx5IGxlYXZlIHRoaXMgb3B0aW9uIGRpc2FibGVkLgorCitjb25maWcgRkVBVFVSRV9TVU5fTEFCRUwKKwlib29sICJTdXBwb3J0IFNVTiBkaXNrbGFiZWxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkRJU0sgJiYgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIG9yIGNoYW5nZSBTVU4gZGlza2xhYmVscy4KKwkgIE1vc3QgcGVvcGxlIGNhbiBzYWZlbHkgbGVhdmUgdGhpcyBvcHRpb24gZGlzYWJsZWQuCisKK2NvbmZpZyBGRUFUVVJFX09TRl9MQUJFTAorCWJvb2wgIlN1cHBvcnQgQlNEIGRpc2tsYWJlbHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRElTSyAmJiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgb3IgY2hhbmdlIEJTRCBkaXNrbGFiZWxzCisJICBhbmQgZGVmaW5lIGFuZCBlZGl0IEJTRCBkaXNrIHNsaWNlcy4KKworY29uZmlnIEZFQVRVUkVfR1BUX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBHUFQgZGlza2xhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHZpZXcgR1VJRCBQYXJ0aXRpb24gVGFibGUKKwkgIGRpc2tsYWJlbHMuCisKK2NvbmZpZyBGRUFUVVJFX0ZESVNLX0FEVkFOQ0VECisJYm9vbCAiU3VwcG9ydCBleHBlcnQgbW9kZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGRvIHRlcnJpYmx5IHVuc2FmZSB0aGluZ3MgbGlrZQorCSAgZGVmaW5lIGFyYml0cmFyeSBkcml2ZSBnZW9tZXRyeSwgbW92ZSB0aGUgYmVnaW5uaW5nIG9mIGRhdGEgaW4gYQorCSAgcGFydGl0aW9uLCBhbmQgc2ltaWxhcmx5IGV2aWwgdGhpbmdzLiBVbmxlc3MgeW91IGhhdmUgYSB2ZXJ5IGdvb2QKKwkgIHJlYXNvbiB5b3Ugd291bGQgYmUgd2lzZSB0byBsZWF2ZSB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRklOREZTCisJYm9vbCAiZmluZGZzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBWT0xVTUVJRAorCWhlbHAKKwkgIFByaW50cyB0aGUgbmFtZSBvZiBhIGZpbGVzeXN0ZW0gd2l0aCBnaXZlbiBsYWJlbCBvciBVVUlELgorCSAgV0FSTklORzoKKwkgIFdpdGggYWxsIHN1Ym1vZHVsZXMgc2VsZWN0ZWQsIGl0IHdpbGwgYWRkIH44ayB0byBidXN5Ym94LgorCitjb25maWcgRkxPQ0sKKwlib29sICJmbG9jayIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYW5hZ2UgbG9ja3MgZnJvbSBzaGVsbCBzY3JpcHRzCisKK2NvbmZpZyBGUkVFUkFNRElTSworCWJvb2wgImZyZWVyYW1kaXNrIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIExpbnV4IGFsbG93cyB5b3UgdG8gY3JlYXRlIHJhbWRpc2tzLiBUaGlzIHV0aWxpdHkgYWxsb3dzIHlvdSB0bworCSAgZGVsZXRlIHRoZW0gYW5kIGNvbXBsZXRlbHkgZnJlZSBhbGwgbWVtb3J5IHRoYXQgd2FzIHVzZWQgZm9yIHRoZQorCSAgcmFtZGlzay4gRm9yIGV4YW1wbGUsIGlmIHlvdSBib290IExpbnV4IGludG8gYSByYW1kaXNrIGFuZCBsYXRlcgorCSAgcGl2b3Rfcm9vdCwgeW91IG1heSB3YW50IHRvIGZyZWUgdGhlIG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCB0byB0aGUKKwkgIHJhbWRpc2suIElmIHlvdSBoYXZlIG5vIHVzZSBmb3IgZnJlZWluZyBtZW1vcnkgZnJvbSBhIHJhbWRpc2ssIGxlYXZlCisJICB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRlNDS19NSU5JWAorCWJvb2wgImZzY2tfbWluaXgiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIG1pbml4IGZpbGVzeXN0ZW0gaXMgYSBuaWNlLCBzbWFsbCwgY29tcGFjdCwgcmVhZC13cml0ZSBmaWxlc3lzdGVtCisJICB3aXRoIGxpdHRsZSBvdmVyaGVhZC4gSXQgaXMgbm90IGEgam91cm5hbGluZyBmaWxlc3lzdGVtIGhvd2V2ZXIgYW5kCisJICBjYW4gZXhwZXJpZW5jZSBjb3JydXB0aW9uIGlmIGl0IGlzIG5vdCBwcm9wZXJseSB1bm1vdW50ZWQgb3IgaWYgdGhlCisJICBwb3dlciBnb2VzIG9mZiBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuIFRoaXMgdXRpbGl0eSBhbGxvd3MgeW91IHRvCisJICBjaGVjayBmb3IgYW5kIGF0dGVtcHQgdG8gcmVwYWlyIGFueSBjb3JydXB0aW9uIHRoYXQgb2NjdXJzIHRvIGEgbWluaXgKKwkgIGZpbGVzeXN0ZW0uCisKK2NvbmZpZyBNS0ZTX0VYVDIKKwlib29sICJta2ZzX2V4dDIiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVXRpbGl0eSB0byBjcmVhdGUgRVhUMiBmaWxlc3lzdGVtcy4KKworY29uZmlnIE1LRlNfTUlOSVgKKwlib29sICJta2ZzX21pbml4IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBtaW5peCBmaWxlc3lzdGVtIGlzIGEgbmljZSwgc21hbGwsIGNvbXBhY3QsIHJlYWQtd3JpdGUgZmlsZXN5c3RlbQorCSAgd2l0aCBsaXR0bGUgb3ZlcmhlYWQuIElmIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gY3JlYXRlIG1pbml4CisJICBmaWxlc3lzdGVtcyB0aGlzIHV0aWxpdHkgd2lsbCBkbyB0aGUgam9iIGZvciB5b3UuCisKK2NvbmZpZyBGRUFUVVJFX01JTklYMgorCWJvb2wgIlN1cHBvcnQgTWluaXggZnMgdjIgKGZzY2tfbWluaXgvbWtmc19taW5peCkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGU0NLX01JTklYIHx8IE1LRlNfTUlOSVgKKwloZWxwCisJICBJZiB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIGNyZWF0ZSB2ZXJzaW9uIDIgbWluaXggZmlsZXN5c3RlbXMsIGVuYWJsZQorCSAgdGhpcy4gSWYgeW91IGVuYWJsZWQgJ21rZnNfbWluaXgnIHRoZW4geW91IGFsbW9zdCBjZXJ0YWlubHkgd2FudCB0bworCSAgYmUgdXNpbmcgdGhlIHZlcnNpb24gMiBmaWxlc3lzdGVtIHN1cHBvcnQuCisKK2NvbmZpZyBNS0ZTX1JFSVNFUgorCWJvb2wgIm1rZnNfcmVpc2VyIgorCWRlZmF1bHQgbgorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFV0aWxpdHkgdG8gY3JlYXRlIFJlaXNlckZTIGZpbGVzeXN0ZW1zLgorCSAgTm90ZTogdGhpcyBhcHBsZXQgbmVlZHMgYSBsb3Qgb2YgdGVzdGluZyBhbmQgcG9saXNoaW5nLgorCitjb25maWcgTUtGU19WRkFUCisJYm9vbCAibWtmc192ZmF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFV0aWxpdHkgdG8gY3JlYXRlIEZBVDMyIGZpbGVzeXN0ZW1zLgorCitjb25maWcgR0VUT1BUCisJYm9vbCAiZ2V0b3B0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBnZXRvcHQgdXRpbGl0eSBpcyB1c2VkIHRvIGJyZWFrIHVwIChwYXJzZSkgb3B0aW9ucyBpbiBjb21tYW5kCisJICBsaW5lcyB0byBtYWtlIGl0IGVhc3kgdG8gd3JpdGUgY29tcGxleCBzaGVsbCBzY3JpcHRzIHRoYXQgYWxzbyBjaGVjaworCSAgZm9yIGxlZ2FsIChhbmQgaWxsZWdhbCkgb3B0aW9ucy4gSWYgeW91IHdhbnQgdG8gd3JpdGUgaG9ycmlibHkKKwkgIGNvbXBsZXggc2hlbGwgc2NyaXB0cywgb3IgdXNlIHNvbWUgaG9ycmlibHkgY29tcGxleCBzaGVsbCBzY3JpcHQKKwkgIHdyaXR0ZW4gYnkgb3RoZXJzLCB0aGlzIHV0aWxpdHkgbWF5IGJlIGZvciB5b3UuIE1vc3QgcGVvcGxlIHdpbGwKKwkgIHdpc2VseSBsZWF2ZSB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRkVBVFVSRV9HRVRPUFRfTE9ORworCWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1sIgorCWRlZmF1bHQgeSBpZiBMT05HX09QVFMKKwlkZXBlbmRzIG9uIEdFVE9QVAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBsb25nIG9wdGlvbnMgKG9wdGlvbiAtbCkuCisKK2NvbmZpZyBIRVhEVU1QCisJYm9vbCAiaGV4ZHVtcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgaGV4ZHVtcCB1dGlsaXR5IGlzIHVzZWQgdG8gZGlzcGxheSBiaW5hcnkgZGF0YSBpbiBhIHJlYWRhYmxlCisJICB3YXkgdGhhdCBpcyBjb21wYXJhYmxlIHRvIHRoZSBvdXRwdXQgZnJvbSBtb3N0IGhleCBlZGl0b3JzLgorCitjb25maWcgRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UKKwlib29sICJTdXBwb3J0IC1SLCByZXZlcnNlIG9mICdoZXhkdW1wIC1DdiciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRVhEVU1QCisJaGVscAorCSAgVGhlIGhleGR1bXAgdXRpbGl0eSBpcyB1c2VkIHRvIGRpc3BsYXkgYmluYXJ5IGRhdGEgaW4gYW4gYXNjaWkKKwkgIHJlYWRhYmxlIHdheS4gVGhpcyBvcHRpb24gY3JlYXRlcyBiaW5hcnkgZGF0YSBmcm9tIGFuIGFzY2lpIGlucHV0LgorCSAgTkI6IHRoaXMgb3B0aW9uIGlzIG5vbi1zdGFuZGFyZC4gSXQncyB1bndpc2UgdG8gdXNlIGl0IGluIHNjcmlwdHMKKwkgIGFpbWVkIHRvIGJlIHBvcnRhYmxlLgorCitjb25maWcgSEQKKwlib29sICJoZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhFWERVTVAKKwloZWxwCisJICBoZCBpcyBhbiBhbGlhcyB0byBoZXhkdW1wIC1DLgorCitjb25maWcgSFdDTE9DSworCWJvb2wgImh3Y2xvY2siCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIGh3Y2xvY2sgdXRpbGl0eSBpcyB1c2VkIHRvIHJlYWQgYW5kIHNldCB0aGUgaGFyZHdhcmUgY2xvY2sKKwkgIG9uIGEgc3lzdGVtLiBUaGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHNldCB0aGUgY3VycmVudCB0aW1lIG9uCisJICBzaHV0ZG93biBpbiB0aGUgaGFyZHdhcmUgY2xvY2ssIHNvIHRoZSBoYXJkd2FyZSB3aWxsIGtlZXAgdGhlCisJICBjb3JyZWN0IHRpbWUgd2hlbiBMaW51eCBpcyBfbm90XyBydW5uaW5nLgorCitjb25maWcgRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUworCWJvb2wgIlN1cHBvcnQgbG9uZyBvcHRpb25zICgtLWhjdG9zeXMsLi4uKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhXQ0xPQ0sgJiYgTE9OR19PUFRTCisJaGVscAorCSAgQnkgZGVmYXVsdCwgdGhlIGh3Y2xvY2sgdXRpbGl0eSBvbmx5IHVzZXMgc2hvcnQgb3B0aW9ucy4gSWYgeW91CisJICBhcmUgb3Zlcmx5IGZvbmQgb2YgaXRzIGxvbmcgb3B0aW9ucywgc3VjaCBhcyAtLWhjdG9zeXMsIC0tdXRjLCBldGMpCisJICB0aGVuIGVuYWJsZSB0aGlzIG9wdGlvbi4KKworY29uZmlnIEZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUworCWJvb2wgIlVzZSBGSFMgL3Zhci9saWIvaHdjbG9jay9hZGp0aW1lIgorCWRlZmF1bHQgbiAgIyB1dGlsLWxpbnV4LW5nIGluIEZlZG9yYSAxMyBzdGlsbCB1c2VzIC9ldGMvYWRqdGltZQorCWRlcGVuZHMgb24gSFdDTE9DSworCWhlbHAKKwkgIFN0YXJ0aW5nIHdpdGggRkhTIDIuMywgdGhlIGFkanRpbWUgc3RhdGUgZmlsZSBpcyBzdXBwb3NlZCB0byBleGlzdAorCSAgYXQgL3Zhci9saWIvaHdjbG9jay9hZGp0aW1lIGluc3RlYWQgb2YgL2V0Yy9hZGp0aW1lLiBJZiB5b3Ugd2lzaAorCSAgdG8gdXNlIHRoZSBGSFMgYmVoYXZpb3IsIGFuc3dlciBZIGhlcmUsIG90aGVyd2lzZSBhbnN3ZXIgTiBmb3IgdGhlCisJICBjbGFzc2ljIC9ldGMvYWRqdGltZSBwYXRoLgorCisJICBwYXRobmFtZS5jb20vZmhzL3B1Yi9maHMtMi4zLmh0bWwjVkFSTElCSFdDTE9DS1NUQVRFRElSRUNUT1JZRk9SSFdDTE8KKworY29uZmlnIElQQ1JNCisJYm9vbCAiaXBjcm0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIGlwY3JtIHV0aWxpdHkgYWxsb3dzIHRoZSByZW1vdmFsIG9mIFN5c3RlbSBWIGludGVycHJvY2VzcworCSAgY29tbXVuaWNhdGlvbiAoSVBDKSBvYmplY3RzIGFuZCB0aGUgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMKKwkgIGZyb20gdGhlIHN5c3RlbS4KKworY29uZmlnIElQQ1MKKwlib29sICJpcGNzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBpcGNzIHV0aWxpdHkgaXMgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50bHkKKwkgIGFsbG9jYXRlZCBTeXN0ZW0gViBpbnRlcnByb2Nlc3MgKElQQykgb2JqZWN0cyBpbiB0aGUgc3lzdGVtLgorCitjb25maWcgTE9TRVRVUAorCWJvb2wgImxvc2V0dXAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbG9zZXR1cCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBvciBkZXRhY2ggYSBsb29wIGRldmljZSB3aXRoIGEgcmVndWxhcgorCSAgZmlsZSBvciBibG9jayBkZXZpY2UsIGFuZCB0byBxdWVyeSB0aGUgc3RhdHVzIG9mIGEgbG9vcCBkZXZpY2UuIFRoaXMKKwkgIHZlcnNpb24gZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgZW5hYmxpbmcgZGF0YSBlbmNyeXB0aW9uLgorCitjb25maWcgTFNQQ0kKKwlib29sICJsc3BjaSIKKwlkZWZhdWx0IHkKKwkjc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbHNwY2kgaXMgYSB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIGFib3V0IFBDSSBidXNlcyBpbiB0aGUKKwkgIHN5c3RlbSBhbmQgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlbS4KKworCSAgVGhpcyB2ZXJzaW9uIHVzZXMgc3lzZnMgKC9zeXMvYnVzL3BjaS9kZXZpY2VzKSBvbmx5LgorCitjb25maWcgTFNVU0IKKwlib29sICJsc3VzYiIKKwlkZWZhdWx0IHkKKwkjc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbHN1c2IgaXMgYSB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIGFib3V0IFVTQiBidXNlcyBpbiB0aGUKKwkgIHN5c3RlbSBhbmQgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlbS4KKworCSAgVGhpcyB2ZXJzaW9uIHVzZXMgc3lzZnMgKC9zeXMvYnVzL3VzYi9kZXZpY2VzKSBvbmx5LgorCitjb25maWcgTURFVgorCWJvb2wgIm1kZXYiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbWRldiBpcyBhIG1pbmktdWRldiBpbXBsZW1lbnRhdGlvbiBmb3IgZHluYW1pY2FsbHkgY3JlYXRpbmcgZGV2aWNlCisJICBub2RlcyBpbiB0aGUgL2RldiBkaXJlY3RvcnkuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGRvY3MvbWRldi50eHQKKworY29uZmlnIEZFQVRVUkVfTURFVl9DT05GCisJYm9vbCAiU3VwcG9ydCAvZXRjL21kZXYuY29uZiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1ERVYKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgdGhlIG1kZXYgY29uZmlnIGZpbGUgdG8gY29udHJvbCBvd25lcnNoaXAgYW5kCisJICBwZXJtaXNzaW9ucyBvZiB0aGUgZGV2aWNlIG5vZGVzLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBkb2NzL21kZXYudHh0CisKK2NvbmZpZyBGRUFUVVJFX01ERVZfUkVOQU1FCisJYm9vbCAiU3VwcG9ydCBzdWJkaXJzL3N5bWxpbmtzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9NREVWX0NPTkYKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgcmVuYW1pbmcgZGV2aWNlcyBhbmQgY3JlYXRpbmcgc3ltbGlua3MuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGRvY3MvbWRldi50eHQKKworY29uZmlnIEZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQCisJYm9vbCAiU3VwcG9ydCByZWd1bGFyIGV4cHJlc3Npb25zIHN1YnN0aXR1dGlvbnMgd2hlbiByZW5hbWluZyBkZXZpY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX01ERVZfUkVOQU1FCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc3Vic3RpdHV0aW9ucyB3aGVuIHJlbmFtaW5nCisJICBkZXZpY2UuCisKK2NvbmZpZyBGRUFUVVJFX01ERVZfRVhFQworCWJvb2wgIlN1cHBvcnQgY29tbWFuZCBleGVjdXRpb24gYXQgZGV2aWNlIGFkZGl0aW9uL3JlbW92YWwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX01ERVZfQ09ORgorCWhlbHAKKwkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBhbiBvcHRpb25hbCBmaWVsZCB0byAvZXRjL21kZXYuY29uZiBmb3IKKwkgIGV4ZWN1dGluZyBjb21tYW5kcyB3aGVuIGRldmljZXMgYXJlIGNyZWF0ZWQvcmVtb3ZlZC4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgZG9jcy9tZGV2LnR4dAorCitjb25maWcgRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUKKwlib29sICJTdXBwb3J0IGxvYWRpbmcgb2YgZmlybXdhcmVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTURFVgorCWhlbHAKKwkgIFNvbWUgZGV2aWNlcyBuZWVkIHRvIGxvYWQgZmlybXdhcmUgYmVmb3JlIHRoZXkgY2FuIGJlIHVzYWJsZS4KKworCSAgVGhlc2UgZGV2aWNlcyB3aWxsIHJlcXVlc3QgdXNlcnNwYWNlIGxvb2sgdXAgdGhlIGZpbGVzIGluCisJICAvbGliL2Zpcm13YXJlLyBhbmQgaWYgaXQgZXhpc3RzLCBzZW5kIGl0IHRvIHRoZSBrZXJuZWwgZm9yCisJICBsb2FkaW5nIGludG8gdGhlIGhhcmR3YXJlLgorCitjb25maWcgTUtTV0FQCisJYm9vbCAibWtzd2FwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBta3N3YXAgdXRpbGl0eSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBhIGZpbGUgb3IgZGlzayBwYXJ0aXRpb24gYXMKKwkgIExpbnV4IHN3YXAgc3BhY2UuIFRoaXMgYWxsb3dzIExpbnV4IHRvIHVzZSB0aGUgZW50aXJlIGZpbGUgb3IKKwkgIHBhcnRpdGlvbiBhcyBpZiBpdCB3ZXJlIGFkZGl0aW9uYWwgUkFNLCB3aGljaCBjYW4gZ3JlYXRseSBpbmNyZWFzZQorCSAgdGhlIGNhcGFiaWxpdHkgb2YgbG93LW1lbW9yeSBtYWNoaW5lcy4gVGhpcyBhZGRpdGlvbmFsIG1lbW9yeSBpcworCSAgbXVjaCBzbG93ZXIgdGhhbiByZWFsIFJBTSwgYnV0IGNhbiBiZSB2ZXJ5IGhlbHBmdWwgYXQgcHJldmVudGluZyB5b3VyCisJICBhcHBsaWNhdGlvbnMgYmVpbmcga2lsbGVkIGJ5IHRoZSBMaW51eCBvdXQgb2YgbWVtb3J5IChPT00pIGtpbGxlci4KKwkgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBzd2FwIHNwYWNlIHVzaW5nICdta3N3YXAnIHlvdSBuZWVkIHRvIGVuYWJsZQorCSAgdGhlIHN3YXAgc3BhY2UgdXNpbmcgdGhlICdzd2Fwb24nIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX01LU1dBUF9VVUlECisJYm9vbCAiVVVJRCBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTUtTV0FQCisJaGVscAorCSAgR2VuZXJhdGUgc3dhcCBzcGFjZXMgd2l0aCB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcnMuCisKK2NvbmZpZyBNT1JFCisJYm9vbCAibW9yZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtb3JlIGlzIGEgc2ltcGxlIHV0aWxpdHkgd2hpY2ggYWxsb3dzIHlvdSB0byByZWFkIHRleHQgb25lIHNjcmVlbgorCSAgc2l6ZWQgcGFnZSBhdCBhIHRpbWUuIElmIHlvdSB3YW50IHRvIHJlYWQgdGV4dCB0aGF0IGlzIGxhcmdlciB0aGFuCisJICB0aGUgc2NyZWVuLCBhbmQgeW91IGFyZSB1c2luZyBhbnl0aGluZyBmYXN0ZXIgdGhhbiBhIDMwMCBiYXVkIG1vZGVtLAorCSAgeW91IHdpbGwgcHJvYmFibHkgZmluZCB0aGlzIHV0aWxpdHkgdmVyeSBoZWxwZnVsLiBJZiB5b3UgZG9uJ3QgaGF2ZQorCSAgYW55IG5lZWQgdG8gcmVhZGluZyB0ZXh0IGZpbGVzLCB5b3UgY2FuIGxlYXZlIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBNT1VOVAorCWJvb2wgIm1vdW50IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFsbCBmaWxlcyBhbmQgZmlsZXN5c3RlbXMgaW4gVW5peCBhcmUgYXJyYW5nZWQgaW50byBvbmUgYmlnIGRpcmVjdG9yeQorCSAgdHJlZS4gVGhlICdtb3VudCcgdXRpbGl0eSBpcyB1c2VkIHRvIGdyYWZ0IGEgZmlsZXN5c3RlbSBvbnRvIGEKKwkgIHBhcnRpY3VsYXIgcGFydCBvZiB0aGUgdHJlZS4gQSBmaWxlc3lzdGVtIGNhbiBlaXRoZXIgbGl2ZSBvbiBhIGJsb2NrCisJICBkZXZpY2UsIG9yIGl0IGNhbiBiZSBhY2Nlc3NpYmxlIG92ZXIgdGhlIG5ldHdvcmssIGFzIGlzIHRoZSBjYXNlIHdpdGgKKwkgIE5GUyBmaWxlc3lzdGVtcy4gTW9zdCBwZW9wbGUgdXNpbmcgQnVzeUJveCB3aWxsIGFsc28gd2FudCB0byBlbmFibGUKKwkgIHRoZSAnbW91bnQnIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0ZBS0UKKwlib29sICJTdXBwb3J0IG9wdGlvbiAtZiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PVU5UCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGZha2luZyBhIGZpbGUgc3lzdGVtIG1vdW50LgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9WRVJCT1NFCisJYm9vbCAiU3VwcG9ydCBvcHRpb24gLXYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1VOVAorCWhlbHAKKwkgIEVuYWJsZSBtdWx0aS1sZXZlbCAtdlt2di4uLl0gdmVyYm9zZSBtZXNzYWdlcy4gVXNlZnVsIGlmIHlvdQorCSAgZGVidWcgbW91bnQgcHJvYmxlbXMgYW5kIHdhbnQgdG8gc2VlIHdoYXQgaXMgZXhhY3RseSBwYXNzZWQKKwkgIHRvIHRoZSBrZXJuZWwuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0hFTFBFUlMKKwlib29sICJTdXBwb3J0IG1vdW50IGhlbHBlcnMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBNT1VOVAorCWhlbHAKKwkgIEVuYWJsZSBtb3VudGluZyBvZiB2aXJ0dWFsIGZpbGUgc3lzdGVtcyB2aWEgZXh0ZXJuYWwgaGVscGVycy4KKwkgIEUuZy4gIm1vdW50IG9iZXhmcyMtYjAwLjExLjIyLjMzLjQ0LjU1IC9tbnQiIHdpbGwgaW4gZWZmZWN0IGNhbGwKKwkgICJvYmV4ZnMgLWIwMC4xMS4yMi4zMy40NC41NSAvbW50IgorCSAgQWxzbyAibW91bnQgLXQgc29tZXR5cGUgWy1vIG9wdHNdIGZzIC9tbnQiIHdpbGwgdHJ5CisJICAic29tZXR5cGUgWy1vIG9wdHNdIGZzIC9tbnQiIGlmIHNpbXBsZSBtb3VudCBzeXNjYWxsIGZhaWxzLgorCSAgVGhlIGlkZWEgaXMgdG8gdXNlIHN1Y2ggdmlydHVhbCBmaWxlc3lzdGVtcyBpbiAvZXRjL2ZzdGFiLgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9MQUJFTAorCWJvb2wgIlN1cHBvcnQgc3BlY2lmeWluZyBkZXZpY2VzIGJ5IGxhYmVsIG9yIFVVSUQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1VOVAorCXNlbGVjdCBWT0xVTUVJRAorCWhlbHAKKwkgIFRoaXMgYWxsb3dzIGZvciBzcGVjaWZ5aW5nIGEgZGV2aWNlIGJ5IGxhYmVsIG9yIHV1aWQsIHJhdGhlciB0aGFuIGJ5CisJICBuYW1lLiBUaGlzIGZlYXR1cmUgdXRpbGl6ZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBibGtpZC9maW5kZnMuCisJICBUaGlzIGFsc28gZW5hYmxlcyBsYWJlbCBvciB1dWlkIHN1cHBvcnQgZm9yIHN3YXBvbi4KKworY29uZmlnIEZFQVRVUkVfTU9VTlRfTkZTCisJYm9vbCAiU3VwcG9ydCBtb3VudGluZyBORlMgZmlsZSBzeXN0ZW1zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTU9VTlQKKwlzZWxlY3QgRkVBVFVSRV9IQVZFX1JQQworCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIEVuYWJsZSBtb3VudGluZyBvZiBORlMgZmlsZSBzeXN0ZW1zLgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9DSUZTCisJYm9vbCAiU3VwcG9ydCBtb3VudGluZyBDSUZTL1NNQiBmaWxlIHN5c3RlbXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1VOVAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBzYW1iYSBtb3VudHMuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0ZMQUdTCisJZGVwZW5kcyBvbiBNT1VOVAorCWJvb2wgIlN1cHBvcnQgbG90cyBvZiAtbyBmbGFncyBpbiBtb3VudCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaXRob3V0IHRoaXMsIG1vdW50IG9ubHkgc3VwcG9ydHMgcm8vcncvcmVtb3VudC4gV2l0aCB0aGlzLCBpdAorCSAgc3VwcG9ydHMgbm9zdWlkLCBzdWlkLCBkZXYsIG5vZGV2LCBleGVjLCBub2V4ZWMsIHN5bmMsIGFzeW5jLCBhdGltZSwKKwkgIG5vYXRpbWUsIGRpcmF0aW1lLCBub2RpcmF0aW1lLCBsb3VkLCBiaW5kLCBtb3ZlLCBzaGFyZWQsIHNsYXZlLAorCSAgcHJpdmF0ZSwgdW5iaW5kYWJsZSwgcnNoYXJlZCwgcnNsYXZlLCBycHJpdmF0ZSwgYW5kIHJ1bmJpbmRhYmxlLgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9GU1RBQgorCWRlcGVuZHMgb24gTU9VTlQKKwlib29sICJTdXBwb3J0IC9ldGMvZnN0YWIgYW5kIC1hIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN1cHBvcnQgbW91bnQgYWxsIGFuZCBsb29raW5nIGZvciBmaWxlcyBpbiAvZXRjL2ZzdGFiLgorCitjb25maWcgUElWT1RfUk9PVAorCWJvb2wgInBpdm90X3Jvb3QiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIHBpdm90X3Jvb3QgdXRpbGl0eSBzd2FwcyB0aGUgbW91bnQgcG9pbnRzIGZvciB0aGUgcm9vdCBmaWxlc3lzdGVtCisJICB3aXRoIHNvbWUgb3RoZXIgbW91bnRlZCBmaWxlc3lzdGVtLiBUaGlzIGFsbG93cyB5b3UgdG8gZG8gYWxsIHNvcnRzCisJICBvZiB3aWxkIGFuZCBjcmF6eSB0aGluZ3Mgd2l0aCB5b3VyIExpbnV4IHN5c3RlbSBhbmQgaXMgZmFyIG1vcmUKKwkgIHBvd2VyZnVsIHRoYW4gJ2Nocm9vdCcuCisKKwkgIE5vdGU6IFRoaXMgaXMgZm9yIGluaXRyZCBpbiBsaW51eCAyLjQuIFVuZGVyIGluaXRyYW1mcyAoaW50cm9kdWNlZAorCSAgaW4gbGludXggMi42KSB1c2Ugc3dpdGNoX3Jvb3QgaW5zdGVhZC4KKworY29uZmlnIFJEQVRFCisJYm9vbCAicmRhdGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHJkYXRlIHV0aWxpdHkgYWxsb3dzIHlvdSB0byBzeW5jaHJvbml6ZSB0aGUgZGF0ZSBhbmQgdGltZSBvZiB5b3VyCisJICBzeXN0ZW0gY2xvY2sgd2l0aCB0aGUgZGF0ZSBhbmQgdGltZSBvZiBhIHJlbW90ZSBuZXR3b3JrZWQgc3lzdGVtIHVzaW5nCisJICB0aGUgUkZDODY4IHByb3RvY29sLCB3aGljaCBpcyBidWlsdCBpbnRvIHRoZSBpbmV0ZCBkYWVtb24gb24gbW9zdAorCSAgc3lzdGVtcy4KKworY29uZmlnIFJERVYKKwlib29sICJyZGV2IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFByaW50IHRoZSBkZXZpY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGVzeXN0ZW0gbW91bnRlZCBhdCAnLycuCisKK2NvbmZpZyBSRUFEUFJPRklMRQorCWJvb2wgInJlYWRwcm9maWxlIgorCWRlZmF1bHQgeQorCSNzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIGFsbG93cyB5b3UgdG8gcGFyc2UgL3Byb2MvcHJvZmlsZSBmb3IgYmFzaWMgcHJvZmlsaW5nLgorCitjb25maWcgUlRDV0FLRQorCWJvb2wgInJ0Y3dha2UiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgRW50ZXIgYSBzeXN0ZW0gc2xlZXAgc3RhdGUgdW50aWwgc3BlY2lmaWVkIHdha2V1cCB0aW1lLgorCitjb25maWcgU0NSSVBUCisJYm9vbCAic2NyaXB0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBzY3JpcHQgbWFrZXMgdHlwZXNjcmlwdCBvZiB0ZXJtaW5hbCBzZXNzaW9uLgorCitjb25maWcgU0NSSVBUUkVQTEFZCisJYm9vbCAic2NyaXB0cmVwbGF5IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSByZXBsYXlzIGEgdHlwZXNjcmlwdCwgdXNpbmcgdGltaW5nIGluZm9ybWF0aW9uCisJICBnaXZlbiBieSBzY3JpcHQgLXQuCisKK2NvbmZpZyBTRVRBUkNICisJYm9vbCAic2V0YXJjaCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgbGludXgzMiB1dGlsaXR5IGlzIHVzZWQgdG8gY3JlYXRlIGEgMzJiaXQgZW52aXJvbm1lbnQgZm9yIHRoZQorCSAgc3BlY2lmaWVkIHByb2dyYW0gKHVzdWFsbHkgYSBzaGVsbCkuIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gaGF2ZQorCSAgdGhpcyB1dGlsIG9uIGEgc3lzdGVtIHRoYXQgc3VwcG9ydHMgYm90aCA2NGJpdCBhbmQgMzJiaXQgdXNlcmxhbmQKKwkgIChsaWtlIGFtZDY0L3g4NiwgcHBjNjQvcHBjLCBzcGFyYzY0L3NwYXJjLCBldGMuLi4pLgorCitjb25maWcgU1dBUE9OT0ZGCisJYm9vbCAic3dhcG9ub2ZmIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYm90aCB0aGUgJ3N3YXBvbicgYW5kIHRoZSAnc3dhcG9mZicgdXRpbGl0aWVzLgorCSAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIHNvbWUgc3dhcCBzcGFjZSB1c2luZyAnbWtzd2FwJywgeW91IGFsc28gbmVlZAorCSAgdG8gZW5hYmxlIHlvdXIgc3dhcCBzcGFjZSB3aXRoIHRoZSAnc3dhcG9uJyB1dGlsaXR5LiBUaGUgJ3N3YXBvZmYnCisJICB1dGlsaXR5IGlzIHVzZWQsIHR5cGljYWxseSBhdCBzeXN0ZW0gc2h1dGRvd24sIHRvIGRpc2FibGUgYW55IHN3YXAKKwkgIHNwYWNlLiBJZiB5b3UgYXJlIG5vdCB1c2luZyBhbnkgc3dhcCBzcGFjZSwgeW91IGNhbiBsZWF2ZSB0aGlzCisJICBvcHRpb24gZGlzYWJsZWQuCisKK2NvbmZpZyBGRUFUVVJFX1NXQVBPTl9QUkkKKwlib29sICJTdXBwb3J0IHByaW9yaXR5IG9wdGlvbiAtcCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNXQVBPTk9GRgorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBzZXR0aW5nIHN3YXAgZGV2aWNlIHByaW9yaXR5IGluIHN3YXBvbi4KKworY29uZmlnIFNXSVRDSF9ST09UCisJYm9vbCAic3dpdGNoX3Jvb3QiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIHN3aXRjaF9yb290IHV0aWxpdHkgaXMgdXNlZCBmcm9tIGluaXRyYW1mcyB0byBzZWxlY3QgYSBuZXcKKwkgIHJvb3QgZGV2aWNlLiBVbmRlciBpbml0cmFtZnMsIHlvdSBoYXZlIHRvIHVzZSB0aGlzIGluc3RlYWQgb2YKKwkgIHBpdm90X3Jvb3QuIChTdG9wIHJlYWRpbmcgaGVyZSBpZiB5b3UgZG9uJ3QgY2FyZSB3aHkuKQorCisJICBCb290aW5nIHdpdGggaW5pdHJhbWZzIGV4dHJhY3RzIGEgZ3ppcHBlZCBjcGlvIGFyY2hpdmUgaW50byByb290ZnMKKwkgICh3aGljaCBpcyBhIHZhcmlhbnQgb2YgcmFtZnMvdG1wZnMpLiBCZWNhdXNlIHJvb3RmcyBjYW4ndCBiZSBtb3ZlZAorCSAgb3IgdW5tb3VudGVkKiwgcGl2b3Rfcm9vdCB3aWxsIG5vdCB3b3JrIGZyb20gaW5pdHJhbWZzLiBJbnN0ZWFkLAorCSAgc3dpdGNoX3Jvb3QgZGVsZXRlcyBldmVyeXRoaW5nIG91dCBvZiByb290ZnMgKGluY2x1ZGluZyBpdHNlbGYpLAorCSAgZG9lcyBhIG1vdW50IC0tbW92ZSB0aGF0IG92ZXJtb3VudHMgcm9vdGZzIHdpdGggdGhlIG5ldyByb290LCBhbmQKKwkgIHRoZW4gZXhlY3MgdGhlIHNwZWNpZmllZCBpbml0IHByb2dyYW0uCisKKwkgICogQmVjYXVzZSB0aGUgTGludXgga2VybmVsIHVzZXMgcm9vdGZzIGludGVybmFsbHkgYXMgdGhlIHN0YXJ0aW5nCisJICBhbmQgZW5kaW5nIHBvaW50IGZvciBzZWFyY2hpbmcgdGhyb3VnaCB0aGUga2VybmVsJ3MgZG91Ymx5IGxpbmtlZAorCSAgbGlzdCBvZiBhY3RpdmUgbW91bnQgcG9pbnRzLiBUaGF0J3Mgd2h5LgorCitjb25maWcgVU1PVU5UCisJYm9vbCAidW1vdW50IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFdoZW4geW91IHdhbnQgdG8gcmVtb3ZlIGEgbW91bnRlZCBmaWxlc3lzdGVtIGZyb20gaXRzIGN1cnJlbnQgbW91bnQKKwkgIHBvaW50LCBmb3IgZXhhbXBsZSB3aGVuIHlvdSBhcmUgc2h1dHRpbmcgZG93biB0aGUgc3lzdGVtLCB0aGUKKwkgICd1bW91bnQnIHV0aWxpdHkgaXMgdGhlIHRvb2wgdG8gdXNlLiBJZiB5b3UgZW5hYmxlZCB0aGUgJ21vdW50JworCSAgdXRpbGl0eSwgeW91IGFsbW9zdCBjZXJ0YWlubHkgYWxzbyB3YW50IHRvIGVuYWJsZSAndW1vdW50Jy4KKworY29uZmlnIEZFQVRVUkVfVU1PVU5UX0FMTAorCWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1hIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVU1PVU5UCisJaGVscAorCSAgU3VwcG9ydCAtYSBvcHRpb24gdG8gdW5tb3VudCBhbGwgY3VycmVudGx5IG1vdW50ZWQgZmlsZXN5c3RlbXMuCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBtb3VudC91bW91bnQiCisJZGVwZW5kcyBvbiBNT1VOVCB8fCBVTU9VTlQKKworY29uZmlnIEZFQVRVUkVfTU9VTlRfTE9PUAorCWJvb2wgIlN1cHBvcnQgbG9vcGJhY2sgbW91bnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTU9VTlQgfHwgVU1PVU5UCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBmZWF0dXJlIGFsbG93cyBhdXRvbWF0aWMgbW91bnRpbmcgb2YgZmlsZXMgKGNvbnRhaW5pbmcKKwkgIGZpbGVzeXN0ZW0gaW1hZ2VzKSB2aWEgdGhlIGxpbnV4IGtlcm5lbCdzIGxvb3BiYWNrIGRldmljZXMuCisJICBUaGUgbW91bnQgY29tbWFuZCB3aWxsIGRldGVjdCB5b3UgYXJlIHRyeWluZyB0byBtb3VudCBhIGZpbGUgaW5zdGVhZAorCSAgb2YgYSBibG9jayBkZXZpY2UsIGFuZCB0cmFuc3BhcmVudGx5IGFzc29jaWF0ZSB0aGUgZmlsZSB3aXRoIGEKKwkgIGxvb3BiYWNrIGRldmljZS4gVGhlIHVtb3VudCBjb21tYW5kIHdpbGwgYWxzbyBmcmVlIHRoYXQgbG9vcGJhY2sKKwkgIGRldmljZS4KKworCSAgWW91IGNhbiBzdGlsbCB1c2UgdGhlICdsb3NldHVwJyB1dGlsaXR5ICh0byBtYW51YWxseSBhc3NvY2lhdGUgZmlsZXMKKwkgIHdpdGggbG9vcCBkZXZpY2VzKSBpZiB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgYWR2YW5jZWQsIHN1Y2ggYXMKKwkgIHNwZWNpZnkgYW4gb2Zmc2V0IG9yIGNyeXB0b2dyYXBoaWMgb3B0aW9ucyB0byB0aGUgbG9vcGJhY2sgZGV2aWNlLgorCSAgKElmIHlvdSBkb24ndCB3YW50IHVtb3VudCB0byBmcmVlIHRoZSBsb29wIGRldmljZSwgdXNlICJ1bW91bnQgLUQiLikKKworY29uZmlnIEZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUKKwlib29sICJDcmVhdGUgbmV3IGxvb3BiYWNrIGRldmljZXMgaWYgbmVlZGVkIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9NT1VOVF9MT09QCisJaGVscAorCSAgTGludXgga2VybmVscyA+PSAyLjYuMjQgc3VwcG9ydCB1bmxpbWl0ZWQgbG9vcGJhY2sgZGV2aWNlcy4gVGhleSBhcmUKKwkgIGFsbG9jYXRlZCBmb3IgdXNlIHdoZW4gdHJ5aW5nIHRvIHVzZSBhIGxvb3AgZGV2aWNlLiBUaGUgbG9vcCBkZXZpY2UKKwkgIG11c3QgaG93ZXZlciBleGlzdC4KKworCSAgVGhpcyBmZWF0dXJlIGxldHMgbW91bnQgdG8gdHJ5IHRvIGNyZWF0ZSBuZXh0IC9kZXYvbG9vcE4gZGV2aWNlCisJICBpZiBpdCBkb2VzIG5vdCBmaW5kIGEgZnJlZSBvbmUuCisKK2NvbmZpZyBGRUFUVVJFX01UQUJfU1VQUE9SVAorCWJvb2wgIlN1cHBvcnQgZm9yIHRoZSBvbGQgL2V0Yy9tdGFiIGZpbGUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBNT1VOVCB8fCBVTU9VTlQKKwlzZWxlY3QgRkVBVFVSRV9NT1VOVF9GQUtFCisJaGVscAorCSAgSGlzdG9yaWNhbGx5LCBVbml4IHN5c3RlbXMga2VwdCB0cmFjayBvZiB0aGUgY3VycmVudGx5IG1vdW50ZWQKKwkgIHBhcnRpdGlvbnMgaW4gdGhlIGZpbGUgIi9ldGMvbXRhYiIuIFRoZXNlIGRheXMsIHRoZSBrZXJuZWwgZXhwb3J0cworCSAgdGhlIGxpc3Qgb2YgY3VycmVudGx5IG1vdW50ZWQgcGFydGl0aW9ucyBpbiAiL3Byb2MvbW91bnRzIiwgcmVuZGVyaW5nCisJICB0aGUgb2xkIG10YWIgZmlsZSBvYnNvbGV0ZS4gKEluIG1vZGVybiBzeXN0ZW1zLCAvZXRjL210YWIgc2hvdWxkIGJlCisJICBhIHN5bWxpbmsgdG8gL3Byb2MvbW91bnRzLikKKworCSAgVGhlIG9ubHkgcmVhc29uIHRvIGhhdmUgbW91bnQgbWFpbnRhaW4gYW4gL2V0Yy9tdGFiIGZpbGUgaXRzZWxmIGlzIGlmCisJICB5b3VyIHN0cmlwcGVkLWRvd24gZW1iZWRkZWQgc3lzdGVtIGRvZXMgbm90IGhhdmUgYSAvcHJvYyBkaXJlY3RvcnkuCisJICBJZiB5b3UgbXVzdCB1c2UgdGhpcywga2VlcCBpbiBtaW5kIGl0J3MgaW5oZXJlbnRseSBicml0dGxlIChmb3IKKwkgIGV4YW1wbGUgYSBtb3VudCB1bmRlciBjaHJvb3Qgd29uJ3QgdXBkYXRlIGl0KSwgY2FuJ3QgaGFuZGxlIG1vZGVybgorCSAgZmVhdHVyZXMgbGlrZSBzZXBhcmF0ZSBwZXItcHJvY2VzcyBmaWxlc3lzdGVtIG5hbWVzcGFjZXMsIHJlcXVpcmVzCisJICB0aGF0IHlvdXIgL2V0YyBkaXJlY3RvcnkgYmUgd3JpdGFibGUsIHRlbmRzIHRvIGdldCBlYXNpbHkgY29uZnVzZWQKKwkgIGJ5IC0tYmluZCBvciAtLW1vdmUgbW91bnRzLCB3b24ndCB1cGRhdGUgaWYgeW91IHJlbmFtZSBhIGRpcmVjdG9yeQorCSAgdGhhdCBjb250YWlucyBhIG1vdW50IHBvaW50LCBhbmQgc28gb24uIChJbiBicmllZjogYXZvaWQuKQorCisJICBBYm91dCB0aGUgb25seSByZWFzb24gdG8gdXNlIHRoaXMgaXMgaWYgeW91J3ZlIHJlbW92ZWQgL3Byb2MgZnJvbQorCSAgeW91ciBrZXJuZWwuCisKK2NvbmZpZyBWT0xVTUVJRAorCWJvb2wgI05vIGRlc2NyaXB0aW9uIG1ha2VzIGl0IGEgaGlkZGVuIG9wdGlvbgorCWRlZmF1bHQgbgorCittZW51ICJGaWxlc3lzdGVtL1ZvbHVtZSBpZGVudGlmaWNhdGlvbiIKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0VYVAorCWJvb2wgIkV4dCBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0JUUkZTCisJYm9vbCAiYnRyZnMgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUworCWJvb2wgIlJlaXNlciBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0ZBVAorCWJvb2wgImZhdCBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0hGUworCWJvb2wgImhmcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0pGUworCWJvb2wgImpmcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9VRlMKKyMjIwlib29sICJ1ZnMgZmlsZXN5c3RlbSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9YRlMKKwlib29sICJ4ZnMgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9OVEZTCisJYm9vbCAibnRmcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjAKKwlib29sICJpc285NjYwIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfVURGCisJYm9vbCAidWRmIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTFVLUworCWJvb2wgImx1a3MgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAKKwlib29sICJsaW51eCBzd2FwIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0xWTQorIyMjCWJvb2wgImx2bSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMKKwlib29sICJjcmFtZnMgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSFBGUworIyMjCWJvb2wgImhwZnMgZmlsZXN5c3RlbSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9ST01GUworCWJvb2wgInJvbWZzIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfU1lTVgorCWJvb2wgInN5c3YgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTUlOSVgKKyMjIwlib29sICJtaW5peCBmaWxlc3lzdGVtIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBUaGVzZSBvbmx5IGRldGVjdCBwYXJ0aXRpb24gdGFibGVzIC0gbm90IHVzZWQgKHlldD8pCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTUFDCisjIyMJYm9vbCAibWFjIGZpbGVzeXN0ZW0iCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorIyMjCWhlbHAKKyMjIwkgIFRPRE8KKyMjIworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX01TRE9TCisjIyMJYm9vbCAibXNkb3MgZmlsZXN5c3RlbSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMgorCWJvb2wgIm9jZnMyIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0hJR0hQT0lOVFJBSUQKKyMjIwlib29sICJoaWdocG9pbnQgcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSVNXUkFJRAorIyMjCWJvb2wgImludGVsIHJhaWQiCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorIyMjCWhlbHAKKyMjIwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0xTSVJBSUQKKyMjIwlib29sICJsc2kgcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfVklBUkFJRAorIyMjCWJvb2wgInZpYSByYWlkIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9TSUxJQ09OUkFJRAorIyMjCWJvb2wgInNpbGljb24gcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTlZJRElBUkFJRAorIyMjCWJvb2wgIm52aWRpYSByYWlkIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9QUk9NSVNFUkFJRAorIyMjCWJvb2wgInByb21pc2UgcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQKKwlib29sICJsaW51eHJhaWQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworZW5kbWVudQorCitlbmRtZW51CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L0tidWlsZC5zcmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ZDkxMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDQ3IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19BQ1BJRCkgICAgICAgICAgICAgKz0gYWNwaWQubworbGliLSQoQ09ORklHX0JMS0lEKSAgICAgICAgICAgICArPSBibGtpZC5vCitsaWItJChDT05GSUdfRE1FU0cpICAgICAgICAgICAgICs9IGRtZXNnLm8KK2xpYi0kKENPTkZJR19GQlNFVCkgICAgICAgICAgICAgKz0gZmJzZXQubworbGliLSQoQ09ORklHX0ZERkxVU0gpICAgICAgICAgICArPSBmcmVlcmFtZGlzay5vCitsaWItJChDT05GSUdfRkRGT1JNQVQpICAgICAgICAgICs9IGZkZm9ybWF0Lm8KK2xpYi0kKENPTkZJR19GRElTSykgICAgICAgICAgICAgKz0gZmRpc2subworbGliLSQoQ09ORklHX0ZJTkRGUykgICAgICAgICAgICArPSBmaW5kZnMubworbGliLSQoQ09ORklHX0ZMT0NLKSAgICAgICAgICAgICArPSBmbG9jay5vCitsaWItJChDT05GSUdfRlJFRVJBTURJU0spICAgICAgICs9IGZyZWVyYW1kaXNrLm8KK2xpYi0kKENPTkZJR19GU0NLX01JTklYKSAgICAgICAgKz0gZnNja19taW5peC5vCitsaWItJChDT05GSUdfR0VUT1BUKSAgICAgICAgICAgICs9IGdldG9wdC5vCitsaWItJChDT05GSUdfSEVYRFVNUCkgICAgICAgICAgICs9IGhleGR1bXAubworbGliLSQoQ09ORklHX0hXQ0xPQ0spICAgICAgICAgICArPSBod2Nsb2NrLm8KK2xpYi0kKENPTkZJR19JUENSTSkgICAgICAgICAgICAgKz0gaXBjcm0ubworbGliLSQoQ09ORklHX0lQQ1MpICAgICAgICAgICAgICArPSBpcGNzLm8KK2xpYi0kKENPTkZJR19MT1NFVFVQKSAgICAgICAgICAgKz0gbG9zZXR1cC5vCitsaWItJChDT05GSUdfTFNQQ0kpICAgICAgICAgICAgICs9IGxzcGNpLm8KK2xpYi0kKENPTkZJR19MU1VTQikgICAgICAgICAgICAgKz0gbHN1c2IubworbGliLSQoQ09ORklHX01ERVYpICAgICAgICAgICAgICArPSBtZGV2Lm8KK2xpYi0kKENPTkZJR19NS0ZTX0VYVDIpICAgICAgICAgKz0gbWtmc19leHQyLm8KK2xpYi0kKENPTkZJR19NS0ZTX01JTklYKSAgICAgICAgKz0gbWtmc19taW5peC5vCitsaWItJChDT05GSUdfTUtGU19SRUlTRVIpICAgICAgICs9IG1rZnNfcmVpc2VyLm8KK2xpYi0kKENPTkZJR19NS0ZTX1ZGQVQpICAgICAgICAgKz0gbWtmc192ZmF0Lm8KK2xpYi0kKENPTkZJR19NS1NXQVApICAgICAgICAgICAgKz0gbWtzd2FwLm8KK2xpYi0kKENPTkZJR19NT1JFKSAgICAgICAgICAgICAgKz0gbW9yZS5vCitsaWItJChDT05GSUdfTU9VTlQpICAgICAgICAgICAgICs9IG1vdW50Lm8KK2xpYi0kKENPTkZJR19QSVZPVF9ST09UKSAgICAgICAgKz0gcGl2b3Rfcm9vdC5vCitsaWItJChDT05GSUdfUkRBVEUpICAgICAgICAgICAgICs9IHJkYXRlLm8KK2xpYi0kKENPTkZJR19SREVWKSAgICAgICAgICAgICAgKz0gcmRldi5vCitsaWItJChDT05GSUdfUkVBRFBST0ZJTEUpICAgICAgICs9IHJlYWRwcm9maWxlLm8KK2xpYi0kKENPTkZJR19SVENXQUtFKSAgICAgICAgICAgKz0gcnRjd2FrZS5vCitsaWItJChDT05GSUdfU0NSSVBUKSAgICAgICAgICAgICs9IHNjcmlwdC5vCitsaWItJChDT05GSUdfU0NSSVBUUkVQTEFZKSAgICAgICs9IHNjcmlwdHJlcGxheS5vCitsaWItJChDT05GSUdfU0VUQVJDSCkgICAgICAgICAgICs9IHNldGFyY2gubworbGliLSQoQ09ORklHX1NXQVBPTk9GRikgICAgICAgICArPSBzd2Fwb25vZmYubworbGliLSQoQ09ORklHX1NXSVRDSF9ST09UKSAgICAgICArPSBzd2l0Y2hfcm9vdC5vCitsaWItJChDT05GSUdfVU1PVU5UKSAgICAgICAgICAgICs9IHVtb3VudC5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2FjcGlkLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2FjcGlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MzIxYgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvYWNwaWQuYwpAQCAtMCwwICsxLDMzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2ltcGxlIEFDUEkgZXZlbnRzIGxpc3RlbmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhY3BpZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kXSBbLWMgQ09ORkRJUl0gWy1sIExPR0ZJTEVdIFstYSBBQ1RJT05GSUxFXSBbLU0gTUFQRklMRV0gWy1lIFBST0NfRVZFTlRfRklMRV0gWy1wIFBJREZJTEVdIgorLy91c2FnZTojZGVmaW5lIGFjcGlkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdGVuIHRvIEFDUEkgZXZlbnRzIGFuZCBzcGF3biBzcGVjaWZpYyBoZWxwZXJzIG9uIGV2ZW50IGFycml2YWxcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgRElSCUNvbmZpZyBkaXJlY3RvcnkgWy9ldGMvYWNwaV0iCisvL3VzYWdlOiAgICAgIlxuCS1kCURvbid0IGRhZW1vbml6ZSwgKGltcGxpZXMgLWYpIgorLy91c2FnZTogICAgICJcbgktZSBGSUxFCS9wcm9jIGV2ZW50IGZpbGUgWy9wcm9jL2FjcGkvZXZlbnRdIgorLy91c2FnZTogICAgICJcbgktZglSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgRklMRQlMb2cgZmlsZSBbL3Zhci9sb2cvYWNwaWQubG9nXSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgRklMRQlQaWQgZmlsZSBbL3Zhci9ydW4vYWNwaWQucGlkXSIKKy8vdXNhZ2U6ICAgICAiXG4JLWEgRklMRQlBY3Rpb24gZmlsZSBbL2V0Yy9hY3BpZC5jb25mXSIKKy8vdXNhZ2U6ICAgICAiXG4JLU0gRklMRSBNYXAgZmlsZSBbL2V0Yy9hY3BpLm1hcF0iCisvL3VzYWdlOglJRl9GRUFUVVJFX0FDUElEX0NPTVBBVCgKKy8vdXNhZ2U6ICAgICAiXG5cbkFjY2VwdCBhbmQgaWdub3JlIGNvbXBhdGliaWxpdHkgb3B0aW9ucyAtZyAtbSAtcyAtUyAtdiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgYWNwaWRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIldpdGhvdXQgLWUgb3B0aW9uLCBhY3BpZCB1c2VzIGFsbCAvZGV2L2lucHV0L2V2ZW50KiBmaWxlc1xuIgorLy91c2FnZTogICAgICAgIiMgYWNwaWRcbiIKKy8vdXNhZ2U6ICAgICAgICIjIGFjcGlkIC1sIC92YXIvbG9nL215LWFjcGktbG9nXG4iCisvL3VzYWdlOiAgICAgICAiIyBhY3BpZCAtZSAvcHJvYy9hY3BpL2V2ZW50XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKyNpZm5kZWYgRVZfU1cKKyMgZGVmaW5lIEVWX1NXICAgICAgICAgMHgwNQorI2VuZGlmCisjaWZuZGVmIEVWX0tFWQorIyBkZWZpbmUgRVZfS0VZICAgICAgICAweDAxCisjZW5kaWYKKyNpZm5kZWYgU1dfTElECisjIGRlZmluZSBTV19MSUQgICAgICAgIDB4MDAKKyNlbmRpZgorI2lmbmRlZiBTV19SRktJTExfQUxMCisjIGRlZmluZSBTV19SRktJTExfQUxMIDB4MDMKKyNlbmRpZgorI2lmbmRlZiBLRVlfUE9XRVIKKyMgZGVmaW5lIEtFWV9QT1dFUiAgICAgIDExNiAgICAgLyogU0MgU3lzdGVtIFBvd2VyIERvd24gKi8KKyNlbmRpZgorI2lmbmRlZiBLRVlfU0xFRVAKKyMgZGVmaW5lIEtFWV9TTEVFUCAgICAgIDE0MiAgICAgLyogU0MgU3lzdGVtIFNsZWVwICovCisjZW5kaWYKKworZW51bSB7CisJT1BUX2MgPSAoMSA8PCAwKSwKKwlPUFRfZCA9ICgxIDw8IDEpLAorCU9QVF9lID0gKDEgPDwgMiksCisJT1BUX2YgPSAoMSA8PCAzKSwKKwlPUFRfbCA9ICgxIDw8IDQpLAorCU9QVF9hID0gKDEgPDwgNSksCisJT1BUX00gPSAoMSA8PCA2KSwKKwlPUFRfcCA9ICgxIDw8IDcpICogRU5BQkxFX0ZFQVRVUkVfUElERklMRSwKK307CisKK3N0cnVjdCBhY3BpX2V2ZW50IHsKKwljb25zdCBjaGFyICpzX3R5cGU7CisJdWludDE2X3Qgbl90eXBlOworCWNvbnN0IGNoYXIgKnNfY29kZTsKKwl1aW50MTZfdCBuX2NvZGU7CisJdWludDMyX3QgdmFsdWU7CisJY29uc3QgY2hhciAqZGVzYzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ldmVudCBmX2V2dF90YWJbXSA9IHsKKwl7ICJFVl9LRVkiLCAweDAxLCAiS0VZX1BPV0VSIiwgMTE2LCAxLCAiYnV0dG9uL3Bvd2VyIFBXUkYgMDAwMDAwODAiIH0sCisJeyAiRVZfS0VZIiwgMHgwMSwgIktFWV9QT1dFUiIsIDExNiwgMSwgImJ1dHRvbi9wb3dlciBQV1JCIDAwMDAwMDgwIiB9LAorfTsKKworc3RydWN0IGFjcGlfYWN0aW9uIHsKKwljb25zdCBjaGFyICprZXk7CisJY29uc3QgY2hhciAqYWN0aW9uOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2FjdGlvbiBmX2FjdF90YWJbXSA9IHsKKwl7ICJQV1JGIiwgIlBXUkYvMDAwMDAwODAiIH0sCisJeyAiTElEMCIsICJMSUQvMDAwMDAwODAiIH0sCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IGFjcGlfYWN0aW9uICphY3RfdGFiOworCWludCBuX2FjdDsKKwlzdHJ1Y3QgYWNwaV9ldmVudCAqZXZ0X3RhYjsKKwlpbnQgbl9ldnQ7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBhY3RfdGFiICAgICAgICAgKEcuYWN0X3RhYikKKyNkZWZpbmUgbl9hY3QgICAgICAgICAgIChHLm5fYWN0ICApCisjZGVmaW5lIGV2dF90YWIgICAgICAgICAoRy5ldnRfdGFiKQorI2RlZmluZSBuX2V2dCAgICAgICAgICAgKEcubl9ldnQgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBhY3BpZCBsaXN0ZW5zIHRvIEFDUEkgZXZlbnRzIGNvbWluZyBlaXRoZXIgaW4gdGV4dHVhbCBmb3JtCisgKiBmcm9tIC9wcm9jL2FjcGkvZXZlbnQgKHRob3VnaCBpdCBpcyBtYXJrZWQgZGVwcmVjYXRlZCwKKyAqIGl0IGlzIHN0aWxsIHdpZGVseSB1c2VkIGFuZCBfaXNfIGEgc3RhbmRhcmQpIG9yIGluIGJpbmFyeSBmb3JtCisgKiBmcm9tIHNwZWNpZmllZCBldmRldnMgKGp1c3QgdXNlIC9kZXYvaW5wdXQvZXZlbnQqKS4KKyAqIEl0IHBhcnNlcyB0aGUgZXZlbnQgdG8gcmV0cmlldmUgQUNUSU9OIGFuZCBhIHBvc3NpYmxlIFBBUkFNRVRFUi4KKyAqIEl0IHRoZW4gc3Bhd25zIC9ldGMvYWNwaS88QUNUSU9OPlsvPFBBUkFNRVRFUj5dIGVpdGhlciB2aWEgcnVuLXBhcnRzCisgKiAoaWYgdGhlIHJlc3VsdGluZyBwYXRoIGlzIGEgZGlyZWN0b3J5KSBvciBkaXJlY3RseS4KKyAqIElmIHRoZSByZXN1bHRpbmcgcGF0aCBkb2VzIG5vdCBleGlzdCBpdCBsb2dzIGl0IHZpYSBwZXJyb3IKKyAqIGFuZCBjb250aW51ZXMgbGlzdGVuaW5nLgorICovCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZXZlbnQoY29uc3QgY2hhciAqZXZlbnQpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqaGFuZGxlciA9IHhhc3ByaW50ZigiLi8lcyIsIGV2ZW50KTsKKwljb25zdCBjaGFyICphcmdzW10gPSB7ICJydW4tcGFydHMiLCBoYW5kbGVyLCBOVUxMIH07CisKKwkvLyBkZWJ1ZyBpbmZvCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZCkgeworCQliYl9lcnJvcl9tc2coIiVzIiwgZXZlbnQpOworCX0KKworCS8vIHNwYXduIGhhbmRsZXIKKwkvLyBOLkIuIHJ1bi1wYXJ0cyB3b3VsZCByZXF1aXJlIHNjcmlwdHMgdG8gaGF2ZSAjIS9iaW4vc2gKKwkvLyBoYW5kbGVyIGlzIGRpcmVjdG9yeT8gLT4gdXNlIHJ1bi1wYXJ0cworCS8vIGhhbmRsZXIgaXMgZmlsZT8gLT4gcnVuIGl0IGRpcmVjdGx5CisJaWYgKDAgPT0gc3RhdChldmVudCwgJnN0KSkKKwkJc3Bhd24oKGNoYXIgKiopYXJncyArICgwPT0oc3Quc3RfbW9kZSAmIFNfSUZESVIpKSk7CisJZWxzZQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhldmVudCk7CisKKwlmcmVlKGhhbmRsZXIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF9hY3Rpb24oc3RydWN0IGlucHV0X2V2ZW50ICpldiwgY29uc3QgY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKmFjdGlvbiA9IE5VTEw7CisJaW50IGk7CisKKwkvLyBtYXAgZXZlbnQKKwlmb3IgKGkgPSAwOyBpIDwgbl9ldnQ7IGkrKykgeworCQlpZiAoZXYpIHsKKwkJCWlmIChldi0+dHlwZSA9PSBldnRfdGFiW2ldLm5fdHlwZSAmJiBldi0+Y29kZSA9PSBldnRfdGFiW2ldLm5fY29kZSAmJiBldi0+dmFsdWUgPT0gZXZ0X3RhYltpXS52YWx1ZSkgeworCQkJCWFjdGlvbiA9IGV2dF90YWJbaV0uZGVzYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChidWYpIHsKKwkJCWlmIChzdHJuY21wKGJ1ZiwgZXZ0X3RhYltpXS5kZXNjLCBzdHJsZW4oYnVmKSkgPT0gMCkgeworCQkJCWFjdGlvbiA9IGV2dF90YWJbaV0uZGVzYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIGdldCBhY3Rpb24KKwlpZiAoYWN0aW9uKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuX2FjdDsgaSsrKSB7CisJCQlpZiAoc3Ryc3RyKGFjdGlvbiwgYWN0X3RhYltpXS5rZXkpKSB7CisJCQkJYWN0aW9uID0gYWN0X3RhYltpXS5hY3Rpb247CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYWN0aW9uOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9jb25mX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljaGFyICp0b2tlbnNbMl07CisKKwlwYXJzZXIgPSBjb25maWdfb3BlbjIoZmlsZW5hbWUsIGZvcGVuX2Zvcl9yZWFkKTsKKworCWlmIChwYXJzZXIpIHsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCAyLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJCWFjdF90YWIgPSB4cmVhbGxvY192ZWN0b3IoYWN0X3RhYiwgMSwgbl9hY3QpOworCQkJYWN0X3RhYltuX2FjdF0ua2V5ID0geHN0cmR1cCh0b2tlbnNbMF0pOworCQkJYWN0X3RhYltuX2FjdF0uYWN0aW9uID0geHN0cmR1cCh0b2tlbnNbMV0pOworCQkJbl9hY3QrKzsKKwkJfQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9IGVsc2UgeworCQlhY3RfdGFiID0gKHZvaWQqKWZfYWN0X3RhYjsKKwkJbl9hY3QgPSBBUlJBWV9TSVpFKGZfYWN0X3RhYik7CisJfQorfQorCitzdGF0aWMgdm9pZCBwYXJzZV9tYXBfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlwYXJzZXJfdCAqcGFyc2VyOworCWNoYXIgKnRva2Vuc1s2XTsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuMihmaWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCisJaWYgKHBhcnNlcikgeworCQl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIDYsIDYsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQkJZXZ0X3RhYiA9IHhyZWFsbG9jX3ZlY3RvcihldnRfdGFiLCAxLCBuX2V2dCk7CisJCQlldnRfdGFiW25fZXZ0XS5zX3R5cGUgPSB4c3RyZHVwKHRva2Vuc1swXSk7CisJCQlldnRfdGFiW25fZXZ0XS5uX3R5cGUgPSB4c3RydG91KHRva2Vuc1sxXSwgMTYpOworCQkJZXZ0X3RhYltuX2V2dF0uc19jb2RlID0geHN0cmR1cCh0b2tlbnNbMl0pOworCQkJZXZ0X3RhYltuX2V2dF0ubl9jb2RlID0geGF0b3UxNih0b2tlbnNbM10pOworCQkJZXZ0X3RhYltuX2V2dF0udmFsdWUgPSB4YXRvaV9wb3NpdGl2ZSh0b2tlbnNbNF0pOworCQkJZXZ0X3RhYltuX2V2dF0uZGVzYyA9IHhzdHJkdXAodG9rZW5zWzVdKTsKKwkJCW5fZXZ0Kys7CisJCX0KKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJfSBlbHNlIHsKKwkJZXZ0X3RhYiA9ICh2b2lkKilmX2V2dF90YWI7CisJCW5fZXZ0ID0gQVJSQVlfU0laRShmX2V2dF90YWIpOworCX0KK30KKworLyoKKyAqIGFjcGlkIFstYyBjb25mX2Rpcl0gWy1yIGNvbmZfZmlsZSBdIFstYSBtYXBfZmlsZSBdIFstbCBsb2dfZmlsZV0gWy1lIHByb2NfZXZlbnRfZmlsZV0KKyAqLworCitpbnQgYWNwaWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFjcGlkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaW5wdXRfZXZlbnQgZXY7CisJaW50IG5mZDsKKwlpbnQgb3B0czsKKwlzdHJ1Y3QgcG9sbGZkICpwZmQ7CisJY29uc3QgY2hhciAqb3B0X2RpciA9ICIvZXRjL2FjcGkiOworCWNvbnN0IGNoYXIgKm9wdF9pbnB1dCA9ICIvZGV2L2lucHV0L2V2ZW50IjsKKwljb25zdCBjaGFyICpvcHRfbG9nZmlsZSA9ICIvdmFyL2xvZy9hY3BpZC5sb2ciOworCWNvbnN0IGNoYXIgKm9wdF9hY3Rpb24gPSAiL2V0Yy9hY3BpZC5jb25mIjsKKwljb25zdCBjaGFyICpvcHRfbWFwID0gIi9ldGMvYWNwaS5tYXAiOworI2lmIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUKKwljb25zdCBjaGFyICpvcHRfcGlkZmlsZSA9ICIvdmFyL3J1bi9hY3BpZC5waWQiOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImRmOmUtLWUiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiYzpkZTpmbDphOk06IiBJRl9GRUFUVVJFX1BJREZJTEUoInA6IikgSUZfRkVBVFVSRV9BQ1BJRF9DT01QQVQoImc6bTpzOlM6diIpLAorCQkmb3B0X2RpciwgJm9wdF9pbnB1dCwgJm9wdF9sb2dmaWxlLCAmb3B0X2FjdGlvbiwgJm9wdF9tYXAKKwkJSUZfRkVBVFVSRV9QSURGSUxFKCwgJm9wdF9waWRmaWxlKQorCQlJRl9GRUFUVVJFX0FDUElEX0NPTVBBVCgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpCisJKTsKKworCWlmICghKG9wdHMgJiBPUFRfZikpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DTE9TRV9FWFRSQV9GRFMsIGFyZ3YpOworCX0KKworCWlmICghKG9wdHMgJiBPUFRfZCkpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRyB8IExPR01PREVfU1RESU87CisJfSBlbHNlIHsKKwkJeG1vdmVfZmQoeG9wZW4ob3B0X2xvZ2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCBTVERPVVRfRklMRU5PKTsKKwl9CisKKwlwYXJzZV9jb25mX2ZpbGUob3B0X2FjdGlvbik7CisJcGFyc2VfbWFwX2ZpbGUob3B0X21hcCk7CisKKwl4Y2hkaXIob3B0X2Rpcik7CisKKwliYl9zaWduYWxzKCgxIDw8IFNJR0NITEQpLCBTSUdfSUdOKTsKKwliYl9zaWduYWxzKEJCX0ZBVEFMX1NJR1MsIHJlY29yZF9zaWdubyk7CisKKwlwZmQgPSBOVUxMOworCW5mZCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IGZkOworCQljaGFyICpkZXZfZXZlbnQ7CisKKwkJZGV2X2V2ZW50ID0geGFzcHJpbnRmKChvcHRpb25fbWFzazMyICYgT1BUX2UpID8gIiVzIiA6ICIlcyV1Iiwgb3B0X2lucHV0LCBuZmQpOworCQlmZCA9IG9wZW4oZGV2X2V2ZW50LCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOworCQlpZiAoZmQgPCAwKSB7CisJCQlpZiAobmZkID09IDApCisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShkZXZfZXZlbnQpOworCQkJYnJlYWs7CisJCX0KKwkJcGZkID0geHJlYWxsb2NfdmVjdG9yKHBmZCwgMSwgbmZkKTsKKwkJcGZkW25mZF0uZmQgPSBmZDsKKwkJcGZkW25mZF0uZXZlbnRzID0gUE9MTElOOworCQluZmQrKzsKKwl9CisKKwl3cml0ZV9waWRmaWxlKG9wdF9waWRmaWxlKTsKKworCXdoaWxlIChwb2xsKHBmZCwgbmZkLCAtMSkgPiAwKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbmZkOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKmV2ZW50ID0gTlVMTDsKKworCQkJbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CisKKwkJCWlmICghKHBmZFtpXS5yZXZlbnRzICYgUE9MTElOKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZSkgeworCQkJCWNoYXIgKmJ1ZjsKKwkJCQlpbnQgbGVuOworCisJCQkJYnVmID0geG1hbGxvY19yZWFkcyhwZmRbaV0uZmQsIE5VTEwpOworCQkJCS8qIGJ1ZiA9ICJidXR0b24vcG93ZXIgUFdSQiAwMDAwMDA4MCAwMDAwMDAwMCIgKi8KKwkJCQlsZW4gPSBzdHJsZW4oYnVmKSAtIDk7CisJCQkJaWYgKGxlbiA+PSAwKQorCQkJCQlidWZbbGVuXSA9ICdcMCc7CisJCQkJZXZlbnQgPSBmaW5kX2FjdGlvbihOVUxMLCBidWYpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2l6ZW9mKGV2KSAhPSBmdWxsX3JlYWQocGZkW2ldLmZkLCAmZXYsIHNpemVvZihldikpKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChldi52YWx1ZSAhPSAxICYmIGV2LnZhbHVlICE9IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJZXZlbnQgPSBmaW5kX2FjdGlvbigmZXYsIE5VTEwpOworCQkJfQorCQkJaWYgKCFldmVudCkKKwkJCQljb250aW51ZTsKKwkJCS8vIHNwYXduIGV2ZW50IGhhbmRsZXIKKwkJCXByb2Nlc3NfZXZlbnQoZXZlbnQpOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCXdoaWxlIChuZmQtLSkgeworCQkJaWYgKHBmZFtuZmRdLmZkKSB7CisJCQkJY2xvc2UocGZkW25mZF0uZmQpOworCQkJfQorCQl9CisJCWZyZWUocGZkKTsKKwl9CisJcmVtb3ZlX3BpZGZpbGUob3B0X3BpZGZpbGUpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvYmxraWQuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvYmxraWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzAzNjBjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ibGtpZC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFByaW50IFVVSURzIG9uIGFsbCBmaWxlc3lzdGVtcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEZW55cyBWbGFzZW5rby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBibGtpZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIGJsa2lkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgVVVJRHMgb2YgYWxsIGZpbGVzeXN0ZW1zIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKworLy9UT0RPOiBleHRlbmQgdG8gdGFrZSBCTE9DS0RFViBhcmdzLCBhbmQgc2hvdyBUWVBFPSJmc3R5cGUiCisKK2ludCBibGtpZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmxraWRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXdoaWxlICgqKythcmd2KSB7CisJCS8qIE5vdGU6IGJvZ3VzIGRldmljZSBuYW1lcyBkb24ndCBjYXVzZSBhbnkgZXJyb3IgbWVzc2FnZXMgKi8KKwkJYWRkX3RvX3V1aWRfY2FjaGUoKmFyZ3YpOworCX0KKworCWRpc3BsYXlfdXVpZF9jYWNoZSgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ibG9ja2Rldi5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ibG9ja2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWU1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2Jsb2NrZGV2LmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBibG9ja2RldiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZXJnZXkgTmF1bW92IDxza25hdW1vdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2FwcGxldDpJRl9CTE9DS0RFVihBUFBMRVQoYmxvY2tkZXYsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQkxPQ0tERVYpICs9IGJsb2NrZGV2Lm8KKworLy9jb25maWc6Y29uZmlnIEJMT0NLREVWCisvL2NvbmZpZzoJYm9vbCAiYmxvY2tkZXYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUGVyZm9ybXMgc29tZSBpb2N0bHMgd2l0aCBibG9jayBkZXZpY2VzLgorCisvL3VzYWdlOiNkZWZpbmUgYmxvY2tkZXZfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIk9QVElPTiBCTE9DS0RFViIKKy8vdXNhZ2U6I2RlZmluZSBibG9ja2Rldl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktLXNldHJvCQlTZXQgcm8iCisvL3VzYWdlOiAgICAgIlxuCS0tc2V0cncJCVNldCBydyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1nZXRybwkJR2V0IHJvIgorLy91c2FnZTogICAgICJcbgktLWdldHNzCQlHZXQgc2VjdG9yIHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS0tZ2V0YnN6CUdldCBibG9jayBzaXplIgorLy91c2FnZTogICAgICJcbgktLXNldGJzeiBCWVRFUwlTZXQgYmxvY2sgc2l6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLS1nZXRzegkJR2V0IGRldmljZSBzaXplIGluIDUxMi1ieXRlIHNlY3RvcnMiCisvKi8vdXNhZ2U6ICAgICAiXG4JLS1nZXRzaXplCUdldCBkZXZpY2Ugc2l6ZSBpbiBzZWN0b3JzIChkZXByZWNhdGVkKSIqLworLy91c2FnZTogICAgICJcbgktLWdldHNpemU2NAlHZXQgZGV2aWNlIHNpemUgaW4gYnl0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS0tZmx1c2hidWZzCUZsdXNoIGJ1ZmZlcnMiCisvL3VzYWdlOiAgICAgIlxuCS0tcmVyZWFkcHQJUmVyZWFkIHBhcnRpdGlvbiB0YWJsZSIKKworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCitlbnVtIHsKKwlBUkdfTk9ORSAgID0gMCwKKwlBUkdfSU5UICAgID0gMSwKKwlBUkdfVUxPTkcgID0gMiwKKwkvKiBZZXMsIEJMS0dFVFNJWkU2NCB0YWtlcyBwb2ludGVyIHRvIHVpbnQ2NF90LCBub3QgdWxsb25nISAqLworCUFSR19VNjQgICAgPSAzLAorCUFSR19NQVNLICAgPSAzLAorCisJRkxfVVNSQVJHICAgPSA0LCAvKiBhcmd1bWVudCBpcyBwcm92aWRlZCBieSB1c2VyICovCisJRkxfTk9SRVNVTFQgPSA4LAorCUZMX1NDQUxFNTEyID0gMTYsCit9OworCitzdHJ1Y3QgYmRjIHsKKwl1aW50MzJfdCAgIGlvYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlvY3RsIGNvZGUgKi8KKwljb25zdCBjaGFyIG5hbWVbc2l6ZW9mKCJmbHVzaGJ1ZnMiKV07IC8qICItLXNldGZvbyIgd290aG91dCAiLS0iICovCisJdWludDhfdCAgICBmbGFnczsKKwlpbnQ4X3QgICAgIGFyZ3ZhbDsgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgYXJndW1lbnQgdmFsdWUgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmRjIGJkY29tbWFuZHNbXSA9IHsKKwl7CisJCS5pb2MgPSBCTEtST1NFVCwKKwkJLm5hbWUgPSAic2V0cm8iLAorCQkuZmxhZ3MgPSBBUkdfSU5UICsgRkxfTk9SRVNVTFQsCisJCS5hcmd2YWwgPSAxLAorCX0seworCQkuaW9jID0gQkxLUk9TRVQsCisJCS5uYW1lID0gInNldHJ3IiwKKwkJLmZsYWdzID0gQVJHX0lOVCArIEZMX05PUkVTVUxULAorCQkuYXJndmFsID0gMCwKKwl9LHsKKwkJLmlvYyA9IEJMS1JPR0VULAorCQkubmFtZSA9ICJnZXRybyIsCisJCS5mbGFncyA9IEFSR19JTlQsCisJCS5hcmd2YWwgPSAtMSwKKwl9LHsKKwkJLmlvYyA9IEJMS1NTWkdFVCwKKwkJLm5hbWUgPSAiZ2V0c3MiLAorCQkuZmxhZ3MgPSBBUkdfSU5ULAorCQkuYXJndmFsID0gLTEsCisJfSx7CisJCS5pb2MgPSBCTEtCU1pHRVQsCisJCS5uYW1lID0gImdldGJzeiIsCisJCS5mbGFncyA9IEFSR19JTlQsCisJCS5hcmd2YWwgPSAtMSwKKwl9LHsKKwkJLmlvYyA9IEJMS0JTWlNFVCwKKwkJLm5hbWUgPSAic2V0YnN6IiwKKwkJLmZsYWdzID0gQVJHX0lOVCArIEZMX05PUkVTVUxUICsgRkxfVVNSQVJHLAorCQkuYXJndmFsID0gMCwKKwl9LHsKKwkJLmlvYyA9IEJMS0dFVFNJWkU2NCwKKwkJLm5hbWUgPSAiZ2V0c3oiLAorCQkuZmxhZ3MgPSBBUkdfVTY0ICsgRkxfU0NBTEU1MTIsCisJCS5hcmd2YWwgPSAtMSwKKwl9LHsKKwkJLmlvYyA9IEJMS0dFVFNJWkUsCisJCS5uYW1lID0gImdldHNpemUiLAorCQkuZmxhZ3MgPSBBUkdfVUxPTkcsCisJCS5hcmd2YWwgPSAtMSwKKwl9LHsKKwkJLmlvYyA9IEJMS0dFVFNJWkU2NCwKKwkJLm5hbWUgPSAiZ2V0c2l6ZTY0IiwKKwkJLmZsYWdzID0gQVJHX1U2NCwKKwkJLmFyZ3ZhbCA9IC0xLAorCX0seworCQkuaW9jID0gQkxLRkxTQlVGLAorCQkubmFtZSA9ICJmbHVzaGJ1ZnMiLAorCQkuZmxhZ3MgPSBBUkdfTk9ORSArIEZMX05PUkVTVUxULAorCQkuYXJndmFsID0gMCwKKwl9LHsKKwkJLmlvYyA9IEJMS1JSUEFSVCwKKwkJLm5hbWUgPSAicmVyZWFkcHQiLAorCQkuZmxhZ3MgPSBBUkdfTk9ORSArIEZMX05PUkVTVUxULAorCQkuYXJndmFsID0gMCwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJkYyAqZmluZF9jbWQoY29uc3QgY2hhciAqcykKK3sKKwljb25zdCBzdHJ1Y3QgYmRjICpiZGNtZCA9IGJkY29tbWFuZHM7CisJaWYgKHNbMF0gPT0gJy0nICYmIHNbMV0gPT0gJy0nKSB7CisJCXMgKz0gMjsKKwkJZG8geworCQkJaWYgKHN0cmNtcChzLCBiZGNtZC0+bmFtZSkgPT0gMCkKKwkJCQlyZXR1cm4gYmRjbWQ7CisJCQliZGNtZCsrOworCQl9IHdoaWxlIChiZGNtZCAhPSBiZGNvbW1hbmRzICsgQVJSQVlfU0laRShiZGNvbW1hbmRzKSk7CisJfQorCWJiX3Nob3dfdXNhZ2UoKTsKK30KKworaW50IGJsb2NrZGV2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBibG9ja2Rldl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3Qgc3RydWN0IGJkYyAqYmRjbWQ7CisJaW50IGZkOworCXVpbnQ2NF90IHU2NDsKKwl1bmlvbiB7CisJCWludCBpOworCQl1bnNpZ25lZCBsb25nIGx1OworCQl1aW50NjRfdCB1NjQ7CisJfSBpb2N0bF92YWxfb25fc3RhY2s7CisKKwlhcmd2Kys7CisJaWYgKCFhcmd2WzBdIHx8ICFhcmd2WzFdKSAvKiBtdXN0IGhhdmUgYXQgbGVhc3QgMiBhcmdzICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWJkY21kID0gZmluZF9jbWQoKmFyZ3YpOworCisJdTY0ID0gKGludCliZGNtZC0+YXJndmFsOworCWlmIChiZGNtZC0+ZmxhZ3MgJiBGTF9VU1JBUkcpCisJCXU2NCA9IHhhdG9pX3Bvc2l0aXZlKCorK2FyZ3YpOworCisJYXJndisrOworCWlmICghYXJndlswXSB8fCBhcmd2WzFdKQorCQliYl9zaG93X3VzYWdlKCk7CisJZmQgPSB4b3Blbihhcmd2WzBdLCBPX1JET05MWSk7CisKKwlpb2N0bF92YWxfb25fc3RhY2sudTY0ID0gdTY0OworI2lmIEJCX0JJR19FTkRJQU4KKwkvKiBTdG9yZSBkYXRhIHByb3Blcmx5IHdydCBkYXRhIHNpemUuCisJICogKDEpIEl0J3Mgbm8tb3AgZm9yIGxpdHRsZS1lbmRpYW4uCisJICogKDIpIGl0J3Mgbm8tb3AgZm9yIDAgYW5kIC0xLiBPbmx5IC0tc2V0cm8gdXNlcyBhcmcgIT0gMCBhbmQgIT0gLTEsCisJICogYW5kIGl0IGlzIEFSR19JTlQuIC0tc2V0YnN6IFVTRVJfVkFMIGlzIGFsc28gQVJHX0lOVC4KKwkgKiBUaHVzLCB3ZSBkb24ndCBuZWVkIHRvIGhhbmRsZSBBUkdfVUxPTkcuCisJICovCisJc3dpdGNoIChiZGNtZC0+ZmxhZ3MgJiBBUkdfTUFTSykgeworCWNhc2UgQVJHX0lOVDoKKwkJaW9jdGxfdmFsX29uX3N0YWNrLmkgPSAoaW50KXU2NDsKKwkJYnJlYWs7CisjIGlmIDAgLyogdW51c2VkICovCisJY2FzZSBBUkdfVUxPTkc6CisJCWlvY3RsX3ZhbF9vbl9zdGFjay5sdSA9ICh1bnNpZ25lZCBsb25nKXU2NDsKKwkJYnJlYWs7CisjIGVuZGlmCisJfQorI2VuZGlmCisKKwlpZiAoaW9jdGwoZmQsIGJkY21kLT5pb2MsICZpb2N0bF92YWxfb25fc3RhY2sudTY0KSA9PSAtMSkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZSgqYXJndik7CisKKwkvKiBGZXRjaCBpdCBpbnRvIHJlZ2lzdGVyKHMpICovCisJdTY0ID0gaW9jdGxfdmFsX29uX3N0YWNrLnU2NDsKKworCWlmIChiZGNtZC0+ZmxhZ3MgJiBGTF9TQ0FMRTUxMikKKwkJdTY0ID4+PSA5OworCisJLyogWmVyby0gb3Igb25lLWV4dGVuZCB0aGUgdmFsdWUgaWYgbmVlZGVkLCB0aGVuIHByaW50ICovCisJc3dpdGNoIChiZGNtZC0+ZmxhZ3MgJiAoQVJHX01BU0srRkxfTk9SRVNVTFQpKSB7CisJY2FzZSBBUkdfSU5UOgorCQkvKiBTbWFsbGVyIGNvZGUgd2hlbiB3ZSB1c2UgbG9uZyBsb25nCisJCSAqIChnY2MgdGFpbC1tZXJnZXMgcHJpbnRmIGNhbGwpCisJCSAqLworCQlwcmludGYoIiVsbGRcbiIsIChsb25nIGxvbmcpKGludCl1NjQpOworCQlicmVhazsKKwljYXNlIEFSR19VTE9ORzoKKwkJdTY0ID0gKHVuc2lnbmVkIGxvbmcpdTY0OworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgQVJHX1U2NDoKKwkJcHJpbnRmKCIlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXU2NCk7CisJCWJyZWFrOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoZmQpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2RtZXNnLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2RtZXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwNWRhNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvZG1lc2cuYwpAQCAtMCwwICsxLDg3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKgorICogZG1lc2cgLSBkaXNwbGF5L2NvbnRyb2wga2VybmVsIHJpbmcgYnVmZmVyLgorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKiBDb3B5cmlnaHQgMjAwNiBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIgPHJlcC5ub3BAYW9uLmF0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGRtZXNnX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNdIFstbiBMRVZFTF0gWy1zIFNJWkVdIgorLy91c2FnZTojZGVmaW5lIGRtZXNnX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgb3IgY29udHJvbCB0aGUga2VybmVsIHJpbmcgYnVmZmVyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCQlDbGVhciByaW5nIGJ1ZmZlciBhZnRlciBwcmludGluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTEVWRUwJU2V0IGNvbnNvbGUgbG9nZ2luZyBsZXZlbCIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0laRQkJQnVmZmVyIHNpemUiCisKKyNpbmNsdWRlIDxzeXMva2xvZy5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBkbWVzZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZG1lc2dfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBsZW4sIGxldmVsOworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBvcHRzOworCWVudW0geworCQlPUFRfYyA9IDEgPDwgMCwKKwkJT1BUX3MgPSAxIDw8IDEsCisJCU9QVF9uID0gMSA8PCAyCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gInMrOm4rIjsgLyogbnVtZXJpYyAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiY3M6bjoiLCAmbGVuLCAmbGV2ZWwpOworCWlmIChvcHRzICYgT1BUX24pIHsKKwkJaWYgKGtsb2djdGwoOCwgTlVMTCwgKGxvbmcpIGxldmVsKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgia2xvZ2N0bCIpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCWlmICghKG9wdHMgJiBPUFRfcykpCisJCWxlbiA9IGtsb2djdGwoMTAsIE5VTEwsIDApOyAvKiByZWFkIHJpbmcgYnVmZmVyIHNpemUgKi8KKwlpZiAobGVuIDwgMTYqMTAyNCkKKwkJbGVuID0gMTYqMTAyNDsKKwlpZiAobGVuID4gMTYqMTAyNCoxMDI0KQorCQlsZW4gPSAxNioxMDI0KjEwMjQ7CisKKwlidWYgPSB4bWFsbG9jKGxlbik7CisJbGVuID0ga2xvZ2N0bCgzICsgKG9wdHMgJiBPUFRfYyksIGJ1ZiwgbGVuKTsgLyogcmVhZCByaW5nIGJ1ZmZlciAqLworCWlmIChsZW4gPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImtsb2djdGwiKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKworCWlmIChFTkFCTEVfRkVBVFVSRV9ETUVTR19QUkVUVFkpIHsKKwkJaW50IGxhc3QgPSAnXG4nOworCQlpbnQgaW4gPSAwOworCisJCS8qIFNraXAgPCM+IGF0IHRoZSBzdGFydCBvZiBsaW5lcyAqLworCQl3aGlsZSAoMSkgeworCQkJaWYgKGxhc3QgPT0gJ1xuJyAmJiBidWZbaW5dID09ICc8JykgeworCQkJCWluICs9IDM7CisJCQkJaWYgKGluID49IGxlbikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlsYXN0ID0gYnVmW2luXTsKKwkJCXB1dGNoYXIobGFzdCk7CisJCQlpbisrOworCQkJaWYgKGluID49IGxlbikKKwkJCQlicmVhazsKKwkJfQorCQkvKiBNYWtlIHN1cmUgd2UgZW5kIHdpdGggYSBuZXdsaW5lICovCisJCWlmIChsYXN0ICE9ICdcbicpCisJCQliYl9wdXRjaGFyKCdcbicpOworCX0gZWxzZSB7CisJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCBsZW4pOworCQlpZiAoYnVmW2xlbi0xXSAhPSAnXG4nKQorCQkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoYnVmKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2Zic2V0LmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2Zic2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2YzJhYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvZmJzZXQuYwpAQCAtMCwwICsxLDUxMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBmYnNldCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoaXMgaXMgYSBmcm9tLXNjcmF0Y2ggaW1wbGVtZW50YXRpb24gb2YgZmJzZXQ7IGJ1dCB0aGUgZGUgZmFjdG8gZmJzZXQKKyAqIGltcGxlbWVudGF0aW9uIHdhcyBhIGdvb2QgcmVmZXJlbmNlLiBmYnNldCAob3JpZ2luYWwpIGlzIHJlbGVhc2VkIHVuZGVyCisgKiB0aGUgR1BMLCBhbmQgaXMgKGMpIDE5OTUtMTk5OSBieToKKyAqICAgICBHZWVydCBVeXR0ZXJob2V2ZW4gKEdlZXJ0LlV5dHRlcmhvZXZlbkBjcy5rdWxldXZlbi5hYy5iZSkKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmJzZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbTU9ERV0iCisvL3VzYWdlOiNkZWZpbmUgZmJzZXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGFuZCBtb2RpZnkgZnJhbWUgYnVmZmVyIHNldHRpbmdzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmYnNldF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBmYnNldFxuIgorLy91c2FnZTogICAgICAgIm1vZGUgXCIxMDI0eDc2OC03NlwiXG4iCisvL3VzYWdlOiAgICAgICAiCSMgRDogNzguNjUzIE1IeiwgSDogNTkuOTQ5IGtIeiwgVjogNzUuNjk0IEh6XG4iCisvL3VzYWdlOiAgICAgICAiCWdlb21ldHJ5IDEwMjQgNzY4IDEwMjQgNzY4IDE2XG4iCisvL3VzYWdlOiAgICAgICAiCXRpbWluZ3MgMTI3MTQgMTI4IDMyIDE2IDQgMTI4IDRcbiIKKy8vdXNhZ2U6ICAgICAgICIJYWNjZWwgZmFsc2VcbiIKKy8vdXNhZ2U6ICAgICAgICIJcmdiYSA1LzExLDYvNSw1LzAsMC8wXG4iCisvL3VzYWdlOiAgICAgICAiZW5kbW9kZVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBERUZBVUxURkJERVYgIEZCXzAKKyNkZWZpbmUgREVGQVVMVEZCTU9ERSAiL2V0Yy9mYi5tb2RlcyIKKworLyogU3R1ZmYgc3RvbGVuIGZyb20gdGhlIGtlcm5lbCdzIGZiLmggKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfQUxMIDY0CitlbnVtIHsKKwlGQklPR0VUX1ZTQ1JFRU5JTkZPID0gMHg0NjAwLAorCUZCSU9QVVRfVlNDUkVFTklORk8gPSAweDQ2MDEKK307CisKK3N0cnVjdCBmYl9iaXRmaWVsZCB7CisJdWludDMyX3Qgb2Zmc2V0OyAgICAgICAgICAgICAgICAvKiBiZWdpbm5pbmcgb2YgYml0ZmllbGQgKi8KKwl1aW50MzJfdCBsZW5ndGg7ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBiaXRmaWVsZCAqLworCXVpbnQzMl90IG1zYl9yaWdodDsgICAgICAgICAgICAgLyogIT0wOiBNb3N0IHNpZ25pZmljYW50IGJpdCBpcyByaWdodCAqLworfTsKK3N0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB7CisJdWludDMyX3QgeHJlczsgICAgICAgICAgICAgICAgICAvKiB2aXNpYmxlIHJlc29sdXRpb24gKi8KKwl1aW50MzJfdCB5cmVzOworCXVpbnQzMl90IHhyZXNfdmlydHVhbDsgICAgICAgICAgLyogdmlydHVhbCByZXNvbHV0aW9uICovCisJdWludDMyX3QgeXJlc192aXJ0dWFsOworCXVpbnQzMl90IHhvZmZzZXQ7ICAgICAgICAgICAgICAgLyogb2Zmc2V0IGZyb20gdmlydHVhbCB0byB2aXNpYmxlICovCisJdWludDMyX3QgeW9mZnNldDsgICAgICAgICAgICAgICAvKiByZXNvbHV0aW9uICovCisKKwl1aW50MzJfdCBiaXRzX3Blcl9waXhlbDsKKwl1aW50MzJfdCBncmF5c2NhbGU7ICAgICAgICAgICAgIC8qICE9MCBHcmF5bGV2ZWxzIGluc3RlYWQgb2YgY29sb3JzICovCisKKwlzdHJ1Y3QgZmJfYml0ZmllbGQgcmVkOyAgICAgICAgIC8qIGJpdGZpZWxkIGluIGZiIG1lbSBpZiB0cnVlIGNvbG9yLCAqLworCXN0cnVjdCBmYl9iaXRmaWVsZCBncmVlbjsgICAgICAgLyogZWxzZSBvbmx5IGxlbmd0aCBpcyBzaWduaWZpY2FudCAqLworCXN0cnVjdCBmYl9iaXRmaWVsZCBibHVlOworCXN0cnVjdCBmYl9iaXRmaWVsZCB0cmFuc3A7ICAgICAgLyogdHJhbnNwYXJlbmN5ICovCisKKwl1aW50MzJfdCBub25zdGQ7ICAgICAgICAgICAgICAgIC8qICE9MCBOb24gc3RhbmRhcmQgcGl4ZWwgZm9ybWF0ICovCisKKwl1aW50MzJfdCBhY3RpdmF0ZTsgICAgICAgICAgICAgIC8qIHNlZSBGQl9BQ1RJVkFURV94ICovCisKKwl1aW50MzJfdCBoZWlnaHQ7ICAgICAgICAgICAgICAgIC8qIGhlaWdodCBvZiBwaWN0dXJlIGluIG1tICovCisJdWludDMyX3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAvKiB3aWR0aCBvZiBwaWN0dXJlIGluIG1tICovCisKKwl1aW50MzJfdCBhY2NlbF9mbGFnczsgICAgICAgICAgIC8qIGFjY2VsZXJhdGlvbiBmbGFncyAoaGludHMpICovCisKKwkvKiBUaW1pbmc6IEFsbCB2YWx1ZXMgaW4gcGl4Y2xvY2tzLCBleGNlcHQgcGl4Y2xvY2sgKG9mIGNvdXJzZSkgKi8KKwl1aW50MzJfdCBwaXhjbG9jazsgICAgICAgICAgICAgIC8qIHBpeGVsIGNsb2NrIGluIHBzIChwaWNvIHNlY29uZHMpICovCisJdWludDMyX3QgbGVmdF9tYXJnaW47ICAgICAgICAgICAvKiB0aW1lIGZyb20gc3luYyB0byBwaWN0dXJlICovCisJdWludDMyX3QgcmlnaHRfbWFyZ2luOyAgICAgICAgICAvKiB0aW1lIGZyb20gcGljdHVyZSB0byBzeW5jICovCisJdWludDMyX3QgdXBwZXJfbWFyZ2luOyAgICAgICAgICAvKiB0aW1lIGZyb20gc3luYyB0byBwaWN0dXJlICovCisJdWludDMyX3QgbG93ZXJfbWFyZ2luOworCXVpbnQzMl90IGhzeW5jX2xlbjsgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGhvcml6b250YWwgc3luYyAqLworCXVpbnQzMl90IHZzeW5jX2xlbjsgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHZlcnRpY2FsIHN5bmMgKi8KKwl1aW50MzJfdCBzeW5jOyAgICAgICAgICAgICAgICAgIC8qIHNlZSBGQl9TWU5DX3ggKi8KKwl1aW50MzJfdCB2bW9kZTsgICAgICAgICAgICAgICAgIC8qIHNlZSBGQl9WTU9ERV94ICovCisJdWludDMyX3QgcmVzZXJ2ZWRbNl07ICAgICAgICAgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHkgKi8KK307CisKK3N0YXRpYyB2b2lkIGNvcHlfaWZfZ3QwKHVpbnQzMl90ICpzcmMsIHVpbnQzMl90ICpkc3QsIHVuc2lnbmVkIGNudCkKK3sKKwlkbyB7CisJCWlmICgoaW50MzJfdCkgKnNyYyA+IDApCisJCQkqZHN0ID0gKnNyYzsKKwkJc3JjKys7CisJCWRzdCsrOworCX0gd2hpbGUgKC0tY250KTsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgY29weV9jaGFuZ2VkX3ZhbHVlcygKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpiYXNlLAorCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnNldCkKK3sKKwkvL2lmICgoaW50MzJfdCkgc2V0LT54cmVzID4gMCkgYmFzZS0+eHJlcyA9IHNldC0+eHJlczsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT55cmVzID4gMCkgYmFzZS0+eXJlcyA9IHNldC0+eXJlczsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT54cmVzX3ZpcnR1YWwgPiAwKSAgIGJhc2UtPnhyZXNfdmlydHVhbCA9IHNldC0+eHJlc192aXJ0dWFsOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnlyZXNfdmlydHVhbCA+IDApICAgYmFzZS0+eXJlc192aXJ0dWFsID0gc2V0LT55cmVzX3ZpcnR1YWw7CisJY29weV9pZl9ndDAoJnNldC0+eHJlcywgJmJhc2UtPnhyZXMsIDQpOworCisJaWYgKChpbnQzMl90KSBzZXQtPmJpdHNfcGVyX3BpeGVsID4gMCkgYmFzZS0+Yml0c19wZXJfcGl4ZWwgPSBzZXQtPmJpdHNfcGVyX3BpeGVsOworCS8vY29weV9pZl9ndDAoJnNldC0+Yml0c19wZXJfcGl4ZWwsICZiYXNlLT5iaXRzX3Blcl9waXhlbCwgMSk7CisKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5waXhjbG9jayA+IDApICAgICAgIGJhc2UtPnBpeGNsb2NrID0gc2V0LT5waXhjbG9jazsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5sZWZ0X21hcmdpbiA+IDApICAgIGJhc2UtPmxlZnRfbWFyZ2luID0gc2V0LT5sZWZ0X21hcmdpbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5yaWdodF9tYXJnaW4gPiAwKSAgIGJhc2UtPnJpZ2h0X21hcmdpbiA9IHNldC0+cmlnaHRfbWFyZ2luOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnVwcGVyX21hcmdpbiA+IDApICAgYmFzZS0+dXBwZXJfbWFyZ2luID0gc2V0LT51cHBlcl9tYXJnaW47CisJLy9pZiAoKGludDMyX3QpIHNldC0+bG93ZXJfbWFyZ2luID4gMCkgICBiYXNlLT5sb3dlcl9tYXJnaW4gPSBzZXQtPmxvd2VyX21hcmdpbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5oc3luY19sZW4gPiAwKSBiYXNlLT5oc3luY19sZW4gPSBzZXQtPmhzeW5jX2xlbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT52c3luY19sZW4gPiAwKSBiYXNlLT52c3luY19sZW4gPSBzZXQtPnZzeW5jX2xlbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5zeW5jID4gMCkgIGJhc2UtPnN5bmMgPSBzZXQtPnN5bmM7CisJLy9pZiAoKGludDMyX3QpIHNldC0+dm1vZGUgPiAwKSBiYXNlLT52bW9kZSA9IHNldC0+dm1vZGU7CisJY29weV9pZl9ndDAoJnNldC0+cGl4Y2xvY2ssICZiYXNlLT5waXhjbG9jaywgOSk7Cit9CisKKworZW51bSB7CisJQ01EX0ZCID0gMSwKKwlDTURfREIgPSAyLAorCUNNRF9HRU9NRVRSWSA9IDMsCisJQ01EX1RJTUlORyA9IDQsCisJQ01EX0FDQ0VMID0gNSwKKwlDTURfSFNZTkMgPSA2LAorCUNNRF9WU1lOQyA9IDcsCisJQ01EX0xBQ0VEID0gOCwKKwlDTURfRE9VQkxFID0gOSwKKy8qCUNNRF9YQ09NUEFUID0gICAgIDEwLCAqLworCUNNRF9BTEwgPSAxMSwKKwlDTURfSU5GTyA9IDEyLAorCUNNRF9TSE9XID0gMTMsCisJQ01EX0NIQU5HRSA9IDE0LAorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfRkFOQ1kKKwlDTURfWFJFUyA9IDEwMCwKKwlDTURfWVJFUyA9IDEwMSwKKwlDTURfVlhSRVMgPSAxMDIsCisJQ01EX1ZZUkVTID0gMTAzLAorCUNNRF9ERVBUSCA9IDEwNCwKKwlDTURfTUFUQ0ggPSAxMDUsCisJQ01EX1BJWENMT0NLID0gMTA2LAorCUNNRF9MRUZUID0gMTA3LAorCUNNRF9SSUdIVCA9IDEwOCwKKwlDTURfVVBQRVIgPSAxMDksCisJQ01EX0xPV0VSID0gMTEwLAorCUNNRF9IU0xFTiA9IDExMSwKKwlDTURfVlNMRU4gPSAxMTIsCisJQ01EX0NTWU5DID0gMTEzLAorCUNNRF9HU1lOQyA9IDExNCwKKwlDTURfRVhUU1lOQyA9IDExNSwKKwlDTURfQkNBU1QgPSAxMTYsCisJQ01EX1JHQkEgPSAxMTcsCisJQ01EX1NURVAgPSAxMTgsCisJQ01EX01PVkUgPSAxMTksCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21kb3B0aW9uc190IHsKKwljb25zdCBjaGFyIG5hbWVbOV07CisJY29uc3QgdW5zaWduZWQgY2hhciBwYXJhbV9jb3VudDsKKwljb25zdCB1bnNpZ25lZCBjaGFyIGNvZGU7Cit9IGdfY21kb3B0aW9uc1tdID0geworCS8qIjEyMzQ1Njc4IiArIE5VTCAqLworCXsgImZiIiAgICAgICwgMSwgQ01EX0ZCICAgICAgIH0sCisJeyAiZGIiICAgICAgLCAxLCBDTURfREIgICAgICAgfSwKKwl7ICJhIiAgICAgICAsIDAsIENNRF9BTEwgICAgICB9LAorCXsgImkiICAgICAgICwgMCwgQ01EX0lORk8gICAgIH0sCisJeyAiZyIgICAgICAgLCA1LCBDTURfR0VPTUVUUlkgfSwKKwl7ICJ0IiAgICAgICAsIDcsIENNRF9USU1JTkcgICB9LAorCXsgImFjY2VsIiAgICwgMSwgQ01EX0FDQ0VMICAgIH0sCisJeyAiaHN5bmMiICAgLCAxLCBDTURfSFNZTkMgICAgfSwKKwl7ICJ2c3luYyIgICAsIDEsIENNRF9WU1lOQyAgICB9LAorCXsgImxhY2VkIiAgICwgMSwgQ01EX0xBQ0VEICAgIH0sCisJeyAiZG91YmxlIiAgLCAxLCBDTURfRE9VQkxFICAgfSwKKwl7ICJzaG93IiAgICAsIDAsIENNRF9TSE9XICAgICB9LAorCXsgInMiICAgICAgICwgMCwgQ01EX1NIT1cgICAgIH0sCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfRkFOQ1kKKwl7ICJhbGwiICAgICAsIDAsIENNRF9BTEwgICAgICB9LAorCXsgInhyZXMiICAgICwgMSwgQ01EX1hSRVMgICAgIH0sCisJeyAieXJlcyIgICAgLCAxLCBDTURfWVJFUyAgICAgfSwKKwl7ICJ2eHJlcyIgICAsIDEsIENNRF9WWFJFUyAgICB9LAorCXsgInZ5cmVzIiAgICwgMSwgQ01EX1ZZUkVTICAgIH0sCisJeyAiZGVwdGgiICAgLCAxLCBDTURfREVQVEggICAgfSwKKwl7ICJtYXRjaCIgICAsIDAsIENNRF9NQVRDSCAgICB9LAorCXsgImdlb21ldHJ5IiwgNSwgQ01EX0dFT01FVFJZIH0sCisJeyAicGl4Y2xvY2siLCAxLCBDTURfUElYQ0xPQ0sgfSwKKwl7ICJsZWZ0IiAgICAsIDEsIENNRF9MRUZUICAgICB9LAorCXsgInJpZ2h0IiAgICwgMSwgQ01EX1JJR0hUICAgIH0sCisJeyAidXBwZXIiICAgLCAxLCBDTURfVVBQRVIgICAgfSwKKwl7ICJsb3dlciIgICAsIDEsIENNRF9MT1dFUiAgICB9LAorCXsgImhzbGVuIiAgICwgMSwgQ01EX0hTTEVOICAgIH0sCisJeyAidnNsZW4iICAgLCAxLCBDTURfVlNMRU4gICAgfSwKKwl7ICJ0aW1pbmdzIiAsIDcsIENNRF9USU1JTkcgICB9LAorCXsgImNzeW5jIiAgICwgMSwgQ01EX0NTWU5DICAgIH0sCisJeyAiZ3N5bmMiICAgLCAxLCBDTURfR1NZTkMgICAgfSwKKwl7ICJleHRzeW5jIiAsIDEsIENNRF9FWFRTWU5DICB9LAorCXsgImJjYXN0IiAgICwgMSwgQ01EX0JDQVNUICAgIH0sCisJeyAicmdiYSIgICAgLCAxLCBDTURfUkdCQSAgICAgfSwKKwl7ICJzdGVwIiAgICAsIDEsIENNRF9TVEVQICAgICB9LAorCXsgIm1vdmUiICAgICwgMSwgQ01EX01PVkUgICAgIH0sCisjZW5kaWYKK307CisKKy8qIHRha2VuIGZyb20gbGludXgvZmIuaCAqLworZW51bSB7CisJRkJfU1lOQ19IT1JfSElHSF9BQ1QgPSAxLCAgICAgICAvKiBob3Jpem9udGFsIHN5bmMgaGlnaCBhY3RpdmUgKi8KKwlGQl9TWU5DX1ZFUlRfSElHSF9BQ1QgPSAyLCAgICAgIC8qIHZlcnRpY2FsIHN5bmMgaGlnaCBhY3RpdmUgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9SRUFETU9ERQorCUZCX1ZNT0RFX0lOVEVSTEFDRUQgPSAxLCAgICAgICAgLyogaW50ZXJsYWNlZCAqLworCUZCX1ZNT0RFX0RPVUJMRSA9IDIsICAgICAgICAgICAgLyogZG91YmxlIHNjYW4gKi8KKwlGQl9TWU5DX0VYVCA9IDQsICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIHN5bmMgKi8KKwlGQl9TWU5DX0NPTVBfSElHSF9BQ1QgPSA4LCAgICAgIC8qIGNvbXBvc2l0ZSBzeW5jIGhpZ2ggYWN0aXZlICovCisjZW5kaWYKK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9SRUFETU9ERQorc3RhdGljIHZvaWQgc3ModWludDMyX3QgKngsIHVpbnQzMl90IGZsYWcsIGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqd2hhdCkKK3sKKwlpZiAoc3RyY21wKGJ1Ziwgd2hhdCkgPT0gMCkKKwkJKnggJj0gfmZsYWc7CisJZWxzZQorCQkqeCB8PSBmbGFnOworfQorCisvKiBNb2RlIGRiIGZpbGUgY29udGFpbnMgbW9kZSBkZWZpbml0aW9ucyBsaWtlIHRoaXM6CisgKiBtb2RlICI4MDB4NjAwLTQ4LWxhY2UiCisgKiAgICAgIyBEOiAzNi4wMCBNSHosIEg6IDMzLjgzNSBrSHosIFY6IDk2LjM5IEh6CisgKiAgICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgNjAwIDgKKyAqICAgICB0aW1pbmdzIDI3Nzc4IDU2IDgwIDc5IDExIDEyOCAxMgorICogICAgIGxhY2VkIHRydWUKKyAqICAgICBoc3luYyBoaWdoCisgKiAgICAgdnN5bmMgaGlnaAorICogZW5kbW9kZQorICovCitzdGF0aWMgaW50IHJlYWRfbW9kZV9kYihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKmJhc2UsIGNvbnN0IGNoYXIgKmZuLAorCQkJCQljb25zdCBjaGFyICptb2RlKQoreworCWNoYXIgKnRva2VuWzJdLCAqcCwgKnM7CisJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuKGZuKTsKKworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAxLCAiIyBcdFxyIiwgUEFSU0VfTk9STUFMKSkgeworCQlpZiAoc3RyY21wKHRva2VuWzBdLCAibW9kZSIpICE9IDAgfHwgIXRva2VuWzFdKQorCQkJY29udGludWU7CisJCXAgPSBzdHJzdHIodG9rZW5bMV0sIG1vZGUpOworCQlpZiAoIXApCisJCQljb250aW51ZTsKKwkJcyA9IHAgKyBzdHJsZW4obW9kZSk7CisJCS8vYmJfaW5mb19tc2coIkNIRUNLWyVzXVslc11bJWRdIiwgbW9kZSwgcC0xLCAqcyk7CisJCS8qIGV4YWN0IG1hdGNoPyAqLworCQlpZiAoKCghKnMgfHwgaXNzcGFjZSgqcykpICYmICciJyAhPSBzWy0xXSkgLyogZW5kLW9mLXRva2VuICovCisJCSB8fCAoJyInID09ICpzICYmICciJyA9PSBwWy0xXSkgLyogZW5kcyB3aXRoICIgYnV0IHN0YXJ0cyB3aXRoICIgdG9vISAqLworCQkpIHsKKwkJCS8vYmJfaW5mb19tc2coIkZPVU5EWyVzXVslc11bJXNdWyVkXSIsIHRva2VuWzFdLCBwLCBtb2RlLCBpc3NwYWNlKCpzKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghdG9rZW5bMF0pCisJCXJldHVybiAwOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpbnQgaTsKKworLy9iYl9pbmZvX21zZygiPz8/WyVzXVslc10iLCB0b2tlblswXSwgdG9rZW5bMV0pOworCQlpZiAoc3RyY21wKHRva2VuWzBdLCAiZW5kbW9kZSIpID09IDApIHsKKy8vYmJfaW5mb19tc2coIk9LWyVzXSIsIG1vZGUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcCA9IHRva2VuWzFdOworCQlpID0gaW5kZXhfaW5fc3RyaW5ncygKKwkJCSJnZW9tZXRyeVwwdGltaW5nc1wwaW50ZXJsYWNlZFwwZG91YmxlXDB2c3luY1wwaHN5bmNcMGNzeW5jXDBleHRzeW5jXDAiLAorCQkJdG9rZW5bMF0pOworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHNpemVvZihpbnQpID09IHNpemVvZihiYXNlLT54cmVzKSkgeworCQkJCXNzY2FuZihwLCAiJWQgJWQgJWQgJWQgJWQiLAorCQkJCQkmYmFzZS0+eHJlcywgJmJhc2UtPnlyZXMsCisJCQkJCSZiYXNlLT54cmVzX3ZpcnR1YWwsICZiYXNlLT55cmVzX3ZpcnR1YWwsCisJCQkJCSZiYXNlLT5iaXRzX3Blcl9waXhlbCk7CisJCQl9IGVsc2UgeworCQkJCWludCBiYXNlX3hyZXMsIGJhc2VfeXJlczsKKwkJCQlpbnQgYmFzZV94cmVzX3ZpcnR1YWwsIGJhc2VfeXJlc192aXJ0dWFsOworCQkJCWludCBiYXNlX2JpdHNfcGVyX3BpeGVsOworCQkJCXNzY2FuZihwLCAiJWQgJWQgJWQgJWQgJWQiLAorCQkJCQkmYmFzZV94cmVzLCAmYmFzZV95cmVzLAorCQkJCQkmYmFzZV94cmVzX3ZpcnR1YWwsICZiYXNlX3lyZXNfdmlydHVhbCwKKwkJCQkJJmJhc2VfYml0c19wZXJfcGl4ZWwpOworCQkJCWJhc2UtPnhyZXMgPSBiYXNlX3hyZXM7CisJCQkJYmFzZS0+eXJlcyA9IGJhc2VfeXJlczsKKwkJCQliYXNlLT54cmVzX3ZpcnR1YWwgPSBiYXNlX3hyZXNfdmlydHVhbDsKKwkJCQliYXNlLT55cmVzX3ZpcnR1YWwgPSBiYXNlX3lyZXNfdmlydHVhbDsKKwkJCQliYXNlLT5iaXRzX3Blcl9waXhlbCA9IGJhc2VfYml0c19wZXJfcGl4ZWw7CisJCQl9CisvL2JiX2luZm9fbXNnKCJHRU9bJXNdIiwgcCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKHNpemVvZihpbnQpID09IHNpemVvZihiYXNlLT54cmVzKSkgeworCQkJCXNzY2FuZihwLCAiJWQgJWQgJWQgJWQgJWQgJWQgJWQiLAorCQkJCQkmYmFzZS0+cGl4Y2xvY2ssCisJCQkJCSZiYXNlLT5sZWZ0X21hcmdpbiwgJmJhc2UtPnJpZ2h0X21hcmdpbiwKKwkJCQkJJmJhc2UtPnVwcGVyX21hcmdpbiwgJmJhc2UtPmxvd2VyX21hcmdpbiwKKwkJCQkJJmJhc2UtPmhzeW5jX2xlbiwgJmJhc2UtPnZzeW5jX2xlbik7CisJCQl9IGVsc2UgeworCQkJCWludCBiYXNlX3BpeGNsb2NrOworCQkJCWludCBiYXNlX2xlZnRfbWFyZ2luLCBiYXNlX3JpZ2h0X21hcmdpbjsKKwkJCQlpbnQgYmFzZV91cHBlcl9tYXJnaW4sIGJhc2VfbG93ZXJfbWFyZ2luOworCQkJCWludCBiYXNlX2hzeW5jX2xlbiwgYmFzZV92c3luY19sZW47CisJCQkJc3NjYW5mKHAsICIlZCAlZCAlZCAlZCAlZCAlZCAlZCIsCisJCQkJCSZiYXNlX3BpeGNsb2NrLAorCQkJCQkmYmFzZV9sZWZ0X21hcmdpbiwgJmJhc2VfcmlnaHRfbWFyZ2luLAorCQkJCQkmYmFzZV91cHBlcl9tYXJnaW4sICZiYXNlX2xvd2VyX21hcmdpbiwKKwkJCQkJJmJhc2VfaHN5bmNfbGVuLCAmYmFzZV92c3luY19sZW4pOworCQkJCWJhc2UtPnBpeGNsb2NrID0gYmFzZV9waXhjbG9jazsKKwkJCQliYXNlLT5sZWZ0X21hcmdpbiA9IGJhc2VfbGVmdF9tYXJnaW47CisJCQkJYmFzZS0+cmlnaHRfbWFyZ2luID0gYmFzZV9yaWdodF9tYXJnaW47CisJCQkJYmFzZS0+dXBwZXJfbWFyZ2luID0gYmFzZV91cHBlcl9tYXJnaW47CisJCQkJYmFzZS0+bG93ZXJfbWFyZ2luID0gYmFzZV9sb3dlcl9tYXJnaW47CisJCQkJYmFzZS0+aHN5bmNfbGVuID0gYmFzZV9oc3luY19sZW47CisJCQkJYmFzZS0+dnN5bmNfbGVuID0gYmFzZV92c3luY19sZW47CisJCQl9CisvL2JiX2luZm9fbXNnKCJUSU1bJXNdIiwgcCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDM6IHsKKwkJCXN0YXRpYyBjb25zdCB1aW50MzJfdCBzeW5jc1tdID0ge0ZCX1ZNT0RFX0lOVEVSTEFDRUQsIEZCX1ZNT0RFX0RPVUJMRX07CisJCQlzcygmYmFzZS0+dm1vZGUsIHN5bmNzW2ktMl0sIHAsICJmYWxzZSIpOworLy9iYl9pbmZvX21zZygiVk1PREVbJXNdIiwgcCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJY2FzZSA2OiB7CisJCQlzdGF0aWMgY29uc3QgdWludDMyX3Qgc3luY3NbXSA9IHtGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1NZTkNfSE9SX0hJR0hfQUNULCBGQl9TWU5DX0NPTVBfSElHSF9BQ1R9OworCQkJc3MoJmJhc2UtPnN5bmMsIHN5bmNzW2ktNF0sIHAsICJsb3ciKTsKKy8vYmJfaW5mb19tc2coIlNZTkNbJXNdIiwgcCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDc6CisJCQlzcygmYmFzZS0+c3luYywgRkJfU1lOQ19FWFQsIHAsICJmYWxzZSIpOworLy9iYl9pbmZvX21zZygiRVhUU1lOQ1slc10iLCBwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBOT0lOTElORSB2b2lkIHNob3dtb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdikKK3sKKwlkb3VibGUgZHJhdGUgPSAwLCBocmF0ZSA9IDAsIHZyYXRlID0gMDsKKworCWlmICh2LT5waXhjbG9jaykgeworCQlkcmF0ZSA9IDFlMTIgLyB2LT5waXhjbG9jazsKKwkJaHJhdGUgPSBkcmF0ZSAvICh2LT5sZWZ0X21hcmdpbiArIHYtPnhyZXMgKyB2LT5yaWdodF9tYXJnaW4gKyB2LT5oc3luY19sZW4pOworCQl2cmF0ZSA9IGhyYXRlIC8gKHYtPnVwcGVyX21hcmdpbiArIHYtPnlyZXMgKyB2LT5sb3dlcl9tYXJnaW4gKyB2LT52c3luY19sZW4pOworCX0KKwlwcmludGYoIlxubW9kZSBcIiV1eCV1LSV1XCJcbiIKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9GQU5DWQorCSJcdCMgRDogJS4zZiBNSHosIEg6ICUuM2Yga0h6LCBWOiAlLjNmIEh6XG4iCisjZW5kaWYKKwkiXHRnZW9tZXRyeSAldSAldSAldSAldSAldVxuIgorCSJcdHRpbWluZ3MgJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIKKwkiXHRhY2NlbCAlc1xuIgorCSJcdHJnYmEgJXUvJXUsJXUvJXUsJXUvJXUsJXUvJXVcbiIKKwkiZW5kbW9kZVxuXG4iLAorCQl2LT54cmVzLCB2LT55cmVzLCAoaW50KSAodnJhdGUgKyAwLjUpLAorI2lmIEVOQUJMRV9GRUFUVVJFX0ZCU0VUX0ZBTkNZCisJCWRyYXRlIC8gMWU2LCBocmF0ZSAvIDFlMywgdnJhdGUsCisjZW5kaWYKKwkJdi0+eHJlcywgdi0+eXJlcywgdi0+eHJlc192aXJ0dWFsLCB2LT55cmVzX3ZpcnR1YWwsIHYtPmJpdHNfcGVyX3BpeGVsLAorCQl2LT5waXhjbG9jaywgdi0+bGVmdF9tYXJnaW4sIHYtPnJpZ2h0X21hcmdpbiwgdi0+dXBwZXJfbWFyZ2luLCB2LT5sb3dlcl9tYXJnaW4sCisJCQl2LT5oc3luY19sZW4sIHYtPnZzeW5jX2xlbiwKKwkJKHYtPmFjY2VsX2ZsYWdzID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpLAorCQl2LT5yZWQubGVuZ3RoLCB2LT5yZWQub2Zmc2V0LCB2LT5ncmVlbi5sZW5ndGgsIHYtPmdyZWVuLm9mZnNldCwKKwkJCXYtPmJsdWUubGVuZ3RoLCB2LT5ibHVlLm9mZnNldCwgdi0+dHJhbnNwLmxlbmd0aCwgdi0+dHJhbnNwLm9mZnNldCk7Cit9CisKK2ludCBmYnNldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmJzZXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF9DSEFOR0UgICA9ICgxIDw8IDApLAorCQlPUFRfU0hPVyAgICAgPSAoMSA8PCAxKSwKKwkJT1BUX1JFQURNT0RFID0gKDEgPDwgMiksCisJCU9QVF9BTEwgICAgICA9ICgxIDw8IDMpLAorCX07CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcl9vbGQsIHZhcl9zZXQ7CisJaW50IGZoLCBpOworCXVuc2lnbmVkIG9wdGlvbnMgPSAwOworCisJY29uc3QgY2hhciAqZmJkZXYgPSBERUZBVUxURkJERVY7CisJY29uc3QgY2hhciAqbW9kZWZpbGUgPSBERUZBVUxURkJNT0RFOworCWNoYXIgKnRoaXNhcmc7CisJY2hhciAqbW9kZSA9IG1vZGU7IC8qIGZvciBjb21waWxlciAqLworCisJbWVtc2V0KCZ2YXJfc2V0LCAweGZmLCBzaXplb2YodmFyX3NldCkpOyAvKiBzZXQgYWxsIHRvIC0xICovCisKKwkvKiBwYXJzZSBjbWQgYXJncy4uLi4gd2h5IGRvIHRoZXkgaGF2ZSB0byBtYWtlIHRoaW5ncyBzbyBkaWZmaWN1bHQ/ICovCisJYXJndisrOworCWFyZ2MtLTsKKwlmb3IgKDsgYXJnYyA+IDAgJiYgKHRoaXNhcmcgPSAqYXJndikgIT0gTlVMTDsgYXJnYy0tLCBhcmd2KyspIHsKKwkJaWYgKHRoaXNhcmdbMF0gIT0gJy0nKSB7CisJCQlpZiAoIUVOQUJMRV9GRUFUVVJFX0ZCU0VUX1JFQURNT0RFIHx8IGFyZ2MgIT0gMSkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQltb2RlID0gdGhpc2FyZzsKKwkJCW9wdGlvbnMgfD0gT1BUX1JFQURNT0RFOworCQkJZ290byBjb250aW47CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ19jbWRvcHRpb25zKTsgaSsrKSB7CisJCQlpZiAoc3RyY21wKHRoaXNhcmcgKyAxLCBnX2NtZG9wdGlvbnNbaV0ubmFtZSkgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChhcmdjIDw9IGdfY21kb3B0aW9uc1tpXS5wYXJhbV9jb3VudCkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisKKwkJCXN3aXRjaCAoZ19jbWRvcHRpb25zW2ldLmNvZGUpIHsKKwkJCWNhc2UgQ01EX0ZCOgorCQkJCWZiZGV2ID0gYXJndlsxXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0RCOgorCQkJCW1vZGVmaWxlID0gYXJndlsxXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0FMTDoKKwkJCQlvcHRpb25zIHw9IE9QVF9BTEw7CisJCQkJYnJlYWs7CisJCQljYXNlIENNRF9TSE9XOgorCQkJCW9wdGlvbnMgfD0gT1BUX1NIT1c7CisJCQkJYnJlYWs7CisJCQljYXNlIENNRF9HRU9NRVRSWToKKwkJCQl2YXJfc2V0LnhyZXMgPSB4YXRvdTMyKGFyZ3ZbMV0pOworCQkJCXZhcl9zZXQueXJlcyA9IHhhdG91MzIoYXJndlsyXSk7CisJCQkJdmFyX3NldC54cmVzX3ZpcnR1YWwgPSB4YXRvdTMyKGFyZ3ZbM10pOworCQkJCXZhcl9zZXQueXJlc192aXJ0dWFsID0geGF0b3UzMihhcmd2WzRdKTsKKwkJCQl2YXJfc2V0LmJpdHNfcGVyX3BpeGVsID0geGF0b3UzMihhcmd2WzVdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX1RJTUlORzoKKwkJCQl2YXJfc2V0LnBpeGNsb2NrID0geGF0b3UzMihhcmd2WzFdKTsKKwkJCQl2YXJfc2V0LmxlZnRfbWFyZ2luID0geGF0b3UzMihhcmd2WzJdKTsKKwkJCQl2YXJfc2V0LnJpZ2h0X21hcmdpbiA9IHhhdG91MzIoYXJndlszXSk7CisJCQkJdmFyX3NldC51cHBlcl9tYXJnaW4gPSB4YXRvdTMyKGFyZ3ZbNF0pOworCQkJCXZhcl9zZXQubG93ZXJfbWFyZ2luID0geGF0b3UzMihhcmd2WzVdKTsKKwkJCQl2YXJfc2V0LmhzeW5jX2xlbiA9IHhhdG91MzIoYXJndls2XSk7CisJCQkJdmFyX3NldC52c3luY19sZW4gPSB4YXRvdTMyKGFyZ3ZbN10pOworCQkJCWJyZWFrOworCQkJY2FzZSBDTURfQUNDRUw6CisJCQkJYnJlYWs7CisJCQljYXNlIENNRF9IU1lOQzoKKwkJCQl2YXJfc2V0LnN5bmMgfD0gRkJfU1lOQ19IT1JfSElHSF9BQ1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIENNRF9WU1lOQzoKKwkJCQl2YXJfc2V0LnN5bmMgfD0gRkJfU1lOQ19WRVJUX0hJR0hfQUNUOworCQkJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZCU0VUX0ZBTkNZCisJCQljYXNlIENNRF9YUkVTOgorCQkJCXZhcl9zZXQueHJlcyA9IHhhdG91MzIoYXJndlsxXSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENNRF9ZUkVTOgorCQkJCXZhcl9zZXQueXJlcyA9IHhhdG91MzIoYXJndlsxXSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENNRF9ERVBUSDoKKwkJCQl2YXJfc2V0LmJpdHNfcGVyX3BpeGVsID0geGF0b3UzMihhcmd2WzFdKTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJfQorCQkJc3dpdGNoIChnX2NtZG9wdGlvbnNbaV0uY29kZSkgeworCQkJY2FzZSBDTURfRkI6CisJCQljYXNlIENNRF9EQjoKKwkJCWNhc2UgQ01EX0FMTDoKKwkJCWNhc2UgQ01EX1NIT1c6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIG90aGVyIGNvbW1hbmRzIGltcGx5IGNoYW5nZXMgKi8KKwkJCQlvcHRpb25zIHw9IE9QVF9DSEFOR0U7CisJCQl9CisJCQlhcmdjIC09IGdfY21kb3B0aW9uc1tpXS5wYXJhbV9jb3VudDsKKwkJCWFyZ3YgKz0gZ19jbWRvcHRpb25zW2ldLnBhcmFtX2NvdW50OworCQkJZ290byBjb250aW47CisJCX0KKwkJYmJfc2hvd191c2FnZSgpOworIGNvbnRpbjogOworCX0KKworCWZoID0geG9wZW4oZmJkZXYsIE9fUkRPTkxZKTsKKwl4aW9jdGwoZmgsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2YXJfb2xkKTsKKworCWlmIChvcHRpb25zICYgT1BUX1JFQURNT0RFKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREUKKwkJaWYgKCFyZWFkX21vZGVfZGIoJnZhcl9vbGQsIG1vZGVmaWxlLCBtb2RlKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gdmlkZW8gbW9kZSAnJXMnIiwgbW9kZSk7CisJCX0KKwkJb3B0aW9ucyB8PSBPUFRfQ0hBTkdFOworI2VuZGlmCisJfQorCisJaWYgKG9wdGlvbnMgJiBPUFRfQ0hBTkdFKSB7CisJCWNvcHlfY2hhbmdlZF92YWx1ZXMoJnZhcl9vbGQsICZ2YXJfc2V0KTsKKwkJaWYgKG9wdGlvbnMgJiBPUFRfQUxMKQorCQkJdmFyX29sZC5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX0FMTDsKKwkJeGlvY3RsKGZoLCBGQklPUFVUX1ZTQ1JFRU5JTkZPLCAmdmFyX29sZCk7CisJfQorCisJaWYgKG9wdGlvbnMgPT0gMCB8fCAob3B0aW9ucyAmIE9QVF9TSE9XKSkKKwkJc2hvd21vZGUoJnZhcl9vbGQpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmaCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGZvcm1hdC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGZvcm1hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMDg1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZkZm9ybWF0LmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogZmRmb3JtYXQuYyAgLSAgTG93LWxldmVsIGZvcm1hdHMgYSBmbG9wcHkgZGlzayAtIFdlcm5lciBBbG1lc2JlcmdlcgorICogNSBKdWx5IDIwMDMgLS0gbW9kaWZpZWQgZm9yIEJ1c3lib3ggYnkgRXJpayBBbmRlcnNlbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZkZm9ybWF0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW5dIERFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBmZGZvcm1hdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZvcm1hdCBmbG9wcHkgZGlza1xuIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCB2ZXJpZnkgYWZ0ZXIgZm9ybWF0IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworCisvKiBTdHVmZiBleHRyYWN0ZWQgZnJvbSBsaW51eC9mZC5oICovCitzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB7CisJdW5zaWduZWQgaW50CXNpemUsCQkvKiBuciBvZiBzZWN0b3JzIHRvdGFsICovCisJCQlzZWN0LAkJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwkJCWhlYWQsCQkvKiBuciBvZiBoZWFkcyAqLworCQkJdHJhY2ssCQkvKiBuciBvZiB0cmFja3MgKi8KKwkJCXN0cmV0Y2g7CS8qICE9MCBtZWFucyBkb3VibGUgdHJhY2sgc3RlcHMgKi8KKyNkZWZpbmUgRkRfU1RSRVRDSCAxCisjZGVmaW5lIEZEX1NXQVBTSURFUyAyCisKKwl1bnNpZ25lZCBjaGFyCWdhcCwJCS8qIGdhcDEgc2l6ZSAqLworCisJCQlyYXRlLAkJLyogZGF0YSByYXRlLiB8PSAweDQwIGZvciBwZXJwZW5kaWN1bGFyICovCisjZGVmaW5lIEZEXzJNIDB4NAorI2RlZmluZSBGRF9TSVpFQ09ERU1BU0sgMHgzOAorI2RlZmluZSBGRF9TSVpFQ09ERShmbG9wcHkpICgoKCgoZmxvcHB5KS0+cmF0ZSZGRF9TSVpFQ09ERU1BU0spPj4gMykrIDIpICU4KQorI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpICggKGZsb3BweSktPnJhdGUgJiBGRF8yTSA/IFwKKwkJCSAgICAgNTEyIDogMTI4IDw8IEZEX1NJWkVDT0RFKGZsb3BweSkgKQorI2RlZmluZSBGRF9QRVJQIDB4NDAKKworCQkJc3BlYzEsCQkvKiBzdGVwcGluZyByYXRlLCBoZWFkIHVubG9hZCB0aW1lICovCisJCQlmbXRfZ2FwOwkvKiBnYXAyIHNpemUgKi8KKwljb25zdCBjaGFyCSogbmFtZTsgLyogdXNlZCBvbmx5IGZvciBwcmVkZWZpbmVkIGZvcm1hdHMgKi8KK307CitzdHJ1Y3QgZm9ybWF0X2Rlc2NyIHsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlLGhlYWQsdHJhY2s7Cit9OworI2RlZmluZSBGREZNVEJFRyBfSU8oMiwweDQ3KQorI2RlZmluZSBGREZNVFRSSyBfSU9XKDIsMHg0OCwgc3RydWN0IGZvcm1hdF9kZXNjcikKKyNkZWZpbmUgRkRGTVRFTkQgX0lPKDIsMHg0OSkKKyNkZWZpbmUgRkRHRVRQUk0gX0lPUigyLCAweDA0LCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCkKKyNkZWZpbmUgRkRfRklMTF9CWVRFIDB4RjYgLyogZm9ybWF0IGZpbGwgYnl0ZS4gKi8KKworaW50IGZkZm9ybWF0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmZGZvcm1hdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkLCBuLCBjeWwsIHJlYWRfYnl0ZXMsIHZlcmlmeTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBmbG9wcHlfc3RydWN0IHBhcmFtOworCXN0cnVjdCBmb3JtYXRfZGVzY3IgZGVzY3I7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MSI7IC8qIG11c3QgaGF2ZSAxIHBhcmFtICovCisJdmVyaWZ5ID0gIWdldG9wdDMyKGFyZ3YsICJuIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwl4c3RhdCgqYXJndiwgJnN0KTsKKwlpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBub3QgYSBibG9jayBkZXZpY2UiLCAqYXJndik7CisJCS8qIGRvIG5vdCB0ZXN0IG1ham9yIC0gcGVyaGFwcyB0aGlzIHdhcyBhbiBVU0IgZmxvcHB5ICovCisJfQorCisJLyogT19SRFdSIGZvciBmb3JtYXR0aW5nIGFuZCB2ZXJpZnlpbmcgKi8KKwlmZCA9IHhvcGVuKCphcmd2LCBPX1JEV1IpOworCisJLyogb3JpZ2luYWwgbWVzc2FnZSB3YXM6ICJDb3VsZCBub3QgZGV0ZXJtaW5lIGN1cnJlbnQgZm9ybWF0IHR5cGUiICovCisJeGlvY3RsKGZkLCBGREdFVFBSTSwgJnBhcmFtKTsKKworCXByaW50ZigiJXMtc2lkZWQsICVkIHRyYWNrcywgJWQgc2VjL3RyYWNrLiBUb3RhbCBjYXBhY2l0eSAlZCBrQlxuIiwKKwkJKHBhcmFtLmhlYWQgPT0gMikgPyAiRG91YmxlIiA6ICJTaW5nbGUiLAorCQlwYXJhbS50cmFjaywgcGFyYW0uc2VjdCwgcGFyYW0uc2l6ZSA+PiAxKTsKKworCS8qIEZPUk1BVCAqLworCXByaW50ZigiRm9ybWF0dGluZy4uLiAiKTsKKwl4aW9jdGwoZmQsIEZERk1UQkVHLCBOVUxMKTsKKworCS8qIG4gPT0gdHJhY2sgKi8KKwlmb3IgKG4gPSAwOyBuIDwgcGFyYW0udHJhY2s7IG4rKykgeworCQlkZXNjci5oZWFkID0gMDsKKwkJZGVzY3IudHJhY2sgPSBuOworCQl4aW9jdGwoZmQsIEZERk1UVFJLLCAmZGVzY3IpOworCQlwcmludGYoIiUzZFxiXGJcYiIsIG4pOworCQlpZiAocGFyYW0uaGVhZCA9PSAyKSB7CisJCQlkZXNjci5oZWFkID0gMTsKKwkJCXhpb2N0bChmZCwgRkRGTVRUUkssICZkZXNjcik7CisJCX0KKwl9CisKKwl4aW9jdGwoZmQsIEZERk1URU5ELCBOVUxMKTsKKwlwcmludGYoImRvbmVcbiIpOworCisJLyogVkVSSUZZICovCisJaWYgKHZlcmlmeSkgeworCQkvKiBuID09IGN5bF9zaXplICovCisJCW4gPSBwYXJhbS5zZWN0KnBhcmFtLmhlYWQqNTEyOworCisJCWRhdGEgPSB4bWFsbG9jKG4pOworCQlwcmludGYoIlZlcmlmeWluZy4uLiAiKTsKKwkJZm9yIChjeWwgPSAwOyBjeWwgPCBwYXJhbS50cmFjazsgY3lsKyspIHsKKwkJCXByaW50ZigiJTNkXGJcYlxiIiwgY3lsKTsKKwkJCXJlYWRfYnl0ZXMgPSBzYWZlX3JlYWQoZmQsIGRhdGEsIG4pOworCQkJaWYgKHJlYWRfYnl0ZXMgIT0gbikgeworCQkJCWlmIChyZWFkX2J5dGVzIDwgMCkgeworCQkJCQliYl9wZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCQl9CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInByb2JsZW0gcmVhZGluZyBjeWxpbmRlciAlZCwgIgorCQkJCQkiZXhwZWN0ZWQgJWQsIHJlYWQgJWQiLCBjeWwsIG4sIHJlYWRfYnl0ZXMpOworCQkJCS8vIEZJWE1FOiBtYXliZSBiZXR0ZXIgc2VlayAmIGNvbnRpbnVlPz8KKwkJCX0KKwkJCS8qIENoZWNrIGJhY2t3YXJkcyBzbyB3ZSBkb24ndCBuZWVkIGEgY291bnRlciAqLworCQkJd2hpbGUgKC0tcmVhZF9ieXRlcyA+PSAwKSB7CisJCQkJaWYgKGRhdGFbcmVhZF9ieXRlc10gIT0gRkRfRklMTF9CWVRFKSB7CisJCQkJCSBwcmludGYoImJhZCBkYXRhIGluIGN5bCAlZFxuQ29udGludWluZy4uLiAiLCBjeWwpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBUaGVyZSBpcyBubyBwb2ludCBpbiBmcmVlaW5nIGJsb2NrcyBhdCB0aGUgZW5kIG9mIGEgcHJvZ3JhbSwgYmVjYXVzZQorCQlhbGwgb2YgdGhlIHByb2dyYW0ncyBzcGFjZSBpcyBnaXZlbiBiYWNrIHRvIHRoZSBzeXN0ZW0gd2hlbiB0aGUgcHJvY2VzcworCQl0ZXJtaW5hdGVzLiovCisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKGRhdGEpOworCisJCXByaW50ZigiZG9uZVxuIik7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShmZCk7CisKKwkvKiBEb24ndCBib3RoZXIgY2xvc2luZy4gIEV4aXQgZG9lcworCSAqIHRoYXQsIHNvIHdlIGNhbiBzYXZlIGEgZmV3IGJ5dGVzICovCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvZmRpc2suYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvZmRpc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJlMTVhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlzay5jCkBAIC0wLDAgKzEsMzEyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBmZGlzay5jIC0tIFBhcnRpdGlvbiB0YWJsZSBtYW5pcHVsYXRvciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyICBBLiBWLiBMZSBCbGFuYyAoTGVCbGFuY0BtY2MuYWMudWspCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IChpbml0aWFsIGJiIHBvcnQpCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBMb29rcyBsaWtlIHNvbWVvbmUgZm9yZ290IHRvIGFkZCB0aGlzIHRvIGNvbmZpZyBzeXN0ZW0gKi8KKy8vdXNhZ2U6I2lmbmRlZiBFTkFCTEVfRkVBVFVSRV9GRElTS19CTEtTSVpFCisvL3VzYWdlOiMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0JMS1NJWkUgMAorLy91c2FnZTojIGRlZmluZSBJRl9GRUFUVVJFX0ZESVNLX0JMS1NJWkUoYSkKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGZkaXNrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXVsIiBJRl9GRUFUVVJFX0ZESVNLX0JMS1NJWkUoInMiKSAiXSAiCisvL3VzYWdlOiAgICAgICAiWy1DIENZTElOREVSU10gWy1IIEhFQURTXSBbLVMgU0VDVE9SU10gWy1iIFNTWl0gRElTSyIKKy8vdXNhZ2U6I2RlZmluZSBmZGlza19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSBwYXJ0aXRpb24gdGFibGVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJCVN0YXJ0IGFuZCBFbmQgYXJlIGluIHNlY3RvcnMgKGluc3RlYWQgb2YgY3lsaW5kZXJzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJCVNob3cgcGFydGl0aW9uIHRhYmxlIGZvciBlYWNoIERJU0ssIHRoZW4gZXhpdCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkRJU0tfQkxLU0laRSgKKy8vdXNhZ2U6ICAgICAiXG4JLXMJCVNob3cgcGFydGl0aW9uIHNpemVzIGluIGtiIGZvciBlYWNoIERJU0ssIHRoZW4gZXhpdCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWIgMjA0OAkJKGZvciBjZXJ0YWluIE1PIGRpc2tzKSB1c2UgMjA0OC1ieXRlIHNlY3RvcnMiCisvL3VzYWdlOiAgICAgIlxuCS1DIENZTElOREVSUwlTZXQgbnVtYmVyIG9mIGN5bGluZGVycy9oZWFkcy9zZWN0b3JzIgorLy91c2FnZTogICAgICJcbgktSCBIRUFEUyIKKy8vdXNhZ2U6ICAgICAiXG4JLVMgU0VDVE9SUyIKKworI2lmbmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisvKiBGb3IgbHNlZWs2NCAqLworIyBkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+ICAgICAgICAgICAgIC8qIGFzc2VydCAqLworI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2lmICFkZWZpbmVkKEJMS1NTWkdFVCkKKyMgZGVmaW5lIEJMS1NTWkdFVCBfSU8oMHgxMiwgMTA0KQorI2VuZGlmCisjaWYgIWRlZmluZWQoQkxLR0VUU0laRTY0KQorIyBkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQorI2VuZGlmCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEJCX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIGlubGluZV9pZl9saXR0bGVfZW5kaWFuIEFMV0FZU19JTkxJTkUKKyNlbHNlCisjIGRlZmluZSBpbmxpbmVfaWZfbGl0dGxlX2VuZGlhbiAvKiBub3RoaW5nICovCisjZW5kaWYKKworCisvKiBMb29rcyBsaWtlIHNvbWVvbmUgZm9yZ290IHRvIGFkZCB0aGlzIHRvIGNvbmZpZyBzeXN0ZW0gKi8KKyNpZm5kZWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQkxLU0laRQorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQkxLU0laRSAwCisjIGRlZmluZSBJRl9GRUFUVVJFX0ZESVNLX0JMS1NJWkUoYSkKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfU0VDVE9SX1NJWkUgICAgICA1MTIKKyNkZWZpbmUgREVGQVVMVF9TRUNUT1JfU0laRV9TVFIgIjUxMiIKKyNkZWZpbmUgTUFYX1NFQ1RPUl9TSVpFICAgICAgICAgMjA0OAorI2RlZmluZSBTRUNUT1JfU0laRSAgICAgICAgICAgICAgNTEyIC8qIHN0aWxsIHVzZWQgaW4gb3NmL3NnaS9zdW4gY29kZSAqLworI2RlZmluZSBNQVhJTVVNX1BBUlRTICAgICAgICAgICAgIDYwCisKKyNkZWZpbmUgQUNUSVZFX0ZMQUcgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIEVYVEVOREVEICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgV0lOOThfRVhURU5ERUQgICAgICAgICAgMHgwZgorI2RlZmluZSBMSU5VWF9QQVJUSVRJT04gICAgICAgICAweDgxCisjZGVmaW5lIExJTlVYX1NXQVAgICAgICAgICAgICAgIDB4ODIKKyNkZWZpbmUgTElOVVhfTkFUSVZFICAgICAgICAgICAgMHg4MworI2RlZmluZSBMSU5VWF9FWFRFTkRFRCAgICAgICAgICAweDg1CisjZGVmaW5lIExJTlVYX0xWTSAgICAgICAgICAgICAgIDB4OGUKKyNkZWZpbmUgTElOVVhfUkFJRCAgICAgICAgICAgICAgMHhmZAorCisKK2VudW0geworCU9QVF9iID0gMSA8PCAwLAorCU9QVF9DID0gMSA8PCAxLAorCU9QVF9IID0gMSA8PCAyLAorCU9QVF9sID0gMSA8PCAzLAorCU9QVF9TID0gMSA8PCA0LAorCU9QVF91ID0gMSA8PCA1LAorCU9QVF9zID0gKDEgPDwgNikgKiBFTkFCTEVfRkVBVFVSRV9GRElTS19CTEtTSVpFLAorfTsKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxvbmc7CisvKiBVc2VkIGZvciBzZWN0b3IgbnVtYmVycy4gUGFydGl0aW9uIGZvcm1hdHMgd2Uga25vdworICogZG8gbm90IHN1cHBvcnQgbW9yZSB0aGFuIDJeMzIgc2VjdG9ycworICovCit0eXBlZGVmIHVpbnQzMl90IHNlY3Rvcl90OworI2lmIFVJTlRfTUFYID09IDQyOTQ5NjcyOTUKKyMgZGVmaW5lIFNFQ1RfRk1UICIiCisjZWxpZiBVTE9OR19NQVggPT0gNDI5NDk2NzI5NQorIyBkZWZpbmUgU0VDVF9GTVQgImwiCisjZWxzZQorIyBlcnJvciBDYW50IGRldGVjdCBzaXplb2YodWludDMyX3QpCisjZW5kaWYKKworc3RydWN0IGhkX2dlb21ldHJ5IHsKKwl1bnNpZ25lZCBjaGFyIGhlYWRzOworCXVuc2lnbmVkIGNoYXIgc2VjdG9yczsKKwl1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcnM7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKK307CisKKyNkZWZpbmUgSERJT19HRVRHRU8gICAgIDB4MDMwMSAgLyogZ2V0IGRldmljZSBnZW9tZXRyeSAqLworCitzdGF0aWMgY29uc3QgY2hhciBtc2dfYnVpbGRpbmdfbmV3X2xhYmVsW10gQUxJR04xID0KKyJCdWlsZGluZyBhIG5ldyAlcy4gQ2hhbmdlcyB3aWxsIHJlbWFpbiBpbiBtZW1vcnkgb25seSxcbiIKKyJ1bnRpbCB5b3UgZGVjaWRlIHRvIHdyaXRlIHRoZW0uIEFmdGVyIHRoYXQgdGhlIHByZXZpb3VzIGNvbnRlbnRcbiIKKyJ3b24ndCBiZSByZWNvdmVyYWJsZS5cblxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgbXNnX3BhcnRfYWxyZWFkeV9kZWZpbmVkW10gQUxJR04xID0KKyJQYXJ0aXRpb24gJXUgaXMgYWxyZWFkeSBkZWZpbmVkLCBkZWxldGUgaXQgYmVmb3JlIHJlLWFkZGluZ1xuIjsKKworCitzdHJ1Y3QgcGFydGl0aW9uIHsKKwl1bnNpZ25lZCBjaGFyIGJvb3RfaW5kOyAgICAgICAgIC8qIDB4ODAgLSBhY3RpdmUgKi8KKwl1bnNpZ25lZCBjaGFyIGhlYWQ7ICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGhlYWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNlY3RvcjsgICAgICAgICAgIC8qIHN0YXJ0aW5nIHNlY3RvciAqLworCXVuc2lnbmVkIGNoYXIgY3lsOyAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY3lsaW5kZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHN5c19pbmQ7ICAgICAgICAgIC8qIHdoYXQgcGFydGl0aW9uIHR5cGUgKi8KKwl1bnNpZ25lZCBjaGFyIGVuZF9oZWFkOyAgICAgICAgIC8qIGVuZCBoZWFkICovCisJdW5zaWduZWQgY2hhciBlbmRfc2VjdG9yOyAgICAgICAvKiBlbmQgc2VjdG9yICovCisJdW5zaWduZWQgY2hhciBlbmRfY3lsOyAgICAgICAgICAvKiBlbmQgY3lsaW5kZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXJ0NFs0XTsgICAgICAgIC8qIHN0YXJ0aW5nIHNlY3RvciBjb3VudGluZyBmcm9tIDAgKi8KKwl1bnNpZ25lZCBjaGFyIHNpemU0WzRdOyAgICAgICAgIC8qIG5yIG9mIHNlY3RvcnMgaW4gcGFydGl0aW9uICovCit9IFBBQ0tFRDsKKworLyoKKyAqIHBlciBwYXJ0aXRpb24gdGFibGUgZW50cnkgZGF0YQorICoKKyAqIFRoZSBmb3VyIHByaW1hcnkgcGFydGl0aW9ucyBoYXZlIHRoZSBzYW1lIHNlY3RvcmJ1ZmZlciAoTUJSYnVmZmVyKQorICogYW5kIGhhdmUgTlVMTCBleHRfcG9pbnRlci4KKyAqIEVhY2ggbG9naWNhbCBwYXJ0aXRpb24gdGFibGUgZW50cnkgaGFzIHR3byBwb2ludGVycywgb25lIGZvciB0aGUKKyAqIHBhcnRpdGlvbiBhbmQgb25lIGxpbmsgdG8gdGhlIG5leHQgb25lLgorICovCitzdHJ1Y3QgcHRlIHsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwYXJ0X3RhYmxlOyAgIC8qIHBvaW50cyBpbnRvIHNlY3RvcmJ1ZmZlciAqLworCXN0cnVjdCBwYXJ0aXRpb24gKmV4dF9wb2ludGVyOyAgLyogcG9pbnRzIGludG8gc2VjdG9yYnVmZmVyICovCisJc2VjdG9yX3Qgb2Zmc2V0X2Zyb21fZGV2X3N0YXJ0OyAvKiBkaXNrIHNlY3RvciBudW1iZXIgKi8KKwljaGFyICpzZWN0b3JidWZmZXI7ICAgICAgICAgICAgIC8qIGRpc2sgc2VjdG9yIGNvbnRlbnRzICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwljaGFyIGNoYW5nZWQ7ICAgICAgICAgICAgICAgICAgIC8qIGJvb2xlYW4gKi8KKyNlbmRpZgorfTsKKworI2RlZmluZSB1bmFibGVfdG9fb3BlbiAiY2FuJ3Qgb3BlbiAnJXMnIgorI2RlZmluZSB1bmFibGVfdG9fcmVhZCAiY2FuJ3QgcmVhZCBmcm9tICVzIgorI2RlZmluZSB1bmFibGVfdG9fc2VlayAiY2FuJ3Qgc2VlayBvbiAlcyIKKworZW51bSBsYWJlbF90eXBlIHsKKwlMQUJFTF9ET1MsIExBQkVMX1NVTiwgTEFCRUxfU0dJLCBMQUJFTF9BSVgsIExBQkVMX09TRiwgTEFCRUxfR1BUCit9OworCisjZGVmaW5lIExBQkVMX0lTX0RPUwkoTEFCRUxfRE9TID09IGN1cnJlbnRfbGFiZWxfdHlwZSkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NVTl9MQUJFTAorI2RlZmluZSBMQUJFTF9JU19TVU4JKExBQkVMX1NVTiA9PSBjdXJyZW50X2xhYmVsX3R5cGUpCisjZGVmaW5lIFNUQVRJQ19TVU4gc3RhdGljCisjZWxzZQorI2RlZmluZSBMQUJFTF9JU19TVU4JMAorI2RlZmluZSBTVEFUSUNfU1VOIGV4dGVybgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TR0lfTEFCRUwKKyNkZWZpbmUgTEFCRUxfSVNfU0dJCShMQUJFTF9TR0kgPT0gY3VycmVudF9sYWJlbF90eXBlKQorI2RlZmluZSBTVEFUSUNfU0dJIHN0YXRpYworI2Vsc2UKKyNkZWZpbmUgTEFCRUxfSVNfU0dJCTAKKyNkZWZpbmUgU1RBVElDX1NHSSBleHRlcm4KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQUlYX0xBQkVMCisjZGVmaW5lIExBQkVMX0lTX0FJWAkoTEFCRUxfQUlYID09IGN1cnJlbnRfbGFiZWxfdHlwZSkKKyNkZWZpbmUgU1RBVElDX0FJWCBzdGF0aWMKKyNlbHNlCisjZGVmaW5lIExBQkVMX0lTX0FJWAkwCisjZGVmaW5lIFNUQVRJQ19BSVggZXh0ZXJuCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX09TRl9MQUJFTAorI2RlZmluZSBMQUJFTF9JU19PU0YJKExBQkVMX09TRiA9PSBjdXJyZW50X2xhYmVsX3R5cGUpCisjZGVmaW5lIFNUQVRJQ19PU0Ygc3RhdGljCisjZWxzZQorI2RlZmluZSBMQUJFTF9JU19PU0YJMAorI2RlZmluZSBTVEFUSUNfT1NGIGV4dGVybgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HUFRfTEFCRUwKKyNkZWZpbmUgTEFCRUxfSVNfR1BUCShMQUJFTF9HUFQgPT0gY3VycmVudF9sYWJlbF90eXBlKQorI2RlZmluZSBTVEFUSUNfR1BUIHN0YXRpYworI2Vsc2UKKyNkZWZpbmUgTEFCRUxfSVNfR1BUCTAKKyNkZWZpbmUgU1RBVElDX0dQVCBleHRlcm4KKyNlbmRpZgorCitlbnVtIGFjdGlvbiB7IE9QRU5fTUFJTiwgVFJZX09OTFksIENSRUFURV9FTVBUWV9ET1MsIENSRUFURV9FTVBUWV9TVU4gfTsKKworc3RhdGljIHZvaWQgdXBkYXRlX3VuaXRzKHZvaWQpOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCitzdGF0aWMgdm9pZCBjaGFuZ2VfdW5pdHModm9pZCk7CitzdGF0aWMgdm9pZCByZXJlYWRfcGFydGl0aW9uX3RhYmxlKGludCBsZWF2ZSk7CitzdGF0aWMgdm9pZCBkZWxldGVfcGFydGl0aW9uKGludCBpKTsKK3N0YXRpYyB1bnNpZ25lZCBnZXRfcGFydGl0aW9uKGludCB3YXJuLCB1bnNpZ25lZCBtYXgpOworc3RhdGljIHZvaWQgbGlzdF90eXBlcyhjb25zdCBjaGFyICpjb25zdCAqc3lzKTsKK3N0YXRpYyBzZWN0b3JfdCByZWFkX2ludChzZWN0b3JfdCBsb3csIHNlY3Rvcl90IGRmbHQsIHNlY3Rvcl90IGhpZ2gsIHNlY3Rvcl90IGJhc2UsIGNvbnN0IGNoYXIgKm1lc2cpOworI2VuZGlmCitzdGF0aWMgY29uc3QgY2hhciAqcGFydGl0aW9uX3R5cGUodW5zaWduZWQgY2hhciB0eXBlKTsKK3N0YXRpYyB2b2lkIGdldF9nZW9tZXRyeSh2b2lkKTsKK3N0YXRpYyB2b2lkIHJlYWRfcHRlKHN0cnVjdCBwdGUgKnBlLCBzZWN0b3JfdCBvZmZzZXQpOworI2lmIEVOQUJMRV9GRUFUVVJFX1NVTl9MQUJFTCB8fCBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorc3RhdGljIGludCBnZXRfYm9vdChlbnVtIGFjdGlvbiB3aGF0KTsKKyNlbHNlCitzdGF0aWMgaW50IGdldF9ib290KHZvaWQpOworI2VuZGlmCisKKyNkZWZpbmUgUExVUkFMICAgMAorI2RlZmluZSBTSU5HVUxBUiAxCisKK3N0YXRpYyBzZWN0b3JfdCBnZXRfc3RhcnRfc2VjdChjb25zdCBzdHJ1Y3QgcGFydGl0aW9uICpwKTsKK3N0YXRpYyBzZWN0b3JfdCBnZXRfbnJfc2VjdHMoY29uc3Qgc3RydWN0IHBhcnRpdGlvbiAqcCk7CisKKy8qIERPUyBwYXJ0aXRpb24gdHlwZXMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGkzODZfc3lzX3R5cGVzW10gPSB7CisJIlx4MDAiICJFbXB0eSIsCisJIlx4MDEiICJGQVQxMiIsCisJIlx4MDQiICJGQVQxNiA8MzJNIiwKKwkiXHgwNSIgIkV4dGVuZGVkIiwgICAgICAgICAvKiBET1MgMy4zKyBleHRlbmRlZCBwYXJ0aXRpb24gKi8KKwkiXHgwNiIgIkZBVDE2IiwgICAgICAgICAgICAvKiBET1MgMTYtYml0ID49MzJNICovCisJIlx4MDciICJIUEZTL05URlMiLCAgICAgICAgLyogT1MvMiBJRlMsIGVnLCBIUEZTIG9yIE5URlMgb3IgUU5YICovCisJIlx4MGEiICJPUy8yIEJvb3QgTWFuYWdlciIsLyogT1MvMiBCb290IE1hbmFnZXIgKi8KKwkiXHgwYiIgIldpbjk1IEZBVDMyIiwKKwkiXHgwYyIgIldpbjk1IEZBVDMyIChMQkEpIiwvKiBMQkEgcmVhbGx5IGlzICdFeHRlbmRlZCBJbnQgMTNoJyAqLworCSJceDBlIiAiV2luOTUgRkFUMTYgKExCQSkiLAorCSJceDBmIiAiV2luOTUgRXh0J2QgKExCQSkiLAorCSJceDExIiAiSGlkZGVuIEZBVDEyIiwKKwkiXHgxMiIgIkNvbXBhcSBkaWFnbm9zdGljcyIsCisJIlx4MTQiICJIaWRkZW4gRkFUMTYgPDMyTSIsCisJIlx4MTYiICJIaWRkZW4gRkFUMTYiLAorCSJceDE3IiAiSGlkZGVuIEhQRlMvTlRGUyIsCisJIlx4MWIiICJIaWRkZW4gV2luOTUgRkFUMzIiLAorCSJceDFjIiAiSGlkZGVuIFc5NSBGQVQzMiAoTEJBKSIsCisJIlx4MWUiICJIaWRkZW4gVzk1IEZBVDE2IChMQkEpIiwKKwkiXHgzYyIgIlBhcnQuTWFnaWMgcmVjb3ZlcnkiLAorCSJceDQxIiAiUFBDIFBSZVAgQm9vdCIsCisJIlx4NDIiICJTRlMiLAorCSJceDYzIiAiR05VIEhVUkQgb3IgU3lzViIsIC8qIEdOVSBIVVJEIG9yIE1hY2ggb3IgU3lzIFYvMzg2IChzdWNoIGFzIElTQyBVTklYKSAqLworCSJceDgwIiAiT2xkIE1pbml4IiwgICAgICAgIC8qIE1pbml4IDEuNGEgYW5kIGVhcmxpZXIgKi8KKwkiXHg4MSIgIk1pbml4IC8gb2xkIExpbnV4IiwvKiBNaW5peCAxLjRiIGFuZCBsYXRlciAqLworCSJceDgyIiAiTGludXggc3dhcCIsICAgICAgIC8qIGFsc28gU29sYXJpcyAqLworCSJceDgzIiAiTGludXgiLAorCSJceDg0IiAiT1MvMiBoaWRkZW4gQzogZHJpdmUiLAorCSJceDg1IiAiTGludXggZXh0ZW5kZWQiLAorCSJceDg2IiAiTlRGUyB2b2x1bWUgc2V0IiwKKwkiXHg4NyIgIk5URlMgdm9sdW1lIHNldCIsCisJIlx4OGUiICJMaW51eCBMVk0iLAorCSJceDlmIiAiQlNEL09TIiwgICAgICAgICAgIC8qIEJTREkgKi8KKwkiXHhhMCIgIlRoaW5rcGFkIGhpYmVybmF0aW9uIiwKKwkiXHhhNSIgIkZyZWVCU0QiLCAgICAgICAgICAvKiB2YXJpb3VzIEJTRCBmbGF2b3VycyAqLworCSJceGE2IiAiT3BlbkJTRCIsCisJIlx4YTgiICJEYXJ3aW4gVUZTIiwKKwkiXHhhOSIgIk5ldEJTRCIsCisJIlx4YWIiICJEYXJ3aW4gYm9vdCIsCisJIlx4YjciICJCU0RJIGZzIiwKKwkiXHhiOCIgIkJTREkgc3dhcCIsCisJIlx4YmUiICJTb2xhcmlzIGJvb3QiLAorCSJceGViIiAiQmVPUyBmcyIsCisJIlx4ZWUiICJFRkkgR1BUIiwgICAgICAgICAgICAgICAgICAgIC8qIEludGVsIEVGSSBHVUlEIFBhcnRpdGlvbiBUYWJsZSAqLworCSJceGVmIiAiRUZJIChGQVQtMTIvMTYvMzIpIiwgICAgICAgICAvKiBJbnRlbCBFRkkgU3lzdGVtIFBhcnRpdGlvbiAqLworCSJceGYwIiAiTGludXgvUEEtUklTQyBib290IiwgICAgICAgICAvKiBMaW51eC9QQS1SSVNDIGJvb3QgbG9hZGVyICovCisJIlx4ZjIiICJET1Mgc2Vjb25kYXJ5IiwgICAgICAgICAgICAgIC8qIERPUyAzLjMrIHNlY29uZGFyeSAqLworCSJceGZkIiAiTGludXggcmFpZCBhdXRvZGV0ZWN0IiwgICAgICAvKiBOZXcgKDIuMi54KSByYWlkIHBhcnRpdGlvbiB3aXRoCisJCQkJCQlhdXRvZGV0ZWN0IHVzaW5nIHBlcnNpc3RlbnQKKwkJCQkJCXN1cGVyYmxvY2sgKi8KKyNpZiAwIC8qIEVOQUJMRV9XRUlSRF9QQVJUSVRJT05fVFlQRVMgKi8KKwkiXHgwMiIgIlhFTklYIHJvb3QiLAorCSJceDAzIiAiWEVOSVggdXNyIiwKKwkiXHgwOCIgIkFJWCIsICAgICAgICAgICAgICAvKiBBSVggYm9vdCAoQUlYIC0tIFBTLzIgcG9ydCkgb3IgU3BsaXREcml2ZSAqLworCSJceDA5IiAiQUlYIGJvb3RhYmxlIiwgICAgIC8qIEFJWCBkYXRhIG9yIENvaGVyZW50ICovCisJIlx4MTAiICJPUFVTIiwKKwkiXHgxOCIgIkFTVCBTbWFydFNsZWVwIiwKKwkiXHgyNCIgIk5FQyBET1MiLAorCSJceDM5IiAiUGxhbiA5IiwKKwkiXHg0MCIgIlZlbml4IDgwMjg2IiwKKwkiXHg0ZCIgIlFOWDQueCIsCisJIlx4NGUiICJRTlg0LnggMm5kIHBhcnQiLAorCSJceDRmIiAiUU5YNC54IDNyZCBwYXJ0IiwKKwkiXHg1MCIgIk9uVHJhY2sgRE0iLAorCSJceDUxIiAiT25UcmFjayBETTYgQXV4MSIsIC8qIChvciBOb3ZlbGwpICovCisJIlx4NTIiICJDUC9NIiwgICAgICAgICAgICAgLyogQ1AvTSBvciBNaWNyb3BvcnQgU3lzVi9BVCAqLworCSJceDUzIiAiT25UcmFjayBETTYgQXV4MyIsCisJIlx4NTQiICJPblRyYWNrRE02IiwKKwkiXHg1NSIgIkVaLURyaXZlIiwKKwkiXHg1NiIgIkdvbGRlbiBCb3ciLAorCSJceDVjIiAiUHJpYW0gRWRpc2siLAorCSJceDYxIiAiU3BlZWRTdG9yIiwKKwkiXHg2NCIgIk5vdmVsbCBOZXR3YXJlIDI4NiIsCisJIlx4NjUiICJOb3ZlbGwgTmV0d2FyZSAzODYiLAorCSJceDcwIiAiRGlza1NlY3VyZSBNdWx0aS1Cb290IiwKKwkiXHg3NSIgIlBDL0lYIiwKKwkiXHg5MyIgIkFtb2ViYSIsCisJIlx4OTQiICJBbW9lYmEgQkJUIiwgICAgICAgLyogKGJhZCBibG9jayB0YWJsZSkgKi8KKwkiXHhhNyIgIk5lWFRTVEVQIiwKKwkiXHhiYiIgIkJvb3QgV2l6YXJkIGhpZGRlbiIsCisJIlx4YzEiICJEUkRPUy9zZWMgKEZBVC0xMikiLAorCSJceGM0IiAiRFJET1Mvc2VjIChGQVQtMTYgPCAzMk0pIiwKKwkiXHhjNiIgIkRSRE9TL3NlYyAoRkFULTE2KSIsCisJIlx4YzciICJTeXJpbngiLAorCSJceGRhIiAiTm9uLUZTIGRhdGEiLAorCSJceGRiIiAiQ1AvTSAvIENUT1MgLyAuLi4iLC8qIENQL00gb3IgQ29uY3VycmVudCBDUC9NIG9yCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uY3VycmVudCBET1Mgb3IgQ1RPUyAqLworCSJceGRlIiAiRGVsbCBVdGlsaXR5IiwgICAgIC8qIERlbGwgUG93ZXJFZGdlIFNlcnZlciB1dGlsaXRpZXMgKi8KKwkiXHhkZiIgIkJvb3RJdCIsICAgICAgICAgICAvKiBCb290SXQgRU1CUk0gKi8KKwkiXHhlMSIgIkRPUyBhY2Nlc3MiLCAgICAgICAvKiBET1MgYWNjZXNzIG9yIFNwZWVkU3RvciAxMi1iaXQgRkFUCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWQgcGFydGl0aW9uICovCisJIlx4ZTMiICJET1MgUi9PIiwgICAgICAgICAgLyogRE9TIFIvTyBvciBTcGVlZFN0b3IgKi8KKwkiXHhlNCIgIlNwZWVkU3RvciIsICAgICAgICAvKiBTcGVlZFN0b3IgMTYtYml0IEZBVCBleHRlbmRlZAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiA8IDEwMjQgY3lsLiAqLworCSJceGYxIiAiU3BlZWRTdG9yIiwKKwkiXHhmNCIgIlNwZWVkU3RvciIsICAgICAgICAvKiBTcGVlZFN0b3IgbGFyZ2UgcGFydGl0aW9uICovCisJIlx4ZmUiICJMQU5zdGVwIiwgICAgICAgICAgLyogU3BlZWRTdG9yID4xMDI0IGN5bC4gb3IgTEFOc3RlcCAqLworCSJceGZmIiAiQkJUIiwgICAgICAgICAgICAgIC8qIFhlbml4IEJhZCBCbG9jayBUYWJsZSAqLworI2VuZGlmCisJTlVMTAorfTsKKworZW51bSB7CisJZGV2X2ZkID0gMyAgICAgICAgICAgICAgICAgIC8qIHRoZSBkaXNrICovCit9OworCisvKiBHbG9iYWxzICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciAqbGluZV9wdHI7CisKKwljb25zdCBjaGFyICpkaXNrX2RldmljZTsKKwlpbnQgZ19wYXJ0aXRpb25zOyAvLyA9IDQ7ICAgICAgIC8qIG1heGltdW0gcGFydGl0aW9uICsgMSAqLworCXVuc2lnbmVkIHVuaXRzX3Blcl9zZWN0b3I7IC8vID0gMTsKKwl1bnNpZ25lZCBzZWN0b3Jfc2l6ZTsgLy8gPSBERUZBVUxUX1NFQ1RPUl9TSVpFOworCXVuc2lnbmVkIHVzZXJfc2V0X3NlY3Rvcl9zaXplOworCXVuc2lnbmVkIHNlY3Rvcl9vZmZzZXQ7IC8vID0gMTsKKwl1bnNpZ25lZCBnX2hlYWRzLCBnX3NlY3RvcnMsIGdfY3lsaW5kZXJzOworCXNtYWxsaW50IC8qIGVudW0gbGFiZWxfdHlwZSAqLyBjdXJyZW50X2xhYmVsX3R5cGU7CisJc21hbGxpbnQgZGlzcGxheV9pbl9jeWxfdW5pdHM7IC8vID0gMTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9PU0ZfTEFCRUwKKwlzbWFsbGludCBwb3NzaWJseV9vc2ZfbGFiZWw7CisjZW5kaWYKKworCXNtYWxsaW50IGxpc3Rpbmc7ICAgICAgICAgICAgICAgLyogbm8gYWJvcnRzIGZvciBmZGlzayAtbCAqLworCXNtYWxsaW50IGRvc19jb21wYXRpYmxlX2ZsYWc7IC8vID0gMTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCS8vaW50IGRvc19jaGFuZ2VkOworCXNtYWxsaW50IG5vd2FybjsgICAgICAgICAgICAgICAgLyogbm8gd2FybmluZ3MgZm9yIGZkaXNrIC1sLy1zICovCisjZW5kaWYKKwlpbnQgZXh0X2luZGV4OyAgICAgICAgICAgICAgICAgIC8qIHRoZSBwcmltZSBleHRlbmRlZCBwYXJ0aXRpb24gKi8KKwl1bnNpZ25lZCB1c2VyX2N5bGluZGVycywgdXNlcl9oZWFkcywgdXNlcl9zZWN0b3JzOworCXVuc2lnbmVkIHB0X2hlYWRzLCBwdF9zZWN0b3JzOworCXVuc2lnbmVkIGtlcm5faGVhZHMsIGtlcm5fc2VjdG9yczsKKwlzZWN0b3JfdCBleHRlbmRlZF9vZmZzZXQ7ICAgICAgIC8qIG9mZnNldCBvZiBsaW5rIHBvaW50ZXJzICovCisJc2VjdG9yX3QgdG90YWxfbnVtYmVyX29mX3NlY3RvcnM7CisKKwlqbXBfYnVmIGxpc3RpbmdidWY7CisJY2hhciBsaW5lX2J1ZmZlcls4MF07CisJY2hhciBwYXJ0bmFtZV9idWZmZXJbODBdOworCS8qIFJhdyBkaXNrIGxhYmVsLiBGb3IgRE9TLXR5cGUgcGFydGl0aW9uIHRhYmxlcyB0aGUgTUJSLAorCSAqIHdpdGggZGVzY3JpcHRpb25zIG9mIHRoZSBwcmltYXJ5IHBhcnRpdGlvbnMuICovCisJY2hhciBNQlJidWZmZXJbTUFYX1NFQ1RPUl9TSVpFXTsKKwkvKiBQYXJ0aXRpb24gdGFibGVzICovCisJc3RydWN0IHB0ZSBwdGVzW01BWElNVU1fUEFSVFNdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBsaW5lX3B0ciAgICAgICAgICAgICAoRy5saW5lX3B0ciAgICAgICAgICAgICkKKyNkZWZpbmUgZGlza19kZXZpY2UgICAgICAgICAgKEcuZGlza19kZXZpY2UgICAgICAgICApCisjZGVmaW5lIGdfcGFydGl0aW9ucyAgICAgICAgIChHLmdfcGFydGl0aW9ucyAgICAgICAgKQorI2RlZmluZSB1bml0c19wZXJfc2VjdG9yICAgICAoRy51bml0c19wZXJfc2VjdG9yICAgICkKKyNkZWZpbmUgc2VjdG9yX3NpemUgICAgICAgICAgKEcuc2VjdG9yX3NpemUgICAgICAgICApCisjZGVmaW5lIHVzZXJfc2V0X3NlY3Rvcl9zaXplIChHLnVzZXJfc2V0X3NlY3Rvcl9zaXplKQorI2RlZmluZSBzZWN0b3Jfb2Zmc2V0ICAgICAgICAoRy5zZWN0b3Jfb2Zmc2V0ICAgICAgICkKKyNkZWZpbmUgZ19oZWFkcyAgICAgICAgICAgICAgKEcuZ19oZWFkcyAgICAgICAgICAgICApCisjZGVmaW5lIGdfc2VjdG9ycyAgICAgICAgICAgIChHLmdfc2VjdG9ycyAgICAgICAgICAgKQorI2RlZmluZSBnX2N5bGluZGVycyAgICAgICAgICAoRy5nX2N5bGluZGVycyAgICAgICAgICkKKyNkZWZpbmUgY3VycmVudF9sYWJlbF90eXBlICAgKEcuY3VycmVudF9sYWJlbF90eXBlICApCisjZGVmaW5lIGRpc3BsYXlfaW5fY3lsX3VuaXRzIChHLmRpc3BsYXlfaW5fY3lsX3VuaXRzKQorI2RlZmluZSBwb3NzaWJseV9vc2ZfbGFiZWwgICAoRy5wb3NzaWJseV9vc2ZfbGFiZWwgICkKKyNkZWZpbmUgbGlzdGluZyAgICAgICAgICAgICAgICAgKEcubGlzdGluZyAgICAgICAgICAgICAgICApCisjZGVmaW5lIGRvc19jb21wYXRpYmxlX2ZsYWcgICAgIChHLmRvc19jb21wYXRpYmxlX2ZsYWcgICAgKQorI2RlZmluZSBub3dhcm4gICAgICAgICAgICAgICAgICAoRy5ub3dhcm4gICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZXh0X2luZGV4ICAgICAgICAgICAgICAgKEcuZXh0X2luZGV4ICAgICAgICAgICAgICApCisjZGVmaW5lIHVzZXJfY3lsaW5kZXJzICAgICAgICAgIChHLnVzZXJfY3lsaW5kZXJzICAgICAgICAgKQorI2RlZmluZSB1c2VyX2hlYWRzICAgICAgICAgICAgICAoRy51c2VyX2hlYWRzICAgICAgICAgICAgICkKKyNkZWZpbmUgdXNlcl9zZWN0b3JzICAgICAgICAgICAgKEcudXNlcl9zZWN0b3JzICAgICAgICAgICApCisjZGVmaW5lIHB0X2hlYWRzICAgICAgICAgICAgICAgIChHLnB0X2hlYWRzICAgICAgICAgICAgICAgKQorI2RlZmluZSBwdF9zZWN0b3JzICAgICAgICAgICAgICAoRy5wdF9zZWN0b3JzICAgICAgICAgICAgICkKKyNkZWZpbmUga2Vybl9oZWFkcyAgICAgICAgICAgICAgKEcua2Vybl9oZWFkcyAgICAgICAgICAgICApCisjZGVmaW5lIGtlcm5fc2VjdG9ycyAgICAgICAgICAgIChHLmtlcm5fc2VjdG9ycyAgICAgICAgICAgKQorI2RlZmluZSBleHRlbmRlZF9vZmZzZXQgICAgICAgICAoRy5leHRlbmRlZF9vZmZzZXQgICAgICAgICkKKyNkZWZpbmUgdG90YWxfbnVtYmVyX29mX3NlY3RvcnMgKEcudG90YWxfbnVtYmVyX29mX3NlY3RvcnMpCisjZGVmaW5lIGxpc3RpbmdidWYgICAgICAoRy5saXN0aW5nYnVmICAgICApCisjZGVmaW5lIGxpbmVfYnVmZmVyICAgICAoRy5saW5lX2J1ZmZlciAgICApCisjZGVmaW5lIHBhcnRuYW1lX2J1ZmZlciAoRy5wYXJ0bmFtZV9idWZmZXIpCisjZGVmaW5lIE1CUmJ1ZmZlciAgICAgICAoRy5NQlJidWZmZXIgICAgICApCisjZGVmaW5lIHB0ZXMgICAgICAgICAgICAoRy5wdGVzICAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJc2VjdG9yX3NpemUgPSBERUZBVUxUX1NFQ1RPUl9TSVpFOyBcCisJc2VjdG9yX29mZnNldCA9IDE7IFwKKwlnX3BhcnRpdGlvbnMgPSA0OyBcCisJZGlzcGxheV9pbl9jeWxfdW5pdHMgPSAxOyBcCisJdW5pdHNfcGVyX3NlY3RvciA9IDE7IFwKKwlkb3NfY29tcGF0aWJsZV9mbGFnID0gMTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBUT0RPOiBtb3ZlIHRvIGxpYmJiPyAqLworLyogVE9ETzogcmV0dXJuIHVuc2lnbmVkIGxvbmcgbG9uZywgRkVBVFVSRV9GRElTS19CTEtTSVpFIF9jYW5fIGhhbmRsZQorICogZGlza3MgPiAyXjMyIHNlY3RvcnMKKyAqLworc3RhdGljIHNlY3Rvcl90IGJiX0JMS0dFVFNJWkVfc2VjdG9ycyhpbnQgZmQpCit7CisJdWludDY0X3QgdjY0OworCXVuc2lnbmVkIGxvbmcgbG9uZ3NlY3RvcnM7CisKKwlpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkU2NCwgJnY2NCkgPT0gMCkgeworCQkvKiBHb3QgYnl0ZXMsIGNvbnZlcnQgdG8gNTEyIGJ5dGUgc2VjdG9ycyAqLworCQl2NjQgPj49IDk7CisJCWlmICh2NjQgIT0gKHNlY3Rvcl90KXY2NCkgeworIHJldF90cnVuYzoKKwkJCS8qIE5vdCBvbmx5IERPUywgYnV0IGFsbCBvdGhlciBwYXJ0aXRpb24gdGFibGVzCisJCQkgKiB3ZSBzdXBwb3J0IGNhbid0IHJlY29yZCBtb3JlIHRoYW4gMzIgYml0CisJCQkgKiBzZWN0b3IgY291bnRzIG9yIG9mZnNldHMKKwkJCSAqLworCQkJYmJfZXJyb3JfbXNnKCJkZXZpY2UgaGFzIG1vcmUgdGhhbiAyXjMyIHNlY3RvcnMsIGNhbid0IHVzZSBhbGwgb2YgdGhlbSIpOworCQkJdjY0ID0gKHVpbnQzMl90KS0xTDsKKwkJfQorCQlyZXR1cm4gdjY0OworCX0KKwkvKiBOZWVkcyB0ZW1wIG9mIHR5cGUgbG9uZyAqLworCWlmIChpb2N0bChmZCwgQkxLR0VUU0laRSwgJmxvbmdzZWN0b3JzKSkgeworCQkvKiBQZXJoYXBzIHRoaXMgaXMgYSBkaXNrIGltYWdlICovCisJCW9mZl90IHN6ID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKwkJbG9uZ3NlY3RvcnMgPSAwOworCQlpZiAoc3ogPiAwKQorCQkJbG9uZ3NlY3RvcnMgPSAodW9mZl90KXN6IC8gc2VjdG9yX3NpemU7CisJCWxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisJfQorCWlmIChzaXplb2YobG9uZykgPiBzaXplb2Yoc2VjdG9yX3QpCisJICYmIGxvbmdzZWN0b3JzICE9IChzZWN0b3JfdClsb25nc2VjdG9ycworCSkgeworCQlnb3RvIHJldF90cnVuYzsKKwl9CisJcmV0dXJuIGxvbmdzZWN0b3JzOworfQorCisKKyNkZWZpbmUgSVNfRVhURU5ERUQoaSkgXAorCSgoaSkgPT0gRVhURU5ERUQgfHwgKGkpID09IFdJTjk4X0VYVEVOREVEIHx8IChpKSA9PSBMSU5VWF9FWFRFTkRFRCkKKworI2RlZmluZSBjcm91bmQobikgICAgICAgKGRpc3BsYXlfaW5fY3lsX3VuaXRzID8gKChuKS91bml0c19wZXJfc2VjdG9yKSsxIDogKG4pKQorCisjZGVmaW5lIHNjcm91bmQoeCkgICAgICAoKCh4KSt1bml0c19wZXJfc2VjdG9yLTEpL3VuaXRzX3Blcl9zZWN0b3IpCisKKyNkZWZpbmUgcHRfb2Zmc2V0KGIsIG4pIFwKKwkoKHN0cnVjdCBwYXJ0aXRpb24gKikoKGIpICsgMHgxYmUgKyAobikgKiBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpKQorCisjZGVmaW5lIHNlY3RvcihzKSAgICAgICAoKHMpICYgMHgzZikKKworI2RlZmluZSBjeWxpbmRlcihzLCBjKSAgKChjKSB8ICgoKHMpICYgMHhjMCkgPDwgMikpCisKKyNkZWZpbmUgaHNjMnNlY3RvcihoLHMsYykgXAorCShzZWN0b3IocykgLSAxICsgc2VjdG9ycyAqICgoaCkgKyBoZWFkcyAqIGN5bGluZGVyKHMsYykpKQorCitzdGF0aWMgdm9pZAorY2xvc2VfZGV2X2ZkKHZvaWQpCit7CisJLyogTm90IHJlYWxseSBjbG9zaW5nLCBidXQgbWFraW5nIHN1cmUgaXQgaXMgb3BlbiwgYW5kIHRvIGhhcm1sZXNzIHBsYWNlICovCisJeG1vdmVfZmQoeG9wZW4oYmJfZGV2X251bGwsIE9fUkRPTkxZKSwgZGV2X2ZkKTsKK30KKworLyoKKyAqIFJldHVybiBwYXJ0aXRpb24gbmFtZSAtIHVzZXMgc3RhdGljIHN0b3JhZ2UKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorcGFydG5hbWUoY29uc3QgY2hhciAqZGV2LCBpbnQgcG5vLCBpbnQgbHRoKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IHcsIHdwOworCWludCBidWZzaXo7CisJY2hhciAqYnVmcDsKKworCWJ1ZnAgPSBwYXJ0bmFtZV9idWZmZXI7CisJYnVmc2l6ID0gc2l6ZW9mKHBhcnRuYW1lX2J1ZmZlcik7CisKKwl3ID0gc3RybGVuKGRldik7CisJcCA9ICIiOworCisJaWYgKGlzZGlnaXQoZGV2W3ctMV0pKQorCQlwID0gInAiOworCisJLyogZGV2ZnMga2x1ZGdlIC0gbm90ZTogZmRpc2sgcGFydGl0aW9uIG5hbWVzIGFyZSBub3Qgc3VwcG9zZWQKKwkgICB0byBlcXVhbCBrZXJuZWwgbmFtZXMsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBkbyB0aGlzICovCisJaWYgKHN0cmNtcChkZXYgKyB3IC0gNCwgImRpc2MiKSA9PSAwKSB7CisJCXcgLT0gNDsKKwkJcCA9ICJwYXJ0IjsKKwl9CisKKwl3cCA9IHN0cmxlbihwKTsKKworCWlmIChsdGgpIHsKKwkJc25wcmludGYoYnVmcCwgYnVmc2l6LCAiJSouKnMlcyUtMnUiLAorCQkJbHRoLXdwLTIsIHcsIGRldiwgcCwgcG5vKTsKKwl9IGVsc2UgeworCQlzbnByaW50ZihidWZwLCBidWZzaXosICIlLipzJXMlLTJ1IiwgdywgZGV2LCBwLCBwbm8pOworCX0KKwlyZXR1cm4gYnVmcDsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgc3RydWN0IHBhcnRpdGlvbiAqCitnZXRfcGFydF90YWJsZShpbnQgaSkKK3sKKwlyZXR1cm4gcHRlc1tpXS5wYXJ0X3RhYmxlOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitzdHJfdW5pdHMoaW50IG4pCit7ICAgICAgLyogbj09MTogdXNlIHNpbmd1bGFyICovCisJaWYgKG4gPT0gMSkKKwkJcmV0dXJuIGRpc3BsYXlfaW5fY3lsX3VuaXRzID8gImN5bGluZGVyIiA6ICJzZWN0b3IiOworCXJldHVybiBkaXNwbGF5X2luX2N5bF91bml0cyA/ICJjeWxpbmRlcnMiIDogInNlY3RvcnMiOworfQorCitzdGF0aWMgaW50Cit2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcoY29uc3QgY2hhciAqbWJ1ZmZlcikKK3sKKwlyZXR1cm4gKG1idWZmZXJbNTEwXSA9PSAweDU1ICYmICh1aW50OF90KW1idWZmZXJbNTExXSA9PSAweGFhKTsKK30KKworc3RhdGljIHZvaWQgZmRpc2tfZmF0YWwoY29uc3QgY2hhciAqd2h5KQoreworCWlmIChsaXN0aW5nKSB7CisJCWNsb3NlX2Rldl9mZCgpOworCQlsb25nam1wKGxpc3RpbmdidWYsIDEpOworCX0KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSh3aHksIGRpc2tfZGV2aWNlKTsKK30KKworc3RhdGljIHZvaWQKK3NlZWtfc2VjdG9yKHNlY3Rvcl90IHNlY25vKQoreworI2lmIEVOQUJMRV9GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTCisJb2ZmNjRfdCBvZmYgPSAob2ZmNjRfdClzZWNubyAqIHNlY3Rvcl9zaXplOworCWlmIChsc2VlazY0KGRldl9mZCwgb2ZmLCBTRUVLX1NFVCkgPT0gKG9mZjY0X3QpIC0xKQorCQlmZGlza19mYXRhbCh1bmFibGVfdG9fc2Vlayk7CisjZWxzZQorCXVpbnQ2NF90IG9mZiA9ICh1aW50NjRfdClzZWNubyAqIHNlY3Rvcl9zaXplOworCWlmIChvZmYgPiBNQVhJTlQob2ZmX3QpCisJIHx8IGxzZWVrKGRldl9mZCwgKG9mZl90KW9mZiwgU0VFS19TRVQpID09IChvZmZfdCkgLTEKKwkpIHsKKwkJZmRpc2tfZmF0YWwodW5hYmxlX3RvX3NlZWspOworCX0KKyNlbmRpZgorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKy8qIFJlYWQgbGluZTsgcmV0dXJuIDAgb3IgZmlyc3QgcHJpbnRhYmxlIGNoYXIgKi8KK3N0YXRpYyBpbnQKK3JlYWRfbGluZShjb25zdCBjaGFyICpwcm9tcHQpCit7CisJaW50IHN6OworCisJc3ogPSByZWFkX2xpbmVfaW5wdXQoTlVMTCwgcHJvbXB0LCBsaW5lX2J1ZmZlciwgc2l6ZW9mKGxpbmVfYnVmZmVyKSwgLyp0aW1lb3V0Ki8gLTEpOworCWlmIChzeiA8PSAwKQorCQlleGl0KEVYSVRfU1VDQ0VTUyk7IC8qIEN0cmwtRCBvciBDdHJsLUMgKi8KKworCWlmIChsaW5lX2J1ZmZlcltzei0xXSA9PSAnXG4nKQorCQlsaW5lX2J1ZmZlclstLXN6XSA9ICdcMCc7CisKKwlsaW5lX3B0ciA9IGxpbmVfYnVmZmVyOworCXdoaWxlICgqbGluZV9wdHIgIT0gJ1wwJyAmJiAodW5zaWduZWQgY2hhcikqbGluZV9wdHIgPD0gJyAnKQorCQlsaW5lX3B0cisrOworCXJldHVybiAqbGluZV9wdHI7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfYWxsX3VuY2hhbmdlZCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWElNVU1fUEFSVFM7IGkrKykKKwkJcHRlc1tpXS5jaGFuZ2VkID0gMDsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZAorc2V0X2NoYW5nZWQoaW50IGkpCit7CisJcHRlc1tpXS5jaGFuZ2VkID0gMTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZAord3JpdGVfcGFydF90YWJsZV9mbGFnKGNoYXIgKmIpCit7CisJYls1MTBdID0gMHg1NTsKKwliWzUxMV0gPSAweGFhOworfQorCitzdGF0aWMgY2hhcgorcmVhZF9ub25lbXB0eShjb25zdCBjaGFyICptZXNnKQoreworCXdoaWxlICghcmVhZF9saW5lKG1lc2cpKQorCQljb250aW51ZTsKKwlyZXR1cm4gKmxpbmVfcHRyOworfQorCitzdGF0aWMgY2hhcgorcmVhZF9tYXliZV9lbXB0eShjb25zdCBjaGFyICptZXNnKQoreworCWlmICghcmVhZF9saW5lKG1lc2cpKSB7CisJCWxpbmVfcHRyID0gbGluZV9idWZmZXI7CisJCWxpbmVfcHRyWzBdID0gJ1xuJzsKKwkJbGluZV9wdHJbMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gbGluZV9wdHJbMF07Cit9CisKK3N0YXRpYyBpbnQKK3JlYWRfaGV4KGNvbnN0IGNoYXIgKmNvbnN0ICpzeXMpCit7CisJdW5zaWduZWQgbG9uZyB2OworCXdoaWxlICgxKSB7CisJCXJlYWRfbm9uZW1wdHkoIkhleCBjb2RlICh0eXBlIEwgdG8gbGlzdCBjb2Rlcyk6ICIpOworCQlpZiAoKGxpbmVfcHRyWzBdIHwgMHgyMCkgPT0gJ2wnKSB7CisJCQlsaXN0X3R5cGVzKHN5cyk7CisJCQljb250aW51ZTsKKwkJfQorCQl2ID0gYmJfc3RydG91bChsaW5lX3B0ciwgTlVMTCwgMTYpOworCQlpZiAodiA8PSAweGZmKQorCQkJcmV0dXJuIHY7CisJfQorfQorCitzdGF0aWMgdm9pZAord3JpdGVfc2VjdG9yKHNlY3Rvcl90IHNlY25vLCBjb25zdCB2b2lkICpidWYpCit7CisJc2Vla19zZWN0b3Ioc2Vjbm8pOworCXh3cml0ZShkZXZfZmQsIGJ1Ziwgc2VjdG9yX3NpemUpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgKi8KKworCisjaW5jbHVkZSAiZmRpc2tfYWl4LmMiCisKK3N0cnVjdCBzdW5fcGFydGl0aW9uIHsKKwl1bnNpZ25lZCBjaGFyIGluZm9bMTI4XTsgICAvKiBJbmZvcm1hdGl2ZSB0ZXh0IHN0cmluZyAqLworCXVuc2lnbmVkIGNoYXIgc3BhcmUwWzE0XTsKKwlzdHJ1Y3Qgc3VuX2luZm8geworCQl1bnNpZ25lZCBjaGFyIHNwYXJlMTsKKwkJdW5zaWduZWQgY2hhciBpZDsKKwkJdW5zaWduZWQgY2hhciBzcGFyZTI7CisJCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJfSBpbmZvc1s4XTsKKwl1bnNpZ25lZCBjaGFyIHNwYXJlMVsyNDZdOyAvKiBCb290IGluZm9ybWF0aW9uIGV0Yy4gKi8KKwl1bnNpZ25lZCBzaG9ydCByc3BlZWQ7ICAgICAvKiBEaXNrIHJvdGF0aW9uYWwgc3BlZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCBwY3lsY291bnQ7ICAvKiBQaHlzaWNhbCBjeWxpbmRlciBjb3VudCAqLworCXVuc2lnbmVkIHNob3J0IHNwYXJlY3lsOyAgIC8qIGV4dHJhIHNlY3RzIHBlciBjeWxpbmRlciAqLworCXVuc2lnbmVkIGNoYXIgc3BhcmUyWzRdOyAgIC8qIE1vcmUgbWFnaWMuLi4gKi8KKwl1bnNpZ25lZCBzaG9ydCBpbGZhY3Q7ICAgICAvKiBJbnRlcmxlYXZlIGZhY3RvciAqLworCXVuc2lnbmVkIHNob3J0IG5jeWw7ICAgICAgIC8qIERhdGEgY3lsaW5kZXIgY291bnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBuYWN5bDsgICAgICAvKiBBbHQuIGN5bGluZGVyIGNvdW50ICovCisJdW5zaWduZWQgc2hvcnQgbnRya3M7ICAgICAgLyogVHJhY2tzIHBlciBjeWxpbmRlciAqLworCXVuc2lnbmVkIHNob3J0IG5zZWN0OyAgICAgIC8qIFNlY3RvcnMgcGVyIHRyYWNrICovCisJdW5zaWduZWQgY2hhciBzcGFyZTNbNF07ICAgLyogRXZlbiBtb3JlIG1hZ2ljLi4uICovCisJc3RydWN0IHN1bl9wYXJ0aW5mbyB7CisJCXVpbnQzMl90IHN0YXJ0X2N5bGluZGVyOworCQl1aW50MzJfdCBudW1fc2VjdG9yczsKKwl9IHBhcnRpdGlvbnNbOF07CisJdW5zaWduZWQgc2hvcnQgbWFnaWM7ICAgICAgLyogTWFnaWMgbnVtYmVyICovCisJdW5zaWduZWQgc2hvcnQgY3N1bTsgICAgICAgLyogTGFiZWwgeG9yJ2QgY2hlY2tzdW0gKi8KK30gRklYX0FMSUFTSU5HOwordHlwZWRlZiBzdHJ1Y3Qgc3VuX3BhcnRpdGlvbiBzdW5fcGFydGl0aW9uOworI2RlZmluZSBzdW5sYWJlbCAoKHN1bl9wYXJ0aXRpb24gKilNQlJidWZmZXIpCitTVEFUSUNfT1NGIHZvaWQgYnNkX3NlbGVjdCh2b2lkKTsKK1NUQVRJQ19PU0Ygdm9pZCB4YnNkX3ByaW50X2Rpc2tsYWJlbChpbnQpOworI2luY2x1ZGUgImZkaXNrX29zZi5jIgorCitTVEFUSUNfR1BUIHZvaWQgZ3B0X2xpc3RfdGFibGUoaW50IHh0cmEpOworI2luY2x1ZGUgImZkaXNrX2dwdC5jIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0dJX0xBQkVMIHx8IEVOQUJMRV9GRUFUVVJFX1NVTl9MQUJFTAorc3RhdGljIHVpbnQxNl90CitmZGlza19zd2FwMTYodWludDE2X3QgeCkKK3sKKwlyZXR1cm4gKHggPDwgOCkgfCAoeCA+PiA4KTsKK30KKworc3RhdGljIHVpbnQzMl90CitmZGlza19zd2FwMzIodWludDMyX3QgeCkKK3sKKwlyZXR1cm4gKHggPDwgMjQpIHwKKwkgICAgICAgKCh4ICYgMHhGRjAwKSA8PCA4KSB8CisJICAgICAgICgoeCAmIDB4RkYwMDAwKSA+PiA4KSB8CisJICAgICAgICh4ID4+IDI0KTsKK30KKyNlbmRpZgorCitTVEFUSUNfU0dJIGNvbnN0IGNoYXIgKmNvbnN0IHNnaV9zeXNfdHlwZXNbXTsKK1NUQVRJQ19TR0kgdW5zaWduZWQgc2dpX2dldF9udW1fc2VjdG9ycyhpbnQgaSk7CitTVEFUSUNfU0dJIGludCBzZ2lfZ2V0X3N5c2lkKGludCBpKTsKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfZGVsZXRlX3BhcnRpdGlvbihpbnQgaSk7CitTVEFUSUNfU0dJIHZvaWQgc2dpX2NoYW5nZV9zeXNpZChpbnQgaSwgaW50IHN5cyk7CitTVEFUSUNfU0dJIHZvaWQgc2dpX2xpc3RfdGFibGUoaW50IHh0cmEpOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0FEVkFOQ0VECitTVEFUSUNfU0dJIHZvaWQgc2dpX3NldF94Y3lsKHZvaWQpOworI2VuZGlmCitTVEFUSUNfU0dJIGludCB2ZXJpZnlfc2dpKGludCB2ZXJib3NlKTsKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfYWRkX3BhcnRpdGlvbihpbnQgbiwgaW50IHN5cyk7CitTVEFUSUNfU0dJIHZvaWQgc2dpX3NldF9zd2FwcGFydGl0aW9uKGludCBpKTsKK1NUQVRJQ19TR0kgY29uc3QgY2hhciAqc2dpX2dldF9ib290ZmlsZSh2b2lkKTsKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfc2V0X2Jvb3RmaWxlKGNvbnN0IGNoYXIqIGFGaWxlKTsKK1NUQVRJQ19TR0kgdm9pZCBjcmVhdGVfc2dpaW5mbyh2b2lkKTsKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfd3JpdGVfdGFibGUodm9pZCk7CitTVEFUSUNfU0dJIHZvaWQgc2dpX3NldF9ib290cGFydGl0aW9uKGludCBpKTsKKyNpbmNsdWRlICJmZGlza19zZ2kuYyIKKworU1RBVElDX1NVTiBjb25zdCBjaGFyICpjb25zdCBzdW5fc3lzX3R5cGVzW107CitTVEFUSUNfU1VOIHZvaWQgc3VuX2RlbGV0ZV9wYXJ0aXRpb24oaW50IGkpOworU1RBVElDX1NVTiB2b2lkIHN1bl9jaGFuZ2Vfc3lzaWQoaW50IGksIGludCBzeXMpOworU1RBVElDX1NVTiB2b2lkIHN1bl9saXN0X3RhYmxlKGludCB4dHJhKTsKK1NUQVRJQ19TVU4gdm9pZCBhZGRfc3VuX3BhcnRpdGlvbihpbnQgbiwgaW50IHN5cyk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKK1NUQVRJQ19TVU4gdm9pZCBzdW5fc2V0X2FsdF9jeWwodm9pZCk7CitTVEFUSUNfU1VOIHZvaWQgc3VuX3NldF9uY3lsKGludCBjeWwpOworU1RBVElDX1NVTiB2b2lkIHN1bl9zZXRfeGN5bCh2b2lkKTsKK1NUQVRJQ19TVU4gdm9pZCBzdW5fc2V0X2lsZmFjdCh2b2lkKTsKK1NUQVRJQ19TVU4gdm9pZCBzdW5fc2V0X3JzcGVlZCh2b2lkKTsKK1NUQVRJQ19TVU4gdm9pZCBzdW5fc2V0X3BjeWxjb3VudCh2b2lkKTsKKyNlbmRpZgorU1RBVElDX1NVTiB2b2lkIHRvZ2dsZV9zdW5mbGFncyhpbnQgaSwgdW5zaWduZWQgY2hhciBtYXNrKTsKK1NUQVRJQ19TVU4gdm9pZCB2ZXJpZnlfc3VuKHZvaWQpOworU1RBVElDX1NVTiB2b2lkIHN1bl93cml0ZV90YWJsZSh2b2lkKTsKKyNpbmNsdWRlICJmZGlza19zdW4uYyIKKworCitzdGF0aWMgaW5saW5lX2lmX2xpdHRsZV9lbmRpYW4gdW5zaWduZWQKK3JlYWQ0X2xpdHRsZV9lbmRpYW4oY29uc3QgdW5zaWduZWQgY2hhciAqY3ApCit7CisJdWludDMyX3QgdjsKKwltb3ZlX2Zyb21fdW5hbGlnbmVkMzIodiwgY3ApOworCXJldHVybiBTV0FQX0xFMzIodik7Cit9CisKK3N0YXRpYyBzZWN0b3JfdAorZ2V0X3N0YXJ0X3NlY3QoY29uc3Qgc3RydWN0IHBhcnRpdGlvbiAqcCkKK3sKKwlyZXR1cm4gcmVhZDRfbGl0dGxlX2VuZGlhbihwLT5zdGFydDQpOworfQorCitzdGF0aWMgc2VjdG9yX3QKK2dldF9ucl9zZWN0cyhjb25zdCBzdHJ1Y3QgcGFydGl0aW9uICpwKQoreworCXJldHVybiByZWFkNF9saXR0bGVfZW5kaWFuKHAtPnNpemU0KTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisvKiBzdGFydF9zZWN0IGFuZCBucl9zZWN0cyBhcmUgc3RvcmVkIGxpdHRsZSBlbmRpYW4gb24gYWxsIG1hY2hpbmVzICovCisvKiBtb3Jlb3ZlciwgdGhleSBhcmUgbm90IGFsaWduZWQgY29ycmVjdGx5ICovCitzdGF0aWMgaW5saW5lX2lmX2xpdHRsZV9lbmRpYW4gdm9pZAorc3RvcmU0X2xpdHRsZV9lbmRpYW4odW5zaWduZWQgY2hhciAqY3AsIHVuc2lnbmVkIHZhbCkKK3sKKwl1aW50MzJfdCB2ID0gU1dBUF9MRTMyKHZhbCk7CisJbW92ZV90b191bmFsaWduZWQzMihjcCwgdik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfc3RhcnRfc2VjdChzdHJ1Y3QgcGFydGl0aW9uICpwLCB1bnNpZ25lZCBzdGFydF9zZWN0KQoreworCXN0b3JlNF9saXR0bGVfZW5kaWFuKHAtPnN0YXJ0NCwgc3RhcnRfc2VjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfbnJfc2VjdHMoc3RydWN0IHBhcnRpdGlvbiAqcCwgdW5zaWduZWQgbnJfc2VjdHMpCit7CisJc3RvcmU0X2xpdHRsZV9lbmRpYW4ocC0+c2l6ZTQsIG5yX3NlY3RzKTsKK30KKyNlbmRpZgorCisvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBhbmQgcmVhZCBhIHBhcnRpdGlvbiB0YWJsZSBzZWN0b3IgKi8KK3N0YXRpYyB2b2lkCityZWFkX3B0ZShzdHJ1Y3QgcHRlICpwZSwgc2VjdG9yX3Qgb2Zmc2V0KQoreworCXBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgPSBvZmZzZXQ7CisJcGUtPnNlY3RvcmJ1ZmZlciA9IHh6YWxsb2Moc2VjdG9yX3NpemUpOworCXNlZWtfc2VjdG9yKG9mZnNldCk7CisJLyogeHJlYWQgd291bGQgbWFrZSB1cyBhYm9ydCAtIGJhZCBmb3IgZmRpc2sgLWwgKi8KKwlpZiAoZnVsbF9yZWFkKGRldl9mZCwgcGUtPnNlY3RvcmJ1ZmZlciwgc2VjdG9yX3NpemUpICE9IHNlY3Rvcl9zaXplKQorCQlmZGlza19mYXRhbCh1bmFibGVfdG9fcmVhZCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwlwZS0+Y2hhbmdlZCA9IDA7CisjZW5kaWYKKwlwZS0+cGFydF90YWJsZSA9IHBlLT5leHRfcG9pbnRlciA9IE5VTEw7Cit9CisKK3N0YXRpYyBzZWN0b3JfdAorZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChjb25zdCBzdHJ1Y3QgcHRlICpwZSkKK3sKKwlyZXR1cm4gcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCArIGdldF9zdGFydF9zZWN0KHBlLT5wYXJ0X3RhYmxlKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisvKgorICogQXZvaWQgd2FybmluZyBhYm91dCBET1MgcGFydGl0aW9ucyB3aGVuIG5vIERPUyBwYXJ0aXRpb24gd2FzIGNoYW5nZWQuCisgKiBIZXJlIGEgaGV1cmlzdGljICJpcyBwcm9iYWJseSBkb3MgcGFydGl0aW9uIi4KKyAqIFdlIG1pZ2h0IGFsc28gZG8gdGhlIG9wcG9zaXRlIGFuZCB3YXJuIGluIGFsbCBjYXNlcyBleGNlcHQKKyAqIGZvciAiaXMgcHJvYmFibHkgbm9uZG9zIHBhcnRpdGlvbiIuCisgKi8KKyNpZmRlZiBVTlVTRUQKK3N0YXRpYyBpbnQKK2lzX2Rvc19wYXJ0aXRpb24oaW50IHQpCit7CisJcmV0dXJuICh0ID09IDEgfHwgdCA9PSA0IHx8IHQgPT0gNiB8fAorCQl0ID09IDB4MGIgfHwgdCA9PSAweDBjIHx8IHQgPT0gMHgwZSB8fAorCQl0ID09IDB4MTEgfHwgdCA9PSAweDEyIHx8IHQgPT0gMHgxNCB8fCB0ID09IDB4MTYgfHwKKwkJdCA9PSAweDFiIHx8IHQgPT0gMHgxYyB8fCB0ID09IDB4MWUgfHwgdCA9PSAweDI0IHx8CisJCXQgPT0gMHhjMSB8fCB0ID09IDB4YzQgfHwgdCA9PSAweGM2KTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorbWVudSh2b2lkKQoreworCXB1dHMoIkNvbW1hbmQgQWN0aW9uIik7CisJaWYgKExBQkVMX0lTX1NVTikgeworCQlwdXRzKCJhXHR0b2dnbGUgYSByZWFkIG9ubHkgZmxhZyIpOyAgICAgICAgICAgLyogc3VuICovCisJCXB1dHMoImJcdGVkaXQgYnNkIGRpc2tsYWJlbCIpOworCQlwdXRzKCJjXHR0b2dnbGUgdGhlIG1vdW50YWJsZSBmbGFnIik7ICAgICAgICAgLyogc3VuICovCisJCXB1dHMoImRcdGRlbGV0ZSBhIHBhcnRpdGlvbiIpOworCQlwdXRzKCJsXHRsaXN0IGtub3duIHBhcnRpdGlvbiB0eXBlcyIpOworCQlwdXRzKCJuXHRhZGQgYSBuZXcgcGFydGl0aW9uIik7CisJCXB1dHMoIm9cdGNyZWF0ZSBhIG5ldyBlbXB0eSBET1MgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoInBcdHByaW50IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJCXB1dHMoInNcdGNyZWF0ZSBhIG5ldyBlbXB0eSBTdW4gZGlza2xhYmVsIik7ICAvKiBzdW4gKi8KKwkJcHV0cygidFx0Y2hhbmdlIGEgcGFydGl0aW9uJ3Mgc3lzdGVtIGlkIik7CisJCXB1dHMoInVcdGNoYW5nZSBkaXNwbGF5L2VudHJ5IHVuaXRzIik7CisJCXB1dHMoInZcdHZlcmlmeSB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoIndcdHdyaXRlIHRhYmxlIHRvIGRpc2sgYW5kIGV4aXQiKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorCQlwdXRzKCJ4XHRleHRyYSBmdW5jdGlvbmFsaXR5IChleHBlcnRzIG9ubHkpIik7CisjZW5kaWYKKwl9IGVsc2UgaWYgKExBQkVMX0lTX1NHSSkgeworCQlwdXRzKCJhXHRzZWxlY3QgYm9vdGFibGUgcGFydGl0aW9uIik7ICAgIC8qIHNnaSBmbGF2b3VyICovCisJCXB1dHMoImJcdGVkaXQgYm9vdGZpbGUgZW50cnkiKTsgICAgICAgICAgLyogc2dpICovCisJCXB1dHMoImNcdHNlbGVjdCBzZ2kgc3dhcCBwYXJ0aXRpb24iKTsgICAgLyogc2dpIGZsYXZvdXIgKi8KKwkJcHV0cygiZFx0ZGVsZXRlIGEgcGFydGl0aW9uIik7CisJCXB1dHMoImxcdGxpc3Qga25vd24gcGFydGl0aW9uIHR5cGVzIik7CisJCXB1dHMoIm5cdGFkZCBhIG5ldyBwYXJ0aXRpb24iKTsKKwkJcHV0cygib1x0Y3JlYXRlIGEgbmV3IGVtcHR5IERPUyBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicFx0cHJpbnQgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJxXHRxdWl0IHdpdGhvdXQgc2F2aW5nIGNoYW5nZXMiKTsKKwkJcHV0cygic1x0Y3JlYXRlIGEgbmV3IGVtcHR5IFN1biBkaXNrbGFiZWwiKTsgIC8qIHN1biAqLworCQlwdXRzKCJ0XHRjaGFuZ2UgYSBwYXJ0aXRpb24ncyBzeXN0ZW0gaWQiKTsKKwkJcHV0cygidVx0Y2hhbmdlIGRpc3BsYXkvZW50cnkgdW5pdHMiKTsKKwkJcHV0cygidlx0dmVyaWZ5IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygid1x0d3JpdGUgdGFibGUgdG8gZGlzayBhbmQgZXhpdCIpOworCX0gZWxzZSBpZiAoTEFCRUxfSVNfQUlYKSB7CisJCXB1dHMoIm9cdGNyZWF0ZSBhIG5ldyBlbXB0eSBET1MgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoInFcdHF1aXQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcyIpOworCQlwdXRzKCJzXHRjcmVhdGUgYSBuZXcgZW1wdHkgU3VuIGRpc2tsYWJlbCIpOyAgLyogc3VuICovCisJfSBlbHNlIGlmIChMQUJFTF9JU19HUFQpIHsKKwkJcHV0cygib1x0Y3JlYXRlIGEgbmV3IGVtcHR5IERPUyBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicFx0cHJpbnQgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJxXHRxdWl0IHdpdGhvdXQgc2F2aW5nIGNoYW5nZXMiKTsKKwkJcHV0cygic1x0Y3JlYXRlIGEgbmV3IGVtcHR5IFN1biBkaXNrbGFiZWwiKTsgIC8qIHN1biAqLworCX0gZWxzZSB7CisJCXB1dHMoImFcdHRvZ2dsZSBhIGJvb3RhYmxlIGZsYWciKTsKKwkJcHV0cygiYlx0ZWRpdCBic2QgZGlza2xhYmVsIik7CisJCXB1dHMoImNcdHRvZ2dsZSB0aGUgZG9zIGNvbXBhdGliaWxpdHkgZmxhZyIpOworCQlwdXRzKCJkXHRkZWxldGUgYSBwYXJ0aXRpb24iKTsKKwkJcHV0cygibFx0bGlzdCBrbm93biBwYXJ0aXRpb24gdHlwZXMiKTsKKwkJcHV0cygiblx0YWRkIGEgbmV3IHBhcnRpdGlvbiIpOworCQlwdXRzKCJvXHRjcmVhdGUgYSBuZXcgZW1wdHkgRE9TIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJwXHRwcmludCB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoInFcdHF1aXQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcyIpOworCQlwdXRzKCJzXHRjcmVhdGUgYSBuZXcgZW1wdHkgU3VuIGRpc2tsYWJlbCIpOyAgLyogc3VuICovCisJCXB1dHMoInRcdGNoYW5nZSBhIHBhcnRpdGlvbidzIHN5c3RlbSBpZCIpOworCQlwdXRzKCJ1XHRjaGFuZ2UgZGlzcGxheS9lbnRyeSB1bml0cyIpOworCQlwdXRzKCJ2XHR2ZXJpZnkgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJ3XHR3cml0ZSB0YWJsZSB0byBkaXNrIGFuZCBleGl0Iik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKKwkJcHV0cygieFx0ZXh0cmEgZnVuY3Rpb25hbGl0eSAoZXhwZXJ0cyBvbmx5KSIpOworI2VuZGlmCisJfQorfQorI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKK3N0YXRpYyB2b2lkCit4bWVudSh2b2lkKQoreworCXB1dHMoIkNvbW1hbmQgQWN0aW9uIik7CisJaWYgKExBQkVMX0lTX1NVTikgeworCQlwdXRzKCJhXHRjaGFuZ2UgbnVtYmVyIG9mIGFsdGVybmF0ZSBjeWxpbmRlcnMiKTsgICAgICAvKnN1biovCisJCXB1dHMoImNcdGNoYW5nZSBudW1iZXIgb2YgY3lsaW5kZXJzIik7CisJCXB1dHMoImRcdHByaW50IHRoZSByYXcgZGF0YSBpbiB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoImVcdGNoYW5nZSBudW1iZXIgb2YgZXh0cmEgc2VjdG9ycyBwZXIgY3lsaW5kZXIiKTsvKnN1biovCisJCXB1dHMoImhcdGNoYW5nZSBudW1iZXIgb2YgaGVhZHMiKTsKKwkJcHV0cygiaVx0Y2hhbmdlIGludGVybGVhdmUgZmFjdG9yIik7ICAgICAgICAgICAgICAgICAgLypzdW4qLworCQlwdXRzKCJvXHRjaGFuZ2Ugcm90YXRpb24gc3BlZWQgKHJwbSkiKTsgICAgICAgICAgICAgICAvKnN1biovCisJCXB1dHMoInBcdHByaW50IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJCXB1dHMoInJcdHJldHVybiB0byBtYWluIG1lbnUiKTsKKwkJcHV0cygic1x0Y2hhbmdlIG51bWJlciBvZiBzZWN0b3JzL3RyYWNrIik7CisJCXB1dHMoInZcdHZlcmlmeSB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoIndcdHdyaXRlIHRhYmxlIHRvIGRpc2sgYW5kIGV4aXQiKTsKKwkJcHV0cygieVx0Y2hhbmdlIG51bWJlciBvZiBwaHlzaWNhbCBjeWxpbmRlcnMiKTsgICAgICAgLypzdW4qLworCX0gZWxzZSBpZiAoTEFCRUxfSVNfU0dJKSB7CisJCXB1dHMoImJcdG1vdmUgYmVnaW5uaW5nIG9mIGRhdGEgaW4gYSBwYXJ0aXRpb24iKTsgLyogIXN1biAqLworCQlwdXRzKCJjXHRjaGFuZ2UgbnVtYmVyIG9mIGN5bGluZGVycyIpOworCQlwdXRzKCJkXHRwcmludCB0aGUgcmF3IGRhdGEgaW4gdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJlXHRsaXN0IGV4dGVuZGVkIHBhcnRpdGlvbnMiKTsgICAgICAgICAgLyogIXN1biAqLworCQlwdXRzKCJnXHRjcmVhdGUgYW4gSVJJWCAoU0dJKSBwYXJ0aXRpb24gdGFibGUiKTsvKiBzZ2kgKi8KKwkJcHV0cygiaFx0Y2hhbmdlIG51bWJlciBvZiBoZWFkcyIpOworCQlwdXRzKCJwXHRwcmludCB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoInFcdHF1aXQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcyIpOworCQlwdXRzKCJyXHRyZXR1cm4gdG8gbWFpbiBtZW51Iik7CisJCXB1dHMoInNcdGNoYW5nZSBudW1iZXIgb2Ygc2VjdG9ycy90cmFjayIpOworCQlwdXRzKCJ2XHR2ZXJpZnkgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJ3XHR3cml0ZSB0YWJsZSB0byBkaXNrIGFuZCBleGl0Iik7CisJfSBlbHNlIGlmIChMQUJFTF9JU19BSVgpIHsKKwkJcHV0cygiYlx0bW92ZSBiZWdpbm5pbmcgb2YgZGF0YSBpbiBhIHBhcnRpdGlvbiIpOyAvKiAhc3VuICovCisJCXB1dHMoImNcdGNoYW5nZSBudW1iZXIgb2YgY3lsaW5kZXJzIik7CisJCXB1dHMoImRcdHByaW50IHRoZSByYXcgZGF0YSBpbiB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoImVcdGxpc3QgZXh0ZW5kZWQgcGFydGl0aW9ucyIpOyAgICAgICAgICAvKiAhc3VuICovCisJCXB1dHMoImdcdGNyZWF0ZSBhbiBJUklYIChTR0kpIHBhcnRpdGlvbiB0YWJsZSIpOy8qIHNnaSAqLworCQlwdXRzKCJoXHRjaGFuZ2UgbnVtYmVyIG9mIGhlYWRzIik7CisJCXB1dHMoInBcdHByaW50IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJCXB1dHMoInJcdHJldHVybiB0byBtYWluIG1lbnUiKTsKKwkJcHV0cygic1x0Y2hhbmdlIG51bWJlciBvZiBzZWN0b3JzL3RyYWNrIik7CisJCXB1dHMoInZcdHZlcmlmeSB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoIndcdHdyaXRlIHRhYmxlIHRvIGRpc2sgYW5kIGV4aXQiKTsKKwl9IGVsc2UgeworCQlwdXRzKCJiXHRtb3ZlIGJlZ2lubmluZyBvZiBkYXRhIGluIGEgcGFydGl0aW9uIik7IC8qICFzdW4gKi8KKwkJcHV0cygiY1x0Y2hhbmdlIG51bWJlciBvZiBjeWxpbmRlcnMiKTsKKwkJcHV0cygiZFx0cHJpbnQgdGhlIHJhdyBkYXRhIGluIHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygiZVx0bGlzdCBleHRlbmRlZCBwYXJ0aXRpb25zIik7ICAgICAgICAgIC8qICFzdW4gKi8KKwkJcHV0cygiZlx0Zml4IHBhcnRpdGlvbiBvcmRlciIpOyAgICAgICAgICAgICAgIC8qICFzdW4sICFhaXgsICFzZ2kgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9TR0lfTEFCRUwKKwkJcHV0cygiZ1x0Y3JlYXRlIGFuIElSSVggKFNHSSkgcGFydGl0aW9uIHRhYmxlIik7Lyogc2dpICovCisjZW5kaWYKKwkJcHV0cygiaFx0Y2hhbmdlIG51bWJlciBvZiBoZWFkcyIpOworCQlwdXRzKCJwXHRwcmludCB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoInFcdHF1aXQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcyIpOworCQlwdXRzKCJyXHRyZXR1cm4gdG8gbWFpbiBtZW51Iik7CisJCXB1dHMoInNcdGNoYW5nZSBudW1iZXIgb2Ygc2VjdG9ycy90cmFjayIpOworCQlwdXRzKCJ2XHR2ZXJpZnkgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJ3XHR3cml0ZSB0YWJsZSB0byBkaXNrIGFuZCBleGl0Iik7CisJfQorfQorI2VuZGlmIC8qIEFEVkFOQ0VEIG1vZGUgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgKgorZ2V0X3N5c190eXBlcyh2b2lkKQoreworCXJldHVybiAoCisJCUxBQkVMX0lTX1NVTiA/IHN1bl9zeXNfdHlwZXMgOgorCQlMQUJFTF9JU19TR0kgPyBzZ2lfc3lzX3R5cGVzIDoKKwkJaTM4Nl9zeXNfdHlwZXMpOworfQorI2Vsc2UKKyNkZWZpbmUgZ2V0X3N5c190eXBlcygpIGkzODZfc3lzX3R5cGVzCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKgorcGFydGl0aW9uX3R5cGUodW5zaWduZWQgY2hhciB0eXBlKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKmNvbnN0ICp0eXBlcyA9IGdldF9zeXNfdHlwZXMoKTsKKworCWZvciAoaSA9IDA7IHR5cGVzW2ldOyBpKyspCisJCWlmICgodW5zaWduZWQgY2hhcil0eXBlc1tpXVswXSA9PSB0eXBlKQorCQkJcmV0dXJuIHR5cGVzW2ldICsgMTsKKworCXJldHVybiAiVW5rbm93biI7Cit9CisKK3N0YXRpYyBpbnQKK2lzX2NsZWFyZWRfcGFydGl0aW9uKGNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnApCit7CisJLyogV2UgY29uc2lkZXIgcGFydGl0aW9uICJjbGVhcmVkIiBvbmx5IGlmIGl0IGhhcyBvbmx5IHplcm9zICovCisJY29uc3QgY2hhciAqY3AgPSAoY29uc3QgY2hhciAqKXA7CisJaW50IGNudCA9IHNpemVvZigqcCk7CisJY2hhciBiaXRzID0gMDsKKwl3aGlsZSAoLS1jbnQgPj0gMCkKKwkJYml0cyB8PSAqY3ArKzsKKwlyZXR1cm4gKGJpdHMgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhcl9wYXJ0aXRpb24oc3RydWN0IHBhcnRpdGlvbiAqcCkKK3sKKwlpZiAocCkKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKK3N0YXRpYyBpbnQKK2dldF9zeXNpZChpbnQgaSkKK3sKKwlyZXR1cm4gTEFCRUxfSVNfU1VOID8gc3VubGFiZWwtPmluZm9zW2ldLmlkIDoKKwkJCShMQUJFTF9JU19TR0kgPyBzZ2lfZ2V0X3N5c2lkKGkpIDoKKwkJCQlwdGVzW2ldLnBhcnRfdGFibGUtPnN5c19pbmQpOworfQorCitzdGF0aWMgdm9pZAorbGlzdF90eXBlcyhjb25zdCBjaGFyICpjb25zdCAqc3lzKQoreworCWVudW0geyBDT0xTID0gMyB9OworCisJdW5zaWduZWQgbGFzdFtDT0xTXTsKKwl1bnNpZ25lZCBkb25lLCBuZXh0LCBzaXplOworCWludCBpOworCisJZm9yIChzaXplID0gMDsgc3lzW3NpemVdOyBzaXplKyspCisJCWNvbnRpbnVlOworCisJZG9uZSA9IDA7CisJZm9yIChpID0gQ09MUy0xOyBpID49IDA7IGktLSkgeworCQlkb25lICs9IChzaXplICsgaSAtIGRvbmUpIC8gKGkgKyAxKTsKKwkJbGFzdFtDT0xTLTEgLSBpXSA9IGRvbmU7CisJfQorCisJaSA9IGRvbmUgPSBuZXh0ID0gMDsKKwlkbyB7CisJCXByaW50ZigiJWMlMnggJS0yMi4yMnMiLCBpID8gJyAnIDogJ1xuJywKKwkJCSh1bnNpZ25lZCBjaGFyKXN5c1tuZXh0XVswXSwKKwkJCXN5c1tuZXh0XSArIDEpOworCQluZXh0ID0gbGFzdFtpKytdICsgZG9uZTsKKwkJaWYgKGkgPj0gQ09MUyB8fCBuZXh0ID49IGxhc3RbaV0pIHsKKwkJCWkgPSAwOworCQkJbmV4dCA9ICsrZG9uZTsKKwkJfQorCX0gd2hpbGUgKGRvbmUgPCBsYXN0WzBdKTsKKwliYl9wdXRjaGFyKCdcbicpOworfQorCisjZGVmaW5lIHNldF9oc2MoaCwgcywgYywgc2VjdG9yKSBkbyBcCit7IFwKKwlzID0gc2VjdG9yICUgZ19zZWN0b3JzICsgMTsgIFwKKwlzZWN0b3IgLz0gZ19zZWN0b3JzOyAgICAgICAgIFwKKwloID0gc2VjdG9yICUgZ19oZWFkczsgICAgICAgIFwKKwlzZWN0b3IgLz0gZ19oZWFkczsgICAgICAgICAgIFwKKwljID0gc2VjdG9yICYgMHhmZjsgICAgICAgICAgIFwKKwlzIHw9IChzZWN0b3IgPj4gMikgJiAweGMwOyAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHNldF9oc2Nfc3RhcnRfZW5kKHN0cnVjdCBwYXJ0aXRpb24gKnAsIHNlY3Rvcl90IHN0YXJ0LCBzZWN0b3JfdCBzdG9wKQoreworCWlmIChkb3NfY29tcGF0aWJsZV9mbGFnICYmIChzdGFydCAvIChnX3NlY3RvcnMgKiBnX2hlYWRzKSA+IDEwMjMpKQorCQlzdGFydCA9IGdfaGVhZHMgKiBnX3NlY3RvcnMgKiAxMDI0IC0gMTsKKwlzZXRfaHNjKHAtPmhlYWQsIHAtPnNlY3RvciwgcC0+Y3lsLCBzdGFydCk7CisKKwlpZiAoZG9zX2NvbXBhdGlibGVfZmxhZyAmJiAoc3RvcCAvIChnX3NlY3RvcnMgKiBnX2hlYWRzKSA+IDEwMjMpKQorCQlzdG9wID0gZ19oZWFkcyAqIGdfc2VjdG9ycyAqIDEwMjQgLSAxOworCXNldF9oc2MocC0+ZW5kX2hlYWQsIHAtPmVuZF9zZWN0b3IsIHAtPmVuZF9jeWwsIHN0b3ApOworfQorCitzdGF0aWMgdm9pZAorc2V0X3BhcnRpdGlvbihpbnQgaSwgaW50IGRvZXh0LCBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3Qgc3RvcCwgaW50IHN5c2lkKQoreworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisJc2VjdG9yX3Qgb2Zmc2V0OworCisJaWYgKGRvZXh0KSB7CisJCXAgPSBwdGVzW2ldLmV4dF9wb2ludGVyOworCQlvZmZzZXQgPSBleHRlbmRlZF9vZmZzZXQ7CisJfSBlbHNlIHsKKwkJcCA9IHB0ZXNbaV0ucGFydF90YWJsZTsKKwkJb2Zmc2V0ID0gcHRlc1tpXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQ7CisJfQorCXAtPmJvb3RfaW5kID0gMDsKKwlwLT5zeXNfaW5kID0gc3lzaWQ7CisJc2V0X3N0YXJ0X3NlY3QocCwgc3RhcnQgLSBvZmZzZXQpOworCXNldF9ucl9zZWN0cyhwLCBzdG9wIC0gc3RhcnQgKyAxKTsKKwlzZXRfaHNjX3N0YXJ0X2VuZChwLCBzdGFydCwgc3RvcCk7CisJcHRlc1tpXS5jaGFuZ2VkID0gMTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50Cit3YXJuX2dlb21ldHJ5KHZvaWQpCit7CisJaWYgKGdfaGVhZHMgJiYgZ19zZWN0b3JzICYmIGdfY3lsaW5kZXJzKQorCQlyZXR1cm4gMDsKKworCXByaW50ZigiVW5rbm93biB2YWx1ZShzKSBmb3I6Iik7CisJaWYgKCFnX2hlYWRzKQorCQlwcmludGYoIiBoZWFkcyIpOworCWlmICghZ19zZWN0b3JzKQorCQlwcmludGYoIiBzZWN0b3JzIik7CisJaWYgKCFnX2N5bGluZGVycykKKwkJcHJpbnRmKCIgY3lsaW5kZXJzIik7CisJcHJpbnRmKAorI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJCSIgKHNldHRhYmxlIGluIHRoZSBleHRyYSBmdW5jdGlvbnMgbWVudSkiCisjZW5kaWYKKwkJIlxuIik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfdW5pdHModm9pZCkKK3sKKwlpbnQgY3lsX3VuaXRzID0gZ19oZWFkcyAqIGdfc2VjdG9yczsKKworCWlmIChkaXNwbGF5X2luX2N5bF91bml0cyAmJiBjeWxfdW5pdHMpCisJCXVuaXRzX3Blcl9zZWN0b3IgPSBjeWxfdW5pdHM7CisJZWxzZQorCQl1bml0c19wZXJfc2VjdG9yID0gMTsgICAvKiBpbiBzZWN0b3JzICovCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorc3RhdGljIHZvaWQKK3dhcm5fY3lsaW5kZXJzKHZvaWQpCit7CisJaWYgKExBQkVMX0lTX0RPUyAmJiBnX2N5bGluZGVycyA+IDEwMjQgJiYgIW5vd2FybikKKwkJcHJpbnRmKCJcbiIKKyJUaGUgbnVtYmVyIG9mIGN5bGluZGVycyBmb3IgdGhpcyBkaXNrIGlzIHNldCB0byAldS5cbiIKKyJUaGVyZSBpcyBub3RoaW5nIHdyb25nIHdpdGggdGhhdCwgYnV0IHRoaXMgaXMgbGFyZ2VyIHRoYW4gMTAyNCxcbiIKKyJhbmQgY291bGQgaW4gY2VydGFpbiBzZXR1cHMgY2F1c2UgcHJvYmxlbXMgd2l0aDpcbiIKKyIxKSBzb2Z0d2FyZSB0aGF0IHJ1bnMgYXQgYm9vdCB0aW1lIChlLmcuLCBvbGQgdmVyc2lvbnMgb2YgTElMTylcbiIKKyIyKSBib290aW5nIGFuZCBwYXJ0aXRpb25pbmcgc29mdHdhcmUgZnJvbSBvdGhlciBPU3NcbiIKKyIgICAoZS5nLiwgRE9TIEZESVNLLCBPUy8yIEZESVNLKVxuIiwKKwkJCWdfY3lsaW5kZXJzKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorcmVhZF9leHRlbmRlZChpbnQgZXh0KQoreworCWludCBpOworCXN0cnVjdCBwdGUgKnBleDsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwLCAqcTsKKworCWV4dF9pbmRleCA9IGV4dDsKKwlwZXggPSAmcHRlc1tleHRdOworCXBleC0+ZXh0X3BvaW50ZXIgPSBwZXgtPnBhcnRfdGFibGU7CisKKwlwID0gcGV4LT5wYXJ0X3RhYmxlOworCWlmICghZ2V0X3N0YXJ0X3NlY3QocCkpIHsKKwkJcHJpbnRmKCJCYWQgb2Zmc2V0IGluIHByaW1hcnkgZXh0ZW5kZWQgcGFydGl0aW9uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChJU19FWFRFTkRFRChwLT5zeXNfaW5kKSkgeworCQlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2dfcGFydGl0aW9uc107CisKKwkJaWYgKGdfcGFydGl0aW9ucyA+PSBNQVhJTVVNX1BBUlRTKSB7CisJCQkvKiBUaGlzIGlzIG5vdCBhIExpbnV4IHJlc3RyaWN0aW9uLCBidXQKKwkJCSAgIHRoaXMgcHJvZ3JhbSB1c2VzIGFycmF5cyBvZiBzaXplIE1BWElNVU1fUEFSVFMuCisJCQkgICBEbyBub3QgdHJ5IHRvICdpbXByb3ZlJyB0aGlzIHRlc3QuICovCisJCQlzdHJ1Y3QgcHRlICpwcmUgPSAmcHRlc1tnX3BhcnRpdGlvbnMgLSAxXTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCQkJcHJpbnRmKCJXYXJuaW5nOiBkZWxldGluZyBwYXJ0aXRpb25zIGFmdGVyICV1XG4iLAorCQkJCWdfcGFydGl0aW9ucyk7CisJCQlwcmUtPmNoYW5nZWQgPSAxOworI2VuZGlmCisJCQljbGVhcl9wYXJ0aXRpb24ocHJlLT5leHRfcG9pbnRlcik7CisJCQlyZXR1cm47CisJCX0KKworCQlyZWFkX3B0ZShwZSwgZXh0ZW5kZWRfb2Zmc2V0ICsgZ2V0X3N0YXJ0X3NlY3QocCkpOworCisJCWlmICghZXh0ZW5kZWRfb2Zmc2V0KQorCQkJZXh0ZW5kZWRfb2Zmc2V0ID0gZ2V0X3N0YXJ0X3NlY3QocCk7CisKKwkJcSA9IHAgPSBwdF9vZmZzZXQocGUtPnNlY3RvcmJ1ZmZlciwgMCk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIHArKykgaWYgKGdldF9ucl9zZWN0cyhwKSkgeworCQkJaWYgKElTX0VYVEVOREVEKHAtPnN5c19pbmQpKSB7CisJCQkJaWYgKHBlLT5leHRfcG9pbnRlcikKKwkJCQkJcHJpbnRmKCJXYXJuaW5nOiBleHRyYSBsaW5rICIKKwkJCQkJCSJwb2ludGVyIGluIHBhcnRpdGlvbiB0YWJsZSIKKwkJCQkJCSIgJXVcbiIsIGdfcGFydGl0aW9ucyArIDEpOworCQkJCWVsc2UKKwkJCQkJcGUtPmV4dF9wb2ludGVyID0gcDsKKwkJCX0gZWxzZSBpZiAocC0+c3lzX2luZCkgeworCQkJCWlmIChwZS0+cGFydF90YWJsZSkKKwkJCQkJcHJpbnRmKCJXYXJuaW5nOiBpZ25vcmluZyBleHRyYSAiCisJCQkJCQkgICJkYXRhIGluIHBhcnRpdGlvbiB0YWJsZSIKKwkJCQkJCSAgIiAldVxuIiwgZ19wYXJ0aXRpb25zICsgMSk7CisJCQkJZWxzZQorCQkJCQlwZS0+cGFydF90YWJsZSA9IHA7CisJCQl9CisJCX0KKworCQkvKiB2ZXJ5IHN0cmFuZ2UgY29kZSBoZXJlLi4uICovCisJCWlmICghcGUtPnBhcnRfdGFibGUpIHsKKwkJCWlmIChxICE9IHBlLT5leHRfcG9pbnRlcikKKwkJCQlwZS0+cGFydF90YWJsZSA9IHE7CisJCQllbHNlCisJCQkJcGUtPnBhcnRfdGFibGUgPSBxICsgMTsKKwkJfQorCQlpZiAoIXBlLT5leHRfcG9pbnRlcikgeworCQkJaWYgKHEgIT0gcGUtPnBhcnRfdGFibGUpCisJCQkJcGUtPmV4dF9wb2ludGVyID0gcTsKKwkJCWVsc2UKKwkJCQlwZS0+ZXh0X3BvaW50ZXIgPSBxICsgMTsKKwkJfQorCisJCXAgPSBwZS0+ZXh0X3BvaW50ZXI7CisJCWdfcGFydGl0aW9ucysrOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJLyogcmVtb3ZlIGVtcHR5IGxpbmtzICovCisgcmVtb3ZlOgorCWZvciAoaSA9IDQ7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCisJCWlmICghZ2V0X25yX3NlY3RzKHBlLT5wYXJ0X3RhYmxlKQorCQkgJiYgKGdfcGFydGl0aW9ucyA+IDUgfHwgcHRlc1s0XS5wYXJ0X3RhYmxlLT5zeXNfaW5kKQorCQkpIHsKKwkJCXByaW50ZigiT21pdHRpbmcgZW1wdHkgcGFydGl0aW9uICgldSlcbiIsIGkrMSk7CisJCQlkZWxldGVfcGFydGl0aW9uKGkpOworCQkJZ290byByZW1vdmU7ICAgIC8qIG51bWJlcmluZyBjaGFuZ2VkICovCisJCX0KKwl9CisjZW5kaWYKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCitzdGF0aWMgdm9pZAorY3JlYXRlX2Rvc2xhYmVsKHZvaWQpCit7CisJcHJpbnRmKG1zZ19idWlsZGluZ19uZXdfbGFiZWwsICJET1MgZGlza2xhYmVsIik7CisKKwljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9ET1M7CisjaWYgRU5BQkxFX0ZFQVRVUkVfT1NGX0xBQkVMCisJcG9zc2libHlfb3NmX2xhYmVsID0gMDsKKyNlbmRpZgorCWdfcGFydGl0aW9ucyA9IDQ7CisKKwltZW1zZXQoJk1CUmJ1ZmZlcls1MTAgLSA0KjE2XSwgMCwgNCoxNik7CisJd3JpdGVfcGFydF90YWJsZV9mbGFnKE1CUmJ1ZmZlcik7CisJZXh0ZW5kZWRfb2Zmc2V0ID0gMDsKKwlzZXRfYWxsX3VuY2hhbmdlZCgpOworCXNldF9jaGFuZ2VkKDApOworCWdldF9ib290KENSRUFURV9FTVBUWV9ET1MpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitnZXRfc2VjdG9yc2l6ZSh2b2lkKQoreworCWlmICghdXNlcl9zZXRfc2VjdG9yX3NpemUpIHsKKwkJaW50IGFyZzsKKwkJaWYgKGlvY3RsKGRldl9mZCwgQkxLU1NaR0VULCAmYXJnKSA9PSAwKQorCQkJc2VjdG9yX3NpemUgPSBhcmc7CisJCWlmIChzZWN0b3Jfc2l6ZSAhPSBERUZBVUxUX1NFQ1RPUl9TSVpFKQorCQkJcHJpbnRmKCJOb3RlOiBzZWN0b3Igc2l6ZSBpcyAldSAiCisJCQkJIihub3QgIiBERUZBVUxUX1NFQ1RPUl9TSVpFX1NUUiAiKVxuIiwKKwkJCQlzZWN0b3Jfc2l6ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZ2V0X2tlcm5lbF9nZW9tZXRyeSh2b2lkKQoreworCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tZXRyeTsKKworCWlmICghaW9jdGwoZGV2X2ZkLCBIRElPX0dFVEdFTywgJmdlb21ldHJ5KSkgeworCQlrZXJuX2hlYWRzID0gZ2VvbWV0cnkuaGVhZHM7CisJCWtlcm5fc2VjdG9ycyA9IGdlb21ldHJ5LnNlY3RvcnM7CisJCS8qIG5ldmVyIHVzZSBnZW9tZXRyeS5jeWxpbmRlcnMgLSBpdCBpcyB0cnVuY2F0ZWQgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfcGFydGl0aW9uX3RhYmxlX2dlb21ldHJ5KHZvaWQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopTUJSYnVmZmVyOworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisJaW50IGksIGgsIHMsIGhoLCBzczsKKwlpbnQgZmlyc3QgPSAxOworCWludCBiYWQgPSAwOworCisJaWYgKCEodmFsaWRfcGFydF90YWJsZV9mbGFnKChjaGFyKilidWZwKSkpCisJCXJldHVybjsKKworCWhoID0gc3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcCA9IHB0X29mZnNldChidWZwLCBpKTsKKwkJaWYgKHAtPnN5c19pbmQgIT0gMCkgeworCQkJaCA9IHAtPmVuZF9oZWFkICsgMTsKKwkJCXMgPSAocC0+ZW5kX3NlY3RvciAmIDA3Nyk7CisJCQlpZiAoZmlyc3QpIHsKKwkJCQloaCA9IGg7CisJCQkJc3MgPSBzOworCQkJCWZpcnN0ID0gMDsKKwkJCX0gZWxzZSBpZiAoaGggIT0gaCB8fCBzcyAhPSBzKQorCQkJCWJhZCA9IDE7CisJCX0KKwl9CisKKwlpZiAoIWZpcnN0ICYmICFiYWQpIHsKKwkJcHRfaGVhZHMgPSBoaDsKKwkJcHRfc2VjdG9ycyA9IHNzOworCX0KK30KKworc3RhdGljIHZvaWQKK2dldF9nZW9tZXRyeSh2b2lkKQoreworCWludCBzZWNfZmFjOworCisJZ2V0X3NlY3RvcnNpemUoKTsKKwlzZWNfZmFjID0gc2VjdG9yX3NpemUgLyA1MTI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisJZ3Vlc3NfZGV2aWNlX3R5cGUoKTsKKyNlbmRpZgorCWdfaGVhZHMgPSBnX2N5bGluZGVycyA9IGdfc2VjdG9ycyA9IDA7CisJa2Vybl9oZWFkcyA9IGtlcm5fc2VjdG9ycyA9IDA7CisJcHRfaGVhZHMgPSBwdF9zZWN0b3JzID0gMDsKKworCWdldF9rZXJuZWxfZ2VvbWV0cnkoKTsKKwlnZXRfcGFydGl0aW9uX3RhYmxlX2dlb21ldHJ5KCk7CisKKwlnX2hlYWRzID0gdXNlcl9oZWFkcyA/IHVzZXJfaGVhZHMgOgorCQlwdF9oZWFkcyA/IHB0X2hlYWRzIDoKKwkJa2Vybl9oZWFkcyA/IGtlcm5faGVhZHMgOiAyNTU7CisJZ19zZWN0b3JzID0gdXNlcl9zZWN0b3JzID8gdXNlcl9zZWN0b3JzIDoKKwkJcHRfc2VjdG9ycyA/IHB0X3NlY3RvcnMgOgorCQlrZXJuX3NlY3RvcnMgPyBrZXJuX3NlY3RvcnMgOiA2MzsKKwl0b3RhbF9udW1iZXJfb2Zfc2VjdG9ycyA9IGJiX0JMS0dFVFNJWkVfc2VjdG9ycyhkZXZfZmQpOworCisJc2VjdG9yX29mZnNldCA9IDE7CisJaWYgKGRvc19jb21wYXRpYmxlX2ZsYWcpCisJCXNlY3Rvcl9vZmZzZXQgPSBnX3NlY3RvcnM7CisKKwlnX2N5bGluZGVycyA9IHRvdGFsX251bWJlcl9vZl9zZWN0b3JzIC8gKGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBzZWNfZmFjKTsKKwlpZiAoIWdfY3lsaW5kZXJzKQorCQlnX2N5bGluZGVycyA9IHVzZXJfY3lsaW5kZXJzOworfQorCisvKgorICogT3BlbnMgZGlza19kZXZpY2UgYW5kIG9wdGlvbmFsbHkgcmVhZHMgTUJSLgorICogICAgSWYgd2hhdCA9PSBPUEVOX01BSU46CisgKiAgICAgIE9wZW4gZGV2aWNlLCByZWFkIE1CUi4gIEFib3J0IHByb2dyYW0gb24gc2hvcnQgcmVhZC4gIENyZWF0ZSBlbXB0eQorICogICAgICBkaXNrbGFiZWwgaWYgdGhlIG9uLWRpc2sgc3RydWN0dXJlIGlzIGludmFsaWQgKFdSSVRBQkxFIG1vZGUpLgorICogICAgSWYgd2hhdCA9PSBUUllfT05MWToKKyAqICAgICAgT3BlbiBkZXZpY2UsIHJlYWQgTUJSLiAgUmV0dXJuIGFuIGVycm9yIGlmIGFueXRoaW5nIGlzIG91dCBvZiBwbGFjZS4KKyAqICAgICAgRG8gbm90IGNyZWF0ZSBhbiBlbXB0eSBkaXNrbGFiZWwuICBUaGlzIGlzIHVzZWQgZm9yIHRoZSAibGlzdCIKKyAqICAgICAgb3BlcmF0aW9uczogImZkaXNrIC1sIC9kZXYvc2RhIiBhbmQgImZkaXNrIC1sIiAoYWxsIGRldmljZXMpLgorICogICAgSWYgd2hhdCA9PSBDUkVBVEVfRU1QVFlfKjoKKyAqICAgICAgVGhpcyBtZWFucyB0aGF0IGdldF9ib290KCkgd2FzIGNhbGxlZCByZWN1cnNpdmVseSBmcm9tIGNyZWF0ZV8qbGFiZWwoKS4KKyAqICAgICAgRG8gbm90IHJlLW9wZW4gdGhlIGRldmljZTsganVzdCBzZXQgdXAgdGhlIHB0ZXMgYXJyYXkgYW5kIHByaW50CisgKiAgICAgIGdlb21ldHJ5IHdhcm5pbmdzLgorICoKKyAqIFJldHVybnM6CisgKiAgIC0xOiBubyAweGFhNTUgZmxhZyBwcmVzZW50IChwb3NzaWJseSBlbnRpcmUgZGlzayBCU0QpCisgKiAgICAwOiBmb3VuZCBvciBjcmVhdGVkIGxhYmVsCisgKiAgICAxOiBJL08gZXJyb3IKKyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1NVTl9MQUJFTCB8fCBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorc3RhdGljIGludCBnZXRfYm9vdChlbnVtIGFjdGlvbiB3aGF0KQorI2Vsc2UKK3N0YXRpYyBpbnQgZ2V0X2Jvb3Qodm9pZCkKKyNkZWZpbmUgZ2V0X2Jvb3Qod2hhdCkgZ2V0X2Jvb3QoKQorI2VuZGlmCit7CisJaW50IGksIGZkOworCisJZ19wYXJ0aXRpb25zID0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJCXBlLT5wYXJ0X3RhYmxlID0gcHRfb2Zmc2V0KE1CUmJ1ZmZlciwgaSk7CisJCXBlLT5leHRfcG9pbnRlciA9IE5VTEw7CisJCXBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgPSAwOworCQlwZS0+c2VjdG9yYnVmZmVyID0gTUJSYnVmZmVyOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJCXBlLT5jaGFuZ2VkID0gKHdoYXQgPT0gQ1JFQVRFX0VNUFRZX0RPUyk7CisjZW5kaWYKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorLy8gQUxFUlQhIGhpZ2hseSBpZGlvdGljIGRlc2lnbiEKKy8vIFdlIGVuZCB1cCBoZXJlIHdoZW4gd2UgY2FsbCBnZXRfYm9vdCgpIHJlY3Vyc2l2ZWx5CisvLyB2aWEgZ2V0X2Jvb3QoKSBbdGFibGUgaXMgYmFkXSAtPiBjcmVhdGVfZG9zbGFiZWwoKSAtPiBnZXRfYm9vdChDUkVBVEVfRU1QVFlfRE9TKS4KKy8vIG9yIGdldF9ib290KCkgW3RhYmxlIGlzIGJhZF0gLT4gY3JlYXRlX3N1bmxhYmVsKCkgLT4gZ2V0X2Jvb3QoQ1JFQVRFX0VNUFRZX1NVTikuCisvLyAoanVzdCBmYWN0b3Igb3V0IHJlLWluaXQgb2YgcHRlc1swLDEsMiwzXSBpbiBhIHNlcGFyYXRlIGZuIGluc3RlYWQ/KQorLy8gU28gc2tpcCBvcGVuaW5nIGRldmljZSBfYWdhaW5fLi4uCisJaWYgKHdoYXQgPT0gQ1JFQVRFX0VNUFRZX0RPUyAgSUZfRkVBVFVSRV9TVU5fTEFCRUwofHwgd2hhdCA9PSBDUkVBVEVfRU1QVFlfU1VOKSkKKwkJZ290byBjcmVhdGVkX3RhYmxlOworCisJZmQgPSBvcGVuKGRpc2tfZGV2aWNlLCAob3B0aW9uX21hc2szMiAmIE9QVF9sKSA/IE9fUkRPTkxZIDogT19SRFdSKTsKKworCWlmIChmZCA8IDApIHsKKwkJZmQgPSBvcGVuKGRpc2tfZGV2aWNlLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApIHsKKwkJCWlmICh3aGF0ID09IFRSWV9PTkxZKQorCQkJCXJldHVybiAxOworCQkJZmRpc2tfZmF0YWwodW5hYmxlX3RvX29wZW4pOworCQl9CisJCXByaW50ZigiJyVzJyBpcyBvcGVuZWQgZm9yIHJlYWQgb25seVxuIiwgZGlza19kZXZpY2UpOworCX0KKwl4bW92ZV9mZChmZCwgZGV2X2ZkKTsKKwlpZiAoNTEyICE9IGZ1bGxfcmVhZChkZXZfZmQsIE1CUmJ1ZmZlciwgNTEyKSkgeworCQlpZiAod2hhdCA9PSBUUllfT05MWSkgeworCQkJY2xvc2VfZGV2X2ZkKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlmZGlza19mYXRhbCh1bmFibGVfdG9fcmVhZCk7CisJfQorI2Vsc2UKKwlmZCA9IG9wZW4oZGlza19kZXZpY2UsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gMTsKKwlpZiAoNTEyICE9IGZ1bGxfcmVhZChmZCwgTUJSYnVmZmVyLCA1MTIpKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDE7CisJfQorCXhtb3ZlX2ZkKGZkLCBkZXZfZmQpOworI2VuZGlmCisKKwlnZXRfZ2VvbWV0cnkoKTsKKwl1cGRhdGVfdW5pdHMoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NVTl9MQUJFTAorCWlmIChjaGVja19zdW5fbGFiZWwoKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TR0lfTEFCRUwKKwlpZiAoY2hlY2tfc2dpX2xhYmVsKCkpCisJCXJldHVybiAwOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfQUlYX0xBQkVMCisJaWYgKGNoZWNrX2FpeF9sYWJlbCgpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0dQVF9MQUJFTAorCWlmIChjaGVja19ncHRfbGFiZWwoKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9PU0ZfTEFCRUwKKwlpZiAoY2hlY2tfb3NmX2xhYmVsKCkpIHsKKwkJcG9zc2libHlfb3NmX2xhYmVsID0gMTsKKwkJaWYgKCF2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcoTUJSYnVmZmVyKSkgeworCQkJY3VycmVudF9sYWJlbF90eXBlID0gTEFCRUxfT1NGOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJpbnRmKCJUaGlzIGRpc2sgaGFzIGJvdGggRE9TIGFuZCBCU0QgbWFnaWMuXG4iCisJCQkgIkdpdmUgdGhlICdiJyBjb21tYW5kIHRvIGdvIHRvIEJTRCBtb2RlLlxuIik7CisJfQorI2VuZGlmCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwlpZiAoIXZhbGlkX3BhcnRfdGFibGVfZmxhZyhNQlJidWZmZXIpKQorCQlyZXR1cm4gLTE7CisjZWxzZQorCWlmICghdmFsaWRfcGFydF90YWJsZV9mbGFnKE1CUmJ1ZmZlcikpIHsKKwkJaWYgKHdoYXQgPT0gT1BFTl9NQUlOKSB7CisJCQlwcmludGYoIkRldmljZSBjb250YWlucyBuZWl0aGVyIGEgdmFsaWQgRE9TICIKKwkJCQkgICJwYXJ0aXRpb24gdGFibGUsIG5vciBTdW4sIFNHSSwgT1NGIG9yIEdQVCAiCisJCQkJICAiZGlza2xhYmVsXG4iKTsKKyNpZmRlZiBfX3NwYXJjX18KKwkJCUlGX0ZFQVRVUkVfU1VOX0xBQkVMKGNyZWF0ZV9zdW5sYWJlbCgpOykKKyNlbHNlCisJCQljcmVhdGVfZG9zbGFiZWwoKTsKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogVFJZX09OTFk6ICovCisJCXJldHVybiAtMTsKKwl9CisgY3JlYXRlZF90YWJsZToKKyNlbmRpZiAvKiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFICovCisKKworCUlGX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUod2Fybl9jeWxpbmRlcnMoKTspCisJd2Fybl9nZW9tZXRyeSgpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoSVNfRVhURU5ERUQocHRlc1tpXS5wYXJ0X3RhYmxlLT5zeXNfaW5kKSkgeworCQkJaWYgKGdfcGFydGl0aW9ucyAhPSA0KQorCQkJCXByaW50ZigiSWdub3JpbmcgZXh0cmEgZXh0ZW5kZWQgIgorCQkJCQkicGFydGl0aW9uICV1XG4iLCBpICsgMSk7CisJCQllbHNlCisJCQkJcmVhZF9leHRlbmRlZChpKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDM7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCQlpZiAoIXZhbGlkX3BhcnRfdGFibGVfZmxhZyhwZS0+c2VjdG9yYnVmZmVyKSkgeworCQkJcHJpbnRmKCJXYXJuaW5nOiBpbnZhbGlkIGZsYWcgMHglMDJ4LDB4JTAyeCBvZiBwYXJ0aXRpb24gIgorCQkJCSJ0YWJsZSAldSB3aWxsIGJlIGNvcnJlY3RlZCBieSB3KHJpdGUpXG4iLAorCQkJCXBlLT5zZWN0b3JidWZmZXJbNTEwXSwKKwkJCQlwZS0+c2VjdG9yYnVmZmVyWzUxMV0sCisJCQkJaSArIDEpOworCQkJSUZfRkVBVFVSRV9GRElTS19XUklUQUJMRShwZS0+Y2hhbmdlZCA9IDE7KQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorLyoKKyAqIFByaW50IHRoZSBtZXNzYWdlIE1FU0csIHRoZW4gcmVhZCBhbiBpbnRlZ2VyIGJldHdlZW4gTE9XIGFuZCBISUdIIChpbmNsdXNpdmUpLgorICogSWYgdGhlIHVzZXIgaGl0cyBFbnRlciwgREZMVCBpcyByZXR1cm5lZC4KKyAqIEFuc3dlcnMgbGlrZSArMTAgYXJlIGludGVycHJldGVkIGFzIG9mZnNldHMgZnJvbSBCQVNFLgorICoKKyAqIFRoZXJlIGlzIG5vIGRlZmF1bHQgaWYgREZMVCBpcyBub3QgYmV0d2VlbiBMT1cgYW5kIEhJR0guCisgKi8KK3N0YXRpYyBzZWN0b3JfdAorcmVhZF9pbnQoc2VjdG9yX3QgbG93LCBzZWN0b3JfdCBkZmx0LCBzZWN0b3JfdCBoaWdoLCBzZWN0b3JfdCBiYXNlLCBjb25zdCBjaGFyICptZXNnKQoreworCXNlY3Rvcl90IHZhbHVlOworCWludCBkZWZhdWx0X29rID0gMTsKKwljb25zdCBjaGFyICpmbXQgPSAiJXMgKCV1LSV1LCBkZWZhdWx0ICV1KTogIjsKKworCWlmIChkZmx0IDwgbG93IHx8IGRmbHQgPiBoaWdoKSB7CisJCWZtdCA9ICIlcyAoJXUtJXUpOiAiOworCQlkZWZhdWx0X29rID0gMDsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgdXNlX2RlZmF1bHQgPSBkZWZhdWx0X29rOworCisJCS8qIGFzayBxdWVzdGlvbiBhbmQgcmVhZCBhbnN3ZXIgKi8KKwkJZG8geworCQkJcHJpbnRmKGZtdCwgbWVzZywgbG93LCBoaWdoLCBkZmx0KTsKKwkJCXJlYWRfbWF5YmVfZW1wdHkoIiIpOworCQl9IHdoaWxlICgqbGluZV9wdHIgIT0gJ1xuJyAmJiAhaXNkaWdpdCgqbGluZV9wdHIpCisJCSAmJiAqbGluZV9wdHIgIT0gJy0nICYmICpsaW5lX3B0ciAhPSAnKycpOworCisJCWlmICgqbGluZV9wdHIgPT0gJysnIHx8ICpsaW5lX3B0ciA9PSAnLScpIHsKKwkJCWludCBtaW51cyA9ICgqbGluZV9wdHIgPT0gJy0nKTsKKwkJCWludCBhYnNvbHV0ZSA9IDA7CisKKwkJCXZhbHVlID0gYXRvaShsaW5lX3B0ciArIDEpOworCisJCQkvKiAoMSkgaWYgMm5kIGNoYXIgaXMgZGlnaXQsIHVzZV9kZWZhdWx0ID0gMC4KKwkJCSAqICgyKSBtb3ZlIGxpbmVfcHRyIHRvIGZpcnN0IG5vbi1kaWdpdC4gKi8KKwkJCXdoaWxlIChpc2RpZ2l0KCorK2xpbmVfcHRyKSkKKwkJCQl1c2VfZGVmYXVsdCA9IDA7CisKKwkJCXN3aXRjaCAoKmxpbmVfcHRyKSB7CisJCQljYXNlICdjJzoKKwkJCWNhc2UgJ0MnOgorCQkJCWlmICghZGlzcGxheV9pbl9jeWxfdW5pdHMpCisJCQkJCXZhbHVlICo9IGdfaGVhZHMgKiBnX3NlY3RvcnM7CisJCQkJYnJlYWs7CisJCQljYXNlICdLJzoKKwkJCQlhYnNvbHV0ZSA9IDEwMjQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdrJzoKKwkJCQlhYnNvbHV0ZSA9IDEwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCWNhc2UgJ00nOgorCQkJCWFic29sdXRlID0gMTAwMDAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2cnOgorCQkJY2FzZSAnRyc6CisJCQkJYWJzb2x1dGUgPSAxMDAwMDAwMDAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChhYnNvbHV0ZSkgeworCQkJCXVsbG9uZyBieXRlczsKKwkJCQl1bnNpZ25lZCBsb25nIHVuaXQ7CisKKwkJCQlieXRlcyA9ICh1bGxvbmcpIHZhbHVlICogYWJzb2x1dGU7CisJCQkJdW5pdCA9IHNlY3Rvcl9zaXplICogdW5pdHNfcGVyX3NlY3RvcjsKKwkJCQlieXRlcyArPSB1bml0LzI7IC8qIHJvdW5kICovCisJCQkJYnl0ZXMgLz0gdW5pdDsKKwkJCQl2YWx1ZSA9IGJ5dGVzOworCQkJfQorCQkJaWYgKG1pbnVzKQorCQkJCXZhbHVlID0gLXZhbHVlOworCQkJdmFsdWUgKz0gYmFzZTsKKwkJfSBlbHNlIHsKKwkJCXZhbHVlID0gYXRvaShsaW5lX3B0cik7CisJCQl3aGlsZSAoaXNkaWdpdCgqbGluZV9wdHIpKSB7CisJCQkJbGluZV9wdHIrKzsKKwkJCQl1c2VfZGVmYXVsdCA9IDA7CisJCQl9CisJCX0KKwkJaWYgKHVzZV9kZWZhdWx0KSB7CisJCQl2YWx1ZSA9IGRmbHQ7CisJCQlwcmludGYoIlVzaW5nIGRlZmF1bHQgdmFsdWUgJXVcbiIsIHZhbHVlKTsKKwkJfQorCQlpZiAodmFsdWUgPj0gbG93ICYmIHZhbHVlIDw9IGhpZ2gpCisJCQlicmVhazsKKwkJcHJpbnRmKCJWYWx1ZSBpcyBvdXQgb2YgcmFuZ2VcbiIpOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorZ2V0X3BhcnRpdGlvbihpbnQgd2FybiwgdW5zaWduZWQgbWF4KQoreworCXN0cnVjdCBwdGUgKnBlOworCXVuc2lnbmVkIGk7CisKKwlpID0gcmVhZF9pbnQoMSwgMCwgbWF4LCAwLCAiUGFydGl0aW9uIG51bWJlciIpIC0gMTsKKwlwZSA9ICZwdGVzW2ldOworCisJaWYgKHdhcm4pIHsKKwkJaWYgKCghTEFCRUxfSVNfU1VOICYmICFMQUJFTF9JU19TR0kgJiYgIXBlLT5wYXJ0X3RhYmxlLT5zeXNfaW5kKQorCQkgfHwgKExBQkVMX0lTX1NVTiAmJiAoIXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzIHx8ICFzdW5sYWJlbC0+aW5mb3NbaV0uaWQpKQorCQkgfHwgKExBQkVMX0lTX1NHSSAmJiAhc2dpX2dldF9udW1fc2VjdG9ycyhpKSkKKwkJKSB7CisJCQlwcmludGYoIldhcm5pbmc6IHBhcnRpdGlvbiAldSBoYXMgZW1wdHkgdHlwZVxuIiwgaSsxKTsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludAorZ2V0X2V4aXN0aW5nX3BhcnRpdGlvbihpbnQgd2FybiwgdW5zaWduZWQgbWF4KQoreworCWludCBwbm8gPSAtMTsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJCXN0cnVjdCBwYXJ0aXRpb24gKnAgPSBwZS0+cGFydF90YWJsZTsKKworCQlpZiAocCAmJiAhaXNfY2xlYXJlZF9wYXJ0aXRpb24ocCkpIHsKKwkJCWlmIChwbm8gPj0gMCkKKwkJCQlnb3RvIG5vdF91bmlxdWU7CisJCQlwbm8gPSBpOworCQl9CisJfQorCWlmIChwbm8gPj0gMCkgeworCQlwcmludGYoIlNlbGVjdGVkIHBhcnRpdGlvbiAldVxuIiwgcG5vKzEpOworCQlyZXR1cm4gcG5vOworCX0KKwlwcmludGYoIk5vIHBhcnRpdGlvbiBpcyBkZWZpbmVkIHlldCFcbiIpOworCXJldHVybiAtMTsKKworIG5vdF91bmlxdWU6CisJcmV0dXJuIGdldF9wYXJ0aXRpb24od2FybiwgbWF4KTsKK30KKworc3RhdGljIGludAorZ2V0X25vbmV4aXN0aW5nX3BhcnRpdGlvbihpbnQgd2FybiwgdW5zaWduZWQgbWF4KQoreworCWludCBwbm8gPSAtMTsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJCXN0cnVjdCBwYXJ0aXRpb24gKnAgPSBwZS0+cGFydF90YWJsZTsKKworCQlpZiAocCAmJiBpc19jbGVhcmVkX3BhcnRpdGlvbihwKSkgeworCQkJaWYgKHBubyA+PSAwKQorCQkJCWdvdG8gbm90X3VuaXF1ZTsKKwkJCXBubyA9IGk7CisJCX0KKwl9CisJaWYgKHBubyA+PSAwKSB7CisJCXByaW50ZigiU2VsZWN0ZWQgcGFydGl0aW9uICV1XG4iLCBwbm8rMSk7CisJCXJldHVybiBwbm87CisJfQorCXByaW50ZigiQWxsIHByaW1hcnkgcGFydGl0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCBhbHJlYWR5IVxuIik7CisJcmV0dXJuIC0xOworCisgbm90X3VuaXF1ZToKKwlyZXR1cm4gZ2V0X3BhcnRpdGlvbih3YXJuLCBtYXgpOworfQorCisKK3N0YXRpYyB2b2lkCitjaGFuZ2VfdW5pdHModm9pZCkKK3sKKwlkaXNwbGF5X2luX2N5bF91bml0cyA9ICFkaXNwbGF5X2luX2N5bF91bml0czsKKwl1cGRhdGVfdW5pdHMoKTsKKwlwcmludGYoIkNoYW5naW5nIGRpc3BsYXkvZW50cnkgdW5pdHMgdG8gJXNcbiIsCisJCXN0cl91bml0cyhQTFVSQUwpKTsKK30KKworc3RhdGljIHZvaWQKK3RvZ2dsZV9hY3RpdmUoaW50IGkpCit7CisJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwID0gcGUtPnBhcnRfdGFibGU7CisKKwlpZiAoSVNfRVhURU5ERUQocC0+c3lzX2luZCkgJiYgIXAtPmJvb3RfaW5kKQorCQlwcmludGYoIldBUk5JTkc6IFBhcnRpdGlvbiAldSBpcyBhbiBleHRlbmRlZCBwYXJ0aXRpb25cbiIsIGkgKyAxKTsKKwlwLT5ib290X2luZCA9IChwLT5ib290X2luZCA/IDAgOiBBQ1RJVkVfRkxBRyk7CisJcGUtPmNoYW5nZWQgPSAxOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX2Rvc19jb21wYXRpYmlsaXR5X2ZsYWcodm9pZCkKK3sKKwlkb3NfY29tcGF0aWJsZV9mbGFnID0gMSAtIGRvc19jb21wYXRpYmxlX2ZsYWc7CisJaWYgKGRvc19jb21wYXRpYmxlX2ZsYWcpIHsKKwkJc2VjdG9yX29mZnNldCA9IGdfc2VjdG9yczsKKwkJcHJpbnRmKCJET1MgQ29tcGF0aWJpbGl0eSBmbGFnIGlzIHNldFxuIik7CisJfSBlbHNlIHsKKwkJc2VjdG9yX29mZnNldCA9IDE7CisJCXByaW50ZigiRE9TIENvbXBhdGliaWxpdHkgZmxhZyBpcyBub3Qgc2V0XG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkZWxldGVfcGFydGl0aW9uKGludCBpKQoreworCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJc3RydWN0IHBhcnRpdGlvbiAqcCA9IHBlLT5wYXJ0X3RhYmxlOworCXN0cnVjdCBwYXJ0aXRpb24gKnEgPSBwZS0+ZXh0X3BvaW50ZXI7CisKKy8qIE5vdGUgdGhhdCBmb3IgdGhlIGZpZnRoIHBhcnRpdGlvbiAoaSA9PSA0KSB3ZSBkb24ndCBhY3R1YWxseQorICogZGVjcmVtZW50IHBhcnRpdGlvbnMuCisgKi8KKworCWlmICh3YXJuX2dlb21ldHJ5KCkpCisJCXJldHVybjsgICAgICAgICAvKiBDL0gvUyBub3Qgc2V0ICovCisJcGUtPmNoYW5nZWQgPSAxOworCisJaWYgKExBQkVMX0lTX1NVTikgeworCQlzdW5fZGVsZXRlX3BhcnRpdGlvbihpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoTEFCRUxfSVNfU0dJKSB7CisJCXNnaV9kZWxldGVfcGFydGl0aW9uKGkpOworCQlyZXR1cm47CisJfQorCisJaWYgKGkgPCA0KSB7CisJCWlmIChJU19FWFRFTkRFRChwLT5zeXNfaW5kKSAmJiBpID09IGV4dF9pbmRleCkgeworCQkJZ19wYXJ0aXRpb25zID0gNDsKKwkJCXB0ZXNbZXh0X2luZGV4XS5leHRfcG9pbnRlciA9IE5VTEw7CisJCQlleHRlbmRlZF9vZmZzZXQgPSAwOworCQl9CisJCWNsZWFyX3BhcnRpdGlvbihwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghcS0+c3lzX2luZCAmJiBpID4gNCkgeworCQkvKiB0aGUgbGFzdCBvbmUgaW4gdGhlIGNoYWluIC0ganVzdCBkZWxldGUgKi8KKwkJLS1nX3BhcnRpdGlvbnM7CisJCS0taTsKKwkJY2xlYXJfcGFydGl0aW9uKHB0ZXNbaV0uZXh0X3BvaW50ZXIpOworCQlwdGVzW2ldLmNoYW5nZWQgPSAxOworCX0gZWxzZSB7CisJCS8qIG5vdCB0aGUgbGFzdCBvbmUgLSBmdXJ0aGVyIG9uZXMgd2lsbCBiZSBtb3ZlZCBkb3duICovCisJCWlmIChpID4gNCkgeworCQkJLyogZGVsZXRlIHRoaXMgbGluayBpbiB0aGUgY2hhaW4gKi8KKwkJCXAgPSBwdGVzW2ktMV0uZXh0X3BvaW50ZXI7CisJCQkqcCA9ICpxOworCQkJc2V0X3N0YXJ0X3NlY3QocCwgZ2V0X3N0YXJ0X3NlY3QocSkpOworCQkJc2V0X25yX3NlY3RzKHAsIGdldF9ucl9zZWN0cyhxKSk7CisJCQlwdGVzW2ktMV0uY2hhbmdlZCA9IDE7CisJCX0gZWxzZSBpZiAoZ19wYXJ0aXRpb25zID4gNSkgeyAgICAvKiA1IHdpbGwgYmUgbW92ZWQgdG8gNCAqLworCQkJLyogdGhlIGZpcnN0IGxvZ2ljYWwgaW4gYSBsb25nZXIgY2hhaW4gKi8KKwkJCXBlID0gJnB0ZXNbNV07CisKKwkJCWlmIChwZS0+cGFydF90YWJsZSkgLyogcHJldmVudCBTRUdGQVVMVCAqLworCQkJCXNldF9zdGFydF9zZWN0KHBlLT5wYXJ0X3RhYmxlLAorCQkJCQkJZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChwZSkgLQorCQkJCQkJZXh0ZW5kZWRfb2Zmc2V0KTsKKwkJCXBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgPSBleHRlbmRlZF9vZmZzZXQ7CisJCQlwZS0+Y2hhbmdlZCA9IDE7CisJCX0KKworCQlpZiAoZ19wYXJ0aXRpb25zID4gNSkgeworCQkJZ19wYXJ0aXRpb25zLS07CisJCQl3aGlsZSAoaSA8IGdfcGFydGl0aW9ucykgeworCQkJCXB0ZXNbaV0gPSBwdGVzW2krMV07CisJCQkJaSsrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogdGhlIG9ubHkgbG9naWNhbDogY2xlYXIgb25seSAqLworCQkJY2xlYXJfcGFydGl0aW9uKHB0ZXNbaV0ucGFydF90YWJsZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGFuZ2Vfc3lzaWQodm9pZCkKK3sKKwlpbnQgaSwgc3lzLCBvcmlnc3lzOworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisKKwkvKiBJZiBzZ2lfbGFiZWwgdGhlbiBkb24ndCB1c2UgZ2V0X2V4aXN0aW5nX3BhcnRpdGlvbiwKKwkgICBsZXQgdGhlIHVzZXIgc2VsZWN0IGEgcGFydGl0aW9uLCBzaW5jZSBnZXRfZXhpc3RpbmdfcGFydGl0aW9uKCkKKwkgICBvbmx5IHdvcmtzIGZvciBMaW51eCBsaWtlIHBhcnRpdGlvbiB0YWJsZXMuICovCisJaWYgKCFMQUJFTF9JU19TR0kpIHsKKwkJaSA9IGdldF9leGlzdGluZ19wYXJ0aXRpb24oMCwgZ19wYXJ0aXRpb25zKTsKKwl9IGVsc2UgeworCQlpID0gZ2V0X3BhcnRpdGlvbigwLCBnX3BhcnRpdGlvbnMpOworCX0KKwlpZiAoaSA9PSAtMSkKKwkJcmV0dXJuOworCXAgPSBwdGVzW2ldLnBhcnRfdGFibGU7CisJb3JpZ3N5cyA9IHN5cyA9IGdldF9zeXNpZChpKTsKKworCS8qIGlmIGNoYW5naW5nIHR5cGVzIFQgdG8gMCBpcyBhbGxvd2VkLCB0aGVuCisJICAgdGhlIHJldmVyc2UgY2hhbmdlIG11c3QgYmUgYWxsb3dlZCwgdG9vICovCisJaWYgKCFzeXMgJiYgIUxBQkVMX0lTX1NHSSAmJiAhTEFCRUxfSVNfU1VOICYmICFnZXRfbnJfc2VjdHMocCkpCXsKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgZG9lcyBub3QgZXhpc3QgeWV0IVxuIiwgaSArIDEpOworCQlyZXR1cm47CisJfQorCXdoaWxlICgxKSB7CisJCXN5cyA9IHJlYWRfaGV4KGdldF9zeXNfdHlwZXMoKSk7CisKKwkJaWYgKCFzeXMgJiYgIUxBQkVMX0lTX1NHSSAmJiAhTEFCRUxfSVNfU1VOKSB7CisJCQlwcmludGYoIlR5cGUgMCBtZWFucyBmcmVlIHNwYWNlIHRvIG1hbnkgc3lzdGVtc1xuIgorCQkJCSAgICIoYnV0IG5vdCB0byBMaW51eCkuIEhhdmluZyBwYXJ0aXRpb25zIG9mXG4iCisJCQkJICAgInR5cGUgMCBpcyBwcm9iYWJseSB1bndpc2UuXG4iKTsKKwkJCS8qIGJyZWFrOyAqLworCQl9CisKKwkJaWYgKCFMQUJFTF9JU19TVU4gJiYgIUxBQkVMX0lTX1NHSSkgeworCQkJaWYgKElTX0VYVEVOREVEKHN5cykgIT0gSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKwkJCQlwcmludGYoIllvdSBjYW5ub3QgY2hhbmdlIGEgcGFydGl0aW9uIGludG8iCisJCQkJCSAgICIgYW4gZXh0ZW5kZWQgb25lIG9yIHZpY2UgdmVyc2FcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHN5cyA8IDI1NikgeworI2lmIEVOQUJMRV9GRUFUVVJFX1NVTl9MQUJFTAorCQkJaWYgKExBQkVMX0lTX1NVTiAmJiBpID09IDIgJiYgc3lzICE9IFNVTl9XSE9MRV9ESVNLKQorCQkJCXByaW50ZigiQ29uc2lkZXIgbGVhdmluZyBwYXJ0aXRpb24gMyAiCisJCQkJCSAgICJhcyBXaG9sZSBkaXNrICg1KSxcbiIKKwkJCQkJICAgImFzIFN1bk9TL1NvbGFyaXMgZXhwZWN0cyBpdCBhbmQgIgorCQkJCQkgICAiZXZlbiBMaW51eCBsaWtlcyBpdFxuXG4iKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NHSV9MQUJFTAorCQkJaWYgKExBQkVMX0lTX1NHSSAmJgorCQkJCSgKKwkJCQkJKGkgPT0gMTAgJiYgc3lzICE9IFNHSV9FTlRJUkVfRElTSykgfHwKKwkJCQkJKGkgPT0gOCAmJiBzeXMgIT0gMCkKKwkJCQkpCisJCQkpIHsKKwkJCQlwcmludGYoIkNvbnNpZGVyIGxlYXZpbmcgcGFydGl0aW9uIDkgIgorCQkJCQkgICAiYXMgdm9sdW1lIGhlYWRlciAoMCksXG5hbmQgIgorCQkJCQkgICAicGFydGl0aW9uIDExIGFzIGVudGlyZSB2b2x1bWUgKDYpIgorCQkJCQkgICAiYXMgSVJJWCBleHBlY3RzIGl0XG5cbiIpOworCQkJfQorI2VuZGlmCisJCQlpZiAoc3lzID09IG9yaWdzeXMpCisJCQkJYnJlYWs7CisJCQlpZiAoTEFCRUxfSVNfU1VOKSB7CisJCQkJc3VuX2NoYW5nZV9zeXNpZChpLCBzeXMpOworCQkJfSBlbHNlIGlmIChMQUJFTF9JU19TR0kpIHsKKwkJCQlzZ2lfY2hhbmdlX3N5c2lkKGksIHN5cyk7CisJCQl9IGVsc2UKKwkJCQlwLT5zeXNfaW5kID0gc3lzOworCisJCQlwcmludGYoIkNoYW5nZWQgc3lzdGVtIHR5cGUgb2YgcGFydGl0aW9uICV1ICIKKwkJCQkidG8gJXggKCVzKVxuIiwgaSArIDEsIHN5cywKKwkJCQlwYXJ0aXRpb25fdHlwZShzeXMpKTsKKwkJCXB0ZXNbaV0uY2hhbmdlZCA9IDE7CisJCQkvL2lmIChpc19kb3NfcGFydGl0aW9uKG9yaWdzeXMpIHx8IGlzX2Rvc19wYXJ0aXRpb24oc3lzKSkKKwkJCS8vCWRvc19jaGFuZ2VkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgKi8KKworCisvKiBjaGVja19jb25zaXN0ZW5jeSgpIGFuZCBsaW5lYXIyY2hzKCkgYWRkZWQgU2F0IE1hciA2IDEyOjI4OjE2IDE5OTMsCisgKiBmYWl0aEBjcy51bmMuZWR1LCBiYXNlZCBvbiBjb2RlIGZyYWdtZW50cyBmcm9tIHBmZGlzayBieSBHb3Jkb24gVy4gUm9zcywKKyAqIEphbi4gIDE5OTAgKHZlcnNpb24gMS4yLjEgYnkgR29yZG9uIFcuIFJvc3MgQXVnLiAxOTkwOyBNb2RpZmllZCBieSBTLgorICogTHVia2luIE9jdC4gIDE5OTEpLiAqLworCitzdGF0aWMgdm9pZAorbGluZWFyMmNocyh1bnNpZ25lZCBscywgdW5zaWduZWQgKmMsIHVuc2lnbmVkICpoLCB1bnNpZ25lZCAqcykKK3sKKwlpbnQgc3BjID0gZ19oZWFkcyAqIGdfc2VjdG9yczsKKworCSpjID0gbHMgLyBzcGM7CisJbHMgPSBscyAlIHNwYzsKKwkqaCA9IGxzIC8gZ19zZWN0b3JzOworCSpzID0gbHMgJSBnX3NlY3RvcnMgKyAxOyAgLyogc2VjdG9ycyBjb3VudCBmcm9tIDEgKi8KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2NvbnNpc3RlbmN5KGNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnAsIGludCBwYXJ0aXRpb24pCit7CisJdW5zaWduZWQgcGJjLCBwYmgsIHBiczsgICAgICAgICAgLyogcGh5c2ljYWwgYmVnaW5uaW5nIGMsIGgsIHMgKi8KKwl1bnNpZ25lZCBwZWMsIHBlaCwgcGVzOyAgICAgICAgICAvKiBwaHlzaWNhbCBlbmRpbmcgYywgaCwgcyAqLworCXVuc2lnbmVkIGxiYywgbGJoLCBsYnM7ICAgICAgICAgIC8qIGxvZ2ljYWwgYmVnaW5uaW5nIGMsIGgsIHMgKi8KKwl1bnNpZ25lZCBsZWMsIGxlaCwgbGVzOyAgICAgICAgICAvKiBsb2dpY2FsIGVuZGluZyBjLCBoLCBzICovCisKKwlpZiAoIWdfaGVhZHMgfHwgIWdfc2VjdG9ycyB8fCAocGFydGl0aW9uID49IDQpKQorCQlyZXR1cm47ICAgICAgICAgLyogZG8gbm90IGNoZWNrIGV4dGVuZGVkIHBhcnRpdGlvbnMgKi8KKworLyogcGh5c2ljYWwgYmVnaW5uaW5nIGMsIGgsIHMgKi8KKwlwYmMgPSAocC0+Y3lsICYgMHhmZikgfCAoKHAtPnNlY3RvciA8PCAyKSAmIDB4MzAwKTsKKwlwYmggPSBwLT5oZWFkOworCXBicyA9IHAtPnNlY3RvciAmIDB4M2Y7CisKKy8qIHBoeXNpY2FsIGVuZGluZyBjLCBoLCBzICovCisJcGVjID0gKHAtPmVuZF9jeWwgJiAweGZmKSB8ICgocC0+ZW5kX3NlY3RvciA8PCAyKSAmIDB4MzAwKTsKKwlwZWggPSBwLT5lbmRfaGVhZDsKKwlwZXMgPSBwLT5lbmRfc2VjdG9yICYgMHgzZjsKKworLyogY29tcHV0ZSBsb2dpY2FsIGJlZ2lubmluZyAoYywgaCwgcykgKi8KKwlsaW5lYXIyY2hzKGdldF9zdGFydF9zZWN0KHApLCAmbGJjLCAmbGJoLCAmbGJzKTsKKworLyogY29tcHV0ZSBsb2dpY2FsIGVuZGluZyAoYywgaCwgcykgKi8KKwlsaW5lYXIyY2hzKGdldF9zdGFydF9zZWN0KHApICsgZ2V0X25yX3NlY3RzKHApIC0gMSwgJmxlYywgJmxlaCwgJmxlcyk7CisKKy8qIFNhbWUgcGh5c2ljYWwgLyBsb2dpY2FsIGJlZ2lubmluZz8gKi8KKwlpZiAoZ19jeWxpbmRlcnMgPD0gMTAyNCAmJiAocGJjICE9IGxiYyB8fCBwYmggIT0gbGJoIHx8IHBicyAhPSBsYnMpKSB7CisJCXByaW50ZigiUGFydGl0aW9uICV1IGhhcyBkaWZmZXJlbnQgcGh5c2ljYWwvbG9naWNhbCAiCisJCQkiYmVnaW5uaW5ncyAobm9uLUxpbnV4Pyk6XG4iLCBwYXJ0aXRpb24gKyAxKTsKKwkJcHJpbnRmKCIgICAgIHBoeXM9KCV1LCAldSwgJXUpICIsIHBiYywgcGJoLCBwYnMpOworCQlwcmludGYoImxvZ2ljYWw9KCV1LCAldSwgJXUpXG4iLCBsYmMsIGxiaCwgbGJzKTsKKwl9CisKKy8qIFNhbWUgcGh5c2ljYWwgLyBsb2dpY2FsIGVuZGluZz8gKi8KKwlpZiAoZ19jeWxpbmRlcnMgPD0gMTAyNCAmJiAocGVjICE9IGxlYyB8fCBwZWggIT0gbGVoIHx8IHBlcyAhPSBsZXMpKSB7CisJCXByaW50ZigiUGFydGl0aW9uICV1IGhhcyBkaWZmZXJlbnQgcGh5c2ljYWwvbG9naWNhbCAiCisJCQkiZW5kaW5nczpcbiIsIHBhcnRpdGlvbiArIDEpOworCQlwcmludGYoIiAgICAgcGh5cz0oJXUsICV1LCAldSkgIiwgcGVjLCBwZWgsIHBlcyk7CisJCXByaW50ZigibG9naWNhbD0oJXUsICV1LCAldSlcbiIsIGxlYywgbGVoLCBsZXMpOworCX0KKworLyogRW5kaW5nIG9uIGN5bGluZGVyIGJvdW5kYXJ5PyAqLworCWlmIChwZWggIT0gKGdfaGVhZHMgLSAxKSB8fCBwZXMgIT0gZ19zZWN0b3JzKSB7CisJCXByaW50ZigiUGFydGl0aW9uICV1IGRvZXMgbm90IGVuZCBvbiBjeWxpbmRlciBib3VuZGFyeVxuIiwKKwkJCXBhcnRpdGlvbiArIDEpOworCX0KK30KKworc3RhdGljIHZvaWQKK2xpc3RfZGlza19nZW9tZXRyeSh2b2lkKQoreworCXVsbG9uZyBieXRlcyA9ICgodWxsb25nKXRvdGFsX251bWJlcl9vZl9zZWN0b3JzIDw8IDkpOworCWxvbmcgbWVnYWJ5dGVzID0gYnl0ZXMgLyAxMDAwMDAwOworCisJaWYgKG1lZ2FieXRlcyA8IDEwMDAwKQorCQlwcmludGYoIlxuRGlzayAlczogJWx1IE1CLCAlbGx1IGJ5dGVzXG4iLAorCQkJZGlza19kZXZpY2UsIG1lZ2FieXRlcywgYnl0ZXMpOworCWVsc2UKKwkJcHJpbnRmKCJcbkRpc2sgJXM6ICVsdS4lbHUgR0IsICVsbHUgYnl0ZXNcbiIsCisJCQlkaXNrX2RldmljZSwgbWVnYWJ5dGVzLzEwMDAsIChtZWdhYnl0ZXMvMTAwKSUxMCwgYnl0ZXMpOworCXByaW50ZigiJXUgaGVhZHMsICV1IHNlY3RvcnMvdHJhY2ssICV1IGN5bGluZGVycyIsCisJCSAgIGdfaGVhZHMsIGdfc2VjdG9ycywgZ19jeWxpbmRlcnMpOworCWlmICh1bml0c19wZXJfc2VjdG9yID09IDEpCisJCXByaW50ZigiLCB0b3RhbCAlIlNFQ1RfRk1UInUgc2VjdG9ycyIsCisJCQl0b3RhbF9udW1iZXJfb2Zfc2VjdG9ycyAvIChzZWN0b3Jfc2l6ZS81MTIpKTsKKwlwcmludGYoIlxuVW5pdHMgPSAlcyBvZiAldSAqICV1ID0gJXUgYnl0ZXNcblxuIiwKKwkJc3RyX3VuaXRzKFBMVVJBTCksCisJCXVuaXRzX3Blcl9zZWN0b3IsIHNlY3Rvcl9zaXplLCB1bml0c19wZXJfc2VjdG9yICogc2VjdG9yX3NpemUpOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciBwYXJ0aXRpb24gZW50cmllcyBhcmUgb3JkZXJlZCBieSB0aGVpciBzdGFydGluZyBwb3NpdGlvbnMuCisgKiBSZXR1cm4gMCBpZiBPSy4gUmV0dXJuIGkgaWYgcGFydGl0aW9uIGkgc2hvdWxkIGhhdmUgYmVlbiBlYXJsaWVyLgorICogVHdvIHNlcGFyYXRlIGNoZWNrczogcHJpbWFyeSBhbmQgbG9naWNhbCBwYXJ0aXRpb25zLgorICovCitzdGF0aWMgaW50Cit3cm9uZ19wX29yZGVyKGludCAqcHJldikKK3sKKwljb25zdCBzdHJ1Y3QgcHRlICpwZTsKKwljb25zdCBzdHJ1Y3QgcGFydGl0aW9uICpwOworCXNlY3Rvcl90IGxhc3RfcF9zdGFydF9wb3MgPSAwLCBwX3N0YXJ0X3BvczsKKwl1bnNpZ25lZCBpLCBsYXN0X2kgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCWlmIChpID09IDQpIHsKKwkJCWxhc3RfaSA9IDQ7CisJCQlsYXN0X3Bfc3RhcnRfcG9zID0gMDsKKwkJfQorCQlwZSA9ICZwdGVzW2ldOworCQlwID0gcGUtPnBhcnRfdGFibGU7CisJCWlmIChwLT5zeXNfaW5kKSB7CisJCQlwX3N0YXJ0X3BvcyA9IGdldF9wYXJ0aXRpb25fc3RhcnRfZnJvbV9kZXZfc3RhcnQocGUpOworCisJCQlpZiAobGFzdF9wX3N0YXJ0X3BvcyA+IHBfc3RhcnRfcG9zKSB7CisJCQkJaWYgKHByZXYpCisJCQkJCSpwcmV2ID0gbGFzdF9pOworCQkJCXJldHVybiBpOworCQkJfQorCisJCQlsYXN0X3Bfc3RhcnRfcG9zID0gcF9zdGFydF9wb3M7CisJCQlsYXN0X2kgPSBpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKKy8qCisgKiBGaXggdGhlIGNoYWluIG9mIGxvZ2ljYWxzLgorICogZXh0ZW5kZWRfb2Zmc2V0IGlzIHVuY2hhbmdlZCwgdGhlIHNldCBvZiBzZWN0b3JzIHVzZWQgaXMgdW5jaGFuZ2VkCisgKiBUaGUgY2hhaW4gaXMgc29ydGVkIHNvIHRoYXQgc2VjdG9ycyBpbmNyZWFzZSwgYW5kIHNvIHRoYXQKKyAqIHN0YXJ0aW5nIHNlY3RvcnMgaW5jcmVhc2UuCisgKgorICogQWZ0ZXIgdGhpcyBpdCBtYXkgc3RpbGwgYmUgdGhhdCBjZmRpc2sgZG9lc250IGxpa2UgdGhlIHRhYmxlLgorICogKFRoaXMgaXMgYmVjYXVzZSBjZmRpc2sgY29uc2lkZXJzIGV4cGFuZGVkIHBhcnRzLCBmcm9tIGxpbmsgdG8KKyAqIGVuZCBvZiBwYXJ0aXRpb24sIGFuZCB0aGVzZSBtYXkgc3RpbGwgb3ZlcmxhcC4pCisgKiBOb3cKKyAqICAgc2ZkaXNrIC9kZXYvaGRhID4gb2hkYTsgc2ZkaXNrIC9kZXYvaGRhIDwgb2hkYQorICogbWF5IGhlbHAuCisgKi8KK3N0YXRpYyB2b2lkCitmaXhfY2hhaW5fb2ZfbG9naWNhbHModm9pZCkKK3sKKwlpbnQgaiwgb2osIG9qaiwgc2osIHNqajsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwaiwqcGpqLHRtcDsKKworCS8qIFN0YWdlIDE6IHNvcnQgc2VjdG9ycyBidXQgbGVhdmUgc2VjdG9yIG9mIHBhcnQgNCAqLworCS8qIChJdHMgc2VjdG9yIGlzIHRoZSBnbG9iYWwgZXh0ZW5kZWRfb2Zmc2V0LikgKi8KKyBzdGFnZTE6CisJZm9yIChqID0gNTsgaiA8IGdfcGFydGl0aW9ucyAtIDE7IGorKykgeworCQlvaiA9IHB0ZXNbal0ub2Zmc2V0X2Zyb21fZGV2X3N0YXJ0OworCQlvamogPSBwdGVzW2orMV0ub2Zmc2V0X2Zyb21fZGV2X3N0YXJ0OworCQlpZiAob2ogPiBvamopIHsKKwkJCXB0ZXNbal0ub2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ID0gb2pqOworCQkJcHRlc1tqKzFdLm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IG9qOworCQkJcGogPSBwdGVzW2pdLnBhcnRfdGFibGU7CisJCQlzZXRfc3RhcnRfc2VjdChwaiwgZ2V0X3N0YXJ0X3NlY3QocGopK29qLW9qaik7CisJCQlwamogPSBwdGVzW2orMV0ucGFydF90YWJsZTsKKwkJCXNldF9zdGFydF9zZWN0KHBqaiwgZ2V0X3N0YXJ0X3NlY3QocGpqKStvamotb2opOworCQkJc2V0X3N0YXJ0X3NlY3QocHRlc1tqLTFdLmV4dF9wb2ludGVyLAorCQkJCQkgICBvamotZXh0ZW5kZWRfb2Zmc2V0KTsKKwkJCXNldF9zdGFydF9zZWN0KHB0ZXNbal0uZXh0X3BvaW50ZXIsCisJCQkJCSAgIG9qLWV4dGVuZGVkX29mZnNldCk7CisJCQlnb3RvIHN0YWdlMTsKKwkJfQorCX0KKworCS8qIFN0YWdlIDI6IHNvcnQgc3RhcnRpbmcgc2VjdG9ycyAqLworIHN0YWdlMjoKKwlmb3IgKGogPSA0OyBqIDwgZ19wYXJ0aXRpb25zIC0gMTsgaisrKSB7CisJCXBqID0gcHRlc1tqXS5wYXJ0X3RhYmxlOworCQlwamogPSBwdGVzW2orMV0ucGFydF90YWJsZTsKKwkJc2ogPSBnZXRfc3RhcnRfc2VjdChwaik7CisJCXNqaiA9IGdldF9zdGFydF9zZWN0KHBqaik7CisJCW9qID0gcHRlc1tqXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQ7CisJCW9qaiA9IHB0ZXNbaisxXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQ7CisJCWlmIChvaitzaiA+IG9qaitzamopIHsKKwkJCXRtcCA9ICpwajsKKwkJCSpwaiA9ICpwamo7CisJCQkqcGpqID0gdG1wOworCQkJc2V0X3N0YXJ0X3NlY3QocGosIG9qaitzamotb2opOworCQkJc2V0X3N0YXJ0X3NlY3QocGpqLCBvaitzai1vamopOworCQkJZ290byBzdGFnZTI7CisJCX0KKwl9CisKKwkvKiBQcm9iYWJseSBzb21ldGhpbmcgd2FzIGNoYW5nZWQgKi8KKwlmb3IgKGogPSA0OyBqIDwgZ19wYXJ0aXRpb25zOyBqKyspCisJCXB0ZXNbal0uY2hhbmdlZCA9IDE7Cit9CisKKworc3RhdGljIHZvaWQKK2ZpeF9wYXJ0aXRpb25fdGFibGVfb3JkZXIodm9pZCkKK3sKKwlzdHJ1Y3QgcHRlICpwZWksICpwZWs7CisJaW50IGksazsKKworCWlmICghd3JvbmdfcF9vcmRlcihOVUxMKSkgeworCQlwcmludGYoIk9yZGVyaW5nIGlzIGFscmVhZHkgY29ycmVjdFxuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICgoaSA9IHdyb25nX3Bfb3JkZXIoJmspKSAhPSAwICYmIGkgPCA0KSB7CisJCS8qIHBhcnRpdGlvbiBpIHNob3VsZCBoYXZlIGNvbWUgZWFybGllciwgbW92ZSBpdCAqLworCQkvKiBXZSBoYXZlIHRvIG1vdmUgZGF0YSBpbiB0aGUgTUJSICovCisJCXN0cnVjdCBwYXJ0aXRpb24gKnBpLCAqcGssICpwZSwgcGJ1ZjsKKwkJcGVpID0gJnB0ZXNbaV07CisJCXBlayA9ICZwdGVzW2tdOworCisJCXBlID0gcGVpLT5leHRfcG9pbnRlcjsKKwkJcGVpLT5leHRfcG9pbnRlciA9IHBlay0+ZXh0X3BvaW50ZXI7CisJCXBlay0+ZXh0X3BvaW50ZXIgPSBwZTsKKworCQlwaSA9IHBlaS0+cGFydF90YWJsZTsKKwkJcGsgPSBwZWstPnBhcnRfdGFibGU7CisKKwkJbWVtbW92ZSgmcGJ1ZiwgcGksIHNpemVvZihzdHJ1Y3QgcGFydGl0aW9uKSk7CisJCW1lbW1vdmUocGksIHBrLCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOworCQltZW1tb3ZlKHBrLCAmcGJ1Ziwgc2l6ZW9mKHN0cnVjdCBwYXJ0aXRpb24pKTsKKworCQlwZWktPmNoYW5nZWQgPSBwZWstPmNoYW5nZWQgPSAxOworCX0KKworCWlmIChpKQorCQlmaXhfY2hhaW5fb2ZfbG9naWNhbHMoKTsKKworCXByaW50ZigiRG9uZS5cbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitsaXN0X3RhYmxlKGludCB4dHJhKQoreworCWNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnA7CisJaW50IGksIHc7CisKKwlpZiAoTEFCRUxfSVNfU1VOKSB7CisJCXN1bl9saXN0X3RhYmxlKHh0cmEpOworCQlyZXR1cm47CisJfQorCWlmIChMQUJFTF9JU19TR0kpIHsKKwkJc2dpX2xpc3RfdGFibGUoeHRyYSk7CisJCXJldHVybjsKKwl9CisJaWYgKExBQkVMX0lTX0dQVCkgeworCQlncHRfbGlzdF90YWJsZSh4dHJhKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZGlza19nZW9tZXRyeSgpOworCisJaWYgKExBQkVMX0lTX09TRikgeworCQl4YnNkX3ByaW50X2Rpc2tsYWJlbCh4dHJhKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEhldXJpc3RpYzogd2UgbGlzdCBwYXJ0aXRpb24gMyBvZiAvZGV2L2ZvbyBhcyAvZGV2L2ZvbzMsCisJICAgYnV0IGlmIHRoZSBkZXZpY2UgbmFtZSBlbmRzIGluIGEgZGlnaXQsIHNheSAvZGV2L2ZvbzEsCisJICAgdGhlbiB0aGUgcGFydGl0aW9uIGlzIGNhbGxlZCAvZGV2L2ZvbzFwMy4gKi8KKwl3ID0gc3RybGVuKGRpc2tfZGV2aWNlKTsKKwlpZiAodyAmJiBpc2RpZ2l0KGRpc2tfZGV2aWNlW3ctMV0pKQorCQl3Kys7CisJaWYgKHcgPCA1KQorCQl3ID0gNTsKKworCS8vICAgICAgICAgICAgMSAxMjM0NTY3ODkwMSAxMjM0NTY3ODkwMSAxMjM0NTY3ODkwMSAgMTIKKwlwcmludGYoIiUqcyBCb290ICAgICAgU3RhcnQgICAgICAgICBFbmQgICAgICBCbG9ja3MgIElkIFN5c3RlbVxuIiwKKwkJICAgdysxLCAiRGV2aWNlIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJc2VjdG9yX3QgcHNlY3RzOworCQlzZWN0b3JfdCBwYmxvY2tzOworCQl1bnNpZ25lZCBwb2RkOworCisJCXAgPSBwZS0+cGFydF90YWJsZTsKKwkJaWYgKCFwIHx8IGlzX2NsZWFyZWRfcGFydGl0aW9uKHApKQorCQkJY29udGludWU7CisKKwkJcHNlY3RzID0gZ2V0X25yX3NlY3RzKHApOworCQlwYmxvY2tzID0gcHNlY3RzOworCQlwb2RkID0gMDsKKworCQlpZiAoc2VjdG9yX3NpemUgPCAxMDI0KSB7CisJCQlwYmxvY2tzIC89ICgxMDI0IC8gc2VjdG9yX3NpemUpOworCQkJcG9kZCA9IHBzZWN0cyAlICgxMDI0IC8gc2VjdG9yX3NpemUpOworCQl9CisJCWlmIChzZWN0b3Jfc2l6ZSA+IDEwMjQpCisJCQlwYmxvY2tzICo9IChzZWN0b3Jfc2l6ZSAvIDEwMjQpOworCisJCXByaW50ZigiJXMgICVjICUxMSJTRUNUX0ZNVCJ1ICUxMSJTRUNUX0ZNVCJ1ICUxMSJTRUNUX0ZNVCJ1JWMgJTJ4ICVzXG4iLAorCQkJcGFydG5hbWUoZGlza19kZXZpY2UsIGkrMSwgdysyKSwKKwkJCSFwLT5ib290X2luZCA/ICcgJyA6IHAtPmJvb3RfaW5kID09IEFDVElWRV9GTEFHIC8qIGJvb3QgZmxhZyAqLworCQkJCT8gJyonIDogJz8nLAorCQkJY3JvdW5kKGdldF9wYXJ0aXRpb25fc3RhcnRfZnJvbV9kZXZfc3RhcnQocGUpKSwgICAgICAgICAgIC8qIHN0YXJ0ICovCisJCQljcm91bmQoZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChwZSkgKyBwc2VjdHMgICAgLyogZW5kICovCisJCQkJLSAocHNlY3RzID8gMSA6IDApKSwKKwkJCXBibG9ja3MsIHBvZGQgPyAnKycgOiAnICcsIC8qIG9kZCBmbGFnIG9uIGVuZCAqLworCQkJcC0+c3lzX2luZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBpZCAqLworCQkJcGFydGl0aW9uX3R5cGUocC0+c3lzX2luZCkpOyAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBuYW1lICovCisKKwkJY2hlY2tfY29uc2lzdGVuY3kocCwgaSk7CisJfQorCisJLyogSXMgcGFydGl0aW9uIHRhYmxlIGluIGRpc2sgb3JkZXI/IEl0IG5lZWQgbm90IGJlLCBidXQuLi4gKi8KKwkvKiBwYXJ0aXRpb24gdGFibGUgZW50cmllcyBhcmUgbm90IGNoZWNrZWQgZm9yIGNvcnJlY3Qgb3JkZXIKKwkgKiBpZiB0aGlzIGlzIGEgc2dpLCBzdW4gb3IgYWl4IGxhYmVsZWQgZGlzay4uLiAqLworCWlmIChMQUJFTF9JU19ET1MgJiYgd3JvbmdfcF9vcmRlcihOVUxMKSkgeworCQkvKiBGSVhNRSAqLworCQlwcmludGYoIlxuUGFydGl0aW9uIHRhYmxlIGVudHJpZXMgYXJlIG5vdCBpbiBkaXNrIG9yZGVyXG4iKTsKKwl9Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorc3RhdGljIHZvaWQKK3hfbGlzdF90YWJsZShpbnQgZXh0ZW5kKQoreworCWNvbnN0IHN0cnVjdCBwdGUgKnBlOworCWNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnA7CisJaW50IGk7CisKKwlwcmludGYoIlxuRGlzayAlczogJXUgaGVhZHMsICV1IHNlY3RvcnMsICV1IGN5bGluZGVyc1xuXG4iLAorCQlkaXNrX2RldmljZSwgZ19oZWFkcywgZ19zZWN0b3JzLCBnX2N5bGluZGVycyk7CisJcHJpbnRmKCJOciBBRiAgSGQgU2VjICBDeWwgIEhkIFNlYyAgQ3lsICAgICAgU3RhcnQgICAgICAgU2l6ZSBJRFxuIik7CisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCXBlID0gJnB0ZXNbaV07CisJCXAgPSAoZXh0ZW5kID8gcGUtPmV4dF9wb2ludGVyIDogcGUtPnBhcnRfdGFibGUpOworCQlpZiAocCAhPSBOVUxMKSB7CisJCQlwcmludGYoIiUydSAlMDJ4JTR1JTR1JTV1JTR1JTR1JTV1JTExIlNFQ1RfRk1UInUlMTEiU0VDVF9GTVQidSAlMDJ4XG4iLAorCQkJCWkgKyAxLCBwLT5ib290X2luZCwgcC0+aGVhZCwKKwkJCQlzZWN0b3IocC0+c2VjdG9yKSwKKwkJCQljeWxpbmRlcihwLT5zZWN0b3IsIHAtPmN5bCksIHAtPmVuZF9oZWFkLAorCQkJCXNlY3RvcihwLT5lbmRfc2VjdG9yKSwKKwkJCQljeWxpbmRlcihwLT5lbmRfc2VjdG9yLCBwLT5lbmRfY3lsKSwKKwkJCQlnZXRfc3RhcnRfc2VjdChwKSwgZ2V0X25yX3NlY3RzKHApLAorCQkJCXAtPnN5c19pbmQpOworCQkJaWYgKHAtPnN5c19pbmQpCisJCQkJY2hlY2tfY29uc2lzdGVuY3kocCwgaSk7CisJCX0KKwl9Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCitzdGF0aWMgdm9pZAorZmlsbF9ib3VuZHMoc2VjdG9yX3QgKmZpcnN0LCBzZWN0b3JfdCAqbGFzdCkKK3sKKwl1bnNpZ25lZCBpOworCWNvbnN0IHN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbMF07CisJY29uc3Qgc3RydWN0IHBhcnRpdGlvbiAqcDsKKworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IHBlKyssaSsrKSB7CisJCXAgPSBwZS0+cGFydF90YWJsZTsKKwkJaWYgKCFwLT5zeXNfaW5kIHx8IElTX0VYVEVOREVEKHAtPnN5c19pbmQpKSB7CisJCQlmaXJzdFtpXSA9IDB4ZmZmZmZmZmY7CisJCQlsYXN0W2ldID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0W2ldID0gZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChwZSk7CisJCQlsYXN0W2ldID0gZmlyc3RbaV0gKyBnZXRfbnJfc2VjdHMocCkgLSAxOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2soaW50IG4sIHVuc2lnbmVkIGgsIHVuc2lnbmVkIHMsIHVuc2lnbmVkIGMsIHNlY3Rvcl90IHN0YXJ0KQoreworCXNlY3Rvcl90IHRvdGFsLCByZWFsX3MsIHJlYWxfYzsKKworCXJlYWxfcyA9IHNlY3RvcihzKSAtIDE7CisJcmVhbF9jID0gY3lsaW5kZXIocywgYyk7CisJdG90YWwgPSAocmVhbF9jICogZ19zZWN0b3JzICsgcmVhbF9zKSAqIGdfaGVhZHMgKyBoOworCWlmICghdG90YWwpCisJCXByaW50ZigiUGFydGl0aW9uICV1IGNvbnRhaW5zIHNlY3RvciAwXG4iLCBuKTsKKwlpZiAoaCA+PSBnX2hlYWRzKQorCQlwcmludGYoIlBhcnRpdGlvbiAldTogaGVhZCAldSBncmVhdGVyIHRoYW4gbWF4aW11bSAldVxuIiwKKwkJCW4sIGggKyAxLCBnX2hlYWRzKTsKKwlpZiAocmVhbF9zID49IGdfc2VjdG9ycykKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXU6IHNlY3RvciAldSBncmVhdGVyIHRoYW4gIgorCQkJIm1heGltdW0gJXVcbiIsIG4sIHMsIGdfc2VjdG9ycyk7CisJaWYgKHJlYWxfYyA+PSBnX2N5bGluZGVycykKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXU6IGN5bGluZGVyICUiU0VDVF9GTVQidSBncmVhdGVyIHRoYW4gIgorCQkJIm1heGltdW0gJXVcbiIsIG4sIHJlYWxfYyArIDEsIGdfY3lsaW5kZXJzKTsKKwlpZiAoZ19jeWxpbmRlcnMgPD0gMTAyNCAmJiBzdGFydCAhPSB0b3RhbCkKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXU6IHByZXZpb3VzIHNlY3RvcnMgJSJTRUNUX0ZNVCJ1IGRpc2FncmVlcyB3aXRoICIKKwkJCSJ0b3RhbCAlIlNFQ1RfRk1UInVcbiIsIG4sIHN0YXJ0LCB0b3RhbCk7Cit9CisKK3N0YXRpYyB2b2lkCit2ZXJpZnkodm9pZCkKK3sKKwlpbnQgaSwgajsKKwlzZWN0b3JfdCB0b3RhbCA9IDE7CisJc2VjdG9yX3QgZmlyc3RbZ19wYXJ0aXRpb25zXSwgbGFzdFtnX3BhcnRpdGlvbnNdOworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisKKwlpZiAod2Fybl9nZW9tZXRyeSgpKQorCQlyZXR1cm47CisKKwlpZiAoTEFCRUxfSVNfU1VOKSB7CisJCXZlcmlmeV9zdW4oKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoTEFCRUxfSVNfU0dJKSB7CisJCXZlcmlmeV9zZ2koMSk7CisJCXJldHVybjsKKwl9CisKKwlmaWxsX2JvdW5kcyhmaXJzdCwgbGFzdCk7CisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisKKwkJcCA9IHBlLT5wYXJ0X3RhYmxlOworCQlpZiAocC0+c3lzX2luZCAmJiAhSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKwkJCWNoZWNrX2NvbnNpc3RlbmN5KHAsIGkpOworCQkJaWYgKGdldF9wYXJ0aXRpb25fc3RhcnRfZnJvbV9kZXZfc3RhcnQocGUpIDwgZmlyc3RbaV0pCisJCQkJcHJpbnRmKCJXYXJuaW5nOiBiYWQgc3RhcnQtb2YtZGF0YSBpbiAiCisJCQkJCSJwYXJ0aXRpb24gJXVcbiIsIGkgKyAxKTsKKwkJCWNoZWNrKGkgKyAxLCBwLT5lbmRfaGVhZCwgcC0+ZW5kX3NlY3RvciwgcC0+ZW5kX2N5bCwKKwkJCQlsYXN0W2ldKTsKKwkJCXRvdGFsICs9IGxhc3RbaV0gKyAxIC0gZmlyc3RbaV07CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJaWYgKChmaXJzdFtpXSA+PSBmaXJzdFtqXSAmJiBmaXJzdFtpXSA8PSBsYXN0W2pdKQorCQkJCSB8fCAoKGxhc3RbaV0gPD0gbGFzdFtqXSAmJiBsYXN0W2ldID49IGZpcnN0W2pdKSkpIHsKKwkJCQkJcHJpbnRmKCJXYXJuaW5nOiBwYXJ0aXRpb24gJXUgb3ZlcmxhcHMgIgorCQkJCQkJInBhcnRpdGlvbiAldVxuIiwgaiArIDEsIGkgKyAxKTsKKwkJCQkJdG90YWwgKz0gZmlyc3RbaV0gPj0gZmlyc3Rbal0gPworCQkJCQkJZmlyc3RbaV0gOiBmaXJzdFtqXTsKKwkJCQkJdG90YWwgLT0gbGFzdFtpXSA8PSBsYXN0W2pdID8KKwkJCQkJCWxhc3RbaV0gOiBsYXN0W2pdOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIChleHRlbmRlZF9vZmZzZXQpIHsKKwkJc3RydWN0IHB0ZSAqcGV4ID0gJnB0ZXNbZXh0X2luZGV4XTsKKwkJc2VjdG9yX3QgZV9sYXN0ID0gZ2V0X3N0YXJ0X3NlY3QocGV4LT5wYXJ0X3RhYmxlKSArCisJCQlnZXRfbnJfc2VjdHMocGV4LT5wYXJ0X3RhYmxlKSAtIDE7CisKKwkJZm9yIChpID0gNDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCQl0b3RhbCsrOworCQkJcCA9IHB0ZXNbaV0ucGFydF90YWJsZTsKKwkJCWlmICghcC0+c3lzX2luZCkgeworCQkJCWlmIChpICE9IDQgfHwgaSArIDEgPCBnX3BhcnRpdGlvbnMpCisJCQkJCXByaW50ZigiV2FybmluZzogcGFydGl0aW9uICV1ICIKKwkJCQkJCSJpcyBlbXB0eVxuIiwgaSArIDEpOworCQkJfSBlbHNlIGlmIChmaXJzdFtpXSA8IGV4dGVuZGVkX29mZnNldCB8fCBsYXN0W2ldID4gZV9sYXN0KSB7CisJCQkJcHJpbnRmKCJMb2dpY2FsIHBhcnRpdGlvbiAldSBub3QgZW50aXJlbHkgaW4gIgorCQkJCQkicGFydGl0aW9uICV1XG4iLCBpICsgMSwgZXh0X2luZGV4ICsgMSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodG90YWwgPiBnX2hlYWRzICogZ19zZWN0b3JzICogZ19jeWxpbmRlcnMpCisJCXByaW50ZigiVG90YWwgYWxsb2NhdGVkIHNlY3RvcnMgJXUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtICIKKwkJCSIldVxuIiwgdG90YWwsIGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBnX2N5bGluZGVycyk7CisJZWxzZSB7CisJCXRvdGFsID0gZ19oZWFkcyAqIGdfc2VjdG9ycyAqIGdfY3lsaW5kZXJzIC0gdG90YWw7CisJCWlmICh0b3RhbCAhPSAwKQorCQkJcHJpbnRmKCIlIlNFQ1RfRk1UInUgdW5hbGxvY2F0ZWQgc2VjdG9yc1xuIiwgdG90YWwpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FkZF9wYXJ0aXRpb24oaW50IG4sIGludCBzeXMpCit7CisJY2hhciBtZXNnWzI1Nl07ICAgICAgICAgLyogNDggZG9lcyBub3Qgc3VmZmljZSBpbiBKYXBhbmVzZSAqLworCWludCBpLCBudW1fcmVhZCA9IDA7CisJc3RydWN0IHBhcnRpdGlvbiAqcCA9IHB0ZXNbbl0ucGFydF90YWJsZTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpxID0gcHRlc1tleHRfaW5kZXhdLnBhcnRfdGFibGU7CisJc2VjdG9yX3QgbGltaXQsIHRlbXA7CisJc2VjdG9yX3Qgc3RhcnQsIHN0b3AgPSAwOworCXNlY3Rvcl90IGZpcnN0W2dfcGFydGl0aW9uc10sIGxhc3RbZ19wYXJ0aXRpb25zXTsKKworCWlmIChwICYmIHAtPnN5c19pbmQpIHsKKwkJcHJpbnRmKG1zZ19wYXJ0X2FscmVhZHlfZGVmaW5lZCwgbiArIDEpOworCQlyZXR1cm47CisJfQorCWZpbGxfYm91bmRzKGZpcnN0LCBsYXN0KTsKKwlpZiAobiA8IDQpIHsKKwkJc3RhcnQgPSBzZWN0b3Jfb2Zmc2V0OworCQlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMgfHwgIXRvdGFsX251bWJlcl9vZl9zZWN0b3JzKQorCQkJbGltaXQgPSAoc2VjdG9yX3QpIGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBnX2N5bGluZGVycyAtIDE7CisJCWVsc2UKKwkJCWxpbWl0ID0gdG90YWxfbnVtYmVyX29mX3NlY3RvcnMgLSAxOworCQlpZiAoZXh0ZW5kZWRfb2Zmc2V0KSB7CisJCQlmaXJzdFtleHRfaW5kZXhdID0gZXh0ZW5kZWRfb2Zmc2V0OworCQkJbGFzdFtleHRfaW5kZXhdID0gZ2V0X3N0YXJ0X3NlY3QocSkgKworCQkJCWdldF9ucl9zZWN0cyhxKSAtIDE7CisJCX0KKwl9IGVsc2UgeworCQlzdGFydCA9IGV4dGVuZGVkX29mZnNldCArIHNlY3Rvcl9vZmZzZXQ7CisJCWxpbWl0ID0gZ2V0X3N0YXJ0X3NlY3QocSkgKyBnZXRfbnJfc2VjdHMocSkgLSAxOworCX0KKwlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMpCisJCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykKKwkJCWZpcnN0W2ldID0gKGNyb3VuZChmaXJzdFtpXSkgLSAxKSAqIHVuaXRzX3Blcl9zZWN0b3I7CisKKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJGaXJzdCAlcyIsIHN0cl91bml0cyhTSU5HVUxBUikpOworCWRvIHsKKwkJdGVtcCA9IHN0YXJ0OworCQlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJCWludCBsYXN0cGx1c29mZjsKKworCQkJaWYgKHN0YXJ0ID09IHB0ZXNbaV0ub2Zmc2V0X2Zyb21fZGV2X3N0YXJ0KQorCQkJCXN0YXJ0ICs9IHNlY3Rvcl9vZmZzZXQ7CisJCQlsYXN0cGx1c29mZiA9IGxhc3RbaV0gKyAoKG4gPCA0KSA/IDAgOiBzZWN0b3Jfb2Zmc2V0KTsKKwkJCWlmIChzdGFydCA+PSBmaXJzdFtpXSAmJiBzdGFydCA8PSBsYXN0cGx1c29mZikKKwkJCQlzdGFydCA9IGxhc3RwbHVzb2ZmICsgMTsKKwkJfQorCQlpZiAoc3RhcnQgPiBsaW1pdCkKKwkJCWJyZWFrOworCQlpZiAoc3RhcnQgPj0gdGVtcCt1bml0c19wZXJfc2VjdG9yICYmIG51bV9yZWFkKSB7CisJCQlwcmludGYoIlNlY3RvciAlIlNFQ1RfRk1UInUgaXMgYWxyZWFkeSBhbGxvY2F0ZWRcbiIsIHRlbXApOworCQkJdGVtcCA9IHN0YXJ0OworCQkJbnVtX3JlYWQgPSAwOworCQl9CisJCWlmICghbnVtX3JlYWQgJiYgc3RhcnQgPT0gdGVtcCkgeworCQkJc2VjdG9yX3Qgc2F2ZWRfc3RhcnQ7CisKKwkJCXNhdmVkX3N0YXJ0ID0gc3RhcnQ7CisJCQlzdGFydCA9IHJlYWRfaW50KGNyb3VuZChzYXZlZF9zdGFydCksIGNyb3VuZChzYXZlZF9zdGFydCksIGNyb3VuZChsaW1pdCksIDAsIG1lc2cpOworCQkJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKSB7CisJCQkJc3RhcnQgPSAoc3RhcnQgLSAxKSAqIHVuaXRzX3Blcl9zZWN0b3I7CisJCQkJaWYgKHN0YXJ0IDwgc2F2ZWRfc3RhcnQpCisJCQkJCXN0YXJ0ID0gc2F2ZWRfc3RhcnQ7CisJCQl9CisJCQludW1fcmVhZCA9IDE7CisJCX0KKwl9IHdoaWxlIChzdGFydCAhPSB0ZW1wIHx8ICFudW1fcmVhZCk7CisJaWYgKG4gPiA0KSB7ICAgICAgICAgICAgICAgICAgICAvKiBOT1QgZm9yIGZpZnRoIHBhcnRpdGlvbiAqLworCQlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW25dOworCisJCXBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgPSBzdGFydCAtIHNlY3Rvcl9vZmZzZXQ7CisJCWlmIChwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ID09IGV4dGVuZGVkX29mZnNldCkgeyAvKiBtdXN0IGJlIGNvcnJlY3RlZCAqLworCQkJcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCsrOworCQkJaWYgKHNlY3Rvcl9vZmZzZXQgPT0gMSkKKwkJCQlzdGFydCsrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisKKwkJaWYgKHN0YXJ0IDwgcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCAmJiBsaW1pdCA+PSBwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0KQorCQkJbGltaXQgPSBwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0IC0gMTsKKwkJaWYgKHN0YXJ0IDwgZmlyc3RbaV0gJiYgbGltaXQgPj0gZmlyc3RbaV0pCisJCQlsaW1pdCA9IGZpcnN0W2ldIC0gMTsKKwl9CisJaWYgKHN0YXJ0ID4gbGltaXQpIHsKKwkJcHJpbnRmKCJObyBmcmVlIHNlY3RvcnMgYXZhaWxhYmxlXG4iKTsKKwkJaWYgKG4gPiA0KQorCQkJZ19wYXJ0aXRpb25zLS07CisJCXJldHVybjsKKwl9CisJaWYgKGNyb3VuZChzdGFydCkgPT0gY3JvdW5kKGxpbWl0KSkgeworCQlzdG9wID0gbGltaXQ7CisJfSBlbHNlIHsKKwkJc25wcmludGYobWVzZywgc2l6ZW9mKG1lc2cpLAorCQkJICJMYXN0ICVzIG9yICtzaXplIG9yICtzaXplTSBvciArc2l6ZUsiLAorCQkJIHN0cl91bml0cyhTSU5HVUxBUikpOworCQlzdG9wID0gcmVhZF9pbnQoY3JvdW5kKHN0YXJ0KSwgY3JvdW5kKGxpbWl0KSwgY3JvdW5kKGxpbWl0KSwgY3JvdW5kKHN0YXJ0KSwgbWVzZyk7CisJCWlmIChkaXNwbGF5X2luX2N5bF91bml0cykgeworCQkJc3RvcCA9IHN0b3AgKiB1bml0c19wZXJfc2VjdG9yIC0gMTsKKwkJCWlmIChzdG9wID5saW1pdCkKKwkJCQlzdG9wID0gbGltaXQ7CisJCX0KKwl9CisKKwlzZXRfcGFydGl0aW9uKG4sIDAsIHN0YXJ0LCBzdG9wLCBzeXMpOworCWlmIChuID4gNCkKKwkJc2V0X3BhcnRpdGlvbihuIC0gMSwgMSwgcHRlc1tuXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQsIHN0b3AsIEVYVEVOREVEKTsKKworCWlmIChJU19FWFRFTkRFRChzeXMpKSB7CisJCXN0cnVjdCBwdGUgKnBlNCA9ICZwdGVzWzRdOworCQlzdHJ1Y3QgcHRlICpwZW4gPSAmcHRlc1tuXTsKKworCQlleHRfaW5kZXggPSBuOworCQlwZW4tPmV4dF9wb2ludGVyID0gcDsKKwkJcGU0LT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgPSBleHRlbmRlZF9vZmZzZXQgPSBzdGFydDsKKwkJcGU0LT5zZWN0b3JidWZmZXIgPSB4emFsbG9jKHNlY3Rvcl9zaXplKTsKKwkJcGU0LT5wYXJ0X3RhYmxlID0gcHRfb2Zmc2V0KHBlNC0+c2VjdG9yYnVmZmVyLCAwKTsKKwkJcGU0LT5leHRfcG9pbnRlciA9IHBlNC0+cGFydF90YWJsZSArIDE7CisJCXBlNC0+Y2hhbmdlZCA9IDE7CisJCWdfcGFydGl0aW9ucyA9IDU7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2xvZ2ljYWwodm9pZCkKK3sKKwlpZiAoZ19wYXJ0aXRpb25zID4gNSB8fCBwdGVzWzRdLnBhcnRfdGFibGUtPnN5c19pbmQpIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tnX3BhcnRpdGlvbnNdOworCisJCXBlLT5zZWN0b3JidWZmZXIgPSB4emFsbG9jKHNlY3Rvcl9zaXplKTsKKwkJcGUtPnBhcnRfdGFibGUgPSBwdF9vZmZzZXQocGUtPnNlY3RvcmJ1ZmZlciwgMCk7CisJCXBlLT5leHRfcG9pbnRlciA9IHBlLT5wYXJ0X3RhYmxlICsgMTsKKwkJcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IDA7CisJCXBlLT5jaGFuZ2VkID0gMTsKKwkJZ19wYXJ0aXRpb25zKys7CisJfQorCWFkZF9wYXJ0aXRpb24oZ19wYXJ0aXRpb25zIC0gMSwgTElOVVhfTkFUSVZFKTsKK30KKworc3RhdGljIHZvaWQKK25ld19wYXJ0aXRpb24odm9pZCkKK3sKKwlpbnQgaSwgZnJlZV9wcmltYXJ5ID0gMDsKKworCWlmICh3YXJuX2dlb21ldHJ5KCkpCisJCXJldHVybjsKKworCWlmIChMQUJFTF9JU19TVU4pIHsKKwkJYWRkX3N1bl9wYXJ0aXRpb24oZ2V0X3BhcnRpdGlvbigwLCBnX3BhcnRpdGlvbnMpLCBMSU5VWF9OQVRJVkUpOworCQlyZXR1cm47CisJfQorCWlmIChMQUJFTF9JU19TR0kpIHsKKwkJc2dpX2FkZF9wYXJ0aXRpb24oZ2V0X3BhcnRpdGlvbigwLCBnX3BhcnRpdGlvbnMpLCBMSU5VWF9OQVRJVkUpOworCQlyZXR1cm47CisJfQorCWlmIChMQUJFTF9JU19BSVgpIHsKKwkJcHJpbnRmKCJTb3JyeSAtIHRoaXMgZmRpc2sgY2Fubm90IGhhbmRsZSBBSVggZGlzayBsYWJlbHMuXG4iCisiSWYgeW91IHdhbnQgdG8gYWRkIERPUy10eXBlIHBhcnRpdGlvbnMsIGNyZWF0ZSBhIG5ldyBlbXB0eSBET1MgcGFydGl0aW9uXG4iCisidGFibGUgZmlyc3QgKHVzZSAnbycpLiBUaGlzIHdpbGwgZGVzdHJveSB0aGUgcHJlc2VudCBkaXNrIGNvbnRlbnRzLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlmcmVlX3ByaW1hcnkgKz0gIXB0ZXNbaV0ucGFydF90YWJsZS0+c3lzX2luZDsKKworCWlmICghZnJlZV9wcmltYXJ5ICYmIGdfcGFydGl0aW9ucyA+PSBNQVhJTVVNX1BBUlRTKSB7CisJCXByaW50ZigiVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRpdGlvbnMgaGFzIGJlZW4gY3JlYXRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWZyZWVfcHJpbWFyeSkgeworCQlpZiAoZXh0ZW5kZWRfb2Zmc2V0KQorCQkJYWRkX2xvZ2ljYWwoKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJZb3UgbXVzdCBkZWxldGUgc29tZSBwYXJ0aXRpb24gYW5kIGFkZCAiCisJCQkJICJhbiBleHRlbmRlZCBwYXJ0aXRpb24gZmlyc3RcbiIpOworCX0gZWxzZSB7CisJCWNoYXIgYywgbGluZVs4MF07CisJCXNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwKKwkJCSJDb21tYW5kIGFjdGlvblxuIgorCQkJIiAgICVzXG4iCisJCQkiICAgcCAgIHByaW1hcnkgcGFydGl0aW9uICgxLTQpXG4iLAorCQkJKGV4dGVuZGVkX29mZnNldCA/CisJCQkibCAgIGxvZ2ljYWwgKDUgb3Igb3ZlcikiIDogImUgICBleHRlbmRlZCIpKTsKKwkJd2hpbGUgKDEpIHsKKwkJCWMgPSByZWFkX25vbmVtcHR5KGxpbmUpOworCQkJaWYgKChjIHwgMHgyMCkgPT0gJ3AnKSB7CisJCQkJaSA9IGdldF9ub25leGlzdGluZ19wYXJ0aXRpb24oMCwgNCk7CisJCQkJaWYgKGkgPj0gMCkKKwkJCQkJYWRkX3BhcnRpdGlvbihpLCBMSU5VWF9OQVRJVkUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjID09ICdsJyAmJiBleHRlbmRlZF9vZmZzZXQpIHsKKwkJCQlhZGRfbG9naWNhbCgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjID09ICdlJyAmJiAhZXh0ZW5kZWRfb2Zmc2V0KSB7CisJCQkJaSA9IGdldF9ub25leGlzdGluZ19wYXJ0aXRpb24oMCwgNCk7CisJCQkJaWYgKGkgPj0gMCkKKwkJCQkJYWRkX3BhcnRpdGlvbihpLCBFWFRFTkRFRCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcHJpbnRmKCJJbnZhbGlkIHBhcnRpdGlvbiBudW1iZXIgIgorCQkJCQkgImZvciB0eXBlICclYydcbiIsIGMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorcmVyZWFkX3BhcnRpdGlvbl90YWJsZShpbnQgbGVhdmUpCit7CisJaW50IGk7CisKKwlwcmludGYoIkNhbGxpbmcgaW9jdGwoKSB0byByZS1yZWFkIHBhcnRpdGlvbiB0YWJsZVxuIik7CisJc3luYygpOworCS8qIFVzZXJzIHdpdGggc2xvdyBleHRlcm5hbCBVU0IgZGlza3Mgb24gYSAzMjBNSHogQVJNIHN5c3RlbSAoeWVhciAyMDExKQorCSAqIHJlcG9ydCB0aGF0IHNsZWVwIGlzIG5lZWRlZCwgb3RoZXJ3aXNlIEJMS1JSUEFSVCBtYXkgZmFpbCB3aXRoIC1FSU86CisJICovCisJc2xlZXAoMSk7CisJaSA9IGlvY3RsX29yX3BlcnJvcihkZXZfZmQsIEJMS1JSUEFSVCwgTlVMTCwKKwkJCSJXQVJOSU5HOiByZXJlYWRpbmcgcGFydGl0aW9uIHRhYmxlICIKKwkJCSJmYWlsZWQsIGtlcm5lbCBzdGlsbCB1c2VzIG9sZCB0YWJsZSIpOworI2lmIDAKKwlpZiAoZG9zX2NoYW5nZWQpCisJCXByaW50ZigKKwkJIlxuV0FSTklORzogSWYgeW91IGhhdmUgY3JlYXRlZCBvciBtb2RpZmllZCBhbnkgRE9TIDYueFxuIgorCQkicGFydGl0aW9ucywgcGxlYXNlIHNlZSB0aGUgZmRpc2sgbWFudWFsIHBhZ2UgZm9yIGFkZGl0aW9uYWxcbiIKKwkJImluZm9ybWF0aW9uXG4iKTsKKyNlbmRpZgorCisJaWYgKGxlYXZlKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNsb3NlX2Rldl9mZCgpOworCQlleGl0KGkgIT0gMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAord3JpdGVfdGFibGUodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChMQUJFTF9JU19ET1MpIHsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWlmIChwdGVzW2ldLmNoYW5nZWQpCisJCQkJcHRlc1szXS5jaGFuZ2VkID0gMTsKKwkJZm9yIChpID0gMzsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCQlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCQkJaWYgKHBlLT5jaGFuZ2VkKSB7CisJCQkJd3JpdGVfcGFydF90YWJsZV9mbGFnKHBlLT5zZWN0b3JidWZmZXIpOworCQkJCXdyaXRlX3NlY3RvcihwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0LCBwZS0+c2VjdG9yYnVmZmVyKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmIChMQUJFTF9JU19TR0kpIHsKKwkJLyogbm8gdGVzdCBvbiBjaGFuZ2U/IHRoZSBwcmludGYgYmVsb3cgbWlnaHQgYmUgbWlzdGFrZW4gKi8KKwkJc2dpX3dyaXRlX3RhYmxlKCk7CisJfQorCWVsc2UgaWYgKExBQkVMX0lTX1NVTikgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAocHRlc1tpXS5jaGFuZ2VkKSB7CisJCQkJc3VuX3dyaXRlX3RhYmxlKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlwcmludGYoIlRoZSBwYXJ0aXRpb24gdGFibGUgaGFzIGJlZW4gYWx0ZXJlZC5cbiIpOworCXJlcmVhZF9wYXJ0aXRpb25fdGFibGUoMSk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9GRElTS19XUklUQUJMRSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKKyNkZWZpbmUgTUFYX1BFUl9MSU5FICAgIDE2CitzdGF0aWMgdm9pZAorcHJpbnRfYnVmZmVyKGNoYXIgKnBidWZmZXIpCit7CisJaW50IGksbDsKKworCWZvciAoaSA9IDAsIGwgPSAwOyBpIDwgc2VjdG9yX3NpemU7IGkrKywgbCsrKSB7CisJCWlmIChsID09IDApCisJCQlwcmludGYoIjB4JTAzWDoiLCBpKTsKKwkJcHJpbnRmKCIgJTAyWCIsICh1bnNpZ25lZCBjaGFyKSBwYnVmZmVyW2ldKTsKKwkJaWYgKGwgPT0gTUFYX1BFUl9MSU5FIC0gMSkgeworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCWwgPSAtMTsKKwkJfQorCX0KKwlpZiAobCA+IDApCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJYmJfcHV0Y2hhcignXG4nKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3Jhdyh2b2lkKQoreworCWludCBpOworCisJcHJpbnRmKCJEZXZpY2U6ICVzXG4iLCBkaXNrX2RldmljZSk7CisJaWYgKExBQkVMX0lTX1NHSSB8fCBMQUJFTF9JU19TVU4pCisJCXByaW50X2J1ZmZlcihNQlJidWZmZXIpOworCWVsc2UgeworCQlmb3IgKGkgPSAzOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspCisJCQlwcmludF9idWZmZXIocHRlc1tpXS5zZWN0b3JidWZmZXIpOworCX0KK30KKworc3RhdGljIHZvaWQKK21vdmVfYmVnaW4odW5zaWduZWQgaSkKK3sKKwlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCXN0cnVjdCBwYXJ0aXRpb24gKnAgPSBwZS0+cGFydF90YWJsZTsKKwlzZWN0b3JfdCBuZXcsIGZpcnN0LCBucl9zZWN0czsKKworCWlmICh3YXJuX2dlb21ldHJ5KCkpCisJCXJldHVybjsKKwlucl9zZWN0cyA9IGdldF9ucl9zZWN0cyhwKTsKKwlpZiAoIXAtPnN5c19pbmQgfHwgIW5yX3NlY3RzIHx8IElTX0VYVEVOREVEKHAtPnN5c19pbmQpKSB7CisJCXByaW50ZigiUGFydGl0aW9uICV1IGhhcyBubyBkYXRhIGFyZWFcbiIsIGkgKyAxKTsKKwkJcmV0dXJuOworCX0KKwlmaXJzdCA9IGdldF9wYXJ0aXRpb25fc3RhcnRfZnJvbV9kZXZfc3RhcnQocGUpOyAvKiA9PSBwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ICsgZ2V0X3N0YXJ0X3NlY3QocCkgKi8KKwluZXcgPSByZWFkX2ludCgwIC8qd2FzOmZpcnN0Ki8sIGZpcnN0LCBmaXJzdCArIG5yX3NlY3RzIC0gMSwgZmlyc3QsICJOZXcgYmVnaW5uaW5nIG9mIGRhdGEiKTsKKwlpZiAobmV3ICE9IGZpcnN0KSB7CisJCXNlY3Rvcl90IG5ld19yZWxhdGl2ZSA9IG5ldyAtIHBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQ7CisJCW5yX3NlY3RzICs9IChnZXRfc3RhcnRfc2VjdChwKSAtIG5ld19yZWxhdGl2ZSk7CisJCXNldF9zdGFydF9zZWN0KHAsIG5ld19yZWxhdGl2ZSk7CisJCXNldF9ucl9zZWN0cyhwLCBucl9zZWN0cyk7CisJCXJlYWRfbm9uZW1wdHkoIlJlY2FsY3VsYXRlIEMvSC9TIHZhbHVlcz8gKFkvTik6ICIpOworCQlpZiAoKGxpbmVfcHRyWzBdIHwgMHgyMCkgPT0gJ3knKQorCQkJc2V0X2hzY19zdGFydF9lbmQocCwgbmV3LCBuZXcgKyBucl9zZWN0cyAtIDEpOworCQlwZS0+Y2hhbmdlZCA9IDE7CisJfQorfQorCitzdGF0aWMgdm9pZAoreHNlbGVjdCh2b2lkKQoreworCWNoYXIgYzsKKworCXdoaWxlICgxKSB7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCWMgPSAweDIwIHwgcmVhZF9ub25lbXB0eSgiRXhwZXJ0IGNvbW1hbmQgKG0gZm9yIGhlbHApOiAiKTsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2EnOgorCQkJaWYgKExBQkVMX0lTX1NVTikKKwkJCQlzdW5fc2V0X2FsdF9jeWwoKTsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWlmIChMQUJFTF9JU19ET1MpCisJCQkJbW92ZV9iZWdpbihnZXRfcGFydGl0aW9uKDAsIGdfcGFydGl0aW9ucykpOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJdXNlcl9jeWxpbmRlcnMgPSBnX2N5bGluZGVycyA9CisJCQkJcmVhZF9pbnQoMSwgZ19jeWxpbmRlcnMsIDEwNDg1NzYsIDAsCisJCQkJCSJOdW1iZXIgb2YgY3lsaW5kZXJzIik7CisJCQlpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXN1bl9zZXRfbmN5bChnX2N5bGluZGVycyk7CisJCQlpZiAoTEFCRUxfSVNfRE9TKQorCQkJCXdhcm5fY3lsaW5kZXJzKCk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlwcmludF9yYXcoKTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCWlmIChMQUJFTF9JU19TR0kpCisJCQkJc2dpX3NldF94Y3lsKCk7CisJCQllbHNlIGlmIChMQUJFTF9JU19TVU4pCisJCQkJc3VuX3NldF94Y3lsKCk7CisJCQllbHNlIGlmIChMQUJFTF9JU19ET1MpCisJCQkJeF9saXN0X3RhYmxlKDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJaWYgKExBQkVMX0lTX0RPUykKKwkJCQlmaXhfcGFydGl0aW9uX3RhYmxlX29yZGVyKCk7CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0dJX0xBQkVMCisJCQljcmVhdGVfc2dpbGFiZWwoKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJdXNlcl9oZWFkcyA9IGdfaGVhZHMgPSByZWFkX2ludCgxLCBnX2hlYWRzLCAyNTYsIDAsICJOdW1iZXIgb2YgaGVhZHMiKTsKKwkJCXVwZGF0ZV91bml0cygpOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJaWYgKExBQkVMX0lTX1NVTikKKwkJCQlzdW5fc2V0X2lsZmFjdCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJaWYgKExBQkVMX0lTX1NVTikKKwkJCQlzdW5fc2V0X3JzcGVlZCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJaWYgKExBQkVMX0lTX1NVTikKKwkJCQlsaXN0X3RhYmxlKDEpOworCQkJZWxzZQorCQkJCXhfbGlzdF90YWJsZSgwKTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQljbG9zZV9kZXZfZmQoKTsKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCWNhc2UgJ3InOgorCQkJcmV0dXJuOworCQljYXNlICdzJzoKKwkJCXVzZXJfc2VjdG9ycyA9IGdfc2VjdG9ycyA9IHJlYWRfaW50KDEsIGdfc2VjdG9ycywgNjMsIDAsICJOdW1iZXIgb2Ygc2VjdG9ycyIpOworCQkJaWYgKGRvc19jb21wYXRpYmxlX2ZsYWcpIHsKKwkJCQlzZWN0b3Jfb2Zmc2V0ID0gZ19zZWN0b3JzOworCQkJCXByaW50ZigiV2FybmluZzogc2V0dGluZyBzZWN0b3Igb2Zmc2V0IGZvciBET1MgIgorCQkJCQkiY29tcGF0aWJsaXR5XG4iKTsKKwkJCX0KKwkJCXVwZGF0ZV91bml0cygpOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyaWZ5KCk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl3cml0ZV90YWJsZSgpOyAgLyogZG9lcyBub3QgcmV0dXJuICovCisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXN1bl9zZXRfcGN5bGNvdW50KCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXhtZW51KCk7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogQURWQU5DRUQgbW9kZSAqLworCitzdGF0aWMgaW50Citpc19pZGVfY2Ryb21fb3JfdGFwZShjb25zdCBjaGFyICpkZXZpY2UpCit7CisJRklMRSAqcHJvY2Y7CisJY2hhciBidWZbMTAwXTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCBpc19pZGUgPSAwOworCisJLyogTm8gZGV2aWNlIHdhcyBnaXZlbiBleHBsaWNpdGx5LCBhbmQgd2UgYXJlIHRyeWluZyBzb21lCisJICAgbGlrZWx5IHRoaW5ncy4gIEJ1dCBvcGVuaW5nIC9kZXYvaGRjIG1heSBwcm9kdWNlIGVycm9ycyBsaWtlCisJICAgImhkYzogdHJheSBvcGVuIG9yIGRyaXZlIG5vdCByZWFkeSIKKwkgICBpZiBpdCBoYXBwZW5zIHRvIGJlIGEgQ0QtUk9NIGRyaXZlLiBJdCBldmVuIGhhcHBlbnMgdGhhdAorCSAgIHRoZSBwcm9jZXNzIGhhbmdzIG9uIHRoZSBhdHRlbXB0IHRvIHJlYWQgYSBtdXNpYyBDRC4KKwkgICBTbyB0cnkgdG8gYmUgY2FyZWZ1bC4gVGhpcyBvbmx5IHdvcmtzIHNpbmNlIDIuMS43My4gKi8KKworCWlmIChzdHJuY21wKCIvZGV2L2hkIiwgZGV2aWNlLCA3KSkKKwkJcmV0dXJuIDA7CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiL3Byb2MvaWRlLyVzL21lZGlhIiwgZGV2aWNlKzUpOworCXByb2NmID0gZm9wZW5fZm9yX3JlYWQoYnVmKTsKKwlpZiAocHJvY2YgIT0gTlVMTCAmJiBmZ2V0cyhidWYsIHNpemVvZihidWYpLCBwcm9jZikpCisJCWlzX2lkZSA9ICghc3RybmNtcChidWYsICJjZHJvbSIsIDUpIHx8CisJCQkgICFzdHJuY21wKGJ1ZiwgInRhcGUiLCA0KSk7CisJZWxzZQorCQkvKiBOb3cgd2hlbiB0aGlzIHByb2MgZmlsZSBkb2VzIG5vdCBleGlzdCwgc2tpcCB0aGUKKwkJICAgZGV2aWNlIHdoZW4gaXQgaXMgcmVhZC1vbmx5LiAqLworCQlpZiAoc3RhdChkZXZpY2UsICZzdGF0YnVmKSA9PSAwKQorCQkJaXNfaWRlID0gKChzdGF0YnVmLnN0X21vZGUgJiAwMjIyKSA9PSAwKTsKKworCWlmIChwcm9jZikKKwkJZmNsb3NlKHByb2NmKTsKKwlyZXR1cm4gaXNfaWRlOworfQorCisKK3N0YXRpYyB2b2lkCitvcGVuX2xpc3RfYW5kX2Nsb3NlKGNvbnN0IGNoYXIgKmRldmljZSwgaW50IHVzZXJfc3BlY2lmaWVkKQoreworCWludCBnYjsKKworCWRpc2tfZGV2aWNlID0gZGV2aWNlOworCWlmIChzZXRqbXAobGlzdGluZ2J1ZikpCisJCXJldHVybjsKKwlpZiAoIXVzZXJfc3BlY2lmaWVkKQorCQlpZiAoaXNfaWRlX2Nkcm9tX29yX3RhcGUoZGV2aWNlKSkKKwkJCXJldHVybjsKKworCS8qIE9wZW4gZGlza19kZXZpY2UsIHNhdmUgZmlsZSBkZXNjcmlwdG9yIHRvIGRldl9mZCAqLworCWVycm5vID0gMDsKKwlnYiA9IGdldF9ib290KFRSWV9PTkxZKTsKKwlpZiAoZ2IgPiAwKSB7ICAgLyogSS9PIGVycm9yICovCisJCS8qIElnbm9yZSBvdGhlciBlcnJvcnMsIHNpbmNlIHdlIHRyeSBJREUKKwkJICAgYW5kIFNDU0kgaGFyZCBkaXNrcyB3aGljaCBtYXkgbm90IGJlCisJCSAgIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLiAqLworCQlpZiAodXNlcl9zcGVjaWZpZWQgfHwgZXJybm8gPT0gRUFDQ0VTKQorCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgb3BlbiAnJXMnIiwgZGV2aWNlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChnYiA8IDApIHsgLyogbm8gRE9TIHNpZ25hdHVyZSAqLworCQlsaXN0X2Rpc2tfZ2VvbWV0cnkoKTsKKwkJaWYgKExBQkVMX0lTX0FJWCkKKwkJCWdvdG8gcmV0OworI2lmIEVOQUJMRV9GRUFUVVJFX09TRl9MQUJFTAorCQlpZiAoYnNkX3RyeWRldihkZXZpY2UpIDwgMCkKKyNlbmRpZgorCQkJcHJpbnRmKCJEaXNrICVzIGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkICIKKwkJCQkicGFydGl0aW9uIHRhYmxlXG4iLCBkZXZpY2UpOworCX0gZWxzZSB7CisJCWxpc3RfdGFibGUoMCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwkJaWYgKCFMQUJFTF9JU19TVU4gJiYgZ19wYXJ0aXRpb25zID4gNCkgeworCQkJZGVsZXRlX3BhcnRpdGlvbihleHRfaW5kZXgpOworCQl9CisjZW5kaWYKKwl9CisgcmV0OgorCWNsb3NlX2Rldl9mZCgpOworfQorCisvKiBJcyBpdCBhIHdob2xlIGRpc2s/IFRoZSBkaWdpdCBjaGVjayBpcyBzdGlsbCB1c2VmdWwKKyAgIGZvciBYZW4gZGV2aWNlcyBmb3IgZXhhbXBsZS4gKi8KK3N0YXRpYyBpbnQgaXNfd2hvbGVfZGlzayhjb25zdCBjaGFyICpkaXNrKQoreworCXVuc2lnbmVkIGxlbjsKKwlpbnQgZmQgPSBvcGVuKGRpc2ssIE9fUkRPTkxZKTsKKworCWlmIChmZCAhPSAtMSkgeworCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbWV0cnk7CisJCWludCBlcnIgPSBpb2N0bChmZCwgSERJT19HRVRHRU8sICZnZW9tZXRyeSk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gKGdlb21ldHJ5LnN0YXJ0ID09IDApOworCX0KKworCS8qIFRyZWF0ICJuYW1lTiIgYXMgYSBwYXJ0aXRpb24gbmFtZSwgbm90IHdob2xlIGRpc2sgKi8KKwkvKiBub3RlOiBtbWNibGswIHNob3VsZCB3b3JrIGZyb20gdGhlIGdlb21ldHJ5IGNoZWNrIGFib3ZlICovCisJbGVuID0gc3RybGVuKGRpc2spOworCWlmIChsZW4gIT0gMCAmJiBpc2RpZ2l0KGRpc2tbbGVuIC0gMV0pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBmb3IgZmRpc2sgLWw6IHRyeSBhbGwgdGhpbmdzIGluIC9wcm9jL3BhcnRpdGlvbnMKKyAgIHRoYXQgbG9vayBsaWtlIGEgcGFydGl0aW9uIG5hbWUgKGRvIG5vdCBlbmQgaW4gYSBkaWdpdCkgKi8KK3N0YXRpYyB2b2lkCitsaXN0X2RldnNfaW5fcHJvY19wYXJ0aXRpdG9ucyh2b2lkKQoreworCUZJTEUgKnByb2NwdDsKKwljaGFyIGxpbmVbMTAwXSwgcHRuYW1lWzEwMF0sIGRldm5hbWVbMTIwXTsKKwlpbnQgbWEsIG1pLCBzejsKKworCXByb2NwdCA9IGZvcGVuX29yX3dhcm4oIi9wcm9jL3BhcnRpdGlvbnMiLCAiciIpOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgcHJvY3B0KSkgeworCQlpZiAoc3NjYW5mKGxpbmUsICIgJXUgJXUgJXUgJVteXG4gXSIsCisJCQkJJm1hLCAmbWksICZzeiwgcHRuYW1lKSAhPSA0KQorCQkJY29udGludWU7CisKKwkJc3ByaW50ZihkZXZuYW1lLCAiL2Rldi8lcyIsIHB0bmFtZSk7CisJCWlmIChpc193aG9sZV9kaXNrKGRldm5hbWUpKQorCQkJb3Blbl9saXN0X2FuZF9jbG9zZShkZXZuYW1lLCAwKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKKwlmY2xvc2UocHJvY3B0KTsKKyNlbmRpZgorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKK3N0YXRpYyB2b2lkCit1bmtub3duX2NvbW1hbmQoaW50IGMpCit7CisJcHJpbnRmKCIlYzogdW5rbm93biBjb21tYW5kXG4iLCBjKTsKK30KKyNlbmRpZgorCitpbnQgZmRpc2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZkaXNrX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisJLyoKKwkgKiAgZmRpc2sgLXYKKwkgKiAgZmRpc2sgLWwgWy1iIHNlY3RvcnNpemVdIFstdV0gZGV2aWNlIC4uLgorCSAqICBmZGlzayAtcyBbcGFydGl0aW9uXSAuLi4KKwkgKiAgZmRpc2sgWy1iIHNlY3RvcnNpemVdIFstdV0gZGV2aWNlCisJICoKKwkgKiBPcHRpb25zIC1DLCAtSCwgLVMgc2V0IHRoZSBnZW9tZXRyeS4KKwkgKi8KKwlJTklUX0coKTsKKworCWNsb3NlX2Rldl9mZCgpOyAvKiBuZWVkZWQ6IGZkIDMgbXVzdCBub3Qgc3RheSBjbG9zZWQgKi8KKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImIrOkMrOkgrOlMrIjsgLyogbnVtZXJpYyBwYXJhbXMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYjpDOkg6bFM6dSIgSUZfRkVBVFVSRV9GRElTS19CTEtTSVpFKCJzIiksCisJCQkJJnNlY3Rvcl9zaXplLCAmdXNlcl9jeWxpbmRlcnMsICZ1c2VyX2hlYWRzLCAmdXNlcl9zZWN0b3JzKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgT1BUX2IpIHsKKwkJLyogVWdseTogdGhpcyBzZWN0b3Igc2l6ZSBpcyByZWFsbHkgcGVyIGRldmljZSwKKwkJICogc28gY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggbXVsdGlwbGUgZGlza3MsCisJCSAqIGFuZCB0aGUgc2FtZSBnb2VzIGZvciB0aGUgQy9IL1Mgb3B0aW9ucy4KKwkJICovCisJCWlmIChzZWN0b3Jfc2l6ZSA8IDUxMgorCQkgfHwgc2VjdG9yX3NpemUgPiAweDEwMDAwCisJCSB8fCAoc2VjdG9yX3NpemUgJiAoc2VjdG9yX3NpemUtMSkpIC8qIG5vdCBwb3dlciBvZiAyICovCisJCSkgeworCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJCXNlY3Rvcl9vZmZzZXQgPSAyOworCQl1c2VyX3NldF9zZWN0b3Jfc2l6ZSA9IDE7CisJfQorCWlmICh1c2VyX2hlYWRzIDw9IDAgfHwgdXNlcl9oZWFkcyA+PSAyNTYpCisJCXVzZXJfaGVhZHMgPSAwOworCWlmICh1c2VyX3NlY3RvcnMgPD0gMCB8fCB1c2VyX3NlY3RvcnMgPj0gNjQpCisJCXVzZXJfc2VjdG9ycyA9IDA7CisJaWYgKG9wdCAmIE9QVF91KQorCQlkaXNwbGF5X2luX2N5bF91bml0cyA9IDA7IC8vIC11CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWlmIChvcHQgJiBPUFRfbCkgeworCQlub3dhcm4gPSAxOworI2VuZGlmCisJCWlmICgqYXJndikgeworCQkJbGlzdGluZyA9IDE7CisJCQlkbyB7CisJCQkJb3Blbl9saXN0X2FuZF9jbG9zZSgqYXJndiwgMSk7CisJCQl9IHdoaWxlICgqKythcmd2KTsKKwkJfSBlbHNlIHsKKwkJCS8qIHdlIGRvbid0IGhhdmUgZGV2aWNlIG5hbWVzLCAqLworCQkJLyogdXNlIC9wcm9jL3BhcnRpdGlvbnMgaW5zdGVhZCAqLworCQkJbGlzdF9kZXZzX2luX3Byb2NfcGFydGl0aXRvbnMoKTsKKwkJfQorCQlyZXR1cm4gMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQkxLU0laRQorCWlmIChvcHQgJiBPUFRfcykgeworCQlpbnQgajsKKworCQlub3dhcm4gPSAxOworCQlpZiAoIWFyZ3ZbMF0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWZvciAoaiA9IDA7IGFyZ3Zbal07IGorKykgeworCQkJdW5zaWduZWQgbG9uZyBsb25nIHNpemU7CisJCQlmZCA9IHhvcGVuKGFyZ3Zbal0sIE9fUkRPTkxZKTsKKwkJCXNpemUgPSBiYl9CTEtHRVRTSVpFX3NlY3RvcnMoZmQpIC8gMjsKKwkJCWNsb3NlKGZkKTsKKwkJCWlmIChhcmd2WzFdKQorCQkJCXByaW50ZigiJWxsdVxuIiwgc2l6ZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlczogJWxsdVxuIiwgYXJndltqXSwgc2l6ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWlmICghYXJndlswXSB8fCBhcmd2WzFdKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlkaXNrX2RldmljZSA9IGFyZ3ZbMF07CisJZ2V0X2Jvb3QoT1BFTl9NQUlOKTsKKworCWlmIChMQUJFTF9JU19PU0YpIHsKKwkJLyogT1NGIGxhYmVsLCBhbmQgbm8gRE9TIGxhYmVsICovCisJCXByaW50ZigiRGV0ZWN0ZWQgYW4gT1NGLzEgZGlza2xhYmVsIG9uICVzLCBlbnRlcmluZyAiCisJCQkiZGlza2xhYmVsIG1vZGVcbiIsIGRpc2tfZGV2aWNlKTsKKwkJYnNkX3NlbGVjdCgpOworCQkvKldoeSBkbyB3ZSBkbyB0aGlzPyAgSXQgc2VlbXMgdG8gYmUgY291bnRlci1pbnR1aXRpdmUqLworCQljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9ET1M7CisJCS8qIElmIHdlIHJldHVybiB3ZSBtYXkgd2FudCB0byBtYWtlIGFuIGVtcHR5IERPUyBsYWJlbD8gKi8KKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgYzsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJYyA9IDB4MjAgfCByZWFkX25vbmVtcHR5KCJDb21tYW5kIChtIGZvciBoZWxwKTogIik7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdhJzoKKwkJCWlmIChMQUJFTF9JU19ET1MpCisJCQkJdG9nZ2xlX2FjdGl2ZShnZXRfcGFydGl0aW9uKDEsIGdfcGFydGl0aW9ucykpOworCQkJZWxzZSBpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXRvZ2dsZV9zdW5mbGFncyhnZXRfcGFydGl0aW9uKDEsIGdfcGFydGl0aW9ucyksCisJCQkJCQkweDAxKTsKKwkJCWVsc2UgaWYgKExBQkVMX0lTX1NHSSkKKwkJCQlzZ2lfc2V0X2Jvb3RwYXJ0aXRpb24oCisJCQkJCWdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKSk7CisJCQllbHNlCisJCQkJdW5rbm93bl9jb21tYW5kKGMpOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJaWYgKExBQkVMX0lTX1NHSSkgeworCQkJCXByaW50ZigiXG5UaGUgY3VycmVudCBib290IGZpbGUgaXM6ICVzXG4iLAorCQkJCQlzZ2lfZ2V0X2Jvb3RmaWxlKCkpOworCQkJCWlmIChyZWFkX21heWJlX2VtcHR5KCJQbGVhc2UgZW50ZXIgdGhlIG5hbWUgb2YgdGhlICIKKwkJCQkJCSAgICJuZXcgYm9vdCBmaWxlOiAiKSA9PSAnXG4nKQorCQkJCQlwcmludGYoIkJvb3QgZmlsZSB1bmNoYW5nZWRcbiIpOworCQkJCWVsc2UKKwkJCQkJc2dpX3NldF9ib290ZmlsZShsaW5lX3B0cik7CisJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfT1NGX0xBQkVMCisJCQllbHNlCisJCQkJYnNkX3NlbGVjdCgpOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQlpZiAoTEFCRUxfSVNfRE9TKQorCQkJCXRvZ2dsZV9kb3NfY29tcGF0aWJpbGl0eV9mbGFnKCk7CisJCQllbHNlIGlmIChMQUJFTF9JU19TVU4pCisJCQkJdG9nZ2xlX3N1bmZsYWdzKGdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKSwKKwkJCQkJCTB4MTApOworCQkJZWxzZSBpZiAoTEFCRUxfSVNfU0dJKQorCQkJCXNnaV9zZXRfc3dhcHBhcnRpdGlvbigKKwkJCQkJCWdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKSk7CisJCQllbHNlCisJCQkJdW5rbm93bl9jb21tYW5kKGMpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJeworCQkJCWludCBqOworCQkJLyogSWYgc2dpX2xhYmVsIHRoZW4gZG9uJ3QgdXNlIGdldF9leGlzdGluZ19wYXJ0aXRpb24sCisJCQkgICBsZXQgdGhlIHVzZXIgc2VsZWN0IGEgcGFydGl0aW9uLCBzaW5jZQorCQkJICAgZ2V0X2V4aXN0aW5nX3BhcnRpdGlvbigpIG9ubHkgd29ya3MgZm9yIExpbnV4LWxpa2UKKwkJCSAgIHBhcnRpdGlvbiB0YWJsZXMgKi8KKwkJCQlpZiAoIUxBQkVMX0lTX1NHSSkgeworCQkJCQlqID0gZ2V0X2V4aXN0aW5nX3BhcnRpdGlvbigxLCBnX3BhcnRpdGlvbnMpOworCQkJCX0gZWxzZSB7CisJCQkJCWogPSBnZXRfcGFydGl0aW9uKDEsIGdfcGFydGl0aW9ucyk7CisJCQkJfQorCQkJCWlmIChqID49IDApCisJCQkJCWRlbGV0ZV9wYXJ0aXRpb24oaik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlpZiAoTEFCRUxfSVNfU0dJKQorCQkJCWNyZWF0ZV9zZ2lpbmZvKCk7CisJCQllbHNlCisJCQkJdW5rbm93bl9jb21tYW5kKGMpOworCQljYXNlICdsJzoKKwkJCWxpc3RfdHlwZXMoZ2V0X3N5c190eXBlcygpKTsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCW1lbnUoKTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5ld19wYXJ0aXRpb24oKTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCWNyZWF0ZV9kb3NsYWJlbCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJbGlzdF90YWJsZSgwKTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQljbG9zZV9kZXZfZmQoKTsKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAncyc6CisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisJCQljcmVhdGVfc3VubGFiZWwoKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJY2hhbmdlX3N5c2lkKCk7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQljaGFuZ2VfdW5pdHMoKTsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZlcmlmeSgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJd3JpdGVfdGFibGUoKTsgIC8qIGRvZXMgbm90IHJldHVybiAqLworCQkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKKwkJY2FzZSAneCc6CisJCQlpZiAoTEFCRUxfSVNfU0dJKSB7CisJCQkJcHJpbnRmKCJcblx0U29ycnksIG5vIGV4cGVydHMgbWVudSBmb3IgU0dJICIKKwkJCQkJInBhcnRpdGlvbiB0YWJsZXMgYXZhaWxhYmxlXG5cbiIpOworCQkJfSBlbHNlCisJCQkJeHNlbGVjdCgpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXVua25vd25fY29tbWFuZChjKTsKKwkJCW1lbnUoKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFICovCit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZkaXNrX2FpeC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19haXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVkZjUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19haXguYwpAQCAtMCwwICsxLDc0IEBACisjaWYgRU5BQkxFX0ZFQVRVUkVfQUlYX0xBQkVMCisvKgorICogQ29weXJpZ2h0IChDKSBBbmRyZWFzIE5ldXBlciwgU2VwIDE5OTguCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50ICAgbWFnaWM7ICAgICAgICAvKiBleHBlY3QgQUlYX0xBQkVMX01BR0lDICovCisJdW5zaWduZWQgaW50ICAgZmlsbGJ5dGVzMVsxMjRdOworCXVuc2lnbmVkIGludCAgIHBoeXNpY2FsX3ZvbHVtZV9pZDsKKwl1bnNpZ25lZCBpbnQgICBmaWxsYnl0ZXMyWzEyNF07Cit9IGFpeF9wYXJ0aXRpb247CisKKyNkZWZpbmUgQUlYX0xBQkVMX01BR0lDICAgICAgICAgMHhjOWMyZDRjMQorI2RlZmluZSBBSVhfTEFCRUxfTUFHSUNfU1dBUFBFRCAweGMxZDRjMmM5CisjZGVmaW5lIEFJWF9JTkZPX01BR0lDICAgICAgICAgIDB4MDAwNzI5NTkKKyNkZWZpbmUgQUlYX0lORk9fTUFHSUNfU1dBUFBFRCAgMHg1OTI5MDcwMAorCisjZGVmaW5lIGFpeGxhYmVsICgoYWl4X3BhcnRpdGlvbiAqKU1CUmJ1ZmZlcikKKworCisvKgorICBDaGFuZ2VzOgorICAqIDE5OTktMDMtMjAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgICogICAgIEludGVybmF0aW9uYWxpemF0aW9uCisgICoKKyAgKiAyMDAzLTAzLTIwIFBoaWxsaXAgS2VzbGluZyA8cGtlc2xpbmdAc2dpLmNvbT4KKyAgKiAgICAgIFNvbWUgZml4ZXMKKyovCisKK3N0YXRpYyBzbWFsbGludCBhaXhfb3RoZXJfZW5kaWFuOyAvKiBib29sICovCitzdGF0aWMgc21hbGxpbnQgYWl4X3ZvbHVtZXMgPSAxOyAvKiBtYXggMTUgKi8KKworLyoKKyAqIG9ubHkgZGVhbGluZyB3aXRoIGZyZWUgYmxvY2tzIGhlcmUKKyAqLworCitzdGF0aWMgdm9pZAorYWl4X2luZm8odm9pZCkKK3sKKwlwdXRzKCJcbiIKKyJUaGVyZSBpcyBhIHZhbGlkIEFJWCBsYWJlbCBvbiB0aGlzIGRpc2suXG4iCisiVW5mb3J0dW5hdGVseSBMaW51eCBjYW5ub3QgaGFuZGxlIHRoZXNlIGRpc2tzIGF0IHRoZSBtb21lbnQuXG4iCisiTmV2ZXJ0aGVsZXNzIHNvbWUgYWR2aWNlOlxuIgorIjEuIGZkaXNrIHdpbGwgZGVzdHJveSBpdHMgY29udGVudHMgb24gd3JpdGUuXG4iCisiMi4gQmUgc3VyZSB0aGF0IHRoaXMgZGlzayBpcyBOT1QgYSBzdGlsbCB2aXRhbCBwYXJ0IG9mIGEgdm9sdW1lIGdyb3VwLlxuIgorIiAgIChPdGhlcndpc2UgeW91IG1heSBlcmFzZSB0aGUgb3RoZXIgZGlza3MgYXMgd2VsbCwgaWYgdW5taXJyb3JlZC4pXG4iCisiMy4gQmVmb3JlIGRlbGV0aW5nIHRoaXMgcGh5c2ljYWwgdm9sdW1lIGJlIHN1cmUgdG8gcmVtb3ZlIHRoZSBkaXNrXG4iCisiICAgbG9naWNhbGx5IGZyb20geW91ciBBSVggbWFjaGluZS4gKE90aGVyd2lzZSB5b3UgYmVjb21lIGFuIEFJWHBlcnQpLlxuIgorCSk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrX2FpeF9sYWJlbCh2b2lkKQoreworCWlmIChhaXhsYWJlbC0+bWFnaWMgIT0gQUlYX0xBQkVMX01BR0lDCisJICYmIGFpeGxhYmVsLT5tYWdpYyAhPSBBSVhfTEFCRUxfTUFHSUNfU1dBUFBFRAorCSkgeworCQljdXJyZW50X2xhYmVsX3R5cGUgPSAwOworCQlhaXhfb3RoZXJfZW5kaWFuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWFpeF9vdGhlcl9lbmRpYW4gPSAoYWl4bGFiZWwtPm1hZ2ljID09IEFJWF9MQUJFTF9NQUdJQ19TV0FQUEVEKTsKKwl1cGRhdGVfdW5pdHMoKTsKKwljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9BSVg7CisJZ19wYXJ0aXRpb25zID0gMTAxNjsKKwlhaXhfdm9sdW1lcyA9IDE1OworCWFpeF9pbmZvKCk7CisJLyphaXhfbm9sYWJlbCgpOyovICAgICAgICAgICAgICAvKiAlJSAqLworCS8qYWl4X2xhYmVsID0gMTsqLyAgICAgICAgICAgICAgLyogJSUgKi8KKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAgLyogQUlYX0xBQkVMICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZkaXNrX2dwdC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19ncHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNkOWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19ncHQuYwpAQCAtMCwwICsxLDE5NSBAQAorI2lmIEVOQUJMRV9GRUFUVVJFX0dQVF9MQUJFTAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBLZXZpbiBDZXJuZWtlZSA8Y2VybmVrZWVAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2RlZmluZSBHUFRfTUFHSUMgMHg1NDUyNDE1MDIwNDk0NjQ1VUxMCitlbnVtIHsKKwlMRUdBQ1lfR1BUX1RZUEUgPSAweGVlLAorCUdQVF9NQVhfUEFSVFMgICA9IDI1NiwKKwlHUFRfTUFYX1BBUlRfRU5UUllfTEVOID0gNDA5NiwKKwlHVUlEX0xFTiAgICAgICAgPSAxNiwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50NjRfdCBtYWdpYzsKKwl1aW50MzJfdCByZXZpc2lvbjsKKwl1aW50MzJfdCBoZHJfc2l6ZTsKKwl1aW50MzJfdCBoZHJfY3JjMzI7CisJdWludDMyX3QgcmVzZXJ2ZWQ7CisJdWludDY0X3QgY3VycmVudF9sYmE7CisJdWludDY0X3QgYmFja3VwX2xiYTsKKwl1aW50NjRfdCBmaXJzdF91c2FibGVfbGJhOworCXVpbnQ2NF90IGxhc3RfdXNhYmxlX2xiYTsKKwl1aW50OF90ICBkaXNrX2d1aWRbR1VJRF9MRU5dOworCXVpbnQ2NF90IGZpcnN0X3BhcnRfbGJhOworCXVpbnQzMl90IG5fcGFydHM7CisJdWludDMyX3QgcGFydF9lbnRyeV9sZW47CisJdWludDMyX3QgcGFydF9hcnJheV9jcmMzMjsKK30gZ3B0X2hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgIHR5cGVfZ3VpZFtHVUlEX0xFTl07CisJdWludDhfdCAgcGFydF9ndWlkW0dVSURfTEVOXTsKKwl1aW50NjRfdCBsYmFfc3RhcnQ7CisJdWludDY0X3QgbGJhX2VuZDsKKwl1aW50NjRfdCBmbGFnczsKKwl1aW50MTZfdCBuYW1lWzM2XTsKK30gZ3B0X3BhcnRpdGlvbjsKKworc3RhdGljIGdwdF9oZWFkZXIgKmdwdF9oZHI7CisKK3N0YXRpYyBjaGFyICpwYXJ0X2FycmF5Oworc3RhdGljIHVuc2lnbmVkIGludCBuX3BhcnRzOworc3RhdGljIHVuc2lnbmVkIGludCBwYXJ0X2FycmF5X2xlbjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFydF9lbnRyeV9sZW47CisKK3N0YXRpYyBpbmxpbmUgZ3B0X3BhcnRpdGlvbiAqCitncHRfcGFydChpbnQgaSkKK3sKKwlpZiAoaSA+PSBuX3BhcnRzKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKGdwdF9wYXJ0aXRpb24gKikmcGFydF9hcnJheVtpICogcGFydF9lbnRyeV9sZW5dOworfQorCitzdGF0aWMgdWludDMyX3QKK2dwdF9jcmMzMih2b2lkICpidWYsIGludCBsZW4pCit7CisJcmV0dXJuIH5jcmMzMl9ibG9ja19lbmRpYW4wKDB4ZmZmZmZmZmYsIGJ1ZiwgbGVuLCBnbG9iYWxfY3JjMzJfdGFibGUpOworfQorCitzdGF0aWMgdm9pZAorZ3B0X3ByaW50X2d1aWQodWludDhfdCAqYnVmKQoreworCXByaW50ZigKKwkJIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkJYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSwgYnVmWzBdLAorCQlidWZbNV0sIGJ1Zls0XSwKKwkJYnVmWzddLCBidWZbNl0sCisJCWJ1Zls4XSwgYnVmWzldLAorCQlidWZbMTBdLCBidWZbMTFdLCBidWZbMTJdLCBidWZbMTNdLCBidWZbMTRdLCBidWZbMTVdKTsKK30KKworLyogVE9ETzogcmVhbCB1bmljb2RlIHN1cHBvcnQgKi8KK3N0YXRpYyB2b2lkCitncHRfcHJpbnRfd2lkZSh1aW50MTZfdCAqcywgaW50IG1heF9sZW4pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCBtYXhfbGVuKSB7CisJCWlmICgqcyA9PSAwKQorCQkJcmV0dXJuOworCQlmcHV0Yygqcywgc3Rkb3V0KTsKKwkJcysrOworCX0KK30KKworc3RhdGljIHZvaWQKK2dwdF9saXN0X3RhYmxlKGludCB4dHJhIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgaTsKKwljaGFyIG51bXN0cjZbNl07CisKKwludW1zdHI2WzVdID0gJ1wwJzsKKworCXNtYXJ0X3VsbHRvYTUodG90YWxfbnVtYmVyX29mX3NlY3RvcnMsIG51bXN0cjYsICIgS01HVFBFWlkiKTsKKwlwcmludGYoIkRpc2sgJXM6ICVsbHUgc2VjdG9ycywgJXNcbiIsIGRpc2tfZGV2aWNlLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXRvdGFsX251bWJlcl9vZl9zZWN0b3JzLAorCQludW1zdHI2KTsKKwlwcmludGYoIkxvZ2ljYWwgc2VjdG9yIHNpemU6ICV1XG4iLCBzZWN0b3Jfc2l6ZSk7CisJcHJpbnRmKCJEaXNrIGlkZW50aWZpZXIgKEdVSUQpOiAiKTsKKwlncHRfcHJpbnRfZ3VpZChncHRfaGRyLT5kaXNrX2d1aWQpOworCXByaW50ZigiXG5QYXJ0aXRpb24gdGFibGUgaG9sZHMgdXAgdG8gJXUgZW50cmllc1xuIiwKKwkJKGludClTV0FQX0xFMzIoZ3B0X2hkci0+bl9wYXJ0cykpOworCXByaW50ZigiRmlyc3QgdXNhYmxlIHNlY3RvciBpcyAlbGx1LCBsYXN0IHVzYWJsZSBzZWN0b3IgaXMgJWxsdVxuXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKVNXQVBfTEU2NChncHRfaGRyLT5maXJzdF91c2FibGVfbGJhKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylTV0FQX0xFNjQoZ3B0X2hkci0+bGFzdF91c2FibGVfbGJhKSk7CisKKwlwcmludGYoIk51bWJlciAgU3RhcnQgKHNlY3RvcikgICAgRW5kIChzZWN0b3IpICBTaXplICAgICAgIENvZGUgIE5hbWVcbiIpOworCWZvciAoaSA9IDA7IGkgPCBuX3BhcnRzOyBpKyspIHsKKwkJZ3B0X3BhcnRpdGlvbiAqcCA9IGdwdF9wYXJ0KGkpOworCQlpZiAocC0+bGJhX3N0YXJ0KSB7CisJCQlzbWFydF91bGx0b2E1KDEgKyBTV0FQX0xFNjQocC0+bGJhX2VuZCkgLSBTV0FQX0xFNjQocC0+bGJhX3N0YXJ0KSwKKwkJCQludW1zdHI2LCAiIEtNR1RQRVpZIik7CisJCQlwcmludGYoIiU0dSAlMTVsbHUgJTE1bGx1ICUxMXMgICAlMDR4ICAiLAorCQkJCWkgKyAxLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpU1dBUF9MRTY0KHAtPmxiYV9zdGFydCksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylTV0FQX0xFNjQocC0+bGJhX2VuZCksCisJCQkJbnVtc3RyNiwKKwkJCQkweDA3MDAgLyogRklYTUUgKi8pOworCQkJZ3B0X3ByaW50X3dpZGUocC0+bmFtZSwgMTgpOworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50CitjaGVja19ncHRfbGFiZWwodm9pZCkKK3sKKwlzdHJ1Y3QgcGFydGl0aW9uICpmaXJzdCA9IHB0X29mZnNldChNQlJidWZmZXIsIDApOworCXN0cnVjdCBwdGUgcGU7CisJdWludDMyX3QgY3JjOworCisJLyogTEJBIDAgY29udGFpbnMgdGhlIGxlZ2FjeSBNQlIgKi8KKworCWlmICghdmFsaWRfcGFydF90YWJsZV9mbGFnKE1CUmJ1ZmZlcikKKwkgfHwgZmlyc3QtPnN5c19pbmQgIT0gTEVHQUNZX0dQVF9UWVBFCisJKSB7CisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qIExCQSAxIGNvbnRhaW5zIHRoZSBHUFQgaGVhZGVyICovCisKKwlyZWFkX3B0ZSgmcGUsIDEpOworCWdwdF9oZHIgPSAodm9pZCAqKXBlLnNlY3RvcmJ1ZmZlcjsKKworCWlmIChncHRfaGRyLT5tYWdpYyAhPSBTV0FQX0xFNjQoR1BUX01BR0lDKSkgeworCQljdXJyZW50X2xhYmVsX3R5cGUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWdsb2JhbF9jcmMzMl90YWJsZSkgeworCQlnbG9iYWxfY3JjMzJfdGFibGUgPSBjcmMzMl9maWxsdGFibGUoTlVMTCwgMCk7CisJfQorCisJY3JjID0gU1dBUF9MRTMyKGdwdF9oZHItPmhkcl9jcmMzMik7CisJZ3B0X2hkci0+aGRyX2NyYzMyID0gMDsKKwlpZiAoZ3B0X2NyYzMyKGdwdF9oZHIsIFNXQVBfTEUzMihncHRfaGRyLT5oZHJfc2l6ZSkpICE9IGNyYykgeworCQkvKiBGSVhNRTogcmVhZCB0aGUgYmFja3VwIHRhYmxlICovCisJCXB1dHMoIlxud2FybmluZzogR1BUIGhlYWRlciBDUkMgaXMgaW52YWxpZFxuIik7CisJfQorCisJbl9wYXJ0cyA9IFNXQVBfTEUzMihncHRfaGRyLT5uX3BhcnRzKTsKKwlwYXJ0X2VudHJ5X2xlbiA9IFNXQVBfTEUzMihncHRfaGRyLT5wYXJ0X2VudHJ5X2xlbik7CisJaWYgKG5fcGFydHMgPiBHUFRfTUFYX1BBUlRTCisJIHx8IHBhcnRfZW50cnlfbGVuID4gR1BUX01BWF9QQVJUX0VOVFJZX0xFTgorCSB8fCBTV0FQX0xFMzIoZ3B0X2hkci0+aGRyX3NpemUpID4gc2VjdG9yX3NpemUKKwkpIHsKKwkJcHV0cygiXG53YXJuaW5nOiB1bmFibGUgdG8gcGFyc2UgR1BUIGRpc2tsYWJlbFxuIik7CisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCXBhcnRfYXJyYXlfbGVuID0gbl9wYXJ0cyAqIHBhcnRfZW50cnlfbGVuOworCXBhcnRfYXJyYXkgPSB4bWFsbG9jKHBhcnRfYXJyYXlfbGVuKTsKKwlzZWVrX3NlY3RvcihTV0FQX0xFNjQoZ3B0X2hkci0+Zmlyc3RfcGFydF9sYmEpKTsKKwlpZiAoZnVsbF9yZWFkKGRldl9mZCwgcGFydF9hcnJheSwgcGFydF9hcnJheV9sZW4pICE9IHBhcnRfYXJyYXlfbGVuKSB7CisJCWZkaXNrX2ZhdGFsKHVuYWJsZV90b19yZWFkKTsKKwl9CisKKwlpZiAoZ3B0X2NyYzMyKHBhcnRfYXJyYXksIHBhcnRfYXJyYXlfbGVuKSAhPSBncHRfaGRyLT5wYXJ0X2FycmF5X2NyYzMyKSB7CisJCS8qIEZJWE1FOiByZWFkIHRoZSBiYWNrdXAgdGFibGUgKi8KKwkJcHV0cygiXG53YXJuaW5nOiBHUFQgYXJyYXkgQ1JDIGlzIGludmFsaWRcbiIpOworCX0KKworCXB1dHMoIkZvdW5kIHZhbGlkIEdQVCB3aXRoIHByb3RlY3RpdmUgTUJSOyB1c2luZyBHUFRcbiIpOworCisJY3VycmVudF9sYWJlbF90eXBlID0gTEFCRUxfR1BUOworCXJldHVybiAxOworfQorCisjZW5kaWYgLyogR1BUX0xBQkVMICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZkaXNrX29zZi5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19vc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU2YmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19vc2YuYwpAQCAtMCwwICsxLDEwNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5ODggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9PU0ZfTEFCRUwKKworI2lmbmRlZiBCU0RfRElTS01BR0lDCisjZGVmaW5lIEJTRF9ESVNLTUFHSUMgICAgICgodWludDMyX3QpIDB4ODI1NjQ1NTcpCisjZW5kaWYKKworI2lmbmRlZiBCU0RfTUFYUEFSVElUSU9OUworI2RlZmluZSBCU0RfTUFYUEFSVElUSU9OUyAxNgorI2VuZGlmCisKKyNkZWZpbmUgQlNEX0xJTlVYX0JPT1RESVIgIi91c3IvdWNiL21kZWMiCisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgXAorIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIFwKKyB8fCBkZWZpbmVkKF9faWE2NF9fKSBcCisgfHwgZGVmaW5lZChfX2hwcGFfXykKKyMgZGVmaW5lIEJTRF9MQUJFTFNFQ1RPUiAgIDAKKyMgZGVmaW5lIEJTRF9MQUJFTE9GRlNFVCAgIDY0CisjZWxzZQorIyBkZWZpbmUgQlNEX0xBQkVMU0VDVE9SICAgMQorIyBkZWZpbmUgQlNEX0xBQkVMT0ZGU0VUICAgMAorI2VuZGlmCisKKyNkZWZpbmUgQlNEX0JCU0laRSAgICAgICAgODE5MiAgICAgICAgICAvKiBzaXplIG9mIGJvb3QgYXJlYSwgd2l0aCBsYWJlbCAqLworI2RlZmluZSBCU0RfU0JTSVpFICAgICAgICA4MTkyICAgICAgICAgIC8qIG1heCBzaXplIG9mIGZzIHN1cGVyYmxvY2sgKi8KKworc3RydWN0IHhic2RfZGlza2xhYmVsIHsKKwl1aW50MzJfdCAgIGRfbWFnaWM7ICAgICAgICAgICAgICAgIC8qIHRoZSBtYWdpYyBudW1iZXIgKi8KKwlpbnQxNl90ICAgIGRfdHlwZTsgICAgICAgICAgICAgICAgIC8qIGRyaXZlIHR5cGUgKi8KKwlpbnQxNl90ICAgIGRfc3VidHlwZTsgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIvZF90eXBlIHNwZWNpZmljICovCisJY2hhciAgICAgICBkX3R5cGVuYW1lWzE2XTsgICAgICAgICAvKiB0eXBlIG5hbWUsIGUuZy4gImVhZ2xlIiAqLworCWNoYXIgICAgICAgZF9wYWNrbmFtZVsxNl07ICAgICAgICAgLyogcGFjayBpZGVudGlmaWVyICovCisJLyogZGlzayBnZW9tZXRyeTogKi8KKwl1aW50MzJfdCAgIGRfc2Vjc2l6ZTsgICAgICAgICAgICAgIC8qICMgb2YgYnl0ZXMgcGVyIHNlY3RvciAqLworCXVpbnQzMl90ICAgZF9uc2VjdG9yczsgICAgICAgICAgICAgLyogIyBvZiBkYXRhIHNlY3RvcnMgcGVyIHRyYWNrICovCisJdWludDMyX3QgICBkX250cmFja3M7ICAgICAgICAgICAgICAvKiAjIG9mIHRyYWNrcyBwZXIgY3lsaW5kZXIgKi8KKwl1aW50MzJfdCAgIGRfbmN5bGluZGVyczsgICAgICAgICAgIC8qICMgb2YgZGF0YSBjeWxpbmRlcnMgcGVyIHVuaXQgKi8KKwl1aW50MzJfdCAgIGRfc2VjcGVyY3lsOyAgICAgICAgICAgIC8qICMgb2YgZGF0YSBzZWN0b3JzIHBlciBjeWxpbmRlciAqLworCXVpbnQzMl90ICAgZF9zZWNwZXJ1bml0OyAgICAgICAgICAgLyogIyBvZiBkYXRhIHNlY3RvcnMgcGVyIHVuaXQgKi8KKwkvKgorCSAqIFNwYXJlcyAoYmFkIHNlY3RvciByZXBsYWNlbWVudHMpIGJlbG93CisJICogYXJlIG5vdCBjb3VudGVkIGluIGRfbnNlY3RvcnMgb3IgZF9zZWNwZXJjeWwuCisJICogU3BhcmUgc2VjdG9ycyBhcmUgYXNzdW1lZCB0byBiZSBwaHlzaWNhbCBzZWN0b3JzCisJICogd2hpY2ggb2NjdXB5IHNwYWNlIGF0IHRoZSBlbmQgb2YgZWFjaCB0cmFjayBhbmQvb3IgY3lsaW5kZXIuCisJICovCisJdWludDE2X3QgICBkX3NwYXJlc3BlcnRyYWNrOyAgICAgICAvKiAjIG9mIHNwYXJlIHNlY3RvcnMgcGVyIHRyYWNrICovCisJdWludDE2X3QgICBkX3NwYXJlc3BlcmN5bDsgICAgICAgICAvKiAjIG9mIHNwYXJlIHNlY3RvcnMgcGVyIGN5bGluZGVyICovCisJLyoKKwkgKiBBbHRlcm5hdGUgY3lsaW5kZXJzIGluY2x1ZGUgbWFpbnRlbmFuY2UsIHJlcGxhY2VtZW50LAorCSAqIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb24gYXJlYXMsIGV0Yy4KKwkgKi8KKwl1aW50MzJfdCAgIGRfYWN5bGluZGVyczsgICAgICAgICAgIC8qICMgb2YgYWx0LiBjeWxpbmRlcnMgcGVyIHVuaXQgKi8KKworCS8qIGhhcmR3YXJlIGNoYXJhY3RlcmlzdGljczogKi8KKwkvKgorCSAqIGRfaW50ZXJsZWF2ZSwgZF90cmFja3NrZXcgYW5kIGRfY3lsc2tldyBkZXNjcmliZSBwZXJ0dXJiYXRpb25zCisJICogaW4gdGhlIG1lZGlhIGZvcm1hdCB1c2VkIHRvIGNvbXBlbnNhdGUgZm9yIGEgc2xvdyBjb250cm9sbGVyLgorCSAqIEludGVybGVhdmUgaXMgcGh5c2ljYWwgc2VjdG9yIGludGVybGVhdmUsIHNldCB1cCBieSB0aGUgZm9ybWF0dGVyCisJICogb3IgY29udHJvbGxlciB3aGVuIGZvcm1hdHRpbmcuICBXaGVuIGludGVybGVhdmluZyBpcyBpbiB1c2UsCisJICogbG9naWNhbGx5IGFkamFjZW50IHNlY3RvcnMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMsCisJICogYnV0IGluc3RlYWQgYXJlIHNlcGFyYXRlZCBieSBzb21lIG51bWJlciBvZiBzZWN0b3JzLgorCSAqIEl0IGlzIHNwZWNpZmllZCBhcyB0aGUgcmF0aW8gb2YgcGh5c2ljYWwgc2VjdG9ycyB0cmF2ZXJzZWQKKwkgKiBwZXIgbG9naWNhbCBzZWN0b3IuICBUaHVzIGFuIGludGVybGVhdmUgb2YgMToxIGltcGxpZXMgY29udGlndW91cworCSAqIGxheW91dCwgd2hpbGUgMjoxIGltcGxpZXMgdGhhdCBsb2dpY2FsIHNlY3RvciAwIGlzIHNlcGFyYXRlZAorCSAqIGJ5IG9uZSBzZWN0b3IgZnJvbSBsb2dpY2FsIHNlY3RvciAxLgorCSAqIGRfdHJhY2tza2V3IGlzIHRoZSBvZmZzZXQgb2Ygc2VjdG9yIDAgb24gdHJhY2sgTgorCSAqIHJlbGF0aXZlIHRvIHNlY3RvciAwIG9uIHRyYWNrIE4tMSBvbiB0aGUgc2FtZSBjeWxpbmRlci4KKwkgKiBGaW5hbGx5LCBkX2N5bHNrZXcgaXMgdGhlIG9mZnNldCBvZiBzZWN0b3IgMCBvbiBjeWxpbmRlciBOCisJICogcmVsYXRpdmUgdG8gc2VjdG9yIDAgb24gY3lsaW5kZXIgTi0xLgorCSAqLworCXVpbnQxNl90ICAgZF9ycG07ICAgICAgICAgICAgICAgICAgLyogcm90YXRpb25hbCBzcGVlZCAqLworCXVpbnQxNl90ICAgZF9pbnRlcmxlYXZlOyAgICAgICAgICAgLyogaGFyZHdhcmUgc2VjdG9yIGludGVybGVhdmUgKi8KKwl1aW50MTZfdCAgIGRfdHJhY2tza2V3OyAgICAgICAgICAgIC8qIHNlY3RvciAwIHNrZXcsIHBlciB0cmFjayAqLworCXVpbnQxNl90ICAgZF9jeWxza2V3OyAgICAgICAgICAgICAgLyogc2VjdG9yIDAgc2tldywgcGVyIGN5bGluZGVyICovCisJdWludDMyX3QgICBkX2hlYWRzd2l0Y2g7ICAgICAgICAgICAvKiBoZWFkIHN3aXRjaCB0aW1lLCB1c2VjICovCisJdWludDMyX3QgICBkX3Rya3NlZWs7ICAgICAgICAgICAgICAvKiB0cmFjay10by10cmFjayBzZWVrLCB1c2VjICovCisJdWludDMyX3QgICBkX2ZsYWdzOyAgICAgICAgICAgICAgICAvKiBnZW5lcmljIGZsYWdzICovCisjZGVmaW5lIE5EREFUQSA1CisJdWludDMyX3QgICBkX2RyaXZlZGF0YVtORERBVEFdOyAgICAvKiBkcml2ZS10eXBlIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisjZGVmaW5lIE5TUEFSRSA1CisJdWludDMyX3QgICBkX3NwYXJlW05TUEFSRV07ICAgICAgICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCXVpbnQzMl90ICAgZF9tYWdpYzI7ICAgICAgICAgICAgICAgLyogdGhlIG1hZ2ljIG51bWJlciAoYWdhaW4pICovCisJdWludDE2X3QgICBkX2NoZWNrc3VtOyAgICAgICAgICAgICAvKiB4b3Igb2YgZGF0YSBpbmNsLiBwYXJ0aXRpb25zICovCisJLyogZmlsZXN5c3RlbSBhbmQgcGFydGl0aW9uIGluZm9ybWF0aW9uOiAqLworCXVpbnQxNl90ICAgZF9ucGFydGl0aW9uczsgICAgICAgICAgLyogbnVtYmVyIG9mIHBhcnRpdGlvbnMgaW4gZm9sbG93aW5nICovCisJdWludDMyX3QgICBkX2Jic2l6ZTsgICAgICAgICAgICAgICAvKiBzaXplIG9mIGJvb3QgYXJlYSBhdCBzbjAsIGJ5dGVzICovCisJdWludDMyX3QgICBkX3Nic2l6ZTsgICAgICAgICAgICAgICAvKiBtYXggc2l6ZSBvZiBmcyBzdXBlcmJsb2NrLCBieXRlcyAqLworCXN0cnVjdCB4YnNkX3BhcnRpdGlvbiB7IC8qIHRoZSBwYXJ0aXRpb24gdGFibGUgKi8KKwkJdWludDMyX3QgICBwX3NpemU7ICAgICAgICAgLyogbnVtYmVyIG9mIHNlY3RvcnMgaW4gcGFydGl0aW9uICovCisJCXVpbnQzMl90ICAgcF9vZmZzZXQ7ICAgICAgIC8qIHN0YXJ0aW5nIHNlY3RvciAqLworCQl1aW50MzJfdCAgIHBfZnNpemU7ICAgICAgICAvKiBmaWxlc3lzdGVtIGJhc2ljIGZyYWdtZW50IHNpemUgKi8KKwkJdWludDhfdCAgICBwX2ZzdHlwZTsgICAgICAgLyogZmlsZXN5c3RlbSB0eXBlLCBzZWUgYmVsb3cgKi8KKwkJdWludDhfdCAgICBwX2ZyYWc7ICAgICAgICAgLyogZmlsZXN5c3RlbSBmcmFnbWVudHMgcGVyIGJsb2NrICovCisJCXVpbnQxNl90ICAgcF9jcGc7ICAgICAgICAgIC8qIGZpbGVzeXN0ZW0gY3lsaW5kZXJzIHBlciBncm91cCAqLworCX0gZF9wYXJ0aXRpb25zW0JTRF9NQVhQQVJUSVRJT05TXTsgLyogYWN0dWFsbHkgbWF5IGJlIG1vcmUgKi8KK307CisKKy8qIGRfdHlwZSB2YWx1ZXM6ICovCisjZGVmaW5lIEJTRF9EVFlQRV9TTUQgICAgICAgICAgIDEgICAgICAgICAgICAgICAvKiBTTUQsIFhTTUQ7IFZBWCBocC91cCAqLworI2RlZmluZSBCU0RfRFRZUEVfTVNDUCAgICAgICAgICAyICAgICAgICAgICAgICAgLyogTVNDUCAqLworI2RlZmluZSBCU0RfRFRZUEVfREVDICAgICAgICAgICAzICAgICAgICAgICAgICAgLyogb3RoZXIgREVDIChyaywgcmwpICovCisjZGVmaW5lIEJTRF9EVFlQRV9TQ1NJICAgICAgICAgIDQgICAgICAgICAgICAgICAvKiBTQ1NJICovCisjZGVmaW5lIEJTRF9EVFlQRV9FU0RJICAgICAgICAgIDUgICAgICAgICAgICAgICAvKiBFU0RJIGludGVyZmFjZSAqLworI2RlZmluZSBCU0RfRFRZUEVfU1Q1MDYgICAgICAgICA2ICAgICAgICAgICAgICAgLyogU1Q1MDYgZXRjLiAqLworI2RlZmluZSBCU0RfRFRZUEVfSFBJQiAgICAgICAgICA3ICAgICAgICAgICAgICAgLyogQ1MvODAgb24gSFAtSUIgKi8KKyNkZWZpbmUgQlNEX0RUWVBFX0hQRkwgICAgICAgICAgOCAgICAgICAgICAgICAgIC8qIEhQIEZpYmVyLWxpbmsgKi8KKyNkZWZpbmUgQlNEX0RUWVBFX0ZMT1BQWSAgICAgICAgMTAgICAgICAgICAgICAgIC8qIGZsb3BweSAqLworCisvKiBkX3N1YnR5cGUgdmFsdWVzOiAqLworI2RlZmluZSBCU0RfRFNUWVBFX0lORE9TUEFSVCAgICAweDggICAgICAgICAgICAgLyogaXMgaW5zaWRlIGRvcyBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgQlNEX0RTVFlQRV9ET1NQQVJUKHMpICAgKChzKSAmIDMpICAgICAgIC8qIGRvcyBwYXJ0aXRpb24gbnVtYmVyICovCisjZGVmaW5lIEJTRF9EU1RZUEVfR0VPTUVUUlkgICAgIDB4MTAgICAgICAgICAgICAvKiBkcml2ZSBwYXJhbXMgaW4gbGFiZWwgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHhic2RfZGt0eXBlbmFtZXNbXSA9IHsKKwkidW5rbm93biIsCisJIlNNRCIsCisJIk1TQ1AiLAorCSJvbGQgREVDIiwKKwkiU0NTSSIsCisJIkVTREkiLAorCSJTVDUwNiIsCisJIkhQLUlCIiwKKwkiSFAtRkwiLAorCSJ0eXBlIDkiLAorCSJmbG9wcHkiLAorCTAKK307CisKKworLyoKKyAqIEZpbGVzeXN0ZW0gdHlwZSBhbmQgdmVyc2lvbi4KKyAqIFVzZWQgdG8gaW50ZXJwcmV0IG90aGVyIGZpbGVzeXN0ZW0tc3BlY2lmaWMKKyAqIHBlci1wYXJ0aXRpb24gaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgQlNEX0ZTX1VOVVNFRCAgIDAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgQlNEX0ZTX1NXQVAgICAgIDEgICAgICAgICAgICAgICAvKiBzd2FwICovCisjZGVmaW5lIEJTRF9GU19WNiAgICAgICAyICAgICAgICAgICAgICAgLyogU2l4dGggRWRpdGlvbiAqLworI2RlZmluZSBCU0RfRlNfVjcgICAgICAgMyAgICAgICAgICAgICAgIC8qIFNldmVudGggRWRpdGlvbiAqLworI2RlZmluZSBCU0RfRlNfU1lTViAgICAgNCAgICAgICAgICAgICAgIC8qIFN5c3RlbSBWICovCisjZGVmaW5lIEJTRF9GU19WNzFLICAgICA1ICAgICAgICAgICAgICAgLyogVjcgd2l0aCAxSyBibG9ja3MgKDQuMSwgMi45KSAqLworI2RlZmluZSBCU0RfRlNfVjggICAgICAgNiAgICAgICAgICAgICAgIC8qIEVpZ2h0aCBFZGl0aW9uLCA0SyBibG9ja3MgKi8KKyNkZWZpbmUgQlNEX0ZTX0JTREZGUyAgIDcgICAgICAgICAgICAgICAvKiA0LjJCU0QgZmFzdCBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBCU0RfRlNfQlNETEZTICAgOSAgICAgICAgICAgICAgIC8qIDQuNEJTRCBsb2ctc3RydWN0dXJlZCBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBCU0RfRlNfT1RIRVIgICAgMTAgICAgICAgICAgICAgIC8qIGluIHVzZSwgYnV0IHVua25vd24vdW5zdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQlNEX0ZTX0hQRlMgICAgIDExICAgICAgICAgICAgICAvKiBPUy8yIGhpZ2gtcGVyZm9ybWFuY2UgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgQlNEX0ZTX0lTTzk2NjAgIDEyICAgICAgICAgICAgICAvKiBJU08tOTY2MCBmaWxlc3lzdGVtIChjZHJvbSkgKi8KKyNkZWZpbmUgQlNEX0ZTX0lTT0ZTICAgIEJTRF9GU19JU085NjYwCisjZGVmaW5lIEJTRF9GU19CT09UICAgICAxMyAgICAgICAgICAgICAgLyogcGFydGl0aW9uIGNvbnRhaW5zIGJvb3RzdHJhcCAqLworI2RlZmluZSBCU0RfRlNfQURPUyAgICAgMTQgICAgICAgICAgICAgIC8qIEFtaWdhRE9TIGZhc3QgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgQlNEX0ZTX0hGUyAgICAgIDE1ICAgICAgICAgICAgICAvKiBNYWNpbnRvc2ggSEZTICovCisjZGVmaW5lIEJTRF9GU19BRFZGUyAgICAxNiAgICAgICAgICAgICAgLyogRGlnaXRhbCBVbml4IEFkdkZTICovCisKKy8qIHRoaXMgaXMgYW5ub3lpbmcsIGJ1dCBpdCdzIGFsc28gdGhlIHdheSBpdCBpcyA6LSggKi8KKyNpZmRlZiBfX2FscGhhX18KKyNkZWZpbmUgQlNEX0ZTX0VYVDIgICAgIDggICAgICAgICAgICAgICAvKiBleHQyIGZpbGUgc3lzdGVtICovCisjZWxzZQorI2RlZmluZSBCU0RfRlNfTVNET1MgICAgOCAgICAgICAgICAgICAgIC8qIE1TLURPUyBmaWxlIHN5c3RlbSAqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB4YnNkX2ZzdHlwZXNbXSA9IHsKKwkiXHgwMCIgInVudXNlZCIsICAgICAgICAgICAgLyogQlNEX0ZTX1VOVVNFRCAgKi8KKwkiXHgwMSIgInN3YXAiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX1NXQVAgICAgKi8KKwkiXHgwMiIgIlZlcnNpb24gNiIsICAgICAgICAgLyogQlNEX0ZTX1Y2ICAgICAgKi8KKwkiXHgwMyIgIlZlcnNpb24gNyIsICAgICAgICAgLyogQlNEX0ZTX1Y3ICAgICAgKi8KKwkiXHgwNCIgIlN5c3RlbSBWIiwgICAgICAgICAgLyogQlNEX0ZTX1NZU1YgICAgKi8KKwkiXHgwNSIgIjQuMUJTRCIsICAgICAgICAgICAgLyogQlNEX0ZTX1Y3MUsgICAgKi8KKwkiXHgwNiIgIkVpZ2h0aCBFZGl0aW9uIiwgICAgLyogQlNEX0ZTX1Y4ICAgICAgKi8KKwkiXHgwNyIgIjQuMkJTRCIsICAgICAgICAgICAgLyogQlNEX0ZTX0JTREZGUyAgKi8KKyNpZmRlZiBfX2FscGhhX18KKwkiXHgwOCIgImV4dDIiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX0VYVDIgICAgKi8KKyNlbHNlCisJIlx4MDgiICJNUy1ET1MiLCAgICAgICAgICAgIC8qIEJTRF9GU19NU0RPUyAgICovCisjZW5kaWYKKwkiXHgwOSIgIjQuNExGUyIsICAgICAgICAgICAgLyogQlNEX0ZTX0JTRExGUyAgKi8KKwkiXHgwYSIgInVua25vd24iLCAgICAgICAgICAgLyogQlNEX0ZTX09USEVSICAgKi8KKwkiXHgwYiIgIkhQRlMiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX0hQRlMgICAgKi8KKwkiXHgwYyIgIklTTy05NjYwIiwgICAgICAgICAgLyogQlNEX0ZTX0lTTzk2NjAgKi8KKwkiXHgwZCIgImJvb3QiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX0JPT1QgICAgKi8KKwkiXHgwZSIgIkFET1MiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX0FET1MgICAgKi8KKwkiXHgwZiIgIkhGUyIsICAgICAgICAgICAgICAgLyogQlNEX0ZTX0hGUyAgICAgKi8KKwkiXHgxMCIgIkFkdkZTIiwgICAgICAgICAgICAgLyogQlNEX0ZTX0FEVkZTICAgKi8KKwlOVUxMCit9OworCisKKy8qCisgKiBmbGFncyBzaGFyZWQgYnkgdmFyaW91cyBkcml2ZXM6CisgKi8KKyNkZWZpbmUgQlNEX0RfUkVNT1ZBQkxFIDB4MDEgICAgICAgICAgICAvKiByZW1vdmFibGUgbWVkaWEgKi8KKyNkZWZpbmUgQlNEX0RfRUNDICAgICAgIDB4MDIgICAgICAgICAgICAvKiBzdXBwb3J0cyBFQ0MgKi8KKyNkZWZpbmUgQlNEX0RfQkFEU0VDVCAgIDB4MDQgICAgICAgICAgICAvKiBzdXBwb3J0cyBiYWQgc2VjdG9yIGZvcncuICovCisjZGVmaW5lIEJTRF9EX1JBTURJU0sgICAweDA4ICAgICAgICAgICAgLyogZGlzayBlbXVsYXRvciAqLworI2RlZmluZSBCU0RfRF9DSEFJTiAgICAgMHgxMCAgICAgICAgICAgIC8qIGNhbiBkbyBiYWNrLWJhY2sgdHJhbnNmZXJzICovCisjZGVmaW5lIEJTRF9EX0RPU1BBUlQgICAweDIwICAgICAgICAgICAgLyogd2l0aGluIE1TRE9TIHBhcnRpdGlvbiAqLworCisvKgorICAgQ2hhbmdlczoKKyAgIDE5OTkwMzE5IC0gQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IC0gaTE4bi9ubHMKKworICAgMjAwMDAxMDEgLSBEYXZpZCBIdWdnaW5zLURhaW5lcyA8ZGh1Z2dpbnNAbGludXhjYXJlLmNvbT4gLSBCZXR0ZXIKKyAgIHN1cHBvcnQgZm9yIE9TRi8xIGRpc2tsYWJlbHMgb24gQWxwaGEuCisgICBBbHNvIGZpeGVkIHVuYWxpZ25lZCBhY2Nlc3NlcyBpbiBhbHBoYV9ib290YmxvY2tfY2hlY2tzdW0oKQorKi8KKworI2RlZmluZSBGUkVFQlNEX1BBUlRJVElPTiAgICAgICAweGE1CisjZGVmaW5lIE5FVEJTRF9QQVJUSVRJT04gICAgICAgIDB4YTkKKworc3RhdGljIHZvaWQgeGJzZF9kZWxldGVfcGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIHhic2RfbmV3X3BhcnQodm9pZCk7CitzdGF0aWMgdm9pZCB4YnNkX3dyaXRlX2Rpc2tsYWJlbCh2b2lkKTsKK3N0YXRpYyBpbnQgeGJzZF9jcmVhdGVfZGlza2xhYmVsKHZvaWQpOworc3RhdGljIHZvaWQgeGJzZF9lZGl0X2Rpc2tsYWJlbCh2b2lkKTsKK3N0YXRpYyB2b2lkIHhic2Rfd3JpdGVfYm9vdHN0cmFwKHZvaWQpOworc3RhdGljIHZvaWQgeGJzZF9jaGFuZ2VfZnN0eXBlKHZvaWQpOworc3RhdGljIGludCB4YnNkX2dldF9wYXJ0X2luZGV4KGludCBtYXgpOworc3RhdGljIGludCB4YnNkX2NoZWNrX25ld19wYXJ0aXRpb24oaW50ICppKTsKK3N0YXRpYyB2b2lkIHhic2RfbGlzdF90eXBlcyh2b2lkKTsKK3N0YXRpYyB1aW50MTZfdCB4YnNkX2RrY2tzdW0oc3RydWN0IHhic2RfZGlza2xhYmVsICpscCk7CitzdGF0aWMgaW50IHhic2RfaW5pdGxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApOworc3RhdGljIGludCB4YnNkX3JlYWRsYWJlbChzdHJ1Y3QgcGFydGl0aW9uICpwKTsKK3N0YXRpYyBpbnQgeGJzZF93cml0ZWxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pCitzdGF0aWMgdm9pZCBhbHBoYV9ib290YmxvY2tfY2hlY2tzdW0oY2hhciAqYm9vdCk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKK3N0YXRpYyBpbnQgeGJzZF90cmFuc2xhdGVfZnN0eXBlKGludCBsaW51eF90eXBlKTsKK3N0YXRpYyB2b2lkIHhic2RfbGlua19wYXJ0KHZvaWQpOworc3RhdGljIHN0cnVjdCBwYXJ0aXRpb24gKnhic2RfcGFydDsKK3N0YXRpYyBpbnQgeGJzZF9wYXJ0X2luZGV4OworI2VuZGlmCisKKworLyogR3JvdXAgYmlnIGdsb2JhbHMgZGF0YSBhbmQgYWxsb2NhdGUgaXQgaW4gb25lIGdvICovCitzdHJ1Y3QgYnNkX2dsb2JhbHMgeworLyogV2UgYWNjZXNzIHRoaXMgdGhyb3VnaCBhIHVpbnQ2NF90ICogd2hlbiBjaGVja3N1bW1pbmcgKi8KKy8qIGhvcGVmdWxseSB4bWFsbG9jIGdpdmVzIHVzIHJlcXVpcmVkIGFsaWdubWVudCAqLworCWNoYXIgZGlza2xhYmVsYnVmZmVyW0JTRF9CQlNJWkVdOworCXN0cnVjdCB4YnNkX2Rpc2tsYWJlbCB4YnNkX2RsYWJlbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnNkX2dsb2JhbHMgKmJzZF9nbG9iYWxzX3B0cjsKKworI2RlZmluZSBkaXNrbGFiZWxidWZmZXIgKGJzZF9nbG9iYWxzX3B0ci0+ZGlza2xhYmVsYnVmZmVyKQorI2RlZmluZSB4YnNkX2RsYWJlbCAgICAgKGJzZF9nbG9iYWxzX3B0ci0+eGJzZF9kbGFiZWwpCisKKworLyogQ29kZSAqLworCisjZGVmaW5lIGJzZF9jcm91bmQobikgXAorCShkaXNwbGF5X2luX2N5bF91bml0cyA/ICgobikveGJzZF9kbGFiZWwuZF9zZWNwZXJjeWwpICsgMSA6IChuKSkKKworLyoKKyAqIFRlc3Qgd2hldGhlciB0aGUgd2hvbGUgZGlzayBoYXMgQlNEIGRpc2sgbGFiZWwgbWFnaWMuCisgKgorICogTm90ZTogb2Z0ZW4gcmVmb3JtYXR0aW5nIHdpdGggRE9TLXR5cGUgbGFiZWwgbGVhdmVzIHRoZSBCU0QgbWFnaWMsCisgKiBzbyB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGVyZSBpcyBhIEJTRCBkaXNrIGxhYmVsLgorICovCitzdGF0aWMgaW50CitjaGVja19vc2ZfbGFiZWwodm9pZCkKK3sKKwlpZiAoeGJzZF9yZWFkbGFiZWwoTlVMTCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2JzZF90cnlkZXYoY29uc3QgY2hhciAqIGRldikKK3sKKwlpZiAoeGJzZF9yZWFkbGFiZWwoTlVMTCkgPT0gMCkKKwkJcmV0dXJuIC0xOworCXByaW50ZigiXG5CU0QgbGFiZWwgZm9yIGRldmljZTogJXNcbiIsIGRldik7CisJeGJzZF9wcmludF9kaXNrbGFiZWwoMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitic2RfbWVudSh2b2lkKQoreworCXB1dHMoIkNvbW1hbmQgQWN0aW9uIik7CisJcHV0cygiZFx0ZGVsZXRlIGEgQlNEIHBhcnRpdGlvbiIpOworCXB1dHMoImVcdGVkaXQgZHJpdmUgZGF0YSIpOworCXB1dHMoImlcdGluc3RhbGwgYm9vdHN0cmFwIik7CisJcHV0cygibFx0bGlzdCBrbm93biBmaWxlc3lzdGVtIHR5cGVzIik7CisJcHV0cygiblx0YWRkIGEgbmV3IEJTRCBwYXJ0aXRpb24iKTsKKwlwdXRzKCJwXHRwcmludCBCU0QgcGFydGl0aW9uIHRhYmxlIik7CisJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJcHV0cygiclx0cmV0dXJuIHRvIG1haW4gbWVudSIpOworCXB1dHMoInNcdHNob3cgY29tcGxldGUgZGlza2xhYmVsIik7CisJcHV0cygidFx0Y2hhbmdlIGEgcGFydGl0aW9uJ3MgZmlsZXN5c3RlbSBpZCIpOworCXB1dHMoInVcdGNoYW5nZSB1bml0cyAoY3lsaW5kZXJzL3NlY3RvcnMpIik7CisJcHV0cygid1x0d3JpdGUgZGlza2xhYmVsIHRvIGRpc2siKTsKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pCisJcHV0cygieFx0bGluayBCU0QgcGFydGl0aW9uIHRvIG5vbi1CU0QgcGFydGl0aW9uIik7CisjZW5kaWYKK30KKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKK3N0YXRpYyBpbnQKK2hpZGRlbihpbnQgdHlwZSkKK3sKKwlyZXR1cm4gdHlwZSBeIDB4MTA7Cit9CisKK3N0YXRpYyBpbnQKK2lzX2JzZF9wYXJ0aXRpb25fdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gRlJFRUJTRF9QQVJUSVRJT04gfHwKKwkJdHlwZSA9PSBoaWRkZW4oRlJFRUJTRF9QQVJUSVRJT04pIHx8CisJCXR5cGUgPT0gTkVUQlNEX1BBUlRJVElPTiB8fAorCQl0eXBlID09IGhpZGRlbihORVRCU0RfUEFSVElUSU9OKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2JzZF9zZWxlY3Qodm9pZCkKK3sKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pCisJaW50IHQsIHNzOworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisKKwlmb3IgKHQgPSAwOyB0IDwgNDsgdCsrKSB7CisJCXAgPSBnZXRfcGFydF90YWJsZSh0KTsKKwkJaWYgKHAgJiYgaXNfYnNkX3BhcnRpdGlvbl90eXBlKHAtPnN5c19pbmQpKSB7CisJCQl4YnNkX3BhcnQgPSBwOworCQkJeGJzZF9wYXJ0X2luZGV4ID0gdDsKKwkJCXNzID0gZ2V0X3N0YXJ0X3NlY3QoeGJzZF9wYXJ0KTsKKwkJCWlmIChzcyA9PSAwKSB7CisJCQkJcHJpbnRmKCJQYXJ0aXRpb24gJXMgaGFzIGludmFsaWQgc3RhcnRpbmcgc2VjdG9yIDBcbiIsCisJCQkJCXBhcnRuYW1lKGRpc2tfZGV2aWNlLCB0KzEsIDApKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkJcHJpbnRmKCJSZWFkaW5nIGRpc2tsYWJlbCBvZiAlcyBhdCBzZWN0b3IgJXVcbiIsCisJCQkJCXBhcnRuYW1lKGRpc2tfZGV2aWNlLCB0KzEsIDApLCBzcyArIEJTRF9MQUJFTFNFQ1RPUik7CisJCQlpZiAoeGJzZF9yZWFkbGFiZWwoeGJzZF9wYXJ0KSA9PSAwKQorCQkJCWlmICh4YnNkX2NyZWF0ZV9kaXNrbGFiZWwoKSA9PSAwKQorCQkJCQlyZXR1cm47CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAodCA9PSA0KSB7CisJCXByaW50ZigiVGhlcmUgaXMgbm8gKkJTRCBwYXJ0aXRpb24gb24gJXNcbiIsIGRpc2tfZGV2aWNlKTsKKwkJcmV0dXJuOworCX0KKworI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCisKKwlpZiAoeGJzZF9yZWFkbGFiZWwoTlVMTCkgPT0gMCkKKwkJaWYgKHhic2RfY3JlYXRlX2Rpc2tsYWJlbCgpID09IDApCisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisKKyNlbmRpZgorCisJd2hpbGUgKDEpIHsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJc3dpdGNoICh0b2xvd2VyKHJlYWRfbm9uZW1wdHkoIkJTRCBkaXNrbGFiZWwgY29tbWFuZCAobSBmb3IgaGVscCk6ICIpKSkgeworCQljYXNlICdkJzoKKwkJCXhic2RfZGVsZXRlX3BhcnQoKTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCXhic2RfZWRpdF9kaXNrbGFiZWwoKTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXhic2Rfd3JpdGVfYm9vdHN0cmFwKCk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQl4YnNkX2xpc3RfdHlwZXMoKTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXhic2RfbmV3X3BhcnQoKTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXhic2RfcHJpbnRfZGlza2xhYmVsKDApOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWNsb3NlX2Rldl9mZCgpOworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQljYXNlICdyJzoKKwkJCXJldHVybjsKKwkJY2FzZSAncyc6CisJCQl4YnNkX3ByaW50X2Rpc2tsYWJlbCgxKTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXhic2RfY2hhbmdlX2ZzdHlwZSgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJY2hhbmdlX3VuaXRzKCk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl4YnNkX3dyaXRlX2Rpc2tsYWJlbCgpOworCQkJYnJlYWs7CisjaWYgIWRlZmluZWQoX19hbHBoYV9fKQorCQljYXNlICd4JzoKKwkJCXhic2RfbGlua19wYXJ0KCk7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJYnNkX21lbnUoKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAoreGJzZF9kZWxldGVfcGFydCh2b2lkKQoreworCWludCBpOworCisJaSA9IHhic2RfZ2V0X3BhcnRfaW5kZXgoeGJzZF9kbGFiZWwuZF9ucGFydGl0aW9ucyk7CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfc2l6ZSAgID0gMDsKKwl4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbaV0ucF9vZmZzZXQgPSAwOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX2ZzdHlwZSA9IEJTRF9GU19VTlVTRUQ7CisJaWYgKHhic2RfZGxhYmVsLmRfbnBhcnRpdGlvbnMgPT0gaSArIDEpCisJCXdoaWxlICh4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbeGJzZF9kbGFiZWwuZF9ucGFydGl0aW9ucy0xXS5wX3NpemUgPT0gMCkKKwkJCXhic2RfZGxhYmVsLmRfbnBhcnRpdGlvbnMtLTsKK30KKworc3RhdGljIHZvaWQKK3hic2RfbmV3X3BhcnQodm9pZCkKK3sKKwlvZmZfdCBiZWdpbiwgZW5kOworCWNoYXIgbWVzZ1syNTZdOworCWludCBpOworCisJaWYgKCF4YnNkX2NoZWNrX25ld19wYXJ0aXRpb24oJmkpKQorCQlyZXR1cm47CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChfX2hwcGFfXykKKwliZWdpbiA9IGdldF9zdGFydF9zZWN0KHhic2RfcGFydCk7CisJZW5kID0gYmVnaW4gKyBnZXRfbnJfc2VjdHMoeGJzZF9wYXJ0KSAtIDE7CisjZWxzZQorCWJlZ2luID0gMDsKKwllbmQgPSB4YnNkX2RsYWJlbC5kX3NlY3BlcnVuaXQgLSAxOworI2VuZGlmCisKKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJGaXJzdCAlcyIsIHN0cl91bml0cyhTSU5HVUxBUikpOworCWJlZ2luID0gcmVhZF9pbnQoYnNkX2Nyb3VuZChiZWdpbiksIGJzZF9jcm91bmQoYmVnaW4pLCBic2RfY3JvdW5kKGVuZCksCisJCTAsIG1lc2cpOworCisJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQliZWdpbiA9IChiZWdpbiAtIDEpICogeGJzZF9kbGFiZWwuZF9zZWNwZXJjeWw7CisKKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJMYXN0ICVzIG9yICtzaXplIG9yICtzaXplTSBvciArc2l6ZUsiLAorCQlzdHJfdW5pdHMoU0lOR1VMQVIpKTsKKwllbmQgPSByZWFkX2ludChic2RfY3JvdW5kKGJlZ2luKSwgYnNkX2Nyb3VuZChlbmQpLCBic2RfY3JvdW5kKGVuZCksCisJCWJzZF9jcm91bmQoYmVnaW4pLCBtZXNnKTsKKworCWlmIChkaXNwbGF5X2luX2N5bF91bml0cykKKwkJZW5kID0gZW5kICogeGJzZF9kbGFiZWwuZF9zZWNwZXJjeWwgLSAxOworCisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfc2l6ZSAgID0gZW5kIC0gYmVnaW4gKyAxOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX29mZnNldCA9IGJlZ2luOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX2ZzdHlwZSA9IEJTRF9GU19VTlVTRUQ7Cit9CisKK3N0YXRpYyB2b2lkCit4YnNkX3ByaW50X2Rpc2tsYWJlbChpbnQgc2hvd19hbGwpCit7CisJc3RydWN0IHhic2RfZGlza2xhYmVsICpscCA9ICZ4YnNkX2RsYWJlbDsKKwlzdHJ1Y3QgeGJzZF9wYXJ0aXRpb24gKnBwOworCWludCBpLCBqOworCisJaWYgKHNob3dfYWxsKSB7CisJCXN0YXRpYyBjb25zdCBpbnQgZF9tYXNrc1tdID0geyBCU0RfRF9SRU1PVkFCTEUsIEJTRF9EX0VDQywgQlNEX0RfQkFEU0VDVCB9OworCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisJCXByaW50ZigiIyAlczpcbiIsIGRpc2tfZGV2aWNlKTsKKyNlbHNlCisJCXByaW50ZigiIyAlczpcbiIsIHBhcnRuYW1lKGRpc2tfZGV2aWNlLCB4YnNkX3BhcnRfaW5kZXgrMSwgMCkpOworI2VuZGlmCisJCWlmICgodW5zaWduZWQpIGxwLT5kX3R5cGUgPCBBUlJBWV9TSVpFKHhic2RfZGt0eXBlbmFtZXMpLTEpCisJCQlwcmludGYoInR5cGU6ICVzXG4iLCB4YnNkX2RrdHlwZW5hbWVzW2xwLT5kX3R5cGVdKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJ0eXBlOiAldVxuIiwgbHAtPmRfdHlwZSk7CisJCXByaW50ZigiZGlzazogJS4qc1xuIiwgKGludCkgc2l6ZW9mKGxwLT5kX3R5cGVuYW1lKSwgbHAtPmRfdHlwZW5hbWUpOworCQlwcmludGYoImxhYmVsOiAlLipzXG4iLCAoaW50KSBzaXplb2YobHAtPmRfcGFja25hbWUpLCBscC0+ZF9wYWNrbmFtZSk7CisJCXByaW50ZigiZmxhZ3M6ICIpOworCQlwcmludF9mbGFnc19zZXBhcmF0ZWQoZF9tYXNrcywgInJlbW92YWJsZVwwIiJlY2NcMCIiYmFkc2VjdFwwIiwgbHAtPmRfZmxhZ3MsICIgIik7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCS8qIE9uIHZhcmlvdXMgbWFjaGluZXMgdGhlIGZpZWxkcyBvZiAqbHAgYXJlIHNob3J0L2ludC9sb25nICovCisJCS8qIEluIG9yZGVyIHRvIGF2b2lkIHByb2JsZW1zLCB3ZSBjYXN0IHRoZW0gYWxsIHRvIGxvbmcuICovCisJCXByaW50ZigiYnl0ZXMvc2VjdG9yOiAlbHVcbiIsIChsb25nKSBscC0+ZF9zZWNzaXplKTsKKwkJcHJpbnRmKCJzZWN0b3JzL3RyYWNrOiAlbHVcbiIsIChsb25nKSBscC0+ZF9uc2VjdG9ycyk7CisJCXByaW50ZigidHJhY2tzL2N5bGluZGVyOiAlbHVcbiIsIChsb25nKSBscC0+ZF9udHJhY2tzKTsKKwkJcHJpbnRmKCJzZWN0b3JzL2N5bGluZGVyOiAlbHVcbiIsIChsb25nKSBscC0+ZF9zZWNwZXJjeWwpOworCQlwcmludGYoImN5bGluZGVyczogJWx1XG4iLCAobG9uZykgbHAtPmRfbmN5bGluZGVycyk7CisJCXByaW50ZigicnBtOiAldVxuIiwgbHAtPmRfcnBtKTsKKwkJcHJpbnRmKCJpbnRlcmxlYXZlOiAldVxuIiwgbHAtPmRfaW50ZXJsZWF2ZSk7CisJCXByaW50ZigidHJhY2tza2V3OiAldVxuIiwgbHAtPmRfdHJhY2tza2V3KTsKKwkJcHJpbnRmKCJjeWxpbmRlcnNrZXc6ICV1XG4iLCBscC0+ZF9jeWxza2V3KTsKKwkJcHJpbnRmKCJoZWFkc3dpdGNoOiAlbHVcdFx0IyBtaWxsaXNlY29uZHNcbiIsCisJCQkobG9uZykgbHAtPmRfaGVhZHN3aXRjaCk7CisJCXByaW50ZigidHJhY2stdG8tdHJhY2sgc2VlazogJWx1XHQjIG1pbGxpc2Vjb25kc1xuIiwKKwkJCShsb25nKSBscC0+ZF90cmtzZWVrKTsKKwkJcHJpbnRmKCJkcml2ZWRhdGE6ICIpOworCQlmb3IgKGkgPSBORERBVEEgLSAxOyBpID49IDA7IGktLSkKKwkJCWlmIChscC0+ZF9kcml2ZWRhdGFbaV0pCisJCQkJYnJlYWs7CisJCWlmIChpIDwgMCkKKwkJCWkgPSAwOworCQlmb3IgKGogPSAwOyBqIDw9IGk7IGorKykKKwkJCXByaW50ZigiJWx1ICIsIChsb25nKSBscC0+ZF9kcml2ZWRhdGFbal0pOworCX0KKwlwcmludGYoIlxuJXUgcGFydGl0aW9uczpcbiIsIGxwLT5kX25wYXJ0aXRpb25zKTsKKwlwcmludGYoIiMgICAgICAgc3RhcnQgICAgICAgZW5kICAgICAgc2l6ZSAgICAgZnN0eXBlICAgW2ZzaXplIGJzaXplICAgY3BnXVxuIik7CisJcHAgPSBscC0+ZF9wYXJ0aXRpb25zOworCWZvciAoaSA9IDA7IGkgPCBscC0+ZF9ucGFydGl0aW9uczsgaSsrLCBwcCsrKSB7CisJCWlmIChwcC0+cF9zaXplKSB7CisJCQlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMgJiYgbHAtPmRfc2VjcGVyY3lsKSB7CisJCQkJcHJpbnRmKCIgICVjOiAlOGx1JWMgJThsdSVjICU4bHUlYyAgIiwKKwkJCQkJJ2EnICsgaSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIHBwLT5wX29mZnNldCAvIGxwLT5kX3NlY3BlcmN5bCArIDEsCisJCQkJCShwcC0+cF9vZmZzZXQgJSBscC0+ZF9zZWNwZXJjeWwpID8gJyonIDogJyAnLAorCQkJCQkodW5zaWduZWQgbG9uZykgKHBwLT5wX29mZnNldCArIHBwLT5wX3NpemUgKyBscC0+ZF9zZWNwZXJjeWwgLSAxKSAvIGxwLT5kX3NlY3BlcmN5bCwKKwkJCQkJKChwcC0+cF9vZmZzZXQgKyBwcC0+cF9zaXplKSAlIGxwLT5kX3NlY3BlcmN5bCkgPyAnKicgOiAnICcsCisJCQkJCShsb25nKSBwcC0+cF9zaXplIC8gbHAtPmRfc2VjcGVyY3lsLAorCQkJCQkocHAtPnBfc2l6ZSAlIGxwLT5kX3NlY3BlcmN5bCkgPyAnKicgOiAnICcKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIiAgJWM6ICU4bHUgICU4bHUgICU4bHUgICAiLAorCQkJCQknYScgKyBpLAorCQkJCQkobG9uZykgcHAtPnBfb2Zmc2V0LAorCQkJCQkobG9uZykgcHAtPnBfb2Zmc2V0ICsgcHAtPnBfc2l6ZSAtIDEsCisJCQkJCShsb25nKSBwcC0+cF9zaXplCisJCQkJKTsKKwkJCX0KKworCQkJaWYgKCh1bnNpZ25lZCkgcHAtPnBfZnN0eXBlIDwgQVJSQVlfU0laRSh4YnNkX2ZzdHlwZXMpLTEpCisJCQkJcHJpbnRmKCIlOC44cyIsIHhic2RfZnN0eXBlc1twcC0+cF9mc3R5cGVdKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiU4eCIsIHBwLT5wX2ZzdHlwZSk7CisKKwkJCXN3aXRjaCAocHAtPnBfZnN0eXBlKSB7CisJCQljYXNlIEJTRF9GU19VTlVTRUQ6CisJCQkJcHJpbnRmKCIgICAgJTVsdSAlNWx1ICU1LjVzICIsCisJCQkJCShsb25nKSBwcC0+cF9mc2l6ZSwgKGxvbmcpIHBwLT5wX2ZzaXplICogcHAtPnBfZnJhZywgIiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBCU0RfRlNfQlNERkZTOgorCQkJCXByaW50ZigiICAgICU1bHUgJTVsdSAlNXUgIiwKKwkJCQkJKGxvbmcpIHBwLT5wX2ZzaXplLCAobG9uZykgcHAtPnBfZnNpemUgKiBwcC0+cF9mcmFnLCBwcC0+cF9jcGcpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIiUyMi4yMnMiLCAiIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAoreGJzZF93cml0ZV9kaXNrbGFiZWwodm9pZCkKK3sKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlwcmludGYoIldyaXRpbmcgZGlza2xhYmVsIHRvICVzXG4iLCBkaXNrX2RldmljZSk7CisJeGJzZF93cml0ZWxhYmVsKE5VTEwpOworI2Vsc2UKKwlwcmludGYoIldyaXRpbmcgZGlza2xhYmVsIHRvICVzXG4iLAorCQlwYXJ0bmFtZShkaXNrX2RldmljZSwgeGJzZF9wYXJ0X2luZGV4ICsgMSwgMCkpOworCXhic2Rfd3JpdGVsYWJlbCh4YnNkX3BhcnQpOworI2VuZGlmCisJcmVyZWFkX3BhcnRpdGlvbl90YWJsZSgwKTsgICAgICAvKiBubyBleGl0IHlldCAqLworfQorCitzdGF0aWMgaW50Cit4YnNkX2NyZWF0ZV9kaXNrbGFiZWwodm9pZCkKK3sKKwljaGFyIGM7CisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlwcmludGYoIiVzIGNvbnRhaW5zIG5vIGRpc2tsYWJlbFxuIiwgZGlza19kZXZpY2UpOworI2Vsc2UKKwlwcmludGYoIiVzIGNvbnRhaW5zIG5vIGRpc2tsYWJlbFxuIiwKKwkJcGFydG5hbWUoZGlza19kZXZpY2UsIHhic2RfcGFydF9pbmRleCArIDEsIDApKTsKKyNlbmRpZgorCisJd2hpbGUgKDEpIHsKKwkJYyA9IHJlYWRfbm9uZW1wdHkoIkRvIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGRpc2tsYWJlbD8gKHkvbikgIik7CisJCWlmICgoY3wweDIwKSA9PSAneScpIHsKKwkJCWlmICh4YnNkX2luaXRsYWJlbCgKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX2hwcGFfXykgfHwgXAorCWRlZmluZWQoX19zMzkwX18pIHx8IGRlZmluZWQoX19zMzkweF9fKQorCQkJCU5VTEwKKyNlbHNlCisJCQkJeGJzZF9wYXJ0CisjZW5kaWYKKwkJCSkgPT0gMSkgeworCQkJCXhic2RfcHJpbnRfZGlza2xhYmVsKDEpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKChjfDB4MjApID09ICduJykKKwkJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludAorZWRpdF9pbnQoaW50IGRlZiwgY29uc3QgY2hhciAqbWVzZykKK3sKKwltZXNnID0geGFzcHJpbnRmKCIlcyAoJXUpOiAiLCBtZXNnLCBkZWYpOworCWRvIHsKKwkJaWYgKCFyZWFkX2xpbmUobWVzZykpCisJCQlnb3RvIHJldDsKKwl9IHdoaWxlICghaXNkaWdpdCgqbGluZV9wdHIpKTsKKwlkZWYgPSBhdG9pKGxpbmVfcHRyKTsKKyByZXQ6CisJZnJlZSgoY2hhciopbWVzZyk7CisJcmV0dXJuIGRlZjsKK30KKworc3RhdGljIHZvaWQKK3hic2RfZWRpdF9kaXNrbGFiZWwodm9pZCkKK3sKKwlzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwgKmQ7CisKKwlkID0gJnhic2RfZGxhYmVsOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19pYTY0X18pCisJZC0+ZF9zZWNzaXplICAgID0gZWRpdF9pbnQoZC0+ZF9zZWNzaXplICAgICAsICJieXRlcy9zZWN0b3IiKTsKKwlkLT5kX25zZWN0b3JzICAgPSBlZGl0X2ludChkLT5kX25zZWN0b3JzICAgICwgInNlY3RvcnMvdHJhY2siKTsKKwlkLT5kX250cmFja3MgICAgPSBlZGl0X2ludChkLT5kX250cmFja3MgICAgICwgInRyYWNrcy9jeWxpbmRlciIpOworCWQtPmRfbmN5bGluZGVycyA9IGVkaXRfaW50KGQtPmRfbmN5bGluZGVycyAgLCAiY3lsaW5kZXJzIik7CisjZW5kaWYKKworCS8qIGQtPmRfc2VjcGVyY3lsIGNhbiBiZSAhPSBkLT5kX25zZWN0b3JzICogZC0+ZF9udHJhY2tzICovCisJd2hpbGUgKDEpIHsKKwkJZC0+ZF9zZWNwZXJjeWwgPSBlZGl0X2ludChkLT5kX25zZWN0b3JzICogZC0+ZF9udHJhY2tzLAorCQkJCSJzZWN0b3JzL2N5bGluZGVyIik7CisJCWlmIChkLT5kX3NlY3BlcmN5bCA8PSBkLT5kX25zZWN0b3JzICogZC0+ZF9udHJhY2tzKQorCQkJYnJlYWs7CisKKwkJcHJpbnRmKCJNdXN0IGJlIDw9IHNlY3RvcnMvdHJhY2sgKiB0cmFja3MvY3lsaW5kZXIgKGRlZmF1bHQpXG4iKTsKKwl9CisJZC0+ZF9ycG0gICAgICAgID0gZWRpdF9pbnQoZC0+ZF9ycG0gICAgICAgLCAicnBtIik7CisJZC0+ZF9pbnRlcmxlYXZlID0gZWRpdF9pbnQoZC0+ZF9pbnRlcmxlYXZlLCAiaW50ZXJsZWF2ZSIpOworCWQtPmRfdHJhY2tza2V3ICA9IGVkaXRfaW50KGQtPmRfdHJhY2tza2V3ICwgInRyYWNrc2tldyIpOworCWQtPmRfY3lsc2tldyAgICA9IGVkaXRfaW50KGQtPmRfY3lsc2tldyAgICwgImN5bGluZGVyc2tldyIpOworCWQtPmRfaGVhZHN3aXRjaCA9IGVkaXRfaW50KGQtPmRfaGVhZHN3aXRjaCwgImhlYWRzd2l0Y2giKTsKKwlkLT5kX3Rya3NlZWsgICAgPSBlZGl0X2ludChkLT5kX3Rya3NlZWsgICAsICJ0cmFjay10by10cmFjayBzZWVrIik7CisKKwlkLT5kX3NlY3BlcnVuaXQgPSBkLT5kX3NlY3BlcmN5bCAqIGQtPmRfbmN5bGluZGVyczsKK30KKworc3RhdGljIGludAoreGJzZF9nZXRfYm9vdHN0cmFwKGNoYXIgKnBhdGgsIHZvaWQgKnB0ciwgaW50IHNpemUpCit7CisJaW50IGZkYjsKKworCWZkYiA9IG9wZW5fb3Jfd2FybihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkYiA8IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChmdWxsX3JlYWQoZmRiLCBwdHIsIHNpemUpIDwgMCkgeworCQliYl9zaW1wbGVfcGVycm9yX21zZyhwYXRoKTsKKwkJY2xvc2UoZmRiKTsKKwkJcmV0dXJuIDA7CisJfQorCXByaW50ZigiIC4uLiAlc1xuIiwgcGF0aCk7CisJY2xvc2UoZmRiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3N5bmNfZGlza3Modm9pZCkKK3sKKwlwcmludGYoIlN5bmNpbmcgZGlza3NcbiIpOworCXN5bmMoKTsKKwkvKiBzbGVlcCg0KTsgV2hhdD8gKi8KK30KKworc3RhdGljIHZvaWQKK3hic2Rfd3JpdGVfYm9vdHN0cmFwKHZvaWQpCit7CisJY2hhciBwYXRoW01BWFBBVEhMRU5dOworCWNvbnN0IGNoYXIgKmJvb3RkaXIgPSBCU0RfTElOVVhfQk9PVERJUjsKKwljb25zdCBjaGFyICpka2Jhc2VuYW1lOworCXN0cnVjdCB4YnNkX2Rpc2tsYWJlbCBkbDsKKwljaGFyICpkLCAqcCwgKmU7CisJaW50IHNlY3RvcjsKKworCWlmICh4YnNkX2RsYWJlbC5kX3R5cGUgPT0gQlNEX0RUWVBFX1NDU0kpCisJCWRrYmFzZW5hbWUgPSAic2QiOworCWVsc2UKKwkJZGtiYXNlbmFtZSA9ICJ3ZCI7CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICJCb290c3RyYXA6ICVzYm9vdCAtPiBib290JXMgKCVzKTogIiwKKwkJZGtiYXNlbmFtZSwgZGtiYXNlbmFtZSwgZGtiYXNlbmFtZSk7CisJaWYgKHJlYWRfbGluZShwYXRoKSkgeworCQlka2Jhc2VuYW1lID0gbGluZV9wdHI7CisJfQorCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLyVzYm9vdCIsIGJvb3RkaXIsIGRrYmFzZW5hbWUpOworCWlmICgheGJzZF9nZXRfYm9vdHN0cmFwKHBhdGgsIGRpc2tsYWJlbGJ1ZmZlciwgKGludCkgeGJzZF9kbGFiZWwuZF9zZWNzaXplKSkKKwkJcmV0dXJuOworCisvKiBXZSBuZWVkIGEgYmFja3VwIG9mIHRoZSBkaXNrbGFiZWwgKHhic2RfZGxhYmVsIG1pZ2h0IGhhdmUgY2hhbmdlZCkuICovCisJZCA9ICZkaXNrbGFiZWxidWZmZXJbQlNEX0xBQkVMU0VDVE9SICogU0VDVE9SX1NJWkVdOworCW1lbW1vdmUoJmRsLCBkLCBzaXplb2Yoc3RydWN0IHhic2RfZGlza2xhYmVsKSk7CisKKy8qIFRoZSBkaXNrbGFiZWwgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSAwJ3MgZnJvbSBib290eHggYW55d2F5ICovCisJbWVtc2V0KGQsIDAsIHNpemVvZihzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwpKTsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzL2Jvb3QlcyIsIGJvb3RkaXIsIGRrYmFzZW5hbWUpOworCWlmICgheGJzZF9nZXRfYm9vdHN0cmFwKHBhdGgsICZkaXNrbGFiZWxidWZmZXJbeGJzZF9kbGFiZWwuZF9zZWNzaXplXSwKKwkJCShpbnQpIHhic2RfZGxhYmVsLmRfYmJzaXplIC0geGJzZF9kbGFiZWwuZF9zZWNzaXplKSkKKwkJcmV0dXJuOworCisJZSA9IGQgKyBzaXplb2Yoc3RydWN0IHhic2RfZGlza2xhYmVsKTsKKwlmb3IgKHAgPSBkOyBwIDwgZTsgcCsrKQorCQlpZiAoKnApIHsKKwkJCXByaW50ZigiQm9vdHN0cmFwIG92ZXJsYXBzIHdpdGggZGlzayBsYWJlbCFcbiIpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisKKwltZW1tb3ZlKGQsICZkbCwgc2l6ZW9mKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCkpOworCisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX2hwcGFfXykKKwlzZWN0b3IgPSAwOworI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCisJc2VjdG9yID0gMDsKKwlhbHBoYV9ib290YmxvY2tfY2hlY2tzdW0oZGlza2xhYmVsYnVmZmVyKTsKKyNlbHNlCisJc2VjdG9yID0gZ2V0X3N0YXJ0X3NlY3QoeGJzZF9wYXJ0KTsKKyNlbmRpZgorCisJc2Vla19zZWN0b3Ioc2VjdG9yKTsKKwl4d3JpdGUoZGV2X2ZkLCBkaXNrbGFiZWxidWZmZXIsIEJTRF9CQlNJWkUpOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisJcHJpbnRmKCJCb290c3RyYXAgaW5zdGFsbGVkIG9uICVzXG4iLCBkaXNrX2RldmljZSk7CisjZWxzZQorCXByaW50ZigiQm9vdHN0cmFwIGluc3RhbGxlZCBvbiAlc1xuIiwKKwkJcGFydG5hbWUoZGlza19kZXZpY2UsIHhic2RfcGFydF9pbmRleCsxLCAwKSk7CisjZW5kaWYKKworCXN5bmNfZGlza3MoKTsKK30KKworc3RhdGljIHZvaWQKK3hic2RfY2hhbmdlX2ZzdHlwZSh2b2lkKQoreworCWludCBpOworCisJaSA9IHhic2RfZ2V0X3BhcnRfaW5kZXgoeGJzZF9kbGFiZWwuZF9ucGFydGl0aW9ucyk7CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfZnN0eXBlID0gcmVhZF9oZXgoeGJzZF9mc3R5cGVzKTsKK30KKworc3RhdGljIGludAoreGJzZF9nZXRfcGFydF9pbmRleChpbnQgbWF4KQoreworCWNoYXIgcHJvbXB0W3NpemVvZigiUGFydGl0aW9uIChhLSVjKTogIikgKyAxNl07CisJY2hhciBsOworCisJc25wcmludGYocHJvbXB0LCBzaXplb2YocHJvbXB0KSwgIlBhcnRpdGlvbiAoYS0lYyk6ICIsICdhJyArIG1heCAtIDEpOworCWRvCisJCWwgPSB0b2xvd2VyKHJlYWRfbm9uZW1wdHkocHJvbXB0KSk7CisJd2hpbGUgKGwgPCAnYScgfHwgbCA+ICdhJyArIG1heCAtIDEpOworCXJldHVybiBsIC0gJ2EnOworfQorCitzdGF0aWMgaW50Cit4YnNkX2NoZWNrX25ld19wYXJ0aXRpb24oaW50ICppKQoreworCS8qIHJvb20gZm9yIG1vcmU/IHZhcmlvdXMgQlNEIGZsYXZvdXJzIGhhdmUgZGlmZmVyZW50IG1heGltYSAqLworCWlmICh4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zID09IEJTRF9NQVhQQVJUSVRJT05TKSB7CisJCWludCB0OworCisJCWZvciAodCA9IDA7IHQgPCBCU0RfTUFYUEFSVElUSU9OUzsgdCsrKQorCQkJaWYgKHhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1t0XS5wX3NpemUgPT0gMCkKKwkJCQlicmVhazsKKworCQlpZiAodCA9PSBCU0RfTUFYUEFSVElUSU9OUykgeworCQkJcHJpbnRmKCJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9ucyBoYXMgYmVlbiBjcmVhdGVkXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJKmkgPSB4YnNkX2dldF9wYXJ0X2luZGV4KEJTRF9NQVhQQVJUSVRJT05TKTsKKworCWlmICgqaSA+PSB4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zKQorCQl4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zID0gKCppKSArIDE7CisKKwlpZiAoeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zWyppXS5wX3NpemUgIT0gMCkgeworCQlwcmludGYoIlRoaXMgcGFydGl0aW9uIGFscmVhZHkgZXhpc3RzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCit4YnNkX2xpc3RfdHlwZXModm9pZCkKK3sKKwlsaXN0X3R5cGVzKHhic2RfZnN0eXBlcyk7Cit9CisKK3N0YXRpYyB1aW50MTZfdAoreGJzZF9ka2Nrc3VtKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCAqbHApCit7CisJdWludDE2X3QgKnN0YXJ0LCAqZW5kOworCXVpbnQxNl90IHN1bSA9IDA7CisKKwlzdGFydCA9ICh1aW50MTZfdCAqKSBscDsKKwllbmQgPSAodWludDE2X3QgKikgJmxwLT5kX3BhcnRpdGlvbnNbbHAtPmRfbnBhcnRpdGlvbnNdOworCXdoaWxlIChzdGFydCA8IGVuZCkKKwkJc3VtIF49ICpzdGFydCsrOworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQKK3hic2RfaW5pdGxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApCit7CisJc3RydWN0IHhic2RfZGlza2xhYmVsICpkID0gJnhic2RfZGxhYmVsOworCXN0cnVjdCB4YnNkX3BhcnRpdGlvbiAqcHA7CisKKwlnZXRfZ2VvbWV0cnkoKTsKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCkpOworCisJZC0+ZF9tYWdpYyA9IEJTRF9ESVNLTUFHSUM7CisKKwlpZiAoc3RybmNtcChkaXNrX2RldmljZSwgIi9kZXYvc2QiLCA3KSA9PSAwKQorCQlkLT5kX3R5cGUgPSBCU0RfRFRZUEVfU0NTSTsKKwllbHNlCisJCWQtPmRfdHlwZSA9IEJTRF9EVFlQRV9TVDUwNjsKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKKwlkLT5kX2ZsYWdzID0gQlNEX0RfRE9TUEFSVDsKKyNlbHNlCisJZC0+ZF9mbGFncyA9IDA7CisjZW5kaWYKKwlkLT5kX3NlY3NpemUgPSBTRUNUT1JfU0laRTsgICAgICAgICAgIC8qIGJ5dGVzL3NlY3RvciAgKi8KKwlkLT5kX25zZWN0b3JzID0gZ19zZWN0b3JzOyAgICAgICAgICAgIC8qIHNlY3RvcnMvdHJhY2sgKi8KKwlkLT5kX250cmFja3MgPSBnX2hlYWRzOyAgICAgICAgICAgICAgIC8qIHRyYWNrcy9jeWxpbmRlciAoaGVhZHMpICovCisJZC0+ZF9uY3lsaW5kZXJzID0gZ19jeWxpbmRlcnM7CisJZC0+ZF9zZWNwZXJjeWwgID0gZ19zZWN0b3JzICogZ19oZWFkczsvKiBzZWN0b3JzL2N5bGluZGVyICovCisJaWYgKGQtPmRfc2VjcGVyY3lsID09IDApCisJCWQtPmRfc2VjcGVyY3lsID0gMTsgICAgICAgICAgIC8qIGF2b2lkIHNlZ2ZhdWx0cyAqLworCWQtPmRfc2VjcGVydW5pdCA9IGQtPmRfc2VjcGVyY3lsICogZC0+ZF9uY3lsaW5kZXJzOworCisJZC0+ZF9ycG0gPSAzNjAwOworCWQtPmRfaW50ZXJsZWF2ZSA9IDE7CisJZC0+ZF90cmFja3NrZXcgPSAwOworCWQtPmRfY3lsc2tldyA9IDA7CisJZC0+ZF9oZWFkc3dpdGNoID0gMDsKKwlkLT5kX3Rya3NlZWsgPSAwOworCisJZC0+ZF9tYWdpYzIgPSBCU0RfRElTS01BR0lDOworCWQtPmRfYmJzaXplID0gQlNEX0JCU0laRTsKKwlkLT5kX3Nic2l6ZSA9IEJTRF9TQlNJWkU7CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pCisJZC0+ZF9ucGFydGl0aW9ucyA9IDQ7CisJcHAgPSAmZC0+ZF9wYXJ0aXRpb25zWzJdOyAvKiBQYXJ0aXRpb24gQyBzaG91bGQgYmUgTmV0QlNEIHBhcnRpdGlvbiAqLworCisJcHAtPnBfb2Zmc2V0ID0gZ2V0X3N0YXJ0X3NlY3QocCk7CisJcHAtPnBfc2l6ZSAgID0gZ2V0X25yX3NlY3RzKHApOworCXBwLT5wX2ZzdHlwZSA9IEJTRF9GU19VTlVTRUQ7CisJcHAgPSAmZC0+ZF9wYXJ0aXRpb25zWzNdOyAvKiBQYXJ0aXRpb24gRCBzaG91bGQgYmUgd2hvbGUgZGlzayAqLworCisJcHAtPnBfb2Zmc2V0ID0gMDsKKwlwcC0+cF9zaXplICAgPSBkLT5kX3NlY3BlcnVuaXQ7CisJcHAtPnBfZnN0eXBlID0gQlNEX0ZTX1VOVVNFRDsKKyNlbHNlCisJZC0+ZF9ucGFydGl0aW9ucyA9IDM7CisJcHAgPSAmZC0+ZF9wYXJ0aXRpb25zWzJdOyAgICAgICAgICAgICAvKiBQYXJ0aXRpb24gQyBzaG91bGQgYmUKKwkJCQkJCSAgIHRoZSB3aG9sZSBkaXNrICovCisJcHAtPnBfb2Zmc2V0ID0gMDsKKwlwcC0+cF9zaXplICAgPSBkLT5kX3NlY3BlcnVuaXQ7CisJcHAtPnBfZnN0eXBlID0gQlNEX0ZTX1VOVVNFRDsKKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZWFkIGEgeGJzZF9kaXNrbGFiZWwgZnJvbSBzZWN0b3IgMCBvciBmcm9tIHRoZSBzdGFydGluZyBzZWN0b3Igb2YgcC4KKyAqIElmIGl0IGhhcyB0aGUgcmlnaHQgbWFnaWMsIHJldHVybiAxLgorICovCitzdGF0aWMgaW50Cit4YnNkX3JlYWRsYWJlbChzdHJ1Y3QgcGFydGl0aW9uICpwKQoreworCXN0cnVjdCB4YnNkX2Rpc2tsYWJlbCAqZDsKKwlpbnQgdCwgc2VjdG9yOworCisJaWYgKCFic2RfZ2xvYmFsc19wdHIpCisJCWJzZF9nbG9iYWxzX3B0ciA9IHh6YWxsb2Moc2l6ZW9mKCpic2RfZ2xvYmFsc19wdHIpKTsKKworCWQgPSAmeGJzZF9kbGFiZWw7CisKKwkvKiBwIGlzIHVzZWQgb25seSB0byBnZXQgdGhlIHN0YXJ0aW5nIHNlY3RvciAqLworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKKwlzZWN0b3IgPSAocCA/IGdldF9zdGFydF9zZWN0KHApIDogMCk7CisjZWxzZQorCXNlY3RvciA9IDA7CisjZW5kaWYKKworCXNlZWtfc2VjdG9yKHNlY3Rvcik7CisJaWYgKEJTRF9CQlNJWkUgIT0gZnVsbF9yZWFkKGRldl9mZCwgZGlza2xhYmVsYnVmZmVyLCBCU0RfQkJTSVpFKSkKKwkJZmRpc2tfZmF0YWwodW5hYmxlX3RvX3JlYWQpOworCisJbWVtbW92ZShkLCAmZGlza2xhYmVsYnVmZmVyW0JTRF9MQUJFTFNFQ1RPUiAqIFNFQ1RPUl9TSVpFICsgQlNEX0xBQkVMT0ZGU0VUXSwKKwkJICAgc2l6ZW9mKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCkpOworCisJaWYgKGQtPmRfbWFnaWMgIT0gQlNEX0RJU0tNQUdJQyB8fCBkLT5kX21hZ2ljMiAhPSBCU0RfRElTS01BR0lDKQorCQlyZXR1cm4gMDsKKworCWZvciAodCA9IGQtPmRfbnBhcnRpdGlvbnM7IHQgPCBCU0RfTUFYUEFSVElUSU9OUzsgdCsrKSB7CisJCWQtPmRfcGFydGl0aW9uc1t0XS5wX3NpemUgICA9IDA7CisJCWQtPmRfcGFydGl0aW9uc1t0XS5wX29mZnNldCA9IDA7CisJCWQtPmRfcGFydGl0aW9uc1t0XS5wX2ZzdHlwZSA9IEJTRF9GU19VTlVTRUQ7CisJfQorCisJaWYgKGQtPmRfbnBhcnRpdGlvbnMgPiBCU0RfTUFYUEFSVElUSU9OUykKKwkJcHJpbnRmKCJXYXJuaW5nOiB0b28gbWFueSBwYXJ0aXRpb25zICgldSwgbWF4aW11bSBpcyAldSlcbiIsCisJCQlkLT5kX25wYXJ0aXRpb25zLCBCU0RfTUFYUEFSVElUSU9OUyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3hic2Rfd3JpdGVsYWJlbChzdHJ1Y3QgcGFydGl0aW9uICpwKQoreworCXN0cnVjdCB4YnNkX2Rpc2tsYWJlbCAqZCA9ICZ4YnNkX2RsYWJlbDsKKwl1bnNpZ25lZCBpbnQgc2VjdG9yOworCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX3Bvd2VycGNfXykgJiYgIWRlZmluZWQoX19ocHBhX18pCisJc2VjdG9yID0gZ2V0X3N0YXJ0X3NlY3QocCkgKyBCU0RfTEFCRUxTRUNUT1I7CisjZWxzZQorCSh2b2lkKXA7IC8qIHNpbGVuY2Ugd2FybmluZyAqLworCXNlY3RvciA9IEJTRF9MQUJFTFNFQ1RPUjsKKyNlbmRpZgorCisJZC0+ZF9jaGVja3N1bSA9IDA7CisJZC0+ZF9jaGVja3N1bSA9IHhic2RfZGtja3N1bShkKTsKKworCS8qIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIHdlIHdhbnQgdG8gd3JpdGUgdGhlIGJvb3RzdHJhcCBsYXRlciwKKwkgICBvdGhlcndpc2Ugd2UnZCB3cml0ZSB0aGUgb2xkIGRpc2tsYWJlbCB3aXRoIHRoZSBib290c3RyYXAuCisJKi8KKwltZW1tb3ZlKCZkaXNrbGFiZWxidWZmZXJbQlNEX0xBQkVMU0VDVE9SICogU0VDVE9SX1NJWkUgKyBCU0RfTEFCRUxPRkZTRVRdLAorCQlkLCBzaXplb2Yoc3RydWN0IHhic2RfZGlza2xhYmVsKSk7CisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgJiYgQlNEX0xBQkVMU0VDVE9SID09IDAKKwlhbHBoYV9ib290YmxvY2tfY2hlY2tzdW0oZGlza2xhYmVsYnVmZmVyKTsKKwlzZWVrX3NlY3RvcigwKTsKKwl4d3JpdGUoZGV2X2ZkLCBkaXNrbGFiZWxidWZmZXIsIEJTRF9CQlNJWkUpOworI2Vsc2UKKwlzZWVrX3NlY3RvcihzZWN0b3IpOworCWxzZWVrKGRldl9mZCwgQlNEX0xBQkVMT0ZGU0VULCBTRUVLX0NVUik7CisJeHdyaXRlKGRldl9mZCwgZCwgc2l6ZW9mKCpkKSk7CisjZW5kaWYKKwlzeW5jX2Rpc2tzKCk7CisJcmV0dXJuIDE7Cit9CisKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKK3N0YXRpYyBpbnQKK3hic2RfdHJhbnNsYXRlX2ZzdHlwZShpbnQgbGludXhfdHlwZSkKK3sKKwlzd2l0Y2ggKGxpbnV4X3R5cGUpIHsKKwljYXNlIDB4MDE6IC8qIERPUyAxMi1iaXQgRkFUICAgKi8KKwljYXNlIDB4MDQ6IC8qIERPUyAxNi1iaXQgPDMyTSAgKi8KKwljYXNlIDB4MDY6IC8qIERPUyAxNi1iaXQgPj0zMk0gKi8KKwljYXNlIDB4ZTE6IC8qIERPUyBhY2Nlc3MgICAgICAgKi8KKwljYXNlIDB4ZTM6IC8qIERPUyBSL08gICAgICAgICAgKi8KKwljYXNlIDB4ZjI6IC8qIERPUyBzZWNvbmRhcnkgICAgKi8KKwkJcmV0dXJuIEJTRF9GU19NU0RPUzsKKwljYXNlIDB4MDc6IC8qIE9TLzIgSFBGUyAgICAgICAgKi8KKwkJcmV0dXJuIEJTRF9GU19IUEZTOworCWRlZmF1bHQ6CisJCXJldHVybiBCU0RfRlNfT1RIRVI7CisJfQorfQorCitzdGF0aWMgdm9pZAoreGJzZF9saW5rX3BhcnQodm9pZCkKK3sKKwlpbnQgaywgaTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwOworCisJayA9IGdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKTsKKworCWlmICgheGJzZF9jaGVja19uZXdfcGFydGl0aW9uKCZpKSkKKwkJcmV0dXJuOworCisJcCA9IGdldF9wYXJ0X3RhYmxlKGspOworCisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfc2l6ZSAgID0gZ2V0X25yX3NlY3RzKHApOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX29mZnNldCA9IGdldF9zdGFydF9zZWN0KHApOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX2ZzdHlwZSA9IHhic2RfdHJhbnNsYXRlX2ZzdHlwZShwLT5zeXNfaW5kKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2FscGhhX18pCitzdGF0aWMgdm9pZAorYWxwaGFfYm9vdGJsb2NrX2NoZWNrc3VtKGNoYXIgKmJvb3QpCit7CisJdWludDY0X3QgKmRwLCBzdW07CisJaW50IGk7CisKKwlkcCA9ICh1aW50NjRfdCAqKWJvb3Q7CisJc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNjM7IGkrKykKKwkJc3VtICs9IGRwW2ldOworCWRwWzYzXSA9IHN1bTsKK30KKyNlbmRpZiAvKiBfX2FscGhhX18gKi8KKworLyogVW5kZWZpbmUgJ2dsb2JhbCcgdHJpY2tzICovCisjdW5kZWYgZGlza2xhYmVsYnVmZmVyCisjdW5kZWYgeGJzZF9kbGFiZWwKKworI2VuZGlmIC8qIE9TRl9MQUJFTCAqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19zZ2kuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvZmRpc2tfc2dpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZmM2NgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvZmRpc2tfc2dpLmMKQEAgLTAsMCArMSw4ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJlYXMgTmV1cGVyLCBTZXAgMTk5OC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TR0lfTEFCRUwKKworI2RlZmluZSBTR0lfREVCVUcgMAorCisjZGVmaW5lIFNHSV9WT0xIRFIgICAgICAweDAwCisvKiAxIGFuZCAyIHdlcmUgdXNlZCBmb3IgZHJpdmUgdHlwZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBTR0kgKi8KKyNkZWZpbmUgU0dJX1NXQVAgICAgICAgIDB4MDMKKy8qIDQgYW5kIDUgd2VyZSBmb3IgZmlsZXN5c3RlbSB0eXBlcyBTR0kgaGF2ZW4ndCBldmVyIHN1cHBvcnRlZCBvbiBNSVBTIENQVXMgKi8KKyNkZWZpbmUgU0dJX1ZPTFVNRSAgICAgIDB4MDYKKyNkZWZpbmUgU0dJX0VGUyAgICAgICAgIDB4MDcKKyNkZWZpbmUgU0dJX0xWT0wgICAgICAgIDB4MDgKKyNkZWZpbmUgU0dJX1JMVk9MICAgICAgIDB4MDkKKyNkZWZpbmUgU0dJX1hGUyAgICAgICAgIDB4MGEKKyNkZWZpbmUgU0dJX1hGU0xPRyAgICAgIDB4MGIKKyNkZWZpbmUgU0dJX1hMViAgICAgICAgIDB4MGMKKyNkZWZpbmUgU0dJX1hWTSAgICAgICAgIDB4MGQKKyNkZWZpbmUgU0dJX0VOVElSRV9ESVNLIFNHSV9WT0xVTUUKKworc3RydWN0IGRldmljZV9wYXJhbWV0ZXIgeyAvKiA0OCBieXRlcyAqLworCXVuc2lnbmVkIGNoYXIgIHNrZXc7CisJdW5zaWduZWQgY2hhciAgZ2FwMTsKKwl1bnNpZ25lZCBjaGFyICBnYXAyOworCXVuc2lnbmVkIGNoYXIgIHNwYXJlY3lsOworCXVuc2lnbmVkIHNob3J0IHBjeWxjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBoZWFkX3ZvbDA7CisJdW5zaWduZWQgc2hvcnQgbnRya3M7ICAgLyogdHJhY2tzIGluIGN5bCAwIG9yIHZvbCAwICovCisJdW5zaWduZWQgY2hhciAgY21kX3RhZ19xdWV1ZV9kZXB0aDsKKwl1bnNpZ25lZCBjaGFyICB1bnVzZWQwOworCXVuc2lnbmVkIHNob3J0IHVudXNlZDE7CisJdW5zaWduZWQgc2hvcnQgbnNlY3Q7ICAgLyogc2VjdG9ycy90cmFja3MgaW4gY3lsIDAgb3Igdm9sIDAgKi8KKwl1bnNpZ25lZCBzaG9ydCBieXRlczsKKwl1bnNpZ25lZCBzaG9ydCBpbGZhY3Q7CisJdW5zaWduZWQgaW50ICAgZmxhZ3M7ICAgLyogY29udHJvbGxlciBmbGFncyAqLworCXVuc2lnbmVkIGludCAgIGRhdGFyYXRlOworCXVuc2lnbmVkIGludCAgIHJldHJpZXNfb25fZXJyb3I7CisJdW5zaWduZWQgaW50ICAgbXNfcGVyX3dvcmQ7CisJdW5zaWduZWQgc2hvcnQgeHlsb2dpY3NfZ2FwMTsKKwl1bnNpZ25lZCBzaG9ydCB4eWxvZ2ljc19zeW5jZGVsYXk7CisJdW5zaWduZWQgc2hvcnQgeHlsb2dpY3NfcmVhZGRlbGF5OworCXVuc2lnbmVkIHNob3J0IHh5bG9naWNzX2dhcDI7CisJdW5zaWduZWQgc2hvcnQgeHlsb2dpY3NfcmVhZGdhdGU7CisJdW5zaWduZWQgc2hvcnQgeHlsb2dpY3Nfd3JpdGVjb250OworfTsKKworLyoKKyAqIGNvbnRyb2xsZXIgZmxhZ3MKKyAqLworI2RlZmluZSBTRUNUT1JfU0xJUCAgICAgMHgwMQorI2RlZmluZSBTRUNUT1JfRldEICAgICAgMHgwMgorI2RlZmluZSBUUkFDS19GV0QgICAgICAgMHgwNAorI2RlZmluZSBUUkFDS19NVUxUSVZPTCAgMHgwOAorI2RlZmluZSBJR05PUkVfRVJST1JTICAgMHgxMAorI2RlZmluZSBSRVNFRUsgICAgICAgICAgMHgyMAorI2RlZmluZSBFTkFCTEVfQ01EVEFHUSAgMHg0MAorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50ICAgbWFnaWM7ICAgICAgICAgICAgLyogZXhwZWN0IFNHSV9MQUJFTF9NQUdJQyAqLworCXVuc2lnbmVkIHNob3J0IGJvb3RfcGFydDsgICAgICAgIC8qIGFjdGl2ZSBib290IHBhcnRpdGlvbiAqLworCXVuc2lnbmVkIHNob3J0IHN3YXBfcGFydDsgICAgICAgIC8qIGFjdGl2ZSBzd2FwIHBhcnRpdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgIGJvb3RfZmlsZVsxNl07ICAgIC8qIG5hbWUgb2YgdGhlIGJvb3RmaWxlICovCisJc3RydWN0IGRldmljZV9wYXJhbWV0ZXIgZGV2cGFyYW07ICAgICAgIC8qICAxICogNDggYnl0ZXMgKi8KKwlzdHJ1Y3Qgdm9sdW1lX2RpcmVjdG9yeSB7ICAgICAgICAgICAgICAgLyogMTUgKiAxNiBieXRlcyAqLworCQl1bnNpZ25lZCBjaGFyIHZvbF9maWxlX25hbWVbOF07IC8qIGEgY2hhcmFjdGVyIGFycmF5ICovCisJCXVuc2lnbmVkIGludCAgdm9sX2ZpbGVfc3RhcnQ7ICAgLyogbnVtYmVyIG9mIGxvZ2ljYWwgYmxvY2sgKi8KKwkJdW5zaWduZWQgaW50ICB2b2xfZmlsZV9zaXplOyAgICAvKiBudW1iZXIgb2YgYnl0ZXMgKi8KKwl9IGRpcmVjdG9yeVsxNV07CisJc3RydWN0IHNnaV9wYXJ0aW5mbyB7ICAgICAgICAgICAgICAgICAgIC8qIDE2ICogMTIgYnl0ZXMgKi8KKwkJdW5zaWduZWQgaW50IG51bV9zZWN0b3JzOyAgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzICovCisJCXVuc2lnbmVkIGludCBzdGFydF9zZWN0b3I7ICAgICAgLyogbXVzdCBiZSBjeWxpbmRlciBhbGlnbmVkICovCisJCXVuc2lnbmVkIGludCBpZDsKKwl9IHBhcnRpdGlvbnNbMTZdOworCXVuc2lnbmVkIGludCAgIGNzdW07CisJdW5zaWduZWQgaW50ICAgZmlsbGJ5dGVzOworfSBzZ2lfcGFydGl0aW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50ICAgbWFnaWM7ICAgICAgICAgICAvKiBsb29rcyBsaWtlIGEgbWFnaWMgbnVtYmVyICovCisJdW5zaWduZWQgaW50ICAgYTI7CisJdW5zaWduZWQgaW50ICAgYTM7CisJdW5zaWduZWQgaW50ICAgYTQ7CisJdW5zaWduZWQgaW50ICAgYjE7CisJdW5zaWduZWQgc2hvcnQgYjI7CisJdW5zaWduZWQgc2hvcnQgYjM7CisJdW5zaWduZWQgaW50ICAgY1sxNl07CisJdW5zaWduZWQgc2hvcnQgZFszXTsKKwl1bnNpZ25lZCBjaGFyICBzY3NpX3N0cmluZ1s1MF07CisJdW5zaWduZWQgY2hhciAgc2VyaWFsWzEzN107CisJdW5zaWduZWQgc2hvcnQgY2hlY2sxODE2OworCXVuc2lnbmVkIGNoYXIgIGluc3RhbGxlclsyMjVdOworfSBzZ2lpbmZvOworCisjZGVmaW5lIFNHSV9MQUJFTF9NQUdJQyAgICAgICAgIDB4MGJlNWE5NDEKKyNkZWZpbmUgU0dJX0xBQkVMX01BR0lDX1NXQVBQRUQgMHg0MWE5ZTUwYgorI2RlZmluZSBTR0lfSU5GT19NQUdJQyAgICAgICAgICAweDAwMDcyOTU5CisjZGVmaW5lIFNHSV9JTkZPX01BR0lDX1NXQVBQRUQgIDB4NTkyOTA3MDAKKworI2RlZmluZSBTR0lfU1NXQVAxNih4KSAoc2dpX290aGVyX2VuZGlhbiA/IGZkaXNrX3N3YXAxNih4KSA6ICh1aW50MTZfdCkoeCkpCisjZGVmaW5lIFNHSV9TU1dBUDMyKHgpIChzZ2lfb3RoZXJfZW5kaWFuID8gZmRpc2tfc3dhcDMyKHgpIDogKHVpbnQzMl90KSh4KSkKKworI2RlZmluZSBzZ2lsYWJlbCAoKHNnaV9wYXJ0aXRpb24gKilNQlJidWZmZXIpCisjZGVmaW5lIHNnaXBhcmFtIChzZ2lsYWJlbC0+ZGV2cGFyYW0pCisKKy8qCisgKgorICogZmRpc2tzZ2lsYWJlbC5jCisgKgorICogQ29weXJpZ2h0IChDKSBBbmRyZWFzIE5ldXBlciwgU2VwIDE5OTguCisgKiAgICAgIFRoaXMgZmlsZSBtYXkgYmUgbW9kaWZpZWQgYW5kIHJlZGlzdHJpYnV0ZWQgdW5kZXIKKyAqICAgICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UuCisgKgorICogU2F0IE1hciAyMCBFU1QgMTk5OSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqICAgICAgSW50ZXJuYXRpb25hbGl6YXRpb24KKyAqLworCisKK3N0YXRpYyBzbWFsbGludCBzZ2lfb3RoZXJfZW5kaWFuOyAvKiBib29sICovCitzdGF0aWMgc21hbGxpbnQgc2dpX3ZvbHVtZXMgPSAxOyAvKiBtYXggMTUgKi8KKworLyoKKyAqIG9ubHkgZGVhbGluZyB3aXRoIGZyZWUgYmxvY2tzIGhlcmUKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGZpcnN0OworCXVuc2lnbmVkIGludCBsYXN0OworfSBmcmVlYmxvY2tzOworc3RhdGljIGZyZWVibG9ja3MgZnJlZWxpc3RbMTddOyAvKiAxNiBwYXJ0aXRpb25zIGNhbiBwcm9kdWNlIDE3IHZhY2FudCBzbG90cyAqLworCitzdGF0aWMgdm9pZAorc2V0ZnJlZWxpc3QoaW50IGksIHVuc2lnbmVkIGludCBmLCB1bnNpZ25lZCBpbnQgbCkKK3sKKwlmcmVlbGlzdFtpXS5maXJzdCA9IGY7CisJZnJlZWxpc3RbaV0ubGFzdCA9IGw7Cit9CisKK3N0YXRpYyB2b2lkCithZGQyZnJlZWxpc3QodW5zaWduZWQgaW50IGYsIHVuc2lnbmVkIGludCBsKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKQorCQlpZiAoZnJlZWxpc3RbaV0ubGFzdCA9PSAwKQorCQkJYnJlYWs7CisJc2V0ZnJlZWxpc3QoaSwgZiwgbCk7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhcmZyZWVsaXN0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKKwkJc2V0ZnJlZWxpc3QoaSwgMCwgMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lzaW5mcmVlbGlzdCh1bnNpZ25lZCBpbnQgYikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKQorCQlpZiAoZnJlZWxpc3RbaV0uZmlyc3QgPD0gYiAmJiBmcmVlbGlzdFtpXS5sYXN0ID49IGIpCisJCQlyZXR1cm4gZnJlZWxpc3RbaV0ubGFzdDsKKwlyZXR1cm4gMDsKK30KKwkvKiByZXR1cm4gbGFzdCB2YWNhbnQgYmxvY2sgb2YgdGhpcyBzdHJpZGUgKG5ldmVyIDApLiAqLworCS8qIHRoZSAnPj0nIGlzIG5vdCBxdWl0ZSBjb3JyZWN0LCBidXQgc2ltcGxpZmllcyB0aGUgY29kZSAqLworLyoKKyAqIGVuZCBvZiBmcmVlIGJsb2NrcyBzZWN0aW9uCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNnaV9zeXNfdHlwZXNbXSA9IHsKKy8qIFNHSV9WT0xIRFIgICAqLwkiXHgwMCIgIlNHSSB2b2xoZHIiICAsCisvKiAweDAxICAgICAgICAgKi8JIlx4MDEiICJTR0kgdHJrcmVwbCIgLAorLyogMHgwMiAgICAgICAgICovCSJceDAyIiAiU0dJIHNlY3JlcGwiICwKKy8qIFNHSV9TV0FQICAgICAqLwkiXHgwMyIgIlNHSSByYXciICAgICAsCisvKiAweDA0ICAgICAgICAgKi8JIlx4MDQiICJTR0kgYnNkIiAgICAgLAorLyogMHgwNSAgICAgICAgICovCSJceDA1IiAiU0dJIHN5c3YiICAgICwKKy8qIFNHSV9FTlRJUkVfRElTSyAgKi8JIlx4MDYiICJTR0kgdm9sdW1lIiAgLAorLyogU0dJX0VGUyAgICAgICovCSJceDA3IiAiU0dJIGVmcyIgICAgICwKKy8qIDB4MDggICAgICAgICAqLwkiXHgwOCIgIlNHSSBsdm9sIiAgICAsCisvKiAweDA5ICAgICAgICAgKi8JIlx4MDkiICJTR0kgcmx2b2wiICAgLAorLyogU0dJX1hGUyAgICAgICovCSJceDBhIiAiU0dJIHhmcyIgICAgICwKKy8qIFNHSV9YRlNMT0cgICAqLwkiXHgwYiIgIlNHSSB4ZnNsb2ciICAsCisvKiBTR0lfWExWICAgICAgKi8JIlx4MGMiICJTR0kgeGx2IiAgICAgLAorLyogU0dJX1hWTSAgICAgICovCSJceDBkIiAiU0dJIHh2bSIgICAgICwKKy8qIExJTlVYX1NXQVAgICAqLwkiXHg4MiIgIkxpbnV4IHN3YXAiICAsCisvKiBMSU5VWF9OQVRJVkUgKi8JIlx4ODMiICJMaW51eCBuYXRpdmUiLAorLyogTElOVVhfTFZNICAgICovCSJceDhkIiAiTGludXggTFZNIiAgICwKKy8qIExJTlVYX1JBSUQgICAqLwkiXHhmZCIgIkxpbnV4IFJBSUQiICAsCisJCQlOVUxMCit9OworCisKK3N0YXRpYyBpbnQKK3NnaV9nZXRfbnNlY3Qodm9pZCkKK3sKKwlyZXR1cm4gU0dJX1NTV0FQMTYoc2dpbGFiZWwtPmRldnBhcmFtLm5zZWN0KTsKK30KKworc3RhdGljIGludAorc2dpX2dldF9udHJrcyh2b2lkKQoreworCXJldHVybiBTR0lfU1NXQVAxNihzZ2lsYWJlbC0+ZGV2cGFyYW0ubnRya3MpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0d29fc19jb21wbGVtZW50XzMyYml0X3N1bSh1bnNpZ25lZCBpbnQqIGJhc2UsIGludCBzaXplIC8qIGluIGJ5dGVzICovKQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBpbnQgc3VtID0gMDsKKworCXNpemUgLz0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJc3VtIC09IFNHSV9TU1dBUDMyKGJhc2VbaV0pOworCXJldHVybiBzdW07Cit9CisKK3ZvaWQgQlVHX2JhZF9zZ2lfcGFydGl0aW9uX3NpemUodm9pZCk7CisKK3N0YXRpYyBpbnQKK2NoZWNrX3NnaV9sYWJlbCh2b2lkKQoreworCWlmIChzaXplb2Yoc2dpX3BhcnRpdGlvbikgPiA1MTIpIHsKKwkJLyogQWNjb3JkaW5nIHRvIE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jIHRoZSBsYWJlbAorCQkgKiBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiA1MTIgYnl0ZXMgKi8KKwkJQlVHX2JhZF9zZ2lfcGFydGl0aW9uX3NpemUoKTsKKwl9CisKKwlpZiAoc2dpbGFiZWwtPm1hZ2ljICE9IFNHSV9MQUJFTF9NQUdJQworCSAmJiBzZ2lsYWJlbC0+bWFnaWMgIT0gU0dJX0xBQkVMX01BR0lDX1NXQVBQRUQKKwkpIHsKKwkJY3VycmVudF9sYWJlbF90eXBlID0gTEFCRUxfRE9TOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZ2lfb3RoZXJfZW5kaWFuID0gKHNnaWxhYmVsLT5tYWdpYyA9PSBTR0lfTEFCRUxfTUFHSUNfU1dBUFBFRCk7CisJLyoKKwkgKiB0ZXN0IGZvciBjb3JyZWN0IGNoZWNrc3VtCisJICovCisJaWYgKHR3b19zX2NvbXBsZW1lbnRfMzJiaXRfc3VtKCh1bnNpZ25lZCBpbnQqKXNnaWxhYmVsLAorCQkJCXNpemVvZigqc2dpbGFiZWwpKSkgeworCQlwcmludGYoIkRldGVjdGVkIHNnaSBkaXNrbGFiZWwgd2l0aCB3cm9uZyBjaGVja3N1bVxuIik7CisJfQorCXVwZGF0ZV91bml0cygpOworCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX1NHSTsKKwlnX3BhcnRpdGlvbnMgPSAxNjsKKwlzZ2lfdm9sdW1lcyA9IDE1OworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihpbnQgaSkKK3sKKwlyZXR1cm4gU0dJX1NTV0FQMzIoc2dpbGFiZWwtPnBhcnRpdGlvbnNbaV0uc3RhcnRfc2VjdG9yKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorc2dpX2dldF9udW1fc2VjdG9ycyhpbnQgaSkKK3sKKwlyZXR1cm4gU0dJX1NTV0FQMzIoc2dpbGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMpOworfQorCitzdGF0aWMgaW50CitzZ2lfZ2V0X3N5c2lkKGludCBpKQoreworCXJldHVybiBTR0lfU1NXQVAzMihzZ2lsYWJlbC0+cGFydGl0aW9uc1tpXS5pZCk7Cit9CisKK3N0YXRpYyBpbnQKK3NnaV9nZXRfYm9vdHBhcnRpdGlvbih2b2lkKQoreworCXJldHVybiBTR0lfU1NXQVAxNihzZ2lsYWJlbC0+Ym9vdF9wYXJ0KTsKK30KKworc3RhdGljIGludAorc2dpX2dldF9zd2FwcGFydGl0aW9uKHZvaWQpCit7CisJcmV0dXJuIFNHSV9TU1dBUDE2KHNnaWxhYmVsLT5zd2FwX3BhcnQpOworfQorCitzdGF0aWMgdm9pZAorc2dpX2xpc3RfdGFibGUoaW50IHh0cmEpCit7CisJaW50IGksIHcsIHdkOworCWludCBrcGkgPSAwOyAgICAgICAgICAgICAgICAvKiBrZXJuZWwgcGFydGl0aW9uIElEICovCisKKwlpZiAoeHRyYSkgeworCQlwcmludGYoIlxuRGlzayAlcyAoU0dJIGRpc2sgbGFiZWwpOiAldSBoZWFkcywgJXUgc2VjdG9yc1xuIgorCQkJIiV1IGN5bGluZGVycywgJXUgcGh5c2ljYWwgY3lsaW5kZXJzXG4iCisJCQkiJXUgZXh0cmEgc2VjdHMvY3lsLCBpbnRlcmxlYXZlICV1OjFcbiIKKwkJCSIlc1xuIgorCQkJIlVuaXRzID0gJXMgb2YgJXUgKiA1MTIgYnl0ZXNcblxuIiwKKwkJCWRpc2tfZGV2aWNlLCBnX2hlYWRzLCBnX3NlY3RvcnMsIGdfY3lsaW5kZXJzLAorCQkJU0dJX1NTV0FQMTYoc2dpcGFyYW0ucGN5bGNvdW50KSwKKwkJCVNHSV9TU1dBUDE2KHNnaXBhcmFtLnNwYXJlY3lsKSwKKwkJCVNHSV9TU1dBUDE2KHNnaXBhcmFtLmlsZmFjdCksCisJCQkoY2hhciAqKXNnaWxhYmVsLAorCQkJc3RyX3VuaXRzKFBMVVJBTCksIHVuaXRzX3Blcl9zZWN0b3IpOworCX0gZWxzZSB7CisJCXByaW50ZigiXG5EaXNrICVzIChTR0kgZGlzayBsYWJlbCk6ICIKKwkJCSIldSBoZWFkcywgJXUgc2VjdG9ycywgJXUgY3lsaW5kZXJzXG4iCisJCQkiVW5pdHMgPSAlcyBvZiAldSAqIDUxMiBieXRlc1xuXG4iLAorCQkJZGlza19kZXZpY2UsIGdfaGVhZHMsIGdfc2VjdG9ycywgZ19jeWxpbmRlcnMsCisJCQlzdHJfdW5pdHMoUExVUkFMKSwgdW5pdHNfcGVyX3NlY3RvciApOworCX0KKworCXcgPSBzdHJsZW4oZGlza19kZXZpY2UpOworCXdkID0gc2l6ZW9mKCJEZXZpY2UiKSAtIDE7CisJaWYgKHcgPCB3ZCkKKwl3ID0gd2Q7CisKKwlwcmludGYoIi0tLS0tIHBhcnRpdGlvbnMgLS0tLS1cbiIKKwkJIlB0IyAlKnMgIEluZm8gICAgIFN0YXJ0ICAgICAgIEVuZCAgIFNlY3RvcnMgIElkICBTeXN0ZW1cbiIsCisJCXcgKyAyLCAiRGV2aWNlIik7CisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCWlmIChzZ2lfZ2V0X251bV9zZWN0b3JzKGkpIHx8IFNHSV9ERUJVRykgeworCQkJdWludDMyX3Qgc3RhcnQgPSBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihpKTsKKwkJCXVpbnQzMl90IGxlbiA9IHNnaV9nZXRfbnVtX3NlY3RvcnMoaSk7CisJCQlrcGkrKzsgICAgICAgICAgICAgIC8qIG9ubHkgY291bnQgbm9uZW1wdHkgcGFydGl0aW9ucyAqLworCQkJcHJpbnRmKAorCQkJIiUydTogJXMgJTRzICU5bHUgJTlsdSAlOWx1ICAlMnggICVzXG4iLAorLyogZmRpc2sgcGFydCBudW1iZXIgKi8JaSsxLAorLyogZGV2aWNlICovICAgICAgICAgICAgcGFydG5hbWUoZGlza19kZXZpY2UsIGtwaSwgdyszKSwKKy8qIGZsYWdzICovICAgICAgICAgICAgIChzZ2lfZ2V0X3N3YXBwYXJ0aXRpb24oKSA9PSBpKSA/ICJzd2FwIiA6CisvKiBmbGFncyAqLyAgICAgICAgICAgICAoc2dpX2dldF9ib290cGFydGl0aW9uKCkgPT0gaSkgPyAiYm9vdCIgOiAiICAgICIsCisvKiBzdGFydCAqLyAgICAgICAgICAgICAobG9uZykgc2Nyb3VuZChzdGFydCksCisvKiBlbmQgKi8gICAgICAgICAgICAgICAobG9uZykgc2Nyb3VuZChzdGFydCtsZW4pLTEsCisvKiBubyBvZGQgZmxhZyBvbiBlbmQgKi8obG9uZykgbGVuLAorLyogdHlwZSBpZCAqLyAgICAgICAgICAgc2dpX2dldF9zeXNpZChpKSwKKy8qIHR5cGUgbmFtZSAqLyAgICAgICAgIHBhcnRpdGlvbl90eXBlKHNnaV9nZXRfc3lzaWQoaSkpKTsKKwkJfQorCX0KKwlwcmludGYoIi0tLS0tIEJvb3RpbmZvIC0tLS0tXG5Cb290ZmlsZTogJXNcbiIKKwkJIi0tLS0tIERpcmVjdG9yeSBFbnRyaWVzIC0tLS0tXG4iLAorCQlzZ2lsYWJlbC0+Ym9vdF9maWxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2dpX3ZvbHVtZXM7IGkrKykgeworCQlpZiAoc2dpbGFiZWwtPmRpcmVjdG9yeVtpXS52b2xfZmlsZV9zaXplKSB7CisJCQl1aW50MzJfdCBzdGFydCA9IFNHSV9TU1dBUDMyKHNnaWxhYmVsLT5kaXJlY3RvcnlbaV0udm9sX2ZpbGVfc3RhcnQpOworCQkJdWludDMyX3QgbGVuID0gU0dJX1NTV0FQMzIoc2dpbGFiZWwtPmRpcmVjdG9yeVtpXS52b2xfZmlsZV9zaXplKTsKKwkJCXVuc2lnbmVkIGNoYXIgKm5hbWUgPSBzZ2lsYWJlbC0+ZGlyZWN0b3J5W2ldLnZvbF9maWxlX25hbWU7CisKKwkJCXByaW50ZigiJTJ1OiAlLTEwcyBzZWN0b3IlNXUgc2l6ZSU4dVxuIiwKKwkJCQlpLCAoY2hhciopbmFtZSwgKHVuc2lnbmVkIGludCkgc3RhcnQsICh1bnNpZ25lZCBpbnQpIGxlbik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfc2V0X2Jvb3RwYXJ0aXRpb24oaW50IGkpCit7CisJc2dpbGFiZWwtPmJvb3RfcGFydCA9IFNHSV9TU1dBUDE2KCgoc2hvcnQpaSkpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitzZ2lfZ2V0X2xhc3RibG9jayh2b2lkKQoreworCXJldHVybiBnX2hlYWRzICogZ19zZWN0b3JzICogZ19jeWxpbmRlcnM7Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfc2V0X3N3YXBwYXJ0aXRpb24oaW50IGkpCit7CisJc2dpbGFiZWwtPnN3YXBfcGFydCA9IFNHSV9TU1dBUDE2KCgoc2hvcnQpaSkpOworfQorCitzdGF0aWMgaW50CitzZ2lfY2hlY2tfYm9vdGZpbGUoY29uc3QgY2hhciogYUZpbGUpCit7CisJaWYgKHN0cmxlbihhRmlsZSkgPCAzKSAvKiAiL2FcbiIgaXMgbWluaW11bSAqLyB7CisJCXByaW50ZigiXG5JbnZhbGlkIEJvb3RmaWxlIVxuIgorCQkJIlx0VGhlIGJvb3RmaWxlIG11c3QgYmUgYW4gYWJzb2x1dGUgbm9uLXplcm8gcGF0aG5hbWUsXG4iCisJCQkiXHRlLmcuIFwiL3VuaXhcIiBvciBcIi91bml4LnNhdmVcIi5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmxlbihhRmlsZSkgPiAxNikgeworCQlwcmludGYoIlxuTmFtZSBvZiBCb290ZmlsZSB0b28gbG9uZyAoPjE2IGJ5dGVzKVxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoYUZpbGVbMF0gIT0gJy8nKSB7CisJCXByaW50ZigiXG5Cb290ZmlsZSBtdXN0IGhhdmUgYSBmdWxseSBxdWFsaWZpZWQgcGF0aG5hbWVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cm5jbXAoYUZpbGUsIChjaGFyKilzZ2lsYWJlbC0+Ym9vdF9maWxlLCAxNikpIHsKKwkJcHJpbnRmKCJcbkJlIGF3YXJlLCB0aGF0IHRoZSBib290ZmlsZSBpcyBub3QgY2hlY2tlZCBmb3IgZXhpc3RlbmNlLlxuIgorCQkJICJcdFNHSSdzIGRlZmF1bHQgaXMgXCIvdW5peFwiIGFuZCBmb3IgYmFja3VwIFwiL3VuaXguc2F2ZVwiLlxuIik7CisJCS8qIGZpbGVuYW1lIGlzIGNvcnJlY3QgYW5kIGRpZCBjaGFuZ2UgKi8KKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOyAgIC8qIGZpbGVuYW1lIGRpZCBub3QgY2hhbmdlICovCit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NnaV9nZXRfYm9vdGZpbGUodm9pZCkKK3sKKwlyZXR1cm4gKGNoYXIqKXNnaWxhYmVsLT5ib290X2ZpbGU7Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfc2V0X2Jvb3RmaWxlKGNvbnN0IGNoYXIqIGFGaWxlKQoreworCWludCBpID0gMDsKKworCWlmIChzZ2lfY2hlY2tfYm9vdGZpbGUoYUZpbGUpKSB7CisJCXdoaWxlIChpIDwgMTYpIHsKKwkJCWlmICgoYUZpbGVbaV0gIT0gJ1xuJykgIC8qIGluIHByaW5jaXBsZSBjYXVnaHQgYWdhaW4gYnkgbmV4dCBsaW5lICovCisJCQkgJiYgKHN0cmxlbihhRmlsZSkgPiBpKSkKKwkJCQlzZ2lsYWJlbC0+Ym9vdF9maWxlW2ldID0gYUZpbGVbaV07CisJCQllbHNlCisJCQkJc2dpbGFiZWwtPmJvb3RfZmlsZVtpXSA9IDA7CisJCQlpKys7CisJCX0KKwkJcHJpbnRmKCJcblx0Qm9vdGZpbGUgaXMgY2hhbmdlZCB0byBcIiVzXCJcbiIsIHNnaWxhYmVsLT5ib290X2ZpbGUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2NyZWF0ZV9zZ2lpbmZvKHZvaWQpCit7CisJLyogSSBrZWVwIFNHSSdzIGhhYml0IHRvIHdyaXRlIHRoZSBzZ2lsYWJlbCB0byB0aGUgc2Vjb25kIGJsb2NrICovCisJc2dpbGFiZWwtPmRpcmVjdG9yeVswXS52b2xfZmlsZV9zdGFydCA9IFNHSV9TU1dBUDMyKDIpOworCXNnaWxhYmVsLT5kaXJlY3RvcnlbMF0udm9sX2ZpbGVfc2l6ZSA9IFNHSV9TU1dBUDMyKHNpemVvZihzZ2lpbmZvKSk7CisJc3RybmNweSgoY2hhciopc2dpbGFiZWwtPmRpcmVjdG9yeVswXS52b2xfZmlsZV9uYW1lLCAic2dpbGFiZWwiLCA4KTsKK30KKworc3RhdGljIHNnaWluZm8gKmZpbGxfc2dpaW5mbyh2b2lkKTsKKworc3RhdGljIHZvaWQKK3NnaV93cml0ZV90YWJsZSh2b2lkKQoreworCXNnaWxhYmVsLT5jc3VtID0gMDsKKwlzZ2lsYWJlbC0+Y3N1bSA9IFNHSV9TU1dBUDMyKHR3b19zX2NvbXBsZW1lbnRfMzJiaXRfc3VtKAorCQkJKHVuc2lnbmVkIGludCopc2dpbGFiZWwsIHNpemVvZigqc2dpbGFiZWwpKSk7CisJYXNzZXJ0KHR3b19zX2NvbXBsZW1lbnRfMzJiaXRfc3VtKAorCQkodW5zaWduZWQgaW50KilzZ2lsYWJlbCwgc2l6ZW9mKCpzZ2lsYWJlbCkpID09IDApOworCisJd3JpdGVfc2VjdG9yKDAsIHNnaWxhYmVsKTsKKwlpZiAoIXN0cm5jbXAoKGNoYXIqKXNnaWxhYmVsLT5kaXJlY3RvcnlbMF0udm9sX2ZpbGVfbmFtZSwgInNnaWxhYmVsIiwgOCkpIHsKKwkJLyoKKwkJICoga2VlcCB0aGlzIGhhYml0IG9mIGZpcnN0IHdyaXRpbmcgdGhlICJzZ2lsYWJlbCIuCisJCSAqIEkgbmV2ZXIgdGVzdGVkIHdoZXRoZXIgaXQgd29ya3Mgd2l0aG91dCAoQU4gOTgxMDAyKS4KKwkJICovCisJCXNnaWluZm8gKmluZm8gPSBmaWxsX3NnaWluZm8oKTsKKwkJaW50IGluZm9zdGFydGJsb2NrID0gU0dJX1NTV0FQMzIoc2dpbGFiZWwtPmRpcmVjdG9yeVswXS52b2xfZmlsZV9zdGFydCk7CisJCXdyaXRlX3NlY3RvcihpbmZvc3RhcnRibG9jaywgaW5mbyk7CisJCWZyZWUoaW5mbyk7CisJfQorfQorCitzdGF0aWMgaW50Citjb21wYXJlX3N0YXJ0KGludCAqeCwgaW50ICp5KQoreworCS8qCisJICogc29ydCBhY2NvcmRpbmcgdG8gc3RhcnQgc2VjdG9ycworCSAqIGFuZCBwcmVmZXJzIGxhcmdlc3QgcGFydGl0aW9uOgorCSAqIGVudHJ5IHplcm8gaXMgZW50aXJlIGRpc2sgZW50cnkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgaSA9ICp4OworCXVuc2lnbmVkIGludCBqID0gKnk7CisJdW5zaWduZWQgaW50IGEgPSBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihpKTsKKwl1bnNpZ25lZCBpbnQgYiA9IHNnaV9nZXRfc3RhcnRfc2VjdG9yKGopOworCXVuc2lnbmVkIGludCBjID0gc2dpX2dldF9udW1fc2VjdG9ycyhpKTsKKwl1bnNpZ25lZCBpbnQgZCA9IHNnaV9nZXRfbnVtX3NlY3RvcnMoaik7CisKKwlpZiAoYSA9PSBiKQorCQlyZXR1cm4gKGQgPiBjKSA/IDEgOiAoZCA9PSBjKSA/IDAgOiAtMTsKKwlyZXR1cm4gKGEgPiBiKSA/IDEgOiAtMTsKK30KKworCitzdGF0aWMgaW50Cit2ZXJpZnlfc2dpKGludCB2ZXJib3NlKQoreworCWludCBJbmRleFsxNl07ICAgICAgLyogbGlzdCBvZiB2YWxpZCBwYXJ0aXRpb25zICovCisJaW50IHNvcnRjb3VudCA9IDA7ICAvKiBudW1iZXIgb2YgdXNlZCBwYXJ0aXRpb25zLCBpLmUuIG5vbi16ZXJvIGxlbmd0aHMgKi8KKwlpbnQgZW50aXJlID0gMCwgaSA9IDA7CisJdW5zaWduZWQgaW50IHN0YXJ0ID0gMDsKKwlsb25nIGxvbmcgZ2FwID0gMDsgICAgICAvKiBjb3VudCB1bnVzZWQgYmxvY2tzICovCisJdW5zaWduZWQgaW50IGxhc3RibG9jayA9IHNnaV9nZXRfbGFzdGJsb2NrKCk7CisKKwljbGVhcmZyZWVsaXN0KCk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKHNnaV9nZXRfbnVtX3NlY3RvcnMoaSkgIT0gMCkgeworCQkJSW5kZXhbc29ydGNvdW50KytdID0gaTsKKwkJCWlmIChzZ2lfZ2V0X3N5c2lkKGkpID09IFNHSV9FTlRJUkVfRElTSykgeworCQkJCWlmIChlbnRpcmUrKyA9PSAxKSB7CisJCQkJCWlmICh2ZXJib3NlKQorCQkJCQkJcHJpbnRmKCJNb3JlIHRoYW4gb25lIGVudGlyZSBkaXNrIGVudHJ5IHByZXNlbnRcbiIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoc29ydGNvdW50ID09IDApIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGYoIk5vIHBhcnRpdGlvbnMgZGVmaW5lZFxuIik7CisJCXJldHVybiAobGFzdGJsb2NrID4gMCkgPyAxIDogKGxhc3RibG9jayA9PSAwKSA/IDAgOiAtMTsKKwl9CisJcXNvcnQoSW5kZXgsIHNvcnRjb3VudCwgc2l6ZW9mKEluZGV4WzBdKSwgKHZvaWQqKWNvbXBhcmVfc3RhcnQpOworCWlmIChzZ2lfZ2V0X3N5c2lkKEluZGV4WzBdKSA9PSBTR0lfRU5USVJFX0RJU0spIHsKKwkJaWYgKChJbmRleFswXSAhPSAxMCkgJiYgdmVyYm9zZSkKKwkJCXByaW50ZigiSVJJWCBsaWtlcyB3aGVuIFBhcnRpdGlvbiAxMSBjb3ZlcnMgdGhlIGVudGlyZSBkaXNrXG4iKTsKKwkJaWYgKChzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFswXSkgIT0gMCkgJiYgdmVyYm9zZSkKKwkJCXByaW50ZigiVGhlIGVudGlyZSBkaXNrIHBhcnRpdGlvbiBzaG91bGQgc3RhcnQgIgorCQkJCSJhdCBibG9jayAwLFxuIgorCQkJCSJub3QgYXQgZGlza2Jsb2NrICV1XG4iLAorCQkJCXNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4WzBdKSk7CisJCWlmIChTR0lfREVCVUcpICAgICAgLyogSSBkbyBub3QgdW5kZXJzdGFuZCBob3cgc29tZSBkaXNrcyBmdWxmaWwgaXQgKi8KKwkJCWlmICgoc2dpX2dldF9udW1fc2VjdG9ycyhJbmRleFswXSkgIT0gbGFzdGJsb2NrKSAmJiB2ZXJib3NlKQorCQkJCXByaW50ZigiVGhlIGVudGlyZSBkaXNrIHBhcnRpdGlvbiBpcyBvbmx5ICV1IGRpc2tibG9jayBsYXJnZSxcbiIKKwkJCQkJImJ1dCB0aGUgZGlzayBpcyAldSBkaXNrYmxvY2tzIGxvbmdcbiIsCisJCQkJCXNnaV9nZXRfbnVtX3NlY3RvcnMoSW5kZXhbMF0pLCBsYXN0YmxvY2spOworCQkJbGFzdGJsb2NrID0gc2dpX2dldF9udW1fc2VjdG9ycyhJbmRleFswXSk7CisJfSBlbHNlIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGYoIk9uZSBQYXJ0aXRpb24gKCMxMSkgc2hvdWxkIGNvdmVyIHRoZSBlbnRpcmUgZGlza1xuIik7CisJCWlmIChTR0lfREVCVUcgPiAyKQorCQkJcHJpbnRmKCJzeXNpZD0ldVx0cGFydGl0aW9uPSV1XG4iLAorCQkJCXNnaV9nZXRfc3lzaWQoSW5kZXhbMF0pLCBJbmRleFswXSsxKTsKKwl9CisJZm9yIChpID0gMSwgc3RhcnQgPSAwOyBpIDwgc29ydGNvdW50OyBpKyspIHsKKwkJaW50IGN5bHNpemUgPSBzZ2lfZ2V0X25zZWN0KCkgKiBzZ2lfZ2V0X250cmtzKCk7CisKKwkJaWYgKChzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkgJSBjeWxzaXplKSAhPSAwKSB7CisJCQlpZiAoU0dJX0RFQlVHKSAgICAgIC8qIEkgZG8gbm90IHVuZGVyc3RhbmQgaG93IHNvbWUgZGlza3MgZnVsZmlsIGl0ICovCisJCQkJaWYgKHZlcmJvc2UpCisJCQkJCXByaW50ZigiUGFydGl0aW9uICV1IGRvZXMgbm90IHN0YXJ0IG9uIGN5bGluZGVyIGJvdW5kYXJ5XG4iLAorCQkJCQkJSW5kZXhbaV0rMSk7CisJCX0KKwkJaWYgKHNnaV9nZXRfbnVtX3NlY3RvcnMoSW5kZXhbaV0pICUgY3lsc2l6ZSAhPSAwKSB7CisJCQlpZiAoU0dJX0RFQlVHKSAgICAgIC8qIEkgZG8gbm90IHVuZGVyc3RhbmQgaG93IHNvbWUgZGlza3MgZnVsZmlsIGl0ICovCisJCQkJaWYgKHZlcmJvc2UpCisJCQkJCXByaW50ZigiUGFydGl0aW9uICV1IGRvZXMgbm90IGVuZCBvbiBjeWxpbmRlciBib3VuZGFyeVxuIiwKKwkJCQkJCUluZGV4W2ldKzEpOworCQl9CisJCS8qIFdlIGNhbm5vdCBoYW5kbGUgc2V2ZXJhbCAiZW50aXJlIGRpc2siIGVudHJpZXMuICovCisJCWlmIChzZ2lfZ2V0X3N5c2lkKEluZGV4W2ldKSA9PSBTR0lfRU5USVJFX0RJU0spIGNvbnRpbnVlOworCQlpZiAoc3RhcnQgPiBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigiUGFydGl0aW9ucyAldSBhbmQgJXUgb3ZlcmxhcCBieSAldSBzZWN0b3JzXG4iLAorCQkJCQlJbmRleFtpLTFdKzEsIEluZGV4W2ldKzEsCisJCQkJCXN0YXJ0IC0gc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pKTsKKwkJCWlmIChnYXAgPiAwKSBnYXAgPSAtZ2FwOworCQkJaWYgKGdhcCA9PSAwKSBnYXAgPSAtMTsKKwkJfQorCQlpZiAoc3RhcnQgPCBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigiVW51c2VkIGdhcCBvZiAldSBzZWN0b3JzIC0gc2VjdG9ycyAldS0ldVxuIiwKKwkJCQkJc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pIC0gc3RhcnQsCisJCQkJCXN0YXJ0LCBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSktMSk7CisJCQlnYXAgKz0gc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pIC0gc3RhcnQ7CisJCQlhZGQyZnJlZWxpc3Qoc3RhcnQsIHNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4W2ldKSk7CisJCX0KKwkJc3RhcnQgPSBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkKKwkJCSAgICsgc2dpX2dldF9udW1fc2VjdG9ycyhJbmRleFtpXSk7CisJCWlmIChTR0lfREVCVUcgPiAxKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludGYoIiUydTolMTJ1XHQlMTJ1XHQlMTJ1XG4iLCBJbmRleFtpXSwKKwkJCQkJc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pLAorCQkJCQlzZ2lfZ2V0X251bV9zZWN0b3JzKEluZGV4W2ldKSwKKwkJCQkJc2dpX2dldF9zeXNpZChJbmRleFtpXSkpOworCQl9CisJfQorCWlmIChzdGFydCA8IGxhc3RibG9jaykgeworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ZigiVW51c2VkIGdhcCBvZiAldSBzZWN0b3JzIC0gc2VjdG9ycyAldS0ldVxuIiwKKwkJCQlsYXN0YmxvY2sgLSBzdGFydCwgc3RhcnQsIGxhc3RibG9jay0xKTsKKwkJZ2FwICs9IGxhc3RibG9jayAtIHN0YXJ0OworCQlhZGQyZnJlZWxpc3Qoc3RhcnQsIGxhc3RibG9jayk7CisJfQorCS8qCisJICogRG9uZSB3aXRoIGFyaXRobWV0aWNzCisJICogR28gZm9yIGRldGFpbHMgbm93CisJICovCisJaWYgKHZlcmJvc2UpIHsKKwkJaWYgKCFzZ2lfZ2V0X251bV9zZWN0b3JzKHNnaV9nZXRfYm9vdHBhcnRpdGlvbigpKSkgeworCQkJcHJpbnRmKCJcblRoZSBib290IHBhcnRpdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCX0KKwkJaWYgKCFzZ2lfZ2V0X251bV9zZWN0b3JzKHNnaV9nZXRfc3dhcHBhcnRpdGlvbigpKSkgeworCQkJcHJpbnRmKCJcblRoZSBzd2FwIHBhcnRpdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCX0gZWxzZSB7CisJCQlpZiAoKHNnaV9nZXRfc3lzaWQoc2dpX2dldF9zd2FwcGFydGl0aW9uKCkpICE9IFNHSV9TV0FQKQorCQkJICYmIChzZ2lfZ2V0X3N5c2lkKHNnaV9nZXRfc3dhcHBhcnRpdGlvbigpKSAhPSBMSU5VWF9TV0FQKSkKKwkJCQlwcmludGYoIlxuVGhlIHN3YXAgcGFydGl0aW9uIGhhcyBubyBzd2FwIHR5cGVcbiIpOworCQl9CisJCWlmIChzZ2lfY2hlY2tfYm9vdGZpbGUoIi91bml4IikpCisJCQlwcmludGYoIlx0WW91IGhhdmUgY2hvc2VuIGFuIHVudXN1YWwgYm9vdCBmaWxlIG5hbWVcbiIpOworCX0KKwlyZXR1cm4gKGdhcCA+IDApID8gMSA6IChnYXAgPT0gMCkgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQKK3NnaV9nYXBzKHZvaWQpCit7CisJLyoKKwkgKiByZXR1cm5lZCB2YWx1ZSBpczoKKwkgKiAgPSAwIDogZGlzayBpcyBwcm9wZXJseSBmaWxsZWQgdG8gdGhlIHJpbQorCSAqICA8IDAgOiB0aGVyZSBpcyBhbiBvdmVybGFwCisJICogID4gMCA6IHRoZXJlIGlzIHN0aWxsIHNvbWUgdmFjYW50IHNwYWNlCisJICovCisJcmV0dXJuIHZlcmlmeV9zZ2koMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfY2hhbmdlX3N5c2lkKGludCBpLCBpbnQgc3lzKQoreworCWlmIChzZ2lfZ2V0X251bV9zZWN0b3JzKGkpID09IDApIHsgLyogY2F1Z2h0IGFscmVhZHkgYmVmb3JlLCAuLi4gKi8KKwkJcHJpbnRmKCJTb3JyeSB5b3UgbWF5IGNoYW5nZSB0aGUgVGFnIG9mIG5vbi1lbXB0eSBwYXJ0aXRpb25zXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHN5cyAhPSBTR0lfRU5USVJFX0RJU0spICYmIChzeXMgIT0gU0dJX1ZPTEhEUikKKwkgJiYgKHNnaV9nZXRfc3RhcnRfc2VjdG9yKGkpIDwgMSkKKwkpIHsKKwkJcmVhZF9tYXliZV9lbXB0eSgKKwkJCSJJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB0aGUgcGFydGl0aW9uIGF0IG9mZnNldCAwXG4iCisJCQkiaXMgb2YgdHlwZSBcIlNHSSB2b2xoZHJcIiwgdGhlIElSSVggc3lzdGVtIHdpbGwgcmVseSBvbiBpdCB0b1xuIgorCQkJInJldHJpZXZlIGZyb20gaXRzIGRpcmVjdG9yeSBzdGFuZGFsb25lIHRvb2xzIGxpa2Ugc2FzaCBhbmQgZnguXG4iCisJCQkiT25seSB0aGUgXCJTR0kgdm9sdW1lXCIgZW50aXJlIGRpc2sgc2VjdGlvbiBtYXkgdmlvbGF0ZSB0aGlzLlxuIgorCQkJIlR5cGUgWUVTIGlmIHlvdSBhcmUgc3VyZSBhYm91dCB0YWdnaW5nIHRoaXMgcGFydGl0aW9uIGRpZmZlcmVudGx5LlxuIik7CisJCWlmIChzdHJjbXAobGluZV9wdHIsICJZRVNcbiIpICE9IDApCisJCQlyZXR1cm47CisJfQorCXNnaWxhYmVsLT5wYXJ0aXRpb25zW2ldLmlkID0gU0dJX1NTV0FQMzIoc3lzKTsKK30KKworLyogcmV0dXJucyBwYXJ0aXRpb24gaW5kZXggb2YgZmlyc3QgZW50cnkgbWFya2VkIGFzIGVudGlyZSBkaXNrICovCitzdGF0aWMgaW50CitzZ2lfZW50aXJlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJaWYgKHNnaV9nZXRfc3lzaWQoaSkgPT0gU0dJX1ZPTFVNRSkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfcGFydGl0aW9uKGludCBpLCB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBsZW5ndGgsIGludCBzeXMpCit7CisJc2dpbGFiZWwtPnBhcnRpdGlvbnNbaV0uaWQgPSBTR0lfU1NXQVAzMihzeXMpOworCXNnaWxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzID0gU0dJX1NTV0FQMzIobGVuZ3RoKTsKKwlzZ2lsYWJlbC0+cGFydGl0aW9uc1tpXS5zdGFydF9zZWN0b3IgPSBTR0lfU1NXQVAzMihzdGFydCk7CisJc2V0X2NoYW5nZWQoaSk7CisJaWYgKHNnaV9nYXBzKCkgPCAwKSAgICAgLyogcmVidWlsZCBmcmVlbGlzdCAqLworCQlwcmludGYoIlBhcnRpdGlvbiBvdmVybGFwIGRldGVjdGVkXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfZW50aXJlKHZvaWQpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAxMDsgbiA8IGdfcGFydGl0aW9uczsgbisrKSB7CisJCWlmICghc2dpX2dldF9udW1fc2VjdG9ycyhuKSApIHsKKwkJCXNnaV9zZXRfcGFydGl0aW9uKG4sIDAsIHNnaV9nZXRfbGFzdGJsb2NrKCksIFNHSV9WT0xVTUUpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfc2V0X3ZvbGhkcih2b2lkKQoreworCWludCBuOworCisJZm9yIChuID0gODsgbiA8IGdfcGFydGl0aW9uczsgbisrKSB7CisJaWYgKCFzZ2lfZ2V0X251bV9zZWN0b3JzKG4pKSB7CisJCS8qCisJCSAqIDUgY3lsaW5kZXJzIGlzIGFuIGFyYml0cmFyeSB2YWx1ZSBJIGxpa2UKKwkJICogSVJJWCA1LjMgc3RvcmVkIGZpbGVzIGluIHRoZSB2b2x1bWUgaGVhZGVyCisJCSAqIChsaWtlIHNhc2gsIHN5bW1vbiwgZngsIGlkZSkgd2l0aCBjYS4gMzIwMAorCQkgKiBzZWN0b3JzLgorCQkgKi8KKwkJaWYgKGdfaGVhZHMgKiBnX3NlY3RvcnMgKiA1IDwgc2dpX2dldF9sYXN0YmxvY2soKSkKKwkJCXNnaV9zZXRfcGFydGl0aW9uKG4sIDAsIGdfaGVhZHMgKiBnX3NlY3RvcnMgKiA1LCBTR0lfVk9MSERSKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorc2dpX2RlbGV0ZV9wYXJ0aXRpb24oaW50IGkpCit7CisJc2dpX3NldF9wYXJ0aXRpb24oaSwgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfYWRkX3BhcnRpdGlvbihpbnQgbiwgaW50IHN5cykKK3sKKwljaGFyIG1lc2dbMjU2XTsKKwl1bnNpZ25lZCBpbnQgZmlyc3QgPSAwLCBsYXN0ID0gMDsKKworCWlmIChuID09IDEwKSB7CisJCXN5cyA9IFNHSV9WT0xVTUU7CisJfSBlbHNlIGlmIChuID09IDgpIHsKKwkJc3lzID0gMDsKKwl9CisJaWYgKHNnaV9nZXRfbnVtX3NlY3RvcnMobikpIHsKKwkJcHJpbnRmKG1zZ19wYXJ0X2FscmVhZHlfZGVmaW5lZCwgbiArIDEpOworCQlyZXR1cm47CisJfQorCWlmICgoc2dpX2VudGlyZSgpID09IC0xKSAmJiAoc3lzICE9IFNHSV9WT0xVTUUpKSB7CisJCXByaW50ZigiQXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBlbnRpcmUgZGlzayBlbnRyeSBhdXRvbWF0aWNhbGx5XG4iKTsKKwkJc2dpX3NldF9lbnRpcmUoKTsKKwkJc2dpX3NldF92b2xoZHIoKTsKKwl9CisJaWYgKChzZ2lfZ2FwcygpID09IDApICYmIChzeXMgIT0gU0dJX1ZPTFVNRSkpIHsKKwkJcHJpbnRmKCJUaGUgZW50aXJlIGRpc2sgaXMgYWxyZWFkeSBjb3ZlcmVkIHdpdGggcGFydGl0aW9uc1xuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHNnaV9nYXBzKCkgPCAwKSB7CisJCXByaW50ZigiWW91IGdvdCBhIHBhcnRpdGlvbiBvdmVybGFwIG9uIHRoZSBkaXNrLiBGaXggaXQgZmlyc3QhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJGaXJzdCAlcyIsIHN0cl91bml0cyhTSU5HVUxBUikpOworCXdoaWxlICgxKSB7CisJCWlmIChzeXMgPT0gU0dJX1ZPTFVNRSkgeworCQkJbGFzdCA9IHNnaV9nZXRfbGFzdGJsb2NrKCk7CisJCQlmaXJzdCA9IHJlYWRfaW50KDAsIDAsIGxhc3QtMSwgMCwgbWVzZyk7CisJCQlpZiAoZmlyc3QgIT0gMCkgeworCQkJCXByaW50ZigiSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgZWxldmVudGggcGFydGl0aW9uXG4iCisJCQkJCQkiY292ZXJzIHRoZSBlbnRpcmUgZGlzayBhbmQgaXMgb2YgdHlwZSAnU0dJIHZvbHVtZSdcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJZmlyc3QgPSBmcmVlbGlzdFswXS5maXJzdDsKKwkJCWxhc3QgID0gZnJlZWxpc3RbMF0ubGFzdDsKKwkJCWZpcnN0ID0gcmVhZF9pbnQoc2Nyb3VuZChmaXJzdCksIHNjcm91bmQoZmlyc3QpLCBzY3JvdW5kKGxhc3QpLTEsCisJCQkJMCwgbWVzZyk7CisJCX0KKwkJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQkJZmlyc3QgKj0gdW5pdHNfcGVyX3NlY3RvcjsKKwkJZWxzZQorCQkJZmlyc3QgPSBmaXJzdDsgLyogYWxpZ24gdG8gY3lsaW5kZXIgaWYgeW91IGtub3cgaG93IC4uLiAqLworCQlpZiAoIWxhc3QgKQorCQkJbGFzdCA9IGlzaW5mcmVlbGlzdChmaXJzdCk7CisJCWlmIChsYXN0ICE9IDApCisJCQlicmVhazsKKwkJcHJpbnRmKCJZb3Ugd2lsbCBnZXQgYSBwYXJ0aXRpb24gb3ZlcmxhcCBvbiB0aGUgZGlzay4gIgorCQkJCSJGaXggaXQgZmlyc3QhXG4iKTsKKwl9CisJc25wcmludGYobWVzZywgc2l6ZW9mKG1lc2cpLCAiIExhc3QgJXMiLCBzdHJfdW5pdHMoU0lOR1VMQVIpKTsKKwlsYXN0ID0gcmVhZF9pbnQoc2Nyb3VuZChmaXJzdCksIHNjcm91bmQobGFzdCktMSwgc2Nyb3VuZChsYXN0KS0xLAorCQkJc2Nyb3VuZChmaXJzdCksIG1lc2cpKzE7CisJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQlsYXN0ICo9IHVuaXRzX3Blcl9zZWN0b3I7CisJZWxzZQorCQlsYXN0ID0gbGFzdDsgLyogYWxpZ24gdG8gY3lsaW5kZXIgaWYgWW91IGtub3cgaG93IC4uLiAqLworCWlmICggKHN5cyA9PSBTR0lfVk9MVU1FKSAmJiAoZmlyc3QgIT0gMCB8fCBsYXN0ICE9IHNnaV9nZXRfbGFzdGJsb2NrKCkgKSApCisJCXByaW50ZigiSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgZWxldmVudGggcGFydGl0aW9uXG4iCisJCQkiY292ZXJzIHRoZSBlbnRpcmUgZGlzayBhbmQgaXMgb2YgdHlwZSAnU0dJIHZvbHVtZSdcbiIpOworCXNnaV9zZXRfcGFydGl0aW9uKG4sIGZpcnN0LCBsYXN0LWZpcnN0LCBzeXMpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKK3N0YXRpYyB2b2lkCitjcmVhdGVfc2dpbGFiZWwodm9pZCkKK3sKKwlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbWV0cnk7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHN0YXJ0OworCQl1bnNpZ25lZCBpbnQgbnNlY3Q7CisJCWludCBzeXNpZDsKKwl9IG9sZFs0XTsKKwlpbnQgaSA9IDA7CisJbG9uZyBsb25nc2VjdG9yczsgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgb24gdGhlIGRldmljZSAqLworCWludCByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHJlc3VsdCBmcm9tIHRoZSBpb2N0bCAqLworCWludCBzZWNfZmFjOyAgICAgICAgICAgICAgICAgICAgLyogdGhlIHNlY3RvciBmYWN0b3IgKi8KKworCXNlY19mYWMgPSBzZWN0b3Jfc2l6ZSAvIDUxMjsgICAgLyogZGV0ZXJtaW5lIHRoZSBzZWN0b3IgZmFjdG9yICovCisKKwlwcmludGYobXNnX2J1aWxkaW5nX25ld19sYWJlbCwgIlNHSSBkaXNrbGFiZWwiKTsKKworCXNnaV9vdGhlcl9lbmRpYW4gPSBCQl9MSVRUTEVfRU5ESUFOOworCXJlcyA9IGlvY3RsKGRldl9mZCwgQkxLR0VUU0laRSwgJmxvbmdzZWN0b3JzKTsKKwlpZiAoIWlvY3RsKGRldl9mZCwgSERJT19HRVRHRU8sICZnZW9tZXRyeSkpIHsKKwkJZ19oZWFkcyA9IGdlb21ldHJ5LmhlYWRzOworCQlnX3NlY3RvcnMgPSBnZW9tZXRyeS5zZWN0b3JzOworCQlpZiAocmVzID09IDApIHsKKwkJCS8qIHRoZSBnZXQgZGV2aWNlIHNpemUgaW9jdGwgd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJCWdfY3lsaW5kZXJzID0gbG9uZ3NlY3RvcnMgLyAoZ19oZWFkcyAqIGdfc2VjdG9ycyk7CisJCQlnX2N5bGluZGVycyAvPSBzZWNfZmFjOworCQl9IGVsc2UgeworCQkJLyogb3RoZXJ3aXNlIHByaW50IGVycm9yIGFuZCB1c2UgdHJ1bmNhdGVkIHZlcnNpb24gKi8KKwkJCWdfY3lsaW5kZXJzID0gZ2VvbWV0cnkuY3lsaW5kZXJzOworCQkJcHJpbnRmKAorIldhcm5pbmc6IEJMS0dFVFNJWkUgaW9jdGwgZmFpbGVkIG9uICVzLiAgVXNpbmcgZ2VvbWV0cnkgY3lsaW5kZXIgdmFsdWUgb2YgJXUuXG4iCisiVGhpcyB2YWx1ZSBtYXkgYmUgdHJ1bmNhdGVkIGZvciBkZXZpY2VzID4gMzMuOCBHQi5cbiIsIGRpc2tfZGV2aWNlLCBnX2N5bGluZGVycyk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlvbGRbaV0uc3lzaWQgPSAwOworCQlpZiAodmFsaWRfcGFydF90YWJsZV9mbGFnKE1CUmJ1ZmZlcikpIHsKKwkJCWlmIChnZXRfcGFydF90YWJsZShpKS0+c3lzX2luZCkgeworCQkJCW9sZFtpXS5zeXNpZCA9IGdldF9wYXJ0X3RhYmxlKGkpLT5zeXNfaW5kOworCQkJCW9sZFtpXS5zdGFydCA9IGdldF9zdGFydF9zZWN0KGdldF9wYXJ0X3RhYmxlKGkpKTsKKwkJCQlvbGRbaV0ubnNlY3QgPSBnZXRfbnJfc2VjdHMoZ2V0X3BhcnRfdGFibGUoaSkpOworCQkJCXByaW50ZigiVHJ5aW5nIHRvIGtlZXAgcGFyYW1ldGVycyBvZiBwYXJ0aXRpb24gJXVcbiIsIGkpOworCQkJCWlmIChTR0lfREVCVUcpCisJCQkJCXByaW50ZigiSUQ9JTAyeFx0U1RBUlQ9JXVcdExFTkdUSD0ldVxuIiwKKwkJCQlvbGRbaV0uc3lzaWQsIG9sZFtpXS5zdGFydCwgb2xkW2ldLm5zZWN0KTsKKwkJCX0KKwkJfQorCX0KKworCW1lbXNldChNQlJidWZmZXIsIDAsIHNpemVvZihNQlJidWZmZXIpKTsKKwkvKiBmaWVsZHMgd2l0aCAnLy8nIGFyZSBhbHJlYWR5IHplcm9lZCBvdXQgYnkgbWVtc2V0IGFib3ZlICovCisKKwlzZ2lsYWJlbC0+bWFnaWMgPSBTR0lfU1NXQVAzMihTR0lfTEFCRUxfTUFHSUMpOworCS8vc2dpbGFiZWwtPmJvb3RfcGFydCA9IFNHSV9TU1dBUDE2KDApOworCXNnaWxhYmVsLT5zd2FwX3BhcnQgPSBTR0lfU1NXQVAxNigxKTsKKworCS8vbWVtc2V0KHNnaWxhYmVsLT5ib290X2ZpbGUsIDAsIDE2KTsKKwlzdHJjcHkoKGNoYXIqKXNnaWxhYmVsLT5ib290X2ZpbGUsICIvdW5peCIpOyAvKiBzaXplb2Yoc2dpbGFiZWwtPmJvb3RfZmlsZSkgPT0gMTYgPiA2ICovCisKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS5za2V3ICAgICAgICAgICAgICAgICAgICAgPSAoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0uZ2FwMSAgICAgICAgICAgICAgICAgICAgID0gKDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLmdhcDIgICAgICAgICAgICAgICAgICAgICA9ICgwKTsKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS5zcGFyZWN5bCAgICAgICAgICAgICAgICAgPSAoMCk7CisJc2dpbGFiZWwtPmRldnBhcmFtLnBjeWxjb3VudCAgICAgICAgICAgICAgICA9IFNHSV9TU1dBUDE2KGdlb21ldHJ5LmN5bGluZGVycyk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0uaGVhZF92b2wwICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLyogdHJhY2tzL2N5bGluZGVyIChoZWFkcykgKi8KKwlzZ2lsYWJlbC0+ZGV2cGFyYW0ubnRya3MgICAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoZ2VvbWV0cnkuaGVhZHMpOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLmNtZF90YWdfcXVldWVfZGVwdGggICAgICA9ICgwKTsKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS51bnVzZWQwICAgICAgICAgICAgICAgICAgPSAoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0udW51c2VkMSAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLyogc2VjdG9ycy90cmFjayAqLworCXNnaWxhYmVsLT5kZXZwYXJhbS5uc2VjdCAgICAgICAgICAgICAgICAgICAgPSBTR0lfU1NXQVAxNihnZW9tZXRyeS5zZWN0b3JzKTsKKwlzZ2lsYWJlbC0+ZGV2cGFyYW0uYnl0ZXMgICAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoNTEyKTsKKwlzZ2lsYWJlbC0+ZGV2cGFyYW0uaWxmYWN0ICAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoMSk7CisJc2dpbGFiZWwtPmRldnBhcmFtLmZsYWdzICAgICAgICAgICAgICAgICAgICA9IFNHSV9TU1dBUDMyKFRSQUNLX0ZXRHwKKwkJCQkJCQlJR05PUkVfRVJST1JTfFJFU0VFSyk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0uZGF0YXJhdGUgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMzIoMCk7CisJc2dpbGFiZWwtPmRldnBhcmFtLnJldHJpZXNfb25fZXJyb3IgICAgICAgICA9IFNHSV9TU1dBUDMyKDEpOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLm1zX3Blcl93b3JkICAgICAgICAgICAgICA9IFNHSV9TU1dBUDMyKDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX2dhcDEgICAgICAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX3N5bmNkZWxheSAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX3JlYWRkZWxheSAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX2dhcDIgICAgICAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX3JlYWRnYXRlICAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX3dyaXRlY29udCAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vbWVtc2V0KCAmKHNnaWxhYmVsLT5kaXJlY3RvcnkpLCAwLCBzaXplb2Yoc3RydWN0IHZvbHVtZV9kaXJlY3RvcnkpKjE1ICk7CisJLy9tZW1zZXQoICYoc2dpbGFiZWwtPnBhcnRpdGlvbnMpLCAwLCBzaXplb2Yoc3RydWN0IHNnaV9wYXJ0aW5mbykqMTYgKTsKKwljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9TR0k7CisJZ19wYXJ0aXRpb25zID0gMTY7CisJc2dpX3ZvbHVtZXMgPSAxNTsKKwlzZ2lfc2V0X2VudGlyZSgpOworCXNnaV9zZXRfdm9saGRyKCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAob2xkW2ldLnN5c2lkKSB7CisJCQlzZ2lfc2V0X3BhcnRpdGlvbihpLCBvbGRbaV0uc3RhcnQsIG9sZFtpXS5uc2VjdCwgb2xkW2ldLnN5c2lkKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfeGN5bCh2b2lkKQoreworCS8qIGRvIG5vdGhpbmcgaW4gdGhlIGJlZ2lubmluZyAqLworfQorI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfQURWQU5DRUQgKi8KKworLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICovCisKK3N0YXRpYyBzZ2lpbmZvICoKK2ZpbGxfc2dpaW5mbyh2b2lkKQoreworCXNnaWluZm8gKmluZm8gPSB4emFsbG9jKHNpemVvZihzZ2lpbmZvKSk7CisKKwlpbmZvLT5tYWdpYyA9IFNHSV9TU1dBUDMyKFNHSV9JTkZPX01BR0lDKTsKKwlpbmZvLT5iMSA9IFNHSV9TU1dBUDMyKC0xKTsKKwlpbmZvLT5iMiA9IFNHSV9TU1dBUDE2KC0xKTsKKwlpbmZvLT5iMyA9IFNHSV9TU1dBUDE2KDEpOworCS8qIFlvdSBtYXkgd2FudCB0byByZXBsYWNlIHRoaXMgc3RyaW5nICEhISEhISEgKi8KKwlzdHJjcHkoIChjaGFyKilpbmZvLT5zY3NpX3N0cmluZywgIklCTSBPRU0gMDY2MlMxMiAgICAgICAgIDMgMzAiICk7CisJc3RyY3B5KCAoY2hhciopaW5mby0+c2VyaWFsLCAiMDAwMCIgKTsKKwlpbmZvLT5jaGVjazE4MTYgPSBTR0lfU1NXQVAxNigxOCoyNTYgKzE2ICk7CisJc3RyY3B5KCAoY2hhciopaW5mby0+aW5zdGFsbGVyLCAiU2Z4IHZlcnNpb24gNS4zLCBPY3QgMTgsIDE5OTQiICk7CisJcmV0dXJuIGluZm87Cit9CisjZW5kaWYgLyogU0dJX0xBQkVMICovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZkaXNrX3N1bi5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19zdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ZjYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mZGlza19zdW4uYwpAQCAtMCwwICsxLDcyOSBAQAorLyoKKyAqIGZkaXNrX3N1bi5jCisgKgorICogSSB0aGluayB0aGlzIGlzIG1vc3RseSwgb3IgZW50aXJlbHksIGR1ZSB0bworICogICAgICBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KSwgSnVseSAxOTk2CisgKgorICogTWVyZ2VkIHdpdGggZmRpc2sgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMsIGFlYiwgSnVuZSAxOTk4LgorICoKKyAqIFNhdCBNYXIgMjAgRVNUIDE5OTkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKiAgICAgIEludGVybmF0aW9uYWxpemF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisKKyNkZWZpbmUgU1VOT1NfU1dBUCAzCisjZGVmaW5lIFNVTl9XSE9MRV9ESVNLIDUKKworI2RlZmluZSBTVU5fTEFCRUxfTUFHSUMgICAgICAgICAgMHhEQUJFCisjZGVmaW5lIFNVTl9MQUJFTF9NQUdJQ19TV0FQUEVEICAweEJFREEKKyNkZWZpbmUgU1VOX1NTV0FQMTYoeCkgKHN1bl9vdGhlcl9lbmRpYW4gPyBmZGlza19zd2FwMTYoeCkgOiAodWludDE2X3QpKHgpKQorI2RlZmluZSBTVU5fU1NXQVAzMih4KSAoc3VuX290aGVyX2VuZGlhbiA/IGZkaXNrX3N3YXAzMih4KSA6ICh1aW50MzJfdCkoeCkpCisKKy8qIENvcGllZCBmcm9tIGxpbnV4L21ham9yLmggKi8KKyNkZWZpbmUgRkxPUFBZX01BSk9SICAgIDIKKworI2RlZmluZSBTQ1NJX0lPQ1RMX0dFVF9JRExVTiAweDUzODIKKworc3RhdGljIHNtYWxsaW50IHN1bl9vdGhlcl9lbmRpYW47CitzdGF0aWMgc21hbGxpbnQgc2NzaV9kaXNrOworc3RhdGljIHNtYWxsaW50IGZsb3BweTsKKworI2lmbmRlZiBJREUwX01BSk9SCisjZGVmaW5lIElERTBfTUFKT1IgMworI2VuZGlmCisjaWZuZGVmIElERTFfTUFKT1IKKyNkZWZpbmUgSURFMV9NQUpPUiAyMgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitndWVzc19kZXZpY2VfdHlwZSh2b2lkKQoreworCXN0cnVjdCBzdGF0IGJvb3RzdGF0OworCisJaWYgKGZzdGF0KGRldl9mZCwgJmJvb3RzdGF0KSA8IDApIHsKKwkJc2NzaV9kaXNrID0gMDsKKwkJZmxvcHB5ID0gMDsKKwl9IGVsc2UgaWYgKFNfSVNCTEsoYm9vdHN0YXQuc3RfbW9kZSkKKwkJJiYgKG1ham9yKGJvb3RzdGF0LnN0X3JkZXYpID09IElERTBfTUFKT1IgfHwKKwkJICAgIG1ham9yKGJvb3RzdGF0LnN0X3JkZXYpID09IElERTFfTUFKT1IpKSB7CisJCXNjc2lfZGlzayA9IDA7CisJCWZsb3BweSA9IDA7CisJfSBlbHNlIGlmIChTX0lTQkxLKGJvb3RzdGF0LnN0X21vZGUpCisJCSYmIG1ham9yKGJvb3RzdGF0LnN0X3JkZXYpID09IEZMT1BQWV9NQUpPUikgeworCQlzY3NpX2Rpc2sgPSAwOworCQlmbG9wcHkgPSAxOworCX0gZWxzZSB7CisJCXNjc2lfZGlzayA9IDE7CisJCWZsb3BweSA9IDA7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3VuX3N5c190eXBlc1tdID0geworCSJceDAwIiAiRW1wdHkiICAgICAgICwgLyogMCAgICAgICAgICAgICovCisJIlx4MDEiICJCb290IiAgICAgICAgLCAvKiAxICAgICAgICAgICAgKi8KKwkiXHgwMiIgIlN1bk9TIHJvb3QiICAsIC8qIDIgICAgICAgICAgICAqLworCSJceDAzIiAiU3VuT1Mgc3dhcCIgICwgLyogU1VOT1NfU1dBUCAgICovCisJIlx4MDQiICJTdW5PUyB1c3IiICAgLCAvKiA0ICAgICAgICAgICAgKi8KKwkiXHgwNSIgIldob2xlIGRpc2siICAsIC8qIFNVTl9XSE9MRV9ESVNLICAgKi8KKwkiXHgwNiIgIlN1bk9TIHN0YW5kIiAsIC8qIDYgICAgICAgICAgICAqLworCSJceDA3IiAiU3VuT1MgdmFyIiAgICwgLyogNyAgICAgICAgICAgICovCisJIlx4MDgiICJTdW5PUyBob21lIiAgLCAvKiA4ICAgICAgICAgICAgKi8KKwkiXHg4MiIgIkxpbnV4IHN3YXAiICAsIC8qIExJTlVYX1NXQVAgICAqLworCSJceDgzIiAiTGludXggbmF0aXZlIiwgLyogTElOVVhfTkFUSVZFICovCisJIlx4OGUiICJMaW51eCBMVk0iICAgLCAvKiAweDhlICAgICAgICAgKi8KKy8qIE5ldyAoMi4yLngpIHJhaWQgcGFydGl0aW9uIHdpdGggYXV0b2RldGVjdCB1c2luZyBwZXJzaXN0ZW50IHN1cGVyYmxvY2sgKi8KKwkiXHhmZCIgIkxpbnV4IHJhaWQgYXV0b2RldGVjdCIsIC8qIDB4ZmQgICAgICAgICAqLworCU5VTEwKK307CisKKworc3RhdGljIHZvaWQKK3NldF9zdW5fcGFydGl0aW9uKGludCBpLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc3RvcCwgaW50IHN5c2lkKQoreworCXN1bmxhYmVsLT5pbmZvc1tpXS5pZCA9IHN5c2lkOworCXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X2N5bGluZGVyID0KKwkJU1VOX1NTV0FQMzIoc3RhcnQgLyAoZ19oZWFkcyAqIGdfc2VjdG9ycykpOworCXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzID0KKwkJU1VOX1NTV0FQMzIoc3RvcCAtIHN0YXJ0KTsKKwlzZXRfY2hhbmdlZChpKTsKK30KKworc3RhdGljIGludAorY2hlY2tfc3VuX2xhYmVsKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgKnVzaDsKKwlpbnQgY3N1bTsKKworCWlmIChzdW5sYWJlbC0+bWFnaWMgIT0gU1VOX0xBQkVMX01BR0lDCisJICYmIHN1bmxhYmVsLT5tYWdpYyAhPSBTVU5fTEFCRUxfTUFHSUNfU1dBUFBFRAorCSkgeworCQljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9ET1M7CisJCXN1bl9vdGhlcl9lbmRpYW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisJc3VuX290aGVyX2VuZGlhbiA9IChzdW5sYWJlbC0+bWFnaWMgPT0gU1VOX0xBQkVMX01BR0lDX1NXQVBQRUQpOworCXVzaCA9ICgodW5zaWduZWQgc2hvcnQgKikgKHN1bmxhYmVsICsgMSkpIC0gMTsKKwlmb3IgKGNzdW0gPSAwOyB1c2ggPj0gKHVuc2lnbmVkIHNob3J0ICopc3VubGFiZWw7KSBjc3VtIF49ICp1c2gtLTsKKwlpZiAoY3N1bSkgeworCQlwcmludGYoIkRldGVjdGVkIHN1biBkaXNrbGFiZWwgd2l0aCB3cm9uZyBjaGVja3N1bS5cbiIKKyJQcm9iYWJseSB5b3UnbGwgaGF2ZSB0byBzZXQgYWxsIHRoZSB2YWx1ZXMsXG4iCisiZS5nLiBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzIGFuZCBwYXJ0aXRpb25zXG4iCisib3IgZm9yY2UgYSBmcmVzaCBsYWJlbCAocyBjb21tYW5kIGluIG1haW4gbWVudSlcbiIpOworCX0gZWxzZSB7CisJCWdfaGVhZHMgPSBTVU5fU1NXQVAxNihzdW5sYWJlbC0+bnRya3MpOworCQlnX2N5bGluZGVycyA9IFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5uY3lsKTsKKwkJZ19zZWN0b3JzID0gU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5zZWN0KTsKKwl9CisJdXBkYXRlX3VuaXRzKCk7CisJY3VycmVudF9sYWJlbF90eXBlID0gTEFCRUxfU1VOOworCWdfcGFydGl0aW9ucyA9IDg7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuX3ByZWRlZmluZWRfZHJpdmVzIHsKKwljb25zdCBjaGFyICp2ZW5kb3I7CisJY29uc3QgY2hhciAqbW9kZWw7CisJdW5zaWduZWQgc2hvcnQgc3BhcmVjeWw7CisJdW5zaWduZWQgc2hvcnQgbmN5bDsKKwl1bnNpZ25lZCBzaG9ydCBuYWN5bDsKKwl1bnNpZ25lZCBzaG9ydCBwY3lsY291bnQ7CisJdW5zaWduZWQgc2hvcnQgbnRya3M7CisJdW5zaWduZWQgc2hvcnQgbnNlY3Q7CisJdW5zaWduZWQgc2hvcnQgcnNwZWVkOworfSBzdW5fZHJpdmVzW10gPSB7CisJeyAiUXVhbnR1bSIsIlByb0RyaXZlIDgwUyIsMSw4MzIsMiw4MzQsNiwzNCwzNjYyfSwKKwl7ICJRdWFudHVtIiwiUHJvRHJpdmUgMTA1UyIsMSw5NzQsMiwxMDE5LDYsMzUsMzY2Mn0sCisJeyAiQ0RDIiwiV3JlbiBJViA5NDE3MS0zNDQiLDMsMTU0NSwyLDE1NDksOSw0NiwzNjAwfSwKKwl7ICJJQk0iLCJEUEVTLTMxMDgwIiwwLDQ5MDEsMiw0OTAzLDQsMTA4LDU0MDB9LAorCXsgIklCTSIsIkRPUlMtMzIxNjAiLDAsMTAxNSwyLDEwMTcsNjcsNjIsNTQwMH0sCisJeyAiSUJNIiwiRE5FUy0zMTgzNTAiLDAsMTExOTksMiwxMTQ3NCwxMCwzMjAsNzIwMH0sCisJeyAiU0VBR0FURSIsIlNUMzQzNzEiLDAsMzg4MCwyLDM4ODIsMTYsMTM1LDcyMjh9LAorCXsgIiIsIlNVTjAxMDQiLDEsOTc0LDIsMTAxOSw2LDM1LDM2NjJ9LAorCXsgIiIsIlNVTjAyMDciLDQsMTI1NCwyLDEyNzIsOSwzNiwzNjAwfSwKKwl7ICIiLCJTVU4wMzI3IiwzLDE1NDUsMiwxNTQ5LDksNDYsMzYwMH0sCisJeyAiIiwiU1VOMDM0MCIsMCwxNTM4LDIsMTU0NCw2LDcyLDQyMDB9LAorCXsgIiIsIlNVTjA0MjQiLDIsMTE1MSwyLDI1MDAsOSw4MCw0NDAwfSwKKwl7ICIiLCJTVU4wNTM1IiwwLDE4NjYsMiwyNTAwLDcsODAsNTQwMH0sCisJeyAiIiwiU1VOMDY2OSIsNSwxNjE0LDIsMTYzMiwxNSw1NCwzNjAwfSwKKwl7ICIiLCJTVU4xLjBHIiw1LDE3MDMsMiwxOTMxLDE1LDgwLDM1OTd9LAorCXsgIiIsIlNVTjEuMDUiLDAsMjAzNiwyLDIwMzgsMTQsNzIsNTQwMH0sCisJeyAiIiwiU1VOMS4zRyIsNiwxOTY1LDIsMzUwMCwxNyw4MCw1NDAwfSwKKwl7ICIiLCJTVU4yLjFHIiwwLDI3MzMsMiwzNTAwLDE5LDgwLDU0MDB9LAorCXsgIklPTUVHQSIsIkpheiIsMCwxMDE5LDIsMTAyMSw2NCwzMiw1Mzk0fSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuX3ByZWRlZmluZWRfZHJpdmVzICoKK3N1bl9hdXRvY29uZmlndXJlX3Njc2kodm9pZCkKK3sKKwljb25zdCBzdHJ1Y3Qgc3VuX3ByZWRlZmluZWRfZHJpdmVzICpwID0gTlVMTDsKKworI2lmZGVmIFNDU0lfSU9DVExfR0VUX0lETFVOCisJdW5zaWduZWQgaW50IGlkWzJdOworCWNoYXIgYnVmZmVyWzIwNDhdOworCWNoYXIgYnVmZmVyMlsyMDQ4XTsKKwlGSUxFICpwZmQ7CisJY2hhciAqdmVuZG9yOworCWNoYXIgKm1vZGVsOworCWNoYXIgKnE7CisJaW50IGk7CisKKwlpZiAoaW9jdGwoZGV2X2ZkLCBTQ1NJX0lPQ1RMX0dFVF9JRExVTiwgJmlkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcHJpbnRmKGJ1ZmZlciwKKwkJIkhvc3Q6IHNjc2kldSBDaGFubmVsOiAlMDJ1IElkOiAlMDJ1IEx1bjogJTAydVxuIiwKKwkJLyogVGhpcyBpcyB2ZXJ5IHdyb25nICh3b3JrcyBvbmx5IGlmIHlvdSBoYXZlIG9uZSBIQkEpLAorCQkgICBidXQgSSBoYXZlbid0IGZvdW5kIGEgd2F5IGhvdyB0byBnZXQgaG9zdG5vCisJCSAgIGZyb20gdGhlIGN1cnJlbnQga2VybmVsICovCisJCTAsCisJCShpZFswXT4+MTYpICYgMHhmZiwKKwkJaWRbMF0gJiAweGZmLAorCQkoaWRbMF0+PjgpICYgMHhmZgorCSk7CisJcGZkID0gZm9wZW5fZm9yX3JlYWQoIi9wcm9jL3Njc2kvc2NzaSIpOworCWlmICghcGZkKSB7CisJCXJldHVybiBOVUxMOworCX0KKwl3aGlsZSAoZmdldHMoYnVmZmVyMiwgMjA0OCwgcGZkKSkgeworCQlpZiAoc3RyY21wKGJ1ZmZlciwgYnVmZmVyMikpCisJCQljb250aW51ZTsKKwkJaWYgKCFmZ2V0cyhidWZmZXIyLCAyMDQ4LCBwZmQpKQorCQkJYnJlYWs7CisJCXEgPSBzdHJzdHIoYnVmZmVyMiwgIlZlbmRvcjogIik7CisJCWlmICghcSkKKwkJCWJyZWFrOworCQlxICs9IDg7CisJCXZlbmRvciA9IHE7CisJCXEgPSBzdHJzdHIocSwgIiAiKTsKKwkJKnErKyA9ICdcMCc7ICAgLyogdHJ1bmNhdGUgdmVuZG9yIG5hbWUgKi8KKwkJcSA9IHN0cnN0cihxLCAiTW9kZWw6ICIpOworCQlpZiAoIXEpCisJCQlicmVhazsKKwkJKnEgPSAnXDAnOworCQlxICs9IDc7CisJCW1vZGVsID0gcTsKKwkJcSA9IHN0cnN0cihxLCAiIFJldjogIik7CisJCWlmICghcSkKKwkJCWJyZWFrOworCQkqcSA9ICdcMCc7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN1bl9kcml2ZXMpOyBpKyspIHsKKwkJCWlmICgqc3VuX2RyaXZlc1tpXS52ZW5kb3IgJiYgc3RyY2FzZWNtcChzdW5fZHJpdmVzW2ldLnZlbmRvciwgdmVuZG9yKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghc3Ryc3RyKG1vZGVsLCBzdW5fZHJpdmVzW2ldLm1vZGVsKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiQXV0b2NvbmZpZ3VyZSBmb3VuZCBhICVzJXMlc1xuIiwKKwkJCQkJc3VuX2RyaXZlc1tpXS52ZW5kb3IsCisJCQkJCSgqc3VuX2RyaXZlc1tpXS52ZW5kb3IpID8gIiAiIDogIiIsCisJCQkJCXN1bl9kcml2ZXNbaV0ubW9kZWwpOworCQkJcCA9IHN1bl9kcml2ZXMgKyBpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWZjbG9zZShwZmQpOworI2VuZGlmCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkCitjcmVhdGVfc3VubGFiZWwodm9pZCkKK3sKKwlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbWV0cnk7CisJdW5zaWduZWQgbmRpdjsKKwl1bnNpZ25lZCBjaGFyIGM7CisJY29uc3Qgc3RydWN0IHN1bl9wcmVkZWZpbmVkX2RyaXZlcyAqcCA9IE5VTEw7CisKKwlwcmludGYobXNnX2J1aWxkaW5nX25ld19sYWJlbCwgInN1biBkaXNrbGFiZWwiKTsKKworCXN1bl9vdGhlcl9lbmRpYW4gPSBCQl9MSVRUTEVfRU5ESUFOOworCW1lbXNldChNQlJidWZmZXIsIDAsIHNpemVvZihNQlJidWZmZXIpKTsKKwlzdW5sYWJlbC0+bWFnaWMgPSBTVU5fU1NXQVAxNihTVU5fTEFCRUxfTUFHSUMpOworCWlmICghZmxvcHB5KSB7CisJCXVuc2lnbmVkIGk7CisJCXB1dHMoIkRyaXZlIHR5cGVcbiIKKwkJICIgICA/ICAgYXV0byBjb25maWd1cmVcbiIKKwkJICIgICAwICAgY3VzdG9tICh3aXRoIGhhcmR3YXJlIGRldGVjdGVkIGRlZmF1bHRzKSIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdW5fZHJpdmVzKTsgaSsrKSB7CisJCQlwcmludGYoIiAgICVjICAgJXMlcyVzXG4iLAorCQkJCWkgKyAnYScsIHN1bl9kcml2ZXNbaV0udmVuZG9yLAorCQkJCSgqc3VuX2RyaXZlc1tpXS52ZW5kb3IpID8gIiAiIDogIiIsCisJCQkJc3VuX2RyaXZlc1tpXS5tb2RlbCk7CisJCX0KKwkJd2hpbGUgKDEpIHsKKwkJCWMgPSByZWFkX25vbmVtcHR5KCJTZWxlY3QgdHlwZSAoPyBmb3IgYXV0bywgMCBmb3IgY3VzdG9tKTogIik7CisJCQlpZiAoYyA9PSAnMCcpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjID49ICdhJyAmJiBjIDwgJ2EnICsgQVJSQVlfU0laRShzdW5fZHJpdmVzKSkgeworCQkJCXAgPSBzdW5fZHJpdmVzICsgYyAtICdhJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjID49ICdBJyAmJiBjIDwgJ0EnICsgQVJSQVlfU0laRShzdW5fZHJpdmVzKSkgeworCQkJCXAgPSBzdW5fZHJpdmVzICsgYyAtICdBJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjID09ICc/JyAmJiBzY3NpX2Rpc2spIHsKKwkJCQlwID0gc3VuX2F1dG9jb25maWd1cmVfc2NzaSgpOworCQkJCWlmIChwKQorCQkJCQlicmVhazsKKwkJCQlwcmludGYoIkF1dG9jb25maWd1cmUgZmFpbGVkXG4iKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIXAgfHwgZmxvcHB5KSB7CisJCWlmICghaW9jdGwoZGV2X2ZkLCBIRElPX0dFVEdFTywgJmdlb21ldHJ5KSkgeworCQkJZ19oZWFkcyA9IGdlb21ldHJ5LmhlYWRzOworCQkJZ19zZWN0b3JzID0gZ2VvbWV0cnkuc2VjdG9yczsKKwkJCWdfY3lsaW5kZXJzID0gZ2VvbWV0cnkuY3lsaW5kZXJzOworCQl9IGVsc2UgeworCQkJZ19oZWFkcyA9IDA7CisJCQlnX3NlY3RvcnMgPSAwOworCQkJZ19jeWxpbmRlcnMgPSAwOworCQl9CisJCWlmIChmbG9wcHkpIHsKKwkJCXN1bmxhYmVsLT5uYWN5bCA9IDA7CisJCQlzdW5sYWJlbC0+cGN5bGNvdW50ID0gU1VOX1NTV0FQMTYoZ19jeWxpbmRlcnMpOworCQkJc3VubGFiZWwtPnJzcGVlZCA9IFNVTl9TU1dBUDE2KDMwMCk7CisJCQlzdW5sYWJlbC0+aWxmYWN0ID0gU1VOX1NTV0FQMTYoMSk7CisJCQlzdW5sYWJlbC0+c3BhcmVjeWwgPSAwOworCQl9IGVsc2UgeworCQkJZ19oZWFkcyA9IHJlYWRfaW50KDEsIGdfaGVhZHMsIDEwMjQsIDAsICJIZWFkcyIpOworCQkJZ19zZWN0b3JzID0gcmVhZF9pbnQoMSwgZ19zZWN0b3JzLCAxMDI0LCAwLCAiU2VjdG9ycy90cmFjayIpOworCQlpZiAoZ19jeWxpbmRlcnMpCisJCQlnX2N5bGluZGVycyA9IHJlYWRfaW50KDEsIGdfY3lsaW5kZXJzIC0gMiwgNjU1MzUsIDAsICJDeWxpbmRlcnMiKTsKKwkJZWxzZQorCQkJZ19jeWxpbmRlcnMgPSByZWFkX2ludCgxLCAwLCA2NTUzNSwgMCwgIkN5bGluZGVycyIpOworCQkJc3VubGFiZWwtPm5hY3lsID0gU1VOX1NTV0FQMTYocmVhZF9pbnQoMCwgMiwgNjU1MzUsIDAsICJBbHRlcm5hdGUgY3lsaW5kZXJzIikpOworCQkJc3VubGFiZWwtPnBjeWxjb3VudCA9IFNVTl9TU1dBUDE2KHJlYWRfaW50KDAsIGdfY3lsaW5kZXJzICsgU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5hY3lsKSwgNjU1MzUsIDAsICJQaHlzaWNhbCBjeWxpbmRlcnMiKSk7CisJCQlzdW5sYWJlbC0+cnNwZWVkID0gU1VOX1NTV0FQMTYocmVhZF9pbnQoMSwgNTQwMCwgMTAwMDAwLCAwLCAiUm90YXRpb24gc3BlZWQgKHJwbSkiKSk7CisJCQlzdW5sYWJlbC0+aWxmYWN0ID0gU1VOX1NTV0FQMTYocmVhZF9pbnQoMSwgMSwgMzIsIDAsICJJbnRlcmxlYXZlIGZhY3RvciIpKTsKKwkJCXN1bmxhYmVsLT5zcGFyZWN5bCA9IFNVTl9TU1dBUDE2KHJlYWRfaW50KDAsIDAsIGdfc2VjdG9ycywgMCwgIkV4dHJhIHNlY3RvcnMgcGVyIGN5bGluZGVyIikpOworCQl9CisJfSBlbHNlIHsKKwkJc3VubGFiZWwtPnNwYXJlY3lsID0gU1VOX1NTV0FQMTYocC0+c3BhcmVjeWwpOworCQlzdW5sYWJlbC0+bmN5bCA9IFNVTl9TU1dBUDE2KHAtPm5jeWwpOworCQlzdW5sYWJlbC0+bmFjeWwgPSBTVU5fU1NXQVAxNihwLT5uYWN5bCk7CisJCXN1bmxhYmVsLT5wY3lsY291bnQgPSBTVU5fU1NXQVAxNihwLT5wY3lsY291bnQpOworCQlzdW5sYWJlbC0+bnRya3MgPSBTVU5fU1NXQVAxNihwLT5udHJrcyk7CisJCXN1bmxhYmVsLT5uc2VjdCA9IFNVTl9TU1dBUDE2KHAtPm5zZWN0KTsKKwkJc3VubGFiZWwtPnJzcGVlZCA9IFNVTl9TU1dBUDE2KHAtPnJzcGVlZCk7CisJCXN1bmxhYmVsLT5pbGZhY3QgPSBTVU5fU1NXQVAxNigxKTsKKwkJZ19jeWxpbmRlcnMgPSBwLT5uY3lsOworCQlnX2hlYWRzID0gcC0+bnRya3M7CisJCWdfc2VjdG9ycyA9IHAtPm5zZWN0OworCQlwdXRzKCJZb3UgbWF5IGNoYW5nZSBhbGwgdGhlIGRpc2sgcGFyYW1zIGZyb20gdGhlIHggbWVudSIpOworCX0KKworCXNucHJpbnRmKChjaGFyICopKHN1bmxhYmVsLT5pbmZvKSwgc2l6ZW9mKHN1bmxhYmVsLT5pbmZvKSwKKwkJIiVzJXMlcyBjeWwgJXUgYWx0ICV1IGhkICV1IHNlYyAldSIsCisJCXAgPyBwLT52ZW5kb3IgOiAiIiwgKHAgJiYgKnAtPnZlbmRvcikgPyAiICIgOiAiIiwKKwkJcCA/IHAtPm1vZGVsIDogKGZsb3BweSA/ICIzLDVcIiBmbG9wcHkiIDogIkxpbnV4IGN1c3RvbSIpLAorCQlnX2N5bGluZGVycywgU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5hY3lsKSwgZ19oZWFkcywgZ19zZWN0b3JzKTsKKworCXN1bmxhYmVsLT5udHJrcyA9IFNVTl9TU1dBUDE2KGdfaGVhZHMpOworCXN1bmxhYmVsLT5uc2VjdCA9IFNVTl9TU1dBUDE2KGdfc2VjdG9ycyk7CisJc3VubGFiZWwtPm5jeWwgPSBTVU5fU1NXQVAxNihnX2N5bGluZGVycyk7CisJaWYgKGZsb3BweSkKKwkJc2V0X3N1bl9wYXJ0aXRpb24oMCwgMCwgZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzLCBMSU5VWF9OQVRJVkUpOworCWVsc2UgeworCQlpZiAoZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzID49IDE1MCAqIDIwNDgpIHsKKwkJCW5kaXYgPSBnX2N5bGluZGVycyAtICg1MCAqIDIwNDggLyAoZ19oZWFkcyAqIGdfc2VjdG9ycykpOyAvKiA1ME0gc3dhcCAqLworCQl9IGVsc2UKKwkJCW5kaXYgPSBnX2N5bGluZGVycyAqIDIgLyAzOworCQlzZXRfc3VuX3BhcnRpdGlvbigwLCAwLCBuZGl2ICogZ19oZWFkcyAqIGdfc2VjdG9ycywgTElOVVhfTkFUSVZFKTsKKwkJc2V0X3N1bl9wYXJ0aXRpb24oMSwgbmRpdiAqIGdfaGVhZHMgKiBnX3NlY3RvcnMsIGdfY3lsaW5kZXJzICogZ19oZWFkcyAqIGdfc2VjdG9ycywgTElOVVhfU1dBUCk7CisJCXN1bmxhYmVsLT5pbmZvc1sxXS5mbGFncyB8PSAweDAxOyAvKiBOb3QgbW91bnRhYmxlICovCisJfQorCXNldF9zdW5fcGFydGl0aW9uKDIsIDAsIGdfY3lsaW5kZXJzICogZ19oZWFkcyAqIGdfc2VjdG9ycywgU1VOX1dIT0xFX0RJU0spOworCXsKKwkJdW5zaWduZWQgc2hvcnQgKnVzaCA9ICh1bnNpZ25lZCBzaG9ydCAqKXN1bmxhYmVsOworCQl1bnNpZ25lZCBzaG9ydCBjc3VtID0gMDsKKwkJd2hpbGUgKHVzaCA8ICh1bnNpZ25lZCBzaG9ydCAqKSgmc3VubGFiZWwtPmNzdW0pKQorCQkJY3N1bSBePSAqdXNoKys7CisJCXN1bmxhYmVsLT5jc3VtID0gY3N1bTsKKwl9CisKKwlzZXRfYWxsX3VuY2hhbmdlZCgpOworCXNldF9jaGFuZ2VkKDApOworCWdldF9ib290KENSRUFURV9FTVBUWV9TVU4pOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX3N1bmZsYWdzKGludCBpLCB1bnNpZ25lZCBjaGFyIG1hc2spCit7CisJaWYgKHN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmIG1hc2spCisJCXN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmPSB+bWFzazsKKwllbHNlCisJCXN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyB8PSBtYXNrOworCXNldF9jaGFuZ2VkKGkpOworfQorCitzdGF0aWMgdm9pZAorZmV0Y2hfc3VuKHVuc2lnbmVkICpzdGFydHMsIHVuc2lnbmVkICpsZW5zLCB1bnNpZ25lZCAqc3RhcnQsIHVuc2lnbmVkICpzdG9wKQoreworCWludCBpLCBjb250aW51b3VzID0gMTsKKworCSpzdGFydCA9IDA7CisJKnN0b3AgPSBnX2N5bGluZGVycyAqIGdfaGVhZHMgKiBnX3NlY3RvcnM7CisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCWlmIChzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5udW1fc2VjdG9ycworCQkgJiYgc3VubGFiZWwtPmluZm9zW2ldLmlkCisJCSAmJiBzdW5sYWJlbC0+aW5mb3NbaV0uaWQgIT0gU1VOX1dIT0xFX0RJU0spIHsKKwkJCXN0YXJ0c1tpXSA9IFNVTl9TU1dBUDMyKHN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X2N5bGluZGVyKSAqIGdfaGVhZHMgKiBnX3NlY3RvcnM7CisJCQlsZW5zW2ldID0gU1VOX1NTV0FQMzIoc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMpOworCQkJaWYgKGNvbnRpbnVvdXMpIHsKKwkJCQlpZiAoc3RhcnRzW2ldID09ICpzdGFydCkKKwkJCQkJKnN0YXJ0ICs9IGxlbnNbaV07CisJCQkJZWxzZSBpZiAoc3RhcnRzW2ldICsgbGVuc1tpXSA+PSAqc3RvcCkKKwkJCQkJKnN0b3AgPSBzdGFydHNbaV07CisJCQkJZWxzZQorCQkJCQljb250aW51b3VzID0gMDsKKwkJCQkJLyogVGhlcmUgd2lsbCBiZSBwcm9iYWJseSBtb3JlIGdhcHMKKwkJCQkJICB0aGFuIG9uZSwgc28gbGV0cyBjaGVjayBhZnRlcndhcmRzICovCisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGFydHNbaV0gPSAwOworCQkJbGVuc1tpXSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCAqdmVyaWZ5X3N1bl9zdGFydHM7CisKK3N0YXRpYyBpbnQKK3ZlcmlmeV9zdW5fY21wKGludCAqYSwgaW50ICpiKQoreworCWlmICgqYSA9PSAtMSkgcmV0dXJuIDE7CisJaWYgKCpiID09IC0xKSByZXR1cm4gLTE7CisJaWYgKHZlcmlmeV9zdW5fc3RhcnRzWyphXSA+IHZlcmlmeV9zdW5fc3RhcnRzWypiXSkgcmV0dXJuIDE7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAordmVyaWZ5X3N1bih2b2lkKQoreworCXVuc2lnbmVkIHN0YXJ0c1s4XSwgbGVuc1s4XSwgc3RhcnQsIHN0b3A7CisJaW50IGksaixrLHN0YXJ0byxlbmRvOworCWludCBhcnJheVs4XTsKKworCXZlcmlmeV9zdW5fc3RhcnRzID0gc3RhcnRzOworCWZldGNoX3N1bihzdGFydHMsIGxlbnMsICZzdGFydCwgJnN0b3ApOworCWZvciAoayA9IDA7IGsgPCA3OyBrKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJaWYgKGsgJiYgKGxlbnNbaV0gJSAoZ19oZWFkcyAqIGdfc2VjdG9ycykpKSB7CisJCQkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgZG9lc24ndCBlbmQgb24gY3lsaW5kZXIgYm91bmRhcnlcbiIsIGkrMSk7CisJCQl9CisJCQlpZiAobGVuc1tpXSkgeworCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQkJCWlmIChsZW5zW2pdKSB7CisJCQkJCQlpZiAoc3RhcnRzW2pdID09IHN0YXJ0c1tpXStsZW5zW2ldKSB7CisJCQkJCQkJc3RhcnRzW2pdID0gc3RhcnRzW2ldOyBsZW5zW2pdICs9IGxlbnNbaV07CisJCQkJCQkJbGVuc1tpXSA9IDA7CisJCQkJCQl9IGVsc2UgaWYgKHN0YXJ0c1tpXSA9PSBzdGFydHNbal0rbGVuc1tqXSl7CisJCQkJCQkJbGVuc1tqXSArPSBsZW5zW2ldOworCQkJCQkJCWxlbnNbaV0gPSAwOworCQkJCQkJfSBlbHNlIGlmICghaykgeworCQkJCQkJCWlmIChzdGFydHNbaV0gPCBzdGFydHNbal0rbGVuc1tqXQorCQkJCQkJCSAmJiBzdGFydHNbal0gPCBzdGFydHNbaV0rbGVuc1tpXSkgeworCQkJCQkJCQlzdGFydG8gPSBzdGFydHNbaV07CisJCQkJCQkJCWlmIChzdGFydHNbal0gPiBzdGFydG8pCisJCQkJCQkJCQlzdGFydG8gPSBzdGFydHNbal07CisJCQkJCQkJCWVuZG8gPSBzdGFydHNbaV0rbGVuc1tpXTsKKwkJCQkJCQkJaWYgKHN0YXJ0c1tqXStsZW5zW2pdIDwgZW5kbykKKwkJCQkJCQkJCWVuZG8gPSBzdGFydHNbal0rbGVuc1tqXTsKKwkJCQkJCQkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgb3ZlcmxhcHMgd2l0aCBvdGhlcnMgaW4gIgorCQkJCQkJCQkJInNlY3RvcnMgJXUtJXVcbiIsIGkrMSwgc3RhcnRvLCBlbmRvKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChsZW5zW2ldKQorCQkJYXJyYXlbaV0gPSBpOworCQllbHNlCisJCQlhcnJheVtpXSA9IC0xOworCX0KKwlxc29ydChhcnJheSwgQVJSQVlfU0laRShhcnJheSksIHNpemVvZihhcnJheVswXSksCisJCShpbnQgKCopKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICopKSB2ZXJpZnlfc3VuX2NtcCk7CisJaWYgKGFycmF5WzBdID09IC0xKSB7CisJCXByaW50ZigiTm8gcGFydGl0aW9ucyBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzdG9wID0gZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzOworCWlmIChzdGFydHNbYXJyYXlbMF1dKQorCQlwcmludGYoIlVudXNlZCBnYXAgLSBzZWN0b3JzICV1LSV1XG4iLCAwLCBzdGFydHNbYXJyYXlbMF1dKTsKKwlmb3IgKGkgPSAwOyBpIDwgNyAmJiBhcnJheVtpKzFdICE9IC0xOyBpKyspIHsKKwkJcHJpbnRmKCJVbnVzZWQgZ2FwIC0gc2VjdG9ycyAldS0ldVxuIiwgc3RhcnRzW2FycmF5W2ldXStsZW5zW2FycmF5W2ldXSwgc3RhcnRzW2FycmF5W2krMV1dKTsKKwl9CisJc3RhcnQgPSBzdGFydHNbYXJyYXlbaV1dICsgbGVuc1thcnJheVtpXV07CisJaWYgKHN0YXJ0IDwgc3RvcCkKKwkJcHJpbnRmKCJVbnVzZWQgZ2FwIC0gc2VjdG9ycyAldS0ldVxuIiwgc3RhcnQsIHN0b3ApOworfQorCitzdGF0aWMgdm9pZAorYWRkX3N1bl9wYXJ0aXRpb24oaW50IG4sIGludCBzeXMpCit7CisJdW5zaWduZWQgc3RhcnQsIHN0b3AsIHN0b3AyOworCXVuc2lnbmVkIHN0YXJ0c1s4XSwgbGVuc1s4XTsKKwlpbnQgd2hvbGVfZGlzayA9IDA7CisKKwljaGFyIG1lc2dbMjU2XTsKKwlpbnQgaSwgZmlyc3QsIGxhc3Q7CisKKwlpZiAoc3VubGFiZWwtPnBhcnRpdGlvbnNbbl0ubnVtX3NlY3RvcnMgJiYgc3VubGFiZWwtPmluZm9zW25dLmlkKSB7CisJCXByaW50Zihtc2dfcGFydF9hbHJlYWR5X2RlZmluZWQsIG4gKyAxKTsKKwkJcmV0dXJuOworCX0KKworCWZldGNoX3N1bihzdGFydHMsIGxlbnMsICZzdGFydCwgJnN0b3ApOworCWlmIChzdG9wIDw9IHN0YXJ0KSB7CisJCWlmIChuID09IDIpCisJCQl3aG9sZV9kaXNrID0gMTsKKwkJZWxzZSB7CisJCQlwcmludGYoIk90aGVyIHBhcnRpdGlvbnMgYWxyZWFkeSBjb3ZlciB0aGUgd2hvbGUgZGlzay5cbiIKKwkJCQkiRGVsZXRlL3NocmluayB0aGVtIGJlZm9yZSByZXRyeS5cbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNucHJpbnRmKG1lc2csIHNpemVvZihtZXNnKSwgIkZpcnN0ICVzIiwgc3RyX3VuaXRzKFNJTkdVTEFSKSk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHdob2xlX2Rpc2spCisJCQlmaXJzdCA9IHJlYWRfaW50KDAsIDAsIDAsIDAsIG1lc2cpOworCQllbHNlCisJCQlmaXJzdCA9IHJlYWRfaW50KHNjcm91bmQoc3RhcnQpLCBzY3JvdW5kKHN0b3ApKzEsCisJCQkJCSBzY3JvdW5kKHN0b3ApLCAwLCBtZXNnKTsKKwkJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQkJZmlyc3QgKj0gdW5pdHNfcGVyX3NlY3RvcjsKKwkJZWxzZQorCQkJLyogU3RhcnRpbmcgc2VjdG9yIGhhcyB0byBiZSBwcm9wZXJseSBhbGlnbmVkICovCisJCQlmaXJzdCA9IChmaXJzdCArIGdfaGVhZHMgKiBnX3NlY3RvcnMgLSAxKSAvIChnX2hlYWRzICogZ19zZWN0b3JzKTsKKwkJaWYgKG4gPT0gMiAmJiBmaXJzdCAhPSAwKQorCQkJcHJpbnRmKCJcCitJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB0aGUgdGhpcmQgcGFydGl0aW9uIGNvdmVycyB0aGUgd2hvbGUgZGlza1xuXAorYW5kIGlzIG9mIHR5cGUgJ1dob2xlIGRpc2snXG4iKTsKKwkJLyogZXd0IGFza3MgdG8gYWRkOiAiZG9uJ3Qgc3RhcnQgYSBwYXJ0aXRpb24gYXQgY3lsIDAiCisJCSAgIEhvd2V2ZXIsIGVkbXVuZG9AcmFuby5kZW1vbi5jby51ayB3cml0ZXM6CisJCSAgICJJbiBhZGRpdGlvbiB0byBoYXZpbmcgYSBTdW4gcGFydGl0aW9uIHRhYmxlLCB0byBiZSBhYmxlIHRvCisJCSAgIGJvb3QgZnJvbSB0aGUgZGlzYywgdGhlIGZpcnN0IHBhcnRpdGlvbiwgL2Rldi9zZFgxLCBtdXN0CisJCSAgIHN0YXJ0IGF0IGN5bGluZGVyIDAuIFRoaXMgbWVhbnMgdGhhdCAvZGV2L3NkWDEgY29udGFpbnMKKwkJICAgdGhlIHBhcnRpdGlvbiB0YWJsZSBhbmQgdGhlIGJvb3QgYmxvY2ssIGFzIHRoZXNlIGFyZSB0aGUKKwkJICAgZmlyc3QgdHdvIHNlY3RvcnMgb2YgdGhlIGRpc2MuIFRoZXJlZm9yZSB5b3UgbXVzdCBiZQorCQkgICBjYXJlZnVsIHdoYXQgeW91IHVzZSAvZGV2L3NkWDEgZm9yLiBJbiBwYXJ0aWN1bGFyLCB5b3UgbXVzdAorCQkgICBub3QgdXNlIGEgcGFydGl0aW9uIHN0YXJ0aW5nIGF0IGN5bGluZGVyIDAgZm9yIExpbnV4IHN3YXAsCisJCSAgIGFzIHRoYXQgd291bGQgb3ZlcndyaXRlIHRoZSBwYXJ0aXRpb24gdGFibGUgYW5kIHRoZSBib290CisJCSAgIGJsb2NrLiBZb3UgbWF5LCBob3dldmVyLCB1c2Ugc3VjaCBhIHBhcnRpdGlvbiBmb3IgYSBVRlMKKwkJICAgb3IgRVhUMiBmaWxlIHN5c3RlbSwgYXMgdGhlc2UgZmlsZSBzeXN0ZW1zIGxlYXZlIHRoZSBmaXJzdAorCQkgICAxMDI0IGJ5dGVzIHVuZGlzdHVyYmVkLiAqLworCQkvKiBPbiB0aGUgb3RoZXIgaGFuZCwgb25lIHNob3VsZCBub3QgdXNlIHBhcnRpdGlvbnMKKwkJICAgc3RhcnRpbmcgYXQgYmxvY2sgMCBpbiBhbiBtZCwgb3IgdGhlIGxhYmVsIHdpbGwKKwkJICAgYmUgdHJhc2hlZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKQorCQkJaWYgKGxlbnNbaV0gJiYgc3RhcnRzW2ldIDw9IGZpcnN0ICYmIHN0YXJ0c1tpXSArIGxlbnNbaV0gPiBmaXJzdCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPCBnX3BhcnRpdGlvbnMgJiYgIXdob2xlX2Rpc2spIHsKKwkJCWlmIChuID09IDIgJiYgIWZpcnN0KSB7CisJCQkJd2hvbGVfZGlzayA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmludGYoIlNlY3RvciAldSBpcyBhbHJlYWR5IGFsbG9jYXRlZFxuIiwgZmlyc3QpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwlzdG9wID0gZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzOworCXN0b3AyID0gc3RvcDsKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJaWYgKHN0YXJ0c1tpXSA+IGZpcnN0ICYmIHN0YXJ0c1tpXSA8IHN0b3ApCisJCQlzdG9wID0gc3RhcnRzW2ldOworCX0KKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksCisJCSJMYXN0ICVzIG9yICtzaXplIG9yICtzaXplTSBvciArc2l6ZUsiLAorCQlzdHJfdW5pdHMoU0lOR1VMQVIpKTsKKwlpZiAod2hvbGVfZGlzaykKKwkJbGFzdCA9IHJlYWRfaW50KHNjcm91bmQoc3RvcDIpLCBzY3JvdW5kKHN0b3AyKSwgc2Nyb3VuZChzdG9wMiksCisJCQkJMCwgbWVzZyk7CisJZWxzZSBpZiAobiA9PSAyICYmICFmaXJzdCkKKwkJbGFzdCA9IHJlYWRfaW50KHNjcm91bmQoZmlyc3QpLCBzY3JvdW5kKHN0b3AyKSwgc2Nyb3VuZChzdG9wMiksCisJCQkJc2Nyb3VuZChmaXJzdCksIG1lc2cpOworCWVsc2UKKwkJbGFzdCA9IHJlYWRfaW50KHNjcm91bmQoZmlyc3QpLCBzY3JvdW5kKHN0b3ApLCBzY3JvdW5kKHN0b3ApLAorCQkJCXNjcm91bmQoZmlyc3QpLCBtZXNnKTsKKwlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMpCisJCWxhc3QgKj0gdW5pdHNfcGVyX3NlY3RvcjsKKwlpZiAobiA9PSAyICYmICFmaXJzdCkgeworCQlpZiAobGFzdCA+PSBzdG9wMikgeworCQkJd2hvbGVfZGlzayA9IDE7CisJCQlsYXN0ID0gc3RvcDI7CisJCX0gZWxzZSBpZiAobGFzdCA+IHN0b3ApIHsKKwkJCXByaW50ZigKKyJZb3UgaGF2ZW4ndCBjb3ZlcmVkIHRoZSB3aG9sZSBkaXNrIHdpdGggdGhlIDNyZCBwYXJ0aXRpb24sXG4iCisiYnV0IHlvdXIgdmFsdWUgJXUgJXMgY292ZXJzIHNvbWUgb3RoZXIgcGFydGl0aW9uLlxuIgorIllvdXIgZW50cnkgaGFzIGJlZW4gY2hhbmdlZCB0byAldSAlc1xuIiwKKwkJCQlzY3JvdW5kKGxhc3QpLCBzdHJfdW5pdHMoU0lOR1VMQVIpLAorCQkJCXNjcm91bmQoc3RvcCksIHN0cl91bml0cyhTSU5HVUxBUikpOworCQkJbGFzdCA9IHN0b3A7CisJCX0KKwl9IGVsc2UgaWYgKCF3aG9sZV9kaXNrICYmIGxhc3QgPiBzdG9wKQorCQlsYXN0ID0gc3RvcDsKKworCWlmICh3aG9sZV9kaXNrKQorCQlzeXMgPSBTVU5fV0hPTEVfRElTSzsKKwlzZXRfc3VuX3BhcnRpdGlvbihuLCBmaXJzdCwgbGFzdCwgc3lzKTsKK30KKworc3RhdGljIHZvaWQKK3N1bl9kZWxldGVfcGFydGl0aW9uKGludCBpKQoreworCXVuc2lnbmVkIGludCBuc2VjOworCisJaWYgKGkgPT0gMgorCSAmJiBzdW5sYWJlbC0+aW5mb3NbaV0uaWQgPT0gU1VOX1dIT0xFX0RJU0sKKwkgJiYgIXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X2N5bGluZGVyCisJICYmIChuc2VjID0gU1VOX1NTV0FQMzIoc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMpKSA9PSBnX2hlYWRzICogZ19zZWN0b3JzICogZ19jeWxpbmRlcnMpCisJCXByaW50ZigiSWYgeW91IHdhbnQgdG8gbWFpbnRhaW4gU3VuT1MvU29sYXJpcyBjb21wYXRpYmlsaXR5LCAiCisJCQkiY29uc2lkZXIgbGVhdmluZyB0aGlzXG4iCisJCQkicGFydGl0aW9uIGFzIFdob2xlIGRpc2sgKDUpLCBzdGFydGluZyBhdCAwLCB3aXRoICV1ICIKKwkJCSJzZWN0b3JzXG4iLCBuc2VjKTsKKwlzdW5sYWJlbC0+aW5mb3NbaV0uaWQgPSAwOworCXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzID0gMDsKK30KKworc3RhdGljIHZvaWQKK3N1bl9jaGFuZ2Vfc3lzaWQoaW50IGksIGludCBzeXMpCit7CisJaWYgKHN5cyA9PSBMSU5VWF9TV0FQICYmICFzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5zdGFydF9jeWxpbmRlcikgeworCQlyZWFkX21heWJlX2VtcHR5KAorCQkJIkl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHRoZSBwYXJ0aXRpb24gYXQgb2Zmc2V0IDBcbiIKKwkJCSJpcyBVRlMsIEVYVDJGUyBmaWxlc3lzdGVtIG9yIFN1bk9TIHN3YXAuIFB1dHRpbmcgTGludXggc3dhcFxuIgorCQkJInRoZXJlIG1heSBkZXN0cm95IHlvdXIgcGFydGl0aW9uIHRhYmxlIGFuZCBib290YmxvY2suXG4iCisJCQkiVHlwZSBZRVMgaWYgeW91J3JlIHZlcnkgc3VyZSB5b3Ugd291bGQgbGlrZSB0aGF0IHBhcnRpdGlvblxuIgorCQkJInRhZ2dlZCB3aXRoIDgyIChMaW51eCBzd2FwKTogIik7CisJCWlmIChzdHJjbXAgKGxpbmVfcHRyLCAiWUVTXG4iKSkKKwkJCXJldHVybjsKKwl9CisJc3dpdGNoIChzeXMpIHsKKwljYXNlIFNVTk9TX1NXQVA6CisJY2FzZSBMSU5VWF9TV0FQOgorCQkvKiBzd2FwcyBhcmUgbm90IG1vdW50YWJsZSBieSBkZWZhdWx0ICovCisJCXN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyB8PSAweDAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBhc3N1bWUgb3RoZXIgdHlwZXMgYXJlIG1vdW50YWJsZTsKKwkJICAgdXNlciBjYW4gY2hhbmdlIGl0IGFueXdheSAqLworCQlzdW5sYWJlbC0+aW5mb3NbaV0uZmxhZ3MgJj0gfjB4MDE7CisJCWJyZWFrOworCX0KKwlzdW5sYWJlbC0+aW5mb3NbaV0uaWQgPSBzeXM7Cit9CisKK3N0YXRpYyB2b2lkCitzdW5fbGlzdF90YWJsZShpbnQgeHRyYSkKK3sKKwlpbnQgaSwgdzsKKworCXcgPSBzdHJsZW4oZGlza19kZXZpY2UpOworCWlmICh4dHJhKQorCQlwcmludGYoCisJCSJcbkRpc2sgJXMgKFN1biBkaXNrIGxhYmVsKTogJXUgaGVhZHMsICV1IHNlY3RvcnMsICV1IHJwbVxuIgorCQkiJXUgY3lsaW5kZXJzLCAldSBhbHRlcm5hdGUgY3lsaW5kZXJzLCAldSBwaHlzaWNhbCBjeWxpbmRlcnNcbiIKKwkJIiV1IGV4dHJhIHNlY3RzL2N5bCwgaW50ZXJsZWF2ZSAldToxXG4iCisJCSIlc1xuIgorCQkiVW5pdHMgPSAlcyBvZiAldSAqIDUxMiBieXRlc1xuXG4iLAorCQkJZGlza19kZXZpY2UsIGdfaGVhZHMsIGdfc2VjdG9ycywgU1VOX1NTV0FQMTYoc3VubGFiZWwtPnJzcGVlZCksCisJCQlnX2N5bGluZGVycywgU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5hY3lsKSwKKwkJCVNVTl9TU1dBUDE2KHN1bmxhYmVsLT5wY3lsY291bnQpLAorCQkJU1VOX1NTV0FQMTYoc3VubGFiZWwtPnNwYXJlY3lsKSwKKwkJCVNVTl9TU1dBUDE2KHN1bmxhYmVsLT5pbGZhY3QpLAorCQkJKGNoYXIgKilzdW5sYWJlbCwKKwkJCXN0cl91bml0cyhQTFVSQUwpLCB1bml0c19wZXJfc2VjdG9yKTsKKwllbHNlCisJCXByaW50ZigKKwkiXG5EaXNrICVzIChTdW4gZGlzayBsYWJlbCk6ICV1IGhlYWRzLCAldSBzZWN0b3JzLCAldSBjeWxpbmRlcnNcbiIKKwkiVW5pdHMgPSAlcyBvZiAldSAqIDUxMiBieXRlc1xuXG4iLAorCQkJZGlza19kZXZpY2UsIGdfaGVhZHMsIGdfc2VjdG9ycywgZ19jeWxpbmRlcnMsCisJCQlzdHJfdW5pdHMoUExVUkFMKSwgdW5pdHNfcGVyX3NlY3Rvcik7CisKKwlwcmludGYoIiUqcyBGbGFnICAgIFN0YXJ0ICAgICAgIEVuZCAgICBCbG9ja3MgICBJZCAgU3lzdGVtXG4iLAorCQl3ICsgMSwgIkRldmljZSIpOworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlpZiAoc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMpIHsKKwkJCXVpbnQzMl90IHN0YXJ0ID0gU1VOX1NTV0FQMzIoc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0uc3RhcnRfY3lsaW5kZXIpICogZ19oZWFkcyAqIGdfc2VjdG9yczsKKwkJCXVpbnQzMl90IGxlbiA9IFNVTl9TU1dBUDMyKHN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzKTsKKwkJCXByaW50ZigiJXMgJWMlYyAlOWx1ICU5bHUgJTlsdSVjICAlMnggICVzXG4iLAorCQkJCXBhcnRuYW1lKGRpc2tfZGV2aWNlLCBpKzEsIHcpLCAgICAgICAgICAgICAgICAgIC8qIGRldmljZSAqLworCQkJCShzdW5sYWJlbC0+aW5mb3NbaV0uZmxhZ3MgJiAweDAxKSA/ICd1JyA6ICcgJywgIC8qIGZsYWdzICovCisJCQkJKHN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmIDB4MTApID8gJ3InIDogJyAnLAorCQkJCShsb25nKSBzY3JvdW5kKHN0YXJ0KSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0ICovCisJCQkJKGxvbmcpIHNjcm91bmQoc3RhcnQrbGVuKSwgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICovCisJCQkJKGxvbmcpIGxlbiAvIDIsIGxlbiAmIDEgPyAnKycgOiAnICcsICAgICAgICAgICAgLyogb2RkIGZsYWcgb24gZW5kICovCisJCQkJc3VubGFiZWwtPmluZm9zW2ldLmlkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBpZCAqLworCQkJCXBhcnRpdGlvbl90eXBlKHN1bmxhYmVsLT5pbmZvc1tpXS5pZCkpOyAgICAgICAgIC8qIHR5cGUgbmFtZSAqLworCQl9CisJfQorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKKworc3RhdGljIHZvaWQKK3N1bl9zZXRfYWx0X2N5bCh2b2lkKQoreworCXN1bmxhYmVsLT5uYWN5bCA9CisJCVNVTl9TU1dBUDE2KHJlYWRfaW50KDAsIFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5uYWN5bCksIDY1NTM1LCAwLAorCQkJCSJOdW1iZXIgb2YgYWx0ZXJuYXRlIGN5bGluZGVycyIpKTsKK30KKworc3RhdGljIHZvaWQKK3N1bl9zZXRfbmN5bChpbnQgY3lsKQoreworCXN1bmxhYmVsLT5uY3lsID0gU1VOX1NTV0FQMTYoY3lsKTsKK30KKworc3RhdGljIHZvaWQKK3N1bl9zZXRfeGN5bCh2b2lkKQoreworCXN1bmxhYmVsLT5zcGFyZWN5bCA9CisJCVNVTl9TU1dBUDE2KHJlYWRfaW50KDAsIFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5zcGFyZWN5bCksIGdfc2VjdG9ycywgMCwKKwkJCQkiRXh0cmEgc2VjdG9ycyBwZXIgY3lsaW5kZXIiKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzdW5fc2V0X2lsZmFjdCh2b2lkKQoreworCXN1bmxhYmVsLT5pbGZhY3QgPQorCQlTVU5fU1NXQVAxNihyZWFkX2ludCgxLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+aWxmYWN0KSwgMzIsIDAsCisJCQkJIkludGVybGVhdmUgZmFjdG9yIikpOworfQorCitzdGF0aWMgdm9pZAorc3VuX3NldF9yc3BlZWQodm9pZCkKK3sKKwlzdW5sYWJlbC0+cnNwZWVkID0KKwkJU1VOX1NTV0FQMTYocmVhZF9pbnQoMSwgU1VOX1NTV0FQMTYoc3VubGFiZWwtPnJzcGVlZCksIDEwMDAwMCwgMCwKKwkJCQkiUm90YXRpb24gc3BlZWQgKHJwbSkiKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzdW5fc2V0X3BjeWxjb3VudCh2b2lkKQoreworCXN1bmxhYmVsLT5wY3lsY291bnQgPQorCQlTVU5fU1NXQVAxNihyZWFkX2ludCgwLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+cGN5bGNvdW50KSwgNjU1MzUsIDAsCisJCQkJIk51bWJlciBvZiBwaHlzaWNhbCBjeWxpbmRlcnMiKSk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9GRElTS19BRFZBTkNFRCAqLworCitzdGF0aWMgdm9pZAorc3VuX3dyaXRlX3RhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgKnVzaCA9ICh1bnNpZ25lZCBzaG9ydCAqKXN1bmxhYmVsOworCXVuc2lnbmVkIHNob3J0IGNzdW0gPSAwOworCisJd2hpbGUgKHVzaCA8ICh1bnNpZ25lZCBzaG9ydCAqKSgmc3VubGFiZWwtPmNzdW0pKQorCQljc3VtIF49ICp1c2grKzsKKwlzdW5sYWJlbC0+Y3N1bSA9IGNzdW07CisJd3JpdGVfc2VjdG9yKDAsIHN1bmxhYmVsKTsKK30KKyNlbmRpZiAvKiBTVU5fTEFCRUwgKi8KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvZmluZGZzLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZpbmRmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTg5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZpbmRmcy5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBtb3VudGluZyBkZXZpY2VzIGJ5IGxhYmVsL3V1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgSmFzb24gU2Nob29uIDxmbG95ZHBpbmtAZ21haWwuY29tPgorICogU29tZSBwb3J0aW9ucyBjcmliYmVkIGZyb20gZTJmc3Byb2dzLCB1dGlsLWxpbnV4LCBkb3Nmc3Rvb2xzCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmluZGZzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJMQUJFTD1sYWJlbCBvciBVVUlEPXV1aWQiCisvL3VzYWdlOiNkZWZpbmUgZmluZGZzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRmluZCBhIGZpbGVzeXN0ZW0gZGV2aWNlIGJhc2VkIG9uIGEgbGFiZWwgb3IgVVVJRCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmluZGZzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGZpbmRmcyBMQUJFTD1NeURldmljZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidm9sdW1lX2lkLmgiCisKK2ludCBmaW5kZnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZpbmRmc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqZGV2ID0gKisrYXJndjsKKworCWlmICghZGV2KQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlpZiAoc3RybmNtcChkZXYsICIvZGV2LyIsIDUpID09IDApIHsKKwkJLyogSnVzdCBwYXNzIGFueSAvZGV2L3h4eCBuYW1lIHJpZ2h0IHRocm91Z2guCisJCSAqIFRoaXMgbWlnaHQgYWlkIGluIHNvbWUgc2NyaXB0cyBiZWluZyBhYmxlCisJCSAqIHRvIGNhbGwgdGhpcyB1bmNvbmRpdGlvbmFsbHkgKi8KKwkJZGV2ID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBPdGhlcndpc2UsIGhhbmRsZSBMQUJFTD14eHggYW5kIFVVSUQ9eHh4LAorCQkgKiBmYWlsIG9uIGFueXRoaW5nIGVsc2UgKi8KKwkJaWYgKCFyZXNvbHZlX21vdW50X3NwZWMoYXJndikpCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKCphcmd2ICE9IGRldikgeworCQlwdXRzKCphcmd2KTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mbG9jay5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YmU0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2Zsb2NrLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaW1vIFRlcmFzIDx0aW1vLnRlcmFzQGlraS5maT4KKyAqCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmxvY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstc3h1bl0gRkR8e0ZJTEUgWy1jXSBQUk9HIEFSR1N9IgorLy91c2FnZTojZGVmaW5lIGZsb2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiW1VuXWxvY2sgZmlsZSBkZXNjcmlwdG9yLCBvciBsb2NrIEZJTEUsIHJ1biBQUk9HXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCVNoYXJlZCBsb2NrIgorLy91c2FnZTogICAgICJcbgkteAlFeGNsdXNpdmUgbG9jayAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS11CVVubG9jayBGRCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRmFpbCByYXRoZXIgdGhhbiB3YWl0IgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZmxvY2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZsb2NrX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbW9kZSwgb3B0LCBmZDsKKwllbnVtIHsKKwkJT1BUX3MgPSAoMSA8PCAwKSwKKwkJT1BUX3ggPSAoMSA8PCAxKSwKKwkJT1BUX24gPSAoMSA8PCAyKSwKKwkJT1BUX3UgPSAoMSA8PCAzKSwKKwkJT1BUX2MgPSAoMSA8PCA0KSwKKwl9OworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIGdldG9wdF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJzaGFyZWRcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAicyIKKwkJImV4Y2x1c2l2ZVwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJ4IgorCQkidW5sb2NrXDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgInUiCisJCSJub25ibG9ja1wwIiAgICBOb19hcmd1bWVudCAgICAgICAibiIKKwkJOworCWFwcGxldF9sb25nX29wdGlvbnMgPSBnZXRvcHRfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK3N4bnUiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzFdKSB7CisJCWZkID0gb3Blbihhcmd2WzBdLCBPX1JET05MWXxPX05PQ1RUWXxPX0NSRUFULCAwNjY2KTsKKwkJaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFSVNESVIpCisJCSAgICAgICAgZmQgPSBvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZfE9fTk9DVFRZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAnJXMnIiwgYXJndlswXSk7CisJCS8vVE9ETz8gY2xvc2Vfb25fZXhlY19vbihmZCk7CisJfSBlbHNlIHsKKwkJZmQgPSB4YXRvaV9wb3NpdGl2ZShhcmd2WzBdKTsKKwl9CisJYXJndisrOworCisJLyogSWYgaXQgaXMgImZsb2NrIEZJTEUgLWMgUFJPRyIsIHRoZW4gLWMgaXNuJ3QgY2F1Z2h0IGJ5IGdldG9wdDMyOgorCSAqIHdlIHVzZSAiKyIgaW4gb3JkZXIgdG8gc3VwcG9ydCAiZmxvY2sgLW9wdCBGSUxFIFBST0cgLXdpdGgtb3B0cyIsCisJICogd2UgbmVlZCB0byByZW1vdmUgLWMgYnkgaGFuZC4KKwkgKiBUT0RPOiBpbiB1cHN0cmVhbSwgLWMgJ1BST0cgQVJHUycgbWVhbnMgInJ1biBzaCAtYyAnUFJPRyBBUkdTJyIKKwkgKi8KKwlpZiAoYXJndlswXQorCSAmJiBhcmd2WzBdWzBdID09ICctJworCSAmJiAoICAoYXJndlswXVsxXSA9PSAnYycgJiYgIWFyZ3ZbMF1bMl0pCisJICAgIHx8IChFTkFCTEVfTE9OR19PUFRTICYmIHN0cmNtcChhcmd2WzBdICsgMSwgIi1jb21tYW5kIikgPT0gMCkKKwkgICAgKQorCSkgeworCQlhcmd2Kys7CisJfQorCisJaWYgKE9QVF9zID09IExPQ0tfU0ggJiYgT1BUX3ggPT0gTE9DS19FWCAmJiBPUFRfbiA9PSBMT0NLX05CICYmIE9QVF91ID09IExPQ0tfVU4pIHsKKwkJLyogV2l0aCBzdWl0YWJseSBtYXRjaGVkIGNvbnN0YW50cywgbW9kZSBzZXR0aW5nIGlzIG11Y2ggc2ltcGxlciAqLworCQltb2RlID0gb3B0ICYgKExPQ0tfU0ggKyBMT0NLX0VYICsgTE9DS19OQiArIExPQ0tfVU4pOworCQlpZiAoIShtb2RlICYgfkxPQ0tfTkIpKQorCQkJbW9kZSB8PSBMT0NLX0VYOworCX0gZWxzZSB7CisJCWlmIChvcHQgJiBPUFRfdSkKKwkJCW1vZGUgPSBMT0NLX1VOOworCQllbHNlIGlmIChvcHQgJiBPUFRfcykKKwkJCW1vZGUgPSBMT0NLX1NIOworCQllbHNlCisJCQltb2RlID0gTE9DS19FWDsKKwkJaWYgKG9wdCAmIE9QVF9uKQorCQkJbW9kZSB8PSBMT0NLX05COworCX0KKworCWlmIChmbG9jayhmZCwgbW9kZSkgIT0gMCkgeworCQlpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0spCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQliYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSgpOworCX0KKworCWlmIChhcmd2WzBdKQorCQlyZXR1cm4gc3Bhd25fYW5kX3dhaXQoYXJndik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mcmVlcmFtZGlzay5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mcmVlcmFtZGlzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OWFlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZyZWVyYW1kaXNrLmMKQEAgLTAsMCArMSw0NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZnJlZXJhbWRpc2sgYW5kIGZkZmx1c2ggaW1wbGVtZW50YXRpb25zIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIGFuZCB3cml0dGVuIGJ5IEVtYW51ZWxlIENhcmF0dGkgPHdpekBpb2wuaXQ+CisgKiBBZGp1c3RlZCBhIGJpdCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBVbmlmaWVkIHdpdGggZmRmbHVzaCBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZnJlZXJhbWRpc2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkRFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBmcmVlcmFtZGlza19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQgcmFtZGlzayIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZnJlZXJhbWRpc2tfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZnJlZXJhbWRpc2sgL2Rldi9yYW0yXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGZkZmx1c2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkRFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBmZGZsdXNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRm9yY2UgZmxvcHB5IGRpc2sgZHJpdmUgdG8gZGV0ZWN0IGRpc2sgY2hhbmdlIgorCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRnJvbSA8bGludXgvZmQuaD4gKi8KKyNkZWZpbmUgRkRGTFVTSCAgX0lPKDIsMHg0YikKKworaW50IGZyZWVyYW1kaXNrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmcmVlcmFtZGlza19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCisJZmQgPSB4b3BlbihzaW5nbGVfYXJndihhcmd2KSwgT19SRFdSKTsKKworCS8vIEFjdCBsaWtlIGZyZWVyYW1kaXNrLCBmZGZsdXNoLCBvciBib3RoIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uLgorCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGZkLCAoRU5BQkxFX0ZSRUVSQU1ESVNLICYmIGFwcGxldF9uYW1lWzFdID09ICdyJykKKwkJCXx8ICFFTkFCTEVfRkRGTFVTSCA/IEJMS0ZMU0JVRiA6IEZERkxVU0gsIE5VTEwsICIlcyIsIGFyZ3ZbMV0pOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShmZCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mc2NrX21pbml4LmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2ZzY2tfbWluaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTA4ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9mc2NrX21pbml4LmMKQEAgLTAsMCArMSwxMzE2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmc2NrLmMgLSBhIGZpbGUgc3lzdGVtIGNvbnNpc3RlbmN5IGNoZWNrZXIgZm9yIExpbnV4LgorICoKKyAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIDA5LjExLjkxICAtICBtYWRlIHRoZSBmaXJzdCBydWRpbWVudGFyeSBmdW5jdGlvbnMKKyAqCisgKiAxMC4xMS45MSAgLSAgdXBkYXRlZCwgZG9lcyBjaGVja2luZywgbm8gcmVwYWlycyB5ZXQuCisgKgkJU2VudCBvdXQgdG8gdGhlIG1haWxpbmctbGlzdCBmb3IgdGVzdGluZy4KKyAqCisgKiAxNC4xMS45MSAgLQlUZXN0aW5nIHNlZW1zIHRvIGhhdmUgZ29uZSB3ZWxsLiBBZGRlZCBzb21lCisgKgkJY29ycmVjdGlvbi1jb2RlLCBhbmQgY2hhbmdlZCBzb21lIGZ1bmN0aW9ucy4KKyAqCisgKiAxNS4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9uIGNvZGUuIEhvcGVmdWxseSBpdCBub3RpY2VzIG1vc3QKKyAqCQljYXNlcyBub3csIGFuZCB0cmllcyB0byBkbyBzb21ldGhpbmcgYWJvdXQgdGhlbS4KKyAqCisgKiAxNi4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9ucyAodGhhbmtzIHRvIE1pa2EgSmFsYXZhKS4gTW9zdAorICoJCXRoaW5ncyBzZWVtIHRvIHdvcmsgbm93LiBZZWFoLCBzdXJlLgorICoKKyAqCisgKiAxOS4wNC45MiAgLQlIYWQgdG8gc3RhcnQgb3ZlciBhZ2FpbiBmcm9tIHRoaXMgb2xkIHZlcnNpb24sIGFzIGEKKyAqCQlrZXJuZWwgYnVnIGF0ZSBteSBlbmhhbmNlZCBmc2NrIGluIGZlYnJ1YXJ5LgorICoKKyAqIDI4LjAyLjkzICAtCWFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBkaXJlY3RvcnkgZW50cnkgc2l6ZXMuLgorICoKKyAqIFNhdCBNYXIgIDYgMTg6NTk6NDIgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogT3V0cHV0IG5hbWVsZW4gd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcmJsb2NrIGluZm9ybWF0aW9uCisgKgorICogU2F0IE9jdCAgOSAxMToxNzoxMSAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBtYWtlIGV4aXQgc3RhdHVzIGNvbmZvcm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhhdCByZXF1aXJlZCBieSBmc3V0aWwKKyAqCisgKiBNb24gSmFuICAzIDExOjA2OjUyIDE5OTQgLSBEci4gV2V0dHN0ZWluIChncmVnJXdpbmQudXVjcEBwbGFpbnMubm9kYWsuZWR1KQorICoJCQkgICAgICBBZGRlZCBzdXBwb3J0IGZvciBmaWxlIHN5c3RlbSB2YWxpZCBmbGFnLiAgQWxzbworICoJCQkgICAgICBhZGRlZCBwcm9ncmFtX3ZlcnNpb24gdmFyaWFibGUgYW5kIG91dHB1dCBvZgorICoJCQkgICAgICBwcm9ncmFtIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyIHdoZW4gcHJvZ3JhbQorICoJCQkgICAgICBpcyBleGVjdXRlZC4KKyAqCisgKiAzMC4xMC45NCAtIGFkZGVkIHN1cHBvcnQgZm9yIHYyIGZpbGVzeXN0ZW0KKyAqICAgICAgICAgICAgKEFuZHJlYXMgU2Nod2FiLCBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCisgKgorICogMTAuMTIuOTQgIC0gIGFkZGVkIHRlc3QgdG8gcHJldmVudCBjaGVja2luZyBvZiBtb3VudGVkIGZzIGFkYXB0ZWQKKyAqICAgICAgICAgICAgICBmcm9tIFRoZW9kb3JlIFRzJ28ncyAodHl0c29AYXRoZW5hLm1pdC5lZHUpIGUyZnNjaworICogICAgICAgICAgICAgIHByb2dyYW0uICAoRGFuaWVsIFF1aW5sYW4sIHF1aW5sYW5AeWdnZHJhc2lsLmNvbSkKKyAqCisgKiAwMS4wNy45NiAgLSBGaXhlZCB0aGUgdjIgZnMgc3R1ZmYgdG8gdXNlIHRoZSByaWdodCAjZGVmaW5lcyBhbmQgc3VjaAorICoJICAgICAgIGZvciBtb2Rlcm4gbGliY3MgKGphbmxAbWF0aC51aW8ubm8sIE5pY29sYWkgTGFuZ2ZlbGR0KQorICoKKyAqIDAyLjA3Ljk2ICAtIEFkZGVkIEMgYml0IGZpZGRsaW5nIHJvdXRpbmVzIGZyb20gcm1rQGVjcy5zb3Rvbi5hYy51aworICogICAgICAgICAgICAgKFJ1c3NlbGwgS2luZykuICBIZSBtYWRlIHRoZW0gZm9yIEFSTS4gIEl0IHdvdWxkIHNlZW0KKyAqCSAgICAgICB0aGF0IHRoZSBBUk0gaXMgcG93ZXJmdWwgZW5vdWdoIHRvIGRvIHRoaXMgaW4gQyB3aGVyZWFzCisgKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKKyAqCSAgICAgICBUaGlzIHNob3VsZCBtYWtlIG1pbml4IGZzY2sgc3lzdGVtLWluZGVwZW5kZW50LgorICoJICAgICAgIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKKyAqCisgKiAwNC4xMS45NiAgLSBBZGRlZCBtaW5vciBmaXhlcyBmcm9tIEFuZHJlYXMgU2Nod2FiIHRvIGF2b2lkIGNvbXBpbGVyCisgKiAgICAgICAgICAgICB3YXJuaW5ncy4gIEFkZGVkIG1jNjhrIGJpdG9wcyBmcm9tCisgKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgorICoKKyAqIDA2LjExLjk2ICAtIEFkZGVkIHYyIGNvZGUgc3VibWl0dGVkIGJ5IEpvZXJnIERvcmNoYWluLCBidXQgd3JpdHRlbiBieQorICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCisgKgorICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWlja2lld2ljeiA8bWlzaWVrQG1pc2llay5ldS5vcmc+CisgKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisgKgorICoKKyAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcworICogYXJlIGNvbW1lbnRzIGVub3VnaC4gQXMgd2l0aCBhbGwgZmlsZSBzeXN0ZW0gY2hlY2tlcnMsIHRoaXMgYXNzdW1lcworICogdGhlIGZpbGUgc3lzdGVtIGlzIHF1aWVzY2VudCAtIGRvbid0IHVzZSBpdCBvbiBhIG1vdW50ZWQgZGV2aWNlCisgKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKKyAqIGtlcm5lbCBjYW4gd3JpdGUgdG8gaXQgd2hlbiBpdCBzZWFyY2hlcyBmb3IgZmlsZXMpLgorICoKKyAqIFVzYWdlOiBmc2NrIFstbGFydnNtXSBkZXZpY2UKKyAqCS1sIGZvciBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBmaWxlbmFtZXMKKyAqCS1hIGZvciBhdXRvbWF0aWMgcmVwYWlycyAobm90IGltcGxlbWVudGVkKQorICoJLXIgZm9yIHJlcGFpcnMgKGludGVyYWN0aXZlKSAobm90IGltcGxlbWVudGVkKQorICoJLXYgZm9yIHZlcmJvc2UgKHRlbGxzIGhvdyBtYW55IGZpbGVzKQorICoJLXMgZm9yIHN1cGVyYmxvY2sgaW5mbworICoJLW0gZm9yIG1pbml4LWxpa2UgIm1vZGUgbm90IGNsZWFyZWQiIHdhcm5pbmdzCisgKgktZiBmb3JjZSBmaWxlc3lzdGVtIGNoZWNrIGV2ZW4gaWYgZmlsZXN5c3RlbSBtYXJrZWQgYXMgdmFsaWQKKyAqCisgKiBUaGUgZGV2aWNlIG1heSBiZSBhIGJsb2NrIGRldmljZSBvciBhIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKKyAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZnNja19taW5peF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1sYXJ2c21mXSBCTE9DS0RFViIKKy8vdXNhZ2U6I2RlZmluZSBmc2NrX21pbml4X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hlY2sgTUlOSVggZmlsZXN5c3RlbVxuIgorLy91c2FnZTogICAgICJcbgktbAlMaXN0IGFsbCBmaWxlbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1yCVBlcmZvcm0gaW50ZXJhY3RpdmUgcmVwYWlycyIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJUGVyZm9ybSBhdXRvbWF0aWMgcmVwYWlycyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJT3V0cHV0IHN1cGVyYmxvY2sgaW5mb3JtYXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1tCVNob3cgXCJtb2RlIG5vdCBjbGVhcmVkXCIgd2FybmluZ3MiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIGZpbGUgc3lzdGVtIGNoZWNrIgorCisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtaW5peC5oIgorCisjaWZuZGVmIEJMS0dFVFNJWkUKKyNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikgICAgLyogcmV0dXJuIGRldmljZSBzaXplICovCisjZW5kaWYKKworc3RydWN0IEJVR19iYWRfaW5vZGVfc2l6ZSB7CisJY2hhciBCVUdfYmFkX2lub2RlMV9zaXplWyhJTk9ERV9TSVpFMSAqIE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpID8gLTEgOiAxXTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwljaGFyIEJVR19iYWRfaW5vZGUyX3NpemVbKElOT0RFX1NJWkUyICogTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkgPyAtMSA6IDFdOworI2VuZGlmCit9OworCitlbnVtIHsKKyNpZmRlZiBVTlVTRUQKKwlNSU5JWDFfTElOS19NQVggPSAyNTAsCisJTUlOSVgyX0xJTktfTUFYID0gNjU1MzAsCisJTUlOSVhfSV9NQVBfU0xPVFMgPSA4LAorCU1JTklYX1pfTUFQX1NMT1RTID0gNjQsCisJTUlOSVhfVjEgPSAweDAwMDEsICAgICAgLyogb3JpZ2luYWwgbWluaXggZnMgKi8KKwlNSU5JWF9WMiA9IDB4MDAwMiwgICAgICAvKiBtaW5peCBWMiBmcyAqLworI2VuZGlmCisJTUlOSVhfTkFNRV9NQVggPSAyNTUsICAgICAgICAgLyogIyBjaGFycyBpbiBhIGZpbGUgbmFtZSAqLworfTsKKworCisjaWYgIUVOQUJMRV9GRUFUVVJFX01JTklYMgorZW51bSB7IHZlcnNpb24yID0gMCB9OworI2VuZGlmCisKK2VudW0geyBNQVhfREVQVEggPSAzMiB9OworCitlbnVtIHsgZGV2X2ZkID0gMyB9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisJc21hbGxpbnQgdmVyc2lvbjI7CisjZW5kaWYKKwlzbWFsbGludCBjaGFuZ2VkOyAgLyogaXMgZmlsZXN5c3RlbSBtb2RpZmllZD8gKi8KKwlzbWFsbGludCBlcnJvcnNfdW5jb3JyZWN0ZWQ7ICAvKiBmbGFnIGlmIHNvbWUgZXJyb3Igd2FzIG5vdCBjb3JyZWN0ZWQgKi8KKwlzbWFsbGludCB0ZXJtaW9zX3NldDsKKwlzbWFsbGludCBkaXJzaXplOworCXNtYWxsaW50IG5hbWVsZW47CisJY29uc3QgY2hhciAqZGV2aWNlX25hbWU7CisJaW50IGRpcmVjdG9yeSwgcmVndWxhciwgYmxvY2tkZXYsIGNoYXJkZXYsIGxpbmtzLCBzeW1saW5rcywgdG90YWw7CisJY2hhciAqaW5vZGVfYnVmZmVyOworCisJY2hhciAqaW5vZGVfbWFwOworCWNoYXIgKnpvbmVfbWFwOworCisJdW5zaWduZWQgY2hhciAqaW5vZGVfY291bnQ7CisJdW5zaWduZWQgY2hhciAqem9uZV9jb3VudDsKKworCS8qIEZpbGUtbmFtZSBkYXRhICovCisJaW50IG5hbWVfZGVwdGg7CisJY2hhciAqbmFtZV9jb21wb25lbnRbTUFYX0RFUFRIKzFdOworCisJLyogQmlnZ2VyIHN0dWZmICovCisJc3RydWN0IHRlcm1pb3Mgc3ZfdGVybWlvczsKKwljaGFyIHN1cGVyYmxvY2tfYnVmZmVyW0JMT0NLX1NJWkVdOworCWNoYXIgYWRkX3pvbmVfaW5kX2Jsa1tCTE9DS19TSVpFXTsKKwljaGFyIGFkZF96b25lX2RpbmRfYmxrW0JMT0NLX1NJWkVdOworCUlGX0ZFQVRVUkVfTUlOSVgyKGNoYXIgYWRkX3pvbmVfdGluZF9ibGtbQkxPQ0tfU0laRV07KQorCWNoYXIgY2hlY2tfZmlsZV9ibGtbQkxPQ0tfU0laRV07CisKKwkvKiBGaWxlLW5hbWUgZGF0YSAqLworCWNoYXIgY3VycmVudF9uYW1lW01BWF9ERVBUSCAqIE1JTklYX05BTUVfTUFYXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKyNkZWZpbmUgdmVyc2lvbjIgICAgICAgICAgIChHLnZlcnNpb24yICAgICAgICAgICApCisjZW5kaWYKKyNkZWZpbmUgY2hhbmdlZCAgICAgICAgICAgIChHLmNoYW5nZWQgICAgICAgICAgICApCisjZGVmaW5lIGVycm9yc191bmNvcnJlY3RlZCAoRy5lcnJvcnNfdW5jb3JyZWN0ZWQgKQorI2RlZmluZSB0ZXJtaW9zX3NldCAgICAgICAgKEcudGVybWlvc19zZXQgICAgICAgICkKKyNkZWZpbmUgZGlyc2l6ZSAgICAgICAgICAgIChHLmRpcnNpemUgICAgICAgICAgICApCisjZGVmaW5lIG5hbWVsZW4gICAgICAgICAgICAoRy5uYW1lbGVuICAgICAgICAgICAgKQorI2RlZmluZSBkZXZpY2VfbmFtZSAgICAgICAgKEcuZGV2aWNlX25hbWUgICAgICAgICkKKyNkZWZpbmUgZGlyZWN0b3J5ICAgICAgICAgIChHLmRpcmVjdG9yeSAgICAgICAgICApCisjZGVmaW5lIHJlZ3VsYXIgICAgICAgICAgICAoRy5yZWd1bGFyICAgICAgICAgICAgKQorI2RlZmluZSBibG9ja2RldiAgICAgICAgICAgKEcuYmxvY2tkZXYgICAgICAgICAgICkKKyNkZWZpbmUgY2hhcmRldiAgICAgICAgICAgIChHLmNoYXJkZXYgICAgICAgICAgICApCisjZGVmaW5lIGxpbmtzICAgICAgICAgICAgICAoRy5saW5rcyAgICAgICAgICAgICAgKQorI2RlZmluZSBzeW1saW5rcyAgICAgICAgICAgKEcuc3ltbGlua3MgICAgICAgICAgICkKKyNkZWZpbmUgdG90YWwgICAgICAgICAgICAgIChHLnRvdGFsICAgICAgICAgICAgICApCisjZGVmaW5lIGlub2RlX2J1ZmZlciAgICAgICAoRy5pbm9kZV9idWZmZXIgICAgICAgKQorI2RlZmluZSBpbm9kZV9tYXAgICAgICAgICAgKEcuaW5vZGVfbWFwICAgICAgICAgICkKKyNkZWZpbmUgem9uZV9tYXAgICAgICAgICAgIChHLnpvbmVfbWFwICAgICAgICAgICApCisjZGVmaW5lIGlub2RlX2NvdW50ICAgICAgICAoRy5pbm9kZV9jb3VudCAgICAgICAgKQorI2RlZmluZSB6b25lX2NvdW50ICAgICAgICAgKEcuem9uZV9jb3VudCAgICAgICAgICkKKyNkZWZpbmUgbmFtZV9kZXB0aCAgICAgICAgIChHLm5hbWVfZGVwdGggICAgICAgICApCisjZGVmaW5lIG5hbWVfY29tcG9uZW50ICAgICAoRy5uYW1lX2NvbXBvbmVudCAgICAgKQorI2RlZmluZSBzdl90ZXJtaW9zICAgICAgICAgKEcuc3ZfdGVybWlvcyAgICAgICAgICkKKyNkZWZpbmUgc3VwZXJibG9ja19idWZmZXIgIChHLnN1cGVyYmxvY2tfYnVmZmVyICkKKyNkZWZpbmUgYWRkX3pvbmVfaW5kX2JsayAgIChHLmFkZF96b25lX2luZF9ibGsgICApCisjZGVmaW5lIGFkZF96b25lX2RpbmRfYmxrICAoRy5hZGRfem9uZV9kaW5kX2JsayAgKQorI2RlZmluZSBhZGRfem9uZV90aW5kX2JsayAgKEcuYWRkX3pvbmVfdGluZF9ibGsgICkKKyNkZWZpbmUgY2hlY2tfZmlsZV9ibGsgICAgIChHLmNoZWNrX2ZpbGVfYmxrICAgICApCisjZGVmaW5lIGN1cnJlbnRfbmFtZSAgICAgICAoRy5jdXJyZW50X25hbWUgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCWRpcnNpemUgPSAxNjsgXAorCW5hbWVsZW4gPSAxNDsgXAorCWN1cnJlbnRfbmFtZVswXSA9ICcvJzsgXAorCS8qY3VycmVudF9uYW1lWzFdID0gJ1wwJzsqLyBcCisJbmFtZV9jb21wb25lbnRbMF0gPSAmY3VycmVudF9uYW1lWzBdOyBcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgT1BUSU9OX1NUUiAibGFydnNtZiIKK2VudW0geworCU9QVF9sID0gKDEgPDwgMCksCisJT1BUX2EgPSAoMSA8PCAxKSwKKwlPUFRfciA9ICgxIDw8IDIpLAorCU9QVF92ID0gKDEgPDwgMyksCisJT1BUX3MgPSAoMSA8PCA0KSwKKwlPUFRfdyA9ICgxIDw8IDUpLAorCU9QVF9mID0gKDEgPDwgNiksCit9OworI2RlZmluZSBPUFRfbGlzdCAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX2wpCisjZGVmaW5lIE9QVF9hdXRvbWF0aWMgKG9wdGlvbl9tYXNrMzIgJiBPUFRfYSkKKyNkZWZpbmUgT1BUX3JlcGFpciAgICAob3B0aW9uX21hc2szMiAmIE9QVF9yKQorI2RlZmluZSBPUFRfdmVyYm9zZSAgIChvcHRpb25fbWFzazMyICYgT1BUX3YpCisjZGVmaW5lIE9QVF9zaG93ICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcykKKyNkZWZpbmUgT1BUX3dhcm5fbW9kZSAob3B0aW9uX21hc2szMiAmIE9QVF93KQorI2RlZmluZSBPUFRfZm9yY2UgICAgIChvcHRpb25fbWFzazMyICYgT1BUX2YpCisvKiBub24tYXV0b21hdGljIHJlcGFpcnMgcmVxdWVzdGVkPyAqLworI2RlZmluZSBPUFRfbWFudWFsICAgICgob3B0aW9uX21hc2szMiAmIChPUFRfYXxPUFRfcikpID09IE9QVF9yKQorCisKKyNkZWZpbmUgSW5vZGUxICgoKHN0cnVjdCBtaW5peDFfaW5vZGUgKikgaW5vZGVfYnVmZmVyKS0xKQorI2RlZmluZSBJbm9kZTIgKCgoc3RydWN0IG1pbml4Ml9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCisKKyNkZWZpbmUgU3VwZXIgKCooc3RydWN0IG1pbml4X3N1cGVyYmxvY2sgKikoc3VwZXJibG9ja19idWZmZXIpKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisjIGRlZmluZSBaT05FUyAgICAoKHVuc2lnbmVkKSh2ZXJzaW9uMiA/IFN1cGVyLnNfem9uZXMgOiBTdXBlci5zX256b25lcykpCisjZWxzZQorIyBkZWZpbmUgWk9ORVMgICAgKCh1bnNpZ25lZCkoU3VwZXIuc19uem9uZXMpKQorI2VuZGlmCisjZGVmaW5lIElOT0RFUyAgICAoKHVuc2lnbmVkKVN1cGVyLnNfbmlub2RlcykKKyNkZWZpbmUgSU1BUFMgICAgICgodW5zaWduZWQpU3VwZXIuc19pbWFwX2Jsb2NrcykKKyNkZWZpbmUgWk1BUFMgICAgICgodW5zaWduZWQpU3VwZXIuc196bWFwX2Jsb2NrcykKKyNkZWZpbmUgRklSU1RaT05FICgodW5zaWduZWQpU3VwZXIuc19maXJzdGRhdGF6b25lKQorI2RlZmluZSBaT05FU0laRSAgKCh1bnNpZ25lZClTdXBlci5zX2xvZ196b25lX3NpemUpCisjZGVmaW5lIE1BWFNJWkUgICAoKHVuc2lnbmVkKVN1cGVyLnNfbWF4X3NpemUpCisjZGVmaW5lIE1BR0lDICAgICAoU3VwZXIuc19tYWdpYykKKworLyogZ2NjIGxpa2VzIHRoaXMgbW9yZSAoY29kZSBpcyBzbWFsbGVyKSB0aGFuIG1hY3JvIHZhcmlhbnQgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVuc2lnbmVkIGRpdl9yb3VuZHVwKHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIChzaXplICsgbi0xKSAvIG47Cit9CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisjZGVmaW5lIElOT0RFX0JMT0NLUyAgICAgICAgICAgIGRpdl9yb3VuZHVwKElOT0RFUywgTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0spCisjZWxzZQorI2RlZmluZSBJTk9ERV9CTE9DS1MgICAgICAgICAgICBkaXZfcm91bmR1cChJTk9ERVMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24yID8gTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgOiBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSykpCisjZW5kaWYKKworI2RlZmluZSBJTk9ERV9CVUZGRVJfU0laRSAgICAgICAoSU5PREVfQkxPQ0tTICogQkxPQ0tfU0laRSkKKyNkZWZpbmUgTk9STV9GSVJTVFpPTkUgICAgICAgICAgKDIgKyBJTUFQUyArIFpNQVBTICsgSU5PREVfQkxPQ0tTKQorCisvKiBCZWZvcmUgeW91IGFzayAid2hlcmUgdGhleSBjb21lIGZyb20/IjogKi8KKy8qIHNldGJpdC9jbHJiaXQgYXJlIHN1cHBsaWVkIGJ5IHN5cy9wYXJhbS5oICovCisKK3N0YXRpYyBpbnQgbWluaXhfYml0KGNvbnN0IGNoYXIgKmEsIHVuc2lnbmVkIGkpCit7CisJcmV0dXJuIChhW2kgPj4gM10gJiAoMTw8KGkgJiA3KSkpOworfQorCitzdGF0aWMgdm9pZCBtaW5peF9zZXRiaXQoY2hhciAqYSwgdW5zaWduZWQgaSkKK3sKKwlzZXRiaXQoYSwgaSk7CisJY2hhbmdlZCA9IDE7Cit9CitzdGF0aWMgdm9pZCBtaW5peF9jbHJiaXQoY2hhciAqYSwgdW5zaWduZWQgaSkKK3sKKwljbHJiaXQoYSwgaSk7CisJY2hhbmdlZCA9IDE7Cit9CisKKy8qIE5vdGU6IGRvIG5vdCBhc3N1bWUgMC8xLCBpdCBpcyAwL25vbnplcm8gKi8KKyNkZWZpbmUgem9uZV9pbl91c2UoeCkgIChtaW5peF9iaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKKyNkZWZpbmUgaW5vZGVfaW5fdXNlKHgpIChtaW5peF9iaXQoaW5vZGVfbWFwLCh4KSkpCisKKyNkZWZpbmUgbWFya19pbm9kZSh4KSAgIChtaW5peF9zZXRiaXQoaW5vZGVfbWFwLCh4KSkpCisjZGVmaW5lIHVubWFya19pbm9kZSh4KSAobWluaXhfY2xyYml0KGlub2RlX21hcCwoeCkpKQorCisjZGVmaW5lIG1hcmtfem9uZSh4KSAgICAobWluaXhfc2V0Yml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSkpCisjZGVmaW5lIHVubWFya196b25lKHgpICAobWluaXhfY2xyYml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSkpCisKKworc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrKHVuc2lnbmVkIGlubyk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGlubyk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKQoreworCWlmICh0ZXJtaW9zX3NldCkKKwkJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnN2X3Rlcm1pb3MpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyIsIHN0cik7Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfZmlsZW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvLyAgL2Rpci9kaXIvZGlyL2ZpbGUKKwkvLyAgXiAgIF4gICBeCisJLy8gWzBdIFsxXSBbMl0gPC1uYW1lX2NvbXBvbmVudFtpXQorCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKSB7CisJCWludCBsZW47CisJCWNoYXIgKnAgPSBuYW1lX2NvbXBvbmVudFtuYW1lX2RlcHRoXTsKKwkJKnArKyA9ICcvJzsKKwkJbGVuID0gc3ByaW50ZihwLCAiJS4qcyIsIG5hbWVsZW4sIG5hbWUpOworCQluYW1lX2NvbXBvbmVudFtuYW1lX2RlcHRoICsgMV0gPSBwICsgbGVuOworCX0KKwluYW1lX2RlcHRoKys7Cit9CisKK3N0YXRpYyB2b2lkIHBvcF9maWxlbmFtZSh2b2lkKQoreworCW5hbWVfZGVwdGgtLTsKKwlpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkgeworCQkqbmFtZV9jb21wb25lbnRbbmFtZV9kZXB0aF0gPSAnXDAnOworCQlpZiAoIW5hbWVfZGVwdGgpIHsKKwkJCWN1cnJlbnRfbmFtZVswXSA9ICcvJzsKKwkJCWN1cnJlbnRfbmFtZVsxXSA9ICdcMCc7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYXNrKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGRlZikKK3sKKwlpbnQgYzsKKworCWlmICghT1BUX3JlcGFpcikgeworCQliYl9wdXRjaGFyKCdcbicpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKE9QVF9hdXRvbWF0aWMpIHsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJaWYgKCFkZWYpCisJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCQlyZXR1cm4gZGVmOworCX0KKwlwcmludGYoZGVmID8gIiVzICh5L24pPyAiIDogIiVzIChuL3kpPyAiLCBzdHJpbmcpOworCWZvciAoOzspIHsKKwkJZmZsdXNoX2FsbCgpOworCQljID0gZ2V0Y2hhcigpOworCQlpZiAoYyA9PSBFT0YpIHsKKwkJCWlmICghZGVmKQorCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJCQlyZXR1cm4gZGVmOworCQl9CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKwkJYyB8PSAweDIwOyAvKiB0b2xvd2VyICovCisJCWlmIChjID09ICd5JykgeworCQkJZGVmID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjID09ICduJykgeworCQkJZGVmID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChkZWYpCisJCXByaW50ZigieVxuIik7CisJZWxzZSB7CisJCXByaW50ZigiblxuIik7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCXJldHVybiBkZWY7Cit9CisKKy8qCisgKiBNYWtlIGNlcnRhaW4gdGhhdCB3ZSBhcmVuJ3QgY2hlY2tpbmcgYSBmaWxlc3lzdGVtIHRoYXQgaXMgb24gYQorICogbW91bnRlZCBwYXJ0aXRpb24uICBDb2RlIGFkYXB0ZWQgZnJvbSBlMmZzY2ssIENvcHlyaWdodCAoQykgMTk5MywKKyAqIDE5OTQgVGhlb2RvcmUgVHMnby4gIEFsc28gbGljZW5zZWQgdW5kZXIgR1BMLgorICovCitzdGF0aWMgdm9pZCBjaGVja19tb3VudCh2b2lkKQoreworCWlmIChmaW5kX21vdW50X3BvaW50KGRldmljZV9uYW1lLCAwKSkgeworCQlpbnQgY29udDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NVEFCX1NVUFBPUlQKKwkJLyoKKwkJICogSWYgdGhlIHJvb3QgaXMgbW91bnRlZCByZWFkLW9ubHksIHRoZW4gL2V0Yy9tdGFiIGlzCisJCSAqIHByb2JhYmx5IG5vdCBjb3JyZWN0OyBzbyB3ZSB3b24ndCBpc3N1ZSBhIHdhcm5pbmcgYmFzZWQgb24KKwkJICogaXQuCisJCSAqLworCQlpbnQgZmQgPSBvcGVuKGJiX3BhdGhfbXRhYl9maWxlLCBPX1JEV1IpOworCisJCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRVJPRlMpCisJCQlyZXR1cm47CisJCWNsb3NlKGZkKTsKKyNlbmRpZgorCQlwcmludGYoIiVzIGlzIG1vdW50ZWQuICIsIGRldmljZV9uYW1lKTsKKwkJY29udCA9IDA7CisJCWlmIChpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKQorCQkJY29udCA9IGFzaygiRG8geW91IHJlYWxseSB3YW50IHRvIGNvbnRpbnVlIiwgMCk7CisJCWlmICghY29udCkgeworCQkJcHJpbnRmKCJDaGVjayBhYm9ydGVkXG4iKTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCX0KK30KKworLyoKKyAqIGNoZWNrX3pvbmVfbnIgY2hlY2tzIHRvIHNlZSB0aGF0ICpuciBpcyBhIHZhbGlkIHpvbmUgbnIuIElmIGl0CisgKiBpc24ndCwgaXQgd2lsbCBwb3NzaWJseSBiZSByZXBhaXJlZC4gQ2hlY2tfem9uZV9uciBzZXRzICpjb3JyZWN0ZWQKKyAqIGlmIGFuIGVycm9yIHdhcyBjb3JyZWN0ZWQsIGFuZCByZXR1cm5zIHRoZSB6b25lICgwIGZvciBubyB6b25lCisgKiBvciBhIGJhZCB6b25lLW51bWJlcikuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfem9uZV9ucjIodWludDMyX3QgKm5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWNvbnN0IGNoYXIgKm1zZzsKKwlpZiAoISpucikKKwkJcmV0dXJuIDA7CisJaWYgKCpuciA8IEZJUlNUWk9ORSkKKwkJbXNnID0gIjwgRklSU1RaT05FIjsKKwllbHNlIGlmICgqbnIgPj0gWk9ORVMpCisJCW1zZyA9ICI+PSBaT05FUyI7CisJZWxzZQorCQlyZXR1cm4gKm5yOworCXByaW50ZigiWm9uZSBuciAlcyBpbiBmaWxlICclcycuICIsIG1zZywgY3VycmVudF9uYW1lKTsKKwlpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgeworCQkqbnIgPSAwOworCQkqY29ycmVjdGVkID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfem9uZV9ucih1aW50MTZfdCAqbnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCit7CisJdWludDMyX3QgbnIzMiA9ICpucjsKKwlpbnQgciA9IGNoZWNrX3pvbmVfbnIyKCZucjMyLCBjb3JyZWN0ZWQpOworCSpuciA9ICh1aW50MTZfdClucjMyOworCXJldHVybiByOworfQorCisvKgorICogcmVhZC1ibG9jayByZWFkcyBibG9jayBuciBpbnRvIHRoZSBidWZmZXIgYXQgYWRkci4KKyAqLworc3RhdGljIHZvaWQgcmVhZF9ibG9jayh1bnNpZ25lZCBuciwgdm9pZCAqYWRkcikKK3sKKwlpZiAoIW5yKSB7CisJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKKwkJcmV0dXJuOworCX0KKwl4bHNlZWsoZGV2X2ZkLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKTsKKwlpZiAoQkxPQ0tfU0laRSAhPSBmdWxsX3JlYWQoZGV2X2ZkLCBhZGRyLCBCTE9DS19TSVpFKSkgeworCQlwcmludGYoIiVzOiBiYWQgYmxvY2sgJXUgaW4gZmlsZSAnJXMnXG4iLAorCQkJCWJiX21zZ19yZWFkX2Vycm9yLCBuciwgY3VycmVudF9uYW1lKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOworCX0KK30KKworLyoKKyAqIHdyaXRlX2Jsb2NrIHdyaXRlcyBibG9jayBuciB0byBkaXNrLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9ibG9jayh1bnNpZ25lZCBuciwgdm9pZCAqYWRkcikKK3sKKwlpZiAoIW5yKQorCQlyZXR1cm47CisJaWYgKG5yIDwgRklSU1RaT05FIHx8IG5yID49IFpPTkVTKSB7CisJCXByaW50ZigiSW50ZXJuYWwgZXJyb3I6IHRyeWluZyB0byB3cml0ZSBiYWQgYmxvY2tcbiIKKwkJCSAgICJXcml0ZSByZXF1ZXN0IGlnbm9yZWRcbiIpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCQlyZXR1cm47CisJfQorCXhsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUgKiBuciwgU0VFS19TRVQpOworCWlmIChCTE9DS19TSVpFICE9IGZ1bGxfd3JpdGUoZGV2X2ZkLCBhZGRyLCBCTE9DS19TSVpFKSkgeworCQlwcmludGYoIiVzOiBiYWQgYmxvY2sgJXUgaW4gZmlsZSAnJXMnXG4iLAorCQkJCWJiX21zZ193cml0ZV9lcnJvciwgbnIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorfQorCisvKgorICogbWFwX2Jsb2NrIGNhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGJsb2NrIG5yIG9mIGEgYmxvY2sgaW4gYSBmaWxlLgorICogSXQgc2V0cyAnY2hhbmdlZCcgaWYgdGhlIGlub2RlIGhhcyBuZWVkZWQgY2hhbmdpbmcsIGFuZCByZS13cml0ZXMKKyAqIGFueSBpbmRpcmVjdCBibG9ja3Mgd2l0aCBlcnJvcnMuCisgKi8KK3N0YXRpYyBpbnQgbWFwX2Jsb2NrKHN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBibGtucikKK3sKKwl1aW50MTZfdCBpbmRbQkxPQ0tfU0laRSA+PiAxXTsKKwlpbnQgYmxvY2ssIHJlc3VsdDsKKwlzbWFsbGludCBibGtfY2hnOworCisJaWYgKGJsa25yIDwgNykKKwkJcmV0dXJuIGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CisJYmxrbnIgLT0gNzsKKwlpZiAoYmxrbnIgPCA1MTIpIHsKKwkJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CisJCWdvdG8gY29tbW9uOworCX0KKwlibGtuciAtPSA1MTI7CisJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CisJcmVhZF9ibG9jayhibG9jaywgaW5kKTsgLyogZG91YmxlIGluZGlyZWN0ICovCisJYmxrX2NoZyA9IDA7CisJcmVzdWx0ID0gY2hlY2tfem9uZV9ucigmaW5kW2Jsa25yIC8gNTEyXSwgJmJsa19jaGcpOworCWlmIChibGtfY2hnKQorCQl3cml0ZV9ibG9jayhibG9jaywgaW5kKTsKKwlibG9jayA9IHJlc3VsdDsKKyBjb21tb246CisJcmVhZF9ibG9jayhibG9jaywgaW5kKTsKKwlibGtfY2hnID0gMDsKKwlyZXN1bHQgPSBjaGVja196b25lX25yKCZpbmRbYmxrbnIgJSA1MTJdLCAmYmxrX2NoZyk7CisJaWYgKGJsa19jaGcpCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBpbmQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyBpbnQgbWFwX2Jsb2NrMihzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSwgdW5zaWduZWQgYmxrbnIpCit7CisJdWludDMyX3QgaW5kW0JMT0NLX1NJWkUgPj4gMl07CisJaW50IGJsb2NrLCByZXN1bHQ7CisJc21hbGxpbnQgYmxrX2NoZzsKKworCWlmIChibGtuciA8IDcpCisJCXJldHVybiBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKKwlibGtuciAtPSA3OworCWlmIChibGtuciA8IDI1NikgeworCQlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CisJCWdvdG8gY29tbW9uMjsKKwl9CisJYmxrbnIgLT0gMjU2OworCWlmIChibGtuciA8IDI1NiAqIDI1NikgeworCQlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CisJCWdvdG8gY29tbW9uMTsKKwl9CisJYmxrbnIgLT0gMjU2ICogMjU2OworCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDksICZjaGFuZ2VkKTsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBpbmQpOyAvKiB0cmlwbGUgaW5kaXJlY3QgKi8KKwlibGtfY2hnID0gMDsKKwlyZXN1bHQgPSBjaGVja196b25lX25yMigmaW5kW2Jsa25yIC8gKDI1NiAqIDI1NildLCAmYmxrX2NoZyk7CisJaWYgKGJsa19jaGcpCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBpbmQpOworCWJsb2NrID0gcmVzdWx0OworIGNvbW1vbjE6CisJcmVhZF9ibG9jayhibG9jaywgaW5kKTsgLyogZG91YmxlIGluZGlyZWN0ICovCisJYmxrX2NoZyA9IDA7CisJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoJmluZFsoYmxrbnIgLyAyNTYpICUgMjU2XSwgJmJsa19jaGcpOworCWlmIChibGtfY2hnKQorCQl3cml0ZV9ibG9jayhibG9jaywgaW5kKTsKKwlibG9jayA9IHJlc3VsdDsKKyBjb21tb24yOgorCXJlYWRfYmxvY2soYmxvY2ssIGluZCk7CisJYmxrX2NoZyA9IDA7CisJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoJmluZFtibGtuciAlIDI1Nl0sICZibGtfY2hnKTsKKwlpZiAoYmxrX2NoZykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGluZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB3cml0ZV9zdXBlcmJsb2NrKHZvaWQpCit7CisJLyoKKwkgKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBmaWxlc3lzdGVtIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHRoZXJlCisJICogYXJlIHVuY29ycmVjdGVkIGVycm9ycy4gIFRoZSBmaWxlc3lzdGVtIHZhbGlkIGZsYWcgaXMKKwkgKiB1bmNvbmRpdGlvbmFsbHkgc2V0IGlmIHdlIGdldCB0aGlzIGZhci4KKwkgKi8KKwlTdXBlci5zX3N0YXRlIHw9IE1JTklYX1ZBTElEX0ZTIHwgTUlOSVhfRVJST1JfRlM7CisJaWYgKCFlcnJvcnNfdW5jb3JyZWN0ZWQpCisJCVN1cGVyLnNfc3RhdGUgJj0gfk1JTklYX0VSUk9SX0ZTOworCisJeGxzZWVrKGRldl9mZCwgQkxPQ0tfU0laRSwgU0VFS19TRVQpOworCWlmIChCTE9DS19TSVpFICE9IGZ1bGxfd3JpdGUoZGV2X2ZkLCBzdXBlcmJsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCisJCWRpZSgiY2FuJ3Qgd3JpdGUgc3VwZXJibG9jayIpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV90YWJsZXModm9pZCkKK3sKKwl3cml0ZV9zdXBlcmJsb2NrKCk7CisKKwlpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKGRldl9mZCwgaW5vZGVfbWFwLCBJTUFQUyAqIEJMT0NLX1NJWkUpKQorCQlkaWUoImNhbid0IHdyaXRlIGlub2RlIG1hcCIpOworCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoZGV2X2ZkLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKKwkJZGllKCJjYW4ndCB3cml0ZSB6b25lIG1hcCIpOworCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSB3cml0ZShkZXZfZmQsIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQorCQlkaWUoImNhbid0IHdyaXRlIGlub2RlcyIpOworfQorCitzdGF0aWMgdm9pZCBnZXRfZGlyc2l6ZSh2b2lkKQoreworCWludCBibG9jazsKKwljaGFyIGJsa1tCTE9DS19TSVpFXTsKKwlpbnQgc2l6ZTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorCWlmICh2ZXJzaW9uMikKKwkJYmxvY2sgPSBJbm9kZTJbTUlOSVhfUk9PVF9JTk9dLmlfem9uZVswXTsKKwllbHNlCisjZW5kaWYKKwkJYmxvY2sgPSBJbm9kZTFbTUlOSVhfUk9PVF9JTk9dLmlfem9uZVswXTsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBibGspOworCWZvciAoc2l6ZSA9IDE2OyBzaXplIDwgQkxPQ0tfU0laRTsgc2l6ZSA8PD0gMSkgeworCQlpZiAoc3RyY21wKGJsayArIHNpemUgKyAyLCAiLi4iKSA9PSAwKSB7CisJCQlkaXJzaXplID0gc2l6ZTsKKwkJCW5hbWVsZW4gPSBzaXplIC0gMjsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiB1c2UgZGVmYXVsdHMgKi8KK30KKworc3RhdGljIHZvaWQgcmVhZF9zdXBlcmJsb2NrKHZvaWQpCit7CisJeGxzZWVrKGRldl9mZCwgQkxPQ0tfU0laRSwgU0VFS19TRVQpOworCWlmIChCTE9DS19TSVpFICE9IGZ1bGxfcmVhZChkZXZfZmQsIHN1cGVyYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKSkKKwkJZGllKCJjYW4ndCByZWFkIHN1cGVyYmxvY2siKTsKKwkvKiBhbHJlYWR5IGluaXRpYWxpemVkIHRvOgorCW5hbWVsZW4gPSAxNDsKKwlkaXJzaXplID0gMTY7CisJdmVyc2lvbjIgPSAwOworCSovCisJaWYgKE1BR0lDID09IE1JTklYMV9TVVBFUl9NQUdJQykgeworCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgxX1NVUEVSX01BR0lDMikgeworCQluYW1lbGVuID0gMzA7CisJCWRpcnNpemUgPSAzMjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQykgeworCQl2ZXJzaW9uMiA9IDE7CisJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMyKSB7CisJCW5hbWVsZW4gPSAzMDsKKwkJZGlyc2l6ZSA9IDMyOworCQl2ZXJzaW9uMiA9IDE7CisjZW5kaWYKKwl9IGVsc2UKKwkJZGllKCJiYWQgbWFnaWMgbnVtYmVyIGluIHN1cGVyYmxvY2siKTsKKwlpZiAoWk9ORVNJWkUgIT0gMCB8fCBCTE9DS19TSVpFICE9IDEwMjQpCisJCWRpZSgib25seSAxayBibG9ja3Mvem9uZXMgc3VwcG9ydGVkIik7CisJaWYgKElNQVBTICogQkxPQ0tfU0laRSAqIDggPCBJTk9ERVMgKyAxKQorCQlkaWUoImJhZCBzX2ltYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyYmxvY2siKTsKKwlpZiAoWk1BUFMgKiBCTE9DS19TSVpFICogOCA8IFpPTkVTIC0gRklSU1RaT05FICsgMSkKKwkJZGllKCJiYWQgc196bWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlcmJsb2NrIik7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfdGFibGVzKHZvaWQpCit7CisJaW5vZGVfbWFwID0geHphbGxvYyhJTUFQUyAqIEJMT0NLX1NJWkUpOworCXpvbmVfbWFwID0geHphbGxvYyhaTUFQUyAqIEJMT0NLX1NJWkUpOworCWlub2RlX2J1ZmZlciA9IHhtYWxsb2MoSU5PREVfQlVGRkVSX1NJWkUpOworCWlub2RlX2NvdW50ID0geG1hbGxvYyhJTk9ERVMgKyAxKTsKKwl6b25lX2NvdW50ID0geG1hbGxvYyhaT05FUyk7CisJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKGRldl9mZCwgaW5vZGVfbWFwLCBJTUFQUyAqIEJMT0NLX1NJWkUpKQorCQlkaWUoImNhbid0IHJlYWQgaW5vZGUgbWFwIik7CisJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKGRldl9mZCwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCisJCWRpZSgiY2FuJ3QgcmVhZCB6b25lIG1hcCIpOworCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSByZWFkKGRldl9mZCwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCisJCWRpZSgiY2FuJ3QgcmVhZCBpbm9kZXMiKTsKKwlpZiAoTk9STV9GSVJTVFpPTkUgIT0gRklSU1RaT05FKSB7CisJCXByaW50Zigid2FybmluZzogZmlyc3R6b25lIT1ub3JtX2ZpcnN0em9uZVxuIik7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWdldF9kaXJzaXplKCk7CisJaWYgKE9QVF9zaG93KSB7CisJCXByaW50ZigiJXUgaW5vZGVzXG4iCisJCQkiJXUgYmxvY2tzXG4iCisJCQkiRmlyc3RkYXRhem9uZT0ldSAoJXUpXG4iCisJCQkiWm9uZXNpemU9JXVcbiIKKwkJCSJNYXhzaXplPSV1XG4iCisJCQkiRmlsZXN5c3RlbSBzdGF0ZT0ldVxuIgorCQkJIm5hbWVsZW49JXVcblxuIiwKKwkJCUlOT0RFUywKKwkJCVpPTkVTLAorCQkJRklSU1RaT05FLCBOT1JNX0ZJUlNUWk9ORSwKKwkJCUJMT0NLX1NJWkUgPDwgWk9ORVNJWkUsCisJCQlNQVhTSVpFLAorCQkJU3VwZXIuc19zdGF0ZSwKKwkJCW5hbWVsZW4pOworCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X2lub2RlX2NvbW1vbih1bnNpZ25lZCBuciwgdWludDE2X3QgaV9tb2RlKQoreworCXRvdGFsKys7CisJaWYgKCFpbm9kZV9jb3VudFtucl0pIHsKKwkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CisJCQlwcmludGYoIklub2RlICVkIGlzIG1hcmtlZCBhcyAndW51c2VkJywgYnV0IGl0IGlzIHVzZWQgIgorCQkJCQkiZm9yIGZpbGUgJyVzJ1xuIiwgbnIsIGN1cnJlbnRfbmFtZSk7CisJCQlpZiAoT1BUX3JlcGFpcikgeworCQkJCWlmIChhc2soIk1hcmsgYXMgJ2luIHVzZSciLCAxKSkKKwkJCQkJbWFya19pbm9kZShucik7CisJCQkJZWxzZQorCQkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCQkJfQorCQl9CisJCWlmIChTX0lTRElSKGlfbW9kZSkpCisJCQlkaXJlY3RvcnkrKzsKKwkJZWxzZSBpZiAoU19JU1JFRyhpX21vZGUpKQorCQkJcmVndWxhcisrOworCQllbHNlIGlmIChTX0lTQ0hSKGlfbW9kZSkpCisJCQljaGFyZGV2Kys7CisJCWVsc2UgaWYgKFNfSVNCTEsoaV9tb2RlKSkKKwkJCWJsb2NrZGV2Kys7CisJCWVsc2UgaWYgKFNfSVNMTksoaV9tb2RlKSkKKwkJCXN5bWxpbmtzKys7CisJCWVsc2UgaWYgKFNfSVNTT0NLKGlfbW9kZSkpOworCQllbHNlIGlmIChTX0lTRklGTyhpX21vZGUpKTsKKwkJZWxzZSB7CisJCQlwcmludGYoIiVzIGhhcyBtb2RlICUwNW9cbiIsIGN1cnJlbnRfbmFtZSwgaV9tb2RlKTsKKwkJfQorCX0gZWxzZQorCQlsaW5rcysrOworCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKKwkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnXG4iKTsKKwkJaW5vZGVfY291bnRbbnJdLS07CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG1pbml4MV9pbm9kZSAqZ2V0X2lub2RlKHVuc2lnbmVkIG5yKQoreworCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlOworCisJaWYgKCFuciB8fCBuciA+IElOT0RFUykKKwkJcmV0dXJuIE5VTEw7CisJaW5vZGUgPSBJbm9kZTEgKyBucjsKKwlnZXRfaW5vZGVfY29tbW9uKG5yLCBpbm9kZS0+aV9tb2RlKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyBzdHJ1Y3QgbWluaXgyX2lub2RlICpnZXRfaW5vZGUyKHVuc2lnbmVkIG5yKQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOworCisJaWYgKCFuciB8fCBuciA+IElOT0RFUykKKwkJcmV0dXJuIE5VTEw7CisJaW5vZGUgPSBJbm9kZTIgKyBucjsKKwlnZXRfaW5vZGVfY29tbW9uKG5yLCBpbm9kZS0+aV9tb2RlKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY2hlY2tfcm9vdCh2b2lkKQoreworCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlID0gSW5vZGUxICsgTUlOSVhfUk9PVF9JTk87CisKKwlpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgY2hlY2tfcm9vdDIodm9pZCkKK3sKKwlzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSA9IElub2RlMiArIE1JTklYX1JPT1RfSU5POworCisJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJZGllKCJyb290IGlub2RlIGlzbid0IGEgZGlyZWN0b3J5Iik7Cit9CisjZWxzZQordm9pZCBjaGVja19yb290Mih2b2lkKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGFkZF96b25lX2NvbW1vbihpbnQgYmxvY2ssIHNtYWxsaW50ICpjb3JyZWN0ZWQpCit7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuIDA7CisJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CisJCXByaW50ZigiQWxyZWFkeSB1c2VkIGJsb2NrIGlzIHJldXNlZCBpbiBmaWxlICclcycuICIsCisJCQkJY3VycmVudF9uYW1lKTsKKwkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgeworCQkJYmxvY2sgPSAwOworCQkJKmNvcnJlY3RlZCA9IDE7CisJCQlyZXR1cm4gLTE7IC8qICJwbGVhc2UgemVybyBvdXQgKnpuciIgKi8KKwkJfQorCX0KKwlpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgeworCQlwcmludGYoIkJsb2NrICVkIGluIGZpbGUgJyVzJyBpcyBtYXJrZWQgYXMgJ3VudXNlZCcuICIsCisJCQkJYmxvY2ssIGN1cnJlbnRfbmFtZSk7CisJCWlmIChhc2soIkNvcnJlY3QiLCAxKSkKKwkJCW1hcmtfem9uZShibG9jayk7CisJfQorCWlmICghKyt6b25lX2NvdW50W2Jsb2NrXSkKKwkJem9uZV9jb3VudFtibG9ja10tLTsKKwlyZXR1cm4gYmxvY2s7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3pvbmUodWludDE2X3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpbnQgYmxvY2s7CisKKwlibG9jayA9IGNoZWNrX3pvbmVfbnIoem5yLCBjb3JyZWN0ZWQpOworCWJsb2NrID0gYWRkX3pvbmVfY29tbW9uKGJsb2NrLCBjb3JyZWN0ZWQpOworCWlmIChibG9jayA9PSAtMSkgeworCQkqem5yID0gMDsKKwkJYmxvY2sgPSAwOworCX0KKwlyZXR1cm4gYmxvY2s7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyBpbnQgYWRkX3pvbmUyKHVpbnQzMl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCit7CisJaW50IGJsb2NrOworCisJYmxvY2sgPSBjaGVja196b25lX25yMih6bnIsIGNvcnJlY3RlZCk7CisJYmxvY2sgPSBhZGRfem9uZV9jb21tb24oYmxvY2ssIGNvcnJlY3RlZCk7CisJaWYgKGJsb2NrID09IC0xKSB7CisJCSp6bnIgPSAwOworCQlibG9jayA9IDA7CisJfQorCXJldHVybiBibG9jazsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQodWludDE2X3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpbnQgaTsKKwlpbnQgYmxvY2s7CisJc21hbGxpbnQgY2hnX2JsayA9IDA7CisKKwlibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm47CisJcmVhZF9ibG9jayhibG9jaywgYWRkX3pvbmVfaW5kX2Jsayk7CisJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCisJCWFkZF96b25lKGkgKyAodWludDE2X3QgKikgYWRkX3pvbmVfaW5kX2JsaywgJmNoZ19ibGspOworCWlmIChjaGdfYmxrKQorCQl3cml0ZV9ibG9jayhibG9jaywgYWRkX3pvbmVfaW5kX2Jsayk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIGFkZF96b25lX2luZDIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpbnQgaTsKKwlpbnQgYmxvY2s7CisJc21hbGxpbnQgY2hnX2JsayA9IDA7CisKKwlibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuOworCXJlYWRfYmxvY2soYmxvY2ssIGFkZF96b25lX2luZF9ibGspOworCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKKwkJYWRkX3pvbmUyKGkgKyAodWludDMyX3QgKikgYWRkX3pvbmVfaW5kX2JsaywgJmNoZ19ibGspOworCWlmIChjaGdfYmxrKQorCQl3cml0ZV9ibG9jayhibG9jaywgYWRkX3pvbmVfaW5kX2Jsayk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZCh1aW50MTZfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBpOworCWludCBibG9jazsKKwlzbWFsbGludCBjaGdfYmxrID0gMDsKKworCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOworCWlmICghYmxvY2spCisJCXJldHVybjsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9kaW5kX2Jsayk7CisJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCisJCWFkZF96b25lX2luZChpICsgKHVpbnQxNl90ICopIGFkZF96b25lX2RpbmRfYmxrLCAmY2hnX2Jsayk7CisJaWYgKGNoZ19ibGspCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9kaW5kX2Jsayk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQyKHVpbnQzMl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCit7CisJaW50IGk7CisJaW50IGJsb2NrOworCXNtYWxsaW50IGNoZ19ibGsgPSAwOworCisJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOworCWlmICghYmxvY2spCisJCXJldHVybjsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9kaW5kX2Jsayk7CisJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQorCQlhZGRfem9uZV9pbmQyKGkgKyAodWludDMyX3QgKikgYWRkX3pvbmVfZGluZF9ibGssICZjaGdfYmxrKTsKKwlpZiAoY2hnX2JsaykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGFkZF96b25lX2RpbmRfYmxrKTsKK30KKworc3RhdGljIHZvaWQgYWRkX3pvbmVfdGluZDIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpbnQgaTsKKwlpbnQgYmxvY2s7CisJc21hbGxpbnQgY2hnX2JsayA9IDA7CisKKwlibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuOworCXJlYWRfYmxvY2soYmxvY2ssIGFkZF96b25lX3RpbmRfYmxrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCisJCWFkZF96b25lX2RpbmQyKGkgKyAodWludDMyX3QgKikgYWRkX3pvbmVfdGluZF9ibGssICZjaGdfYmxrKTsKKwlpZiAoY2hnX2JsaykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGFkZF96b25lX3RpbmRfYmxrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjaGVja196b25lcyh1bnNpZ25lZCBpKQoreworCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlOworCisJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCisJCXJldHVybjsKKwlpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLworCQlyZXR1cm47CisJaW5vZGUgPSBJbm9kZTEgKyBpOworCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKQorCSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQorCSAmJiAhU19JU0xOSyhpbm9kZS0+aV9tb2RlKQorCSkgeworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCWFkZF96b25lKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CisJYWRkX3pvbmVfaW5kKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CisJYWRkX3pvbmVfZGluZCg4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitzdGF0aWMgdm9pZCBjaGVja196b25lczIodW5zaWduZWQgaSkKK3sKKwlzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKKworCWlmICghaSB8fCBpID4gSU5PREVTKQorCQlyZXR1cm47CisJaWYgKGlub2RlX2NvdW50W2ldID4gMSkJCS8qIGhhdmUgd2UgY291bnRlZCB0aGlzIGZpbGUgYWxyZWFkeT8gKi8KKwkJcmV0dXJuOworCWlub2RlID0gSW5vZGUyICsgaTsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkKKwkJJiYgIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCQlhZGRfem9uZTIoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKKwlhZGRfem9uZV9pbmQyKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CisJYWRkX3pvbmVfZGluZDIoOCArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKKwlhZGRfem9uZV90aW5kMig5ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoZWNrX2ZpbGUoc3RydWN0IG1pbml4MV9pbm9kZSAqZGlyLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGU7CisJaW50IGlubzsKKwljaGFyICpuYW1lOworCWludCBibG9jazsKKworCWJsb2NrID0gbWFwX2Jsb2NrKGRpciwgb2Zmc2V0IC8gQkxPQ0tfU0laRSk7CisJcmVhZF9ibG9jayhibG9jaywgY2hlY2tfZmlsZV9ibGspOworCW5hbWUgPSBjaGVja19maWxlX2JsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7CisJaW5vID0gKih1aW50MTZfdCAqKSAobmFtZSAtIDIpOworCWlmIChpbm8gPiBJTk9ERVMpIHsKKwkJcHJpbnRmKCIlcyBjb250YWlucyBhIGJhZCBpbm9kZSBudW1iZXIgZm9yIGZpbGUgJyUuKnMnLiAiLAorCQkJCWN1cnJlbnRfbmFtZSwgbmFtZWxlbiwgbmFtZSk7CisJCWlmIChhc2soIlJlbW92ZSIsIDEpKSB7CisJCQkqKHVpbnQxNl90ICopIChuYW1lIC0gMikgPSAwOworCQkJd3JpdGVfYmxvY2soYmxvY2ssIGNoZWNrX2ZpbGVfYmxrKTsKKwkJfQorCQlpbm8gPSAwOworCX0KKwlwdXNoX2ZpbGVuYW1lKG5hbWUpOworCWlub2RlID0gZ2V0X2lub2RlKGlubyk7CisJcG9wX2ZpbGVuYW1lKCk7CisJaWYgKCFvZmZzZXQpIHsKKwkJaWYgKGlub2RlICYmIExPTkVfQ0hBUihuYW1lLCAnLicpKQorCQkJcmV0dXJuOworCQlwcmludGYoIiVzOiBiYWQgZGlyZWN0b3J5OiAnLicgaXNuJ3QgZmlyc3RcbiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgeworCQlpZiAoaW5vZGUgJiYgc3RyY21wKCIuLiIsIG5hbWUpID09IDApCisJCQlyZXR1cm47CisJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuLicgaXNuJ3Qgc2Vjb25kXG4iLCBjdXJyZW50X25hbWUpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCX0KKwlpZiAoIWlub2RlKQorCQlyZXR1cm47CisJcHVzaF9maWxlbmFtZShuYW1lKTsKKwlpZiAoT1BUX2xpc3QpIHsKKwkJaWYgKE9QVF92ZXJib3NlKQorCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOworCQlwcmludGYoIiVzJXNcbiIsIGN1cnJlbnRfbmFtZSwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSA/ICI6IiA6ICIiKTsKKwl9CisJY2hlY2tfem9uZXMoaW5vKTsKKwlpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmVjdXJzaXZlX2NoZWNrKGlubyk7CisJcG9wX2ZpbGVuYW1lKCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIGNoZWNrX2ZpbGUyKHN0cnVjdCBtaW5peDJfaW5vZGUgKmRpciwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOworCWludCBpbm87CisJY2hhciAqbmFtZTsKKwlpbnQgYmxvY2s7CisKKwlibG9jayA9IG1hcF9ibG9jazIoZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBjaGVja19maWxlX2Jsayk7CisJbmFtZSA9IGNoZWNrX2ZpbGVfYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKKwlpbm8gPSAqKHVpbnQxNl90ICopIChuYW1lIC0gMik7CisJaWYgKGlubyA+IElOT0RFUykgeworCQlwcmludGYoIiVzIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnJS4qcycuICIsCisJCQkJY3VycmVudF9uYW1lLCBuYW1lbGVuLCBuYW1lKTsKKwkJaWYgKGFzaygiUmVtb3ZlIiwgMSkpIHsKKwkJCSoodWludDE2X3QgKikgKG5hbWUgLSAyKSA9IDA7CisJCQl3cml0ZV9ibG9jayhibG9jaywgY2hlY2tfZmlsZV9ibGspOworCQl9CisJCWlubyA9IDA7CisJfQorCXB1c2hfZmlsZW5hbWUobmFtZSk7CisJaW5vZGUgPSBnZXRfaW5vZGUyKGlubyk7CisJcG9wX2ZpbGVuYW1lKCk7CisJaWYgKCFvZmZzZXQpIHsKKwkJaWYgKGlub2RlICYmIExPTkVfQ0hBUihuYW1lLCAnLicpKQorCQkJcmV0dXJuOworCQlwcmludGYoIiVzOiBiYWQgZGlyZWN0b3J5OiAnLicgaXNuJ3QgZmlyc3RcbiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgeworCQlpZiAoaW5vZGUgJiYgc3RyY21wKCIuLiIsIG5hbWUpID09IDApCisJCQlyZXR1cm47CisJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuLicgaXNuJ3Qgc2Vjb25kXG4iLCBjdXJyZW50X25hbWUpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCX0KKwlpZiAoIWlub2RlKQorCQlyZXR1cm47CisJcHVzaF9maWxlbmFtZShuYW1lKTsKKwlpZiAoT1BUX2xpc3QpIHsKKwkJaWYgKE9QVF92ZXJib3NlKQorCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOworCQlwcmludGYoIiVzJXNcbiIsIGN1cnJlbnRfbmFtZSwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSA/ICI6IiA6ICIiKTsKKwl9CisJY2hlY2tfem9uZXMyKGlubyk7CisJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJlY3Vyc2l2ZV9jaGVjazIoaW5vKTsKKwlwb3BfZmlsZW5hbWUoKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW5vKQoreworCXN0cnVjdCBtaW5peDFfaW5vZGUgKmRpcjsKKwl1bnNpZ25lZCBvZmZzZXQ7CisKKwlkaXIgPSBJbm9kZTEgKyBpbm87CisJaWYgKCFTX0lTRElSKGRpci0+aV9tb2RlKSkKKwkJZGllKCJpbnRlcm5hbCBlcnJvciIpOworCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CisJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6IHNpemU8MzIiLCBjdXJyZW50X25hbWUpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCX0KKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKKwkJY2hlY2tfZmlsZShkaXIsIG9mZnNldCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW5vKQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmRpcjsKKwl1bnNpZ25lZCBvZmZzZXQ7CisKKwlkaXIgPSBJbm9kZTIgKyBpbm87CisJaWYgKCFTX0lTRElSKGRpci0+aV9tb2RlKSkKKwkJZGllKCJpbnRlcm5hbCBlcnJvciIpOworCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CisJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6IHNpemU8MzIiLCBjdXJyZW50X25hbWUpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCX0KKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKKwkJY2hlY2tfZmlsZTIoZGlyLCBvZmZzZXQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYmFkX3pvbmUoaW50IGkpCit7CisJY2hhciBidWZmZXJbQkxPQ0tfU0laRV07CisKKwl4bHNlZWsoZGV2X2ZkLCBCTE9DS19TSVpFICogaSwgU0VFS19TRVQpOworCXJldHVybiAoQkxPQ0tfU0laRSAhPSBmdWxsX3JlYWQoZGV2X2ZkLCBidWZmZXIsIEJMT0NLX1NJWkUpKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfY291bnRzKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CisJCWlmIChPUFRfd2Fybl9tb2RlICYmIElub2RlMVtpXS5pX21vZGUgJiYgIWlub2RlX2luX3VzZShpKSkgeworCQkJcHJpbnRmKCJJbm9kZSAlZCBoYXMgbm9uLXplcm8gbW9kZS4gIiwgaSk7CisJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CisJCQkJSW5vZGUxW2ldLmlfbW9kZSA9IDA7CisJCQkJY2hhbmdlZCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKCFpbm9kZV9jb3VudFtpXSkgeworCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIlVudXNlZCBpbm9kZSAlZCBpcyBtYXJrZWQgYXMgJ3VzZWQnIGluIHRoZSBiaXRtYXAuICIsIGkpOworCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKKwkJCQl1bm1hcmtfaW5vZGUoaSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWlub2RlX2luX3VzZShpKSkgeworCQkJcHJpbnRmKCJJbm9kZSAlZCBpcyB1c2VkLCBidXQgbWFya2VkIGFzICd1bnVzZWQnIGluIHRoZSBiaXRtYXAuICIsIGkpOworCQkJaWYgKGFzaygiU2V0IiwgMSkpCisJCQkJbWFya19pbm9kZShpKTsKKwkJfQorCQlpZiAoSW5vZGUxW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CisJCQlwcmludGYoIklub2RlICVkIChtb2RlPSUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4gIiwKKwkJCQlpLCBJbm9kZTFbaV0uaV9tb2RlLCBJbm9kZTFbaV0uaV9ubGlua3MsCisJCQkJaW5vZGVfY291bnRbaV0pOworCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKKwkJCQlJbm9kZTFbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CisJCWlmICgoem9uZV9pbl91c2UoaSkgIT0gMCkgPT0gem9uZV9jb3VudFtpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKKwkJCWlmIChiYWRfem9uZShpKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiWm9uZSAlZCBpcyBtYXJrZWQgJ2luIHVzZScsIGJ1dCBubyBmaWxlIHVzZXMgaXQuICIsIGkpOworCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCisJCQkJdW5tYXJrX3pvbmUoaSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAorCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7CisJfQorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitzdGF0aWMgdm9pZCBjaGVja19jb3VudHMyKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CisJCWlmIChPUFRfd2Fybl9tb2RlICYmIElub2RlMltpXS5pX21vZGUgJiYgIWlub2RlX2luX3VzZShpKSkgeworCQkJcHJpbnRmKCJJbm9kZSAlZCBoYXMgbm9uLXplcm8gbW9kZS4gIiwgaSk7CisJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CisJCQkJSW5vZGUyW2ldLmlfbW9kZSA9IDA7CisJCQkJY2hhbmdlZCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKCFpbm9kZV9jb3VudFtpXSkgeworCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIlVudXNlZCBpbm9kZSAlZCBpcyBtYXJrZWQgYXMgJ3VzZWQnIGluIHRoZSBiaXRtYXAuICIsIGkpOworCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKKwkJCQl1bm1hcmtfaW5vZGUoaSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWlub2RlX2luX3VzZShpKSkgeworCQkJcHJpbnRmKCJJbm9kZSAlZCBpcyB1c2VkLCBidXQgbWFya2VkIGFzICd1bnVzZWQnIGluIHRoZSBiaXRtYXAuICIsIGkpOworCQkJaWYgKGFzaygiU2V0IiwgMSkpCisJCQkJbWFya19pbm9kZShpKTsKKwkJfQorCQlpZiAoSW5vZGUyW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CisJCQlwcmludGYoIklub2RlICVkIChtb2RlPSUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4gIiwKKwkJCQlpLCBJbm9kZTJbaV0uaV9tb2RlLCBJbm9kZTJbaV0uaV9ubGlua3MsCisJCQkJaW5vZGVfY291bnRbaV0pOworCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKKwkJCQlJbm9kZTJbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CisJCWlmICgoem9uZV9pbl91c2UoaSkgIT0gMCkgPT0gem9uZV9jb3VudFtpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKKwkJCWlmIChiYWRfem9uZShpKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiWm9uZSAlZCBpcyBtYXJrZWQgJ2luIHVzZScsIGJ1dCBubyBmaWxlIHVzZXMgaXQuICIsIGkpOworCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCisJCQkJdW5tYXJrX3pvbmUoaSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAorCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoZWNrKHZvaWQpCit7CisJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CisJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CisJY2hlY2tfem9uZXMoTUlOSVhfUk9PVF9JTk8pOworCXJlY3Vyc2l2ZV9jaGVjayhNSU5JWF9ST09UX0lOTyk7CisJY2hlY2tfY291bnRzKCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIGNoZWNrMih2b2lkKQoreworCW1lbXNldChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOworCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOworCWNoZWNrX3pvbmVzMihNSU5JWF9ST09UX0lOTyk7CisJcmVjdXJzaXZlX2NoZWNrMihNSU5JWF9ST09UX0lOTyk7CisJY2hlY2tfY291bnRzMigpOworfQorI2Vsc2UKK3ZvaWQgY2hlY2syKHZvaWQpOworI2VuZGlmCisKK2ludCBmc2NrX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmc2NrX21pbml4X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdGVybWlvcyB0bXA7CisJaW50IHJldGNvZGUgPSAwOworCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gODsKKworCUlOSVRfRygpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTE6YXIiOyAvKiBvbmUgYXJndW1lbnQ7IC1hIGFzc3VtZXMgLXIgKi8KKwlnZXRvcHQzMihhcmd2LCBPUFRJT05fU1RSKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CisKKwljaGVja19tb3VudCgpOyAgLyogdHJ5aW5nIHRvIGNoZWNrIGEgbW91bnRlZCBmaWxlc3lzdGVtPyAqLworCWlmIChPUFRfbWFudWFsKSB7CisJCWlmICghaXNhdHR5KDApIHx8ICFpc2F0dHkoMSkpCisJCQlkaWUoIm5lZWQgdGVybWluYWwgZm9yIGludGVyYWN0aXZlIHJlcGFpcnMiKTsKKwl9CisJeG1vdmVfZmQoeG9wZW4oZGV2aWNlX25hbWUsIE9QVF9yZXBhaXIgPyBPX1JEV1IgOiBPX1JET05MWSksIGRldl9mZCk7CisKKwkvKnN5bmMoKTsgcGFyYW5vaWE/ICovCisJcmVhZF9zdXBlcmJsb2NrKCk7CisKKwkvKgorCSAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgY2hlY2tpbmcuCisJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgc3RhdHVzIG9mIHRoZSBmaWxlc3lzdGVtIHZhbGlkIGFuZCBlcnJvcgorCSAqIGZsYWdzIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgLWYgc3dpdGNoIHdhcyBzcGVjaWZpZWQgb24gdGhlCisJICogY29tbWFuZCBsaW5lLgorCSAqLworCXByaW50ZigiJXM6ICVzXG4iLCBhcHBsZXRfbmFtZSwgYmJfYmFubmVyKTsKKworCWlmICghKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9FUlJPUl9GUykKKwkgJiYgKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9WQUxJRF9GUykgJiYgIU9QVF9mb3JjZQorCSkgeworCQlpZiAoT1BUX3JlcGFpcikKKwkJCXByaW50ZigiJXMgaXMgY2xlYW4sIGNoZWNrIGlzIHNraXBwZWRcbiIsIGRldmljZV9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChPUFRfZm9yY2UpCisJCXByaW50ZigiRm9yY2luZyBmaWxlc3lzdGVtIGNoZWNrIG9uICVzXG4iLCBkZXZpY2VfbmFtZSk7CisJZWxzZSBpZiAoT1BUX3JlcGFpcikKKwkJcHJpbnRmKCJGaWxlc3lzdGVtIG9uICVzIGlzIGRpcnR5LCBuZWVkcyBjaGVja2luZ1xuIiwKKwkJCSAgIGRldmljZV9uYW1lKTsKKworCXJlYWRfdGFibGVzKCk7CisKKwlpZiAoT1BUX21hbnVhbCkgeworCQl0Y2dldGF0dHIoMCwgJnN2X3Rlcm1pb3MpOworCQl0bXAgPSBzdl90ZXJtaW9zOworCQl0bXAuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOworCQl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmdG1wKTsKKwkJdGVybWlvc19zZXQgPSAxOworCX0KKworCWlmICh2ZXJzaW9uMikgeworCQljaGVja19yb290MigpOworCQljaGVjazIoKTsKKwl9IGVsc2UgeworCQljaGVja19yb290KCk7CisJCWNoZWNrKCk7CisJfQorCisJaWYgKE9QVF92ZXJib3NlKSB7CisJCWludCBpLCBmcmVlX2NudDsKKworCQlmb3IgKGkgPSAxLCBmcmVlX2NudCA9IDA7IGkgPD0gSU5PREVTOyBpKyspCisJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKKwkJCQlmcmVlX2NudCsrOworCQlwcmludGYoIlxuJTZ1IGlub2RlcyB1c2VkICgldSUlKVxuIiwgKElOT0RFUyAtIGZyZWVfY250KSwKKwkJCSAgIDEwMCAqIChJTk9ERVMgLSBmcmVlX2NudCkgLyBJTk9ERVMpOworCQlmb3IgKGkgPSBGSVJTVFpPTkUsIGZyZWVfY250ID0gMDsgaSA8IFpPTkVTOyBpKyspCisJCQlpZiAoIXpvbmVfaW5fdXNlKGkpKQorCQkJCWZyZWVfY250Kys7CisJCXByaW50ZigiJTZ1IHpvbmVzIHVzZWQgKCV1JSUpXG5cbiIKKwkJCSAgICIlNnUgcmVndWxhciBmaWxlc1xuIgorCQkJICAgIiU2dSBkaXJlY3Rvcmllc1xuIgorCQkJICAgIiU2dSBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzXG4iCisJCQkgICAiJTZ1IGJsb2NrIGRldmljZSBmaWxlc1xuIgorCQkJICAgIiU2dSBsaW5rc1xuIgorCQkJICAgIiU2dSBzeW1ib2xpYyBsaW5rc1xuIgorCQkJICAgIi0tLS0tLVxuIgorCQkJICAgIiU2dSBmaWxlc1xuIiwKKwkJCSAgIChaT05FUyAtIGZyZWVfY250KSwgMTAwICogKFpPTkVTIC0gZnJlZV9jbnQpIC8gWk9ORVMsCisJCQkgICByZWd1bGFyLCBkaXJlY3RvcnksIGNoYXJkZXYsIGJsb2NrZGV2LAorCQkJICAgbGlua3MgLSAyICogZGlyZWN0b3J5ICsgMSwgc3ltbGlua3MsCisJCQkgICB0b3RhbCAtIDIgKiBkaXJlY3RvcnkgKyAxKTsKKwl9CisJaWYgKGNoYW5nZWQpIHsKKwkJd3JpdGVfdGFibGVzKCk7CisJCXByaW50ZigiRklMRSBTWVNURU0gSEFTIEJFRU4gQ0hBTkdFRFxuIik7CisJCXN5bmMoKTsKKwl9IGVsc2UgaWYgKE9QVF9yZXBhaXIpCisJCXdyaXRlX3N1cGVyYmxvY2soKTsKKworCWlmIChPUFRfbWFudWFsKQorCQl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmc3ZfdGVybWlvcyk7CisKKwlpZiAoY2hhbmdlZCkKKwkJcmV0Y29kZSArPSAzOworCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCisJCXJldGNvZGUgKz0gNDsKKwlyZXR1cm4gcmV0Y29kZTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvZ2V0b3B0LmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWVkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2dldG9wdC5jCkBAIC0wLDAgKzEsNDAzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBnZXRvcHQuYyAtIEVuaGFuY2VkIGltcGxlbWVudGF0aW9uIG9mIEJTRCBnZXRvcHQoMSkKKyAqICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVmVyc2lvbiAxLjAtYjQ6IFR1ZSBTZXAgMjMgMTk5Ny4gRmlyc3QgcHVibGljIHJlbGVhc2UuCisgKiBWZXJzaW9uIDEuMDogV2VkIE5vdiAxOSAxOTk3LgorICogICBCdW1wZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVyIHRvIDEuMAorICogICBGaXhlZCBtaW5vciB0eXBvIChDU0ggaW5zdGVhZCBvZiBUQ1NIKQorICogVmVyc2lvbiAxLjAuMTogVHVlIEp1biAzIDE5OTgKKyAqICAgRml4ZWQgc2l6ZW9mIGluc3RlYWQgb2Ygc3RybGVuIGJ1ZworICogICBCdW1wZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVyIHRvIDEuMC4xCisgKiBWZXJzaW9uIDEuMC4yOiBUaHUgSnVuIDExIDE5OTggKG5vdCBwcmVzZW50KQorICogICBGaXhlZCBnY2MtMi44LjEgd2FybmluZ3MKKyAqICAgRml4ZWQgLS12ZXJzaW9uLy1WIG9wdGlvbiAobm90IHByZXNlbnQpCisgKiBWZXJzaW9uIDEuMC41OiBUdWUgSnVuIDIyIDE5OTkKKyAqICAgTWFrZSAtdSBvcHRpb24gd29yayAobm90IHByZXNlbnQpCisgKiBWZXJzaW9uIDEuMC42OiBUdWUgSnVuIDI3IDIwMDAKKyAqICAgTm8gaW1wb3J0YW50IGNoYW5nZXMKKyAqIFZlcnNpb24gMS4xLjA6IFR1ZSBKdW4gMzAgMjAwMAorICogICBBZGRlZCBOTFMgc3VwcG9ydCAocGFydGx5IHdyaXR0ZW4gYnkgQXJrYWRpdXN6IE1pY2tpZXdpY3oKKyAqICAgICA8bWlzaWVrQG1pc2llay5ldS5vcmc+KQorICogUG9ydGVkIHRvIEJ1c3lib3ggLSBBbGZyZWQgTS4gU3ptaWR0IDxhbXNAdHJpbGxpYW4uaXRzbGludXgub3JnPgorICogIFJlbW92ZWQgLS12ZXJzaW9uLy1WIGFuZCAtLWhlbHAvLWgKKyAqICBSZW1vdmVkIHBhcnNlX2Vycm9yKCksIHVzaW5nIGJiX2Vycm9yX21zZygpIGZyb20gQnVzeWJveCBpbnN0ZWFkCisgKiAgUmVwbGFjZWQgb3VyX21hbGxvYyB3aXRoIHhtYWxsb2MgYW5kIG91cl9yZWFsbG9jIHdpdGggeHJlYWxsb2MKKyAqCisgKi8KKworLy91c2FnZTojZGVmaW5lIGdldG9wdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIgorLy91c2FnZTojZGVmaW5lIGdldG9wdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICAgIgktYSwtLWFsdGVybmF0aXZlCQlBbGxvdyBsb25nIG9wdGlvbnMgc3RhcnRpbmcgd2l0aCBzaW5nbGUgLSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwsLS1sb25nb3B0aW9ucz1sb25nb3B0cwlMb25nIG9wdGlvbnMgdG8gYmUgcmVjb2duaXplZCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4sLS1uYW1lPXByb2duYW1lCQlUaGUgbmFtZSB1bmRlciB3aGljaCBlcnJvcnMgYXJlIHJlcG9ydGVkIgorLy91c2FnZTogICAgICJcbgktbywtLW9wdGlvbnM9b3B0c3RyaW5nCQlTaG9ydCBvcHRpb25zIHRvIGJlIHJlY29nbml6ZWQiCisvL3VzYWdlOiAgICAgIlxuCS1xLC0tcXVpZXQJCQlEaXNhYmxlIGVycm9yIHJlcG9ydGluZyBieSBnZXRvcHQoMykiCisvL3VzYWdlOiAgICAgIlxuCS1RLC0tcXVpZXQtb3V0cHV0CQlObyBub3JtYWwgb3V0cHV0IgorLy91c2FnZTogICAgICJcbgktcywtLXNoZWxsPXNoZWxsCQlTZXQgc2hlbGwgcXVvdGluZyBjb252ZW50aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLVQsLS10ZXN0CQkJVGVzdCBmb3IgZ2V0b3B0KDEpIHZlcnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS11LC0tdW5xdW90ZWQJCQlEb24ndCBxdW90ZSB0aGUgb3V0cHV0IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAgICIJLWEJCUFsbG93IGxvbmcgb3B0aW9ucyBzdGFydGluZyB3aXRoIHNpbmdsZSAtIgorLy91c2FnZTogICAgICJcbgktbCBsb25nb3B0cwlMb25nIG9wdGlvbnMgdG8gYmUgcmVjb2duaXplZCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gcHJvZ25hbWUJVGhlIG5hbWUgdW5kZXIgd2hpY2ggZXJyb3JzIGFyZSByZXBvcnRlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLW8gb3B0c3RyaW5nCVNob3J0IG9wdGlvbnMgdG8gYmUgcmVjb2duaXplZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCURpc2FibGUgZXJyb3IgcmVwb3J0aW5nIGJ5IGdldG9wdCgzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVEJCU5vIG5vcm1hbCBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1zIHNoZWxsCVNldCBzaGVsbCBxdW90aW5nIGNvbnZlbnRpb25zIgorLy91c2FnZTogICAgICJcbgktVAkJVGVzdCBmb3IgZ2V0b3B0KDEpIHZlcnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS11CQlEb24ndCBxdW90ZSB0aGUgb3V0cHV0IgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBnZXRvcHRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgY2F0IGdldG9wdC50ZXN0XG4iCisvL3VzYWdlOiAgICAgICAiIyEvYmluL3NoXG4iCisvL3VzYWdlOiAgICAgICAiR0VUT1BUPWBnZXRvcHQgLW8gYWI6Yzo6IC0tbG9uZyBhLWxvbmcsYi1sb25nOixjLWxvbmc6OiBcXFxuIgorLy91c2FnZTogICAgICAgIiAgICAgICAtbiAnZXhhbXBsZS5idXN5Ym94JyAtLSBcIiRAXCJgXG4iCisvL3VzYWdlOiAgICAgICAiaWYgWyAkPyAhPSAwIF07IHRoZW4gZXhpdCAxOyBmaVxuIgorLy91c2FnZTogICAgICAgImV2YWwgc2V0IC0tIFwiJEdFVE9QVFwiXG4iCisvL3VzYWdlOiAgICAgICAid2hpbGUgdHJ1ZTsgZG9cbiIKKy8vdXNhZ2U6ICAgICAgICIgY2FzZSAkMSBpblxuIgorLy91c2FnZTogICAgICAgIiAgIC1hfC0tYS1sb25nKSBlY2hvIFwiT3B0aW9uIGFcIjsgc2hpZnQ7O1xuIgorLy91c2FnZTogICAgICAgIiAgIC1ifC0tYi1sb25nKSBlY2hvIFwiT3B0aW9uIGIsIGFyZ3VtZW50ICckMidcIjsgc2hpZnQgMjs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgLWN8LS1jLWxvbmcpXG4iCisvL3VzYWdlOiAgICAgICAiICAgICBjYXNlIFwiJDJcIiBpblxuIgorLy91c2FnZTogICAgICAgIiAgICAgICBcIlwiKSBlY2hvIFwiT3B0aW9uIGMsIG5vIGFyZ3VtZW50XCI7IHNoaWZ0IDI7O1xuIgorLy91c2FnZTogICAgICAgIiAgICAgICAqKSAgZWNobyBcIk9wdGlvbiBjLCBhcmd1bWVudCAnJDInXCI7IHNoaWZ0IDI7O1xuIgorLy91c2FnZTogICAgICAgIiAgICAgZXNhYzs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgLS0pIHNoaWZ0OyBicmVhazs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgKikgZWNobyBcIkludGVybmFsIGVycm9yIVwiOyBleGl0IDE7O1xuIgorLy91c2FnZTogICAgICAgIiBlc2FjXG4iCisvL3VzYWdlOiAgICAgICAiZG9uZVxuIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKyMgaW5jbHVkZSA8Z2V0b3B0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBOT05fT1BUIGlzIHRoZSBjb2RlIHRoYXQgaXMgcmV0dXJuZWQgd2hlbiBhIG5vbi1vcHRpb24gaXMgZm91bmQgaW4gJysnCisgICBtb2RlICovCitlbnVtIHsKKwlOT05fT1BUID0gMSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworLyogTE9OR19PUFQgaXMgdGhlIGNvZGUgdGhhdCBpcyByZXR1cm5lZCB3aGVuIGEgbG9uZyBvcHRpb24gaXMgZm91bmQuICovCisJTE9OR19PUFQgPSAyCisjZW5kaWYKK307CisKKy8qIEZvciBmaW5kaW5nIGFjdGl2YXRlZCBvcHRpb24gZmxhZ3MuIE11c3QgbWF0Y2ggZ2V0b3B0MzIgY2FsbCEgKi8KK2VudW0geworCU9QVF9vCT0gMHgxLAkvLyAtbworCU9QVF9uCT0gMHgyLAkvLyAtbgorCU9QVF9xCT0gMHg0LAkvLyAtcQorCU9QVF9RCT0gMHg4LAkvLyAtUQorCU9QVF9zCT0gMHgxMCwJLy8gLXMKKwlPUFRfVAk9IDB4MjAsCS8vIC1UCisJT1BUX3UJPSAweDQwLAkvLyAtdQorI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisJT1BUX2EJPSAweDgwLAkvLyAtYQorCU9QVF9sCT0gMHgxMDAsIC8vIC1sCisjZW5kaWYKKwlTSEVMTF9JU19UQ1NIID0gMHg4MDAwLCAvKiBoaWphY2sgdGhpcyBiaXQgZm9yIG90aGVyIHB1cnBvc2VzICovCit9OworCisvKiAwIGlzIGdldG9wdF9sb25nLCAxIGlzIGdldG9wdF9sb25nX29ubHkgKi8KKyNkZWZpbmUgYWx0ZXJuYXRpdmUgIChvcHRpb25fbWFzazMyICYgT1BUX2EpCisKKyNkZWZpbmUgcXVpZXRfZXJyb3JzIChvcHRpb25fbWFzazMyICYgT1BUX3EpCisjZGVmaW5lIHF1aWV0X291dHB1dCAob3B0aW9uX21hc2szMiAmIE9QVF9RKQorI2RlZmluZSBxdW90ZSAgICAgICAgKCEob3B0aW9uX21hc2szMiAmIE9QVF91KSkKKyNkZWZpbmUgc2hlbGxfVENTSCAgIChvcHRpb25fbWFzazMyICYgU0hFTExfSVNfVENTSCkKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gJ25vcm1hbGl6ZXMnIGEgc2luZ2xlIGFyZ3VtZW50OiBpdCBwdXRzIHNpbmdsZSBxdW90ZXMgYXJvdW5kCisgKiBpdCBhbmQgZXNjYXBlcyBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMuIElmIHF1b3RlIGlzIGZhbHNlLCBpdCBqdXN0CisgKiByZXR1cm5zIGl0cyBhcmd1bWVudC4KKyAqIEJhc2ggb25seSBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudCBmb3Igc2luZ2xlIHF1b3RlczsgdGNzaCBhbHNvIHJlY29nbml6ZXMKKyAqIGV4Y2xhbWF0aW9uIG1hcmtzIHdpdGhpbiBzaW5nbGUgcXVvdGVzLCBhbmQgbnVrZXMgd2hpdGVzcGFjZS4KKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCBpcyBvdmVyd3JpdHRlbiBieQorICogZWFjaCBjYWxsLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqbm9ybWFsaXplKGNvbnN0IGNoYXIgKmFyZykKK3sKKwljaGFyICpidWZwdHI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKKwlzdGF0aWMgY2hhciAqQlVGRkVSID0gTlVMTDsKKwlmcmVlKEJVRkZFUik7CisjZWxzZQorCWNoYXIgKkJVRkZFUjsKKyNlbmRpZgorCisJaWYgKCFxdW90ZSkgeyAvKiBKdXN0IGNvcHkgYXJnICovCisJCUJVRkZFUiA9IHhzdHJkdXAoYXJnKTsKKwkJcmV0dXJuIEJVRkZFUjsKKwl9CisKKwkvKiBFYWNoIGNoYXJhY3RlciBpbiBhcmcgbWF5IHRha2UgdXAgdG8gZm91ciBjaGFyYWN0ZXJzIGluIHRoZSByZXN1bHQ6CisJICAgRm9yIGEgcXVvdGUgd2UgbmVlZCBhIGNsb3NpbmcgcXVvdGUsIGEgYmFja3NsYXNoLCBhIHF1b3RlIGFuZCBhbgorCSAgIG9wZW5pbmcgcXVvdGUhIFdlIG5lZWQgYWxzbyB0aGUgZ2xvYmFsIG9wZW5pbmcgYW5kIGNsb3NpbmcgcXVvdGUsCisJICAgYW5kIG9uZSBleHRyYSBjaGFyYWN0ZXIgZm9yICdcMCcuICovCisJQlVGRkVSID0geG1hbGxvYyhzdHJsZW4oYXJnKSo0ICsgMyk7CisKKwlidWZwdHIgPSBCVUZGRVI7CisJKmJ1ZnB0ciArKz0gJ1wnJzsKKworCXdoaWxlICgqYXJnKSB7CisJCWlmICgqYXJnID09ICdcJycpIHsKKwkJCS8qIFF1b3RlOiByZXBsYWNlIGl0IHdpdGg6ICdcJycgKi8KKwkJCSpidWZwdHIgKys9ICdcJyc7CisJCQkqYnVmcHRyICsrPSAnXFwnOworCQkJKmJ1ZnB0ciArKz0gJ1wnJzsKKwkJCSpidWZwdHIgKys9ICdcJyc7CisJCX0gZWxzZSBpZiAoc2hlbGxfVENTSCAmJiAqYXJnID09ICchJykgeworCQkJLyogRXhjbGFtYXRpb24gbWFyazogcmVwbGFjZSBpdCB3aXRoOiBcISAqLworCQkJKmJ1ZnB0ciArKz0gJ1wnJzsKKwkJCSpidWZwdHIgKys9ICdcXCc7CisJCQkqYnVmcHRyICsrPSAnISc7CisJCQkqYnVmcHRyICsrPSAnXCcnOworCQl9IGVsc2UgaWYgKHNoZWxsX1RDU0ggJiYgKmFyZyA9PSAnXG4nKSB7CisJCQkvKiBOZXdsaW5lOiByZXBsYWNlIGl0IHdpdGg6IFxuICovCisJCQkqYnVmcHRyICsrPSAnXFwnOworCQkJKmJ1ZnB0ciArKz0gJ24nOworCQl9IGVsc2UgaWYgKHNoZWxsX1RDU0ggJiYgaXNzcGFjZSgqYXJnKSkgeworCQkJLyogTm9uLW5ld2xpbmUgd2hpdGVzcGFjZTogcmVwbGFjZSBpdCB3aXRoIFw8d3M+ICovCisJCQkqYnVmcHRyICsrPSAnXCcnOworCQkJKmJ1ZnB0ciArKz0gJ1xcJzsKKwkJCSpidWZwdHIgKys9ICphcmc7CisJCQkqYnVmcHRyICsrPSAnXCcnOworCQl9IGVsc2UKKwkJCS8qIEp1c3QgY29weSAqLworCQkJKmJ1ZnB0ciArKz0gKmFyZzsKKwkJYXJnKys7CisJfQorCSpidWZwdHIgKys9ICdcJyc7CisJKmJ1ZnB0ciArKz0gJ1wwJzsKKwlyZXR1cm4gQlVGRkVSOworfQorCisvKgorICogR2VuZXJhdGUgdGhlIG91dHB1dC4gYXJndlswXSBpcyB0aGUgcHJvZ3JhbSBuYW1lICh1c2VkIGZvciByZXBvcnRpbmcgZXJyb3JzKS4KKyAqIGFyZ3ZbMS4uXSBjb250YWlucyB0aGUgb3B0aW9ucyB0byBiZSBwYXJzZWQuIGFyZ2MgbXVzdCBiZSB0aGUgbnVtYmVyIG9mCisgKiBlbGVtZW50cyBpbiBhcmd2IChpZS4gMSBpZiB0aGVyZSBhcmUgbm8gb3B0aW9ucywgb25seSB0aGUgcHJvZ3JhbSBuYW1lKSwKKyAqIG9wdHN0ciBtdXN0IGNvbnRhaW4gdGhlIHNob3J0IG9wdGlvbnMsIGFuZCBsb25nb3B0cyB0aGUgbG9uZyBvcHRpb25zLgorICogT3RoZXIgc2V0dGluZ3MgYXJlIGZvdW5kIGluIGdsb2JhbCB2YXJpYWJsZXMuCisgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKyNkZWZpbmUgZ2VuZXJhdGVfb3V0cHV0KGFyZ3YsYXJnYyxvcHRzdHIsbG9uZ29wdHMpIFwKKwlnZW5lcmF0ZV9vdXRwdXQoYXJndixhcmdjLG9wdHN0cikKKyNlbmRpZgorc3RhdGljIGludCBnZW5lcmF0ZV9vdXRwdXQoY2hhciAqKmFyZ3YsIGludCBhcmdjLCBjb25zdCBjaGFyICpvcHRzdHIsIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzKQoreworCWludCBleGl0X2NvZGUgPSAwOyAvKiBXZSBhc3N1bWUgZXZlcnl0aGluZyB3aWxsIGJlIE9LICovCisJaW50IG9wdDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworCWludCBsb25naW5kZXg7CisjZW5kaWYKKwljb25zdCBjaGFyICpjaGFycHRyOworCisJaWYgKHF1aWV0X2Vycm9ycykgLyogTm8gZXJyb3IgcmVwb3J0aW5nIGZyb20gZ2V0b3B0KDMpICovCisJCW9wdGVyciA9IDA7CisKKwkvKiBXZSB1c2VkIGl0IGFscmVhZHkgaW4gbWFpbigpIGluIGdldG9wdDMyKCksCisJICogd2UgKm11c3QqIHJlc2V0IGdldG9wdCgzKTogKi8KKyNpZmRlZiBfX0dMSUJDX18KKwlvcHRpbmQgPSAwOworI2Vsc2UgLyogQlNEIHN0eWxlICovCisJb3B0aW5kID0gMTsKKwkvKiBvcHRyZXNldCA9IDE7ICovCisjZW5kaWYKKworCXdoaWxlICgxKSB7CisJCW9wdCA9CisjaWYgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwkJCWFsdGVybmF0aXZlID8KKwkJCWdldG9wdF9sb25nX29ubHkoYXJnYywgYXJndiwgb3B0c3RyLCBsb25nb3B0cywgJmxvbmdpbmRleCkgOgorCQkJZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgb3B0c3RyLCBsb25nb3B0cywgJmxvbmdpbmRleCk7CisjZWxzZQorCQkJZ2V0b3B0KGFyZ2MsIGFyZ3YsIG9wdHN0cik7CisjZW5kaWYKKwkJaWYgKG9wdCA9PSAtMSkKKwkJCWJyZWFrOworCQlpZiAob3B0ID09ICc/JyB8fCBvcHQgPT0gJzonICkKKwkJCWV4aXRfY29kZSA9IDE7CisJCWVsc2UgaWYgKCFxdWlldF9vdXRwdXQpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworCQkJaWYgKG9wdCA9PSBMT05HX09QVCkgeworCQkJCXByaW50ZigiIC0tJXMiLCBsb25nb3B0c1tsb25naW5kZXhdLm5hbWUpOworCQkJCWlmIChsb25nb3B0c1tsb25naW5kZXhdLmhhc19hcmcpCisJCQkJCXByaW50ZigiICVzIiwKKwkJCQkJCW5vcm1hbGl6ZShvcHRhcmcgPyBvcHRhcmcgOiAiIikpOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChvcHQgPT0gTk9OX09QVCkKKwkJCQlwcmludGYoIiAlcyIsIG5vcm1hbGl6ZShvcHRhcmcpKTsKKwkJCWVsc2UgeworCQkJCXByaW50ZigiIC0lYyIsIG9wdCk7CisJCQkJY2hhcnB0ciA9IHN0cmNocihvcHRzdHIsIG9wdCk7CisJCQkJaWYgKGNoYXJwdHIgIT0gTlVMTCAmJiAqKytjaGFycHRyID09ICc6JykKKwkJCQkJcHJpbnRmKCIgJXMiLAorCQkJCQkJbm9ybWFsaXplKG9wdGFyZyA/IG9wdGFyZyA6ICIiKSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXF1aWV0X291dHB1dCkgeworCQlwcmludGYoIiAtLSIpOworCQl3aGlsZSAob3B0aW5kIDwgYXJnYykKKwkJCXByaW50ZigiICVzIiwgbm9ybWFsaXplKGFyZ3Zbb3B0aW5kKytdKSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCXJldHVybiBleGl0X2NvZGU7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworLyoKKyAqIFJlZ2lzdGVyIHNldmVyYWwgbG9uZyBvcHRpb25zLiBvcHRpb25zIGlzIGEgc3RyaW5nIG9mIGxvbmcgb3B0aW9ucywKKyAqIHNlcGFyYXRlZCBieSBjb21tYXMgb3Igd2hpdGVzcGFjZS4KKyAqIFRoaXMgbnVrZXMgb3B0aW9ucyEKKyAqLworc3RhdGljIHN0cnVjdCBvcHRpb24gKmFkZF9sb25nX29wdGlvbnMoc3RydWN0IG9wdGlvbiAqbG9uZ19vcHRpb25zLCBjaGFyICpvcHRpb25zKQoreworCWludCBsb25nX25yID0gMDsKKwlpbnQgYXJnX29wdCwgdGxlbjsKKwljaGFyICp0b2twdHIgPSBzdHJ0b2sob3B0aW9ucywgIiwgXHRcbiIpOworCisJaWYgKGxvbmdfb3B0aW9ucykKKwkJd2hpbGUgKGxvbmdfb3B0aW9uc1tsb25nX25yXS5uYW1lKQorCQkJbG9uZ19ucisrOworCisJd2hpbGUgKHRva3B0cikgeworCQlhcmdfb3B0ID0gbm9fYXJndW1lbnQ7CisJCXRsZW4gPSBzdHJsZW4odG9rcHRyKTsKKwkJaWYgKHRsZW4pIHsKKwkJCXRsZW4tLTsKKwkJCWlmICh0b2twdHJbdGxlbl0gPT0gJzonKSB7CisJCQkJYXJnX29wdCA9IHJlcXVpcmVkX2FyZ3VtZW50OworCQkJCWlmICh0bGVuICYmIHRva3B0clt0bGVuLTFdID09ICc6JykgeworCQkJCQl0bGVuLS07CisJCQkJCWFyZ19vcHQgPSBvcHRpb25hbF9hcmd1bWVudDsKKwkJCQl9CisJCQkJdG9rcHRyW3RsZW5dID0gJ1wwJzsKKwkJCQlpZiAodGxlbiA9PSAwKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZW1wdHkgbG9uZyBvcHRpb24gc3BlY2lmaWVkIik7CisJCQl9CisJCQlsb25nX29wdGlvbnMgPSB4cmVhbGxvY192ZWN0b3IobG9uZ19vcHRpb25zLCA0LCBsb25nX25yKTsKKwkJCWxvbmdfb3B0aW9uc1tsb25nX25yXS5oYXNfYXJnID0gYXJnX29wdDsKKwkJCS8qbG9uZ19vcHRpb25zW2xvbmdfbnJdLmZsYWcgPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKwkJCWxvbmdfb3B0aW9uc1tsb25nX25yXS52YWwgPSBMT05HX09QVDsKKwkJCWxvbmdfb3B0aW9uc1tsb25nX25yXS5uYW1lID0geHN0cmR1cCh0b2twdHIpOworCQkJbG9uZ19ucisrOworCQkJLyptZW1zZXQoJmxvbmdfb3B0aW9uc1tsb25nX25yXSwgMCwgc2l6ZW9mKGxvbmdfb3B0aW9uc1swXSkpOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKwkJfQorCQl0b2twdHIgPSBzdHJ0b2soTlVMTCwgIiwgXHRcbiIpOworCX0KKwlyZXR1cm4gbG9uZ19vcHRpb25zOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNldF9zaGVsbChjb25zdCBjaGFyICpuZXdfc2hlbGwpCit7CisJaWYgKCFzdHJjbXAobmV3X3NoZWxsLCAiYmFzaCIpIHx8ICFzdHJjbXAobmV3X3NoZWxsLCAic2giKSkKKwkJcmV0dXJuOworCWlmICghc3RyY21wKG5ld19zaGVsbCwgInRjc2giKSB8fCAhc3RyY21wKG5ld19zaGVsbCwgImNzaCIpKQorCQlvcHRpb25fbWFzazMyIHw9IFNIRUxMX0lTX1RDU0g7CisJZWxzZQorCQliYl9lcnJvcl9tc2coInVua25vd24gc2hlbGwgJyVzJywgYXNzdW1pbmcgYmFzaCIsIG5ld19zaGVsbCk7Cit9CisKKworLyogRXhpdCBjb2RlczoKKyAqICAgMCkgTm8gZXJyb3JzLCBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAqICAgMSkgZ2V0b3B0KDMpIHJldHVybmVkIGFuIGVycm9yLgorICogICAyKSBBIHByb2JsZW0gd2l0aCBwYXJhbWV0ZXIgcGFyc2luZyBmb3IgZ2V0b3B0KDEpLgorICogICAzKSBJbnRlcm5hbCBlcnJvciwgb3V0IG9mIG1lbW9yeQorICogICA0KSBSZXR1cm5lZCBmb3IgLVQKKyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKK3N0YXRpYyBjb25zdCBjaGFyIGdldG9wdF9sb25nb3B0c1tdIEFMSUdOMSA9CisJIm9wdGlvbnNcMCIgICAgICBSZXF1aXJlZF9hcmd1bWVudCAibyIKKwkibG9uZ29wdGlvbnNcMCIgIFJlcXVpcmVkX2FyZ3VtZW50ICJsIgorCSJxdWlldFwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInEiCisJInF1aWV0LW91dHB1dFwwIiBOb19hcmd1bWVudCAgICAgICAiUSIKKwkic2hlbGxcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJzIgorCSJ0ZXN0XDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlQiCisJInVucXVvdGVkXDAiICAgICBOb19hcmd1bWVudCAgICAgICAidSIKKwkiYWx0ZXJuYXRpdmVcMCIgIE5vX2FyZ3VtZW50ICAgICAgICJhIgorCSJuYW1lXDAiICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIm4iCisJOworI2VuZGlmCisKK2ludCBnZXRvcHRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGdldG9wdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpvcHRzdHIgPSBOVUxMOworCWNoYXIgKm5hbWUgPSBOVUxMOworCXVuc2lnbmVkIG9wdDsKKwljb25zdCBjaGFyICpjb21wYXRpYmxlOworCWNoYXIgKnNfYXJnOworI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisJc3RydWN0IG9wdGlvbiAqbG9uZ19vcHRpb25zID0gTlVMTDsKKwlsbGlzdF90ICpsX2FyZyA9IE5VTEw7CisjZW5kaWYKKworCWNvbXBhdGlibGUgPSBnZXRlbnYoIkdFVE9QVF9DT01QQVRJQkxFIik7IC8qIHVzZWQgYXMgeWVzL25vIGZsYWcgKi8KKworCWlmIChhcmdjID09IDEpIHsKKwkJaWYgKGNvbXBhdGlibGUpIHsKKwkJCS8qIEZvciBzb21lIHJlYXNvbiwgdGhlIG9yaWdpbmFsIGdldG9wdCBnYXZlIG5vIGVycm9yCisJCQkgICB3aGVuIHRoZXJlIHdlcmUgbm8gYXJndW1lbnRzLiAqLworCQkJcHJpbnRmKCIgLS1cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm1pc3Npbmcgb3B0c3RyaW5nIGFyZ3VtZW50Iik7CisJfQorCisJaWYgKGFyZ3ZbMV1bMF0gIT0gJy0nIHx8IGNvbXBhdGlibGUpIHsKKwkJY2hhciAqczsKKworCQlvcHRpb25fbWFzazMyIHw9IE9QVF91OyAvKiBxdW90aW5nIG9mZiAqLworCQlzID0geHN0cmR1cChhcmd2WzFdICsgc3Ryc3BuKGFyZ3ZbMV0sICItKyIpKTsKKwkJYXJndlsxXSA9IGFyZ3ZbMF07CisJCXJldHVybiBnZW5lcmF0ZV9vdXRwdXQoYXJndisxLCBhcmdjLTEsIHMsIGxvbmdfb3B0aW9ucyk7CisJfQorCisjaWYgIUVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIitvOm46cVFzOlR1IiwgJm9wdHN0ciwgJm5hbWUsICZzX2FyZyk7CisjZWxzZQorCWFwcGxldF9sb25nX29wdGlvbnMgPSBnZXRvcHRfbG9uZ29wdHM7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibDo6IjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK286bjpxUXM6VHVhbDoiLAorCQkJCQkmb3B0c3RyLCAmbmFtZSwgJnNfYXJnLCAmbF9hcmcpOworCS8qIEVmZmVjdHVhdGUgdGhlIHJlYWQgb3B0aW9ucyBmb3IgdGhlIGFwcGxldCBpdHNlbGYgKi8KKwl3aGlsZSAobF9hcmcpIHsKKwkJbG9uZ19vcHRpb25zID0gYWRkX2xvbmdfb3B0aW9ucyhsb25nX29wdGlvbnMsIGxsaXN0X3BvcCgmbF9hcmcpKTsKKwl9CisjZW5kaWYKKworCWlmIChvcHQgJiBPUFRfcykgeworCQlzZXRfc2hlbGwoc19hcmcpOworCX0KKworCWlmIChvcHQgJiBPUFRfVCkgeworCQlyZXR1cm4gNDsKKwl9CisKKwkvKiBBbGwgb3B0aW9ucyBjb250cm9sbGluZyB0aGUgYXBwbGV0IGhhdmUgbm93IGJlZW4gcGFyc2VkICovCisJaWYgKCFvcHRzdHIpIHsKKwkJaWYgKG9wdGluZCA+PSBhcmdjKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm1pc3Npbmcgb3B0c3RyaW5nIGFyZ3VtZW50Iik7CisJCW9wdHN0ciA9IGFyZ3Zbb3B0aW5kKytdOworCX0KKworCWFyZ3Zbb3B0aW5kLTFdID0gbmFtZSA/IG5hbWUgOiBhcmd2WzBdOworCXJldHVybiBnZW5lcmF0ZV9vdXRwdXQoYXJnditvcHRpbmQtMSwgYXJnYy1vcHRpbmQrMSwgb3B0c3RyLCBsb25nX29wdGlvbnMpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9oZXhkdW1wLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2hleGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTMxMmY5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9oZXhkdW1wLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGhleGR1bXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSB1dGlsLWxpbnV4IHYgMi4xMWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGhleGR1bXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYmNDZGVmbm9zdngiIElGX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFKCJSIikgIl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGhleGR1bXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IEZJTEVzIChvciBzdGRpbikgaW4gYSB1c2VyIHNwZWNpZmllZCBmb3JtYXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJCU9uZS1ieXRlIG9jdGFsIGRpc3BsYXkiCisvL3VzYWdlOiAgICAgIlxuCS1jCQlPbmUtYnl0ZSBjaGFyYWN0ZXIgZGlzcGxheSIKKy8vdXNhZ2U6ICAgICAiXG4JLUMJCUNhbm9uaWNhbCBoZXgrQVNDSUksIDE2IGJ5dGVzIHBlciBsaW5lIgorLy91c2FnZTogICAgICJcbgktZAkJVHdvLWJ5dGUgZGVjaW1hbCBkaXNwbGF5IgorLy91c2FnZTogICAgICJcbgktZSBGT1JNQVRfU1RSSU5HIgorLy91c2FnZTogICAgICJcbgktZiBGT1JNQVRfRklMRSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTEVOR1RICUludGVycHJldCBvbmx5IExFTkdUSCBieXRlcyBvZiBpbnB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JCVR3by1ieXRlIG9jdGFsIGRpc3BsYXkiCisvL3VzYWdlOiAgICAgIlxuCS1zIE9GRlNFVAlTa2lwIE9GRlNFVCBieXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCURpc3BsYXkgYWxsIGlucHV0IGRhdGEiCisvL3VzYWdlOiAgICAgIlxuCS14CQlUd28tYnl0ZSBoZXhhZGVjaW1hbCBkaXNwbGF5IgorLy91c2FnZToJSUZfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UoCisvL3VzYWdlOiAgICAgIlxuCS1SCQlSZXZlcnNlIG9mICdoZXhkdW1wIC1DdiciKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBoZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBoZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgImhkIGlzIGFuIGFsaWFzIGZvciBoZXhkdW1wIC1DIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJkdW1wLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK3N0YXRpYyB2b2lkIGJiX2R1bXBfYWRkZmlsZShkdW1wZXJfdCAqZHVtcGVyLCBjaGFyICpuYW1lKQoreworCWNoYXIgKnA7CisJRklMRSAqZnA7CisJY2hhciAqYnVmOworCisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQobmFtZSk7CisJd2hpbGUgKChidWYgPSB4bWFsbG9jX2ZnZXRsaW5lKGZwKSkgIT0gTlVMTCkgeworCQlwID0gc2tpcF93aGl0ZXNwYWNlKGJ1Zik7CisJCWlmICgqcCAmJiAoKnAgIT0gJyMnKSkgeworCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCBwKTsKKwkJfQorCQlmcmVlKGJ1Zik7CisJfQorCWZjbG9zZShmcCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZGRfc3RyaW5nc1tdID0geworCSJcIiUwNy43X2F4IFwiIDE2LzEgXCIlMDNvIFwiIFwiXFxuXCIiLCAgIC8qIGIgKi8KKwkiXCIlMDcuN19heCBcIiAxNi8xIFwiJTNfYyBcIiBcIlxcblwiIiwgICAvKiBjICovCisJIlwiJTA3LjdfYXggXCIgOC8yIFwiICAlMDV1IFwiIFwiXFxuXCIiLCAgLyogZCAqLworCSJcIiUwNy43X2F4IFwiIDgvMiBcIiAlMDZvIFwiIFwiXFxuXCIiLCAgIC8qIG8gKi8KKwkiXCIlMDcuN19heCBcIiA4LzIgXCIgICAlMDR4IFwiIFwiXFxuXCIiLCAvKiB4ICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciBhZGRfZmlyc3RbXSBBTElHTjEgPSAiXCIlMDcuN19BeFxuXCIiOworCitzdGF0aWMgY29uc3QgY2hhciBoZXhkdW1wX29wdHNbXSBBTElHTjEgPSAiYmNkb3hDZTpmOm46czp2IiBJRl9GRUFUVVJFX0hFWERVTVBfUkVWRVJTRSgiUiIpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IHN1ZmZpeGVzW10gPSB7CisJeyAiYiIsIDUxMiB9LAorCXsgImsiLCAxMDI0IH0sCisJeyAibSIsIDEwMjQqMTAyNCB9LAorCXsgIiIsIDAgfQorfTsKKworaW50IGhleGR1bXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGhleGR1bXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZHVtcGVyX3QgKmR1bXBlciA9IGFsbG9jX2R1bXBlcigpOworCWNvbnN0IGNoYXIgKnA7CisJaW50IGNoOworI2lmIEVOQUJMRV9GRUFUVVJFX0hFWERVTVBfUkVWRVJTRQorCUZJTEUgKmZwOworCXNtYWxsaW50IHJkdW1wID0gMDsKKyNlbmRpZgorCisJaWYgKEVOQUJMRV9IRCAmJiAhYXBwbGV0X25hbWVbMl0pIHsgLyogd2UgYXJlICJoZCIgKi8KKwkJY2ggPSAnQyc7CisJCWdvdG8gaGRfYXBwbGV0OworCX0KKworCS8qIFdlIGNhbm5vdCB1c2UgZ2V0b3B0MzI6IGluIGhleGR1bXAgb3B0aW9ucyBhcmUgY3VtdWxhdGl2ZS4KKwkgKiBFLmcuICJoZXhkdW1wIC1DIC1DIGZpbGUiIHNob3VsZCBkdW1wIGVhY2ggbGluZSB0d2ljZSAqLworCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgaGV4ZHVtcF9vcHRzKSkgPiAwKSB7CisJCXAgPSBzdHJjaHIoaGV4ZHVtcF9vcHRzLCBjaCk7CisJCWlmICghcCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJaWYgKChwIC0gaGV4ZHVtcF9vcHRzKSA8IDUpIHsKKwkJCWJiX2R1bXBfYWRkKGR1bXBlciwgYWRkX2ZpcnN0KTsKKwkJCWJiX2R1bXBfYWRkKGR1bXBlciwgYWRkX3N0cmluZ3NbKGludCkocCAtIGhleGR1bXBfb3B0cyldKTsKKwkJfQorCQkvKiBTYXZlIGEgbGl0dGxlIGJpdCBvZiBzcGFjZSBiZWxvdyBieSBvbWl0dGluZyB0aGUgJ2Vsc2Uncy4gKi8KKwkJaWYgKGNoID09ICdDJykgeworIGhkX2FwcGxldDoKKwkJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA4LjhfQXhcblwiIik7CisJCQliYl9kdW1wX2FkZChkdW1wZXIsICJcIiUwOC44X2F4ICBcIiA4LzEgXCIlMDJ4IFwiIFwiICBcIiA4LzEgXCIlMDJ4IFwiICIpOworCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIgIHxcIiAxNi8xIFwiJV9wXCIgXCJ8XFxuXCIiKTsKKwkJfQorCQlpZiAoY2ggPT0gJ2UnKSB7CisJCQliYl9kdW1wX2FkZChkdW1wZXIsIG9wdGFyZyk7CisJCX0gLyogZWxzZSAqLworCQlpZiAoY2ggPT0gJ2YnKSB7CisJCQliYl9kdW1wX2FkZGZpbGUoZHVtcGVyLCBvcHRhcmcpOworCQl9IC8qIGVsc2UgKi8KKwkJaWYgKGNoID09ICduJykgeworCQkJZHVtcGVyLT5kdW1wX2xlbmd0aCA9IHhhdG9pX3Bvc2l0aXZlKG9wdGFyZyk7CisJCX0gLyogZWxzZSAqLworCQlpZiAoY2ggPT0gJ3MnKSB7IC8qIGNvbXBhdDogLXMgYWNjZXB0cyBoZXggbnVtYmVycyB0b28gKi8KKwkJCWR1bXBlci0+ZHVtcF9za2lwID0geHN0cnRvdWxfcmFuZ2Vfc2Z4KG9wdGFyZywgLypiYXNlOiovIDAsIC8qbG86Ki8gMCwgLypoaToqLyBMT05HX01BWCwgc3VmZml4ZXMpOworCQl9IC8qIGVsc2UgKi8KKwkJaWYgKGNoID09ICd2JykgeworCQkJZHVtcGVyLT5kdW1wX3ZmbGFnID0gQUxMOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFCisJCWlmIChjaCA9PSAnUicpIHsKKwkJCXJkdW1wID0gMTsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKCFkdW1wZXItPmZzaGVhZCkgeworCQliYl9kdW1wX2FkZChkdW1wZXIsIGFkZF9maXJzdCk7CisJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA3LjdfYXggXCIgOC8yIFwiJTA0eCBcIiBcIlxcblwiIik7CisJfQorCisJYXJndiArPSBvcHRpbmQ7CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFCisJcmV0dXJuIGJiX2R1bXBfZHVtcChkdW1wZXIsIGFyZ3YpOworI2Vsc2UKKwlpZiAoIXJkdW1wKSB7CisJCXJldHVybiBiYl9kdW1wX2R1bXAoZHVtcGVyLCBhcmd2KTsKKwl9CisKKwkvKiAtUjogcmV2ZXJzZSBvZiAnaGV4ZHVtcCAtQ3YnICovCisJZnAgPSBzdGRpbjsKKwlpZiAoISphcmd2KSB7CisJCWFyZ3YtLTsKKwkJZ290byBqdW1wX2luOworCX0KKworCWRvIHsKKwkJY2hhciAqYnVmOworCQlmcCA9IHhmb3Blbl9mb3JfcmVhZCgqYXJndik7CisganVtcF9pbjoKKwkJd2hpbGUgKChidWYgPSB4bWFsbG9jX2ZnZXRsaW5lKGZwKSkgIT0gTlVMTCkgeworCQkJcCA9IGJ1ZjsKKwkJCXdoaWxlICgxKSB7CisJCQkJLyogc2tpcCBhZGRyZXNzIG9yIHByZXZpb3VzIGJ5dGUgKi8KKwkJCQl3aGlsZSAoaXN4ZGlnaXQoKnApKSBwKys7CisJCQkJd2hpbGUgKCpwID09ICcgJykgcCsrOworCQkJCS8qICd8JyBjaGFyIHdpbGwgYnJlYWsgdGhlIGxpbmUgKi8KKwkJCQlpZiAoIWlzeGRpZ2l0KCpwKSB8fCBzc2NhbmYocCwgIiV4ICIsICZjaCkgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJcHV0Y2hhcihjaCk7CisJCQl9CisJCQlmcmVlKGJ1Zik7CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9od2Nsb2NrLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2h3Y2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRlMjliCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9od2Nsb2NrLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgaHdjbG9jayBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb2JlcnQgR3JpZWJsIDxncmllYmxAZ214LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIEFmdGVyIGxpYmJiLmgsIHNpbmNlIGl0IG5lZWRzIHN5cy90eXBlcy5oIG9uIHNvbWUgc3lzdGVtcyAqLworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSAicnRjXy5oIgorCisvKiBkaWZmIGNvZGUgaXMgZGlzYWJsZWQ6IGl0J3Mgbm90IHN5cy9odyBjbG9jayBkaWZmLCBpdCdzIHNvbWUgdXNlbGVzcworICogInRpbWUgYmV0d2VlbiBod2Nsb2NrIHdhcyBzdGFydGVkIGFuZCB3ZSBzYXcgQ01PUyB0aWNrIiBxdWFudGl0eS4KKyAqIEl0J3MgdXNlbGVzcyBzaW5jZSBod2Nsb2NrIGlzIHN0YXJ0ZWQgYXQgYSByYW5kb20gbW9tZW50LAorICogdGh1cyB0aGUgcXVhbnRpdHkgaXMgYWxzbyByYW5kb20sIHVzZWxlc3MuIFNob3dpbmcgMC4wMDAwMDAgZG9lcyBub3QKKyAqIGRlcHJpdmUgdXMgZnJvbSBhbnkgdXNlZnVsIGluZm8uCisgKgorICogU0hPV19IV0NMT0NLX0RJRkYgY29kZSBpbiB0aGlzIGZpbGUgc2hvd3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzeXN0ZW0KKyAqIGFuZCBodyBjbG9jay4gSXQgaXMgdXNlZnVsLCBidXQgbm90IGNvbXBhdGlibGUgd2l0aCBzdGFuZGFyZCBod2Nsb2NrLgorICogVGh1cyBkaXNhYmxlZC4KKyAqLworI2RlZmluZSBTSE9XX0hXQ0xPQ0tfRElGRiAwCisKKworI2lmICFTSE9XX0hXQ0xPQ0tfRElGRgorIyBkZWZpbmUgcmVhZF9ydGMocHBfcnRjbmFtZSwgc3lzX3R2LCB1dGMpIHJlYWRfcnRjKHBwX3J0Y25hbWUsIHV0YykKKyNlbmRpZgorc3RhdGljIHRpbWVfdCByZWFkX3J0Yyhjb25zdCBjaGFyICoqcHBfcnRjbmFtZSwgc3RydWN0IHRpbWV2YWwgKnN5c190diwgaW50IHV0YykKK3sKKwlzdHJ1Y3QgdG0gdG1fdGltZTsKKwlpbnQgZmQ7CisKKwlmZCA9IHJ0Y194b3BlbihwcF9ydGNuYW1lLCBPX1JET05MWSk7CisKKwlydGNfcmVhZF90bSgmdG1fdGltZSwgZmQpOworCisjaWYgU0hPV19IV0NMT0NLX0RJRkYKKwl7CisJCWludCBiZWZvcmUgPSB0bV90aW1lLnRtX3NlYzsKKwkJd2hpbGUgKDEpIHsKKwkJCXJ0Y19yZWFkX3RtKCZ0bV90aW1lLCBmZCk7CisJCQlnZXR0aW1lb2ZkYXkoc3lzX3R2LCBOVUxMKTsKKwkJCWlmIChiZWZvcmUgIT0gdG1fdGltZS50bV9zZWMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoZmQpOworCisJcmV0dXJuIHJ0Y190bTJ0aW1lKCZ0bV90aW1lLCB1dGMpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2Nsb2NrKGNvbnN0IGNoYXIgKipwcF9ydGNuYW1lLCBpbnQgdXRjKQoreworI2lmIFNIT1dfSFdDTE9DS19ESUZGCisJc3RydWN0IHRpbWV2YWwgc3lzX3R2OworI2VuZGlmCisJdGltZV90IHQgPSByZWFkX3J0YyhwcF9ydGNuYW1lLCAmc3lzX3R2LCB1dGMpOworCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisJLyogU3RhbmRhcmQgaHdjbG9jayB1c2VzIGxvY2FsZS1zcGVjaWZpYyBvdXRwdXQgZm9ybWF0ICovCisJY2hhciBjcFs2NF07CisJc3RydWN0IHRtICpwdG0gPSBsb2NhbHRpbWUoJnQpOworCXN0cmZ0aW1lKGNwLCBzaXplb2YoY3ApLCAiJWMiLCBwdG0pOworI2Vsc2UKKwljaGFyICpjcCA9IGN0aW1lKCZ0KTsKKwlzdHJjaHJudWwoY3AsICdcbicpWzBdID0gJ1wwJzsKKyNlbmRpZgorCisjaWYgIVNIT1dfSFdDTE9DS19ESUZGCisJcHJpbnRmKCIlcyAgMC4wMDAwMDAgc2Vjb25kc1xuIiwgY3ApOworI2Vsc2UKKwl7CisJCWxvbmcgZGlmZiA9IHN5c190di50dl9zZWMgLSB0OworCQlpZiAoZGlmZiA8IDAgLyomJiB0di50dl91c2VjICE9IDAqLykgeworCQkJLyogV2h5IHdlIG5lZWQgZGlmZisrPyAqLworCQkJLyogZGlmZiA+PSAwIGlzIG9rOiB8IGRpZmYgPCAwLCBjYW4ndCBqdXN0IHVzZSB0di50dl91c2VjOiAqLworCQkJLyogICA0NS41MjA4MjAgICAgICB8ICAgNDMuNTIwODIwICovCisJCQkvKiAtIDQ0LjAwMDAwMCAgICAgIHwgLSA0NS4wMDAwMDAgKi8KKwkJCS8qID0gIDEuNTIwODIwICAgICAgfCA9IC0xLjQ3OTE4MCwgbm90IC0yLjUyMDgyMCEgKi8KKwkJCWRpZmYrKzsKKwkJCS8qIFNob3VsZCBiZSAxMDAwMDAwIC0gdHYudHZfdXNlYywgYnV0IHRoZW4gd2UgbXVzdCBjaGVjayB0di50dl91c2VjICE9IDAgKi8KKwkJCXN5c190di50dl91c2VjID0gOTk5OTk5IC0gc3lzX3R2LnR2X3VzZWM7CisJCX0KKwkJcHJpbnRmKCIlcyAgJWxkLiUwNmx1IHNlY29uZHNcbiIsIGNwLCBkaWZmLCAodW5zaWduZWQgbG9uZylzeXNfdHYudHZfdXNlYyk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHRvX3N5c19jbG9jayhjb25zdCBjaGFyICoqcHBfcnRjbmFtZSwgaW50IHV0YykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgdGltZXpvbmUgdHo7CisKKwl0ei50el9taW51dGVzd2VzdCA9IHRpbWV6b25lLzYwIC0gNjAqZGF5bGlnaHQ7CisJdHoudHpfZHN0dGltZSA9IDA7CisKKwl0di50dl9zZWMgPSByZWFkX3J0YyhwcF9ydGNuYW1lLCBOVUxMLCB1dGMpOworCXR2LnR2X3VzZWMgPSAwOworCWlmIChzZXR0aW1lb2ZkYXkoJnR2LCAmdHopKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHRpbWVvZmRheSIpOworfQorCitzdGF0aWMgdm9pZCBmcm9tX3N5c19jbG9jayhjb25zdCBjaGFyICoqcHBfcnRjbmFtZSwgaW50IHV0YykKK3sKKyNpZiAxCisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IHRtIHRtX3RpbWU7CisJaW50IHJ0YzsKKworCXJ0YyA9IHJ0Y194b3BlbihwcF9ydGNuYW1lLCBPX1dST05MWSk7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJLyogUHJlcGFyZSB0bV90aW1lICovCisJaWYgKHNpemVvZih0aW1lX3QpID09IHNpemVvZih0di50dl9zZWMpKSB7CisJCWlmICh1dGMpCisJCQlnbXRpbWVfcigodGltZV90KikmdHYudHZfc2VjLCAmdG1fdGltZSk7CisJCWVsc2UKKwkJCWxvY2FsdGltZV9yKCh0aW1lX3QqKSZ0di50dl9zZWMsICZ0bV90aW1lKTsKKwl9IGVsc2UgeworCQl0aW1lX3QgdCA9IHR2LnR2X3NlYzsKKwkJaWYgKHV0YykKKwkJCWdtdGltZV9yKCZ0LCAmdG1fdGltZSk7CisJCWVsc2UKKwkJCWxvY2FsdGltZV9yKCZ0LCAmdG1fdGltZSk7CisJfQorI2Vsc2UKKy8qIEJsb2F0ZWQgY29kZSB3aGljaCB0cmllcyB0byBzZXQgaHcgY2xvY2sgd2l0aCBiZXR0ZXIgcHJlY2lzaW9uLgorICogT24geDg2LCBldmVuIHRob3VnaCBjb2RlIGRvZXMgc2V0IGh3IGNsb2NrIHdpdGhpbiA8MW1zIG9mIGV4YWN0CisgKiB3aG9sZSBzZWNvbmRzLCBhcHBhcmVudGx5IGh3IGNsb2NrIChhdCBsZWFzdCBvbiBzb21lIG1hY2hpbmVzKQorICogZG9lc24ndCByZXNldCBpbnRlcm5hbCBmcmFjdGlvbmFsIHNlY29uZHMgdG8gMCwKKyAqIG1ha2luZyBhbGwgdGhpcyBhIHBvaW50bGVzcyBleGNlcmNpc2UuCisgKi8KKwkvKiBJZiB3ZSBzZWUgdGhhdCB3ZSBhcmUgTiB1c2VjIGF3YXkgZnJvbSB3aG9sZSBzZWNvbmQsCisJICogd2UnbGwgc2xlZXAgZm9yIE4tQURKIHVzZWNzLiBBREogY29ycmVjdHMgZm9yIHRoZSBmYWN0CisJICogdGhhdCBDUFUgaXMgbm90IGluZmluaXRlbHkgZmFzdC4KKwkgKiBPbiBpbmZpbml0ZWx5IGZhc3QgQ1BVLCBuZXh0IHdha2V1cCB3b3VsZCBiZQorCSAqIG9uIChleGFjdGx5X25leHRfd2hvbGVfc2Vjb25kIC0gQURKKS4gT24gcmVhbCBDUFVzLAorCSAqIHRoaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgdGltZSBhbmQgd2hvbGUgc2Vjb25kCisJICogaXMgbGVzcyB0aGFuIEFESiAoYXNzdW1pbmcgc3lzdGVtIGlzbid0IGhlYXZpbHkgbG9hZGVkKS4KKwkgKi8KKwkvKiBTbWFsbCB2YWx1ZSBvZiAyNTZ1cyBnaXZlcyB2ZXJ5IHByZWNpc2Ugc3luYyBmb3IgMisgR0h6IENQVXMuCisJICogU2xvd2VyIENQVXMgd2lsbCBmYWlsIHRvIHN5bmMgYW5kIHdpbGwgZ28gdG8gYmlnZ2VyCisJICogQURKIHZhbHVlcy4gcWVtdS1lbXVsYXRlZCBhcm12NHRsIHdpdGggfjEwMCBNSHoKKwkgKiBwZXJmb3JtYW5jZSBlbmRzIHVwIHVzaW5nIEFESiB+PSA0KjEwMjQgYW5kIGl0IHRha2VzCisJICogMisgc2VjcyAoMiB0cmllcyB3aXRoIHN1Y2Nlc3NpdmVseSBsYXJnZXIgQURKKQorCSAqIHRvIHN5bmMuIEV2ZW4gc3RyYWNlZCBvbmUgb24gdGhlIHNhbWUgcWVtdSAodmVyeSBzbG93KQorCSAqIHRha2VzIG9ubHkgNCB0cmllcy4KKwkgKi8KKyNkZWZpbmUgVFdFQUtfVVNFQyAyNTYKKwl1bnNpZ25lZCBhZGogPSBUV0VBS19VU0VDOworCXN0cnVjdCB0bSB0bV90aW1lOworCXN0cnVjdCB0aW1ldmFsIHR2OworCWludCBydGMgPSBydGNfeG9wZW4ocHBfcnRjbmFtZSwgT19XUk9OTFkpOworCisJLyogVHJ5IHRvIGNhdGNoIHRoZSBtb21lbnQgd2hlbiB3aG9sZSBzZWNvbmQgaXMgY2xvc2UgKi8KKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCByZW1fdXNlYzsKKwkJdGltZV90IHQ7CisKKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKwkJdCA9IHR2LnR2X3NlYzsKKwkJcmVtX3VzZWMgPSAxMDAwMDAwIC0gdHYudHZfdXNlYzsKKwkJaWYgKHJlbV91c2VjIDwgYWRqKSB7CisJCQkvKiBDbG9zZSBlbm91Z2ggKi8KKyBzbWFsbF9yZW06CisJCQl0Kys7CisJCX0KKworCQkvKiBQcmVwYXJlIHRtX3RpbWUgZnJvbSB0ICovCisJCWlmICh1dGMpCisJCQlnbXRpbWVfcigmdCwgJnRtX3RpbWUpOyAvKiBtYXkgcmVhZCAvZXRjL3h4eCAoaXQgdGFrZXMgdGltZSkgKi8KKwkJZWxzZQorCQkJbG9jYWx0aW1lX3IoJnQsICZ0bV90aW1lKTsgLyogc2FtZSAqLworCisJCWlmIChhZGogPj0gMzIqMTAyNCkgeworCQkJYnJlYWs7IC8qIDMyIG1zIGRpZmYgYW5kIHN0aWxsIG5vIGx1Y2s/PyBnaXZlIHVwIHRyeWluZyB0byBzeW5jICovCisJCX0KKworCQkvKiBnbXRpbWUvbG9jYWx0aW1lIHRvb2sgc29tZSB0aW1lLCByZS1nZXQgY3VyIHRpbWUgKi8KKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKwkJaWYgKHR2LnR2X3NlYyA8IHQgLyogd2UgYXJlIHN0aWxsIGluIG9sZCBzZWNvbmQgKi8KKwkJIHx8ICh0di50dl9zZWMgPT0gdCAmJiB0di50dl91c2VjIDwgYWRqKSAvKiBub3QgdG9vIGZhciBpbnRvIG5leHQgc2Vjb25kICovCisJCSkgeworCQkJYnJlYWs7IC8qIGdvb2QsIHdlIGFyZSBpbiBzeW5jISAqLworCQl9CisKKwkJcmVtX3VzZWMgPSAxMDAwMDAwIC0gdHYudHZfdXNlYzsKKwkJaWYgKHJlbV91c2VjIDwgYWRqKSB7CisJCQl0ID0gdHYudHZfc2VjOworCQkJZ290byBzbWFsbF9yZW07IC8qIGFscmVhZHkgY2xvc2UgdG8gbmV4dCBzZWMsIGRvbid0IHNsZWVwICovCisJCX0KKworCQkvKiBUcnkgdG8gc3luYyB1cCBieSBzbGVlcGluZyAqLworCQl1c2xlZXAocmVtX3VzZWMgLSBhZGopOworCisJCS8qIEp1bXAgdG8gMW1zIGRpZmYsIHRoZW4gaW5jcmVhc2UgZmFzdCAoeDIpOiBFVkVSWSBsb29wCisJCSAqIHRha2VzIH4xIHNlYywgcGVvcGxlIHdvbid0IGxpa2Ugc2xvd2x5IGNvbnZlcmdpbmcgY29kZSBoZXJlIQorCQkgKi8KKwkvL2JiX2Vycm9yX21zZygiYWRqOiVkIHR2LnR2X3VzZWM6JWQiLCBhZGosIChpbnQpdHYudHZfdXNlYyk7CisJCWlmIChhZGogPCA1MTIpCisJCQlhZGogPSA1MTI7CisJCS8qIC4uLiBhbmQgaWYgbGFzdCAib3ZlcnNob290IiBkb2VzIG5vdCBsb29rIGluc2FuZWx5IGJpZywKKwkJICoganVzdCB1c2UgaXQgYXMgYWRqIGluY3JlbWVudC4gVGhpcyBtYWtlcyBjb252ZXJnZW5jZSBmYXN0ZXIuCisJCSAqLworCQlpZiAodHYudHZfdXNlYyA8IGFkaiAqIDgpIHsKKwkJCWFkaiArPSB0di50dl91c2VjOworCQkJY29udGludWU7CisJCX0KKwkJYWRqICo9IDI7CisJfQorCS8qIERlYnVnIGFpZCB0byBmaW5kICJvcHRpbWFsIiBUV0VBS19VU0VDIHdpdGggbmVhcmx5IGV4YWN0IHN5bmMuCisJICogTG9vayBmb3IgYSB2YWx1ZSB3aGljaCBtYWtlcyB0dl91c2VjIGNsb3NlIHRvIDk5OTk5OSBvciAwLgorCSAqIEZvciAyLjIwR0h6IEludGVsIENvcmUgMjogb3B0aW1hbCBUV0VBS19VU0VDIH49IDIwMAorCSAqLworCS8vYmJfZXJyb3JfbXNnKCJ0di50dl91c2VjOiVkIiwgKGludCl0di50dl91c2VjKTsKKyNlbmRpZgorCisJdG1fdGltZS50bV9pc2RzdCA9IDA7CisJeGlvY3RsKHJ0YywgUlRDX1NFVF9USU1FLCAmdG1fdGltZSk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKHJ0Yyk7Cit9CisKKy8qCisgKiBBdCBzeXN0ZW0gYm9vdCwga2VybmVsIG1heSBzZXQgc3lzdGVtIHRpbWUgZnJvbSBSVEMsCisgKiBidXQgaXQga25vd3Mgbm90aGluZyBhYm91dCB0aW1lem9uZXMuIElmIFJUQyBpcyBpbiBsb2NhbCB0aW1lLAorICogdGhlbiBzeXN0ZW0gdGltZSBpcyB3cm9uZyAtIGl0IGlzIG9mZnNldCBieSB0aW1lem9uZS4KKyAqIFRoaXMgb3B0aW9uIGNvcnJlY3RzIHN5c3RlbSB0aW1lIGlmIFJUQyBpcyBpbiBsb2NhbCB0aW1lLAorICogYW5kIChhbHdheXMpIHNldHMgaW4ta2VybmVsIHRpbWV6b25lLgorICoKKyAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRlIG9wdGlvbiB0byAtLWhjdG9zeXMgdGhhdCBkb2VzIG5vdCByZWFkIHRoZQorICogaGFyZHdhcmUgY2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIHNldF9zeXN0ZW1fY2xvY2tfdGltZXpvbmUoaW50IHV0YykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgdG0gKmJyb2tlbjsKKwlzdHJ1Y3QgdGltZXpvbmUgdHo7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlicm9rZW4gPSBsb2NhbHRpbWUoJnR2LnR2X3NlYyk7CisJdHoudHpfbWludXRlc3dlc3QgPSB0aW1lem9uZSAvIDYwOworCWlmIChicm9rZW4tPnRtX2lzZHN0KQorCQl0ei50el9taW51dGVzd2VzdCAtPSA2MDsKKwl0ei50el9kc3R0aW1lID0gMDsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlpZiAoIXV0YykKKwkJdHYudHZfc2VjICs9IHR6LnR6X21pbnV0ZXN3ZXN0ICogNjA7CisJaWYgKHNldHRpbWVvZmRheSgmdHYsICZ0eikpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0dGltZW9mZGF5Iik7Cit9CisKKy8vdXNhZ2U6I2RlZmluZSBod2Nsb2NrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgICAiWy1yfC0tc2hvd10gWy1zfC0taGN0b3N5c10gWy13fC0tc3lzdG9oY10gWy10fC0tc3lzdHpdIgorLy91c2FnZTogICAgICAgIiBbLWx8LS1sb2NhbHRpbWVdIFstdXwtLXV0Y10iCisvL3VzYWdlOiAgICAgICAiIFstZnwtLXJ0YyBGSUxFXSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICAgIlstcl0gWy1zXSBbLXddIFstdF0gWy1sXSBbLXVdIFstZiBGSUxFXSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2RlZmluZSBod2Nsb2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUXVlcnkgYW5kIHNldCBoYXJkd2FyZSBjbG9jayAoUlRDKVxuIgorLy91c2FnZTogICAgICJcbgktcglTaG93IGhhcmR3YXJlIGNsb2NrIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1zCVNldCBzeXN0ZW0gdGltZSBmcm9tIGhhcmR3YXJlIGNsb2NrIgorLy91c2FnZTogICAgICJcbgktdwlTZXQgaGFyZHdhcmUgY2xvY2sgZnJvbSBzeXN0ZW0gdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJU2V0IGluLWtlcm5lbCB0aW1lem9uZSwgY29ycmVjdCBzeXN0ZW0gdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JCWlmIGhhcmR3YXJlIGNsb2NrIGlzIGluIGxvY2FsIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS11CUFzc3VtZSBoYXJkd2FyZSBjbG9jayBpcyBrZXB0IGluIFVUQyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJQXNzdW1lIGhhcmR3YXJlIGNsb2NrIGlzIGtlcHQgaW4gbG9jYWwgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgRklMRQlVc2Ugc3BlY2lmaWVkIGRldmljZSAoZS5nLiAvZGV2L3J0YzIpIgorCisjZGVmaW5lIEhXQ0xPQ0tfT1BUX0xPQ0FMVElNRSAgIDB4MDEKKyNkZWZpbmUgSFdDTE9DS19PUFRfVVRDICAgICAgICAgMHgwMgorI2RlZmluZSBIV0NMT0NLX09QVF9TSE9XICAgICAgICAweDA0CisjZGVmaW5lIEhXQ0xPQ0tfT1BUX0hDVE9TWVMgICAgIDB4MDgKKyNkZWZpbmUgSFdDTE9DS19PUFRfU1lTVE9IQyAgICAgMHgxMAorI2RlZmluZSBIV0NMT0NLX09QVF9TWVNUWiAgICAgICAweDIwCisjZGVmaW5lIEhXQ0xPQ0tfT1BUX1JUQ0ZJTEUgICAgIDB4NDAKKworaW50IGh3Y2xvY2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGh3Y2xvY2tfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnJ0Y25hbWUgPSBOVUxMOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgdXRjOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciBod2Nsb2NrX2xvbmdvcHRzW10gQUxJR04xID0KKwkJImxvY2FsdGltZVwwIiBOb19hcmd1bWVudCAibCIgLyogc2hvcnQgb3B0IGlzIG5vbi1zdGFuZGFyZCAqLworCQkidXRjXDAiICAgICAgIE5vX2FyZ3VtZW50ICJ1IgorCQkic2hvd1wwIiAgICAgIE5vX2FyZ3VtZW50ICJyIgorCQkiaGN0b3N5c1wwIiAgIE5vX2FyZ3VtZW50ICJzIgorCQkic3lzdG9oY1wwIiAgIE5vX2FyZ3VtZW50ICJ3IgorCQkic3lzdHpcMCIgICAgIE5vX2FyZ3VtZW50ICJ0IiAvKiBzaG9ydCBvcHQgaXMgbm9uLXN0YW5kYXJkICovCisJCSJydGNcMCIgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImYiCisJCTsKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gaHdjbG9ja19sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gInItLXdzdDp3LS1yc3Q6cy0td3J0OnQtLXJzdzpsLS11OnUtLWwiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJsdXJzd3RmOiIsICZydGNuYW1lKTsKKworCS8qIElmIC11IG9yIC1sIHdhc24ndCBnaXZlbiBjaGVjayBpZiB3ZSBhcmUgdXNpbmcgdXRjICovCisJaWYgKG9wdCAmIChIV0NMT0NLX09QVF9VVEMgfCBIV0NMT0NLX09QVF9MT0NBTFRJTUUpKQorCQl1dGMgPSAob3B0ICYgSFdDTE9DS19PUFRfVVRDKTsKKwllbHNlCisJCXV0YyA9IHJ0Y19hZGp0aW1lX2lzX3V0YygpOworCisJaWYgKG9wdCAmIEhXQ0xPQ0tfT1BUX0hDVE9TWVMpCisJCXRvX3N5c19jbG9jaygmcnRjbmFtZSwgdXRjKTsKKwllbHNlIGlmIChvcHQgJiBIV0NMT0NLX09QVF9TWVNUT0hDKQorCQlmcm9tX3N5c19jbG9jaygmcnRjbmFtZSwgdXRjKTsKKwllbHNlIGlmIChvcHQgJiBIV0NMT0NLX09QVF9TWVNUWikKKwkJc2V0X3N5c3RlbV9jbG9ja190aW1lem9uZSh1dGMpOworCWVsc2UKKwkJLyogZGVmYXVsdCBIV0NMT0NLX09QVF9TSE9XICovCisJCXNob3dfY2xvY2soJnJ0Y25hbWUsIHV0Yyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvaXBjcm0uYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvaXBjcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQwNTBjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9pcGNybS5jCkBAIC0wLDAgKzEsMjI3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpcGNybS5jIC0gdXRpbGl0eSB0byBhbGxvdyByZW1vdmFsIG9mIElQQyBvYmplY3RzIGFuZCBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogMDEgU2VwdCAyMDA0IC0gUm9kbmV5IFJhZGZvcmQgPHJyYWRmb3JkQG1pbmRzcHJpbmcuY29tPgorICogQWRhcHRlZCBmb3IgYnVzeWJveCBmcm9tIHV0aWwtbGludXgtMi4xMmEuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaXBjcm1fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstTVFTIGtleV0gWy1tcXMgaWRdIgorLy91c2FnZTojZGVmaW5lIGlwY3JtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVXBwZXItY2FzZSBvcHRpb25zIE1RUyByZW1vdmUgYW4gb2JqZWN0IGJ5IHNobWtleSB2YWx1ZS5cbiIKKy8vdXNhZ2U6ICAgICAgICJMb3dlci1jYXNlIG9wdGlvbnMgcmVtb3ZlIGFuIG9iamVjdCBieSBzaG1pZCB2YWx1ZS5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW1NCVJlbW92ZSBtZW1vcnkgc2VnbWVudCBhZnRlciBsYXN0IGRldGFjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLXFRCVJlbW92ZSBtZXNzYWdlIHF1ZXVlIgorLy91c2FnZTogICAgICJcbgktc1MJUmVtb3ZlIHNlbWFwaG9yZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLHNlbX0uaD4gZm9yIHNlbWN0bCgpICovCisvKiBYL09QRU4gdGVsbHMgdXMgdG8gdXNlIDxzeXMve3R5cGVzLGlwYyxtc2d9Lmg+IGZvciBtc2djdGwoKSAqLworI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2htLmg+CisjaW5jbHVkZSA8c3lzL21zZy5oPgorI2luY2x1ZGUgPHN5cy9zZW0uaD4KKworI2lmIGRlZmluZWQoX19HTlVfTElCUkFSWV9fKSAmJiAhZGVmaW5lZChfU0VNX1NFTVVOX1VOREVGSU5FRCkKKy8qIHVuaW9uIHNlbXVuIGlzIGRlZmluZWQgYnkgaW5jbHVkaW5nIDxzeXMvc2VtLmg+ICovCisjZWxzZQorLyogYWNjb3JkaW5nIHRvIFgvT1BFTiB3ZSBoYXZlIHRvIGRlZmluZSBpdCBvdXJzZWx2ZXMgKi8KK3VuaW9uIHNlbXVuIHsKKwlpbnQgdmFsOworCXN0cnVjdCBzZW1pZF9kcyAqYnVmOworCXVuc2lnbmVkIHNob3J0ICphcnJheTsKKwlzdHJ1Y3Qgc2VtaW5mbyAqX19idWY7Cit9OworI2VuZGlmCisKKyNkZWZpbmUgSVBDUk1fTEVHQUNZIDEKKworCisjaWYgSVBDUk1fTEVHQUNZCisKK3R5cGVkZWYgZW51bSB0eXBlX2lkIHsKKwlTSE0sCisJU0VNLAorCU1TRworfSB0eXBlX2lkOworCitzdGF0aWMgaW50IHJlbW92ZV9pZHModHlwZV9pZCB0eXBlLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIGlkOworCWludCBuYl9lcnJvcnMgPSAwOworCXVuaW9uIHNlbXVuIGFyZzsKKworCWFyZy52YWwgPSAwOworCisJd2hpbGUgKGFyZ3ZbMF0pIHsKKwkJaWQgPSBiYl9zdHJ0b3VsKGFyZ3ZbMF0sIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vIHx8IGlkID4gSU5UX01BWCkgeworCQkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIGlkOiAlcyIsIGFyZ3ZbMF0pOworCQkJbmJfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlpbnQgcmV0ID0gMDsKKwkJCWlmICh0eXBlID09IFNFTSkKKwkJCQlyZXQgPSBzZW1jdGwoaWQsIDAsIElQQ19STUlELCBhcmcpOworCQkJZWxzZSBpZiAodHlwZSA9PSBNU0cpCisJCQkJcmV0ID0gbXNnY3RsKGlkLCBJUENfUk1JRCwgTlVMTCk7CisJCQllbHNlIGlmICh0eXBlID09ICBTSE0pCisJCQkJcmV0ID0gc2htY3RsKGlkLCBJUENfUk1JRCwgTlVMTCk7CisKKwkJCWlmIChyZXQpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZW1vdmUgaWQgJXMiLCBhcmd2WzBdKTsKKwkJCQluYl9lcnJvcnMrKzsKKwkJCX0KKwkJfQorCQlhcmd2Kys7CisJfQorCisJcmV0dXJuIG5iX2Vycm9yczsKK30KKyNlbmRpZiAvKiBJUENSTV9MRUdBQ1kgKi8KKworCitpbnQgaXBjcm1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwY3JtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjOworCWludCBlcnJvciA9IDA7CisKKwkvKiBpZiB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB3aXRob3V0IHBhcmFtZXRlcnMsIGRvIG5vdGhpbmcgKi8KKwlpZiAoYXJnYyA9PSAxKQorCQlyZXR1cm4gMDsKKyNpZiBJUENSTV9MRUdBQ1kKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlIGNvbW1hbmQgaXMgYmVpbmcgaW52b2tlZCBpbiB0aGUgb2xkIHdheSBpZiBzbworCSAgIHRoZW4gcnVuIHRoZSBvbGQgY29kZS4gVmFsaWQgY29tbWFuZHMgYXJlIG1zZywgc2htLCBzZW0uICovCisJeworCQl0eXBlX2lkIHdoYXQgPSAwOyAvKiBzaWxlbmNlIGdjYyAqLworCQljaGFyIHc7CisKKwkJdyA9IGFyZ3ZbMV1bMF07CisJCWlmICggKCh3ID09ICdtJyAmJiBhcmd2WzFdWzFdID09ICdzJyAmJiBhcmd2WzFdWzJdID09ICdnJykKKwkJICAgICAgIHx8IChhcmd2WzFdWzBdID09ICdzJworCQkgICAgICAgICAgICYmICgodyA9IGFyZ3ZbMV1bMV0pID09ICdoJyB8fCB3ID09ICdlJykKKwkJICAgICAgICAgICAmJiBhcmd2WzFdWzJdID09ICdtJykKKwkJICAgICApICYmIGFyZ3ZbMV1bM10gPT0gJ1wwJworCQkpIHsKKwkJCWlmIChhcmdjIDwgMykKKwkJCQliYl9zaG93X3VzYWdlKCk7CisKKwkJCWlmICh3ID09ICdoJykKKwkJCQl3aGF0ID0gU0hNOworCQkJZWxzZSBpZiAodyA9PSAnbScpCisJCQkJd2hhdCA9IE1TRzsKKwkJCWVsc2UgaWYgKHcgPT0gJ2UnKQorCQkJCXdoYXQgPSBTRU07CisKKwkJCWlmIChyZW1vdmVfaWRzKHdoYXQsICZhcmd2WzJdKSkKKwkJCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfRkFJTFVSRSk7CisJCQlwcmludGYoInJlc291cmNlKHMpIGRlbGV0ZWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjZW5kaWYgLyogSVBDUk1fTEVHQUNZICovCisKKwkvKiBwcm9jZXNzIG5ldyBzeW50YXggdG8gY29uZm9ybSB3aXRoIFNZU1YgaXBjcm0gKi8KKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgInE6bTpzOlE6TTpTOmg/IikpICE9IC0xKSB7CisJCWludCByZXN1bHQ7CisJCWludCBpZCA9IDA7CisJCWludCBpc2tleSA9IGlzdXBwZXIoYyk7CisKKwkJLyogbmVlZGVkIHRvIGRlbGV0ZSBzZW1hcGhvcmVzICovCisJCXVuaW9uIHNlbXVuIGFyZzsKKworCQlhcmcudmFsID0gMDsKKworCQlpZiAoKGMgPT0gJz8nKSB8fCAoYyA9PSAnaCcpKSB7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKworCQkvKiB3ZSBkb24ndCBuZWVkIGNhc2UgaW5mb3JtYXRpb24gYW55IG1vcmUgKi8KKwkJYyA9IHRvbG93ZXIoYyk7CisKKwkJLyogbWFrZSBzdXJlIHRoZSBvcHRpb24gaXMgaW4gcmFuZ2U6IGFsbG93ZWQgYXJlIHEsIG0sIHMgKi8KKwkJaWYgKGMgIT0gJ3EnICYmIGMgIT0gJ20nICYmIGMgIT0gJ3MnKSB7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKworCQlpZiAoaXNrZXkpIHsKKwkJCS8qIGtleXMgYXJlIGluIGhleCBvciBkZWNpbWFsICovCisJCQlrZXlfdCBrZXkgPSB4c3RydG91bChvcHRhcmcsIDApOworCisJCQlpZiAoa2V5ID09IElQQ19QUklWQVRFKSB7CisJCQkJZXJyb3IrKzsKKwkJCQliYl9lcnJvcl9tc2coImlsbGVnYWwga2V5ICglcykiLCBvcHRhcmcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBjb252ZXJ0IGtleSB0byBpZCAqLworCQkJaWQgPSAoKGMgPT0gJ3EnKSA/IG1zZ2dldChrZXksIDApIDoKKwkJCQkgIChjID09ICdtJykgPyBzaG1nZXQoa2V5LCAwLCAwKSA6IHNlbWdldChrZXksIDAsIDApKTsKKworCQkJaWYgKGlkIDwgMCkgeworCQkJCWNvbnN0IGNoYXIgKmVycm1zZzsKKworCQkJCWVycm9yKys7CisJCQkJc3dpdGNoIChlcnJubykgeworCQkJCWNhc2UgRUFDQ0VTOgorCQkJCQllcnJtc2cgPSAicGVybWlzc2lvbiBkZW5pZWQgZm9yIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFSURSTToKKwkJCQkJZXJybXNnID0gImFscmVhZHkgcmVtb3ZlZCI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRU5PRU5UOgorCQkJCQllcnJtc2cgPSAiaW52YWxpZCI7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWVycm1zZyA9ICJ1bmtub3duIGVycm9yIGluIjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJiX2Vycm9yX21zZygiJXMgJXMgKCVzKSIsIGVycm1zZywgImtleSIsIG9wdGFyZyk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBpZHMgYXJlIGluIGRlY2ltYWwgKi8KKwkJCWlkID0geGF0b3VsKG9wdGFyZyk7CisJCX0KKworCQlyZXN1bHQgPSAoKGMgPT0gJ3EnKSA/IG1zZ2N0bChpZCwgSVBDX1JNSUQsIE5VTEwpIDoKKwkJCQkgIChjID09ICdtJykgPyBzaG1jdGwoaWQsIElQQ19STUlELCBOVUxMKSA6CisJCQkJICBzZW1jdGwoaWQsIDAsIElQQ19STUlELCBhcmcpKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQljb25zdCBjaGFyICplcnJtc2c7CisJCQljb25zdCBjaGFyICpjb25zdCB3aGF0ID0gaXNrZXkgPyAia2V5IiA6ICJpZCI7CisKKwkJCWVycm9yKys7CisJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQljYXNlIEVBQ0NFUzoKKwkJCWNhc2UgRVBFUk06CisJCQkJZXJybXNnID0gInBlcm1pc3Npb24gZGVuaWVkIGZvciI7CisJCQkJYnJlYWs7CisJCQljYXNlIEVJTlZBTDoKKwkJCQllcnJtc2cgPSAiaW52YWxpZCI7CisJCQkJYnJlYWs7CisJCQljYXNlIEVJRFJNOgorCQkJCWVycm1zZyA9ICJhbHJlYWR5IHJlbW92ZWQiOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllcnJtc2cgPSAidW5rbm93biBlcnJvciBpbiI7CisJCQkJYnJlYWs7CisJCQl9CisJCQliYl9lcnJvcl9tc2coIiVzICVzICglcykiLCBlcnJtc2csIHdoYXQsIG9wdGFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCS8qIHByaW50IHVzYWdlIGlmIHdlIHN0aWxsIGhhdmUgc29tZSBhcmd1bWVudHMgbGVmdCBvdmVyICovCisJaWYgKG9wdGluZCAhPSBhcmdjKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBleGl0IHZhbHVlIHJlZmxlY3RzIHRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkICovCisJcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9pcGNzLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2lwY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTdkZjVlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9pcGNzLmMKQEAgLTAsMCArMSw2MzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlwY3MuYyAtLSBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbGxvY2F0ZWQgaXBjIHJlc291cmNlcy4KKyAqCisgKiAwMSBTZXB0IDIwMDQgLSBSb2RuZXkgUmFkZm9yZCA8cnJhZGZvcmRAbWluZHNwcmluZy5jb20+CisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGZyb20gdXRpbC1saW51eC0yLjEyYS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpcGNzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbWy1zbXFdIC1pIHNobWlkXSB8IFtbLWFzbXFdIFstdGNwbHVdXSIKKy8vdXNhZ2U6I2RlZmluZSBpcGNzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1pCVNob3cgc3BlY2lmaWMgcmVzb3VyY2UiCisvL3VzYWdlOiAgICAgIlxuUmVzb3VyY2Ugc3BlY2lmaWNhdGlvbjoiCisvL3VzYWdlOiAgICAgIlxuCS1tCVNoYXJlZCBtZW1vcnkgc2VnbWVudHMiCisvL3VzYWdlOiAgICAgIlxuCS1xCU1lc3NhZ2UgcXVldWVzIgorLy91c2FnZTogICAgICJcbgktcwlTZW1hcGhvcmUgYXJyYXlzIgorLy91c2FnZTogICAgICJcbgktYQlBbGwgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbk91dHB1dCBmb3JtYXQ6IgorLy91c2FnZTogICAgICJcbgktdAlUaW1lIgorLy91c2FnZTogICAgICJcbgktYwlDcmVhdG9yIgorLy91c2FnZTogICAgICJcbgktcAlQaWQiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpbWl0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJU3VtbWFyeSIKKworLyogWC9PUEVOIHRlbGxzIHVzIHRvIHVzZSA8c3lzL3t0eXBlcyxpcGMsc2VtfS5oPiBmb3Igc2VtY3RsKCkgKi8KKy8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLG1zZ30uaD4gZm9yIG1zZ2N0bCgpICovCisvKiBYL09QRU4gdGVsbHMgdXMgdG8gdXNlIDxzeXMve3R5cGVzLGlwYyxzaG19Lmg+IGZvciBzaG1jdGwoKSAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2VtLmg+CisjaW5jbHVkZSA8c3lzL21zZy5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBTSE1fREVTVCBhbmQgU0hNX0xPQ0tFRCBhcmUgZGVmaW5lZCBpbiBrZXJuZWwgaGVhZGVycywKKyAgIGJ1dCBpbnNpZGUgI2lmZGVmIF9fS0VSTkVMX18gLi4uICNlbmRpZiAqLworI2lmbmRlZiBTSE1fREVTVAorLyogc2htX21vZGUgdXBwZXIgYnl0ZSBmbGFncyAqLworI2RlZmluZSBTSE1fREVTVCAgICAgICAgMDEwMDAJLyogc2VnbWVudCB3aWxsIGJlIGRlc3Ryb3llZCBvbiBsYXN0IGRldGFjaCAqLworI2RlZmluZSBTSE1fTE9DS0VEICAgICAgMDIwMDAJLyogc2VnbWVudCB3aWxsIG5vdCBiZSBzd2FwcGVkICovCisjZW5kaWYKKworLyogRm9yIG9sZGVyIGtlcm5lbHMgdGhlIHNhbWUgaG9sZHMgZm9yIHRoZSBkZWZpbmVzIGJlbG93ICovCisjaWZuZGVmIE1TR19TVEFUCisjZGVmaW5lIE1TR19TVEFUCTExCisjZGVmaW5lIE1TR19JTkZPCTEyCisjZW5kaWYKKworI2lmbmRlZiBTSE1fU1RBVAorI2RlZmluZSBTSE1fU1RBVCAgICAgICAgMTMKKyNkZWZpbmUgU0hNX0lORk8gICAgICAgIDE0CitzdHJ1Y3Qgc2htX2luZm8geworCWludCB1c2VkX2lkczsKKwl1bnNpZ25lZCBsb25nIHNobV90b3Q7CQkvKiB0b3RhbCBhbGxvY2F0ZWQgc2htICovCisJdW5zaWduZWQgbG9uZyBzaG1fcnNzOwkJLyogdG90YWwgcmVzaWRlbnQgc2htICovCisJdW5zaWduZWQgbG9uZyBzaG1fc3dwOwkJLyogdG90YWwgc3dhcHBlZCBzaG0gKi8KKwl1bnNpZ25lZCBsb25nIHN3YXBfYXR0ZW1wdHM7CisJdW5zaWduZWQgbG9uZyBzd2FwX3N1Y2Nlc3NlczsKK307CisjZW5kaWYKKworI2lmbmRlZiBTRU1fU1RBVAorI2RlZmluZSBTRU1fU1RBVAkxOAorI2RlZmluZSBTRU1fSU5GTwkxOQorI2VuZGlmCisKKy8qIFNvbWUgdmVyc2lvbnMgb2YgbGliYyBvbmx5IGRlZmluZSBJUENfSU5GTyB3aGVuIF9fVVNFX0dOVSBpcyBkZWZpbmVkLiAqLworI2lmbmRlZiBJUENfSU5GTworI2RlZmluZSBJUENfSU5GTyAgICAgICAgMworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGUgbGFzdCBhcmcgb2Ygc2VtY3RsIGlzIGEgdW5pb24gc2VtdW4sIGJ1dCB3aGVyZSBpcyBpdCBkZWZpbmVkPworICAgWC9PUEVOIHRlbGxzIHVzIHRvIGRlZmluZSBpdCBvdXJzZWx2ZXMsIGJ1dCB1bnRpbCByZWNlbnRseQorICAgTGludXggaW5jbHVkZSBmaWxlcyB3b3VsZCBhbHNvIGRlZmluZSBpdC4gKi8KKyNpZiBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgJiYgIWRlZmluZWQoX1NFTV9TRU1VTl9VTkRFRklORUQpCisvKiB1bmlvbiBzZW11biBpcyBkZWZpbmVkIGJ5IGluY2x1ZGluZyA8c3lzL3NlbS5oPiAqLworI2Vsc2UKKy8qIGFjY29yZGluZyB0byBYL09QRU4gd2UgaGF2ZSB0byBkZWZpbmUgaXQgb3Vyc2VsdmVzICovCit1bmlvbiBzZW11biB7CisJaW50IHZhbDsKKwlzdHJ1Y3Qgc2VtaWRfZHMgKmJ1ZjsKKwl1bnNpZ25lZCBzaG9ydCAqYXJyYXk7CisJc3RydWN0IHNlbWluZm8gKl9fYnVmOworfTsKKyNlbmRpZgorCisvKiBYL09QRU4gKEphbiAxOTg3KSBkb2VzIG5vdCBkZWZpbmUgZmllbGRzIGtleSwgc2VxIGluIHN0cnVjdCBpcGNfcGVybTsKKyAgIGxpYmMgNC81IGRvZXMgbm90IG1lbnRpb24gc3RydWN0IGlwY190ZXJtIGF0IGFsbCwgYnV0IGluY2x1ZGVzCisgICA8bGludXgvaXBjLmg+LCB3aGljaCBkZWZpbmVzIGEgc3RydWN0IGlwY19wZXJtIHdpdGggc3VjaCBmaWVsZHMuCisgICBnbGliYy0xLjA5IGhhcyBubyBzdXBwb3J0IGZvciBzeXN2IGlwYy4KKyAgIGdsaWJjIDIgdXNlcyBfX2tleSwgX19zZXEgKi8KKyNpZiBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgJiYgX19HTlVfTElCUkFSWV9fID4gMQorI2RlZmluZSBLRVkgX19rZXkKKyNlbHNlCisjZGVmaW5lIEtFWSBrZXkKKyNlbmRpZgorCisjZGVmaW5lIExJTUlUUyAxCisjZGVmaW5lIFNUQVRVUyAyCisjZGVmaW5lIENSRUFUT1IgMworI2RlZmluZSBUSU1FIDQKKyNkZWZpbmUgUElEIDUKKworc3RhdGljIGNoYXIgZm9ybWF0OworCitzdGF0aWMgdm9pZCBwcmludF9wZXJtcyhpbnQgaWQsIHN0cnVjdCBpcGNfcGVybSAqaXBjcCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwlzdHJ1Y3QgZ3JvdXAgKmdyOworCisJcHJpbnRmKCIlLTEwZCAlLTEwbyIsIGlkLCBpcGNwLT5tb2RlICYgMDc3Nyk7CisKKwlwdyA9IGdldHB3dWlkKGlwY3AtPmN1aWQpOworCWlmIChwdykJcHJpbnRmKCIgJS0xMHMiLCBwdy0+cHdfbmFtZSk7CisJZWxzZQlwcmludGYoIiAlLTEwZCIsIGlwY3AtPmN1aWQpOworCWdyID0gZ2V0Z3JnaWQoaXBjcC0+Y2dpZCk7CisJaWYgKGdyKQlwcmludGYoIiAlLTEwcyIsIGdyLT5ncl9uYW1lKTsKKwllbHNlCXByaW50ZigiICUtMTBkIiwgaXBjcC0+Y2dpZCk7CisKKwlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CisJaWYgKHB3KQlwcmludGYoIiAlLTEwcyIsIHB3LT5wd19uYW1lKTsKKwllbHNlCXByaW50ZigiICUtMTBkIiwgaXBjcC0+dWlkKTsKKwlnciA9IGdldGdyZ2lkKGlwY3AtPmdpZCk7CisJaWYgKGdyKQlwcmludGYoIiAlLTEwc1xuIiwgZ3ItPmdyX25hbWUpOworCWVsc2UJcHJpbnRmKCIgJS0xMGRcbiIsIGlwY3AtPmdpZCk7Cit9CisKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZG9fc2htKHZvaWQpCit7CisJaW50IG1heGlkLCBzaG1pZCwgaWQ7CisJc3RydWN0IHNobWlkX2RzIHNobXNlZzsKKwlzdHJ1Y3Qgc2htX2luZm8gc2htX2luZm87CisJc3RydWN0IHNobWluZm8gc2htaW5mbzsKKwlzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmc2htc2VnLnNobV9wZXJtOworCXN0cnVjdCBwYXNzd2QgKnB3OworCisJbWF4aWQgPSBzaG1jdGwoMCwgU0hNX0lORk8sIChzdHJ1Y3Qgc2htaWRfZHMgKikgKHZvaWQgKikgJnNobV9pbmZvKTsKKwlpZiAobWF4aWQgPCAwKSB7CisJCXByaW50Zigia2VybmVsIG5vdCBjb25maWd1cmVkIGZvciAlc1xuIiwgInNoYXJlZCBtZW1vcnkiKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBMSU1JVFM6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJMaW1pdHMiKTsKKwkJaWYgKChzaG1jdGwoMCwgSVBDX0lORk8sIChzdHJ1Y3Qgc2htaWRfZHMgKikgKHZvaWQgKikgJnNobWluZm8pKSA8IDApCisJCQlyZXR1cm47CisJCS8qIGdsaWJjIDIuMS4zIGFuZCBhbGwgZWFybGllciBsaWJjJ3MgaGF2ZSBpbnRzIGFzIGZpZWxkcworCQkgICBvZiBzdHJ1Y3Qgc2htaW5mbzsgZ2xpYmMgMi4xLjkxIGhhcyB1bnNpZ25lZCBsb25nOyBhY2ggKi8KKwkJcHJpbnRmKCJtYXggbnVtYmVyIG9mIHNlZ21lbnRzID0gJWx1XG4iCisJCQkJICAibWF4IHNlZyBzaXplIChrYnl0ZXMpID0gJWx1XG4iCisJCQkJICAibWF4IHRvdGFsIHNoYXJlZCBtZW1vcnkgKHBhZ2VzKSA9ICVsdVxuIgorCQkJCSAgIm1pbiBzZWcgc2l6ZSAoYnl0ZXMpID0gJWx1XG4iLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHNobWluZm8uc2htbW5pLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcpIChzaG1pbmZvLnNobW1heCA+PiAxMCksCisJCQkJICAodW5zaWduZWQgbG9uZykgc2htaW5mby5zaG1hbGwsCisJCQkJICAodW5zaWduZWQgbG9uZykgc2htaW5mby5zaG1taW4pOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRVUzoKKwkJcHJpbnRmKCItLS0tLS0gU2hhcmVkIE1lbW9yeSAlcyAtLS0tLS0tLVxuIiwgIlN0YXR1cyIpOworCQlwcmludGYoCSAgInNlZ21lbnRzIGFsbG9jYXRlZCAlZFxuIgorCQkJCSAgInBhZ2VzIGFsbG9jYXRlZCAlbGRcbiIKKwkJCQkgICJwYWdlcyByZXNpZGVudCAgJWxkXG4iCisJCQkJICAicGFnZXMgc3dhcHBlZCAgICVsZFxuIgorCQkJCSAgIlN3YXAgcGVyZm9ybWFuY2U6ICVsZCBhdHRlbXB0c1x0JWxkIHN1Y2Nlc3Nlc1xuIiwKKwkJCQkgIHNobV9pbmZvLnVzZWRfaWRzLAorCQkJCSAgc2htX2luZm8uc2htX3RvdCwKKwkJCQkgIHNobV9pbmZvLnNobV9yc3MsCisJCQkJICBzaG1faW5mby5zaG1fc3dwLAorCQkJCSAgc2htX2luZm8uc3dhcF9hdHRlbXB0cywgc2htX2luZm8uc3dhcF9zdWNjZXNzZXMpOworCQlyZXR1cm47CisKKwljYXNlIENSRUFUT1I6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJTZWdtZW50IENyZWF0b3JzL093bmVycyIpOworCQlwcmludGYoCSAgIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJCSAgInNobWlkIiwgInBlcm1zIiwgImN1aWQiLCAiY2dpZCIsICJ1aWQiLCAiZ2lkIik7CisJCWJyZWFrOworCisJY2FzZSBUSU1FOgorCQlwcmludGYoIi0tLS0tLSBTaGFyZWQgTWVtb3J5ICVzIC0tLS0tLS0tXG4iLCAiQXR0YWNoL0RldGFjaC9DaGFuZ2UgVGltZXMiKTsKKwkJcHJpbnRmKAkgICIlLTEwcyAlLTEwcyAlLTIwcyAlLTIwcyAlLTIwc1xuIiwKKwkJCQkgICJzaG1pZCIsICJvd25lciIsICJhdHRhY2hlZCIsICJkZXRhY2hlZCIsICJjaGFuZ2VkIik7CisJCWJyZWFrOworCisJY2FzZSBQSUQ6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJDcmVhdG9yL0xhc3Qtb3AiKTsKKwkJcHJpbnRmKAkgICIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJCQkgICJzaG1pZCIsICJvd25lciIsICJjcGlkIiwgImxwaWQiKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIi0tLS0tLSBTaGFyZWQgTWVtb3J5ICVzIC0tLS0tLS0tXG4iLCAiU2VnbWVudHMiKTsKKwkJcHJpbnRmKAkgICIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEyc1xuIiwKKwkJCQkgICJrZXkiLCAic2htaWQiLCAib3duZXIiLCAicGVybXMiLCAiYnl0ZXMiLCAibmF0dGNoIiwKKwkJCQkgICJzdGF0dXMiKTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChpZCA9IDA7IGlkIDw9IG1heGlkOyBpZCsrKSB7CisJCXNobWlkID0gc2htY3RsKGlkLCBTSE1fU1RBVCwgJnNobXNlZyk7CisJCWlmIChzaG1pZCA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKGZvcm1hdCA9PSBDUkVBVE9SKSB7CisJCQlwcmludF9wZXJtcyhzaG1pZCwgaXBjcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CisJCXN3aXRjaCAoZm9ybWF0KSB7CisJCWNhc2UgVElNRToKKwkJCWlmIChwdykKKwkJCQlwcmludGYoIiUtMTBkICUtMTAuMTBzIiwgc2htaWQsIHB3LT5wd19uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtMTBkICUtMTBkIiwgc2htaWQsIGlwY3AtPnVpZCk7CisJCQkvKiBjdGltZSB1c2VzIHN0YXRpYyBidWZmZXI6IHVzZSBzZXBhcmF0ZSBjYWxscyAqLworCQkJcHJpbnRmKCIgJS0yMC4xNnMiLCBzaG1zZWcuc2htX2F0aW1lCisJCQkJCSAgPyBjdGltZSgmc2htc2VnLnNobV9hdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKwkJCXByaW50ZigiICUtMjAuMTZzIiwgc2htc2VnLnNobV9kdGltZQorCQkJCQkgID8gY3RpbWUoJnNobXNlZy5zaG1fZHRpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CisJCQlwcmludGYoIiAlLTIwLjE2c1xuIiwgc2htc2VnLnNobV9jdGltZQorCQkJCQkgID8gY3RpbWUoJnNobXNlZy5zaG1fY3RpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CisJCQlicmVhazsKKwkJY2FzZSBQSUQ6CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwLjEwcyIsIHNobWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwZCIsIHNobWlkLCBpcGNwLT51aWQpOworCQkJcHJpbnRmKCIgJS0xMGQgJS0xMGRcbiIsIHNobXNlZy5zaG1fY3BpZCwgc2htc2VnLnNobV9scGlkKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYoIjB4JTA4eCAiLCBpcGNwLT5LRVkpOworCQkJaWYgKHB3KQorCQkJCXByaW50ZigiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOworCQkJZWxzZQorCQkJCXByaW50ZigiJS0xMGQgJS0xMGQiLCBzaG1pZCwgaXBjcC0+dWlkKTsKKwkJCXByaW50ZigiICUtMTBvICUtMTBsdSAlLTEwbGQgJS02cyAlLTZzXG4iLCBpcGNwLT5tb2RlICYgMDc3NywKKwkJCQkJICAvKgorCQkJCQkgICAqIGVhcmxpZXI6IGludCwgQXVzdGluIGhhcyBzaXplX3QKKwkJCQkJICAgKi8KKwkJCQkJICAodW5zaWduZWQgbG9uZykgc2htc2VnLnNobV9zZWdzeiwKKwkJCQkJICAvKgorCQkJCQkgICAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKKwkJCQkJICAgKiBBdXN0aW4gaGFzIHNobWF0dF90CisJCQkJCSAgICovCisJCQkJCSAgKGxvbmcpIHNobXNlZy5zaG1fbmF0dGNoLAorCQkJCQkgIGlwY3AtPm1vZGUgJiBTSE1fREVTVCA/ICJkZXN0IiA6ICIgIiwKKwkJCQkJICBpcGNwLT5tb2RlICYgU0hNX0xPQ0tFRCA/ICJsb2NrZWQiIDogIiAiKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3N0YXRpYyBOT0lOTElORSB2b2lkIGRvX3NlbSh2b2lkKQoreworCWludCBtYXhpZCwgc2VtaWQsIGlkOworCXN0cnVjdCBzZW1pZF9kcyBzZW1hcnk7CisJc3RydWN0IHNlbWluZm8gc2VtaW5mbzsKKwlzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmc2VtYXJ5LnNlbV9wZXJtOworCXN0cnVjdCBwYXNzd2QgKnB3OworCXVuaW9uIHNlbXVuIGFyZzsKKworCWFyZy5hcnJheSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAodm9pZCAqKSAmc2VtaW5mbzsKKwltYXhpZCA9IHNlbWN0bCgwLCAwLCBTRU1fSU5GTywgYXJnKTsKKwlpZiAobWF4aWQgPCAwKSB7CisJCXByaW50Zigia2VybmVsIG5vdCBjb25maWd1cmVkIGZvciAlc1xuIiwgInNlbWFwaG9yZXMiKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBMSU1JVFM6CisJCXByaW50ZigiLS0tLS0tIFNlbWFwaG9yZSAlcyAtLS0tLS0tLVxuIiwgIkxpbWl0cyIpOworCQlhcmcuYXJyYXkgPSAodW5zaWduZWQgc2hvcnQgKikgKHZvaWQgKikgJnNlbWluZm87CS8qIGRhbW4gdW5pb24gKi8KKwkJaWYgKChzZW1jdGwoMCwgMCwgSVBDX0lORk8sIGFyZykpIDwgMCkKKwkJCXJldHVybjsKKwkJcHJpbnRmKCJtYXggbnVtYmVyIG9mIGFycmF5cyA9ICVkXG4iCisJCQkJICAibWF4IHNlbWFwaG9yZXMgcGVyIGFycmF5ID0gJWRcbiIKKwkJCQkgICJtYXggc2VtYXBob3JlcyBzeXN0ZW0gd2lkZSA9ICVkXG4iCisJCQkJICAibWF4IG9wcyBwZXIgc2Vtb3AgY2FsbCA9ICVkXG4iCisJCQkJICAic2VtYXBob3JlIG1heCB2YWx1ZSA9ICVkXG4iLAorCQkJCSAgc2VtaW5mby5zZW1tbmksCisJCQkJICBzZW1pbmZvLnNlbW1zbCwKKwkJCQkgIHNlbWluZm8uc2VtbW5zLCBzZW1pbmZvLnNlbW9wbSwgc2VtaW5mby5zZW12bXgpOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRVUzoKKwkJcHJpbnRmKCItLS0tLS0gU2VtYXBob3JlICVzIC0tLS0tLS0tXG4iLCAiU3RhdHVzIik7CisJCXByaW50ZigJICAidXNlZCBhcnJheXMgPSAlZFxuIgorCQkJCSAgImFsbG9jYXRlZCBzZW1hcGhvcmVzID0gJWRcbiIsCisJCQkJICBzZW1pbmZvLnNlbXVzeiwgc2VtaW5mby5zZW1hZW0pOworCQlyZXR1cm47CisKKwljYXNlIENSRUFUT1I6CisJCXByaW50ZigiLS0tLS0tIFNlbWFwaG9yZSAlcyAtLS0tLS0tLVxuIiwgIkFycmF5cyBDcmVhdG9ycy9Pd25lcnMiKTsKKwkJcHJpbnRmKAkgICIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJCQkgICJzZW1pZCIsICJwZXJtcyIsICJjdWlkIiwgImNnaWQiLCAidWlkIiwgImdpZCIpOworCQlicmVhazsKKworCWNhc2UgVElNRToKKwkJcHJpbnRmKCItLS0tLS0gU2hhcmVkIE1lbW9yeSAlcyAtLS0tLS0tLVxuIiwgIk9wZXJhdGlvbi9DaGFuZ2UgVGltZXMiKTsKKwkJcHJpbnRmKAkgICIlLThzICUtMTBzICUtMjYuMjRzICUtMjYuMjRzXG4iLAorCQkJCSAgInNobWlkIiwgIm93bmVyIiwgImxhc3Qtb3AiLCAibGFzdC1jaGFuZ2VkIik7CisJCWJyZWFrOworCisJY2FzZSBQSUQ6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCItLS0tLS0gU2VtYXBob3JlICVzIC0tLS0tLS0tXG4iLCAiQXJyYXlzIik7CisJCXByaW50ZigJICAiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCisJCQkJICAia2V5IiwgInNlbWlkIiwgIm93bmVyIiwgInBlcm1zIiwgIm5zZW1zIik7CisJCWJyZWFrOworCX0KKworCWZvciAoaWQgPSAwOyBpZCA8PSBtYXhpZDsgaWQrKykgeworCQlhcmcuYnVmID0gKHN0cnVjdCBzZW1pZF9kcyAqKSAmc2VtYXJ5OworCQlzZW1pZCA9IHNlbWN0bChpZCwgMCwgU0VNX1NUQVQsIGFyZyk7CisJCWlmIChzZW1pZCA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKGZvcm1hdCA9PSBDUkVBVE9SKSB7CisJCQlwcmludF9wZXJtcyhzZW1pZCwgaXBjcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CisJCXN3aXRjaCAoZm9ybWF0KSB7CisJCWNhc2UgVElNRToKKwkJCWlmIChwdykKKwkJCQlwcmludGYoIiUtOGQgJS0xMC4xMHMiLCBzZW1pZCwgcHctPnB3X25hbWUpOworCQkJZWxzZQorCQkJCXByaW50ZigiJS04ZCAlLTEwZCIsIHNlbWlkLCBpcGNwLT51aWQpOworCQkJLyogY3RpbWUgdXNlcyBzdGF0aWMgYnVmZmVyOiB1c2Ugc2VwYXJhdGUgY2FsbHMgKi8KKwkJCXByaW50ZigiICAlLTI2LjI0cyIsIHNlbWFyeS5zZW1fb3RpbWUKKwkJCQkJICA/IGN0aW1lKCZzZW1hcnkuc2VtX290aW1lKSA6ICJOb3Qgc2V0Iik7CisJCQlwcmludGYoIiAlLTI2LjI0c1xuIiwgc2VtYXJ5LnNlbV9jdGltZQorCQkJCQkgID8gY3RpbWUoJnNlbWFyeS5zZW1fY3RpbWUpIDogIk5vdCBzZXQiKTsKKwkJCWJyZWFrOworCQljYXNlIFBJRDoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYoIjB4JTA4eCAiLCBpcGNwLT5LRVkpOworCQkJaWYgKHB3KQorCQkJCXByaW50ZigiJS0xMGQgJS0xMC45cyIsIHNlbWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLTEwZCAlLTlkIiwgc2VtaWQsIGlwY3AtPnVpZCk7CisJCQlwcmludGYoIiAlLTEwbyAlLTEwbGRcbiIsIGlwY3AtPm1vZGUgJiAwNzc3LAorCQkJCQkgIC8qCisJCQkJCSAgICogZ2xpYmMtMi4xLjMgYW5kIGVhcmxpZXIgaGFzIHVuc2lnbmVkIHNob3J0OworCQkJCQkgICAqIGdsaWJjLTIuMS45MSBoYXMgdmFyaWF0aW9uIGJldHdlZW4KKwkJCQkJICAgKiB1bnNpZ25lZCBzaG9ydCBhbmQgdW5zaWduZWQgbG9uZworCQkJCQkgICAqIEF1c3RpbiBwcmVzY3JpYmVzIHVuc2lnbmVkIHNob3J0LgorCQkJCQkgICAqLworCQkJCQkgIChsb25nKSBzZW1hcnkuc2VtX25zZW1zKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3N0YXRpYyBOT0lOTElORSB2b2lkIGRvX21zZyh2b2lkKQoreworCWludCBtYXhpZCwgbXNxaWQsIGlkOworCXN0cnVjdCBtc3FpZF9kcyBtc2dxdWU7CisJc3RydWN0IG1zZ2luZm8gbXNnaW5mbzsKKwlzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmbXNncXVlLm1zZ19wZXJtOworCXN0cnVjdCBwYXNzd2QgKnB3OworCisJbWF4aWQgPSBtc2djdGwoMCwgTVNHX0lORk8sIChzdHJ1Y3QgbXNxaWRfZHMgKikgKHZvaWQgKikgJm1zZ2luZm8pOworCWlmIChtYXhpZCA8IDApIHsKKwkJcHJpbnRmKCJrZXJuZWwgbm90IGNvbmZpZ3VyZWQgZm9yICVzXG4iLCAibWVzc2FnZSBxdWV1ZXMiKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBMSU1JVFM6CisJCWlmICgobXNnY3RsKDAsIElQQ19JTkZPLCAoc3RydWN0IG1zcWlkX2RzICopICh2b2lkICopICZtc2dpbmZvKSkgPCAwKQorCQkJcmV0dXJuOworCQlwcmludGYoIi0tLS0tLSBNZXNzYWdlJXMgLS0tLS0tLS1cbiIsICJzOiBMaW1pdHMiKTsKKwkJcHJpbnRmKAkgICJtYXggcXVldWVzIHN5c3RlbSB3aWRlID0gJWRcbiIKKwkJCQkgICJtYXggc2l6ZSBvZiBtZXNzYWdlIChieXRlcykgPSAlZFxuIgorCQkJCSAgImRlZmF1bHQgbWF4IHNpemUgb2YgcXVldWUgKGJ5dGVzKSA9ICVkXG4iLAorCQkJCSAgbXNnaW5mby5tc2dtbmksIG1zZ2luZm8ubXNnbWF4LCBtc2dpbmZvLm1zZ21uYik7CisJCXJldHVybjsKKworCWNhc2UgU1RBVFVTOgorCQlwcmludGYoIi0tLS0tLSBNZXNzYWdlJXMgLS0tLS0tLS1cbiIsICJzOiBTdGF0dXMiKTsKKwkJcHJpbnRmKAkgICJhbGxvY2F0ZWQgcXVldWVzID0gJWRcbiIKKwkJCQkgICJ1c2VkIGhlYWRlcnMgPSAlZFxuIgorCQkJCSAgInVzZWQgc3BhY2UgPSAlZCBieXRlc1xuIiwKKwkJCQkgIG1zZ2luZm8ubXNncG9vbCwgbXNnaW5mby5tc2dtYXAsIG1zZ2luZm8ubXNndHFsKTsKKwkJcmV0dXJuOworCisJY2FzZSBDUkVBVE9SOgorCQlwcmludGYoIi0tLS0tLSBNZXNzYWdlJXMgLS0tLS0tLS1cbiIsICIgUXVldWVzOiBDcmVhdG9ycy9Pd25lcnMiKTsKKwkJcHJpbnRmKAkgICIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJCQkgICJtc3FpZCIsICJwZXJtcyIsICJjdWlkIiwgImNnaWQiLCAidWlkIiwgImdpZCIpOworCQlicmVhazsKKworCWNhc2UgVElNRToKKwkJcHJpbnRmKCItLS0tLS0gTWVzc2FnZSVzIC0tLS0tLS0tXG4iLCAiIFF1ZXVlcyBTZW5kL1JlY3YvQ2hhbmdlIFRpbWVzIik7CisJCXByaW50ZigJICAiJS04cyAlLTEwcyAlLTIwcyAlLTIwcyAlLTIwc1xuIiwKKwkJCQkgICJtc3FpZCIsICJvd25lciIsICJzZW5kIiwgInJlY3YiLCAiY2hhbmdlIik7CisJCWJyZWFrOworCisJY2FzZSBQSUQ6CisJCXByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgIiBRdWV1ZXMgUElEcyIpOworCQlwcmludGYoCSAgIiUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJCSAgIm1zcWlkIiwgIm93bmVyIiwgImxzcGlkIiwgImxycGlkIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCItLS0tLS0gTWVzc2FnZSVzIC0tLS0tLS0tXG4iLCAiIFF1ZXVlcyIpOworCQlwcmludGYoCSAgIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTJzICUtMTJzXG4iLAorCQkJCSAgImtleSIsICJtc3FpZCIsICJvd25lciIsICJwZXJtcyIsICJ1c2VkLWJ5dGVzIiwgIm1lc3NhZ2VzIik7CisJCWJyZWFrOworCX0KKworCWZvciAoaWQgPSAwOyBpZCA8PSBtYXhpZDsgaWQrKykgeworCQltc3FpZCA9IG1zZ2N0bChpZCwgTVNHX1NUQVQsICZtc2dxdWUpOworCQlpZiAobXNxaWQgPCAwKQorCQkJY29udGludWU7CisJCWlmIChmb3JtYXQgPT0gQ1JFQVRPUikgeworCQkJcHJpbnRfcGVybXMobXNxaWQsIGlwY3ApOworCQkJY29udGludWU7CisJCX0KKwkJcHcgPSBnZXRwd3VpZChpcGNwLT51aWQpOworCQlzd2l0Y2ggKGZvcm1hdCkgeworCQljYXNlIFRJTUU6CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLThkICUtMTAuMTBzIiwgbXNxaWQsIHB3LT5wd19uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtOGQgJS0xMGQiLCBtc3FpZCwgaXBjcC0+dWlkKTsKKwkJCXByaW50ZigiICUtMjAuMTZzIiwgbXNncXVlLm1zZ19zdGltZQorCQkJCQkgID8gY3RpbWUoJm1zZ3F1ZS5tc2dfc3RpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CisJCQlwcmludGYoIiAlLTIwLjE2cyIsIG1zZ3F1ZS5tc2dfcnRpbWUKKwkJCQkJICA/IGN0aW1lKCZtc2dxdWUubXNnX3J0aW1lKSArIDQgOiAiTm90IHNldCIpOworCQkJcHJpbnRmKCIgJS0yMC4xNnNcbiIsIG1zZ3F1ZS5tc2dfY3RpbWUKKwkJCQkJICA/IGN0aW1lKCZtc2dxdWUubXNnX2N0aW1lKSArIDQgOiAiTm90IHNldCIpOworCQkJYnJlYWs7CisJCWNhc2UgUElEOgorCQkJaWYgKHB3KQorCQkJCXByaW50ZigiJS04ZCAlLTEwLjEwcyIsIG1zcWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLThkICUtMTBkIiwgbXNxaWQsIGlwY3AtPnVpZCk7CisJCQlwcmludGYoIiAgJTVkICAgICAlNWRcbiIsIG1zZ3F1ZS5tc2dfbHNwaWQsIG1zZ3F1ZS5tc2dfbHJwaWQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiMHglMDh4ICIsIGlwY3AtPktFWSk7CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwLjEwcyIsIG1zcWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwZCIsIG1zcWlkLCBpcGNwLT51aWQpOworCQkJcHJpbnRmKCIgJS0xMG8gJS0xMmxkICUtMTJsZFxuIiwgaXBjcC0+bW9kZSAmIDA3NzcsCisJCQkJCSAgLyoKKwkJCQkJICAgKiBnbGliYy0yLjEuMyBhbmQgZWFybGllciBoYXMgdW5zaWduZWQgc2hvcnQ7CisJCQkJCSAgICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgorCQkJCQkgICAqIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nCisJCQkJCSAgICogQXVzdGluIGhhcyBtc2dxbnVtX3QKKwkJCQkJICAgKi8KKwkJCQkJICAobG9uZykgbXNncXVlLm1zZ19jYnl0ZXMsIChsb25nKSBtc2dxdWUubXNnX3FudW0pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgcHJpbnRfc2htKGludCBzaG1pZCkKK3sKKwlzdHJ1Y3Qgc2htaWRfZHMgc2htZHM7CisJc3RydWN0IGlwY19wZXJtICppcGNwID0gJnNobWRzLnNobV9wZXJtOworCisJaWYgKHNobWN0bChzaG1pZCwgSVBDX1NUQVQsICZzaG1kcykgPT0gLTEpIHsKKwkJYmJfcGVycm9yX21zZygic2htY3RsIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIlxuU2hhcmVkIG1lbW9yeSBTZWdtZW50IHNobWlkPSVkXG4iCisJCQkgICJ1aWQ9JWRcdGdpZD0lZFx0Y3VpZD0lZFx0Y2dpZD0lZFxuIgorCQkJICAibW9kZT0lI29cdGFjY2Vzc19wZXJtcz0lI29cbiIKKwkJCSAgImJ5dGVzPSVsZFx0bHBpZD0lZFx0Y3BpZD0lZFx0bmF0dGNoPSVsZFxuIiwKKwkJCSAgc2htaWQsCisJCQkgIGlwY3AtPnVpZCwgaXBjcC0+Z2lkLCBpcGNwLT5jdWlkLCBpcGNwLT5jZ2lkLAorCQkJICBpcGNwLT5tb2RlLCBpcGNwLT5tb2RlICYgMDc3NywKKwkJCSAgKGxvbmcpIHNobWRzLnNobV9zZWdzeiwgc2htZHMuc2htX2xwaWQsIHNobWRzLnNobV9jcGlkLAorCQkJICAobG9uZykgc2htZHMuc2htX25hdHRjaCk7CisJcHJpbnRmKCJhdHRfdGltZT0lLTI2LjI0c1xuIiwKKwkJCSAgc2htZHMuc2htX2F0aW1lID8gY3RpbWUoJnNobWRzLnNobV9hdGltZSkgOiAiTm90IHNldCIpOworCXByaW50ZigiZGV0X3RpbWU9JS0yNi4yNHNcbiIsCisJCQkgIHNobWRzLnNobV9kdGltZSA/IGN0aW1lKCZzaG1kcy5zaG1fZHRpbWUpIDogIk5vdCBzZXQiKTsKKwlwcmludGYoImNoYW5nZV90aW1lPSUtMjYuMjRzXG5cbiIsIGN0aW1lKCZzaG1kcy5zaG1fY3RpbWUpKTsKK30KKworCitzdGF0aWMgdm9pZCBwcmludF9tc2coaW50IG1zcWlkKQoreworCXN0cnVjdCBtc3FpZF9kcyBidWY7CisJc3RydWN0IGlwY19wZXJtICppcGNwID0gJmJ1Zi5tc2dfcGVybTsKKworCWlmIChtc2djdGwobXNxaWQsIElQQ19TVEFULCAmYnVmKSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnKCJtc2djdGwiKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiXG5NZXNzYWdlIFF1ZXVlIG1zcWlkPSVkXG4iCisJCQkgICJ1aWQ9JWRcdGdpZD0lZFx0Y3VpZD0lZFx0Y2dpZD0lZFx0bW9kZT0lI29cbiIKKwkJCSAgImNieXRlcz0lbGRcdHFieXRlcz0lbGRcdHFudW09JWxkXHRsc3BpZD0lZFx0bHJwaWQ9JWRcbiIsCisJCQkgIG1zcWlkLCBpcGNwLT51aWQsIGlwY3AtPmdpZCwgaXBjcC0+Y3VpZCwgaXBjcC0+Y2dpZCwgaXBjcC0+bW9kZSwKKwkJCSAgLyoKKwkJCSAgICogZ2xpYmMtMi4xLjMgYW5kIGVhcmxpZXIgaGFzIHVuc2lnbmVkIHNob3J0OworCQkJICAgKiBnbGliYy0yLjEuOTEgaGFzIHZhcmlhdGlvbiBiZXR3ZWVuCisJCQkgICAqIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nCisJCQkgICAqIEF1c3RpbiBoYXMgbXNncW51bV90IChmb3IgbXNnX3FieXRlcykKKwkJCSAgICovCisJCQkgIChsb25nKSBidWYubXNnX2NieXRlcywgKGxvbmcpIGJ1Zi5tc2dfcWJ5dGVzLAorCQkJICAobG9uZykgYnVmLm1zZ19xbnVtLCBidWYubXNnX2xzcGlkLCBidWYubXNnX2xycGlkKTsKKworCXByaW50Zigic2VuZF90aW1lPSUtMjYuMjRzXG4iLAorCQkJICBidWYubXNnX3N0aW1lID8gY3RpbWUoJmJ1Zi5tc2dfc3RpbWUpIDogIk5vdCBzZXQiKTsKKwlwcmludGYoInJjdl90aW1lPSUtMjYuMjRzXG4iLAorCQkJICBidWYubXNnX3J0aW1lID8gY3RpbWUoJmJ1Zi5tc2dfcnRpbWUpIDogIk5vdCBzZXQiKTsKKwlwcmludGYoImNoYW5nZV90aW1lPSUtMjYuMjRzXG5cbiIsCisJCQkgIGJ1Zi5tc2dfY3RpbWUgPyBjdGltZSgmYnVmLm1zZ19jdGltZSkgOiAiTm90IHNldCIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zZW0oaW50IHNlbWlkKQoreworCXN0cnVjdCBzZW1pZF9kcyBzZW1kczsKKwlzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmc2VtZHMuc2VtX3Blcm07CisJdW5pb24gc2VtdW4gYXJnOworCXVuc2lnbmVkIGludCBpOworCisJYXJnLmJ1ZiA9ICZzZW1kczsKKwlpZiAoc2VtY3RsKHNlbWlkLCAwLCBJUENfU1RBVCwgYXJnKSkgeworCQliYl9wZXJyb3JfbXNnKCJzZW1jdGwiKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiXG5TZW1hcGhvcmUgQXJyYXkgc2VtaWQ9JWRcbiIKKwkJCSAgInVpZD0lZFx0IGdpZD0lZFx0IGN1aWQ9JWRcdCBjZ2lkPSVkXG4iCisJCQkgICJtb2RlPSUjbywgYWNjZXNzX3Blcm1zPSUjb1xuIgorCQkJICAibnNlbXMgPSAlbGRcbiIKKwkJCSAgIm90aW1lID0gJS0yNi4yNHNcbiIsCisJCQkgIHNlbWlkLAorCQkJICBpcGNwLT51aWQsIGlwY3AtPmdpZCwgaXBjcC0+Y3VpZCwgaXBjcC0+Y2dpZCwKKwkJCSAgaXBjcC0+bW9kZSwgaXBjcC0+bW9kZSAmIDA3NzcsCisJCQkgIChsb25nKSBzZW1kcy5zZW1fbnNlbXMsCisJCQkgIHNlbWRzLnNlbV9vdGltZSA/IGN0aW1lKCZzZW1kcy5zZW1fb3RpbWUpIDogIk5vdCBzZXQiKTsKKwlwcmludGYoImN0aW1lID0gJS0yNi4yNHNcbiIKKwkJCSAgIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJICBjdGltZSgmc2VtZHMuc2VtX2N0aW1lKSwKKwkJCSAgInNlbW51bSIsICJ2YWx1ZSIsICJuY291bnQiLCAiemNvdW50IiwgInBpZCIpOworCisJYXJnLnZhbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNlbWRzLnNlbV9uc2VtczsgaSsrKSB7CisJCWludCB2YWwsIG5jbnQsIHpjbnQsIHBpZDsKKworCQl2YWwgPSBzZW1jdGwoc2VtaWQsIGksIEdFVFZBTCwgYXJnKTsKKwkJbmNudCA9IHNlbWN0bChzZW1pZCwgaSwgR0VUTkNOVCwgYXJnKTsKKwkJemNudCA9IHNlbWN0bChzZW1pZCwgaSwgR0VUWkNOVCwgYXJnKTsKKwkJcGlkID0gc2VtY3RsKHNlbWlkLCBpLCBHRVRQSUQsIGFyZyk7CisJCWlmICh2YWwgPCAwIHx8IG5jbnQgPCAwIHx8IHpjbnQgPCAwIHx8IHBpZCA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VtY3RsIik7CisJCX0KKwkJcHJpbnRmKCIlLTEwZCAlLTEwZCAlLTEwZCAlLTEwZCAlLTEwZFxuIiwgaSwgdmFsLCBuY250LCB6Y250LCBwaWQpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworfQorCitpbnQgaXBjc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBjc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGlkID0gMDsKKwl1bnNpZ25lZCBmbGFncyA9IDA7CisJdW5zaWduZWQgb3B0OworCWNoYXIgKm9wdF9pOworI2RlZmluZSBmbGFnX3ByaW50CSgxPDwwKQorI2RlZmluZSBmbGFnX21zZwkoMTw8MSkKKyNkZWZpbmUgZmxhZ19zZW0JKDE8PDIpCisjZGVmaW5lIGZsYWdfc2htCSgxPDwzKQorCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImk6YXFzbXRjcGx1IiwgJm9wdF9pKTsKKwlpZiAob3B0ICYgMHgxKSB7IC8vIC1pCisJCWlkID0geGF0b2kob3B0X2kpOworCQlmbGFncyB8PSBmbGFnX3ByaW50OworCX0KKwlpZiAob3B0ICYgMHgyKSBmbGFncyB8PSBmbGFnX21zZyB8IGZsYWdfc2VtIHwgZmxhZ19zaG07IC8vIC1hCisJaWYgKG9wdCAmIDB4NCkgZmxhZ3MgfD0gZmxhZ19tc2c7IC8vIC1xCisJaWYgKG9wdCAmIDB4OCkgZmxhZ3MgfD0gZmxhZ19zZW07IC8vIC1zCisJaWYgKG9wdCAmIDB4MTApIGZsYWdzIHw9IGZsYWdfc2htOyAvLyAtbQorCWlmIChvcHQgJiAweDIwKSBmb3JtYXQgPSBUSU1FOyAvLyAtdAorCWlmIChvcHQgJiAweDQwKSBmb3JtYXQgPSBDUkVBVE9SOyAvLyAtYworCWlmIChvcHQgJiAweDgwKSBmb3JtYXQgPSBQSUQ7IC8vIC1wCisJaWYgKG9wdCAmIDB4MTAwKSBmb3JtYXQgPSBMSU1JVFM7IC8vIC1sCisJaWYgKG9wdCAmIDB4MjAwKSBmb3JtYXQgPSBTVEFUVVM7IC8vIC11CisKKwlpZiAoZmxhZ3MgJiBmbGFnX3ByaW50KSB7CisJCWlmIChmbGFncyAmIGZsYWdfc2htKSB7CisJCQlwcmludF9zaG0oaWQpOworCQkJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisJCWlmIChmbGFncyAmIGZsYWdfc2VtKSB7CisJCQlwcmludF9zZW0oaWQpOworCQkJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisJCWlmIChmbGFncyAmIGZsYWdfbXNnKSB7CisJCQlwcmludF9tc2coaWQpOworCQkJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZiAoIShmbGFncyAmIChmbGFnX3NobSB8IGZsYWdfbXNnIHwgZmxhZ19zZW0pKSkKKwkJZmxhZ3MgfD0gZmxhZ19tc2cgfCBmbGFnX3NobSB8IGZsYWdfc2VtOworCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlpZiAoZmxhZ3MgJiBmbGFnX3NobSkgeworCQlkb19zaG0oKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisJaWYgKGZsYWdzICYgZmxhZ19zZW0pIHsKKwkJZG9fc2VtKCk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCWlmIChmbGFncyAmIGZsYWdfbXNnKSB7CisJCWRvX21zZygpOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2xvc2V0dXAuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbG9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2M0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2xvc2V0dXAuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBsb3NldHVwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBNYXR0IEtyYWFpLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxvc2V0dXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbyBPRlNdIExPT1BERVYgRklMRSAtIGFzc29jaWF0ZSBsb29wIGRldmljZXNcbiIKKy8vdXNhZ2U6ICAgICAgICIJbG9zZXR1cCAtZCBMT09QREVWIC0gZGlzYXNzb2NpYXRlXG4iCisvL3VzYWdlOiAgICAgICAiCWxvc2V0dXAgWy1mXSAtIHNob3ciCisvL3VzYWdlOiNkZWZpbmUgbG9zZXR1cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktbyBPRlMJU3RhcnQgT0ZTIGJ5dGVzIGludG8gRklMRSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJU2hvdyBmaXJzdCBmcmVlIGxvb3AgZGV2aWNlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsb3NldHVwX25vdGVzX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTm8gYXJndW1lbnRzIHdpbGwgZGlzcGxheSBhbGwgY3VycmVudCBhc3NvY2lhdGlvbnMuXG4iCisvL3VzYWdlOiAgICAgICAiT25lIGFyZ3VtZW50IChsb3NldHVwIC9kZXYvbG9vcDEpIHdpbGwgZGlzcGxheSB0aGUgY3VycmVudCBhc3NvY2lhdGlvblxuIgorLy91c2FnZTogICAgICAgIihpZiBhbnkpLCBvciBkaXNhc3NvY2lhdGUgaXQgKHdpdGggLWQpLiBUaGUgZGlzcGxheSBzaG93cyB0aGUgb2Zmc2V0XG4iCisvL3VzYWdlOiAgICAgICAiYW5kIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHRoZSBsb29wIGRldmljZSBpcyBjdXJyZW50bHkgYm91bmQgdG8uXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJUd28gYXJndW1lbnRzIChsb3NldHVwIC9kZXYvbG9vcDEgZmlsZS5pbWcpIGNyZWF0ZSBhIG5ldyBhc3NvY2lhdGlvbixcbiIKKy8vdXNhZ2U6ICAgICAgICJ3aXRoIGFuIG9wdGlvbmFsIG9mZnNldCAoLW8gMTIzNDUpLiBFbmNyeXB0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIgorLy91c2FnZTogICAgICAgImxvc2V0dXAgLWYgd2lsbCBzaG93IHRoZSBmaXJzdCBsb29wIGZyZWUgbG9vcCBkZXZpY2VcblxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IGxvc2V0dXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxvc2V0dXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwlpbnQgbjsKKwljaGFyICpvcHRfbzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0ID0gMDsKKwllbnVtIHsKKwkJT1BUX2QgPSAoMSA8PCAwKSwKKwkJT1BUX28gPSAoMSA8PCAxKSwKKwkJT1BUX2YgPSAoMSA8PCAyKSwKKwl9OworCisJLyogbWF4IDIgYXJncywgYWxsIG9wdHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8yOmQtLW9mOm8tLWRmOmYtLWRvIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZG86ZiIsICZvcHRfbyk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAob3B0ID09IE9QVF9vKQorCQlvZmZzZXQgPSB4YXRvdWxsKG9wdF9vKTsKKworCWlmIChvcHQgPT0gT1BUX2QpIHsKKwkJLyogLWQgQkxPQ0tERVYgKi8KKwkJaWYgKCFhcmd2WzBdIHx8IGFyZ3ZbMV0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChkZWxfbG9vcChhcmd2WzBdKSkKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJaWYgKGFyZ3ZbMF0pIHsKKwkJY2hhciAqczsKKworCQlpZiAob3B0ID09IE9QVF9mKSAvKiAtZiBzaG91bGQgbm90IGhhdmUgYXJndW1lbnRzICovCisJCQliYl9zaG93X3VzYWdlKCk7CisKKwkJaWYgKGFyZ3ZbMV0pIHsKKwkJCS8qIFstbyBPRlNdIEJMT0NLREVWIEZJTEUgKi8KKwkJCWlmIChzZXRfbG9vcCgmYXJndlswXSwgYXJndlsxXSwgb2Zmc2V0KSA8IDApCisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJLyogWy1vIE9GU10gQkxPQ0tERVYgKi8KKwkJcyA9IHF1ZXJ5X2xvb3AoYXJndlswXSk7CisJCWlmICghcykKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7CisJCXByaW50ZigiJXM6ICVzXG4iLCBhcmd2WzBdLCBzKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShzKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBbLW8gT0ZTfC1mXSB3aXRoIG5vIHBhcmFtcyAqLworCW4gPSAwOworCXdoaWxlICgxKSB7CisJCWNoYXIgKnM7CisJCWNoYXIgZGV2W0xPT1BfTkFNRVNJWkVdOworCisJCXNwcmludGYoZGV2LCBMT09QX0ZPUk1BVCwgbik7CisJCXMgPSBxdWVyeV9sb29wKGRldik7CisJCW4rKzsKKwkJaWYgKCFzKSB7CisJCQlpZiAobiA+IDkgJiYgZXJybm8gJiYgZXJybm8gIT0gRU5YSU8pCisJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCWlmIChvcHQgPT0gT1BUX2YpIHsKKwkJCQlwdXRzKGRldik7CisJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChvcHQgIT0gT1BUX2YpCisJCQkJcHJpbnRmKCIlczogJXNcbiIsIGRldiwgcyk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShzKTsKKwkJfQorCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9sc3BjaS5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9sc3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODQ4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2xzcGNpLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxzcGNpIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBNYWxlayBEZWdhY2hpIDxtYWxlay1kZWdhY2hpQGxhcG9zdGUubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxzcGNpX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW1rXSIKKy8vdXNhZ2U6I2RlZmluZSBsc3BjaV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxpc3QgYWxsIFBDSSBkZXZpY2VzIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JUGFyc2FibGUgb3V0cHV0IgorLy91c2FnZTogICAgICJcbgktawlTaG93IGRyaXZlciIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCU9QVF9tID0gKDEgPDwgMCksCisJT1BUX2sgPSAoMSA8PCAxKSwKK307CisKKy8qCisgKiBQQ0lfU0xPVF9OQU1FIFBDSV9DTEFTUzogUENJX1ZJRDpQQ0lfRElEIFtQQ0lfU1VCU1lTX1ZJRDpQQ0lfU1VCU1lTX0RJRF0gW0RSSVZFUl0KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZUFjdGlvbigKKwkJY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqdXNlckRhdGEgVU5VU0VEX1BBUkFNLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqdG9rZW5zWzNdOworCWNoYXIgKnBjaV9zbG90X25hbWUgPSBOVUxMLCAqZHJpdmVyID0gTlVMTDsKKwlpbnQgcGNpX2NsYXNzID0gMCwgcGNpX3ZpZCA9IDAsIHBjaV9kaWQgPSAwOworCWludCBwY2lfc3Vic3lzX3ZpZCA9IDAsIHBjaV9zdWJzeXNfZGlkID0gMDsKKworCWNoYXIgKnVldmVudF9maWxlbmFtZSA9IGNvbmNhdF9wYXRoX2ZpbGUoZmlsZU5hbWUsICIvdWV2ZW50Iik7CisJcGFyc2VyID0gY29uZmlnX29wZW4yKHVldmVudF9maWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCWZyZWUodWV2ZW50X2ZpbGVuYW1lKTsKKworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgMywgMiwgIlwwOj0iLCBQQVJTRV9OT1JNQUwpKSB7CisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiRFJJVkVSIikgPT0gMCkgeworCQkJZHJpdmVyID0geHN0cmR1cCh0b2tlbnNbMV0pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RyY21wKHRva2Vuc1swXSwgIlBDSV9DTEFTUyIpID09IDApIHsKKwkJCXBjaV9jbGFzcyA9IHhzdHJ0b3UodG9rZW5zWzFdLCAxNik+Pjg7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiUENJX0lEIikgPT0gMCkgeworCQkJcGNpX3ZpZCA9IHhzdHJ0b3UodG9rZW5zWzFdLCAxNik7CisJCQlwY2lfZGlkID0geHN0cnRvdSh0b2tlbnNbMl0sIDE2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJQQ0lfU1VCU1lTX0lEIikgPT0gMCkgeworCQkJcGNpX3N1YnN5c192aWQgPSB4c3RydG91KHRva2Vuc1sxXSwgMTYpOworCQkJcGNpX3N1YnN5c19kaWQgPSB4c3RydG91KHRva2Vuc1syXSwgMTYpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RyY21wKHRva2Vuc1swXSwgIlBDSV9TTE9UX05BTUUiKSA9PSAwKSB7CisJCQlwY2lfc2xvdF9uYW1lID0geHN0cmR1cCh0b2tlbnNbMl0pOworCQkJY29udGludWU7CisJCX0KKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX20pIHsKKwkJcHJpbnRmKCIlcyBcIkNsYXNzICUwNHhcIiBcIiUwNHhcIiBcIiUwNHhcIiBcIiUwNHhcIiBcIiUwNHhcIiIsCisJCSAgICAgICBwY2lfc2xvdF9uYW1lLCBwY2lfY2xhc3MsIHBjaV92aWQsIHBjaV9kaWQsCisJCSAgICAgICBwY2lfc3Vic3lzX3ZpZCwgcGNpX3N1YnN5c19kaWQpOworCX0gZWxzZSB7CisJCXByaW50ZigiJXMgQ2xhc3MgJTA0eDogJTA0eDolMDR4IiwKKwkJICAgICAgIHBjaV9zbG90X25hbWUsIHBjaV9jbGFzcywgcGNpX3ZpZCwgcGNpX2RpZCk7CisJfQorCisJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX2spICYmIGRyaXZlcikgeworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9tKSB7CisJCQlwcmludGYoIiBcIiVzXCIiLCBkcml2ZXIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIgJXMiLCBkcml2ZXIpOworCQl9CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlmcmVlKGRyaXZlcik7CisJZnJlZShwY2lfc2xvdF9uYW1lKTsKKworCXJldHVybiBUUlVFOworfQorCitpbnQgbHNwY2lfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxzcGNpX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlnZXRvcHQzMihhcmd2LCAibSIgLypub24tY29tcGF0OiovICJrIiAvKmlnbm9yZWQ6Ki8gIm52Iik7CisKKwlyZWN1cnNpdmVfYWN0aW9uKCIvc3lzL2J1cy9wY2kvZGV2aWNlcyIsCisJCQlBQ1RJT05fUkVDVVJTRSwKKwkJCWZpbGVBY3Rpb24sCisJCQlOVUxMLCAvKiBkaXJBY3Rpb24gKi8KKwkJCU5VTEwsIC8qIHVzZXJEYXRhICovCisJCQkwIC8qIGRlcHRoICovKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2xzdXNiLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L2xzdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwZjIxZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbHN1c2IuYwpAQCAtMCwwICsxLDc1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsc3VzYiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgTWFsZWsgRGVnYWNoaSA8bWFsZWstZGVnYWNoaUBsYXBvc3RlLm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsc3VzYl90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgbHN1c2JfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZUFjdGlvbigKKwkJY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqdXNlckRhdGEgVU5VU0VEX1BBUkFNLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqdG9rZW5zWzRdOworCWNoYXIgKmJ1c251bSA9IE5VTEwsICpkZXZudW0gPSBOVUxMOworCWludCBwcm9kdWN0X3ZpZCA9IDAsIHByb2R1Y3RfZGlkID0gMDsKKwljaGFyICp1ZXZlbnRfZmlsZW5hbWUgPSBjb25jYXRfcGF0aF9maWxlKGZpbGVOYW1lLCAiL3VldmVudCIpOworCisJcGFyc2VyID0gY29uZmlnX29wZW4yKHVldmVudF9maWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCWZyZWUodWV2ZW50X2ZpbGVuYW1lKTsKKworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgNCwgMiwgIlxcLz0iLCBQQVJTRV9OT1JNQUwpKSB7CisJCWlmICgocGFyc2VyLT5saW5lbm8gPT0gMSkgJiYgc3RyY21wKHRva2Vuc1swXSwgIkRFVlRZUEUiKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiUFJPRFVDVCIpID09IDApIHsKKwkJCXByb2R1Y3RfdmlkID0geHN0cnRvdSh0b2tlbnNbMV0sIDE2KTsKKwkJCXByb2R1Y3RfZGlkID0geHN0cnRvdSh0b2tlbnNbMl0sIDE2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJCVVNOVU0iKSA9PSAwKSB7CisJCQlidXNudW0gPSB4c3RyZHVwKHRva2Vuc1sxXSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiREVWTlVNIikgPT0gMCkgeworCQkJZGV2bnVtID0geHN0cmR1cCh0b2tlbnNbMV0pOworCQkJY29udGludWU7CisJCX0KKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKwlpZiAoYnVzbnVtKSB7CisJCXByaW50ZigiQnVzICVzIERldmljZSAlczogSUQgJTA0eDolMDR4XG4iLCBidXNudW0sIGRldm51bSwgcHJvZHVjdF92aWQsIHByb2R1Y3RfZGlkKTsKKwkJZnJlZShidXNudW0pOworCQlmcmVlKGRldm51bSk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK2ludCBsc3VzYl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHN1c2JfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBubyBvcHRpb25zLCBubyBnZXRvcHQgKi8KKworCXJlY3Vyc2l2ZV9hY3Rpb24oIi9zeXMvYnVzL3VzYi9kZXZpY2VzIiwKKwkJCUFDVElPTl9SRUNVUlNFLAorCQkJZmlsZUFjdGlvbiwKKwkJCU5VTEwsIC8qIGRpckFjdGlvbiAqLworCQkJTlVMTCwgLyogdXNlckRhdGEgKi8KKwkJCTAgLyogZGVwdGggKi8pOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWRldi5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9tZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhYmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWRldi5jCkBAIC0wLDAgKzEsNjUzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtZGV2IC0gTWluaSB1ZGV2IGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IDIwMDUgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAyMDA1IEZyYW5rIFNvcmVuc29uIDxmcmFua0B0dXhyb2Nrcy5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbWRldl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1zXSIKKy8vdXNhZ2U6I2RlZmluZSBtZGV2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1zCVNjYW4gL3N5cyBhbmQgcG9wdWxhdGUgL2RldiBkdXJpbmcgc3lzdGVtIGJvb3RcbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJJdCBjYW4gYmUgcnVuIGJ5IGtlcm5lbCBhcyBhIGhvdHBsdWcgaGVscGVyLiBUbyBhY3RpdmF0ZSBpdDpcbiIKKy8vdXNhZ2U6ICAgICAgICIgZWNobyAvc2Jpbi9tZGV2ID4gL3Byb2Mvc3lzL2tlcm5lbC9ob3RwbHVnXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX01ERVZfQ09ORigKKy8vdXNhZ2U6ICAgICAgICJJdCB1c2VzIC9ldGMvbWRldi5jb25mIHdpdGggbGluZXNcbiIKKy8vdXNhZ2U6ICAgICAgICJbLV1ERVZOQU1FIFVJRDpHSUQgUEVSTSIKKy8vdXNhZ2U6CQkJSUZfRkVBVFVSRV9NREVWX1JFTkFNRSgiIFs+fD1QQVRIXSIpCisvL3VzYWdlOgkJCUlGX0ZFQVRVUkVfTURFVl9FWEVDKCIgW0B8JHwqUFJPR10iKQorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBtZGV2X25vdGVzX3VzYWdlICIiCisvL3VzYWdlOglJRl9GRUFUVVJFX01ERVZfQ09ORklHKAorLy91c2FnZTogICAgICAgIlRoZSBtZGV2IGNvbmZpZyBmaWxlIGNvbnRhaW5zIGxpbmVzIHRoYXQgbG9vayBsaWtlOlxuIgorLy91c2FnZTogICAgICAgIiAgaGRbYS16XVswLTldKiAwOjMgNjYwXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJUaGF0J3MgZGV2aWNlIG5hbWUgKHdpdGggcmVnZXggbWF0Y2gpLCB1aWQ6Z2lkLCBhbmQgcGVybWlzc2lvbnMuXG5cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTURFVl9FWEVDKAorLy91c2FnZTogICAgICAgIk9wdGlvbmFsbHksIHRoYXQgY2FuIGJlIGZvbGxvd2VkIChvbiB0aGUgc2FtZSBsaW5lKSBieSBhIHNwZWNpYWwgY2hhcmFjdGVyXG4iCisvL3VzYWdlOiAgICAgICAiYW5kIGEgY29tbWFuZCBsaW5lIHRvIHJ1biBhZnRlciBjcmVhdGluZy9iZWZvcmUgZGVsZXRpbmcgdGhlIGNvcnJlc3BvbmRpbmdcbiIKKy8vdXNhZ2U6ICAgICAgICJkZXZpY2UocykuIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkTURFViBpbmRpY2F0ZXMgdGhlIGFjdGl2ZSBkZXZpY2Ugbm9kZVxuIgorLy91c2FnZTogICAgICAgIih3aGljaCBpcyB1c2VmdWwgaWYgaXQncyBhIHJlZ2V4IG1hdGNoKS4gRm9yIGV4YW1wbGU6XG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgIGhkYyByb290OmNkcm9tIDY2MCAgKmxuIC1zICRNREVWIGNkcm9tXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJUaGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBAIChydW4gYWZ0ZXIgY3JlYXRpbmcpLCAkIChydW4gYmVmb3JlIGRlbGV0aW5nKSxcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmQgKiAocnVuIGJvdGggYWZ0ZXIgY3JlYXRpbmcgYW5kIGJlZm9yZSBkZWxldGluZykuIFRoZSBjb21tYW5kcyBydW4gaW5cbiIKKy8vdXNhZ2U6ICAgICAgICJ0aGUgL2RldiBkaXJlY3RvcnksIGFuZCB1c2Ugc3lzdGVtKCkgd2hpY2ggY2FsbHMgL2Jpbi9zaC5cblxuIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICAgIkNvbmZpZyBmaWxlIHBhcnNpbmcgc3RvcHMgb24gdGhlIGZpcnN0IG1hdGNoaW5nIGxpbmUuIElmIG5vIGNvbmZpZ1xuIgorLy91c2FnZTogICAgICAgImVudHJ5IGlzIG1hdGNoZWQsIGRldmljZXMgYXJlIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IDA6MCA2NjAuIChNYWtlXG4iCisvL3VzYWdlOiAgICAgICAidGhlIGxhc3QgbGluZSBtYXRjaCAuKiB0byBvdmVycmlkZSB0aGlzLilcblxuIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKworLyogIm1kZXYgLXMiIHNjYW5zIC9zeXMvY2xhc3MveHh4LCBsb29raW5nIGZvciBkaXJlY3RvcmllcyB3aGljaCBoYXZlIGRldgorICogZmlsZSAoaXQgaXMgb2YgdGhlIGZvcm0gIk06bVxuIikuIEV4YW1wbGU6IC9zeXMvY2xhc3MvdHR5L3R0eTAvZGV2CisgKiBjb250YWlucyAiNDowXG4iLiBEaXJlY3RvcnkgbmFtZSBpcyB0YWtlbiBhcyBkZXZpY2UgbmFtZSwgcGF0aCBjb21wb25lbnQKKyAqIGRpcmVjdGx5IGFmdGVyIC9zeXMvY2xhc3MvIGFzIHN1YnN5c3RlbS4gSW4gdGhpcyBleGFtcGxlLCAidHR5MCIgYW5kICJ0dHkiLgorICogVGhlbiBtZGV2IGNyZWF0ZXMgdGhlIC9kZXYvZGV2aWNlX25hbWUgbm9kZS4KKyAqIElmIC9zeXMvY2xhc3MvLi4uL2RldiBmaWxlIGRvZXMgbm90IGV4aXN0LCBtZGV2IHN0aWxsIG1heSBhY3QKKyAqIG9uIHRoaXMgZGV2aWNlOiBzZWUgIkB8JHwqY29tbWFuZCBhcmdzLi4uIiBwYXJhbWV0ZXIgaW4gY29uZmlnIGZpbGUuCisgKgorICogbWRldiB3L28gcGFyYW1ldGVycyBpcyBjYWxsZWQgYXMgaG90cGx1ZyBoZWxwZXIuIEl0IHRha2VzIGRldmljZQorICogYW5kIHN1YnN5c3RlbSBuYW1lcyBmcm9tICRERVZQQVRIIGFuZCAkU1VCU1lTVEVNLCBleHRyYWN0cworICogbWFqLG1pbiBmcm9tICIvc3lzLyRERVZQQVRIL2RldiIgYW5kIGFsc28gZXhhbWluZXMKKyAqICRBQ1RJT04gKCJhZGQiLyJkZWxldGUiKSBhbmQgJEZJUk1XQVJFLgorICoKKyAqIElmIGFjdGlvbiBpcyAiYWRkIiwgbWRldiBjcmVhdGVzIC9kZXYvZGV2aWNlX25hbWUgc2ltaWxhcmx5IHRvIG1kZXYgLXMuCisgKiAodG9kbzogZXhwbGFpbiAiZGVsZXRlIiBhbmQgJEZJUk1XQVJFKQorICoKKyAqIElmIC9ldGMvbWRldi5jb25mIGV4aXN0cywgaXQgbWF5IG1vZGlmeSAvZGV2L2RldmljZV9uYW1lJ3MgcHJvcGVydGllcy4KKyAqIC9ldGMvbWRldi5jb25mIGZpbGUgZm9ybWF0OgorICoKKyAqIFstXVtzdWJzeXN0ZW0vXWRldmljZSAgdXNlcjpncnAgIG1vZGUgIFs+fD1wYXRoXSBbQHwkfCpjb21tYW5kIGFyZ3MuLi5dCisgKiBbLV1AbWFqLG1pblstbWluMl0gICAgIHVzZXI6Z3JwICBtb2RlICBbPnw9cGF0aF0gW0B8JHwqY29tbWFuZCBhcmdzLi4uXQorICogWy1dJGVudnZhcj12YWwgICAgICAgICB1c2VyOmdycCAgbW9kZSAgWz58PXBhdGhdIFtAfCR8KmNvbW1hbmQgYXJncy4uLl0KKyAqCisgKiBMZWFkaW5nIG1pbnVzIGluIDFzdCBmaWVsZCBtZWFucyAiZG9uJ3Qgc3RvcCBvbiB0aGlzIGxpbmUiLCBvdGhlcndpc2UKKyAqIHNlYXJjaCBpcyBzdG9wcGVkIGFmdGVyIHRoZSBtYXRjaGluZyBsaW5lIGlzIGVuY291bnRlcmVkLgorICoKKyAqIFRoZSBkZXZpY2UgbmFtZSBvciAic3Vic3lzdGVtL2RldmljZSIgY29tYm8gaXMgbWF0Y2hlZCBhZ2FpbnN0IDFzdCBmaWVsZAorICogKHdoaWNoIGlzIGEgcmVnZXgpLCBvciBtYWosbWluIGlzIG1hdGNoZWQgYWdhaW5zdCAxc3QgZmllbGQsCisgKiBvciBzcGVjaWZpZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgKGFzIHJlZ2V4KSBpcyBtYXRjaGVkIGFnYWluc3QgMXN0IGZpZWxkLgorICoKKyAqICRlbnZ2YXI9dmFsIGZvcm1hdCBpcyB1c2VmdWwgZm9yIGxvYWRpbmcgbW9kdWxlcyBmb3IgaG90LXBsdWdnZWQgZGV2aWNlcworICogd2hpY2ggZG8gbm90IGhhdmUgZHJpdmVyIGxvYWRlZCB5ZXQuIEluIHRoaXMgY2FzZSAvc3lzL2NsYXNzLy4uLi9kZXYKKyAqIGRvZXMgbm90IGV4aXN0LCBidXQgJE1PREFMSUFTIGlzIHNldCB0byBuZWVkZWQgbW9kdWxlJ3MgbmFtZQorICogKGFjdHVhbGx5LCBhbiBhbGlhcyB0byBpdCkgYnkga2VybmVsLiBUaGlzIHJ1bGUgaW5zdHJ1Y3RzIG1kZXYKKyAqIHRvIGxvYWQgdGhlIG1vZHVsZSBhbmQgZXhpdDoKKyAqICAgICRNT0RBTElBUz0uKiAwOjAgNjYwIEBtb2Rwcm9iZSAiJE1PREFMSUFTIgorICogVGhlIGtlcm5lbCB3aWxsIGdlbmVyYXRlIGFub3RoZXIgaG90cGx1ZyBldmVudCB3aGVuIC9zeXMvY2xhc3MvLi4uL2RldgorICogZmlsZSBhcHBlYXJzLgorICoKKyAqIFdoZW4gbGluZSBtYXRjaGVzLCB0aGUgZGV2aWNlIG5vZGUgaXMgY3JlYXRlZCwgY2htb2QnZWQgYW5kIGNob3duJ2VkLAorICogbW92ZWQgdG8gcGF0aCwgYW5kIGlmID5wYXRoLCBhIHN5bWxpbmsgdG8gbW92ZWQgbm9kZSBpcyBjcmVhdGVkLAorICogYWxsIHRoaXMgaWYgL3N5cy9jbGFzcy8uLi4vZGV2IGV4aXN0cy4KKyAqICAgIEV4YW1wbGVzOgorICogICAgPWxvb3AvICAgICAgLSBtb3ZlcyB0byAvZGV2L2xvb3AKKyAqICAgID5kaXNrL3NkYSUxIC0gbW92ZXMgdG8gL2Rldi9kaXNrL3NkYU4sIG1ha2VzIC9kZXYvc2RhTiBhIHN5bWxpbmsKKyAqCisgKiBUaGVuICJjb21tYW5kIGFyZ3MuLi4iIGlzIGV4ZWN1dGVkICh2aWEgc2ggLWMgJ2NvbW1hbmQgYXJncy4uLicpLgorICogQDpleGVjdXRlIG9uIGNyZWF0aW9uLCAkOm9uIGRlbGV0aW9uLCAqOm9uIGJvdGguCisgKiBUaGlzIGhhcHBlbnMgcmVnYXJkbGVzcyBvZiAvc3lzL2NsYXNzLy4uLi9kZXYgZXhpc3RlbmNlLgorICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgcm9vdF9tYWpvciwgcm9vdF9taW5vcjsKKwljaGFyICpzdWJzeXN0ZW07Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorCisvKiBQcmV2ZW50IGluZmluaXRlIGxvb3BzIGluIC9zeXMgc3ltbGlua3MgKi8KKyNkZWZpbmUgTUFYX1NZU0ZTX0RFUFRIIDMKKworLyogV2UgdXNlIGFkZGl0aW9uYWwgNjQrIGJ5dGVzIGluIG1ha2VfZGV2aWNlKCkgKi8KKyNkZWZpbmUgU0NSQVRDSF9TSVpFIDgwCisKKy8qIEJ1aWxkcyBhbiBhbGlhcyBwYXRoLgorICogVGhpcyBmdW5jdGlvbiBwb3RlbnRpb25hbGx5IHJlYWxsb2NhdGVzIHRoZSBhbGlhcyBwYXJhbWV0ZXIuCisgKiBPbmx5IHVzZWQgZm9yIEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FCisgKi8KK3N0YXRpYyBjaGFyICpidWlsZF9hbGlhcyhjaGFyICphbGlhcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCit7CisJY2hhciAqZGVzdDsKKworCS8qICI+YmFyLyI6IHJlbmFtZSB0byBiYXIvZGV2aWNlX25hbWUgKi8KKwkvKiAiPmJhclsvXWJheiI6IHJlbmFtZSB0byBiYXJbL11iYXogKi8KKwlkZXN0ID0gc3RycmNocihhbGlhcywgJy8nKTsKKwlpZiAoZGVzdCkgeyAvKiAiPmJhci9bYmF6XSIgPyAqLworCQkqZGVzdCA9ICdcMCc7IC8qIG1rZGlyIGJhciAqLworCQliYl9tYWtlX2RpcmVjdG9yeShhbGlhcywgMDc1NSwgRklMRVVUSUxTX1JFQ1VSKTsKKwkJKmRlc3QgPSAnLyc7CisJCWlmIChkZXN0WzFdID09ICdcMCcpIHsgLyogIj5iYXIvIiA9PiAiPmJhci9kZXZpY2VfbmFtZSIgKi8KKwkJCWRlc3QgPSBhbGlhczsKKwkJCWFsaWFzID0gY29uY2F0X3BhdGhfZmlsZShhbGlhcywgZGV2aWNlX25hbWUpOworCQkJZnJlZShkZXN0KTsKKwkJfQorCX0KKworCXJldHVybiBhbGlhczsKK30KKworLyogbWtub2QgaW4gL2RldiBiYXNlZCBvbiBhIHBhdGggbGlrZSAiL3N5cy9ibG9jay9oZGEvaGRhMSIKKyAqIE5CMTogcGF0aCBwYXJhbWV0ZXIgbmVlZHMgdG8gaGF2ZSBTQ1JBVENIX1NJWkUgc2NyYXRjaCBieXRlcworICogYWZ0ZXIgTlVMLCBidXQgd2UgcHJvbWlzZSB0byBub3QgbWFuZ2xlIChJT1c6IHRvIHJlc3RvcmUgaWYgbmVlZGVkKQorICogcGF0aCBzdHJpbmcuCisgKiBOQjI6ICJtZGV2IC1zIiBtYXkgY2FsbCB1cyBtYW55IHRpbWVzLCBkbyBub3QgbGVhayBtZW1vcnkvZmRzIQorICovCitzdGF0aWMgdm9pZCBtYWtlX2RldmljZShjaGFyICpwYXRoLCBpbnQgZGVsZXRlKQoreworCWNoYXIgKmRldmljZV9uYW1lLCAqc3Vic3lzdGVtX3NsYXNoX2Rldm5hbWU7CisJaW50IG1ham9yLCBtaW5vciwgdHlwZSwgbGVuOworCW1vZGVfdCBtb2RlOworCXBhcnNlcl90ICpwYXJzZXI7CisKKwkvKiBUcnkgdG8gcmVhZCBtYWpvci9taW5vciBzdHJpbmcuICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBwdXRzIFxuIGFmdGVyCisJICogdGhlIGRhdGEsIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbnVsbCB0ZXJtaW5hdGluZyB0aGUgc3RyaW5nCisJICogYmVjYXVzZSBzc2NhbmYoKSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG5vbmRpZ2l0LCB3aGljaCBcbiBpcy4KKwkgKiBXZSBhbHNvIGRlcGVuZCBvbiBwYXRoIGhhdmluZyB3cml0ZWFibGUgc3BhY2UgYWZ0ZXIgaXQuCisJICovCisJbWFqb3IgPSAtMTsKKwlpZiAoIWRlbGV0ZSkgeworCQljaGFyICpkZXZfbWFqX21pbiA9IHBhdGggKyBzdHJsZW4ocGF0aCk7CisKKwkJc3RyY3B5KGRldl9tYWpfbWluLCAiL2RldiIpOworCQlsZW4gPSBvcGVuX3JlYWRfY2xvc2UocGF0aCwgZGV2X21hal9taW4gKyAxLCA2NCk7CisJCSpkZXZfbWFqX21pbiA9ICdcMCc7CisJCWlmIChsZW4gPCAxKSB7CisJCQlpZiAoIUVOQUJMRV9GRUFUVVJFX01ERVZfRVhFQykKKwkJCQlyZXR1cm47CisJCQkvKiBubyAiZGV2IiBmaWxlLCBidXQgd2UgY2FuIHN0aWxsIHJ1biBzY3JpcHRzCisJCQkgKiBiYXNlZCBvbiBkZXZpY2UgbmFtZSAqLworCQl9IGVsc2UgaWYgKHNzY2FuZigrK2Rldl9tYWpfbWluLCAiJXU6JXUiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgeworCQkJbWFqb3IgPSAtMTsKKwkJfQorCX0KKwkvKiBlbHNlOiBmb3IgZGVsZXRlLCAtMSBzdGlsbCBkZWxldGVzIHRoZSBub2RlLCBidXQgPCAtMSBzdXBwcmVzc2VzIHRoYXQgKi8KKworCS8qIERldGVybWluZSBkZXZpY2UgbmFtZSwgdHlwZSwgbWFqb3IgYW5kIG1pbm9yICovCisJZGV2aWNlX25hbWUgPSAoY2hhciopIGJiX2Jhc2VuYW1lKHBhdGgpOworCS8qIGh0dHA6Ly9rZXJuZWwub3JnL2RvYy9wZW5kaW5nL2hvdHBsdWcudHh0IHNheXMgdGhhdCBvbmx5CisJICogIi9zeXMvYmxvY2svLi4uIiBpcyBmb3IgYmxvY2sgZGV2aWNlcy4gIi9zeXMvYnVzIiBldGMgaXMgbm90LgorCSAqIEJ1dCBzaW5jZSAyLjYuMjUgYmxvY2sgZGV2aWNlcyBhcmUgYWxzbyBpbiAvc3lzL2NsYXNzL2Jsb2NrLgorCSAqIFdlIHVzZSBzdHJzdHIoIi9ibG9jay8iKSB0byBmb3Jlc3RhbGwgZnV0dXJlIHN1cnByaXNlcy4gKi8KKwl0eXBlID0gU19JRkNIUjsKKwlpZiAoc3Ryc3RyKHBhdGgsICIvYmxvY2svIikgfHwgKEcuc3Vic3lzdGVtICYmIHN0cm5jbXAoRy5zdWJzeXN0ZW0sICJibG9jayIsIDUpID09IDApKQorCQl0eXBlID0gU19JRkJMSzsKKworCS8qIE1ha2UgcGF0aCBwb2ludCB0byAic3Vic3lzdGVtL2RldmljZV9uYW1lIiAqLworCXN1YnN5c3RlbV9zbGFzaF9kZXZuYW1lID0gTlVMTDsKKwkvKiBDaGVjayBmb3IgY29sZHBsdWcgaW52b2NhdGlvbnMgZmlyc3QgKi8KKwlpZiAoc3RybmNtcChwYXRoLCAiL3N5cy9ibG9jay8iLCAxMSkgPT0gMCkgLyogbGVnYWN5IGNhc2UgKi8KKwkJcGF0aCArPSBzaXplb2YoIi9zeXMvIikgLSAxOworCWVsc2UgaWYgKHN0cm5jbXAocGF0aCwgIi9zeXMvY2xhc3MvIiwgMTEpID09IDApCisJCXBhdGggKz0gc2l6ZW9mKCIvc3lzL2NsYXNzLyIpIC0gMTsKKwllbHNlIHsKKwkJLyogRXhhbXBsZSBvZiBhIGhvdHBsdWcgaW52b2NhdGlvbjoKKwkJICogU1VCU1lTVEVNPSJibG9jayIKKwkJICogREVWUEFUSD0iL3N5cyIgKyAiL2RldmljZXMvdmlydHVhbC9tdGQvbXRkMy9tdGRibG9jazMiCisJCSAqICgiL3N5cyIgaXMgYWRkZWQgYnkgbWRldl9tYWluKQorCQkgKiAtIHBhdGggZG9lcyBub3QgY29udGFpbiBzdWJzeXN0ZW0KKwkJICovCisJCXN1YnN5c3RlbV9zbGFzaF9kZXZuYW1lID0gY29uY2F0X3BhdGhfZmlsZShHLnN1YnN5c3RlbSwgZGV2aWNlX25hbWUpOworCQlwYXRoID0gc3Vic3lzdGVtX3NsYXNoX2Rldm5hbWU7CisJfQorCisJLyogSWYgd2UgaGF2ZSBjb25maWcgZmlsZSwgbG9vayB1cCB1c2VyIHNldHRpbmdzICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORikKKwkJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL21kZXYuY29uZiIsIGZvcGVuX2Zvcl9yZWFkKTsKKworCWRvIHsKKwkJaW50IGtlZXBfbWF0Y2hpbmc7CisJCXN0cnVjdCBiYl91aWRnaWRfdCB1Z2lkOworCQljaGFyICp0b2tlbnNbNF07CisJCWNoYXIgKmNvbW1hbmQgPSBOVUxMOworCQljaGFyICphbGlhcyA9IE5VTEw7CisJCWNoYXIgYWxpYXNsaW5rID0gYWxpYXNsaW5rOyAvKiBmb3IgY29tcGlsZXIgKi8KKworCQkvKiBEZWZhdWx0cyBpbiBjYXNlIHdlIHdvbid0IG1hdGNoIGFueSBsaW5lICovCisJCXVnaWQudWlkID0gdWdpZC5naWQgPSAwOworCQlrZWVwX21hdGNoaW5nID0gMDsKKwkJbW9kZSA9IDA2NjA7CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORgorCQkgJiYgY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIDQsIDMsICIjIFx0IiwgUEFSU0VfTk9STUFMKQorCQkpIHsKKwkJCWNoYXIgKnZhbDsKKwkJCWNoYXIgKnN0cl90b19tYXRjaDsKKwkJCXJlZ21hdGNoX3Qgb2ZmWzEgKyA5ICogRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQXTsKKworCQkJdmFsID0gdG9rZW5zWzBdOworCQkJa2VlcF9tYXRjaGluZyA9ICgnLScgPT0gdmFsWzBdKTsKKwkJCXZhbCArPSBrZWVwX21hdGNoaW5nOyAvKiBzd2FsbG93IGxlYWRpbmcgZGFzaCAqLworCisJCQkvKiBNYXRjaCBhZ2FpbnN0IGVpdGhlciAic3Vic3lzdGVtL2RldmljZV9uYW1lIgorCQkJICogb3IgImRldmljZV9uYW1lIiBhbG9uZSAqLworCQkJc3RyX3RvX21hdGNoID0gc3RyY2hyKHZhbCwgJy8nKSA/IHBhdGggOiBkZXZpY2VfbmFtZTsKKworCQkJLyogRmllbGRzOiByZWdleCB1aWQ6Z2lkIG1vZGUgW2FsaWFzXSBbY21kXSAqLworCisJCQlpZiAodmFsWzBdID09ICdAJykgeworCQkJCS8qIEBtYWpvcixtaW5vclstbWlub3IyXSAqLworCQkJCS8qICh1c2VmdWwgd2hlbiBuYW1lIGlzIGFtYmlndW91czoKKwkJCQkgKiAiL3N5cy9jbGFzcy91c2IvbHAwIiBhbmQKKwkJCQkgKiAiL3N5cy9jbGFzcy9wcmludGVyL2xwMCIpICovCisJCQkJaW50IGNtYWosIGNtaW4wLCBjbWluMSwgc2M7CisJCQkJaWYgKG1ham9yIDwgMCkKKwkJCQkJY29udGludWU7IC8qIG5vIGRldiwgbm8gbWF0Y2ggKi8KKwkJCQlzYyA9IHNzY2FuZih2YWwsICJAJXUsJXUtJXUiLCAmY21haiwgJmNtaW4wLCAmY21pbjEpOworCQkJCWlmIChzYyA8IDEKKwkJCQkgfHwgbWFqb3IgIT0gY21hagorCQkJCSB8fCAoc2MgPT0gMiAmJiBtaW5vciAhPSBjbWluMCkKKwkJCQkgfHwgKHNjID09IDMgJiYgKG1pbm9yIDwgY21pbjAgfHwgbWlub3IgPiBjbWluMSkpCisJCQkJKSB7CisJCQkJCWNvbnRpbnVlOyAvKiB0aGlzIGxpbmUgZG9lc24ndCBtYXRjaCAqLworCQkJCX0KKwkJCQlnb3RvIGxpbmVfbWF0Y2hlczsKKwkJCX0KKwkJCWlmICh2YWxbMF0gPT0gJyQnKSB7CisJCQkJLyogcmVnZXggdG8gbWF0Y2ggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKwkJCQljaGFyICplcSA9IHN0cmNocigrK3ZhbCwgJz0nKTsKKwkJCQlpZiAoIWVxKQorCQkJCQljb250aW51ZTsKKwkJCQkqZXEgPSAnXDAnOworCQkJCXN0cl90b19tYXRjaCA9IGdldGVudih2YWwpOworCQkJCWlmICghc3RyX3RvX21hdGNoKQorCQkJCQljb250aW51ZTsKKwkJCQlzdHJfdG9fbWF0Y2ggLT0gc3RybGVuKHZhbCkgKyAxOworCQkJCSplcSA9ICc9JzsKKwkJCX0KKwkJCS8qIGVsc2U6IHJlZ2V4IHRvIG1hdGNoIFtzdWJzeXN0ZW0vXWRldmljZV9uYW1lICovCisKKwkJCXsKKwkJCQlyZWdleF90IG1hdGNoOworCQkJCWludCByZXN1bHQ7CisKKwkJCQl4cmVnY29tcCgmbWF0Y2gsIHZhbCwgUkVHX0VYVEVOREVEKTsKKwkJCQlyZXN1bHQgPSByZWdleGVjKCZtYXRjaCwgc3RyX3RvX21hdGNoLCBBUlJBWV9TSVpFKG9mZiksIG9mZiwgMCk7CisJCQkJcmVnZnJlZSgmbWF0Y2gpOworCQkJCS8vYmJfZXJyb3JfbXNnKCJtYXRjaGVzOiIpOworCQkJCS8vZm9yIChpbnQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9mZik7IGkrKykgeworCQkJCS8vCWlmIChvZmZbaV0ucm1fc28gPCAwKSBjb250aW51ZTsKKwkJCQkvLwliYl9lcnJvcl9tc2coIm1hdGNoICVkOiAnJS4qcydcbiIsIGksCisJCQkJLy8JCShpbnQpKG9mZltpXS5ybV9lbyAtIG9mZltpXS5ybV9zbyksCisJCQkJLy8JCWRldmljZV9uYW1lICsgb2ZmW2ldLnJtX3NvKTsKKwkJCQkvL30KKworCQkJCS8qIElmIG5vIG1hdGNoLCBza2lwIHJlc3Qgb2YgbGluZSAqLworCQkJCS8qIChyZWdleGVjIHJldHVybnMgd2hvbGUgcGF0dGVybiBhcyAicmFuZ2UiIDApICovCisJCQkJaWYgKHJlc3VsdAorCQkJCSB8fCBvZmZbMF0ucm1fc28KKwkJCQkgfHwgKChpbnQpb2ZmWzBdLnJtX2VvICE9IChpbnQpc3RybGVuKHN0cl90b19tYXRjaCkpCisJCQkJKSB7CisJCQkJCWNvbnRpbnVlOyAvKiB0aGlzIGxpbmUgZG9lc24ndCBtYXRjaCAqLworCQkJCX0KKwkJCX0KKyBsaW5lX21hdGNoZXM6CisJCQkvKiBUaGlzIGxpbmUgbWF0Y2hlcy4gU3RvcCBwYXJzaW5nIGFmdGVyIHBhcnNpbmcKKwkJCSAqIHRoZSByZXN0IHRoZSBsaW5lIHVubGVzcyBrZWVwX21hdGNoaW5nID09IDEgKi8KKworCQkJLyogMm5kIGZpZWxkOiB1aWQ6Z2lkIC0gZGV2aWNlIG93bmVyc2hpcCAqLworCQkJaWYgKGdldF91aWRnaWQoJnVnaWQsIHRva2Vuc1sxXSwgLyphbGxvd19udW1lcmljOiovIDEpID09IDApCisJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIHVzZXIvZ3JvdXAgJXMgb24gbGluZSAlZCIsIHRva2Vuc1sxXSwgcGFyc2VyLT5saW5lbm8pOworCisJCQkvKiAzcmQgZmllbGQ6IG1vZGUgLSBkZXZpY2UgcGVybWlzc2lvbnMgKi8KKwkJCWJiX3BhcnNlX21vZGUodG9rZW5zWzJdLCAmbW9kZSk7CisKKwkJCXZhbCA9IHRva2Vuc1szXTsKKwkJCS8qIDR0aCBmaWVsZCAob3B0KTogIj58PWFsaWFzIiBvciAiISIgdG8gbm90IGNyZWF0ZSB0aGUgbm9kZSAqLworCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUgJiYgdmFsKSB7CisJCQkJY2hhciAqYSwgKnMsICpzdDsKKworCQkJCWEgPSB2YWw7CisJCQkJcyA9IHN0cmNocm51bCh2YWwsICcgJyk7CisJCQkJc3QgPSBzdHJjaHJudWwodmFsLCAnXHQnKTsKKwkJCQlpZiAoc3QgPCBzKQorCQkJCQlzID0gc3Q7CisJCQkJc3QgPSAoc1swXSAmJiBzWzFdKSA/IHMrMSA6IE5VTEw7CisKKwkJCQlhbGlhc2xpbmsgPSBhWzBdOworCQkJCWlmIChhbGlhc2xpbmsgPT0gJyEnICYmIHMgPT0gYSsxKSB7CisJCQkJCXZhbCA9IHN0OworCQkJCQkvKiAiISI6IHN1cHByZXNzIG5vZGUgY3JlYXRpb24vZGVsZXRpb24gKi8KKwkJCQkJbWFqb3IgPSAtMjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoYWxpYXNsaW5rID09ICc+JyB8fCBhbGlhc2xpbmsgPT0gJz0nKSB7CisJCQkJCXZhbCA9IHN0OworCQkJCQlzWzBdID0gJ1wwJzsKKwkJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUCkgeworCQkJCQkJY2hhciAqcDsKKwkJCQkJCXVuc2lnbmVkIGksIG47CisKKwkJCQkJCS8qIHN1YnN0aXR1dGUgJTEuLjkgd2l0aCBvZmZbMS4uOV0sIGlmIGFueSAqLworCQkJCQkJbiA9IDA7CisJCQkJCQlzID0gYTsKKwkJCQkJCXdoaWxlICgqcykKKwkJCQkJCQlpZiAoKnMrKyA9PSAnJScpCisJCQkJCQkJCW4rKzsKKworCQkJCQkJcCA9IGFsaWFzID0geHphbGxvYyhzdHJsZW4oYSkgKyBuICogc3RybGVuKHN0cl90b19tYXRjaCkpOworCQkJCQkJcyA9IGEgKyAxOworCQkJCQkJd2hpbGUgKCpzKSB7CisJCQkJCQkJKnAgPSAqczsKKwkJCQkJCQlpZiAoJyUnID09ICpzKSB7CisJCQkJCQkJCWkgPSAoc1sxXSAtICcwJyk7CisJCQkJCQkJCWlmIChpIDw9IDkgJiYgb2ZmW2ldLnJtX3NvID49IDApIHsKKwkJCQkJCQkJCW4gPSBvZmZbaV0ucm1fZW8gLSBvZmZbaV0ucm1fc287CisJCQkJCQkJCQlzdHJuY3B5KHAsIHN0cl90b19tYXRjaCArIG9mZltpXS5ybV9zbywgbik7CisJCQkJCQkJCQlwICs9IG4gLSAxOworCQkJCQkJCQkJcysrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXArKzsKKwkJCQkJCQlzKys7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhbGlhcyA9IHhzdHJkdXAoYSArIDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9FWEVDICYmIHZhbCkgeworCQkJCWNvbnN0IGNoYXIgKnMgPSAiJEAqIjsKKwkJCQljb25zdCBjaGFyICpzMiA9IHN0cmNocihzLCB2YWxbMF0pOworCisJCQkJaWYgKCFzMikgeworCQkJCQliYl9lcnJvcl9tc2coImJhZCBsaW5lICV1IiwgcGFyc2VyLT5saW5lbm8pOworCQkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUpCisJCQkJCQlmcmVlKGFsaWFzKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLyogQXJlIHdlIHJ1bm5pbmcgdGhpcyBjb21tYW5kIG5vdz8KKwkJCQkgKiBSdW4gJGNtZCBvbiBkZWxldGUsIEBjbWQgb24gY3JlYXRlLCAqY21kIG9uIGJvdGgKKwkJCQkgKi8KKwkJCQlpZiAoczIgLSBzICE9IGRlbGV0ZSkgeworCQkJCQkvKiBXZSBhcmUgaGVyZSBpZjogJyonLAorCQkJCQkgKiBvcjogJ0AnIGFuZCBkZWxldGUgPSAwLAorCQkJCQkgKiBvcjogJyQnIGFuZCBkZWxldGUgPSAxCisJCQkJCSAqLworCQkJCQljb21tYW5kID0geHN0cmR1cCh2YWwgKyAxKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBFbmQgb2YgZmllbGQgcGFyc2luZyAqLworCisJCS8qICJFeGVjdXRlIiB0aGUgbGluZSB3ZSBmb3VuZCAqLworCQl7CisJCQljb25zdCBjaGFyICpub2RlX25hbWU7CisKKwkJCW5vZGVfbmFtZSA9IGRldmljZV9uYW1lOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FICYmIGFsaWFzKQorCQkJCW5vZGVfbmFtZSA9IGFsaWFzID0gYnVpbGRfYWxpYXMoYWxpYXMsIGRldmljZV9uYW1lKTsKKworCQkJaWYgKCFkZWxldGUgJiYgbWFqb3IgPj0gMCkgeworCQkJCWlmIChta25vZChub2RlX25hbWUsIG1vZGUgfCB0eXBlLCBtYWtlZGV2KG1ham9yLCBtaW5vcikpICYmIGVycm5vICE9IEVFWElTVCkKKwkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyciLCBub2RlX25hbWUpOworCQkJCWlmIChtYWpvciA9PSBHLnJvb3RfbWFqb3IgJiYgbWlub3IgPT0gRy5yb290X21pbm9yKQorCQkJCQlzeW1saW5rKG5vZGVfbmFtZSwgInJvb3QiKTsKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9DT05GKSB7CisJCQkJCWNobW9kKG5vZGVfbmFtZSwgbW9kZSk7CisJCQkJCWNob3duKG5vZGVfbmFtZSwgdWdpZC51aWQsIHVnaWQuZ2lkKTsKKwkJCQl9CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FICYmIGFsaWFzKSB7CisJCQkJCWlmIChhbGlhc2xpbmsgPT0gJz4nKQorCQkJCQkJc3ltbGluayhub2RlX25hbWUsIGRldmljZV9uYW1lKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX0VYRUMgJiYgY29tbWFuZCkgeworCQkJCS8qIHNldGVudiB3aWxsIGxlYWsgbWVtb3J5LCB1c2UgcHV0ZW52L3Vuc2V0ZW52L2ZyZWUgKi8KKwkJCQljaGFyICpzID0geGFzcHJpbnRmKCIlcz0lcyIsICJNREVWIiwgbm9kZV9uYW1lKTsKKwkJCQljaGFyICpzMSA9IHhhc3ByaW50ZigiJXM9JXMiLCAiU1VCU1lTVEVNIiwgRy5zdWJzeXN0ZW0pOworCQkJCXB1dGVudihzKTsKKwkJCQlwdXRlbnYoczEpOworCQkJCWlmIChzeXN0ZW0oY29tbWFuZCkgPT0gLTEpCisJCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHJ1biAnJXMnIiwgY29tbWFuZCk7CisJCQkJYmJfdW5zZXRlbnZfYW5kX2ZyZWUoczEpOworCQkJCWJiX3Vuc2V0ZW52X2FuZF9mcmVlKHMpOworCQkJCWZyZWUoY29tbWFuZCk7CisJCQl9CisKKwkJCWlmIChkZWxldGUgJiYgbWFqb3IgPj0gLTEpIHsKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUgJiYgYWxpYXMpIHsKKwkJCQkJaWYgKGFsaWFzbGluayA9PSAnPicpCisJCQkJCQl1bmxpbmsoZGV2aWNlX25hbWUpOworCQkJCX0KKwkJCQl1bmxpbmsobm9kZV9uYW1lKTsKKwkJCX0KKworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FKQorCQkJCWZyZWUoYWxpYXMpOworCQl9CisKKwkJLyogV2UgZm91bmQgbWF0Y2hpbmcgbGluZS4KKwkJICogU3RvcCB1bmxlc3MgaXQgd2FzIHByZWZpeGVkIHdpdGggJy0nICovCisJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX0NPTkYgJiYgIWtlZXBfbWF0Y2hpbmcpCisJCQlicmVhazsKKworCS8qIGVuZCBvZiAid2hpbGUgbGluZSBpcyByZWFkIGZyb20gL2V0Yy9tZGV2LmNvbmYiICovCisJfSB3aGlsZSAoRU5BQkxFX0ZFQVRVUkVfTURFVl9DT05GKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX0NPTkYpCisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCWZyZWUoc3Vic3lzdGVtX3NsYXNoX2Rldm5hbWUpOworfQorCisvKiBGaWxlIGNhbGxiYWNrIGZvciAvc3lzLyB0cmF2ZXJzYWwgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVBY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqdXNlckRhdGEsCisJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihmaWxlTmFtZSkgLSA0OyAvKiBjYW4ndCB1bmRlcmZsb3cgKi8KKwljaGFyICpzY3JhdGNoID0gdXNlckRhdGE7CisKKwkvKiBsZW4gY2hlY2sgaXMgZm9yIHBhcmFub2lkIHJlYXNvbnMgKi8KKwlpZiAoc3RyY21wKGZpbGVOYW1lICsgbGVuLCAiL2RldiIpICE9IDAgfHwgbGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gRkFMU0U7CisKKwlzdHJjcHkoc2NyYXRjaCwgZmlsZU5hbWUpOworCXNjcmF0Y2hbbGVuXSA9ICdcMCc7CisJbWFrZV9kZXZpY2Uoc2NyYXRjaCwgLypkZWxldGU6Ki8gMCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyogRGlyZWN0b3J5IGNhbGxiYWNrIGZvciAvc3lzLyB0cmF2ZXJzYWwgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRpckFjdGlvbihjb25zdCBjaGFyICpmaWxlTmFtZSBVTlVTRURfUEFSQU0sCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqdXNlckRhdGEgVU5VU0VEX1BBUkFNLAorCQlpbnQgZGVwdGgpCit7CisJLyogRXh0cmFjdCBkZXZpY2Ugc3Vic3lzdGVtIC0tIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKwkgKiB1bmRlciAvc3lzL2NsYXNzLyAqLworCWlmICgxID09IGRlcHRoKSB7CisJCWZyZWUoRy5zdWJzeXN0ZW0pOworCQlHLnN1YnN5c3RlbSA9IHN0cnJjaHIoZmlsZU5hbWUsICcvJyk7CisJCWlmIChHLnN1YnN5c3RlbSkKKwkJCUcuc3Vic3lzdGVtID0geHN0cmR1cChHLnN1YnN5c3RlbSArIDEpOworCX0KKworCXJldHVybiAoZGVwdGggPj0gTUFYX1NZU0ZTX0RFUFRIID8gU0tJUCA6IFRSVUUpOworfQorCisvKiBGb3IgdGhlIGZ1bGwgZ29yeSBkZXRhaWxzLCBzZWUgbGludXgvRG9jdW1lbnRhdGlvbi9maXJtd2FyZV9jbGFzcy9SRUFETUUKKyAqCisgKiBGaXJtd2FyZSBsb2FkaW5nIHdvcmtzIGxpa2UgdGhpczoKKyAqIC0ga2VybmVsIHNldHMgRklSTVdBUkUgZW52IHZhcgorICogLSB1c2Vyc3BhY2UgY2hlY2tzIC9saWIvZmlybXdhcmUvJEZJUk1XQVJFCisgKiAtIHVzZXJzcGFjZSB3YWl0cyBmb3IgL3N5cy8kREVWUEFUSC9sb2FkaW5nIHRvIGFwcGVhcgorICogLSB1c2Vyc3BhY2Ugd3JpdGVzICIxIiB0byAvc3lzLyRERVZQQVRIL2xvYWRpbmcKKyAqIC0gdXNlcnNwYWNlIGNvcGllcyAvbGliL2Zpcm13YXJlLyRGSVJNV0FSRSBpbnRvIC9zeXMvJERFVlBBVEgvZGF0YQorICogLSB1c2Vyc3BhY2Ugd3JpdGVzICIwIiAod29ya2VkKSBvciAiLTEiIChmYWlsZWQpIHRvIC9zeXMvJERFVlBBVEgvbG9hZGluZworICogLSBrZXJuZWwgbG9hZHMgZmlybXdhcmUgaW50byBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbG9hZF9maXJtd2FyZShjb25zdCBjaGFyICpmaXJtd2FyZSwgY29uc3QgY2hhciAqc3lzZnNfcGF0aCkKK3sKKwlpbnQgY250OworCWludCBmaXJtd2FyZV9mZCwgbG9hZGluZ19mZCwgZGF0YV9mZDsKKworCS8qIGNoZWNrIGZvciAvbGliL2Zpcm13YXJlLyRGSVJNV0FSRSAqLworCXhjaGRpcigiL2xpYi9maXJtd2FyZSIpOworCWZpcm13YXJlX2ZkID0geG9wZW4oZmlybXdhcmUsIE9fUkRPTkxZKTsKKworCS8qIGluIGNhc2Ugd2UgZ290byBvdXQgLi4uICovCisJZGF0YV9mZCA9IC0xOworCisJLyogY2hlY2sgZm9yIC9zeXMvJERFVlBBVEgvbG9hZGluZyAuLi4gZ2l2ZSAzMCBzZWNvbmRzIHRvIGFwcGVhciAqLworCXhjaGRpcihzeXNmc19wYXRoKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDMwOyArK2NudCkgeworCQlsb2FkaW5nX2ZkID0gb3BlbigibG9hZGluZyIsIE9fV1JPTkxZKTsKKwkJaWYgKGxvYWRpbmdfZmQgIT0gLTEpCisJCQlnb3RvIGxvYWRpbmc7CisJCXNsZWVwKDEpOworCX0KKwlnb3RvIG91dDsKKworIGxvYWRpbmc6CisJLyogdGVsbCBrZXJuZWwgd2UncmUgbG9hZGluZyBieSAiZWNobyAxID4gL3N5cy8kREVWUEFUSC9sb2FkaW5nIiAqLworCWlmIChmdWxsX3dyaXRlKGxvYWRpbmdfZmQsICIxIiwgMSkgIT0gMSkKKwkJZ290byBvdXQ7CisKKwkvKiBsb2FkIGZpcm13YXJlIGludG8gL3N5cy8kREVWUEFUSC9kYXRhICovCisJZGF0YV9mZCA9IG9wZW4oImRhdGEiLCBPX1dST05MWSk7CisJaWYgKGRhdGFfZmQgPT0gLTEpCisJCWdvdG8gb3V0OworCWNudCA9IGJiX2NvcHlmZF9lb2YoZmlybXdhcmVfZmQsIGRhdGFfZmQpOworCisJLyogdGVsbCBrZXJuZWwgcmVzdWx0IGJ5ICJlY2hvIFswfC0xXSA+IC9zeXMvJERFVlBBVEgvbG9hZGluZyIgKi8KKwlpZiAoY250ID4gMCkKKwkJZnVsbF93cml0ZShsb2FkaW5nX2ZkLCAiMCIsIDEpOworCWVsc2UKKwkJZnVsbF93cml0ZShsb2FkaW5nX2ZkLCAiLTEiLCAyKTsKKworIG91dDoKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UoZmlybXdhcmVfZmQpOworCQljbG9zZShsb2FkaW5nX2ZkKTsKKwkJY2xvc2UoZGF0YV9mZCk7CisJfQorfQorCitpbnQgbWRldl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWRldl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJUkVTRVJWRV9DT05GSUdfQlVGRkVSKHRlbXAsIFBBVEhfTUFYICsgU0NSQVRDSF9TSVpFKTsKKworCS8qIFdlIGNhbiBiZSBjYWxsZWQgYXMgaG90cGx1ZyBoZWxwZXIgKi8KKwkvKiBLZXJuZWwgY2Fubm90IHByb3ZpZGUgc3VpdGFibGUgc3RkaW8gZmRzIGZvciB1cywgZG8gaXQgb3Vyc2VsZiAqLworCWJiX3Nhbml0aXplX3N0ZGlvKCk7CisKKwkvKiBGb3JjZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHNldHRpbmdzIGV4YWN0bHkgKi8KKwl1bWFzaygwKTsKKworCXhjaGRpcigiL2RldiIpOworCisJaWYgKGFyZ3ZbMV0gJiYgc3RyY21wKGFyZ3ZbMV0sICItcyIpID09IDApIHsKKwkJLyogU2NhbjoKKwkJICogbWRldiAtcworCQkgKi8KKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJeHN0YXQoIi8iLCAmc3QpOworCQlHLnJvb3RfbWFqb3IgPSBtYWpvcihzdC5zdF9kZXYpOworCQlHLnJvb3RfbWlub3IgPSBtaW5vcihzdC5zdF9kZXYpOworCisJCS8qIEFDVElPTl9GT0xMT1dMSU5LUyBpcyBuZWVkZWQgc2luY2UgaW4gbmV3ZXIga2VybmVscworCQkgKiAvc3lzL2Jsb2NrL2xvb3AqIChmb3IgZXhhbXBsZSkgYXJlIHN5bWxpbmtzIHRvIGRpcnMsCisJCSAqIG5vdCByZWFsIGRpcmVjdG9yaWVzLgorCQkgKiAoa2VybmVsJ3MgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgbWFrZXMgdGhlbSByZWFsIGRpcnMsCisJCSAqIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQgb24gdXNlcnMpCisJCSAqLworCQlpZiAoYWNjZXNzKCIvc3lzL2NsYXNzL2Jsb2NrIiwgRl9PSykgIT0gMCkgeworCQkJLyogU2NhbiBvYnNvbGV0ZSAvc3lzL2Jsb2NrIG9ubHkgaWYgL3N5cy9jbGFzcy9ibG9jaworCQkJICogZG9lc24ndCBleGlzdC4gT3RoZXJ3aXNlIHdlJ2xsIGhhdmUgZHVwZXMuCisJCQkgKiBBbHNvLCBkbyBub3QgY29tcGxhaW4gaWYgaXQgZG9lc24ndCBleGlzdC4KKwkJCSAqIFNvbWUgcGVvcGxlIGNvbmZpZ3VyZSBrZXJuZWwgdG8gaGF2ZSBubyBibG9ja2RldnMuCisJCQkgKi8KKwkJCXJlY3Vyc2l2ZV9hY3Rpb24oIi9zeXMvYmxvY2siLAorCQkJCUFDVElPTl9SRUNVUlNFIHwgQUNUSU9OX0ZPTExPV0xJTktTIHwgQUNUSU9OX1FVSUVULAorCQkJCWZpbGVBY3Rpb24sIGRpckFjdGlvbiwgdGVtcCwgMCk7CisJCX0KKwkJcmVjdXJzaXZlX2FjdGlvbigiL3N5cy9jbGFzcyIsCisJCQlBQ1RJT05fUkVDVVJTRSB8IEFDVElPTl9GT0xMT1dMSU5LUywKKwkJCWZpbGVBY3Rpb24sIGRpckFjdGlvbiwgdGVtcCwgMCk7CisJfSBlbHNlIHsKKwkJY2hhciAqZnc7CisJCWNoYXIgKnNlcTsKKwkJY2hhciAqYWN0aW9uOworCQljaGFyICplbnZfcGF0aDsKKwkJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPSAicmVtb3ZlXDBhZGRcMCI7CisJCWVudW0geyBPUF9yZW1vdmUgPSAwLCBPUF9hZGQgfTsKKwkJc21hbGx1aW50IG9wOworCisJCS8qIEhvdHBsdWc6CisJCSAqIGVudiBBQ1RJT049Li4uIERFVlBBVEg9Li4uIFNVQlNZU1RFTT0uLi4gW1NFUU5VTT0uLi5dIG1kZXYKKwkJICogQUNUSU9OIGNhbiBiZSAiYWRkIiBvciAicmVtb3ZlIgorCQkgKiBERVZQQVRIIGlzIGxpa2UgIi9ibG9jay9zZGEiIG9yICIvY2xhc3MvaW5wdXQvbWljZSIKKwkJICovCisJCWFjdGlvbiA9IGdldGVudigiQUNUSU9OIik7CisJCWVudl9wYXRoID0gZ2V0ZW52KCJERVZQQVRIIik7CisJCUcuc3Vic3lzdGVtID0gZ2V0ZW52KCJTVUJTWVNURU0iKTsKKwkJaWYgKCFhY3Rpb24gfHwgIWVudl9wYXRoIC8qfHwgIUcuc3Vic3lzdGVtKi8pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWZ3ID0gZ2V0ZW52KCJGSVJNV0FSRSIpOworCQlvcCA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsIGFjdGlvbik7CisJCS8qIElmIGl0IGV4aXN0cywgZG9lcyAvZGV2L21kZXYuc2VxIG1hdGNoICRTRVFOVU0/CisJCSAqIElmIGl0IGRvZXMgbm90IG1hdGNoLCBlYXJsaWVyIG1kZXYgaXMgcnVubmluZworCQkgKiBpbiBwYXJhbGxlbCwgYW5kIHdlIG5lZWQgdG8gd2FpdCAqLworCQlzZXEgPSBnZXRlbnYoIlNFUU5VTSIpOworCQlpZiAoc2VxKSB7CisJCQlpbnQgdGltZW91dCA9IDIwMDAgLyAzMjsgLyogMjAwMCBtc2VjICovCisJCQlkbyB7CisJCQkJaW50IHNlcWxlbjsKKwkJCQljaGFyIHNlcWJ1ZltzaXplb2YoaW50KSozICsgMl07CisKKwkJCQlzZXFsZW4gPSBvcGVuX3JlYWRfY2xvc2UoIm1kZXYuc2VxIiwgc2VxYnVmLCBzaXplb2Yoc2VxYnVmLTEpKTsKKwkJCQlpZiAoc2VxbGVuIDwgMCkgeworCQkJCQlzZXEgPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc2VxYnVmW3NlcWxlbl0gPSAnXDAnOworCQkJCWlmIChzZXFidWZbMF0gPT0gJ1xuJyAvKiBzZWVkIGZpbGU/ICovCisJCQkJIHx8IHN0cmNtcChzZXEsIHNlcWJ1ZikgPT0gMCAvKiBjb3JyZWN0IGlkeD8gKi8KKwkJCQkpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXVzbGVlcCgzMioxMDAwKTsKKwkJCX0gd2hpbGUgKC0tdGltZW91dCk7CisJCX0KKworCQlzbnByaW50Zih0ZW1wLCBQQVRIX01BWCwgIi9zeXMlcyIsIGVudl9wYXRoKTsKKwkJaWYgKG9wID09IE9QX3JlbW92ZSkgeworCQkJLyogSWdub3JpbmcgInJlbW92ZSBmaXJtd2FyZSIuIEl0IHdhcyByZXBvcnRlZAorCQkJICogdG8gaGFwcGVuIGFuZCB0byBjYXVzZSBlcnJvbmVvdXMgZGVsZXRpb24KKwkJCSAqIG9mIGRldmljZSBub2Rlcy4gKi8KKwkJCWlmICghZncpCisJCQkJbWFrZV9kZXZpY2UodGVtcCwgLypkZWxldGU6Ki8gMSk7CisJCX0KKwkJZWxzZSBpZiAob3AgPT0gT1BfYWRkKSB7CisJCQltYWtlX2RldmljZSh0ZW1wLCAvKmRlbGV0ZToqLyAwKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUpIHsKKwkJCQlpZiAoZncpCisJCQkJCWxvYWRfZmlybXdhcmUoZncsIHRlbXApOworCQkJfQorCQl9CisKKwkJaWYgKHNlcSkgeworCQkJeG9wZW5feHdyaXRlX2Nsb3NlKCJtZGV2LnNlcSIsIHV0b2EoeGF0b3Uoc2VxKSArIDEpKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJUkVMRUFTRV9DT05GSUdfQlVGRkVSKHRlbXApOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWluaXguaCBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWluaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGZiY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9taW5peC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBtaW5peCBpbm9kZSBsYXlvdXQgb24gZGlzay4KKyAqIE5vdGUgdGhlIDgtYml0IGdpZCBhbmQgYXRpbWUgYW5kIGN0aW1lLgorICovCitzdHJ1Y3QgbWluaXgxX2lub2RlIHsKKwl1aW50MTZfdCBpX21vZGU7CisJdWludDE2X3QgaV91aWQ7CisJdWludDMyX3QgaV9zaXplOworCXVpbnQzMl90IGlfdGltZTsKKwl1aW50OF90ICBpX2dpZDsKKwl1aW50OF90ICBpX25saW5rczsKKwl1aW50MTZfdCBpX3pvbmVbOV07Cit9OworCisvKgorICogVGhlIG5ldyBtaW5peCBpbm9kZSBoYXMgYWxsIHRoZSB0aW1lIGVudHJpZXMsIGFzIHdlbGwgYXMKKyAqIGxvbmcgYmxvY2sgbnVtYmVycyBhbmQgYSB0aGlyZCBpbmRpcmVjdCBibG9jayAoNysxKzErMQorICogaW5zdGVhZCBvZiA3KzErMSkuIEFsc28sIHNvbWUgcHJldmlvdXNseSA4LWJpdCB2YWx1ZXMgYXJlCisgKiBub3cgMTYtYml0LiBUaGUgaW5vZGUgaXMgbm93IDY0IGJ5dGVzIGluc3RlYWQgb2YgMzIuCisgKi8KK3N0cnVjdCBtaW5peDJfaW5vZGUgeworCXVpbnQxNl90IGlfbW9kZTsKKwl1aW50MTZfdCBpX25saW5rczsKKwl1aW50MTZfdCBpX3VpZDsKKwl1aW50MTZfdCBpX2dpZDsKKwl1aW50MzJfdCBpX3NpemU7CisJdWludDMyX3QgaV9hdGltZTsKKwl1aW50MzJfdCBpX210aW1lOworCXVpbnQzMl90IGlfY3RpbWU7CisJdWludDMyX3QgaV96b25lWzEwXTsKK307CisKKy8qCisgKiBtaW5peCBzdXBlcmJsb2NrIGRhdGEgb24gZGlzaworICovCitzdHJ1Y3QgbWluaXhfc3VwZXJibG9jayB7CisJdWludDE2X3Qgc19uaW5vZGVzOworCXVpbnQxNl90IHNfbnpvbmVzOworCXVpbnQxNl90IHNfaW1hcF9ibG9ja3M7CisJdWludDE2X3Qgc196bWFwX2Jsb2NrczsKKwl1aW50MTZfdCBzX2ZpcnN0ZGF0YXpvbmU7CisJdWludDE2X3Qgc19sb2dfem9uZV9zaXplOworCXVpbnQzMl90IHNfbWF4X3NpemU7CisJdWludDE2X3Qgc19tYWdpYzsKKwl1aW50MTZfdCBzX3N0YXRlOworCXVpbnQzMl90IHNfem9uZXM7Cit9OworCitzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5IHsKKwl1aW50MTZfdCBpbm9kZTsKKwljaGFyIG5hbWVbXTsKK307CisKKy8qIEJlbGlldmUgaXQgb3Igbm90LCBidXQgbW91bnQuaCBoYXMgdGhpcyBvbmUgI2RlZmluZWQgKi8KKyN1bmRlZiBCTE9DS19TSVpFCisKK2VudW0geworCUJMT0NLX1NJWkUgICAgICAgICAgICAgID0gMTAyNCwKKwlCSVRTX1BFUl9CTE9DSyAgICAgICAgICA9IEJMT0NLX1NJWkUgPDwgMywKKworCU1JTklYX1JPT1RfSU5PICAgICAgICAgID0gMSwKKwlNSU5JWF9CQURfSU5PICAgICAgICAgICA9IDIsCisKKwlNSU5JWDFfU1VQRVJfTUFHSUMgICAgICA9IDB4MTM3RiwgICAgICAgLyogb3JpZ2luYWwgbWluaXggZnMgKi8KKwlNSU5JWDFfU1VQRVJfTUFHSUMyICAgICA9IDB4MTM4RiwgICAgICAgLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8KKwlNSU5JWDJfU1VQRVJfTUFHSUMgICAgICA9IDB4MjQ2OCwgICAgICAgLyogbWluaXggVjIgZnMgKi8KKwlNSU5JWDJfU1VQRVJfTUFHSUMyICAgICA9IDB4MjQ3OCwgICAgICAgLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KKwlNSU5JWF9WQUxJRF9GUyAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyogY2xlYW4gZnMgKi8KKwlNSU5JWF9FUlJPUl9GUyAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyogZnMgaGFzIGVycm9ycyAqLworCisJSU5PREVfU0laRTEgICAgICAgICAgICAgPSBzaXplb2Yoc3RydWN0IG1pbml4MV9pbm9kZSksCisJSU5PREVfU0laRTIgICAgICAgICAgICAgPSBzaXplb2Yoc3RydWN0IG1pbml4Ml9pbm9kZSksCisJTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0sgPSBCTE9DS19TSVpFIC8gc2l6ZW9mKHN0cnVjdCBtaW5peDFfaW5vZGUpLAorCU1JTklYMl9JTk9ERVNfUEVSX0JMT0NLID0gQkxPQ0tfU0laRSAvIHNpemVvZihzdHJ1Y3QgbWluaXgyX2lub2RlKSwKK307CisKKy8qCitCYXNpYyB0ZXN0IHNjcmlwdCBmb3IgcmVncmVzc2lvbnMgaW4gbWtmcy9mc2NrLgorQ29waWVzIGN1cnJlbnQgZGlyIGludG8gaW1hZ2UgKHR5cGljYWxseSBiYm94IGJ1aWxkIHRyZWUpLgorCisjIS9iaW4vc2gKK3RtcGRpcj0vdG1wL21pbml4dGVzdC0kJAordG1waW1nPS90bXAvbWluaXgtaW1nLSQkCisKK21rZGlyICR0bXBkaXIKK2RkIGlmPS9kZXYvemVybyBvZj0kdG1waW1nIGJzPTFNIGNvdW50PTIwIHx8IGV4aXQKKy4vYnVzeWJveCBta2ZzLm1pbml4ICR0bXBpbWcgfHwgZXhpdAorbW91bnQgLW8gbG9vcCAkdG1waW1nICR0bXBkaXIgfHwgZXhpdAorY3AgLWEgIiRQV0QiICR0bXBkaXIKK3Vtb3VudCAkdG1wZGlyIHx8IGV4aXQKKy4vYnVzeWJveCBmc2NrLm1pbml4IC12Zm0gJHRtcGltZyB8fCBleGl0CitlY2hvICJDb250aW51ZT8iCityZWFkIGp1bmsKKy4vYnVzeWJveCBmc2NrLm1pbml4IC12Zm1sICR0bXBpbWcgfHwgZXhpdAorcm1kaXIgJHRtcGRpcgorcm0gJHRtcGltZworCisqLwpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ta2ZzX2V4dDIuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWtmc19leHQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjY2M5YwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWtmc19leHQyLmMKQEAgLTAsMCArMSw2OTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1rZnNfZXh0MjogdXRpbGl0eSB0byBjcmVhdGUgRVhUMiBmaWxlc3lzdGVtCisgKiBpbnNwaXJlZCBieSBnZW5leHQyZnMKKyAqCisgKiBCdXN5Ym94J2VkICgyMDA5KSBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbWtmc19leHQyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLUZuXSAiCisvKiAvL3VzYWdlOiAgICAiWy1jfC1sIGZpbGVuYW1lXSAiICovCisvL3VzYWdlOiAgICAgICAiWy1iIEJMS19TSVpFXSAiCisvKiAvL3VzYWdlOiAgICAiWy1mIGZyYWdtZW50LXNpemVdIFstZyBibG9ja3MtcGVyLWdyb3VwXSAiICovCisvL3VzYWdlOiAgICAgICAiWy1pIElOT0RFX1JBVElPXSBbLUkgSU5PREVfU0laRV0gIgorLyogLy91c2FnZTogICAgIlstal0gWy1KIGpvdXJuYWwtb3B0aW9uc10gWy1OIG51bWJlci1vZi1pbm9kZXNdICIgKi8KKy8vdXNhZ2U6ICAgICAgICJbLW0gUkVTRVJWRURfUEVSQ0VOVF0gIgorLyogLy91c2FnZTogICAgIlstbyBjcmVhdG9yLW9zXSBbLU8gZmVhdHVyZVssLi4uXV0gWy1xXSAiICovCisvKiAvL3VzYWdlOiAgICAiW3IgZnMtcmV2aXNpb24tbGV2ZWxdIFstRSBleHRlbmRlZC1vcHRpb25zXSBbLXZdIFstRl0gIiAqLworLy91c2FnZTogICAgICAgIlstTCBMQUJFTF0gIgorLyogLy91c2FnZTogICAgIlstTSBsYXN0LW1vdW50ZWQtZGlyZWN0b3J5XSBbLVNdIFstVCBmaWxlc3lzdGVtLXR5cGVdICIgKi8KKy8vdXNhZ2U6ICAgICAgICJCTE9DS0RFViBbS0JZVEVTXSIKKy8vdXNhZ2U6I2RlZmluZSBta2ZzX2V4dDJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWIgQkxLX1NJWkUJQmxvY2sgc2l6ZSwgYnl0ZXMiCisvKiAvL3VzYWdlOiAgIlxuCS1jCQlDaGVjayBkZXZpY2UgZm9yIGJhZCBibG9ja3MiICovCisvKiAvL3VzYWdlOiAgIlxuCS1FIG9wdHMJCVNldCBleHRlbmRlZCBvcHRpb25zIiAqLworLyogLy91c2FnZTogICJcbgktZiBzaXplCQlGcmFnbWVudCBzaXplIGluIGJ5dGVzIiAqLworLy91c2FnZTogICAgICJcbgktRgkJRm9yY2UiCisvKiAvL3VzYWdlOiAgIlxuCS1nIE4JCU51bWJlciBvZiBibG9ja3MgaW4gYSBibG9jayBncm91cCIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLWkgUkFUSU8JTWF4IG51bWJlciBvZiBmaWxlcyBpcyBmaWxlc3lzdGVtX3NpemUgLyBSQVRJTyIKKy8vdXNhZ2U6ICAgICAiXG4JLUkgQllURVMJSW5vZGUgc2l6ZSAobWluIDEyOCkiCisvKiAvL3VzYWdlOiAgIlxuCS1qCQlDcmVhdGUgYSBqb3VybmFsIChleHQzKSIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLUogb3B0cwkJU2V0IGpvdXJuYWwgb3B0aW9ucyAoc2l6ZS9kZXZpY2UpIiAqLworLyogLy91c2FnZTogICJcbgktbCBmaWxlCQlSZWFkIGJhZCBibG9ja3MgbGlzdCBmcm9tIGZpbGUiICovCisvL3VzYWdlOiAgICAgIlxuCS1MIExCTAkJVm9sdW1lIGxhYmVsIgorLy91c2FnZTogICAgICJcbgktbSBQRVJDRU5UCVBlcmNlbnQgb2YgYmxvY2tzIHRvIHJlc2VydmUgZm9yIGFkbWluIgorLyogLy91c2FnZTogICJcbgktTSBkaXIJCVNldCBsYXN0IG1vdW50ZWQgZGlyZWN0b3J5IiAqLworLy91c2FnZTogICAgICJcbgktbgkJRHJ5IHJ1biIKKy8qIC8vdXNhZ2U6ICAiXG4JLU4gTgkJTnVtYmVyIG9mIGlub2RlcyB0byBjcmVhdGUiICovCisvKiAvL3VzYWdlOiAgIlxuCS1vIG9zCQlTZXQgdGhlICdjcmVhdG9yIG9zJyBmaWVsZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLU8gZmVhdHVyZXMJRGlyX2luZGV4L2ZpbGV0eXBlL2hhc19qb3VybmFsL2pvdXJuYWxfZGV2L3NwYXJzZV9zdXBlciIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLXEJCVF1aWV0IiAqLworLyogLy91c2FnZTogICJcbgktciByZXYJCVNldCBmaWxlc3lzdGVtIHJldmlzaW9uIiAqLworLyogLy91c2FnZTogICJcbgktUwkJV3JpdGUgc3VwZXJibG9jayBhbmQgZ3JvdXAgZGVzY3JpcHRvcnMgb25seSIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLVQgZnMtdHlwZQlTZXQgdXNhZ2UgdHlwZSAobmV3cy9sYXJnZWZpbGUvbGFyZ2VmaWxlNCkiICovCisvKiAvL3VzYWdlOiAgIlxuCS12CQlWZXJib3NlIiAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KKworI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfUkVTRVJWRURfR0RUIDAKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfTUtGU19FWFQyX0RJUl9JTkRFWCAgICAxCisKKy8vIGZyb20gZTJmc3Byb2dzCisjZGVmaW5lIHNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyBzX3BhZGRpbmcxCisjZGVmaW5lIHNfbWtmc190aW1lICAgICAgICAgICBzX3Jlc2VydmVkWzBdCisjZGVmaW5lIHNfZmxhZ3MgICAgICAgICAgICAgICBzX3Jlc2VydmVkWzIyXQorCisjZGVmaW5lIEVYVDJfSEFTSF9IQUxGX01ENCAgICAgICAxCisjZGVmaW5lIEVYVDJfRkxBR1NfU0lHTkVEX0hBU0ggICAweDAwMDEKKyNkZWZpbmUgRVhUMl9GTEFHU19VTlNJR05FRF9IQVNIIDB4MDAwMgorCisvLyBzdG9yYWdlIGhlbHBlcnMKK2NoYXIgQlVHX3dyb25nX2ZpZWxkX3NpemUodm9pZCk7CisjZGVmaW5lIFNUT1JFX0xFKGZpZWxkLCB2YWx1ZSkgXAorZG8geyBcCisJaWYgKHNpemVvZihmaWVsZCkgPT0gNCkgXAorCQlmaWVsZCA9IFNXQVBfTEUzMih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDIpIFwKKwkJZmllbGQgPSBTV0FQX0xFMTYodmFsdWUpOyBcCisJZWxzZSBpZiAoc2l6ZW9mKGZpZWxkKSA9PSAxKSBcCisJCWZpZWxkID0gKHZhbHVlKTsgXAorCWVsc2UgXAorCQlCVUdfd3JvbmdfZmllbGRfc2l6ZSgpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZFVENIX0xFMzIoZmllbGQpIFwKKwkoc2l6ZW9mKGZpZWxkKSA9PSA0ID8gU1dBUF9MRTMyKGZpZWxkKSA6IEJVR193cm9uZ19maWVsZF9zaXplKCkpCisKKy8vIEFsbCBmaWVsZHMgYXJlIGxpdHRsZS1lbmRpYW4KK3N0cnVjdCBleHQyX2RpciB7CisJdWludDMyX3QgaW5vZGUxOworCXVpbnQxNl90IHJlY19sZW4xOworCXVpbnQ4X3QgIG5hbWVfbGVuMTsKKwl1aW50OF90ICBmaWxlX3R5cGUxOworCWNoYXIgICAgIG5hbWUxWzRdOworCXVpbnQzMl90IGlub2RlMjsKKwl1aW50MTZfdCByZWNfbGVuMjsKKwl1aW50OF90ICBuYW1lX2xlbjI7CisJdWludDhfdCAgZmlsZV90eXBlMjsKKwljaGFyICAgICBuYW1lMls0XTsKKwl1aW50MzJfdCBpbm9kZTM7CisJdWludDE2X3QgcmVjX2xlbjM7CisJdWludDhfdCAgbmFtZV9sZW4zOworCXVpbnQ4X3QgIGZpbGVfdHlwZTM7CisJY2hhciAgICAgbmFtZTNbMTJdOworfTsKKworc3RhdGljIHVuc2lnbmVkIGludF9sb2cyKHVuc2lnbmVkIGFyZykKK3sKKwl1bnNpZ25lZCByID0gMDsKKwl3aGlsZSAoKGFyZyA+Pj0gMSkgIT0gMCkKKwkJcisrOworCXJldHVybiByOworfQorCisvLyB0YWtlbiBmcm9tIG1rZnNfbWluaXguYy4gbGliYmIgY2FuZGlkYXRlPworLy8gInVpbnQzMl90IHNpemUiLCBzaW5jZSB3ZSBuZXZlciB1c2UgaXQgZm9yIGFueXRoaW5nID4zMiBiaXRzCitzdGF0aWMgdWludDMyX3QgZGl2X3JvdW5kdXAodWludDMyX3Qgc2l6ZSwgdWludDMyX3QgbikKK3sKKwkvLyBPdmVyZmxvdy1yZXNpc3RhbnQKKwl1aW50MzJfdCByZXMgPSBzaXplIC8gbjsKKwlpZiAocmVzICogbiAhPSBzaXplKQorCQlyZXMrKzsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBhbGxvY2F0ZSh1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJsb2Nrc2l6ZSwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCkKK3sKKwl1aW50MzJfdCBpOworCisvL2JiX2luZm9fbXNnKCJBTExPQzogWyV1XVsldV1bJXVdOiBbJXUtJXVdOj1bJXhdLFsleF0iLCBibG9ja3NpemUsIHN0YXJ0LCBlbmQsIHN0YXJ0LzgsIGJsb2Nrc2l6ZSAtIGVuZC84IC0gMSwgKDEgPDwgKHN0YXJ0ICYgNykpIC0gMSwgKHVpbnQ4X3QpKDB4RkYwMCA+PiAoZW5kICYgNykpKTsKKwltZW1zZXQoYml0bWFwLCAwLCBibG9ja3NpemUpOworCWkgPSBzdGFydCAvIDg7CisJbWVtc2V0KGJpdG1hcCwgMHhGRiwgaSk7CisJYml0bWFwW2ldID0gKDEgPDwgKHN0YXJ0ICYgNykpIC0gMTsgLy8wLi43ID0+IDAwMDAwMDAwLi4wMTExMTExMQorCWkgPSBlbmQgLyA4OworCWJpdG1hcFtibG9ja3NpemUgLSBpIC0gMV0gfD0gMHg3RjAwID4+IChlbmQgJiA3KTsgLy8wLi43ID0+IDAwMDAwMDAwLi4xMTExMTExMAorCW1lbXNldChiaXRtYXAgKyBibG9ja3NpemUgLSBpLCAweEZGLCBpKTsgLy8gTi5CLiBubyBvdmVyZmxvdyBoZXJlIQorfQorCitzdGF0aWMgdWludDMyX3QgaGFzX3N1cGVyKHVpbnQzMl90IHgpCit7CisJLy8gMCwgMSBhbmQgcG93ZXJzIG9mIDMsIDUsIDcgdXAgdG8gMl4zMiBsaW1pdAorCXN0YXRpYyBjb25zdCB1aW50MzJfdCBzdXBlcnNbXSA9IHsKKwkJMCwgMSwgMywgNSwgNywgOSwgMjUsIDI3LCA0OSwgODEsIDEyNSwgMjQzLCAzNDMsIDYyNSwgNzI5LAorCQkyMTg3LCAyNDAxLCAzMTI1LCA2NTYxLCAxNTYyNSwgMTY4MDcsIDE5NjgzLCA1OTA0OSwgNzgxMjUsCisJCTExNzY0OSwgMTc3MTQ3LCAzOTA2MjUsIDUzMTQ0MSwgODIzNTQzLCAxNTk0MzIzLCAxOTUzMTI1LAorCQk0NzgyOTY5LCA1NzY0ODAxLCA5NzY1NjI1LCAxNDM0ODkwNywgNDAzNTM2MDcsIDQzMDQ2NzIxLAorCQk0ODgyODEyNSwgMTI5MTQwMTYzLCAyNDQxNDA2MjUsIDI4MjQ3NTI0OSwgMzg3NDIwNDg5LAorCQkxMTYyMjYxNDY3LCAxMjIwNzAzMTI1LCAxOTc3MzI2NzQzLCAzNDg2Nzg0NDAxLyogPjJeMzEgKi8sCisJfTsKKwljb25zdCB1aW50MzJfdCAqc3AgPSBzdXBlcnMgKyBBUlJBWV9TSVpFKHN1cGVycyk7CisJd2hpbGUgKDEpIHsKKwkJc3AtLTsKKwkJaWYgKHggPT0gKnNwKQorCQkJcmV0dXJuIDE7CisJCWlmICh4ID4gKnNwKQorCQkJcmV0dXJuIDA7CisJfQorfQorCisjZGVmaW5lIGZkIDMJLyogcHJlZGVmaW5lZCBvdXRwdXQgZGVzY3JpcHRvciAqLworCitzdGF0aWMgdm9pZCBQVVQodWludDY0X3Qgb2ZmLCB2b2lkICpidWYsIHVpbnQzMl90IHNpemUpCit7CisvLwliYl9pbmZvX21zZygiUFVUWyVsbHVdOlsldV0iLCBvZmYsIHNpemUpOworCXhsc2VlayhmZCwgb2ZmLCBTRUVLX1NFVCk7CisJeHdyaXRlKGZkLCBidWYsIHNpemUpOworfQorCisvLyAxMjggYW5kIDI1Ni1ieXRlIGlub2RlczoKKy8vIDEyOC1ieXRlIGlub2RlIGlzIGRlc2NyaWJlZCBieSBzdHJ1Y3QgZXh0Ml9pbm9kZS4KKy8vIDI1Ni1ieXRlIG9uZSBqdXN0IGhhcyB0aGVzZSBmaWVsZHMgYXBwZW5kZWQ6CisvLyAgICAgIF9fdTE2ICAgaV9leHRyYV9pc2l6ZTsKKy8vICAgICAgX191MTYgICBpX3BhZDE7CisvLyAgICAgIF9fdTMyICAgaV9jdGltZV9leHRyYTsgIC8qIGV4dHJhIENoYW5nZSB0aW1lIChuc2VjIDw8IDIgfCBlcG9jaCkgKi8KKy8vICAgICAgX191MzIgICBpX210aW1lX2V4dHJhOyAgLyogZXh0cmEgTW9kaWZpY2F0aW9uIHRpbWUgKG5zZWMgPDwgMiB8IGVwb2NoKSAqLworLy8gICAgICBfX3UzMiAgIGlfYXRpbWVfZXh0cmE7ICAvKiBleHRyYSBBY2Nlc3MgdGltZSAobnNlYyA8PCAyIHwgZXBvY2gpICovCisvLyAgICAgIF9fdTMyICAgaV9jcnRpbWU7ICAgICAgIC8qIEZpbGUgY3JlYXRpb24gdGltZSAqLworLy8gICAgICBfX3UzMiAgIGlfY3J0aW1lX2V4dHJhOyAvKiBleHRyYSBGaWxlIGNyZWF0aW9uIHRpbWUgKG5zZWMgPDwgMiB8IGVwb2NoKSovCisvLyAgICAgIF9fdTMyICAgaV92ZXJzaW9uX2hpOyAgIC8qIGhpZ2ggMzIgYml0cyBmb3IgNjQtYml0IHZlcnNpb24gKi8KKy8vIHRoZSByZXN0IGlzIHBhZGRpbmcuCisvLworLy8gbGludXgvZXh0Ml9mcy5oIGhhcyAiI2RlZmluZSBpX3NpemVfaGlnaCBpX2Rpcl9hY2wiIHdoaWNoIHN1Z2dlc3RzIHRoYXQgZXZlbgorLy8gMTI4LWJ5dGUgaW5vZGUgaXMgY2FwYWJsZSBvZiBkZXNjcmliaW5nIGxhcmdlIGZpbGVzIChpX2Rpcl9hY2wgaXMgbWVhbmluZ2Z1bAorLy8gb25seSBmb3IgZGlyZWN0b3JpZXMsIHdoaWNoIG5ldmVyIG5lZWQgaV9zaXplX2hpZ2gpLgorLy8KKy8vIFN0YW5kYXJkIG1rZTJmcyBjcmVhdGVzIGEgZmlsZXN5c3RlbSB3aXRoIDI1Ni1ieXRlIGlub2RlcyBpZiBpdCBpcworLy8gYmlnZ2VyIHRoYW4gMC41R0IuCisKKy8vIFN0YW5kYXJkIG1rZTJmcyAxLjQxLjk6CisvLyBVc2FnZTogbWtlMmZzIFstY3wtbCBmaWxlbmFtZV0gWy1iIGJsb2NrLXNpemVdIFstZiBmcmFnbWVudC1zaXplXQorLy8JWy1pIGJ5dGVzLXBlci1pbm9kZV0gWy1JIGlub2RlLXNpemVdIFstSiBqb3VybmFsLW9wdGlvbnNdCisvLwlbLUcgbWV0YSBncm91cCBzaXplXSBbLU4gbnVtYmVyLW9mLWlub2Rlc10KKy8vCVstbSByZXNlcnZlZC1ibG9ja3MtcGVyY2VudGFnZV0gWy1vIGNyZWF0b3Itb3NdCisvLwlbLWcgYmxvY2tzLXBlci1ncm91cF0gWy1MIHZvbHVtZS1sYWJlbF0gWy1NIGxhc3QtbW91bnRlZC1kaXJlY3RvcnldCisvLwlbLU8gZmVhdHVyZVssLi4uXV0gWy1yIGZzLXJldmlzaW9uXSBbLUUgZXh0ZW5kZWQtb3B0aW9uWywuLi5dXQorLy8JWy1UIGZzLXR5cGVdIFstVSBVVUlEXSBbLWpucXZGU1ZdIGRldmljZSBbYmxvY2tzLWNvdW50XQorLy8KKy8vIE9wdGlvbnMgbm90IGNvbW1lbnRlZCBiZWxvdyBhcmUgdGFrZW4gYnV0IHNpbGVudGx5IGlnbm9yZWQ6CitlbnVtIHsKKwlPUFRfYyA9IDEgPDwgMCwKKwlPUFRfbCA9IDEgPDwgMSwKKwlPUFRfYiA9IDEgPDwgMiwJCS8vIGJsb2NrIHNpemUsIGluIGJ5dGVzCisJT1BUX2YgPSAxIDw8IDMsCisJT1BUX2kgPSAxIDw8IDQsCQkvLyBieXRlcyBwZXIgaW5vZGUKKwlPUFRfSSA9IDEgPDwgNSwJCS8vIGN1c3RvbSBpbm9kZSBzaXplLCBpbiBieXRlcworCU9QVF9KID0gMSA8PCA2LAorCU9QVF9HID0gMSA8PCA3LAorCU9QVF9OID0gMSA8PCA4LAorCU9QVF9tID0gMSA8PCA5LAkJLy8gcGVyY2VudGFnZSBvZiBibG9ja3MgcmVzZXJ2ZWQgZm9yIHN1cGVydXNlcgorCU9QVF9vID0gMSA8PCAxMCwKKwlPUFRfZyA9IDEgPDwgMTEsCisJT1BUX0wgPSAxIDw8IDEyLAkvLyBsYWJlbAorCU9QVF9NID0gMSA8PCAxMywKKwlPUFRfTyA9IDEgPDwgMTQsCisJT1BUX3IgPSAxIDw8IDE1LAorCU9QVF9FID0gMSA8PCAxNiwKKwlPUFRfVCA9IDEgPDwgMTcsCisJT1BUX1UgPSAxIDw8IDE4LAorCU9QVF9qID0gMSA8PCAxOSwKKwlPUFRfbiA9IDEgPDwgMjAsCS8vIGRyeSBydW46IGRvIG5vdCB3cml0ZSBhbnl0aGluZworCU9QVF9xID0gMSA8PCAyMSwKKwlPUFRfdiA9IDEgPDwgMjIsCisJT1BUX0YgPSAxIDw8IDIzLAorCU9QVF9TID0gMSA8PCAyNCwKKwkvL09QVF9WID0gMSA8PCAyNSwJLy8gLVYgdmVyc2lvbi4gYmJveCBhcHBsZXRzIGRvbid0IHN1cHBvcnQgdGhhdAorfTsKKworaW50IG1rZnNfZXh0Ml9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtmc19leHQyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBpLCBwb3MsIG47CisJdW5zaWduZWQgYnMsIGJwaTsKKwl1bnNpZ25lZCBibG9ja3NpemUsIGJsb2Nrc2l6ZV9sb2cyOworCXVuc2lnbmVkIGlub2Rlc2l6ZSwgdXNlcl9pbm9kZXNpemU7CisJdW5zaWduZWQgcmVzZXJ2ZWRfcGVyY2VudCA9IDU7CisJdW5zaWduZWQgbG9uZyBsb25nIGtpbG9ieXRlczsKKwl1aW50MzJfdCBuYmxvY2tzLCBuYmxvY2tzX2Z1bGw7CisJdWludDMyX3QgbnJlc2VydmVkOworCXVpbnQzMl90IG5ncm91cHM7CisJdWludDMyX3QgYnl0ZXNfcGVyX2lub2RlOworCXVpbnQzMl90IGZpcnN0X2Jsb2NrOworCXVpbnQzMl90IGlub2Rlc19wZXJfZ3JvdXA7CisJdWludDMyX3QgZ3JvdXBfZGVzY19ibG9ja3M7CisJdWludDMyX3QgaW5vZGVfdGFibGVfYmxvY2tzOworCXVpbnQzMl90IGxvc3RfYW5kX2ZvdW5kX2Jsb2NrczsKKwl0aW1lX3QgdGltZXN0YW1wOworCWNvbnN0IGNoYXIgKmxhYmVsID0gIiI7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiOyAvLyBzdXBlcmJsb2NrCisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZ2Q7IC8vIGdyb3VwIGRlc2NyaXB0b3JzCisJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlOworCXN0cnVjdCBleHQyX2RpciAqZGlyOworCXVpbnQ4X3QgKmJ1ZjsKKworCS8vIHVzaW5nIGdsb2JhbCAib3B0aW9uX21hc2szMiIgaW5zdGVhZCBvZiBsb2NhbCAib3B0cyI6CisJLy8gd2UgYXJlIHJlZ2lzdGVyIHN0YXJ2ZWQgaGVyZQorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOmIrOmkrOkkrOm0rIjsKKwkvKm9wdHMgPSovIGdldG9wdDMyKGFyZ3YsICJjbDpiOmY6aTpJOko6RzpOOm06bzpnOkw6TTpPOnI6RTpUOlU6am5xdkZTIiwKKwkJLypsYmZpOiovIE5VTEwsICZicywgTlVMTCwgJmJwaSwKKwkJLypJSkdOOiovICZ1c2VyX2lub2Rlc2l6ZSwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJLyptb2dMOiovICZyZXNlcnZlZF9wZXJjZW50LCBOVUxMLCBOVUxMLCAmbGFiZWwsCisJCS8qTU9yRToqLyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkvKlRVOiovIE5VTEwsIE5VTEwpOworCWFyZ3YgKz0gb3B0aW5kOyAvLyBhcmd2WzBdIC0tIGRldmljZQorCisJLy8gb3BlbiB0aGUgZGV2aWNlLCBjaGVjayB0aGUgZGV2aWNlIGlzIGEgYmxvY2sgZGV2aWNlCisJeG1vdmVfZmQoeG9wZW4oYXJndlswXSwgT19XUk9OTFkpLCBmZCk7CisJeGZzdGF0KGZkLCAmc3QsIGFyZ3ZbMF0pOworCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSAmJiAhKG9wdGlvbl9tYXNrMzIgJiBPUFRfRikpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm90IGEgYmxvY2sgZGV2aWNlIiwgYXJndlswXSk7CisKKwkvLyBjaGVjayBpZiBpdCBpcyBtb3VudGVkCisJLy8gTi5CLiB3aGF0IGlmIHdlIGZvcm1hdCBhIGZpbGU/IGZpbmRfbW91bnRfcG9pbnQgd2lsbCByZXR1cm4gZmFsc2UgbmVnYXRpdmUgc2luY2UKKwkvLyBpdCBpcyBsb29wIGJsb2NrIGRldmljZSB3aGljaCBpcyBtb3VudGVkIQorCWlmIChmaW5kX21vdW50X3BvaW50KGFyZ3ZbMF0sIDApKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZm9ybWF0IG1vdW50ZWQgZmlsZXN5c3RlbSIpOworCisJLy8gZ2V0IHNpemUgaW4ga2J5dGVzCisJa2lsb2J5dGVzID0gZ2V0X3ZvbHVtZV9zaXplX2luX2J5dGVzKGZkLCBhcmd2WzFdLCAxMDI0LCAvKmV4dGVuZDoqLyAhKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikpIC8gMTAyNDsKKworCWJ5dGVzX3Blcl9pbm9kZSA9IDE2Mzg0OworCWlmIChraWxvYnl0ZXMgPCA1MTIqMTAyNCkKKwkJYnl0ZXNfcGVyX2lub2RlID0gNDA5NjsKKwlpZiAoa2lsb2J5dGVzIDwgMyoxMDI0KQorCQlieXRlc19wZXJfaW5vZGUgPSA4MTkyOworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2kpCisJCWJ5dGVzX3Blcl9pbm9kZSA9IGJwaTsKKworCS8vIERldGVybWluZSBibG9jayBzaXplIGFuZCBpbm9kZSBzaXplCisJLy8gYmxvY2sgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDEwMjQKKwkvLyBpbm9kZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTI4CisJYmxvY2tzaXplID0gMTAyNDsKKwlpbm9kZXNpemUgPSBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpOyAvLyAxMjgKKwlpZiAoa2lsb2J5dGVzID49IDUxMioxMDI0KSB7IC8vIG1rZTJmcyAxLjQxLjkgY29tcGF0CisJCWJsb2Nrc2l6ZSA9IDQwOTY7CisJCWlub2Rlc2l6ZSA9IDI1NjsKKwl9CisJaWYgKEVYVDJfTUFYX0JMT0NLX1NJWkUgPiA0MDk2KSB7CisJCS8vIGtpbG9ieXRlcyA+PiAyMiA9PSBzaXplIGluIDRnaWdhYnl0ZSBjaHVua3MuCisJCS8vIGlmIHNpemUgPj0gMTZrIGdpZ3MsIGJsb2Nrc2l6ZSBtdXN0IGJlIGluY3JlYXNlZC4KKwkJLy8gVHJ5ICJta2UyZnMgLUYgaW1hZ2UgJCgoMTYgKiAxMDI0KjEwMjQqMTAyNCkpIgorCQl3aGlsZSAoKGtpbG9ieXRlcyA+PiAyMikgPj0gYmxvY2tzaXplKQorCQkJYmxvY2tzaXplICo9IDI7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2IpCisJCWJsb2Nrc2l6ZSA9IGJzOworCWlmIChibG9ja3NpemUgPCBFWFQyX01JTl9CTE9DS19TSVpFCisJIHx8IGJsb2Nrc2l6ZSA+IEVYVDJfTUFYX0JMT0NLX1NJWkUKKwkgfHwgKGJsb2Nrc2l6ZSAmIChibG9ja3NpemUgLSAxKSkgLy8gbm90IHBvd2VyIG9mIDIKKwkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJsb2Nrc2l6ZSAldSBpcyBiYWQiLCBibG9ja3NpemUpOworCX0KKwkvLyBEbyB3ZSBoYXZlIGN1c3RvbSBpbm9kZSBzaXplPworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0kpIHsKKwkJaWYgKHVzZXJfaW5vZGVzaXplIDwgc2l6ZW9mKCppbm9kZSkKKwkJIHx8IHVzZXJfaW5vZGVzaXplID4gYmxvY2tzaXplCisJCSB8fCAodXNlcl9pbm9kZXNpemUgJiAodXNlcl9pbm9kZXNpemUgLSAxKSkgLy8gbm90IHBvd2VyIG9mIDIKKwkJKSB7CisJCQliYl9lcnJvcl9tc2coIi0lYyBpcyBiYWQiLCAnSScpOworCQl9IGVsc2UgeworCQkJaW5vZGVzaXplID0gdXNlcl9pbm9kZXNpemU7CisJCX0KKwl9CisKKwlpZiAoKGludDMyX3QpYnl0ZXNfcGVyX2lub2RlIDwgYmxvY2tzaXplKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiLSVjIGlzIGJhZCIsICdpJyk7CisJLy8gbnVtYmVyIG9mIGJpdHMgaW4gb25lIGJsb2NrLCBpLmUuIDgqYmxvY2tzaXplCisjZGVmaW5lIGJsb2Nrc19wZXJfZ3JvdXAgKDggKiBibG9ja3NpemUpCisJZmlyc3RfYmxvY2sgPSAoRVhUMl9NSU5fQkxPQ0tfU0laRSA9PSBibG9ja3NpemUpOworCWJsb2Nrc2l6ZV9sb2cyID0gaW50X2xvZzIoYmxvY2tzaXplKTsKKworCS8vIERldGVybWluZSBudW1iZXIgb2YgYmxvY2tzCisJa2lsb2J5dGVzID4+PSAoYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRSk7CisJbmJsb2NrcyA9IGtpbG9ieXRlczsKKwlpZiAobmJsb2NrcyAhPSBraWxvYnl0ZXMpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJibG9jayBjb3VudCBkb2Vzbid0IGZpdCBpbiAzMiBiaXRzIik7CisjZGVmaW5lIGtpbG9ieXRlcyBraWxvYnl0ZXNfdW51c2VkX2FmdGVyX3RoaXMKKwkvLyBFeHBlcmltZW50YWxseSwgc3RhbmRhcmQgbWtlMmZzIHdvbid0IHdvcmsgb24gaW1hZ2VzIHNtYWxsZXIgdGhhbiA2MGsKKwlpZiAobmJsb2NrcyA8IDYwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibmVlZCA+PSA2MCBibG9ja3MiKTsKKworCS8vIEhvdyBtYW55IHJlc2VydmVkIGJsb2Nrcz8KKwlpZiAocmVzZXJ2ZWRfcGVyY2VudCA+IDUwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiLSVjIGlzIGJhZCIsICdtJyk7CisJbnJlc2VydmVkID0gKHVpbnQ2NF90KW5ibG9ja3MgKiByZXNlcnZlZF9wZXJjZW50IC8gMTAwOworCisJLy8gTi5CLiBraWxsaW5nIGUyZnNwcm9ncyBmZWF0dXJlISBVbnVzZWQgYmxvY2tzIGRvbid0IGFjY291bnQgaW4gY2FsY3VsYXRpb25zCisJbmJsb2Nrc19mdWxsID0gbmJsb2NrczsKKworCS8vIElmIGxhc3QgYmxvY2sgZ3JvdXAgaXMgdG9vIHNtYWxsLCBuYmxvY2tzIG1heSBiZSBkZWNyZWFzZWQgaW4gb3JkZXIKKwkvLyB0byBkaXNjYXJkIGl0LCBhbmQgY29udHJvbCByZXR1cm5zIGhlcmUgdG8gcmVjYWxjdWxhdGUgc29tZQorCS8vIHBhcmFtZXRlcnMuCisJLy8gTm90ZTogYmxvY2tzaXplIGFuZCBieXRlc19wZXJfaW5vZGUgYXJlIG5ldmVyIHJlY2FsY3VsYXRlZC4KKyByZXRyeToKKwkvLyBOLkIuIGEgYmxvY2sgZ3JvdXAgY2FuIGhhdmUgbm8gbW9yZSB0aGFuIGJsb2Nrc19wZXJfZ3JvdXAgYmxvY2tzCisJbmdyb3VwcyA9IGRpdl9yb3VuZHVwKG5ibG9ja3MgLSBmaXJzdF9ibG9jaywgYmxvY2tzX3Blcl9ncm91cCk7CisKKwlncm91cF9kZXNjX2Jsb2NrcyA9IGRpdl9yb3VuZHVwKG5ncm91cHMsIGJsb2Nrc2l6ZSAvIHNpemVvZigqZ2QpKTsKKwkvLyBUT0RPOiByZXNlcnZlZCBibG9ja3MgbXVzdCBiZSBtYXJrZWQgYXMgc3VjaCBpbiB0aGUgYml0bWFwcywKKwkvLyBvciByZXN1bHRpbmcgZmlsZXN5c3RlbSBpcyBjb3JydXB0CisJaWYgKEVOQUJMRV9GRUFUVVJFX01LRlNfRVhUMl9SRVNFUlZFRF9HRFQpIHsKKwkJLyoKKwkJICogRnJvbSBlMmZzcHJvZ3M6IENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIEdEVCBibG9ja3MgdG8gcmVzZXJ2ZSBmb3Igb25saW5lCisJCSAqIGZpbGVzeXN0ZW0gZ3Jvd3RoLgorCQkgKiBUaGUgYWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgR0RUIGJsb2NrcyB3ZSBjYW4gcmVzZXJ2ZSBpcyBkZXRlcm1pbmVkIGJ5CisJCSAqIHRoZSBudW1iZXIgb2YgYmxvY2sgcG9pbnRlcnMgdGhhdCBjYW4gZml0IGludG8gYSBzaW5nbGUgYmxvY2suCisJCSAqIFdlIHNldCBpdCBhdCAxMDI0eCB0aGUgY3VycmVudCBmaWxlc3lzdGVtIHNpemUsIG9yCisJCSAqIHRoZSB1cHBlciBibG9jayBjb3VudCBsaW1pdCAoMl4zMiksIHdoaWNoZXZlciBpcyBsb3dlci4KKwkJICovCisJCXVpbnQzMl90IHJlc2VydmVkX2dyb3VwX2Rlc2NfYmxvY2tzID0gMHhGRkZGRkZGRjsgLy8gbWF4aW11bSBibG9jayBudW1iZXIKKwkJaWYgKG5ibG9ja3MgPCByZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyAvIDEwMjQpCisJCQlyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA9IG5ibG9ja3MgKiAxMDI0OworCQlyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA9IGRpdl9yb3VuZHVwKHJlc2VydmVkX2dyb3VwX2Rlc2NfYmxvY2tzIC0gZmlyc3RfYmxvY2ssIGJsb2Nrc19wZXJfZ3JvdXApOworCQlyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA9IGRpdl9yb3VuZHVwKHJlc2VydmVkX2dyb3VwX2Rlc2NfYmxvY2tzLCBibG9ja3NpemUgLyBzaXplb2YoKmdkKSkgLSBncm91cF9kZXNjX2Jsb2NrczsKKwkJaWYgKHJlc2VydmVkX2dyb3VwX2Rlc2NfYmxvY2tzID4gYmxvY2tzaXplIC8gc2l6ZW9mKHVpbnQzMl90KSkKKwkJCXJlc2VydmVkX2dyb3VwX2Rlc2NfYmxvY2tzID0gYmxvY2tzaXplIC8gc2l6ZW9mKHVpbnQzMl90KTsKKwkJLy9UT0RPOiBTVE9SRV9MRShzYi0+c19yZXNlcnZlZF9nZHRfYmxvY2tzLCByZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2Nrcyk7CisJCWdyb3VwX2Rlc2NfYmxvY2tzICs9IHJlc2VydmVkX2dyb3VwX2Rlc2NfYmxvY2tzOworCX0KKworCXsKKwkJLy8gTi5CLiBlMmZzcHJvZ3MgZG9lcyBhcyBmb2xsb3dzIQorCQl1aW50MzJfdCBvdmVyaGVhZCwgcmVtYWluZGVyOworCQkvLyBuaW5vZGVzIGlzIHRoZSBtYXggbnVtYmVyIG9mIGlub2RlcyBpbiB0aGlzIGZpbGVzeXN0ZW0KKwkJdWludDMyX3Qgbmlub2RlcyA9ICgodWludDY0X3QpIG5ibG9ja3NfZnVsbCAqIGJsb2Nrc2l6ZSkgLyBieXRlc19wZXJfaW5vZGU7CisJCWlmIChuaW5vZGVzIDwgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8rMSkKKwkJCW5pbm9kZXMgPSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTysxOworCQlpbm9kZXNfcGVyX2dyb3VwID0gZGl2X3JvdW5kdXAobmlub2Rlcywgbmdyb3Vwcyk7CisJCS8vIG1pbmltdW0gbnVtYmVyIGJlY2F1c2UgdGhlIGZpcnN0IEVYVDJfR09PRF9PTERfRklSU1RfSU5PLTEgYXJlIHJlc2VydmVkCisJCWlmIChpbm9kZXNfcGVyX2dyb3VwIDwgMTYpCisJCQlpbm9kZXNfcGVyX2dyb3VwID0gMTY7CisJCS8vIGEgYmxvY2sgZ3JvdXAgY2FuJ3QgaGF2ZSBtb3JlIGlub2RlcyB0aGFuIGJsb2NrcworCQlpZiAoaW5vZGVzX3Blcl9ncm91cCA+IGJsb2Nrc19wZXJfZ3JvdXApCisJCQlpbm9kZXNfcGVyX2dyb3VwID0gYmxvY2tzX3Blcl9ncm91cDsKKwkJLy8gYWRqdXN0IGlub2RlcyBwZXIgZ3JvdXAgc28gdGhleSBjb21wbGV0ZWx5IGZpbGwgdGhlIGlub2RlIHRhYmxlIGJsb2NrcyBpbiB0aGUgZGVzY3JpcHRvcgorCQlpbm9kZXNfcGVyX2dyb3VwID0gKGRpdl9yb3VuZHVwKGlub2Rlc19wZXJfZ3JvdXAgKiBpbm9kZXNpemUsIGJsb2Nrc2l6ZSkgKiBibG9ja3NpemUpIC8gaW5vZGVzaXplOworCQkvLyBtYWtlIHN1cmUgdGhlIG51bWJlciBvZiBpbm9kZXMgcGVyIGdyb3VwIGlzIGEgbXVsdGlwbGUgb2YgOAorCQlpbm9kZXNfcGVyX2dyb3VwICY9IH43OworCQlpbm9kZV90YWJsZV9ibG9ja3MgPSBkaXZfcm91bmR1cChpbm9kZXNfcGVyX2dyb3VwICogaW5vZGVzaXplLCBibG9ja3NpemUpOworCisJCS8vIHRvIGJlIHVzZWZ1bCwgbG9zdCtmb3VuZCBzaG91bGQgb2NjdXB5IGF0IGxlYXN0IDIgYmxvY2tzIChidXQgbm90IGV4Y2VlZGluZyAxNioxMDI0IGJ5dGVzKSwKKwkJLy8gYW5kIGF0IG1vc3QgRVhUMl9ORElSX0JMT0NLUy4gU28gcmVzZXJ2ZSB0aGVzZSBibG9ja3MgcmlnaHQgbm93CisJCS8qIE9yIGUyZnNwcm9ncyBjb21tZW50IHZlcmJhdGltICh3aGF0IGRvZXMgaXQgbWVhbj8pOgorCQkgKiBFbnN1cmUgdGhhdCBsb3N0K2ZvdW5kIGlzIGF0IGxlYXN0IDIgYmxvY2tzLCBzbyB3ZSBhbHdheXMKKwkJICogdGVzdCBsYXJnZSBlbXB0eSBibG9ja3MgZm9yIGJpZy1ibG9jayBmaWxlc3lzdGVtcy4gKi8KKwkJbG9zdF9hbmRfZm91bmRfYmxvY2tzID0gTUlOKEVYVDJfTkRJUl9CTE9DS1MsIDE2ID4+IChibG9ja3NpemVfbG9nMiAtIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKSk7CisKKwkJLy8gdGhlIGxhc3QgZ3JvdXAgbmVlZHMgbW9yZSBhdHRlbnRpb246IGlzbid0IGl0IHRvbyBzbWFsbCBmb3IgcG9zc2libGUgb3ZlcmhlYWQ/CisJCW92ZXJoZWFkID0gKGhhc19zdXBlcihuZ3JvdXBzIC0gMSkgPyAoMS8qc2IqLyArIGdyb3VwX2Rlc2NfYmxvY2tzKSA6IDApICsgMS8qYmJtcCovICsgMS8qaWJtcCovICsgaW5vZGVfdGFibGVfYmxvY2tzOworCQlyZW1haW5kZXIgPSAobmJsb2NrcyAtIGZpcnN0X2Jsb2NrKSAlIGJsb2Nrc19wZXJfZ3JvdXA7CisJCS8vLy9jYW4ndCBoYXBwZW4sIG5ibG9ja3MgPj0gNjAgZ3VhcmFudGVlcyB0aGlzCisJCS8vLy9pZiAoKDEgPT0gbmdyb3VwcykKKwkJLy8vLyAmJiByZW1haW5kZXIKKwkJLy8vLyAmJiAocmVtYWluZGVyIDwgb3ZlcmhlYWQgKyAxLyogIi8iICovICsgbG9zdF9hbmRfZm91bmRfYmxvY2tzKQorCQkvLy8vKSB7CisJCS8vLy8JYmJfZXJyb3JfbXNnX2FuZF9kaWUoIndheSBzbWFsbCBkZXZpY2UiKTsKKwkJLy8vL30KKworCQkvLyBTdGFuZGFyZCBta2UyZnMgdXNlcyA1MC4gTG9va3MgbGlrZSBhIGJ1ZyBpbiBvdXIgY2FsY3VsYXRpb24KKwkJLy8gb2YgInJlbWFpbmRlciIgb3IgIm92ZXJoZWFkIiAtIHdlIGRvbid0IG1hdGNoIHN0YW5kYXJkIG1rZTJmcworCQkvLyB3aGVuIHdlIHRyYW5zaXRpb24gZnJvbSBvbmUgZ3JvdXAgdG8gdHdvIGdyb3VwcworCQkvLyAoYSBiaXQgYWZ0ZXIgOE0gaW1hZ2Ugc2l6ZSksIGJ1dCBpdCB3b3JrcyBmb3IgdHdvLT50aHJlZSBncm91cHMKKwkJLy8gdHJhbnNpdGlvbiAoYXQgMTZNKS4KKwkJaWYgKHJlbWFpbmRlciAmJiAocmVtYWluZGVyIDwgb3ZlcmhlYWQgKyA1MCkpIHsKKy8vYmJfaW5mb19tc2coIkNIT1BbJXVdIiwgcmVtYWluZGVyKTsKKwkJCW5ibG9ja3MgLT0gcmVtYWluZGVyOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKworCWlmIChuYmxvY2tzX2Z1bGwgLSBuYmxvY2tzKQorCQlwcmludGYoIndhcm5pbmc6ICV1IGJsb2NrcyB1bnVzZWRcblxuIiwgbmJsb2Nrc19mdWxsIC0gbmJsb2Nrcyk7CisJcHJpbnRmKAorCQkiRmlsZXN5c3RlbSBsYWJlbD0lc1xuIgorCQkiT1MgdHlwZTogTGludXhcbiIKKwkJIkJsb2NrIHNpemU9JXUgKGxvZz0ldSlcbiIKKwkJIkZyYWdtZW50IHNpemU9JXUgKGxvZz0ldSlcbiIKKwkJIiV1IGlub2RlcywgJXUgYmxvY2tzXG4iCisJCSIldSBibG9ja3MgKCV1JSUpIHJlc2VydmVkIGZvciB0aGUgc3VwZXIgdXNlclxuIgorCQkiRmlyc3QgZGF0YSBibG9jaz0ldVxuIgorCQkiTWF4aW11bSBmaWxlc3lzdGVtIGJsb2Nrcz0ldVxuIgorCQkiJXUgYmxvY2sgZ3JvdXBzXG4iCisJCSIldSBibG9ja3MgcGVyIGdyb3VwLCAldSBmcmFnbWVudHMgcGVyIGdyb3VwXG4iCisJCSIldSBpbm9kZXMgcGVyIGdyb3VwIgorCQksIGxhYmVsCisJCSwgYmxvY2tzaXplLCBibG9ja3NpemVfbG9nMiAtIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFCisJCSwgYmxvY2tzaXplLCBibG9ja3NpemVfbG9nMiAtIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFCisJCSwgaW5vZGVzX3Blcl9ncm91cCAqIG5ncm91cHMsIG5ibG9ja3MKKwkJLCBucmVzZXJ2ZWQsIHJlc2VydmVkX3BlcmNlbnQKKwkJLCBmaXJzdF9ibG9jaworCQksIGdyb3VwX2Rlc2NfYmxvY2tzICogKGJsb2Nrc2l6ZSAvICh1bnNpZ25lZClzaXplb2YoKmdkKSkgKiBibG9ja3NfcGVyX2dyb3VwCisJCSwgbmdyb3VwcworCQksIGJsb2Nrc19wZXJfZ3JvdXAsIGJsb2Nrc19wZXJfZ3JvdXAKKwkJLCBpbm9kZXNfcGVyX2dyb3VwCisJKTsKKwl7CisJCWNvbnN0IGNoYXIgKmZtdCA9ICJcblN1cGVyYmxvY2sgYmFja3VwcyBzdG9yZWQgb24gYmxvY2tzOlxuIgorCQkJIlx0JXUiOworCQlwb3MgPSBmaXJzdF9ibG9jazsKKwkJZm9yIChpID0gMTsgaSA8IG5ncm91cHM7IGkrKykgeworCQkJcG9zICs9IGJsb2Nrc19wZXJfZ3JvdXA7CisJCQlpZiAoaGFzX3N1cGVyKGkpKSB7CisJCQkJcHJpbnRmKGZtdCwgKHVuc2lnbmVkKXBvcyk7CisJCQkJZm10ID0gIiwgJXUiOworCQkJfQorCQl9CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9uKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvLyBUT0RPOiAzLzUgcmVmdXNlIGlmIG1vdW50ZWQKKwkvLyBUT0RPOiA0LzUgY29tcGF0IG9wdGlvbnMKKwkvLyBUT0RPOiAxLzUgc2FuaXR5IGNoZWNrcworCS8vIFRPRE86IDAvNSBtb3JlIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMKKwkvLyBUT0RPOiA0LzUgYmlnZW5kaWFubmVzczogcmVjaGVjaywgd2FpdCBmb3IgQVJNIHJlcG9ydGVycworCS8vIFRPRE86IDIvNSByZXNlcnZlZCBHRFQ6IGhvdyB0byBtYXJrIGJ1dCBub3QgYWxsb2NhdGU/CisJLy8gVE9ETzogMy81IGRpcl9pbmRleD8KKworCS8vIGZpbGwgdGhlIHN1cGVyYmxvY2sKKwlzYiA9IHh6YWxsb2MoMTAyNCk7CisJU1RPUkVfTEUoc2ItPnNfcmV2X2xldmVsLCBFWFQyX0RZTkFNSUNfUkVWKTsgLy8gcmV2aXNpb24gMSBmaWxlc3lzdGVtCisJU1RPUkVfTEUoc2ItPnNfbWFnaWMsIEVYVDJfU1VQRVJfTUFHSUMpOworCVNUT1JFX0xFKHNiLT5zX2lub2RlX3NpemUsIGlub2Rlc2l6ZSk7CisJLy8gc2V0ICJSZXF1aXJlZCBleHRyYSBpc2l6ZSIgYW5kICJEZXNpcmVkIGV4dHJhIGlzaXplIiBmaWVsZHMgdG8gMjgKKwlpZiAoaW5vZGVzaXplICE9IHNpemVvZigqaW5vZGUpKQorCQlTVE9SRV9MRShzYi0+c19yZXNlcnZlZFsyMV0sIDB4MDAxQzAwMUMpOworCVNUT1JFX0xFKHNiLT5zX2ZpcnN0X2lubywgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOworCVNUT1JFX0xFKHNiLT5zX2xvZ19ibG9ja19zaXplLCBibG9ja3NpemVfbG9nMiAtIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKTsKKwlTVE9SRV9MRShzYi0+c19sb2dfZnJhZ19zaXplLCBibG9ja3NpemVfbG9nMiAtIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKTsKKwkvLyBmaXJzdCAxMDI0IGJ5dGVzIG9mIHRoZSBkZXZpY2UgYXJlIGZvciBib290IHJlY29yZC4gSWYgYmxvY2sgc2l6ZSBpcyAxMDI0IGJ5dGVzLCB0aGVuCisJLy8gdGhlIGZpcnN0IGJsb2NrIGlzIDEsIG90aGVyd2lzZSAwCisJU1RPUkVfTEUoc2ItPnNfZmlyc3RfZGF0YV9ibG9jaywgZmlyc3RfYmxvY2spOworCS8vIGJsb2NrIGFuZCBpbm9kZSBiaXRtYXBzIG9jY3VweSBubyBtb3JlIHRoYW4gb25lIGJsb2NrLCBzbyBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgaXMKKwlTVE9SRV9MRShzYi0+c19ibG9ja3NfcGVyX2dyb3VwLCBibG9ja3NfcGVyX2dyb3VwKTsKKwlTVE9SRV9MRShzYi0+c19mcmFnc19wZXJfZ3JvdXAsIGJsb2Nrc19wZXJfZ3JvdXApOworCS8vIGJsb2NrcworCVNUT1JFX0xFKHNiLT5zX2Jsb2Nrc19jb3VudCwgbmJsb2Nrcyk7CisJLy8gcmVzZXJ2ZSBibG9ja3MgZm9yIHN1cGVydXNlcgorCVNUT1JFX0xFKHNiLT5zX3JfYmxvY2tzX2NvdW50LCBucmVzZXJ2ZWQpOworCS8vIG5pbm9kZXMKKwlTVE9SRV9MRShzYi0+c19pbm9kZXNfcGVyX2dyb3VwLCBpbm9kZXNfcGVyX2dyb3VwKTsKKwlTVE9SRV9MRShzYi0+c19pbm9kZXNfY291bnQsIGlub2Rlc19wZXJfZ3JvdXAgKiBuZ3JvdXBzKTsKKwlTVE9SRV9MRShzYi0+c19mcmVlX2lub2Rlc19jb3VudCwgaW5vZGVzX3Blcl9ncm91cCAqIG5ncm91cHMgLSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTyk7CisJLy8gdGltZXN0YW1wcworCXRpbWVzdGFtcCA9IHRpbWUoTlVMTCk7CisJU1RPUkVfTEUoc2ItPnNfbWtmc190aW1lLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKHNiLT5zX3d0aW1lLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKHNiLT5zX2xhc3RjaGVjaywgdGltZXN0YW1wKTsKKwkvLyBtaXNjLiBWYWx1ZXMgYXJlIGNob3NlbiB0byBtYXRjaCBta2UyZnMgMS40MS45CisJU1RPUkVfTEUoc2ItPnNfc3RhdGUsIDEpOyAvLyBUT0RPOiB3aGF0J3MgMT8KKwlTVE9SRV9MRShzYi0+c19jcmVhdG9yX29zLCBFWFQyX09TX0xJTlVYKTsKKwlTVE9SRV9MRShzYi0+c19jaGVja2ludGVydmFsLCAyNCo2MCo2MCAqIDE4MCk7IC8vIDE4MCBkYXlzCisJU1RPUkVfTEUoc2ItPnNfZXJyb3JzLCBFWFQyX0VSUk9SU19ERUZBVUxUKTsKKwkvLyBta2UyZnMgMS40MS45IGFsc28gc2V0cyBFWFQzX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERQorCS8vIGFuZCBpZiA+PSAwLjVHQiwgRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFLgorCS8vIHdlIHVzZSB2YWx1ZXMgd2hpY2ggbWF0Y2ggIm1rZTJmcyAtTyBecmVzaXplX2lub2RlIjoKKwkvLyBpbiB0aGlzIGNhc2UgMS40MS45IG5ldmVyIHNldHMgRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFLgorCVNUT1JFX0xFKHNiLT5zX2ZlYXR1cmVfY29tcGF0LCBFWFQyX0ZFQVRVUkVfQ09NUEFUX1NVUFAKKwkJfCAoRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PICogRU5BQkxFX0ZFQVRVUkVfTUtGU19FWFQyX1JFU0VSVkVEX0dEVCkKKwkJfCAoRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVggKiBFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfRElSX0lOREVYKQorCSk7CisJU1RPUkVfTEUoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKTsKKwlTVE9SRV9MRShzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCwgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpOworCVNUT1JFX0xFKHNiLT5zX2ZsYWdzLCBFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0ggKiBFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfRElSX0lOREVYKTsKKwlnZW5lcmF0ZV91dWlkKHNiLT5zX3V1aWQpOworCWlmIChFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfRElSX0lOREVYKSB7CisJCVNUT1JFX0xFKHNiLT5zX2RlZl9oYXNoX3ZlcnNpb24sIEVYVDJfSEFTSF9IQUxGX01ENCk7CisJCWdlbmVyYXRlX3V1aWQoKHVpbnQ4X3QgKilzYi0+c19oYXNoX3NlZWQpOworCX0KKwkvKgorCSAqIEZyb20gZTJmc3Byb2dzOiBhZGQgImppdHRlciIgdG8gdGhlIHN1cGVyYmxvY2sncyBjaGVjayBpbnRlcnZhbCBzbyB0aGF0IHdlCisJICogZG9uJ3QgY2hlY2sgYWxsIHRoZSBmaWxlc3lzdGVtcyBhdCB0aGUgc2FtZSB0aW1lLiAgV2UgdXNlIGEKKwkgKiBrbHVkZ3kgaGFjayBvZiB1c2luZyB0aGUgVVVJRCB0byBkZXJpdmUgYSByYW5kb20gaml0dGVyIHZhbHVlLgorCSAqLworCVNUT1JFX0xFKHNiLT5zX21heF9tbnRfY291bnQsCisJCUVYVDJfREZMX01BWF9NTlRfQ09VTlQKKwkJKyAoc2ItPnNfdXVpZFtBUlJBWV9TSVpFKHNiLT5zX3V1aWQpLTFdICUgRVhUMl9ERkxfTUFYX01OVF9DT1VOVCkpOworCisJLy8gd3JpdGUgdGhlIGxhYmVsCisJc2FmZV9zdHJuY3B5KChjaGFyICopc2ItPnNfdm9sdW1lX25hbWUsIGxhYmVsLCBzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKworCS8vIGNhbGN1bGF0ZSBmaWxlc3lzdGVtIHNrZWxldG9uIHN0cnVjdHVyZXMKKwlnZCA9IHh6YWxsb2MoZ3JvdXBfZGVzY19ibG9ja3MgKiBibG9ja3NpemUpOworCWJ1ZiA9IHhtYWxsb2MoYmxvY2tzaXplKTsKKwlzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IDA7CisJZm9yIChpID0gMCwgcG9zID0gZmlyc3RfYmxvY2ssIG4gPSBuYmxvY2tzIC0gZmlyc3RfYmxvY2s7CisJCWkgPCBuZ3JvdXBzOworCQlpKyssIHBvcyArPSBibG9ja3NfcGVyX2dyb3VwLCBuIC09IGJsb2Nrc19wZXJfZ3JvdXAKKwkpIHsKKwkJdWludDMyX3Qgb3ZlcmhlYWQgPSBwb3MgKyAoaGFzX3N1cGVyKGkpID8gKDEvKnNiKi8gKyBncm91cF9kZXNjX2Jsb2NrcykgOiAwKTsKKwkJdWludDMyX3QgZnJlZV9ibG9ja3M7CisJCS8vIGZpbGwgZ3JvdXAgZGVzY3JpcHRvcnMKKwkJU1RPUkVfTEUoZ2RbaV0uYmdfYmxvY2tfYml0bWFwLCBvdmVyaGVhZCArIDApOworCQlTVE9SRV9MRShnZFtpXS5iZ19pbm9kZV9iaXRtYXAsIG92ZXJoZWFkICsgMSk7CisJCVNUT1JFX0xFKGdkW2ldLmJnX2lub2RlX3RhYmxlLCBvdmVyaGVhZCArIDIpOworCQlvdmVyaGVhZCA9IG92ZXJoZWFkIC0gcG9zICsgMS8qYmJtcCovICsgMS8qaWJtcCovICsgaW5vZGVfdGFibGVfYmxvY2tzOworCQlnZFtpXS5iZ19mcmVlX2lub2Rlc19jb3VudCA9IGlub2Rlc19wZXJfZ3JvdXA7CisJCS8vU1RPUkVfTEUoZ2RbaV0uYmdfdXNlZF9kaXJzX2NvdW50LCAwKTsKKwkJLy8gTi5CLiBib3RoICIvIiBhbmQgIi9sb3N0K2ZvdW5kIiBhcmUgd2l0aGluIHRoZSBmaXJzdCBibG9jayBncm91cAorCQkvLyAiLyIgb2NjdXBpZXMgMSBibG9jaywgIi9sb3N0K2ZvdW5kIiBvY2N1cGllcyBsb3N0X2FuZF9mb3VuZF9ibG9ja3MuLi4KKwkJaWYgKDAgPT0gaSkgeworCQkJLy8gLi4uIHRodXMgaW5jcmVhc2VkIG92ZXJoZWFkIGZvciB0aGUgZmlyc3QgYmxvY2sgZ3JvdXAgLi4uCisJCQlvdmVyaGVhZCArPSAxICsgbG9zdF9hbmRfZm91bmRfYmxvY2tzOworCQkJLy8gLi4uIGFuZCAyIHVzZWQgZGlyZWN0b3JpZXMKKwkJCVNUT1JFX0xFKGdkW2ldLmJnX3VzZWRfZGlyc19jb3VudCwgMik7CisJCQkvLyB3ZWxsIGtub3duIHJlc2VydmVkIGlub2RlcyBiZWxvbmcgdG8gdGhlIGZpcnN0IGJsb2NrIHRvbworCQkJZ2RbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQgLT0gRVhUMl9HT09EX09MRF9GSVJTVF9JTk87CisJCX0KKworCQkvLyBjYWNoZSBmcmVlIGJsb2NrIGNvdW50IG9mIHRoZSBncm91cAorCQlmcmVlX2Jsb2NrcyA9IChuIDwgYmxvY2tzX3Blcl9ncm91cCA/IG4gOiBibG9ja3NfcGVyX2dyb3VwKSAtIG92ZXJoZWFkOworCisJCS8vIG1hcmsgcHJlYWxsb2NhdGVkIGJsb2NrcyBhcyBhbGxvY2F0ZWQKKy8vYmJfaW5mb19tc2coIkFMTE9DOiBbJXVdWyV1XVsldV0iLCBibG9ja3NpemUsIG92ZXJoZWFkLCBibG9ja3NfcGVyX2dyb3VwIC0gKGZyZWVfYmxvY2tzICsgb3ZlcmhlYWQpKTsKKwkJYWxsb2NhdGUoYnVmLCBibG9ja3NpemUsCisJCQkvLyByZXNlcnZlICJvdmVyaGVhZCIgYmxvY2tzCisJCQlvdmVyaGVhZCwKKwkJCS8vIG1hcmsgdW51c2VkIHRyYWlsaW5nIGJsb2NrcworCQkJYmxvY2tzX3Blcl9ncm91cCAtIChmcmVlX2Jsb2NrcyArIG92ZXJoZWFkKQorCQkpOworCQkvLyBkdW1wIGJsb2NrIGJpdG1hcAorCQlQVVQoKHVpbnQ2NF90KShGRVRDSF9MRTMyKGdkW2ldLmJnX2Jsb2NrX2JpdG1hcCkpICogYmxvY2tzaXplLCBidWYsIGJsb2Nrc2l6ZSk7CisJCVNUT1JFX0xFKGdkW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50LCBmcmVlX2Jsb2Nrcyk7CisKKwkJLy8gbWFyayBwcmVhbGxvY2F0ZWQgaW5vZGVzIGFzIGFsbG9jYXRlZAorCQlhbGxvY2F0ZShidWYsIGJsb2Nrc2l6ZSwKKwkJCS8vIG1hcmsgcmVzZXJ2ZWQgaW5vZGVzCisJCQlpbm9kZXNfcGVyX2dyb3VwIC0gZ2RbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQsCisJCQkvLyBtYXJrIHVudXNlZCB0cmFpbGluZyBpbm9kZXMKKwkJCWJsb2Nrc19wZXJfZ3JvdXAgLSBpbm9kZXNfcGVyX2dyb3VwCisJCSk7CisJCS8vIGR1bXAgaW5vZGUgYml0bWFwCisJCS8vUFVUKCh1aW50NjRfdCkoRkVUQ0hfTEUzMihnZFtpXS5iZ19ibG9ja19iaXRtYXApKSAqIGJsb2Nrc2l6ZSwgYnVmLCBibG9ja3NpemUpOworCQkvL2J1dCBpdCdzIHJpZ2h0IGFmdGVyIGJsb2NrIGJpdG1hcCwgc28gd2UgY2FuIGp1c3Q6CisJCXh3cml0ZShmZCwgYnVmLCBibG9ja3NpemUpOworCQlTVE9SRV9MRShnZFtpXS5iZ19mcmVlX2lub2Rlc19jb3VudCwgZ2RbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQpOworCisJCS8vIGNvdW50IG92ZXJhbGwgZnJlZSBibG9ja3MKKwkJc2ItPnNfZnJlZV9ibG9ja3NfY291bnQgKz0gZnJlZV9ibG9ja3M7CisJfQorCVNUT1JFX0xFKHNiLT5zX2ZyZWVfYmxvY2tzX2NvdW50LCBzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCk7CisKKwkvLyBkdW1wIGZpbGVzeXN0ZW0gc2tlbGV0b24gc3RydWN0dXJlcworLy8JcHJpbnRmKCJXcml0aW5nIHN1cGVyYmxvY2tzIGFuZCBmaWxlc3lzdGVtIGFjY291bnRpbmcgaW5mb3JtYXRpb246ICIpOworCWZvciAoaSA9IDAsIHBvcyA9IGZpcnN0X2Jsb2NrOyBpIDwgbmdyb3VwczsgaSsrLCBwb3MgKz0gYmxvY2tzX3Blcl9ncm91cCkgeworCQkvLyBkdW1wIHN1cGVyYmxvY2sgYW5kIGdyb3VwIGRlc2NyaXB0b3JzIGFuZCB0aGVpciBiYWNrdXBzCisJCWlmIChoYXNfc3VwZXIoaSkpIHsKKwkJCS8vIE4uQi4gMTAyNCBieXRlIGJsb2NrcyBhcmUgc3BlY2lhbAorCQkJUFVUKCgodWludDY0X3QpcG9zICogYmxvY2tzaXplKSArICgoMCA9PSBpICYmIDEwMjQgIT0gYmxvY2tzaXplKSA/IDEwMjQgOiAwKSwKKwkJCQkJc2IsIDEwMjQpOworCQkJUFVUKCgodWludDY0X3QpcG9zICogYmxvY2tzaXplKSArIGJsb2Nrc2l6ZSwKKwkJCQkJZ2QsIGdyb3VwX2Rlc2NfYmxvY2tzICogYmxvY2tzaXplKTsKKwkJfQorCX0KKworCS8vIHplcm8gYm9vdCBzZWN0b3JzCisJbWVtc2V0KGJ1ZiwgMCwgYmxvY2tzaXplKTsKKwlQVVQoMCwgYnVmLCAxMDI0KTsgLy8gTi5CLiAxMDI0IDw9IGJsb2Nrc2l6ZSwgc28gYnVmWzAuLjEwMjNdIGNvbnRhaW5zIHplcm9zCisJLy8gemVybyBpbm9kZSB0YWJsZXMKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgKytpKQorCQlmb3IgKG4gPSAwOyBuIDwgaW5vZGVfdGFibGVfYmxvY2tzOyArK24pCisJCQlQVVQoKHVpbnQ2NF90KShGRVRDSF9MRTMyKGdkW2ldLmJnX2lub2RlX3RhYmxlKSArIG4pICogYmxvY2tzaXplLAorCQkJCWJ1ZiwgYmxvY2tzaXplKTsKKworCS8vIHByZXBhcmUgZGlyZWN0b3J5IGlub2RlCisJaW5vZGUgPSAoc3RydWN0IGV4dDJfaW5vZGUgKilidWY7CisJU1RPUkVfTEUoaW5vZGUtPmlfbW9kZSwgU19JRkRJUiB8IFNfSVJXWFUgfCBTX0lSR1JQIHwgU19JUk9USCB8IFNfSVhHUlAgfCBTX0lYT1RIKTsKKwlTVE9SRV9MRShpbm9kZS0+aV9tdGltZSwgdGltZXN0YW1wKTsKKwlTVE9SRV9MRShpbm9kZS0+aV9hdGltZSwgdGltZXN0YW1wKTsKKwlTVE9SRV9MRShpbm9kZS0+aV9jdGltZSwgdGltZXN0YW1wKTsKKwlTVE9SRV9MRShpbm9kZS0+aV9zaXplLCBibG9ja3NpemUpOworCS8vIGlub2RlLT5pX2Jsb2NrcyBzdG9yZXMgdGhlIG51bWJlciBvZiA1MTIgYnl0ZSBkYXRhIGJsb2NrcworCS8vICg1MTIsIGJlY2F1c2UgaXQgZ29lcyBkaXJlY3RseSB0byBzdHJ1Y3Qgc3RhdCB3aXRob3V0IHNjYWxpbmcpCisJU1RPUkVfTEUoaW5vZGUtPmlfYmxvY2tzLCBibG9ja3NpemUgLyA1MTIpOworCisJLy8gZHVtcCByb290IGRpciBpbm9kZQorCVNUT1JFX0xFKGlub2RlLT5pX2xpbmtzX2NvdW50LCAzKTsgLy8gIi8uIiwgIi8uLiIsICIvbG9zdCtmb3VuZC8uLiIgcG9pbnQgdG8gdGhpcyBpbm9kZQorCVNUT1JFX0xFKGlub2RlLT5pX2Jsb2NrWzBdLCBGRVRDSF9MRTMyKGdkWzBdLmJnX2lub2RlX3RhYmxlKSArIGlub2RlX3RhYmxlX2Jsb2Nrcyk7CisJUFVUKCgodWludDY0X3QpRkVUQ0hfTEUzMihnZFswXS5iZ19pbm9kZV90YWJsZSkgKiBibG9ja3NpemUpICsgKEVYVDJfUk9PVF9JTk8tMSkgKiBpbm9kZXNpemUsCisJCQkJYnVmLCBpbm9kZXNpemUpOworCisJLy8gZHVtcCBsb3N0K2ZvdW5kIGRpciBpbm9kZQorCVNUT1JFX0xFKGlub2RlLT5pX2xpbmtzX2NvdW50LCAyKTsgLy8gYm90aCAiL2xvc3QrZm91bmQiIGFuZCAiL2xvc3QrZm91bmQvLiIgcG9pbnQgdG8gdGhpcyBpbm9kZQorCVNUT1JFX0xFKGlub2RlLT5pX3NpemUsIGxvc3RfYW5kX2ZvdW5kX2Jsb2NrcyAqIGJsb2Nrc2l6ZSk7CisJU1RPUkVfTEUoaW5vZGUtPmlfYmxvY2tzLCAobG9zdF9hbmRfZm91bmRfYmxvY2tzICogYmxvY2tzaXplKSAvIDUxMik7CisJbiA9IEZFVENIX0xFMzIoaW5vZGUtPmlfYmxvY2tbMF0pICsgMTsKKwlmb3IgKGkgPSAwOyBpIDwgbG9zdF9hbmRfZm91bmRfYmxvY2tzOyArK2kpCisJCVNUT1JFX0xFKGlub2RlLT5pX2Jsb2NrW2ldLCBpICsgbik7IC8vIHVzZSBuZXh0IGJsb2NrCisvL2JiX2luZm9fbXNnKCJMQVNUIEJMT0NLIFVTRURbJXVdIiwgaSArIG4pOworCVBVVCgoKHVpbnQ2NF90KUZFVENIX0xFMzIoZ2RbMF0uYmdfaW5vZGVfdGFibGUpICogYmxvY2tzaXplKSArIChFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTy0xKSAqIGlub2Rlc2l6ZSwKKwkJCQlidWYsIGlub2Rlc2l6ZSk7CisKKwkvLyBkdW1wIGRpcmVjdG9yaWVzCisJbWVtc2V0KGJ1ZiwgMCwgYmxvY2tzaXplKTsKKwlkaXIgPSAoc3RydWN0IGV4dDJfZGlyICopYnVmOworCisJLy8gZHVtcCAybmQrIGJsb2NrcyBvZiAiL2xvc3QrZm91bmQiCisJU1RPUkVfTEUoZGlyLT5yZWNfbGVuMSwgYmxvY2tzaXplKTsgLy8gZTJmc2NrIDEuNDEuNCBjb21wYXQgKDEuNDEuOSBkb2VzIG5vdCBuZWVkIHRoaXMpCisJZm9yIChpID0gMTsgaSA8IGxvc3RfYW5kX2ZvdW5kX2Jsb2NrczsgKytpKQorCQlQVVQoKHVpbnQ2NF90KShGRVRDSF9MRTMyKGdkWzBdLmJnX2lub2RlX3RhYmxlKSArIGlub2RlX3RhYmxlX2Jsb2NrcyArIDEraSkgKiBibG9ja3NpemUsCisJCQkJYnVmLCBibG9ja3NpemUpOworCisJLy8gZHVtcCAxc3QgYmxvY2sgb2YgIi9sb3N0K2ZvdW5kIgorCVNUT1JFX0xFKGRpci0+aW5vZGUxLCBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTyk7CisJU1RPUkVfTEUoZGlyLT5yZWNfbGVuMSwgMTIpOworCVNUT1JFX0xFKGRpci0+bmFtZV9sZW4xLCAxKTsKKwlTVE9SRV9MRShkaXItPmZpbGVfdHlwZTEsIEVYVDJfRlRfRElSKTsKKwlkaXItPm5hbWUxWzBdID0gJy4nOworCVNUT1JFX0xFKGRpci0+aW5vZGUyLCBFWFQyX1JPT1RfSU5PKTsKKwlTVE9SRV9MRShkaXItPnJlY19sZW4yLCBibG9ja3NpemUgLSAxMik7CisJU1RPUkVfTEUoZGlyLT5uYW1lX2xlbjIsIDIpOworCVNUT1JFX0xFKGRpci0+ZmlsZV90eXBlMiwgRVhUMl9GVF9ESVIpOworCWRpci0+bmFtZTJbMF0gPSAnLic7IGRpci0+bmFtZTJbMV0gPSAnLic7CisJUFVUKCh1aW50NjRfdCkoRkVUQ0hfTEUzMihnZFswXS5iZ19pbm9kZV90YWJsZSkgKyBpbm9kZV90YWJsZV9ibG9ja3MgKyAxKSAqIGJsb2Nrc2l6ZSwgYnVmLCBibG9ja3NpemUpOworCisJLy8gZHVtcCByb290IGRpciBibG9jaworCVNUT1JFX0xFKGRpci0+aW5vZGUxLCBFWFQyX1JPT1RfSU5PKTsKKwlTVE9SRV9MRShkaXItPnJlY19sZW4yLCAxMik7CisJU1RPUkVfTEUoZGlyLT5pbm9kZTMsIEVYVDJfR09PRF9PTERfRklSU1RfSU5PKTsKKwlTVE9SRV9MRShkaXItPnJlY19sZW4zLCBibG9ja3NpemUgLSAxMiAtIDEyKTsKKwlTVE9SRV9MRShkaXItPm5hbWVfbGVuMywgMTApOworCVNUT1JFX0xFKGRpci0+ZmlsZV90eXBlMywgRVhUMl9GVF9ESVIpOworCXN0cmNweShkaXItPm5hbWUzLCAibG9zdCtmb3VuZCIpOworCVBVVCgodWludDY0X3QpKEZFVENIX0xFMzIoZ2RbMF0uYmdfaW5vZGVfdGFibGUpICsgaW5vZGVfdGFibGVfYmxvY2tzICsgMCkgKiBibG9ja3NpemUsIGJ1ZiwgYmxvY2tzaXplKTsKKworCS8vIGNsZWFudXAKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShidWYpOworCQlmcmVlKGdkKTsKKwkJZnJlZShzYik7CisJfQorCisJeGNsb3NlKGZkKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ta2ZzX2V4dDIudHh0IGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ta2ZzX2V4dDIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2Q1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21rZnNfZXh0Mi50eHQKQEAgLTAsMCArMSw3NyBAQAorRGlmZmVyZW5jZSBiZXR3ZWVuIGJib3ggbWtlMmZzIGFuZCBzdGFuZGFyZCBvbmUgKGR1bXBlMmZzIGNvbXBhcmlzb24pOgorCitbdXBkOiBpbm9kZSBzaXplIGhhcyBiZWVuIGZpeGVkIHNpbmNlIHRoZW5dCisKK1R3byBzaWduaWZpY2FudCBkaWZmZXJlbmNlczoKKy0gc3RhbmRhcmQgbWtlMmZzIGhhcyByZXNpemVfaW5vZGUgZmVhdHVyZSBhbmQgdGh1cyBoYXMgcmVzZXJ2ZWQgR0RUIGJsb2NrcywKKyAgd2hpY2ggZGVjcmVhc2VzIGZyZWUgYmxvY2tzOworLSBpbm9kZSBzaXplOiAxMjgvMjU2IChzaW5jZSA2Nzk4MDdrIGlzID4wLjVHLCBzdGFuZGFyZCBta2UyZnMgdXNlcyAiYmlnIiBpbm9kZXMpCisgIHRoaXMgYWZmZWN0cyBpbm9kZSB0YWJsZSBpbiBibG9jayBncm91cHMKKworRmlsZXN5c3RlbSB2b2x1bWUgbmFtZTogICA8bm9uZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXN5c3RlbSB2b2x1bWUgbmFtZTogICA8bm9uZT4KK0xhc3QgbW91bnRlZCBvbjogICAgICAgICAgPG5vdCBhdmFpbGFibGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgbW91bnRlZCBvbjogICAgICAgICAgPG5vdCBhdmFpbGFibGU+CitGaWxlc3lzdGVtIFVVSUQ6ICAgICAgICAgIGY0ODM5NzYwLWM4OWItNDRiNy1hYzUyLTA4YjRlMzI2YzBiNCAgICAgICAgICBGaWxlc3lzdGVtIFVVSUQ6ICAgICAgICAgIDcxMTc5NTU4LThjOGUtNGE1Ni1hZDU0LTAxODAwOGY1YzM1OAorRmlsZXN5c3RlbSBtYWdpYyBudW1iZXI6ICAweEVGNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXN5c3RlbSBtYWdpYyBudW1iZXI6ICAweEVGNTMKK0ZpbGVzeXN0ZW0gcmV2aXNpb24gIzogICAgMSAoZHluYW1pYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzeXN0ZW0gcmV2aXNpb24gIzogICAgMSAoZHluYW1pYykKK0ZpbGVzeXN0ZW0gZmVhdHVyZXM6ICAgICAgZXh0X2F0dHIgZGlyX2luZGV4IGZpbGV0eXBlIHNwYXJzZV9zdXBlciAgICAgIEZpbGVzeXN0ZW0gZmVhdHVyZXM6ICAgICAgZXh0X2F0dHIgcmVzaXplX2lub2RlIGRpcl9pbmRleCBmaWxldHlwZSBzcGFyc2Vfc3VwZXIgbGFyZ2VfZmlsZQorRmlsZXN5c3RlbSBmbGFnczogICAgICAgICBzaWduZWRfZGlyZWN0b3J5X2hhc2ggICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXN5c3RlbSBmbGFnczogICAgICAgICBzaWduZWRfZGlyZWN0b3J5X2hhc2gKK0RlZmF1bHQgbW91bnQgb3B0aW9uczogICAgKG5vbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgbW91bnQgb3B0aW9uczogICAgKG5vbmUpCitGaWxlc3lzdGVtIHN0YXRlOiAgICAgICAgIGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc3lzdGVtIHN0YXRlOiAgICAgICAgIGNsZWFuCitFcnJvcnMgYmVoYXZpb3I6ICAgICAgICAgIENvbnRpbnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMgYmVoYXZpb3I6ICAgICAgICAgIENvbnRpbnVlCitGaWxlc3lzdGVtIE9TIHR5cGU6ICAgICAgIExpbnV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc3lzdGVtIE9TIHR5cGU6ICAgICAgIExpbnV4CitJbm9kZSBjb3VudDogICAgICAgICAgICAgIDQyNjI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm9kZSBjb3VudDogICAgICAgICAgICAgIDQyNTI4CitCbG9jayBjb3VudDogICAgICAgICAgICAgIDE2OTk1MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9jayBjb3VudDogICAgICAgICAgICAgIDE2OTk1MQorUmVzZXJ2ZWQgYmxvY2sgY291bnQ6ICAgICA4NDk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgYmxvY2sgY291bnQ6ICAgICA4NDk3CitGcmVlIGJsb2NrczogICAgICAgICAgICAgIDE2ODU5NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGJsb2NrczogICAgICAgICAgICAgIDE2NzEwMworRnJlZSBpbm9kZXM6ICAgICAgICAgICAgICA0MjYxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBpbm9kZXM6ICAgICAgICAgICAgICA0MjUxNworRmlyc3QgYmxvY2s6ICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlyc3QgYmxvY2s6ICAgICAgICAgICAgICAwCitCbG9jayBzaXplOiAgICAgICAgICAgICAgIDQwOTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9jayBzaXplOiAgICAgICAgICAgICAgIDQwOTYKK0ZyYWdtZW50IHNpemU6ICAgICAgICAgICAgNDA5NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IHNpemU6ICAgICAgICAgICAgNDA5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgR0RUIGJsb2NrczogICAgICA0MQorQmxvY2tzIHBlciBncm91cDogICAgICAgICAzMjc2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tzIHBlciBncm91cDogICAgICAgICAzMjc2OAorRnJhZ21lbnRzIHBlciBncm91cDogICAgICAzMjc2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRzIHBlciBncm91cDogICAgICAzMjc2OAorSW5vZGVzIHBlciBncm91cDogICAgICAgICA3MTA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5vZGVzIHBlciBncm91cDogICAgICAgICA3MDg4CitJbm9kZSBibG9ja3MgcGVyIGdyb3VwOiAgIDIyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm9kZSBibG9ja3MgcGVyIGdyb3VwOiAgIDQ0MworRmlsZXN5c3RlbSBjcmVhdGVkOiAgICAgICBXZWQgT2N0IDIxIDEzOjQwOjU1IDIwMDkgICAgICAgICAgICAgICAgICAgICAgRmlsZXN5c3RlbSBjcmVhdGVkOiAgICAgICBXZWQgT2N0IDIxIDEzOjQwOjU1IDIwMDkKK0xhc3QgbW91bnQgdGltZTogICAgICAgICAgbi9hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgbW91bnQgdGltZTogICAgICAgICAgbi9hCitMYXN0IHdyaXRlIHRpbWU6ICAgICAgICAgIFdlZCBPY3QgMjEgMTM6NDA6NTUgMjAwOSAgICAgICAgICAgICAgICAgICAgICBMYXN0IHdyaXRlIHRpbWU6ICAgICAgICAgIFdlZCBPY3QgMjEgMTM6NDA6NTUgMjAwOQorTW91bnQgY291bnQ6ICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW91bnQgY291bnQ6ICAgICAgICAgICAgICAwCitNYXhpbXVtIG1vdW50IGNvdW50OiAgICAgIDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIG1vdW50IGNvdW50OiAgICAgIDM3CitMYXN0IGNoZWNrZWQ6ICAgICAgICAgICAgIFdlZCBPY3QgMjEgMTM6NDA6NTUgMjAwOSAgICAgICAgICAgICAgICAgICAgICBMYXN0IGNoZWNrZWQ6ICAgICAgICAgICAgIFdlZCBPY3QgMjEgMTM6NDA6NTUgMjAwOQorQ2hlY2sgaW50ZXJ2YWw6ICAgICAgICAgICAxNTU1MjAwMCAoNiBtb250aHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaW50ZXJ2YWw6ICAgICAgICAgICAxNTU1MjAwMCAoNiBtb250aHMpCitOZXh0IGNoZWNrIGFmdGVyOiAgICAgICAgIE1vbiBBcHIgMTkgMTM6NDA6NTUgMjAxMCAgICAgICAgICAgICAgICAgICAgICBOZXh0IGNoZWNrIGFmdGVyOiAgICAgICAgIE1vbiBBcHIgMTkgMTM6NDA6NTUgMjAxMAorUmVzZXJ2ZWQgYmxvY2tzIHVpZDogICAgICAwICh1c2VyIHJvb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgYmxvY2tzIHVpZDogICAgICAwICh1c2VyIHJvb3QpCitSZXNlcnZlZCBibG9ja3MgZ2lkOiAgICAgIDAgKGdyb3VwIHJvb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBibG9ja3MgZ2lkOiAgICAgIDAgKGdyb3VwIHJvb3QpCitGaXJzdCBpbm9kZTogICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXJzdCBpbm9kZTogICAgICAgICAgICAgIDExCitJbm9kZSBzaXplOiAgICAgICAgICAgICAgIDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm9kZSBzaXplOiAgICAgICAgICAgICAgIDI1NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgZXh0cmEgaXNpemU6ICAgICAyOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzaXJlZCBleHRyYSBpc2l6ZTogICAgICAyOAorRGVmYXVsdCBkaXJlY3RvcnkgaGFzaDogICBoYWxmX21kNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBkaXJlY3RvcnkgaGFzaDogICBoYWxmX21kNAorRGlyZWN0b3J5IEhhc2ggU2VlZDogICAgICBmZjk0ZDA0Ny1jOWNhLTRmZTUtYjU1My05MzdhNzYxMDFhODkgICAgICAgICAgRGlyZWN0b3J5IEhhc2ggU2VlZDogICAgICBjMjcwZmQ0My05ODY4LTRhOTItYWU5OS0wNTAwOThlMTI4MzUKKworCitHcm91cCAwOiAoQmxvY2tzIDAtMzI3NjcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCAwOiAoQmxvY2tzIDAtMzI3NjcpCisgIFByaW1hcnkgc3VwZXJibG9jayBhdCAwLCBHcm91cCBkZXNjcmlwdG9ycyBhdCAxLTEgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnkgc3VwZXJibG9jayBhdCAwLCBHcm91cCBkZXNjcmlwdG9ycyBhdCAxLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgR0RUIGJsb2NrcyBhdCAyLTQyCisgIEJsb2NrIGJpdG1hcCBhdCAyICgrMiksIElub2RlIGJpdG1hcCBhdCAzICgrMykgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrIGJpdG1hcCBhdCA0MyAoKzQzKSwgSW5vZGUgYml0bWFwIGF0IDQ0ICgrNDQpCisgIElub2RlIHRhYmxlIGF0IDQtMjI1ICgrNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElub2RlIHRhYmxlIGF0IDQ1LTQ4NyAoKzQ1KQorICAzMjUzNyBmcmVlIGJsb2NrcywgNzA5MyBmcmVlIGlub2RlcywgMiBkaXJlY3RvcmllcyAgICAgICAgICAgICAgICAgICAgICAzMjI3NCBmcmVlIGJsb2NrcywgNzA3NyBmcmVlIGlub2RlcywgMiBkaXJlY3RvcmllcworICBGcmVlIGJsb2NrczogMjMxLTMyNzY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGJsb2NrczogNDk0LTMyNzY3CisgIEZyZWUgaW5vZGVzOiAxMi03MTA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgaW5vZGVzOiAxMi03MDg4CisKK0dyb3VwIDE6IChCbG9ja3MgMzI3NjgtNjU1MzUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIDE6IChCbG9ja3MgMzI3NjgtNjU1MzUpCisgIEJhY2t1cCBzdXBlcmJsb2NrIGF0IDMyNzY4LCBHcm91cCBkZXNjcmlwdG9ycyBhdCAzMjc2OS0zMjc2OSAgICAgICAgICAgIEJhY2t1cCBzdXBlcmJsb2NrIGF0IDMyNzY4LCBHcm91cCBkZXNjcmlwdG9ycyBhdCAzMjc2OS0zMjc2OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBHRFQgYmxvY2tzIGF0IDMyNzcwLTMyODEwCisgIEJsb2NrIGJpdG1hcCBhdCAzMjc3MCAoKzIpLCBJbm9kZSBiaXRtYXAgYXQgMzI3NzEgKCszKSAgICAgICAgICAgICAgICAgIEJsb2NrIGJpdG1hcCBhdCAzMjgxMSAoKzQzKSwgSW5vZGUgYml0bWFwIGF0IDMyODEyICgrNDQpCisgIElub2RlIHRhYmxlIGF0IDMyNzcyLTMyOTkzICgrNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElub2RlIHRhYmxlIGF0IDMyODEzLTMzMjU1ICgrNDUpCisgIDMyNTQyIGZyZWUgYmxvY2tzLCA3MTA0IGZyZWUgaW5vZGVzLCAwIGRpcmVjdG9yaWVzICAgICAgICAgICAgICAgICAgICAgIDMyMjgwIGZyZWUgYmxvY2tzLCA3MDg4IGZyZWUgaW5vZGVzLCAwIGRpcmVjdG9yaWVzCisgIEZyZWUgYmxvY2tzOiAzMjk5NC02NTUzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgYmxvY2tzOiAzMzI1Ni02NTUzNQorICBGcmVlIGlub2RlczogNzEwNS0xNDIwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGlub2RlczogNzA4OS0xNDE3NgorCitHcm91cCAyOiAoQmxvY2tzIDY1NTM2LTk4MzAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCAyOiAoQmxvY2tzIDY1NTM2LTk4MzAzKQorICBCbG9jayBiaXRtYXAgYXQgNjU1MzYgKCswKSwgSW5vZGUgYml0bWFwIGF0IDY1NTM3ICgrMSkgICAgICAgICAgICAgICAgICBCbG9jayBiaXRtYXAgYXQgNjU1MzYgKCswKSwgSW5vZGUgYml0bWFwIGF0IDY1NTM3ICgrMSkKKyAgSW5vZGUgdGFibGUgYXQgNjU1MzgtNjU3NTkgKCsyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5vZGUgdGFibGUgYXQgNjU1MzgtNjU5ODAgKCsyKQorICAzMjU0NCBmcmVlIGJsb2NrcywgNzEwNCBmcmVlIGlub2RlcywgMCBkaXJlY3RvcmllcyAgICAgICAgICAgICAgICAgICAgICAzMjMyMyBmcmVlIGJsb2NrcywgNzA4OCBmcmVlIGlub2RlcywgMCBkaXJlY3RvcmllcworICBGcmVlIGJsb2NrczogNjU3NjAtOTgzMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGJsb2NrczogNjU5ODEtOTgzMDMKKyAgRnJlZSBpbm9kZXM6IDE0MjA5LTIxMzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBpbm9kZXM6IDE0MTc3LTIxMjY0CisuLi4KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWtmc19leHQyX3Rlc3Quc2ggYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21rZnNfZXh0Ml90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1MzQ3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21rZnNfZXh0Ml90ZXN0LnNoCkBAIC0wLDAgKzEsMTA0IEBACisjIS9iaW4vc2gKKworIyBEaXNhYmxpbmcgZmVhdHVyZXMgd2UgZG8gbm90IG1hdGNoIGV4YWN0bHk6CitzeXN0ZW1fbWtlMmZzPScvc2Jpbi9ta2UyZnMgLU8gXnJlc2l6ZV9pbm9kZScKK2Jib3hfbWtlMmZzPScuL2J1c3lib3ggbWtlMmZzJworCitnZW5faW1hZ2UoKSB7ICMgcGFyYW1zOiBta2UyZnNfaW52b2NhdGlvbiBpbWFnZV9uYW1lCisgICAgPiQyCisgICAgZGQgc2Vlaz0kKChraWxvYnl0ZXMtMSkpIGJzPTFLIGNvdW50PTEgPC9kZXYvemVybyBvZj0kMiA+L2Rldi9udWxsIDI+JjEgfHwgZXhpdCAxCisgICAgJDEgLUYgJDIgJGtpbG9ieXRlcyA+JDIucmF3X291dCAyPiYxIHx8IHJldHVybiAxCisgICAgY2F0ICQyLnJhd19vdXQgXAorICAgIHwgZ3JlcCAtdiAnXm1rZTJmcyBbMC05XSpcLlswLTldKlwuWzAtOV0qICcgXAorICAgIHwgZ3JlcCAtdiAnXk1heGltdW0gZmlsZXN5c3RlbScgXAorICAgIHwgZ3JlcCAtdiAnXldyaXRpbmcgaW5vZGUgdGFibGVzJyBcCisgICAgfCBncmVwIC12ICdeV3JpdGluZyBzdXBlcmJsb2NrcyBhbmQgZmlsZXN5c3RlbSBhY2NvdW50aW5nIGluZm9ybWF0aW9uJyBcCisgICAgfCBncmVwIC12ICdeVGhpcyBmaWxlc3lzdGVtIHdpbGwgYmUgYXV0b21hdGljYWxseSBjaGVja2VkIGV2ZXJ5JyBcCisgICAgfCBncmVwIC12ICdeMTgwIGRheXMsIHdoaWNoZXZlciBjb21lcyBmaXJzdCcgXAorICAgIHwgc2VkICdzL2Jsb2NrcyogdW51c2VkLi9ibG9ja3MgdW51c2VkLycgXAorICAgIHwgc2VkICdzL2Jsb2NrIGdyb3VwcyovYmxvY2sgZ3JvdXBzLycgXAorICAgIHwgc2VkICdzLyAqJC8vJyBcCisgICAgfCBzZWQgJ3MvYmxvY2tzICguKiUpIHJlc2VydmVkL2Jsb2NrcyByZXNlcnZlZC8nIFwKKyAgICB8IGdyZXAgLXYgJ14kJyBcCisgICAgPiQyLm91dAorfQorCit0ZXN0X21rZTJmcygpIHsKKyAgICBlY2hvIFRlc3RpbmcgJGtpbG9ieXRlcworCisgICAgZ2VuX2ltYWdlICIkc3lzdGVtX21rZTJmcyIgaW1hZ2Vfc3RkIHx8IHJldHVybiAxCisgICAgZ2VuX2ltYWdlICIkYmJveF9ta2UyZnMiICAgaW1hZ2VfYmIgIHx8IHJldHVybiAxCisKKyAgICBkaWZmIC11YSBpbWFnZV9iYi5vdXQgaW1hZ2Vfc3RkLm91dCA+aW1hZ2Uub3V0LmRpZmYgfHwgeworCWNhdCBpbWFnZS5vdXQuZGlmZgorCXJldHVybiAxCisgICAgfQorCisgICAgZTJmc2NrIC1mIC1uIGltYWdlX2JiID5pbWFnZV9iYl9lMmZzY2sub3V0IDI+JjEgfHwgeworCWVjaG8gImUyZnNjayBlcnJvciBvbiBpbWFnZV9iYiIKKwljYXQgaW1hZ2VfYmJfZTJmc2NrLm91dAorCWV4aXQgMQorICAgIH0KK30KKworIyAtOmJib3ggKzpzdGFuZGFyZAorCisjIGtpbG9ieXRlcz02MCBpcyB0aGUgbWluaW1hbCBhbGxvd2VkIHNpemUKK2tpbG9ieXRlcz02MAord2hpbGUgdHJ1ZTsgZG8KKyAgICB0ZXN0X21rZTJmcyB8fCBleGl0IDEKKyAgICA6ICQoKGtpbG9ieXRlcysrKSkKKyAgICB0ZXN0ICRraWxvYnl0ZXMgPSAyMDAgJiYgYnJlYWsKK2RvbmUKKworIyBUcmFuc2l0aW9uIGZyb20gb25lIGJsb2NrIGdyb3VwIHRvIHR3bworIyBmYWlscyBpbiBbODM3OC4uODQxMF0gcmFuZ2UgdW5sZXNzIC1PIF5yZXNpemVfaW5vZGUKK2tpbG9ieXRlcz0kKCgxICogOCoxMDI0IC0gNTApKQord2hpbGUgdHJ1ZTsgZG8KKyAgICB0ZXN0X21rZTJmcyB8fCBleGl0IDEKKyAgICA6ICQoKGtpbG9ieXRlcysrKSkKKyAgICB0ZXN0ICRraWxvYnl0ZXMgPSAkKCgxICogOCoxMDI0ICsgMzAwKSkgJiYgYnJlYWsKK2RvbmUKKworIyBUcmFuc2l0aW9uIGZyb20gMiBibG9jayBncm91cHMgdG8gMworIyB3b3Jrcwora2lsb2J5dGVzPSQoKDIgKiA4KjEwMjQgLSA1MCkpCit3aGlsZSB0cnVlOyBkbworICAgIHRlc3RfbWtlMmZzIHx8IGV4aXQgMQorICAgIDogJCgoa2lsb2J5dGVzKyspKQorICAgIHRlc3QgJGtpbG9ieXRlcyA9ICQoKDIgKiA4KjEwMjQgKyA0MDApKSAmJiBicmVhaworZG9uZQorCisjIFRyYW5zaXRpb24gZnJvbSAzIGJsb2NrIGdyb3VwcyB0byA0CisjIGZhaWxzIGluIFsyNDgyNS4uMjQ5MjJdIHJhbmdlIHVubGVzcyAtTyBecmVzaXplX2lub2RlCitraWxvYnl0ZXM9JCgoMyAqIDgqMTAyNCAtIDUwKSkKK3doaWxlIHRydWU7IGRvCisgICAgdGVzdF9ta2UyZnMgfHwgZXhpdCAxCisgICAgOiAkKChraWxvYnl0ZXMrKykpCisgICAgdGVzdCAka2lsb2J5dGVzID0gJCgoMyAqIDgqMTAyNCArIDUwMCkpICYmIGJyZWFrCitkb25lCisKKyMgVHJhbnNpdGlvbiBmcm9tIDQgYmxvY2sgZ3JvdXBzIHRvIDUKKyMgd29ya3MKK2tpbG9ieXRlcz0kKCg0ICogOCoxMDI0IC0gNTApKQord2hpbGUgdHJ1ZTsgZG8KKyAgICB0ZXN0X21rZTJmcyB8fCBleGl0IDEKKyAgICA6ICQoKGtpbG9ieXRlcysrKSkKKyAgICB0ZXN0ICRraWxvYnl0ZXMgPSAkKCg0ICogOCoxMDI0ICsgNjAwKSkgJiYgYnJlYWsKK2RvbmUKKworIyBUcmFuc2l0aW9uIGZyb20gNSBibG9jayBncm91cHMgdG8gNgorIyBmYWlscyBpbiBbNDEyMzAuLjQxMzkxXSByYW5nZSB1bmxlc3MgLU8gXnJlc2l6ZV9pbm9kZQora2lsb2J5dGVzPSQoKDUgKiA4KjEwMjQgLSA1MCkpCit3aGlsZSB0cnVlOyBkbworICAgIHRlc3RfbWtlMmZzIHx8IGV4aXQgMQorICAgIDogJCgoa2lsb2J5dGVzKyspKQorICAgIHRlc3QgJGtpbG9ieXRlcyA9ICQoKDUgKiA4KjEwMjQgKyA3MDApKSAmJiBicmVhaworZG9uZQorZXhpdAorCisjIFJhbmRvbSBzaXplcword2hpbGUgdHJ1ZTsgZG8KKyAgICBraWxvYnl0ZXM9JCgoIChSQU5ET00qUkFORE9NKSAlIDUwMDAwMDAgKyA2MCkpCisgICAgdGVzdF9ta2UyZnMgfHwgZXhpdCAxCitkb25lCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21rZnNfbWluaXguYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWtmc19taW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDdkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21rZnNfbWluaXguYwpAQCAtMCwwICsxLDc0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtmcy5jIC0gbWFrZSBhIGxpbnV4IChtaW5peCkgZmlsZS1zeXN0ZW0uCisgKgorICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogREQuTU0uWVkKKyAqCisgKiAyNC4xMS45MSAgLQlUaW1lIGJlZ2FuLiBVc2VkIHRoZSBmc2NrIHNvdXJjZXMgdG8gZ2V0IHN0YXJ0ZWQuCisgKgorICogMjUuMTEuOTEgIC0JQ29ycmVjdGVkIHNvbWUgYnVncy4gQWRkZWQgc3VwcG9ydCBmb3IgIi5iYWRibG9ja3MiCisgKgkJVGhlIGFsZ29yaXRobSBmb3IgIi5iYWRibG9ja3MiIGlzIGEgYml0IHdlaXJkLCBidXQKKyAqCQlpdCBzaG91bGQgd29yay4gT2gsIHdlbGwuCisgKgorICogMjUuMDEuOTIgIC0JQWRkZWQgdGhlIC1sIG9wdGlvbiBmb3IgZ2V0dGluZyB0aGUgbGlzdCBvZiBiYWQgYmxvY2tzCisgKgkJb3V0IG9mIGEgbmFtZWQgZmlsZS4gKERhdmUgUml2ZXJzLCByaXZlcnNAcG9uZHMudXVjcCkKKyAqCisgKiAyOC4wMi45MiAgLQlBZGRlZCAlLWluZm9ybWF0aW9uIHdoZW4gdXNpbmcgLWMuCisgKgorICogMjguMDIuOTMgIC0JQWRkZWQgc3VwcG9ydCBmb3Igb3RoZXIgbmFtZWxlbmd0aHMgdGhhbiB0aGUgb3JpZ2luYWwKKyAqCQkxNCBjaGFyYWN0ZXJzIHNvIHRoYXQgSSBjYW4gdGVzdCB0aGUgbmV3IGtlcm5lbCByb3V0aW5lcy4uCisgKgorICogMDkuMTAuOTMgIC0JTWFrZSBleGl0IHN0YXR1cyBjb25mb3JtIHRvIHRoYXQgcmVxdWlyZWQgYnkgZnN1dGlsCisgKgkJKFJpayBGYWl0aCwgZmFpdGhAY3MudW5jLmVkdSkKKyAqCisgKiAzMS4xMC45MyAgLQlBZGRlZCBpbm9kZSByZXF1ZXN0IGZlYXR1cmUsIGZvciBiYWNrdXAgZmxvcHBpZXM6IHVzZQorICoJCTMyIGlub2RlcywgZm9yIGEgbmV3cyBwYXJ0aXRpb24gdXNlIG1vcmUuCisgKgkJKFNjb3R0IEhlYXZuZXIsIHNkaEBwby5jd3J1LmVkdSkKKyAqCisgKiAwMy4wMS45NCAgLQlBZGRlZCBzdXBwb3J0IGZvciBmaWxlIHN5c3RlbSB2YWxpZCBmbGFnLgorICoJCShEci4gV2V0dHN0ZWluLCBncmVnJXdpbmQudXVjcEBwbGFpbnMubm9kYWsuZWR1KQorICoKKyAqIDMwLjEwLjk0ICAtICBhZGRlZCBzdXBwb3J0IGZvciB2MiBmaWxlc3lzdGVtCisgKgkgICAgICAgIChBbmRyZWFzIFNjaHdhYiwgc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlKQorICoKKyAqIDA5LjExLjk0ICAtCUFkZGVkIHRlc3QgdG8gcHJldmVudCBvdmVyd3JpdGUgb2YgbW91bnRlZCBmcyBhZGFwdGVkCisgKgkJZnJvbSBUaGVvZG9yZSBUcydvJ3MgKHR5dHNvQGF0aGVuYS5taXQuZWR1KSBta2UyZnMKKyAqCQlwcm9ncmFtLiAgKERhbmllbCBRdWlubGFuLCBxdWlubGFuQHlnZ2RyYXNpbC5jb20pCisgKgorICogMDMuMjAuOTUgIC0JQ2xlYXIgZmlyc3QgNTEyIGJ5dGVzIG9mIGZpbGVzeXN0ZW0gdG8gbWFrZSBjZXJ0YWluIHRoYXQKKyAqCQl0aGUgZmlsZXN5c3RlbSBpcyBub3QgbWlzaWRlbnRpZmllZCBhcyBhIE1TLURPUyBGQVQgZmlsZXN5c3RlbS4KKyAqCQkoRGFuaWVsIFF1aW5sYW4sIHF1aW5sYW5AeWdnZHJhc2lsLmNvbSkKKyAqCisgKiAwMi4wNy45NiAgLSAgQWRkZWQgc21hbGwgcGF0Y2ggZnJvbSBSdXNzZWxsIEtpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSBhCisgKgkJZ29vZCBkZWFsIG1vcmUgcG9ydGFibGUgKGphbmxAbWF0aC51aW8ubm8pCisgKgorICogVXNhZ2U6ICBta2ZzIFstYyB8IC1sIGZpbGVuYW1lIF0gWy12XSBbLW5YWF0gWy1pWFhdIGRldmljZSBbc2l6ZS1pbi1ibG9ja3NdCisgKgorICoJLWMgZm9yIHJlYWRhYmlsaXR5IGNoZWNraW5nIChTTE9XISkKKyAqICAgICAgLWwgZm9yIGdldHRpbmcgYSBsaXN0IG9mIGJhZCBibG9ja3MgZnJvbSBhIGZpbGUuCisgKgktbiBmb3IgbmFtZWxlbmd0aCAoY3VycmVudGx5IHRoZSBrZXJuZWwgb25seSB1c2VzIDE0IG9yIDMwKQorICoJLWkgZm9yIG51bWJlciBvZiBpbm9kZXMKKyAqCS12IGZvciB2MiBmaWxlc3lzdGVtCisgKgorICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CisgKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuCisgKgorICogTW9kaWZpZWQgZm9yIEJ1c3lCb3ggYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AZGViaWFuLm9yZz4gLS0KKyAqCXJlbW92ZWQgZ2V0b3B0IGJhc2VkIHBhcnNlciBhbmQgYWRkZWQgYSBoYW5kIHJvbGxlZCBvbmUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rZnNfbWluaXhfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyB8IC1sIEZJTEVdIFstblhYXSBbLWlYWF0gQkxPQ0tERVYgW0tCWVRFU10iCisvL3VzYWdlOiNkZWZpbmUgbWtmc19taW5peF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1ha2UgYSBNSU5JWCBmaWxlc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCQlDaGVjayBkZXZpY2UgZm9yIGJhZCBibG9ja3MiCisvL3VzYWdlOiAgICAgIlxuCS1uIFsxNHwzMF0JTWF4aW11bSBsZW5ndGggb2YgZmlsZW5hbWVzIgorLy91c2FnZTogICAgICJcbgktaSBJTk9ERVMJTnVtYmVyIG9mIGlub2RlcyBmb3IgdGhlIGZpbGVzeXN0ZW0iCisvL3VzYWdlOiAgICAgIlxuCS1sIEZJTEUJCVJlYWQgYmFkIGJsb2NrcyBsaXN0IGZyb20gRklMRSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCU1ha2UgdmVyc2lvbiAyIGZpbGVzeXN0ZW0iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG1udGVudC5oPgorCisjaW5jbHVkZSAibWluaXguaCIKKworLyogU3RvcmUgdGhlIHZlcnkgc2FtZSB0aW1lcy91aWRzL2dpZHMgZm9yIGltYWdlIGNvbnNpc3RlbmN5ICovCisjaWYgMQorIyBkZWZpbmUgQ1VSX1RJTUUgMAorIyBkZWZpbmUgR0VUVUlEIDAKKyMgZGVmaW5lIEdFVEdJRCAwCisjZWxzZQorLyogV2FzIHVzaW5nIHRoaXMuIElzIGl0IHVzZWZ1bD8gTkI6IHRoaXMgd2lsbCBicmVhayB0ZXN0c3VpdGUgKi8KKyMgZGVmaW5lIENVUl9USU1FIHRpbWUoTlVMTCkKKyMgZGVmaW5lIEdFVFVJRCBnZXR1aWQoKQorIyBkZWZpbmUgR0VUR0lEIGdldGdpZCgpCisjZW5kaWYKKworZW51bSB7CisJTUFYX0dPT0RfQkxPQ0tTICAgICAgICAgPSA1MTIsCisJVEVTVF9CVUZGRVJfQkxPQ0tTICAgICAgPSAxNiwKK307CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitlbnVtIHsgdmVyc2lvbjIgPSAwIH07CisjZW5kaWYKKworZW51bSB7IGRldl9mZCA9IDMgfTsKKworc3RydWN0IGdsb2JhbHMgeworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorCXNtYWxsaW50IHZlcnNpb24yOworI2RlZmluZSB2ZXJzaW9uMiBHLnZlcnNpb24yCisjZW5kaWYKKwljaGFyICpkZXZpY2VfbmFtZTsKKwl1aW50MzJfdCB0b3RhbF9ibG9ja3M7CisJaW50IGJhZGJsb2NrczsKKwlpbnQgbmFtZWxlbjsKKwlpbnQgZGlyc2l6ZTsKKwlpbnQgbWFnaWM7CisJY2hhciAqaW5vZGVfYnVmZmVyOworCWNoYXIgKmlub2RlX21hcDsKKwljaGFyICp6b25lX21hcDsKKwlpbnQgdXNlZF9nb29kX2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nIHJlcV9ucl9pbm9kZXM7CisJdW5zaWduZWQgY3VycmVudGx5X3Rlc3Rpbmc7CisKKwljaGFyIHJvb3RfYmxvY2tbQkxPQ0tfU0laRV07CisJY2hhciBzdXBlcmJsb2NrX2J1ZmZlcltCTE9DS19TSVpFXTsKKwljaGFyIGJvb3RfYmxvY2tfYnVmZmVyWzUxMl07CisJdW5zaWduZWQgc2hvcnQgZ29vZF9ibG9ja3NfdGFibGVbTUFYX0dPT0RfQkxPQ0tTXTsKKwkvKiBjaGVja19ibG9ja3MoKTogYnVmZmVyW10gd2FzIHRoZSBiaWdnZXN0IHN0YXRpYyBpbiBlbnRpcmUgYmJveCAqLworCWNoYXIgY2hlY2tfYmxvY2tzX2J1ZmZlcltCTE9DS19TSVpFICogVEVTVF9CVUZGRVJfQkxPQ0tTXTsKKworCXVuc2lnbmVkIHNob3J0IGluZF9ibG9jazFbQkxPQ0tfU0laRSA+PiAxXTsKKwl1bnNpZ25lZCBzaG9ydCBkaW5kX2Jsb2NrMVtCTE9DS19TSVpFID4+IDFdOworCXVuc2lnbmVkIGxvbmcgaW5kX2Jsb2NrMltCTE9DS19TSVpFID4+IDJdOworCXVuc2lnbmVkIGxvbmcgZGluZF9ibG9jazJbQkxPQ0tfU0laRSA+PiAyXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVuc2lnbmVkIGRpdl9yb3VuZHVwKHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIChzaXplICsgbi0xKSAvIG47Cit9CisKKyNkZWZpbmUgSU5PREVfQlVGMSAgICAgICAgICAgICAgKCgoc3RydWN0IG1pbml4MV9pbm9kZSopRy5pbm9kZV9idWZmZXIpIC0gMSkKKyNkZWZpbmUgSU5PREVfQlVGMiAgICAgICAgICAgICAgKCgoc3RydWN0IG1pbml4Ml9pbm9kZSopRy5pbm9kZV9idWZmZXIpIC0gMSkKKworI2RlZmluZSBTQiAgICAgICAgICAgICAgICAgICAgICAoKihzdHJ1Y3QgbWluaXhfc3VwZXJibG9jayopRy5zdXBlcmJsb2NrX2J1ZmZlcikKKworI2RlZmluZSBTQl9JTk9ERVMgICAgICAgICAgICAgICAoU0Iuc19uaW5vZGVzKQorI2RlZmluZSBTQl9JTUFQUyAgICAgICAgICAgICAgICAoU0Iuc19pbWFwX2Jsb2NrcykKKyNkZWZpbmUgU0JfWk1BUFMgICAgICAgICAgICAgICAgKFNCLnNfem1hcF9ibG9ja3MpCisjZGVmaW5lIFNCX0ZJUlNUWk9ORSAgICAgICAgICAgIChTQi5zX2ZpcnN0ZGF0YXpvbmUpCisjZGVmaW5lIFNCX1pPTkVfU0laRSAgICAgICAgICAgIChTQi5zX2xvZ196b25lX3NpemUpCisjZGVmaW5lIFNCX01BWFNJWkUgICAgICAgICAgICAgIChTQi5zX21heF9zaXplKQorI2RlZmluZSBTQl9NQUdJQyAgICAgICAgICAgICAgICAoU0Iuc19tYWdpYykKKworI2lmICFFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKyMgZGVmaW5lIFNCX1pPTkVTICAgICAgICAgICAgICAgKFNCLnNfbnpvbmVzKQorIyBkZWZpbmUgSU5PREVfQkxPQ0tTICAgICAgICAgICBkaXZfcm91bmR1cChTQl9JTk9ERVMsIE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLKQorI2Vsc2UKKyMgZGVmaW5lIFNCX1pPTkVTICAgICAgICAgICAgICAgKHZlcnNpb24yID8gU0Iuc196b25lcyA6IFNCLnNfbnpvbmVzKQorIyBkZWZpbmUgSU5PREVfQkxPQ0tTICAgICAgICAgICBkaXZfcm91bmR1cChTQl9JTk9ERVMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24yID8gTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgOiBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSykpCisjZW5kaWYKKworI2RlZmluZSBJTk9ERV9CVUZGRVJfU0laRSAgICAgICAoSU5PREVfQkxPQ0tTICogQkxPQ0tfU0laRSkKKyNkZWZpbmUgTk9STV9GSVJTVFpPTkUgICAgICAgICAgKDIgKyBTQl9JTUFQUyArIFNCX1pNQVBTICsgSU5PREVfQkxPQ0tTKQorCisvKiBCZWZvcmUgeW91IGFzayAid2hlcmUgdGhleSBjb21lIGZyb20/IjogKi8KKy8qIHNldGJpdC9jbHJiaXQgYXJlIHN1cHBsaWVkIGJ5IHN5cy9wYXJhbS5oICovCisKK3N0YXRpYyBpbnQgbWluaXhfYml0KGNvbnN0IGNoYXIqIGEsIHVuc2lnbmVkIGkpCit7CisJcmV0dXJuIGFbaSA+PiAzXSAmICgxPDwoaSAmIDcpKTsKK30KKworc3RhdGljIHZvaWQgbWluaXhfc2V0Yml0KGNoYXIgKmEsIHVuc2lnbmVkIGkpCit7CisJc2V0Yml0KGEsIGkpOworfQorc3RhdGljIHZvaWQgbWluaXhfY2xyYml0KGNoYXIgKmEsIHVuc2lnbmVkIGkpCit7CisJY2xyYml0KGEsIGkpOworfQorCisvKiBOb3RlOiBkbyBub3QgYXNzdW1lIDAvMSwgaXQgaXMgMC9ub256ZXJvICovCisjZGVmaW5lIHpvbmVfaW5fdXNlKHgpICBtaW5peF9iaXQoRy56b25lX21hcCwoeCktU0JfRklSU1RaT05FKzEpCisvKiNkZWZpbmUgaW5vZGVfaW5fdXNlKHgpIG1pbml4X2JpdChHLmlub2RlX21hcCwoeCkpKi8KKworI2RlZmluZSBtYXJrX2lub2RlKHgpICAgbWluaXhfc2V0Yml0KEcuaW5vZGVfbWFwLCh4KSkKKyNkZWZpbmUgdW5tYXJrX2lub2RlKHgpIG1pbml4X2NscmJpdChHLmlub2RlX21hcCwoeCkpCisjZGVmaW5lIG1hcmtfem9uZSh4KSAgICBtaW5peF9zZXRiaXQoRy56b25lX21hcCwoeCktU0JfRklSU1RaT05FKzEpCisjZGVmaW5lIHVubWFya196b25lKHgpICBtaW5peF9jbHJiaXQoRy56b25lX21hcCwoeCktU0JfRklSU1RaT05FKzEpCisKKyNpZm5kZWYgQkxLR0VUU0laRQorIyBkZWZpbmUgQkxLR0VUU0laRSAgICAgX0lPKDB4MTIsOTYpICAgIC8qIHJldHVybiBkZXZpY2Ugc2l6ZSAqLworI2VuZGlmCisKKworc3RhdGljIGxvbmcgdmFsaWRfb2Zmc2V0KGludCBmZCwgaW50IG9mZnNldCkKK3sKKwljaGFyIGNoOworCisJaWYgKGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKSA8IDApCisJCXJldHVybiAwOworCWlmIChyZWFkKGZkLCAmY2gsIDEpIDwgMSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfYmxvY2tzKGludCBmZCkKK3sKKwlpbnQgaGlnaCwgbG93OworCisJbG93ID0gMDsKKwlmb3IgKGhpZ2ggPSAxOyB2YWxpZF9vZmZzZXQoZmQsIGhpZ2gpOyBoaWdoICo9IDIpCisJCWxvdyA9IGhpZ2g7CisKKwl3aGlsZSAobG93IDwgaGlnaCAtIDEpIHsKKwkJY29uc3QgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CisKKwkJaWYgKHZhbGlkX29mZnNldChmZCwgbWlkKSkKKwkJCWxvdyA9IG1pZDsKKwkJZWxzZQorCQkJaGlnaCA9IG1pZDsKKwl9CisJdmFsaWRfb2Zmc2V0KGZkLCAwKTsKKwlyZXR1cm4gKGxvdyArIDEpOworfQorCitzdGF0aWMgaW50IGdldF9zaXplKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJaW50IGZkOworCWxvbmcgc2l6ZTsKKworCWZkID0geG9wZW4oZmlsZSwgT19SRFdSKTsKKwlpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkUsICZzaXplKSA+PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIChzaXplICogNTEyKTsKKwl9CisKKwlzaXplID0gY291bnRfYmxvY2tzKGZkKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RhYmxlcyh2b2lkKQoreworCS8qIE1hcmsgdGhlIHN1cGVyYmxvY2sgdmFsaWQuICovCisJU0Iuc19zdGF0ZSB8PSBNSU5JWF9WQUxJRF9GUzsKKwlTQi5zX3N0YXRlICY9IH5NSU5JWF9FUlJPUl9GUzsKKworCW1zZ19lb2wgPSAic2VlayB0byAwIGZhaWxlZCI7CisJeGxzZWVrKGRldl9mZCwgMCwgU0VFS19TRVQpOworCisJbXNnX2VvbCA9ICJjYW4ndCBjbGVhciBib290IHNlY3RvciI7CisJeHdyaXRlKGRldl9mZCwgRy5ib290X2Jsb2NrX2J1ZmZlciwgNTEyKTsKKworCW1zZ19lb2wgPSAic2VlayB0byBCTE9DS19TSVpFIGZhaWxlZCI7CisJeGxzZWVrKGRldl9mZCwgQkxPQ0tfU0laRSwgU0VFS19TRVQpOworCisJbXNnX2VvbCA9ICJjYW4ndCB3cml0ZSBzdXBlcmJsb2NrIjsKKwl4d3JpdGUoZGV2X2ZkLCBHLnN1cGVyYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKTsKKworCW1zZ19lb2wgPSAiY2FuJ3Qgd3JpdGUgaW5vZGUgbWFwIjsKKwl4d3JpdGUoZGV2X2ZkLCBHLmlub2RlX21hcCwgU0JfSU1BUFMgKiBCTE9DS19TSVpFKTsKKworCW1zZ19lb2wgPSAiY2FuJ3Qgd3JpdGUgem9uZSBtYXAiOworCXh3cml0ZShkZXZfZmQsIEcuem9uZV9tYXAsIFNCX1pNQVBTICogQkxPQ0tfU0laRSk7CisKKwltc2dfZW9sID0gImNhbid0IHdyaXRlIGlub2RlcyI7CisJeHdyaXRlKGRldl9mZCwgRy5pbm9kZV9idWZmZXIsIElOT0RFX0JVRkZFUl9TSVpFKTsKKworCW1zZ19lb2wgPSAiXG4iOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9ibG9jayhpbnQgYmxrLCBjaGFyICpidWZmZXIpCit7CisJeGxzZWVrKGRldl9mZCwgYmxrICogQkxPQ0tfU0laRSwgU0VFS19TRVQpOworCXh3cml0ZShkZXZfZmQsIGJ1ZmZlciwgQkxPQ0tfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfYmxvY2sodm9pZCkKK3sKKwlpbnQgYmxrOworCisJaWYgKEcudXNlZF9nb29kX2Jsb2NrcyArIDEgPj0gTUFYX0dPT0RfQkxPQ0tTKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgYmFkIGJsb2NrcyIpOworCWlmIChHLnVzZWRfZ29vZF9ibG9ja3MpCisJCWJsayA9IEcuZ29vZF9ibG9ja3NfdGFibGVbRy51c2VkX2dvb2RfYmxvY2tzIC0gMV0gKyAxOworCWVsc2UKKwkJYmxrID0gU0JfRklSU1RaT05FOworCXdoaWxlIChibGsgPCBTQl9aT05FUyAmJiB6b25lX2luX3VzZShibGspKQorCQlibGsrKzsKKwlpZiAoYmxrID49IFNCX1pPTkVTKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGVub3VnaCBnb29kIGJsb2NrcyIpOworCUcuZ29vZF9ibG9ja3NfdGFibGVbRy51c2VkX2dvb2RfYmxvY2tzXSA9IGJsazsKKwlHLnVzZWRfZ29vZF9ibG9ja3MrKzsKKwlyZXR1cm4gYmxrOworfQorCitzdGF0aWMgdm9pZCBtYXJrX2dvb2RfYmxvY2tzKHZvaWQpCit7CisJaW50IGJsazsKKworCWZvciAoYmxrID0gMDsgYmxrIDwgRy51c2VkX2dvb2RfYmxvY2tzOyBibGsrKykKKwkJbWFya196b25lKEcuZ29vZF9ibG9ja3NfdGFibGVbYmxrXSk7Cit9CisKK3N0YXRpYyBpbnQgbmV4dChpbnQgem9uZSkKK3sKKwlpZiAoIXpvbmUpCisJCXpvbmUgPSBTQl9GSVJTVFpPTkUgLSAxOworCXdoaWxlICgrK3pvbmUgPCBTQl9aT05FUykKKwkJaWYgKHpvbmVfaW5fdXNlKHpvbmUpKQorCQkJcmV0dXJuIHpvbmU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1ha2VfYmFkX2lub2RlKHZvaWQpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGUgPSAmSU5PREVfQlVGMVtNSU5JWF9CQURfSU5PXTsKKwlpbnQgaSwgaiwgem9uZTsKKwlpbnQgaW5kID0gMCwgZGluZCA9IDA7CisJLyogbW92ZWQgdG8gZ2xvYmFscyB0byByZWR1Y2Ugc3RhY2sgdXNhZ2UKKwl1bnNpZ25lZCBzaG9ydCBpbmRfYmxvY2tbQkxPQ0tfU0laRSA+PiAxXTsKKwl1bnNpZ25lZCBzaG9ydCBkaW5kX2Jsb2NrW0JMT0NLX1NJWkUgPj4gMV07CisJKi8KKyNkZWZpbmUgaW5kX2Jsb2NrIChHLmluZF9ibG9jazEpCisjZGVmaW5lIGRpbmRfYmxvY2sgKEcuZGluZF9ibG9jazEpCisKKyNkZWZpbmUgTkVYVF9CQUQgKHpvbmUgPSBuZXh0KHpvbmUpKQorCisJaWYgKCFHLmJhZGJsb2NrcykKKwkJcmV0dXJuOworCW1hcmtfaW5vZGUoTUlOSVhfQkFEX0lOTyk7CisJaW5vZGUtPmlfbmxpbmtzID0gMTsKKwkvKiBCVFcsIHNldHRpbmcgdGhpcyBtYWtlcyBhbGwgaW1hZ2VzIGRpZmZlcmVudCAqLworCS8qIGl0J3MgaGFyZGVyIHRvIGNoZWNrIGZvciBidWdzIHRoZW4gLSBkaWZmIGlzbid0IGhlbHBmdWwgOiguLi4gKi8KKwlpbm9kZS0+aV90aW1lID0gQ1VSX1RJTUU7CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgKyAwMDAwOworCWlub2RlLT5pX3NpemUgPSBHLmJhZGJsb2NrcyAqIEJMT0NLX1NJWkU7CisJem9uZSA9IG5leHQoMCk7CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpbm9kZS0+aV96b25lW2ldID0gem9uZTsKKwkJaWYgKCFORVhUX0JBRCkKKwkJCWdvdG8gZW5kX2JhZDsKKwl9CisJaW5vZGUtPmlfem9uZVs3XSA9IGluZCA9IGdldF9mcmVlX2Jsb2NrKCk7CisJbWVtc2V0KGluZF9ibG9jaywgMCwgQkxPQ0tfU0laRSk7CisJZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisJCWluZF9ibG9ja1tpXSA9IHpvbmU7CisJCWlmICghTkVYVF9CQUQpCisJCQlnb3RvIGVuZF9iYWQ7CisJfQorCWlub2RlLT5pX3pvbmVbOF0gPSBkaW5kID0gZ2V0X2ZyZWVfYmxvY2soKTsKKwltZW1zZXQoZGluZF9ibG9jaywgMCwgQkxPQ0tfU0laRSk7CisJZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisJCXdyaXRlX2Jsb2NrKGluZCwgKGNoYXIgKikgaW5kX2Jsb2NrKTsKKwkJZGluZF9ibG9ja1tpXSA9IGluZCA9IGdldF9mcmVlX2Jsb2NrKCk7CisJCW1lbXNldChpbmRfYmxvY2ssIDAsIEJMT0NLX1NJWkUpOworCQlmb3IgKGogPSAwOyBqIDwgNTEyOyBqKyspIHsKKwkJCWluZF9ibG9ja1tqXSA9IHpvbmU7CisJCQlpZiAoIU5FWFRfQkFEKQorCQkJCWdvdG8gZW5kX2JhZDsKKwkJfQorCX0KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgYmFkIGJsb2NrcyIpOworIGVuZF9iYWQ6CisJaWYgKGluZCkKKwkJd3JpdGVfYmxvY2soaW5kLCAoY2hhciAqKSBpbmRfYmxvY2spOworCWlmIChkaW5kKQorCQl3cml0ZV9ibG9jayhkaW5kLCAoY2hhciAqKSBkaW5kX2Jsb2NrKTsKKyN1bmRlZiBpbmRfYmxvY2sKKyN1bmRlZiBkaW5kX2Jsb2NrCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIG1ha2VfYmFkX2lub2RlMih2b2lkKQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gJklOT0RFX0JVRjJbTUlOSVhfQkFEX0lOT107CisJaW50IGksIGosIHpvbmU7CisJaW50IGluZCA9IDAsIGRpbmQgPSAwOworCS8qIG1vdmVkIHRvIGdsb2JhbHMgdG8gcmVkdWNlIHN0YWNrIHVzYWdlCisJdW5zaWduZWQgbG9uZyBpbmRfYmxvY2tbQkxPQ0tfU0laRSA+PiAyXTsKKwl1bnNpZ25lZCBsb25nIGRpbmRfYmxvY2tbQkxPQ0tfU0laRSA+PiAyXTsKKwkqLworI2RlZmluZSBpbmRfYmxvY2sgKEcuaW5kX2Jsb2NrMikKKyNkZWZpbmUgZGluZF9ibG9jayAoRy5kaW5kX2Jsb2NrMikKKworCWlmICghRy5iYWRibG9ja3MpCisJCXJldHVybjsKKwltYXJrX2lub2RlKE1JTklYX0JBRF9JTk8pOworCWlub2RlLT5pX25saW5rcyA9IDE7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSX1RJTUU7CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgKyAwMDAwOworCWlub2RlLT5pX3NpemUgPSBHLmJhZGJsb2NrcyAqIEJMT0NLX1NJWkU7CisJem9uZSA9IG5leHQoMCk7CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpbm9kZS0+aV96b25lW2ldID0gem9uZTsKKwkJaWYgKCFORVhUX0JBRCkKKwkJCWdvdG8gZW5kX2JhZDsKKwl9CisJaW5vZGUtPmlfem9uZVs3XSA9IGluZCA9IGdldF9mcmVlX2Jsb2NrKCk7CisJbWVtc2V0KGluZF9ibG9jaywgMCwgQkxPQ0tfU0laRSk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWluZF9ibG9ja1tpXSA9IHpvbmU7CisJCWlmICghTkVYVF9CQUQpCisJCQlnb3RvIGVuZF9iYWQ7CisJfQorCWlub2RlLT5pX3pvbmVbOF0gPSBkaW5kID0gZ2V0X2ZyZWVfYmxvY2soKTsKKwltZW1zZXQoZGluZF9ibG9jaywgMCwgQkxPQ0tfU0laRSk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXdyaXRlX2Jsb2NrKGluZCwgKGNoYXIgKikgaW5kX2Jsb2NrKTsKKwkJZGluZF9ibG9ja1tpXSA9IGluZCA9IGdldF9mcmVlX2Jsb2NrKCk7CisJCW1lbXNldChpbmRfYmxvY2ssIDAsIEJMT0NLX1NJWkUpOworCQlmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKwkJCWluZF9ibG9ja1tqXSA9IHpvbmU7CisJCQlpZiAoIU5FWFRfQkFEKQorCQkJCWdvdG8gZW5kX2JhZDsKKwkJfQorCX0KKwkvKiBDb3VsZCBtYWtlIHRyaXBsZSBpbmRpcmVjdCBibG9jayBoZXJlICovCisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGJhZCBibG9ja3MiKTsKKyBlbmRfYmFkOgorCWlmIChpbmQpCisJCXdyaXRlX2Jsb2NrKGluZCwgKGNoYXIgKikgaW5kX2Jsb2NrKTsKKwlpZiAoZGluZCkKKwkJd3JpdGVfYmxvY2soZGluZCwgKGNoYXIgKikgZGluZF9ibG9jayk7CisjdW5kZWYgaW5kX2Jsb2NrCisjdW5kZWYgZGluZF9ibG9jaworfQorI2Vsc2UKK3ZvaWQgbWFrZV9iYWRfaW5vZGUyKHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIG1ha2Vfcm9vdF9pbm9kZSh2b2lkKQoreworCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlID0gJklOT0RFX0JVRjFbTUlOSVhfUk9PVF9JTk9dOworCisJbWFya19pbm9kZShNSU5JWF9ST09UX0lOTyk7CisJaW5vZGUtPmlfem9uZVswXSA9IGdldF9mcmVlX2Jsb2NrKCk7CisJaW5vZGUtPmlfbmxpbmtzID0gMjsKKwlpbm9kZS0+aV90aW1lID0gQ1VSX1RJTUU7CisJaWYgKEcuYmFkYmxvY2tzKQorCQlpbm9kZS0+aV9zaXplID0gMyAqIEcuZGlyc2l6ZTsKKwllbHNlIHsKKwkJRy5yb290X2Jsb2NrWzIgKiBHLmRpcnNpemVdID0gJ1wwJzsKKwkJRy5yb290X2Jsb2NrWzIgKiBHLmRpcnNpemUgKyAxXSA9ICdcMCc7CisJCWlub2RlLT5pX3NpemUgPSAyICogRy5kaXJzaXplOworCX0KKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiArIDA3NTU7CisJaW5vZGUtPmlfdWlkID0gR0VUVUlEOworCWlmIChpbm9kZS0+aV91aWQpCisJCWlub2RlLT5pX2dpZCA9IEdFVEdJRDsKKwl3cml0ZV9ibG9jayhpbm9kZS0+aV96b25lWzBdLCBHLnJvb3RfYmxvY2spOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitzdGF0aWMgdm9pZCBtYWtlX3Jvb3RfaW5vZGUyKHZvaWQpCit7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUgPSAmSU5PREVfQlVGMltNSU5JWF9ST09UX0lOT107CisKKwltYXJrX2lub2RlKE1JTklYX1JPT1RfSU5PKTsKKwlpbm9kZS0+aV96b25lWzBdID0gZ2V0X2ZyZWVfYmxvY2soKTsKKwlpbm9kZS0+aV9ubGlua3MgPSAyOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUl9USU1FOworCWlmIChHLmJhZGJsb2NrcykKKwkJaW5vZGUtPmlfc2l6ZSA9IDMgKiBHLmRpcnNpemU7CisJZWxzZSB7CisJCUcucm9vdF9ibG9ja1syICogRy5kaXJzaXplXSA9ICdcMCc7CisJCUcucm9vdF9ibG9ja1syICogRy5kaXJzaXplICsgMV0gPSAnXDAnOworCQlpbm9kZS0+aV9zaXplID0gMiAqIEcuZGlyc2l6ZTsKKwl9CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgKyAwNzU1OworCWlub2RlLT5pX3VpZCA9IEdFVFVJRDsKKwlpZiAoaW5vZGUtPmlfdWlkKQorCQlpbm9kZS0+aV9naWQgPSBHRVRHSUQ7CisJd3JpdGVfYmxvY2soaW5vZGUtPmlfem9uZVswXSwgRy5yb290X2Jsb2NrKTsKK30KKyNlbHNlCit2b2lkIG1ha2Vfcm9vdF9pbm9kZTIodm9pZCk7CisjZW5kaWYKKworLyoKKyAqIFBlcmZvcm0gYSB0ZXN0IG9mIGEgYmxvY2s7IHJldHVybiB0aGUgbnVtYmVyIG9mCisgKiBibG9ja3MgcmVhZGFibGUuCisgKi8KK3N0YXRpYyBzaXplX3QgZG9fY2hlY2soY2hhciAqYnVmZmVyLCBzaXplX3QgdHJ5LCB1bnNpZ25lZCBjdXJyZW50X2Jsb2NrKQoreworCXNzaXplX3QgZ290OworCisJLyogU2VlayB0byB0aGUgY29ycmVjdCBsb2MuICovCisJbXNnX2VvbCA9ICJzZWVrIGZhaWxlZCBkdXJpbmcgdGVzdGluZyBvZiBibG9ja3MiOworCXhsc2VlayhkZXZfZmQsIGN1cnJlbnRfYmxvY2sgKiBCTE9DS19TSVpFLCBTRUVLX1NFVCk7CisJbXNnX2VvbCA9ICJcbiI7CisKKwkvKiBUcnkgdGhlIHJlYWQgKi8KKwlnb3QgPSByZWFkKGRldl9mZCwgYnVmZmVyLCB0cnkgKiBCTE9DS19TSVpFKTsKKwlpZiAoZ290IDwgMCkKKwkJZ290ID0gMDsKKwl0cnkgPSAoKHNpemVfdClnb3QpIC8gQkxPQ0tfU0laRTsKKworCWlmIChnb3QgJiAoQkxPQ0tfU0laRSAtIDEpKQorCQlmcHJpbnRmKHN0ZGVyciwgIlNob3J0IHJlYWQgYXQgYmxvY2sgJXVcbiIsICh1bnNpZ25lZCkoY3VycmVudF9ibG9jayArIHRyeSkpOworCXJldHVybiB0cnk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2ludHIoaW50IGFsbnVtIFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAoRy5jdXJyZW50bHlfdGVzdGluZyA+PSBTQl9aT05FUykKKwkJcmV0dXJuOworCXNpZ25hbChTSUdBTFJNLCBhbGFybV9pbnRyKTsKKwlhbGFybSg1KTsKKwlpZiAoIUcuY3VycmVudGx5X3Rlc3RpbmcpCisJCXJldHVybjsKKwlwcmludGYoIiVkIC4uLiIsIEcuY3VycmVudGx5X3Rlc3RpbmcpOworCWZmbHVzaF9hbGwoKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfYmxvY2tzKHZvaWQpCit7CisJc2l6ZV90IHRyeSwgZ290OworCisJRy5jdXJyZW50bHlfdGVzdGluZyA9IDA7CisJc2lnbmFsKFNJR0FMUk0sIGFsYXJtX2ludHIpOworCWFsYXJtKDUpOworCXdoaWxlIChHLmN1cnJlbnRseV90ZXN0aW5nIDwgU0JfWk9ORVMpIHsKKwkJbXNnX2VvbCA9ICJzZWVrIGZhaWxlZCBpbiBjaGVja19ibG9ja3MiOworCQl4bHNlZWsoZGV2X2ZkLCBHLmN1cnJlbnRseV90ZXN0aW5nICogQkxPQ0tfU0laRSwgU0VFS19TRVQpOworCQltc2dfZW9sID0gIlxuIjsKKwkJdHJ5ID0gVEVTVF9CVUZGRVJfQkxPQ0tTOworCQlpZiAoRy5jdXJyZW50bHlfdGVzdGluZyArIHRyeSA+IFNCX1pPTkVTKQorCQkJdHJ5ID0gU0JfWk9ORVMgLSBHLmN1cnJlbnRseV90ZXN0aW5nOworCQlnb3QgPSBkb19jaGVjayhHLmNoZWNrX2Jsb2Nrc19idWZmZXIsIHRyeSwgRy5jdXJyZW50bHlfdGVzdGluZyk7CisJCUcuY3VycmVudGx5X3Rlc3RpbmcgKz0gZ290OworCQlpZiAoZ290ID09IHRyeSkKKwkJCWNvbnRpbnVlOworCQlpZiAoRy5jdXJyZW50bHlfdGVzdGluZyA8IFNCX0ZJUlNUWk9ORSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgYmxvY2tzIGJlZm9yZSBkYXRhLWFyZWE6IGNhbm5vdCBtYWtlIGZzIik7CisJCW1hcmtfem9uZShHLmN1cnJlbnRseV90ZXN0aW5nKTsKKwkJRy5iYWRibG9ja3MrKzsKKwkJRy5jdXJyZW50bHlfdGVzdGluZysrOworCX0KKwlhbGFybSgwKTsKKwlwcmludGYoIiVkIGJhZCBibG9jayhzKVxuIiwgRy5iYWRibG9ja3MpOworfQorCitzdGF0aWMgdm9pZCBnZXRfbGlzdF9ibG9ja3MoY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqbGlzdGZpbGU7CisJdW5zaWduZWQgbG9uZyBibG9ja25vOworCisJbGlzdGZpbGUgPSB4Zm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCXdoaWxlICghZmVvZihsaXN0ZmlsZSkpIHsKKwkJZnNjYW5mKGxpc3RmaWxlLCAiJWxkXG4iLCAmYmxvY2tubyk7CisJCW1hcmtfem9uZShibG9ja25vKTsKKwkJRy5iYWRibG9ja3MrKzsKKwl9CisJcHJpbnRmKCIlZCBiYWQgYmxvY2socylcbiIsIEcuYmFkYmxvY2tzKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfdGFibGVzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpbm9kZXM7CisJdW5zaWduZWQgbm9ybV9maXJzdHpvbmU7CisJdW5zaWduZWQgc2Jfem1hcHM7CisJdW5zaWduZWQgaTsKKworCS8qIG1lbXNldChHLnN1cGVyYmxvY2tfYnVmZmVyLCAwLCBCTE9DS19TSVpFKTsgKi8KKwkvKiBtZW1zZXQoRy5ib290X2Jsb2NrX2J1ZmZlciwgMCwgNTEyKTsgKi8KKwlTQl9NQUdJQyA9IEcubWFnaWM7CisJU0JfWk9ORV9TSVpFID0gMDsKKwlTQl9NQVhTSVpFID0gdmVyc2lvbjIgPyAweDdmZmZmZmZmIDogKDcgKyA1MTIgKyA1MTIgKiA1MTIpICogMTAyNDsKKwlpZiAodmVyc2lvbjIpCisJCVNCLnNfem9uZXMgPSBHLnRvdGFsX2Jsb2NrczsKKwllbHNlCisJCVNCLnNfbnpvbmVzID0gRy50b3RhbF9ibG9ja3M7CisKKwkvKiBzb21lIG1hZ2ljIG5yczogMSBpbm9kZSAvIDMgYmxvY2tzICovCisJaWYgKEcucmVxX25yX2lub2RlcyA9PSAwKQorCQlpbm9kZXMgPSBHLnRvdGFsX2Jsb2NrcyAvIDM7CisJZWxzZQorCQlpbm9kZXMgPSBHLnJlcV9ucl9pbm9kZXM7CisJLyogUm91bmQgdXAgaW5vZGUgY291bnQgdG8gZmlsbCBibG9jayBzaXplICovCisJaWYgKHZlcnNpb24yKQorCQlpbm9kZXMgPSAoaW5vZGVzICsgTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgLSAxKSAmCisJCSAgICAgICAgICAgICAgICAgfihNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAtIDEpOworCWVsc2UKKwkJaW5vZGVzID0gKGlub2RlcyArIE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLIC0gMSkgJgorCQkgICAgICAgICAgICAgICAgIH4oTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0sgLSAxKTsKKwlpZiAoaW5vZGVzID4gNjU1MzUpCisJCWlub2RlcyA9IDY1NTM1OworCVNCX0lOT0RFUyA9IGlub2RlczsKKwlTQl9JTUFQUyA9IGRpdl9yb3VuZHVwKFNCX0lOT0RFUyArIDEsIEJJVFNfUEVSX0JMT0NLKTsKKworCS8qIFJlYWwgYmFkIGhhY2sgYnV0IG92ZXJ3aXNlIG1rZnMubWluaXggY2FuIGJlIHRocm93bgorCSAqIGluIGluZmluaXRlIGxvb3AuLi4KKwkgKiB0cnk6CisJICogZGQgaWY9L2Rldi96ZXJvIG9mPXRlc3QuZnMgY291bnQ9MTAgYnM9MTAyNAorCSAqIG1rZnMubWluaXggLWkgMjAwIHRlc3QuZnMKKwkgKi8KKwkvKiBUaGlzIGNvZGUgaXMgbm90IGluc2FuZTogTk9STV9GSVJTVFpPTkUgaXMgbm90IGEgY29uc3RhbnQsCisJICogaXQgaXMgY2FsY3VsYXRlZCBmcm9tIFNCX0lOT0RFUywgU0JfSU1BUFMgYW5kIFNCX1pNQVBTICovCisJaSA9IDk5OTsKKwlTQl9aTUFQUyA9IDA7CisJZG8geworCQlub3JtX2ZpcnN0em9uZSA9IE5PUk1fRklSU1RaT05FOworCQlzYl96bWFwcyA9IGRpdl9yb3VuZHVwKEcudG90YWxfYmxvY2tzIC0gbm9ybV9maXJzdHpvbmUgKyAxLCBCSVRTX1BFUl9CTE9DSyk7CisJCWlmIChTQl9aTUFQUyA9PSBzYl96bWFwcykgZ290byBnb3RfaXQ7CisJCVNCX1pNQVBTID0gc2Jfem1hcHM7CisJCS8qIG5ldyBTQl9aTUFQUywgbmVlZCB0byByZWNhbGMgTk9STV9GSVJTVFpPTkUgKi8KKwl9IHdoaWxlICgtLWkpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbmNvbXBhdGlibGUgc2l6ZS9pbm9kZSBjb3VudCwgdHJ5IGRpZmZlcmVudCAtaSBOIik7CisgZ290X2l0OgorCisJU0JfRklSU1RaT05FID0gbm9ybV9maXJzdHpvbmU7CisJRy5pbm9kZV9tYXAgPSB4bWFsbG9jKFNCX0lNQVBTICogQkxPQ0tfU0laRSk7CisJRy56b25lX21hcCA9IHhtYWxsb2MoU0JfWk1BUFMgKiBCTE9DS19TSVpFKTsKKwltZW1zZXQoRy5pbm9kZV9tYXAsIDB4ZmYsIFNCX0lNQVBTICogQkxPQ0tfU0laRSk7CisJbWVtc2V0KEcuem9uZV9tYXAsIDB4ZmYsIFNCX1pNQVBTICogQkxPQ0tfU0laRSk7CisJZm9yIChpID0gU0JfRklSU1RaT05FOyBpIDwgU0JfWk9ORVM7IGkrKykKKwkJdW5tYXJrX3pvbmUoaSk7CisJZm9yIChpID0gTUlOSVhfUk9PVF9JTk87IGkgPD0gU0JfSU5PREVTOyBpKyspCisJCXVubWFya19pbm9kZShpKTsKKwlHLmlub2RlX2J1ZmZlciA9IHh6YWxsb2MoSU5PREVfQlVGRkVSX1NJWkUpOworCXByaW50ZigiJWxkIGlub2Rlc1xuIiwgKGxvbmcpU0JfSU5PREVTKTsKKwlwcmludGYoIiVsZCBibG9ja3NcbiIsIChsb25nKVNCX1pPTkVTKTsKKwlwcmludGYoIkZpcnN0ZGF0YXpvbmU9JWxkICglbGQpXG4iLCAobG9uZylTQl9GSVJTVFpPTkUsIChsb25nKW5vcm1fZmlyc3R6b25lKTsKKwlwcmludGYoIlpvbmVzaXplPSVkXG4iLCBCTE9DS19TSVpFIDw8IFNCX1pPTkVfU0laRSk7CisJcHJpbnRmKCJNYXhzaXplPSVsZFxuIiwgKGxvbmcpU0JfTUFYU0laRSk7Cit9CisKK2ludCBta2ZzX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBta2ZzX21pbml4X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqdG1wOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJY2hhciAqc3RyX2k7CisJY2hhciAqbGlzdGZpbGUgPSBOVUxMOworCisJSU5JVF9HKCk7CisvKiBkZWZhdWx0IChjaGFuZ2VkIHRvIDMwLCBwZXIgTGludXMncyBzdWdnZXN0aW9uLCBTdW4gTm92IDIxIDA4OjA1OjA3IDE5OTMpICovCisJRy5uYW1lbGVuID0gMzA7CisJRy5kaXJzaXplID0gMzI7CisJRy5tYWdpYyA9IE1JTklYMV9TVVBFUl9NQUdJQzI7CisKKwlpZiAoSU5PREVfU0laRTEgKiBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGlub2RlIHNpemUiKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwlpZiAoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGlub2RlIHNpemUiKTsKKyNlbmRpZgorCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibisiOyAvKiAtbiBOICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNpOmw6bjp2IiwgJnN0cl9pLCAmbGlzdGZpbGUsICZHLm5hbWVsZW4pOworCWFyZ3YgKz0gb3B0aW5kOworCS8vaWYgKG9wdCAmIDEpIC1jCisJaWYgKG9wdCAmIDIpIEcucmVxX25yX2lub2RlcyA9IHhhdG91bChzdHJfaSk7IC8vIC1pCisJLy9pZiAob3B0ICYgNCkgLWwKKwlpZiAob3B0ICYgOCkgeyAvLyAtbgorCQlpZiAoRy5uYW1lbGVuID09IDE0KSBHLm1hZ2ljID0gTUlOSVgxX1NVUEVSX01BR0lDOworCQllbHNlIGlmIChHLm5hbWVsZW4gPT0gMzApIEcubWFnaWMgPSBNSU5JWDFfU1VQRVJfTUFHSUMyOworCQllbHNlIGJiX3Nob3dfdXNhZ2UoKTsKKwkJRy5kaXJzaXplID0gRy5uYW1lbGVuICsgMjsKKwl9CisJaWYgKG9wdCAmIDB4MTApIHsgLy8gLXYKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwkJdmVyc2lvbjIgPSAxOworI2Vsc2UKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBjb21waWxlZCB3aXRoIG1pbml4IHYyIHN1cHBvcnQiKTsKKyNlbmRpZgorCX0KKworCUcuZGV2aWNlX25hbWUgPSAqYXJndisrOworCWlmICghRy5kZXZpY2VfbmFtZSkKKwkJYmJfc2hvd191c2FnZSgpOworCWlmICgqYXJndikKKwkJRy50b3RhbF9ibG9ja3MgPSB4YXRvdTMyKCphcmd2KTsKKwllbHNlCisJCUcudG90YWxfYmxvY2tzID0gZ2V0X3NpemUoRy5kZXZpY2VfbmFtZSkgLyAxMDI0OworCisJaWYgKEcudG90YWxfYmxvY2tzIDwgMTApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtdXN0IGhhdmUgYXQgbGVhc3QgMTAgYmxvY2tzIik7CisKKwlpZiAodmVyc2lvbjIpIHsKKwkJRy5tYWdpYyA9IE1JTklYMl9TVVBFUl9NQUdJQzI7CisJCWlmIChHLm5hbWVsZW4gPT0gMTQpCisJCQlHLm1hZ2ljID0gTUlOSVgyX1NVUEVSX01BR0lDOworCX0gZWxzZSBpZiAoRy50b3RhbF9ibG9ja3MgPiA2NTUzNSkKKwkJRy50b3RhbF9ibG9ja3MgPSA2NTUzNTsKKworCS8qIENoZWNrIGlmIGl0IGlzIG1vdW50ZWQgKi8KKwlpZiAoZmluZF9tb3VudF9wb2ludChHLmRldmljZV9uYW1lLCAwKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZvcm1hdCBtb3VudGVkIGZpbGVzeXN0ZW0iKTsKKworCXhtb3ZlX2ZkKHhvcGVuKEcuZGV2aWNlX25hbWUsIE9fUkRXUiksIGRldl9mZCk7CisJeGZzdGF0KGRldl9mZCwgJnN0YXRidWYsIEcuZGV2aWNlX25hbWUpOworCWlmICghU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpKQorCQlvcHQgJj0gfjE7IC8vIGNsZWFyIC1jIChjaGVjaykKKworLyogSSBkb24ndCBrbm93IHdoeSBzb21lb25lIGhhcyBzcGVjaWFsIGNvZGUgdG8gcHJldmVudCBta2ZzLm1pbml4CisgKiBvbiBJREUgZGV2aWNlcy4gV2h5IElERSBidXQgbm90IFNDU0ksIGV0Yz8uLi4gKi8KKyNpZiAwCisJZWxzZSBpZiAoc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDMwMCB8fCBzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzQwKQorCQkvKiB3aGF0IGlzIHRoaXM/ICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3aWxsIG5vdCB0cnkgIgorCQkJInRvIG1ha2UgZmlsZXN5c3RlbSBvbiAnJXMnIiwgRy5kZXZpY2VfbmFtZSk7CisjZW5kaWYKKworCXRtcCA9IEcucm9vdF9ibG9jazsKKwkqKHNob3J0ICopIHRtcCA9IDE7CisJc3RyY3B5KHRtcCArIDIsICIuIik7CisJdG1wICs9IEcuZGlyc2l6ZTsKKwkqKHNob3J0ICopIHRtcCA9IDE7CisJc3RyY3B5KHRtcCArIDIsICIuLiIpOworCXRtcCArPSBHLmRpcnNpemU7CisJKihzaG9ydCAqKSB0bXAgPSAyOworCXN0cmNweSh0bXAgKyAyLCAiLmJhZGJsb2NrcyIpOworCisJc2V0dXBfdGFibGVzKCk7CisKKwlpZiAob3B0ICYgMSkgLy8gLWMgPworCQljaGVja19ibG9ja3MoKTsKKwllbHNlIGlmIChsaXN0ZmlsZSkKKwkJZ2V0X2xpc3RfYmxvY2tzKGxpc3RmaWxlKTsKKworCWlmICh2ZXJzaW9uMikgeworCQltYWtlX3Jvb3RfaW5vZGUyKCk7CisJCW1ha2VfYmFkX2lub2RlMigpOworCX0gZWxzZSB7CisJCW1ha2Vfcm9vdF9pbm9kZSgpOworCQltYWtlX2JhZF9pbm9kZSgpOworCX0KKworCW1hcmtfZ29vZF9ibG9ja3MoKTsKKwl3cml0ZV90YWJsZXMoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWtmc19yZWlzZXIuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbWtmc19yZWlzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGVmYjllCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ta2ZzX3JlaXNlci5jCkBAIC0wLDAgKzEsMzc1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBta2ZzX3JlaXNlcjogdXRpbGl0eSB0byBjcmVhdGUgUmVpc2VyRlMgZmlsZXN5c3RlbQorICoKKyAqIEJ1c3lib3gnZWQgKDIwMDkpIGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBta2ZzX3JlaXNlcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mXSBbLWwgTEFCRUxdIEJMT0NLREVWIFs0Sy1CTE9DS1NdIgorLy91c2FnZTojZGVmaW5lIG1rZnNfcmVpc2VyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTWFrZSBhIFJlaXNlckZTIFYzIGZpbGVzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOiAgICAgIlxuCS1sIExCTAlWb2x1bWUgbGFiZWwiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK2NoYXIgQlVHX3dyb25nX2ZpZWxkX3NpemUodm9pZCk7CisjZGVmaW5lIFNUT1JFX0xFKGZpZWxkLCB2YWx1ZSkgXAorZG8geyBcCisJaWYgKHNpemVvZihmaWVsZCkgPT0gNCkgXAorCQlmaWVsZCA9IFNXQVBfTEUzMih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDIpIFwKKwkJZmllbGQgPSBTV0FQX0xFMTYodmFsdWUpOyBcCisJZWxzZSBpZiAoc2l6ZW9mKGZpZWxkKSA9PSAxKSBcCisJCWZpZWxkID0gKHZhbHVlKTsgXAorCWVsc2UgXAorCQlCVUdfd3JvbmdfZmllbGRfc2l6ZSgpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZFVENIX0xFMzIoZmllbGQpIFwKKwkoc2l6ZW9mKGZpZWxkKSA9PSA0ID8gU1dBUF9MRTMyKGZpZWxkKSA6IEJVR193cm9uZ19maWVsZF9zaXplKCkpCisKK3N0cnVjdCBqb3VybmFsX3BhcmFtcyB7CisJdWludDMyX3QganBfam91cm5hbF8xc3RfYmxvY2s7ICAgICAgLyogd2hlcmUgZG9lcyBqb3VybmFsIHN0YXJ0IGZyb20gb24gaXRzIGRldmljZSAqLworCXVpbnQzMl90IGpwX2pvdXJuYWxfZGV2OyAgICAgICAgICAgIC8qIGpvdXJuYWwgZGV2aWNlIHN0X3JkZXYgKi8KKwl1aW50MzJfdCBqcF9qb3VybmFsX3NpemU7ICAgICAgICAgICAvKiBzaXplIG9mIHRoZSBqb3VybmFsIG9uIEZTIGNyZWF0aW9uLiB1c2VkIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbid0IG92ZXJmbG93IGl0ICovCisJdWludDMyX3QganBfam91cm5hbF90cmFuc19tYXg7ICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgaW4gYSB0cmFuc2FjdGlvbi4gICovCisJdWludDMyX3QganBfam91cm5hbF9tYWdpYzsgICAgICAgICAgLyogcmFuZG9tIHZhbHVlIG1hZGUgb24gZnMgY3JlYXRpb24gKHRoaXMgd2FzIHNiX2pvdXJuYWxfYmxvY2tfY291bnQpICovCisJdWludDMyX3QganBfam91cm5hbF9tYXhfYmF0Y2g7ICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhIHRyYW5zICovCisJdWludDMyX3QganBfam91cm5hbF9tYXhfY29tbWl0X2FnZTsgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYW4gYXN5bmMgY29tbWl0IGJlICovCisJdWludDMyX3QganBfam91cm5hbF9tYXhfdHJhbnNfYWdlOyAgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYSB0cmFuc2FjdGlvbiBiZSAqLworfTsKKworc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyIHsKKwl1aW50MzJfdCBqaF9sYXN0X2ZsdXNoX3RyYW5zX2lkOyAgICAvKiBpZCBvZiBsYXN0IGZ1bGx5IGZsdXNoZWQgdHJhbnNhY3Rpb24gKi8KKwl1aW50MzJfdCBqaF9maXJzdF91bmZsdXNoZWRfb2Zmc2V0OyAvKiBvZmZzZXQgaW4gdGhlIGxvZyBvZiB3aGVyZSB0byBzdGFydCByZXBsYXkgYWZ0ZXIgYSBjcmFzaCAqLworCXVpbnQzMl90IGpoX21vdW50X2lkOworCXN0cnVjdCBqb3VybmFsX3BhcmFtcyBqaF9qb3VybmFsOworCXVpbnQzMl90IGpoX2xhc3RfY2hlY2tfbW91bnRfaWQ7ICAgIC8qIHRoZSBtb3VudCBpZCBvZiB0aGUgZnMgZHVyaW5nIHRoZSBsYXN0IHJlaXNlcmZzY2sgLS1jaGVjay4gKi8KK307CisKK3N0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayB7CisJdWludDMyX3Qgc2JfYmxvY2tfY291bnQ7ICAgICAgICAgICAgLyogMCBudW1iZXIgb2YgYmxvY2sgb24gZGF0YSBkZXZpY2UgKi8KKwl1aW50MzJfdCBzYl9mcmVlX2Jsb2NrczsgICAgICAgICAgICAvKiA0IGZyZWUgYmxvY2tzIGNvdW50ICovCisJdWludDMyX3Qgc2Jfcm9vdF9ibG9jazsgICAgICAgICAgICAgLyogOCByb290IG9mIHRoZSB0cmVlICovCisKKwlzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgc2Jfam91cm5hbDsgICAvKiAxMiAqLworCisJdWludDE2X3Qgc2JfYmxvY2tzaXplOyAgICAgICAgICAvKiA0NCAqLworCXVpbnQxNl90IHNiX29pZF9tYXhzaXplOyAgICAgICAgLyogNDYgbWF4IHNpemUgb2Ygb2JqZWN0IGlkIGFycmF5LCBzZWUgZ2V0X29iamVjdGlkKCkgY29tbWVudGFyeSAqLworCXVpbnQxNl90IHNiX29pZF9jdXJzaXplOyAgICAgICAgLyogNDggY3VycmVudCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSAqLworCXVpbnQxNl90IHNiX3Vtb3VudF9zdGF0ZTsgICAgICAgLyogNTAgdGhpcyBpcyBzZXQgdG8gMSB3aGVuIGZpbGVzeXN0ZW0gd2FzIHVtb3VudGVkLCB0byAyIC0gd2hlbiBub3QgKi8KKworCWNoYXIgc19tYWdpY1sxMF07ICAgICAgICAgICAgICAgLyogNTIgIlJlSXNFckZzIiBvciAiUmVJc0VyMkZzIiBvciAiUmVJc0VyM0ZzIiAqLworCXVpbnQxNl90IHNiX2ZzX3N0YXRlOyAgICAgICAgICAgLyogNjIgaXQgaXMgc2V0IHRvIHVzZWQgYnkgZnNjayB0byBtYXJrIHdoaWNoIHBoYXNlIG9mIHJlYnVpbGRpbmcgaXMgZG9uZSAodXNlZCBmb3IgZnNjayBkZWJ1Z2dpbmcpICovCisJdWludDMyX3Qgc2JfaGFzaF9mdW5jdGlvbl9jb2RlOyAvKiA2NCBjb2RlIG9mIGZ1Y3Rpb24gd2hpY2ggd2FzL2lzL3dpbGwgYmUgdXNlZCB0byBzb3J0IG5hbWVzIGluIGEgZGlyZWN0b3J5LiBTZWUgY29kZXMgaW4gYWJvdmUgKi8KKwl1aW50MTZfdCBzYl90cmVlX2hlaWdodDsgICAgICAgIC8qIDY4IGhlaWdodCBvZiBmaWxlc3l0ZW0gdHJlZS4gVHJlZSBjb25zaXN0aW5nIG9mIG9ubHkgb25lIHJvb3QgYmxvY2sgaGFzIDIgaGVyZSAqLworCXVpbnQxNl90IHNiX2JtYXBfbnI7ICAgICAgICAgICAgLyogNzAgYW1vdW50IG9mIGJpdG1hcCBibG9ja3MgbmVlZGVkIHRvIGFkZHJlc3MgZWFjaCBibG9jayBvZiBmaWxlIHN5c3RlbSAqLworCXVpbnQxNl90IHNiX3ZlcnNpb247ICAgICAgICAgICAgLyogNzIgdGhpcyBmaWVsZCBpcyBvbmx5IHJlbGlhYmxlIG9uIGZpbGVzeXN0ZW0gd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLworCXVpbnQxNl90IHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsOyAgLyogNzQgc2l6ZSBpbiBibG9ja3Mgb2Ygam91cm5hbCBhcmVhIG9uIG1haW4gZGV2aWNlLCB3ZSBuZWVkIHRvIGtlZXAgYWZ0ZXIgbm9uLXN0YW5kYXJkIGpvdXJuYWwgcmVsb2NhdGlvbiAqLworCXVpbnQzMl90IHNiX2lub2RlX2dlbmVyYXRpb247ICAgLyogNzYgKi8KKwl1aW50MzJfdCBzYl9mbGFnczsgICAgICAgICAgICAgIC8qIDgwIFJpZ2h0IG5vdyB1c2VkIG9ubHkgYnkgaW5vZGUtYXR0cmlidXRlcywgaWYgZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgc191dWlkWzE2XTsgICAgICAgLyogODQgZmlsZXN5c3RlbSB1bmlxdWUgaWRlbnRpZmllciAqLworCXVuc2lnbmVkIGNoYXIgc19sYWJlbFsxNl07ICAgICAgLyogMTAwIGZpbGVzeXN0ZW0gdm9sdW1lIGxhYmVsICovCisJdWludDE2X3Qgc2JfbW50X2NvdW50OyAgICAgICAgICAvKiAxMTYgKi8KKwl1aW50MTZfdCBzYl9tYXhfbW50X2NvdW50OyAgICAgIC8qIDExOCAqLworCXVpbnQzMl90IHNiX2xhc3RjaGVjazsgICAgICAgICAgLyogMTIwICovCisJdWludDMyX3Qgc2JfY2hlY2tfaW50ZXJ2YWw7ICAgICAvKiAxMjQgKi8KKy8qIHplcm8gZmlsbGVkIGJ5IG1rcmVpc2VyZnMgYW5kIHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKCkgc28gYW55IGFkZGl0aW9ucyBtdXN0IGJlIHVwZGF0ZWQgdGhlcmUgYXMgd2VsbC4gKi8KKwljaGFyIHNfdW51c2VkWzc2XTsgICAgICAgICAgICAgIC8qIDEyOCAqLworCS8qIDIwNCAqLworfTsKKworLyogSGVhZGVyIG9mIGEgZGlzayBibG9jay4gIE1vcmUgcHJlY2lzZWx5LCBoZWFkZXIgb2YgYSBmb3JtYXR0ZWQgbGVhZgorICAgb3IgaW50ZXJuYWwgbm9kZSwgYW5kIG5vdCB0aGUgaGVhZGVyIG9mIGFuIHVuZm9ybWF0dGVkIG5vZGUuICovCitzdHJ1Y3QgYmxvY2tfaGVhZCB7CisJdWludDE2X3QgYmxrMl9sZXZlbDsgICAgICAgIC8qIExldmVsIG9mIGEgYmxvY2sgaW4gdGhlIHRyZWUuICovCisJdWludDE2X3QgYmxrMl9ucl9pdGVtOyAgICAgIC8qIE51bWJlciBvZiBrZXlzL2l0ZW1zIGluIGEgYmxvY2suICovCisJdWludDE2X3QgYmxrMl9mcmVlX3NwYWNlOyAgIC8qIEJsb2NrIGZyZWUgc3BhY2UgaW4gYnl0ZXMuICovCisJdWludDE2X3QgYmxrX3Jlc2VydmVkOworCXVpbnQzMl90IHJlc2VydmVkWzRdOworfTsKKworI2RlZmluZSBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAoNjQgKiAxMDI0KQorCisjZGVmaW5lIFJFSVNFUkZTXzNfNl9TVVBFUl9NQUdJQ19TVFJJTkcgIlJlSXNFcjJGcyIKKyNkZWZpbmUgUkVJU0VSRlNfRk9STUFUXzNfNiAgICAgMgorI2RlZmluZSBERUZBVUxUX01BWF9NTlRfQ09VTlQgICAzMCAgICAgICAgICAgICAgICAgICAgICAvKiAzMCBtb3VudHMgKi8KKyNkZWZpbmUgREVGQVVMVF9DSEVDS19JTlRFUlZBTCAgKDE4MCAqIDYwICogNjAgKiAyNCkgICAgLyogMTgwIGRheXMgKi8KKworI2RlZmluZSBGU19DTEVBTkxZX1VNT1VOVEVEICAgICAxIC8qIHRoaXMgd2FzIFJFSVNFUkZTX1ZBTElEX0ZTICovCisKKyNkZWZpbmUgSk9VUk5BTF9NSU5fU0laRSAgICAgICAgNTEyCisvKiBiaWdnZXN0IHBvc3NpYmxlIHNpbmdsZSB0cmFuc2FjdGlvbiwgZG9uJ3QgY2hhbmdlIGZvciBub3cgKDgvMy85OSkgKi8KKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19NQVggICAgICAgMTAyNAorI2RlZmluZSBKT1VSTkFMX1RSQU5TX01JTiAgICAgICAyNTYgICAgIC8qIG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCB3b3JrcyAqLworI2RlZmluZSBKT1VSTkFMX0RFRkFVTFRfUkFUSU8gICA4ICAgICAgIC8qIGRlZmF1bHQgam91cm5hbCBzaXplIC8gbWF4IHRyYW5zIGxlbmd0aCAqLworI2RlZmluZSBKT1VSTkFMX01JTl9SQVRJTyAgICAgICAyCisvKiBtYXggYmxvY2tzIHRvIGJhdGNoIGludG8gb25lIHRyYW5zYWN0aW9uLCBkb24ndCBtYWtlIHRoaXMgYW55IGJpZ2dlciB0aGFuIDkwMCAqLworI2RlZmluZSBKT1VSTkFMX01BWF9CQVRDSCAgICAgICA5MDAKKyNkZWZpbmUgSk9VUk5BTF9NQVhfQ09NTUlUX0FHRSAgMzAKKworCisvLyBTdGFuZGFyZCBta3JlaXNlcmZzIDMuNi4yMToKKy8vICAgLWIgfCAtLWJsb2NrLXNpemUgTiAgICAgICAgICAgICAgc2l6ZSBvZiBmaWxlLXN5c3RlbSBibG9jaywgaW4gYnl0ZXMKKy8vICAgLWogfCAtLWpvdXJuYWwtZGV2aWNlIEZJTEUgICAgICAgcGF0aCB0byBzZXBhcmF0ZSBkZXZpY2UgdG8gaG9sZCBqb3VybmFsCisvLyAgIC1zIHwgLS1qb3VybmFsLXNpemUgTiAgICAgICAgICAgIHNpemUgb2YgdGhlIGpvdXJuYWwgaW4gYmxvY2tzCisvLyAgIC1vIHwgLS1qb3VybmFsLW9mZnNldCBOICAgICAgICAgIG9mZnNldCBvZiB0aGUgam91cm5hbCBmcm9tIHRoZSBzdGFydCBvZgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2VwYXJhdGUgZGV2aWNlLCBpbiBibG9ja3MKKy8vICAgLXQgfCAtLXRyYW5zYWN0aW9uLW1heC1zaXplIE4gICAgbWF4aW1hbCBzaXplIG9mIHRyYW5zYWN0aW9uLCBpbiBibG9ja3MKKy8vICAgLUIgfCAtLWJhZGJsb2NrcyBmaWxlICAgICAgICAgICAgc3RvcmUgYWxsIGJhZCBibG9ja3MgZ2l2ZW4gaW4gZmlsZSBvbiB0aGUgZnMKKy8vICAgLWggfCAtLWhhc2ggcnVwYXNvdnx0ZWF8cjUgICAgICAgaGFzaCBmdW5jdGlvbiB0byB1c2UgYnkgZGVmYXVsdAorLy8gICAtdSB8IC0tdXVpZCBVVUlEICAgICAgICAgICAgICAgICBzdG9yZSBVVUlEIGluIHRoZSBzdXBlcmJsb2NrCisvLyAgIC1sIHwgLS1sYWJlbCBMQUJFTCAgICAgICAgICAgICAgIHN0b3JlIExBQkVMIGluIHRoZSBzdXBlcmJsb2NrCisvLyAgIC0tZm9ybWF0IDMuNXwzLjYgICAgICAgICAgICAgICAgIG9sZCAzLjUgZm9ybWF0IG9yIG5ld2VyIDMuNgorLy8gICAtZiB8IC0tZm9yY2UgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgb25jZSwgbWFrZSBta3JlaXNlcmZzIHRoZSB3aG9sZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrLCBub3QgYmxvY2sgZGV2aWNlIG9yIG1vdW50ZWQgcGFydGl0aW9uOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgdHdpY2UsIGRvIG5vdCBhc2sgZm9yIGNvbmZpcm1hdGlvbgorLy8gICAtcSB8IC0tcXVpZXQgICAgICAgICAgICAgICAgICAgICBxdWlldCB3b3JrIHdpdGhvdXQgbWVzc2FnZXMsIHByb2dyZXNzIGFuZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbnMuIFVzZWZ1bCBpZiBydW4gaW4gYSBzY3JpcHQuIEZvciB1c2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgZW5kIHVzZXJzIG9ubHkuCisvLyAgIC1kIHwgLS1kZWJ1ZyAgICAgICAgICAgICAgICAgICAgIHByaW50IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBkdXJpbmcgbWtyZWlzZXIKKy8vICAgLVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBhbmQgZXhpdAorCisvLyBPcHRpb25zIG5vdCBjb21tZW50ZWQgYmVsb3cgYXJlIHRha2VuIGJ1dCBzaWxlbnRseSBpZ25vcmVkOgorZW51bSB7CisJT1BUX2IgPSAxIDw8IDAsCisJT1BUX2ogPSAxIDw8IDEsCisJT1BUX3MgPSAxIDw8IDIsCisJT1BUX28gPSAxIDw8IDMsCisJT1BUX3QgPSAxIDw8IDQsCisJT1BUX0IgPSAxIDw8IDUsCisJT1BUX2ggPSAxIDw8IDYsCisJT1BUX3UgPSAxIDw8IDcsCisJT1BUX2wgPSAxIDw8IDgsCQkvLyBsYWJlbAorCU9QVF9mID0gMSA8PCA5LAkJLy8gYXNrIG5vIHF1ZXN0aW9ucworCU9QVF9xID0gMSA8PCAxMCwKKwlPUFRfZCA9IDEgPDwgMTEsCisJLy9PUFRfViA9IDEgPDwgMTIsCS8vIC1WIHZlcnNpb24uIGJib3ggYXBwbGV0cyBkb24ndCBzdXBwb3J0IHRoYXQKK307CisKK2ludCBta2ZzX3JlaXNlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtmc19yZWlzZXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IDQwOTY7CisJdW5zaWduZWQgam91cm5hbF9ibG9ja3MgPSA4MTkyOworCXVuc2lnbmVkIGJsb2NrcywgYml0bWFwX2Jsb2NrcywgaSwgYmxvY2s7CisJdGltZV90IHRpbWVzdGFtcDsKKwljb25zdCBjaGFyICpsYWJlbCA9ICIiOworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKwl1aW50OF90ICpidWY7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgKmpwOworCXN0cnVjdCBibG9ja19oZWFkICpyb290OworCisJLy8gdXNpbmcgZ2xvYmFsICJvcHRpb25fbWFzazMyIiBpbnN0ZWFkIG9mIGxvY2FsICJvcHRzIjoKKwkvLyB3ZSBhcmUgcmVnaXN0ZXIgc3RhcnZlZCBoZXJlCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6YisiOworCS8qb3B0cyA9Ki8gZ2V0b3B0MzIoYXJndiwgImI6ajpzOm86dDpCOmg6dTpsOmZxZCIsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICZsYWJlbCk7CisJYXJndiArPSBvcHRpbmQ7IC8vIGFyZ3ZbMF0gLS0gZGV2aWNlCisKKwkvLyBjaGVjayB0aGUgZGV2aWNlIGlzIGEgYmxvY2sgZGV2aWNlCisJZmQgPSB4b3Blbihhcmd2WzBdLCBPX1dST05MWSB8IE9fRVhDTCk7CisJeGZzdGF0KGZkLCAmc3QsIGFyZ3ZbMF0pOworCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSAmJiAhKG9wdGlvbl9tYXNrMzIgJiBPUFRfZikpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm90IGEgYmxvY2sgZGV2aWNlIiwgYXJndlswXSk7CisKKwkvLyBjaGVjayBpZiBpdCBpcyBtb3VudGVkCisJLy8gTi5CLiB3aGF0IGlmIHdlIGZvcm1hdCBhIGZpbGU/IGZpbmRfbW91bnRfcG9pbnQgd2lsbCByZXR1cm4gZmFsc2UgbmVnYXRpdmUgc2luY2UKKwkvLyBpdCBpcyBsb29wIGJsb2NrIGRldmljZSB3aGljaCBpcyBtb3VudGVkIQorCWlmIChmaW5kX21vdW50X3BvaW50KGFyZ3ZbMF0sIDApKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZm9ybWF0IG1vdW50ZWQgZmlsZXN5c3RlbSIpOworCisJLy8gb3BlbiB0aGUgZGV2aWNlLCBnZXQgc2l6ZSBpbiBibG9ja3MKKwlibG9ja3MgPSBnZXRfdm9sdW1lX3NpemVfaW5fYnl0ZXMoZmQsIGFyZ3ZbMV0sIGJsb2Nrc2l6ZSwgLypleHRlbmQ6Ki8gMSkgLyBibG9ja3NpemU7CisKKwkvLyBibG9jayBudW1iZXIgc2FuaXR5IGNoZWNrCisJLy8gd2UgaGF2ZSBhIGxpbWl0OiBza2lwcGVkIGFyZWEsIHN1cGVyIGJsb2NrLCBqb3VybmFsIGFuZCByb290IGJsb2NrCisJLy8gYWxsIGhhdmUgdG8gYmUgYWRkcmVzc2VkIGJ5IG9uZSBmaXJzdCBiaXRtYXAKKwlibG9jayA9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gYmxvY2tzaXplIC8vIGJvb3QgYXJlYQorCQkrIDEJCS8vIHNiCisJCSsgMQkJLy8gYml0bWFwIzAKKwkJKyBqb3VybmFsX2Jsb2NrcysxCS8vIGpvdXJuYWwKKwk7CisKKwkvLyBjb3VudCBvdmVyaGVhZAorCWJpdG1hcF9ibG9ja3MgPSAoYmxvY2tzIC0gMSkgLyAoYmxvY2tzaXplICogOCkgKyAxOworCWkgPSBibG9jayArIGJpdG1hcF9ibG9ja3M7CisKKwkvLyBjaGVjayBvdmVyaGVhZAorCWlmIChNSU4oYmxvY2tzaXplICogOCwgYmxvY2tzKSA8IGkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuZWVkID49ICV1IGJsb2NrcyIsIGkpOworCisJLy8gYXNrIGNvbmZpcm1hdGlvbj8KKwkvLyBUT0RPOiA/Pz8KKworCS8vIHdpcGUgb3V0IGZpcnN0IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIG9mIGRldmljZQorCS8vIFRPRE86IGRvIHdlIHJlYWxseSBuZWVkIHRvIHdpcGU/IQorCXhsc2VlayhmZCwgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMsIFNFRUtfU0VUKTsKKworCS8vIGZpbGwgc3VwZXJibG9jaworCXNiID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKXh6YWxsb2MoYmxvY2tzaXplKTsKKwkvLyBibG9jayBjb3VudAorCVNUT1JFX0xFKHNiLT5zYl9ibG9ja19jb3VudCwgYmxvY2tzKTsKKwlTVE9SRV9MRShzYi0+c2JfZnJlZV9ibG9ja3MsIGJsb2NrcyAtIGkpOworCS8vIFRPRE86IGRlY3lwaGVyIQorCVNUT1JFX0xFKHNiLT5zYl9yb290X2Jsb2NrLCBibG9jayk7CisJLy8gZmlsbCBqb3VybmFsIHJlbGF0ZWQgZmllbGRzCisJanAgPSAmc2ItPnNiX2pvdXJuYWw7CisJU1RPUkVfTEUoanAtPmpwX2pvdXJuYWxfMXN0X2Jsb2NrLCBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAvIGJsb2Nrc2l6ZSArIDEvKnNiKi8gKyAxLypibXAjMCovKTsKKwl0aW1lc3RhbXAgPSB0aW1lKE5VTEwpOworCXNyYW5kb20odGltZXN0YW1wKTsKKwlTVE9SRV9MRShqcC0+anBfam91cm5hbF9tYWdpYywgcmFuZG9tKCkpOworCVNUT1JFX0xFKGpwLT5qcF9qb3VybmFsX3NpemUsIGpvdXJuYWxfYmxvY2tzKTsKKwlTVE9SRV9MRShqcC0+anBfam91cm5hbF90cmFuc19tYXgsIEpPVVJOQUxfVFJBTlNfTUFYKTsKKwlTVE9SRV9MRShqcC0+anBfam91cm5hbF9tYXhfYmF0Y2gsIEpPVVJOQUxfTUFYX0JBVENIKTsKKwlTVE9SRV9MRShqcC0+anBfam91cm5hbF9tYXhfY29tbWl0X2FnZSwgSk9VUk5BTF9NQVhfQ09NTUlUX0FHRSk7CisJLy8gc2l6ZXMKKwlTVE9SRV9MRShzYi0+c2JfYmxvY2tzaXplLCBibG9ja3NpemUpOworCVNUT1JFX0xFKHNiLT5zYl9vaWRfbWF4c2l6ZSwgKGJsb2Nrc2l6ZSAtIHNpemVvZigqc2IpKSAvIHNpemVvZih1aW50MzJfdCkgLyAyICogMik7CisJU1RPUkVfTEUoc2ItPnNiX29pZF9jdXJzaXplLCAyKTsgLy8gIi4iIGFuZCAiLi4iCisJc3RyY3B5KHNiLT5zX21hZ2ljLCBSRUlTRVJGU18zXzZfU1VQRVJfTUFHSUNfU1RSSU5HKTsKKwlTVE9SRV9MRShzYi0+c2JfYm1hcF9uciwgKGJpdG1hcF9ibG9ja3MgPiAoKDFMTCA8PCAxNikgLSAxKSkgPyAwIDogYml0bWFwX2Jsb2Nrcyk7CisJLy8gbWlzYworCVNUT1JFX0xFKHNiLT5zYl92ZXJzaW9uLCBSRUlTRVJGU19GT1JNQVRfM182KTsKKwlTVE9SRV9MRShzYi0+c2JfbGFzdGNoZWNrLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKHNiLT5zYl9jaGVja19pbnRlcnZhbCwgREVGQVVMVF9DSEVDS19JTlRFUlZBTCk7CisJU1RPUkVfTEUoc2ItPnNiX21udF9jb3VudCwgMSk7CisJU1RPUkVfTEUoc2ItPnNiX21heF9tbnRfY291bnQsIERFRkFVTFRfTUFYX01OVF9DT1VOVCk7CisJU1RPUkVfTEUoc2ItPnNiX3Vtb3VudF9zdGF0ZSwgRlNfQ0xFQU5MWV9VTU9VTlRFRCk7CisJU1RPUkVfTEUoc2ItPnNiX3RyZWVfaGVpZ2h0LCAyKTsKKwlTVE9SRV9MRShzYi0+c2JfaGFzaF9mdW5jdGlvbl9jb2RlLCAzKTsgLy8gUjVfSEFTSAorCVNUT1JFX0xFKHNiLT5zYl9mbGFncywgMSk7CisJLy9TVE9SRV9MRShzYi0+c2JfcmVzZXJ2ZWRfZm9yX2pvdXJuYWwsIDApOworCS8vIGNyZWF0ZSBVVUlECisJZ2VuZXJhdGVfdXVpZChzYi0+c191dWlkKTsKKwkvLyB3cml0ZSB0aGUgbGFiZWwKKwlzYWZlX3N0cm5jcHkoKGNoYXIgKilzYi0+c19sYWJlbCwgbGFiZWwsIHNpemVvZihzYi0+c19sYWJlbCkpOworCisJLy8gVE9ETzogRU1QSVJJQyEgRU5ESUFOTkVTUyEKKwkvLyBzdXBlcmJsb2NrIGhhcyBvbmx5IDIwNCBieXRlcy4gV2hhdCBhcmUgdGhlc2U/CisJYnVmID0gKHVpbnQ4X3QgKilzYjsKKwlidWZbMjA1XSA9IDE7CisJYnVmWzIwOV0gPSAzOworCisJLy8gcHV0IHN1cGVyYmxvY2sKKwl4d3JpdGUoZmQsIHNiLCBibG9ja3NpemUpOworCisJLy8gY3JlYXRlIGJpdG1hcHMKKwlidWYgPSB4emFsbG9jKGJsb2Nrc2l6ZSk7CisKKwkvLyBiaXRtYXAgIzAgdXNlcyBpbml0aWFsICJibG9jayIrMSBibG9ja3MKKwlpID0gYmxvY2sgKyAxOworCW1lbXNldChidWYsIDB4RkYsIGkgLyA4KTsKKwlidWZbaSAvIDhdID0gKDEgPDwgKGkgJiA3KSkgLSAxOyAvLzAuLjcgPT4gMDAwMDAwMDAuLjAxMTExMTExCisJLy8gbWFyayB0cmFpbGluZyBhYnNlbnQgYmxvY2tzLCBpZiBhbnkKKwlpZiAoYmxvY2tzIDwgOCpibG9ja3NpemUpIHsKKwkJdW5zaWduZWQgbiA9IDgqYmxvY2tzaXplIC0gYmxvY2tzOworCQlpID0gbiAvIDg7CisJCWJ1ZltibG9ja3NpemUgLSBpIC0gMV0gfD0gMHg3RjAwID4+IChuICYgNyk7IC8vMC4uNyA9PiAwMDAwMDAwMC4uMTExMTExMTAKKwkJbWVtc2V0KGJ1ZiArIGJsb2Nrc2l6ZSAtIGksIDB4RkYsIGkpOyAvLyBOLkIuIG5vIG92ZXJmbG93IGhlcmUhCisJfQorCS8vIHB1dCBiaXRtYXAgIzAKKwl4d3JpdGUoZmQsIGJ1ZiwgYmxvY2tzaXplKTsKKworCS8vIG5vdyBnbyBqb3VybmFsIGJsb2NrcworCW1lbXNldChidWYsIDAsIGJsb2Nrc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IGpvdXJuYWxfYmxvY2tzOyBpKyspCisJCXh3cml0ZShmZCwgYnVmLCBibG9ja3NpemUpOworCS8vIGR1bXAgam91cm5hbCBjb250cm9sIGJsb2NrCisJbWVtY3B5KCYoKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciAqKWJ1ZiktPmpoX2pvdXJuYWwsICZzYi0+c2Jfam91cm5hbCwgc2l6ZW9mKHNiLT5zYl9qb3VybmFsKSk7CisJeHdyaXRlKGZkLCBidWYsIGJsb2Nrc2l6ZSk7CisKKwkvLyBvdGhlciBiaXRtYXBzIGFyZSBpbiBldmVyeSAoOCpibG9ja3NpemUpLXRoIGJsb2NrCisJLy8gTi5CLiB0aGV5IHVzZSB0aGUgb25seSBibG9jayAtLSBuYW1lbHkgYml0bWFwIGl0c2VsZiEKKwlidWZbMF0gPSAweDAxOworCS8vIHB1dCBiaXRtYXBzCisJZm9yIChpID0gMTsgaSA8IGJpdG1hcF9ibG9ja3M7IGkrKykgeworCQl4bHNlZWsoZmQsIGkqOCpibG9ja3NpemUgKiBibG9ja3NpemUsIFNFRUtfU0VUKTsKKwkJLy8gbWFyayB0cmFpbGluZyBhYnNlbnQgYmxvY2tzLCBpZiBhbnkKKwkJaWYgKGkgPT0gYml0bWFwX2Jsb2NrcyAtIDEgJiYgKGJsb2NrcyAlICg4KmJsb2Nrc2l6ZSkpKSB7CisJCQl1bnNpZ25lZCBuID0gOCpibG9ja3NpemUgLSBibG9ja3MgJSAoOCpibG9ja3NpemUpOworCQkJdW5zaWduZWQgaiA9IG4gLyA4OworCQkJYnVmW2Jsb2Nrc2l6ZSAtIGogLSAxXSB8PSAweDdGMDAgPj4gKG4gJiA3KTsgLy8wLi43ID0+IDAwMDAwMDAwLi4xMTExMTExMAorCQkJbWVtc2V0KGJ1ZiArIGJsb2Nrc2l6ZSAtIGosIDB4RkYsIGopOyAvLyBOLkIuIG5vIG92ZXJmbG93IGhlcmUhCisJCX0KKwkJeHdyaXRlKGZkLCBidWYsIGJsb2Nrc2l6ZSk7CisJfQorCisJLy8gZmlsbCByb290IGJsb2NrCisJLy8gYmxvY2sgaGVhZAorCW1lbXNldChidWYsIDAsIGJsb2Nrc2l6ZSk7CisJcm9vdCA9IChzdHJ1Y3QgYmxvY2tfaGVhZCAqKWJ1ZjsKKwlTVE9SRV9MRShyb290LT5ibGsyX2xldmVsLCAxKTsgLy8gbGVhZiBub2RlCisJU1RPUkVfTEUocm9vdC0+YmxrMl9ucl9pdGVtLCAyKTsgLy8gIi4iIGFuZCAiLi4iCisJU1RPUkVfTEUocm9vdC0+YmxrMl9mcmVlX3NwYWNlLCBibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGJsb2NrX2hlYWQpKTsKKwkvLyBpdGVtIGhlYWQKKwkvLyByb290IGRpcmVjdG9yeQorCS8vIFRPRE86IEVNUElSSUMhIEVORElBTk5FU1MhCisJLy8gVE9ETzogaW5kZW50ZWQgYXNzaWdubWVudHMgc2VlbSB0byBiZSB0aW1lc3RhbXBzCitidWZbNF0gPSAwMTM0OworYnVmWzI0XSA9IDAxOworYnVmWzI4XSA9IDAyOworYnVmWzQyXSA9IDA1NDsKK2J1Zls0NF0gPSAwMzI0OworYnVmWzQ1XSA9IDAxNzsKK2J1Zls0Nl0gPSAwMTsKK2J1Zls0OF0gPSAwMTsKK2J1Zls1Ml0gPSAwMjsKK2J1Zls1Nl0gPSAwMTsKK2J1Zls2MF0gPSAwMzY0OworYnVmWzYxXSA9IDAxOworYnVmWzY0XSA9IDAyOworYnVmWzY2XSA9IDA2MDsKK2J1Zls2OF0gPSAwMjQ0OworYnVmWzY5XSA9IDAxNzsKK2J1Zls0MDA0XSA9IDAxOworYnVmWzQwMDhdID0gMDE7CitidWZbNDAxMl0gPSAwMjsKK2J1Zls0MDE2XSA9IDA1MDsKK2J1Zls0MDE4XSA9IDA0OworYnVmWzQwMjBdID0gMDI7CitidWZbNDAyOF0gPSAwMTsKK2J1Zls0MDMyXSA9IDA0MDsKK2J1Zls0MDM0XSA9IDA0OworCitidWZbNDAzNl0gPSAwNTY7IGJ1Zls0MDM3XSA9IDA1NjsJLy8gIi4uIgorYnVmWzQwNDRdID0gMDU2OwkJCS8vICIuIgorCitidWZbNDA1Ml0gPSAwMzU1OworYnVmWzQwNTNdID0gMDEwMTsKK2J1Zls0MDU2XSA9IDAzOworYnVmWzQwNjBdID0gMDYwOworCQlidWZbNDA3Nl0gPSAwMTczOworCQlidWZbNDA3N10gPSAwMjQwOworCWJ1Zls0MDc4XSA9IDAzNDQ7CisJYnVmWzQwNzldID0gMDExMjsKKwkJYnVmWzQwODBdID0gMDE3MzsKKwkJYnVmWzQwODFdID0gMDI0MDsKKwlidWZbNDA4Ml0gPSAwMzQ0OworCWJ1Zls0MDgzXSA9IDAxMTI7CisJCWJ1Zls0MDg0XSA9IDAxNzM7CisJCWJ1Zls0MDg1XSA9IDAyNDA7CisJYnVmWzQwODZdID0gMDM0NDsKKwlidWZbNDA4N10gPSAwMTEyOworYnVmWzQwODhdID0gMDE7CisKKwkvLyBwdXQgcm9vdCBibG9jaworCXhsc2VlayhmZCwgYmxvY2sgKiBibG9ja3NpemUsIFNFRUtfU0VUKTsKKwl4d3JpdGUoZmQsIGJ1ZiwgYmxvY2tzaXplKTsKKworCS8vIGNsZWFudXAKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShidWYpOworCQlmcmVlKHNiKTsKKwl9CisKKwl4Y2xvc2UoZmQpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21rZnNfdmZhdC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ta2ZzX3ZmYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDgxZWQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ta2ZzX3ZmYXQuYwpAQCAtMCwwICsxLDYzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtmc192ZmF0OiB1dGlsaXR5IHRvIGNyZWF0ZSBGQVQzMiBmaWxlc3lzdGVtCisgKiBpbnNwaXJlZCBieSBkb3Nmc3Rvb2xzCisgKgorICogQnVzeWJveCdlZCAoMjAwOSkgYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rZnNfdmZhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12XSBbLW4gTEFCRUxdIEJMT0NLREVWIFtLQllURVNdIgorLyogQWNjZXB0ZWQgYnV0IGlnbm9yZWQ6CisgICAgICAgIlstY10gWy1DXSBbLUldIFstbCBiYWQtYmxvY2stZmlsZV0gWy1iIGJhY2t1cC1ib290LXNlY3Rvcl0gIgorICAgICAgICJbLW0gYm9vdC1tc2ctZmlsZV0gWy1pIHZvbHVtZS1pZF0gIgorICAgICAgICJbLXMgc2VjdG9ycy1wZXItY2x1c3Rlcl0gWy1TIGxvZ2ljYWwtc2VjdG9yLXNpemVdIFstZiBudW1iZXItb2YtRkFUc10gIgorICAgICAgICJbLWggaGlkZGVuLXNlY3RvcnNdIFstRiBmYXQtc2l6ZV0gWy1yIHJvb3QtZGlyLWVudHJpZXNdIFstUiByZXNlcnZlZC1zZWN0b3JzXSAiCisqLworLy91c2FnZTojZGVmaW5lIG1rZnNfdmZhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1ha2UgYSBGQVQzMiBmaWxlc3lzdGVtXG4iCisvKiAvL3VzYWdlOiAgIlxuCS1jCUNoZWNrIGRldmljZSBmb3IgYmFkIGJsb2NrcyIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8qIC8vdXNhZ2U6ICAiXG4JLUkJQWxsb3cgdG8gdXNlIGVudGlyZSBkaXNrIGRldmljZSAoZS5nLiAvZGV2L2hkYSkiICovCisvL3VzYWdlOiAgICAgIlxuCS1uIExCTAlWb2x1bWUgbGFiZWwiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4gLyogSERJT19HRVRHRU8gKi8KKyNpbmNsdWRlIDxsaW51eC9mZC5oPiAgICAvKiBGREdFVFBSTSAqLworI2luY2x1ZGUgPHN5cy9tb3VudC5oPiAgIC8qIEJMS1NTWkdFVCAqLworI2lmICFkZWZpbmVkKEJMS1NTWkdFVCkKKyMgZGVmaW5lIEJMS1NTWkdFVCBfSU8oMHgxMiwgMTA0KQorI2VuZGlmCisvLyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorCisjZGVmaW5lIFNFQ1RPUl9TSVpFICAgICAgICAgICAgIDUxMgorCisjZGVmaW5lIFNFQ1RPUlNfUEVSX0JMT0NLCShCTE9DS19TSVpFIC8gU0VDVE9SX1NJWkUpCisKKy8vIE0kIHNheXMgdGhlIGhpZ2ggNCBiaXRzIG9mIGEgRkFUMzIgRkFUIGVudHJ5IGFyZSByZXNlcnZlZAorI2RlZmluZSBFT0ZfRkFUMzIgICAgICAgMHgwRkZGRkZGOAorI2RlZmluZSBCQURfRkFUMzIgICAgICAgMHgwRkZGRkZGNworI2RlZmluZSBNQVhfQ0xVU1RfMzIgICAgMHgwRkZGRkZGMAorCisjZGVmaW5lIEFUVFJfVk9MVU1FICAgICA4CisKKyNkZWZpbmUgTlVNX0ZBVFMgICAgICAgIDIKKworLyogRkFUMzIgZmlsZXN5c3RlbSBsb29rcyBsaWtlIHRoaXM6CisgKiBzZWN0b3IgLW5uLi4uLTE6ICJoaWRkZW4iIHNlY3RvcnMsIGFsbCBzZWN0b3JzIGJlZm9yZSB0aGlzIHBhcnRpdGlvbgorICogKC1oIGhpZGRlbi1zZWN0b3JzIHNldHMgaXQuIFVzZWZ1bCBvbmx5IGZvciBib290IGxvYWRlcnMsCisgKiAgdGhleSBuZWVkIHRvIGtub3cgX2Rpc2tfIG9mZnNldCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvcnJlY3RseQorICogIGFkZHJlc3Mgc2VjdG9ycyByZWxhdGl2ZSB0byBzdGFydCBvZiBkaXNrKQorICogc2VjdG9yIDA6IGJvb3Qgc2VjdG9yCisgKiBzZWN0b3IgMTogaW5mbyBzZWN0b3IKKyAqIHNlY3RvciAyOiBzZXQgYXNpZGUgZm9yIGJvb3QgY29kZSB3aGljaCBkaWRuJ3QgZml0IGludG8gc2VjdG9yIDAKKyAqIC4uLih6ZXJvLWZpbGxlZCBzZWN0b3JzKS4uLgorICogc2VjdG9yIEI6IGJhY2t1cCBjb3B5IG9mIHNlY3RvciAwIFtCIHNldCBieSAtYiBiYWNrdXAtYm9vdC1zZWN0b3JdCisgKiBzZWN0b3IgQisxOiBiYWNrdXAgY29weSBvZiBzZWN0b3IgMQorICogc2VjdG9yIEIrMjogYmFja3VwIGNvcHkgb2Ygc2VjdG9yIDIKKyAqIC4uLih6ZXJvLWZpbGxlZCBzZWN0b3JzKS4uLgorICogc2VjdG9yIFI6IEZBVCMxIFtSIHNldCBieSAtUiByZXNlcnZlZC1zZWN0b3JzXQorICogLi4uKEZBVCMxKS4uLgorICogc2VjdG9yIFIrZmF0X3NpemU6IEZBVCMyCisgKiAuLi4oRkFUIzIpLi4uCisgKiBzZWN0b3IgUitmYXRfc2l6ZSoyOiBjbHVzdGVyICMyCisgKiAuLi4oY2x1c3RlciAjMikuLi4KKyAqIHNlY3RvciBSK2ZhdF9zaXplKjIrY2x1c3Rfc2l6ZTogY2x1c3RlciAjMworICogLi4uKHRoZSByZXN0IGlzIGZpbGxlZCBieSBjbHVzdGVycyB0aWxsIHRoZSBlbmQpLi4uCisgKi8KKworZW51bSB7CisvLyBQZXJoYXBzIHRoaXMgc2hvdWxkIHJlbWFpbiBjb25zdGFudAorCWluZm9fc2VjdG9yX251bWJlciA9IDEsCisvLyBUT0RPOiBtYWtlIHRoZXNlIGNtZGxpbmUgb3B0aW9ucworLy8gZG9udCBmb3JnZXQgc2FuaXR5IGNoZWNrOiBiYWNrdXBfYm9vdF9zZWN0b3IgKyAzIDw9IHJlc2VydmVkX3NlY3QKKwliYWNrdXBfYm9vdF9zZWN0b3IgPSAzLAorCXJlc2VydmVkX3NlY3QgICAgICA9IDYsCit9OworCisvLyBob3cgbWFueSBibG9ja3Mgd2UgdHJ5IHRvIHJlYWQgd2hpbGUgdGVzdGluZworI2RlZmluZSBURVNUX0JVRkZFUl9CTE9DS1MgICAgICAxNgorCitzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5IHsKKwljaGFyICAgICBuYW1lWzExXTsgICAgICAgLyogMDAwIG5hbWUgYW5kIGV4dGVuc2lvbiAqLworCXVpbnQ4X3QgIGF0dHI7ICAgICAgICAgICAvKiAwMGIgYXR0cmlidXRlIGJpdHMgKi8KKwl1aW50OF90ICBsY2FzZTsgICAgICAgICAgLyogMDBjIGNhc2UgZm9yIGJhc2UgYW5kIGV4dGVuc2lvbiAqLworCXVpbnQ4X3QgIGN0aW1lX2NzOyAgICAgICAvKiAwMGQgY3JlYXRpb24gdGltZSwgY2VudGlzZWNvbmRzICgwLTE5OSkgKi8KKwl1aW50MTZfdCBjdGltZTsgICAgICAgICAgLyogMDBlIGNyZWF0aW9uIHRpbWUgKi8KKwl1aW50MTZfdCBjZGF0ZTsgICAgICAgICAgLyogMDEwIGNyZWF0aW9uIGRhdGUgKi8KKwl1aW50MTZfdCBhZGF0ZTsgICAgICAgICAgLyogMDEyIGxhc3QgYWNjZXNzIGRhdGUgKi8KKwl1aW50MTZfdCBzdGFydGhpOyAgICAgICAgLyogMDE0IGhpZ2ggMTYgYml0cyBvZiBjbHVzdGVyIGluIEZBVDMyICovCisJdWludDE2X3QgdGltZTsgICAgICAgICAgIC8qIDAxNiB0aW1lICovCisJdWludDE2X3QgZGF0ZTsgICAgICAgICAgIC8qIDAxOCBkYXRlICovCisJdWludDE2X3Qgc3RhcnQ7ICAgICAgICAgIC8qIDAxYSBmaXJzdCBjbHVzdGVyICovCisJdWludDMyX3Qgc2l6ZTsgICAgICAgICAgIC8qIDAxYyBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KK30gUEFDS0VEOworCisvKiBFeGFtcGxlIG9mIGJvb3Qgc2VjdG9yJ3MgYmVnaW5uaW5nOgorMDAwMCAgZWIgNTggOTAgNGQgNTMgNTcgNDkgNGUgIDM0IDJlIDMxIDAwIDAyIDA4IDI2IDAwICB8Li4uTVNXSU40LjEuLi4mLnwKKzAwMTAgIDAyIDAwIDAwIDAwIDAwIGY4IDAwIDAwICAzZiAwMCBmZiAwMCAzZiAwMCAwMCAwMCAgfC4uLi4uLi4uPy4uLj8uLi58CiswMDIwICA1NCA5YiBkMCAwMCAwZCAzNCAwMCAwMCAgMDAgMDAgMDAgMDAgMDIgMDAgMDAgMDAgIHxULi4uLjQuLi4uLi4uLi4ufAorMDAzMCAgMDEgMDAgMDYgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwNDAgIDgwIDAwIDI5IDcxIGRmIDUxIGUwIDRlICA0ZiAyMCA0ZSA0MSA0ZCA0NSAyMCAyMCAgfC4uKXEuUS5OTyBOQU1FICB8CiswMDUwICAyMCAyMCA0NiA0MSA1NCAzMyAzMiAyMCAgMjAgMjAgMzMgYzkgOGUgZDEgYmMgZjQgIHwgIEZBVDMyICAgMy4uLi4ufAorKi8KK3N0cnVjdCBtc2Rvc192b2x1bWVfaW5mbyB7IC8qIChvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byBzdGFydCBvZiBib290IHNlY3RvcikgKi8KKwl1aW50OF90ICBkcml2ZV9udW1iZXI7ICAgIC8qIDA0MCBCSU9TIGRyaXZlIG51bWJlciAqLworCXVpbnQ4X3QgIHJlc2VydmVkOyAgICAgICAgLyogMDQxIHVudXNlZCAqLworCXVpbnQ4X3QgIGV4dF9ib290X3NpZ247CSAgLyogMDQyIDB4MjkgaWYgZmllbGRzIGJlbG93IGV4aXN0IChET1MgMy4zKykgKi8KKwl1aW50MzJfdCB2b2x1bWVfaWQzMjsgICAgIC8qIDA0MyB2b2x1bWUgSUQgbnVtYmVyICovCisJY2hhciAgICAgdm9sdW1lX2xhYmVsWzExXTsvKiAwNDcgdm9sdW1lIGxhYmVsICovCisJY2hhciAgICAgZnNfdHlwZVs4XTsgICAgICAvKiAwNTIgdHlwaWNhbGx5ICJGQVRubiIgKi8KK30gUEFDS0VEOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwNWEgZW5kLiBUb3RhbCBzaXplIDI2ICgweDFhKSBieXRlcyAqLworCitzdHJ1Y3QgbXNkb3NfYm9vdF9zZWN0b3IgeworCS8qIFdlIHVzZSBzdHJjcHkgdG8gZmlsbCBib3RoLCBhbmQgZ2NjLTQuNC54IGNvbXBsYWlucyBpZiB0aGV5IGFyZSBzZXBhcmF0ZSAqLworCWNoYXIgICAgIGJvb3RfanVtcF9hbmRfc3lzX2lkWzMrOF07IC8qIDAwMCBzaG9ydCBvciBuZWFyIGp1bXAgaW5zdHJ1Y3Rpb24gKi8KKwkvKmNoYXIgICBzeXN0ZW1faWRbOF07Ki8gICAgIC8qIDAwMyBuYW1lIC0gY2FuIGJlIHVzZWQgdG8gc3BlY2lhbCBjYXNlIHBhcnRpdGlvbiBtYW5hZ2VyIHZvbHVtZXMgKi8KKwl1aW50MTZfdCBieXRlc19wZXJfc2VjdDsgICAgIC8qIDAwYiBieXRlcyBwZXIgbG9naWNhbCBzZWN0b3IgKi8KKwl1aW50OF90ICBzZWN0X3Blcl9jbHVzdDsgICAgIC8qIDAwZCBzZWN0b3JzL2NsdXN0ZXIgKi8KKwl1aW50MTZfdCByZXNlcnZlZF9zZWN0OyAgICAgIC8qIDAwZSByZXNlcnZlZCBzZWN0b3JzIChzZWN0b3Igb2Zmc2V0IG9mIDFzdCBGQVQgcmVsYXRpdmUgdG8gdm9sdW1lIHN0YXJ0KSAqLworCXVpbnQ4X3QgIGZhdHM7ICAgICAgICAgICAgICAgLyogMDEwIG51bWJlciBvZiBGQVRzICovCisJdWludDE2X3QgZGlyX2VudHJpZXM7ICAgICAgICAvKiAwMTEgcm9vdCBkaXJlY3RvcnkgZW50cmllcyAqLworCXVpbnQxNl90IHZvbHVtZV9zaXplX3NlY3Q7ICAgLyogMDEzIHZvbHVtZSBzaXplIGluIHNlY3RvcnMgKi8KKwl1aW50OF90ICBtZWRpYV9ieXRlOyAgICAgICAgIC8qIDAxNSBtZWRpYSBjb2RlICovCisJdWludDE2X3Qgc2VjdF9wZXJfZmF0OyAgICAgICAvKiAwMTYgc2VjdG9ycy9GQVQgKi8KKwl1aW50MTZfdCBzZWN0X3Blcl90cmFjazsgICAgIC8qIDAxOCBzZWN0b3JzIHBlciB0cmFjayAqLworCXVpbnQxNl90IGhlYWRzOyAgICAgICAgICAgICAgLyogMDFhIG51bWJlciBvZiBoZWFkcyAqLworCXVpbnQzMl90IGhpZGRlbjsgICAgICAgICAgICAgLyogMDFjIGhpZGRlbiBzZWN0b3JzIChzZWN0b3Igb2Zmc2V0IG9mIHZvbHVtZSB3aXRoaW4gcGh5c2ljYWwgZGlzaykgKi8KKwl1aW50MzJfdCBmYXQzMl92b2x1bWVfc2l6ZV9zZWN0OyAvKiAwMjAgdm9sdW1lIHNpemUgaW4gc2VjdG9ycyAoaWYgdm9sdW1lX3NpemVfc2VjdCA9PSAwKSAqLworCXVpbnQzMl90IGZhdDMyX3NlY3RfcGVyX2ZhdDsgLyogMDI0IHNlY3RvcnMvRkFUICovCisJdWludDE2X3QgZmF0MzJfZmxhZ3M7ICAgICAgICAvKiAwMjggYml0IDg6IGZhdCBtaXJyb3JpbmcsIGxvdyA0OiBhY3RpdmUgZmF0ICovCisJdWludDhfdCAgZmF0MzJfdmVyc2lvblsyXTsgICAvKiAwMmEgbWFqb3IsIG1pbm9yIGZpbGVzeXN0ZW0gdmVyc2lvbiAoSSBzZWUgMCwwKSAqLworCXVpbnQzMl90IGZhdDMyX3Jvb3RfY2x1c3RlcjsgLyogMDJjIGZpcnN0IGNsdXN0ZXIgaW4gcm9vdCBkaXJlY3RvcnkgKi8KKwl1aW50MTZfdCBmYXQzMl9pbmZvX3NlY3RvcjsgIC8qIDAzMCBmaWxlc3lzdGVtIGluZm8gc2VjdG9yICh1c3VhbGx5IDEpICovCisJdWludDE2X3QgZmF0MzJfYmFja3VwX2Jvb3Q7ICAvKiAwMzIgYmFja3VwIGJvb3Qgc2VjdG9yICh1c3VhbGx5IDYpICovCisJdWludDMyX3QgcmVzZXJ2ZWQyWzNdOyAgICAgICAvKiAwMzQgdW51c2VkICovCisJc3RydWN0IG1zZG9zX3ZvbHVtZV9pbmZvIHZpOyAvKiAwNDAgKi8KKwljaGFyICAgICBib290X2NvZGVbMHgyMDAgLSAweDVhIC0gMl07IC8qIDA1YSAqLworI2RlZmluZSBCT09UX1NJR04gMHhBQTU1CisJdWludDE2X3QgYm9vdF9zaWduOyAgICAgICAgICAvKiAxZmUgKi8KK30gUEFDS0VEOworCisjZGVmaW5lIEZBVF9GU0lORk9fU0lHMSAweDQxNjE1MjUyCisjZGVmaW5lIEZBVF9GU0lORk9fU0lHMiAweDYxNDE3MjcyCitzdHJ1Y3QgZmF0MzJfZnNpbmZvIHsKKwl1aW50MzJfdCBzaWduYXR1cmUxOyAgICAgICAgIC8qIDB4NTIsMHg1MiwweDQxLDB4NjEsICJSUmFBIiAqLworCXVpbnQzMl90IHJlc2VydmVkMVsxMjggLSA4XTsKKwl1aW50MzJfdCBzaWduYXR1cmUyOyAgICAgICAgIC8qIDB4NzIsMHg3MiwweDYxLDB4NDEsICJyckFhIiAqLworCXVpbnQzMl90IGZyZWVfY2x1c3RlcnM7ICAgICAgLyogZnJlZSBjbHVzdGVyIGNvdW50LiAgLTEgaWYgdW5rbm93biAqLworCXVpbnQzMl90IG5leHRfY2x1c3RlcjsgICAgICAgLyogbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgY2x1c3RlciAqLworCXVpbnQzMl90IHJlc2VydmVkMlszXTsKKwl1aW50MTZfdCByZXNlcnZlZDM7ICAgICAgICAgIC8qIDFmYyAqLworCXVpbnQxNl90IGJvb3Rfc2lnbjsgICAgICAgICAgLyogMWZlICovCit9IFBBQ0tFRDsKKworc3RydWN0IGJ1Z19jaGVjayB7CisJY2hhciBCVUcxW3NpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICApID09IDB4MjAgPyAxIDogLTFdOworCWNoYXIgQlVHMltzaXplb2Yoc3RydWN0IG1zZG9zX3ZvbHVtZV9pbmZvKSA9PSAweDFhID8gMSA6IC0xXTsKKwljaGFyIEJVRzNbc2l6ZW9mKHN0cnVjdCBtc2Rvc19ib290X3NlY3RvcikgPT0gMHgyMDAgPyAxIDogLTFdOworCWNoYXIgQlVHNFtzaXplb2Yoc3RydWN0IGZhdDMyX2ZzaW5mbyAgICAgKSA9PSAweDIwMCA/IDEgOiAtMV07Cit9OworCitzdGF0aWMgY29uc3QgY2hhciBib290X2NvZGVbXSBBTElHTjEgPQorCSJceDBlIiAgICAgICAgICAvKiAwNWE6ICAgICAgICAgcHVzaCAgY3MgKi8KKwkiXHgxZiIgICAgICAgICAgLyogMDViOiAgICAgICAgIHBvcCAgIGRzICovCisJIlx4YmVceDc3XHg3YyIgIC8qICB3cml0ZV9tc2c6ICBtb3YgICBzaSwgb2Zmc2V0IG1lc3NhZ2VfdHh0ICovCisJIlx4YWMiICAgICAgICAgIC8qIDA1ZjogICAgICAgICBsb2RzYiAqLworCSJceDIyXHhjMCIgICAgICAvKiAwNjA6ICAgICAgICAgYW5kICAgYWwsIGFsICovCisJIlx4NzRceDBiIiAgICAgIC8qIDA2MjogICAgICAgICBqeiAgICBrZXlfcHJlc3MgKi8KKwkiXHg1NiIgICAgICAgICAgLyogMDY0OiAgICAgICAgIHB1c2ggIHNpICovCisJIlx4YjRceDBlIiAgICAgIC8qIDA2NTogICAgICAgICBtb3YgICBhaCwgMGVoICovCisJIlx4YmJceDA3XHgwMCIgIC8qIDA2NzogICAgICAgICBtb3YgICBieCwgMDAwN2ggKi8KKwkiXHhjZFx4MTAiICAgICAgLyogMDZhOiAgICAgICAgIGludCAgIDEwaCAqLworCSJceDVlIiAgICAgICAgICAvKiAwNmM6ICAgICAgICAgcG9wICAgc2kgKi8KKwkiXHhlYlx4ZjAiICAgICAgLyogMDZkOiAgICAgICAgIGptcCAgIHdyaXRlX21zZyAqLworCSJceDMyXHhlNCIgICAgICAvKiAga2V5X3ByZXNzOiAgeG9yICAgYWgsIGFoICovCisJIlx4Y2RceDE2IiAgICAgIC8qIDA3MTogICAgICAgICBpbnQgICAxNmggKi8KKwkiXHhjZFx4MTkiICAgICAgLyogMDczOiAgICAgICAgIGludCAgIDE5aCAqLworCSJceGViXHhmZSIgICAgICAvKiAgZm9vOiAgICAgICAgam1wICAgZm9vICovCisJLyogMDc3OiBtZXNzYWdlX3R4dDogKi8KKwkiVGhpcyBpcyBub3QgYSBib290YWJsZSBkaXNrXHJcbiI7CisKKworI2RlZmluZSBNQVJLX0NMVVNURVIoY2x1c3RlciwgdmFsdWUpIFwKKwkoKHVpbnQzMl90ICopZmF0KVtjbHVzdGVyXSA9IFNXQVBfTEUzMih2YWx1ZSkKKwordm9pZCBCVUdfdW5zdXBwb3J0ZWRfZmllbGRfc2l6ZSh2b2lkKTsKKyNkZWZpbmUgU1RPUkVfTEUoZmllbGQsIHZhbHVlKSBcCitkbyB7IFwKKwlpZiAoc2l6ZW9mKGZpZWxkKSA9PSA0KSBcCisJCWZpZWxkID0gU1dBUF9MRTMyKHZhbHVlKTsgXAorCWVsc2UgaWYgKHNpemVvZihmaWVsZCkgPT0gMikgXAorCQlmaWVsZCA9IFNXQVBfTEUxNih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDEpIFwKKwkJZmllbGQgPSAodmFsdWUpOyBcCisJZWxzZSBcCisJCUJVR191bnN1cHBvcnRlZF9maWVsZF9zaXplKCk7IFwKK30gd2hpbGUgKDApCisKKy8qIGNvbXBhdDoKKyAqIG1rZG9zZnMgMi4xMSAoMTIgTWFyIDIwMDUpCisgKiBVc2FnZTogbWtkb3NmcyBbLUFdIFstY10gWy1DXSBbLXZdIFstSV0gWy1sIGJhZC1ibG9jay1maWxlXQorICogICAgICAgIFstYiBiYWNrdXAtYm9vdC1zZWN0b3JdCisgKiAgICAgICAgWy1tIGJvb3QtbXNnLWZpbGVdIFstbiB2b2x1bWUtbmFtZV0gWy1pIHZvbHVtZS1pZF0KKyAqICAgICAgICBbLXMgc2VjdG9ycy1wZXItY2x1c3Rlcl0gWy1TIGxvZ2ljYWwtc2VjdG9yLXNpemVdCisgKiAgICAgICAgWy1mIG51bWJlci1vZi1GQVRzXQorICogICAgICAgIFstaCBoaWRkZW4tc2VjdG9yc10gWy1GIGZhdC1zaXplXSBbLXIgcm9vdC1kaXItZW50cmllc10KKyAqICAgICAgICBbLVIgcmVzZXJ2ZWQtc2VjdG9yc10KKyAqICAgICAgICAvZGV2L25hbWUgW2Jsb2Nrc10KKyAqLworaW50IG1rZnNfdmZhdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtmc192ZmF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBjaGFyICp2b2x1bWVfbGFiZWwgPSAiIjsKKwljaGFyICpidWY7CisJY2hhciAqZGV2aWNlX25hbWU7CisJdW9mZl90IHZvbHVtZV9zaXplX2J5dGVzOworCXVvZmZfdCB2b2x1bWVfc2l6ZV9zZWN0OworCXVpbnQzMl90IHRvdGFsX2NsdXN0OworCXVpbnQzMl90IHZvbHVtZV9pZDsKKwlpbnQgZGV2OworCXVuc2lnbmVkIGJ5dGVzX3Blcl9zZWN0OworCXVuc2lnbmVkIHNlY3RfcGVyX2ZhdDsKKwl1bnNpZ25lZCBvcHRzOworCXVpbnQxNl90IHNlY3RfcGVyX3RyYWNrOworCXVpbnQ4X3QgbWVkaWFfYnl0ZTsKKwl1aW50OF90IHNlY3RfcGVyX2NsdXN0OworCXVpbnQ4X3QgaGVhZHM7CisJZW51bSB7CisJCU9QVF9BID0gMSA8PCAwLCAgLy8gW0lHTk9SRURdIGF0YXJpIGZvcm1hdAorCQlPUFRfYiA9IDEgPDwgMSwJIC8vIFtJR05PUkVEXSBsb2NhdGlvbiBvZiBiYWNrdXAgYm9vdCBzZWN0b3IKKwkJT1BUX2MgPSAxIDw8IDIsCSAvLyBbSUdOT1JFRF0gY2hlY2sgZmlsZXN5c3RlbQorCQlPUFRfQyA9IDEgPDwgMywJIC8vIFtJR05PUkVEXSBjcmVhdGUgYSBuZXcgZmlsZQorCQlPUFRfZiA9IDEgPDwgNCwJIC8vIFtJR05PUkVEXSBudW1iZXIgb2YgRkFUcworCQlPUFRfRiA9IDEgPDwgNSwJIC8vIFtJR05PUkVELCBpbXBsaWVkIDMyXSBjaG9vc2UgRkFUIHNpemUKKwkJT1BUX2ggPSAxIDw8IDYsCSAvLyBbSUdOT1JFRF0gbnVtYmVyIG9mIGhpZGRlbiBzZWN0b3JzCisJCU9QVF9JID0gMSA8PCA3LAkgLy8gW0lHTk9SRURdIGRvbid0IGJhcmsgYXQgZW50aXJlIGRpc2sgZGV2aWNlcworCQlPUFRfaSA9IDEgPDwgOCwJIC8vIFtJR05PUkVEXSB2b2x1bWUgSUQKKwkJT1BUX2wgPSAxIDw8IDksCSAvLyBbSUdOT1JFRF0gYmFkIGJsb2NrIGZpbGVuYW1lCisJCU9QVF9tID0gMSA8PCAxMCwgLy8gW0lHTk9SRURdIG1lc3NhZ2UgZmlsZQorCQlPUFRfbiA9IDEgPDwgMTEsIC8vIHZvbHVtZSBsYWJlbAorCQlPUFRfciA9IDEgPDwgMTIsIC8vIFtJR05PUkVEXSByb290IGRpcmVjdG9yeSBlbnRyaWVzCisJCU9QVF9SID0gMSA8PCAxMywgLy8gW0lHTk9SRURdIG51bWJlciBvZiByZXNlcnZlZCBzZWN0b3JzCisJCU9QVF9zID0gMSA8PCAxNCwgLy8gW0lHTk9SRURdIHNlY3RvcnMgcGVyIGNsdXN0ZXIKKwkJT1BUX1MgPSAxIDw8IDE1LCAvLyBbSUdOT1JFRF0gc2VjdG9yIHNpemUKKwkJT1BUX3YgPSAxIDw8IDE2LCAvLyB2ZXJib3NlCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsvLzpiKzpmKzpGKzpoKzpyKzpSKzpzKzpTKzp2djpjLS1sOmwtLWMiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiQWI6Y0NmOkY6aDpJaTpsOm06bjpyOlI6czpTOnYiLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCAmdm9sdW1lX2xhYmVsLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIGNhY2hlIGRldmljZSBuYW1lCisJZGV2aWNlX25hbWUgPSBhcmd2WzBdOworCS8vIGRlZmF1bHQgdm9sdW1lIElEID0gY3JlYXRpb24gdGltZQorCXZvbHVtZV9pZCA9IHRpbWUoTlVMTCk7CisKKwlkZXYgPSB4b3BlbihkZXZpY2VfbmFtZSwgT19SRFdSKTsKKwl4ZnN0YXQoZGV2LCAmc3QsIGRldmljZV9uYW1lKTsKKworCS8vCisJLy8gR2V0IGltYWdlIHNpemUgYW5kIHNlY3RvciBzaXplCisJLy8KKwlieXRlc19wZXJfc2VjdCA9IFNFQ1RPUl9TSVpFOworCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgeworCQlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJCWlmICghYXJndlsxXSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW1hZ2Ugc2l6ZSBtdXN0IGJlIHNwZWNpZmllZCIpOworCQl9CisJCS8vIG5vdCBhIGJsb2NrIGRldmljZSwgc2tpcCBiYWQgc2VjdG9ycyBjaGVjaworCQlvcHRzICY9IH5PUFRfYzsKKwl9IGVsc2UgeworCQlpbnQgbWluX2J5dGVzX3Blcl9zZWN0OworI2lmIDAKKwkJdW5zaWduZWQgZGV2aWNlX251bTsKKwkJLy8gZm9yIHRydWUgYmxvY2sgZGV2aWNlcyB3ZSBkbyBjaGVjayBzYW5pdHkKKwkJZGV2aWNlX251bSA9IHN0LnN0X3JkZXYgJiAweGZmM2Y7CisJCS8vIGRvIHdlIGFsbG93IHRvIGZvcm1hdCB0aGUgd2hvbGUgZGlzayBkZXZpY2U/CisJCWlmICghKG9wdHMgJiBPUFRfSSkgJiYgKAorCQkJZGV2aWNlX251bSA9PSAweDAzMDAgfHwgLy8gaGRhLCBoZGIKKwkJCShkZXZpY2VfbnVtICYgMHhmZjBmKSA9PSAweDA4MDAgfHwgLy8gc2QKKwkJCWRldmljZV9udW0gPT0gMHgwZDAwIHx8IC8vIHhkCisJCQlkZXZpY2VfbnVtID09IDB4MTYwMCApICAvLyBoZGMsIGhkZAorCQkpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid2lsbCBub3QgdHJ5IHRvIG1ha2UgZmlsZXN5c3RlbSBvbiBmdWxsLWRpc2sgZGV2aWNlICh1c2UgLUkgaWYgd2FudGVkKSIpOworCQkvLyBjYW4ndCB3b3JrIG9uIG1vdW50ZWQgZmlsZXN5c3RlbXMKKwkJaWYgKGZpbmRfbW91bnRfcG9pbnQoZGV2aWNlX25hbWUsIDApKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZvcm1hdCBtb3VudGVkIGZpbGVzeXN0ZW0iKTsKKyNlbmRpZgorCQkvLyBnZXQgdHJ1ZSBzZWN0b3Igc2l6ZQorCQkvLyAocGFyYW1ldGVyIG11c3QgYmUgaW50Kiwgbm90IGxvbmcqIG9yIHNpemVfdCopCisJCXhpb2N0bChkZXYsIEJMS1NTWkdFVCwgJm1pbl9ieXRlc19wZXJfc2VjdCk7CisJCWlmIChtaW5fYnl0ZXNfcGVyX3NlY3QgPiBTRUNUT1JfU0laRSkgeworCQkJYnl0ZXNfcGVyX3NlY3QgPSBtaW5fYnl0ZXNfcGVyX3NlY3Q7CisJCQliYl9lcnJvcl9tc2coImZvciB0aGlzIGRldmljZSBzZWN0b3Igc2l6ZSBpcyAldSIsIG1pbl9ieXRlc19wZXJfc2VjdCk7CisJCX0KKwl9CisJdm9sdW1lX3NpemVfYnl0ZXMgPSBnZXRfdm9sdW1lX3NpemVfaW5fYnl0ZXMoZGV2LCBhcmd2WzFdLCAxMDI0LCAvKmV4dGVuZDoqLyAxKTsKKwl2b2x1bWVfc2l6ZV9zZWN0ID0gdm9sdW1lX3NpemVfYnl0ZXMgLyBieXRlc19wZXJfc2VjdDsKKworCS8vCisJLy8gRmluZCBvdXQgb3IgZ3Vlc3MgbWVkaWEgcGFyYW1ldGVycworCS8vCisJbWVkaWFfYnl0ZSA9IDB4Zjg7CisJaGVhZHMgPSAyNTU7CisJc2VjdF9wZXJfdHJhY2sgPSA2MzsKKwlzZWN0X3Blcl9jbHVzdCA9IDE7CisJeworCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbWV0cnk7CisJCS8vIHNpemUgKGluIHNlY3RvcnMpLCBzZWN0IChwZXIgdHJhY2spLCBoZWFkCisJCXN0cnVjdCBmbG9wcHlfc3RydWN0IHBhcmFtOworCisJCS8vIE4uQi4gd2hldGhlciB0byB1c2UgSERJT19HRVRHRU8gb3IgSERJT19SRVE/CisJCWlmIChpb2N0bChkZXYsIEhESU9fR0VUR0VPLCAmZ2VvbWV0cnkpID09IDAKKwkJICYmIGdlb21ldHJ5LnNlY3RvcnMKKwkJICYmIGdlb21ldHJ5LmhlYWRzCisJCSkgeworCQkJLy8gaGFyZCBkcml2ZQorCQkJc2VjdF9wZXJfdHJhY2sgPSBnZW9tZXRyeS5zZWN0b3JzOworCQkJaGVhZHMgPSBnZW9tZXRyeS5oZWFkczsKKworIHNldF9jbHVzdGVyX3NpemU6CisJCQkvKiBGb3IgRkFUMzIsIHRyeSB0byBkbyB0aGUgc2FtZSBhcyBNJCdzIGZvcm1hdCBjb21tYW5kCisJCQkgKiAoc2VlIGh0dHA6Ly93d3cud2luLnR1ZS5ubC9+YWViL2xpbnV4L2ZzL2ZhdC9mYXRnZW4xMDMucGRmIHAuIDIwKToKKwkJCSAqIGZzIHNpemUgPD0gMjYwTTogMC41ayBjbHVzdGVycworCQkJICogZnMgc2l6ZSA8PSAgIDhHOiA0ayBjbHVzdGVycworCQkJICogZnMgc2l6ZSA8PSAgMTZHOiA4ayBjbHVzdGVycworCQkJICogZnMgc2l6ZSA+ICAgMTZHOiAxNmsgY2x1c3RlcnMKKwkJCSAqLworCQkJc2VjdF9wZXJfY2x1c3QgPSAxOworCQkJaWYgKHZvbHVtZV9zaXplX2J5dGVzID49IDI2MCoxMDI0KjEwMjQpIHsKKwkJCQlzZWN0X3Blcl9jbHVzdCA9IDg7CisJCQkJLyogZmlnaHQgZ2NjOiAqLworCQkJCS8qICJlcnJvcjogaW50ZWdlciBvdmVyZmxvdyBpbiBleHByZXNzaW9uIiAqLworCQkJCS8qICJlcnJvcjogcmlnaHQgc2hpZnQgY291bnQgPj0gd2lkdGggb2YgdHlwZSIgKi8KKwkJCQlpZiAoc2l6ZW9mKG9mZl90KSA+IDQpIHsKKwkJCQkJdW5zaWduZWQgdCA9ICh2b2x1bWVfc2l6ZV9ieXRlcyA+PiAzMSA+PiAxKTsKKwkJCQkJaWYgKHQgPj0gOC80KQorCQkJCQkJc2VjdF9wZXJfY2x1c3QgPSAxNjsKKwkJCQkJaWYgKHQgPj0gMTYvNCkKKwkJCQkJCXNlY3RfcGVyX2NsdXN0ID0gMzI7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLy8gZmxvcHB5LCBsb29wLCBvciByZWd1bGFyIGZpbGUKKwkJCWludCBub3RfZmxvcHB5ID0gaW9jdGwoZGV2LCBGREdFVFBSTSwgJnBhcmFtKTsKKwkJCWlmIChub3RfZmxvcHB5ID09IDApIHsKKwkJCQkvLyBmbG9wcHkgZGlzaworCQkJCXNlY3RfcGVyX3RyYWNrID0gcGFyYW0uc2VjdDsKKwkJCQloZWFkcyA9IHBhcmFtLmhlYWQ7CisJCQkJdm9sdW1lX3NpemVfc2VjdCA9IHBhcmFtLnNpemU7CisJCQkJdm9sdW1lX3NpemVfYnl0ZXMgPSBwYXJhbS5zaXplICogU0VDVE9SX1NJWkU7CisJCQl9CisJCQkvLyBzZXR1cCB0aGUgbWVkaWEgZGVzY3JpcHRvciBieXRlCisJCQlzd2l0Y2ggKHZvbHVtZV9zaXplX3NlY3QpIHsKKwkJCWNhc2UgMiozNjA6CS8vIDUuMjUiLCAyLCA5LCA0MCAtIDM2MEsKKwkJCQltZWRpYV9ieXRlID0gMHhmZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMio3MjA6CS8vIDMuNSIsIDIsIDksIDgwIC0gNzIwSworCQkJY2FzZSAyKjEyMDA6CS8vIDUuMjUiLCAyLCAxNSwgODAgLSAxMjAwSworCQkJCW1lZGlhX2J5dGUgPSAweGY5OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoJLy8gYW55dGhpbmcgZWxzZQorCQkJCWlmIChub3RfZmxvcHB5KQorCQkJCQlnb3RvIHNldF9jbHVzdGVyX3NpemU7CisJCQljYXNlIDIqMTQ0MDoJLy8gMy41IiwgMiwgMTgsIDgwIC0gMTQ0MEsKKwkJCWNhc2UgMioyODgwOgkvLyAzLjUiLCAyLCAzNiwgODAgLSAyODgwSworCQkJCW1lZGlhX2J5dGUgPSAweGYwOworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gbm90IGZsb3BweSwgYnV0IHNpemUgbWF0Y2hlcyBmbG9wcHkgZXhhY3RseS4KKwkJCS8vIHBlcmhhcHMgaXQgaXMgYSBmbG9wcHkgaW1hZ2UuCisJCQkvLyB3ZSBhbHJlYWR5IHNldCBtZWRpYV9ieXRlIGFzIGlmIGl0IGlzIGEgZmxvcHB5LAorCQkJLy8gbm93IHNldCBzZWN0X3Blcl90cmFjayBhbmQgaGVhZHMuCisJCQloZWFkcyA9IDI7CisJCQlzZWN0X3Blcl90cmFjayA9ICh1bnNpZ25lZCl2b2x1bWVfc2l6ZV9zZWN0IC8gMTYwOworCQkJaWYgKHNlY3RfcGVyX3RyYWNrIDwgOSkKKwkJCQlzZWN0X3Blcl90cmFjayA9IDk7CisJCX0KKwl9CisKKwkvLworCS8vIENhbGN1bGF0ZSBudW1iZXIgb2YgY2x1c3RlcnMsIHNlY3RvcnMvY2x1c3Rlciwgc2VjdG9ycy9GQVQKKwkvLyAoYW4gaW5pdGlhbCBndWVzcyBmb3Igc2VjdF9wZXJfY2x1c3Qgc2hvdWxkIGFscmVhZHkgYmUgc2V0KQorCS8vCisJLy8gIm1rZG9zZnMgLXYgLUYgMzIgaW1hZ2U1ayA1IiBpcyB0aGUgbWluaW11bToKKwkvLyAyIHNlY3RvcnMgZm9yIEZBVHMgYW5kIDIgZGF0YSBzZWN0b3JzCisJaWYgKChvZmZfdCkodm9sdW1lX3NpemVfc2VjdCAtIHJlc2VydmVkX3NlY3QpIDwgNCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRoZSBpbWFnZSBpcyB0b28gc21hbGwgZm9yIEZBVDMyIik7CisJc2VjdF9wZXJfZmF0ID0gMTsKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoMSkgeworCQkJaW50IHNwZl9hZGo7CisJCQl1b2ZmX3QgdGNsID0gKHZvbHVtZV9zaXplX3NlY3QgLSByZXNlcnZlZF9zZWN0IC0gTlVNX0ZBVFMgKiBzZWN0X3Blcl9mYXQpIC8gc2VjdF9wZXJfY2x1c3Q7CisJCQkvLyB0Y2wgbWF5IGJlID4gTUFYX0NMVVNUXzMyIGhlcmUsIGJ1dCBpdCBtYXkgYmUKKwkJCS8vIGJlY2F1c2Ugc2VjdF9wZXJfZmF0IGlzIHVuZGVyZXN0aW1hdGVkLAorCQkJLy8gYW5kIHdpdGggaW5jcmVhc2VkIHNlY3RfcGVyX2ZhdCBpdCBzdGlsbCBtYXkgYmVjb21lCisJCQkvLyA8PSBNQVhfQ0xVU1RfMzIuIFRoZXJlZm9yZSwgd2UgZG8gbm90IGNoZWNrCisJCQkvLyBhZ2FpbnN0IE1BWF9DTFVTVF8zMiwgYnV0IGFnYWluc3QgYSBiaWdnZXIgY29uc3Q6CisJCQlpZiAodGNsID4gMHg4MGZmZmZmZikKKwkJCQlnb3RvIG5leHQ7CisJCQl0b3RhbF9jbHVzdCA9IHRjbDsgLy8gZml0cyBpbiB1aW50MzJfdAorCQkJLy8gRXZlcnkgY2x1c3RlciBuZWVkcyA0IGJ5dGVzIGluIEZBVC4gKzIgZW50cmllcyBzaW5jZQorCQkJLy8gRkFUIGhhcyBzcGFjZSBmb3Igbm9uLWV4aXN0ZW50IGNsdXN0ZXJzIDAgYW5kIDEuCisJCQkvLyBMZXQncyBzZWUgaG93IG1hbnkgc2VjdG9ycyB0aGF0IG5lZWRzLgorCQkJLy9NYXkgb3ZlcmZsb3cgYXQgIio0IjoKKwkJCS8vc3BmX2FkaiA9ICgodG90YWxfY2x1c3QrMikgKiA0ICsgYnl0ZXNfcGVyX3NlY3QtMSkgLyBieXRlc19wZXJfc2VjdCAtIHNlY3RfcGVyX2ZhdDsKKwkJCS8vU2FtZSBpbiB0aGUgbW9yZSBvYnNjdXJlLCBub24tb3ZlcmZsb3dpbmcgZm9ybToKKwkJCXNwZl9hZGogPSAoKHRvdGFsX2NsdXN0KzIpICsgKGJ5dGVzX3Blcl9zZWN0LzQpLTEpIC8gKGJ5dGVzX3Blcl9zZWN0LzQpIC0gc2VjdF9wZXJfZmF0OworI2lmIDAKKwkJCWJiX2Vycm9yX21zZygic2VjdF9wZXJfY2x1c3Q6JXUgc2VjdF9wZXJfZmF0OiV1IHRvdGFsX2NsdXN0OiV1IiwKKwkJCQkJc2VjdF9wZXJfY2x1c3QsIHNlY3RfcGVyX2ZhdCwgKGludCl0Y2wpOworCQkJYmJfZXJyb3JfbXNnKCJhZGp1c3QgdG8gc2VjdF9wZXJfZmF0OiVkIiwgc3BmX2Fkaik7CisjZW5kaWYKKwkJCWlmIChzcGZfYWRqIDw9IDApIHsKKwkJCQkvLyBkbyBub3QgbmVlZCB0byBhZGp1c3Qgc2VjdF9wZXJfZmF0LgorCQkJCS8vIHNvLCB3YXMgdG90YWxfY2x1c3QgdG9vIGJpZyBhZnRlciBhbGw/CisJCQkJaWYgKHRvdGFsX2NsdXN0IDw9IE1BWF9DTFVTVF8zMikKKwkJCQkJZ290byBmb3VuZF90b3RhbF9jbHVzdDsgLy8gbm8KKwkJCQkvLyB5ZXMsIHRvdGFsX2NsdXN0IGlzIF9hIGJpdF8gdG9vIGJpZworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCS8vIGFkanVzdCBzZWN0X3Blcl9mYXQsIGdvIGJhY2sgYW5kIHJlY2FsYyB0b3RhbF9jbHVzdAorCQkJLy8gKG5vdGU6IGp1c3QgInNlY3RfcGVyX2ZhdCArPSBzcGZfYWRqIiBpc24ndCBvaykKKwkJCXNlY3RfcGVyX2ZhdCArPSAoKHVuc2lnbmVkKXNwZl9hZGogLyAyKSB8IDE7CisJCX0KKyBuZXh0OgorCQlpZiAoc2VjdF9wZXJfY2x1c3QgPT0gMTI4KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG1ha2UgRkFUMzIgd2l0aCA+MTI4IHNlY3RvcnMvY2x1c3RlciIpOworCQlzZWN0X3Blcl9jbHVzdCAqPSAyOworCQlzZWN0X3Blcl9mYXQgPSAoc2VjdF9wZXJfZmF0IC8gMikgfCAxOworCX0KKyBmb3VuZF90b3RhbF9jbHVzdDoKKworCS8vCisJLy8gUHJpbnQgaW5mbworCS8vCisJaWYgKG9wdHMgJiBPUFRfdikgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJEZXZpY2UgJyVzJzpcbiIKKwkJCSJoZWFkczoldSwgc2VjdG9ycy90cmFjazoldSwgYnl0ZXMvc2VjdG9yOiV1XG4iCisJCQkibWVkaWEgZGVzY3JpcHRvcjolMDJ4XG4iCisJCQkidG90YWwgc2VjdG9yczolIk9GRl9GTVQidSwgY2x1c3RlcnM6JXUsIHNlY3RvcnMvY2x1c3RlcjoldVxuIgorCQkJIkZBVHM6Miwgc2VjdG9ycy9GQVQ6JXVcbiIKKwkJCSJ2b2x1bWVJRDolMDh4LCBsYWJlbDonJXMnXG4iLAorCQkJZGV2aWNlX25hbWUsCisJCQloZWFkcywgc2VjdF9wZXJfdHJhY2ssIGJ5dGVzX3Blcl9zZWN0LAorCQkJKGludCltZWRpYV9ieXRlLAorCQkJdm9sdW1lX3NpemVfc2VjdCwgKGludCl0b3RhbF9jbHVzdCwgKGludClzZWN0X3Blcl9jbHVzdCwKKwkJCXNlY3RfcGVyX2ZhdCwKKwkJCShpbnQpdm9sdW1lX2lkLCB2b2x1bWVfbGFiZWwKKwkJKTsKKwl9CisKKwkvLworCS8vIFdyaXRlIGZpbGVzeXN0ZW0gaW1hZ2Ugc2VxdWVudGlhbGx5IChubyBzZWVraW5nKQorCS8vCisJeworCQkvLyAoYSB8IGIpIGlzIHBvb3IgbWFuJ3MgbWF4KGEsIGIpCisJCXVuc2lnbmVkIGJ1ZnNpemUgPSByZXNlcnZlZF9zZWN0OworCQkvL2J1ZnNpemUgfD0gc2VjdF9wZXJfZmF0OyAvLyBjYW4gYmUgcXVpdGUgbGFyZ2UKKwkJYnVmc2l6ZSB8PSAyOyAvLyB1c2UgdGhpcyBpbnN0ZWFkCisJCWJ1ZnNpemUgfD0gc2VjdF9wZXJfY2x1c3Q7CisJCWJ1ZiA9IHh6YWxsb2MoYnVmc2l6ZSAqIGJ5dGVzX3Blcl9zZWN0KTsKKwl9CisKKwl7IC8vIGJvb3QgYW5kIGZzaW5mbyBzZWN0b3JzLCBhbmQgdGhlaXIgY29waWVzCisJCXN0cnVjdCBtc2Rvc19ib290X3NlY3RvciAqYm9vdF9ibGsgPSAodm9pZCopYnVmOworCQlzdHJ1Y3QgZmF0MzJfZnNpbmZvICppbmZvID0gKHZvaWQqKShidWYgKyBieXRlc19wZXJfc2VjdCk7CisKKwkJc3RyY3B5KGJvb3RfYmxrLT5ib290X2p1bXBfYW5kX3N5c19pZCwgIlx4ZWJceDU4XHg5MCIgIm1rZG9zZnMiKTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmJ5dGVzX3Blcl9zZWN0LCBieXRlc19wZXJfc2VjdCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5zZWN0X3Blcl9jbHVzdCwgc2VjdF9wZXJfY2x1c3QpOworCQkvLyBjYXN0IGluIG5lZWRlZCBvbiBiaWcgZW5kaWFuIHRvIHN1cHByZXNzIGEgd2FybmluZworCQlTVE9SRV9MRShib290X2Jsay0+cmVzZXJ2ZWRfc2VjdCwgKHVpbnQxNl90KXJlc2VydmVkX3NlY3QpOworCQlTVE9SRV9MRShib290X2Jsay0+ZmF0cywgMik7CisJCS8vU1RPUkVfTEUoYm9vdF9ibGstPmRpcl9lbnRyaWVzLCAwKTsgLy8gZm9yIEZBVDMyLCBzdGF5cyAwCisJCWlmICh2b2x1bWVfc2l6ZV9zZWN0IDw9IDB4ZmZmZikKKwkJCVNUT1JFX0xFKGJvb3RfYmxrLT52b2x1bWVfc2l6ZV9zZWN0LCB2b2x1bWVfc2l6ZV9zZWN0KTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPm1lZGlhX2J5dGUsIG1lZGlhX2J5dGUpOworCQkvLyB3cm9uZzogdGhpcyB3b3VsZCBtYWtlIExpbnV4IHRoaW5rIHRoYXQgaXQncyBmYXQxMi8xNjoKKwkJLy9pZiAoc2VjdF9wZXJfZmF0IDw9IDB4ZmZmZikKKwkJLy8JU1RPUkVfTEUoYm9vdF9ibGstPnNlY3RfcGVyX2ZhdCwgc2VjdF9wZXJfZmF0KTsKKwkJLy8gd29ya3M6CisJCS8vU1RPUkVfTEUoYm9vdF9ibGstPnNlY3RfcGVyX2ZhdCwgMCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5zZWN0X3Blcl90cmFjaywgc2VjdF9wZXJfdHJhY2spOworCQlTVE9SRV9MRShib290X2Jsay0+aGVhZHMsIGhlYWRzKTsKKwkJLy9TVE9SRV9MRShib290X2Jsay0+aGlkZGVuLCAwKTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmZhdDMyX3ZvbHVtZV9zaXplX3NlY3QsIHZvbHVtZV9zaXplX3NlY3QpOworCQlTVE9SRV9MRShib290X2Jsay0+ZmF0MzJfc2VjdF9wZXJfZmF0LCBzZWN0X3Blcl9mYXQpOworCQkvL1NUT1JFX0xFKGJvb3RfYmxrLT5mYXQzMl9mbGFncywgMCk7CisJCS8vU1RPUkVfTEUoYm9vdF9ibGstPmZhdDMyX3ZlcnNpb25bMl0sIDAsMCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5mYXQzMl9yb290X2NsdXN0ZXIsIDIpOworCQlTVE9SRV9MRShib290X2Jsay0+ZmF0MzJfaW5mb19zZWN0b3IsIGluZm9fc2VjdG9yX251bWJlcik7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5mYXQzMl9iYWNrdXBfYm9vdCwgYmFja3VwX2Jvb3Rfc2VjdG9yKTsKKwkJLy9TVE9SRV9MRShib290X2Jsay0+cmVzZXJ2ZWQyWzNdLCAwLDAsMCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT52aS5leHRfYm9vdF9zaWduLCAweDI5KTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPnZpLnZvbHVtZV9pZDMyLCB2b2x1bWVfaWQpOworCQlzdHJuY3B5KGJvb3RfYmxrLT52aS5mc190eXBlLCAiRkFUMzIgICAiLCBzaXplb2YoYm9vdF9ibGstPnZpLmZzX3R5cGUpKTsKKwkJc3RybmNweShib290X2Jsay0+dmkudm9sdW1lX2xhYmVsLCB2b2x1bWVfbGFiZWwsIHNpemVvZihib290X2Jsay0+dmkudm9sdW1lX2xhYmVsKSk7CisJCW1lbWNweShib290X2Jsay0+Ym9vdF9jb2RlLCBib290X2NvZGUsIHNpemVvZihib290X2NvZGUpKTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmJvb3Rfc2lnbiwgQk9PVF9TSUdOKTsKKworCQlTVE9SRV9MRShpbmZvLT5zaWduYXR1cmUxLCBGQVRfRlNJTkZPX1NJRzEpOworCQlTVE9SRV9MRShpbmZvLT5zaWduYXR1cmUyLCBGQVRfRlNJTkZPX1NJRzIpOworCQkvLyB3ZSd2ZSBhbGxvY2F0ZWQgY2x1c3RlciAyIGZvciB0aGUgcm9vdCBkaXIKKwkJU1RPUkVfTEUoaW5mby0+ZnJlZV9jbHVzdGVycywgKHRvdGFsX2NsdXN0IC0gMSkpOworCQlTVE9SRV9MRShpbmZvLT5uZXh0X2NsdXN0ZXIsIDIpOworCQlTVE9SRV9MRShpbmZvLT5ib290X3NpZ24sIEJPT1RfU0lHTik7CisKKwkJLy8gMXN0IGNvcHkKKwkJeHdyaXRlKGRldiwgYnVmLCBieXRlc19wZXJfc2VjdCAqIGJhY2t1cF9ib290X3NlY3Rvcik7CisJCS8vIDJuZCBjb3B5IGFuZCBwb3NzaWJseSB6ZXJvIHNlY3RvcnMKKwkJeHdyaXRlKGRldiwgYnVmLCBieXRlc19wZXJfc2VjdCAqIChyZXNlcnZlZF9zZWN0IC0gYmFja3VwX2Jvb3Rfc2VjdG9yKSk7CisJfQorCisJeyAvLyBmaWxlIGFsbG9jYXRpb24gdGFibGVzCisJCXVuc2lnbmVkIGksajsKKwkJdW5zaWduZWQgY2hhciAqZmF0ID0gKHZvaWQqKWJ1ZjsKKworCQltZW1zZXQoYnVmLCAwLCBieXRlc19wZXJfc2VjdCAqIDIpOworCQkvLyBpbml0aWFsIEZBVCBlbnRyaWVzCisJCU1BUktfQ0xVU1RFUigwLCAweDBmZmZmZjAwIHwgbWVkaWFfYnl0ZSk7CisJCU1BUktfQ0xVU1RFUigxLCAweGZmZmZmZmZmKTsKKwkJLy8gbWFyayBjbHVzdGVyIDIgYXMgRU9GICh1c2VkIGZvciByb290IGRpcikKKwkJTUFSS19DTFVTVEVSKDIsIEVPRl9GQVQzMik7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRkFUUzsgaSsrKSB7CisJCQl4d3JpdGUoZGV2LCBidWYsIGJ5dGVzX3Blcl9zZWN0KTsKKwkJCWZvciAoaiA9IDE7IGogPCBzZWN0X3Blcl9mYXQ7IGorKykKKwkJCQl4d3JpdGUoZGV2LCBidWYgKyBieXRlc19wZXJfc2VjdCwgYnl0ZXNfcGVyX3NlY3QpOworCQl9CisJfQorCisJLy8gcm9vdCBkaXJlY3RvcnkKKwkvLyBlbXB0eSBkaXJlY3RvcnkgaXMganVzdCBhIHNldCBvZiB6ZXJvIGJ5dGVzCisJbWVtc2V0KGJ1ZiwgMCwgc2VjdF9wZXJfY2x1c3QgKiBieXRlc19wZXJfc2VjdCk7CisJaWYgKHZvbHVtZV9sYWJlbFswXSkgeworCQkvLyBjcmVhdGUgZGlyIGVudHJ5IGZvciB2b2x1bWVfbGFiZWwKKwkJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisjaWYgMAorCQlzdHJ1Y3QgdG0gdG1fdGltZTsKKwkJdWludDE2X3QgdCwgZDsKKyNlbmRpZgorCQlkZSA9ICh2b2lkKilidWY7CisJCXN0cm5jcHkoZGUtPm5hbWUsIHZvbHVtZV9sYWJlbCwgc2l6ZW9mKGRlLT5uYW1lKSk7CisJCVNUT1JFX0xFKGRlLT5hdHRyLCBBVFRSX1ZPTFVNRSk7CisjaWYgMAorCQlsb2NhbHRpbWVfcigmY3JlYXRlX3RpbWUsICZ0bV90aW1lKTsKKwkJdCA9ICh0bV90aW1lLnRtX3NlYyA+PiAxKSArICh0bV90aW1lLnRtX21pbiA8PCA1KSArICh0bV90aW1lLnRtX2hvdXIgPDwgMTEpOworCQlkID0gdG1fdGltZS50bV9tZGF5ICsgKCh0bV90aW1lLnRtX21vbisxKSA8PCA1KSArICgodG1fdGltZS50bV95ZWFyLTgwKSA8PCA5KTsKKwkJU1RPUkVfTEUoZGUtPnRpbWUsIHQpOworCQlTVE9SRV9MRShkZS0+ZGF0ZSwgZCk7CisJCS8vU1RPUkVfTEUoZGUtPmN0aW1lX2NzLCAwKTsKKwkJZGUtPmN0aW1lID0gZGUtPnRpbWU7CisJCWRlLT5jZGF0ZSA9IGRlLT5kYXRlOworCQlkZS0+YWRhdGUgPSBkZS0+ZGF0ZTsKKyNlbmRpZgorCX0KKwl4d3JpdGUoZGV2LCBidWYsIHNlY3RfcGVyX2NsdXN0ICogYnl0ZXNfcGVyX3NlY3QpOworCisjaWYgMAorCWlmIChvcHRzICYgT1BUX2MpIHsKKwkJdW9mZl90IHZvbHVtZV9zaXplX2Jsb2NrczsKKwkJdW5zaWduZWQgc3RhcnRfZGF0YV9zZWN0b3I7CisJCXVuc2lnbmVkIHN0YXJ0X2RhdGFfYmxvY2s7CisJCXVuc2lnbmVkIGJhZGJsb2NrcyA9IDA7CisJCWludCB0cnksIGdvdDsKKwkJb2ZmX3QgY3VycmVudGx5X3Rlc3Rpbmc7CisJCWNoYXIgKmJsa2J1ZiA9IHhtYWxsb2MoQkxPQ0tfU0laRSAqIFRFU1RfQlVGRkVSX0JMT0NLUyk7CisKKwkJdm9sdW1lX3NpemVfYmxvY2tzID0gKHZvbHVtZV9zaXplX2J5dGVzID4+IEJMT0NLX1NJWkVfQklUUyk7CisJCS8vIE4uQi4gdGhlIHR3byBmb2xsb3dpbmcgdmFycyBhcmUgaW4gaGFyZCBzZWN0b3JzLCBpLmUuIFNFQ1RPUl9TSVpFIGJ5dGUgc2VjdG9ycyEKKwkJc3RhcnRfZGF0YV9zZWN0b3IgPSAocmVzZXJ2ZWRfc2VjdCArIE5VTV9GQVRTICogc2VjdF9wZXJfZmF0KSAqIChieXRlc19wZXJfc2VjdCAvIFNFQ1RPUl9TSVpFKTsKKwkJc3RhcnRfZGF0YV9ibG9jayA9IChzdGFydF9kYXRhX3NlY3RvciArIFNFQ1RPUlNfUEVSX0JMT0NLIC0gMSkgLyBTRUNUT1JTX1BFUl9CTE9DSzsKKworCQliYl9pbmZvX21zZygic2VhcmNoaW5nIGZvciBiYWQgYmxvY2tzICIpOworCQljdXJyZW50bHlfdGVzdGluZyA9IDA7CisJCXRyeSA9IFRFU1RfQlVGRkVSX0JMT0NLUzsKKwkJd2hpbGUgKGN1cnJlbnRseV90ZXN0aW5nIDwgdm9sdW1lX3NpemVfYmxvY2tzKSB7CisJCQlpZiAoY3VycmVudGx5X3Rlc3RpbmcgKyB0cnkgPiB2b2x1bWVfc2l6ZV9ibG9ja3MpCisJCQkJdHJ5ID0gdm9sdW1lX3NpemVfYmxvY2tzIC0gY3VycmVudGx5X3Rlc3Rpbmc7CisJCQkvLyBwZXJmb3JtIGEgdGVzdCBvbiBhIGJsb2NrLiByZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MKKwkJCS8vIHRoYXQgY291bGQgYmUgcmVhZCBzdWNjZXNzZnVsbHkuCisJCQkvLyBzZWVrIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uCisJCQl4bHNlZWsoZGV2LCBjdXJyZW50bHlfdGVzdGluZyAqIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwkJCS8vIHRyeSByZWFkaW5nCisJCQlnb3QgPSByZWFkKGRldiwgYmxrYnVmLCB0cnkgKiBCTE9DS19TSVpFKTsKKwkJCWlmIChnb3QgPCAwKQorCQkJCWdvdCA9IDA7CisJCQlpZiAoZ290ICYgKEJMT0NLX1NJWkUgLSAxKSkKKwkJCQliYl9lcnJvcl9tc2coInVuZXhwZWN0ZWQgdmFsdWVzIGluIGRvX2NoZWNrOiBwcm9iYWJseSBidWdzIik7CisJCQlnb3QgLz0gQkxPQ0tfU0laRTsKKwkJCWN1cnJlbnRseV90ZXN0aW5nICs9IGdvdDsKKwkJCWlmIChnb3QgPT0gdHJ5KSB7CisJCQkJdHJ5ID0gVEVTVF9CVUZGRVJfQkxPQ0tTOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdHJ5ID0gMTsKKwkJCWlmIChjdXJyZW50bHlfdGVzdGluZyA8IHN0YXJ0X2RhdGFfYmxvY2spCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBibG9ja3MgYmVmb3JlIGRhdGEtYXJlYTogY2Fubm90IG1ha2UgZnMiKTsKKworCQkJLy8gbWFyayBhbGwgb2YgdGhlIHNlY3RvcnMgaW4gdGhlIGJsb2NrIGFzIGJhZAorCQkJZm9yIChpID0gMDsgaSA8IFNFQ1RPUlNfUEVSX0JMT0NLOyBpKyspIHsKKwkJCQlpbnQgY2x1c3RlciA9IChjdXJyZW50bHlfdGVzdGluZyAqIFNFQ1RPUlNfUEVSX0JMT0NLICsgaSAtIHN0YXJ0X2RhdGFfc2VjdG9yKSAvIChpbnQpIChzZWN0X3Blcl9jbHVzdCkgLyAoYnl0ZXNfcGVyX3NlY3QgLyBTRUNUT1JfU0laRSk7CisJCQkJaWYgKGNsdXN0ZXIgPCAwKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBjbHVzdGVyIG51bWJlciBpbiBtYXJrX3NlY3RvcjogcHJvYmFibHkgYnVnISIpOworCQkJCU1BUktfQ0xVU1RFUihjbHVzdGVyLCBCQURfRkFUMzIpOworCQkJfQorCQkJYmFkYmxvY2tzKys7CisJCQljdXJyZW50bHlfdGVzdGluZysrOworCQl9CisJCWZyZWUoYmxrYnVmKTsKKwkJaWYgKGJhZGJsb2NrcykKKwkJCWJiX2luZm9fbXNnKCIlZCBiYWQgYmxvY2socykiLCBiYWRibG9ja3MpOworCX0KKyNlbmRpZgorCisJLy8gY2xlYW51cAorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKGJ1Zik7CisJCWNsb3NlKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21rc3dhcC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ta3N3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQyYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ta3N3YXAuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBta3N3YXAuYyAtIGZvcm1hdCBzd2FwIGRldmljZSAoTGludXggdjEgb25seSkKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rc3dhcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1MIExCTF0gQkxPQ0tERVYgW0tCWVRFU10iCisvL3VzYWdlOiNkZWZpbmUgbWtzd2FwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJlcGFyZSBCTE9DS0RFViB0byBiZSB1c2VkIGFzIHN3YXAgcGFydGl0aW9uXG4iCisvL3VzYWdlOiAgICAgIlxuCS1MIExCTAlMYWJlbCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorc3RhdGljIHZvaWQgbWtzd2FwX3NlbGludXhfc2V0Y29udGV4dChpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc3RidWY7CisKKwlpZiAoIWlzX3NlbGludXhfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwl4ZnN0YXQoZmQsICZzdGJ1ZiwgcGF0aCk7CisJaWYgKFNfSVNSRUcoc3RidWYuc3RfbW9kZSkpIHsKKwkJc2VjdXJpdHlfY29udGV4dF90IG5ld2NvbjsKKwkJc2VjdXJpdHlfY29udGV4dF90IG9sZGNvbiA9IE5VTEw7CisJCWNvbnRleHRfdCBjb250ZXh0OworCisJCWlmIChmZ2V0ZmlsZWNvbihmZCwgJm9sZGNvbikgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PREFUQSkKKwkJCQlnb3RvIGVycm9yOworCQkJaWYgKG1hdGNocGF0aGNvbihwYXRoLCBzdGJ1Zi5zdF9tb2RlLCAmb2xkY29uKSA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCQljb250ZXh0ID0gY29udGV4dF9uZXcob2xkY29uKTsKKwkJaWYgKCFjb250ZXh0IHx8IGNvbnRleHRfdHlwZV9zZXQoY29udGV4dCwgInN3YXBmaWxlX3QiKSkKKwkJCWdvdG8gZXJyb3I7CisJCW5ld2NvbiA9IGNvbnRleHRfc3RyKGNvbnRleHQpOworCQlpZiAoIW5ld2NvbikKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGZzZXRmaWxlY29uX3JhdyBpcyBoaWRkZW4gKi8KKwkJaWYgKHN0cmNtcChvbGRjb24sIG5ld2NvbikgIT0gMCAmJiBmc2V0ZmlsZWNvbihmZCwgbmV3Y29uKSA8IDApCisJCQlnb3RvIGVycm9yOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJCWNvbnRleHRfZnJlZShjb250ZXh0KTsKKwkJCWZyZWVjb24ob2xkY29uKTsKKwkJfQorCX0KKwlyZXR1cm47CisgZXJyb3I6CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCJTRUxpbnV4IHJlbGFiZWxpbmcgZmFpbGVkIik7Cit9CisjZWxzZQorIyBkZWZpbmUgbWtzd2FwX3NlbGludXhfc2V0Y29udGV4dChmZCwgcGF0aCkgKCh2b2lkKTApCisjZW5kaWYKKworLyogZnJvbSBMaW51eCAyLjYuMjMgKi8KKy8qCisgKiBNYWdpYyBoZWFkZXIgZm9yIGEgc3dhcCBhcmVhLiAuLi4gTm90ZSB0aGF0IHRoZSBmaXJzdAorICoga2lsb2J5dGUgaXMgcmVzZXJ2ZWQgZm9yIGJvb3QgbG9hZGVyIG9yIGRpc2sgbGFiZWwgc3R1ZmYuCisgKi8KK3N0cnVjdCBzd2FwX2hlYWRlcl92MSB7CisvKgljaGFyICAgICBib290Yml0c1sxMDI0XTsgICAgU3BhY2UgZm9yIGRpc2tsYWJlbCBldGMuICovCisJdWludDMyX3QgdmVyc2lvbjsgICAgICAgIC8qIHNlY29uZCBrYnl0ZSwgd29yZCAwICovCisJdWludDMyX3QgbGFzdF9wYWdlOyAgICAgIC8qIDEgKi8KKwl1aW50MzJfdCBucl9iYWRwYWdlczsgICAgLyogMiAqLworCWNoYXIgICAgIHN3c191dWlkWzE2XTsgICAvKiAzLDQsNSw2ICovCisJY2hhciAgICAgc3dzX3ZvbHVtZVsxNl07IC8qIDcsOCw5LDEwICovCisJdWludDMyX3QgcGFkZGluZ1sxMTddOyAgIC8qIDExLi4xMjcgKi8KKwl1aW50MzJfdCBiYWRwYWdlc1sxXTsgICAgLyogMTI4ICovCisJLyogdG90YWwgMTI5IDMyLWJpdCB3b3JkcyBpbiAybmQga2lsb2J5dGUgKi8KK30gRklYX0FMSUFTSU5HOworCisjZGVmaW5lIE5XT1JEUyAxMjkKKyNkZWZpbmUgaGRyICgoc3RydWN0IHN3YXBfaGVhZGVyX3YxKiliYl9jb21tb25fYnVmc2l6MSkKKworc3RydWN0IEJVR19zaXplcyB7CisJY2hhciBzd2FwX2hlYWRlcl92MV93cm9uZ1tzaXplb2YoKmhkcikgICE9IChOV09SRFMgKiA0KSA/IC0xIDogMV07CisJY2hhciBidWZzaXoxX2lzX3Rvb19zbWFsbFtDT01NT05fQlVGU0laRSA8IChOV09SRFMgKiA0KSA/IC0xIDogMV07Cit9OworCisvKiBTdG9yZWQgd2l0aG91dCB0ZXJtaW5hdGluZyBOVUwgKi8KK3N0YXRpYyBjb25zdCBjaGFyIFNXQVBTUEFDRTJbc2l6ZW9mKCJTV0FQU1BBQ0UyIiktMV0gQUxJR04xID0gIlNXQVBTUEFDRTIiOworCitpbnQgbWtzd2FwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBta3N3YXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwl1bnNpZ25lZCBwYWdlc2l6ZTsKKwlvZmZfdCBsZW47CisJY29uc3QgY2hhciAqbGFiZWwgPSAiIjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogYXQgbGVhc3Qgb25lIHBhcmFtICovCisJLyogVE9ETzogLXAgUEFHRVNaLCAtVSBVVUlEICovCisJZ2V0b3B0MzIoYXJndiwgIkw6IiwgJmxhYmVsKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWZkID0geG9wZW4oYXJndlswXSwgT19XUk9OTFkpOworCisJLyogRmlndXJlIG91dCBob3cgYmlnIHRoZSBkZXZpY2UgaXMgKi8KKwlsZW4gPSBnZXRfdm9sdW1lX3NpemVfaW5fYnl0ZXMoZmQsIGFyZ3ZbMV0sIDEwMjQsIC8qZXh0ZW5kOiovIDEpOworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKwlsZW4gLT0gcGFnZXNpemU7CisKKwkvKiBBbm5vdW5jZSBvdXIgaW50ZW50aW9ucyAqLworCXByaW50ZigiU2V0dGluZyB1cCBzd2Fwc3BhY2UgdmVyc2lvbiAxLCBzaXplID0gJSJPRkZfRk1UInUgYnl0ZXNcbiIsIGxlbik7CisJbWtzd2FwX3NlbGludXhfc2V0Y29udGV4dChmZCwgYXJndlswXSk7CisKKwkvKiBoZHIgaXMgemVyby1maWxsZWQgc28gZmFyLiBDbGVhciB0aGUgZmlyc3Qga2J5dGUsIG9yIGVsc2UKKwkgKiBta3N3YXAtaW5nIGZvcm1lciBGQVQgcGFydGl0aW9uIGRvZXMgTk9UIGVyYXNlIGl0cyBzaWduYXR1cmUuCisJICoKKwkgKiB1dGlsLWxpbnV4LW5nIDIuMTcuMiBjbGFpbXMgdG8gZXJhc2UgaXQgb25seSBpZiBpdCBkb2VzIG5vdCBzZWUKKwkgKiBhIHBhcnRpdGlvbiB0YWJsZSBhbmQgaXMgbm90IHJ1biBvbiB3aG9sZSBkaXNrLiAtZiBmb3JjZXMgaXQuCisJICovCisJeHdyaXRlKGZkLCBoZHIsIDEwMjQpOworCisJLyogRmlsbCB0aGUgaGVhZGVyLiAqLworCWhkci0+dmVyc2lvbiA9IDE7CisJaGRyLT5sYXN0X3BhZ2UgPSAodW9mZl90KWxlbiAvIHBhZ2VzaXplOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX01LU1dBUF9VVUlEKSB7CisJCWNoYXIgdXVpZF9zdHJpbmdbMzJdOworCQlnZW5lcmF0ZV91dWlkKCh2b2lkKiloZHItPnN3c191dWlkKTsKKwkJYmluMmhleCh1dWlkX3N0cmluZywgaGRyLT5zd3NfdXVpZCwgMTYpOworCQkvKiBmLmUuIFVVSUQ9ZGZkOWMxNzMtYmU1Mi00ZDI3LTk5YTUtYzM0YzZjMmZmNTVmICovCisJCXByaW50ZigiVVVJRD0lLjhzIiAgIi0lLjRzLSUuNHMtJS40cy0lLjEyc1xuIiwKKwkJCXV1aWRfc3RyaW5nLAorCQkJdXVpZF9zdHJpbmcrOCwKKwkJCXV1aWRfc3RyaW5nKzgrNCwKKwkJCXV1aWRfc3RyaW5nKzgrNCs0LAorCQkJdXVpZF9zdHJpbmcrOCs0KzQrNAorCQkpOworCX0KKwlzYWZlX3N0cm5jcHkoaGRyLT5zd3Nfdm9sdW1lLCBsYWJlbCwgMTYpOworCisJLyogV3JpdGUgdGhlIGhlYWRlci4gIFN5bmMgdG8gZGlzayBiZWNhdXNlIHNvbWUga2VybmVsIHZlcnNpb25zIGNoZWNrCisJICogc2lnbmF0dXJlIG9uIGRpc2sgKG5vdCBpbiBjYWNoZSkgZHVyaW5nIHN3YXBvbi4gKi8KKwl4d3JpdGUoZmQsIGhkciwgTldPUkRTICogNCk7CisJeGxzZWVrKGZkLCBwYWdlc2l6ZSAtIDEwLCBTRUVLX1NFVCk7CisJeHdyaXRlKGZkLCBTV0FQU1BBQ0UyLCAxMCk7CisJZnN5bmMoZmQpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbW9yZS5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9tb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjZWI3MQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbW9yZS5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG1vcmUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgQnJ1Y2UgUGVyZW5zIDxicnVjZUBwaXhhci5jb20+LgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExhdGVzdCB2ZXJzaW9uIGJsZW5kZWQgdG9nZXRoZXIgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiwKKyAqIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBtb3JlIGltcGxlbWVudGF0aW9uIGJ5IEJydWNlLCBhbmQgY29kZSBmcm9tIHRoZQorICogRGViaWFuIGJvb3QtZmxvcHBpZXMgdGVhbS4KKyAqCisgKiBUZXJtaW9zIGNvcnJlY3RzIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBtb3JlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgbW9yZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlZpZXcgRklMRSAob3Igc3RkaW4pIG9uZSBzY3JlZW5mdWwgYXQgYSB0aW1lIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBtb3JlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRtZXNnIHwgbW9yZVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogU3VwcG9ydCBmb3IgRkVBVFVSRV9VU0VfVEVSTUlPUyAqLworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IGNpbl9maWxlbm87CisJc3RydWN0IHRlcm1pb3MgaW5pdGlhbF9zZXR0aW5nczsKKwlzdHJ1Y3QgdGVybWlvcyBuZXdfc2V0dGluZ3M7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpICgodm9pZCkwKQorI2RlZmluZSBpbml0aWFsX3NldHRpbmdzIChHLmluaXRpYWxfc2V0dGluZ3MpCisjZGVmaW5lIG5ld19zZXR0aW5ncyAgICAgKEcubmV3X3NldHRpbmdzICAgICkKKyNkZWZpbmUgY2luX2ZpbGVubyAgICAgICAoRy5jaW5fZmlsZW5vICAgICAgKQorCisjZGVmaW5lIHNldFRlcm1TZXR0aW5ncyhmZCwgYXJncCkgXAorZG8geyBcCisJaWYgKEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TKSBcCisJCXRjc2V0YXR0cihmZCwgVENTQU5PVywgYXJncCk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIGdldFRlcm1TZXR0aW5ncyhmZCwgYXJncCkgdGNnZXRhdHRyKGZkLCBhcmdwKQorCitzdGF0aWMgdm9pZCBnb3RzaWcoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJLyogYmJfcHV0Y2hhcl9zdGRlcnIgZG9lc24ndCB1c2Ugc3RkaW8gYnVmZmVyaW5nLAorCSAqIHRoZXJlZm9yZSBpdCBpcyBzYWZlIGluIHNpZ25hbCBoYW5kbGVyICovCisJYmJfcHV0Y2hhcl9zdGRlcnIoJ1xuJyk7CisJc2V0VGVybVNldHRpbmdzKGNpbl9maWxlbm8sICZpbml0aWFsX3NldHRpbmdzKTsKKwlfZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisjZGVmaW5lIENPTlZFUlRFRF9UQUJfU0laRSA4CisKK2ludCBtb3JlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtb3JlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYyA9IGM7IC8qIGZvciBjb21waWxlciAqLworCWludCBsaW5lczsKKwlpbnQgaW5wdXQgPSAwOworCWludCBzcGFjZXMgPSAwOworCWludCBwbGVhc2VfZGlzcGxheV9tb3JlX3Byb21wdDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlGSUxFICpmaWxlOworCUZJTEUgKmNpbjsKKwlpbnQgbGVuOworCXVuc2lnbmVkIHRlcm1pbmFsX3dpZHRoOworCXVuc2lnbmVkIHRlcm1pbmFsX2hlaWdodDsKKworCUlOSVRfRygpOworCisJYXJndisrOworCS8qIEFub3RoZXIgcG9wdWxhciBwYWdlciwgbW9zdCwgZGV0ZWN0cyB3aGVuIHN0ZG91dAorCSAqIGlzIG5vdCBhIHR0eSBhbmQgdHVybnMgaW50byBjYXQuIFRoaXMgbWFrZXMgc2Vuc2UuICovCisJaWYgKCFpc2F0dHkoU1RET1VUX0ZJTEVOTykpCisJCXJldHVybiBiYl9jYXQoYXJndik7CisJY2luID0gZm9wZW5fZm9yX3JlYWQoQ1VSUkVOVF9UVFkpOworCWlmICghY2luKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TKSB7CisJCWNpbl9maWxlbm8gPSBmaWxlbm8oY2luKTsKKwkJZ2V0VGVybVNldHRpbmdzKGNpbl9maWxlbm8sICZpbml0aWFsX3NldHRpbmdzKTsKKwkJbmV3X3NldHRpbmdzID0gaW5pdGlhbF9zZXR0aW5nczsKKwkJbmV3X3NldHRpbmdzLmNfbGZsYWcgJj0gfklDQU5PTjsKKwkJbmV3X3NldHRpbmdzLmNfbGZsYWcgJj0gfkVDSE87CisJCW5ld19zZXR0aW5ncy5jX2NjW1ZNSU5dID0gMTsKKwkJbmV3X3NldHRpbmdzLmNfY2NbVlRJTUVdID0gMDsKKwkJc2V0VGVybVNldHRpbmdzKGNpbl9maWxlbm8sICZuZXdfc2V0dGluZ3MpOworCQliYl9zaWduYWxzKDAKKwkJCSsgKDEgPDwgU0lHSU5UKQorCQkJKyAoMSA8PCBTSUdRVUlUKQorCQkJKyAoMSA8PCBTSUdURVJNKQorCQkJLCBnb3RzaWcpOworCX0KKworCWRvIHsKKwkJZmlsZSA9IHN0ZGluOworCQlpZiAoKmFyZ3YpIHsKKwkJCWZpbGUgPSBmb3Blbl9vcl93YXJuKCphcmd2LCAiciIpOworCQkJaWYgKCFmaWxlKQorCQkJCWNvbnRpbnVlOworCQl9CisJCXN0LnN0X3NpemUgPSAwOworCQlmc3RhdChmaWxlbm8oZmlsZSksICZzdCk7CisKKwkJcGxlYXNlX2Rpc3BsYXlfbW9yZV9wcm9tcHQgPSAwOworCQkvKiBuZXZlciByZXR1cm5zIHcsIGggPD0gMSAqLworCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KGZpbGVubyhjaW4pLCAmdGVybWluYWxfd2lkdGgsICZ0ZXJtaW5hbF9oZWlnaHQpOworCQl0ZXJtaW5hbF9oZWlnaHQgLT0gMTsKKworCQlsZW4gPSAwOworCQlsaW5lcyA9IDA7CisJCXdoaWxlIChzcGFjZXMgfHwgKGMgPSBnZXRjKGZpbGUpKSAhPSBFT0YpIHsKKwkJCWludCB3cmFwOworCQkJaWYgKHNwYWNlcykKKwkJCQlzcGFjZXMtLTsKKyBsb29wX3RvcDoKKwkJCWlmIChpbnB1dCAhPSAncicgJiYgcGxlYXNlX2Rpc3BsYXlfbW9yZV9wcm9tcHQpIHsKKwkJCQlsZW4gPSBwcmludGYoIi0tTW9yZS0tICIpOworCQkJCWlmIChzdC5zdF9zaXplICE9IDApIHsKKwkJCQkJdW9mZl90IGQgPSAodW9mZl90KXN0LnN0X3NpemUgLyAxMDA7CisJCQkJCWlmIChkID09IDApCisJCQkJCQlkID0gMTsKKwkJCQkJbGVuICs9IHByaW50ZigiKCV1JSUgb2YgJSJPRkZfRk1UInUgYnl0ZXMpIiwKKwkJCQkJCShpbnQpICgodW9mZl90KWZ0ZWxsbyhmaWxlKSAvIGQpLAorCQkJCQkJc3Quc3Rfc2l6ZSk7CisJCQkJfQorCQkJCWZmbHVzaF9hbGwoKTsKKworCQkJCS8qCisJCQkJICogV2UndmUganVzdCBkaXNwbGF5ZWQgdGhlICItLU1vcmUtLSIgcHJvbXB0LCBzbyBub3cgd2UgbmVlZAorCQkJCSAqIHRvIGdldCBpbnB1dCBmcm9tIHRoZSB1c2VyLgorCQkJCSAqLworCQkJCWZvciAoOzspIHsKKwkJCQkJaW5wdXQgPSBnZXRjKGNpbik7CisJCQkJCWlucHV0ID0gdG9sb3dlcihpbnB1dCk7CisJCQkJCWlmICghRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MpCisJCQkJCQlwcmludGYoIlwwMzNbQSIpOyAvKiBjdXJzb3IgdXAgKi8KKwkJCQkJLyogRXJhc2UgdGhlIGxhc3QgbWVzc2FnZSAqLworCQkJCQlwcmludGYoIlxyJSpzXHIiLCBsZW4sICIiKTsKKworCQkJCQkvKiBEdWUgdG8gdmFyaW91cyBtdWx0aWJ5dGUgZXNjYXBlCisJCQkJCSAqIHNlcXVlbmNlcywgaXQncyBub3Qgb2sgdG8gYWNjZXB0CisJCQkJCSAqIGFueSBpbnB1dCBhcyBhIGNvbW1hbmQgdG8gc2Nyb2xsCisJCQkJCSAqIHRoZSBzY3JlZW4uIFdlIG9ubHkgYWxsb3cga25vd24KKwkJCQkJICogY29tbWFuZHMsIGVsc2Ugd2Ugc2hvdyBoZWxwIG1zZy4gKi8KKwkJCQkJaWYgKGlucHV0ID09ICcgJyB8fCBpbnB1dCA9PSAnXG4nIHx8IGlucHV0ID09ICdxJyB8fCBpbnB1dCA9PSAncicpCisJCQkJCQlicmVhazsKKwkJCQkJbGVuID0gcHJpbnRmKCIoRW50ZXI6bmV4dCBsaW5lIFNwYWNlOm5leHQgcGFnZSBROnF1aXQgUjpzaG93IHRoZSByZXN0KSIpOworCQkJCX0KKwkJCQlsZW4gPSAwOworCQkJCWxpbmVzID0gMDsKKwkJCQlwbGVhc2VfZGlzcGxheV9tb3JlX3Byb21wdCA9IDA7CisKKwkJCQlpZiAoaW5wdXQgPT0gJ3EnKQorCQkJCQlnb3RvIGVuZDsKKworCQkJCS8qIFRoZSB1c2VyIG1heSBoYXZlIHJlc2l6ZWQgdGhlIHRlcm1pbmFsLgorCQkJCSAqIFJlLXJlYWQgdGhlIGRpbWVuc2lvbnMuICovCisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TKSB7CisJCQkJCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoY2luX2ZpbGVubywgJnRlcm1pbmFsX3dpZHRoLCAmdGVybWluYWxfaGVpZ2h0KTsKKwkJCQkJdGVybWluYWxfaGVpZ2h0IC09IDE7CisJCQkJfQorCQkJfQorCisJCQkvKiBDcnVkZWx5IGNvbnZlcnQgdGFicyBpbnRvIHNwYWNlcywgd2hpY2ggYXJlCisJCQkgKiBhIGJhamlsbGlvbiB0aW1lcyBlYXNpZXIgdG8gZGVhbCB3aXRoLiAqLworCQkJaWYgKGMgPT0gJ1x0JykgeworCQkJCXNwYWNlcyA9ICgodW5zaWduZWQpfmxlbikgJSBDT05WRVJURURfVEFCX1NJWkU7CisJCQkJYyA9ICcgJzsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZXJlIGFyZSB0d28gaW5wdXQgc3RyZWFtcyB0byB3b3JyeSBhYm91dCBoZXJlOgorCQkJICoKKwkJCSAqIGMgICAgOiB0aGUgY2hhcmFjdGVyIHdlIGFyZSByZWFkaW5nIGZyb20gdGhlIGZpbGUgYmVpbmcgIm1vcmVkIgorCQkJICogaW5wdXQ6IGEgY2hhcmFjdGVyIHJlY2VpdmVkIGZyb20gdGhlIGtleWJvYXJkCisJCQkgKgorCQkJICogSWYgd2UgaGl0IGEgbmV3bGluZSBpbiB0aGUgX2ZpbGVfIHN0cmVhbSwgd2Ugd2FudCB0byB0ZXN0IGFuZAorCQkJICogc2VlIGlmIGFueSBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBoaXQgaW4gdGhlIF9pbnB1dF8gc3RyZWFtLiBUaGlzCisJCQkgKiBhbGxvd3MgdGhlIHVzZXIgdG8gcXVpdCB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIGEgZmlsZS4KKwkJCSAqLworCQkJd3JhcCA9ICgrK2xlbiA+IHRlcm1pbmFsX3dpZHRoKTsKKwkJCWlmIChjID09ICdcbicgfHwgd3JhcCkgeworCQkJCS8qIFRoZW4gb3V0cHV0dGluZyB0aGlzIGNoYXJhY3RlcgorCQkJCSAqIHdpbGwgbW92ZSB1cyB0byBhIG5ldyBsaW5lLiAqLworCQkJCWlmICgrK2xpbmVzID49IHRlcm1pbmFsX2hlaWdodCB8fCBpbnB1dCA9PSAnXG4nKQorCQkJCQlwbGVhc2VfZGlzcGxheV9tb3JlX3Byb21wdCA9IDE7CisJCQkJbGVuID0gMDsKKwkJCX0KKwkJCWlmIChjICE9ICdcbicgJiYgd3JhcCkgeworCQkJCS8qIFRoZW4gb3V0cHV0dGluZyB0aGlzIHdpbGwgYWxzbyBwdXQgYSBjaGFyYWN0ZXIgb24KKwkJCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoYXQgbmV3IGxpbmUuIFRodXMgd2UgZmlyc3Qgd2FudCB0bworCQkJCSAqIGRpc3BsYXkgdGhlIHByb21wdCAoaWYgYW55KSwgc28gd2Ugc2tpcCB0aGUgcHV0Y2hhcigpCisJCQkJICogYW5kIGdvIGJhY2sgdG8gdGhlIHRvcCBvZiB0aGUgbG9vcCwgd2l0aG91dCByZWFkaW5nCisJCQkJICogYSBuZXcgY2hhcmFjdGVyLiAqLworCQkJCWdvdG8gbG9vcF90b3A7CisJCQl9CisJCQkvKiBNeSBzbWFsbCBtaW5kIGNhbm5vdCBmYXRob20gYmFja3NwYWNlcyBhbmQgVVRGLTggKi8KKwkJCXB1dGNoYXIoYyk7CisJCQlkaWVfaWZfZmVycm9yX3N0ZG91dCgpOyAvKiBpZiB0dHkgd2FzIGRlc3Ryb3llZCAoY2xvc2VkIHh0ZXJtLCBldGMpICovCisJCX0KKwkJZmNsb3NlKGZpbGUpOworCQlmZmx1c2hfYWxsKCk7CisJfSB3aGlsZSAoKmFyZ3YgJiYgKisrYXJndik7CisgZW5kOgorCXNldFRlcm1TZXR0aW5ncyhjaW5fZmlsZW5vLCAmaW5pdGlhbF9zZXR0aW5ncyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21vdW50LmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L21vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlNTMyYwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvbW91bnQuYwpAQCAtMCwwICsxLDIxOTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbW91bnQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgQnJ1Y2UgUGVyZW5zIDxicnVjZUBwaXhhci5jb20+LgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvLyBEZXNpZ24gbm90ZXM6IFRoZXJlIGlzIG5vIHNwZWMgZm9yIG1vdW50LiAgUmVtaW5kIG1lIHRvIHdyaXRlIG9uZS4KKy8vCisvLyBtb3VudF9tYWluKCkgY2FsbHMgc2luZ2xlbW91bnQoKSB3aGljaCBjYWxscyBtb3VudF9pdF9ub3coKS4KKy8vCisvLyBtb3VudF9tYWluKCkgY2FuIGxvb3AgdGhyb3VnaCAvZXRjL2ZzdGFiIGZvciBtb3VudCAtYQorLy8gc2luZ2xlbW91bnQoKSBjYW4gbG9vcCB0aHJvdWdoIC9ldGMvZmlsZXN5c3RlbXMgZm9yIGZzdHlwZSBkZXRlY3Rpb24uCisvLyBtb3VudF9pdF9ub3coKSBkb2VzIHRoZSBhY3R1YWwgbW91bnQuCisvLworCisvL3VzYWdlOiNkZWZpbmUgbW91bnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbLW8gT1BUU10gREVWSUNFIE5PREUiCisvL3VzYWdlOiNkZWZpbmUgbW91bnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNb3VudCBhIGZpbGVzeXN0ZW0uIEZpbGVzeXN0ZW0gYXV0b2RldGVjdGlvbiByZXF1aXJlcyAvcHJvYy5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJCU1vdW50IGFsbCBmaWxlc3lzdGVtcyBpbiBmc3RhYiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTU9VTlRfRkFLRSgKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKAorLy91c2FnZTogICAgICJcbgktZgkJVXBkYXRlIC9ldGMvbXRhYiwgYnV0IGRvbid0IG1vdW50IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKAorLy91c2FnZTogICAgICJcbgktZgkJRHJ5IHJ1biIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUygKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCURvbid0IHJ1biBtb3VudCBoZWxwZXIiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX01UQUJfU1VQUE9SVCgKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCURvbid0IHVwZGF0ZSAvZXRjL210YWIiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1yCQlSZWFkLW9ubHkgbW91bnQiCisvL3VzYWdlOiAgICAgIlxuCS13CQlSZWFkLXdyaXRlIG1vdW50IChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgRlNUWVBFCUZpbGVzeXN0ZW0gdHlwZSIKKy8vdXNhZ2U6ICAgICAiXG4JLU8gT1BUCQlNb3VudCBvbmx5IGZpbGVzeXN0ZW1zIHdpdGggb3B0aW9uIE9QVCAoLWEgb25seSkiCisvL3VzYWdlOiAgICAgIlxuLW8gT1BUOiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTU9VTlRfTE9PUCgKKy8vdXNhZ2U6ICAgICAiXG4JbG9vcAkJSWdub3JlZCAobG9vcCBkZXZpY2VzIGFyZSBhdXRvZGV0ZWN0ZWQpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9NT1VOVF9GTEFHUygKKy8vdXNhZ2U6ICAgICAiXG4JW2Fdc3luYwkJV3JpdGVzIGFyZSBbYV1zeW5jaHJvbm91cyIKKy8vdXNhZ2U6ICAgICAiXG4JW25vXWF0aW1lCURpc2FibGUvZW5hYmxlIHVwZGF0ZXMgdG8gaW5vZGUgYWNjZXNzIHRpbWVzIgorLy91c2FnZTogICAgICJcbglbbm9dZGlyYXRpbWUJRGlzYWJsZS9lbmFibGUgYXRpbWUgdXBkYXRlcyB0byBkaXJlY3RvcmllcyIKKy8vdXNhZ2U6ICAgICAiXG4JW25vXXJlbGF0aW1lCURpc2FibGUvZW5hYmxlIGF0aW1lIHVwZGF0ZXMgcmVsYXRpdmUgdG8gbW9kaWZpY2F0aW9uIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCVtub11kZXYJCShEaXMpYWxsb3cgdXNlIG9mIHNwZWNpYWwgZGV2aWNlIGZpbGVzIgorLy91c2FnZTogICAgICJcbglbbm9dZXhlYwkoRGlzKWFsbG93IHVzZSBvZiBleGVjdXRhYmxlIGZpbGVzIgorLy91c2FnZTogICAgICJcbglbbm9dc3VpZAkoRGlzKWFsbG93IHNldC11c2VyLWlkLXJvb3QgcHJvZ3JhbXMiCisvL3VzYWdlOiAgICAgIlxuCVtyXXNoYXJlZAlDb252ZXJ0IFtyZWN1cnNpdmVseV0gdG8gYSBzaGFyZWQgc3VidHJlZSIKKy8vdXNhZ2U6ICAgICAiXG4JW3Jdc2xhdmUJQ29udmVydCBbcmVjdXJzaXZlbHldIHRvIGEgc2xhdmUgc3VidHJlZSIKKy8vdXNhZ2U6ICAgICAiXG4JW3JdcHJpdmF0ZQlDb252ZXJ0IFtyZWN1cnNpdmVseV0gdG8gYSBwcml2YXRlIHN1YnRyZWUiCisvL3VzYWdlOiAgICAgIlxuCVt1bl1iaW5kYWJsZQlNYWtlIG1vdW50IHBvaW50IFt1bl1hYmxlIHRvIGJlIGJpbmQgbW91bnRlZCIKKy8vdXNhZ2U6ICAgICAiXG4JW3JdYmluZAkJQmluZCBhIGZpbGUgb3IgZGlyZWN0b3J5IFtyZWN1cnNpdmVseV0gdG8gYW5vdGhlciBsb2NhdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JbW92ZQkJUmVsb2NhdGUgYW4gZXhpc3RpbmcgbW91bnQgcG9pbnQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCXJlbW91bnQJCVJlbW91bnQgYSBtb3VudGVkIGZpbGVzeXN0ZW0sIGNoYW5naW5nIGZsYWdzIgorLy91c2FnZTogICAgICJcbglyby9ydwkJU2FtZSBhcyAtci8tdyIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuVGhlcmUgYXJlIGZpbGVzeXN0ZW0tc3BlY2lmaWMgLW8gZmxhZ3MuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBtb3VudF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBtb3VudFxuIgorLy91c2FnZTogICAgICAgIi9kZXYvaGRhMyBvbiAvIHR5cGUgbWluaXggKHJ3KVxuIgorLy91c2FnZTogICAgICAgInByb2Mgb24gL3Byb2MgdHlwZSBwcm9jIChydylcbiIKKy8vdXNhZ2U6ICAgICAgICJkZXZwdHMgb24gL2Rldi9wdHMgdHlwZSBkZXZwdHMgKHJ3KVxuIgorLy91c2FnZTogICAgICAgIiQgbW91bnQgL2Rldi9mZDAgL21udCAtdCBtc2RvcyAtbyByb1xuIgorLy91c2FnZTogICAgICAgIiQgbW91bnQgL3RtcC9kaXNraW1hZ2UgL29wdCAtdCBleHQyIC1vIGxvb3BcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vdW50IGNkX2ltYWdlLmlzbyBteWRpclxuIgorLy91c2FnZTojZGVmaW5lIG1vdW50X25vdGVzX3VzYWdlCisvL3VzYWdlOiAgICAgICAiUmV0dXJucyAwIGZvciBzdWNjZXNzLCBudW1iZXIgb2YgZmFpbGVkIG1vdW50cyBmb3IgLWEsIG9yIGVycm5vIGZvciBvbmUgbW91bnQuIgorCisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisvLyBHcmFiIG1vcmUgYXMgbmVlZGVkIGZyb20gdXRpbC1saW51eCdzIG1vdW50L21vdW50X2NvbnN0YW50cy5oCisjaWZuZGVmIE1TX0RJUlNZTkMKKyMgZGVmaW5lIE1TX0RJUlNZTkMgICAgICgxIDw8IDcpIC8vIERpcmVjdG9yeSBtb2RpZmljYXRpb25zIGFyZSBzeW5jaHJvbm91cworI2VuZGlmCisjaWZuZGVmIE1TX1VOSU9OCisjIGRlZmluZSBNU19VTklPTiAgICAgICAoMSA8PCA4KQorI2VuZGlmCisjaWZuZGVmIE1TX0JJTkQKKyMgZGVmaW5lIE1TX0JJTkQgICAgICAgICgxIDw8IDEyKQorI2VuZGlmCisjaWZuZGVmIE1TX01PVkUKKyMgZGVmaW5lIE1TX01PVkUgICAgICAgICgxIDw8IDEzKQorI2VuZGlmCisjaWZuZGVmIE1TX1JFQ1VSU0lWRQorIyBkZWZpbmUgTVNfUkVDVVJTSVZFICAgKDEgPDwgMTQpCisjZW5kaWYKKyNpZm5kZWYgTVNfU0lMRU5UCisjIGRlZmluZSBNU19TSUxFTlQgICAgICAoMSA8PCAxNSkKKyNlbmRpZgorLy8gVGhlIHNoYXJlZCBzdWJ0cmVlIHN0dWZmLCB3aGljaCB3ZW50IGluIGFyb3VuZCAyLjYuMTUKKyNpZm5kZWYgTVNfVU5CSU5EQUJMRQorIyBkZWZpbmUgTVNfVU5CSU5EQUJMRSAgKDEgPDwgMTcpCisjZW5kaWYKKyNpZm5kZWYgTVNfUFJJVkFURQorIyBkZWZpbmUgTVNfUFJJVkFURSAgICAgKDEgPDwgMTgpCisjZW5kaWYKKyNpZm5kZWYgTVNfU0xBVkUKKyMgZGVmaW5lIE1TX1NMQVZFICAgICAgICgxIDw8IDE5KQorI2VuZGlmCisjaWZuZGVmIE1TX1NIQVJFRAorIyBkZWZpbmUgTVNfU0hBUkVEICAgICAgKDEgPDwgMjApCisjZW5kaWYKKyNpZm5kZWYgTVNfUkVMQVRJTUUKKyMgZGVmaW5lIE1TX1JFTEFUSU1FICAgICgxIDw8IDIxKQorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmIEVOQUJMRV9GRUFUVVJFX01PVU5UX0xBQkVMCisjIGluY2x1ZGUgInZvbHVtZV9pZC5oIgorI2Vsc2UKKyMgZGVmaW5lIHJlc29sdmVfbW91bnRfc3BlYyhmc25hbWUpICgodm9pZCkwKQorI2VuZGlmCisKKy8vIE5lZWRlZCBmb3IgbmZzIHN1cHBvcnQgb25seQorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjdW5kZWYgVFJVRQorI3VuZGVmIEZBTFNFCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTCisvKiBUaGlzIGlzIGp1c3QgYSB3YXJuaW5nIG9mIGEgY29tbW9uIG1pc3Rha2UuICBQb3NzaWJseSB0aGlzIHNob3VsZCBiZSBhCisgKiB1Y2xpYmMgZmFxIGVudHJ5IHJhdGhlciB0aGFuIGluIGJ1c3lib3guLi4gKi8KKyMgaWYgZGVmaW5lZChfX1VDTElCQ19fKSAmJiAhIGRlZmluZWQoX19VQ0xJQkNfSEFTX1JQQ19fKQorIyAgZXJyb3IgIllvdSBuZWVkIHRvIGJ1aWxkIHVDbGliYyB3aXRoIFVDTElCQ19IQVNfUlBDIGZvciBORlMgc3VwcG9ydCIKKyMgZW5kaWYKKyMgaW5jbHVkZSA8cnBjL3JwYy5oPgorIyBpbmNsdWRlIDxycGMvcG1hcF9wcm90Lmg+CisjIGluY2x1ZGUgPHJwYy9wbWFwX2NsbnQuaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKF9fZGlldGxpYmNfXykKKy8vIDE2LjEyLjIwMDYsIFNhbXBvIEtlbGxvbWFraSAoc2FtcG9AaWtpLmZpKQorLy8gZGlldGxpYmMtMC4zMCBkb2VzIG5vdCBoYXZlIGltcGxlbWVudGF0aW9uIG9mIGdldG1udGVudF9yKCkKK3N0YXRpYyBzdHJ1Y3QgbW50ZW50ICpnZXRtbnRlbnRfcihGSUxFKiBzdHJlYW0sIHN0cnVjdCBtbnRlbnQqIHJlc3VsdCwKKwkJY2hhciogYnVmZmVyIFVOVVNFRF9QQVJBTSwgaW50IGJ1ZnNpemUgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBtbnRlbnQqIG1lbnQgPSBnZXRtbnRlbnQoc3RyZWFtKTsKKwlyZXR1cm4gbWVtY3B5KHJlc3VsdCwgbWVudCwgc2l6ZW9mKCptZW50KSk7Cit9CisjZW5kaWYKKworCisvLyBOb3QgcmVhbCBmbGFncywgYnV0IHdlIHdhbnQgdG8gYmUgYWJsZSB0byBjaGVjayBmb3IgdGhpcy4KK2VudW0geworCU1PVU5UX1VTRVJTICA9ICgxIDw8IDI4KSAqIEVOQUJMRV9ERVNLVE9QLAorCU1PVU5UX05PQVVUTyA9ICgxIDw8IDI5KSwKKwlNT1VOVF9TV0FQICAgPSAoMSA8PCAzMCksCit9OworCisKKyNkZWZpbmUgT1BUSU9OX1NUUiAibzp0OnJ3YW5mdnNpTzoiCitlbnVtIHsKKwlPUFRfbyA9ICgxIDw8IDApLAorCU9QVF90ID0gKDEgPDwgMSksCisJT1BUX3IgPSAoMSA8PCAyKSwKKwlPUFRfdyA9ICgxIDw8IDMpLAorCU9QVF9hID0gKDEgPDwgNCksCisJT1BUX24gPSAoMSA8PCA1KSwKKwlPUFRfZiA9ICgxIDw8IDYpLAorCU9QVF92ID0gKDEgPDwgNyksCisJT1BUX3MgPSAoMSA8PCA4KSwKKwlPUFRfaSA9ICgxIDw8IDkpLAorCU9QVF9PID0gKDEgPDwgMTApLAorfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX01UQUJfU1VQUE9SVAorI2RlZmluZSBVU0VfTVRBQiAoIShvcHRpb25fbWFzazMyICYgT1BUX24pKQorI2Vsc2UKKyNkZWZpbmUgVVNFX01UQUIgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9GQUtFCisjZGVmaW5lIEZBS0VfSVQgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZikKKyNlbHNlCisjZGVmaW5lIEZBS0VfSVQgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9IRUxQRVJTCisjZGVmaW5lIEhFTFBFUlNfQUxMT1dFRCAoIShvcHRpb25fbWFzazMyICYgT1BUX2kpKQorI2Vsc2UKKyNkZWZpbmUgSEVMUEVSU19BTExPV0VEIDAKKyNlbmRpZgorCisKKy8vIFRPRE86IG1vcmUgInVzZXIiIGZsYWcgY29tcGF0aWJpbGl0eS4KKy8vICJ1c2VyIiBvcHRpb24gKGZyb20gbW91bnQgbWFucGFnZSk6CisvLyBPbmx5IHRoZSB1c2VyIHRoYXQgbW91bnRlZCBhIGZpbGVzeXN0ZW0gY2FuIHVubW91bnQgaXQgYWdhaW4uCisvLyBJZiBhbnkgdXNlciBzaG91bGQgYmUgYWJsZSB0byB1bm1vdW50LCB0aGVuIHVzZSB1c2VycyBpbnN0ZWFkIG9mIHVzZXIKKy8vIGluIHRoZSBmc3RhYiBsaW5lLiAgVGhlIG93bmVyIG9wdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSB1c2VyIG9wdGlvbiwKKy8vIHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXQgdGhlIHVzZXIgbXVzdCBiZSB0aGUgb3duZXIgb2YgdGhlIHNwZWNpYWwgZmlsZS4KKy8vIFRoaXMgbWF5IGJlIHVzZWZ1bCBlLmcuIGZvciAvZGV2L2ZkIGlmIGEgbG9naW4gc2NyaXB0IG1ha2VzCisvLyB0aGUgY29uc29sZSB1c2VyIG93bmVyIG9mIHRoaXMgZGV2aWNlLgorCisvLyBTdGFuZGFyZCBtb3VudCBvcHRpb25zIChmcm9tIC1vIG9wdGlvbnMgb3IgLS1vcHRpb25zKSwKKy8vIHdpdGggY29ycmVzcG9uZGluZyBmbGFncworc3RhdGljIGNvbnN0IGludDMyX3QgbW91bnRfb3B0aW9uc1tdID0geworCS8vIE1TX0ZMQUdTIHNldCBhIGJpdC4gIH5NU19GTEFHUyBkaXNhYmxlIHRoYXQgYml0LiAgMCBmbGFncyBhcmUgTk9Qcy4KKworCUlGX0ZFQVRVUkVfTU9VTlRfTE9PUCgKKwkJLyogImxvb3AiICovIDAsCisJKQorCisJSUZfRkVBVFVSRV9NT1VOVF9GU1RBQigKKwkJLyogImRlZmF1bHRzIiAqLyAwLAorCQkvKiAicXVpZXQiIDAgLSBkbyBub3QgZmlsdGVyIG91dCwgdmZhdCB3YW50cyB0byBzZWUgaXQgKi8KKwkJLyogIm5vYXV0byIgKi8gTU9VTlRfTk9BVVRPLAorCQkvKiAic3ciICAgICAqLyBNT1VOVF9TV0FQLAorCQkvKiAic3dhcCIgICAqLyBNT1VOVF9TV0FQLAorCQlJRl9ERVNLVE9QKC8qICJ1c2VyIiAgKi8gTU9VTlRfVVNFUlMsKQorCQlJRl9ERVNLVE9QKC8qICJ1c2VycyIgKi8gTU9VTlRfVVNFUlMsKQorCQkvKiAiX25ldGRldiIgKi8gMCwKKwkpCisKKwlJRl9GRUFUVVJFX01PVU5UX0ZMQUdTKAorCQkvLyB2ZnMgZmxhZ3MKKwkJLyogIm5vc3VpZCIgICAgICAqLyBNU19OT1NVSUQsCisJCS8qICJzdWlkIiAgICAgICAgKi8gfk1TX05PU1VJRCwKKwkJLyogImRldiIgICAgICAgICAqLyB+TVNfTk9ERVYsCisJCS8qICJub2RldiIgICAgICAgKi8gTVNfTk9ERVYsCisJCS8qICJleGVjIiAgICAgICAgKi8gfk1TX05PRVhFQywKKwkJLyogIm5vZXhlYyIgICAgICAqLyBNU19OT0VYRUMsCisJCS8qICJzeW5jIiAgICAgICAgKi8gTVNfU1lOQ0hST05PVVMsCisJCS8qICJkaXJzeW5jIiAgICAgKi8gTVNfRElSU1lOQywKKwkJLyogImFzeW5jIiAgICAgICAqLyB+TVNfU1lOQ0hST05PVVMsCisJCS8qICJhdGltZSIgICAgICAgKi8gfk1TX05PQVRJTUUsCisJCS8qICJub2F0aW1lIiAgICAgKi8gTVNfTk9BVElNRSwKKwkJLyogImRpcmF0aW1lIiAgICAqLyB+TVNfTk9ESVJBVElNRSwKKwkJLyogIm5vZGlyYXRpbWUiICAqLyBNU19OT0RJUkFUSU1FLAorCQkvKiAibWFuZCIgICAgICAgICovIE1TX01BTkRMT0NLLAorCQkvKiAibm9tYW5kIiAgICAgICovIH5NU19NQU5ETE9DSywKKwkJLyogInJlbGF0aW1lIiAgICAqLyBNU19SRUxBVElNRSwKKwkJLyogIm5vcmVsYXRpbWUiICAqLyB+TVNfUkVMQVRJTUUsCisJCS8qICJsb3VkIiAgICAgICAgKi8gfk1TX1NJTEVOVCwKKwkJLyogInJiaW5kIiAgICAgICAqLyBNU19CSU5EfE1TX1JFQ1VSU0lWRSwKKworCQkvLyBhY3Rpb24gZmxhZ3MKKwkJLyogInVuaW9uIiAgICAgICAqLyBNU19VTklPTiwKKwkJLyogImJpbmQiICAgICAgICAqLyBNU19CSU5ELAorCQkvKiAibW92ZSIgICAgICAgICovIE1TX01PVkUsCisJCS8qICJzaGFyZWQiICAgICAgKi8gTVNfU0hBUkVELAorCQkvKiAic2xhdmUiICAgICAgICovIE1TX1NMQVZFLAorCQkvKiAicHJpdmF0ZSIgICAgICovIE1TX1BSSVZBVEUsCisJCS8qICJ1bmJpbmRhYmxlIiAgKi8gTVNfVU5CSU5EQUJMRSwKKwkJLyogInJzaGFyZWQiICAgICAqLyBNU19TSEFSRUR8TVNfUkVDVVJTSVZFLAorCQkvKiAicnNsYXZlIiAgICAgICovIE1TX1NMQVZFfE1TX1JFQ1VSU0lWRSwKKwkJLyogInJwcml2YXRlIiAgICAqLyBNU19QUklWQVRFfE1TX1JFQ1VSU0lWRSwKKwkJLyogInJ1bmJpbmRhYmxlIiAqLyBNU19VTkJJTkRBQkxFfE1TX1JFQ1VSU0lWRSwKKwkpCisKKwkvLyBBbHdheXMgdW5kZXJzdG9vZC4KKwkvKiAicm8iICAgICAgKi8gTVNfUkRPTkxZLCAgLy8gdmZzIGZsYWcKKwkvKiAicnciICAgICAgKi8gfk1TX1JET05MWSwgLy8gdmZzIGZsYWcKKwkvKiAicmVtb3VudCIgKi8gTVNfUkVNT1VOVCAgLy8gYWN0aW9uIGZsYWcKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIG1vdW50X29wdGlvbl9zdHJbXSA9CisJSUZfRkVBVFVSRV9NT1VOVF9MT09QKAorCQkibG9vcFwwIgorCSkKKwlJRl9GRUFUVVJFX01PVU5UX0ZTVEFCKAorCQkiZGVmYXVsdHNcMCIKKwkJLy8gInF1aWV0XDAiIC0gZG8gbm90IGZpbHRlciBvdXQsIHZmYXQgd2FudHMgdG8gc2VlIGl0CisJCSJub2F1dG9cMCIKKwkJInN3XDAiCisJCSJzd2FwXDAiCisJCUlGX0RFU0tUT1AoInVzZXJcMCIpCisJCUlGX0RFU0tUT1AoInVzZXJzXDAiKQorCQkiX25ldGRldlwwIgorCSkKKwlJRl9GRUFUVVJFX01PVU5UX0ZMQUdTKAorCQkvLyB2ZnMgZmxhZ3MKKwkJIm5vc3VpZFwwIgorCQkic3VpZFwwIgorCQkiZGV2XDAiCisJCSJub2RldlwwIgorCQkiZXhlY1wwIgorCQkibm9leGVjXDAiCisJCSJzeW5jXDAiCisJCSJkaXJzeW5jXDAiCisJCSJhc3luY1wwIgorCQkiYXRpbWVcMCIKKwkJIm5vYXRpbWVcMCIKKwkJImRpcmF0aW1lXDAiCisJCSJub2RpcmF0aW1lXDAiCisJCSJtYW5kXDAiCisJCSJub21hbmRcMCIKKwkJInJlbGF0aW1lXDAiCisJCSJub3JlbGF0aW1lXDAiCisJCSJsb3VkXDAiCisJCSJyYmluZFwwIgorCisJCS8vIGFjdGlvbiBmbGFncworCQkidW5pb25cMCIKKwkJImJpbmRcMCIKKwkJIm1vdmVcMCIKKwkJIm1ha2Utc2hhcmVkXDAiCisJCSJtYWtlLXNsYXZlXDAiCisJCSJtYWtlLXByaXZhdGVcMCIKKwkJIm1ha2UtdW5iaW5kYWJsZVwwIgorCQkibWFrZS1yc2hhcmVkXDAiCisJCSJtYWtlLXJzbGF2ZVwwIgorCQkibWFrZS1ycHJpdmF0ZVwwIgorCQkibWFrZS1ydW5iaW5kYWJsZVwwIgorCSkKKworCS8vIEFsd2F5cyB1bmRlcnN0b29kLgorCSJyb1wwIiAgICAgICAgLy8gdmZzIGZsYWcKKwkicndcMCIgICAgICAgIC8vIHZmcyBmbGFnCisJInJlbW91bnRcMCIgICAvLyBhY3Rpb24gZmxhZworOworCisKK3N0cnVjdCBnbG9iYWxzIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9ORlMKKwlzbWFsbHVpbnQgbmZzX21vdW50X3ZlcnNpb247CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9WRVJCT1NFCisJdW5zaWduZWQgdmVyYm9zZTsKKyNlbmRpZgorCWxsaXN0X3QgKmZzbGlzdDsKKwljaGFyIGdldG1udGVudF9idWZbMV07Cit9IEZJWF9BTElBU0lORzsKK2VudW0geyBHRVRNTlRFTlRfQlVGU0laRSA9IENPTU1PTl9CVUZTSVpFIC0gb2Zmc2V0b2Yoc3RydWN0IGdsb2JhbHMsIGdldG1udGVudF9idWYpIH07CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgbmZzX21vdW50X3ZlcnNpb24gKEcubmZzX21vdW50X3ZlcnNpb24pCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfVkVSQk9TRQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgICAoRy52ZXJib3NlICAgICAgICAgICkKKyNlbHNlCisjZGVmaW5lIHZlcmJvc2UgICAgICAgICAgIDAKKyNlbmRpZgorI2RlZmluZSBmc2xpc3QgICAgICAgICAgICAoRy5mc2xpc3QgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0bW50ZW50X2J1ZiAgICAgKEcuZ2V0bW50ZW50X2J1ZiAgICApCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NVEFCX1NVUFBPUlQKKy8qCisgKiB1cGRhdGVfbXRhYl9lbnRyeV9vbl9tb3ZlKCkgaXMgdXNlZCB0byB1cGRhdGUgZW50cnkgaW4gY2FzZSBvZiBtb3VudCAtLW1vdmUuCisgKiB3ZSBhcmUgbG9va2luZyBmb3IgZXhpc3RpbmcgZW50cmllcyBtbnRfZGlyIHdoaWNoIGlzIGVxdWFsIHRvIG1udF9mc25hbWUgb2YKKyAqIGlucHV0IG1udGVudCBhbmQgcmVwbGFjZSBpdCBieSBuZXcgb25lLgorICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgdXBkYXRlX210YWJfZW50cnlfb25fbW92ZShjb25zdCBzdHJ1Y3QgbW50ZW50ICptcCkKK3sKKwlzdHJ1Y3QgbW50ZW50ICplbnRyaWVzLCAqbTsKKwlpbnQgaSwgY291bnQ7CisJRklMRSAqbW91bnRUYWJsZTsKKworCW1vdW50VGFibGUgPSBzZXRtbnRlbnQoYmJfcGF0aF9tdGFiX2ZpbGUsICJyIik7CisJaWYgKCFtb3VudFRhYmxlKSB7CisJCWJiX3BlcnJvcl9tc2coYmJfcGF0aF9tdGFiX2ZpbGUpOworCQlyZXR1cm47CisJfQorCisJZW50cmllcyA9IE5VTEw7CisJY291bnQgPSAwOworCXdoaWxlICgobSA9IGdldG1udGVudChtb3VudFRhYmxlKSkgIT0gTlVMTCkgeworCQllbnRyaWVzID0geHJlYWxsb2NfdmVjdG9yKGVudHJpZXMsIDMsIGNvdW50KTsKKwkJZW50cmllc1tjb3VudF0ubW50X2ZzbmFtZSA9IHhzdHJkdXAobS0+bW50X2ZzbmFtZSk7CisJCWVudHJpZXNbY291bnRdLm1udF9kaXIgPSB4c3RyZHVwKG0tPm1udF9kaXIpOworCQllbnRyaWVzW2NvdW50XS5tbnRfdHlwZSA9IHhzdHJkdXAobS0+bW50X3R5cGUpOworCQllbnRyaWVzW2NvdW50XS5tbnRfb3B0cyA9IHhzdHJkdXAobS0+bW50X29wdHMpOworCQllbnRyaWVzW2NvdW50XS5tbnRfZnJlcSA9IG0tPm1udF9mcmVxOworCQllbnRyaWVzW2NvdW50XS5tbnRfcGFzc25vID0gbS0+bW50X3Bhc3NubzsKKwkJY291bnQrKzsKKwl9CisJZW5kbW50ZW50KG1vdW50VGFibGUpOworCisJbW91bnRUYWJsZSA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInciKTsKKwlpZiAobW91bnRUYWJsZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaWYgKHN0cmNtcChlbnRyaWVzW2ldLm1udF9kaXIsIG1wLT5tbnRfZnNuYW1lKSAhPSAwKQorCQkJCWFkZG1udGVudChtb3VudFRhYmxlLCAmZW50cmllc1tpXSk7CisJCQllbHNlCisJCQkJYWRkbW50ZW50KG1vdW50VGFibGUsIG1wKTsKKwkJfQorCQllbmRtbnRlbnQobW91bnRUYWJsZSk7CisJfSBlbHNlIGlmIChlcnJubyAhPSBFUk9GUykKKwkJYmJfcGVycm9yX21zZyhiYl9wYXRoX210YWJfZmlsZSk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWZyZWUoZW50cmllc1tpXS5tbnRfZnNuYW1lKTsKKwkJCWZyZWUoZW50cmllc1tpXS5tbnRfZGlyKTsKKwkJCWZyZWUoZW50cmllc1tpXS5tbnRfdHlwZSk7CisJCQlmcmVlKGVudHJpZXNbaV0ubW50X29wdHMpOworCQl9CisJCWZyZWUoZW50cmllcyk7CisJfQorfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9WRVJCT1NFCitzdGF0aWMgaW50IHZlcmJvc2VfbW91bnQoY29uc3QgY2hhciAqc291cmNlLCBjb25zdCBjaGFyICp0YXJnZXQsCisJCWNvbnN0IGNoYXIgKmZpbGVzeXN0ZW10eXBlLAorCQl1bnNpZ25lZCBsb25nIG1vdW50ZmxhZ3MsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJaW50IHJjOworCisJZXJybm8gPSAwOworCXJjID0gbW91bnQoc291cmNlLCB0YXJnZXQsIGZpbGVzeXN0ZW10eXBlLCBtb3VudGZsYWdzLCBkYXRhKTsKKwlpZiAodmVyYm9zZSA+PSAyKQorCQliYl9wZXJyb3JfbXNnKCJtb3VudCgnJXMnLCclcycsJyVzJywweCUwOGx4LCclcycpOiVkIiwKKwkJCXNvdXJjZSwgdGFyZ2V0LCBmaWxlc3lzdGVtdHlwZSwKKwkJCW1vdW50ZmxhZ3MsIChjaGFyKilkYXRhLCByYyk7CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgdmVyYm9zZV9tb3VudCguLi4pIG1vdW50KF9fVkFfQVJHU19fKQorI2VuZGlmCisKKy8vIEFwcGVuZCBtb3VudCBvcHRpb25zIHRvIHN0cmluZworc3RhdGljIHZvaWQgYXBwZW5kX21vdW50X29wdGlvbnMoY2hhciAqKm9sZG9wdHMsIGNvbnN0IGNoYXIgKm5ld29wdHMpCit7CisJaWYgKCpvbGRvcHRzICYmICoqb2xkb3B0cykgeworCQkvLyBEbyBub3QgaW5zZXJ0IG9wdGlvbnMgd2hpY2ggYXJlIGFscmVhZHkgdGhlcmUKKwkJd2hpbGUgKG5ld29wdHNbMF0pIHsKKwkJCWNoYXIgKnA7CisJCQlpbnQgbGVuID0gc3RybGVuKG5ld29wdHMpOworCQkJcCA9IHN0cmNocihuZXdvcHRzLCAnLCcpOworCQkJaWYgKHApIGxlbiA9IHAgLSBuZXdvcHRzOworCQkJcCA9ICpvbGRvcHRzOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoIXN0cm5jbXAocCwgbmV3b3B0cywgbGVuKQorCQkJCSAmJiAocFtsZW5dID09ICcsJyB8fCBwW2xlbl0gPT0gJ1wwJykpCisJCQkJCWdvdG8gc2tpcDsKKwkJCQlwID0gc3RyY2hyKHAsJywnKTsKKwkJCQlpZiAoIXApIGJyZWFrOworCQkJCXArKzsKKwkJCX0KKwkJCXAgPSB4YXNwcmludGYoIiVzLCUuKnMiLCAqb2xkb3B0cywgbGVuLCBuZXdvcHRzKTsKKwkJCWZyZWUoKm9sZG9wdHMpOworCQkJKm9sZG9wdHMgPSBwOworIHNraXA6CisJCQluZXdvcHRzICs9IGxlbjsKKwkJCXdoaWxlIChuZXdvcHRzWzBdID09ICcsJykgbmV3b3B0cysrOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKCpvbGRvcHRzKTsKKwkJKm9sZG9wdHMgPSB4c3RyZHVwKG5ld29wdHMpOworCX0KK30KKworLy8gVXNlIHRoZSBtb3VudF9vcHRpb25zIGxpc3QgdG8gcGFyc2Ugb3B0aW9ucyBpbnRvIGZsYWdzLgorLy8gQWxzbyB1cGRhdGUgbGlzdCBvZiB1bnJlY29nbml6ZWQgb3B0aW9ucyBpZiB1bnJlY29nbml6ZWQgIT0gTlVMTAorc3RhdGljIGxvbmcgcGFyc2VfbW91bnRfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBjaGFyICoqdW5yZWNvZ25pemVkKQoreworCWxvbmcgZmxhZ3MgPSBNU19TSUxFTlQ7CisKKwkvLyBMb29wIHRocm91Z2ggb3B0aW9ucworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgaTsKKwkJY2hhciAqY29tbWEgPSBzdHJjaHIob3B0aW9ucywgJywnKTsKKwkJY29uc3QgY2hhciAqb3B0aW9uX3N0ciA9IG1vdW50X29wdGlvbl9zdHI7CisKKwkJaWYgKGNvbW1hKSAqY29tbWEgPSAnXDAnOworCisvLyBGSVhNRTogdXNlIGhhc21udG9wdCgpCisJCS8vIEZpbmQgdGhpcyBvcHRpb24gaW4gbW91bnRfb3B0aW9ucworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtb3VudF9vcHRpb25zKTsgaSsrKSB7CisJCQlpZiAoc3RyY2FzZWNtcChvcHRpb25fc3RyLCBvcHRpb25zKSA9PSAwKSB7CisJCQkJbG9uZyBmbCA9IG1vdW50X29wdGlvbnNbaV07CisJCQkJaWYgKGZsIDwgMCkKKwkJCQkJZmxhZ3MgJj0gZmw7CisJCQkJZWxzZQorCQkJCQlmbGFncyB8PSBmbDsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQkJb3B0aW9uX3N0ciArPSBzdHJsZW4ob3B0aW9uX3N0cikgKyAxOworCQl9CisJCS8vIFdlIGRpZCBub3QgcmVjb2duaXplIHRoaXMgb3B0aW9uLgorCQkvLyBJZiAidW5yZWNvZ25pemVkIiBpcyBub3QgTlVMTCwgYXBwZW5kIG9wdGlvbiB0aGVyZS4KKwkJLy8gTm90ZSB0aGF0IHdlIHNob3VsZCBub3QgYXBwZW5kICplbXB0eSogb3B0aW9uIC0KKwkJLy8gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcGFzcyBOVUxMLCBub3QgIiIsIHRvICJkYXRhIgorCQkvLyBwYXJhbWV0ZXIgb2YgbW91bnQoMikgc3lzY2FsbC4KKwkJLy8gVGhpcyBpcyBjcnVjaWFsIGZvciBmaWxlc3lzdGVtcyB0aGF0IGRvbid0IGFjY2VwdAorCQkvLyBhbnkgYXJiaXRyYXJ5IG1vdW50IG9wdGlvbnMsIGxpa2UgY2dyb3VwIGZzOgorCQkvLyAibW91bnQgLXQgY2dyb3VwIG5vbmUgL21udCIKKwkJaWYgKG9wdGlvbnNbMF0gJiYgdW5yZWNvZ25pemVkKSB7CisJCQkvLyBBZGQgaXQgdG8gc3RyZmxhZ3MsIHRvIHBhc3Mgb24gdG8ga2VybmVsCisJCQljaGFyICpwID0gKnVucmVjb2duaXplZDsKKwkJCXVuc2lnbmVkIGxlbiA9IHAgPyBzdHJsZW4ocCkgOiAwOworCQkJKnVucmVjb2duaXplZCA9IHAgPSB4cmVhbGxvYyhwLCBsZW4gKyBzdHJsZW4ob3B0aW9ucykgKyAyKTsKKworCQkJLy8gQ29tbWEgc2VwYXJhdGVkIGlmIGl0J3Mgbm90IHRoZSBmaXJzdCBvbmUKKwkJCWlmIChsZW4pIHBbbGVuKytdID0gJywnOworCQkJc3RyY3B5KHAgKyBsZW4sIG9wdGlvbnMpOworCQl9CisgZm91bmQ6CisJCWlmICghY29tbWEpCisJCQlicmVhazsKKwkJLy8gQWR2YW5jZSB0byBuZXh0IG9wdGlvbgorCQkqY29tbWEgPSAnLCc7CisJCW9wdGlvbnMgPSArK2NvbW1hOworCX0KKworCXJldHVybiBmbGFnczsKK30KKworLy8gUmV0dXJuIGEgbGlzdCBvZiBhbGwgYmxvY2sgZGV2aWNlIGJhY2tlZCBmaWxlc3lzdGVtcworc3RhdGljIGxsaXN0X3QgKmdldF9ibG9ja19iYWNrZWRfZmlsZXN5c3RlbXModm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBmaWxlc3lzdGVtc1syXVtzaXplb2YoIi9wcm9jL2ZpbGVzeXN0ZW1zIildID0geworCQkiL2V0Yy9maWxlc3lzdGVtcyIsCisJCSIvcHJvYy9maWxlc3lzdGVtcyIsCisJfTsKKwljaGFyICpmcywgKmJ1ZjsKKwlsbGlzdF90ICpsaXN0ID0gTlVMTDsKKwlpbnQgaTsKKwlGSUxFICpmOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlmID0gZm9wZW5fZm9yX3JlYWQoZmlsZXN5c3RlbXNbaV0pOworCQlpZiAoIWYpIGNvbnRpbnVlOworCisJCXdoaWxlICgoYnVmID0geG1hbGxvY19mZ2V0bGluZShmKSkgIT0gTlVMTCkgeworCQkJaWYgKHN0cm5jbXAoYnVmLCAibm9kZXYiLCA1KSA9PSAwICYmIGlzc3BhY2UoYnVmWzVdKSkKKwkJCQljb250aW51ZTsKKwkJCWZzID0gc2tpcF93aGl0ZXNwYWNlKGJ1Zik7CisJCQlpZiAoKmZzID09ICcjJyB8fCAqZnMgPT0gJyonIHx8ICEqZnMpCisJCQkJY29udGludWU7CisKKwkJCWxsaXN0X2FkZF90b19lbmQoJmxpc3QsIHhzdHJkdXAoZnMpKTsKKwkJCWZyZWUoYnVmKTsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZjbG9zZShmKTsKKwl9CisKKwlyZXR1cm4gbGlzdDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCitzdGF0aWMgdm9pZCBkZWxldGVfYmxvY2tfYmFja2VkX2ZpbGVzeXN0ZW1zKHZvaWQpCit7CisJbGxpc3RfZnJlZShmc2xpc3QsIGZyZWUpOworfQorI2Vsc2UKK3ZvaWQgZGVsZXRlX2Jsb2NrX2JhY2tlZF9maWxlc3lzdGVtcyh2b2lkKTsKKyNlbmRpZgorCisvLyBQZXJmb3JtIGFjdHVhbCBtb3VudCBvZiBzcGVjaWZpYyBmaWxlc3lzdGVtIGF0IHNwZWNpZmljIGxvY2F0aW9uLgorLy8gTkI6IG1wLT54eHggZmllbGRzIG1heSBiZSB0cmFzaGVkIG9uIGV4aXQKK3N0YXRpYyBpbnQgbW91bnRfaXRfbm93KHN0cnVjdCBtbnRlbnQgKm1wLCBsb25nIHZmc2ZsYWdzLCBjaGFyICpmaWx0ZXJvcHRzKQoreworCWludCByYyA9IDA7CisKKwlpZiAoRkFLRV9JVCkgeworCQlpZiAodmVyYm9zZSA+PSAyKQorCQkJYmJfZXJyb3JfbXNnKCJ3b3VsZCBkbyBtb3VudCgnJXMnLCclcycsJyVzJywweCUwOGx4LCclcycpIiwKKwkJCQltcC0+bW50X2ZzbmFtZSwgbXAtPm1udF9kaXIsIG1wLT5tbnRfdHlwZSwKKwkJCQl2ZnNmbGFncywgZmlsdGVyb3B0cyk7CisJCWdvdG8gbXRhYjsKKwl9CisKKwkvLyBNb3VudCwgd2l0aCBmYWxsYmFjayB0byByZWFkLW9ubHkgaWYgbmVjZXNzYXJ5LgorCWZvciAoOzspIHsKKwkJZXJybm8gPSAwOworCQlyYyA9IHZlcmJvc2VfbW91bnQobXAtPm1udF9mc25hbWUsIG1wLT5tbnRfZGlyLCBtcC0+bW50X3R5cGUsCisJCQkJdmZzZmxhZ3MsIGZpbHRlcm9wdHMpOworCisJCS8vIElmIG1vdW50IGZhaWxlZCwgdHJ5CisJCS8vIGhlbHBlciBwcm9ncmFtIG1vdW50LjxtbnRfdHlwZT4KKwkJaWYgKEhFTFBFUlNfQUxMT1dFRCAmJiByYyAmJiBtcC0+bW50X3R5cGUpIHsKKwkJCWNoYXIgKmFyZ3NbOF07CisJCQlpbnQgZXJybm9fc2F2ZSA9IGVycm5vOworCQkJYXJnc1swXSA9IHhhc3ByaW50ZigibW91bnQuJXMiLCBtcC0+bW50X3R5cGUpOworCQkJcmMgPSAxOworCQkJaWYgKEZBS0VfSVQpCisJCQkJYXJnc1tyYysrXSA9IChjaGFyICopIi1mIjsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9NVEFCX1NVUFBPUlQgJiYgIVVTRV9NVEFCKQorCQkJCWFyZ3NbcmMrK10gPSAoY2hhciAqKSItbiI7CisJCQlhcmdzW3JjKytdID0gbXAtPm1udF9mc25hbWU7CisJCQlhcmdzW3JjKytdID0gbXAtPm1udF9kaXI7CisJCQlpZiAoZmlsdGVyb3B0cykgeworCQkJCWFyZ3NbcmMrK10gPSAoY2hhciAqKSItbyI7CisJCQkJYXJnc1tyYysrXSA9IGZpbHRlcm9wdHM7CisJCQl9CisJCQlhcmdzW3JjXSA9IE5VTEw7CisJCQlyYyA9IHNwYXduX2FuZF93YWl0KGFyZ3MpOworCQkJZnJlZShhcmdzWzBdKTsKKwkJCWlmICghcmMpCisJCQkJYnJlYWs7CisJCQllcnJubyA9IGVycm5vX3NhdmU7CisJCX0KKworCQlpZiAoIXJjIHx8ICh2ZnNmbGFncyAmIE1TX1JET05MWSkgfHwgKGVycm5vICE9IEVBQ0NFUyAmJiBlcnJubyAhPSBFUk9GUykpCisJCQlicmVhazsKKwkJaWYgKCEodmZzZmxhZ3MgJiBNU19TSUxFTlQpKQorCQkJYmJfZXJyb3JfbXNnKCIlcyBpcyB3cml0ZS1wcm90ZWN0ZWQsIG1vdW50aW5nIHJlYWQtb25seSIsCisJCQkJCQltcC0+bW50X2ZzbmFtZSk7CisJCXZmc2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9CisKKwkvLyBBYm9ydCBlbnRpcmVseSBpZiBwZXJtaXNzaW9uIGRlbmllZC4KKworCWlmIChyYyAmJiBlcnJubyA9PSBFUEVSTSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisKKwkvLyBJZiB0aGUgbW91bnQgd2FzIHN1Y2Nlc3NmdWwsIGFuZCB3ZSdyZSBtYWludGFpbmluZyBhbiBvbGQtc3R5bGUKKwkvLyBtdGFiIGZpbGUgYnkgaGFuZCwgYWRkIHRoZSBuZXcgZW50cnkgdG8gaXQgbm93LgorIG10YWI6CisJaWYgKFVTRV9NVEFCICYmICFyYyAmJiAhKHZmc2ZsYWdzICYgTVNfUkVNT1VOVCkpIHsKKwkJY2hhciAqZnNuYW1lOworCQlGSUxFICptb3VudFRhYmxlID0gc2V0bW50ZW50KGJiX3BhdGhfbXRhYl9maWxlLCAiYSsiKTsKKwkJY29uc3QgY2hhciAqb3B0aW9uX3N0ciA9IG1vdW50X29wdGlvbl9zdHI7CisJCWludCBpOworCisJCWlmICghbW91bnRUYWJsZSkgeworCQkJYmJfcGVycm9yX21zZyhiYl9wYXRoX210YWJfZmlsZSk7CisJCQlnb3RvIHJldDsKKwkJfQorCisJCS8vIEFkZCB2ZnMgc3RyaW5nIGZsYWdzCisJCWZvciAoaSA9IDA7IG1vdW50X29wdGlvbnNbaV0gIT0gTVNfUkVNT1VOVDsgaSsrKSB7CisJCQlpZiAobW91bnRfb3B0aW9uc1tpXSA+IDAgJiYgKG1vdW50X29wdGlvbnNbaV0gJiB2ZnNmbGFncykpCisJCQkJYXBwZW5kX21vdW50X29wdGlvbnMoJihtcC0+bW50X29wdHMpLCBvcHRpb25fc3RyKTsKKwkJCW9wdGlvbl9zdHIgKz0gc3RybGVuKG9wdGlvbl9zdHIpICsgMTsKKwkJfQorCisJCS8vIFJlbW92ZSB0cmFpbGluZyAvIChpZiBhbnkpIGZyb20gZGlyZWN0b3J5IHdlIG1vdW50ZWQgb24KKwkJaSA9IHN0cmxlbihtcC0+bW50X2RpcikgLSAxOworCQl3aGlsZSAoaSA+IDAgJiYgbXAtPm1udF9kaXJbaV0gPT0gJy8nKQorCQkJbXAtPm1udF9kaXJbaS0tXSA9ICdcMCc7CisKKwkJLy8gQ29udmVydCB0byBjYW5vbmljYWwgcGF0aG5hbWVzIGFzIG5lZWRlZAorCQltcC0+bW50X2RpciA9IGJiX3NpbXBsaWZ5X3BhdGgobXAtPm1udF9kaXIpOworCQlmc25hbWUgPSBOVUxMOworCQlpZiAoIW1wLT5tbnRfdHlwZSB8fCAhKm1wLT5tbnRfdHlwZSkgeyAvLyBiaW5kIG1vdW50CisJCQltcC0+bW50X2ZzbmFtZSA9IGZzbmFtZSA9IGJiX3NpbXBsaWZ5X3BhdGgobXAtPm1udF9mc25hbWUpOworCQkJbXAtPm1udF90eXBlID0gKGNoYXIqKSJiaW5kIjsKKwkJfQorCQltcC0+bW50X2ZyZXEgPSBtcC0+bW50X3Bhc3NubyA9IDA7CisKKwkJLy8gV3JpdGUgYW5kIGNsb3NlCisjaWYgRU5BQkxFX0ZFQVRVUkVfTVRBQl9TVVBQT1JUCisJCWlmICh2ZnNmbGFncyAmIE1TX01PVkUpCisJCQl1cGRhdGVfbXRhYl9lbnRyeV9vbl9tb3ZlKG1wKTsKKwkJZWxzZQorI2VuZGlmCisJCQlhZGRtbnRlbnQobW91bnRUYWJsZSwgbXApOworCQllbmRtbnRlbnQobW91bnRUYWJsZSk7CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCQlmcmVlKG1wLT5tbnRfZGlyKTsKKwkJCWZyZWUoZnNuYW1lKTsKKwkJfQorCX0KKyByZXQ6CisJcmV0dXJuIHJjOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTCisKKy8qCisgKiBMaW51eCBORlMgbW91bnQKKyAqIENvcHlyaWdodCAoQykgMTk5MyBSaWNrIFNsYWRrZXkgPGpyc0B3b3JsZC5zdGQuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogV2VkIEZlYiAgOCAxMjo1MTo0OCAxOTk1LCBiaXJvQHlnZ2RyYXNpbC5jb20gKFJvc3MgQmlybyk6IGFsbG93IGFsbCBwb3J0CisgKiBudW1iZXJzIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIEZyaSwgOCBNYXIgMTk5NiAxODowMTozOSwgU3dlbiBUaHVlbW1sZXIgPHN3ZW5AdW5pLXBhZGVyYm9ybi5kZT46CisgKiBPbWl0IHRoZSBjYWxsIHRvIGNvbm5lY3QoKSBmb3IgTGludXggdmVyc2lvbiAxLjMuMTEgb3IgbGF0ZXIuCisgKgorICogV2VkIE9jdCAgMSAyMzo1NToyOCAxOTk3OiBEaWNrIFN0cmVlZmxhbmQgPGRpY2tfc3RyZWVmbGFuZEB0YXNraW5nLmNvbT4KKyAqIEltcGxlbWVudGVkIHRoZSAiYmciLCAiZmciIGFuZCAicmV0cnkiIG1vdW50IG9wdGlvbnMgZm9yIE5GUy4KKyAqCisgKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNaWNraWV3aWN6IDxtaXNpZWtAbWlzaWVrLmV1Lm9yZz4KKyAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyAqCisgKiBNb2RpZmllZCBieSBPbGFmIEtpcmNoIGFuZCBUcm9uZCBNeWtsZWJ1c3QgZm9yIG5ldyBORlMgY29kZSwKKyAqIHBsdXMgTkZTdjMgc3R1ZmYuCisgKi8KKworI2RlZmluZSBNT1VOVFBPUlQgNjM1CisjZGVmaW5lIE1OVFBBVEhMRU4gMTAyNAorI2RlZmluZSBNTlROQU1MRU4gMjU1CisjZGVmaW5lIEZIU0laRSAzMgorI2RlZmluZSBGSFNJWkUzIDY0CisKK3R5cGVkZWYgY2hhciBmaGFuZGxlW0ZIU0laRV07CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZmhhbmRsZTNfbGVuOworCWNoYXIgKmZoYW5kbGUzX3ZhbDsKK30gZmhhbmRsZTM7CisKK2VudW0gbW91bnRzdGF0MyB7CisJTU5UX09LID0gMCwKKwlNTlQzRVJSX1BFUk0gPSAxLAorCU1OVDNFUlJfTk9FTlQgPSAyLAorCU1OVDNFUlJfSU8gPSA1LAorCU1OVDNFUlJfQUNDRVMgPSAxMywKKwlNTlQzRVJSX05PVERJUiA9IDIwLAorCU1OVDNFUlJfSU5WQUwgPSAyMiwKKwlNTlQzRVJSX05BTUVUT09MT05HID0gNjMsCisJTU5UM0VSUl9OT1RTVVBQID0gMTAwMDQsCisJTU5UM0VSUl9TRVJWRVJGQVVMVCA9IDEwMDA2LAorfTsKK3R5cGVkZWYgZW51bSBtb3VudHN0YXQzIG1vdW50c3RhdDM7CisKK3N0cnVjdCBmaHN0YXR1cyB7CisJdW5zaWduZWQgaW50IGZoc19zdGF0dXM7CisJdW5pb24geworCQlmaGFuZGxlIGZoc19maGFuZGxlOworCX0gZmhzdGF0dXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBmaHN0YXR1cyBmaHN0YXR1czsKKworc3RydWN0IG1vdW50cmVzM19vayB7CisJZmhhbmRsZTMgZmhhbmRsZTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgYXV0aF9mbGF2b3Vyc19sZW47CisJCWNoYXIgKmF1dGhfZmxhdm91cnNfdmFsOworCX0gYXV0aF9mbGF2b3VyczsKK307Cit0eXBlZGVmIHN0cnVjdCBtb3VudHJlczNfb2sgbW91bnRyZXMzX29rOworCitzdHJ1Y3QgbW91bnRyZXMzIHsKKwltb3VudHN0YXQzIGZoc19zdGF0dXM7CisJdW5pb24geworCQltb3VudHJlczNfb2sgbW91bnRpbmZvOworCX0gbW91bnRyZXMzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW91bnRyZXMzIG1vdW50cmVzMzsKKwordHlwZWRlZiBjaGFyICpkaXJwYXRoOworCit0eXBlZGVmIGNoYXIgKm5hbWU7CisKK3R5cGVkZWYgc3RydWN0IG1vdW50Ym9keSAqbW91bnRsaXN0OworCitzdHJ1Y3QgbW91bnRib2R5IHsKKwluYW1lIG1sX2hvc3RuYW1lOworCWRpcnBhdGggbWxfZGlyZWN0b3J5OworCW1vdW50bGlzdCBtbF9uZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IG1vdW50Ym9keSBtb3VudGJvZHk7CisKK3R5cGVkZWYgc3RydWN0IGdyb3Vwbm9kZSAqZ3JvdXBzOworCitzdHJ1Y3QgZ3JvdXBub2RlIHsKKwluYW1lIGdyX25hbWU7CisJZ3JvdXBzIGdyX25leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBub2RlIGdyb3Vwbm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgZXhwb3J0bm9kZSAqZXhwb3J0czsKKworc3RydWN0IGV4cG9ydG5vZGUgeworCWRpcnBhdGggZXhfZGlyOworCWdyb3VwcyBleF9ncm91cHM7CisJZXhwb3J0cyBleF9uZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IGV4cG9ydG5vZGUgZXhwb3J0bm9kZTsKKworc3RydWN0IHBwYXRoY25mIHsKKwlpbnQgcGNfbGlua19tYXg7CisJc2hvcnQgcGNfbWF4X2Nhbm9uOworCXNob3J0IHBjX21heF9pbnB1dDsKKwlzaG9ydCBwY19uYW1lX21heDsKKwlzaG9ydCBwY19wYXRoX21heDsKKwlzaG9ydCBwY19waXBlX2J1ZjsKKwl1aW50OF90IHBjX3ZkaXNhYmxlOworCWNoYXIgcGNfeHh4OworCXNob3J0IHBjX21hc2tbMl07Cit9OwordHlwZWRlZiBzdHJ1Y3QgcHBhdGhjbmYgcHBhdGhjbmY7CisKKyNkZWZpbmUgTU9VTlRQUk9HIDEwMDAwNQorI2RlZmluZSBNT1VOVFZFUlMgMQorCisjZGVmaW5lIE1PVU5UUFJPQ19OVUxMIDAKKyNkZWZpbmUgTU9VTlRQUk9DX01OVCAxCisjZGVmaW5lIE1PVU5UUFJPQ19EVU1QIDIKKyNkZWZpbmUgTU9VTlRQUk9DX1VNTlQgMworI2RlZmluZSBNT1VOVFBST0NfVU1OVEFMTCA0CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlQgNQorI2RlZmluZSBNT1VOVFBST0NfRVhQT1JUQUxMIDYKKworI2RlZmluZSBNT1VOVFZFUlNfUE9TSVggMgorCisjZGVmaW5lIE1PVU5UUFJPQ19QQVRIQ09ORiA3CisKKyNkZWZpbmUgTU9VTlRfVjMgMworCisjZGVmaW5lIE1PVU5UUFJPQzNfTlVMTCAwCisjZGVmaW5lIE1PVU5UUFJPQzNfTU5UIDEKKyNkZWZpbmUgTU9VTlRQUk9DM19EVU1QIDIKKyNkZWZpbmUgTU9VTlRQUk9DM19VTU5UIDMKKyNkZWZpbmUgTU9VTlRQUk9DM19VTU5UQUxMIDQKKyNkZWZpbmUgTU9VTlRQUk9DM19FWFBPUlQgNQorCitlbnVtIHsKKyNpZm5kZWYgTkZTX0ZIU0laRQorCU5GU19GSFNJWkUgPSAzMiwKKyNlbmRpZgorI2lmbmRlZiBORlNfUE9SVAorCU5GU19QT1JUID0gMjA0OQorI2VuZGlmCit9OworCisvKgorICogV2Ugd2FudCB0byBiZSBhYmxlIHRvIGNvbXBpbGUgbW91bnQgb24gb2xkIGtlcm5lbHMgaW4gc3VjaCBhIHdheQorICogdGhhdCB0aGUgYmluYXJ5IHdpbGwgd29yayB3ZWxsIG9uIG1vcmUgcmVjZW50IGtlcm5lbHMuCisgKiBUaHVzLCBpZiBuZWNlc3Nhcnkgd2UgdGVhY2ggbmZzbW91bnQuYyB0aGUgc3RydWN0dXJlIG9mIG5ldyBmaWVsZHMKKyAqIHRoYXQgd2lsbCBjb21lIGxhdGVyLgorICoKKyAqIE1vcmVvdmVyLCB0aGUgbmV3IGtlcm5lbCBpbmNsdWRlcyBjb25mbGljdCB3aXRoIGdsaWJjIGluY2x1ZGVzCisgKiBzbyBpdCBpcyBlYXNpZXN0IHRvIGlnbm9yZSB0aGUga2VybmVsIGFsdG9nZXRoZXIgKGF0IGNvbXBpbGUgdGltZSkuCisgKi8KKworc3RydWN0IG5mczJfZmggeworCWNoYXIgICAgICAgICAgICAgICAgICAgIGRhdGFbMzJdOworfTsKK3N0cnVjdCBuZnMzX2ZoIHsKKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICBzaXplOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGRhdGFbNjRdOworfTsKKworc3RydWN0IG5mc19tb3VudF9kYXRhIHsKKwlpbnQJCXZlcnNpb247CQkvKiAxICovCisJaW50CQlmZDsJCQkvKiAxICovCisJc3RydWN0IG5mczJfZmgJb2xkX3Jvb3Q7CQkvKiAxICovCisJaW50CQlmbGFnczsJCQkvKiAxICovCisJaW50CQlyc2l6ZTsJCQkvKiAxICovCisJaW50CQl3c2l6ZTsJCQkvKiAxICovCisJaW50CQl0aW1lbzsJCQkvKiAxICovCisJaW50CQlyZXRyYW5zOwkJLyogMSAqLworCWludAkJYWNyZWdtaW47CQkvKiAxICovCisJaW50CQlhY3JlZ21heDsJCS8qIDEgKi8KKwlpbnQJCWFjZGlybWluOwkJLyogMSAqLworCWludAkJYWNkaXJtYXg7CQkvKiAxICovCisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CQkvKiAxICovCisJY2hhcgkJaG9zdG5hbWVbMjU2XTsJCS8qIDEgKi8KKwlpbnQJCW5hbWxlbjsJCQkvKiAyICovCisJdW5zaWduZWQgaW50CWJzaXplOwkJCS8qIDMgKi8KKwlzdHJ1Y3QgbmZzM19maAlyb290OwkJCS8qIDQgKi8KK307CisKKy8qIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkICovCitlbnVtIHsKKwlORlNfTU9VTlRfU09GVCA9IDB4MDAwMSwJLyogMSAqLworCU5GU19NT1VOVF9JTlRSID0gMHgwMDAyLAkvKiAxICovCisJTkZTX01PVU5UX1NFQ1VSRSA9IDB4MDAwNCwJLyogMSAqLworCU5GU19NT1VOVF9QT1NJWCA9IDB4MDAwOCwJLyogMSAqLworCU5GU19NT1VOVF9OT0NUTyA9IDB4MDAxMCwJLyogMSAqLworCU5GU19NT1VOVF9OT0FDID0gMHgwMDIwLAkvKiAxICovCisJTkZTX01PVU5UX1RDUCA9IDB4MDA0MCwJCS8qIDIgKi8KKwlORlNfTU9VTlRfVkVSMyA9IDB4MDA4MCwJLyogMyAqLworCU5GU19NT1VOVF9LRVJCRVJPUyA9IDB4MDEwMCwJLyogMyAqLworCU5GU19NT1VOVF9OT05MTSA9IDB4MDIwMCwJLyogMyAqLworCU5GU19NT1VOVF9OT1JESVJQTFVTID0gMHg0MDAwCit9OworCisKKy8qCisgKiBXZSBuZWVkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlcyBhbmQKKyAqIHRoZSBsb2NhbCBlcnJubyB2YWx1ZXMgd2hpY2ggbWF5IG5vdCBiZSB0aGUgc2FtZS4KKyAqCisgKiBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQExTNS5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46IGNoYW5nZSBlcnJubzoKKyAqICJhZnRlciAjaW5jbHVkZSA8ZXJybm8uaD4gdGhlIHN5bWJvbCBlcnJubyBpcyByZXNlcnZlZCBmb3IgYW55IHVzZSwKKyAqICBpdCBjYW5ub3QgZXZlbiBiZSB1c2VkIGFzIGEgc3RydWN0IHRhZyBvciBmaWVsZCBuYW1lIi4KKyAqLworI2lmbmRlZiBFRFFVT1QKKyMgZGVmaW5lIEVEUVVPVCBFTk9TUEMKKyNlbmRpZgorLyogQ29udmVydCBlYWNoIE5GU0VSUl9CTEFIIGludG8gRUJMQUggKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IG5mc19lcnJfc3RhdFtdID0geworCSAxLCAgMiwgIDUsICA2LCAxMywgMTcsCisJMTksIDIwLCAyMSwgMjIsIDI3LCAyOCwKKwkzMCwgNjMsIDY2LCA2OSwgNzAsIDcxCit9OworI2lmICggXAorCUVQRVJNIHwgRU5PRU5UICAgICAgfCBFSU8gICAgICB8IEVOWElPIHwgRUFDQ0VTfCBFRVhJU1QgfCBcCisJRU5PREVWfCBFTk9URElSICAgICB8IEVJU0RJUiAgIHwgRUlOVkFMfCBFRkJJRyB8IEVOT1NQQyB8IFwKKwlFUk9GUyB8IEVOQU1FVE9PTE9OR3wgRU5PVEVNUFRZfCBFRFFVT1R8IEVTVEFMRXwgRVJFTU9URSkgPCAyNTYKK3R5cGVkZWYgdWludDhfdCBuZnNfZXJyX3R5cGU7CisjZWxzZQordHlwZWRlZiB1aW50MTZfdCBuZnNfZXJyX3R5cGU7CisjZW5kaWYKK3N0YXRpYyBjb25zdCBuZnNfZXJyX3R5cGUgbmZzX2Vycl9lcnJudW1bXSA9IHsKKwlFUEVSTSAsIEVOT0VOVCAgICAgICwgRUlPICAgICAgLCBFTlhJTyAsIEVBQ0NFUywgRUVYSVNULAorCUVOT0RFViwgRU5PVERJUiAgICAgLCBFSVNESVIgICAsIEVJTlZBTCwgRUZCSUcgLCBFTk9TUEMsCisJRVJPRlMgLCBFTkFNRVRPT0xPTkcsIEVOT1RFTVBUWSwgRURRVU9ULCBFU1RBTEUsIEVSRU1PVEUKK307CitzdGF0aWMgY2hhciAqbmZzX3N0cmVycm9yKGludCBzdGF0dXMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuZnNfZXJyX3N0YXQpOyBpKyspIHsKKwkJaWYgKG5mc19lcnJfc3RhdFtpXSA9PSBzdGF0dXMpCisJCQlyZXR1cm4gc3RyZXJyb3IobmZzX2Vycl9lcnJudW1baV0pOworCX0KKwlyZXR1cm4geGFzcHJpbnRmKCJ1bmtub3duIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlOiAlZCIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBib29sX3QgeGRyX2ZoYW5kbGUoWERSICp4ZHJzLCBmaGFuZGxlIG9ianApCit7CisJcmV0dXJuIHhkcl9vcGFxdWUoeGRycywgb2JqcCwgRkhTSVpFKTsKK30KKworc3RhdGljIGJvb2xfdCB4ZHJfZmhzdGF0dXMoWERSICp4ZHJzLCBmaHN0YXR1cyAqb2JqcCkKK3sKKwlpZiAoIXhkcl91X2ludCh4ZHJzLCAmb2JqcC0+ZmhzX3N0YXR1cykpCisJCSByZXR1cm4gRkFMU0U7CisJaWYgKG9ianAtPmZoc19zdGF0dXMgPT0gMCkKKwkJcmV0dXJuIHhkcl9maGFuZGxlKHhkcnMsIG9ianAtPmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgYm9vbF90IHhkcl9kaXJwYXRoKFhEUiAqeGRycywgZGlycGF0aCAqb2JqcCkKK3sKKwlyZXR1cm4geGRyX3N0cmluZyh4ZHJzLCBvYmpwLCBNTlRQQVRITEVOKTsKK30KKworc3RhdGljIGJvb2xfdCB4ZHJfZmhhbmRsZTMoWERSICp4ZHJzLCBmaGFuZGxlMyAqb2JqcCkKK3sKKwlyZXR1cm4geGRyX2J5dGVzKHhkcnMsIChjaGFyICoqKSZvYmpwLT5maGFuZGxlM192YWwsCisJCQkgICAodW5zaWduZWQgaW50ICopICZvYmpwLT5maGFuZGxlM19sZW4sCisJCQkgICBGSFNJWkUzKTsKK30KKworc3RhdGljIGJvb2xfdCB4ZHJfbW91bnRyZXMzX29rKFhEUiAqeGRycywgbW91bnRyZXMzX29rICpvYmpwKQoreworCWlmICgheGRyX2ZoYW5kbGUzKHhkcnMsICZvYmpwLT5maGFuZGxlKSkKKwkJcmV0dXJuIEZBTFNFOworCXJldHVybiB4ZHJfYXJyYXkoeGRycywgJihvYmpwLT5hdXRoX2ZsYXZvdXJzLmF1dGhfZmxhdm91cnNfdmFsKSwKKwkJCSAgICYob2JqcC0+YXV0aF9mbGF2b3Vycy5hdXRoX2ZsYXZvdXJzX2xlbiksCisJCQkgICB+MCwKKwkJCSAgIHNpemVvZihpbnQpLAorCQkJICAgKHhkcnByb2NfdCkgeGRyX2ludCk7Cit9CisKK3N0YXRpYyBib29sX3QgeGRyX21vdW50c3RhdDMoWERSICp4ZHJzLCBtb3VudHN0YXQzICpvYmpwKQoreworCXJldHVybiB4ZHJfZW51bSh4ZHJzLCAoZW51bV90ICopIG9ianApOworfQorCitzdGF0aWMgYm9vbF90IHhkcl9tb3VudHJlczMoWERSICp4ZHJzLCBtb3VudHJlczMgKm9ianApCit7CisJaWYgKCF4ZHJfbW91bnRzdGF0Myh4ZHJzLCAmb2JqcC0+ZmhzX3N0YXR1cykpCisJCXJldHVybiBGQUxTRTsKKwlpZiAob2JqcC0+ZmhzX3N0YXR1cyA9PSBNTlRfT0spCisJCXJldHVybiB4ZHJfbW91bnRyZXMzX29rKHhkcnMsICZvYmpwLT5tb3VudHJlczNfdS5tb3VudGluZm8pOworCXJldHVybiBUUlVFOworfQorCisjZGVmaW5lIE1BWF9ORlNQUk9UICgobmZzX21vdW50X3ZlcnNpb24gPj0gNCkgPyAzIDogMikKKworLyoKKyAqIFVuZm9ydHVuYXRlbHksIHRoZSBrZXJuZWwgcHJpbnRzIGFubm95aW5nIGNvbnNvbGUgbWVzc2FnZXMKKyAqIGluIGNhc2Ugb2YgYW4gdW5leHBlY3RlZCBuZnMgbW91bnQgdmVyc2lvbiAoaW5zdGVhZCBvZgorICoganVzdCByZXR1cm5pbmcgc29tZSBlcnJvcikuICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSB0byB0cnkKKyAqIGFuZCBmaWd1cmUgb3V0IHdoYXQgdmVyc2lvbiB0aGUga2VybmVsIGV4cGVjdHMuCisgKgorICogVmFyaWFibGVzOgorICoJS0VSTkVMX05GU19NT1VOVF9WRVJTSU9OOiBrZXJuZWwgc291cmNlcyBhdCBjb21waWxlIHRpbWUKKyAqCU5GU19NT1VOVF9WRVJTSU9OOiB0aGVzZSBuZnNtb3VudCBzb3VyY2VzIGF0IGNvbXBpbGUgdGltZQorICoJbmZzX21vdW50X3ZlcnNpb246IHZlcnNpb24gdGhpcyBzb3VyY2UgYW5kIHJ1bm5pbmcga2VybmVsIGNhbiBoYW5kbGUKKyAqLworc3RhdGljIHZvaWQKK2ZpbmRfa2VybmVsX25mc19tb3VudF92ZXJzaW9uKHZvaWQpCit7CisJaW50IGtlcm5lbF92ZXJzaW9uOworCisJaWYgKG5mc19tb3VudF92ZXJzaW9uKQorCQlyZXR1cm47CisKKwluZnNfbW91bnRfdmVyc2lvbiA9IDQ7IC8qIGRlZmF1bHQgKi8KKworCWtlcm5lbF92ZXJzaW9uID0gZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpOworCWlmIChrZXJuZWxfdmVyc2lvbikgeworCQlpZiAoa2VybmVsX3ZlcnNpb24gPCBLRVJORUxfVkVSU0lPTigyLDIsMTgpKQorCQkJbmZzX21vdW50X3ZlcnNpb24gPSAzOworCQkvKiBlbHNlIHY0IHNpbmNlIDIuMy45OXByZTQgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfbW91bnRwb3J0KHN0cnVjdCBwbWFwICpwbV9tbnQsCisJc3RydWN0IHNvY2thZGRyX2luICpzZXJ2ZXJfYWRkciwKKwlsb25nIHVuc2lnbmVkIHByb2csCisJbG9uZyB1bnNpZ25lZCB2ZXJzaW9uLAorCWxvbmcgdW5zaWduZWQgcHJvdG8sCisJbG9uZyB1bnNpZ25lZCBwb3J0KQoreworCXN0cnVjdCBwbWFwbGlzdCAqcG1hcDsKKworCXNlcnZlcl9hZGRyLT5zaW5fcG9ydCA9IFBNQVBQT1JUOworLyogZ2xpYmMgMi40IChzdGlsbCkgaGFzIHBtYXBfZ2V0bWFwcyhzdHJ1Y3Qgc29ja2FkZHJfaW4gKikuCisgKiBJIHVuZGVyc3RhbmQgaXQgbGlrZSAiSVB2NiBmb3IgdGhpcyBpcyBub3QgMTAwJSByZWFkeSIgKi8KKwlwbWFwID0gcG1hcF9nZXRtYXBzKHNlcnZlcl9hZGRyKTsKKworCWlmICh2ZXJzaW9uID4gTUFYX05GU1BST1QpCisJCXZlcnNpb24gPSBNQVhfTkZTUFJPVDsKKwlpZiAoIXByb2cpCisJCXByb2cgPSBNT1VOVFBST0c7CisJcG1fbW50LT5wbV9wcm9nID0gcHJvZzsKKwlwbV9tbnQtPnBtX3ZlcnMgPSB2ZXJzaW9uOworCXBtX21udC0+cG1fcHJvdCA9IHByb3RvOworCXBtX21udC0+cG1fcG9ydCA9IHBvcnQ7CisKKwl3aGlsZSAocG1hcCkgeworCQlpZiAocG1hcC0+cG1sX21hcC5wbV9wcm9nICE9IHByb2cpCisJCQlnb3RvIG5leHQ7CisJCWlmICghdmVyc2lvbiAmJiBwbV9tbnQtPnBtX3ZlcnMgPiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMpCisJCQlnb3RvIG5leHQ7CisJCWlmICh2ZXJzaW9uID4gMiAmJiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgIT0gdmVyc2lvbikKKwkJCWdvdG8gbmV4dDsKKwkJaWYgKHZlcnNpb24gJiYgdmVyc2lvbiA8PSAyICYmIHBtYXAtPnBtbF9tYXAucG1fdmVycyA+IDIpCisJCQlnb3RvIG5leHQ7CisJCWlmIChwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgPiBNQVhfTkZTUFJPVAorCQkgfHwgKHByb3RvICYmIHBtX21udC0+cG1fcHJvdCAmJiBwbWFwLT5wbWxfbWFwLnBtX3Byb3QgIT0gcHJvdG8pCisJCSB8fCAocG9ydCAmJiBwbWFwLT5wbWxfbWFwLnBtX3BvcnQgIT0gcG9ydCkKKwkJKSB7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJbWVtY3B5KHBtX21udCwgJnBtYXAtPnBtbF9tYXAsIHNpemVvZigqcG1fbW50KSk7CisgbmV4dDoKKwkJcG1hcCA9IHBtYXAtPnBtbF9uZXh0OworCX0KKwlpZiAoIXBtX21udC0+cG1fdmVycykKKwkJcG1fbW50LT5wbV92ZXJzID0gTU9VTlRWRVJTOworCWlmICghcG1fbW50LT5wbV9wb3J0KQorCQlwbV9tbnQtPnBtX3BvcnQgPSBNT1VOVFBPUlQ7CisJaWYgKCFwbV9tbnQtPnBtX3Byb3QpCisJCXBtX21udC0+cG1fcHJvdCA9IElQUFJPVE9fVENQOworfQorCisjaWYgQkJfTU1VCitzdGF0aWMgaW50IGRhZW1vbml6ZSh2b2lkKQoreworCWludCBwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIC8qIGVycm9yICovCisJCXJldHVybiAtZXJybm87CisJaWYgKHBpZCA+IDApIC8qIHBhcmVudCAqLworCQlyZXR1cm4gMDsKKwkvKiBjaGlsZCAqLworCWNsb3NlKDApOworCXhvcGVuKGJiX2Rldl9udWxsLCBPX1JEV1IpOworCXhkdXAyKDAsIDEpOworCXhkdXAyKDAsIDIpOworCXNldHNpZCgpOworCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQsIExPR19EQUVNT04pOworCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwlyZXR1cm4gMTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBkYWVtb25pemUodm9pZCkgeyByZXR1cm4gLUVOT1NZUzsgfQorI2VuZGlmCisKKy8qIFRPRE8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHdlX3Nhd190aGlzX2hvc3RfYmVmb3JlKGNvbnN0IGNoYXIgKmhvc3RuYW1lIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogUlBDIHN0cmVycm9yIGFuYWxvZ3MgYXJlIHRlcm1pbmFsbHkgaWRpb3RpYzoKKyAqICptYW5kYXRvcnkqIHByZWZpeCBhbmQgXG4gYXQgZW5kLgorICogVGhpcyBob3BlZnVsbHkgaGVscHMuIFVzYWdlOgorICogZXJyb3JfbXNnX3JwYyhjbG50XyplcnJvciooIiAiKSkgKi8KK3N0YXRpYyB2b2lkIGVycm9yX21zZ19ycGMoY29uc3QgY2hhciAqbXNnKQoreworCWludCBsZW47CisJd2hpbGUgKG1zZ1swXSA9PSAnICcgfHwgbXNnWzBdID09ICc6JykgbXNnKys7CisJbGVuID0gc3RybGVuKG1zZyk7CisJd2hpbGUgKGxlbiAmJiBtc2dbbGVuLTFdID09ICdcbicpIGxlbi0tOworCWJiX2Vycm9yX21zZygiJS4qcyIsIGxlbiwgbXNnKTsKK30KKworLyogTkI6IG1wLT54eHggZmllbGRzIG1heSBiZSB0cmFzaGVkIG9uIGV4aXQgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgbmZzbW91bnQoc3RydWN0IG1udGVudCAqbXAsIGxvbmcgdmZzZmxhZ3MsIGNoYXIgKmZpbHRlcm9wdHMpCit7CisJQ0xJRU5UICptY2xpZW50OworCWNoYXIgKmhvc3RuYW1lOworCWNoYXIgKnBhdGhuYW1lOworCWNoYXIgKm1vdW50aG9zdDsKKwkvKiBwcmlvciB0byAyLjYuMjMsIGtlcm5lbCB0b29rIE5GUyBvcHRpb25zIGluIGEgZm9ybSBvZiB0aGlzIHN0cnVjdAorCSAqIG9ubHkuIDIuNi4yMysgbG9va3MgYXQgZGF0YS0+dmVyc2lvbiwgYW5kIGlmIGl0J3Mgbm90IDEuLjYsCisJICogdGhlbiBkYXRhIHBvaW50ZXIgaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcuICovCisJc3RydWN0IG5mc19tb3VudF9kYXRhIGRhdGE7CisJY2hhciAqb3B0OworCXN0cnVjdCBob3N0ZW50ICpocDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7CisJc3RydWN0IHNvY2thZGRyX2luIG1vdW50X3NlcnZlcl9hZGRyOworCWludCBtc29jaywgZnNvY2s7CisJdW5pb24geworCQlzdHJ1Y3QgZmhzdGF0dXMgbmZzdjI7CisJCXN0cnVjdCBtb3VudHJlczMgbmZzdjM7CisJfSBzdGF0dXM7CisJaW50IGRhZW1vbml6ZWQ7CisJY2hhciAqczsKKwlpbnQgcG9ydDsKKwlpbnQgbW91bnRwb3J0OworCWludCBwcm90bzsKKyNpZiBCQl9NTVUKKwlzbWFsbGludCBiZyA9IDA7CisjZWxzZQorCWVudW0geyBiZyA9IDAgfTsKKyNlbmRpZgorCWludCByZXRyeTsKKwlpbnQgbW91bnRwcm9nOworCWludCBtb3VudHZlcnM7CisJaW50IG5mc3Byb2c7CisJaW50IG5mc3ZlcnM7CisJaW50IHJldHZhbDsKKwkvKiB0aGVzZSBhbGwgYXJlIG9uZS1iaXQgcmVhbGx5LiBnY2MgNC4zLjEgbGlrZXMgdGhpcyBjb21iaW5hdGlvbjogKi8KKwlzbWFsbGludCB0Y3A7CisJc21hbGxpbnQgc29mdDsKKwlpbnQgaW50cjsKKwlpbnQgcG9zaXg7CisJaW50IG5vY3RvOworCWludCBub2FjOworCWludCBub3JkaXJwbHVzOworCWludCBub2xvY2s7CisKKwlmaW5kX2tlcm5lbF9uZnNfbW91bnRfdmVyc2lvbigpOworCisJZGFlbW9uaXplZCA9IDA7CisJbW91bnRob3N0ID0gTlVMTDsKKwlyZXR2YWwgPSBFVElNRURPVVQ7CisJbXNvY2sgPSBmc29jayA9IC0xOworCW1jbGllbnQgPSBOVUxMOworCisJLyogTkI6IGhvc3RuYW1lLCBtb3VudGhvc3QsIGZpbHRlcm9wdHMgbXVzdCBiZSBmcmVlKClkIHByaW9yIHRvIHJldHVybiAqLworCisJZmlsdGVyb3B0cyA9IHhzdHJkdXAoZmlsdGVyb3B0cyk7IC8qIGdvaW5nIHRvIHRyYXNoIGl0IGxhdGVyLi4uICovCisKKwlob3N0bmFtZSA9IHhzdHJkdXAobXAtPm1udF9mc25hbWUpOworCS8qIG1vdW50X21haW4oKSBndWFyYW50ZWVzIHRoYXQgJzonIGlzIHRoZXJlICovCisJcyA9IHN0cmNocihob3N0bmFtZSwgJzonKTsKKwlwYXRobmFtZSA9IHMgKyAxOworCSpzID0gJ1wwJzsKKwkvKiBJZ25vcmUgYWxsIGJ1dCBmaXJzdCBob3N0bmFtZSBpbiByZXBsaWNhdGVkIG1vdW50cworCSAgIHVudGlsIHRoZXkgY2FuIGJlIGZ1bGx5IHN1cHBvcnRlZC4gKG1hY2tAc2dpLmNvbSkgKi8KKwlzID0gc3RyY2hyKGhvc3RuYW1lLCAnLCcpOworCWlmIChzKSB7CisJCSpzID0gJ1wwJzsKKwkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBtdWx0aXBsZSBob3N0bmFtZXMgbm90IHN1cHBvcnRlZCIpOworCX0KKworCXNlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWlmICghaW5ldF9hdG9uKGhvc3RuYW1lLCAmc2VydmVyX2FkZHIuc2luX2FkZHIpKSB7CisJCWhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7CisJCWlmIChocCA9PSBOVUxMKSB7CisJCQliYl9oZXJyb3JfbXNnKCIlcyIsIGhvc3RuYW1lKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAoaHAtPmhfbGVuZ3RoICE9IChpbnQpc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm9ubHkgSVB2NCBpcyBzdXBwb3J0ZWQiKTsKKwkJfQorCQltZW1jcHkoJnNlcnZlcl9hZGRyLnNpbl9hZGRyLCBocC0+aF9hZGRyX2xpc3RbMF0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCX0KKworCW1lbWNweSgmbW91bnRfc2VydmVyX2FkZHIsICZzZXJ2ZXJfYWRkciwgc2l6ZW9mKG1vdW50X3NlcnZlcl9hZGRyKSk7CisKKwkvKiBhZGQgSVAgYWRkcmVzcyB0byBtdGFiIG9wdGlvbnMgZm9yIHVzZSB3aGVuIHVubW91bnRpbmcgKi8KKworCWlmICghbXAtPm1udF9vcHRzKSB7IC8qIFRPRE86IGFjdHVhbGx5IG1wLT5tbnRfb3B0cyBpcyBuZXZlciBOVUxMICovCisJCW1wLT5tbnRfb3B0cyA9IHhhc3ByaW50ZigiYWRkcj0lcyIsIGluZXRfbnRvYShzZXJ2ZXJfYWRkci5zaW5fYWRkcikpOworCX0gZWxzZSB7CisJCWNoYXIgKnRtcCA9IHhhc3ByaW50ZigiJXMlc2FkZHI9JXMiLCBtcC0+bW50X29wdHMsCisJCQkJCW1wLT5tbnRfb3B0c1swXSA/ICIsIiA6ICIiLAorCQkJCQlpbmV0X250b2Eoc2VydmVyX2FkZHIuc2luX2FkZHIpKTsKKwkJZnJlZShtcC0+bW50X29wdHMpOworCQltcC0+bW50X29wdHMgPSB0bXA7CisJfQorCisJLyogU2V0IGRlZmF1bHQgb3B0aW9ucy4KKwkgKiByc2l6ZS93c2l6ZSAoYW5kIGJzaXplLCBmb3IgdmVyID49IDMpIGFyZSBsZWZ0IDAgaW4gb3JkZXIgdG8KKwkgKiBsZXQgdGhlIGtlcm5lbCBkZWNpZGUuCisJICogdGltZW8gaXMgZmlsbGVkIGluIGFmdGVyIHdlIGtub3cgd2hldGhlciBpdCdsbCBiZSBUQ1Agb3IgVURQLiAqLworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlkYXRhLnJldHJhbnMgID0gMzsKKwlkYXRhLmFjcmVnbWluID0gMzsKKwlkYXRhLmFjcmVnbWF4ID0gNjA7CisJZGF0YS5hY2Rpcm1pbiA9IDMwOworCWRhdGEuYWNkaXJtYXggPSA2MDsKKwlkYXRhLm5hbWxlbiAgID0gTkFNRV9NQVg7CisKKwlzb2Z0ID0gMDsKKwlpbnRyID0gMDsKKwlwb3NpeCA9IDA7CisJbm9jdG8gPSAwOworCW5vbG9jayA9IDA7CisJbm9hYyA9IDA7CisJbm9yZGlycGx1cyA9IDA7CisJcmV0cnkgPSAxMDAwMDsJCS8qIDEwMDAwIG1pbnV0ZXMgfiAxIHdlZWsgKi8KKwl0Y3AgPSAxOwkJCS8qIG5mcy11dGlscyB1c2VzIHRjcCBwZXIgZGVmYXVsdCAqLworCisJbW91bnRwcm9nID0gTU9VTlRQUk9HOworCW1vdW50dmVycyA9IDA7CisJcG9ydCA9IDA7CisJbW91bnRwb3J0ID0gMDsKKwluZnNwcm9nID0gMTAwMDAzOworCW5mc3ZlcnMgPSAwOworCisJLyogcGFyc2Ugb3B0aW9ucyAqLworCWlmIChmaWx0ZXJvcHRzKQlmb3IgKG9wdCA9IHN0cnRvayhmaWx0ZXJvcHRzLCAiLCIpOyBvcHQ7IG9wdCA9IHN0cnRvayhOVUxMLCAiLCIpKSB7CisJCWNoYXIgKm9wdGVxID0gc3RyY2hyKG9wdCwgJz0nKTsKKwkJaWYgKG9wdGVxKSB7CisJCQlpbnQgdmFsLCBpZHg7CisJCQlzdGF0aWMgY29uc3QgY2hhciBvcHRpb25zW10gQUxJR04xID0KKwkJCQkvKiAwICovICJyc2l6ZVwwIgorCQkJCS8qIDEgKi8gIndzaXplXDAiCisJCQkJLyogMiAqLyAidGltZW9cMCIKKwkJCQkvKiAzICovICJyZXRyYW5zXDAiCisJCQkJLyogNCAqLyAiYWNyZWdtaW5cMCIKKwkJCQkvKiA1ICovICJhY3JlZ21heFwwIgorCQkJCS8qIDYgKi8gImFjZGlybWluXDAiCisJCQkJLyogNyAqLyAiYWNkaXJtYXhcMCIKKwkJCQkvKiA4ICovICJhY3RpbWVvXDAiCisJCQkJLyogOSAqLyAicmV0cnlcMCIKKwkJCQkvKiAxMCAqLyAicG9ydFwwIgorCQkJCS8qIDExICovICJtb3VudHBvcnRcMCIKKwkJCQkvKiAxMiAqLyAibW91bnRob3N0XDAiCisJCQkJLyogMTMgKi8gIm1vdW50cHJvZ1wwIgorCQkJCS8qIDE0ICovICJtb3VudHZlcnNcMCIKKwkJCQkvKiAxNSAqLyAibmZzcHJvZ1wwIgorCQkJCS8qIDE2ICovICJuZnN2ZXJzXDAiCisJCQkJLyogMTcgKi8gInZlcnNcMCIKKwkJCQkvKiAxOCAqLyAicHJvdG9cMCIKKwkJCQkvKiAxOSAqLyAibmFtbGVuXDAiCisJCQkJLyogMjAgKi8gImFkZHJcMCI7CisKKwkJCSpvcHRlcSsrID0gJ1wwJzsKKwkJCWlkeCA9IGluZGV4X2luX3N0cmluZ3Mob3B0aW9ucywgb3B0KTsKKwkJCXN3aXRjaCAoaWR4KSB7CisJCQljYXNlIDEyOiAvLyAibW91bnRob3N0IgorCQkJCW1vdW50aG9zdCA9IHhzdHJuZHVwKG9wdGVxLAorCQkJCQkJc3RyY3NwbihvcHRlcSwgIiBcdFxuXHIsIikpOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxODogLy8gInByb3RvIgorCQkJCWlmICghc3RybmNtcChvcHRlcSwgInRjcCIsIDMpKQorCQkJCQl0Y3AgPSAxOworCQkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdGVxLCAidWRwIiwgMykpCisJCQkJCXRjcCA9IDA7CisJCQkJZWxzZQorCQkJCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IHVucmVjb2duaXplZCBwcm90bz0gb3B0aW9uIik7CisJCQkJY29udGludWU7CisJCQljYXNlIDIwOiAvLyAiYWRkciIgLSBpZ25vcmUKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgLTE6IC8vIHVua25vd24KKwkJCQlpZiAodmZzZmxhZ3MgJiBNU19SRU1PVU5UKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJdmFsID0geGF0b2lfcG9zaXRpdmUob3B0ZXEpOworCQkJc3dpdGNoIChpZHgpIHsKKwkJCWNhc2UgMDogLy8gInJzaXplIgorCQkJCWRhdGEucnNpemUgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE6IC8vICJ3c2l6ZSIKKwkJCQlkYXRhLndzaXplID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAyOiAvLyAidGltZW8iCisJCQkJZGF0YS50aW1lbyA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMzogLy8gInJldHJhbnMiCisJCQkJZGF0YS5yZXRyYW5zID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSA0OiAvLyAiYWNyZWdtaW4iCisJCQkJZGF0YS5hY3JlZ21pbiA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgNTogLy8gImFjcmVnbWF4IgorCQkJCWRhdGEuYWNyZWdtYXggPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDY6IC8vICJhY2Rpcm1pbiIKKwkJCQlkYXRhLmFjZGlybWluID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSA3OiAvLyAiYWNkaXJtYXgiCisJCQkJZGF0YS5hY2Rpcm1heCA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgODogLy8gImFjdGltZW8iCisJCQkJZGF0YS5hY3JlZ21pbiA9IHZhbDsKKwkJCQlkYXRhLmFjcmVnbWF4ID0gdmFsOworCQkJCWRhdGEuYWNkaXJtaW4gPSB2YWw7CisJCQkJZGF0YS5hY2Rpcm1heCA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgOTogLy8gInJldHJ5IgorCQkJCXJldHJ5ID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxMDogLy8gInBvcnQiCisJCQkJcG9ydCA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMTE6IC8vICJtb3VudHBvcnQiCisJCQkJbW91bnRwb3J0ID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxMzogLy8gIm1vdW50cHJvZyIKKwkJCQltb3VudHByb2cgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE0OiAvLyAibW91bnR2ZXJzIgorCQkJCW1vdW50dmVycyA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMTU6IC8vICJuZnNwcm9nIgorCQkJCW5mc3Byb2cgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE2OiAvLyAibmZzdmVycyIKKwkJCWNhc2UgMTc6IC8vICJ2ZXJzIgorCQkJCW5mc3ZlcnMgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE5OiAvLyAibmFtbGVuIgorCQkJCS8vaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDIpCisJCQkJCWRhdGEubmFtbGVuID0gdmFsOworCQkJCS8vZWxzZQorCQkJCS8vCWJiX2Vycm9yX21zZygid2FybmluZzogb3B0aW9uIG5hbWxlbiBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCWRlZmF1bHQ6CisJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIG5mcyBtb3VudCBwYXJhbWV0ZXI6ICVzPSVkIiwgb3B0LCB2YWwpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCQllbHNlIHsgLyogbm90IG9mIHRoZSBmb3JtIG9wdD12YWwgKi8KKwkJCXN0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPQorCQkJCSJiZ1wwIgorCQkJCSJmZ1wwIgorCQkJCSJzb2Z0XDAiCisJCQkJImhhcmRcMCIKKwkJCQkiaW50clwwIgorCQkJCSJwb3NpeFwwIgorCQkJCSJjdG9cMCIKKwkJCQkiYWNcMCIKKwkJCQkidGNwXDAiCisJCQkJInVkcFwwIgorCQkJCSJsb2NrXDAiCisJCQkJInJkaXJwbHVzXDAiOworCQkJaW50IHZhbCA9IDE7CisJCQlpZiAoIXN0cm5jbXAob3B0LCAibm8iLCAyKSkgeworCQkJCXZhbCA9IDA7CisJCQkJb3B0ICs9IDI7CisJCQl9CisJCQlzd2l0Y2ggKGluZGV4X2luX3N0cmluZ3Mob3B0aW9ucywgb3B0KSkgeworCQkJY2FzZSAwOiAvLyAiYmciCisjaWYgQkJfTU1VCisJCQkJYmcgPSB2YWw7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgMTogLy8gImZnIgorI2lmIEJCX01NVQorCQkJCWJnID0gIXZhbDsKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSAyOiAvLyAic29mdCIKKwkJCQlzb2Z0ID0gdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvLyAiaGFyZCIKKwkJCQlzb2Z0ID0gIXZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDogLy8gImludHIiCisJCQkJaW50ciA9IHZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNTogLy8gInBvc2l4IgorCQkJCXBvc2l4ID0gdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSA2OiAvLyAiY3RvIgorCQkJCW5vY3RvID0gIXZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzogLy8gImFjIgorCQkJCW5vYWMgPSAhdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSA4OiAvLyAidGNwIgorCQkJCXRjcCA9IHZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgOTogLy8gInVkcCIKKwkJCQl0Y3AgPSAhdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDogLy8gImxvY2siCisJCQkJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDMpCisJCQkJCW5vbG9jayA9ICF2YWw7CisJCQkJZWxzZQorCQkJCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IG9wdGlvbiBub2xvY2sgaXMgbm90IHN1cHBvcnRlZCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMTogLy9yZGlycGx1cworCQkJCW5vcmRpcnBsdXMgPSAhdmFsOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQliYl9lcnJvcl9tc2coInVua25vd24gbmZzIG1vdW50IG9wdGlvbjogJXMlcyIsIHZhbCA/ICIiIDogIm5vIiwgb3B0KTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwl9CisJcHJvdG8gPSAodGNwKSA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CisKKwlkYXRhLmZsYWdzID0gKHNvZnQgPyBORlNfTU9VTlRfU09GVCA6IDApCisJCXwgKGludHIgPyBORlNfTU9VTlRfSU5UUiA6IDApCisJCXwgKHBvc2l4ID8gTkZTX01PVU5UX1BPU0lYIDogMCkKKwkJfCAobm9jdG8gPyBORlNfTU9VTlRfTk9DVE8gOiAwKQorCQl8IChub2FjID8gTkZTX01PVU5UX05PQUMgOiAwKQorCQl8IChub3JkaXJwbHVzID8gTkZTX01PVU5UX05PUkRJUlBMVVMgOiAwKTsKKwlpZiAobmZzX21vdW50X3ZlcnNpb24gPj0gMikKKwkJZGF0YS5mbGFncyB8PSAodGNwID8gTkZTX01PVU5UX1RDUCA6IDApOworCWlmIChuZnNfbW91bnRfdmVyc2lvbiA+PSAzKQorCQlkYXRhLmZsYWdzIHw9IChub2xvY2sgPyBORlNfTU9VTlRfTk9OTE0gOiAwKTsKKwlpZiAobmZzdmVycyA+IE1BWF9ORlNQUk9UIHx8IG1vdW50dmVycyA+IE1BWF9ORlNQUk9UKSB7CisJCWJiX2Vycm9yX21zZygiTkZTdiVkIG5vdCBzdXBwb3J0ZWQiLCBuZnN2ZXJzKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAobmZzdmVycyAmJiAhbW91bnR2ZXJzKQorCQltb3VudHZlcnMgPSAobmZzdmVycyA8IDMpID8gMSA6IG5mc3ZlcnM7CisJaWYgKG5mc3ZlcnMgJiYgbmZzdmVycyA8IG1vdW50dmVycykgeworCQltb3VudHZlcnMgPSBuZnN2ZXJzOworCX0KKworCS8qIEFkanVzdCBvcHRpb25zIGlmIG5vbmUgc3BlY2lmaWVkICovCisJaWYgKCFkYXRhLnRpbWVvKQorCQlkYXRhLnRpbWVvID0gdGNwID8gNzAgOiA3OworCisJZGF0YS52ZXJzaW9uID0gbmZzX21vdW50X3ZlcnNpb247CisKKwlpZiAodmZzZmxhZ3MgJiBNU19SRU1PVU5UKQorCQlnb3RvIGRvX21vdW50OworCisJLyoKKwkgKiBJZiB0aGUgcHJldmlvdXMgbW91bnQgb3BlcmF0aW9uIG9uIHRoZSBzYW1lIGhvc3Qgd2FzCisJICogYmFja2dyb3VuZGVkLCBhbmQgdGhlICJiZyIgZm9yIHRoaXMgbW91bnQgaXMgYWxzbyBzZXQsCisJICogZ2l2ZSB1cCBpbW1lZGlhdGVseSwgdG8gYXZvaWQgdGhlIGluaXRpYWwgdGltZW91dC4KKwkgKi8KKwlpZiAoYmcgJiYgd2Vfc2F3X3RoaXNfaG9zdF9iZWZvcmUoaG9zdG5hbWUpKSB7CisJCWRhZW1vbml6ZWQgPSBkYWVtb25pemUoKTsKKwkJaWYgKGRhZW1vbml6ZWQgPD0gMCkgeyAvKiBwYXJlbnQgb3IgZXJyb3IgKi8KKwkJCXJldHZhbCA9IC1kYWVtb25pemVkOworCQkJZ290byByZXQ7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgbW91bnQgZGFlbW9uIGNsaWVudCAqLworCS8qIFNlZSBpZiB0aGUgbmZzIGhvc3QgPSBtb3VudCBob3N0LiAqLworCWlmIChtb3VudGhvc3QpIHsKKwkJaWYgKG1vdW50aG9zdFswXSA+PSAnMCcgJiYgbW91bnRob3N0WzBdIDw9ICc5JykgeworCQkJbW91bnRfc2VydmVyX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQltb3VudF9zZXJ2ZXJfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoaG9zdG5hbWUpOworCQl9IGVsc2UgeworCQkJaHAgPSBnZXRob3N0YnluYW1lKG1vdW50aG9zdCk7CisJCQlpZiAoaHAgPT0gTlVMTCkgeworCQkJCWJiX2hlcnJvcl9tc2coIiVzIiwgbW91bnRob3N0KTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlpZiAoaHAtPmhfbGVuZ3RoICE9IChpbnQpc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvbmx5IElQdjQgaXMgc3VwcG9ydGVkIik7CisJCQl9CisJCQltb3VudF9zZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCW1lbWNweSgmbW91bnRfc2VydmVyX2FkZHIuc2luX2FkZHIsIGhwLT5oX2FkZHJfbGlzdFswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgbG9vcCBpbXBsZW1lbnRzIHRoZSBtb3VudCByZXRyaWVzLiBXaGVuIHRoZSBtb3VudAorCSAqIHRpbWVzIG91dCwgYW5kIHRoZSAiYmciIG9wdGlvbiBpcyBzZXQsIHdlIGJhY2tncm91bmQgb3Vyc2VsZgorCSAqIGFuZCBjb250aW51ZSB0cnlpbmcuCisJICoKKwkgKiBUaGUgY2FzZSB3aGVyZSB0aGUgbW91bnQgcG9pbnQgaXMgbm90IHByZXNlbnQgYW5kIHRoZSAiYmciCisJICogb3B0aW9uIGlzIHNldCwgaXMgdHJlYXRlZCBhcyBhIHRpbWVvdXQuIFRoaXMgaXMgZG9uZSB0bworCSAqIHN1cHBvcnQgbmVzdGVkIG1vdW50cy4KKwkgKgorCSAqIFRoZSAicmV0cnkiIGNvdW50IHNwZWNpZmllZCBieSB0aGUgdXNlciBpcyB0aGUgbnVtYmVyIG9mCisJICogbWludXRlcyB0byByZXRyeSBiZWZvcmUgZ2l2aW5nIHVwLgorCSAqLworCXsKKwkJc3RydWN0IHRpbWV2YWwgdG90YWxfdGltZW91dDsKKwkJc3RydWN0IHRpbWV2YWwgcmV0cnlfdGltZW91dDsKKwkJc3RydWN0IHBtYXAgcG1fbW50OworCQl0aW1lX3QgdDsKKwkJdGltZV90IHByZXZ0OworCQl0aW1lX3QgdGltZW91dDsKKworCQlyZXRyeV90aW1lb3V0LnR2X3NlYyA9IDM7CisJCXJldHJ5X3RpbWVvdXQudHZfdXNlYyA9IDA7CisJCXRvdGFsX3RpbWVvdXQudHZfc2VjID0gMjA7CisJCXRvdGFsX3RpbWVvdXQudHZfdXNlYyA9IDA7CisvKiBGSVhNRTogdXNlIG1vbm90b25pYygpPyAqLworCQl0aW1lb3V0ID0gdGltZShOVUxMKSArIDYwICogcmV0cnk7CisJCXByZXZ0ID0gMDsKKwkJdCA9IDMwOworIHJldHJ5OgorCQkvKiBCZSBjYXJlZnVsIG5vdCB0byB1c2UgdG9vIG1hbnkgQ1BVIGN5Y2xlcyAqLworCQlpZiAodCAtIHByZXZ0IDwgMzApCisJCQlzbGVlcCgzMCk7CisKKwkJZ2V0X21vdW50cG9ydCgmcG1fbW50LCAmbW91bnRfc2VydmVyX2FkZHIsCisJCQkJbW91bnRwcm9nLAorCQkJCW1vdW50dmVycywKKwkJCQlwcm90bywKKwkJCQltb3VudHBvcnQpOworCQluZnN2ZXJzID0gKHBtX21udC5wbV92ZXJzIDwgMikgPyAyIDogcG1fbW50LnBtX3ZlcnM7CisKKwkJLyogY29udGFjdCB0aGUgbW91bnQgZGFlbW9uIHZpYSBUQ1AgKi8KKwkJbW91bnRfc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwbV9tbnQucG1fcG9ydCk7CisJCW1zb2NrID0gUlBDX0FOWVNPQ0s7CisKKwkJc3dpdGNoIChwbV9tbnQucG1fcHJvdCkgeworCQljYXNlIElQUFJPVE9fVURQOgorCQkJbWNsaWVudCA9IGNsbnR1ZHBfY3JlYXRlKCZtb3VudF9zZXJ2ZXJfYWRkciwKKwkJCQkJCSBwbV9tbnQucG1fcHJvZywKKwkJCQkJCSBwbV9tbnQucG1fdmVycywKKwkJCQkJCSByZXRyeV90aW1lb3V0LAorCQkJCQkJICZtc29jayk7CisJCQlpZiAobWNsaWVudCkKKwkJCQlicmVhazsKKwkJCW1vdW50X3NlcnZlcl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG1fbW50LnBtX3BvcnQpOworCQkJbXNvY2sgPSBSUENfQU5ZU09DSzsKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCW1jbGllbnQgPSBjbG50dGNwX2NyZWF0ZSgmbW91bnRfc2VydmVyX2FkZHIsCisJCQkJCQkgcG1fbW50LnBtX3Byb2csCisJCQkJCQkgcG1fbW50LnBtX3ZlcnMsCisJCQkJCQkgJm1zb2NrLCAwLCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbWNsaWVudCA9IE5VTEw7CisJCX0KKwkJaWYgKCFtY2xpZW50KSB7CisJCQlpZiAoIWRhZW1vbml6ZWQgJiYgcHJldnQgPT0gMCkKKwkJCQllcnJvcl9tc2dfcnBjKGNsbnRfc3BjcmVhdGVlcnJvcigiICIpKTsKKwkJfSBlbHNlIHsKKwkJCWVudW0gY2xudF9zdGF0IGNsbnRfc3RhdDsKKworCQkJLyogVHJ5IHRvIG1vdW50IGhvc3RuYW1lOnBhdGhuYW1lICovCisJCQltY2xpZW50LT5jbF9hdXRoID0gYXV0aHVuaXhfY3JlYXRlX2RlZmF1bHQoKTsKKworCQkJLyogTWFrZSBwb2ludGVycyBpbiB4ZHJfbW91bnRyZXMzIE5VTEwgc28KKwkJCSAqIHRoYXQgeGRyX2FycmF5IGFsbG9jYXRlcyBtZW1vcnkgZm9yIHVzCisJCQkgKi8KKwkJCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RhdHVzKSk7CisKKwkJCWlmIChwbV9tbnQucG1fdmVycyA9PSAzKQorCQkJCWNsbnRfc3RhdCA9IGNsbnRfY2FsbChtY2xpZW50LCBNT1VOVFBST0MzX01OVCwKKwkJCQkJICAgICAgKHhkcnByb2NfdCkgeGRyX2RpcnBhdGgsCisJCQkJCSAgICAgIChjYWRkcl90KSAmcGF0aG5hbWUsCisJCQkJCSAgICAgICh4ZHJwcm9jX3QpIHhkcl9tb3VudHJlczMsCisJCQkJCSAgICAgIChjYWRkcl90KSAmc3RhdHVzLAorCQkJCQkgICAgICB0b3RhbF90aW1lb3V0KTsKKwkJCWVsc2UKKwkJCQljbG50X3N0YXQgPSBjbG50X2NhbGwobWNsaWVudCwgTU9VTlRQUk9DX01OVCwKKwkJCQkJICAgICAgKHhkcnByb2NfdCkgeGRyX2RpcnBhdGgsCisJCQkJCSAgICAgIChjYWRkcl90KSAmcGF0aG5hbWUsCisJCQkJCSAgICAgICh4ZHJwcm9jX3QpIHhkcl9maHN0YXR1cywKKwkJCQkJICAgICAgKGNhZGRyX3QpICZzdGF0dXMsCisJCQkJCSAgICAgIHRvdGFsX3RpbWVvdXQpOworCisJCQlpZiAoY2xudF9zdGF0ID09IFJQQ19TVUNDRVNTKQorCQkJCWdvdG8gcHJlcGFyZV9rZXJuZWxfZGF0YTsgLyogd2UncmUgZG9uZSAqLworCQkJaWYgKGVycm5vICE9IEVDT05OUkVGVVNFRCkgeworCQkJCWVycm9yX21zZ19ycGMoY2xudF9zcGVycm9yKG1jbGllbnQsICIgIikpOworCQkJCWdvdG8gZmFpbDsJLyogZG9uJ3QgcmV0cnkgKi8KKwkJCX0KKwkJCS8qIENvbm5lY3Rpb24gcmVmdXNlZCAqLworCQkJaWYgKCFkYWVtb25pemVkICYmIHByZXZ0ID09IDApIC8qIHByaW50IGp1c3Qgb25jZSAqLworCQkJCWVycm9yX21zZ19ycGMoY2xudF9zcGVycm9yKG1jbGllbnQsICIgIikpOworCQkJYXV0aF9kZXN0cm95KG1jbGllbnQtPmNsX2F1dGgpOworCQkJY2xudF9kZXN0cm95KG1jbGllbnQpOworCQkJbWNsaWVudCA9IE5VTEw7CisJCQljbG9zZShtc29jayk7CisJCQltc29jayA9IC0xOworCQl9CisKKwkJLyogVGltZW91dC4gV2UgYXJlIGdvaW5nIHRvIHJldHJ5Li4uIG1heWJlICovCisJCWlmICghYmcpCisJCQlnb3RvIGZhaWw7CisJCWlmICghZGFlbW9uaXplZCkgeworCQkJZGFlbW9uaXplZCA9IGRhZW1vbml6ZSgpOworCQkJaWYgKGRhZW1vbml6ZWQgPD0gMCkgeyAvKiBwYXJlbnQgb3IgZXJyb3IgKi8KKwkJCQlyZXR2YWwgPSAtZGFlbW9uaXplZDsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCQlwcmV2dCA9IHQ7CisJCXQgPSB0aW1lKE5VTEwpOworCQlpZiAodCA+PSB0aW1lb3V0KQorCQkJLyogVE9ETyBlcnJvciBtZXNzYWdlICovCisJCQlnb3RvIGZhaWw7CisKKwkJZ290byByZXRyeTsKKwl9CisKKyBwcmVwYXJlX2tlcm5lbF9kYXRhOgorCisJaWYgKG5mc3ZlcnMgPT0gMikgeworCQlpZiAoc3RhdHVzLm5mc3YyLmZoc19zdGF0dXMgIT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCIlczolcyBmYWlsZWQsIHJlYXNvbiBnaXZlbiBieSBzZXJ2ZXI6ICVzIiwKKwkJCQlob3N0bmFtZSwgcGF0aG5hbWUsCisJCQkJbmZzX3N0cmVycm9yKHN0YXR1cy5uZnN2Mi5maHNfc3RhdHVzKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbWVtY3B5KGRhdGEucm9vdC5kYXRhLAorCQkJCShjaGFyICopIHN0YXR1cy5uZnN2Mi5maHN0YXR1c191LmZoc19maGFuZGxlLAorCQkJCU5GU19GSFNJWkUpOworCQlkYXRhLnJvb3Quc2l6ZSA9IE5GU19GSFNJWkU7CisJCW1lbWNweShkYXRhLm9sZF9yb290LmRhdGEsCisJCQkJKGNoYXIgKikgc3RhdHVzLm5mc3YyLmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUsCisJCQkJTkZTX0ZIU0laRSk7CisJfSBlbHNlIHsKKwkJZmhhbmRsZTMgKm15X2ZoYW5kbGU7CisJCWlmIChzdGF0dXMubmZzdjMuZmhzX3N0YXR1cyAhPSAwKSB7CisJCQliYl9lcnJvcl9tc2coIiVzOiVzIGZhaWxlZCwgcmVhc29uIGdpdmVuIGJ5IHNlcnZlcjogJXMiLAorCQkJCWhvc3RuYW1lLCBwYXRobmFtZSwKKwkJCQluZnNfc3RyZXJyb3Ioc3RhdHVzLm5mc3YzLmZoc19zdGF0dXMpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlteV9maGFuZGxlID0gJnN0YXR1cy5uZnN2My5tb3VudHJlczNfdS5tb3VudGluZm8uZmhhbmRsZTsKKwkJbWVtc2V0KGRhdGEub2xkX3Jvb3QuZGF0YSwgMCwgTkZTX0ZIU0laRSk7CisJCW1lbXNldCgmZGF0YS5yb290LCAwLCBzaXplb2YoZGF0YS5yb290KSk7CisJCWRhdGEucm9vdC5zaXplID0gbXlfZmhhbmRsZS0+ZmhhbmRsZTNfbGVuOworCQltZW1jcHkoZGF0YS5yb290LmRhdGEsCisJCQkJKGNoYXIgKikgbXlfZmhhbmRsZS0+ZmhhbmRsZTNfdmFsLAorCQkJCW15X2ZoYW5kbGUtPmZoYW5kbGUzX2xlbik7CisKKwkJZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVkVSMzsKKwl9CisKKwkvKiBDcmVhdGUgbmZzIHNvY2tldCBmb3Iga2VybmVsICovCisJaWYgKHRjcCkgeworCQlpZiAobmZzX21vdW50X3ZlcnNpb24gPCAzKSB7CisJCQliYl9lcnJvcl9tc2coIk5GUyBvdmVyIFRDUCBpcyBub3Qgc3VwcG9ydGVkIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJZnNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwl9IGVsc2UKKwkJZnNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChmc29jayA8IDApIHsKKwkJYmJfcGVycm9yX21zZygibmZzIHNvY2tldCIpOworCQlnb3RvIGZhaWw7CisJfQorCWlmIChiaW5kcmVzdnBvcnQoZnNvY2ssIDApIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJuZnMgYmluZHJlc3Zwb3J0Iik7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHBvcnQgPT0gMCkgeworCQlzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IFBNQVBQT1JUOworCQlwb3J0ID0gcG1hcF9nZXRwb3J0KCZzZXJ2ZXJfYWRkciwgbmZzcHJvZywgbmZzdmVycywKKwkJCQkJdGNwID8gSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUCk7CisJCWlmIChwb3J0ID09IDApCisJCQlwb3J0ID0gTkZTX1BPUlQ7CisJfQorCXNlcnZlcl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKwkvKiBQcmVwYXJlIGRhdGEgc3RydWN0dXJlIGZvciBrZXJuZWwgKi8KKwlkYXRhLmZkID0gZnNvY2s7CisJbWVtY3B5KChjaGFyICopICZkYXRhLmFkZHIsIChjaGFyICopICZzZXJ2ZXJfYWRkciwgc2l6ZW9mKGRhdGEuYWRkcikpOworCXN0cm5jcHkoZGF0YS5ob3N0bmFtZSwgaG9zdG5hbWUsIHNpemVvZihkYXRhLmhvc3RuYW1lKSk7CisKKwkvKiBDbGVhbiB1cCAqLworCWF1dGhfZGVzdHJveShtY2xpZW50LT5jbF9hdXRoKTsKKwljbG50X2Rlc3Ryb3kobWNsaWVudCk7CisJY2xvc2UobXNvY2spOworCW1zb2NrID0gLTE7CisKKwlpZiAoYmcpIHsKKwkJLyogV2UgbXVzdCB3YWl0IHVudGlsIG1vdW50IGRpcmVjdG9yeSBpcyBhdmFpbGFibGUgKi8KKwkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwkJaW50IGRlbGF5ID0gMTsKKwkJd2hpbGUgKHN0YXQobXAtPm1udF9kaXIsICZzdGF0YnVmKSA9PSAtMSkgeworCQkJaWYgKCFkYWVtb25pemVkKSB7CisJCQkJZGFlbW9uaXplZCA9IGRhZW1vbml6ZSgpOworCQkJCWlmIChkYWVtb25pemVkIDw9IDApIHsgLyogcGFyZW50IG9yIGVycm9yICovCisvKiBGSVhNRTogcGFyZW50IGRvZXNuJ3QgY2xvc2UgZnNvY2sgLSA/PyEgKi8KKwkJCQkJcmV0dmFsID0gLWRhZW1vbml6ZWQ7CisJCQkJCWdvdG8gcmV0OworCQkJCX0KKwkJCX0KKwkJCXNsZWVwKGRlbGF5KTsJLyogMSwgMiwgNCwgOCwgMTYsIDMwLCAuLi4gKi8KKwkJCWRlbGF5ICo9IDI7CisJCQlpZiAoZGVsYXkgPiAzMCkKKwkJCQlkZWxheSA9IDMwOworCQl9CisJfQorCisJLyogUGVyZm9ybSBhY3R1YWwgbW91bnQgKi8KKyBkb19tb3VudDoKKwltcC0+bW50X3R5cGUgPSAoY2hhciopIm5mcyI7CisJcmV0dmFsID0gbW91bnRfaXRfbm93KG1wLCB2ZnNmbGFncywgKGNoYXIqKSZkYXRhKTsKKwlnb3RvIHJldDsKKworCS8qIEFib3J0ICovCisgZmFpbDoKKwlpZiAobXNvY2sgPj0gMCkgeworCQlpZiAobWNsaWVudCkgeworCQkJYXV0aF9kZXN0cm95KG1jbGllbnQtPmNsX2F1dGgpOworCQkJY2xudF9kZXN0cm95KG1jbGllbnQpOworCQl9CisJCWNsb3NlKG1zb2NrKTsKKwl9CisJaWYgKGZzb2NrID49IDApCisJCWNsb3NlKGZzb2NrKTsKKworIHJldDoKKwlmcmVlKGhvc3RuYW1lKTsKKwlmcmVlKG1vdW50aG9zdCk7CisJZnJlZShmaWx0ZXJvcHRzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZWxzZSAvLyAhRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTCisKKy8vIE5ldmVyIGNhbGxlZC4gQ2FsbCBzaG91bGQgYmUgb3B0aW1pemVkIG91dC4KK2ludCBuZnNtb3VudChzdHJ1Y3QgbW50ZW50ICptcCwgbG9uZyB2ZnNmbGFncywgY2hhciAqZmlsdGVyb3B0cyk7CisKKyNlbmRpZiAvLyAhRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTCisKKy8vIE1vdW50IG9uZSBkaXJlY3RvcnkuICBIYW5kbGVzIENJRlMsIE5GUywgbG9vcGJhY2ssIGF1dG9iaW5kLCBhbmQgZmlsZXN5c3RlbQorLy8gdHlwZSBkZXRlY3Rpb24uICBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbnplcm8gZm9yIGZhaWx1cmUuCisvLyBOQjogbXAtPnh4eCBmaWVsZHMgbWF5IGJlIHRyYXNoZWQgb24gZXhpdAorc3RhdGljIGludCBzaW5nbGVtb3VudChzdHJ1Y3QgbW50ZW50ICptcCwgaW50IGlnbm9yZV9idXN5KQoreworCWludCByYyA9IC0xOworCWxvbmcgdmZzZmxhZ3M7CisJY2hhciAqbG9vcEZpbGUgPSBOVUxMLCAqZmlsdGVyb3B0cyA9IE5VTEw7CisJbGxpc3RfdCAqZmwgPSBOVUxMOworCXN0cnVjdCBzdGF0IHN0OworCisJZXJybm8gPSAwOworCisJdmZzZmxhZ3MgPSBwYXJzZV9tb3VudF9vcHRpb25zKG1wLT5tbnRfb3B0cywgJmZpbHRlcm9wdHMpOworCisJLy8gVHJlYXQgZnN0eXBlICJhdXRvIiBhcyB1bnNwZWNpZmllZAorCWlmIChtcC0+bW50X3R5cGUgJiYgc3RyY21wKG1wLT5tbnRfdHlwZSwgImF1dG8iKSA9PSAwKQorCQltcC0+bW50X3R5cGUgPSBOVUxMOworCisJLy8gTWlnaHQgdGhpcyBiZSBhIHZpcnR1YWwgZmlsZXN5c3RlbT8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyAmJiBzdHJjaHIobXAtPm1udF9mc25hbWUsICcjJykpIHsKKwkJY2hhciAqYXJnc1szNV07CisJCWNoYXIgKnM7CisJCWludCBuOworCQkvLyBmc25hbWU6ICJjbWQjYXJnMSNhcmcyLi4uIgorCQkvLyBXQVJOSU5HOiBhbGxvd3MgZXhlY3V0aW9uIG9mIGFyYml0cmFyeSBjb21tYW5kcyEKKwkJLy8gVHJ5ICJtb3VudCAnc2gjLWMjc2gnIGJvZ3VzX2RpciIuCisJCS8vIEl0IGlzIHNhZmUgT05MWSBiZWNhdXNlIG5vbi1yb290CisJCS8vIGNhbm5vdCB1c2UgdHdvLWFyZ3VtZW50IG1vdW50IGNvbW1hbmQKKwkJLy8gYW5kIHVzaW5nIG9uZS1hcmd1bWVudCAibW91bnQgJ3NoIy1jI3NoJyIgZG9lc24ndCB3b3JrOgorCQkvLyAibW91bnQ6IGNhbid0IGZpbmQgc2gjLWMjc2ggaW4gL2V0Yy9mc3RhYiIKKwkJLy8gKGlmIC9ldGMvZnN0YWIgaGFzIGl0LCBpdCdzIG9rOiByb290IHNldHMgdXAgL2V0Yy9mc3RhYikuCisKKwkJcyA9IG1wLT5tbnRfZnNuYW1lOworCQluID0gMDsKKwkJYXJnc1tuKytdID0gczsKKwkJd2hpbGUgKCpzICYmIG4gPCAzNSAtIDIpIHsKKwkJCWlmICgqcysrID09ICcjJyAmJiAqcyAhPSAnIycpIHsKKwkJCQlzWy0xXSA9ICdcMCc7CisJCQkJYXJnc1tuKytdID0gczsKKwkJCX0KKwkJfQorCQlhcmdzW24rK10gPSBtcC0+bW50X2RpcjsKKwkJYXJnc1tuXSA9IE5VTEw7CisJCXJjID0gc3Bhd25fYW5kX3dhaXQoYXJncyk7CisJCWdvdG8gcmVwb3J0X2Vycm9yOworCX0KKworCS8vIE1pZ2h0IHRoaXMgYmUgYW4gQ0lGUyBmaWxlc3lzdGVtPworCWlmIChFTkFCTEVfRkVBVFVSRV9NT1VOVF9DSUZTCisJICYmICghbXAtPm1udF90eXBlIHx8IHN0cmNtcChtcC0+bW50X3R5cGUsICJjaWZzIikgPT0gMCkKKwkgJiYgKG1wLT5tbnRfZnNuYW1lWzBdID09ICcvJyB8fCBtcC0+bW50X2ZzbmFtZVswXSA9PSAnXFwnKQorCSAmJiBtcC0+bW50X2ZzbmFtZVswXSA9PSBtcC0+bW50X2ZzbmFtZVsxXQorCSkgeworCQlpbnQgbGVuOworCQljaGFyIGM7CisJCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwkJY2hhciAqaG9zdG5hbWUsICpkb3R0ZWQsICppcDsKKworCQlob3N0bmFtZSA9IG1wLT5tbnRfZnNuYW1lICsgMjsKKwkJbGVuID0gc3RyY3Nwbihob3N0bmFtZSwgIi9cXCIpOworCQlpZiAobGVuID09IDAgfHwgaG9zdG5hbWVbbGVuXSA9PSAnXDAnKQorCQkJZ290byByZXBvcnRfZXJyb3I7CisJCWMgPSBob3N0bmFtZVtsZW5dOworCQlob3N0bmFtZVtsZW5dID0gJ1wwJzsKKwkJbHNhID0gaG9zdDJzb2NrYWRkcihob3N0bmFtZSwgMCk7CisJCWhvc3RuYW1lW2xlbl0gPSBjOworCQlpZiAoIWxzYSkKKwkJCWdvdG8gcmVwb3J0X2Vycm9yOworCisJCS8vIEluc2VydCAiaXA9Li4uIiBvcHRpb24gaW50byBvcHRpb25zCisJCWRvdHRlZCA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCgmbHNhLT51LnNhKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKGxzYSk7CisJCWlwID0geGFzcHJpbnRmKCJpcD0lcyIsIGRvdHRlZCk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShkb3R0ZWQpOworCQlwYXJzZV9tb3VudF9vcHRpb25zKGlwLCAmZmlsdGVyb3B0cyk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShpcCk7CisKKwkJLy8gIi1vIG1hbmQiIGlzIHJlcXVpcmVkIFt3aHk/XQorCQl2ZnNmbGFncyB8PSBNU19NQU5ETE9DSzsKKwkJbXAtPm1udF90eXBlID0gKGNoYXIqKSJjaWZzIjsKKwkJcmMgPSBtb3VudF9pdF9ub3cobXAsIHZmc2ZsYWdzLCBmaWx0ZXJvcHRzKTsKKworCQlnb3RvIHJlcG9ydF9lcnJvcjsKKwl9CisKKwkvLyBNaWdodCB0aGlzIGJlIGFuIE5GUyBmaWxlc3lzdGVtPworCWlmIChFTkFCTEVfRkVBVFVSRV9NT1VOVF9ORlMKKwkgJiYgKCFtcC0+bW50X3R5cGUgfHwgc3RyY21wKG1wLT5tbnRfdHlwZSwgIm5mcyIpID09IDApCisJICYmIHN0cmNocihtcC0+bW50X2ZzbmFtZSwgJzonKSAhPSBOVUxMCisJKSB7CisJCXJjID0gbmZzbW91bnQobXAsIHZmc2ZsYWdzLCBmaWx0ZXJvcHRzKTsKKwkJZ290byByZXBvcnRfZXJyb3I7CisJfQorCisJLy8gTG9vayBhdCB0aGUgZmlsZS4gIChOb3QgZm91bmQgaXNuJ3QgYSBmYWlsdXJlIGZvciByZW1vdW50LCBvciBmb3IKKwkvLyBhIHN5bnRoZXRpYyBmaWxlc3lzdGVtIGxpa2UgcHJvYyBvciBzeXNmcy4pCisJLy8gKFdlIHVzZSBzdGF0LCBub3QgbHN0YXQsIGluIG9yZGVyIHRvIGFsbG93CisJLy8gbW91bnQgc3ltbGlua190b19maWxlX29yX2Jsa2RldiBkaXIpCisJaWYgKCFzdGF0KG1wLT5tbnRfZnNuYW1lLCAmc3QpCisJICYmICEodmZzZmxhZ3MgJiAoTVNfUkVNT1VOVCB8IE1TX0JJTkQgfCBNU19NT1ZFKSkKKwkpIHsKKwkJLy8gRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhIGxvb3BiYWNrIGRldmljZSBmb3IgaXQ/CisJCWlmIChFTkFCTEVfRkVBVFVSRV9NT1VOVF9MT09QICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJCWxvb3BGaWxlID0gYmJfc2ltcGxpZnlfcGF0aChtcC0+bW50X2ZzbmFtZSk7CisJCQltcC0+bW50X2ZzbmFtZSA9IE5VTEw7IC8vIHdpbGwgcmVjZWl2ZSBtYWxsb2NlZCBsb29wIGRldiBuYW1lCisJCQlpZiAoc2V0X2xvb3AoJm1wLT5tbnRfZnNuYW1lLCBsb29wRmlsZSwgMCkgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykKKwkJCQkJYmJfZXJyb3JfbXNnKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCQkJCWVsc2UKKwkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc2V0dXAgbG9vcCBkZXZpY2UiKTsKKwkJCQlyZXR1cm4gZXJybm87CisJCQl9CisKKwkJLy8gQXV0b2RldGVjdCBiaW5kIG1vdW50cworCQl9IGVsc2UgaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkgJiYgIW1wLT5tbnRfdHlwZSkKKwkJCXZmc2ZsYWdzIHw9IE1TX0JJTkQ7CisJfQorCisJLy8gSWYgd2Uga25vdyB0aGUgZnN0eXBlIChvciBkb24ndCBuZWVkIHRvKSwganVtcCBzdHJhaWdodAorCS8vIHRvIHRoZSBhY3R1YWwgbW91bnQuCisJaWYgKG1wLT5tbnRfdHlwZSB8fCAodmZzZmxhZ3MgJiAoTVNfUkVNT1VOVCB8IE1TX0JJTkQgfCBNU19NT1ZFKSkpIHsKKwkJcmMgPSBtb3VudF9pdF9ub3cobXAsIHZmc2ZsYWdzLCBmaWx0ZXJvcHRzKTsKKwl9IGVsc2UgeworCQkvLyBMb29wIHRocm91Z2ggZmlsZXN5c3RlbSB0eXBlcyB1bnRpbCBtb3VudCBzdWNjZWVkcworCQkvLyBvciB3ZSBydW4gb3V0CisKKwkJLy8gSW5pdGlhbGl6ZSBsaXN0IG9mIGJsb2NrIGJhY2tlZCBmaWxlc3lzdGVtcy4KKwkJLy8gVGhpcyBoYXMgdG8gYmUgZG9uZSBoZXJlIHNvIHRoYXQgZHVyaW5nICJtb3VudCAtYSIsCisJCS8vIG1vdW50cyBhZnRlciAvcHJvYyBzaG93cyB1cCBjYW4gYXV0b2RldGVjdC4KKwkJaWYgKCFmc2xpc3QpIHsKKwkJCWZzbGlzdCA9IGdldF9ibG9ja19iYWNrZWRfZmlsZXN5c3RlbXMoKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBmc2xpc3QpCisJCQkJYXRleGl0KGRlbGV0ZV9ibG9ja19iYWNrZWRfZmlsZXN5c3RlbXMpOworCQl9CisKKwkJZm9yIChmbCA9IGZzbGlzdDsgZmw7IGZsID0gZmwtPmxpbmspIHsKKwkJCW1wLT5tbnRfdHlwZSA9IGZsLT5kYXRhOworCQkJcmMgPSBtb3VudF9pdF9ub3cobXAsIHZmc2ZsYWdzLCBmaWx0ZXJvcHRzKTsKKwkJCWlmICghcmMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBJZiBtb3VudCBmYWlsZWQsIGNsZWFuIHVwIGxvb3AgZmlsZSAoaWYgYW55KS4KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTE9PUCAmJiByYyAmJiBsb29wRmlsZSkgeworCQlkZWxfbG9vcChtcC0+bW50X2ZzbmFtZSk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQkJZnJlZShsb29wRmlsZSk7CisJCQlmcmVlKG1wLT5tbnRfZnNuYW1lKTsKKwkJfQorCX0KKworIHJlcG9ydF9lcnJvcjoKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoZmlsdGVyb3B0cyk7CisKKwlpZiAoZXJybm8gPT0gRUJVU1kgJiYgaWdub3JlX2J1c3kpCisJCXJldHVybiAwOworCWlmIChyYyAhPSAwKQorCQliYl9wZXJyb3JfbXNnKCJtb3VudGluZyAlcyBvbiAlcyBmYWlsZWQiLCBtcC0+bW50X2ZzbmFtZSwgbXAtPm1udF9kaXIpOworCXJldHVybiByYzsKK30KKworLy8gLU8gc3VwcG9ydAorLy8gICAgLU8gaW50ZXJwcmV0cyBhIGxpc3Qgb2YgZmlsdGVyIG9wdGlvbnMgd2hpY2ggc2VsZWN0IHdoZXRoZXIgYSBtb3VudAorLy8gcG9pbnQgd2lsbCBiZSBtb3VudGVkOiBvbmx5IG1vdW50cyB3aXRoIG9wdGlvbnMgbWF0Y2hpbmcgKmFsbCogZmlsdGVyaW5nCisvLyBvcHRpb25zIHdpbGwgYmUgc2VsZWN0ZWQuCisvLyAgICBCeSBkZWZhdWx0IGVhY2ggLU8gZmlsdGVyIG9wdGlvbiBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGxpc3Qgb2YgbW91bnQKKy8vIG9wdGlvbnMsIGJ1dCBpZiBpdCBpcyBwcmVmaXhlZCBieSAibm8iIHRoZW4gaXQgbXVzdCBiZSBhYnNlbnQuCisvLyBGb3IgZXhhbXBsZSwKKy8vICAtTyBhLG5vYixjICBtYXRjaGVzICAtbyBhLGMgIGJ1dCBmYWlscyB0byBtYXRjaCAgLW8gYSxiLGMKKy8vICAgICAgICAgICAgICAoYW5kIGFsc28gZmFpbHMgdG8gbWF0Y2ggIC1vIGEgIGJlY2F1c2UgIC1vIGMgIGlzIGFic2VudCkuCisvLworLy8gSXQgaXMgZGlmZmVyZW50IGZyb20gLXQgaW4gdGhhdCBlYWNoIG9wdGlvbiBpcyBtYXRjaGVkIGV4YWN0bHk7IGEgbGVhZGluZworLy8gIm5vIiBhdCB0aGUgYmVnaW5uaW5nIG9mIG9uZSBvcHRpb24gZG9lcyBub3QgbmVnYXRlIHRoZSByZXN0Lgorc3RhdGljIGludCBtYXRjaF9vcHQoY29uc3QgY2hhciAqZnNfb3B0X2luLCBjb25zdCBjaGFyICpPX29wdCkKK3sKKwlpZiAoIU9fb3B0KQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgqT19vcHQpIHsKKwkJY29uc3QgY2hhciAqZnNfb3B0ID0gZnNfb3B0X2luOworCQlpbnQgT19sZW47CisJCWludCBtYXRjaDsKKworCQkvLyBJZiBvcHRpb24gYmVnaW5zIHdpdGggIm5vIiB0aGVuIHRyZWF0IGFzIGFuIGludmVydGVkIG1hdGNoOgorCQkvLyBtYXRjaGluZyBpcyBhIGZhaWx1cmUKKwkJbWF0Y2ggPSAwOworCQlpZiAoT19vcHRbMF0gPT0gJ24nICYmIE9fb3B0WzFdID09ICdvJykgeworCQkJbWF0Y2ggPSAxOworCQkJT19vcHQgKz0gMjsKKwkJfQorCQkvLyBJc29sYXRlIHRoZSBjdXJyZW50IE8gb3B0aW9uCisJCU9fbGVuID0gc3RyY2hybnVsKE9fb3B0LCAnLCcpIC0gT19vcHQ7CisJCS8vIENoZWNrIGZvciBhIG1hdGNoIGFnYWluc3QgZXhpc3Rpbmcgb3B0aW9ucworCQl3aGlsZSAoMSkgeworCQkJaWYgKHN0cm5jbXAoZnNfb3B0LCBPX29wdCwgT19sZW4pID09IDAKKwkJCSAmJiAoZnNfb3B0W09fbGVuXSA9PSAnXDAnIHx8IGZzX29wdFtPX2xlbl0gPT0gJywnKQorCQkJKSB7CisJCQkJaWYgKG1hdGNoKQorCQkJCQlyZXR1cm4gMDsgIC8vICJubyIgcHJlZml4LCBidXQgb3B0aW9uIGZvdW5kCisJCQkJbWF0Y2ggPSAxOyAgLy8gY3VycmVudCBPIG9wdGlvbiBmb3VuZCwgZ28gY2hlY2sgbmV4dCBvbmUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZzX29wdCA9IHN0cmNocihmc19vcHQsICcsJyk7CisJCQlpZiAoIWZzX29wdCkKKwkJCQlicmVhazsKKwkJCWZzX29wdCsrOworCQl9CisJCWlmIChtYXRjaCA9PSAwKQorCQkJcmV0dXJuIDA7ICAgICAvLyBtYXRjaCB3YW50ZWQgYnV0IG5vdCBmb3VuZAorCQlpZiAoT19vcHRbT19sZW5dID09ICdcMCcpIC8vIGVuZD8KKwkJCWJyZWFrOworCQkvLyBTdGVwIHRvIHRoZSBuZXh0IE8gb3B0aW9uCisJCU9fb3B0ICs9IE9fbGVuICsgMTsKKwl9CisJLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBldmVyeXRoaW5nIG1hdGNoZWQKKwlyZXR1cm4gMTsKK30KKworLy8gUGFyc2Ugb3B0aW9ucywgaWYgbmVjZXNzYXJ5IHBhcnNlIGZzdGFiL210YWIsIGFuZCBjYWxsIHNpbmdsZW1vdW50IGZvcgorLy8gZWFjaCBkaXJlY3RvcnkgdG8gYmUgbW91bnRlZC4KK2ludCBtb3VudF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbW91bnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmNtZG9wdHMgPSB4emFsbG9jKDEpOworCWNoYXIgKmZzdHlwZSA9IE5VTEw7CisJY2hhciAqT19vcHRtYXRjaCA9IE5VTEw7CisJY2hhciAqc3RvcmFnZV9wYXRoOworCWxsaXN0X3QgKmxzdF9vID0gTlVMTDsKKwljb25zdCBjaGFyICpmc3RhYm5hbWU7CisJRklMRSAqZnN0YWI7CisJaW50IGksIGo7CisJaW50IHJjID0gRVhJVF9TVUNDRVNTOworCXVuc2lnbmVkIG9wdDsKKwlzdHJ1Y3QgbW50ZW50IG10cGFpclsyXSwgKm10Y3VyID0gbXRwYWlyOworCUlGX05PVF9ERVNLVE9QKGNvbnN0IGludCBub25yb290ID0gMDspCisKKwlJRl9ERVNLVE9QKGludCBub25yb290ID0gKSBzYW5pdGl6ZV9lbnZfaWZfc3VpZCgpOworCisJLy8gUGFyc2UgbG9uZyBvcHRpb25zLCBsaWtlIC0tYmluZCBhbmQgLS1tb3ZlLiAgTm90ZSB0aGF0IC1vIG9wdGlvbgorCS8vIGFuZCAtLW9wdGlvbiBhcmUgc3lub255bW91cy4gIFllcywgdGhpcyBtZWFucyAtLXJlbW91bnQscncgd29ya3MuCisJZm9yIChpID0gaiA9IDE7IGFyZ3ZbaV07IGkrKykgeworCQlpZiAoYXJndltpXVswXSA9PSAnLScgJiYgYXJndltpXVsxXSA9PSAnLScpCisJCQlhcHBlbmRfbW91bnRfb3B0aW9ucygmY21kb3B0cywgYXJndltpXSArIDIpOworCQllbHNlCisJCQlhcmd2W2orK10gPSBhcmd2W2ldOworCX0KKwlhcmd2W2pdID0gTlVMTDsKKworCS8vIFBhcnNlIHJlbWFpbmluZyBvcHRpb25zCisJLy8gTWF4IDIgcGFyYW1zOyAtbyBpcyBhIGxpc3QsIC12IGlzIGEgY291bnRlcgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8ybzo6IiBJRl9GRUFUVVJFX01PVU5UX1ZFUkJPU0UoInZ2Iik7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUiwgJmxzdF9vLCAmZnN0eXBlLCAmT19vcHRtYXRjaAorCQkJSUZfRkVBVFVSRV9NT1VOVF9WRVJCT1NFKCwgJnZlcmJvc2UpKTsKKwl3aGlsZSAobHN0X28pIGFwcGVuZF9tb3VudF9vcHRpb25zKCZjbWRvcHRzLCBsbGlzdF9wb3AoJmxzdF9vKSk7IC8vIC1vCisJaWYgKG9wdCAmIE9QVF9yKSBhcHBlbmRfbW91bnRfb3B0aW9ucygmY21kb3B0cywgInJvIik7IC8vIC1yCisJaWYgKG9wdCAmIE9QVF93KSBhcHBlbmRfbW91bnRfb3B0aW9ucygmY21kb3B0cywgInJ3Iik7IC8vIC13CisJYXJndiArPSBvcHRpbmQ7CisKKwkvLyBJZiB3ZSBoYXZlIG5vIGFyZ3VtZW50cywgc2hvdyBjdXJyZW50bHkgbW91bnRlZCBmaWxlc3lzdGVtcworCWlmICghYXJndlswXSkgeworCQlpZiAoIShvcHQgJiBPUFRfYSkpIHsKKwkJCUZJTEUgKm1vdW50VGFibGUgPSBzZXRtbnRlbnQoYmJfcGF0aF9tdGFiX2ZpbGUsICJyIik7CisKKwkJCWlmICghbW91bnRUYWJsZSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gJXMiLCBiYl9wYXRoX210YWJfZmlsZSk7CisKKwkJCXdoaWxlIChnZXRtbnRlbnRfcihtb3VudFRhYmxlLCAmbXRwYWlyWzBdLCBnZXRtbnRlbnRfYnVmLAorCQkJCQkJCQlHRVRNTlRFTlRfQlVGU0laRSkpCisJCQl7CisJCQkJLy8gRG9uJ3Qgc2hvdyByb290ZnMuIEZJWE1FOiB3aHk/PworCQkJCS8vIHV0aWwtbGludXggMi4xMmEgaGFwcGlseSBzaG93cyByb290ZnMuLi4KKwkJCQkvL2lmIChzdHJjbXAobXRwYWlyLT5tbnRfZnNuYW1lLCAicm9vdGZzIikgPT0gMCkgY29udGludWU7CisKKwkJCQlpZiAoIWZzdHlwZSB8fCBzdHJjbXAobXRwYWlyLT5tbnRfdHlwZSwgZnN0eXBlKSA9PSAwKQorCQkJCQlwcmludGYoIiVzIG9uICVzIHR5cGUgJXMgKCVzKVxuIiwgbXRwYWlyLT5tbnRfZnNuYW1lLAorCQkJCQkJCW10cGFpci0+bW50X2RpciwgbXRwYWlyLT5tbnRfdHlwZSwKKwkJCQkJCQltdHBhaXItPm1udF9vcHRzKTsKKwkJCX0KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQllbmRtbnRlbnQobW91bnRUYWJsZSk7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJCXN0b3JhZ2VfcGF0aCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLy8gV2hlbiB3ZSBoYXZlIHR3byBhcmd1bWVudHMsIHRoZSBzZWNvbmQgaXMgdGhlIGRpcmVjdG9yeSBhbmQgd2UgY2FuCisJCS8vIHNraXAgbG9va2luZyBhdCBmc3RhYiBlbnRpcmVseS4gIFdlIGNhbiBhbHdheXMgYWJzcGF0aCgpIHRoZSBkaXJlY3RvcnkKKwkJLy8gYXJndW1lbnQgd2hlbiB3ZSBnZXQgaXQuCisJCWlmIChhcmd2WzFdKSB7CisJCQlpZiAobm9ucm9vdCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisJCQltdHBhaXItPm1udF9mc25hbWUgPSBhcmd2WzBdOworCQkJbXRwYWlyLT5tbnRfZGlyID0gYXJndlsxXTsKKwkJCW10cGFpci0+bW50X3R5cGUgPSBmc3R5cGU7CisJCQltdHBhaXItPm1udF9vcHRzID0gY21kb3B0czsKKwkJCXJlc29sdmVfbW91bnRfc3BlYygmbXRwYWlyLT5tbnRfZnNuYW1lKTsKKwkJCXJjID0gc2luZ2xlbW91bnQobXRwYWlyLCAvKmlnbm9yZV9idXN5OiovIDApOworCQkJcmV0dXJuIHJjOworCQl9CisJCXN0b3JhZ2VfcGF0aCA9IGJiX3NpbXBsaWZ5X3BhdGgoYXJndlswXSk7IC8vIG1hbGxvY2VkCisJfQorCisJLy8gUGFzdCB0aGlzIHBvaW50LCB3ZSBhcmUgaGFuZGxpbmcgZWl0aGVyICJtb3VudCAtYSBbb3B0c10iCisJLy8gb3IgIm1vdW50IFtvcHRzXSBzaW5nbGVfcGFyYW0iCisKKwlpID0gcGFyc2VfbW91bnRfb3B0aW9ucyhjbWRvcHRzLCBOVUxMKTsgLy8gRklYTUU6IHNob3VsZCBiZSAibG9uZyIsIG5vdCAiaW50IgorCWlmIChub25yb290ICYmIChpICYgfk1TX1NJTEVOVCkpIC8vIE5vbi1yb290IHVzZXJzIGNhbm5vdCBzcGVjaWZ5IGZsYWdzCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKworCS8vIElmIHdlIGhhdmUgYSBzaGFyZWQgc3VidHJlZSBmbGFnLCBkb24ndCB3b3JyeSBhYm91dCBmc3RhYiBvciBtdGFiLgorCWlmIChFTkFCTEVfRkVBVFVSRV9NT1VOVF9GTEFHUworCSAmJiAoaSAmIChNU19TSEFSRUQgfCBNU19QUklWQVRFIHwgTVNfU0xBVkUgfCBNU19VTkJJTkRBQkxFKSkKKwkpIHsKKwkJLy8gdmVyYm9zZV9tb3VudChzb3VyY2UsIHRhcmdldCwgdHlwZSwgZmxhZ3MsIGRhdGEpCisJCXJjID0gdmVyYm9zZV9tb3VudCgiIiwgYXJndlswXSwgIiIsIGksICIiKTsKKwkJaWYgKHJjKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8vIE9wZW4gZWl0aGVyIGZzdGFiIG9yIG10YWIKKwlmc3RhYm5hbWUgPSAiL2V0Yy9mc3RhYiI7CisJaWYgKGkgJiBNU19SRU1PVU5UKSB7CisJCS8vIFdBUk5JTkcuIEkgYW0gbm90IHN1cmUgdGhpcyBtYXRjaGVzIHV0aWwtbGludXgncworCQkvLyBiZWhhdmlvci4gSXQncyBwb3NzaWJsZSB1dGlsLWxpbnV4IGRvZXMgbm90CisJCS8vIHRha2UgLW8gb3B0cyBmcm9tIG10YWIgKHRha2VzIG9ubHkgbW91bnQgc291cmNlKS4KKwkJZnN0YWJuYW1lID0gYmJfcGF0aF9tdGFiX2ZpbGU7CisJfQorCWZzdGFiID0gc2V0bW50ZW50KGZzdGFibmFtZSwgInIiKTsKKwlpZiAoIWZzdGFiKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJyVzJyIsIGZzdGFibmFtZSk7CisKKwkvLyBMb29wIHRocm91Z2ggZW50cmllcyB1bnRpbCB3ZSBmaW5kIHdoYXQgd2UncmUgbG9va2luZyBmb3IKKwltZW1zZXQobXRwYWlyLCAwLCBzaXplb2YobXRwYWlyKSk7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgbW50ZW50ICptdG90aGVyID0gKG10Y3VyPT1tdHBhaXIgPyBtdHBhaXIrMSA6IG10cGFpcik7CisKKwkJLy8gR2V0IG5leHQgZnN0YWIgZW50cnkKKwkJaWYgKCFnZXRtbnRlbnRfcihmc3RhYiwgbXRjdXIsIGdldG1udGVudF9idWYKKwkJCQkJKyAobXRjdXI9PW10cGFpciA/IEdFVE1OVEVOVF9CVUZTSVpFLzIgOiAwKSwKKwkJCQlHRVRNTlRFTlRfQlVGU0laRS8yKQorCQkpIHsgLy8gRW5kIG9mIGZzdGFiL210YWIgaXMgcmVhY2hlZAorCQkJbXRjdXIgPSBtdG90aGVyOyAvLyB0aGUgdGhpbmcgd2UgZm91bmQgbGFzdCB0aW1lCisJCQlicmVhazsKKwkJfQorCisJCS8vIElmIHdlJ3JlIHRyeWluZyB0byBtb3VudCBzb21ldGhpbmcgc3BlY2lmaWMgYW5kIHRoaXMgaXNuJ3QgaXQsCisJCS8vIHNraXAgaXQuICBOb3RlIHdlIG11c3QgbWF0Y2ggdGhlIGV4YWN0IHRleHQgaW4gZnN0YWIgKGFsYQorCQkvLyAicHJvYyIpIG9yIGEgZnVsbCBwYXRoIGZyb20gcm9vdAorCQlpZiAoYXJndlswXSkgeworCisJCQkvLyBJcyB0aGlzIHdoYXQgd2UncmUgbG9va2luZyBmb3I/CisJCQlpZiAoc3RyY21wKGFyZ3ZbMF0sIG10Y3VyLT5tbnRfZnNuYW1lKSAhPSAwCisJCQkgJiYgc3RyY21wKHN0b3JhZ2VfcGF0aCwgbXRjdXItPm1udF9mc25hbWUpICE9IDAKKwkJCSAmJiBzdHJjbXAoYXJndlswXSwgbXRjdXItPm1udF9kaXIpICE9IDAKKwkJCSAmJiBzdHJjbXAoc3RvcmFnZV9wYXRoLCBtdGN1ci0+bW50X2RpcikgIT0gMAorCQkJKSB7CisJCQkJY29udGludWU7IC8vIG5vCisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIHRoaXMgZW50cnkuICBTb21ldGhpbmcgbGF0ZXIgbWF5IGhhdmUKKwkJCS8vIG92ZXJtb3VudGVkIGl0LCBhbmQgd2Ugd2FudCB0aGUgX2xhc3RfIG1hdGNoLgorCQkJbXRjdXIgPSBtdG90aGVyOworCisJCS8vIElmIHdlJ3JlIG1vdW50aW5nIGFsbAorCQl9IGVsc2UgeworCQkJc3RydWN0IG1udGVudCAqbXA7CisJCQkvLyBObywgbW91bnQgLWEgd29uJ3QgbW91bnQgYW55dGhpbmcsCisJCQkvLyBldmVuIHVzZXIgbW91bnRzLCBmb3IgbWVyZSBodW1hbnMKKwkJCWlmIChub25yb290KQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKworCQkJLy8gRG9lcyB0eXBlIG1hdGNoPyAoTlVMTCBtYXRjaGVzIGFsd2F5cykKKwkJCWlmICghbWF0Y2hfZnN0eXBlKG10Y3VyLCBmc3R5cGUpKQorCQkJCWNvbnRpbnVlOworCisJCQkvLyBTa2lwIG5vYXV0byBhbmQgc3dhcCBhbnl3YXkKKwkJCWlmICgocGFyc2VfbW91bnRfb3B0aW9ucyhtdGN1ci0+bW50X29wdHMsIE5VTEwpICYgKE1PVU5UX05PQVVUTyB8IE1PVU5UX1NXQVApKQorCQkJLy8gc3dhcCBpcyBib2d1cyAiZnN0eXBlIiwgcGFyc2VfbW91bnRfb3B0aW9ucyBjYW4ndCBjaGVjayBmc3R5cGVzCisJCQkgfHwgc3RyY2FzZWNtcChtdGN1ci0+bW50X3R5cGUsICJzd2FwIikgPT0gMAorCQkJKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIERvZXMgKGF0IGxlYXN0IG9uZSkgb3B0aW9uIG1hdGNoPworCQkJLy8gKE5VTEwgbWF0Y2hlcyBhbHdheXMpCisJCQlpZiAoIW1hdGNoX29wdChtdGN1ci0+bW50X29wdHMsIE9fb3B0bWF0Y2gpKQorCQkJCWNvbnRpbnVlOworCisJCQlyZXNvbHZlX21vdW50X3NwZWMoJm10Y3VyLT5tbnRfZnNuYW1lKTsKKworCQkJLy8gTkZTIG1vdW50cyB3YW50IHRoaXMgdG8gYmUgeHJlYWxsb2MtYWJsZQorCQkJbXRjdXItPm1udF9vcHRzID0geHN0cmR1cChtdGN1ci0+bW50X29wdHMpOworCisJCQkvLyBJZiBub3RoaW5nIGlzIG1vdW50ZWQgb24gdGhpcyBkaXJlY3RvcnkuLi4KKwkJCS8vIChvdGhlcndpc2UgcmVwZWF0ZWQgIm1vdW50IC1hIiBtb3VudHMgZXZlcnl0aGluZyBhZ2FpbikKKwkJCW1wID0gZmluZF9tb3VudF9wb2ludChtdGN1ci0+bW50X2RpciwgLypzdWJkaXJfdG9vOiovIDApOworCQkJLy8gV2UgZG8gbm90IGNoZWNrIGZzbmFtZSBtYXRjaCBvZiBmb3VuZCBtb3VudCBwb2ludCAtCisJCQkvLyAiLyIgbWF5IGhhdmUgZnNuYW1lIG9mICIvZGV2L3Jvb3QiIHdoaWxlIGZzdGFiCisJCQkvLyBzYXlzICIvZGV2L3NvbWV0aGluZ19lbHNlIi4KKwkJCWlmIChtcCkgeworCQkJCWlmICh2ZXJib3NlKSB7CisJCQkJCWJiX2Vycm9yX21zZygiYWNjb3JkaW5nIHRvICVzLCAiCisJCQkJCQkiJXMgaXMgYWxyZWFkeSBtb3VudGVkIG9uICVzIiwKKwkJCQkJCWJiX3BhdGhfbXRhYl9maWxlLAorCQkJCQkJbXAtPm1udF9mc25hbWUsIG1wLT5tbnRfZGlyKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIC4uLm1vdW50IHRoaXMgdGhpbmcKKwkJCQlpZiAoc2luZ2xlbW91bnQobXRjdXIsIC8qaWdub3JlX2J1c3k6Ki8gMSkpIHsKKwkJCQkJLy8gQ291bnQgbnVtYmVyIG9mIGZhaWxlZCBtb3VudHMKKwkJCQkJcmMrKzsKKwkJCQl9CisJCQl9CisJCQlmcmVlKG10Y3VyLT5tbnRfb3B0cyk7CisJCX0KKwl9CisKKwkvLyBFbmQgb2YgZnN0YWIvbXRhYiBpcyByZWFjaGVkLgorCS8vIFdlcmUgd2UgbG9va2luZyBmb3Igc29tZXRoaW5nIHNwZWNpZmljPworCWlmIChhcmd2WzBdKSB7IC8vIHllcworCQlsb25nIGw7CisKKwkJLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGNvbXBsYWluCisJCWlmICghbXRjdXItPm1udF9mc25hbWUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCAlcyBpbiAlcyIsCisJCQkJYXJndlswXSwgZnN0YWJuYW1lKTsKKworCQkvLyBXaGF0IGhhcHBlbnMgd2hlbiB3ZSB0cnkgdG8gIm1vdW50IHN3YXBfcGFydGl0aW9uIj8KKwkJLy8gKGZzdGFiIGNvbnRhaW50cyAic3dhcF9wYXJ0aXRpb24gc3dhcCBzd2FwIGRlZmF1bHRzIDAgMCIpCisJCS8vIHV0aWwtbGludXgtbmcgMi4xMy4xIGRvZXMgdGhpczoKKwkJLy8gc3RhdCgiL3NiaW4vbW91bnQuc3dhcCIsIDB4N2ZmZjYyYTNhMzUwKSA9IC0xIEVOT0VOVCAoTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSkKKwkJLy8gbW91bnQoInN3YXBfcGFydGl0aW9uIiwgInN3YXAiLCAic3dhcCIsIE1TX01HQ19WQUwsIE5VTEwpID0gLTEgRU5PRU5UIChObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5KQorCQkvLyBsc3RhdCgic3dhcCIsIDB4N2ZmZjYyYTNhNjQwKSAgICAgICAgICAgPSAtMSBFTk9FTlQgKE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkpCisJCS8vIHdyaXRlKDIsICJtb3VudDogbW91bnQgcG9pbnQgc3dhcCBkb2VzIG5vdCBleGlzdFxuIiwgMzkpID0gMzkKKwkJLy8gZXhpdF9ncm91cCgzMikgICAgICAgICAgICAgICAgICAgICAgICAgID0gPworI2lmIDAKKwkJLy8gSW4gY2FzZSB3ZSB3YW50IHRvIHNpbXBseSBza2lwIHN3YXAgcGFydGl0aW9uczoKKwkJbCA9IHBhcnNlX21vdW50X29wdGlvbnMobXRjdXItPm1udF9vcHRzLCBOVUxMKTsKKwkJaWYgKChsICYgTU9VTlRfU1dBUCkKKwkJLy8gc3dhcCBpcyBib2d1cyAiZnN0eXBlIiwgcGFyc2VfbW91bnRfb3B0aW9ucyBjYW4ndCBjaGVjayBmc3R5cGVzCisJCSB8fCBzdHJjYXNlY21wKG10Y3VyLT5tbnRfdHlwZSwgInN3YXAiKSA9PSAwCisJCSkgeworCQkJZ290byByZXQ7CisJCX0KKyNlbmRpZgorCQlpZiAobm9ucm9vdCkgeworCQkJLy8gZnN0YWIgbXVzdCBoYXZlICJ1c2VycyIgb3IgInVzZXIiCisJCQlsID0gcGFyc2VfbW91bnRfb3B0aW9ucyhtdGN1ci0+bW50X29wdHMsIE5VTEwpOworCQkJaWYgKCEobCAmIE1PVU5UX1VTRVJTKSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisJCX0KKworCQkvL3V0aWwtbGludXgtMi4xMiBkb2VzIG5vdCBkbyB0aGlzIGNoZWNrLgorCQkvLy8vIElmIG5vdGhpbmcgaXMgbW91bnRlZCBvbiB0aGlzIGRpcmVjdG9yeS4uLgorCQkvLy8vIChvdGhlcndpc2UgcmVwZWF0ZWQgIm1vdW50IEZPTyIgbW91bnRzIEZPTyBhZ2FpbikKKwkJLy9tcCA9IGZpbmRfbW91bnRfcG9pbnQobXRjdXItPm1udF9kaXIsIC8qc3ViZGlyX3RvbzoqLyAwKTsKKwkJLy9pZiAobXApIHsKKwkJLy8JYmJfZXJyb3JfbXNnKCJhY2NvcmRpbmcgdG8gJXMsICIKKwkJLy8JCSIlcyBpcyBhbHJlYWR5IG1vdW50ZWQgb24gJXMiLAorCQkvLwkJYmJfcGF0aF9tdGFiX2ZpbGUsCisJCS8vCQltcC0+bW50X2ZzbmFtZSwgbXAtPm1udF9kaXIpOworCQkvL30gZWxzZSB7CisJCQkvLyAuLi5tb3VudCB0aGUgbGFzdCB0aGluZyB3ZSBmb3VuZAorCQkJbXRjdXItPm1udF9vcHRzID0geHN0cmR1cChtdGN1ci0+bW50X29wdHMpOworCQkJYXBwZW5kX21vdW50X29wdGlvbnMoJihtdGN1ci0+bW50X29wdHMpLCBjbWRvcHRzKTsKKwkJCXJlc29sdmVfbW91bnRfc3BlYygmbXRwYWlyLT5tbnRfZnNuYW1lKTsKKwkJCXJjID0gc2luZ2xlbW91bnQobXRjdXIsIC8qaWdub3JlX2J1c3k6Ki8gMCk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShtdGN1ci0+bW50X29wdHMpOworCQkvL30KKwl9CisKKyAvL3JldDoKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWVuZG1udGVudChmc3RhYik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoc3RvcmFnZV9wYXRoKTsKKwkJZnJlZShjbWRvcHRzKTsKKwl9CisKKy8vVE9ETzogZXhpdGNvZGUgc2hvdWxkIGJlIE9SZWQgbWFzayBvZiAoZnJvbSAibWFuIG1vdW50Iik6CisvLyAwIHN1Y2Nlc3MKKy8vIDEgaW5jb3JyZWN0IGludm9jYXRpb24gb3IgcGVybWlzc2lvbnMKKy8vIDIgc3lzdGVtIGVycm9yIChvdXQgb2YgbWVtb3J5LCBjYW5ub3QgZm9yaywgbm8gbW9yZSBsb29wIGRldmljZXMpCisvLyA0IGludGVybmFsIG1vdW50IGJ1ZyBvciBtaXNzaW5nIG5mcyBzdXBwb3J0IGluIG1vdW50CisvLyA4IHVzZXIgaW50ZXJydXB0CisvLzE2IHByb2JsZW1zIHdyaXRpbmcgb3IgbG9ja2luZyAvZXRjL210YWIKKy8vMzIgbW91bnQgZmFpbHVyZQorLy82NCBzb21lIG1vdW50IHN1Y2NlZWRlZAorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvcGl2b3Rfcm9vdC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9waXZvdF9yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmMDFmYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvcGl2b3Rfcm9vdC5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBpdm90X3Jvb3QuYyAtIENoYW5nZSByb290IGZpbGUgc3lzdGVtLiAgQmFzZWQgb24gdXRpbC1saW51eCAyLjEwcworICoKKyAqIGJ1c3lib3hlZCBieSBFdmluIFJvYmVydHNvbgorICogcGl2b3Rfcm9vdCBzeXNjYWxsIHN0dWJiZWQgYnkgRXJpayBBbmRlcnNlbiwgc28gaXQgd2lsbCBjb21waWxlCisgKiAgICAgcmVnYXJkbGVzcyBvZiB0aGUga2VybmVsIGJlaW5nIHVzZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcGl2b3Rfcm9vdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTkVXX1JPT1QgUFVUX09MRCIKKy8vdXNhZ2U6I2RlZmluZSBwaXZvdF9yb290X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTW92ZSB0aGUgY3VycmVudCByb290IGZpbGUgc3lzdGVtIHRvIFBVVF9PTEQgYW5kIG1ha2UgTkVXX1JPT1RcbiIKKy8vdXNhZ2U6ICAgICAgICJ0aGUgbmV3IHJvb3QgZmlsZSBzeXN0ZW0iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitleHRlcm4gaW50IHBpdm90X3Jvb3QoY29uc3QgY2hhciAqIG5ld19yb290LGNvbnN0IGNoYXIgKiBwdXRfb2xkKTsKKworaW50IHBpdm90X3Jvb3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBpdm90X3Jvb3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgIT0gMykKKwkJYmJfc2hvd191c2FnZSgpOworCisJaWYgKHBpdm90X3Jvb3QoYXJndlsxXSwgYXJndlsyXSkgPCAwKSB7CisJCS8qIHByaW50cyAicGl2b3Rfcm9vdDogPHN0cmVycm9yIHRleHQ+IiAqLworCQliYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSgpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3JkYXRlLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3JkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzNmQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvcmRhdGUuYwpAQCAtMCwwICsxLDc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGUgUmRhdGUgY29tbWFuZCB3aWxsIGFzayBhIHRpbWUgc2VydmVyIGZvciB0aGUgUkZDIDg2OCB0aW1lCisgKiAgYW5kIG9wdGlvbmFsbHkgc2V0IHRoZSBzeXN0ZW0gdGltZS4KKyAqCisgKiBieSBTdGVybGluZyBIdXhsZXkgPHN0ZXJsaW5nQGV1cm9wYS5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyovCisKKy8vdXNhZ2U6I2RlZmluZSByZGF0ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1zcF0gSE9TVCIKKy8vdXNhZ2U6I2RlZmluZSByZGF0ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkdldCBhbmQgcG9zc2libHkgc2V0IHRoZSBzeXN0ZW0gZGF0ZSBhbmQgdGltZSBmcm9tIGEgcmVtb3RlIEhPU1RcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU2V0IHRoZSBzeXN0ZW0gZGF0ZSBhbmQgdGltZSAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1wCVByaW50IHRoZSBkYXRlIGFuZCB0aW1lIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZW51bSB7IFJGQ184NjhfQklBUyA9IDIyMDg5ODg4MDBVTCB9OworCitzdGF0aWMgdm9pZCBzb2NrZXRfdGltZW91dChpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGltZW91dCBjb25uZWN0aW5nIHRvIHRpbWUgc2VydmVyIik7Cit9CisKK3N0YXRpYyB0aW1lX3QgYXNrcmVtb3RlZGF0ZShjb25zdCBjaGFyICpob3N0KQoreworCXVpbnQzMl90IG5ldHQ7CisJaW50IGZkOworCisJLyogQWRkIGEgdGltZW91dCBmb3IgZGVhZCBvciBpbmFjY2Vzc2libGUgc2VydmVycyAqLworCWFsYXJtKDEwKTsKKwlzaWduYWwoU0lHQUxSTSwgc29ja2V0X3RpbWVvdXQpOworCisJZmQgPSBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShob3N0LCBiYl9sb29rdXBfcG9ydCgidGltZSIsICJ0Y3AiLCAzNykpOworCisJaWYgKHNhZmVfcmVhZChmZCwgKHZvaWQgKikmbmV0dCwgNCkgIT0gNCkgICAgLyogcmVhZCB0aW1lIGZyb20gc2VydmVyICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBkaWQgbm90IHNlbmQgdGhlIGNvbXBsZXRlIHRpbWUiLCBob3N0KTsKKwljbG9zZShmZCk7CisKKwkvKiBjb252ZXJ0IGZyb20gbmV0d29yayBieXRlIG9yZGVyIHRvIGxvY2FsIGJ5dGUgb3JkZXIuCisJICogUkZDIDg2OCB0aW1lIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcworCSAqIHNpbmNlIDAwOjAwIChtaWRuaWdodCkgMSBKYW51YXJ5IDE5MDAgR01UCisJICogdGhlIFJGQyA4NjggdGltZSAyLDIwOCw5ODgsODAwIGNvcnJlc3BvbmRzIHRvIDAwOjAwICAxIEphbiAxOTcwIEdNVAorCSAqIFN1YnRyYWN0IHRoZSBSRkMgODY4IHRpbWUgdG8gZ2V0IExpbnV4IGVwb2NoCisJICovCisKKwlyZXR1cm4gbnRvaGwobmV0dCkgLSBSRkNfODY4X0JJQVM7Cit9CisKK2ludCByZGF0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmRhdGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXRpbWVfdCByZW1vdGVfdGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgInNwIik7CisKKwlyZW1vdGVfdGltZSA9IGFza3JlbW90ZWRhdGUoYXJndltvcHRpbmRdKTsKKworCWlmICgoZmxhZ3MgJiAyKSA9PSAwKSB7CisJCXRpbWVfdCBjdXJyZW50X3RpbWU7CisKKwkJdGltZSgmY3VycmVudF90aW1lKTsKKwkJaWYgKGN1cnJlbnRfdGltZSA9PSByZW1vdGVfdGltZSkKKwkJCWJiX2Vycm9yX21zZygiY3VycmVudCB0aW1lIG1hdGNoZXMgcmVtb3RlIHRpbWUiKTsKKwkJZWxzZQorCQkJaWYgKHN0aW1lKCZyZW1vdGVfdGltZSkgPCAwKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IHRpbWUgb2YgZGF5Iik7CisJfQorCisJaWYgKChmbGFncyAmIDEpID09IDApCisJCXByaW50ZigiJXMiLCBjdGltZSgmcmVtb3RlX3RpbWUpKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3JkZXYuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvcmRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTE3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3JkZXYuYwpAQCAtMCwwICsxLDM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZGV2IC0gcHJpbnQgZGV2aWNlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBOdW92YXRpb24gU3lzdGVtIERlc2lnbnMsIExMQworICogICBHcmFudCBFcmlja3NvbiA8Z2VyaWNrc29uQG51b3ZhdGlvbnMuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByZGV2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgcmRldl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBkZXZpY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGVzeXN0ZW0gbW91bnRlZCBhdCAnLyciCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJkZXZfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcmRldlxuIgorLy91c2FnZTogICAgICAgIi9kZXYvbXRkYmxvY2s5IC9cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCByZGV2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZGV2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqIGNvbnN0IHJvb3RfZGV2aWNlID0gZmluZF9ibG9ja19kZXZpY2UoIi8iKTsKKworCWlmIChyb290X2RldmljZSAhPSBOVUxMKSB7CisJCXByaW50ZigiJXMgL1xuIiwgcm9vdF9kZXZpY2UpOworCQlmcmVlKHJvb3RfZGV2aWNlKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvcmVhZHByb2ZpbGUuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvcmVhZHByb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQ4MDExCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9yZWFkcHJvZmlsZS5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgcmVhZHByb2ZpbGUuYyAtIHVzZWQgdG8gcmVhZCAvcHJvYy9wcm9maWxlCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NCwxOTk2IEFsZXNzYW5kcm8gUnViaW5pIChydWJpbmlAaXB2dmlzLnVuaXB2Lml0KQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1pY2tpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgorICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorICogMTk5OS0wOS0wMSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGNlbGxvLmhwbC5ocC5jb20+CisgKiAtIDY0Yml0IGNsZWFuIHBhdGNoCisgKiAzRmViMjAwMSBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+CisgKiAtIC1NIG9wdGlvbiB0byB3cml0ZSBwcm9maWxlIG11bHRpcGxpZXIuCisgKiAyMDAxLTExLTA3IFdlcm5lciBBbG1lc2JlcmdlciA8d2FAYWxtZXNiZXJnZXIubmV0PgorICogLSBieXRlIG9yZGVyIGF1dG8tZGV0ZWN0aW9uIGFuZCAtbiBvcHRpb24KKyAqIDIwMDEtMTEtMDkgV2VybmVyIEFsbWVzYmVyZ2VyIDx3YUBhbG1lc2Jlcmdlci5uZXQ+CisgKiAtIHNraXAgc3RlcCBzaXplIChpbmRleCAwKQorICogMjAwMi0wMy0wOSBKb2huIExldm9uIDxtb3pAY29tcHNvYy5tYW4uYWMudWs+CisgKiAtIG1ha2UgbWFwbGluZW5vIGRvIHNvbWV0aGluZworICogMjAwMi0xMS0yOCBNYWRzIE1hcnRpbiBKb2VyZ2Vuc2VuICsKKyAqIC0gYWxzbyB0cnkgL2Jvb3QvU3lzdGVtLm1hcC1gdW5hbWUgLXJgCisgKiAyMDAzLTA0LTA5IFdlcm5lciBBbG1lc2JlcmdlciA8d2FAYWxtZXNiZXJnZXIubmV0PgorICogLSBmaXhlZCBvZmYtYnkgZWlnaHQgZXJyb3IgYW5kIGltcHJvdmVkIGhldXJpc3RpY3MgaW4gYnl0ZSBvcmRlciBkZXRlY3Rpb24KKyAqIDIwMDMtMDgtMTIgTmlraXRhIERhbmlsb3YgPE5pa2l0YUBOYW1lc3lzLkNPTT4KKyAqIC0gYWRkZWQgLXMgb3B0aW9uOyBleGFtcGxlIG9mIHVzZToKKyAqICJyZWFkcHJvZmlsZSAtcyAtbSAvYm9vdC9TeXN0ZW0ubWFwLXRlc3QgfCBncmVwIF9fZF9sb29rdXAgfCBzb3J0IC1uIC1rMyIKKyAqCisgKiBUYWtlbiBmcm9tIHV0aWwtbGludXggYW5kIGFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkKKyAqIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByZWFkcHJvZmlsZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIgorLy91c2FnZTojZGVmaW5lIHJlYWRwcm9maWxlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1tIG1hcGZpbGUJKERlZmF1bHQ6IC9ib290L1N5c3RlbS5tYXApIgorLy91c2FnZTogICAgICJcbgktcCBwcm9maWxlCShEZWZhdWx0OiAvcHJvYy9wcm9maWxlKSIKKy8vdXNhZ2U6ICAgICAiXG4JLU0gTlVNCQlTZXQgdGhlIHByb2ZpbGluZyBtdWx0aXBsaWVyIHRvIE5VTSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCVByaW50IG9ubHkgaW5mbyBhYm91dCB0aGUgc2FtcGxpbmcgc3RlcCIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1hCQlQcmludCBhbGwgc3ltYm9scywgZXZlbiBpZiBjb3VudCBpcyAwIgorLy91c2FnZTogICAgICJcbgktYgkJUHJpbnQgaW5kaXZpZHVhbCBoaXN0b2dyYW0tYmluIGNvdW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJCVByaW50IGluZGl2aWR1YWwgY291bnRlcnMgd2l0aGluIGZ1bmN0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJCVJlc2V0IGFsbCB0aGUgY291bnRlcnMgKHJvb3Qgb25seSkiCisvL3VzYWdlOiAgICAgIlxuCS1uCQlEaXNhYmxlIGJ5dGUgb3JkZXIgYXV0by1kZXRlY3Rpb24iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKKyNkZWZpbmUgU19MRU4gMTI4CisKKy8qIFRoZXNlIGFyZSB0aGUgZGVmYXVsdHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRtYXBbXSBBTElHTjEgPSAiL2Jvb3QvU3lzdGVtLm1hcCI7CitzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0cHJvW10gQUxJR04xID0gIi9wcm9jL3Byb2ZpbGUiOworCitpbnQgcmVhZHByb2ZpbGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlYWRwcm9maWxlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICptYXA7CisJY29uc3QgY2hhciAqbWFwRmlsZSwgKnByb0ZpbGU7CisJdW5zaWduZWQgbG9uZyBpbmR4ID0gMTsKKwlzaXplX3QgbGVuOworCXVpbnQ2NF90IGFkZDAgPSAwOworCXVuc2lnbmVkIGludCBzdGVwOworCXVuc2lnbmVkIGludCAqYnVmLCB0b3RhbCwgZm5fbGVuOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmbl9hZGQsIG5leHRfYWRkOyAgICAgLyogY3VycmVudCBhbmQgbmV4dCBhZGRyZXNzICovCisJY2hhciBmbl9uYW1lW1NfTEVOXSwgbmV4dF9uYW1lW1NfTEVOXTsgICAvKiBjdXJyZW50IGFuZCBuZXh0IG5hbWUgKi8KKwljaGFyIG1hcGxpbmVbU19MRU5dOworCWNoYXIgbW9kZVs4XTsKKwlpbnQgbWFwbGluZW5vID0gMTsKKwlpbnQgaGVhZGVyX3ByaW50ZWQ7CisJaW50IG11bHRpcGxpZXIgPSAwOworCXVuc2lnbmVkIG9wdDsKKwllbnVtIHsKKwkJT1BUX00gPSAoMSA8PCAwKSwKKwkJT1BUX20gPSAoMSA8PCAxKSwKKwkJT1BUX3AgPSAoMSA8PCAyKSwKKwkJT1BUX24gPSAoMSA8PCAzKSwKKwkJT1BUX2EgPSAoMSA8PCA0KSwKKwkJT1BUX2IgPSAoMSA8PCA1KSwKKwkJT1BUX3MgPSAoMSA8PCA2KSwKKwkJT1BUX2kgPSAoMSA8PCA3KSwKKwkJT1BUX3IgPSAoMSA8PCA4KSwKKwkJT1BUX3YgPSAoMSA8PCA5KSwKKwl9OworI2RlZmluZSBvcHRNdWx0ICAgIChvcHQgJiBPUFRfTSkKKyNkZWZpbmUgb3B0TmF0aXZlICAob3B0ICYgT1BUX24pCisjZGVmaW5lIG9wdEFsbCAgICAgKG9wdCAmIE9QVF9hKQorI2RlZmluZSBvcHRCaW5zICAgIChvcHQgJiBPUFRfYikKKyNkZWZpbmUgb3B0U3ViICAgICAob3B0ICYgT1BUX3MpCisjZGVmaW5lIG9wdEluZm8gICAgKG9wdCAmIE9QVF9pKQorI2RlZmluZSBvcHRSZXNldCAgIChvcHQgJiBPUFRfcikKKyNkZWZpbmUgb3B0VmVyYm9zZSAob3B0ICYgT1BUX3YpCisKKyNkZWZpbmUgbmV4dCAoY3VycmVudF4xKQorCisJcHJvRmlsZSA9IGRlZmF1bHRwcm87CisJbWFwRmlsZSA9IGRlZmF1bHRtYXA7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJNKyI7IC8qIC1NIE4gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiTTptOnA6bmFic2lydiIsICZtdWx0aXBsaWVyLCAmbWFwRmlsZSwgJnByb0ZpbGUpOworCisJaWYgKG9wdCAmIChPUFRfTXxPUFRfcikpIHsgLyogbXVsdCBvciByZXNldCwgb3IgYm90aCAqLworCQlpbnQgZmQsIHRvX3dyaXRlOworCisJCS8qCisJCSAqIFdoZW4gd3JpdGluZyB0aGUgbXVsdGlwbGllciwgaWYgdGhlIGxlbmd0aCBvZiB0aGUgd3JpdGUgaXMKKwkJICogbm90IHNpemVvZihpbnQpLCB0aGUgbXVsdGlwbGllciBpcyBub3QgY2hhbmdlZAorCQkgKi8KKwkJdG9fd3JpdGUgPSBzaXplb2YoaW50KTsKKwkJaWYgKCFvcHRNdWx0KQorCQkJdG9fd3JpdGUgPSAxOyAgLyogc3RoIGRpZmZlcmVudCBmcm9tIHNpemVvZihpbnQpICovCisKKwkJZmQgPSB4b3BlbihkZWZhdWx0cHJvLCBPX1dST05MWSk7CisJCXh3cml0ZShmZCwgJm11bHRpcGxpZXIsIHRvX3dyaXRlKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qCisJICogVXNlIGFuIGZkIGZvciB0aGUgcHJvZmlsaW5nIGJ1ZmZlciwgdG8gc2tpcCBzdGRpbyBvdmVyaGVhZAorCSAqLworCWxlbiA9IE1BWElOVChzc2l6ZV90KTsKKwlidWYgPSB4bWFsbG9jX3hvcGVuX3JlYWRfY2xvc2UocHJvRmlsZSwgJmxlbik7CisJaWYgKCFvcHROYXRpdmUpIHsKKwkJaW50IGVudHJpZXMgPSBsZW4gLyBzaXplb2YoKmJ1Zik7CisJCWludCBiaWcgPSAwLCBzbWFsbCA9IDAsIGk7CisJCXVuc2lnbmVkICpwOworCisJCWZvciAocCA9IGJ1ZisxOyBwIDwgYnVmK2VudHJpZXM7IHArKykgeworCQkJaWYgKCpwICYgfjBVIDw8IChzaXplb2YoKmJ1ZikqNCkpCisJCQkJYmlnKys7CisJCQlpZiAoKnAgJiAoKDEgPDwgKHNpemVvZigqYnVmKSo0KSktMSkpCisJCQkJc21hbGwrKzsKKwkJfQorCQlpZiAoYmlnID4gc21hbGwpIHsKKwkJCWJiX2Vycm9yX21zZygiYXNzdW1pbmcgcmV2ZXJzZWQgYnl0ZSBvcmRlciwgIgorCQkJCSJ1c2UgLW4gdG8gZm9yY2UgbmF0aXZlIGJ5dGUgb3JkZXIiKTsKKwkJCWZvciAocCA9IGJ1ZjsgcCA8IGJ1ZitlbnRyaWVzOyBwKyspCisJCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZigqYnVmKS8yOyBpKyspIHsKKwkJCQkJdW5zaWduZWQgY2hhciAqYiA9ICh1bnNpZ25lZCBjaGFyICopIHA7CisJCQkJCXVuc2lnbmVkIGNoYXIgdG1wOworCisJCQkJCXRtcCA9IGJbaV07CisJCQkJCWJbaV0gPSBiW3NpemVvZigqYnVmKS1pLTFdOworCQkJCQliW3NpemVvZigqYnVmKS1pLTFdID0gdG1wOworCQkJCX0KKwkJfQorCX0KKworCXN0ZXAgPSBidWZbMF07CisJaWYgKG9wdEluZm8pIHsKKwkJcHJpbnRmKCJTYW1wbGluZ19zdGVwOiAlaVxuIiwgc3RlcCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJdG90YWwgPSAwOworCisJbWFwID0geGZvcGVuX2Zvcl9yZWFkKG1hcEZpbGUpOworCisJd2hpbGUgKGZnZXRzKG1hcGxpbmUsIFNfTEVOLCBtYXApKSB7CisJCWlmIChzc2NhbmYobWFwbGluZSwgIiVsbHggJXMgJXMiLCAmZm5fYWRkLCBtb2RlLCBmbl9uYW1lKSAhPSAzKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzKCVpKTogd3JvbmcgbWFwIGxpbmUiLAorCQkJCQkgICAgIG1hcEZpbGUsIG1hcGxpbmVubyk7CisKKwkJaWYgKCFzdHJjbXAoZm5fbmFtZSwgIl9zdGV4dCIpKSAvKiBvbmx5IGVsZiB3b3JrcyBsaWtlIHRoaXMgKi8geworCQkJYWRkMCA9IGZuX2FkZDsKKwkJCWJyZWFrOworCQl9CisJCW1hcGxpbmVubysrOworCX0KKworCWlmICghYWRkMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgXCJfc3RleHRcIiBpbiAlcyIsIG1hcEZpbGUpOworCisJLyoKKwkgKiBNYWluIGxvb3AuCisJICovCisJd2hpbGUgKGZnZXRzKG1hcGxpbmUsIFNfTEVOLCBtYXApKSB7CisJCXVuc2lnbmVkIGludCB0aGlzID0gMDsKKworCQlpZiAoc3NjYW5mKG1hcGxpbmUsICIlbGx4ICVzICVzIiwgJm5leHRfYWRkLCBtb2RlLCBuZXh0X25hbWUpICE9IDMpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMoJWkpOiB3cm9uZyBtYXAgbGluZSIsCisJCQkJCW1hcEZpbGUsIG1hcGxpbmVubyk7CisKKwkJaGVhZGVyX3ByaW50ZWQgPSAwOworCisJCS8qIGlnbm9yZSBhbnkgTEVBRElORyAoYmVmb3JlIGEgJ1t0VF0nIHN5bWJvbCBpcyBmb3VuZCkKKwkJICAgQWJzb2x1dGUgc3ltYm9scyAqLworCQlpZiAoKCptb2RlID09ICdBJyB8fCAqbW9kZSA9PSAnPycpICYmIHRvdGFsID09IDApIGNvbnRpbnVlOworCQlpZiAoKm1vZGUgIT0gJ1QnICYmICptb2RlICE9ICd0JworCQkgJiYgKm1vZGUgIT0gJ1cnICYmICptb2RlICE9ICd3JworCQkpIHsKKwkJCWJyZWFrOyAgLyogb25seSB0ZXh0IGlzIHByb2ZpbGVkICovCisJCX0KKworCQlpZiAoaW5keCA+PSBsZW4gLyBzaXplb2YoKmJ1ZikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicHJvZmlsZSBhZGRyZXNzIG91dCBvZiByYW5nZS4gIgorCQkJCQkgICAgICJXcm9uZyBtYXAgZmlsZT8iKTsKKworCQl3aGlsZSAoaW5keCA8IChuZXh0X2FkZC1hZGQwKS9zdGVwKSB7CisJCQlpZiAob3B0QmlucyAmJiAoYnVmW2luZHhdIHx8IG9wdEFsbCkpIHsKKwkJCQlpZiAoIWhlYWRlcl9wcmludGVkKSB7CisJCQkJCXByaW50ZigiJXM6XG4iLCBmbl9uYW1lKTsKKwkJCQkJaGVhZGVyX3ByaW50ZWQgPSAxOworCQkJCX0KKwkJCQlwcmludGYoIlx0JSJQUkl4NjQiXHQldVxuIiwgKGluZHggLSAxKSpzdGVwICsgYWRkMCwgYnVmW2luZHhdKTsKKwkJCX0KKwkJCXRoaXMgKz0gYnVmW2luZHgrK107CisJCX0KKwkJdG90YWwgKz0gdGhpczsKKworCQlpZiAob3B0QmlucykgeworCQkJaWYgKG9wdFZlcmJvc2UgfHwgdGhpcyA+IDApCisJCQkJcHJpbnRmKCIgIHRvdGFsXHRcdFx0XHQldVxuIiwgdGhpcyk7CisJCX0gZWxzZSBpZiAoKHRoaXMgfHwgb3B0QWxsKQorCQkgICAgICAgICYmIChmbl9sZW4gPSBuZXh0X2FkZC1mbl9hZGQpICE9IDAKKwkJKSB7CisJCQlpZiAob3B0VmVyYm9zZSkKKwkJCQlwcmludGYoIiUwMTZsbHggJS00MHMgJTZpICU4LjRmXG4iLCBmbl9hZGQsCisJCQkJICAgICAgIGZuX25hbWUsIHRoaXMsIHRoaXMvKGRvdWJsZSlmbl9sZW4pOworCQkJZWxzZQorCQkJCXByaW50ZigiJTZpICUtNDBzICU4LjRmXG4iLAorCQkJCSAgICAgICB0aGlzLCBmbl9uYW1lLCB0aGlzLyhkb3VibGUpZm5fbGVuKTsKKwkJCWlmIChvcHRTdWIpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGxvbmcgc2NhbjsKKworCQkJCWZvciAoc2NhbiA9IChmbl9hZGQtYWRkMCkvc3RlcCArIDE7CisJCQkJICAgICBzY2FuIDwgKG5leHRfYWRkLWFkZDApL3N0ZXA7IHNjYW4rKykgeworCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsKKworCQkJCQlhZGRyID0gKHNjYW4gLSAxKSpzdGVwICsgYWRkMDsKKwkJCQkJcHJpbnRmKCJcdCUjbGx4XHQlcyslI2xseFx0JXVcbiIsCisJCQkJCSAgICAgICBhZGRyLCBmbl9uYW1lLCBhZGRyIC0gZm5fYWRkLAorCQkJCQkgICAgICAgYnVmW3NjYW5dKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlmbl9hZGQgPSBuZXh0X2FkZDsKKwkJc3RyY3B5KGZuX25hbWUsIG5leHRfbmFtZSk7CisKKwkJbWFwbGluZW5vKys7CisJfQorCisJLyogY2xvY2sgdGlja3MsIG91dCBvZiBrZXJuZWwgdGV4dCAtIHByb2JhYmx5IG1vZHVsZXMgKi8KKwlwcmludGYoIiU2aSAlc1xuIiwgYnVmW2xlbi9zaXplb2YoKmJ1ZiktMV0sICIqdW5rbm93bioiKTsKKworCS8qIHRyYWlsZXIgKi8KKwlpZiAob3B0VmVyYm9zZSkKKwkJcHJpbnRmKCIlMDE2eCAlLTQwcyAlNmkgJTguNGZcbiIsCisJCSAgICAgICAwLCAidG90YWwiLCB0b3RhbCwgdG90YWwvKGRvdWJsZSkoZm5fYWRkLWFkZDApKTsKKwllbHNlCisJCXByaW50ZigiJTZpICUtNDBzICU4LjRmXG4iLAorCQkgICAgICAgdG90YWwsICJ0b3RhbCIsIHRvdGFsLyhkb3VibGUpKGZuX2FkZC1hZGQwKSk7CisKKwlmY2xvc2UobWFwKTsKKwlmcmVlKGJ1Zik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9yZXYuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvcmV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxYjIyZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvcmV2LmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiByZXYgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFyZWsgUG9sYWNlayA8bW1wb2xhY2VrQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX1JFVihBUFBMRVQocmV2LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfUkVWKSArPSByZXYubworCisvL2NvbmZpZzpjb25maWcgUkVWCisvL2NvbmZpZzoJYm9vbCAicmV2IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJldmVyc2UgbGluZXMgb2YgYSBmaWxlIG9yIGZpbGVzLgorCisvL3VzYWdlOiNkZWZpbmUgcmV2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgcmV2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiUmV2ZXJzZSBsaW5lcyBvZiBGSUxFIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKyN1bmRlZiBDSEFSX1QKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisjIGRlZmluZSBDSEFSX1Qgd2NoYXJfdAorI2Vsc2UKKyMgZGVmaW5lIENIQVJfVCBjaGFyCisjZW5kaWYKKworLyogSW4tcGxhY2UgaW52ZXJ0ICovCitzdGF0aWMgdm9pZCBzdHJyZXYoQ0hBUl9UICpzLCBpbnQgbGVuKQoreworCWludCBpOworCisJaWYgKGxlbiAhPSAwKSB7CisJCWxlbi0tOworCQlpZiAobGVuICE9IDAgJiYgc1tsZW5dID09ICdcbicpCisJCQlsZW4tLTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGxlbi0tKSB7CisJCUNIQVJfVCBjID0gc1tpXTsKKwkJc1tpXSA9IHNbbGVuXTsKKwkJc1tsZW5dID0gYzsKKwl9Cit9CisKK2ludCByZXZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJldl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbDsKKwlzaXplX3QgYnVmc2l6ZTsKKwljaGFyICpidWY7CisKKwlpbml0X3VuaWNvZGUoKTsKKworCWdldG9wdDMyKGFyZ3YsICIiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pCisJCWFyZ3YgPSAoY2hhciAqKikmYmJfYXJndl9kYXNoOworCisJcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCWJ1ZnNpemUgPSAyNTY7CisJYnVmID0geG1hbGxvYyhidWZzaXplKTsKKwlkbyB7CisJCXNpemVfdCBwb3M7CisJCUZJTEUgKmZwOworCisJCWZwID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndisrKTsKKwkJaWYgKCFmcCkgeworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKworCQlwb3MgPSAwOworCQl3aGlsZSAoMSkgeworCQkJLyogUmVhZCBvbmUgbGluZSAqLworCQkJYnVmW2J1ZnNpemUgLSAxXSA9IDE7IC8qIG5vdCAwICovCisJCQlpZiAoIWZnZXRzKGJ1ZiArIHBvcywgYnVmc2l6ZSAtIHBvcywgZnApKQorCQkJCWJyZWFrOyAvKiBFT0YvZXJyb3IgKi8KKwkJCWlmIChidWZbYnVmc2l6ZSAtIDFdID09ICdcMCcgLyogZmdldHMgZmlsbGVkIGVudGlyZSBidWZmZXIgKi8KKwkJCSAmJiBidWZbYnVmc2l6ZSAtIDJdICE9ICdcbicgLyogYW5kIGRpZCBub3QgcmVhZCAnXG4nICovCisJCQkgJiYgIWZlb2YoZnApCisJCQkpIHsKKwkJCQkvKiBMaW5lIGlzIHRvbyBsb25nLCBleHRlbmQgYnVmZmVyICovCisJCQkJcG9zID0gYnVmc2l6ZSAtIDE7CisJCQkJYnVmc2l6ZSArPSA2NCArIGJ1ZnNpemUgLyA4OworCQkJCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgYnVmc2l6ZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFByb2Nlc3MgYW5kIHByaW50IGl0ICovCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQkJeworCQkJCXdjaGFyX3QgKnRtcCA9IHhtYWxsb2MoYnVmc2l6ZSAqIHNpemVvZih3Y2hhcl90KSk7CisJCQkJLyogQ29udmVydCB0byB3Y2hhcl90IChtaWdodCBlcnJvciBvdXQhKSAqLworCQkJCWludCBsZW4gID0gbWJzdG93Y3ModG1wLCBidWYsIGJ1ZnNpemUpOworCQkJCWlmIChsZW4gPj0gMCkgeworCQkJCQlzdHJyZXYodG1wLCBsZW4pOworCQkJCQkvKiBDb252ZXJ0IGJhY2sgdG8gY2hhciAqLworCQkJCQl3Y3N0b21icyhidWYsIHRtcCwgYnVmc2l6ZSk7CisJCQkJfQorCQkJCWZyZWUodG1wKTsKKwkJCX0KKyNlbHNlCisJCQlzdHJyZXYoYnVmLCBzdHJsZW4oYnVmKSk7CisjZW5kaWYKKwkJCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwkJfQorCQlmY2xvc2UoZnApOworCX0gd2hpbGUgKCphcmd2KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShidWYpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ydGN3YWtlLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3J0Y3dha2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVhMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9ydGN3YWtlLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBydGN3YWtlIC0tIGVudGVyIGEgc3lzdGVtIHNsZWVwIHN0YXRlIHVudGlsIHNwZWNpZmllZCB3YWtldXAgdGltZS4KKyAqCisgKiBUaGlzIHZlcnNpb24gd2FzIHRha2VuIGZyb20gdXRpbC1saW51eCBhbmQgc2NydWJiZWQgZG93biBmb3IgYnVzeWJveC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoaXMgdXNlcyBjcm9zcy1wbGF0Zm9ybSBMaW51eCBpbnRlcmZhY2VzIHRvIGVudGVyIGEgc3lzdGVtIHNsZWVwIHN0YXRlLAorICogYW5kIGxlYXZlIGl0IG5vIGxhdGVyIHRoYW4gYSBzcGVjaWZpZWQgdGltZS4gIEl0IHVzZXMgYW55IFJUQyBmcmFtZXdvcmsKKyAqIGRyaXZlciB0aGF0IHN1cHBvcnRzIHN0YW5kYXJkIGRyaXZlciBtb2RlbCB3YWtldXAgZmxhZ3MuCisgKgorICogVGhpcyBpcyBub3JtYWxseSB1c2VkIGxpa2UgdGhlIG9sZCAiYXBtc2xlZXAiIHV0aWxpdHksIHRvIHdha2UgZnJvbSBhCisgKiBzdXNwZW5kIHN0YXRlIGxpa2UgQUNQSSBTMSAoc3RhbmRieSkgb3IgUzMgKHN1c3BlbmQtdG8tUkFNKS4gIE1vc3QKKyAqIHBsYXRmb3JtcyBjYW4gaW1wbGVtZW50IHRob3NlIHdpdGhvdXQgYW5hbG9ndWVzIG9mIEJJT1MsIEFQTSwgb3IgQUNQSS4KKyAqCisgKiBPbiBzb21lIHN5c3RlbXMsIHRoaXMgY2FuIGFsc28gYmUgdXNlZCBsaWtlICJudnJhbS13YWtldXAiLCB3YWtpbmcKKyAqIGZyb20gc3RhdGVzIGxpa2UgQUNQSSBTNCAoc3VzcGVuZCB0byBkaXNrKS4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlCisgKiBwZXJzaXN0ZW50IG1lZGlhIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciBzdWNoIHN1c3BlbmQgbW9kZXMuCisgKgorICogVGhlIGJlc3Qgd2F5IHRvIHNldCB0aGUgc3lzdGVtJ3MgUlRDIGlzIHNvIHRoYXQgaXQgaG9sZHMgdGhlIGN1cnJlbnQKKyAqIHRpbWUgaW4gVVRDLiAgVXNlIHRoZSAiLWwiIGZsYWcgdG8gdGVsbCB0aGlzIHByb2dyYW0gdGhhdCB0aGUgc3lzdGVtCisgKiBSVEMgdXNlcyBhIGxvY2FsIHRpbWV6b25lIGluc3RlYWQgKG1heWJlIHlvdSBkdWFsLWJvb3QgTVMtV2luZG93cykuCisgKiBUaGF0IGZsYWcgc2hvdWxkIG5vdCBiZSBuZWVkZWQgb24gc3lzdGVtcyB3aXRoIGFkanRpbWUgc3VwcG9ydC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcnRjd2FrZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hIHwgLWwgfCAtdV0gWy1kIERFVl0gWy1tIE1PREVdIFstcyBTRUMgfCAtdCBUSU1FXSIKKy8vdXNhZ2U6I2RlZmluZSBydGN3YWtlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRW50ZXIgYSBzeXN0ZW0gc2xlZXAgc3RhdGUgdW50aWwgc3BlY2lmaWVkIHdha2V1cCB0aW1lXG4iCisvL3VzYWdlOglJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1hLC0tYXV0bwlSZWFkIGNsb2NrIG1vZGUgZnJvbSBhZGp0aW1lIgorLy91c2FnZTogICAgICJcbgktbCwtLWxvY2FsCUNsb2NrIGlzIHNldCB0byBsb2NhbCB0aW1lIgorLy91c2FnZTogICAgICJcbgktdSwtLXV0YwlDbG9jayBpcyBzZXQgdG8gVVRDIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1kLC0tZGV2aWNlPURFVglTcGVjaWZ5IHRoZSBSVEMgZGV2aWNlIgorLy91c2FnZTogICAgICJcbgktbSwtLW1vZGU9TU9ERQlTZXQgdGhlIHNsZWVwIHN0YXRlIChkZWZhdWx0OiBzdGFuZGJ5KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zZWNvbmRzPVNFQyBTZXQgdGhlIHRpbWVvdXQgaW4gU0VDIHNlY29uZHMgZnJvbSBub3ciCisvL3VzYWdlOiAgICAgIlxuCS10LC0tdGltZT1USU1FCVNldCB0aGUgdGltZW91dCB0byBUSU1FIHNlY29uZHMgZnJvbSBlcG9jaCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1hCVJlYWQgY2xvY2sgbW9kZSBmcm9tIGFkanRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1sCUNsb2NrIGlzIHNldCB0byBsb2NhbCB0aW1lIgorLy91c2FnZTogICAgICJcbgktdQlDbG9jayBpcyBzZXQgdG8gVVRDIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1kIERFVglTcGVjaWZ5IHRoZSBSVEMgZGV2aWNlIgorLy91c2FnZTogICAgICJcbgktbSBNT0RFCVNldCB0aGUgc2xlZXAgc3RhdGUgKGRlZmF1bHQ6IHN0YW5kYnkpIgorLy91c2FnZTogICAgICJcbgktcyBTRUMJU2V0IHRoZSB0aW1lb3V0IGluIFNFQyBzZWNvbmRzIGZyb20gbm93IgorLy91c2FnZTogICAgICJcbgktdCBUSU1FCVNldCB0aGUgdGltZW91dCB0byBUSU1FIHNlY29uZHMgZnJvbSBlcG9jaCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnRjXy5oIgorCisjZGVmaW5lIFNZU19SVENfUEFUSCAgICIvc3lzL2NsYXNzL3J0Yy8lcy9kZXZpY2UvcG93ZXIvd2FrZXVwIgorI2RlZmluZSBTWVNfUE9XRVJfUEFUSCAiL3N5cy9wb3dlci9zdGF0ZSIKKyNkZWZpbmUgREVGQVVMVF9NT0RFICAgInN0YW5kYnkiCisKK3N0YXRpYyBOT0lOTElORSBib29sIG1heV93YWtldXAoY29uc3QgY2hhciAqcnRjbmFtZSkKK3sKKwlzc2l6ZV90IHJldDsKKwljaGFyIGJ1ZlsxMjhdOworCisJLyogc3RyaXAgIi9kZXYvIiBmcm9tIHRoZSBydGNuYW1lIGhlcmUgKi8KKwlydGNuYW1lID0gc2tpcF9kZXZfcGZ4KHJ0Y25hbWUpOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgU1lTX1JUQ19QQVRILCBydGNuYW1lKTsKKwlyZXQgPSBvcGVuX3JlYWRfY2xvc2UoYnVmLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogd2FrZXVwIGV2ZW50cyBjb3VsZCBiZSBkaXNhYmxlZCBvciBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIHN0cm5jbXAoYnVmLCAiZW5hYmxlZFxuIiwgOCkgPT0gMDsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2V0dXBfYWxhcm0oaW50IGZkLCB0aW1lX3QgKndha2V1cCwgdGltZV90IHJ0Y190aW1lKQoreworCXN0cnVjdCB0bSAqcHRtOworCXN0cnVjdCBsaW51eF9ydGNfd2thbHJtIHdha2U7CisKKwkvKiBUaGUgd2FrZXVwIHRpbWUgaXMgaW4gUE9TSVggdGltZSAobW9yZSBvciBsZXNzIFVUQykuCisJICogSWRlYWxseSBSVENzIHVzZSB0aGF0IHNhbWUgdGltZTsgYnV0IFBDcyBjYW4ndCBkbyB0aGF0CisJICogaWYgdGhleSBuZWVkIHRvIGJvb3QgTVMtV2luZG93cy4gIE1lc3N5Li4uCisJICoKKwkgKiBXaGVuIHJ1bm5pbmcgaW4gdXRjIG1vZGUgdGhpcyBwcm9jZXNzJ3MgdGltZXpvbmUgaXMgVVRDLAorCSAqIHNvIHdlJ2xsIHBhc3MgYSBVVEMgZGF0ZSB0byB0aGUgUlRDLgorCSAqCisJICogRWxzZSBtb2RlIGlzIGxvY2FsIHNvIHRoZSB0aW1lIGdpdmVuIHRvIHRoZSBSVEMKKwkgKiB3aWxsIGluc3RlYWQgdXNlIHRoZSBsb2NhbCB0aW1lIHpvbmUuCisJICovCisJcHRtID0gbG9jYWx0aW1lKHdha2V1cCk7CisKKwl3YWtlLnRpbWUudG1fc2VjID0gcHRtLT50bV9zZWM7CisJd2FrZS50aW1lLnRtX21pbiA9IHB0bS0+dG1fbWluOworCXdha2UudGltZS50bV9ob3VyID0gcHRtLT50bV9ob3VyOworCXdha2UudGltZS50bV9tZGF5ID0gcHRtLT50bV9tZGF5OworCXdha2UudGltZS50bV9tb24gPSBwdG0tPnRtX21vbjsKKwl3YWtlLnRpbWUudG1feWVhciA9IHB0bS0+dG1feWVhcjsKKwkvKiB3ZGF5LCB5ZGF5LCBhbmQgaXNkc3QgZmllbGRzIGFyZSB1bnVzZWQgYnkgTGludXggKi8KKwl3YWtlLnRpbWUudG1fd2RheSA9IC0xOworCXdha2UudGltZS50bV95ZGF5ID0gLTE7CisJd2FrZS50aW1lLnRtX2lzZHN0ID0gLTE7CisKKwkvKiBtYW55IHJ0YyBhbGFybXMgb25seSBzdXBwb3J0IHVwIHRvIDI0IGhvdXJzIGZyb20gJ25vdycsCisJICogc28gdXNlIHRoZSAibW9yZSB0aGFuIDI0IGhvdXJzIiByZXF1ZXN0IG9ubHkgaWYgd2UgbXVzdAorCSAqLworCWlmICgocnRjX3RpbWUgKyAoMjQgKiA2MCAqIDYwKSkgPiAqd2FrZXVwKSB7CisJCXhpb2N0bChmZCwgUlRDX0FMTV9TRVQsICZ3YWtlLnRpbWUpOworCQl4aW9jdGwoZmQsIFJUQ19BSUVfT04sIDApOworCX0gZWxzZSB7CisJCS8qIGF2b2lkIGFuIGV4dHJhIEFJRV9PTiBjYWxsICovCisJCXdha2UuZW5hYmxlZCA9IDE7CisJCXhpb2N0bChmZCwgUlRDX1dLQUxNX1NFVCwgJndha2UpOworCX0KK30KKworI2RlZmluZSBSVENXQUtFX09QVF9BVVRPICAgICAgICAgMHgwMQorI2RlZmluZSBSVENXQUtFX09QVF9MT0NBTCAgICAgICAgMHgwMgorI2RlZmluZSBSVENXQUtFX09QVF9VVEMgICAgICAgICAgMHgwNAorI2RlZmluZSBSVENXQUtFX09QVF9ERVZJQ0UgICAgICAgMHgwOAorI2RlZmluZSBSVENXQUtFX09QVF9TVVNQRU5EX01PREUgMHgxMAorI2RlZmluZSBSVENXQUtFX09QVF9TRUNPTkRTICAgICAgMHgyMAorI2RlZmluZSBSVENXQUtFX09QVF9USU1FICAgICAgICAgMHg0MAorCitpbnQgcnRjd2FrZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnRjd2FrZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdGltZV90IHJ0Y190aW1lOworCisJdW5zaWduZWQgb3B0OworCWNvbnN0IGNoYXIgKnJ0Y25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnN1c3BlbmQ7CisJY29uc3QgY2hhciAqb3B0X3NlY29uZHM7CisJY29uc3QgY2hhciAqb3B0X3RpbWU7CisKKwl0aW1lX3Qgc3lzX3RpbWU7CisJdGltZV90IGFsYXJtX3RpbWUgPSAwOworCXVuc2lnbmVkIHNlY29uZHMgPSAwOworCWludCB1dGMgPSAtMTsKKwlpbnQgZmQ7CisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgcnRjd2FrZV9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJhdXRvXDAiICAgIE5vX2FyZ3VtZW50ICJhIgorCQkibG9jYWxcMCIgICBOb19hcmd1bWVudCAibCIKKwkJInV0Y1wwIiAgICAgTm9fYXJndW1lbnQgInUiCisJCSJkZXZpY2VcMCIgIFJlcXVpcmVkX2FyZ3VtZW50ICJkIgorCQkibW9kZVwwIiAgICBSZXF1aXJlZF9hcmd1bWVudCAibSIKKwkJInNlY29uZHNcMCIgUmVxdWlyZWRfYXJndW1lbnQgInMiCisJCSJ0aW1lXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCQk7CisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHJ0Y3dha2VfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYWx1ZDptOnM6dDoiLCAmcnRjbmFtZSwgJnN1c3BlbmQsICZvcHRfc2Vjb25kcywgJm9wdF90aW1lKTsKKworCS8qIHRoaXMgaXMgdGhlIGRlZmF1bHQKKwlpZiAob3B0ICYgUlRDV0FLRV9PUFRfQVVUTykKKwkJdXRjID0gLTE7CisJKi8KKwlpZiAob3B0ICYgKFJUQ1dBS0VfT1BUX1VUQyB8IFJUQ1dBS0VfT1BUX0xPQ0FMKSkKKwkJdXRjID0gb3B0ICYgUlRDV0FLRV9PUFRfVVRDOworCWlmICghKG9wdCAmIFJUQ1dBS0VfT1BUX1NVU1BFTkRfTU9ERSkpCisJCXN1c3BlbmQgPSBERUZBVUxUX01PREU7CisJaWYgKG9wdCAmIFJUQ1dBS0VfT1BUX1NFQ09ORFMpCisJCS8qIGFsYXJtIHRpbWUsIHNlY29uZHMtdG8tc2xlZXAgKHJlbGF0aXZlKSAqLworCQlzZWNvbmRzID0geGF0b2kob3B0X3NlY29uZHMpOworCWlmIChvcHQgJiBSVENXQUtFX09QVF9USU1FKQorCQkvKiBhbGFybSB0aW1lLCB0aW1lX3QgKGFic29sdXRlLCBzZWNvbmRzIHNpbmNlIDEvMSAxOTcwIFVUQykgKi8KKwkJYWxhcm1fdGltZSA9IHhhdG9sKG9wdF90aW1lKTsKKworCWlmICghYWxhcm1fdGltZSAmJiAhc2Vjb25kcykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm11c3QgcHJvdmlkZSB3YWtlIHRpbWUiKTsKKworCWlmICh1dGMgPT0gLTEpCisJCXV0YyA9IHJ0Y19hZGp0aW1lX2lzX3V0YygpOworCisJLyogdGhlIHJ0Y25hbWUgaXMgcmVsYXRpdmUgdG8gL2RldiAqLworCXhjaGRpcigiL2RldiIpOworCisJLyogdGhpcyBSVEMgbXVzdCBleGlzdCBhbmQgKGlmIHdlJ2xsIHNsZWVwKSBiZSB3YWtldXAtZW5hYmxlZCAqLworCWZkID0gcnRjX3hvcGVuKCZydGNuYW1lLCBPX1JET05MWSk7CisKKwlpZiAoc3RyY21wKHN1c3BlbmQsICJvbiIpICYmICFtYXlfd2FrZXVwKHJ0Y25hbWUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgbm90IGVuYWJsZWQgZm9yIHdha2V1cCBldmVudHMiLCBydGNuYW1lKTsKKworCS8qIHJlbGF0aXZlIG9yIGFic29sdXRlIGFsYXJtIHRpbWUsIG5vcm1hbGl6ZWQgdG8gdGltZV90ICovCisJc3lzX3RpbWUgPSB0aW1lKE5VTEwpOworCXsKKwkJc3RydWN0IHRtIHRtX3RpbWU7CisJCXJ0Y19yZWFkX3RtKCZ0bV90aW1lLCBmZCk7CisJCXJ0Y190aW1lID0gcnRjX3RtMnRpbWUoJnRtX3RpbWUsIHV0Yyk7CisJfQorCisKKwlpZiAoYWxhcm1fdGltZSkgeworCQlpZiAoYWxhcm1fdGltZSA8IHN5c190aW1lKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRpbWUgZG9lc24ndCBnbyBiYWNrd2FyZCB0byAlcyIsIGN0aW1lKCZhbGFybV90aW1lKSk7CisJCWFsYXJtX3RpbWUgKz0gc3lzX3RpbWUgLSBydGNfdGltZTsKKwl9IGVsc2UKKwkJYWxhcm1fdGltZSA9IHJ0Y190aW1lICsgc2Vjb25kcyArIDE7CisJc2V0dXBfYWxhcm0oZmQsICZhbGFybV90aW1lLCBydGNfdGltZSk7CisKKwlzeW5jKCk7CisJcHJpbnRmKCJ3YWtldXAgZnJvbSBcIiVzXCIgYXQgJXMiLCBzdXNwZW5kLCBjdGltZSgmYWxhcm1fdGltZSkpOworCWZmbHVzaF9hbGwoKTsKKwl1c2xlZXAoMTAgKiAxMDAwKTsKKworCWlmIChzdHJjbXAoc3VzcGVuZCwgIm9uIikpCisJCXhvcGVuX3h3cml0ZV9jbG9zZShTWVNfUE9XRVJfUEFUSCwgc3VzcGVuZCk7CisJZWxzZSB7CisJCS8qICJmYWtlIiBzdXNwZW5kIC4uLiB3ZSdsbCBkbyB0aGUgZGVsYXkgb3Vyc2VsdmVzICovCisJCXVuc2lnbmVkIGxvbmcgZGF0YTsKKworCQlkbyB7CisJCQlzc2l6ZV90IHJldCA9IHNhZmVfcmVhZChmZCwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coInJ0YyByZWFkIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKCEoZGF0YSAmIFJUQ19BRikpOworCX0KKworCXhpb2N0bChmZCwgUlRDX0FJRV9PRkYsIDApOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9zY3JpcHQuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvc2NyaXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiOTkxZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvc2NyaXB0LmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNjcmlwdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIHBhc2NhbC5iZWxsYXJkQGFkcy1sdS5jb20KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gdXRpbC1saW51eCB2IDIuMTJyCisgKiBDb3B5cmlnaHQgKGMpIDE5ODAKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNjcmlwdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hZnEiIElGX1NDUklQVFJFUExBWSgidCIpICJdIFstYyBQUk9HXSBbT1VURklMRV0iCisvL3VzYWdlOiNkZWZpbmUgc2NyaXB0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCUFwcGVuZCBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1jIFBST0cJUnVuIFBST0csIG5vdCBzaGVsbCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRmx1c2ggb3V0cHV0IGFmdGVyIGVhY2ggd3JpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorLy91c2FnZToJSUZfU0NSSVBUUkVQTEFZKAorLy91c2FnZTogICAgICJcbgktdAlTZW5kIHRpbWluZyB0byBzdGRlcnIiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgc2NyaXB0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzY3JpcHRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBvcHQ7CisJaW50IG1vZGU7CisJaW50IGNoaWxkX3BpZDsKKwlpbnQgYXR0cl9vazsgLyogTkI6IDA6IG9rICovCisJaW50IHdpbnN6X29rOworCWludCBwdHk7CisJY2hhciBwdHlfbGluZVtHRVRQVFlfQlVGU0laRV07CisJc3RydWN0IHRlcm1pb3MgdHQsIHJ0dDsKKwlzdHJ1Y3Qgd2luc2l6ZSB3aW47CisJY29uc3QgY2hhciAqZm5hbWUgPSAidHlwZXNjcmlwdCI7CisJY29uc3QgY2hhciAqc2hlbGw7CisJY2hhciBzaGVsbF9vcHRbXSA9ICItaSI7CisJY2hhciAqc2hlbGxfYXJnID0gTlVMTDsKKwllbnVtIHsKKwkJT1BUX2EgPSAoMSA8PCAwKSwKKwkJT1BUX2MgPSAoMSA8PCAxKSwKKwkJT1BUX2YgPSAoMSA8PCAyKSwKKwkJT1BUX3EgPSAoMSA8PCAzKSwKKwkJT1BUX3QgPSAoMSA8PCA0KSwKKwl9OworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIGdldG9wdF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJhcHBlbmRcMCIgIE5vX2FyZ3VtZW50ICAgICAgICJhIgorCQkiY29tbWFuZFwwIiBSZXF1aXJlZF9hcmd1bWVudCAiYyIKKwkJImZsdXNoXDAiICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJCSJxdWlldFwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJxIgorCQlJRl9TQ1JJUFRSRVBMQVkoInRpbWluZ1wwIiBOb19hcmd1bWVudCAidCIpCisJCTsKKworCWFwcGxldF9sb25nX29wdGlvbnMgPSBnZXRvcHRfbG9uZ29wdHM7CisjZW5kaWYKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xIjsgLyogbWF4IG9uZSBhcmcgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYWM6ZnEiIElGX1NDUklQVFJFUExBWSgidCIpICwgJnNoZWxsX2FyZyk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoYXJndlswXSkgeworCQlmbmFtZSA9IGFyZ3ZbMF07CisJfQorCW1vZGUgPSBPX0NSRUFUfE9fVFJVTkN8T19XUk9OTFk7CisJaWYgKG9wdCAmIE9QVF9hKSB7CisJCW1vZGUgPSBPX0NSRUFUfE9fQVBQRU5EfE9fV1JPTkxZOworCX0KKwlpZiAob3B0ICYgT1BUX2MpIHsKKwkJc2hlbGxfb3B0WzFdID0gJ2MnOworCX0KKwlpZiAoIShvcHQgJiBPUFRfcSkpIHsKKwkJcHJpbnRmKCJTY3JpcHQgc3RhcnRlZCwgZmlsZSBpcyAlc1xuIiwgZm5hbWUpOworCX0KKwlzaGVsbCA9IGdldF9zaGVsbF9uYW1lKCk7CisKKwlwdHkgPSB4Z2V0cHR5KHB0eV9saW5lKTsKKworCS8qIGdldCBjdXJyZW50IHN0ZGluJ3MgdHR5IHBhcmFtcyAqLworCWF0dHJfb2sgPSB0Y2dldGF0dHIoMCwgJnR0KTsKKwl3aW5zel9vayA9IGlvY3RsKDAsIFRJT0NHV0lOU1osIChjaGFyICopJndpbik7CisKKwlydHQgPSB0dDsKKwljZm1ha2VyYXcoJnJ0dCk7CisJcnR0LmNfbGZsYWcgJj0gfkVDSE87CisJdGNzZXRhdHRyKDAsIFRDU0FGTFVTSCwgJnJ0dCk7CisKKwkvKiAic2NyaXB0IiBmcm9tIHV0aWwtbGludXggZXhpdHMgd2hlbiBjaGlsZCBleGl0cywKKwkgKiB3ZSB3b3VsZG4ndCB3YWl0IGZvciBFT0YgZnJvbSBzbGF2ZSBwdHkKKwkgKiAob3V0cHV0IG1heSBiZSBwcm9kdWNlZCBieSBncmFuZGNoaWxkcmVuIG9mIGNoaWxkKSAqLworCXNpZ25hbChTSUdDSExELCByZWNvcmRfc2lnbm8pOworCisJLyogVE9ETzogU0lHV0lOQ0g/IHBhc3Mgd2luZG93IHNpemUgY2hhbmdlcyBkb3duIHRvIHNsYXZlPyAqLworCisJY2hpbGRfcGlkID0geHZmb3JrKCk7CisKKwlpZiAoY2hpbGRfcGlkKSB7CisJCS8qIHBhcmVudCAqLworI2RlZmluZSBidWYgYmJfY29tbW9uX2J1ZnNpejEKKwkJc3RydWN0IHBvbGxmZCBwZmRbMl07CisJCWludCBvdXRmZCwgY291bnQsIGxvb3A7CisJCWRvdWJsZSBvbGR0aW1lID0gRU5BQkxFX1NDUklQVFJFUExBWSA/IHRpbWUoTlVMTCkgOiAwOworCQlzbWFsbGludCBmZF9jb3VudCA9IDI7CisKKwkJb3V0ZmQgPSB4b3BlbihmbmFtZSwgbW9kZSk7CisJCXBmZFswXS5mZCA9IHB0eTsKKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJcGZkWzFdLmZkID0gU1RESU5fRklMRU5POworCQlwZmRbMV0uZXZlbnRzID0gUE9MTElOOworCQluZGVsYXlfb24ocHR5KTsgLyogdGhpcyBkZXNjcmlwdG9yIGlzIG5vdCBzaGFyZWQsIGNhbiBkbyB0aGlzICovCisJCS8qIG5kZWxheV9vbihTVERJTl9GSUxFTk8pOyAtIE5PLCBzdGRpbiBjYW4gYmUgc2hhcmVkISBQaXR5IDooICovCisKKwkJLyogY29weSBzdGRpbiB0byBwdHkgbWFzdGVyIGlucHV0LAorCQkgKiBjb3B5IHB0eSBtYXN0ZXIgb3V0cHV0IHRvIHN0ZG91dCBhbmQgZmlsZSAqLworCQkvKiBUT0RPOiBkb24ndCB1c2UgZnVsbF93cml0ZSdzLCB1c2UgcHJvcGVyIHdyaXRlIGJ1ZmZlcmluZyAqLworCQl3aGlsZSAoZmRfY291bnQgJiYgIWJiX2dvdF9zaWduYWwpIHsKKwkJCS8qIG5vdCBzYWZlX3BvbGwhIHdlIHdhbnQgU0lHQ0hMRCB0byBFSU5UUiBwb2xsICovCisJCQlpZiAocG9sbChwZmQsIGZkX2NvdW50LCAtMSkgPCAwICYmIGVycm5vICE9IEVJTlRSKSB7CisJCQkJLyogSWYgY2hpbGQgZXhpdHMgdG9vIHF1aWNrbHksIHdlIG1heSBnZXQgRUlPOgorCQkJCSAqIGZvciBleGFtcGxlLCB0cnkgInNjcmlwdCAtYyB0cnVlIiAqLworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBmZFswXS5yZXZlbnRzKSB7CisJCQkJZXJybm8gPSAwOworCQkJCWNvdW50ID0gc2FmZV9yZWFkKHB0eSwgYnVmLCBzaXplb2YoYnVmKSk7CisJCQkJaWYgKGNvdW50IDw9IDAgJiYgZXJybm8gIT0gRUFHQUlOKSB7CisJCQkJCS8qIGVyci9lb2YgZnJvbSBwdHk6IGV4aXQgKi8KKwkJCQkJZ290byByZXN0b3JlOworCQkJCX0KKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWlmIChFTkFCTEVfU0NSSVBUUkVQTEFZICYmIChvcHQgJiBPUFRfdCkpIHsKKwkJCQkJCXN0cnVjdCB0aW1ldmFsIHR2OworCQkJCQkJZG91YmxlIG5ld3RpbWU7CisKKwkJCQkJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQkJCQkJbmV3dGltZSA9IHR2LnR2X3NlYyArIChkb3VibGUpIHR2LnR2X3VzZWMgLyAxMDAwMDAwOworCQkJCQkJZnByaW50ZihzdGRlcnIsICIlZiAldVxuIiwgbmV3dGltZSAtIG9sZHRpbWUsIGNvdW50KTsKKwkJCQkJCW9sZHRpbWUgPSBuZXd0aW1lOworCQkJCQl9CisJCQkJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCBjb3VudCk7CisJCQkJCWZ1bGxfd3JpdGUob3V0ZmQsIGJ1ZiwgY291bnQpOworCQkJCQlpZiAob3B0ICYgT1BUX2YpIHsKKwkJCQkJCWZzeW5jKG91dGZkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChwZmRbMV0ucmV2ZW50cykgeworCQkJCWNvdW50ID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgYnVmLCBzaXplb2YoYnVmKSk7CisJCQkJaWYgKGNvdW50IDw9IDApIHsKKwkJCQkJLyogZXJyL2VvZiBmcm9tIHN0ZGluOiBkb24ndCByZWFkIHN0ZGluIGFueW1vcmUgKi8KKwkJCQkJcGZkWzFdLnJldmVudHMgPSAwOworCQkJCQlmZF9jb3VudC0tOworCQkJCX0gZWxzZSB7CisJCQkJCWZ1bGxfd3JpdGUocHR5LCBidWYsIGNvdW50KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogSWYgbG9vcCB3YXMgZXhpdGVkIGJlY2F1c2UgU0lHQ0hMRCBoYW5kbGVyIHNldCBiYl9nb3Rfc2lnbmFsLAorCQkgKiB0aGVyZSBzdGlsbCBjYW4gYmUgc29tZSBidWZmZXJlZCBvdXRwdXQuIEJ1dCBkb250IGxvb3AgZm9yZXZlcjoKKwkJICogd2Ugd29uJ3QgcHVtcCBvcnBoYW5lZCBncmFuZGNoaWxkcmVuJ3Mgb3V0cHV0IGluZGVmaW5pdGVseS4KKwkJICogVGVzdGNhc2U6IHJ1bm5pbmcgdGhpcyBpbiBzY3JpcHQ6CisJCSAqICAgICAgZXhlYyBkZCBpZj0vZGV2L3plcm8gYnM9MU0gY291bnQ9MQorCQkgKiBtdXN0IGhhdmUgIjErMCByZWNvcmRzIGluLCAxKzAgcmVjb3JkcyBvdXQiIGNhcHR1cmVkIHRvby4KKwkJICogKHV0aWwtbGludXgncyBzY3JpcHQgZG9lc24ndCBkbyB0aGlzLiBidWdneSA6KSAqLworCQlsb29wID0gOTk5OworCQkvKiBwdHkgaXMgaW4gT19OT05CTE9DSyBtb2RlLCB3ZSBleGl0IGFzIHNvb24gYXMgYnVmZmVyIGlzIGVtcHR5ICovCisJCXdoaWxlICgtLWxvb3AgJiYgKGNvdW50ID0gc2FmZV9yZWFkKHB0eSwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkgeworCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBidWYsIGNvdW50KTsKKwkJCWZ1bGxfd3JpdGUob3V0ZmQsIGJ1ZiwgY291bnQpOworCQl9CisgcmVzdG9yZToKKwkJaWYgKGF0dHJfb2sgPT0gMCkKKwkJCXRjc2V0YXR0cigwLCBUQ1NBRkxVU0gsICZ0dCk7CisJCWlmICghKG9wdCAmIE9QVF9xKSkKKwkJCXByaW50ZigiU2NyaXB0IGRvbmUsIGZpbGUgaXMgJXNcbiIsIGZuYW1lKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBjaGlsZDogbWFrZSBwdHkgc2xhdmUgdG8gYmUgaW5wdXQsIG91dHB1dCwgZXJyb3I7IHJ1biBzaGVsbCAqLworCWNsb3NlKHB0eSk7IC8qIGNsb3NlIHB0eSBtYXN0ZXIgKi8KKwkvKiBvcGVuIHB0eSBzbGF2ZSB0byBmZCAwLDEsMiAqLworCWNsb3NlKDApOworCXhvcGVuKHB0eV9saW5lLCBPX1JEV1IpOyAvKiB1c2VzIGZkIDAgKi8KKwl4ZHVwMigwLCAxKTsKKwl4ZHVwMigwLCAyKTsKKwkvKiBjb3B5IG91ciBvcmlnaW5hbCBzdGRpbiB0dHkncyBwYXJhbWV0ZXJzIHRvIHB0eSAqLworCWlmIChhdHRyX29rID09IDApCisJCXRjc2V0YXR0cigwLCBUQ1NBRkxVU0gsICZ0dCk7CisJaWYgKHdpbnN6X29rID09IDApCisJCWlvY3RsKDAsIFRJT0NTV0lOU1osIChjaGFyICopJndpbik7CisJLyogc2V0IHB0eSBhcyBhIGNvbnRyb2xsaW5nIHR0eSAqLworCXNldHNpZCgpOworCWlvY3RsKDAsIFRJT0NTQ1RUWSwgMCAvKiAwOiBkb24ndCBmb3JjaWJseSBzdGVhbCAqLyk7CisKKwkvKiBOb24taWdub3JlZCBzaWduYWxzIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMgYW55d2F5ICovCisJLypzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7Ki8KKwlleGVjbChzaGVsbCwgc2hlbGwsIHNoZWxsX29wdCwgc2hlbGxfYXJnLCAoY2hhciAqKSBOVUxMKTsKKwliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKHNoZWxsKTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvc2NyaXB0cmVwbGF5LmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3NjcmlwdHJlcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmY1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3NjcmlwdHJlcGxheS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNjcmlwdHJlcGxheSAtIHBsYXkgYmFjayB0eXBlc2NyaXB0cywgdXNpbmcgdGltaW5nIGluZm9ybWF0aW9uCisgKgorICogcGFzY2FsLmJlbGxhcmRAYWRzLWx1LmNvbQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzY3JpcHRyZXBsYXlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInRpbWluZ2ZpbGUgW3R5cGVzY3JpcHQgW2Rpdmlzb3JdXSIKKy8vdXNhZ2U6I2RlZmluZSBzY3JpcHRyZXBsYXlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQbGF5IGJhY2sgdHlwZXNjcmlwdHMsIHVzaW5nIHRpbWluZyBpbmZvcm1hdGlvbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzY3JpcHRyZXBsYXlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNjcmlwdHJlcGxheV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqc2NyaXB0ID0gInR5cGVzY3JpcHQiOworCWRvdWJsZSBkZWxheSwgZmFjdG9yID0gMTAwMDAwMC4wOworCWludCBmZDsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCUZJTEUgKnRmcDsKKworCWlmICghYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJaWYgKGFyZ3ZbMl0pIHsKKwkJc2NyaXB0ID0gYXJndlsyXTsKKwkJaWYgKGFyZ3ZbM10pCisJCQlmYWN0b3IgLz0gYXRvZihhcmd2WzNdKTsKKwl9CisKKwl0ZnAgPSB4Zm9wZW5fZm9yX3JlYWQoYXJndlsxXSk7CisJZmQgPSB4b3BlbihzY3JpcHQsIE9fUkRPTkxZKTsKKwl3aGlsZSAoZnNjYW5mKHRmcCwgIiVsZiAlbHVcbiIsICZkZWxheSwgJmNvdW50KSA9PSAyKSB7CisJCXVzbGVlcChkZWxheSAqIGZhY3Rvcik7CisJCWJiX2NvcHlmZF9leGFjdF9zaXplKGZkLCBTVERPVVRfRklMRU5PLCBjb3VudCk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShmZCk7CisJCWZjbG9zZSh0ZnApOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9zZXRhcmNoLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3NldGFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk0MjFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9zZXRhcmNoLmMKQEAgLTAsMCArMSw2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGludXgzMi9saW51eDY0IGFsbG93cyBmb3IgY2hhbmdpbmcgdW5hbWUgZW11bGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRhcmNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJwZXJzb25hbGl0eSBQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgc2V0YXJjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBlcnNvbmFsaXR5IG1heSBiZTpcbiIKKy8vdXNhZ2U6ICAgICAgICIJbGludXgzMgkJU2V0IDMyYml0IHVuYW1lIGVtdWxhdGlvblxuIgorLy91c2FnZTogICAgICAgIglsaW51eDY0CQlTZXQgNjRiaXQgdW5hbWUgZW11bGF0aW9uIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsaW51eDMyX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBsaW51eDMyX2Z1bGxfdXNhZ2UgIiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbGludXg2NF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgbGludXg2NF9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlIDxzeXMvcGVyc29uYWxpdHkuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzZXRhcmNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRhcmNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcGVyczsKKworCS8qIEZpZ3VyZSBvdXQgd2hhdCBwZXJzb25hbGl0eSB3ZSBhcmUgc3VwcG9zZWQgdG8gc3dpdGNoIHRvIC4uLgorCSAqIHdlIGNhbiBiZSBpbnZva2VkIGFzIGVpdGhlcjoKKwkgKiBhcmd2WzBdLGFyZ3ZbMV0gPT0gInNldGFyY2giLCJwZXJzb25hbGl0eSIKKwkgKiBhcmd2WzBdICAgICAgICAgPT0gInBlcnNvbmFsaXR5IgorCSAqLworCWlmIChFTkFCTEVfU0VUQVJDSCAmJiBhcHBsZXRfbmFtZVswXSA9PSAncycKKwkgJiYgYXJndlsxXSAmJiBzdHJuY3B5KGFyZ3ZbMV0sICJsaW51eCIsIDUpCisJKSB7CisJCWFwcGxldF9uYW1lID0gYXJndlsxXTsKKwkJYXJndisrOworCX0KKwlpZiAoYXBwbGV0X25hbWVbNV0gPT0gJzYnKSAvKiBsaW51eDY0ICovCisJCXBlcnMgPSBQRVJfTElOVVg7CisJZWxzZSBpZiAoYXBwbGV0X25hbWVbNV0gPT0gJzMnKSAvKiBsaW51eDMyICovCisJCXBlcnMgPSBQRVJfTElOVVgzMjsKKwllbHNlCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWFyZ3YrKzsKKwlpZiAoYXJndlswXSA9PSBOVUxMKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwkvKiBUcnkgdG8gc2V0IHBlcnNvbmFsaXR5ICovCisJaWYgKHBlcnNvbmFsaXR5KHBlcnMpID49IDApIHsKKwkJLyogVHJ5IHRvIGV4ZWN1dGUgdGhlIHByb2dyYW0gKi8KKwkJQkJfRVhFQ1ZQKGFyZ3ZbMF0sIGFyZ3YpOworCX0KKworCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3N3YXBvbm9mZi5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9zd2Fwb25vZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTNlMjRjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC9zd2Fwb25vZmYuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzd2Fwb24vc3dhcG9mZiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb25fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYV0iIElGX0ZFQVRVUkVfU1dBUE9OX1BSSSgiIFstcCBQUkldIikgIiBbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdGFydCBzd2FwcGluZyBvbiBERVZJQ0VcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU3RhcnQgc3dhcHBpbmcgb24gYWxsIHN3YXAgZGV2aWNlcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1dBUE9OX1BSSSgKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUFJJCVNldCBzd2FwIGRldmljZSBwcmlvcml0eSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc3dhcG9mZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hXSBbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb2ZmX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3RvcCBzd2FwcGluZyBvbiBERVZJQ0VcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU3RvcCBzd2FwcGluZyBvbiBhbGwgc3dhcCBkZXZpY2VzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxzeXMvc3dhcC5oPgorI2lmbmRlZiBfX0JJT05JQ19fCisjIGluY2x1ZGUgPHN5cy9zd2FwLmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX01PVU5UX0xBQkVMCisjIGluY2x1ZGUgInZvbHVtZV9pZC5oIgorI2Vsc2UKKyMgZGVmaW5lIHJlc29sdmVfbW91bnRfc3BlYyhmc25hbWUpICgodm9pZCkwKQorI2VuZGlmCisKKyNpZm5kZWYgTU5UVFlQRV9TV0FQCisjIGRlZmluZSBNTlRUWVBFX1NXQVAgInN3YXAiCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NXQVBPTl9QUkkKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgZmxhZ3M7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBnX2ZsYWdzIChHLmZsYWdzKQorI2Vsc2UKKyNkZWZpbmUgZ19mbGFncyAwCisjZW5kaWYKKworc3RhdGljIGludCBzd2FwX2VuYWJsZV9kaXNhYmxlKGNoYXIgKmRldmljZSkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBzdGF0IHN0OworCisJcmVzb2x2ZV9tb3VudF9zcGVjKCZkZXZpY2UpOworCXhzdGF0KGRldmljZSwgJnN0KTsKKworI2lmIEVOQUJMRV9ERVNLVE9QCisJLyogdGVzdCBmb3IgaG9sZXMgKi8KKwlpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJaWYgKHN0LnN0X2Jsb2NrcyAqIChvZmZfdCk1MTIgPCBzdC5zdF9zaXplKQorCQkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBzd2FwIGZpbGUgaGFzIGhvbGVzIik7CisjZW5kaWYKKworCWlmIChhcHBsZXRfbmFtZVs1XSA9PSAnbicpCisJCXN0YXR1cyA9IHN3YXBvbihkZXZpY2UsIGdfZmxhZ3MpOworCWVsc2UKKwkJc3RhdHVzID0gc3dhcG9mZihkZXZpY2UpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGRldmljZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2VtX2FsbCh2b2lkKQoreworCXN0cnVjdCBtbnRlbnQgKm07CisJRklMRSAqZjsKKwlpbnQgZXJyOworCisJZiA9IHNldG1udGVudCgiL2V0Yy9mc3RhYiIsICJyIik7CisJaWYgKGYgPT0gTlVMTCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCIvZXRjL2ZzdGFiIik7CisKKwllcnIgPSAwOworCXdoaWxlICgobSA9IGdldG1udGVudChmKSkgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKG0tPm1udF90eXBlLCBNTlRUWVBFX1NXQVApID09IDApIHsKKwkJCS8qIHN3YXBvbiAtYSBzaG91bGQgaWdub3JlIGVudHJpZXMgd2l0aCBub2F1dG8sCisJCQkgKiBidXQgc3dhcG9mZiAtYSBzaG91bGQgcHJvY2VzcyB0aGVtICovCisJCQlpZiAoYXBwbGV0X25hbWVbNV0gIT0gJ24nCisJCQkgfHwgaGFzbW50b3B0KG0sIE1OVE9QVF9OT0FVVE8pID09IE5VTEwKKwkJCSkgeworCQkJCWVyciArPSBzd2FwX2VuYWJsZV9kaXNhYmxlKG0tPm1udF9mc25hbWUpOworCQkJfQorCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQllbmRtbnRlbnQoZik7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgc3dhcF9vbl9vZmZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN3YXBfb25fb2ZmX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0OworCisjaWYgIUVOQUJMRV9GRUFUVVJFX1NXQVBPTl9QUkkKKwlyZXQgPSBnZXRvcHQzMihhcmd2LCAiYSIpOworI2Vsc2UKKwlpZiAoYXBwbGV0X25hbWVbNV0gPT0gJ24nKQorCQlvcHRfY29tcGxlbWVudGFyeSA9ICJwKyI7CisJcmV0ID0gZ2V0b3B0MzIoYXJndiwgKGFwcGxldF9uYW1lWzVdID09ICduJykgPyAiYXA6IiA6ICJhIiwgJmdfZmxhZ3MpOworCisJaWYgKHJldCAmIDIpIHsgLy8gLXAKKwkJZ19mbGFncyA9IFNXQVBfRkxBR19QUkVGRVIgfAorCQkJKChnX2ZsYWdzICYgU1dBUF9GTEFHX1BSSU9fTUFTSykgPDwgU1dBUF9GTEFHX1BSSU9fU0hJRlQpOworCQlyZXQgJj0gMTsKKwl9CisjZW5kaWYKKworCWlmIChyZXQgLyogJiAxOiBub3QgbmVlZGVkICovKSAvLyAtYQorCQlyZXR1cm4gZG9fZW1fYWxsKCk7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisKKwkvKiByZXQgPSAwOyByZWR1bmRhbnQgKi8KKwlkbyB7CisJCXJldCArPSBzd2FwX2VuYWJsZV9kaXNhYmxlKCphcmd2KTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3N3aXRjaF9yb290LmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3N3aXRjaF9yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2YWUzNQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvc3dpdGNoX3Jvb3QuYwpAQCAtMCwwICsxLDIxOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgMjAwNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFN3aXRjaCBmcm9tIHJvb3RmcyB0byBhbm90aGVyIGZpbGVzeXN0ZW0gYXMgdGhlIHJvb3Qgb2YgdGhlIG1vdW50IHRyZWUuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3dpdGNoX3Jvb3RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyAvZGV2L2NvbnNvbGVdIE5FV19ST09UIE5FV19JTklUIFtBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSBzd2l0Y2hfcm9vdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZyZWUgaW5pdHJhbWZzIGFuZCBzd2l0Y2ggdG8gYW5vdGhlciByb290IGZzOlxuIgorLy91c2FnZTogICAgICAgImNocm9vdCB0byBORVdfUk9PVCwgZGVsZXRlIGFsbCBpbiAvLCBtb3ZlIE5FV19ST09UIHRvIC8sXG4iCisvL3VzYWdlOiAgICAgICAiZXhlY3V0ZSBORVdfSU5JVC4gUElEIG11c3QgYmUgMS4gTkVXX1JPT1QgbXVzdCBiZSBhIG1vdW50cG9pbnQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jIERFVglSZW9wZW4gc3RkaW8gdG8gREVWIGFmdGVyIHN3aXRjaCIKKworI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorLy8gTWFrZSB1cCBmb3IgaGVhZGVyIGRlZmljaWVuY2llcworI2lmbmRlZiBSQU1GU19NQUdJQworIyBkZWZpbmUgUkFNRlNfTUFHSUMgKCh1bnNpZ25lZCkweDg1ODQ1OGY2KQorI2VuZGlmCisjaWZuZGVmIFRNUEZTX01BR0lDCisjIGRlZmluZSBUTVBGU19NQUdJQyAoKHVuc2lnbmVkKTB4MDEwMjE5OTQpCisjZW5kaWYKKyNpZm5kZWYgTVNfTU9WRQorIyBkZWZpbmUgTVNfTU9WRSAgICAgODE5MgorI2VuZGlmCisKKy8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBjb250ZW50cyBvZiByb290ZnMKK3N0YXRpYyB2b2lkIGRlbGV0ZV9jb250ZW50cyhjb25zdCBjaGFyICpkaXJlY3RvcnksIGRldl90IHJvb3RkZXYpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCS8vIERvbid0IGRlc2NlbmQgaW50byBvdGhlciBmaWxlc3lzdGVtcworCWlmIChsc3RhdChkaXJlY3RvcnksICZzdCkgfHwgc3Quc3RfZGV2ICE9IHJvb3RkZXYpCisJCXJldHVybjsKKworCS8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgY29udGVudHMgb2YgZGlyZWN0b3JpZXMKKwlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQlkaXIgPSBvcGVuZGlyKGRpcmVjdG9yeSk7CisJCWlmIChkaXIpIHsKKwkJCXdoaWxlICgoZCA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJCQljaGFyICpuZXdkaXIgPSBkLT5kX25hbWU7CisKKwkJCQkvLyBTa2lwIC4gYW5kIC4uCisJCQkJaWYgKERPVF9PUl9ET1RET1QobmV3ZGlyKSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBSZWN1cnNlIHRvIGRlbGV0ZSBjb250ZW50cworCQkJCW5ld2RpciA9IGNvbmNhdF9wYXRoX2ZpbGUoZGlyZWN0b3J5LCBuZXdkaXIpOworCQkJCWRlbGV0ZV9jb250ZW50cyhuZXdkaXIsIHJvb3RkZXYpOworCQkJCWZyZWUobmV3ZGlyKTsKKwkJCX0KKwkJCWNsb3NlZGlyKGRpcik7CisKKwkJCS8vIERpcmVjdG9yeSBzaG91bGQgbm93IGJlIGVtcHR5LCB6YXAgaXQKKwkJCXJtZGlyKGRpcmVjdG9yeSk7CisJCX0KKwl9IGVsc2UgeworCQkvLyBJdCB3YXNuJ3QgYSBkaXJlY3RvcnksIHphcCBpdAorCQl1bmxpbmsoZGlyZWN0b3J5KTsKKwl9Cit9CisKK2ludCBzd2l0Y2hfcm9vdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3dpdGNoX3Jvb3RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm5ld3Jvb3QsICpjb25zb2xlID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisJZGV2X3Qgcm9vdGRldjsKKworCS8vIFBhcnNlIGFyZ3MgKC1jIGNvbnNvbGUpCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTIiOyAvLyBtaW5pbXVtIDIgcGFyYW1zCisJZ2V0b3B0MzIoYXJndiwgIitjOiIsICZjb25zb2xlKTsgLy8gJysnOiBzdG9wIGF0IGZpcnN0IG5vbi1vcHRpb24KKwlhcmd2ICs9IG9wdGluZDsKKwluZXdyb290ID0gKmFyZ3YrKzsKKworCS8vIENoYW5nZSB0byBuZXcgcm9vdCBkaXJlY3RvcnkgYW5kIHZlcmlmeSBpdCdzIGEgZGlmZmVyZW50IGZzCisJeGNoZGlyKG5ld3Jvb3QpOworCXhzdGF0KCIvIiwgJnN0KTsKKwlyb290ZGV2ID0gc3Quc3RfZGV2OworCXhzdGF0KCIuIiwgJnN0KTsKKwlpZiAoc3Quc3RfZGV2ID09IHJvb3RkZXYgfHwgZ2V0cGlkKCkgIT0gMSkgeworCQkvLyBTaG93IHVzYWdlLCBpdCBzYXlzIG5ldyByb290IG11c3QgYmUgYSBtb3VudHBvaW50CisJCS8vIGFuZCB3ZSBtdXN0IGJlIFBJRCAxCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvLyBBZGRpdGlvbmFsIHNhbml0eSBjaGVja3M6IHdlJ3JlIGFib3V0IHRvIHJtIC1yZiAvLCBzbyBiZSBSRUFMTFkgU1VSRQorCS8vIHdlIG1lYW4gaXQuIEkgY291bGQgbWFrZSB0aGlzIGEgQ09ORklHIG9wdGlvbiwgYnV0IEkgd291bGQgZ2V0IGVtYWlsCisJLy8gZnJvbSBhbGwgdGhlIHBlb3BsZSB3aG8gV0lMTCBkZXN0cm95IHRoZWlyIGZpbGVzeXN0ZW1zLgorCWlmIChzdGF0KCIvaW5pdCIsICZzdCkgIT0gMCB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiL2luaXQgaXMgbm90IGEgcmVndWxhciBmaWxlIik7CisJfQorCXN0YXRmcygiLyIsICZzdGZzKTsgLy8gdGhpcyBuZXZlciBmYWlscworCWlmICgodW5zaWduZWQpc3Rmcy5mX3R5cGUgIT0gUkFNRlNfTUFHSUMKKwkgJiYgKHVuc2lnbmVkKXN0ZnMuZl90eXBlICE9IFRNUEZTX01BR0lDCisJKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJyb290IGZpbGVzeXN0ZW0gaXMgbm90IHJhbWZzL3RtcGZzIik7CisJfQorCisJLy8gWmFwIGV2ZXJ5dGhpbmcgb3V0IG9mIHJvb3RkZXYKKwlkZWxldGVfY29udGVudHMoIi8iLCByb290ZGV2KTsKKworCS8vIE92ZXJtb3VudCAvIHdpdGggbmV3ZGlyIGFuZCBjaHJvb3QgaW50byBpdAorCWlmIChtb3VudCgiLiIsICIvIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCkpIHsKKwkJLy8gRm9yIGV4YW1wbGUsIGZhaWxzIHdoZW4gbmV3cm9vdCBpcyBub3QgYSBtb3VudHBvaW50CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgbW92aW5nIHJvb3QiKTsKKwl9CisJeGNocm9vdCgiLiIpOworCS8vIFRoZSBjaGRpciBpcyBuZWVkZWQgdG8gcmVjYWxjdWxhdGUgIi4iIGFuZCAiLi4iIGxpbmtzCisJeGNoZGlyKCIvIik7CisKKwkvLyBJZiBhIG5ldyBjb25zb2xlIHNwZWNpZmllZCwgcmVkaXJlY3Qgc3RkaW4vc3Rkb3V0L3N0ZGVyciB0byBpdAorCWlmIChjb25zb2xlKSB7CisJCWNsb3NlKDApOworCQl4b3Blbihjb25zb2xlLCBPX1JEV1IpOworCQl4ZHVwMigwLCAxKTsKKwkJeGR1cDIoMCwgMik7CisJfQorCisJLy8gRXhlYyByZWFsIGluaXQKKwlleGVjdihhcmd2WzBdLCBhcmd2KTsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIGFyZ3ZbMF0pOworfQorCisvKgorRnJvbTogUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KK0RhdGU6IFR1ZSwgSnVuIDE2LCAyMDA5IGF0IDc6NDcgUE0KK1N1YmplY3Q6IFJlOiBzd2l0Y2hfcm9vdC4uLgorCisuLi4KKy4uLgorLi4uCisKK0lmIHlvdSdyZSBfbm90XyBydW5uaW5nIG91dCBvZiBpbml0X3JhbWZzIChpZiBmb3IgZXhhbXBsZSB5b3UncmUgdXNpbmcgaW5pdHJkCitpbnN0ZWFkKSwgeW91IHByb2JhYmx5IHNob3VsZG4ndCB1c2Ugc3dpdGNoX3Jvb3QgYmVjYXVzZSBpdCdzIHRoZSB3cm9uZyB0b29sLgorCitCYXNpY2FsbHkgd2hhdCB0aGUgc3Vja2VyIGRvZXMgaXMgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBzaGVsbCBzY3JpcHQ6CisKKyBmaW5kIC8gLXhkZXYgfCB4YXJncyBybSAtcmYKKyBjZCAiJDEiCisgc2hpZnQKKyBtb3VudCAtLW1vdmUgLiAvCisgZXhlYyBjaHJvb3QgLiAiJEAiCisKK1RoZXJlIGFyZSBhIGNvdXBsZSByZWFzb25zIHRoYXQgd29uJ3Qgd29yayBhcyBhIHNoZWxsIHNjcmlwdDoKKworMSkgSWYgeW91IGRlbGV0ZSB0aGUgY29tbWFuZHMgb3V0IG9mIHlvdXIgJFBBVEgsIHlvdXIgc2hlbGwgc2NyaXB0cyBjYW4ndCBydW4KK21vcmUgY29tbWFuZHMsIGJ1dCB5b3UgY2FuJ3Qgc3RhcnQgdXNpbmcgZHluYW1pY2FsbHkgbGlua2VkIF9uZXdfIGNvbW1hbmRzCit1bnRpbCBhZnRlciB5b3UgZG8gdGhlIGNocm9vdCBiZWNhdXNlIHRoZSBwYXRoIHRvIHRoZSBkeW5hbWljIGxpbmtlciBpcyB3cm9uZy4KK1NvIHRoZXJlJ3MgYSBzdGVwIHRoYXQgbmVlZHMgdG8gYmUgc29ydCBvZiBhdG9taWMgYnV0IGNhbid0IGJlIGFzIGEgc2hlbGwKK3NjcmlwdC4gIChZb3UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgd2l0aCBzdGF0aWMgbGlua2luZyBvciB2ZXJ5IGNhcmVmdWxseSBsYWlkCitvdXQgcGF0aHMgYW5kIHNlcXVlbmNpbmcsIGJ1dCBpdCdzIGJyaXR0bGUsIHVnbHksIGFuZCBub24tb2J2aW91cy4pCisKKzIpIFRoZSAiZmluZCB8IHJtIiBiaXQgd2lsbCBhY3VhbGx5IGRlbGV0ZSBldmVyeXRoaW5nIGJlY2F1c2UgdGhlIG1vdW50IHBvaW50cworc3RpbGwgc2hvdyB1cCAoZXZlbiBpZiB0aGVpciBjb250ZW50cyBkb24ndCksIGFuZCBybSAtcmYgd2lsbCB0aGVuIGhhcHBpbHkgemFwCit0aGF0LiAgU28gdGhlIGZpcnN0IGxpbmUgaXMgYW4gb3ZlcnNpbXBsaWZpY2F0aW9uIG9mIHdoYXQgeW91IG5lZWQgdG8gZG8gX25vdF8KK3RvIGRlc2NlbmQgaW50byBvdGhlciBmaWxlc3lzdGVtcyBhbmQgZGVsZXRlIHRoZWlyIGNvbnRlbnRzLgorCitUaGUgcmVhc29uIHdlIGRvIHRoaXMgaXMgdG8gZnJlZSB1cCBtZW1vcnksIGJ5IHRoZSB3YXkuICBTaW5jZSBpbml0cmFtZnMgaXMgYQorcmFtZnMsIGRlbGV0aW5nIGl0cyBjb250ZW50cyBmcmVlcyB1cCB0aGUgbWVtb3J5IGl0IHVzZXMuICAoV2UgbGVhdmUgaXQgd2l0aAorb25lIHJlbWFpbmluZyBkZW50cnkgZm9yIHRoZSBuZXcgbW91bnQgcG9pbnQsIGJ1dCB0aGF0J3Mgb2suKQorCitOb3RlIHRoYXQgeW91IGNhbm5vdCBldmVyIHVtb3VudCByb290ZnMsIGZvciBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHJlYXNvbiB5b3UKK2Nhbid0IGtpbGwgUElEIDEuICBUaGUga2VybmVsIHRyYWNrcyBtb3VudCBwb2ludHMgYXMgYSBkb3VibHkgbGlua2VkIGxpc3QsIGFuZAordGhlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0L2VuZCBvZiB0aGF0IGxpc3QgYWx3YXlzIHBvaW50cyB0byBhbiBlbnRyeSB0aGF0J3MKK2tub3duIHRvIGJlIHRoZXJlIChyb290ZnMpLCBzbyBpdCBuZXZlciBoYXMgdG8gd29ycnkgYWJvdXQgbW92aW5nIHRoYXQgcG9pbnRlcgorYW5kIGl0IG5ldmVyIGhhcyB0byB3b3JyeSBhYm91dCB0aGUgbGlzdCBiZWluZyBlbXB0eS4gIChCYWNrIGFyb3VuZCAyLjYuMTMKK3RoZXJlIF93YXNfIGEgYnVnIHRoYXQgbGV0IHlvdSB1bW91bnQgcm9vdGZzLCBhbmQgdGhlIHN5c3RlbSBsb2NrZWQgaGFyZCB0aGUKK2luc3RhbnQgeW91IGRpZCBzbyBlbmRsZXNzbHkgbG9vcGluZyB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIG1vdW50IGxpc3QgYW5kCituZXZlciBzdG9wcGluZy4gIFRoZXkgZml4ZWQgaXQuKQorCitPaCwgYW5kIHRoZSByZWFzb24gd2UgbW91bnQgLS1tb3ZlIF9hbmRfIGRvIHRoZSBjaHJvb3QgaXMgZHVlIHRvIHRoZSB3YXkgIi8iCit3b3Jrcy4gIEVhY2ggcHJvY2VzcyBoYXMgdHdvIHNwZWNpYWwgc3ltbGlua3MsICIuIiwgYW5kICIvIi4gIEVhY2ggb2YgdGhlbQorcG9pbnRzIHRvIHRoZSBkZW50cnkgb2YgYSBkaXJlY3RvcnksIGFuZCBnaXZlIHlvdSBhIGxvY2F0aW9uIHBhdGhzIGNhbiBzdGFydAorZnJvbS4gIChIaXN0b3JpY2FsbHkgIi4uIiB3YXMgYWxzbyBzcGVjaWFsLCBiZWNhdXNlIHlvdSBjb3VsZCBlbnRlciBhCitkaXJlY3RvcnkgdmlhIGEgc3ltbGluayBzbyBiYWNraW5nIG91dCB0byB0aGUgZGlyZWN0b3J5IHlvdSBjYW1lIGZyb20gZG9lc24ndAorbmVjZXNzYXJpbHkgbWVhbiB0aGUgb25lIHBoeXNpY2FsbHkgYWJvdmUgd2hlcmUgIi4iIHBvaW50cyB0by4gIFRoZXNlIGRheXMgSQordGhpbmsgaXQncyBqdXN0IGhhbmRlZCBvZmYgdG8gdGhlIGZpbGVzeXN0ZW0uKQorCitBbnl3YXksIHBhdGggcmVzb2x1dGlvbiBzdGFydHMgd2l0aCAiLiIgb3IgIi8iIChhbHRob3VnaCB0aGUgIi4vIiBhdCB0aGUgc3RhcnQKK29mIHRoZSBwYXRoIG1heSBiZSBpbXBsaWNpdCksIG1lYW5pbmcgaXQncyByZWxhdGl2ZSB0byBvbmUgb2YgdGhvc2UgdHdvCitkaXJlY3Rvcmllcy4gIFlvdXIgY3VycmVudCBkaXJlY3RvcnksIGFuZCB5b3VyIGN1cnJlbnQgcm9vdCBkaXJlY3RvcnkuICBUaGUKK2NoZGlyKCkgc3lzY2FsbCBjaGFuZ2VzIHdoZXJlICIuIiBwb2ludHMgdG8sIGFuZCB0aGUgY2hyb290KCkgc3lzY2FsbCBjaGFuZ2VzCit3aGVyZSAiLyIgcG9pbnRzIHRvLiAgKEFnYWluLCBib3RoIGFyZSBwZXItcHJvY2VzcyB3aGljaCBpcyB3aHkgY2hyb290IG9ubHkKK2FmZmVjdHMgeW91ciBjdXJyZW50IHByb2Nlc3MgYW5kIGl0cyBjaGlsZCBwcm9jZXNzZXMuKQorCitOb3RlIHRoYXQgY2hyb290KCkgZG9lcyBfbm90XyBjaGFuZ2Ugd2hlcmUgIi4iIHBvaW50cyB0bywgYW5kIGJhY2sgYmVmb3JlIHRoZXkKK3B1dCBjcmF6eSBzZWN1cml0eSBjaGVja3MgaW50byB0aGUga2VybmVsIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgY291bGQgYmUKK3NvbWV3aGVyZSB5b3UgY291bGQgbm8gbG9uZ2VyIGFjY2VzcyBhZnRlciB0aGUgY2hyb290LiAgKFRoZSBjb21tYW5kIGxpbmUKK2Nocm9vdCBkb2VzIGEgY2QgYXMgd2VsbCwgdGhlIGNocm9vdCBfc3lzY2FsbF8gaXMgd2hhdCBJJ20gdGFsa2luZyBhYm91dC4pCisKK1RoZSByZWFzb24gbW91bnRpbmcgc29tZXRoaW5nIG5ldyBvdmVyIC8gaGFzIG5vIG9idmlvdXMgZWZmZWN0IGlzIHRoZSBzYW1lCityZWFzb24gbW91bnRpbmcgc29tZXRoaW5nIG92ZXIgeW91ciBjdXJyZW50IGRpcmVjdG9yeSBoYXMgbm8gb2J2aW91cyBlZmZlY3Q6Cit0aGUgLiBhbmQgLyBsaW5rcyBhcmVuJ3QgcmVjYWxjdWxhdGVkIGFmdGVyIGEgbW91bnQsIHNvIHRoZXkgc3RpbGwgcG9pbnQgdG8KK3RoZSBzYW1lIGRlbnRyeSB0aGV5IGRpZCBiZWZvcmUsIGV2ZW4gaWYgdGhhdCBkZW50cnkgaXMgbm8gbG9uZ2VyIGFjY2Vzc2libGUKK2J5IG90aGVyIG1lYW5zLiAgTm90ZSB0aGF0ICJjZCAuIiBpcyBhIE5PUCwgYW5kICJjaHJvb3QgLyIgaXMgYSBub3A7IGJvdGggbG9vawordXAgdGhlIGNhY2hlZCBkZW50cnkgYW5kIHNldCBpdCByaWdodCBiYWNrLiAgVGhleSBkb24ndCByZS1wYXJzZSBhbnkgcGF0aHMsCitiZWNhdXNlIHRoZXkncmUgd2hhdCBhbGwgcGF0aHMgeW91ciBwcm9jZXNzIHVzZXMgd291bGQgYmUgcmVsYXRpdmUgdG8uCisKK1RoYXQncyB3aHkgdGhlIGNhcmVmdWwgc2VxdWVuY2luZyBhYm92ZTogd2UgY2QgaW50byB0aGUgbmV3IG1vdW50IHBvaW50IGJlZm9yZQord2UgZG8gdGhlIG1vdW50IC0tbW92ZS4gIE1vdmluZyB0aGUgbW91bnQgcG9pbnQgd291bGQgb3RoZXJ3aXNlIG1ha2UgaXQKK3RvdGFsbHkgaW5hY2Nlc3NpYmxlIHRvIGlzIGJlY2F1c2UgY2QtaW5nIHRvIHRoZSBvbGQgcGF0aCB3b3VsZG4ndCBnaXZlIGl0IHRvCit1cyBhbnltb3JlLCBhbmQgY2QgIi8iIGp1c3QgZ2l2ZXMgdXMgdGhlIGNhY2hlZCBkZW50cnkgZnJvbSB3aGVuIHRoZSBwcm9jZXNzCit3YXMgY3JlYXRlZCAoaW4gdGhpcyBjYXNlIHRoZSBvbGQgaW5pdHJhbWZzIG9uZSkuICBCdXQgdGhlICIuIiBzeW1saW5rIGdpdmVzCit1cyB0aGUgZGVudHJ5IG9mIHRoZSBmaWxlc3lzdGVtIHdlIGp1c3QgbW92ZWQsIHNvIHdlIGNhbiB0aGVuICJjaHJvb3QgLiIgdG8KK2NvcHkgdGhhdCBkZW50cnkgdG8gIi8iIGFuZCBnZXQgdGhlIG5ldyBmaWxlc3lzdGVtLiAgSWYgd2UgX2RpZG4ndF8gc2F2ZSB0aGF0CitkZW50cnkgaW4gIi4iIHdlIGNvdWxkbid0IGdldCBpdCBiYWNrIGFmdGVyIHRoZSBtb3VudCAtLW1vdmUuCisKKyhZZXMsIHRoaXMgaXMgYWxsIHNjcmV3eSBhbmQgSSBoYWQgdG8gZW1haWwgcXVlc3Rpb25zIHRvIExpbnVzIFRvcnZhbGRzIHRvIGdldAoraXQgc3RyYWlnaHQgbXlzZWxmLiAgSSBrZWVwIG1lYW5pbmcgdG8gd3JpdGUgdXAgYSAiaG93IG1vdW50IGFjdHVhbGx5IHdvcmtzIgorZG9jdW1lbnQgc29tZWRheS4uLikKKyovCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3Vtb3VudC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC91bW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjcxNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC91bW91bnQuYwpAQCAtMCwwICsxLDE5OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB1bW91bnQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB1bW91bnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBGSUxFU1lTVEVNfERJUkVDVE9SWSIKKy8vdXNhZ2U6I2RlZmluZSB1bW91bnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVbm1vdW50IGZpbGUgc3lzdGVtc1xuIgorLy91c2FnZToJSUZfRkVBVFVSRV9VTU9VTlRfQUxMKAorLy91c2FnZTogICAgICJcbgktYQlVbm1vdW50IGFsbCBmaWxlIHN5c3RlbXMiIElGX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKCIgaW4gL2V0Yy9tdGFiIikKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKAorLy91c2FnZTogICAgICJcbgktbglEb24ndCBlcmFzZSAvZXRjL210YWIgZW50cmllcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXIJVHJ5IHRvIHJlbW91bnQgZGV2aWNlcyBhcyByZWFkLW9ubHkgaWYgbW91bnQgaXMgYnVzeSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGF6eSB1bW91bnQgKGRldGFjaCBmaWxlc3lzdGVtKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgdW1vdW50IChpLmUuLCB1bnJlYWNoYWJsZSBORlMgc2VydmVyKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTU9VTlRfTE9PUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRnJlZSBsb29wIGRldmljZSBpZiBpdCBoYXMgYmVlbiB1c2VkIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1bW91bnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdW1vdW50IC9kZXYvaGRjMVxuIgorCisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIGRlZmluZWQoX19kaWV0bGliY19fKQorLy8gVE9ETzogVGhpcyBkb2VzIG5vdCBiZWxvbmcgaGVyZS4KKy8qIDE2LjEyLjIwMDYsIFNhbXBvIEtlbGxvbWFraSAoc2FtcG9AaWtpLmZpKQorICogZGlldGxpYmMtMC4zMCBkb2VzIG5vdCBoYXZlIGltcGxlbWVudGF0aW9uIG9mIGdldG1udGVudF9yKCkgKi8KK3N0YXRpYyBzdHJ1Y3QgbW50ZW50ICpnZXRtbnRlbnRfcihGSUxFKiBzdHJlYW0sIHN0cnVjdCBtbnRlbnQqIHJlc3VsdCwKKwkJY2hhciogYnVmZmVyIFVOVVNFRF9QQVJBTSwgaW50IGJ1ZnNpemUgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBtbnRlbnQqIG1lbnQgPSBnZXRtbnRlbnQoc3RyZWFtKTsKKwlyZXR1cm4gbWVtY3B5KHJlc3VsdCwgbWVudCwgc2l6ZW9mKCptZW50KSk7Cit9CisjZW5kaWYKKworLyogaWdub3JlZDogLXYgLWQgLXQgLWkgKi8KKyNkZWZpbmUgT1BUSU9OX1NUUklORyAgICAgICAgICAgImZsZG5yYSIgInZkdDppIgorI2RlZmluZSBPUFRfRk9SQ0UgICAgICAgICAgICAgICAoMSA8PCAwKSAvLyBTYW1lIGFzIE1OVF9GT1JDRQorI2RlZmluZSBPUFRfTEFaWSAgICAgICAgICAgICAgICAoMSA8PCAxKSAvLyBTYW1lIGFzIE1OVF9ERVRBQ0gKKyNkZWZpbmUgT1BUX0ZSRUVMT09QICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgT1BUX05PX01UQUIgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgT1BUX1JFTU9VTlQgICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgT1BUX0FMTCAgICAgICAgICAgICAgICAgKEVOQUJMRV9GRUFUVVJFX1VNT1VOVF9BTEwgPyAoMSA8PCA1KSA6IDApCisKK2ludCB1bW91bnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVtb3VudF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGRvRm9yY2U7CisJc3RydWN0IG1udGVudCBtZTsKKwlGSUxFICpmcDsKKwljaGFyICpmc3R5cGUgPSBOVUxMOworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgb3B0OworCXN0cnVjdCBtdGFiX2xpc3QgeworCQljaGFyICpkaXI7CisJCWNoYXIgKmRldmljZTsKKwkJc3RydWN0IG10YWJfbGlzdCAqbmV4dDsKKwl9ICptdGwsICptOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUklORywgJmZzdHlwZSk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIE1OVF9GT1JDRSBhbmQgTU5UX0RFVEFDSCAoZnJvbSBsaW51eC9mcy5oKSBtdXN0IG1hdGNoCisJLy8gT1BUX0ZPUkNFIGFuZCBPUFRfTEFaWSwgb3RoZXJ3aXNlIHRoaXMgdHJpY2sgd29uJ3Qgd29yazoKKwlkb0ZvcmNlID0gTUFYKChvcHQgJiBPUFRfRk9SQ0UpLCAob3B0ICYgT1BUX0xBWlkpKTsKKworCS8qIEdldCBhIGxpc3Qgb2YgbW91bnQgcG9pbnRzIGZyb20gbXRhYi4gIFdlIHJlYWQgdGhlbSBhbGwgaW4gbm93IG1vc3RseQorCSAqIGZvciB1bW91bnQgLWEgKHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGxpc3QgY2hhbmdpbmcgd2hpbGUKKwkgKiB3ZSBpdGVyYXRlIG92ZXIgaXQsIG9yIGFib3V0IGdldHRpbmcgc3R1Y2sgaW4gYSBsb29wIG9uIHRoZSBzYW1lIGZhaWxpbmcKKwkgKiBlbnRyeS4gIE5vdGljZSB0aGF0IHRoaXMgYWxzbyBuYXR1cmFsbHkgcmV2ZXJzZXMgdGhlIGxpc3Qgc28gdGhhdCAtYQorCSAqIHVtb3VudHMgdGhlIG1vc3QgcmVjZW50IGVudHJpZXMgZmlyc3QuICovCisJbSA9IG10bCA9IE5VTEw7CisKKwkvLyBJZiB3ZSdyZSB1bW91bnRpbmcgYWxsLCB0aGVuIG0gcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBhbmQKKwkvLyB0aGUgYXJndW1lbnQgbGlzdCBzaG91bGQgYmUgZW1wdHkgKHdoaWNoIHdpbGwgbWF0Y2ggYWxsKS4KKwlmcCA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInIiKTsKKwlpZiAoIWZwKSB7CisJCWlmIChvcHQgJiBPUFRfQUxMKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG9wZW4gJyVzJyIsIGJiX3BhdGhfbXRhYl9maWxlKTsKKwl9IGVsc2UgeworCQl3aGlsZSAoZ2V0bW50ZW50X3IoZnAsICZtZSwgYmJfY29tbW9uX2J1ZnNpejEsIHNpemVvZihiYl9jb21tb25fYnVmc2l6MSkpKSB7CisJCQkvKiBNYXRjaCBmc3R5cGUgaWYgcGFzc2VkICovCisJCQlpZiAoIW1hdGNoX2ZzdHlwZSgmbWUsIGZzdHlwZSkpCisJCQkJY29udGludWU7CisJCQltID0geHphbGxvYyhzaXplb2YoKm0pKTsKKwkJCW0tPm5leHQgPSBtdGw7CisJCQltLT5kZXZpY2UgPSB4c3RyZHVwKG1lLm1udF9mc25hbWUpOworCQkJbS0+ZGlyID0geHN0cmR1cChtZS5tbnRfZGlyKTsKKwkJCW10bCA9IG07CisJCX0KKwkJZW5kbW50ZW50KGZwKTsKKwl9CisKKwkvLyBJZiB3ZSdyZSBub3QgdW1vdW50aW5nIGFsbCwgd2UgbmVlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuCisJaWYgKCEob3B0ICYgT1BUX0FMTCkgJiYgIWZzdHlwZSkgeworCQlpZiAoIWFyZ3ZbMF0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCW0gPSBOVUxMOworCX0KKworCS8vIExvb3AgdGhyb3VnaCBldmVyeXRoaW5nIHdlJ3JlIHN1cHBvc2VkIHRvIHVtb3VudCwgYW5kIGRvIHNvLgorCWZvciAoOzspIHsKKwkJaW50IGN1cnN0YXQ7CisJCWNoYXIgKnphcGl0ID0gKmFyZ3Y7CisJCWNoYXIgKnBhdGg7CisKKwkJLy8gRG8gd2UgYWxyZWFkeSBrbm93IHdoYXQgdG8gdW1vdW50IHRoaXMgdGltZSB0aHJvdWdoIHRoZSBsb29wPworCQlpZiAobSkKKwkJCXBhdGggPSB4c3RyZHVwKG0tPmRpcik7CisJCS8vIEZvciB1bW91bnQgLWEsIGVuZCBvZiBtdGFiIG1lYW5zIHRpbWUgdG8gZXhpdC4KKwkJZWxzZSBpZiAob3B0ICYgT1BUX0FMTCkKKwkJCWJyZWFrOworCQkvLyBVc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50IChhbmQgbG9vayBpdCB1cCBpbiBtdGFiIGxpc3QpCisJCWVsc2UgeworCQkJaWYgKCF6YXBpdCkKKwkJCQlicmVhazsKKwkJCWFyZ3YrKzsKKwkJCXBhdGggPSB4bWFsbG9jX3JlYWxwYXRoKHphcGl0KTsKKwkJCWlmIChwYXRoKSB7CisJCQkJZm9yIChtID0gbXRsOyBtOyBtID0gbS0+bmV4dCkKKwkJCQkJaWYgKHN0cmNtcChwYXRoLCBtLT5kaXIpID09IDAgfHwgc3RyY21wKHBhdGgsIG0tPmRldmljZSkgPT0gMCkKKwkJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIElmIHdlIGNvdWxkbid0IGZpbmQgdGhpcyBzdWNrZXIgaW4gL2V0Yy9tdGFiLCBwdW50IGJ5IHBhc3Npbmcgb3VyCisJCS8vIGNvbW1hbmQgbGluZSBhcmd1bWVudCBzdHJhaWdodCB0byB0aGUgdW1vdW50IHN5c2NhbGwuICBPdGhlcndpc2UsCisJCS8vIHVtb3VudCB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgd2Ugd2VyZSBnaXZlbiB0aGUgYmxvY2sgZGV2aWNlLgorCQlpZiAobSkgemFwaXQgPSBtLT5kaXI7CisKKwkJLy8gTGV0J3MgYXNrIHRoZSB0aGluZyBuaWNlbHkgdG8gdW5tb3VudC4KKwkJY3Vyc3RhdCA9IHVtb3VudCh6YXBpdCk7CisKKwkJLy8gRm9yY2UgdGhlIHVubW91bnQsIGlmIG5lY2Vzc2FyeS4KKwkJaWYgKGN1cnN0YXQgJiYgZG9Gb3JjZSkKKwkJCWN1cnN0YXQgPSB1bW91bnQyKHphcGl0LCBkb0ZvcmNlKTsKKworCQkvLyBJZiBzdGlsbCBjYW4ndCB1bW91bnQsIG1heWJlIHJlbW91bnQgcmVhZC1vbmx5PworCQlpZiAoY3Vyc3RhdCkgeworCQkJaWYgKChvcHQgJiBPUFRfUkVNT1VOVCkgJiYgZXJybm8gPT0gRUJVU1kgJiYgbSkgeworCQkJCS8vIE5vdGUhIEV2ZW4gaWYgd2Ugc3VjY2VlZCBoZXJlLCBsYXRlciB3ZSBzaG91bGQgbm90CisJCQkJLy8gZnJlZSBsb29wIGRldmljZSBvciBlcmFzZSBtdGFiIGVudHJ5IQorCQkJCWNvbnN0IGNoYXIgKm1zZyA9ICIlcyBidXN5IC0gcmVtb3VudGVkIHJlYWQtb25seSI7CisJCQkJY3Vyc3RhdCA9IG1vdW50KG0tPmRldmljZSwgemFwaXQsIE5VTEwsIE1TX1JFTU9VTlR8TVNfUkRPTkxZLCBOVUxMKTsKKwkJCQlpZiAoY3Vyc3RhdCkgeworCQkJCQltc2cgPSAiY2FuJ3QgcmVtb3VudCAlcyByZWFkLW9ubHkiOworCQkJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQkJfQorCQkJCWJiX2Vycm9yX21zZyhtc2csIG0tPmRldmljZSk7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCAlc3Vtb3VudCAlcyIsIChkb0ZvcmNlID8gImZvcmNpYmx5ICIgOiAiIiksIHphcGl0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIERlLWFsbG9jYXRlIHRoZSBsb29wIGRldmljZS4gIFRoaXMgaW9jdGwgc2hvdWxkIGJlIGlnbm9yZWQgb24KKwkJCS8vIGFueSBub24tbG9vcCBibG9jayBkZXZpY2VzLgorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01PVU5UX0xPT1AgJiYgKG9wdCAmIE9QVF9GUkVFTE9PUCkgJiYgbSkKKwkJCQlkZWxfbG9vcChtLT5kZXZpY2UpOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01UQUJfU1VQUE9SVCAmJiAhKG9wdCAmIE9QVF9OT19NVEFCKSAmJiBtKQorCQkJCWVyYXNlX210YWIobS0+ZGlyKTsKKwkJfQorCisJCS8vIEZpbmQgbmV4dCBtYXRjaGluZyBtdGFiIGVudHJ5IGZvciAtYSBvciB1bW91bnQgL2RldgorCQkvLyBOb3RlIHRoaXMgbWVhbnMgdGhhdCAidW1vdW50IC9kZXYvYmxhaCIgd2lsbCB1bm1vdW50IGFsbCBpbnN0YW5jZXMKKwkJLy8gb2YgL2Rldi9ibGFoLCBub3QganVzdCB0aGUgbW9zdCByZWNlbnQuCisJCWlmIChtKSB7CisJCQl3aGlsZSAoKG0gPSBtLT5uZXh0KSAhPSBOVUxMKQorCQkJCS8vIE5COiBpZiBtIGlzIG5vbi1OVUxMLCBwYXRoIGlzIG5vbi1OVUxMIGFzIHdlbGwKKwkJCQlpZiAoKG9wdCAmIE9QVF9BTEwpIHx8IHN0cmNtcChwYXRoLCBtLT5kZXZpY2UpID09IDApCisJCQkJCWJyZWFrOworCQl9CisJCWZyZWUocGF0aCk7CisJfQorCisJLy8gRnJlZSBtdGFiIGxpc3QgaWYgbmVjZXNzYXJ5CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCXdoaWxlIChtdGwpIHsKKwkJCW0gPSBtdGwtPm5leHQ7CisJCQlmcmVlKG10bC0+ZGV2aWNlKTsKKwkJCWZyZWUobXRsLT5kaXIpOworCQkJZnJlZShtdGwpOworCQkJbXRsID0gbTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9LYnVpbGQuc3JjIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGRhNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDQ1IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoQ09ORklHX0JMS0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gZ2V0X2Rldm5hbWUubworbGliLSQoQ09ORklHX0ZJTkRGUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gZ2V0X2Rldm5hbWUubworbGliLSQoQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwpICAgICAgICAgICAgICAgKz0gZ2V0X2Rldm5hbWUubworCitsaWItJChDT05GSUdfVk9MVU1FSUQpICAgICAgICAgICAgICAgICAgICAgICAgICArPSB2b2x1bWVfaWQubyB1dGlsLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTKSAgICAgICAgICAgICs9IGJ0cmZzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVCkgICAgICAgICAgICAgICs9IGV4dC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQpICAgICAgICAgICAgICArPSBmYXQubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTKSAgICAgICAgICAgICAgKz0gaGZzLm8KKyMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ISUdIUE9JTlRSQUlEKSAgICArPSBoaWdocG9pbnQubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQpICAgICAgICAgICs9IGlzd19yYWlkLm8KKyMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MU0lSQUlEKSAgICAgICAgICArPSBsc2lfcmFpZC5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVklBUkFJRCkgICAgICAgICAgKz0gdmlhX3JhaWQubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NJTElDT05SQUlEKSAgICAgICs9IHNpbGljb25fcmFpZC5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlZJRElBUkFJRCkgICAgICAgKz0gbnZpZGlhX3JhaWQubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1BST01JU0VSQUlEKSAgICAgICs9IHByb21pc2VfcmFpZC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwKSAgICAgICAgICArPSBpc285NjYwLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUykgICAgICAgICAgICAgICs9IGpmcy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQpICAgICAgICArPSBsaW51eF9yYWlkLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUCkgICAgICAgICs9IGxpbnV4X3N3YXAubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xWTSkgICAgICAgICAgICAgICs9IGx2bS5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTUFDKSAgICAgICAgICAgICAgKz0gbWFjLm8KKyMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9NU0RPUykgICAgICAgICAgICArPSBtc2Rvcy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTKSAgICAgICAgICAgICArPSBudGZzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTKSAgICAgICAgICs9IHJlaXNlcmZzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERikgICAgICAgICAgICAgICs9IHVkZi5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVUZTKSAgICAgICAgICAgICAgKz0gdWZzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUykgICAgICAgICAgICAgICs9IHhmcy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMpICAgICAgICAgICArPSBjcmFtZnMubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0hQRlMpICAgICAgICAgICAgICs9IGhwZnMubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlMpICAgICAgICAgICAgKz0gcm9tZnMubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU1lTVikgICAgICAgICAgICAgKz0gc3lzdi5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVgpICAgICAgICAgICAgKz0gbWluaXgubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTFVLUykgICAgICAgICAgICAgKz0gbHVrcy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMikgICAgICAgICAgICArPSBvY2ZzMi5vCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9idHJmcy5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvYnRyZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdiODA5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvYnRyZnMuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKyNkZWZpbmUgQlRSRlNfVVVJRF9TSVpFIDE2CisjZGVmaW5lIEJUUkZTX0xBQkVMX1NJWkUgMjU2CisjZGVmaW5lIEJUUkZTX0NTVU1fU0laRSAzMgorI2RlZmluZSBCVFJGU19GU0lEX1NJWkUgMTYKKworI2RlZmluZSBCVFJGU19NQUdJQyAiX0JIUmZTX00iCisKK3N0cnVjdCBidHJmc19kZXZfaXRlbSB7CisJdWludDY0X3QgZGV2aWQ7CisJdWludDY0X3QgdG90YWxfYnl0ZXM7CisJdWludDY0X3QgYnl0ZXNfdXNlZDsKKwl1aW50MzJfdCBpb19hbGlnbjsKKwl1aW50MzJfdCBpb193aWR0aDsKKwl1aW50MzJfdCBzZWN0b3Jfc2l6ZTsKKwl1aW50NjRfdCB0eXBlOworCXVpbnQ2NF90IGdlbmVyYXRpb247CisJdWludDY0X3Qgc3RhcnRfb2Zmc2V0OworCXVpbnQzMl90IGRldl9ncm91cDsKKwl1aW50OF90IHNlZWtfc3BlZWQ7CisJdWludDhfdCBiYW5kd2lkdGg7CisJdWludDhfdCB1dWlkW0JUUkZTX1VVSURfU0laRV07CisJdWludDhfdCBmc2lkW0JUUkZTX1VVSURfU0laRV07Cit9IFBBQ0tFRDsKKworc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrIHsKKwl1aW50OF90IGNzdW1bQlRSRlNfQ1NVTV9TSVpFXTsKKwl1aW50OF90IGZzaWRbQlRSRlNfRlNJRF9TSVpFXTsJLy8gVVVJRAorCXVpbnQ2NF90IGJ5dGVucjsKKwl1aW50NjRfdCBmbGFnczsKKwl1aW50OF90IG1hZ2ljWzhdOworCXVpbnQ2NF90IGdlbmVyYXRpb247CisJdWludDY0X3Qgcm9vdDsKKwl1aW50NjRfdCBjaHVua19yb290OworCXVpbnQ2NF90IGxvZ19yb290OworCXVpbnQ2NF90IGxvZ19yb290X3RyYW5zaWQ7CisJdWludDY0X3QgdG90YWxfYnl0ZXM7CisJdWludDY0X3QgYnl0ZXNfdXNlZDsKKwl1aW50NjRfdCByb290X2Rpcl9vYmplY3RpZDsKKwl1aW50NjRfdCBudW1fZGV2aWNlczsKKwl1aW50MzJfdCBzZWN0b3JzaXplOworCXVpbnQzMl90IG5vZGVzaXplOworCXVpbnQzMl90IGxlYWZzaXplOworCXVpbnQzMl90IHN0cmlwZXNpemU7CisJdWludDMyX3Qgc3lzX2NodW5rX2FycmF5X3NpemU7CisJdWludDY0X3QgY2h1bmtfcm9vdF9nZW5lcmF0aW9uOworCXVpbnQ2NF90IGNvbXBhdF9mbGFnczsKKwl1aW50NjRfdCBjb21wYXRfcm9fZmxhZ3M7CisJdWludDY0X3QgaW5jb21wYXRfZmxhZ3M7CisJdWludDE2X3QgY3N1bV90eXBlOworCXVpbnQ4X3Qgcm9vdF9sZXZlbDsKKwl1aW50OF90IGNodW5rX3Jvb3RfbGV2ZWw7CisJdWludDhfdCBsb2dfcm9vdF9sZXZlbDsKKwlzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gZGV2X2l0ZW07CisJdWludDhfdCBsYWJlbFtCVFJGU19MQUJFTF9TSVpFXTsJLy8gTEFCRUwKKwkvLyAuLi4KK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9idHJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKwkvLyBidHJmcyBoYXMgc3VwZXJibG9ja3MgYXQgNjRLLCA2NE0gYW5kIDI1NkcKKwkvLyBtaW5pbXVtIGJ0cmZzIHNpemUgaXMgMjU2TQorCS8vIHNvIHdlIG5ldmVyIHN0ZXAgb3V0IHRoZSBkZXZpY2UgaWYgd2UgYW5hbHl6ZQorCS8vIHRoZSBmaXJzdCBhbmQgdGhlIHNlY29uZCBzdXBlcmJsb2NrcworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc2I7CisJdW5zaWduZWQgb2ZmID0gNjQ7CisKKwl3aGlsZSAob2ZmIDwgNjQqMTAyNCoxMDI0KSB7CisJCW9mZiAqPSAxMDI0OworCQlkYmcoImJ0cmZzOiBwcm9iaW5nIGF0IG9mZnNldCAweCV4Iiwgb2ZmKTsKKworCQlzYiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIHNpemVvZigqc2IpKTsKKwkJaWYgKHNiID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKG1lbWNtcChzYi0+bWFnaWMsIEJUUkZTX01BR0lDLCA4KSAhPSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8vIE4uQi46IGJ0cmZzIG5hdGl2ZWx5IHN1cHBvcnRzIDI1NiAoPlZPTFVNRV9JRF9MQUJFTF9TSVpFKSBzaXplIGxhYmVscworCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzYi0+bGFiZWwsIFZPTFVNRV9JRF9MQUJFTF9TSVpFKTsKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHNiLT5mc2lkLCBVVUlEX0RDRSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2NyYW1mcy5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvY3JhbWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlOTk3MAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2NyYW1mcy5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBjcmFtZnNfc3VwZXIgeworCXVpbnQzMl90CW1hZ2ljOworCXVpbnQzMl90CXNpemU7CisJdWludDMyX3QJZmxhZ3M7CisJdWludDMyX3QJZnV0dXJlOworCXVpbnQ4X3QJCXNpZ25hdHVyZVsxNl07CisJc3RydWN0IGNyYW1mc19pbmZvIHsKKwkJdWludDMyX3QJY3JjOworCQl1aW50MzJfdAllZGl0aW9uOworCQl1aW50MzJfdAlibG9ja3M7CisJCXVpbnQzMl90CWZpbGVzOworCX0gUEFDS0VEIGluZm87CisJdWludDhfdAkJbmFtZVsxNl07Cit9IFBBQ0tFRDsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfY3JhbWZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCBjcmFtZnNfc3VwZXIgKmNzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJY3MgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCAweDIwMCk7CisJaWYgKGNzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChjcy0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoMHg0NTNkY2QyOCkpIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgY3MtPm5hbWUsIDE2KTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIGNzLT5uYW1lLCAxNik7CisKKy8vCQl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJjcmFtZnMiOykKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvZXh0LmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9leHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTE5NGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvZXh0LmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90CWlub2Rlc19jb3VudDsKKwl1aW50MzJfdAlibG9ja3NfY291bnQ7CisJdWludDMyX3QJcl9ibG9ja3NfY291bnQ7CisJdWludDMyX3QJZnJlZV9ibG9ja3NfY291bnQ7CisJdWludDMyX3QJZnJlZV9pbm9kZXNfY291bnQ7CisJdWludDMyX3QJZmlyc3RfZGF0YV9ibG9jazsKKwl1aW50MzJfdAlsb2dfYmxvY2tfc2l6ZTsKKwl1aW50MzJfdAlkdW1teTNbN107CisJdWludDhfdAltYWdpY1syXTsKKwl1aW50MTZfdAlzdGF0ZTsKKwl1aW50MzJfdAlkdW1teTVbOF07CisJdWludDMyX3QJZmVhdHVyZV9jb21wYXQ7CisJdWludDMyX3QJZmVhdHVyZV9pbmNvbXBhdDsKKwl1aW50MzJfdAlmZWF0dXJlX3JvX2NvbXBhdDsKKwl1aW50OF90CXV1aWRbMTZdOworCXVpbnQ4X3QJdm9sdW1lX25hbWVbMTZdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTAkJMHgwMDAwMDAwNAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYJMHgwMDAwMDAwOAorI2RlZmluZSBFWFRfU1VQRVJCTE9DS19PRkZTRVQJCQkweDQwMAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9leHQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzOworCisJZGJnKCJleHQ6IHByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwllcyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBFWFRfU1VQRVJCTE9DS19PRkZTRVQsIDB4MjAwKTsKKwlpZiAoZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGVzLT5tYWdpY1swXSAhPSAwMTIzIHx8IGVzLT5tYWdpY1sxXSAhPSAwMzU3KSB7CisJCWRiZygiZXh0OiBubyBtYWdpYyBmb3VuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisvLwl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgZXMtPnZvbHVtZV9uYW1lLCAxNik7CisJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIGVzLT52b2x1bWVfbmFtZSwgMTYpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgZXMtPnV1aWQsIFVVSURfRENFKTsKKwlkYmcoImV4dDogbGFiZWwgJyVzJyB1dWlkICclcyciLCBpZC0+bGFiZWwsIGlkLT51dWlkKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0JMS0lEX1RZUEUKKwlpZiAoKGxlMzJfdG9fY3B1KGVzLT5mZWF0dXJlX2NvbXBhdCkgJiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSAhPSAwKQorCQlpZC0+dHlwZSA9ICJleHQzIjsKKwllbHNlCisJCWlkLT50eXBlID0gImV4dDIiOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2ZhdC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvZmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ZmJiMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2ZhdC5jCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisvKiBsaW51eC9tc2Rvc19mcy5oIHNheXM6ICovCisjZGVmaW5lIEZBVDEyX01BWAkJCTB4ZmY0CisjZGVmaW5lIEZBVDE2X01BWAkJCTB4ZmZmNAorI2RlZmluZSBGQVQzMl9NQVgJCQkweDBmZmZmZmY2CisKKyNkZWZpbmUgRkFUX0FUVFJfVk9MVU1FX0lECQkweDA4CisjZGVmaW5lIEZBVF9BVFRSX0RJUgkJCTB4MTAKKyNkZWZpbmUgRkFUX0FUVFJfTE9OR19OQU1FCQkweDBmCisjZGVmaW5lIEZBVF9BVFRSX01BU0sJCQkweDNmCisjZGVmaW5lIEZBVF9FTlRSWV9GUkVFCQkJMHhlNQorCitzdHJ1Y3QgdmZhdF9zdXBlcl9ibG9jayB7CisJdWludDhfdAkJYm9vdF9qdW1wWzNdOworCXVpbnQ4X3QJCXN5c2lkWzhdOworCXVpbnQxNl90CXNlY3Rvcl9zaXplX2J5dGVzOworCXVpbnQ4X3QJCXNlY3RvcnNfcGVyX2NsdXN0ZXI7CisJdWludDE2X3QJcmVzZXJ2ZWRfc2N0OworCXVpbnQ4X3QJCWZhdHM7CisJdWludDE2X3QJZGlyX2VudHJpZXM7CisJdWludDE2X3QJc2VjdG9yczsKKwl1aW50OF90CQltZWRpYTsKKwl1aW50MTZfdAlmYXRfbGVuZ3RoOworCXVpbnQxNl90CXNlY3NfdHJhY2s7CisJdWludDE2X3QJaGVhZHM7CisJdWludDMyX3QJaGlkZGVuOworCXVpbnQzMl90CXRvdGFsX3NlY3Q7CisJdW5pb24geworCQlzdHJ1Y3QgZmF0X3N1cGVyX2Jsb2NrIHsKKwkJCXVpbnQ4X3QJCXVua25vd25bM107CisJCQl1aW50OF90CQlzZXJub1s0XTsKKwkJCXVpbnQ4X3QJCWxhYmVsWzExXTsKKwkJCXVpbnQ4X3QJCW1hZ2ljWzhdOworCQkJdWludDhfdAkJZHVtbXkyWzE5Ml07CisJCQl1aW50OF90CQlwbWFnaWNbMl07CisJCX0gUEFDS0VEIGZhdDsKKwkJc3RydWN0IGZhdDMyX3N1cGVyX2Jsb2NrIHsKKwkJCXVpbnQzMl90CWZhdDMyX2xlbmd0aDsKKwkJCXVpbnQxNl90CWZsYWdzOworCQkJdWludDhfdAkJdmVyc2lvblsyXTsKKwkJCXVpbnQzMl90CXJvb3RfY2x1c3RlcjsKKwkJCXVpbnQxNl90CWluc2ZvX3NlY3RvcjsKKwkJCXVpbnQxNl90CWJhY2t1cF9ib290OworCQkJdWludDE2X3QJcmVzZXJ2ZWQyWzZdOworCQkJdWludDhfdAkJdW5rbm93blszXTsKKwkJCXVpbnQ4X3QJCXNlcm5vWzRdOworCQkJdWludDhfdAkJbGFiZWxbMTFdOworCQkJdWludDhfdAkJbWFnaWNbOF07CisJCQl1aW50OF90CQlkdW1teTJbMTY0XTsKKwkJCXVpbnQ4X3QJCXBtYWdpY1syXTsKKwkJfSBQQUNLRUQgZmF0MzI7CisJfSBQQUNLRUQgdHlwZTsKK30gUEFDS0VEOworCitzdHJ1Y3QgdmZhdF9kaXJfZW50cnkgeworCXVpbnQ4X3QJCW5hbWVbMTFdOworCXVpbnQ4X3QJCWF0dHI7CisJdWludDE2X3QJdGltZV9jcmVhdDsKKwl1aW50MTZfdAlkYXRlX2NyZWF0OworCXVpbnQxNl90CXRpbWVfYWNjOworCXVpbnQxNl90CWRhdGVfYWNjOworCXVpbnQxNl90CWNsdXN0ZXJfaGlnaDsKKwl1aW50MTZfdAl0aW1lX3dyaXRlOworCXVpbnQxNl90CWRhdGVfd3JpdGU7CisJdWludDE2X3QJY2x1c3Rlcl9sb3c7CisJdWludDMyX3QJc2l6ZTsKK30gUEFDS0VEOworCitzdGF0aWMgdWludDhfdCAqZ2V0X2F0dHJfdm9sdW1lX2lkKHN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSAqZGlyLCBpbnQgY291bnQpCit7CisJZm9yICg7LS1jb3VudCA+PSAwOyBkaXIrKykgeworCQkvKiBlbmQgbWFya2VyICovCisJCWlmIChkaXItPm5hbWVbMF0gPT0gMHgwMCkgeworCQkJZGJnKCJlbmQgb2YgZGlyIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGVtcHR5IGVudHJ5ICovCisJCWlmIChkaXItPm5hbWVbMF0gPT0gRkFUX0VOVFJZX0ZSRUUpCisJCQljb250aW51ZTsKKworCQkvKiBsb25nIG5hbWUgKi8KKwkJaWYgKChkaXItPmF0dHIgJiBGQVRfQVRUUl9NQVNLKSA9PSBGQVRfQVRUUl9MT05HX05BTUUpCisJCQljb250aW51ZTsKKworCQlpZiAoKGRpci0+YXR0ciAmIChGQVRfQVRUUl9WT0xVTUVfSUQgfCBGQVRfQVRUUl9ESVIpKSA9PSBGQVRfQVRUUl9WT0xVTUVfSUQpIHsKKwkJCS8qIGxhYmVscyBkbyBub3QgaGF2ZSBmaWxlIGRhdGEgKi8KKwkJCWlmIChkaXItPmNsdXN0ZXJfaGlnaCAhPSAwIHx8IGRpci0+Y2x1c3Rlcl9sb3cgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJZGJnKCJmb3VuZCBBVFRSX1ZPTFVNRV9JRCBpZCBpbiByb290IGRpciIpOworCQkJcmV0dXJuIGRpci0+bmFtZTsKKwkJfQorCisJCWRiZygic2tpcCBkaXIgZW50cnkiKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfdmZhdChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBmYXRfcGFydGl0aW9uX29mZiovKQoreworI2RlZmluZSBmYXRfcGFydGl0aW9uX29mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHZmYXRfc3VwZXJfYmxvY2sgKnZzOworCXN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSAqZGlyOworCXVpbnQxNl90IHNlY3Rvcl9zaXplX2J5dGVzOworCXVpbnQxNl90IGRpcl9lbnRyaWVzOworCXVpbnQzMl90IHNlY3RfY291bnQ7CisJdWludDE2X3QgcmVzZXJ2ZWRfc2N0OworCXVpbnQzMl90IGZhdF9zaXplX3NjdDsKKwl1aW50MzJfdCByb290X2NsdXN0ZXI7CisJdWludDMyX3QgZGlyX3NpemVfc2N0OworCXVpbnQzMl90IGNsdXN0ZXJfY291bnQ7CisJdWludDY0X3Qgcm9vdF9zdGFydF9vZmY7CisJdWludDMyX3Qgc3RhcnRfZGF0YV9zY3Q7CisJdWludDhfdCAqYnVmOworCXVpbnQzMl90IGJ1Zl9zaXplOworCXVpbnQ4X3QgKmxhYmVsID0gTlVMTDsKKwl1aW50MzJfdCBuZXh0X2NsdXN0ZXI7CisJaW50IG1heGxvb3A7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGZhdF9wYXJ0aXRpb25fb2ZmKTsKKworCXZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGZhdF9wYXJ0aXRpb25fb2ZmLCAweDIwMCk7CisJaWYgKHZzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIGJlbGlldmUgb25seSB0aGF0J3MgZmF0LCBkb24ndCB0cnVzdCB0aGUgdmVyc2lvbgorCSAqIHRoZSBjbHVzdGVyX2NvdW50IHdpbGwgdGVsbCB1cworCSAqLworCWlmIChtZW1jbXAodnMtPnN5c2lkLCAiTlRGUyIsIDQpID09IDApCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAodnMtPnR5cGUuZmF0MzIubWFnaWMsICJNU1dJTiIsIDUpID09IDApCisJCWdvdG8gdmFsaWQ7CisKKwlpZiAobWVtY21wKHZzLT50eXBlLmZhdDMyLm1hZ2ljLCAiRkFUMzIgICAiLCA4KSA9PSAwKQorCQlnb3RvIHZhbGlkOworCisJaWYgKG1lbWNtcCh2cy0+dHlwZS5mYXQubWFnaWMsICJGQVQxNiAgICIsIDgpID09IDApCisJCWdvdG8gdmFsaWQ7CisKKwlpZiAobWVtY21wKHZzLT50eXBlLmZhdC5tYWdpYywgIk1TRE9TIiwgNSkgPT0gMCkKKwkJZ290byB2YWxpZDsKKworCWlmIChtZW1jbXAodnMtPnR5cGUuZmF0Lm1hZ2ljLCAiRkFUMTIgICAiLCA4KSA9PSAwKQorCQlnb3RvIHZhbGlkOworCisJLyoKKwkgKiBUaGVyZSBhcmUgb2xkIGZsb3BwaWVzIG91dCB0aGVyZSB3aXRob3V0IGEgbWFnaWMsIHNvIHdlIGNoZWNrCisJICogZm9yIHdlbGwga25vd24gdmFsdWVzIGFuZCBndWVzcyBpZiBpdCdzIGEgZmF0IHZvbHVtZQorCSAqLworCisJLyogYm9vdCBqdW1wIGFkZHJlc3MgY2hlY2sgKi8KKwlpZiAoKHZzLT5ib290X2p1bXBbMF0gIT0gMHhlYiB8fCB2cy0+Ym9vdF9qdW1wWzJdICE9IDB4OTApCisJICYmIHZzLT5ib290X2p1bXBbMF0gIT0gMHhlOQorCSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogaGVhZHMgY2hlY2sgKi8KKwlpZiAodnMtPmhlYWRzID09IDApCisJCXJldHVybiAtMTsKKworCS8qIGNsdXN0ZXIgc2l6ZSBjaGVjayAqLworCWlmICh2cy0+c2VjdG9yc19wZXJfY2x1c3RlciA9PSAwCisJIHx8ICh2cy0+c2VjdG9yc19wZXJfY2x1c3RlciAmICh2cy0+c2VjdG9yc19wZXJfY2x1c3Rlci0xKSkKKwkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIG1lZGlhIGNoZWNrICovCisJaWYgKHZzLT5tZWRpYSA8IDB4ZjggJiYgdnMtPm1lZGlhICE9IDB4ZjApCisJCXJldHVybiAtMTsKKworCS8qIGZhdCBjb3VudCovCisJaWYgKHZzLT5mYXRzICE9IDIpCisJCXJldHVybiAtMTsKKworIHZhbGlkOgorCS8qIHNlY3RvciBzaXplIGNoZWNrICovCisJc2VjdG9yX3NpemVfYnl0ZXMgPSBsZTE2X3RvX2NwdSh2cy0+c2VjdG9yX3NpemVfYnl0ZXMpOworCWlmIChzZWN0b3Jfc2l6ZV9ieXRlcyAhPSAweDIwMCAmJiBzZWN0b3Jfc2l6ZV9ieXRlcyAhPSAweDQwMAorCSAmJiBzZWN0b3Jfc2l6ZV9ieXRlcyAhPSAweDgwMCAmJiBzZWN0b3Jfc2l6ZV9ieXRlcyAhPSAweDEwMDAKKwkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWRiZygic2VjdG9yX3NpemVfYnl0ZXMgMHgleCIsIHNlY3Rvcl9zaXplX2J5dGVzKTsKKwlkYmcoInNlY3RvcnNfcGVyX2NsdXN0ZXIgMHgleCIsIHZzLT5zZWN0b3JzX3Blcl9jbHVzdGVyKTsKKworCXJlc2VydmVkX3NjdCA9IGxlMTZfdG9fY3B1KHZzLT5yZXNlcnZlZF9zY3QpOworCWRiZygicmVzZXJ2ZWRfc2N0IDB4JXgiLCByZXNlcnZlZF9zY3QpOworCisJc2VjdF9jb3VudCA9IGxlMTZfdG9fY3B1KHZzLT5zZWN0b3JzKTsKKwlpZiAoc2VjdF9jb3VudCA9PSAwKQorCQlzZWN0X2NvdW50ID0gbGUzMl90b19jcHUodnMtPnRvdGFsX3NlY3QpOworCWRiZygic2VjdF9jb3VudCAweCV4Iiwgc2VjdF9jb3VudCk7CisKKwlmYXRfc2l6ZV9zY3QgPSBsZTE2X3RvX2NwdSh2cy0+ZmF0X2xlbmd0aCk7CisJaWYgKGZhdF9zaXplX3NjdCA9PSAwKQorCQlmYXRfc2l6ZV9zY3QgPSBsZTMyX3RvX2NwdSh2cy0+dHlwZS5mYXQzMi5mYXQzMl9sZW5ndGgpOworCWZhdF9zaXplX3NjdCAqPSB2cy0+ZmF0czsKKwlkYmcoImZhdF9zaXplX3NjdCAweCV4IiwgZmF0X3NpemVfc2N0KTsKKworCWRpcl9lbnRyaWVzID0gbGUxNl90b19jcHUodnMtPmRpcl9lbnRyaWVzKTsKKwlkaXJfc2l6ZV9zY3QgPSAoKGRpcl9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSkpICsKKwkJCShzZWN0b3Jfc2l6ZV9ieXRlcy0xKSkgLyBzZWN0b3Jfc2l6ZV9ieXRlczsKKwlkYmcoImRpcl9zaXplX3NjdCAweCV4IiwgZGlyX3NpemVfc2N0KTsKKworCWNsdXN0ZXJfY291bnQgPSBzZWN0X2NvdW50IC0gKHJlc2VydmVkX3NjdCArIGZhdF9zaXplX3NjdCArIGRpcl9zaXplX3NjdCk7CisJY2x1c3Rlcl9jb3VudCAvPSB2cy0+c2VjdG9yc19wZXJfY2x1c3RlcjsKKwlkYmcoImNsdXN0ZXJfY291bnQgMHgleCIsIGNsdXN0ZXJfY291bnQpOworCisvLwlpZiAoY2x1c3Rlcl9jb3VudCA8IEZBVDEyX01BWCkgeworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiRkFUMTIiKTsKKy8vCX0gZWxzZSBpZiAoY2x1c3Rlcl9jb3VudCA8IEZBVDE2X01BWCkgeworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiRkFUMTYiKTsKKy8vCX0gZWxzZSB7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICJGQVQzMiIpOworLy8JCWdvdG8gZmF0MzI7CisvLwl9CisJaWYgKGNsdXN0ZXJfY291bnQgPj0gRkFUMTZfTUFYKQorCQlnb3RvIGZhdDMyOworCisJLyogdGhlIGxhYmVsIG1heSBiZSBhbiBhdHRyaWJ1dGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJcm9vdF9zdGFydF9vZmYgPSAocmVzZXJ2ZWRfc2N0ICsgZmF0X3NpemVfc2N0KSAqIHNlY3Rvcl9zaXplX2J5dGVzOworCWRiZygicm9vdCBkaXIgc3RhcnQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcm9vdF9zdGFydF9vZmYpOworCWRiZygiZXhwZWN0ZWQgZW50cmllcyAweCV4IiwgZGlyX2VudHJpZXMpOworCisJYnVmX3NpemUgPSBkaXJfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmZhdF9kaXJfZW50cnkpOworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBmYXRfcGFydGl0aW9uX29mZiArIHJvb3Rfc3RhcnRfb2ZmLCBidWZfc2l6ZSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlnb3RvIHJldDsKKworCWxhYmVsID0gZ2V0X2F0dHJfdm9sdW1lX2lkKChzdHJ1Y3QgdmZhdF9kaXJfZW50cnkqKSBidWYsIGRpcl9lbnRyaWVzKTsKKworCXZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGZhdF9wYXJ0aXRpb25fb2ZmLCAweDIwMCk7CisJaWYgKHZzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChsYWJlbCAhPSBOVUxMICYmIG1lbWNtcChsYWJlbCwgIk5PIE5BTUUgICAgIiwgMTEpICE9IDApIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgbGFiZWwsIDExKTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIGxhYmVsLCAxMSk7CisJfSBlbHNlIGlmIChtZW1jbXAodnMtPnR5cGUuZmF0LmxhYmVsLCAiTk8gTkFNRSAgICAiLCAxMSkgIT0gMCkgeworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCB2cy0+dHlwZS5mYXQubGFiZWwsIDExKTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHZzLT50eXBlLmZhdC5sYWJlbCwgMTEpOworCX0KKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHZzLT50eXBlLmZhdC5zZXJubywgVVVJRF9ET1MpOworCWdvdG8gcmV0OworCisgZmF0MzI6CisJLyogRkFUMzIgcm9vdCBkaXIgaXMgYSBjbHVzdGVyIGNoYWluIGxpa2UgYW55IG90aGVyIGRpcmVjdG9yeSAqLworCWJ1Zl9zaXplID0gdnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXIgKiBzZWN0b3Jfc2l6ZV9ieXRlczsKKwlyb290X2NsdXN0ZXIgPSBsZTMyX3RvX2NwdSh2cy0+dHlwZS5mYXQzMi5yb290X2NsdXN0ZXIpOworCXN0YXJ0X2RhdGFfc2N0ID0gcmVzZXJ2ZWRfc2N0ICsgZmF0X3NpemVfc2N0OworCisJbmV4dF9jbHVzdGVyID0gcm9vdF9jbHVzdGVyOworCW1heGxvb3AgPSAxMDA7CisJd2hpbGUgKC0tbWF4bG9vcCkgeworCQl1aW50NjRfdCBuZXh0X29mZl9zY3Q7CisJCXVpbnQ2NF90IG5leHRfb2ZmOworCQl1aW50NjRfdCBmYXRfZW50cnlfb2ZmOworCQlpbnQgY291bnQ7CisKKwkJZGJnKCJuZXh0X2NsdXN0ZXIgMHgleCIsICh1bnNpZ25lZCluZXh0X2NsdXN0ZXIpOworCQluZXh0X29mZl9zY3QgPSAodWludDY0X3QpKG5leHRfY2x1c3RlciAtIDIpICogdnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXI7CisJCW5leHRfb2ZmID0gKHN0YXJ0X2RhdGFfc2N0ICsgbmV4dF9vZmZfc2N0KSAqIHNlY3Rvcl9zaXplX2J5dGVzOworCQlkYmcoImNsdXN0ZXIgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG5leHRfb2ZmKTsKKworCQkvKiBnZXQgY2x1c3RlciAqLworCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgZmF0X3BhcnRpdGlvbl9vZmYgKyBuZXh0X29mZiwgYnVmX3NpemUpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlnb3RvIHJldDsKKworCQlkaXIgPSAoc3RydWN0IHZmYXRfZGlyX2VudHJ5KikgYnVmOworCQljb3VudCA9IGJ1Zl9zaXplIC8gc2l6ZW9mKHN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSk7CisJCWRiZygiZXhwZWN0ZWQgZW50cmllcyAweCV4IiwgY291bnQpOworCisJCWxhYmVsID0gZ2V0X2F0dHJfdm9sdW1lX2lkKGRpciwgY291bnQpOworCQlpZiAobGFiZWwpCisJCQlicmVhazsKKworCQkvKiBnZXQgRkFUIGVudHJ5ICovCisJCWZhdF9lbnRyeV9vZmYgPSAocmVzZXJ2ZWRfc2N0ICogc2VjdG9yX3NpemVfYnl0ZXMpICsgKG5leHRfY2x1c3RlciAqIHNpemVvZih1aW50MzJfdCkpOworCQlkYmcoImZhdF9lbnRyeV9vZmYgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZylmYXRfZW50cnlfb2ZmKTsKKwkJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGZhdF9wYXJ0aXRpb25fb2ZmICsgZmF0X2VudHJ5X29mZiwgYnVmX3NpemUpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlnb3RvIHJldDsKKworCQkvKiBzZXQgbmV4dCBjbHVzdGVyICovCisJCW5leHRfY2x1c3RlciA9IGxlMzJfdG9fY3B1KCoodWludDMyX3QqKWJ1ZikgJiAweDBmZmZmZmZmOworCQlpZiAobmV4dF9jbHVzdGVyIDwgMiB8fCBuZXh0X2NsdXN0ZXIgPiBGQVQzMl9NQVgpCisJCQlicmVhazsKKwl9CisJaWYgKG1heGxvb3AgPT0gMCkKKwkJZGJnKCJyZWFjaGVkIG1heGltdW0gZm9sbG93IGNvdW50IG9mIHJvb3QgY2x1c3RlciBjaGFpbiwgZ2l2ZSB1cCIpOworCisJdnMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgZmF0X3BhcnRpdGlvbl9vZmYsIDB4MjAwKTsKKwlpZiAodnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGxhYmVsICE9IE5VTEwgJiYgbWVtY21wKGxhYmVsLCAiTk8gTkFNRSAgICAiLCAxMSkgIT0gMCkgeworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBsYWJlbCwgMTEpOworCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgbGFiZWwsIDExKTsKKwl9IGVsc2UgaWYgKG1lbWNtcCh2cy0+dHlwZS5mYXQzMi5sYWJlbCwgIk5PIE5BTUUgICAgIiwgMTEpICE9IDApIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgdnMtPnR5cGUuZmF0MzIubGFiZWwsIDExKTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHZzLT50eXBlLmZhdDMyLmxhYmVsLCAxMSk7CisJfQorCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgdnMtPnR5cGUuZmF0MzIuc2Vybm8sIFVVSURfRE9TKTsKKworIHJldDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKwlJRl9GRUFUVVJFX0JMS0lEX1RZUEUoaWQtPnR5cGUgPSAidmZhdCI7KQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9nZXRfZGV2bmFtZS5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvZ2V0X2Rldm5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk5MzA1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvZ2V0X2Rldm5hbWUuYwpAQCAtMCwwICsxLDMxMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIG1vdW50aW5nIGRldmljZXMgYnkgbGFiZWwvdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBKYXNvbiBTY2hvb24gPGZsb3lkcGlua0BnbWFpbC5jb20+CisgKiBTb21lIHBvcnRpb25zIGNyaWJiZWQgZnJvbSBlMmZzcHJvZ3MsIHV0aWwtbGludXgsIGRvc2ZzdG9vbHMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+IC8qIEJMS0dFVFNJWkU2NCAqLworI2lmICFkZWZpbmVkKEJMS0dFVFNJWkU2NCkKKyMgZGVmaW5lIEJMS0dFVFNJWkU2NCBfSU9SKDB4MTIsMTE0LHNpemVfdCkKKyNlbmRpZgorI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdGF0aWMgc3RydWN0IHV1aWRDYWNoZV9zIHsKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKm5leHQ7CisvLwlpbnQgbWFqb3IsIG1pbm9yOworCWNoYXIgKmRldmljZTsKKwljaGFyICpsYWJlbDsKKwljaGFyICp1Y191dWlkOyAvKiBwcmVmaXggbWFrZXMgaXQgZWFzaWVyIHRvIGdyZXAgZm9yICovCisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGNvbnN0IGNoYXIgKnR5cGU7KQorfSAqdXVpZENhY2hlOworCisjaWYgIUVOQUJMRV9GRUFUVVJFX0JMS0lEX1RZUEUKKyNkZWZpbmUgZ2V0X2xhYmVsX3V1aWQoZmQsIGxhYmVsLCB1dWlkLCB0eXBlKSBcCisJZ2V0X2xhYmVsX3V1aWQoZmQsIGxhYmVsLCB1dWlkKQorI2RlZmluZSB1dWlkY2FjaGVfYWRkZW50cnkoZGV2aWNlLCBsYWJlbCwgdXVpZCwgdHlwZSkgXAorCXV1aWRjYWNoZV9hZGRlbnRyeShkZXZpY2UsIGxhYmVsLCB1dWlkKQorI2VuZGlmCisKKy8qIFJldHVybnMgITAgb24gZXJyb3IuCisgKiBPdGhlcndpc2UsIHJldHVybnMgbWFsbG9jJ2VkIHN0cmluZ3MgZm9yIGxhYmVsIGFuZCB1dWlkCisgKiAoYW5kIHRoZXkgY2FuJ3QgYmUgTlVMTCwgYWx0aG91Z2ggdGhleSBjYW4gYmUgIiIpLgorICogTkI6IGNsb3NlcyBmZC4gKi8KK3N0YXRpYyBpbnQKK2dldF9sYWJlbF91dWlkKGludCBmZCwgY2hhciAqKmxhYmVsLCBjaGFyICoqdXVpZCwgY29uc3QgY2hhciAqKnR5cGUpCit7CisJaW50IHJ2ID0gMTsKKwl1aW50NjRfdCBzaXplOworCXN0cnVjdCB2b2x1bWVfaWQgKnZpZDsKKworCS8qIGZkIGlzIG93bmVkIGJ5IHZpZCBub3cgKi8KKwl2aWQgPSB2b2x1bWVfaWRfb3Blbl9ub2RlKGZkKTsKKworCWlmIChpb2N0bCgvKnZpZC0+Ki9mZCwgQkxLR0VUU0laRTY0LCAmc2l6ZSkgIT0gMCkKKwkJc2l6ZSA9IDA7CisKKwlpZiAodm9sdW1lX2lkX3Byb2JlX2FsbCh2aWQsIC8qMCwqLyBzaXplKSAhPSAwKQorCQlnb3RvIHJldDsKKworCWlmICh2aWQtPmxhYmVsWzBdICE9ICdcMCcgfHwgdmlkLT51dWlkWzBdICE9ICdcMCcpIHsKKwkJKmxhYmVsID0geHN0cm5kdXAodmlkLT5sYWJlbCwgc2l6ZW9mKHZpZC0+bGFiZWwpKTsKKwkJKnV1aWQgID0geHN0cm5kdXAodmlkLT51dWlkLCBzaXplb2YodmlkLT51dWlkKSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorCQkqdHlwZSA9IHZpZC0+dHlwZTsKKwkJZGJnKCJmb3VuZCBsYWJlbCAnJXMnLCB1dWlkICclcycsIHR5cGUgJyVzJyIsICpsYWJlbCwgKnV1aWQsICp0eXBlKTsKKyNlbHNlCisJCWRiZygiZm91bmQgbGFiZWwgJyVzJywgdXVpZCAnJXMnIiwgKmxhYmVsLCAqdXVpZCk7CisjZW5kaWYKKwkJcnYgPSAwOworCX0KKyByZXQ6CisJZnJlZV92b2x1bWVfaWQodmlkKTsgLyogYWxzbyBjbG9zZXMgZmQgKi8KKwlyZXR1cm4gcnY7Cit9CisKKy8qIE5COiB3ZSB0YWtlIG93bmVyc2hpcCBvZiAobWFsbG9jJ2VkKSBsYWJlbCBhbmQgdXVpZCAqLworc3RhdGljIHZvaWQKK3V1aWRjYWNoZV9hZGRlbnRyeShjaGFyICpkZXZpY2UsIC8qaW50IG1ham9yLCBpbnQgbWlub3IsKi8gY2hhciAqbGFiZWwsIGNoYXIgKnV1aWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc3RydWN0IHV1aWRDYWNoZV9zICpsYXN0OworCisJaWYgKCF1dWlkQ2FjaGUpIHsKKwkJbGFzdCA9IHV1aWRDYWNoZSA9IHh6YWxsb2Moc2l6ZW9mKCp1dWlkQ2FjaGUpKTsKKwl9IGVsc2UgeworCQlmb3IgKGxhc3QgPSB1dWlkQ2FjaGU7IGxhc3QtPm5leHQ7IGxhc3QgPSBsYXN0LT5uZXh0KQorCQkJY29udGludWU7CisJCWxhc3QtPm5leHQgPSB4emFsbG9jKHNpemVvZigqdXVpZENhY2hlKSk7CisJCWxhc3QgPSBsYXN0LT5uZXh0OworCX0KKwkvKmxhc3QtPm5leHQgPSBOVUxMOyAtIHh6YWxsb2MgZGlkIGl0Ki8KKy8vCWxhc3QtPm1ham9yID0gbWFqb3I7CisvLwlsYXN0LT5taW5vciA9IG1pbm9yOworCWxhc3QtPmRldmljZSA9IGRldmljZTsKKwlsYXN0LT5sYWJlbCA9IGxhYmVsOworCWxhc3QtPnVjX3V1aWQgPSB1dWlkOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShsYXN0LT50eXBlID0gdHlwZTspCit9CisKKy8qIElmIGdldF9sYWJlbF91dWlkKCkgb24gZGV2aWNlX25hbWUgcmV0dXJucyBzdWNjZXNzLAorICogYWRkIGEgY2FjaGUgZW50cnkgZm9yIHRoaXMgZGV2aWNlLgorICogSWYgZGV2aWNlIG5vZGUgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgdGVtcG9yYXJpbHkgY3JlYXRlZC4gKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit1dWlkY2FjaGVfY2hlY2tfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYsCisJCXZvaWQgKnVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBub3RlOiB0aGlzIGNoZWNrIHJlamVjdHMgbGlua3MgdG8gZGV2aWNlcywgYW1vbmcgb3RoZXIgbm9kZXMgKi8KKwlpZiAoIVNfSVNCTEsoc3RhdGJ1Zi0+c3RfbW9kZSkpCisJCXJldHVybiBUUlVFOworCisJLyogVXNlcnMgcmVwb3J0IHRoYXQgbXVja2luZyB3aXRoIGZsb3BwaWVzIChlc3BlY2lhbGx5IG5vbi1wcmVzZW50CisJICogb25lcykgaXMgc2lnbmlmaWNhbnQgUElUQS4gVGhpcyBpcyBhIGhvcnJpYmx5IGRpcnR5IGhhY2ssCisJICogYnV0IGl0IGlzIHZlcnkgdXNlZnVsIGluIHJlYWwgd29ybGQuCisJICogSWYgdGhpcyB3aWxsIGV2ZXIgbmVlZCB0byBiZSBlbmFibGVkLCBjb25zaWRlciB1c2luZyBPX05PTkJMT0NLLgorCSAqLworCWlmIChtYWpvcihzdGF0YnVmLT5zdF9yZGV2KSA9PSAyKQorCQlyZXR1cm4gVFJVRTsKKworCWFkZF90b191dWlkX2NhY2hlKGRldmljZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3V1aWRjYWNoZV9pbml0KHZvaWQpCit7CisJZGJnKCJEQkc6IHV1aWRDYWNoZT0leCwgdXVpZENhY2hlIik7CisJaWYgKHV1aWRDYWNoZSkKKwkJcmV0dXJuOworCisJLyogV2Ugd2VyZSBzY2FubmluZyAvcHJvYy9wYXJ0aXRpb25zCisJICogYW5kIC9wcm9jL3N5cy9kZXYvY2Ryb20vaW5mbyBoZXJlLgorCSAqIE1pc3NlZCB2b2x1bWUgbWFuYWdlcnMuIEkgc2VlIHRoYXQgInN0YW5kYXJkIiBibGtpZCB1c2VzIHRoZXNlOgorCSAqIC9kZXYvbWFwcGVyL2NvbnRyb2wKKwkgKiAvcHJvYy9kZXZpY2VzCisJICogL3Byb2MvZXZtcy92b2x1bWVzCisJICogL3Byb2MvbHZtL1ZHcworCSAqIFRoaXMgaXMgdW5hY2NlcHRhYmx5IGNvbXBsZXguIExldCdzIGp1c3Qgc2NhbiAvZGV2LgorCSAqIChNYXliZSBhZGQgc2Nhbm5pbmcgb2YgL3N5cy9ibG9jay9YWFgvZGV2IGZvciBkZXZpY2VzCisJICogc29tZWhvdyBub3QgaGF2aW5nIHRoZWlyIC9kZXYvWFhYIGVudHJpZXMgY3JlYXRlZD8pICovCisKKwlyZWN1cnNpdmVfYWN0aW9uKCIvZGV2IiwgQUNUSU9OX1JFQ1VSU0UsCisJCXV1aWRjYWNoZV9jaGVja19kZXZpY2UsIC8qIGZpbGVfYWN0aW9uICovCisJCU5VTEwsIC8qIGRpcl9hY3Rpb24gKi8KKwkJTlVMTCwgLyogdXNlckRhdGEgKi8KKwkJMCAvKiBkZXB0aCAqLyk7Cit9CisKKyNkZWZpbmUgVVVJRCAgIDEKKyNkZWZpbmUgVk9MICAgIDIKKworI2lmZGVmIFVOVVNFRAorc3RhdGljIGNoYXIgKgorZ2V0X3NwZWNfYnlfeChpbnQgbiwgY29uc3QgY2hhciAqdCwgaW50ICptYWpvclB0ciwgaW50ICptaW5vclB0cikKK3sKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKnVjOworCisJdXVpZGNhY2hlX2luaXQoKTsKKwl1YyA9IHV1aWRDYWNoZTsKKworCXdoaWxlICh1YykgeworCQlzd2l0Y2ggKG4pIHsKKwkJY2FzZSBVVUlEOgorCQkJaWYgKHN0cmNtcCh0LCB1Yy0+dWNfdXVpZCkgPT0gMCkgeworCQkJCSptYWpvclB0ciA9IHVjLT5tYWpvcjsKKwkJCQkqbWlub3JQdHIgPSB1Yy0+bWlub3I7CisJCQkJcmV0dXJuIHVjLT5kZXZpY2U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWT0w6CisJCQlpZiAoc3RyY21wKHQsIHVjLT5sYWJlbCkgPT0gMCkgeworCQkJCSptYWpvclB0ciA9IHVjLT5tYWpvcjsKKwkJCQkqbWlub3JQdHIgPSB1Yy0+bWlub3I7CisJCQkJcmV0dXJuIHVjLT5kZXZpY2U7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQl1YyA9IHVjLT5uZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2Zyb21oZXgoY2hhciBjKQoreworCWlmIChpc2RpZ2l0KGMpKQorCQlyZXR1cm4gKGMgLSAnMCcpOworCXJldHVybiAoKGN8MHgyMCkgLSAnYScgKyAxMCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2dldF9zcGVjX2J5X3V1aWQoY29uc3QgY2hhciAqcywgaW50ICptYWpvciwgaW50ICptaW5vcikKK3sKKwl1bnNpZ25lZCBjaGFyIHV1aWRbMTZdOworCWludCBpOworCisJaWYgKHN0cmxlbihzKSAhPSAzNiB8fCBzWzhdICE9ICctJyB8fCBzWzEzXSAhPSAnLScKKwkgfHwgc1sxOF0gIT0gJy0nIHx8IHNbMjNdICE9ICctJworCSkgeworCQlnb3RvIGJhZF91dWlkOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAoKnMgPT0gJy0nKQorCQkJcysrOworCQlpZiAoIWlzeGRpZ2l0KHNbMF0pIHx8ICFpc3hkaWdpdChzWzFdKSkKKwkJCWdvdG8gYmFkX3V1aWQ7CisJCXV1aWRbaV0gPSAoKGZyb21oZXgoc1swXSkgPDwgNCkgfCBmcm9taGV4KHNbMV0pKTsKKwkJcyArPSAyOworCX0KKwlyZXR1cm4gZ2V0X3NwZWNfYnlfeChVVUlELCAoY2hhciAqKXV1aWQsIG1ham9yLCBtaW5vcik7CisKKyBiYWRfdXVpZDoKKwlmcHJpbnRmKHN0ZGVyciwgXygibW91bnQ6IGJhZCBVVUlEIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfc3BlY19ieV92b2x1bWVfbGFiZWwoY29uc3QgY2hhciAqcywgaW50ICptYWpvciwgaW50ICptaW5vcikKK3sKKwlyZXR1cm4gZ2V0X3NwZWNfYnlfeChWT0wsIHMsIG1ham9yLCBtaW5vcik7Cit9CisjZW5kaWYgLy8gVU5VU0VECisKKy8qIFVzZWQgYnkgYmxraWQgKi8KK3ZvaWQgZGlzcGxheV91dWlkX2NhY2hlKHZvaWQpCit7CisJc3RydWN0IHV1aWRDYWNoZV9zICp1OworCisJdXVpZGNhY2hlX2luaXQoKTsKKwl1ID0gdXVpZENhY2hlOworCXdoaWxlICh1KSB7CisJCXByaW50ZigiJXM6IiwgdS0+ZGV2aWNlKTsKKwkJaWYgKHUtPmxhYmVsWzBdKQorCQkJcHJpbnRmKCIgTEFCRUw9XCIlc1wiIiwgdS0+bGFiZWwpOworCQlpZiAodS0+dWNfdXVpZFswXSkKKwkJCXByaW50ZigiIFVVSUQ9XCIlc1wiIiwgdS0+dWNfdXVpZCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorCWlmICh1LT50eXBlKQorCQlwcmludGYoIiBUWVBFPVwiJXNcIiIsIHUtPnR5cGUpOworI2VuZGlmCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCXUgPSB1LT5uZXh0OworCX0KK30KKworaW50IGFkZF90b191dWlkX2NhY2hlKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwljaGFyICp1dWlkID0gdXVpZDsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqbGFiZWwgPSBsYWJlbDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9CTEtJRF9UWVBFCisJY29uc3QgY2hhciAqdHlwZSA9IHR5cGU7CisjZW5kaWYKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBnZXRfbGFiZWxfdXVpZCgpIGNsb3NlcyBmZCBpbiBhbGwgY2FzZXMgKHN1Y2Nlc3MgJiBmYWlsdXJlKSAqLworCWlmIChnZXRfbGFiZWxfdXVpZChmZCwgJmxhYmVsLCAmdXVpZCwgJnR5cGUpID09IDApIHsKKwkJLyogdXVpZGNhY2hlX2FkZGVudHJ5KCkgdGFrZXMgb3duZXJzaGlwIG9mIGFsbCBmb3VyIHBhcmFtcyAqLworCQl1dWlkY2FjaGVfYWRkZW50cnkoeHN0cmR1cChkZXZpY2UpLCAvKm1hLCBtaSwqLyBsYWJlbCwgdXVpZCwgdHlwZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBVc2VkIGJ5IG1vdW50IGFuZCBmaW5kZnMgKi8KKworY2hhciAqZ2V0X2Rldm5hbWVfZnJvbV9sYWJlbChjb25zdCBjaGFyICpzcGVjKQoreworCXN0cnVjdCB1dWlkQ2FjaGVfcyAqdWM7CisKKwl1dWlkY2FjaGVfaW5pdCgpOworCXVjID0gdXVpZENhY2hlOworCXdoaWxlICh1YykgeworCQlpZiAodWMtPmxhYmVsWzBdICYmIHN0cmNtcChzcGVjLCB1Yy0+bGFiZWwpID09IDApIHsKKwkJCXJldHVybiB4c3RyZHVwKHVjLT5kZXZpY2UpOworCQl9CisJCXVjID0gdWMtPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitjaGFyICpnZXRfZGV2bmFtZV9mcm9tX3V1aWQoY29uc3QgY2hhciAqc3BlYykKK3sKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKnVjOworCisJdXVpZGNhY2hlX2luaXQoKTsKKwl1YyA9IHV1aWRDYWNoZTsKKwl3aGlsZSAodWMpIHsKKwkJLyogY2FzZSBvZiBoZXggbnVtYmVycyBkb2Vzbid0IG1hdHRlciAqLworCQlpZiAoc3RyY2FzZWNtcChzcGVjLCB1Yy0+dWNfdXVpZCkgPT0gMCkgeworCQkJcmV0dXJuIHhzdHJkdXAodWMtPmRldmljZSk7CisJCX0KKwkJdWMgPSB1Yy0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCByZXNvbHZlX21vdW50X3NwZWMoY2hhciAqKmZzbmFtZSkKK3sKKwljaGFyICp0bXAgPSAqZnNuYW1lOworCisJaWYgKHN0cm5jbXAoKmZzbmFtZSwgIlVVSUQ9IiwgNSkgPT0gMCkKKwkJdG1wID0gZ2V0X2Rldm5hbWVfZnJvbV91dWlkKCpmc25hbWUgKyA1KTsKKwllbHNlIGlmIChzdHJuY21wKCpmc25hbWUsICJMQUJFTD0iLCA2KSA9PSAwKQorCQl0bXAgPSBnZXRfZGV2bmFtZV9mcm9tX2xhYmVsKCpmc25hbWUgKyA2KTsKKworCWlmICh0bXAgPT0gKmZzbmFtZSkKKwkJcmV0dXJuIDA7IC8qIG5vIFVVSUQ9IG9yIExBQkVMPSBwcmVmaXggZm91bmQgKi8KKworCWlmICh0bXApCisJCSpmc25hbWUgPSB0bXA7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9oZnMuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2hmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjE5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9oZnMuYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGhmc19maW5kZXJfaW5mb3sKKwl1aW50MzJfdAlib290X2ZvbGRlcjsKKwl1aW50MzJfdAlzdGFydF9hcHA7CisJdWludDMyX3QJb3Blbl9mb2xkZXI7CisJdWludDMyX3QJb3M5X2ZvbGRlcjsKKwl1aW50MzJfdAlyZXNlcnZlZDsKKwl1aW50MzJfdAlvc3hfZm9sZGVyOworCXVpbnQ4X3QJCWlkWzhdOworfSBQQUNLRUQ7CisKK3N0cnVjdCBoZnNfbWRiIHsKKwl1aW50OF90CQlzaWduYXR1cmVbMl07CisJdWludDMyX3QJY3JfZGF0ZTsKKwl1aW50MzJfdAlsc19Nb2Q7CisJdWludDE2X3QJYXRyYjsKKwl1aW50MTZfdAlubV9mbHM7CisJdWludDE2X3QJdmJtX3N0OworCXVpbnQxNl90CWFsbG9jX3B0cjsKKwl1aW50MTZfdAlubV9hbF9ibGtzOworCXVpbnQzMl90CWFsX2Jsa19zaXplOworCXVpbnQzMl90CWNscF9zaXplOworCXVpbnQxNl90CWFsX2JsX3N0OworCXVpbnQzMl90CW54dF9jbmlkOworCXVpbnQxNl90CWZyZWVfYmtzOworCXVpbnQ4X3QJCWxhYmVsX2xlbjsKKwl1aW50OF90CQlsYWJlbFsyN107CisJdWludDMyX3QJdm9sX2JrdXA7CisJdWludDE2X3QJdm9sX3NlcV9udW07CisJdWludDMyX3QJd3JfY250OworCXVpbnQzMl90CXh0X2NsdW1wX3NpemU7CisJdWludDMyX3QJY3RfY2x1bXBfc2l6ZTsKKwl1aW50MTZfdAludW1fcm9vdF9kaXJzOworCXVpbnQzMl90CWZpbGVfY291bnQ7CisJdWludDMyX3QJZGlyX2NvdW50OworCXN0cnVjdCBoZnNfZmluZGVyX2luZm8gZmluZGVyX2luZm87CisJdWludDhfdAkJZW1iZWRfc2lnWzJdOworCXVpbnQxNl90CWVtYmVkX3N0YXJ0YmxvY2s7CisJdWludDE2X3QJZW1iZWRfYmxvY2tjb3VudDsKK30gUEFDS0VEOworCitzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yIHsKKwl1aW50MzJfdAluZXh0OworCXVpbnQzMl90CXByZXY7CisJdWludDhfdAkJdHlwZTsKKwl1aW50OF90CQloZWlnaHQ7CisJdWludDE2X3QJbnVtX3JlY3M7CisJdWludDE2X3QJcmVzZXJ2ZWQ7Cit9IFBBQ0tFRDsKKworc3RydWN0IGhmc3BsdXNfYmhlYWRlcl9yZWNvcmQgeworCXVpbnQxNl90CWRlcHRoOworCXVpbnQzMl90CXJvb3Q7CisJdWludDMyX3QJbGVhZl9jb3VudDsKKwl1aW50MzJfdAlsZWFmX2hlYWQ7CisJdWludDMyX3QJbGVhZl90YWlsOworCXVpbnQxNl90CW5vZGVfc2l6ZTsKK30gUEFDS0VEOworCitzdHJ1Y3QgaGZzcGx1c19jYXRhbG9nX2tleSB7CisJdWludDE2X3QJa2V5X2xlbjsKKwl1aW50MzJfdAlwYXJlbnRfaWQ7CisJdWludDE2X3QJdW5pY29kZV9sZW47CisJdWludDhfdAkJdW5pY29kZVsyNTUgKiAyXTsKK30gUEFDS0VEOworCitzdHJ1Y3QgaGZzcGx1c19leHRlbnQgeworCXVpbnQzMl90CXN0YXJ0X2Jsb2NrOworCXVpbnQzMl90CWJsb2NrX2NvdW50OworfSBQQUNLRUQ7CisKKyNkZWZpbmUgSEZTUExVU19FWFRFTlRfQ09VTlQJCTgKK3N0cnVjdCBoZnNwbHVzX2ZvcmsgeworCXVpbnQ2NF90CXRvdGFsX3NpemU7CisJdWludDMyX3QJY2x1bXBfc2l6ZTsKKwl1aW50MzJfdAl0b3RhbF9ibG9ja3M7CisJc3RydWN0IGhmc3BsdXNfZXh0ZW50IGV4dGVudHNbSEZTUExVU19FWFRFTlRfQ09VTlRdOworfSBQQUNLRUQ7CisKK3N0cnVjdCBoZnNwbHVzX3ZvbF9oZWFkZXIgeworCXVpbnQ4X3QJCXNpZ25hdHVyZVsyXTsKKwl1aW50MTZfdAl2ZXJzaW9uOworCXVpbnQzMl90CWF0dHJpYnV0ZXM7CisJdWludDMyX3QJbGFzdF9tb3VudF92ZXJzOworCXVpbnQzMl90CXJlc2VydmVkOworCXVpbnQzMl90CWNyZWF0ZV9kYXRlOworCXVpbnQzMl90CW1vZGlmeV9kYXRlOworCXVpbnQzMl90CWJhY2t1cF9kYXRlOworCXVpbnQzMl90CWNoZWNrZWRfZGF0ZTsKKwl1aW50MzJfdAlmaWxlX2NvdW50OworCXVpbnQzMl90CWZvbGRlcl9jb3VudDsKKwl1aW50MzJfdAlibG9ja3NpemU7CisJdWludDMyX3QJdG90YWxfYmxvY2tzOworCXVpbnQzMl90CWZyZWVfYmxvY2tzOworCXVpbnQzMl90CW5leHRfYWxsb2M7CisJdWludDMyX3QJcnNyY19jbHVtcF9zejsKKwl1aW50MzJfdAlkYXRhX2NsdW1wX3N6OworCXVpbnQzMl90CW5leHRfY25pZDsKKwl1aW50MzJfdAl3cml0ZV9jb3VudDsKKwl1aW50NjRfdAllbmNvZGluZ3NfYm1wOworCXN0cnVjdCBoZnNfZmluZGVyX2luZm8gZmluZGVyX2luZm87CisJc3RydWN0IGhmc3BsdXNfZm9yayBhbGxvY19maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmsgZXh0X2ZpbGU7CisJc3RydWN0IGhmc3BsdXNfZm9yayBjYXRfZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrIGF0dHJfZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrIHN0YXJ0X2ZpbGU7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBIRlNfU1VQRVJCTE9DS19PRkZTRVQJCTB4NDAwCisjZGVmaW5lIEhGU19OT0RFX0xFQUYJCQkweGZmCisjZGVmaW5lIEhGU1BMVVNfUE9SX0NOSUQJCTEKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaGZzX2hmc3BsdXMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisJdWludDY0X3Qgb2ZmID0gMDsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJdW5zaWduZWQgY2F0X2Jsb2NrOworCXVuc2lnbmVkIGV4dF9ibG9ja19zdGFydDsKKwl1bnNpZ25lZCBleHRfYmxvY2tfY291bnQ7CisJaW50IGV4dDsKKwl1bnNpZ25lZCBsZWFmX25vZGVfaGVhZDsKKwl1bnNpZ25lZCBsZWFmX25vZGVfY291bnQ7CisJdW5zaWduZWQgbGVhZl9ub2RlX3NpemU7CisJdW5zaWduZWQgbGVhZl9ibG9jazsKKwl1aW50NjRfdCBsZWFmX29mZjsKKwl1bnNpZ25lZCBhbGxvY19ibG9ja19zaXplOworCXVuc2lnbmVkIGFsbG9jX2ZpcnN0X2Jsb2NrOworCXVuc2lnbmVkIGVtYmVkX2ZpcnN0X2Jsb2NrOworCXVuc2lnbmVkIHJlY29yZF9jb3VudDsKKwlzdHJ1Y3QgaGZzcGx1c192b2xfaGVhZGVyICpoZnNwbHVzOworCXN0cnVjdCBoZnNwbHVzX2Jub2RlX2Rlc2NyaXB0b3IgKmRlc2NyOworCXN0cnVjdCBoZnNwbHVzX2JoZWFkZXJfcmVjb3JkICpibm9kZTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRhbG9nX2tleSAqa2V5OworCXVuc2lnbmVkIGxhYmVsX2xlbjsKKwlzdHJ1Y3QgaGZzcGx1c19leHRlbnQgZXh0ZW50c1tIRlNQTFVTX0VYVEVOVF9DT1VOVF07CisJc3RydWN0IGhmc19tZGIgKmhmczsKKwljb25zdCB1aW50OF90ICpidWY7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgSEZTX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwloZnMgPSAoc3RydWN0IGhmc19tZGIgKikgYnVmOworCWlmIChoZnMtPnNpZ25hdHVyZVswXSAhPSAnQicgfHwgaGZzLT5zaWduYXR1cmVbMV0gIT0gJ0QnKQorCQlnb3RvIGNoZWNrcGx1czsKKworCS8qIGl0IG1heSBiZSBqdXN0IGEgaGZzIHdyYXBwZXIgZm9yIGhmcysgKi8KKwlpZiAoaGZzLT5lbWJlZF9zaWdbMF0gPT0gJ0gnICYmIGhmcy0+ZW1iZWRfc2lnWzFdID09ICcrJykgeworCQlhbGxvY19ibG9ja19zaXplID0gYmUzMl90b19jcHUoaGZzLT5hbF9ibGtfc2l6ZSk7CisJCWRiZygiYWxsb2NfYmxvY2tfc2l6ZSAweCV4IiwgYWxsb2NfYmxvY2tfc2l6ZSk7CisKKwkJYWxsb2NfZmlyc3RfYmxvY2sgPSBiZTE2X3RvX2NwdShoZnMtPmFsX2JsX3N0KTsKKwkJZGJnKCJhbGxvY19maXJzdF9ibG9jayAweCV4IiwgYWxsb2NfZmlyc3RfYmxvY2spOworCisJCWVtYmVkX2ZpcnN0X2Jsb2NrID0gYmUxNl90b19jcHUoaGZzLT5lbWJlZF9zdGFydGJsb2NrKTsKKwkJZGJnKCJlbWJlZF9maXJzdF9ibG9jayAweCV4IiwgZW1iZWRfZmlyc3RfYmxvY2spOworCisJCW9mZiArPSAoYWxsb2NfZmlyc3RfYmxvY2sgKiA1MTIpICsKKwkJICAgICAgIChlbWJlZF9maXJzdF9ibG9jayAqIGFsbG9jX2Jsb2NrX3NpemUpOworCQlkYmcoImhmcyB3cmFwcGVkIGhmcysgZm91bmQgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwkJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIEhGU19TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWdvdG8gY2hlY2twbHVzOworCX0KKworCWlmIChoZnMtPmxhYmVsX2xlbiA+IDAgJiYgaGZzLT5sYWJlbF9sZW4gPCAyOCkgeworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBoZnMtPmxhYmVsLCBoZnMtPmxhYmVsX2xlbik7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBoZnMtPmxhYmVsLCBoZnMtPmxhYmVsX2xlbikgOworCX0KKworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgaGZzLT5maW5kZXJfaW5mby5pZCwgVVVJRF9IRlMpOworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJoZnMiOykKKworCXJldHVybiAwOworCisgY2hlY2twbHVzOgorCWhmc3BsdXMgPSAoc3RydWN0IGhmc3BsdXNfdm9sX2hlYWRlciAqKSBidWY7CisJaWYgKGhmcy0+c2lnbmF0dXJlWzBdID09ICdIJykKKwkJaWYgKGhmcy0+c2lnbmF0dXJlWzFdID09ICcrJyB8fCBoZnMtPnNpZ25hdHVyZVsxXSA9PSAnWCcpCisJCQlnb3RvIGhmc3BsdXM7CisJcmV0dXJuIC0xOworCisgaGZzcGx1czoKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIGhmc3BsdXMtPmZpbmRlcl9pbmZvLmlkLCBVVUlEX0hGUyk7CisKKwlibG9ja3NpemUgPSBiZTMyX3RvX2NwdShoZnNwbHVzLT5ibG9ja3NpemUpOworCWRiZygiYmxvY2tzaXplICV1IiwgYmxvY2tzaXplKTsKKworCW1lbWNweShleHRlbnRzLCBoZnNwbHVzLT5jYXRfZmlsZS5leHRlbnRzLCBzaXplb2YoZXh0ZW50cykpOworCWNhdF9ibG9jayA9IGJlMzJfdG9fY3B1KGV4dGVudHNbMF0uc3RhcnRfYmxvY2spOworCWRiZygiY2F0YWxvZyBzdGFydCBibG9jayAweCV4IiwgY2F0X2Jsb2NrKTsKKworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoY2F0X2Jsb2NrICogYmxvY2tzaXplKSwgMHgyMDAwKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZm91bmQ7CisKKwlibm9kZSA9IChzdHJ1Y3QgaGZzcGx1c19iaGVhZGVyX3JlY29yZCAqKQorCQkmYnVmW3NpemVvZihzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yKV07CisKKwlsZWFmX25vZGVfaGVhZCA9IGJlMzJfdG9fY3B1KGJub2RlLT5sZWFmX2hlYWQpOworCWRiZygiY2F0YWxvZyBsZWFmIG5vZGUgMHgleCIsIGxlYWZfbm9kZV9oZWFkKTsKKworCWxlYWZfbm9kZV9zaXplID0gYmUxNl90b19jcHUoYm5vZGUtPm5vZGVfc2l6ZSk7CisJZGJnKCJsZWFmIG5vZGUgc2l6ZSAweCV4IiwgbGVhZl9ub2RlX3NpemUpOworCisJbGVhZl9ub2RlX2NvdW50ID0gYmUzMl90b19jcHUoYm5vZGUtPmxlYWZfY291bnQpOworCWRiZygibGVhZiBub2RlIGNvdW50IDB4JXgiLCBsZWFmX25vZGVfY291bnQpOworCWlmIChsZWFmX25vZGVfY291bnQgPT0gMCkKKwkJZ290byBmb3VuZDsKKworCWxlYWZfYmxvY2sgPSAobGVhZl9ub2RlX2hlYWQgKiBsZWFmX25vZGVfc2l6ZSkgLyBibG9ja3NpemU7CisKKwkvKiBnZXQgcGh5c2ljYWwgbG9jYXRpb24gKi8KKwlmb3IgKGV4dCA9IDA7IGV4dCA8IEhGU1BMVVNfRVhURU5UX0NPVU5UOyBleHQrKykgeworCQlleHRfYmxvY2tfc3RhcnQgPSBiZTMyX3RvX2NwdShleHRlbnRzW2V4dF0uc3RhcnRfYmxvY2spOworCQlleHRfYmxvY2tfY291bnQgPSBiZTMyX3RvX2NwdShleHRlbnRzW2V4dF0uYmxvY2tfY291bnQpOworCQlkYmcoImV4dGVudCBzdGFydCBibG9jayAweCV4LCBjb3VudCAweCV4IiwgZXh0X2Jsb2NrX3N0YXJ0LCBleHRfYmxvY2tfY291bnQpOworCisJCWlmIChleHRfYmxvY2tfY291bnQgPT0gMCkKKwkJCWdvdG8gZm91bmQ7CisKKwkJLyogdGhpcyBpcyBvdXIgZXh0ZW50ICovCisJCWlmIChsZWFmX2Jsb2NrIDwgZXh0X2Jsb2NrX2NvdW50KQorCQkJYnJlYWs7CisKKwkJbGVhZl9ibG9jayAtPSBleHRfYmxvY2tfY291bnQ7CisJfQorCWlmIChleHQgPT0gSEZTUExVU19FWFRFTlRfQ09VTlQpCisJCWdvdG8gZm91bmQ7CisJZGJnKCJmb3VuZCBibG9jayBpbiBleHRlbnQgJWkiLCBleHQpOworCisJbGVhZl9vZmYgPSAoZXh0X2Jsb2NrX3N0YXJ0ICsgbGVhZl9ibG9jaykgKiBibG9ja3NpemU7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbGVhZl9vZmYsIGxlYWZfbm9kZV9zaXplKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZm91bmQ7CisKKwlkZXNjciA9IChzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yICopIGJ1ZjsKKwlkYmcoImRlc2NyaXB0b3IgdHlwZSAweCV4IiwgZGVzY3ItPnR5cGUpOworCisJcmVjb3JkX2NvdW50ID0gYmUxNl90b19jcHUoZGVzY3ItPm51bV9yZWNzKTsKKwlkYmcoIm51bWJlciBvZiByZWNvcmRzICV1IiwgcmVjb3JkX2NvdW50KTsKKwlpZiAocmVjb3JkX2NvdW50ID09IDApCisJCWdvdG8gZm91bmQ7CisKKwlpZiAoZGVzY3ItPnR5cGUgIT0gSEZTX05PREVfTEVBRikKKwkJZ290byBmb3VuZDsKKworCWtleSA9IChzdHJ1Y3QgaGZzcGx1c19jYXRhbG9nX2tleSAqKQorCQkmYnVmW3NpemVvZihzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yKV07CisKKwlkYmcoInBhcmVudCBpZCAweCV4IiwgYmUzMl90b19jcHUoa2V5LT5wYXJlbnRfaWQpKTsKKwlpZiAoa2V5LT5wYXJlbnRfaWQgIT0gY3B1X3RvX2JlMzIoSEZTUExVU19QT1JfQ05JRCkpCisJCWdvdG8gZm91bmQ7CisKKwlsYWJlbF9sZW4gPSBiZTE2X3RvX2NwdShrZXktPnVuaWNvZGVfbGVuKSAqIDI7CisJZGJnKCJsYWJlbCB1bmljb2RlMTYgbGVuICVpIiwgbGFiZWxfbGVuKTsKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBrZXktPnVuaWNvZGUsIGxhYmVsX2xlbik7CisJdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoaWQsIGtleS0+dW5pY29kZSwgQkUsIGxhYmVsX2xlbik7CisKKyBmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCWlkLT50eXBlID0gImhmc3BsdXMiOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9pc285NjYwLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9pc285NjYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3NjkzYQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2lzbzk2NjAuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworI2RlZmluZSBJU09fU1VQRVJCTE9DS19PRkZTRVQJCTB4ODAwMAorI2RlZmluZSBJU09fU0VDVE9SX1NJWkUJCQkweDgwMAorI2RlZmluZSBJU09fVkRfT0ZGU0VUCQkJKElTT19TVVBFUkJMT0NLX09GRlNFVCArIElTT19TRUNUT1JfU0laRSkKKyNkZWZpbmUgSVNPX1ZEX1BSSU1BUlkJCQkweDEKKyNkZWZpbmUgSVNPX1ZEX1NVUFBMRU1FTlRBUlkJCTB4MgorI2RlZmluZSBJU09fVkRfRU5ECQkJMHhmZgorI2RlZmluZSBJU09fVkRfTUFYCQkJMTYKKworc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciB7CisJdWludDhfdAkJdmRfdHlwZTsKKwl1aW50OF90CQl2ZF9pZFs1XTsKKwl1aW50OF90CQl2ZF92ZXJzaW9uOworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCXN5c3RlbV9pZFszMl07CisJdWludDhfdAkJdm9sdW1lX2lkWzMyXTsKKwl1aW50OF90CQl1bnVzZWRbOF07CisJdWludDhfdAkJc3BhY2Vfc2l6ZVs4XTsKKwl1aW50OF90CQllc2NhcGVfc2VxdWVuY2VzWzhdOworfSBQQUNLRUQ7CisKK3N0cnVjdCBoaWdoX3NpZXJyYV92b2x1bWVfZGVzY3JpcHRvciB7CisJdWludDhfdAkJZm9vWzhdOworCXVpbnQ4X3QJCXR5cGU7CisJdWludDhfdAkJaWRbNF07CisJdWludDhfdAkJdmVyc2lvbjsKK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9pc285NjYwKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXVpbnQ4X3QgKmJ1ZjsKKwlzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICppczsKKwlzdHJ1Y3QgaGlnaF9zaWVycmFfdm9sdW1lX2Rlc2NyaXB0b3IgKmhzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIElTT19TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaXMgPSAoc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAqKSBidWY7CisKKwlpZiAobWVtY21wKGlzLT52ZF9pZCwgIkNEMDAxIiwgNSkgPT0gMCkgeworCQlpbnQgdmRfb2Zmc2V0OworCQlpbnQgaTsKKworCQlkYmcoInJlYWQgbGFiZWwgZnJvbSBQVkQiKTsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgaXMtPnZvbHVtZV9pZCwgMzIpOworCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgaXMtPnZvbHVtZV9pZCwgMzIpOworCisJCWRiZygibG9va2luZyBmb3IgU1ZEcyIpOworCQl2ZF9vZmZzZXQgPSBJU09fVkRfT0ZGU0VUOworCQlmb3IgKGkgPSAwOyBpIDwgSVNPX1ZEX01BWDsgaSsrKSB7CisJCQl1aW50OF90IHN2ZF9sYWJlbFs2NF07CisKKwkJCWlzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIHZkX29mZnNldCwgMHgyMDApOworCQkJaWYgKGlzID09IE5VTEwgfHwgaXMtPnZkX3R5cGUgPT0gSVNPX1ZEX0VORCkKKwkJCQlicmVhazsKKwkJCWlmIChpcy0+dmRfdHlwZSAhPSBJU09fVkRfU1VQUExFTUVOVEFSWSkKKwkJCQljb250aW51ZTsKKworCQkJZGJnKCJmb3VuZCBTVkQgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIChvZmYgKyB2ZF9vZmZzZXQpKTsKKwkJCWlmIChtZW1jbXAoaXMtPmVzY2FwZV9zZXF1ZW5jZXMsICIlL0AiLCAzKSA9PSAwCisJCQkgfHwgbWVtY21wKGlzLT5lc2NhcGVfc2VxdWVuY2VzLCAiJS9DIiwgMykgPT0gMAorCQkJIHx8IG1lbWNtcChpcy0+ZXNjYXBlX3NlcXVlbmNlcywgIiUvRSIsIDMpID09IDAKKwkJCSkgeworCQkJCWRiZygiSm9saWV0IGV4dGVuc2lvbiBmb3VuZCIpOworCQkJCXZvbHVtZV9pZF9zZXRfdW5pY29kZTE2KChjaGFyICopc3ZkX2xhYmVsLCBzaXplb2Yoc3ZkX2xhYmVsKSwgaXMtPnZvbHVtZV9pZCwgQkUsIDMyKTsKKwkJCQlpZiAobWVtY21wKGlkLT5sYWJlbCwgc3ZkX2xhYmVsLCAxNikgPT0gMCkgeworCQkJCQlkYmcoIlNWRCBsYWJlbCBpcyBpZGVudGljYWwsIHVzZSB0aGUgcG9zc2libHkgbG9uZ2VyIFBWRCBvbmUiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisvLwkJCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgaXMtPnZvbHVtZV9pZCwgMzIpOworCQkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzdmRfbGFiZWwsIDMyKTsKKy8vCQkJCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiSm9saWV0IEV4dGVuc2lvbiIpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCQl2ZF9vZmZzZXQgKz0gSVNPX1NFQ1RPUl9TSVpFOworCQl9CisJCWdvdG8gZm91bmQ7CisJfQorCisJaHMgPSAoc3RydWN0IGhpZ2hfc2llcnJhX3ZvbHVtZV9kZXNjcmlwdG9yICopIGJ1ZjsKKworCWlmIChtZW1jbXAoaHMtPmlkLCAiQ0RST00iLCA1KSA9PSAwKSB7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICJIaWdoIFNpZXJyYSIpOworCQlnb3RvIGZvdW5kOworCX0KKworCXJldHVybiAtMTsKKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJpc285NjYwIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2pmcy5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvamZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzM2FmMgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2pmcy5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBqZnNfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCW1hZ2ljWzRdOworCXVpbnQzMl90CXZlcnNpb247CisJdWludDY0X3QJc2l6ZTsKKwl1aW50MzJfdAlic2l6ZTsKKwl1aW50MzJfdAlkdW1teTE7CisJdWludDMyX3QJcGJzaXplOworCXVpbnQzMl90CWR1bW15MlsyN107CisJdWludDhfdAkJdXVpZFsxNl07CisJdWludDhfdAkJbGFiZWxbMTZdOworCXVpbnQ4X3QJCWxvZ3V1aWRbMTZdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgSkZTX1NVUEVSQkxPQ0tfT0ZGU0VUCQkJMHg4MDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2pmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3QgamZzX3N1cGVyX2Jsb2NrICpqczsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWpzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIEpGU19TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChqcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKGpzLT5tYWdpYywgIkpGUzEiLCA0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBqcy0+bGFiZWwsIDE2KTsKKwl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwganMtPmxhYmVsLCAxNik7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCBqcy0+dXVpZCwgVVVJRF9EQ0UpOworCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImpmcyI7KQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9saW51eF9yYWlkLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9saW51eF9yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxZTU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3JhaWQuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbWRwX3N1cGVyX2Jsb2NrIHsKKwl1aW50MzJfdAltZF9tYWdpYzsKKwl1aW50MzJfdAltYWpvcl92ZXJzaW9uOworCXVpbnQzMl90CW1pbm9yX3ZlcnNpb247CisJdWludDMyX3QJcGF0Y2hfdmVyc2lvbjsKKwl1aW50MzJfdAlndmFsaWRfd29yZHM7CisJdWludDMyX3QJc2V0X3V1aWQwOworCXVpbnQzMl90CWN0aW1lOworCXVpbnQzMl90CWxldmVsOworCXVpbnQzMl90CXNpemU7CisJdWludDMyX3QJbnJfZGlza3M7CisJdWludDMyX3QJcmFpZF9kaXNrczsKKwl1aW50MzJfdAltZF9taW5vcjsKKwl1aW50MzJfdAlub3RfcGVyc2lzdGVudDsKKwl1aW50MzJfdAlzZXRfdXVpZDE7CisJdWludDMyX3QJc2V0X3V1aWQyOworCXVpbnQzMl90CXNldF91dWlkMzsKK30gUEFDS0VEOworCisjZGVmaW5lIE1EX1JFU0VSVkVEX0JZVEVTCQkweDEwMDAwCisjZGVmaW5lIE1EX01BR0lDCQkJMHhhOTJiNGVmYworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9saW51eF9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKQoreworCXR5cGVkZWYgdWludDMyX3QgYWxpYXNlZF91aW50MzJfdCBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJdWludDY0X3Qgc2JvZmY7CisJdWludDhfdCB1dWlkWzE2XTsKKwlzdHJ1Y3QgbWRwX3N1cGVyX2Jsb2NrICptZHA7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCwgc2l6ZSAweCVsbHgiLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworCisJaWYgKHNpemUgPCAweDEwMDAwKQorCQlyZXR1cm4gLTE7CisKKwlzYm9mZiA9IChzaXplICYgfihNRF9SRVNFUlZFRF9CWVRFUyAtIDEpKSAtIE1EX1JFU0VSVkVEX0JZVEVTOworCW1kcCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBzYm9mZiwgMHg4MDApOworCWlmIChtZHAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1kcC0+bWRfbWFnaWMgIT0gY3B1X3RvX2xlMzIoTURfTUFHSUMpKQorCQlyZXR1cm4gLTE7CisKKwkqKGFsaWFzZWRfdWludDMyX3QqKXV1aWQgPSBtZHAtPnNldF91dWlkMDsKKwltZW1jcHkoJnV1aWRbNF0sICZtZHAtPnNldF91dWlkMSwgMTIpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgdXVpZCwgVVVJRF9EQ0UpOworCisvLwlzbnByaW50ZihpZC0+dHlwZV92ZXJzaW9uLCBzaXplb2YoaWQtPnR5cGVfdmVyc2lvbiktMSwgIiV1LiV1LiV1IiwKKy8vCQkgbGUzMl90b19jcHUobWRwLT5tYWpvcl92ZXJzaW9uKSwKKy8vCQkgbGUzMl90b19jcHUobWRwLT5taW5vcl92ZXJzaW9uKSwKKy8vCQkgbGUzMl90b19jcHUobWRwLT5wYXRjaF92ZXJzaW9uKSk7CisKKwlkYmcoImZvdW5kIHJhaWQgc2lnbmF0dXJlIik7CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfUkFJRCk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImxpbnV4X3JhaWRfbWVtYmVyIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3N3YXAuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3N3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU1MzRhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvbGludXhfc3dhcC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBzd2FwX2hlYWRlcl92MV8yIHsKKwl1aW50OF90CQlib290Yml0c1sxMDI0XTsKKwl1aW50MzJfdAl2ZXJzaW9uOworCXVpbnQzMl90CWxhc3RfcGFnZTsKKwl1aW50MzJfdAlucl9iYWRwYWdlczsKKwl1aW50OF90CQl1dWlkWzE2XTsKKwl1aW50OF90CQl2b2x1bWVfbmFtZVsxNl07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBMQVJHRVNUX1BBR0VTSVpFCQkJMHg0MDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xpbnV4X3N3YXAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHN3YXBfaGVhZGVyX3YxXzIgKnN3OworCWNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKwl1bnNpZ25lZCBwYWdlOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJLyogdGhlIHN3YXAgc2lnbmF0dXJlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIFBBR0VfU0laRSAqLworCWZvciAocGFnZSA9IDB4MTAwMDsgcGFnZSA8PSBMQVJHRVNUX1BBR0VTSVpFOyBwYWdlIDw8PSAxKSB7CisJCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgcGFnZS0xMCwgMTApOworCQkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKG1lbWNtcChidWYsICJTV0FQLVNQQUNFIiwgMTApID09IDApIHsKKy8vCQkJCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMSc7CisvLwkJCQlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCisJCQlpZiAobWVtY21wKGJ1ZiwgIlNXQVBTUEFDRTIiLCAxMCkgPT0gMAorCQkJIHx8IG1lbWNtcChidWYsICJTMVNVU1BFTkQiLCA5KSA9PSAwCisJCQkgfHwgbWVtY21wKGJ1ZiwgIlMyU1VTUEVORCIsIDkpID09IDAKKwkJCSB8fCBtZW1jbXAoYnVmLCAiVUxTVVNQRU5EIiwgOSkgPT0gMAorCQkJKSB7CisJCQkJc3cgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCBzaXplb2Yoc3RydWN0IHN3YXBfaGVhZGVyX3YxXzIpKTsKKwkJCQlpZiAoc3cgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIC0xOworLy8JCQkJaWQtPnR5cGVfdmVyc2lvblswXSA9ICcyJzsKKy8vCQkJCWlkLT50eXBlX3ZlcnNpb25bMV0gPSAnXDAnOworLy8JCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIHN3LT52b2x1bWVfbmFtZSwgMTYpOworCQkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzdy0+dm9sdW1lX25hbWUsIDE2KTsKKwkJCQl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHN3LT51dWlkLCBVVUlEX0RDRSk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwl9CisJcmV0dXJuIC0xOworCitmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9PVEhFUik7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInN3YXAiOykKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvbHVrcy5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvbHVrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjM3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9sdWtzLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFcuIE1pY2hhZWwgUGV0dWxsbyA8bWlrZUBmbHluLm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKyNkZWZpbmUgTFVLU19NQUdJQ19MICAgICAgICAgICAgIDYKKyNkZWZpbmUgVVVJRF9TVFJJTkdfTCAgICAgICAgICAgNDAKKyNkZWZpbmUgTFVLU19DSVBIRVJOQU1FX0wgICAgICAgMzIKKyNkZWZpbmUgTFVLU19DSVBIRVJNT0RFX0wgICAgICAgMzIKKyNkZWZpbmUgTFVLU19IQVNIU1BFQ19MICAgICAgICAgMzIKKyNkZWZpbmUgTFVLU19ESUdFU1RTSVpFICAgICAgICAgMjAKKyNkZWZpbmUgTFVLU19TQUxUU0laRSAgICAgICAgICAgMzIKKyNkZWZpbmUgTFVLU19OVU1LRVlTICAgICAgICAgICAgIDgKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgTFVLU19NQUdJQ1tdID0geyAnTCcsJ1UnLCdLJywnUycsIDB4YmEsIDB4YmUgfTsKKworc3RydWN0IGx1a3NfcGhkciB7CisJdWludDhfdAkJbWFnaWNbTFVLU19NQUdJQ19MXTsKKwl1aW50MTZfdAl2ZXJzaW9uOworCXVpbnQ4X3QJCWNpcGhlck5hbWVbTFVLU19DSVBIRVJOQU1FX0xdOworCXVpbnQ4X3QJCWNpcGhlck1vZGVbTFVLU19DSVBIRVJNT0RFX0xdOworCXVpbnQ4X3QJCWhhc2hTcGVjW0xVS1NfSEFTSFNQRUNfTF07CisJdWludDMyX3QJcGF5bG9hZE9mZnNldDsKKwl1aW50MzJfdAlrZXlCeXRlczsKKwl1aW50OF90CQlta0RpZ2VzdFtMVUtTX0RJR0VTVFNJWkVdOworCXVpbnQ4X3QJCW1rRGlnZXN0U2FsdFtMVUtTX1NBTFRTSVpFXTsKKwl1aW50MzJfdAlta0RpZ2VzdEl0ZXJhdGlvbnM7CisJdWludDhfdAkJdXVpZFtVVUlEX1NUUklOR19MXTsKKwlzdHJ1Y3QgeworCQl1aW50MzJfdAlhY3RpdmU7CisJCXVpbnQzMl90CXBhc3N3b3JkSXRlcmF0aW9uczsKKwkJdWludDhfdAkJcGFzc3dvcmRTYWx0W0xVS1NfU0FMVFNJWkVdOworCQl1aW50MzJfdAlrZXlNYXRlcmlhbE9mZnNldDsKKwkJdWludDMyX3QJc3RyaXBlczsKKwl9IGtleWJsb2NrW0xVS1NfTlVNS0VZU107Cit9OworCitlbnVtIHsKKwlFWFBFQ1RFRF9TSVpFX2x1a3NfcGhkciA9IDAKKwkJKyAxICogTFVLU19NQUdJQ19MCisJCSsgMgorCQkrIDEgKiBMVUtTX0NJUEhFUk5BTUVfTAorCQkrIDEgKiBMVUtTX0NJUEhFUk1PREVfTAorCQkrIDEgKiBMVUtTX0hBU0hTUEVDX0wKKwkJKyA0CisJCSsgNAorCQkrIDEgKiBMVUtTX0RJR0VTVFNJWkUKKwkJKyAxICogTFVLU19TQUxUU0laRQorCQkrIDQKKwkJKyAxICogVVVJRF9TVFJJTkdfTAorCQkrIExVS1NfTlVNS0VZUyAqICgwCisJCSAgKyA0CisJCSAgKyA0CisJCSAgKyAxICogTFVLU19TQUxUU0laRQorCQkgICsgNAorCQkgICsgNAorCQkgICkKK307CisKK3N0cnVjdCBCVUdfYmFkX3NpemVfbHVrc19waGRyIHsKKwljaGFyIEJVR19iYWRfc2l6ZV9sdWtzX3BoZHJbCisJCXNpemVvZihzdHJ1Y3QgbHVrc19waGRyKSA9PSBFWFBFQ1RFRF9TSVpFX2x1a3NfcGhkciA/CisJCTEgOiAtMV07Cit9OworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9sdWtzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCBsdWtzX3BoZHIgKmhlYWRlcjsKKworCWhlYWRlciA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIHNpemVvZigqaGVhZGVyKSk7CisJaWYgKGhlYWRlciA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKGhlYWRlci0+bWFnaWMsIExVS1NfTUFHSUMsIExVS1NfTUFHSUNfTCkpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0NSWVBUTyk7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCBoZWFkZXItPnV1aWQsIFVVSURfRENFX1NUUklORyk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImNyeXB0b19MVUtTIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL250ZnMuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL250ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdmMTQxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvbnRmcy5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbnRmc19zdXBlcl9ibG9jayB7CisJdWludDhfdAkJanVtcFszXTsKKwl1aW50OF90CQlvZW1faWRbOF07CisJdWludDE2X3QJYnl0ZXNfcGVyX3NlY3RvcjsKKwl1aW50OF90CQlzZWN0b3JzX3Blcl9jbHVzdGVyOworCXVpbnQxNl90CXJlc2VydmVkX3NlY3RvcnM7CisJdWludDhfdAkJZmF0czsKKwl1aW50MTZfdAlyb290X2VudHJpZXM7CisJdWludDE2X3QJc2VjdG9yczsKKwl1aW50OF90CQltZWRpYV90eXBlOworCXVpbnQxNl90CXNlY3RvcnNfcGVyX2ZhdDsKKwl1aW50MTZfdAlzZWN0b3JzX3Blcl90cmFjazsKKwl1aW50MTZfdAloZWFkczsKKwl1aW50MzJfdAloaWRkZW5fc2VjdG9yczsKKwl1aW50MzJfdAlsYXJnZV9zZWN0b3JzOworCXVpbnQxNl90CXVudXNlZFsyXTsKKwl1aW50NjRfdAludW1iZXJfb2Zfc2VjdG9yczsKKwl1aW50NjRfdAltZnRfY2x1c3Rlcl9sb2NhdGlvbjsKKwl1aW50NjRfdAltZnRfbWlycm9yX2NsdXN0ZXJfbG9jYXRpb247CisJaW50OF90CQljbHVzdGVyX3Blcl9tZnRfcmVjb3JkOworCXVpbnQ4X3QJCXJlc2VydmVkMVszXTsKKwlpbnQ4X3QJCWNsdXN0ZXJfcGVyX2luZGV4X3JlY29yZDsKKwl1aW50OF90CQlyZXNlcnZlZDJbM107CisJdWludDhfdAkJdm9sdW1lX3NlcmlhbFs4XTsKKwl1aW50MTZfdAljaGVja3N1bTsKK30gUEFDS0VEOworCitzdHJ1Y3QgbWFzdGVyX2ZpbGVfdGFibGVfcmVjb3JkIHsKKwl1aW50OF90CQltYWdpY1s0XTsKKwl1aW50MTZfdAl1c2Ffb2ZzOworCXVpbnQxNl90CXVzYV9jb3VudDsKKwl1aW50NjRfdAlsc247CisJdWludDE2X3QJc2VxdWVuY2VfbnVtYmVyOworCXVpbnQxNl90CWxpbmtfY291bnQ7CisJdWludDE2X3QJYXR0cnNfb2Zmc2V0OworCXVpbnQxNl90CWZsYWdzOworCXVpbnQzMl90CWJ5dGVzX2luX3VzZTsKKwl1aW50MzJfdAlieXRlc19hbGxvY2F0ZWQ7Cit9IFBBQ0tFRDsKKworc3RydWN0IGZpbGVfYXR0cmlidXRlIHsKKwl1aW50MzJfdAl0eXBlOworCXVpbnQzMl90CWxlbjsKKwl1aW50OF90CQlub25fcmVzaWRlbnQ7CisJdWludDhfdAkJbmFtZV9sZW47CisJdWludDE2X3QJbmFtZV9vZmZzZXQ7CisJdWludDE2X3QJZmxhZ3M7CisJdWludDE2X3QJaW5zdGFuY2U7CisJdWludDMyX3QJdmFsdWVfbGVuOworCXVpbnQxNl90CXZhbHVlX29mZnNldDsKK30gUEFDS0VEOworCitzdHJ1Y3Qgdm9sdW1lX2luZm8geworCXVpbnQ2NF90CXJlc2VydmVkOworCXVpbnQ4X3QJCW1ham9yX3ZlcjsKKwl1aW50OF90CQltaW5vcl92ZXI7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBNRlRfUkVDT1JEX1ZPTFVNRQkJCTMKKyNkZWZpbmUgTUZUX1JFQ09SRF9BVFRSX1ZPTFVNRV9OQU1FCQkweDYwCisjZGVmaW5lIE1GVF9SRUNPUkRfQVRUUl9WT0xVTUVfSU5GTwkJMHg3MAorI2RlZmluZSBNRlRfUkVDT1JEX0FUVFJfT0JKRUNUX0lECQkweDQwCisjZGVmaW5lIE1GVF9SRUNPUkRfQVRUUl9FTkQJCQkweGZmZmZmZmZmdQorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9udGZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXVuc2lnbmVkIHNlY3Rvcl9zaXplOworCXVuc2lnbmVkIGNsdXN0ZXJfc2l6ZTsKKwl1aW50NjRfdCBtZnRfY2x1c3RlcjsKKwl1aW50NjRfdCBtZnRfb2ZmOworCXVuc2lnbmVkIG1mdF9yZWNvcmRfc2l6ZTsKKwl1bnNpZ25lZCBhdHRyX3R5cGU7CisJdW5zaWduZWQgYXR0cl9vZmY7CisJdW5zaWduZWQgYXR0cl9sZW47CisJdW5zaWduZWQgdmFsX29mZjsKKwl1bnNpZ25lZCB2YWxfbGVuOworCXN0cnVjdCBtYXN0ZXJfZmlsZV90YWJsZV9yZWNvcmQgKm1mdHI7CisJc3RydWN0IG50ZnNfc3VwZXJfYmxvY2sgKm5zOworCWNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKwljb25zdCB1aW50OF90ICp2YWw7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlucyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIDB4MjAwKTsKKwlpZiAobnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChucy0+b2VtX2lkLCAiTlRGUyIsIDQpICE9IDApCisJCXJldHVybiAtMTsKKworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgbnMtPnZvbHVtZV9zZXJpYWwsIFVVSURfTlRGUyk7CisKKwlzZWN0b3Jfc2l6ZSA9IGxlMTZfdG9fY3B1KG5zLT5ieXRlc19wZXJfc2VjdG9yKTsKKwljbHVzdGVyX3NpemUgPSBucy0+c2VjdG9yc19wZXJfY2x1c3RlciAqIHNlY3Rvcl9zaXplOworCW1mdF9jbHVzdGVyID0gbGU2NF90b19jcHUobnMtPm1mdF9jbHVzdGVyX2xvY2F0aW9uKTsKKwltZnRfb2ZmID0gbWZ0X2NsdXN0ZXIgKiBjbHVzdGVyX3NpemU7CisKKwlpZiAobnMtPmNsdXN0ZXJfcGVyX21mdF9yZWNvcmQgPCAwKQorCQkvKiBzaXplID0gLWxvZzIobWZ0X3JlY29yZF9zaXplKTsgbm9ybWFsbHkgMTAyNCBCeXRlcyAqLworCQltZnRfcmVjb3JkX3NpemUgPSAxIDw8IC1ucy0+Y2x1c3Rlcl9wZXJfbWZ0X3JlY29yZDsKKwllbHNlCisJCW1mdF9yZWNvcmRfc2l6ZSA9IG5zLT5jbHVzdGVyX3Blcl9tZnRfcmVjb3JkICogY2x1c3Rlcl9zaXplOworCisJZGJnKCJzZWN0b3JzaXplICAweCV4Iiwgc2VjdG9yX3NpemUpOworCWRiZygiY2x1c3RlcnNpemUgMHgleCIsIGNsdXN0ZXJfc2l6ZSk7CisJZGJnKCJtZnRjbHVzdGVyICAlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWZ0X2NsdXN0ZXIpOworCWRiZygibWZ0b2Zmc2V0ICAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBtZnRfb2ZmKTsKKwlkYmcoImNsdXN0ZXIgcGVyIG1mdF9yZWNvcmQgICVpIiwgbnMtPmNsdXN0ZXJfcGVyX21mdF9yZWNvcmQpOworCWRiZygibWZ0IHJlY29yZCBzaXplICAlaSIsIG1mdF9yZWNvcmRfc2l6ZSk7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWZ0X29mZiArIChNRlRfUkVDT1JEX1ZPTFVNRSAqIG1mdF9yZWNvcmRfc2l6ZSksCisJCQkgbWZ0X3JlY29yZF9zaXplKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZm91bmQ7CisKKwltZnRyID0gKHN0cnVjdCBtYXN0ZXJfZmlsZV90YWJsZV9yZWNvcmQqKSBidWY7CisKKwlkYmcoIm1mdHItPm1hZ2ljICclYyVjJWMlYyciLCBtZnRyLT5tYWdpY1swXSwgbWZ0ci0+bWFnaWNbMV0sIG1mdHItPm1hZ2ljWzJdLCBtZnRyLT5tYWdpY1szXSk7CisJaWYgKG1lbWNtcChtZnRyLT5tYWdpYywgIkZJTEUiLCA0KSAhPSAwKQorCQlnb3RvIGZvdW5kOworCisJYXR0cl9vZmYgPSBsZTE2X3RvX2NwdShtZnRyLT5hdHRyc19vZmZzZXQpOworCWRiZygiZmlsZSAkVm9sdW1lJ3MgYXR0cmlidXRlcyBhcmUgYXQgb2Zmc2V0ICVpIiwgYXR0cl9vZmYpOworCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGZpbGVfYXR0cmlidXRlICphdHRyOworCisJCWF0dHIgPSAoc3RydWN0IGZpbGVfYXR0cmlidXRlKikgJmJ1ZlthdHRyX29mZl07CisJCWF0dHJfdHlwZSA9IGxlMzJfdG9fY3B1KGF0dHItPnR5cGUpOworCQlhdHRyX2xlbiA9IGxlMTZfdG9fY3B1KGF0dHItPmxlbik7CisJCXZhbF9vZmYgPSBsZTE2X3RvX2NwdShhdHRyLT52YWx1ZV9vZmZzZXQpOworCQl2YWxfbGVuID0gbGUzMl90b19jcHUoYXR0ci0+dmFsdWVfbGVuKTsKKwkJYXR0cl9vZmYgKz0gYXR0cl9sZW47CisKKwkJaWYgKGF0dHJfbGVuID09IDApCisJCQlicmVhazsKKworCQlpZiAoYXR0cl9vZmYgPj0gbWZ0X3JlY29yZF9zaXplKQorCQkJYnJlYWs7CisKKwkJaWYgKGF0dHJfdHlwZSA9PSBNRlRfUkVDT1JEX0FUVFJfRU5EKQorCQkJYnJlYWs7CisKKwkJZGJnKCJmb3VuZCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBsZW4gJWksIGF0IG9mZnNldCAlaSIsCisJCSAgICBhdHRyX3R5cGUsIGF0dHJfbGVuLCBhdHRyX29mZik7CisKKy8vCQlpZiAoYXR0cl90eXBlID09IE1GVF9SRUNPUkRfQVRUUl9WT0xVTUVfSU5GTykgeworLy8JCQlzdHJ1Y3Qgdm9sdW1lX2luZm8gKmluZm87CisvLwkJCWRiZygiZm91bmQgaW5mbywgbGVuICVpIiwgdmFsX2xlbik7CisvLwkJCWluZm8gPSAoc3RydWN0IHZvbHVtZV9pbmZvKikgKCgodWludDhfdCAqKSBhdHRyKSArIHZhbF9vZmYpOworLy8JCQlzbnByaW50ZihpZC0+dHlwZV92ZXJzaW9uLCBzaXplb2YoaWQtPnR5cGVfdmVyc2lvbiktMSwKKy8vCQkJCSAiJXUuJXUiLCBpbmZvLT5tYWpvcl92ZXIsIGluZm8tPm1pbm9yX3Zlcik7CisvLwkJfQorCisJCWlmIChhdHRyX3R5cGUgPT0gTUZUX1JFQ09SRF9BVFRSX1ZPTFVNRV9OQU1FKSB7CisJCQlkYmcoImZvdW5kIGxhYmVsLCBsZW4gJWkiLCB2YWxfbGVuKTsKKwkJCWlmICh2YWxfbGVuID4gVk9MVU1FX0lEX0xBQkVMX1NJWkUpCisJCQkJdmFsX2xlbiA9IFZPTFVNRV9JRF9MQUJFTF9TSVpFOworCisJCQl2YWwgPSAoKHVpbnQ4X3QgKikgYXR0cikgKyB2YWxfb2ZmOworLy8JCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgdmFsLCB2YWxfbGVuKTsKKwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfdW5pY29kZTE2KGlkLCB2YWwsIExFLCB2YWxfbGVuKTsKKwkJfQorCX0KKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJudGZzIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL29jZnMyLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9vY2ZzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGIxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9vY2ZzMi5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgQW5kcmUgTWFzZWxsYSA8YW5kcmVAbWFzZWxsYS5uby1pcC5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisvKiBBbGwgdGhlc2UgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIG9jZnMyLXRvb2xzJ3Mgb2NmczJfZnMuaCAqLworI2RlZmluZSBPQ0ZTMl9WT0xfVVVJRF9MRU4JCQkxNgorI2RlZmluZSBPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTgkJCTY0CisjZGVmaW5lIE9DRlMyX1NVUEVSQkxPQ0tfT0ZGU0VUCQkJMHgyMDAwCisKKworLyogVGhpcyBpcyB0aGUgc3VwZXJibG9jay4gVGhlIE9DRlMyIGhlYWRlciBmaWxlcyBoYXZlIHN0cnVjdHMgaW4gc3RydWN0cy4KK1RoaXMgaXMgb25lIGhhcyBiZWVuIHNpbXBsaWZpZWQgc2luY2Ugd2Ugb25seSBjYXJlIGFib3V0IHRoZSBzdXBlcmJsb2NrLgorKi8KKworc3RydWN0IG9jZnMyX3N1cGVyX2Jsb2NrIHsKKwl1aW50OF90CQlpX3NpZ25hdHVyZVs4XTsJCQkvKiBTaWduYXR1cmUgZm9yIHZhbGlkYXRpb24gKi8KKwl1aW50MzJfdAlpX2dlbmVyYXRpb247CQkJLyogR2VuZXJhdGlvbiBudW1iZXIgKi8KKwlpbnQxNl90CQlpX3N1YmFsbG9jX3Nsb3Q7CQkJLyogU2xvdCBzdWJhbGxvY2F0b3IgdGhpcyBpbm9kZSBiZWxvbmdzIHRvICovCisJdWludDE2X3QJaV9zdWJhbGxvY19iaXQ7CQkJLyogQml0IG9mZnNldCBpbiBzdWJhbGxvY2F0b3IgYmxvY2sgZ3JvdXAgKi8KKwl1aW50MzJfdAlpX3Jlc2VydmVkMDsKKwl1aW50MzJfdAlpX2NsdXN0ZXJzOwkJCS8qIENsdXN0ZXIgY291bnQgKi8KKwl1aW50MzJfdAlpX3VpZDsJCQkJLyogT3duZXIgVUlEICovCisJdWludDMyX3QJaV9naWQ7CQkJCS8qIE93bmluZyBHSUQgKi8KKwl1aW50NjRfdAlpX3NpemU7CQkJCS8qIFNpemUgaW4gYnl0ZXMgKi8KKwl1aW50MTZfdAlpX21vZGU7CQkJCS8qIEZpbGUgbW9kZSAqLworCXVpbnQxNl90CWlfbGlua3NfY291bnQ7CQkJLyogTGlua3MgY291bnQgKi8KKwl1aW50MzJfdAlpX2ZsYWdzOwkJCQkvKiBGaWxlIGZsYWdzICovCisJdWludDY0X3QJaV9hdGltZTsJCQkJLyogQWNjZXNzIHRpbWUgKi8KKwl1aW50NjRfdAlpX2N0aW1lOwkJCQkvKiBDcmVhdGlvbiB0aW1lICovCisJdWludDY0X3QJaV9tdGltZTsJCQkJLyogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKwl1aW50NjRfdAlpX2R0aW1lOwkJCQkvKiBEZWxldGlvbiB0aW1lICovCisJdWludDY0X3QJaV9ibGtubzsJCQkJLyogT2Zmc2V0IG9uIGRpc2ssIGluIGJsb2NrcyAqLworCXVpbnQ2NF90CWlfbGFzdF9lYl9ibGs7CQkJLyogUG9pbnRlciB0byBsYXN0IGV4dGVudCBibG9jayAqLworCXVpbnQzMl90CWlfZnNfZ2VuZXJhdGlvbjsJCQkvKiBHZW5lcmF0aW9uIHBlciBmcy1pbnN0YW5jZSAqLworCXVpbnQzMl90CWlfYXRpbWVfbnNlYzsKKwl1aW50MzJfdAlpX2N0aW1lX25zZWM7CisJdWludDMyX3QJaV9tdGltZV9uc2VjOworCXVpbnQ2NF90CWlfcmVzZXJ2ZWQxWzldOworCXVpbnQ2NF90CWlfcGFkMTsJCQkJLyogR2VuZXJpYyB3YXkgdG8gcmVmZXIgdG8gdGhpcyA2NGJpdCB1bmlvbiAqLworCS8qIE5vcm1hbGx5IHRoZXJlIGlzIGEgdW5pb24gb2YgdGhlIGRpZmZlcmVudCBibG9jayB0eXBlcywgYnV0IHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgc3VwZXJibG9jay4gKi8KKwl1aW50MTZfdAlzX21ham9yX3Jldl9sZXZlbDsKKwl1aW50MTZfdAlzX21pbm9yX3Jldl9sZXZlbDsKKwl1aW50MTZfdAlzX21udF9jb3VudDsKKwlpbnQxNl90CQlzX21heF9tbnRfY291bnQ7CisJdWludDE2X3QJc19zdGF0ZTsJCQkJLyogRmlsZSBzeXN0ZW0gc3RhdGUgKi8KKwl1aW50MTZfdAlzX2Vycm9yczsJCQkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCXVpbnQzMl90CXNfY2hlY2tpbnRlcnZhbDsJCQkvKiBNYXggdGltZSBiZXR3ZWVuIGNoZWNrcyAqLworCXVpbnQ2NF90CXNfbGFzdGNoZWNrOwkJCS8qIFRpbWUgb2YgbGFzdCBjaGVjayAqLworCXVpbnQzMl90CXNfY3JlYXRvcl9vczsJCQkvKiBPUyAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9jb21wYXQ7CQkJLyogQ29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9pbmNvbXBhdDsJCS8qIEluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9yb19jb21wYXQ7CQkvKiBSZWFkb25seS1jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJdWludDY0X3QJc19yb290X2Jsa25vOwkJCS8qIE9mZnNldCwgaW4gYmxvY2tzLCBvZiByb290IGRpcmVjdG9yeSBkaW5vZGUgKi8KKwl1aW50NjRfdAlzX3N5c3RlbV9kaXJfYmxrbm87CQkvKiBPZmZzZXQsIGluIGJsb2Nrcywgb2Ygc3lzdGVtIGRpcmVjdG9yeSBkaW5vZGUgKi8KKwl1aW50MzJfdAlzX2Jsb2Nrc2l6ZV9iaXRzOwkJCS8qIEJsb2Nrc2l6ZSBmb3IgdGhpcyBmcyAqLworCXVpbnQzMl90CXNfY2x1c3RlcnNpemVfYml0czsJCS8qIENsdXN0ZXJzaXplIGZvciB0aGlzIGZzICovCisJdWludDE2X3QJc19tYXhfc2xvdHM7CQkJLyogTWF4IG51bWJlciBvZiBzaW11bHRhbmVvdXMgbW91bnRzIGJlZm9yZSB0dW5lZnMgcmVxdWlyZWQgKi8KKwl1aW50MTZfdAlzX3Jlc2VydmVkMTsKKwl1aW50MzJfdAlzX3Jlc2VydmVkMjsKKwl1aW50NjRfdAlzX2ZpcnN0X2NsdXN0ZXJfZ3JvdXA7CQkvKiBCbG9jayBvZmZzZXQgb2YgMXN0IGNsdXN0ZXIgZ3JvdXAgaGVhZGVyICovCisJdWludDhfdAkJc19sYWJlbFtPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTl07CS8qIExhYmVsIGZvciBtb3VudGluZywgZXRjLiAqLworCXVpbnQ4X3QJCXNfdXVpZFtPQ0ZTMl9WT0xfVVVJRF9MRU5dOwkvKiAxMjgtYml0IHV1aWQgKi8KK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9vY2ZzMihzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3Qgb2NmczJfc3VwZXJfYmxvY2sgKm9zOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJb3MgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgT0NGUzJfU1VQRVJCTE9DS19PRkZTRVQsIDB4MjAwKTsKKwlpZiAob3MgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChvcy0+aV9zaWduYXR1cmUsICJPQ0ZTVjIiLCA2KSAhPSAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBvcy0+c19sYWJlbCwgT0NGUzJfTUFYX1ZPTF9MQUJFTF9MRU4gPCBWT0xVTUVfSURfTEFCRUxfU0laRSA/CisvLwkJCQkJT0NGUzJfTUFYX1ZPTF9MQUJFTF9MRU4gOiBWT0xVTUVfSURfTEFCRUxfU0laRSk7CisJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIG9zLT5zX2xhYmVsLCBPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTiA8IFZPTFVNRV9JRF9MQUJFTF9TSVpFID8KKwkJCQkJT0NGUzJfTUFYX1ZPTF9MQUJFTF9MRU4gOiBWT0xVTUVfSURfTEFCRUxfU0laRSk7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCBvcy0+c191dWlkLCBVVUlEX0RDRSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gIm9jZnMyIjspCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9yZWlzZXJmcy5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvcmVpc2VyZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I0YTE4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvcmVpc2VyZnMuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRvYmlhcyBLbGF1c2VyIDx0a2xhdXNlckBhY2Nlc3MudW5pemguY2g+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90CWJsb2Nrc19jb3VudDsKKwl1aW50MzJfdAlmcmVlX2Jsb2NrczsKKwl1aW50MzJfdAlyb290X2Jsb2NrOworCXVpbnQzMl90CWpvdXJuYWxfYmxvY2s7CisJdWludDMyX3QJam91cm5hbF9kZXY7CisJdWludDMyX3QJb3JpZ19qb3VybmFsX3NpemU7CisJdWludDMyX3QJZHVtbXkyWzVdOworCXVpbnQxNl90CWJsb2Nrc2l6ZTsKKwl1aW50MTZfdAlkdW1teTNbM107CisJdWludDhfdAkJbWFnaWNbMTJdOworCXVpbnQzMl90CWR1bW15NFs1XTsKKwl1aW50OF90CQl1dWlkWzE2XTsKKwl1aW50OF90CQlsYWJlbFsxNl07Cit9IFBBQ0tFRDsKKworc3RydWN0IHJlaXNlcjRfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCW1hZ2ljWzE2XTsKKwl1aW50MTZfdAlkdW1teVsyXTsKKwl1aW50OF90CQl1dWlkWzE2XTsKKwl1aW50OF90CQlsYWJlbFsxNl07CisJdWludDY0X3QJZHVtbXkyOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgUkVJU0VSRlMxX1NVUEVSQkxPQ0tfT0ZGU0VUCQkweDIwMDAKKyNkZWZpbmUgUkVJU0VSRlNfU1VQRVJCTE9DS19PRkZTRVQJCTB4MTAwMDAKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfcmVpc2VyZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpyczsKKwlzdHJ1Y3QgcmVpc2VyNF9zdXBlcl9ibG9jayAqcnM0OworCisJZGJnKCJyZWlzZXJmczogcHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCXJzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIFJFSVNFUkZTX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKHJzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAocnMtPm1hZ2ljLCAiUmVJc0VyRnMiLCA4KSA9PSAwKSB7CisJCWRiZygicmVpc2VyZnM6IFJlSXNFckZzLCBubyBsYWJlbCIpOworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiMy41Iik7CisJCWdvdG8gZm91bmQ7CisJfQorCWlmIChtZW1jbXAocnMtPm1hZ2ljLCAiUmVJc0VyMkZzIiwgOSkgPT0gMCkgeworCQlkYmcoInJlaXNlcmZzOiBSZUlzRXIyRnMiKTsKKy8vCQlzdHJjcHkoaWQtPnR5cGVfdmVyc2lvbiwgIjMuNiIpOworCQlnb3RvIGZvdW5kX2xhYmVsOworCX0KKwlpZiAobWVtY21wKHJzLT5tYWdpYywgIlJlSXNFcjNGcyIsIDkpID09IDApIHsKKwkJZGJnKCJyZWlzZXJmczogUmVJc0VyM0ZzIik7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICJKUiIpOworCQlnb3RvIGZvdW5kX2xhYmVsOworCX0KKworCXJzNCA9IChzdHJ1Y3QgcmVpc2VyNF9zdXBlcl9ibG9jayAqKSByczsKKwlpZiAobWVtY21wKHJzNC0+bWFnaWMsICJSZUlzRXI0IiwgNykgPT0gMCkgeworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiNCIpOworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCByczQtPmxhYmVsLCAxNik7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCByczQtPmxhYmVsLCAxNik7CisJCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgcnM0LT51dWlkLCBVVUlEX0RDRSk7CisJCWRiZygicmVpc2VyZnM6IFJlSXNFcjQsIGxhYmVsICclcycgdXVpZCAnJXMnIiwgaWQtPmxhYmVsLCBpZC0+dXVpZCk7CisJCWdvdG8gZm91bmQ7CisJfQorCisJcnMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgUkVJU0VSRlMxX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKHJzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAocnMtPm1hZ2ljLCAiUmVJc0VyRnMiLCA4KSA9PSAwKSB7CisJCWRiZygicmVpc2VyZnM6IFJlSXNFckZzLCBubyBsYWJlbCIpOworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiMy41Iik7CisJCWdvdG8gZm91bmQ7CisJfQorCisJZGJnKCJyZWlzZXJmczogbm8gc2lnbmF0dXJlIGZvdW5kIik7CisJcmV0dXJuIC0xOworCisgZm91bmRfbGFiZWw6CisvLwl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgcnMtPmxhYmVsLCAxNik7CisJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHJzLT5sYWJlbCwgMTYpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgcnMtPnV1aWQsIFVVSURfRENFKTsKKwlkYmcoInJlaXNlcmZzOiBsYWJlbCAnJXMnIHV1aWQgJyVzJyIsIGlkLT5sYWJlbCwgaWQtPnV1aWQpOworCisgZm91bmQ6CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInJlaXNlcmZzIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3JvbWZzLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9yb21mcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjUzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC9yb21mcy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCByb21mc19zdXBlciB7CisJdWludDhfdCBtYWdpY1s4XTsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IGNoZWNrc3VtOworCXVpbnQ4X3QgbmFtZVtdOworfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3JvbWZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCByb21mc19zdXBlciAqcmZzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJcmZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiwgMHgyMDApOworCWlmIChyZnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChyZnMtPm1hZ2ljLCAiLXJvbTFmcy0iLCA0KSA9PSAwKSB7CisJCXNpemVfdCBsZW4gPSBzdHJsZW4oKGNoYXIgKilyZnMtPm5hbWUpOworCisJCWlmIChsZW4pIHsKKy8vCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIHJmcy0+bmFtZSwgbGVuKTsKKwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCByZnMtPm5hbWUsIGxlbik7CisJCX0KKworLy8JCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKwkJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInJvbWZzIjspCisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3N5c3YuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3N5c3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWI5NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvc3lzdi5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisjZGVmaW5lIFNZU1ZfTklDSU5PRAkJCTEwMAorI2RlZmluZSBTWVNWX05JQ0ZSRUUJCQk1MAorCitzdHJ1Y3Qgc3lzdl9zdXBlciB7CisJdWludDE2X3QJc19pc2l6ZTsKKwl1aW50MTZfdAlzX3BhZDA7CisJdWludDMyX3QJc19mc2l6ZTsKKwl1aW50MTZfdAlzX25mcmVlOworCXVpbnQxNl90CXNfcGFkMTsKKwl1aW50MzJfdAlzX2ZyZWVbU1lTVl9OSUNGUkVFXTsKKwl1aW50MTZfdAlzX25pbm9kZTsKKwl1aW50MTZfdAlzX3BhZDI7CisJdWludDE2X3QJc19pbm9kZVtTWVNWX05JQ0lOT0RdOworCXVpbnQ4X3QJCXNfZmxvY2s7CisJdWludDhfdAkJc19pbG9jazsKKwl1aW50OF90CQlzX2Ztb2Q7CisJdWludDhfdAkJc19yb25seTsKKwl1aW50MzJfdAlzX3RpbWU7CisJdWludDE2X3QJc19kaW5mb1s0XTsKKwl1aW50MzJfdAlzX3RmcmVlOworCXVpbnQxNl90CXNfdGlub2RlOworCXVpbnQxNl90CXNfcGFkMzsKKwl1aW50OF90CQlzX2ZuYW1lWzZdOworCXVpbnQ4X3QJCXNfZnBhY2tbNl07CisJdWludDMyX3QJc19maWxsWzEyXTsKKwl1aW50MzJfdAlzX3N0YXRlOworCXVpbnQzMl90CXNfbWFnaWM7CisJdWludDMyX3QJc190eXBlOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgWEVOSVhfTklDSU5PRAkJCQkxMDAKKyNkZWZpbmUgWEVOSVhfTklDRlJFRQkJCQkxMDAKKworc3RydWN0IHhlbml4X3N1cGVyIHsKKwl1aW50MTZfdAlzX2lzaXplOworCXVpbnQzMl90CXNfZnNpemU7CisJdWludDE2X3QJc19uZnJlZTsKKwl1aW50MzJfdAlzX2ZyZWVbWEVOSVhfTklDRlJFRV07CisJdWludDE2X3QJc19uaW5vZGU7CisJdWludDE2X3QJc19pbm9kZVtYRU5JWF9OSUNJTk9EXTsKKwl1aW50OF90CQlzX2Zsb2NrOworCXVpbnQ4X3QJCXNfaWxvY2s7CisJdWludDhfdAkJc19mbW9kOworCXVpbnQ4X3QJCXNfcm9ubHk7CisJdWludDMyX3QJc190aW1lOworCXVpbnQzMl90CXNfdGZyZWU7CisJdWludDE2X3QJc190aW5vZGU7CisJdWludDE2X3QJc19kaW5mb1s0XTsKKwl1aW50OF90CQlzX2ZuYW1lWzZdOworCXVpbnQ4X3QJCXNfZnBhY2tbNl07CisJdWludDhfdAkJc19jbGVhbjsKKwl1aW50OF90CQlzX2ZpbGxbMzcxXTsKKwl1aW50MzJfdAlzX21hZ2ljOworCXVpbnQzMl90CXNfdHlwZTsKK30gUEFDS0VEOworCisjZGVmaW5lIFNZU1ZfU1VQRVJCTE9DS19CTE9DSwkJCTB4MDEKKyNkZWZpbmUgU1lTVl9NQUdJQwkJCQkweGZkMTg3ZTIwCisjZGVmaW5lIFhFTklYX1NVUEVSQkxPQ0tfQkxPQ0sJCQkweDE4CisjZGVmaW5lIFhFTklYX01BR0lDCQkJCTB4MmI1NTQ0CisjZGVmaW5lIFNZU1ZfTUFYX0JMT0NLU0laRQkJCTB4ODAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3N5c3Yoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHN5c3Zfc3VwZXIgKnZzOworCXN0cnVjdCB4ZW5peF9zdXBlciAqeHM7CisJdW5zaWduZWQgYm9mZjsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWZvciAoYm9mZiA9IDB4MjAwOyBib2ZmIDw9IFNZU1ZfTUFYX0JMT0NLU0laRTsgYm9mZiA8PD0gMSkgeworCQl2cyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoYm9mZiAqIFNZU1ZfU1VQRVJCTE9DS19CTE9DSyksIDB4MjAwKTsKKwkJaWYgKHZzID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKHZzLT5zX21hZ2ljID09IGNwdV90b19sZTMyKFNZU1ZfTUFHSUMpIHx8IHZzLT5zX21hZ2ljID09IGNwdV90b19iZTMyKFNZU1ZfTUFHSUMpKSB7CisvLwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCB2cy0+c19mbmFtZSwgNik7CisJCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgdnMtPnNfZm5hbWUsIDYpOworCQkJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInN5c3YiKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlmb3IgKGJvZmYgPSAweDIwMDsgYm9mZiA8PSBTWVNWX01BWF9CTE9DS1NJWkU7IGJvZmYgPDw9IDEpIHsKKwkJeHMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgKGJvZmYgKyBYRU5JWF9TVVBFUkJMT0NLX0JMT0NLKSwgMHgyMDApOworCQlpZiAoeHMgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoeHMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMzIoWEVOSVhfTUFHSUMpIHx8IHhzLT5zX21hZ2ljID09IGNwdV90b19iZTMyKFhFTklYX01BR0lDKSkgeworLy8JCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgeHMtPnNfZm5hbWUsIDYpOworCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHhzLT5zX2ZuYW1lLCA2KTsKKwkJCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJ4ZW5peCI7KQorCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCXJldHVybiAtMTsKKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdWRmLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91ZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYzYzhkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdWRmLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB2b2x1bWVfZGVzY3JpcHRvciB7CisJc3RydWN0IGRlc2NyaXB0b3JfdGFnIHsKKwkJdWludDE2X3QJaWQ7CisJCXVpbnQxNl90CXZlcnNpb247CisJCXVpbnQ4X3QJCWNoZWNrc3VtOworCQl1aW50OF90CQlyZXNlcnZlZDsKKwkJdWludDE2X3QJc2VyaWFsOworCQl1aW50MTZfdAljcmM7CisJCXVpbnQxNl90CWNyY19sZW47CisJCXVpbnQzMl90CWxvY2F0aW9uOworCX0gUEFDS0VEIHRhZzsKKwl1bmlvbiB7CisJCXN0cnVjdCBhbmNob3JfZGVzY3JpcHRvciB7CisJCQl1aW50MzJfdAlsZW5ndGg7CisJCQl1aW50MzJfdAlsb2NhdGlvbjsKKwkJfSBQQUNLRUQgYW5jaG9yOworCQlzdHJ1Y3QgcHJpbWFyeV9kZXNjcmlwdG9yIHsKKwkJCXVpbnQzMl90CXNlcV9udW07CisJCQl1aW50MzJfdAlkZXNjX251bTsKKwkJCXN0cnVjdCBkc3RyaW5nIHsKKwkJCQl1aW50OF90CWNsZW47CisJCQkJdWludDhfdAljWzMxXTsKKwkJCX0gUEFDS0VEIGlkZW50OworCQl9IFBBQ0tFRCBwcmltYXJ5OworCX0gUEFDS0VEIHR5cGU7Cit9IFBBQ0tFRDsKKworc3RydWN0IHZvbHVtZV9zdHJ1Y3R1cmVfZGVzY3JpcHRvciB7CisJdWludDhfdAkJdHlwZTsKKwl1aW50OF90CQlpZFs1XTsKKwl1aW50OF90CQl2ZXJzaW9uOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgVURGX1ZTRF9PRkZTRVQJCQkweDgwMDAKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfdWRmKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCB2b2x1bWVfZGVzY3JpcHRvciAqdmQ7CisJc3RydWN0IHZvbHVtZV9zdHJ1Y3R1cmVfZGVzY3JpcHRvciAqdnNkOworCXVuc2lnbmVkIGJzOworCXVuc2lnbmVkIGI7CisJdW5zaWduZWQgdHlwZTsKKwl1bnNpZ25lZCBjb3VudDsKKwl1bnNpZ25lZCBsb2M7CisJdW5zaWduZWQgY2xlbjsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCXZzZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBVREZfVlNEX09GRlNFVCwgMHgyMDApOworCWlmICh2c2QgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiTlNSMDIiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlpZiAobWVtY21wKHZzZC0+aWQsICJOU1IwMyIsIDUpID09IDApCisJCWdvdG8gYmxvY2tzaXplOworCWlmIChtZW1jbXAodnNkLT5pZCwgIkJFQTAxIiwgNSkgPT0gMCkKKwkJZ290byBibG9ja3NpemU7CisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiQk9PVDIiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlpZiAobWVtY21wKHZzZC0+aWQsICJDRDAwMSIsIDUpID09IDApCisJCWdvdG8gYmxvY2tzaXplOworCWlmIChtZW1jbXAodnNkLT5pZCwgIkNEVzAyIiwgNSkgPT0gMCkKKwkJZ290byBibG9ja3NpemU7CisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiVEVBMDMiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlyZXR1cm4gLTE7CisKK2Jsb2Nrc2l6ZToKKwkvKiBzZWFyY2ggdGhlIG5leHQgVlNEIHRvIGdldCB0aGUgbG9naWNhbCBibG9jayBzaXplIG9mIHRoZSB2b2x1bWUgKi8KKwlmb3IgKGJzID0gMHg4MDA7IGJzIDwgMHg4MDAwOyBicyArPSAweDgwMCkgeworCQl2c2QgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgVURGX1ZTRF9PRkZTRVQgKyBicywgMHg4MDApOworCQlpZiAodnNkID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWRiZygidGVzdCBmb3IgYmxvY2tzaXplOiAweCV4IiwgYnMpOworCQlpZiAodnNkLT5pZFswXSAhPSAnXDAnKQorCQkJZ290byBuc3I7CisJfQorCXJldHVybiAtMTsKKworbnNyOgorCS8qIHNlYXJjaCB0aGUgbGlzdCBvZiBWU0RzIGZvciBhIE5TUiBkZXNjcmlwdG9yICovCisJZm9yIChiID0gMDsgYiA8IDY0OyBiKyspIHsKKwkJdnNkID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIFVERl9WU0RfT0ZGU0VUICsgKGIgKiBicyksIDB4ODAwKTsKKwkJaWYgKHZzZCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCWRiZygidnNkOiAlYyVjJWMlYyVjIiwKKwkJICAgIHZzZC0+aWRbMF0sIHZzZC0+aWRbMV0sIHZzZC0+aWRbMl0sIHZzZC0+aWRbM10sIHZzZC0+aWRbNF0pOworCisJCWlmICh2c2QtPmlkWzBdID09ICdcMCcpCisJCQlyZXR1cm4gLTE7CisJCWlmIChtZW1jbXAodnNkLT5pZCwgIk5TUjAyIiwgNSkgPT0gMCkKKwkJCWdvdG8gYW5jaG9yOworCQlpZiAobWVtY21wKHZzZC0+aWQsICJOU1IwMyIsIDUpID09IDApCisJCQlnb3RvIGFuY2hvcjsKKwl9CisJcmV0dXJuIC0xOworCithbmNob3I6CisJLyogcmVhZCBhbmNob3Igdm9sdW1lIGRlc2NyaXB0b3IgKi8KKwl2ZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoMjU2ICogYnMpLCAweDIwMCk7CisJaWYgKHZkID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXR5cGUgPSBsZTE2X3RvX2NwdSh2ZC0+dGFnLmlkKTsKKwlpZiAodHlwZSAhPSAyKSAvKiBUQUdfSURfQVZEUCAqLworCQlnb3RvIGZvdW5kOworCisJLyogZ2V0IGRlc3JpcHRvciBsaXN0IGFkZHJlc3MgYW5kIGJsb2NrIGNvdW50ICovCisJY291bnQgPSBsZTMyX3RvX2NwdSh2ZC0+dHlwZS5hbmNob3IubGVuZ3RoKSAvIGJzOworCWxvYyA9IGxlMzJfdG9fY3B1KHZkLT50eXBlLmFuY2hvci5sb2NhdGlvbik7CisJZGJnKCIweCV4IGRlc2NyaXB0b3JzIHN0YXJ0aW5nIGF0IGxvZ2ljYWwgc2Vjb3IgMHgleCIsIGNvdW50LCBsb2MpOworCisJLyogcGljayB0aGUgcHJpbWFyeSBkZXNjcmlwdG9yIGZyb20gdGhlIGxpc3QgKi8KKwlmb3IgKGIgPSAwOyBiIDwgY291bnQ7IGIrKykgeworCQl2ZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoKGxvYyArIGIpICogYnMpLCAweDIwMCk7CisJCWlmICh2ZCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCXR5cGUgPSBsZTE2X3RvX2NwdSh2ZC0+dGFnLmlkKTsKKwkJZGJnKCJkZXNjcmlwdG9yIHR5cGUgJWkiLCB0eXBlKTsKKworCQkvKiBjaGVjayB2YWxpZGl0eSAqLworCQlpZiAodHlwZSA9PSAwKQorCQkJZ290byBmb3VuZDsKKwkJaWYgKGxlMzJfdG9fY3B1KHZkLT50YWcubG9jYXRpb24pICE9IGxvYyArIGIpCisJCQlnb3RvIGZvdW5kOworCisJCWlmICh0eXBlID09IDEpIC8qIFRBR19JRF9QVkQgKi8KKwkJCWdvdG8gcHZkOworCX0KKwlnb3RvIGZvdW5kOworCisgcHZkOgorLy8Jdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsICYodmQtPnR5cGUucHJpbWFyeS5pZGVudC5jbGVuKSwgMzIpOworCisJY2xlbiA9IHZkLT50eXBlLnByaW1hcnkuaWRlbnQuY2xlbjsKKwlkYmcoImxhYmVsIHN0cmluZyBjaGFyc2l6ZT0laSBiaXQiLCBjbGVuKTsKKwlpZiAoY2xlbiA9PSA4KQorCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgdmQtPnR5cGUucHJpbWFyeS5pZGVudC5jLCAzMSk7CisJZWxzZSBpZiAoY2xlbiA9PSAxNikKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoaWQsIHZkLT50eXBlLnByaW1hcnkuaWRlbnQuYywgQkUsIDMxKTsKKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJ1ZGYiOykKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9oaWdocG9pbnQuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9oaWdocG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2I3YjMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2hpZ2hwb2ludC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBocHQzN3hfbWV0YSB7CisJdWludDhfdAkJZmlsbGVyMVszMl07CisJdWludDMyX3QJbWFnaWM7Cit9IFBBQ0tFRDsKKworc3RydWN0IGhwdDQ1eF9tZXRhIHsKKwl1aW50MzJfdAltYWdpYzsKK30gUEFDS0VEOworCisjZGVmaW5lIEhQVDM3WF9DT05GSUdfT0ZGCQkweDEyMDAKKyNkZWZpbmUgSFBUMzdYX01BR0lDX09LCQkJMHg1YTc4MTZmMAorI2RlZmluZSBIUFQzN1hfTUFHSUNfQkFECQkweDVhNzgxNmZkCisKKyNkZWZpbmUgSFBUNDVYX01BR0lDX09LCQkJMHg1YTc4MTZmMworI2RlZmluZSBIUFQ0NVhfTUFHSUNfQkFECQkweDVhNzgxNmZkCisKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaGlnaHBvaW50XzM3eF9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYpCit7CisJc3RydWN0IGhwdDM3eF9tZXRhICpocHQ7CisJdWludDMyX3QgbWFnaWM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlocHQgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgSFBUMzdYX0NPTkZJR19PRkYsIDB4MjAwKTsKKwlpZiAoaHB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCW1hZ2ljID0gaHB0LT5tYWdpYzsKKwlpZiAobWFnaWMgIT0gY3B1X3RvX2xlMzIoSFBUMzdYX01BR0lDX09LKSAmJiBtYWdpYyAhPSBjcHVfdG9fbGUzMihIUFQzN1hfTUFHSUNfQkFEKSkKKwkJcmV0dXJuIC0xOworCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfUkFJRCk7CisvLwlpZC0+dHlwZSA9ICJoaWdocG9pbnRfcmFpZF9tZW1iZXIiOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF80NXhfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXN0cnVjdCBocHQ0NXhfbWV0YSAqaHB0OworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXVpbnQzMl90IG1hZ2ljOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMTEpICogMHgyMDA7CisJaHB0ID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIG1ldGFfb2ZmLCAweDIwMCk7CisJaWYgKGhwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwltYWdpYyA9IGhwdC0+bWFnaWM7CisJaWYgKG1hZ2ljICE9IGNwdV90b19sZTMyKEhQVDQ1WF9NQUdJQ19PSykgJiYgbWFnaWMgIT0gY3B1X3RvX2xlMzIoSFBUNDVYX01BR0lDX0JBRCkpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiaGlnaHBvaW50X3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2hwZnMuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9ocGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyOTUyNAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9ocGZzLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGhwZnNfc3VwZXIgeworCXVpbnQ4X3QJCW1hZ2ljWzRdOworCXVpbnQ4X3QJCXZlcnNpb247Cit9IFBBQ0tFRDsKKworI2RlZmluZSBIUEZTX1NVUEVSQkxPQ0tfT0ZGU0VUCQkJMHgyMDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hwZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwlzdHJ1Y3QgaHBmc19zdXBlciAqaHM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlocyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBIUEZTX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKGhzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAoaHMtPm1hZ2ljLCAiXHg0OVx4ZThceDk1XHhmOSIsIDQpID09IDApIHsKKy8vCQlzcHJpbnRmKGlkLT50eXBlX3ZlcnNpb24sICIldSIsIGhzLT52ZXJzaW9uKTsKKy8vCQl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisvLwkJaWQtPnR5cGUgPSAiaHBmcyI7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9pc3dfcmFpZC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2lzd19yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiNDdiMwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9pc3dfcmFpZC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBpc3dfbWV0YSB7CisJdWludDhfdAkJc2lnWzMyXTsKKwl1aW50MzJfdAljaGVja19zdW07CisJdWludDMyX3QJbXBiX3NpemU7CisJdWludDMyX3QJZmFtaWx5X251bTsKKwl1aW50MzJfdAlnZW5lcmF0aW9uX251bTsKK30gUEFDS0VEOworCisjZGVmaW5lIElTV19TSUdOQVRVUkUJCSJJbnRlbCBSYWlkIElTTSBDZmcgU2lnLiAiCisKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCBpc3dfbWV0YSAqaXN3OworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMikgKiAweDIwMDsKKwlpc3cgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWV0YV9vZmYsIDB4MjAwKTsKKwlpZiAoaXN3ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAoaXN3LT5zaWcsIElTV19TSUdOQVRVUkUsIHNpemVvZihJU1dfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCW1lbWNweShpZC0+dHlwZV92ZXJzaW9uLCAmaXN3LT5zaWdbc2l6ZW9mKElTV19TSUdOQVRVUkUpLTFdLCA2KTsKKy8vCWlkLT50eXBlID0gImlzd19yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9sc2lfcmFpZC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2xzaV9yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjYzhlZAotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9sc2lfcmFpZC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBsc2lfbWV0YSB7CisJdWludDhfdAkJc2lnWzZdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTFNJX1NJR05BVFVSRQkJIiRYSURFJCIKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHNpX21lZ2FfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCBsc2lfbWV0YSAqbHNpOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMSkgKiAweDIwMDsKKwlsc2kgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWV0YV9vZmYsIDB4MjAwKTsKKwlpZiAobHNpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAobHNpLT5zaWcsIExTSV9TSUdOQVRVUkUsIHNpemVvZihMU0lfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCWlkLT50eXBlID0gImxzaV9tZWdhX3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2x2bS5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2x2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDY0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbHZtLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGx2bTFfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJaWRbMl07Cit9IFBBQ0tFRDsKKworc3RydWN0IGx2bTJfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCWlkWzhdOworCXVpbnQ2NF90CXNlY3Rvcl94bDsKKwl1aW50MzJfdAljcmNfeGw7CisJdWludDMyX3QJb2Zmc2V0X3hsOworCXVpbnQ4X3QJCXR5cGVbOF07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBMVk0xX1NCX09GRgkJCTB4NDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2x2bTEoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwlzdHJ1Y3QgbHZtMV9zdXBlcl9ibG9jayAqbHZtOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJbHZtID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIExWTTFfU0JfT0ZGLCAweDgwMCk7CisJaWYgKGx2bSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobHZtLT5pZFswXSAhPSAnSCcgfHwgbHZtLT5pZFsxXSAhPSAnTScpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiTFZNMV9tZW1iZXIiOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTFZNMl9MQUJFTF9JRAkJCSJMQUJFTE9ORSIKKyNkZWZpbmUgTFZNMkxBQkVMX1NDQU5fU0VDVE9SUwkJNAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9sdm0yKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYpCit7CisJY29uc3QgdWludDhfdCAqYnVmOworCXVuc2lnbmVkIHNvZmY7CisJc3RydWN0IGx2bTJfc3VwZXJfYmxvY2sgKmx2bTsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIExWTTJMQUJFTF9TQ0FOX1NFQ1RPUlMgKiAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKworCWZvciAoc29mZiA9IDA7IHNvZmYgPCBMVk0yTEFCRUxfU0NBTl9TRUNUT1JTICogMHgyMDA7IHNvZmYgKz0gMHgyMDApIHsKKwkJbHZtID0gKHN0cnVjdCBsdm0yX3N1cGVyX2Jsb2NrICopICZidWZbc29mZl07CisKKwkJaWYgKG1lbWNtcChsdm0tPmlkLCBMVk0yX0xBQkVMX0lELCA4KSA9PSAwKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlyZXR1cm4gLTE7CisKKyBmb3VuZDoKKy8vCW1lbWNweShpZC0+dHlwZV92ZXJzaW9uLCBsdm0tPnR5cGUsIDgpOworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiTFZNMl9tZW1iZXIiOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWFjLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkZWI5NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tYWMuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IG1hY19kcml2ZXJfZGVzYyB7CisJdWludDhfdAkJc2lnbmF0dXJlWzJdOworCXVpbnQxNl90CWJsb2NrX3NpemU7CisJdWludDMyX3QJYmxvY2tfY291bnQ7Cit9IFBBQ0tFRDsKKworc3RydWN0IG1hY19wYXJ0aXRpb24geworCXVpbnQ4X3QJCXNpZ25hdHVyZVsyXTsKKwl1aW50MTZfdAlyZXMxOworCXVpbnQzMl90CW1hcF9jb3VudDsKKwl1aW50MzJfdAlzdGFydF9ibG9jazsKKwl1aW50MzJfdAlibG9ja19jb3VudDsKKwl1aW50OF90CQluYW1lWzMyXTsKKwl1aW50OF90CQl0eXBlWzMyXTsKK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9tYWNfcGFydGl0aW9uX21hcChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmKQoreworCWNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKwlzdHJ1Y3QgbWFjX2RyaXZlcl9kZXNjICpkcml2ZXI7CisJc3RydWN0IG1hY19wYXJ0aXRpb24gKnBhcnQ7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwYXJ0ID0gKHN0cnVjdCBtYWNfcGFydGl0aW9uICopIGJ1ZjsKKwlpZiAocGFydC0+c2lnbmF0dXJlWzBdID09ICdQJyAmJiBwYXJ0LT5zaWduYXR1cmVbMV0gPT0gJ00nIC8qICJQTSIgKi8KKwkgJiYgKG1lbWNtcChwYXJ0LT50eXBlLCAiQXBwbGVfcGFydGl0aW9uX21hcCIsIDE5KSA9PSAwKQorCSkgeworCQkvKiBsaW51eCBjcmVhdGVzIGFuIG93biBzdWJkZXZpY2UgZm9yIHRoZSBtYXAKKwkJICoganVzdCByZXR1cm4gdGhlIHR5cGUgaWYgdGhlIGRyaXZlIGhlYWRlciBpcyBtaXNzaW5nICovCisvLwkJdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFKTsKKy8vCQlpZC0+dHlwZSA9ICJtYWNfcGFydGl0aW9uX21hcCI7CisJCXJldHVybiAwOworCX0KKworCWRyaXZlciA9IChzdHJ1Y3QgbWFjX2RyaXZlcl9kZXNjICopIGJ1ZjsKKwlpZiAoZHJpdmVyLT5zaWduYXR1cmVbMF0gPT0gJ0UnICYmIGRyaXZlci0+c2lnbmF0dXJlWzFdID09ICdSJykgeyAvKiAiRVIiICovCisJCS8qIHdlIGFyZSBvbiBhIG1haW4gZGV2aWNlLCBsaWtlIGEgQ0QKKwkJICoganVzdCB0cnkgdG8gcHJvYmUgdGhlIGZpcnN0IHBhcnRpdGlvbiBmcm9tIHRoZSBtYXAgKi8KKwkJdW5zaWduZWQgYnNpemUgPSBiZTE2X3RvX2NwdShkcml2ZXItPmJsb2NrX3NpemUpOworCQlpbnQgcGFydF9jb3VudDsKKwkJaW50IGk7CisKKwkJLyogZ2V0IGZpcnN0IGVudHJ5IG9mIHBhcnRpdGlvbiB0YWJsZSAqLworCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgIGJzaXplLCAweDIwMCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlwYXJ0ID0gKHN0cnVjdCBtYWNfcGFydGl0aW9uICopIGJ1ZjsKKwkJaWYgKHBhcnQtPnNpZ25hdHVyZVswXSAhPSAnUCcgfHwgcGFydC0+c2lnbmF0dXJlWzFdICE9ICdNJykgLyogbm90ICJQTSIgKi8KKwkJCXJldHVybiAtMTsKKworCQlwYXJ0X2NvdW50ID0gYmUzMl90b19jcHUocGFydC0+bWFwX2NvdW50KTsKKwkJZGJnKCJleHBlY3RpbmcgJWQgcGFydGl0aW9uIGVudHJpZXMiLCBwYXJ0X2NvdW50KTsKKworCQlpZiAoaWQtPnBhcnRpdGlvbnMgIT0gTlVMTCkKKwkJCWZyZWUoaWQtPnBhcnRpdGlvbnMpOworCQlpZC0+cGFydGl0aW9ucyA9IHh6YWxsb2MocGFydF9jb3VudCAqIHNpemVvZihzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbikpOworCisJCWlkLT5wYXJ0aXRpb25fY291bnQgPSBwYXJ0X2NvdW50OworCisJCWZvciAoaSA9IDA7IGkgPCBwYXJ0X2NvdW50OyBpKyspIHsKKwkJCXVpbnQ2NF90IHBvZmY7CisJCQl1aW50NjRfdCBwbGVuOworCisJCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgKChpKzEpICogYnNpemUpLCAweDIwMCk7CisJCQlpZiAoYnVmID09IE5VTEwpCisJCQkJcmV0dXJuIC0xOworCisJCQlwYXJ0ID0gKHN0cnVjdCBtYWNfcGFydGl0aW9uICopIGJ1ZjsKKwkJCWlmIChwYXJ0LT5zaWduYXR1cmVbMF0gIT0gJ1AnIHx8IHBhcnQtPnNpZ25hdHVyZVsxXSAhPSAnTScpIC8qIG5vdCAiUE0iICovCisJCQkJcmV0dXJuIC0xOworCisJCQlwb2ZmID0gYmUzMl90b19jcHUocGFydC0+c3RhcnRfYmxvY2spICogYnNpemU7CisJCQlwbGVuID0gYmUzMl90b19jcHUocGFydC0+YmxvY2tfY291bnQpICogYnNpemU7CisJCQlkYmcoImZvdW5kICclcycgcGFydGl0aW9uIGVudHJ5IGF0IDB4JWxseCwgbGVuIDB4JWxseCIsCisJCQkJCXBhcnQtPnR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHBsZW4pOworCisvLwkJCWlkLT5wYXJ0aXRpb25zW2ldLnB0X29mZiA9IHBvZmY7CisvLwkJCWlkLT5wYXJ0aXRpb25zW2ldLnB0X2xlbiA9IHBsZW47CisKKy8vCQkJaWYgKG1lbWNtcChwYXJ0LT50eXBlLCAiQXBwbGVfRnJlZSIsIDEwKSA9PSAwKSB7CisvLwkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQoJmlkLT5wYXJ0aXRpb25zW2ldLCBWT0xVTUVfSURfVU5VU0VEKTsKKy8vCQkJfSBlbHNlIGlmIChtZW1jbXAocGFydC0+dHlwZSwgIkFwcGxlX3BhcnRpdGlvbl9tYXAiLCAxOSkgPT0gMCkgeworLy8JCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KCZpZC0+cGFydGl0aW9uc1tpXSwgVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFKTsKKy8vCQkJfSBlbHNlIHsKKy8vCQkJCXZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydCgmaWQtPnBhcnRpdGlvbnNbaV0sIFZPTFVNRV9JRF9VTlBST0JFRCk7CisvLwkJCX0KKwkJfQorLy8JCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9QQVJUSVRJT05UQUJMRSk7CisvLwkJaWQtPnR5cGUgPSAibWFjX3BhcnRpdGlvbl9tYXAiOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWluaXguYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9taW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZTEwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWluaXguYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgeworCXVpbnQxNl90CXNfbmlub2RlczsKKwl1aW50MTZfdAlzX256b25lczsKKwl1aW50MTZfdAlzX2ltYXBfYmxvY2tzOworCXVpbnQxNl90CXNfem1hcF9ibG9ja3M7CisJdWludDE2X3QJc19maXJzdGRhdGF6b25lOworCXVpbnQxNl90CXNfbG9nX3pvbmVfc2l6ZTsKKwl1aW50MzJfdAlzX21heF9zaXplOworCXVpbnQxNl90CXNfbWFnaWM7CisJdWludDE2X3QJc19zdGF0ZTsKKwl1aW50MzJfdAlzX3pvbmVzOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTUlOSVhfU1VQRVJCTE9DS19PRkZTRVQJCQkweDQwMAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9taW5peChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmKQoreworCXN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqbXM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwltcyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBNSU5JWF9TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChtcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobXMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMTYoMHgxMzdmKSkgeworLy8JCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMSc7CisJCWdvdG8gZm91bmQ7CisJfQorCisJaWYgKG1zLT5zX21hZ2ljID09IGNwdV90b19sZTE2KDB4MTM4NykpIHsKKy8vCQlpZC0+dHlwZV92ZXJzaW9uWzBdID0gJzEnOworCQlnb3RvIGZvdW5kOworCX0KKworCWlmIChtcy0+c19tYWdpYyA9PSBjcHVfdG9fbGUxNigweDI0NjgpKSB7CisvLwkJaWQtPnR5cGVfdmVyc2lvblswXSA9ICcyJzsKKwkJZ290byBmb3VuZDsKKwl9CisKKwlpZiAobXMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMTYoMHgyNDc4KSkgeworLy8JCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMic7CisJCWdvdG8gZm91bmQ7CisJfQorCisJcmV0dXJuIC0xOworCisgZm91bmQ6CisvLwlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCWlkLT50eXBlID0gIm1pbml4IjsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tc2Rvcy5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX21zZG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmYjg4NQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tc2Rvcy5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbXNkb3NfcGFydGl0aW9uX2VudHJ5IHsKKwl1aW50OF90CQlib290X2luZDsKKwl1aW50OF90CQloZWFkOworCXVpbnQ4X3QJCXNlY3RvcjsKKwl1aW50OF90CQljeWw7CisJdWludDhfdAkJc3lzX2luZDsKKwl1aW50OF90CQllbmRfaGVhZDsKKwl1aW50OF90CQllbmRfc2VjdG9yOworCXVpbnQ4X3QJCWVuZF9jeWw7CisJdWludDMyX3QJc3RhcnRfc2VjdDsKKwl1aW50MzJfdAlucl9zZWN0czsKK30gUEFDS0VEOworCisjZGVmaW5lIE1TRE9TX1BBUlRUQUJMRV9PRkZTRVQJCTB4MWJlCisjZGVmaW5lIE1TRE9TX1NJR19PRkYJCQkweDFmZQorI2RlZmluZSBCU0laRQkJCQkweDIwMAorI2RlZmluZSBET1NfRVhURU5ERURfUEFSVElUSU9OCQkweDA1CisjZGVmaW5lIExJTlVYX0VYVEVOREVEX1BBUlRJVElPTgkweDg1CisjZGVmaW5lIFdJTjk4X0VYVEVOREVEX1BBUlRJVElPTgkweDBmCisjZGVmaW5lIExJTlVYX1JBSURfUEFSVElUSU9OCQkweGZkCisjZGVmaW5lIGlzX2V4dGVuZGVkKHR5cGUpIFwKKwkodHlwZSA9PSBET1NfRVhURU5ERURfUEFSVElUSU9OIHx8CVwKKwkgdHlwZSA9PSBXSU45OF9FWFRFTkRFRF9QQVJUSVRJT04gfHwJXAorCSB0eXBlID09IExJTlVYX0VYVEVOREVEX1BBUlRJVElPTikKKyNkZWZpbmUgaXNfcmFpZCh0eXBlKSBcCisJKHR5cGUgPT0gTElOVVhfUkFJRF9QQVJUSVRJT04pCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX21zZG9zX3BhcnRfdGFibGUoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwljb25zdCB1aW50OF90ICpidWY7CisJaW50IGk7CisJdWludDY0X3QgcG9mZjsKKwl1aW50NjRfdCBwbGVuOworCXVpbnQ2NF90IGV4dGVuZGVkID0gMDsKKwl1aW50NjRfdCBjdXJyZW50OworCXVpbnQ2NF90IG5leHQ7CisJaW50IGxpbWl0OworCWludCBlbXB0eSA9IDE7CisJc3RydWN0IG1zZG9zX3BhcnRpdGlvbl9lbnRyeSAqcGFydDsKKwlzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbiAqcDsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIDB4MjAwKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChidWZbTVNET1NfU0lHX09GRl0gIT0gMHg1NSB8fCBidWZbTVNET1NfU0lHX09GRiArIDFdICE9IDB4YWEpCisJCXJldHVybiAtMTsKKworCS8qIGNoZWNrIGZsYWdzIG9uIGFsbCBlbnRyaWVzIGZvciBhIHZhbGlkIHBhcnRpdGlvbiB0YWJsZSAqLworCXBhcnQgPSAoc3RydWN0IG1zZG9zX3BhcnRpdGlvbl9lbnRyeSopICZidWZbTVNET1NfUEFSVFRBQkxFX09GRlNFVF07CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocGFydFtpXS5ib290X2luZCAhPSAwCisJCSAmJiBwYXJ0W2ldLmJvb3RfaW5kICE9IDB4ODAKKwkJKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAocGFydFtpXS5ucl9zZWN0cyAhPSAwKQorCQkJZW1wdHkgPSAwOworCX0KKwlpZiAoZW1wdHkgPT0gMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGlkLT5wYXJ0aXRpb25zICE9IE5VTEwpCisJCWZyZWUoaWQtPnBhcnRpdGlvbnMpOworCWlkLT5wYXJ0aXRpb25zID0geHphbGxvYyhWT0xVTUVfSURfUEFSVElUSU9OU19NQVggKgorCQkJCXNpemVvZihzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbikpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlwb2ZmID0gKHVpbnQ2NF90KSBsZTMyX3RvX2NwdShwYXJ0W2ldLnN0YXJ0X3NlY3QpICogQlNJWkU7CisJCXBsZW4gPSAodWludDY0X3QpIGxlMzJfdG9fY3B1KHBhcnRbaV0ubnJfc2VjdHMpICogQlNJWkU7CisKKwkJaWYgKHBsZW4gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXAgPSAmaWQtPnBhcnRpdGlvbnNbaV07CisKKy8vCQlwLT5wdF90eXBlX3JhdyA9IHBhcnRbaV0uc3lzX2luZDsKKworCQlpZiAoaXNfZXh0ZW5kZWQocGFydFtpXS5zeXNfaW5kKSkgeworCQkJZGJnKCJmb3VuZCBleHRlbmRlZCBwYXJ0aXRpb24gYXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9mZik7CisvLwkJCXZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydChwLCBWT0xVTUVfSURfUEFSVElUSU9OVEFCTEUpOworLy8JCQlwLT50eXBlID0gIm1zZG9zX2V4dGVuZGVkX3BhcnRpdGlvbiI7CisJCQlpZiAoZXh0ZW5kZWQgPT0gMCkKKwkJCQlleHRlbmRlZCA9IG9mZiArIHBvZmY7CisJCX0gZWxzZSB7CisJCQlkYmcoImZvdW5kIDB4JXggZGF0YSBwYXJ0aXRpb24gYXQgMHglbGx4LCBsZW4gMHglbGx4IiwKKwkJCSAgICBwYXJ0W2ldLnN5c19pbmQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBsZW4pOworCisvLwkJCWlmIChpc19yYWlkKHBhcnRbaV0uc3lzX2luZCkpCisvLwkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQocCwgVk9MVU1FX0lEX1JBSUQpOworLy8JCQllbHNlCisvLwkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQocCwgVk9MVU1FX0lEX1VOUFJPQkVEKTsKKwkJfQorCisvLwkJcC0+cHRfb2ZmID0gb2ZmICsgcG9mZjsKKy8vCQlwLT5wdF9sZW4gPSBwbGVuOworCQlpZC0+cGFydGl0aW9uX2NvdW50ID0gaSsxOworCX0KKworCW5leHQgPSBleHRlbmRlZDsKKwljdXJyZW50ID0gZXh0ZW5kZWQ7CisJbGltaXQgPSA1MDsKKworCS8qIGZvbGxvdyBleHRlbmRlZCBwYXJ0aXRpb24gY2hhaW4gYW5kIGFkZCBkYXRhIHBhcnRpdGlvbnMgKi8KKwl3aGlsZSAobmV4dCAhPSAwKSB7CisJCWlmIChsaW1pdC0tID09IDApIHsKKwkJCWRiZygiZXh0ZW5kZWQgY2hhaW4gbGltaXQgcmVhY2hlZCIpOworCQkJYnJlYWs7CisJCX0KKworCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgY3VycmVudCwgMHgyMDApOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlicmVhazsKKworCQlwYXJ0ID0gKHN0cnVjdCBtc2Rvc19wYXJ0aXRpb25fZW50cnkqKSAmYnVmW01TRE9TX1BBUlRUQUJMRV9PRkZTRVRdOworCisJCWlmIChidWZbTVNET1NfU0lHX09GRl0gIT0gMHg1NSB8fCBidWZbTVNET1NfU0lHX09GRiArIDFdICE9IDB4YWEpCisJCQlicmVhazsKKworCQluZXh0ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlwb2ZmID0gKHVpbnQ2NF90KSBsZTMyX3RvX2NwdShwYXJ0W2ldLnN0YXJ0X3NlY3QpICogQlNJWkU7CisJCQlwbGVuID0gKHVpbnQ2NF90KSBsZTMyX3RvX2NwdShwYXJ0W2ldLm5yX3NlY3RzKSAqIEJTSVpFOworCisJCQlpZiAocGxlbiA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoaXNfZXh0ZW5kZWQocGFydFtpXS5zeXNfaW5kKSkgeworCQkJCWRiZygiZm91bmQgZXh0ZW5kZWQgcGFydGl0aW9uIGF0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYpOworCQkJCWlmIChuZXh0ID09IDApCisJCQkJCW5leHQgPSBleHRlbmRlZCArIHBvZmY7CisJCQl9IGVsc2UgeworCQkJCWRiZygiZm91bmQgMHgleCBkYXRhIHBhcnRpdGlvbiBhdCAweCVsbHgsIGxlbiAweCVsbHgiLAorCQkJCQlwYXJ0W2ldLnN5c19pbmQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBsZW4pOworCisJCQkJLyogd2UgYWx3YXlzIHN0YXJ0IGF0IHRoZSA1dGggZW50cnkgKi8KKy8vCQkJCXdoaWxlIChpZC0+cGFydGl0aW9uX2NvdW50IDwgNCkKKy8vCQkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQoJmlkLT5wYXJ0aXRpb25zW2lkLT5wYXJ0aXRpb25fY291bnQrK10sIFZPTFVNRV9JRF9VTlVTRUQpOworCQkJCWlmIChpZC0+cGFydGl0aW9uX2NvdW50IDwgNCkKKwkJCQkJaWQtPnBhcnRpdGlvbl9jb3VudCA9IDQ7CisKKwkJCQlwID0gJmlkLT5wYXJ0aXRpb25zW2lkLT5wYXJ0aXRpb25fY291bnRdOworCisvLwkJCQlpZiAoaXNfcmFpZChwYXJ0W2ldLnN5c19pbmQpKQorLy8JCQkJCXZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydChwLCBWT0xVTUVfSURfUkFJRCk7CisvLwkJCQllbHNlCisvLwkJCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KHAsIFZPTFVNRV9JRF9VTlBST0JFRCk7CisKKy8vCQkJCXAtPnB0X29mZiA9IGN1cnJlbnQgKyBwb2ZmOworLy8JCQkJcC0+cHRfbGVuID0gcGxlbjsKKwkJCQlpZC0+cGFydGl0aW9uX2NvdW50Kys7CisKKy8vCQkJCXAtPnB0X3R5cGVfcmF3ID0gcGFydFtpXS5zeXNfaW5kOworCisJCQkJaWYgKGlkLT5wYXJ0aXRpb25fY291bnQgPj0gVk9MVU1FX0lEX1BBUlRJVElPTlNfTUFYKSB7CisJCQkJCWRiZygidG9vIG1hbnkgcGFydGl0aW9ucyIpOworCQkJCQluZXh0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQljdXJyZW50ID0gbmV4dDsKKwl9CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9QQVJUSVRJT05UQUJMRSk7CisvLwlpZC0+dHlwZSA9ICJtc2Rvc19wYXJ0aXRpb25fdGFibGUiOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbnZpZGlhX3JhaWQuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9udmlkaWFfcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODQ3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbnZpZGlhX3JhaWQuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbnZpZGlhX21ldGEgeworCXVpbnQ4X3QJCXZlbmRvcls4XTsKKwl1aW50MzJfdAlzaXplOworCXVpbnQzMl90CWNoa3N1bTsKKwl1aW50MTZfdAl2ZXJzaW9uOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTlZJRElBX1NJR05BVFVSRQkJIk5WSURJQSIKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbnZpZGlhX3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgdWludDY0X3Qgc2l6ZSkKK3sKKwl1aW50NjRfdCBtZXRhX29mZjsKKwlzdHJ1Y3QgbnZpZGlhX21ldGEgKm52OworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMikgKiAweDIwMDsKKwludiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmIChudiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKG52LT52ZW5kb3IsIE5WSURJQV9TSUdOQVRVUkUsIHNpemVvZihOVklESUFfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCXNucHJpbnRmKGlkLT50eXBlX3ZlcnNpb24sIHNpemVvZihpZC0+dHlwZV92ZXJzaW9uKS0xLCAiJXUiLCBsZTE2X3RvX2NwdShudi0+dmVyc2lvbikpOworLy8JaWQtPnR5cGUgPSAibnZpZGlhX3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Byb21pc2VfcmFpZC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Byb21pc2VfcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGQwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfcHJvbWlzZV9yYWlkLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IHByb21pc2VfbWV0YSB7CisJdWludDhfdAlzaWdbMjRdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgUERDX0NPTkZJR19PRkYJCTB4MTIwMAorI2RlZmluZSBQRENfU0lHTkFUVVJFCQkiUHJvbWlzZSBUZWNobm9sb2d5LCBJbmMuIgorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9wcm9taXNlX2Zhc3R0cmFja19yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYsIHVpbnQ2NF90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlY3RvcnNbXSA9IHsKKwkJNjMsIDI1NSwgMjU2LCAxNiwgMzk5CisJfTsKKworCXN0cnVjdCBwcm9taXNlX21ldGEgKnBkYzsKKwl1bnNpZ25lZCBpOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHg0MDAwMCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2VjdG9ycyk7IGkrKykgeworCQl1aW50NjRfdCBtZXRhX29mZjsKKworCQltZXRhX29mZiA9ICgoc2l6ZSAvIDB4MjAwKSAtIHNlY3RvcnNbaV0pICogMHgyMDA7CisJCXBkYyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCQlpZiAocGRjID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKG1lbWNtcChwZGMtPnNpZywgUERDX1NJR05BVFVSRSwgc2l6ZW9mKFBEQ19TSUdOQVRVUkUpLTEpID09IDApCisJCQlnb3RvIGZvdW5kOworCX0KKwlyZXR1cm4gLTE7CisKKyBmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCWlkLT50eXBlID0gInByb21pc2VfZmFzdHRyYWNrX3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3NpbGljb25fcmFpZC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3NpbGljb25fcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzQzOWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfc2lsaWNvbl9yYWlkLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IHNpbGljb25fbWV0YSB7CisJdWludDhfdAkJdW5rbm93bjBbMHgyRV07CisJdWludDhfdAkJYXNjaWlfdmVyc2lvblsweDM2IC0gMHgyRV07CisJdWludDhfdAkJZGlza25hbWVbMHg1NiAtIDB4MzZdOworCXVpbnQ4X3QJCXVua25vd24xWzB4NjAgLSAweDU2XTsKKwl1aW50MzJfdAltYWdpYzsKKwl1aW50MzJfdAl1bmtub3duMWFbMHg2QyAtIDB4NjRdOworCXVpbnQzMl90CWFycmF5X3NlY3RvcnNfbG93OworCXVpbnQzMl90CWFycmF5X3NlY3RvcnNfaGlnaDsKKwl1aW50OF90CQl1bmtub3duMlsweDc4IC0gMHg3NF07CisJdWludDMyX3QJdGhpc2Rpc2tfc2VjdG9yczsKKwl1aW50OF90CQl1bmtub3duM1sweDEwMCAtIDB4N0NdOworCXVpbnQ4X3QJCXVua25vd240WzB4MTA0IC0gMHgxMDBdOworCXVpbnQxNl90CXByb2R1Y3RfaWQ7CisJdWludDE2X3QJdmVuZG9yX2lkOworCXVpbnQxNl90CW1pbm9yX3ZlcjsKKwl1aW50MTZfdAltYWpvcl92ZXI7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBTSUxJQ09OX01BR0lDCQkweDJGMDAwMDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3NpbGljb25fbWVkbGV5X3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgdWludDY0X3Qgc2l6ZSkKK3sKKwl1aW50NjRfdCBtZXRhX29mZjsKKwlzdHJ1Y3Qgc2lsaWNvbl9tZXRhICpzaWw7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCwgc2l6ZSAweCVsbHgiLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworCisJaWYgKHNpemUgPCAweDEwMDAwKQorCQlyZXR1cm4gLTE7CisKKwltZXRhX29mZiA9ICgoc2l6ZSAvIDB4MjAwKS0xKSAqIDB4MjAwOworCXNpbCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmIChzaWwgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNpbC0+bWFnaWMgIT0gY3B1X3RvX2xlMzIoU0lMSUNPTl9NQUdJQykpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8Jc25wcmludGYoaWQtPnR5cGVfdmVyc2lvbiwgc2l6ZW9mKGlkLT50eXBlX3ZlcnNpb24pLTEsICIldS4ldSIsCisvLwkJIGxlMTZfdG9fY3B1KHNpbC0+bWFqb3JfdmVyKSwgbGUxNl90b19jcHUoc2lsLT5taW5vcl92ZXIpKTsKKy8vCWlkLT50eXBlID0gInNpbGljb25fbWVkbGV5X3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Vmcy5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Vmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTI1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfdWZzLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90CWZzX2xpbms7CisJdWludDMyX3QJZnNfcmxpbms7CisJdWludDMyX3QJZnNfc2Jsa25vOworCXVpbnQzMl90CWZzX2NibGtubzsKKwl1aW50MzJfdAlmc19pYmxrbm87CisJdWludDMyX3QJZnNfZGJsa25vOworCXVpbnQzMl90CWZzX2Nnb2Zmc2V0OworCXVpbnQzMl90CWZzX2NnbWFzazsKKwl1aW50MzJfdAlmc190aW1lOworCXVpbnQzMl90CWZzX3NpemU7CisJdWludDMyX3QJZnNfZHNpemU7CisJdWludDMyX3QJZnNfbmNnOworCXVpbnQzMl90CWZzX2JzaXplOworCXVpbnQzMl90CWZzX2ZzaXplOworCXVpbnQzMl90CWZzX2ZyYWc7CisJdWludDMyX3QJZnNfbWluZnJlZTsKKwl1aW50MzJfdAlmc19yb3RkZWxheTsKKwl1aW50MzJfdAlmc19ycHM7CisJdWludDMyX3QJZnNfYm1hc2s7CisJdWludDMyX3QJZnNfZm1hc2s7CisJdWludDMyX3QJZnNfYnNoaWZ0OworCXVpbnQzMl90CWZzX2ZzaGlmdDsKKwl1aW50MzJfdAlmc19tYXhjb250aWc7CisJdWludDMyX3QJZnNfbWF4YnBnOworCXVpbnQzMl90CWZzX2ZyYWdzaGlmdDsKKwl1aW50MzJfdAlmc19mc2J0b2RiOworCXVpbnQzMl90CWZzX3Nic2l6ZTsKKwl1aW50MzJfdAlmc19jc21hc2s7CisJdWludDMyX3QJZnNfY3NzaGlmdDsKKwl1aW50MzJfdAlmc19uaW5kaXI7CisJdWludDMyX3QJZnNfaW5vcGI7CisJdWludDMyX3QJZnNfbnNwZjsKKwl1aW50MzJfdAlmc19vcHRpbTsKKwl1aW50MzJfdAlmc19ucHNlY3Rfc3RhdGU7CisJdWludDMyX3QJZnNfaW50ZXJsZWF2ZTsKKwl1aW50MzJfdAlmc190cmFja3NrZXc7CisJdWludDMyX3QJZnNfaWRbMl07CisJdWludDMyX3QJZnNfY3NhZGRyOworCXVpbnQzMl90CWZzX2Nzc2l6ZTsKKwl1aW50MzJfdAlmc19jZ3NpemU7CisJdWludDMyX3QJZnNfbnRyYWs7CisJdWludDMyX3QJZnNfbnNlY3Q7CisJdWludDMyX3QJZnNfc3BjOworCXVpbnQzMl90CWZzX25jeWw7CisJdWludDMyX3QJZnNfY3BnOworCXVpbnQzMl90CWZzX2lwZzsKKwl1aW50MzJfdAlmc19mcGc7CisJc3RydWN0IHVmc19jc3VtIHsKKwkJdWludDMyX3QJY3NfbmRpcjsKKwkJdWludDMyX3QJY3NfbmJmcmVlOworCQl1aW50MzJfdAljc19uaWZyZWU7CisJCXVpbnQzMl90CWNzX25mZnJlZTsKKwl9IFBBQ0tFRCBmc19jc3RvdGFsOworCWludDhfdAkJZnNfZm1vZDsKKwlpbnQ4X3QJCWZzX2NsZWFuOworCWludDhfdAkJZnNfcm9ubHk7CisJaW50OF90CQlmc19mbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlpbnQ4X3QJZnNfZnNtbnRbNTEyXTsKKwkJCXVpbnQzMl90CWZzX2Nncm90b3I7CisJCQl1aW50MzJfdAlmc19jc3BbMzFdOworCQkJdWludDMyX3QJZnNfbWF4Y2x1c3RlcjsKKwkJCXVpbnQzMl90CWZzX2NwYzsKKwkJCXVpbnQxNl90CWZzX29wb3N0YmxbMTZdWzhdOworCQl9IFBBQ0tFRCBmc191MTsKKwkJc3RydWN0IHsKKwkJCWludDhfdAkJZnNfZnNtbnRbNDY4XTsKKwkJCXVpbnQ4X3QJCWZzX3ZvbG5hbWVbMzJdOworCQkJdWludDY0X3QJZnNfc3d1aWQ7CisJCQlpbnQzMl90CQlmc19wYWQ7CisJCQl1aW50MzJfdAlmc19jZ3JvdG9yOworCQkJdWludDMyX3QJZnNfb2NzcFsyOF07CisJCQl1aW50MzJfdAlmc19jb250aWdkaXJzOworCQkJdWludDMyX3QJZnNfY3NwOworCQkJdWludDMyX3QJZnNfbWF4Y2x1c3RlcjsKKwkJCXVpbnQzMl90CWZzX2FjdGl2ZTsKKwkJCWludDMyX3QJCWZzX29sZF9jcGM7CisJCQlpbnQzMl90CQlmc19tYXhic2l6ZTsKKwkJCWludDY0X3QJCWZzX3NwYXJlY29uNjRbMTddOworCQkJaW50NjRfdAkJZnNfc2Jsb2NrbG9jOworCQkJc3RydWN0IHVmczJfY3N1bV90b3RhbCB7CisJCQkJdWludDY0X3QJY3NfbmRpcjsKKwkJCQl1aW50NjRfdAljc19uYmZyZWU7CisJCQkJdWludDY0X3QJY3NfbmlmcmVlOworCQkJCXVpbnQ2NF90CWNzX25mZnJlZTsKKwkJCQl1aW50NjRfdAljc19udW1jbHVzdGVyczsKKwkJCQl1aW50NjRfdAljc19zcGFyZVszXTsKKwkJCX0gUEFDS0VEIGZzX2NzdG90YWw7CisJCQlzdHJ1Y3QgdWZzX3RpbWV2YWwgeworCQkJCWludDMyX3QJCXR2X3NlYzsKKwkJCQlpbnQzMl90CQl0dl91c2VjOworCQkJfSBQQUNLRUQgZnNfdGltZTsKKwkJCWludDY0X3QJCWZzX3NpemU7CisJCQlpbnQ2NF90CQlmc19kc2l6ZTsKKwkJCXVpbnQ2NF90CWZzX2NzYWRkcjsKKwkJCWludDY0X3QJCWZzX3BlbmRpbmdibG9ja3M7CisJCQlpbnQzMl90CQlmc19wZW5kaW5naW5vZGVzOworCQl9IFBBQ0tFRCBmc191MjsKKwl9ICBmc191MTE7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJaW50MzJfdAkJZnNfc3BhcmVjb25bNTNdOworCQkJaW50MzJfdAkJZnNfcmVjbGFpbTsKKwkJCWludDMyX3QJCWZzX3NwYXJlY29uMlsxXTsKKwkJCWludDMyX3QJCWZzX3N0YXRlOworCQkJdWludDMyX3QJZnNfcWJtYXNrWzJdOworCQkJdWludDMyX3QJZnNfcWZtYXNrWzJdOworCQl9IFBBQ0tFRCBmc19zdW47CisJCXN0cnVjdCB7CisJCQlpbnQzMl90CQlmc19zcGFyZWNvbls1M107CisJCQlpbnQzMl90CQlmc19yZWNsYWltOworCQkJaW50MzJfdAkJZnNfc3BhcmVjb24yWzFdOworCQkJdWludDMyX3QJZnNfbnBzZWN0OworCQkJdWludDMyX3QJZnNfcWJtYXNrWzJdOworCQkJdWludDMyX3QJZnNfcWZtYXNrWzJdOworCQl9IFBBQ0tFRCBmc19zdW54ODY7CisJCXN0cnVjdCB7CisJCQlpbnQzMl90CQlmc19zcGFyZWNvbls1MF07CisJCQlpbnQzMl90CQlmc19jb250aWdzdW1zaXplOworCQkJaW50MzJfdAkJZnNfbWF4c3ltbGlua2xlbjsKKwkJCWludDMyX3QJCWZzX2lub2RlZm10OworCQkJdWludDMyX3QJZnNfbWF4ZmlsZXNpemVbMl07CisJCQl1aW50MzJfdAlmc19xYm1hc2tbMl07CisJCQl1aW50MzJfdAlmc19xZm1hc2tbMl07CisJCQlpbnQzMl90CQlmc19zdGF0ZTsKKwkJfSBQQUNLRUQgZnNfNDQ7CisJfSBmc191MjsKKwlpbnQzMl90CQlmc19wb3N0Ymxmb3JtYXQ7CisJaW50MzJfdAkJZnNfbnJwb3M7CisJaW50MzJfdAkJZnNfcG9zdGJsb2ZmOworCWludDMyX3QJCWZzX3JvdGJsb2ZmOworCXVpbnQzMl90CWZzX21hZ2ljOworCXVpbnQ4X3QJCWZzX3NwYWNlWzFdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgVUZTX01BR0lDCQkJMHgwMDAxMTk1NAorI2RlZmluZSBVRlMyX01BR0lDCQkJMHgxOTU0MDExOQorI2RlZmluZSBVRlNfTUFHSUNfRkVBCQkJMHgwMDE5NTYxMgorI2RlZmluZSBVRlNfTUFHSUNfTEZOCQkJMHgwMDA5NTAxNAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV91ZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwlzdGF0aWMgY29uc3Qgc2hvcnQgb2Zmc2V0c1tdID0geyAwLCA4LCA2NCwgMjU2IH07CisKKwl1aW50MzJfdCBtYWdpYzsKKwl1bnNpZ25lZCBpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKnVmczsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9mZnNldHMpOyBpKyspIHsKKwkJdWZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIChvZmZzZXRzW2ldICogMHg0MDApLCAweDgwMCk7CisJCWlmICh1ZnMgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlkYmcoIm9mZnNldCAweCV4Iiwgb2Zmc2V0c1tpXSAqIDB4NDAwKTsKKwkJbWFnaWMgPSB1ZnMtPmZzX21hZ2ljOworCQlpZiAoKG1hZ2ljID09IGNwdV90b19iZTMyKFVGU19NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTMl9NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTX01BR0lDX0ZFQSkpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTX01BR0lDX0xGTikpCisJCSkgeworCQkJZGJnKCJtYWdpYyAweCUwOHgoYmUpIiwgbWFnaWMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCQlpZiAoKG1hZ2ljID09IGNwdV90b19sZTMyKFVGU19NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTMl9NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTX01BR0lDX0ZFQSkpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTX01BR0lDX0xGTikpCisJCSkgeworCQkJZGJnKCJtYWdpYyAweCUwOHgobGUpIiwgbWFnaWMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7CisKKyBmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCWlkLT50eXBlID0gInVmcyI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF92aWFfcmFpZC5jIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3ZpYV9yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExZWVjMQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF92aWFfcmFpZC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB2aWFfbWV0YSB7CisJdWludDE2X3QJc2lnbmF0dXJlOworCXVpbnQ4X3QJCXZlcnNpb25fbnVtYmVyOworCXN0cnVjdCB2aWFfYXJyYXkgeworCQl1aW50MTZfdAlkaXNrX2JpdHM7CisJCXVpbnQ4X3QJCWRpc2tfYXJyYXlfZXg7CisJCXVpbnQzMl90CWNhcGFjaXR5X2xvdzsKKwkJdWludDMyX3QJY2FwYWNpdHlfaGlnaDsKKwkJdWludDMyX3QJc2VyaWFsX2NoZWNrc3VtOworCX0gUEFDS0VEIGFycmF5OworCXVpbnQzMl90CXNlcmlhbF9jaGVja3N1bVs4XTsKKwl1aW50OF90CQljaGVja3N1bTsKK30gUEFDS0VEOworCisjZGVmaW5lIFZJQV9TSUdOQVRVUkUJCTB4QUE1NQorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV92aWFfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCB2aWFfbWV0YSAqdmlhOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMSkgKiAweDIwMDsKKworCXZpYSA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmICh2aWEgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHZpYS0+c2lnbmF0dXJlICE9IGNwdV90b19sZTE2KFZJQV9TSUdOQVRVUkUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodmlhLT52ZXJzaW9uX251bWJlciA+IDEpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGVfdmVyc2lvblswXSA9ICcwJyArIHZpYS0+dmVyc2lvbl9udW1iZXI7CisvLwlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKy8vCWlkLT50eXBlID0gInZpYV9yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3V0aWwuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDc1YzdiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdXRpbC5jCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCit2b2lkIHZvbHVtZV9pZF9zZXRfdW5pY29kZTE2KGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgY29uc3QgdWludDhfdCAqYnVmLCBlbnVtIGVuZGlhbiBlbmRpYW5lc3MsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpLCBqOworCXVuc2lnbmVkIGM7CisKKwlqID0gMDsKKwlmb3IgKGkgPSAwOyBpICsgMiA8PSBjb3VudDsgaSArPSAyKSB7CisJCWlmIChlbmRpYW5lc3MgPT0gTEUpCisJCQljID0gKGJ1ZltpKzFdIDw8IDgpIHwgYnVmW2ldOworCQllbHNlCisJCQljID0gKGJ1ZltpXSA8PCA4KSB8IGJ1ZltpKzFdOworCQlpZiAoYyA9PSAwKSB7CisJCQlzdHJbal0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoYyA8IDB4ODApIHsKKwkJCWlmIChqKzEgPj0gbGVuKQorCQkJCWJyZWFrOworCQkJc3RyW2orK10gPSAodWludDhfdCkgYzsKKwkJfSBlbHNlIGlmIChjIDwgMHg4MDApIHsKKwkJCWlmIChqKzIgPj0gbGVuKQorCQkJCWJyZWFrOworCQkJc3RyW2orK10gPSAodWludDhfdCkgKDB4YzAgfCAoYyA+PiA2KSk7CisJCQlzdHJbaisrXSA9ICh1aW50OF90KSAoMHg4MCB8IChjICYgMHgzZikpOworCQl9IGVsc2UgeworCQkJaWYgKGorMyA+PSBsZW4pCisJCQkJYnJlYWs7CisJCQlzdHJbaisrXSA9ICh1aW50OF90KSAoMHhlMCB8IChjID4+IDEyKSk7CisJCQlzdHJbaisrXSA9ICh1aW50OF90KSAoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKKwkJCXN0cltqKytdID0gKHVpbnQ4X3QpICgweDgwIHwgKGMgJiAweDNmKSk7CisJCX0KKwl9CisJc3RyW2pdID0gJ1wwJzsKK30KKworI2lmZGVmIFVOVVNFRAorc3RhdGljIGNvbnN0IGNoYXIgKnVzYWdlX3RvX3N0cmluZyhlbnVtIHZvbHVtZV9pZF91c2FnZSB1c2FnZV9pZCkKK3sKKwlzd2l0Y2ggKHVzYWdlX2lkKSB7CisJY2FzZSBWT0xVTUVfSURfRklMRVNZU1RFTToKKwkJcmV0dXJuICJmaWxlc3lzdGVtIjsKKwljYXNlIFZPTFVNRV9JRF9QQVJUSVRJT05UQUJMRToKKwkJcmV0dXJuICJwYXJ0aXRpb250YWJsZSI7CisJY2FzZSBWT0xVTUVfSURfT1RIRVI6CisJCXJldHVybiAib3RoZXIiOworCWNhc2UgVk9MVU1FX0lEX1JBSUQ6CisJCXJldHVybiAicmFpZCI7CisJY2FzZSBWT0xVTUVfSURfRElTS0xBQkVMOgorCQlyZXR1cm4gImRpc2tsYWJlbCI7CisJY2FzZSBWT0xVTUVfSURfQ1JZUFRPOgorCQlyZXR1cm4gImNyeXB0byI7CisJY2FzZSBWT0xVTUVfSURfVU5QUk9CRUQ6CisJCXJldHVybiAidW5wcm9iZWQiOworCWNhc2UgVk9MVU1FX0lEX1VOVVNFRDoKKwkJcmV0dXJuICJ1bnVzZWQiOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCB2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQoc3RydWN0IHZvbHVtZV9pZF9wYXJ0aXRpb24gKnBhcnQsIGVudW0gdm9sdW1lX2lkX3VzYWdlIHVzYWdlX2lkKQoreworCXBhcnQtPnVzYWdlX2lkID0gdXNhZ2VfaWQ7CisJcGFydC0+dXNhZ2UgPSB1c2FnZV90b19zdHJpbmcodXNhZ2VfaWQpOworfQorCit2b2lkIHZvbHVtZV9pZF9zZXRfdXNhZ2Uoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGVudW0gdm9sdW1lX2lkX3VzYWdlIHVzYWdlX2lkKQoreworCWlkLT51c2FnZV9pZCA9IHVzYWdlX2lkOworCWlkLT51c2FnZSA9IHVzYWdlX3RvX3N0cmluZyh1c2FnZV9pZCk7Cit9CisKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCW1lbWNweShpZC0+bGFiZWxfcmF3LCBidWYsIGNvdW50KTsKKwlpZC0+bGFiZWxfcmF3X2xlbiA9IGNvdW50OworfQorI2VuZGlmCisKKyNpZmRlZiBOT1RfTkVFREVECitzdGF0aWMgc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqcywgc2l6ZV90IG1heGxlbikKK3sKKwlzaXplX3QgaTsKKwlpZiAoIW1heGxlbikgcmV0dXJuIDA7CisJaWYgKCFzKSByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyAqcyAmJiBpIDwgbWF4bGVuOyArK3MpICsraTsKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCit2b2lkIHZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCBjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpOworCisJbWVtY3B5KGlkLT5sYWJlbCwgYnVmLCBjb3VudCk7CisKKwkvKiByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCWkgPSBzdHJubGVuKGlkLT5sYWJlbCwgY291bnQpOworCXdoaWxlIChpLS0pIHsKKwkJaWYgKCFpc3NwYWNlKGlkLT5sYWJlbFtpXSkpCisJCQlicmVhazsKKwl9CisJaWQtPmxhYmVsW2krMV0gPSAnXDAnOworfQorCit2b2lkIHZvbHVtZV9pZF9zZXRfbGFiZWxfdW5pY29kZTE2KHN0cnVjdCB2b2x1bWVfaWQgKmlkLCBjb25zdCB1aW50OF90ICpidWYsIGVudW0gZW5kaWFuIGVuZGlhbmVzcywgc2l6ZV90IGNvdW50KQoreworCSB2b2x1bWVfaWRfc2V0X3VuaWNvZGUxNihpZC0+bGFiZWwsIHNpemVvZihpZC0+bGFiZWwpLCBidWYsIGVuZGlhbmVzcywgY291bnQpOworfQorCit2b2lkIHZvbHVtZV9pZF9zZXRfdXVpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgY29uc3QgdWludDhfdCAqYnVmLCBlbnVtIHV1aWRfZm9ybWF0IGZvcm1hdCkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIGNvdW50ID0gMDsKKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBVVUlEX0RPUzoKKwkJY291bnQgPSA0OworCQlicmVhazsKKwljYXNlIFVVSURfTlRGUzoKKwljYXNlIFVVSURfSEZTOgorCQljb3VudCA9IDg7CisJCWJyZWFrOworCWNhc2UgVVVJRF9EQ0U6CisJCWNvdW50ID0gMTY7CisJCWJyZWFrOworCWNhc2UgVVVJRF9EQ0VfU1RSSU5HOgorCQkvKiAzNiBpcyBvaywgaWQtPnV1aWQgaGFzIG9uZSBleHRyYSBieXRlIGZvciBOVUwgKi8KKwkJY291bnQgPSBWT0xVTUVfSURfVVVJRF9TSVpFOworCQlicmVhazsKKwl9CisvLwltZW1jcHkoaWQtPnV1aWRfcmF3LCBidWYsIGNvdW50KTsKKy8vCWlkLT51dWlkX3Jhd19sZW4gPSBjb3VudDsKKworCS8qIGlmIHNldCwgY3JlYXRlIHN0cmluZyBpbiB0aGUgc2FtZSBmb3JtYXQsIHRoZSBuYXRpdmUgcGxhdGZvcm0gdXNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlpZiAoYnVmW2ldICE9IDApCisJCQlnb3RvIHNldDsKKwlyZXR1cm47IC8qIGFsbCBieXRlcyBhcmUgemVybywgbGVhdmUgaXQgZW1wdHkgKCIiKSAqLworCitzZXQ6CisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIFVVSURfRE9TOgorCQlzcHJpbnRmKGlkLT51dWlkLCAiJTAyWCUwMlgtJTAyWCUwMlgiLAorCQkJYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSwgYnVmWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBVVUlEX05URlM6CisJCXNwcmludGYoaWQtPnV1aWQsICIlMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCIsCisJCQlidWZbN10sIGJ1Zls2XSwgYnVmWzVdLCBidWZbNF0sCisJCQlidWZbM10sIGJ1ZlsyXSwgYnVmWzFdLCBidWZbMF0pOworCQlicmVhazsKKwljYXNlIFVVSURfSEZTOgorCQlzcHJpbnRmKGlkLT51dWlkLCAiJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlgiLAorCQkJYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAorCQkJYnVmWzRdLCBidWZbNV0sIGJ1Zls2XSwgYnVmWzddKTsKKwkJYnJlYWs7CisJY2FzZSBVVUlEX0RDRToKKwkJc3ByaW50ZihpZC0+dXVpZCwKKwkJCSIlMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJCQlidWZbNF0sIGJ1Zls1XSwKKwkJCWJ1Zls2XSwgYnVmWzddLAorCQkJYnVmWzhdLCBidWZbOV0sCisJCQlidWZbMTBdLCBidWZbMTFdLCBidWZbMTJdLCBidWZbMTNdLCBidWZbMTRdLCBidWZbMTVdKTsKKwkJYnJlYWs7CisJY2FzZSBVVUlEX0RDRV9TVFJJTkc6CisJCW1lbWNweShpZC0+dXVpZCwgYnVmLCBjb3VudCk7CisJCWlkLT51dWlkW2NvdW50XSA9ICdcMCc7CisJCWJyZWFrOworCX0KK30KKworLyogRG8gbm90IHVzZSB4bHNlZWsgaGVyZS4gV2l0aCBpdCwgc2luZ2xlIGNvcnJ1cHRlZCBmaWxlc3lzdGVtCisgKiBtYXkgcmVzdWx0IGluIGF0dGVtcHQgdG8gc2VlayBwYXN0IGRldmljZSAtPiBleGl0LgorICogSXQncyBiZXR0ZXIgdG8gaWdub3JlIHN1Y2ggZnMgYW5kIGNvbnRpbnVlLiAgKi8KK3ZvaWQgKnZvbHVtZV9pZF9nZXRfYnVmZmVyKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYsIHNpemVfdCBsZW4pCit7CisJdWludDhfdCAqZHN0OworCXVuc2lnbmVkIHNtYWxsX29mZjsKKwlzc2l6ZV90IHJlYWRfbGVuOworCisJZGJnKCJnZXQgYnVmZmVyIG9mZiAweCVsbHgoJWxsdSksIGxlbiAweCV6eCIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCBsZW4pOworCisJLyogY2hlY2sgaWYgcmVxdWVzdGVkIGFyZWEgZml0cyBpbiBzdXBlcmJsb2NrIGJ1ZmZlciAqLworCWlmIChvZmYgKyBsZW4gPD0gU0JfQlVGRkVSX1NJWkUKKwkgLyogJiYgb2ZmIDw9IFNCX0JVRkZFUl9TSVpFIC0gd2FudCB0aGlzIHBhcmFub2lkIG92ZXJmbG93IGNoZWNrPyAqLworCSkgeworCQlpZiAoaWQtPnNiYnVmID09IE5VTEwpIHsKKwkJCWlkLT5zYmJ1ZiA9IHhtYWxsb2MoU0JfQlVGRkVSX1NJWkUpOworCQl9CisJCXNtYWxsX29mZiA9IG9mZjsKKwkJZHN0ID0gaWQtPnNiYnVmOworCisJCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVhZCAqLworCQlsZW4gKz0gb2ZmOworCQlpZiAobGVuIDw9IGlkLT5zYmJ1Zl9sZW4pCisJCQlnb3RvIHJldDsgLyogd2UgYWxyZWFkeSBoYXZlIGl0ICovCisKKwkJZGJnKCJyZWFkIHNiYnVmIGxlbjoweCV4IiwgKHVuc2lnbmVkKSBsZW4pOworCQlpZC0+c2JidWZfbGVuID0gbGVuOworCQlvZmYgPSAwOworCQlnb3RvIGRvX3JlYWQ7CisJfQorCisJaWYgKGxlbiA+IFNFRUtfQlVGRkVSX1NJWkUpIHsKKwkJZGJnKCJzZWVrIGJ1ZmZlciB0b28gc21hbGwgJWQiLCBTRUVLX0JVRkZFUl9TSVpFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRzdCA9IGlkLT5zZWVrYnVmOworCisJLyogY2hlY2sgaWYgd2UgbmVlZCB0byByZWFkICovCisJaWYgKChvZmYgPj0gaWQtPnNlZWtidWZfb2ZmKQorCSAmJiAoKG9mZiArIGxlbikgPD0gKGlkLT5zZWVrYnVmX29mZiArIGlkLT5zZWVrYnVmX2xlbikpCisJKSB7CisJCXNtYWxsX29mZiA9IG9mZiAtIGlkLT5zZWVrYnVmX29mZjsgLyogY2FuJ3Qgb3ZlcmZsb3cgKi8KKwkJZ290byByZXQ7IC8qIHdlIGFscmVhZHkgaGF2ZSBpdCAqLworCX0KKworCWlkLT5zZWVrYnVmX29mZiA9IG9mZjsKKwlpZC0+c2Vla2J1Zl9sZW4gPSBsZW47CisJaWQtPnNlZWtidWYgPSB4cmVhbGxvYyhpZC0+c2Vla2J1ZiwgbGVuKTsKKwlzbWFsbF9vZmYgPSAwOworCWRzdCA9IGlkLT5zZWVrYnVmOworCWRiZygicmVhZCBzZWVrYnVmIG9mZjoweCVsbHggbGVuOjB4JXp4IiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBvZmYsIGxlbik7CisgZG9fcmVhZDoKKwlpZiAobHNlZWsoaWQtPmZkLCBvZmYsIFNFRUtfU0VUKSAhPSBvZmYpIHsKKwkJZGJnKCJzZWVrKDB4JWxseCkgZmFpbGVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKwkJZ290byBlcnI7CisJfQorCXJlYWRfbGVuID0gZnVsbF9yZWFkKGlkLT5mZCwgZHN0LCBsZW4pOworCWlmIChyZWFkX2xlbiAhPSBsZW4pIHsKKwkJZGJnKCJyZXF1ZXN0ZWQgMHgleCBieXRlcywgZ290IDB4JXggYnl0ZXMiLAorCQkJCSh1bnNpZ25lZCkgbGVuLCAodW5zaWduZWQpIHJlYWRfbGVuKTsKKyBlcnI6CisJCS8qIE5vIGZpbGVzeXN0ZW0gY2FuIGJlIHRoaXMgdGlueS4gSXQncyBtb3N0IGxpa2VseQorCQkgKiBub24tYXNzb2NpYXRlZCBsb29wIGRldmljZSwgZW1wdHkgZHJpdmUgYW5kIHNvIG9uLgorCQkgKiBGbGFnIGl0LCBtYWtpbmcgaXQgcG9zc2libGUgdG8gc2hvcnQgY2lyY3VpdCBmdXR1cmUKKwkJICogYWNjZXNzZXMuIFJhdGlvbmFsZToKKwkJICogdXNlcnMgY29tcGxhaW5lZCBvZiBzbG93IGJsa2lkIGR1ZSB0byBlbXB0eSBmbG9wcHkgZHJpdmVzLgorCQkgKi8KKwkJaWYgKG9mZiA8IDY0KjEwMjQpCisJCQlpZC0+ZXJyb3IgPSAxOworCQkvKiBpZC0+c2Vla2J1Zl9sZW4gb3IgaWQtPnNiYnVmX2xlbiBpcyB3cm9uZyBub3chIEZpeGluZy4gKi8KKwkJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorIHJldDoKKwlyZXR1cm4gZHN0ICsgc21hbGxfb2ZmOworfQorCit2b2lkIHZvbHVtZV9pZF9mcmVlX2J1ZmZlcihzdHJ1Y3Qgdm9sdW1lX2lkICppZCkKK3sKKwlmcmVlKGlkLT5zYmJ1Zik7CisJaWQtPnNiYnVmID0gTlVMTDsKKwlpZC0+c2JidWZfbGVuID0gMDsKKwlmcmVlKGlkLT5zZWVrYnVmKTsKKwlpZC0+c2Vla2J1ZiA9IE5VTEw7CisJaWQtPnNlZWtidWZfbGVuID0gMDsKKwlpZC0+c2Vla2J1Zl9vZmYgPSAwOyAvKiBwYXJhbm9pYSAqLworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkLmMgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC92b2x1bWVfaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDFkNGUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKworLyogU29tZSBkZXRlY3Rpb24gcm91dGluZXMgZG8gbm90IHNldCBsYWJlbCBvciB1dWlkIGFueXdheSwKKyAqIHNvIHRoZXkgYXJlIGRpc2FibGVkLiAqLworCisvKiBMb29rcyBmb3IgcGFydGl0aW9ucywgd2UgZG9uJ3QgdXNlIGl0OiAqLworI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9NQUMgICAgICAgICAgIDAKKy8qICNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTVNET1MgICAgICAwIC0gTkI6IHRoaXMgb25lCisgKiB3YXMgbm90IHByb3Blcmx5IGFkZGVkIHRvIHByb2JlIHRhYmxlIGFueXdheSAtID8/ISAqLworCisvKiBOb25lIG9mIFJBSURzIGhhdmUgbGFiZWwgb3IgdXVpZCwgZXhjZXB0IExpbnV4UkFJRDogKi8KKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSElHSFBPSU5UUkFJRCAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQgICAgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MU0lSQUlEICAgICAgIDAKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTFZNICAgICAgICAgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX05WSURJQVJBSUQgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9QUk9NSVNFUkFJRCAgIDAKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfU0lMSUNPTlJBSUQgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1ZJQVJBSUQgICAgICAgMAorCisvKiBUaGVzZSBmaWxlc3lzdGVtcyBhbHNvIGhhdmUgbm8gbGFiZWwgb3IgdXVpZDogKi8KKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVggICAgICAgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0hQRlMgICAgICAgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9VRlMgICAgICAgICAgIDAKKworCit0eXBlZGVmIGludCBGQVNUX0ZVTkMgKCpyYWlkX3Byb2JlX2ZwdHIpKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCAvKnVpbnQ2NF90IG9mZiwqLyB1aW50NjRfdCBzaXplKTsKK3R5cGVkZWYgaW50IEZBU1RfRlVOQyAoKnByb2JlX2ZwdHIpKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLCB1aW50NjRfdCBvZmYqLyk7CisKK3N0YXRpYyBjb25zdCByYWlkX3Byb2JlX2ZwdHIgcmFpZDFbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfbGludXhfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQKKwl2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0xTSVJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfbHNpX21lZ2FfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1ZJQVJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfdmlhX3JhaWQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9TSUxJQ09OUkFJRAorCXZvbHVtZV9pZF9wcm9iZV9zaWxpY29uX21lZGxleV9yYWlkLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTlZJRElBUkFJRAorCXZvbHVtZV9pZF9wcm9iZV9udmlkaWFfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1BST01JU0VSQUlECisJdm9sdW1lX2lkX3Byb2JlX3Byb21pc2VfZmFzdHRyYWNrX3JhaWQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9ISUdIUE9JTlRSQUlECisJdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF80NXhfcmFpZCwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHByb2JlX2ZwdHIgcmFpZDJbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MVk0KKwl2b2x1bWVfaWRfcHJvYmVfbHZtMSwKKwl2b2x1bWVfaWRfcHJvYmVfbHZtMiwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0hJR0hQT0lOVFJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfaGlnaHBvaW50XzM3eF9yYWlkLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTFVLUworCXZvbHVtZV9pZF9wcm9iZV9sdWtzLAorI2VuZGlmCit9OworCisvKiBzaWduYXR1cmUgaW4gdGhlIGZpcnN0IGJsb2NrLCBvbmx5IHNtYWxsIGJ1ZmZlciBuZWVkZWQgKi8KK3N0YXRpYyBjb25zdCBwcm9iZV9mcHRyIGZzMVtdID0geworI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0ZBVAorCXZvbHVtZV9pZF9wcm9iZV92ZmF0LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTUFDCisJdm9sdW1lX2lkX3Byb2JlX21hY19wYXJ0aXRpb25fbWFwLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfWEZTCisJdm9sdW1lX2lkX3Byb2JlX3hmcywKKyNlbmRpZgorfTsKKworLyogZmlsbCBidWZmZXIgd2l0aCBtYXhpbXVtICovCitzdGF0aWMgY29uc3QgcHJvYmVfZnB0ciBmczJbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAKKwl2b2x1bWVfaWRfcHJvYmVfbGludXhfc3dhcCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0VYVAorCXZvbHVtZV9pZF9wcm9iZV9leHQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUworCXZvbHVtZV9pZF9wcm9iZV9idHJmcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTCisJdm9sdW1lX2lkX3Byb2JlX3JlaXNlcmZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSkZTCisJdm9sdW1lX2lkX3Byb2JlX2pmcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1VERgorCXZvbHVtZV9pZF9wcm9iZV91ZGYsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwCisJdm9sdW1lX2lkX3Byb2JlX2lzbzk2NjAsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9IRlMKKwl2b2x1bWVfaWRfcHJvYmVfaGZzX2hmc3BsdXMsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9VRlMKKwl2b2x1bWVfaWRfcHJvYmVfdWZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTlRGUworCXZvbHVtZV9pZF9wcm9iZV9udGZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTCisJdm9sdW1lX2lkX3Byb2JlX2NyYW1mcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTCisJdm9sdW1lX2lkX3Byb2JlX3JvbWZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSFBGUworCXZvbHVtZV9pZF9wcm9iZV9ocGZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfU1lTVgorCXZvbHVtZV9pZF9wcm9iZV9zeXN2LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVgKKwl2b2x1bWVfaWRfcHJvYmVfbWluaXgsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMgorCXZvbHVtZV9pZF9wcm9iZV9vY2ZzMiwKKyNlbmRpZgorfTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfYWxsKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCAvKnVpbnQ2NF90IG9mZiwqLyB1aW50NjRfdCBzaXplKQoreworCXVuc2lnbmVkIGk7CisKKwkvKiBwcm9iZSBmb3IgcmFpZCBmaXJzdCwgY2F1c2UgZnMgcHJvYmVzIG1heSBiZSBzdWNjZXNzZnVsIG9uIHJhaWQgbWVtYmVycyAqLworCWlmIChzaXplKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhaWQxKTsgaSsrKSB7CisJCQlpZiAocmFpZDFbaV0oaWQsIC8qb2ZmLCovIHNpemUpID09IDApCisJCQkJZ290byByZXQ7CisJCQlpZiAoaWQtPmVycm9yKQorCQkJCWdvdG8gcmV0OworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFpZDIpOyBpKyspIHsKKwkJaWYgKHJhaWQyW2ldKGlkIC8qLG9mZiovKSA9PSAwKQorCQkJZ290byByZXQ7CisJCWlmIChpZC0+ZXJyb3IpCisJCQlnb3RvIHJldDsKKwl9CisKKwkvKiBzaWduYXR1cmUgaW4gdGhlIGZpcnN0IGJsb2NrLCBvbmx5IHNtYWxsIGJ1ZmZlciBuZWVkZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmczEpOyBpKyspIHsKKwkJaWYgKGZzMVtpXShpZCAvKixvZmYqLykgPT0gMCkKKwkJCWdvdG8gcmV0OworCQlpZiAoaWQtPmVycm9yKQorCQkJZ290byByZXQ7CisJfQorCisJLyogZmlsbCBidWZmZXIgd2l0aCBtYXhpbXVtICovCisJdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIDAsIFNCX0JVRkZFUl9TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZzMik7IGkrKykgeworCQlpZiAoZnMyW2ldKGlkIC8qLG9mZiovKSA9PSAwKQorCQkJZ290byByZXQ7CisJCWlmIChpZC0+ZXJyb3IpCisJCQlnb3RvIHJldDsKKwl9CisKKyByZXQ6CisJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKwlyZXR1cm4gKC0gaWQtPmVycm9yKTsgLyogMCBvciAtMSAqLworfQorCisvKiBvcGVuIHZvbHVtZSBieSBkZXZpY2Ugbm9kZSAqLworc3RydWN0IHZvbHVtZV9pZCogRkFTVF9GVU5DIHZvbHVtZV9pZF9vcGVuX25vZGUoaW50IGZkKQoreworCXN0cnVjdCB2b2x1bWVfaWQgKmlkOworCisJaWQgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3Qgdm9sdW1lX2lkKSk7CisJaWQtPmZkID0gZmQ7CisJLy8vKiBjbG9zZSBmZCBvbiBkZXZpY2UgY2xvc2UgKi8KKwkvL2lkLT5mZF9jbG9zZSA9IDE7CisJcmV0dXJuIGlkOworfQorCisjaWZkZWYgVU5VU0VECisvKiBvcGVuIHZvbHVtZSBieSBtYWpvci9taW5vciAqLworc3RydWN0IHZvbHVtZV9pZCogRkFTVF9GVU5DIHZvbHVtZV9pZF9vcGVuX2Rldl90KGRldl90IGRldnQpCit7CisJc3RydWN0IHZvbHVtZV9pZCAqaWQ7CisJY2hhciAqdG1wX25vZGVbVk9MVU1FX0lEX1BBVEhfTUFYXTsKKworCXRtcF9ub2RlID0geGFzcHJpbnRmKCIvZGV2Ly52b2x1bWVfaWQtJXUtJXUtJXUiLAorCQkodW5zaWduZWQpZ2V0cGlkKCksICh1bnNpZ25lZCltYWpvcihkZXZ0KSwgKHVuc2lnbmVkKW1pbm9yKGRldnQpKTsKKworCS8qIGNyZWF0ZSB0ZW1wb3Jhcnkgbm9kZSB0byBvcGVuIGJsb2NrIGRldmljZSAqLworCXVubGluayh0bXBfbm9kZSk7CisJaWYgKG1rbm9kKHRtcF9ub2RlLCAoU19JRkJMSyB8IDA2MDApLCBkZXZ0KSAhPSAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG1rbm9kKCVzKSIsIHRtcF9ub2RlKTsKKworCWlkID0gdm9sdW1lX2lkX29wZW5fbm9kZSh0bXBfbm9kZSk7CisJdW5saW5rKHRtcF9ub2RlKTsKKwlmcmVlKHRtcF9ub2RlKTsKKwlyZXR1cm4gaWQ7Cit9CisjZW5kaWYKKwordm9pZCBGQVNUX0ZVTkMgZnJlZV92b2x1bWVfaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQpCit7CisJaWYgKGlkID09IE5VTEwpCisJCXJldHVybjsKKworCS8vaWYgKGlkLT5mZF9jbG9zZSAhPSAwKSAtIGFsd2F5cyB0cnVlCisJCWNsb3NlKGlkLT5mZCk7CisJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKKwlmcmVlKGlkLT5wYXJ0aXRpb25zKTsKKyNlbmRpZgorCWZyZWUoaWQpOworfQpkaWZmIC0tZ2l0IGEvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkX2ludGVybmFsLmggYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC92b2x1bWVfaWRfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzY0MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC0xLjE5LjMvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkX2ludGVybmFsLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKyNkZWZpbmUgZGJnKC4uLikgKCh2b2lkKTApCisvKiAjZGVmaW5lIGRiZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykgKi8KKworLyogdm9sdW1lX2lkLmggKi8KKworI2RlZmluZSBWT0xVTUVfSURfVkVSU0lPTgkJNDgKKworI2RlZmluZSBWT0xVTUVfSURfTEFCRUxfU0laRQkJNjQKKyNkZWZpbmUgVk9MVU1FX0lEX1VVSURfU0laRQkJMzYKKyNkZWZpbmUgVk9MVU1FX0lEX0ZPUk1BVF9TSVpFCQkzMgorI2RlZmluZSBWT0xVTUVfSURfUEFSVElUSU9OU19NQVgJMjU2CisKK2VudW0gdm9sdW1lX2lkX3VzYWdlIHsKKwlWT0xVTUVfSURfVU5VU0VELAorCVZPTFVNRV9JRF9VTlBST0JFRCwKKwlWT0xVTUVfSURfT1RIRVIsCisJVk9MVU1FX0lEX0ZJTEVTWVNURU0sCisJVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFLAorCVZPTFVNRV9JRF9SQUlELAorCVZPTFVNRV9JRF9ESVNLTEFCRUwsCisJVk9MVU1FX0lEX0NSWVBUTywKK307CisKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKK3N0cnVjdCB2b2x1bWVfaWRfcGFydGl0aW9uIHsKKy8vCWNvbnN0IGNoYXIJKnR5cGU7CisvLwljb25zdCBjaGFyCSp1c2FnZTsKKy8vCXNtYWxsaW50CXVzYWdlX2lkOworLy8JdWludDhfdAkJcHRfdHlwZV9yYXc7CisvLwl1aW50NjRfdAlwdF9vZmY7CisvLwl1aW50NjRfdAlwdF9sZW47Cit9OworI2VuZGlmCisKK3N0cnVjdCB2b2x1bWVfaWQgeworCWludAkJZmQ7CisvLwlpbnQJCWZkX2Nsb3NlOjE7CisJaW50CQllcnJvcjsKKwlzaXplX3QJCXNiYnVmX2xlbjsKKwlzaXplX3QJCXNlZWtidWZfbGVuOworCXVpbnQ4X3QJCSpzYmJ1ZjsKKwl1aW50OF90CQkqc2Vla2J1ZjsKKwl1aW50NjRfdAlzZWVrYnVmX29mZjsKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKKwlzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbiAqcGFydGl0aW9uczsKKwlzaXplX3QJCXBhcnRpdGlvbl9jb3VudDsKKyNlbmRpZgorLy8JdWludDhfdAkJbGFiZWxfcmF3W1ZPTFVNRV9JRF9MQUJFTF9TSVpFXTsKKy8vCXNpemVfdAkJbGFiZWxfcmF3X2xlbjsKKwljaGFyCQlsYWJlbFtWT0xVTUVfSURfTEFCRUxfU0laRSsxXTsKKy8vCXVpbnQ4X3QJCXV1aWRfcmF3W1ZPTFVNRV9JRF9VVUlEX1NJWkVdOworLy8Jc2l6ZV90CQl1dWlkX3Jhd19sZW47CisJLyogdXVpZCBpcyBzdG9yZWQgaW4gQVNDSUkgKG5vdCBiaW5hcnkpIGZvcm0gaGVyZTogKi8KKwljaGFyCQl1dWlkW1ZPTFVNRV9JRF9VVUlEX1NJWkUrMV07CisvLwljaGFyCQl0eXBlX3ZlcnNpb25bVk9MVU1FX0lEX0ZPUk1BVF9TSVpFXTsKKy8vCXNtYWxsaW50CXVzYWdlX2lkOworLy8JY29uc3QgY2hhcgkqdXNhZ2U7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorCWNvbnN0IGNoYXIJKnR5cGU7CisjZW5kaWYKK307CisKK3N0cnVjdCB2b2x1bWVfaWQqIEZBU1RfRlVOQyB2b2x1bWVfaWRfb3Blbl9ub2RlKGludCBmZCk7CitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9hbGwoc3RydWN0IHZvbHVtZV9pZCAqaWQsIC8qdWludDY0X3Qgb2ZmLCovIHVpbnQ2NF90IHNpemUpOwordm9pZCBGQVNUX0ZVTkMgZnJlZV92b2x1bWVfaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQpOworCisvKiB1dGlsLmggKi8KKworLyogc2l6ZSBvZiBzdXBlcmJsb2NrIGJ1ZmZlciwgcmVpc2VyZnMgYmxvY2sgaXMgYXQgNjRrICovCisjZGVmaW5lIFNCX0JVRkZFUl9TSVpFCQkJCTB4MTEwMDAKKy8qIHNpemUgb2Ygc2VlayBidWZmZXIsIEZBVCBjbHVzdGVyIGlzIDMyayBtYXggKi8KKyNkZWZpbmUgU0VFS19CVUZGRVJfU0laRQkJCTB4MTAwMDAKKworI2RlZmluZSBic3dhcDE2KHgpICh1aW50MTZfdCkJKCBcCisJCQkJKCgodWludDE2X3QpKHgpICYgMHgwMGZmdSkgPDwgOCkgfCBcCisJCQkJKCgodWludDE2X3QpKHgpICYgMHhmZjAwdSkgPj4gOCkpCisKKyNkZWZpbmUgYnN3YXAzMih4KSAodWludDMyX3QpCSggXAorCQkJCSgoKHVpbnQzMl90KSh4KSAmIDB4ZmYwMDAwMDB1KSA+PiAyNCkgfCBcCisJCQkJKCgodWludDMyX3QpKHgpICYgMHgwMGZmMDAwMHUpID4+ICA4KSB8IFwKKwkJCQkoKCh1aW50MzJfdCkoeCkgJiAweDAwMDBmZjAwdSkgPDwgIDgpIHwgXAorCQkJCSgoKHVpbnQzMl90KSh4KSAmIDB4MDAwMDAwZmZ1KSA8PCAyNCkpCisKKyNkZWZpbmUgYnN3YXA2NCh4KSAodWludDY0X3QpCSggXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4ZmYwMDAwMDAwMDAwMDAwMHVsbCkgPj4gNTYpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDBmZjAwMDAwMDAwMDAwMHVsbCkgPj4gNDApIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMGZmMDAwMDAwMDAwMHVsbCkgPj4gMjQpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwZmYwMDAwMDAwMHVsbCkgPj4gIDgpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDBmZjAwMDAwMHVsbCkgPDwgIDgpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDAwMGZmMDAwMHVsbCkgPDwgMjQpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDAwMDAwZmYwMHVsbCkgPDwgNDApIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDAwMDAwMDBmZnVsbCkgPDwgNTYpKQorCisjaWYgQkJfTElUVExFX0VORElBTgorI2RlZmluZSBsZTE2X3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgbGUzMl90b19jcHUoeCkgKHgpCisjZGVmaW5lIGxlNjRfdG9fY3B1KHgpICh4KQorI2RlZmluZSBiZTE2X3RvX2NwdSh4KSBic3dhcDE2KHgpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHgpIGJzd2FwMzIoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMTYoeCkgKHgpCisjZGVmaW5lIGNwdV90b19sZTMyKHgpICh4KQorI2RlZmluZSBjcHVfdG9fYmUzMih4KSBic3dhcDMyKHgpCisjZWxzZQorI2RlZmluZSBsZTE2X3RvX2NwdSh4KSBic3dhcDE2KHgpCisjZGVmaW5lIGxlMzJfdG9fY3B1KHgpIGJzd2FwMzIoeCkKKyNkZWZpbmUgbGU2NF90b19jcHUoeCkgYnN3YXA2NCh4KQorI2RlZmluZSBiZTE2X3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgYmUzMl90b19jcHUoeCkgKHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpIGJzd2FwMTYoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzIoeCkgYnN3YXAzMih4KQorI2RlZmluZSBjcHVfdG9fYmUzMih4KSAoeCkKKyNlbmRpZgorCitlbnVtIHV1aWRfZm9ybWF0IHsKKwlVVUlEX0RDRV9TVFJJTkcsCisJVVVJRF9EQ0UsCisJVVVJRF9ET1MsCisJVVVJRF9OVEZTLAorCVVVSURfSEZTLAorfTsKKworZW51bSBlbmRpYW4geworCUxFID0gMCwKKwlCRSA9IDEKK307CisKK3ZvaWQgdm9sdW1lX2lkX3NldF91bmljb2RlMTYoY2hhciAqc3RyLCBzaXplX3QgbGVuLCBjb25zdCB1aW50OF90ICpidWYsIGVudW0gZW5kaWFuIGVuZGlhbmVzcywgc2l6ZV90IGNvdW50KTsKKy8vdm9pZCB2b2x1bWVfaWRfc2V0X3VzYWdlKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCBlbnVtIHZvbHVtZV9pZF91c2FnZSB1c2FnZV9pZCk7CisvL3ZvaWQgdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KHN0cnVjdCB2b2x1bWVfaWRfcGFydGl0aW9uICpwYXJ0LCBlbnVtIHZvbHVtZV9pZF91c2FnZSB1c2FnZV9pZCk7CisvL3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgZW51bSBlbmRpYW4gZW5kaWFuZXNzLCBzaXplX3QgY291bnQpOwordm9pZCB2b2x1bWVfaWRfc2V0X3V1aWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgZW51bSB1dWlkX2Zvcm1hdCBmb3JtYXQpOwordm9pZCAqdm9sdW1lX2lkX2dldF9idWZmZXIoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgc2l6ZV90IGxlbik7Cit2b2lkIHZvbHVtZV9pZF9mcmVlX2J1ZmZlcihzdHJ1Y3Qgdm9sdW1lX2lkICppZCk7CisKKworLyogUHJvYmUgcm91dGluZXMgKi8KKworLyogUkFJRCAqLworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF8zN3hfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF80NXhfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xpbnV4X3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8sIHVpbnQ2NF90IHNpemUpOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xzaV9tZWdhX3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8sIHVpbnQ2NF90IHNpemUpOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX252aWRpYV9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9wcm9taXNlX2Zhc3R0cmFja19yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9zaWxpY29uX21lZGxleV9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV92aWFfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHZtMShzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2x2bTIoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCisvKiBGUyAqLworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9idHJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2NyYW1mcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2V4dChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3ZmYXQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9oZnNfaGZzcGx1cyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaHBmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2lzbzk2NjAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9qZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9saW51eF9zd2FwKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHVrcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbWFjX3BhcnRpdGlvbl9tYXAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX21pbml4KHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9tc2Rvc19wYXJ0X3RhYmxlKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbnRmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX29jZnMyKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfcmVpc2VyZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9yb21mcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3N5c3Yoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV91ZGYoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3VmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3hmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCmRpZmYgLS1naXQgYS9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC94ZnMuYyBiL2J1c3lib3gtMS4xOS4zL3V0aWwtbGludXgvdm9sdW1lX2lkL3hmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzQ2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LTEuMTkuMy91dGlsLWxpbnV4L3ZvbHVtZV9pZC94ZnMuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrIHsKKwl1aW50OF90CW1hZ2ljWzRdOworCXVpbnQzMl90CWJsb2Nrc2l6ZTsKKwl1aW50NjRfdAlkYmxvY2tzOworCXVpbnQ2NF90CXJibG9ja3M7CisJdWludDMyX3QJZHVtbXkxWzJdOworCXVpbnQ4X3QJdXVpZFsxNl07CisJdWludDMyX3QJZHVtbXkyWzE1XTsKKwl1aW50OF90CWZuYW1lWzEyXTsKKwl1aW50MzJfdAlkdW1teTNbMl07CisJdWludDY0X3QJaWNvdW50OworCXVpbnQ2NF90CWlmcmVlOworCXVpbnQ2NF90CWZkYmxvY2tzOworfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3hmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrICp4czsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCXhzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiwgMHgyMDApOworCWlmICh4cyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKHhzLT5tYWdpYywgIlhGU0IiLCA0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCB4cy0+Zm5hbWUsIDEyKTsKKwl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgeHMtPmZuYW1lLCAxMik7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCB4cy0+dXVpZCwgVVVJRF9EQ0UpOworCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInhmcyI7KQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01MC5kZXNjcmlwdGlvbiBiL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTUwLmRlc2NyaXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTE1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01MC5kZXNjcmlwdGlvbgpAQCAtMCwwICsxIEBACitUaGlzIHBhdGNoIGVuYWJsZXMgc3VwcG9ydCBmb3IgZW5hYmxpbmcgLWZuby1zdHJpY3QtYWxpYXNpbmcgd2hlbiBjb21waWxpbmcgd2l0aCBHQ0MgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDQuNC4KZGlmZiAtLWdpdCBhL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTUwLnBhdGNoIGIvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTAucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkMzg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTUwLnBhdGNoCkBAIC0wLDAgKzEsMTIgQEAKK2RpZmYgLWFydU4gYS9NYWtlZmlsZS5mbGFncyBiL01ha2VmaWxlLmZsYWdzCistLS0gYS9NYWtlZmlsZS5mbGFncwkyMDEwLTA4LTIyIDAxOjIxOjM4LjAwMDAwMDAwMCAtMDcwMAorKysrIGIvTWFrZWZpbGUuZmxhZ3MJMjAxMC0xMC0wOCAxNDo0NToxNi41MTczMjQxNDggLTA3MDAKK0BAIC00MSw3ICs0MSw3IEBACisgIyMgYW5kIEkgYW0gdW53aWxsaW5nIHRvIGRvIGNyYXp5IGdjYyBzcGVjaWZpYyAoeyB2b2lkICpwcHAgPSAuLi47IH0pCisgIyMgc3R1ZmYgaW4gbWFjcm9zLiBUaGlzIHdvdWxkIG9iZnVzY2F0ZSB0aGUgY29kZSB0b28gbXVjaC4KKyAjIyBNYXliZSB0cnkgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpPworLSNDRkxBR1MgKz0gJChjYWxsIGNjLWlmdmVyc2lvbiwgLWVxLCAwNDA0LCAtZm5vLXN0cmljdC1hbGlhc2luZykKKytDRkxBR1MgKz0gJChjYWxsIGNjLWlmdmVyc2lvbiwgLWdlLCAwNDA0LCAtZm5vLXN0cmljdC1hbGlhc2luZykKKyBlbmRpZgorICMgZ2NjIDMueCBlbWl0cyBib2d1cyAib2xkIHN0eWxlIHByb3RvIiB3YXJuaW5nIG9uIGZpbmQuYzphbGxvY19hY3Rpb24oKQorIENGTEFHUyArPSAkKGNhbGwgY2MtaWZ2ZXJzaW9uLCAtZ2UsIDA0MDAsIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24pCmRpZmYgLS1naXQgYS9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01MS5kZXNjcmlwdGlvbiBiL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTUxLmRlc2NyaXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Njk2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01MS5kZXNjcmlwdGlvbgpAQCAtMCwwICsxLDIgQEAKK1RoaXMgcGF0Y2ggYWRkcyBzdXBwb3J0IGZvciBsb2dnaW5nIHN5c2xvZyB0aW1lIHN0YW1wcyBpbiBDb29yZGluYXRlZCAKK1VuaXZlcnNhbCBUaW1lIChVVEMpLgpkaWZmIC0tZ2l0IGEvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTEucGF0Y2ggYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01MS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTk3MzYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTEucGF0Y2gKQEAgLTAsMCArMSw3MCBAQAorZGlmZiAtYXJ1TiBhL3N5c2tsb2dkL3N5c2xvZ2QuYyBjL3N5c2tsb2dkL3N5c2xvZ2QuYworLS0tIGEvc3lza2xvZ2Qvc3lzbG9nZC5jCTIwMTEtMTAtMjkgMDQ6NDM6MDEuMDAwMDAwMDAwIC0wNzAwCisrKysgYy9zeXNrbG9nZC9zeXNsb2dkLmMJMjAxMi0wMS0wNCAxMDoxMTowNS45MjE4NzkzNzYgLTA4MDAKK0BAIC0yNCw2ICsyNCw3IEBACisgLy91c2FnZTogICAgICJcbgktTyBGSUxFCQlMb2cgdG8gRklMRSAoZGVmYXVsdDovdmFyL2xvZy9tZXNzYWdlcykiCisgLy91c2FnZTogICAgICJcbgktbCBOCQlMb2cgb25seSBtZXNzYWdlcyBtb3JlIHVyZ2VudCB0aGFuIHByaW8gTiAoMS04KSIKKyAvL3VzYWdlOiAgICAgIlxuCS1TCQlTbWFsbGVyIG91dHB1dCIKKysvL3VzYWdlOiAgICAgIlxuCS11CQlMb2cgdGltZSBzdGFtcHMgaW4gQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUgKFVUQykiCisgLy91c2FnZToJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgKKyAvL3VzYWdlOiAgICAgIlxuCS1zIFNJWkUJCU1heCBzaXplIChLQikgYmVmb3JlIHJvdGF0aW9uIChkZWZhdWx0OjIwMEtCLCAwPW9mZikiCisgLy91c2FnZTogICAgICJcbgktYiBOCQlOIHJvdGF0ZWQgbG9ncyB0byBrZWVwIChkZWZhdWx0OjEsIG1heD05OSwgMD1wdXJnZSkiCitAQCAtMjA1LDYgKzIwNiw3IEBACisgCU9QVEJJVF9vdXRmaWxlLCAvLyAtTworIAlPUFRCSVRfbG9nbGV2ZWwsIC8vIC1sCisgCU9QVEJJVF9zbWFsbCwgLy8gLVMKKysJT1BUQklUX3V0YywgLy8gLXUKKyAJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRShPUFRCSVRfZmlsZXNpemUgICAsKQkvLyAtcworIAlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKE9QVEJJVF9yb3RhdGVjbnQgICwpCS8vIC1iCisgCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgT1BUQklUX3JlbW90ZWxvZyAgLCkJLy8gLVIKK0BAIC0yMTgsNiArMjIwLDcgQEAKKyAJT1BUX291dGZpbGUgICAgID0gMSA8PCBPUFRCSVRfb3V0ZmlsZSAsCisgCU9QVF9sb2dsZXZlbCAgICA9IDEgPDwgT1BUQklUX2xvZ2xldmVsLAorIAlPUFRfc21hbGwgICAgICAgPSAxIDw8IE9QVEJJVF9zbWFsbCAgICwKKysJT1BUX3V0YwkJCT0gMSA8PCBPUFRCSVRfdXRjCSAgLAorIAlPUFRfZmlsZXNpemUgICAgPSBJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCgxIDw8IE9QVEJJVF9maWxlc2l6ZSAgICkpICsgMCwKKyAJT1BUX3JvdGF0ZWNudCAgID0gSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgoMSA8PCBPUFRCSVRfcm90YXRlY250ICApKSArIDAsCisgCU9QVF9yZW1vdGVsb2cgICA9IElGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgKDEgPDwgT1BUQklUX3JlbW90ZWxvZyAgKSkgKyAwLAorQEAgLTIyNiw3ICsyMjksNyBAQAorIAlPUFRfZHVwICAgICAgICAgPSBJRl9GRUFUVVJFX1NZU0xPR0RfRFVQKCAgICgxIDw8IE9QVEJJVF9kdXAgICAgICAgICkpICsgMCwKKyAJT1BUX2NmZyAgICAgICAgID0gSUZfRkVBVFVSRV9TWVNMT0dEX0NGRyggICAoMSA8PCBPUFRCSVRfY2ZnICAgICAgICApKSArIDAsCisgfTsKKy0jZGVmaW5lIE9QVElPTl9TVFIgIm06bk86bDpTIiBcCisrI2RlZmluZSBPUFRJT05fU1RSICJtOm5POmw6U3UiIFwKKyAJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgiczoiICkgXAorIAlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCJiOiIgKSBcCisgCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgIlI6IiApIFwKK0BAIC02NDksMTAgKzY1MiwzMCBAQAorIAkgfHwgbXNnWzldICE9ICc6JyB8fCBtc2dbMTJdICE9ICc6JyB8fCBtc2dbMTVdICE9ICcgJworIAkpIHsKKyAJCXRpbWUoJm5vdyk7CistCQl0aW1lc3RhbXAgPSBjdGltZSgmbm93KSArIDQ7IC8qIHNraXAgZGF5IG9mIHdlZWsgKi8KKysJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3V0YykKKysJCQl0aW1lc3RhbXAgPSBhc2N0aW1lKGdtdGltZSgmbm93KSk7CisrCQllbHNlCisrCQkJdGltZXN0YW1wID0gYXNjdGltZShsb2NhbHRpbWUoJm5vdykpOworKwkJdGltZXN0YW1wICs9IDQ7IC8qIHNraXAgZGF5IG9mIHdlZWsgKi8KKyAJfSBlbHNlIHsKKy0JCW5vdyA9IDA7CistCQl0aW1lc3RhbXAgPSBtc2c7CisrCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF91dGMpIHsKKysJCQlzdHJ1Y3QgdG0gcGFyc2VkLCBsb2NhbDsKKysJCQlub3cgPSB0aW1lKE5VTEwpOworKwkJCWxvY2FsdGltZV9yKCZub3csICZsb2NhbCk7CisrCQkJaWYgKHN0cnB0aW1lKG1zZywgIiVoICVlICVUIiwgJnBhcnNlZCkgIT0gTlVMTCkgeworKwkJCQlwYXJzZWQudG1fZ210b2ZmCT0gbG9jYWwudG1fZ210b2ZmOworKwkJCQlwYXJzZWQudG1fem9uZQkJPSBsb2NhbC50bV96b25lOworKwkJCQlwYXJzZWQudG1feWVhcgkJPSBsb2NhbC50bV95ZWFyOworKwkJCQlwYXJzZWQudG1faXNkc3QJCT0gbG9jYWwudG1faXNkc3Q7CisrCQkJCW5vdyA9IG1rdGltZSgmcGFyc2VkKTsKKysJCQkJdGltZXN0YW1wID0gYXNjdGltZShnbXRpbWUoJm5vdykpICsgNDsKKysJCQl9IGVsc2UgeworKwkJCQl0aW1lc3RhbXAgPSBtc2c7CisrCQkJfQorKwkJfSBlbHNlIHsKKysJCQlub3cgPSAwOworKwkJCXRpbWVzdGFtcCA9IG1zZzsKKysJCX0KKyAJCW1zZyArPSAxNjsKKyAJfQorIAl0aW1lc3RhbXBbMTVdID0gJ1wwJzsKZGlmZiAtLWdpdCBhL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTUyLmRlc2NyaXB0aW9uIGIvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTIuZGVzY3JpcHRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2OWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTUyLmRlc2NyaXB0aW9uCkBAIC0wLDAgKzEsMiBAQAorVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgYW5kIGxvZ2dpbmcgdGhlIG1lc3NhZ2UKK3JlcG9ydGVkIHRpbWVzdGFtcCBmb3JtYXQgdG8geXl5eS1tbS1kZCBoaDptbTpzcy51dXV1dXUuCmRpZmYgLS1naXQgYS9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01Mi5wYXRjaCBiL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTUyLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjE3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01Mi5wYXRjaApAQCAtMCwwICsxLDEyMSBAQAorZGlmZiAtYXJ1TiBhL3N5c2tsb2dkL3N5c2xvZ2QuYyBiL3N5c2tsb2dkL3N5c2xvZ2QuYworLS0tIGEvc3lza2xvZ2Qvc3lzbG9nZC5jCTIwMTItMDEtMDQgMTA6MTM6MDcuOTg5ODczMDY1IC0wODAwCisrKysgYi9zeXNrbG9nZC9zeXNsb2dkLmMJMjAxMi0wMS0wNCAxMDowODowNS4wMDAwMDAwMDAgLTA4MDAKK0BAIC0xNjUsMTAgKzE2NSwxMCBAQAorIAkvKiAuLi50aGVuIGNvcHkgdG8gcGFyc2VidWYsIGVzY2FwaW5nIGNvbnRyb2wgY2hhcnMgKi8KKyAJLyogKGNhbiBncm93IHgyIG1heCkgKi8KKyAJY2hhciBwYXJzZWJ1ZltNQVhfUkVBRCoyXTsKKy0JLyogLi4udGhlbiBzcHJpbnRmIGludG8gcHJpbnRidWYsIGFkZGluZyB0aW1lc3RhbXAgKDE1IGNoYXJzKSwKKysJLyogLi4udGhlbiBzcHJpbnRmIGludG8gcHJpbnRidWYsIGFkZGluZyB0aW1lc3RhbXAgKDI2IGNoYXJzKSwKKyAJICogaG9zdCAoNjQpLCBmYWMucHJpbyAoMjApIHRvIHRoZSBtZXNzYWdlICovCistCS8qIChncm93dGggYnk6IDE1ICsgNjQgKyAyMCArIGRlbGltcyA9IH4xMTApICovCistCWNoYXIgcHJpbnRidWZbTUFYX1JFQUQqMiArIDEyOF07CisrCS8qIChncm93dGggYnk6IDI2ICsgNjQgKyAyMCArIGRlbGltcyA9IH4xMjEpICovCisrCWNoYXIgcHJpbnRidWZbTUFYX1JFQUQqMiArIDEzOV07CisgfTsKKyAKKyBzdGF0aWMgY29uc3Qgc3RydWN0IGluaXRfZ2xvYmFscyBpbml0X2RhdGEgPSB7CitAQCAtNjM4LDQ3ICs2MzgsNjIgQEAKKyAJc25wcmludGYocmVzMjAsIDIwLCAiPCVkPiIsIHByaSk7CisgfQorIAorK3N0YXRpYyBzdHJ1Y3QgdG0gKiBnZW5lcmF0ZV90aW1lKHN0cnVjdCB0aW1ldmFsICp0dnAsIHN0cnVjdCB0bSAqdG1wKQorK3sKKysJc3RydWN0IHRtICp0bTsKKysKKysJZ2V0dGltZW9mZGF5KHR2cCwgTlVMTCk7CisrCisrCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3V0YykgeworKwkJdG0gPSBnbXRpbWVfcigmdHZwLT50dl9zZWMsIHRtcCk7CisrCX0gZWxzZSB7CisrCQl0bSA9IGxvY2FsdGltZV9yKCZ0dnAtPnR2X3NlYywgdG1wKTsKKysJfQorKworKwlyZXR1cm4gdG07CisrfQorKworIC8qIGxlbiBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IGZvciAiaXMgdGhlcmUgYSB0aW1lc3RhbXA/IiBjaGVjay4KKyAgKiBOQjogc29tZSBjYWxsZXJzIGNoZWF0IGFuZCBzdXBwbHkgbGVuPT0wIHdoZW4gdGhleSBrbm93CisgICogdGhhdCB0aGVyZSBpcyBubyB0aW1lc3RhbXAsIHNob3J0LWNpcmN1aXRpbmcgdGhlIHRlc3QuICovCisgc3RhdGljIHZvaWQgdGltZXN0YW1wX2FuZF9sb2coaW50IHByaSwgY2hhciAqbXNnLCBpbnQgbGVuKQorIHsKKy0JY2hhciAqdGltZXN0YW1wOworLQl0aW1lX3Qgbm93OworKwljaGFyIHRpbWVzdGFtcFsyN107CisrCXN0cnVjdCB0aW1ldmFsIHR2bm93OworKwlzdHJ1Y3QgdG0gcGFyc2VkLCB0bW5vdywgKnRtcDsKKysJc2l6ZV90IG47CisgCisgCS8qIEphbiAxOCAwMDoxMToyMiBtc2cuLi4gKi8KKyAJLyogMDEyMzQ1Njc4OTAxMjM0NTYgKi8KKyAJaWYgKGxlbiA8IDE2IHx8IG1zZ1szXSAhPSAnICcgfHwgbXNnWzZdICE9ICcgJworIAkgfHwgbXNnWzldICE9ICc6JyB8fCBtc2dbMTJdICE9ICc6JyB8fCBtc2dbMTVdICE9ICcgJworIAkpIHsKKy0JCXRpbWUoJm5vdyk7CistCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF91dGMpCistCQkJdGltZXN0YW1wID0gYXNjdGltZShnbXRpbWUoJm5vdykpOworLQkJZWxzZQorLQkJCXRpbWVzdGFtcCA9IGFzY3RpbWUobG9jYWx0aW1lKCZub3cpKTsKKy0JCXRpbWVzdGFtcCArPSA0OyAvKiBza2lwIGRheSBvZiB3ZWVrICovCisrCQl0bXAgPSBnZW5lcmF0ZV90aW1lKCZ0dm5vdywgJnRtbm93KTsKKyAJfSBlbHNlIHsKKy0JCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3V0YykgeworLQkJCXN0cnVjdCB0bSBwYXJzZWQsIGxvY2FsOworLQkJCW5vdyA9IHRpbWUoTlVMTCk7CistCQkJbG9jYWx0aW1lX3IoJm5vdywgJmxvY2FsKTsKKy0JCQlpZiAoc3RycHRpbWUobXNnLCAiJWggJWUgJVQiLCAmcGFyc2VkKSAhPSBOVUxMKSB7CistCQkJCXBhcnNlZC50bV9nbXRvZmYJPSBsb2NhbC50bV9nbXRvZmY7CistCQkJCXBhcnNlZC50bV96b25lCQk9IGxvY2FsLnRtX3pvbmU7CistCQkJCXBhcnNlZC50bV95ZWFyCQk9IGxvY2FsLnRtX3llYXI7CistCQkJCXBhcnNlZC50bV9pc2RzdAkJPSBsb2NhbC50bV9pc2RzdDsKKy0JCQkJbm93ID0gbWt0aW1lKCZwYXJzZWQpOworLQkJCQl0aW1lc3RhbXAgPSBhc2N0aW1lKGdtdGltZSgmbm93KSkgKyA0OworKwkJc3RydWN0IHRtIGxvY2FsOworKwkJdHZub3cudHZfc2VjID0gdGltZShOVUxMKTsKKysJCWxvY2FsdGltZV9yKCZ0dm5vdy50dl9zZWMsICZsb2NhbCk7CisrCQlpZiAoc3RycHRpbWUobXNnLCAiJWggJWUgJVQiLCAmcGFyc2VkKSAhPSBOVUxMKSB7CisrCisrCQkJcGFyc2VkLnRtX2dtdG9mZgk9IGxvY2FsLnRtX2dtdG9mZjsKKysJCQlwYXJzZWQudG1fem9uZQkJPSBsb2NhbC50bV96b25lOworKwkJCXBhcnNlZC50bV95ZWFyCQk9IGxvY2FsLnRtX3llYXI7CisrCQkJcGFyc2VkLnRtX2lzZHN0CQk9IGxvY2FsLnRtX2lzZHN0OworKwkJCXR2bm93LnR2X3NlYyA9IG1rdGltZSgmcGFyc2VkKTsKKysJCQl0dm5vdy50dl91c2VjID0gMDsKKysKKysJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF91dGMpIHsKKysJCQkJdG1wID0gZ210aW1lX3IoJnR2bm93LnR2X3NlYywgJnRtbm93KTsKKyAJCQl9IGVsc2UgeworLQkJCQl0aW1lc3RhbXAgPSBtc2c7CisrCQkJCXRtcCA9ICZwYXJzZWQ7CisgCQkJfQorIAkJfSBlbHNlIHsKKy0JCQlub3cgPSAwOworLQkJCXRpbWVzdGFtcCA9IG1zZzsKKysJCQl0bXAgID0gZ2VuZXJhdGVfdGltZSgmdHZub3csICZ0bW5vdyk7CisgCQl9CisgCQltc2cgKz0gMTY7CisgCX0KKy0JdGltZXN0YW1wWzE1XSA9ICdcMCc7CisrCW4gPSBzdHJmdGltZSh0aW1lc3RhbXAsIHNpemVvZih0aW1lc3RhbXApLCAiJUYgJVQiLCB0bXApOworKwlzbnByaW50Zih0aW1lc3RhbXAgKyBuLCBzaXplb2YodGltZXN0YW1wKSAtIG4sICIuJTA2bGQiLCB0dm5vdy50dl91c2VjKTsKKyAKKyAJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfc21hbGwpCisgCQlzcHJpbnRmKEcucHJpbnRidWYsICIlcyAlc1xuIiwgdGltZXN0YW1wLCBtc2cpOworQEAgLTY5OCw3ICs3MTMsNyBAQAorIAorIAkJZm9yIChydWxlID0gRy5sb2dfcnVsZXM7IHJ1bGU7IHJ1bGUgPSBydWxlLT5uZXh0KSB7CisgCQkJaWYgKHJ1bGUtPmVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtmYWNpbGl0eV0gJiBwcmlvX2JpdCkgeworLQkJCQlsb2dfbG9jYWxseShub3csIEcucHJpbnRidWYsIHJ1bGUtPmZpbGUpOworKwkJCQlsb2dfbG9jYWxseSh0dm5vdy50dl9zZWMsIEcucHJpbnRidWYsIHJ1bGUtPmZpbGUpOworIAkJCQltYXRjaCA9IDE7CisgCQkJfQorIAkJfQorQEAgLTcxMyw3ICs3MjgsNyBAQAorIAkJCXJldHVybjsKKyAJCX0KKyAjZW5kaWYKKy0JCWxvZ19sb2NhbGx5KG5vdywgRy5wcmludGJ1ZiwgJkcubG9nRmlsZSk7CisrCQlsb2dfbG9jYWxseSh0dm5vdy50dl9zZWMsIEcucHJpbnRidWYsICZHLmxvZ0ZpbGUpOworIAl9CisgfQorIApkaWZmIC0tZ2l0IGEvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTMuZGVzY3JpcHRpb24gYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01My5kZXNjcmlwdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTEyNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTMuZGVzY3JpcHRpb24KQEAgLTAsMCArMSBAQAorVGhpcyBwYXRjaCByZXR1cm5zIGJ1c3lib3ggdG8gMS4xNy1lcmEgYmVoYXZpb3IgaW4gd2hpY2ggZGVmYXVsdCBjb25maWd1cmF0aW9ucyBjb3VsZCBiZSBzcGVjaWZpZWQgYW55d2hlcmUsIG5vdCBzaW1wbHkgcmVsYXRpdmUgdG8gdGhlIGluLXBhY2thZ2UgY29uZmlncyBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01My5wYXRjaCBiL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTUzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTUxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01My5wYXRjaApAQCAtMCwwICsxLDEyIEBACitkaWZmIC1hcnVOIGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCistLS0gYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUJMjAxMS0wOS0wNSAxOTozNToxNy4wMDAwMDAwMDAgLTA3MDAKKysrKyBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQkyMDEyLTAxLTA0IDEwOjI4OjMwLjAwMDAwMDAwMCAtMDgwMAorQEAgLTg3LDcgKzg3LDcgQEAKKyAJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKyAKKyAlX2RlZmNvbmZpZzogJChvYmopL2NvbmYKKy0JJChRKSQ8IC1EIGNvbmZpZ3MvJEAgQ29uZmlnLmluCisrCSQoUSkkPCAtRCAkQCBDb25maWcuaW4KKyAJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKyAKKyAjIEhlbHAgdGV4dCB1c2VkIGJ5IG1ha2UgaGVscApkaWZmIC0tZ2l0IGEvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTQuZGVzY3JpcHRpb24gYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01NC5kZXNjcmlwdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc2MjhmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTQuZGVzY3JpcHRpb24KQEAgLTAsMCArMSBAQAorVGhpcyBwYXRjaCBmaXhlcyBhIG1lbW9yeSBsZWFrIGluIHRoZSByZGV2IGFwcGxldApkaWZmIC0tZ2l0IGEvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTQucGF0Y2ggYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01NC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjgwYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTQucGF0Y2gKQEAgLTAsMCArMSwxNiBAQAorZGlmZiAtTmF1ciBhL3V0aWwtbGludXgvcmRldi5jIGIvdXRpbC1saW51eC9yZGV2LmMKKy0tLSBhL3V0aWwtbGludXgvcmRldi5jCTIwMTEtMDktMDUgMTk6MzU6MTcuMDAwMDAwMDAwIC0wNzAwCisrKysgYi91dGlsLWxpbnV4L3JkZXYuYwkyMDE0LTEwLTI0IDExOjQxOjU1LjkyMjgwMzU1NCAtMDcwMAorQEAgLTIzLDEwICsyMywxMSBAQAorIGludCByZGV2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKyBpbnQgcmRldl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQorIHsKKy0JY2hhciBjb25zdCAqIGNvbnN0IHJvb3RfZGV2aWNlID0gZmluZF9ibG9ja19kZXZpY2UoIi8iKTsKKysJY2hhciAqIGNvbnN0IHJvb3RfZGV2aWNlID0gZmluZF9ibG9ja19kZXZpY2UoIi8iKTsKKyAKKyAJaWYgKHJvb3RfZGV2aWNlICE9IE5VTEwpIHsKKyAJCXByaW50ZigiJXMgL1xuIiwgcm9vdF9kZXZpY2UpOworKwkJZnJlZShyb290X2RldmljZSk7CisgCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworIAl9CisgCXJldHVybiBFWElUX0ZBSUxVUkU7CmRpZmYgLS1naXQgYS9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01NS5kZXNjcmlwdGlvbiBiL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTU1LmRlc2NyaXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NThlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LnBhdGNoZXMvYnVzeWJveC01NS5kZXNjcmlwdGlvbgpAQCAtMCwwICsxIEBACitUaGlzIHBhdGNoIGZpeGVzIHRoZSByZGV2IGFwcGxldCBmb3IgY2FzZXMgd2hlcmUgdGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1vdW50ZWQgZmlsZXN5c3RlbSBpc24ndCBhIC9kZXYgZGV2aWNlIG5vZGUgKGkuZTogVUJJRlMsIHRtcGZzLCBuZXR3b3JrIGRyaXZlIG1vdW50cykKZGlmZiAtLWdpdCBhL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTU1LnBhdGNoIGIvYnVzeWJveC5wYXRjaGVzL2J1c3lib3gtNTUucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwNjdmNgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gucGF0Y2hlcy9idXN5Ym94LTU1LnBhdGNoCkBAIC0wLDAgKzEsNzkgQEAKK2RpZmYgLU5hdXIgYS9saWJiYi9maW5kX3Jvb3RfZGV2aWNlLmMgYi9saWJiYi9maW5kX3Jvb3RfZGV2aWNlLmMKKy0tLSBhL2xpYmJiL2ZpbmRfcm9vdF9kZXZpY2UuYwkyMDE0LTEwLTI3IDEzOjAxOjE4Ljk4NDQ4NzQyMSAtMDcwMAorKysrIGIvbGliYmIvZmluZF9yb290X2RldmljZS5jCTIwMTQtMTAtMjcgMTM6MzY6MDcuNDY5MzU5NzEzIC0wNzAwCitAQCAtOSw2ICs5LDE1IEBACisgCisgI2luY2x1ZGUgImxpYmJiLmgiCisgCisrLyogI2RlZmluZSBERUJVR0dJTkcgMSAqLworKworKyNpZmRlZiBERUJVR0dJTkcKKysjZGVmaW5lIGRlYnVnKC4uLikgZG8geyBwcmludGYoX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorKyNlbHNlCisrI2RlZmluZSBkZWJ1ZyguLi4pICgodm9pZCkwKQorKyNlbmRpZgorKworKworIC8qIEZpbmQgYmxvY2sgZGV2aWNlIC9kZXYvWFhYIHdoaWNoIGNvbnRhaW5zIHNwZWNpZmllZCBmaWxlCisgICogV2UgaGFuZGxlIC9kZXYvZGlyL2Rpci9kaXIgdG9vLCBhdCBhIGNvc3Qgb2YgfjgwIG1vcmUgYnl0ZXMgY29kZSAqLworIAorQEAgLTYzLDYgKzcyLDQ2IEBACisgCXJldHVybiByZXRwYXRoOworIH0KKyAKKysjZGVmaW5lIFBST0NfTU9VTlRJTkZPICAiL3Byb2Mvc2VsZi9tb3VudGluZm8iCisrLyogQSBtYWpvciBvZiB6ZXJvIGluZGljYXRlcyBhIG5vbi1kZXZpY2UgbW91bnQuIFVzZSB0aGUga2VybmVsJ3Mgc2hvd19tb3VudGluZm8oKSwKKysgKiBleHBvc2VkIHRocm91Z2ggL3Byb2Mvc2VsZi9tb3VudGluZm8gdG8gbG9va3VwIHRoZSBkZXZpY2UgcmVmZXJlbmNlLiAqLworK3N0YXRpYyBjaGFyICpmaW5kX2RldmljZV9pbl9tb3VudGluZm8oc3RydWN0IGFyZW5hICphcCkKKyt7CisrCWNoYXIgbGluZVsxMDI0XTsKKysJY2hhciAqbGluZVB0cjsKKysJY2hhciAqcmV0cGF0aCA9IE5VTEw7CisrCisrCUZJTEUgKmZwID0gZm9wZW5fZm9yX3JlYWQoUFJPQ19NT1VOVElORk8pOworKwlpZiAoIWZwKQorKwkJcmV0dXJuIE5VTEw7CisrCisrCWRlYnVnKCJMb29raW5nIGZvciBkZXZpY2UgJXU6JXVcbiIsIG1ham9yKGFwLT5kZXYpLCBtaW5vcihhcC0+ZGV2KSk7CisrCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgeworKwkJCWludCBtbnRfaWQsIHBhcmVudF9tbnRfaWQ7CisrCQkJdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKKysJCQljaGFyIG1udF90eXBlbmFtZVsxMDI0XSwgbW50X2Rldm5hbWVbMTAyNF07CisrCisrCQkJbGluZVB0ciA9IGxpbmU7CisrCQkJaWYgKHNzY2FuZihsaW5lUHRyLCAiJWkgJWkgJXU6JXUiLCAmbW50X2lkLCAmcGFyZW50X21udF9pZCwgJm1ham9yLCAmbWlub3IpICE9IDQpIHsKKysJCQkJZGVidWcoIkNvdWxkbid0IHBhcnNlIGxpbmU6ICclcydcbiIsIGxpbmUpOworKwkJCX0gZWxzZSBpZiAoKGxpbmVQdHIgPSBzdHJzdHIobGluZVB0ciwgIiAtICIpKSA9PSBOVUxMKSB7CisrCQkJCWRlYnVnKCJDb3VsZG4ndCBmaW5kICcgLSAnOiAnJXMnXG4iLCBsaW5lKTsKKysJCQl9IGVsc2UgaWYgKHNzY2FuZihsaW5lUHRyLCAiIC0gJXMgJXMgIiwgbW50X3R5cGVuYW1lLCBtbnRfZGV2bmFtZSkgIT0gMikgeworKwkJCQlkZWJ1ZygiQ291bGRuJ3QgcGFyc2UgbGluZTogJyVzJ1xuIiwgbGluZSk7CisrCQkJfSBlbHNlIGlmICgobWFqb3IoYXAtPmRldikgIT0gbWFqb3IpIHx8IChtaW5vcihhcC0+ZGV2KSAhPSBtaW5vcikpIHsKKysJCQkJZGVidWcoIk5vbi1tYXRjaGluZyBkZXZpY2UgJXU6JXUgLS0+ICVzXG4iLCBtYWpvciwgbWlub3IsIG1udF9kZXZuYW1lKTsKKysJCQl9IGVsc2UgeworKwkJCQlkZWJ1ZygiRm91bmQgYSBtYXRjaCAldToldSAtLT4gJXNcbiIsIG1ham9yLCBtaW5vciwgbW50X2Rldm5hbWUpOworKwkJCQlyZXRwYXRoID0geHN0cmR1cChtbnRfZGV2bmFtZSk7CisrCQkJCWJyZWFrOworKwkJCX0KKysJfQorKworKwlmY2xvc2UoZnApOworKworKwlyZXR1cm4gcmV0cGF0aDsKKyt9CisrCisgY2hhciogRkFTVF9GVU5DIGZpbmRfYmxvY2tfZGV2aWNlKGNvbnN0IGNoYXIgKnBhdGgpCisgeworIAlzdHJ1Y3QgYXJlbmEgYTsKK0BAIC03MCw2ICsxMTksMTAgQEAKKyAJaWYgKHN0YXQocGF0aCwgJmEuc3QpICE9IDApCisgCQlyZXR1cm4gTlVMTDsKKyAJYS5kZXYgPSBTX0lTQkxLKGEuc3Quc3RfbW9kZSkgPyBhLnN0LnN0X3JkZXYgOiBhLnN0LnN0X2RldjsKKy0Jc3RyY3B5KGEuZGV2cGF0aCwgIi9kZXYiKTsKKy0JcmV0dXJuIGZpbmRfYmxvY2tfZGV2aWNlX2luX2RpcigmYSk7CisrCWlmIChtYWpvcihhLmRldikgIT0gMCkgeworKwkJc3RyY3B5KGEuZGV2cGF0aCwgIi9kZXYiKTsKKysJCXJldHVybiBmaW5kX2Jsb2NrX2RldmljZV9pbl9kaXIoJmEpOworKwl9IGVsc2UgeworKwkJcmV0dXJuIGZpbmRfZGV2aWNlX2luX21vdW50aW5mbygmYSk7CisrCX0KKyB9CmRpZmYgLS1naXQgYS9idXN5Ym94LnRhci5iejIgYi9idXN5Ym94LnRhci5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhMWE5MgotLS0gL2Rldi9udWxsCisrKyBiL2J1c3lib3gudGFyLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idXN5Ym94LnVybCBiL2J1c3lib3gudXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NGU5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9idXN5Ym94LnVybApAQCAtMCwwICsxIEBACitodHRwOi8vYnVzeWJveC5uZXQvZG93bmxvYWRzL2J1c3lib3gtMS4xOS4zLnRhci5iejIKZGlmZiAtLWdpdCBhL2J1c3lib3gudmVyc2lvbiBiL2J1c3lib3gudmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjkyZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzeWJveC52ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKzEuMTkuMwpkaWZmIC0tZ2l0IGEvY29uZmlncy9jb21wbGlhbmNlX2RlZmNvbmZpZyBiL2NvbmZpZ3MvY29tcGxpYW5jZV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmYTgxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3MvY29tcGxpYW5jZV9kZWZjb25maWcKQEAgLTAsMCArMSwxMDA5IEBACisjCisjIEJ1c3lCb3ggQ29uZmlndXJhdGlvbiBmb3IgYSBDb21wbGlhbmNlIEJ1aWxkIENvbmZpZ3VyYXRpb24uCisjIE1hdGNoZXMgdGhlIERldmVsb3BtZW50IENvbmZpZ3VyYXRpb24uCisjIEJ1c3lib3ggdmVyc2lvbjogMS4xOS4zCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ERVNLVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVFJBX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkNMVURFX1NVU3YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19QTEFURk9STV9MSU5VWD15CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CisjIENPTkZJR19GRUFUVVJFX0lOU1RBTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX05PX1VTUiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NBTEVfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JQ09ERV9TVVBQT1JUPXkKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTYzCitDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVI9NzY3CisjIENPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX0JJRElfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX05FVVRSQUxfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4gaXMgbm90IHNldAorQ09ORklHX0xPTkdfT1BUUz15CitDT05GSUdfRkVBVFVSRV9ERVZQVFM9eQorIyBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9VVE1QPXkKK0NPTkZJR19GRUFUVVJFX1dUTVA9eQorQ09ORklHX0ZFQVRVUkVfUElERklMRT15CitDT05GSUdfRkVBVFVSRV9TVUlEPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9IQVZFX1JQQz15CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKK0NPTkZJR19MRlM9eQorQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD0iIgorQ09ORklHX0VYVFJBX0NGTEFHUz0iIgorCisjCisjIERlYnVnZ2luZyBPcHRpb25zCisjCisjIENPTkZJR19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldAorIyBDT05GSUdfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19OT19ERUJVR19MSUI9eQorIyBDT05GSUdfRE1BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19FRkVOQ0UgaXMgbm90IHNldAorCisjCisjIEluc3RhbGxhdGlvbiBPcHRpb25zICgibWFrZSBpbnN0YWxsIiBiZWhhdmlvcikKKyMKK0NPTkZJR19JTlNUQUxMX0FQUExFVF9TWU1MSU5LUz15CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9IQVJETElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfU0NSSVBUX1dSQVBQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0RPTlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU1lNTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9IQVJETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TQ1JJUFRfV1JBUFBFUiBpcyBub3Qgc2V0CitDT05GSUdfUFJFRklYPSIuL19pbnN0YWxsIgorCisjCisjIEJ1c3lib3ggTGlicmFyeSBUdW5pbmcKKyMKKyMgQ09ORklHX0ZFQVRVUkVfU1lTVEVNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JUTUlOTUFYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVNTV09SRF9NSU5MRU49NgorQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEPTIKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKK0NPTkZJR19GRUFUVVJFX0VUQ19ORVRXT1JLUz15CitDT05GSUdfRkVBVFVSRV9VU0VfVEVSTUlPUz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTj0xMDI0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfVkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTE2CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SRVZFUlNFX1NFQVJDSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQUJfQ09NUExFVElPTj15CisjIENPTkZJR19GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorIyBDT05GSUdfRkVBVFVSRV9TS0lQX1JPT1RGUyBpcyBub3Qgc2V0CitDT05GSUdfTU9OT1RPTklDX1NZU0NBTEw9eQorQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1I9eQorIyBDT05GSUdfRkVBVFVSRV9IV0lCIGlzIG5vdCBzZXQKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19YWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKKyMgQ09ORklHX0FSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEUgaXMgbm90IHNldAorQ09ORklHX0JVTlpJUDI9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0cgaXMgbm90IHNldAorIyBDT05GSUdfRFBLR19ERUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CisjIENPTkZJR19GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xaT1AgaXMgbm90IHNldAorIyBDT05GSUdfTFpPUF9DT01QUl9ISUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQTTJDUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQTSBpcyBub3Qgc2V0CitDT05GSUdfVEFSPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQVJfRlJPTT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1NFTElOVVggaXMgbm90IHNldAorQ09ORklHX1VOQ09NUFJFU1M9eQorQ09ORklHX1VOTFpNQT15CitDT05GSUdfRkVBVFVSRV9MWk1BX0ZBU1Q9eQorQ09ORklHX0xaTUE9eQorQ09ORklHX1VOWFo9eQorQ09ORklHX1haPXkKK0NPTkZJR19VTlpJUD15CisKKyMKKyMgQ29yZXV0aWxzCisjCitDT05GSUdfQkFTRU5BTUU9eQorQ09ORklHX0NBVD15CitDT05GSUdfREFURT15CitDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVD15CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19JRD15CisjIENPTkZJR19HUk9VUFMgaXMgbm90IHNldAorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorIyBDT05GSUdfQkFTRTY0IGlzIG5vdCBzZXQKK0NPTkZJR19XSE89eQorIyBDT05GSUdfVVNFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBVFYgaXMgbm90IHNldAorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorIyBDT05GSUdfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NIUk9PVD15CitDT05GSUdfQ0tTVU09eQorIyBDT05GSUdfQ09NTSBpcyBub3Qgc2V0CitDT05GSUdfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NVVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorQ09ORklHX0RGPXkKK0NPTkZJR19GRUFUVVJFX0RGX0ZBTkNZPXkKK0NPTkZJR19ESVJOQU1FPXkKKyMgQ09ORklHX0RPUzJVTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVgyRE9TIGlzIG5vdCBzZXQKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorIyBDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYUEFORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0VYUFI9eQorQ09ORklHX0VYUFJfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GQUxTRT15CisjIENPTkZJR19GT0xEIGlzIG5vdCBzZXQKK0NPTkZJR19GU1lOQz15CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKK0NPTkZJR19IT1NUSUQ9eQorQ09ORklHX0lOU1RBTEw9eQorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTE49eQorIyBDT05GSUdfTE9HTkFNRSBpcyBub3Qgc2V0CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfTUQ1U1VNPXkKK0NPTkZJR19NS0RJUj15CisjIENPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTUtGSUZPPXkKK0NPTkZJR19NS05PRD15CitDT05GSUdfTVY9eQorIyBDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTklDRSBpcyBub3Qgc2V0CitDT05GSUdfTk9IVVA9eQorIyBDT05GSUdfT0QgaXMgbm90IHNldAorIyBDT05GSUdfUFJJTlRFTlYgaXMgbm90IHNldAorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorIyBDT05GSUdfUkVBTFBBVEggaXMgbm90IHNldAorQ09ORklHX1JNPXkKK0NPTkZJR19STURJUj15CisjIENPTkZJR19GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfU0VRPXkKK0NPTkZJR19TSEExU1VNPXkKK0NPTkZJR19TSEEyNTZTVU09eQorIyBDT05GSUdfU0hBNTEyU1VNIGlzIG5vdCBzZXQKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CisjIENPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQIGlzIG5vdCBzZXQKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CitDT05GSUdfU1RBVD15CitDT05GSUdfRkVBVFVSRV9TVEFUX0ZPUk1BVD15CitDT05GSUdfU1RUWT15CitDT05GSUdfU1VNPXkKK0NPTkZJR19TWU5DPXkKKyMgQ09ORklHX1RBQyBpcyBub3Qgc2V0CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVFJVRT15CitDT05GSUdfVFRZPXkKK0NPTkZJR19VTkFNRT15CisjIENPTkZJR19VTkVYUEFORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfVU5JUT15CitDT05GSUdfVVNMRUVQPXkKKyMgQ09ORklHX1VVREVDT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VVRU5DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19XQz15CitDT05GSUdfRkVBVFVSRV9XQ19MQVJHRT15CitDT05GSUdfV0hPQU1JPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworIyBDT05GSUdfQ0hWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GR0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0NMRUFSPXkKKyMgQ09ORklHX0RFQUxMT0NWVCBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QS01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19LQkRfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FERk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FES01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19PUEVOVlQgaXMgbm90IHNldAorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKK0NPTkZJR19TRVRDT05TT0xFPXkKK0NPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VUS0VZQ09ERVMgaXMgbm90IHNldAorQ09ORklHX1NFVExPR0NPTlM9eQorIyBDT05GSUdfU0hPV0tFWT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxvYWRmb250IGFuZCBzZXRmb250CisjCisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1BTRjIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9SQVcgaXMgbm90IHNldAorCisjCisjIERlYmlhbiBVdGlsaXRpZXMKKyMKK0NPTkZJR19NS1RFTVA9eQorIyBDT05GSUdfUElQRV9QUk9HUkVTUyBpcyBub3Qgc2V0CitDT05GSUdfUlVOX1BBUlRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFSVF9TVE9QX0RBRU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19XSElDSD15CisKKyMKKyMgRWRpdG9ycworIworQ09ORklHX1BBVENIPXkKK0NPTkZJR19WST15CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTQwOTYKKyMgQ09ORklHX0ZFQVRVUkVfVklfOEJJVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1I9eQorQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0RFTEVURSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWD15CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfQ09OVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1MgaXMgbm90IHNldAorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworIyBDT05GSUdfQk9PVENIQVJURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQkxPQVRFRF9IRUFERVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0NPTkZJR19GSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19IQUxUPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0FMTF9URUxJTklUIGlzIG5vdCBzZXQKK0NPTkZJR19URUxJTklUX1BBVEg9IiIKK0NPTkZJR19JTklUPXkKK0NPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCPXkKK0NPTkZJR19GRUFUVVJFX0tJTExfUkVNT1ZFRD15CitDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZPTAKK0NPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFk9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfRVhUUkFfUVVJRVQ9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFM9eQorQ09ORklHX0ZFQVRVUkVfSU5JVFJEPXkKK0NPTkZJR19JTklUX1RFUk1JTkFMX1RZUEU9ImxpbnV4IgorIyBDT05GSUdfTUVTRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01FU0dfRU5BQkxFX09OTFlfR1JPVVAgaXMgbm90IHNldAorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCisjIENPTkZJR19BRERfU0hFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUkVNT1ZFX1NIRUxMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFM9eQorIyBDT05GSUdfVVNFX0JCX1BXRF9HUlAgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1NIQURPVyBpcyBub3Qgc2V0CitDT05GSUdfVVNFX0JCX0NSWVBUPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFRfU0hBPXkKKyMgQ09ORklHX0FERFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJUlNUX1NZU1RFTV9JRCBpcyBub3Qgc2V0CisjIENPTkZJR19MQVNUX1NZU1RFTV9JRCBpcyBub3Qgc2V0CisjIENPTkZJR19BRERHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVMVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUxHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAgaXMgbm90IHNldAorQ09ORklHX0dFVFRZPXkKK0NPTkZJR19MT0dJTj15CisjIENPTkZJR19QQU0gaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU5fU0NSSVBUUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9OT0xPR0lOPXkKK0NPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWT15CitDT05GSUdfUEFTU1dEPXkKK0NPTkZJR19GRUFUVVJFX1BBU1NXRF9XRUFLX0NIRUNLPXkKKyMgQ09ORklHX0NSWVBUUFcgaXMgbm90IHNldAorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CisjIENPTkZJR19WTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworIyBDT05GSUdfQ0hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTFNBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkUyRlMgaXMgbm90IHNldAorCisjCisjIExpbnV4IE1vZHVsZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19NT0RJTkZPPXkKKyMgQ09ORklHX01PRFBST0JFX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQgaXMgbm90IHNldAorQ09ORklHX0lOU01PRD15CitDT05GSUdfUk1NT0Q9eQorQ09ORklHX0xTTU9EPXkKK0NPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUPXkKK0NPTkZJR19NT0RQUk9CRT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1Q9eQorQ09ORklHX0RFUE1PRD15CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFM9eQorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9saWIvbW9kdWxlcyIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSJtb2R1bGVzLmRlcCIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19CTE9DS0RFViBpcyBub3Qgc2V0CitDT05GSUdfUkVWPXkKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtJRD15CisjIENPTkZJR19GRUFUVVJFX0JMS0lEX1RZUEUgaXMgbm90IHNldAorQ09ORklHX0RNRVNHPXkKK0NPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWT15CitDT05GSUdfRkJTRVQ9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREU9eQorIyBDT05GSUdfRkRGTFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GREZPUk1BVCBpcyBub3Qgc2V0CitDT05GSUdfRkRJU0s9eQorIyBDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRT15CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dQVF9MQUJFTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRD15CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorIyBDT05GSUdfRkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVJBTURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfRlNDS19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX0VYVDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01JTklYMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CitDT05GSUdfTUtGU19WRkFUPXkKKyMgQ09ORklHX0dFVE9QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HIGlzIG5vdCBzZXQKK0NPTkZJR19IRVhEVU1QPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19IV0NMT0NLPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFM9eQorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTUENJIGlzIG5vdCBzZXQKK0NPTkZJR19MU1VTQj15CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUtTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQgaXMgbm90IHNldAorQ09ORklHX01PUkU9eQorQ09ORklHX01PVU5UPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0NJRlM9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUI9eQorQ09ORklHX1BJVk9UX1JPT1Q9eQorIyBDT05GSUdfUkRBVEUgaXMgbm90IHNldAorQ09ORklHX1JERVY9eQorQ09ORklHX1JFQURQUk9GSUxFPXkKK0NPTkZJR19SVENXQUtFPXkKK0NPTkZJR19TQ1JJUFQ9eQorQ09ORklHX1NDUklQVFJFUExBWT15CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorQ09ORklHX1VNT1VOVD15CitDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbW91bnQvdW1vdW50CisjCitDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisKKyMKKyMgRmlsZXN5c3RlbS9Wb2x1bWUgaWRlbnRpZmljYXRpb24KKyMKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NPTlNQWSBpcyBub3Qgc2V0CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkREVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSU1LVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJNVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJTVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVVQREFURVZPTCBpcyBub3Qgc2V0CitDT05GSUdfQURKVElNRVg9eQorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVMgaXMgbm90IHNldAorIyBDT05GSUdfQ0hBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQgaXMgbm90IHNldAorQ09ORklHX0NIUlQ9eQorQ09ORklHX0NST05EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0Q9eQorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorIyBDT05GSUdfREMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQ19MSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CitDT05GSUdfREVWTUVNPXkKKyMgQ09ORklHX0VKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRUpFQ1RfU0NTSSBpcyBub3Qgc2V0CitDT05GSUdfRkJTUExBU0g9eQorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEUEFSTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorIyBDT05GSUdfTUFOIGlzIG5vdCBzZXQKK0NPTkZJR19NSUNST0NPTT15CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBSURBVVRPUlVOIGlzIG5vdCBzZXQKK0NPTkZJR19SRUFEQUhFQUQ9eQorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JYIGlzIG5vdCBzZXQKK0NPTkZJR19TRVRTSUQ9eQorIyBDT05GSUdfU1RSSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfVElNRT15CisjIENPTkZJR19USU1FT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19UVFlTSVpFPXkKKyMgQ09ORklHX1ZPTE5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19OQkRDTElFTlQgaXMgbm90IHNldAorQ09ORklHX05DPXkKK0NPTkZJR19OQ19TRVJWRVI9eQorQ09ORklHX05DX0VYVFJBPXkKKyMgQ09ORklHX05DXzExMF9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX1BJTkc9eQorQ09ORklHX1BJTkc2PXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkc9eQorIyBDT05GSUdfV0hPSVMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSVBWNj15CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUz15CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorQ09ORklHX0FSUElORz15CisjIENPTkZJR19CUkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ETlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkFLRUlERU5URCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfRlRQR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0hPU1ROQU1FPXkKKyMgQ09ORklHX0hUVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUCBpcyBub3Qgc2V0CitDT05GSUdfSUZDT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19IVyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUz15CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBBRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUENBTEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRTVEFUPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERT15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRz15CitDT05GSUdfTlNMT09LVVA9eQorIyBDT05GSUdfTlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSIGlzIG5vdCBzZXQKK0NPTkZJR19QU0NBTj15CitDT05GSUdfUk9VVEU9eQorQ09ORklHX1NMQVRUQUNIPXkKKyMgQ09ORklHX1RDUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfVFRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTE5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUCBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0JMT0NLU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUk9VVEU9eQorIyBDT05GSUdfVFJBQ0VST1VURTYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFPXkKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RVTkNUTF9VRyBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVCBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VEUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dHRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfVElNRU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19aQ0lQIGlzIG5vdCBzZXQKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0xQRCBpcyBub3Qgc2V0CisjIENPTkZJR19MUFIgaXMgbm90IHNldAorIyBDT05GSUdfTFBRIGlzIG5vdCBzZXQKKworIworIyBNYWlsIFV0aWxpdGllcworIworIyBDT05GSUdfTUFLRU1JTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQgaXMgbm90IHNldAorIyBDT05GSUdfUE9QTUFJTERJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkgaXMgbm90IHNldAorIyBDT05GSUdfUkVGT1JNSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5ETUFJTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0lPU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NUFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfTk1FVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNQVAgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUFNUUkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BXRFggaXMgbm90IHNldAorIyBDT05GSUdfU01FTUNBUCBpcyBub3Qgc2V0CitDT05GSUdfVVBUSU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVBUSU1FX1VUTVBfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRlJFRT15CitDT05GSUdfRlVTRVI9eQorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKKyMgQ09ORklHX1BHUkVQIGlzIG5vdCBzZXQKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorIyBDT05GSUdfUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorIyBDT05GSUdfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIT1dfVEhSRUFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19SVU5TViBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5TVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TViBpcyBub3Qgc2V0CisjIENPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NWTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WVUlER0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0ZUTElNSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ0hDT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfR0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfTE9BRF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUFUQ0hQQVRIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU1RPUkVDT04gaXMgbm90IHNldAorIyBDT05GSUdfUlVOQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVNUQVRVUyBpcyBub3Qgc2V0CisKKyMKKyMgU2hlbGxzCisjCitDT05GSUdfQVNIPXkKK0NPTkZJR19BU0hfQkFTSF9DT01QQVQ9eQorIyBDT05GSUdfQVNIX0lETEVfVElNRU9VVCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX0pPQl9DT05UUk9MPXkKK0NPTkZJR19BU0hfQUxJQVM9eQorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorQ09ORklHX0FTSF9CVUlMVElOX0VDSE89eQorQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URj15CitDT05GSUdfQVNIX0JVSUxUSU5fVEVTVD15CitDT05GSUdfQVNIX0NNRENNRD15CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQ9eQorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NUVFlIQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JSQUNFX0VYUEFOU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0hFTFAgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JTlRFUkFDVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSk9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9PUFMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9DQVNFIGlzIG5vdCBzZXQKK0NPTkZJR19IVVNIX0ZVTkNUSU9OUz15CisjIENPTkZJR19IVVNIX0xPQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9FWFBPUlRfTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX01PREVfWCBpcyBub3Qgc2V0CisjIENPTkZJR19NU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hfSVNfQVNIPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfSFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CQVNIX0lTX05PTkU9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVD15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GRUFUVVJFX1NIX0VYVFJBX1FVSUVUPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX05PRk9SSyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9ISVNURklMRVNJWkU9eQorCisjCisjIFN5c3RlbSBMb2dnaW5nIFV0aWxpdGllcworIworQ09ORklHX1NZU0xPR0Q9eQorQ09ORklHX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEU9eQorQ09ORklHX0ZFQVRVUkVfUkVNT1RFX0xPRz15CitDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0RVUD15CisjIENPTkZJR19GRUFUVVJFX1NZU0xPR0RfQ0ZHIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRT0yNTYKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRT0xNgorQ09ORklHX0xPR1JFQUQ9eQorQ09ORklHX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkc9eQorQ09ORklHX0tMT0dEPXkKK0NPTkZJR19GRUFUVVJFX0tMT0dEX0tMT0dDVEw9eQorQ09ORklHX0xPR0dFUj15CmRpZmYgLS1naXQgYS9jb25maWdzL2RlYnVnX2RlZmNvbmZpZyBiL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzJmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2RlYnVnX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEwMDggQEAKKyMKKyMgQnVzeUJveCBDb25maWd1cmF0aW9uIGZvciBhIERlYnVnIEJ1aWxkIENvbmZpZ3VyYXRpb24KKyMgQnVzeWJveCB2ZXJzaW9uOiAxLjE5LjMKKyMKK0NPTkZJR19IQVZFX0RPVF9DT05GSUc9eQorCisjCisjIEJ1c3lib3ggU2V0dGluZ3MKKyMKKworIworIyBHZW5lcmFsIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0RFU0tUT1AgaXMgbm90IHNldAorIyBDT05GSUdfRVhUUkFfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOQ0xVREVfU1VTdjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX1BPUlRBQkxFX0NPREUgaXMgbm90IHNldAorQ09ORklHX1BMQVRGT1JNX0xJTlVYPXkKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CitDT05GSUdfU0hPV19VU0FHRT15CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0U9eQorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1VOSUNPREVfU1VQUE9SVD15CisjIENPTkZJR19VTklDT0RFX1VTSU5HX0xPQ0FMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WIGlzIG5vdCBzZXQKK0NPTkZJR19TVUJTVF9XQ0hBUj02MworQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSPTc2NworIyBDT05GSUdfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfV0lERV9XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9CSURJX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9ORVVUUkFMX1RBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOIGlzIG5vdCBzZXQKK0NPTkZJR19MT05HX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfREVWUFRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVVRNUD15CitDT05GSUdfRkVBVFVSRV9XVE1QPXkKK0NPTkZJR19GRUFUVVJFX1BJREZJTEU9eQorQ09ORklHX0ZFQVRVUkVfU1VJRD15CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9BUFBMRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CVVNZQk9YX0VYRUNfUEFUSD0iL3Byb2Mvc2VsZi9leGUiCitDT05GSUdfRkVBVFVSRV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSEFWRV9SUEM9eQorCisjCisjIEJ1aWxkIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSUUgaXMgbm90IHNldAorIyBDT05GSUdfTk9NTVUgaXMgbm90IHNldAorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucyAoIm1ha2UgaW5zdGFsbCIgYmVoYXZpb3IpCisjCitDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1M9eQorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9ET05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIgaXMgbm90IHNldAorQ09ORklHX1BSRUZJWD0iLi9faW5zdGFsbCIKKworIworIyBCdXN5Ym94IExpYnJhcnkgVHVuaW5nCisjCisjIENPTkZJR19GRUFUVVJFX1NZU1RFTUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVE1JTk1BWCBpcyBub3Qgc2V0CitDT05GSUdfUEFTU1dPUkRfTUlOTEVOPTYKK0NPTkZJR19NRDVfU0laRV9WU19TUEVFRD0yCitDT05GSUdfRkVBVFVSRV9GQVNUX1RPUD15CitDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1M9eQorQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1M9eQorQ09ORklHX0ZFQVRVUkVfRURJVElORz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MTAyNAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0xNgorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVWRVJTRV9TRUFSQ0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT049eQorIyBDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTQKKyMgQ09ORklHX0ZFQVRVUkVfU0tJUF9ST09URlMgaXMgbm90IHNldAorQ09ORklHX01PTk9UT05JQ19TWVNDQUxMPXkKK0NPTkZJR19JT0NUTF9IRVgyU1RSX0VSUk9SPXkKKyMgQ09ORklHX0ZFQVRVUkVfSFdJQiBpcyBub3Qgc2V0CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFo9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CisjIENPTkZJR19BUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CisjIENPTkZJR19GRUFUVVJFX0NQSU9fTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQSU9fUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUEtHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0dfREVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19HVU5aSVA9eQorQ09ORklHX0daSVA9eQorIyBDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19MWk9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xaT1BfQ09NUFJfSElHSCBpcyBub3Qgc2V0CisjIENPTkZJR19SUE0yQ1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19SUE0gaXMgbm90IHNldAorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1QgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFSX0ZST009eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUz15CisjIENPTkZJR19GRUFUVVJFX1RBUl9UT19DT01NQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9TRUxJTlVYIGlzIG5vdCBzZXQKK0NPTkZJR19VTkNPTVBSRVNTPXkKK0NPTkZJR19VTkxaTUE9eQorQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUPXkKK0NPTkZJR19MWk1BPXkKK0NPTkZJR19VTlhaPXkKK0NPTkZJR19YWj15CitDT05GSUdfVU5aSVA9eQorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKK0NPTkZJR19DQVQ9eQorQ09ORklHX0RBVEU9eQorQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQ9eQorIyBDT05GSUdfRkVBVFVSRV9EQVRFX05BTk8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfSUQ9eQorIyBDT05GSUdfR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19URVNUPXkKK0NPTkZJR19GRUFUVVJFX1RFU1RfNjQ9eQorQ09ORklHX1RPVUNIPXkKK0NPTkZJR19UUj15CitDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTPXkKK0NPTkZJR19GRUFUVVJFX1RSX0VRVUlWPXkKKyMgQ09ORklHX0JBU0U2NCBpcyBub3Qgc2V0CitDT05GSUdfV0hPPXkKKyMgQ09ORklHX1VTRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19DQVRWIGlzIG5vdCBzZXQKK0NPTkZJR19DSEdSUD15CitDT05GSUdfQ0hNT0Q9eQorQ09ORklHX0NIT1dOPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJPT1Q9eQorQ09ORklHX0NLU1VNPXkKKyMgQ09ORklHX0NPTU0gaXMgbm90IHNldAorQ09ORklHX0NQPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19DVVQ9eQorQ09ORklHX0REPXkKK0NPTkZJR19GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORz15CitDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORT15CitDT05GSUdfRkVBVFVSRV9ERF9JQlNfT0JTPXkKK0NPTkZJR19ERj15CitDT05GSUdfRkVBVFVSRV9ERl9GQU5DWT15CitDT05GSUdfRElSTkFNRT15CisjIENPTkZJR19ET1MyVU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYMkRPUyBpcyBub3Qgc2V0CitDT05GSUdfRFU9eQorQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUs9eQorQ09ORklHX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITz15CitDT05GSUdfRU5WPXkKKyMgQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19FWFBSPXkKK0NPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkFMU0U9eQorIyBDT05GSUdfRk9MRCBpcyBub3Qgc2V0CitDT05GSUdfRlNZTkM9eQorQ09ORklHX0hFQUQ9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfSEVBRD15CitDT05GSUdfSE9TVElEPXkKK0NPTkZJR19JTlNUQUxMPXkKKyMgQ09ORklHX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0xOPXkKKyMgQ09ORklHX0xPR05BTUUgaXMgbm90IHNldAorQ09ORklHX0xTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZJTEVUWVBFUz15CitDT05GSUdfRkVBVFVSRV9MU19GT0xMT1dMSU5LUz15CitDT05GSUdfRkVBVFVSRV9MU19SRUNVUlNJVkU9eQorQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVVNFUk5BTUU9eQorIyBDT05GSUdfRkVBVFVSRV9MU19DT0xPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQgaXMgbm90IHNldAorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorIyBDT05GSUdfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01LRklGTz15CitDT05GSUdfTUtOT0Q9eQorQ09ORklHX01WPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JQ0UgaXMgbm90IHNldAorQ09ORklHX05PSFVQPXkKKyMgQ09ORklHX09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSSU5URU5WIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEY9eQorQ09ORklHX1BXRD15CitDT05GSUdfUkVBRExJTks9eQorQ09ORklHX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XPXkKKyMgQ09ORklHX1JFQUxQQVRIIGlzIG5vdCBzZXQKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorIyBDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKKyMgQ09ORklHX1NIQTUxMlNVTSBpcyBub3Qgc2V0CitDT05GSUdfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfU0xFRVA9eQorIyBDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUCBpcyBub3Qgc2V0CitDT05GSUdfU09SVD15CitDT05GSUdfRkVBVFVSRV9TT1JUX0JJRz15CitDT05GSUdfU1BMSVQ9eQorQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1k9eQorQ09ORklHX1NUQVQ9eQorQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQ9eQorQ09ORklHX1NUVFk9eQorQ09ORklHX1NVTT15CitDT05GSUdfU1lOQz15CisjIENPTkZJR19UQUMgaXMgbm90IHNldAorQ09ORklHX1RBSUw9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfVEFJTD15CitDT05GSUdfVEVFPXkKK0NPTkZJR19GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU89eQorQ09ORklHX1RSVUU9eQorQ09ORklHX1RUWT15CitDT05GSUdfVU5BTUU9eQorIyBDT05GSUdfVU5FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1VOSVE9eQorQ09ORklHX1VTTEVFUD15CisjIENPTkZJR19VVURFQ09ERSBpcyBub3Qgc2V0CisjIENPTkZJR19VVUVOQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorQ09ORklHX1dIT0FNST15CitDT05GSUdfWUVTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgY3AgYW5kIG12CisjCitDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1M9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBscywgbW9yZSBhbmQgdGVsbmV0CisjCitDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEg9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzCisjCitDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0KKyMKK0NPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSz15CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NIVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkdDT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19DTEVBUj15CisjIENPTkZJR19ERUFMTE9DVlQgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUEtNQVAgaXMgbm90IHNldAorIyBDT05GSUdfS0JEX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfTE9BREZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfTE9BREtNQVAgaXMgbm90IHNldAorIyBDT05GSUdfT1BFTlZUIGlzIG5vdCBzZXQKK0NPTkZJR19SRVNFVD15CitDT05GSUdfUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1JFU0laRV9QUklOVD15CitDT05GSUdfU0VUQ09OU09MRT15CitDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUz15CisjIENPTkZJR19TRVRGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEtFWUNPREVTIGlzIG5vdCBzZXQKK0NPTkZJR19TRVRMT0dDT05TPXkKKyMgQ09ORklHX1NIT1dLRVk9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBsb2FkZm9udCBhbmQgc2V0Zm9udAorIworIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKKyMgQ09ORklHX1BJUEVfUFJPR1JFU1MgaXMgbm90IHNldAorQ09ORklHX1JVTl9QQVJUUz15CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU1RBUlRfU1RPUF9EQUVNT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19QQVRDSD15CitDT05GSUdfVkk9eQorQ09ORklHX0ZFQVRVUkVfVklfTUFYX0xFTj00MDk2CisjIENPTkZJR19GRUFUVVJFX1ZJXzhCSVQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfQ09MT049eQorQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUks9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIPXkKKyMgQ09ORklHX0ZFQVRVUkVfVklfUkVHRVhfU0VBUkNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQ9eQorQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFk9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUz15CitDT05GSUdfRkVBVFVSRV9WSV9TRVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SPXkKK0NPTkZJR19BV0s9eQorQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk09eQorQ09ORklHX0NNUD15CitDT05GSUdfRElGRj15CitDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9ESUZGX0RJUj15CitDT05GSUdfRUQ9eQorQ09ORklHX1NFRD15CitDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDPXkKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworQ09ORklHX0ZJTkQ9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUklOVDA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX01NSU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9QRVJNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1hERVY9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NQVhERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9OT1Q9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfU0laRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FPXkKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEUgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVg9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0NPTlRFWFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0xJTktTIGlzIG5vdCBzZXQKK0NPTkZJR19HUkVQPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0NPTlRFWFQ9eQorQ09ORklHX1hBUkdTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVD15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTT15CisKKyMKKyMgSW5pdCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0JPT1RDSEFSVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9DT05GSUdfRklMRSBpcyBub3Qgc2V0CitDT05GSUdfSEFMVD15CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCitDT05GSUdfSU5JVD15CitDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQj15CitDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQ9eQorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCitDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRSRD15CitDT05GSUdfSU5JVF9URVJNSU5BTF9UWVBFPSJsaW51eCIKKyMgQ09ORklHX01FU0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NRVNHX0VOQUJMRV9PTkxZX0dST1VQIGlzIG5vdCBzZXQKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworIyBDT05GSUdfQUREX1NIRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTU9WRV9TSEVMTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTPXkKKyMgQ09ORklHX1VTRV9CQl9QV0RfR1JQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9TSEFET1cgaXMgbm90IHNldAorQ09ORklHX1VTRV9CQl9DUllQVD15CitDT05GSUdfVVNFX0JCX0NSWVBUX1NIQT15CisjIENPTkZJR19BRERVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19OQU1FUyBpcyBub3Qgc2V0CisjIENPTkZJR19GSVJTVF9TWVNURU1fSUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVF9TWVNURU1fSUQgaXMgbm90IHNldAorIyBDT05GSUdfQURER1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFTFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVMR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQIGlzIG5vdCBzZXQKK0NPTkZJR19HRVRUWT15CitDT05GSUdfTE9HSU49eQorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOX1NDUklQVFMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTk9MT0dJTj15CitDT05GSUdfRkVBVFVSRV9TRUNVUkVUVFk9eQorQ09ORklHX1BBU1NXRD15CitDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSz15CisjIENPTkZJR19DUllQVFBXIGlzIG5vdCBzZXQKK0NPTkZJR19DSFBBU1NXRD15CitDT05GSUdfU1U9eQorQ09ORklHX0ZFQVRVUkVfU1VfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX1NVX0NIRUNLU19TSEVMTFM9eQorQ09ORklHX1NVTE9HSU49eQorIyBDT05GSUdfVkxPQ0sgaXMgbm90IHNldAorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKKyMgQ09ORklHX0NIQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19GU0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5FMkZTIGlzIG5vdCBzZXQKKworIworIyBMaW51eCBNb2R1bGUgVXRpbGl0aWVzCisjCitDT05GSUdfTU9ESU5GTz15CisjIENPTkZJR19NT0RQUk9CRV9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEIGlzIG5vdCBzZXQKK0NPTkZJR19JTlNNT0Q9eQorQ09ORklHX1JNTU9EPXkKK0NPTkZJR19MU01PRD15CitDT05GSUdfRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVD15CitDT05GSUdfTU9EUFJPQkU9eQorQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUPXkKK0NPTkZJR19ERVBNT0Q9eQorCisjCisjIE9wdGlvbnMgY29tbW9uIHRvIG11bHRpcGxlIG1vZHV0aWxzCisjCisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NT0RVVElMU19BTElBUz15CitDT05GSUdfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTPXkKK0NPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSPSIvbGliL21vZHVsZXMiCitDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRT0ibW9kdWxlcy5kZXAiCisKKyMKKyMgTGludXggU3lzdGVtIFV0aWxpdGllcworIworIyBDT05GSUdfQkxPQ0tERVYgaXMgbm90IHNldAorQ09ORklHX1JFVj15CisjIENPTkZJR19BQ1BJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FDUElEX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLSUQ9eQorIyBDT05GSUdfRkVBVFVSRV9CTEtJRF9UWVBFIGlzIG5vdCBzZXQKK0NPTkZJR19ETUVTRz15CitDT05GSUdfRkVBVFVSRV9ETUVTR19QUkVUVFk9eQorQ09ORklHX0ZCU0VUPXkKK0NPTkZJR19GRUFUVVJFX0ZCU0VUX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0ZCU0VUX1JFQURNT0RFPXkKKyMgQ09ORklHX0ZERkxVU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkRGT1JNQVQgaXMgbm90IHNldAorQ09ORklHX0ZESVNLPXkKKyMgQ09ORklHX0ZESVNLX1NVUFBPUlRfTEFSR0VfRElTS1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEU9eQorIyBDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVU5fTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUFRfTEFCRUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQ9eQorIyBDT05GSUdfRklOREZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVSQU1ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTQ0tfTUlOSVggaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19FWFQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfTUlOSVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NSU5JWDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19SRUlTRVIgaXMgbm90IHNldAorQ09ORklHX01LRlNfVkZBVD15CisjIENPTkZJR19HRVRPUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HRVRPUFRfTE9ORyBpcyBub3Qgc2V0CitDT05GSUdfSEVYRFVNUD15CisjIENPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRSBpcyBub3Qgc2V0CisjIENPTkZJR19IRCBpcyBub3Qgc2V0CitDT05GSUdfSFdDTE9DSz15CitDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTPXkKKyMgQ09ORklHX0lQQ1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTE9TRVRVUCBpcyBub3Qgc2V0CisjIENPTkZJR19MU1BDSSBpcyBub3Qgc2V0CitDT05GSUdfTFNVU0I9eQorIyBDT05GSUdfTURFViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfQ09ORiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9FWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01LU1dBUF9VVUlEIGlzIG5vdCBzZXQKK0NPTkZJR19NT1JFPXkKK0NPTkZJR19NT1VOVD15CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01PVU5UX05GUz15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZTVEFCPXkKK0NPTkZJR19QSVZPVF9ST09UPXkKKyMgQ09ORklHX1JEQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19SREVWPXkKK0NPTkZJR19SRUFEUFJPRklMRT15CitDT05GSUdfUlRDV0FLRT15CitDT05GSUdfU0NSSVBUPXkKK0NPTkZJR19TQ1JJUFRSRVBMQVk9eQorIyBDT05GSUdfU0VUQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQT05PRkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXSVRDSF9ST09UIGlzIG5vdCBzZXQKK0NPTkZJR19VTU9VTlQ9eQorQ09ORklHX0ZFQVRVUkVfVU1PVU5UX0FMTD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1vdW50L3Vtb3VudAorIworQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUD15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURT15CisjIENPTkZJR19GRUFUVVJFX01UQUJfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVk9MVU1FSUQ9eQorCisjCisjIEZpbGVzeXN0ZW0vVm9sdW1lIGlkZW50aWZpY2F0aW9uCisjCisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUkVJU0VSRlMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRkFUPXkKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfWEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9VREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfT0NGUzIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCisjIENPTkZJR19DT05TUFkgaXMgbm90IHNldAorQ09ORklHX0xFU1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19NQVhMSU5FUz05OTk5OTk5CitDT05GSUdfRkVBVFVSRV9MRVNTX0JSQUNLRVRTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19NQVJLUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX1JFR0VYUD15CitDT05GSUdfRkVBVFVSRV9MRVNTX1dJTkNIPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfREFTSENNRD15CitDT05GSUdfRkVBVFVSRV9MRVNTX0xJTkVOVU1TPXkKKyMgQ09ORklHX05BTkRXUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU5ERFVNUCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRTRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfVUJJQVRUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSURFVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklNS1ZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklSTVZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklSU1ZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklVUERBVEVWT0wgaXMgbm90IHNldAorQ09ORklHX0FESlRJTUVYPXkKKyMgQ09ORklHX0JCQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfQkVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JFRVBfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX05PRkFJTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfVFRZX0hJRkkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJUPXkKK0NPTkZJR19DUk9ORD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9EPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVI9Ii92YXIvc3Bvb2wvY3JvbiIKK0NPTkZJR19DUk9OVEFCPXkKKyMgQ09ORklHX0RDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRENfTElCTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRUpFQ1RfU0NTSSBpcyBub3Qgc2V0CitDT05GSUdfRkJTUExBU0g9eQorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEUEFSTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorIyBDT05GSUdfTUFOIGlzIG5vdCBzZXQKK0NPTkZJR19NSUNST0NPTT15CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBSURBVVRPUlVOIGlzIG5vdCBzZXQKK0NPTkZJR19SRUFEQUhFQUQ9eQorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JYIGlzIG5vdCBzZXQKK0NPTkZJR19TRVRTSUQ9eQorIyBDT05GSUdfU1RSSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfVElNRT15CisjIENPTkZJR19USU1FT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19UVFlTSVpFPXkKKyMgQ09ORklHX1ZPTE5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19OQkRDTElFTlQgaXMgbm90IHNldAorQ09ORklHX05DPXkKK0NPTkZJR19OQ19TRVJWRVI9eQorQ09ORklHX05DX0VYVFJBPXkKKyMgQ09ORklHX05DXzExMF9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX1BJTkc9eQorQ09ORklHX1BJTkc2PXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkc9eQorIyBDT05GSUdfV0hPSVMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSVBWNj15CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUz15CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorQ09ORklHX0FSUElORz15CisjIENPTkZJR19CUkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ETlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkFLRUlERU5URCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfRlRQR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0hPU1ROQU1FPXkKKyMgQ09ORklHX0hUVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUCBpcyBub3Qgc2V0CitDT05GSUdfSUZDT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19IVyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUz15CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBBRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUENBTEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRTVEFUPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERT15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRz15CitDT05GSUdfTlNMT09LVVA9eQorIyBDT05GSUdfTlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSIGlzIG5vdCBzZXQKK0NPTkZJR19QU0NBTj15CitDT05GSUdfUk9VVEU9eQorQ09ORklHX1NMQVRUQUNIPXkKKyMgQ09ORklHX1RDUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfVFRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTE5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUCBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0JMT0NLU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUk9VVEU9eQorIyBDT05GSUdfVFJBQ0VST1VURTYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFPXkKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RVTkNUTF9VRyBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVCBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VEUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dHRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfVElNRU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19aQ0lQIGlzIG5vdCBzZXQKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0xQRCBpcyBub3Qgc2V0CisjIENPTkZJR19MUFIgaXMgbm90IHNldAorIyBDT05GSUdfTFBRIGlzIG5vdCBzZXQKKworIworIyBNYWlsIFV0aWxpdGllcworIworIyBDT05GSUdfTUFLRU1JTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQgaXMgbm90IHNldAorIyBDT05GSUdfUE9QTUFJTERJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkgaXMgbm90IHNldAorIyBDT05GSUdfUkVGT1JNSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5ETUFJTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0lPU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NUFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfTk1FVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNQVAgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUFNUUkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BXRFggaXMgbm90IHNldAorIyBDT05GSUdfU01FTUNBUCBpcyBub3Qgc2V0CitDT05GSUdfVVBUSU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVBUSU1FX1VUTVBfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRlJFRT15CitDT05GSUdfRlVTRVI9eQorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKKyMgQ09ORklHX1BHUkVQIGlzIG5vdCBzZXQKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorIyBDT05GSUdfUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorIyBDT05GSUdfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIT1dfVEhSRUFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19SVU5TViBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5TVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TViBpcyBub3Qgc2V0CisjIENPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NWTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WVUlER0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0ZUTElNSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ0hDT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfR0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfTE9BRF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUFUQ0hQQVRIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU1RPUkVDT04gaXMgbm90IHNldAorIyBDT05GSUdfUlVOQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVNUQVRVUyBpcyBub3Qgc2V0CisKKyMKKyMgU2hlbGxzCisjCitDT05GSUdfQVNIPXkKK0NPTkZJR19BU0hfQkFTSF9DT01QQVQ9eQorIyBDT05GSUdfQVNIX0lETEVfVElNRU9VVCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX0pPQl9DT05UUk9MPXkKKyMgQ09ORklHX0FTSF9BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfR0VUT1BUUyBpcyBub3Qgc2V0CitDT05GSUdfQVNIX0JVSUxUSU5fRUNITz15CitDT05GSUdfQVNIX0JVSUxUSU5fUFJJTlRGPXkKK0NPTkZJR19BU0hfQlVJTFRJTl9URVNUPXkKK0NPTkZJR19BU0hfQ01EQ01EPXkKKyMgQ09ORklHX0FTSF9NQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19BU0hfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX0FTSF9SQU5ET01fU1VQUE9SVD15CisjIENPTkZJR19BU0hfRVhQQU5EX1BSTVQgaXMgbm90IHNldAorIyBDT05GSUdfQ1RUWUhBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQlJBQ0VfRVhQQU5TSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSEVMUCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lOVEVSQUNUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9KT0IgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9USUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSUYgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9MT09QUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0NBU0UgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9GVU5DVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRVhQT1JUX04gaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9NT0RFX1ggaXMgbm90IHNldAorIyBDT05GSUdfTVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0lTX0FTSD15CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19OT05FPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlQ9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVD15CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hfSElTVEZJTEVTSVpFPXkKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVA9eQorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0NGRyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TWVNMT0dEX1JFQURfQlVGRkVSX1NJWkU9MjU2CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkU9MTYKK0NPTkZJR19MT0dSRUFEPXkKK0NPTkZJR19GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HPXkKK0NPTkZJR19LTE9HRD15CitDT05GSUdfRkVBVFVSRV9LTE9HRF9LTE9HQ1RMPXkKK0NPTkZJR19MT0dHRVI9eQpkaWZmIC0tZ2l0IGEvY29uZmlncy9kZXZlbG9wbWVudF9kZWZjb25maWcgYi9jb25maWdzL2RldmVsb3BtZW50X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjMwNWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9kZXZlbG9wbWVudF9kZWZjb25maWcKQEAgLTAsMCArMSwxMDA4IEBACisjCisjIEJ1c3lCb3ggQ29uZmlndXJhdGlvbiBmb3IgYSBEZXZlbG9wbWVudCBCdWlsZCBDb25maWd1cmF0aW9uCisjIEJ1c3lib3ggdmVyc2lvbjogMS4xOS4zCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ERVNLVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVFJBX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkNMVURFX1NVU3YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19QTEFURk9STV9MSU5VWD15CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CisjIENPTkZJR19GRUFUVVJFX0lOU1RBTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX05PX1VTUiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NBTEVfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JQ09ERV9TVVBQT1JUPXkKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTYzCitDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVI9NzY3CisjIENPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX0JJRElfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX05FVVRSQUxfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4gaXMgbm90IHNldAorQ09ORklHX0xPTkdfT1BUUz15CitDT05GSUdfRkVBVFVSRV9ERVZQVFM9eQorIyBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9VVE1QPXkKK0NPTkZJR19GRUFUVVJFX1dUTVA9eQorQ09ORklHX0ZFQVRVUkVfUElERklMRT15CitDT05GSUdfRkVBVFVSRV9TVUlEPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9IQVZFX1JQQz15CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKK0NPTkZJR19MRlM9eQorQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD0iIgorQ09ORklHX0VYVFJBX0NGTEFHUz0iIgorCisjCisjIERlYnVnZ2luZyBPcHRpb25zCisjCisjIENPTkZJR19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldAorIyBDT05GSUdfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19OT19ERUJVR19MSUI9eQorIyBDT05GSUdfRE1BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19FRkVOQ0UgaXMgbm90IHNldAorCisjCisjIEluc3RhbGxhdGlvbiBPcHRpb25zICgibWFrZSBpbnN0YWxsIiBiZWhhdmlvcikKKyMKK0NPTkZJR19JTlNUQUxMX0FQUExFVF9TWU1MSU5LUz15CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9IQVJETElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfU0NSSVBUX1dSQVBQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0RPTlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU1lNTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9IQVJETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TQ1JJUFRfV1JBUFBFUiBpcyBub3Qgc2V0CitDT05GSUdfUFJFRklYPSIuL19pbnN0YWxsIgorCisjCisjIEJ1c3lib3ggTGlicmFyeSBUdW5pbmcKKyMKKyMgQ09ORklHX0ZFQVRVUkVfU1lTVEVNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JUTUlOTUFYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVNTV09SRF9NSU5MRU49NgorQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEPTIKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKK0NPTkZJR19GRUFUVVJFX0VUQ19ORVRXT1JLUz15CitDT05GSUdfRkVBVFVSRV9VU0VfVEVSTUlPUz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTj0xMDI0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfVkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTE2CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SRVZFUlNFX1NFQVJDSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQUJfQ09NUExFVElPTj15CisjIENPTkZJR19GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorIyBDT05GSUdfRkVBVFVSRV9TS0lQX1JPT1RGUyBpcyBub3Qgc2V0CitDT05GSUdfTU9OT1RPTklDX1NZU0NBTEw9eQorQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1I9eQorIyBDT05GSUdfRkVBVFVSRV9IV0lCIGlzIG5vdCBzZXQKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19YWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKKyMgQ09ORklHX0FSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEUgaXMgbm90IHNldAorQ09ORklHX0JVTlpJUDI9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0cgaXMgbm90IHNldAorIyBDT05GSUdfRFBLR19ERUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CisjIENPTkZJR19GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xaT1AgaXMgbm90IHNldAorIyBDT05GSUdfTFpPUF9DT01QUl9ISUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQTTJDUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQTSBpcyBub3Qgc2V0CitDT05GSUdfVEFSPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQVJfRlJPTT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1NFTElOVVggaXMgbm90IHNldAorQ09ORklHX1VOQ09NUFJFU1M9eQorQ09ORklHX1VOTFpNQT15CitDT05GSUdfRkVBVFVSRV9MWk1BX0ZBU1Q9eQorQ09ORklHX0xaTUE9eQorQ09ORklHX1VOWFo9eQorQ09ORklHX1haPXkKK0NPTkZJR19VTlpJUD15CisKKyMKKyMgQ29yZXV0aWxzCisjCitDT05GSUdfQkFTRU5BTUU9eQorQ09ORklHX0NBVD15CitDT05GSUdfREFURT15CitDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVD15CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19JRD15CisjIENPTkZJR19HUk9VUFMgaXMgbm90IHNldAorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorIyBDT05GSUdfQkFTRTY0IGlzIG5vdCBzZXQKK0NPTkZJR19XSE89eQorIyBDT05GSUdfVVNFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBVFYgaXMgbm90IHNldAorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorIyBDT05GSUdfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NIUk9PVD15CitDT05GSUdfQ0tTVU09eQorIyBDT05GSUdfQ09NTSBpcyBub3Qgc2V0CitDT05GSUdfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NVVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorQ09ORklHX0RGPXkKK0NPTkZJR19GRUFUVVJFX0RGX0ZBTkNZPXkKK0NPTkZJR19ESVJOQU1FPXkKKyMgQ09ORklHX0RPUzJVTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVgyRE9TIGlzIG5vdCBzZXQKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorIyBDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYUEFORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0VYUFI9eQorQ09ORklHX0VYUFJfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GQUxTRT15CisjIENPTkZJR19GT0xEIGlzIG5vdCBzZXQKK0NPTkZJR19GU1lOQz15CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKK0NPTkZJR19IT1NUSUQ9eQorQ09ORklHX0lOU1RBTEw9eQorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTE49eQorIyBDT05GSUdfTE9HTkFNRSBpcyBub3Qgc2V0CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfTUQ1U1VNPXkKK0NPTkZJR19NS0RJUj15CisjIENPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTUtGSUZPPXkKK0NPTkZJR19NS05PRD15CitDT05GSUdfTVY9eQorIyBDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTklDRSBpcyBub3Qgc2V0CitDT05GSUdfTk9IVVA9eQorIyBDT05GSUdfT0QgaXMgbm90IHNldAorIyBDT05GSUdfUFJJTlRFTlYgaXMgbm90IHNldAorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorIyBDT05GSUdfUkVBTFBBVEggaXMgbm90IHNldAorQ09ORklHX1JNPXkKK0NPTkZJR19STURJUj15CisjIENPTkZJR19GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfU0VRPXkKK0NPTkZJR19TSEExU1VNPXkKK0NPTkZJR19TSEEyNTZTVU09eQorIyBDT05GSUdfU0hBNTEyU1VNIGlzIG5vdCBzZXQKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CisjIENPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQIGlzIG5vdCBzZXQKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CitDT05GSUdfU1RBVD15CitDT05GSUdfRkVBVFVSRV9TVEFUX0ZPUk1BVD15CitDT05GSUdfU1RUWT15CitDT05GSUdfU1VNPXkKK0NPTkZJR19TWU5DPXkKKyMgQ09ORklHX1RBQyBpcyBub3Qgc2V0CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVFJVRT15CitDT05GSUdfVFRZPXkKK0NPTkZJR19VTkFNRT15CisjIENPTkZJR19VTkVYUEFORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfVU5JUT15CitDT05GSUdfVVNMRUVQPXkKKyMgQ09ORklHX1VVREVDT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VVRU5DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19XQz15CitDT05GSUdfRkVBVFVSRV9XQ19MQVJHRT15CitDT05GSUdfV0hPQU1JPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworIyBDT05GSUdfQ0hWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GR0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0NMRUFSPXkKKyMgQ09ORklHX0RFQUxMT0NWVCBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QS01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19LQkRfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FERk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FES01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19PUEVOVlQgaXMgbm90IHNldAorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKK0NPTkZJR19TRVRDT05TT0xFPXkKK0NPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VUS0VZQ09ERVMgaXMgbm90IHNldAorQ09ORklHX1NFVExPR0NPTlM9eQorIyBDT05GSUdfU0hPV0tFWT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxvYWRmb250IGFuZCBzZXRmb250CisjCisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1BTRjIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9SQVcgaXMgbm90IHNldAorCisjCisjIERlYmlhbiBVdGlsaXRpZXMKKyMKK0NPTkZJR19NS1RFTVA9eQorIyBDT05GSUdfUElQRV9QUk9HUkVTUyBpcyBub3Qgc2V0CitDT05GSUdfUlVOX1BBUlRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFSVF9TVE9QX0RBRU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19XSElDSD15CisKKyMKKyMgRWRpdG9ycworIworQ09ORklHX1BBVENIPXkKK0NPTkZJR19WST15CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTQwOTYKKyMgQ09ORklHX0ZFQVRVUkVfVklfOEJJVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1I9eQorQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0RFTEVURSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWD15CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfQ09OVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1MgaXMgbm90IHNldAorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworIyBDT05GSUdfQk9PVENIQVJURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQkxPQVRFRF9IRUFERVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0NPTkZJR19GSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19IQUxUPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0FMTF9URUxJTklUIGlzIG5vdCBzZXQKK0NPTkZJR19URUxJTklUX1BBVEg9IiIKK0NPTkZJR19JTklUPXkKK0NPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCPXkKK0NPTkZJR19GRUFUVVJFX0tJTExfUkVNT1ZFRD15CitDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZPTAKK0NPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFk9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfRVhUUkFfUVVJRVQ9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFM9eQorQ09ORklHX0ZFQVRVUkVfSU5JVFJEPXkKK0NPTkZJR19JTklUX1RFUk1JTkFMX1RZUEU9ImxpbnV4IgorIyBDT05GSUdfTUVTRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01FU0dfRU5BQkxFX09OTFlfR1JPVVAgaXMgbm90IHNldAorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCisjIENPTkZJR19BRERfU0hFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUkVNT1ZFX1NIRUxMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFM9eQorIyBDT05GSUdfVVNFX0JCX1BXRF9HUlAgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1NIQURPVyBpcyBub3Qgc2V0CitDT05GSUdfVVNFX0JCX0NSWVBUPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFRfU0hBPXkKKyMgQ09ORklHX0FERFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJUlNUX1NZU1RFTV9JRCBpcyBub3Qgc2V0CisjIENPTkZJR19MQVNUX1NZU1RFTV9JRCBpcyBub3Qgc2V0CisjIENPTkZJR19BRERHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVMVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUxHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAgaXMgbm90IHNldAorQ09ORklHX0dFVFRZPXkKK0NPTkZJR19MT0dJTj15CisjIENPTkZJR19QQU0gaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU5fU0NSSVBUUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9OT0xPR0lOPXkKK0NPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWT15CitDT05GSUdfUEFTU1dEPXkKK0NPTkZJR19GRUFUVVJFX1BBU1NXRF9XRUFLX0NIRUNLPXkKKyMgQ09ORklHX0NSWVBUUFcgaXMgbm90IHNldAorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CisjIENPTkZJR19WTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworIyBDT05GSUdfQ0hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTFNBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkUyRlMgaXMgbm90IHNldAorCisjCisjIExpbnV4IE1vZHVsZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19NT0RJTkZPPXkKKyMgQ09ORklHX01PRFBST0JFX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQgaXMgbm90IHNldAorQ09ORklHX0lOU01PRD15CitDT05GSUdfUk1NT0Q9eQorQ09ORklHX0xTTU9EPXkKK0NPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUPXkKK0NPTkZJR19NT0RQUk9CRT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1Q9eQorQ09ORklHX0RFUE1PRD15CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFM9eQorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9saWIvbW9kdWxlcyIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSJtb2R1bGVzLmRlcCIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19CTE9DS0RFViBpcyBub3Qgc2V0CitDT05GSUdfUkVWPXkKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtJRD15CisjIENPTkZJR19GRUFUVVJFX0JMS0lEX1RZUEUgaXMgbm90IHNldAorQ09ORklHX0RNRVNHPXkKK0NPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWT15CitDT05GSUdfRkJTRVQ9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREU9eQorIyBDT05GSUdfRkRGTFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GREZPUk1BVCBpcyBub3Qgc2V0CitDT05GSUdfRkRJU0s9eQorIyBDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRT15CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dQVF9MQUJFTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRD15CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorIyBDT05GSUdfRkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVJBTURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfRlNDS19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX0VYVDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01JTklYMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CitDT05GSUdfTUtGU19WRkFUPXkKKyMgQ09ORklHX0dFVE9QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HIGlzIG5vdCBzZXQKK0NPTkZJR19IRVhEVU1QPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19IV0NMT0NLPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFM9eQorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTUENJIGlzIG5vdCBzZXQKK0NPTkZJR19MU1VTQj15CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUtTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQgaXMgbm90IHNldAorQ09ORklHX01PUkU9eQorQ09ORklHX01PVU5UPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0NJRlM9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUI9eQorQ09ORklHX1BJVk9UX1JPT1Q9eQorIyBDT05GSUdfUkRBVEUgaXMgbm90IHNldAorQ09ORklHX1JERVY9eQorQ09ORklHX1JFQURQUk9GSUxFPXkKK0NPTkZJR19SVENXQUtFPXkKK0NPTkZJR19TQ1JJUFQ9eQorQ09ORklHX1NDUklQVFJFUExBWT15CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorQ09ORklHX1VNT1VOVD15CitDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbW91bnQvdW1vdW50CisjCitDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisKKyMKKyMgRmlsZXN5c3RlbS9Wb2x1bWUgaWRlbnRpZmljYXRpb24KKyMKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NPTlNQWSBpcyBub3Qgc2V0CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkREVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSU1LVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJNVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJTVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVVQREFURVZPTCBpcyBub3Qgc2V0CitDT05GSUdfQURKVElNRVg9eQorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVMgaXMgbm90IHNldAorIyBDT05GSUdfQ0hBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQgaXMgbm90IHNldAorQ09ORklHX0NIUlQ9eQorQ09ORklHX0NST05EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0Q9eQorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorIyBDT05GSUdfREMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQ19MSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CitDT05GSUdfREVWTUVNPXkKKyMgQ09ORklHX0VKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRUpFQ1RfU0NTSSBpcyBub3Qgc2V0CitDT05GSUdfRkJTUExBU0g9eQorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEUEFSTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorIyBDT05GSUdfTUFOIGlzIG5vdCBzZXQKK0NPTkZJR19NSUNST0NPTT15CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBSURBVVRPUlVOIGlzIG5vdCBzZXQKK0NPTkZJR19SRUFEQUhFQUQ9eQorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JYIGlzIG5vdCBzZXQKK0NPTkZJR19TRVRTSUQ9eQorIyBDT05GSUdfU1RSSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfVElNRT15CisjIENPTkZJR19USU1FT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19UVFlTSVpFPXkKKyMgQ09ORklHX1ZPTE5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19OQkRDTElFTlQgaXMgbm90IHNldAorQ09ORklHX05DPXkKK0NPTkZJR19OQ19TRVJWRVI9eQorQ09ORklHX05DX0VYVFJBPXkKKyMgQ09ORklHX05DXzExMF9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX1BJTkc9eQorQ09ORklHX1BJTkc2PXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkc9eQorIyBDT05GSUdfV0hPSVMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSVBWNj15CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUz15CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorQ09ORklHX0FSUElORz15CisjIENPTkZJR19CUkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ETlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkFLRUlERU5URCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfRlRQR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0hPU1ROQU1FPXkKKyMgQ09ORklHX0hUVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUCBpcyBub3Qgc2V0CitDT05GSUdfSUZDT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19IVyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUz15CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBBRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUENBTEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRTVEFUPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERT15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRz15CitDT05GSUdfTlNMT09LVVA9eQorIyBDT05GSUdfTlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSIGlzIG5vdCBzZXQKK0NPTkZJR19QU0NBTj15CitDT05GSUdfUk9VVEU9eQorQ09ORklHX1NMQVRUQUNIPXkKKyMgQ09ORklHX1RDUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfVFRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTE5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUCBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0JMT0NLU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUk9VVEU9eQorIyBDT05GSUdfVFJBQ0VST1VURTYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFPXkKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RVTkNUTF9VRyBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVCBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VEUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dHRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfVElNRU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19aQ0lQIGlzIG5vdCBzZXQKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0xQRCBpcyBub3Qgc2V0CisjIENPTkZJR19MUFIgaXMgbm90IHNldAorIyBDT05GSUdfTFBRIGlzIG5vdCBzZXQKKworIworIyBNYWlsIFV0aWxpdGllcworIworIyBDT05GSUdfTUFLRU1JTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQgaXMgbm90IHNldAorIyBDT05GSUdfUE9QTUFJTERJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkgaXMgbm90IHNldAorIyBDT05GSUdfUkVGT1JNSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5ETUFJTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0lPU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NUFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfTk1FVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNQVAgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUFNUUkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BXRFggaXMgbm90IHNldAorIyBDT05GSUdfU01FTUNBUCBpcyBub3Qgc2V0CitDT05GSUdfVVBUSU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVBUSU1FX1VUTVBfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRlJFRT15CitDT05GSUdfRlVTRVI9eQorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKKyMgQ09ORklHX1BHUkVQIGlzIG5vdCBzZXQKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorIyBDT05GSUdfUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorIyBDT05GSUdfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIT1dfVEhSRUFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19SVU5TViBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5TVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TViBpcyBub3Qgc2V0CisjIENPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NWTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WVUlER0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0ZUTElNSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ0hDT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfR0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfTE9BRF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUFUQ0hQQVRIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU1RPUkVDT04gaXMgbm90IHNldAorIyBDT05GSUdfUlVOQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVNUQVRVUyBpcyBub3Qgc2V0CisKKyMKKyMgU2hlbGxzCisjCitDT05GSUdfQVNIPXkKK0NPTkZJR19BU0hfQkFTSF9DT01QQVQ9eQorIyBDT05GSUdfQVNIX0lETEVfVElNRU9VVCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX0pPQl9DT05UUk9MPXkKK0NPTkZJR19BU0hfQUxJQVM9eQorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorQ09ORklHX0FTSF9CVUlMVElOX0VDSE89eQorQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URj15CitDT05GSUdfQVNIX0JVSUxUSU5fVEVTVD15CitDT05GSUdfQVNIX0NNRENNRD15CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQ9eQorQ09ORklHX0FTSF9FWFBBTkRfUFJNVD15CisjIENPTkZJR19DVFRZSEFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CUkFDRV9FWFBBTlNJT04gaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9IRUxQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSU5URVJBQ1RJVkUgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9TQVZFSElTVE9SWSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0pPQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JRiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0xPT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQ0FTRSBpcyBub3Qgc2V0CitDT05GSUdfSFVTSF9GVU5DVElPTlM9eQorIyBDT05GSUdfSFVTSF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRVhQT1JUX04gaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9NT0RFX1ggaXMgbm90IHNldAorIyBDT05GSUdfTVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0lTX0FTSD15CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19OT05FPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlQ9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVD15CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hfSElTVEZJTEVTSVpFPXkKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVA9eQorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0NGRyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TWVNMT0dEX1JFQURfQlVGRkVSX1NJWkU9MjU2CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkU9MTYKK0NPTkZJR19MT0dSRUFEPXkKK0NPTkZJR19GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HPXkKK0NPTkZJR19LTE9HRD15CitDT05GSUdfRkVBVFVSRV9LTE9HRF9LTE9HQ1RMPXkKK0NPTkZJR19MT0dHRVI9eQpkaWZmIC0tZ2l0IGEvY29uZmlncy9kaWFnbm9zdGljc19kZWZjb25maWcgYi9jb25maWdzL2RpYWdub3N0aWNzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTg5YjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9kaWFnbm9zdGljc19kZWZjb25maWcKQEAgLTAsMCArMSwxMDA4IEBACisjCisjIEJ1c3lCb3ggQ29uZmlndXJhdGlvbiBmb3IgYSBEaWFnbm9zdGljcyBCdWlsZCBDb25maWd1cmF0aW9uCisjIEJ1c3lib3ggdmVyc2lvbjogMS4xOS4zCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ERVNLVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVFJBX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkNMVURFX1NVU3YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19QTEFURk9STV9MSU5VWD15CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CisjIENPTkZJR19GRUFUVVJFX0lOU1RBTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX05PX1VTUiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NBTEVfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JQ09ERV9TVVBQT1JUPXkKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTYzCitDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVI9NzY3CisjIENPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX0JJRElfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX05FVVRSQUxfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4gaXMgbm90IHNldAorQ09ORklHX0xPTkdfT1BUUz15CitDT05GSUdfRkVBVFVSRV9ERVZQVFM9eQorIyBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9VVE1QPXkKK0NPTkZJR19GRUFUVVJFX1dUTVA9eQorQ09ORklHX0ZFQVRVUkVfUElERklMRT15CitDT05GSUdfRkVBVFVSRV9TVUlEPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9IQVZFX1JQQz15CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKK0NPTkZJR19MRlM9eQorQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD0iIgorQ09ORklHX0VYVFJBX0NGTEFHUz0iIgorCisjCisjIERlYnVnZ2luZyBPcHRpb25zCisjCisjIENPTkZJR19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldAorIyBDT05GSUdfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19OT19ERUJVR19MSUI9eQorIyBDT05GSUdfRE1BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19FRkVOQ0UgaXMgbm90IHNldAorCisjCisjIEluc3RhbGxhdGlvbiBPcHRpb25zICgibWFrZSBpbnN0YWxsIiBiZWhhdmlvcikKKyMKK0NPTkZJR19JTlNUQUxMX0FQUExFVF9TWU1MSU5LUz15CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9IQVJETElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfU0NSSVBUX1dSQVBQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0RPTlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU1lNTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9IQVJETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TQ1JJUFRfV1JBUFBFUiBpcyBub3Qgc2V0CitDT05GSUdfUFJFRklYPSIuL19pbnN0YWxsIgorCisjCisjIEJ1c3lib3ggTGlicmFyeSBUdW5pbmcKKyMKKyMgQ09ORklHX0ZFQVRVUkVfU1lTVEVNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JUTUlOTUFYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVNTV09SRF9NSU5MRU49NgorQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEPTIKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKK0NPTkZJR19GRUFUVVJFX0VUQ19ORVRXT1JLUz15CitDT05GSUdfRkVBVFVSRV9VU0VfVEVSTUlPUz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTj0xMDI0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfVkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTE2CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SRVZFUlNFX1NFQVJDSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQUJfQ09NUExFVElPTj15CisjIENPTkZJR19GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorIyBDT05GSUdfRkVBVFVSRV9TS0lQX1JPT1RGUyBpcyBub3Qgc2V0CitDT05GSUdfTU9OT1RPTklDX1NZU0NBTEw9eQorQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1I9eQorIyBDT05GSUdfRkVBVFVSRV9IV0lCIGlzIG5vdCBzZXQKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19YWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKKyMgQ09ORklHX0FSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEUgaXMgbm90IHNldAorQ09ORklHX0JVTlpJUDI9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0cgaXMgbm90IHNldAorIyBDT05GSUdfRFBLR19ERUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CisjIENPTkZJR19GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xaT1AgaXMgbm90IHNldAorIyBDT05GSUdfTFpPUF9DT01QUl9ISUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQTTJDUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQTSBpcyBub3Qgc2V0CitDT05GSUdfVEFSPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQVJfRlJPTT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1NFTElOVVggaXMgbm90IHNldAorQ09ORklHX1VOQ09NUFJFU1M9eQorQ09ORklHX1VOTFpNQT15CitDT05GSUdfRkVBVFVSRV9MWk1BX0ZBU1Q9eQorQ09ORklHX0xaTUE9eQorQ09ORklHX1VOWFo9eQorQ09ORklHX1haPXkKK0NPTkZJR19VTlpJUD15CisKKyMKKyMgQ29yZXV0aWxzCisjCitDT05GSUdfQkFTRU5BTUU9eQorQ09ORklHX0NBVD15CitDT05GSUdfREFURT15CitDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVD15CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19JRD15CisjIENPTkZJR19HUk9VUFMgaXMgbm90IHNldAorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorIyBDT05GSUdfQkFTRTY0IGlzIG5vdCBzZXQKK0NPTkZJR19XSE89eQorIyBDT05GSUdfVVNFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBVFYgaXMgbm90IHNldAorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorIyBDT05GSUdfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NIUk9PVD15CitDT05GSUdfQ0tTVU09eQorIyBDT05GSUdfQ09NTSBpcyBub3Qgc2V0CitDT05GSUdfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NVVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorQ09ORklHX0RGPXkKK0NPTkZJR19GRUFUVVJFX0RGX0ZBTkNZPXkKK0NPTkZJR19ESVJOQU1FPXkKKyMgQ09ORklHX0RPUzJVTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVgyRE9TIGlzIG5vdCBzZXQKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorIyBDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYUEFORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0VYUFI9eQorQ09ORklHX0VYUFJfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GQUxTRT15CisjIENPTkZJR19GT0xEIGlzIG5vdCBzZXQKK0NPTkZJR19GU1lOQz15CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKK0NPTkZJR19IT1NUSUQ9eQorQ09ORklHX0lOU1RBTEw9eQorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTE49eQorIyBDT05GSUdfTE9HTkFNRSBpcyBub3Qgc2V0CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfTUQ1U1VNPXkKK0NPTkZJR19NS0RJUj15CisjIENPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTUtGSUZPPXkKK0NPTkZJR19NS05PRD15CitDT05GSUdfTVY9eQorIyBDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTklDRSBpcyBub3Qgc2V0CitDT05GSUdfTk9IVVA9eQorIyBDT05GSUdfT0QgaXMgbm90IHNldAorIyBDT05GSUdfUFJJTlRFTlYgaXMgbm90IHNldAorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorIyBDT05GSUdfUkVBTFBBVEggaXMgbm90IHNldAorQ09ORklHX1JNPXkKK0NPTkZJR19STURJUj15CisjIENPTkZJR19GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfU0VRPXkKK0NPTkZJR19TSEExU1VNPXkKK0NPTkZJR19TSEEyNTZTVU09eQorIyBDT05GSUdfU0hBNTEyU1VNIGlzIG5vdCBzZXQKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CisjIENPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQIGlzIG5vdCBzZXQKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CitDT05GSUdfU1RBVD15CitDT05GSUdfRkVBVFVSRV9TVEFUX0ZPUk1BVD15CitDT05GSUdfU1RUWT15CitDT05GSUdfU1VNPXkKK0NPTkZJR19TWU5DPXkKKyMgQ09ORklHX1RBQyBpcyBub3Qgc2V0CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVFJVRT15CitDT05GSUdfVFRZPXkKK0NPTkZJR19VTkFNRT15CisjIENPTkZJR19VTkVYUEFORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfVU5JUT15CitDT05GSUdfVVNMRUVQPXkKKyMgQ09ORklHX1VVREVDT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VVRU5DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19XQz15CitDT05GSUdfRkVBVFVSRV9XQ19MQVJHRT15CitDT05GSUdfV0hPQU1JPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworIyBDT05GSUdfQ0hWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GR0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0NMRUFSPXkKKyMgQ09ORklHX0RFQUxMT0NWVCBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QS01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19LQkRfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FERk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FES01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19PUEVOVlQgaXMgbm90IHNldAorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKK0NPTkZJR19TRVRDT05TT0xFPXkKK0NPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VUS0VZQ09ERVMgaXMgbm90IHNldAorQ09ORklHX1NFVExPR0NPTlM9eQorIyBDT05GSUdfU0hPV0tFWT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxvYWRmb250IGFuZCBzZXRmb250CisjCisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1BTRjIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9SQVcgaXMgbm90IHNldAorCisjCisjIERlYmlhbiBVdGlsaXRpZXMKKyMKK0NPTkZJR19NS1RFTVA9eQorIyBDT05GSUdfUElQRV9QUk9HUkVTUyBpcyBub3Qgc2V0CitDT05GSUdfUlVOX1BBUlRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFSVF9TVE9QX0RBRU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19XSElDSD15CisKKyMKKyMgRWRpdG9ycworIworQ09ORklHX1BBVENIPXkKK0NPTkZJR19WST15CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTQwOTYKKyMgQ09ORklHX0ZFQVRVUkVfVklfOEJJVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1I9eQorQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0RFTEVURSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWD15CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfQ09OVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1MgaXMgbm90IHNldAorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworIyBDT05GSUdfQk9PVENIQVJURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQkxPQVRFRF9IRUFERVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0NPTkZJR19GSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19IQUxUPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0FMTF9URUxJTklUIGlzIG5vdCBzZXQKK0NPTkZJR19URUxJTklUX1BBVEg9IiIKK0NPTkZJR19JTklUPXkKK0NPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCPXkKK0NPTkZJR19GRUFUVVJFX0tJTExfUkVNT1ZFRD15CitDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZPTAKK0NPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFk9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfRVhUUkFfUVVJRVQ9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFM9eQorQ09ORklHX0ZFQVRVUkVfSU5JVFJEPXkKK0NPTkZJR19JTklUX1RFUk1JTkFMX1RZUEU9ImxpbnV4IgorIyBDT05GSUdfTUVTRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01FU0dfRU5BQkxFX09OTFlfR1JPVVAgaXMgbm90IHNldAorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCisjIENPTkZJR19BRERfU0hFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUkVNT1ZFX1NIRUxMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFM9eQorIyBDT05GSUdfVVNFX0JCX1BXRF9HUlAgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1NIQURPVyBpcyBub3Qgc2V0CitDT05GSUdfVVNFX0JCX0NSWVBUPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFRfU0hBPXkKKyMgQ09ORklHX0FERFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJUlNUX1NZU1RFTV9JRCBpcyBub3Qgc2V0CisjIENPTkZJR19MQVNUX1NZU1RFTV9JRCBpcyBub3Qgc2V0CisjIENPTkZJR19BRERHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVMVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUxHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAgaXMgbm90IHNldAorQ09ORklHX0dFVFRZPXkKK0NPTkZJR19MT0dJTj15CisjIENPTkZJR19QQU0gaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU5fU0NSSVBUUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9OT0xPR0lOPXkKK0NPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWT15CitDT05GSUdfUEFTU1dEPXkKK0NPTkZJR19GRUFUVVJFX1BBU1NXRF9XRUFLX0NIRUNLPXkKKyMgQ09ORklHX0NSWVBUUFcgaXMgbm90IHNldAorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CisjIENPTkZJR19WTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworIyBDT05GSUdfQ0hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTFNBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkUyRlMgaXMgbm90IHNldAorCisjCisjIExpbnV4IE1vZHVsZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19NT0RJTkZPPXkKKyMgQ09ORklHX01PRFBST0JFX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQgaXMgbm90IHNldAorQ09ORklHX0lOU01PRD15CitDT05GSUdfUk1NT0Q9eQorQ09ORklHX0xTTU9EPXkKK0NPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUPXkKK0NPTkZJR19NT0RQUk9CRT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1Q9eQorQ09ORklHX0RFUE1PRD15CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFM9eQorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9saWIvbW9kdWxlcyIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSJtb2R1bGVzLmRlcCIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19CTE9DS0RFViBpcyBub3Qgc2V0CitDT05GSUdfUkVWPXkKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtJRD15CisjIENPTkZJR19GRUFUVVJFX0JMS0lEX1RZUEUgaXMgbm90IHNldAorQ09ORklHX0RNRVNHPXkKK0NPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWT15CitDT05GSUdfRkJTRVQ9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREU9eQorIyBDT05GSUdfRkRGTFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GREZPUk1BVCBpcyBub3Qgc2V0CitDT05GSUdfRkRJU0s9eQorIyBDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRT15CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dQVF9MQUJFTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRD15CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorIyBDT05GSUdfRkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVJBTURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfRlNDS19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX0VYVDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01JTklYMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CitDT05GSUdfTUtGU19WRkFUPXkKKyMgQ09ORklHX0dFVE9QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HIGlzIG5vdCBzZXQKK0NPTkZJR19IRVhEVU1QPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19IV0NMT0NLPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFM9eQorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTUENJIGlzIG5vdCBzZXQKK0NPTkZJR19MU1VTQj15CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUtTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQgaXMgbm90IHNldAorQ09ORklHX01PUkU9eQorQ09ORklHX01PVU5UPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0NJRlM9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUI9eQorQ09ORklHX1BJVk9UX1JPT1Q9eQorIyBDT05GSUdfUkRBVEUgaXMgbm90IHNldAorQ09ORklHX1JERVY9eQorQ09ORklHX1JFQURQUk9GSUxFPXkKK0NPTkZJR19SVENXQUtFPXkKK0NPTkZJR19TQ1JJUFQ9eQorQ09ORklHX1NDUklQVFJFUExBWT15CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorQ09ORklHX1VNT1VOVD15CitDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbW91bnQvdW1vdW50CisjCitDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisKKyMKKyMgRmlsZXN5c3RlbS9Wb2x1bWUgaWRlbnRpZmljYXRpb24KKyMKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NPTlNQWSBpcyBub3Qgc2V0CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkREVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSU1LVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJNVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJTVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVVQREFURVZPTCBpcyBub3Qgc2V0CitDT05GSUdfQURKVElNRVg9eQorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVMgaXMgbm90IHNldAorIyBDT05GSUdfQ0hBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQgaXMgbm90IHNldAorQ09ORklHX0NIUlQ9eQorQ09ORklHX0NST05EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0Q9eQorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorIyBDT05GSUdfREMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQ19MSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CitDT05GSUdfREVWTUVNPXkKKyMgQ09ORklHX0VKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRUpFQ1RfU0NTSSBpcyBub3Qgc2V0CitDT05GSUdfRkJTUExBU0g9eQorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEUEFSTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorIyBDT05GSUdfTUFOIGlzIG5vdCBzZXQKK0NPTkZJR19NSUNST0NPTT15CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBSURBVVRPUlVOIGlzIG5vdCBzZXQKK0NPTkZJR19SRUFEQUhFQUQ9eQorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JYIGlzIG5vdCBzZXQKK0NPTkZJR19TRVRTSUQ9eQorIyBDT05GSUdfU1RSSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfVElNRT15CisjIENPTkZJR19USU1FT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19UVFlTSVpFPXkKKyMgQ09ORklHX1ZPTE5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19OQkRDTElFTlQgaXMgbm90IHNldAorQ09ORklHX05DPXkKK0NPTkZJR19OQ19TRVJWRVI9eQorQ09ORklHX05DX0VYVFJBPXkKKyMgQ09ORklHX05DXzExMF9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX1BJTkc9eQorQ09ORklHX1BJTkc2PXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkc9eQorIyBDT05GSUdfV0hPSVMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSVBWNj15CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUz15CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorQ09ORklHX0FSUElORz15CisjIENPTkZJR19CUkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ETlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkFLRUlERU5URCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfRlRQR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0hPU1ROQU1FPXkKKyMgQ09ORklHX0hUVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUCBpcyBub3Qgc2V0CitDT05GSUdfSUZDT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19IVyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUz15CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBBRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUENBTEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRTVEFUPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERT15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRz15CitDT05GSUdfTlNMT09LVVA9eQorIyBDT05GSUdfTlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSIGlzIG5vdCBzZXQKK0NPTkZJR19QU0NBTj15CitDT05GSUdfUk9VVEU9eQorQ09ORklHX1NMQVRUQUNIPXkKKyMgQ09ORklHX1RDUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfVFRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTE5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUCBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0JMT0NLU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUk9VVEU9eQorIyBDT05GSUdfVFJBQ0VST1VURTYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFPXkKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RVTkNUTF9VRyBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVCBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VEUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dHRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfVElNRU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19aQ0lQIGlzIG5vdCBzZXQKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0xQRCBpcyBub3Qgc2V0CisjIENPTkZJR19MUFIgaXMgbm90IHNldAorIyBDT05GSUdfTFBRIGlzIG5vdCBzZXQKKworIworIyBNYWlsIFV0aWxpdGllcworIworIyBDT05GSUdfTUFLRU1JTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQgaXMgbm90IHNldAorIyBDT05GSUdfUE9QTUFJTERJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkgaXMgbm90IHNldAorIyBDT05GSUdfUkVGT1JNSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5ETUFJTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0lPU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NUFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfTk1FVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNQVAgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUFNUUkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BXRFggaXMgbm90IHNldAorIyBDT05GSUdfU01FTUNBUCBpcyBub3Qgc2V0CitDT05GSUdfVVBUSU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVBUSU1FX1VUTVBfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRlJFRT15CitDT05GSUdfRlVTRVI9eQorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKKyMgQ09ORklHX1BHUkVQIGlzIG5vdCBzZXQKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorIyBDT05GSUdfUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorIyBDT05GSUdfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIT1dfVEhSRUFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19SVU5TViBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5TVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TViBpcyBub3Qgc2V0CisjIENPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NWTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WVUlER0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0ZUTElNSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ0hDT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfR0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfTE9BRF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUFUQ0hQQVRIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU1RPUkVDT04gaXMgbm90IHNldAorIyBDT05GSUdfUlVOQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVNUQVRVUyBpcyBub3Qgc2V0CisKKyMKKyMgU2hlbGxzCisjCitDT05GSUdfQVNIPXkKK0NPTkZJR19BU0hfQkFTSF9DT01QQVQ9eQorIyBDT05GSUdfQVNIX0lETEVfVElNRU9VVCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX0pPQl9DT05UUk9MPXkKKyMgQ09ORklHX0FTSF9BTElBUyBpcyBub3Qgc2V0CitDT05GSUdfQVNIX0dFVE9QVFM9eQorQ09ORklHX0FTSF9CVUlMVElOX0VDSE89eQorQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URj15CitDT05GSUdfQVNIX0JVSUxUSU5fVEVTVD15CitDT05GSUdfQVNIX0NNRENNRD15CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQ9eQorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NUVFlIQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JSQUNFX0VYUEFOU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0hFTFAgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JTlRFUkFDVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSk9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9PUFMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9DQVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRlVOQ1RJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0VYUE9SVF9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTU9ERV9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19BU0g9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JBU0hfSVNfTk9ORT15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQ9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0hJU1RGSUxFU0laRT15CisKKyMKKyMgU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfU1lTTE9HRD15CitDT05GSUdfRkVBVFVSRV9ST1RBVEVfTE9HRklMRT15CitDT05GSUdfRkVBVFVSRV9SRU1PVEVfTE9HPXkKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9DRkcgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFPTI1NgorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTE2CitDT05GSUdfTE9HUkVBRD15CitDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORz15CitDT05GSUdfS0xPR0Q9eQorQ09ORklHX0ZFQVRVUkVfS0xPR0RfS0xPR0NUTD15CitDT05GSUdfTE9HR0VSPXkKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvcmVsZWFzZV9kZWZjb25maWcgYi9jb25maWdzL3JlbGVhc2VfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzk1NzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL3JlbGVhc2VfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTAwOCBAQAorIworIyBCdXN5Qm94IENvbmZpZ3VyYXRpb24gZm9yIGEgUmVsZWFzZSBCdWlsZCBDb25maWd1cmF0aW9uCisjIEJ1c3lib3ggdmVyc2lvbjogMS4xOS4zCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ERVNLVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVFJBX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkNMVURFX1NVU3YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19QTEFURk9STV9MSU5VWD15CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFPXkKKyMgQ09ORklHX0ZFQVRVUkVfSU5TVEFMTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfTk9fVVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0FMRV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklDT0RFX1NVUFBPUlQ9eQorIyBDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOViBpcyBub3Qgc2V0CitDT05GSUdfU1VCU1RfV0NIQVI9NjMKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj03NjcKKyMgQ09ORklHX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1dJREVfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfQklESV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfTkVVVFJBTF9UQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1BSRVNFUlZFX0JST0tFTiBpcyBub3Qgc2V0CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VUTVA9eQorQ09ORklHX0ZFQVRVUkVfV1RNUD15CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1NVSUQ9eQorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyBpcyBub3Qgc2V0CitDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEg9Ii9wcm9jL3NlbGYvZXhlIgorQ09ORklHX0ZFQVRVUkVfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0hBVkVfUlBDPXkKKworIworIyBCdWlsZCBPcHRpb25zCisjCisjIENPTkZJR19TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfUElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JVSUxEX0xJQkJVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkRJVklEVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1ggaXMgbm90IHNldAorQ09ORklHX0xGUz15CitDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYPSIiCitDT05GSUdfRVhUUkFfQ0ZMQUdTPSIiCisKKyMKKyMgRGVidWdnaW5nIE9wdGlvbnMKKyMKKyMgQ09ORklHX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFU1NJTUlaRSBpcyBub3Qgc2V0CisjIENPTkZJR19XRVJST1IgaXMgbm90IHNldAorQ09ORklHX05PX0RFQlVHX0xJQj15CisjIENPTkZJR19ETUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGRU5DRSBpcyBub3Qgc2V0CisKKyMKKyMgSW5zdGFsbGF0aW9uIE9wdGlvbnMgKCJtYWtlIGluc3RhbGwiIGJlaGF2aW9yKQorIworQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworIyBDT05GSUdfRkVBVFVSRV9TWVNURU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlRNSU5NQVggaXMgbm90IHNldAorQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQ9MgorQ09ORklHX0ZFQVRVUkVfRkFTVF9UT1A9eQorIyBDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1M9eQorQ09ORklHX0ZFQVRVUkVfRURJVElORz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MTAyNAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0xNgorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVWRVJTRV9TRUFSQ0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT049eQorIyBDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTQKKyMgQ09ORklHX0ZFQVRVUkVfU0tJUF9ST09URlMgaXMgbm90IHNldAorQ09ORklHX01PTk9UT05JQ19TWVNDQUxMPXkKK0NPTkZJR19JT0NUTF9IRVgyU1RSX0VSUk9SPXkKKyMgQ09ORklHX0ZFQVRVUkVfSFdJQiBpcyBub3Qgc2V0CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFo9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CisjIENPTkZJR19BUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CisjIENPTkZJR19GRUFUVVJFX0NQSU9fTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQSU9fUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUEtHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0dfREVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19HVU5aSVA9eQorQ09ORklHX0daSVA9eQorIyBDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19MWk9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xaT1BfQ09NUFJfSElHSCBpcyBub3Qgc2V0CisjIENPTkZJR19SUE0yQ1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19SUE0gaXMgbm90IHNldAorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1QgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFSX0ZST009eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUz15CisjIENPTkZJR19GRUFUVVJFX1RBUl9UT19DT01NQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9TRUxJTlVYIGlzIG5vdCBzZXQKK0NPTkZJR19VTkNPTVBSRVNTPXkKK0NPTkZJR19VTkxaTUE9eQorQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUPXkKK0NPTkZJR19MWk1BPXkKK0NPTkZJR19VTlhaPXkKK0NPTkZJR19YWj15CitDT05GSUdfVU5aSVA9eQorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKK0NPTkZJR19DQVQ9eQorQ09ORklHX0RBVEU9eQorQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQ9eQorIyBDT05GSUdfRkVBVFVSRV9EQVRFX05BTk8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfSUQ9eQorIyBDT05GSUdfR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19URVNUPXkKK0NPTkZJR19GRUFUVVJFX1RFU1RfNjQ9eQorQ09ORklHX1RPVUNIPXkKK0NPTkZJR19UUj15CitDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTPXkKK0NPTkZJR19GRUFUVVJFX1RSX0VRVUlWPXkKKyMgQ09ORklHX0JBU0U2NCBpcyBub3Qgc2V0CitDT05GSUdfV0hPPXkKKyMgQ09ORklHX1VTRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19DQVRWIGlzIG5vdCBzZXQKK0NPTkZJR19DSEdSUD15CitDT05GSUdfQ0hNT0Q9eQorQ09ORklHX0NIT1dOPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJPT1Q9eQorQ09ORklHX0NLU1VNPXkKKyMgQ09ORklHX0NPTU0gaXMgbm90IHNldAorQ09ORklHX0NQPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19DVVQ9eQorQ09ORklHX0REPXkKK0NPTkZJR19GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORz15CitDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORT15CitDT05GSUdfRkVBVFVSRV9ERF9JQlNfT0JTPXkKK0NPTkZJR19ERj15CitDT05GSUdfRkVBVFVSRV9ERl9GQU5DWT15CitDT05GSUdfRElSTkFNRT15CisjIENPTkZJR19ET1MyVU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYMkRPUyBpcyBub3Qgc2V0CitDT05GSUdfRFU9eQorQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUs9eQorQ09ORklHX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITz15CitDT05GSUdfRU5WPXkKKyMgQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19FWFBSPXkKK0NPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkFMU0U9eQorIyBDT05GSUdfRk9MRCBpcyBub3Qgc2V0CitDT05GSUdfRlNZTkM9eQorQ09ORklHX0hFQUQ9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfSEVBRD15CitDT05GSUdfSE9TVElEPXkKK0NPTkZJR19JTlNUQUxMPXkKKyMgQ09ORklHX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0xOPXkKKyMgQ09ORklHX0xPR05BTUUgaXMgbm90IHNldAorQ09ORklHX0xTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZJTEVUWVBFUz15CitDT05GSUdfRkVBVFVSRV9MU19GT0xMT1dMSU5LUz15CitDT05GSUdfRkVBVFVSRV9MU19SRUNVUlNJVkU9eQorQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVVNFUk5BTUU9eQorIyBDT05GSUdfRkVBVFVSRV9MU19DT0xPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQgaXMgbm90IHNldAorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorIyBDT05GSUdfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01LRklGTz15CitDT05GSUdfTUtOT0Q9eQorQ09ORklHX01WPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JQ0UgaXMgbm90IHNldAorQ09ORklHX05PSFVQPXkKKyMgQ09ORklHX09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSSU5URU5WIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEY9eQorQ09ORklHX1BXRD15CitDT05GSUdfUkVBRExJTks9eQorQ09ORklHX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XPXkKKyMgQ09ORklHX1JFQUxQQVRIIGlzIG5vdCBzZXQKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorIyBDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKKyMgQ09ORklHX1NIQTUxMlNVTSBpcyBub3Qgc2V0CitDT05GSUdfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfU0xFRVA9eQorIyBDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUCBpcyBub3Qgc2V0CitDT05GSUdfU09SVD15CitDT05GSUdfRkVBVFVSRV9TT1JUX0JJRz15CitDT05GSUdfU1BMSVQ9eQorQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1k9eQorQ09ORklHX1NUQVQ9eQorQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQ9eQorQ09ORklHX1NUVFk9eQorQ09ORklHX1NVTT15CitDT05GSUdfU1lOQz15CisjIENPTkZJR19UQUMgaXMgbm90IHNldAorQ09ORklHX1RBSUw9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfVEFJTD15CitDT05GSUdfVEVFPXkKK0NPTkZJR19GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU89eQorQ09ORklHX1RSVUU9eQorQ09ORklHX1RUWT15CitDT05GSUdfVU5BTUU9eQorIyBDT05GSUdfVU5FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1VOSVE9eQorQ09ORklHX1VTTEVFUD15CisjIENPTkZJR19VVURFQ09ERSBpcyBub3Qgc2V0CisjIENPTkZJR19VVUVOQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorQ09ORklHX1dIT0FNST15CitDT05GSUdfWUVTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgY3AgYW5kIG12CisjCitDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1M9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBscywgbW9yZSBhbmQgdGVsbmV0CisjCitDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEg9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzCisjCitDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0KKyMKK0NPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSz15CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NIVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkdDT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19DTEVBUj15CisjIENPTkZJR19ERUFMTE9DVlQgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUEtNQVAgaXMgbm90IHNldAorIyBDT05GSUdfS0JEX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfTE9BREZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfTE9BREtNQVAgaXMgbm90IHNldAorIyBDT05GSUdfT1BFTlZUIGlzIG5vdCBzZXQKK0NPTkZJR19SRVNFVD15CitDT05GSUdfUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1JFU0laRV9QUklOVD15CitDT05GSUdfU0VUQ09OU09MRT15CitDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUz15CisjIENPTkZJR19TRVRGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEtFWUNPREVTIGlzIG5vdCBzZXQKK0NPTkZJR19TRVRMT0dDT05TPXkKKyMgQ09ORklHX1NIT1dLRVk9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBsb2FkZm9udCBhbmQgc2V0Zm9udAorIworIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKKyMgQ09ORklHX1BJUEVfUFJPR1JFU1MgaXMgbm90IHNldAorQ09ORklHX1JVTl9QQVJUUz15CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU1RBUlRfU1RPUF9EQUVNT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19QQVRDSD15CitDT05GSUdfVkk9eQorQ09ORklHX0ZFQVRVUkVfVklfTUFYX0xFTj00MDk2CisjIENPTkZJR19GRUFUVVJFX1ZJXzhCSVQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfQ09MT049eQorQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUks9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIPXkKKyMgQ09ORklHX0ZFQVRVUkVfVklfUkVHRVhfU0VBUkNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQ9eQorQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFk9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUz15CitDT05GSUdfRkVBVFVSRV9WSV9TRVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SPXkKK0NPTkZJR19BV0s9eQorQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk09eQorQ09ORklHX0NNUD15CitDT05GSUdfRElGRj15CitDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9ESUZGX0RJUj15CitDT05GSUdfRUQ9eQorQ09ORklHX1NFRD15CitDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDPXkKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworQ09ORklHX0ZJTkQ9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUklOVDA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX01NSU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9QRVJNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1hERVY9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NQVhERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9OT1Q9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfU0laRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FPXkKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEUgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVg9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0NPTlRFWFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0xJTktTIGlzIG5vdCBzZXQKK0NPTkZJR19HUkVQPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0NPTlRFWFQ9eQorQ09ORklHX1hBUkdTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVD15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTT15CisKKyMKKyMgSW5pdCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0JPT1RDSEFSVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9DT05GSUdfRklMRSBpcyBub3Qgc2V0CitDT05GSUdfSEFMVD15CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCitDT05GSUdfSU5JVD15CitDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQj15CitDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQ9eQorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCitDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRSRD15CitDT05GSUdfSU5JVF9URVJNSU5BTF9UWVBFPSJsaW51eCIKKyMgQ09ORklHX01FU0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NRVNHX0VOQUJMRV9PTkxZX0dST1VQIGlzIG5vdCBzZXQKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworIyBDT05GSUdfQUREX1NIRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTU9WRV9TSEVMTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTPXkKKyMgQ09ORklHX1VTRV9CQl9QV0RfR1JQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9TSEFET1cgaXMgbm90IHNldAorQ09ORklHX1VTRV9CQl9DUllQVD15CitDT05GSUdfVVNFX0JCX0NSWVBUX1NIQT15CisjIENPTkZJR19BRERVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19OQU1FUyBpcyBub3Qgc2V0CisjIENPTkZJR19GSVJTVF9TWVNURU1fSUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVF9TWVNURU1fSUQgaXMgbm90IHNldAorIyBDT05GSUdfQURER1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFTFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVMR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQIGlzIG5vdCBzZXQKK0NPTkZJR19HRVRUWT15CitDT05GSUdfTE9HSU49eQorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOX1NDUklQVFMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTk9MT0dJTj15CitDT05GSUdfRkVBVFVSRV9TRUNVUkVUVFk9eQorQ09ORklHX1BBU1NXRD15CitDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSz15CisjIENPTkZJR19DUllQVFBXIGlzIG5vdCBzZXQKK0NPTkZJR19DSFBBU1NXRD15CitDT05GSUdfU1U9eQorQ09ORklHX0ZFQVRVUkVfU1VfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX1NVX0NIRUNLU19TSEVMTFM9eQorQ09ORklHX1NVTE9HSU49eQorIyBDT05GSUdfVkxPQ0sgaXMgbm90IHNldAorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKKyMgQ09ORklHX0NIQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19GU0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5FMkZTIGlzIG5vdCBzZXQKKworIworIyBMaW51eCBNb2R1bGUgVXRpbGl0aWVzCisjCisjIENPTkZJR19NT0RJTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQgaXMgbm90IHNldAorQ09ORklHX0lOU01PRD15CitDT05GSUdfUk1NT0Q9eQorQ09ORklHX0xTTU9EPXkKK0NPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUPXkKK0NPTkZJR19NT0RQUk9CRT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1Q9eQorQ09ORklHX0RFUE1PRD15CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFM9eQorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9saWIvbW9kdWxlcyIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSJtb2R1bGVzLmRlcCIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19CTE9DS0RFViBpcyBub3Qgc2V0CitDT05GSUdfUkVWPXkKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtJRD15CisjIENPTkZJR19GRUFUVVJFX0JMS0lEX1RZUEUgaXMgbm90IHNldAorQ09ORklHX0RNRVNHPXkKK0NPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWT15CitDT05GSUdfRkJTRVQ9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREU9eQorIyBDT05GSUdfRkRGTFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GREZPUk1BVCBpcyBub3Qgc2V0CitDT05GSUdfRkRJU0s9eQorIyBDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRT15CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dQVF9MQUJFTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRD15CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorIyBDT05GSUdfRkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVJBTURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfRlNDS19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX0VYVDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01JTklYMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CitDT05GSUdfTUtGU19WRkFUPXkKKyMgQ09ORklHX0dFVE9QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HIGlzIG5vdCBzZXQKK0NPTkZJR19IRVhEVU1QPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19IV0NMT0NLPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFM9eQorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTUENJIGlzIG5vdCBzZXQKK0NPTkZJR19MU1VTQj15CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUtTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQgaXMgbm90IHNldAorQ09ORklHX01PUkU9eQorQ09ORklHX01PVU5UPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0NJRlM9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUI9eQorQ09ORklHX1BJVk9UX1JPT1Q9eQorIyBDT05GSUdfUkRBVEUgaXMgbm90IHNldAorQ09ORklHX1JERVY9eQorQ09ORklHX1JFQURQUk9GSUxFPXkKK0NPTkZJR19SVENXQUtFPXkKK0NPTkZJR19TQ1JJUFQ9eQorQ09ORklHX1NDUklQVFJFUExBWT15CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorQ09ORklHX1VNT1VOVD15CitDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbW91bnQvdW1vdW50CisjCitDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisKKyMKKyMgRmlsZXN5c3RlbS9Wb2x1bWUgaWRlbnRpZmljYXRpb24KKyMKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NPTlNQWSBpcyBub3Qgc2V0CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkREVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSU1LVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJNVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJTVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVVQREFURVZPTCBpcyBub3Qgc2V0CitDT05GSUdfQURKVElNRVg9eQorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVMgaXMgbm90IHNldAorIyBDT05GSUdfQ0hBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQgaXMgbm90IHNldAorQ09ORklHX0NIUlQ9eQorQ09ORklHX0NST05EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0Q9eQorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorIyBDT05GSUdfREMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQ19MSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRUpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FSkVDVF9TQ1NJIGlzIG5vdCBzZXQKK0NPTkZJR19GQlNQTEFTSD15CisjIENPTkZJR19GTEFTSENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfVU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0VSQVNFQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTklDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZRCBpcyBub3Qgc2V0CisjIENPTkZJR19MQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfSERQQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEgaXMgbm90IHNldAorQ09ORklHX01BS0VERVZTPXkKKyMgQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfTEVBRiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRT15CisjIENPTkZJR19NQU4gaXMgbm90IHNldAorQ09ORklHX01JQ1JPQ09NPXkKKyMgQ09ORklHX01PVU5UUE9JTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVQgaXMgbm90IHNldAorIyBDT05GSUdfUkFJREFVVE9SVU4gaXMgbm90IHNldAorQ09ORklHX1JFQURBSEVBRD15CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfUlVOTEVWRUwgaXMgbm90IHNldAorIyBDT05GSUdfUlggaXMgbm90IHNldAorQ09ORklHX1NFVFNJRD15CisjIENPTkZJR19TVFJJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19USU1FPXkKKyMgQ09ORklHX1RJTUVPVVQgaXMgbm90IHNldAorQ09ORklHX1RUWVNJWkU9eQorIyBDT05GSUdfVk9MTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19XQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworIyBDT05GSUdfTkFNRUlGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05CRENMSUVOVCBpcyBub3Qgc2V0CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorIyBDT05GSUdfTkNfMTEwX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfUElORz15CitDT05GSUdfUElORzY9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORz15CisjIENPTkZJR19XSE9JUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JUFY2PXkKKyMgQ09ORklHX0ZFQVRVUkVfVU5JWF9MT0NBTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTPXkKKyMgQ09ORklHX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0FSUD15CitDT05GSUdfQVJQSU5HPXkKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROU0QgaXMgbm90IHNldAorIyBDT05GSUdfRVRIRVJfV0FLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQUtFSURFTlREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GVFBfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFBHRVQgaXMgbm90IHNldAorIyBDT05GSUdfRlRQUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSE9TVE5BTUU9eQorIyBDT05GSUdfSFRUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRVSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9DR0kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9HWklQIGlzIG5vdCBzZXQKK0NPTkZJR19JRkNPTkZJRz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVM9eQorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTPXkKKyMgQ09ORklHX0lGRU5TTEFWRSBpcyBub3Qgc2V0CisjIENPTkZJR19JRlBMVUdEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGVVBET1dOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBfQlVJTFRJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lGQ09ORklHX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUEFERFIgaXMgbm90IHNldAorIyBDT05GSUdfSVBMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBUVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBSVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ0FMQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQQ0FMQ19GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX05FVFNUQVQ9eQorQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9XSURFPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHPXkKKyMgQ09ORklHX05TTE9PS1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05UUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUiBpcyBub3Qgc2V0CitDT05GSUdfUFNDQU49eQorQ09ORklHX1JPVVRFPXkKK0NPTkZJR19TTEFUVEFDSD15CisjIENPTkZJR19UQ1BTVkQgaXMgbm90IHNldAorIyBDT05GSUdfVEVMTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0dFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUiBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19UUkFDRVJPVVRFPXkKKyMgQ09ORklHX1RSQUNFUk9VVEU2IGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRT15CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5DVEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UVU5DVExfVUcgaXMgbm90IHNldAorIyBDT05GSUdfVURIQ1BEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BSRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QTEVBU0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQRF9CQVNFX0lQX09OX01BQyBpcyBub3Qgc2V0CisjIENPTkZJR19ESENQRF9MRUFTRVNfRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUENfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQgaXMgbm90IHNldAorIyBDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRFBTVkQgaXMgbm90IHNldAorIyBDT05GSUdfVkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19XR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX1RJTUVPVVQgaXMgbm90IHNldAorIyBDT05GSUdfWkNJUCBpcyBub3Qgc2V0CisKKyMKKyMgUHJpbnQgVXRpbGl0aWVzCisjCisjIENPTkZJR19MUEQgaXMgbm90IHNldAorIyBDT05GSUdfTFBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xQUSBpcyBub3Qgc2V0CisKKyMKKyMgTWFpbCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX01BS0VNSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPUE1BSUxESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFRk9STUlNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VORE1BSUwgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCisjIENPTkZJR19JT1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfTVBTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05NRVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BTVFJFRSBpcyBub3Qgc2V0CisjIENPTkZJR19QV0RYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNRU1DQVAgaXMgbm90IHNldAorQ09ORklHX1VQVElNRT15CisjIENPTkZJR19GRUFUVVJFX1VQVElNRV9VVE1QX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0ZSRUU9eQorQ09ORklHX0ZVU0VSPXkKK0NPTkZJR19LSUxMPXkKK0NPTkZJR19LSUxMQUxMPXkKK0NPTkZJR19LSUxMQUxMNT15CisjIENPTkZJR19QR1JFUCBpcyBub3Qgc2V0CitDT05GSUdfUElET0Y9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfU0lOR0xFPXkKK0NPTkZJR19GRUFUVVJFX1BJRE9GX09NSVQ9eQorQ09ORklHX1BLSUxMPXkKKyMgQ09ORklHX1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfV0lERSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19VTlVTVUFMX1NZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX1JFTklDRT15CitDT05GSUdfQkJfU1lTQ1RMPXkKKyMgQ09ORklHX1RPUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFMgaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0ggaXMgbm90IHNldAorCisjCisjIFJ1bml0IFV0aWxpdGllcworIworIyBDT05GSUdfUlVOU1YgaXMgbm90IHNldAorIyBDT05GSUdfUlVOU1ZESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5TVkRJUl9MT0cgaXMgbm90IHNldAorIyBDT05GSUdfU1YgaXMgbm90IHNldAorIyBDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUiBpcyBub3Qgc2V0CisjIENPTkZJR19TVkxPR0QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hQU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0VUVUlER0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOVlVJREdJRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTlZESVIgaXMgbm90IHNldAorIyBDT05GSUdfU09GVExJTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hDT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfR0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVENIUEFUSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SRVNUT1JFQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTkNPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWEVOQUJMRUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGSUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfU0VTVEFUVVMgaXMgbm90IHNldAorCisjCisjIFNoZWxscworIworQ09ORklHX0FTSD15CitDT05GSUdfQVNIX0JBU0hfQ09NUEFUPXkKKyMgQ09ORklHX0FTSF9JRExFX1RJTUVPVVQgaXMgbm90IHNldAorQ09ORklHX0FTSF9KT0JfQ09OVFJPTD15CisjIENPTkZJR19BU0hfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorQ09ORklHX0FTSF9CVUlMVElOX0VDSE89eQorQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URj15CitDT05GSUdfQVNIX0JVSUxUSU5fVEVTVD15CitDT05GSUdfQVNIX0NNRENNRD15CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQ9eQorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NUVFlIQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JSQUNFX0VYUEFOU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0hFTFAgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JTlRFUkFDVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSk9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9PUFMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9DQVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRlVOQ1RJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0VYUE9SVF9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTU9ERV9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19BU0g9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JBU0hfSVNfTk9ORT15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQ9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0hJU1RGSUxFU0laRT15CisKKyMKKyMgU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfU1lTTE9HRD15CitDT05GSUdfRkVBVFVSRV9ST1RBVEVfTE9HRklMRT15CitDT05GSUdfRkVBVFVSRV9SRU1PVEVfTE9HPXkKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9DRkcgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFPTI1NgorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTE2CitDT05GSUdfTE9HUkVBRD15CitDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORz15CitDT05GSUdfS0xPR0Q9eQorQ09ORklHX0ZFQVRVUkVfS0xPR0RfS0xPR0NUTD15CitDT05GSUdfTE9HR0VSPXkK